From 374ca955a76ecab1204ca8bfa63ff9238d998416 Mon Sep 17 00:00:00 2001 From: Apple Date: Wed, 2 Mar 2005 23:44:11 +0000 Subject: [PATCH] ICU-6.2.4.tar.gz --- ICU.plist | 24 + icuSources/Doxyfile.in | 757 +- icuSources/Makefile.in | 42 +- icuSources/README.in | 20 - icuSources/aclocal.m4 | 171 +- icuSources/allinone/all/all.vcproj | 49 - icuSources/allinone/allinone.dsw | 112 +- icuSources/allinone/allinone.sln | 319 +- icuSources/common/Makefile.in | 71 +- icuSources/common/brkdict.cpp | 64 +- icuSources/common/brkdict.h | 5 +- icuSources/common/brkiter.cpp | 467 +- icuSources/common/caniter.cpp | 36 +- icuSources/common/chariter.cpp | 11 +- icuSources/common/charstr.h | 41 +- icuSources/common/cmemory.c | 80 +- icuSources/common/cmemory.h | 17 +- icuSources/common/common.dsp | 597 +- icuSources/common/common.rc | 50 +- icuSources/common/common.vcproj | 806 +- icuSources/common/cstring.c | 148 +- icuSources/common/cstring.h | 41 +- icuSources/common/dbbi.cpp | 83 +- icuSources/common/filestrm.c | 2 +- icuSources/common/hash.h | 51 +- icuSources/common/iculserv.cpp | 389 +- icuSources/common/iculserv.h | 82 +- icuSources/common/icunotif.cpp | 25 +- icuSources/common/icunotif.h | 120 +- icuSources/common/icuserv.cpp | 288 +- icuSources/common/icuserv.h | 48 +- icuSources/common/locbased.cpp | 46 + icuSources/common/locbased.h | 97 + icuSources/common/locid.cpp | 705 +- icuSources/common/locmap.c | 440 +- icuSources/common/locmap.h | 18 +- icuSources/common/msvcres.h | 11 + icuSources/common/mutex.cpp | 34 - icuSources/common/mutex.h | 6 +- icuSources/common/nameprep.cpp | 38 - icuSources/common/nameprep.h | 102 - icuSources/common/normlzr.cpp | 12 +- icuSources/common/parsepos.cpp | 21 + icuSources/common/propname.cpp | 569 +- icuSources/common/propname.h | 230 +- icuSources/common/putil.c | 743 +- icuSources/common/putilimp.h | 278 + icuSources/common/rbbi.cpp | 621 +- icuSources/common/rbbicst.pl | 19 +- icuSources/common/rbbidata.cpp | 243 +- icuSources/common/rbbidata.h | 203 +- icuSources/common/rbbinode.cpp | 50 +- icuSources/common/rbbinode.h | 21 +- icuSources/common/rbbirb.cpp | 99 +- icuSources/common/rbbirb.h | 38 +- icuSources/common/rbbirpt.h | 198 +- icuSources/common/rbbirpt.txt | 26 +- icuSources/common/rbbiscan.cpp | 86 +- icuSources/common/rbbiscan.h | 5 +- icuSources/common/rbbisetb.cpp | 87 +- icuSources/common/rbbisetb.h | 14 +- icuSources/common/rbbistbl.cpp | 20 +- icuSources/common/rbbitblb.cpp | 388 +- icuSources/common/rbbitblb.h | 25 +- icuSources/common/resbund.cpp | 164 +- icuSources/common/resbund_cnv.cpp | 72 + icuSources/common/ruleiter.cpp | 151 + icuSources/common/ruleiter.h | 231 + icuSources/common/schriter.cpp | 4 +- icuSources/common/sprpimpl.h | 140 +- icuSources/common/strprep.cpp | 513 - icuSources/common/strprep.h | 365 - icuSources/common/symtable.h | 77 - icuSources/common/uarrsort.c | 236 + icuSources/common/uarrsort.h | 84 + icuSources/common/uassert.h | 6 +- icuSources/common/ubidi.c | 439 +- icuSources/common/ubidiln.c | 418 +- icuSources/common/ubrk.cpp | 24 +- icuSources/common/ucase.c | 1370 + icuSources/common/ucase.h | 301 + icuSources/common/uchar.c | 1709 +- icuSources/common/uchriter.cpp | 4 +- icuSources/common/ucln.h | 10 +- icuSources/common/ucln_cmn.c | 110 +- icuSources/common/ucln_cmn.h | 67 +- icuSources/common/ucmndata.c | 207 +- icuSources/common/ucmndata.h | 30 +- icuSources/common/ucmp8.c | 619 +- icuSources/common/ucmp8.h | 16 +- icuSources/common/ucnv.c | 1541 +- icuSources/common/ucnv2022.c | 4291 +- icuSources/common/ucnv_bld.c | 714 +- icuSources/common/ucnv_bld.h | 111 +- icuSources/common/ucnv_cb.c | 110 +- icuSources/common/ucnv_cnv.c | 337 +- icuSources/common/ucnv_cnv.h | 206 +- icuSources/common/ucnv_err.c | 8 +- icuSources/common/ucnv_ext.c | 1075 + icuSources/common/ucnv_ext.h | 463 + icuSources/common/ucnv_imp.h | 29 +- icuSources/common/ucnv_io.c | 415 +- icuSources/common/ucnv_io.h | 31 +- icuSources/common/ucnv_lmb.c | 406 +- icuSources/common/ucnv_set.c | 66 + icuSources/common/ucnv_u16.c | 1300 +- icuSources/common/ucnv_u32.c | 700 +- icuSources/common/ucnv_u7.c | 243 +- icuSources/common/ucnv_u8.c | 592 +- icuSources/common/ucnvbocu.c | 410 +- icuSources/common/ucnvdisp.c | 83 + icuSources/common/ucnvhz.c | 236 +- icuSources/common/ucnvisci.c | 219 +- icuSources/common/ucnvlat1.c | 361 +- icuSources/common/ucnvmbcs.c | 4276 +- icuSources/common/ucnvmbcs.h | 215 +- icuSources/common/ucnvscsu.c | 466 +- icuSources/common/ucol_swp.c | 327 + icuSources/common/ucol_swp.h | 58 + icuSources/common/udata.c | 601 +- icuSources/common/udatamem.c | 51 +- icuSources/common/udatamem.h | 10 +- icuSources/common/udataswp.c | 415 + icuSources/common/udataswp.h | 349 + icuSources/common/uenum.c | 36 +- icuSources/common/uhash.c | 45 +- icuSources/common/uhash.h | 40 +- icuSources/common/uidna.cpp | 302 +- icuSources/common/uinit.c | 111 + icuSources/common/uinvchar.c | 524 + icuSources/common/uinvchar.h | 66 + icuSources/common/uiter.cpp | 24 +- icuSources/common/uloc.c | 2656 +- icuSources/common/ulocimp.h | 24 + icuSources/common/umapfile.c | 10 +- icuSources/common/umapfile.h | 3 +- icuSources/common/umemstrm.c | 255 - icuSources/common/umemstrm.h | 69 - icuSources/common/umutex.c | 695 +- icuSources/common/umutex.h | 93 +- icuSources/common/unames.c | 1948 +- icuSources/common/unicode/brkiter.h | 94 +- icuSources/common/unicode/caniter.h | 105 +- icuSources/common/unicode/chariter.h | 822 +- icuSources/common/unicode/dbbi.h | 65 +- icuSources/common/unicode/docmain.h | 39 +- icuSources/common/unicode/locid.h | 316 +- icuSources/common/unicode/normlzr.h | 85 +- icuSources/common/unicode/parseerr.h | 70 +- icuSources/common/unicode/parsepos.h | 60 +- icuSources/common/unicode/platform.h.in | 138 +- icuSources/common/unicode/pmacos.h | 140 - icuSources/common/unicode/pos400.h | 172 - icuSources/common/unicode/putil.h | 280 +- icuSources/common/unicode/pwin32.h | 165 +- icuSources/common/unicode/rbbi.h | 157 +- icuSources/common/unicode/rep.h | 17 +- icuSources/common/unicode/resbund.h | 177 +- icuSources/common/unicode/schriter.h | 44 +- icuSources/common/unicode/strenum.h | 313 +- icuSources/common/unicode/symtable.h | 106 + icuSources/common/unicode/ubidi.h | 108 +- icuSources/common/unicode/ubrk.h | 135 +- icuSources/common/unicode/ucat.h | 20 +- icuSources/common/unicode/uchar.h | 424 +- icuSources/common/unicode/uchriter.h | 80 +- icuSources/common/unicode/uclean.h | 171 +- icuSources/common/unicode/ucnv.h | 314 +- icuSources/common/unicode/ucnv_cb.h | 17 +- icuSources/common/unicode/ucnv_err.h | 57 +- icuSources/common/unicode/uconfig.h | 49 +- icuSources/common/unicode/udata.h | 64 +- icuSources/common/unicode/udeprctd.h | 39 + icuSources/common/unicode/udraft.h | 246 + icuSources/common/unicode/uenum.h | 30 +- icuSources/common/unicode/uidna.h | 142 +- icuSources/common/unicode/uiter.h | 58 +- icuSources/common/unicode/uloc.h | 479 +- icuSources/common/unicode/umachine.h | 181 +- icuSources/common/unicode/umisc.h | 2 +- icuSources/common/unicode/unifilt.h | 37 +- icuSources/common/unicode/unifunct.h | 55 +- icuSources/common/unicode/unimatch.h | 28 +- icuSources/common/unicode/uniset.h | 362 +- icuSources/common/unicode/unistr.h | 1091 +- icuSources/common/unicode/unorm.h | 78 +- icuSources/common/unicode/uobject.h | 107 +- icuSources/common/unicode/uobslete.h | 29 + icuSources/common/unicode/urename.h | 2774 +- icuSources/common/unicode/ures.h | 171 +- icuSources/common/unicode/uscript.h | 33 +- icuSources/common/unicode/uset.h | 402 +- icuSources/common/unicode/usetiter.h | 103 +- icuSources/common/unicode/ushape.h | 4 +- icuSources/common/unicode/usprep.h | 155 + icuSources/common/unicode/ustring.h | 169 +- icuSources/common/unicode/utf.h | 152 +- icuSources/common/unicode/utf16.h | 70 +- icuSources/common/unicode/utf8.h | 129 +- icuSources/common/unicode/utf_old.h | 29 +- icuSources/common/unicode/utrace.h | 351 + icuSources/common/unicode/utypes.h | 151 +- icuSources/common/unicode/uversion.h | 69 +- icuSources/common/unifilt.cpp | 14 +- icuSources/common/unifunct.cpp | 10 +- icuSources/common/uniset.cpp | 2153 +- icuSources/common/uniset_props.cpp | 2012 + icuSources/common/unistr.cpp | 637 +- icuSources/common/unistr_case.cpp | 244 + icuSources/common/unistr_cnv.cpp | 369 + icuSources/common/unistr_props.cpp | 68 + icuSources/common/unorm.cpp | 3529 +- icuSources/common/unorm_it.c | 25 +- icuSources/common/unormcmp.cpp | 688 + icuSources/common/unormimp.h | 163 +- icuSources/common/uobject.cpp | 38 +- icuSources/common/uprops.c | 359 +- icuSources/common/uprops.h | 112 +- icuSources/common/ures_cnv.c | 78 + icuSources/common/uresbund.c | 978 +- icuSources/common/uresdata.c | 854 +- icuSources/common/uresdata.h | 51 +- icuSources/common/uresimp.h | 54 +- icuSources/common/usc_impl.c | 107 +- icuSources/common/uscript.c | 5 +- icuSources/common/uset.cpp | 110 +- icuSources/common/uset_imp.h | 60 + icuSources/common/uset_props.cpp | 146 + icuSources/common/usetiter.cpp | 6 +- icuSources/common/ushape.c | 5 +- icuSources/common/usprep.cpp | 904 + icuSources/common/ustack.cpp | 14 + icuSources/common/ustr_cnv.c | 230 + icuSources/common/ustr_cnv.h | 42 + icuSources/common/ustr_imp.h | 162 +- icuSources/common/ustr_wcs.c | 518 + icuSources/common/ustrcase.c | 745 +- icuSources/common/ustrenum.cpp | 209 +- icuSources/common/ustrenum.h | 77 +- icuSources/common/ustrfmt.c | 9 +- icuSources/common/ustrfmt.h | 4 +- icuSources/common/ustring.c | 227 +- icuSources/common/ustrtrns.c | 502 +- icuSources/common/util.cpp | 38 +- icuSources/common/util.h | 16 +- icuSources/common/utrace.c | 486 + icuSources/common/utracimp.h | 384 + icuSources/common/utrie.c | 245 +- icuSources/common/utrie.h | 31 +- icuSources/common/utypes.c | 199 + icuSources/common/uvector.cpp | 11 +- icuSources/common/uvector.h | 25 +- icuSources/common/uvectr32.cpp | 2 +- icuSources/common/uvectr32.h | 20 +- icuSources/config/Makefile.inc.in | 34 +- icuSources/config/icu-config-bottom | 28 +- icuSources/config/icu-config-top | 3 +- icuSources/config/icu-config.1.in | 16 +- icuSources/config/make2sh.sed | 3 +- icuSources/config/mh-aix | 12 +- icuSources/config/mh-aix-gcc | 116 + icuSources/config/mh-aix-va | 22 +- icuSources/config/mh-alpha-linux-cc | 15 +- icuSources/config/mh-alpha-linux-gcc | 15 +- icuSources/config/mh-alpha-osf | 19 +- icuSources/config/mh-beos | 109 + icuSources/config/mh-bsd-gcc | 12 +- icuSources/config/mh-cygwin | 71 +- icuSources/config/mh-cygwin-msvc | 197 +- icuSources/config/mh-darwin | 31 +- icuSources/config/mh-hpux-acc | 25 +- icuSources/config/mh-hpux-cc | 12 +- icuSources/config/mh-hpux-gcc | 12 +- icuSources/config/mh-irix | 16 +- icuSources/config/mh-linux | 11 +- icuSources/config/mh-linux-va | 73 + icuSources/config/mh-mingw | 128 + icuSources/config/mh-mpras | 64 + icuSources/config/mh-os390 | 45 +- icuSources/config/mh-os400 | 53 +- icuSources/config/mh-ptx | 4 +- icuSources/config/mh-qnx | 8 +- icuSources/config/mh-solaris | 22 +- icuSources/config/mh-solaris-gcc | 19 +- icuSources/configure | 1055 +- icuSources/configure.in | 286 +- icuSources/data/Makefile.in | 395 +- icuSources/data/README | 11 - icuSources/data/brkitr/brkfiles.mk | 31 + icuSources/data/brkitr/char.txt | 38 +- icuSources/data/brkitr/line.txt | 378 +- icuSources/data/brkitr/line_th.txt | 70 +- icuSources/data/brkitr/sent.txt | 123 +- icuSources/data/brkitr/title.txt | 10 +- icuSources/data/brkitr/word.txt | 300 +- icuSources/data/brkitr/word_POSIX.txt | 235 + icuSources/data/brkitr/word_ja.txt | 250 + icuSources/data/brkitr/word_th.txt | 107 +- icuSources/data/coll/ar.txt | 20 + icuSources/data/coll/ar_AE.txt | 17 + icuSources/data/coll/ar_BH.txt | 17 + icuSources/data/coll/ar_DZ.txt | 17 + icuSources/data/coll/ar_EG.txt | 17 + icuSources/data/coll/ar_IN.txt | 17 + icuSources/data/coll/ar_IQ.txt | 17 + icuSources/data/coll/ar_JO.txt | 17 + icuSources/data/coll/ar_KW.txt | 17 + icuSources/data/coll/ar_LB.txt | 17 + icuSources/data/coll/ar_LY.txt | 17 + icuSources/data/coll/ar_MA.txt | 17 + icuSources/data/coll/ar_OM.txt | 17 + icuSources/data/coll/ar_QA.txt | 17 + icuSources/data/coll/ar_SA.txt | 17 + icuSources/data/coll/ar_SD.txt | 17 + icuSources/data/coll/ar_SY.txt | 17 + icuSources/data/coll/ar_TN.txt | 17 + icuSources/data/coll/ar_YE.txt | 17 + icuSources/data/coll/be.txt | 15 + icuSources/data/coll/be_BY.txt | 17 + icuSources/data/coll/bg.txt | 15 + icuSources/data/coll/bg_BG.txt | 17 + icuSources/data/coll/ca.txt | 20 + icuSources/data/coll/ca_ES.txt | 17 + icuSources/data/coll/colfiles.mk | 80 + icuSources/data/coll/collocal.mk | 6 + icuSources/data/coll/cs.txt | 20 + icuSources/data/coll/cs_CZ.txt | 17 + icuSources/data/coll/da.txt | 28 + icuSources/data/coll/da_DK.txt | 17 + icuSources/data/coll/de.txt | 24 + icuSources/data/coll/de_AT.txt | 17 + icuSources/data/coll/de_BE.txt | 17 + icuSources/data/coll/de_CH.txt | 17 + icuSources/data/coll/de_DE.txt | 17 + icuSources/data/coll/de_LU.txt | 17 + icuSources/data/coll/de__PHONEBOOK.txt | 13 + icuSources/data/coll/el.txt | 20 + icuSources/data/coll/el_GR.txt | 17 + icuSources/data/coll/en.txt | 20 + icuSources/data/coll/en_AU.txt | 17 + icuSources/data/coll/en_BE.txt | 17 + icuSources/data/coll/en_BW.txt | 17 + icuSources/data/coll/en_CA.txt | 17 + icuSources/data/coll/en_GB.txt | 17 + icuSources/data/coll/en_HK.txt | 17 + icuSources/data/coll/en_IE.txt | 17 + icuSources/data/coll/en_IN.txt | 17 + icuSources/data/coll/en_MT.txt | 17 + icuSources/data/coll/en_NZ.txt | 17 + icuSources/data/coll/en_PH.txt | 17 + icuSources/data/coll/en_SG.txt | 17 + icuSources/data/coll/en_US.txt | 17 + icuSources/data/coll/en_US_POSIX.txt | 17 + icuSources/data/coll/en_VI.txt | 17 + icuSources/data/coll/en_ZA.txt | 17 + icuSources/data/coll/en_ZW.txt | 17 + icuSources/data/coll/eo.txt | 20 + icuSources/data/coll/es.txt | 24 + icuSources/data/coll/es_AR.txt | 17 + icuSources/data/coll/es_BO.txt | 17 + icuSources/data/coll/es_CL.txt | 17 + icuSources/data/coll/es_CO.txt | 17 + icuSources/data/coll/es_CR.txt | 17 + icuSources/data/coll/es_DO.txt | 17 + icuSources/data/coll/es_EC.txt | 17 + icuSources/data/coll/es_ES.txt | 17 + icuSources/data/coll/es_GT.txt | 17 + icuSources/data/coll/es_HN.txt | 17 + icuSources/data/coll/es_MX.txt | 17 + icuSources/data/coll/es_NI.txt | 17 + icuSources/data/coll/es_PA.txt | 17 + icuSources/data/coll/es_PE.txt | 17 + icuSources/data/coll/es_PR.txt | 17 + icuSources/data/coll/es_PY.txt | 17 + icuSources/data/coll/es_SV.txt | 17 + icuSources/data/coll/es_US.txt | 17 + icuSources/data/coll/es_UY.txt | 17 + icuSources/data/coll/es_VE.txt | 17 + icuSources/data/coll/es__TRADITIONAL.txt | 13 + icuSources/data/coll/et.txt | 24 + icuSources/data/coll/et_EE.txt | 17 + icuSources/data/coll/fa.txt | 28 + icuSources/data/coll/fa_AF.txt | 12 + icuSources/data/coll/fa_IR.txt | 17 + icuSources/data/coll/fi.txt | 27 + icuSources/data/coll/fi_FI.txt | 17 + icuSources/data/coll/fo.txt | 27 + icuSources/data/coll/fo_FO.txt | 17 + icuSources/data/coll/fr.txt | 20 + icuSources/data/coll/fr_BE.txt | 17 + icuSources/data/coll/fr_CA.txt | 17 + icuSources/data/coll/fr_CH.txt | 17 + icuSources/data/coll/fr_FR.txt | 17 + icuSources/data/coll/fr_LU.txt | 17 + icuSources/data/coll/ga.txt | 17 + icuSources/data/coll/ga_IE.txt | 17 + icuSources/data/coll/gu.txt | 20 + icuSources/data/coll/gu_IN.txt | 17 + icuSources/data/coll/haw.txt | 37 + icuSources/data/coll/he.txt | 20 + icuSources/data/coll/he_IL.txt | 17 + icuSources/data/coll/hi.txt | 29 + icuSources/data/coll/hi_IN.txt | 17 + icuSources/data/coll/hi__DIRECT.txt | 13 + icuSources/data/coll/hr.txt | 27 + icuSources/data/coll/hr_HR.txt | 17 + icuSources/data/coll/hu.txt | 59 + icuSources/data/coll/hu_HU.txt | 17 + icuSources/data/coll/id.txt | 17 + icuSources/data/coll/id_ID.txt | 17 + icuSources/data/coll/is.txt | 29 + icuSources/data/coll/is_IS.txt | 17 + icuSources/data/coll/it.txt | 20 + icuSources/data/coll/it_CH.txt | 17 + icuSources/data/coll/it_IT.txt | 17 + icuSources/data/coll/ja.txt | 513 + icuSources/data/coll/ja_JP.txt | 17 + icuSources/data/coll/kk.txt | 20 + icuSources/data/coll/kk_KZ.txt | 17 + icuSources/data/coll/kl.txt | 26 + icuSources/data/coll/kl_GL.txt | 17 + icuSources/data/coll/kn.txt | 20 + icuSources/data/coll/kn_IN.txt | 17 + icuSources/data/coll/ko.txt | 687 + icuSources/data/coll/ko_KR.txt | 17 + icuSources/data/coll/lt.txt | 26 + icuSources/data/coll/lt_LT.txt | 17 + icuSources/data/coll/lv.txt | 30 + icuSources/data/coll/lv_LV.txt | 17 + icuSources/data/coll/mk.txt | 15 + icuSources/data/coll/mk_MK.txt | 17 + icuSources/data/coll/ml.txt | 20 + icuSources/data/coll/mr.txt | 20 + icuSources/data/coll/mr_IN.txt | 17 + icuSources/data/coll/ms.txt | 17 + icuSources/data/coll/ms_BN.txt | 17 + icuSources/data/coll/ms_MY.txt | 17 + icuSources/data/coll/mt.txt | 27 + icuSources/data/coll/mt_MT.txt | 17 + icuSources/data/coll/nb.txt | 26 + icuSources/data/coll/nb_NO.txt | 17 + icuSources/data/coll/nl.txt | 17 + icuSources/data/coll/nl_BE.txt | 17 + icuSources/data/coll/nl_NL.txt | 17 + icuSources/data/coll/nn.txt | 26 + icuSources/data/coll/nn_NO.txt | 17 + icuSources/data/coll/om.txt | 23 + icuSources/data/coll/om_ET.txt | 17 + icuSources/data/coll/om_KE.txt | 17 + icuSources/data/coll/or.txt | 20 + icuSources/data/coll/pa.txt | 20 + icuSources/data/coll/pa_IN.txt | 17 + icuSources/data/coll/pl.txt | 29 + icuSources/data/coll/pl_PL.txt | 17 + icuSources/data/coll/ps.txt | 38 + icuSources/data/coll/ps_AF.txt | 17 + icuSources/data/coll/pt.txt | 17 + icuSources/data/coll/pt_BR.txt | 17 + icuSources/data/coll/pt_PT.txt | 17 + icuSources/data/coll/ro.txt | 20 + icuSources/data/coll/ro_RO.txt | 17 + icuSources/data/coll/root.txt | 22 + icuSources/data/coll/ru.txt | 20 + icuSources/data/coll/ru_RU.txt | 17 + icuSources/data/coll/ru_UA.txt | 17 + icuSources/data/coll/sh.txt | 15 + icuSources/data/coll/sh_YU.txt | 17 + icuSources/data/coll/sk.txt | 30 + icuSources/data/coll/sk_SK.txt | 17 + icuSources/data/coll/sl.txt | 20 + icuSources/data/coll/sl_SI.txt | 17 + icuSources/data/coll/sq.txt | 32 + icuSources/data/coll/sq_AL.txt | 17 + icuSources/data/coll/sr.txt | 15 + icuSources/data/coll/sr_YU.txt | 17 + icuSources/data/coll/sv.txt | 29 + icuSources/data/coll/sv_FI.txt | 17 + icuSources/data/coll/sv_SE.txt | 17 + icuSources/data/coll/ta.txt | 20 + icuSources/data/coll/ta_IN.txt | 17 + icuSources/data/coll/te.txt | 20 + icuSources/data/coll/te_IN.txt | 17 + icuSources/data/coll/th.txt | 29 + icuSources/data/coll/th_TH.txt | 17 + icuSources/data/coll/tr.txt | 20 + icuSources/data/coll/tr_TR.txt | 17 + icuSources/data/coll/uk.txt | 20 + icuSources/data/coll/uk_UA.txt | 17 + icuSources/data/coll/vi.txt | 28 + icuSources/data/coll/vi_VN.txt | 17 + icuSources/data/coll/zh.txt | 1667 + icuSources/data/coll/zh_CN.txt | 17 + icuSources/data/coll/zh_HK.txt | 14 + icuSources/data/coll/zh_Hant.txt | 17 + icuSources/data/coll/zh_MO.txt | 14 + icuSources/data/coll/zh_SG.txt | 17 + icuSources/data/coll/zh_TW.txt | 14 + icuSources/data/coll/zh_TW_STROKE.txt | 13 + icuSources/data/coll/zh__PINYIN.txt | 13 + icuSources/data/icupkg.inc.in | 32 +- icuSources/data/locales/af.txt | 316 +- icuSources/data/locales/af_ZA.txt | 47 +- icuSources/data/locales/am.txt | 708 +- icuSources/data/locales/am_ET.txt | 85 +- icuSources/data/locales/ar.txt | 759 +- icuSources/data/locales/ar_AE.txt | 16 +- icuSources/data/locales/ar_BH.txt | 16 +- icuSources/data/locales/ar_DZ.txt | 54 +- icuSources/data/locales/ar_EG.txt | 26 +- icuSources/data/locales/ar_IN.txt | 56 +- icuSources/data/locales/ar_IQ.txt | 22 +- icuSources/data/locales/ar_JO.txt | 116 +- icuSources/data/locales/ar_KW.txt | 22 +- icuSources/data/locales/ar_LB.txt | 110 +- icuSources/data/locales/ar_LY.txt | 22 +- icuSources/data/locales/ar_MA.txt | 52 +- icuSources/data/locales/ar_OM.txt | 16 +- icuSources/data/locales/ar_QA.txt | 58 +- icuSources/data/locales/ar_SA.txt | 58 +- icuSources/data/locales/ar_SD.txt | 15 +- icuSources/data/locales/ar_SY.txt | 130 +- icuSources/data/locales/ar_TN.txt | 94 +- icuSources/data/locales/ar_YE.txt | 58 +- icuSources/data/locales/be.txt | 246 +- icuSources/data/locales/be_BY.txt | 20 +- icuSources/data/locales/bg.txt | 1989 +- icuSources/data/locales/bg_BG.txt | 20 +- icuSources/data/locales/bn.txt | 281 +- icuSources/data/locales/bn_IN.txt | 69 +- icuSources/data/locales/ca.txt | 534 +- icuSources/data/locales/ca_ES.txt | 24 +- icuSources/data/locales/ca_ES_PREEURO.txt | 16 - icuSources/data/locales/cs.txt | 2232 +- icuSources/data/locales/cs_CZ.txt | 20 +- icuSources/data/locales/cy.txt | 82 + icuSources/data/locales/cy_GB.txt | 36 + icuSources/data/locales/da.txt | 2799 +- icuSources/data/locales/da_DK.txt | 20 +- icuSources/data/locales/de.txt | 2766 +- icuSources/data/locales/de_AT.txt | 112 +- icuSources/data/locales/de_AT_PREEURO.txt | 10 - icuSources/data/locales/de_BE.txt | 154 +- icuSources/data/locales/de_CH.txt | 71 +- icuSources/data/locales/de_DE.txt | 20 +- icuSources/data/locales/de_LU.txt | 40 +- icuSources/data/locales/de_LU_PREEURO.txt | 16 - icuSources/data/locales/de__PHONEBOOK.txt | 18 - icuSources/data/locales/el.txt | 2258 +- icuSources/data/locales/el_GR.txt | 32 +- icuSources/data/locales/el_GR_PREEURO.txt | 17 - icuSources/data/locales/en.txt | 3214 +- icuSources/data/locales/en_AU.txt | 65 +- icuSources/data/locales/en_BE.txt | 77 +- icuSources/data/locales/en_BE_PREEURO.txt | 17 - icuSources/data/locales/en_BW.txt | 56 +- icuSources/data/locales/en_CA.txt | 206 +- icuSources/data/locales/en_GB.txt | 134 +- icuSources/data/locales/en_GB_EURO.txt | 19 - icuSources/data/locales/en_HK.txt | 68 +- icuSources/data/locales/en_IE.txt | 74 +- icuSources/data/locales/en_IN.txt | 71 +- icuSources/data/locales/en_MT.txt | 62 +- icuSources/data/locales/en_NZ.txt | 63 +- icuSources/data/locales/en_PH.txt | 67 +- icuSources/data/locales/en_PK.txt | 35 + icuSources/data/locales/en_SG.txt | 63 +- icuSources/data/locales/en_US.txt | 31 +- icuSources/data/locales/en_US_POSIX.txt | 42 +- icuSources/data/locales/en_VI.txt | 20 +- icuSources/data/locales/en_ZA.txt | 58 +- icuSources/data/locales/en_ZW.txt | 48 +- icuSources/data/locales/eo.txt | 623 +- icuSources/data/locales/es.txt | 2810 +- icuSources/data/locales/es_AR.txt | 64 +- icuSources/data/locales/es_BO.txt | 52 +- icuSources/data/locales/es_CL.txt | 68 +- icuSources/data/locales/es_CO.txt | 64 +- icuSources/data/locales/es_CR.txt | 52 +- icuSources/data/locales/es_DO.txt | 53 +- icuSources/data/locales/es_EC.txt | 56 +- icuSources/data/locales/es_ES.txt | 67 +- icuSources/data/locales/es_ES_PREEURO.txt | 16 - icuSources/data/locales/es_GT.txt | 53 +- icuSources/data/locales/es_HN.txt | 53 +- icuSources/data/locales/es_MX.txt | 67 +- icuSources/data/locales/es_NI.txt | 53 +- icuSources/data/locales/es_PA.txt | 53 +- icuSources/data/locales/es_PE.txt | 59 +- icuSources/data/locales/es_PR.txt | 62 +- icuSources/data/locales/es_PY.txt | 56 +- icuSources/data/locales/es_SV.txt | 53 +- icuSources/data/locales/es_US.txt | 73 +- icuSources/data/locales/es_UY.txt | 56 +- icuSources/data/locales/es_VE.txt | 56 +- icuSources/data/locales/es__TRADITIONAL.txt | 18 - icuSources/data/locales/et.txt | 480 +- icuSources/data/locales/et_EE.txt | 20 +- icuSources/data/locales/eu.txt | 271 +- icuSources/data/locales/eu_ES.txt | 52 +- icuSources/data/locales/eu_ES_PREEURO.txt | 16 - icuSources/data/locales/fa.txt | 1321 +- icuSources/data/locales/fa_AF.txt | 201 + icuSources/data/locales/fa_IN.txt | 41 - icuSources/data/locales/fa_IR.txt | 59 +- icuSources/data/locales/fi.txt | 2821 +- icuSources/data/locales/fi_FI.txt | 20 +- icuSources/data/locales/fi_FI_PREEURO.txt | 10 - icuSources/data/locales/fo.txt | 276 +- icuSources/data/locales/fo_FO.txt | 31 +- icuSources/data/locales/fr.txt | 3007 +- icuSources/data/locales/fr_BE.txt | 71 +- icuSources/data/locales/fr_BE_PREEURO.txt | 10 - icuSources/data/locales/fr_CA.txt | 79 +- icuSources/data/locales/fr_CH.txt | 112 +- icuSources/data/locales/fr_FR.txt | 20 +- icuSources/data/locales/fr_FR_PREEURO.txt | 10 - icuSources/data/locales/fr_LU.txt | 44 +- icuSources/data/locales/fr_LU_PREEURO.txt | 10 - icuSources/data/locales/ga.txt | 2053 +- icuSources/data/locales/ga_IE.txt | 51 +- icuSources/data/locales/ga_IE_PREEURO.txt | 10 - icuSources/data/locales/gl.txt | 153 +- icuSources/data/locales/gl_ES.txt | 52 +- icuSources/data/locales/gl_ES_PREEURO.txt | 16 - icuSources/data/locales/gu.txt | 216 +- icuSources/data/locales/gu_IN.txt | 60 +- icuSources/data/locales/gv.txt | 157 +- icuSources/data/locales/gv_GB.txt | 51 +- icuSources/data/locales/haw.txt | 198 +- icuSources/data/locales/haw_US.txt | 57 +- icuSources/data/locales/he.txt | 643 +- icuSources/data/locales/he_IL.txt | 20 +- icuSources/data/locales/hi.txt | 774 +- icuSources/data/locales/hi_IN.txt | 59 +- icuSources/data/locales/hi__DIRECT.txt | 30 - icuSources/data/locales/hr.txt | 1510 +- icuSources/data/locales/hr_HR.txt | 21 +- icuSources/data/locales/hu.txt | 2251 +- icuSources/data/locales/hu_HU.txt | 20 +- icuSources/data/locales/hy.txt | 447 +- icuSources/data/locales/hy_AM.txt | 47 +- icuSources/data/locales/hy_AM_REVISED.txt | 128 +- icuSources/data/locales/id.txt | 621 +- icuSources/data/locales/id_ID.txt | 40 +- icuSources/data/locales/in.txt | 11 + icuSources/data/locales/in_ID.txt | 11 + icuSources/data/locales/is.txt | 1849 +- icuSources/data/locales/is_IS.txt | 20 +- icuSources/data/locales/it.txt | 3149 +- icuSources/data/locales/it_CH.txt | 62 +- icuSources/data/locales/it_IT.txt | 56 +- icuSources/data/locales/it_IT_PREEURO.txt | 16 - icuSources/data/locales/iw.txt | 15 +- icuSources/data/locales/iw_IL.txt | 15 +- icuSources/data/locales/ja.txt | 5366 ++- icuSources/data/locales/ja_JP.txt | 20 +- icuSources/data/locales/ja_JP_TRADITIONAL.txt | 19 +- icuSources/data/locales/kk.txt | 117 + icuSources/data/locales/kk_KZ.txt | 17 + icuSources/data/locales/kl.txt | 155 +- icuSources/data/locales/kl_GL.txt | 43 +- icuSources/data/locales/kn.txt | 203 +- icuSources/data/locales/kn_IN.txt | 62 +- icuSources/data/locales/ko.txt | 5419 ++- icuSources/data/locales/ko_KR.txt | 59 +- icuSources/data/locales/kok.txt | 501 +- icuSources/data/locales/kok_IN.txt | 59 +- icuSources/data/locales/kw.txt | 154 +- icuSources/data/locales/kw_GB.txt | 51 +- icuSources/data/locales/lt.txt | 476 +- icuSources/data/locales/lt_LT.txt | 20 +- icuSources/data/locales/lv.txt | 478 +- icuSources/data/locales/lv_LV.txt | 20 +- icuSources/data/locales/mk.txt | 1481 +- icuSources/data/locales/mk_MK.txt | 20 +- icuSources/data/locales/ml.txt | 103 + icuSources/data/locales/ml_IN.txt | 45 + icuSources/data/locales/mr.txt | 499 +- icuSources/data/locales/mr_IN.txt | 60 +- icuSources/data/locales/ms.txt | 331 + icuSources/data/locales/ms_BN.txt | 50 + icuSources/data/locales/ms_MY.txt | 32 + icuSources/data/locales/mt.txt | 1850 +- icuSources/data/locales/mt_MT.txt | 27 +- icuSources/data/locales/nb.txt | 2592 +- icuSources/data/locales/nb_NO.txt | 23 +- icuSources/data/locales/nl.txt | 2763 +- icuSources/data/locales/nl_BE.txt | 63 +- icuSources/data/locales/nl_BE_PREEURO.txt | 10 - icuSources/data/locales/nl_NL.txt | 20 +- icuSources/data/locales/nl_NL_PREEURO.txt | 10 - icuSources/data/locales/nn.txt | 452 +- icuSources/data/locales/nn_NO.txt | 22 +- icuSources/data/locales/no.txt | 15 +- icuSources/data/locales/no_NO.txt | 15 +- icuSources/data/locales/no_NO_NY.txt | 15 +- icuSources/data/locales/om.txt | 166 +- icuSources/data/locales/om_ET.txt | 91 +- icuSources/data/locales/om_KE.txt | 80 +- icuSources/data/locales/or.txt | 85 + icuSources/data/locales/or_IN.txt | 45 + icuSources/data/locales/pa.txt | 112 + icuSources/data/locales/pa_IN.txt | 42 + icuSources/data/locales/pl.txt | 2041 +- icuSources/data/locales/pl_PL.txt | 20 +- icuSources/data/locales/ps.txt | 212 + icuSources/data/locales/ps_AF.txt | 39 + icuSources/data/locales/pt.txt | 2988 +- icuSources/data/locales/pt_BR.txt | 46 +- icuSources/data/locales/pt_PT.txt | 133 +- icuSources/data/locales/pt_PT_PREEURO.txt | 30 - icuSources/data/locales/resfiles.mk | 147 +- icuSources/data/locales/reslocal.mk | 6 + icuSources/data/locales/ro.txt | 476 +- icuSources/data/locales/ro_RO.txt | 20 +- icuSources/data/locales/root.txt | 2211 +- icuSources/data/locales/ru.txt | 1741 +- icuSources/data/locales/ru_RU.txt | 32 +- icuSources/data/locales/ru_UA.txt | 57 +- icuSources/data/locales/sh.txt | 374 +- icuSources/data/locales/sh_YU.txt | 16 +- icuSources/data/locales/sk.txt | 1997 +- icuSources/data/locales/sk_SK.txt | 20 +- icuSources/data/locales/sl.txt | 517 +- icuSources/data/locales/sl_SI.txt | 21 +- icuSources/data/locales/so.txt | 292 +- icuSources/data/locales/so_DJ.txt | 60 +- icuSources/data/locales/so_ET.txt | 59 +- icuSources/data/locales/so_KE.txt | 48 +- icuSources/data/locales/so_SO.txt | 59 +- icuSources/data/locales/sq.txt | 362 +- icuSources/data/locales/sq_AL.txt | 29 +- icuSources/data/locales/sr.txt | 971 +- icuSources/data/locales/sr_Cyrl.txt | 11 + icuSources/data/locales/sr_Cyrl_YU.txt | 11 + icuSources/data/locales/sr_Latn.txt | 443 + icuSources/data/locales/sr_Latn_YU.txt | 11 + icuSources/data/locales/sr_YU.txt | 17 +- icuSources/data/locales/sv.txt | 3302 +- icuSources/data/locales/sv_FI.txt | 21 +- icuSources/data/locales/sv_SE.txt | 20 +- icuSources/data/locales/sw.txt | 259 +- icuSources/data/locales/sw_KE.txt | 23 +- icuSources/data/locales/sw_TZ.txt | 24 +- icuSources/data/locales/ta.txt | 682 +- icuSources/data/locales/ta_IN.txt | 64 +- icuSources/data/locales/te.txt | 202 +- icuSources/data/locales/te_IN.txt | 70 +- icuSources/data/locales/th.txt | 1222 +- icuSources/data/locales/th_TH.txt | 20 +- icuSources/data/locales/th_TH_TRADITIONAL.txt | 19 +- icuSources/data/locales/ti.txt | 441 +- icuSources/data/locales/ti_ER.txt | 190 +- icuSources/data/locales/ti_ET.txt | 75 +- icuSources/data/locales/tr.txt | 2414 +- icuSources/data/locales/tr_TR.txt | 22 +- icuSources/data/locales/uk.txt | 2190 +- icuSources/data/locales/uk_UA.txt | 20 +- icuSources/data/locales/vi.txt | 442 +- icuSources/data/locales/vi_VN.txt | 20 +- icuSources/data/locales/zh.txt | 4373 +- icuSources/data/locales/zh_CN.txt | 36 +- icuSources/data/locales/zh_HK.txt | 79 +- icuSources/data/locales/zh_Hans.txt | 14 + icuSources/data/locales/zh_Hans_CN.txt | 32 + icuSources/data/locales/zh_Hans_SG.txt | 45 + icuSources/data/locales/zh_Hant.txt | 2186 + icuSources/data/locales/zh_Hant_HK.txt | 53 + icuSources/data/locales/zh_Hant_MO.txt | 53 + icuSources/data/locales/zh_Hant_TW.txt | 17 + icuSources/data/locales/zh_MO.txt | 79 +- icuSources/data/locales/zh_SG.txt | 195 +- icuSources/data/locales/zh_TW.txt | 2288 +- icuSources/data/locales/zh_TW_STROKE.txt | 1651 - icuSources/data/locales/zh__PINYIN.txt | 2643 -- icuSources/data/makedata.bat | 35 - icuSources/data/makedata.dsp | 17 +- icuSources/data/makedata.mak | 368 +- icuSources/data/makedata.vcproj | 44 +- icuSources/data/mappings/cns-11643-1992.ucm | 6666 +--- icuSources/data/mappings/convrtrs.txt | 368 +- .../data/mappings/ibm-1168_P100-2002.ucm | 372 + .../data/mappings/ibm-1363_P110-1997.ucm | 4 + .../data/mappings/ibm-1363_P11B-1998.ucm | 244 +- .../data/mappings/ibm-1371_P100-1999.ucm | 179 +- .../data/mappings/ibm-1373_P100-2002.ucm | 400 +- .../data/mappings/ibm-1375_P100-2003.ucm | 18673 +++++++++ .../data/mappings/ibm-1386_P100-2002.ucm | 434 +- ...0_P100-1999.ucm => ibm-1390_P110-2003.ucm} | 1238 +- ...9_P100-1999.ucm => ibm-1399_P110-2003.ucm} | 1148 +- ..._P100-1999.ucm => ibm-16684_P110-2003.ucm} | 1142 +- .../data/mappings/ibm-33722_P120-1999.ucm | 4 + .../data/mappings/ibm-33722_P12A-1999.ucm | 219 +- .../data/mappings/ibm-737_P100-1997.ucm | 411 + .../data/mappings/ibm-775_P100-1996.ucm | 408 + .../{ibm-8482.ucm => ibm-8482_P100-1999.ucm} | 22 +- .../data/mappings/ibm-897_P100-1995.ucm | 328 + .../data/mappings/ibm-930_P120-1999.ucm | 299 +- .../data/mappings/ibm-937_P110-1999.ucm | 6 +- .../data/mappings/ibm-939_P120-1999.ucm | 6 +- .../data/mappings/ibm-942_P12A-1999.ucm | 4 + .../data/mappings/ibm-943_P130-1999.ucm | 4 + ...43_P14A-1999.ucm => ibm-943_P15A-2003.ucm} | 1222 +- .../data/mappings/ibm-9447_P100-2002.ucm | 360 + .../data/mappings/ibm-9449_P100-2002.ucm | 369 + .../data/mappings/ibm-949_P110-1999.ucm | 4 + .../data/mappings/ibm-949_P11A-1999.ucm | 211 +- .../data/mappings/ibm-950_P110-1999.ucm | 4 + .../data/mappings/ibm-954_P101-2000.ucm | 15225 +++++++ .../data/mappings/ibm-970_P110-1995.ucm | 161 +- .../data/mappings/ibm-971_P100-1995.ucm | 8438 ++++ icuSources/data/mappings/iso-8859_10-1998.ucm | 305 + icuSources/data/mappings/iso-8859_16-2001.ucm | 301 + icuSources/data/mappings/jisx-201.ucm | 229 - icuSources/data/mappings/lmb-excp.ucm | 4 +- ...-1275_P100-1995.ucm => macos-0_2-10.2.ucm} | 183 +- ...acos-2566-10_2.ucm => macos-2566-10.2.ucm} | 2 +- ...m-1282_P100-1996.ucm => macos-29-10.2.ucm} | 156 +- ...m-1281_P100-1996.ucm => macos-35-10.2.ucm} | 172 +- ...bm-1280_P100-1996.ucm => macos-6-10.2.ucm} | 171 +- ...-1283_P100-1996.ucm => macos-7_3-10.2.ucm} | 160 +- icuSources/data/mappings/ucmcore.mk | 6 +- icuSources/data/mappings/ucmebcdic.mk | 8 +- icuSources/data/mappings/ucmfiles.mk | 26 +- icuSources/data/mappings/ucmlocal.mk | 11 + .../data/mappings/windows-1256-2000.ucm | 570 + icuSources/data/mappings/windows-874-2000.ucm | 430 + icuSources/data/mappings/windows-936-2000.ucm | 24530 ++++++++++++ icuSources/data/mappings/windows-949-2000.ucm | 17808 +++++++++ icuSources/data/mappings/windows-950-2000.ucm | 20378 ++++++++++ icuSources/data/misc/CurrencyData.txt | 296 + icuSources/data/misc/NamePrepProfile.txt | 1945 + icuSources/data/misc/icudata.rc | 4 +- icuSources/data/misc/miscfiles.mk | 26 + icuSources/data/misc/rfc3454_A_1.txt | 407 - icuSources/data/misc/rfc3454_B_1.txt | 38 - icuSources/data/misc/rfc3454_B_2.txt | 1382 - icuSources/data/misc/rfc3454_C_X.txt | 182 - icuSources/data/misc/timezone.txt | 868 - icuSources/data/misc/zoneinfo.txt | 3164 ++ icuSources/data/mkdll.lk | 4 - icuSources/data/mkobj.cl | 3 - icuSources/data/rbnf/da.txt | 34 + icuSources/data/rbnf/de.txt | 57 + icuSources/data/rbnf/el.txt | 57 + icuSources/data/rbnf/en.txt | 219 + icuSources/data/rbnf/en_GB.txt | 77 + icuSources/data/rbnf/eo.txt | 36 + icuSources/data/rbnf/es.txt | 74 + icuSources/data/rbnf/fa.txt | 39 + icuSources/data/rbnf/fa_AF.txt | 39 + icuSources/data/rbnf/fr.txt | 79 + .../en_IE_PREEURO.txt => rbnf/fr_BE.txt} | 10 +- icuSources/data/rbnf/fr_CH.txt | 57 + icuSources/data/rbnf/ga.txt | 337 + icuSources/data/rbnf/he.txt | 580 + icuSources/data/rbnf/it.txt | 108 + icuSources/data/rbnf/ja.txt | 54 + icuSources/data/rbnf/mt.txt | 193 + icuSources/data/rbnf/nl.txt | 37 + icuSources/data/rbnf/pl.txt | 44 + icuSources/data/rbnf/pt.txt | 43 + icuSources/data/rbnf/rbnffiles.mk | 55 + icuSources/data/rbnf/root.txt | 27 + icuSources/data/rbnf/ru.txt | 51 + icuSources/data/rbnf/sv.txt | 95 + icuSources/data/rbnf/th.txt | 49 + icuSources/data/rbnf/uk.txt | 53 + icuSources/data/translit/Any_Accents.txt | 290 + icuSources/data/translit/Any_Publishing.txt | 34 + icuSources/data/translit/Arabic_Latin.txt | 146 + .../data/translit/Bengali_InterIndic.txt | 103 + icuSources/data/translit/Cyrillic_Latin.txt | 306 + .../data/translit/Devanagari_InterIndic.txt | 117 + .../data/translit/Fullwidth_Halfwidth.txt | 271 + icuSources/data/translit/Greek_Latin.txt | 345 + .../data/translit/Greek_Latin_UNGEGN.txt | 252 + .../data/translit/Gujarati_InterIndic.txt | 91 + .../data/translit/Gurmukhi_InterIndic.txt | 95 + icuSources/data/translit/Han_Latin.txt | 1440 + icuSources/data/translit/Han_Spacedhan.txt | 24 + icuSources/data/translit/Hebrew_Latin.txt | 109 + .../data/translit/Hiragana_Katakana.txt | 207 + icuSources/data/translit/Hiragana_Latin.txt | 14 + .../data/translit/InterIndic_Bengali.txt | 147 + .../data/translit/InterIndic_Devanagari.txt | 158 + .../data/translit/InterIndic_Gujarati.txt | 138 + .../data/translit/InterIndic_Gurmukhi.txt | 147 + .../data/translit/InterIndic_Kannada.txt | 141 + icuSources/data/translit/InterIndic_Latin.txt | 529 + .../data/translit/InterIndic_Malayalam.txt | 141 + icuSources/data/translit/InterIndic_Oriya.txt | 137 + icuSources/data/translit/InterIndic_Tamil.txt | 151 + .../data/translit/InterIndic_Telugu.txt | 141 + .../data/translit/Kannada_InterIndic.txt | 92 + icuSources/data/translit/Latin_InterIndic.txt | 383 + icuSources/data/translit/Latin_Jamo.txt | 522 + icuSources/data/translit/Latin_Katakana.txt | 495 + .../data/translit/Latin_NumericPinyin.txt | 41 + .../data/translit/Malayalam_InterIndic.txt | 85 + icuSources/data/translit/Oriya_InterIndic.txt | 95 + icuSources/data/translit/Tamil_InterIndic.txt | 76 + .../data/translit/Telugu_InterIndic.txt | 90 + .../data/translit/ThaiLogical_Latin.txt | 187 + icuSources/data/translit/Thai_ThaiLogical.txt | 26 + icuSources/data/translit/Thai_ThaiSemi.txt | 11 + icuSources/data/translit/Tone_Digit.txt | 11 + .../de_DE_PREEURO.txt => translit/el.txt} | 12 +- icuSources/data/translit/en.txt | 22 + icuSources/data/translit/root.txt | 778 + icuSources/data/translit/t_Any_Accents.txt | 306 - icuSources/data/translit/t_Any_Publishing.txt | 50 - icuSources/data/translit/t_Arab_Latn.txt | 162 - .../data/translit/t_Beng_InterIndic.txt | 117 - icuSources/data/translit/t_Cyrl_Latn.txt | 322 - .../data/translit/t_Deva_InterIndic.txt | 132 - icuSources/data/translit/t_FWidth_HWidth.txt | 287 - icuSources/data/translit/t_Grek_Latn.txt | 354 - .../data/translit/t_Grek_Latn_UNGEGN.txt | 260 - .../data/translit/t_Gujr_InterIndic.txt | 105 - .../data/translit/t_Guru_InterIndic.txt | 112 - icuSources/data/translit/t_Hani_Latn.txt | 25439 ------------ icuSources/data/translit/t_Hebr_Latn.txt | 112 - icuSources/data/translit/t_Hira_Kana.txt | 223 - icuSources/data/translit/t_Hira_Latn.txt | 30 - .../data/translit/t_InterIndic_Beng.txt | 146 - .../data/translit/t_InterIndic_Deva.txt | 173 - .../data/translit/t_InterIndic_Gujr.txt | 147 - .../data/translit/t_InterIndic_Guru.txt | 162 - .../data/translit/t_InterIndic_Knda.txt | 151 - .../data/translit/t_InterIndic_Latn.txt | 544 - .../data/translit/t_InterIndic_Mlym.txt | 153 - .../data/translit/t_InterIndic_Orya.txt | 146 - .../data/translit/t_InterIndic_Taml.txt | 163 - .../data/translit/t_InterIndic_Telu.txt | 153 - .../data/translit/t_Knda_InterIndic.txt | 106 - .../data/translit/t_Latn_InterIndic.txt | 397 - icuSources/data/translit/t_Latn_Jamo.txt | 538 - icuSources/data/translit/t_Latn_Kana.txt | 511 - .../data/translit/t_Mlym_InterIndic.txt | 101 - .../data/translit/t_Orya_InterIndic.txt | 107 - .../data/translit/t_Taml_InterIndic.txt | 92 - .../data/translit/t_Telu_InterIndic.txt | 108 - icuSources/data/translit/translit_index.txt | 266 - icuSources/data/translit/trnsfiles.mk | 39 +- icuSources/data/unidata/Blocks.txt | 26 +- icuSources/data/unidata/CaseFolding.txt | 8 +- icuSources/data/unidata/DerivedAge.txt | 89 +- icuSources/data/unidata/DerivedBidiClass.txt | 225 +- .../data/unidata/DerivedCoreProperties.txt | 8798 +++-- .../data/unidata/DerivedJoiningGroup.txt | 213 +- .../data/unidata/DerivedJoiningType.txt | 37 +- .../unidata/DerivedNormalizationProps.txt | 3527 +- .../data/unidata/DerivedNumericValues.txt | 1496 +- icuSources/data/unidata/FractionalUCA.txt | 29935 ++++++++------ icuSources/data/unidata/LineBreak.txt | 133 +- icuSources/data/unidata/PropList.txt | 214 +- icuSources/data/unidata/PropertyAliases.txt | 65 +- .../data/unidata/PropertyValueAliases.txt | 263 +- icuSources/data/unidata/Scripts.txt | 1704 +- icuSources/data/unidata/SpecialCasing.txt | 6 +- icuSources/data/unidata/UCARules.txt | 25909 ++++++------ icuSources/data/unidata/UnicodeData.txt | 642 +- icuSources/data/unidata/changes.txt | 73 + icuSources/data/unidata/ucdterms.txt | 76 +- icuSources/extra/Makefile.in | 7 +- icuSources/extra/scrptrun/scrptrun.h | 6 +- icuSources/extra/uconv/Makefile.in | 39 +- icuSources/extra/uconv/makedata.mak | 54 +- icuSources/extra/uconv/pkgdata.inc.in | 31 +- icuSources/extra/uconv/resources/fr.txt | 30 +- icuSources/extra/uconv/resources/root.txt | 61 +- icuSources/extra/uconv/uconv.1.in | 23 +- icuSources/extra/uconv/uconv.cpp | 827 +- icuSources/extra/uconv/uconv.dsp | 16 +- icuSources/extra/uconv/uconv.dsw | 29 - icuSources/extra/uconv/uconv.vcproj | 41 +- icuSources/extra/uconv/unicode/uwmsg.h | 8 +- icuSources/extra/uconv/uwmsg.c | 23 +- icuSources/extra/ustdio/locbund.c | 225 - icuSources/extra/ustdio/locbund.h | 125 - icuSources/extra/ustdio/loccache.c | 122 - icuSources/extra/ustdio/sprintf.c | 1449 - icuSources/extra/ustdio/sprintf.h | 78 - icuSources/extra/ustdio/sprntf_p.c | 307 - icuSources/extra/ustdio/sprntf_p.h | 51 - icuSources/extra/ustdio/sscanf.c | 1335 - icuSources/extra/ustdio/sscanf.h | 79 - icuSources/extra/ustdio/sscanf_p.c | 187 - icuSources/extra/ustdio/sscanf_p.h | 50 - icuSources/extra/ustdio/ufile.h | 103 - icuSources/extra/ustdio/uprintf.c | 1338 - icuSources/extra/ustdio/uprintf.h | 70 - icuSources/extra/ustdio/uprntf_p.c | 308 - icuSources/extra/ustdio/uprntf_p.h | 52 - icuSources/extra/ustdio/uscanf.c | 1348 - icuSources/extra/ustdio/uscanf.h | 69 - icuSources/extra/ustdio/uscanf_p.c | 188 - icuSources/extra/ustdio/uscanf_p.h | 51 - icuSources/extra/ustdio/uscanset.c | 188 - icuSources/extra/ustdio/uscanset.h | 77 - icuSources/extra/ustdio/ustdio.dsw | 29 - icuSources/extra/ustdio/ustream.cpp | 332 - icuSources/i18n/Makefile.in | 57 +- icuSources/i18n/anytrans.cpp | 9 +- icuSources/i18n/anytrans.h | 23 +- icuSources/i18n/astro.cpp | 1559 + icuSources/i18n/astro.h | 791 + icuSources/i18n/buddhcal.cpp | 64 +- icuSources/i18n/buddhcal.h | 164 +- icuSources/i18n/calendar.cpp | 2339 +- icuSources/i18n/casetrn.cpp | 196 + icuSources/i18n/casetrn.h | 115 + icuSources/i18n/chnsecal.cpp | 13 + icuSources/i18n/chnsecal.h | 11 + icuSources/i18n/choicfmt.cpp | 41 +- icuSources/i18n/coleitr.cpp | 9 +- icuSources/i18n/coll.cpp | 534 +- icuSources/i18n/cpdtrans.cpp | 8 +- icuSources/i18n/cpdtrans.h | 24 +- icuSources/i18n/curramt.cpp | 50 + icuSources/i18n/currfmt.cpp | 78 + icuSources/i18n/currfmt.h | 112 + icuSources/i18n/currunit.cpp | 60 + icuSources/i18n/datefmt.cpp | 59 +- icuSources/i18n/dcfmtsym.cpp | 200 +- icuSources/i18n/decimfmt.cpp | 1046 +- icuSources/{common => i18n}/digitlst.cpp | 194 +- icuSources/{common => i18n}/digitlst.h | 53 +- icuSources/i18n/dtfmtsym.cpp | 180 +- icuSources/i18n/esctrn.cpp | 25 +- icuSources/i18n/esctrn.h | 12 +- icuSources/i18n/fmtable.cpp | 332 +- icuSources/i18n/format.cpp | 48 +- icuSources/i18n/funcrepl.cpp | 9 +- icuSources/i18n/funcrepl.h | 12 +- icuSources/i18n/gregocal.cpp | 2140 +- icuSources/i18n/gregoimp.cpp | 270 + icuSources/i18n/gregoimp.h | 342 + icuSources/i18n/hebrwcal.cpp | 729 + icuSources/i18n/hebrwcal.h | 484 + icuSources/i18n/hextouni.cpp | 376 - icuSources/i18n/hextouni.h | 198 - icuSources/i18n/i18n.dsp | 501 +- icuSources/i18n/i18n.rc | 46 +- icuSources/i18n/i18n.vcproj | 581 +- icuSources/i18n/islamcal.cpp | 528 + icuSources/i18n/islamcal.h | 462 + icuSources/i18n/japancal.cpp | 163 +- icuSources/i18n/japancal.h | 104 +- icuSources/i18n/measfmt.cpp | 44 + icuSources/i18n/measure.cpp | 65 + icuSources/i18n/msgfmt.cpp | 83 +- icuSources/i18n/name2uni.cpp | 45 +- icuSources/i18n/name2uni.h | 25 +- icuSources/i18n/nfrs.cpp | 48 +- icuSources/i18n/nfrs.h | 3 +- icuSources/i18n/nfrule.cpp | 16 +- icuSources/i18n/nfrule.h | 7 +- icuSources/i18n/nfsubs.cpp | 137 +- icuSources/i18n/nfsubs.h | 133 +- icuSources/i18n/nortrans.cpp | 4 +- icuSources/i18n/nortrans.h | 14 +- icuSources/i18n/nultrans.cpp | 6 +- icuSources/i18n/nultrans.h | 27 +- icuSources/i18n/numfmt.cpp | 584 +- icuSources/i18n/olsontz.cpp | 492 + icuSources/i18n/olsontz.h | 302 + icuSources/i18n/quant.cpp | 7 +- icuSources/i18n/quant.h | 23 +- icuSources/i18n/rbnf.cpp | 882 +- icuSources/i18n/rbt.cpp | 149 +- icuSources/i18n/rbt.h | 126 +- icuSources/i18n/rbt_data.cpp | 4 +- icuSources/i18n/rbt_data.h | 4 +- icuSources/i18n/rbt_pars.cpp | 27 +- icuSources/i18n/rbt_rule.cpp | 33 +- icuSources/i18n/rbt_set.cpp | 33 +- icuSources/i18n/rbt_set.h | 2 +- icuSources/i18n/regexcmp.cpp | 113 +- icuSources/i18n/regexcst.h | 156 +- icuSources/i18n/regexcst.txt | 5 +- icuSources/i18n/regeximp.h | 38 +- icuSources/i18n/regexst.cpp | 54 +- icuSources/i18n/regexst.h | 3 +- icuSources/i18n/rematch.cpp | 296 +- icuSources/i18n/remtrans.cpp | 7 +- icuSources/i18n/remtrans.h | 14 +- icuSources/i18n/repattrn.cpp | 163 +- icuSources/i18n/search.cpp | 16 +- icuSources/i18n/simpletz.cpp | 57 +- icuSources/i18n/smpdtfmt.cpp | 397 +- icuSources/i18n/sortkey.cpp | 2 +- icuSources/i18n/strmatch.cpp | 30 +- icuSources/i18n/strmatch.h | 22 +- icuSources/i18n/strrepl.cpp | 26 +- icuSources/i18n/strrepl.h | 16 +- icuSources/i18n/stsearch.cpp | 55 +- icuSources/i18n/tblcoll.cpp | 533 +- icuSources/i18n/timezone.cpp | 1153 +- icuSources/i18n/titletrn.cpp | 196 +- icuSources/i18n/titletrn.h | 37 +- icuSources/i18n/tolowtrn.cpp | 68 +- icuSources/i18n/tolowtrn.h | 38 +- icuSources/i18n/toupptrn.cpp | 70 +- icuSources/i18n/toupptrn.h | 39 +- icuSources/i18n/translit.cpp | 222 +- icuSources/i18n/transreg.cpp | 388 +- icuSources/i18n/transreg.h | 144 +- icuSources/i18n/tridpars.cpp | 41 +- icuSources/i18n/tridpars.h | 25 +- icuSources/i18n/tzdat.h | 268 - icuSources/i18n/ucal.cpp | 43 +- icuSources/i18n/ucln_in.c | 45 +- icuSources/i18n/ucln_in.h | 46 +- icuSources/i18n/ucol.cpp | 2536 +- icuSources/i18n/ucol_bld.cpp | 402 +- icuSources/i18n/ucol_cnt.cpp | 12 +- icuSources/i18n/ucol_elm.cpp | 148 +- icuSources/i18n/ucol_elm.h | 4 +- icuSources/i18n/ucol_imp.h | 186 +- icuSources/i18n/ucol_sit.cpp | 1062 + icuSources/i18n/ucol_tok.cpp | 629 +- icuSources/i18n/ucol_tok.h | 17 +- icuSources/i18n/ucol_wgt.c | 43 +- icuSources/i18n/ucoleitr.cpp | 1 + icuSources/i18n/ucurr.cpp | 472 +- icuSources/i18n/ucurrimp.h | 29 + icuSources/i18n/udat.cpp | 675 +- icuSources/i18n/ulocdata.c | 111 + icuSources/i18n/umsg.cpp | 75 +- icuSources/i18n/unesctrn.cpp | 32 +- icuSources/i18n/unesctrn.h | 25 +- icuSources/i18n/uni2name.cpp | 8 +- icuSources/i18n/uni2name.h | 17 +- icuSources/i18n/unicode/calendar.h | 766 +- icuSources/i18n/unicode/choicfmt.h | 53 +- icuSources/i18n/unicode/coleitr.h | 469 +- icuSources/i18n/unicode/coll.h | 1594 +- icuSources/i18n/unicode/curramt.h | 124 + icuSources/i18n/unicode/currunit.h | 112 + icuSources/i18n/unicode/datefmt.h | 188 +- icuSources/i18n/unicode/dcfmtsym.h | 59 +- icuSources/i18n/unicode/decimfmt.h | 959 +- icuSources/i18n/unicode/dtfmtsym.h | 68 +- icuSources/i18n/unicode/fieldpos.h | 70 +- icuSources/i18n/unicode/fmtable.h | 395 +- icuSources/i18n/unicode/format.h | 48 +- icuSources/i18n/unicode/gregocal.h | 448 +- icuSources/i18n/unicode/measfmt.h | 71 + icuSources/i18n/unicode/measunit.h | 66 + icuSources/i18n/unicode/measure.h | 132 + icuSources/i18n/unicode/msgfmt.h | 23 +- icuSources/i18n/unicode/numfmt.h | 223 +- icuSources/i18n/unicode/rbnf.h | 249 +- icuSources/i18n/unicode/regex.h | 535 +- icuSources/i18n/unicode/search.h | 22 +- icuSources/i18n/unicode/simpletz.h | 75 +- icuSources/i18n/unicode/smpdtfmt.h | 103 +- icuSources/i18n/unicode/sortkey.h | 152 +- icuSources/i18n/unicode/stsearch.h | 54 +- icuSources/i18n/unicode/tblcoll.h | 1394 +- icuSources/i18n/unicode/timezone.h | 136 +- icuSources/i18n/unicode/translit.h | 317 +- icuSources/i18n/unicode/ucal.h | 235 +- icuSources/i18n/unicode/ucol.h | 462 +- icuSources/i18n/unicode/ucoleitr.h | 36 +- icuSources/i18n/unicode/ucurr.h | 112 +- icuSources/i18n/unicode/udat.h | 289 +- icuSources/i18n/unicode/ulocdata.h | 95 + icuSources/i18n/unicode/umsg.h | 80 +- icuSources/i18n/unicode/unifltlg.h | 111 - icuSources/i18n/unicode/unirepl.h | 14 +- icuSources/i18n/unicode/unum.h | 363 +- icuSources/i18n/unicode/uregex.h | 630 + icuSources/i18n/unicode/usearch.h | 56 +- icuSources/i18n/unicode/utmscale.h | 459 + icuSources/i18n/unicode/utrans.h | 255 +- icuSources/i18n/unifltlg.cpp | 200 - icuSources/i18n/unitohex.cpp | 272 - icuSources/i18n/unitohex.h | 238 - icuSources/i18n/unum.cpp | 1106 +- icuSources/i18n/uregex.cpp | 1131 + icuSources/i18n/usearch.cpp | 408 +- icuSources/i18n/usrchimp.h | 6 +- icuSources/i18n/utmscale.c | 175 + icuSources/i18n/utrans.cpp | 236 +- icuSources/icudefs.mk.in | 93 +- icuSources/{extra/ustdio => io}/Makefile.in | 51 +- .../{extra/ustdio/ustdio.dsp => io/io.dsp} | 158 +- .../{extra/ustdio/ustdio.rc => io/io.rc} | 50 +- .../ustdio/ustdio.vcproj => io/io.vcproj} | 121 +- icuSources/io/locbund.c | 139 + icuSources/io/locbund.h | 79 + icuSources/io/sprintf.c | 250 + icuSources/io/sscanf.c | 128 + icuSources/{extra/ustdio => io}/ufile.c | 241 +- icuSources/io/ufile.h | 124 + icuSources/{extra/ustdio => io}/ufmt_cmn.c | 124 +- icuSources/{extra/ustdio => io}/ufmt_cmn.h | 120 +- .../{extra/ustdio => io}/unicode/ustdio.h | 453 +- .../{extra/ustdio => io}/unicode/ustream.h | 21 +- icuSources/io/uprintf.c | 163 + icuSources/io/uprintf.h | 100 + icuSources/io/uprntf_p.c | 1404 + icuSources/io/uscanf.c | 106 + .../{extra/ustdio/loccache.h => io/uscanf.h} | 30 +- icuSources/io/uscanf_p.c | 1320 + icuSources/{extra/ustdio => io}/ustdio.c | 396 +- icuSources/io/ustream.cpp | 137 + icuSources/layout/AlternateSubstSubtables.cpp | 3 +- icuSources/layout/AlternateSubstSubtables.h | 3 +- icuSources/layout/AnchorTables.cpp | 6 +- icuSources/layout/AnchorTables.h | 3 +- icuSources/layout/ArabicLayoutEngine.cpp | 158 +- icuSources/layout/ArabicLayoutEngine.h | 47 +- icuSources/layout/ArabicLigatureData.cpp | 365 - icuSources/layout/ArabicShaping.cpp | 177 +- icuSources/layout/ArabicShaping.h | 56 +- icuSources/layout/AttachmentPosnSubtables.h | 3 +- icuSources/layout/CanonData.cpp | 3679 ++ icuSources/layout/CanonShaping.h | 22 + icuSources/layout/CharSubstitutionFilter.h | 81 + icuSources/layout/ClassDefinitionTables.cpp | 11 +- icuSources/layout/ClassDefinitionTables.h | 3 +- icuSources/layout/ContextualGlyphInsertion.h | 3 +- .../layout/ContextualGlyphSubstProc.cpp | 18 +- icuSources/layout/ContextualGlyphSubstProc.h | 23 +- .../layout/ContextualGlyphSubstitution.h | 3 +- .../layout/ContextualSubstSubtables.cpp | 29 +- icuSources/layout/ContextualSubstSubtables.h | 9 +- icuSources/layout/CoverageTables.cpp | 3 +- icuSources/layout/CoverageTables.h | 3 +- icuSources/layout/DefaultCharMapper.h | 2 +- icuSources/layout/DeviceTables.cpp | 4 +- icuSources/layout/Features.h | 5 +- icuSources/layout/GDEFMarkFilter.cpp | 3 +- icuSources/layout/GDEFMarkFilter.h | 3 +- icuSources/layout/GXLayoutEngine.cpp | 17 +- icuSources/layout/GXLayoutEngine.h | 40 +- icuSources/layout/GlyphDefinitionTables.cpp | 3 +- icuSources/layout/GlyphDefinitionTables.h | 3 +- icuSources/layout/GlyphIterator.cpp | 129 +- icuSources/layout/GlyphIterator.h | 28 +- icuSources/layout/GlyphLookupTables.cpp | 32 + icuSources/layout/GlyphLookupTables.h | 34 + icuSources/layout/GlyphPositionAdjustments.h | 3 +- icuSources/layout/GlyphPositioningTables.cpp | 10 +- icuSources/layout/GlyphPositioningTables.h | 16 +- icuSources/layout/GlyphPosnLookupProc.cpp | 3 +- icuSources/layout/GlyphPosnLookupProc.h | 3 +- icuSources/layout/GlyphSubstLookupProc.cpp | 3 +- icuSources/layout/GlyphSubstitutionTables.cpp | 23 +- icuSources/layout/GlyphSubstitutionTables.h | 19 +- icuSources/layout/HanLayoutEngine.cpp | 31 +- icuSources/layout/HanLayoutEngine.h | 27 +- icuSources/layout/HebrewLigatureData.cpp | 60 - icuSources/layout/HebrewShaping.cpp | 38 - icuSources/layout/HebrewShaping.h | 35 - icuSources/layout/HindiFeatureTags.h | 3 +- icuSources/layout/IndicClassTables.cpp | 79 +- icuSources/layout/IndicLayoutEngine.cpp | 37 +- icuSources/layout/IndicLayoutEngine.h | 36 +- icuSources/layout/IndicRearrangement.h | 3 +- .../layout/IndicRearrangementProcessor.cpp | 363 +- .../layout/IndicRearrangementProcessor.h | 25 +- icuSources/layout/IndicReordering.cpp | 382 +- icuSources/layout/IndicReordering.h | 130 +- icuSources/layout/LEFontInstance.cpp | 11 +- icuSources/layout/LEFontInstance.h | 67 +- icuSources/layout/LEGlyphFilter.h | 7 +- icuSources/layout/LEGlyphStorage.cpp | 586 + icuSources/layout/LEGlyphStorage.h | 499 + icuSources/layout/LEInsertionList.cpp | 88 + icuSources/layout/LEInsertionList.h | 169 + icuSources/layout/LELanguages.h | 8 +- icuSources/layout/LEScripts.h | 11 +- icuSources/layout/LESwaps.h | 42 +- icuSources/layout/LETypes.h | 23 +- icuSources/layout/LayoutEngine.cpp | 379 +- icuSources/layout/LayoutEngine.h | 197 +- icuSources/layout/LayoutTables.h | 3 +- icuSources/layout/LigatureSubstProc.cpp | 16 +- icuSources/layout/LigatureSubstProc.h | 23 +- icuSources/layout/LigatureSubstSubtables.h | 3 +- icuSources/layout/LigatureSubstitution.h | 3 +- icuSources/layout/LookupProcessor.cpp | 39 +- icuSources/layout/LookupProcessor.h | 6 +- icuSources/layout/LookupTables.cpp | 3 +- icuSources/layout/LookupTables.h | 3 +- icuSources/layout/Lookups.cpp | 3 +- icuSources/layout/Lookups.h | 3 +- icuSources/layout/MPreFixups.cpp | 28 +- icuSources/layout/MPreFixups.h | 9 +- icuSources/layout/Makefile.in | 64 +- icuSources/layout/MarkArrays.cpp | 3 +- icuSources/layout/MarkArrays.h | 3 +- icuSources/layout/MarkToBasePosnSubtables.cpp | 13 +- icuSources/layout/MarkToBasePosnSubtables.h | 3 +- .../layout/MarkToLigaturePosnSubtables.cpp | 8 +- .../layout/MarkToLigaturePosnSubtables.h | 3 +- icuSources/layout/MarkToMarkPosnSubtables.cpp | 10 +- icuSources/layout/MarkToMarkPosnSubtables.h | 3 +- icuSources/layout/MorphStateTables.h | 3 +- icuSources/layout/MorphTables.cpp | 11 +- icuSources/layout/MorphTables.h | 9 +- icuSources/layout/MultipleSubstSubtables.cpp | 51 +- icuSources/layout/MultipleSubstSubtables.h | 3 +- .../layout/NonContextualGlyphSubstProc.cpp | 5 +- .../layout/NonContextualGlyphSubstProc.h | 7 +- icuSources/layout/OpenTypeLayoutEngine.cpp | 151 +- icuSources/layout/OpenTypeLayoutEngine.h | 64 +- icuSources/layout/OpenTypeTables.h | 3 +- icuSources/layout/OpenTypeUtilities.cpp | 3 +- icuSources/layout/OpenTypeUtilities.h | 3 +- .../layout/PairPositioningSubtables.cpp | 11 +- icuSources/layout/PairPositioningSubtables.h | 3 +- icuSources/layout/ScriptAndLanguage.h | 7 +- icuSources/layout/ScriptAndLanguageTags.cpp | 9 +- icuSources/layout/ScriptAndLanguageTags.h | 15 +- icuSources/layout/SegmentArrayProcessor.cpp | 18 +- icuSources/layout/SegmentArrayProcessor.h | 22 +- icuSources/layout/SegmentSingleProcessor.cpp | 16 +- icuSources/layout/SegmentSingleProcessor.h | 22 +- icuSources/layout/SimpleArrayProcessor.cpp | 16 +- icuSources/layout/SimpleArrayProcessor.h | 22 +- .../layout/SinglePositioningSubtables.cpp | 3 +- .../layout/SinglePositioningSubtables.h | 3 +- .../layout/SingleSubstitutionSubtables.cpp | 3 +- .../layout/SingleSubstitutionSubtables.h | 3 +- icuSources/layout/SingleTableProcessor.cpp | 13 +- icuSources/layout/SingleTableProcessor.h | 22 +- icuSources/layout/StateTableProcessor.cpp | 11 +- icuSources/layout/StateTableProcessor.h | 10 +- icuSources/layout/StateTables.h | 3 +- icuSources/layout/SubstitutionLookups.cpp | 3 +- icuSources/layout/SubstitutionLookups.h | 3 +- icuSources/layout/SubtableProcessor.cpp | 3 +- icuSources/layout/SubtableProcessor.h | 7 +- icuSources/layout/ThaiLayoutEngine.cpp | 17 +- icuSources/layout/ThaiLayoutEngine.h | 27 +- icuSources/layout/ThaiShaping.cpp | 100 +- icuSources/layout/ThaiShaping.h | 29 +- icuSources/layout/ThaiStateTables.cpp | 106 +- icuSources/layout/TrimmedArrayProcessor.cpp | 14 +- icuSources/layout/TrimmedArrayProcessor.h | 26 +- icuSources/layout/ValueRecords.cpp | 7 +- icuSources/layout/ValueRecords.h | 3 +- icuSources/layout/layout.dsp | 146 +- icuSources/layout/layout.dsw | 29 - icuSources/layout/layout.rc | 50 +- icuSources/layout/layout.vcproj | 257 +- icuSources/layout/layoutobj.inc | 65 - icuSources/layout/loengine.cpp | 7 +- icuSources/layout/unicode/loengine.h | 51 +- icuSources/layoutex/Makefile.in | 53 +- icuSources/layoutex/ParagraphLayout.cpp | 273 +- icuSources/layoutex/RunArrays.cpp | 64 + icuSources/layoutex/Utilities.cpp | 99 - icuSources/layoutex/Utilities.h | 26 - icuSources/layoutex/layout/ParagraphLayout.h | 53 +- icuSources/layoutex/layout/RunArrays.h | 155 +- icuSources/layoutex/layoutex.dsp | 12 +- icuSources/layoutex/layoutex.rc | 50 +- icuSources/layoutex/layoutex.vcproj | 56 +- icuSources/mkinstalldirs | 4 +- icuSources/runConfigureICU | 103 +- icuSources/samples/Makefile.in | 4 +- icuSources/samples/all/all.sln | 76 +- icuSources/samples/break/break.cpp | 169 +- icuSources/samples/break/break.vcproj | 18 +- icuSources/samples/cal/Makefile.in | 8 +- icuSources/samples/cal/cal.c | 187 +- icuSources/samples/cal/cal.vcproj | 18 +- icuSources/samples/cal/uprint.h | 4 +- icuSources/samples/case/case.cpp | 125 +- icuSources/samples/case/case.vcproj | 18 +- icuSources/samples/case/ucase.c | 16 +- icuSources/samples/citer/citer.cpp | 183 + icuSources/samples/citer/readme.txt | 59 + icuSources/samples/date/Makefile.in | 18 +- icuSources/samples/date/date.vcproj | 18 +- icuSources/samples/date/uprint.h | 4 +- icuSources/samples/datecal/Makefile | 24 + icuSources/samples/datecal/cal.cpp | 67 + icuSources/samples/datecal/ccal.c | 55 + icuSources/samples/datefmt/datefmt.vcproj | 18 +- icuSources/samples/defs.mk | 4 +- icuSources/samples/layout/FontMap.GDI | 19 +- icuSources/samples/layout/FontMap.Gnome | 2 +- icuSources/samples/layout/GDIFontInstance.cpp | 2 +- icuSources/samples/layout/GDIFontMap.cpp | 9 +- .../samples/layout/GnomeFontInstance.cpp | 10 +- icuSources/samples/layout/GnomeFontMap.cpp | 9 +- icuSources/samples/layout/LayoutSample.rc | 4 +- icuSources/samples/layout/Sample.txt | 2 +- .../layout/ScriptCompositeFontInstance.cpp | 2 +- icuSources/samples/layout/gnomelayout.cpp | 59 +- icuSources/samples/layout/layout.cpp | 6 +- icuSources/samples/layout/layout.vcproj | 52 +- icuSources/samples/layout/paragraph.cpp | 31 +- icuSources/samples/layout/paragraph.h | 2 +- icuSources/samples/legacy/Makefile | 4 +- icuSources/samples/legacy/legacy.vcproj | 18 +- icuSources/samples/legacy/oldcol.cpp | 29 +- icuSources/samples/msgfmt/msgfmt.vcproj | 18 +- icuSources/samples/numfmt/main.cpp | 7 +- icuSources/samples/numfmt/numfmt.vcproj | 18 +- icuSources/samples/numfmt/util.cpp | 1 + icuSources/samples/props/props.vcproj | 18 +- icuSources/samples/readme.txt | 2 +- icuSources/samples/strsrch/strsrch.vcproj | 20 +- icuSources/samples/translit/translit.vcproj | 18 +- icuSources/samples/uciter8/uciter8.vcproj | 18 +- icuSources/samples/ucnv/data02.bin | 1 + icuSources/samples/ucnv/ucnv.vcproj | 18 +- icuSources/samples/udata/Makefile | 4 +- icuSources/samples/udata/reader.c | 29 +- icuSources/samples/udata/reader.vcproj | 54 +- icuSources/samples/udata/udata.sln | 12 +- icuSources/samples/udata/writer.vcproj | 18 +- icuSources/samples/ufortune/Makefile | 4 +- .../ufortune/resources/fortune_resources.mak | 4 +- icuSources/samples/ufortune/ufortune.vcproj | 47 +- icuSources/samples/ugrep/ugrep.sln | 20 +- icuSources/samples/ugrep/ugrep.vcproj | 122 +- icuSources/samples/uresb/Makefile | 6 +- icuSources/samples/uresb/resources.vcproj | 45 +- icuSources/samples/uresb/uresb.c | 7 +- icuSources/samples/uresb/uresb.vcproj | 18 +- icuSources/samples/ustring/ustring.vcproj | 18 +- icuSources/samples/xml2txt/ChildName.cpp | 14 - icuSources/samples/xml2txt/ChildName.h | 29 - .../samples/xml2txt/DOMPrintFormatTarget.cpp | 23 - .../samples/xml2txt/DOMPrintFormatTarget.h | 33 - .../samples/xml2txt/DOMTreeErrorReporter.cpp | 41 - .../samples/xml2txt/DOMTreeErrorReporter.hpp | 51 - icuSources/samples/xml2txt/readme.txt | 2 + icuSources/samples/xml2txt/xml2res.pl | 124 - icuSources/samples/xml2txt/xml2txt.cpp | 903 - icuSources/samples/xml2txt/xml2txt.dsp | 143 - icuSources/samples/xml2txt/xml2txt.h | 49 - icuSources/samples/xml2txt/xml2txt.plg | 16 - icuSources/stubdata/Makefile.in | 27 +- icuSources/stubdata/stubdata.dsp | 12 +- icuSources/stubdata/stubdata.vcproj | 38 +- icuSources/test/Makefile.in | 12 +- icuSources/test/cintltst/Makefile.in | 16 +- icuSources/test/cintltst/bocu1tst.c | 10 +- icuSources/test/cintltst/callcoll.c | 348 +- icuSources/test/cintltst/callcoll.h | 17 +- icuSources/test/cintltst/calltest.c | 18 +- icuSources/test/cintltst/capitst.c | 262 +- icuSources/test/cintltst/capitst.h | 13 +- icuSources/test/cintltst/cbiapts.c | 68 +- icuSources/test/cintltst/cbididat.c | 59 +- icuSources/test/cintltst/cbiditst.c | 83 +- icuSources/test/cintltst/cbiditst.h | 4 +- icuSources/test/cintltst/ccaltst.c | 12 +- icuSources/test/cintltst/ccapitst.c | 513 +- icuSources/test/cintltst/cctest.c | 81 +- icuSources/test/cintltst/cdantst.c | 6 +- icuSources/test/cintltst/cdattst.c | 132 +- icuSources/test/cintltst/cdtdptst.c | 19 +- icuSources/test/cintltst/cdtrgtst.c | 43 +- icuSources/test/cintltst/cfintst.c | 6 +- icuSources/test/cintltst/cformtst.c | 8 +- icuSources/test/cintltst/cg7coll.c | 8 +- icuSources/test/cintltst/chashtst.c | 46 +- icuSources/test/cintltst/cintltst.c | 342 +- icuSources/test/cintltst/cintltst.dsp | 50 +- icuSources/test/cintltst/cintltst.h | 35 +- icuSources/test/cintltst/cintltst.vcproj | 80 +- icuSources/test/cintltst/citertst.c | 178 +- icuSources/test/cintltst/citertst.h | 10 +- icuSources/test/cintltst/cldrtest.c | 1134 + icuSources/test/cintltst/cloctst.c | 2365 +- icuSources/test/cintltst/cloctst.h | 32 +- icuSources/test/cintltst/cmsccoll.c | 1671 +- icuSources/test/cintltst/cmsgtst.c | 104 +- icuSources/test/cintltst/cnmdptst.c | 1073 +- icuSources/test/cintltst/cnmdptst.h | 4 +- icuSources/test/cintltst/cnormtst.c | 160 +- icuSources/test/cintltst/cnumtst.c | 507 +- icuSources/test/cintltst/cnumtst.h | 35 +- icuSources/test/cintltst/crestst.c | 468 +- icuSources/test/cintltst/crestst.h | 7 +- icuSources/test/cintltst/creststn.c | 952 +- icuSources/test/cintltst/creststn.h | 6 +- icuSources/test/cintltst/cstrtest.c | 137 +- icuSources/test/cintltst/cucdapi.c | 1 + icuSources/test/cintltst/cucdapi.h | 9 + icuSources/test/cintltst/cucdtst.c | 529 +- icuSources/test/cintltst/custrtrn.c | 119 +- icuSources/test/cintltst/custrtst.c | 29 +- icuSources/test/cintltst/cutiltst.c | 10 +- icuSources/test/cintltst/encoll.c | 4 +- icuSources/test/cintltst/hpmufn.c | 476 + icuSources/test/cintltst/idnatest.c | 667 + icuSources/test/cintltst/mstrmtst.c | 296 - icuSources/test/cintltst/nccbtst.c | 282 +- icuSources/test/cintltst/ncnvfbts.c | 20 +- icuSources/test/cintltst/ncnvtst.c | 291 +- icuSources/test/cintltst/nfsprep.c | 350 + icuSources/test/cintltst/nfsprep.h | 113 + icuSources/test/cintltst/nucnvtst.c | 396 +- icuSources/test/cintltst/putiltst.c | 13 +- icuSources/test/cintltst/reapits.c | 916 + icuSources/test/cintltst/sorttest.c | 95 + icuSources/test/cintltst/spreptst.c | 562 + icuSources/test/cintltst/sprpdata.c | 312 + icuSources/test/cintltst/stdnmtst.c | 18 +- icuSources/test/cintltst/tracetst.c | 349 + icuSources/test/cintltst/trietest.c | 23 +- icuSources/test/cintltst/ucmptst.c | 27 +- icuSources/test/cintltst/udatatst.c | 417 +- icuSources/test/cintltst/uenumtst.c | 4 +- icuSources/test/cintltst/usettest.c | 132 +- icuSources/test/cintltst/usrchdat.c | 22 + icuSources/test/cintltst/usrchtst.c | 54 +- icuSources/test/cintltst/utmstest.c | 342 + icuSources/test/cintltst/utransts.c | 145 +- icuSources/test/collperf/collperf.dsp | 4 +- icuSources/test/hdrtst/Makefile | 117 - icuSources/test/hdrtst/Makefile.in | 117 + icuSources/test/hdrtst/cxxfiles.txt | 23 +- icuSources/test/hdrtst/pfiles.txt | 3 + icuSources/test/ieeetest/Makefile.in | 78 - icuSources/test/ieeetest/ieeetest.cpp | 706 - icuSources/test/ieeetest/ieeetest.h | 103 - icuSources/test/intltest/Makefile.in | 29 +- icuSources/test/intltest/allcoll.cpp | 2 +- icuSources/test/intltest/allcoll.h | 8 +- icuSources/test/intltest/apicoll.cpp | 55 +- icuSources/test/intltest/apicoll.h | 17 +- icuSources/test/intltest/astrotst.cpp | 432 + icuSources/test/intltest/astrotst.h | 49 + icuSources/test/intltest/calcasts.cpp | 301 + icuSources/test/intltest/calcasts.h | 62 + icuSources/test/intltest/callimts.cpp | 24 +- icuSources/test/intltest/calregts.cpp | 101 +- icuSources/test/intltest/caltest.cpp | 333 +- icuSources/test/intltest/caltest.h | 51 +- icuSources/test/intltest/caltztst.cpp | 19 + icuSources/test/intltest/caltztst.h | 3 +- icuSources/test/intltest/canittst.cpp | 13 +- icuSources/test/intltest/canittst.h | 1 - icuSources/test/intltest/citrtest.cpp | 15 +- icuSources/test/intltest/cntabcol.cpp | 4 +- icuSources/test/intltest/convtest.cpp | 1227 + icuSources/test/intltest/convtest.h | 91 + icuSources/test/intltest/cpdtrtst.cpp | 26 +- icuSources/test/intltest/cpdtrtst.h | 1 - icuSources/test/intltest/cpputils.cpp | 48 - icuSources/test/intltest/cpputils.h | 14 - icuSources/test/intltest/cputilst.cpp | 48 - icuSources/test/intltest/cputilst.h | 14 - icuSources/test/intltest/dadrcoll.cpp | 10 +- icuSources/test/intltest/dadrcoll.h | 7 +- icuSources/test/intltest/dcfmapts.cpp | 2 +- icuSources/test/intltest/dtfmapts.cpp | 10 +- icuSources/test/intltest/dtfmrgts.cpp | 6 +- icuSources/test/intltest/dtfmrgts.h | 2 +- icuSources/test/intltest/dtfmtrtts.cpp | 141 +- icuSources/test/intltest/dtfmtrtts.h | 31 +- icuSources/test/intltest/dtfmttst.cpp | 368 +- icuSources/test/intltest/dtfmttst.h | 16 +- icuSources/test/intltest/encoll.cpp | 2 +- icuSources/test/intltest/g7coll.cpp | 1 + icuSources/test/intltest/g7coll.h | 2 +- icuSources/test/intltest/hxuntrts.cpp | 444 - icuSources/test/intltest/hxuntrts.h | 69 - icuSources/test/intltest/icusvtst.cpp | 71 +- icuSources/test/intltest/icusvtst.h | 4 +- icuSources/test/intltest/idnaref.cpp | 97 +- icuSources/test/intltest/idnaref.h | 12 +- icuSources/test/intltest/incaltst.cpp | 178 +- icuSources/test/intltest/incaltst.h | 1 + icuSources/test/intltest/intltest.cpp | 497 +- icuSources/test/intltest/intltest.dsp | 175 +- icuSources/test/intltest/intltest.h | 76 +- icuSources/test/intltest/intltest.vcproj | 184 +- icuSources/test/intltest/itercoll.cpp | 13 +- icuSources/test/intltest/itformat.cpp | 17 +- icuSources/test/intltest/itmajor.cpp | 28 +- icuSources/test/intltest/itrbnf.cpp | 321 +- icuSources/test/intltest/itrbnf.h | 12 +- icuSources/test/intltest/itrbnfp.cpp | 183 + icuSources/test/intltest/itrbnfp.h | 48 + icuSources/test/intltest/itrbnfrt.cpp | 5 +- icuSources/test/intltest/ittrans.cpp | 21 +- icuSources/test/intltest/itutil.cpp | 90 +- icuSources/test/intltest/loctest.cpp | 1216 +- icuSources/test/intltest/loctest.h | 87 +- icuSources/test/intltest/miscdtfm.cpp | 26 +- icuSources/test/intltest/msfmrgts.cpp | 32 +- icuSources/test/intltest/nmfmapts.cpp | 236 +- icuSources/test/intltest/nmfmapts.h | 2 +- icuSources/test/intltest/nmfmtrt.cpp | 45 +- icuSources/test/intltest/nmfmtrt.h | 17 +- icuSources/test/intltest/normconf.cpp | 5 +- icuSources/test/intltest/nptrans.cpp | 11 +- icuSources/test/intltest/nptrans.h | 1 - icuSources/test/intltest/numfmtst.cpp | 701 +- icuSources/test/intltest/numfmtst.h | 16 +- icuSources/test/intltest/numrgts.cpp | 174 +- icuSources/test/intltest/numrgts.h | 16 +- icuSources/test/intltest/pptest.cpp | 13 +- icuSources/test/intltest/punyref.h | 1 - icuSources/test/intltest/rbbiapts.cpp | 245 +- icuSources/test/intltest/rbbiapts.h | 5 +- icuSources/test/intltest/rbbitst.cpp | 6442 +-- icuSources/test/intltest/rbbitst.h | 12 +- icuSources/test/intltest/regextst.cpp | 572 +- icuSources/test/intltest/regextst.h | 3 +- icuSources/test/intltest/restest.cpp | 125 +- icuSources/test/intltest/restest.h | 7 +- icuSources/test/intltest/restsnew.cpp | 44 +- icuSources/test/intltest/restsnew.h | 5 +- icuSources/test/intltest/sdtfmtts.cpp | 2 +- icuSources/test/intltest/sfwdchit.cpp | 8 +- icuSources/test/intltest/sfwdchit.h | 6 +- icuSources/test/intltest/srchtest.cpp | 49 +- icuSources/test/intltest/srchtest.h | 2 +- icuSources/test/intltest/strcase.cpp | 79 +- icuSources/test/intltest/strtest.cpp | 70 +- icuSources/test/intltest/strtest.h | 7 +- icuSources/test/intltest/svccoll.cpp | 180 +- icuSources/test/intltest/svccoll.h | 17 +- icuSources/test/intltest/tchcfmt.cpp | 58 +- icuSources/test/intltest/testidn.cpp | 526 +- icuSources/test/intltest/testidna.cpp | 588 +- icuSources/test/intltest/testidna.h | 24 +- icuSources/test/intltest/textfile.cpp | 179 + icuSources/test/intltest/textfile.h | 73 + icuSources/test/intltest/tfsmalls.cpp | 79 +- icuSources/test/intltest/thcoll.cpp | 271 +- icuSources/test/intltest/thcoll.h | 12 +- icuSources/test/intltest/tmsgfmt.cpp | 109 +- icuSources/test/intltest/tmsgfmt.h | 13 +- icuSources/test/intltest/tokiter.cpp | 107 + icuSources/test/intltest/tokiter.h | 71 + icuSources/test/intltest/transapi.cpp | 99 +- icuSources/test/intltest/transapi.h | 4 +- icuSources/test/intltest/transrt.cpp | 354 +- icuSources/test/intltest/transrt.h | 5 +- icuSources/test/intltest/transtst.cpp | 106 +- icuSources/test/intltest/transtst.h | 2 +- icuSources/test/intltest/trcoll.cpp | 21 +- icuSources/test/intltest/trnserr.cpp | 98 +- icuSources/test/intltest/trnserr.h | 6 +- icuSources/test/intltest/tscoll.cpp | 328 +- icuSources/test/intltest/tscoll.h | 4 - icuSources/test/intltest/tsdate.cpp | 14 +- icuSources/test/intltest/tsdate.h | 4 +- icuSources/test/intltest/tsdtfmsy.cpp | 2 +- icuSources/test/intltest/tsmthred.cpp | 1177 +- icuSources/test/intltest/tsmthred.h | 23 +- icuSources/test/intltest/tsmutex.cpp | 80 - icuSources/test/intltest/tsmutex.h | 42 - icuSources/test/intltest/tsnmfmt.cpp | 23 +- icuSources/test/intltest/tsnmfmt.h | 7 +- icuSources/test/intltest/tsputil.cpp | 396 +- icuSources/test/intltest/tsputil.h | 17 +- icuSources/test/intltest/tstnorm.cpp | 31 +- icuSources/test/intltest/tzbdtest.cpp | 17 +- icuSources/test/intltest/tzregts.cpp | 56 +- icuSources/test/intltest/tztest.cpp | 353 +- icuSources/test/intltest/tztest.h | 15 +- icuSources/test/intltest/ucaconf.cpp | 21 +- icuSources/test/intltest/ucaconf.h | 5 +- icuSources/test/intltest/ucdtest.cpp | 15 +- icuSources/test/intltest/ucdtest.h | 6 +- icuSources/test/intltest/ufltlgts.cpp | 247 - icuSources/test/intltest/ufltlgts.h | 68 - icuSources/test/intltest/unhxtrts.cpp | 515 - icuSources/test/intltest/unhxtrts.h | 71 - icuSources/test/intltest/uobjtest.cpp | 77 +- icuSources/test/intltest/uobjtest.h | 19 +- icuSources/test/intltest/usettest.cpp | 431 +- icuSources/test/intltest/usettest.h | 8 +- icuSources/test/intltest/ustrtest.cpp | 199 +- icuSources/test/intltest/ustrtest.h | 5 +- icuSources/test/intltest/v32test.cpp | 505 + icuSources/test/intltest/v32test.h | 32 + icuSources/test/iotest/Makefile.in | 19 +- icuSources/test/iotest/filetst.c | 1491 + icuSources/test/iotest/iotest.cpp | 2313 +- icuSources/test/iotest/iotest.dsp | 48 +- icuSources/test/iotest/iotest.dsw | 44 - icuSources/test/iotest/iotest.h | 36 + .../all.vcproj => test/iotest/iotest.vcproj} | 99 +- icuSources/test/iotest/strtst.c | 758 + .../test/letest/PortableFontInstance.cpp | 2 +- icuSources/test/letest/gendata.cpp | 14 +- icuSources/test/letest/letest.cpp | 12 +- icuSources/test/letest/testdata.cpp | 78 +- icuSources/test/perf/charperf/Makefile.in | 16 +- icuSources/test/perf/charperf/charperf.cpp | 13 +- icuSources/test/perf/charperf/charperf.h | 5 +- icuSources/test/perf/convperf/convperf.cpp | 653 + .../perf/convperf/convperf.dsp} | 44 +- icuSources/test/perf/convperf/convperf.h | 566 + .../test/perf/convperf/convperf_ansi.pl | 49 + icuSources/test/perf/convperf/convperf_iml.pl | 55 + icuSources/test/perf/convperf/data.h | 2731 ++ .../test/perf/perldriver/PerfFramework.pm | 22 +- icuSources/test/perf/ubrkperf/ubrkperf.dsp | 4 +- icuSources/test/perf/ubrkperf/ubrkperf20.dsp | 4 +- icuSources/test/perf/ubrkperf/ubrkperfold.dsp | 4 +- icuSources/test/perf/ustrperf/StringPerf.pl | 68 + icuSources/test/perf/ustrperf/stringperf.cpp | 375 + icuSources/test/perf/ustrperf/stringperf.h | 549 + .../test/perf/ustrperf/stringperf.vcproj | 182 + .../CollationTest_NON_IGNORABLE_STUB.txt | 5420 ++- .../testdata/CollationTest_SHIFTED_STUB.txt | 5139 ++- .../test/testdata/DataDrivenCollationTest.txt | 836 +- icuSources/test/testdata/Makefile.in | 177 +- .../test/testdata/NumberFormatTestCases.txt | 85 + icuSources/test/testdata/conversion.txt | 1001 + icuSources/test/testdata/default.goo | 16 - icuSources/test/testdata/icuio.txt | 135 + icuSources/test/testdata/idna_rules.txt | 2 +- icuSources/test/testdata/nfs4_cis_prep.txt | 1945 + icuSources/test/testdata/nfs4_cs_prep_ci.txt | 1902 + icuSources/test/testdata/nfs4_cs_prep_cs.txt | 522 + .../test/testdata/nfs4_mixed_prep_p.txt | 565 + .../test/testdata/nfs4_mixed_prep_s.txt | 1945 + icuSources/test/testdata/pkgdata.inc.in | 20 + icuSources/test/testdata/ra.txt | 125 + icuSources/test/testdata/rbbitst.txt | 112 +- icuSources/test/testdata/regextst.txt | 158 +- icuSources/test/testdata/riwords.txt | 32943 ++++++++++++++++ icuSources/test/testdata/structLocale.txt | 2922 ++ icuSources/test/testdata/te.txt | 8 +- icuSources/test/testdata/te_IN.goo | 17 - icuSources/test/testdata/test1.ucm | 7 +- icuSources/test/testdata/test3.ucm | 26 +- icuSources/test/testdata/test4.ucm | 33 +- icuSources/test/testdata/test4x.ucm | 20 + icuSources/test/testdata/testaliases.txt | 16 +- icuSources/test/testdata/testdata.mak | 136 + icuSources/test/testdata/testdata.mk | 73 - .../testdata/testdata_icu26_testtypes.res | Bin 0 -> 13944 bytes .../testdata/testdata_icu26e_testtypes.res | Bin 0 -> 13944 bytes icuSources/test/testdata/testtypes.txt | 6 +- icuSources/test/testdata/th18057.txt | 17919 --------- icuSources/test/testdata/translit_rules.txt | 6 +- icuSources/test/thaitest/thaitest.cpp | 2 +- icuSources/test/threadtest/converttest.cpp | 2 +- icuSources/test/threadtest/threadtest.cpp | 2 +- icuSources/test/threadtest/threadtest.dsp | 4 +- icuSources/test/usetperf/bitset.cpp | 4 +- icuSources/test/usetperf/bitset.h | 4 +- icuSources/test/usetperf/timer.h | 4 +- icuSources/test/usetperf/usetperf.cpp | 4 +- icuSources/test/usetperf/usetperf.dsp | 4 +- icuSources/test/utfperf/utfperf.dsp | 4 +- icuSources/tools/Makefile.in | 137 +- icuSources/tools/cpysearch/cpyscan.pl | 22 + icuSources/tools/cpysearch/cpysearch.pl | 25 +- icuSources/tools/cpysearch/cpyskip.txt | 76 + icuSources/tools/ctestfw/Makefile.in | 17 +- icuSources/tools/ctestfw/ctest.c | 85 +- icuSources/tools/ctestfw/ctestfw.dsp | 77 +- icuSources/tools/ctestfw/ctestfw.vcproj | 84 +- .../intltest => tools/ctestfw}/datamap.cpp | 94 +- .../intltest => tools/ctestfw}/testdata.cpp | 4 +- .../intltest => tools/ctestfw}/tstdtmod.cpp | 7 +- icuSources/tools/ctestfw/unicode/ctest.h | 128 +- .../ctestfw/unicode}/datamap.h | 68 +- .../ctestfw/unicode}/testdata.h | 14 +- icuSources/tools/ctestfw/unicode/testlog.h | 27 + icuSources/tools/ctestfw/unicode/testtype.h | 40 + .../ctestfw/unicode}/tstdtmod.h | 25 +- icuSources/tools/dumpce/dumpce.cpp | 3 +- icuSources/tools/genbrk/Makefile.in | 10 +- icuSources/tools/genbrk/genbrk.cpp | 84 +- icuSources/tools/genbrk/genbrk.dsp | 4 +- icuSources/tools/genbrk/genbrk.vcproj | 32 +- .../tools/{gentz => gencase}/Makefile.in | 34 +- icuSources/tools/gencase/gencase.8.in | 136 + icuSources/tools/gencase/gencase.c | 810 + .../{gentz/gentz.dsp => gencase/gencase.dsp} | 90 +- icuSources/tools/gencase/gencase.h | 89 + .../gencase/gencase.vcproj} | 126 +- icuSources/tools/gencase/store.c | 608 + icuSources/tools/genccode/Makefile.in | 16 +- icuSources/tools/genccode/genccode.8.in | 33 +- icuSources/tools/genccode/genccode.c | 360 +- icuSources/tools/genccode/genccode.dsp | 4 +- icuSources/tools/genccode/genccode.vcproj | 32 +- icuSources/tools/gencmn/Makefile.in | 23 +- icuSources/tools/gencmn/decmn.c | 3 +- icuSources/tools/gencmn/decmn.dsp | 4 +- icuSources/tools/gencmn/decmn.vcproj | 68 +- icuSources/tools/gencmn/gencmn.c | 222 +- icuSources/tools/gencmn/gencmn.dsp | 4 +- icuSources/tools/gencmn/gencmn.vcproj | 32 +- icuSources/tools/gencnval/Makefile.in | 36 +- icuSources/tools/gencnval/cnvalias.dat.5 | 3 - icuSources/tools/gencnval/convrtrs.txt.5.in | 131 - icuSources/tools/gencnval/gencnval.1.in | 25 +- icuSources/tools/gencnval/gencnval.c | 72 +- icuSources/tools/gencnval/gencnval.dsp | 4 +- icuSources/tools/gencnval/gencnval.vcproj | 32 +- icuSources/tools/gendraft/DeprecatedApi.txt | 225 + icuSources/tools/gendraft/DraftApi.txt | 372 + icuSources/tools/gendraft/ObsoleteApi.txt | 19 + icuSources/tools/gendraft/gendraft.pl | 172 + icuSources/tools/genidna/filterRFC3454.pl | 174 - icuSources/tools/genidna/genidna.c | 548 - icuSources/tools/genidna/store.c | 383 - icuSources/tools/gennames/Makefile.in | 22 +- icuSources/tools/gennames/gennames.c | 78 +- icuSources/tools/gennames/gennames.dsp | 4 +- icuSources/tools/gennames/gennames.vcproj | 32 +- icuSources/tools/gennorm/Makefile.in | 19 +- icuSources/tools/gennorm/gennorm.c | 75 +- icuSources/tools/gennorm/gennorm.dsp | 4 +- icuSources/tools/gennorm/gennorm.vcproj | 32 +- icuSources/tools/gennorm/store.c | 258 +- icuSources/tools/genpname/Makefile.in | 14 +- .../genpname/SyntheticPropertyAliases.txt | 14 +- icuSources/tools/genpname/data.h | 3245 +- icuSources/tools/genpname/genpname.cpp | 168 +- icuSources/tools/genpname/genpname.dsp | 4 +- icuSources/tools/genpname/genpname.vcproj | 35 +- icuSources/tools/genpname/preparse.pl | 37 +- icuSources/tools/genprops/Makefile.in | 21 +- icuSources/tools/genprops/genprops.c | 54 +- icuSources/tools/genprops/genprops.dsp | 28 +- icuSources/tools/genprops/genprops.h | 4 +- icuSources/tools/genprops/genprops.vcproj | 42 +- icuSources/tools/genprops/props2.c | 54 +- icuSources/tools/genprops/store.c | 28 +- icuSources/tools/genrb/Makefile.in | 24 +- icuSources/tools/genrb/derb.c | 70 +- icuSources/tools/genrb/derb.dsp | 4 +- icuSources/tools/genrb/derb.vcproj | 32 +- icuSources/tools/genrb/errmsg.c | 6 +- icuSources/tools/genrb/gendtjar.pl | 178 + icuSources/tools/genrb/genjp/README.txt | 7 - icuSources/tools/genrb/genjp/genjp.cpp | 1053 - icuSources/tools/genrb/genjp/genjp.dsw | 41 - icuSources/tools/genrb/genjp/genjp.h | 85 - icuSources/tools/genrb/genrb.c | 76 +- icuSources/tools/genrb/genrb.dsp | 12 +- icuSources/tools/genrb/genrb.vcproj | 38 +- icuSources/tools/genrb/genrbjar.pl | 49 +- icuSources/tools/genrb/parse.c | 446 +- icuSources/tools/genrb/prscmnts.cpp | 233 + icuSources/tools/genrb/prscmnts.h | 62 + icuSources/tools/genrb/read.c | 61 +- icuSources/tools/genrb/read.h | 3 +- icuSources/tools/genrb/reslist.c | 285 +- icuSources/tools/genrb/reslist.h | 33 +- icuSources/tools/genrb/rle.c | 32 +- icuSources/tools/genrb/ustr.c | 21 +- icuSources/tools/genrb/ustr.h | 7 +- icuSources/tools/genrb/util.c | 2 +- icuSources/tools/genrb/wrtjava.c | 144 +- icuSources/tools/genrb/wrtxml.c | 767 +- icuSources/tools/genren/Makefile | 12 +- icuSources/tools/genren/genren.pl | 4 +- .../tools/{genidna => gensprep}/Makefile.in | 25 +- icuSources/tools/gensprep/filterRFC3454.pl | 294 + .../genidna.8.in => gensprep/gensprep.8.in} | 18 +- icuSources/tools/gensprep/gensprep.c | 421 + .../genidna.dsp => gensprep/gensprep.dsp} | 64 +- .../genidna.h => gensprep/gensprep.h} | 25 +- .../gensprep.vcproj} | 56 +- icuSources/tools/gensprep/store.c | 681 + icuSources/tools/gentest/Makefile.in | 12 +- icuSources/tools/gentest/genres32.c | 101 + icuSources/tools/gentest/gentest.c | 49 +- icuSources/tools/gentest/gentest.dsp | 8 +- icuSources/tools/gentest/gentest.h | 14 + icuSources/tools/gentest/gentest.vcproj | 40 +- icuSources/tools/gentz/gentz.8.in | 73 - icuSources/tools/gentz/gentz.cpp | 848 - icuSources/tools/gentz/readme.txt | 114 - icuSources/tools/gentz/tz.bat | 17 - icuSources/tools/gentz/tz.default | 42 - icuSources/tools/gentz/tz.pl | 1598 - icuSources/tools/gentz/tzparse.pm | 328 - icuSources/tools/gentz/tzutil.pm | 238 - icuSources/tools/genuca/Makefile.in | 14 +- icuSources/tools/genuca/genuca.cpp | 260 +- icuSources/tools/genuca/genuca.dsp | 4 +- icuSources/tools/genuca/genuca.h | 3 +- icuSources/tools/genuca/genuca.vcproj | 32 +- icuSources/tools/icuswap/Makefile.in | 96 + icuSources/tools/icuswap/icuswap.cpp | 774 + .../icuswap/icuswap.dsp} | 109 +- .../gentz.vcproj => icuswap/icuswap.vcproj} | 118 +- icuSources/tools/makeconv/Makefile.in | 21 +- icuSources/tools/makeconv/gencnvex.c | 1059 + icuSources/tools/makeconv/genmbcs.c | 1236 +- icuSources/tools/makeconv/genmbcs.h | 25 +- icuSources/tools/makeconv/makeconv.c | 1123 +- icuSources/tools/makeconv/makeconv.dsp | 8 +- icuSources/tools/makeconv/makeconv.h | 34 +- icuSources/tools/makeconv/makeconv.vcproj | 35 +- icuSources/tools/makeconv/readme.htm | 99 - icuSources/tools/pkgdata/Makefile.in | 22 +- icuSources/tools/pkgdata/cmnmode.c | 10 +- icuSources/tools/pkgdata/dllmode.c | 77 +- icuSources/tools/pkgdata/filemode.c | 107 +- icuSources/tools/pkgdata/gmake.c | 221 - icuSources/tools/pkgdata/make.c | 444 + icuSources/tools/pkgdata/makefile.h | 11 +- icuSources/tools/pkgdata/nmake.c | 110 - icuSources/tools/pkgdata/pkgdata.1.in | 13 +- icuSources/tools/pkgdata/pkgdata.c | 446 +- icuSources/tools/pkgdata/pkgdata.dsp | 6 +- icuSources/tools/pkgdata/pkgdata.vcproj | 34 +- icuSources/tools/pkgdata/pkgtypes.c | 85 +- icuSources/tools/pkgdata/pkgtypes.h | 39 +- icuSources/tools/pkgdata/sttcmode.c | 54 +- icuSources/tools/pkgdata/winmode.c | 115 +- icuSources/tools/toolutil/Makefile.in | 25 +- .../tools/{genprops => toolutil}/propsvec.c | 103 +- .../tools/{genprops => toolutil}/propsvec.h | 27 +- icuSources/tools/toolutil/toolutil.c | 137 +- icuSources/tools/toolutil/toolutil.dsp | 32 +- icuSources/tools/toolutil/toolutil.h | 55 +- icuSources/tools/toolutil/toolutil.vcproj | 51 +- icuSources/tools/toolutil/ucbuf.c | 60 +- icuSources/tools/toolutil/ucbuf.h | 2 +- icuSources/tools/toolutil/ucm.c | 1177 + icuSources/tools/toolutil/ucm.h | 282 + icuSources/tools/toolutil/ucmpwrit.h | 11 +- icuSources/tools/toolutil/ucmstate.c | 1042 + icuSources/tools/toolutil/unewdata.c | 4 +- icuSources/tools/toolutil/uparse.c | 70 +- icuSources/tools/toolutil/uparse.h | 9 +- icuSources/tools/toolutil/uperf.cpp | 244 +- icuSources/tools/toolutil/uperf.h | 22 +- icuSources/tools/toolutil/utimer.h | 5 +- icuSources/tools/tzcode/patch-icu-tzcode | 475 + icuSources/tools/tzcode/readme.txt | 146 + icuSources/tools/{gentz => tzcode}/tz.alias | 16 +- icuSources/tools/tzcode/tz2icu.cpp | 1560 + icuSources/tools/tzcode/tz2icu.h | 43 + icudt26l.dat | Bin 8383736 -> 0 bytes makefile | 295 +- 1947 files changed, 463470 insertions(+), 223786 deletions(-) create mode 100644 ICU.plist delete mode 100644 icuSources/README.in delete mode 100644 icuSources/allinone/all/all.vcproj create mode 100644 icuSources/common/locbased.cpp create mode 100644 icuSources/common/locbased.h create mode 100644 icuSources/common/msvcres.h delete mode 100644 icuSources/common/mutex.cpp delete mode 100644 icuSources/common/nameprep.cpp delete mode 100644 icuSources/common/nameprep.h create mode 100644 icuSources/common/parsepos.cpp create mode 100644 icuSources/common/putilimp.h create mode 100644 icuSources/common/resbund_cnv.cpp create mode 100644 icuSources/common/ruleiter.cpp create mode 100644 icuSources/common/ruleiter.h delete mode 100644 icuSources/common/strprep.cpp delete mode 100644 icuSources/common/strprep.h delete mode 100644 icuSources/common/symtable.h create mode 100644 icuSources/common/uarrsort.c create mode 100644 icuSources/common/uarrsort.h create mode 100644 icuSources/common/ucase.c create mode 100644 icuSources/common/ucase.h create mode 100644 icuSources/common/ucnv_ext.c create mode 100644 icuSources/common/ucnv_ext.h create mode 100644 icuSources/common/ucnv_set.c create mode 100644 icuSources/common/ucnvdisp.c create mode 100644 icuSources/common/ucol_swp.c create mode 100644 icuSources/common/ucol_swp.h create mode 100644 icuSources/common/udataswp.c create mode 100644 icuSources/common/udataswp.h create mode 100644 icuSources/common/uinit.c create mode 100644 icuSources/common/uinvchar.c create mode 100644 icuSources/common/uinvchar.h create mode 100644 icuSources/common/ulocimp.h delete mode 100644 icuSources/common/umemstrm.c delete mode 100644 icuSources/common/umemstrm.h delete mode 100644 icuSources/common/unicode/pmacos.h delete mode 100644 icuSources/common/unicode/pos400.h create mode 100644 icuSources/common/unicode/symtable.h create mode 100644 icuSources/common/unicode/udeprctd.h create mode 100644 icuSources/common/unicode/udraft.h create mode 100644 icuSources/common/unicode/uobslete.h create mode 100644 icuSources/common/unicode/usprep.h create mode 100644 icuSources/common/unicode/utrace.h create mode 100644 icuSources/common/uniset_props.cpp create mode 100644 icuSources/common/unistr_case.cpp create mode 100644 icuSources/common/unistr_cnv.cpp create mode 100644 icuSources/common/unistr_props.cpp create mode 100644 icuSources/common/unormcmp.cpp create mode 100644 icuSources/common/ures_cnv.c create mode 100644 icuSources/common/uset_imp.h create mode 100644 icuSources/common/uset_props.cpp create mode 100644 icuSources/common/usprep.cpp create mode 100644 icuSources/common/ustack.cpp create mode 100644 icuSources/common/ustr_cnv.c create mode 100644 icuSources/common/ustr_cnv.h create mode 100644 icuSources/common/ustr_wcs.c create mode 100644 icuSources/common/utrace.c create mode 100644 icuSources/common/utracimp.h create mode 100644 icuSources/common/utypes.c create mode 100644 icuSources/config/mh-aix-gcc create mode 100644 icuSources/config/mh-beos create mode 100644 icuSources/config/mh-linux-va create mode 100644 icuSources/config/mh-mingw create mode 100644 icuSources/config/mh-mpras delete mode 100644 icuSources/data/README create mode 100644 icuSources/data/brkitr/brkfiles.mk create mode 100644 icuSources/data/brkitr/word_POSIX.txt create mode 100644 icuSources/data/brkitr/word_ja.txt create mode 100644 icuSources/data/coll/ar.txt create mode 100644 icuSources/data/coll/ar_AE.txt create mode 100644 icuSources/data/coll/ar_BH.txt create mode 100644 icuSources/data/coll/ar_DZ.txt create mode 100644 icuSources/data/coll/ar_EG.txt create mode 100644 icuSources/data/coll/ar_IN.txt create mode 100644 icuSources/data/coll/ar_IQ.txt create mode 100644 icuSources/data/coll/ar_JO.txt create mode 100644 icuSources/data/coll/ar_KW.txt create mode 100644 icuSources/data/coll/ar_LB.txt create mode 100644 icuSources/data/coll/ar_LY.txt create mode 100644 icuSources/data/coll/ar_MA.txt create mode 100644 icuSources/data/coll/ar_OM.txt create mode 100644 icuSources/data/coll/ar_QA.txt create mode 100644 icuSources/data/coll/ar_SA.txt create mode 100644 icuSources/data/coll/ar_SD.txt create mode 100644 icuSources/data/coll/ar_SY.txt create mode 100644 icuSources/data/coll/ar_TN.txt create mode 100644 icuSources/data/coll/ar_YE.txt create mode 100644 icuSources/data/coll/be.txt create mode 100644 icuSources/data/coll/be_BY.txt create mode 100644 icuSources/data/coll/bg.txt create mode 100644 icuSources/data/coll/bg_BG.txt create mode 100644 icuSources/data/coll/ca.txt create mode 100644 icuSources/data/coll/ca_ES.txt create mode 100644 icuSources/data/coll/colfiles.mk create mode 100644 icuSources/data/coll/collocal.mk create mode 100644 icuSources/data/coll/cs.txt create mode 100644 icuSources/data/coll/cs_CZ.txt create mode 100644 icuSources/data/coll/da.txt create mode 100644 icuSources/data/coll/da_DK.txt create mode 100644 icuSources/data/coll/de.txt create mode 100644 icuSources/data/coll/de_AT.txt create mode 100644 icuSources/data/coll/de_BE.txt create mode 100644 icuSources/data/coll/de_CH.txt create mode 100644 icuSources/data/coll/de_DE.txt create mode 100644 icuSources/data/coll/de_LU.txt create mode 100644 icuSources/data/coll/de__PHONEBOOK.txt create mode 100644 icuSources/data/coll/el.txt create mode 100644 icuSources/data/coll/el_GR.txt create mode 100644 icuSources/data/coll/en.txt create mode 100644 icuSources/data/coll/en_AU.txt create mode 100644 icuSources/data/coll/en_BE.txt create mode 100644 icuSources/data/coll/en_BW.txt create mode 100644 icuSources/data/coll/en_CA.txt create mode 100644 icuSources/data/coll/en_GB.txt create mode 100644 icuSources/data/coll/en_HK.txt create mode 100644 icuSources/data/coll/en_IE.txt create mode 100644 icuSources/data/coll/en_IN.txt create mode 100644 icuSources/data/coll/en_MT.txt create mode 100644 icuSources/data/coll/en_NZ.txt create mode 100644 icuSources/data/coll/en_PH.txt create mode 100644 icuSources/data/coll/en_SG.txt create mode 100644 icuSources/data/coll/en_US.txt create mode 100644 icuSources/data/coll/en_US_POSIX.txt create mode 100644 icuSources/data/coll/en_VI.txt create mode 100644 icuSources/data/coll/en_ZA.txt create mode 100644 icuSources/data/coll/en_ZW.txt create mode 100644 icuSources/data/coll/eo.txt create mode 100644 icuSources/data/coll/es.txt create mode 100644 icuSources/data/coll/es_AR.txt create mode 100644 icuSources/data/coll/es_BO.txt create mode 100644 icuSources/data/coll/es_CL.txt create mode 100644 icuSources/data/coll/es_CO.txt create mode 100644 icuSources/data/coll/es_CR.txt create mode 100644 icuSources/data/coll/es_DO.txt create mode 100644 icuSources/data/coll/es_EC.txt create mode 100644 icuSources/data/coll/es_ES.txt create mode 100644 icuSources/data/coll/es_GT.txt create mode 100644 icuSources/data/coll/es_HN.txt create mode 100644 icuSources/data/coll/es_MX.txt create mode 100644 icuSources/data/coll/es_NI.txt create mode 100644 icuSources/data/coll/es_PA.txt create mode 100644 icuSources/data/coll/es_PE.txt create mode 100644 icuSources/data/coll/es_PR.txt create mode 100644 icuSources/data/coll/es_PY.txt create mode 100644 icuSources/data/coll/es_SV.txt create mode 100644 icuSources/data/coll/es_US.txt create mode 100644 icuSources/data/coll/es_UY.txt create mode 100644 icuSources/data/coll/es_VE.txt create mode 100644 icuSources/data/coll/es__TRADITIONAL.txt create mode 100644 icuSources/data/coll/et.txt create mode 100644 icuSources/data/coll/et_EE.txt create mode 100644 icuSources/data/coll/fa.txt create mode 100644 icuSources/data/coll/fa_AF.txt create mode 100644 icuSources/data/coll/fa_IR.txt create mode 100644 icuSources/data/coll/fi.txt create mode 100644 icuSources/data/coll/fi_FI.txt create mode 100644 icuSources/data/coll/fo.txt create mode 100644 icuSources/data/coll/fo_FO.txt create mode 100644 icuSources/data/coll/fr.txt create mode 100644 icuSources/data/coll/fr_BE.txt create mode 100644 icuSources/data/coll/fr_CA.txt create mode 100644 icuSources/data/coll/fr_CH.txt create mode 100644 icuSources/data/coll/fr_FR.txt create mode 100644 icuSources/data/coll/fr_LU.txt create mode 100644 icuSources/data/coll/ga.txt create mode 100644 icuSources/data/coll/ga_IE.txt create mode 100644 icuSources/data/coll/gu.txt create mode 100644 icuSources/data/coll/gu_IN.txt create mode 100644 icuSources/data/coll/haw.txt create mode 100644 icuSources/data/coll/he.txt create mode 100644 icuSources/data/coll/he_IL.txt create mode 100644 icuSources/data/coll/hi.txt create mode 100644 icuSources/data/coll/hi_IN.txt create mode 100644 icuSources/data/coll/hi__DIRECT.txt create mode 100644 icuSources/data/coll/hr.txt create mode 100644 icuSources/data/coll/hr_HR.txt create mode 100644 icuSources/data/coll/hu.txt create mode 100644 icuSources/data/coll/hu_HU.txt create mode 100644 icuSources/data/coll/id.txt create mode 100644 icuSources/data/coll/id_ID.txt create mode 100644 icuSources/data/coll/is.txt create mode 100644 icuSources/data/coll/is_IS.txt create mode 100644 icuSources/data/coll/it.txt create mode 100644 icuSources/data/coll/it_CH.txt create mode 100644 icuSources/data/coll/it_IT.txt create mode 100644 icuSources/data/coll/ja.txt create mode 100644 icuSources/data/coll/ja_JP.txt create mode 100644 icuSources/data/coll/kk.txt create mode 100644 icuSources/data/coll/kk_KZ.txt create mode 100644 icuSources/data/coll/kl.txt create mode 100644 icuSources/data/coll/kl_GL.txt create mode 100644 icuSources/data/coll/kn.txt create mode 100644 icuSources/data/coll/kn_IN.txt create mode 100644 icuSources/data/coll/ko.txt create mode 100644 icuSources/data/coll/ko_KR.txt create mode 100644 icuSources/data/coll/lt.txt create mode 100644 icuSources/data/coll/lt_LT.txt create mode 100644 icuSources/data/coll/lv.txt create mode 100644 icuSources/data/coll/lv_LV.txt create mode 100644 icuSources/data/coll/mk.txt create mode 100644 icuSources/data/coll/mk_MK.txt create mode 100644 icuSources/data/coll/ml.txt create mode 100644 icuSources/data/coll/mr.txt create mode 100644 icuSources/data/coll/mr_IN.txt create mode 100644 icuSources/data/coll/ms.txt create mode 100644 icuSources/data/coll/ms_BN.txt create mode 100644 icuSources/data/coll/ms_MY.txt create mode 100644 icuSources/data/coll/mt.txt create mode 100644 icuSources/data/coll/mt_MT.txt create mode 100644 icuSources/data/coll/nb.txt create mode 100644 icuSources/data/coll/nb_NO.txt create mode 100644 icuSources/data/coll/nl.txt create mode 100644 icuSources/data/coll/nl_BE.txt create mode 100644 icuSources/data/coll/nl_NL.txt create mode 100644 icuSources/data/coll/nn.txt create mode 100644 icuSources/data/coll/nn_NO.txt create mode 100644 icuSources/data/coll/om.txt create mode 100644 icuSources/data/coll/om_ET.txt create mode 100644 icuSources/data/coll/om_KE.txt create mode 100644 icuSources/data/coll/or.txt create mode 100644 icuSources/data/coll/pa.txt create mode 100644 icuSources/data/coll/pa_IN.txt create mode 100644 icuSources/data/coll/pl.txt create mode 100644 icuSources/data/coll/pl_PL.txt create mode 100644 icuSources/data/coll/ps.txt create mode 100644 icuSources/data/coll/ps_AF.txt create mode 100644 icuSources/data/coll/pt.txt create mode 100644 icuSources/data/coll/pt_BR.txt create mode 100644 icuSources/data/coll/pt_PT.txt create mode 100644 icuSources/data/coll/ro.txt create mode 100644 icuSources/data/coll/ro_RO.txt create mode 100644 icuSources/data/coll/root.txt create mode 100644 icuSources/data/coll/ru.txt create mode 100644 icuSources/data/coll/ru_RU.txt create mode 100644 icuSources/data/coll/ru_UA.txt create mode 100644 icuSources/data/coll/sh.txt create mode 100644 icuSources/data/coll/sh_YU.txt create mode 100644 icuSources/data/coll/sk.txt create mode 100644 icuSources/data/coll/sk_SK.txt create mode 100644 icuSources/data/coll/sl.txt create mode 100644 icuSources/data/coll/sl_SI.txt create mode 100644 icuSources/data/coll/sq.txt create mode 100644 icuSources/data/coll/sq_AL.txt create mode 100644 icuSources/data/coll/sr.txt create mode 100644 icuSources/data/coll/sr_YU.txt create mode 100644 icuSources/data/coll/sv.txt create mode 100644 icuSources/data/coll/sv_FI.txt create mode 100644 icuSources/data/coll/sv_SE.txt create mode 100644 icuSources/data/coll/ta.txt create mode 100644 icuSources/data/coll/ta_IN.txt create mode 100644 icuSources/data/coll/te.txt create mode 100644 icuSources/data/coll/te_IN.txt create mode 100644 icuSources/data/coll/th.txt create mode 100644 icuSources/data/coll/th_TH.txt create mode 100644 icuSources/data/coll/tr.txt create mode 100644 icuSources/data/coll/tr_TR.txt create mode 100644 icuSources/data/coll/uk.txt create mode 100644 icuSources/data/coll/uk_UA.txt create mode 100644 icuSources/data/coll/vi.txt create mode 100644 icuSources/data/coll/vi_VN.txt create mode 100644 icuSources/data/coll/zh.txt create mode 100644 icuSources/data/coll/zh_CN.txt create mode 100644 icuSources/data/coll/zh_HK.txt create mode 100644 icuSources/data/coll/zh_Hant.txt create mode 100644 icuSources/data/coll/zh_MO.txt create mode 100644 icuSources/data/coll/zh_SG.txt create mode 100644 icuSources/data/coll/zh_TW.txt create mode 100644 icuSources/data/coll/zh_TW_STROKE.txt create mode 100644 icuSources/data/coll/zh__PINYIN.txt delete mode 100644 icuSources/data/locales/ca_ES_PREEURO.txt create mode 100644 icuSources/data/locales/cy.txt create mode 100644 icuSources/data/locales/cy_GB.txt delete mode 100644 icuSources/data/locales/de_AT_PREEURO.txt delete mode 100644 icuSources/data/locales/de_LU_PREEURO.txt delete mode 100644 icuSources/data/locales/de__PHONEBOOK.txt delete mode 100644 icuSources/data/locales/el_GR_PREEURO.txt delete mode 100644 icuSources/data/locales/en_BE_PREEURO.txt delete mode 100644 icuSources/data/locales/en_GB_EURO.txt create mode 100644 icuSources/data/locales/en_PK.txt delete mode 100644 icuSources/data/locales/es_ES_PREEURO.txt delete mode 100644 icuSources/data/locales/es__TRADITIONAL.txt delete mode 100644 icuSources/data/locales/eu_ES_PREEURO.txt create mode 100644 icuSources/data/locales/fa_AF.txt delete mode 100644 icuSources/data/locales/fa_IN.txt delete mode 100644 icuSources/data/locales/fi_FI_PREEURO.txt delete mode 100644 icuSources/data/locales/fr_BE_PREEURO.txt delete mode 100644 icuSources/data/locales/fr_FR_PREEURO.txt delete mode 100644 icuSources/data/locales/fr_LU_PREEURO.txt delete mode 100644 icuSources/data/locales/ga_IE_PREEURO.txt delete mode 100644 icuSources/data/locales/gl_ES_PREEURO.txt delete mode 100644 icuSources/data/locales/hi__DIRECT.txt create mode 100644 icuSources/data/locales/in.txt create mode 100644 icuSources/data/locales/in_ID.txt delete mode 100644 icuSources/data/locales/it_IT_PREEURO.txt create mode 100644 icuSources/data/locales/kk.txt create mode 100644 icuSources/data/locales/kk_KZ.txt create mode 100644 icuSources/data/locales/ml.txt create mode 100644 icuSources/data/locales/ml_IN.txt create mode 100644 icuSources/data/locales/ms.txt create mode 100644 icuSources/data/locales/ms_BN.txt create mode 100644 icuSources/data/locales/ms_MY.txt delete mode 100644 icuSources/data/locales/nl_BE_PREEURO.txt delete mode 100644 icuSources/data/locales/nl_NL_PREEURO.txt create mode 100644 icuSources/data/locales/or.txt create mode 100644 icuSources/data/locales/or_IN.txt create mode 100644 icuSources/data/locales/pa.txt create mode 100644 icuSources/data/locales/pa_IN.txt create mode 100644 icuSources/data/locales/ps.txt create mode 100644 icuSources/data/locales/ps_AF.txt delete mode 100644 icuSources/data/locales/pt_PT_PREEURO.txt create mode 100644 icuSources/data/locales/reslocal.mk create mode 100644 icuSources/data/locales/sr_Cyrl.txt create mode 100644 icuSources/data/locales/sr_Cyrl_YU.txt create mode 100644 icuSources/data/locales/sr_Latn.txt create mode 100644 icuSources/data/locales/sr_Latn_YU.txt create mode 100644 icuSources/data/locales/zh_Hans.txt create mode 100644 icuSources/data/locales/zh_Hans_CN.txt create mode 100644 icuSources/data/locales/zh_Hans_SG.txt create mode 100644 icuSources/data/locales/zh_Hant.txt create mode 100644 icuSources/data/locales/zh_Hant_HK.txt create mode 100644 icuSources/data/locales/zh_Hant_MO.txt create mode 100644 icuSources/data/locales/zh_Hant_TW.txt delete mode 100644 icuSources/data/locales/zh_TW_STROKE.txt delete mode 100644 icuSources/data/locales/zh__PINYIN.txt delete mode 100644 icuSources/data/makedata.bat create mode 100644 icuSources/data/mappings/ibm-1168_P100-2002.ucm create mode 100644 icuSources/data/mappings/ibm-1375_P100-2003.ucm rename icuSources/data/mappings/{ibm-1390_P100-1999.ucm => ibm-1390_P110-2003.ucm} (94%) rename icuSources/data/mappings/{ibm-1399_P100-1999.ucm => ibm-1399_P110-2003.ucm} (94%) rename icuSources/data/mappings/{ibm-16684_P100-1999.ucm => ibm-16684_P110-2003.ucm} (94%) create mode 100644 icuSources/data/mappings/ibm-737_P100-1997.ucm create mode 100644 icuSources/data/mappings/ibm-775_P100-1996.ucm rename icuSources/data/mappings/{ibm-8482.ucm => ibm-8482_P100-1999.ucm} (94%) create mode 100644 icuSources/data/mappings/ibm-897_P100-1995.ucm rename icuSources/data/mappings/{ibm-943_P14A-1999.ucm => ibm-943_P15A-2003.ucm} (98%) create mode 100644 icuSources/data/mappings/ibm-9447_P100-2002.ucm create mode 100644 icuSources/data/mappings/ibm-9449_P100-2002.ucm create mode 100644 icuSources/data/mappings/ibm-954_P101-2000.ucm create mode 100644 icuSources/data/mappings/ibm-971_P100-1995.ucm create mode 100644 icuSources/data/mappings/iso-8859_10-1998.ucm create mode 100644 icuSources/data/mappings/iso-8859_16-2001.ucm delete mode 100644 icuSources/data/mappings/jisx-201.ucm rename icuSources/data/mappings/{ibm-1275_P100-1995.ucm => macos-0_2-10.2.ucm} (69%) rename icuSources/data/mappings/{macos-2566-10_2.ucm => macos-2566-10.2.ucm} (99%) rename icuSources/data/mappings/{ibm-1282_P100-1996.ucm => macos-29-10.2.ucm} (70%) rename icuSources/data/mappings/{ibm-1281_P100-1996.ucm => macos-35-10.2.ucm} (70%) rename icuSources/data/mappings/{ibm-1280_P100-1996.ucm => macos-6-10.2.ucm} (70%) rename icuSources/data/mappings/{ibm-1283_P100-1996.ucm => macos-7_3-10.2.ucm} (70%) create mode 100644 icuSources/data/mappings/ucmlocal.mk create mode 100644 icuSources/data/mappings/windows-1256-2000.ucm create mode 100644 icuSources/data/mappings/windows-874-2000.ucm create mode 100644 icuSources/data/mappings/windows-936-2000.ucm create mode 100644 icuSources/data/mappings/windows-949-2000.ucm create mode 100644 icuSources/data/mappings/windows-950-2000.ucm create mode 100644 icuSources/data/misc/CurrencyData.txt create mode 100644 icuSources/data/misc/NamePrepProfile.txt create mode 100644 icuSources/data/misc/miscfiles.mk delete mode 100644 icuSources/data/misc/rfc3454_A_1.txt delete mode 100644 icuSources/data/misc/rfc3454_B_1.txt delete mode 100644 icuSources/data/misc/rfc3454_B_2.txt delete mode 100644 icuSources/data/misc/rfc3454_C_X.txt delete mode 100644 icuSources/data/misc/timezone.txt create mode 100644 icuSources/data/misc/zoneinfo.txt delete mode 100644 icuSources/data/mkdll.lk delete mode 100644 icuSources/data/mkobj.cl create mode 100644 icuSources/data/rbnf/da.txt create mode 100644 icuSources/data/rbnf/de.txt create mode 100644 icuSources/data/rbnf/el.txt create mode 100644 icuSources/data/rbnf/en.txt create mode 100644 icuSources/data/rbnf/en_GB.txt create mode 100644 icuSources/data/rbnf/eo.txt create mode 100644 icuSources/data/rbnf/es.txt create mode 100644 icuSources/data/rbnf/fa.txt create mode 100644 icuSources/data/rbnf/fa_AF.txt create mode 100644 icuSources/data/rbnf/fr.txt rename icuSources/data/{locales/en_IE_PREEURO.txt => rbnf/fr_BE.txt} (50%) create mode 100644 icuSources/data/rbnf/fr_CH.txt create mode 100644 icuSources/data/rbnf/ga.txt create mode 100644 icuSources/data/rbnf/he.txt create mode 100644 icuSources/data/rbnf/it.txt create mode 100644 icuSources/data/rbnf/ja.txt create mode 100644 icuSources/data/rbnf/mt.txt create mode 100644 icuSources/data/rbnf/nl.txt create mode 100644 icuSources/data/rbnf/pl.txt create mode 100644 icuSources/data/rbnf/pt.txt create mode 100644 icuSources/data/rbnf/rbnffiles.mk create mode 100644 icuSources/data/rbnf/root.txt create mode 100644 icuSources/data/rbnf/ru.txt create mode 100644 icuSources/data/rbnf/sv.txt create mode 100644 icuSources/data/rbnf/th.txt create mode 100644 icuSources/data/rbnf/uk.txt create mode 100644 icuSources/data/translit/Any_Accents.txt create mode 100644 icuSources/data/translit/Any_Publishing.txt create mode 100644 icuSources/data/translit/Arabic_Latin.txt create mode 100644 icuSources/data/translit/Bengali_InterIndic.txt create mode 100644 icuSources/data/translit/Cyrillic_Latin.txt create mode 100644 icuSources/data/translit/Devanagari_InterIndic.txt create mode 100644 icuSources/data/translit/Fullwidth_Halfwidth.txt create mode 100644 icuSources/data/translit/Greek_Latin.txt create mode 100644 icuSources/data/translit/Greek_Latin_UNGEGN.txt create mode 100644 icuSources/data/translit/Gujarati_InterIndic.txt create mode 100644 icuSources/data/translit/Gurmukhi_InterIndic.txt create mode 100644 icuSources/data/translit/Han_Latin.txt create mode 100644 icuSources/data/translit/Han_Spacedhan.txt create mode 100644 icuSources/data/translit/Hebrew_Latin.txt create mode 100644 icuSources/data/translit/Hiragana_Katakana.txt create mode 100644 icuSources/data/translit/Hiragana_Latin.txt create mode 100644 icuSources/data/translit/InterIndic_Bengali.txt create mode 100644 icuSources/data/translit/InterIndic_Devanagari.txt create mode 100644 icuSources/data/translit/InterIndic_Gujarati.txt create mode 100644 icuSources/data/translit/InterIndic_Gurmukhi.txt create mode 100644 icuSources/data/translit/InterIndic_Kannada.txt create mode 100644 icuSources/data/translit/InterIndic_Latin.txt create mode 100644 icuSources/data/translit/InterIndic_Malayalam.txt create mode 100644 icuSources/data/translit/InterIndic_Oriya.txt create mode 100644 icuSources/data/translit/InterIndic_Tamil.txt create mode 100644 icuSources/data/translit/InterIndic_Telugu.txt create mode 100644 icuSources/data/translit/Kannada_InterIndic.txt create mode 100644 icuSources/data/translit/Latin_InterIndic.txt create mode 100644 icuSources/data/translit/Latin_Jamo.txt create mode 100644 icuSources/data/translit/Latin_Katakana.txt create mode 100644 icuSources/data/translit/Latin_NumericPinyin.txt create mode 100644 icuSources/data/translit/Malayalam_InterIndic.txt create mode 100644 icuSources/data/translit/Oriya_InterIndic.txt create mode 100644 icuSources/data/translit/Tamil_InterIndic.txt create mode 100644 icuSources/data/translit/Telugu_InterIndic.txt create mode 100644 icuSources/data/translit/ThaiLogical_Latin.txt create mode 100644 icuSources/data/translit/Thai_ThaiLogical.txt create mode 100644 icuSources/data/translit/Thai_ThaiSemi.txt create mode 100644 icuSources/data/translit/Tone_Digit.txt rename icuSources/data/{locales/de_DE_PREEURO.txt => translit/el.txt} (59%) create mode 100644 icuSources/data/translit/en.txt create mode 100644 icuSources/data/translit/root.txt delete mode 100644 icuSources/data/translit/t_Any_Accents.txt delete mode 100644 icuSources/data/translit/t_Any_Publishing.txt delete mode 100644 icuSources/data/translit/t_Arab_Latn.txt delete mode 100644 icuSources/data/translit/t_Beng_InterIndic.txt delete mode 100644 icuSources/data/translit/t_Cyrl_Latn.txt delete mode 100644 icuSources/data/translit/t_Deva_InterIndic.txt delete mode 100644 icuSources/data/translit/t_FWidth_HWidth.txt delete mode 100644 icuSources/data/translit/t_Grek_Latn.txt delete mode 100644 icuSources/data/translit/t_Grek_Latn_UNGEGN.txt delete mode 100644 icuSources/data/translit/t_Gujr_InterIndic.txt delete mode 100644 icuSources/data/translit/t_Guru_InterIndic.txt delete mode 100644 icuSources/data/translit/t_Hani_Latn.txt delete mode 100644 icuSources/data/translit/t_Hebr_Latn.txt delete mode 100644 icuSources/data/translit/t_Hira_Kana.txt delete mode 100644 icuSources/data/translit/t_Hira_Latn.txt delete mode 100644 icuSources/data/translit/t_InterIndic_Beng.txt delete mode 100644 icuSources/data/translit/t_InterIndic_Deva.txt delete mode 100644 icuSources/data/translit/t_InterIndic_Gujr.txt delete mode 100644 icuSources/data/translit/t_InterIndic_Guru.txt delete mode 100644 icuSources/data/translit/t_InterIndic_Knda.txt delete mode 100644 icuSources/data/translit/t_InterIndic_Latn.txt delete mode 100644 icuSources/data/translit/t_InterIndic_Mlym.txt delete mode 100644 icuSources/data/translit/t_InterIndic_Orya.txt delete mode 100644 icuSources/data/translit/t_InterIndic_Taml.txt delete mode 100644 icuSources/data/translit/t_InterIndic_Telu.txt delete mode 100644 icuSources/data/translit/t_Knda_InterIndic.txt delete mode 100644 icuSources/data/translit/t_Latn_InterIndic.txt delete mode 100644 icuSources/data/translit/t_Latn_Jamo.txt delete mode 100644 icuSources/data/translit/t_Latn_Kana.txt delete mode 100644 icuSources/data/translit/t_Mlym_InterIndic.txt delete mode 100644 icuSources/data/translit/t_Orya_InterIndic.txt delete mode 100644 icuSources/data/translit/t_Taml_InterIndic.txt delete mode 100644 icuSources/data/translit/t_Telu_InterIndic.txt delete mode 100644 icuSources/data/translit/translit_index.txt create mode 100644 icuSources/data/unidata/changes.txt delete mode 100644 icuSources/extra/uconv/uconv.dsw delete mode 100644 icuSources/extra/ustdio/locbund.c delete mode 100644 icuSources/extra/ustdio/locbund.h delete mode 100644 icuSources/extra/ustdio/loccache.c delete mode 100644 icuSources/extra/ustdio/sprintf.c delete mode 100644 icuSources/extra/ustdio/sprintf.h delete mode 100644 icuSources/extra/ustdio/sprntf_p.c delete mode 100644 icuSources/extra/ustdio/sprntf_p.h delete mode 100644 icuSources/extra/ustdio/sscanf.c delete mode 100644 icuSources/extra/ustdio/sscanf.h delete mode 100644 icuSources/extra/ustdio/sscanf_p.c delete mode 100644 icuSources/extra/ustdio/sscanf_p.h delete mode 100644 icuSources/extra/ustdio/ufile.h delete mode 100644 icuSources/extra/ustdio/uprintf.c delete mode 100644 icuSources/extra/ustdio/uprintf.h delete mode 100644 icuSources/extra/ustdio/uprntf_p.c delete mode 100644 icuSources/extra/ustdio/uprntf_p.h delete mode 100644 icuSources/extra/ustdio/uscanf.c delete mode 100644 icuSources/extra/ustdio/uscanf.h delete mode 100644 icuSources/extra/ustdio/uscanf_p.c delete mode 100644 icuSources/extra/ustdio/uscanf_p.h delete mode 100644 icuSources/extra/ustdio/uscanset.c delete mode 100644 icuSources/extra/ustdio/uscanset.h delete mode 100644 icuSources/extra/ustdio/ustdio.dsw delete mode 100644 icuSources/extra/ustdio/ustream.cpp create mode 100644 icuSources/i18n/astro.cpp create mode 100644 icuSources/i18n/astro.h create mode 100644 icuSources/i18n/casetrn.cpp create mode 100644 icuSources/i18n/casetrn.h create mode 100644 icuSources/i18n/chnsecal.cpp create mode 100644 icuSources/i18n/chnsecal.h create mode 100644 icuSources/i18n/curramt.cpp create mode 100644 icuSources/i18n/currfmt.cpp create mode 100644 icuSources/i18n/currfmt.h create mode 100644 icuSources/i18n/currunit.cpp rename icuSources/{common => i18n}/digitlst.cpp (78%) rename icuSources/{common => i18n}/digitlst.h (83%) create mode 100644 icuSources/i18n/gregoimp.cpp create mode 100644 icuSources/i18n/gregoimp.h create mode 100644 icuSources/i18n/hebrwcal.cpp create mode 100644 icuSources/i18n/hebrwcal.h delete mode 100644 icuSources/i18n/hextouni.cpp delete mode 100644 icuSources/i18n/hextouni.h create mode 100644 icuSources/i18n/islamcal.cpp create mode 100644 icuSources/i18n/islamcal.h create mode 100644 icuSources/i18n/measfmt.cpp create mode 100644 icuSources/i18n/measure.cpp create mode 100644 icuSources/i18n/olsontz.cpp create mode 100644 icuSources/i18n/olsontz.h delete mode 100644 icuSources/i18n/tzdat.h create mode 100644 icuSources/i18n/ucol_sit.cpp create mode 100644 icuSources/i18n/ucurrimp.h create mode 100644 icuSources/i18n/ulocdata.c create mode 100644 icuSources/i18n/unicode/curramt.h create mode 100644 icuSources/i18n/unicode/currunit.h create mode 100644 icuSources/i18n/unicode/measfmt.h create mode 100644 icuSources/i18n/unicode/measunit.h create mode 100644 icuSources/i18n/unicode/measure.h create mode 100644 icuSources/i18n/unicode/ulocdata.h delete mode 100644 icuSources/i18n/unicode/unifltlg.h create mode 100644 icuSources/i18n/unicode/uregex.h create mode 100644 icuSources/i18n/unicode/utmscale.h delete mode 100644 icuSources/i18n/unifltlg.cpp delete mode 100644 icuSources/i18n/unitohex.cpp delete mode 100644 icuSources/i18n/unitohex.h create mode 100644 icuSources/i18n/uregex.cpp create mode 100644 icuSources/i18n/utmscale.c rename icuSources/{extra/ustdio => io}/Makefile.in (65%) rename icuSources/{extra/ustdio/ustdio.dsp => io/io.dsp} (57%) rename icuSources/{extra/ustdio/ustdio.rc => io/io.rc} (75%) rename icuSources/{extra/ustdio/ustdio.vcproj => io/io.vcproj} (66%) create mode 100644 icuSources/io/locbund.c create mode 100644 icuSources/io/locbund.h create mode 100644 icuSources/io/sprintf.c create mode 100644 icuSources/io/sscanf.c rename icuSources/{extra/ustdio => io}/ufile.c (52%) create mode 100644 icuSources/io/ufile.h rename icuSources/{extra/ustdio => io}/ufmt_cmn.c (63%) rename icuSources/{extra/ustdio => io}/ufmt_cmn.h (58%) rename icuSources/{extra/ustdio => io}/unicode/ustdio.h (66%) rename icuSources/{extra/ustdio => io}/unicode/ustream.h (67%) create mode 100644 icuSources/io/uprintf.c create mode 100644 icuSources/io/uprintf.h create mode 100644 icuSources/io/uprntf_p.c create mode 100644 icuSources/io/uscanf.c rename icuSources/{extra/ustdio/loccache.h => io/uscanf.h} (51%) create mode 100644 icuSources/io/uscanf_p.c rename icuSources/{extra/ustdio => io}/ustdio.c (60%) create mode 100644 icuSources/io/ustream.cpp delete mode 100644 icuSources/layout/ArabicLigatureData.cpp create mode 100644 icuSources/layout/CanonData.cpp create mode 100644 icuSources/layout/CanonShaping.h create mode 100644 icuSources/layout/CharSubstitutionFilter.h create mode 100644 icuSources/layout/GlyphLookupTables.cpp create mode 100644 icuSources/layout/GlyphLookupTables.h delete mode 100644 icuSources/layout/HebrewLigatureData.cpp delete mode 100644 icuSources/layout/HebrewShaping.cpp delete mode 100644 icuSources/layout/HebrewShaping.h create mode 100644 icuSources/layout/LEGlyphStorage.cpp create mode 100644 icuSources/layout/LEGlyphStorage.h create mode 100644 icuSources/layout/LEInsertionList.cpp create mode 100644 icuSources/layout/LEInsertionList.h delete mode 100644 icuSources/layout/layout.dsw delete mode 100644 icuSources/layout/layoutobj.inc delete mode 100644 icuSources/layoutex/Utilities.cpp delete mode 100644 icuSources/layoutex/Utilities.h create mode 100644 icuSources/samples/citer/citer.cpp create mode 100644 icuSources/samples/citer/readme.txt create mode 100644 icuSources/samples/datecal/Makefile create mode 100644 icuSources/samples/datecal/cal.cpp create mode 100644 icuSources/samples/datecal/ccal.c create mode 100644 icuSources/samples/ucnv/data02.bin delete mode 100644 icuSources/samples/xml2txt/ChildName.cpp delete mode 100644 icuSources/samples/xml2txt/ChildName.h delete mode 100644 icuSources/samples/xml2txt/DOMPrintFormatTarget.cpp delete mode 100644 icuSources/samples/xml2txt/DOMPrintFormatTarget.h delete mode 100644 icuSources/samples/xml2txt/DOMTreeErrorReporter.cpp delete mode 100644 icuSources/samples/xml2txt/DOMTreeErrorReporter.hpp delete mode 100644 icuSources/samples/xml2txt/xml2res.pl delete mode 100644 icuSources/samples/xml2txt/xml2txt.cpp delete mode 100644 icuSources/samples/xml2txt/xml2txt.dsp delete mode 100644 icuSources/samples/xml2txt/xml2txt.h delete mode 100644 icuSources/samples/xml2txt/xml2txt.plg create mode 100644 icuSources/test/cintltst/cldrtest.c create mode 100644 icuSources/test/cintltst/cucdapi.h create mode 100644 icuSources/test/cintltst/hpmufn.c create mode 100644 icuSources/test/cintltst/idnatest.c delete mode 100644 icuSources/test/cintltst/mstrmtst.c create mode 100644 icuSources/test/cintltst/nfsprep.c create mode 100644 icuSources/test/cintltst/nfsprep.h create mode 100644 icuSources/test/cintltst/reapits.c create mode 100644 icuSources/test/cintltst/sorttest.c create mode 100644 icuSources/test/cintltst/spreptst.c create mode 100644 icuSources/test/cintltst/sprpdata.c create mode 100644 icuSources/test/cintltst/tracetst.c create mode 100644 icuSources/test/cintltst/utmstest.c delete mode 100644 icuSources/test/hdrtst/Makefile create mode 100644 icuSources/test/hdrtst/Makefile.in create mode 100644 icuSources/test/hdrtst/pfiles.txt delete mode 100644 icuSources/test/ieeetest/Makefile.in delete mode 100644 icuSources/test/ieeetest/ieeetest.cpp delete mode 100644 icuSources/test/ieeetest/ieeetest.h create mode 100644 icuSources/test/intltest/astrotst.cpp create mode 100644 icuSources/test/intltest/astrotst.h create mode 100644 icuSources/test/intltest/calcasts.cpp create mode 100644 icuSources/test/intltest/calcasts.h create mode 100644 icuSources/test/intltest/convtest.cpp create mode 100644 icuSources/test/intltest/convtest.h delete mode 100644 icuSources/test/intltest/cpputils.cpp delete mode 100644 icuSources/test/intltest/cpputils.h delete mode 100644 icuSources/test/intltest/cputilst.cpp delete mode 100644 icuSources/test/intltest/cputilst.h delete mode 100644 icuSources/test/intltest/hxuntrts.cpp delete mode 100644 icuSources/test/intltest/hxuntrts.h create mode 100644 icuSources/test/intltest/itrbnfp.cpp create mode 100644 icuSources/test/intltest/itrbnfp.h create mode 100644 icuSources/test/intltest/textfile.cpp create mode 100644 icuSources/test/intltest/textfile.h create mode 100644 icuSources/test/intltest/tokiter.cpp create mode 100644 icuSources/test/intltest/tokiter.h delete mode 100644 icuSources/test/intltest/tsmutex.cpp delete mode 100644 icuSources/test/intltest/tsmutex.h delete mode 100644 icuSources/test/intltest/ufltlgts.cpp delete mode 100644 icuSources/test/intltest/ufltlgts.h delete mode 100644 icuSources/test/intltest/unhxtrts.cpp delete mode 100644 icuSources/test/intltest/unhxtrts.h create mode 100644 icuSources/test/intltest/v32test.cpp create mode 100644 icuSources/test/intltest/v32test.h create mode 100644 icuSources/test/iotest/filetst.c delete mode 100644 icuSources/test/iotest/iotest.dsw create mode 100644 icuSources/test/iotest/iotest.h rename icuSources/{samples/all/all.vcproj => test/iotest/iotest.vcproj} (51%) create mode 100644 icuSources/test/iotest/strtst.c create mode 100644 icuSources/test/perf/convperf/convperf.cpp rename icuSources/{tools/genrb/genjp/genjp.dsp => test/perf/convperf/convperf.dsp} (53%) create mode 100644 icuSources/test/perf/convperf/convperf.h create mode 100644 icuSources/test/perf/convperf/convperf_ansi.pl create mode 100644 icuSources/test/perf/convperf/convperf_iml.pl create mode 100644 icuSources/test/perf/convperf/data.h create mode 100644 icuSources/test/perf/ustrperf/StringPerf.pl create mode 100644 icuSources/test/perf/ustrperf/stringperf.cpp create mode 100644 icuSources/test/perf/ustrperf/stringperf.h create mode 100644 icuSources/test/perf/ustrperf/stringperf.vcproj create mode 100644 icuSources/test/testdata/NumberFormatTestCases.txt create mode 100644 icuSources/test/testdata/conversion.txt delete mode 100644 icuSources/test/testdata/default.goo create mode 100644 icuSources/test/testdata/icuio.txt create mode 100644 icuSources/test/testdata/nfs4_cis_prep.txt create mode 100644 icuSources/test/testdata/nfs4_cs_prep_ci.txt create mode 100644 icuSources/test/testdata/nfs4_cs_prep_cs.txt create mode 100644 icuSources/test/testdata/nfs4_mixed_prep_p.txt create mode 100644 icuSources/test/testdata/nfs4_mixed_prep_s.txt create mode 100644 icuSources/test/testdata/pkgdata.inc.in create mode 100644 icuSources/test/testdata/ra.txt create mode 100644 icuSources/test/testdata/riwords.txt create mode 100644 icuSources/test/testdata/structLocale.txt delete mode 100644 icuSources/test/testdata/te_IN.goo create mode 100644 icuSources/test/testdata/test4x.ucm create mode 100644 icuSources/test/testdata/testdata.mak delete mode 100644 icuSources/test/testdata/testdata.mk create mode 100644 icuSources/test/testdata/testdata_icu26_testtypes.res create mode 100644 icuSources/test/testdata/testdata_icu26e_testtypes.res delete mode 100644 icuSources/test/testdata/th18057.txt create mode 100644 icuSources/tools/cpysearch/cpyscan.pl create mode 100644 icuSources/tools/cpysearch/cpyskip.txt rename icuSources/{test/intltest => tools/ctestfw}/datamap.cpp (67%) rename icuSources/{test/intltest => tools/ctestfw}/testdata.cpp (96%) rename icuSources/{test/intltest => tools/ctestfw}/tstdtmod.cpp (95%) rename icuSources/{test/intltest => tools/ctestfw/unicode}/datamap.h (54%) rename icuSources/{test/intltest => tools/ctestfw/unicode}/testdata.h (93%) create mode 100644 icuSources/tools/ctestfw/unicode/testlog.h create mode 100644 icuSources/tools/ctestfw/unicode/testtype.h rename icuSources/{test/intltest => tools/ctestfw/unicode}/tstdtmod.h (87%) rename icuSources/tools/{gentz => gencase}/Makefile.in (76%) create mode 100644 icuSources/tools/gencase/gencase.8.in create mode 100644 icuSources/tools/gencase/gencase.c rename icuSources/tools/{gentz/gentz.dsp => gencase/gencase.dsp} (69%) create mode 100644 icuSources/tools/gencase/gencase.h rename icuSources/{test/ieeetest/ieeetest.vcproj => tools/gencase/gencase.vcproj} (67%) create mode 100644 icuSources/tools/gencase/store.c delete mode 100644 icuSources/tools/gencnval/cnvalias.dat.5 delete mode 100644 icuSources/tools/gencnval/convrtrs.txt.5.in create mode 100644 icuSources/tools/gendraft/DeprecatedApi.txt create mode 100644 icuSources/tools/gendraft/DraftApi.txt create mode 100644 icuSources/tools/gendraft/ObsoleteApi.txt create mode 100644 icuSources/tools/gendraft/gendraft.pl delete mode 100644 icuSources/tools/genidna/filterRFC3454.pl delete mode 100644 icuSources/tools/genidna/genidna.c delete mode 100644 icuSources/tools/genidna/store.c create mode 100644 icuSources/tools/genrb/gendtjar.pl delete mode 100644 icuSources/tools/genrb/genjp/README.txt delete mode 100644 icuSources/tools/genrb/genjp/genjp.cpp delete mode 100644 icuSources/tools/genrb/genjp/genjp.dsw delete mode 100644 icuSources/tools/genrb/genjp/genjp.h create mode 100644 icuSources/tools/genrb/prscmnts.cpp create mode 100644 icuSources/tools/genrb/prscmnts.h rename icuSources/tools/{genidna => gensprep}/Makefile.in (78%) create mode 100644 icuSources/tools/gensprep/filterRFC3454.pl rename icuSources/tools/{genidna/genidna.8.in => gensprep/gensprep.8.in} (89%) create mode 100644 icuSources/tools/gensprep/gensprep.c rename icuSources/tools/{genidna/genidna.dsp => gensprep/gensprep.dsp} (82%) rename icuSources/tools/{genidna/genidna.h => gensprep/gensprep.h} (69%) rename icuSources/tools/{genidna/genidna.vcproj => gensprep/gensprep.vcproj} (72%) create mode 100644 icuSources/tools/gensprep/store.c create mode 100644 icuSources/tools/gentest/genres32.c create mode 100644 icuSources/tools/gentest/gentest.h delete mode 100644 icuSources/tools/gentz/gentz.8.in delete mode 100644 icuSources/tools/gentz/gentz.cpp delete mode 100644 icuSources/tools/gentz/readme.txt delete mode 100644 icuSources/tools/gentz/tz.bat delete mode 100644 icuSources/tools/gentz/tz.default delete mode 100644 icuSources/tools/gentz/tz.pl delete mode 100644 icuSources/tools/gentz/tzparse.pm delete mode 100644 icuSources/tools/gentz/tzutil.pm create mode 100644 icuSources/tools/icuswap/Makefile.in create mode 100644 icuSources/tools/icuswap/icuswap.cpp rename icuSources/{test/ieeetest/ieeetest.dsp => tools/icuswap/icuswap.dsp} (57%) rename icuSources/tools/{gentz/gentz.vcproj => icuswap/icuswap.vcproj} (71%) create mode 100644 icuSources/tools/makeconv/gencnvex.c delete mode 100644 icuSources/tools/makeconv/readme.htm delete mode 100644 icuSources/tools/pkgdata/gmake.c create mode 100644 icuSources/tools/pkgdata/make.c delete mode 100644 icuSources/tools/pkgdata/nmake.c rename icuSources/tools/{genprops => toolutil}/propsvec.c (72%) rename icuSources/tools/{genprops => toolutil}/propsvec.h (70%) create mode 100644 icuSources/tools/toolutil/ucm.c create mode 100644 icuSources/tools/toolutil/ucm.h create mode 100644 icuSources/tools/toolutil/ucmstate.c create mode 100644 icuSources/tools/tzcode/patch-icu-tzcode create mode 100644 icuSources/tools/tzcode/readme.txt rename icuSources/tools/{gentz => tzcode}/tz.alias (73%) create mode 100644 icuSources/tools/tzcode/tz2icu.cpp create mode 100644 icuSources/tools/tzcode/tz2icu.h delete mode 100644 icudt26l.dat diff --git a/ICU.plist b/ICU.plist new file mode 100644 index 00000000..63f315e9 --- /dev/null +++ b/ICU.plist @@ -0,0 +1,24 @@ + + + + + + OpenSourceImportDate + 2004/11/24 + OpenSourceLicense + other + OpenSourceLicenseFile + ICU.html + OpenSourceProject + International Components for Unicode + OpenSourceSHA1 + 23fa1feb893a562408e6f13fcf968a6177d8aa6e + OpenSourceURL + ftp://www-126.ibm.com/pub/icu/3.2/icu-3.2.tgz + OpenSourceVersion + 3.2 + OpenSourceWebsiteURL + http://www.ibm.com/software/globalization/icu + + + diff --git a/icuSources/Doxyfile.in b/icuSources/Doxyfile.in index a72a66ad..73cb4526 100644 --- a/icuSources/Doxyfile.in +++ b/icuSources/Doxyfile.in @@ -1,791 +1,222 @@ +# Doxyfile 1.3.7 # ******************************************************************** # * COPYRIGHT: -# * Copyright (c) 2002, International Business Machines Corporation and -# * others. All Rights Reserved. +# * Copyright (c) 2004, International Business Machines Corporation +# * and others. All Rights Reserved. # ******************************************************************** -# Doxyfile 1.2.6 - -# This file describes the settings to be used by doxygen for a project -# -# All text after a hash (#) is considered a comment and will be ignored -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- -# General configuration options +# Project related configuration options #--------------------------------------------------------------------------- - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. - PROJECT_NAME = "ICU @VERSION@" - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - PROJECT_NUMBER = - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - OUTPUT_DIRECTORY = doc - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Dutch, French, Italian, Czech, Swedish, German, Finnish, Japanese, -# Korean, Hungarian, Norwegian, Spanish, Romanian, Russian, Croatian, -# Polish, Portuguese and Slovene. - +CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these class will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - +USE_WINDOWS_ENCODING = YES BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - REPEAT_BRIEF = YES - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - +ABBREVIATE_BRIEF = ALWAYS_DETAILED_SEC = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - +INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. It is allowed to use relative paths in the argument list. - STRIP_FROM_PATH = - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - +STRIP_FROM_INC_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = YES +MULTILINE_CPP_IS_BRIEF = NO +DETAILS_AT_TOP = NO +INHERIT_DOCS = YES +DISTRIBUTE_GROUP_DOC = NO +TAB_SIZE = 8 +ALIASES = "draft=\par ICU_Draft:\n" \ + "stable=\par ICU_Stable:\n" \ + "deprecated=\par ICU_Deprecated:\n" \ + "obsolete=\par ICU_Obsolete:\n" \ + "internal=\par ICU_Internal:\n" +OPTIMIZE_OUTPUT_FOR_C = YES +OPTIMIZE_OUTPUT_JAVA = NO +SUBGROUPING = YES +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = NO +EXTRACT_PRIVATE = NO +EXTRACT_STATIC = NO +EXTRACT_LOCAL_CLASSES = YES +EXTRACT_LOCAL_METHODS = NO +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = YES - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a class diagram (in Html and LaTeX) for classes with base or -# super classes. Setting the tag to NO turns the diagrams off. - -CLASS_DIAGRAMS = YES - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. - -SOURCE_BROWSER = NO - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. - -STRIP_CODE_COMMENTS = YES - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower case letters. If set to YES upper case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# users are adviced to set this option to NO. - CASE_SENSE_NAMES = YES - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - HIDE_SCOPE_NAMES = NO - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = YES - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put list of the files that are included by a file in the documentation -# of that file. - SHOW_INCLUDE_FILES = YES - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like the Qt-style comments (thus requiring an -# explict @brief command for a brief description. - -JAVADOC_AUTOBRIEF = YES - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# reimplements. - -INHERIT_DOCS = YES - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - SORT_MEMBER_DOCS = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 8 - -# The ENABLE_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. - -ENABLED_SECTIONS = - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - +SORT_BRIEF_DOCS = NO +SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - GENERATE_BUGLIST = YES - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consist of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and defines in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources -# only. Doxygen will then generate output that is more tailored for C. -# For instance some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = YES - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - SHOW_USED_FILES = YES - #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - WARN_IF_UNDOCUMENTED = YES - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. - +WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - WARN_LOGFILE = - #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = ./common/unicode/platform.h @srcdir@/common/unicode @srcdir@/i18n/unicode @srcdir@/layout/unicode - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -FILE_PATTERNS = *.h *.c *.cpp - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - +INPUT = ./common/unicode/platform.h @srcdir@/common/unicode @srcdir@/i18n/unicode @srcdir@/io/unicode @srcdir@/layout/unicode +FILE_PATTERNS = *.h RECURSIVE = NO - -# The EXCLUDE tag can be used to specify files and/or directories that should -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = @srcdir@/common/unicode/urename.h - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. - -EXCLUDE_PATTERNS = *config*.h - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = config*.h EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - EXAMPLE_PATTERNS = - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - +EXAMPLE_RECURSIVE = NO IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. - INPUT_FILTER = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse. - FILTER_SOURCE_FILES = NO - +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = YES +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = YES +REFERENCES_RELATION = YES +VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - ALPHABETICAL_INDEX = YES - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - IGNORE_PREFIX = - #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - HTML_OUTPUT = html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. - +HTML_FILE_EXTENSION = .html HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet - HTML_STYLESHEET = - -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - HTML_ALIGN_MEMBERS = YES - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) -# of the generated HTML documentation. - GENERATE_HTMLHELP = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - +CHM_FILE = +HHC_LOCATION = GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - BINARY_TOC = NO - -# The TOC_EXPAND flag can be set YES to add extra items for group members -# to the contents of the Html help documentation and to the tree view. - TOC_EXPAND = NO - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. - DISABLE_INDEX = NO - -# This tag can be used to set the number of enum values (range [1..20]) -# that doxygen will group on one line in the generated HTML documentation. - ENUM_VALUES_PER_LINE = 4 - -# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be -# generated containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript and frames is required (for instance Netscape 4.0+ -# or Internet explorer 4.0+). - GENERATE_TREEVIEW = NO - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - TREEVIEW_WIDTH = 250 - #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - GENERATE_LATEX = NO - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - LATEX_OUTPUT = latex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and -# executive. If left blank a4wide will be used. - PAPER_TYPE = a4wide - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - LATEX_HEADER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - PDF_HYPERLINKS = NO - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - USE_PDFLATEX = NO - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - LATEX_BATCHMODE = NO - +LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimised for Word 97 and may not look very pretty with -# other RTF readers or editors. - GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using a WORD or other. -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assigments. You only have to provide -# replacements, missing definitions are set to their default value. - RTF_STYLESHEET_FILE = - +RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - MAN_EXTENSION = .3 - +MAN_LINKS = NO +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- +GENERATE_XML = NO +XML_OUTPUT = xml +XML_SCHEMA = +XML_DTD = +XML_PROGRAMLISTING = YES +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- +GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- +GENERATE_PERLMOD = NO +PERLMOD_LATEX = YES +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - MACRO_EXPANSION = NO - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_PREDEFINED tags. - EXPAND_ONLY_PREDEF = NO - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# in the INCLUDE_PATH (see below) will be search if a #include is found. - SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. - PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition. - EXPAND_AS_DEFINED = - +SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- -# Configuration::addtions related to external references +# Configuration::additions related to external references #--------------------------------------------------------------------------- - -# The TAGFILES tag can be used to specify one or more tagfiles. - TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - ALLEXTERNALS = NO - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - +EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl - #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - +CLASS_DIAGRAMS = YES +HIDE_UNDOC_RELATIONS = YES HAVE_DOT = NO - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. - CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - COLLABORATION_GRAPH = YES - -# If the ENABLE_PREPROCESSING, INCLUDE_GRAPH, and HAVE_DOT tags are set to -# YES then doxygen will generate a graph for each documented file showing -# the direct and indirect include dependencies of the file with other -# documented files. - +UML_LOOK = NO +TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES - -# If the ENABLE_PREPROCESSING, INCLUDED_BY_GRAPH, and HAVE_DOT tags are set to -# YES then doxygen will generate a graph for each documented header file showing -# the documented files that directly or indirectly include this file - INCLUDED_BY_GRAPH = YES - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will graphical hierarchy of all classes instead of a textual one. - +CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found on the path. - +DOT_IMAGE_FORMAT = png DOT_PATH = - -# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. - +DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 - -# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. - MAX_DOT_GRAPH_HEIGHT = 1024 - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - +MAX_DOT_GRAPH_DEPTH = 0 GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermedate dot files that are used to generate -# the various graphs. - DOT_CLEANUP = YES - #--------------------------------------------------------------------------- -# Configuration::addtions related to the search engine +# Configuration::additions related to the search engine #--------------------------------------------------------------------------- - -# The SEARCHENGINE tag specifies whether or not a search engine should be -# used. If set to NO the values of all tags below this one will be ignored. - SEARCHENGINE = NO - -# The CGI_NAME tag should be the name of the CGI script that -# starts the search engine (doxysearch) with the correct parameters. -# A script with this name will be generated by doxygen. - CGI_NAME = search.cgi - -# The CGI_URL tag should be the absolute URL to the directory where the -# cgi binaries are located. See the documentation of your http daemon for -# details. - -CGI_URL = - -# The DOC_URL tag should be the absolute URL to the directory where the -# documentation is located. If left blank the absolute path to the -# documentation, with file:// prepended to it, will be used. - -DOC_URL = - -# The DOC_ABSPATH tag should be the absolute path to the directory where the -# documentation is located. If left blank the directory on the local machine -# will be used. - -DOC_ABSPATH = - -# The BIN_ABSPATH tag must point to the directory where the doxysearch binary -# is installed. - -BIN_ABSPATH = /usr/local/bin/ - -# The EXT_DOC_PATHS tag can be used to specify one or more paths to -# documentation generated for other projects. This allows doxysearch to search -# the documentation for these projects as well. - -EXT_DOC_PATHS = diff --git a/icuSources/Makefile.in b/icuSources/Makefile.in index 48a2fe01..95c52d77 100644 --- a/icuSources/Makefile.in +++ b/icuSources/Makefile.in @@ -1,6 +1,6 @@ #****************************************************************************** # -# Copyright (C) 1998-2003, International Business Machines +# Copyright (C) 1998-2004, International Business Machines # Corporation and others. All Rights Reserved. # #****************************************************************************** @@ -22,34 +22,28 @@ docsubdir = $(PACKAGE)$(ICULIBDASHSUFFIX)/html ## Build directory information subdir = . -AUTOCONF = @AUTOCONF@ - -## Platform-specific setup -include @platform_make_fragment@ +#AUTOCONF = @AUTOCONF@ ## Optional directory setup -@EXTRAS_TRUE@EXTRA = extra -@EXTRAS_FALSE@EXTRA = @LAYOUT_TRUE@LAYOUT = layout layoutex -@LAYOUT_FALSE@LAYOUT = +@ICUIO_TRUE@ICUIO = io +@EXTRAS_TRUE@EXTRA = extra @TESTS_TRUE@TEST = test -@TESTS_FALSE@TEST = @SAMPLES_TRUE@SAMPLE = samples -@SAMPLES_FALSE@SAMPLE = DOXYGEN = @DOXYGEN@ ## Files to remove for 'make clean' -CLEANFILES = *~ README +CLEANFILES = *~ ## Files built (autoconfed) and installed -INSTALLED_BUILT_FILES = $(top_builddir)/config/Makefile.inc $(top_builddir)/config/icu-config @platform_make_fragment@ README $(EXTRA_DATA:%=$(DESTDIR)$(pkglibdir)/%) +INSTALLED_BUILT_FILES = $(top_builddir)/config/Makefile.inc $(top_builddir)/config/icu-config @platform_make_fragment@ $(EXTRA_DATA:%=$(DESTDIR)$(pkglibdir)/%) ## Files built (autoconfed) but not installed LOCAL_BUILT_FILES = icudefs.mk DOCDIRS = common i18n -SUBDIRS = stubdata common i18n $(LAYOUT) tools data $(EXTRA) $(TEST) $(SAMPLE) +SUBDIRS = stubdata common i18n $(LAYOUT) tools data $(ICUIO) $(EXTRA) $(SAMPLE) $(TEST) SECTION = 1 @@ -77,6 +71,7 @@ clean: clean-recursive-with-twist clean-local distclean : distclean-recursive distclean-local dist: dist-recursive dist-local check: all check-recursive check-local +check-recursive: all ifeq ($(DOXYGEN),) doc: @@ -85,7 +80,7 @@ doc: else doc: doc/html/index.html -doc/html/index.html: Doxyfile $(wildcard ./common/unicode/platform.h $(srcdir)/common/unicode/*.h $(srcdir)/i18n/unicode/*.h $(srcdir)/layout/unicode/*.h) +doc/html/index.html: Doxyfile $(wildcard ./common/unicode/platform.h $(srcdir)/common/unicode/*.h $(srcdir)/i18n/unicode/*.h $(srcdir)/layout/unicode/*.h $(srcdir)/io/unicode/*.h) $(DOXYGEN) Doxyfile: $(srcdir)/Doxyfile.in @@ -95,8 +90,11 @@ endif LOCAL_SUBDIRS = $(SUBDIRS) CLEAN_FIRST_SUBDIRS = tools +$(LIBDIR) $(BINDIR): + -$(MKINSTALLDIRS) $@ + ## Recursive targets -all-recursive install-recursive clean-recursive distclean-recursive dist-recursive check-recursive: +all-recursive install-recursive clean-recursive distclean-recursive dist-recursive check-recursive: $(LIBDIR) $(BINDIR) @dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(LOCAL_SUBDIRS)'; for subdir in $$list; do \ @@ -125,14 +123,14 @@ install-icu: $(INSTALLED_BUILT_FILES) @$(MKINSTALLDIRS) $(DESTDIR)$(pkglibdir) @$(MKINSTALLDIRS) $(DESTDIR)$(bindir) @$(MKINSTALLDIRS) $(DESTDIR)$(sbindir) + $(INSTALL_DATA) @platform_make_fragment@ $(DESTDIR)$(pkgdatadir)/config/@platform_make_fragment_name@ + $(INSTALL_SCRIPT) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(pkgdatadir)/mkinstalldirs + $(INSTALL_DATA) $(top_srcdir)/../license.html $(DESTDIR)$(pkgdatadir)/license.html + $(INSTALL_SCRIPT) $(top_builddir)/config/icu-config $(DESTDIR)$(bindir)/icu-config $(INSTALL_DATA) $(top_builddir)/config/Makefile.inc $(DESTDIR)$(pkglibdir)/Makefile.inc cd $(DESTDIR)$(pkglibdir)/..; \ $(RM) current && ln -s $(VERSION) current; \ $(RM) Makefile.inc && ln -s current/Makefile.inc . - $(INSTALL_DATA) @platform_make_fragment@ $(DESTDIR)$(pkgdatadir)/config/@platform_make_fragment_name@ - $(INSTALL_SCRIPT) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(pkgdatadir)/mkinstalldirs - $(INSTALL_DATA) README $(DESTDIR)$(pkgdatadir)/README - $(INSTALL_SCRIPT) $(top_builddir)/config/icu-config $(DESTDIR)$(bindir)/icu-config ifeq ($(DOXYGEN),) install-doc: @@ -166,10 +164,6 @@ icudefs.mk: $(srcdir)/icudefs.mk.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status -README: $(srcdir)/README.in $(top_builddir)/config.status - cd $(top_builddir) \ - && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status - Makefile: $(srcdir)/Makefile.in icudefs.mk $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status @@ -180,7 +174,7 @@ $(top_builddir)/config/Makefile.inc: $(srcdir)/config/Makefile.inc.in $(top_bui $(top_builddir)/config/icu-config: $(top_builddir)/Makefile $(top_srcdir)/config/icu-config-top $(top_srcdir)/config/icu-config-bottom $(top_builddir)/config/Makefile.inc @platform_make_fragment@ $(top_srcdir)/config/make2sh.sed -$(RMV) $@ - $(INSTALL_DATA) $(top_srcdir)/config/icu-config-top $@ + $(INSTALL_SCRIPT) $(top_srcdir)/config/icu-config-top $@ @echo "# Following from @platform_make_fragment@" >> $@ sed -f $(top_srcdir)/config/make2sh.sed < $(top_builddir)/config/Makefile.inc | grep -v '#M#' | uniq >> $@ sed -f $(top_srcdir)/config/make2sh.sed < @platform_make_fragment@ | grep -v '#M#' | uniq >> $@ diff --git a/icuSources/README.in b/icuSources/README.in deleted file mode 100644 index ad666b05..00000000 --- a/icuSources/README.in +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2002, International Business Machines Corporation and others. All Rights Reserved. - -The ICU data files moved! - -Depending on the ICU packaging mode, ICU data files were moved to -new locations. - -@thelibdir@/@PACKAGE@/@VERSION@ - - For the data library (--with-packaging-mode=dll) and individual - data files (--with-packaging-mode=files). - -@thedatadir@/@PACKAGE@/@VERSION@ - - For the data common file (--with-packaging-mode=archive). - -This move happened post ICU 1.6. The rationale for the move is to be able -to share @thedatadir@ across machines with different architectures, as -it is supposed to be the case. - diff --git a/icuSources/aclocal.m4 b/icuSources/aclocal.m4 index 205f8ba1..ef3c7d8e 100644 --- a/icuSources/aclocal.m4 +++ b/icuSources/aclocal.m4 @@ -1,5 +1,5 @@ dnl aclocal.m4 for ICU -dnl Copyright (c) 1999-2003, International Business Machines Corporation and +dnl Copyright (c) 1999-2004, International Business Machines Corporation and dnl others. All Rights Reserved. dnl Stephen F. Booth @@ -13,33 +13,49 @@ AC_DEFUN(ICU_CHECK_MH_FRAG, [ [ case "${host}" in *-*-solaris*) - if test "$ac_cv_prog_gcc" = yes; then + if test "$GCC" = yes; then icu_cv_host_frag=mh-solaris-gcc else icu_cv_host_frag=mh-solaris fi ;; alpha*-*-linux-gnu) - if test "$ac_cv_prog_gcc" = yes; then + if test "$GCC" = yes; then icu_cv_host_frag=mh-alpha-linux-gcc else icu_cv_host_frag=mh-alpha-linux-cc fi ;; +powerpc*-*-linux*) + if test "$GCC" = yes; then + icu_cv_host_frag=mh-linux + else + icu_cv_host_frag=mh-linux-va + fi ;; *-*-linux*) icu_cv_host_frag=mh-linux ;; *-*-cygwin) - if test "$ac_cv_prog_gcc" = yes; then + if test "$GCC" = yes; then icu_cv_host_frag=mh-cygwin else icu_cv_host_frag=mh-cygwin-msvc fi ;; +*-*-mingw32) + if test "$GCC" = yes; then + icu_cv_host_frag=mh-mingw + else + icu_cv_host_frag=mh-cygwin-msvc + fi ;; *-*-*bsd*) icu_cv_host_frag=mh-bsd-gcc ;; *-*-aix*) - if test -n "`$CXX --help 2>&1 | grep 'IBM C and C++ Compilers$'`"; then - icu_cv_host_frag=mh-aix + if test "$GCC" = yes; then + icu_cv_host_frag=mh-aix-gcc else - icu_cv_host_frag=mh-aix-va + if test -n "`$CXX --help 2>&1 | grep 'IBM C and C++ Compilers$'`"; then + icu_cv_host_frag=mh-aix + else + icu_cv_host_frag=mh-aix-va + fi fi ;; *-*-hpux*) - if test "$ac_cv_prog_gcc" = yes; then + if test "$GCC" = yes; then icu_cv_host_frag=mh-hpux-gcc else case "$CXX" in @@ -51,9 +67,11 @@ alpha*-*-linux-gnu) *-*-os400*) icu_cv_host_frag=mh-os400 ;; *-apple-rhapsody*) icu_cv_host_frag=mh-darwin ;; *-apple-darwin*) icu_cv_host_frag=mh-darwin ;; +*-*-beos) icu_cv_host_frag=mh-beos ;; *-*-irix*) icu_cv_host_frag=mh-irix ;; *-dec-osf*) icu_cv_host_frag=mh-alpha-osf ;; *-*-nto*) icu_cv_host_frag=mh-qnx ;; +*-ncr-*) icu_cv_host_frag=mh-mpras ;; *-sequent-*) icu_cv_host_frag=mh-ptx ;; *) icu_cv_host_frag=mh-unknown ;; esac @@ -61,16 +79,13 @@ esac ) ]) -dnl ICU_CONDITIONAL - Taken from Automake 1.4 +dnl ICU_CONDITIONAL - similar example taken from Automake 1.4 AC_DEFUN(ICU_CONDITIONAL, [AC_SUBST($1_TRUE) -AC_SUBST($1_FALSE) if $2; then $1_TRUE= - $1_FALSE='#' else $1_TRUE='#' - $1_FALSE= fi]) dnl AC_SEARCH_LIBS_FIRST(FUNCTION, SEARCH-LIBS [, ACTION-IF-FOUND @@ -109,22 +124,15 @@ AC_DEFUN(AC_CHECK_64BIT_LIBS, ) dnl These results can't be cached because is sets compiler flags. AC_MSG_CHECKING([for 64-bit executable support]) - if test "$ENABLE_64BIT_LIBS" = no; then - case "${host}" in - *-*-hpux*) - case "${CXX}" in - *CC) - CFLAGS="${CFLAGS} +DAportable" - CXXFLAGS="${CXXFLAGS} +DAportable" - ;; - esac;; - esac - else + if test "$ENABLE_64BIT_LIBS" != no; then case "${host}" in *-*-solaris*) - if test "$ac_cv_prog_gcc" = no; then + SPARCV9=`isainfo -n 2>&1 | grep sparcv9` + if test "$GCC" = yes; then + # We could add a check for -m64 depending on the gcc version. + ENABLE_64BIT_LIBS=no + else SOL64=`$CXX -xarch=v9 2>&1 && $CC -xarch=v9 2>&1 | grep -v usage:` - SPARCV9=`isainfo -n 2>&1 | grep sparcv9` if test -z "$SOL64" && test -n "$SPARCV9"; then CFLAGS="${CFLAGS} -xtarget=ultra -xarch=v9" CXXFLAGS="${CXXFLAGS} -xtarget=ultra -xarch=v9" @@ -133,37 +141,87 @@ AC_DEFUN(AC_CHECK_64BIT_LIBS, else ENABLE_64BIT_LIBS=no fi + fi + ;; + ia64-*-linux*) + if test "$GCC" = yes; then + # gcc compiler support + if test -n "`$CXX -dumpspecs 2>&1 && $CC -dumpspecs 2>&1 | grep -v __LP64__`"; then + ENABLE_64BIT_LIBS=yes + else + ENABLE_64BIT_LIBS=no + fi else - ENABLE_64BIT_LIBS=no + # check for ecc/ecpc compiler support + if test -n "`$CXX --help 2>&1 && $CC --help 2>&1 | grep -v Intel`"; then + if test -n "`$CXX --help 2>&1 && $CC --help 2>&1 | grep -v Itanium`"; then + ENABLE_64BIT_LIBS=yes + else + ENABLE_64BIT_LIBS=no + fi + else + # unknown + ENABLE_64BIT_LIBS=no + fi fi ;; - *-*-aix*) - OLD_CFLAGS="${CFLAGS}" - OLD_CXXFLAGS="${CXXFLAGS}" - OLD_LDFLAGS="${LDFLAGS}" - CFLAGS="${CFLAGS} -q64" - CXXFLAGS="${CXXFLAGS} -q64" - LDFLAGS="${LDFLAGS} -q64" - AC_TRY_RUN(int main(void) {return 0;}, - ENABLE_64BIT_LIBS=yes, ENABLE_64BIT_LIBS=no, ENABLE_64BIT_LIBS=no) - if test "$ENABLE_64BIT_LIBS" = no; then - CFLAGS="${OLD_CFLAGS}" - CXXFLAGS="${OLD_CXXFLAGS}" - LDFLAGS="${OLD_LDFLAGS}" + x86_64-*-linux*) + if test "$GCC" = yes; then + if test -n "`$CXX -dumpspecs 2>&1 && $CC -dumpspecs 2>&1 | grep -v __LP64__`"; then + ENABLE_64BIT_LIBS=yes + else + ENABLE_64BIT_LIBS=no + fi else - ARFLAGS="${ARFLAGS} -X64" + # unknown + ENABLE_64BIT_LIBS=no + fi + ;; + *-*-aix*|powerpc64-*-linux*) + if test "$ac_cv_prog_gcc" = no; then + # Note: Have not tested 64-bitness with gcc. + # Maybe the flag "-maix64" could be used with gcc? + OLD_CFLAGS="${CFLAGS}" + OLD_CXXFLAGS="${CXXFLAGS}" + OLD_LDFLAGS="${LDFLAGS}" + CFLAGS="${CFLAGS} -q64" + CXXFLAGS="${CXXFLAGS} -q64" + LDFLAGS="${LDFLAGS} -q64" + AC_TRY_RUN(int main(void) {return 0;}, + ENABLE_64BIT_LIBS=yes, ENABLE_64BIT_LIBS=no, ENABLE_64BIT_LIBS=no) + if test "$ENABLE_64BIT_LIBS" = no; then + CFLAGS="${OLD_CFLAGS}" + CXXFLAGS="${OLD_CXXFLAGS}" + LDFLAGS="${OLD_LDFLAGS}" + else + case "${host}" in + *-*-aix*) + ARFLAGS="${ARFLAGS} -X64" + esac + fi fi ;; *-*-hpux*) + dnl First we try the newer +DD64, if that doesn't work, + dnl try other options. + OLD_CFLAGS="${CFLAGS}" OLD_CXXFLAGS="${CXXFLAGS}" - CFLAGS="${CFLAGS} +DA2.0W" - CXXFLAGS="${CXXFLAGS} +DA2.0W" + CFLAGS="${CFLAGS} +DD64" + CXXFLAGS="${CXXFLAGS} +DD64" AC_TRY_RUN(int main(void) {return 0;}, ENABLE_64BIT_LIBS=yes, ENABLE_64BIT_LIBS=no, ENABLE_64BIT_LIBS=no) if test "$ENABLE_64BIT_LIBS" = no; then CFLAGS="${OLD_CFLAGS}" CXXFLAGS="${OLD_CXXFLAGS}" + CFLAGS="${CFLAGS} +DA2.0W" + CXXFLAGS="${CXXFLAGS} +DA2.0W" + AC_TRY_RUN(int main(void) {return 0;}, + ENABLE_64BIT_LIBS=yes, ENABLE_64BIT_LIBS=no, ENABLE_64BIT_LIBS=no) + if test "$ENABLE_64BIT_LIBS" = no; then + CFLAGS="${OLD_CFLAGS}" + CXXFLAGS="${OLD_CXXFLAGS}" + fi fi ;; *) @@ -180,11 +238,11 @@ AC_DEFUN(AC_CHECK_STRICT_COMPILE, [ AC_MSG_CHECKING([whether strict compiling is on]) AC_ARG_ENABLE(strict,[ --enable-strict compile with strict compiler options [default=no]], [ - if test "$enableval" = no - then - ac_use_strict_options=no + if test "$enableval" = no + then + ac_use_strict_options=no else - ac_use_strict_options=yes + ac_use_strict_options=yes fi ], [ac_use_strict_options=no]) AC_MSG_RESULT($ac_use_strict_options) @@ -193,19 +251,35 @@ AC_DEFUN(AC_CHECK_STRICT_COMPILE, then if test "$GCC" = yes then - CFLAGS="$CFLAGS -Wall -ansi -pedantic -Wshadow -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -Winline" + CFLAGS="$CFLAGS -Wall -ansi -pedantic -Wshadow -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -Winline -Wno-long-long" case "${host}" in *-*-solaris*) CFLAGS="$CFLAGS -D__STDC__=0";; esac + else + case "${host}" in + *-*-cygwin) + if test "`$CC /help 2>&1 | head -c9`" = "Microsoft" + then + CFLAGS="$CFLAGS /W4" + fi + esac fi if test "$GXX" = yes then - CXXFLAGS="$CXXFLAGS -W -Wall -ansi -pedantic -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -Winline" + CXXFLAGS="$CXXFLAGS -W -Wall -ansi -pedantic -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -Winline -Wno-long-long" case "${host}" in *-*-solaris*) CXXFLAGS="$CXXFLAGS -D__STDC__=0";; esac + else + case "${host}" in + *-*-cygwin) + if test "`$CXX /help 2>&1 | head -c9`" = "Microsoft" + then + CXXFLAGS="$CXXFLAGS /W4" + fi + esac fi fi ]) @@ -236,3 +310,4 @@ AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME) undefine([AC_TYPE_NAME])dnl undefine([AC_CV_NAME])dnl ]) + diff --git a/icuSources/allinone/all/all.vcproj b/icuSources/allinone/all/all.vcproj deleted file mode 100644 index 0bc7f687..00000000 --- a/icuSources/allinone/all/all.vcproj +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/icuSources/allinone/allinone.dsw b/icuSources/allinone/allinone.dsw index 50dd0c39..c18acc55 100644 --- a/icuSources/allinone/allinone.dsw +++ b/icuSources/allinone/allinone.dsw @@ -54,18 +54,12 @@ Package=<4> Project_Dep_Name gentest End Project Dependency Begin Project Dependency - Project_Dep_Name gentz - End Project Dependency - Begin Project Dependency Project_Dep_Name genuca End Project Dependency Begin Project Dependency Project_Dep_Name i18n End Project Dependency Begin Project Dependency - Project_Dep_Name ieeetest - End Project Dependency - Begin Project Dependency Project_Dep_Name intltest End Project Dependency Begin Project Dependency @@ -90,16 +84,25 @@ Package=<4> Project_Dep_Name uconv End Project Dependency Begin Project Dependency - Project_Dep_Name ustdio + Project_Dep_Name io End Project Dependency Begin Project Dependency Project_Dep_Name genbrk End Project Dependency Begin Project Dependency - Project_Dep_Name genidna + Project_Dep_Name layoutex End Project Dependency Begin Project Dependency - Project_Dep_Name layoutex + Project_Dep_Name gensprep + End Project Dependency + Begin Project Dependency + Project_Dep_Name icuswap + End Project Dependency + Begin Project Dependency + Project_Dep_Name iotest + End Project Dependency + Begin Project Dependency + Project_Dep_Name gencase End Project Dependency }}} @@ -213,7 +216,7 @@ Package=<4> ############################################################################### -Project: "genccode"=..\tools\genccode\genccode.dsp - Package Owner=<4> +Project: "gencase"=..\tools\gencase\gencase.dsp - Package Owner=<4> Package=<5> {{{ @@ -231,7 +234,7 @@ Package=<4> ############################################################################### -Project: "gencmn"=..\tools\gencmn\gencmn.dsp - Package Owner=<4> +Project: "genccode"=..\tools\genccode\genccode.dsp - Package Owner=<4> Package=<5> {{{ @@ -249,7 +252,7 @@ Package=<4> ############################################################################### -Project: "gencnval"=..\tools\gencnval\gencnval.dsp - Package Owner=<4> +Project: "gencmn"=..\tools\gencmn\gencmn.dsp - Package Owner=<4> Package=<5> {{{ @@ -267,7 +270,7 @@ Package=<4> ############################################################################### -Project: "genidna"=..\tools\genidna\genidna.dsp - Package Owner=<4> +Project: "gencnval"=..\tools\gencnval\gencnval.dsp - Package Owner=<4> Package=<5> {{{ @@ -381,6 +384,18 @@ Package=<4> ############################################################################### +Project: "gensprep"=..\tools\gensprep\gensprep.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + Project: "gentest"=..\tools\gentest\gentest.dsp - Package Owner=<4> Package=<5> @@ -399,7 +414,7 @@ Package=<4> ############################################################################### -Project: "gentz"=..\tools\gentz\gentz.dsp - Package Owner=<4> +Project: "genuca"=..\TOOLS\genuca\genuca.dsp - Package Owner=<4> Package=<5> {{{ @@ -411,13 +426,31 @@ Package=<4> Project_Dep_Name common End Project Dependency Begin Project Dependency + Project_Dep_Name i18n + End Project Dependency + Begin Project Dependency Project_Dep_Name toolutil End Project Dependency }}} ############################################################################### -Project: "genuca"=..\TOOLS\genuca\genuca.dsp - Package Owner=<4> +Project: "i18n"=..\i18n\i18n.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name common + End Project Dependency +}}} + +############################################################################### + +Project: "icuswap"=..\tools\icuswap\icuswap.dsp - Package Owner=<4> Package=<5> {{{ @@ -438,7 +471,7 @@ Package=<4> ############################################################################### -Project: "i18n"=..\i18n\i18n.dsp - Package Owner=<4> +Project: "intltest"=..\test\intltest\intltest.dsp - Package Owner=<4> Package=<5> {{{ @@ -449,11 +482,20 @@ Package=<4> Begin Project Dependency Project_Dep_Name common End Project Dependency + Begin Project Dependency + Project_Dep_Name i18n + End Project Dependency + Begin Project Dependency + Project_Dep_Name toolutil + End Project Dependency + Begin Project Dependency + Project_Dep_Name ctestfw + End Project Dependency }}} ############################################################################### -Project: "ieeetest"=..\test\ieeetest\ieeetest.dsp - Package Owner=<4> +Project: "io"=..\io\io.dsp - Package Owner=<4> Package=<5> {{{ @@ -464,11 +506,14 @@ Package=<4> Begin Project Dependency Project_Dep_Name common End Project Dependency + Begin Project Dependency + Project_Dep_Name i18n + End Project Dependency }}} ############################################################################### -Project: "intltest"=..\test\intltest\intltest.dsp - Package Owner=<4> +Project: "iotest"=..\test\iotest\iotest.dsp - Package Owner=<4> Package=<5> {{{ @@ -480,10 +525,13 @@ Package=<4> Project_Dep_Name common End Project Dependency Begin Project Dependency + Project_Dep_Name ctestfw + End Project Dependency + Begin Project Dependency Project_Dep_Name i18n End Project Dependency Begin Project Dependency - Project_Dep_Name toolutil + Project_Dep_Name io End Project Dependency }}} @@ -582,9 +630,6 @@ Package=<4> Project_Dep_Name gentest End Project Dependency Begin Project Dependency - Project_Dep_Name gentz - End Project Dependency - Begin Project Dependency Project_Dep_Name genuca End Project Dependency Begin Project Dependency @@ -606,7 +651,10 @@ Package=<4> Project_Dep_Name genbrk End Project Dependency Begin Project Dependency - Project_Dep_Name genidna + Project_Dep_Name gensprep + End Project Dependency + Begin Project Dependency + Project_Dep_Name gencase End Project Dependency }}} @@ -681,24 +729,6 @@ Package=<4> ############################################################################### -Project: "ustdio"=..\extra\ustdio\ustdio.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name common - End Project Dependency - Begin Project Dependency - Project_Dep_Name i18n - End Project Dependency -}}} - -############################################################################### - Global: Package=<5> diff --git a/icuSources/allinone/allinone.sln b/icuSources/allinone/allinone.sln index 15c39c61..26eea2d7 100644 --- a/icuSources/allinone/allinone.sln +++ b/icuSources/allinone/allinone.sln @@ -1,186 +1,219 @@ -Microsoft Visual Studio Solution File, Format Version 7.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "all", "all\all.vcproj", "{D6271E12-B9F5-49B8-BD94-62B236A96940}" -EndProject +Microsoft Visual Studio Solution File, Format Version 8.00 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cintltst", "..\test\cintltst\cintltst.vcproj", "{3D1246AE-1B32-479B-BECA-AEFA97BE2321}" + ProjectSection(ProjectDependencies) = postProject + {0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776} + {6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0} + {ECA6B435-B4FA-4F9F-BF95-F451D078FC47} = {ECA6B435-B4FA-4F9F-BF95-F451D078FC47} + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "common", "..\common\common.vcproj", "{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}" + ProjectSection(ProjectDependencies) = postProject + {203EC78A-0531-43F0-A636-285439BDE025} = {203EC78A-0531-43F0-A636-285439BDE025} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ctestfw", "..\tools\ctestfw\ctestfw.vcproj", "{ECA6B435-B4FA-4F9F-BF95-F451D078FC47}" + ProjectSection(ProjectDependencies) = postProject + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "decmn", "..\tools\gencmn\decmn.vcproj", "{20869594-A3DD-4A75-8068-99B03A5CF4E4}" + ProjectSection(ProjectDependencies) = postProject + {6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0} + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "derb", "..\TOOLS\GENRB\derb.vcproj", "{D3065ADB-8820-4CC7-9B6C-9510833961A3}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "derb", "..\tools\genrb\derb.vcproj", "{D3065ADB-8820-4CC7-9B6C-9510833961A3}" + ProjectSection(ProjectDependencies) = postProject + {6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0} + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "genbrk", "..\tools\genbrk\genbrk.vcproj", "{C2BE5000-7501-4E87-9724-B8D82494FAE6}" + ProjectSection(ProjectDependencies) = postProject + {6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0} + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "genccode", "..\tools\genccode\genccode.vcproj", "{FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}" + ProjectSection(ProjectDependencies) = postProject + {6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0} + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gencmn", "..\tools\gencmn\gencmn.vcproj", "{A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}" + ProjectSection(ProjectDependencies) = postProject + {6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0} + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gencnval", "..\tools\gencnval\gencnval.vcproj", "{8B41752B-5A52-41E4-B7E0-07921C0CC6BF}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "genidna", "..\tools\genidna\genidna.vcproj", "{74BA1DDE-CDBA-4802-B033-61A6C897515D}" + ProjectSection(ProjectDependencies) = postProject + {6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0} + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gennames", "..\tools\gennames\gennames.vcproj", "{F5281B04-A9E0-4680-BBA8-1D7F7D115458}" + ProjectSection(ProjectDependencies) = postProject + {6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0} + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gennorm", "..\tools\gennorm\gennorm.vcproj", "{F5213103-6CBE-46E6-B4CC-2570B6837D86}" + ProjectSection(ProjectDependencies) = postProject + {6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0} + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "genpname", "..\tools\genpname\genpname.vcproj", "{DBC0AF0B-B9FF-4B23-905B-4D4CDC2A91CB}" + ProjectSection(ProjectDependencies) = postProject + {6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0} + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "genprops", "..\tools\genprops\genprops.vcproj", "{6F744648-D15F-478A-90C6-58E353B5DDB3}" + ProjectSection(ProjectDependencies) = postProject + {6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0} + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "genrb", "..\tools\genrb\genrb.vcproj", "{97521D06-EC47-45D4-8BD0-9E16B3F93B2A}" + ProjectSection(ProjectDependencies) = postProject + {0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776} + {6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0} + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gentest", "..\tools\gentest\gentest.vcproj", "{77C78066-746F-4EA6-B3FE-B8C8A4A97891}" + ProjectSection(ProjectDependencies) = postProject + {6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0} + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gentz", "..\tools\gentz\gentz.vcproj", "{A02DB485-DC68-4B14-B5BB-115F1596BFF1}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "genuca", "..\TOOLS\genuca\genuca.vcproj", "{86829694-A375-4C58-B4EA-96EF514E3225}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "genuca", "..\tools\genuca\genuca.vcproj", "{86829694-A375-4C58-B4EA-96EF514E3225}" + ProjectSection(ProjectDependencies) = postProject + {0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776} + {6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0} + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "i18n", "..\i18n\i18n.vcproj", "{0178B127-6269-407D-B112-93877BB62776}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ieeetest", "..\test\ieeetest\ieeetest.vcproj", "{10F01D38-993E-407A-89BD-5C1C63F3A08D}" + ProjectSection(ProjectDependencies) = postProject + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "intltest", "..\test\intltest\intltest.vcproj", "{73632960-B3A6-464D-83A3-4B43365F19B8}" + ProjectSection(ProjectDependencies) = postProject + {0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776} + {6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0} + {ECA6B435-B4FA-4F9F-BF95-F451D078FC47} = {ECA6B435-B4FA-4F9F-BF95-F451D078FC47} + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "layout", "..\layout\layout.vcproj", "{C920062A-0647-4553-A3B2-37C58065664B}" + ProjectSection(ProjectDependencies) = postProject + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "layoutex", "..\layoutex\layoutex.vcproj", "{37FC2C7F-1904-4811-8955-2F478830EAD1}" + ProjectSection(ProjectDependencies) = postProject + {C920062A-0647-4553-A3B2-37C58065664B} = {C920062A-0647-4553-A3B2-37C58065664B} + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makeconv", "..\tools\makeconv\makeconv.vcproj", "{F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}" + ProjectSection(ProjectDependencies) = postProject + {6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0} + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makedata", "..\data\makedata.vcproj", "{D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}" + ProjectSection(ProjectDependencies) = postProject + {C2BE5000-7501-4E87-9724-B8D82494FAE6} = {C2BE5000-7501-4E87-9724-B8D82494FAE6} + {F5213103-6CBE-46E6-B4CC-2570B6837D86} = {F5213103-6CBE-46E6-B4CC-2570B6837D86} + {F5281B04-A9E0-4680-BBA8-1D7F7D115458} = {F5281B04-A9E0-4680-BBA8-1D7F7D115458} + {97521D06-EC47-45D4-8BD0-9E16B3F93B2A} = {97521D06-EC47-45D4-8BD0-9E16B3F93B2A} + {DBC0AF0B-B9FF-4B23-905B-4D4CDC2A91CB} = {DBC0AF0B-B9FF-4B23-905B-4D4CDC2A91CB} + {0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776} + {8B41752B-5A52-41E4-B7E0-07921C0CC6BF} = {8B41752B-5A52-41E4-B7E0-07921C0CC6BF} + {6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0} + {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C} = {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C} + {6F744648-D15F-478A-90C6-58E353B5DDB3} = {6F744648-D15F-478A-90C6-58E353B5DDB3} + {DB312A49-12A9-4E07-9E96-451DC2D8FF61} = {DB312A49-12A9-4E07-9E96-451DC2D8FF61} + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + {77C78066-746F-4EA6-B3FE-B8C8A4A97891} = {77C78066-746F-4EA6-B3FE-B8C8A4A97891} + {203EC78A-0531-43F0-A636-285439BDE025} = {203EC78A-0531-43F0-A636-285439BDE025} + {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F} = {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F} + {86829694-A375-4C58-B4EA-96EF514E3225} = {86829694-A375-4C58-B4EA-96EF514E3225} + {631C23CE-6C1D-4875-88F0-85E0A42B36EA} = {631C23CE-6C1D-4875-88F0-85E0A42B36EA} + {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547} = {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547} + {4C8454FE-81D3-4CA3-9927-29BA96F03DAC} = {4C8454FE-81D3-4CA3-9927-29BA96F03DAC} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pkgdata", "..\tools\pkgdata\pkgdata.vcproj", "{4C8454FE-81D3-4CA3-9927-29BA96F03DAC}" + ProjectSection(ProjectDependencies) = postProject + {6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0} + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F} = {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F} + {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547} = {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547} + EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "stubdata", "..\STUBDATA\stubdata.vcproj", "{203EC78A-0531-43F0-A636-285439BDE025}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "stubdata", "..\stubdata\stubdata.vcproj", "{203EC78A-0531-43F0-A636-285439BDE025}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "toolutil", "..\tools\toolutil\toolutil.vcproj", "{6B231032-3CB5-4EED-9210-810D666A23A0}" + ProjectSection(ProjectDependencies) = postProject + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "uconv", "..\extra\uconv\uconv.vcproj", "{DBA4088D-F6F9-4F8F-8820-082A4765C16C}" + ProjectSection(ProjectDependencies) = postProject + {97521D06-EC47-45D4-8BD0-9E16B3F93B2A} = {97521D06-EC47-45D4-8BD0-9E16B3F93B2A} + {0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776} + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + {4C8454FE-81D3-4CA3-9927-29BA96F03DAC} = {4C8454FE-81D3-4CA3-9927-29BA96F03DAC} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "io", "..\io\io.vcproj", "{C2B04507-2521-4801-BF0D-5FD79D6D518C}" + ProjectSection(ProjectDependencies) = postProject + {0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776} + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ustdio", "..\extra\ustdio\ustdio.vcproj", "{C2B04507-2521-4801-BF0D-5FD79D6D518C}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gensprep", "..\tools\gensprep\gensprep.vcproj", "{631C23CE-6C1D-4875-88F0-85E0A42B36EA}" + ProjectSection(ProjectDependencies) = postProject + {6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0} + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "icuswap", "..\tools\icuswap\icuswap.vcproj", "{6FC24387-370C-4561-9582-7A819749E2C5}" + ProjectSection(ProjectDependencies) = postProject + {0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776} + {6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0} + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iotest", "..\test\iotest\iotest.vcproj", "{E4993E82-D68A-46CA-BAE0-9D35E172E46F}" + ProjectSection(ProjectDependencies) = postProject + {C2B04507-2521-4801-BF0D-5FD79D6D518C} = {C2B04507-2521-4801-BF0D-5FD79D6D518C} + {0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776} + {ECA6B435-B4FA-4F9F-BF95-F451D078FC47} = {ECA6B435-B4FA-4F9F-BF95-F451D078FC47} + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gencase", "..\tools\gencase\gencase.vcproj", "{DB312A49-12A9-4E07-9E96-451DC2D8FF61}" + ProjectSection(ProjectDependencies) = postProject + {6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0} + {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + EndProjectSection EndProject Global GlobalSection(SolutionConfiguration) = preSolution - ConfigName.0 = Debug - ConfigName.1 = Release - EndGlobalSection - GlobalSection(ProjectDependencies) = postSolution - {D6271E12-B9F5-49B8-BD94-62B236A96940}.0 = {37FC2C7F-1904-4811-8955-2F478830EAD1} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.1 = {74BA1DDE-CDBA-4802-B033-61A6C897515D} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.2 = {C2BE5000-7501-4E87-9724-B8D82494FAE6} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.3 = {C2B04507-2521-4801-BF0D-5FD79D6D518C} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.4 = {DBA4088D-F6F9-4F8F-8820-082A4765C16C} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.5 = {6B231032-3CB5-4EED-9210-810D666A23A0} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.6 = {203EC78A-0531-43F0-A636-285439BDE025} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.7 = {4C8454FE-81D3-4CA3-9927-29BA96F03DAC} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.8 = {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.9 = {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.10 = {C920062A-0647-4553-A3B2-37C58065664B} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.11 = {73632960-B3A6-464D-83A3-4B43365F19B8} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.12 = {10F01D38-993E-407A-89BD-5C1C63F3A08D} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.13 = {0178B127-6269-407D-B112-93877BB62776} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.14 = {86829694-A375-4C58-B4EA-96EF514E3225} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.15 = {A02DB485-DC68-4B14-B5BB-115F1596BFF1} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.16 = {77C78066-746F-4EA6-B3FE-B8C8A4A97891} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.17 = {97521D06-EC47-45D4-8BD0-9E16B3F93B2A} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.18 = {6F744648-D15F-478A-90C6-58E353B5DDB3} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.19 = {DBC0AF0B-B9FF-4B23-905B-4D4CDC2A91CB} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.20 = {F5213103-6CBE-46E6-B4CC-2570B6837D86} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.21 = {F5281B04-A9E0-4680-BBA8-1D7F7D115458} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.22 = {8B41752B-5A52-41E4-B7E0-07921C0CC6BF} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.23 = {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.24 = {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.25 = {D3065ADB-8820-4CC7-9B6C-9510833961A3} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.26 = {20869594-A3DD-4A75-8068-99B03A5CF4E4} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.27 = {ECA6B435-B4FA-4F9F-BF95-F451D078FC47} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.28 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {D6271E12-B9F5-49B8-BD94-62B236A96940}.29 = {3D1246AE-1B32-479B-BECA-AEFA97BE2321} - {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.0 = {6B231032-3CB5-4EED-9210-810D666A23A0} - {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.1 = {0178B127-6269-407D-B112-93877BB62776} - {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.2 = {ECA6B435-B4FA-4F9F-BF95-F451D078FC47} - {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.3 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}.0 = {203EC78A-0531-43F0-A636-285439BDE025} - {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}.0 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {20869594-A3DD-4A75-8068-99B03A5CF4E4}.0 = {6B231032-3CB5-4EED-9210-810D666A23A0} - {20869594-A3DD-4A75-8068-99B03A5CF4E4}.1 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {D3065ADB-8820-4CC7-9B6C-9510833961A3}.0 = {203EC78A-0531-43F0-A636-285439BDE025} - {D3065ADB-8820-4CC7-9B6C-9510833961A3}.1 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {C2BE5000-7501-4E87-9724-B8D82494FAE6}.0 = {6B231032-3CB5-4EED-9210-810D666A23A0} - {C2BE5000-7501-4E87-9724-B8D82494FAE6}.1 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.0 = {6B231032-3CB5-4EED-9210-810D666A23A0} - {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}.1 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.0 = {6B231032-3CB5-4EED-9210-810D666A23A0} - {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}.1 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.0 = {6B231032-3CB5-4EED-9210-810D666A23A0} - {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.1 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {74BA1DDE-CDBA-4802-B033-61A6C897515D}.0 = {6B231032-3CB5-4EED-9210-810D666A23A0} - {74BA1DDE-CDBA-4802-B033-61A6C897515D}.1 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {F5281B04-A9E0-4680-BBA8-1D7F7D115458}.0 = {6B231032-3CB5-4EED-9210-810D666A23A0} - {F5281B04-A9E0-4680-BBA8-1D7F7D115458}.1 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {F5213103-6CBE-46E6-B4CC-2570B6837D86}.0 = {6B231032-3CB5-4EED-9210-810D666A23A0} - {F5213103-6CBE-46E6-B4CC-2570B6837D86}.1 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {DBC0AF0B-B9FF-4B23-905B-4D4CDC2A91CB}.0 = {6B231032-3CB5-4EED-9210-810D666A23A0} - {DBC0AF0B-B9FF-4B23-905B-4D4CDC2A91CB}.1 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {6F744648-D15F-478A-90C6-58E353B5DDB3}.0 = {6B231032-3CB5-4EED-9210-810D666A23A0} - {6F744648-D15F-478A-90C6-58E353B5DDB3}.1 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.0 = {6B231032-3CB5-4EED-9210-810D666A23A0} - {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.1 = {0178B127-6269-407D-B112-93877BB62776} - {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.2 = {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C} - {97521D06-EC47-45D4-8BD0-9E16B3F93B2A}.3 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.0 = {6B231032-3CB5-4EED-9210-810D666A23A0} - {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.1 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {A02DB485-DC68-4B14-B5BB-115F1596BFF1}.0 = {6B231032-3CB5-4EED-9210-810D666A23A0} - {A02DB485-DC68-4B14-B5BB-115F1596BFF1}.1 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {86829694-A375-4C58-B4EA-96EF514E3225}.0 = {6B231032-3CB5-4EED-9210-810D666A23A0} - {86829694-A375-4C58-B4EA-96EF514E3225}.1 = {0178B127-6269-407D-B112-93877BB62776} - {86829694-A375-4C58-B4EA-96EF514E3225}.2 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {0178B127-6269-407D-B112-93877BB62776}.0 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {10F01D38-993E-407A-89BD-5C1C63F3A08D}.0 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {73632960-B3A6-464D-83A3-4B43365F19B8}.0 = {6B231032-3CB5-4EED-9210-810D666A23A0} - {73632960-B3A6-464D-83A3-4B43365F19B8}.1 = {0178B127-6269-407D-B112-93877BB62776} - {73632960-B3A6-464D-83A3-4B43365F19B8}.2 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {C920062A-0647-4553-A3B2-37C58065664B}.0 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {37FC2C7F-1904-4811-8955-2F478830EAD1}.0 = {C920062A-0647-4553-A3B2-37C58065664B} - {37FC2C7F-1904-4811-8955-2F478830EAD1}.1 = {0178B127-6269-407D-B112-93877BB62776} - {37FC2C7F-1904-4811-8955-2F478830EAD1}.2 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.0 = {6B231032-3CB5-4EED-9210-810D666A23A0} - {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}.1 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.0 = {74BA1DDE-CDBA-4802-B033-61A6C897515D} - {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.1 = {C2BE5000-7501-4E87-9724-B8D82494FAE6} - {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.2 = {6B231032-3CB5-4EED-9210-810D666A23A0} - {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.3 = {203EC78A-0531-43F0-A636-285439BDE025} - {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.4 = {4C8454FE-81D3-4CA3-9927-29BA96F03DAC} - {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.5 = {F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C} - {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.6 = {0178B127-6269-407D-B112-93877BB62776} - {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.7 = {86829694-A375-4C58-B4EA-96EF514E3225} - {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.8 = {A02DB485-DC68-4B14-B5BB-115F1596BFF1} - {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.9 = {77C78066-746F-4EA6-B3FE-B8C8A4A97891} - {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.10 = {97521D06-EC47-45D4-8BD0-9E16B3F93B2A} - {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.11 = {6F744648-D15F-478A-90C6-58E353B5DDB3} - {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.12 = {DBC0AF0B-B9FF-4B23-905B-4D4CDC2A91CB} - {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.13 = {F5213103-6CBE-46E6-B4CC-2570B6837D86} - {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.14 = {F5281B04-A9E0-4680-BBA8-1D7F7D115458} - {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.15 = {8B41752B-5A52-41E4-B7E0-07921C0CC6BF} - {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.16 = {A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F} - {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.17 = {FDD3C4F2-9805-44EB-9A77-BC1C1C95B547} - {D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}.18 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.0 = {6B231032-3CB5-4EED-9210-810D666A23A0} - {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}.1 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {6B231032-3CB5-4EED-9210-810D666A23A0}.0 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.0 = {4C8454FE-81D3-4CA3-9927-29BA96F03DAC} - {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.1 = {0178B127-6269-407D-B112-93877BB62776} - {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.2 = {97521D06-EC47-45D4-8BD0-9E16B3F93B2A} - {DBA4088D-F6F9-4F8F-8820-082A4765C16C}.3 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} - {C2B04507-2521-4801-BF0D-5FD79D6D518C}.0 = {0178B127-6269-407D-B112-93877BB62776} - {C2B04507-2521-4801-BF0D-5FD79D6D518C}.1 = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} + Debug = Debug + Release = Release EndGlobalSection GlobalSection(ProjectConfiguration) = postSolution - {D6271E12-B9F5-49B8-BD94-62B236A96940}.Debug.ActiveCfg = Debug|Win32 - {D6271E12-B9F5-49B8-BD94-62B236A96940}.Debug.Build.0 = Debug|Win32 - {D6271E12-B9F5-49B8-BD94-62B236A96940}.Release.ActiveCfg = Release|Win32 - {D6271E12-B9F5-49B8-BD94-62B236A96940}.Release.Build.0 = Release|Win32 {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Debug.ActiveCfg = Debug|Win32 {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Debug.Build.0 = Debug|Win32 {3D1246AE-1B32-479B-BECA-AEFA97BE2321}.Release.ActiveCfg = Release|Win32 @@ -217,10 +250,6 @@ Global {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Debug.Build.0 = Debug|Win32 {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Release.ActiveCfg = Release|Win32 {8B41752B-5A52-41E4-B7E0-07921C0CC6BF}.Release.Build.0 = Release|Win32 - {74BA1DDE-CDBA-4802-B033-61A6C897515D}.Debug.ActiveCfg = Debug|Win32 - {74BA1DDE-CDBA-4802-B033-61A6C897515D}.Debug.Build.0 = Debug|Win32 - {74BA1DDE-CDBA-4802-B033-61A6C897515D}.Release.ActiveCfg = Release|Win32 - {74BA1DDE-CDBA-4802-B033-61A6C897515D}.Release.Build.0 = Release|Win32 {F5281B04-A9E0-4680-BBA8-1D7F7D115458}.Debug.ActiveCfg = Debug|Win32 {F5281B04-A9E0-4680-BBA8-1D7F7D115458}.Debug.Build.0 = Debug|Win32 {F5281B04-A9E0-4680-BBA8-1D7F7D115458}.Release.ActiveCfg = Release|Win32 @@ -245,10 +274,6 @@ Global {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Debug.Build.0 = Debug|Win32 {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Release.ActiveCfg = Release|Win32 {77C78066-746F-4EA6-B3FE-B8C8A4A97891}.Release.Build.0 = Release|Win32 - {A02DB485-DC68-4B14-B5BB-115F1596BFF1}.Debug.ActiveCfg = Debug|Win32 - {A02DB485-DC68-4B14-B5BB-115F1596BFF1}.Debug.Build.0 = Debug|Win32 - {A02DB485-DC68-4B14-B5BB-115F1596BFF1}.Release.ActiveCfg = Release|Win32 - {A02DB485-DC68-4B14-B5BB-115F1596BFF1}.Release.Build.0 = Release|Win32 {86829694-A375-4C58-B4EA-96EF514E3225}.Debug.ActiveCfg = Debug|Win32 {86829694-A375-4C58-B4EA-96EF514E3225}.Debug.Build.0 = Debug|Win32 {86829694-A375-4C58-B4EA-96EF514E3225}.Release.ActiveCfg = Release|Win32 @@ -257,10 +282,6 @@ Global {0178B127-6269-407D-B112-93877BB62776}.Debug.Build.0 = Debug|Win32 {0178B127-6269-407D-B112-93877BB62776}.Release.ActiveCfg = Release|Win32 {0178B127-6269-407D-B112-93877BB62776}.Release.Build.0 = Release|Win32 - {10F01D38-993E-407A-89BD-5C1C63F3A08D}.Debug.ActiveCfg = Debug|Win32 - {10F01D38-993E-407A-89BD-5C1C63F3A08D}.Debug.Build.0 = Debug|Win32 - {10F01D38-993E-407A-89BD-5C1C63F3A08D}.Release.ActiveCfg = Release|Win32 - {10F01D38-993E-407A-89BD-5C1C63F3A08D}.Release.Build.0 = Release|Win32 {73632960-B3A6-464D-83A3-4B43365F19B8}.Debug.ActiveCfg = Debug|Win32 {73632960-B3A6-464D-83A3-4B43365F19B8}.Debug.Build.0 = Debug|Win32 {73632960-B3A6-464D-83A3-4B43365F19B8}.Release.ActiveCfg = Release|Win32 @@ -301,6 +322,22 @@ Global {C2B04507-2521-4801-BF0D-5FD79D6D518C}.Debug.Build.0 = Debug|Win32 {C2B04507-2521-4801-BF0D-5FD79D6D518C}.Release.ActiveCfg = Release|Win32 {C2B04507-2521-4801-BF0D-5FD79D6D518C}.Release.Build.0 = Release|Win32 + {631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Debug.ActiveCfg = Debug|Win32 + {631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Debug.Build.0 = Debug|Win32 + {631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Release.ActiveCfg = Release|Win32 + {631C23CE-6C1D-4875-88F0-85E0A42B36EA}.Release.Build.0 = Release|Win32 + {6FC24387-370C-4561-9582-7A819749E2C5}.Debug.ActiveCfg = Debug|Win32 + {6FC24387-370C-4561-9582-7A819749E2C5}.Debug.Build.0 = Debug|Win32 + {6FC24387-370C-4561-9582-7A819749E2C5}.Release.ActiveCfg = Release|Win32 + {6FC24387-370C-4561-9582-7A819749E2C5}.Release.Build.0 = Release|Win32 + {E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Debug.ActiveCfg = Debug|Win32 + {E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Debug.Build.0 = Debug|Win32 + {E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Release.ActiveCfg = Release|Win32 + {E4993E82-D68A-46CA-BAE0-9D35E172E46F}.Release.Build.0 = Release|Win32 + {DB312A49-12A9-4E07-9E96-451DC2D8FF61}.Debug.ActiveCfg = Debug|Win32 + {DB312A49-12A9-4E07-9E96-451DC2D8FF61}.Debug.Build.0 = Debug|Win32 + {DB312A49-12A9-4E07-9E96-451DC2D8FF61}.Release.ActiveCfg = Release|Win32 + {DB312A49-12A9-4E07-9E96-451DC2D8FF61}.Release.Build.0 = Release|Win32 EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution EndGlobalSection diff --git a/icuSources/common/Makefile.in b/icuSources/common/Makefile.in index 702c349e..5679e0db 100644 --- a/icuSources/common/Makefile.in +++ b/icuSources/common/Makefile.in @@ -1,10 +1,10 @@ #****************************************************************************** # -# Copyright (C) 1999-2003, International Business Machines +# Copyright (C) 1999-2004, International Business Machines # Corporation and others. All Rights Reserved. # #****************************************************************************** -## Makefile.in for ICU - icu.so +## Makefile.in for ICU - icuuc.so ## Stephen F. Booth ## Source directory information @@ -20,20 +20,24 @@ include $(top_builddir)/icudefs.mk subdir = common ## Extra files to remove for 'make clean' -CLEANFILES = *~ $(DEPS) +CLEANFILES = *~ $(DEPS) $(IMPORT_LIB) $(MIDDLE_IMPORT_LIB) $(FINAL_IMPORT_LIB) ## Target information -TARGET_STUBNAME=uc +TARGET_STUBNAME=$(COMMON_STUBNAME) ifneq ($(ENABLE_STATIC),) -TARGET = $(LIBICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX).a +TARGET = $(LIBDIR)/$(LIBSICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX).$(A) endif ifneq ($(ENABLE_SHARED),) -SO_TARGET = $(LIBICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX).$(SO) +SO_TARGET = $(LIBDIR)/$(LIBICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX).$(SO) ALL_SO_TARGETS = $(SO_TARGET) $(MIDDLE_SO_TARGET) $(FINAL_SO_TARGET) +ifeq ($(ENABLE_SO_VERSION_DATA),1) +SO_VERSION_DATA = common.res +endif + ifeq ($(OS390BATCH),1) BATCH_TARGET = $(BATCH_COMMON_TARGET) BATCH_LIBS = $(BATCH_LIBICUDT) -lm @@ -47,29 +51,32 @@ DYNAMICCPPFLAGS = $(SHAREDLIBCPPFLAGS) DYNAMICCFLAGS = $(SHAREDLIBCFLAGS) DYNAMICCXXFLAGS = $(SHAREDLIBCXXFLAGS) -CPPFLAGS += -I. -I$(srcdir) $(LIBCPPFLAGS) +LDFLAGS += $(LDFLAGSICUUC) +CPPFLAGS += -I. -I$(srcdir) -I$(top_srcdir)/i18n $(LIBCPPFLAGS) DEFS += -DU_COMMON_IMPLEMENTATION # $(LIBICUDT) is either stub data or the real DLL common data. LIBS = $(LIBICUDT) $(DEFAULT_LIBS) -OBJECTS = putil.o uobject.o locmap.o mutex.o umutex.o \ -udata.o ucmndata.o udatamem.o umapfile.o filestrm.o \ -uresbund.o uresdata.o resbund.o cwchar.o uloc.o locid.o uhash.o uhash_us.o \ -ucnv.o ucnv_bld.o ucnv_cb.o ucnv_cnv.o ucnv_err.o ucnv_io.o ucnvlat1.o \ -ucnv_u7.o ucnv_u8.o ucnv_u16.o ucnv_u32.o \ -ucnvmbcs.o ucnv2022.o ucnvhz.o ucnv_lmb.o ucnvscsu.o \ -ucnvbocu.o ucnvisci.o \ -unistr.o utf_impl.o ustring.o ustrcase.o cstring.o ustrfmt.o ustrtrns.o \ -normlzr.o unorm.o unorm_it.o chariter.o schriter.o uchriter.o uiter.o \ -uchar.o uprops.o propname.o ubidi.o ubidiwrt.o ubidiln.o ushape.o unames.o \ -ucln_cmn.o uscript.o usc_impl.o umemstrm.o ucmp8.o uvector.o uvectr32.o digitlst.o \ +OBJECTS = putil.o utypes.o uobject.o cmemory.o umutex.o ucln_cmn.o uinit.o \ +udata.o ucmndata.o udatamem.o udataswp.o umapfile.o ucol_swp.o \ +uresbund.o ures_cnv.o uresdata.o resbund.o resbund_cnv.o \ +ucat.o locmap.o uloc.o locid.o \ +uhash.o uhash_us.o \ +ucnv.o ucnv_set.o ucnv_bld.o ucnv_cb.o ucnv_cnv.o ucnv_err.o ucnv_ext.o ucnv_io.o ucnvlat1.o \ +ucnv_u7.o ucnv_u8.o ucnv_u16.o ucnv_u32.o ucnvscsu.o ucnvbocu.o \ +ucnvmbcs.o ucnv2022.o ucnvhz.o ucnv_lmb.o ucnvisci.o ucnvdisp.o \ +unistr.o unistr_case.o unistr_cnv.o unistr_props.o \ +utf_impl.o ustring.o ustr_cnv.o ustrcase.o cstring.o ustrfmt.o ustrtrns.o ustr_wcs.o uinvchar.o \ +normlzr.o unorm.o unormcmp.o unorm_it.o chariter.o schriter.o uchriter.o uiter.o \ +uchar.o uprops.o ucase.o propname.o ubidi.o ubidiwrt.o ubidiln.o ushape.o unames.o \ +uscript.o usc_impl.o uvector.o ustack.o uvectr32.o ucmp8.o \ +uarrsort.o utrie.o uset.o uset_props.o uniset.o uniset_props.o ruleiter.o caniter.o unifilt.o unifunct.o usetiter.o \ brkiter.o brkdict.o ubrk.o dbbi.o dbbi_tbl.o \ rbbi.o rbbidata.o rbbinode.o rbbirb.o rbbiscan.o rbbisetb.o rbbistbl.o rbbitblb.o \ -utrie.o uset.o cmemory.o caniter.o \ -unifilt.o unifunct.o uniset.o usetiter.o util.o uenum.o \ -icuserv.o iculserv.o icunotif.o ustrenum.o \ -uidna.o strprep.o nameprep.o punycode.o ucat.o +icuserv.o iculserv.o icunotif.o uenum.o ustrenum.o \ +uidna.o usprep.o punycode.o \ +cwchar.o filestrm.o util.o parsepos.o utrace.o locbased.o STATIC_OBJECTS = $(OBJECTS:.o=.$(STATIC_O)) @@ -103,22 +110,24 @@ install-local: install-headers install-library install-library: all-local $(MKINSTALLDIRS) $(DESTDIR)$(libdir) ifneq ($(ENABLE_STATIC),) - $(INSTALL-L) $(TARGET) $(DESTDIR)$(libdir)/$(TARGET) + $(INSTALL-L) $(TARGET) $(DESTDIR)$(libdir) endif ifneq ($(ENABLE_SHARED),) - $(INSTALL-L) $(FINAL_SO_TARGET) $(DESTDIR)$(libdir)/$(FINAL_SO_TARGET) + $(INSTALL-L) $(FINAL_SO_TARGET) $(DESTDIR)$(libdir) ifneq ($(FINAL_SO_TARGET),$(SO_TARGET)) - cd $(DESTDIR)$(libdir) && $(RM) $(SO_TARGET) && ln -s $(FINAL_SO_TARGET) $(SO_TARGET) + cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(SO_TARGET)) && ln -s $(notdir $(FINAL_SO_TARGET)) $(notdir $(SO_TARGET)) ifneq ($(FINAL_SO_TARGET),$(MIDDLE_SO_TARGET)) - cd $(DESTDIR)$(libdir) && $(RM) $(MIDDLE_SO_TARGET) && ln -s $(FINAL_SO_TARGET) $(MIDDLE_SO_TARGET) + cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(MIDDLE_SO_TARGET)) && ln -s $(notdir $(FINAL_SO_TARGET)) $(notdir $(MIDDLE_SO_TARGET)) endif endif endif ifneq ($(IMPORT_LIB_EXT),) - $(INSTALL-L) $(FINAL_IMPORT_LIB) $(DESTDIR)$(libdir)/$(FINAL_IMPORT_LIB) - cd $(DESTDIR)$(libdir) && $(RM) $(IMPORT_LIB) && ln -s $(FINAL_IMPORT_LIB) $(IMPORT_LIB) + $(INSTALL-L) $(FINAL_IMPORT_LIB) $(DESTDIR)$(libdir) +ifneq ($(IMPORT_LIB),$(FINAL_IMPORT_LIB)) + cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(IMPORT_LIB)) && ln -s $(notdir $(FINAL_IMPORT_LIB)) $(notdir $(IMPORT_LIB)) +endif ifneq ($(MIDDLE_IMPORT_LIB),$(FINAL_IMPORT_LIB)) - cd $(DESTDIR)$(libdir) && $(RM) $(MIDDLE_IMPORT_LIB) && ln -s $(FINAL_IMPORT_LIB) $(MIDDLE_IMPORT_LIB) + cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(MIDDLE_IMPORT_LIB)) && ln -s $(notdir $(FINAL_IMPORT_LIB)) $(notdir $(MIDDLE_IMPORT_LIB)) endif endif @@ -133,7 +142,7 @@ dist-local: clean-local: test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES) - $(RMV) $(OBJECTS) $(STATIC_OBJECTS) $(ALL_TARGETS) + $(RMV) $(OBJECTS) $(STATIC_OBJECTS) $(ALL_TARGETS) $(SO_VERSION_DATA) distclean-local: clean-local $(RMV) Makefile icucfg.h unicode/platform.h @@ -154,7 +163,7 @@ $(TARGET): $(TARGET)($(STATIC_OBJECTS)) endif ifneq ($(ENABLE_SHARED),) -$(FINAL_SO_TARGET): $(OBJECTS) +$(FINAL_SO_TARGET): $(OBJECTS) $(SO_VERSION_DATA) $(SHLIB.cc) $(LD_SONAME) $(OUTOPT)$@ $^ $(LIBS) ifeq ($(OS390BATCH),1) diff --git a/icuSources/common/brkdict.cpp b/icuSources/common/brkdict.cpp index 6fc6cc66..68875b97 100644 --- a/icuSources/common/brkdict.cpp +++ b/icuSources/common/brkdict.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2000 IBM and others. All rights reserved. +* Copyright (C) 1999-2004 IBM and others. All rights reserved. ********************************************************************** * Date Name Description * 12/1/99 rtg Ported from Java @@ -12,7 +12,7 @@ #if !UCONFIG_NO_BREAK_ITERATION -#include "unicode/resbund.h" +#include "unicode/ures.h" #include "brkdict.h" #include "cmemory.h" @@ -32,25 +32,16 @@ BreakDictionary::BreakDictionary(const char* /*dictionaryFilename*/, UErrorCode& { if (U_FAILURE(status)) return; - ResourceBundle th((char *)0, Locale("th"), status); - - if (U_FAILURE(status)) return; - - ResourceBundle th_dict = th.get("BreakDictionaryData", status); + UResourceBundle *th_dict = ures_open(NULL, "th", &status); + th_dict = ures_getByKey(th_dict, "BreakDictionaryData", th_dict, &status); if (U_FAILURE(status)) return; int32_t len; - const uint8_t * data = th_dict.getBinary(len, status); + const uint8_t * data = ures_getBinary(th_dict, &len, &status); + ures_close(th_dict); if (U_FAILURE(status)) return; - UMemoryStream* dictionaryStream = uprv_mstrm_openBuffer(data, len); - - if (dictionaryStream == 0) { - status = U_FILE_ACCESS_ERROR; - return; - } - readDictionaryFile(dictionaryStream); - uprv_mstrm_close(dictionaryStream); + readDictionaryFile(data); } BreakDictionary::~BreakDictionary() @@ -75,8 +66,13 @@ BreakDictionary::~BreakDictionary() #define SWAP16(x) x = (uint16_t)((x << 8 & 0xff00) | (x >> 8 & 0xff)) #endif +#define DICTIONARY_READ(source, destAddr, len) \ + uprv_memcpy(destAddr, source, len);\ + source+=(len) + + void -BreakDictionary::readDictionaryFile(UMemoryStream* in) +BreakDictionary::readDictionaryFile(const uint8_t * in) { int32_t l; int32_t version; @@ -84,65 +80,65 @@ BreakDictionary::readDictionaryFile(UMemoryStream* in) int i; // read in the version number (right now we just ignore it) - uprv_mstrm_read(in, &version, 4); + DICTIONARY_READ(in, &version, 4); // read in the column map (this is serialized in its internal form: // an index array followed by a data array) - uprv_mstrm_read(in, &l, 4); + DICTIONARY_READ(in, &l, 4); SWAP32(l); uint16_t* temp = (uint16_t*) uprv_malloc(sizeof(uint16_t)*l); - uprv_mstrm_read(in, temp, l * sizeof (int16_t) ); + DICTIONARY_READ(in, temp, l * sizeof (int16_t) ); for (i = 0; i < l; i++) { SWAP16(temp[i]); } - uprv_mstrm_read(in, &l, 4); + DICTIONARY_READ(in, &l, 4); SWAP32(l); int8_t* temp2 = (int8_t*) uprv_malloc(sizeof(int8_t)*l); - uprv_mstrm_read(in, temp2, l); + DICTIONARY_READ(in, temp2, l); columnMap = ucmp8_openAdopt(temp, temp2, l); // read in numCols and numColGroups - uprv_mstrm_read(in, &numCols, 4); + DICTIONARY_READ(in, &numCols, 4); SWAP32(numCols); - uprv_mstrm_read(in, &numColGroups, 4); + DICTIONARY_READ(in, &numColGroups, 4); SWAP32(numColGroups); // read in the row-number index - uprv_mstrm_read(in, &l, 4); + DICTIONARY_READ(in, &l, 4); SWAP32(l); rowIndex = (int16_t *)uprv_malloc(l*2); - uprv_mstrm_read(in, rowIndex, l * sizeof (int16_t) ); + DICTIONARY_READ(in, rowIndex, l * sizeof (int16_t) ); for (i = 0; i < l; i++) { SWAP16(rowIndex[i]); } // load in the populated-cells bitmap: index first, then bitmap list - uprv_mstrm_read(in, &l, 4); + DICTIONARY_READ(in, &l, 4); SWAP32(l); rowIndexFlagsIndex = (int16_t *)uprv_malloc(l*2); - uprv_mstrm_read(in, rowIndexFlagsIndex, l * sizeof(int16_t) ); + DICTIONARY_READ(in, rowIndexFlagsIndex, l * sizeof(int16_t) ); for (i = 0; i < l; i++) { SWAP16(rowIndexFlagsIndex[i]); } - uprv_mstrm_read(in, &l, 4); + DICTIONARY_READ(in, &l, 4); SWAP32(l); rowIndexFlags = (int32_t *)uprv_malloc(l*4); - uprv_mstrm_read(in, rowIndexFlags, l * sizeof(int32_t)); + DICTIONARY_READ(in, rowIndexFlags, l * sizeof(int32_t)); for (i = 0; i < l; i++) { SWAP32(rowIndexFlags[i]); } // load in the row-shift index - uprv_mstrm_read(in, &l, 4); + DICTIONARY_READ(in, &l, 4); SWAP32(l); rowIndexShifts = (int8_t *)uprv_malloc(l); - uprv_mstrm_read(in, rowIndexShifts, l); + DICTIONARY_READ(in, rowIndexShifts, l); // finally, load in the actual state table - uprv_mstrm_read(in, &l, 4); + DICTIONARY_READ(in, &l, 4); SWAP32(l); table = (int16_t *)uprv_malloc(l*2); - uprv_mstrm_read(in, table, l * sizeof(int16_t) ); + DICTIONARY_READ(in, table, l * sizeof(int16_t) ); for (i = 0; i < l; i++) { SWAP16(table[i]); } diff --git a/icuSources/common/brkdict.h b/icuSources/common/brkdict.h index 3daaf4fc..87a6fd74 100644 --- a/icuSources/common/brkdict.h +++ b/icuSources/common/brkdict.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2000 IBM and others. All rights reserved. +* Copyright (C) 1999-2004 IBM and others. All rights reserved. ********************************************************************** * Date Name Description * 12/1/99 rtg Ported from Java @@ -14,7 +14,6 @@ #include "unicode/utypes.h" #include "unicode/uobject.h" #include "ucmp8.h" -#include "umemstrm.h" U_NAMESPACE_BEGIN @@ -118,7 +117,7 @@ public: * representation. * @param in The given memory stream */ - void readDictionaryFile(UMemoryStream* in); + void readDictionaryFile(const uint8_t * in); //================================================================================= // access to the words diff --git a/icuSources/common/brkiter.cpp b/icuSources/common/brkiter.cpp index 8db038ff..835711d4 100644 --- a/icuSources/common/brkiter.cpp +++ b/icuSources/common/brkiter.cpp @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 1997-2001, International Business Machines Corporation and * +* Copyright (C) 1997-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* * @@ -25,10 +25,13 @@ #include "unicode/dbbi.h" #include "unicode/brkiter.h" #include "unicode/udata.h" -#include "unicode/resbund.h" +#include "unicode/ures.h" +#include "ucln_cmn.h" #include "cstring.h" #include "mutex.h" #include "iculserv.h" +#include "locbased.h" +#include "uresimp.h" // ***************************************************************************** // class BreakIterator @@ -43,225 +46,150 @@ const int32_t BreakIterator::DONE = (int32_t)-1; // ------------------------------------- -// Creates a break iterator for word breaks. -BreakIterator* -BreakIterator::createWordInstance(const Locale& key, UErrorCode& status) -{ - return createInstance(key, UBRK_WORD, status); -} - BreakIterator* -BreakIterator::makeWordInstance(const Locale& key, UErrorCode& status) +BreakIterator::buildInstance(const Locale& loc, const char *type, UBool dict, UErrorCode &status) { - // WARNING: This routine is currently written specifically to handle only the - // default rules files and the alternate rules files for Thai. This function - // will have to be made fully general at some time in the future! - BreakIterator* result = NULL; - const char* filename = "word"; - + char fnbuff[256]; + char actualLocale[ULOC_FULLNAME_CAPACITY]; + int32_t size; + const UChar* brkfname = NULL; + UResourceBundle brkRulesStack, brkNameStack; + UResourceBundle *brkRules = &brkRulesStack, *brkName = &brkNameStack; + BreakIterator *result = NULL; + if (U_FAILURE(status)) return NULL; - if (!uprv_strcmp(key.getLanguage(), "th")) - { - filename = "word_th"; + ures_initStackObject(brkRules); + ures_initStackObject(brkName); + + // Get the locale + UResourceBundle *b = ures_open(NULL, loc.getName(), &status); + + // Get the "boundaries" array. + if (U_SUCCESS(status)) { + brkRules = ures_getByKeyWithFallback(b, "boundaries", brkRules, &status); + // Get the string object naming the rules file + brkName = ures_getByKeyWithFallback(brkRules, type, brkName, &status); + // Get the actual string + brkfname = ures_getString(brkName, &size, &status); + + // Use the string if we found it + if (U_SUCCESS(status) && brkfname) { + uprv_strncpy(actualLocale, + ures_getLocale(brkName, &status), + sizeof(actualLocale)/sizeof(actualLocale[0])); + u_UCharsToChars(brkfname, fnbuff, size+1); + } } - UDataMemory* file = udata_open(NULL, "brk", filename, &status); + ures_close(brkRules); + ures_close(brkName); + + UDataMemory* file = udata_open(NULL, "brk", fnbuff, &status); if (U_FAILURE(status)) { + ures_close(b); return NULL; } - // The UDataMemory is adopted by the break iterator. - if(!uprv_strcmp(filename, "word_th")) { - filename = "thaidict.brk"; - result = new DictionaryBasedBreakIterator(file, filename, status); + // We found the break rules; now see if a dictionary is needed + if (dict) + { + UErrorCode localStatus = U_ZERO_ERROR; + brkName = &brkNameStack; + ures_initStackObject(brkName); + brkName = ures_getByKeyWithFallback(b, "BreakDictionaryData", brkName, &localStatus); +#if 0 + if (U_SUCCESS(localStatus)) { + brkfname = ures_getString(&brkname, &size, &localStatus); + } +#endif + if (U_SUCCESS(localStatus)) { +#if 0 + u_UCharsToChars(brkfname, fnbuff, size); + fnbuff[size] = '\0'; +#endif + result = new DictionaryBasedBreakIterator(file, "thaidict.brk", status); + } + ures_close(brkName); } - else { + + // If there is still no result but we haven't had an error, no dictionary, + // so make a non-dictionary break iterator + if (U_SUCCESS(status) && result == NULL) { result = new RuleBasedBreakIterator(file, status); } - if (result == NULL) { - udata_close(file); - status = U_MEMORY_ALLOCATION_ERROR; + + // If there is a result, set the valid locale and actual locale + if (U_SUCCESS(status) && result != NULL) { + U_LOCALE_BASED(locBased, *result); + locBased.setLocaleIDs(ures_getLocaleByType(b, ULOC_VALID_LOCALE, &status), actualLocale); } - if (U_FAILURE(status)) { // Sometimes redundant check, but simple. + + ures_close(b); + + if (U_FAILURE(status) && result != NULL) { // Sometimes redundant check, but simple delete result; - result = NULL; + return NULL; + } + + if (result == NULL) { + udata_close(file); + if (U_SUCCESS(status)) { + status = U_MEMORY_ALLOCATION_ERROR; + } } return result; } +// Creates a break iterator for word breaks. +BreakIterator* U_EXPORT2 +BreakIterator::createWordInstance(const Locale& key, UErrorCode& status) +{ + return createInstance(key, UBRK_WORD, status); +} + // ------------------------------------- // Creates a break iterator for line breaks. -BreakIterator* +BreakIterator* U_EXPORT2 BreakIterator::createLineInstance(const Locale& key, UErrorCode& status) { - return createInstance(key, UBRK_LINE, status); -} - -BreakIterator* -BreakIterator::makeLineInstance(const Locale& key, UErrorCode& status) -{ - // WARNING: This routine is currently written specifically to handle only the - // default rules files and the alternate rules files for Thai. This function - // will have to be made fully general at some time in the future! - BreakIterator* result = NULL; - const char* filename = "line"; - - if (U_FAILURE(status)) - return NULL; - - if (!uprv_strcmp(key.getLanguage(), "th")) - { - filename = "line_th"; - } - - UDataMemory* file = udata_open(NULL, "brk", filename, &status); - if (U_FAILURE(status)) { - return NULL; - } - // The UDataMemory is adopted by the break iterator. - - if (!uprv_strcmp(key.getLanguage(), "th")) { - filename = "thaidict.brk"; - result = new DictionaryBasedBreakIterator(file, filename, status); - } - else { - result = new RuleBasedBreakIterator(file, status); - } - if (result == NULL) { - udata_close(file); - status = U_MEMORY_ALLOCATION_ERROR; - } - if (U_FAILURE(status)) { // Sometimes redundant check, but simple. - delete result; - result = NULL; - } - return result; + return createInstance(key, UBRK_LINE, status); } // ------------------------------------- // Creates a break iterator for character breaks. -BreakIterator* +BreakIterator* U_EXPORT2 BreakIterator::createCharacterInstance(const Locale& key, UErrorCode& status) { - return createInstance(key, UBRK_CHARACTER, status); -} - -BreakIterator* -BreakIterator::makeCharacterInstance(const Locale& /* key */, UErrorCode& status) -{ - // WARNING: This routine is currently written specifically to handle only the - // default rules files and the alternate rules files for Thai. This function - // will have to be made fully general at some time in the future! - BreakIterator* result = NULL; - static const char filename[] = "char"; - - if (U_FAILURE(status)) - return NULL; - UDataMemory* file = udata_open(NULL, "brk", filename, &status); - if (U_FAILURE(status)) { - return NULL; - } - // The UDataMemory is adopted by the break iterator. - - result = new RuleBasedBreakIterator(file, status); - if (result == NULL) { - udata_close(file); - status = U_MEMORY_ALLOCATION_ERROR; - } - if (U_FAILURE(status)) { // Sometimes redundant check, but simple. - delete result; - result = NULL; - } - return result; + return createInstance(key, UBRK_CHARACTER, status); } // ------------------------------------- // Creates a break iterator for sentence breaks. -BreakIterator* +BreakIterator* U_EXPORT2 BreakIterator::createSentenceInstance(const Locale& key, UErrorCode& status) { - return createInstance(key, UBRK_SENTENCE, status); -} - -BreakIterator* -BreakIterator::makeSentenceInstance(const Locale& /*key */, UErrorCode& status) -{ - // WARNING: This routine is currently written specifically to handle only the - // default rules files and the alternate rules files for Thai. This function - // will have to be made fully general at some time in the future! - BreakIterator* result = NULL; - static const char filename[] = "sent"; - - if (U_FAILURE(status)) - return NULL; - UDataMemory* file = udata_open(NULL, "brk", filename, &status); - if (U_FAILURE(status)) { - return NULL; - } - // The UDataMemory is adopted by the break iterator. - - result = new RuleBasedBreakIterator(file, status); - if (result == NULL) { - udata_close(file); - status = U_MEMORY_ALLOCATION_ERROR; - } - if (U_FAILURE(status)) { // Sometimes redundant check, but simple. - delete result; - result = NULL; - } - - return result; + return createInstance(key, UBRK_SENTENCE, status); } // ------------------------------------- // Creates a break iterator for title casing breaks. -BreakIterator* +BreakIterator* U_EXPORT2 BreakIterator::createTitleInstance(const Locale& key, UErrorCode& status) { - return createInstance(key, UBRK_TITLE, status); -} - -BreakIterator* -BreakIterator::makeTitleInstance(const Locale& /* key */, UErrorCode& status) -{ - // WARNING: This routine is currently written specifically to handle only the - // default rules files. This function will have to be made fully general - // at some time in the future! - BreakIterator* result = NULL; - static const char filename[] = "title"; - - if (U_FAILURE(status)) - return NULL; - UDataMemory* file = udata_open(NULL, "brk", filename, &status); - if (U_FAILURE(status)) { - return NULL; - } - // The UDataMemory is adopted by the break iterator. - - result = new RuleBasedBreakIterator(file, status); - if (result == NULL) { - udata_close(file); - status = U_MEMORY_ALLOCATION_ERROR; - } - if (U_FAILURE(status)) { // Sometimes redundant check, but simple. - delete result; - result = NULL; - } - - return result; + return createInstance(key, UBRK_TITLE, status); } // ------------------------------------- // Gets all the available locales that has localized text boundary data. -const Locale* +const Locale* U_EXPORT2 BreakIterator::getAvailableLocales(int32_t& count) { return Locale::getAvailableLocales(count); @@ -269,7 +197,7 @@ BreakIterator::getAvailableLocales(int32_t& count) // ------------------------------------- // Gets the objectLocale display name in the default locale language. -UnicodeString& +UnicodeString& U_EXPORT2 BreakIterator::getDisplayName(const Locale& objectLocale, UnicodeString& name) { @@ -278,7 +206,7 @@ BreakIterator::getDisplayName(const Locale& objectLocale, // ------------------------------------- // Gets the objectLocale display name in the displayLocale language. -UnicodeString& +UnicodeString& U_EXPORT2 BreakIterator::getDisplayName(const Locale& objectLocale, const Locale& displayLocale, UnicodeString& name) @@ -295,6 +223,7 @@ BreakIterator::getDisplayName(const Locale& objectLocale, BreakIterator::BreakIterator() { fBufferClone = FALSE; + *validLocale = *actualLocale = 0; } BreakIterator::~BreakIterator() @@ -306,6 +235,7 @@ BreakIterator::~BreakIterator() // Registration // //------------------------------------------- +#if !UCONFIG_NO_SERVICE static ICULocaleService* gService = NULL; @@ -313,41 +243,61 @@ static ICULocaleService* gService = NULL; class ICUBreakIteratorFactory : public ICUResourceBundleFactory { protected: - virtual UObject* handleCreate(const Locale& loc, int32_t kind, const ICUService* service, UErrorCode& status) const { - return BreakIterator::makeInstance(loc, kind, status); - } + virtual UObject* handleCreate(const Locale& loc, int32_t kind, const ICUService* /*service*/, UErrorCode& status) const { + return BreakIterator::makeInstance(loc, kind, status); + } }; // ------------------------------------- class ICUBreakIteratorService : public ICULocaleService { public: - ICUBreakIteratorService() - : ICULocaleService("Break Iterator") - { - UErrorCode status = U_ZERO_ERROR; - registerFactory(new ICUBreakIteratorFactory(), status); - } - - virtual UObject* cloneInstance(UObject* instance) const { - return ((BreakIterator*)instance)->clone(); - } - - virtual UObject* handleDefault(const ICUServiceKey& key, UnicodeString* actualID, UErrorCode& status) const { - LocaleKey& lkey = (LocaleKey&)key; - int32_t kind = lkey.kind(); - Locale loc; - lkey.currentLocale(loc); - return BreakIterator::makeInstance(loc, kind, status); - } - - virtual UBool isDefault() const { - return countFactories() == 1; - } + ICUBreakIteratorService() + : ICULocaleService(UNICODE_STRING("Break Iterator", 14)) + { + UErrorCode status = U_ZERO_ERROR; + registerFactory(new ICUBreakIteratorFactory(), status); + } + + virtual UObject* cloneInstance(UObject* instance) const { + return ((BreakIterator*)instance)->clone(); + } + + virtual UObject* handleDefault(const ICUServiceKey& key, UnicodeString* /*actualID*/, UErrorCode& status) const { + LocaleKey& lkey = (LocaleKey&)key; + int32_t kind = lkey.kind(); + Locale loc; + lkey.currentLocale(loc); + return BreakIterator::makeInstance(loc, kind, status); + } + + virtual UBool isDefault() const { + return countFactories() == 1; + } }; // ------------------------------------- +U_NAMESPACE_END + +// defined in ucln_cmn.h + +/** + * Release all static memory held by breakiterator. + */ +U_CDECL_BEGIN +static UBool U_CALLCONV breakiterator_cleanup(void) { +#if !UCONFIG_NO_SERVICE + if (gService) { + delete gService; + gService = NULL; + } +#endif + return TRUE; +} +U_CDECL_END +U_NAMESPACE_BEGIN + static ICULocaleService* getService(void) { @@ -362,6 +312,7 @@ getService(void) if (gService == NULL) { gService = tService; tService = NULL; + ucln_common_registerCleanup(UCLN_COMMON_BREAKITERATOR, breakiterator_cleanup); } umtx_unlock(NULL); delete tService; @@ -374,37 +325,21 @@ getService(void) static UBool hasService(void) { - Mutex mutex; - return gService != NULL; + Mutex mutex; + return gService != NULL; } // ------------------------------------- -BreakIterator* -BreakIterator::createInstance(const Locale& loc, UBreakIteratorType kind, UErrorCode& status) -{ - if (U_FAILURE(status)) { - return NULL; - } - - if (hasService()) { - return (BreakIterator*)gService->get(loc, kind, status); - } else { - return makeInstance(loc, kind, status); - } -} - -// ------------------------------------- - -URegistryKey +URegistryKey U_EXPORT2 BreakIterator::registerInstance(BreakIterator* toAdopt, const Locale& locale, UBreakIteratorType kind, UErrorCode& status) { - return getService()->registerInstance(toAdopt, locale, kind, status); + return getService()->registerInstance(toAdopt, locale, kind, status); } // ------------------------------------- -UBool +UBool U_EXPORT2 BreakIterator::unregister(URegistryKey key, UErrorCode& status) { if (U_SUCCESS(status)) { @@ -418,44 +353,102 @@ BreakIterator::unregister(URegistryKey key, UErrorCode& status) // ------------------------------------- -StringEnumeration* +StringEnumeration* U_EXPORT2 BreakIterator::getAvailableLocales(void) { return getService()->getAvailableLocales(); } +#endif /* UCONFIG_NO_SERVICE */ + +// ------------------------------------- + +BreakIterator* +BreakIterator::createInstance(const Locale& loc, UBreakIteratorType kind, UErrorCode& status) +{ + if (U_FAILURE(status)) { + return NULL; + } + + u_init(&status); +#if !UCONFIG_NO_SERVICE + if (hasService()) { + Locale actualLoc; + BreakIterator *result = (BreakIterator*)gService->get(loc, kind, &actualLoc, status); + // TODO: The way the service code works in ICU 2.8 is that if + // there is a real registered break iterator, the actualLoc + // will be populated, but if the handleDefault path is taken + // (because nothing is registered that can handle the + // requested locale) then the actualLoc comes back empty. In + // that case, the returned object already has its actual/valid + // locale data populated (by makeInstance, which is what + // handleDefault calls), so we don't touch it. YES, A COMMENT + // THIS LONG is a sign of bad code -- so the action item is to + // revisit this in ICU 3.0 and clean it up/fix it/remove it. + if (U_SUCCESS(status) && (result != NULL) && *actualLoc.getName() != 0) { + U_LOCALE_BASED(locBased, *result); + locBased.setLocaleIDs(actualLoc.getName(), actualLoc.getName()); + } + return result; + } + else +#endif + { + return makeInstance(loc, kind, status); + } +} // ------------------------------------- BreakIterator* BreakIterator::makeInstance(const Locale& loc, int32_t kind, UErrorCode& status) { + + if (U_FAILURE(status)) { + return NULL; + } + + BreakIterator *result = NULL; switch (kind) { - case UBRK_CHARACTER: return BreakIterator::makeCharacterInstance(loc, status); - case UBRK_WORD: return BreakIterator::makeWordInstance(loc, status); - case UBRK_LINE: return BreakIterator::makeLineInstance(loc, status); - case UBRK_SENTENCE: return BreakIterator::makeSentenceInstance(loc, status); - case UBRK_TITLE: return BreakIterator::makeTitleInstance(loc, status); + case UBRK_CHARACTER: + result = BreakIterator::buildInstance(loc, "grapheme", FALSE, status); + break; + case UBRK_WORD: + result = BreakIterator::buildInstance(loc, "word", TRUE, status); + break; + case UBRK_LINE: + result = BreakIterator::buildInstance(loc, "line", TRUE, status); + break; + case UBRK_SENTENCE: + result = BreakIterator::buildInstance(loc, "sentence", FALSE, status); + break; + case UBRK_TITLE: + result = BreakIterator::buildInstance(loc, "title", FALSE, status); + break; default: - status = U_ILLEGAL_ARGUMENT_ERROR; - return NULL; + status = U_ILLEGAL_ARGUMENT_ERROR; } -} -U_NAMESPACE_END + if (U_FAILURE(status)) { + return NULL; + } -// defined in ucln_cmn.h + return result; +} -/** - * Release all static memory held by breakiterator. - */ -U_CFUNC UBool breakiterator_cleanup(void) { - if (gService) { - delete gService; - gService = NULL; - } - return TRUE; +Locale +BreakIterator::getLocale(ULocDataLocaleType type, UErrorCode& status) const { + U_LOCALE_BASED(locBased, *this); + return locBased.getLocale(type, status); +} + +const char * +BreakIterator::getLocaleID(ULocDataLocaleType type, UErrorCode& status) const { + U_LOCALE_BASED(locBased, *this); + return locBased.getLocaleID(type, status); } +U_NAMESPACE_END + #endif /* #if !UCONFIG_NO_BREAK_ITERATION */ //eof diff --git a/icuSources/common/caniter.cpp b/icuSources/common/caniter.cpp index 9db26ff5..db9328c9 100644 --- a/icuSources/common/caniter.cpp +++ b/icuSources/common/caniter.cpp @@ -1,6 +1,6 @@ /* ***************************************************************************** - * Copyright (C) 1996-2003, International Business Machines Corporation and * + * Copyright (C) 1996-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ***************************************************************************** */ @@ -80,7 +80,7 @@ U_NAMESPACE_BEGIN // TODO: add boilerplate methods. -const char CanonicalIterator::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(CanonicalIterator) /** *@param source string to get results for @@ -216,7 +216,7 @@ void CanonicalIterator::setSource(const UnicodeString &newSource, UErrorCode &st uprv_free(current); return; } - pieces[0][0] = UnicodeString(""); + pieces[0][0] = UnicodeString(); pieces_lengths = (int32_t*)uprv_malloc(1 * sizeof(int32_t)); /* test for NULL */ if (pieces_lengths == 0) { @@ -309,7 +309,7 @@ void CanonicalIterator::setSource(const UnicodeString &newSource, UErrorCode &st * @param source the string to find permutations for * @return the results in a set. */ -void CanonicalIterator::permute(UnicodeString &source, UBool skipZeros, Hashtable *result, UErrorCode &status) { +void U_EXPORT2 CanonicalIterator::permute(UnicodeString &source, UBool skipZeros, Hashtable *result, UErrorCode &status) { if(U_FAILURE(status)) { return; } @@ -332,7 +332,7 @@ void CanonicalIterator::permute(UnicodeString &source, UBool skipZeros, Hashtabl // otherwise iterate through the string, and recursively permute all the other characters UChar32 cp; - Hashtable *subpermute = new Hashtable(FALSE, status); + Hashtable *subpermute = new Hashtable(status); /* test for NULL */ if (subpermute == 0) { status = U_MEMORY_ALLOCATION_ERROR; @@ -396,7 +396,7 @@ void CanonicalIterator::permute(UnicodeString &source, UBool skipZeros, Hashtabl UnicodeString* CanonicalIterator::getEquivalents(const UnicodeString &segment, int32_t &result_len, UErrorCode &status) { //private String[] getEquivalents(String segment) - Hashtable *result = new Hashtable(FALSE, status); + Hashtable *result = new Hashtable(status); /* test for NULL */ if (result == 0) { status = U_MEMORY_ALLOCATION_ERROR; @@ -414,7 +414,7 @@ UnicodeString* CanonicalIterator::getEquivalents(const UnicodeString &segment, i // add only the ones that are canonically equivalent // TODO: optimize by not permuting any class zero. - Hashtable *permutations = new Hashtable(FALSE, status); + Hashtable *permutations = new Hashtable(status); /* test for NULL */ if (permutations == 0) { status = U_MEMORY_ALLOCATION_ERROR; @@ -509,7 +509,7 @@ UnicodeString* CanonicalIterator::getEquivalents(const UnicodeString &segment, i Hashtable *CanonicalIterator::getEquivalents2(const UChar *segment, int32_t segLen, UErrorCode &status) { //Hashtable *CanonicalIterator::getEquivalents2(const UnicodeString &segment, int32_t segLen, UErrorCode &status) { - Hashtable *result = new Hashtable(FALSE, status); + Hashtable *result = new Hashtable(status); /* test for NULL */ if (result == 0) { status = U_MEMORY_ALLOCATION_ERROR; @@ -592,14 +592,20 @@ Hashtable *CanonicalIterator::extract(UChar32 comp, const UChar *segment, int32_ int32_t bufLen = 0; UChar temp[bufSize]; - const int32_t decompSize = 64; - int32_t inputLen = 0; - UChar decomp[decompSize]; + int32_t inputLen = 0, decompLen; + UChar stackBuffer[4]; + const UChar *decomp; U16_APPEND_UNSAFE(temp, inputLen, comp); - int32_t decompLen = unorm_getDecomposition(comp, FALSE, decomp, decompSize); - if(decompLen < 0) { - decompLen = -decompLen; + decomp = unorm_getCanonicalDecomposition(comp, stackBuffer, &decompLen); + if(decomp == NULL) { + /* copy temp */ + stackBuffer[0] = temp[0]; + if(inputLen > 1) { + stackBuffer[1] = temp[1]; + } + decomp = stackBuffer; + decompLen = inputLen; } UChar *buff = temp+inputLen; @@ -668,7 +674,7 @@ Hashtable *CanonicalIterator::extract(UChar32 comp, const UChar *segment, int32_ //if (PROGRESS) printf("Matches\n"); if (bufLen == 0) { - Hashtable *result = new Hashtable(FALSE, status); + Hashtable *result = new Hashtable(status); /* test for NULL */ if (result == 0) { status = U_MEMORY_ALLOCATION_ERROR; diff --git a/icuSources/common/chariter.cpp b/icuSources/common/chariter.cpp index 064f5332..a598bd65 100644 --- a/icuSources/common/chariter.cpp +++ b/icuSources/common/chariter.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2002, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** */ @@ -9,6 +9,15 @@ U_NAMESPACE_BEGIN +ForwardCharacterIterator::~ForwardCharacterIterator() {} +ForwardCharacterIterator::ForwardCharacterIterator() +: UObject() +{} +ForwardCharacterIterator::ForwardCharacterIterator(const ForwardCharacterIterator &other) +: UObject(other) +{} + + CharacterIterator::CharacterIterator() : textLength(0), pos(0), begin(0), end(0) { } diff --git a/icuSources/common/charstr.h b/icuSources/common/charstr.h index 6666beb4..3f4302a1 100644 --- a/icuSources/common/charstr.h +++ b/icuSources/common/charstr.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (c) 2001, International Business Machines +* Copyright (c) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -8,6 +8,9 @@ ********************************************************************** */ +#ifndef CHARSTRING_H +#define CHARSTRING_H + #include "unicode/utypes.h" #include "unicode/uobject.h" #include "unicode/unistr.h" @@ -25,6 +28,15 @@ U_NAMESPACE_BEGIN class U_COMMON_API CharString : public UMemory { public: + +#if !UCONFIG_NO_CONVERSION + // Constructor + // @param str The unicode string to be converted to char * + // @param codepage The char * code page. "" for invariant conversion. + // NULL for default code page. + inline CharString(const UnicodeString& str, const char *codepage); +#endif + inline CharString(const UnicodeString& str); inline ~CharString(); inline operator const char*() const { return ptr; } @@ -37,14 +49,28 @@ private: CharString &operator=(const CharString &other); // forbid copying of this class }; +#if !UCONFIG_NO_CONVERSION + +inline CharString::CharString(const UnicodeString& str, const char *codepage) { + int32_t len; + ptr = buf; + len = str.extract(0, 0x7FFFFFFF, buf ,sizeof(buf)-1, codepage); + if (len >= (int32_t)(sizeof(buf)-1)) { + ptr = (char *)uprv_malloc(len+1); + str.extract(0, 0x7FFFFFFF, ptr, len+1, codepage); + } +} + +#endif + inline CharString::CharString(const UnicodeString& str) { - // Invariant converter should create str.length() chars - if (str.length() >= (int32_t)sizeof(buf)) { - ptr = (char *)uprv_malloc(str.length() + 8); - } else { - ptr = buf; + int32_t len; + ptr = buf; + len = str.extract(0, 0x7FFFFFFF, buf, (int32_t)(sizeof(buf)-1), US_INV); + if (len >= (int32_t)(sizeof(buf)-1)) { + ptr = (char *)uprv_malloc(len+1); + str.extract(0, 0x7FFFFFFF, ptr, len+1, US_INV); } - str.extract(0, 0x7FFFFFFF, ptr, ""); } inline CharString::~CharString() { @@ -55,4 +81,5 @@ inline CharString::~CharString() { U_NAMESPACE_END +#endif //eof diff --git a/icuSources/common/cmemory.c b/icuSources/common/cmemory.c index dadfb51e..45902dc9 100644 --- a/icuSources/common/cmemory.c +++ b/icuSources/common/cmemory.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 2002, International Business Machines +* Copyright (C) 2002-2003, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -19,14 +19,30 @@ ****************************************************************************** */ #include "cmemory.h" +#include "unicode/uclean.h" /* uprv_malloc(0) returns a pointer to this read-only data. */ static const int32_t zeroMem[] = {0, 0, 0, 0, 0, 0}; +/* Function Pointers for user-supplied heap functions */ +static const void *pContext; +static UMemAllocFn *pAlloc; +static UMemReallocFn *pRealloc; +static UMemFreeFn *pFree; + +/* Flag indicating whether any heap allocations have happened. + * Used to prevent changing out the heap functions after allocations have been made */ +static UBool gHeapInUse; + U_CAPI void * U_EXPORT2 uprv_malloc(size_t s) { if (s > 0) { - return malloc(s); + gHeapInUse = TRUE; + if (pAlloc) { + return (*pAlloc)(pContext, s); + } else { + return malloc(s); + } } else { return (void *)zeroMem; } @@ -37,17 +53,71 @@ uprv_realloc(void * buffer, size_t size) { if (buffer == zeroMem) { return uprv_malloc(size); } else if (size == 0) { - free(buffer); + if (pFree) { + (*pFree)(pContext, buffer); + } else { + free(buffer); + } return (void *)zeroMem; } else { - return realloc(buffer, size); + gHeapInUse = TRUE; + if (pRealloc) { + return (*pRealloc)(pContext, buffer, size); + } else { + return realloc(buffer, size); + } } } U_CAPI void U_EXPORT2 uprv_free(void *buffer) { if (buffer != zeroMem) { - free(buffer); + if (pFree) { + (*pFree)(pContext, buffer); + } else { + free(buffer); + } + } +} + +U_CAPI void U_EXPORT2 +u_setMemoryFunctions(const void *context, UMemAllocFn *a, UMemReallocFn *r, UMemFreeFn *f, UErrorCode *status) +{ + if (U_FAILURE(*status)) { + return; + } + if (a==NULL || r==NULL || f==NULL) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + if (gHeapInUse) { + *status = U_INVALID_STATE_ERROR; + return; } + pContext = context; + pAlloc = a; + pRealloc = r; + pFree = f; +} + + +U_CFUNC UBool cmemory_cleanup(void) { + pContext = NULL; + pAlloc = NULL; + pRealloc = NULL; + pFree = NULL; + gHeapInUse = FALSE; + return TRUE; +} + + +/* + * gHeapInUse + * Return True if ICU has allocated any memory. + * Used by u_SetMutexFunctions() and similar to verify that ICU has not + * been used, that it is in a pristine initial state. + */ +U_CFUNC UBool cmemory_inUse() { + return gHeapInUse; } diff --git a/icuSources/common/cmemory.h b/icuSources/common/cmemory.h index 89b51aac..ffcfa2db 100644 --- a/icuSources/common/cmemory.h +++ b/icuSources/common/cmemory.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1997-2001, International Business Machines +* Copyright (C) 1997-2003, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -65,4 +65,19 @@ typedef union { */ #define U_ALIGNMENT_OFFSET_UP(ptr) (sizeof(UAlignedMemory) - U_ALIGNMENT_OFFSET(ptr)) +/** + * Indicate whether the ICU allocation functions have been used. + * This is used to determine whether ICU is in an initial, unused state. + */ +U_CFUNC UBool +cmemory_inUse(void); + +/** + * Heap clean up function, called from u_cleanup() + * Clears any user heap functions from u_setMemoryFunctions() + * Does NOT deallocate any remaining allocated memory. + */ +U_CFUNC UBool +cmemory_cleanup(void); + #endif diff --git a/icuSources/common/common.dsp b/icuSources/common/common.dsp index fd58be56..eeabc7f2 100644 --- a/icuSources/common/common.dsp +++ b/icuSources/common/common.dsp @@ -55,7 +55,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 icudata.lib kernel32.lib user32.lib advapi32.lib shell32.lib /nologo /base:"0x4a800000" /dll /machine:I386 /out:"..\..\bin\icuuc26.dll" /implib:"..\..\lib\icuuc.lib" /libpath:"..\..\lib" +# ADD LINK32 icudt.lib kernel32.lib user32.lib advapi32.lib shell32.lib /nologo /base:"0x4a800000" /dll /machine:I386 /out:"..\..\bin\icuuc32.dll" /implib:"..\..\lib\icuuc.lib" /libpath:"..\..\lib" # SUBTRACT LINK32 /pdb:none /debug !ELSEIF "$(CFG)" == "common - Win32 Debug" @@ -82,7 +82,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 icudata.lib kernel32.lib user32.lib advapi32.lib shell32.lib /nologo /base:"0x4a800000" /dll /debug /machine:I386 /out:"..\..\bin\icuuc26d.dll" /implib:"..\..\lib\icuucd.lib" /pdbtype:sept /libpath:"..\..\lib" +# ADD LINK32 icudt.lib kernel32.lib user32.lib advapi32.lib shell32.lib /nologo /base:"0x4a800000" /dll /debug /machine:I386 /out:"..\..\bin\icuuc32d.dll" /implib:"..\..\lib\icuucd.lib" /pdbtype:sept /libpath:"..\..\lib" # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "common - Win64 Release" @@ -99,7 +99,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMMON_EXPORTS" /FD /c -# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /D "NDEBUG" /D "WIN64" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMMON_EXPORTS" /D "U_COMMON_IMPLEMENTATION" /D "UDATA_STATIC_LIB" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /GF /QIA64_fmaopt /Zm600 /c +# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /Ob2 /D "NDEBUG" /D "WIN64" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMMON_EXPORTS" /D "U_COMMON_IMPLEMENTATION" /D "UDATA_STATIC_LIB" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /GF /Zm600 /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win64 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win64 # ADD BASE RSC /l 0x409 /d "NDEBUG" @@ -109,7 +109,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:IX86 /machine:IA64 -# ADD LINK32 icudata.lib kernel32.lib user32.lib advapi32.lib shell32.lib /nologo /base:"0x4a800000" /dll /machine:IX86 /out:"..\..\bin\icuuc26.dll" /implib:"..\..\lib\icuuc.lib" /libpath:"..\..\lib" /machine:IA64 +# ADD LINK32 icudt.lib kernel32.lib user32.lib advapi32.lib shell32.lib /nologo /base:"0x4a800000" /dll /machine:IX86 /out:"..\..\bin\icuuc32.dll" /implib:"..\..\lib\icuuc.lib" /libpath:"..\..\lib" /machine:IA64 # SUBTRACT LINK32 /debug !ELSEIF "$(CFG)" == "common - Win64 Debug" @@ -126,7 +126,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMMON_EXPORTS" /FD /GZ /c -# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "WIN64" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMMON_EXPORTS" /D "U_COMMON_IMPLEMENTATION" /D "UDATA_STATIC_LIB" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GF /GZ /QIA64_fmaopt /Zm600 /c +# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "WIN64" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMMON_EXPORTS" /D "U_COMMON_IMPLEMENTATION" /D "UDATA_STATIC_LIB" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GF /GZ /Zm600 /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win64 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win64 # ADD BASE RSC /l 0x409 /d "_DEBUG" @@ -136,7 +136,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:IX86 /pdbtype:sept /machine:IA64 -# ADD LINK32 icudata.lib kernel32.lib user32.lib advapi32.lib shell32.lib /nologo /base:"0x4a800000" /dll /incremental:no /debug /machine:IX86 /out:"..\..\bin\icuuc26d.dll" /implib:"..\..\lib\icuucd.lib" /pdbtype:sept /libpath:"..\..\lib" /machine:IA64 +# ADD LINK32 icudt.lib kernel32.lib user32.lib advapi32.lib shell32.lib /nologo /base:"0x4a800000" /dll /incremental:no /debug /machine:IX86 /out:"..\..\bin\icuuc32d.dll" /implib:"..\..\lib\icuucd.lib" /pdbtype:sept /libpath:"..\..\lib" /machine:IA64 !ENDIF @@ -542,6 +542,19 @@ InputPath=.\unicode\ubrk.h !ENDIF +# End Source File +# End Group +# Begin Group "collation" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\ucol_swp.c +# ADD CPP /I "..\i18n" +# End Source File +# Begin Source File + +SOURCE=.\ucol_swp.h # End Source File # End Group # Begin Group "collections" @@ -600,6 +613,14 @@ InputPath=.\unicode\strenum.h # End Source File # Begin Source File +SOURCE=.\uarrsort.c +# End Source File +# Begin Source File + +SOURCE=.\uarrsort.h +# End Source File +# Begin Source File + SOURCE=.\ucmp8.c # End Source File # Begin Source File @@ -675,6 +696,10 @@ SOURCE=.\uhash_us.cpp # End Source File # Begin Source File +SOURCE=.\ustack.cpp +# End Source File +# Begin Source File + SOURCE=.\ustrenum.cpp # End Source File # Begin Source File @@ -735,10 +760,6 @@ SOURCE=.\locmap.h # End Source File # Begin Source File -SOURCE=.\mutex.cpp -# End Source File -# Begin Source File - SOURCE=.\mutex.h # End Source File # Begin Source File @@ -893,6 +914,100 @@ InputPath=.\unicode\uconfig.h # End Source File # Begin Source File +SOURCE=.\unicode\udeprctd.h + +!IF "$(CFG)" == "common - Win32 Release" + +# Begin Custom Build +InputPath=.\unicode\udeprctd.h + +"..\..\include\unicode\udeprctd.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "common - Win32 Debug" + +# Begin Custom Build +InputPath=.\unicode\udeprctd.h + +"..\..\include\unicode\udeprctd.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "common - Win64 Release" + +# Begin Custom Build +InputPath=.\unicode\udeprctd.h + +"..\..\include\unicode\udeprctd.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "common - Win64 Debug" + +# Begin Custom Build +InputPath=.\unicode\udeprctd.h + +"..\..\include\unicode\udeprctd.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\unicode\udraft.h + +!IF "$(CFG)" == "common - Win32 Release" + +# Begin Custom Build +InputPath=.\unicode\udraft.h + +"..\..\include\unicode\udraft.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "common - Win32 Debug" + +# Begin Custom Build +InputPath=.\unicode\udraft.h + +"..\..\include\unicode\udraft.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "common - Win64 Release" + +# Begin Custom Build +InputPath=.\unicode\udraft.h + +"..\..\include\unicode\udraft.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "common - Win64 Debug" + +# Begin Custom Build +InputPath=.\unicode\udraft.h + +"..\..\include\unicode\udraft.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + SOURCE=.\unicode\umachine.h !IF "$(CFG)" == "common - Win32 Release" @@ -940,20 +1055,59 @@ InputPath=.\unicode\umachine.h # End Source File # Begin Source File -SOURCE=.\umemstrm.c +SOURCE=.\umutex.c +# ADD CPP /Ze # End Source File # Begin Source File -SOURCE=.\umemstrm.h +SOURCE=.\umutex.h # End Source File # Begin Source File -SOURCE=.\umutex.c -# ADD CPP /Ze -# End Source File -# Begin Source File +SOURCE=.\unicode\uobslete.h + +!IF "$(CFG)" == "common - Win32 Release" + +# Begin Custom Build +InputPath=.\unicode\uobslete.h + +"..\..\include\unicode\uobslete.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "common - Win32 Debug" + +# Begin Custom Build +InputPath=.\unicode\uobslete.h + +"..\..\include\unicode\uobslete.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "common - Win64 Release" + +# Begin Custom Build +InputPath=.\unicode\uobslete.h + +"..\..\include\unicode\uobslete.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "common - Win64 Debug" + +# Begin Custom Build +InputPath=.\unicode\uobslete.h + +"..\..\include\unicode\uobslete.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ENDIF -SOURCE=.\umutex.h # End Source File # Begin Source File @@ -1004,6 +1158,65 @@ InputPath=.\unicode\urename.h # End Source File # Begin Source File +SOURCE=.\utrace.c +# End Source File +# Begin Source File + +SOURCE=.\unicode\utrace.h + +!IF "$(CFG)" == "common - Win32 Release" + +# Begin Custom Build +InputPath=.\unicode\utrace.h + +"..\..\include\unicode\utrace.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "common - Win32 Debug" + +# Begin Custom Build +InputPath=.\unicode\utrace.h + +"..\..\include\unicode\utrace.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "common - Win64 Release" + +# Begin Custom Build +InputPath=.\unicode\utrace.h + +"..\..\include\unicode\utrace.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "common - Win64 Debug" + +# Begin Custom Build +InputPath=.\unicode\utrace.h + +"..\..\include\unicode\utrace.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\utracimp.h +# End Source File +# Begin Source File + +SOURCE=.\utypes.c +# End Source File +# Begin Source File + SOURCE=.\unicode\utypes.h !IF "$(CFG)" == "common - Win32 Release" @@ -1275,6 +1488,14 @@ InputPath=.\unicode\ucnv_err.h # End Source File # Begin Source File +SOURCE=.\ucnv_ext.c +# End Source File +# Begin Source File + +SOURCE=.\ucnv_ext.h +# End Source File +# Begin Source File + SOURCE=.\ucnv_imp.h # End Source File # Begin Source File @@ -1291,6 +1512,10 @@ SOURCE=.\ucnv_lmb.c # End Source File # Begin Source File +SOURCE=.\ucnv_set.c +# End Source File +# Begin Source File + SOURCE=.\ucnv_u16.c # End Source File # Begin Source File @@ -1311,6 +1536,10 @@ SOURCE=.\ucnvbocu.c # End Source File # Begin Source File +SOURCE=.\ucnvdisp.c +# End Source File +# Begin Source File + SOURCE=.\ucnvhz.c # End Source File # Begin Source File @@ -1474,6 +1703,18 @@ SOURCE=.\udatamem.h # End Source File # Begin Source File +SOURCE=.\udataswp.c +# End Source File +# Begin Source File + +SOURCE=.\udataswp.h +# End Source File +# Begin Source File + +SOURCE=.\uinit.c +# End Source File +# Begin Source File + SOURCE=.\umapfile.c # ADD CPP /Ze # End Source File @@ -1538,14 +1779,6 @@ InputPath=.\unicode\uobject.h # PROP Default_Filter "" # Begin Source File -SOURCE=.\digitlst.cpp -# End Source File -# Begin Source File - -SOURCE=.\digitlst.h -# End Source File -# Begin Source File - SOURCE=.\unicode\parseerr.h !IF "$(CFG)" == "common - Win32 Release" @@ -1593,6 +1826,10 @@ InputPath=.\unicode\parseerr.h # End Source File # Begin Source File +SOURCE=.\parsepos.cpp +# End Source File +# Begin Source File + SOURCE=.\unicode\parsepos.h !IF "$(CFG)" == "common - Win32 Release" @@ -1704,6 +1941,69 @@ SOURCE=.\util.cpp # Begin Source File SOURCE=.\util.h +# End Source File +# End Group +# Begin Group "idna" + +# PROP Default_Filter "*.c,*.h" +# Begin Source File + +SOURCE=.\punycode.c +# End Source File +# Begin Source File + +SOURCE=.\punycode.h +# End Source File +# Begin Source File + +SOURCE=.\uidna.cpp +# End Source File +# Begin Source File + +SOURCE=.\unicode\uidna.h + +!IF "$(CFG)" == "common - Win32 Release" + +# Begin Custom Build +InputPath=.\unicode\uidna.h + +"..\..\include\unicode\uidna.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "common - Win32 Debug" + +# Begin Custom Build +InputPath=.\unicode\uidna.h + +"..\..\include\unicode\uidna.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "common - Win64 Release" + +# Begin Custom Build +InputPath=.\unicode\uidna.h + +"..\..\include\unicode\uidna.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "common - Win64 Debug" + +# Begin Custom Build +InputPath=.\unicode\uidna.h + +"..\..\include\unicode\uidna.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ENDIF + # End Source File # End Group # Begin Group "locales & resources" @@ -1711,6 +2011,14 @@ SOURCE=.\util.h # PROP Default_Filter "" # Begin Source File +SOURCE=.\locbased.cpp +# End Source File +# Begin Source File + +SOURCE=.\locbased.h +# End Source File +# Begin Source File + SOURCE=.\locid.cpp # End Source File # Begin Source File @@ -1813,6 +2121,10 @@ InputPath=.\unicode\resbund.h # End Source File # Begin Source File +SOURCE=.\resbund_cnv.cpp +# End Source File +# Begin Source File + SOURCE=.\ucat.c # End Source File # Begin Source File @@ -1915,6 +2227,10 @@ InputPath=.\unicode\uloc.h # End Source File # Begin Source File +SOURCE=.\ulocimp.h +# End Source File +# Begin Source File + SOURCE=.\unicode\ures.h !IF "$(CFG)" == "common - Win32 Release" @@ -1962,6 +2278,10 @@ InputPath=.\unicode\ures.h # End Source File # Begin Source File +SOURCE=.\ures_cnv.c +# End Source File +# Begin Source File + SOURCE=.\uresbund.c # End Source File # Begin Source File @@ -2143,6 +2463,10 @@ SOURCE=.\unorm_it.h # End Source File # Begin Source File +SOURCE=.\unormcmp.cpp +# End Source File +# Begin Source File + SOURCE=.\unormimp.h # End Source File # End Group @@ -2159,7 +2483,66 @@ SOURCE=.\propname.h # End Source File # Begin Source File -SOURCE=.\symtable.h +SOURCE=.\ruleiter.cpp +# End Source File +# Begin Source File + +SOURCE=.\ruleiter.h +# End Source File +# Begin Source File + +SOURCE=.\unicode\symtable.h + +!IF "$(CFG)" == "common - Win32 Release" + +# Begin Custom Build +InputPath=.\unicode\symtable.h + +"..\..\include\unicode\symtable.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "common - Win32 Debug" + +# Begin Custom Build +InputPath=.\unicode\symtable.h + +"..\..\include\unicode\symtable.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "common - Win64 Release" + +# Begin Custom Build +InputPath=.\unicode\symtable.h + +"..\..\include\unicode\symtable.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "common - Win64 Debug" + +# Begin Custom Build +InputPath=.\unicode\symtable.h + +"..\..\include\unicode\symtable.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\ucase.c +# End Source File +# Begin Source File + +SOURCE=.\ucase.h # End Source File # Begin Source File @@ -2418,6 +2801,10 @@ InputPath=.\unicode\uniset.h # End Source File # Begin Source File +SOURCE=.\uniset_props.cpp +# End Source File +# Begin Source File + SOURCE=.\uprops.c # End Source File # Begin Source File @@ -2536,6 +2923,14 @@ InputPath=.\unicode\uset.h # End Source File # Begin Source File +SOURCE=.\uset_imp.h +# End Source File +# Begin Source File + +SOURCE=.\uset_props.cpp +# End Source File +# Begin Source File + SOURCE=.\usetiter.cpp # End Source File # Begin Source File @@ -2620,6 +3015,65 @@ SOURCE=.\icuserv.cpp # Begin Source File SOURCE=.\icuserv.h +# End Source File +# End Group +# Begin Group "sprep" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\sprpimpl.h +# End Source File +# Begin Source File + +SOURCE=.\usprep.cpp +# End Source File +# Begin Source File + +SOURCE=.\unicode\usprep.h + +!IF "$(CFG)" == "common - Win32 Release" + +# Begin Custom Build +InputPath=.\unicode\usprep.h + +"..\..\include\unicode\usprep.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "common - Win32 Debug" + +# Begin Custom Build +InputPath=.\unicode\usprep.h + +"..\..\include\unicode\usprep.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "common - Win64 Release" + +# Begin Custom Build +InputPath=.\unicode\usprep.h + +"..\..\include\unicode\usprep.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "common - Win64 Debug" + +# Begin Custom Build +InputPath=.\unicode\usprep.h + +"..\..\include\unicode\usprep.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ENDIF + # End Source File # End Group # Begin Group "strings" @@ -2847,6 +3301,14 @@ InputPath=.\unicode\uchriter.h # End Source File # Begin Source File +SOURCE=.\uinvchar.c +# End Source File +# Begin Source File + +SOURCE=.\uinvchar.h +# End Source File +# Begin Source File + SOURCE=.\uiter.cpp # End Source File # Begin Source File @@ -2949,6 +3411,18 @@ InputPath=.\unicode\unistr.h # End Source File # Begin Source File +SOURCE=.\unistr_case.cpp +# End Source File +# Begin Source File + +SOURCE=.\unistr_cnv.cpp +# End Source File +# Begin Source File + +SOURCE=.\unistr_props.cpp +# End Source File +# Begin Source File + SOURCE=.\unicode\urep.h !IF "$(CFG)" == "common - Win32 Release" @@ -2996,10 +3470,22 @@ InputPath=.\unicode\urep.h # End Source File # Begin Source File +SOURCE=.\ustr_cnv.c +# End Source File +# Begin Source File + +SOURCE=.\ustr_cnv.h +# End Source File +# Begin Source File + SOURCE=.\ustr_imp.h # End Source File # Begin Source File +SOURCE=.\ustr_wcs.c +# End Source File +# Begin Source File + SOURCE=.\ustrcase.c # End Source File # Begin Source File @@ -3295,65 +3781,6 @@ InputPath=.\unicode\utf_old.h !ENDIF -# End Source File -# End Group -# Begin Group "idna" - -# PROP Default_Filter "*.c,*.h" -# Begin Source File - -SOURCE=.\nameprep.cpp -# End Source File -# Begin Source File - -SOURCE=.\nameprep.h -# End Source File -# Begin Source File - -SOURCE=.\punycode.c -# End Source File -# Begin Source File - -SOURCE=.\punycode.h -# End Source File -# Begin Source File - -SOURCE=.\sprpimpl.h -# End Source File -# Begin Source File - -SOURCE=.\strprep.cpp -# End Source File -# Begin Source File - -SOURCE=.\strprep.h -# End Source File -# Begin Source File - -SOURCE=.\uidna.cpp -# End Source File -# Begin Source File - -SOURCE=.\unicode\uidna.h - -!IF "$(CFG)" == "common - Win32 Release" - -!ELSEIF "$(CFG)" == "common - Win32 Debug" - -# Begin Custom Build -InputPath=.\unicode\uidna.h - -"..\..\include\unicode\uidna.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - copy $(InputPath) ..\..\include\unicode - -# End Custom Build - -!ELSEIF "$(CFG)" == "common - Win64 Release" - -!ELSEIF "$(CFG)" == "common - Win64 Debug" - -!ENDIF - # End Source File # End Group # End Target diff --git a/icuSources/common/common.rc b/icuSources/common/common.rc index bf9c32fe..c3d9323b 100644 --- a/icuSources/common/common.rc +++ b/icuSources/common/common.rc @@ -1,25 +1,50 @@ -//Do not edit with Microsoft Developer Studio because it will modify this -//script in the wrong way. +// Do not edit with Microsoft Developer Studio Resource Editor. +// It will permanently substitute version numbers that are intended to be +// picked up by the pre-processor during each build. // Copyright (c) 2001-2003 International Business Machines // Corporation and others. All Rights Reserved. // +#include "msvcres.h" + #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // -#include "winresrc.h" - +#include ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// -// +// LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #pragma code_page(1252) -#include "unicode\uversion.h" +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "msvcres.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include \0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + ///////////////////////////////////////////////////////////////////////////// // @@ -55,7 +80,6 @@ BEGIN #else VALUE "OriginalFilename", "icuuc" U_ICU_VERSION_SHORT ".dll\0") #endif - VALUE "PrivateBuild", "\0" VALUE "ProductName", "International Components for Unicode\0" VALUE "ProductVersion", CommaVersionString(U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, 0) @@ -70,3 +94,15 @@ END ///////////////////////////////////////////////////////////////////////////// + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/icuSources/common/common.vcproj b/icuSources/common/common.vcproj index 67759405..46026cde 100644 --- a/icuSources/common/common.vcproj +++ b/icuSources/common/common.vcproj @@ -1,8 +1,9 @@ - + @@ -21,9 +22,9 @@ + TypeLibraryName=".\..\..\lib\icuuc.tlb"/> + + + + TypeLibraryName=".\..\..\lib\icuucd.tlb"/> + + + + + + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> @@ -209,17 +218,17 @@ Name="Release|Win32"> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + + + + + + + + + + + + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + + + @@ -377,17 +414,17 @@ Name="Release|Win32"> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + @@ -448,9 +488,6 @@ - - @@ -475,36 +512,39 @@ Name="Release|Win32"> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + RelativePath=".\unicode\udeprctd.h"> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + RelativePath=".\unicode\udraft.h"> + + + + + + + RelativePath=".\unicode\umachine.h"> + + + + + + @@ -572,42 +644,89 @@ + + + + + + + + + + + + + + + + + + + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + + + + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> @@ -642,17 +761,17 @@ Name="Release|Win32"> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + + + @@ -726,6 +851,9 @@ + + @@ -741,6 +869,9 @@ + + @@ -775,17 +906,17 @@ Name="Release|Win32"> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + + + + + + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> - - - - + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + + + + + + + + + + + + + + + + + + + @@ -963,17 +1138,17 @@ Name="Release|Win32"> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + @@ -1007,17 +1185,17 @@ Name="Release|Win32"> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + @@ -1086,17 +1270,17 @@ Name="Release|Win32"> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + @@ -1163,7 +1350,35 @@ RelativePath=".\propname.h"> + RelativePath=".\ruleiter.cpp"> + + + + + + + + + + + + + + @@ -1174,17 +1389,17 @@ Name="Release|Win32"> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + @@ -1296,17 +1514,17 @@ Name="Release|Win32"> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + + + @@ -1340,26 +1564,23 @@ Name="Release|Win32"> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> - - @@ -1372,9 +1593,6 @@ - - @@ -1382,6 +1600,35 @@ RelativePath=".\icuserv.h"> + + + + + + + + + + + + + + @@ -1394,17 +1641,17 @@ Name="Release|Win32"> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + + + @@ -1494,17 +1747,17 @@ Name="Release|Win32"> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + + + + + + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + + + + + @@ -1563,17 +1834,17 @@ Name="Release|Win32"> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> - - - - - - - - - - - - - - - - - - - - - - - + Outputs="..\..\include\unicode\$(InputFileName)"/> diff --git a/icuSources/common/cstring.c b/icuSources/common/cstring.c index f65c9e08..a5b2c6bb 100644 --- a/icuSources/common/cstring.c +++ b/icuSources/common/cstring.c @@ -22,9 +22,11 @@ #include +#include #include "unicode/utypes.h" #include "cmemory.h" #include "cstring.h" +#include "uassert.h" /* * We hardcode case conversion for invariant characters to match our expectation @@ -58,6 +60,17 @@ uprv_toupper(char c) { return c; } + +#if 0 +/* + * Commented out because cstring.h defines uprv_tolower() to be + * the same as either uprv_asciitolower() or uprv_ebcdictolower() + * to reduce the amount of code to cover with tests. + * + * Note that this uprv_tolower() definition is likely to work for most + * charset families, not just ASCII and EBCDIC, because its #else branch + * is written generically. + */ U_CAPI char U_EXPORT2 uprv_tolower(char c) { #if U_CHARSET_FAMILY==U_EBCDIC_FAMILY @@ -71,6 +84,26 @@ uprv_tolower(char c) { #endif return c; } +#endif + +U_CAPI char U_EXPORT2 +uprv_asciitolower(char c) { + if(0x41<=c && c<=0x5a) { + c=(char)(c+0x20); + } + return c; +} + +U_CAPI char U_EXPORT2 +uprv_ebcdictolower(char c) { + if( (0xc1<=(uint8_t)c && (uint8_t)c<=0xc9) || + (0xd1<=(uint8_t)c && (uint8_t)c<=0xd9) || + (0xe2<=(uint8_t)c && (uint8_t)c<=0xe9) + ) { + c=(char)(c-0x40); + } + return c; +} U_CAPI char* U_EXPORT2 @@ -104,44 +137,76 @@ T_CString_toUpperCase(char* str) /* * Takes a int32_t and fills in a char* string with that number "radix"-based. * Does not handle negative values (makes an empty string for them). - * Writes at most 11 chars ("2147483647" plus NUL). - * Returns the length of the string. + * Writes at most 12 chars ("-2147483647" plus NUL). + * Returns the length of the string (not including the NUL). */ U_CAPI int32_t U_EXPORT2 -T_CString_integerToString(char* buffer, int32_t i, int32_t radix) +T_CString_integerToString(char* buffer, int32_t v, int32_t radix) { - int32_t length; - int32_t num; - int8_t digit; - char temp; - - if(i<0) { - *buffer = 0; - return 0; - } - - length = 0; - while (i>=radix) - { - num = i/radix; - digit = (int8_t)(i - num*radix); - buffer[length++] = (char)(T_CString_itosOffset(digit)); - i = num; + char tbuf[30]; + int32_t tbx = sizeof(tbuf); + uint8_t digit; + int32_t length = 0; + uint32_t uval; + + U_ASSERT(radix>=2 && radix<=16); + uval = (uint32_t) v; + if(v<0 && radix == 10) { + /* Only in base 10 do we conside numbers to be signed. */ + uval = (uint32_t)(-v); + buffer[length++] = '-'; } - - buffer[length] = (char)(T_CString_itosOffset(i)); - buffer[++length] = '\0'; + + tbx = sizeof(tbuf)-1; + tbuf[tbx] = 0; /* We are generating the digits backwards. Null term the end. */ + do { + digit = (uint8_t)(uval % radix); + tbuf[--tbx] = (char)(T_CString_itosOffset(digit)); + uval = uval / radix; + } while (uval != 0); + + /* copy converted number into user buffer */ + uprv_strcpy(buffer+length, tbuf+tbx); + length += sizeof(tbuf) - tbx -1; + return length; +} - /* Reverses the string, swap digits at buffer[0]..buffer[num] */ - num = length - 1; - for (i = 0; i < num; ++i, --num) { - temp = buffer[num]; - buffer[num] = buffer[i]; - buffer[i] = temp; - } - return length; +/* + * Takes a int64_t and fills in a char* string with that number "radix"-based. + * Writes at most 21: chars ("-9223372036854775807" plus NUL). + * Returns the length of the string, not including the terminating NULL. + */ +U_CAPI int32_t U_EXPORT2 +T_CString_int64ToString(char* buffer, int64_t v, uint32_t radix) +{ + char tbuf[30]; + int32_t tbx = sizeof(tbuf); + uint8_t digit; + int32_t length = 0; + uint64_t uval; + + U_ASSERT(radix>=2 && radix<=16); + uval = (uint64_t) v; + if(v<0 && radix == 10) { + /* Only in base 10 do we conside numbers to be signed. */ + uval = (uint64_t)(-v); + buffer[length++] = '-'; + } + + tbx = sizeof(tbuf)-1; + tbuf[tbx] = 0; /* We are generating the digits backwards. Null term the end. */ + do { + digit = (uint8_t)(uval % radix); + tbuf[--tbx] = (char)(T_CString_itosOffset(digit)); + uval = uval / radix; + } while (uval != 0); + + /* copy converted number into user buffer */ + uprv_strcpy(buffer+length, tbuf+tbx); + length += sizeof(tbuf) - tbx -1; + return length; } @@ -149,7 +214,7 @@ U_CAPI int32_t U_EXPORT2 T_CString_stringToInteger(const char *integerString, int32_t radix) { char *end; - return strtoul(integerString, &end, radix); + return uprv_strtoul(integerString, &end, radix); } @@ -235,7 +300,7 @@ T_CString_strnicmp(const char *str1, const char *str2, uint32_t n) { U_CAPI char* U_EXPORT2 uprv_strdup(const char *src) { - size_t len = strlen(src) + 1; + size_t len = uprv_strlen(src) + 1; char *dup = (char *) uprv_malloc(len); if (dup) { @@ -244,3 +309,20 @@ uprv_strdup(const char *src) { return dup; } + +U_CAPI char* U_EXPORT2 +uprv_strndup(const char *src, int32_t n) { + char *dup; + + if(n < 0) { + dup = uprv_strdup(src); + } else { + dup = (char*)uprv_malloc(n+1); + if (dup) { + uprv_memcpy(dup, src, n); + dup[n] = 0; + } + } + + return dup; +} diff --git a/icuSources/common/cstring.h b/icuSources/common/cstring.h index 8fcda8c3..5e156f17 100644 --- a/icuSources/common/cstring.h +++ b/icuSources/common/cstring.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1997-2003, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -31,7 +31,6 @@ #include #define uprv_strcpy(dst, src) U_STANDARD_CPP_NAMESPACE strcpy(dst, src) -#define uprv_strcpyWithSize(dst, src, size) U_STANDARD_CPP_NAMESPACE strncpy(dst, src, size) #define uprv_strncpy(dst, src, size) U_STANDARD_CPP_NAMESPACE strncpy(dst, src, size) #define uprv_strlen(str) U_STANDARD_CPP_NAMESPACE strlen(str) #define uprv_strcmp(s1, s2) U_STANDARD_CPP_NAMESPACE strcmp(s1, s2) @@ -45,14 +44,32 @@ U_CAPI char U_EXPORT2 uprv_toupper(char c); + +U_CAPI char U_EXPORT2 +uprv_asciitolower(char c); + U_CAPI char U_EXPORT2 -uprv_tolower(char c); +uprv_ebcdictolower(char c); + +#if U_CHARSET_FAMILY==U_ASCII_FAMILY +# define uprv_tolower uprv_asciitolower +#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY +# define uprv_tolower uprv_ebcdictolower +#else +# error U_CHARSET_FAMILY is not valid +#endif +#define uprv_strtod(source, end) U_STANDARD_CPP_NAMESPACE strtod(source, end) #define uprv_strtoul(str, end, base) U_STANDARD_CPP_NAMESPACE strtoul(str, end, base) #define uprv_strtol(str, end, base) U_STANDARD_CPP_NAMESPACE strtol(str, end, base) #ifdef WIN32 -# define uprv_stricmp(str1, str2) U_STANDARD_CPP_NAMESPACE _stricmp(str1, str2) -# define uprv_strnicmp(str1, str2, n) U_STANDARD_CPP_NAMESPACE _strnicmp(str1, str2, n) +# if defined(__BORLANDC__) +# define uprv_stricmp(str1, str2) U_STANDARD_CPP_NAMESPACE stricmp(str1, str2) +# define uprv_strnicmp(str1, str2, n) U_STANDARD_CPP_NAMESPACE strnicmp(str1, str2, n) +# else +# define uprv_stricmp(str1, str2) U_STANDARD_CPP_NAMESPACE _stricmp(str1, str2) +# define uprv_strnicmp(str1, str2, n) U_STANDARD_CPP_NAMESPACE _strnicmp(str1, str2, n) +# endif #elif defined(POSIX) # define uprv_stricmp(str1, str2) U_STANDARD_CPP_NAMESPACE strcasecmp(str1, str2) # define uprv_strnicmp(str1, str2, n) U_STANDARD_CPP_NAMESPACE strncasecmp(str1, str2, n) @@ -68,6 +85,17 @@ uprv_tolower(char c); U_CAPI char* U_EXPORT2 uprv_strdup(const char *src); +/** + * uprv_malloc n+1 bytes, and copy n bytes from src into the new string. + * Terminate with a null at offset n. If n is -1, works like uprv_strdup + * @param src + * @param n length of the input string, not including null. + * @return new string (owned by caller, use uprv_free to free). + * @internal + */ +U_CAPI char* U_EXPORT2 +uprv_strndup(const char *src, int32_t n); + U_CAPI char* U_EXPORT2 T_CString_toLowerCase(char* str); @@ -77,6 +105,9 @@ T_CString_toUpperCase(char* str); U_CAPI int32_t U_EXPORT2 T_CString_integerToString(char *buffer, int32_t n, int32_t radix); +U_CAPI int32_t U_EXPORT2 +T_CString_int64ToString(char *buffer, int64_t n, uint32_t radix); + U_CAPI int32_t U_EXPORT2 T_CString_stringToInteger(const char *integerString, int32_t radix); diff --git a/icuSources/common/dbbi.cpp b/icuSources/common/dbbi.cpp index def45650..2f83f6c3 100644 --- a/icuSources/common/dbbi.cpp +++ b/icuSources/common/dbbi.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2001 IBM Corp. All rights reserved. +* Copyright (C) 1999-2004 IBM Corp. All rights reserved. ********************************************************************** * Date Name Description * 12/1/99 rgillam Complete port from Java. @@ -17,17 +17,18 @@ #include "dbbi_tbl.h" #include "uvector.h" #include "cmemory.h" +#include "uassert.h" U_NAMESPACE_BEGIN -const char DictionaryBasedBreakIterator::fgClassID = 0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(DictionaryBasedBreakIterator) -//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------ // // constructors // -//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------ DictionaryBasedBreakIterator::DictionaryBasedBreakIterator() : RuleBasedBreakIterator() { @@ -43,17 +44,18 @@ DictionaryBasedBreakIterator::DictionaryBasedBreakIterator(UDataMemory* rbbiData init(); if (U_FAILURE(status)) {return;}; fTables = new DictionaryBasedBreakIteratorTables(dictionaryFilename, status); + if (U_FAILURE(status)) { + if (fTables != NULL) { + fTables->removeReference(); + fTables = NULL; + } + return; + } /* test for NULL */ if(fTables == 0) { status = U_MEMORY_ALLOCATION_ERROR; return; } - - if (U_FAILURE(status)) { - fTables->removeReference(); - fTables = NULL; - return; - } } @@ -70,11 +72,11 @@ RuleBasedBreakIterator(other) -//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------ // // Destructor // -//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------ DictionaryBasedBreakIterator::~DictionaryBasedBreakIterator() { uprv_free(cachedBreakPositions); @@ -82,12 +84,12 @@ DictionaryBasedBreakIterator::~DictionaryBasedBreakIterator() if (fTables != NULL) {fTables->removeReference();}; } -//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------ // // Assignment operator. Sets this iterator to have the same behavior, // and iterate over the same text, as the one passed in. // -//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------ DictionaryBasedBreakIterator& DictionaryBasedBreakIterator::operator=(const DictionaryBasedBreakIterator& that) { if (this == &that) { @@ -103,12 +105,12 @@ DictionaryBasedBreakIterator::operator=(const DictionaryBasedBreakIterator& that return *this; } -//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------ // // Clone() Returns a newly-constructed RuleBasedBreakIterator with the same // behavior, and iterating over the same text, as this one. // -//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------ BreakIterator* DictionaryBasedBreakIterator::clone() const { return new DictionaryBasedBreakIterator(*this); @@ -141,7 +143,14 @@ DictionaryBasedBreakIterator::previous() reset(); int32_t result = RuleBasedBreakIterator::previous(); if (cachedBreakPositions != NULL) { - positionInCache = numCachedBreakPositions - 2; + for (positionInCache=0; + cachedBreakPositions[positionInCache] != result; + positionInCache++); + U_ASSERT(positionInCache < numCachedBreakPositions); + if (positionInCache >= numCachedBreakPositions) { + // Something has gone wrong. Dump the cache. + reset(); + } } return result; } @@ -256,8 +265,13 @@ DictionaryBasedBreakIterator::handleNext() // for the new range if (fDictionaryCharCount > 1 && result - startPos > 1) { divideUpDictionaryRange(startPos, result, status); + U_ASSERT(U_SUCCESS(status)); if (U_FAILURE(status)) { - return -9999; // SHOULD NEVER GET HERE! + // Something went badly wrong, an internal error. + // We have no way from here to report it to caller. + // Treat as if this is if the dictionary did not apply to range. + reset(); + return result; } } @@ -292,11 +306,11 @@ DictionaryBasedBreakIterator::reset() -//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------ // // init() Common initialization routine, for use by constructors, etc. // -//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------ void DictionaryBasedBreakIterator::init() { cachedBreakPositions = NULL; fTables = NULL; @@ -306,11 +320,11 @@ void DictionaryBasedBreakIterator::init() { } -//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------ // // BufferClone // -//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------ BreakIterator * DictionaryBasedBreakIterator::createBufferClone(void *stackBuffer, int32_t &bufferSize, UErrorCode &status) @@ -396,6 +410,9 @@ DictionaryBasedBreakIterator::divideUpDictionaryRange(int32_t startPos, int32_t c = fText->next(); } + if (U_FAILURE(status)) { + return; // UStack below overwrites the status error codes + } // initialize. We maintain two stacks: currentBreakPositions contains // the list of break positions that will be returned if we successfully @@ -412,7 +429,9 @@ DictionaryBasedBreakIterator::divideUpDictionaryRange(int32_t startPos, int32_t // further, this saves us from having to follow each possible path // through the text all the way to the error (hopefully avoiding many // future recursive calls as well). - UStack currentBreakPositions(status); + // there can be only one kind of error in UStack and UVector, so we'll + // just let the error fall through + UStack currentBreakPositions(status); UStack possibleBreakPositions(status); UVector wrongBreakPositions(status); @@ -445,6 +464,9 @@ DictionaryBasedBreakIterator::divideUpDictionaryRange(int32_t startPos, int32_t // the possible-break-positions stack if (fTables->fDictionary->at(state, (int32_t)0) == -1) { possibleBreakPositions.push(fText->getIndex(), status); + if (U_FAILURE(status)) { + return; + } } // look up the new state to transition to in the dictionary @@ -456,6 +478,9 @@ DictionaryBasedBreakIterator::divideUpDictionaryRange(int32_t startPos, int32_t // of the loop. if (state == -1) { currentBreakPositions.push(fText->getIndex(), status); + if (U_FAILURE(status)) { + return; + } break; } @@ -501,6 +526,9 @@ DictionaryBasedBreakIterator::divideUpDictionaryRange(int32_t startPos, int32_t currentBreakPositions.removeAllElements(); for (int32_t i = 0; i < bestBreakPositions.size(); i++) { currentBreakPositions.push(bestBreakPositions.elementAti(i), status); + if (U_FAILURE(status)) { + return; + } } bestBreakPositions.removeAllElements(); if (farthestEndPoint < endPos) { @@ -515,9 +543,15 @@ DictionaryBasedBreakIterator::divideUpDictionaryRange(int32_t startPos, int32_t || currentBreakPositions.peeki() != fText->getIndex()) && fText->getIndex() != startPos) { currentBreakPositions.push(fText->getIndex(), status); + if (U_FAILURE(status)) { + return; + } } fText->next(); currentBreakPositions.push(fText->getIndex(), status); + if (U_FAILURE(status)) { + return; + } } } @@ -561,6 +595,9 @@ DictionaryBasedBreakIterator::divideUpDictionaryRange(int32_t startPos, int32_t currentBreakPositions.popi(); } currentBreakPositions.push(endPos, status); + if (U_FAILURE(status)) { + return; + } // create a regular array to hold the break positions and copy // the break positions from the stack to the array (in addition, diff --git a/icuSources/common/filestrm.c b/icuSources/common/filestrm.c index 048c3176..30476ea9 100644 --- a/icuSources/common/filestrm.c +++ b/icuSources/common/filestrm.c @@ -220,7 +220,7 @@ T_FileStream_stderr(void) U_CAPI UBool U_EXPORT2 T_FileStream_remove(const char* fileName){ - return (remove(fileName) == 0); + return (remove(fileName) == 0); } diff --git a/icuSources/common/hash.h b/icuSources/common/hash.h index dfad39d1..f1ea543c 100644 --- a/icuSources/common/hash.h +++ b/icuSources/common/hash.h @@ -1,6 +1,6 @@ /* ****************************************************************************** -* Copyright (C) 1997-2001, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. ****************************************************************************** * Date Name Description @@ -27,6 +27,8 @@ U_NAMESPACE_BEGIN class U_COMMON_API Hashtable : public UMemory { UHashtable* hash; + inline void init(UHashFunction *keyHash, UKeyComparator *keyComp, UErrorCode& status); + public: /** * Construct a hashtable @@ -35,12 +37,17 @@ public: */ Hashtable(UBool ignoreKeyCase, UErrorCode& status); + /** + * Construct a hashtable + * @param status Error code + */ + Hashtable(UErrorCode& status); + /** * Construct a hashtable, _disregarding any error_. Use this constructor * with caution. - * @param ignoreKeyCase if TRUE, keys are case insensitive */ - Hashtable(UBool ignoreKeyCase = FALSE); + Hashtable(); /** * Non-virtual destructor; make this virtual if Hashtable is subclassed @@ -79,31 +86,37 @@ private: * Implementation ********************************************************************/ -inline Hashtable::Hashtable(UBool ignoreKeyCase, UErrorCode& status) : - hash(0) { +inline void Hashtable::init(UHashFunction *keyHash, UKeyComparator *keyComp, UErrorCode& status) { if (U_FAILURE(status)) { return; } - hash = uhash_open(ignoreKeyCase ? uhash_hashCaselessUnicodeString - : uhash_hashUnicodeString, - ignoreKeyCase ? uhash_compareCaselessUnicodeString - : uhash_compareUnicodeString, - &status); + hash = uhash_open(keyHash, keyComp, &status); if (U_SUCCESS(status)) { uhash_setKeyDeleter(hash, uhash_deleteUnicodeString); } } -inline Hashtable::Hashtable(UBool ignoreKeyCase) : hash(0) { +inline Hashtable::Hashtable(UBool ignoreKeyCase, UErrorCode& status) + : hash(0) +{ + init(ignoreKeyCase ? uhash_hashCaselessUnicodeString + : uhash_hashUnicodeString, + ignoreKeyCase ? uhash_compareCaselessUnicodeString + : uhash_compareUnicodeString, + status); +} + +inline Hashtable::Hashtable(UErrorCode& status) + : hash(0) +{ + init(uhash_hashUnicodeString, uhash_compareUnicodeString, status); +} + +inline Hashtable::Hashtable() + : hash(0) +{ UErrorCode status = U_ZERO_ERROR; - hash = uhash_open(ignoreKeyCase ? uhash_hashCaselessUnicodeString - : uhash_hashUnicodeString, - ignoreKeyCase ? uhash_compareCaselessUnicodeString - : uhash_compareUnicodeString, - &status); - if (U_SUCCESS(status)) { - uhash_setKeyDeleter(hash, uhash_deleteUnicodeString); - } + init(uhash_hashUnicodeString, uhash_compareUnicodeString, status); } inline Hashtable::~Hashtable() { diff --git a/icuSources/common/iculserv.cpp b/icuSources/common/iculserv.cpp index 5e32cb0d..f99462ba 100644 --- a/icuSources/common/iculserv.cpp +++ b/icuSources/common/iculserv.cpp @@ -1,6 +1,6 @@ /** ******************************************************************************* - * Copyright (C) 2001-2003, International Business Machines Corporation and * + * Copyright (C) 2001-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* * @@ -11,31 +11,67 @@ #if !UCONFIG_NO_SERVICE #include "unicode/resbund.h" +#include "uresimp.h" #include "cmemory.h" #include "iculserv.h" #include "ustrfmt.h" +#include "uhash.h" +#include "charstr.h" +#include "ucln_cmn.h" +#include "uassert.h" -U_NAMESPACE_BEGIN - +// see LocaleUtility::getAvailableLocaleNames static Hashtable * LocaleUtility_cache = NULL; #define UNDERSCORE_CHAR ((UChar)0x005f) +#define AT_SIGN_CHAR ((UChar)64) +#define PERIOD_CHAR ((UChar)46) /* ****************************************************************** */ +/** + * Release all static memory held by Locale Utility. + */ +U_CDECL_BEGIN +static UBool U_CALLCONV service_cleanup(void) { + if (LocaleUtility_cache) { + delete LocaleUtility_cache; + LocaleUtility_cache = NULL; + } + return TRUE; +} +U_CDECL_END + +U_NAMESPACE_BEGIN + UnicodeString& LocaleUtility::canonicalLocaleString(const UnicodeString* id, UnicodeString& result) { if (id == NULL) { result.setToBogus(); } else { + // Fix case only (no other changes) up to the first '@' or '.' or + // end of string, whichever comes first. In 3.0 I changed this to + // stop at first '@' or '.'. It used to run out to the end of + // string. My fix makes the tests pass but is probably + // structurally incorrect. See below. [alan 3.0] + + // TODO: Doug, you might want to revise this... result = *id; int32_t i = 0; - int32_t n = result.indexOf(UNDERSCORE_CHAR); + int32_t end = result.indexOf(AT_SIGN_CHAR); + int32_t n = result.indexOf(PERIOD_CHAR); + if (n >= 0 && n < end) { + end = n; + } + if (end < 0) { + end = result.length(); + } + n = result.indexOf(UNDERSCORE_CHAR); if (n < 0) { - n = result.length(); + n = end; } for (; i < n; ++i) { UChar c = result.charAt(i); @@ -44,7 +80,7 @@ LocaleUtility::canonicalLocaleString(const UnicodeString* id, UnicodeString& res result.setCharAt(i, c); } } - for (n = result.length(); i < n; ++i) { + for (n = end; i < n; ++i) { UChar c = result.charAt(i); if (c >= 0x0061 && c <= 0x007a) { c -= 0x20; @@ -53,23 +89,83 @@ LocaleUtility::canonicalLocaleString(const UnicodeString* id, UnicodeString& res } } return result; + +#if 0 + // This code does a proper full level 2 canonicalization of id. + // It's nasty to go from UChar to char to char to UChar -- but + // that's what you have to do to use the uloc_canonicalize + // function on UnicodeStrings. + + // I ended up doing the alternate fix (see above) not for + // performance reasons, although performance will certainly be + // better, but because doing a full level 2 canonicalization + // causes some tests to fail. [alan 3.0] + + // TODO: Doug, you might want to revisit this... + result.setToBogus(); + if (id != 0) { + int32_t buflen = id->length() + 8; // space for NUL + char* buf = (char*) uprv_malloc(buflen); + char* canon = (buf == 0) ? 0 : (char*) uprv_malloc(buflen); + if (buf != 0 && canon != 0) { + U_ASSERT(id->extract(0, INT32_MAX, buf, buflen) < buflen); + UErrorCode ec = U_ZERO_ERROR; + uloc_canonicalize(buf, canon, buflen, &ec); + if (U_SUCCESS(ec)) { + result = UnicodeString(canon); + } + } + uprv_free(buf); + uprv_free(canon); + } + return result; +#endif } Locale& LocaleUtility::initLocaleFromName(const UnicodeString& id, Locale& result) { - if (id.isBogus()) { + enum { BUFLEN = 128 }; // larger than ever needed + + if (id.isBogus() || id.length() >= BUFLEN) { result.setToBogus(); } else { - const int32_t BUFLEN = 128; // larger than ever needed + /* + * We need to convert from a UnicodeString to char * in order to + * create a Locale. + * + * Problem: Locale ID strings may contain '@' which is a variant + * character and cannot be handled by invariant-character conversion. + * + * Hack: Since ICU code can handle locale IDs with multiple encodings + * of '@' (at least for EBCDIC; it's not known to be a problem for + * ASCII-based systems), + * we use regular invariant-character conversion for everything else + * and manually convert U+0040 into a compiler-char-constant '@'. + * While this compilation-time constant may not match the runtime + * encoding of '@', it should be one of the encodings which ICU + * recognizes. + * + * There should be only at most one '@' in a locale ID. + */ char buffer[BUFLEN]; - int len = id.extract(0, BUFLEN, buffer); - if (len >= BUFLEN) { - result.setToBogus(); - } else { - buffer[len] = '\0'; - result = Locale::createFromName(buffer); + int32_t prev, i; + prev = 0; + for(;;) { + i = id.indexOf((UChar)0x40, prev); + if(i < 0) { + // no @ between prev and the rest of the string + id.extract(prev, INT32_MAX, buffer + prev, BUFLEN - prev, US_INV); + break; // done + } else { + // normal invariant-character conversion for text between @s + id.extract(prev, i - prev, buffer + prev, BUFLEN - prev, US_INV); + // manually "convert" U+0040 at id[i] into '@' at buffer[i] + buffer[i] = '@'; + prev = i + 1; + } } + result = Locale::createFromName(buffer); } return result; } @@ -80,7 +176,7 @@ LocaleUtility::initNameFromLocale(const Locale& locale, UnicodeString& result) if (locale.isBogus()) { result.setToBogus(); } else { - result.append(locale.getName()); + result.append(UnicodeString(locale.getName(), -1, US_INV)); } return result; } @@ -88,37 +184,70 @@ LocaleUtility::initNameFromLocale(const Locale& locale, UnicodeString& result) const Hashtable* LocaleUtility::getAvailableLocaleNames(const UnicodeString& bundleID) { - // have to ignore bundleID for the moment, since we don't have easy C++ api. - // assume it's the default bundle + // LocaleUtility_cache is a hash-of-hashes. The top-level keys + // are path strings ('bundleID') passed to + // ures_openAvailableLocales. The top-level values are + // second-level hashes. The second-level keys are result strings + // from ures_openAvailableLocales. The second-level values are + // garbage ((void*)1 or other random pointer). + + UErrorCode status = U_ZERO_ERROR; + Hashtable* cache; + umtx_lock(NULL); + cache = LocaleUtility_cache; + umtx_unlock(NULL); + + if (cache == NULL) { + cache = new Hashtable(status); + if (cache == NULL || U_FAILURE(status)) { + return NULL; // catastrophic failure; e.g. out of memory + } + cache->setValueDeleter(uhash_deleteHashtable); + Hashtable* h; // set this to final LocaleUtility_cache value + umtx_lock(NULL); + h = LocaleUtility_cache; + if (h == NULL) { + LocaleUtility_cache = h = cache; + cache = NULL; + ucln_common_registerCleanup(UCLN_COMMON_SERVICE, service_cleanup); + } + umtx_unlock(NULL); + delete cache; + cache = h; + } + + U_ASSERT(cache != NULL); Hashtable* htp; umtx_lock(NULL); - htp = LocaleUtility_cache; + htp = (Hashtable*) cache->get(bundleID); umtx_unlock(NULL); if (htp == NULL) { - htp = new Hashtable(); - if (htp) { - UErrorCode status = U_ZERO_ERROR; - int32_t count = uloc_countAvailable(); - for (int32_t i = 0; i < count; ++i) { - UnicodeString temp(uloc_getAvailable(i), ""); - htp->put(temp, (void*)htp, status); - if (U_FAILURE(status)) { - delete htp; - return NULL; + htp = new Hashtable(status); + if (htp && U_SUCCESS(status)) { + CharString cbundleID(bundleID); + const char* path = (const char*) cbundleID; + if (*path == 0) path = NULL; // empty string => NULL + UEnumeration *uenum = ures_openAvailableLocales(path, &status); + for (;;) { + const UChar* id = uenum_unext(uenum, NULL, &status); + if (id == NULL) { + break; } + htp->put(UnicodeString(id), (void*)htp, status); } - umtx_lock(NULL); - if (LocaleUtility_cache == NULL) { - LocaleUtility_cache = htp; - htp = NULL; + uenum_close(uenum); + if (U_FAILURE(status)) { + delete htp; + return NULL; } + umtx_lock(NULL); + cache->put(bundleID, (void*)htp, status); umtx_unlock(NULL); - delete htp; } } - return LocaleUtility_cache; + return htp; } UBool @@ -129,15 +258,6 @@ LocaleUtility::isFallbackOf(const UnicodeString& root, const UnicodeString& chil child.charAt(root.length()) == UNDERSCORE_CHAR); } -UBool -LocaleUtility::cleanup(void) { - if (LocaleUtility_cache) { - delete LocaleUtility_cache; - LocaleUtility_cache = NULL; - } - return TRUE; -} - /* ****************************************************************** */ @@ -186,6 +306,8 @@ LocaleKey::LocaleKey(const UnicodeString& primaryID, _currentID = _primaryID; } +LocaleKey::~LocaleKey() {} + UnicodeString& LocaleKey::prefix(UnicodeString& result) const { if (_kind != KIND_ANY) { @@ -293,7 +415,7 @@ LocaleKey::debugClass(UnicodeString& result) const } #endif -const char LocaleKey::fgClassID = 0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LocaleKey) /* ****************************************************************** @@ -346,7 +468,7 @@ LocaleKeyFactory::updateVisibleIDs(Hashtable& result, UErrorCode& status) const const UHashElement* elem = NULL; int32_t pos = 0; - while (elem = supported->nextElement(pos)) { + while ((elem = supported->nextElement(pos)) != NULL) { const UnicodeString& id = *((const UnicodeString*)elem->key.pointer); if (!visible) { result.remove(id); @@ -363,19 +485,23 @@ LocaleKeyFactory::updateVisibleIDs(Hashtable& result, UErrorCode& status) const UnicodeString& LocaleKeyFactory::getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeString& result) const { if ((_coverage & 0x1) == 0) { - UErrorCode status = U_ZERO_ERROR; - if (isSupportedID(id, status)) { + //UErrorCode status = U_ZERO_ERROR; + // assume if this is called on us, we support some fallback of this id + // if (isSupportedID(id, status)) { Locale loc; LocaleUtility::initLocaleFromName(id, loc); return loc.getDisplayName(locale, result); - } + // } } result.setToBogus(); return result; } UObject* -LocaleKeyFactory::handleCreate(const Locale& loc, int32_t kind, const ICUService* service, UErrorCode& status) const { +LocaleKeyFactory::handleCreate(const Locale& /* loc */, + int32_t /* kind */, + const ICUService* /* service */, + UErrorCode& /* status */) const { return NULL; } @@ -386,7 +512,7 @@ LocaleKeyFactory::isSupportedID(const UnicodeString& id, UErrorCode& status) con } const Hashtable* -LocaleKeyFactory::getSupportedIDs(UErrorCode& status) const { +LocaleKeyFactory::getSupportedIDs(UErrorCode& /* status */) const { return NULL; } @@ -409,7 +535,7 @@ LocaleKeyFactory::debugClass(UnicodeString& result) const } #endif -const char LocaleKeyFactory::fgClassID = 0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LocaleKeyFactory) /* ****************************************************************** @@ -435,7 +561,7 @@ SimpleLocaleKeyFactory::SimpleLocaleKeyFactory(UObject* objToAdopt, , _id() , _kind(kind) { - LocaleUtility::initNameFromLocale(locale, _id); + LocaleUtility::initNameFromLocale(locale, _id); } SimpleLocaleKeyFactory::~SimpleLocaleKeyFactory() @@ -461,7 +587,7 @@ SimpleLocaleKeyFactory::create(const ICUServiceKey& key, const ICUService* servi } UBool -SimpleLocaleKeyFactory::isSupportedID(const UnicodeString& id, UErrorCode& status) const +SimpleLocaleKeyFactory::isSupportedID(const UnicodeString& id, UErrorCode& /* status */) const { return id == _id; } @@ -497,7 +623,7 @@ SimpleLocaleKeyFactory::debugClass(UnicodeString& result) const } #endif -const char SimpleLocaleKeyFactory::fgClassID = 0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SimpleLocaleKeyFactory) /* ****************************************************************** @@ -515,6 +641,8 @@ ICUResourceBundleFactory::ICUResourceBundleFactory(const UnicodeString& bundleNa { } +ICUResourceBundleFactory::~ICUResourceBundleFactory() {} + const Hashtable* ICUResourceBundleFactory::getSupportedIDs(UErrorCode& status) const { @@ -525,10 +653,18 @@ ICUResourceBundleFactory::getSupportedIDs(UErrorCode& status) const } UObject* -ICUResourceBundleFactory::handleCreate(const Locale& loc, int32_t kind, const ICUService* service, UErrorCode& status) const +ICUResourceBundleFactory::handleCreate(const Locale& loc, int32_t /* kind */, const ICUService* /* service */, UErrorCode& status) const { if (U_SUCCESS(status)) { - return new ResourceBundle(_bundleName, loc, status); + // _bundleName is a package name + // and should only contain invariant characters + char pkg[20]; + int32_t length; + length=_bundleName.extract(0, INT32_MAX, pkg, (int32_t)sizeof(pkg), US_INV); + if(length>=(int32_t)sizeof(pkg)) { + return NULL; + } + return new ResourceBundle(pkg, loc, status); } return NULL; } @@ -549,7 +685,7 @@ ICUResourceBundleFactory::debugClass(UnicodeString& result) const } #endif -const char ICUResourceBundleFactory::fgClassID = '\0'; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ICUResourceBundleFactory) /* ****************************************************************** @@ -601,7 +737,7 @@ ICULocaleService::get(const Locale& locale, int32_t kind, Locale* actualReturn, return result; } - UnicodeString locName(locale.getName(), ""); + UnicodeString locName(locale.getName(), -1, US_INV); if (locName.isBogus()) { status = U_MEMORY_ALLOCATION_ERROR; } else { @@ -627,12 +763,12 @@ ICULocaleService::get(const Locale& locale, int32_t kind, Locale* actualReturn, URegistryKey ICULocaleService::registerInstance(UObject* objToAdopt, const UnicodeString& locale, - UBool visible, UErrorCode& status) + UBool visible, UErrorCode& status) { - Locale loc; - LocaleUtility::initLocaleFromName(locale, loc); + Locale loc; + LocaleUtility::initLocaleFromName(locale, loc); return registerInstance(objToAdopt, loc, LocaleKey::KIND_ANY, - visible ? LocaleKeyFactory::VISIBLE : LocaleKeyFactory::INVISIBLE, status); + visible ? LocaleKeyFactory::VISIBLE : LocaleKeyFactory::INVISIBLE, status); } URegistryKey @@ -691,21 +827,37 @@ private: int32_t _timestamp; UVector _ids; int32_t _pos; - void* _bufp; - int32_t _buflen; private: - ServiceEnumeration(const ICULocaleService* service, UErrorCode status) + ServiceEnumeration(const ICULocaleService* service, UErrorCode &status) : _service(service) , _timestamp(service->getTimestamp()) , _ids(uhash_deleteUnicodeString, NULL, status) , _pos(0) - , _bufp(NULL) - , _buflen(0) { _service->getVisibleIDs(_ids, status); } + ServiceEnumeration(const ServiceEnumeration &other, UErrorCode &status) + : _service(other._service) + , _timestamp(other._timestamp) + , _ids(uhash_deleteUnicodeString, NULL, status) + , _pos(0) + { + if(U_SUCCESS(status)) { + int32_t i, length; + + length = other._ids.size(); + for(i = 0; i < length; ++i) { + _ids.addElement(((UnicodeString *)other._ids.elementAt(i))->clone(), status); + } + + if(U_SUCCESS(status)) { + _pos = other._pos; + } + } + } + public: static ServiceEnumeration* create(const ICULocaleService* service) { UErrorCode status = U_ZERO_ERROR; @@ -717,87 +869,43 @@ public: return NULL; } - virtual ~ServiceEnumeration() { - uprv_free(_bufp); - } + virtual ~ServiceEnumeration() {} - virtual int32_t count(UErrorCode& status) const { - return upToDate(status) ? _ids.size() : 0; + virtual StringEnumeration *clone() const { + UErrorCode status = U_ZERO_ERROR; + ServiceEnumeration *cl = new ServiceEnumeration(*this, status); + if(U_FAILURE(status)) { + delete cl; + cl = NULL; + } + return cl; } - const char* next(int32_t* resultLength, UErrorCode& status) { - const UnicodeString* us = snext(status); - if (us) { - while (TRUE) { - int32_t newlen = us->extract((char*)_bufp, _buflen / sizeof(char), NULL, status); - if (status == U_STRING_NOT_TERMINATED_WARNING || status == U_BUFFER_OVERFLOW_ERROR) { - resizeBuffer((newlen + 1) * sizeof(char)); - status = U_ZERO_ERROR; - } else if (U_SUCCESS(status)) { - ((char*)_bufp)[newlen] = 0; - if (resultLength) { - resultLength[0] = newlen; - } - return (const char*)_bufp; - } else { - break; - } + UBool upToDate(UErrorCode& status) const { + if (U_SUCCESS(status)) { + if (_timestamp == _service->getTimestamp()) { + return TRUE; } + status = U_ENUM_OUT_OF_SYNC_ERROR; } - return NULL; + return FALSE; } - const UChar* unext(int32_t* resultLength, UErrorCode& status) { - const UnicodeString* us = snext(status); - if (us) { - while (TRUE) { - int32_t newlen = us->extract((UChar*)_bufp, _buflen / sizeof(UChar), status); - if (status == U_STRING_NOT_TERMINATED_WARNING || status == U_BUFFER_OVERFLOW_ERROR) { - resizeBuffer((newlen + 1) * sizeof(UChar)); - } else if (U_SUCCESS(status)) { - ((UChar*)_bufp)[newlen] = 0; - if (resultLength) { - resultLength[0] = newlen; - } - return (const UChar*)_bufp; - } else { - break; - } - } - } - return NULL; + virtual int32_t count(UErrorCode& status) const { + return upToDate(status) ? _ids.size() : 0; } - const UnicodeString* snext(UErrorCode& status) { + virtual const UnicodeString* snext(UErrorCode& status) { if (upToDate(status) && (_pos < _ids.size())) { return (const UnicodeString*)_ids[_pos++]; } return NULL; } - void resizeBuffer(int32_t newlen) { - if (_bufp) { - _bufp = uprv_realloc(_bufp, newlen); - } else { - _bufp = uprv_malloc(newlen); - } - _buflen = newlen; - } - - UBool upToDate(UErrorCode& status) const { - if (U_SUCCESS(status)) { - if (_timestamp == _service->getTimestamp()) { - return TRUE; - } - status = U_ENUM_OUT_OF_SYNC_ERROR; + virtual void reset(UErrorCode& status) { + if (status == U_ENUM_OUT_OF_SYNC_ERROR) { + status = U_ZERO_ERROR; } - return FALSE; - } - - void reset(UErrorCode& status) { - if (status == U_ENUM_OUT_OF_SYNC_ERROR) { - status = U_ZERO_ERROR; - } if (U_SUCCESS(status)) { _timestamp = _service->getTimestamp(); _pos = 0; @@ -806,13 +914,11 @@ public: } public: - virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); } - static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; } -private: - static const char fgClassID; + static UClassID U_EXPORT2 getStaticClassID(void); + virtual UClassID getDynamicClassID(void) const; }; -const char ServiceEnumeration::fgClassID = '\0'; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ServiceEnumeration) StringEnumeration* ICULocaleService::getAvailableLocales(void) const @@ -850,15 +956,6 @@ ICULocaleService::createKey(const UnicodeString* id, int32_t kind, UErrorCode& s U_NAMESPACE_END -// defined in ucln_cmn.h - -/** - * Release all static memory held by Locale Utility. - */ -U_CFUNC UBool service_cleanup(void) { - return LocaleUtility::cleanup(); -} - /* !UCONFIG_NO_SERVICE */ #endif diff --git a/icuSources/common/iculserv.h b/icuSources/common/iculserv.h index b021a67b..1798e200 100644 --- a/icuSources/common/iculserv.h +++ b/icuSources/common/iculserv.h @@ -1,6 +1,6 @@ /** ******************************************************************************* - * Copyright (C) 2001-2003, International Business Machines Corporation and * + * Copyright (C) 2001-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* * @@ -25,11 +25,8 @@ U_NAMESPACE_END #else -#include "unicode/uobject.h" #include "unicode/unistr.h" -#include "unicode/chariter.h" #include "unicode/locid.h" -#include "unicode/ubrk.h" #include "unicode/strenum.h" #include "hash.h" @@ -78,16 +75,16 @@ class U_COMMON_API LocaleKey : public ICUServiceKey { */ static LocaleKey* createWithCanonicalFallback(const UnicodeString* primaryID, const UnicodeString* canonicalFallbackID, - UErrorCode& status); - + UErrorCode& status); + /** * Create a LocaleKey with canonical primary and fallback IDs. */ static LocaleKey* createWithCanonicalFallback(const UnicodeString* primaryID, const UnicodeString* canonicalFallbackID, int32_t kind, - UErrorCode& status); - + UErrorCode& status); + protected: /** * PrimaryID is the user's requested locale string, @@ -157,13 +154,14 @@ class U_COMMON_API LocaleKey : public ICUServiceKey { /** * UObject boilerplate. */ - static inline UClassID getStaticClassID() { - return (UClassID)&fgClassID; - } + static UClassID U_EXPORT2 getStaticClassID(); + + virtual UClassID getDynamicClassID() const; - virtual UClassID getDynamicClassID() const { - return getStaticClassID(); - } + /** + * Destructor. + */ + virtual ~LocaleKey(); #ifdef SERVICE_DEBUG public: @@ -171,8 +169,6 @@ class U_COMMON_API LocaleKey : public ICUServiceKey { virtual UnicodeString& debugClass(UnicodeString& result) const; #endif - private: - static const char fgClassID; }; /* @@ -265,7 +261,7 @@ protected: * Return true if this id is one the factory supports (visible or * otherwise). */ - virtual UBool isSupportedID(const UnicodeString& id, UErrorCode& status) const; + virtual UBool isSupportedID(const UnicodeString& id, UErrorCode& status) const; /** * Return the set of ids that this factory supports (visible or @@ -274,17 +270,13 @@ protected: */ virtual const Hashtable* getSupportedIDs(UErrorCode& status) const; - public: +public: /** * UObject boilerplate. */ - static inline UClassID getStaticClassID() { - return (UClassID)&fgClassID; - } + static UClassID U_EXPORT2 getStaticClassID(); - virtual UClassID getDynamicClassID() const { - return getStaticClassID(); - } + virtual UClassID getDynamicClassID() const; #ifdef SERVICE_DEBUG public: @@ -292,8 +284,6 @@ protected: virtual UnicodeString& debugClass(UnicodeString& result) const; #endif - private: - static const char fgClassID; }; /* @@ -338,23 +328,19 @@ class U_COMMON_API SimpleLocaleKeyFactory : public LocaleKeyFactory { void updateVisibleIDs(Hashtable& result, UErrorCode& status) const; protected: - /** + /** * Return true if this id is equal to the locale name. */ - virtual UBool isSupportedID(const UnicodeString& id, UErrorCode& status) const; + virtual UBool isSupportedID(const UnicodeString& id, UErrorCode& status) const; - public: +public: /** * UObject boilerplate. */ - static inline UClassID getStaticClassID() { - return (UClassID)&fgClassID; - } + static UClassID U_EXPORT2 getStaticClassID(); - virtual UClassID getDynamicClassID() const { - return getStaticClassID(); - } + virtual UClassID getDynamicClassID() const; #ifdef SERVICE_DEBUG public: @@ -362,8 +348,6 @@ class U_COMMON_API SimpleLocaleKeyFactory : public LocaleKeyFactory { virtual UnicodeString& debugClass(UnicodeString& result) const; #endif - private: - static const char fgClassID; }; /* @@ -389,11 +373,18 @@ class U_COMMON_API ICUResourceBundleFactory : public LocaleKeyFactory ICUResourceBundleFactory(); /** - * A service factory based on ICU resource data in resources - * with the given name. + * A service factory based on ICU resource data in resources with + * the given name. This should be a 'path' that can be passed to + * ures_openAvailableLocales, such as U_ICUDATA or U_ICUDATA_COLL. + * The empty string is equivalent to U_ICUDATA. */ ICUResourceBundleFactory(const UnicodeString& bundleName); + /** + * Destructor + */ + virtual ~ICUResourceBundleFactory(); + protected: /** * Return the supported IDs. This is the set of all locale names in ICULocaleData. @@ -406,17 +397,13 @@ protected: */ virtual UObject* handleCreate(const Locale& loc, int32_t kind, const ICUService* service, UErrorCode& status) const; - public: +public: /** * UObject boilerplate. */ - virtual UClassID getDynamicClassID() const { - return getStaticClassID(); - } + static UClassID U_EXPORT2 getStaticClassID(); + virtual UClassID getDynamicClassID() const; - static UClassID getStaticClassID() { - return (UClassID)&fgClassID; - } #ifdef SERVICE_DEBUG public: @@ -424,8 +411,6 @@ protected: virtual UnicodeString& debugClass(UnicodeString& result) const; #endif - private: - static const char fgClassID; }; /* @@ -562,7 +547,6 @@ public: static UnicodeString& initNameFromLocale(const Locale& locale, UnicodeString& result); static const Hashtable* getAvailableLocaleNames(const UnicodeString& bundleID); static UBool isFallbackOf(const UnicodeString& root, const UnicodeString& child); - static UBool cleanup(void); }; U_NAMESPACE_END diff --git a/icuSources/common/icunotif.cpp b/icuSources/common/icunotif.cpp index f3f6e80a..f8b64862 100644 --- a/icuSources/common/icunotif.cpp +++ b/icuSources/common/icunotif.cpp @@ -1,6 +1,6 @@ /** ******************************************************************************* - * Copyright (C) 2001-2002, International Business Machines Corporation and * + * Copyright (C) 2001-2003, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* */ @@ -10,11 +10,30 @@ #if !UCONFIG_NO_SERVICE #include "icunotif.h" +#if DEBUG #include +#endif U_NAMESPACE_BEGIN -const char EventListener::fgClassID = '\0'; +EventListener::~EventListener() {} +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(EventListener) + +ICUNotifier::ICUNotifier(void) + : notifyLock(0), listeners(NULL) +{ + umtx_init(¬ifyLock); +} + +ICUNotifier::~ICUNotifier(void) { + { + Mutex lmx(¬ifyLock); + delete listeners; + listeners = NULL; + } + umtx_destroy(¬ifyLock); +} + void ICUNotifier::addListener(const EventListener* l, UErrorCode& status) @@ -90,7 +109,7 @@ ICUNotifier::notifyChanged(void) } } -U_NAMESPACE_END; +U_NAMESPACE_END /* UCONFIG_NO_SERVICE */ #endif diff --git a/icuSources/common/icunotif.h b/icuSources/common/icunotif.h index 92c91423..19c2d690 100644 --- a/icuSources/common/icunotif.h +++ b/icuSources/common/icunotif.h @@ -1,6 +1,6 @@ /** ******************************************************************************* - * Copyright (C) 2001-2003, International Business Machines Corporation and * + * Copyright (C) 2001-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* */ @@ -32,19 +32,16 @@ U_NAMESPACE_END U_NAMESPACE_BEGIN class U_COMMON_API EventListener : public UObject { - public: - virtual ~EventListener() {} +public: + virtual ~EventListener(); - public: - static inline UClassID getStaticClassID() { - return (UClassID)&fgClassID; - } +public: + static UClassID U_EXPORT2 getStaticClassID(); - virtual UClassID getDynamicClassID() const { - return getStaticClassID(); - } + virtual UClassID getDynamicClassID() const; - public: +public: +#ifdef SERVICE_DEBUG virtual UnicodeString& debug(UnicodeString& result) const { return debugClass(result); } @@ -52,9 +49,7 @@ class U_COMMON_API EventListener : public UObject { virtual UnicodeString& debugClass(UnicodeString& result) const { return result.append("Key"); } - - private: - static const char fgClassID; +#endif }; /** @@ -75,60 +70,49 @@ class U_COMMON_API EventListener : public UObject { */ class U_COMMON_API ICUNotifier : public UMemory { - private: UMTX notifyLock; - private: UVector* listeners; - - public: - ICUNotifier(void) - : notifyLock(0), listeners(NULL) - { - umtx_init(¬ifyLock); - } - - virtual ~ICUNotifier(void) { - { - Mutex lmx(¬ifyLock); - delete listeners; - listeners = NULL; - } - umtx_destroy(¬ifyLock); - } - - /** - * Add a listener to be notified when notifyChanged is called. - * The listener must not be null. AcceptsListener must return - * true for the listener. Attempts to concurrently - * register the identical listener more than once will be - * silently ignored. - */ - virtual void addListener(const EventListener* l, UErrorCode& status); - - /** - * Stop notifying this listener. The listener must - * not be null. Attemps to remove a listener that is - * not registered will be silently ignored. - */ - virtual void removeListener(const EventListener* l, UErrorCode& status); - - /** - * ICU doesn't spawn its own threads. All listeners are notified in - * the thread of the caller. Misbehaved listeners can therefore - * indefinitely block the calling thread. Callers should beware of - * deadlock situations. - */ - virtual void notifyChanged(void); - - protected: - /** - * Subclasses implement this to return TRUE if the listener is - * of the appropriate type. - */ - virtual UBool acceptsListener(const EventListener& l) const = 0; - - /** - * Subclasses implement this to notify the listener. - */ - virtual void notifyListener(EventListener& l) const = 0; +private: UMTX notifyLock; +private: UVector* listeners; + +public: + ICUNotifier(void); + + virtual ~ICUNotifier(void); + + /** + * Add a listener to be notified when notifyChanged is called. + * The listener must not be null. AcceptsListener must return + * true for the listener. Attempts to concurrently + * register the identical listener more than once will be + * silently ignored. + */ + virtual void addListener(const EventListener* l, UErrorCode& status); + + /** + * Stop notifying this listener. The listener must + * not be null. Attemps to remove a listener that is + * not registered will be silently ignored. + */ + virtual void removeListener(const EventListener* l, UErrorCode& status); + + /** + * ICU doesn't spawn its own threads. All listeners are notified in + * the thread of the caller. Misbehaved listeners can therefore + * indefinitely block the calling thread. Callers should beware of + * deadlock situations. + */ + virtual void notifyChanged(void); + +protected: + /** + * Subclasses implement this to return TRUE if the listener is + * of the appropriate type. + */ + virtual UBool acceptsListener(const EventListener& l) const = 0; + + /** + * Subclasses implement this to notify the listener. + */ + virtual void notifyListener(EventListener& l) const = 0; }; U_NAMESPACE_END diff --git a/icuSources/common/icuserv.cpp b/icuSources/common/icuserv.cpp index 081fb71c..7bb15812 100644 --- a/icuSources/common/icuserv.cpp +++ b/icuSources/common/icuserv.cpp @@ -1,6 +1,6 @@ /** ******************************************************************************* - * Copyright (C) 2001-2003, International Business Machines Corporation. * + * Copyright (C) 2001-2004, International Business Machines Corporation. * * All Rights Reserved. * ******************************************************************************* */ @@ -18,235 +18,6 @@ U_NAMESPACE_BEGIN -// A reference counted wrapper for an object. Creation and access is -// through RefHandle. - -#ifdef SERVICE_REFCOUNT - -#include "unicode/strenum.h" - -/* - ****************************************************************** - */ - -class RefCounted { -private: - int32_t _count; - UObject* _obj; - - friend class RefHandle; - - RefCounted(UObject* objectToAdopt) : _count(1), _obj(objectToAdopt) {} - ~RefCounted() { delete _obj; } - void ref() { umtx_atomic_inc(&_count); } - void unref() { if (umtx_atomic_dec(&_count) == 0) { delete this; }} -}; - -/* - ****************************************************************** - */ - -// Reference counted handle for an object -class RefHandle { - RefCounted* _ref; - -public: - RefHandle() : _ref(NULL) {} - RefHandle(UObject* obj) : _ref(new RefCounted(obj)) {} - RefHandle(const RefHandle& rhs) : _ref(NULL) { operator=(rhs); } - ~RefHandle() { if (_ref) _ref->unref(); } - RefHandle& operator=(const RefHandle& rhs) { - if (rhs._ref) rhs._ref->ref(); - if (_ref) _ref->unref(); - _ref = rhs._ref; - } - const UObject* get() const { return _ref ? _ref->_obj : NULL; } -}; - -/* - ****************************************************************** - */ - -// Generic enumeration class with fail-fast behavior. - -class MapEnumeration : public UObject, public StringEnumeration -{ - private: - UChar* _buffer; - int _buflen; - - protected: - const ICUService* _service; - uint32_t _timestamp; - RefHandle _table; - ICUServiceKey* _filter; - int32_t _position; - int32_t _count; - - protected: - MapEnumeration(ICUService* service, int32_t timestamp, RefHandle& table, ICUServiceKey* filter = NULL) - : _buffer(NULL) - , _buflen(0) - , _service(service) - , _timestamp(timestamp) - , _table(table) - , _filter(filter) - , _position(0) - , _count(((const Hashtable*)table.get())->count()) - { - } - - virtual ~MapEnumeration() - { - delete _filter; - } - - int32_t count(UErrorCode& status) const - { - return U_SUCCESS(status) ? _count : 0; - } - - const char* next(UErrorCode& status) { - const UnicodeString* us = snext(status); - if (us) { - int newlen; - for (newlen = us->extract((char*)_buffer, _buflen / sizeof(char), NULL, status); - status == U_STRING_NOT_TERMINATED_WARNING || status == U_BUFFER_OVERFLOW_ERROR;) - { - resizeBuffer((newlen + 1) * sizeof(char)); - status = U_ZERO_ERROR; - } - - if (U_SUCCESS(status)) { - ((char*)_buffer)[newlen] = 0; - return (const char*)_buffer; - } - } - return NULL; - } - - const UChar* unext(UErrorCode& status) { - const UnicodeString* us = snext(status); - if (us) { - int newlen; - for (newlen = us->extract((UChar*)_buffer, _buflen / sizeof(UChar), NULL, status); - status == U_STRING_NOT_TERMINATED_WARNING || status == U_BUFFER_OVERFLOW_ERROR;) - { - resizeBuffer((newlen + 1) * sizeof(UChar)); - status = U_ZERO_ERROR; - } - - if (U_SUCCESS(status)) { - ((UChar*)_buffer)[newlen] = 0; - return (const UChar*)_buffer; - } - } - return NULL; - } - - const UnicodeString* snext(UErrorCode& status) - { - if (U_SUCCESS(status)) { - if (_timestamp != _service->_timestamp) { - status = U_ENUM_OUT_OF_SYNCH_ERROR; - } else { - return internalNext((Hashtable*)_table.get()); - } - } - return NULL; - } - - void reset(UErrorCode& status) - { - if (U_SUCCESS(status)) { - service->reset(this); - } - } - - protected: - virtual const UnicodeString* internalNext(Hashtable* table) = 0; - - private: - void reset(RefHandle& table, int32_t timestamp) - { - _table = table; - _timestamp = timestamp; - _position = 0; - _count = ((const Hashtable*)table.get())->count(); - } - - friend class ICUService; -}; - -/* - ****************************************************************** - */ - -// An enumeration over the visible ids in a service. The ids -// are in the hashtable, which is refcounted, so it will not -// disappear as long as the enumeration exists even if the -// service itself unrefs it. For "fail-fast" behavior the -// enumeration checks the timestamp of the service, but this -// is not a guarantee that the result the client receives will -// still be valid once the function returns. - -class IDEnumeration : public MapEnumeration { -public: - IDEnumeration(ICUService* service, int32_t timestamp, RefHandle& table, ICUServiceKey* filter = NULL) - : MapEnumeration(service, timestamp, table, filter) - { - } - -protected: - const UnicodeString* internalNext(Hashtable* table) { - while (TRUE) { - const UnicodeString* elem = (const UnicodeString*)(table->nextElement(_position).key.pointer); - if (elem == NULL || - _filter == NULL || - _filter->isFallbackOf(*elem)) { - return elem; - } - } - return NULL; - } -}; - -/* - ****************************************************************** - */ - -class DisplayEnumeration : public MapEnumeration { -private: - Locale _locale; - UnicodeString _cache; - -public: - DisplayEnumeration(ICUService* service, int32_t timestamp, RefHandle& table, Locale& locale, ICUServiceKey* filter = NULL) - : MapEnumeration(service, timestamp, table, filter), _locale(locale) - { - } - -protected: - const UnicodeString* internalNext(Hashtable* table) { - while (TRUE) { - UHashElement* elem = table->nextElement(_position); - if (elem == NULL) { - return NULL; - } - const UnicodeString* id = (const UnicodeString*)elem->key.pointer; - const ICUServiceFactory* factory = (const ICUServiceFactory*)elem->value.pointer; - if (_filter == NULL || _filter->isFallbackOf(*id)) { - factory->getDisplayName(*id, cache, locale); - return &cache; - } - } - return NULL; - } -}; - -/* SERVICE_REFCOUNT */ -#endif - /* ****************************************************************** */ @@ -343,7 +114,7 @@ ICUServiceKey::debugClass(UnicodeString& result) const } #endif -const char ICUServiceKey::fgClassID = '\0'; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ICUServiceKey) /* ****************************************************************** @@ -382,7 +153,7 @@ SimpleFactory::updateVisibleIDs(Hashtable& result, UErrorCode& status) const } UnicodeString& -SimpleFactory::getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeString& result) const +SimpleFactory::getDisplayName(const UnicodeString& id, const Locale& /* locale */, UnicodeString& result) const { if (_visible && _id == id) { result = _id; @@ -411,13 +182,13 @@ SimpleFactory::debugClass(UnicodeString& toAppendTo) const } #endif -const char SimpleFactory::fgClassID = '\0'; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SimpleFactory) /* ****************************************************************** */ -const char ServiceListener::fgClassID = '\0'; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ServiceListener) /* ****************************************************************** @@ -480,8 +251,8 @@ public: }; // UObjectDeleter for serviceCache - -U_CAPI void U_EXPORT2 +U_CDECL_BEGIN +static void U_CALLCONV cacheDeleter(void* obj) { U_NAMESPACE_USE ((CacheEntry*)obj)->unref(); @@ -490,11 +261,12 @@ cacheDeleter(void* obj) { /** * Deleter for UObjects */ -U_CAPI void U_EXPORT2 +static void U_CALLCONV deleteUObject(void *obj) { U_NAMESPACE_USE delete (UObject*) obj; } +U_CDECL_END /* ****************************************************************** @@ -506,7 +278,7 @@ public: const Locale locale; DNCache(const Locale& _locale) - : cache(FALSE), locale(_locale) + : cache(), locale(_locale) { // cache.setKeyDeleter(uhash_deleteUnicodeString); } @@ -547,7 +319,7 @@ StringPair::StringPair(const UnicodeString& _displayName, } U_CAPI void U_EXPORT2 -deleteStringPair(void *obj) { +userv_deleteStringPair(void *obj) { U_NAMESPACE_USE delete (StringPair*) obj; } @@ -670,14 +442,14 @@ ICUService::getKey(ICUServiceKey& key, UnicodeString* actualReturn, const ICUSer // The cache has to stay in synch with the factory list. // ICU doesn't have monitors so we can't use rw locks, so // we single-thread everything using this service, for now. - + // if factory is not null, we're calling from within the mutex, // and since some unix machines don't have reentrant mutexes we // need to make sure not to try to lock it again. XMutex(&ncthis->lock, factory != NULL); if (serviceCache == NULL) { - ncthis->serviceCache = new Hashtable(FALSE, status); + ncthis->serviceCache = new Hashtable(status); if (U_FAILURE(status)) { delete serviceCache; return NULL; @@ -721,7 +493,6 @@ ICUService::getKey(ICUServiceKey& key, UnicodeString* actualReturn, const ICUSer // going to update the cache at all. putInCache = TRUE; - int32_t n = 0; int32_t index = startIndex; while (index < limit) { ICUServiceFactory* f = (ICUServiceFactory*)factories->elementAt(index++); @@ -791,7 +562,7 @@ ICUService::getKey(ICUServiceKey& key, UnicodeString* actualReturn, const ICUSer if (actualReturn != NULL) { // strip null prefix - if (result->actualDescriptor.indexOf("/") == 0) { + if (result->actualDescriptor.indexOf((UChar)0x2f) == 0) { // U+002f=slash (/) actualReturn->remove(); actualReturn->append(result->actualDescriptor, 1, @@ -802,14 +573,14 @@ ICUService::getKey(ICUServiceKey& key, UnicodeString* actualReturn, const ICUSer if (actualReturn->isBogus()) { status = U_MEMORY_ALLOCATION_ERROR; - delete result; + delete result; return NULL; } } UObject* service = cloneInstance(result->service); if (putInCache && !cacheResult) { - delete result; + delete result; } return service; } @@ -819,7 +590,7 @@ ICUService::getKey(ICUServiceKey& key, UnicodeString* actualReturn, const ICUSer } UObject* -ICUService::handleDefault(const ICUServiceKey& key, UnicodeString* actualIDReturn, UErrorCode& status) const +ICUService::handleDefault(const ICUServiceKey& /* key */, UnicodeString* /* actualIDReturn */, UErrorCode& /* status */) const { return NULL; } @@ -845,7 +616,7 @@ ICUService::getVisibleIDs(UVector& result, const UnicodeString* matchID, UErrorC if (map != NULL) { ICUServiceKey* fallbackKey = createKey(matchID, status); - for (int32_t pos = 0;;) { + for (int32_t pos = -1;;) { const UHashElement* e = map->nextElement(pos); if (e == NULL) { break; @@ -887,7 +658,7 @@ ICUService::getVisibleIDMap(UErrorCode& status) const { ICUService* ncthis = (ICUService*)this; // cast away semantic const if (idCache == NULL) { - ncthis->idCache = new Hashtable(); + ncthis->idCache = new Hashtable(status); if (idCache == NULL) { status = U_MEMORY_ALLOCATION_ERROR; } else if (factories != NULL) { @@ -924,8 +695,23 @@ ICUService::getDisplayName(const UnicodeString& id, UnicodeString& result, const ICUServiceFactory* f = (ICUServiceFactory*)map->get(id); if (f != NULL) { f->getDisplayName(id, locale, result); - return result; + return result; + } + + // fallback + UErrorCode status = U_ZERO_ERROR; + ICUServiceKey* fallbackKey = createKey(&id, status); + while (fallbackKey->fallback()) { + UnicodeString us; + fallbackKey->currentID(us); + f = (ICUServiceFactory*)map->get(us); + if (f != NULL) { + f->getDisplayName(id, locale, result); + delete fallbackKey; + return result; + } } + delete fallbackKey; } } result.setToBogus(); @@ -972,7 +758,7 @@ ICUService::getDisplayNames(UVector& result, int32_t pos = 0; const UHashElement* entry = NULL; - while (entry = m->nextElement(pos)) { + while ((entry = m->nextElement(pos)) != NULL) { const UnicodeString* id = (const UnicodeString*)entry->key.pointer; ICUServiceFactory* f = (ICUServiceFactory*)entry->value.pointer; UnicodeString dname; @@ -996,7 +782,7 @@ ICUService::getDisplayNames(UVector& result, ICUServiceKey* matchKey = createKey(matchID, status); int32_t pos = 0; const UHashElement *entry = NULL; - while (entry = dnCache->cache.nextElement(pos)) { + while ((entry = dnCache->cache.nextElement(pos)) != NULL) { const UnicodeString* id = (const UnicodeString*)entry->value.pointer; if (matchKey != NULL && !matchKey->isFallbackOf(*id)) { continue; diff --git a/icuSources/common/icuserv.h b/icuSources/common/icuserv.h index 464d3969..eeb4cbcc 100644 --- a/icuSources/common/icuserv.h +++ b/icuSources/common/icuserv.h @@ -1,6 +1,6 @@ /** ******************************************************************************* - * Copyright (C) 2001-2003, International Business Machines Corporation. * + * Copyright (C) 2001-2004, International Business Machines Corporation. * * All Rights Reserved. * ******************************************************************************* */ @@ -24,11 +24,8 @@ U_NAMESPACE_END #else -#include "unicode/uobject.h" #include "unicode/unistr.h" -#include "unicode/chariter.h" #include "unicode/locid.h" -#include "unicode/ubrk.h" #include "hash.h" #include "uvector.h" @@ -42,7 +39,6 @@ class ICUServiceKey; class ICUServiceFactory; class SimpleFactory; class ServiceListener; -class ICUServiceEnumeration; class ICUService; class DNCache; @@ -183,20 +179,16 @@ class U_COMMON_API ICUServiceKey : public UObject { */ static UnicodeString& parseSuffix(UnicodeString& result); - public: +public: /** * UObject RTTI boilerplate. */ - static inline UClassID getStaticClassID() { - return (UClassID)&fgClassID; - } + static UClassID U_EXPORT2 getStaticClassID(); /** * UObject RTTI boilerplate. */ - virtual UClassID getDynamicClassID() const { - return getStaticClassID(); - } + virtual UClassID getDynamicClassID() const; #ifdef SERVICE_DEBUG public: @@ -204,8 +196,6 @@ class U_COMMON_API ICUServiceKey : public UObject { virtual UnicodeString& debugClass(UnicodeString& result) const; #endif - private: - static const char fgClassID; }; /******************************************************************* @@ -347,16 +337,12 @@ class U_COMMON_API SimpleFactory : public ICUServiceFactory { /** * UObject RTTI boilerplate. */ - static inline UClassID getStaticClassID() { - return (UClassID)&fgClassID; - } + static UClassID U_EXPORT2 getStaticClassID(); /** * UObject RTTI boilerplate. */ - virtual UClassID getDynamicClassID() const { - return getStaticClassID(); - } + virtual UClassID getDynamicClassID() const; #ifdef SERVICE_DEBUG public: @@ -364,8 +350,6 @@ class U_COMMON_API SimpleFactory : public ICUServiceFactory { virtual UnicodeString& debugClass(UnicodeString& toAppendTo) const; #endif - private: - static const char fgClassID; }; /* @@ -394,19 +378,13 @@ public: /** * UObject RTTI boilerplate. */ - static inline UClassID getStaticClassID() { - return (UClassID)&fgClassID; - } + static UClassID U_EXPORT2 getStaticClassID(); /** * UObject RTTI boilerplate. */ - virtual UClassID getDynamicClassID() const { - return getStaticClassID(); - } + virtual UClassID getDynamicClassID() const; -private: - static const char fgClassID; }; /* @@ -455,7 +433,7 @@ private: * Deleter for StringPairs */ U_CAPI void U_EXPORT2 -deleteStringPair(void *obj); +userv_deleteStringPair(void *obj); /** * Opaque type returned by registerInstance and registerFactory. @@ -661,9 +639,9 @@ class U_COMMON_API ICUService : public ICUNotifier { * the key, until either a factory returns a service object, or the key * has no fallback. If no object is found, the result of handleDefault * is returned.

- * - *

Subclasses can override this method to further customize the - * result before returning it. + * + *

Subclasses can override this method to further customize the + * result before returning it. * * @param key the key. * @param actualReturn a pointer to a UnicodeString to hold the matched descriptor, or NULL. @@ -676,7 +654,7 @@ class U_COMMON_API ICUService : public ICUNotifier { *

This version of getKey is only called by ICUServiceFactories within the scope * of a previous getKey call, to determine what previously-registered factories would * have returned. For details, see getKey(ICUServiceKey&, UErrorCode&). Subclasses - * should not call it directly, but call through one of the other get functions.

+ * should not call it directly, but call through one of the other get functions.

* * @param key the key. * @param actualReturn a pointer to a UnicodeString to hold the matched descriptor, or NULL. diff --git a/icuSources/common/locbased.cpp b/icuSources/common/locbased.cpp new file mode 100644 index 00000000..e96b9f79 --- /dev/null +++ b/icuSources/common/locbased.cpp @@ -0,0 +1,46 @@ +/* +********************************************************************** +* Copyright (c) 2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Author: Alan Liu +* Created: January 16 2004 +* Since: ICU 2.8 +********************************************************************** +*/ +#include "locbased.h" +#include "cstring.h" + +U_NAMESPACE_BEGIN + +Locale LocaleBased::getLocale(ULocDataLocaleType type, UErrorCode& status) const { + const char* id = getLocaleID(type, status); + return Locale((id != 0) ? id : ""); +} + +const char* LocaleBased::getLocaleID(ULocDataLocaleType type, UErrorCode& status) const { + if (U_FAILURE(status)) { + return NULL; + } + + switch(type) { + case ULOC_VALID_LOCALE: + return valid; + case ULOC_ACTUAL_LOCALE: + return actual; + default: + status = U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } +} + +void LocaleBased::setLocaleIDs(const char* validID, const char* actualID) { + if (validID != 0) { + uprv_strcpy(valid, validID); + } + if (actualID != 0) { + uprv_strcpy(actual, actualID); + } +} + +U_NAMESPACE_END diff --git a/icuSources/common/locbased.h b/icuSources/common/locbased.h new file mode 100644 index 00000000..366b1510 --- /dev/null +++ b/icuSources/common/locbased.h @@ -0,0 +1,97 @@ +/* +********************************************************************** +* Copyright (c) 2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Author: Alan Liu +* Created: January 16 2004 +* Since: ICU 2.8 +********************************************************************** +*/ +#ifndef LOCBASED_H +#define LOCBASED_H + +#include "unicode/locid.h" +#include "unicode/uobject.h" + +/** + * Macro to declare a locale LocaleBased wrapper object for the given + * object, which must have two members named `validLocale' and + * `actualLocale'. + */ +#define U_LOCALE_BASED(varname, objname) \ + LocaleBased varname((objname).validLocale, (objname).actualLocale); + +U_NAMESPACE_BEGIN + +/** + * A utility class that unifies the implementation of getLocale() by + * various ICU services. This class is likely to be removed in the + * ICU 3.0 time frame in favor of an integrated approach with the + * services framework. + * @since ICU 2.8 + */ +class U_COMMON_API LocaleBased : public UMemory { + + public: + + /** + * Construct a LocaleBased wrapper around the two pointers. These + * will be aliased for the lifetime of this object. + */ + inline LocaleBased(char* validAlias, char* actualAlias); + + /** + * Construct a LocaleBased wrapper around the two const pointers. + * These will be aliased for the lifetime of this object. + */ + inline LocaleBased(const char* validAlias, const char* actualAlias); + + /** + * Return locale meta-data for the service object wrapped by this + * object. Either the valid or the actual locale may be + * retrieved. + * @param type either ULOC_VALID_LOCALE or ULOC_ACTUAL_LOCALE + * @param status input-output error code + * @return the indicated locale + */ + Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const; + + /** + * Return the locale ID for the service object wrapped by this + * object. Either the valid or the actual locale may be + * retrieved. + * @param type either ULOC_VALID_LOCALE or ULOC_ACTUAL_LOCALE + * @param status input-output error code + * @return the indicated locale ID + */ + const char* getLocaleID(ULocDataLocaleType type, UErrorCode& status) const; + + /** + * Set the locale meta-data for the service object wrapped by this + * object. If either parameter is zero, it is ignored. + * @param valid the ID of the valid locale + * @param actual the ID of the actual locale + */ + void setLocaleIDs(const char* valid, const char* actual); + + private: + + char* valid; + + char* actual; +}; + +inline LocaleBased::LocaleBased(char* validAlias, char* actualAlias) : + valid(validAlias), actual(actualAlias) { +} + +inline LocaleBased::LocaleBased(const char* validAlias, + const char* actualAlias) : + // ugh: cast away const + valid((char*)validAlias), actual((char*)actualAlias) { +} + +U_NAMESPACE_END + +#endif diff --git a/icuSources/common/locid.cpp b/icuSources/common/locid.cpp index 8e991883..87ab0d5d 100644 --- a/icuSources/common/locid.cpp +++ b/icuSources/common/locid.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** - * Copyright (C) 1997-2003, International Business Machines + * Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -11,9 +11,9 @@ * Modification History: * * Date Name Description -* 02/11/97 aliu Changed gLocPath to fgDataDirectory and added +* 02/11/97 aliu Changed gLocPath to fgDataDirectory and added * methods to get and set it. -* 04/02/97 aliu Made operator!= inline; fixed return value +* 04/02/97 aliu Made operator!= inline; fixed return value * of getName(). * 04/15/97 aliu Cleanup for AIX/Win32. * 04/24/97 aliu Numerous changes per code review. @@ -39,6 +39,8 @@ #include "uhash.h" #include "ucln_cmn.h" +#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) + static Locale* availableLocaleList = NULL; static int32_t availableLocaleListCount; typedef enum ELocalePos { @@ -67,15 +69,27 @@ typedef enum ELocalePos { eMAX_LOCALES } ELocalePos; -/* Use void * to make it properly aligned */ -/* Add 1 for rounding */ -// static void *gByteLocaleCache[(eMAX_LOCALES + 1) * sizeof(Locale) / sizeof(void*)]; - -static Locale *gLocaleCache = NULL; -static Locale *gDefaultLocale = NULL; +U_CFUNC int32_t locale_getKeywords(const char *localeID, + char prev, + char *keywords, int32_t keywordCapacity, + char *values, int32_t valuesCapacity, int32_t *valLen, + UBool valuesToo, + UErrorCode *status); + +static Locale *gLocaleCache = NULL; +static const Locale *gDefaultLocale = NULL; +static UHashtable *gDefaultLocalesHashT = NULL; + +U_CDECL_BEGIN +// +// Deleter function for Locales owned by the default Locale hash table/ +// +static void U_CALLCONV +deleteLocale(void *obj) { + delete (Locale *) obj; +} -UBool -locale_cleanup(void) +static UBool U_CALLCONV locale_cleanup(void) { U_NAMESPACE_USE @@ -89,40 +103,122 @@ locale_cleanup(void) delete [] gLocaleCache; gLocaleCache = NULL; } - if (gDefaultLocale) { - delete gDefaultLocale; - gDefaultLocale = NULL; + + if (gDefaultLocalesHashT) { + uhash_close(gDefaultLocalesHashT); // Automatically deletes all elements, using deleter func. + gDefaultLocalesHashT = NULL; } + gDefaultLocale = NULL; + return TRUE; } +U_CDECL_END U_NAMESPACE_BEGIN -const char Locale::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(Locale) +// +// locale_set_default_internal. +// void locale_set_default_internal(const char *id) { U_NAMESPACE_USE - Locale tempLocale(Locale::eBOGUS); - - if (id == NULL) - { + UErrorCode status = U_ZERO_ERROR; + UBool canonicalize = FALSE; + + // If given a NULL string for the locale id, grab the default + // name from the system. + // (Different from most other locale APIs, where a null name means use + // the current ICU default locale.) + if (id == NULL) { umtx_lock(NULL); id = uprv_getDefaultLocaleID(); umtx_unlock(NULL); + canonicalize = TRUE; // always canonicalize host ID + } + + // put the locale id into a canonical form, + // in preparation for looking up this locale in the hash table of + // already-created locale objects. + // + status = U_ZERO_ERROR; + char localeNameBuf[512]; + + if (canonicalize) { + uloc_canonicalize(id, localeNameBuf, sizeof(localeNameBuf)-1, &status); + } else { + uloc_getName(id, localeNameBuf, sizeof(localeNameBuf)-1, &status); } + localeNameBuf[sizeof(localeNameBuf)-1] = 0; // Force null termination in event of + // a long name filling the buffer. + // (long names are truncated.) - tempLocale.init(id); // Note: we do not want to hold the mutex through init(), - // which is a relatively large, complex function. - // Hence, the use of a temporary locale. - const Locale *defLocale = &Locale::getDefault(); - + // Lazy creation of the hash table itself, if needed. + // umtx_lock(NULL); - Locale *ncDefLocale = (Locale *)defLocale; - *ncDefLocale = tempLocale; + UBool hashTableNeedsInit = (gDefaultLocalesHashT == NULL); umtx_unlock(NULL); + if (hashTableNeedsInit) { + status = U_ZERO_ERROR; + UHashtable *tHashTable = uhash_open(uhash_hashChars, uhash_compareChars, &status); + if (U_FAILURE(status)) { + return; + } + uhash_setValueDeleter(tHashTable, deleteLocale); + umtx_lock(NULL); + if (gDefaultLocalesHashT == NULL) { + gDefaultLocalesHashT = tHashTable; + ucln_common_registerCleanup(UCLN_COMMON_LOCALE, locale_cleanup); + umtx_unlock(NULL); + } else { + umtx_unlock(NULL); + uhash_close(tHashTable); + } + } + + // Hash table lookup, key is the locale full name + umtx_lock(NULL); + Locale *newDefault = (Locale *)uhash_get(gDefaultLocalesHashT, localeNameBuf); + if (newDefault != NULL) { + // We have the requested locale in the hash table already. + // Just set it as default. Inside the mutex lock, for those troublesome processors. + gDefaultLocale = newDefault; + umtx_unlock(NULL); + } else { + umtx_unlock(NULL); + // We haven't seen this locale id before. + // Create a new Locale object for it. + newDefault = new Locale(Locale::eBOGUS); + if (newDefault == NULL) { + // No way to report errors from here. + return; + } + newDefault->init(localeNameBuf, FALSE); + + // Add newly created Locale to the hash table of default Locales + const char *key = newDefault->getName(); + U_ASSERT(uprv_strcmp(key, localeNameBuf) == 0); + umtx_lock(NULL); + const Locale *hashTableVal = (const Locale *)uhash_get(gDefaultLocalesHashT, key); + if (hashTableVal == NULL) { + uhash_put(gDefaultLocalesHashT, (void *)key, newDefault, &status); + gDefaultLocale = newDefault; + umtx_unlock(NULL); + // ignore errors from hash table insert. (Couldn't do anything anyway) + // We can still set the default Locale, + // it just wont be cached, and will eventually leak. + } else { + // Some other thread raced us through here, and got the new Locale + // into the hash table before us. Use that one. + gDefaultLocale = hashTableVal; // Assignment to gDefaultLocale must happen inside mutex + umtx_unlock(NULL); + delete newDefault; + } + } } U_NAMESPACE_END + /* sfb 07/21/99 */ U_CFUNC void locale_set_default(const char *id) @@ -149,36 +245,46 @@ U_NAMESPACE_BEGIN #define SEP_CHAR '_' Locale::~Locale() -{ +{ /*if fullName is on the heap, we free it*/ - if (fullName != fullNameBuffer) + if (fullName != fullNameBuffer) { uprv_free(fullName); fullName = NULL; } + if (baseName && baseName != baseNameBuffer) { + uprv_free(baseName); + baseName = NULL; + } } Locale::Locale() - : UObject(), fullName(fullNameBuffer) + : UObject(), fullName(fullNameBuffer), baseName(NULL) { - init(NULL); + init(NULL, FALSE); } -Locale::Locale(Locale::ELocaleType t) - : UObject(), fullName(fullNameBuffer) +/* + * Internal constructor to allow construction of a locale object with + * NO side effects. (Default constructor tries to get + * the default locale.) + */ +Locale::Locale(Locale::ELocaleType) + : UObject(), fullName(fullNameBuffer), baseName(NULL) { setToBogus(); } -Locale::Locale( const char * newLanguage, - const char * newCountry, - const char * newVariant) - : UObject(), fullName(fullNameBuffer) +Locale::Locale( const char * newLanguage, + const char * newCountry, + const char * newVariant, + const char * newKeywords) + : UObject(), fullName(fullNameBuffer), baseName(NULL) { if( (newLanguage==NULL) && (newCountry == NULL) && (newVariant == NULL) ) { - init(NULL); /* shortcut */ + init(NULL, FALSE); /* shortcut */ } else { @@ -189,6 +295,7 @@ Locale::Locale( const char * newLanguage, int32_t lsize = 0; int32_t csize = 0; int32_t vsize = 0; + int32_t ksize = 0; char *p; // Calculate the size of the resulting string. @@ -215,7 +322,7 @@ Locale::Locale( const char * newLanguage, { newVariant++; } - + // remove trailing _'s vsize = (int32_t)uprv_strlen(newVariant); while( (vsize>1) && (newVariant[vsize-1] == SEP_CHAR) ) @@ -232,13 +339,20 @@ Locale::Locale( const char * newLanguage, // Separator rules: if ( vsize > 0 ) { - size += 2; // at least: __v + size += 2; // at least: __v } else if ( csize > 0 ) { - size += 1; // at least: _v + size += 1; // at least: _v + } + + if ( newKeywords != NULL) + { + ksize = (int32_t)uprv_strlen(newKeywords); + size += ksize + 1; } + // NOW we have the full locale string.. /*if the whole string is longer than our internal limit, we need @@ -269,7 +383,7 @@ Locale::Locale( const char * newLanguage, } if ( csize != 0 ) - { + { uprv_strcpy(p, newCountry); p += csize; } @@ -278,14 +392,29 @@ Locale::Locale( const char * newLanguage, { *p++ = SEP_CHAR; // at least: __v - uprv_strncpy(p, newVariant, vsize); // Must use strncpy because + uprv_strncpy(p, newVariant, vsize); // Must use strncpy because p += vsize; // of trimming (above). *p = 0; // terminate } + if ( ksize != 0) + { + if (uprv_strchr(newKeywords, '=')) { + *p++ = '@'; /* keyword parsing */ + } + else { + *p++ = '_'; /* Variant parsing with a script */ + if ( vsize == 0) { + *p++ = '_'; /* No country found */ + } + } + uprv_strcpy(p, newKeywords); + p += ksize; + } + // Parse it, because for example 'language' might really be a complete // string. - init(togo); + init(togo, FALSE); if (togo_heap) { uprv_free(togo_heap); @@ -294,7 +423,7 @@ Locale::Locale( const char * newLanguage, } Locale::Locale(const Locale &other) - : UObject(other), fullName(fullNameBuffer) + : UObject(other), fullName(fullNameBuffer), baseName(NULL) { *this = other; } @@ -320,12 +449,26 @@ Locale &Locale::operator=(const Locale &other) if(other.fullName != other.fullNameBuffer) { fullName = (char *)uprv_malloc(sizeof(char)*(uprv_strlen(other.fullName)+1)); } - /* Copy the full name */ uprv_strcpy(fullName, other.fullName); + /* baseName is the cached result of getBaseName. if 'other' has a + baseName and it fits in baseNameBuffer, then copy it. otherwise set + it to NULL, and let the user lazy-create it (in getBaseName) if they + want it. */ + if(baseName && baseName != baseNameBuffer) { + uprv_free(baseName); + } + baseName = NULL; + + if(other.baseName == other.baseNameBuffer) { + uprv_strcpy(baseNameBuffer, other.baseNameBuffer); + baseName = baseNameBuffer; + } + /* Copy the language and country fields */ uprv_strcpy(language, other.language); + uprv_strcpy(script, other.script); uprv_strcpy(country, other.country); /* The variantBegin is an offset into fullName, just copy it */ @@ -334,6 +477,11 @@ Locale &Locale::operator=(const Locale &other) return *this; } +Locale * +Locale::clone() const { + return new Locale(*this); +} + UBool Locale::operator==( const Locale& other) const { @@ -341,7 +489,7 @@ Locale::operator==( const Locale& other) const } /*This function initializes a Locale from a C locale ID*/ -Locale& Locale::init(const char* localeID) +Locale& Locale::init(const char* localeID, UBool canonicalize) { fIsBogus = FALSE; /* Free our current storage */ @@ -350,11 +498,20 @@ Locale& Locale::init(const char* localeID) fullName = fullNameBuffer; } + if(baseName && baseName != baseNameBuffer) { + uprv_free(baseName); + baseName = NULL; + } + // not a loop: // just an easy way to have a common error-exit // without goto and without another function do { - char *separator, *prev; + char *separator; + char *field[5] = {0}; + int32_t fieldLen[5] = {0}; + int32_t fieldIdx; + int32_t variantField; int32_t length; UErrorCode err; @@ -363,10 +520,16 @@ Locale& Locale::init(const char* localeID) return *this = getDefault(); } + /* preset all fields to empty */ + language[0] = script[0] = country[0] = 0; + // "canonicalize" the locale ID to ICU/Java format err = U_ZERO_ERROR; - length = uloc_getName(localeID, fullName, sizeof(fullNameBuffer), &err); - if(U_FAILURE(err) || err == U_STRING_NOT_TERMINATED_WARNING) { + length = canonicalize ? + uloc_canonicalize(localeID, fullName, sizeof(fullNameBuffer), &err) : + uloc_getName(localeID, fullName, sizeof(fullNameBuffer), &err); + + if(err == U_BUFFER_OVERFLOW_ERROR || length >= (int32_t)sizeof(fullNameBuffer)) { /*Go to heap for the fullName if necessary*/ fullName = (char *)uprv_malloc(sizeof(char)*(length + 1)); if(fullName == 0) { @@ -374,57 +537,69 @@ Locale& Locale::init(const char* localeID) break; // error: out of memory } err = U_ZERO_ERROR; - length = uloc_getName(localeID, fullName, length + 1, &err); + length = canonicalize ? + uloc_canonicalize(localeID, fullName, length+1, &err) : + uloc_getName(localeID, fullName, length+1, &err); } if(U_FAILURE(err) || err == U_STRING_NOT_TERMINATED_WARNING) { /* should never occur */ break; } - /* preset all fields to empty */ - language[0] = country[0] = 0; - variantBegin = (int32_t)uprv_strlen(fullName); - - /* after uloc_getName() we know that only '_' are separators */ - separator = uprv_strchr(fullName, SEP_CHAR); - if(separator != 0) { - /* there is a country field */ - length = (int32_t)(separator - fullName); - if(length > 0) { - if(length >= (int32_t)sizeof(language)) { - break; // error: language code too long - } - uprv_memcpy(language, fullName, length); - } - language[length] = 0; - - prev = separator + 1; - separator = uprv_strchr(prev, SEP_CHAR); - if(separator != 0) { - /* there is a variant field */ - length = (int32_t)(separator - prev); - if(length > 0) { - if(length >= (int32_t)sizeof(country)) { - break; // error: country code too long - } - uprv_memcpy(country, prev, length); - } - country[length] = 0; + variantBegin = length; - variantBegin = (int32_t)((separator + 1) - fullName); - } else { - /* variantBegin==strlen(fullName), length==strlen(language)==prev-1-fullName */ - if((variantBegin - length - 1) >= (int32_t)sizeof(country)) { - break; // error: country code too long - } - uprv_strcpy(country, prev); + /* after uloc_getName/canonicalize() we know that only '_' are separators */ + separator = field[0] = fullName; + fieldIdx = 1; + while ((separator = uprv_strchr(field[fieldIdx-1], SEP_CHAR)) && fieldIdx < (int32_t)(sizeof(field)/sizeof(field[0]))-1) { + field[fieldIdx] = separator + 1; + fieldLen[fieldIdx-1] = separator - field[fieldIdx-1]; + fieldIdx++; + } + // variant may contain @foo or .foo POSIX cruft; remove it + separator = uprv_strchr(field[fieldIdx-1], '@'); + char* sep2 = uprv_strchr(field[fieldIdx-1], '.'); + if (separator!=NULL || sep2!=NULL) { + if (separator==NULL || (sep2!=NULL && separator > sep2)) { + separator = sep2; } + fieldLen[fieldIdx-1] = separator - field[fieldIdx-1]; } else { - /* variantBegin==strlen(fullName) */ - if(variantBegin >= (int32_t)sizeof(language)) { - break; // error: language code too long + fieldLen[fieldIdx-1] = length - (int32_t)(field[fieldIdx-1] - fullName); + } + + if (fieldLen[0] >= (int32_t)(sizeof(language)) + || (fieldLen[1] == 4 && fieldLen[2] >= (int32_t)(sizeof(country))) + || (fieldLen[1] != 4 && fieldLen[1] >= (int32_t)(sizeof(country)))) + { + break; // error: one of the fields is too long + } + + variantField = 2; /* Usually the 2nd one, except when a script is used. */ + if (fieldLen[0] > 0) { + /* We have a language */ + uprv_memcpy(language, fullName, fieldLen[0]); + language[fieldLen[0]] = 0; + } + if (fieldLen[1] == 4) { + /* We have at least a script */ + uprv_memcpy(script, field[1], fieldLen[1]); + script[fieldLen[1]] = 0; + variantField = 3; + if (fieldLen[2] > 0) { + /* We have a country */ + uprv_memcpy(country, field[2], fieldLen[2]); + country[fieldLen[2]] = 0; } - uprv_strcpy(language, fullName); + } + else if (fieldLen[1] > 0) { + /* We have a country and no script */ + uprv_memcpy(country, field[1], fieldLen[1]); + country[fieldLen[1]] = 0; + } + if (variantField > 0 && fieldLen[variantField] > 0) { + /* We have a variant */ + variantBegin = (int32_t)(field[variantField] - fullName); } // successful end of init() @@ -438,75 +613,70 @@ Locale& Locale::init(const char* localeID) } int32_t -Locale::hashCode() const +Locale::hashCode() const { UHashTok hashKey; hashKey.pointer = fullName; return uhash_hashChars(hashKey); } -void +void Locale::setToBogus() { - /* Free our current storage */ - if(fullName != fullNameBuffer) { - uprv_free(fullName); - fullName = fullNameBuffer; - } - *fullNameBuffer = 0; - *language = 0; - *country = 0; - fIsBogus = TRUE; + /* Free our current storage */ + if(fullName != fullNameBuffer) { + uprv_free(fullName); + fullName = fullNameBuffer; + } + *fullNameBuffer = 0; + *language = 0; + *script = 0; + *country = 0; + fIsBogus = TRUE; } -const Locale& -Locale::getDefault() +const Locale& U_EXPORT2 +Locale::getDefault() { + const Locale *retLocale; umtx_lock(NULL); - UBool needInit = (gDefaultLocale == NULL); + retLocale = gDefaultLocale; umtx_unlock(NULL); - if (needInit) { - Locale *tLocale = new Locale(Locale::eBOGUS); - if (tLocale != NULL) { - const char *cLocale; - - umtx_lock(NULL); - /* uprv_getDefaultLocaleID is not thread safe, so we surround it with a mutex */ - cLocale = uprv_getDefaultLocaleID(); - umtx_unlock(NULL); - - tLocale->init(cLocale); - umtx_lock(NULL); - if (gDefaultLocale == NULL) { - gDefaultLocale = tLocale; - tLocale = NULL; - } - umtx_unlock(NULL); - delete tLocale; - } + if (retLocale == NULL) { + locale_set_default_internal(NULL); + umtx_lock(NULL); + // Need a mutex in case some other thread set a new + // default inbetween when we set and when we get the new default. For + // processors with weak memory coherency, we might not otherwise see all + // of the newly created new default locale. + retLocale = gDefaultLocale; + umtx_unlock(NULL); } - return *gDefaultLocale; + return *retLocale; } -void -Locale::setDefault( const Locale& newLocale, - UErrorCode& status) + + +void U_EXPORT2 +Locale::setDefault( const Locale& newLocale, + UErrorCode& status) { - if (U_FAILURE(status)) + if (U_FAILURE(status)) { return; - - const Locale *defLocale = &Locale::getDefault(); - umtx_lock(NULL); - Locale *ncDefLocale = (Locale *)defLocale; - *ncDefLocale = newLocale; - umtx_unlock(NULL); + } + + /* Set the default from the full name string of the supplied locale. + * This is a convenient way to access the default locale caching mechanisms. + */ + const char *localeID = newLocale.getName(); + locale_set_default_internal(localeID); } -Locale +Locale U_EXPORT2 Locale::createFromName (const char *name) { if (name) { - Locale l; - l.init(name); + Locale l(""); + l.init(name, FALSE); return l; } else { @@ -514,6 +684,12 @@ Locale::createFromName (const char *name) } } +Locale U_EXPORT2 +Locale::createCanonical(const char* name) { + Locale loc(""); + loc.init(name, TRUE); + return loc; +} const char * Locale::getISO3Language() const @@ -535,13 +711,13 @@ Locale::getISO3Country() const * in an incorrect format, 0 is returned. The LocaleID is for use in * Windows (it is an LCID), but is available on all platforms. */ -uint32_t +uint32_t Locale::getLCID() const { return uloc_getLCID(fullName); } -UnicodeString& +UnicodeString& Locale::getDisplayLanguage(UnicodeString& dispLang) const { return this->getDisplayLanguage(getDefault(), dispLang); @@ -591,7 +767,51 @@ Locale::getDisplayLanguage(const Locale &displayLocale, return result; } -UnicodeString& +UnicodeString& +Locale::getDisplayScript(UnicodeString& dispScript) const +{ + return this->getDisplayScript(getDefault(), dispScript); +} + +UnicodeString& +Locale::getDisplayScript(const Locale &displayLocale, + UnicodeString &result) const { + UChar *buffer; + UErrorCode errorCode=U_ZERO_ERROR; + int32_t length; + + buffer=result.getBuffer(ULOC_FULLNAME_CAPACITY); + if(buffer==0) { + result.truncate(0); + return result; + } + + length=uloc_getDisplayScript(fullName, displayLocale.fullName, + buffer, result.getCapacity(), + &errorCode); + result.releaseBuffer(length); + + if(errorCode==U_BUFFER_OVERFLOW_ERROR) { + buffer=result.getBuffer(length); + if(buffer==0) { + result.truncate(0); + return result; + } + errorCode=U_ZERO_ERROR; + length=uloc_getDisplayScript(fullName, displayLocale.fullName, + buffer, result.getCapacity(), + &errorCode); + result.releaseBuffer(length); + } + + if(U_FAILURE(errorCode)) { + result.truncate(0); + } + + return result; +} + +UnicodeString& Locale::getDisplayCountry(UnicodeString& dispCntry) const { return this->getDisplayCountry(getDefault(), dispCntry); @@ -635,7 +855,7 @@ Locale::getDisplayCountry(const Locale &displayLocale, return result; } -UnicodeString& +UnicodeString& Locale::getDisplayVariant(UnicodeString& dispVar) const { return this->getDisplayVariant(getDefault(), dispVar); @@ -679,7 +899,7 @@ Locale::getDisplayVariant(const Locale &displayLocale, return result; } -UnicodeString& +UnicodeString& Locale::getDisplayName( UnicodeString& name ) const { return this->getDisplayName(getDefault(), name); @@ -722,14 +942,14 @@ Locale::getDisplayName(const Locale &displayLocale, return result; } -const Locale* -Locale::getAvailableLocales(int32_t& count) +const Locale* U_EXPORT2 +Locale::getAvailableLocales(int32_t& count) { // for now, there is a hardcoded list, so just walk through that list and set it up. umtx_lock(NULL); UBool needInit = availableLocaleList == 0; umtx_unlock(NULL); - + if (needInit) { int32_t locCount = uloc_countAvailable(); Locale *newLocaleList = 0; @@ -739,18 +959,19 @@ Locale::getAvailableLocales(int32_t& count) if (newLocaleList == NULL) { return NULL; } - + count = locCount; - + while(--locCount >= 0) { newLocaleList[locCount].setFromPOSIXID(uloc_getAvailable(locCount)); } - + umtx_lock(NULL); if(availableLocaleList == 0) { availableLocaleListCount = count; availableLocaleList = newLocaleList; newLocaleList = NULL; + ucln_common_registerCleanup(UCLN_COMMON_LOCALE, locale_cleanup); } umtx_unlock(NULL); delete []newLocaleList; @@ -759,144 +980,144 @@ Locale::getAvailableLocales(int32_t& count) return availableLocaleList; } -const char* const* Locale::getISOCountries() +const char* const* U_EXPORT2 Locale::getISOCountries() { return uloc_getISOCountries(); } -const char* const* Locale::getISOLanguages() +const char* const* U_EXPORT2 Locale::getISOLanguages() { return uloc_getISOLanguages(); } -// Set the locale's data based on a posix id. +// Set the locale's data based on a posix id. void Locale::setFromPOSIXID(const char *posixID) { - init(posixID); + init(posixID, TRUE); } -const Locale & +const Locale & U_EXPORT2 Locale::getEnglish(void) { return getLocale(eENGLISH); } -const Locale & +const Locale & U_EXPORT2 Locale::getFrench(void) { return getLocale(eFRENCH); } -const Locale & +const Locale & U_EXPORT2 Locale::getGerman(void) { return getLocale(eGERMAN); } -const Locale & +const Locale & U_EXPORT2 Locale::getItalian(void) { return getLocale(eITALIAN); } -const Locale & +const Locale & U_EXPORT2 Locale::getJapanese(void) { return getLocale(eJAPANESE); } -const Locale & +const Locale & U_EXPORT2 Locale::getKorean(void) { return getLocale(eKOREAN); } -const Locale & +const Locale & U_EXPORT2 Locale::getChinese(void) { return getLocale(eCHINESE); } -const Locale & +const Locale & U_EXPORT2 Locale::getSimplifiedChinese(void) { return getLocale(eCHINA); } -const Locale & +const Locale & U_EXPORT2 Locale::getTraditionalChinese(void) { return getLocale(eTAIWAN); } -const Locale & +const Locale & U_EXPORT2 Locale::getFrance(void) { return getLocale(eFRANCE); } -const Locale & +const Locale & U_EXPORT2 Locale::getGermany(void) { return getLocale(eGERMANY); } -const Locale & +const Locale & U_EXPORT2 Locale::getItaly(void) { return getLocale(eITALY); } -const Locale & +const Locale & U_EXPORT2 Locale::getJapan(void) { return getLocale(eJAPAN); } -const Locale & +const Locale & U_EXPORT2 Locale::getKorea(void) { return getLocale(eKOREA); } -const Locale & +const Locale & U_EXPORT2 Locale::getChina(void) { return getLocale(eCHINA); } -const Locale & +const Locale & U_EXPORT2 Locale::getPRC(void) { return getLocale(eCHINA); } -const Locale & +const Locale & U_EXPORT2 Locale::getTaiwan(void) { return getLocale(eTAIWAN); } -const Locale & +const Locale & U_EXPORT2 Locale::getUK(void) { return getLocale(eUK); } -const Locale & +const Locale & U_EXPORT2 Locale::getUS(void) { return getLocale(eUS); } -const Locale & +const Locale & U_EXPORT2 Locale::getCanada(void) { return getLocale(eCANADA); } -const Locale & +const Locale & U_EXPORT2 Locale::getCanadaFrench(void) { return getLocale(eCANADA_FRENCH); @@ -925,9 +1146,9 @@ Locale::getLocaleCache(void) umtx_lock(NULL); UBool needInit = (gLocaleCache == NULL); umtx_unlock(NULL); - + if (needInit) { - Locale *tLocaleCache = new Locale[eMAX_LOCALES]; + Locale *tLocaleCache = new Locale[(int)eMAX_LOCALES]; if (tLocaleCache == NULL) { return NULL; } @@ -949,11 +1170,12 @@ Locale::getLocaleCache(void) tLocaleCache[eUS] = Locale("en", "US"); tLocaleCache[eCANADA] = Locale("en", "CA"); tLocaleCache[eCANADA_FRENCH] = Locale("fr", "CA"); - + umtx_lock(NULL); if (gLocaleCache == NULL) { gLocaleCache = tLocaleCache; tLocaleCache = NULL; + ucln_common_registerCleanup(UCLN_COMMON_LOCALE, locale_cleanup); } umtx_unlock(NULL); if (tLocaleCache) { @@ -963,5 +1185,136 @@ Locale::getLocaleCache(void) return gLocaleCache; } +class KeywordEnumeration : public StringEnumeration { +private: + char *keywords; + char *current; + int32_t length; + UnicodeString currUSKey; + static const char fgClassID;/* Warning this is used beyond the typical RTTI usage. */ + +public: + static UClassID U_EXPORT2 getStaticClassID(void) { return (UClassID)&fgClassID; } + virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); } +public: + KeywordEnumeration(const char *keys, int32_t keywordLen, int32_t currentIndex, UErrorCode &status) + : keywords((char *)&fgClassID), current((char *)&fgClassID), length(0) { + if(U_SUCCESS(status) && keywordLen != 0) { + if(keys == NULL || keywordLen < 0) { + status = U_ILLEGAL_ARGUMENT_ERROR; + } else { + keywords = (char *)uprv_malloc(keywordLen+1); + if (keywords == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + } + else { + uprv_memcpy(keywords, keys, keywordLen); + keywords[keywordLen] = 0; + current = keywords + currentIndex; + length = keywordLen; + } + } + } + } + + virtual ~KeywordEnumeration() { + uprv_free(keywords); + } + + virtual StringEnumeration * clone() const + { + UErrorCode status = U_ZERO_ERROR; + return new KeywordEnumeration(keywords, length, (int32_t)(current - keywords), status); + } + + virtual int32_t count(UErrorCode &/*status*/) const { + char *kw = keywords; + int32_t result = 0; + while(*kw) { + result++; + kw += uprv_strlen(kw)+1; + } + return result; + } + + virtual const char* next(int32_t* resultLength, UErrorCode& status) { + const char* result; + int32_t len; + if(U_SUCCESS(status) && *current != 0) { + result = current; + len = uprv_strlen(current); + current += len+1; + if(resultLength != NULL) { + *resultLength = len; + } + } else { + if(resultLength != NULL) { + *resultLength = 0; + } + result = NULL; + } + return result; + } + + virtual const UnicodeString* snext(UErrorCode& status) { + int32_t resultLength = 0; + const char *s = next(&resultLength, status); + return setChars(s, resultLength, status); + } + + virtual void reset(UErrorCode& /*status*/) { + current = keywords; + } +}; + +const char KeywordEnumeration::fgClassID = '\0'; + +StringEnumeration * +Locale::createKeywords(UErrorCode &status) const +{ + char keywords[256]; + int32_t keywordCapacity = 256; + StringEnumeration *result = NULL; + + const char* variantStart = uprv_strchr(fullName, '@'); + const char* assignment = uprv_strchr(fullName, '='); + if(variantStart) { + if(assignment > variantStart) { + int32_t keyLen = locale_getKeywords(variantStart+1, '@', keywords, keywordCapacity, NULL, 0, NULL, FALSE, &status); + if(keyLen) { + result = new KeywordEnumeration(keywords, keyLen, 0, status); + } + } else { + status = U_INVALID_FORMAT_ERROR; + } + } + return result; +} + +int32_t +Locale::getKeywordValue(const char* keywordName, char *buffer, int32_t bufLen, UErrorCode &status) const +{ + return uloc_getKeywordValue(fullName, keywordName, buffer, bufLen, &status); +} + +const char * +Locale::getBaseName() const +{ + // lazy init + UErrorCode status = U_ZERO_ERROR; + // semantically const + if(baseName == 0) { + ((Locale *)this)->baseName = ((Locale *)this)->baseNameBuffer; + int32_t baseNameSize = uloc_getBaseName(fullName, baseName, ULOC_FULLNAME_CAPACITY, &status); + if(baseNameSize >= ULOC_FULLNAME_CAPACITY) { + ((Locale *)this)->baseName = (char *)uprv_malloc(sizeof(char) * baseNameSize + 1); + uloc_getBaseName(fullName, baseName, baseNameSize+1, &status); + } + baseName[baseNameSize] = 0; + } + return baseName; +} + + //eof U_NAMESPACE_END diff --git a/icuSources/common/locmap.c b/icuSources/common/locmap.c index 0aaada18..a403ee48 100644 --- a/icuSources/common/locmap.c +++ b/icuSources/common/locmap.c @@ -1,10 +1,8 @@ /* ********************************************************************** - * Copyright (C) 1996-2003, International Business Machines + * Copyright (C) 1996-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** -*/ -/* * * Provides functionality for mapping between * LCID and Posix IDs or ICU locale to codepage @@ -13,8 +11,8 @@ * intended for internal use only. * * Methods of interest: - * unsigned long convertToLCID(const int8_t*); - * const int8_t* convertToPosix(unsigned long); + * unsigned long convertToLCID(const char*); + * const char* convertToPosix(unsigned long); * * Kathleen Wilson, 4/30/96 * @@ -30,127 +28,15 @@ #include "locmap.h" #include "cstring.h" -static struct -{ - const char *loc; - const char *charmap; -} -const _localeToDefaultCharmapTable [] = -{ -/* - See: http://czyborra.com/charsets/iso8859.html -*/ - -/* xx_XX locales first, so they will match: */ - { "zh_CN", "gb2312" }, /* Chinese (Simplified) */ - { "zh_TW", "Big5" }, /* Chinese (Traditional) */ - - { "af", "iso-8859-1" }, /* Afrikaans */ - { "ar", "iso-8859-6" }, /* Arabic */ - { "be", "iso-8859-5" }, /* Byelorussian */ - { "bg", "iso-8859-5" }, /* Bulgarian */ - { "ca", "iso-8859-1" }, /* Catalan */ - { "cs", "iso-8859-2" }, /* Czech */ - { "da", "iso-8859-1" }, /* Danish */ - { "de", "iso-8859-1" }, /* German */ - { "el", "iso-8859-7" }, /* Greek */ - { "en", "iso-8859-1" }, /* English */ - { "eo", "iso-8859-3" }, /* Esperanto */ - { "es", "iso-8859-1" }, /* Spanish */ - { "et", "iso-8859-4" }, /* Estonian */ - { "eu", "iso-8859-1" }, /* basque */ - { "fi", "iso-8859-1" }, /* Finnish */ - { "fo", "iso-8859-1" }, /* faroese */ - { "fr", "iso-8859-1" }, /* French */ - { "ga", "iso-8859-1" }, /* Irish (Gaelic) */ - { "gd", "iso-8859-1" }, /* Scottish */ - { "he", "iso-8859-8" }, /* hebrew */ - { "hr", "iso-8859-2" }, /* Croatian */ - { "hu", "iso-8859-2" }, /* Hungarian */ - { "in", "iso-8859-1" }, /* Indonesian */ - { "is", "iso-8859-1" }, /* Icelandic */ - { "it", "iso-8859-1" }, /* Italian */ - { "iw", "iso-8859-8" }, /* hebrew old ISO name */ - { "ja", "Shift_JIS" }, /* Japanese [was: ja_JP ] */ - { "ji", "iso-8859-8" }, /* Yiddish */ - { "kl", "iso-8859-4" }, /* Greenlandic */ - { "ko", "euc-kr" }, /* korean [was: ko_KR ] */ - { "lt", "iso-8859-4" }, /* Lithuanian */ - { "lv", "iso-8859-4" }, /* latvian (lettish) */ - { "mk", "iso-8859-5" }, /* Macedonian */ - { "mt", "iso-8859-3" }, /* Maltese */ - { "nb", "iso-8859-1" }, /* Norwegian Bokmal */ - { "nl", "iso-8859-1" }, /* dutch */ - { "no", "iso-8859-1" }, /* Norwegian old ISO name*/ - { "nn", "iso-8859-1" }, /* Norwegian Nynorsk */ - { "pl", "iso-8859-2" }, /* Polish */ - { "pt", "iso-8859-1" }, /* Portugese */ - { "rm", "iso-8859-1" }, /* Rhaeto-romance */ - { "ro", "iso-8859-2" }, /* Romanian */ - { "ru", "iso-8859-5" }, /* Russian */ - { "sk", "iso-8859-2" }, /* Slovak */ - { "sl", "iso-8859-2" }, /* Slovenian */ - { "sq", "iso-8859-1" }, /* albanian */ - { "sr", "iso-8859-5" }, /* Serbian */ - { "sv", "iso-8859-1" }, /* Swedish */ - { "sw", "iso-8859-1" }, /* Swahili */ - { "th", "tis-620" }, /* Thai [windows-874] */ - { "tr", "iso-8859-9" }, /* Turkish */ - { "uk", "iso-8859-5" }, /* pre 1990 Ukranian... see: */ - { "zh", "Big-5" }, /* Chinese (Traditional) */ - { NULL, NULL } -}; - -U_CAPI const char* U_EXPORT2 -uprv_defaultCodePageForLocale(const char *locale) -{ - int32_t i; - int32_t locale_len; - - if (locale == NULL) - { - return NULL; - } - locale_len = (int32_t)uprv_strlen(locale); - - if(locale_len < 2) - { - return NULL; /* non existent. Not a complete check, but it will - * make sure that 'c' doesn't match catalan, etc. - */ - } - - for(i=0; _localeToDefaultCharmapTable[i].loc; i++) - { - if(uprv_strncmp(locale, _localeToDefaultCharmapTable[i].loc, - uprv_min(locale_len, - (int32_t)uprv_strlen(_localeToDefaultCharmapTable[i].loc))) - == 0) - { - return _localeToDefaultCharmapTable[i].charmap; - } - } - - return NULL; -} - -#ifdef WIN32 - /* * Note: - * This code is used only internally by putil.c/uprv_getDefaultLocaleID(). * The mapping from Win32 locale ID numbers to POSIX locale strings should - * be the faster one. It is more important to get the LCID to ICU locale - * mapping correct than to get a correct ICU locale to LCID mapping. - * - * In order to test this code, please use the lcid test program. + * be the faster one. * - * The LCID values come from winnt.h + * Many LCID values come from winnt.h + * Some also come from http://www.microsoft.com/globaldev/reference/lcid-all.mspx */ -#include "unicode/uloc.h" - - /* //////////////////////////////////////////////// // @@ -171,25 +57,6 @@ typedef struct ILcidPosixMap const struct ILcidPosixElement* const regionMaps; } ILcidPosixMap; -static const char* posixID(const ILcidPosixMap *this_0, uint32_t fromHostID); - -/** - * Searches for a Windows LCID - * - * @param posixid the Posix style locale id. - * @param status gets set to U_ILLEGAL_ARGUMENT_ERROR when the Posix ID has - * no equivalent Windows LCID. - * @return the LCID - */ -static uint32_t hostID(const ILcidPosixMap *this_0, const char* fromPosixID, UErrorCode* status); - -/** - * Do not call this function. It is called by hostID. - * The function is not private because this struct must stay as a C struct, - * and this is an internal class. - */ -static int32_t idCmp(const char* id1, const char* id2); - /* ///////////////////////////////////////////////// @@ -252,19 +119,41 @@ static const ILcidPosixElement ar[] = { {0x2401, "ar_YE"} }; -ILCID_POSIX_ELEMENT_ARRAY(0x044d, as, as_IN) /*Todo: Data does not exist*/ +ILCID_POSIX_ELEMENT_ARRAY(0x044d, as, as_IN) +ILCID_POSIX_ELEMENT_ARRAY(0x045e, am, am_ET) static const ILcidPosixElement az[] = { {0x2c, "az"}, {0x082c, "az_AZ"}, /* Cyrillic based */ - {0x042c, "az_AZ_LATN"} /* Latin based */ + {0x042c, "az_Latn_AZ"} /* Latin based */ }; ILCID_POSIX_ELEMENT_ARRAY(0x0423, be, be_BY) ILCID_POSIX_ELEMENT_ARRAY(0x0402, bg, bg_BG) -ILCID_POSIX_ELEMENT_ARRAY(0x0445, bn, bn_IN) + +static const ILcidPosixElement bn[] = { + {0x45, "bn"}, + {0x0845, "bn_BD"}, + {0x0445, "bn_IN"} +}; + + +static const ILcidPosixElement bo[] = { + {0x51, "bo"}, + {0x0851, "bo_BT"}, + {0x0451, "bo_CN"} +}; + ILCID_POSIX_ELEMENT_ARRAY(0x0403, ca, ca_ES) -ILCID_POSIX_ELEMENT_ARRAY(0x0405, cs, cs_CZ) +ILCID_POSIX_ELEMENT_ARRAY(0x045c, chr,chr_US) + +/* Declared as cs_CZ to get around compiler errors on z/OS, which defines cs as a function */ +static const ILcidPosixElement cs_CZ[] = { + {0x05, "cs"}, + {0x0405, "cs_CZ"}, +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x0452, cy, cy_GB) ILCID_POSIX_ELEMENT_ARRAY(0x0406, da, da_DK) static const ILcidPosixElement de[] = { @@ -295,7 +184,12 @@ static const ILcidPosixElement en[] = { {0x007f, "en_US_POSIX"}, /* duplicate for roundtripping */ {0x2409, "en_VI"}, /* Virgin Islands AKA Caribbean Islands (en_CB). */ {0x1c09, "en_ZA"}, - {0x3009, "en_ZW"} + {0x3009, "en_ZW"}, + {0x0409, "en_AS"}, /* Alias for en_US. Leave last. */ + {0x0409, "en_GU"}, /* Alias for en_US. Leave last. */ + {0x0409, "en_MH"}, /* Alias for en_US. Leave last. */ + {0x0409, "en_MP"}, /* Alias for en_US. Leave last. */ + {0x0409, "en_UM"} /* Alias for en_US. Leave last. */ }; static const ILcidPosixElement en_US_POSIX[] = { @@ -336,30 +230,55 @@ static const ILcidPosixElement fr[] = { {0x0c, "fr"}, {0x080c, "fr_BE"}, {0x0c0c, "fr_CA"}, + {0x240c, "fr_CD"}, {0x100c, "fr_CH"}, + {0x300c, "fr_CI"}, + {0x2c0c, "fr_CM"}, {0x040c, "fr_FR"}, + {0x3c0c, "fr_HT"}, {0x140c, "fr_LU"}, - {0x180c, "fr_MC"} + {0x380c, "fr_MA"}, + {0x180c, "fr_MC"}, + {0x340c, "fr_ML"}, + {0x200c, "fr_RE"}, + {0x280c, "fr_SN"} +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x0462, fy, fy_NL) + +/* This LCID is really two different locales.*/ +static const ILcidPosixElement ga[] = { + {0x3c, "ga"}, + {0x3c, "gd"}, + {0x083c, "ga_IE"}, /* Gaelic (Ireland) */ + {0x043c, "gd_GB"} /* Gaelic (Scotland) */ }; ILCID_POSIX_ELEMENT_ARRAY(0x0456, gl, gl_ES) ILCID_POSIX_ELEMENT_ARRAY(0x0447, gu, gu_IN) +ILCID_POSIX_ELEMENT_ARRAY(0x0474, gn, gn_PY) +ILCID_POSIX_ELEMENT_ARRAY(0x0468, ha, ha_NG) +ILCID_POSIX_ELEMENT_ARRAY(0x0475, haw,haw_US) ILCID_POSIX_ELEMENT_ARRAY(0x040d, he, he_IL) ILCID_POSIX_ELEMENT_ARRAY(0x0439, hi, hi_IN) -/* This LCID is really three different locales.*/ +/* This LCID is really four different locales.*/ static const ILcidPosixElement hr[] = { {0x1a, "hr"}, + {0x141a, "bs_BA"}, /* Bosnian, Bosnia and Herzegovina */ + {0x141a, "bs"}, /* Bosnian */ {0x041a, "hr_HR"}, /* Croatian*/ - {0x081a, "sh_YU"}, /* Serbo-Croatian*/ - {0x081a, "sh"}, /* It's 0x1a or 0x081a, pick one to make the test program happy. */ - {0x0c1a, "sr_YU"}, /* Serbian*/ - {0x0c1a, "sr"}, /* It's 0x1a or 0x0c1a, pick one to make the test program happy. */ + {0x081a, "sr_Latn_YU"}, /* Serbo-Croatian*/ + {0x081a, "sr_Latn"}, /* It's 0x1a or 0x081a, pick one to make the test program happy. */ + {0x0c1a, "sr_Cyrl_YU"}, /* Serbian*/ + {0x0c1a, "sr_Cyrl"}, /* It's 0x1a or 0x0c1a, pick one to make the test program happy. */ + {0x0c1a, "sr"}, /* It's 0x1a or 0x0c1a, pick one to make the test program happy. */ }; ILCID_POSIX_ELEMENT_ARRAY(0x040e, hu, hu_HU) ILCID_POSIX_ELEMENT_ARRAY(0x042b, hy, hy_AM) ILCID_POSIX_ELEMENT_ARRAY(0x0421, id, id_ID) +ILCID_POSIX_ELEMENT_ARRAY(0x0470, ig, ig_NG) ILCID_POSIX_ELEMENT_ARRAY(0x040f, is, is_IS) static const ILcidPosixElement it[] = { @@ -368,10 +287,12 @@ static const ILcidPosixElement it[] = { {0x0410, "it_IT"} }; +ILCID_POSIX_ELEMENT_ARRAY(0x045d, iu, iu_CA) /* TODO: verify country */ ILCID_POSIX_ELEMENT_ARRAY(0x040d, iw, iw_IL) /*Left in for compatibility*/ ILCID_POSIX_ELEMENT_ARRAY(0x0411, ja, ja_JP) ILCID_POSIX_ELEMENT_ARRAY(0x0437, ka, ka_GE) ILCID_POSIX_ELEMENT_ARRAY(0x043f, kk, kk_KZ) +ILCID_POSIX_ELEMENT_ARRAY(0x0453, km, km_KH) ILCID_POSIX_ELEMENT_ARRAY(0x044b, kn, kn_IN) static const ILcidPosixElement ko[] = { @@ -381,15 +302,25 @@ static const ILcidPosixElement ko[] = { }; ILCID_POSIX_ELEMENT_ARRAY(0x0457, kok, kok_IN) -ILCID_POSIX_ELEMENT_ARRAY(0x0460, ks, ks_IN) /*Todo: Data does not exist*/ -ILCID_POSIX_ELEMENT_ARRAY(0x0440, ky, ky_KG) /* Kyrgyz is spoken in Kyrgyzstan */ -ILCID_POSIX_ELEMENT_ARRAY(0x0427, lt, lt_LT) -ILCID_POSIX_ELEMENT_ARRAY(0x0426, lv, lv_LV) -ILCID_POSIX_ELEMENT_ARRAY(0x042f, mk, mk_MK) -ILCID_POSIX_ELEMENT_ARRAY(0x044c, ml, ml_IN) /*Todo: Data does not exist*/ -ILCID_POSIX_ELEMENT_ARRAY(0x0450, mn, mn_MN) -ILCID_POSIX_ELEMENT_ARRAY(0x0458, mni, mni_IN) /*Todo: Data does not exist*/ -ILCID_POSIX_ELEMENT_ARRAY(0x044e, mr, mr_IN) +ILCID_POSIX_ELEMENT_ARRAY(0x0471, kr, kr_NG) + +static const ILcidPosixElement ks[] = { /* We could add PK and CN too */ + {0x60, "ks"}, + {0x0860, "ks_IN"}, /* Documentation doesn't mention script */ + {0x0460, "ks_Arab_IN"} +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x0440, ky, ky_KG) /* Kyrgyz is spoken in Kyrgyzstan */ +ILCID_POSIX_ELEMENT_ARRAY(0x0476, la, la_IT) /* TODO: Verify the country */ +ILCID_POSIX_ELEMENT_ARRAY(0x0454, lo, lo_LA) +ILCID_POSIX_ELEMENT_ARRAY(0x0427, lt, lt_LT) +ILCID_POSIX_ELEMENT_ARRAY(0x0426, lv, lv_LV) +ILCID_POSIX_ELEMENT_ARRAY(0x0481, mi, mi_NZ) +ILCID_POSIX_ELEMENT_ARRAY(0x042f, mk, mk_MK) +ILCID_POSIX_ELEMENT_ARRAY(0x044c, ml, ml_IN) +ILCID_POSIX_ELEMENT_ARRAY(0x0450, mn, mn_MN) +ILCID_POSIX_ELEMENT_ARRAY(0x0458, mni,mni_IN) +ILCID_POSIX_ELEMENT_ARRAY(0x044e, mr, mr_IN) static const ILcidPosixElement ms[] = { {0x3e, "ms"}, @@ -400,7 +331,7 @@ static const ILcidPosixElement ms[] = { /* The MSJDK documentation says this is maltese, but it's not supported.*/ ILCID_POSIX_ELEMENT_ARRAY(0x043a, mt, mt_MT) -static const ILcidPosixElement ne[] = { /*Todo: Data does not exist*/ +static const ILcidPosixElement ne[] = { {0x61, "ne"}, {0x0861, "ne_IN"}, /* India*/ {0x0461, "ne_NP"} /* Nepal*/ @@ -415,19 +346,31 @@ static const ILcidPosixElement nl[] = { /* The "no" locale split into nb and nn. By default in ICU, "no" is nb.*/ static const ILcidPosixElement no[] = { {0x14, "nb"}, /* really nb */ - {0x0414, "nb_NO"}, /* really nb_NO */ - {0x0814, "nn_NO"}, /* really nn_NO */ - {0x0814, "nn"} /* It's 0x14 or 0x814, pick one to make the test program happy. */ + {0x0414, "nb_NO"}, /* really nb_NO. Keep first in the 414 list. */ + {0x0414, "no"}, /* really nb_NO */ + {0x0414, "no_NO"}, /* really nb_NO */ + {0x0814, "nn_NO"}, /* really nn_NO. Keep first in the 814 list. */ + {0x0814, "nn"}, /* It's 0x14 or 0x814, pick one to make the test program happy. */ + {0x0814, "no_NO_NY"}/* really nn_NO */ }; +ILCID_POSIX_ELEMENT_ARRAY(0x046c, nso,nso_ZA) /* TODO: Verify the country */ +ILCID_POSIX_ELEMENT_ARRAY(0x0472, om, om_ET) /* TODO: Verify the country */ + /* Declared as or_IN to get around compiler errors*/ static const ILcidPosixElement or_IN[] = { {0x48, "or"}, {0x0448, "or_IN"}, }; -ILCID_POSIX_ELEMENT_ARRAY(0x0446, pa, pa_IN) +static const ILcidPosixElement pa[] = { + {0x46, "pa"}, + {0x0446, "pa_IN"}, + {0x0846, "pa_PK"} +}; + ILCID_POSIX_ELEMENT_ARRAY(0x0415, pl, pl_PL) +ILCID_POSIX_ELEMENT_ARRAY(0x0463, ps, ps_AF) static const ILcidPosixElement pt[] = { {0x16, "pt"}, @@ -435,6 +378,13 @@ static const ILcidPosixElement pt[] = { {0x0816, "pt_PT"} }; +static const ILcidPosixElement qu[] = { + {0x6B, "qu"}, + {0x046B, "qu_BO"}, + {0x086B, "qu_EC"}, + {0x0C6B, "qu_PE"} +}; + ILCID_POSIX_ELEMENT_ARRAY(0x0418, ro, ro_RO) static const ILcidPosixElement root[] = { @@ -443,9 +393,17 @@ static const ILcidPosixElement root[] = { ILCID_POSIX_ELEMENT_ARRAY(0x0419, ru, ru_RU) ILCID_POSIX_ELEMENT_ARRAY(0x044f, sa, sa_IN) -ILCID_POSIX_ELEMENT_ARRAY(0x0459, sd, sd_IN) /*Todo: Data does not exist*/ + +static const ILcidPosixElement sd[] = { + {0x59, "sd"}, + {0x0459, "sd_IN"}, + {0x0859, "sd_PK"} +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x045b, si, si_LK) ILCID_POSIX_ELEMENT_ARRAY(0x041b, sk, sk_SK) ILCID_POSIX_ELEMENT_ARRAY(0x0424, sl, sl_SI) +ILCID_POSIX_ELEMENT_ARRAY(0x0477, so, so_ET) /* TODO: Verify the country */ ILCID_POSIX_ELEMENT_ARRAY(0x041c, sq, sq_AL) static const ILcidPosixElement sv[] = { @@ -459,8 +417,19 @@ ILCID_POSIX_ELEMENT_ARRAY(0x045A, syr, syr_SY) ILCID_POSIX_ELEMENT_ARRAY(0x0449, ta, ta_IN) ILCID_POSIX_ELEMENT_ARRAY(0x044a, te, te_IN) ILCID_POSIX_ELEMENT_ARRAY(0x041e, th, th_TH) + +static const ILcidPosixElement ti[] = { + {0x73, "ti"}, + {0x0873, "ti_ER"}, + {0x0473, "ti_ET"} +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x0442, tk, tk_TM) +ILCID_POSIX_ELEMENT_ARRAY(0x0464, tl, tl_PH) +ILCID_POSIX_ELEMENT_ARRAY(0x0432, tn, tn_BW) ILCID_POSIX_ELEMENT_ARRAY(0x041f, tr, tr_TR) ILCID_POSIX_ELEMENT_ARRAY(0x0444, tt, tt_RU) +ILCID_POSIX_ELEMENT_ARRAY(0x0480, ug, ug_CN) ILCID_POSIX_ELEMENT_ARRAY(0x0422, uk, uk_UA) static const ILcidPosixElement ur[] = { @@ -472,36 +441,64 @@ static const ILcidPosixElement ur[] = { static const ILcidPosixElement uz[] = { {0x43, "uz"}, {0x0843, "uz_UZ"}, /* Cyrillic based */ - {0x0443, "uz_UZ_LATN"} /* Latin based */ + {0x0443, "uz_Latn_UZ"} /* Latin based */ }; +ILCID_POSIX_ELEMENT_ARRAY(0x0433, ve, ve_ZA) /* TODO: Verify the country */ ILCID_POSIX_ELEMENT_ARRAY(0x042a, vi, vi_VN) +ILCID_POSIX_ELEMENT_ARRAY(0x0434, xh, xh_ZA) /* TODO: Verify the country */ +ILCID_POSIX_ELEMENT_ARRAY(0x046a, yo, yo_NG) /* TODO: Verify the country */ +/* TODO: Make the locales with the script the primary locale once the names are implemented in the resources. */ static const ILcidPosixElement zh[] = { {0x04, "zh"}, + {0x0804, "zh_Hans_CN"}, {0x0804, "zh_CN"}, + {0x0c04, "zh_Hant_HK"}, {0x0c04, "zh_HK"}, + {0x1404, "zh_Hant_MO"}, {0x1404, "zh_MO"}, + {0x1004, "zh_Hans_SG"}, {0x1004, "zh_SG"}, + {0x0404, "zh_Hant_TW"}, {0x0404, "zh_TW"}, - {0x30404,"zh_TW"}, - {0x20404,"zh_TW_STROKE"} + {0x30404,"zh_Hant_TW"}, + {0x30404,"zh_TW"}, /* Bopomofo order */ + {0x20404,"zh_TW@collation=STROKE"} }; +ILCID_POSIX_ELEMENT_ARRAY(0x0435, zu, zu_ZA) /* TODO: Verify the country */ + /* This must be static and grouped by LCID. */ + +/* non-existent ISO-639 codes */ +/* +0x466 Edo +0x467 Fulfulde - Nigeria +0x43b Sami (Lappish) +0x42e Sorbian (iso639 = dsb, hsb, wen) +0x430 Sutu +0x45f Tamazight (Arabic script) +0x85f Tamazight (Latin script) +0x478 Yi +*/ static const ILcidPosixMap gPosixIDmap[] = { ILCID_POSIX_MAP(af), /* af Afrikaans 0x36 */ + ILCID_POSIX_MAP(am), /* am Amharic 0x5e */ ILCID_POSIX_MAP(ar), /* ar Arabic 0x01 */ ILCID_POSIX_MAP(as), /* as Assamese 0x4d */ ILCID_POSIX_MAP(az), /* az Azerbaijani 0x2c */ - ILCID_POSIX_MAP(be), /* be Byelorussian 0x23 */ + ILCID_POSIX_MAP(be), /* be Belarusian 0x23 */ ILCID_POSIX_MAP(bg), /* bg Bulgarian 0x02 */ ILCID_POSIX_MAP(bn), /* bn Bengali; Bangla 0x45 */ + ILCID_POSIX_MAP(bo), /* bo Tibetan 0x51 */ ILCID_POSIX_MAP(ca), /* ca Catalan 0x03 */ - ILCID_POSIX_MAP(cs), /* cs Czech 0x05 */ + ILCID_POSIX_MAP(chr), /* chr Cherokee 0x5c */ + ILCID_POSIX_MAP(cs_CZ), /* cs Czech 0x05 */ + ILCID_POSIX_MAP(cy), /* cy Welsh 0x52 */ ILCID_POSIX_MAP(da), /* da Danish 0x06 */ ILCID_POSIX_MAP(de), /* de German 0x07 */ - ILCID_POSIX_MAP(dv), /* dv Divehi 0x65 */ + ILCID_POSIX_MAP(dv), /* dv Divehi 0x65 */ ILCID_POSIX_MAP(el), /* el Greek 0x08 */ ILCID_POSIX_MAP(en), /* en English 0x09 */ ILCID_POSIX_MAP(en_US_POSIX), /* invariant 0x7f */ @@ -512,28 +509,39 @@ static const ILcidPosixMap gPosixIDmap[] = { ILCID_POSIX_MAP(fi), /* fi Finnish 0x0b */ ILCID_POSIX_MAP(fo), /* fo Faroese 0x38 */ ILCID_POSIX_MAP(fr), /* fr French 0x0c */ + ILCID_POSIX_MAP(fy), /* fy Frisian 0x62 */ + ILCID_POSIX_MAP(ga), /* * Gaelic (Ireland,Scotland) 0x3c */ ILCID_POSIX_MAP(gl), /* gl Galician 0x56 */ + ILCID_POSIX_MAP(gn), /* gn Guarani 0x74 */ ILCID_POSIX_MAP(gu), /* gu Gujarati 0x47 */ + ILCID_POSIX_MAP(ha), /* ha Hausa 0x68 */ + ILCID_POSIX_MAP(haw), /* haw Hawaiian 0x75 */ ILCID_POSIX_MAP(he), /* he Hebrew (formerly iw) 0x0d */ ILCID_POSIX_MAP(hi), /* hi Hindi 0x39 */ - ILCID_POSIX_MAP(hr), /* hr Croatian 0x1a */ + ILCID_POSIX_MAP(hr), /* * Croatian and others 0x1a */ ILCID_POSIX_MAP(hu), /* hu Hungarian 0x0e */ ILCID_POSIX_MAP(hy), /* hy Armenian 0x2b */ ILCID_POSIX_MAP(id), /* id Indonesian (formerly in) 0x21 */ -/* ILCID_POSIX_MAP(in), // in Indonesian 0x21 */ + ILCID_POSIX_MAP(ig), /* ig Igbo 0x70 */ ILCID_POSIX_MAP(is), /* is Icelandic 0x0f */ ILCID_POSIX_MAP(it), /* it Italian 0x10 */ + ILCID_POSIX_MAP(iu), /* iu Inuktitut 0x5d */ ILCID_POSIX_MAP(iw), /* iw Hebrew 0x0d */ ILCID_POSIX_MAP(ja), /* ja Japanese 0x11 */ ILCID_POSIX_MAP(ka), /* ka Georgian 0x37 */ ILCID_POSIX_MAP(kk), /* kk Kazakh 0x3f */ + ILCID_POSIX_MAP(km), /* km Khmer 0x53 */ ILCID_POSIX_MAP(kn), /* kn Kannada 0x4b */ - ILCID_POSIX_MAP(ky), /* ky Kyrgyz 0x40 */ ILCID_POSIX_MAP(ko), /* ko Korean 0x12 */ ILCID_POSIX_MAP(kok), /* kok Konkani 0x57 */ + ILCID_POSIX_MAP(kr), /* kr Kanuri 0x71 */ ILCID_POSIX_MAP(ks), /* ks Kashmiri 0x60 */ + ILCID_POSIX_MAP(ky), /* ky Kyrgyz 0x40 */ + ILCID_POSIX_MAP(la), /* la Latin 0x76 */ + ILCID_POSIX_MAP(lo), /* lo Lao 0x54 */ ILCID_POSIX_MAP(lt), /* lt Lithuanian 0x27 */ ILCID_POSIX_MAP(lv), /* lv Latvian, Lettish 0x26 */ + ILCID_POSIX_MAP(mi), /* mi Maori 0x81 */ ILCID_POSIX_MAP(mk), /* mk Macedonian 0x2f */ ILCID_POSIX_MAP(ml), /* ml Malayalam 0x4c */ ILCID_POSIX_MAP(mn), /* mn Mongolian 0x50 */ @@ -541,42 +549,62 @@ static const ILcidPosixMap gPosixIDmap[] = { ILCID_POSIX_MAP(mr), /* mr Marathi 0x4e */ ILCID_POSIX_MAP(ms), /* ms Malay 0x3e */ ILCID_POSIX_MAP(mt), /* mt Maltese 0x3a */ -/* ILCID_POSIX_MAP(nb), // no Norwegian 0x14 */ +/* ILCID_POSIX_MAP(nb), // no Norwegian 0x14 */ ILCID_POSIX_MAP(ne), /* ne Nepali 0x61 */ ILCID_POSIX_MAP(nl), /* nl Dutch 0x13 */ -/* ILCID_POSIX_MAP(nn), // no Norwegian 0x14 */ - ILCID_POSIX_MAP(no), /* nb/nn Norwegian (formerly no) 0x14 */ +/* ILCID_POSIX_MAP(nn), // no Norwegian 0x14 */ + ILCID_POSIX_MAP(no), /* * Norwegian 0x14 */ + ILCID_POSIX_MAP(nso), /* nso Sotho, Northern (Sepedi dialect) 0x6c */ + ILCID_POSIX_MAP(om), /* om Oromo 0x72 */ ILCID_POSIX_MAP(or_IN), /* or Oriya 0x48 */ ILCID_POSIX_MAP(pa), /* pa Punjabi 0x46 */ ILCID_POSIX_MAP(pl), /* pl Polish 0x15 */ + ILCID_POSIX_MAP(ps), /* ps Pashto 0x63 */ ILCID_POSIX_MAP(pt), /* pt Portuguese 0x16 */ + ILCID_POSIX_MAP(qu), /* qu Quechua (correct spelling)0x6B */ ILCID_POSIX_MAP(ro), /* ro Romanian 0x18 */ ILCID_POSIX_MAP(root), /* root 0x00 */ ILCID_POSIX_MAP(ru), /* ru Russian 0x19 */ ILCID_POSIX_MAP(sa), /* sa Sanskrit 0x4f */ ILCID_POSIX_MAP(sd), /* sd Sindhi 0x59 */ -/* ILCID_POSIX_MAP(sh), // sh Serbo-Croatian 0x1a */ +/* ILCID_POSIX_MAP(sh), // sh Serbo-Croatian 0x1a */ + ILCID_POSIX_MAP(si), /* si Sinhalese 0x5b */ ILCID_POSIX_MAP(sk), /* sk Slovak 0x1b */ ILCID_POSIX_MAP(sl), /* sl Slovenian 0x24 */ + ILCID_POSIX_MAP(so), /* so Somali 0x77 */ ILCID_POSIX_MAP(sq), /* sq Albanian 0x1c */ -/* ILCID_POSIX_MAP(sr), // sr Serbian 0x1a */ +/* ILCID_POSIX_MAP(sr), // sr Serbian 0x1a */ ILCID_POSIX_MAP(sv), /* sv Swedish 0x1d */ ILCID_POSIX_MAP(sw), /* sw Swahili 0x41 */ ILCID_POSIX_MAP(syr), /* syr Syriac 0x5A */ ILCID_POSIX_MAP(ta), /* ta Tamil 0x49 */ ILCID_POSIX_MAP(te), /* te Telugu 0x4a */ ILCID_POSIX_MAP(th), /* th Thai 0x1e */ + ILCID_POSIX_MAP(ti), /* ti Tigrigna 0x73 */ + ILCID_POSIX_MAP(tk), /* tk Turkmen 0x42 */ + ILCID_POSIX_MAP(tl), /* tl Tagalog (Filipino) 0x64 */ + ILCID_POSIX_MAP(tn), /* tn Tswana 0x32 */ ILCID_POSIX_MAP(tr), /* tr Turkish 0x1f */ ILCID_POSIX_MAP(tt), /* tt Tatar 0x44 */ + ILCID_POSIX_MAP(ug), /* ug Uighur 0x80 */ ILCID_POSIX_MAP(uk), /* uk Ukrainian 0x22 */ ILCID_POSIX_MAP(ur), /* ur Urdu 0x20 */ ILCID_POSIX_MAP(uz), /* uz Uzbek 0x43 */ + ILCID_POSIX_MAP(ve), /* ve Venda 0x33 */ ILCID_POSIX_MAP(vi), /* vi Vietnamese 0x2a */ + ILCID_POSIX_MAP(xh), /* xh Xhosa 0x34 */ + ILCID_POSIX_MAP(yo), /* yo Yoruba 0x6a */ ILCID_POSIX_MAP(zh), /* zh Chinese 0x04 */ + ILCID_POSIX_MAP(zu), /* zu Zulu 0x35 */ }; static const uint32_t gLocaleCount = sizeof(gPosixIDmap)/sizeof(ILcidPosixMap); +/** + * Do not call this function. It is called by hostID. + * The function is not private because this struct must stay as a C struct, + * and this is an internal class. + */ static int32_t idCmp(const char* id1, const char* id2) { @@ -598,7 +626,7 @@ idCmp(const char* id1, const char* id2) * @return the LCID */ static uint32_t -hostID(const ILcidPosixMap *this_0, const char* posixID, UErrorCode* status) +getHostID(const ILcidPosixMap *this_0, const char* posixID, UErrorCode* status) { int32_t bestIdx = 0; int32_t bestIdxDiff = 0; @@ -627,7 +655,7 @@ hostID(const ILcidPosixMap *this_0, const char* posixID, UErrorCode* status) } static const char* -posixID(const ILcidPosixMap *this_0, uint32_t hostID) +getPosixID(const ILcidPosixMap *this_0, uint32_t hostID) { uint32_t i; for (i = 0; i <= this_0->numRegions; i++) @@ -661,32 +689,35 @@ uprv_convertToPosix(uint32_t hostid, UErrorCode* status) { if (langID == gPosixIDmap[index].regionMaps->hostID) { - return posixID(&gPosixIDmap[index], hostid); + return getPosixID(&gPosixIDmap[index], hostid); } } /* no match found */ *status = U_ILLEGAL_ARGUMENT_ERROR; - return "??_??"; + return NULL; } /* ////////////////////////////////////// // // POSIX --> LCID +// This should only be called from uloc_getLCID. +// The locale ID must be in canonical form. +// langID is separate so that this file doesn't depend on the uloc_* API. // ///////////////////////////////////// */ U_CAPI uint32_t -uprv_convertToLCID(const char* posixID, UErrorCode* status) +uprv_convertToLCID(const char *langID, const char* posixID, UErrorCode* status) { uint32_t low = 0; - uint32_t high = gLocaleCount - 1; + uint32_t high = gLocaleCount; uint32_t mid = high; + uint32_t oldmid = 0; int32_t compVal; - char langID[ULOC_FULLNAME_CAPACITY]; uint32_t value = 0; uint32_t fallbackValue = (uint32_t)-1; @@ -694,29 +725,30 @@ uprv_convertToLCID(const char* posixID, UErrorCode* status) uint32_t idx; /* Check for incomplete id. */ - if (!posixID || uprv_strlen(posixID) < 2) { - return 0; - } - - uloc_getLanguage(posixID, langID, sizeof(langID), status); - if (U_FAILURE(*status)) { + if (!langID || !posixID || uprv_strlen(langID) < 2 || uprv_strlen(posixID) < 2) { return 0; } /*Binary search for the map entry for normal cases */ - /* When mid == 0, it's not found */ - while (low <= high && mid != 0) { - mid = (low + high + 1) / 2; /* +1 is to round properly */ + while (high > low) /*binary search*/{ - compVal = uprv_strcmp(langID, gPosixIDmap[mid].regionMaps->posixID); + mid = (high+low) >> 1; /*Finds median*/ + + if (mid == oldmid) + break; - if (compVal < 0) - high = mid - 1; - else if (compVal > 0) - low = mid + 1; - else /* found match! */ - return hostID(&gPosixIDmap[mid], posixID, status); + compVal = uprv_strcmp(langID, gPosixIDmap[mid].regionMaps->posixID); + if (compVal < 0){ + high = mid; + } + else if (compVal > 0){ + low = mid; + } + else /*we found it*/{ + return getHostID(&gPosixIDmap[mid], posixID, status); + } + oldmid = mid; } /* @@ -725,7 +757,7 @@ uprv_convertToLCID(const char* posixID, UErrorCode* status) */ for (idx = 0; idx < gLocaleCount; idx++ ) { myStatus = U_ZERO_ERROR; - value = hostID(&gPosixIDmap[idx], posixID, &myStatus); + value = getHostID(&gPosixIDmap[idx], posixID, &myStatus); if (myStatus == U_ZERO_ERROR) { return value; } @@ -744,5 +776,3 @@ uprv_convertToLCID(const char* posixID, UErrorCode* status) return 0; /* return international (root) */ } -#endif - diff --git a/icuSources/common/locmap.h b/icuSources/common/locmap.h index e1a5b379..7db06070 100644 --- a/icuSources/common/locmap.h +++ b/icuSources/common/locmap.h @@ -1,16 +1,12 @@ /* ****************************************************************************** * -* Copyright (C) 1996-2003, International Business Machines +* Copyright (C) 1996-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** -*/ -/* -*============================================================================ * * File locmap.h : Locale Mapping Classes -* * * * Created by: Helena Shih @@ -25,21 +21,17 @@ *============================================================================ */ -/* include this first so that we are sure to get WIN32 defined */ -#include "unicode/utypes.h" - #ifndef LOCMAP_H #define LOCMAP_H -U_CAPI const char* U_EXPORT2 -uprv_defaultCodePageForLocale(const char *locale); +#include "unicode/utypes.h" -#ifdef WIN32 #define LANGUAGE_LCID(hostID) (uint16_t)(0x03FF & hostID) U_CAPI const char *uprv_convertToPosix(uint32_t hostid, UErrorCode* status); -U_CAPI uint32_t uprv_convertToLCID(const char* posixID, UErrorCode* status); -#endif /* WIN32 */ +/* Don't call this function directly. Use uloc_getLCID instead. */ +U_CAPI uint32_t uprv_convertToLCID(const char *langID, const char* posixID, UErrorCode* status); #endif /* LOCMAP_H */ + diff --git a/icuSources/common/msvcres.h b/icuSources/common/msvcres.h new file mode 100644 index 00000000..1bd84b07 --- /dev/null +++ b/icuSources/common/msvcres.h @@ -0,0 +1,11 @@ +//{{NO_DEPENDENCIES}} +// Copyright (c) 2003 International Business Machines +// Corporation and others. All Rights Reserved. +// +// Used by common.rc and other .rc files. +//Do not edit with Microsoft Developer Studio because it will modify this +//header the wrong way. This is here to prevent Visual Studio .NET from +//unnessarily building the resource files when it's not needed. +// +#include "unicode/uversion.h" + diff --git a/icuSources/common/mutex.cpp b/icuSources/common/mutex.cpp deleted file mode 100644 index fa2dbd00..00000000 --- a/icuSources/common/mutex.cpp +++ /dev/null @@ -1,34 +0,0 @@ -/* - ********************************************************************** - * Copyright (C) 1997-2002, International Business Machines - * Corporation and others. All Rights Reserved. - ********************************************************************** -*/ - -#include "mutex.h" -#include "ucln_cmn.h" - -/* Initialize the global mutex only when we can use it. */ -#if (ICU_USE_THREADS == 1) - -/* - * NOTE: This function replicates functionality from the start - * u_init(). Any changes must be made in both places. - * TODO: combine them. - * - * This function runs only during C++ static initialization. - */ -static int GlobalMutexInitialize() -{ - UErrorCode status = U_ZERO_ERROR; - - umtx_init(NULL); - ucnv_init(&status); - ures_init(&status); - return 0; -} - -static int initializesGlobalMutex = GlobalMutexInitialize(); - -#endif /* ICU_USE_THREADS==1 */ - diff --git a/icuSources/common/mutex.h b/icuSources/common/mutex.h index db546bc2..26aefbf8 100644 --- a/icuSources/common/mutex.h +++ b/icuSources/common/mutex.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1997-2001, International Business Machines +* Copyright (C) 1997-2003, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -27,7 +27,7 @@ U_NAMESPACE_BEGIN //---------------------------------------------------------------------------- -// Code within this library which accesses protected data +// Code within that accesses shared static or global data should // should instantiate a Mutex object while doing so. You should make your own // private mutex where possible. @@ -45,7 +45,7 @@ U_NAMESPACE_BEGIN // // void Function(int arg1, int arg2) // { -// static Object* foo; // Shared read-write object +// static Object* foo; // Shared read-write object // Mutex mutex(&myMutex); // or no args for the global lock // foo->Method(); // // When 'mutex' goes out of scope and gets destroyed here, the lock is released diff --git a/icuSources/common/nameprep.cpp b/icuSources/common/nameprep.cpp deleted file mode 100644 index e271a841..00000000 --- a/icuSources/common/nameprep.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/* - ******************************************************************************* - * - * Copyright (C) 2003, International Business Machines - * Corporation and others. All Rights Reserved. - * - ******************************************************************************* - * file name: nameprep.cpp - * encoding: US-ASCII - * tab size: 8 (not used) - * indentation:4 - * - * created on: 2003feb1 - * created by: Ram Viswanadha - */ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_IDNA - -#include "nameprep.h" -// ***************************************************************************** -// class NamePrep -// ***************************************************************************** - -U_NAMESPACE_BEGIN - -const char NamePrep::fgClassID=0; - -// default constructor -NamePrep::NamePrep(UErrorCode& status){ - bidiCheck = TRUE; - doNFKC = TRUE; -} - -U_NAMESPACE_END - -#endif /* #if !UCONFIG_NO_IDNA */ diff --git a/icuSources/common/nameprep.h b/icuSources/common/nameprep.h deleted file mode 100644 index 51ffa212..00000000 --- a/icuSources/common/nameprep.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - ******************************************************************************* - * - * Copyright (C) 2003, International Business Machines - * Corporation and others. All Rights Reserved. - * - ******************************************************************************* - * file name: nameprep.h - * encoding: US-ASCII - * tab size: 8 (not used) - * indentation:4 - * - * created on: 2003feb1 - * created by: Ram Viswanadha - */ - -#ifndef NAMEPREP_H -#define NAMEPREP_H - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_IDNA - -#include "strprep.h" -#include "unicode/uniset.h" - - -U_NAMESPACE_BEGIN -/* - A profile of stringprep MUST include all of the following: - - - The intended applicability of the profile - - - The character repertoire that is the input and output to stringprep - (which is Unicode 3.2 for this version of stringprep) - - - The mapping tables from this document used (as described in section - 3) - - - Any additional mapping tables specific to the profile - - - The Unicode normalization used, if any (as described in section 4) - - - The tables from this document of characters that are prohibited as - output (as described in section 5) - - - The bidirectional string testing used, if any (as described in - section 6) - - - Any additional characters that are prohibited as output specific to - the profile -*/ - - -class NamePrep: public StringPrep { -public : - NamePrep(UErrorCode& status); - - virtual inline ~NamePrep(){}; - - virtual inline UBool isNotProhibited(UChar32 ch); - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @draft ICU 2.6 - */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @draft ICU 2.6 - */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } - -private: - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; -}; - -inline UBool NamePrep::isNotProhibited(UChar32 ch){ - return (UBool)(ch == 0x0020); /* ASCII_SPACE */ -} - -U_NAMESPACE_END - -#endif /* #if !UCONFIG_NO_IDNA */ - -#endif - -/* - * Hey, Emacs, please set the following: - * - * Local Variables: - * indent-tabs-mode: nil - * End: - * - */ diff --git a/icuSources/common/normlzr.cpp b/icuSources/common/normlzr.cpp index f9cf165a..ba13ffb2 100644 --- a/icuSources/common/normlzr.cpp +++ b/icuSources/common/normlzr.cpp @@ -1,7 +1,7 @@ /* ************************************************************************* * COPYRIGHT: - * Copyright (c) 1996-2003, International Business Machines Corporation and + * Copyright (c) 1996-2004, International Business Machines Corporation and * others. All Rights Reserved. ************************************************************************* */ @@ -21,7 +21,7 @@ U_NAMESPACE_BEGIN -const char Normalizer::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(Normalizer) //------------------------------------------------------------------------- // Constructors and other boilerplate @@ -120,7 +120,7 @@ UBool Normalizer::operator==(const Normalizer& that) const // Static utility methods //------------------------------------------------------------------------- -void +void U_EXPORT2 Normalizer::normalize(const UnicodeString& source, UNormalizationMode mode, int32_t options, UnicodeString& result, @@ -166,7 +166,7 @@ Normalizer::normalize(const UnicodeString& source, } } -void +void U_EXPORT2 Normalizer::compose(const UnicodeString& source, UBool compat, int32_t options, UnicodeString& result, @@ -212,7 +212,7 @@ Normalizer::compose(const UnicodeString& source, } } -void +void U_EXPORT2 Normalizer::decompose(const UnicodeString& source, UBool compat, int32_t options, UnicodeString& result, @@ -258,7 +258,7 @@ Normalizer::decompose(const UnicodeString& source, } } -UnicodeString & +UnicodeString & U_EXPORT2 Normalizer::concatenate(UnicodeString &left, UnicodeString &right, UnicodeString &result, UNormalizationMode mode, int32_t options, diff --git a/icuSources/common/parsepos.cpp b/icuSources/common/parsepos.cpp new file mode 100644 index 00000000..26f88205 --- /dev/null +++ b/icuSources/common/parsepos.cpp @@ -0,0 +1,21 @@ +/* +********************************************************************** +* Copyright (C) 2003-2003, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +*/ + +#include "unicode/parsepos.h" + +U_NAMESPACE_BEGIN + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ParsePosition) + +ParsePosition::~ParsePosition() {} + +ParsePosition * +ParsePosition::clone() const { + return new ParsePosition(*this); +} + +U_NAMESPACE_END diff --git a/icuSources/common/propname.cpp b/icuSources/common/propname.cpp index 37a28234..789a610a 100644 --- a/icuSources/common/propname.cpp +++ b/icuSources/common/propname.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (c) 2002-2003, International Business Machines +* Copyright (c) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Author: Alan Liu @@ -12,6 +12,129 @@ #include "unicode/uchar.h" #include "unicode/udata.h" #include "umutex.h" +#include "cmemory.h" +#include "cstring.h" +#include "ucln_cmn.h" +#include "uarrsort.h" + +U_CDECL_BEGIN + +/** + * Get the next non-ignorable ASCII character from a property name + * and lowercases it. + * @return ((advance count for the name)<<8)|character + */ +static inline int32_t +getASCIIPropertyNameChar(const char *name) { + int32_t i; + char c; + + /* Ignore delimiters '-', '_', and ASCII White_Space */ + for(i=0; + (c=name[i++])==0x2d || c==0x5f || + c==0x20 || (0x09<=c && c<=0x0d); + ) {} + + if(c!=0) { + return (i<<8)|(uint8_t)uprv_asciitolower((char)c); + } else { + return i<<8; + } +} + +/** + * Get the next non-ignorable EBCDIC character from a property name + * and lowercases it. + * @return ((advance count for the name)<<8)|character + */ +static inline int32_t +getEBCDICPropertyNameChar(const char *name) { + int32_t i; + char c; + + /* Ignore delimiters '-', '_', and EBCDIC White_Space */ + for(i=0; + (c=name[i++])==0x60 || c==0x6d || + c==0x40 || c==0x05 || c==0x15 || c==0x25 || c==0x0b || c==0x0c || c==0x0d; + ) {} + + if(c!=0) { + return (i<<8)|(uint8_t)uprv_ebcdictolower((char)c); + } else { + return i<<8; + } +} + +/** + * Unicode property names and property value names are compared "loosely". + * + * UCD.html 4.0.1 says: + * For all property names, property value names, and for property values for + * Enumerated, Binary, or Catalog properties, use the following + * loose matching rule: + * + * LM3. Ignore case, whitespace, underscore ('_'), and hyphens. + * + * This function does just that, for (char *) name strings. + * It is almost identical to ucnv_compareNames() but also ignores + * C0 White_Space characters (U+0009..U+000d, and U+0085 on EBCDIC). + * + * @internal + */ + +U_CAPI int32_t U_EXPORT2 +uprv_compareASCIIPropertyNames(const char *name1, const char *name2) { + int32_t rc, r1, r2; + + for(;;) { + r1=getASCIIPropertyNameChar(name1); + r2=getASCIIPropertyNameChar(name2); + + /* If we reach the ends of both strings then they match */ + if(((r1|r2)&0xff)==0) { + return 0; + } + + /* Compare the lowercased characters */ + if(r1!=r2) { + rc=(r1&0xff)-(r2&0xff); + if(rc!=0) { + return rc; + } + } + + name1+=r1>>8; + name2+=r2>>8; + } +} + +U_CAPI int32_t U_EXPORT2 +uprv_compareEBCDICPropertyNames(const char *name1, const char *name2) { + int32_t rc, r1, r2; + + for(;;) { + r1=getEBCDICPropertyNameChar(name1); + r2=getEBCDICPropertyNameChar(name2); + + /* If we reach the ends of both strings then they match */ + if(((r1|r2)&0xff)==0) { + return 0; + } + + /* Compare the lowercased characters */ + if(r1!=r2) { + rc=(r1&0xff)-(r2&0xff); + if(rc!=0) { + return rc; + } + } + + name1+=r1>>8; + name2+=r2>>8; + } +} + +U_CDECL_END U_NAMESPACE_BEGIN @@ -96,7 +219,7 @@ static UDataMemory* UDATA = NULL; */ U_CDECL_BEGIN static UBool U_CALLCONV -isAcceptable(void* /*context*/, +isPNameAcceptable(void* /*context*/, const char* /*type*/, const char* /*name*/, const UDataInfo* info) { return @@ -110,8 +233,7 @@ isAcceptable(void* /*context*/, info->formatVersion[0] == PNAME_FORMAT_VERSION; } -UBool -pname_cleanup() { +static UBool U_CALLCONV pname_cleanup() { if (UDATA) { udata_close(UDATA); UDATA = NULL; @@ -130,12 +252,13 @@ static UBool _load() { UErrorCode ec = U_ZERO_ERROR; UDataMemory* data = udata_openChoice(0, PNAME_DATA_TYPE, PNAME_DATA_NAME, - isAcceptable, 0, &ec); + isPNameAcceptable, 0, &ec); if (U_SUCCESS(ec)) { umtx_lock(NULL); if (UDATA == NULL) { UDATA = data; PNAME = (const PropertyAliases*) udata_getMemory(UDATA); + ucln_common_registerCleanup(UCLN_COMMON_PNAME, pname_cleanup); data = NULL; } umtx_unlock(NULL); @@ -193,7 +316,441 @@ U_CAPI int32_t U_EXPORT2 u_getPropertyValueEnum(UProperty property, const char* alias) { return load() ? PNAME->getPropertyValueEnum(property, alias) - : UCHAR_INVALID_CODE; + : (int32_t)UCHAR_INVALID_CODE; +} + +/* data swapping ------------------------------------------------------------ */ + +/* + * Sub-structure-swappers use the temp array (which is as large as the + * actual data) for intermediate storage, + * as well as to indicate if a particular structure has been swapped already. + * The temp array is initially reset to all 0. + * pos is the byte offset of the sub-structure in the inBytes/outBytes/temp arrays. + */ + +int32_t +EnumToOffset::swap(const UDataSwapper *ds, + const uint8_t *inBytes, int32_t length, uint8_t *outBytes, + uint8_t *temp, int32_t pos, + UErrorCode *pErrorCode) { + const EnumToOffset *inMap; + EnumToOffset *outMap, *tempMap; + int32_t size; + + tempMap=(EnumToOffset *)(temp+pos); + if(tempMap->enumStart!=0 || tempMap->enumLimit!=0) { + /* this map was swapped already */ + size=tempMap->getSize(); + return size; + } + + inMap=(const EnumToOffset *)(inBytes+pos); + outMap=(EnumToOffset *)(outBytes+pos); + + tempMap->enumStart=udata_readInt32(ds, inMap->enumStart); + tempMap->enumLimit=udata_readInt32(ds, inMap->enumLimit); + size=tempMap->getSize(); + + if(length>=0) { + if(length<(pos+size)) { + if(length<(int32_t)sizeof(PropertyAliases)) { + udata_printError(ds, "upname_swap(EnumToOffset): too few bytes (%d after header)\n" + " for pnames.icu EnumToOffset{%d..%d} at %d\n", + length, tempMap->enumStart, tempMap->enumLimit, pos); + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + } + + /* swap enumStart and enumLimit */ + ds->swapArray32(ds, inMap, 2*sizeof(EnumValue), outMap, pErrorCode); + + /* swap _offsetArray[] */ + ds->swapArray16(ds, inMap->getOffsetArray(), (tempMap->enumLimit-tempMap->enumStart)*sizeof(Offset), + outMap->getOffsetArray(), pErrorCode); + } + + return size; +} + +int32_t +NonContiguousEnumToOffset::swap(const UDataSwapper *ds, + const uint8_t *inBytes, int32_t length, uint8_t *outBytes, + uint8_t *temp, int32_t pos, + UErrorCode *pErrorCode) { + const NonContiguousEnumToOffset *inMap; + NonContiguousEnumToOffset *outMap, *tempMap; + int32_t size; + + tempMap=(NonContiguousEnumToOffset *)(temp+pos); + if(tempMap->count!=0) { + /* this map was swapped already */ + size=tempMap->getSize(); + return size; + } + + inMap=(const NonContiguousEnumToOffset *)(inBytes+pos); + outMap=(NonContiguousEnumToOffset *)(outBytes+pos); + + tempMap->count=udata_readInt32(ds, inMap->count); + size=tempMap->getSize(); + + if(length>=0) { + if(length<(pos+size)) { + if(length<(int32_t)sizeof(PropertyAliases)) { + udata_printError(ds, "upname_swap(NonContiguousEnumToOffset): too few bytes (%d after header)\n" + " for pnames.icu NonContiguousEnumToOffset[%d] at %d\n", + length, tempMap->count, pos); + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + } + + /* swap count and _enumArray[] */ + length=(1+tempMap->count)*sizeof(EnumValue); + ds->swapArray32(ds, inMap, length, + outMap, pErrorCode); + + /* swap _offsetArray[] */ + pos+=length; + ds->swapArray16(ds, inBytes+pos, tempMap->count*sizeof(Offset), + outBytes+pos, pErrorCode); + } + + return size; +} + +struct NameAndIndex { + Offset name, index; +}; + +U_CDECL_BEGIN +typedef int32_t U_CALLCONV PropNameCompareFn(const char *name1, const char *name2); + +struct CompareContext { + const char *chars; + PropNameCompareFn *propCompare; +}; + +static int32_t U_CALLCONV +upname_compareRows(const void *context, const void *left, const void *right) { + CompareContext *cmp=(CompareContext *)context; + return cmp->propCompare(cmp->chars+((const NameAndIndex *)left)->name, + cmp->chars+((const NameAndIndex *)right)->name); +} +U_CDECL_END + +int32_t +NameToEnum::swap(const UDataSwapper *ds, + const uint8_t *inBytes, int32_t length, uint8_t *outBytes, + uint8_t *temp, int32_t pos, + UErrorCode *pErrorCode) { + const NameToEnum *inMap; + NameToEnum *outMap, *tempMap; + + const EnumValue *inEnumArray; + EnumValue *outEnumArray; + + const Offset *inNameArray; + Offset *outNameArray; + + NameAndIndex *sortArray; + CompareContext cmp; + + int32_t i, size, oldIndex; + + tempMap=(NameToEnum *)(temp+pos); + if(tempMap->count!=0) { + /* this map was swapped already */ + size=tempMap->getSize(); + return size; + } + + inMap=(const NameToEnum *)(inBytes+pos); + outMap=(NameToEnum *)(outBytes+pos); + + tempMap->count=udata_readInt32(ds, inMap->count); + size=tempMap->getSize(); + + if(length>=0) { + if(length<(pos+size)) { + if(length<(int32_t)sizeof(PropertyAliases)) { + udata_printError(ds, "upname_swap(NameToEnum): too few bytes (%d after header)\n" + " for pnames.icu NameToEnum[%d] at %d\n", + length, tempMap->count, pos); + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + } + + /* swap count */ + ds->swapArray32(ds, inMap, 4, outMap, pErrorCode); + + inEnumArray=inMap->getEnumArray(); + outEnumArray=outMap->getEnumArray(); + + inNameArray=(const Offset *)(inEnumArray+tempMap->count); + outNameArray=(Offset *)(outEnumArray+tempMap->count); + + if(ds->inCharset==ds->outCharset) { + /* no need to sort, just swap the enum/name arrays */ + ds->swapArray32(ds, inEnumArray, tempMap->count*4, outEnumArray, pErrorCode); + ds->swapArray16(ds, inNameArray, tempMap->count*2, outNameArray, pErrorCode); + return size; + } + + /* + * The name and enum arrays are sorted by names and must be resorted + * if inCharset!=outCharset. + * We use the corresponding part of the temp array to sort an array + * of pairs of name offsets and sorting indexes. + * Then the sorting indexes are used to permutate-swap the name and enum arrays. + * + * The outBytes must already contain the swapped strings. + */ + sortArray=(NameAndIndex *)tempMap->getEnumArray(); + for(i=0; icount; ++i) { + sortArray[i].name=udata_readInt16(ds, inNameArray[i]); + sortArray[i].index=(Offset)i; + } + + /* + * use a stable sort to avoid shuffling of equal strings, + * which makes testing harder + */ + cmp.chars=(const char *)outBytes; + cmp.propCompare= + ds->outCharset==U_ASCII_FAMILY ? + uprv_compareASCIIPropertyNames : + uprv_compareEBCDICPropertyNames; + uprv_sortArray(sortArray, tempMap->count, sizeof(NameAndIndex), + upname_compareRows, &cmp, + TRUE, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + udata_printError(ds, "upname_swap(NameToEnum).uprv_sortArray(%d items) failed - %s\n", + tempMap->count, u_errorName(*pErrorCode)); + return 0; + } + + /* copy/swap/permutate _enumArray[] and _nameArray[] */ + if(inEnumArray!=outEnumArray) { + for(i=0; icount; ++i) { + oldIndex=sortArray[i].index; + ds->swapArray32(ds, inEnumArray+oldIndex, 4, outEnumArray+i, pErrorCode); + ds->swapArray16(ds, inNameArray+oldIndex, 2, outNameArray+i, pErrorCode); + } + } else { + /* + * in-place swapping: need to permutate into a temporary array + * and then copy back to not destroy the data + */ + EnumValue *tempEnumArray; + Offset *oldIndexes; + + /* write name offsets directly from sortArray */ + for(i=0; icount; ++i) { + ds->writeUInt16((uint16_t *)outNameArray+i, (uint16_t)sortArray[i].name); + } + + /* + * compress the oldIndexes into a separate array to make space for tempEnumArray + * the tempMap _nameArray becomes oldIndexes[], getting the index + * values from the 2D sortArray[], + * while sortArray=tempMap _enumArray[] becomes tempEnumArray[] + * this saves us allocating more memory + * + * it works because sizeof(NameAndIndex)<=sizeof(EnumValue) + * and because the nameArray[] can be used for oldIndexes[] + */ + tempEnumArray=(EnumValue *)sortArray; + oldIndexes=(Offset *)(sortArray+tempMap->count); + + /* copy sortArray[].index values into oldIndexes[] */ + for(i=0; icount; ++i) { + oldIndexes[i]=sortArray[i].index; + } + + /* permutate inEnumArray[] into tempEnumArray[] */ + for(i=0; icount; ++i) { + ds->swapArray32(ds, inEnumArray+oldIndexes[i], 4, tempEnumArray+i, pErrorCode); + } + + /* copy tempEnumArray[] to outEnumArray[] */ + uprv_memcpy(outEnumArray, tempEnumArray, tempMap->count*4); + } + } + + return size; +} + +int32_t +PropertyAliases::swap(const UDataSwapper *ds, + const uint8_t *inBytes, int32_t length, uint8_t *outBytes, + UErrorCode *pErrorCode) { + const PropertyAliases *inAliases; + PropertyAliases *outAliases; + PropertyAliases aliases; + + const ValueMap *inValueMaps; + ValueMap *outValueMaps; + ValueMap valueMap; + + uint8_t *temp; + + int32_t i; + + inAliases=(const PropertyAliases *)inBytes; + outAliases=(PropertyAliases *)outBytes; + + /* read the input PropertyAliases - all 16-bit values */ + for(i=0; i<(int32_t)sizeof(PropertyAliases)/2; ++i) { + ((uint16_t *)&aliases)[i]=ds->readUInt16(((const uint16_t *)inBytes)[i]); + } + + if(length>=0) { + if(lengthswapArray16(ds, inAliases, sizeof(PropertyAliases), outAliases, pErrorCode); + + /* swap the name groups */ + ds->swapArray16(ds, inBytes+aliases.nameGroupPool_offset, + aliases.stringPool_offset-aliases.nameGroupPool_offset, + outBytes+aliases.nameGroupPool_offset, pErrorCode); + + /* swap the strings */ + udata_swapInvStringBlock(ds, inBytes+aliases.stringPool_offset, + aliases.total_size-aliases.stringPool_offset, + outBytes+aliases.stringPool_offset, pErrorCode); + + /* + * alloc uint8_t temp[total_size] and reset it + * swap each top-level struct, put at least the count fields into temp + * use subclass-specific swap() functions + * enumerate value maps, for each + * if temp does not have count!=0 yet + * read count, put it into temp + * swap the array(s) + * resort strings in name->enum maps + * swap value maps + */ + temp=(uint8_t *)uprv_malloc(aliases.total_size); + if(temp==NULL) { + udata_printError(ds, "upname_swap(): unable to allocate temp memory (%d bytes)\n", + aliases.total_size); + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + return 0; + } + uprv_memset(temp, 0, aliases.total_size); + + /* swap properties->name groups map */ + NonContiguousEnumToOffset::swap(ds, inBytes, length, outBytes, + temp, aliases.enumToName_offset, pErrorCode); + + /* swap name->properties map */ + NameToEnum::swap(ds, inBytes, length, outBytes, + temp, aliases.nameToEnum_offset, pErrorCode); + + /* swap properties->value maps map */ + NonContiguousEnumToOffset::swap(ds, inBytes, length, outBytes, + temp, aliases.enumToValue_offset, pErrorCode); + + /* enumerate all ValueMaps and swap them */ + inValueMaps=(const ValueMap *)(inBytes+aliases.valueMap_offset); + outValueMaps=(ValueMap *)(outBytes+aliases.valueMap_offset); + + for(i=0; iswapArray16(ds, inValueMaps, aliases.valueMap_count*sizeof(ValueMap), + outValueMaps, pErrorCode); + + /* name groups and strings were swapped above */ + + /* release temp */ + uprv_free(temp); + } + + return aliases.total_size; +} + +U_CAPI int32_t U_EXPORT2 +upname_swap(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const UDataInfo *pInfo; + int32_t headerSize; + + const uint8_t *inBytes; + uint8_t *outBytes; + + /* udata_swapDataHeader checks the arguments */ + headerSize=udata_swapDataHeader(ds, inData, length, outData, pErrorCode); + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + + /* check data format and format version */ + pInfo=(const UDataInfo *)((const char *)inData+4); + if(!( + pInfo->dataFormat[0]==0x70 && /* dataFormat="pnam" */ + pInfo->dataFormat[1]==0x6e && + pInfo->dataFormat[2]==0x61 && + pInfo->dataFormat[3]==0x6d && + pInfo->formatVersion[0]==1 + )) { + udata_printError(ds, "upname_swap(): data format %02x.%02x.%02x.%02x (format version %02x) is not recognized as pnames.icu\n", + pInfo->dataFormat[0], pInfo->dataFormat[1], + pInfo->dataFormat[2], pInfo->dataFormat[3], + pInfo->formatVersion[0]); + *pErrorCode=U_UNSUPPORTED_ERROR; + return 0; + } + + inBytes=(const uint8_t *)inData+headerSize; + outBytes=(uint8_t *)outData+headerSize; + + if(length>=0) { + length-=headerSize; + if(length<(int32_t)sizeof(PropertyAliases)) { + udata_printError(ds, "upname_swap(): too few bytes (%d after header) for pnames.icu\n", + length); + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + } + + return headerSize+PropertyAliases::swap(ds, inBytes, length, outBytes, pErrorCode); } //eof diff --git a/icuSources/common/propname.h b/icuSources/common/propname.h index 7db97197..a3a77181 100644 --- a/icuSources/common/propname.h +++ b/icuSources/common/propname.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (c) 2002, International Business Machines +* Copyright (c) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Author: Alan Liu @@ -13,27 +13,63 @@ #include "unicode/utypes.h" #include "unicode/uchar.h" +#include "udataswp.h" #include "uprops.h" -class Builder; +/* + * This header defines the in-memory layout of the property names data + * structure representing the UCD data files PropertyAliases.txt and + * PropertyValueAliases.txt. It is used by: + * propname.cpp - reads data + * genpname - creates data + */ -U_NAMESPACE_BEGIN +/* low-level char * property name comparison -------------------------------- */ + +U_CDECL_BEGIN -// This header defines the in-memory layout of the property names data -// structure representing the UCD data files PropertyAliases.txt and -// PropertyValueAliases.txt. It is used by: -// propname.cpp - reads data -// genpname - creates data +/** + * \var uprv_comparePropertyNames + * Unicode property names and property value names are compared "loosely". + * + * UCD.html 4.0.1 says: + * For all property names, property value names, and for property values for + * Enumerated, Binary, or Catalog properties, use the following + * loose matching rule: + * + * LM3. Ignore case, whitespace, underscore ('_'), and hyphens. + * + * This function does just that, for (char *) name strings. + * It is almost identical to ucnv_compareNames() but also ignores + * C0 White_Space characters (U+0009..U+000d, and U+0085 on EBCDIC). + * + * @internal + */ -//---------------------------------------------------------------------- -// UDataMemory structure and signatures +U_CAPI int32_t U_EXPORT2 +uprv_compareASCIIPropertyNames(const char *name1, const char *name2); + +U_CAPI int32_t U_EXPORT2 +uprv_compareEBCDICPropertyNames(const char *name1, const char *name2); + +#if U_CHARSET_FAMILY==U_ASCII_FAMILY +# define uprv_comparePropertyNames uprv_compareASCIIPropertyNames +#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY +# define uprv_comparePropertyNames uprv_compareEBCDICPropertyNames +#else +# error U_CHARSET_FAMILY is not valid +#endif + +U_CDECL_END + +/* UDataMemory structure and signatures ------------------------------------- */ #define PNAME_DATA_NAME "pnames" #define PNAME_DATA_TYPE "icu" -// Fields in UDataInfo: +/* Fields in UDataInfo: */ -// PNAME_SIG[] is encoded as numeric literals for compatibility with the HP compiler +/* PNAME_SIG[] is encoded as numeric literals for compatibility with the HP compiler */ #define PNAME_SIG_0 ((uint8_t)0x70) /* p */ #define PNAME_SIG_1 ((uint8_t)0x6E) /* n */ #define PNAME_SIG_2 ((uint8_t)0x61) /* a */ @@ -41,6 +77,22 @@ U_NAMESPACE_BEGIN #define PNAME_FORMAT_VERSION ((int8_t)1) /* formatVersion[0] */ +/** + * Swap pnames.icu. See udataswp.h. + * @internal + */ +U_CAPI int32_t U_EXPORT2 +upname_swap(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode); + + +#ifdef XP_CPLUSPLUS + +class Builder; + +U_NAMESPACE_BEGIN + /** * An offset from the start of the pnames data to a contained entity. * This must be a signed value, since negative offsets are used as an @@ -48,7 +100,7 @@ U_NAMESPACE_BEGIN * zero offset indicates an absent entry; this corresponds to aliases * marked "n/a" in the original Unicode data files. */ -typedef int16_t Offset; // must be signed +typedef int16_t Offset; /* must be signed */ #define MAX_OFFSET 0x7FFF @@ -63,8 +115,8 @@ typedef int16_t Offset; // must be signed */ typedef int32_t EnumValue; -//---------------------------------------------------------------------- -// ValueMap +/* ---------------------------------------------------------------------- */ +/* ValueMap */ /** * For any top-level property that has named values (binary and @@ -82,18 +134,18 @@ typedef int32_t EnumValue; */ struct ValueMap { - // -- begin pnames data -- - // Enum=>name EnumToOffset / NonContiguousEnumToOffset objects. - // Exactly one of these will be nonzero. + /* -- begin pnames data -- */ + /* Enum=>name EnumToOffset / NonContiguousEnumToOffset objects. */ + /* Exactly one of these will be nonzero. */ Offset enumToName_offset; Offset ncEnumToName_offset; - Offset nameToEnum_offset; // Name=>enum data - // -- end pnames data -- + Offset nameToEnum_offset; /* Name=>enum data */ + /* -- end pnames data -- */ }; -//---------------------------------------------------------------------- -// PropertyAliases class +/* ---------------------------------------------------------------------- */ +/* PropertyAliases class */ /** * A class encapsulating access to the memory-mapped data representing @@ -106,29 +158,29 @@ struct ValueMap { */ class PropertyAliases { - // -- begin pnames data -- - // Enum=>name EnumToOffset object for binary and enumerated - // properties + /* -- begin pnames data -- */ + /* Enum=>name EnumToOffset object for binary and enumerated */ + /* properties */ Offset enumToName_offset; - // Name=>enum data for binary & enumerated properties + /* Name=>enum data for binary & enumerated properties */ Offset nameToEnum_offset; - // Enum=>offset EnumToOffset object mapping enumerated properties - // to ValueMap objects + /* Enum=>offset EnumToOffset object mapping enumerated properties */ + /* to ValueMap objects */ Offset enumToValue_offset; - // The following are needed by external readers of this data. - // We don't use them ourselves. - int16_t total_size; // size in bytes excluding the udata header - Offset valueMap_offset; // offset to start of array - int16_t valueMap_count; // number of entries - Offset nameGroupPool_offset; // offset to start of array - int16_t nameGroupPool_count; // number of entries (not groups) - Offset stringPool_offset; // offset to start of pool - int16_t stringPool_count; // number of strings (not size in bytes) + /* The following are needed by external readers of this data. */ + /* We don't use them ourselves. */ + int16_t total_size; /* size in bytes excluding the udata header */ + Offset valueMap_offset; /* offset to start of array */ + int16_t valueMap_count; /* number of entries */ + Offset nameGroupPool_offset; /* offset to start of array */ + int16_t nameGroupPool_count; /* number of entries (not groups) */ + Offset stringPool_offset; /* offset to start of pool */ + int16_t stringPool_count; /* number of strings (not size in bytes) */ - // -- end pnames data -- + /* -- end pnames data -- */ friend class ::Builder; @@ -157,10 +209,15 @@ class PropertyAliases { inline EnumValue getPropertyValueEnum(EnumValue prop, const char* alias) const; + + static int32_t + swap(const UDataSwapper *ds, + const uint8_t *inBytes, int32_t length, uint8_t *outBytes, + UErrorCode *pErrorCode); }; -//---------------------------------------------------------------------- -// EnumToOffset +/* ---------------------------------------------------------------------- */ +/* EnumToOffset */ /** * A generic map from enum values to Offsets. The enum values must be @@ -169,11 +226,11 @@ class PropertyAliases { */ class EnumToOffset { - // -- begin pnames data -- + /* -- begin pnames data -- */ EnumValue enumStart; EnumValue enumLimit; - Offset _offsetArray; // [array of enumLimit-enumStart] - // -- end pnames data -- + Offset _offsetArray; /* [array of enumLimit-enumStart] */ + /* -- end pnames data -- */ friend class ::Builder; @@ -189,20 +246,30 @@ class EnumToOffset { return sizeof(EnumToOffset) + sizeof(Offset) * (n - 1); } + int32_t getSize() { + return getSize(enumLimit - enumStart); + } + public: Offset getOffset(EnumValue enumProbe) const { if (enumProbe < enumStart || enumProbe >= enumLimit) { - return 0; // not found + return 0; /* not found */ } const Offset* p = getOffsetArray(); return p[enumProbe - enumStart]; } + + static int32_t + swap(const UDataSwapper *ds, + const uint8_t *inBytes, int32_t length, uint8_t *outBytes, + uint8_t *temp, int32_t pos, + UErrorCode *pErrorCode); }; -//---------------------------------------------------------------------- -// NonContiguousEnumToOffset +/* ---------------------------------------------------------------------- */ +/* NonContiguousEnumToOffset */ /** * A generic map from enum values to Offsets. The enum values may be @@ -211,11 +278,11 @@ class EnumToOffset { */ class NonContiguousEnumToOffset { - // -- begin pnames data -- + /* -- begin pnames data -- */ int32_t count; - EnumValue _enumArray; // [array of count] - // Offset _offsetArray; // [array of count] after enumValue[count-1] - // -- end pnames data -- + EnumValue _enumArray; /* [array of count] */ + /* Offset _offsetArray; // [array of count] after enumValue[count-1] */ + /* -- end pnames data -- */ friend class ::Builder; @@ -239,35 +306,45 @@ class NonContiguousEnumToOffset { return sizeof(int32_t) + (sizeof(EnumValue) + sizeof(Offset)) * n; } + int32_t getSize() { + return getSize(count); + } + public: Offset getOffset(EnumValue enumProbe) const { const EnumValue* e = getEnumArray(); const Offset* p = getOffsetArray(); - // linear search; binary later if warranted - // (binary is not faster for short lists) + /* linear search; binary later if warranted */ + /* (binary is not faster for short lists) */ for (int32_t i=0; i enumProbe) break; return p[i]; } - return 0; // not found + return 0; /* not found */ } + + static int32_t + swap(const UDataSwapper *ds, + const uint8_t *inBytes, int32_t length, uint8_t *outBytes, + uint8_t *temp, int32_t pos, + UErrorCode *pErrorCode); }; -//---------------------------------------------------------------------- -// NameToEnum +/* ---------------------------------------------------------------------- */ +/* NameToEnum */ /** * A map from names to enum values. */ class NameToEnum { - // -- begin pnames data -- - int32_t count; // number of entries - EnumValue _enumArray; // [array of count] EnumValues - // Offset _nameArray; // [array of count] offsets to names - // -- end pnames data -- + /* -- begin pnames data -- */ + int32_t count; /* number of entries */ + EnumValue _enumArray; /* [array of count] EnumValues */ + /* Offset _nameArray; // [array of count] offsets to names */ + /* -- end pnames data -- */ friend class ::Builder; @@ -291,6 +368,10 @@ class NameToEnum { return sizeof(int32_t) + (sizeof(Offset) + sizeof(EnumValue)) * n; } + int32_t getSize() { + return getSize(count); + } + public: EnumValue getEnum(const char* alias, const PropertyAliases& data) const { @@ -298,8 +379,8 @@ class NameToEnum { const Offset* n = getNameArray(); const EnumValue* e = getEnumArray(); - // linear search; binary later if warranted - // (binary is not faster for short lists) + /* linear search; binary later if warranted */ + /* (binary is not faster for short lists) */ for (int32_t i=0; i2) * enumToValue_offset (>3) * (alignment padding build in to header) - * + * + * The header also contains the following, used by "external readers" + * like ICU4J and icuswap. + * + * // The following are needed by external readers of this data. + * // We don't use them ourselves. + * int16_t total_size; // size in bytes excluding the udata header + * Offset valueMap_offset; // offset to start of array + * int16_t valueMap_count; // number of entries + * Offset nameGroupPool_offset; // offset to start of array + * int16_t nameGroupPool_count; // number of entries (not groups) + * Offset stringPool_offset; // offset to start of pool + * int16_t stringPool_count; // number of strings (not size in bytes) + * * 0: # NonContiguousEnumToOffset obj for props => name groups * count * enumArray [x count] @@ -410,6 +510,6 @@ class NameToEnum { */ U_NAMESPACE_END -#endif +#endif /* C++ */ -//eof +#endif diff --git a/icuSources/common/putil.c b/icuSources/common/putil.c index 0d07c018..e86e3c66 100644 --- a/icuSources/common/putil.c +++ b/icuSources/common/putil.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1997-2003, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -36,14 +36,6 @@ ****************************************************************************** */ -#ifdef _AIX -# include -#endif - -#ifdef __QNXNTO__ -#include -#endif - #ifndef PTX /* Define _XOPEN_SOURCE for Solaris and friends. */ @@ -65,30 +57,28 @@ /* include ICU headers */ #include "unicode/utypes.h" #include "unicode/putil.h" +#include "unicode/ustring.h" +#include "putilimp.h" +#include "uassert.h" #include "umutex.h" #include "cmemory.h" #include "cstring.h" #include "locmap.h" #include "ucln_cmn.h" - -/* Include standard headers. */ -#include -#include -#include -#include -#include -#include -#include +#include "udataswp.h" /* include system headers */ #ifdef WIN32 # define WIN32_LEAN_AND_MEAN -# define NOGDI +# define VC_EXTRALEAN # define NOUSER # define NOSERVICE # define NOIME # define NOMCX # include +#elif defined(U_CYGWIN) && defined(__STRICT_ANSI__) +/* tzset isn't defined in strict ANSI on Cygwin. */ +# undef __STRICT_ANSI__ #elif defined(OS2) # define INCL_DOSMISC # define INCL_DOSERRORS @@ -108,19 +98,33 @@ # include #elif defined(OS390) #include "unicode/ucnv.h" /* Needed for UCNV_SWAP_LFNL_OPTION_STRING */ -#elif defined(AIX) -/* -# include -*/ +#elif defined(U_AIX) #elif defined(U_SOLARIS) || defined(U_LINUX) +#elif defined(U_HPUX) +#elif defined(U_DARWIN) +#include +#include +#elif defined(U_QNX) +#include +#endif + +/* Include standard headers. */ +#include +#include +#include +#include +#include +#include +#include + /* -# include -# include -*/ -#elif defined(HPUX) -/* -# include -*/ + * Only include langinfo.h if we have a way to get the codeset. If we later + * depend on more feature, we can test on U_HAVE_NL_LANGINFO. + * + */ + +#if U_HAVE_NL_LANGINFO_CODESET +#include #endif /* Define the extension for data files, again... */ @@ -145,8 +149,8 @@ static const char copyright[] = U_COPYRIGHT_STRING; #if USE_64BIT_DOUBLE_OPTIMIZATION /* gcc 3.2 has an optimization bug */ -static const int64_t gNan64 = 0x7FF8000000000000L; -static const int64_t gInf64 = 0x7FF0000000000000L; +static const int64_t gNan64 = 0x7FF8000000000000LL; +static const int64_t gInf64 = 0x7FF0000000000000LL; static const double * const fgNan = (const double *)(&gNan64); static const double * const fgInf = (const double *)(&gInf64); #else @@ -182,16 +186,6 @@ static double * const fgInf = &gInf; # define U_POSIX_LOCALE 1 #endif -/* - * Only include langinfo.h if we have a way to get the codeset. If we later - * depend on more feature, we can test on U_HAVE_NL_LANGINFO. - * - */ - -#if U_HAVE_NL_LANGINFO_CODESET -#include -#endif - /* Utilities to get the bits from a double */ static char* u_topNBytesOfDouble(double* d, int n) @@ -221,27 +215,27 @@ u_bottomNBytesOfDouble(double* d, int n) ---------------------------------------------------------------------------*/ /* Get UTC (GMT) time measured in seconds since 0:00 on 1/1/70.*/ -U_CAPI int32_t U_EXPORT2 +U_CAPI UDate U_EXPORT2 uprv_getUTCtime() { #ifdef XP_MAC time_t t, t1, t2; struct tm tmrec; - memset( &tmrec, 0, sizeof(tmrec) ); + uprv_memset( &tmrec, 0, sizeof(tmrec) ); tmrec.tm_year = 70; tmrec.tm_mon = 0; tmrec.tm_mday = 1; t1 = mktime(&tmrec); /* seconds of 1/1/1970*/ time(&t); - memcpy( &tmrec, gmtime(&t), sizeof(tmrec) ); + uprv_memcpy( &tmrec, gmtime(&t), sizeof(tmrec) ); t2 = mktime(&tmrec); /* seconds of current GMT*/ - return t2 - t1; /* GMT (or UTC) in seconds since 1970*/ + return (UDate)(t2 - t1) * U_MILLIS_PER_SECOND; /* GMT (or UTC) in seconds since 1970*/ #else time_t epochtime; time(&epochtime); - return epochtime; + return (UDate)epochtime * U_MILLIS_PER_SECOND; #endif } @@ -262,7 +256,7 @@ uprv_isNaN(double number) #if USE_64BIT_DOUBLE_OPTIMIZATION /* gcc 3.2 has an optimization bug */ /* Infinity is 0x7FF0000000000000U. Anything greater than that is a NaN */ - return (UBool)(((*((int64_t *)&number)) & INT64_MAX) > gInf64); + return (UBool)(((*((int64_t *)&number)) & U_INT64_MAX) > gInf64); #else /* This should work in theory, but it doesn't, so we resort to the more*/ @@ -312,7 +306,7 @@ uprv_isInfinite(double number) #if IEEE_754 #if USE_64BIT_DOUBLE_OPTIMIZATION /* gcc 3.2 has an optimization bug */ - return (UBool)(((*((int64_t *)&number)) & INT64_MAX) == gInf64); + return (UBool)(((*((int64_t *)&number)) & U_INT64_MAX) == gInf64); #else /* We know the top bit is the sign bit, so we mask that off in a copy of */ @@ -611,6 +605,8 @@ uprv_log(double d) return log(d); } +#if 0 +/* This isn't used. If it's readded, readd putiltst.c tests */ U_CAPI int32_t U_EXPORT2 uprv_digitsAfterDecimal(double x) { @@ -653,6 +649,7 @@ uprv_digitsAfterDecimal(double x) } return numDigits; } +#endif /*--------------------------------------------------------------------------- Platform-specific Implementations @@ -712,8 +709,6 @@ uprv_digitsAfterDecimal(double x) Based on original code by Carl Brown */ -static LONG openTZRegKey(HKEY* hkey, const char* winid, int winType); - /** * Layout of the binary registry data under the "TZI" key. */ @@ -936,6 +931,68 @@ enum { WIN_2K_XP_TYPE = 2 }; +/** + * Auxiliary Windows time zone function. Attempts to open the given + * Windows time zone ID as a registry key. Returns ERROR_SUCCESS if + * successful. Caller must close the registry key. Handles + * variations in the resource layout in different flavors of Windows. + * + * @param hkey output parameter to receive opened registry key + * @param winid Windows zone ID, e.g., "Pacific", without the + * " Standard Time" suffix (if any). Special case "Mexico Standard Time 2" + * allowed. + * @param winType Windows flavor (WIN_9X_ME_TYPE, etc.) + * @return ERROR_SUCCESS upon success + */ +static LONG openTZRegKey(HKEY *hkey, const char* winid, int winType) { + LONG result; + char subKeyName[96]; + char* name; + int i; + + uprv_strcpy(subKeyName, TZ_REGKEY[(winType == WIN_9X_ME_TYPE) ? 0 : 1]); + name = &subKeyName[strlen(subKeyName)]; + uprv_strcat(subKeyName, winid); + if (winType != WIN_9X_ME_TYPE) { + /* Don't modify "Mexico Standard Time 2", which does not occur + on WIN_9X_ME_TYPE. Also, if the type is WIN_NT_TYPE, then + in practice this means the GMT key is not followed by + " Standard Time", so don't append in that case. */ + int isMexico2 = (winid[uprv_strlen(winid)- 1] == '2'); + if (!isMexico2 && + !(winType == WIN_NT_TYPE && uprv_strcmp(winid, "GMT") == 0)) { + uprv_strcat(subKeyName, STANDARD_TIME_REGKEY); + } + } + result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, + subKeyName, + 0, + KEY_QUERY_VALUE, + hkey); + + if (result != ERROR_SUCCESS) { + /* If the primary lookup fails, try to remap the Windows zone + ID, according to the remapping table. */ + for (i=0; ZONE_REMAP[i].winid; ++i) { + if (uprv_strcmp(winid, ZONE_REMAP[i].winid) == 0) { + uprv_strcpy(name, ZONE_REMAP[i].altwinid + 1); + if (*(ZONE_REMAP[i].altwinid) == '+' && + winType != WIN_9X_ME_TYPE) { + uprv_strcat(subKeyName, STANDARD_TIME_REGKEY); + } + result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, + subKeyName, + 0, + KEY_QUERY_VALUE, + hkey); + break; + } + } + } + + return result; +} + /** * Main Windows time zone detection function. Returns the Windows * time zone, translated to an ICU time zone, or NULL upon failure. @@ -975,12 +1032,12 @@ static const char* detectWindowsTimeZone() { /* Obtain TIME_ZONE_INFORMATION from the API, and then convert it to TZI. We could also interrogate the registry directly; we do this below if needed. */ - memset(&apiTZI, 0, sizeof(apiTZI)); + uprv_memset(&apiTZI, 0, sizeof(apiTZI)); GetTimeZoneInformation(&apiTZI); tziKey.Bias = apiTZI.Bias; - memcpy((char *)&tziKey.StandardDate, (char*)&apiTZI.StandardDate, + uprv_memcpy((char *)&tziKey.StandardDate, (char*)&apiTZI.StandardDate, sizeof(apiTZI.StandardDate)); - memcpy((char *)&tziKey.DaylightDate, (char*)&apiTZI.DaylightDate, + uprv_memcpy((char *)&tziKey.DaylightDate, (char*)&apiTZI.DaylightDate, sizeof(apiTZI.DaylightDate)); /* For each zone that can be identified by Offset+Rules, see if we @@ -1012,7 +1069,7 @@ static const char* detectWindowsTimeZone() { these unreliable fields. */ tziKey.StandardBias = tziReg.StandardBias; tziKey.DaylightBias = tziReg.DaylightBias; - if (memcmp((char *)&tziKey, (char*)&tziReg, + if (uprv_memcmp((char *)&tziKey, (char*)&tziReg, sizeof(tziKey)) == 0) { if (firstMatch < 0) { firstMatch = j; @@ -1066,7 +1123,7 @@ static const char* detectWindowsTimeZone() { RegCloseKey(hkey); if (result == ERROR_SUCCESS && stdRegNameSize == stdNameSize && - memcmp(stdName, stdRegName, stdNameSize) == 0) { + uprv_memcmp(stdName, stdRegName, stdNameSize) == 0) { firstMatch = j; /* record the match */ break; } @@ -1079,68 +1136,6 @@ static const char* detectWindowsTimeZone() { return ZONE_MAP[firstMatch].icuid; } -/** - * Auxiliary Windows time zone function. Attempts to open the given - * Windows time zone ID as a registry key. Returns ERROR_SUCCESS if - * successful. Caller must close the registry key. Handles - * variations in the resource layout in different flavors of Windows. - * - * @param hkey output parameter to receive opened registry key - * @param winid Windows zone ID, e.g., "Pacific", without the - * " Standard Time" suffix (if any). Special case "Mexico Standard Time 2" - * allowed. - * @param winType Windows flavor (WIN_9X_ME_TYPE, etc.) - * @return ERROR_SUCCESS upon success - */ -static LONG openTZRegKey(HKEY *hkey, const char* winid, int winType) { - LONG result; - char subKeyName[96]; - char* name; - int i; - - strcpy(subKeyName, TZ_REGKEY[(winType == WIN_9X_ME_TYPE) ? 0 : 1]); - name = &subKeyName[strlen(subKeyName)]; - strcat(subKeyName, winid); - if (winType != WIN_9X_ME_TYPE) { - /* Don't modify "Mexico Standard Time 2", which does not occur - on WIN_9X_ME_TYPE. Also, if the type is WIN_NT_TYPE, then - in practice this means the GMT key is not followed by - " Standard Time", so don't append in that case. */ - int isMexico2 = (winid[strlen(winid)- 1] == '2'); - if (!isMexico2 && - !(winType == WIN_NT_TYPE && strcmp(winid, "GMT") == 0)) { - strcat(subKeyName, STANDARD_TIME_REGKEY); - } - } - result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, - subKeyName, - 0, - KEY_QUERY_VALUE, - hkey); - - if (result != ERROR_SUCCESS) { - /* If the primary lookup fails, try to remap the Windows zone - ID, according to the remapping table. */ - for (i=0; ZONE_REMAP[i].winid; ++i) { - if (strcmp(winid, ZONE_REMAP[i].winid) == 0) { - strcpy(name, ZONE_REMAP[i].altwinid + 1); - if (*(ZONE_REMAP[i].altwinid) == '+' && - winType != WIN_9X_ME_TYPE) { - strcat(subKeyName, STANDARD_TIME_REGKEY); - } - result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, - subKeyName, - 0, - KEY_QUERY_VALUE, - hkey); - break; - } - } - } - - return result; -} - #endif /*WIN32*/ /* Generic time zone layer -------------------------------------------------- */ @@ -1159,7 +1154,7 @@ uprv_tzset() U_CAPI int32_t U_EXPORT2 uprv_timezone() { -#if U_HAVE_TIMEZONE +#ifdef U_TIMEZONE return U_TIMEZONE; #else time_t t, t1, t2; @@ -1168,10 +1163,10 @@ uprv_timezone() int32_t tdiff = 0; time(&t); - memcpy( &tmrec, localtime(&t), sizeof(tmrec) ); + uprv_memcpy( &tmrec, localtime(&t), sizeof(tmrec) ); dst_checked = (tmrec.tm_isdst != 0); /* daylight savings time is checked*/ t1 = mktime(&tmrec); /* local time in seconds*/ - memcpy( &tmrec, gmtime(&t), sizeof(tmrec) ); + uprv_memcpy( &tmrec, gmtime(&t), sizeof(tmrec) ); t2 = mktime(&tmrec); /* GMT (or UTC) in seconds*/ tdiff = t2 - t1; /* imitate NT behaviour, which returns same timezone offset to GMT for @@ -1182,16 +1177,21 @@ uprv_timezone() #endif } -/* Note that U_TZNAME does *not* have to be tzname, but if it does, +/* Note that U_TZNAME does *not* have to be tzname, but if it is, some platforms need to have it declared here. */ -#if defined(IRIX) || defined(U_DARWIN) /* For SGI/MacOSX. */ -extern char *tzname[]; /* RS6000 and others reject char **tzname. */ -#elif defined(U_CYGWIN) -extern U_IMPORT char *_tzname[2]; +#if defined(U_TZNAME) && (defined(U_IRIX) || defined(U_DARWIN) || defined(U_CYGWIN)) +/* RS6000 and others reject char **tzname. */ +extern U_IMPORT char *U_TZNAME[]; +#endif + +#if defined(U_DARWIN) /* For Mac OS X */ +#define TZZONELINK "/etc/localtime" +#define TZZONEINFO "/usr/share/zoneinfo/" +static char *gTimeZoneBuffer = NULL; /* Heap allocated */ #endif -U_CAPI char* U_EXPORT2 +U_CAPI const char* U_EXPORT2 uprv_tzname(int n) { #ifdef WIN32 @@ -1201,6 +1201,41 @@ uprv_tzname(int n) } #endif +#if defined(U_DARWIN) + int ret; + + char *tzenv; + + tzenv = getenv("TZFILE"); + if (tzenv != NULL) { + return tzenv; + } + +#if 0 + /* TZ is often set to "PST8PDT" or similar, so we cannot use it. Alan */ + tzenv = getenv("TZ"); + if (tzenv != NULL) { + return tzenv; + } +#endif + + /* Caller must handle threading issues */ + if (gTimeZoneBuffer == NULL) { + gTimeZoneBuffer = (char *) uprv_malloc(MAXPATHLEN + 2); + + ret = readlink(TZZONELINK, gTimeZoneBuffer, MAXPATHLEN + 2); + if (0 < ret) { + gTimeZoneBuffer[ret] = '\0'; + if (uprv_strncmp(gTimeZoneBuffer, TZZONEINFO, sizeof(TZZONEINFO) - 1) == 0) { + return (gTimeZoneBuffer += sizeof(TZZONEINFO) - 1); + } + } + + uprv_free(gTimeZoneBuffer); + gTimeZoneBuffer = NULL; + } +#endif + #ifdef U_TZNAME return U_TZNAME[n]; #else @@ -1215,7 +1250,7 @@ static char *gDataDirectory = NULL; static char *gCorrectedPOSIXLocale = NULL; /* Heap allocated */ #endif -UBool putil_cleanup(void) +static UBool U_CALLCONV putil_cleanup(void) { if (gDataDirectory) { uprv_free(gDataDirectory); @@ -1238,23 +1273,61 @@ UBool putil_cleanup(void) U_CAPI void U_EXPORT2 u_setDataDirectory(const char *directory) { char *newDataDir; - int length; +#if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR) + char *p; +#endif + int32_t length; if(directory==NULL) { directory = ""; } - length=uprv_strlen(directory); + length=(int32_t)uprv_strlen(directory); newDataDir = (char *)uprv_malloc(length + 2); uprv_strcpy(newDataDir, directory); +#if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR) + while(p = uprv_strchr(newDataDir, U_FILE_ALT_SEP_CHAR)) { + *p = U_FILE_SEP_CHAR; + } +#endif + umtx_lock(NULL); if (gDataDirectory) { uprv_free(gDataDirectory); } gDataDirectory = newDataDir; + ucln_common_registerCleanup(UCLN_COMMON_PUTIL, putil_cleanup); umtx_unlock(NULL); } +U_CAPI UBool U_EXPORT2 +uprv_pathIsAbsolute(const char *path) +{ + if(!path || !*path) { + return FALSE; + } + + if(*path == U_FILE_SEP_CHAR) { + return TRUE; + } + +#if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR) + if(*path == U_FILE_ALT_SEP_CHAR) { + return TRUE; + } +#endif + +#if defined(WIN32) + if( (((path[0] >= 'A') && (path[0] <= 'Z')) || + ((path[0] >= 'a') && (path[0] <= 'z'))) && + path[1] == ':' ) { + return TRUE; + } +#endif + + return FALSE; +} + U_CAPI const char * U_EXPORT2 u_getDataDirectory(void) { const char *path = NULL; @@ -1595,7 +1668,7 @@ The leftmost codepage (.xxx) wins. if ((q = uprv_strchr(p, '.')) != NULL) { /* How big will the resulting string be? */ - len = uprv_strlen(correctedPOSIXLocale) + (q-p); + len = (int32_t)(uprv_strlen(correctedPOSIXLocale) + (q-p)); uprv_strncat(correctedPOSIXLocale, p, q-p); correctedPOSIXLocale[len] = 0; } @@ -1621,6 +1694,7 @@ The leftmost codepage (.xxx) wins. if (gCorrectedPOSIXLocale == NULL) { gCorrectedPOSIXLocale = correctedPOSIXLocale; + ucln_common_registerCleanup(UCLN_COMMON_PUTIL, putil_cleanup); correctedPOSIXLocale = NULL; } @@ -1648,7 +1722,7 @@ The leftmost codepage (.xxx) wins. int32_t lang = MAC_LC_INIT_NUMBER; /* = GetScriptManagerVariable(smScriptLang);*/ int32_t date_region = MAC_LC_INIT_NUMBER; - char* posixID = 0; + const char* posixID = 0; int32_t count = sizeof(mac_lc_recs) / sizeof(mac_lc_rec); int32_t i; Intl1Hndl ih; @@ -1781,8 +1855,9 @@ The leftmost codepage (.xxx) wins. } -U_CAPI const char* U_EXPORT2 -uprv_getDefaultCodepage() + +static const char* +int_getDefaultCodepage() { #if defined(OS400) uint32_t ccsid = 37; /* Default to ibm-37 */ @@ -1823,230 +1898,89 @@ uprv_getDefaultCodepage() char *name = NULL; char *euro = NULL; const char *localeName = NULL; - const char *defaultTable = NULL; uprv_memset(codesetName, 0, sizeof(codesetName)); - localeName = uprv_getPOSIXID(); - if (localeName != NULL && (name = (uprv_strchr(localeName, (int)'.'))) != NULL) - { - /* strip the locale name and look at the suffix only */ - name = uprv_strncpy(codesetName, name+1, sizeof(codesetName)); - codesetName[sizeof(codesetName)-1] = 0; - if ((euro = (uprv_strchr(name, (int)'@'))) != NULL) - { - *euro = 0; - } - /* if we can find the codset name, return that. */ - if (*name) - { - return name; - } - } - /* otherwise, try CTYPE */ - if (*codesetName) - { - uprv_memset(codesetName, 0, sizeof(codesetName)); - } + /* Check setlocale before the environment variables + because the application may have set it first */ + /* setlocale needs "" and not NULL for Linux and Solaris */ localeName = setlocale(LC_CTYPE, ""); - if (localeName != NULL && (name = (uprv_strchr(localeName, (int)'.'))) != NULL) - { + if (localeName != NULL && (name = (uprv_strchr(localeName, '.'))) != NULL) { /* strip the locale name and look at the suffix only */ name = uprv_strncpy(codesetName, name+1, sizeof(codesetName)); codesetName[sizeof(codesetName)-1] = 0; - if ((euro = (uprv_strchr(name, (int)'@'))) != NULL) - { + if ((euro = (uprv_strchr(name, '@'))) != NULL) { *euro = 0; } /* if we can find the codset name from setlocale, return that. */ - if (*name) - { + if (*name) { return name; } } - if (*codesetName) - { +#if U_HAVE_NL_LANGINFO_CODESET + if (*codesetName) { uprv_memset(codesetName, 0, sizeof(codesetName)); } -#if U_HAVE_NL_LANGINFO_CODESET + /* When available, check nl_langinfo first because it usually gives more + useful names. It depends on LC_CTYPE and not LANG or LC_ALL */ { const char *codeset = nl_langinfo(U_NL_LANGINFO_CODESET); if (codeset != NULL) { uprv_strncpy(codesetName, codeset, sizeof(codesetName)); codesetName[sizeof(codesetName)-1] = 0; + return codesetName; } } #endif - if (*codesetName == 0) - { - /* look up in srl's table */ - defaultTable = uprv_defaultCodePageForLocale(localeName); - if (defaultTable != NULL) - { - uprv_strcpy(codesetName, defaultTable); + + /* Try a locale specified by the user. + This is usually underspecified and usually checked by setlocale already. */ + if (*codesetName) { + uprv_memset(codesetName, 0, sizeof(codesetName)); + } + localeName = uprv_getPOSIXID(); + if (localeName != NULL && (name = (uprv_strchr(localeName, '.'))) != NULL) { + /* strip the locale name and look at the suffix only */ + name = uprv_strncpy(codesetName, name+1, sizeof(codesetName)); + codesetName[sizeof(codesetName)-1] = 0; + if ((euro = (uprv_strchr(name, '@'))) != NULL) { + *euro = 0; } - else - { - /* if the table lookup failed, return US ASCII (ISO 646). */ - uprv_strcpy(codesetName, "US-ASCII"); + /* if we can find the codset name, return that. */ + if (*name) { + return name; } } + + if (*codesetName == 0) + { + /* if the table lookup failed, return US ASCII (ISO 646). */ + uprv_strcpy(codesetName, "US-ASCII"); + } return codesetName; #else return "US-ASCII"; #endif } -#if U_CHARSET_FAMILY==U_EBCDIC_FAMILY -#ifdef OS390 -/* - * These maps for ASCII to/from EBCDIC are from - * "UTF-EBCDIC - EBCDIC-Friendly Unicode (or UCS) Transformation Format" - * at http://www.unicode.org/unicode/reports/tr16/ - * (which should reflect codepage 1047) - * but modified to explicitly exclude the variant - * control and graphical characters that are in ASCII-based - * codepages at 0x80 and above. - * Also, unlike in Version 6.0 of the UTR on UTF-EBCDIC, - * the Line Feed mapping varies according to the environment. - * - * These tables do not establish a converter or a codepage. - */ - - /* on S/390 Open Edition, ASCII 0xa (LF) maps to 0x15 and ISO-8 0x85 maps to 0x25 */ -# define E_LF 0x15 -# define A_15 0x0a -# define A_25 0x00 - -# if 0 - /* the CDRA variation of 1047 is not currently used - see tables in #else below */ - /* in standard EBCDIC (CDRA), ASCII 0xa (LF) maps to 0x25 and ISO-8 0x85 maps to 0x15 */ -# define E_LF 0x25 -# define A_15 0x00 -# define A_25 0x0a -# endif - -static const uint8_t asciiFromEbcdic[256]={ - 0x00, 0x01, 0x02, 0x03, 0x00, 0x09, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, - 0x10, 0x11, 0x12, 0x13, 0x00, A_15, 0x08, 0x00, 0x18, 0x19, 0x00, 0x00, 0x1C, 0x1D, 0x1E, 0x1F, - 0x00, 0x00, 0x00, 0x00, 0x00, A_25, 0x17, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x07, - 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x14, 0x15, 0x00, 0x1A, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x3C, 0x28, 0x2B, 0x7C, - 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0x5E, - 0x2D, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x25, 0x5F, 0x3E, 0x3F, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22, - 0x00, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00, - 0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5C, 0x00, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static const uint8_t ebcdicFromAscii[256]={ - 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, 0x16, 0x05, E_LF, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, - 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F, - 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61, - 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F, - 0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, - 0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xAD, 0xE0, 0xBD, 0x5F, 0x6D, - 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, - 0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -#else -/* - * These maps for ASCII to/from EBCDIC were generated - * using the ICU converter for codepage 37 on 2000-may-22. - * They explicitly exclude the variant - * control and graphical characters that are in ASCII-based - * codepages at 0x80 and above. - * - * These tables do not establish a converter or a codepage. - */ - -static const uint8_t asciiFromEbcdic[256]={ - 0x00, 0x01, 0x02, 0x03, 0x00, 0x09, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, 0x00, 0x00, 0x08, 0x00, 0x18, 0x19, 0x00, 0x00, 0x1c, 0x1d, 0x1e, 0x1f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x17, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x07, - 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x14, 0x15, 0x00, 0x1a, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x3c, 0x28, 0x2b, 0x7c, - 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x24, 0x2a, 0x29, 0x3b, 0x00, - 0x2d, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x25, 0x5f, 0x3e, 0x3f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x3a, 0x23, 0x40, 0x27, 0x3d, 0x22, - 0x00, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x7e, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x5d, 0x00, 0x00, 0x00, 0x00, - 0x7b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x7d, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5c, 0x00, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static const uint8_t ebcdicFromAscii[256]={ - 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f, - 0x40, 0x5a, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61, - 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f, - 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, - 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xba, 0xe0, 0xbb, 0xb0, 0x6d, - 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, - 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x4f, 0xd0, 0xa1, 0x07, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -#endif - -#endif -U_CAPI void U_EXPORT2 -u_charsToUChars(const char *cs, UChar *us, int32_t length) { - while(length>0) { -#if U_CHARSET_FAMILY==U_ASCII_FAMILY - *us++=(UChar)(uint8_t)(*cs++); -#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY - *us++=(UChar)asciiFromEbcdic[(uint8_t)(*cs++)]; -#else -# error U_CHARSET_FAMILY is not valid -#endif - --length; +U_CAPI const char* U_EXPORT2 +uprv_getDefaultCodepage() +{ + static char const *name = NULL; + umtx_lock(NULL); + if (name == NULL) { + name = int_getDefaultCodepage(); } + umtx_unlock(NULL); + return name; } -U_CAPI void U_EXPORT2 -u_UCharsToChars(const UChar *us, char *cs, int32_t length) { - while(length>0) { -#if U_CHARSET_FAMILY==U_ASCII_FAMILY - *cs++=(char)(*us++); -#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY - *cs++=(char)ebcdicFromAscii[(uint8_t)(*us++)]; -#else -# error U_CHARSET_FAMILY is not valid -#endif - --length; - } -} -/* end of platform-specific implementation */ +/* end of platform-specific implementation -------------- */ + +/* version handling --------------------------------------------------------- */ U_CAPI void U_EXPORT2 u_versionFromString(UVersionInfo versionArray, const char *versionString) { @@ -2134,175 +2068,6 @@ u_getVersion(UVersionInfo versionArray) { u_versionFromString(versionArray, U_ICU_VERSION); } -/* u_errorName() ------------------------------------------------------------ */ - -static const char * const -_uErrorInfoName[U_ERROR_WARNING_LIMIT-U_ERROR_WARNING_START]={ - "U_USING_FALLBACK_WARNING", - "U_USING_DEFAULT_WARNING", - "U_SAFECLONE_ALLOCATED_WARNING", - "U_STATE_OLD_WARNING", - "U_STRING_NOT_TERMINATED_WARNING", - "U_SORT_KEY_TOO_SHORT_WARNING", - "U_AMBIGUOUS_ALIAS_WARNING", - "U_DIFFERENT_UCA_VERSION" -}; - -static const char * const -_uTransErrorName[U_PARSE_ERROR_LIMIT - U_PARSE_ERROR_START]={ - "U_BAD_VARIABLE_DEFINITION", - "U_MALFORMED_RULE", - "U_MALFORMED_SET", - "U_MALFORMED_SYMBOL_REFERENCE", - "U_MALFORMED_UNICODE_ESCAPE", - "U_MALFORMED_VARIABLE_DEFINITION", - "U_MALFORMED_VARIABLE_REFERENCE", - "U_MISMATCHED_SEGMENT_DELIMITERS", - "U_MISPLACED_ANCHOR_START", - "U_MISPLACED_CURSOR_OFFSET", - "U_MISPLACED_QUANTIFIER", - "U_MISSING_OPERATOR", - "U_MISSING_SEGMENT_CLOSE", - "U_MULTIPLE_ANTE_CONTEXTS", - "U_MULTIPLE_CURSORS", - "U_MULTIPLE_POST_CONTEXTS", - "U_TRAILING_BACKSLASH", - "U_UNDEFINED_SEGMENT_REFERENCE", - "U_UNDEFINED_VARIABLE", - "U_UNQUOTED_SPECIAL", - "U_UNTERMINATED_QUOTE", - "U_RULE_MASK_ERROR", - "U_MISPLACED_COMPOUND_FILTER", - "U_MULTIPLE_COMPOUND_FILTERS", - "U_INVALID_RBT_SYNTAX", - "U_INVALID_PROPERTY_PATTERN", - "U_MALFORMED_PRAGMA", - "U_UNCLOSED_SEGMENT", - "U_ILLEGAL_CHAR_IN_SEGMENT", - "U_VARIABLE_RANGE_EXHAUSTED", - "U_VARIABLE_RANGE_OVERLAP", - "U_ILLEGAL_CHARACTER", - "U_INTERNAL_TRANSLITERATOR_ERROR", - "U_INVALID_ID", - "U_INVALID_FUNCTION" -}; - -static const char * const -_uErrorName[U_STANDARD_ERROR_LIMIT]={ - "U_ZERO_ERROR", - - "U_ILLEGAL_ARGUMENT_ERROR", - "U_MISSING_RESOURCE_ERROR", - "U_INVALID_FORMAT_ERROR", - "U_FILE_ACCESS_ERROR", - "U_INTERNAL_PROGRAM_ERROR", - "U_MESSAGE_PARSE_ERROR", - "U_MEMORY_ALLOCATION_ERROR", - "U_INDEX_OUTOFBOUNDS_ERROR", - "U_PARSE_ERROR", - "U_INVALID_CHAR_FOUND", - "U_TRUNCATED_CHAR_FOUND", - "U_ILLEGAL_CHAR_FOUND", - "U_INVALID_TABLE_FORMAT", - "U_INVALID_TABLE_FILE", - "U_BUFFER_OVERFLOW_ERROR", - "U_UNSUPPORTED_ERROR", - "U_RESOURCE_TYPE_MISMATCH", - "U_ILLEGAL_ESCAPE_SEQUENCE", - "U_UNSUPPORTED_ESCAPE_SEQUENCE", - "U_NO_SPACE_AVAILABLE", - "U_CE_NOT_FOUND_ERROR", - "U_PRIMARY_TOO_LONG_ERROR", - "U_STATE_TOO_OLD_ERROR", - "U_TOO_MANY_ALIASES_ERROR", - "U_ENUM_OUT_OF_SYNC_ERROR", - "U_INVARIANT_CONVERSION_ERROR" -}; -static const char * const -_uFmtErrorName[U_FMT_PARSE_ERROR_LIMIT - U_FMT_PARSE_ERROR_START] = { - "U_UNEXPECTED_TOKEN", - "U_MULTIPLE_DECIMAL_SEPARATORS", - "U_MULTIPLE_EXPONENTIAL_SYMBOLS", - "U_MALFORMED_EXPONENTIAL_PATTERN", - "U_MULTIPLE_PERCENT_SYMBOLS", - "U_MULTIPLE_PERMILL_SYMBOLS", - "U_MULTIPLE_PAD_SPECIFIERS", - "U_PATTERN_SYNTAX_ERROR", - "U_ILLEGAL_PAD_POSITION", - "U_UNMATCHED_BRACES", - "U_UNSUPPORTED_PROPERTY", - "U_UNSUPPORTED_ATTRIBUTE" -}; - -static const char * const -_uBrkErrorName[U_BRK_ERROR_LIMIT - U_BRK_ERROR_START] = { - "U_BRK_ERROR_START", - "U_BRK_INTERNAL_ERROR", - "U_BRK_HEX_DIGITS_EXPECTED", - "U_BRK_SEMICOLON_EXPECTED", - "U_BRK_RULE_SYNTAX", - "U_BRK_UNCLOSED_SET", - "U_BRK_ASSIGN_ERROR", - "U_BRK_VARIABLE_REDFINITION", - "U_BRK_MISMATCHED_PAREN", - "U_BRK_NEW_LINE_IN_QUOTED_STRING", - "U_BRK_UNDEFINED_VARIABLE", - "U_BRK_INIT_ERROR", - "U_BRK_RULE_EMPTY_SET" -}; - -static const char * const -_uRegexErrorName[U_REGEX_ERROR_LIMIT - U_REGEX_ERROR_START] = { - "U_REGEX_ERROR_START", - "U_REGEX_INTERNAL_ERROR", - "U_REGEX_RULE_SYNTAX", - "U_REGEX_INVALID_STATE", - "U_REGEX_BAD_ESCAPE_SEQUENCE", - "U_REGEX_PROPERTY_SYNTAX", - "U_REGEX_UNIMPLEMENTED", - "U_REGEX_MISMATCHED_PAREN", - "U_REGEX_NUMBER_TOO_BIG", - "U_REGEX_BAD_INTERVAL", - "U_REGEX_MAX_LT_MIN", - "U_REGEX_INVALID_BACK_REF", - "U_REGEX_INVALID_FLAG", - "U_REGEX_LOOK_BEHIND_LIMIT", - "U_REGEX_SET_CONTAINS_STRING" -}; - -static const char * const -_uIDNAErrorName[U_IDNA_ERROR_LIMIT - U_IDNA_ERROR_START] = { - "U_IDNA_ERROR_START", - "U_IDNA_PROHIBITED_CODEPOINT_FOUND_ERROR", - "U_IDNA_UNASSIGNED_CODEPOINT_FOUND_ERROR", - "U_IDNA_CHECK_BIDI_ERROR", - "U_IDNA_STD3_ASCII_RULES_ERROR", - "U_IDNA_ACE_PREFIX_ERROR", - "U_IDNA_VERIFICATION_ERROR", - "U_IDNA_LABEL_TOO_LONG_ERROR" -}; - -U_CAPI const char * U_EXPORT2 -u_errorName(UErrorCode code) { - if(U_ZERO_ERROR <= code && code < U_STANDARD_ERROR_LIMIT) { - return _uErrorName[code]; - } else if(U_ERROR_WARNING_START <= code && code < U_ERROR_WARNING_LIMIT) { - return _uErrorInfoName[code - U_ERROR_WARNING_START]; - } else if(U_PARSE_ERROR_START <= code && code < U_PARSE_ERROR_LIMIT){ - return _uTransErrorName[code - U_PARSE_ERROR_START]; - } else if(U_FMT_PARSE_ERROR_START <= code && code < U_FMT_PARSE_ERROR_LIMIT){ - return _uFmtErrorName[code - U_FMT_PARSE_ERROR_START]; - } else if (U_BRK_ERROR_START <= code && code < U_BRK_ERROR_LIMIT){ - return _uBrkErrorName[code - U_BRK_ERROR_START]; - } else if (U_REGEX_ERROR_START <= code && code < U_REGEX_ERROR_LIMIT) { - return _uRegexErrorName[code - U_REGEX_ERROR_START]; - } else if( U_IDNA_ERROR_START <= code && code <= U_IDNA_ERROR_LIMIT) { - return _uIDNAErrorName[code - U_IDNA_ERROR_START]; - } else { - return "[BOGUS UErrorCode]"; - } -} - /* * Hey, Emacs, please set the following: * diff --git a/icuSources/common/putilimp.h b/icuSources/common/putilimp.h new file mode 100644 index 00000000..945cae22 --- /dev/null +++ b/icuSources/common/putilimp.h @@ -0,0 +1,278 @@ +/* +****************************************************************************** +* +* Copyright (C) 1997-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +****************************************************************************** +* +* FILE NAME : putilimp.h +* +* Date Name Description +* 10/17/04 grhoten Move internal functions from putil.h to this file. +****************************************************************************** +*/ + +#ifndef PUTILIMP_H +#define PUTILIMP_H + +#include "unicode/utypes.h" +#include "unicode/putil.h" + +/*==========================================================================*/ +/* Platform utilities */ +/*==========================================================================*/ + +/** + * Platform utilities isolates the platform dependencies of the + * libarary. For each platform which this code is ported to, these + * functions may have to be re-implemented. + */ + +/** + * Floating point utility to determine if a double is Not a Number (NaN). + * @internal + */ +U_INTERNAL UBool U_EXPORT2 uprv_isNaN(double d); +/** + * Floating point utility to determine if a double has an infinite value. + * @internal + */ +U_INTERNAL UBool U_EXPORT2 uprv_isInfinite(double d); +/** + * Floating point utility to determine if a double has a positive infinite value. + * @internal + */ +U_INTERNAL UBool U_EXPORT2 uprv_isPositiveInfinity(double d); +/** + * Floating point utility to determine if a double has a negative infinite value. + * @internal + */ +U_INTERNAL UBool U_EXPORT2 uprv_isNegativeInfinity(double d); +/** + * Floating point utility that returns a Not a Number (NaN) value. + * @internal + */ +U_INTERNAL double U_EXPORT2 uprv_getNaN(void); +/** + * Floating point utility that returns an infinite value. + * @internal + */ +U_INTERNAL double U_EXPORT2 uprv_getInfinity(void); + +/** + * Floating point utility to truncate a double. + * @internal + */ +U_INTERNAL double U_EXPORT2 uprv_trunc(double d); +/** + * Floating point utility to calculate the floor of a double. + * @internal + */ +U_INTERNAL double U_EXPORT2 uprv_floor(double d); +/** + * Floating point utility to calculate the ceiling of a double. + * @internal + */ +U_INTERNAL double U_EXPORT2 uprv_ceil(double d); +/** + * Floating point utility to calculate the absolute value of a double. + * @internal + */ +U_INTERNAL double U_EXPORT2 uprv_fabs(double d); +/** + * Floating point utility to calculate the fractional and integer parts of a double. + * @internal + */ +U_INTERNAL double U_EXPORT2 uprv_modf(double d, double* pinteger); +/** + * Floating point utility to calculate the remainder of a double divided by another double. + * @internal + */ +U_INTERNAL double U_EXPORT2 uprv_fmod(double d, double y); +/** + * Floating point utility to calculate d to the power of exponent (d^exponent). + * @internal + */ +U_INTERNAL double U_EXPORT2 uprv_pow(double d, double exponent); +/** + * Floating point utility to calculate 10 to the power of exponent (10^exponent). + * @internal + */ +U_INTERNAL double U_EXPORT2 uprv_pow10(int32_t exponent); +/** + * Floating point utility to calculate the maximum value of two doubles. + * @internal + */ +U_INTERNAL double U_EXPORT2 uprv_fmax(double d, double y); +/** + * Floating point utility to calculate the minimum value of two doubles. + * @internal + */ +U_INTERNAL double U_EXPORT2 uprv_fmin(double d, double y); +/** + * Private utility to calculate the maximum value of two integers. + * @internal + */ +U_INTERNAL int32_t U_EXPORT2 uprv_max(int32_t d, int32_t y); +/** + * Private utility to calculate the minimum value of two integers. + * @internal + */ +U_INTERNAL int32_t U_EXPORT2 uprv_min(int32_t d, int32_t y); + +#if U_IS_BIG_ENDIAN +# define uprv_isNegative(number) (*((signed char *)&(number))<0) +#else +# define uprv_isNegative(number) (*((signed char *)&(number)+sizeof(number)-1)<0) +#endif + +/** + * Return the largest positive number that can be represented by an integer + * type of arbitrary bit length. + * @internal + */ +U_INTERNAL double U_EXPORT2 uprv_maxMantissa(void); + +/** + * Return the floor of the log base 10 of a given double. + * This method compensates for inaccuracies which arise naturally when + * computing logs, and always gives the correct value. The parameter + * must be positive and finite. + * (Thanks to Alan Liu for supplying this function.) + * + * @param d the double value to apply the common log function for. + * @return the log of value d. + * @internal + */ +U_INTERNAL int16_t U_EXPORT2 uprv_log10(double d); + +/** + * Floating point utility to calculate the logarithm of a double. + * @internal + */ +U_INTERNAL double U_EXPORT2 uprv_log(double d); + +/** + * Does common notion of rounding e.g. uprv_floor(x + 0.5); + * @param x the double number + * @return the rounded double + * @internal + */ +U_INTERNAL double U_EXPORT2 uprv_round(double x); + +#if 0 +/** + * Returns the number of digits after the decimal point in a double number x. + * + * @param x the double number + * @return the number of digits after the decimal point in a double number x. + * @internal + */ +/*U_INTERNAL int32_t U_EXPORT2 uprv_digitsAfterDecimal(double x);*/ +#endif + +/** + * Time zone utilities + * + * Wrappers for C runtime library functions relating to timezones. + * The t_tzset() function (similar to tzset) uses the current setting + * of the environment variable TZ to assign values to three global + * variables: daylight, timezone, and tzname. These variables have the + * following meanings, and are declared in <time.h>. + * + * daylight Nonzero if daylight-saving-time zone (DST) is specified + * in TZ; otherwise, 0. Default value is 1. + * timezone Difference in seconds between coordinated universal + * time and local time. E.g., -28,800 for PST (GMT-8hrs) + * tzname(0) Three-letter time-zone name derived from TZ environment + * variable. E.g., "PST". + * tzname(1) Three-letter DST zone name derived from TZ environment + * variable. E.g., "PDT". If DST zone is omitted from TZ, + * tzname(1) is an empty string. + * + * Notes: For example, to set the TZ environment variable to correspond + * to the current time zone in Germany, you can use one of the + * following statements: + * + * set TZ=GST1GDT + * set TZ=GST+1GDT + * + * If the TZ value is not set, t_tzset() attempts to use the time zone + * information specified by the operating system. Under Windows NT + * and Windows 95, this information is specified in the Control Panel's + * Date/Time application. + * @internal + */ +U_INTERNAL void U_EXPORT2 uprv_tzset(void); + +/** + * Difference in seconds between coordinated universal + * time and local time. E.g., -28,800 for PST (GMT-8hrs) + * @return the difference in seconds between coordinated universal time and local time. + * @internal + */ +U_INTERNAL int32_t U_EXPORT2 uprv_timezone(void); + +/** + * tzname(0) Three-letter time-zone name derived from TZ environment + * variable. E.g., "PST". + * tzname(1) Three-letter DST zone name derived from TZ environment + * variable. E.g., "PDT". If DST zone is omitted from TZ, + * tzname(1) is an empty string. + * @internal + */ +U_INTERNAL const char* U_EXPORT2 uprv_tzname(int n); + +/** + * Get UTC (GMT) time measured in milliseconds since 0:00 on 1/1/1970. + * @return the UTC time measured in milliseconds + * @internal + */ +U_INTERNAL UDate U_EXPORT2 uprv_getUTCtime(void); + +/** + * Determine whether a pathname is absolute or not, as defined by the platform. + * @param path Pathname to test + * @return TRUE if the path is absolute + * @internal (ICU 3.0) + */ +U_INTERNAL UBool U_EXPORT2 uprv_pathIsAbsolute(const char *path); + +/** + * Maximum value of a (void*) - use to indicate the limit of an 'infinite' buffer. + * In fact, buffer sizes must not exceed 2GB so that the difference between + * the buffer limit and the buffer start can be expressed in an int32_t. + * + * The definition of U_MAX_PTR must fulfill the following conditions: + * - return the largest possible pointer greater than base + * - return a valid pointer according to the machine architecture (AS/400, 64-bit, etc.) + * - avoid wrapping around at high addresses + * - make sure that the returned pointer is not farther from base than 0x7fffffff + * + * @param base The beginning of a buffer to find the maximum offset from + * @internal + */ +#ifndef U_MAX_PTR +# ifdef OS390 +# define U_MAX_PTR(base) ((void *)0x7fffffff) +# elif defined(OS400) +/* + * With the provided macro we should never be out of range of a given segment + * (a traditional/typical segment that is). Our segments have 5 bytes for the id + * and 3 bytes for the offset. The key is that the casting takes care of only + * retrieving the offset portion minus x1000. Hence, the smallest offset seen in + * a program is x001000 and when casted to an int would be 0. That's why we can + * only add 0xffefff. Otherwise, we would exceed the segment. + * + * Currently, 16MB is the current addressing limitation on as/400. This macro + * may eventually be changed to use 2GB addressability for the newer version of + * as/400 machines. + */ +# define U_MAX_PTR(base) ((void *)(((char *)base)-((int32_t)(base))+((int32_t)0xffefff))) +# else +# define U_MAX_PTR(base) ((void *)(((char *)(base)+0x7fffffffu) > (char *)(base) ? ((char *)(base)+0x7fffffffu) : (char *)-1)) +# endif +#endif + +#endif diff --git a/icuSources/common/rbbi.cpp b/icuSources/common/rbbi.cpp index 83e82e07..50a9f0d6 100644 --- a/icuSources/common/rbbi.cpp +++ b/icuSources/common/rbbi.cpp @@ -1,14 +1,14 @@ -// -// file: rbbi.c Contains the implementation of the rule based break iterator -// runtime engine and the API implementation for -// class RuleBasedBreakIterator -// /* *************************************************************************** -* Copyright (C) 1999-2003 International Business Machines Corporation * +* Copyright (C) 1999-2004 International Business Machines Corporation * * and others. All rights reserved. * *************************************************************************** */ +// +// file: rbbi.c Contains the implementation of the rule based break iterator +// runtime engine and the API implementation for +// class RuleBasedBreakIterator +// #include "unicode/utypes.h" @@ -17,6 +17,7 @@ #include "unicode/rbbi.h" #include "unicode/schriter.h" #include "unicode/udata.h" +#include "unicode/uclean.h" #include "rbbidata.h" #include "rbbirb.h" #include "cmemory.h" @@ -30,11 +31,8 @@ U_NAMESPACE_BEGIN static const int16_t START_STATE = 1; // The state number of the starting state static const int16_t STOP_STATE = 0; // The state-transition value indicating "stop" -/** - * Class ID. (value is irrelevant; address is important) - */ -const char -RuleBasedBreakIterator::fgClassID = 0; + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(RuleBasedBreakIterator) //======================================================================= @@ -48,8 +46,8 @@ RuleBasedBreakIterator::fgClassID = 0; RuleBasedBreakIterator::RuleBasedBreakIterator(RBBIDataHeader* data, UErrorCode &status) { init(); + fData = new RBBIDataWrapper(data, status); // status checked in constructor if (U_FAILURE(status)) {return;} - fData = new RBBIDataWrapper(data, status); if(fData == 0) { status = U_MEMORY_ALLOCATION_ERROR; return; @@ -65,8 +63,8 @@ RuleBasedBreakIterator::RuleBasedBreakIterator(RBBIDataHeader* data, UErrorCode RuleBasedBreakIterator::RuleBasedBreakIterator(UDataMemory* udm, UErrorCode &status) { init(); + fData = new RBBIDataWrapper(udm, status); // status checked in constructor if (U_FAILURE(status)) {return;} - fData = new RBBIDataWrapper(udm, status); if(fData == 0) { status = U_MEMORY_ALLOCATION_ERROR; return; @@ -84,6 +82,7 @@ RuleBasedBreakIterator::RuleBasedBreakIterator( const UnicodeString &rules, UParseError &parseError, UErrorCode &status) { + u_init(&status); // Just in case ICU is not yet initialized init(); if (U_FAILURE(status)) {return;} RuleBasedBreakIterator *bi = (RuleBasedBreakIterator *) @@ -174,12 +173,11 @@ RuleBasedBreakIterator::operator=(const RuleBasedBreakIterator& that) { UBool RuleBasedBreakIterator::fTrace = FALSE; void RuleBasedBreakIterator::init() { - fText = NULL; - fData = NULL; - fCharMappings = NULL; - fLastBreakTag = 0; - fLastBreakTagValid = TRUE; - fDictionaryCharCount = 0; + fText = NULL; + fData = NULL; + fLastRuleStatusIndex = 0; + fLastStatusIndexValid = TRUE; + fDictionaryCharCount = 0; #ifdef RBBI_DEBUG static UBool debugInitDone = FALSE; @@ -221,7 +219,7 @@ RuleBasedBreakIterator::operator==(const BreakIterator& that) const { const RuleBasedBreakIterator& that2 = (const RuleBasedBreakIterator&) that; if (fText == that2.fText || (fText != NULL && that2.fText != NULL && *that2.fText == *fText)) { - if (that2.fData == fData || + if (that2.fData == fData || (fData != NULL && that2.fData != NULL && *that2.fData == *fData)) { r = TRUE; } @@ -281,8 +279,7 @@ RuleBasedBreakIterator::getText() const { // function is called while we're in that state, we have to fudge an // an iterator to return. if (nonConstThis->fText == NULL) { - // TODO: do this in a way that does not do a default conversion! - nonConstThis->fText = new StringCharacterIterator(""); + nonConstThis->fText = new StringCharacterIterator(UnicodeString()); } return *nonConstThis->fText; } @@ -328,8 +325,8 @@ RuleBasedBreakIterator::setText(const UnicodeString& newText) { */ int32_t RuleBasedBreakIterator::first(void) { reset(); - fLastBreakTag = 0; - fLastBreakTagValid = TRUE; + fLastRuleStatusIndex = 0; + fLastStatusIndexValid = TRUE; if (fText == NULL) return BreakIterator::DONE; @@ -345,8 +342,8 @@ int32_t RuleBasedBreakIterator::first(void) { int32_t RuleBasedBreakIterator::last(void) { reset(); if (fText == NULL) { - fLastBreakTag = 0; - fLastBreakTagValid = TRUE; + fLastRuleStatusIndex = 0; + fLastStatusIndexValid = TRUE; return BreakIterator::DONE; } @@ -357,7 +354,7 @@ int32_t RuleBasedBreakIterator::last(void) { // will work correctly.) - fLastBreakTagValid = FALSE; + fLastStatusIndexValid = FALSE; int32_t pos = fText->endIndex(); fText->setIndex(pos); @@ -401,17 +398,24 @@ int32_t RuleBasedBreakIterator::next(void) { int32_t RuleBasedBreakIterator::previous(void) { // if we're already sitting at the beginning of the text, return DONE if (fText == NULL || current() == fText->startIndex()) { - fLastBreakTag = 0; - fLastBreakTagValid = TRUE; + fLastRuleStatusIndex = 0; + fLastStatusIndexValid = TRUE; return BreakIterator::DONE; } + if (fData->fSafeRevTable != NULL || fData->fSafeFwdTable != NULL) { + return handlePrevious(fData->fReverseTable); + } + + // old rule syntax // set things up. handlePrevious() will back us up to some valid // break position before the current position (we back our internal // iterator up one step to prevent handlePrevious() from returning // the current position), but not necessarily the last one before // where we started + int32_t start = current(); + fText->previous32(); int32_t lastResult = handlePrevious(); int32_t result = lastResult; @@ -421,35 +425,32 @@ int32_t RuleBasedBreakIterator::previous(void) { // iterate forward from the known break position until we pass our // starting point. The last break position before the starting // point is our return value + for (;;) { result = handleNext(); if (result == BreakIterator::DONE || result >= start) { break; } lastResult = result; - lastTag = fLastBreakTag; + lastTag = fLastRuleStatusIndex; breakTagValid = TRUE; } // fLastBreakTag wants to have the value for section of text preceding // the result position that we are to return (in lastResult.) If // the backwards rules overshot and the above loop had to do two or more - // handleNext()s to move up to the desired return position, we will have a valid - // tag value. But, if handlePrevious() took us to exactly the correct result positon, - // we wont have a tag value for that position, which is only set by handleNext(). - + // handleNext()s to move up to the desired return position, we will have a valid + // tag value. But, if handlePrevious() took us to exactly the correct result positon, + // we wont have a tag value for that position, which is only set by handleNext(). // set the current iteration position to be the last break position // before where we started, and then return that value fText->setIndex(lastResult); - fLastBreakTag = lastTag; // for use by getRuleStatus() - fLastBreakTagValid = breakTagValid; + fLastRuleStatusIndex = lastTag; // for use by getRuleStatus() + fLastStatusIndexValid = breakTagValid; return lastResult; } - - - /** * Sets the iterator to refer to the first boundary position following * the specified position. @@ -460,27 +461,61 @@ int32_t RuleBasedBreakIterator::following(int32_t offset) { // if the offset passed in is already past the end of the text, // just return DONE; if it's before the beginning, return the // text's starting offset - fLastBreakTag = 0; - fLastBreakTagValid = TRUE; + fLastRuleStatusIndex = 0; + fLastStatusIndexValid = TRUE; if (fText == NULL || offset >= fText->endIndex()) { - // fText->setToEnd(); - // return BreakIterator::DONE; last(); return next(); } else if (offset < fText->startIndex()) { - // fText->setToStart(); - // return fText->startIndex(); return first(); } // otherwise, set our internal iteration position (temporarily) // to the position passed in. If this is the _beginning_ position, // then we can just use next() to get our return value - fText->setIndex(offset); - if (offset == fText->startIndex()) - return handleNext(); + int32_t result = 0; + + if (fData->fSafeRevTable != NULL) { + // new rule syntax + /// todo synwee + fText->setIndex(offset); + // move forward one codepoint to prepare for moving back to a + // safe point. + // this handles offset being between a supplementary character + fText->next32(); + // handlePrevious will move most of the time to < 1 boundary away + handlePrevious(fData->fSafeRevTable); + int32_t result = next(); + while (result <= offset) { + result = next(); + } + return result; + } + if (fData->fSafeFwdTable != NULL) { + // backup plan if forward safe table is not available + fText->setIndex(offset); + fText->previous32(); + // handle next will give result >= offset + handleNext(fData->fSafeFwdTable); + // previous will give result 0 or 1 boundary away from offset, + // most of the time + // we have to + int32_t oldresult = previous(); + while (oldresult > offset) { + int32_t result = previous(); + if (result <= offset) { + return oldresult; + } + oldresult = result; + } + int32_t result = next(); + if (result <= offset) { + return next(); + } + return result; + } // otherwise, we have to sync up first. Use handlePrevious() to back // us up to a known break position before the specified position (if // we can determine that the specified position is a break position, @@ -488,8 +523,14 @@ int32_t RuleBasedBreakIterator::following(int32_t offset) { // position at or before our starting position. Advance forward // from here until we've passed the starting position. The position // we stop on will be the first break position after the specified one. + // old rule syntax + + fText->setIndex(offset); + if (offset == fText->startIndex()) { + return handleNext(); + } + result = previous(); - int32_t result = previous(); while (result != BreakIterator::DONE && result <= offset) { result = next(); } @@ -506,6 +547,7 @@ int32_t RuleBasedBreakIterator::following(int32_t offset) { int32_t RuleBasedBreakIterator::preceding(int32_t offset) { // if the offset passed in is already past the end of the text, // just return DONE; if it's before the beginning, return the + // text's starting offset if (fText == NULL || offset > fText->endIndex()) { // return BreakIterator::DONE; @@ -518,6 +560,51 @@ int32_t RuleBasedBreakIterator::preceding(int32_t offset) { // if we start by updating the current iteration position to the // position specified by the caller, we can just use previous() // to carry out this operation + + if (fData->fSafeFwdTable != NULL) { + /// todo synwee + // new rule syntax + fText->setIndex(offset); + // move backwards one codepoint to prepare for moving forwards to a + // safe point. + // this handles offset being between a supplementary character + // TODO: would it be better to just check for being in the middle of a surrogate pair, + // rather than adjusting the position unconditionally? + // (Change would interact with safe rules.) + fText->previous32(); + handleNext(fData->fSafeFwdTable); + int32_t result = fText->getIndex(); + while (result >= offset) { + result = previous(); + } + return result; + } + if (fData->fSafeRevTable != NULL) { + // backup plan if forward safe table is not available + fText->setIndex(offset); + fText->next32(); + // handle previous will give result <= offset + handlePrevious(fData->fSafeRevTable); + + // next will give result 0 or 1 boundary away from offset, + // most of the time + // we have to + int32_t oldresult = next(); + while (oldresult < offset) { + int32_t result = next(); + if (result >= offset) { + return oldresult; + } + oldresult = result; + } + int32_t result = previous(); + if (result >= offset) { + return previous(); + } + return result; + } + + // old rule syntax fText->setIndex(offset); return previous(); } @@ -536,6 +623,11 @@ UBool RuleBasedBreakIterator::isBoundary(int32_t offset) { return TRUE; } + if (offset == fText->endIndex()) { + last(); // For side effects on current position, tag values. + return TRUE; + } + // out-of-range indexes are never boundary positions if (offset < fText->startIndex()) { first(); // For side effects on current position, tag values. @@ -573,29 +665,29 @@ int32_t RuleBasedBreakIterator::current(void) const { // vectors through here. This method initializes the state machine to state 1 // and advances through the text character by character until we reach the end // of the text or the state machine transitions to state 0. We update our return -// value every time the state machine passes through a possible end state. +// value every time the state machine passes through an accepting state. // //----------------------------------------------------------------------------------- -int32_t RuleBasedBreakIterator::handleNext(void) { +int32_t RuleBasedBreakIterator::handleNext() { + return handleNext(fData->fForwardTable); +} + +int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { if (fTrace) { - RBBIDebugPrintf("Handle Next pos char state category \n"); + RBBIDebugPuts("Handle Next pos char state category"); } // No matter what, handleNext alway correctly sets the break tag value. - fLastBreakTagValid = TRUE; + fLastStatusIndexValid = TRUE; // if we're already at the end of the text, return DONE. - if (fText == NULL || fData == NULL || fText->getIndex() == fText->endIndex()) { - fLastBreakTag = 0; + if (fText == NULL || fData == NULL || fText->hasNext() == FALSE) { + fLastRuleStatusIndex = 0; return BreakIterator::DONE; } - // no matter what, we always advance at least one character forward - int32_t temp = fText->getIndex(); - fText->next32(); - int32_t result = fText->getIndex(); - fText->setIndex(temp); - + int32_t initialPosition = fText->getIndex(); + int32_t result = initialPosition; int32_t lookaheadResult = 0; // Initialize the state machine. Begin in state 1 @@ -604,12 +696,12 @@ int32_t RuleBasedBreakIterator::handleNext(void) { UChar32 c = fText->current32(); RBBIStateTableRow *row; int32_t lookaheadStatus = 0; - int32_t lookaheadTag = 0; + int32_t lookaheadTagIdx = 0; - fLastBreakTag = 0; + fLastRuleStatusIndex = 0; row = (RBBIStateTableRow *) // Point to starting row of state table. - (fData->fForwardTable->fTableData + (fData->fForwardTable->fRowLen * state)); + (statetable->fTableData + (statetable->fRowLen * state)); // Character Category fetch for starting character. // See comments on character category code within loop, below. @@ -622,15 +714,31 @@ int32_t RuleBasedBreakIterator::handleNext(void) { // loop until we reach the end of the text or transition to state 0 for (;;) { if (c == CharacterIterator::DONE && fText->hasNext()==FALSE) { - // Note: CharacterIterator::DONE is 0xffff, which is also a legal - // character value. Check for DONE first, because it's quicker, - // but also need to check fText->hasNext() to be certain. + // Reached end of input string. + // Note: CharacterIterator::DONE is 0xffff, which is also a legal + // character value. Check for DONE first, because it's quicker, + // but also need to check fText->hasNext() to be certain. + + if (lookaheadResult > result) { + // We ran off the end of the string with a pending look-ahead match. + // Treat this as if the look-ahead condition had been met, and return + // the match at the / position from the look-ahead rule. + result = lookaheadResult; + fLastRuleStatusIndex = lookaheadTagIdx; + lookaheadStatus = 0; + } else if (result == initialPosition) { + // Ran off end, no match found. + // move forward one + fText->setIndex(initialPosition); + fText->next32(); + fText->getIndex(); + } break; } // look up the current character's character category, which tells us // which column in the state table to look at. // Note: the 16 in UTRIE_GET16 refers to the size of the data being returned, - // not the size of the character going in. + // not the size of the character going in, which is a UChar32. // UTRIE_GET16(&fData->fTrie, c, category); @@ -645,91 +753,89 @@ int32_t RuleBasedBreakIterator::handleNext(void) { category &= ~0x4000; } - if (fTrace) { - RBBIDebugPrintf(" %4d ", fText->getIndex()); - if (0x20<=c && c<0x7f) { - RBBIDebugPrintf("\"%c\" ", c); - } else { - RBBIDebugPrintf("%5x ", c); + #ifdef RBBI_DEBUG + if (fTrace) { + RBBIDebugPrintf(" %4d ", fText->getIndex()); + if (0x20<=c && c<0x7f) { + RBBIDebugPrintf("\"%c\" ", c); + } else { + RBBIDebugPrintf("%5x ", c); + } + RBBIDebugPrintf("%3d %3d\n", state, category); } - RBBIDebugPrintf("%3d %3d\n", state, category); - } + #endif // look up a state transition in the state table state = row->fNextState[category]; row = (RBBIStateTableRow *) - (fData->fForwardTable->fTableData + (fData->fForwardTable->fRowLen * state)); + (statetable->fTableData + (statetable->fRowLen * state)); // Get the next character. Doing it here positions the iterator // to the correct position for recording matches in the code that // follows. - // TODO: 16 bit next, and a 16 bit TRIE lookup, with escape code - // for non-BMP chars, would be faster. c = fText->next32(); - if (row->fAccepting == 0 && row->fLookAhead == 0) { - // No match, nothing of interest happening, common case. - goto continueOn; - } - if (row->fAccepting == -1) { - // Match found, common case, no lookahead involved. - // (It's possible that some lookahead rule matched here also, - // but since there's an unconditional match, we'll favor that.) - result = fText->getIndex(); - lookaheadStatus = 0; // clear out any pending look-ahead matches. - fLastBreakTag = row->fTag; // Remember the break status (tag) value. - goto continueOn; + // Match found, common case, could have lookahead so we move on to check it + result = fText->getIndex(); + /// added + fLastRuleStatusIndex = row->fTagIdx; // Remember the break status (tag) values. } - if (row->fAccepting == 0 && row->fLookAhead != 0) { - // Lookahead match point. Remember it, but only if no other rule has - // unconitionally matched up to this point. - // TODO: handle case where there's a pending match from a different rule - - // where lookaheadStatus != 0 && lookaheadStatus != row->fLookAhead. - int32_t r = fText->getIndex(); - if (r > result) { - lookaheadResult = r; - lookaheadStatus = row->fLookAhead; - lookaheadTag = row->fTag; + if (row->fLookAhead != 0) { + if (lookaheadStatus != 0 + && row->fAccepting == lookaheadStatus) { + // Lookahead match is completed. Set the result accordingly, but only + // if no other rule has matched further in the mean time. + result = lookaheadResult; + fLastRuleStatusIndex = lookaheadTagIdx; + lookaheadStatus = 0; + /// i think we have to back up to read the lookahead character again + /// fText->setIndex(lookaheadResult); + /// TODO: this is a simple hack since reverse rules only have simple + /// lookahead rules that we can definitely break out from. + /// we need to make the lookahead rules not chain eventually. + /// return result; + /// this is going to be the longest match again + goto continueOn; } + + int32_t r = fText->getIndex(); + lookaheadResult = r; + lookaheadStatus = row->fLookAhead; + lookaheadTagIdx = row->fTagIdx; goto continueOn; } - if (row->fAccepting != 0 && row->fLookAhead != 0) { - // Lookahead match is completed. Set the result accordingly, but only - // if no other rule has matched further in the mean time. - if (lookaheadResult > result) { - U_ASSERT(row->fAccepting == lookaheadStatus); // TODO: handle this case - // of overlapping lookahead matches. - result = lookaheadResult; - fLastBreakTag = lookaheadTag; - lookaheadStatus = 0; - } + + if (row->fAccepting == 0) { + // No match, nothing of interest happening, common case. goto continueOn; } + lookaheadStatus = 0; // clear out any pending look-ahead matches. + continueOn: if (state == STOP_STATE) { + // This is the normal exit from the lookup state machine. + // We have advanced through the string until it is certain that no + // longer match is possible, no matter what characters follow. break; } - - // c = fText->next32(); } - // if we've run off the end of the text, and the very last character took us into - // a lookahead state, advance the break position to the lookahead position - // (the theory here is that if there are no characters at all after the lookahead - // position, that always matches the lookahead criteria) - // TODO: is this really the right behavior? - if (c == CharacterIterator::DONE && - fText->hasNext()==FALSE && - lookaheadResult == fText->endIndex()) { - result = lookaheadResult; - fLastBreakTag = lookaheadTag; - } + // The state machine is done. Check whether it found a match... + // If the iterator failed to advance in the match engine, force it ahead by one. + // (This really indicates a defect in the break rules. They should always match + // at least one character.) + if (result == initialPosition) { + result = fText->setIndex(initialPosition); + fText ->next32(); + result = fText->getIndex(); + } + // Leave the iterator at our result position. fText->setIndex(result); if (fTrace) { RBBIDebugPrintf("result = %d\n\n", result); @@ -737,18 +843,13 @@ continueOn: return result; } -//----------------------------------------------------------------------------------- -// -// handlePrevious() -// -// This method backs the iterator back up to a "safe position" in the text. -// This is a position that we know, without any context, must be a break position. -// The various calling methods then iterate forward from this safe position to -// the appropriate position to return. + +//---------------------------------------------------------------- // -// The logic of this function is very similar to handleNext(), above. +// handlePrevious(void) This is the variant used with old style rules +// (Overshoot to a safe point, then move forward) // -//----------------------------------------------------------------------------------- +//---------------------------------------------------------------- int32_t RuleBasedBreakIterator::handlePrevious(void) { if (fText == NULL || fData == NULL) { return 0; @@ -763,7 +864,7 @@ int32_t RuleBasedBreakIterator::handlePrevious(void) { int32_t result = fText->getIndex(); int32_t lookaheadStatus = 0; int32_t lookaheadResult = 0; - int32_t lookaheadTag = 0; + int32_t lookaheadTagIdx = 0; UChar32 c = fText->current32(); RBBIStateTableRow *row; @@ -776,7 +877,7 @@ int32_t RuleBasedBreakIterator::handlePrevious(void) { } if (fTrace) { - RBBIDebugPrintf("Handle Prev pos char state category \n"); + RBBIDebugPuts("Handle Prev pos char state category"); } // loop until we reach the beginning of the text or transition to state 0 @@ -798,15 +899,17 @@ int32_t RuleBasedBreakIterator::handlePrevious(void) { category &= ~0x4000; } - if (fTrace) { - RBBIDebugPrintf(" %4d ", fText->getIndex()); - if (0x20<=c && c<0x7f) { - RBBIDebugPrintf("\"%c\" ", c); - } else { - RBBIDebugPrintf("%5x ", c); + #ifdef RBBI_DEBUG + if (fTrace) { + RBBIDebugPrintf(" %4d ", fText->getIndex()); + if (0x20<=c && c<0x7f) { + RBBIDebugPrintf("\"%c\" ", c); + } else { + RBBIDebugPrintf("%5x ", c); + } + RBBIDebugPrintf("%3d %3d\n", state, category); } - RBBIDebugPrintf("%3d %3d\n", state, category); - } + #endif // look up a state transition in the backwards state table state = row->fNextState[category]; @@ -834,7 +937,7 @@ int32_t RuleBasedBreakIterator::handlePrevious(void) { if (r > result) { lookaheadResult = r; lookaheadStatus = row->fLookAhead; - lookaheadTag = row->fTag; + lookaheadTagIdx = row->fTagIdx; } goto continueOn; } @@ -845,8 +948,8 @@ int32_t RuleBasedBreakIterator::handlePrevious(void) { if (lookaheadResult > result) { U_ASSERT(row->fAccepting == lookaheadStatus); // TODO: handle this case // of overlapping lookahead matches. - result = lookaheadResult; - fLastBreakTag = lookaheadTag; + result = lookaheadResult; + fLastRuleStatusIndex = lookaheadTagIdx; lookaheadStatus = 0; } goto continueOn; @@ -873,6 +976,168 @@ continueOn: } +//----------------------------------------------------------------------------------- +// +// handlePrevious() +// +// This method backs the iterator back up to a "safe position" in the text. +// This is a position that we know, without any context, may be any position +// not more than 2 breaks away. Occasionally, the position may be less than +// one break away. +// The various calling methods then iterate forward from this safe position to +// the appropriate position to return. +// +// The logic of this function is very similar to handleNext(), above. +// +//----------------------------------------------------------------------------------- +int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) { + if (fText == NULL || statetable == NULL) { + return 0; + } + // break tag is no longer valid after icu switched to exact backwards + // positioning. + fLastStatusIndexValid = FALSE; + if (statetable == NULL) { + return fText->setToStart(); + } + + int32_t state = START_STATE; + int32_t category; + int32_t lastCategory = 0; + UBool hasPassedStartText = !fText->hasPrevious(); + UChar32 c = fText->previous32(); + // previous character + int32_t result = fText->getIndex(); + int32_t lookaheadStatus = 0; + int32_t lookaheadResult = 0; + int32_t lookaheadTagIdx = 0; + UBool lookAheadHardBreak = (statetable->fFlags & RBBI_LOOKAHEAD_HARD_BREAK) != 0; + + RBBIStateTableRow *row; + + row = (RBBIStateTableRow *) + (statetable->fTableData + (state * statetable->fRowLen)); + UTRIE_GET16(&fData->fTrie, c, category); + if ((category & 0x4000) != 0) { + fDictionaryCharCount++; + category &= ~0x4000; + } + + if (fTrace) { + RBBIDebugPuts("Handle Prev pos char state category"); + } + + // loop until we reach the beginning of the text or transition to state 0 + for (;;) { + // if (c == CharacterIterator::DONE && fText->hasPrevious()==FALSE) { + if (hasPassedStartText) { + // if we have already considered the start of the text + if (row->fLookAhead != 0 && lookaheadResult == 0) { + result = 0; + } + break; + } + + // save the last character's category and look up the current + // character's category + lastCategory = category; + UTRIE_GET16(&fData->fTrie, c, category); + + // Check the dictionary bit in the character's category. + // Counter is only used by dictionary based iterators. + // + if ((category & 0x4000) != 0) { + fDictionaryCharCount++; + category &= ~0x4000; + } + + #ifdef RBBI_DEBUG + if (fTrace) { + RBBIDebugPrintf(" %4d ", fText->getIndex()); + if (0x20<=c && c<0x7f) { + RBBIDebugPrintf("\"%c\" ", c); + } else { + RBBIDebugPrintf("%5x ", c); + } + RBBIDebugPrintf("%3d %3d\n", state, category); + } + #endif + + // look up a state transition in the backwards state table + state = row->fNextState[category]; + row = (RBBIStateTableRow *) + (statetable->fTableData + (state * statetable->fRowLen)); + + if (row->fAccepting == -1) { + // Match found, common case, could have lookahead so we move on to check it + result = fText->getIndex(); + /// added + fLastRuleStatusIndex = row->fTagIdx; // Remember the break status (tag) value. + } + + if (row->fLookAhead != 0) { + if (lookaheadStatus != 0 + && row->fAccepting == lookaheadStatus) { + // Lookahead match is completed. Set the result accordingly, but only + // if no other rule has matched further in the mean time. + result = lookaheadResult; + fLastRuleStatusIndex = lookaheadTagIdx; + lookaheadStatus = 0; + /// i think we have to back up to read the lookahead character again + /// fText->setIndex(lookaheadResult); + /// TODO: this is a simple hack since reverse rules only have simple + /// lookahead rules that we can definitely break out from. + /// we need to make the lookahead rules not chain eventually. + /// return result; + /// this is going to be the longest match again + + /// syn wee todo hard coded for line breaks stuff + /// needs to provide a tag in rules to ensure a stop. + + if (lookAheadHardBreak) { + fText->setIndex(result); + return result; + } + category = lastCategory; + fText->setIndex(result); + + goto continueOn; + } + + int32_t r = fText->getIndex(); + lookaheadResult = r; + lookaheadStatus = row->fLookAhead; + fLastRuleStatusIndex = row->fTagIdx; + goto continueOn; + } + + // not lookahead + if (row->fAccepting == 0) { + // No match, nothing of interest happening, common case. + goto continueOn; + } + + lookaheadStatus = 0; // clear out any pending look-ahead matches. + +continueOn: + if (state == STOP_STATE) { + break; + } + + // then advance one character backwards + hasPassedStartText = !fText->hasPrevious(); + c = fText->previous32(); + } + + // Note: the result postion isn't what is returned to the user by previous(), + // but where the implementation of previous() turns around and + // starts iterating forward again. + fText->setIndex(result); + + return result; +} + + void RuleBasedBreakIterator::reset() { @@ -895,26 +1160,70 @@ RuleBasedBreakIterator::reset() // status while doing the next(). // //------------------------------------------------------------------------------- -int32_t RuleBasedBreakIterator::getRuleStatus() const { - RuleBasedBreakIterator *nonConstThis = (RuleBasedBreakIterator *)this; - if (fLastBreakTagValid == FALSE) { +void RuleBasedBreakIterator::makeRuleStatusValid() { + if (fLastStatusIndexValid == FALSE) { // No cached status is available. if (fText == NULL || current() == fText->startIndex()) { // At start of text, or there is no text. Status is always zero. - nonConstThis->fLastBreakTag = 0; - nonConstThis->fLastBreakTagValid = TRUE; + fLastRuleStatusIndex = 0; + fLastStatusIndexValid = TRUE; } else { // Not at start of text. Find status the tedious way. int32_t pa = current(); - nonConstThis->previous(); - int32_t pb = nonConstThis->next(); - U_ASSERT(pa == pb); + previous(); + int32_t pb = next(); + if (pa != pb) { + // note: the if (pa != pb) test is here only to eliminate warnings for + // unused local variables on gcc. Logically, it isn't needed. + U_ASSERT(pa == pb); + } } } - return nonConstThis->fLastBreakTag; + U_ASSERT(fLastStatusIndexValid == TRUE); + U_ASSERT(fLastRuleStatusIndex >= 0 && fLastRuleStatusIndex < fData->fStatusMaxIdx); } +int32_t RuleBasedBreakIterator::getRuleStatus() const { + RuleBasedBreakIterator *nonConstThis = (RuleBasedBreakIterator *)this; + nonConstThis->makeRuleStatusValid(); + + // fLastRuleStatusIndex indexes to the start of the appropriate status record + // (the number of status values.) + // This function returns the last (largest) of the array of status values. + int32_t idx = fLastRuleStatusIndex + fData->fRuleStatusTable[fLastRuleStatusIndex]; + int32_t tagVal = fData->fRuleStatusTable[idx]; + + return tagVal; +} + + + + +int32_t RuleBasedBreakIterator::getRuleStatusVec( + int32_t *fillInVec, int32_t capacity, UErrorCode &status) +{ + if (U_FAILURE(status)) { + return 0; + } + + RuleBasedBreakIterator *nonConstThis = (RuleBasedBreakIterator *)this; + nonConstThis->makeRuleStatusValid(); + int32_t numVals = fData->fRuleStatusTable[fLastRuleStatusIndex]; + int32_t numValsToCopy = numVals; + if (numVals > capacity) { + status = U_BUFFER_OVERFLOW_ERROR; + numValsToCopy = capacity; + } + int i; + for (i=0; ifRuleStatusTable[fLastRuleStatusIndex + i + 1]; + } + return numVals; +} + + + //------------------------------------------------------------------------------- // // getBinaryRules Access to the compiled form of the rules, diff --git a/icuSources/common/rbbicst.pl b/icuSources/common/rbbicst.pl index e31b35ef..704c52f0 100644 --- a/icuSources/common/rbbicst.pl +++ b/icuSources/common/rbbicst.pl @@ -1,5 +1,5 @@ #************************************************************************** -# Copyright (C) 2002-2003 International Business Machines Corporation * +# Copyright (C) 2002-2004 International Business Machines Corporation * # and others. All rights reserved. * #************************************************************************** # @@ -197,18 +197,15 @@ for ($state=1; $state<$num_states; $state++) { die if ($errors>0); +my ($sec, $min, $hour, , $day, $mon, $year, $wday, $yday, $isdst) = localtime; +$year += 1900; + if ($javaOutput) { print "/*\n"; print " *******************************************************************************\n"; - print " * Copyright (C) 2003,\n"; + print " * Copyright (C) 2003-$year,\n"; print " * International Business Machines Corporation and others. All Rights Reserved.\n"; print " *******************************************************************************\n"; - print " *\n"; - print " * \$Source: /cvs/root/ICU/icuSources/common/rbbicst.pl,v $\n"; - print " * \$Date: 2003/07/03 18:13:31 $\n"; - print " * \$Revision: 1.1.1.2 $\n"; - print " *\n"; - print " *******************************************************************************\n"; print " */\n"; print " \n"; print "package com.ibm.icu.text;\n"; @@ -288,7 +285,7 @@ else print "// It is generated by the Perl script \"rbbicst.pl\" from\n"; print "// the rule parser state definitions file \"rbbirpt.txt\".\n"; print "//\n"; - print "// Copyright (C) 2002 International Business Machines Corporation \n"; + print "// Copyright (C) 2002-$year International Business Machines Corporation \n"; print "// and others. All rights reserved. \n"; print "//\n"; print "//---------------------------------------------------------------------------------\n"; @@ -395,6 +392,7 @@ else # # This array is used for producing debugging output from the rule parser. # + print "#ifdef RBBI_DEBUG\n"; print "static const char * const RBBIRuleStateNames[] = {"; for ($state=0; $state<$num_states; $state++) { if ($stateNames[$state] ne "") { @@ -403,7 +401,8 @@ else print " 0,\n"; } } - print " 0};\n\n"; + print " 0};\n"; + print "#endif\n\n"; print "U_NAMESPACE_END\n"; print "#endif\n"; diff --git a/icuSources/common/rbbidata.cpp b/icuSources/common/rbbidata.cpp index 1a78537c..aa33c610 100644 --- a/icuSources/common/rbbidata.cpp +++ b/icuSources/common/rbbidata.cpp @@ -1,6 +1,6 @@ /* *************************************************************************** -* Copyright (C) 1999-2003 International Business Machines Corporation * +* Copyright (C) 1999-2004 International Business Machines Corporation * * and others. All rights reserved. * *************************************************************************** */ @@ -51,7 +51,9 @@ RBBIDataWrapper::RBBIDataWrapper(const RBBIDataHeader *data, UErrorCode &status) RBBIDataWrapper::RBBIDataWrapper(UDataMemory* udm, UErrorCode &status) { const RBBIDataHeader *d = (const RBBIDataHeader *) - ((char *)&(udm->pHeader->info) + udm->pHeader->info.size); + // ((char *)&(udm->pHeader->info) + udm->pHeader->info.size); + // taking into consideration the padding added in by udata_write + ((char *)(udm->pHeader) + udm->pHeader->dataHeader.headerSize); init(d, status); fUDataMem = udm; } @@ -73,11 +75,21 @@ void RBBIDataWrapper::init(const RBBIDataHeader *data, UErrorCode &status) { } fUDataMem = NULL; - fForwardTable = (RBBIStateTable *)((char *)data + fHeader->fFTable); fReverseTable = NULL; + fSafeFwdTable = NULL; + fSafeRevTable = NULL; + if (data->fFTableLen != 0) { + fForwardTable = (RBBIStateTable *)((char *)data + fHeader->fFTable); + } if (data->fRTableLen != 0) { fReverseTable = (RBBIStateTable *)((char *)data + fHeader->fRTable); } + if (data->fSFTableLen != 0) { + fSafeFwdTable = (RBBIStateTable *)((char *)data + fHeader->fSFTable); + } + if (data->fSRTableLen != 0) { + fSafeRevTable = (RBBIStateTable *)((char *)data + fHeader->fSRTable); + } utrie_unserialize(&fTrie, @@ -92,6 +104,10 @@ void RBBIDataWrapper::init(const RBBIDataHeader *data, UErrorCode &status) { fRuleSource = (UChar *)((char *)data + fHeader->fRuleSource); fRuleString.setTo(TRUE, fRuleSource, -1); + U_ASSERT(data->fRuleSourceLen > 0); + + fRuleStatusTable = (int32_t *)((char *)data + fHeader->fStatusTable); + fStatusMaxIdx = data->fStatusTableLen / sizeof(int32_t); fRefCount = 1; @@ -104,7 +120,7 @@ void RBBIDataWrapper::init(const RBBIDataHeader *data, UErrorCode &status) { //----------------------------------------------------------------------------- // -// Destructor. Don't call this - use removeReferenc() instead. +// Destructor. Don't call this - use removeReference() instead. // //----------------------------------------------------------------------------- RBBIDataWrapper::~RBBIDataWrapper() { @@ -173,7 +189,7 @@ RBBIDataWrapper *RBBIDataWrapper::addReference() { // getRuleSourceString // //----------------------------------------------------------------------------- -const UnicodeString &RBBIDataWrapper::getRuleSourceString() { +const UnicodeString &RBBIDataWrapper::getRuleSourceString() const { return fRuleString; } @@ -183,45 +199,224 @@ const UnicodeString &RBBIDataWrapper::getRuleSourceString() { // print - debugging function to dump the runtime data tables. // //----------------------------------------------------------------------------- -void RBBIDataWrapper::printData() { #ifdef RBBI_DEBUG - uint32_t c, s; +void RBBIDataWrapper::printTable(const char *heading, const RBBIStateTable *table) { + uint32_t c; + uint32_t s; - RBBIDebugPrintf("RBBI Data at %p\n", (void *)fHeader); - RBBIDebugPrintf(" Version = %d\n", fHeader->fVersion); - RBBIDebugPrintf(" total length of data = %d\n", fHeader->fLength); - RBBIDebugPrintf(" number of character categories = %d\n\n", fHeader->fCatCount); + RBBIDebugPrintf(" %s\n", heading); - RBBIDebugPrintf(" Forward State Transition Table\n"); - RBBIDebugPrintf("State | Acc LA Tag"); + RBBIDebugPrintf("State | Acc LA TagIx"); for (c=0; cfCatCount; c++) {RBBIDebugPrintf("%3d ", c);} - RBBIDebugPrintf("\n------|---------------"); for (c=0;cfCatCount; c++) {RBBIDebugPrintf("----");} + RBBIDebugPrintf("\n------|---------------"); for (c=0;cfCatCount; c++) { + RBBIDebugPrintf("----"); + } RBBIDebugPrintf("\n"); - for (s=0; sfNumStates; s++) { + if (table == NULL) { + RBBIDebugPrintf(" N U L L T A B L E\n\n"); + return; + } + for (s=0; sfNumStates; s++) { RBBIStateTableRow *row = (RBBIStateTableRow *) - (fForwardTable->fTableData + (fForwardTable->fRowLen * s)); - RBBIDebugPrintf("%4d | %3d %3d %3d ", s, row->fAccepting, row->fLookAhead, row->fTag); + (table->fTableData + (table->fRowLen * s)); + RBBIDebugPrintf("%4d | %3d %3d %3d ", s, row->fAccepting, row->fLookAhead, row->fTagIdx); for (c=0; cfCatCount; c++) { RBBIDebugPrintf("%3d ", row->fNextState[c]); } RBBIDebugPrintf("\n"); } + RBBIDebugPrintf("\n"); +} +#endif + + +#ifdef RBBI_DEBUG +void RBBIDataWrapper::printData() { + RBBIDebugPrintf("RBBI Data at %p\n", (void *)fHeader); + RBBIDebugPrintf(" Version = %d\n", fHeader->fVersion); + RBBIDebugPrintf(" total length of data = %d\n", fHeader->fLength); + RBBIDebugPrintf(" number of character categories = %d\n\n", fHeader->fCatCount); + + printTable("Forward State Transition Table", fForwardTable); + printTable("Reverse State Transition Table", fReverseTable); + printTable("Safe Forward State Transition Table", fSafeFwdTable); + printTable("Safe Reverse State Transition Table", fSafeRevTable); RBBIDebugPrintf("\nOrignal Rules source:\n"); - c = 0; - for (;;) { - if (fRuleSource[c] == 0) - break; + for (int32_t c=0; fRuleSource[c] != 0; c++) { RBBIDebugPrintf("%c", fRuleSource[c]); - c++; } RBBIDebugPrintf("\n\n"); -#endif } - +#endif U_NAMESPACE_END +//----------------------------------------------------------------------------- +// +// ubrk_swap - byte swap and char encoding swap of RBBI data +// +//----------------------------------------------------------------------------- + +U_CAPI int32_t U_EXPORT2 +ubrk_swap(const UDataSwapper *ds, const void *inData, int32_t length, void *outData, + UErrorCode *status) { + + if (status == NULL || U_FAILURE(*status)) { + return 0; + } + + // + // Check that the data header is for for break data. + // (Header contents are defined in genbrk.cpp) + // + const UDataInfo *pInfo = (const UDataInfo *)((const char *)inData+4); + if(!( pInfo->dataFormat[0]==0x42 && /* dataFormat="Brk " */ + pInfo->dataFormat[1]==0x72 && + pInfo->dataFormat[2]==0x6b && + pInfo->dataFormat[3]==0x20 && + pInfo->formatVersion[0]==3 )) { + udata_printError(ds, "ubrk_swap(): data format %02x.%02x.%02x.%02x (format version %02x) is not recognized\n", + pInfo->dataFormat[0], pInfo->dataFormat[1], + pInfo->dataFormat[2], pInfo->dataFormat[3], + pInfo->formatVersion[0]); + *status=U_UNSUPPORTED_ERROR; + return 0; + } + + // + // Swap the data header. (This is the generic ICU Data Header, not the RBBI Specific + // RBBIDataHeader). This swap also conveniently gets us + // the size of the ICU d.h., which lets us locate the start + // of the RBBI specific data. + // + int32_t headerSize=udata_swapDataHeader(ds, inData, length, outData, status); + + + // + // Get the RRBI Data Header, and check that it appears to be OK. + // + const uint8_t *inBytes =(const uint8_t *)inData+headerSize; + RBBIDataHeader *rbbiDH = (RBBIDataHeader *)inBytes; + if (ds->readUInt32(rbbiDH->fMagic) != 0xb1a0 || + ds->readUInt32(rbbiDH->fVersion) != 1 || + ds->readUInt32(rbbiDH->fLength) < sizeof(RBBIDataHeader)) + { + udata_printError(ds, "ubrk_swap(): RBBI Data header is invalid.\n"); + *status=U_UNSUPPORTED_ERROR; + return 0; + } + + // + // Prefight operation? Just return the size + // + int32_t totalSize = headerSize + ds->readUInt32(rbbiDH->fLength); + if (length < 0) { + return totalSize; + } + + // + // Check that length passed in is consistent with length from RBBI data header. + // + if (length > 0) { + length -= headerSize; + if ((uint32_t)length < ds->readUInt32(rbbiDH->fLength)) { + udata_printError(ds, "ubrk_swap(): too few bytes (%d after ICU Data header) for break data.\n", + length); + *status=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + } + + + // + // Swap the Data. Do the data itself first, then the RBBI Data Header, because + // we need to reference the header to locate the data, and an + // inplace swap of the header leaves it unusable. + // + uint8_t *outBytes = (uint8_t *)outData + headerSize; + int32_t tableStartOffset; + int32_t tableLength; + + // + // If not swapping in place, zero out the output buffer before starting. + // Individual tables and other data items within are aligned to 8 byte boundaries + // when originally created. Any unused space between items needs to be zero. + // + if (inBytes != outBytes) { + uprv_memset(outBytes, 0, length); + } + + // + // Each state table begins with several 32 bit fields. Calculate the size + // in bytes of these. + // + RBBIStateTable *stp = NULL; + int32_t topSize = (char *)stp->fTableData - (char *)stp; + + // Forward state table. + tableStartOffset = ds->readUInt32(rbbiDH->fFTable); + tableLength = ds->readUInt32(rbbiDH->fFTableLen); + + if (tableLength > 0) { + ds->swapArray32(ds, inBytes+tableStartOffset, topSize, + outBytes+tableStartOffset, status); + ds->swapArray16(ds, inBytes+tableStartOffset+topSize, tableLength-topSize, + outBytes+tableStartOffset+topSize, status); + } + + // Reverse state table. Same layout as forward table, above. + tableStartOffset = ds->readUInt32(rbbiDH->fRTable); + tableLength = ds->readUInt32(rbbiDH->fRTableLen); + + if (tableLength > 0) { + ds->swapArray32(ds, inBytes+tableStartOffset, topSize, + outBytes+tableStartOffset, status); + ds->swapArray16(ds, inBytes+tableStartOffset+topSize, tableLength-topSize, + outBytes+tableStartOffset+topSize, status); + } + + // Safe Forward state table. Same layout as forward table, above. + tableStartOffset = ds->readUInt32(rbbiDH->fSFTable); + tableLength = ds->readUInt32(rbbiDH->fSFTableLen); + + if (tableLength > 0) { + ds->swapArray32(ds, inBytes+tableStartOffset, topSize, + outBytes+tableStartOffset, status); + ds->swapArray16(ds, inBytes+tableStartOffset+topSize, tableLength-topSize, + outBytes+tableStartOffset+topSize, status); + } + + // Safe Reverse state table. Same layout as forward table, above. + tableStartOffset = ds->readUInt32(rbbiDH->fSRTable); + tableLength = ds->readUInt32(rbbiDH->fSRTableLen); + + if (tableLength > 0) { + ds->swapArray32(ds, inBytes+tableStartOffset, topSize, + outBytes+tableStartOffset, status); + ds->swapArray16(ds, inBytes+tableStartOffset+topSize, tableLength-topSize, + outBytes+tableStartOffset+topSize, status); + } + + // Trie table for character categories + utrie_swap(ds, inBytes+ds->readUInt32(rbbiDH->fTrie), ds->readUInt32(rbbiDH->fTrieLen), + outBytes+ds->readUInt32(rbbiDH->fTrie), status); + + // Source Rules Text. It's UChar data + ds->swapArray16(ds, inBytes+ds->readUInt32(rbbiDH->fRuleSource), ds->readUInt32(rbbiDH->fRuleSourceLen), + outBytes+ds->readUInt32(rbbiDH->fRuleSource), status); + + // Table of rule status values. It's all int_32 values + ds->swapArray32(ds, inBytes+ds->readUInt32(rbbiDH->fStatusTable), ds->readUInt32(rbbiDH->fStatusTableLen), + outBytes+ds->readUInt32(rbbiDH->fStatusTable), status); + + // And, last, the header. All 32 bit values. + ds->swapArray32(ds, inBytes, sizeof(RBBIDataHeader), outBytes, status); + + return totalSize; +} + + #endif /* #if !UCONFIG_NO_BREAK_ITERATION */ diff --git a/icuSources/common/rbbidata.h b/icuSources/common/rbbidata.h index c7ee0096..fda2a79d 100644 --- a/icuSources/common/rbbidata.h +++ b/icuSources/common/rbbidata.h @@ -1,102 +1,138 @@ -// file: rbbidata.h -// -//********************************************************************** -// Copyright (C) 1999 IBM Corp. All rights reserved. -//********************************************************************** -// -// RBBI data formats Includes -// -// Structs that describes the format of the Binary RBBI data, -// as it is stored in ICU's data file. -// -// RBBIDataWrapper - Instances of this class sit between the -// raw data structs and the RulesBasedBreakIterator objects -// that are created by applications. The wrapper class -// provides reference counting for the underlying data, -// and direct pointers to data that would not otherwise -// be accessible without ugly pointer arithmetic. The -// wrapper does not attempt to provide any higher level -// abstractions for the data itself. -// -// There will be only one instance of RBBIDataWrapper for any -// set of RBBI run time data being shared by instances -// (clones) of RulesBasedBreakIterator. -// +/* +******************************************************************************* +* +* Copyright (C) 1999-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: rbbidata.h +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* RBBI data formats Includes +* +* Structs that describes the format of the Binary RBBI data, +* as it is stored in ICU's data file. +* +* RBBIDataWrapper - Instances of this class sit between the +* raw data structs and the RulesBasedBreakIterator objects +* that are created by applications. The wrapper class +* provides reference counting for the underlying data, +* and direct pointers to data that would not otherwise +* be accessible without ugly pointer arithmetic. The +* wrapper does not attempt to provide any higher level +* abstractions for the data itself. +* +* There will be only one instance of RBBIDataWrapper for any +* set of RBBI run time data being shared by instances +* (clones) of RulesBasedBreakIterator. +*/ #ifndef __RBBIDATA_H__ #define __RBBIDATA_H__ #include "unicode/utypes.h" +#include "unicode/udata.h" +#include "udataswp.h" + +/** + * Swap RBBI data. See udataswp.h. + * @internal + */ +U_CAPI int32_t U_EXPORT2 +ubrk_swap(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode); + +#ifdef XP_CPLUSPLUS + #include "unicode/uobject.h" #include "unicode/unistr.h" -#include "unicode/udata.h" #include "utrie.h" - U_NAMESPACE_BEGIN -// -// The following structs map exactly onto the raw data from ICU common data file. -// +/* + * The following structs map exactly onto the raw data from ICU common data file. + */ struct RBBIDataHeader { - uint32_t fMagic; // == 0xbla0 - uint32_t fVersion; // == 1 - uint32_t fLength; // Total length in bytes of this RBBI Data, - // including all sections, not just the header. - uint32_t fCatCount; // Number of character categories. - - // - // Offsets and sizes of each of the subsections within the RBBI data. - // All offsets are bytes from the start of the RBBIDataHeader. - // All sizes are in bytes. - // - uint32_t fFTable; // forward state transition table. + uint32_t fMagic; /* == 0xbla0 */ + uint32_t fVersion; /* == 1 */ + uint32_t fLength; /* Total length in bytes of this RBBI Data, */ + /* including all sections, not just the header. */ + uint32_t fCatCount; /* Number of character categories. */ + + /* */ + /* Offsets and sizes of each of the subsections within the RBBI data. */ + /* All offsets are bytes from the start of the RBBIDataHeader. */ + /* All sizes are in bytes. */ + /* */ + uint32_t fFTable; /* forward state transition table. */ uint32_t fFTableLen; - uint32_t fRTable; // Offset to the reverse state transition table. + uint32_t fRTable; /* Offset to the reverse state transition table. */ uint32_t fRTableLen; - uint32_t fTrie; // Offset to Trie data for character categories + uint32_t fSFTable; /* safe point forward transition table */ + uint32_t fSFTableLen; + uint32_t fSRTable; /* safe point reverse transition table */ + uint32_t fSRTableLen; + uint32_t fTrie; /* Offset to Trie data for character categories */ uint32_t fTrieLen; - uint32_t fRuleSource; // Offset to the source for for the break - uint32_t fRuleSourceLen; // rules. Stored UChar *. + uint32_t fRuleSource; /* Offset to the source for for the break */ + uint32_t fRuleSourceLen; /* rules. Stored UChar *. */ + uint32_t fStatusTable; /* Offset to the table of rule status values */ + uint32_t fStatusTableLen; - uint32_t fReserved[8]; // Reserved for expansion + uint32_t fReserved[6]; /* Reserved for expansion */ }; struct RBBIStateTableRow { - int16_t fAccepting; // Non-zero if this row is for an accepting state. - // Value is the {nnn} value to return to calling - // application. - int16_t fLookAhead; // Non-zero if this row is for a state that - // corresponds to a '/' in the rule source. - // Value is the same as the fAccepting - // value for the rule (which will appear - // in a different state. - int16_t fTag; // Non-zero if this row covers a {tagged} position - // from a rule. value is the tag number. + int16_t fAccepting; /* Non-zero if this row is for an accepting state. */ + /* Value 0: not an accepting state. */ + /* -1: Unconditional Accepting state. */ + /* positive: Look-ahead match has completed. */ + /* Actual boundary position happened earlier */ + /* Value here == fLookAhead in earlier */ + /* state, at actual boundary pos. */ + int16_t fLookAhead; /* Non-zero if this row is for a state that */ + /* corresponds to a '/' in the rule source. */ + /* Value is the same as the fAccepting */ + /* value for the rule (which will appear */ + /* in a different state. */ + int16_t fTagIdx; /* Non-zero if this row covers a {tagged} position */ + /* from a rule. Value is the index in the */ + /* StatusTable of the set of matching */ + /* tags (rule status values) */ int16_t fReserved; - uint16_t fNextState[2]; // Next State, indexed by char category. - // Array Size is fNumCols from the - // state table header. - // CAUTION: see RBBITableBuilder::getTableSize() - // before changing anything here. + uint16_t fNextState[2]; /* Next State, indexed by char category. */ + /* Array Size is fNumCols from the */ + /* state table header. */ + /* CAUTION: see RBBITableBuilder::getTableSize() */ + /* before changing anything here. */ }; struct RBBIStateTable { - uint32_t fNumStates; // Number of states. - uint32_t fRowLen; // Length of a state table row, in bytes. - char fTableData[4]; // First RBBIStateTableRow begins here. - // (making it char[] simplifies ugly address - // arithmetic for indexing variable length rows.) + uint32_t fNumStates; /* Number of states. */ + uint32_t fRowLen; /* Length of a state table row, in bytes. */ + uint32_t fFlags; /* Option Flags for this state table */ + uint32_t fReserved; /* reserved */ + char fTableData[4]; /* First RBBIStateTableRow begins here. */ + /* (making it char[] simplifies ugly address */ + /* arithmetic for indexing variable length rows.) */ }; +typedef enum { + RBBI_LOOKAHEAD_HARD_BREAK = 1 +} RBBIStateTableFlags; + -// -// The reference counting wrapper class -// +/* */ +/* The reference counting wrapper class */ +/* */ class RBBIDataWrapper : public UMemory { public: RBBIDataWrapper(const RBBIDataHeader *data, UErrorCode &status); @@ -108,16 +144,28 @@ public: void removeReference(); UBool operator ==(const RBBIDataWrapper &other) const; int32_t hashCode(); - const UnicodeString &getRuleSourceString(); + const UnicodeString &getRuleSourceString() const; +#ifdef RBBI_DEBUG void printData(); + void printTable(const char *heading, const RBBIStateTable *table); +#else + #define printData() + #define printTable(heading, table) +#endif - // - // Pointers to items within the data - // + /* */ + /* Pointers to items within the data */ + /* */ const RBBIDataHeader *fHeader; const RBBIStateTable *fForwardTable; const RBBIStateTable *fReverseTable; + const RBBIStateTable *fSafeFwdTable; + const RBBIStateTable *fSafeRevTable; const UChar *fRuleSource; + const int32_t *fRuleStatusTable; + + /* number of int32_t values in the rule status table. Used to sanity check indexing */ + int32_t fStatusMaxIdx; UTrie fTrie; @@ -126,11 +174,14 @@ private: UDataMemory *fUDataMem; UnicodeString fRuleString; - RBBIDataWrapper(const RBBIDataWrapper &other); // forbid copying of this class - RBBIDataWrapper &operator=(const RBBIDataWrapper &other); // forbid copying of this class + RBBIDataWrapper(const RBBIDataWrapper &other); /* forbid copying of this class */ + RBBIDataWrapper &operator=(const RBBIDataWrapper &other); /* forbid copying of this class */ }; + + U_NAMESPACE_END -#endif +#endif /* C++ */ +#endif diff --git a/icuSources/common/rbbinode.cpp b/icuSources/common/rbbinode.cpp index f3a0a679..b873f218 100644 --- a/icuSources/common/rbbinode.cpp +++ b/icuSources/common/rbbinode.cpp @@ -54,7 +54,7 @@ RBBINode::RBBINode(NodeType t) : UMemory() { fNullable = FALSE; fLookAheadEnd = FALSE; fVal = 0; - fPrecedence = precZero; + fPrecedence = precZero; UErrorCode status = U_ZERO_ERROR; fFirstPosSet = new UVector(status); // TODO - get a real status from somewhere @@ -263,8 +263,8 @@ void RBBINode::findNodes(UVector *dest, RBBINode::NodeType kind, UErrorCode &s // print. Print out a single node, for debugging. // //------------------------------------------------------------------------- -void RBBINode::print() { #ifdef RBBI_DEBUG +void RBBINode::printNode() { static const char * const nodeTypeNames[] = { "setRef", "uset", @@ -284,21 +284,23 @@ void RBBINode::print() { "opLParen" }; - RBBIDebugPrintf("%10p %12s %10p %10p %10p %4d %6d %d ", - (void *)this, nodeTypeNames[fType], (void *)fParent, (void *)fLeftChild, (void *)fRightChild, - fSerialNum, fFirstPos, fVal); - if (fType == varRef) { - printUnicodeString(fText); + if (this==NULL) { + RBBIDebugPrintf("%10p", (void *)this); + } else { + RBBIDebugPrintf("%10p %12s %10p %10p %10p %4d %6d %d ", + (void *)this, nodeTypeNames[fType], (void *)fParent, (void *)fLeftChild, (void *)fRightChild, + fSerialNum, fFirstPos, fVal); + if (fType == varRef) { + RBBI_DEBUG_printUnicodeString(fText); + } } RBBIDebugPrintf("\n"); -#endif } +#endif #ifdef RBBI_DEBUG -void RBBINode::printUnicodeString(const UnicodeString &, int) {} -#else -void RBBINode::printUnicodeString(const UnicodeString &s, int minWidth) +U_CFUNC void RBBI_DEBUG_printUnicodeString(const UnicodeString &s, int minWidth) { int i; for (i=0; iprint(); - // Only dump the definition under a variable reference if asked to. - // Unconditinally dump children of all other node types. - if (fType != varRef || doVars) { - if (fLeftChild != NULL) { - fLeftChild->printTree(FALSE); - } - - if (fRightChild != NULL) { - fRightChild->printTree(FALSE); + this->printNode(); + if (this != NULL) { + // Only dump the definition under a variable reference if asked to. + // Unconditinally dump children of all other node types. + if (fType != varRef) { + if (fLeftChild != NULL) { + fLeftChild->printTree(FALSE); + } + + if (fRightChild != NULL) { + fRightChild->printTree(FALSE); + } } } } diff --git a/icuSources/common/rbbinode.h b/icuSources/common/rbbinode.h index 6d226f7d..68286792 100644 --- a/icuSources/common/rbbinode.h +++ b/icuSources/common/rbbinode.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 2001-2002, International Business Machines Corporation and + * Copyright (c) 2001-2003, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -93,9 +93,16 @@ class RBBINode : public UMemory { void flattenSets(); void findNodes(UVector *dest, RBBINode::NodeType kind, UErrorCode &status); - void print(); - void printTree(UBool withHeading=TRUE, UBool doVars=FALSE); - static void printUnicodeString(const UnicodeString &s, int minWidth=0); +#ifdef RBBI_DEBUG + void printNode(); + void printTree(UBool withHeading); +#else + // Do-nothing inline functions for non-debug builds. Can't make empty defines for member + // functions - they won't compile at the call sites. + int fakeField; + #define printNode() fakeField=0; + #define printTree(withHeading) fakeField=0; +#endif private: RBBINode &operator = (const RBBINode &other); // No defs. @@ -104,6 +111,12 @@ class RBBINode : public UMemory { int fSerialNum; // Debugging aids. static int gLastSerial; }; + +#ifdef RBBI_DEBUG +U_CFUNC void +RBBI_DEBUG_printUnicodeString(const UnicodeString &s, int minWidth=0); +#endif + U_NAMESPACE_END #endif diff --git a/icuSources/common/rbbirb.cpp b/icuSources/common/rbbirb.cpp index 409c5ab0..273ef9d1 100644 --- a/icuSources/common/rbbirb.cpp +++ b/icuSources/common/rbbirb.cpp @@ -1,7 +1,7 @@ // // file: rbbirb.cpp // -// Copyright (C) 2002-2003, International Business Machines Corporation and others. +// Copyright (C) 2002-2004, International Business Machines Corporation and others. // All Rights Reserved. // // This file contains the RBBIRuleBuilder class implementation. This is the main class for @@ -47,7 +47,7 @@ RBBIRuleBuilder::RBBIRuleBuilder(const UnicodeString &rules, UErrorCode &status) : fRules(rules) { - fStatus = &status; + fStatus = &status; // status is checked below fParseError = &parseErr; fDebugEnv = NULL; #ifdef RBBI_DEBUG @@ -57,12 +57,34 @@ RBBIRuleBuilder::RBBIRuleBuilder(const UnicodeString &rules, fForwardTree = NULL; fReverseTree = NULL; + fSafeFwdTree = NULL; + fSafeRevTree = NULL; + fDefaultTree = &fForwardTree; fForwardTables = NULL; fReverseTables = NULL; - fUSetNodes = new UVector(status); + fSafeFwdTables = NULL; + fSafeRevTables = NULL; + fRuleStatusVals = NULL; + fChainRules = FALSE; + fLBCMNoChain = FALSE; + fLookAheadHardBreak = FALSE; + fUSetNodes = NULL; + fRuleStatusVals = NULL; + fScanner = NULL; + fSetBuilder = NULL; + + if (U_FAILURE(status)) { + return; + } + + fUSetNodes = new UVector(status); // bcos status gets overwritten here + fRuleStatusVals = new UVector(status); fScanner = new RBBIRuleScanner(this); fSetBuilder = new RBBISetBuilder(this); - if(fSetBuilder == 0 || fScanner == 0 || fUSetNodes == 0) { + if (U_FAILURE(status)) { + return; + } + if(fSetBuilder == 0 || fScanner == 0 || fUSetNodes == 0 || fRuleStatusVals == 0) { status = U_MEMORY_ALLOCATION_ERROR; } } @@ -89,9 +111,15 @@ RBBIRuleBuilder::~RBBIRuleBuilder() { delete fSetBuilder; delete fForwardTables; delete fReverseTables; + delete fSafeFwdTables; + delete fSafeRevTables; + delete fForwardTree; delete fReverseTree; + delete fSafeFwdTree; + delete fSafeRevTree; delete fScanner; + delete fRuleStatusVals; } @@ -108,6 +136,8 @@ RBBIRuleBuilder::~RBBIRuleBuilder() { static int32_t align8(int32_t i) {return (i+7) & 0xfffffff8;} RBBIDataHeader *RBBIRuleBuilder::flattenData() { + int32_t i; + if (U_FAILURE(*fStatus)) { return NULL; } @@ -123,11 +153,16 @@ RBBIDataHeader *RBBIRuleBuilder::flattenData() { int32_t headerSize = align8(sizeof(RBBIDataHeader)); int32_t forwardTableSize = align8(fForwardTables->getTableSize()); int32_t reverseTableSize = align8(fReverseTables->getTableSize()); + int32_t safeFwdTableSize = align8(fSafeFwdTables->getTableSize()); + int32_t safeRevTableSize = align8(fSafeRevTables->getTableSize()); int32_t trieSize = align8(fSetBuilder->getTrieSize()); + int32_t statusTableSize = align8(fRuleStatusVals->size() * sizeof(int32_t)); int32_t rulesSize = align8((strippedRules.length()+1) * sizeof(UChar)); int32_t totalSize = headerSize + forwardTableSize + reverseTableSize - + trieSize + rulesSize; + + safeFwdTableSize + safeRevTableSize + + statusTableSize + trieSize + rulesSize; + RBBIDataHeader *data = (RBBIDataHeader *)uprv_malloc(totalSize); if (data == NULL) { *fStatus = U_MEMORY_ALLOCATION_ERROR; @@ -143,18 +178,33 @@ RBBIDataHeader *RBBIRuleBuilder::flattenData() { data->fFTable = headerSize; data->fFTableLen = forwardTableSize; - data->fRTable = data->fFTable + forwardTableSize; + data->fRTable = data->fFTable + forwardTableSize; data->fRTableLen = reverseTableSize; - data->fTrie = data->fRTable + reverseTableSize; + data->fSFTable = data->fRTable + reverseTableSize; + data->fSFTableLen = safeFwdTableSize; + data->fSRTable = data->fSFTable + safeFwdTableSize; + data->fSRTableLen = safeRevTableSize; + + data->fTrie = data->fSRTable + safeRevTableSize; data->fTrieLen = fSetBuilder->getTrieSize(); - data->fRuleSource = data->fTrie + trieSize; + data->fStatusTable = data->fTrie + trieSize; + data->fStatusTableLen= statusTableSize; + data->fRuleSource = data->fStatusTable + statusTableSize; data->fRuleSourceLen = strippedRules.length() * sizeof(UChar); uprv_memset(data->fReserved, 0, sizeof(data->fReserved)); fForwardTables->exportTable((uint8_t *)data + data->fFTable); fReverseTables->exportTable((uint8_t *)data + data->fRTable); + fSafeFwdTables->exportTable((uint8_t *)data + data->fSFTable); + fSafeRevTables->exportTable((uint8_t *)data + data->fSRTable); fSetBuilder->serializeTrie ((uint8_t *)data + data->fTrie); + + int32_t *ruleStatusTable = (int32_t *)((uint8_t *)data + data->fStatusTable); + for (i=0; isize(); i++) { + ruleStatusTable[i] = fRuleStatusVals->elementAti(i); + } + strippedRules.extract((UChar *)((uint8_t *)data+data->fRuleSource), rulesSize/2+1, *fStatus); return data; @@ -176,9 +226,7 @@ RBBIRuleBuilder::createRuleBasedBreakIterator( const UnicodeString &rules, UParseError &parseError, UErrorCode &status) { - if (U_FAILURE(status)) { - return NULL; - } + // status checked below // // Read the input rules, generate a parse tree, symbol table, @@ -186,7 +234,7 @@ RBBIRuleBuilder::createRuleBasedBreakIterator( const UnicodeString &rules, // RBBIRuleBuilder builder(rules, parseError, status); builder.fScanner->parse(); - if (U_FAILURE(status)) { + if (U_FAILURE(status)) { // status checked here bcos build below doesn't return NULL; } @@ -204,24 +252,35 @@ RBBIRuleBuilder::createRuleBasedBreakIterator( const UnicodeString &rules, // builder.fForwardTables = new RBBITableBuilder(&builder, &builder.fForwardTree); builder.fReverseTables = new RBBITableBuilder(&builder, &builder.fReverseTree); - if(builder.fForwardTables == NULL || builder.fReverseTables == NULL) { + builder.fSafeFwdTables = new RBBITableBuilder(&builder, &builder.fSafeFwdTree); + builder.fSafeRevTables = new RBBITableBuilder(&builder, &builder.fSafeRevTree); + if (U_SUCCESS(status) + && (builder.fForwardTables == NULL || builder.fReverseTables == NULL || + builder.fSafeFwdTables == NULL || builder.fSafeRevTables == NULL)) + { status = U_MEMORY_ALLOCATION_ERROR; return NULL; } builder.fForwardTables->build(); builder.fReverseTables->build(); + builder.fSafeFwdTables->build(); + builder.fSafeRevTables->build(); if (U_FAILURE(status)) { return NULL; } +#ifdef RBBI_DEBUG + if (builder.fDebugEnv && uprv_strstr(builder.fDebugEnv, "states")) { + builder.fForwardTables->printRuleStatusTable(); + } +#endif // // Package up the compiled data into a memory image // in the run-time format. // - RBBIDataHeader *data; - data = builder.flattenData(); + RBBIDataHeader *data = builder.flattenData(); // returns NULL if error // @@ -233,16 +292,14 @@ RBBIRuleBuilder::createRuleBasedBreakIterator( const UnicodeString &rules, // Create a break iterator from the compiled rules. // (Identical to creation from stored pre-compiled rules) // + // status is checked after init in construction. RuleBasedBreakIterator *This = new RuleBasedBreakIterator(data, status); - /* test for NULL */ - if(This == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - return NULL; - } - if (U_FAILURE(status)) { delete This; This = NULL; + } + else if(This == NULL) { // test for NULL + status = U_MEMORY_ALLOCATION_ERROR; } return This; } diff --git a/icuSources/common/rbbirb.h b/icuSources/common/rbbirb.h index 7b38187f..0e0aba0a 100644 --- a/icuSources/common/rbbirb.h +++ b/icuSources/common/rbbirb.h @@ -1,10 +1,11 @@ // // rbbirb.h // -// Copyright (C) 2002, International Business Machines Corporation and others. +// Copyright (C) 2002-2004, International Business Machines Corporation and others. // All Rights Reserved. // -// This file contains declarations for several from the Rule Based Break Iterator rule builder. +// This file contains declarations for several classes from the +// Rule Based Break Iterator rule builder. // @@ -18,7 +19,7 @@ #include "unicode/parseerr.h" #include "uhash.h" #include "uvector.h" -#include "symtable.h" // For UnicodeSet parsing, is the interface that +#include "unicode/symtable.h"// For UnicodeSet parsing, is the interface that // looks up references to $variables within a set. @@ -78,7 +79,14 @@ public: virtual RBBINode *lookupNode(const UnicodeString &key) const; virtual void addEntry (const UnicodeString &key, RBBINode *val, UErrorCode &err); - virtual void print() const; +#ifdef RBBI_DEBUG + virtual void rbbiSymtablePrint() const; +#else + // A do-nothing inline function for non-debug builds. Member funcs can't be empty + // or the call sites won't compile. + int fFakeField; + #define rbbiSymtablePrint() fFakeField=0; +#endif private: RBBISymbolTable(const RBBISymbolTable &other); // forbid copying of this class @@ -121,12 +129,32 @@ public: RBBIRuleScanner *fScanner; // The scanner. RBBINode *fForwardTree; // The parse trees, generated by the scanner, RBBINode *fReverseTree; // then manipulated by subsequent steps. + RBBINode *fSafeFwdTree; + RBBINode *fSafeRevTree; + + RBBINode **fDefaultTree; // For rules not qualified with a ! + // the tree to which they belong to. + + UBool fChainRules; // True for chained Unicode TR style rules. + // False for traditional regexp rules. + + UBool fLBCMNoChain; // True: suppress chaining of rules on + // chars with LineBreak property == CM. + + UBool fLookAheadHardBreak; // True: Look ahead matches cause an + // immediate break, no continuing for the + // longest match. RBBISetBuilder *fSetBuilder; // Set and Character Category builder. UVector *fUSetNodes; // Vector of all uset nodes. RBBITableBuilder *fForwardTables; // State transition tables RBBITableBuilder *fReverseTables; + RBBITableBuilder *fSafeFwdTables; + RBBITableBuilder *fSafeRevTables; + + UVector *fRuleStatusVals; // The values that can be returned + // from getRuleStatus(). RBBIDataHeader *flattenData(); // Create the flattened (runtime format) // data tables.. @@ -170,8 +198,10 @@ struct RBBISetTableEl { #ifdef RBBI_DEBUG #include #define RBBIDebugPrintf printf +#define RBBIDebugPuts puts #else inline void RBBIDebugPrintf(...) {} +#define RBBIDebugPuts(arg) #endif U_NAMESPACE_END diff --git a/icuSources/common/rbbirpt.h b/icuSources/common/rbbirpt.h index 174ed3ef..3b6473d4 100644 --- a/icuSources/common/rbbirpt.h +++ b/icuSources/common/rbbirpt.h @@ -6,7 +6,7 @@ // It is generated by the Perl script "rbbicst.pl" from // the rule parser state definitions file "rbbirpt.txt". // -// Copyright (C) 2002 International Business Machines Corporation +// Copyright (C) 2002-2004 International Business Machines Corporation // and others. All rights reserved. // //--------------------------------------------------------------------------------- @@ -18,14 +18,15 @@ U_NAMESPACE_BEGIN // Character classes for RBBI rule scanning. // static const uint8_t kRuleSet_digit_char = 128; - static const uint8_t kRuleSet_rule_char = 129; - static const uint8_t kRuleSet_white_space = 130; - static const uint8_t kRuleSet_name_char = 131; - static const uint8_t kRuleSet_name_start_char = 132; + static const uint8_t kRuleSet_white_space = 129; + static const uint8_t kRuleSet_rule_char = 130; + static const uint8_t kRuleSet_name_start_char = 131; + static const uint8_t kRuleSet_name_char = 132; enum RBBI_RuleParseAction { doExprOrOperator, + doOptionEnd, doRuleErrorAssignExpr, doTagValue, doEndAssign, @@ -51,6 +52,7 @@ enum RBBI_RuleParseAction { doEndOfRule, doUnaryOpPlus, doExprStart, + doOptionStart, doExprCatOperator, doReverseDir, doCheckVarDef, @@ -73,93 +75,103 @@ struct RBBIRuleTableEl { static const struct RBBIRuleTableEl gRuleParseStateTable[] = { {doNOP, 0, 0, 0, TRUE} - , {doExprStart, 254, 12, 8, FALSE} // 1 start - , {doNOP, 130, 1,0, TRUE} // 2 - , {doExprStart, 36 /* $ */, 71, 81, FALSE} // 3 - , {doReverseDir, 33 /* ! */, 11,0, TRUE} // 4 + , {doExprStart, 254, 21, 8, FALSE} // 1 start + , {doNOP, 129, 1,0, TRUE} // 2 + , {doExprStart, 36 /* $ */, 80, 90, FALSE} // 3 + , {doNOP, 33 /* ! */, 11,0, TRUE} // 4 , {doNOP, 59 /* ; */, 1,0, TRUE} // 5 , {doNOP, 252, 0,0, FALSE} // 6 - , {doExprStart, 255, 12, 8, FALSE} // 7 + , {doExprStart, 255, 21, 8, FALSE} // 7 , {doEndOfRule, 59 /* ; */, 1,0, TRUE} // 8 break-rule-end - , {doNOP, 130, 8,0, TRUE} // 9 - , {doRuleError, 255, 86,0, FALSE} // 10 - , {doExprStart, 255, 12, 8, FALSE} // 11 reverse-rule - , {doRuleChar, 254, 21,0, TRUE} // 12 term - , {doNOP, 130, 12,0, TRUE} // 13 - , {doRuleChar, 129, 21,0, TRUE} // 14 - , {doNOP, 91 /* [ */, 77, 21, FALSE} // 15 - , {doLParen, 40 /* ( */, 12, 21, TRUE} // 16 - , {doNOP, 36 /* $ */, 71, 20, FALSE} // 17 - , {doDotAny, 46 /* . */, 21,0, TRUE} // 18 - , {doRuleError, 255, 86,0, FALSE} // 19 - , {doCheckVarDef, 255, 21,0, FALSE} // 20 term-var-ref - , {doNOP, 130, 21,0, TRUE} // 21 expr-mod - , {doUnaryOpStar, 42 /* * */, 26,0, TRUE} // 22 - , {doUnaryOpPlus, 43 /* + */, 26,0, TRUE} // 23 - , {doUnaryOpQuestion, 63 /* ? */, 26,0, TRUE} // 24 - , {doNOP, 255, 26,0, FALSE} // 25 - , {doExprCatOperator, 254, 12,0, FALSE} // 26 expr-cont - , {doNOP, 130, 26,0, TRUE} // 27 - , {doExprCatOperator, 129, 12,0, FALSE} // 28 - , {doExprCatOperator, 91 /* [ */, 12,0, FALSE} // 29 - , {doExprCatOperator, 40 /* ( */, 12,0, FALSE} // 30 - , {doExprCatOperator, 36 /* $ */, 12,0, FALSE} // 31 - , {doExprCatOperator, 46 /* . */, 12,0, FALSE} // 32 - , {doExprCatOperator, 47 /* / */, 38,0, FALSE} // 33 - , {doExprCatOperator, 123 /* { */, 50,0, TRUE} // 34 - , {doExprOrOperator, 124 /* | */, 12,0, TRUE} // 35 - , {doExprRParen, 41 /* ) */, 255,0, TRUE} // 36 - , {doExprFinished, 255, 255,0, FALSE} // 37 - , {doSlash, 47 /* / */, 40,0, TRUE} // 38 look-ahead - , {doNOP, 255, 86,0, FALSE} // 39 - , {doExprCatOperator, 254, 12,0, FALSE} // 40 expr-cont-no-slash - , {doNOP, 130, 26,0, TRUE} // 41 - , {doExprCatOperator, 129, 12,0, FALSE} // 42 - , {doExprCatOperator, 91 /* [ */, 12,0, FALSE} // 43 - , {doExprCatOperator, 40 /* ( */, 12,0, FALSE} // 44 - , {doExprCatOperator, 36 /* $ */, 12,0, FALSE} // 45 - , {doExprCatOperator, 46 /* . */, 12,0, FALSE} // 46 - , {doExprOrOperator, 124 /* | */, 12,0, TRUE} // 47 - , {doExprRParen, 41 /* ) */, 255,0, TRUE} // 48 - , {doExprFinished, 255, 255,0, FALSE} // 49 - , {doNOP, 130, 50,0, TRUE} // 50 tag-open - , {doStartTagValue, 128, 53,0, FALSE} // 51 - , {doTagExpectedError, 255, 86,0, FALSE} // 52 - , {doNOP, 130, 57,0, TRUE} // 53 tag-value - , {doNOP, 125 /* } */, 57,0, FALSE} // 54 - , {doTagDigit, 128, 53,0, TRUE} // 55 - , {doTagExpectedError, 255, 86,0, FALSE} // 56 - , {doNOP, 130, 57,0, TRUE} // 57 tag-close - , {doTagValue, 125 /* } */, 60,0, TRUE} // 58 - , {doTagExpectedError, 255, 86,0, FALSE} // 59 - , {doExprCatOperator, 254, 12,0, FALSE} // 60 expr-cont-no-tag - , {doNOP, 130, 60,0, TRUE} // 61 - , {doExprCatOperator, 129, 12,0, FALSE} // 62 - , {doExprCatOperator, 91 /* [ */, 12,0, FALSE} // 63 - , {doExprCatOperator, 40 /* ( */, 12,0, FALSE} // 64 - , {doExprCatOperator, 36 /* $ */, 12,0, FALSE} // 65 - , {doExprCatOperator, 46 /* . */, 12,0, FALSE} // 66 - , {doExprCatOperator, 47 /* / */, 38,0, FALSE} // 67 - , {doExprOrOperator, 124 /* | */, 12,0, TRUE} // 68 - , {doExprRParen, 41 /* ) */, 255,0, TRUE} // 69 - , {doExprFinished, 255, 255,0, FALSE} // 70 - , {doStartVariableName, 36 /* $ */, 73,0, TRUE} // 71 scan-var-name - , {doNOP, 255, 86,0, FALSE} // 72 - , {doNOP, 132, 75,0, TRUE} // 73 scan-var-start - , {doVariableNameExpectedErr, 255, 86,0, FALSE} // 74 - , {doNOP, 131, 75,0, TRUE} // 75 scan-var-body - , {doEndVariableName, 255, 255,0, FALSE} // 76 - , {doScanUnicodeSet, 91 /* [ */, 255,0, TRUE} // 77 scan-unicode-set - , {doScanUnicodeSet, 112 /* p */, 255,0, TRUE} // 78 - , {doScanUnicodeSet, 80 /* P */, 255,0, TRUE} // 79 - , {doNOP, 255, 86,0, FALSE} // 80 - , {doNOP, 130, 81,0, TRUE} // 81 assign-or-rule - , {doStartAssign, 61 /* = */, 12, 84, TRUE} // 82 - , {doNOP, 255, 20, 8, FALSE} // 83 - , {doEndAssign, 59 /* ; */, 1,0, TRUE} // 84 assign-end - , {doRuleErrorAssignExpr, 255, 86,0, FALSE} // 85 - , {doExit, 255, 86,0, TRUE} // 86 errorDeath + , {doNOP, 129, 8,0, TRUE} // 9 + , {doRuleError, 255, 95,0, FALSE} // 10 + , {doNOP, 33 /* ! */, 13,0, TRUE} // 11 rev-option + , {doReverseDir, 255, 20, 8, FALSE} // 12 + , {doOptionStart, 131, 15,0, TRUE} // 13 option-scan1 + , {doRuleError, 255, 95,0, FALSE} // 14 + , {doNOP, 132, 15,0, TRUE} // 15 option-scan2 + , {doOptionEnd, 255, 17,0, FALSE} // 16 + , {doNOP, 59 /* ; */, 1,0, TRUE} // 17 option-scan3 + , {doNOP, 129, 17,0, TRUE} // 18 + , {doRuleError, 255, 95,0, FALSE} // 19 + , {doExprStart, 255, 21, 8, FALSE} // 20 reverse-rule + , {doRuleChar, 254, 30,0, TRUE} // 21 term + , {doNOP, 129, 21,0, TRUE} // 22 + , {doRuleChar, 130, 30,0, TRUE} // 23 + , {doNOP, 91 /* [ */, 86, 30, FALSE} // 24 + , {doLParen, 40 /* ( */, 21, 30, TRUE} // 25 + , {doNOP, 36 /* $ */, 80, 29, FALSE} // 26 + , {doDotAny, 46 /* . */, 30,0, TRUE} // 27 + , {doRuleError, 255, 95,0, FALSE} // 28 + , {doCheckVarDef, 255, 30,0, FALSE} // 29 term-var-ref + , {doNOP, 129, 30,0, TRUE} // 30 expr-mod + , {doUnaryOpStar, 42 /* * */, 35,0, TRUE} // 31 + , {doUnaryOpPlus, 43 /* + */, 35,0, TRUE} // 32 + , {doUnaryOpQuestion, 63 /* ? */, 35,0, TRUE} // 33 + , {doNOP, 255, 35,0, FALSE} // 34 + , {doExprCatOperator, 254, 21,0, FALSE} // 35 expr-cont + , {doNOP, 129, 35,0, TRUE} // 36 + , {doExprCatOperator, 130, 21,0, FALSE} // 37 + , {doExprCatOperator, 91 /* [ */, 21,0, FALSE} // 38 + , {doExprCatOperator, 40 /* ( */, 21,0, FALSE} // 39 + , {doExprCatOperator, 36 /* $ */, 21,0, FALSE} // 40 + , {doExprCatOperator, 46 /* . */, 21,0, FALSE} // 41 + , {doExprCatOperator, 47 /* / */, 47,0, FALSE} // 42 + , {doExprCatOperator, 123 /* { */, 59,0, TRUE} // 43 + , {doExprOrOperator, 124 /* | */, 21,0, TRUE} // 44 + , {doExprRParen, 41 /* ) */, 255,0, TRUE} // 45 + , {doExprFinished, 255, 255,0, FALSE} // 46 + , {doSlash, 47 /* / */, 49,0, TRUE} // 47 look-ahead + , {doNOP, 255, 95,0, FALSE} // 48 + , {doExprCatOperator, 254, 21,0, FALSE} // 49 expr-cont-no-slash + , {doNOP, 129, 35,0, TRUE} // 50 + , {doExprCatOperator, 130, 21,0, FALSE} // 51 + , {doExprCatOperator, 91 /* [ */, 21,0, FALSE} // 52 + , {doExprCatOperator, 40 /* ( */, 21,0, FALSE} // 53 + , {doExprCatOperator, 36 /* $ */, 21,0, FALSE} // 54 + , {doExprCatOperator, 46 /* . */, 21,0, FALSE} // 55 + , {doExprOrOperator, 124 /* | */, 21,0, TRUE} // 56 + , {doExprRParen, 41 /* ) */, 255,0, TRUE} // 57 + , {doExprFinished, 255, 255,0, FALSE} // 58 + , {doNOP, 129, 59,0, TRUE} // 59 tag-open + , {doStartTagValue, 128, 62,0, FALSE} // 60 + , {doTagExpectedError, 255, 95,0, FALSE} // 61 + , {doNOP, 129, 66,0, TRUE} // 62 tag-value + , {doNOP, 125 /* } */, 66,0, FALSE} // 63 + , {doTagDigit, 128, 62,0, TRUE} // 64 + , {doTagExpectedError, 255, 95,0, FALSE} // 65 + , {doNOP, 129, 66,0, TRUE} // 66 tag-close + , {doTagValue, 125 /* } */, 69,0, TRUE} // 67 + , {doTagExpectedError, 255, 95,0, FALSE} // 68 + , {doExprCatOperator, 254, 21,0, FALSE} // 69 expr-cont-no-tag + , {doNOP, 129, 69,0, TRUE} // 70 + , {doExprCatOperator, 130, 21,0, FALSE} // 71 + , {doExprCatOperator, 91 /* [ */, 21,0, FALSE} // 72 + , {doExprCatOperator, 40 /* ( */, 21,0, FALSE} // 73 + , {doExprCatOperator, 36 /* $ */, 21,0, FALSE} // 74 + , {doExprCatOperator, 46 /* . */, 21,0, FALSE} // 75 + , {doExprCatOperator, 47 /* / */, 47,0, FALSE} // 76 + , {doExprOrOperator, 124 /* | */, 21,0, TRUE} // 77 + , {doExprRParen, 41 /* ) */, 255,0, TRUE} // 78 + , {doExprFinished, 255, 255,0, FALSE} // 79 + , {doStartVariableName, 36 /* $ */, 82,0, TRUE} // 80 scan-var-name + , {doNOP, 255, 95,0, FALSE} // 81 + , {doNOP, 131, 84,0, TRUE} // 82 scan-var-start + , {doVariableNameExpectedErr, 255, 95,0, FALSE} // 83 + , {doNOP, 132, 84,0, TRUE} // 84 scan-var-body + , {doEndVariableName, 255, 255,0, FALSE} // 85 + , {doScanUnicodeSet, 91 /* [ */, 255,0, TRUE} // 86 scan-unicode-set + , {doScanUnicodeSet, 112 /* p */, 255,0, TRUE} // 87 + , {doScanUnicodeSet, 80 /* P */, 255,0, TRUE} // 88 + , {doNOP, 255, 95,0, FALSE} // 89 + , {doNOP, 129, 90,0, TRUE} // 90 assign-or-rule + , {doStartAssign, 61 /* = */, 21, 93, TRUE} // 91 + , {doNOP, 255, 29, 8, FALSE} // 92 + , {doEndAssign, 59 /* ; */, 1,0, TRUE} // 93 assign-end + , {doRuleErrorAssignExpr, 255, 95,0, FALSE} // 94 + , {doExit, 255, 95,0, TRUE} // 95 errorDeath }; +#ifdef RBBI_DEBUG static const char * const RBBIRuleStateNames[] = { 0, "start", 0, @@ -170,6 +182,15 @@ static const char * const RBBIRuleStateNames[] = { 0, 0, "break-rule-end", 0, + 0, + "rev-option", + 0, + "option-scan1", + 0, + "option-scan2", + 0, + "option-scan3", + 0, 0, "reverse-rule", "term", @@ -248,6 +269,7 @@ static const char * const RBBIRuleStateNames[] = { 0, 0, "errorDeath", 0}; +#endif U_NAMESPACE_END #endif diff --git a/icuSources/common/rbbirpt.txt b/icuSources/common/rbbirpt.txt index fa0dd359..8e932a60 100644 --- a/icuSources/common/rbbirpt.txt +++ b/icuSources/common/rbbirpt.txt @@ -1,7 +1,7 @@ #***************************************************************************** # -# Copyright (C) 2002, International Business Machines Corporation and others. +# Copyright (C) 2002-2003, International Business Machines Corporation and others. # All Rights Reserved. # #***************************************************************************** @@ -58,7 +58,7 @@ start: escaped term ^break-rule-end doExprStart white_space n start '$' scan-var-name ^assign-or-rule doExprStart - '!' n reverse-rule doReverseDir + '!' n rev-option ';' n start # ignore empty rules. eof exit default term ^break-rule-end doExprStart @@ -73,9 +73,27 @@ break-rule-end: # -# Reverse Rule We've just scanned a '!', indicating a reverse direction rule. -# A rule expression must follow. +# ! We've just scanned a '!', indicating either a !!key word flag or a +# !Reverse rule. # +rev-option: + '!' n option-scan1 + default reverse-rule ^break-rule-end doReverseDir + +option-scan1: + name_start_char n option-scan2 doOptionStart + default errorDeath doRuleError + +option-scan2: + name_char n option-scan2 + default option-scan3 doOptionEnd + +option-scan3: + ';' n start + white_space n option-scan3 + default errorDeath doRuleError + + reverse-rule: default term ^break-rule-end doExprStart diff --git a/icuSources/common/rbbiscan.cpp b/icuSources/common/rbbiscan.cpp index c5f15635..13c44c42 100644 --- a/icuSources/common/rbbiscan.cpp +++ b/icuSources/common/rbbiscan.cpp @@ -2,7 +2,7 @@ // // file: rbbiscan.cpp // -// Copyright (C) 2002-2003, International Business Machines Corporation and others. +// Copyright (C) 2002-2004, International Business Machines Corporation and others. // All Rights Reserved. // // This file contains the Rule Based Break Iterator Rule Builder functions for @@ -32,6 +32,7 @@ #include "rbbirb.h" #include "rbbinode.h" #include "rbbiscan.h" +#include "rbbitblb.h" #include "uassert.h" @@ -113,6 +114,8 @@ RBBIRuleScanner::RBBIRuleScanner(RBBIRuleBuilder *rb) fCharNum = 0; fQuoteMode = FALSE; + // Do not check status until after all critical fields are sufficiently initialized + // that the destructor can run cleanly. if (U_FAILURE(*rb->fStatus)) { return; } @@ -320,10 +323,11 @@ UBool RBBIRuleScanner::doParseActions(EParseAction action) // The ';' that terminates an expression really just functions as a '|' with // a low operator prededence. // - // Forward and reverse rules are collected separately. Or this rule into - // the appropriate group of them. + // Each of the four sets of rules are collected separately. + // (forward, reverse, safe_forward, safe_reverse) + // OR this rule into the appropriate group of them. // - RBBINode **destRules = (fReverseRule? &fRB->fReverseTree : &fRB->fForwardTree); + RBBINode **destRules = (fReverseRule? &fRB->fReverseTree : fRB->fDefaultTree); if (*destRules != NULL) { // This is not the first rule encounted. @@ -459,7 +463,38 @@ UBool RBBIRuleScanner::doParseActions(EParseAction action) fRB->fRules.extractBetween(n->fFirstPos, n->fLastPos, n->fText); break; + case doTagExpectedError: + error(U_BRK_MALFORMED_RULE_TAG); + returnVal = FALSE; + break; + + case doOptionStart: + // Scanning a !!option. At the start of string. + fOptionStart = fScanIndex; + break; + case doOptionEnd: + { + UnicodeString opt(fRB->fRules, fOptionStart, fScanIndex-fOptionStart); + if (opt == UNICODE_STRING("chain", 5)) { + fRB->fChainRules = TRUE; + } else if (opt == UNICODE_STRING("LBCMNoChain", 11)) { + fRB->fLBCMNoChain = TRUE; + } else if (opt == UNICODE_STRING("forward", 7)) { + fRB->fDefaultTree = &fRB->fForwardTree; + } else if (opt == UNICODE_STRING("reverse", 7)) { + fRB->fDefaultTree = &fRB->fReverseTree; + } else if (opt == UNICODE_STRING("safe_forward", 12)) { + fRB->fDefaultTree = &fRB->fSafeFwdTree; + } else if (opt == UNICODE_STRING("safe_reverse", 12)) { + fRB->fDefaultTree = &fRB->fSafeRevTree; + } else if (opt == UNICODE_STRING("lookAheadHardBreak", 18)) { + fRB->fLookAheadHardBreak = TRUE; + } else { + error(U_BRK_UNRECOGNIZED_OPTION); + } + } + break; case doReverseDir: fReverseRule = TRUE; @@ -563,7 +598,7 @@ void RBBIRuleScanner::fixOpStack(RBBINode::OpPrecedence p) { for (;;) { n = fNodeStack[fNodeStackPtr-1]; // an operator node if (n->fPrecedence == 0) { - RBBIDebugPrintf("RBBIRuleScanner::fixOpStack, bad operator node\n"); + RBBIDebugPuts("RBBIRuleScanner::fixOpStack, bad operator node"); error(U_BRK_INTERNAL_ERROR); return; } @@ -853,7 +888,7 @@ void RBBIRuleScanner::nextChar(RBBIRuleChar &c) { //--------------------------------------------------------------------------------- // // Parse RBBI rules. The state machine for rules parsing is here. -// The state tables are hand-written in the file TODO.txt, +// The state tables are hand-written in the file rbbirpt.txt, // and converted to the form used here by a perl // script rbbicst.pl // @@ -896,10 +931,12 @@ void RBBIRuleScanner::parse() { // the search will stop there, if not before. // tableEl = &gRuleParseStateTable[state]; - if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "scan")) { - RBBIDebugPrintf("char, line, col = (\'%c\', %d, %d) state=%s ", - fC.fChar, fLineNum, fCharNum, RBBIRuleStateNames[state]); - } + #ifdef RBBI_DEBUG + if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "scan")) { + RBBIDebugPrintf("char, line, col = (\'%c\', %d, %d) state=%s ", + fC.fChar, fLineNum, fCharNum, RBBIRuleStateNames[state]); + } + #endif for (;;) { if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "scan")) { RBBIDebugPrintf(".");} @@ -958,7 +995,7 @@ void RBBIRuleScanner::parse() { fStackPtr++; if (fStackPtr >= kStackSize) { error(U_BRK_INTERNAL_ERROR); - RBBIDebugPrintf("RBBIRuleScanner::parse() - state stack overflow.\n"); + RBBIDebugPuts("RBBIRuleScanner::parse() - state stack overflow."); fStackPtr--; } fStack[fStackPtr] = tableEl->fPushState; @@ -977,7 +1014,7 @@ void RBBIRuleScanner::parse() { fStackPtr--; if (fStackPtr < 0) { error(U_BRK_INTERNAL_ERROR); - RBBIDebugPrintf("RBBIRuleScanner::parse() - state stack underflow.\n"); + RBBIDebugPuts("RBBIRuleScanner::parse() - state stack underflow."); fStackPtr++; } } @@ -1002,15 +1039,20 @@ void RBBIRuleScanner::parse() { // We now have a parse tree for the rule expressions // and a list of all UnicodeSets that are referenced. // - if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "symbols")) {fSymbolTable->print();} +#ifdef RBBI_DEBUG + if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "symbols")) {fSymbolTable->rbbiSymtablePrint();} if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "ptree")) { RBBIDebugPrintf("Completed Forward Rules Parse Tree...\n"); - fRB->fForwardTree->printTree(); + fRB->fForwardTree->printTree(TRUE); RBBIDebugPrintf("\nCompleted Reverse Rules Parse Tree...\n"); - fRB->fReverseTree->printTree(); + fRB->fReverseTree->printTree(TRUE); + RBBIDebugPrintf("\nCompleted Safe Point Forward Rules Parse Tree...\n"); + fRB->fSafeFwdTree->printTree(TRUE); + RBBIDebugPrintf("\nCompleted Safe Point Reverse Rules Parse Tree...\n"); + fRB->fSafeRevTree->printTree(TRUE); } - +#endif } @@ -1019,11 +1061,15 @@ void RBBIRuleScanner::parse() { // printNodeStack for debugging... // //--------------------------------------------------------------------------------- +#ifdef RBBI_DEBUG +void RBBIRuleScanner::printNodeStack(const char *) {} +#else void RBBIRuleScanner::printNodeStack(const char *title) { int i; RBBIDebugPrintf("%s. Dumping node stack...\n", title); - for (i=fNodeStackPtr; i>0; i--) {fNodeStack[i]->printTree();} + for (i=fNodeStackPtr; i>0; i--) {fNodeStack[i]->printTree(TRUE);} } +#endif @@ -1038,7 +1084,7 @@ RBBINode *RBBIRuleScanner::pushNewNode(RBBINode::NodeType t) { fNodeStackPtr++; if (fNodeStackPtr >= kStackSize) { error(U_BRK_INTERNAL_ERROR); - RBBIDebugPrintf("RBBIRuleScanner::pushNewNode - stack overflow.\n"); + RBBIDebugPuts("RBBIRuleScanner::pushNewNode - stack overflow."); *fRB->fStatus = U_BRK_INTERNAL_ERROR; return NULL; } @@ -1078,8 +1124,8 @@ void RBBIRuleScanner::scanSet() { pos.setIndex(fScanIndex); startPos = fScanIndex; UErrorCode localStatus = U_ZERO_ERROR; - uset = new UnicodeSet(fRB->fRules, pos, - *fSymbolTable, + uset = new UnicodeSet(fRB->fRules, pos, USET_IGNORE_SPACE, + fSymbolTable, localStatus); if (U_FAILURE(localStatus)) { // TODO: Get more accurate position of the error from UnicodeSet's return info. diff --git a/icuSources/common/rbbiscan.h b/icuSources/common/rbbiscan.h index 3c835788..918f5f9f 100644 --- a/icuSources/common/rbbiscan.h +++ b/icuSources/common/rbbiscan.h @@ -18,7 +18,7 @@ #include "unicode/parseerr.h" #include "uhash.h" #include "uvector.h" -#include "symtable.h" // For UnicodeSet parsing, is the interface that +#include "unicode/symtable.h"// For UnicodeSet parsing, is the interface that // looks up references to $variables within a set. #include "rbbinode.h" //#include "rbbitblb.h" @@ -145,6 +145,9 @@ private: int32_t fRuleNum; // Counts each rule as it is scanned. + int32_t fOptionStart; // Input index of start of a !!option + // keyword, while being scanned. + UnicodeSet *gRuleSet_rule_char; UnicodeSet *gRuleSet_white_space; UnicodeSet *gRuleSet_name_char; diff --git a/icuSources/common/rbbisetb.cpp b/icuSources/common/rbbisetb.cpp index 261aba23..50ac3ca1 100644 --- a/icuSources/common/rbbisetb.cpp +++ b/icuSources/common/rbbisetb.cpp @@ -3,7 +3,7 @@ // /* *************************************************************************** -* Copyright (C) 2002-2003 International Business Machines Corporation * +* Copyright (C) 2002-2004 International Business Machines Corporation * * and others. All rights reserved. * *************************************************************************** */ @@ -135,10 +135,13 @@ void RBBISetBuilder::build() { // Initialize the process by creating a single range encompassing all characters // that is in no sets. // - fRangeList = new RangeDescriptor(*fStatus); + fRangeList = new RangeDescriptor(*fStatus); // will check for status here fRangeList->fStartChar = 0; fRangeList->fEndChar = 0x10ffff; + if (U_FAILURE(*fStatus)) { + return; + } // // Find the set of non-overlapping ranges of characters @@ -176,6 +179,9 @@ void RBBISetBuilder::build() { // over if (rlRange->fStartChar < inputSetRangeBegin) { rlRange->split(inputSetRangeBegin, *fStatus); + if (U_FAILURE(*fStatus)) { + return; + } continue; } @@ -186,12 +192,18 @@ void RBBISetBuilder::build() { // wholly inside the Unicode set. if (rlRange->fEndChar > inputSetRangeEnd) { rlRange->split(inputSetRangeEnd+1, *fStatus); + if (U_FAILURE(*fStatus)) { + return; + } } // The current rlRange is now entirely within the UnicodeSet range. // Add this unicode set to the list of sets for this rlRange if (rlRange->fIncludesSets->indexOf(usetNode) == -1) { rlRange->fIncludesSets->addElement(usetNode, *fStatus); + if (U_FAILURE(*fStatus)) { + return; + } } // Advance over ranges that we are finished with. @@ -237,6 +249,7 @@ void RBBISetBuilder::build() { NULL, // Data array (utrie will allocate one) 100000, // Max Data Length 0, // Initial value for all code points + 0, // Lead surrogate unit value TRUE); // Keep Latin 1 in separately @@ -252,7 +265,7 @@ void RBBISetBuilder::build() { // getTrieSize() Return the size that will be required to serialize the Trie. // //----------------------------------------------------------------------------------- -int32_t RBBISetBuilder::getTrieSize() { +int32_t RBBISetBuilder::getTrieSize() /*const*/ { fTrieSize = utrie_serialize(fTrie, NULL, // Buffer 0, // Capacity @@ -326,20 +339,40 @@ void RBBISetBuilder::addValToSets(UVector *sets, uint32_t val) { // getNumOutputSets // //------------------------------------------------------------------------ -int32_t RBBISetBuilder::getNumCharCategories() { +int32_t RBBISetBuilder::getNumCharCategories() const { return fGroupCount + 1; } +//------------------------------------------------------------------------ +// +// getFirstChar Given a runtime RBBI character category, find +// the first UChar32 that is in the set of chars +// in the category. +//------------------------------------------------------------------------ +UChar32 RBBISetBuilder::getFirstChar(int32_t category) const { + RangeDescriptor *rlRange; + UChar32 retVal = (UChar32)-1; + for (rlRange = fRangeList; rlRange!=0; rlRange=rlRange->fNext) { + if (rlRange->fNum == category) { + retVal = rlRange->fStartChar; + break; + } + } + return retVal; +} + + + //------------------------------------------------------------------------ // // printRanges A debugging function. // dump out all of the range definitions. // //------------------------------------------------------------------------ -void RBBISetBuilder::printRanges() { #ifdef RBBI_DEBUG +void RBBISetBuilder::printRanges() { RangeDescriptor *rlRange; int i; @@ -349,7 +382,7 @@ void RBBISetBuilder::printRanges() { for (i=0; ifIncludesSets->size(); i++) { RBBINode *usetNode = (RBBINode *)rlRange->fIncludesSets->elementAt(i); - UnicodeString setName = "anon"; + UnicodeString setName = UNICODE_STRING("anon", 4); RBBINode *setRef = usetNode->fParent; if (setRef != NULL) { RBBINode *varRef = setRef->fParent; @@ -357,12 +390,12 @@ void RBBISetBuilder::printRanges() { setName = varRef->fText; } } - RBBINode::printUnicodeString(setName); RBBIDebugPrintf(" "); + RBBI_DEBUG_printUnicodeString(setName); RBBIDebugPrintf(" "); } RBBIDebugPrintf("\n"); } -#endif } +#endif //------------------------------------------------------------------------ @@ -371,6 +404,7 @@ void RBBISetBuilder::printRanges() { // dump out all of the range groups. // //------------------------------------------------------------------------ +#ifdef RBBI_DEBUG void RBBISetBuilder::printRangeGroups() { RangeDescriptor *rlRange; RangeDescriptor *tRange; @@ -388,7 +422,7 @@ void RBBISetBuilder::printRangeGroups() { for (i=0; ifIncludesSets->size(); i++) { RBBINode *usetNode = (RBBINode *)rlRange->fIncludesSets->elementAt(i); - UnicodeString setName = "anon"; + UnicodeString setName = UNICODE_STRING("anon", 4); RBBINode *setRef = usetNode->fParent; if (setRef != NULL) { RBBINode *varRef = setRef->fParent; @@ -396,7 +430,7 @@ void RBBISetBuilder::printRangeGroups() { setName = varRef->fText; } } - RBBINode::printUnicodeString(setName); RBBIDebugPrintf(" "); + RBBI_DEBUG_printUnicodeString(setName); RBBIDebugPrintf(" "); } i = 0; @@ -413,7 +447,7 @@ void RBBISetBuilder::printRangeGroups() { } RBBIDebugPrintf("\n"); } - +#endif //------------------------------------------------------------------------ @@ -422,8 +456,8 @@ void RBBISetBuilder::printRangeGroups() { // dump out all of the set definitions. // //------------------------------------------------------------------------ -void RBBISetBuilder::printSets() { #ifdef RBBI_DEBUG +void RBBISetBuilder::printSets() { int i; RBBIDebugPrintf("\n\nUnicode Sets List\n------------------\n"); @@ -439,7 +473,7 @@ void RBBISetBuilder::printSets() { } RBBIDebugPrintf("%3d ", i); - setName = "anonymous"; + setName = UNICODE_STRING("anonymous", 9); setRef = usetNode->fParent; if (setRef != NULL) { varRef = setRef->fParent; @@ -447,17 +481,17 @@ void RBBISetBuilder::printSets() { setName = varRef->fText; } } - RBBINode::printUnicodeString(setName); + RBBI_DEBUG_printUnicodeString(setName); RBBIDebugPrintf(" "); - RBBINode::printUnicodeString(usetNode->fText); + RBBI_DEBUG_printUnicodeString(usetNode->fText); RBBIDebugPrintf("\n"); if (usetNode->fLeftChild != NULL) { - usetNode->fLeftChild->printTree(); + usetNode->fLeftChild->printTree(TRUE); } } RBBIDebugPrintf("\n"); -#endif } +#endif @@ -474,7 +508,14 @@ RangeDescriptor::RangeDescriptor(const RangeDescriptor &other, UErrorCode &statu this->fEndChar = other.fEndChar; this->fNum = other.fNum; this->fNext = NULL; + UErrorCode oldstatus = status; this->fIncludesSets = new UVector(status); + if (U_FAILURE(oldstatus)) { + status = oldstatus; + } + if (U_FAILURE(status)) { + return; + } /* test for NULL */ if (this->fIncludesSets == 0) { status = U_MEMORY_ALLOCATION_ERROR; @@ -497,7 +538,14 @@ RangeDescriptor::RangeDescriptor(UErrorCode &status) { this->fEndChar = 0; this->fNum = 0; this->fNext = NULL; + UErrorCode oldstatus = status; this->fIncludesSets = new UVector(status); + if (U_FAILURE(oldstatus)) { + status = oldstatus; + } + if (U_FAILURE(status)) { + return; + } /* test for NULL */ if(this->fIncludesSets == 0) { status = U_MEMORY_ALLOCATION_ERROR; @@ -525,6 +573,9 @@ RangeDescriptor::~RangeDescriptor() { void RangeDescriptor::split(UChar32 where, UErrorCode &status) { U_ASSERT(where>fStartChar && where<=fEndChar); RangeDescriptor *nr = new RangeDescriptor(*this, status); + if (U_FAILURE(status)) { + return; + } /* test for NULL */ if(nr == 0) { status = U_MEMORY_ALLOCATION_ERROR; @@ -571,7 +622,7 @@ void RangeDescriptor::setDictionaryFlag() { setName = varRef->fText; } } - if (setName.compare("dictionary") == 0) { // TODO: no string literals. + if (setName.compare(UNICODE_STRING("dictionary", 10)) == 0) { // TODO: no string literals. this->fNum |= 0x4000; break; } diff --git a/icuSources/common/rbbisetb.h b/icuSources/common/rbbisetb.h index b4b80a67..17544f54 100644 --- a/icuSources/common/rbbisetb.h +++ b/icuSources/common/rbbisetb.h @@ -2,7 +2,7 @@ // rbbisetb.h /* ********************************************************************** -* Copyright (c) 2001, International Business Machines +* Copyright (c) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** */ @@ -14,7 +14,6 @@ #include "unicode/uobject.h" #include "rbbirb.h" #include "uvector.h" -#include "uhash.h" struct UNewTrie; @@ -81,14 +80,21 @@ public: void build(); void addValToSets(UVector *sets, uint32_t val); - int32_t getNumCharCategories(); // CharCategories are the same as input symbol set to the + int32_t getNumCharCategories() const; // CharCategories are the same as input symbol set to the // runtime state machine, which are the same as // columns in the DFA state table - int32_t getTrieSize(); // Size in bytes of the serialized Trie. + int32_t getTrieSize() /*const*/; // Size in bytes of the serialized Trie. void serializeTrie(uint8_t *where); // write out the serialized Trie. + UChar32 getFirstChar(int32_t val) const; +#ifdef RBBI_DEBUG void printSets(); void printRanges(); void printRangeGroups(); +#else + #define printSets() + #define printRanges() + #define printRangeGroups() +#endif private: void numberSets(); diff --git a/icuSources/common/rbbistbl.cpp b/icuSources/common/rbbistbl.cpp index 99e22123..f8aae326 100644 --- a/icuSources/common/rbbistbl.cpp +++ b/icuSources/common/rbbistbl.cpp @@ -3,7 +3,7 @@ // /* *************************************************************************** -* Copyright (C) 2002-2003 International Business Machines Corporation * +* Copyright (C) 2002-2004 International Business Machines Corporation * * and others. All rights reserved. * *************************************************************************** */ @@ -43,11 +43,12 @@ RBBISymbolTable::RBBISymbolTable(RBBIRuleScanner *rs, const UnicodeString &rules { fHashTable = NULL; fCachedSetLookup = NULL; + + fHashTable = uhash_open(uhash_hashUnicodeString, uhash_compareUnicodeString, &status); + // uhash_open checks status if (U_FAILURE(status)) { return; } - - fHashTable = uhash_open(uhash_hashUnicodeString, uhash_compareUnicodeString, &status); uhash_setValueDeleter(fHashTable, RBBISymbolTableEntry_deleter); } @@ -223,7 +224,8 @@ RBBISymbolTableEntry::~RBBISymbolTableEntry() { // // RBBISymbolTable::print Debugging function, dump out the symbol table contents. // -void RBBISymbolTable::print() const { +#ifdef RBBI_DEBUG +void RBBISymbolTable::rbbiSymtablePrint() const { RBBIDebugPrintf("Variable Definitions\n" "Name Node Val String Val\n" "----------------------------------------------------------------------\n"); @@ -237,9 +239,9 @@ void RBBISymbolTable::print() const { } RBBISymbolTableEntry *s = (RBBISymbolTableEntry *)e->value.pointer; - RBBINode::printUnicodeString(s->key, 15); + RBBI_DEBUG_printUnicodeString(s->key, 15); RBBIDebugPrintf(" %8p ", (void *)s->val); - RBBINode::printUnicodeString(s->val->fLeftChild->fText); + RBBI_DEBUG_printUnicodeString(s->val->fLeftChild->fText); RBBIDebugPrintf("\n"); } @@ -251,12 +253,12 @@ void RBBISymbolTable::print() const { break; } RBBISymbolTableEntry *s = (RBBISymbolTableEntry *)e->value.pointer; - RBBINode::printUnicodeString(s->key); - s->val->fLeftChild->printTree(); + RBBI_DEBUG_printUnicodeString(s->key); + s->val->fLeftChild->printTree(TRUE); RBBIDebugPrintf("\n"); } } - +#endif diff --git a/icuSources/common/rbbitblb.cpp b/icuSources/common/rbbitblb.cpp index 2fd1063a..b979c92a 100644 --- a/icuSources/common/rbbitblb.cpp +++ b/icuSources/common/rbbitblb.cpp @@ -4,7 +4,7 @@ /* ********************************************************************** -* Copyright (c) 2002-2003, International Business Machines +* Copyright (c) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** */ @@ -25,9 +25,20 @@ U_NAMESPACE_BEGIN RBBITableBuilder::RBBITableBuilder(RBBIRuleBuilder *rb, RBBINode **rootNode) : fTree(*rootNode) { - fRB = rb; - fStatus = fRB->fStatus; - fDStates = new UVector(*fStatus); + fRB = rb; + fStatus = fRB->fStatus; + UErrorCode status = U_ZERO_ERROR; + fDStates = new UVector(status); + if (U_FAILURE(*fStatus)) { + return; + } + if (U_FAILURE(status)) { + *fStatus = status; + return; + } + if (fDStates == NULL) { + *fStatus = U_MEMORY_ALLOCATION_ERROR;; + } } @@ -65,7 +76,7 @@ void RBBITableBuilder::build() { // fTree = fTree->flattenVariables(); if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "ftree")) { - RBBIDebugPrintf("Parse tree after flattening variable references.\n"); + RBBIDebugPuts("Parse tree after flattening variable references."); fTree->printTree(TRUE); } @@ -87,7 +98,7 @@ void RBBITableBuilder::build() { // fTree->flattenSets(); if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "stree")) { - RBBIDebugPrintf("Parse tree after flattening Unicode Set references.\n"); + RBBIDebugPuts("Parse tree after flattening Unicode Set references."); fTree->printTree(TRUE); } @@ -104,10 +115,17 @@ void RBBITableBuilder::build() { calcLastPos(fTree); calcFollowPos(fTree); if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "pos")) { - RBBIDebugPrintf("\n\n"); + RBBIDebugPuts("\n"); printPosSets(fTree); } + // + // For "chained" rules, modify the followPos sets + // + if (fRB->fChainRules) { + calcChainedFollowPos(fTree); + } + // // Build the DFA state transition tables. // @@ -115,8 +133,15 @@ void RBBITableBuilder::build() { flagAcceptingStates(); flagLookAheadStates(); flagTaggedStates(); - if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "states")) {printStates();}; + // + // Update the global table of rule status {tag} values + // The rule builder has a global vector of status values that are common + // for all tables. Merge the ones from this table into the global set. + // + mergeRuleStatusVals(); + + if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "states")) {printStates();}; } @@ -299,6 +324,97 @@ void RBBITableBuilder::calcFollowPos(RBBINode *n) { } +//----------------------------------------------------------------------------- +// +// calcChainedFollowPos. Modify the previously calculated followPos sets +// to implement rule chaining. NOT described by Aho +// +//----------------------------------------------------------------------------- +void RBBITableBuilder::calcChainedFollowPos(RBBINode *tree) { + + UVector endMarkerNodes(*fStatus); + UVector leafNodes(*fStatus); + int32_t i; + + if (U_FAILURE(*fStatus)) { + return; + } + + // get a list of all endmarker nodes. + tree->findNodes(&endMarkerNodes, RBBINode::endMark, *fStatus); + + // get a list all leaf nodes + tree->findNodes(&leafNodes, RBBINode::leafChar, *fStatus); + if (U_FAILURE(*fStatus)) { + return; + } + + // Get all nodes that can be the start a match, which is FirstPosition(root) + UVector *matchStartNodes = tree->fFirstPosSet; + + + // Iteratate over all leaf nodes, + // + int32_t endNodeIx; + int32_t startNodeIx; + + for (endNodeIx=0; endNodeIxfFollowPos->contains(endMarkerNodes.elementAt(i))) { + endNode = tNode; + break; + } + } + if (endNode == NULL) { + // node wasn't an end node. Try again with the next. + continue; + } + + // We've got a node that can end a match. + + // Line Break Specific hack: If this node's val correspond to the $CM char class, + // don't chain from it. + // TODO: Add rule syntax for this behavior, get specifics out of here and + // into the rule file. + if (fRB->fLBCMNoChain) { + UChar32 c = this->fRB->fSetBuilder->getFirstChar(endNode->fVal); + U_ASSERT(c != -1); + ULineBreak cLBProp = (ULineBreak)u_getIntPropertyValue(c, UCHAR_LINE_BREAK); + if (cLBProp == U_LB_COMBINING_MARK) { + continue; + } + } + + + // Now iterate over the nodes that can start a match, looking for ones + // with the same char class as our ending node. + RBBINode *startNode; + for (startNodeIx = 0; startNodeIxsize(); startNodeIx++) { + startNode = (RBBINode *)matchStartNodes->elementAt(startNodeIx); + if (startNode->fType != RBBINode::leafChar) { + continue; + } + + if (endNode->fVal == startNode->fVal) { + // The end val (character class) of one possible match is the + // same as the start of another. + + // Add all nodes from the followPos of the start node to the + // followPos set of the end node, which will have the effect of + // letting matches transition from a match state at endNode + // to the second char of a match starting with startNode. + setAdd(endNode->fFollowPos, startNode->fFollowPos); + } + } + } +} + + //----------------------------------------------------------------------------- // // buildStateTable() Determine the set of runtime DFA states and the @@ -309,19 +425,37 @@ void RBBITableBuilder::calcFollowPos(RBBINode *n) { // //----------------------------------------------------------------------------- void RBBITableBuilder::buildStateTable() { + if (U_FAILURE(*fStatus)) { + return; + } // // Add a dummy state 0 - the stop state. Not from Aho. int lastInputSymbol = fRB->fSetBuilder->getNumCharCategories() - 1; RBBIStateDescriptor *failState = new RBBIStateDescriptor(lastInputSymbol, fStatus); failState->fPositions = new UVector(*fStatus); + if (U_FAILURE(*fStatus)) { + return; + } fDStates->addElement(failState, *fStatus); + if (U_FAILURE(*fStatus)) { + return; + } // initially, the only unmarked state in Dstates is firstpos(root), // where toot is the root of the syntax tree for (r)#; RBBIStateDescriptor *initialState = new RBBIStateDescriptor(lastInputSymbol, fStatus); + if (U_FAILURE(*fStatus)) { + return; + } initialState->fPositions = new UVector(*fStatus); + if (U_FAILURE(*fStatus)) { + return; + } setAdd(initialState->fPositions, fTree->fFirstPosSet); fDStates->addElement(initialState, *fStatus); + if (U_FAILURE(*fStatus)) { + return; + } // while there is an unmarked state T in Dstates do begin for (;;) { @@ -383,8 +517,14 @@ void RBBITableBuilder::buildStateTable() { if (!UinDstates) { RBBIStateDescriptor *newState = new RBBIStateDescriptor(lastInputSymbol, fStatus); + if (U_FAILURE(*fStatus)) { + return; + } newState->fPositions = U; fDStates->addElement(newState, *fStatus); + if (U_FAILURE(*fStatus)) { + return; + } ux = fDStates->size()-1; } @@ -407,12 +547,22 @@ void RBBITableBuilder::buildStateTable() { // //----------------------------------------------------------------------------- void RBBITableBuilder::flagAcceptingStates() { + if (U_FAILURE(*fStatus)) { + return; + } UVector endMarkerNodes(*fStatus); RBBINode *endMarker; int32_t i; int32_t n; + if (U_FAILURE(*fStatus)) { + return; + } + fTree->findNodes(&endMarkerNodes, RBBINode::endMark, *fStatus); + if (U_FAILURE(*fStatus)) { + return; + } for (i=0; ifindNodes(&lookAheadNodes, RBBINode::lookAhead, *fStatus); + if (U_FAILURE(*fStatus)) { + return; + } for (i=0; ifindNodes(&tagNodes, RBBINode::tag, *fStatus); + if (U_FAILURE(*fStatus)) { + return; + } for (i=0; isize(); n++) { // For each state s (row in the state table) RBBIStateDescriptor *sd = (RBBIStateDescriptor *)fDStates->elementAt(n); if (sd->fPositions->indexOf(tagNode) >= 0) { // if s include the tag node t - if (sd->fTagVal < tagNode->fVal) { - // If more than one rule tag applies to this state, the larger - // tag takes precedence. - sd->fTagVal = tagNode->fVal; + sortedAdd(&sd->fTagVals, tagNode->fVal); } } } } + + + + +//----------------------------------------------------------------------------- +// +// mergeRuleStatusVals +// +// Update the global table of rule status {tag} values +// The rule builder has a global vector of status values that are common +// for all tables. Merge the ones from this table into the global set. +// +//----------------------------------------------------------------------------- +void RBBITableBuilder::mergeRuleStatusVals() { + // + // The basic outline of what happens here is this... + // + // for each state in this state table + // if the status tag list for this state is in the global statuses list + // record where and + // continue with the next state + // else + // add the tag list for this state to the global list. + // + int i; + int n; + + // Pre-set a single tag of {0} into the table. + // We will need this as a default, for rule sets with no explicit tagging. + if (fRB->fRuleStatusVals->size() == 0) { + fRB->fRuleStatusVals->addElement(1, *fStatus); // Num of statuses in group + fRB->fRuleStatusVals->addElement((int32_t)0, *fStatus); // and our single status of zero + } + + // For each state + for (n=0; nsize(); n++) { + RBBIStateDescriptor *sd = (RBBIStateDescriptor *)fDStates->elementAt(n); + UVector *thisStatesTagValues = sd->fTagVals; + if (thisStatesTagValues == NULL) { + // No tag values are explicitly associated with this state. + // Set the default tag value. + sd->fTagsIdx = 0; + continue; + } + + // There are tag(s) associated with this state. + // fTagsIdx will be the index into the global tag list for this state's tag values. + // Initial value of -1 flags that we haven't got it set yet. + sd->fTagsIdx = -1; + int32_t thisTagGroupStart = 0; // indexes into the global rule status vals list + int32_t nextTagGroupStart = 0; + + // Loop runs once per group of tags in the global list + while (nextTagGroupStart < fRB->fRuleStatusVals->size()) { + thisTagGroupStart = nextTagGroupStart; + nextTagGroupStart += fRB->fRuleStatusVals->elementAti(thisTagGroupStart) + 1; + if (thisStatesTagValues->size() != fRB->fRuleStatusVals->elementAti(thisTagGroupStart)) { + // The number of tags for this state is different from + // the number of tags in this group from the global list. + // Continue with the next group from the global list. + continue; + } + // The lengths match, go ahead and compare the actual tag values + // between this state and the group from the global list. + for (i=0; isize(); i++) { + if (thisStatesTagValues->elementAti(i) != + fRB->fRuleStatusVals->elementAti(thisTagGroupStart + 1 + i) ) { + // Mismatch. + break; + } + } + + if (i == thisStatesTagValues->size()) { + // We found a set of tag values in the global list that match + // those for this state. Use them. + sd->fTagsIdx = thisTagGroupStart; + break; + } + } + + if (sd->fTagsIdx == -1) { + // No suitable entry in the global tag list already. Add one + sd->fTagsIdx = fRB->fRuleStatusVals->size(); + fRB->fRuleStatusVals->addElement(thisStatesTagValues->size(), *fStatus); + for (i=0; isize(); i++) { + fRB->fRuleStatusVals->addElement(thisStatesTagValues->elementAti(i), *fStatus); + } + } + } +} + + + + + + + +//----------------------------------------------------------------------------- +// +// sortedAdd Add a value to a vector of sorted values (ints). +// Do not replicate entries; if the value is already there, do not +// add a second one. +// Lazily create the vector if it does not already exist. +// +//----------------------------------------------------------------------------- +void RBBITableBuilder::sortedAdd(UVector **vector, int32_t val) { + int32_t i; + + if (*vector == NULL) { + *vector = new UVector(*fStatus); + } + if (*vector == NULL || U_FAILURE(*fStatus)) { + return; + } + UVector *vec = *vector; + int32_t vSize = vec->size(); + for (i=0; ielementAti(i); + if (valAtI == val) { + // The value is already in the vector. Don't add it again. + return; + } + if (valAtI > val) { + break; + } + } + vec->insertElementAt(val, i, *fStatus); } @@ -507,7 +796,7 @@ void RBBITableBuilder::setAdd(UVector *dest, UVector *source) { int sourceSize = source->size(); int32_t si, di; - for (si=0; sielementAt(si); for (di=0; dielementAt(di) == elToAdd) { @@ -515,11 +804,12 @@ void RBBITableBuilder::setAdd(UVector *dest, UVector *source) { } } dest->addElement(elToAdd, *fStatus); - elementAlreadyInDest: ; + elementAlreadyInDest: ; } } + //----------------------------------------------------------------------------- // // setEqual Set operation on UVector. @@ -567,12 +857,12 @@ UBool RBBITableBuilder::setEquals(UVector *a, UVector *b) { // for each node in the tree. // //----------------------------------------------------------------------------- -void RBBITableBuilder::printPosSets(RBBINode *n) { #ifdef RBBI_DEBUG +void RBBITableBuilder::printPosSets(RBBINode *n) { if (n==NULL) { return; } - n->print(); + n->printNode(); RBBIDebugPrintf(" Nullable: %s\n", n->fNullable?"TRUE":"FALSE"); RBBIDebugPrintf(" firstpos: "); @@ -586,8 +876,8 @@ void RBBITableBuilder::printPosSets(RBBINode *n) { printPosSets(n->fLeftChild); printPosSets(n->fRightChild); -#endif } +#endif @@ -597,7 +887,7 @@ void RBBITableBuilder::printPosSets(RBBINode *n) { // state transition table. // //----------------------------------------------------------------------------- -int32_t RBBITableBuilder::getTableSize() { +int32_t RBBITableBuilder::getTableSize() const { int32_t size = 0; int32_t numRows; int32_t numCols; @@ -647,6 +937,11 @@ void RBBITableBuilder::exportTable(void *where) { table->fRowLen = sizeof(RBBIStateTableRow) + sizeof(uint16_t) * (fRB->fSetBuilder->getNumCharCategories() - 2); table->fNumStates = fDStates->size(); + table->fFlags = 0; + if (fRB->fLookAheadHardBreak) { + table->fFlags |= RBBI_LOOKAHEAD_HARD_BREAK; + } + table->fReserved = 0; for (state=0; statefNumStates; state++) { RBBIStateDescriptor *sd = (RBBIStateDescriptor *)fDStates->elementAt(state); @@ -655,7 +950,7 @@ void RBBITableBuilder::exportTable(void *where) { U_ASSERT (-32768 < sd->fLookAhead && sd->fLookAhead <= 32767); row->fAccepting = (int16_t)sd->fAccepting; row->fLookAhead = (int16_t)sd->fLookAhead; - row->fTag = (int16_t)sd->fTagVal; + row->fTagIdx = (int16_t)sd->fTagsIdx; for (col=0; colfSetBuilder->getNumCharCategories(); col++) { row->fNextState[col] = (uint16_t)sd->fDtran->elementAti(col); } @@ -669,16 +964,16 @@ void RBBITableBuilder::exportTable(void *where) { // printSet Debug function. Print the contents of a UVector // //----------------------------------------------------------------------------- -void RBBITableBuilder::printSet(UVector *s) { #ifdef RBBI_DEBUG +void RBBITableBuilder::printSet(UVector *s) { int32_t i; for (i=0; isize(); i++) { void *v = s->elementAt(i); RBBIDebugPrintf("%10p", v); } RBBIDebugPrintf("\n"); -#endif } +#endif //----------------------------------------------------------------------------- @@ -686,34 +981,65 @@ void RBBITableBuilder::printSet(UVector *s) { // printStates Debug Function. Dump the fully constructed state transition table. // //----------------------------------------------------------------------------- -void RBBITableBuilder::printStates() { #ifdef RBBI_DEBUG +void RBBITableBuilder::printStates() { int c; // input "character" int n; // state number RBBIDebugPrintf("state | i n p u t s y m b o l s \n"); RBBIDebugPrintf(" | Acc LA Tag"); - for (c=0; cfSetBuilder->getNumCharCategories(); c++) {RBBIDebugPrintf(" %2d", c);}; + for (c=0; cfSetBuilder->getNumCharCategories(); c++) { + RBBIDebugPrintf(" %2d", c); + } RBBIDebugPrintf("\n"); RBBIDebugPrintf(" |---------------"); - for (c=0; cfSetBuilder->getNumCharCategories(); c++) {RBBIDebugPrintf("---");}; + for (c=0; cfSetBuilder->getNumCharCategories(); c++) { + RBBIDebugPrintf("---"); + } RBBIDebugPrintf("\n"); for (n=0; nsize(); n++) { RBBIStateDescriptor *sd = (RBBIStateDescriptor *)fDStates->elementAt(n); RBBIDebugPrintf(" %3d | " , n); - RBBIDebugPrintf("%3d %3d %5d ", sd->fAccepting, sd->fLookAhead, sd->fTagVal); + RBBIDebugPrintf("%3d %3d %5d ", sd->fAccepting, sd->fLookAhead, sd->fTagsIdx); for (c=0; cfSetBuilder->getNumCharCategories(); c++) { RBBIDebugPrintf(" %2d", sd->fDtran->elementAti(c)); } RBBIDebugPrintf("\n"); } RBBIDebugPrintf("\n\n"); -#endif } +#endif +//----------------------------------------------------------------------------- +// +// printRuleStatusTable Debug Function. Dump the common rule status table +// +//----------------------------------------------------------------------------- +#ifdef RBBI_DEBUG +void RBBITableBuilder::printRuleStatusTable() { + int32_t thisRecord = 0; + int32_t nextRecord = 0; + int i; + UVector *tbl = fRB->fRuleStatusVals; + + RBBIDebugPrintf("index | tags \n"); + RBBIDebugPrintf("-------------------\n"); + + while (nextRecord < tbl->size()) { + thisRecord = nextRecord; + nextRecord = thisRecord + tbl->elementAti(thisRecord) + 1; + RBBIDebugPrintf("%4d ", thisRecord); + for (i=thisRecord+1; ielementAti(i)); + } + RBBIDebugPrintf("\n"); + } + RBBIDebugPrintf("\n\n"); +} +#endif //----------------------------------------------------------------------------- @@ -727,13 +1053,15 @@ RBBIStateDescriptor::RBBIStateDescriptor(int lastInputSymbol, UErrorCode *fStatu fMarked = FALSE; fAccepting = 0; fLookAhead = 0; - fTagVal = 0; + fTagsIdx = 0; + fTagVals = NULL; fPositions = NULL; fDtran = NULL; + + fDtran = new UVector(lastInputSymbol+1, *fStatus); if (U_FAILURE(*fStatus)) { return; } - fDtran = new UVector(lastInputSymbol+1, *fStatus); if (fDtran == NULL) { *fStatus = U_MEMORY_ALLOCATION_ERROR; return; @@ -748,8 +1076,10 @@ RBBIStateDescriptor::RBBIStateDescriptor(int lastInputSymbol, UErrorCode *fStatu RBBIStateDescriptor::~RBBIStateDescriptor() { delete fPositions; delete fDtran; + delete fTagVals; fPositions = NULL; fDtran = NULL; + fTagVals = NULL; } U_NAMESPACE_END diff --git a/icuSources/common/rbbitblb.h b/icuSources/common/rbbitblb.h index 47f7de27..e4a2b890 100644 --- a/icuSources/common/rbbitblb.h +++ b/icuSources/common/rbbitblb.h @@ -4,7 +4,7 @@ /* ********************************************************************** -* Copyright (c) 2002, International Business Machines +* Copyright (c) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** */ @@ -38,21 +38,24 @@ public: ~RBBITableBuilder(); void build(); - int32_t getTableSize(); // Return the runtime size in bytes of + int32_t getTableSize() const; // Return the runtime size in bytes of // the built state table void exportTable(void *where); // fill in the runtime state table. // Sufficient memory must exist at // the specified location. + private: void calcNullable(RBBINode *n); void calcFirstPos(RBBINode *n); void calcLastPos(RBBINode *n); void calcFollowPos(RBBINode *n); + void calcChainedFollowPos(RBBINode *n); void buildStateTable(); void flagAcceptingStates(); void flagLookAheadStates(); void flagTaggedStates(); + void mergeRuleStatusVals(); // Set functions for UVector. // TODO: make a USet subclass of UVector @@ -60,10 +63,20 @@ private: void setAdd(UVector *dest, UVector *source); UBool setEquals(UVector *a, UVector *b); + void sortedAdd(UVector **dest, int32_t val); + +public: +#ifdef RBBI_DEBUG void printSet(UVector *s); - void printPosSets(RBBINode *n = NULL); + void printPosSets(RBBINode *n /* = NULL*/); void printStates(); - + void printRuleStatusTable(); +#else + #define printSet(s) + #define printPosSets(n) + #define printStates() + #define printRuleStatusTable() +#endif private: RBBIRuleBuilder *fRB; @@ -75,6 +88,7 @@ private: // Index is state number // Contents are RBBIStateDescriptor pointers. + RBBITableBuilder(const RBBITableBuilder &other); // forbid copying of this class RBBITableBuilder &operator=(const RBBITableBuilder &other); // forbid copying of this class }; @@ -87,7 +101,8 @@ public: UBool fMarked; int32_t fAccepting; int32_t fLookAhead; - int32_t fTagVal; + UVector *fTagVals; + int32_t fTagsIdx; UVector *fPositions; // Set of parse tree positions associated // with this state. Unordered (it's a set). // UVector contents are RBBINode * diff --git a/icuSources/common/resbund.cpp b/icuSources/common/resbund.cpp index 03b0b5a5..d46e04b1 100644 --- a/icuSources/common/resbund.cpp +++ b/icuSources/common/resbund.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1997-2003, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -48,6 +48,7 @@ #include "unicode/utypes.h" #include "unicode/resbund.h" +#include "umutex.h" #include "uresimp.h" @@ -167,57 +168,42 @@ U_NAMESPACE_BEGIN */ //----------------------------------------------------------------------------- -const char ResourceBundle::fgClassID=0; - -ResourceBundle::ResourceBundle( const UnicodeString& path, - const Locale& locale, - UErrorCode& error) - :UObject(), locName(NULL) -{ - constructForLocale(path, locale, error); -} +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ResourceBundle) ResourceBundle::ResourceBundle(UErrorCode &err) - :UObject(), locName(NULL) -{ - resource = ures_open(0, Locale::getDefault().getName(), &err); -} - -ResourceBundle::ResourceBundle( const UnicodeString& path, - UErrorCode& error) - :UObject(), locName(NULL) + :UObject(), fLocale(NULL) { - constructForLocale(path, Locale::getDefault(), error); + fResource = ures_open(0, Locale::getDefault().getName(), &err); } ResourceBundle::ResourceBundle(const ResourceBundle &other) - :UObject(other), locName(NULL) + :UObject(other), fLocale(NULL) { UErrorCode status = U_ZERO_ERROR; - if (other.resource) { - resource = ures_copyResb(0, other.resource, &status); + if (other.fResource) { + fResource = ures_copyResb(0, other.fResource, &status); } else { /* Copying a bad resource bundle */ - resource = NULL; + fResource = NULL; } } ResourceBundle::ResourceBundle(UResourceBundle *res, UErrorCode& err) - :UObject(), locName(NULL) + :UObject(), fLocale(NULL) { if (res) { - resource = ures_copyResb(0, res, &err); + fResource = ures_copyResb(0, res, &err); } else { /* Copying a bad resource bundle */ - resource = NULL; + fResource = NULL; } } ResourceBundle::ResourceBundle(const char* path, const Locale& locale, UErrorCode& err) - :UObject(), locName(NULL) + :UObject(), fLocale(NULL) { - resource = ures_open(path, locale.getName(), &err); + fResource = ures_open(path, locale.getName(), &err); } @@ -226,96 +212,86 @@ ResourceBundle& ResourceBundle::operator=(const ResourceBundle& other) if(this == &other) { return *this; } - if(resource != 0) { - ures_close(resource); - resource = NULL; + if(fResource != 0) { + ures_close(fResource); + fResource = NULL; } UErrorCode status = U_ZERO_ERROR; - if (other.resource) { - resource = ures_copyResb(0, other.resource, &status); + if (other.fResource) { + fResource = ures_copyResb(0, other.fResource, &status); } else { /* Copying a bad resource bundle */ - resource = NULL; + fResource = NULL; } return *this; } ResourceBundle::~ResourceBundle() { - if(resource != 0) { - ures_close(resource); + if(fResource != 0) { + ures_close(fResource); } - if(locName != NULL) { - delete(locName); + if(fLocale != NULL) { + delete(fLocale); } } -void -ResourceBundle::constructForLocale(const UnicodeString& path, - const Locale& locale, - UErrorCode& error) -{ - char name[300]; - - if(!path.isEmpty()) { - path.extract(name, sizeof(name), 0, error); - resource = ures_open(name, locale.getName(), &error); - } else { - resource = ures_open(0, locale.getName(), &error); - } +ResourceBundle * +ResourceBundle::clone() const { + return new ResourceBundle(*this); } UnicodeString ResourceBundle::getString(UErrorCode& status) const { int32_t len = 0; - const UChar *r = ures_getString(resource, &len, &status); + const UChar *r = ures_getString(fResource, &len, &status); return UnicodeString(TRUE, r, len); } const uint8_t *ResourceBundle::getBinary(int32_t& len, UErrorCode& status) const { - return ures_getBinary(resource, &len, &status); + return ures_getBinary(fResource, &len, &status); } const int32_t *ResourceBundle::getIntVector(int32_t& len, UErrorCode& status) const { - return ures_getIntVector(resource, &len, &status); + return ures_getIntVector(fResource, &len, &status); } uint32_t ResourceBundle::getUInt(UErrorCode& status) const { - return ures_getUInt(resource, &status); + return ures_getUInt(fResource, &status); } int32_t ResourceBundle::getInt(UErrorCode& status) const { - return ures_getInt(resource, &status); + return ures_getInt(fResource, &status); } -const char *ResourceBundle::getName(void) { - return ures_getName(resource); +const char *ResourceBundle::getName(void) const { + return ures_getName(fResource); } -const char *ResourceBundle::getKey(void) { - return ures_getKey(resource); +const char *ResourceBundle::getKey(void) const { + return ures_getKey(fResource); } -UResType ResourceBundle::getType(void) { - return ures_getType(resource); +UResType ResourceBundle::getType(void) const { + return ures_getType(fResource); } int32_t ResourceBundle::getSize(void) const { - return ures_getSize(resource); + return ures_getSize(fResource); } UBool ResourceBundle::hasNext(void) const { - return ures_hasNext(resource); + return ures_hasNext(fResource); } void ResourceBundle::resetIterator(void) { - ures_resetIterator(resource); + ures_resetIterator(fResource); } ResourceBundle ResourceBundle::getNext(UErrorCode& status) { UResourceBundle r; ures_initStackObject(&r); - ures_getNextResource(resource, &r, &status); + ures_getNextResource(fResource, &r, &status); ResourceBundle res(&r, status); if (U_SUCCESS(status)) { ures_close(&r); @@ -325,13 +301,13 @@ ResourceBundle ResourceBundle::getNext(UErrorCode& status) { UnicodeString ResourceBundle::getNextString(UErrorCode& status) { int32_t len = 0; - const UChar* r = ures_getNextString(resource, &len, 0, &status); + const UChar* r = ures_getNextString(fResource, &len, 0, &status); return UnicodeString(TRUE, r, len); } UnicodeString ResourceBundle::getNextString(const char ** key, UErrorCode& status) { int32_t len = 0; - const UChar* r = ures_getNextString(resource, &len, key, &status); + const UChar* r = ures_getNextString(fResource, &len, key, &status); return UnicodeString(TRUE, r, len); } @@ -339,7 +315,7 @@ ResourceBundle ResourceBundle::get(int32_t indexR, UErrorCode& status) const { UResourceBundle r; ures_initStackObject(&r); - ures_getByIndex(resource, indexR, &r, &status); + ures_getByIndex(fResource, indexR, &r, &status); ResourceBundle res(&r, status); if (U_SUCCESS(status)) { ures_close(&r); @@ -349,7 +325,7 @@ ResourceBundle ResourceBundle::get(int32_t indexR, UErrorCode& status) const { UnicodeString ResourceBundle::getStringEx(int32_t indexS, UErrorCode& status) const { int32_t len = 0; - const UChar* r = ures_getStringByIndex(resource, indexS, &len, &status); + const UChar* r = ures_getStringByIndex(fResource, indexS, &len, &status); return UnicodeString(TRUE, r, len); } @@ -357,7 +333,7 @@ ResourceBundle ResourceBundle::get(const char* key, UErrorCode& status) const { UResourceBundle r; ures_initStackObject(&r); - ures_getByKey(resource, key, &r, &status); + ures_getByKey(fResource, key, &r, &status); ResourceBundle res(&r, status); if (U_SUCCESS(status)) { ures_close(&r); @@ -365,31 +341,57 @@ ResourceBundle ResourceBundle::get(const char* key, UErrorCode& status) const { return res; } +ResourceBundle ResourceBundle::getWithFallback(const char* key, UErrorCode& status){ + UResourceBundle r; + ures_initStackObject(&r); + ures_getByKeyWithFallback(fResource, key, &r, &status); + ResourceBundle res(&r, status); + if(U_SUCCESS(status)){ + ures_close(&r); + } + return res; +} UnicodeString ResourceBundle::getStringEx(const char* key, UErrorCode& status) const { int32_t len = 0; - const UChar* r = ures_getStringByKey(resource, key, &len, &status); + const UChar* r = ures_getStringByKey(fResource, key, &len, &status); return UnicodeString(TRUE, r, len); } const char* ResourceBundle::getVersionNumber() const { - return ures_getVersionNumber(resource); + return ures_getVersionNumber(fResource); } void ResourceBundle::getVersion(UVersionInfo versionInfo) const { - ures_getVersion(resource, versionInfo); + ures_getVersion(fResource, versionInfo); } const Locale &ResourceBundle::getLocale(void) const { - if(locName == NULL) { - UErrorCode status = U_ZERO_ERROR; - const char *localeName = ures_getLocale(resource, &status); - ResourceBundle *me = (ResourceBundle *)this; // semantically const - me->locName = new Locale(localeName); - } - return *locName; + UBool needInit; + umtx_lock(NULL); + needInit = (fLocale == NULL); + umtx_unlock(NULL); + if(needInit) { + UErrorCode status = U_ZERO_ERROR; + const char *localeName = ures_getLocale(fResource, &status); + Locale *tLocale = new Locale(localeName); + umtx_lock(NULL); + ResourceBundle *me = (ResourceBundle *)this; // semantically const + if (me->fLocale == NULL) { + me->fLocale = tLocale; + tLocale = NULL; + } + umtx_unlock(NULL); + delete tLocale; + } + return *fLocale; +} + +const Locale ResourceBundle::getLocale(ULocDataLocaleType type, UErrorCode &status) const +{ + return ures_getLocaleByType(fResource, type, &status); } //eof diff --git a/icuSources/common/resbund_cnv.cpp b/icuSources/common/resbund_cnv.cpp new file mode 100644 index 00000000..b7eddbf3 --- /dev/null +++ b/icuSources/common/resbund_cnv.cpp @@ -0,0 +1,72 @@ +/* +******************************************************************************* +* +* Copyright (C) 1997-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: resbund_cnv.cpp +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2004aug25 +* created by: Markus W. Scherer +* +* Character conversion functions moved here from resbund.cpp +*/ + +#include "unicode/utypes.h" +#include "unicode/resbund.h" +#include "uinvchar.h" + +U_NAMESPACE_BEGIN + +ResourceBundle::ResourceBundle( const UnicodeString& path, + const Locale& locale, + UErrorCode& error) + :UObject(), fLocale(NULL) +{ + constructForLocale(path, locale, error); +} + +ResourceBundle::ResourceBundle( const UnicodeString& path, + UErrorCode& error) + :UObject(), fLocale(NULL) +{ + constructForLocale(path, Locale::getDefault(), error); +} + +void +ResourceBundle::constructForLocale(const UnicodeString& path, + const Locale& locale, + UErrorCode& error) +{ + char name[300]; + + if(path.length() >= (int32_t)sizeof(name)) { + fResource = NULL; + error = U_ILLEGAL_ARGUMENT_ERROR; + } else if(!path.isEmpty()) { + if(uprv_isInvariantUString(path.getBuffer(), path.length())) { + // the invariant converter is sufficient for package and tree names + // and is more efficient + path.extract(0, INT32_MAX, name, (int32_t)sizeof(name), US_INV); + } else { +#if !UCONFIG_NO_CONVERSION + // use the default converter to support variant-character paths + path.extract(name, sizeof(name), 0, error); +#else + // the default converter is not available + fResource = NULL; + error = U_UNSUPPORTED_ERROR; + return; +#endif + } + fResource = ures_open(name, locale.getName(), &error); + } else { + fResource = ures_open(0, locale.getName(), &error); + } +} + +U_NAMESPACE_END diff --git a/icuSources/common/ruleiter.cpp b/icuSources/common/ruleiter.cpp new file mode 100644 index 00000000..7a084aa6 --- /dev/null +++ b/icuSources/common/ruleiter.cpp @@ -0,0 +1,151 @@ +/* +********************************************************************** +* Copyright (c) 2003-2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Author: Alan Liu +* Created: September 24 2003 +* Since: ICU 2.8 +********************************************************************** +*/ +#include "ruleiter.h" +#include "unicode/parsepos.h" +#include "unicode/unistr.h" +#include "unicode/symtable.h" +#include "util.h" + +U_NAMESPACE_BEGIN + +RuleCharacterIterator::RuleCharacterIterator(const UnicodeString& theText, const SymbolTable* theSym, + ParsePosition& thePos) : + text(theText), + pos(thePos), + sym(theSym), + buf(0) +{} + +UBool RuleCharacterIterator::atEnd() const { + return buf == 0 && pos.getIndex() == text.length(); +} + +UChar32 RuleCharacterIterator::next(int32_t options, UBool& isEscaped, UErrorCode& ec) { + if (U_FAILURE(ec)) return DONE; + + UChar32 c = DONE; + isEscaped = FALSE; + + for (;;) { + c = _current(); + _advance(UTF_CHAR_LENGTH(c)); + + if (c == SymbolTable::SYMBOL_REF && buf == 0 && + (options & PARSE_VARIABLES) != 0 && sym != 0) { + UnicodeString name = sym->parseReference(text, pos, text.length()); + // If name is empty there was an isolated SYMBOL_REF; + // return it. Caller must be prepared for this. + if (name.length() == 0) { + break; + } + bufPos = 0; + buf = sym->lookup(name); + if (buf == 0) { + ec = U_UNDEFINED_VARIABLE; + return DONE; + } + // Handle empty variable value + if (buf->length() == 0) { + buf = 0; + } + continue; + } + + if ((options & SKIP_WHITESPACE) != 0 && + uprv_isRuleWhiteSpace(c)) { + continue; + } + + if (c == 0x5C /*'\\'*/ && (options & PARSE_ESCAPES) != 0) { + UnicodeString s; + int32_t offset = 0; + c = lookahead(s).unescapeAt(offset); + jumpahead(offset); + isEscaped = TRUE; + if (c < 0) { + ec = U_MALFORMED_UNICODE_ESCAPE; + return DONE; + } + } + + break; + } + + return c; +} + +void RuleCharacterIterator::getPos(RuleCharacterIterator::Pos& p) const { + p.buf = buf; + p.pos = pos.getIndex(); + p.bufPos = bufPos; +} + +void RuleCharacterIterator::setPos(const RuleCharacterIterator::Pos& p) { + buf = p.buf; + pos.setIndex(p.pos); + bufPos = p.bufPos; +} + +void RuleCharacterIterator::skipIgnored(int32_t options) { + if ((options & SKIP_WHITESPACE) != 0) { + for (;;) { + UChar32 a = _current(); + if (!uprv_isRuleWhiteSpace(a)) break; + _advance(UTF_CHAR_LENGTH(a)); + } + } +} + +UnicodeString& RuleCharacterIterator::lookahead(UnicodeString& result) const { + if (buf != 0) { + buf->extract(bufPos, 0x7FFFFFFF, result); + } else { + text.extract(pos.getIndex(), 0x7FFFFFFF, result); + } + return result; +} + +void RuleCharacterIterator::jumpahead(int32_t count) { + _advance(count); +} + +UnicodeString& RuleCharacterIterator::toString(UnicodeString& result) const { + int32_t b = pos.getIndex(); + text.extract(0, b, result); + return result.append((UChar) 0x7C /*'|'*/).append(text, b, 0x7FFFFFFF); +} + +UChar32 RuleCharacterIterator::_current() const { + if (buf != 0) { + return buf->char32At(bufPos); + } else { + int i = pos.getIndex(); + return (i < text.length()) ? text.char32At(i) : (UChar32)DONE; + } +} + +void RuleCharacterIterator::_advance(int32_t count) { + if (buf != 0) { + bufPos += count; + if (bufPos == buf->length()) { + buf = 0; + } + } else { + pos.setIndex(pos.getIndex() + count); + if (pos.getIndex() > text.length()) { + pos.setIndex(text.length()); + } + } +} + +U_NAMESPACE_END + +//eof diff --git a/icuSources/common/ruleiter.h b/icuSources/common/ruleiter.h new file mode 100644 index 00000000..736b54ed --- /dev/null +++ b/icuSources/common/ruleiter.h @@ -0,0 +1,231 @@ +/* +********************************************************************** +* Copyright (c) 2003, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Author: Alan Liu +* Created: September 24 2003 +* Since: ICU 2.8 +********************************************************************** +*/ +#ifndef _RULEITER_H_ +#define _RULEITER_H_ + +#include "unicode/utypes.h" + +U_NAMESPACE_BEGIN + +class UnicodeString; +class ParsePosition; +class SymbolTable; + +/** + * An iterator that returns 32-bit code points. This class is deliberately + * not related to any of the ICU character iterator classes + * in order to minimize complexity. + * @author Alan Liu + * @since ICU 2.8 + */ +class U_COMMON_API RuleCharacterIterator { + + // TODO: Ideas for later. (Do not implement if not needed, lest the + // code coverage numbers go down due to unused methods.) + // 1. Add a copy constructor, operator==() method. + // 2. Rather than return DONE, throw an exception if the end + // is reached -- this is an alternate usage model, probably not useful. + +private: + /** + * Text being iterated. + */ + const UnicodeString& text; + + /** + * Position of iterator. + */ + ParsePosition& pos; + + /** + * Symbol table used to parse and dereference variables. May be 0. + */ + const SymbolTable* sym; + + /** + * Current variable expansion, or 0 if none. + */ + const UnicodeString* buf; + + /** + * Position within buf. Meaningless if buf == 0. + */ + int32_t bufPos; + +public: + /** + * Value returned when there are no more characters to iterate. + */ + enum { DONE = -1 }; + + /** + * Bitmask option to enable parsing of variable names. If (options & + * PARSE_VARIABLES) != 0, then an embedded variable will be expanded to + * its value. Variables are parsed using the SymbolTable API. + */ + enum { PARSE_VARIABLES = 1 }; + + /** + * Bitmask option to enable parsing of escape sequences. If (options & + * PARSE_ESCAPES) != 0, then an embedded escape sequence will be expanded + * to its value. Escapes are parsed using Utility.unescapeAt(). + */ + enum { PARSE_ESCAPES = 2 }; + + /** + * Bitmask option to enable skipping of whitespace. If (options & + * SKIP_WHITESPACE) != 0, then whitespace characters will be silently + * skipped, as if they were not present in the input. Whitespace + * characters are defined by UCharacterProperty.isRuleWhiteSpace(). + */ + enum { SKIP_WHITESPACE = 4 }; + + /** + * Constructs an iterator over the given text, starting at the given + * position. + * @param text the text to be iterated + * @param sym the symbol table, or null if there is none. If sym is null, + * then variables will not be deferenced, even if the PARSE_VARIABLES + * option is set. + * @param pos upon input, the index of the next character to return. If a + * variable has been dereferenced, then pos will not increment as + * characters of the variable value are iterated. + */ + RuleCharacterIterator(const UnicodeString& text, const SymbolTable* sym, + ParsePosition& pos); + + /** + * Returns true if this iterator has no more characters to return. + */ + UBool atEnd() const; + + /** + * Returns the next character using the given options, or DONE if there + * are no more characters, and advance the position to the next + * character. + * @param options one or more of the following options, bitwise-OR-ed + * together: PARSE_VARIABLES, PARSE_ESCAPES, SKIP_WHITESPACE. + * @param isEscaped output parameter set to TRUE if the character + * was escaped + * @param ec input-output error code. An error will only be set by + * this routing if options includes PARSE_VARIABLES and an unknown + * variable name is seen, or if options includes PARSE_ESCAPES and + * an invalid escape sequence is seen. + * @return the current 32-bit code point, or DONE + */ + UChar32 next(int32_t options, UBool& isEscaped, UErrorCode& ec); + + /** + * Returns true if this iterator is currently within a variable expansion. + */ + inline UBool inVariable() const; + + /** + * An opaque object representing the position of a RuleCharacterIterator. + */ + struct Pos { + private: + const UnicodeString* buf; + int32_t pos; + int32_t bufPos; + friend class RuleCharacterIterator; + }; + + /** + * Sets an object which, when later passed to setPos(), will + * restore this iterator's position. Usage idiom: + * + * RuleCharacterIterator iterator = ...; + * RuleCharacterIterator::Pos pos; + * iterator.getPos(pos); + * for (;;) { + * iterator.getPos(pos); + * int c = iterator.next(...); + * ... + * } + * iterator.setPos(pos); + * + * @param p a position object to be set to this iterator's + * current position. + */ + void getPos(Pos& p) const; + + /** + * Restores this iterator to the position it had when getPos() + * set the given object. + * @param p a position object previously set by getPos() + */ + void setPos(const Pos& p); + + /** + * Skips ahead past any ignored characters, as indicated by the given + * options. This is useful in conjunction with the lookahead() method. + * + * Currently, this only has an effect for SKIP_WHITESPACE. + * @param options one or more of the following options, bitwise-OR-ed + * together: PARSE_VARIABLES, PARSE_ESCAPES, SKIP_WHITESPACE. + */ + void skipIgnored(int32_t options); + + /** + * Returns a string containing the remainder of the characters to be + * returned by this iterator, without any option processing. If the + * iterator is currently within a variable expansion, this will only + * extend to the end of the variable expansion. This method is provided + * so that iterators may interoperate with string-based APIs. The typical + * sequence of calls is to call skipIgnored(), then call lookahead(), then + * parse the string returned by lookahead(), then call jumpahead() to + * resynchronize the iterator. + * @param result a string to receive the characters to be returned + * by future calls to next() + * @return a reference to result + */ + UnicodeString& lookahead(UnicodeString& result) const; + + /** + * Advances the position by the given number of 16-bit code units. + * This is useful in conjunction with the lookahead() method. + * @param count the number of 16-bit code units to jump over + */ + void jumpahead(int32_t count); + + /** + * Returns a string representation of this object, consisting of the + * characters being iterated, with a '|' marking the current position. + * Position within an expanded variable is not indicated. + * @param result output parameter to receive a string + * representation of this object + */ + UnicodeString& toString(UnicodeString& result) const; + +private: + /** + * Returns the current 32-bit code point without parsing escapes, parsing + * variables, or skipping whitespace. + * @return the current 32-bit code point + */ + UChar32 _current() const; + + /** + * Advances the position by the given amount. + * @param count the number of 16-bit code units to advance past + */ + void _advance(int32_t count); +}; + +inline UBool RuleCharacterIterator::inVariable() const { + return buf != 0; +} + +U_NAMESPACE_END + +#endif // _RULEITER_H_ +//eof diff --git a/icuSources/common/schriter.cpp b/icuSources/common/schriter.cpp index 2711651c..29f15f97 100644 --- a/icuSources/common/schriter.cpp +++ b/icuSources/common/schriter.cpp @@ -1,6 +1,6 @@ /* ****************************************************************************** -* Copyright (C) 1998-2001, International Business Machines Corporation and * +* Copyright (C) 1998-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ****************************************************************************** * @@ -18,7 +18,7 @@ U_NAMESPACE_BEGIN -const char StringCharacterIterator::fgClassID = 0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(StringCharacterIterator) StringCharacterIterator::StringCharacterIterator() : UCharCharacterIterator(), diff --git a/icuSources/common/sprpimpl.h b/icuSources/common/sprpimpl.h index c545fe3e..50d7c350 100644 --- a/icuSources/common/sprpimpl.h +++ b/icuSources/common/sprpimpl.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * - * Copyright (C) 2003, International Business Machines + * Copyright (C) 2003-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -18,84 +18,100 @@ #define SPRPIMPL_H #include "unicode/utypes.h" + +#if !UCONFIG_NO_IDNA + #include "unicode/ustring.h" #include "unicode/parseerr.h" +#include "unicode/usprep.h" +#include "unicode/udata.h" +#include "utrie.h" +#include "udataswp.h" -#if !UCONFIG_NO_IDNA +#define _SPREP_DATA_TYPE "spp" + +enum UStringPrepType{ + USPREP_UNASSIGNED = 0x0000 , + USPREP_MAP = 0x0001 , + USPREP_PROHIBITED = 0x0002 , + USPREP_DELETE = 0x0003 , + USPREP_TYPE_LIMIT = 0x0004 +}; + +typedef enum UStringPrepType UStringPrepType; + +#ifdef USPREP_TYPE_NAMES_ARRAY +static const char* usprepTypeNames[] ={ + "UNASSIGNED" , + "MAP" , + "PROHIBITED" , + "DELETE", + "TYPE_LIMIT" +}; +#endif enum{ - UIDNA_NO_VALUE = 0x0000 , - UIDNA_UNASSIGNED = 0x0001 , - UIDNA_PROHIBITED = 0x0002 , - UIDNA_MAP_NFKC = 0x0003 , - UIDNA_LABEL_SEPARATOR = 0x0004 + _SPREP_NORMALIZATION_ON = 0x0001, + _SPREP_CHECK_BIDI_ON = 0x0002 }; + enum{ - _IDNA_LENGTH_IN_MAPPING_TABLE = 0x0003 /*11*/ + _SPREP_TYPE_THRESHOLD = 0xFFF0, + _SPREP_MAX_INDEX_VALUE = 0x3FBF, /*16139*/ + _SPREP_MAX_INDEX_TOP_LENGTH = 0x0003 }; + /* indexes[] value names */ enum { - _IDNA_INDEX_TRIE_SIZE, /* number of bytes in normalization trie */ - _IDNA_INDEX_MAPPING_DATA_SIZE, /* The array that contains the mapping */ - _IDNA_INDEX_TOP=3 /* changing this requires a new formatVersion */ + _SPREP_INDEX_TRIE_SIZE = 0, /* number of bytes in StringPrep trie */ + _SPREP_INDEX_MAPPING_DATA_SIZE = 1, /* The array that contains the mapping */ + _SPREP_NORM_CORRECTNS_LAST_UNI_VERSION = 2, /* The index of Unicode version of last entry in NormalizationCorrections.txt */ + _SPREP_ONE_UCHAR_MAPPING_INDEX_START = 3, /* The starting index of 1 UChar mapping index in the mapping data array */ + _SPREP_TWO_UCHARS_MAPPING_INDEX_START = 4, /* The starting index of 2 UChars mapping index in the mapping data array */ + _SPREP_THREE_UCHARS_MAPPING_INDEX_START = 5, /* The starting index of 3 UChars mapping index in the mapping data array */ + _SPREP_FOUR_UCHARS_MAPPING_INDEX_START = 6, /* The starting index of 4 UChars mapping index in the mapping data array */ + _SPREP_OPTIONS = 7, /* Bit set of options to turn on in the profile */ + _SPREP_INDEX_TOP=16 /* changing this requires a new formatVersion */ }; -enum { - _IDNA_MAPPING_DATA_SIZE = 2000, - _IDNA_MAP_TO_NOTHING = 0x7FF +typedef struct UStringPrepKey UStringPrepKey; + + +struct UStringPrepKey{ + char* name; + char* path; +}; + +struct UStringPrepProfile{ + int32_t indexes[_SPREP_INDEX_TOP]; + UTrie sprepTrie; + const uint16_t* mappingData; + UDataMemory* sprepData; + UBool isDataLoaded; + int32_t refCount; + UBool doNFKC; + UBool checkBiDi; }; -#if defined(XP_CPLUSPLUS) -static inline -void uprv_syntaxError(const UChar* rules, +/** + * Helper function for populating the UParseError struct + * @internal + */ +U_CAPI void U_EXPORT2 +uprv_syntaxError(const UChar* rules, int32_t pos, int32_t rulesLen, - UParseError* parseError) -{ - if(parseError == NULL){ - return; - } - if(pos == rulesLen && rulesLen >0){ - pos--; - } - parseError->offset = pos; - parseError->line = 0 ; // we are not using line numbers - - // for pre-context - int32_t start = (pos <=U_PARSE_CONTEXT_LEN)? 0 : (pos - (U_PARSE_CONTEXT_LEN-1)); - int32_t stop = pos; - - u_memcpy(parseError->preContext,rules+start,stop-start); - //null terminate the buffer - parseError->preContext[stop-start] = 0; - - //for post-context - start = pos; - if(startpostContext,rules+start,stop-start); - //null terminate the buffer - parseError->postContext[stop-start]= 0; - } - -} -#endif + UParseError* parseError); -/* error codes for prototyping -#define U_IDNA_ERROR_START U_ERROR_LIMIT -#define U_IDNA_PROHIBITED_CODEPOINT_FOUND_ERROR ((UErrorCode)(U_IDNA_ERROR_START + 1)) -#define U_IDNA_UNASSIGNED_CODEPOINT_FOUND_ERROR ((UErrorCode)(U_IDNA_ERROR_START + 2)) -#define U_IDNA_CHECK_BIDI_ERROR ((UErrorCode)(U_IDNA_ERROR_START + 3)) -#define U_IDNA_STD3_ASCII_RULES_ERROR ((UErrorCode)(U_IDNA_ERROR_START + 4)) -#define U_IDNA_ACE_PREFIX_ERROR ((UErrorCode)(U_IDNA_ERROR_START + 5)) -#define U_IDNA_VERIFICATION_ERROR ((UErrorCode)(U_IDNA_ERROR_START + 6)) -#define U_IDNA_LABEL_TOO_LONG_ERROR ((UErrorCode)(U_IDNA_ERROR_START + 8)) -*/ + +/** + * Swap StringPrep .spp profile data. See udataswp.h. + * @internal + */ +U_CAPI int32_t U_EXPORT2 +usprep_swap(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode); #endif /* #if !UCONFIG_NO_IDNA */ diff --git a/icuSources/common/strprep.cpp b/icuSources/common/strprep.cpp deleted file mode 100644 index 4ab0d0da..00000000 --- a/icuSources/common/strprep.cpp +++ /dev/null @@ -1,513 +0,0 @@ -/* - ******************************************************************************* - * - * Copyright (C) 2003, International Business Machines - * Corporation and others. All Rights Reserved. - * - ******************************************************************************* - * file name: strprep.cpp - * encoding: US-ASCII - * tab size: 8 (not used) - * indentation:4 - * - * created on: 2003feb1 - * created by: Ram Viswanadha - */ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_IDNA - -#include "strprep.h" -#include "utrie.h" -#include "umutex.h" -#include "cmemory.h" -#include "sprpimpl.h" -#include "nameprep.h" -#include "ustr_imp.h" -#include "unicode/unorm.h" -#include "unicode/udata.h" -#include "unicode/ustring.h" - -static const uint16_t* mappingData = NULL; -static int32_t indexes[_IDNA_INDEX_TOP]={ 0 }; -static UBool _isDataLoaded = FALSE; -static UTrie idnTrie={ 0,0,0,0,0,0,0 }; -static UDataMemory* idnData=NULL; -static UErrorCode dataErrorCode =U_ZERO_ERROR; -/* file definitions */ -static const char DATA_NAME[] = "uidna"; -static const char DATA_TYPE[] = "icu"; - -U_CFUNC UBool -ustrprep_cleanup() { - if(idnData!=NULL) { - udata_close(idnData); - idnData=NULL; - } - dataErrorCode=U_ZERO_ERROR; - _isDataLoaded=FALSE; - - return TRUE; -} - -U_CDECL_BEGIN -static UBool U_CALLCONV -isAcceptable(void * /* context */, - const char * /* type */, - const char * /* name */, - const UDataInfo *pInfo) { - if( - pInfo->size>=20 && - pInfo->isBigEndian==U_IS_BIG_ENDIAN && - pInfo->charsetFamily==U_CHARSET_FAMILY && - pInfo->dataFormat[0]==0x49 && /* dataFormat="IDNA" 0x49, 0x44, 0x4e, 0x41 */ - pInfo->dataFormat[1]==0x44 && - pInfo->dataFormat[2]==0x4e && - pInfo->dataFormat[3]==0x41 && - pInfo->formatVersion[0]==2 && - pInfo->formatVersion[2]==UTRIE_SHIFT && - pInfo->formatVersion[3]==UTRIE_INDEX_SHIFT - ) { - return TRUE; - } else { - return FALSE; - } -} - - - -static int32_t U_CALLCONV -getFoldingOffset(uint32_t data) { - if(data&0x8000) { - return (int32_t)(data&0x7fff); - } else { - return 0; - } -} - -U_CDECL_END - -static UBool U_CALLCONV -loadData(UErrorCode &errorCode) { - /* load Unicode IDNA data from file */ - UBool isCached; - - /* do this because double-checked locking is broken */ - umtx_lock(NULL); - isCached=_isDataLoaded; - umtx_unlock(NULL); - - if(!isCached) { - UTrie _idnTrie={ 0,0,0,0,0,0,0 }; - UDataMemory *data; - const int32_t *p=NULL; - const uint8_t *pb; - - if(&errorCode==NULL || U_FAILURE(errorCode)) { - return 0; - } - - /* open the data outside the mutex block */ - //TODO: change the path - data=udata_openChoice(NULL, DATA_TYPE, DATA_NAME, isAcceptable, NULL, &errorCode); - dataErrorCode=errorCode; - if(U_FAILURE(errorCode)) { - return _isDataLoaded=FALSE; - } - - p=(const int32_t *)udata_getMemory(data); - pb=(const uint8_t *)(p+_IDNA_INDEX_TOP); - utrie_unserialize(&_idnTrie, pb, p[_IDNA_INDEX_TRIE_SIZE], &errorCode); - _idnTrie.getFoldingOffset=getFoldingOffset; - - - if(U_FAILURE(errorCode)) { - dataErrorCode=errorCode; - udata_close(data); - return _isDataLoaded=FALSE; - } - - /* in the mutex block, set the data for this process */ - umtx_lock(NULL); - if(idnData==NULL) { - idnData=data; - data=NULL; - uprv_memcpy(&indexes, p, sizeof(indexes)); - uprv_memcpy(&idnTrie, &_idnTrie, sizeof(UTrie)); - } else { - p=(const int32_t *)udata_getMemory(idnData); - } - umtx_unlock(NULL); - /* initialize some variables */ - mappingData=(uint16_t *)((uint8_t *)(p+_IDNA_INDEX_TOP)+indexes[_IDNA_INDEX_TRIE_SIZE]); - - _isDataLoaded = TRUE; - - /* if a different thread set it first, then close the extra data */ - if(data!=NULL) { - udata_close(data); /* NULL if it was set correctly */ - } - } - - return _isDataLoaded; -} - -// ***************************************************************************** -// class StringPrep -// ***************************************************************************** - -U_NAMESPACE_BEGIN - -const char StringPrep::fgClassID=0; - -UBool StringPrep::isDataLoaded(UErrorCode& status){ - if(U_FAILURE(status)){ - return FALSE; - } - if(_isDataLoaded==FALSE && U_FAILURE(dataErrorCode)){ - status = dataErrorCode; - return FALSE; - } - loadData(dataErrorCode); - if(U_FAILURE(dataErrorCode)){ - status = dataErrorCode; - return FALSE; - } - return TRUE; -} - - -StringPrep* StringPrep::createDefaultInstance(UErrorCode& status){ - StringPrep* strprep = new StringPrep(); - if(!isDataLoaded(status)){ - delete strprep; - return NULL; - } - return strprep; -} - -StringPrep* StringPrep::createNameprepInstance(UErrorCode& status){ - StringPrep* strprep = new NamePrep(status); - if(!isDataLoaded(status)){ - delete strprep; - return NULL; - } - return strprep; -} - -UBool StringPrep::isNotProhibited(UChar32 /*ch*/){ - return FALSE; -} -UBool StringPrep::isUnassigned(UChar32 ch){ - - uint32_t result; - UTRIE_GET16(&idnTrie,ch,result); - return (result == UIDNA_UNASSIGNED); - -} - - -static inline void getValues(uint32_t result, int8_t& flag, - int8_t& length, int32_t& index){ - /* first 3 bits contain the flag */ - flag = (int8_t) (result & 0x07); - /* next 2 bits contain the length */ - length = (int8_t) ((result>>3) & 0x03); - /* next 10 bits contain the index */ - index = (result>> 5); -} - - -int32_t StringPrep::map(const UChar* src, int32_t srcLength, - UChar* dest, int32_t destCapacity, - UBool allowUnassigned, - UParseError* parseError, - UErrorCode& status ){ - - uint32_t result; - int8_t flag; - int8_t length; - int32_t index; - int32_t destIndex=0; - int32_t srcIndex=0; - - // check error status - if(U_FAILURE(status)){ - return 0; - } - - //check arguments - if(src==NULL || srcLength<-1 || (dest==NULL && destCapacity!=0)) { - status=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - if(srcLength == -1){ - srcLength = u_strlen(src); - } - - for(;srcIndex through ) are examples of - this because they have bidirectional category "EN". - - In any profile that specifies bidirectional character handling, all - three of the following requirements MUST be met: - - 1) The characters in section 5.8 MUST be prohibited. - - 2) If a string contains any RandALCat character, the string MUST NOT - contain any LCat character. - - 3) If a string contains any RandALCat character, a RandALCat - character MUST be the first character of the string, and a - RandALCat character MUST be the last character of the string. -*/ - -#define MAX_STACK_BUFFER_SIZE 300 - -int32_t StringPrep::process(const UChar* src, int32_t srcLength, - UChar* dest, int32_t destCapacity, - UBool allowUnassigned, - UParseError* parseError, - UErrorCode& status ){ - // check error status - if(U_FAILURE(status)){ - return 0; - } - - //check arguments - if(src==NULL || srcLength<-1 || (dest==NULL && destCapacity!=0)) { - status=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - UChar b1Stack[MAX_STACK_BUFFER_SIZE], b2Stack[MAX_STACK_BUFFER_SIZE]; - UChar *b1 = b1Stack, *b2 = b2Stack; - int32_t b1Len, b2Len=0, - b1Capacity = MAX_STACK_BUFFER_SIZE , - b2Capacity = MAX_STACK_BUFFER_SIZE; - uint32_t result; - int32_t b2Index = 0; - int8_t flag; - int8_t length; - int32_t index; - UCharDirection direction=U_CHAR_DIRECTION_COUNT, firstCharDir=U_CHAR_DIRECTION_COUNT; - UBool leftToRight=FALSE, rightToLeft=FALSE; - int32_t rtlPos =-1, ltrPos =-1; - - b1Len = map(src,srcLength, b1, b1Capacity,allowUnassigned, parseError, status); - - if(status == U_BUFFER_OVERFLOW_ERROR){ - // redo processing of string - /* we do not have enough room so grow the buffer*/ - b1 = (UChar*) uprv_malloc(b1Len * U_SIZEOF_UCHAR); - if(b1==NULL){ - status = U_MEMORY_ALLOCATION_ERROR; - goto CLEANUP; - } - - status = U_ZERO_ERROR; // reset error - - b1Len = map(src,srcLength, b1, b1Len,allowUnassigned, parseError, status); - - } - - b2Len = normalize(b1,b1Len, b2,b2Capacity,status); - - if(status == U_BUFFER_OVERFLOW_ERROR){ - // redo processing of string - /* we do not have enough room so grow the buffer*/ - b2 = (UChar*) uprv_malloc(b2Len * U_SIZEOF_UCHAR); - if(b2==NULL){ - status = U_MEMORY_ALLOCATION_ERROR; - goto CLEANUP; - } - - status = U_ZERO_ERROR; // reset error - - b2Len = normalize(b2,b2Len, b2,b2Len,status); - - } - - if(U_FAILURE(status)){ - goto CLEANUP; - } - - UChar32 ch; - - for(; b2IndexltrPos) ? rtlPos : ltrPos, b2Len, parseError); - goto CLEANUP; - } - - //satisfy 3 - if( rightToLeft == TRUE && - !((firstCharDir == U_RIGHT_TO_LEFT || firstCharDir == U_RIGHT_TO_LEFT_ARABIC) && - (direction == U_RIGHT_TO_LEFT || direction == U_RIGHT_TO_LEFT_ARABIC)) - ){ - status = U_IDNA_CHECK_BIDI_ERROR; - uprv_syntaxError(b2, rtlPos, b2Len, parseError); - return FALSE; - } - - if(b2Len <= destCapacity){ - uprv_memmove(dest,b2, b2Len*U_SIZEOF_UCHAR); - } - -CLEANUP: - if(b1!=b1Stack){ - uprv_free(b1); - } - if(b2!=b2Stack){ - uprv_free(b2); - } - return u_terminateUChars(dest, destCapacity, b2Len, &status); -} - - -UBool StringPrep::isLabelSeparator(UChar32 ch, UErrorCode& status){ - // check error status - if(U_FAILURE(status)){ - return FALSE; - } - - if(isDataLoaded(status)){ - int32_t result; - UTRIE_GET16(&idnTrie,ch, result); - if( (result & 0x07) == UIDNA_LABEL_SEPARATOR){ - return TRUE; - } - } - return FALSE; -} - -U_NAMESPACE_END - -#endif /* #if !UCONFIG_NO_IDNA */ diff --git a/icuSources/common/strprep.h b/icuSources/common/strprep.h deleted file mode 100644 index 5b381a4c..00000000 --- a/icuSources/common/strprep.h +++ /dev/null @@ -1,365 +0,0 @@ -/* - ******************************************************************************* - * - * Copyright (C) 2003, International Business Machines - * Corporation and others. All Rights Reserved. - * - ******************************************************************************* - * file name: strprep.h - * encoding: US-ASCII - * tab size: 8 (not used) - * indentation:4 - * - * created on: 2003feb1 - * created by: Ram Viswanadha - */ - -#ifndef STRPREP_H -#define STRPREP_H - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_IDNA - -#include "unicode/uobject.h" -#include "unicode/uniset.h" -#include "unicode/parseerr.h" - -U_NAMESPACE_BEGIN - -/**\file - * - * This API implements RF 3454 StringPrep standard. - * - * The steps for preparing strings are: - * - * 1) Map -- For each character in the input, check if it has a mapping - * and, if so, replace it with its mapping. - *
    - *
  • Delete certain codepoints from the input because their - * presence or absence in the protocol identifies should not - * make two strings different
  • - *
  • Case Mapings - *
    If Normalization is turned off - *
    Get mappings from case map tables - *
    else - *
    Get mappings from case map tables for normalization - *
    Use u_getFC_NFKC_Closure for obtaining extra mappings - *
  • - *
- * 2) Normalize -- Possibly normalize the result of step 1 using Unicode - * normalization NFKC. - * - * 3) Prohibit -- Check for any characters that are not allowed in the - * output. If any are found, return an error. - * - * 4) Check bidi -- Possibly check for right-to-left characters, and if - * any are found, make sure that the whole string satisfies the - * requirements for bidirectional strings. If the string does not - * satisfy the requirements for bidirectional strings, return an - * error. - * - * Some StringPrep profiles: - * IDN: "Nameprep" http://www.ietf.org/rfc/rfc3491.txt - * XMPP Node Identifiers: "Nodeprep" http://www.ietf.org/internet-drafts/draft-ietf-xmpp-nodeprep-01.txt - * XMPP Resource Identifiers: "Resourceprep" http://www.ietf.org/internet-drafts/draft-ietf-xmpp-resourceprep-01.txt - * ANONYMOUS SASL tokens: "plain" http://www.ietf.org/internet-drafts/draft-ietf-sasl-anon-00.txt - * iSCSI http://www.ietf.org/internet-drafts/draft-ietf-ips-iscsi-string-prep-03.txt - */ -class StringPrep : public UObject{ - -protected: - UVersionInfo unicodeVersion; /** The Character repertoire version of this profile */ - UBool bidiCheck; /** Option to turn BiDi checking on */ - UBool doNFKC; /** Option to turn NFKC on */ - - /** - * Protected default constructor sub classes - */ - StringPrep(){}; - -public: - /** - * Destructor - */ - virtual inline ~StringPrep(){}; - - /** - * Map every character in input stream with mapping character - * in the mapping table and populate the output stream. - * For any individual character the mapping table may specify - * that that a character be mapped to nothing, mapped to one - * other character or to a string of other characters. - * - * @param src Pointer to UChar buffer containing a single label - * @param srcLength Number of characters in the source label - * @param dest Pointer to the destination buffer to receive the output - * @param destCapacity The capacity of destination array - * @param allowUnassigned Unassigned values can be converted to ASCII for query operations - * If TRUE unassigned values are treated as normal Unicode code point. - * If FALSE the operation fails with U_UNASSIGNED_CODE_POINT_FOUND error code. - * @param status ICU error code in/out parameter. - * Must fulfill U_SUCCESS before the function call. - * @return The number of UChars in the destination buffer - * - */ - virtual int32_t map(const UChar* src, int32_t srcLength, - UChar* dest, int32_t destCapacity, - UBool allowUnassigned, - UParseError* parseError, - UErrorCode& status ); - - /** - * Normalize the input stream using Normalization Form KC (NFKC) - * - * @param src Pointer to UChar buffer containing a single label - * @param srcLength Number of characters in the source label - * @param dest Pointer to the destination buffer to receive the output - * @param destCapacity The capacity of destination array - * @param status ICU error code in/out parameter. - * Must fulfill U_SUCCESS before the function call. - * @return The number of UChars in the destination buffer - * - * - */ - virtual int32_t normalize( const UChar* src, int32_t srcLength, - UChar* dest, int32_t destCapacity, - UErrorCode& status ); - - - /** - * Prepare the input stream with for use. This operation maps, normalizes(NFKC), - * checks for prohited and BiDi characters in the order defined by RFC 3454 - * - * @param src Pointer to UChar buffer containing a single label - * @param srcLength Number of characters in the source label - * @param dest Pointer to the destination buffer to receive the output - * @param destCapacity The capacity of destination array - * @param allowUnassigned Unassigned values can be converted to ASCII for query operations - * If TRUE unassigned values are treated as normal Unicode code point. - * If FALSE the operation fails with U_UNASSIGNED_CODE_POINT error code. - * @param status ICU error code in/out parameter. - * Must fulfill U_SUCCESS before the function call. - * @return The number of UChars in the destination buffer - * - * - */ - virtual int32_t process(const UChar* src, int32_t srcLength, - UChar* dest, int32_t destCapacity, - UBool allowUnassigned, - UParseError* parseError, - UErrorCode& status ); - - /** - * Create a profile from prebuilt default Nameprep profile conforming to - * nameprep internet draft (http://www.ietf.org/html.charters/idn-charter.html). - * This is a built-in/unmodifiable profile. - * - * @param status ICU error code in/out parameter. - * Must fulfill U_SUCCESS before the function call. - * @return Pointer to StringPrep object that is created. Should be deleted by - * by caller - * - * - */ - static StringPrep* createNameprepInstance(UErrorCode& status); - - /** - * Create a profile from prebuilt default StringPrep profile conforming to - * RFC 3454 (ftp://ftp.rfc-editor.org/in-notes/rfc3454.txt). - * User defined profiles can be created by getting the default profile and - * adding mappings, removing mappings, turning options ON/OFF and prohibiting - * characters from the output. - * - * @param status ICU error code in/out parameter. - * Must fulfill U_SUCCESS before the function call. - * @return Pointer to StringPrep object that is created. Should be deleted by - * the caller. - * - * - */ - static StringPrep* createDefaultInstance(UErrorCode& status); - - /** - * Ascertain if the given code point is a Letter/Digit/Hyphen in the ASCII range - * - * @return TRUE is the code point is a Letter/Digit/Hyphen - * - * - */ - static inline UBool isLDHChar(UChar32 ch); - - /** - * Ascertain if the given code point is a label separator as specified by IDNA - * - * @return TRUE is the code point is a label separator - * - * - */ - virtual UBool isLabelSeparator(UChar32 ch, UErrorCode& status); - - /** - * Get the BiDi option of this profile - * - * - */ - inline UBool getCheckBiDi(); - - /** - * Get the normalization (NFKC) option of this profile - * - * @return The normalization option - * - * - */ - inline UBool getNormalization(); - - /** - * Get the Unicode version which this profile - * conforms to - * - * - */ - inline void getUnicodeVersion(UVersionInfo& info); - -private: - // Boiler plate - - /** - * Copy constructor. - * - */ - StringPrep(const StringPrep&); - - /** - * Assignment operator. - * - */ - StringPrep& operator=(const StringPrep&); - - /** - * Return true if another object is semantically equal to this one. - * - * @param other the object to be compared with. - * @return true if another object is semantically equal to this one. - * - */ - UBool operator==(const StringPrep& other) const {return FALSE;}; - - /** - * Return true if another object is semantically unequal to this one. - * - * @param other the object to be compared with. - * @return true if another object is semantically unequal to this one. - * - */ - UBool operator!=(const StringPrep& other) const { return !operator==(other); } - -public: - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * - */ - static inline UClassID getStaticClassID(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * - */ - virtual inline UClassID getDynamicClassID() const; - -protected: - - /** - * Sub classes that slightly modify the default profile - * implement this method to remove characters to - * the prohibited list. The default implementation does not - * check if the data is loaded or not. The caller is responsible - * for checking for data. - * - */ - virtual UBool isNotProhibited(UChar32 ch); - - /** - * Sub classes that slightly modify the default profile - * implement this method to remove characters to - * the unassigned list. The default implementation does not - * check if the data is loaded or not. The caller is responsible - * for checking for data. - */ - virtual UBool isUnassigned(UChar32 ch); - - /** - * Ascertains if uidna.icu data file is loaded. - * If data is not loaded, loads the data file. - * - * - */ - static UBool isDataLoaded(UErrorCode& status); - -private: - - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; - -}; - -inline UBool StringPrep::getCheckBiDi(){ - return bidiCheck; -} - - -inline UBool StringPrep::getNormalization(){ - return doNFKC; -} - -inline void StringPrep::getUnicodeVersion(UVersionInfo& info){ - for(int32_t i=0; i< (int32_t)(sizeof(info)/sizeof(info[0])); i++){ - info[i] = unicodeVersion[i]; - } -} - -inline UClassID StringPrep::getStaticClassID() { - return (UClassID)&fgClassID; -} - -inline UClassID StringPrep::getDynamicClassID() const { - return getStaticClassID(); -} - -inline UBool StringPrep::isLDHChar(UChar32 ch){ - // high runner case - if(ch>0x007A){ - return FALSE; - } - //[\\u002D \\u0030-\\u0039 \\u0041-\\u005A \\u0061-\\u007A] - if( (ch==0x002D) || - (0x0030 <= ch && ch <= 0x0039) || - (0x0041 <= ch && ch <= 0x005A) || - (0x0061 <= ch && ch <= 0x007A) - ){ - return TRUE; - } - return FALSE; -} - -U_NAMESPACE_END - -#endif /* #if !UCONFIG_NO_IDNA */ - -#endif - -/* - * Hey, Emacs, please set the following: - * - * Local Variables: - * indent-tabs-mode: nil - * End: - * - */ diff --git a/icuSources/common/symtable.h b/icuSources/common/symtable.h deleted file mode 100644 index 0a11c118..00000000 --- a/icuSources/common/symtable.h +++ /dev/null @@ -1,77 +0,0 @@ -/* -********************************************************************** -* Copyright (c) 2000, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -* Date Name Description -* 02/04/00 aliu Creation. -********************************************************************** -*/ -#ifndef SYMTABLE_H -#define SYMTABLE_H - -#include "unicode/utypes.h" -#include "unicode/uobject.h" - -U_NAMESPACE_BEGIN - -class ParsePosition; -class UnicodeFunctor; -class UnicodeSet; -class UnicodeString; - -/** - * An interface that maps strings to objects. This interface defines - * both lookup protocol and parsing. This allows different components - * to share a symbol table and to handle name parsing uniformly. It - * is expected that client parse code look for the SYMBOL_REF - * character and, when seen, attempt to parse the characters after it - * using parseReference(). - * - *

Currently, RuleBasedTransliterator and UnicodeSet use this - * interface to share variable definitions. - */ -class SymbolTable /* not : public UObject because this is an interface/mixin class */ { -public: - - /** - * The character preceding a symbol reference name. - */ - enum { SYMBOL_REF = 0x0024 /*$*/ }; - - /** - * Destructor. - */ - virtual inline ~SymbolTable() {}; - - /** - * Lookup the characters associated with this string and return it. - * Return NULL if no such name exists. The resultant - * string may have length zero. - */ - virtual const UnicodeString* lookup(const UnicodeString& s) const = 0; - - /** - * Lookup the UnicodeMatcher associated with the given character, and - * return it. Return null if not found. - */ - virtual const UnicodeFunctor* lookupMatcher(UChar32 ch) const = 0; - - /** - * Parse a symbol reference name from the given string, starting - * at the given position. If no valid symbol reference name is - * found, return an empty string. - * @param text the text to parse for the name - * @param pos on entry, the index of the first character to parse. - * This is the character following the SYMBOL_REF character. On - * exit, the index after the last parsed character. - * @param limit the index after the last character to be parsed. - * @return the parsed name or an empty string. - */ - virtual UnicodeString parseReference(const UnicodeString& text, - ParsePosition& pos, int32_t limit) const = 0; -}; -U_NAMESPACE_END - - -#endif diff --git a/icuSources/common/uarrsort.c b/icuSources/common/uarrsort.c new file mode 100644 index 00000000..8bc967ce --- /dev/null +++ b/icuSources/common/uarrsort.c @@ -0,0 +1,236 @@ +/* +******************************************************************************* +* +* Copyright (C) 2003, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: uarrsort.c +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2003aug04 +* created by: Markus W. Scherer +* +* Internal function for sorting arrays. +*/ + +#include "unicode/utypes.h" +#include "cmemory.h" +#include "uarrsort.h" + +enum { + MIN_QSORT=9, /* from Knuth */ + STACK_ITEM_SIZE=200 +}; + +/* UComparator convenience implementations ---------------------------------- */ + +U_CAPI int32_t U_EXPORT2 +uprv_uint16Comparator(const void *context, const void *left, const void *right) { + return (int32_t)*(const uint16_t *)left - (int32_t)*(const uint16_t *)right; +} + +U_CAPI int32_t U_EXPORT2 +uprv_int32Comparator(const void *context, const void *left, const void *right) { + return *(const int32_t *)left - *(const int32_t *)right; +} + +U_CAPI int32_t U_EXPORT2 +uprv_uint32Comparator(const void *context, const void *left, const void *right) { + uint32_t l=*(const uint32_t *)left, r=*(const uint32_t *)right; + + /* compare directly because (l-r) would overflow the int32_t result */ + if(lr */ { + return 1; + } +} + +/* Straight insertion sort from Knuth vol. III, pg. 81 ---------------------- */ + +static void +doInsertionSort(char *array, int32_t start, int32_t limit, int32_t itemSize, + UComparator *cmp, const void *context, void *pv) { + int32_t i, j; + + for(j=start+1; jstart; --i) { + if(/* v>=array[i-1] */ cmp(context, pv, array+(i-1)*itemSize)>=0) { + break; + } + + /* array[i]=array[i-1]; */ + uprv_memcpy(array+i*itemSize, array+(i-1)*itemSize, itemSize); + } + + if(i!=j) { + /* array[i]=v; */ + uprv_memcpy(array+i*itemSize, pv, itemSize); + } + } +} + +static void +insertionSort(char *array, int32_t length, int32_t itemSize, + UComparator *cmp, const void *context, UErrorCode *pErrorCode) { + UAlignedMemory v[STACK_ITEM_SIZE/sizeof(UAlignedMemory)+1]; + void *pv; + + /* allocate an intermediate item variable (v) */ + if(itemSize<=STACK_ITEM_SIZE) { + pv=v; + } else { + pv=uprv_malloc(itemSize); + if(pv==NULL) { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + return; + } + } + + doInsertionSort(array, 0, length, itemSize, cmp, context, pv); + + if(pv!=v) { + uprv_free(pv); + } +} + +/* QuickSort ---------------------------------------------------------------- */ + +/* + * This implementation is semi-recursive: + * It recurses for the smaller sub-array to shorten the recursion depth, + * and loops for the larger sub-array. + * + * Loosely after QuickSort algorithms in + * Niklaus Wirth + * Algorithmen und Datenstrukturen mit Modula-2 + * B.G. Teubner Stuttgart + * 4. Auflage 1986 + * ISBN 3-519-02260-5 + */ +static void +subQuickSort(char *array, int32_t start, int32_t limit, int32_t itemSize, + UComparator *cmp, const void *context, + void *px, void *pw) { + int32_t left, right; + + /* start and left are inclusive, limit and right are exclusive */ + do { + if((start+MIN_QSORT)>=limit) { + doInsertionSort(array, start, limit, itemSize, cmp, context, px); + break; + } + + left=start; + right=limit; + + /* x=array[middle] */ + uprv_memcpy(px, array+((start+limit)/2)*itemSize, itemSize); + + do { + while(/* array[left]0 && array==NULL) || length<0 || itemSize<=0 || cmp==NULL) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return; + } + + if(length<=1) { + return; + } else if(length0 if left>right + * + * @internal + */ +typedef int32_t U_CALLCONV +UComparator(const void *context, const void *left, const void *right); +U_CDECL_END + +/** + * Array sorting function. + * Uses a UComparator for comparing array items to each other, and simple + * memory copying to move items. + * + * @param array The array to be sorted. + * @param length The number of items in the array. + * @param itemSize The size in bytes of each array item. + * @param cmp UComparator function used to compare two items each. + * @param context Application-specific pointer, passed through to the UComparator. + * @param sortStable If true, a stable sorting algorithm must be used. + * @param pErrorCode ICU in/out UErrorCode parameter. + * + * @internal + */ +U_CAPI void U_EXPORT2 +uprv_sortArray(void *array, int32_t length, int32_t itemSize, + UComparator *cmp, const void *context, + UBool sortStable, UErrorCode *pErrorCode); + +/** + * Convenience UComparator implementation for uint16_t arrays. + * @internal + */ +U_CAPI int32_t U_EXPORT2 +uprv_uint16Comparator(const void *context, const void *left, const void *right); + +/** + * Convenience UComparator implementation for int32_t arrays. + * @internal + */ +U_CAPI int32_t U_EXPORT2 +uprv_int32Comparator(const void *context, const void *left, const void *right); + +/** + * Convenience UComparator implementation for uint32_t arrays. + * @internal + */ +U_CAPI int32_t U_EXPORT2 +uprv_uint32Comparator(const void *context, const void *left, const void *right); + +#endif diff --git a/icuSources/common/uassert.h b/icuSources/common/uassert.h index 0a6080db..9b1a1416 100644 --- a/icuSources/common/uassert.h +++ b/icuSources/common/uassert.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 2002, International Business Machines +* Copyright (C) 2002-2003, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -21,8 +21,12 @@ #define U_ASSERT_H /* utypes.h is included to get the proper define for uint8_t */ #include "unicode/utypes.h" +#if U_RELEASE +#define U_ASSERT(exp) +#else #include #define U_ASSERT(exp) assert(exp) #endif +#endif diff --git a/icuSources/common/ubidi.c b/icuSources/common/ubidi.c index 63ee4fee..2e7713f0 100644 --- a/icuSources/common/ubidi.c +++ b/icuSources/common/ubidi.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1999-2001, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -107,28 +107,6 @@ * (L1) is not necessary in adjustWSLevels(). */ -/* prototypes --------------------------------------------------------------- */ - -static void -getDirProps(UBiDi *pBiDi, const UChar *text); - -static UBiDiDirection -resolveExplicitLevels(UBiDi *pBiDi); - -static UBiDiDirection -checkExplicitLevels(UBiDi *pBiDi, UErrorCode *pErrorCode); - -static UBiDiDirection -directionFromFlags(Flags flags); - -static void -resolveImplicitLevels(UBiDi *pBiDi, - int32_t start, int32_t limit, - DirProp sor, DirProp eor); - -static void -adjustWSLevels(UBiDi *pBiDi); - /* to avoid some conditional statements, use tiny constant arrays */ static const Flags flagLR[2]={ DIRPROP_FLAG(L), DIRPROP_FLAG(R) }; static const Flags flagE[2]={ DIRPROP_FLAG(LRE), DIRPROP_FLAG(RLE) }; @@ -281,199 +259,6 @@ ubidi_isInverse(UBiDi *pBiDi) { } } -/* ubidi_setPara ------------------------------------------------------------ */ - -U_CAPI void U_EXPORT2 -ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length, - UBiDiLevel paraLevel, UBiDiLevel *embeddingLevels, - UErrorCode *pErrorCode) { - UBiDiDirection direction; - - /* check the argument values */ - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return; - } else if(pBiDi==NULL || text==NULL || - ((UBIDI_MAX_EXPLICIT_LEVELtext=text; - pBiDi->length=length; - pBiDi->paraLevel=paraLevel; - pBiDi->direction=UBIDI_LTR; - pBiDi->trailingWSStart=length; /* the levels[] will reflect the WS run */ - - pBiDi->dirProps=NULL; - pBiDi->levels=NULL; - pBiDi->runs=NULL; - - if(length==0) { - /* - * For an empty paragraph, create a UBiDi object with the paraLevel and - * the flags and the direction set but without allocating zero-length arrays. - * There is nothing more to do. - */ - if(IS_DEFAULT_LEVEL(paraLevel)) { - pBiDi->paraLevel&=1; - } - if(paraLevel&1) { - pBiDi->flags=DIRPROP_FLAG(R); - pBiDi->direction=UBIDI_RTL; - } else { - pBiDi->flags=DIRPROP_FLAG(L); - pBiDi->direction=UBIDI_LTR; - } - - pBiDi->runCount=0; - return; - } - - pBiDi->runCount=-1; - - /* - * Get the directional properties, - * the flags bit-set, and - * determine the partagraph level if necessary. - */ - if(getDirPropsMemory(pBiDi, length)) { - pBiDi->dirProps=pBiDi->dirPropsMemory; - getDirProps(pBiDi, text); - } else { - *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - return; - } - - /* are explicit levels specified? */ - if(embeddingLevels==NULL) { - /* no: determine explicit levels according to the (Xn) rules */\ - if(getLevelsMemory(pBiDi, length)) { - pBiDi->levels=pBiDi->levelsMemory; - direction=resolveExplicitLevels(pBiDi); - } else { - *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - return; - } - } else { - /* set BN for all explicit codes, check that all levels are paraLevel..UBIDI_MAX_EXPLICIT_LEVEL */ - pBiDi->levels=embeddingLevels; - direction=checkExplicitLevels(pBiDi, pErrorCode); - if(U_FAILURE(*pErrorCode)) { - return; - } - } - - /* - * The steps after (X9) in the UBiDi algorithm are performed only if - * the paragraph text has mixed directionality! - */ - pBiDi->direction=direction; - switch(direction) { - case UBIDI_LTR: - /* make sure paraLevel is even */ - pBiDi->paraLevel=(UBiDiLevel)((pBiDi->paraLevel+1)&~1); - - /* all levels are implicitly at paraLevel (important for ubidi_getLevels()) */ - pBiDi->trailingWSStart=0; - break; - case UBIDI_RTL: - /* make sure paraLevel is odd */ - pBiDi->paraLevel|=1; - - /* all levels are implicitly at paraLevel (important for ubidi_getLevels()) */ - pBiDi->trailingWSStart=0; - break; - default: - /* - * If there are no external levels specified and there - * are no significant explicit level codes in the text, - * then we can treat the entire paragraph as one run. - * Otherwise, we need to perform the following rules on runs of - * the text with the same embedding levels. (X10) - * "Significant" explicit level codes are ones that actually - * affect non-BN characters. - * Examples for "insignificant" ones are empty embeddings - * LRE-PDF, LRE-RLE-PDF-PDF, etc. - */ - if(embeddingLevels==NULL && !(pBiDi->flags&DIRPROP_FLAG_MULTI_RUNS)) { - resolveImplicitLevels(pBiDi, 0, length, - GET_LR_FROM_LEVEL(pBiDi->paraLevel), - GET_LR_FROM_LEVEL(pBiDi->paraLevel)); - } else { - /* sor, eor: start and end types of same-level-run */ - UBiDiLevel *levels=pBiDi->levels; - int32_t start, limit=0; - UBiDiLevel level, nextLevel; - DirProp sor, eor; - - /* determine the first sor and set eor to it because of the loop body (sor=eor there) */ - level=pBiDi->paraLevel; - nextLevel=levels[0]; - if(levelparaLevel; - } - - /* determine eor from max(level, nextLevel); sor is last run's eor */ - if((level&~UBIDI_LEVEL_OVERRIDE)<(nextLevel&~UBIDI_LEVEL_OVERRIDE)) { - eor=GET_LR_FROM_LEVEL(nextLevel); - } else { - eor=GET_LR_FROM_LEVEL(level); - } - - /* if the run consists of overridden directional types, then there - are no implicit types to be resolved */ - if(!(level&UBIDI_LEVEL_OVERRIDE)) { - resolveImplicitLevels(pBiDi, start, limit, sor, eor); - } else { - /* remove the UBIDI_LEVEL_OVERRIDE flags */ - do { - levels[start++]&=~UBIDI_LEVEL_OVERRIDE; - } while(startisInverse) { - if(!ubidi_getRuns(pBiDi)) { - *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - return; - } - } - break; - } -} - /* perform (P2)..(P3) ------------------------------------------------------- */ /* @@ -520,6 +305,8 @@ getDirProps(UBiDi *pBiDi, const UChar *text) { break; } } + } else { + flags|=DIRPROP_FLAG_LR(pBiDi->paraLevel); } /* get the rest of the directional properties and the flags bits */ @@ -544,6 +331,19 @@ getDirProps(UBiDi *pBiDi, const UChar *text) { /* perform (X1)..(X9) ------------------------------------------------------- */ +/* determine if the text is mixed-directional or single-directional */ +static UBiDiDirection +directionFromFlags(Flags flags) { + /* if the text contains AN and neutrals, then some neutrals may become RTL */ + if(!(flags&MASK_RTL || ((flags&DIRPROP_FLAG(AN)) && (flags&MASK_POSSIBLE_N)))) { + return UBIDI_LTR; + } else if(!(flags&MASK_LTR)) { + return UBIDI_RTL; + } else { + return UBIDI_MIXED; + } +} + /* * Resolve the explicit levels as specified by explicit embedding codes. * Recalculate the flags to have them reflect the real properties @@ -596,7 +396,6 @@ getDirProps(UBiDi *pBiDi, const UChar *text) { * * This implementation assumes that UBIDI_MAX_EXPLICIT_LEVEL is odd. */ - static UBiDiDirection resolveExplicitLevels(UBiDi *pBiDi) { const DirProp *dirProps=pBiDi->dirProps; @@ -788,19 +587,6 @@ checkExplicitLevels(UBiDi *pBiDi, UErrorCode *pErrorCode) { return directionFromFlags(flags); } -/* determine if the text is mixed-directional or single-directional */ -static UBiDiDirection -directionFromFlags(Flags flags) { - /* if the text contains AN and neutrals, then some neutrals may become RTL */ - if(!(flags&MASK_RTL || ((flags&DIRPROP_FLAG(AN)) && (flags&MASK_POSSIBLE_N)))) { - return UBIDI_LTR; - } else if(!(flags&MASK_LTR)) { - return UBIDI_RTL; - } else { - return UBIDI_MIXED; - } -} - /* perform rules (Wn), (Nn), and (In) on a run of the text ------------------ */ /* @@ -1211,7 +997,198 @@ adjustWSLevels(UBiDi *pBiDi) { } } -/* -------------------------------------------------------------------------- */ +/* ubidi_setPara ------------------------------------------------------------ */ + +U_CAPI void U_EXPORT2 +ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length, + UBiDiLevel paraLevel, UBiDiLevel *embeddingLevels, + UErrorCode *pErrorCode) { + UBiDiDirection direction; + + /* check the argument values */ + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return; + } else if(pBiDi==NULL || text==NULL || + ((UBIDI_MAX_EXPLICIT_LEVELtext=text; + pBiDi->length=length; + pBiDi->paraLevel=paraLevel; + pBiDi->direction=UBIDI_LTR; + pBiDi->trailingWSStart=length; /* the levels[] will reflect the WS run */ + + pBiDi->dirProps=NULL; + pBiDi->levels=NULL; + pBiDi->runs=NULL; + + if(length==0) { + /* + * For an empty paragraph, create a UBiDi object with the paraLevel and + * the flags and the direction set but without allocating zero-length arrays. + * There is nothing more to do. + */ + if(IS_DEFAULT_LEVEL(paraLevel)) { + pBiDi->paraLevel&=1; + } + if(paraLevel&1) { + pBiDi->flags=DIRPROP_FLAG(R); + pBiDi->direction=UBIDI_RTL; + } else { + pBiDi->flags=DIRPROP_FLAG(L); + pBiDi->direction=UBIDI_LTR; + } + + pBiDi->runCount=0; + return; + } + + pBiDi->runCount=-1; + + /* + * Get the directional properties, + * the flags bit-set, and + * determine the partagraph level if necessary. + */ + if(getDirPropsMemory(pBiDi, length)) { + pBiDi->dirProps=pBiDi->dirPropsMemory; + getDirProps(pBiDi, text); + } else { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + return; + } + + /* are explicit levels specified? */ + if(embeddingLevels==NULL) { + /* no: determine explicit levels according to the (Xn) rules */\ + if(getLevelsMemory(pBiDi, length)) { + pBiDi->levels=pBiDi->levelsMemory; + direction=resolveExplicitLevels(pBiDi); + } else { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + return; + } + } else { + /* set BN for all explicit codes, check that all levels are paraLevel..UBIDI_MAX_EXPLICIT_LEVEL */ + pBiDi->levels=embeddingLevels; + direction=checkExplicitLevels(pBiDi, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return; + } + } + + /* + * The steps after (X9) in the UBiDi algorithm are performed only if + * the paragraph text has mixed directionality! + */ + pBiDi->direction=direction; + switch(direction) { + case UBIDI_LTR: + /* make sure paraLevel is even */ + pBiDi->paraLevel=(UBiDiLevel)((pBiDi->paraLevel+1)&~1); + + /* all levels are implicitly at paraLevel (important for ubidi_getLevels()) */ + pBiDi->trailingWSStart=0; + break; + case UBIDI_RTL: + /* make sure paraLevel is odd */ + pBiDi->paraLevel|=1; + + /* all levels are implicitly at paraLevel (important for ubidi_getLevels()) */ + pBiDi->trailingWSStart=0; + break; + default: + /* + * If there are no external levels specified and there + * are no significant explicit level codes in the text, + * then we can treat the entire paragraph as one run. + * Otherwise, we need to perform the following rules on runs of + * the text with the same embedding levels. (X10) + * "Significant" explicit level codes are ones that actually + * affect non-BN characters. + * Examples for "insignificant" ones are empty embeddings + * LRE-PDF, LRE-RLE-PDF-PDF, etc. + */ + if(embeddingLevels==NULL && !(pBiDi->flags&DIRPROP_FLAG_MULTI_RUNS)) { + resolveImplicitLevels(pBiDi, 0, length, + GET_LR_FROM_LEVEL(pBiDi->paraLevel), + GET_LR_FROM_LEVEL(pBiDi->paraLevel)); + } else { + /* sor, eor: start and end types of same-level-run */ + UBiDiLevel *levels=pBiDi->levels; + int32_t start, limit=0; + UBiDiLevel level, nextLevel; + DirProp sor, eor; + + /* determine the first sor and set eor to it because of the loop body (sor=eor there) */ + level=pBiDi->paraLevel; + nextLevel=levels[0]; + if(levelparaLevel; + } + + /* determine eor from max(level, nextLevel); sor is last run's eor */ + if((level&~UBIDI_LEVEL_OVERRIDE)<(nextLevel&~UBIDI_LEVEL_OVERRIDE)) { + eor=GET_LR_FROM_LEVEL(nextLevel); + } else { + eor=GET_LR_FROM_LEVEL(level); + } + + /* if the run consists of overridden directional types, then there + are no implicit types to be resolved */ + if(!(level&UBIDI_LEVEL_OVERRIDE)) { + resolveImplicitLevels(pBiDi, start, limit, sor, eor); + } else { + /* remove the UBIDI_LEVEL_OVERRIDE flags */ + do { + levels[start++]&=~UBIDI_LEVEL_OVERRIDE; + } while(startisInverse) { + if(!ubidi_getRuns(pBiDi)) { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + return; + } + } + break; + } +} U_CAPI UBiDiDirection U_EXPORT2 ubidi_getDirection(const UBiDi *pBiDi) { diff --git a/icuSources/common/ubidiln.c b/icuSources/common/ubidiln.c index 6680cc60..6731cf2a 100644 --- a/icuSources/common/ubidiln.c +++ b/icuSources/common/ubidiln.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1999-2001, International Business Machines +* Copyright (C) 1999-2003, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -76,21 +76,38 @@ * change the now shared levels for (L1). */ -/* prototypes --------------------------------------------------------------- */ +/* handle trailing WS (L1) -------------------------------------------------- */ +/* + * setTrailingWSStart() sets the start index for a trailing + * run of WS in the line. This is necessary because we do not modify + * the paragraph's levels array that we just point into. + * Using trailingWSStart is another form of performing (L1). + * + * To make subsequent operations easier, we also include the run + * before the WS if it is at the paraLevel - we merge the two here. + */ static void -setTrailingWSStart(UBiDi *pBiDi); +setTrailingWSStart(UBiDi *pBiDi) { + /* pBiDi->direction!=UBIDI_MIXED */ -static void -getSingleRun(UBiDi *pBiDi, UBiDiLevel level); + const DirProp *dirProps=pBiDi->dirProps; + UBiDiLevel *levels=pBiDi->levels; + int32_t start=pBiDi->length; + UBiDiLevel paraLevel=pBiDi->paraLevel; -static void -reorderLine(UBiDi *pBiDi, UBiDiLevel minLevel, UBiDiLevel maxLevel); + /* go backwards across all WS, BN, explicit codes */ + while(start>0 && DIRPROP_FLAG(dirProps[start-1])&MASK_WS) { + --start; + } -static UBool -prepareReorder(const UBiDiLevel *levels, int32_t length, - int32_t *indexMap, - UBiDiLevel *pMinLevel, UBiDiLevel *pMaxLevel); + /* if the WS run can be merged with the previous run then do so here */ + while(start>0 && levels[start-1]==paraLevel) { + --start; + } + + pBiDi->trailingWSStart=start; +} /* ubidi_setLine ------------------------------------------------------------ */ @@ -295,39 +312,6 @@ ubidi_getLogicalRun(const UBiDi *pBiDi, int32_t logicalStart, } } -/* handle trailing WS (L1) -------------------------------------------------- */ - -/* - * setTrailingWSStart() sets the start index for a trailing - * run of WS in the line. This is necessary because we do not modify - * the paragraph's levels array that we just point into. - * Using trailingWSStart is another form of performing (L1). - * - * To make subsequent operations easier, we also include the run - * before the WS if it is at the paraLevel - we merge the two here. - */ -static void -setTrailingWSStart(UBiDi *pBiDi) { - /* pBiDi->direction!=UBIDI_MIXED */ - - const DirProp *dirProps=pBiDi->dirProps; - UBiDiLevel *levels=pBiDi->levels; - int32_t start=pBiDi->length; - UBiDiLevel paraLevel=pBiDi->paraLevel; - - /* go backwards across all WS, BN, explicit codes */ - while(start>0 && DIRPROP_FLAG(dirProps[start-1])&MASK_WS) { - --start; - } - - /* if the WS run can be merged with the previous run then do so here */ - while(start>0 && levels[start-1]==paraLevel) { - --start; - } - - pBiDi->trailingWSStart=start; -} - /* runs API functions ------------------------------------------------------- */ U_CAPI int32_t U_EXPORT2 @@ -367,6 +351,144 @@ ubidi_getVisualRun(UBiDi *pBiDi, int32_t runIndex, } } +/* in trivial cases there is only one trivial run; called by ubidi_getRuns() */ +static void +getSingleRun(UBiDi *pBiDi, UBiDiLevel level) { + /* simple, single-run case */ + pBiDi->runs=pBiDi->simpleRuns; + pBiDi->runCount=1; + + /* fill and reorder the single run */ + pBiDi->runs[0].logicalStart=MAKE_INDEX_ODD_PAIR(0, level); + pBiDi->runs[0].visualLimit=pBiDi->length; +} + +/* reorder the runs array (L2) ---------------------------------------------- */ + +/* + * Reorder the same-level runs in the runs array. + * Here, runCount>1 and maxLevel>=minLevel>=paraLevel. + * All the visualStart fields=logical start before reordering. + * The "odd" bits are not set yet. + * + * Reordering with this data structure lends itself to some handy shortcuts: + * + * Since each run is moved but not modified, and since at the initial maxLevel + * each sequence of same-level runs consists of only one run each, we + * don't need to do anything there and can predecrement maxLevel. + * In many simple cases, the reordering is thus done entirely in the + * index mapping. + * Also, reordering occurs only down to the lowest odd level that occurs, + * which is minLevel|1. However, if the lowest level itself is odd, then + * in the last reordering the sequence of the runs at this level or higher + * will be all runs, and we don't need the elaborate loop to search for them. + * This is covered by ++minLevel instead of minLevel|=1 followed + * by an extra reorder-all after the reorder-some loop. + * About a trailing WS run: + * Such a run would need special treatment because its level is not + * reflected in levels[] if this is not a paragraph object. + * Instead, all characters from trailingWSStart on are implicitly at + * paraLevel. + * However, for all maxLevel>paraLevel, this run will never be reordered + * and does not need to be taken into account. maxLevel==paraLevel is only reordered + * if minLevel==paraLevel is odd, which is done in the extra segment. + * This means that for the main reordering loop we don't need to consider + * this run and can --runCount. If it is later part of the all-runs + * reordering, then runCount is adjusted accordingly. + */ +static void +reorderLine(UBiDi *pBiDi, UBiDiLevel minLevel, UBiDiLevel maxLevel) { + Run *runs; + UBiDiLevel *levels; + int32_t firstRun, endRun, limitRun, runCount, + temp; + + /* nothing to do? */ + if(maxLevel<=(minLevel|1)) { + return; + } + + /* + * Reorder only down to the lowest odd level + * and reorder at an odd minLevel in a separate, simpler loop. + * See comments above for why minLevel is always incremented. + */ + ++minLevel; + + runs=pBiDi->runs; + levels=pBiDi->levels; + runCount=pBiDi->runCount; + + /* do not include the WS run at paraLevel<=old minLevel except in the simple loop */ + if(pBiDi->trailingWSStartlength) { + --runCount; + } + + while(--maxLevel>=minLevel) { + firstRun=0; + + /* loop for all sequences of runs */ + for(;;) { + /* look for a sequence of runs that are all at >=maxLevel */ + /* look for the first run of such a sequence */ + while(firstRun=runCount) { + break; /* no more such runs */ + } + + /* look for the limit run of such a sequence (the run behind it) */ + for(limitRun=firstRun; ++limitRun=maxLevel;) {} + + /* Swap the entire sequence of runs from firstRun to limitRun-1. */ + endRun=limitRun-1; + while(firstRuntrailingWSStart==pBiDi->length) { + --runCount; + } + + /* Swap the entire sequence of all runs. (endRun==runCount) */ + while(firstRunparaLevel); - runs[runIndex].visualLimit+=limit; + int32_t trailingRun = ((pBiDi->paraLevel & 1) != 0)? 0 : runIndex; + + ADD_ODD_BIT_FROM_LEVEL(runs[trailingRun].logicalStart, pBiDi->paraLevel); } } } @@ -501,142 +627,42 @@ ubidi_getRuns(UBiDi *pBiDi) { return TRUE; } -/* in trivial cases there is only one trivial run; called by ubidi_getRuns() */ -static void -getSingleRun(UBiDi *pBiDi, UBiDiLevel level) { - /* simple, single-run case */ - pBiDi->runs=pBiDi->simpleRuns; - pBiDi->runCount=1; - - /* fill and reorder the single run */ - pBiDi->runs[0].logicalStart=MAKE_INDEX_ODD_PAIR(0, level); - pBiDi->runs[0].visualLimit=pBiDi->length; -} - -/* reorder the runs array (L2) ---------------------------------------------- */ - -/* - * Reorder the same-level runs in the runs array. - * Here, runCount>1 and maxLevel>=minLevel>=paraLevel. - * All the visualStart fields=logical start before reordering. - * The "odd" bits are not set yet. - * - * Reordering with this data structure lends itself to some handy shortcuts: - * - * Since each run is moved but not modified, and since at the initial maxLevel - * each sequence of same-level runs consists of only one run each, we - * don't need to do anything there and can predecrement maxLevel. - * In many simple cases, the reordering is thus done entirely in the - * index mapping. - * Also, reordering occurs only down to the lowest odd level that occurs, - * which is minLevel|1. However, if the lowest level itself is odd, then - * in the last reordering the sequence of the runs at this level or higher - * will be all runs, and we don't need the elaborate loop to search for them. - * This is covered by ++minLevel instead of minLevel|=1 followed - * by an extra reorder-all after the reorder-some loop. - * About a trailing WS run: - * Such a run would need special treatment because its level is not - * reflected in levels[] if this is not a paragraph object. - * Instead, all characters from trailingWSStart on are implicitly at - * paraLevel. - * However, for all maxLevel>paraLevel, this run will never be reordered - * and does not need to be taken into account. maxLevel==paraLevel is only reordered - * if minLevel==paraLevel is odd, which is done in the extra segment. - * This means that for the main reordering loop we don't need to consider - * this run and can --runCount. If it is later part of the all-runs - * reordering, then runCount is adjusted accordingly. - */ -static void -reorderLine(UBiDi *pBiDi, UBiDiLevel minLevel, UBiDiLevel maxLevel) { - Run *runs; - UBiDiLevel *levels; - int32_t firstRun, endRun, limitRun, runCount, - temp; - - /* nothing to do? */ - if(maxLevel<=(minLevel|1)) { - return; - } - - /* - * Reorder only down to the lowest odd level - * and reorder at an odd minLevel in a separate, simpler loop. - * See comments above for why minLevel is always incremented. - */ - ++minLevel; - - runs=pBiDi->runs; - levels=pBiDi->levels; - runCount=pBiDi->runCount; +static UBool +prepareReorder(const UBiDiLevel *levels, int32_t length, + int32_t *indexMap, + UBiDiLevel *pMinLevel, UBiDiLevel *pMaxLevel) { + int32_t start; + UBiDiLevel level, minLevel, maxLevel; - /* do not include the WS run at paraLevel<=old minLevel except in the simple loop */ - if(pBiDi->trailingWSStartlength) { - --runCount; + if(levels==NULL || length<=0) { + return FALSE; } - while(--maxLevel>=minLevel) { - firstRun=0; - - /* loop for all sequences of runs */ - for(;;) { - /* look for a sequence of runs that are all at >=maxLevel */ - /* look for the first run of such a sequence */ - while(firstRun=runCount) { - break; /* no more such runs */ - } - - /* look for the limit run of such a sequence (the run behind it) */ - for(limitRun=firstRun; ++limitRun=maxLevel;) {} - - /* Swap the entire sequence of runs from firstRun to limitRun-1. */ - endRun=limitRun-1; - while(firstRun0;) { + level=levels[--start]; + if(level>UBIDI_MAX_EXPLICIT_LEVEL+1) { + return FALSE; } - } - - /* now do maxLevel==old minLevel (==odd!), see above */ - if(!(minLevel&1)) { - firstRun=0; - - /* include the trailing WS run in this complete reordering */ - if(pBiDi->trailingWSStart==pBiDi->length) { - --runCount; + if(levelmaxLevel) { + maxLevel=level; } } + *pMinLevel=minLevel; + *pMaxLevel=maxLevel; + + /* initialize the index map */ + for(start=length; start>0;) { + --start; + indexMap[start]=start; + } + + return TRUE; } /* reorder a line based on a levels array (L2) ------------------------------ */ @@ -764,44 +790,6 @@ ubidi_reorderVisual(const UBiDiLevel *levels, int32_t length, int32_t *indexMap) } while(--maxLevel>=minLevel); } -static UBool -prepareReorder(const UBiDiLevel *levels, int32_t length, - int32_t *indexMap, - UBiDiLevel *pMinLevel, UBiDiLevel *pMaxLevel) { - int32_t start; - UBiDiLevel level, minLevel, maxLevel; - - if(levels==NULL || length<=0) { - return FALSE; - } - - /* determine minLevel and maxLevel */ - minLevel=UBIDI_MAX_EXPLICIT_LEVEL+1; - maxLevel=0; - for(start=length; start>0;) { - level=levels[--start]; - if(level>UBIDI_MAX_EXPLICIT_LEVEL+1) { - return FALSE; - } - if(levelmaxLevel) { - maxLevel=level; - } - } - *pMinLevel=minLevel; - *pMaxLevel=maxLevel; - - /* initialize the index map */ - for(start=length; start>0;) { - --start; - indexMap[start]=start; - } - - return TRUE; -} - /* API functions for logical<->visual mapping ------------------------------- */ U_CAPI int32_t U_EXPORT2 diff --git a/icuSources/common/ubrk.cpp b/icuSources/common/ubrk.cpp index 8cfb93c2..710fd980 100644 --- a/icuSources/common/ubrk.cpp +++ b/icuSources/common/ubrk.cpp @@ -1,6 +1,6 @@ /* ***************************************************************************************** -* Copyright (C) 1996-2001, International Business Machines +* Copyright (C) 1996-2004, International Business Machines * Corporation and others. All Rights Reserved. ***************************************************************************************** */ @@ -265,4 +265,26 @@ ubrk_getRuleStatus(UBreakIterator *bi) return ((RuleBasedBreakIterator *)bi)->getRuleStatus(); } +U_CAPI int32_t U_EXPORT2 +ubrk_getRuleStatusVec(UBreakIterator *bi, int32_t *fillInVec, int32_t capacity, UErrorCode *status) +{ + return ((RuleBasedBreakIterator *)bi)->getRuleStatusVec(fillInVec, capacity, *status); +} + + +U_CAPI const char* U_EXPORT2 +ubrk_getLocaleByType(const UBreakIterator *bi, + ULocDataLocaleType type, + UErrorCode* status) +{ + if (bi == NULL) { + if (U_SUCCESS(*status)) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + } + return NULL; + } + return ((BreakIterator*)bi)->getLocaleID(type, *status); +} + + #endif /* #if !UCONFIG_NO_BREAK_ITERATION */ diff --git a/icuSources/common/ucase.c b/icuSources/common/ucase.c new file mode 100644 index 00000000..76b26bb9 --- /dev/null +++ b/icuSources/common/ucase.c @@ -0,0 +1,1370 @@ +/* +******************************************************************************* +* +* Copyright (C) 2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: ucase.c +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2004aug30 +* created by: Markus W. Scherer +* +* Low-level Unicode character/string case mapping code. +* Much code moved here (and modified) from uchar.c. +*/ + +#include "unicode/utypes.h" +#include "unicode/uset.h" +#include "unicode/udata.h" /* UDataInfo */ +#include "ucmndata.h" /* DataHeader */ +#include "udatamem.h" +#include "umutex.h" +#include "uassert.h" +#include "cmemory.h" +#include "utrie.h" +#include "ucase.h" +#include "ucln_cmn.h" + +struct UCaseProps { + UDataMemory *mem; + const int32_t *indexes; + const uint16_t *exceptions; + + UTrie trie; + uint8_t formatVersion[4]; +}; + +/* data loading etc. -------------------------------------------------------- */ + +static UBool U_CALLCONV +isAcceptable(void *context, + const char *type, const char *name, + const UDataInfo *pInfo) { + if( + pInfo->size>=20 && + pInfo->isBigEndian==U_IS_BIG_ENDIAN && + pInfo->charsetFamily==U_CHARSET_FAMILY && + pInfo->dataFormat[0]==UCASE_FMT_0 && /* dataFormat="cAsE" */ + pInfo->dataFormat[1]==UCASE_FMT_1 && + pInfo->dataFormat[2]==UCASE_FMT_2 && + pInfo->dataFormat[3]==UCASE_FMT_3 && + pInfo->formatVersion[0]==1 && + pInfo->formatVersion[2]==UTRIE_SHIFT && + pInfo->formatVersion[3]==UTRIE_INDEX_SHIFT + ) { + UCaseProps *csp=(UCaseProps *)context; + uprv_memcpy(csp->formatVersion, pInfo->formatVersion, 4); + return TRUE; + } else { + return FALSE; + } +} + +static UCaseProps * +ucase_openData(UCaseProps *cspProto, + const uint8_t *bin, int32_t length, UErrorCode *pErrorCode) { + UCaseProps *csp; + int32_t size, trieSize; + + cspProto->indexes=(const int32_t *)bin; + if( cspProto->indexes[UCASE_IX_INDEX_TOP]<16 || + (length>=0 && lengthindexes[UCASE_IX_LENGTH]) + ) { + *pErrorCode=U_INVALID_FORMAT_ERROR; + return NULL; + } + + /* get the trie address, after indexes[] */ + size=cspProto->indexes[UCASE_IX_INDEX_TOP]*4; + bin+=size; + if(length>=0 && (length-=size)<16) { + *pErrorCode=U_INVALID_FORMAT_ERROR; + return NULL; + } + + /* unserialize the trie */ + trieSize=cspProto->indexes[UCASE_IX_TRIE_SIZE]; + trieSize=utrie_unserialize(&cspProto->trie, bin, length>=0 ? length : trieSize, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return NULL; + } + + /* get exceptions[] */ + bin+=trieSize; + if(length>=0 && (length-=trieSize)<2*cspProto->indexes[UCASE_IX_EXC_LENGTH]) { + *pErrorCode=U_INVALID_FORMAT_ERROR; + return NULL; + } + cspProto->exceptions=(const uint16_t *)bin; + + /* allocate, copy, and return the new UCaseProps */ + csp=(UCaseProps *)uprv_malloc(sizeof(UCaseProps)); + if(csp==NULL) { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + return NULL; + } else { + uprv_memcpy(csp, cspProto, sizeof(UCaseProps)); + return csp; + } +} + +U_CAPI UCaseProps * U_EXPORT2 +ucase_open(UErrorCode *pErrorCode) { + UCaseProps cspProto={ NULL }, *csp; + + cspProto.mem=udata_openChoice(NULL, UCASE_DATA_TYPE, UCASE_DATA_NAME, isAcceptable, &cspProto, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return NULL; + } + + csp=ucase_openData( + &cspProto, + udata_getMemory(cspProto.mem), + udata_getLength(cspProto.mem), + pErrorCode); + if(U_FAILURE(*pErrorCode)) { + udata_close(cspProto.mem); + return NULL; + } else { + return csp; + } +} + +U_CAPI UCaseProps * U_EXPORT2 +ucase_openBinary(const uint8_t *bin, int32_t length, UErrorCode *pErrorCode) { + UCaseProps cspProto={ NULL }; + const DataHeader *hdr; + + if(U_FAILURE(*pErrorCode)) { + return NULL; + } + if(bin==NULL) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + + /* check the header */ + if(length>=0 && length<20) { + *pErrorCode=U_INVALID_FORMAT_ERROR; + return NULL; + } + hdr=(const DataHeader *)bin; + if( + !(hdr->dataHeader.magic1==0xda && hdr->dataHeader.magic2==0x27 && + hdr->info.isBigEndian==U_IS_BIG_ENDIAN && + isAcceptable(&cspProto, UCASE_DATA_TYPE, UCASE_DATA_NAME, &hdr->info)) + ) { + *pErrorCode=U_INVALID_FORMAT_ERROR; + return NULL; + } + + bin+=hdr->dataHeader.headerSize; + if(length>=0) { + length-=hdr->dataHeader.headerSize; + } + return ucase_openData(&cspProto, bin, length, pErrorCode); +} + +U_CAPI void U_EXPORT2 +ucase_close(UCaseProps *csp) { + if(csp!=NULL) { + udata_close(csp->mem); + uprv_free(csp); + } +} + +/* UCaseProps singleton ----------------------------------------------------- */ + +static UCaseProps *gCsp=NULL; +static UErrorCode gErrorCode=U_ZERO_ERROR; +static int8_t gHaveData=0; + +static UBool U_CALLCONV ucase_cleanup(void) { + ucase_close(gCsp); + gCsp=NULL; + gErrorCode=U_ZERO_ERROR; + gHaveData=0; + return TRUE; +} + +U_CAPI UCaseProps * U_EXPORT2 +ucase_getSingleton(UErrorCode *pErrorCode) { + int8_t haveData; + + if(U_FAILURE(*pErrorCode)) { + return NULL; + } + + UMTX_CHECK(NULL, gHaveData, haveData); + + if(haveData>0) { + /* data was loaded */ + return gCsp; + } else if(haveData<0) { + /* data loading failed */ + *pErrorCode=gErrorCode; + return NULL; + } else /* haveData==0 */ { + /* load the data */ + UCaseProps *csp=ucase_open(pErrorCode); + if(U_FAILURE(*pErrorCode)) { + gHaveData=-1; + gErrorCode=*pErrorCode; + return NULL; + } + + /* set the static variables */ + umtx_lock(NULL); + if(gCsp==NULL) { + gCsp=csp; + csp=NULL; + gHaveData=1; + ucln_common_registerCleanup(UCLN_COMMON_UCASE, ucase_cleanup); + } + umtx_unlock(NULL); + + ucase_close(csp); + return gCsp; + } +} + +/* Unicode case mapping data swapping --------------------------------------- */ + +U_CAPI int32_t U_EXPORT2 +ucase_swap(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const UDataInfo *pInfo; + int32_t headerSize; + + const uint8_t *inBytes; + uint8_t *outBytes; + + const int32_t *inIndexes; + int32_t indexes[16]; + + int32_t i, offset, count, size; + + /* udata_swapDataHeader checks the arguments */ + headerSize=udata_swapDataHeader(ds, inData, length, outData, pErrorCode); + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + + /* check data format and format version */ + pInfo=(const UDataInfo *)((const char *)inData+4); + if(!( + pInfo->dataFormat[0]==UCASE_FMT_0 && /* dataFormat="cAsE" */ + pInfo->dataFormat[1]==UCASE_FMT_1 && + pInfo->dataFormat[2]==UCASE_FMT_2 && + pInfo->dataFormat[3]==UCASE_FMT_3 && + pInfo->formatVersion[0]==1 && + pInfo->formatVersion[2]==UTRIE_SHIFT && + pInfo->formatVersion[3]==UTRIE_INDEX_SHIFT + )) { + udata_printError(ds, "ucase_swap(): data format %02x.%02x.%02x.%02x (format version %02x) is not recognized as case mapping data\n", + pInfo->dataFormat[0], pInfo->dataFormat[1], + pInfo->dataFormat[2], pInfo->dataFormat[3], + pInfo->formatVersion[0]); + *pErrorCode=U_UNSUPPORTED_ERROR; + return 0; + } + + inBytes=(const uint8_t *)inData+headerSize; + outBytes=(uint8_t *)outData+headerSize; + + inIndexes=(const int32_t *)inBytes; + + if(length>=0) { + length-=headerSize; + if(length<16*4) { + udata_printError(ds, "ucase_swap(): too few bytes (%d after header) for case mapping data\n", + length); + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + } + + /* read the first 16 indexes (ICU 3.2/format version 1: UCASE_IX_TOP==16, might grow) */ + for(i=0; i<16; ++i) { + indexes[i]=udata_readInt32(ds, inIndexes[i]); + } + + /* get the total length of the data */ + size=indexes[UCASE_IX_LENGTH]; + + if(length>=0) { + if(lengthswapArray32(ds, inBytes, count, outBytes, pErrorCode); + offset+=count; + + /* swap the UTrie */ + count=indexes[UCASE_IX_TRIE_SIZE]; + utrie_swap(ds, inBytes+offset, count, outBytes+offset, pErrorCode); + offset+=count; + + /* swap the uint16_t exceptions[] */ + count=indexes[UCASE_IX_EXC_LENGTH]*2; + ds->swapArray16(ds, inBytes+offset, count, outBytes+offset, pErrorCode); + offset+=count; + + U_ASSERT(offset==size); + } + + return headerSize+size; +} + +/* set of property starts for UnicodeSet ------------------------------------ */ + +static UBool U_CALLCONV +_enumPropertyStartsRange(const void *context, UChar32 start, UChar32 limit, uint32_t value) { + /* add the start code point to the USet */ + USetAdder *sa=(USetAdder *)context; + sa->add(sa->set, start); + return TRUE; +} + +U_CAPI void U_EXPORT2 +ucase_addPropertyStarts(const UCaseProps *csp, USetAdder *sa, UErrorCode *pErrorCode) { + if(U_FAILURE(*pErrorCode)) { + return; + } + + /* add the start code point of each same-value range of the trie */ + utrie_enum(&csp->trie, NULL, _enumPropertyStartsRange, sa); + + /* add code points with hardcoded properties, plus the ones following them */ + + /* (none right now, see comment below) */ + + /* + * Omit code points with hardcoded specialcasing properties + * because we do not build property UnicodeSets for them right now. + */ +} + +/* data access primitives --------------------------------------------------- */ + +/* UTRIE_GET16() itself validates c */ +#define GET_PROPS(csp, c, result) \ + UTRIE_GET16(&(csp)->trie, c, result); + +#define GET_CASE_TYPE(props) ((props)&UCASE_TYPE_MASK) +#define GET_SIGNED_DELTA(props) ((int16_t)(props)>>UCASE_DELTA_SHIFT) +#define GET_EXCEPTIONS(csp, props) ((csp)->exceptions+((props)>>UCASE_EXC_SHIFT)) + +#define PROPS_HAS_EXCEPTION(props) ((props)&UCASE_EXCEPTION) + +/* number of bits in an 8-bit integer value */ +static const uint8_t flagsOffset[256]={ + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 +}; + +#define HAS_SLOT(flags, index) ((flags)&(1<<(index))) +#define SLOT_OFFSET(flags, index) flagsOffset[(flags)&((1<<(index))-1)] + +/* + * Get the value of an optional-value slot where HAS_SLOT(excWord, index). + * + * @param excWord (in) initial exceptions word + * @param index (in) desired slot index + * @param pExc16 (in/out) const uint16_t * after excWord=*pExc16++; + * moved to the last uint16_t of the value, use +1 for beginning of next slot + * @param value (out) int32_t or uint32_t output if hasSlot, otherwise not modified + */ +#define GET_SLOT_VALUE(excWord, index, pExc16, value) \ + if(((excWord)&UCASE_EXC_DOUBLE_SLOTS)==0) { \ + (pExc16)+=SLOT_OFFSET(excWord, index); \ + (value)=*pExc16; \ + } else { \ + (pExc16)+=2*SLOT_OFFSET(excWord, index); \ + (value)=*pExc16++; \ + (value)=((value)<<16)|*pExc16; \ + } + +/* simple case mappings ----------------------------------------------------- */ + +U_CAPI UChar32 U_EXPORT2 +ucase_tolower(const UCaseProps *csp, UChar32 c) { + uint16_t props; + GET_PROPS(csp, c, props); + if(!PROPS_HAS_EXCEPTION(props)) { + if(GET_CASE_TYPE(props)>=UCASE_UPPER) { + c+=GET_SIGNED_DELTA(props); + } + } else { + const uint16_t *pe=GET_EXCEPTIONS(csp, props); + uint16_t excWord=*pe++; + if(HAS_SLOT(excWord, UCASE_EXC_LOWER)) { + GET_SLOT_VALUE(excWord, UCASE_EXC_LOWER, pe, c); + } + } + return c; +} + +U_CAPI UChar32 U_EXPORT2 +ucase_toupper(const UCaseProps *csp, UChar32 c) { + uint16_t props; + GET_PROPS(csp, c, props); + if(!PROPS_HAS_EXCEPTION(props)) { + if(GET_CASE_TYPE(props)==UCASE_LOWER) { + c+=GET_SIGNED_DELTA(props); + } + } else { + const uint16_t *pe=GET_EXCEPTIONS(csp, props); + uint16_t excWord=*pe++; + if(HAS_SLOT(excWord, UCASE_EXC_UPPER)) { + GET_SLOT_VALUE(excWord, UCASE_EXC_UPPER, pe, c); + } + } + return c; +} + +U_CAPI UChar32 U_EXPORT2 +ucase_totitle(const UCaseProps *csp, UChar32 c) { + uint16_t props; + GET_PROPS(csp, c, props); + if(!PROPS_HAS_EXCEPTION(props)) { + if(GET_CASE_TYPE(props)==UCASE_LOWER) { + c+=GET_SIGNED_DELTA(props); + } + } else { + const uint16_t *pe=GET_EXCEPTIONS(csp, props); + uint16_t excWord=*pe++; + int32_t index; + if(HAS_SLOT(excWord, UCASE_EXC_TITLE)) { + index=UCASE_EXC_TITLE; + } else if(HAS_SLOT(excWord, UCASE_EXC_UPPER)) { + index=UCASE_EXC_UPPER; + } else { + return c; + } + GET_SLOT_VALUE(excWord, index, pe, c); + } + return c; +} + +/** @return UCASE_NONE, UCASE_LOWER, UCASE_UPPER, UCASE_TITLE */ +U_CAPI int32_t U_EXPORT2 +ucase_getType(const UCaseProps *csp, UChar32 c) { + uint16_t props; + GET_PROPS(csp, c, props); + return GET_CASE_TYPE(props); +} + +/** @return same as ucase_getType(), or <0 if c is case-ignorable */ +U_CAPI int32_t U_EXPORT2 +ucase_getTypeOrIgnorable(const UCaseProps *csp, UChar32 c) { + int32_t type; + uint16_t props; + GET_PROPS(csp, c, props); + type=GET_CASE_TYPE(props); + if(type!=UCASE_NONE) { + return type; + } else if( + c==0x307 || + (props&(UCASE_EXCEPTION|UCASE_CASE_IGNORABLE))==UCASE_CASE_IGNORABLE + ) { + return -1; /* case-ignorable */ + } else { + return 0; /* c is neither cased nor case-ignorable */ + } +} + +/** @return UCASE_NO_DOT, UCASE_SOFT_DOTTED, UCASE_ABOVE, UCASE_OTHER_ACCENT */ +static U_INLINE int32_t +getDotType(const UCaseProps *csp, UChar32 c) { + uint16_t props; + GET_PROPS(csp, c, props); + if(!PROPS_HAS_EXCEPTION(props)) { + return props&UCASE_DOT_MASK; + } else { + const uint16_t *pe=GET_EXCEPTIONS(csp, props); + return (*pe>>UCASE_EXC_DOT_SHIFT)&UCASE_DOT_MASK; + } +} + +U_CAPI UBool U_EXPORT2 +ucase_isSoftDotted(const UCaseProps *csp, UChar32 c) { + return (UBool)(getDotType(csp, c)==UCASE_SOFT_DOTTED); +} + +U_CAPI UBool U_EXPORT2 +ucase_isCaseSensitive(const UCaseProps *csp, UChar32 c) { + uint16_t props; + GET_PROPS(csp, c, props); + return (UBool)((props&UCASE_SENSITIVE)!=0); +} + +/* public API (see uchar.h) ------------------------------------------------- */ + +U_CAPI UBool U_EXPORT2 +u_isULowercase(UChar32 c) { + UErrorCode errorCode=U_ZERO_ERROR; + UCaseProps *csp=ucase_getSingleton(&errorCode); + return (UBool)(csp!=NULL && UCASE_LOWER==ucase_getType(csp, c)); +} + +U_CAPI UBool U_EXPORT2 +u_isUUppercase(UChar32 c) { + UErrorCode errorCode=U_ZERO_ERROR; + UCaseProps *csp=ucase_getSingleton(&errorCode); + return (UBool)(csp!=NULL && UCASE_UPPER==ucase_getType(csp, c)); +} + +/* Transforms the Unicode character to its lower case equivalent.*/ +U_CAPI UChar32 U_EXPORT2 +u_tolower(UChar32 c) { + UErrorCode errorCode=U_ZERO_ERROR; + UCaseProps *csp=ucase_getSingleton(&errorCode); + if(csp!=NULL) { + return ucase_tolower(csp, c); + } else { + return c; + } +} + +/* Transforms the Unicode character to its upper case equivalent.*/ +U_CAPI UChar32 U_EXPORT2 +u_toupper(UChar32 c) { + UErrorCode errorCode=U_ZERO_ERROR; + UCaseProps *csp=ucase_getSingleton(&errorCode); + if(csp!=NULL) { + return ucase_toupper(csp, c); + } else { + return c; + } +} + +/* Transforms the Unicode character to its title case equivalent.*/ +U_CAPI UChar32 U_EXPORT2 +u_totitle(UChar32 c) { + UErrorCode errorCode=U_ZERO_ERROR; + UCaseProps *csp=ucase_getSingleton(&errorCode); + if(csp!=NULL) { + return ucase_totitle(csp, c); + } else { + return c; + } +} + +/* return the simple case folding mapping for c */ +U_CAPI UChar32 U_EXPORT2 +u_foldCase(UChar32 c, uint32_t options) { + UErrorCode errorCode=U_ZERO_ERROR; + UCaseProps *csp=ucase_getSingleton(&errorCode); + if(csp!=NULL) { + return ucase_fold(csp, c, options); + } else { + return c; + } +} + +/* string casing ------------------------------------------------------------ */ + +/* + * These internal functions form the core of string case mappings. + * They map single code points to result code points or strings and take + * all necessary conditions (context, locale ID, options) into account. + * + * They do not iterate over the source or write to the destination + * so that the same functions are useful for non-standard string storage, + * such as in a Replaceable (for Transliterator) or UTF-8/32 strings etc. + * For the same reason, the "surrounding text" context is passed in as a + * UCaseContextIterator which does not make any assumptions about + * the underlying storage. + * + * This section contains helper functions that check for conditions + * in the input text surrounding the current code point + * according to SpecialCasing.txt. + * + * Each helper function gets the index + * - after the current code point if it looks at following text + * - before the current code point if it looks at preceding text + * + * Unicode 3.2 UAX 21 "Case Mappings" defines the conditions as follows: + * + * Final_Sigma + * C is preceded by a sequence consisting of + * a cased letter and a case-ignorable sequence, + * and C is not followed by a sequence consisting of + * an ignorable sequence and then a cased letter. + * + * More_Above + * C is followed by one or more characters of combining class 230 (ABOVE) + * in the combining character sequence. + * + * After_Soft_Dotted + * The last preceding character with combining class of zero before C + * was Soft_Dotted, + * and there is no intervening combining character class 230 (ABOVE). + * + * Before_Dot + * C is followed by combining dot above (U+0307). + * Any sequence of characters with a combining class that is neither 0 nor 230 + * may intervene between the current character and the combining dot above. + * + * The erratum from 2002-10-31 adds the condition + * + * After_I + * The last preceding base character was an uppercase I, and there is no + * intervening combining character class 230 (ABOVE). + * + * (See Jitterbug 2344 and the comments on After_I below.) + * + * Helper definitions in Unicode 3.2 UAX 21: + * + * D1. A character C is defined to be cased + * if it meets any of the following criteria: + * + * - The general category of C is Titlecase Letter (Lt) + * - In [CoreProps], C has one of the properties Uppercase, or Lowercase + * - Given D = NFD(C), then it is not the case that: + * D = UCD_lower(D) = UCD_upper(D) = UCD_title(D) + * (This third criterium does not add any characters to the list + * for Unicode 3.2. Ignored.) + * + * D2. A character C is defined to be case-ignorable + * if it meets either of the following criteria: + * + * - The general category of C is + * Nonspacing Mark (Mn), or Enclosing Mark (Me), or Format Control (Cf), or + * Letter Modifier (Lm), or Symbol Modifier (Sk) + * - C is one of the following characters + * U+0027 APOSTROPHE + * U+00AD SOFT HYPHEN (SHY) + * U+2019 RIGHT SINGLE QUOTATION MARK + * (the preferred character for apostrophe) + * + * D3. A case-ignorable sequence is a sequence of + * zero or more case-ignorable characters. + */ + +enum { + LOC_UNKNOWN, + LOC_ROOT, + LOC_TURKISH, + LOC_LITHUANIAN +}; + +#define is_a(c) ((c)=='a' || (c)=='A') +#define is_e(c) ((c)=='e' || (c)=='E') +#define is_i(c) ((c)=='i' || (c)=='I') +#define is_l(c) ((c)=='l' || (c)=='L') +#define is_r(c) ((c)=='r' || (c)=='R') +#define is_t(c) ((c)=='t' || (c)=='T') +#define is_u(c) ((c)=='u' || (c)=='U') +#define is_z(c) ((c)=='z' || (c)=='Z') + +/* separator? */ +#define is_sep(c) ((c)=='_' || (c)=='-' || (c)==0) + +/* + * Requires non-NULL locale ID but otherwise does the equivalent of + * checking for language codes as if uloc_getLanguage() were called: + * Accepts both 2- and 3-letter codes and accepts case variants. + */ +static int32_t +getCaseLocale(const char *locale, int32_t *locCache) { + int32_t result; + char c; + + if(locCache!=NULL && (result=*locCache)!=LOC_UNKNOWN) { + return result; + } + + result=LOC_ROOT; + + /* + * This function used to use uloc_getLanguage(), but the current code + * removes the dependency of this low-level code on uloc implementation code + * and is faster because not the whole locale ID has to be + * examined and copied/transformed. + * + * Because this code does not want to depend on uloc, the caller must + * pass in a non-NULL locale, i.e., may need to call uloc_getDefault(). + */ + c=*locale++; + if(is_t(c)) { + /* tr or tur? */ + c=*locale++; + if(is_u(c)) { + c=*locale++; + } + if(is_r(c)) { + c=*locale; + if(is_sep(c)) { + result=LOC_TURKISH; + } + } + } else if(is_a(c)) { + /* az or aze? */ + c=*locale++; + if(is_z(c)) { + c=*locale++; + if(is_e(c)) { + c=*locale; + } + if(is_sep(c)) { + result=LOC_TURKISH; + } + } + } else if(is_l(c)) { + /* lt or lit? */ + c=*locale++; + if(is_i(c)) { + c=*locale++; + } + if(is_t(c)) { + c=*locale; + if(is_sep(c)) { + result=LOC_LITHUANIAN; + } + } + } + + if(locCache!=NULL) { + *locCache=result; + } + return result; +} + +/* Is followed by {case-ignorable}* cased ? (dir determines looking forward/backward) */ +static UBool +isFollowedByCasedLetter(const UCaseProps *csp, UCaseContextIterator *iter, void *context, int8_t dir) { + UChar32 c; + uint16_t props; + + if(iter==NULL) { + return FALSE; + } + + for(/* dir!=0 sets direction */; (c=iter(context, dir))>=0; dir=0) { + GET_PROPS(csp, c, props); + if(GET_CASE_TYPE(props)!=UCASE_NONE) { + return TRUE; /* followed by cased letter */ + } else if(c==0x307 || (props&(UCASE_EXCEPTION|UCASE_CASE_IGNORABLE))==UCASE_CASE_IGNORABLE) { + /* case-ignorable, continue with the loop */ + } else { + return FALSE; /* not ignorable */ + } + } + + return FALSE; /* not followed by cased letter */ +} + +/* Is preceded by Soft_Dotted character with no intervening cc=230 ? */ +static UBool +isPrecededBySoftDotted(const UCaseProps *csp, UCaseContextIterator *iter, void *context) { + UChar32 c; + int32_t dotType; + int8_t dir; + + if(iter==NULL) { + return FALSE; + } + + for(dir=-1; (c=iter(context, dir))>=0; dir=0) { + dotType=getDotType(csp, c); + if(dotType==UCASE_SOFT_DOTTED) { + return TRUE; /* preceded by TYPE_i */ + } else if(dotType!=UCASE_OTHER_ACCENT) { + return FALSE; /* preceded by different base character (not TYPE_i), or intervening cc==230 */ + } + } + + return FALSE; /* not preceded by TYPE_i */ +} + +/* + * See Jitterbug 2344: + * The condition After_I for Turkic-lowercasing of U+0307 combining dot above + * is checked in ICU 2.0, 2.1, 2.6 but was not in 2.2 & 2.4 because + * we made those releases compatible with Unicode 3.2 which had not fixed + * a related bug in SpecialCasing.txt. + * + * From the Jitterbug 2344 text: + * ... this bug is listed as a Unicode erratum + * from 2002-10-31 at http://www.unicode.org/uni2errata/UnicodeErrata.html + * + * There are two errors in SpecialCasing.txt. + * 1. Missing semicolons on two lines. ... [irrelevant for ICU] + * 2. An incorrect context definition. Correct as follows: + * < 0307; ; 0307; 0307; tr After_Soft_Dotted; # COMBINING DOT ABOVE + * < 0307; ; 0307; 0307; az After_Soft_Dotted; # COMBINING DOT ABOVE + * --- + * > 0307; ; 0307; 0307; tr After_I; # COMBINING DOT ABOVE + * > 0307; ; 0307; 0307; az After_I; # COMBINING DOT ABOVE + * where the context After_I is defined as: + * The last preceding base character was an uppercase I, and there is no + * intervening combining character class 230 (ABOVE). + * + * + * Note that SpecialCasing.txt even in Unicode 3.2 described the condition as: + * + * # When lowercasing, remove dot_above in the sequence I + dot_above, which will turn into i. + * # This matches the behavior of the canonically equivalent I-dot_above + * + * See also the description in this place in older versions of uchar.c (revision 1.100). + * + * Markus W. Scherer 2003-feb-15 + */ + +/* Is preceded by base character 'I' with no intervening cc=230 ? */ +static UBool +isPrecededBy_I(const UCaseProps *csp, UCaseContextIterator *iter, void *context) { + UChar32 c; + int32_t dotType; + int8_t dir; + + if(iter==NULL) { + return FALSE; + } + + for(dir=-1; (c=iter(context, dir))>=0; dir=0) { + if(c==0x49) { + return TRUE; /* preceded by I */ + } + dotType=getDotType(csp, c); + if(dotType!=UCASE_OTHER_ACCENT) { + return FALSE; /* preceded by different base character (not I), or intervening cc==230 */ + } + } + + return FALSE; /* not preceded by I */ +} + +/* Is followed by one or more cc==230 ? */ +static UBool +isFollowedByMoreAbove(const UCaseProps *csp, UCaseContextIterator *iter, void *context) { + UChar32 c; + int32_t dotType; + int8_t dir; + + if(iter==NULL) { + return FALSE; + } + + for(dir=1; (c=iter(context, dir))>=0; dir=0) { + dotType=getDotType(csp, c); + if(dotType==UCASE_ABOVE) { + return TRUE; /* at least one cc==230 following */ + } else if(dotType!=UCASE_OTHER_ACCENT) { + return FALSE; /* next base character, no more cc==230 following */ + } + } + + return FALSE; /* no more cc==230 following */ +} + +/* Is followed by a dot above (without cc==230 in between) ? */ +static UBool +isFollowedByDotAbove(const UCaseProps *csp, UCaseContextIterator *iter, void *context) { + UChar32 c; + int32_t dotType; + int8_t dir; + + if(iter==NULL) { + return FALSE; + } + + for(dir=1; (c=iter(context, dir))>=0; dir=0) { + if(c==0x307) { + return TRUE; + } + dotType=getDotType(csp, c); + if(dotType!=UCASE_OTHER_ACCENT) { + return FALSE; /* next base character or cc==230 in between */ + } + } + + return FALSE; /* no dot above following */ +} + +U_CAPI int32_t U_EXPORT2 +ucase_toFullLower(const UCaseProps *csp, UChar32 c, + UCaseContextIterator *iter, void *context, + const UChar **pString, + const char *locale, int32_t *locCache) { + static const UChar + iDot[2]= { 0x69, 0x307 }, + jDot[2]= { 0x6a, 0x307 }, + iOgonekDot[3]= { 0x12f, 0x307 }, + iDotGrave[3]= { 0x69, 0x307, 0x300 }, + iDotAcute[3]= { 0x69, 0x307, 0x301 }, + iDotTilde[3]= { 0x69, 0x307, 0x303 }; + + UChar32 result; + uint16_t props; + + result=c; + GET_PROPS(csp, c, props); + if(!PROPS_HAS_EXCEPTION(props)) { + if(GET_CASE_TYPE(props)>=UCASE_UPPER) { + result=c+GET_SIGNED_DELTA(props); + } + } else { + const uint16_t *pe=GET_EXCEPTIONS(csp, props), *pe2; + uint16_t excWord=*pe++; + int32_t full; + + pe2=pe; + + if(excWord&UCASE_EXC_CONDITIONAL_SPECIAL) { + /* use hardcoded conditions and mappings */ + int32_t loc=getCaseLocale(locale, locCache); + + /* + * Test for conditional mappings first + * (otherwise the unconditional default mappings are always taken), + * then test for characters that have unconditional mappings in SpecialCasing.txt, + * then get the UnicodeData.txt mappings. + */ + if( loc==LOC_LITHUANIAN && + /* base characters, find accents above */ + (((c==0x49 || c==0x4a || c==0x12e) && + isFollowedByMoreAbove(csp, iter, context)) || + /* precomposed with accent above, no need to find one */ + (c==0xcc || c==0xcd || c==0x128)) + ) { + /* + # Lithuanian + + # Lithuanian retains the dot in a lowercase i when followed by accents. + + # Introduce an explicit dot above when lowercasing capital I's and J's + # whenever there are more accents above. + # (of the accents used in Lithuanian: grave, acute, tilde above, and ogonek) + + 0049; 0069 0307; 0049; 0049; lt More_Above; # LATIN CAPITAL LETTER I + 004A; 006A 0307; 004A; 004A; lt More_Above; # LATIN CAPITAL LETTER J + 012E; 012F 0307; 012E; 012E; lt More_Above; # LATIN CAPITAL LETTER I WITH OGONEK + 00CC; 0069 0307 0300; 00CC; 00CC; lt; # LATIN CAPITAL LETTER I WITH GRAVE + 00CD; 0069 0307 0301; 00CD; 00CD; lt; # LATIN CAPITAL LETTER I WITH ACUTE + 0128; 0069 0307 0303; 0128; 0128; lt; # LATIN CAPITAL LETTER I WITH TILDE + */ + switch(c) { + case 0x49: /* LATIN CAPITAL LETTER I */ + *pString=iDot; + return 2; + case 0x4a: /* LATIN CAPITAL LETTER J */ + *pString=jDot; + return 2; + case 0x12e: /* LATIN CAPITAL LETTER I WITH OGONEK */ + *pString=iOgonekDot; + return 2; + case 0xcc: /* LATIN CAPITAL LETTER I WITH GRAVE */ + *pString=iDotGrave; + return 3; + case 0xcd: /* LATIN CAPITAL LETTER I WITH ACUTE */ + *pString=iDotAcute; + return 3; + case 0x128: /* LATIN CAPITAL LETTER I WITH TILDE */ + *pString=iDotTilde; + return 3; + default: + return 0; /* will not occur */ + } + /* # Turkish and Azeri */ + } else if(loc==LOC_TURKISH && c==0x130) { + /* + # I and i-dotless; I-dot and i are case pairs in Turkish and Azeri + # The following rules handle those cases. + + 0130; 0069; 0130; 0130; tr # LATIN CAPITAL LETTER I WITH DOT ABOVE + 0130; 0069; 0130; 0130; az # LATIN CAPITAL LETTER I WITH DOT ABOVE + */ + return 0x69; + } else if(loc==LOC_TURKISH && c==0x307 && isPrecededBy_I(csp, iter, context)) { + /* + # When lowercasing, remove dot_above in the sequence I + dot_above, which will turn into i. + # This matches the behavior of the canonically equivalent I-dot_above + + 0307; ; 0307; 0307; tr After_I; # COMBINING DOT ABOVE + 0307; ; 0307; 0307; az After_I; # COMBINING DOT ABOVE + */ + return 0; /* remove the dot (continue without output) */ + } else if(loc==LOC_TURKISH && c==0x49 && !isFollowedByDotAbove(csp, iter, context)) { + /* + # When lowercasing, unless an I is before a dot_above, it turns into a dotless i. + + 0049; 0131; 0049; 0049; tr Not_Before_Dot; # LATIN CAPITAL LETTER I + 0049; 0131; 0049; 0049; az Not_Before_Dot; # LATIN CAPITAL LETTER I + */ + return 0x131; + } else if(c==0x130) { + /* + # Preserve canonical equivalence for I with dot. Turkic is handled below. + + 0130; 0069 0307; 0130; 0130; # LATIN CAPITAL LETTER I WITH DOT ABOVE + */ + *pString=iDot; + return 2; + } else if( c==0x3a3 && + !isFollowedByCasedLetter(csp, iter, context, 1) && + isFollowedByCasedLetter(csp, iter, context, -1) /* -1=preceded */ + ) { + /* greek capital sigma maps depending on surrounding cased letters (see SpecialCasing.txt) */ + /* + # Special case for final form of sigma + + 03A3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK CAPITAL LETTER SIGMA + */ + return 0x3c2; /* greek small final sigma */ + } else { + /* no known conditional special case mapping, use a normal mapping */ + } + } else if(HAS_SLOT(excWord, UCASE_EXC_FULL_MAPPINGS)) { + GET_SLOT_VALUE(excWord, UCASE_EXC_FULL_MAPPINGS, pe, full); + full&=UCASE_FULL_LOWER; + if(full!=0) { + /* set the output pointer to the lowercase mapping */ + *pString=pe+1; + + /* return the string length */ + return full; + } + } + + if(HAS_SLOT(excWord, UCASE_EXC_LOWER)) { + GET_SLOT_VALUE(excWord, UCASE_EXC_LOWER, pe2, result); + } + } + + return (result==c) ? ~result : result; +} + +/* internal */ +static int32_t +toUpperOrTitle(const UCaseProps *csp, UChar32 c, + UCaseContextIterator *iter, void *context, + const UChar **pString, + const char *locale, int32_t *locCache, + UBool upperNotTitle) { + UChar32 result; + uint16_t props; + + result=c; + GET_PROPS(csp, c, props); + if(!PROPS_HAS_EXCEPTION(props)) { + if(GET_CASE_TYPE(props)==UCASE_LOWER) { + result=c+GET_SIGNED_DELTA(props); + } + } else { + const uint16_t *pe=GET_EXCEPTIONS(csp, props), *pe2; + uint16_t excWord=*pe++; + int32_t full, index; + + pe2=pe; + + if(excWord&UCASE_EXC_CONDITIONAL_SPECIAL) { + /* use hardcoded conditions and mappings */ + int32_t loc=getCaseLocale(locale, locCache); + + if(loc==LOC_TURKISH && c==0x69) { + /* + # Turkish and Azeri + + # I and i-dotless; I-dot and i are case pairs in Turkish and Azeri + # The following rules handle those cases. + + # When uppercasing, i turns into a dotted capital I + + 0069; 0069; 0130; 0130; tr; # LATIN SMALL LETTER I + 0069; 0069; 0130; 0130; az; # LATIN SMALL LETTER I + */ + return 0x130; + } else if(loc==LOC_LITHUANIAN && c==0x307 && isPrecededBySoftDotted(csp, iter, context)) { + /* + # Lithuanian + + # Lithuanian retains the dot in a lowercase i when followed by accents. + + # Remove DOT ABOVE after "i" with upper or titlecase + + 0307; 0307; ; ; lt After_Soft_Dotted; # COMBINING DOT ABOVE + */ + return 0; /* remove the dot (continue without output) */ + } else { + /* no known conditional special case mapping, use a normal mapping */ + } + } else if(HAS_SLOT(excWord, UCASE_EXC_FULL_MAPPINGS)) { + GET_SLOT_VALUE(excWord, UCASE_EXC_FULL_MAPPINGS, pe, full); + + /* start of full case mapping strings */ + ++pe; + + /* skip the lowercase and case-folding result strings */ + pe+=full&UCASE_FULL_LOWER; + full>>=4; + pe+=full&0xf; + full>>=4; + + if(upperNotTitle) { + full&=0xf; + } else { + /* skip the uppercase result string */ + pe+=full&0xf; + full=(full>>4)&0xf; + } + + if(full!=0) { + /* set the output pointer to the result string */ + *pString=pe; + + /* return the string length */ + return full; + } + } + + if(!upperNotTitle && HAS_SLOT(excWord, UCASE_EXC_TITLE)) { + index=UCASE_EXC_TITLE; + } else if(HAS_SLOT(excWord, UCASE_EXC_UPPER)) { + /* here, titlecase is same as uppercase */ + index=UCASE_EXC_UPPER; + } else { + return ~c; + } + GET_SLOT_VALUE(excWord, index, pe2, result); + } + + return (result==c) ? ~result : result; +} + +U_CAPI int32_t U_EXPORT2 +ucase_toFullUpper(const UCaseProps *csp, UChar32 c, + UCaseContextIterator *iter, void *context, + const UChar **pString, + const char *locale, int32_t *locCache) { + return toUpperOrTitle(csp, c, iter, context, pString, locale, locCache, TRUE); +} + +U_CAPI int32_t U_EXPORT2 +ucase_toFullTitle(const UCaseProps *csp, UChar32 c, + UCaseContextIterator *iter, void *context, + const UChar **pString, + const char *locale, int32_t *locCache) { + return toUpperOrTitle(csp, c, iter, context, pString, locale, locCache, FALSE); +} + +/* case folding ------------------------------------------------------------- */ + +/* + * Case folding is similar to lowercasing. + * The result may be a simple mapping, i.e., a single code point, or + * a full mapping, i.e., a string. + * If the case folding for a code point is the same as its simple (1:1) lowercase mapping, + * then only the lowercase mapping is stored. + * + * Some special cases are hardcoded because their conditions cannot be + * parsed and processed from CaseFolding.txt. + * + * Unicode 3.2 CaseFolding.txt specifies for its status field: + +# C: common case folding, common mappings shared by both simple and full mappings. +# F: full case folding, mappings that cause strings to grow in length. Multiple characters are separated by spaces. +# S: simple case folding, mappings to single characters where different from F. +# T: special case for uppercase I and dotted uppercase I +# - For non-Turkic languages, this mapping is normally not used. +# - For Turkic languages (tr, az), this mapping can be used instead of the normal mapping for these characters. +# +# Usage: +# A. To do a simple case folding, use the mappings with status C + S. +# B. To do a full case folding, use the mappings with status C + F. +# +# The mappings with status T can be used or omitted depending on the desired case-folding +# behavior. (The default option is to exclude them.) + + * Unicode 3.2 has 'T' mappings as follows: + +0049; T; 0131; # LATIN CAPITAL LETTER I +0130; T; 0069; # LATIN CAPITAL LETTER I WITH DOT ABOVE + + * while the default mappings for these code points are: + +0049; C; 0069; # LATIN CAPITAL LETTER I +0130; F; 0069 0307; # LATIN CAPITAL LETTER I WITH DOT ABOVE + + * U+0130 is otherwise lowercased to U+0069 (UnicodeData.txt). + * + * In case this code is used with CaseFolding.txt from an older version of Unicode + * where CaseFolding.txt contains mappings with a status of 'I' that + * have the opposite polarity ('I' mappings are included by default but excluded for Turkic), + * we must also hardcode the Unicode 3.2 mappings for the code points + * with 'I' mappings. + * Unicode 3.1.1 has 'I' mappings for U+0130 and U+0131. + * Unicode 3.2 has a 'T' mapping for U+0130, and lowercases U+0131 to itself (see UnicodeData.txt). + */ + +/* return the simple case folding mapping for c */ +U_CAPI UChar32 U_EXPORT2 +ucase_fold(UCaseProps *csp, UChar32 c, uint32_t options) { + uint16_t props; + GET_PROPS(csp, c, props); + if(!PROPS_HAS_EXCEPTION(props)) { + if(GET_CASE_TYPE(props)>=UCASE_UPPER) { + c+=GET_SIGNED_DELTA(props); + } + } else { + const uint16_t *pe=GET_EXCEPTIONS(csp, props); + uint16_t excWord=*pe++; + int32_t index; + if(excWord&UCASE_EXC_CONDITIONAL_FOLD) { + /* special case folding mappings, hardcoded */ + if((options&_FOLD_CASE_OPTIONS_MASK)==U_FOLD_CASE_DEFAULT) { + /* default mappings */ + if(c==0x49) { + /* 0049; C; 0069; # LATIN CAPITAL LETTER I */ + return 0x69; + } else if(c==0x130) { + /* no simple default mapping for U+0130, use UnicodeData.txt */ + return 0x69; + } + } else { + /* Turkic mappings */ + if(c==0x49) { + /* 0049; T; 0131; # LATIN CAPITAL LETTER I */ + return 0x131; + } else if(c==0x130) { + /* 0130; T; 0069; # LATIN CAPITAL LETTER I WITH DOT ABOVE */ + return 0x69; + } + } + } + if(HAS_SLOT(excWord, UCASE_EXC_FOLD)) { + index=UCASE_EXC_FOLD; + } else if(HAS_SLOT(excWord, UCASE_EXC_LOWER)) { + index=UCASE_EXC_LOWER; + } else { + return c; + } + GET_SLOT_VALUE(excWord, index, pe, c); + } + return c; +} + +/* + * Issue for canonical caseless match (UAX #21): + * Turkic casefolding (using "T" mappings in CaseFolding.txt) does not preserve + * canonical equivalence, unlike default-option casefolding. + * For example, I-grave and I + grave fold to strings that are not canonically + * equivalent. + * For more details, see the comment in unorm_compare() in unorm.cpp + * and the intermediate prototype changes for Jitterbug 2021. + * (For example, revision 1.104 of uchar.c and 1.4 of CaseFolding.txt.) + * + * This did not get fixed because it appears that it is not possible to fix + * it for uppercase and lowercase characters (I-grave vs. i-grave) + * together in a way that they still fold to common result strings. + */ + +U_CAPI int32_t U_EXPORT2 +ucase_toFullFolding(const UCaseProps *csp, UChar32 c, + const UChar **pString, + uint32_t options) { + static const UChar + iDot[2]= { 0x69, 0x307 }; + + UChar32 result; + uint16_t props; + + result=c; + GET_PROPS(csp, c, props); + if(!PROPS_HAS_EXCEPTION(props)) { + if(GET_CASE_TYPE(props)>=UCASE_UPPER) { + result=c+GET_SIGNED_DELTA(props); + } + } else { + const uint16_t *pe=GET_EXCEPTIONS(csp, props), *pe2; + uint16_t excWord=*pe++; + int32_t full, index; + + pe2=pe; + + if(excWord&UCASE_EXC_CONDITIONAL_FOLD) { + /* use hardcoded conditions and mappings */ + if((options&_FOLD_CASE_OPTIONS_MASK)==U_FOLD_CASE_DEFAULT) { + /* default mappings */ + if(c==0x49) { + /* 0049; C; 0069; # LATIN CAPITAL LETTER I */ + return 0x69; + } else if(c==0x130) { + /* 0130; F; 0069 0307; # LATIN CAPITAL LETTER I WITH DOT ABOVE */ + *pString=iDot; + return 2; + } + } else { + /* Turkic mappings */ + if(c==0x49) { + /* 0049; T; 0131; # LATIN CAPITAL LETTER I */ + return 0x131; + } else if(c==0x130) { + /* 0130; T; 0069; # LATIN CAPITAL LETTER I WITH DOT ABOVE */ + return 0x69; + } + } + } else if(HAS_SLOT(excWord, UCASE_EXC_FULL_MAPPINGS)) { + GET_SLOT_VALUE(excWord, UCASE_EXC_FULL_MAPPINGS, pe, full); + + /* start of full case mapping strings */ + ++pe; + + /* skip the lowercase result string */ + pe+=full&UCASE_FULL_LOWER; + full=(full>>4)&0xf; + + if(full!=0) { + /* set the output pointer to the result string */ + *pString=pe; + + /* return the string length */ + return full; + } + } + + if(HAS_SLOT(excWord, UCASE_EXC_FOLD)) { + index=UCASE_EXC_FOLD; + } else if(HAS_SLOT(excWord, UCASE_EXC_LOWER)) { + index=UCASE_EXC_LOWER; + } else { + return ~c; + } + GET_SLOT_VALUE(excWord, index, pe2, result); + } + + return (result==c) ? ~result : result; +} diff --git a/icuSources/common/ucase.h b/icuSources/common/ucase.h new file mode 100644 index 00000000..f137d9bf --- /dev/null +++ b/icuSources/common/ucase.h @@ -0,0 +1,301 @@ +/* +******************************************************************************* +* +* Copyright (C) 2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: ucase.h +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2004aug30 +* created by: Markus W. Scherer +* +* Low-level Unicode character/string case mapping code. +*/ + +#ifndef __UCASE_H__ +#define __UCASE_H__ + +#include "unicode/utypes.h" +#include "unicode/uset.h" +#include "uset_imp.h" +#include "udataswp.h" + +U_CDECL_BEGIN + +/* library API -------------------------------------------------------------- */ + +struct UCaseProps; +typedef struct UCaseProps UCaseProps; + +U_CAPI UCaseProps * U_EXPORT2 +ucase_open(UErrorCode *pErrorCode); + +U_CAPI UCaseProps * U_EXPORT2 +ucase_openBinary(const uint8_t *bin, int32_t length, UErrorCode *pErrorCode); + +U_CAPI void U_EXPORT2 +ucase_close(UCaseProps *csp); + + +U_CAPI UCaseProps * U_EXPORT2 +ucase_getSingleton(UErrorCode *pErrorCode); + + +U_CAPI int32_t U_EXPORT2 +ucase_swap(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode); + +U_CAPI void U_EXPORT2 +ucase_addPropertyStarts(const UCaseProps *csp, USetAdder *sa, UErrorCode *pErrorCode); + +/** + * Bit mask for getting just the options from a string compare options word + * that are relevant for case-insensitive string comparison. + * See uchar.h. Also include _STRNCMP_STYLE and U_COMPARE_CODE_POINT_ORDER. + * @internal + */ +#define _STRCASECMP_OPTIONS_MASK 0xffff + +/** + * Bit mask for getting just the options from a string compare options word + * that are relevant for case folding (of a single string or code point). + * See uchar.h. + * @internal + */ +#define _FOLD_CASE_OPTIONS_MASK 0xff + +/* single-code point functions */ + +U_CAPI UChar32 U_EXPORT2 +ucase_tolower(const UCaseProps *csp, UChar32 c); + +U_CAPI UChar32 U_EXPORT2 +ucase_toupper(const UCaseProps *csp, UChar32 c); + +U_CAPI UChar32 U_EXPORT2 +ucase_totitle(const UCaseProps *csp, UChar32 c); + +U_CAPI UChar32 U_EXPORT2 +ucase_fold(UCaseProps *csp, UChar32 c, uint32_t options); + +/** @return UCASE_NONE, UCASE_LOWER, UCASE_UPPER, UCASE_TITLE */ +U_CAPI int32_t U_EXPORT2 +ucase_getType(const UCaseProps *csp, UChar32 c); + +/** @return same as ucase_getType(), or <0 if c is case-ignorable */ +U_CAPI int32_t U_EXPORT2 +ucase_getTypeOrIgnorable(const UCaseProps *csp, UChar32 c); + +U_CAPI UBool U_EXPORT2 +ucase_isSoftDotted(const UCaseProps *csp, UChar32 c); + +U_CAPI UBool U_EXPORT2 +ucase_isCaseSensitive(const UCaseProps *csp, UChar32 c); + +/* string case mapping functions */ + +/** + * Iterator function for string case mappings, which need to look at the + * context (surrounding text) of a given character for conditional mappings. + * + * The iterator only needs to go backward or forward away from the + * character in question. It does not use any indexes on this interface. + * It does not support random access or an arbitrary change of + * iteration direction. + * + * The direction parameter either starts + * + * @param context A pointer to the iterator's working data. + * @param dir If <0 then start iterating backward from the character; + * if >0 then start iterating forward from the character; + * if 0 then continue iterating in the current direction. + * @return Next code point, or <0 when the iteration is done. + */ +typedef UChar32 U_CALLCONV +UCaseContextIterator(void *context, int8_t dir); + +/** + * Sample struct which may be used by some implementations of + * UCaseContextIterator. + */ +struct UCaseContext { + void *p; + int32_t start, index, limit; + int32_t cpStart, cpLimit; + int8_t dir; + int8_t b1, b2, b3; +}; +typedef struct UCaseContext UCaseContext; + +enum { + /** + * For string case mappings, a single character (a code point) is mapped + * either to itself (in which case in-place mapping functions do nothing), + * or to another single code point, or to a string. + * Aside from the string contents, these are indicated with a single int32_t + * value as follows: + * + * Mapping to self: Negative values (~self instead of -self to support U+0000) + * + * Mapping to another code point: Positive values >UCASE_MAX_STRING_LENGTH + * + * Mapping to a string: The string length (0..UCASE_MAX_STRING_LENGTH) is + * returned. Note that the string result may indeed have zero length. + */ + UCASE_MAX_STRING_LENGTH=0x1f +}; + +/** + * Get the full lowercase mapping for c. + * + * @param csp Case mapping properties. + * @param c Character to be mapped. + * @param iter Character iterator, used for context-sensitive mappings. + * See UCaseContextIterator for details. + * If iter==NULL then a context-independent result is returned. + * @param context Pointer to be passed into iter. + * @param pString If the mapping result is a string, then the pointer is + * written to *pString. + * @param locale Locale ID for locale-dependent mappings. + * @param locCache Initialize to 0; may be used to cache the result of parsing + * the locale ID for subsequent calls. + * Can be NULL. + * @return Output code point or string length, see UCASE_MAX_STRING_LENGTH. + * + * @see UCaseContextIterator + * @see UCASE_MAX_STRING_LENGTH + * @internal + */ +U_CAPI int32_t U_EXPORT2 +ucase_toFullLower(const UCaseProps *csp, UChar32 c, + UCaseContextIterator *iter, void *context, + const UChar **pString, + const char *locale, int32_t *locCache); + +U_CAPI int32_t U_EXPORT2 +ucase_toFullUpper(const UCaseProps *csp, UChar32 c, + UCaseContextIterator *iter, void *context, + const UChar **pString, + const char *locale, int32_t *locCache); + +U_CAPI int32_t U_EXPORT2 +ucase_toFullTitle(const UCaseProps *csp, UChar32 c, + UCaseContextIterator *iter, void *context, + const UChar **pString, + const char *locale, int32_t *locCache); + +U_CAPI int32_t U_EXPORT2 +ucase_toFullFolding(const UCaseProps *csp, UChar32 c, + const UChar **pString, + uint32_t options); + +/* file definitions --------------------------------------------------------- */ + +#define UCASE_DATA_NAME "ucase" +#define UCASE_DATA_TYPE "icu" + +/* format "cAsE" */ +#define UCASE_FMT_0 0x63 +#define UCASE_FMT_1 0x41 +#define UCASE_FMT_2 0x53 +#define UCASE_FMT_3 0x45 + +/* indexes into indexes[] */ +enum { + UCASE_IX_INDEX_TOP, + UCASE_IX_LENGTH, + UCASE_IX_TRIE_SIZE, + UCASE_IX_EXC_LENGTH, + + UCASE_IX_MAX_FULL_LENGTH=15, + UCASE_IX_TOP=16 +}; + +/* definitions for 16-bit case properties word ------------------------------ */ + +/* 2-bit constants for types of cased characters */ +#define UCASE_TYPE_MASK 3 +enum { + UCASE_NONE, + UCASE_LOWER, + UCASE_UPPER, + UCASE_TITLE +}; + +#define UCASE_SENSITIVE 4 +#define UCASE_EXCEPTION 8 + +#define UCASE_DOT_MASK 0x30 +enum { + UCASE_NO_DOT=0, /* normal characters with cc=0 */ + UCASE_SOFT_DOTTED=0x10, /* soft-dotted characters with cc=0 */ + UCASE_ABOVE=0x20, /* "above" accents with cc=230 */ + UCASE_OTHER_ACCENT=0x30 /* other accent character (0>UCASE_DELTA_SHIFT) + +/* case-ignorable uses one of the delta bits, see gencase/store.c */ +#define UCASE_CASE_IGNORABLE 0x40 + +/* exception: bits 15..4 are an unsigned 12-bit index into the exceptions array */ +#define UCASE_EXC_SHIFT 4 +#define UCASE_EXC_MASK 0xfff0 +#define UCASE_MAX_EXCEPTIONS 0x1000 + +/* definitions for 16-bit main exceptions word ------------------------------ */ + +/* first 8 bits indicate values in optional slots */ +enum { + UCASE_EXC_LOWER, + UCASE_EXC_FOLD, + UCASE_EXC_UPPER, + UCASE_EXC_TITLE, + UCASE_EXC_4, /* reserved */ + UCASE_EXC_5, /* reserved */ + UCASE_EXC_6, /* reserved */ + UCASE_EXC_FULL_MAPPINGS, + UCASE_EXC_ALL_SLOTS /* one past the last slot */ +}; + +/* each slot is 2 uint16_t instead of 1 */ +#define UCASE_EXC_DOUBLE_SLOTS 0x100 + +/* reserved: exception bits 11..9 */ + +/* UCASE_EXC_DOT_MASK=UCASE_DOT_MASK< Data has not been loaded. + * < 0 -> Error occured attempting to load data. + * > 0 -> Data has been successfully loaded. + */ /* index values loaded from uprops.dat */ static int32_t indexes[UPROPS_INDEX_COUNT]; @@ -93,8 +95,7 @@ isAcceptable(void *context, } } -UBool -uchar_cleanup() +static UBool U_CALLCONV uchar_cleanup(void) { if (propsData) { udata_close(propsData); @@ -107,13 +108,55 @@ uchar_cleanup() propsVectors=NULL; countPropsVectors=0; dataErrorCode=U_ZERO_ERROR; - havePropsData=FALSE; + havePropsData=0; return TRUE; } -static int8_t -loadPropsData(void) { +struct UCharProps { + UDataMemory *propsData; + UTrie propsTrie, propsVectorsTrie; + const uint32_t *pData32; +}; +typedef struct UCharProps UCharProps; + +/* open uprops.icu */ +static void +_openProps(UCharProps *ucp, UErrorCode *pErrorCode) { + const uint32_t *p; + int32_t length; + + ucp->propsData=udata_openChoice(NULL, DATA_TYPE, DATA_NAME, isAcceptable, NULL, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return; + } + + ucp->pData32=p=(const uint32_t *)udata_getMemory(ucp->propsData); + + /* unserialize the trie; it is directly after the int32_t indexes[UPROPS_INDEX_COUNT] */ + length=(int32_t)p[UPROPS_PROPS32_INDEX]*4; + length=utrie_unserialize(&ucp->propsTrie, (const uint8_t *)(p+UPROPS_INDEX_COUNT), length-64, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return; + } + ucp->propsTrie.getFoldingOffset=getFoldingPropsOffset; + + /* unserialize the properties vectors trie, if any */ + if( p[UPROPS_ADDITIONAL_TRIE_INDEX]!=0 && + p[UPROPS_ADDITIONAL_VECTORS_INDEX]!=0 + ) { + length=(int32_t)(p[UPROPS_ADDITIONAL_VECTORS_INDEX]-p[UPROPS_ADDITIONAL_TRIE_INDEX])*4; + length=utrie_unserialize(&ucp->propsVectorsTrie, (const uint8_t *)(p+p[UPROPS_ADDITIONAL_TRIE_INDEX]), length, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + uprv_memset(&ucp->propsVectorsTrie, 0, sizeof(ucp->propsVectorsTrie)); + } else { + ucp->propsVectorsTrie.getFoldingOffset=getFoldingPropsOffset; + } + } +} + +U_CFUNC int8_t +uprv_loadPropsData(UErrorCode *pErrorCode) { /* load Unicode character properties data from file if necessary */ /* @@ -122,84 +165,201 @@ loadPropsData(void) { * Check the readme and use u_init() if necessary. */ if(havePropsData==0) { - UTrie trie={ 0 }, trie2={ 0 }; - UErrorCode errorCode=U_ZERO_ERROR; - UDataMemory *data; - const uint32_t *p=NULL; - int32_t length; + UCharProps ucp={ NULL }; + UCaseProps *csp; - /* open the data outside the mutex block */ - data=udata_openChoice(NULL, DATA_TYPE, DATA_NAME, isAcceptable, NULL, &errorCode); - dataErrorCode=errorCode; - if(U_FAILURE(errorCode)) { - return havePropsData=-1; + if(U_FAILURE(*pErrorCode)) { + return havePropsData; } - p=(const uint32_t *)udata_getMemory(data); + /* open the data outside the mutex block */ + _openProps(&ucp, pErrorCode); + + if(U_SUCCESS(*pErrorCode)) { + /* in the mutex block, set the data for this process */ + umtx_lock(NULL); + if(propsData==NULL) { + propsData=ucp.propsData; + ucp.propsData=NULL; + pData32=ucp.pData32; + ucp.pData32=NULL; + uprv_memcpy(&propsTrie, &ucp.propsTrie, sizeof(propsTrie)); + uprv_memcpy(&propsVectorsTrie, &ucp.propsVectorsTrie, sizeof(propsVectorsTrie)); + csp=NULL; + } - /* unserialize the trie; it is directly after the int32_t indexes[UPROPS_INDEX_COUNT] */ - length=(int32_t)p[UPROPS_PROPS32_INDEX]*4; - length=utrie_unserialize(&trie, (const uint8_t *)(p+UPROPS_INDEX_COUNT), length-64, &errorCode); - if(U_FAILURE(errorCode)) { - dataErrorCode=errorCode; - udata_close(data); - return havePropsData=-1; - } - trie.getFoldingOffset=getFoldingPropsOffset; - - /* unserialize the properties vectors trie, if any */ - if( p[UPROPS_ADDITIONAL_TRIE_INDEX]!=0 && - p[UPROPS_ADDITIONAL_VECTORS_INDEX]!=0 - ) { - length=(int32_t)(p[UPROPS_ADDITIONAL_VECTORS_INDEX]-p[UPROPS_ADDITIONAL_TRIE_INDEX])*4; - length=utrie_unserialize(&trie2, (const uint8_t *)(p+p[UPROPS_ADDITIONAL_TRIE_INDEX]), length, &errorCode); - if(U_FAILURE(errorCode)) { - uprv_memset(&trie2, 0, sizeof(trie2)); - } else { - trie2.getFoldingOffset=getFoldingPropsOffset; + /* initialize some variables */ + uprv_memcpy(indexes, pData32, sizeof(indexes)); + props32Table=pData32+indexes[UPROPS_PROPS32_INDEX]; + exceptionsTable=pData32+indexes[UPROPS_EXCEPTIONS_INDEX]; + ucharsTable=(const UChar *)(pData32+indexes[UPROPS_EXCEPTIONS_TOP_INDEX]); + + /* additional properties */ + if(indexes[UPROPS_ADDITIONAL_VECTORS_INDEX]!=0) { + propsVectors=pData32+indexes[UPROPS_ADDITIONAL_VECTORS_INDEX]; + countPropsVectors=indexes[UPROPS_RESERVED_INDEX]-indexes[UPROPS_ADDITIONAL_VECTORS_INDEX]; + propsVectorsColumns=indexes[UPROPS_ADDITIONAL_VECTORS_COLUMNS_INDEX]; } - } - /* in the mutex block, set the data for this process */ - umtx_lock(NULL); - if(propsData==NULL) { - propsData=data; - data=NULL; - pData32=p; - p=NULL; - uprv_memcpy(&propsTrie, &trie, sizeof(trie)); - uprv_memcpy(&propsVectorsTrie, &trie2, sizeof(trie2)); + havePropsData=1; + umtx_unlock(NULL); + } else { + dataErrorCode=*pErrorCode; + havePropsData=-1; } - umtx_unlock(NULL); - - /* initialize some variables */ - uprv_memcpy(indexes, pData32, sizeof(indexes)); - props32Table=pData32+indexes[UPROPS_PROPS32_INDEX]; - exceptionsTable=pData32+indexes[UPROPS_EXCEPTIONS_INDEX]; - ucharsTable=(const UChar *)(pData32+indexes[UPROPS_EXCEPTIONS_TOP_INDEX]); - - /* additional properties */ - if(indexes[UPROPS_ADDITIONAL_VECTORS_INDEX]!=0) { - propsVectors=pData32+indexes[UPROPS_ADDITIONAL_VECTORS_INDEX]; - countPropsVectors=indexes[UPROPS_RESERVED_INDEX]-indexes[UPROPS_ADDITIONAL_VECTORS_INDEX]; - propsVectorsColumns=indexes[UPROPS_ADDITIONAL_VECTORS_COLUMNS_INDEX]; + ucln_common_registerCleanup(UCLN_COMMON_UCHAR, uchar_cleanup); + + /* if a different thread set it first, then close the extra data */ + udata_close(ucp.propsData); /* NULL if it was set correctly */ + } + + return havePropsData; +} + + +static int8_t +loadPropsData(void) { + UErrorCode errorCode = U_ZERO_ERROR; + int8_t retVal = uprv_loadPropsData(&errorCode); + return retVal; +} + + +/* Unicode properties data swapping ----------------------------------------- */ + +U_CAPI int32_t U_EXPORT2 +uprops_swap(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const UDataInfo *pInfo; + int32_t headerSize, i; + + int32_t dataIndexes[UPROPS_INDEX_COUNT]; + const int32_t *inData32; + + /* udata_swapDataHeader checks the arguments */ + headerSize=udata_swapDataHeader(ds, inData, length, outData, pErrorCode); + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + + /* check data format and format version */ + pInfo=(const UDataInfo *)((const char *)inData+4); + if(!( + pInfo->dataFormat[0]==0x55 && /* dataFormat="UPro" */ + pInfo->dataFormat[1]==0x50 && + pInfo->dataFormat[2]==0x72 && + pInfo->dataFormat[3]==0x6f && + pInfo->formatVersion[0]==3 && + pInfo->formatVersion[2]==UTRIE_SHIFT && + pInfo->formatVersion[3]==UTRIE_INDEX_SHIFT + )) { + udata_printError(ds, "uprops_swap(): data format %02x.%02x.%02x.%02x (format version %02x) is not a Unicode properties file\n", + pInfo->dataFormat[0], pInfo->dataFormat[1], + pInfo->dataFormat[2], pInfo->dataFormat[3], + pInfo->formatVersion[0]); + *pErrorCode=U_UNSUPPORTED_ERROR; + return 0; + } + + /* the properties file must contain at least the indexes array */ + if(length>=0 && (length-headerSize)=0) { + int32_t *outData32; + + if((length-headerSize)<(4*dataIndexes[UPROPS_RESERVED_INDEX])) { + udata_printError(ds, "uprops_swap(): too few bytes (%d after header) for a Unicode properties file\n", + length-headerSize); + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; } - havePropsData=1; + outData32=(int32_t *)((char *)outData+headerSize); - /* if a different thread set it first, then close the extra data */ - if(data!=NULL) { - udata_close(data); /* NULL if it was set correctly */ + /* copy everything for inaccessible data (padding) */ + if(inData32!=outData32) { + uprv_memcpy(outData32, inData32, 4*dataIndexes[UPROPS_RESERVED_INDEX]); } + + /* swap the indexes[16] */ + ds->swapArray32(ds, inData32, 4*UPROPS_INDEX_COUNT, outData32, pErrorCode); + + /* + * swap the main properties UTrie + * PT serialized properties trie, see utrie.h (byte size: 4*(i0-16)) + */ + utrie_swap(ds, + inData32+UPROPS_INDEX_COUNT, + 4*(dataIndexes[UPROPS_PROPS32_INDEX]-UPROPS_INDEX_COUNT), + outData32+UPROPS_INDEX_COUNT, + pErrorCode); + + /* + * swap the properties and exceptions words + * P const uint32_t props32[i1-i0]; + * E const uint32_t exceptions[i2-i1]; + */ + ds->swapArray32(ds, + inData32+dataIndexes[UPROPS_PROPS32_INDEX], + 4*(dataIndexes[UPROPS_EXCEPTIONS_TOP_INDEX]-dataIndexes[UPROPS_PROPS32_INDEX]), + outData32+dataIndexes[UPROPS_PROPS32_INDEX], + pErrorCode); + + /* + * swap the UChars + * U const UChar uchars[2*(i3-i2)]; + */ + ds->swapArray16(ds, + inData32+dataIndexes[UPROPS_EXCEPTIONS_TOP_INDEX], + 4*(dataIndexes[UPROPS_ADDITIONAL_TRIE_INDEX]-dataIndexes[UPROPS_EXCEPTIONS_TOP_INDEX]), + outData32+dataIndexes[UPROPS_EXCEPTIONS_TOP_INDEX], + pErrorCode); + + /* + * swap the additional UTrie + * i3 additionalTrieIndex; -- 32-bit unit index to the additional trie for more properties + */ + utrie_swap(ds, + inData32+dataIndexes[UPROPS_ADDITIONAL_TRIE_INDEX], + 4*(dataIndexes[UPROPS_ADDITIONAL_VECTORS_INDEX]-dataIndexes[UPROPS_ADDITIONAL_TRIE_INDEX]), + outData32+dataIndexes[UPROPS_ADDITIONAL_TRIE_INDEX], + pErrorCode); + + /* + * swap the properties vectors + * PV const uint32_t propsVectors[(i6-i4)/i5][i5]==uint32_t propsVectors[i6-i4]; + */ + ds->swapArray32(ds, + inData32+dataIndexes[UPROPS_ADDITIONAL_VECTORS_INDEX], + 4*(dataIndexes[UPROPS_RESERVED_INDEX]-dataIndexes[UPROPS_ADDITIONAL_VECTORS_INDEX]), + outData32+dataIndexes[UPROPS_ADDITIONAL_VECTORS_INDEX], + pErrorCode); } - return havePropsData; + /* i6 reservedItemIndex; -- 32-bit unit index to the top of the properties vectors table */ + return headerSize+4*dataIndexes[UPROPS_RESERVED_INDEX]; } -/* constants and macros for access to the data */ +/* constants and macros for access to the data ------------------------------ */ /* getting a uint32_t properties word from the data */ -#define HAVE_DATA (havePropsData>0 || (havePropsData==0 && loadPropsData()>0)) +#define HAVE_DATA (havePropsData>0 || loadPropsData()>0) #define VALIDATE(c) (((uint32_t)(c))<=0x10ffff && HAVE_DATA) #define GET_PROPS_UNSAFE(c, result) \ UTRIE_GET16(&propsTrie, c, result); \ @@ -246,12 +406,17 @@ static const uint8_t flagsOffset[256]={ U_CFUNC UBool uprv_haveProperties(UErrorCode *pErrorCode) { - if(HAVE_DATA) { - return TRUE; - } else { + if(U_FAILURE(*pErrorCode)) { + return FALSE; + } + if(havePropsData==0) { + uprv_loadPropsData(pErrorCode); + } + if(havePropsData<0) { *pErrorCode=dataErrorCode; return FALSE; } + return TRUE; } /* API functions ------------------------------------------------------------ */ @@ -353,6 +518,11 @@ u_isalpha(UChar32 c) { return (UBool)((CAT_MASK(props)&U_GC_L_MASK)!=0); } +U_CAPI UBool U_EXPORT2 +u_isUAlphabetic(UChar32 c) { + return (u_getUnicodeProperties(c, 1)&U_MASK(UPROPS_ALPHABETIC))!=0; +} + /* Checks if ch is a letter or a decimal digit */ U_CAPI UBool U_EXPORT2 u_isalnum(UChar32 c) { @@ -431,6 +601,11 @@ u_isblank(UChar32 c) { } } +U_CAPI UBool U_EXPORT2 +u_isUWhiteSpace(UChar32 c) { + return (u_getUnicodeProperties(c, 1)&U_MASK(UPROPS_WHITE_SPACE))!=0; +} + /* Checks if the Unicode character is printable.*/ U_CAPI UBool U_EXPORT2 u_isprint(UChar32 c) { @@ -518,79 +693,6 @@ u_isJavaIDPart(UChar32 c) { u_isIDIgnorable(c)); } -/* Transforms the Unicode character to its lower case equivalent.*/ -U_CAPI UChar32 U_EXPORT2 -u_tolower(UChar32 c) { - uint32_t props; - GET_PROPS(c, props); - if(!PROPS_VALUE_IS_EXCEPTION(props)) { - if(CAT_MASK(props)&(U_GC_LU_MASK|U_GC_LT_MASK)) { - return c+GET_SIGNED_VALUE(props); - } - } else { - const uint32_t *pe=GET_EXCEPTIONS(props); - uint32_t firstExceptionValue=*pe; - if(HAVE_EXCEPTION_VALUE(firstExceptionValue, EXC_LOWERCASE)) { - int i=EXC_LOWERCASE; - ++pe; - ADD_EXCEPTION_OFFSET(firstExceptionValue, i, pe); - return (UChar32)*pe; - } - } - return c; /* no mapping - return c itself */ -} - -/* Transforms the Unicode character to its upper case equivalent.*/ -U_CAPI UChar32 U_EXPORT2 -u_toupper(UChar32 c) { - uint32_t props; - GET_PROPS(c, props); - if(!PROPS_VALUE_IS_EXCEPTION(props)) { - if(GET_CATEGORY(props)==U_LOWERCASE_LETTER) { - return c-GET_SIGNED_VALUE(props); - } - } else { - const uint32_t *pe=GET_EXCEPTIONS(props); - uint32_t firstExceptionValue=*pe; - if(HAVE_EXCEPTION_VALUE(firstExceptionValue, EXC_UPPERCASE)) { - int i=EXC_UPPERCASE; - ++pe; - ADD_EXCEPTION_OFFSET(firstExceptionValue, i, pe); - return (UChar32)*pe; - } - } - return c; /* no mapping - return c itself */ -} - -/* Transforms the Unicode character to its title case equivalent.*/ -U_CAPI UChar32 U_EXPORT2 -u_totitle(UChar32 c) { - uint32_t props; - GET_PROPS(c, props); - if(!PROPS_VALUE_IS_EXCEPTION(props)) { - if(GET_CATEGORY(props)==U_LOWERCASE_LETTER) { - /* here, titlecase is same as uppercase */ - return c-GET_SIGNED_VALUE(props); - } - } else { - const uint32_t *pe=GET_EXCEPTIONS(props); - uint32_t firstExceptionValue=*pe; - if(HAVE_EXCEPTION_VALUE(firstExceptionValue, EXC_TITLECASE)) { - int i=EXC_TITLECASE; - ++pe; - ADD_EXCEPTION_OFFSET(firstExceptionValue, i, pe); - return (UChar32)*pe; - } else if(HAVE_EXCEPTION_VALUE(firstExceptionValue, EXC_UPPERCASE)) { - /* here, titlecase is same as uppercase */ - int i=EXC_UPPERCASE; - ++pe; - ADD_EXCEPTION_OFFSET(firstExceptionValue, i, pe); - return (UChar32)*pe; - } - } - return c; /* no mapping - return c itself */ -} - U_CAPI int32_t U_EXPORT2 u_charDigitValue(UChar32 c) { uint32_t props, numericType; @@ -826,83 +928,90 @@ uprv_getMaxValues(int32_t column) { } } -static UBool U_CALLCONV -_enumPropertyStartsRange(const void *context, UChar32 start, UChar32 limit, uint32_t value) { - /* add the start code point to the USet */ - uset_add((USet *)context, start); - return TRUE; +/* + * get Hangul Syllable Type + * implemented here so that uchar.c (uhst_addPropertyStarts()) + * does not depend on uprops.c (u_getIntPropertyValue(c, UCHAR_HANGUL_SYLLABLE_TYPE)) + */ +U_CFUNC UHangulSyllableType +uchar_getHST(UChar32 c) { + /* purely algorithmic; hardcode known characters, check for assigned new ones */ + if(c>UPROPS_AGE_SHIFT; + versionArray[0]=(uint8_t)(version>>4); + versionArray[1]=(uint8_t)(version&0xf); + versionArray[2]=versionArray[3]=0; + } +} +U_CAPI UScriptCode U_EXPORT2 +uscript_getScript(UChar32 c, UErrorCode *pErrorCode) { + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + if((uint32_t)c>0x10ffff) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + return (UScriptCode)(u_getUnicodeProperties(c, 0)&UPROPS_SCRIPT_MASK); +} + +U_CAPI UBlockCode U_EXPORT2 +ublock_getCode(UChar32 c) { + return (UBlockCode)((u_getUnicodeProperties(c, 0)&UPROPS_BLOCK_MASK)>>UPROPS_BLOCK_SHIFT); +} + +/* property starts for UnicodeSet ------------------------------------------- */ + +/* for Hangul_Syllable_Type */ U_CAPI void U_EXPORT2 -uchar_addPropertyStarts(USet *set, UErrorCode *pErrorCode) { +uhst_addPropertyStarts(USetAdder *sa, UErrorCode *pErrorCode) { UChar32 c; int32_t value, value2; + if(U_FAILURE(*pErrorCode)) { + return; + } + if(!HAVE_DATA) { *pErrorCode=dataErrorCode; return; } - /* add the start code point of each same-value range of each trie */ - utrie_enum(&propsTrie, NULL, _enumPropertyStartsRange, set); - utrie_enum(&propsVectorsTrie, NULL, _enumPropertyStartsRange, set); - /* add code points with hardcoded properties, plus the ones following them */ - /* add for IS_THAT_CONTROL_SPACE() */ - uset_add(set, TAB); /* range TAB..CR */ - uset_add(set, CR+1); - uset_add(set, 0x1c); - uset_add(set, 0x1f+1); - USET_ADD_CP_AND_NEXT(set, NL); - - /* add for u_isIDIgnorable() what was not added above */ - uset_add(set, DEL); /* range DEL..NBSP-1, NBSP added below */ - uset_add(set, HAIRSP); - uset_add(set, RLM+1); - uset_add(set, INHSWAP); - uset_add(set, NOMDIG+1); - USET_ADD_CP_AND_NEXT(set, ZWNBSP); - - /* add no-break spaces for u_isWhitespace() what was not added above */ - USET_ADD_CP_AND_NEXT(set, NBSP); - USET_ADD_CP_AND_NEXT(set, FIGURESP); - USET_ADD_CP_AND_NEXT(set, NNBSP); - - /* add for u_charDigitValue() */ - USET_ADD_CP_AND_NEXT(set, 0x3007); - USET_ADD_CP_AND_NEXT(set, 0x4e00); - USET_ADD_CP_AND_NEXT(set, 0x4e8c); - USET_ADD_CP_AND_NEXT(set, 0x4e09); - USET_ADD_CP_AND_NEXT(set, 0x56db); - USET_ADD_CP_AND_NEXT(set, 0x4e94); - USET_ADD_CP_AND_NEXT(set, 0x516d); - USET_ADD_CP_AND_NEXT(set, 0x4e03); - USET_ADD_CP_AND_NEXT(set, 0x516b); - USET_ADD_CP_AND_NEXT(set, 0x4e5d); - - /* add for u_digit() */ - uset_add(set, U_a); - uset_add(set, U_z+1); - uset_add(set, U_A); - uset_add(set, U_Z+1); - - /* add for UCHAR_DEFAULT_IGNORABLE_CODE_POINT what was not added above */ - uset_add(set, WJ); /* range WJ..NOMDIG */ - uset_add(set, 0xfff0); - uset_add(set, 0xfffb+1); - uset_add(set, 0xe0000); - uset_add(set, 0xe0fff+1); - - /* add for UCHAR_GRAPHEME_BASE and others */ - USET_ADD_CP_AND_NEXT(set, CGJ); - - /* add for UCHAR_JOINING_TYPE */ - uset_add(set, ZWNJ); /* range ZWNJ..ZWJ */ - uset_add(set, ZWJ+1); - /* * Add Jamo type boundaries for UCHAR_HANGUL_SYLLABLE_TYPE. * First, we add fixed boundaries for the blocks of Jamos. @@ -911,1148 +1020,120 @@ uchar_addPropertyStarts(USet *set, UErrorCode *pErrorCode) { * at the end of the per-Jamo-block assignments in Unicode 4 or earlier. * (These have not changed since Unicode 2.) */ - uset_add(set, 0x1100); + sa->add(sa->set, 0x1100); value=U_HST_LEADING_JAMO; for(c=0x115a; c<=0x115f; ++c) { - value2=u_getIntPropertyValue(c, UCHAR_HANGUL_SYLLABLE_TYPE); + value2=uchar_getHST(c); if(value!=value2) { value=value2; - uset_add(set, c); + sa->add(sa->set, c); } } - uset_add(set, 0x1160); + sa->add(sa->set, 0x1160); value=U_HST_VOWEL_JAMO; for(c=0x11a3; c<=0x11a7; ++c) { - value2=u_getIntPropertyValue(c, UCHAR_HANGUL_SYLLABLE_TYPE); + value2=uchar_getHST(c); if(value!=value2) { value=value2; - uset_add(set, c); + sa->add(sa->set, c); } } - uset_add(set, 0x11a8); + sa->add(sa->set, 0x11a8); value=U_HST_TRAILING_JAMO; for(c=0x11fa; c<=0x11ff; ++c) { - value2=u_getIntPropertyValue(c, UCHAR_HANGUL_SYLLABLE_TYPE); + value2=uchar_getHST(c); if(value!=value2) { value=value2; - uset_add(set, c); + sa->add(sa->set, c); } } - - /* - * Omit code points with hardcoded specialcasing properties - * because we do not build property UnicodeSets for them right now. - */ -} - -/* string casing ------------------------------------------------------------ */ - -/* - * These internal string case mapping functions are here instead of ustring.c - * because we need efficient access to the character properties. - * - * This section contains helper functions that check for conditions - * in the input text surrounding the current code point - * according to SpecialCasing.txt. - * - * Starting with ICU 2.1, the "surrounding text" is passed in as an instance of - * UCharIterator to allow the core case mapping functions to be used - * inside transliterators (using Replaceable instead of UnicodeString/UChar *) - * etc. - * - * Each helper function gets the index - * - after the current code point if it looks at following text - * - before the current code point if it looks at preceding text - * - * Unicode 3.2 UAX 21 "Case Mappings" defines the conditions as follows: - * - * Final_Sigma - * C is preceded by a sequence consisting of - * a cased letter and a case-ignorable sequence, - * and C is not followed by a sequence consisting of - * an ignorable sequence and then a cased letter. - * - * More_Above - * C is followed by one or more characters of combining class 230 (ABOVE) - * in the combining character sequence. - * - * After_Soft_Dotted - * The last preceding character with combining class of zero before C - * was Soft_Dotted, - * and there is no intervening combining character class 230 (ABOVE). - * - * Before_Dot - * C is followed by combining dot above (U+0307). - * Any sequence of characters with a combining class that is neither 0 nor 230 - * may intervene between the current character and the combining dot above. - * - * The erratum from 2002-10-31 adds the condition - * - * After_I - * The last preceding base character was an uppercase I, and there is no - * intervening combining character class 230 (ABOVE). - * - * (See Jitterbug 2344 and the comments on After_I below.) - * - * Helper definitions in Unicode 3.2 UAX 21: - * - * D1. A character C is defined to be cased - * if it meets any of the following criteria: - * - * - The general category of C is Titlecase Letter (Lt) - * - In [CoreProps], C has one of the properties Uppercase, or Lowercase - * - Given D = NFD(C), then it is not the case that: - * D = UCD_lower(D) = UCD_upper(D) = UCD_title(D) - * (This third criterium does not add any characters to the list - * for Unicode 3.2. Ignored.) - * - * D2. A character C is defined to be case-ignorable - * if it meets either of the following criteria: - * - * - The general category of C is - * Nonspacing Mark (Mn), or Enclosing Mark (Me), or Format Control (Cf), or - * Letter Modifier (Lm), or Symbol Modifier (Sk) - * - C is one of the following characters - * U+0027 APOSTROPHE - * U+00AD SOFT HYPHEN (SHY) - * U+2019 RIGHT SINGLE QUOTATION MARK - * (the preferred character for apostrophe) - * - * D3. A case-ignorable sequence is a sequence of - * zero or more case-ignorable characters. - */ - -#if UCONFIG_NO_NORMALIZATION -/* no normalization - no combining classes */ -static U_INLINE uint8_t -u_getCombiningClass(UChar32 c) { - return 0; -} -#endif - -enum { - LOC_ROOT, - LOC_TURKISH, - LOC_LITHUANIAN -}; - -static int32_t -getCaseLocale(const char *locale) { - char lang[32]; - UErrorCode errorCode; - int32_t length; - - errorCode=U_ZERO_ERROR; - length=uloc_getLanguage(locale, lang, sizeof(lang), &errorCode); - if(U_FAILURE(errorCode) || length!=2) { - return LOC_ROOT; - } - - if( (lang[0]=='t' && lang[1]=='r') || - (lang[0]=='a' && lang[1]=='z') - ) { - return LOC_TURKISH; - } else if(lang[0]=='l' && lang[1]=='t') { - return LOC_LITHUANIAN; - } else { - return LOC_ROOT; - } -} - -/* Is case-ignorable? */ -static U_INLINE UBool -isCaseIgnorable(UChar32 c, uint32_t category) { - return (FLAG(category)&(_Mn|_Me|_Cf|_Lm|_Sk))!=0 || - c==0x27 || c==0xad || c==0x2019; -} - -/* Is this a "cased" character? */ -static U_INLINE UBool -isCased(UChar32 c, uint32_t category) { - /* Lt+Uppercase+Lowercase = Lt+Lu+Ll+Other_Uppercase+Other_Lowercase */ - return (FLAG(category)&(_Lt|_Lu|_Ll))!=0 || - (u_getUnicodeProperties(c, 1)&(FLAG(UPROPS_UPPERCASE)|FLAG(UPROPS_LOWERCASE)))!=0; -} - -/* Is Soft_Dotted? */ -static U_INLINE UBool -isSoftDotted(UChar32 c) { - return (u_getUnicodeProperties(c, 1)&FLAG(UPROPS_SOFT_DOTTED))!=0; -} - -/* Is followed by {case-ignorable}* cased ? */ -static UBool -isFollowedByCasedLetter(UCharIterator *iter, int32_t index) { - /* This is volatile because AIX 5.1 Visual Age 5.0 in 32-bit mode can't - optimize this correctly. It couldn't optimize (1UL<move(iter, index, UITER_ZERO); - for(;;) { - c=uiter_next32(iter); - if(c<0) { - break; - } - GET_PROPS_UNSAFE(c, props); - category=GET_CATEGORY(props); - if(isCased(c, category)) { - return TRUE; /* followed by cased letter */ - } - if(!isCaseIgnorable(c, category)) { - return FALSE; /* not ignorable */ - } - } - - return FALSE; /* not followed by cased letter */ -} - -/* Is preceded by cased {case-ignorable}* ? */ -static UBool -isPrecededByCasedLetter(UCharIterator *iter, int32_t index) { - /* This is volatile because AIX 5.1 Visual Age 5.0 in 32-bit mode can't - optimize this correctly. It couldn't optimize (1UL<move(iter, index, UITER_ZERO); - for(;;) { - c=uiter_previous32(iter); - if(c<0) { - break; - } - GET_PROPS_UNSAFE(c, props); - category=GET_CATEGORY(props); - if(isCased(c, category)) { - return TRUE; /* preceded by cased letter */ - } - if(!isCaseIgnorable(c, category)) { - return FALSE; /* not ignorable */ - } - } - - return FALSE; /* not followed by cased letter */ -} - -/* Is preceded by Soft_Dotted character with no intervening cc=230 ? */ -static UBool -isPrecededBySoftDotted(UCharIterator *iter, int32_t index) { - int32_t c; - uint8_t cc; - - if(iter==NULL) { - return FALSE; - } - - iter->move(iter, index, UITER_ZERO); - for(;;) { - c=uiter_previous32(iter); - if(c<0) { - break; - } - if(isSoftDotted(c)) { - return TRUE; /* preceded by TYPE_i */ - } - - cc=u_getCombiningClass(c); - if(cc==0 || cc==230) { - return FALSE; /* preceded by different base character (not TYPE_i), or intervening cc==230 */ - } + /* Add Hangul type boundaries for UCHAR_HANGUL_SYLLABLE_TYPE. */ + for(c=HANGUL_BASE; c<(HANGUL_BASE+HANGUL_COUNT); c+=JAMO_T_COUNT) { + sa->add(sa->set, c); + sa->add(sa->set, c+1); } - - return FALSE; /* not preceded by TYPE_i */ + sa->add(sa->set, c); } -/* - * See Jitterbug 2344: - * The condition After_I for Turkic-lowercasing of U+0307 combining dot above - * is checked in ICU 2.0, 2.1, 2.6 but was not in 2.2 & 2.4 because - * we made those releases compatible with Unicode 3.2 which had not fixed - * a related but in SpecialCasing.txt. - * - * From the Jitterbug 2344 text: - * ... this bug is listed as a Unicode erratum - * from 2002-10-31 at http://www.unicode.org/uni2errata/UnicodeErrata.html - * - * There are two errors in SpecialCasing.txt. - * 1. Missing semicolons on two lines. ... [irrelevant for ICU] - * 2. An incorrect context definition. Correct as follows: - * < 0307; ; 0307; 0307; tr After_Soft_Dotted; # COMBINING DOT ABOVE - * < 0307; ; 0307; 0307; az After_Soft_Dotted; # COMBINING DOT ABOVE - * --- - * > 0307; ; 0307; 0307; tr After_I; # COMBINING DOT ABOVE - * > 0307; ; 0307; 0307; az After_I; # COMBINING DOT ABOVE - * where the context After_I is defined as: - * The last preceding base character was an uppercase I, and there is no - * intervening combining character class 230 (ABOVE). - * - * - * Note that SpecialCasing.txt even in Unicode 3.2 described the condition as: - * - * # When lowercasing, remove dot_above in the sequence I + dot_above, which will turn into i. - * # This matches the behavior of the canonically equivalent I-dot_above - * - * See also the description in this place in older versions of uchar.c (revision 1.100). - * - * Markus W. Scherer 2003-feb-15 - */ - -/* Is preceded by base character 'I' with no intervening cc=230 ? */ -static UBool -isPrecededBy_I(UCharIterator *iter, int32_t index) { - int32_t c; - uint8_t cc; - - if(iter==NULL) { - return FALSE; - } - - iter->move(iter, index, UITER_ZERO); - for(;;) { - c=uiter_previous32(iter); - if(c<0) { - break; - } - if(c==0x49) { - return TRUE; /* preceded by I */ - } - - cc=u_getCombiningClass(c); - if(cc==0 || cc==230) { - return FALSE; /* preceded by different base character (not I), or intervening cc==230 */ - } - } - - return FALSE; /* not preceded by I */ -} - -/* Is followed by one or more cc==230 ? */ -static UBool -isFollowedByMoreAbove(UCharIterator *iter, int32_t index) { - int32_t c; - uint8_t cc; - - if(iter==NULL) { - return FALSE; - } - - iter->move(iter, index, UITER_ZERO); - for(;;) { - c=uiter_next32(iter); - if(c<0) { - break; - } - cc=u_getCombiningClass(c); - if(cc==230) { - return TRUE; /* at least one cc==230 following */ - } - if(cc==0) { - return FALSE; /* next base character, no more cc==230 following */ - } - } - - return FALSE; /* no more cc==230 following */ -} - -/* Is followed by a dot above (without cc==230 in between) ? */ -static UBool -isFollowedByDotAbove(UCharIterator *iter, int32_t index) { - int32_t c; - uint8_t cc; - - if(iter==NULL) { - return FALSE; - } - - iter->move(iter, index, UITER_ZERO); - for(;;) { - c=uiter_next32(iter); - if(c<0) { - break; - } - if(c==0x307) { - return TRUE; - } - cc=u_getCombiningClass(c); - if(cc==0 || cc==230) { - return FALSE; /* next base character or cc==230 in between */ - } - } - - return FALSE; /* no dot above following */ -} - -/* lowercasing -------------------------------------------------------------- */ - -/* internal, see ustr_imp.h */ -U_CAPI int32_t U_EXPORT2 -u_internalToLower(UChar32 c, UCharIterator *iter, - UChar *dest, int32_t destCapacity, - const char *locale) { - UChar buffer[8]; - uint32_t props; - UChar32 result; - int32_t i, length; - - result=c; - GET_PROPS(c, props); - if(!PROPS_VALUE_IS_EXCEPTION(props)) { - if(CAT_MASK(props)&(U_GC_LU_MASK|U_GC_LT_MASK)) { - result=c+GET_SIGNED_VALUE(props); - } - } else { - const UChar *u; - const uint32_t *pe=GET_EXCEPTIONS(props); - uint32_t firstExceptionValue=*pe, specialCasing; - int32_t minLength; - - if(HAVE_EXCEPTION_VALUE(firstExceptionValue, EXC_SPECIAL_CASING)) { - i=EXC_SPECIAL_CASING; - ++pe; - ADD_EXCEPTION_OFFSET(firstExceptionValue, i, pe); - specialCasing=*pe; - /* fill u and length with the case mapping result string */ - if(specialCasing&0x80000000) { - /* use hardcoded conditions and mappings */ - int32_t loc=getCaseLocale(locale), - srcIndex= iter!=NULL ? iter->getIndex(iter, UITER_CURRENT) : 0; - - /* - * Test for conditional mappings first - * (otherwise the unconditional default mappings are always taken), - * then test for characters that have unconditional mappings in SpecialCasing.txt, - * then get the UnicodeData.txt mappings. - */ - if( loc==LOC_LITHUANIAN && - /* base characters, find accents above */ - (((c==0x49 || c==0x4a || c==0x12e) && - isFollowedByMoreAbove(iter, srcIndex)) || - /* precomposed with accent above, no need to find one */ - (c==0xcc || c==0xcd || c==0x128)) - ) { - /* - # Lithuanian - - # Lithuanian retains the dot in a lowercase i when followed by accents. - - # Introduce an explicit dot above when lowercasing capital I's and J's - # whenever there are more accents above. - # (of the accents used in Lithuanian: grave, acute, tilde above, and ogonek) - - 0049; 0069 0307; 0049; 0049; lt More_Above; # LATIN CAPITAL LETTER I - 004A; 006A 0307; 004A; 004A; lt More_Above; # LATIN CAPITAL LETTER J - 012E; 012F 0307; 012E; 012E; lt More_Above; # LATIN CAPITAL LETTER I WITH OGONEK - 00CC; 0069 0307 0300; 00CC; 00CC; lt; # LATIN CAPITAL LETTER I WITH GRAVE - 00CD; 0069 0307 0301; 00CD; 00CD; lt; # LATIN CAPITAL LETTER I WITH ACUTE - 0128; 0069 0307 0303; 0128; 0128; lt; # LATIN CAPITAL LETTER I WITH TILDE - */ - u=buffer; - buffer[1]=0x307; - switch(c) { - case 0x49: /* LATIN CAPITAL LETTER I */ - buffer[0]=0x69; - length=2; - break; - case 0x4a: /* LATIN CAPITAL LETTER J */ - buffer[0]=0x6a; - length=2; - break; - case 0x12e: /* LATIN CAPITAL LETTER I WITH OGONEK */ - buffer[0]=0x12f; - length=2; - break; - case 0xcc: /* LATIN CAPITAL LETTER I WITH GRAVE */ - buffer[0]=0x69; - buffer[2]=0x300; - length=3; - break; - case 0xcd: /* LATIN CAPITAL LETTER I WITH ACUTE */ - buffer[0]=0x69; - buffer[2]=0x301; - length=3; - break; - case 0x128: /* LATIN CAPITAL LETTER I WITH TILDE */ - buffer[0]=0x69; - buffer[2]=0x303; - length=3; - break; - default: - return 0; /* will not occur */ - } - /* # Turkish and Azeri */ - } else if(loc==LOC_TURKISH && c==0x130) { - /* - # I and i-dotless; I-dot and i are case pairs in Turkish and Azeri - # The following rules handle those cases. - - 0130; 0069; 0130; 0130; tr # LATIN CAPITAL LETTER I WITH DOT ABOVE - 0130; 0069; 0130; 0130; az # LATIN CAPITAL LETTER I WITH DOT ABOVE - */ - result=0x69; - goto single; - } else if(loc==LOC_TURKISH && c==0x307 && isPrecededBy_I(iter, srcIndex-1)) { - /* - # When lowercasing, remove dot_above in the sequence I + dot_above, which will turn into i. - # This matches the behavior of the canonically equivalent I-dot_above - - 0307; ; 0307; 0307; tr After_I; # COMBINING DOT ABOVE - 0307; ; 0307; 0307; az After_I; # COMBINING DOT ABOVE - */ - return 0; /* remove the dot (continue without output) */ - } else if(loc==LOC_TURKISH && c==0x49 && !isFollowedByDotAbove(iter, srcIndex)) { - /* - # When lowercasing, unless an I is before a dot_above, it turns into a dotless i. - - 0049; 0131; 0049; 0049; tr Not_Before_Dot; # LATIN CAPITAL LETTER I - 0049; 0131; 0049; 0049; az Not_Before_Dot; # LATIN CAPITAL LETTER I - */ - result=0x131; - goto single; - } else if(c==0x130) { - /* - # Preserve canonical equivalence for I with dot. Turkic is handled below. - - 0130; 0069 0307; 0130; 0130; # LATIN CAPITAL LETTER I WITH DOT ABOVE - */ - static const UChar iWithDot[2]={ 0x69, 0x307 }; - u=iWithDot; - length=2; - } else if( c==0x3a3 && - !isFollowedByCasedLetter(iter, srcIndex) && - isPrecededByCasedLetter(iter, srcIndex-1) - ) { - /* greek capital sigma maps depending on surrounding cased letters (see SpecialCasing.txt) */ - /* - # Special case for final form of sigma - - 03A3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK CAPITAL LETTER SIGMA - */ - result=0x3c2; /* greek small final sigma */ - goto single; - } else { - /* no known conditional special case mapping, use a normal mapping */ - pe=GET_EXCEPTIONS(props); /* restore the initial exception pointer */ - firstExceptionValue=*pe; - goto notSpecial; - } - } else { - /* get the special case mapping string from the data file */ - u=ucharsTable+(specialCasing&0xffff); - length=(int32_t)((*u++)&0x1f); - } - - /* copy the result string */ - minLength = (length < destCapacity) ? length : destCapacity; - i=0; - while(idestCapacity) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - return destIndex; +static UBool U_CALLCONV +_enumPropertyStartsRange(const void *context, UChar32 start, UChar32 limit, uint32_t value) { + /* add the start code point to the USet */ + USetAdder *sa=(USetAdder *)context; + sa->add(sa->set, start); + return TRUE; } -/* uppercasing -------------------------------------------------------------- */ - -/* internal */ -static int32_t -u_internalToUpperOrTitle(UChar32 c, UCharIterator *iter, - UChar *dest, int32_t destCapacity, - const char *locale, - UBool upperNotTitle) { - uint32_t props; - UChar32 result; - int32_t i, length; - - result=c; - GET_PROPS(c, props); - if(!PROPS_VALUE_IS_EXCEPTION(props)) { - if(GET_CATEGORY(props)==U_LOWERCASE_LETTER) { - result=c-GET_SIGNED_VALUE(props); - } - } else { - const UChar *u; - const uint32_t *pe=GET_EXCEPTIONS(props); - uint32_t firstExceptionValue=*pe, specialCasing; - if(HAVE_EXCEPTION_VALUE(firstExceptionValue, EXC_SPECIAL_CASING)) { - i=EXC_SPECIAL_CASING; - ++pe; - ADD_EXCEPTION_OFFSET(firstExceptionValue, i, pe); - specialCasing=*pe; - /* fill u and length with the case mapping result string */ - if(specialCasing&0x80000000) { - /* use hardcoded conditions and mappings */ - int32_t loc=getCaseLocale(locale), - srcIndex= iter!=NULL ? iter->getIndex(iter, UITER_CURRENT) : 0; - - if(loc==LOC_TURKISH && c==0x69) { - /* - # Turkish and Azeri - - # I and i-dotless; I-dot and i are case pairs in Turkish and Azeri - # The following rules handle those cases. - - # When uppercasing, i turns into a dotted capital I - - 0069; 0069; 0130; 0130; tr; # LATIN SMALL LETTER I - 0069; 0069; 0130; 0130; az; # LATIN SMALL LETTER I - */ - result=0x130; - goto single; - } else if(loc==LOC_LITHUANIAN && c==0x307 && isPrecededBySoftDotted(iter, srcIndex-1)) { - /* - # Lithuanian - - # Lithuanian retains the dot in a lowercase i when followed by accents. - - # Remove DOT ABOVE after "i" with upper or titlecase - - 0307; 0307; ; ; lt After_Soft_Dotted; # COMBINING DOT ABOVE - */ - return 0; /* remove the dot (continue without output) */ - } else { - /* no known conditional special case mapping, use a normal mapping */ - pe=GET_EXCEPTIONS(props); /* restore the initial exception pointer */ - firstExceptionValue=*pe; - goto notSpecial; - } - } else { - /* get the special case mapping string from the data file */ - u=ucharsTable+(specialCasing&0xffff); - length=(int32_t)*u++; - - /* skip the lowercase result string */ - u+=length&0x1f; - if(upperNotTitle) { - length=(length>>5)&0x1f; - } else { - /* skip the uppercase result strings too */ - u+=(length>>5)&0x1f; - length=(length>>10)&0x1f; - } - } - - /* copy the result string */ - i=0; - while(iadd(sa->set, cp); sa->add(sa->set, cp+1) -single: - length=UTF_CHAR_LENGTH(result); - if(length<=destCapacity) { - /* write result to dest */ - i=0; - UTF_APPEND_CHAR_UNSAFE(dest, i, result); +U_CAPI void U_EXPORT2 +uchar_addPropertyStarts(USetAdder *sa, UErrorCode *pErrorCode) { + if(U_FAILURE(*pErrorCode)) { + return; } - return (result==c) ? -length : length; -} - -/* internal, see ustr_imp.h */ -U_CAPI int32_t U_EXPORT2 -u_internalToUpper(UChar32 c, UCharIterator *iter, - UChar *dest, int32_t destCapacity, - const char *locale) { - return u_internalToUpperOrTitle(c, iter, dest, destCapacity, locale, TRUE); -} - -U_CFUNC int32_t -u_internalStrToUpper(UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - const char *locale, - UErrorCode *pErrorCode) { - UCharIterator iter; - uint32_t props; - int32_t srcIndex, destIndex; - UChar32 c; - /* test early, once, if there is a data file */ if(!HAVE_DATA) { - *pErrorCode=U_FILE_ACCESS_ERROR; - return 0; - } - - /* set up local variables */ - uiter_setString(&iter, src, srcLength); - - /* case mapping loop */ - srcIndex=destIndex=0; - while(srcIndexdestCapacity) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + *pErrorCode=dataErrorCode; + return; } - return destIndex; -} - -/* titlecasing -------------------------------------------------------------- */ - -/* internal, see ustr_imp.h */ -U_CAPI int32_t U_EXPORT2 -u_internalToTitle(UChar32 c, UCharIterator *iter, - UChar *dest, int32_t destCapacity, - const char *locale) { - return u_internalToUpperOrTitle(c, iter, dest, destCapacity, locale, FALSE); -} -/* case folding ------------------------------------------------------------- */ - -/* - * Case folding is similar to lowercasing. - * The result may be a simple mapping, i.e., a single code point, or - * a full mapping, i.e., a string. - * If the case folding for a code point is the same as its simple (1:1) lowercase mapping, - * then only the lowercase mapping is stored. - * - * Some special cases are hardcoded because their conditions cannot be - * parsed and processed from CaseFolding.txt. - * - * Unicode 3.2 CaseFolding.txt specifies for its status field: - -# C: common case folding, common mappings shared by both simple and full mappings. -# F: full case folding, mappings that cause strings to grow in length. Multiple characters are separated by spaces. -# S: simple case folding, mappings to single characters where different from F. -# T: special case for uppercase I and dotted uppercase I -# - For non-Turkic languages, this mapping is normally not used. -# - For Turkic languages (tr, az), this mapping can be used instead of the normal mapping for these characters. -# -# Usage: -# A. To do a simple case folding, use the mappings with status C + S. -# B. To do a full case folding, use the mappings with status C + F. -# -# The mappings with status T can be used or omitted depending on the desired case-folding -# behavior. (The default option is to exclude them.) - - * Unicode 3.2 has 'T' mappings as follows: - -0049; T; 0131; # LATIN CAPITAL LETTER I -0130; T; 0069; # LATIN CAPITAL LETTER I WITH DOT ABOVE - - * while the default mappings for these code points are: - -0049; C; 0069; # LATIN CAPITAL LETTER I -0130; F; 0069 0307; # LATIN CAPITAL LETTER I WITH DOT ABOVE - - * U+0130 is otherwise lowercased to U+0069 (UnicodeData.txt). - * - * In case this code is used with CaseFolding.txt from an older version of Unicode - * where CaseFolding.txt contains mappings with a status of 'I' that - * have the opposite polarity ('I' mappings are included by default but excluded for Turkic), - * we must also hardcode the Unicode 3.2 mappings for the code points - * with 'I' mappings. - * Unicode 3.1.1 has 'I' mappings for U+0130 and U+0131. - * Unicode 3.2 has a 'T' mapping for U+0130, and lowercases U+0131 to itself (see UnicodeData.txt). - */ - -/* return the simple case folding mapping for c */ -U_CAPI UChar32 U_EXPORT2 -u_foldCase(UChar32 c, uint32_t options) { - uint32_t props; - GET_PROPS(c, props); - if(!PROPS_VALUE_IS_EXCEPTION(props)) { - if(CAT_MASK(props)&(U_GC_LU_MASK|U_GC_LT_MASK)) { - return c+GET_SIGNED_VALUE(props); - } - } else { - const uint32_t *pe=GET_EXCEPTIONS(props); - uint32_t firstExceptionValue=*pe; - if(HAVE_EXCEPTION_VALUE(firstExceptionValue, EXC_CASE_FOLDING)) { - const uint32_t *oldPE=pe; - int i=EXC_CASE_FOLDING; - ++pe; - ADD_EXCEPTION_OFFSET(firstExceptionValue, i, pe); - props=*pe; - if(props!=0) { - /* return the simple mapping, if there is one */ - const UChar *uchars=ucharsTable+(props&0xffff); - UChar32 simple; - i=0; - UTF_NEXT_CHAR_UNSAFE(uchars, i, simple); - if(simple!=0) { - return simple; - } - /* fall through to use the lowercase exception value if there is no simple mapping */ - pe=oldPE; - } else { - /* special case folding mappings, hardcoded */ - if((options&_FOLD_CASE_OPTIONS_MASK)==U_FOLD_CASE_DEFAULT) { - /* default mappings */ - if(c==0x49) { - /* 0049; C; 0069; # LATIN CAPITAL LETTER I */ - return 0x69; - } else if(c==0x130) { - /* no simple default mapping for U+0130, use UnicodeData.txt */ - return 0x69; - } - } else { - /* Turkic mappings */ - if(c==0x49) { - /* 0049; T; 0131; # LATIN CAPITAL LETTER I */ - return 0x131; - } else if(c==0x130) { - /* 0130; T; 0069; # LATIN CAPITAL LETTER I WITH DOT ABOVE */ - return 0x69; - } - } - /* return c itself because there is no special mapping for it */ - return c; - } - } - /* not else! - allow to fall through from above */ - if(HAVE_EXCEPTION_VALUE(firstExceptionValue, EXC_LOWERCASE)) { - int i=EXC_LOWERCASE; - ++pe; - ADD_EXCEPTION_OFFSET(firstExceptionValue, i, pe); - return (UChar32)*pe; - } - } - return c; /* no mapping - return c itself */ -} + /* add the start code point of each same-value range of each trie */ + utrie_enum(&propsTrie, NULL, _enumPropertyStartsRange, sa); + utrie_enum(&propsVectorsTrie, NULL, _enumPropertyStartsRange, sa); -/* - * Issue for canonical caseless match (UAX #21): - * Turkic casefolding (using "T" mappings in CaseFolding.txt) does not preserve - * canonical equivalence, unlike default-option casefolding. - * For example, I-grave and I + grave fold to strings that are not canonically - * equivalent. - * For more details, see the comment in unorm_compare() in unorm.cpp - * and the intermediate prototype changes for Jitterbug 2021. - * (For example, revision 1.104 of uchar.c and 1.4 of CaseFolding.txt.) - * - * This did not get fixed because it appears that it is not possible to fix - * it for uppercase and lowercase characters (I-grave vs. i-grave) - * together in a way that they still fold to common result strings. - */ + /* add code points with hardcoded properties, plus the ones following them */ -/* internal, see ustr_imp.h */ -U_CAPI int32_t U_EXPORT2 -u_internalFoldCase(UChar32 c, - UChar *dest, int32_t destCapacity, - uint32_t options) { - uint32_t props; - UChar32 result; - int32_t i, length; - - result=c; - GET_PROPS_UNSAFE(c, props); - if(!PROPS_VALUE_IS_EXCEPTION(props)) { - if(CAT_MASK(props)&(U_GC_LU_MASK|U_GC_LT_MASK)) { - /* same as lowercase */ - result=c+GET_SIGNED_VALUE(props); - } - } else { - const uint32_t *pe=GET_EXCEPTIONS(props); - uint32_t firstExceptionValue=*pe; - if(HAVE_EXCEPTION_VALUE(firstExceptionValue, EXC_CASE_FOLDING)) { - i=EXC_CASE_FOLDING; - ++pe; - ADD_EXCEPTION_OFFSET(firstExceptionValue, i, pe); - props=*pe; - if(props!=0) { - /* return the full mapping */ - const UChar *uchars=ucharsTable+(props&0xffff)+2; - int32_t minLength; - - length=props>>24; - minLength = (length < destCapacity) ? length : destCapacity; - - /* copy the result string */ - i=0; - while(iadd(sa->set, TAB); /* range TAB..CR */ + sa->add(sa->set, CR+1); + sa->add(sa->set, 0x1c); + sa->add(sa->set, 0x1f+1); + USET_ADD_CP_AND_NEXT(sa, NL); -/* single: */ - length=UTF_CHAR_LENGTH(result); - if(length<=destCapacity) { - /* write result to dest */ - i=0; - UTF_APPEND_CHAR_UNSAFE(dest, i, result); - } - return (result==c) ? -length : length; -} + /* add for u_isIDIgnorable() what was not added above */ + sa->add(sa->set, DEL); /* range DEL..NBSP-1, NBSP added below */ + sa->add(sa->set, HAIRSP); + sa->add(sa->set, RLM+1); + sa->add(sa->set, INHSWAP); + sa->add(sa->set, NOMDIG+1); + USET_ADD_CP_AND_NEXT(sa, ZWNBSP); -/* case-fold the source string using the full mappings */ -U_CFUNC int32_t -u_internalStrFoldCase(UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - uint32_t options, - UErrorCode *pErrorCode) { - uint32_t props; - int32_t srcIndex, destIndex; - UChar32 c; + /* add no-break spaces for u_isWhitespace() what was not added above */ + USET_ADD_CP_AND_NEXT(sa, NBSP); + USET_ADD_CP_AND_NEXT(sa, FIGURESP); + USET_ADD_CP_AND_NEXT(sa, NNBSP); - /* test early, once, if there is a data file */ - if(!HAVE_DATA) { - *pErrorCode=U_FILE_ACCESS_ERROR; - return 0; - } + /* add for u_charDigitValue() */ + USET_ADD_CP_AND_NEXT(sa, 0x3007); + USET_ADD_CP_AND_NEXT(sa, 0x4e00); + USET_ADD_CP_AND_NEXT(sa, 0x4e8c); + USET_ADD_CP_AND_NEXT(sa, 0x4e09); + USET_ADD_CP_AND_NEXT(sa, 0x56db); + USET_ADD_CP_AND_NEXT(sa, 0x4e94); + USET_ADD_CP_AND_NEXT(sa, 0x516d); + USET_ADD_CP_AND_NEXT(sa, 0x4e03); + USET_ADD_CP_AND_NEXT(sa, 0x516b); + USET_ADD_CP_AND_NEXT(sa, 0x4e5d); - /* case mapping loop */ - srcIndex=destIndex=0; - while(srcIndexadd(sa->set, U_a); + sa->add(sa->set, U_z+1); + sa->add(sa->set, U_A); + sa->add(sa->set, U_Z+1); - /* handle 1:1 code point mappings from UnicodeData.txt */ - if(c<=0xffff) { - if(destIndexadd(sa->set, WJ); /* range WJ..NOMDIG */ + sa->add(sa->set, 0xfff0); + sa->add(sa->set, 0xfffb+1); + sa->add(sa->set, 0xe0000); + sa->add(sa->set, 0xe0fff+1); - if(destIndexdestCapacity) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - return destIndex; + /* add for UCHAR_JOINING_TYPE */ + sa->add(sa->set, ZWNJ); /* range ZWNJ..ZWJ */ + sa->add(sa->set, ZWJ+1); } diff --git a/icuSources/common/uchriter.cpp b/icuSources/common/uchriter.cpp index 2573baa9..ae73695a 100644 --- a/icuSources/common/uchriter.cpp +++ b/icuSources/common/uchriter.cpp @@ -1,6 +1,6 @@ /* ****************************************************************************** -* Copyright (C) 1998-2001, International Business Machines Corporation and * +* Copyright (C) 1998-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ****************************************************************************** */ @@ -11,7 +11,7 @@ U_NAMESPACE_BEGIN -const char UCharCharacterIterator::fgClassID = 0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(UCharCharacterIterator) UCharCharacterIterator::UCharCharacterIterator() : CharacterIterator(), diff --git a/icuSources/common/ucln.h b/icuSources/common/ucln.h index cb3150dc..2f3f98c8 100644 --- a/icuSources/common/ucln.h +++ b/icuSources/common/ucln.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * * -* Copyright (C) 2001-2003, International Business Machines * +* Copyright (C) 2001-2004, International Business Machines * * Corporation and others. All Rights Reserved. * * * ****************************************************************************** @@ -50,14 +50,16 @@ typedef enum ECleanupLibraryType { UCLN_START = -1, UCLN_CUSTOM, /* Custom is for anyone else. */ - UCLN_LAYOUT, UCLN_LAYOUTEX, - UCLN_USTDIO, + UCLN_LAYOUT, + UCLN_IO, UCLN_I18N, UCLN_COMMON /* This must be the last one to cleanup. */ } ECleanupLibraryType; -typedef UBool cleanupFunc(void); +U_CDECL_BEGIN +typedef UBool U_CALLCONV cleanupFunc(void); +U_CDECL_END U_CAPI void U_EXPORT2 ucln_registerCleanup(ECleanupLibraryType type, cleanupFunc *func); diff --git a/icuSources/common/ucln_cmn.c b/icuSources/common/ucln_cmn.c index e74f3015..c14b3dbc 100644 --- a/icuSources/common/ucln_cmn.c +++ b/icuSources/common/ucln_cmn.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * * -* Copyright (C) 2001-2003, International Business Machines * +* Copyright (C) 2001-2004, International Business Machines * * Corporation and others. All Rights Reserved. * * * ****************************************************************************** @@ -16,113 +16,37 @@ #include "unicode/utypes.h" #include "unicode/uclean.h" +#include "utracimp.h" #include "ustr_imp.h" #include "unormimp.h" #include "ucln_cmn.h" #include "umutex.h" #include "ucln.h" +#include "cmemory.h" +#include "uassert.h" -static cleanupFunc *gCleanupFunctions[UCLN_COMMON] = { - NULL, - NULL, - NULL, - NULL, - NULL -}; +static cleanupFunc *gCommonCleanupFunctions[UCLN_COMMON_COUNT]; -U_CAPI void U_EXPORT2 -ucln_registerCleanup(ECleanupLibraryType type, - cleanupFunc *func) +void ucln_common_registerCleanup(ECleanupCommonType type, + cleanupFunc *func) { - if (UCLN_START < type && type < UCLN_COMMON) + U_ASSERT(UCLN_COMMON_START < type && type < UCLN_COMMON_COUNT); + if (UCLN_COMMON_START < type && type < UCLN_COMMON_COUNT) { - gCleanupFunctions[type] = func; + gCommonCleanupFunctions[type] = func; } } -/************************************************ - The cleanup order is important in this function. - Please be sure that you have read ucln.h - ************************************************/ -U_CAPI void U_EXPORT2 -u_cleanup(void) -{ +U_CFUNC UBool ucln_common_lib_cleanup(void) { + ECleanupCommonType commonFunc; - ECleanupLibraryType libType = UCLN_START; - while (++libType < UCLN_COMMON) - { - if (gCleanupFunctions[libType]) + for (commonFunc = UCLN_COMMON_START+1; commonFunc +#endif + +U_CFUNC uint16_t +udata_getHeaderSize(const DataHeader *udh) { + if(udh==NULL) { + return 0; + } else if(udh->info.isBigEndian==U_IS_BIG_ENDIAN) { + /* same endianness */ + return udh->dataHeader.headerSize; + } else { + /* opposite endianness */ + uint16_t x=udh->dataHeader.headerSize; + return (uint16_t)((x<<8)|(x>>8)); + } +} + +U_CFUNC uint16_t +udata_getInfoSize(const UDataInfo *info) { + if(info==NULL) { + return 0; + } else if(info->isBigEndian==U_IS_BIG_ENDIAN) { + /* same endianness */ + return info->size; + } else { + /* opposite endianness */ + uint16_t x=info->size; + return (uint16_t)((x<<8)|(x>>8)); + } +} -/*----------------------------------------------------------------------------------* - * * - * Pointer TOCs. TODO: This form of table-of-contents should be removed because * - * DLLs must be relocated on loading to correct the pointer values * - * and this operation makes shared memory mapping of the data * - * much less likely to work. * - * * - *----------------------------------------------------------------------------------*/ +/*-----------------------------------------------------------------------------* + * * + * Pointer TOCs. TODO: This form of table-of-contents should be removed * + * because DLLs must be relocated on loading to correct the * + * pointer values and this operation makes shared memory * + * mapping of the data much less likely to work. * + * * + *-----------------------------------------------------------------------------*/ typedef struct { const char *entryName; const DataHeader *pHeader; @@ -48,30 +79,19 @@ typedef struct { } PointerTOC; +/* definition of OffsetTOC struct types moved to ucmndata.h */ -typedef struct { - int32_t nameOffset; - int32_t dataOffset; -} OffsetTOCEntry; - - -typedef struct { - uint32_t count; - OffsetTOCEntry entry[2]; /* Acutal size of array is from count. */ -} OffsetTOC; - - -/*----------------------------------------------------------------------------------* - * * - * entry point lookup implementations * - * * - *----------------------------------------------------------------------------------*/ +/*-----------------------------------------------------------------------------* + * * + * entry point lookup implementations * + * * + *-----------------------------------------------------------------------------*/ static uint32_t offsetTOCEntryCount(const UDataMemory *pData) { int32_t retVal=0; - const OffsetTOC *toc = (OffsetTOC *)pData->toc; + const UDataOffsetTOC *toc = (UDataOffsetTOC *)pData->toc; if (toc != NULL) { retVal = toc->count; - } + } return retVal; } @@ -79,40 +99,60 @@ static uint32_t offsetTOCEntryCount(const UDataMemory *pData) { static const DataHeader * offsetTOCLookupFn(const UDataMemory *pData, const char *tocEntryName, + int32_t *pLength, UErrorCode *pErrorCode) { - const OffsetTOC *toc = (OffsetTOC *)pData->toc; + const UDataOffsetTOC *toc = (UDataOffsetTOC *)pData->toc; if(toc!=NULL) { const char *base=(const char *)pData->toc; - uint32_t start, limit, number; + uint32_t start, limit, number, lastNumber; + int32_t strResult; + const UDataOffsetTOCEntry *entry; /* perform a binary search for the data in the common data's table of contents */ +#if defined (UDATA_DEBUG_DUMP) + /* list the contents of the TOC each time .. not recommended */ + for(start=0;startcount;start++) { + fprintf(stderr, "\tx%d: %s\n", start, &base[toc->entry[start].nameOffset]); + } +#endif + start=0; limit=toc->count; /* number of names in this table of contents */ + lastNumber=limit; + entry=toc->entry; if (limit == 0) { /* Stub common data library used during build is empty. */ return NULL; } - while(startentry[number].nameOffset])<0) { + for (;;) { + number = (start+limit)/2; + if (lastNumber == number) { /* Have we moved? */ + break; /* We haven't moved, and it wasn't found. */ + } + lastNumber = number; + strResult = uprv_strcmp(tocEntryName, base+entry[number].nameOffset); + if(strResult<0) { limit=number; - } else { + } else if (strResult>0) { start=number; } - } - - if(uprv_strcmp(tocEntryName, &base[toc->entry[start].nameOffset])==0) { - /* found it */ + else { + /* found it */ #ifdef UDATA_DEBUG -/* fprintf(stderr, "Found: %p\n",(base+toc[2*start+1])) */ - fprintf(stderr, "Found it\n"); + fprintf(stderr, "%s: Found.\n", tocEntryName); #endif - return (const DataHeader *)&base[toc->entry[start].dataOffset]; - } else { + entry += number; /* Alias the entry to the current entry. */ + if((number+1) < toc->count) { + *pLength = (int32_t)(entry[1].dataOffset - entry->dataOffset); + } else { + *pLength = -1; + } + return (const DataHeader *)(base+entry->dataOffset); + } + } #ifdef UDATA_DEBUG - fprintf(stderr, "Not found.\n"); + fprintf(stderr, "%s: Not found.\n", tocEntryName); #endif - return NULL; - } + return NULL; } else { #ifdef UDATA_DEBUG fprintf(stderr, "returning header\n"); @@ -135,34 +175,54 @@ static uint32_t pointerTOCEntryCount(const UDataMemory *pData) { static const DataHeader *pointerTOCLookupFn(const UDataMemory *pData, const char *name, + int32_t *pLength, UErrorCode *pErrorCode) { if(pData->toc!=NULL) { const PointerTOC *toc = (PointerTOC *)pData->toc; - uint32_t start, limit, number; + uint32_t start, limit, number, lastNumber; + int32_t strResult; + +#if defined (UDATA_DEBUG_DUMP) + /* list the contents of the TOC each time .. not recommended */ + for(start=0;startcount;start++) { + fprintf(stderr, "\tx%d: %s\n", start, toc->entry[start].entryName); + } +#endif /* perform a binary search for the data in the common data's table of contents */ start=0; - limit=toc->count; + limit=toc->count; + lastNumber=limit; if (limit == 0) { /* Stub common data library used during build is empty. */ return NULL; } - while(startentry[number].entryName)<0) { + for (;;) { + number = (start+limit)/2; + if (lastNumber == number) { /* Have we moved? */ + break; /* We haven't moved, and it wasn't found. */ + } + lastNumber = number; + strResult = uprv_strcmp(name, toc->entry[number].entryName); + if(strResult<0) { limit=number; - } else { + } else if (strResult>0) { start=number; } + else { + /* found it */ +#ifdef UDATA_DEBUG + fprintf(STDErr, "%s: Found.\n", toc->entry[number].entryName); +#endif + *pLength=-1; + return UDataMemory_normalizeDataPointer(toc->entry[number].pHeader); + } } - - if(uprv_strcmp(name, toc->entry[start].entryName)==0) { - /* found it */ - return UDataMemory_normalizeDataPointer(toc->entry[start].pHeader); - } else { - return NULL; - } +#ifdef UDATA_DEBUG + fprintf(stderr, "%s: Not found.\n", name); +#endif + return NULL; } else { return pData->pHeader; } @@ -176,7 +236,7 @@ static const commonDataFuncs ToCPFuncs = {pointerTOCLookupFn, pointerTOCEntryCou /*----------------------------------------------------------------------* * * * checkCommonData Validate the format of a common data file. * - * Fill in the virtual function ptr based on TOC type * + * Fill in the virtual function ptr based on TOC type * * If the data is invalid, close the UDataMemory * * and set the appropriate error code. * * * @@ -202,7 +262,7 @@ void udata_checkCommonData(UDataMemory *udm, UErrorCode *err) { ) { /* dataFormat="CmnD" */ udm->vFuncs = &CmnDFuncs; - udm->toc=(const char *)udm->pHeader+udm->pHeader->dataHeader.headerSize; + udm->toc=(const char *)udm->pHeader+udata_getHeaderSize(udm->pHeader); } else if(udm->pHeader->info.dataFormat[0]==0x54 && udm->pHeader->info.dataFormat[1]==0x6f && @@ -212,7 +272,7 @@ void udata_checkCommonData(UDataMemory *udm, UErrorCode *err) { ) { /* dataFormat="ToCP" */ udm->vFuncs = &ToCPFuncs; - udm->toc=(const char *)udm->pHeader+udm->pHeader->dataHeader.headerSize; + udm->toc=(const char *)udm->pHeader+udata_getHeaderSize(udm->pHeader); } else { /* dataFormat not recognized */ @@ -228,3 +288,22 @@ void udata_checkCommonData(UDataMemory *udm, UErrorCode *err) { } } +/* + * TODO: Add a udata_swapPackageHeader() function that swaps an ICU .dat package + * header but not its sub-items. + * This function will be needed for automatic runtime swapping. + * Sub-items should not be swapped to limit the swapping to the parts of the + * package that are actually used. + * + * Since lengths of items are implicit in the order and offsets of their + * ToC entries, and since offsets are relative to the start of the ToC, + * a swapped version may need to generate a different data structure + * with pointers to the original data items and with their lengths + * (-1 for the last one if it is not known), and maybe even pointers to the + * swapped versions of the items. + * These pointers to swapped versions would establish a cache; + * instead, each open data item could simply own the storage for its swapped + * data. This fits better with the current design. + * + * markus 2003sep18 Jitterbug 2235 + */ diff --git a/icuSources/common/ucmndata.h b/icuSources/common/ucmndata.h index 3ee38997..9634ed84 100644 --- a/icuSources/common/ucmndata.h +++ b/icuSources/common/ucmndata.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1999-2001, International Business Machines +* Copyright (C) 1999-2003, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************/ @@ -43,6 +43,33 @@ typedef struct { UDataInfo info; } DataHeader; +typedef struct { + uint32_t nameOffset; + uint32_t dataOffset; +} UDataOffsetTOCEntry; + +typedef struct { + uint32_t count; + UDataOffsetTOCEntry entry[2]; /* Actual size of array is from count. */ +} UDataOffsetTOC; + +/** + * Get the header size from a const DataHeader *udh. + * Handles opposite-endian data. + * + * @internal + */ +U_CFUNC uint16_t +udata_getHeaderSize(const DataHeader *udh); + +/** + * Get the UDataInfo.size from a const UDataInfo *info. + * Handles opposite-endian data. + * + * @internal + */ +U_CFUNC uint16_t +udata_getInfoSize(const UDataInfo *info); /* * "Virtual" functions for data lookup. @@ -54,6 +81,7 @@ typedef struct { typedef const DataHeader * (* LookupFn)(const UDataMemory *pData, const char *tocEntryName, + int32_t *pLength, UErrorCode *pErrorCode); typedef uint32_t diff --git a/icuSources/common/ucmp8.c b/icuSources/common/ucmp8.c index a26f4dc1..f22c2e13 100644 --- a/icuSources/common/ucmp8.c +++ b/icuSources/common/ucmp8.c @@ -1,7 +1,7 @@ /* ******************************************************************** -* COPYRIGHT: -* Copyright (c) 1997-2001, International Business Machines Corporation and +* COPYRIGHT: +* Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ******************************************************************** */ @@ -9,12 +9,6 @@ #include "ucmp8.h" #include "cmemory.h" -static int32_t findOverlappingPosition(CompactByteArray* this_obj, - uint32_t start, - const UChar *tempIndex, - int32_t tempIndexCount, - uint32_t cycle); - /* internal constants*/ @@ -27,18 +21,18 @@ ucmp8_getkBlockCount() { return UCMP8_kBlockCount;} U_CAPI void U_EXPORT2 ucmp8_initBogus(CompactByteArray* array) { - CompactByteArray* this_obj = array; - - if (this_obj == NULL) return; - - this_obj->fStructSize = sizeof(CompactByteArray); - this_obj->fArray = NULL; - this_obj->fIndex = NULL; - this_obj->fCount = UCMP8_kUnicodeCount; - this_obj->fCompact = FALSE; - this_obj->fBogus = TRUE; - this_obj->fAlias = FALSE; - this_obj->fIAmOwned = TRUE; + CompactByteArray* this_obj = array; + + if (this_obj == NULL) return; + + this_obj->fStructSize = sizeof(CompactByteArray); + this_obj->fArray = NULL; + this_obj->fIndex = NULL; + this_obj->fCount = UCMP8_kUnicodeCount; + this_obj->fCompact = FALSE; + this_obj->fBogus = TRUE; + this_obj->fAlias = FALSE; + this_obj->fIAmOwned = TRUE; } /* debug flags*/ @@ -66,42 +60,42 @@ ucmp8_init(CompactByteArray* array, int8_t defaultValue) * to data position number 8, which has elements "bced". In the compressed * version, index# 2 points to data position 1, which also has "bced" */ - CompactByteArray* this_obj = array; - int32_t i; - - if (this_obj == NULL) return; - - this_obj->fStructSize = sizeof(CompactByteArray); - this_obj->fArray = NULL; - this_obj->fIndex = NULL; - this_obj->fCount = UCMP8_kUnicodeCount; - this_obj->fCompact = FALSE; - this_obj->fBogus = FALSE; - this_obj->fAlias = FALSE; - this_obj->fIAmOwned = TRUE; - - - this_obj->fArray = (int8_t*) uprv_malloc(sizeof(int8_t) * UCMP8_kUnicodeCount); - if (!this_obj->fArray) + CompactByteArray* this_obj = array; + int32_t i; + + if (this_obj == NULL) return; + + this_obj->fStructSize = sizeof(CompactByteArray); + this_obj->fArray = NULL; + this_obj->fIndex = NULL; + this_obj->fCount = UCMP8_kUnicodeCount; + this_obj->fCompact = FALSE; + this_obj->fBogus = FALSE; + this_obj->fAlias = FALSE; + this_obj->fIAmOwned = TRUE; + + + this_obj->fArray = (int8_t*) uprv_malloc(sizeof(int8_t) * UCMP8_kUnicodeCount); + if (!this_obj->fArray) { - this_obj->fBogus = TRUE; - return; + this_obj->fBogus = TRUE; + return; } - this_obj->fIndex = (uint16_t*) uprv_malloc(sizeof(uint16_t) * UCMP8_kIndexCount); - if (!this_obj->fIndex) + this_obj->fIndex = (uint16_t*) uprv_malloc(sizeof(uint16_t) * UCMP8_kIndexCount); + if (!this_obj->fIndex) { - uprv_free(this_obj->fArray); - this_obj->fArray = NULL; - this_obj->fBogus = TRUE; - return; + uprv_free(this_obj->fArray); + this_obj->fArray = NULL; + this_obj->fBogus = TRUE; + return; } - for (i = 0; i < UCMP8_kUnicodeCount; ++i) + for (i = 0; i < UCMP8_kUnicodeCount; ++i) { - this_obj->fArray[i] = defaultValue; + this_obj->fArray[i] = defaultValue; } - for (i = 0; i < UCMP8_kIndexCount; ++i) + for (i = 0; i < UCMP8_kIndexCount; ++i) { - this_obj->fIndex[i] = (uint16_t)(i << UCMP8_kBlockShift); + this_obj->fIndex[i] = (uint16_t)(i << UCMP8_kBlockShift); } } @@ -128,46 +122,45 @@ ucmp8_open(int8_t defaultValue) * to data position number 8, which has elements "bced". In the compressed * version, index# 2 points to data position 1, which also has "bced" */ - CompactByteArray* this_obj = (CompactByteArray*) uprv_malloc(sizeof(CompactByteArray)); - int32_t i; - - if (this_obj == NULL) return NULL; + CompactByteArray* this_obj = (CompactByteArray*) uprv_malloc(sizeof(CompactByteArray)); + int32_t i; - this_obj->fStructSize = sizeof(CompactByteArray); - this_obj->fArray = NULL; - this_obj->fIndex = NULL; - this_obj->fCount = UCMP8_kUnicodeCount; - this_obj->fCompact = FALSE; - this_obj->fBogus = FALSE; - this_obj->fAlias = FALSE; - this_obj->fIAmOwned = FALSE; + if (this_obj == NULL) return NULL; + this_obj->fStructSize = sizeof(CompactByteArray); + this_obj->fArray = NULL; + this_obj->fIndex = NULL; + this_obj->fCount = UCMP8_kUnicodeCount; + this_obj->fCompact = FALSE; + this_obj->fBogus = FALSE; + this_obj->fAlias = FALSE; + this_obj->fIAmOwned = FALSE; - this_obj->fArray = (int8_t*) uprv_malloc(sizeof(int8_t) * UCMP8_kUnicodeCount); - if (!this_obj->fArray) + this_obj->fArray = (int8_t*) uprv_malloc(sizeof(int8_t) * UCMP8_kUnicodeCount); + if (!this_obj->fArray) { - this_obj->fBogus = TRUE; - return NULL; + this_obj->fBogus = TRUE; + return NULL; } - this_obj->fIndex = (uint16_t*) uprv_malloc(sizeof(uint16_t) * UCMP8_kIndexCount); - if (!this_obj->fIndex) + this_obj->fIndex = (uint16_t*) uprv_malloc(sizeof(uint16_t) * UCMP8_kIndexCount); + if (!this_obj->fIndex) { - uprv_free(this_obj->fArray); - this_obj->fArray = NULL; - this_obj->fBogus = TRUE; - return NULL; + uprv_free(this_obj->fArray); + this_obj->fArray = NULL; + this_obj->fBogus = TRUE; + return NULL; } - for (i = 0; i < UCMP8_kUnicodeCount; ++i) + for (i = 0; i < UCMP8_kUnicodeCount; ++i) { - this_obj->fArray[i] = defaultValue; + this_obj->fArray[i] = defaultValue; } - for (i = 0; i < UCMP8_kIndexCount; ++i) + for (i = 0; i < UCMP8_kIndexCount; ++i) { - this_obj->fIndex[i] = (uint16_t)(i << UCMP8_kBlockShift); + this_obj->fIndex[i] = (uint16_t)(i << UCMP8_kBlockShift); } - return this_obj; + return this_obj; } U_CAPI CompactByteArray* U_EXPORT2 @@ -206,19 +199,19 @@ ucmp8_initAdopt(CompactByteArray *this_obj, int8_t *newValues, int32_t count) { - if (this_obj) { - this_obj->fCount = count; - this_obj->fBogus = FALSE; - this_obj->fStructSize = sizeof(CompactByteArray); - - this_obj->fArray = newValues; - this_obj->fIndex = indexArray; - this_obj->fCompact = (UBool)((count < UCMP8_kUnicodeCount) ? TRUE : FALSE); - this_obj->fAlias = FALSE; - this_obj->fIAmOwned = TRUE; - } + if (this_obj) { + this_obj->fCount = count; + this_obj->fBogus = FALSE; + this_obj->fStructSize = sizeof(CompactByteArray); + + this_obj->fArray = newValues; + this_obj->fIndex = indexArray; + this_obj->fCompact = (UBool)((count < UCMP8_kUnicodeCount) ? TRUE : FALSE); + this_obj->fAlias = FALSE; + this_obj->fIAmOwned = TRUE; + } - return this_obj; + return this_obj; } U_CAPI CompactByteArray* U_EXPORT2 @@ -227,78 +220,78 @@ ucmp8_initAlias(CompactByteArray *this_obj, int8_t *newValues, int32_t count) { - if (this_obj) { - this_obj->fArray = NULL; - this_obj->fIndex = NULL; - this_obj->fCount = count; - this_obj->fBogus = FALSE; - this_obj->fStructSize = sizeof(CompactByteArray); - - this_obj->fArray = newValues; - this_obj->fIndex = indexArray; - this_obj->fCompact = (UBool)((count < UCMP8_kUnicodeCount) ? TRUE : FALSE); - this_obj->fAlias = TRUE; - this_obj->fIAmOwned = TRUE; - } + if (this_obj) { + this_obj->fArray = NULL; + this_obj->fIndex = NULL; + this_obj->fCount = count; + this_obj->fBogus = FALSE; + this_obj->fStructSize = sizeof(CompactByteArray); + + this_obj->fArray = newValues; + this_obj->fIndex = indexArray; + this_obj->fCompact = (UBool)((count < UCMP8_kUnicodeCount) ? TRUE : FALSE); + this_obj->fAlias = TRUE; + this_obj->fIAmOwned = TRUE; + } - return this_obj; + return this_obj; } /*=======================================================*/ U_CAPI void U_EXPORT2 -ucmp8_close(CompactByteArray* this_obj) +ucmp8_close(CompactByteArray* this_obj) { - if(this_obj != NULL) { - if(!this_obj->fAlias) { - if(this_obj->fArray != NULL) { - uprv_free(this_obj->fArray); - } - if(this_obj->fIndex != NULL) { - uprv_free(this_obj->fIndex); - } + if(this_obj != NULL) { + if(!this_obj->fAlias) { + if(this_obj->fArray != NULL) { + uprv_free(this_obj->fArray); + } + if(this_obj->fIndex != NULL) { + uprv_free(this_obj->fIndex); + } + } + if(!this_obj->fIAmOwned) /* Called if 'init' was called instead of 'open'. */ + { + uprv_free(this_obj); + } } - if(!this_obj->fIAmOwned) /* Called if 'init' was called instead of 'open'. */ - { - uprv_free(this_obj); - } - } } /*=======================================================*/ - + U_CAPI void U_EXPORT2 -ucmp8_expand(CompactByteArray* this_obj) +ucmp8_expand(CompactByteArray* this_obj) { - /* can optimize later. - * if we have to expand, then walk through the blocks instead of using Get - * this code unpacks the array by copying the blocks to the normalized position. - * Example: Compressed - * INDEX# 0 1 2 3 4 - * INDEX 0 4 1 8 2 ... - * ARRAY abcdeabazyabc... - * turns into - * Example: Expanded - * INDEX# 0 1 2 3 4 - * INDEX 0 4 8 12 16 ... - * ARRAY abcdeababcedzyabcdea... - */ + /* can optimize later. + * if we have to expand, then walk through the blocks instead of using Get + * this code unpacks the array by copying the blocks to the normalized position. + * Example: Compressed + * INDEX# 0 1 2 3 4 + * INDEX 0 4 1 8 2 ... + * ARRAY abcdeabazyabc... + * turns into + * Example: Expanded + * INDEX# 0 1 2 3 4 + * INDEX 0 4 8 12 16 ... + * ARRAY abcdeababcedzyabcdea... + */ int32_t i; - if (this_obj->fCompact) + if (this_obj->fCompact) { int8_t* tempArray; tempArray = (int8_t*) uprv_malloc(sizeof(int8_t) * UCMP8_kUnicodeCount); - if (!tempArray) + if (!tempArray) { this_obj->fBogus = TRUE; return; } - for (i = 0; i < UCMP8_kUnicodeCount; ++i) + for (i = 0; i < UCMP8_kUnicodeCount; ++i) { tempArray[i] = ucmp8_get(this_obj,(UChar)i); /* HSYS : How expand?*/ } - for (i = 0; i < UCMP8_kIndexCount; ++i) + for (i = 0; i < UCMP8_kIndexCount; ++i) { this_obj->fIndex[i] = (uint16_t)(i<< UCMP8_kBlockShift); } @@ -309,7 +302,7 @@ ucmp8_expand(CompactByteArray* this_obj) } } - + /*=======================================================*/ /* this_obj->fArray: an array to be overlapped @@ -319,60 +312,62 @@ ucmp8_expand(CompactByteArray* this_obj) * inputHash[i] = XOR of values from i-count+1 to i */ static int32_t -findOverlappingPosition(CompactByteArray* this_obj, +findOverlappingPosition(CompactByteArray* this_obj, uint32_t start, const UChar* tempIndex, int32_t tempIndexCount, - uint32_t cycle) + uint32_t cycle) { - /* this_obj is a utility routine for finding blocks that overlap. - * IMPORTANT: the cycle number is very important. Small cycles take a lot - * longer to work. In some cases, they may be able to get better compaction. - */ - - int32_t i; - int32_t j; - int32_t currentCount; - - for (i = 0; i < tempIndexCount; i += cycle) - { - currentCount = UCMP8_kBlockCount; - if (i + UCMP8_kBlockCount > tempIndexCount) - { - currentCount = tempIndexCount - i; - } - for (j = 0; j < currentCount; ++j) + /* this_obj is a utility routine for finding blocks that overlap. + * IMPORTANT: the cycle number is very important. Small cycles take a lot + * longer to work. In some cases, they may be able to get better compaction. + */ + + int32_t i; + int32_t j; + int32_t currentCount; + + for (i = 0; i < tempIndexCount; i += cycle) { - if (this_obj->fArray[start + j] != this_obj->fArray[tempIndex[i + j]]) break; + currentCount = UCMP8_kBlockCount; + if (i + UCMP8_kBlockCount > tempIndexCount) + { + currentCount = tempIndexCount - i; + } + for (j = 0; j < currentCount; ++j) + { + if (this_obj->fArray[start + j] != this_obj->fArray[tempIndex[i + j]]) + break; } - if (j == currentCount) break; + if (j == currentCount) + break; } - - return i; + + return i; } U_CAPI UBool U_EXPORT2 ucmp8_isBogus(const CompactByteArray* this_obj) { - return (UBool)(this_obj == NULL || this_obj->fBogus); + return (UBool)(this_obj == NULL || this_obj->fBogus); } U_CAPI const int8_t* U_EXPORT2 ucmp8_getArray(const CompactByteArray* this_obj) { - return this_obj->fArray; + return this_obj->fArray; } U_CAPI const uint16_t* U_EXPORT2 ucmp8_getIndex(const CompactByteArray* this_obj) { - return this_obj->fIndex; + return this_obj->fIndex; } U_CAPI int32_t U_EXPORT2 ucmp8_getCount(const CompactByteArray* this_obj) { - return this_obj->fCount; + return this_obj->fCount; } @@ -381,12 +376,12 @@ ucmp8_set(CompactByteArray* this_obj, UChar c, int8_t value) { - if (this_obj->fCompact == TRUE) + if (this_obj->fCompact == TRUE) { - ucmp8_expand(this_obj); - if (this_obj->fBogus) return; + ucmp8_expand(this_obj); + if (this_obj->fBogus) return; } - this_obj->fArray[(int32_t)c] = value; + this_obj->fArray[(int32_t)c] = value; } @@ -396,176 +391,182 @@ ucmp8_setRange(CompactByteArray* this_obj, UChar end, int8_t value) { - int32_t i; - if (this_obj->fCompact == TRUE) + int32_t i; + if (this_obj->fCompact == TRUE) { - ucmp8_expand(this_obj); - if (this_obj->fBogus) return; + ucmp8_expand(this_obj); + if (this_obj->fBogus) + return; } - for (i = start; i <= end; ++i) + for (i = start; i <= end; ++i) { - this_obj->fArray[i] = value; + this_obj->fArray[i] = value; } } /*=======================================================*/ - + U_CAPI void U_EXPORT2 ucmp8_compact(CompactByteArray* this_obj, - uint32_t cycle) + uint32_t cycle) { - if (!this_obj->fCompact) + if (!this_obj->fCompact) { - /* this_obj actually does the compaction. - * it walks throught the contents of the expanded array, finding the - * first block in the data that matches the contents of the current index. - * As it works, it keeps an updated pointer to the last position, - * so that it knows how big to make the final array - * If the matching succeeds, then the index will point into the data - * at some earlier position. - * If the matching fails, then last position pointer will be bumped, - * and the index will point to that last block of data. - */ - UChar* tempIndex; - int32_t tempIndexCount; - int8_t* tempArray; - int32_t iBlock, iIndex; - - /* fix cycle, must be 0 < cycle <= blockcount*/ - if (cycle < 0) cycle = 1; - else if (cycle > (uint32_t)UCMP8_kBlockCount) cycle = UCMP8_kBlockCount; - - /* make temp storage, larger than we need*/ - tempIndex = (UChar*) uprv_malloc(sizeof(UChar)* UCMP8_kUnicodeCount); - if (!tempIndex) - { - this_obj->fBogus = TRUE; - return; - } - /* set up first block.*/ - tempIndexCount = UCMP8_kBlockCount; - for (iIndex = 0; iIndex < UCMP8_kBlockCount; ++iIndex) - { - tempIndex[iIndex] = (uint16_t)iIndex; - }; /* endfor (iIndex = 0; .....)*/ - this_obj->fIndex[0] = 0; - - /* for each successive block, find out its first position in the compacted array*/ - for (iBlock = 1; iBlock < UCMP8_kIndexCount; ++iBlock) - { - int32_t newCount, firstPosition, block; - block = iBlock << UCMP8_kBlockShift; - /* if (debugSmall) if (block > debugSmallLimit) break;*/ - firstPosition = findOverlappingPosition(this_obj, - block, - tempIndex, - tempIndexCount, - cycle); - - /* if not contained in the current list, copy the remainder - * invariant; cumulativeHash[iBlock] = XOR of values from iBlock-kBlockCount+1 to iBlock - * we do this_obj by XORing out cumulativeHash[iBlock-kBlockCount] - */ - newCount = firstPosition + UCMP8_kBlockCount; - if (newCount > tempIndexCount) + /* this_obj actually does the compaction. + * it walks throught the contents of the expanded array, finding the + * first block in the data that matches the contents of the current index. + * As it works, it keeps an updated pointer to the last position, + * so that it knows how big to make the final array + * If the matching succeeds, then the index will point into the data + * at some earlier position. + * If the matching fails, then last position pointer will be bumped, + * and the index will point to that last block of data. + */ + UChar* tempIndex; + int32_t tempIndexCount; + int8_t* tempArray; + int32_t iBlock, iIndex; + + /* fix cycle, must be 0 < cycle <= blockcount*/ + if (cycle <= 0) + cycle = 1; + else if (cycle > (uint32_t)UCMP8_kBlockCount) + cycle = UCMP8_kBlockCount; + + /* make temp storage, larger than we need*/ + tempIndex = (UChar*) uprv_malloc(sizeof(UChar)* UCMP8_kUnicodeCount); + if (!tempIndex) { - for (iIndex = tempIndexCount; iIndex < newCount; ++iIndex) + this_obj->fBogus = TRUE; + return; + } + /* set up first block.*/ + tempIndexCount = UCMP8_kBlockCount; + for (iIndex = 0; iIndex < UCMP8_kBlockCount; ++iIndex) { - tempIndex[iIndex] = (uint16_t)(iIndex - firstPosition + block); - } /* endfor (iIndex = tempIndexCount....)*/ + tempIndex[iIndex] = (uint16_t)iIndex; + } /* endfor (iIndex = 0; .....)*/ + this_obj->fIndex[0] = 0; + + /* for each successive block, find out its first position in the compacted array*/ + for (iBlock = 1; iBlock < UCMP8_kIndexCount; ++iBlock) + { + int32_t newCount, firstPosition, block; + block = iBlock << UCMP8_kBlockShift; + /* if (debugSmall) if (block > debugSmallLimit) break;*/ + firstPosition = findOverlappingPosition(this_obj, + block, + tempIndex, + tempIndexCount, + cycle); + + /* if not contained in the current list, copy the remainder + * invariant; cumulativeHash[iBlock] = XOR of values from iBlock-kBlockCount+1 to iBlock + * we do this_obj by XORing out cumulativeHash[iBlock-kBlockCount] + */ + newCount = firstPosition + UCMP8_kBlockCount; + if (newCount > tempIndexCount) + { + for (iIndex = tempIndexCount; iIndex < newCount; ++iIndex) + { + tempIndex[iIndex] = (uint16_t)(iIndex - firstPosition + block); + } /* endfor (iIndex = tempIndexCount....)*/ tempIndexCount = newCount; } /* endif (newCount > tempIndexCount)*/ - this_obj->fIndex[iBlock] = (uint16_t)firstPosition; + this_obj->fIndex[iBlock] = (uint16_t)firstPosition; } /* endfor (iBlock = 1.....)*/ - - /* now allocate and copy the items into the array*/ - tempArray = (int8_t*) uprv_malloc(tempIndexCount * sizeof(int8_t)); - if (!tempArray) - { - this_obj->fBogus = TRUE; - uprv_free(tempIndex); - return; + + /* now allocate and copy the items into the array*/ + tempArray = (int8_t*) uprv_malloc(tempIndexCount * sizeof(int8_t)); + if (!tempArray) + { + this_obj->fBogus = TRUE; + uprv_free(tempIndex); + return; } - for (iIndex = 0; iIndex < tempIndexCount; ++iIndex) - { - tempArray[iIndex] = this_obj->fArray[tempIndex[iIndex]]; + for (iIndex = 0; iIndex < tempIndexCount; ++iIndex) + { + tempArray[iIndex] = this_obj->fArray[tempIndex[iIndex]]; } - uprv_free(this_obj->fArray); - this_obj->fArray = tempArray; - this_obj->fCount = tempIndexCount; - - - /* free up temp storage*/ - uprv_free(tempIndex); - this_obj->fCompact = TRUE; + uprv_free(this_obj->fArray); + this_obj->fArray = tempArray; + this_obj->fCount = tempIndexCount; + + + /* free up temp storage*/ + uprv_free(tempIndex); + this_obj->fCompact = TRUE; } /* endif (!this_obj->fCompact)*/ } -U_CAPI uint32_t U_EXPORT2 ucmp8_flattenMem (const CompactByteArray* array, UMemoryStream *MS) +#define MEMORY_WRITE(destAddr, source, sizeSoFar, len) \ + if (destAddr) {\ + uprv_memcpy(destAddr+sizeSoFar, source, len);\ + }\ + sizeSoFar += (len) + +U_CAPI uint32_t U_EXPORT2 ucmp8_flattenMem (const CompactByteArray* array, uint8_t *MS) { - int32_t size = 0; - - uprv_mstrm_write32(MS, ICU_UCMP8_VERSION); - size += 4; - - uprv_mstrm_write32(MS, array->fCount); - size += 4; - - uprv_mstrm_writeBlock(MS, array->fIndex, sizeof(array->fIndex[0])*UCMP8_kIndexCount); - size += sizeof(array->fIndex[0])*UCMP8_kIndexCount; - - uprv_mstrm_writeBlock(MS, array->fArray, sizeof(array->fArray[0])*array->fCount); - size += sizeof(array->fArray[0])*array->fCount; - - while(size%4) /* end padding */ - { - uprv_mstrm_writePadding(MS, 1); /* Pad total so far to even size */ - size += 1; - } - - return size; + int32_t size = 0; + static const int32_t version = ICU_UCMP8_VERSION; + + MEMORY_WRITE(MS, &version, size, 4); + + MEMORY_WRITE(MS, &array->fCount, size, 4); + + MEMORY_WRITE(MS, array->fIndex, size, sizeof(array->fIndex[0])*UCMP8_kIndexCount); + + MEMORY_WRITE(MS, array->fArray, size, sizeof(array->fArray[0])*array->fCount); + + while(size%4) /* end padding */ + { + uint8_t pad = 0; + MEMORY_WRITE(MS, &pad, size, 1); + } + + return size; } /* We use sizeof(*array), etc so that this code can be as portable as - possible between the ucmpX_ family. + possible between the ucmpX_ family. */ U_CAPI void U_EXPORT2 ucmp8_initFromData(CompactByteArray *this_obj, const uint8_t **source, UErrorCode *status) { - uint32_t i; - const uint8_t *oldSource = *source; - - if(U_FAILURE(*status)) - return; - - this_obj->fArray = NULL; - this_obj->fIndex = NULL; - this_obj->fBogus = FALSE; - this_obj->fStructSize = sizeof(CompactByteArray); - this_obj->fCompact = TRUE; - this_obj->fAlias = TRUE; - this_obj->fIAmOwned = TRUE; - - i = * ((const uint32_t*) *source); - (*source) += 4; - - if(i != ICU_UCMP8_VERSION) - { - *status = U_INVALID_FORMAT_ERROR; - return; - } - - this_obj->fCount = * ((const uint32_t*)*source); - (*source) += 4; - - this_obj->fIndex = (uint16_t*) *source; - (*source) += sizeof(this_obj->fIndex[0])*UCMP8_kIndexCount; - - this_obj->fArray = (int8_t*) *source; - (*source) += sizeof(this_obj->fArray[0])*this_obj->fCount; - - /* eat up padding */ - while((*source-(oldSource))%4) - (*source)++; + uint32_t i; + const uint8_t *oldSource = *source; + + if(U_FAILURE(*status)) + return; + + this_obj->fArray = NULL; + this_obj->fIndex = NULL; + this_obj->fBogus = FALSE; + this_obj->fStructSize = sizeof(CompactByteArray); + this_obj->fCompact = TRUE; + this_obj->fAlias = TRUE; + this_obj->fIAmOwned = TRUE; + + i = * ((const uint32_t*) *source); + (*source) += 4; + + if(i != ICU_UCMP8_VERSION) + { + *status = U_INVALID_FORMAT_ERROR; + return; + } + + this_obj->fCount = * ((const uint32_t*)*source); + (*source) += 4; + + this_obj->fIndex = (uint16_t*) *source; + (*source) += sizeof(this_obj->fIndex[0])*UCMP8_kIndexCount; + + this_obj->fArray = (int8_t*) *source; + (*source) += sizeof(this_obj->fArray[0])*this_obj->fCount; + + /* eat up padding */ + while((*source-(oldSource))%4) + (*source)++; } diff --git a/icuSources/common/ucmp8.h b/icuSources/common/ucmp8.h index 6d46c321..b4951825 100644 --- a/icuSources/common/ucmp8.h +++ b/icuSources/common/ucmp8.h @@ -1,7 +1,7 @@ /* ******************************************************************** * COPYRIGHT: - * Copyright (c) 1996-2001, International Business Machines Corporation and + * Copyright (c) 1996-2004, International Business Machines Corporation and * others. All Rights Reserved. ******************************************************************** */ @@ -16,7 +16,6 @@ */ #define ICU_UCMP8_VERSION 0x01260000 -#include "umemstrm.h" #include "unicode/utypes.h" /*==================================== @@ -227,12 +226,17 @@ U_CAPI const uint16_t* U_EXPORT2 ucmp8_getIndex(const CompactByteArray* array); U_CAPI void U_EXPORT2 ucmp8_compact(CompactByteArray* array, uint32_t cycle); -/** Expanded takes the array back to a 65536 element array*/ -/* @param array The CompactByteArray to be expanded*/ +/** Expanded takes the array back to a 65536 element array + * @param array The CompactByteArray to be expanded + */ U_CAPI void U_EXPORT2 ucmp8_expand(CompactByteArray* array); -/** (more) INTERNAL USE ONLY **/ -U_CAPI uint32_t U_EXPORT2 ucmp8_flattenMem (const CompactByteArray* array, UMemoryStream *MS); +/** + * Flatten into a memory structure. Pass in NULL to pre-flight to get the required size. + * @internal + */ +U_CAPI uint32_t U_EXPORT2 ucmp8_flattenMem(const CompactByteArray* array, uint8_t *MS); + /* initializes an existing CBA from memory. Will cause ucmp8_close() to not deallocate anything. */ U_CAPI void U_EXPORT2 ucmp8_initFromData(CompactByteArray* array, const uint8_t **source, UErrorCode *status); diff --git a/icuSources/common/ucnv.c b/icuSources/common/ucnv.c index 3cf75768..635c78fa 100644 --- a/icuSources/common/ucnv.c +++ b/icuSources/common/ucnv.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1998-2003, International Business Machines +* Copyright (C) 1998-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -20,78 +20,24 @@ */ #include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + #include "unicode/ustring.h" -#include "unicode/ures.h" #include "unicode/ucnv.h" #include "unicode/ucnv_err.h" #include "unicode/uset.h" +#include "putilimp.h" #include "cmemory.h" #include "cstring.h" +#include "uassert.h" +#include "utracimp.h" #include "ustr_imp.h" #include "ucnv_imp.h" #include "ucnv_io.h" #include "ucnv_cnv.h" #include "ucnv_bld.h" -#if 0 -/* debugging for converters */ -# include -void UCNV_DEBUG_LOG(const char *what, const char *who, const void *p, int l) -{ - static FILE *f = NULL; - if(f==NULL) - { - /* stderr, or open another file */ - f = stderr; - /* f = fopen("c:\\UCNV_DEBUG_LOG.txt", "w"); */ - } - if (!what) { - what = "(null)"; - } - if (!who) { - who = "(null)"; - } - if (!p) { - p = "(null)"; - } - - fprintf(f, "%p\t:%d\t%-20s\t%-10s\n", - p, l, who, what); - - fflush(f); -} - - -/* dump the contents of a converter */ -static void UCNV_DEBUG_CNV(const UConverter *c, int line) -{ - UErrorCode err = U_ZERO_ERROR; - fprintf(stderr, "%p\t:%d\t", c, line); - if(c!=NULL) { - const char *name = ucnv_getName(c, &err); - if (!name) { - name = "(null)"; - } - fprintf(stderr, "%s\t", name); - - fprintf(stderr, "shr=%p, ref=%x\n", - c->sharedData, - c->sharedData->referenceCounter); - } else { - fprintf(stderr, "DEMISED\n"); - } -} - -# define UCNV_DEBUG 1 -# define UCNV_DEBUG_LOG(x,y,z) UCNV_DEBUG_LOG(x,y,z,__LINE__) -# define UCNV_DEBUG_CNV(c) UCNV_DEBUG_CNV(c, __LINE__) -#else -# define UCNV_DEBUG_LOG(x,y,z) -# define UCNV_DEBUG_CNV(c) -#endif - - - /* size of intermediate and preflighting buffers in ucnv_convert() */ #define CHUNK_SIZE 1024 @@ -103,6 +49,7 @@ typedef struct UAmbiguousConverter { static const UAmbiguousConverter ambiguousConverters[]={ { "ibm-942_P120-1999", 0xa5 }, { "ibm-943_P130-1999", 0xa5 }, + { "ibm-897_P100-1995", 0xa5 }, { "ibm-33722_P120-1999", 0xa5 }, { "ibm-949_P110-1999", 0x20a9 }, { "ibm-1363_P110-1997", 0x20a9 }, @@ -128,13 +75,10 @@ ucnv_open (const char *name, UConverter *r; if (err == NULL || U_FAILURE (*err)) { - UCNV_DEBUG_LOG("open", name, NULL); return NULL; } r = ucnv_createConverter(NULL, name, err); - UCNV_DEBUG_LOG("open", name, r); - UCNV_DEBUG_CNV(r); return r; } @@ -215,34 +159,26 @@ ucnv_safeClone(const UConverter* cnv, void *stackBuffer, int32_t *pBufferSize, U NULL }; + UTRACE_ENTRY_OC(UTRACE_UCNV_CLONE); + if (status == NULL || U_FAILURE(*status)){ + UTRACE_EXIT_STATUS(status? *status: U_ILLEGAL_ARGUMENT_ERROR); return 0; } if (!pBufferSize || !cnv){ - *status = U_ILLEGAL_ARGUMENT_ERROR; + *status = U_ILLEGAL_ARGUMENT_ERROR; + UTRACE_EXIT_STATUS(*status); return 0; } - UCNV_DEBUG_LOG("cloning FROM", ucnv_getName(cnv,status), cnv); - UCNV_DEBUG_LOG("cloning WITH", "memory", stackBuffer); - UCNV_DEBUG_CNV(cnv); + UTRACE_DATA3(UTRACE_OPEN_CLOSE, "clone converter %s at %p into stackBuffer %p", + ucnv_getName(cnv, status), cnv, stackBuffer); - /* Pointers on 64-bit platforms need to be aligned - * on a 64-bit boundry in memory. - */ - if (U_ALIGNMENT_OFFSET(stackBuffer) != 0) { - int32_t offsetUp = (int32_t)U_ALIGNMENT_OFFSET_UP(stackBufferChars); - *pBufferSize -= offsetUp; - stackBufferChars += offsetUp; - } - - stackBuffer = (void *)stackBufferChars; - if (cnv->sharedData->impl->safeClone != NULL) { /* call the custom safeClone function for sizing */ bufferSizeNeeded = 0; - cnv->sharedData->impl->safeClone(cnv, stackBuffer, &bufferSizeNeeded, status); + cnv->sharedData->impl->safeClone(cnv, NULL, &bufferSizeNeeded, status); } else { @@ -252,10 +188,27 @@ ucnv_safeClone(const UConverter* cnv, void *stackBuffer, int32_t *pBufferSize, U if (*pBufferSize <= 0){ /* 'preflighting' request - set needed size into *pBufferSize */ *pBufferSize = bufferSizeNeeded; + UTRACE_EXIT_VALUE(bufferSizeNeeded); return 0; } + /* Pointers on 64-bit platforms need to be aligned + * on a 64-bit boundary in memory. + */ + if (U_ALIGNMENT_OFFSET(stackBuffer) != 0) { + int32_t offsetUp = (int32_t)U_ALIGNMENT_OFFSET_UP(stackBufferChars); + if(*pBufferSize > offsetUp) { + *pBufferSize -= offsetUp; + stackBufferChars += offsetUp; + } else { + /* prevent using the stack buffer but keep the size > 0 so that we do not just preflight */ + *pBufferSize = 1; + } + } + + stackBuffer = (void *)stackBufferChars; + /* Now, see if we must allocate any memory */ if (*pBufferSize < bufferSizeNeeded || stackBuffer == NULL) { @@ -264,6 +217,7 @@ ucnv_safeClone(const UConverter* cnv, void *stackBuffer, int32_t *pBufferSize, U if(localConverter == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; + UTRACE_EXIT_STATUS(*status); return NULL; } @@ -279,6 +233,8 @@ ucnv_safeClone(const UConverter* cnv, void *stackBuffer, int32_t *pBufferSize, U allocatedConverter = NULL; } + uprv_memset(localConverter, 0, bufferSizeNeeded); + /* Copy initial state */ uprv_memcpy(localConverter, cnv, sizeof(UConverter)); localConverter->isCopyLocal = localConverter->isExtraLocal = FALSE; @@ -291,6 +247,7 @@ ucnv_safeClone(const UConverter* cnv, void *stackBuffer, int32_t *pBufferSize, U if(localConverter==NULL || U_FAILURE(*status)) { uprv_free(allocatedConverter); + UTRACE_EXIT_STATUS(*status); return NULL; } @@ -307,21 +264,8 @@ ucnv_safeClone(const UConverter* cnv, void *stackBuffer, int32_t *pBufferSize, U if(localConverter == (UConverter*)stackBuffer) { /* we're using user provided data - set to not destroy */ localConverter->isCopyLocal = TRUE; -#ifdef UCNV_DEBUG - fprintf(stderr, "%p\t:%d\t\t==stackbuffer %p, isCopyLocal TRUE\n", - localConverter, __LINE__, stackBuffer); -#endif - - } else { -#ifdef UCNV_DEBUG - fprintf(stderr, "%p\t:%d\t\t!=stackbuffer %p, isCopyLocal left at %s\n", - localConverter, __LINE__, stackBuffer, - localConverter->isCopyLocal?"TRUE":"FALSE"); -#endif } - localConverter->isExtraLocal = localConverter->isCopyLocal; - /* allow callback functions to handle any memory allocation */ toUArgs.converter = fromUArgs.converter = localConverter; cbErr = U_ZERO_ERROR; @@ -329,11 +273,7 @@ ucnv_safeClone(const UConverter* cnv, void *stackBuffer, int32_t *pBufferSize, U cbErr = U_ZERO_ERROR; cnv->fromUCharErrorBehaviour(cnv->fromUContext, &fromUArgs, NULL, 0, 0, UCNV_CLONE, &cbErr); - UCNV_DEBUG_LOG("cloning TO", ucnv_getName(localConverter,status), localConverter); - UCNV_DEBUG_CNV(localConverter); - UCNV_DEBUG_CNV(cnv); - - + UTRACE_EXIT_PTR_STATUS(localConverter, *status); return localConverter; } @@ -368,13 +308,16 @@ ucnv_close (UConverter * converter) }; UErrorCode errorCode = U_ZERO_ERROR; + UTRACE_ENTRY_OC(UTRACE_UCNV_CLOSE); + if (converter == NULL) { + UTRACE_EXIT(); return; } - UCNV_DEBUG_LOG("close", ucnv_getName(converter, &errorCode), converter); - UCNV_DEBUG_CNV(converter); + UTRACE_DATA3(UTRACE_OPEN_CLOSE, "close converter %s at %p, isCopyLocal=%b", + ucnv_getName(converter, &errorCode), converter, converter->isCopyLocal); toUArgs.converter = fromUArgs.converter = converter; @@ -382,25 +325,10 @@ ucnv_close (UConverter * converter) errorCode = U_ZERO_ERROR; converter->fromUCharErrorBehaviour(converter->fromUContext, &fromUArgs, NULL, 0, 0, UCNV_CLOSE, &errorCode); - UCNV_DEBUG_CNV(converter); - if (converter->sharedData->impl->close != NULL) { converter->sharedData->impl->close(converter); } -#ifdef UCNV_DEBUG - { - char c[4]; - c[0]='0'+converter->sharedData->referenceCounter; - c[1]=0; - UCNV_DEBUG_LOG("close--", c, converter); - if((converter->sharedData->referenceCounter == 0)&&(converter->sharedData->sharedDataCached == FALSE)) { - UCNV_DEBUG_CNV(converter); - UCNV_DEBUG_LOG("close:delDead", "??", converter); - } - } -#endif - /* Checking whether it's an algorithic converter is okay in multithreaded applications because the value never changes. @@ -411,10 +339,10 @@ ucnv_close (UConverter * converter) } if(!converter->isCopyLocal){ - UCNV_DEBUG_LOG("close:free", "", converter); uprv_free (converter); } - return; + + UTRACE_EXIT(); } /*returns a single Name from the list, will return NULL if out of bounds @@ -516,130 +444,94 @@ ucnv_setSubstChars (UConverter * converter, return; } -U_CAPI int32_t U_EXPORT2 -ucnv_getDisplayName(const UConverter *cnv, - const char *displayLocale, - UChar *displayName, int32_t displayNameCapacity, - UErrorCode *pErrorCode) { - UResourceBundle *rb; - const UChar *name; - int32_t length; - - /* check arguments */ - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return 0; - } - - if(cnv==NULL || displayNameCapacity<0 || (displayNameCapacity>0 && displayName==NULL)) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - /* open the resource bundle and get the display name string */ - rb=ures_open(NULL, displayLocale, pErrorCode); - if(U_FAILURE(*pErrorCode)) { - return 0; - } - - /* use the internal name as the key */ - name=ures_getStringByKey(rb, cnv->sharedData->staticData->name, &length, pErrorCode); - ures_close(rb); - - if(U_SUCCESS(*pErrorCode)) { - /* copy the string */ - u_memcpy(displayName, name, uprv_min(length, displayNameCapacity)*U_SIZEOF_UCHAR); - } else { - /* convert the internal name into a Unicode string */ - *pErrorCode=U_ZERO_ERROR; - length=uprv_strlen(cnv->sharedData->staticData->name); - u_charsToUChars(cnv->sharedData->staticData->name, displayName, uprv_min(length, displayNameCapacity)); - } - return u_terminateUChars(displayName, displayNameCapacity, length, pErrorCode); -} - /*resets the internal states of a converter *goal : have the same behaviour than a freshly created converter */ -static void _reset(UConverter *converter, UConverterResetChoice choice) { - /* first, notify the callback functions that the converter is reset */ - UConverterToUnicodeArgs toUArgs = { - sizeof(UConverterToUnicodeArgs), - TRUE, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL - }; - UConverterFromUnicodeArgs fromUArgs = { - sizeof(UConverterFromUnicodeArgs), - TRUE, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL - }; - UErrorCode errorCode; - +static void _reset(UConverter *converter, UConverterResetChoice choice, + UBool callCallback) { if(converter == NULL) { return; } - toUArgs.converter = fromUArgs.converter = converter; - if(choice<=UCNV_RESET_TO_UNICODE) { - errorCode = U_ZERO_ERROR; - converter->fromCharErrorBehaviour(converter->toUContext, &toUArgs, NULL, 0, UCNV_RESET, &errorCode); - } - if(choice!=UCNV_RESET_TO_UNICODE) { - errorCode = U_ZERO_ERROR; - converter->fromUCharErrorBehaviour(converter->fromUContext, &fromUArgs, NULL, 0, 0, UCNV_RESET, &errorCode); + if(callCallback) { + /* first, notify the callback functions that the converter is reset */ + UConverterToUnicodeArgs toUArgs = { + sizeof(UConverterToUnicodeArgs), + TRUE, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + }; + UConverterFromUnicodeArgs fromUArgs = { + sizeof(UConverterFromUnicodeArgs), + TRUE, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + }; + UErrorCode errorCode; + + toUArgs.converter = fromUArgs.converter = converter; + if(choice<=UCNV_RESET_TO_UNICODE) { + errorCode = U_ZERO_ERROR; + converter->fromCharErrorBehaviour(converter->toUContext, &toUArgs, NULL, 0, UCNV_RESET, &errorCode); + } + if(choice!=UCNV_RESET_TO_UNICODE) { + errorCode = U_ZERO_ERROR; + converter->fromUCharErrorBehaviour(converter->fromUContext, &fromUArgs, NULL, 0, 0, UCNV_RESET, &errorCode); + } } /* now reset the converter itself */ if(choice<=UCNV_RESET_TO_UNICODE) { converter->toUnicodeStatus = converter->sharedData->toUnicodeStatus; + converter->mode = 0; converter->toULength = 0; converter->invalidCharLength = converter->UCharErrorBufferLength = 0; + converter->preToULength = 0; } if(choice!=UCNV_RESET_TO_UNICODE) { converter->fromUnicodeStatus = 0; - converter->fromUSurrogateLead = 0; + converter->fromUChar32 = 0; converter->invalidUCharLength = converter->charErrorBufferLength = 0; + converter->preFromUFirstCP = U_SENTINEL; + converter->preFromULength = 0; } if (converter->sharedData->impl->reset != NULL) { /* call the custom reset function */ converter->sharedData->impl->reset(converter, choice); - } else if(choice<=UCNV_RESET_TO_UNICODE) { - converter->mode = UCNV_SI; } } U_CAPI void U_EXPORT2 ucnv_reset(UConverter *converter) { - _reset(converter, UCNV_RESET_BOTH); + _reset(converter, UCNV_RESET_BOTH, TRUE); } U_CAPI void U_EXPORT2 ucnv_resetToUnicode(UConverter *converter) { - _reset(converter, UCNV_RESET_TO_UNICODE); + _reset(converter, UCNV_RESET_TO_UNICODE, TRUE); } U_CAPI void U_EXPORT2 ucnv_resetFromUnicode(UConverter *converter) { - _reset(converter, UCNV_RESET_FROM_UNICODE); + _reset(converter, UCNV_RESET_FROM_UNICODE, TRUE); } U_CAPI int8_t U_EXPORT2 ucnv_getMaxCharSize (const UConverter * converter) { - return converter->sharedData->staticData->maxBytesPerChar; + return converter->maxBytesPerUChar; } @@ -663,14 +555,27 @@ ucnv_getName (const UConverter * converter, UErrorCode * err) return converter->sharedData->staticData->name; } -U_CAPI int32_t U_EXPORT2 -ucnv_getCCSID (const UConverter * converter, - UErrorCode * err) +U_CAPI int32_t U_EXPORT2 +ucnv_getCCSID(const UConverter * converter, + UErrorCode * err) { + int32_t ccsid; if (U_FAILURE (*err)) return -1; - return converter->sharedData->staticData->codepage; + ccsid = converter->sharedData->staticData->codepage; + if (ccsid == 0) { + /* Rare case. This is for cases like gb18030, + which doesn't have an IBM cannonical name, but does have an IBM alias. */ + const char *standardName = ucnv_getStandardName(ucnv_getName(converter, err), "IBM", err); + if (U_SUCCESS(*err) && standardName) { + const char *ccsidStr = uprv_strchr(standardName, '-'); + if (ccsidStr) { + ccsid = (int32_t)atol(ccsidStr+1); /* +1 to skip '-' */ + } + } + } + return ccsid; } @@ -684,33 +589,6 @@ ucnv_getPlatform (const UConverter * converter, return (UConverterPlatform)converter->sharedData->staticData->platform; } -U_CAPI void U_EXPORT2 -ucnv_getUnicodeSet(const UConverter *cnv, - USet *set, - UConverterUnicodeSet which, - UErrorCode *pErrorCode) { - /* argument checking */ - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return; - } - if(cnv==NULL || set==NULL || whichsharedData->impl->getUnicodeSet==NULL) { - *pErrorCode=U_UNSUPPORTED_ERROR; - return; - } - - /* empty the set */ - uset_clear(set); - - /* call the converter to add the code points it supports */ - cnv->sharedData->impl->getUnicodeSet(cnv, set, which, pErrorCode); -} - U_CAPI void U_EXPORT2 ucnv_getToUCallBack (const UConverter * converter, UConverterToUCallback *action, @@ -761,203 +639,868 @@ ucnv_setFromUCallBack (UConverter * converter, converter->fromUContext = newContext; } -U_CAPI void U_EXPORT2 -ucnv_fromUnicode (UConverter * _this, - char **target, - const char *targetLimit, - const UChar ** source, - const UChar * sourceLimit, - int32_t* offsets, - UBool flush, - UErrorCode * err) -{ - UConverterFromUnicodeArgs args; - const char *t; +static void +_updateOffsets(int32_t *offsets, int32_t length, + int32_t sourceIndex, int32_t errorInputLength) { + int32_t *limit; + int32_t delta, offset; + + if(sourceIndex>=0) { + /* + * adjust each offset by adding the previous sourceIndex + * minus the length of the input sequence that caused an + * error, if any + */ + delta=sourceIndex-errorInputLength; + } else { + /* + * set each offset to -1 because this conversion function + * does not handle offsets + */ + delta=-1; + } + + limit=offsets+length; + if(delta==0) { + /* most common case, nothing to do */ + } else if(delta>0) { + /* add the delta to each offset (but not if the offset is <0) */ + while(offsets=0) { + *offsets=offset+delta; + } + ++offsets; + } + } else /* delta<0 */ { + /* + * set each offset to -1 because this conversion function + * does not handle offsets + * or the error input sequence started in a previous buffer + */ + while(offsetsconverter; + s=pArgs->source; + t=pArgs->target; + offsets=pArgs->offsets; + + /* get the converter implementation function */ + sourceIndex=0; + if(offsets==NULL) { + fromUnicode=cnv->sharedData->impl->fromUnicode; + } else { + fromUnicode=cnv->sharedData->impl->fromUnicodeWithOffsets; + if(fromUnicode==NULL) { + /* there is no WithOffsets implementation */ + fromUnicode=cnv->sharedData->impl->fromUnicode; + /* we will write -1 for each offset */ + sourceIndex=-1; + } + } + + if(cnv->preFromULength>=0) { + /* normal mode */ + realSource=NULL; + + /* avoid compiler warnings - not otherwise necessary, and the values do not matter */ + realSourceLimit=NULL; + realFlush=FALSE; + realSourceIndex=0; + } else { + /* + * Previous m:n conversion stored source units from a partial match + * and failed to consume all of them. + * We need to "replay" them from a temporary buffer and convert them first. + */ + realSource=pArgs->source; + realSourceLimit=pArgs->sourceLimit; + realFlush=pArgs->flush; + realSourceIndex=sourceIndex; + + uprv_memcpy(replay, cnv->preFromU, -cnv->preFromULength*U_SIZEOF_UCHAR); + pArgs->source=replay; + pArgs->sourceLimit=replay-cnv->preFromULength; + pArgs->flush=FALSE; + sourceIndex=-1; + + cnv->preFromULength=0; + } /* - * Check parameters in for all conversions - */ - if (err == NULL || U_FAILURE (*err)) { + * loop for conversion and error handling + * + * loop { + * convert + * loop { + * update offsets + * handle end of input + * handle errors/call callback + * } + * } + */ + for(;;) { + /* convert */ + fromUnicode(pArgs, err); + + /* + * set a flag for whether the converter + * successfully processed the end of the input + * + * need not check cnv->preFromULength==0 because a replay (<0) will cause + * sflush && pArgs->source==pArgs->sourceLimit && + cnv->fromUChar32==0); + + /* no callback called yet for this iteration */ + calledCallback=FALSE; + + /* no sourceIndex adjustment for conversion, only for callback output */ + errorInputLength=0; + + /* + * loop for offsets and error handling + * + * iterates at most 3 times: + * 1. to clean up after the conversion function + * 2. after the callback + * 3. after the callback again if there was truncated input + */ + for(;;) { + /* update offsets if we write any */ + if(offsets!=NULL) { + int32_t length=(int32_t)(pArgs->target-t); + if(length>0) { + _updateOffsets(offsets, length, sourceIndex, errorInputLength); + + /* + * if a converter handles offsets and updates the offsets + * pointer at the end, then pArgs->offset should not change + * here; + * however, some converters do not handle offsets at all + * (sourceIndex<0) or may not update the offsets pointer + */ + pArgs->offsets=offsets+=length; + } + + if(sourceIndex>=0) { + sourceIndex+=(int32_t)(pArgs->source-s); + } + } + + if(cnv->preFromULength<0) { + /* + * switch the source to new replay units (cannot occur while replaying) + * after offset handling and before end-of-input and callback handling + */ + if(realSource==NULL) { + realSource=pArgs->source; + realSourceLimit=pArgs->sourceLimit; + realFlush=pArgs->flush; + realSourceIndex=sourceIndex; + + uprv_memcpy(replay, cnv->preFromU, -cnv->preFromULength*U_SIZEOF_UCHAR); + pArgs->source=replay; + pArgs->sourceLimit=replay-cnv->preFromULength; + pArgs->flush=FALSE; + if((sourceIndex+=cnv->preFromULength)<0) { + sourceIndex=-1; + } + + cnv->preFromULength=0; + } else { + /* see implementation note before _fromUnicodeWithCallback() */ + U_ASSERT(realSource==NULL); + *err=U_INTERNAL_PROGRAM_ERROR; + } + } + + /* update pointers */ + s=pArgs->source; + t=pArgs->target; + + if(U_SUCCESS(*err)) { + if(ssourceLimit) { + /* + * continue with the conversion loop while there is still input left + * (continue converting by breaking out of only the inner loop) + */ + break; + } else if(realSource!=NULL) { + /* switch back from replaying to the real source and continue */ + pArgs->source=realSource; + pArgs->sourceLimit=realSourceLimit; + pArgs->flush=realFlush; + sourceIndex=realSourceIndex; + + realSource=NULL; + break; + } else if(pArgs->flush && cnv->fromUChar32!=0) { + /* + * the entire input stream is consumed + * and there is a partial, truncated input sequence left + */ + + /* inject an error and continue with callback handling */ + *err=U_TRUNCATED_CHAR_FOUND; + calledCallback=FALSE; /* new error condition */ + } else { + /* input consumed */ + if(pArgs->flush) { + /* + * return to the conversion loop once more if the flush + * flag is set and the conversion function has not + * successfully processed the end of the input yet + * + * (continue converting by breaking out of only the inner loop) + */ + if(!converterSawEndOfInput) { + break; + } + + /* reset the converter without calling the callback function */ + _reset(cnv, UCNV_RESET_FROM_UNICODE, FALSE); + } + + /* done successfully */ + return; + } + } + + /* U_FAILURE(*err) */ + { + UErrorCode e; + + if( calledCallback || + (e=*err)==U_BUFFER_OVERFLOW_ERROR || + (e!=U_INVALID_CHAR_FOUND && + e!=U_ILLEGAL_CHAR_FOUND && + e!=U_TRUNCATED_CHAR_FOUND) + ) { + /* + * the callback did not or cannot resolve the error: + * set output pointers and return + * + * the check for buffer overflow is redundant but it is + * a high-runner case and hopefully documents the intent + * well + * + * if we were replaying, then the replay buffer must be + * copied back into the UConverter + * and the real arguments must be restored + */ + if(realSource!=NULL) { + int32_t length; + + U_ASSERT(cnv->preFromULength==0); + + length=(int32_t)(pArgs->sourceLimit-pArgs->source); + if(length>0) { + uprv_memcpy(cnv->preFromU, pArgs->source, length*U_SIZEOF_UCHAR); + cnv->preFromULength=(int8_t)-length; + } + + pArgs->source=realSource; + pArgs->sourceLimit=realSourceLimit; + pArgs->flush=realFlush; + } + + return; + } + } + + /* callback handling */ + { + UChar32 codePoint; + + /* get and write the code point */ + codePoint=cnv->fromUChar32; + errorInputLength=0; + U16_APPEND_UNSAFE(cnv->invalidUCharBuffer, errorInputLength, codePoint); + cnv->invalidUCharLength=(int8_t)errorInputLength; + + /* set the converter state to deal with the next character */ + cnv->fromUChar32=0; + + /* call the callback function */ + cnv->fromUCharErrorBehaviour(cnv->fromUContext, pArgs, + cnv->invalidUCharBuffer, errorInputLength, codePoint, + *err==U_INVALID_CHAR_FOUND ? UCNV_UNASSIGNED : UCNV_ILLEGAL, + err); + } + + /* + * loop back to the offset handling + * + * this flag will indicate after offset handling + * that a callback was called; + * if the callback did not resolve the error, then we return + */ + calledCallback=TRUE; + } + } +} + +U_CAPI void U_EXPORT2 +ucnv_fromUnicode(UConverter *cnv, + char **target, const char *targetLimit, + const UChar **source, const UChar *sourceLimit, + int32_t *offsets, + UBool flush, + UErrorCode *err) { + UConverterFromUnicodeArgs args; + const UChar *s; + char *t; + + /* check parameters */ + if(err==NULL || U_FAILURE(*err)) { return; } - if (_this == NULL || target == NULL || source == NULL) { - *err = U_ILLEGAL_ARGUMENT_ERROR; + if(cnv==NULL || target==NULL || source==NULL) { + *err=U_ILLEGAL_ARGUMENT_ERROR; return; } - t = *target; - if (targetLimit < t || sourceLimit < *source) - { - *err = U_ILLEGAL_ARGUMENT_ERROR; + s=*source; + t=*target; + if(sourceLimit (size_t)0x7fffffff && targetLimit > t) - { - targetLimit = t + 0x7fffffff; + * Make sure that the buffer sizes do not exceed the number range for + * int32_t because some functions use the size (in units or bytes) + * rather than comparing pointers, and because offsets are int32_t values. + * + * size_t is guaranteed to be unsigned and large enough for the job. + * + * Return with an error instead of adjusting the limits because we would + * not be able to maintain the semantics that either the source must be + * consumed or the target filled (unless an error occurs). + * An adjustment would be targetLimit=t+0x7fffffff; for example. + */ + if( + ((size_t)(sourceLimit-s)>(size_t)0x3fffffff && sourceLimit>s) || + ((size_t)(targetLimit-t)>(size_t)0x7fffffff && targetLimit>t) + ) { + *err=U_ILLEGAL_ARGUMENT_ERROR; + return; } - /* - * Deal with stored carry over data. This is done in the common location - * to avoid doing it for each conversion. - */ - if (_this->charErrorBufferLength > 0) - { - int32_t myTargetIndex = 0; - - ucnv_flushInternalCharBuffer (_this, - (char *)t, - &myTargetIndex, - targetLimit - *target, - offsets?&offsets:NULL, - err); - *target += myTargetIndex; - if (U_FAILURE (*err)) - return; + /* flush the target overflow buffer */ + if(cnv->charErrorBufferLength>0) { + char *overflow; + int32_t i, length; + + overflow=(char *)cnv->charErrorBuffer; + length=cnv->charErrorBufferLength; + i=0; + do { + if(t==targetLimit) { + /* the overflow buffer contains too much, keep the rest */ + int32_t j=0; + + do { + overflow[j++]=overflow[i++]; + } while(icharErrorBufferLength=(int8_t)j; + *target=t; + *err=U_BUFFER_OVERFLOW_ERROR; + return; + } + + /* copy the overflow contents to the target */ + *t++=overflow[i++]; + if(offsets!=NULL) { + *offsets++=-1; /* no source index available for old output */ + } + } while(icharErrorBufferLength=0; } - if(!flush && *source == sourceLimit) { + if(!flush && s==sourceLimit && cnv->preFromULength>=0) { /* the overflow buffer is emptied and there is no new input: we are done */ + *target=t; return; } - args.converter = _this; - args.flush = flush; - args.offsets = offsets; - args.source = *source; - args.sourceLimit = sourceLimit; - args.target = *target; - args.targetLimit = targetLimit; - args.size = sizeof(args); - if (offsets) - { - if (_this->sharedData->impl->fromUnicodeWithOffsets != NULL) - { - _this->sharedData->impl->fromUnicodeWithOffsets(&args, err); - *source = args.source; - *target = args.target; - return; + /* + * Do not simply return with a buffer overflow error if + * !flush && t==targetLimit + * because it is possible that the source will not generate any output. + * For example, the skip callback may be called; + * it does not output anything. + */ + + /* prepare the converter arguments */ + args.converter=cnv; + args.flush=flush; + args.offsets=offsets; + args.source=s; + args.sourceLimit=sourceLimit; + args.target=t; + args.targetLimit=targetLimit; + args.size=sizeof(args); + + _fromUnicodeWithCallback(&args, err); + + *source=args.source; + *target=args.target; +} + +/* ucnv_toUnicode() --------------------------------------------------------- */ + +static void +_toUnicodeWithCallback(UConverterToUnicodeArgs *pArgs, UErrorCode *err) { + UConverterToUnicode toUnicode; + UConverter *cnv; + const char *s; + UChar *t; + int32_t *offsets; + int32_t sourceIndex; + int32_t errorInputLength; + UBool converterSawEndOfInput, calledCallback; + + /* variables for m:n conversion */ + char replay[UCNV_EXT_MAX_BYTES]; + const char *realSource, *realSourceLimit; + int32_t realSourceIndex; + UBool realFlush; + + cnv=pArgs->converter; + s=pArgs->source; + t=pArgs->target; + offsets=pArgs->offsets; + + /* get the converter implementation function */ + sourceIndex=0; + if(offsets==NULL) { + toUnicode=cnv->sharedData->impl->toUnicode; + } else { + toUnicode=cnv->sharedData->impl->toUnicodeWithOffsets; + if(toUnicode==NULL) { + /* there is no WithOffsets implementation */ + toUnicode=cnv->sharedData->impl->toUnicode; + /* we will write -1 for each offset */ + sourceIndex=-1; + } + } + + if(cnv->preToULength>=0) { + /* normal mode */ + realSource=NULL; + + /* avoid compiler warnings - not otherwise necessary, and the values do not matter */ + realSourceLimit=NULL; + realFlush=FALSE; + realSourceIndex=0; + } else { + /* + * Previous m:n conversion stored source units from a partial match + * and failed to consume all of them. + * We need to "replay" them from a temporary buffer and convert them first. + */ + realSource=pArgs->source; + realSourceLimit=pArgs->sourceLimit; + realFlush=pArgs->flush; + realSourceIndex=sourceIndex; + + uprv_memcpy(replay, cnv->preToU, -cnv->preToULength); + pArgs->source=replay; + pArgs->sourceLimit=replay-cnv->preToULength; + pArgs->flush=FALSE; + sourceIndex=-1; + + cnv->preToULength=0; + } + + /* + * loop for conversion and error handling + * + * loop { + * convert + * loop { + * update offsets + * handle end of input + * handle errors/call callback + * } + * } + */ + for(;;) { + if(U_SUCCESS(*err)) { + /* convert */ + toUnicode(pArgs, err); + + /* + * set a flag for whether the converter + * successfully processed the end of the input + * + * need not check cnv->preToULength==0 because a replay (<0) will cause + * sflush && pArgs->source==pArgs->sourceLimit && + cnv->toULength==0); + } else { + /* handle error from getNextUChar() */ + converterSawEndOfInput=FALSE; } - else { - /* there is no implementation that sets offsets, set them all to -1 */ - int32_t i, targetSize = targetLimit - *target; - - for (i=0; itarget-t); + if(length>0) { + _updateOffsets(offsets, length, sourceIndex, errorInputLength); + + /* + * if a converter handles offsets and updates the offsets + * pointer at the end, then pArgs->offset should not change + * here; + * however, some converters do not handle offsets at all + * (sourceIndex<0) or may not update the offsets pointer + */ + pArgs->offsets=offsets+=length; + } + + if(sourceIndex>=0) { + sourceIndex+=(int32_t)(pArgs->source-s); + } + } + + if(cnv->preToULength<0) { + /* + * switch the source to new replay units (cannot occur while replaying) + * after offset handling and before end-of-input and callback handling + */ + if(realSource==NULL) { + realSource=pArgs->source; + realSourceLimit=pArgs->sourceLimit; + realFlush=pArgs->flush; + realSourceIndex=sourceIndex; + + uprv_memcpy(replay, cnv->preToU, -cnv->preToULength); + pArgs->source=replay; + pArgs->sourceLimit=replay-cnv->preToULength; + pArgs->flush=FALSE; + if((sourceIndex+=cnv->preToULength)<0) { + sourceIndex=-1; + } + + cnv->preToULength=0; + } else { + /* see implementation note before _fromUnicodeWithCallback() */ + U_ASSERT(realSource==NULL); + *err=U_INTERNAL_PROGRAM_ERROR; + } + } + + /* update pointers */ + s=pArgs->source; + t=pArgs->target; + + if(U_SUCCESS(*err)) { + if(ssourceLimit) { + /* + * continue with the conversion loop while there is still input left + * (continue converting by breaking out of only the inner loop) + */ + break; + } else if(realSource!=NULL) { + /* switch back from replaying to the real source and continue */ + pArgs->source=realSource; + pArgs->sourceLimit=realSourceLimit; + pArgs->flush=realFlush; + sourceIndex=realSourceIndex; + + realSource=NULL; + break; + } else if(pArgs->flush && cnv->toULength>0) { + /* + * the entire input stream is consumed + * and there is a partial, truncated input sequence left + */ + + /* inject an error and continue with callback handling */ + *err=U_TRUNCATED_CHAR_FOUND; + calledCallback=FALSE; /* new error condition */ + } else { + /* input consumed */ + if(pArgs->flush) { + /* + * return to the conversion loop once more if the flush + * flag is set and the conversion function has not + * successfully processed the end of the input yet + * + * (continue converting by breaking out of only the inner loop) + */ + if(!converterSawEndOfInput) { + break; + } + + /* reset the converter without calling the callback function */ + _reset(cnv, UCNV_RESET_TO_UNICODE, FALSE); + } + + /* done successfully */ + return; + } } + + /* U_FAILURE(*err) */ + { + UErrorCode e; + + if( calledCallback || + (e=*err)==U_BUFFER_OVERFLOW_ERROR || + (e!=U_INVALID_CHAR_FOUND && + e!=U_ILLEGAL_CHAR_FOUND && + e!=U_TRUNCATED_CHAR_FOUND && + e!=U_ILLEGAL_ESCAPE_SEQUENCE && + e!=U_UNSUPPORTED_ESCAPE_SEQUENCE) + ) { + /* + * the callback did not or cannot resolve the error: + * set output pointers and return + * + * the check for buffer overflow is redundant but it is + * a high-runner case and hopefully documents the intent + * well + * + * if we were replaying, then the replay buffer must be + * copied back into the UConverter + * and the real arguments must be restored + */ + if(realSource!=NULL) { + int32_t length; + + U_ASSERT(cnv->preToULength==0); + + length=(int32_t)(pArgs->sourceLimit-pArgs->source); + if(length>0) { + uprv_memcpy(cnv->preToU, pArgs->source, length); + cnv->preToULength=(int8_t)-length; + } + + pArgs->source=realSource; + pArgs->sourceLimit=realSourceLimit; + pArgs->flush=realFlush; + } + + return; + } + } + + /* copy toUBytes[] to invalidCharBuffer[] */ + errorInputLength=cnv->invalidCharLength=cnv->toULength; + if(errorInputLength>0) { + uprv_memcpy(cnv->invalidCharBuffer, cnv->toUBytes, errorInputLength); + } + + /* set the converter state to deal with the next character */ + cnv->toULength=0; + + /* call the callback function */ + cnv->fromCharErrorBehaviour(cnv->toUContext, pArgs, + cnv->invalidCharBuffer, errorInputLength, + (*err==U_INVALID_CHAR_FOUND || *err==U_UNSUPPORTED_ESCAPE_SEQUENCE) ? + UCNV_UNASSIGNED : UCNV_ILLEGAL, + err); + + /* + * loop back to the offset handling + * + * this flag will indicate after offset handling + * that a callback was called; + * if the callback did not resolve the error, then we return + */ + calledCallback=TRUE; } } - - /*calls the specific conversion routines */ - _this->sharedData->impl->fromUnicode(&args, err); - *source = args.source; - *target = args.target; } - - -U_CAPI void U_EXPORT2 -ucnv_toUnicode (UConverter * _this, - UChar ** target, - const UChar * targetLimit, - const char **source, - const char *sourceLimit, - int32_t* offsets, - UBool flush, - UErrorCode * err) -{ +U_CAPI void U_EXPORT2 +ucnv_toUnicode(UConverter *cnv, + UChar **target, const UChar *targetLimit, + const char **source, const char *sourceLimit, + int32_t *offsets, + UBool flush, + UErrorCode *err) { UConverterToUnicodeArgs args; - const UChar *t; + const char *s; + UChar *t; - /* - * Check parameters in for all conversions - */ - if (err == NULL || U_FAILURE (*err)) { + /* check parameters */ + if(err==NULL || U_FAILURE(*err)) { return; } - if (_this == NULL || target == NULL || source == NULL) { - *err = U_ILLEGAL_ARGUMENT_ERROR; + if(cnv==NULL || target==NULL || source==NULL) { + *err=U_ILLEGAL_ARGUMENT_ERROR; return; } - t = *target; - if (targetLimit < t || sourceLimit < *source) { - *err = U_ILLEGAL_ARGUMENT_ERROR; + s=*source; + t=*target; + if(sourceLimit (size_t)0x3fffffff && targetLimit > t) { - targetLimit = t + 0x3fffffff; + * Make sure that the buffer sizes do not exceed the number range for + * int32_t because some functions use the size (in units or bytes) + * rather than comparing pointers, and because offsets are int32_t values. + * + * size_t is guaranteed to be unsigned and large enough for the job. + * + * Return with an error instead of adjusting the limits because we would + * not be able to maintain the semantics that either the source must be + * consumed or the target filled (unless an error occurs). + * An adjustment would be sourceLimit=t+0x7fffffff; for example. + */ + if( + ((size_t)(sourceLimit-s)>(size_t)0x7fffffff && sourceLimit>s) || + ((size_t)(targetLimit-t)>(size_t)0x3fffffff && targetLimit>t) + ) { + *err=U_ILLEGAL_ARGUMENT_ERROR; + return; } + + /* flush the target overflow buffer */ + if(cnv->UCharErrorBufferLength>0) { + UChar *overflow; + int32_t i, length; + + overflow=cnv->UCharErrorBuffer; + length=cnv->UCharErrorBufferLength; + i=0; + do { + if(t==targetLimit) { + /* the overflow buffer contains too much, keep the rest */ + int32_t j=0; + + do { + overflow[j++]=overflow[i++]; + } while(iUCharErrorBufferLength=(int8_t)j; + *target=t; + *err=U_BUFFER_OVERFLOW_ERROR; + return; + } - /* - * Deal with stored carry over data. This is done in the common location - * to avoid doing it for each conversion. - */ - if (_this->UCharErrorBufferLength > 0) - { - int32_t myTargetIndex = 0; + /* copy the overflow contents to the target */ + *t++=overflow[i++]; + if(offsets!=NULL) { + *offsets++=-1; /* no source index available for old output */ + } + } while(iUCharErrorBufferLength=0; } - if(!flush && *source == sourceLimit) { + if(!flush && s==sourceLimit && cnv->preToULength>=0) { /* the overflow buffer is emptied and there is no new input: we are done */ + *target=t; return; } - args.converter = _this; - args.flush = flush; - args.offsets = offsets; - args.source = (char *) *source; - args.sourceLimit = sourceLimit; - args.target = *target; - args.targetLimit = targetLimit; - args.size = sizeof(args); - if (offsets) { - if (_this->sharedData->impl->toUnicodeWithOffsets != NULL) { - _this->sharedData->impl->toUnicodeWithOffsets(&args, err); - *source = args.source; - *target = args.target; - return; - } else { - /* there is no implementation that sets offsets, set them all to -1 */ - int32_t i, targetSize = targetLimit - *target; - - for (i=0; isharedData->impl->toUnicode(&args, err); + /* prepare the converter arguments */ + args.converter=cnv; + args.flush=flush; + args.offsets=offsets; + args.source=s; + args.sourceLimit=sourceLimit; + args.target=t; + args.targetLimit=targetLimit; + args.size=sizeof(args); - *source = args.source; - *target = args.target; - return; + _toUnicodeWithCallback(&args, err); + + *source=args.source; + *target=args.target; } +/* ucnv_to/fromUChars() ----------------------------------------------------- */ + U_CAPI int32_t U_EXPORT2 ucnv_fromUChars(UConverter *cnv, char *dest, int32_t destCapacity, @@ -1080,65 +1623,213 @@ ucnv_toUChars(UConverter *cnv, return u_terminateUChars(originalDest, destCapacity, destLength, pErrorCode); } -U_CAPI UChar32 U_EXPORT2 -ucnv_getNextUChar(UConverter * converter, - const char **source, - const char *sourceLimit, - UErrorCode * err) -{ +/* ucnv_getNextUChar() ------------------------------------------------------ */ + +U_CAPI UChar32 U_EXPORT2 +ucnv_getNextUChar(UConverter *cnv, + const char **source, const char *sourceLimit, + UErrorCode *err) { UConverterToUnicodeArgs args; - UChar32 ch; + UChar buffer[U16_MAX_LENGTH]; + const char *s; + UChar32 c; + int32_t i, length; - if(err == NULL || U_FAILURE(*err)) { + /* check parameters */ + if(err==NULL || U_FAILURE(*err)) { return 0xffff; } - if(converter == NULL || source == NULL || sourceLimit < *source) { - *err = U_ILLEGAL_ARGUMENT_ERROR; + if(cnv==NULL || source==NULL) { + *err=U_ILLEGAL_ARGUMENT_ERROR; return 0xffff; } - /* In case internal data had been stored - * we return the first UChar32 in the internal buffer, - * and update the internal state accordingly - */ - if (converter->UCharErrorBufferLength > 0) - { - int32_t i = 0; - UChar32 myUChar; - UTF_NEXT_CHAR(converter->UCharErrorBuffer, i, sizeof(converter->UCharErrorBuffer), myUChar); - /*In this memmove we update the internal buffer by - *popping the first character. - *Note that in the call itself we decrement - *UCharErrorBufferLength - */ - uprv_memmove (converter->UCharErrorBuffer, - converter->UCharErrorBuffer + i, - (converter->UCharErrorBufferLength - i) * sizeof (UChar)); - converter->UCharErrorBufferLength -= (int8_t)i; - return myUChar; - } - /*calls the specific conversion routines */ - /*as dictated in a code review, avoids a switch statement */ - args.converter = converter; - args.flush = TRUE; - args.offsets = NULL; - args.source = *source; - args.sourceLimit = sourceLimit; - args.target = NULL; - args.targetLimit = NULL; - args.size = sizeof(args); - if (converter->sharedData->impl->getNextUChar != NULL) - { - ch = converter->sharedData->impl->getNextUChar(&args, err); + s=*source; + if(sourceLimit(size_t)0x7fffffff && sourceLimit>s)) { + *err=U_ILLEGAL_ARGUMENT_ERROR; + return 0xffff; + } + + c=U_SENTINEL; + + /* flush the target overflow buffer */ + if(cnv->UCharErrorBufferLength>0) { + UChar *overflow; + + overflow=cnv->UCharErrorBuffer; + i=0; + length=cnv->UCharErrorBufferLength; + U16_NEXT(overflow, i, length, c); + + /* move the remaining overflow contents up to the beginning */ + if((cnv->UCharErrorBufferLength=(int8_t)(length-i))>0) { + uprv_memmove(cnv->UCharErrorBuffer, cnv->UCharErrorBuffer+i, + cnv->UCharErrorBufferLength*U_SIZEOF_UCHAR); + } + + if(!U16_IS_LEAD(c) || itoULength==0 && cnv->sharedData->impl->getNextUChar!=NULL) { + c=cnv->sharedData->impl->getNextUChar(&args, err); + *source=s=args.source; + if(*err==U_INDEX_OUTOFBOUNDS_ERROR) { + /* reset the converter without calling the callback function */ + _reset(cnv, UCNV_RESET_TO_UNICODE, FALSE); + return 0xffff; /* no output */ + } else if(U_SUCCESS(*err) && c>=0) { + return c; + /* + * else fall through to use _toUnicode() because + * UCNV_GET_NEXT_UCHAR_USE_TO_U: the native function did not want to handle it after all + * U_FAILURE: call _toUnicode() for callback handling (do not output c) + */ + } + } + + /* convert to one UChar in buffer[0], or handle getNextUChar() errors */ + _toUnicodeWithCallback(&args, err); + + if(*err==U_BUFFER_OVERFLOW_ERROR) { + *err=U_ZERO_ERROR; + } + + i=0; + length=(int32_t)(args.target-buffer); + } else { + /* write the lead surrogate from the overflow buffer */ + buffer[0]=(UChar)c; + args.target=buffer+1; + i=0; + length=1; + } + + /* buffer contents starts at i and ends before length */ + + if(U_FAILURE(*err)) { + c=0xffff; /* no output */ + } else if(length==0) { + /* no input or only state changes */ + *err=U_INDEX_OUTOFBOUNDS_ERROR; + /* no need to reset explicitly because _toUnicodeWithCallback() did it */ + c=0xffff; /* no output */ } else { - /* default implementation */ - ch = ucnv_getNextUCharFromToUImpl(&args, converter->sharedData->impl->toUnicode, FALSE, err); + c=buffer[0]; + i=1; + if(!U16_IS_LEAD(c)) { + /* consume c=buffer[0], done */ + } else { + /* got a lead surrogate, see if a trail surrogate follows */ + UChar c2; + + if(cnv->UCharErrorBufferLength>0) { + /* got overflow output from the conversion */ + if(U16_IS_TRAIL(c2=cnv->UCharErrorBuffer[0])) { + /* got a trail surrogate, too */ + c=U16_GET_SUPPLEMENTARY(c, c2); + + /* move the remaining overflow contents up to the beginning */ + if((--cnv->UCharErrorBufferLength)>0) { + uprv_memmove(cnv->UCharErrorBuffer, cnv->UCharErrorBuffer+1, + cnv->UCharErrorBufferLength*U_SIZEOF_UCHAR); + } + } else { + /* c is an unpaired lead surrogate, just return it */ + } + } else if(args.sourceUCharErrorBufferLength)>0) { + uprv_memmove(cnv->UCharErrorBuffer+delta, cnv->UCharErrorBuffer, + length*U_SIZEOF_UCHAR); + } + cnv->UCharErrorBufferLength=(int8_t)(length+delta); + + cnv->UCharErrorBuffer[0]=buffer[i++]; + if(delta>1) { + cnv->UCharErrorBuffer[1]=buffer[i]; + } } - *source = args.source; - return ch; + + *source=args.source; + return c; } +/* ucnv_convert() and siblings ---------------------------------------------- */ + U_CAPI void U_EXPORT2 ucnv_convertEx(UConverter *targetCnv, UConverter *sourceCnv, char **target, const char *targetLimit, @@ -1463,7 +2154,7 @@ ucnv_getType(const UConverter* converter) int8_t type = converter->sharedData->staticData->conversionType; #if !UCONFIG_NO_LEGACY_CONVERSION if(type == UCNV_MBCS) { - return _MBCSGetType(converter); + return ucnv_MBCSGetType(converter); } #endif return (UConverterType)type; @@ -1682,13 +2373,19 @@ ucnv_detectUnicodeSignature( const char* source, *signatureLength=4; return "UTF-7"; } + }else if(start[0]=='\xDD' && start[1]== '\x73'&& start[2]=='\x66' && start[3]=='\x73'){ + *signatureLength=4; + return "UTF-EBCDIC"; } + /* no known Unicode signature byte sequence recognized */ *signatureLength=0; return NULL; } +#endif + /* * Hey, Emacs, please set the following: * diff --git a/icuSources/common/ucnv2022.c b/icuSources/common/ucnv2022.c index 5c083e40..cc8159a2 100644 --- a/icuSources/common/ucnv2022.c +++ b/icuSources/common/ucnv2022.c @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2000-2003, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucnv2022.c @@ -28,22 +28,55 @@ #include "unicode/utypes.h" -#if !UCONFIG_NO_LEGACY_CONVERSION +#if !UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION #include "unicode/ucnv.h" #include "unicode/uset.h" #include "unicode/ucnv_err.h" #include "unicode/ucnv_cb.h" +#include "ucnv_imp.h" #include "ucnv_bld.h" #include "ucnv_cnv.h" #include "ucnvmbcs.h" #include "cstring.h" #include "cmemory.h" -static const char UCNV_SS2[] = "\x1B\x4E"; -static const char UCNV_SS3[] = "\x1B\x4F"; -#define UCNV_SS2_LEN 2 -#define UCNV_SS3_LEN 2 +#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) + +#ifdef U_ENABLE_GENERIC_ISO_2022 +/* + * I am disabling the generic ISO-2022 converter after proposing to do so on + * the icu mailing list two days ago. + * + * Reasons: + * 1. It does not fully support the ISO-2022/ECMA-35 specification with all of + * its designation sequences, single shifts with return to the previous state, + * switch-with-no-return to UTF-16BE or similar, etc. + * This is unlike the language-specific variants like ISO-2022-JP which + * require a much smaller repertoire of ISO-2022 features. + * These variants continue to be supported. + * 2. I believe that no one is really using the generic ISO-2022 converter + * but rather always one of the language-specific variants. + * Note that ICU's generic ISO-2022 converter has always output one escape + * sequence followed by UTF-8 for the whole stream. + * 3. Switching between subcharsets is extremely slow, because each time + * the previous converter is closed and a new one opened, + * without any kind of caching, least-recently-used list, etc. + * 4. The code is currently buggy, and given the above it does not seem + * reasonable to spend the time on maintenance. + * 5. ISO-2022 subcharsets should normally be used with 7-bit byte encodings. + * This means, for example, that when ISO-8859-7 is designated, the following + * ISO-2022 bytes 00..7f should be interpreted as ISO-8859-7 bytes 80..ff. + * The ICU ISO-2022 converter does not handle this - and has no information + * about which subconverter would have to be shifted vs. which is designed + * for 7-bit ISO-2022. + * + * Markus Scherer 2003-dec-03 + */ +#endif + +static const char SHIFT_IN_STR[] = "\x0F"; +static const char SHIFT_OUT_STR[] = "\x0E"; #define CR 0x0D #define LF 0x0A @@ -51,9 +84,16 @@ static const char UCNV_SS3[] = "\x1B\x4F"; #define V_TAB 0x0B #define SPACE 0x20 -/* for ISO-2022JP implementation*/ +/* for ISO-2022-JP and -CN implementations */ typedef enum { + /* shared values */ + INVALID_STATE=-1, ASCII = 0, + + SS2_STATE=0x10, + SS3_STATE, + + /* JP */ ISO8859_1 = 1 , ISO8859_7 = 2 , JISX201 = 3, @@ -62,113 +102,91 @@ typedef enum { GB2312 =6, KSC5601 =7, HWKANA_7BIT=8, /* Halfwidth Katakana 7 bit */ - INVALID_STATE=-1 + /* CN */ + /* the first few enum constants must keep their values because they correspond to myConverterArray[] */ + GB2312_1=1, + ISO_IR_165=2, + CNS_11643=3, + + /* + * these are used in StateEnum and ISO2022State variables, + * but CNS_11643 must be used to index into myConverterArray[] + */ + CNS_11643_0=0x20, + CNS_11643_1, + CNS_11643_2, + CNS_11643_3, + CNS_11643_4, + CNS_11643_5, + CNS_11643_6, + CNS_11643_7 } StateEnum; +/* is the StateEnum charset value for a DBCS charset? */ +#define IS_JP_DBCS(cs) (JISX208<=(cs) && (cs)<=KSC5601) + +#define CSM(cs) ((uint16_t)1<<(cs)) +/* + * Each of these charset masks (with index x) contains a bit for a charset in exact correspondence + * to whether that charset is used in the corresponding version x of ISO_2022,locale=ja,version=x + * + * Note: The converter uses some leniency: + * - The escape sequence ESC ( I for half-width 7-bit Katakana is recognized in + * all versions, not just JIS7 and JIS8. + * - ICU does not distinguish between different versions of JIS X 0208. + */ +static const uint16_t jpCharsetMasks[5]={ + CSM(ASCII)|CSM(JISX201)|CSM(JISX208)|CSM(HWKANA_7BIT), + CSM(ASCII)|CSM(JISX201)|CSM(JISX208)|CSM(HWKANA_7BIT)|CSM(JISX212), + CSM(ASCII)|CSM(JISX201)|CSM(JISX208)|CSM(HWKANA_7BIT)|CSM(JISX212)|CSM(GB2312)|CSM(KSC5601)|CSM(ISO8859_1)|CSM(ISO8859_7), + CSM(ASCII)|CSM(JISX201)|CSM(JISX208)|CSM(HWKANA_7BIT)|CSM(JISX212)|CSM(GB2312)|CSM(KSC5601)|CSM(ISO8859_1)|CSM(ISO8859_7), + CSM(ASCII)|CSM(JISX201)|CSM(JISX208)|CSM(HWKANA_7BIT)|CSM(JISX212)|CSM(GB2312)|CSM(KSC5601)|CSM(ISO8859_1)|CSM(ISO8859_7) +}; typedef enum { ASCII1=0, LATIN1, SBCS, DBCS, - MBCS - + MBCS, + HWKANA }Cnv2022Type; +typedef struct ISO2022State { + int8_t cs[4]; /* charset number for SI (G0)/SO (G1)/SS2 (G2)/SS3 (G3) */ + int8_t g; /* 0..3 for G0..G3 (SI/SO/SS2/SS3) */ + int8_t prevG; /* g before single shift (SS2 or SS3) */ +} ISO2022State; + #define UCNV_OPTIONS_VERSION_MASK 0xf #define UCNV_2022_MAX_CONVERTERS 10 typedef struct{ UConverter *currentConverter; - UConverter *fromUnicodeConverter; +#ifdef U_ENABLE_GENERIC_ISO_2022 UBool isFirstBuffer; - StateEnum toUnicodeCurrentState; - StateEnum fromUnicodeCurrentState; - StateEnum toUnicodeSaveState; +#endif Cnv2022Type currentType; - int plane; - UConverter* myConverterArray[UCNV_2022_MAX_CONVERTERS]; - UBool isEscapeAppended; - UBool isShiftAppended; - UBool isLocaleSpecified; + ISO2022State toU2022State, fromU2022State; + UConverterSharedData *myConverterArray[UCNV_2022_MAX_CONVERTERS]; uint32_t key; uint32_t version; char locale[3]; char name[30]; }UConverterDataISO2022; +/* Protos */ /* ISO-2022 ----------------------------------------------------------------- */ /*Forward declaration */ U_CFUNC void -T_UConverter_fromUnicode_UTF8 (UConverterFromUnicodeArgs * args, - UErrorCode * err); +ucnv_fromUnicode_UTF8(UConverterFromUnicodeArgs * args, + UErrorCode * err); U_CFUNC void -T_UConverter_fromUnicode_UTF8_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, - UErrorCode * err); -U_CFUNC void -_MBCSFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, - UErrorCode *pErrorCode); -U_CFUNC void -_MBCSToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, - UErrorCode *pErrorCode); - -/* Protos */ -/***************** ISO-2022 ********************************/ -static void -_ISO_2022_GetUnicodeSet(const UConverter *cnv, - USet *set, - UConverterUnicodeSet which, - UErrorCode *pErrorCode); - -static void -T_UConverter_toUnicode_ISO_2022(UConverterToUnicodeArgs * args, - UErrorCode * err); -static void -T_UConverter_toUnicode_ISO_2022_OFFSETS_LOGIC (UConverterToUnicodeArgs * args, - UErrorCode * err); - -static UChar32 -T_UConverter_getNextUChar_ISO_2022 (UConverterToUnicodeArgs * args, - UErrorCode * err); - -/***************** ISO-2022-JP ********************************/ - -static void -UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args, - UErrorCode* err); - -static void -UConverter_toUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterToUnicodeArgs* args, - UErrorCode* err); - -/***************** ISO-2022-KR ********************************/ - -static void -UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args, - UErrorCode* err); - -static void -UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterToUnicodeArgs* args, - UErrorCode* err); -/* Special function for getting output from IBM-25546 code page*/ -static void -UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC_IBM(UConverterToUnicodeArgs *args, - UErrorCode* err); -static void -UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC_IBM(UConverterFromUnicodeArgs* args, - UErrorCode* err); -/***************** ISO-2022-CN ********************************/ - -static void -UConverter_fromUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args, - UErrorCode* err); - -static void -UConverter_toUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterToUnicodeArgs* args, - UErrorCode* err); +ucnv_fromUnicode_UTF8_OFFSETS_LOGIC(UConverterFromUnicodeArgs * args, + UErrorCode * err); #define ESC_2022 0x1B /*ESC*/ @@ -177,10 +195,7 @@ typedef enum INVALID_2022 = -1, /*Doesn't correspond to a valid iso 2022 escape sequence*/ VALID_NON_TERMINAL_2022 = 0, /*so far corresponds to a valid iso 2022 escape sequence*/ VALID_TERMINAL_2022 = 1, /*corresponds to a valid iso 2022 escape sequence*/ - VALID_MAYBE_TERMINAL_2022 = 2, /*so far matches one iso 2022 escape sequence, but by adding more characters might match another escape sequence*/ - VALID_SS2_SEQUENCE=3, - VALID_SS3_SEQUENCE=4 - + VALID_MAYBE_TERMINAL_2022 = 2 /*so far matches one iso 2022 escape sequence, but by adding more characters might match another escape sequence*/ } UCNV_TableStates_2022; /* @@ -251,6 +266,25 @@ static const int8_t normalize_esq_chars_2022[256] = { ,0 ,0 ,0 ,0 ,0 ,0 }; +#ifdef U_ENABLE_GENERIC_ISO_2022 +/* + * When the generic ISO-2022 converter is completely removed, not just disabled + * per #ifdef, then the following state table and the associated tables that are + * dimensioned with MAX_STATES_2022 should be trimmed. + * + * Especially, VALID_MAYBE_TERMINAL_2022 will not be used any more, and all of + * the associated escape sequences starting with ESC ( B should be removed. + * This includes the ones with key values 1097 and all of the ones above 1000000. + * + * For the latter, the tables can simply be truncated. + * For the former, since the tables must be kept parallel, it is probably best + * to simply duplicate an adjacent table cell, parallel in all tables. + * + * It may make sense to restructure the tables, especially by using small search + * tables for the variants instead of indexing them parallel to the table here. + */ +#endif + #define MAX_STATES_2022 74 static const int32_t escSeqStateTable_Key_2022[MAX_STATES_2022] = { /* 0 1 2 3 4 5 6 7 8 9 */ @@ -265,12 +299,13 @@ static const int32_t escSeqStateTable_Key_2022[MAX_STATES_2022] = { ,35947631 ,35947635 ,35947636 ,35947638 }; +#ifdef U_ENABLE_GENERIC_ISO_2022 static const char* const escSeqStateTable_Result_2022[MAX_STATES_2022] = { /* 0 1 2 3 4 5 6 7 8 9 */ NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,"latin1" ,"latin1" - ,"latin1" ,"ibm-865" ,"ibm-865" ,"ibm-865" ,"ibm-865" ,"ibm-865" ,"ibm-865" ,"JISX-201" ,"JISX-201" ,"latin1" + ,"latin1" ,"ibm-865" ,"ibm-865" ,"ibm-865" ,"ibm-865" ,"ibm-865" ,"ibm-865" ,"JISX0201" ,"JISX0201" ,"latin1" ,"latin1" ,NULL ,"JISX-208" ,"ibm-5478" ,"JISX-208" ,NULL ,NULL ,NULL ,NULL ,"UTF8" ,"ISO-8859-1" ,"ISO-8859-7" ,"JIS-X-208" ,NULL ,"ibm-955" ,"ibm-367" ,"ibm-952" ,"ibm-949" ,"JISX-212" ,"ibm-1383" ,"ibm-952" ,"ibm-964" ,"ibm-964" ,"ibm-964" ,"ibm-964" ,"ibm-964" ,"ibm-964" ,"ibm-5478" ,"ibm-949" ,"ISO-IR-165" @@ -279,9 +314,11 @@ static const char* const escSeqStateTable_Result_2022[MAX_STATES_2022] = { ,"ibm-920" ,"ibm-915" ,"ibm-915" ,"latin1" }; +#endif + static const UCNV_TableStates_2022 escSeqStateTable_Value_2022[MAX_STATES_2022] = { /* 0 1 2 3 4 5 6 7 8 9 */ - VALID_NON_TERMINAL_2022 ,VALID_NON_TERMINAL_2022 ,VALID_NON_TERMINAL_2022 ,VALID_NON_TERMINAL_2022 ,VALID_NON_TERMINAL_2022 ,VALID_SS2_SEQUENCE ,VALID_SS3_SEQUENCE ,VALID_NON_TERMINAL_2022 ,VALID_TERMINAL_2022 ,VALID_TERMINAL_2022 + VALID_NON_TERMINAL_2022 ,VALID_NON_TERMINAL_2022 ,VALID_NON_TERMINAL_2022 ,VALID_NON_TERMINAL_2022 ,VALID_NON_TERMINAL_2022 ,VALID_TERMINAL_2022 ,VALID_TERMINAL_2022 ,VALID_NON_TERMINAL_2022 ,VALID_TERMINAL_2022 ,VALID_TERMINAL_2022 ,VALID_MAYBE_TERMINAL_2022 ,VALID_TERMINAL_2022 ,VALID_TERMINAL_2022 ,VALID_TERMINAL_2022 ,VALID_TERMINAL_2022 ,VALID_TERMINAL_2022 ,VALID_TERMINAL_2022 ,VALID_TERMINAL_2022 ,VALID_TERMINAL_2022 ,VALID_TERMINAL_2022 ,VALID_TERMINAL_2022 ,VALID_NON_TERMINAL_2022 ,VALID_TERMINAL_2022 ,VALID_TERMINAL_2022 ,VALID_TERMINAL_2022 ,VALID_NON_TERMINAL_2022 ,VALID_NON_TERMINAL_2022 ,VALID_NON_TERMINAL_2022 ,VALID_NON_TERMINAL_2022 ,VALID_TERMINAL_2022 ,VALID_TERMINAL_2022 ,VALID_TERMINAL_2022 ,VALID_TERMINAL_2022 ,VALID_NON_TERMINAL_2022 ,VALID_TERMINAL_2022 ,VALID_TERMINAL_2022 ,VALID_TERMINAL_2022 ,VALID_TERMINAL_2022 ,VALID_TERMINAL_2022 ,VALID_TERMINAL_2022 @@ -292,38 +329,16 @@ static const UCNV_TableStates_2022 escSeqStateTable_Value_2022[MAX_STATES_2022] }; - -/*for 2022 looks ahead in the stream - *to determine the longest possible convertible - *data stream - */ -static const char* getEndOfBuffer_2022(const char** source, - const char* sourceLimit, - UBool flush); /* Type def for refactoring changeState_2022 code*/ typedef enum{ +#ifdef U_ENABLE_GENERIC_ISO_2022 ISO_2022=0, +#endif ISO_2022_JP=1, ISO_2022_KR=2, ISO_2022_CN=3 } Variant2022; -/*runs through a state machine to determine the escape sequence - codepage correspondance - *changes the pointer pointed to be _this->extraInfo - */ -static void -changeState_2022(UConverter* _this, - const char** source, - const char* sourceLimit, - UBool flush,Variant2022 var,int* plane, - UErrorCode* err); - - -static UCNV_TableStates_2022 -getKey_2022(char source, - int32_t* key, - int32_t* offset); - /*********** ISO 2022 Converter Protos ***********/ static void _ISO2022Open(UConverter *cnv, const char *name, const char *locale,uint32_t options, UErrorCode *errorCode); @@ -343,310 +358,148 @@ _ISO_2022_WriteSub(UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorC static UConverter * _ISO_2022_SafeClone(const UConverter *cnv, void *stackBuffer, int32_t *pBufferSize, UErrorCode *status); -/************ protos of functions for setting the initial state *********************/ +#ifdef U_ENABLE_GENERIC_ISO_2022 static void -setInitialStateToUnicodeJPCN(UConverter* converter,UConverterDataISO2022 *myConverterData); +T_UConverter_toUnicode_ISO_2022_OFFSETS_LOGIC(UConverterToUnicodeArgs* args, UErrorCode* err); +#endif -static void -setInitialStateFromUnicodeJPCN(UConverter* converter,UConverterDataISO2022 *myConverterData); +/*const UConverterSharedData _ISO2022Data;*/ +static const UConverterSharedData _ISO2022JPData; +static const UConverterSharedData _ISO2022KRData; +static const UConverterSharedData _ISO2022CNData; -static void -setInitialStateToUnicodeKR(UConverter* converter,UConverterDataISO2022 *myConverterData); +/*************** Converter implementations ******************/ static void -setInitialStateFromUnicodeKR(UConverter* converter,UConverterDataISO2022 *myConverterData); +setInitialStateToUnicodeKR(UConverter* converter, UConverterDataISO2022 *myConverterData){ + if(myConverterData->version == 1) { + UConverter *cnv = myConverterData->currentConverter; -/*************** Converter implemenations ******************/ -static const UConverterImpl _ISO2022Impl={ - UCNV_ISO_2022, + cnv->toUnicodeStatus=0; /* offset */ + cnv->mode=0; /* state */ + cnv->toULength=0; /* byteIndex */ + } +} - NULL, - NULL, +static void +setInitialStateFromUnicodeKR(UConverter* converter,UConverterDataISO2022 *myConverterData){ + /* in ISO-2022-KR the designator sequence appears only once + * in a file so we append it only once + */ + if( converter->charErrorBufferLength==0){ - _ISO2022Open, - _ISO2022Close, - _ISO2022Reset, + converter->charErrorBufferLength = 4; + converter->charErrorBuffer[0] = 0x1b; + converter->charErrorBuffer[1] = 0x24; + converter->charErrorBuffer[2] = 0x29; + converter->charErrorBuffer[3] = 0x43; + } + if(myConverterData->version == 1) { + UConverter *cnv = myConverterData->currentConverter; - T_UConverter_toUnicode_ISO_2022, - T_UConverter_toUnicode_ISO_2022_OFFSETS_LOGIC, - T_UConverter_fromUnicode_UTF8, - T_UConverter_fromUnicode_UTF8_OFFSETS_LOGIC, - T_UConverter_getNextUChar_ISO_2022, + cnv->fromUChar32=0; + cnv->fromUnicodeStatus=1; /* prevLength */ + } +} - NULL, - _ISO2022getName, - _ISO_2022_WriteSub, - _ISO_2022_SafeClone, - _ISO_2022_GetUnicodeSet -}; -static const UConverterStaticData _ISO2022StaticData={ - sizeof(UConverterStaticData), - "ISO_2022", - 2022, - UCNV_IBM, - UCNV_ISO_2022, - 1, - 4, - { 0x1a, 0, 0, 0 }, - 1, - FALSE, - FALSE, - 0, - 0, - { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ -}; -const UConverterSharedData _ISO2022Data={ - sizeof(UConverterSharedData), - ~((uint32_t) 0), - NULL, - NULL, - &_ISO2022StaticData, - FALSE, - &_ISO2022Impl, - 0 -}; +static void +_ISO2022Open(UConverter *cnv, const char *name, const char *locale,uint32_t options, UErrorCode *errorCode){ -/*************JP****************/ -static const UConverterImpl _ISO2022JPImpl={ - UCNV_ISO_2022, + char myLocale[6]={' ',' ',' ',' ',' ',' '}; - NULL, - NULL, + cnv->extraInfo = uprv_malloc (sizeof (UConverterDataISO2022)); + if(cnv->extraInfo != NULL) { + UConverterDataISO2022 *myConverterData=(UConverterDataISO2022 *) cnv->extraInfo; + uint32_t version; - _ISO2022Open, - _ISO2022Close, - _ISO2022Reset, + uprv_memset(myConverterData, 0, sizeof(UConverterDataISO2022)); + myConverterData->currentConverter = NULL; + myConverterData->currentType = ASCII1; + myConverterData->key =0; +#ifdef U_ENABLE_GENERIC_ISO_2022 + myConverterData->isFirstBuffer = TRUE; +#endif + cnv->fromUnicodeStatus =FALSE; + if(locale){ + uprv_strncpy(myLocale, locale, sizeof(myLocale)); + } + myConverterData->version= 0; + version = options & UCNV_OPTIONS_VERSION_MASK; + if(myLocale[0]=='j' && (myLocale[1]=='a'|| myLocale[1]=='p') && + (myLocale[2]=='_' || myLocale[2]=='\0')){ + int len=0; + /* open the required converters and cache them */ + if(jpCharsetMasks[version]&CSM(ISO8859_7)) { + myConverterData->myConverterArray[ISO8859_7]= ucnv_loadSharedData("ISO8859_7", NULL, errorCode); + } + myConverterData->myConverterArray[JISX201] = ucnv_loadSharedData("JISX0201", NULL, errorCode); + myConverterData->myConverterArray[JISX208] = ucnv_loadSharedData("jisx-208", NULL, errorCode); + if(jpCharsetMasks[version]&CSM(JISX212)) { + myConverterData->myConverterArray[JISX212] = ucnv_loadSharedData("jisx-212", NULL, errorCode); + } + if(jpCharsetMasks[version]&CSM(GB2312)) { + myConverterData->myConverterArray[GB2312] = ucnv_loadSharedData("ibm-5478", NULL, errorCode); /* gb_2312_80-1 */ + } + if(jpCharsetMasks[version]&CSM(KSC5601)) { + myConverterData->myConverterArray[KSC5601] = ucnv_loadSharedData("ksc_5601", NULL, errorCode); + } - UConverter_toUnicode_ISO_2022_JP_OFFSETS_LOGIC, - UConverter_toUnicode_ISO_2022_JP_OFFSETS_LOGIC, - UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC, - UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC, - NULL, + /* set the function pointers to appropriate funtions */ + cnv->sharedData=(UConverterSharedData*)(&_ISO2022JPData); + uprv_strcpy(myConverterData->locale,"ja"); - NULL, - _ISO2022getName, - _ISO_2022_WriteSub, - _ISO_2022_SafeClone, - _ISO_2022_GetUnicodeSet -}; -static const UConverterStaticData _ISO2022JPStaticData={ - sizeof(UConverterStaticData), - "ISO_2022_JP", - 0, - UCNV_IBM, - UCNV_ISO_2022, - 1, - 6, - { 0x1a, 0, 0, 0 }, - 1, - FALSE, - FALSE, - 0, - 0, - { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ -}; -const UConverterSharedData _ISO2022JPData={ - sizeof(UConverterSharedData), - ~((uint32_t) 0), - NULL, - NULL, - &_ISO2022JPStaticData, - FALSE, - &_ISO2022JPImpl, - 0 -}; + myConverterData->version = version; + uprv_strcpy(myConverterData->name,"ISO_2022,locale=ja,version="); + len = uprv_strlen(myConverterData->name); + myConverterData->name[len]=(char)(myConverterData->version+(int)'0'); + myConverterData->name[len+1]='\0'; + } + else if(myLocale[0]=='k' && (myLocale[1]=='o'|| myLocale[1]=='r') && + (myLocale[2]=='_' || myLocale[2]=='\0')){ -/************* KR ***************/ -static const UConverterImpl _ISO2022KRImpl={ - UCNV_ISO_2022, + if ((options & UCNV_OPTIONS_VERSION_MASK)==1){ + myConverterData->version = 1; + myConverterData->currentConverter= + ucnv_open("icu-internal-25546",errorCode); - NULL, - NULL, + if (U_FAILURE(*errorCode)) { + _ISO2022Close(cnv); + return; + } - _ISO2022Open, - _ISO2022Close, - _ISO2022Reset, + uprv_strcpy(myConverterData->name,"ISO_2022,locale=ko,version=1"); + uprv_memcpy(cnv->subChar, myConverterData->currentConverter->subChar, 4); + cnv->subCharLen = myConverterData->currentConverter->subCharLen; + }else{ + myConverterData->currentConverter=ucnv_open("ibm-949",errorCode); - UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC, - UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC, - UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC, - UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC, - NULL, + if (U_FAILURE(*errorCode)) { + _ISO2022Close(cnv); + return; + } - NULL, - _ISO2022getName, - _ISO_2022_WriteSub, - _ISO_2022_SafeClone, - _ISO_2022_GetUnicodeSet -}; -static const UConverterStaticData _ISO2022KRStaticData={ - sizeof(UConverterStaticData), - "ISO_2022_KR", - 0, - UCNV_IBM, - UCNV_ISO_2022, - 1, - 3, - { 0x1a, 0, 0, 0 }, - 1, - FALSE, - FALSE, - 0, - 0, - { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ -}; -const UConverterSharedData _ISO2022KRData={ - sizeof(UConverterSharedData), - ~((uint32_t) 0), - NULL, - NULL, - &_ISO2022KRStaticData, - FALSE, - &_ISO2022KRImpl, - 0 -}; + myConverterData->version = 0; + uprv_strcpy(myConverterData->name,"ISO_2022,locale=ko,version=0"); + } -/*************** CN ***************/ -static const UConverterImpl _ISO2022CNImpl={ - - UCNV_ISO_2022, - - NULL, - NULL, - - _ISO2022Open, - _ISO2022Close, - _ISO2022Reset, - - UConverter_toUnicode_ISO_2022_CN_OFFSETS_LOGIC, - UConverter_toUnicode_ISO_2022_CN_OFFSETS_LOGIC, - UConverter_fromUnicode_ISO_2022_CN_OFFSETS_LOGIC, - UConverter_fromUnicode_ISO_2022_CN_OFFSETS_LOGIC, - NULL, - - NULL, - _ISO2022getName, - _ISO_2022_WriteSub, - _ISO_2022_SafeClone, - _ISO_2022_GetUnicodeSet -}; -static const UConverterStaticData _ISO2022CNStaticData={ - sizeof(UConverterStaticData), - "ISO_2022_CN", - 0, - UCNV_IBM, - UCNV_ISO_2022, - 2, - 8, - { 0x1a, 0, 0, 0 }, - 1, - FALSE, - FALSE, - 0, - 0, - { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ -}; -const UConverterSharedData _ISO2022CNData={ - sizeof(UConverterSharedData), - ~((uint32_t) 0), - NULL, - NULL, - &_ISO2022CNStaticData, - FALSE, - &_ISO2022CNImpl, - 0 -}; - - -/**********/ - -static void -_ISO2022Open(UConverter *cnv, const char *name, const char *locale,uint32_t options, UErrorCode *errorCode){ - - char myLocale[6]={' ',' ',' ',' ',' ',' '}; - - cnv->extraInfo = uprv_malloc (sizeof (UConverterDataISO2022)); - if(cnv->extraInfo != NULL) { - UConverterDataISO2022 *myConverterData=(UConverterDataISO2022 *) cnv->extraInfo; - myConverterData->currentConverter = NULL; - myConverterData->fromUnicodeConverter = NULL; - myConverterData->currentType= ASCII1; - myConverterData->plane = -1; - myConverterData->key =0; - myConverterData->isFirstBuffer = TRUE; - cnv->fromUnicodeStatus =FALSE; - if(locale){ - uprv_strncpy(myLocale, locale, sizeof(myLocale)); - myConverterData->isLocaleSpecified = TRUE; - } - myConverterData->version= 0; - myConverterData->myConverterArray[0] =NULL; - if(myLocale[0]=='j' && (myLocale[1]=='a'|| myLocale[1]=='p') && - (myLocale[2]=='_' || myLocale[2]=='\0')){ - int len=0; - /* open the required converters and cache them */ - myConverterData->myConverterArray[0]= ucnv_open("ASCII", errorCode ); - myConverterData->myConverterArray[1]= ucnv_open("ISO8859_1", errorCode); - myConverterData->myConverterArray[2]= ucnv_open("ISO8859_7", errorCode); - myConverterData->myConverterArray[3]= ucnv_open("jisx-201", errorCode); - myConverterData->myConverterArray[4]= ucnv_open("jisx-208", errorCode); - myConverterData->myConverterArray[5]= ucnv_open("jisx-212", errorCode); - myConverterData->myConverterArray[6]= ucnv_open("ibm-5478", errorCode); /* gb_2312_80-1 */ - myConverterData->myConverterArray[7]= ucnv_open("ksc_5601", errorCode); - myConverterData->myConverterArray[8]= ucnv_open("jisx-201", errorCode); - myConverterData->myConverterArray[9]= NULL; - - /* initialize the state variables */ - setInitialStateToUnicodeJPCN(cnv, myConverterData); - setInitialStateFromUnicodeJPCN(cnv,myConverterData); - - /* set the function pointers to appropriate funtions */ - cnv->sharedData=(UConverterSharedData*)(&_ISO2022JPData); - uprv_strcpy(myConverterData->locale,"ja"); - - myConverterData->version =options & UCNV_OPTIONS_VERSION_MASK; - uprv_strcpy(myConverterData->name,"ISO_2022,locale=ja,version="); - len=strlen(myConverterData->name); - myConverterData->name[len]=(char)(myConverterData->version+(int)'0'); - myConverterData->name[len+1]='\0'; - } - else if(myLocale[0]=='k' && (myLocale[1]=='o'|| myLocale[1]=='r') && - (myLocale[2]=='_' || myLocale[2]=='\0')){ - - /* initialize the state variables */ - setInitialStateToUnicodeKR(cnv, myConverterData); - setInitialStateFromUnicodeKR(cnv,myConverterData); - - if ((options & UCNV_OPTIONS_VERSION_MASK)==1){ - myConverterData->version = 1; - myConverterData->currentConverter=myConverterData->fromUnicodeConverter= - ucnv_open("icu-internal-25546",errorCode); - uprv_strcpy(myConverterData->name,"ISO_2022,locale=ko,version=1"); - }else{ - myConverterData->currentConverter=myConverterData->fromUnicodeConverter = ucnv_open("ibm-949",errorCode); - myConverterData->version = 0; - uprv_strcpy(myConverterData->name,"ISO_2022,locale=ko,version=0"); - } + /* initialize the state variables */ + setInitialStateToUnicodeKR(cnv, myConverterData); + setInitialStateFromUnicodeKR(cnv,myConverterData); /* set the function pointers to appropriate funtions */ cnv->sharedData=(UConverterSharedData*)&_ISO2022KRData; - cnv->mode=UCNV_SI; uprv_strcpy(myConverterData->locale,"ko"); } else if(((myLocale[0]=='z' && myLocale[1]=='h') || (myLocale[0]=='c'&& myLocale[1]=='n'))&& (myLocale[2]=='_' || myLocale[2]=='\0')){ /* open the required converters and cache them */ - myConverterData->myConverterArray[0] = ucnv_open("ASCII",errorCode); - myConverterData->myConverterArray[1] = ucnv_open("ibm-5478",errorCode); /* gb_2312_80-1 */ - myConverterData->myConverterArray[2] = ucnv_open("iso-ir-165",errorCode); - myConverterData->myConverterArray[3] = ucnv_open("cns-11643-1992",errorCode); - myConverterData->myConverterArray[4] = NULL; - + myConverterData->myConverterArray[GB2312_1] = ucnv_loadSharedData("ibm-5478", NULL, errorCode); + if(version==1) { + myConverterData->myConverterArray[ISO_IR_165] = ucnv_loadSharedData("iso-ir-165", NULL, errorCode); + } + myConverterData->myConverterArray[CNS_11643] = ucnv_loadSharedData("cns-11643-1992", NULL, errorCode); - /*initialize the state variables*/ - setInitialStateToUnicodeJPCN(cnv, myConverterData); - setInitialStateFromUnicodeJPCN(cnv,myConverterData); /* set the function pointers to appropriate funtions */ cnv->sharedData=(UConverterSharedData*)&_ISO2022CNData; @@ -661,6 +514,7 @@ _ISO2022Open(UConverter *cnv, const char *name, const char *locale,uint32_t opti } } else{ +#ifdef U_ENABLE_GENERIC_ISO_2022 /* append the UTF-8 escape sequence */ cnv->charErrorBufferLength = 3; cnv->charErrorBuffer[0] = 0x1b; @@ -669,36 +523,43 @@ _ISO2022Open(UConverter *cnv, const char *name, const char *locale,uint32_t opti cnv->sharedData=(UConverterSharedData*)&_ISO2022Data; /* initialize the state variables */ - myConverterData->isLocaleSpecified=FALSE; uprv_strcpy(myConverterData->name,"ISO_2022"); +#else + *errorCode = U_UNSUPPORTED_ERROR; + return; +#endif } + cnv->maxBytesPerUChar=cnv->sharedData->staticData->maxBytesPerChar; + + if(U_FAILURE(*errorCode)) { + _ISO2022Close(cnv); + } } else { *errorCode = U_MEMORY_ALLOCATION_ERROR; } - } static void _ISO2022Close(UConverter *converter) { - UConverterDataISO2022* myData =(UConverterDataISO2022 *) (converter->extraInfo); - UConverter **array = myData->myConverterArray; + UConverterDataISO2022* myData =(UConverterDataISO2022 *) (converter->extraInfo); + UConverterSharedData **array = myData->myConverterArray; + int32_t i; if (converter->extraInfo != NULL) { /*close the array of converter pointers and free the memory*/ - while(*array!=NULL){ - if(*array==myData->currentConverter){ - myData->currentConverter=NULL; + for (i=0; icurrentConverter); /* if not closed above */ + ucnv_close(myData->currentConverter); if(!converter->isExtraLocal){ uprv_free (converter->extraInfo); + converter->extraInfo = NULL; } } } @@ -706,9 +567,18 @@ _ISO2022Close(UConverter *converter) { static void _ISO2022Reset(UConverter *converter, UConverterResetChoice choice) { UConverterDataISO2022 *myConverterData=(UConverterDataISO2022 *) (converter->extraInfo); - if(! myConverterData->isLocaleSpecified){ + if(choice<=UCNV_RESET_TO_UNICODE) { + uprv_memset(&myConverterData->toU2022State, 0, sizeof(ISO2022State)); + myConverterData->key = 0; + } + if(choice!=UCNV_RESET_TO_UNICODE) { + uprv_memset(&myConverterData->fromU2022State, 0, sizeof(ISO2022State)); + } +#ifdef U_ENABLE_GENERIC_ISO_2022 + if(myConverterData->locale[0] == 0){ if(choice<=UCNV_RESET_TO_UNICODE) { myConverterData->isFirstBuffer = TRUE; + myConverterData->key = 0; if (converter->mode == UCNV_SO){ ucnv_close (myConverterData->currentConverter); myConverterData->currentConverter=NULL; @@ -723,17 +593,11 @@ _ISO2022Reset(UConverter *converter, UConverterResetChoice choice) { converter->charErrorBuffer[2] = 0x42; } } - else { + else +#endif + { /* reset the state variables */ - if(myConverterData->locale[0] == 'j' || myConverterData->locale[0] == 'c'){ - if(choice<=UCNV_RESET_TO_UNICODE) { - setInitialStateToUnicodeJPCN(converter, myConverterData); - } - if(choice!=UCNV_RESET_TO_UNICODE) { - setInitialStateFromUnicodeJPCN(converter,myConverterData); - } - } - else if(myConverterData->locale[0] == 'k'){ + if(myConverterData->locale[0] == 'k'){ if(choice<=UCNV_RESET_TO_UNICODE) { setInitialStateToUnicodeKR(converter, myConverterData); } @@ -753,165 +617,405 @@ _ISO2022getName(const UConverter* cnv){ return NULL; } -static void -setInitialStateToUnicodeJPCN(UConverter* converter,UConverterDataISO2022 *myConverterData ){ - myConverterData->toUnicodeCurrentState =ASCII; - myConverterData->currentConverter = NULL; - myConverterData->isFirstBuffer = TRUE; - myConverterData->toUnicodeSaveState = INVALID_STATE; - converter->mode = UCNV_SI; -} +/*************** to unicode *******************/ +/**************************************************************************** + * Recognized escape sequences are + * (B ASCII + * .A ISO-8859-1 + * .F ISO-8859-7 + * (J JISX-201 + * (I JISX-201 + * $B JISX-208 + * $@ JISX-208 + * $(D JISX-212 + * $A GB2312 + * $(C KSC5601 + */ +static const StateEnum nextStateToUnicodeJP[MAX_STATES_2022]= { +/* 0 1 2 3 4 5 6 7 8 9 */ + INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,SS2_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE + ,ASCII ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,JISX201 ,HWKANA_7BIT ,JISX201 ,INVALID_STATE + ,INVALID_STATE ,INVALID_STATE ,JISX208 ,GB2312 ,JISX208 ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE + ,ISO8859_1 ,ISO8859_7 ,JISX208 ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,KSC5601 ,JISX212 ,INVALID_STATE + ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE + ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE + ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE + ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE +}; -static void -setInitialStateFromUnicodeJPCN(UConverter* converter,UConverterDataISO2022 *myConverterData){ - myConverterData->fromUnicodeCurrentState= ASCII; - myConverterData->isEscapeAppended=FALSE; - myConverterData->isShiftAppended=FALSE; - myConverterData->isLocaleSpecified=TRUE; - myConverterData->currentType = ASCII1; - converter->fromUnicodeStatus = FALSE; +/*************** to unicode *******************/ +static const StateEnum nextStateToUnicodeCN[MAX_STATES_2022]= { +/* 0 1 2 3 4 5 6 7 8 9 */ + INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,SS2_STATE ,SS3_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE + ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE + ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE + ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE + ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,GB2312_1 ,INVALID_STATE ,ISO_IR_165 + ,CNS_11643_1 ,CNS_11643_2 ,CNS_11643_3 ,CNS_11643_4 ,CNS_11643_5 ,CNS_11643_6 ,CNS_11643_7 ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE + ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE + ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE +}; -} -static void -setInitialStateToUnicodeKR(UConverter* converter, UConverterDataISO2022 *myConverterData){ +static UCNV_TableStates_2022 +getKey_2022(char c,int32_t* key,int32_t* offset){ + int32_t togo; + int32_t low = 0; + int32_t hi = MAX_STATES_2022; + int32_t oldmid=0; - myConverterData->isLocaleSpecified=TRUE; - converter->mode = UCNV_SI; - myConverterData->currentConverter = myConverterData->fromUnicodeConverter; + togo = normalize_esq_chars_2022[(uint8_t)c]; + if(togo == 0) { + /* not a valid character anywhere in an escape sequence */ + *key = 0; + *offset = 0; + return INVALID_2022; + } + togo = (*key << 5) + togo; -} + while (hi != low) /*binary search*/{ -static void -setInitialStateFromUnicodeKR(UConverter* converter,UConverterDataISO2022 *myConverterData){ - /* in ISO-2022-KR the desginator sequence appears only once - * in a file so we append it only once - */ - if( converter->charErrorBufferLength==0){ + register int32_t mid = (hi+low) >> 1; /*Finds median*/ + + if (mid == oldmid) + break; + + if (escSeqStateTable_Key_2022[mid] > togo){ + hi = mid; + } + else if (escSeqStateTable_Key_2022[mid] < togo){ + low = mid; + } + else /*we found it*/{ + *key = togo; + *offset = mid; + return escSeqStateTable_Value_2022[mid]; + } + oldmid = mid; - converter->charErrorBufferLength = 4; - converter->charErrorBuffer[0] = 0x1b; - converter->charErrorBuffer[1] = 0x24; - converter->charErrorBuffer[2] = 0x29; - converter->charErrorBuffer[3] = 0x43; } - myConverterData->isLocaleSpecified=TRUE; - myConverterData->isShiftAppended=FALSE; + *key = 0; + *offset = 0; + return INVALID_2022; } +/*runs through a state machine to determine the escape sequence - codepage correspondance + */ +static void +changeState_2022(UConverter* _this, + const char** source, + const char* sourceLimit, + Variant2022 var, + UErrorCode* err){ + UCNV_TableStates_2022 value; + UConverterDataISO2022* myData2022 = ((UConverterDataISO2022*)_this->extraInfo); + uint32_t key = myData2022->key; + int32_t offset; + char c; + + value = VALID_NON_TERMINAL_2022; + while (*source < sourceLimit) { + c = *(*source)++; + _this->toUBytes[_this->toULength++]=(uint8_t)c; + value = getKey_2022(c,(int32_t *) &key, &offset); + + switch (value){ -static U_INLINE void -CONCAT_ESCAPE_EX(UConverterFromUnicodeArgs* args, - const UChar* source, - unsigned char** target, - const unsigned char* targetLimit, - int32_t** offsets, - const char* strToAppend, - int len, - UErrorCode* err); + case VALID_NON_TERMINAL_2022 : + /* continue with the loop */ + break; -static U_INLINE void -MBCS_FROM_UCHAR32_ISO2022(UConverterSharedData* sharedData, - UChar32 c, - uint32_t* value, - UBool useFallback, - int* length, - int outputType); + case VALID_TERMINAL_2022: + key = 0; + goto DONE; -static U_INLINE void -MBCS_SINGLE_FROM_UCHAR32(UConverterSharedData* sharedData, - UChar32 c, - uint32_t* retval, - UBool useFallback); + case INVALID_2022: + goto DONE; -static U_INLINE void -CONCAT_ESCAPE_EX(UConverterFromUnicodeArgs* args, - const UChar* source, - unsigned char** target, - const unsigned char* targetLimit, - int32_t** offsets, - const char* strToAppend, - int len, - UErrorCode* err) -{ + case VALID_MAYBE_TERMINAL_2022: +#ifdef U_ENABLE_GENERIC_ISO_2022 + /* ESC ( B is ambiguous only for ISO_2022 itself */ + if(var == ISO_2022) { + /* discard toUBytes[] for ESC ( B because this sequence is correct and complete */ + _this->toULength = 0; - unsigned char* myTarget = *target; - int32_t* myOffsets = *offsets; - while(len-->0){ - if(myTarget < targetLimit){ - *(myTarget++) = (unsigned char) *(strToAppend++); - if(myOffsets){ - *(myOffsets++) = source - args->source -1; + /* TODO need to indicate that ESC ( B was seen; if failure, then need to replay from source or from MBCS-style replay */ + + /* continue with the loop */ + value = VALID_NON_TERMINAL_2022; + break; + } else +#endif + { + /* not ISO_2022 itself, finish here */ + value = VALID_TERMINAL_2022; + key = 0; + goto DONE; } } - else{ - args->converter->charErrorBuffer[(int)args->converter->charErrorBufferLength++] = (unsigned char) *(strToAppend++); - *err =U_BUFFER_OVERFLOW_ERROR; - } } - *target = myTarget; - *offsets = myOffsets; -} -/* This inline function replicates code in _MBCSFromUChar32() function in ucnvmbcs.c - * any future change in _MBCSFromUChar32() function should be reflected in - * this macro - */ -static U_INLINE void -MBCS_FROM_UCHAR32_ISO2022(UConverterSharedData* sharedData, - UChar32 c, - uint32_t* value, - UBool useFallback, - int* length, - int outputType) -{ +DONE: + myData2022->key = key; - const uint16_t *table=sharedData->table->mbcs.fromUnicodeTable; - uint32_t stage2Entry; - uint32_t myValue=0; - const uint8_t *p; - /* BMP-only codepages are stored without stage 1 entries for supplementary code points */ - if(c<0x10000 || (sharedData->table->mbcs.unicodeMask&UCNV_HAS_SUPPLEMENTARY)) { - stage2Entry=MBCS_STAGE_2_FROM_U(table, c); - /* get the bytes and the length for the output */ - if(outputType==MBCS_OUTPUT_2){ - myValue=MBCS_VALUE_2_FROM_STAGE_2(sharedData->table->mbcs.fromUnicodeBytes, stage2Entry, c); - if(myValue<=0xff) { - *length=1; - } else { - *length=2; + if (value == VALID_NON_TERMINAL_2022) { + /* indicate that the escape sequence is incomplete: key!=0 */ + return; + } else if (value == INVALID_2022 ) { + *err = U_ILLEGAL_ESCAPE_SEQUENCE; + return; + } else /* value == VALID_TERMINAL_2022 */ { + switch(var){ +#ifdef U_ENABLE_GENERIC_ISO_2022 + case ISO_2022: + { + const char *chosenConverterName = escSeqStateTable_Result_2022[offset]; + if(chosenConverterName == NULL) { + /* SS2 or SS3 */ + *err = U_UNSUPPORTED_ESCAPE_SEQUENCE; + return; } - }else if(outputType==MBCS_OUTPUT_3){ - p=MBCS_POINTER_3_FROM_STAGE_2(sharedData->table->mbcs.fromUnicodeBytes, stage2Entry, c); - myValue=((uint32_t)*p<<16)|((uint32_t)p[1]<<8)|p[2]; - if(myValue<=0xff) { - *length=1; - } else if(myValue<=0xffff) { - *length=2; - } else { - *length=3; + + _this->mode = UCNV_SI; + ucnv_close(myData2022->currentConverter); + myData2022->currentConverter = myUConverter = ucnv_open(chosenConverterName, err); + if(U_SUCCESS(*err)) { + myUConverter->fromCharErrorBehaviour = UCNV_TO_U_CALLBACK_STOP; + _this->mode = UCNV_SO; + } + break; + } +#endif + case ISO_2022_JP: + { + StateEnum tempState=nextStateToUnicodeJP[offset]; + switch(tempState) { + case INVALID_STATE: + *err = U_UNSUPPORTED_ESCAPE_SEQUENCE; + break; + case SS2_STATE: + if(myData2022->toU2022State.cs[2]!=0) { + if(myData2022->toU2022State.g<2) { + myData2022->toU2022State.prevG=myData2022->toU2022State.g; + } + myData2022->toU2022State.g=2; + } else { + /* illegal to have SS2 before a matching designator */ + *err = U_ILLEGAL_ESCAPE_SEQUENCE; + } + break; + /* case SS3_STATE: not used in ISO-2022-JP-x */ + case ISO8859_1: + case ISO8859_7: + if((jpCharsetMasks[myData2022->version] & CSM(tempState)) == 0) { + *err = U_UNSUPPORTED_ESCAPE_SEQUENCE; + } else { + /* G2 charset for SS2 */ + myData2022->toU2022State.cs[2]=(int8_t)tempState; + } + break; + default: + if((jpCharsetMasks[myData2022->version] & CSM(tempState)) == 0) { + *err = U_UNSUPPORTED_ESCAPE_SEQUENCE; + } else { + /* G0 charset */ + myData2022->toU2022State.cs[0]=(int8_t)tempState; + } + break; + } + } + break; + case ISO_2022_CN: + { + StateEnum tempState=nextStateToUnicodeCN[offset]; + switch(tempState) { + case INVALID_STATE: + *err = U_UNSUPPORTED_ESCAPE_SEQUENCE; + break; + case SS2_STATE: + if(myData2022->toU2022State.cs[2]!=0) { + if(myData2022->toU2022State.g<2) { + myData2022->toU2022State.prevG=myData2022->toU2022State.g; + } + myData2022->toU2022State.g=2; + } else { + /* illegal to have SS2 before a matching designator */ + *err = U_ILLEGAL_ESCAPE_SEQUENCE; + } + break; + case SS3_STATE: + if(myData2022->toU2022State.cs[3]!=0) { + if(myData2022->toU2022State.g<2) { + myData2022->toU2022State.prevG=myData2022->toU2022State.g; + } + myData2022->toU2022State.g=3; + } else { + /* illegal to have SS3 before a matching designator */ + *err = U_ILLEGAL_ESCAPE_SEQUENCE; + } + break; + case ISO_IR_165: + if(myData2022->version==0) { + *err = U_UNSUPPORTED_ESCAPE_SEQUENCE; + break; + } + case GB2312_1: + case CNS_11643_1: + myData2022->toU2022State.cs[1]=(int8_t)tempState; + break; + case CNS_11643_2: + myData2022->toU2022State.cs[2]=(int8_t)tempState; + break; + default: + /* other CNS 11643 planes */ + if(myData2022->version==0) { + *err = U_UNSUPPORTED_ESCAPE_SEQUENCE; + } else { + myData2022->toU2022State.cs[3]=(int8_t)tempState; + } + break; + } + } + break; + case ISO_2022_KR: + if(offset==0x30){ + /* nothing to be done, just accept this one escape sequence */ + } else { + *err = U_UNSUPPORTED_ESCAPE_SEQUENCE; + } + break; + + default: + *err = U_ILLEGAL_ESCAPE_SEQUENCE; + break; + } + } + if(U_SUCCESS(*err)) { + _this->toULength = 0; + } +} + +/*Checks the characters of the buffer against valid 2022 escape sequences +*if the match we return a pointer to the initial start of the sequence otherwise +*we return sourceLimit +*/ +/*for 2022 looks ahead in the stream + *to determine the longest possible convertible + *data stream + */ +static U_INLINE const char* +getEndOfBuffer_2022(const char** source, + const char* sourceLimit, + UBool flush){ + + const char* mySource = *source; + +#ifdef U_ENABLE_GENERIC_ISO_2022 + if (*source >= sourceLimit) + return sourceLimit; + + do{ + + if (*mySource == ESC_2022){ + int8_t i; + int32_t key = 0; + int32_t offset; + UCNV_TableStates_2022 value = VALID_NON_TERMINAL_2022; + + /* Kludge: I could not + * figure out the reason for validating an escape sequence + * twice - once here and once in changeState_2022(). + * is it possible to have an ESC character in a ISO2022 + * byte stream which is valid in a code page? Is it legal? + */ + for (i=0; + (mySource+i < sourceLimit)&&(value == VALID_NON_TERMINAL_2022); + i++) { + value = getKey_2022(*(mySource+i), &key, &offset); + } + if (value > 0 || *mySource==ESC_2022) + return mySource; + + if ((value == VALID_NON_TERMINAL_2022)&&(!flush) ) + return sourceLimit; + } + }while (++mySource < sourceLimit); + + return sourceLimit; +#else + while(mySource < sourceLimit && *mySource != ESC_2022) { + ++mySource; + } + return mySource; +#endif +} + + +/* This inline function replicates code in _MBCSFromUChar32() function in ucnvmbcs.c + * any future change in _MBCSFromUChar32() function should be reflected in + * this macro + */ +static U_INLINE void +MBCS_FROM_UCHAR32_ISO2022(UConverterSharedData* sharedData, + UChar32 c, + uint32_t* value, + UBool useFallback, + int32_t *length, + int outputType) +{ + const int32_t *cx; + const uint16_t *table; + uint32_t stage2Entry; + uint32_t myValue; + const uint8_t *p; + /* BMP-only codepages are stored without stage 1 entries for supplementary code points */ + if(c<0x10000 || (sharedData->mbcs.unicodeMask&UCNV_HAS_SUPPLEMENTARY)) { + table=sharedData->mbcs.fromUnicodeTable; + stage2Entry=MBCS_STAGE_2_FROM_U(table, c); + /* get the bytes and the length for the output */ + if(outputType==MBCS_OUTPUT_2){ + myValue=MBCS_VALUE_2_FROM_STAGE_2(sharedData->mbcs.fromUnicodeBytes, stage2Entry, c); + if(myValue<=0xff) { + *length=1; + } else { + *length=2; + } + } else /* outputType==MBCS_OUTPUT_3 */ { + p=MBCS_POINTER_3_FROM_STAGE_2(sharedData->mbcs.fromUnicodeBytes, stage2Entry, c); + myValue=((uint32_t)*p<<16)|((uint32_t)p[1]<<8)|p[2]; + if(myValue<=0xff) { + *length=1; + } else if(myValue<=0xffff) { + *length=2; + } else { + *length=3; } } /* is this code point assigned, or do we use fallbacks? */ if( (stage2Entry&(1<<(16+(c&0xf))))!=0 || - (FROM_U_USE_FALLBACK(useFallback, c) && (myValue!=0 || c==0)) + (FROM_U_USE_FALLBACK(useFallback, c) && myValue!=0) ) { /* - * We allow a 0 byte output if the Unicode code point is - * U+0000 and also if the "assigned" bit is set for this entry. + * We allow a 0 byte output if the "assigned" bit is set for this entry. * There is no way with this data structure for fallback output - * for other than U+0000 to be a zero byte. + * to be a zero byte. */ /* assigned */ *value=myValue; - } else { - *length=0; + return; } - }else{ - *length=0; } + + cx=sharedData->mbcs.extIndexes; + if(cx!=NULL) { + *length=ucnv_extSimpleMatchFromU(cx, c, value, useFallback); + return; + } + + /* unassigned */ + *length=0; } /* This inline function replicates code in _MBCSSingleFromUChar32() function in ucnvmbcs.c @@ -927,13 +1031,14 @@ MBCS_SINGLE_FROM_UCHAR32(UConverterSharedData* sharedData, const uint16_t *table; int32_t value; /* BMP-only codepages are stored without stage 1 entries for supplementary code points */ - if(c>=0x10000 && !(sharedData->table->mbcs.unicodeMask&UCNV_HAS_SUPPLEMENTARY)) { - value= -1; + if(c>=0x10000 && !(sharedData->mbcs.unicodeMask&UCNV_HAS_SUPPLEMENTARY)) { + *retval=(uint16_t)-1; + return; } /* convert the Unicode code point in c into codepage bytes (same as in _MBCSFromUnicodeWithOffsets) */ - table=sharedData->table->mbcs.fromUnicodeTable; + table=sharedData->mbcs.fromUnicodeTable; /* get the byte for the output */ - value=MBCS_SINGLE_RESULT_FROM_U(table, (uint16_t *)sharedData->table->mbcs.fromUnicodeBytes, c); + value=MBCS_SINGLE_RESULT_FROM_U(table, (uint16_t *)sharedData->mbcs.fromUnicodeBytes, c); /* is this code point assigned, or do we use fallbacks? */ if(useFallback ? value>=0x800 : value>=0xc00) { value &=0xff; @@ -943,473 +1048,143 @@ MBCS_SINGLE_FROM_UCHAR32(UConverterSharedData* sharedData, *retval=(uint16_t) value; } +#ifdef U_ENABLE_GENERIC_ISO_2022 + /********************************************************************************** * ISO-2022 Converter * * */ -static UChar32 -T_UConverter_getNextUChar_ISO_2022(UConverterToUnicodeArgs* args, - UErrorCode* err){ - const char* mySourceLimit; - int plane=0; /*dummy variable*/ - UConverterDataISO2022* myData =((UConverterDataISO2022*)(args->converter->extraInfo)); - /*Arguments Check*/ - if (args->sourceLimit < args->source){ - *err = U_ILLEGAL_ARGUMENT_ERROR; - return 0xffff; - } - - while(1){ - - mySourceLimit = getEndOfBuffer_2022(&(args->source), args->sourceLimit, TRUE); - /*Find the end of the buffer e.g : Next Escape Seq | end of Buffer*/ - if (args->converter->mode == UCNV_SO && mySourceLimit!=args->source) - /*Already doing some conversion*/{ - - return ucnv_getNextUChar(myData->currentConverter, - &(args->source), - mySourceLimit, - err); - } - /*-Done with buffer with entire buffer - *-Error while converting - */ - changeState_2022(args->converter, - &(args->source), - args->sourceLimit, - TRUE, - ISO_2022, - &plane, - err); - if(args->source >= args->sourceLimit){ - *err = U_INDEX_OUTOFBOUNDS_ERROR; - break; - } - } - - if( (args->source == args->sourceLimit) && args->flush){ - _ISO2022Reset(args->converter,UCNV_RESET_TO_UNICODE); - } - return 0xffff; -} - -static void -T_UConverter_toUnicode_ISO_2022(UConverterToUnicodeArgs *args, - UErrorCode* err){ - - const char *mySourceLimit; - char const* sourceStart; - UConverter *saveThis; - int plane =0; /*dummy variable*/ - UConverterDataISO2022* myData; - - if ((args->converter == NULL) || (args->targetLimit < args->target) || (args->sourceLimit < args->source)){ - *err = U_ILLEGAL_ARGUMENT_ERROR; - return; - } - myData= ((UConverterDataISO2022*)(args->converter->extraInfo)); - while (args->source < args->sourceLimit) { - - /*Find the end of the buffer e.g : Next Escape Seq | end of Buffer*/ - mySourceLimit = getEndOfBuffer_2022(&(args->source), args->sourceLimit, args->flush); - - if (args->converter->mode == UCNV_SO) /*Already doing some conversion*/{ - - saveThis = args->converter; - args->offsets = NULL; - args->converter = myData->currentConverter; - ucnv_toUnicode(args->converter, - &args->target, - args->targetLimit, - &args->source, - mySourceLimit, - args->offsets, - args->flush, - err); - args->converter = saveThis; - myData->isFirstBuffer = FALSE; - } - if((myData->isFirstBuffer) && (args->source[0]!=(char)ESC_2022) - && (myData->currentConverter==NULL)){ - - - saveThis = args->converter; - args->offsets = NULL; - myData->currentConverter = ucnv_open("ASCII",err); - - if(U_FAILURE(*err)){ - break; - } - - args->converter = myData->currentConverter; - ucnv_toUnicode(args->converter, - &args->target, - args->targetLimit, - &args->source, - mySourceLimit, - args->offsets, - args->flush, - err); - args->converter = saveThis; - args->converter->mode = UCNV_SO; - myData->isFirstBuffer=FALSE; - - } - - /*-Done with buffer with entire buffer - -Error while converting - */ - - if (U_FAILURE(*err) || (args->source == args->sourceLimit)) - return; - - sourceStart = args->source; - changeState_2022(args->converter, - &(args->source), - args->sourceLimit, - TRUE, - ISO_2022, - &plane, - err); - /* args->source = sourceStart; */ - - - } - - myData->isFirstBuffer=FALSE; - if( (args->source == args->sourceLimit) && args->flush){ - _ISO2022Reset(args->converter,UCNV_RESET_FROM_UNICODE); - } - -} - static void T_UConverter_toUnicode_ISO_2022_OFFSETS_LOGIC(UConverterToUnicodeArgs* args, UErrorCode* err){ - - int32_t myOffset=0; - int32_t base = 0; - const char* mySourceLimit; - char const* sourceStart; + const char* mySourceLimit, *realSourceLimit; + const char* sourceStart; + const UChar* myTargetStart; UConverter* saveThis; - int plane =0;/*dummy variable*/ UConverterDataISO2022* myData; + int8_t length; + + saveThis = args->converter; + myData=((UConverterDataISO2022*)(saveThis->extraInfo)); + + realSourceLimit = args->sourceLimit; + while (args->source < realSourceLimit) { + if(myData->key == 0) { /* are we in the middle of an escape sequence? */ + /*Find the end of the buffer e.g : Next Escape Seq | end of Buffer*/ + mySourceLimit = getEndOfBuffer_2022(&(args->source), realSourceLimit, args->flush); + + if(args->source < mySourceLimit) { + if(myData->currentConverter==NULL) { + myData->currentConverter = ucnv_open("ASCII",err); + if(U_FAILURE(*err)){ + return; + } - if ((args->converter == NULL) || (args->targetLimit < args->target) || (args->sourceLimit < args->source)){ - *err = U_ILLEGAL_ARGUMENT_ERROR; - return; - } - - myData=((UConverterDataISO2022*)(args->converter->extraInfo)); - - while (args->source < args->sourceLimit) { - mySourceLimit = getEndOfBuffer_2022(&(args->source), args->sourceLimit, args->flush); - /*Find the end of the buffer e.g : Next Escape Seq | end of Buffer*/ - - if (args->converter->mode == UCNV_SO) /*Already doing some conversion*/{ - const UChar* myTargetStart = args->target; - - saveThis = args->converter; - args->converter = myData->currentConverter; - ucnv_toUnicode(args->converter, - &(args->target), - args->targetLimit, - &(args->source), - mySourceLimit, - args->offsets, - args->flush, - err); - - myData->isFirstBuffer = FALSE; - - args->converter = saveThis; - { - int32_t lim = args->target - myTargetStart; - int32_t i = 0; - for (i=base; i < lim;i++){ - args->offsets[i] += myOffset; + myData->currentConverter->fromCharErrorBehaviour = UCNV_TO_U_CALLBACK_STOP; + saveThis->mode = UCNV_SO; } - base += lim; - } - } - if(myData->isFirstBuffer && args->source[0]!=ESC_2022 - && (myData->currentConverter==NULL)){ - - const UChar* myTargetStart = args->target; - saveThis = args->converter; - args->offsets = NULL; - myData->currentConverter = ucnv_open("ASCII",err); - - if(U_FAILURE(*err)){ - break; - } + /* convert to before the ESC or until the end of the buffer */ + myData->isFirstBuffer=FALSE; + sourceStart = args->source; + myTargetStart = args->target; + args->converter = myData->currentConverter; + ucnv_toUnicode(args->converter, + &args->target, + args->targetLimit, + &args->source, + mySourceLimit, + args->offsets, + (UBool)(args->flush && mySourceLimit == realSourceLimit), + err); + args->converter = saveThis; + + if (*err == U_BUFFER_OVERFLOW_ERROR) { + /* move the overflow buffer */ + length = saveThis->UCharErrorBufferLength = myData->currentConverter->UCharErrorBufferLength; + myData->currentConverter->UCharErrorBufferLength = 0; + if(length > 0) { + uprv_memcpy(saveThis->UCharErrorBuffer, + myData->currentConverter->UCharErrorBuffer, + length*U_SIZEOF_UCHAR); + } + return; + } - args->converter = myData->currentConverter; - ucnv_toUnicode(args->converter, - &args->target, - args->targetLimit, - &args->source, - mySourceLimit, - args->offsets, - args->flush, - err); - args->converter = saveThis; - args->converter->mode = UCNV_SO; - myData->isFirstBuffer=FALSE; -/* args->converter = saveThis;*/ - { - int32_t lim = args->target - myTargetStart; - int32_t i = 0; - for (i=base; i < lim;i++){ - args->offsets[i] += myOffset; + /* + * At least one of: + * -Error while converting + * -Done with entire buffer + * -Need to write offsets or update the current offset + * (leave that up to the code in ucnv.c) + * + * or else we just stopped at an ESC byte and continue with changeState_2022() + */ + if (U_FAILURE(*err) || + (args->source == realSourceLimit) || + (args->offsets != NULL && (args->target != myTargetStart || args->source != sourceStart) || + (mySourceLimit < realSourceLimit && myData->currentConverter->toULength > 0)) + ) { + /* copy partial or error input for truncated detection and error handling */ + if(U_FAILURE(*err)) { + length = saveThis->invalidCharLength = myData->currentConverter->invalidCharLength; + if(length > 0) { + uprv_memcpy(saveThis->invalidCharBuffer, myData->currentConverter->invalidCharBuffer, length); + } + } else { + length = saveThis->toULength = myData->currentConverter->toULength; + if(length > 0) { + uprv_memcpy(saveThis->toUBytes, myData->currentConverter->toUBytes, length); + if(args->source < mySourceLimit) { + *err = U_TRUNCATED_CHAR_FOUND; /* truncated input before ESC */ + } + } + } + return; } - base += lim; } } - /*-Done with buffer with entire buffer - -Error while converting - */ - - if (U_FAILURE(*err) || (args->source == args->sourceLimit)) - return; sourceStart = args->source; changeState_2022(args->converter, &(args->source), - args->sourceLimit, - TRUE, + realSourceLimit, ISO_2022, - &plane, err); - myOffset += args->source - sourceStart; - - } - if( (args->source == args->sourceLimit) && args->flush){ - _ISO2022Reset(args->converter,UCNV_RESET_TO_UNICODE); - } -} - -static UCNV_TableStates_2022 -getKey_2022(char c,int32_t* key,int32_t* offset){ - int32_t togo = *key; - int32_t low = 0; - int32_t hi = MAX_STATES_2022; - int32_t oldmid=0; - - if (*key == 0){ - togo = (int8_t)normalize_esq_chars_2022[(int)c]; - } - else{ - togo <<= 5; - togo += (int8_t)normalize_esq_chars_2022[(int)c]; - } - - while (hi != low) /*binary search*/{ - - register int32_t mid = (hi+low) >> 1; /*Finds median*/ - - if (mid == oldmid) - break; - - if (escSeqStateTable_Key_2022[mid] > togo){ - hi = mid; - } - else if (escSeqStateTable_Key_2022[mid] < togo){ - low = mid; - } - else /*we found it*/{ - *key = togo; - *offset = mid; - return escSeqStateTable_Value_2022[mid]; + if (U_FAILURE(*err) || (args->source != sourceStart && args->offsets != NULL)) { + /* let the ucnv.c code update its current offset */ + return; } - oldmid = mid; - } - - *key = 0; - *offset = 0; - return INVALID_2022; -} - - - -/*Checks the characters of the buffer against valid 2022 escape sequences -*if the match we return a pointer to the initial start of the sequence otherwise -*we return sourceLimit -*/ -static const char* -getEndOfBuffer_2022(const char** source, - const char* sourceLimit, - UBool flush){ - - const char* mySource = *source; - - if (*source >= sourceLimit) - return sourceLimit; - - do{ - - if (*mySource == ESC_2022){ - int8_t i; - int32_t key = 0; - int32_t offset; - UCNV_TableStates_2022 value = VALID_NON_TERMINAL_2022; - - /* Kludge: I could not - * figure out the reason for validating an escape sequence - * twice - once here and once in changeState_2022(). - * is it possible to have an ESC character in a ISO2022 - * byte stream which is valid in a code page? Is it legal? - */ - for (i=0; - (mySource+i < sourceLimit)&&(value == VALID_NON_TERMINAL_2022); - i++) { - value = getKey_2022(*(mySource+i), &key, &offset); - } - if (value > 0 || *mySource==ESC_2022) - return mySource; - - if ((value == VALID_NON_TERMINAL_2022)&&(!flush) ) - return sourceLimit; - } - }while (++mySource < sourceLimit); - - return sourceLimit; } -/* - * From Unicode Callback helper function - */ -static void -fromUnicodeCallback(UConverterFromUnicodeArgs* args,const UChar32 sourceChar,const UChar** pSource, - unsigned char** pTarget,int32_t** pOffsets,UConverterCallbackReason reason, UErrorCode* err){ - - /*variables for callback */ - const UChar* saveSource =NULL; - char* saveTarget =NULL; - int32_t* saveOffsets =NULL; - int currentOffset =0; - int saveIndex =0; - int32_t* offsets = *pOffsets; - const UChar* source = *pSource; - unsigned char* target = *pTarget; - - args->converter->invalidUCharLength = 0; - - if(sourceChar>0xffff){ - args->converter->invalidUCharBuffer[args->converter->invalidUCharLength++] =(uint16_t)(((sourceChar)>>10)+0xd7c0); - args->converter->invalidUCharBuffer[args->converter->invalidUCharLength++] =(uint16_t)(((sourceChar)&0x3ff)|0xdc00); - } - else{ - args->converter->invalidUCharBuffer[args->converter->invalidUCharLength++] =(UChar)sourceChar; - } - if(offsets) - currentOffset = *(offsets-1)+1; - - saveSource = args->source; - saveTarget = args->target; - saveOffsets = args->offsets; - args->target = (char*)target; - args->source = source; - args->offsets = offsets; - - /*copies current values for the ErrorFunctor to update */ - /*Calls the ErrorFunctor */ - args->converter->fromUCharErrorBehaviour ( args->converter->fromUContext, - args, - args->converter->invalidUCharBuffer, - args->converter->invalidUCharLength, - (UChar32) (sourceChar), - reason, - err); - - saveIndex = args->target - (char*)target; - if(args->offsets){ - args->offsets = saveOffsets; - while(saveIndex-->0){ - *offsets = currentOffset; - offsets++; - } - } - target = (unsigned char*)args->target; - *pTarget=target; - *pOffsets=offsets; - args->source=saveSource; - args->target=saveTarget; - args->offsets=saveOffsets; - args->converter->fromUSurrogateLead=0x00; - -} +#endif /* * To Unicode Callback helper function */ static void -toUnicodeCallback(UConverterToUnicodeArgs* args, const uint32_t sourceChar,const char** pSource, - const uint32_t targetUniChar,UChar** pTarget,UErrorCode* err){ - - const char *saveSource = args->source; - UChar *saveTarget = args->target; - const char* source = *pSource; - UChar* target = *pTarget; - int32_t *saveOffsets = NULL; - UConverterCallbackReason reason; - int32_t currentOffset; - int32_t saveIndex = target - args->target; - - args->converter->invalidCharLength=0; - +toUnicodeCallback(UConverter *cnv, + const uint32_t sourceChar, const uint32_t targetUniChar, + UErrorCode* err){ if(sourceChar>0xff){ - currentOffset= source - args->source - 2; - args->converter->invalidCharBuffer[args->converter->invalidCharLength++] = (char)(sourceChar>>8); - args->converter->invalidCharBuffer[args->converter->invalidCharLength++] = (char)sourceChar; + cnv->toUBytes[0] = (uint8_t)(sourceChar>>8); + cnv->toUBytes[1] = (uint8_t)sourceChar; + cnv->toULength = 2; } else{ - - currentOffset= source - args->source -1; - args->converter->invalidCharBuffer[args->converter->invalidCharLength++] =(char) sourceChar; + cnv->toUBytes[0] =(char) sourceChar; + cnv->toULength = 2; } if(targetUniChar == (missingCharMarker-1/*0xfffe*/)){ - reason = UCNV_UNASSIGNED; *err = U_INVALID_CHAR_FOUND; } else{ - reason = UCNV_ILLEGAL; *err = U_ILLEGAL_CHAR_FOUND; } - - if(args->offsets){ - saveOffsets=args->offsets; - args->offsets = args->offsets+(target - args->target); - } - - args->target =target; - target =saveTarget; - args->source = source; - - args->converter->fromCharErrorBehaviour ( - args->converter->toUContext, - args, - args->converter->invalidCharBuffer, - args->converter->invalidCharLength, - reason, - err); - - if(args->offsets){ - args->offsets = saveOffsets; - - for (;saveIndex < (args->target - target);saveIndex++) { - args->offsets[saveIndex] += currentOffset; - } - } - target=args->target; - *pTarget=target; - args->source = saveSource; - args->target = saveTarget; } /**************************************ISO-2022-JP*************************************************/ @@ -1453,28 +1228,21 @@ toUnicodeCallback(UConverterToUnicodeArgs* args, const uint32_t sourceChar,const * ISO-8859-1 : Algorithmic implemented as LATIN1 case * ISO-8859-7 : alisas to ibm-9409 mapping table */ -#define MAX_VALID_CP_JP 9 -static const Cnv2022Type myConverterType[MAX_VALID_CP_JP]={ - ASCII1, - LATIN1, - SBCS, - SBCS, - DBCS, - DBCS, - DBCS, - DBCS, - SBCS, +/* preference order of JP charsets */ +static const StateEnum jpCharsetPref[]={ + ASCII, + JISX201, + ISO8859_1, + ISO8859_7, + JISX208, + JISX212, + GB2312, + KSC5601, + HWKANA_7BIT }; -static const StateEnum nextStateArray[5][MAX_VALID_CP_JP]= { - {JISX201 ,INVALID_STATE,INVALID_STATE,JISX208,ASCII,INVALID_STATE,INVALID_STATE,INVALID_STATE,INVALID_STATE}, - {JISX201,INVALID_STATE,INVALID_STATE,JISX208,JISX212,ASCII,INVALID_STATE,INVALID_STATE,INVALID_STATE}, - {ISO8859_1,ISO8859_7,JISX201,JISX208,JISX212,GB2312,KSC5601,ASCII,INVALID_STATE}, - {JISX201,INVALID_STATE,INVALID_STATE,JISX208,JISX212,HWKANA_7BIT,INVALID_STATE,INVALID_STATE,ASCII}, - {JISX201,INVALID_STATE,INVALID_STATE,JISX208,JISX212,ASCII,INVALID_STATE,INVALID_STATE,INVALID_STATE}, -}; -static const char escSeqChars[MAX_VALID_CP_JP][6] ={ +static const char escSeqChars[][6] ={ "\x1B\x28\x42", /* (B ASCII */ "\x1B\x2E\x41", /* .A ISO-8859-1 */ "\x1B\x2E\x46", /* .F ISO-8859-7 */ @@ -1486,8 +1254,8 @@ static const char escSeqChars[MAX_VALID_CP_JP][6] ={ "\x1B\x28\x49" /* (I HWKANA_7BIT */ }; -static const int32_t escSeqCharsLen[MAX_VALID_CP_JP] ={ - 3, /* length of (B ASCII */ +static const int32_t escSeqCharsLen[] ={ + 3, /* length of (B ASCII */ 3, /* length of .A ISO-8859-1 */ 3, /* length of .F ISO-8859-7 */ 3, /* length of (J JISX-201 */ @@ -1516,237 +1284,275 @@ static const int32_t escSeqCharsLen[MAX_VALID_CP_JP] ={ */ static void -UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args, UErrorCode* err){ - +UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args, UErrorCode* err) { UConverterDataISO2022 *converterData; - unsigned char* target = (unsigned char*) args->target; - const unsigned char* targetLimit = (const unsigned char*) args->targetLimit; + ISO2022State *pFromU2022State; + uint8_t *target = (uint8_t *) args->target; + const uint8_t *targetLimit = (const uint8_t *) args->targetLimit; const UChar* source = args->source; const UChar* sourceLimit = args->sourceLimit; int32_t* offsets = args->offsets; - int32_t offset = 0; - uint32_t targetByteUnit = missingCharMarker; - UChar32 sourceChar =0x0000; - const char* escSeq = NULL; - int len =0; /*length of escSeq chars*/ - UConverterCallbackReason reason; - UConverterSharedData* sharedData=NULL; - UBool useFallback; - - /* state variables*/ - StateEnum* currentState; - StateEnum initIterState; - UConverter** currentConverter; - Cnv2022Type* currentType; - UConverter** convArray; - - /* arguments check*/ - if ((args->converter == NULL) || (targetLimit < target) || (sourceLimit < source)){ - *err = U_ILLEGAL_ARGUMENT_ERROR; - return; - } + UChar32 sourceChar; + char buffer[8]; + int32_t len, outLen; + int8_t choices[10]; + int32_t choiceCount; + uint32_t targetValue; + UBool useFallback; + + int32_t i; + int8_t cs, g; + + /* set up the state */ + converterData = (UConverterDataISO2022*)args->converter->extraInfo; + pFromU2022State = &converterData->fromU2022State; + useFallback = args->converter->useFallback; + + choiceCount = 0; - /* Initialize */ - converterData = (UConverterDataISO2022*)args->converter->extraInfo; - useFallback = args->converter->useFallback; - currentState = &converterData->fromUnicodeCurrentState; - initIterState = ASCII; - currentConverter = &converterData->fromUnicodeConverter; - convArray = converterData->myConverterArray; - initIterState = *currentState; - currentType = &converterData->currentType; - /* check if the last codepoint of previous buffer was a lead surrogate*/ - if(args->converter->fromUSurrogateLead!=0 && target< targetLimit) { + if((sourceChar = args->converter->fromUChar32)!=0 && target< targetLimit) { goto getTrail; } - - *currentConverter = convArray[(*currentConverter==NULL) ? 0 : (int)*currentState]; - sharedData= (*currentConverter)->sharedData; - - while( source < sourceLimit){ - targetByteUnit = missingCharMarker; + while(source < sourceLimit) { + if(target < targetLimit) { - if(target < targetLimit){ sourceChar = *(source++); - if(sourceChar > SPACE) { - do{ - switch (*currentType){ - /* most common case*/ - case DBCS: - { - uint32_t value=0; - int length=0; - /*if(2 == _MBCSFromUChar32(sharedData,sourceChar, &value, useFallback)) { - targetByteUnit = (uint16_t)value; - }*/ - MBCS_FROM_UCHAR32_ISO2022(sharedData,sourceChar,&value,useFallback,&length,MBCS_OUTPUT_2); - if(length==2){ - targetByteUnit = value; - } - } - break; - case ASCII1: - if(sourceChar < 0x7f){ - targetByteUnit = sourceChar; - } - break; - - case SBCS: - MBCS_SINGLE_FROM_UCHAR32(sharedData,sourceChar,&targetByteUnit,useFallback); - /*targetByteUnit=(uint16_t)_MBCSSingleFromUChar32(sharedData,sourceChar,useFallback);*/ - /* - * If mySourceChar is unassigned, then _MBCSSingleFromUChar32() returns -1 - * which becomes the same as missingCharMarker with the cast to uint16_t. - */ - /* Check if the sourceChar is in the HW Kana range*/ - if(0xFF9F-sourceChar<=(0xFF9F-0xFF61)){ - if( converterData->version==3){ - /*we get a1-df from _MBCSSingleFromUChar32 so subtract 0x80*/ - targetByteUnit-=0x80; - *currentState = HWKANA_7BIT; - } - else if( converterData->version==4){ - *currentState = JISX201; - } - else{ - targetByteUnit=missingCharMarker; - } - *currentConverter = convArray[(*currentConverter==NULL) ? 0 : (int)*currentState]; - *currentType = (Cnv2022Type) myConverterType[*currentState]; - } - break; - - case LATIN1: - if(sourceChar <= 0x00FF){ - targetByteUnit = sourceChar; + /*check if the char is a First surrogate*/ + if(UTF_IS_SURROGATE(sourceChar)) { + if(UTF_IS_SURROGATE_FIRST(sourceChar)) { +getTrail: + /*look ahead to find the trail surrogate*/ + if(source < sourceLimit) { + /* test the following code unit */ + UChar trail=(UChar) *source; + if(UTF_IS_SECOND_SURROGATE(trail)) { + source++; + sourceChar=UTF16_GET_PAIR_VALUE(sourceChar, trail); + args->converter->fromUChar32=0x00; + /* convert this supplementary code point */ + /* exit this condition tree */ + } else { + /* this is an unmatched lead code unit (1st surrogate) */ + /* callback(illegal) */ + *err=U_ILLEGAL_CHAR_FOUND; + args->converter->fromUChar32=sourceChar; + break; } - - break; - default: - /*not expected */ + } else { + /* no more input */ + args->converter->fromUChar32=sourceChar; break; } - if(targetByteUnit==missingCharMarker){ - *currentState = nextStateArray[converterData->version][*currentState]; - *currentConverter = convArray[(*currentConverter==NULL) ? 0 : (int)*currentState]; - *currentType = (Cnv2022Type) myConverterType[*currentState]; - sharedData= (*currentConverter)->sharedData; - } - else - /*got the mapping so break from while loop*/ - break; - - }while(initIterState != *currentState); - - } - else{ - targetByteUnit = sourceChar; - *currentState = ASCII; - *currentType = (Cnv2022Type) myConverterType[*currentState]; + } else { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + *err=U_ILLEGAL_CHAR_FOUND; + args->converter->fromUChar32=sourceChar; + break; + } } - if(targetByteUnit != missingCharMarker){ + /* do the conversion */ - if( *currentState != initIterState){ + if(choiceCount == 0) { + uint16_t csm; - escSeq = escSeqChars[(int)*currentState]; - len = escSeqCharsLen[(int)*currentState]; + /* + * The csm variable keeps track of which charsets are allowed + * and not used yet while building the choices[]. + */ + csm = jpCharsetMasks[converterData->version]; + choiceCount = 0; + + /* JIS7/8: try single-byte half-width Katakana before JISX208 */ + if(converterData->version == 3 || converterData->version == 4) { + choices[choiceCount++] = cs = (int8_t)HWKANA_7BIT; + csm &= ~CSM(cs); + } - CONCAT_ESCAPE_EX(args,source, &target,targetLimit, &offsets, escSeq,len,err); + /* try the current G0 charset */ + choices[choiceCount++] = cs = pFromU2022State->cs[0]; + csm &= ~CSM(cs); - /* Append SSN for shifting to G2 */ - if(*currentState==ISO8859_1 || *currentState==ISO8859_7){ - escSeq = UCNV_SS2; - len = UCNV_SS2_LEN; - CONCAT_ESCAPE_EX(args, source, &target, targetLimit,&offsets, escSeq,len,err); + /* try the current G2 charset */ + if((cs = pFromU2022State->cs[2]) != 0) { + choices[choiceCount++] = cs; + csm &= ~CSM(cs); + } + + /* try all the other possible charsets */ + for(i = 0; i < LENGTHOF(jpCharsetPref); ++i) { + cs = (int8_t)jpCharsetPref[i]; + if(CSM(cs) & csm) { + choices[choiceCount++] = cs; + csm &= ~CSM(cs); } } - initIterState = *currentState; - offset = source - args->source -1; - /* write the targetByteUnit to target */ - if(targetByteUnit <= 0x00FF){ - if( target converter->charErrorBuffer[args->converter->charErrorBufferLength++] = (unsigned char) targetByteUnit; - *err = U_BUFFER_OVERFLOW_ERROR; + cs = g = 0; + len = 0; + + for(i = 0; i < choiceCount && len == 0; ++i) { + cs = choices[i]; + switch(cs) { + case ASCII: + if(sourceChar <= 0x7f) { + targetValue = (uint32_t)sourceChar; + len = 1; } - }else{ - if(target < targetLimit){ - *(target++) =(unsigned char) (targetByteUnit>>8); - if(offsets){ - *(offsets++) = offset; - } - if(target < targetLimit){ - *(target++) =(unsigned char) (targetByteUnit); - if(offsets){ - *(offsets++) = offset; + break; + case ISO8859_1: + if(0x80 <= sourceChar && sourceChar <= 0xff) { + targetValue = (uint32_t)sourceChar - 0x80; + len = 1; + g = 2; + } + break; + case HWKANA_7BIT: + if((uint32_t)(0xff9f-sourceChar)<=(0xff9f-0xff61)) { + targetValue = (uint32_t)(sourceChar - (0xff61 - 0x21)); + len = 1; + + if(converterData->version==3) { + /* JIS7: use G1 (SO) */ + pFromU2022State->cs[1] = cs; /* do not output an escape sequence */ + g = 1; + } else if(converterData->version==4) { + /* JIS8: use 8-bit bytes with any single-byte charset, see escape sequence output below */ + int8_t cs0; + + targetValue += 0x80; + + cs0 = pFromU2022State->cs[0]; + if(IS_JP_DBCS(cs0)) { + /* switch from a DBCS charset to JISX201 */ + cs = (int8_t)JISX201; + } else { + /* stay in the current G0 charset */ + cs = cs0; } - - }else{ - args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = (unsigned char) (targetByteUnit); - *err = U_BUFFER_OVERFLOW_ERROR; } - }else{ - args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = (unsigned char) (targetByteUnit>>8); - args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = (unsigned char) (targetByteUnit); - *err = U_BUFFER_OVERFLOW_ERROR; } + break; + case JISX201: + /* G0 SBCS */ + MBCS_SINGLE_FROM_UCHAR32( + converterData->myConverterArray[cs], + sourceChar, &targetValue, + useFallback); + if(targetValue <= 0x7f) { + len = 1; + } + break; + case ISO8859_7: + /* G0 SBCS forced to 7-bit output */ + MBCS_SINGLE_FROM_UCHAR32( + converterData->myConverterArray[cs], + sourceChar, &targetValue, + useFallback); + if(0x80 <= targetValue && targetValue <= 0xff) { + targetValue -= 0x80; + len = 1; + g = 2; + } + break; + default: + /* G0 DBCS */ + MBCS_FROM_UCHAR32_ISO2022( + converterData->myConverterArray[cs], + sourceChar, &targetValue, + useFallback, &len, MBCS_OUTPUT_2); + if(len != 2) { + len = 0; + } + break; } } - else{ - /* if we cannot find the character after checking all codepages + if(len > 0) { + outLen = 0; /* count output bytes */ + + /* write SI if necessary (only for JIS7) */ + if(pFromU2022State->g == 1 && g == 0) { + buffer[outLen++] = UCNV_SI; + pFromU2022State->g = 0; + } + + /* write the designation sequence if necessary */ + if(cs != pFromU2022State->cs[g]) { + int32_t escLen = escSeqCharsLen[cs]; + uprv_memcpy(buffer + outLen, escSeqChars[cs], escLen); + outLen += escLen; + pFromU2022State->cs[g] = cs; + + /* invalidate the choices[] */ + choiceCount = 0; + } + + /* write the shift sequence if necessary */ + if(g != pFromU2022State->g) { + switch(g) { + /* case 0 handled before writing escapes */ + case 1: + buffer[outLen++] = UCNV_SO; + pFromU2022State->g = 1; + break; + default: /* case 2 */ + buffer[outLen++] = 0x1b; + buffer[outLen++] = 0x4e; + break; + /* no case 3: no SS3 in ISO-2022-JP-x */ + } + } + + /* write the output bytes */ + if(len == 1) { + buffer[outLen++] = (char)targetValue; + } else /* len == 2 */ { + buffer[outLen++] = (char)(targetValue >> 8); + buffer[outLen++] = (char)targetValue; + } + } else { + /* + * if we cannot find the character after checking all codepages * then this is an error */ - reason = UCNV_UNASSIGNED; *err = U_INVALID_CHAR_FOUND; - - /*check if the char is a First surrogate*/ - if(UTF_IS_SURROGATE(sourceChar)) { - if(UTF_IS_SURROGATE_FIRST(sourceChar)) { - args->converter->fromUSurrogateLead=(UChar)sourceChar; -getTrail: - /*look ahead to find the trail surrogate*/ - if(source < sourceLimit) { - /* test the following code unit */ - UChar trail=(UChar) *source; - if(UTF_IS_SECOND_SURROGATE(trail)) { - source++; - sourceChar=UTF16_GET_PAIR_VALUE(args->converter->fromUSurrogateLead, trail); - args->converter->fromUSurrogateLead=0x00; - reason =UCNV_UNASSIGNED; - *err = U_INVALID_CHAR_FOUND; - /* convert this surrogate code point */ - /* exit this condition tree */ - } else { - /* this is an unmatched lead code unit (1st surrogate) */ - /* callback(illegal) */ - reason=UCNV_ILLEGAL; - *err=U_ILLEGAL_CHAR_FOUND; - } - } else { - /* no more input */ - *err = U_ZERO_ERROR; - break; - } - } else { - /* this is an unmatched trail code unit (2nd surrogate) */ - /* callback(illegal) */ - reason=UCNV_ILLEGAL; - *err=U_ILLEGAL_CHAR_FOUND; - } + args->converter->fromUChar32=sourceChar; + break; + } + + if(sourceChar == CR || sourceChar == LF) { + /* reset the G2 state at the end of a line (conversion got us into ASCII or JISX201 already) */ + pFromU2022State->cs[2] = 0; + choiceCount = 0; + } + + /* output outLen>0 bytes in buffer[] */ + if(outLen == 1) { + *target++ = buffer[0]; + if(offsets) { + *offsets++ = source - args->source - 1; /* -1: known to be ASCII */ } - /* Call the callback function*/ - fromUnicodeCallback(args,sourceChar,&source,&target,&offsets,reason,err); - initIterState = *currentState; - if (U_FAILURE (*err)){ + } else if(outLen == 2 && (target + 2) <= targetLimit) { + *target++ = buffer[0]; + *target++ = buffer[1]; + if(offsets) { + int32_t sourceIndex = (int32_t)(source - args->source - U16_LENGTH(sourceChar)); + *offsets++ = sourceIndex; + *offsets++ = sourceIndex; + } + } else { + ucnv_fromUWriteBytes( + args->converter, + buffer, outLen, + (char **)&target, (const char *)targetLimit, + &offsets, (int32_t)(source - args->source - U16_LENGTH(sourceChar)), + err); + if(U_FAILURE(*err)) { break; } } @@ -1758,18 +1564,62 @@ getTrail: }/* end while(mySourceIndexconverter->fromUSurrogateLead !=0 && (source == sourceLimit) && args->flush){ - *err = U_TRUNCATED_CHAR_FOUND; - } - /* Reset the state of converter if we consumed - * the source and flush is true + /* + * the end of the input stream and detection of truncated input + * are handled by the framework, but for ISO-2022-JP conversion + * we need to be in ASCII mode at the very end + * + * conditions: + * successful + * in SO mode or not in ASCII mode + * end of input and no truncated input */ - if( (source == sourceLimit) && args->flush){ - setInitialStateFromUnicodeJPCN(args->converter,converterData); + if( U_SUCCESS(*err) && + (pFromU2022State->g!=0 || pFromU2022State->cs[0]!=ASCII) && + args->flush && source>=sourceLimit && args->converter->fromUChar32==0 + ) { + int32_t sourceIndex; + + outLen = 0; + + if(pFromU2022State->g != 0) { + buffer[outLen++] = UCNV_SI; + pFromU2022State->g = 0; + } + + if(pFromU2022State->cs[0] != ASCII) { + int32_t escLen = escSeqCharsLen[ASCII]; + uprv_memcpy(buffer + outLen, escSeqChars[ASCII], escLen); + outLen += escLen; + pFromU2022State->cs[0] = (int8_t)ASCII; + } + + /* get the source index of the last input character */ + /* + * TODO this would be simpler and more reliable if we used a pair + * of sourceIndex/prevSourceIndex like in ucnvmbcs.c + * so that we could simply use the prevSourceIndex here; + * this code gives an incorrect result for the rare case of an unmatched + * trail surrogate that is alone in the last buffer of the text stream + */ + sourceIndex=(int32_t)(source-args->source); + if(sourceIndex>0) { + --sourceIndex; + if( U16_IS_TRAIL(args->source[sourceIndex]) && + (sourceIndex==0 || U16_IS_LEAD(args->source[sourceIndex-1])) + ) { + --sourceIndex; + } + } else { + sourceIndex=-1; + } + + ucnv_fromUWriteBytes( + args->converter, + buffer, outLen, + (char **)&target, (const char *)targetLimit, + &offsets, sourceIndex, + err); } /*save the state and return */ @@ -1779,229 +1629,186 @@ getTrail: /*************** to unicode *******************/ -/**************************************************************************** - * Recognized escape sequences are - * (B ASCII - * .A ISO-8859-1 - * .F ISO-8859-7 - * (J JISX-201 - * (I JISX-201 - * $B JISX-208 - * $@ JISX-208 - * $(D JISX-212 - * $A GB2312 - * $(C KSC5601 - */ -static const StateEnum nextStateToUnicodeJP[5][MAX_STATES_2022]= { - { -/* 0 1 2 3 4 5 6 7 8 9 */ - INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - ,ASCII ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,JISX201 ,HWKANA_7BIT ,JISX201 ,INVALID_STATE - ,INVALID_STATE ,INVALID_STATE ,JISX208 ,INVALID_STATE ,JISX208 ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - ,INVALID_STATE ,INVALID_STATE ,JISX208 ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - }, - { -/* 0 1 2 3 4 5 6 7 8 9 */ - INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - ,ASCII ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,JISX201 ,HWKANA_7BIT ,JISX201 ,INVALID_STATE - ,INVALID_STATE ,INVALID_STATE ,JISX208 ,INVALID_STATE ,JISX208 ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - ,INVALID_STATE ,INVALID_STATE ,JISX208 ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,JISX212 ,INVALID_STATE - ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - }, - { -/* 0 1 2 3 4 5 6 7 8 9 */ - INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - ,ASCII ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,JISX201 ,HWKANA_7BIT ,JISX201 ,INVALID_STATE - ,INVALID_STATE ,INVALID_STATE ,JISX208 ,GB2312 ,JISX208 ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - ,ISO8859_1 ,ISO8859_7 ,JISX208 ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,KSC5601 ,JISX212 ,INVALID_STATE - ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - }, - { -/* 0 1 2 3 4 5 6 7 8 9 */ - INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - ,ASCII ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,JISX201 ,HWKANA_7BIT ,JISX201 ,INVALID_STATE - ,INVALID_STATE ,INVALID_STATE ,JISX208 ,GB2312 ,JISX208 ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - ,ISO8859_1 ,ISO8859_7 ,JISX208 ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,KSC5601 ,JISX212 ,INVALID_STATE - ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - }, - { -/* 0 1 2 3 4 5 6 7 8 9 */ - INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - ,ASCII ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,JISX201 ,HWKANA_7BIT ,JISX201 ,INVALID_STATE - ,INVALID_STATE ,INVALID_STATE ,JISX208 ,GB2312 ,JISX208 ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - ,ISO8859_1 ,ISO8859_7 ,JISX208 ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,KSC5601 ,JISX212 ,INVALID_STATE - ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE ,INVALID_STATE - } -}; - static void UConverter_toUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, - UErrorCode* err){ - char tempBuf[2]; - const char *mySource = ( char *) args->source; + UErrorCode* err){ + char tempBuf[3]; + const char *mySource = (char *) args->source; UChar *myTarget = args->target; const char *mySourceLimit = args->sourceLimit; uint32_t targetUniChar = 0x0000; uint32_t mySourceChar = 0x0000; UConverterDataISO2022* myData; - StateEnum* currentState; - uint32_t* toUnicodeStatus; - int plane = 0; /*dummy variable*/ + ISO2022State *pToU2022State; + StateEnum cs; - if ((args->converter == NULL) || (myTarget < args->target) || (mySource < args->source)){ - *err = U_ILLEGAL_ARGUMENT_ERROR; - return; - } myData=(UConverterDataISO2022*)(args->converter->extraInfo); - currentState = &myData->toUnicodeCurrentState; - toUnicodeStatus = &args->converter->toUnicodeStatus; - while(mySource< args->sourceLimit){ + pToU2022State = &myData->toU2022State; - targetUniChar = missingCharMarker; + if(myData->key != 0) { + /* continue with a partial escape sequence */ + goto escape; + } else if(args->converter->toULength == 1 && mySource < mySourceLimit && myTarget < args->targetLimit) { + /* continue with a partial double-byte character */ + mySourceChar = args->converter->toUBytes[0]; + args->converter->toULength = 0; + cs = (StateEnum)pToU2022State->cs[pToU2022State->g]; + goto getTrailByte; + } + + while(mySource < mySourceLimit){ + + targetUniChar =missingCharMarker; if(myTarget < args->targetLimit){ mySourceChar= (unsigned char) *mySource++; - - /* Consume the escape sequences and ascertain the state */ - if(mySourceChar==UCNV_SI){ - if(myData->version==3 && *toUnicodeStatus==0x00){ - if(myData->toUnicodeSaveState!=INVALID_STATE){ - *currentState = (StateEnum) myData->toUnicodeSaveState; - continue; - } - else{ - *err =U_ILLEGAL_CHAR_FOUND; - goto CALLBACK; - } - - } - else{ - goto CALLBACK; - } - }else if(mySourceChar==UCNV_SO){ - if(myData->version==3 && *toUnicodeStatus==0x00){ - myData->toUnicodeSaveState= (int) *currentState; - *currentState = HWKANA_7BIT; + + switch(mySourceChar) { + case UCNV_SI: + if(myData->version==3) { + pToU2022State->g=0; continue; + } else { + /* only JIS7 uses SI/SO, not ISO-2022-JP-x */ + break; } - else{ - goto CALLBACK; - } - }else if(mySourceChar==ESC_2022 || myData->key!=0){ - if(*toUnicodeStatus== 0x00){ - mySource--; - changeState_2022(args->converter,&(mySource), - args->sourceLimit, args->flush,ISO_2022_JP,&plane, err); - /*Invalid or illegal escape sequence */ - if(U_SUCCESS(*err)){ - continue; - - } - else{ - args->target = myTarget; - args->source = mySource; - return; - } - } - else{ - goto CALLBACK; - } - } - switch(myConverterType[*currentState]){ - case DBCS: - if(*toUnicodeStatus== 0x00){ - *toUnicodeStatus= (UChar) mySourceChar; + case UCNV_SO: + if(myData->version==3) { + /* JIS7: switch to G1 half-width Katakana */ + pToU2022State->cs[1] = (int8_t)HWKANA_7BIT; + pToU2022State->g=1; continue; + } else { + /* only JIS7 uses SI/SO, not ISO-2022-JP-x */ + break; } - else{ - const char *pBuf; - - tempBuf[0] = (char) args->converter->toUnicodeStatus; - tempBuf[1] = (char) mySourceChar; - mySourceChar+= (args->converter->toUnicodeStatus)<<8; - *toUnicodeStatus= 0; - pBuf = tempBuf; - targetUniChar = _MBCSSimpleGetNextUChar(myData->currentConverter->sharedData, &pBuf, tempBuf+2, args->converter->useFallback); - } - break; + case ESC_2022: + mySource--; +escape: + changeState_2022(args->converter,&(mySource), + mySourceLimit, ISO_2022_JP,err); - case ASCII1: - if( mySourceChar < 0x7F){ - targetUniChar = (UChar) mySourceChar; - } - else if((uint8_t)(mySourceChar - 0xa1) <= (0xdf - 0xa1) && myData->version==4) { - /* 8-bit halfwidth katakana in any single-byte mode for JIS8 */ - targetUniChar = _MBCS_SINGLE_SIMPLE_GET_NEXT_BMP(myData->myConverterArray[JISX201]->sharedData, mySourceChar); + /* invalid or illegal escape sequence */ + if(U_FAILURE(*err)){ + args->target = myTarget; + args->source = mySource; + return; } + continue; - break; + /* ISO-2022-JP does not use single-byte (C1) SS2 and SS3 */ - case SBCS: - if((uint8_t)(mySourceChar - 0xa1) <= (0xdf - 0xa1) && myData->version==4) { - /* 8-bit halfwidth katakana in any single-byte mode for JIS8 */ - targetUniChar = _MBCS_SINGLE_SIMPLE_GET_NEXT_BMP(myData->myConverterArray[JISX201]->sharedData, mySourceChar); - } - else if(*currentState==HWKANA_7BIT){ - targetUniChar = _MBCS_SINGLE_SIMPLE_GET_NEXT_BMP(myData->myConverterArray[JISX201]->sharedData, mySourceChar+0x80); - } - else { - targetUniChar = _MBCS_SINGLE_SIMPLE_GET_NEXT_BMP(myData->currentConverter->sharedData, mySourceChar); + case CR: + /*falls through*/ + case LF: + /* automatically reset to single-byte mode */ + if((StateEnum)pToU2022State->cs[0] != ASCII && (StateEnum)pToU2022State->cs[0] != JISX201) { + pToU2022State->cs[0] = (int8_t)ASCII; } - - break; - - case LATIN1: - - targetUniChar = (UChar) mySourceChar; - break; - - case INVALID_STATE: - *err = U_ILLEGAL_ESCAPE_SEQUENCE; - args->target = myTarget; - args->source = mySource; - return; - + pToU2022State->cs[2] = 0; + pToU2022State->g = 0; + /* falls through */ default: - /* For non-valid state MBCS and others */ + /* convert one or two bytes */ + cs = (StateEnum)pToU2022State->cs[pToU2022State->g]; + if( (uint8_t)(mySourceChar - 0xa1) <= (0xdf - 0xa1) && myData->version==4 && + !IS_JP_DBCS(cs) + ) { + /* 8-bit halfwidth katakana in any single-byte mode for JIS8 */ + targetUniChar = mySourceChar + (0xff61 - 0xa1); + + /* return from a single-shift state to the previous one */ + if(pToU2022State->g >= 2) { + pToU2022State->g=pToU2022State->prevG; + } + } else switch(cs) { + case ASCII: + if(mySourceChar <= 0x7f) { + targetUniChar = mySourceChar; + } + break; + case ISO8859_1: + if(mySourceChar <= 0x7f) { + targetUniChar = mySourceChar + 0x80; + } + /* return from a single-shift state to the previous one */ + pToU2022State->g=pToU2022State->prevG; + break; + case ISO8859_7: + if(mySourceChar <= 0x7f) { + /* convert mySourceChar+0x80 to use a normal 8-bit table */ + targetUniChar = + _MBCS_SINGLE_SIMPLE_GET_NEXT_BMP( + myData->myConverterArray[cs], + mySourceChar + 0x80); + } + /* return from a single-shift state to the previous one */ + pToU2022State->g=pToU2022State->prevG; + break; + case JISX201: + if(mySourceChar <= 0x7f) { + targetUniChar = + _MBCS_SINGLE_SIMPLE_GET_NEXT_BMP( + myData->myConverterArray[cs], + mySourceChar); + } + break; + case HWKANA_7BIT: + if((uint8_t)(mySourceChar - 0x21) <= (0x5f - 0x21)) { + /* 7-bit halfwidth Katakana */ + targetUniChar = mySourceChar + (0xff61 - 0x21); + } + break; + default: + /* G0 DBCS */ + if(mySource < mySourceLimit) { + char trailByte; +getTrailByte: + tempBuf[0] = (char) (mySourceChar); + tempBuf[1] = trailByte = *mySource++; + mySourceChar = (mySourceChar << 8) | (uint8_t)(trailByte); + targetUniChar = ucnv_MBCSSimpleGetNextUChar(myData->myConverterArray[cs], tempBuf, 2, FALSE); + } else { + args->converter->toUBytes[0] = (uint8_t)mySourceChar; + args->converter->toULength = 1; + goto endloop; + } + } break; } if(targetUniChar < (missingCharMarker-1/*0xfffe*/)){ if(args->offsets){ - args->offsets[myTarget - args->target]= mySource - args->source - 2 - +(myConverterType[*currentState] <= SBCS); - + args->offsets[myTarget - args->target]= mySource - args->source - (mySourceChar <= 0xff ? 1 : 2); } *(myTarget++)=(UChar)targetUniChar; - targetUniChar=missingCharMarker; } - else{ -CALLBACK: + else if(targetUniChar > missingCharMarker){ + /* disassemble the surrogate pair and write to output*/ + targetUniChar-=0x0010000; + *myTarget = (UChar)(0xd800+(UChar)(targetUniChar>>10)); + if(args->offsets){ + args->offsets[myTarget - args->target]= mySource - args->source - (mySourceChar <= 0xff ? 1 : 2); + } + ++myTarget; + if(myTarget< args->targetLimit){ + *myTarget = (UChar)(0xdc00+(UChar)(targetUniChar&0x3ff)); + if(args->offsets){ + args->offsets[myTarget - args->target]= mySource - args->source - (mySourceChar <= 0xff ? 1 : 2); + } + ++myTarget; + }else{ + args->converter->UCharErrorBuffer[args->converter->UCharErrorBufferLength++]= + (UChar)(0xdc00+(UChar)(targetUniChar&0x3ff)); + } + } + else{ /* Call the callback function*/ - toUnicodeCallback(args,mySourceChar,&mySource,targetUniChar,&myTarget,err); - /*args->offsets = saveOffsets;*/ - if(U_FAILURE(*err)) - break; - + toUnicodeCallback(args->converter,mySourceChar,targetUniChar,err); + break; } } else{ @@ -2009,25 +1816,12 @@ CALLBACK: break; } } - if((args->flush==TRUE) - && (mySource == mySourceLimit) - && ( *toUnicodeStatus!=0x00)){ - - *err = U_TRUNCATED_CHAR_FOUND; - *toUnicodeStatus= 0x00; - } - /* Reset the state of converter if we consumed - * the source and flush is true - */ - if( (mySource == mySourceLimit) && args->flush){ - setInitialStateToUnicodeJPCN(args->converter,myData); - } +endloop: args->target = myTarget; args->source = mySource; } - /*************************************************************** * Rules for ISO-2022-KR encoding * i) The KSC5601 designator sequence should appear only once in a file, @@ -2039,25 +1833,25 @@ CALLBACK: static void UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC_IBM(UConverterFromUnicodeArgs* args, UErrorCode* err){ - UConverter* saveConv = args->converter; - UConverterDataISO2022 *myConverterData=(UConverterDataISO2022*)args->converter->extraInfo; - args->converter=myConverterData->currentConverter; - _MBCSFromUnicodeWithOffsets(args,err); - if(U_FAILURE(*err)){ - if(args->converter->charErrorBufferLength!=0){ - uprv_memcpy(saveConv->charErrorBuffer, args->converter->charErrorBuffer, - args->converter->charErrorBufferLength); - saveConv->charErrorBufferLength=args->converter->charErrorBufferLength; - args->converter->charErrorBufferLength=0; - } - if(args->converter->invalidUCharLength!=0){ - uprv_memcpy(saveConv->invalidUCharBuffer, args->converter->invalidUCharBuffer, - args->converter->invalidUCharLength); - saveConv->invalidUCharLength=args->converter->invalidUCharLength; - args->converter->invalidCharLength=0; - } - } - args->converter=saveConv; + UConverter* saveConv = args->converter; + UConverterDataISO2022 *myConverterData=(UConverterDataISO2022*)saveConv->extraInfo; + args->converter=myConverterData->currentConverter; + + myConverterData->currentConverter->fromUChar32 = saveConv->fromUChar32; + ucnv_MBCSFromUnicodeWithOffsets(args,err); + saveConv->fromUChar32 = myConverterData->currentConverter->fromUChar32; + + if(*err == U_BUFFER_OVERFLOW_ERROR) { + if(myConverterData->currentConverter->charErrorBufferLength > 0) { + uprv_memcpy( + saveConv->charErrorBuffer, + myConverterData->currentConverter->charErrorBuffer, + myConverterData->currentConverter->charErrorBufferLength); + } + saveConv->charErrorBufferLength = myConverterData->currentConverter->charErrorBufferLength; + myConverterData->currentConverter->charErrorBufferLength = 0; + } + args->converter=saveConv; } static void @@ -2073,21 +1867,11 @@ UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args UBool isTargetByteDBCS; UBool oldIsTargetByteDBCS; UConverterDataISO2022 *converterData; - UConverterCallbackReason reason; UConverterSharedData* sharedData; UBool useFallback; int32_t length =0; - if ((args->converter == NULL) || (args->targetLimit < args->target) || (args->sourceLimit < args->source)){ - *err = U_ILLEGAL_ARGUMENT_ERROR; - return; - } - /* initialize data */ converterData=(UConverterDataISO2022*)args->converter->extraInfo; - sharedData = converterData->fromUnicodeConverter->sharedData; - useFallback = args->converter->useFallback; - isTargetByteDBCS=(UBool)args->converter->fromUnicodeStatus; - oldIsTargetByteDBCS = isTargetByteDBCS; /* if the version is 1 then the user is requesting * conversion with ibm-25546 pass the arguments to * MBCS converter and return @@ -2096,9 +1880,15 @@ UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC_IBM(args,err); return; } + + /* initialize data */ + sharedData = converterData->currentConverter->sharedData; + useFallback = args->converter->useFallback; + isTargetByteDBCS=(UBool)args->converter->fromUnicodeStatus; + oldIsTargetByteDBCS = isTargetByteDBCS; isTargetByteDBCS = (UBool) args->converter->fromUnicodeStatus; - if(args->converter->fromUSurrogateLead!=0 && target converter->fromUChar32)!=0 && target targetLimit){ sourceChar = *source++; - /* length= _MBCSFromUChar32(converterData->fromUnicodeConverter->sharedData, + /* length= ucnv_MBCSFromUChar32(converterData->currentConverter->sharedData, sourceChar,&targetByteUnit,args->converter->useFallback);*/ - MBCS_FROM_UCHAR32_ISO2022(sharedData,sourceChar,&targetByteUnit,useFallback,(int*)&length,MBCS_OUTPUT_2); + MBCS_FROM_UCHAR32_ISO2022(sharedData,sourceChar,&targetByteUnit,useFallback,&length,MBCS_OUTPUT_2); /* only DBCS or SBCS characters are expected*/ - /* DB haracters with high bit set to 1 are expected */ + /* DB characters with high bit set to 1 are expected */ if(length > 2 || length==0 ||(((targetByteUnit & 0x8080) != 0x8080)&& length==2)){ targetByteUnit=missingCharMarker; } @@ -2168,13 +1958,10 @@ UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args /* oops.. the code point is unassingned * set the error and reason */ - reason =UCNV_UNASSIGNED; - *err =U_INVALID_CHAR_FOUND; /*check if the char is a First surrogate*/ if(UTF_IS_SURROGATE(sourceChar)) { if(UTF_IS_SURROGATE_FIRST(sourceChar)) { - args->converter->fromUSurrogateLead=(UChar)sourceChar; getTrail: /*look ahead to find the trail surrogate*/ if(source < sourceLimit) { @@ -2182,38 +1969,32 @@ getTrail: UChar trail=(UChar) *source; if(UTF_IS_SECOND_SURROGATE(trail)) { source++; - sourceChar=UTF16_GET_PAIR_VALUE(args->converter->fromUSurrogateLead, trail); - args->converter->fromUSurrogateLead=0x00; + sourceChar=UTF16_GET_PAIR_VALUE(sourceChar, trail); *err = U_INVALID_CHAR_FOUND; - reason =UCNV_UNASSIGNED; /* convert this surrogate code point */ /* exit this condition tree */ } else { /* this is an unmatched lead code unit (1st surrogate) */ /* callback(illegal) */ - reason=UCNV_ILLEGAL; *err=U_ILLEGAL_CHAR_FOUND; } } else { /* no more input */ *err = U_ZERO_ERROR; - break; } } else { /* this is an unmatched trail code unit (2nd surrogate) */ /* callback(illegal) */ - reason=UCNV_ILLEGAL; *err=U_ILLEGAL_CHAR_FOUND; } + } else { + /* callback(unassigned) for a BMP code point */ + *err = U_INVALID_CHAR_FOUND; } - args->converter->fromUnicodeStatus = (int32_t)isTargetByteDBCS; - /* Call the callback function*/ - fromUnicodeCallback(args,sourceChar,&source,&target,&offsets,reason,err); - isTargetByteDBCS=(UBool)args->converter->fromUnicodeStatus; - if (U_FAILURE (*err)){ - break; - } + args->converter->fromUChar32=sourceChar; + args->converter->fromUnicodeStatus = (int32_t)isTargetByteDBCS; + break; } } /* end if(myTargetIndexconverter->fromUSurrogateLead !=0 && (source == sourceLimit) && args->flush){ - *err = U_TRUNCATED_CHAR_FOUND; - } - /* Reset the state of converter if we consumed - * the source and flush is true + /* + * the end of the input stream and detection of truncated input + * are handled by the framework, but for ISO-2022-KR conversion + * we need to be in ASCII mode at the very end + * + * conditions: + * successful + * not in ASCII mode + * end of input and no truncated input */ - if( (source == sourceLimit) && args->flush){ - setInitialStateFromUnicodeKR(args->converter,converterData); + if( U_SUCCESS(*err) && + isTargetByteDBCS && + args->flush && source>=sourceLimit && args->converter->fromUChar32==0 + ) { + int32_t sourceIndex; + + /* we are switching to ASCII */ + isTargetByteDBCS=FALSE; + + /* get the source index of the last input character */ + /* + * TODO this would be simpler and more reliable if we used a pair + * of sourceIndex/prevSourceIndex like in ucnvmbcs.c + * so that we could simply use the prevSourceIndex here; + * this code gives an incorrect result for the rare case of an unmatched + * trail surrogate that is alone in the last buffer of the text stream + */ + sourceIndex=(int32_t)(source-args->source); + if(sourceIndex>0) { + --sourceIndex; + if( U16_IS_TRAIL(args->source[sourceIndex]) && + (sourceIndex==0 || U16_IS_LEAD(args->source[sourceIndex-1])) + ) { + --sourceIndex; + } + } else { + sourceIndex=-1; + } + + ucnv_fromUWriteBytes( + args->converter, + SHIFT_IN_STR, 1, + (char **)&target, (const char *)targetLimit, + &offsets, sourceIndex, + err); } /*save the state and return */ @@ -2248,113 +2062,153 @@ getTrail: static void UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC_IBM(UConverterToUnicodeArgs *args, UErrorCode* err){ - const char* mySourceLimit; char const* sourceStart; - UConverter* saveThis; - int plane =0; /*dummy variable */ UConverterDataISO2022* myData=(UConverterDataISO2022*)(args->converter->extraInfo); - do{ + UConverterToUnicodeArgs subArgs; + int32_t minArgsSize; + + /* set up the subconverter arguments */ + if(args->sizesize; + } else { + minArgsSize = (int32_t)sizeof(UConverterToUnicodeArgs); + } + + uprv_memcpy(&subArgs, args, minArgsSize); + subArgs.size = (uint16_t)minArgsSize; + subArgs.converter = myData->currentConverter; + + /* remember the original start of the input for offsets */ + sourceStart = args->source; + + if(myData->key != 0) { + /* continue with a partial escape sequence */ + goto escape; + } + + while(U_SUCCESS(*err) && args->source < args->sourceLimit) { /*Find the end of the buffer e.g : Next Escape Seq | end of Buffer*/ - mySourceLimit = getEndOfBuffer_2022(&(args->source), args->sourceLimit, args->flush); - - if (args->converter->mode == UCNV_SO) /*Already doing some conversion*/{ - saveThis = args->converter; - args->offsets = NULL; - args->converter = myData->currentConverter; - _MBCSToUnicodeWithOffsets(args,err); - if(U_FAILURE(*err)){ - uprv_memcpy(saveThis->invalidUCharBuffer, args->converter->invalidUCharBuffer, - args->converter->invalidUCharLength); - saveThis->invalidUCharLength=args->converter->invalidUCharLength; + subArgs.source = args->source; + subArgs.sourceLimit = getEndOfBuffer_2022(&(args->source), args->sourceLimit, args->flush); + if(subArgs.source != subArgs.sourceLimit) { + /* + * get the current partial byte sequence + * + * it needs to be moved between the public and the subconverter + * so that the conversion framework, which only sees the public + * converter, can handle truncated and illegal input etc. + */ + if(args->converter->toULength > 0) { + uprv_memcpy(subArgs.converter->toUBytes, args->converter->toUBytes, args->converter->toULength); + } + subArgs.converter->toULength = args->converter->toULength; + + /* + * Convert up to the end of the input, or to before the next escape character. + * Does not handle conversion extensions because the preToU[] state etc. + * is not copied. + */ + ucnv_MBCSToUnicodeWithOffsets(&subArgs, err); + + if(args->offsets != NULL && sourceStart != args->source) { + /* update offsets to base them on the actual start of the input */ + int32_t *offsets = args->offsets; + UChar *target = args->target; + int32_t delta = (int32_t)(args->source - sourceStart); + while(target < subArgs.target) { + if(*offsets >= 0) { + *offsets += delta; + } + ++offsets; + ++target; + } + } + args->source = subArgs.source; + args->target = subArgs.target; + args->offsets = subArgs.offsets; + + /* copy input/error/overflow buffers */ + if(subArgs.converter->toULength > 0) { + uprv_memcpy(args->converter->toUBytes, subArgs.converter->toUBytes, subArgs.converter->toULength); + } + args->converter->toULength = subArgs.converter->toULength; + + if(*err == U_BUFFER_OVERFLOW_ERROR) { + if(subArgs.converter->UCharErrorBufferLength > 0) { + uprv_memcpy(args->converter->UCharErrorBuffer, subArgs.converter->UCharErrorBuffer, + subArgs.converter->UCharErrorBufferLength); + } + args->converter->UCharErrorBufferLength=subArgs.converter->UCharErrorBufferLength; + subArgs.converter->UCharErrorBufferLength = 0; } - args->converter = saveThis; } - /*-Done with buffer with entire buffer - -Error while converting - */ - if (U_FAILURE(*err) || (args->source == args->sourceLimit)) + if (U_FAILURE(*err) || (args->source == args->sourceLimit)) { return; + } - sourceStart = args->source; +escape: changeState_2022(args->converter, &(args->source), args->sourceLimit, - TRUE, ISO_2022_KR, - &plane, err); - /* args->source = sourceStart; */ - - - }while(args->source < args->sourceLimit); - /* return*/ + } } static void UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, UErrorCode* err){ - char tempBuf[3]; - const char* pBuf; + char tempBuf[2]; const char *mySource = ( char *) args->source; UChar *myTarget = args->target; const char *mySourceLimit = args->sourceLimit; UChar32 targetUniChar = 0x0000; UChar mySourceChar = 0x0000; UConverterDataISO2022* myData; - int plane =0; /*dummy variable */ UConverterSharedData* sharedData ; UBool useFallback; - - if ((args->converter == NULL) || (args->targetLimit < args->target) || (args->sourceLimit < args->source)){ - *err = U_ILLEGAL_ARGUMENT_ERROR; + myData=(UConverterDataISO2022*)(args->converter->extraInfo); + if(myData->version==1){ + UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC_IBM(args,err); return; } + /* initialize state */ - myData=(UConverterDataISO2022*)(args->converter->extraInfo); - sharedData = myData->fromUnicodeConverter->sharedData; + sharedData = myData->currentConverter->sharedData; useFallback = args->converter->useFallback; - if(myData->version==1){ - UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC_IBM(args,err); - return; + if(myData->key != 0) { + /* continue with a partial escape sequence */ + goto escape; + } else if(args->converter->toULength == 1 && mySource < mySourceLimit && myTarget < args->targetLimit) { + /* continue with a partial double-byte character */ + mySourceChar = args->converter->toUBytes[0]; + args->converter->toULength = 0; + goto getTrailByte; } - while(mySource< args->sourceLimit){ - targetUniChar = missingCharMarker; + while(mySource< mySourceLimit){ if(myTarget < args->targetLimit){ mySourceChar= (unsigned char) *mySource++; if(mySourceChar==UCNV_SI){ - myData->currentType = SBCS; + myData->toU2022State.g = 0; /*consume the source */ continue; }else if(mySourceChar==UCNV_SO){ - myData->currentType = DBCS; + myData->toU2022State.g = 1; /*consume the source */ continue; - }else if(mySourceChar==ESC_2022 || myData->key!=0){ - - /* - * Commented out this part to be lenient and allow for - * more escape sequences in ISO-2022-KR byte stream - * - * Already doing some conversion and found escape Sequence - * if(args->converter->mode == UCNV_SO){ - * *err = U_ILLEGAL_ESCAPE_SEQUENCE; - * } - * else{ - * - */ - - mySource--; - changeState_2022(args->converter,&(mySource), - args->sourceLimit, args->flush,ISO_2022_KR,&plane, err); - /*}*/ + }else if(mySourceChar==ESC_2022){ + mySource--; +escape: + changeState_2022(args->converter,&(mySource), + mySourceLimit, ISO_2022_KR, err); if(U_FAILURE(*err)){ args->target = myTarget; args->source = mySource; @@ -2363,40 +2217,39 @@ UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, continue; } - if(myData->currentType==DBCS){ - if(args->converter->toUnicodeStatus == 0x00){ - args->converter->toUnicodeStatus = (UChar) mySourceChar; - continue; - } - else{ - tempBuf[0] = (char) (args->converter->toUnicodeStatus+0x80); - tempBuf[1] = (char) (mySourceChar+0x80); - mySourceChar = (UChar)(mySourceChar + (args->converter->toUnicodeStatus<<8)); - args->converter->toUnicodeStatus =0x00; - pBuf = tempBuf; - targetUniChar = _MBCSSimpleGetNextUChar(sharedData, - &pBuf,(pBuf+2),useFallback); + if(myData->toU2022State.g == 1) { + if(mySource < mySourceLimit) { + char trailByte; +getTrailByte: + trailByte = *mySource++; + tempBuf[0] = (char)(mySourceChar + 0x80); + tempBuf[1] = (char)(trailByte + 0x80); + mySourceChar = (mySourceChar << 8) | (uint8_t)(trailByte); + if((mySourceChar & 0x8080) == 0) { + targetUniChar = ucnv_MBCSSimpleGetNextUChar(sharedData, tempBuf, 2, useFallback); + } else { + /* illegal bytes > 0x7f */ + targetUniChar = missingCharMarker; + } + } else { + args->converter->toUBytes[0] = (uint8_t)mySourceChar; + args->converter->toULength = 1; + break; } } else{ - if(args->converter->fromUnicodeStatus == 0x00){ - targetUniChar = _MBCS_SINGLE_SIMPLE_GET_NEXT_BMP(sharedData, mySourceChar); - - } - + targetUniChar = ucnv_MBCSSimpleGetNextUChar(sharedData, mySource - 1, 1, useFallback); } - if(targetUniChar != missingCharMarker){ - if(args->offsets) - args->offsets[myTarget - args->target]= mySource - args->source - 1-(myData->currentType==DBCS); + if(targetUniChar < 0xfffe){ + if(args->offsets) { + args->offsets[myTarget - args->target]= mySource - args->source - (mySourceChar <= 0xff ? 1 : 2); + } *(myTarget++)=(UChar)targetUniChar; } else { - /* Call the callback function*/ - toUnicodeCallback(args,mySourceChar,&mySource,targetUniChar,&myTarget,err); - if(U_FAILURE(*err)){ - break; - } + toUnicodeCallback(args->converter,mySourceChar,targetUniChar,err); + break; } } else{ @@ -2404,19 +2257,6 @@ UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, break; } } - if((args->flush==TRUE) - && (mySource == mySourceLimit) - && ( args->converter->toUnicodeStatus !=0x00)){ - - *err = U_TRUNCATED_CHAR_FOUND; - args->converter->toUnicodeStatus = 0x00; - } - /* Reset the state of converter if we consumed - * the source and flush is true - */ - if( (mySource == mySourceLimit) && args->flush){ - setInitialStateToUnicodeKR(args->converter,myData); - } args->target = myTarget; args->source = mySource; } @@ -2426,21 +2266,21 @@ UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, /*************************** ISO-2022-CN ********************************* * * Rules for ISO-2022-CN Encoding: -* i) The desinator sequence must appear once on a line before any instance +* i) The designator sequence must appear once on a line before any instance * of character set it designates. * ii) If two lines contain characters from the same character set, both lines * must include the designator sequence. -* iii) Once the designator sequence is know, a shifting sequnce has to be found +* iii) Once the designator sequence is known, a shifting sequence has to be found * to invoke the shifting * iv) All lines start in ASCII and end in ASCII. * v) Four shifting sequences are employed for this purpose: * * Sequcence ASCII Eq Charsets * ---------- ------- --------- -* SS2 N CNS-11643-1992 Planes 3-7 -* SS3 O CNS-11643-1992 Plane 2 -* SI -* SO CNS-11643-1992 Plane 1, GB2312,ISO-IR-165 +* SI US-ASCII +* SO CNS-11643-1992 Plane 1, GB2312, ISO-IR-165 +* SS2 N CNS-11643-1992 Plane 2 +* SS3 O CNS-11643-1992 Planes 3-7 * * vi) * SOdesignator : ESC "$" ")" finalchar_for_SO @@ -2478,7 +2318,7 @@ UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, * is a Chinese character as defined in CNS * 11643-plane-4, until another SS3designation * appears -* (In English: N must preceed every 2 byte +* (In English: O must preceed every 2 byte * sequence.) * * ESC $ + K Indicates the immediate two bytes following SS3 @@ -2503,9 +2343,6 @@ UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, */ /* The following are defined this way to make the strings truely readonly */ -static const char EMPTY_STR[] = ""; -static const char SHIFT_IN_STR[] = "\x0F"; -static const char SHIFT_OUT_STR[] = "\x0E"; static const char GB_2312_80_STR[] = "\x1B\x24\x29\x41"; static const char ISO_IR_165_STR[] = "\x1B\x24\x29\x45"; static const char CNS_11643_1992_Plane_1_STR[] = "\x1B\x24\x29\x47"; @@ -2529,124 +2366,44 @@ static const char* const escSeqCharsCN[10] ={ CNS_11643_1992_Plane_6_STR, CNS_11643_1992_Plane_7_STR }; -static const int escSeqCharsLenCN[10] = { - 1, /* length of escSeq for ASCII */ - 4, /* length of escSeq for GB 2312-80 */ - 4, /* length of escSeq for ISO-IR-165 */ - 4, /* length of escSeq for CNS 11643-1992 Plane 1 */ - 4, /* length of escSeq for CNS 11643-1992 Plane 2 */ - 4, /* length of escSeq for CNS 11643-1992 Plane 3 */ - 4, /* length of escSeq for CNS 11643-1992 Plane 4 */ - 4, /* length of escSeq for CNS 11643-1992 Plane 5 */ - 4, /* length of escSeq for CNS 11643-1992 Plane 6 */ - 4 /* length of escSeq for CNS 11643-1992 Plane 7 */ -}; -static const char* const shiftSeqCharsCN[10] ={ - EMPTY_STR, /* ASCII */ - SHIFT_OUT_STR, /* GB 2312-80 */ - SHIFT_OUT_STR, /* ISO-IR-165 */ - SHIFT_OUT_STR, /* CNS 11643-1992 Plane 1 */ - UCNV_SS2, /* CNS 11643-1992 Plane 2 */ - UCNV_SS3, /* CNS 11643-1992 Plane 3 */ - UCNV_SS3, /* CNS 11643-1992 Plane 4 */ - UCNV_SS3, /* CNS 11643-1992 Plane 5 */ - UCNV_SS3, /* CNS 11643-1992 Plane 6 */ - UCNV_SS3 /* CNS 11643-1992 Plane 7 */ -}; -static const int shiftSeqCharsLenCN[10] ={ - 0, /* length of shiftSeq for ASCII */ - 1, /* length of shiftSeq for GB 2312-80 */ - 1, /* length of shiftSeq for ISO-IR-165 */ - 1, /* length of shiftSeq for CNS 11643-1992 Plane 1 */ - 2, /* length of shiftSeq for CNS 11643-1992 Plane 2 */ - 2, /* length of shiftSeq for CNS 11643-1992 Plane 3 */ - 2, /* length of shiftSeq for CNS 11643-1992 Plane 4 */ - 2, /* length of shiftSeq for CNS 11643-1992 Plane 5 */ - 2, /* length of shiftSeq for CNS 11643-1992 Plane 6 */ - 2 /* length of shiftSeq for CNS 11643-1992 Plane 7 */ -}; - -typedef enum { - ASCII_1=0, - GB2312_1=1, - ISO_IR_165=2, - CNS_11643=3, - INVALID_STATE_CN=-1 -} StateEnumCN; - -static const Cnv2022Type myConverterTypeCN[4]={ - ASCII1, - DBCS, - DBCS, - MBCS -}; - static void UConverter_fromUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args, UErrorCode* err){ UConverterDataISO2022 *converterData; - unsigned char* target = (unsigned char*) args->target; - const unsigned char* targetLimit = (const unsigned char*) args->targetLimit; + ISO2022State *pFromU2022State; + uint8_t *target = (uint8_t *) args->target; + const uint8_t *targetLimit = (const uint8_t *) args->targetLimit; const UChar* source = args->source; const UChar* sourceLimit = args->sourceLimit; int32_t* offsets = args->offsets; - uint32_t targetByteUnit = missingCharMarker; - uint32_t sourceChar =0x0000; - const char* escSeq = NULL; - int len =0; /*length of escSeq chars*/ - uint32_t targetValue=0; - uint8_t planeVal=0; - UConverterCallbackReason reason; - UConverterSharedData* sharedData=NULL; + UChar32 sourceChar; + char buffer[8]; + int32_t len; + int8_t choices[3]; + int32_t choiceCount; + uint32_t targetValue; UBool useFallback; - /* state variables*/ - StateEnumCN* currentState; - StateEnumCN initIterState; - UConverter** currentConverter; - UBool* isShiftAppended; - UBool* isEscapeAppended; - int* plane; - int lPlane=0; - - /* arguments check*/ - if ((args->converter == NULL) || (targetLimit < target) || (sourceLimit < source)){ - *err = U_ILLEGAL_ARGUMENT_ERROR; - return; - } - /* set up the state */ converterData = (UConverterDataISO2022*)args->converter->extraInfo; + pFromU2022State = &converterData->fromU2022State; useFallback = args->converter->useFallback; - currentState = (StateEnumCN*)&converterData->fromUnicodeCurrentState; - initIterState = ASCII_1; - currentConverter = &converterData->fromUnicodeConverter; - isShiftAppended = &converterData->isShiftAppended; - isEscapeAppended = &converterData->isEscapeAppended; - plane = &converterData->plane; - initIterState = *currentState; - *currentConverter = converterData->myConverterArray[(*currentConverter==NULL) ? 0 : (int)*currentState]; - sharedData = (*currentConverter)->sharedData; + + choiceCount = 0; /* check if the last codepoint of previous buffer was a lead surrogate*/ - if(args->converter->fromUSurrogateLead!=0 && target< targetLimit) { + if((sourceChar = args->converter->fromUChar32)!=0 && target< targetLimit) { goto getTrail; } - while( source < sourceLimit){ - - targetByteUnit =missingCharMarker; - lPlane =0; - if(target < targetLimit){ sourceChar = *(source++); /*check if the char is a First surrogate*/ if(UTF_IS_SURROGATE(sourceChar)) { if(UTF_IS_SURROGATE_FIRST(sourceChar)) { - args->converter->fromUSurrogateLead=(UChar)sourceChar; getTrail: /*look ahead to find the trail surrogate*/ if(source < sourceLimit) { @@ -2654,174 +2411,204 @@ getTrail: UChar trail=(UChar) *source; if(UTF_IS_SECOND_SURROGATE(trail)) { source++; - /*(((args->converter->fromUSurrogateLead)<<10L)+(trail)-((0xd800<<10L)+0xdc00-0x10000))*/ - sourceChar=UTF16_GET_PAIR_VALUE(args->converter->fromUSurrogateLead, trail); - args->converter->fromUSurrogateLead=0x00; - /* convert this surrogate code point */ + sourceChar=UTF16_GET_PAIR_VALUE(sourceChar, trail); + args->converter->fromUChar32=0x00; + /* convert this supplementary code point */ /* exit this condition tree */ } else { /* this is an unmatched lead code unit (1st surrogate) */ /* callback(illegal) */ - reason=UCNV_ILLEGAL; *err=U_ILLEGAL_CHAR_FOUND; - goto callback; + args->converter->fromUChar32=sourceChar; + break; } } else { /* no more input */ + args->converter->fromUChar32=sourceChar; break; } } else { /* this is an unmatched trail code unit (2nd surrogate) */ /* callback(illegal) */ - reason=UCNV_ILLEGAL; *err=U_ILLEGAL_CHAR_FOUND; - goto callback; + args->converter->fromUChar32=sourceChar; + break; } } /* do the conversion */ - if(sourceChar < 0x007f ){ - targetByteUnit = sourceChar; - if(*currentState!= ASCII_1){ - *currentState = ASCII_1; - *isEscapeAppended = FALSE; + if(sourceChar <= 0x007f ){ + /* US-ASCII */ + if(pFromU2022State->g == 0) { + buffer[0] = (char)sourceChar; + len = 1; + } else { + buffer[0] = UCNV_SI; + buffer[1] = (char)sourceChar; + len = 2; + pFromU2022State->g = 0; + choiceCount = 0; + } + if(sourceChar == CR || sourceChar == LF) { + /* reset the state at the end of a line */ + uprv_memset(pFromU2022State, 0, sizeof(ISO2022State)); + choiceCount = 0; } - } else{ + /* convert U+0080..U+10ffff */ + UConverterSharedData *cnv; + int32_t i; + int8_t cs, g; + + if(choiceCount == 0) { + /* try the current SO/G1 converter first */ + choices[0] = pFromU2022State->cs[1]; + + /* default to GB2312_1 if none is designated yet */ + if(choices[0] == 0) { + choices[0] = GB2312_1; + } - do{ - if(myConverterTypeCN[*currentState] == MBCS){ - /*len= _MBCSFromUChar32((*currentConverter)->sharedData,sourceChar, - &targetValue,args->converter->useFallback);*/ - MBCS_FROM_UCHAR32_ISO2022(sharedData,sourceChar,&targetValue,useFallback,&len,MBCS_OUTPUT_3); - if(len==3){ - targetByteUnit = (UChar32) targetValue; - planeVal = (uint8_t) ((targetValue)>>16); - if(planeVal >0x80 && planeVal<0x89){ - lPlane = (int)(planeVal - 0x80); - targetByteUnit -= (planeVal<<16); - }else { - lPlane =-1; - targetByteUnit=missingCharMarker; - } - if(converterData->version == 0 && lPlane >2){ - targetByteUnit = missingCharMarker; - } - } - }else if(myConverterTypeCN[*currentState] == DBCS){ - MBCS_FROM_UCHAR32_ISO2022(sharedData,sourceChar,&targetValue,useFallback,&len,MBCS_OUTPUT_2); - if(len==2){ - if(( converterData->version) == 0 && *currentState ==ISO_IR_165){ - targetByteUnit = missingCharMarker; - }else{ - targetByteUnit = (UChar32) targetValue; - } + if(converterData->version == 0) { + /* ISO-2022-CN */ + + /* try the other SO/G1 converter; a CNS_11643_1 lookup may result in any plane */ + if(choices[0] == GB2312_1) { + choices[1] = (int8_t)CNS_11643_1; + } else { + choices[1] = (int8_t)GB2312_1; } - - }else{ - if(sourceChar < 0x7f){ - targetByteUnit = sourceChar; + + choiceCount = 2; + } else { + /* ISO-2022-CN-EXT */ + + /* try one of the other converters */ + switch(choices[0]) { + case GB2312_1: + choices[1] = (int8_t)CNS_11643_1; + choices[2] = (int8_t)ISO_IR_165; + break; + case ISO_IR_165: + choices[1] = (int8_t)GB2312_1; + choices[2] = (int8_t)CNS_11643_1; + break; + default: /* CNS_11643_x */ + choices[1] = (int8_t)GB2312_1; + choices[2] = (int8_t)ISO_IR_165; + break; } - } - if(targetByteUnit==missingCharMarker){ - - *currentState=(StateEnumCN)((*currentState<3)? *currentState+1:0); - *currentConverter =converterData->myConverterArray[(*currentConverter==NULL) ? 0 : (int)*currentState]; - targetByteUnit =missingCharMarker; - *isEscapeAppended = FALSE; - *isShiftAppended = FALSE; - sharedData=(*currentConverter)->sharedData; - } - else - break; - }while(initIterState != *currentState); - } - if(targetByteUnit != missingCharMarker){ - - args->converter->fromUnicodeStatus=(UBool) (*currentState > ASCII_1); - /* Append the escpace sequence */ - if(!*isEscapeAppended ||(*plane != lPlane)){ - int temp =0; - temp =(*currentState==CNS_11643) ? ((int)*currentState+lPlane-1):(int)*currentState ; - escSeq = escSeqCharsCN[temp]; - len =escSeqCharsLenCN[temp]; - CONCAT_ESCAPE_EX(args,source, &target, targetLimit, &offsets, escSeq,len,err); - *plane=lPlane; - *isEscapeAppended=TRUE; - *isShiftAppended=FALSE; + choiceCount = 3; + } } - /* Append Shift Sequences */ - if(*currentState == GB2312_1 || *currentState==ISO_IR_165){ - if(!*isShiftAppended){ - len =shiftSeqCharsLenCN[*currentState]; - escSeq = shiftSeqCharsCN[*currentState]; - CONCAT_ESCAPE_EX(args,source, &target, targetLimit, &offsets, escSeq,len,err); - *isShiftAppended=TRUE; - } - }else if(*currentState!=ASCII1){ - int temp =*currentState+*plane-1; - if(*plane ==1 && *isShiftAppended){ - temp=0; + cs = g = 0; + len = 0; + + for(i = 0; i < choiceCount && len == 0; ++i) { + cs = choices[i]; + if(cs > 0) { + if(cs > CNS_11643_0) { + cnv = converterData->myConverterArray[CNS_11643]; + MBCS_FROM_UCHAR32_ISO2022(cnv,sourceChar,&targetValue,useFallback,&len,MBCS_OUTPUT_3); + if(len==3) { + cs = (int8_t)(CNS_11643_0 + (targetValue >> 16) - 0x80); + len = 2; + if(cs == CNS_11643_1) { + g = 1; + } else if(cs == CNS_11643_2) { + g = 2; + } else /* plane 3..7 */ if(converterData->version == 1) { + g = 3; + } else { + /* ISO-2022-CN (without -EXT) does not support plane 3..7 */ + len = 0; + } + } + } else { + /* GB2312_1 or ISO-IR-165 */ + cnv = converterData->myConverterArray[cs]; + MBCS_FROM_UCHAR32_ISO2022(cnv,sourceChar,&targetValue,useFallback,&len,MBCS_OUTPUT_2); + g = 1; /* used if len == 2 */ + } } - len =shiftSeqCharsLenCN[temp]; - escSeq = shiftSeqCharsCN[temp]; - CONCAT_ESCAPE_EX(args,source, &target, targetLimit, &offsets, escSeq,len,err); - *isShiftAppended=TRUE; } - initIterState = *currentState; + if(len > 0) { + len = 0; /* count output bytes; it must have been len == 2 */ - /* write the targetByteUnit to target */ - if(targetByteUnit <= 0x00FF){ - if( target source-1; + /* write the designation sequence if necessary */ + if(cs != pFromU2022State->cs[g]) { + if(cs < CNS_11643) { + uprv_memcpy(buffer, escSeqCharsCN[cs], 4); + } else { + uprv_memcpy(buffer, escSeqCharsCN[CNS_11643 + (cs - CNS_11643_1)], 4); } - - }else{ - args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = (unsigned char) targetByteUnit; - *err = U_BUFFER_OVERFLOW_ERROR; - } - }else{ - if(target < targetLimit){ - *(target++) =(unsigned char) (targetByteUnit>>8); - if(offsets){ - *(offsets++) = source-args->source-1; + len = 4; + pFromU2022State->cs[g] = cs; + if(g == 1) { + /* changing the SO/G1 charset invalidates the choices[] */ + choiceCount = 0; } - if(target < targetLimit){ - *(target++) =(unsigned char) (targetByteUnit); - if(offsets){ - *(offsets++) = source-args->source-1; - } - }else{ - args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = (unsigned char) (targetByteUnit); - *err = U_BUFFER_OVERFLOW_ERROR; + } + + /* write the shift sequence if necessary */ + if(g != pFromU2022State->g) { + switch(g) { + case 1: + buffer[len++] = UCNV_SO; + + /* set the new state only if it is the locking shift SO/G1, not for SS2 or SS3 */ + pFromU2022State->g = 1; + break; + case 2: + buffer[len++] = 0x1b; + buffer[len++] = 0x4e; + break; + default: /* case 3 */ + buffer[len++] = 0x1b; + buffer[len++] = 0x4f; + break; } - }else{ - args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = (unsigned char) (targetByteUnit>>8); - args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = (unsigned char) (targetByteUnit); - *err = U_BUFFER_OVERFLOW_ERROR; } - } + /* write the two output bytes */ + buffer[len++] = (char)(targetValue >> 8); + buffer[len++] = (char)targetValue; + } else { + /* if we cannot find the character after checking all codepages + * then this is an error + */ + *err = U_INVALID_CHAR_FOUND; + args->converter->fromUChar32=sourceChar; + break; + } } - else{ - /* if we cannot find the character after checking all codepages - * then this is an error - */ - reason = UCNV_UNASSIGNED; - *err = U_INVALID_CHAR_FOUND; -callback: - - fromUnicodeCallback(args,sourceChar,&source,&target,&offsets,reason,err); - initIterState = *currentState; - - if (U_FAILURE (*err)){ + /* output len>0 bytes in buffer[] */ + if(len == 1) { + *target++ = buffer[0]; + if(offsets) { + *offsets++ = source - args->source - 1; /* -1: known to be ASCII */ + } + } else if(len == 2 && (target + 2) <= targetLimit) { + *target++ = buffer[0]; + *target++ = buffer[1]; + if(offsets) { + int32_t sourceIndex = (int32_t)(source - args->source - U16_LENGTH(sourceChar)); + *offsets++ = sourceIndex; + *offsets++ = sourceIndex; + } + } else { + ucnv_fromUWriteBytes( + args->converter, + buffer, len, + (char **)&target, (const char *)targetLimit, + &offsets, (int32_t)(source - args->source - U16_LENGTH(sourceChar)), + err); + if(U_FAILURE(*err)) { break; } } @@ -2833,243 +2620,56 @@ callback: }/* end while(mySourceIndexconverter->fromUSurrogateLead !=0 && (source == sourceLimit) && args->flush){ - *err = U_TRUNCATED_CHAR_FOUND; - } - /* Reset the state of converter if we consumed - * the source and flush is true - */ - if( (source == sourceLimit) && args->flush){ - setInitialStateFromUnicodeJPCN(args->converter,converterData); - } - - /*save the state and return */ - args->source = source; - args->target = (char*)target; -} - -/*************** to unicode *******************/ -static const StateEnumCN nextStateToUnicodeCN[2][MAX_STATES_2022]= { - { -/* 0 1 2 3 4 5 6 7 8 9 */ - INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN - ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN - ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN - ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN - ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,GB2312_1 ,INVALID_STATE_CN ,INVALID_STATE_CN - ,CNS_11643 ,CNS_11643 ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN - ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN - ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN - }, - { -/* 0 1 2 3 4 5 6 7 8 9 */ - INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN - ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN - ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN - ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN - ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,GB2312_1 ,INVALID_STATE_CN ,ISO_IR_165 - ,CNS_11643 ,CNS_11643 ,CNS_11643 ,CNS_11643 ,CNS_11643 ,CNS_11643 ,CNS_11643 ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN - ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN - ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN ,INVALID_STATE_CN - } -}; - -static void -changeState_2022(UConverter* _this, - const char** source, - const char* sourceLimit, - UBool flush,Variant2022 var, - int* plane, - UErrorCode* err){ - UConverter* myUConverter; - UCNV_TableStates_2022 value; - UConverterDataISO2022* myData2022 = ((UConverterDataISO2022*)_this->extraInfo); - uint32_t key = myData2022->key; - const char* chosenConverterName = NULL; - int32_t offset; - - /*In case we were in the process of consuming an escape sequence - we need to reprocess it */ - - do{ - - value = getKey_2022(**source,(int32_t *) &key, &offset); - - switch (value){ - - case VALID_NON_TERMINAL_2022 : - break; - - case VALID_TERMINAL_2022: - { - (*source)++; - chosenConverterName = escSeqStateTable_Result_2022[offset]; - key = 0; - goto DONE; - }; - break; - - case INVALID_2022: - { - myData2022->key = 0; - *err = U_ILLEGAL_ESCAPE_SEQUENCE; - return; - } - case VALID_SS2_SEQUENCE: - /*falls through*/ - - case VALID_SS3_SEQUENCE: - { - (*source)++; - key = 0; - goto DONE; + if( U_SUCCESS(*err) && + pFromU2022State->g!=0 && + args->flush && source>=sourceLimit && args->converter->fromUChar32==0 + ) { + int32_t sourceIndex; + + /* we are switching to ASCII */ + pFromU2022State->g=0; + + /* get the source index of the last input character */ + /* + * TODO this would be simpler and more reliable if we used a pair + * of sourceIndex/prevSourceIndex like in ucnvmbcs.c + * so that we could simply use the prevSourceIndex here; + * this code gives an incorrect result for the rare case of an unmatched + * trail surrogate that is alone in the last buffer of the text stream + */ + sourceIndex=(int32_t)(source-args->source); + if(sourceIndex>0) { + --sourceIndex; + if( U16_IS_TRAIL(args->source[sourceIndex]) && + (sourceIndex==0 || U16_IS_LEAD(args->source[sourceIndex-1])) + ) { + --sourceIndex; } - - case VALID_MAYBE_TERMINAL_2022: - { - const char* mySource = (*source+1); - int32_t myKey = key; - UCNV_TableStates_2022 myValue = value; - int32_t myOffset=0; - if(*mySource==ESC_2022){ - while ((mySource < sourceLimit) && - ((myValue == VALID_MAYBE_TERMINAL_2022)||(myValue == VALID_NON_TERMINAL_2022))){ - myValue = getKey_2022(*(mySource++), &myKey, &myOffset); - } - } - else{ - (*source)++; - myValue=(UCNV_TableStates_2022) 1; - myOffset = 8; - } - - switch (myValue){ - case INVALID_2022: - { - /*Backs off*/ - chosenConverterName = escSeqStateTable_Result_2022[offset]; - value = VALID_TERMINAL_2022; - goto DONE; - }; - break; - - case VALID_TERMINAL_2022: - { - /*uses longer escape sequence*/ - chosenConverterName = escSeqStateTable_Result_2022[myOffset]; - key = 0; - value = VALID_TERMINAL_2022; - goto DONE; - }; - break; - - /* Not expected. Added to make the gcc happy */ - case VALID_SS2_SEQUENCE: - /*falls through*/ - /* Not expected. Added to make the gcc happy */ - case VALID_SS3_SEQUENCE: - { - (*source)++; - key = 0; - goto DONE; - } - - case VALID_NON_TERMINAL_2022: - /*falls through*/ - case VALID_MAYBE_TERMINAL_2022: - { - if (flush){ - /*Backs off*/ - chosenConverterName = escSeqStateTable_Result_2022[offset]; - value = VALID_TERMINAL_2022; - key = 0; - goto DONE; - } - else{ - key = myKey; - value = VALID_NON_TERMINAL_2022; - } - }; - break; - }; - break; - }; - break; + } else { + sourceIndex=-1; } - }while (++(*source) < sourceLimit); - -DONE: - myData2022->key = key; - if(offset<57 && offset>49){ - *plane = offset-49; - } - if ((value == VALID_NON_TERMINAL_2022) || (value == VALID_MAYBE_TERMINAL_2022)) { - return; + ucnv_fromUWriteBytes( + args->converter, + SHIFT_IN_STR, 1, + (char **)&target, (const char *)targetLimit, + &offsets, sourceIndex, + err); } - else if (value != INVALID_2022 ) { - if(value==3 || value==4 ){ - _this->mode = UCNV_SI; - myUConverter =myData2022->currentConverter; - } - else{ - switch(var){ - case ISO_2022: - _this->mode = UCNV_SI; - ucnv_close(myData2022->currentConverter); - myData2022->currentConverter = myUConverter = ucnv_open(chosenConverterName, err); - break; - case ISO_2022_JP: - { - StateEnum tempState=nextStateToUnicodeJP[myData2022->version][offset]; - _this->mode = UCNV_SI; - myData2022->currentConverter = myUConverter = - (tempState!=INVALID_STATE)? myData2022->myConverterArray[tempState]:NULL; - myData2022->toUnicodeCurrentState = tempState; - *err= (tempState==INVALID_STATE)?U_ILLEGAL_ESCAPE_SEQUENCE :U_ZERO_ERROR; - } - break; - case ISO_2022_CN: - { - StateEnumCN tempState=nextStateToUnicodeCN[myData2022->version][offset]; - _this->mode = UCNV_SI; - myData2022->currentConverter = myUConverter = - (tempState!=INVALID_STATE)? myData2022->myConverterArray[tempState]:NULL; - myData2022->toUnicodeCurrentState =(StateEnum) tempState; - *err= (tempState==INVALID_STATE)?U_ILLEGAL_ESCAPE_SEQUENCE :U_ZERO_ERROR; - } - break; - case ISO_2022_KR: - if(offset==0x30){ - _this->mode = UCNV_SI; - myUConverter = myData2022->currentConverter=myData2022->fromUnicodeConverter; - break; - } - default: - myUConverter=NULL; - *err = U_ILLEGAL_ESCAPE_SEQUENCE; - } - } - if (U_SUCCESS(*err)){ - /*Customize the converter with the attributes set on the 2022 converter*/ - myUConverter->fromUCharErrorBehaviour = _this->fromUCharErrorBehaviour; - myUConverter->fromUContext = _this->fromUContext; - myUConverter->fromCharErrorBehaviour = _this->fromCharErrorBehaviour; - myUConverter->toUContext = _this->toUContext; - - uprv_memcpy(myUConverter->subChar, - _this->subChar, - myUConverter->subCharLen = _this->subCharLen); - myUConverter->subChar1 = 0; - - _this->mode = UCNV_SO; - } - } + /*save the state and return */ + args->source = source; + args->target = (char*)target; } @@ -3077,24 +2677,28 @@ static void UConverter_toUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, UErrorCode* err){ char tempBuf[3]; - int plane=0; - const char* pBuf; - const char *mySource = ( char *) args->source; + const char *mySource = (char *) args->source; UChar *myTarget = args->target; - char *tempLimit = &tempBuf[3]; const char *mySourceLimit = args->sourceLimit; uint32_t targetUniChar = 0x0000; uint32_t mySourceChar = 0x0000; UConverterDataISO2022* myData; + ISO2022State *pToU2022State; - if ((args->converter == NULL) || (args->targetLimit < myTarget) || (args->sourceLimit < mySource)){ - *err = U_ILLEGAL_ARGUMENT_ERROR; - return; + myData=(UConverterDataISO2022*)(args->converter->extraInfo); + pToU2022State = &myData->toU2022State; + + if(myData->key != 0) { + /* continue with a partial escape sequence */ + goto escape; + } else if(args->converter->toULength == 1 && mySource < mySourceLimit && myTarget < args->targetLimit) { + /* continue with a partial double-byte character */ + mySourceChar = args->converter->toUBytes[0]; + args->converter->toULength = 0; + goto getTrailByte; } - - myData=(UConverterDataISO2022*)(args->converter->extraInfo); - plane=myData->plane; - while(mySource< args->sourceLimit){ + + while(mySource < mySourceLimit){ targetUniChar =missingCharMarker; @@ -3102,87 +2706,25 @@ UConverter_toUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, mySourceChar= (unsigned char) *mySource++; - switch(mySourceChar){ case UCNV_SI: - if(args->converter->toUnicodeStatus != 0x00){ - break; - } - myData->currentType = ASCII1; - myData->plane=plane = 0; + pToU2022State->g=0; continue; case UCNV_SO: - if(args->converter->toUnicodeStatus != 0x00){ + if(pToU2022State->cs[1] != 0) { + pToU2022State->g=1; + continue; + } else { + /* illegal to have SO before a matching designator */ break; } - myData->currentType = MBCS; - continue; - - case CR: - /*falls through*/ - case LF: - if(args->converter->toUnicodeStatus != 0x00){ - break; - } - myData->currentType = ASCII1; - myData->plane=plane = 0; - /* falls through */ - default: - /* if we are in the middle of consuming an escape sequence - * we fall through else we process the input - */ - if(myData->key==0){ - if(myData->currentType != ASCII1){ - if(args->converter->toUnicodeStatus == 0x00){ - args->converter->toUnicodeStatus = (UChar) mySourceChar; - continue; - } - else{ - if(plane >0){ - tempBuf[0] = (char) (0x80+plane); - tempBuf[1] = (char) (args->converter->toUnicodeStatus); - tempBuf[2] = (char) (mySourceChar); - tempLimit = &tempBuf[2]+1; - - }else{ - tempBuf[0] = (char) args->converter->toUnicodeStatus; - tempBuf[1] = (char) mySourceChar; - tempLimit = &tempBuf[2]; - } - mySourceChar+= (uint32_t) args->converter->toUnicodeStatus<<8; - args->converter->toUnicodeStatus = 0; - pBuf = tempBuf; - if(myData->currentConverter!=NULL){ - targetUniChar = _MBCSSimpleGetNextUChar(myData->currentConverter->sharedData, &pBuf, tempLimit, FALSE); - }else{ - *err=U_INVALID_CHAR_FOUND; - break; - } - } - } - else{ - if(args->converter->toUnicodeStatus == 0x00 && mySourceChar < 0x7f){ - targetUniChar = (UChar) mySourceChar; - } - } - break; - } case ESC_2022: - if(args->converter->toUnicodeStatus != 0x00){ - break; - } mySource--; +escape: changeState_2022(args->converter,&(mySource), - args->sourceLimit, args->flush,ISO_2022_CN,&plane,err); - - myData->plane=plane; - if(plane>0){ - myData->currentType = MBCS; - }else{ - myData->currentType=DBCS; - } + mySourceLimit, ISO_2022_CN,err); /* invalid or illegal escape sequence */ if(U_FAILURE(*err)){ @@ -3192,28 +2734,76 @@ UConverter_toUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, } continue; + /* ISO-2022-CN does not use single-byte (C1) SS2 and SS3 */ + + case CR: + /*falls through*/ + case LF: + uprv_memset(pToU2022State, 0, sizeof(ISO2022State)); + /* falls through */ + default: + /* convert one or two bytes */ + if(pToU2022State->g != 0) { + if(mySource < mySourceLimit) { + UConverterSharedData *cnv; + StateEnum tempState; + int32_t tempBufLen; + char trailByte; +getTrailByte: + trailByte = *mySource++; + tempState = (StateEnum)pToU2022State->cs[pToU2022State->g]; + if(tempState > CNS_11643_0) { + cnv = myData->myConverterArray[CNS_11643]; + tempBuf[0] = (char) (0x80+(tempState-CNS_11643_0)); + tempBuf[1] = (char) (mySourceChar); + tempBuf[2] = trailByte; + tempBufLen = 3; + + }else{ + cnv = myData->myConverterArray[tempState]; + tempBuf[0] = (char) (mySourceChar); + tempBuf[1] = trailByte; + tempBufLen = 2; + } + mySourceChar = (mySourceChar << 8) | (uint8_t)(trailByte); + if(pToU2022State->g>=2) { + /* return from a single-shift state to the previous one */ + pToU2022State->g=pToU2022State->prevG; + } + targetUniChar = ucnv_MBCSSimpleGetNextUChar(cnv, tempBuf, tempBufLen, FALSE); + } else { + args->converter->toUBytes[0] = (uint8_t)mySourceChar; + args->converter->toULength = 1; + goto endloop; + } + } + else{ + if(mySourceChar <= 0x7f) { + targetUniChar = (UChar) mySourceChar; + } + } + break; } if(targetUniChar < (missingCharMarker-1/*0xfffe*/)){ if(args->offsets){ - args->offsets[myTarget - args->target]= mySource - args->source - 2 - +(myData->currentType==ASCII); + args->offsets[myTarget - args->target]= mySource - args->source - (mySourceChar <= 0xff ? 1 : 2); } *(myTarget++)=(UChar)targetUniChar; } else if(targetUniChar > missingCharMarker){ /* disassemble the surrogate pair and write to output*/ targetUniChar-=0x0010000; - *(myTarget++) = (UChar)(0xd800+(UChar)(targetUniChar>>10)); + *myTarget = (UChar)(0xd800+(UChar)(targetUniChar>>10)); if(args->offsets){ - args->offsets[myTarget - args->target]= mySource - args->source - 2 - +(myData->currentType==ASCII); + args->offsets[myTarget - args->target]= mySource - args->source - (mySourceChar <= 0xff ? 1 : 2); } + ++myTarget; if(myTarget< args->targetLimit){ - *(myTarget)++ = (UChar)(0xdc00+(UChar)(targetUniChar&0x3ff)); + *myTarget = (UChar)(0xdc00+(UChar)(targetUniChar&0x3ff)); if(args->offsets){ - args->offsets[myTarget - args->target]= mySource - args->source - 2 - +(myData->currentType==ASCII); + args->offsets[myTarget - args->target]= mySource - args->source - (mySourceChar <= 0xff ? 1 : 2); } + ++myTarget; }else{ args->converter->UCharErrorBuffer[args->converter->UCharErrorBufferLength++]= (UChar)(0xdc00+(UChar)(targetUniChar&0x3ff)); @@ -3222,11 +2812,8 @@ UConverter_toUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, } else{ /* Call the callback function*/ - toUnicodeCallback(args,mySourceChar,&mySource,targetUniChar,&myTarget,err); - /*args->offsets = saveOffsets;*/ - if(U_FAILURE(*err)) - break; - + toUnicodeCallback(args->converter,mySourceChar,targetUniChar,err); + break; } } else{ @@ -3234,19 +2821,7 @@ UConverter_toUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, break; } } - if((args->flush==TRUE) - && (mySource == mySourceLimit) - && ( args->converter->toUnicodeStatus !=0x00)){ - - *err = U_TRUNCATED_CHAR_FOUND; - args->converter->toUnicodeStatus = 0x00; - } - /* Reset the state of converter if we consumed - * the source and flush is true - */ - if( (mySource == mySourceLimit) && args->flush){ - setInitialStateToUnicodeJPCN(args->converter,myData); - } +endloop: args->target = myTarget; args->source = mySource; } @@ -3255,38 +2830,88 @@ static void _ISO_2022_WriteSub(UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorCode *err) { UConverter *cnv = args->converter; UConverterDataISO2022 *myConverterData=(UConverterDataISO2022 *) cnv->extraInfo; - char *p; - char buffer[4]; + ISO2022State *pFromU2022State=&myConverterData->fromU2022State; + char *p, *subchar; + char buffer[8]; + int32_t length; + + subchar=(char *)cnv->subChar; + length=cnv->subCharLen; /* assume length==1 for most variants */ p = buffer; switch(myConverterData->locale[0]){ case 'j': - if(myConverterData->fromUnicodeCurrentState!= ASCII){ - myConverterData->fromUnicodeCurrentState= ASCII; - myConverterData->currentType = (Cnv2022Type) myConverterType[myConverterData->fromUnicodeCurrentState]; + { + int8_t cs; + + if(pFromU2022State->g == 1) { + /* JIS7: switch from G1 to G0 */ + pFromU2022State->g = 0; + *p++ = UCNV_SI; + } + + cs = pFromU2022State->cs[0]; + if(cs != ASCII && cs != JISX201) { + /* not in ASCII or JIS X 0201: switch to ASCII */ + pFromU2022State->cs[0] = (int8_t)ASCII; *p++ = '\x1b'; *p++ = '\x28'; *p++ = '\x42'; - } - *p++ = cnv->subChar[0]; + + *p++ = subchar[0]; break; + } case 'c': - if(args->converter->fromUnicodeStatus) { - /* DBCS mode and SBCS sub char: change to SBCS */ - myConverterData->fromUnicodeCurrentState=ASCII; - *p++ = UCNV_SI; - } - *p++ = cnv->subChar[0]; + if(pFromU2022State->g != 0) { + /* not in ASCII mode: switch to ASCII */ + pFromU2022State->g = 0; + *p++ = UCNV_SI; + } + *p++ = subchar[0]; break; case 'k': - if(args->converter->fromUnicodeStatus){ - args->converter->fromUnicodeStatus=0x00; - *p++= UCNV_SI; + if(myConverterData->version == 0) { + if(length == 1) { + if((UBool)args->converter->fromUnicodeStatus) { + /* in DBCS mode: switch to SBCS */ + args->converter->fromUnicodeStatus = 0; + *p++ = UCNV_SI; + } + *p++ = subchar[0]; + } else /* length == 2*/ { + if(!(UBool)args->converter->fromUnicodeStatus) { + /* in SBCS mode: switch to DBCS */ + args->converter->fromUnicodeStatus = 1; + *p++ = UCNV_SO; + } + *p++ = subchar[0]; + *p++ = subchar[1]; + } + break; + } else { + /* let the subconverter write the subchar */ + args->converter = myConverterData->currentConverter; + uprv_memcpy(myConverterData->currentConverter->subChar, subchar, 4); + myConverterData->currentConverter->subCharLen = (int8_t)length; + + myConverterData->currentConverter->fromUChar32 = cnv->fromUChar32; + ucnv_cbFromUWriteSub(args, 0, err); + cnv->fromUChar32 = myConverterData->currentConverter->fromUChar32; + + if(*err == U_BUFFER_OVERFLOW_ERROR) { + if(myConverterData->currentConverter->charErrorBufferLength > 0) { + uprv_memcpy( + cnv->charErrorBuffer, + myConverterData->currentConverter->charErrorBuffer, + myConverterData->currentConverter->charErrorBufferLength); + } + cnv->charErrorBufferLength = myConverterData->currentConverter->charErrorBufferLength; + myConverterData->currentConverter->charErrorBufferLength = 0; + } + args->converter = cnv; + return; } - - *p++ = cnv->subChar[0]; - default: /* not expected */ break; @@ -3301,9 +2926,7 @@ struct cloneStruct { UConverter cnv; UConverterDataISO2022 mydata; - UConverter currentCnv; /**< for ISO_2022 converter if the current converter is open */ - - UConverter clonedConverters[1]; /* Actually a variable sized array for all of the sub converters to be cloned. */ + UConverter currentConverter; }; @@ -3315,145 +2938,329 @@ _ISO_2022_SafeClone( UErrorCode *status) { struct cloneStruct * localClone; - int32_t bufferSizeNeeded = sizeof(struct cloneStruct); - UConverterDataISO2022* cnvData = (UConverterDataISO2022*)cnv->extraInfo; - int32_t i; - int32_t sizes[UCNV_2022_MAX_CONVERTERS]; - int32_t numConverters = 0; - int32_t currentConverterIndex = -1; - int32_t fromUnicodeConverterIndex = -1; - int32_t currentConverterSize = 0; - char *ptr; /* buffer pointer */ - - if (U_FAILURE(*status)) { - return 0; - } - - for(i=0;(imyConverterArray[i];i++) { - int32_t size; - - size = 0; - ucnv_safeClone(cnvData->myConverterArray[i], NULL, &size, status); - bufferSizeNeeded += size; - sizes[i] = size; - numConverters++; - - if(cnvData->currentConverter == cnvData->myConverterArray[i]) { - currentConverterIndex = i; - } - - if(cnvData->fromUnicodeConverter == cnvData->myConverterArray[i]) { - fromUnicodeConverterIndex = i; - } - } - - if(currentConverterIndex == -1) { /* -1 means - not found in array. Clone separately */ - currentConverterSize = 0; - if(cnvData->currentConverter) { - ucnv_safeClone(cnvData->currentConverter, NULL, ¤tConverterSize, status); - bufferSizeNeeded += currentConverterSize; - } - } - - for(;iextraInfo; localClone = (struct cloneStruct *)stackBuffer; - uprv_memcpy(&localClone->cnv, cnv, sizeof(UConverter)); - uprv_memcpy(&localClone->mydata, cnv->extraInfo, sizeof(UConverterDataISO2022)); + /* ucnv.c/ucnv_safeClone() copied the main UConverter already */ - /* clone back sub cnvs */ + uprv_memcpy(&localClone->mydata, cnvData, sizeof(UConverterDataISO2022)); - ptr = (char*)&localClone->clonedConverters; - for(i=0;imydata.myConverterArray[i] = ucnv_safeClone(cnvData->myConverterArray[i], (UConverter*)ptr, &size, status); - ptr += size; - } - for(;imydata.myConverterArray[i] = NULL; - } + /* share the subconverters */ - if(currentConverterIndex == -1) { /* -1 = not found in list */ - /* KR version 1 also uses the state in currentConverter for preserving state - * so we need to clone it too! - */ - if(cnvData->currentConverter) { - localClone->mydata.currentConverter = ucnv_safeClone(cnvData->currentConverter, ptr, ¤tConverterSize, status); - ptr += currentConverterSize; - } else { - localClone->mydata.currentConverter = NULL; + if(cnvData->currentConverter != NULL) { + size = (int32_t)sizeof(UConverter); + localClone->mydata.currentConverter = + ucnv_safeClone(cnvData->currentConverter, + &localClone->currentConverter, + &size, status); + if(U_FAILURE(*status)) { + return NULL; } - } else { - localClone->mydata.currentConverter = localClone->mydata.myConverterArray[currentConverterIndex]; } - if(fromUnicodeConverterIndex != -1) { - /* fromUnicodeConverter is in the list */ - localClone->mydata.fromUnicodeConverter = localClone->mydata.myConverterArray[fromUnicodeConverterIndex]; - } else if(cnvData->currentConverter == cnvData->fromUnicodeConverter) { - /* fromUnicodeConverter is the same as currentConverter */ - localClone->mydata.fromUnicodeConverter = localClone->mydata.currentConverter; - } else { - /* fromUnicodeConverter is NULL */ - localClone->mydata.fromUnicodeConverter = NULL; + for(i=0; imyConverterArray[i] != NULL) { + ucnv_incrementRefCount(cnvData->myConverterArray[i]); + } } localClone->cnv.extraInfo = &localClone->mydata; /* set pointer to extra data */ - + localClone->cnv.isExtraLocal = TRUE; return &localClone->cnv; } static void _ISO_2022_GetUnicodeSet(const UConverter *cnv, - USet *set, + USetAdder *sa, UConverterUnicodeSet which, UErrorCode *pErrorCode) { int32_t i; - USet *cnvSet; UConverterDataISO2022* cnvData; if (U_FAILURE(*pErrorCode)) { return; } +#ifdef U_ENABLE_GENERIC_ISO_2022 if (cnv->sharedData == &_ISO2022Data) { /* We use UTF-8 in this case */ - uset_addRange(set, 0, 0xd7FF); - uset_addRange(set, 0xE000, 0x10FFFF); + sa->addRange(sa->set, 0, 0xd7FF); + sa->addRange(sa->set, 0xE000, 0x10FFFF); return; } +#endif cnvData = (UConverterDataISO2022*)cnv->extraInfo; - if (cnv->sharedData == &_ISO2022KRData && cnvData->currentConverter != NULL) { - ucnv_getUnicodeSet(cnvData->currentConverter, set, which, pErrorCode); - return; - } - cnvSet = uset_open(0, 0); - if (!cnvSet) { - *pErrorCode =U_MEMORY_ALLOCATION_ERROR; + /* open a set and initialize it with code points that are algorithmically round-tripped */ + switch(cnvData->locale[0]){ + case 'j': + if(jpCharsetMasks[cnvData->version]&CSM(ISO8859_1)) { + /* include Latin-1 for some variants of JP */ + sa->addRange(sa->set, 0, 0xff); + } else { + /* include ASCII for JP */ + sa->addRange(sa->set, 0, 0x7f); + } + if(jpCharsetMasks[cnvData->version]&CSM(HWKANA_7BIT)) { + /* include half-width Katakana for JP */ + sa->addRange(sa->set, 0xff61, 0xff9f); + } + break; + case 'c': + case 'z': + /* include ASCII for CN */ + sa->addRange(sa->set, 0, 0x7f); + break; + case 'k': + /* there is only one converter for KR, and it is not in the myConverterArray[] */ + cnvData->currentConverter->sharedData->impl->getUnicodeSet( + cnvData->currentConverter, sa, which, pErrorCode); return; + default: + break; } - for (i=0; (imyConverterArray[i]; i++) { - ucnv_getUnicodeSet(cnvData->myConverterArray[i], cnvSet, which, pErrorCode); - uset_addAll(set, cnvSet /* pErrorCode */); + /* + * TODO: need to make this version-specific for CN. + * CN version 0 does not map CNS planes 3..7 although + * they are all available in the CNS conversion table; + * CN version 1 does map them all. + * The two versions need to create different Unicode sets. + */ + for (i=0; imyConverterArray[i]!=NULL) { + if( (cnvData->locale[0]=='c' || cnvData->locale[0]=='z') && + cnvData->version==0 && i==CNS_11643 + ) { + /* special handling for non-EXT ISO-2022-CN: add only code points for CNS planes 1 and 2 */ + ucnv_MBCSGetUnicodeSetForBytes( + cnvData->myConverterArray[i], + sa, UCNV_ROUNDTRIP_SET, + 0, 0x81, 0x82, + pErrorCode); + } else { + ucnv_MBCSGetUnicodeSetForUnicode(cnvData->myConverterArray[i], sa, which, pErrorCode); + } + } } - uset_close(cnvSet); } +static const UConverterImpl _ISO2022Impl={ + UCNV_ISO_2022, + + NULL, + NULL, + + _ISO2022Open, + _ISO2022Close, + _ISO2022Reset, + +#ifdef U_ENABLE_GENERIC_ISO_2022 + T_UConverter_toUnicode_ISO_2022_OFFSETS_LOGIC, + T_UConverter_toUnicode_ISO_2022_OFFSETS_LOGIC, + ucnv_fromUnicode_UTF8, + ucnv_fromUnicode_UTF8_OFFSETS_LOGIC, +#else + NULL, + NULL, + NULL, + NULL, +#endif + NULL, + + NULL, + _ISO2022getName, + _ISO_2022_WriteSub, + _ISO_2022_SafeClone, + _ISO_2022_GetUnicodeSet +}; +static const UConverterStaticData _ISO2022StaticData={ + sizeof(UConverterStaticData), + "ISO_2022", + 2022, + UCNV_IBM, + UCNV_ISO_2022, + 1, + 3, /* max 3 bytes per UChar from UTF-8 (4 bytes from surrogate _pair_) */ + { 0x1a, 0, 0, 0 }, + 1, + FALSE, + FALSE, + 0, + 0, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ +}; +const UConverterSharedData _ISO2022Data={ + sizeof(UConverterSharedData), + ~((uint32_t) 0), + NULL, + NULL, + &_ISO2022StaticData, + FALSE, + &_ISO2022Impl, + 0 +}; + +/*************JP****************/ +static const UConverterImpl _ISO2022JPImpl={ + UCNV_ISO_2022, + + NULL, + NULL, + + _ISO2022Open, + _ISO2022Close, + _ISO2022Reset, + + UConverter_toUnicode_ISO_2022_JP_OFFSETS_LOGIC, + UConverter_toUnicode_ISO_2022_JP_OFFSETS_LOGIC, + UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC, + UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC, + NULL, + + NULL, + _ISO2022getName, + _ISO_2022_WriteSub, + _ISO_2022_SafeClone, + _ISO_2022_GetUnicodeSet +}; +static const UConverterStaticData _ISO2022JPStaticData={ + sizeof(UConverterStaticData), + "ISO_2022_JP", + 0, + UCNV_IBM, + UCNV_ISO_2022, + 1, + 6, /* max 6 bytes per UChar: 4-byte escape sequence + DBCS */ + { 0x1a, 0, 0, 0 }, + 1, + FALSE, + FALSE, + 0, + 0, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ +}; +static const UConverterSharedData _ISO2022JPData={ + sizeof(UConverterSharedData), + ~((uint32_t) 0), + NULL, + NULL, + &_ISO2022JPStaticData, + FALSE, + &_ISO2022JPImpl, + 0 +}; + +/************* KR ***************/ +static const UConverterImpl _ISO2022KRImpl={ + UCNV_ISO_2022, + + NULL, + NULL, + + _ISO2022Open, + _ISO2022Close, + _ISO2022Reset, + + UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC, + UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC, + UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC, + UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC, + NULL, + + NULL, + _ISO2022getName, + _ISO_2022_WriteSub, + _ISO_2022_SafeClone, + _ISO_2022_GetUnicodeSet +}; +static const UConverterStaticData _ISO2022KRStaticData={ + sizeof(UConverterStaticData), + "ISO_2022_KR", + 0, + UCNV_IBM, + UCNV_ISO_2022, + 1, + 3, /* max 3 bytes per UChar: SO+DBCS */ + { 0x1a, 0, 0, 0 }, + 1, + FALSE, + FALSE, + 0, + 0, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ +}; +static const UConverterSharedData _ISO2022KRData={ + sizeof(UConverterSharedData), + ~((uint32_t) 0), + NULL, + NULL, + &_ISO2022KRStaticData, + FALSE, + &_ISO2022KRImpl, + 0 +}; + +/*************** CN ***************/ +static const UConverterImpl _ISO2022CNImpl={ + + UCNV_ISO_2022, + + NULL, + NULL, + + _ISO2022Open, + _ISO2022Close, + _ISO2022Reset, + + UConverter_toUnicode_ISO_2022_CN_OFFSETS_LOGIC, + UConverter_toUnicode_ISO_2022_CN_OFFSETS_LOGIC, + UConverter_fromUnicode_ISO_2022_CN_OFFSETS_LOGIC, + UConverter_fromUnicode_ISO_2022_CN_OFFSETS_LOGIC, + NULL, + + NULL, + _ISO2022getName, + _ISO_2022_WriteSub, + _ISO_2022_SafeClone, + _ISO_2022_GetUnicodeSet +}; +static const UConverterStaticData _ISO2022CNStaticData={ + sizeof(UConverterStaticData), + "ISO_2022_CN", + 0, + UCNV_IBM, + UCNV_ISO_2022, + 2, + 8, /* max 8 bytes per UChar: 4-byte CNS designator + 2 bytes for SS2/SS3 + DBCS */ + { 0x1a, 0, 0, 0 }, + 1, + FALSE, + FALSE, + 0, + 0, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ +}; +static const UConverterSharedData _ISO2022CNData={ + sizeof(UConverterSharedData), + ~((uint32_t) 0), + NULL, + NULL, + &_ISO2022CNStaticData, + FALSE, + &_ISO2022CNImpl, + 0 +}; + + + #endif /* #if !UCONFIG_NO_LEGACY_CONVERSION */ diff --git a/icuSources/common/ucnv_bld.c b/icuSources/common/ucnv_bld.c index cd59fa36..f9f99c9b 100644 --- a/icuSources/common/ucnv_bld.c +++ b/icuSources/common/ucnv_bld.c @@ -1,7 +1,7 @@ /* ******************************************************************** - * COPYRIGHT: - * Copyright (c) 1996-2003, International Business Machines Corporation and + * COPYRIGHT: + * Copyright (c) 1996-2004, International Business Machines Corporation and * others. All Rights Reserved. ******************************************************************** * @@ -12,20 +12,25 @@ * uses uconv_io.h routines to access disk information * is used by ucnv.h to implement public API create/delete/flushCache routines * Modification History: - * + * * Date Name Description - * + * * 06/20/2000 helena OS/400 port changes; mostly typecast. * 06/29/2000 helena Major rewrite of the callback interface. */ +#include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION #include "unicode/udata.h" #include "unicode/ucnv.h" -#include "unicode/ucnv_err.h" #include "unicode/uloc.h" +#include "utracimp.h" #include "ucnv_io.h" #include "ucnv_bld.h" +#include "ucnvmbcs.h" +#include "ucnv_ext.h" #include "ucnv_cnv.h" #include "ucnv_imp.h" #include "uhash.h" @@ -33,7 +38,7 @@ #include "cstring.h" #include "cmemory.h" #include "ucln_cmn.h" -#include "ustr_imp.h" +#include "ustr_cnv.h" @@ -95,7 +100,9 @@ static struct { { "cesu8", UCNV_CESU8 }, #if !UCONFIG_NO_LEGACY_CONVERSION { "hz",UCNV_HZ }, +#endif { "imapmailboxname", UCNV_IMAP_MAILBOX }, +#if !UCONFIG_NO_LEGACY_CONVERSION { "iscii", UCNV_ISCII }, { "iso2022", UCNV_ISO_2022 }, #endif @@ -154,7 +161,7 @@ static const char DATA_TYPE[] = "cnv"; /* by open converters. */ /* Not thread safe. */ /* Not supported API. Marked U_CAPI only for use by test programs. */ -U_CFUNC UBool U_EXPORT2 ucnv_cleanup(void) { +static UBool U_CALLCONV ucnv_cleanup(void) { if (SHARED_DATA_HASHTABLE != NULL) { ucnv_flushCache(); if (SHARED_DATA_HASHTABLE != NULL && uhash_count(SHARED_DATA_HASHTABLE) == 0) { @@ -169,10 +176,6 @@ U_CFUNC UBool U_EXPORT2 ucnv_cleanup(void) { return (SHARED_DATA_HASHTABLE == NULL); } -U_CFUNC void ucnv_init(UErrorCode *status) { - umtx_init(&cnvCacheMutex); -} - static UBool U_CALLCONV isCnvAcceptable(void *context, const char *type, const char *name, @@ -193,7 +196,7 @@ isCnvAcceptable(void *context, * Un flatten shared data from a UDATA.. */ static UConverterSharedData* -ucnv_data_unFlattenClone(UDataMemory *pData, UErrorCode *status) +ucnv_data_unFlattenClone(UConverterLoadArgs *pArgs, UDataMemory *pData, UErrorCode *status) { /* UDataInfo info; -- necessary only if some converters have different formatVersion */ const uint8_t *raw = (const uint8_t *)udata_getMemory(pData); @@ -222,12 +225,16 @@ ucnv_data_unFlattenClone(UDataMemory *pData, UErrorCode *status) /* copy initial values from the static structure for this type */ uprv_memcpy(data, converterData[type], sizeof(UConverterSharedData)); +#if 0 /* made UConverterMBCSTable part of UConverterSharedData -- markus 20031107 */ /* * It would be much more efficient if the table were a direct member, not a pointer. * However, that would add to the size of all UConverterSharedData objects * even if they do not use this table (especially algorithmic ones). * If this changes, then the static templates from converterData[type] * need more entries. + * + * In principle, it would be cleaner if the load() function below + * allocated the table. */ data->table = (UConverterTable *)uprv_malloc(sizeof(UConverterTable)); if(data->table == NULL) { @@ -236,16 +243,17 @@ ucnv_data_unFlattenClone(UDataMemory *pData, UErrorCode *status) return NULL; } uprv_memset(data->table, 0, sizeof(UConverterTable)); - +#endif + data->staticData = source; - + data->sharedDataCached = FALSE; /* fill in fields from the loaded data */ data->dataMemory = (void*)pData; /* for future use */ if(data->impl->load != NULL) { - data->impl->load(data, raw + source->structSize, status); + data->impl->load(data, pArgs, raw + source->structSize, status); if(U_FAILURE(*status)) { uprv_free(data->table); uprv_free(data); @@ -259,32 +267,47 @@ ucnv_data_unFlattenClone(UDataMemory *pData, UErrorCode *status) *goes to disk and opens it. *allocates the memory and returns a new UConverter object */ -static UConverterSharedData *createConverterFromFile(const char* pkg, const char *fileName, UErrorCode * err) +static UConverterSharedData *createConverterFromFile(UConverterLoadArgs *pArgs, UErrorCode * err) { UDataMemory *data; UConverterSharedData *sharedData; + UTRACE_ENTRY_OC(UTRACE_UCNV_LOAD); + if (err == NULL || U_FAILURE (*err)) { + UTRACE_EXIT_STATUS(*err); return NULL; } - data = udata_openChoice(pkg, DATA_TYPE, fileName, isCnvAcceptable, NULL, err); + UTRACE_DATA2(UTRACE_OPEN_CLOSE, "load converter %s from package %s", pArgs->name, pArgs->pkg); + + data = udata_openChoice(pArgs->pkg, DATA_TYPE, pArgs->name, isCnvAcceptable, NULL, err); if(U_FAILURE(*err)) { + UTRACE_EXIT_STATUS(*err); return NULL; } - sharedData = ucnv_data_unFlattenClone(data, err); + sharedData = ucnv_data_unFlattenClone(pArgs, data, err); if(U_FAILURE(*err)) { udata_close(data); + UTRACE_EXIT_STATUS(*err); return NULL; } + /* + * TODO Store pkg in a field in the shared data so that delta-only converters + * can load base converters from the same package. + * If the pkg name is longer than the field, then either do not load the converter + * in the first place, or just set the pkg field to "". + */ + + UTRACE_EXIT_PTR_STATUS(sharedData, *err); return sharedData; } -int32_t +int32_t ucnv_copyPlatformString(char *platformString, UConverterPlatform pltfrm) { switch (pltfrm) @@ -307,7 +330,7 @@ static const UConverterSharedData * getAlgorithmicTypeFromName(const char *realName) { uint32_t mid, start, limit; - uint32_t lastMid; + uint32_t lastMid; int result; char strippedName[UCNV_MAX_CONVERTER_NAME_LENGTH]; @@ -318,14 +341,14 @@ getAlgorithmicTypeFromName(const char *realName) start = 0; limit = sizeof(cnvNameType)/sizeof(cnvNameType[0]); mid = limit; - lastMid = UINT32_MAX; + lastMid = UINT32_MAX; for (;;) { mid = (uint32_t)((start + limit) / 2); - if (lastMid == mid) { /* Have we moved? */ - break; /* We haven't moved, and it wasn't found. */ - } - lastMid = mid; + if (lastMid == mid) { /* Have we moved? */ + break; /* We haven't moved, and it wasn't found. */ + } + lastMid = mid; result = uprv_strcmp(strippedName, cnvNameType[mid].name); if (result < 0) { @@ -358,7 +381,9 @@ ucnv_shareConverterData(UConverterSharedData * data) SHARED_DATA_HASHTABLE = uhash_openSize(uhash_hashChars, uhash_compareChars, ucnv_io_countAvailableAliases(&err), &err); - if (U_FAILURE(err)) + ucln_common_registerCleanup(UCLN_COMMON_UCNV, ucnv_cleanup); + + if (U_FAILURE(err)) return; } @@ -372,7 +397,7 @@ ucnv_shareConverterData(UConverterSharedData * data) } UCNV_DEBUG_LOG("put:chk",data->staticData->name,sanity); */ - + /* Mark it shared */ data->sharedDataCached = TRUE; @@ -423,13 +448,18 @@ ucnv_getSharedConverterData(const char *name) static UBool ucnv_deleteSharedConverterData(UConverterSharedData * deadSharedData) { - if (deadSharedData->referenceCounter > 0) + UTRACE_ENTRY_OC(UTRACE_UCNV_UNLOAD); + UTRACE_DATA2(UTRACE_OPEN_CLOSE, "unload converter %s shared data %p", deadSharedData->staticData->name, deadSharedData); + + if (deadSharedData->referenceCounter > 0) { + UTRACE_EXIT_VALUE((int32_t)FALSE); return FALSE; + } if (deadSharedData->impl->unload != NULL) { deadSharedData->impl->unload(deadSharedData); } - + if(deadSharedData->dataMemory != NULL) { UDataMemory *data = (UDataMemory*)deadSharedData->dataMemory; @@ -456,42 +486,94 @@ ucnv_deleteSharedConverterData(UConverterSharedData * deadSharedData) #endif uprv_free(deadSharedData); - + + UTRACE_EXIT_VALUE((int32_t)TRUE); return TRUE; } +/** + * Load a non-algorithmic converter. + * If pkg==NULL, then this function must be called inside umtx_lock(&cnvCacheMutex). + */ +UConverterSharedData * +ucnv_load(UConverterLoadArgs *pArgs, UErrorCode *err) { + UConverterSharedData *mySharedConverterData; + + if(err == NULL || U_FAILURE(*err)) { + return NULL; + } + + if(pArgs->pkg != NULL && *pArgs->pkg != 0) { + /* application-provided converters are not currently cached */ + return createConverterFromFile(pArgs, err); + } + + mySharedConverterData = ucnv_getSharedConverterData(pArgs->name); + if (mySharedConverterData == NULL) + { + /*Not cached, we need to stream it in from file */ + mySharedConverterData = createConverterFromFile(pArgs, err); + if (U_FAILURE (*err) || (mySharedConverterData == NULL)) + { + return NULL; + } + else + { + /* share it with other library clients */ + ucnv_shareConverterData(mySharedConverterData); + } + } + else + { + /* The data for this converter was already in the cache. */ + /* Update the reference counter on the shared data: one more client */ + mySharedConverterData->referenceCounter++; + } + + return mySharedConverterData; +} + +/** + * Unload a non-algorithmic converter. + * It must be sharedData->referenceCounter != ~0 + * and this function must be called inside umtx_lock(&cnvCacheMutex). + */ void -ucnv_unloadSharedDataIfReady(UConverterSharedData *sharedData) -{ - umtx_lock(&cnvCacheMutex); - /* - Double checking doesn't work on some platforms. - Don't check referenceCounter outside of a mutex block. - */ - if (sharedData->referenceCounter != ~0) { +ucnv_unload(UConverterSharedData *sharedData) { + if(sharedData != NULL) { if (sharedData->referenceCounter > 0) { sharedData->referenceCounter--; } - + if((sharedData->referenceCounter <= 0)&&(sharedData->sharedDataCached == FALSE)) { ucnv_deleteSharedConverterData(sharedData); } } - umtx_unlock(&cnvCacheMutex); } void -ucnv_incrementRefCount(UConverterSharedData *sharedData) +ucnv_unloadSharedDataIfReady(UConverterSharedData *sharedData) { - umtx_lock(&cnvCacheMutex); /* - Double checking doesn't work on some platforms. - Don't check referenceCounter outside of a mutex block. + Checking whether it's an algorithic converter is okay + in multithreaded applications because the value never changes. + Don't check referenceCounter for any other value. */ - if (sharedData->referenceCounter != ~0) { + if(sharedData != NULL && sharedData->referenceCounter != ~0) { + umtx_lock(&cnvCacheMutex); + ucnv_unload(sharedData); + umtx_unlock(&cnvCacheMutex); + } +} + +void +ucnv_incrementRefCount(UConverterSharedData *sharedData) +{ + if(sharedData != NULL && sharedData->referenceCounter != ~0) { + umtx_lock(&cnvCacheMutex); sharedData->referenceCounter++; + umtx_unlock(&cnvCacheMutex); } - umtx_unlock(&cnvCacheMutex); } static void @@ -575,54 +657,58 @@ parseConverterOptions(const char *inName, * -Call dataConverter initializer (Data=TRUE, Cached=TRUE) * -Call AlgorithmicConverter initializer (Data=FALSE, Cached=TRUE) */ -UConverter * -ucnv_createConverter(UConverter *myUConverter, const char *converterName, UErrorCode * err) -{ - char cnvName[UCNV_MAX_CONVERTER_NAME_LENGTH], locale[ULOC_FULLNAME_CAPACITY]; - const char *realName; +UConverterSharedData * +ucnv_loadSharedData(const char *converterName, UConverterLookupData *lookup, UErrorCode * err) { + UConverterLookupData stackLookup; UConverterSharedData *mySharedConverterData = NULL; UErrorCode internalErrorCode = U_ZERO_ERROR; - uint32_t options = 0; - if (U_FAILURE (*err)) + + if (U_FAILURE (*err)) { return NULL; + } + + if(lookup == NULL) { + lookup = &stackLookup; + } - locale[0] = 0; + lookup->locale[0] = 0; + lookup->options = 0; /* In case "name" is NULL we want to open the default converter. */ if (converterName == NULL) { - realName = ucnv_io_getDefaultConverterName(); - if (realName == NULL) { + lookup->realName = ucnv_io_getDefaultConverterName(); + if (lookup->realName == NULL) { *err = U_MISSING_RESOURCE_ERROR; return NULL; } /* the default converter name is already canonical */ } else { /* separate the converter name from the options */ - parseConverterOptions(converterName, cnvName, locale, &options, err); + parseConverterOptions(converterName, lookup->cnvName, lookup->locale, &lookup->options, err); if (U_FAILURE(*err)) { /* Very bad name used. */ return NULL; } /* get the canonical converter name */ - realName = ucnv_io_getConverterName(cnvName, &internalErrorCode); - if (U_FAILURE(internalErrorCode) || realName == NULL) { + lookup->realName = ucnv_io_getConverterName(lookup->cnvName, &internalErrorCode); + if (U_FAILURE(internalErrorCode) || lookup->realName == NULL) { /* * set the input name in case the converter was added * without updating the alias table, or when there is no alias table */ - realName = cnvName; + lookup->realName = lookup->cnvName; } } /* separate the converter name from the options */ - if(realName != cnvName) { - parseConverterOptions(realName, cnvName, locale, &options, err); - realName = cnvName; + if(lookup->realName != lookup->cnvName) { + parseConverterOptions(lookup->realName, lookup->cnvName, lookup->locale, &lookup->options, err); + lookup->realName = lookup->cnvName; } - + /* get the shared data for an algorithmic converter, if it is one */ - mySharedConverterData = (UConverterSharedData *)getAlgorithmicTypeFromName(realName); + mySharedConverterData = (UConverterSharedData *)getAlgorithmicTypeFromName(lookup->realName); if (mySharedConverterData == NULL) { /* it is a data-based converter, get its shared data. */ @@ -630,50 +716,57 @@ ucnv_createConverter(UConverter *myUConverter, const char *converterName, UError /* converter data cache, and adding new entries to the cache */ /* to prevent other threads from modifying the cache during the */ /* process. */ + UConverterLoadArgs args={ 0 }; + + args.size=sizeof(UConverterLoadArgs); + args.nestedLoads=1; + args.options=lookup->options; + args.pkg=NULL; + args.name=lookup->realName; + umtx_lock(&cnvCacheMutex); - mySharedConverterData = ucnv_getSharedConverterData(realName); - if (mySharedConverterData == NULL) - { - /*Not cached, we need to stream it in from file */ - mySharedConverterData = createConverterFromFile(NULL, realName, err); - if (U_FAILURE (*err) || (mySharedConverterData == NULL)) - { - umtx_unlock(&cnvCacheMutex); - return NULL; - } - else - { - /* share it with other library clients */ - ucnv_shareConverterData(mySharedConverterData); - } - } - else + mySharedConverterData = ucnv_load(&args, err); + umtx_unlock(&cnvCacheMutex); + if (U_FAILURE (*err) || (mySharedConverterData == NULL)) { - /* The data for this converter was already in the cache. */ - /* Update the reference counter on the shared data: one more client */ - mySharedConverterData->referenceCounter++; + return NULL; } - umtx_unlock(&cnvCacheMutex); } - myUConverter = ucnv_createConverterFromSharedData(myUConverter, mySharedConverterData, realName, locale, options, err); + return mySharedConverterData; +} - if (U_FAILURE(*err)) - { - /* - Checking whether it's an algorithic converter is okay - in multithreaded applications because the value never changes. - Don't check referenceCounter for any other value. - */ - if (mySharedConverterData->referenceCounter != ~0) { - umtx_lock(&cnvCacheMutex); - --mySharedConverterData->referenceCounter; - umtx_unlock(&cnvCacheMutex); +UConverter * +ucnv_createConverter(UConverter *myUConverter, const char *converterName, UErrorCode * err) +{ + UConverterLookupData stackLookup; + UConverterSharedData *mySharedConverterData; + + UTRACE_ENTRY_OC(UTRACE_UCNV_OPEN); + + if(U_SUCCESS(*err)) { + UTRACE_DATA1(UTRACE_OPEN_CLOSE, "open converter %s", converterName); + + mySharedConverterData = ucnv_loadSharedData(converterName, &stackLookup, err); + + if(U_SUCCESS(*err)) { + myUConverter = ucnv_createConverterFromSharedData( + myUConverter, mySharedConverterData, + stackLookup.realName, stackLookup.locale, stackLookup.options, + err); + + if(U_SUCCESS(*err)) { + UTRACE_EXIT_PTR_STATUS(myUConverter, *err); + return myUConverter; + } else { + ucnv_unloadSharedDataIfReady(mySharedConverterData); + } } - return NULL; } - return myUConverter; + /* exit with error */ + UTRACE_EXIT_STATUS(*err); + return NULL; } UConverter * @@ -681,11 +774,16 @@ ucnv_createAlgorithmicConverter(UConverter *myUConverter, UConverterType type, const char *locale, uint32_t options, UErrorCode *err) { + UConverter *cnv; const UConverterSharedData *sharedData; UBool isAlgorithmicConverter; + UTRACE_ENTRY_OC(UTRACE_UCNV_OPEN_ALGORITHMIC); + UTRACE_DATA1(UTRACE_OPEN_CLOSE, "open algorithmic converter type %d", (int32_t)type); + if(type<0 || UCNV_NUMBER_OF_SUPPORTED_CONVERTER_TYPES<=type) { *err = U_ILLEGAL_ARGUMENT_ERROR; + UTRACE_EXIT_STATUS(U_ILLEGAL_ARGUMENT_ERROR); return NULL; } @@ -696,47 +794,66 @@ ucnv_createAlgorithmicConverter(UConverter *myUConverter, if (isAlgorithmicConverter) { /* not a valid type, or not an algorithmic converter */ *err = U_ILLEGAL_ARGUMENT_ERROR; + UTRACE_EXIT_STATUS(U_ILLEGAL_ARGUMENT_ERROR); return NULL; } - return ucnv_createConverterFromSharedData(myUConverter, (UConverterSharedData *)sharedData, "", + cnv = ucnv_createConverterFromSharedData(myUConverter, (UConverterSharedData *)sharedData, "", locale != NULL ? locale : "", options, err); + + UTRACE_EXIT_PTR_STATUS(cnv, *err); + return cnv; } UConverter* ucnv_createConverterFromPackage(const char *packageName, const char *converterName, UErrorCode * err) { char cnvName[UCNV_MAX_CONVERTER_NAME_LENGTH], locale[ULOC_FULLNAME_CAPACITY]; - uint32_t options=0; UConverter *myUConverter; - UConverterSharedData *mySharedConverterData = NULL; + UConverterSharedData *mySharedConverterData; + + UConverterLoadArgs args={ 0 }; + + UTRACE_ENTRY_OC(UTRACE_UCNV_OPEN_PACKAGE); if(U_FAILURE(*err)) { - return NULL; + UTRACE_EXIT_STATUS(*err); + return NULL; } - /* first, get the options out of the convertername string */ - parseConverterOptions(converterName, cnvName, locale, &options, err); + UTRACE_DATA2(UTRACE_OPEN_CLOSE, "open converter %s from package %s", converterName, packageName); + + args.size=sizeof(UConverterLoadArgs); + args.nestedLoads=1; + args.pkg=packageName; + + /* first, get the options out of the converterName string */ + parseConverterOptions(converterName, cnvName, locale, &args.options, err); if (U_FAILURE(*err)) { /* Very bad name used. */ + UTRACE_EXIT_STATUS(*err); return NULL; } - + args.name=cnvName; + /* open the data, unflatten the shared structure */ - mySharedConverterData = createConverterFromFile(packageName, cnvName, err); - + mySharedConverterData = createConverterFromFile(&args, err); + if (U_FAILURE(*err)) { - return NULL; + UTRACE_EXIT_STATUS(*err); + return NULL; } /* create the actual converter */ - myUConverter = ucnv_createConverterFromSharedData(NULL, mySharedConverterData, cnvName, locale, options, err); - + myUConverter = ucnv_createConverterFromSharedData(NULL, mySharedConverterData, cnvName, locale, args.options, err); + if (U_FAILURE(*err)) { ucnv_close(myUConverter); - return NULL; + UTRACE_EXIT_STATUS(*err); + return NULL; } - + + UTRACE_EXIT_PTR_STATUS(myUConverter, *err); return myUConverter; } @@ -768,13 +885,14 @@ ucnv_createConverterFromSharedData(UConverter *myUConverter, myUConverter->isExtraLocal = FALSE; myUConverter->sharedData = mySharedConverterData; myUConverter->options = options; - myUConverter->mode = UCNV_SI; myUConverter->fromCharErrorBehaviour = (UConverterToUCallback) UCNV_TO_U_CALLBACK_SUBSTITUTE; myUConverter->fromUCharErrorBehaviour = (UConverterFromUCallback) UCNV_FROM_U_CALLBACK_SUBSTITUTE; myUConverter->toUnicodeStatus = myUConverter->sharedData->toUnicodeStatus; + myUConverter->maxBytesPerUChar = myUConverter->sharedData->staticData->maxBytesPerChar; myUConverter->subChar1 = myUConverter->sharedData->staticData->subChar1; myUConverter->subCharLen = myUConverter->sharedData->staticData->subCharLen; uprv_memcpy (myUConverter->subChar, myUConverter->sharedData->staticData->subChar, myUConverter->subCharLen); + myUConverter->preFromUFirstCP = U_SENTINEL; if(myUConverter != NULL && myUConverter->sharedData->impl->open != NULL) { myUConverter->sharedData->impl->open(myUConverter, realName, locale,options, err); @@ -793,10 +911,13 @@ U_CAPI int32_t U_EXPORT2 ucnv_flushCache () { UConverterSharedData *mySharedData = NULL; - int32_t pos = -1; + int32_t pos; int32_t tableDeletedNum = 0; const UHashElement *e; UErrorCode status = U_ILLEGAL_ARGUMENT_ERROR; + int32_t i, remaining; + + UTRACE_ENTRY_OC(UTRACE_UCNV_FLUSH_CACHE); /* Close the default converter without creating a new one so that everything will be flushed. */ ucnv_close(u_getDefaultConverter(&status)); @@ -804,8 +925,10 @@ ucnv_flushCache () /*if shared data hasn't even been lazy evaluated yet * return 0 */ - if (SHARED_DATA_HASHTABLE == NULL) + if (SHARED_DATA_HASHTABLE == NULL) { + UTRACE_EXIT_VALUE((int32_t)0); return 0; + } /*creates an enumeration to iterate through every element in the * table @@ -819,25 +942,356 @@ ucnv_flushCache () * is protected by cnvCacheMutex. */ umtx_lock(&cnvCacheMutex); - while ((e = uhash_nextElement (SHARED_DATA_HASHTABLE, &pos)) != NULL) - { - mySharedData = (UConverterSharedData *) e->value.pointer; - /*deletes only if reference counter == 0 */ - if (mySharedData->referenceCounter == 0) + /* + * double loop: A delta/extension-only converter has a pointer to its base table's + * shared data; the first iteration of the outer loop may see the delta converter + * before the base converter, and unloading the delta converter may get the base + * converter's reference counter down to 0. + */ + i = 0; + do { + remaining = 0; + pos = -1; + while ((e = uhash_nextElement (SHARED_DATA_HASHTABLE, &pos)) != NULL) { - tableDeletedNum++; - - UCNV_DEBUG_LOG("del",mySharedData->staticData->name,mySharedData); - - uhash_removeElement(SHARED_DATA_HASHTABLE, e); - mySharedData->sharedDataCached = FALSE; - ucnv_deleteSharedConverterData (mySharedData); + mySharedData = (UConverterSharedData *) e->value.pointer; + /*deletes only if reference counter == 0 */ + if (mySharedData->referenceCounter == 0) + { + tableDeletedNum++; + + UCNV_DEBUG_LOG("del",mySharedData->staticData->name,mySharedData); + + uhash_removeElement(SHARED_DATA_HASHTABLE, e); + mySharedData->sharedDataCached = FALSE; + ucnv_deleteSharedConverterData (mySharedData); + } else { + ++remaining; + } } - } + } while(++i == 1 && remaining > 0); umtx_unlock(&cnvCacheMutex); + UTRACE_DATA1(UTRACE_INFO, "ucnv_flushCache() exits with %d converters remaining", remaining); + ucnv_io_flushAvailableConverterCache(); + UTRACE_EXIT_VALUE(tableDeletedNum); return tableDeletedNum; } +/* data swapping ------------------------------------------------------------ */ + +/* most of this might belong more properly into ucnvmbcs.c, but that is so large */ + +#if !UCONFIG_NO_LEGACY_CONVERSION + +U_CAPI int32_t U_EXPORT2 +ucnv_swap(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const UDataInfo *pInfo; + int32_t headerSize; + + const uint8_t *inBytes; + uint8_t *outBytes; + + uint32_t offset, count, staticDataSize; + int32_t size; + + const UConverterStaticData *inStaticData; + UConverterStaticData *outStaticData; + + const _MBCSHeader *inMBCSHeader; + _MBCSHeader *outMBCSHeader; + _MBCSHeader mbcsHeader; + uint8_t outputType; + + const int32_t *inExtIndexes; + int32_t extOffset; + + /* udata_swapDataHeader checks the arguments */ + headerSize=udata_swapDataHeader(ds, inData, length, outData, pErrorCode); + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + + /* check data format and format version */ + pInfo=(const UDataInfo *)((const char *)inData+4); + if(!( + pInfo->dataFormat[0]==0x63 && /* dataFormat="cnvt" */ + pInfo->dataFormat[1]==0x6e && + pInfo->dataFormat[2]==0x76 && + pInfo->dataFormat[3]==0x74 && + pInfo->formatVersion[0]==6 && + pInfo->formatVersion[1]>=2 + )) { + udata_printError(ds, "ucnv_swap(): data format %02x.%02x.%02x.%02x (format version %02x.%02x) is not recognized as an ICU .cnv conversion table\n", + pInfo->dataFormat[0], pInfo->dataFormat[1], + pInfo->dataFormat[2], pInfo->dataFormat[3], + pInfo->formatVersion[0], pInfo->formatVersion[1]); + *pErrorCode=U_UNSUPPORTED_ERROR; + return 0; + } + + inBytes=(const uint8_t *)inData+headerSize; + outBytes=(uint8_t *)outData+headerSize; + + /* read the initial UConverterStaticData structure after the UDataInfo header */ + inStaticData=(const UConverterStaticData *)inBytes; + outStaticData=(UConverterStaticData *)outBytes; + + if(length<0) { + staticDataSize=ds->readUInt32(inStaticData->structSize); + } else { + length-=headerSize; + if( lengthreadUInt32(inStaticData->structSize)) + ) { + udata_printError(ds, "ucnv_swap(): too few bytes (%d after header) for an ICU .cnv conversion table\n", + length); + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + } + + if(length>=0) { + /* swap the static data */ + if(inStaticData!=outStaticData) { + uprv_memcpy(outStaticData, inStaticData, staticDataSize); + } + + ds->swapArray32(ds, &inStaticData->structSize, 4, + &outStaticData->structSize, pErrorCode); + ds->swapArray32(ds, &inStaticData->codepage, 4, + &outStaticData->codepage, pErrorCode); + + ds->swapInvChars(ds, inStaticData->name, uprv_strlen(inStaticData->name), + outStaticData->name, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + udata_printError(ds, "ucnv_swap(): error swapping converter name - %s\n", + u_errorName(*pErrorCode)); + return 0; + } + } + + inBytes+=staticDataSize; + outBytes+=staticDataSize; + if(length>=0) { + length-=(int32_t)staticDataSize; + } + + /* check for supported conversionType values */ + if(inStaticData->conversionType==UCNV_MBCS) { + /* swap MBCS data */ + inMBCSHeader=(const _MBCSHeader *)inBytes; + outMBCSHeader=(_MBCSHeader *)outBytes; + + if(!(inMBCSHeader->version[0]==4 || inMBCSHeader->version[1]>=1)) { + udata_printError(ds, "ucnv_swap(): unsupported _MBCSHeader.version %d.%d\n", + inMBCSHeader->version[0], inMBCSHeader->version[1]); + *pErrorCode=U_UNSUPPORTED_ERROR; + return 0; + } + + uprv_memcpy(mbcsHeader.version, inMBCSHeader->version, 4); + mbcsHeader.countStates= ds->readUInt32(inMBCSHeader->countStates); + mbcsHeader.countToUFallbacks= ds->readUInt32(inMBCSHeader->countToUFallbacks); + mbcsHeader.offsetToUCodeUnits= ds->readUInt32(inMBCSHeader->offsetToUCodeUnits); + mbcsHeader.offsetFromUTable= ds->readUInt32(inMBCSHeader->offsetFromUTable); + mbcsHeader.offsetFromUBytes= ds->readUInt32(inMBCSHeader->offsetFromUBytes); + mbcsHeader.flags= ds->readUInt32(inMBCSHeader->flags); + mbcsHeader.fromUBytesLength= ds->readUInt32(inMBCSHeader->fromUBytesLength); + + extOffset=(int32_t)mbcsHeader.flags>>8; + outputType=(uint8_t)mbcsHeader.flags; + + /* make sure that the output type is known */ + switch(outputType) { + case MBCS_OUTPUT_1: + case MBCS_OUTPUT_2: + case MBCS_OUTPUT_3: + case MBCS_OUTPUT_4: + case MBCS_OUTPUT_3_EUC: + case MBCS_OUTPUT_4_EUC: + case MBCS_OUTPUT_2_SISO: + case MBCS_OUTPUT_EXT_ONLY: + /* OK */ + break; + default: + udata_printError(ds, "ucnv_swap(): unsupported MBCS output type 0x%x\n", + outputType); + *pErrorCode=U_UNSUPPORTED_ERROR; + return 0; + } + + /* calculate the length of the MBCS data */ + if(extOffset==0) { + size=(int32_t)(mbcsHeader.offsetFromUBytes+mbcsHeader.fromUBytesLength); + + /* avoid compiler warnings - not otherwise necessary, and the value does not matter */ + inExtIndexes=NULL; + } else { + /* there is extension data after the base data, see ucnv_ext.h */ + if(length>=0 && length<(extOffset+UCNV_EXT_INDEXES_MIN_LENGTH*4)) { + udata_printError(ds, "ucnv_swap(): too few bytes (%d after headers) for an ICU MBCS .cnv conversion table with extension data\n", + length); + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + + inExtIndexes=(const int32_t *)(inBytes+extOffset); + size=extOffset+udata_readInt32(ds, inExtIndexes[UCNV_EXT_SIZE]); + } + + if(length>=0) { + if(lengthswapArray32(ds, &inMBCSHeader->countStates, 7*4, + &outMBCSHeader->countStates, pErrorCode); + + if(outputType==MBCS_OUTPUT_EXT_ONLY) { + /* + * extension-only file, + * contains a base name instead of normal base table data + */ + + /* swap the base name, between the header and the extension data */ + ds->swapInvChars(ds, inMBCSHeader+1, uprv_strlen((const char *)(inMBCSHeader+1)), + outMBCSHeader+1, pErrorCode); + } else { + /* normal file with base table data */ + + /* swap the state table, 1kB per state */ + ds->swapArray32(ds, inMBCSHeader+1, (int32_t)(mbcsHeader.countStates*1024), + outMBCSHeader+1, pErrorCode); + + /* swap the toUFallbacks[] */ + offset=sizeof(_MBCSHeader)+mbcsHeader.countStates*1024; + ds->swapArray32(ds, inBytes+offset, (int32_t)(mbcsHeader.countToUFallbacks*8), + outBytes+offset, pErrorCode); + + /* swap the unicodeCodeUnits[] */ + offset=mbcsHeader.offsetToUCodeUnits; + count=mbcsHeader.offsetFromUTable-offset; + ds->swapArray16(ds, inBytes+offset, (int32_t)count, + outBytes+offset, pErrorCode); + + /* offset to the stage 1 table, independent of the outputType */ + offset=mbcsHeader.offsetFromUTable; + + if(outputType==MBCS_OUTPUT_1) { + /* SBCS: swap the fromU tables, all 16 bits wide */ + count=(mbcsHeader.offsetFromUBytes-offset)+mbcsHeader.fromUBytesLength; + ds->swapArray16(ds, inBytes+offset, (int32_t)count, + outBytes+offset, pErrorCode); + } else { + /* otherwise: swap the stage tables separately */ + + /* stage 1 table: uint16_t[0x440 or 0x40] */ + if(inStaticData->unicodeMask&UCNV_HAS_SUPPLEMENTARY) { + count=0x440*2; /* for all of Unicode */ + } else { + count=0x40*2; /* only BMP */ + } + ds->swapArray16(ds, inBytes+offset, (int32_t)count, + outBytes+offset, pErrorCode); + + /* stage 2 table: uint32_t[] */ + offset+=count; + count=mbcsHeader.offsetFromUBytes-offset; + ds->swapArray32(ds, inBytes+offset, (int32_t)count, + outBytes+offset, pErrorCode); + + /* stage 3/result bytes: sometimes uint16_t[] or uint32_t[] */ + offset=mbcsHeader.offsetFromUBytes; + count=mbcsHeader.fromUBytesLength; + switch(outputType) { + case MBCS_OUTPUT_2: + case MBCS_OUTPUT_3_EUC: + case MBCS_OUTPUT_2_SISO: + ds->swapArray16(ds, inBytes+offset, (int32_t)count, + outBytes+offset, pErrorCode); + break; + case MBCS_OUTPUT_4: + ds->swapArray32(ds, inBytes+offset, (int32_t)count, + outBytes+offset, pErrorCode); + break; + default: + /* just uint8_t[], nothing to swap */ + break; + } + } + } + + if(extOffset!=0) { + /* swap the extension data */ + inBytes+=extOffset; + outBytes+=extOffset; + + /* swap toUTable[] */ + offset=udata_readInt32(ds, inExtIndexes[UCNV_EXT_TO_U_INDEX]); + length=udata_readInt32(ds, inExtIndexes[UCNV_EXT_TO_U_LENGTH]); + ds->swapArray32(ds, inBytes+offset, length*4, outBytes+offset, pErrorCode); + + /* swap toUUChars[] */ + offset=udata_readInt32(ds, inExtIndexes[UCNV_EXT_TO_U_UCHARS_INDEX]); + length=udata_readInt32(ds, inExtIndexes[UCNV_EXT_TO_U_UCHARS_LENGTH]); + ds->swapArray16(ds, inBytes+offset, length*2, outBytes+offset, pErrorCode); + + /* swap fromUTableUChars[] */ + offset=udata_readInt32(ds, inExtIndexes[UCNV_EXT_FROM_U_UCHARS_INDEX]); + length=udata_readInt32(ds, inExtIndexes[UCNV_EXT_FROM_U_LENGTH]); + ds->swapArray16(ds, inBytes+offset, length*2, outBytes+offset, pErrorCode); + + /* swap fromUTableValues[] */ + offset=udata_readInt32(ds, inExtIndexes[UCNV_EXT_FROM_U_VALUES_INDEX]); + /* same length as for fromUTableUChars[] */ + ds->swapArray32(ds, inBytes+offset, length*4, outBytes+offset, pErrorCode); + + /* no need to swap fromUBytes[] */ + + /* swap fromUStage12[] */ + offset=udata_readInt32(ds, inExtIndexes[UCNV_EXT_FROM_U_STAGE_12_INDEX]); + length=udata_readInt32(ds, inExtIndexes[UCNV_EXT_FROM_U_STAGE_12_LENGTH]); + ds->swapArray16(ds, inBytes+offset, length*2, outBytes+offset, pErrorCode); + + /* swap fromUStage3[] */ + offset=udata_readInt32(ds, inExtIndexes[UCNV_EXT_FROM_U_STAGE_3_INDEX]); + length=udata_readInt32(ds, inExtIndexes[UCNV_EXT_FROM_U_STAGE_3_LENGTH]); + ds->swapArray16(ds, inBytes+offset, length*2, outBytes+offset, pErrorCode); + + /* swap fromUStage3b[] */ + offset=udata_readInt32(ds, inExtIndexes[UCNV_EXT_FROM_U_STAGE_3B_INDEX]); + length=udata_readInt32(ds, inExtIndexes[UCNV_EXT_FROM_U_STAGE_3B_LENGTH]); + ds->swapArray32(ds, inBytes+offset, length*4, outBytes+offset, pErrorCode); + + /* swap indexes[] */ + length=udata_readInt32(ds, inExtIndexes[UCNV_EXT_INDEXES_LENGTH]); + ds->swapArray32(ds, inBytes, length*4, outBytes, pErrorCode); + } + } + } else { + udata_printError(ds, "ucnv_swap(): unknown conversionType=%d!=UCNV_MBCS\n", + inStaticData->conversionType); + *pErrorCode=U_UNSUPPORTED_ERROR; + return 0; + } + + return headerSize+(int32_t)staticDataSize+size; +} + +#endif /* #if !UCONFIG_NO_LEGACY_CONVERSION */ + +#endif diff --git a/icuSources/common/ucnv_bld.h b/icuSources/common/ucnv_bld.h index 1a467423..e3983ec4 100644 --- a/icuSources/common/ucnv_bld.h +++ b/icuSources/common/ucnv_bld.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -18,15 +18,25 @@ #define UCNV_BLD_H #include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + #include "unicode/ucnv.h" #include "unicode/ucnv_err.h" - +#include "ucnv_cnv.h" +#include "ucnvmbcs.h" +#include "ucnv_ext.h" +#include "udataswp.h" /* size of the overflow buffers in UConverter, enough for escaping callbacks */ #define UCNV_ERROR_BUFFER_LENGTH 32 +/* at most 4 bytes per substitution character (part of .cnv file format! see UConverterStaticData) */ #define UCNV_MAX_SUBCHAR_LEN 4 +/* at most 8 bytes per character in toUBytes[] (UTF-8 uses up to 6) */ +#define UCNV_MAX_CHAR_LEN 8 + /* converter options bits */ #define UCNV_OPTION_VERSION 0xf #define UCNV_OPTION_SWAP_LFNL 0x10 @@ -37,7 +47,10 @@ U_CDECL_BEGIN /* We must declare the following as 'extern "C"' so that if ucnv work. */ -union UConverterTable; +union UConverterTable { + UConverterMBCSTable mbcs; +}; + typedef union UConverterTable UConverterTable; struct UConverterImpl; @@ -59,7 +72,7 @@ typedef struct UConverterStaticData { /* +offset: size */ int8_t conversionType; /* +69: 1 conversion type */ int8_t minBytesPerChar; /* +70: 1 Minimum # bytes per char in this codepage */ - int8_t maxBytesPerChar; /* +71: 1 Maximum # bytes per char in this codepage */ + int8_t maxBytesPerChar; /* +71: 1 Maximum # bytes output per UChar in this codepage */ uint8_t subChar[UCNV_MAX_SUBCHAR_LEN]; /* +72: 4 [note: 4 and 8 byte boundary] */ int8_t subCharLen; /* +76: 1 */ @@ -81,7 +94,7 @@ struct UConverterSharedData { uint32_t referenceCounter; /* used to count number of clients, 0xffffffff for static SharedData */ const void *dataMemory; /* from udata_openChoice() - for cleanup */ - UConverterTable *table; /* Pointer to conversion data */ + void *table; /* Unused. This used to be a UConverterTable - Pointer to conversion data - see mbcs below */ const UConverterStaticData *staticData; /* pointer to the static (non changing) data. */ @@ -92,9 +105,23 @@ struct UConverterSharedData { /*initial values of some members of the mutable part of object */ uint32_t toUnicodeStatus; -}; -typedef struct UConverterSharedData UConverterSharedData; + /* + * Shared data structures currently come in two flavors: + * - readonly for built-in algorithmic converters + * - allocated for MBCS, with a pointer to an allocated UConverterTable + * which always has a UConverterMBCSTable + * + * To eliminate one allocation, I am making the UConverterMBCSTable + * a member of the shared data. It is the last member so that static + * definitions of UConverterSharedData work as before. + * The table field above also remains to avoid updating all static + * definitions, but is now unused. + * + * markus 2003-nov-07 + */ + UConverterMBCSTable mbcs; +}; /* Defines a UConverter, the lightweight mutable part the user sees */ @@ -112,7 +139,7 @@ struct UConverter { UErrorCode *); /* * Error function pointer called when conversion issues - * occur during a T_UConverter_toUnicode call + * occur during a ucnv_toUnicode call */ void (U_EXPORT2 *fromCharErrorBehaviour) (const void *context, UConverterToUnicodeArgs *args, @@ -140,11 +167,29 @@ struct UConverter { UBool useFallback; int8_t toULength; /* number of bytes in toUBytes */ - uint8_t toUBytes[7]; /* more "toU status"; keeps the bytes of the current character */ + uint8_t toUBytes[UCNV_MAX_CHAR_LEN-1];/* more "toU status"; keeps the bytes of the current character */ uint32_t toUnicodeStatus; /* Used to internalize stream status information */ int32_t mode; uint32_t fromUnicodeStatus; - UChar fromUSurrogateLead; /* similar to toUBytes; keeps the lead surrogate of the current character */ + + /* + * More fromUnicode() status. Serves 3 purposes: + * - keeps a lead surrogate between buffers (similar to toUBytes[]) + * - keeps a lead surrogate at the end of the stream, + * which the framework handles as truncated input + * - if the fromUnicode() implementation returns to the framework + * (ucnv.c ucnv_fromUnicode()), then the framework calls the callback + * for this code point + */ + UChar32 fromUChar32; + + /* + * value for ucnv_getMaxCharSize() + * + * usually simply copied from the static data, but ucnvmbcs.c modifies + * the value depending on the converter type and options + */ + int8_t maxBytesPerUChar; int8_t subCharLen; /* length of the codepage specific character sequence */ int8_t invalidCharLength; @@ -154,26 +199,52 @@ struct UConverter { int8_t UCharErrorBufferLength; /* number of valid UChars in charErrorBuffer */ uint8_t subChar1; /* single-byte substitution character if different from subChar */ + UBool useSubChar1; uint8_t subChar[UCNV_MAX_SUBCHAR_LEN]; /* codepage specific character sequence */ - char invalidCharBuffer[UCNV_MAX_SUBCHAR_LEN]; /* bytes from last error/callback situation */ + char invalidCharBuffer[UCNV_MAX_CHAR_LEN]; /* bytes from last error/callback situation */ uint8_t charErrorBuffer[UCNV_ERROR_BUFFER_LENGTH]; /* codepage output from Error functions */ - UChar invalidUCharBuffer[3]; /* UChars from last error/callback situation */ + UChar invalidUCharBuffer[U16_MAX_LENGTH]; /* UChars from last error/callback situation */ UChar UCharErrorBuffer[UCNV_ERROR_BUFFER_LENGTH]; /* unicode output from Error functions */ + /* fields for conversion extension */ + + /* store previous UChars/chars to continue partial matches */ + UChar32 preFromUFirstCP; /* >=0: partial match */ + UChar preFromU[UCNV_EXT_MAX_UCHARS]; + char preToU[UCNV_EXT_MAX_BYTES]; + int8_t preFromULength, preToULength; /* negative: replay */ + int8_t preToUFirstLength; /* length of first character */ }; U_CDECL_END /* end of UConverter */ -typedef struct - { - UConverter *OptGrpConverter[0x20]; /* Converter per Opt. grp. */ - uint8_t OptGroup; /* default Opt. grp. for this LMBCS session */ - uint8_t localeConverterIndex; /* reasonable locale match for index */ +#define CONVERTER_FILE_EXTENSION ".cnv" + +/** + * Load a non-algorithmic converter. + * If pkg==NULL, then this function must be called inside umtx_lock(&cnvCacheMutex). + */ +UConverterSharedData * +ucnv_load(UConverterLoadArgs *pArgs, UErrorCode *err); + +/** + * Unload a non-algorithmic converter. + * It must be sharedData->referenceCounter != ~0 + * and this function must be called inside umtx_lock(&cnvCacheMutex). + */ +void +ucnv_unload(UConverterSharedData *sharedData); - } -UConverterDataLMBCS; +/** + * Swap ICU .cnv conversion tables. See udataswp.h. + * @internal + */ +U_CAPI int32_t U_EXPORT2 +ucnv_swap(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode); -#define CONVERTER_FILE_EXTENSION ".cnv" +#endif #endif /* _UCNV_BLD */ diff --git a/icuSources/common/ucnv_cb.c b/icuSources/common/ucnv_cb.c index 9cbf25e6..5038ab57 100644 --- a/icuSources/common/ucnv_cb.c +++ b/icuSources/common/ucnv_cb.c @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2000-2001, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * ucnv_cb.c: @@ -19,6 +19,9 @@ */ #include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + #include "unicode/ucnv_cb.h" #include "ucnv_bld.h" #include "ucnv_cnv.h" @@ -35,50 +38,16 @@ ucnv_cbFromUWriteBytes (UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorCode * err) { - int32_t togo; - int8_t toerr; - int32_t i; - - if((args->targetLimit - args->target) >= length) /* If the buffer fits.. */ - { - uprv_memcpy(args->target, source, length); - args->target += length; - if(args->offsets) /* set all the offsets to the same # */ - { - for(i=0;ioffsets++) = offsetIndex; - } - } + if(U_FAILURE(*err)) { + return; } - else - { - togo = (int32_t)(args->targetLimit - args->target); - - uprv_memcpy(args->target, source, togo); - args->target += togo; - if(args->offsets) - { - for(i=0;ioffsets++) = offsetIndex; - } - } - - /* Now, copy the remainder into the errbuff */ - source += togo; - toerr = (int8_t)(length - togo); - - uprv_memcpy(args->converter->charErrorBuffer + - args->converter->charErrorBufferLength, - source, - toerr * sizeof(source[0])); - args->converter->charErrorBufferLength += toerr; - - *err = U_BUFFER_OVERFLOW_ERROR; - - } + ucnv_fromUWriteBytes( + args->converter, + source, length, + &args->target, args->targetLimit, + &args->offsets, offsetIndex, + err); } U_CAPI void U_EXPORT2 @@ -232,55 +201,16 @@ ucnv_cbToUWriteUChars (UConverterToUnicodeArgs *args, int32_t offsetIndex, UErrorCode * err) { - int32_t togo; - int8_t toerr; - int32_t i; - - if(U_FAILURE(*err)) - { + if(U_FAILURE(*err)) { return; } - - if((args->targetLimit - args->target) >= length) /* If the buffer fits.. */ - { - uprv_memcpy(args->target, source, length * sizeof(args->target[0]) ); - args->target += length; - if(args->offsets) /* set all the offsets to the same # */ - { - for(i=0;ioffsets++) = offsetIndex; - } - } - } - else - { - togo = (int32_t)(args->targetLimit - args->target); - - uprv_memcpy(args->target, source, togo * sizeof(args->target[0]) ); - args->target += togo; - - if(args->offsets) - { - for(i=0;ioffsets++) = offsetIndex; - } - } - - /* Now, copy the remainder into the errbuff */ - source += togo; - toerr = (int8_t)(length - togo); - - uprv_memcpy(args->converter->UCharErrorBuffer + - args->converter->UCharErrorBufferLength, - source, - toerr * sizeof(source[0])); - args->converter->UCharErrorBufferLength += toerr; - - *err = U_BUFFER_OVERFLOW_ERROR; - } + ucnv_toUWriteUChars( + args->converter, + source, length, + &args->target, args->targetLimit, + &args->offsets, offsetIndex, + err); } U_CAPI void U_EXPORT2 @@ -297,3 +227,5 @@ ucnv_cbToUWriteSub (UConverterToUnicodeArgs *args, ucnv_cbToUWriteUChars(args, &kSubstituteChar, 1, offsetIndex, err); } } + +#endif diff --git a/icuSources/common/ucnv_cnv.c b/icuSources/common/ucnv_cnv.c index ae0d61ed..48c22010 100644 --- a/icuSources/common/ucnv_cnv.c +++ b/icuSources/common/ucnv_cnv.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -16,244 +16,159 @@ */ #include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + #include "unicode/ucnv_err.h" #include "unicode/ucnv.h" #include "unicode/uset.h" #include "ucnv_cnv.h" +#include "ucnv_bld.h" #include "cmemory.h" -/*Empties the internal unicode output buffer */ -void ucnv_flushInternalUnicodeBuffer (UConverter * _this, - UChar * myTarget, - int32_t * myTargetIndex, - int32_t targetLength, - int32_t** offsets, - UErrorCode * err) -{ - int32_t myUCharErrorBufferLength = _this->UCharErrorBufferLength; - - if (myUCharErrorBufferLength <= targetLength) - { - /*we have enough space - *So we just copy the whole Error Buffer in to the output stream - */ - uprv_memcpy (myTarget, - _this->UCharErrorBuffer, - sizeof (UChar) * myUCharErrorBufferLength); - if (offsets) - { - int32_t i=0; - for (i=0; iUCharErrorBufferLength = 0; - } - else - { - /* We don't have enough space so we copy as much as we can - * on the output stream and update the object - * by updating the internal buffer*/ - uprv_memcpy (myTarget, _this->UCharErrorBuffer, sizeof (UChar) * targetLength); - if (offsets) - { - int32_t i=0; - for (i=0; i< targetLength;i++) (*offsets)[i] = -1; - *offsets += targetLength; - } - uprv_memmove (_this->UCharErrorBuffer, - _this->UCharErrorBuffer + targetLength, - sizeof (UChar) * (myUCharErrorBufferLength - targetLength)); - _this->UCharErrorBufferLength -= (int8_t) targetLength; - *myTargetIndex = targetLength; - *err = U_BUFFER_OVERFLOW_ERROR; - } +U_CFUNC void +ucnv_getCompleteUnicodeSet(const UConverter *cnv, + USetAdder *sa, + UConverterUnicodeSet which, + UErrorCode *pErrorCode) { + sa->addRange(sa->set, 0, 0x10ffff); +} + +U_CFUNC void +ucnv_getNonSurrogateUnicodeSet(const UConverter *cnv, + USetAdder *sa, + UConverterUnicodeSet which, + UErrorCode *pErrorCode) { + sa->addRange(sa->set, 0, 0xd7ff); + sa->addRange(sa->set, 0xe000, 0x10ffff); } -/*Empties the internal codepage output buffer */ -void ucnv_flushInternalCharBuffer (UConverter * _this, - char *myTarget, - int32_t * myTargetIndex, - int32_t targetLength, - int32_t** offsets, - UErrorCode * err) -{ - int32_t myCharErrorBufferLength = _this->charErrorBufferLength; - - /*we have enough space */ - if (myCharErrorBufferLength <= targetLength) - { - uprv_memcpy (myTarget, _this->charErrorBuffer, myCharErrorBufferLength); - if (offsets) - { - int32_t i=0; - for (i=0; i0 && tcharErrorBufferLength = 0; + } else { + /* output with offsets */ + while(length>0 && tcharErrorBuffer, targetLength); - if (offsets) - { - int32_t i=0; - for (i=0; i< targetLength;i++) (*offsets)[i] = -1; - *offsets += targetLength; + *target=t; + + /* write overflow */ + if(length>0) { + if(cnv!=NULL) { + t=(char *)cnv->charErrorBuffer; + cnv->charErrorBufferLength=(int8_t)length; + do { + *t++=(uint8_t)*bytes++; + } while(--length>0); } - uprv_memmove (_this->charErrorBuffer, - _this->charErrorBuffer + targetLength, - (myCharErrorBufferLength - targetLength)); - _this->charErrorBufferLength -= (int8_t) targetLength; - *myTargetIndex = targetLength; - *err = U_BUFFER_OVERFLOW_ERROR; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; } } -/** - * This function is useful for implementations of getNextUChar(). - * After a call to a callback function or to toUnicode(), an output buffer - * begins with a Unicode code point that needs to be returned as UChar32, - * and all following code units must be prepended to the - potentially - * prefilled - overflow buffer in the UConverter. - * The buffer should be at least of capacity UTF_MAX_CHAR_LENGTH so that a - * complete UChar32's UChars fit into it. - * - * @param cnv The converter that will get remaining UChars copied to its overflow area. - * @param buffer An array of UChars that was passed into a callback function - * or a toUnicode() function. - * @param length The number of code units (UChars) that are actually in the buffer. - * This must be >0. - * @return The code point from the first UChars in the buffer. - */ -U_CFUNC UChar32 -ucnv_getUChar32KeepOverflow(UConverter *cnv, const UChar *buffer, int32_t length) { - UChar32 c; - int32_t i; - - if(length<=0) { - return 0xffff; +U_CFUNC void +ucnv_toUWriteUChars(UConverter *cnv, + const UChar *uchars, int32_t length, + UChar **target, const UChar *targetLimit, + int32_t **offsets, + int32_t sourceIndex, + UErrorCode *pErrorCode) { + UChar *t=*target; + int32_t *o; + + /* write UChars */ + if(offsets==NULL || (o=*offsets)==NULL) { + while(length>0 && t0 && tUCharErrorBuffer; - int32_t j=cnv->UCharErrorBufferLength; - - if(j>0) { - /* move the overflow buffer contents to make room for the extra UChars */ - int32_t k; - - cnv->UCharErrorBufferLength=(int8_t)(k=(length-i)+j); + /* write overflow */ + if(length>0) { + if(cnv!=NULL) { + t=cnv->UCharErrorBuffer; + cnv->UCharErrorBufferLength=(int8_t)length; do { - overflow[--k]=overflow[--j]; - } while(j>0); - } else { - cnv->UCharErrorBufferLength=(int8_t)(length-i); + *t++=*uchars++; + } while(--length>0); } - - /* copy the remaining UChars to the beginning of the overflow buffer */ - do { - overflow[j++]=buffer[i++]; - } while(i=0) { - /* add the sourceIndex to the relative offsets that the callback wrote */ - while(length>0) { - *offsets+=sourceIndex; - ++offsets; - --length; - } - } else { - /* sourceIndex==-1, set -1 offsets */ - while(length>0) { - *offsets=-1; - ++offsets; - --length; +U_CFUNC void +ucnv_toUWriteCodePoint(UConverter *cnv, + UChar32 c, + UChar **target, const UChar *targetLimit, + int32_t **offsets, + int32_t sourceIndex, + UErrorCode *pErrorCode) { + UChar *t; + int32_t *o; + + t=*target; + + if(tsourceLimit; - - pArgs->target=buffer; - pArgs->targetLimit=buffer+UTF_MAX_CHAR_LENGTH; - - while(pArgs->sourcesourceLimit=pArgs->source+1; - pArgs->flush= (UBool)(pArgs->sourceLimit==realLimit); - - /* convert this byte and check the result */ - toU(pArgs, pErrorCode); - if(U_SUCCESS(*pErrorCode)) { - int32_t length=(int32_t)(pArgs->target-buffer); - /* this test is UTF-16 specific */ - if(/* some output and - (source consumed or don't collect surrogate pairs or not a surrogate or a surrogate pair) */ - length>0 && - (pArgs->flush || !collectPairs || !UTF_IS_FIRST_SURROGATE(buffer[0]) || length==2) - ) { - return ucnv_getUChar32KeepOverflow(pArgs->converter, buffer, length); + /* write offsets */ + if(offsets!=NULL && (o=*offsets)!=NULL) { + *o++=sourceIndex; + if((*target+1)converter, buffer, UTF_MAX_CHAR_LENGTH); - } else { - /* U_FAILURE() */ - return 0xffff; + *offsets=o; } } - /* no output because of empty input or only state changes and skipping callbacks */ - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0xffff; -} + *target=t; -U_CFUNC void -ucnv_getCompleteUnicodeSet(const UConverter *cnv, - USet *set, - UConverterUnicodeSet which, - UErrorCode *pErrorCode) { - uset_addRange(set, 0, 0x10ffff); + /* write overflow from c */ + if(c>=0) { + if(cnv!=NULL) { + int8_t i=0; + U16_APPEND_UNSAFE(cnv->UCharErrorBuffer, i, c); + cnv->UCharErrorBufferLength=i; + } + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } } -U_CFUNC void -ucnv_getNonSurrogateUnicodeSet(const UConverter *cnv, - USet *set, - UConverterUnicodeSet which, - UErrorCode *pErrorCode) { - uset_addRange(set, 0, 0xd7ff); - uset_addRange(set, 0xe000, 0x10ffff); -} +#endif diff --git a/icuSources/common/ucnv_cnv.h b/icuSources/common/ucnv_cnv.h index a4f468ea..e0692a50 100644 --- a/icuSources/common/ucnv_cnv.h +++ b/icuSources/common/ucnv_cnv.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -19,16 +19,13 @@ #define UCNV_CNV_H #include "unicode/utypes.h" -#include "unicode/ucnv.h" -#include "unicode/ucnv_err.h" -#include "ucnv_bld.h" -#include "ucnvmbcs.h" -union UConverterTable - { - UConverterMBCSTable mbcs; - }; +#if !UCONFIG_NO_CONVERSION +#include "unicode/ucnv.h" +#include "unicode/ucnv_err.h" +#include "unicode/uset.h" +#include "uset_imp.h" U_CDECL_BEGIN @@ -38,14 +35,29 @@ U_CDECL_BEGIN /* * #define missingUCharMarker 0xfffe * - * there are actually two values used in toUnicode tables: + * commented out because there are actually two values used in toUnicode tables: * U+fffe "unassigned" * U+ffff "illegal" */ +/** Forward declaration, see ucnv_bld.h */ +struct UConverterSharedData; +typedef struct UConverterSharedData UConverterSharedData; + +/* function types for UConverterImpl ---------------------------------------- */ +/* struct with arguments for UConverterLoad and ucnv_load() */ +typedef struct { + int32_t size; /* sizeof(UConverterLoadArgs) */ + int32_t nestedLoads; /* count nested ucnv_load() calls */ + int32_t reserved; /* reserved - for good alignment of the pointers */ + uint32_t options; + const char *pkg, *name; +} UConverterLoadArgs; -typedef void (*UConverterLoad) (UConverterSharedData *sharedData, const uint8_t *raw, UErrorCode *pErrorCode); +typedef void (*UConverterLoad) (UConverterSharedData *sharedData, + UConverterLoadArgs *pArgs, + const uint8_t *raw, UErrorCode *pErrorCode); typedef void (*UConverterUnload) (UConverterSharedData *sharedData); typedef void (*UConverterOpen) (UConverter *cnv, const char *name, const char *locale,uint32_t options, UErrorCode *pErrorCode); @@ -59,11 +71,60 @@ typedef enum UConverterResetChoice { typedef void (*UConverterReset) (UConverter *cnv, UConverterResetChoice choice); -typedef void (*T_ToUnicodeFunction) (UConverterToUnicodeArgs *, UErrorCode *); +/* + * Converter implementation function(s) for ucnv_toUnicode(). + * If the toUnicodeWithOffsets function pointer is NULL, + * then the toUnicode function will be used and the offsets will be set to -1. + * + * Must maintain state across buffers. Use toUBytes[toULength] for partial input + * sequences; it will be checked in ucnv.c at the end of the input stream + * to detect truncated input. + * Some converters may need additional detection and may then set U_TRUNCATED_CHAR_FOUND. + * + * The toUnicodeWithOffsets must write exactly as many offset values as target + * units. Write offset values of -1 for when the source index corresponding to + * the output unit is not known (e.g., the character started in an earlier buffer). + * The pArgs->offsets pointer need not be moved forward. + * + * At function return, either one of the following conditions must be true: + * - U_BUFFER_OVERFLOW_ERROR and the target is full: target==targetLimit + * - another error code with toUBytes[toULength] set to the offending input + * - no error, and the source is consumed: source==sourceLimit + * + * The ucnv.c code will handle the end of the input (reset) + * (reset, and truncation detection) and callbacks. + */ +typedef void (*UConverterToUnicode) (UConverterToUnicodeArgs *, UErrorCode *); -typedef void (*T_FromUnicodeFunction) (UConverterFromUnicodeArgs *, UErrorCode *); +/* + * Same rules as for UConverterToUnicode. + * A lead surrogate is kept in fromUChar32 across buffers, and if an error + * occurs, then the offending input code point must be put into fromUChar32 + * as well. + */ +typedef void (*UConverterFromUnicode) (UConverterFromUnicodeArgs *, UErrorCode *); -typedef UChar32 (*T_GetNextUCharFunction) (UConverterToUnicodeArgs *, UErrorCode *); +/* + * Converter implementation function for ucnv_getNextUChar(). + * If the function pointer is NULL, then the toUnicode function will be used. + * + * Will be called at a character boundary (toULength==0). + * May return with + * - U_INDEX_OUTOFBOUNDS_ERROR if there was no output for the input + * (the return value will be ignored) + * - U_TRUNCATED_CHAR_FOUND or another error code (never U_BUFFER_OVERFLOW_ERROR!) + * with toUBytes[toULength] set to the offending input + * (the return value will be ignored) + * - return UCNV_GET_NEXT_UCHAR_USE_TO_U, without moving the source pointer, + * to indicate that the ucnv.c code shall call the toUnicode function instead + * - return a real code point result + * + * Unless UCNV_GET_NEXT_UCHAR_USE_TO_U is returned, the source bytes must be consumed. + * + * The ucnv.c code will handle the end of the input (reset) + * (except for truncation detection!) and callbacks. + */ +typedef UChar32 (*UConverterGetNextUChar) (UConverterToUnicodeArgs *, UErrorCode *); typedef void (*UConverterGetStarters)(const UConverter* converter, UBool starters[256], @@ -110,26 +171,12 @@ typedef UConverter * (*UConverterSafeClone) (const UConverter *cnv, * For more documentation, see ucnv_getUnicodeSet() in ucnv.h. */ typedef void (*UConverterGetUnicodeSet) (const UConverter *cnv, - USet *set, + USetAdder *sa, UConverterUnicodeSet which, UErrorCode *pErrorCode); UBool CONVERSION_U_SUCCESS (UErrorCode err); -void ucnv_flushInternalUnicodeBuffer (UConverter * _this, - UChar * myTarget, - int32_t * myTargetIndex, - int32_t targetLength, - int32_t** offsets, - UErrorCode * err); - -void ucnv_flushInternalCharBuffer (UConverter * _this, - char *myTarget, - int32_t * myTargetIndex, - int32_t targetLength, - int32_t** offsets, - UErrorCode * err); - /** * UConverterImpl contains all the data and functions for a converter type. * Its function pointers work much like a C++ vtable. @@ -156,11 +203,11 @@ struct UConverterImpl { UConverterClose close; UConverterReset reset; - T_ToUnicodeFunction toUnicode; - T_ToUnicodeFunction toUnicodeWithOffsets; - T_FromUnicodeFunction fromUnicode; - T_FromUnicodeFunction fromUnicodeWithOffsets; - T_GetNextUCharFunction getNextUChar; + UConverterToUnicode toUnicode; + UConverterToUnicode toUnicodeWithOffsets; + UConverterFromUnicode fromUnicode; + UConverterFromUnicode fromUnicodeWithOffsets; + UConverterGetNextUChar getNextUChar; UConverterGetStarters getStarters; UConverterGetName getName; @@ -180,40 +227,6 @@ extern const UConverterSharedData U_CDECL_END -/** - * This function is useful for implementations of getNextUChar(). - * After a call to a callback function or to toUnicode(), an output buffer - * begins with a Unicode code point that needs to be returned as UChar32, - * and all following code units must be prepended to the - potentially - * prefilled - overflow buffer in the UConverter. - * The buffer should be at least of capacity UTF_MAX_CHAR_LENGTH so that a - * complete UChar32's UChars fit into it. - * - * @param cnv The converter that will get remaining UChars copied to its overflow area. - * @param buffer An array of UChars that was passed into a callback function - * or a toUnicode() function. - * @param length The number of code units (UChars) that are actually in the buffer. - * This must be >0. - * @return The code point from the first UChars in the buffer. - */ -U_CFUNC UChar32 -ucnv_getUChar32KeepOverflow(UConverter *cnv, const UChar *buffer, int32_t length); - -/** - * This helper function updates the offsets array after a callback function call. - * It adds the sourceIndex to each offsets item, or sets each of them to -1 if - * sourceIndex==-1. - * - * @param offsets The pointer to offsets entry that corresponds to the first target - * unit that the callback wrote. - * @param length The number of output units that the callback wrote. - * @param sourceIndex The sourceIndex of the input sequence that the callback - * function was called for. - * @return offsets+length if offsets!=NULL, otherwise NULL - */ -U_CFUNC int32_t * -ucnv_updateCallbackOffsets(int32_t *offsets, int32_t length, int32_t sourceIndex); - /** Always use fallbacks from codepage to Unicode */ #define TO_U_USE_FALLBACK(useFallback) TRUE #define UCNV_TO_U_USE_FALLBACK(cnv) TRUE @@ -224,41 +237,48 @@ ucnv_updateCallbackOffsets(int32_t *offsets, int32_t length, int32_t sourceIndex #define UCNV_FROM_U_USE_FALLBACK(cnv, c) FROM_U_USE_FALLBACK((cnv)->useFallback, c) /** - * This is a simple implementation of ucnv_getNextUChar() that uses the - * converter's toUnicode() function. - * - * \par - * A surrogate pair from a single byte sequence is always - * combined to a supplementary code point. - * A surrogate pair from consecutive byte sequences is only combined - * if collectPairs is set. This is necessary for SCSU - * but not allowed for most legacy codepages. - * - * @param pArgs The argument structure supplied by ucnv_getNextUChar() - * @param toU A function pointer to the converter's toUnicode() function - * @param collectPairs indicates whether separate surrogate results from - * consecutive byte sequences should be combined into - * a single code point - * @param pErrorCode An ICU error code parameter - * @return The Unicode code point as a result of a conversion of a minimal - * number of input bytes + * Magic number for ucnv_getNextUChar(), returned by a + * getNextUChar() implementation to indicate to use the converter's toUnicode() + * instead of the native function. + * @internal */ -U_CFUNC UChar32 -ucnv_getNextUCharFromToUImpl(UConverterToUnicodeArgs *pArgs, - T_ToUnicodeFunction toU, - UBool collectPairs, - UErrorCode *pErrorCode); +#define UCNV_GET_NEXT_UCHAR_USE_TO_U -9 U_CFUNC void ucnv_getCompleteUnicodeSet(const UConverter *cnv, - USet *set, + USetAdder *sa, UConverterUnicodeSet which, UErrorCode *pErrorCode); U_CFUNC void ucnv_getNonSurrogateUnicodeSet(const UConverter *cnv, - USet *set, + USetAdder *sa, UConverterUnicodeSet which, UErrorCode *pErrorCode); +U_CFUNC void +ucnv_fromUWriteBytes(UConverter *cnv, + const char *bytes, int32_t length, + char **target, const char *targetLimit, + int32_t **offsets, + int32_t sourceIndex, + UErrorCode *pErrorCode); +U_CFUNC void +ucnv_toUWriteUChars(UConverter *cnv, + const UChar *uchars, int32_t length, + UChar **target, const UChar *targetLimit, + int32_t **offsets, + int32_t sourceIndex, + UErrorCode *pErrorCode); + +U_CFUNC void +ucnv_toUWriteCodePoint(UConverter *cnv, + UChar32 c, + UChar **target, const UChar *targetLimit, + int32_t **offsets, + int32_t sourceIndex, + UErrorCode *pErrorCode); + +#endif + #endif /* UCNV_CNV */ diff --git a/icuSources/common/ucnv_err.c b/icuSources/common/ucnv_err.c index be7ef6e1..d28e7495 100644 --- a/icuSources/common/ucnv_err.c +++ b/icuSources/common/ucnv_err.c @@ -1,7 +1,7 @@ /* ***************************************************************************** * - * Copyright (C) 1998-2003, International Business Machines + * Copyright (C) 1998-2004, International Business Machines * Corporation and others. All Rights Reserved. * ***************************************************************************** @@ -15,6 +15,10 @@ * 06/29/2000 helena Major rewrite of the callback APIs. */ +#include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + #include "unicode/ucnv_err.h" #include "unicode/ucnv_cb.h" #include "ucnv_cnv.h" @@ -453,3 +457,5 @@ UCNV_TO_U_CALLBACK_ESCAPE ( ucnv_cbToUWriteUChars(toArgs, uniValueString, valueStringLength, 0, err); } + +#endif diff --git a/icuSources/common/ucnv_ext.c b/icuSources/common/ucnv_ext.c new file mode 100644 index 00000000..ed1bc65d --- /dev/null +++ b/icuSources/common/ucnv_ext.c @@ -0,0 +1,1075 @@ +/* +****************************************************************************** +* +* Copyright (C) 2003-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +****************************************************************************** +* file name: ucnv_ext.c +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2003jun13 +* created by: Markus W. Scherer +* +* Conversion extensions +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION + +#include "unicode/uset.h" +#include "ucnv_bld.h" +#include "ucnv_cnv.h" +#include "ucnv_ext.h" +#include "cmemory.h" + +/* to Unicode --------------------------------------------------------------- */ + +/* + * @return lookup value for the byte, if found; else 0 + */ +static U_INLINE uint32_t +ucnv_extFindToU(const uint32_t *toUSection, int32_t length, uint8_t byte) { + uint32_t word0, word; + int32_t i, start, limit; + + /* check the input byte against the lowest and highest section bytes */ + start=(int32_t)UCNV_EXT_TO_U_GET_BYTE(toUSection[0]); + limit=(int32_t)UCNV_EXT_TO_U_GET_BYTE(toUSection[length-1]); + if(byte1) { + return 0; /* no match of a DBCS sequence in SBCS mode */ + } else if(preLength==1) { + srcLength=0; + } else /* preLength==0 */ { + if(srcLength>1) { + srcLength=1; + } + } + flush=TRUE; + } + + /* we must not remember fallback matches when not using fallbacks */ + + /* match input units until there is a full match or the input is consumed */ + for(;;) { + /* go to the next section */ + toUSection=toUTable+index; + + /* read first pair of the section */ + value=*toUSection++; + length=UCNV_EXT_TO_U_GET_BYTE(value); + value=UCNV_EXT_TO_U_GET_VALUE(value); + if( value!=0 && + (UCNV_EXT_TO_U_IS_ROUNDTRIP(value) || + TO_U_USE_FALLBACK(useFallback)) && + UCNV_EXT_TO_U_VERIFY_SISO_MATCH(sisoState, i+j) + ) { + /* remember longest match so far */ + matchValue=value; + matchLength=i+j; + } + + /* match pre[] then src[] */ + if(iUCNV_EXT_MAX_BYTES) { + /* + * end of the entire input stream, stop with the longest match so far + * or: partial match must not be longer than UCNV_EXT_MAX_BYTES + * because it must fit into state buffers + */ + break; + } else { + /* continue with more input next time */ + return -length; + } + } + + /* search for the current UChar */ + value=ucnv_extFindToU(toUSection, length, b); + if(value==0) { + /* no match here, stop with the longest match so far */ + break; + } else { + if(UCNV_EXT_TO_U_IS_PARTIAL(value)) { + /* partial match, continue */ + index=(int32_t)UCNV_EXT_TO_U_GET_PARTIAL_INDEX(value); + } else { + if( (UCNV_EXT_TO_U_IS_ROUNDTRIP(value) || + TO_U_USE_FALLBACK(useFallback)) && + UCNV_EXT_TO_U_VERIFY_SISO_MATCH(sisoState, i+j) + ) { + /* full match, stop with result */ + matchValue=value; + matchLength=i+j; + } else { + /* full match on fallback not taken, stop with the longest match so far */ + } + break; + } + } + } + + if(matchLength==0) { + /* no match at all */ + return 0; + } + + /* return result */ + *pMatchValue=UCNV_EXT_TO_U_MASK_ROUNDTRIP(matchValue); + return matchLength; +} + +static U_INLINE void +ucnv_extWriteToU(UConverter *cnv, const int32_t *cx, + uint32_t value, + UChar **target, const UChar *targetLimit, + int32_t **offsets, int32_t srcIndex, + UErrorCode *pErrorCode) { + /* output the result */ + if(UCNV_EXT_TO_U_IS_CODE_POINT(value)) { + /* output a single code point */ + ucnv_toUWriteCodePoint( + cnv, UCNV_EXT_TO_U_GET_CODE_POINT(value), + target, targetLimit, + offsets, srcIndex, + pErrorCode); + } else { + /* output a string - with correct data we have resultLength>0 */ + ucnv_toUWriteUChars( + cnv, + UCNV_EXT_ARRAY(cx, UCNV_EXT_TO_U_UCHARS_INDEX, UChar)+ + UCNV_EXT_TO_U_GET_INDEX(value), + UCNV_EXT_TO_U_GET_LENGTH(value), + target, targetLimit, + offsets, srcIndex, + pErrorCode); + } +} + +/* + * get the SI/SO toU state (state 0 is for SBCS, 1 for DBCS), + * or 1 for DBCS-only, + * or -1 if the converter is not SI/SO stateful + * + * Note: For SI/SO stateful converters getting here, + * cnv->mode==0 is equivalent to firstLength==1. + */ +#define UCNV_SISO_STATE(cnv) \ + ((cnv)->sharedData->mbcs.outputType==MBCS_OUTPUT_2_SISO ? (int8_t)(cnv)->mode : \ + (cnv)->sharedData->mbcs.outputType==MBCS_OUTPUT_DBCS_ONLY ? 1 : -1) + +/* + * targettoUBytes, firstLength, + *src, (int32_t)(srcLimit-*src), + &value, + cnv->useFallback, flush); + if(match>0) { + /* advance src pointer for the consumed input */ + *src+=match-firstLength; + + /* write result to target */ + ucnv_extWriteToU(cnv, cx, + value, + target, targetLimit, + offsets, srcIndex, + pErrorCode); + return TRUE; + } else if(match<0) { + /* save state for partial match */ + const char *s; + int32_t j; + + /* copy the first code point */ + s=(const char *)cnv->toUBytes; + cnv->preToUFirstLength=(int8_t)firstLength; + for(j=0; jpreToU[j]=*s++; + } + + /* now copy the newly consumed input */ + s=*src; + match=-match; + for(; jpreToU[j]=*s++; + } + *src=s; /* same as *src=srcLimit; because we reached the end of input */ + cnv->preToULength=(int8_t)match; + return TRUE; + } else /* match==0 no match */ { + return FALSE; + } +} + +U_CFUNC UChar32 +ucnv_extSimpleMatchToU(const int32_t *cx, + const char *source, int32_t length, + UBool useFallback) { + uint32_t value; + int32_t match; + + if(length<=0) { + return 0xffff; + } + + /* try to match */ + match=ucnv_extMatchToU(cx, -1, + source, length, + NULL, 0, + &value, + useFallback, TRUE); + if(match==length) { + /* write result for simple, single-character conversion */ + if(UCNV_EXT_TO_U_IS_CODE_POINT(value)) { + return UCNV_EXT_TO_U_GET_CODE_POINT(value); + } + } + + /* + * return no match because + * - match>0 && value points to string: simple conversion cannot handle multiple code points + * - match>0 && match!=length: not all input consumed, forbidden for this function + * - match==0: no match found in the first place + * - match<0: partial match, not supported for simple conversion (and flush==TRUE) + */ + return 0xfffe; +} + +/* + * continue partial match with new input + * never called for simple, single-character conversion + */ +U_CFUNC void +ucnv_extContinueMatchToU(UConverter *cnv, + UConverterToUnicodeArgs *pArgs, int32_t srcIndex, + UErrorCode *pErrorCode) { + uint32_t value; + int32_t match, length; + + match=ucnv_extMatchToU(cnv->sharedData->mbcs.extIndexes, (int8_t)UCNV_SISO_STATE(cnv), + cnv->preToU, cnv->preToULength, + pArgs->source, (int32_t)(pArgs->sourceLimit-pArgs->source), + &value, + cnv->useFallback, pArgs->flush); + if(match>0) { + if(match>=cnv->preToULength) { + /* advance src pointer for the consumed input */ + pArgs->source+=match-cnv->preToULength; + cnv->preToULength=0; + } else { + /* the match did not use all of preToU[] - keep the rest for replay */ + length=cnv->preToULength-match; + uprv_memmove(cnv->preToU, cnv->preToU+match, length); + cnv->preToULength=(int8_t)-length; + } + + /* write result */ + ucnv_extWriteToU(cnv, cnv->sharedData->mbcs.extIndexes, + value, + &pArgs->target, pArgs->targetLimit, + &pArgs->offsets, srcIndex, + pErrorCode); + } else if(match<0) { + /* save state for partial match */ + const char *s; + int32_t j; + + /* just _append_ the newly consumed input to preToU[] */ + s=pArgs->source; + match=-match; + for(j=cnv->preToULength; jpreToU[j]=*s++; + } + pArgs->source=s; /* same as *src=srcLimit; because we reached the end of input */ + cnv->preToULength=(int8_t)match; + } else /* match==0 */ { + /* + * no match + * + * We need to split the previous input into two parts: + * + * 1. The first codepage character is unmappable - that's how we got into + * trying the extension data in the first place. + * We need to move it from the preToU buffer + * to the error buffer, set an error code, + * and prepare the rest of the previous input for 2. + * + * 2. The rest of the previous input must be converted once we + * come back from the callback for the first character. + * At that time, we have to try again from scratch to convert + * these input characters. + * The replay will be handled by the ucnv.c conversion code. + */ + + /* move the first codepage character to the error field */ + uprv_memcpy(cnv->toUBytes, cnv->preToU, cnv->preToUFirstLength); + cnv->toULength=cnv->preToUFirstLength; + + /* move the rest up inside the buffer */ + length=cnv->preToULength-cnv->preToUFirstLength; + if(length>0) { + uprv_memmove(cnv->preToU, cnv->preToU+cnv->preToUFirstLength, length); + } + + /* mark preToU for replay */ + cnv->preToULength=(int8_t)-length; + + /* set the error code for unassigned */ + *pErrorCode=U_INVALID_CHAR_FOUND; + } +} + +/* from Unicode ------------------------------------------------------------- */ + +/* + * @return index of the UChar, if found; else <0 + */ +static U_INLINE int32_t +ucnv_extFindFromU(const UChar *fromUSection, int32_t length, UChar u) { + int32_t i, start, limit; + + /* binary search */ + start=0; + limit=length; + for(;;) { + i=limit-start; + if(i<=1) { + break; /* done */ + } + /* start=0 + * @param src UChars that can be used to complete a match + * @param srcLength length of src, >=0 + * @param pMatchValue [out] output result value for the match from the data structure + * @param useFallback "use fallback" flag, usually from cnv->useFallback + * @param flush TRUE if the end of the input stream is reached + * @return >1: matched, return value=total match length (number of input units matched) + * 1: matched, no mapping but request for + * (only for the first code point) + * 0: no match + * <0: partial match, return value=negative total match length + * (partial matches are never returned for flush==TRUE) + * (partial matches are never returned as being longer than UCNV_EXT_MAX_UCHARS) + * the matchLength is 2 if only firstCP matched, and >2 if firstCP and + * further code units matched + */ +static int32_t +ucnv_extMatchFromU(const int32_t *cx, + UChar32 firstCP, + const UChar *pre, int32_t preLength, + const UChar *src, int32_t srcLength, + uint32_t *pMatchValue, + UBool useFallback, UBool flush) { + const uint16_t *stage12, *stage3; + const uint32_t *stage3b; + + const UChar *fromUTableUChars, *fromUSectionUChars; + const uint32_t *fromUTableValues, *fromUSectionValues; + + uint32_t value, matchValue; + int32_t i, j, index, length, matchLength; + UChar c; + + if(cx==NULL) { + return 0; /* no extension data, no match */ + } + + /* trie lookup of firstCP */ + index=firstCP>>10; /* stage 1 index */ + if(index>=cx[UCNV_EXT_FROM_U_STAGE_1_LENGTH]) { + return 0; /* the first code point is outside the trie */ + } + + stage12=UCNV_EXT_ARRAY(cx, UCNV_EXT_FROM_U_STAGE_12_INDEX, uint16_t); + stage3=UCNV_EXT_ARRAY(cx, UCNV_EXT_FROM_U_STAGE_3_INDEX, uint16_t); + index=UCNV_EXT_FROM_U(stage12, stage3, index, firstCP); + + stage3b=UCNV_EXT_ARRAY(cx, UCNV_EXT_FROM_U_STAGE_3B_INDEX, uint32_t); + value=stage3b[index]; + if(value==0) { + return 0; + } + + if(UCNV_EXT_TO_U_IS_PARTIAL(value)) { + /* partial match, enter the loop below */ + index=(int32_t)UCNV_EXT_FROM_U_GET_PARTIAL_INDEX(value); + + /* initialize */ + fromUTableUChars=UCNV_EXT_ARRAY(cx, UCNV_EXT_FROM_U_UCHARS_INDEX, UChar); + fromUTableValues=UCNV_EXT_ARRAY(cx, UCNV_EXT_FROM_U_VALUES_INDEX, uint32_t); + + matchValue=0; + i=j=matchLength=0; + + /* we must not remember fallback matches when not using fallbacks */ + + /* match input units until there is a full match or the input is consumed */ + for(;;) { + /* go to the next section */ + fromUSectionUChars=fromUTableUChars+index; + fromUSectionValues=fromUTableValues+index; + + /* read first pair of the section */ + length=*fromUSectionUChars++; + value=*fromUSectionValues++; + if( value!=0 && + (UCNV_EXT_FROM_U_IS_ROUNDTRIP(value) || + FROM_U_USE_FALLBACK(useFallback, firstCP)) + ) { + /* remember longest match so far */ + matchValue=value; + matchLength=2+i+j; + } + + /* match pre[] then src[] */ + if(iUCNV_EXT_MAX_UCHARS) { + /* + * end of the entire input stream, stop with the longest match so far + * or: partial match must not be longer than UCNV_EXT_MAX_UCHARS + * because it must fit into state buffers + */ + break; + } else { + /* continue with more input next time */ + return -(2+length); + } + } + + /* search for the current UChar */ + index=ucnv_extFindFromU(fromUSectionUChars, length, c); + if(index<0) { + /* no match here, stop with the longest match so far */ + break; + } else { + value=fromUSectionValues[index]; + if(UCNV_EXT_FROM_U_IS_PARTIAL(value)) { + /* partial match, continue */ + index=(int32_t)UCNV_EXT_FROM_U_GET_PARTIAL_INDEX(value); + } else { + if( UCNV_EXT_FROM_U_IS_ROUNDTRIP(value) || + FROM_U_USE_FALLBACK(useFallback, firstCP) + ) { + /* full match, stop with result */ + matchValue=value; + matchLength=2+i+j; + } else { + /* full match on fallback not taken, stop with the longest match so far */ + } + break; + } + } + } + + if(matchLength==0) { + /* no match at all */ + return 0; + } + } else /* result from firstCP trie lookup */ { + if( UCNV_EXT_FROM_U_IS_ROUNDTRIP(value) || + FROM_U_USE_FALLBACK(useFallback, firstCP) + ) { + /* full match, stop with result */ + matchValue=value; + matchLength=2; + } else { + /* fallback not taken */ + return 0; + } + } + + if(matchValue&UCNV_EXT_FROM_U_RESERVED_MASK) { + /* do not interpret values with reserved bits used, for forward compatibility */ + return 0; + } + + /* return result */ + if(matchValue==UCNV_EXT_FROM_U_SUBCHAR1) { + return 1; /* assert matchLength==2 */ + } + + *pMatchValue=UCNV_EXT_FROM_U_MASK_ROUNDTRIP(matchValue); + return matchLength; +} + +static U_INLINE void +ucnv_extWriteFromU(UConverter *cnv, const int32_t *cx, + uint32_t value, + char **target, const char *targetLimit, + int32_t **offsets, int32_t srcIndex, + UErrorCode *pErrorCode) { + uint8_t buffer[1+UCNV_EXT_MAX_BYTES]; + const uint8_t *result; + int32_t length, prevLength; + + length=UCNV_EXT_FROM_U_GET_LENGTH(value); + value=(uint32_t)UCNV_EXT_FROM_U_GET_DATA(value); + + /* output the result */ + if(length<=UCNV_EXT_FROM_U_MAX_DIRECT_LENGTH) { + /* + * Generate a byte array and then write it below. + * This is not the fastest possible way, but it should be ok for + * extension mappings, and it is much simpler. + * Offset and overflow handling are only done once this way. + */ + uint8_t *p=buffer+1; /* reserve buffer[0] for shiftByte below */ + switch(length) { + case 3: + *p++=(uint8_t)(value>>16); + case 2: + *p++=(uint8_t)(value>>8); + case 1: + *p++=(uint8_t)value; + default: + break; /* will never occur */ + } + result=buffer+1; + } else { + result=UCNV_EXT_ARRAY(cx, UCNV_EXT_FROM_U_BYTES_INDEX, uint8_t)+value; + } + + /* with correct data we have length>0 */ + + if((prevLength=cnv->fromUnicodeStatus)!=0) { + /* handle SI/SO stateful output */ + uint8_t shiftByte; + + if(prevLength>1 && length==1) { + /* change from double-byte mode to single-byte */ + shiftByte=(uint8_t)UCNV_SI; + cnv->fromUnicodeStatus=1; + } else if(prevLength==1 && length>1) { + /* change from single-byte mode to double-byte */ + shiftByte=(uint8_t)UCNV_SO; + cnv->fromUnicodeStatus=2; + } else { + shiftByte=0; + } + + if(shiftByte!=0) { + /* prepend the shift byte to the result bytes */ + buffer[0]=shiftByte; + if(result!=buffer+1) { + uprv_memcpy(buffer+1, result, length); + } + result=buffer; + ++length; + } + } + + ucnv_fromUWriteBytes(cnv, (const char *)result, length, + target, targetLimit, + offsets, srcIndex, + pErrorCode); +} + +/* + * targetuseFallback, flush); + + /* reject a match if the result is a single byte for DBCS-only */ + if( match>=2 && + !(UCNV_EXT_FROM_U_GET_LENGTH(value)==1 && + cnv->sharedData->mbcs.outputType==MBCS_OUTPUT_DBCS_ONLY) + ) { + /* advance src pointer for the consumed input */ + *src+=match-2; /* remove 2 for the initial code point */ + + /* write result to target */ + ucnv_extWriteFromU(cnv, cx, + value, + target, targetLimit, + offsets, srcIndex, + pErrorCode); + return TRUE; + } else if(match<0) { + /* save state for partial match */ + const UChar *s; + int32_t j; + + /* copy the first code point */ + cnv->preFromUFirstCP=cp; + + /* now copy the newly consumed input */ + s=*src; + match=-match-2; /* remove 2 for the initial code point */ + for(j=0; jpreFromU[j]=*s++; + } + *src=s; /* same as *src=srcLimit; because we reached the end of input */ + cnv->preFromULength=(int8_t)match; + return TRUE; + } else if(match==1) { + /* matched, no mapping but request for */ + cnv->useSubChar1=TRUE; + return FALSE; + } else /* match==0 no match */ { + return FALSE; + } +} + +U_CFUNC int32_t +ucnv_extSimpleMatchFromU(const int32_t *cx, + UChar32 cp, uint32_t *pValue, + UBool useFallback) { + uint32_t value; + int32_t match; + + /* try to match */ + match=ucnv_extMatchFromU(cx, + cp, + NULL, 0, + NULL, 0, + &value, + useFallback, TRUE); + if(match>=2) { + /* write result for simple, single-character conversion */ + int32_t length; + + length=UCNV_EXT_FROM_U_GET_LENGTH(value); + value=(uint32_t)UCNV_EXT_FROM_U_GET_DATA(value); + + if(length<=UCNV_EXT_FROM_U_MAX_DIRECT_LENGTH) { + *pValue=value; + return length; +#if 0 /* not currently used */ + } else if(length==4) { + /* de-serialize a 4-byte result */ + const uint8_t *result=UCNV_EXT_ARRAY(cx, UCNV_EXT_FROM_U_BYTES_INDEX, uint8_t)+value; + *pValue= + ((uint32_t)result[0]<<24)| + ((uint32_t)result[1]<<16)| + ((uint32_t)result[2]<<8)| + result[3]; + return 4; +#endif + } + } + + /* + * return no match because + * - match>1 && resultLength>4: result too long for simple conversion + * - match==1: no match found, preferred + * - match==0: no match found in the first place + * - match<0: partial match, not supported for simple conversion (and flush==TRUE) + */ + return 0; +} + +/* + * continue partial match with new input, requires cnv->preFromUFirstCP>=0 + * never called for simple, single-character conversion + */ +U_CFUNC void +ucnv_extContinueMatchFromU(UConverter *cnv, + UConverterFromUnicodeArgs *pArgs, int32_t srcIndex, + UErrorCode *pErrorCode) { + uint32_t value; + int32_t match; + + match=ucnv_extMatchFromU(cnv->sharedData->mbcs.extIndexes, + cnv->preFromUFirstCP, + cnv->preFromU, cnv->preFromULength, + pArgs->source, (int32_t)(pArgs->sourceLimit-pArgs->source), + &value, + cnv->useFallback, pArgs->flush); + if(match>=2) { + match-=2; /* remove 2 for the initial code point */ + + if(match>=cnv->preFromULength) { + /* advance src pointer for the consumed input */ + pArgs->source+=match-cnv->preFromULength; + cnv->preFromULength=0; + } else { + /* the match did not use all of preFromU[] - keep the rest for replay */ + int32_t length=cnv->preFromULength-match; + uprv_memmove(cnv->preFromU, cnv->preFromU+match, length*U_SIZEOF_UCHAR); + cnv->preFromULength=(int8_t)-length; + } + + /* finish the partial match */ + cnv->preFromUFirstCP=U_SENTINEL; + + /* write result */ + ucnv_extWriteFromU(cnv, cnv->sharedData->mbcs.extIndexes, + value, + &pArgs->target, pArgs->targetLimit, + &pArgs->offsets, srcIndex, + pErrorCode); + } else if(match<0) { + /* save state for partial match */ + const UChar *s; + int32_t j; + + /* just _append_ the newly consumed input to preFromU[] */ + s=pArgs->source; + match=-match-2; /* remove 2 for the initial code point */ + for(j=cnv->preFromULength; jpreFromU[j]=*s++; + } + pArgs->source=s; /* same as *src=srcLimit; because we reached the end of input */ + cnv->preFromULength=(int8_t)match; + } else /* match==0 or 1 */ { + /* + * no match + * + * We need to split the previous input into two parts: + * + * 1. The first code point is unmappable - that's how we got into + * trying the extension data in the first place. + * We need to move it from the preFromU buffer + * to the error buffer, set an error code, + * and prepare the rest of the previous input for 2. + * + * 2. The rest of the previous input must be converted once we + * come back from the callback for the first code point. + * At that time, we have to try again from scratch to convert + * these input characters. + * The replay will be handled by the ucnv.c conversion code. + */ + + if(match==1) { + /* matched, no mapping but request for */ + cnv->useSubChar1=TRUE; + } + + /* move the first code point to the error field */ + cnv->fromUChar32=cnv->preFromUFirstCP; + cnv->preFromUFirstCP=U_SENTINEL; + + /* mark preFromU for replay */ + cnv->preFromULength=-cnv->preFromULength; + + /* set the error code for unassigned */ + *pErrorCode=U_INVALID_CHAR_FOUND; + } +} + +static void +ucnv_extGetUnicodeSetString(const UConverterSharedData *sharedData, + const int32_t *cx, + USetAdder *sa, + UConverterUnicodeSet which, + int32_t minLength, + UChar32 c, + UChar s[UCNV_EXT_MAX_UCHARS], int32_t length, + int32_t sectionIndex, + UErrorCode *pErrorCode) { + const UChar *fromUSectionUChars; + const uint32_t *fromUSectionValues; + + uint32_t value; + int32_t i, count; + + fromUSectionUChars=UCNV_EXT_ARRAY(cx, UCNV_EXT_FROM_U_UCHARS_INDEX, UChar)+sectionIndex; + fromUSectionValues=UCNV_EXT_ARRAY(cx, UCNV_EXT_FROM_U_VALUES_INDEX, uint32_t)+sectionIndex; + + /* read first pair of the section */ + count=*fromUSectionUChars++; + value=*fromUSectionValues++; + + if( value!=0 && + UCNV_EXT_FROM_U_IS_ROUNDTRIP(value) && + UCNV_EXT_FROM_U_GET_LENGTH(value)>=minLength + ) { + if(c>=0) { + /* add the initial code point */ + sa->add(sa->set, c); + } else { + /* add the string so far */ + sa->addString(sa->set, s, length); + } + } + + for(i=0; i=minLength + ) { + sa->addString(sa->set, s, length+1); + } + } +} + +U_CFUNC void +ucnv_extGetUnicodeSet(const UConverterSharedData *sharedData, + USetAdder *sa, + UConverterUnicodeSet which, + UErrorCode *pErrorCode) { + const int32_t *cx; + const uint16_t *stage12, *stage3, *ps2, *ps3; + const uint32_t *stage3b; + + uint32_t value; + int32_t st1, stage1Length, st2, st3, minLength; + + UChar s[UCNV_EXT_MAX_UCHARS]; + UChar32 c; + int32_t length; + + cx=sharedData->mbcs.extIndexes; + if(cx==NULL) { + return; + } + + stage12=UCNV_EXT_ARRAY(cx, UCNV_EXT_FROM_U_STAGE_12_INDEX, uint16_t); + stage3=UCNV_EXT_ARRAY(cx, UCNV_EXT_FROM_U_STAGE_3_INDEX, uint16_t); + stage3b=UCNV_EXT_ARRAY(cx, UCNV_EXT_FROM_U_STAGE_3B_INDEX, uint32_t); + + stage1Length=cx[UCNV_EXT_FROM_U_STAGE_1_LENGTH]; + + /* enumerate the from-Unicode trie table */ + c=0; /* keep track of the current code point while enumerating */ + + if(sharedData->mbcs.outputType==MBCS_OUTPUT_DBCS_ONLY) { + /* DBCS-only, ignore single-byte results */ + minLength=2; + } else { + minLength=1; + } + + /* + * the trie enumeration is almost the same as + * in MBCSGetUnicodeSet() for MBCS_OUTPUT_1 + */ + for(st1=0; st1stage1Length) { + ps2=stage12+st2; + for(st2=0; st2<64; ++st2) { + if((st3=(int32_t)ps2[st2]< entries or other (future?) pseudo-entries + * with an output length of 0, or entries with reserved bits set. + * Recurse for partial results. + */ + do { + value=stage3b[*ps3++]; + if(value==0) { + /* no mapping, do nothing */ + } else if(UCNV_EXT_FROM_U_IS_PARTIAL(value)) { + length=0; + U16_APPEND_UNSAFE(s, length, c); + ucnv_extGetUnicodeSetString( + sharedData, cx, sa, which, minLength, + c, s, length, + (int32_t)UCNV_EXT_FROM_U_GET_PARTIAL_INDEX(value), + pErrorCode); + } else if(((value&(UCNV_EXT_FROM_U_ROUNDTRIP_FLAG|UCNV_EXT_FROM_U_RESERVED_MASK))== + UCNV_EXT_FROM_U_ROUNDTRIP_FLAG) && + UCNV_EXT_FROM_U_GET_LENGTH(value)>=minLength + ) { + sa->add(sa->set, c); + } + } while((++c&0xf)!=0); + } else { + c+=16; /* empty stage 3 block */ + } + } + } else { + c+=1024; /* empty stage 2 block */ + } + } +} + +#endif /* #if !UCONFIG_NO_LEGACY_CONVERSION */ diff --git a/icuSources/common/ucnv_ext.h b/icuSources/common/ucnv_ext.h new file mode 100644 index 00000000..6fb43d96 --- /dev/null +++ b/icuSources/common/ucnv_ext.h @@ -0,0 +1,463 @@ +/* +****************************************************************************** +* +* Copyright (C) 2003-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +****************************************************************************** +* file name: ucnv_ext.h +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2003jun13 +* created by: Markus W. Scherer +* +* Conversion extensions +*/ + +#ifndef __UCNV_EXT_H__ +#define __UCNV_EXT_H__ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + +#include "unicode/ucnv.h" +#include "ucnv_cnv.h" + +/* + * See icuhtml/design/conversion/conversion_extensions.html + * + * Conversion extensions serve two purposes: + * 1. They support m:n mappings. + * 2. They support extension-only conversion files that are used together + * with the regular conversion data in base files. + * + * A base file may contain an extension table (explicitly requested or + * implicitly generated for m:n mappings), but its extension table is not + * used when an extension-only file is used. + * + * It is an error if a base file contains any regular (not extension) mapping + * from the same sequence as a mapping in the extension file + * because the base mapping would hide the extension mapping. + * + * + * Data for conversion extensions: + * + * One set of data structures per conversion direction (to/from Unicode). + * The data structures are sorted by input units to allow for binary search. + * Input sequences of more than one unit are handled like contraction tables + * in collation: + * The lookup value of a unit points to another table that is to be searched + * for the next unit, recursively. + * + * For conversion from Unicode, the initial code point is looked up in + * a 3-stage trie for speed, + * with an additional table of unique results to save space. + * + * Long output strings are stored in separate arrays, with length and index + * in the lookup tables. + * Output results also include a flag distinguishing roundtrip from + * (reverse) fallback mappings. + * + * Input Unicode strings must not begin or end with unpaired surrogates + * to avoid problems with matches on parts of surrogate pairs. + * + * Mappings from multiple characters (code points or codepage state + * table sequences) must be searched preferring the longest match. + * For this to work and be efficient, the variable-width table must contain + * all mappings that contain prefixes of the multiple characters. + * If an extension table is built on top of a base table in another file + * and a base table entry is a prefix of a multi-character mapping, then + * this is an error. + * + * + * Implementation note: + * + * Currently, the parser and several checks in the code limit the number + * of UChars or bytes in a mapping to + * UCNV_EXT_MAX_UCHARS and UCNV_EXT_MAX_BYTES, respectively, + * which are output value limits in the data structure. + * + * For input, this is not strictly necessary - it is a hard limit only for the + * buffers in UConverter that are used to store partial matches. + * + * Input sequences could otherwise be arbitrarily long if partial matches + * need not be stored (i.e., if a sequence does not span several buffers with too + * many units before the last buffer), although then results would differ + * depending on whether partial matches exceed the limits or not, + * which depends on the pattern of buffer sizes. + * + * + * Data structure: + * + * int32_t indexes[>=32]; + * + * Array of indexes and lengths etc. The length of the array is at least 32. + * The actual length is stored in indexes[0] to be forward compatible. + * + * Each index to another array is the number of bytes from indexes[]. + * Each length of an array is the number of array base units in that array. + * + * Some of the structures may not be present, in which case their indexes + * and lengths are 0. + * + * Usage of indexes[i]: + * [0] length of indexes[] + * + * // to Unicode table + * [1] index of toUTable[] (array of uint32_t) + * [2] length of toUTable[] + * [3] index of toUUChars[] (array of UChar) + * [4] length of toUUChars[] + * + * // from Unicode table, not for the initial code point + * [5] index of fromUTableUChars[] (array of UChar) + * [6] index of fromUTableValues[] (array of uint32_t) + * [7] length of fromUTableUChars[] and fromUTableValues[] + * [8] index of fromUBytes[] (array of char) + * [9] length of fromUBytes[] + * + * // from Unicode trie for initial-code point lookup + * [10] index of fromUStage12[] (combined array of uint16_t for stages 1 & 2) + * [11] length of stage 1 portion of fromUStage12[] + * [12] length of fromUStage12[] + * [13] index of fromUStage3[] (array of uint16_t indexes into fromUStage3b[]) + * [14] length of fromUStage3[] + * [15] index of fromUStage3b[] (array of uint32_t like fromUTableValues[]) + * [16] length of fromUStage3b[] + * + * [17] Bit field containing numbers of bytes: + * 31..24 reserved, 0 + * 23..16 maximum input bytes + * 15.. 8 maximum output bytes + * 7.. 0 maximum bytes per UChar + * + * [18] Bit field containing numbers of UChars: + * 31..24 reserved, 0 + * 23..16 maximum input UChars + * 15.. 8 maximum output UChars + * 7.. 0 maximum UChars per byte + * + * [19] Bit field containing flags: + * (extension table unicodeMask) + * 1 UCNV_HAS_SURROGATES flag for the extension table + * 0 UCNV_HAS_SUPPLEMENTARY flag for the extension table + * + * [20]..[30] reserved, 0 + * [31] number of bytes for the entire extension structure + * [>31] reserved; there are indexes[0] indexes + * + * + * uint32_t toUTable[]; + * + * Array of byte/value pairs for lookups for toUnicode conversion. + * The array is partitioned into sections like collation contraction tables. + * Each section contains one word with the number of following words and + * a default value for when the lookup in this section yields no match. + * + * A section is sorted in ascending order of input bytes, + * allowing for fast linear or binary searches. + * The builder may store entries for a contiguous range of byte values + * (compare difference between the first and last one with count), + * which then allows for direct array access. + * The builder should always do this for the initial table section. + * + * Entries may have 0 values, see below. + * No two entries in a section have the same byte values. + * + * Each uint32_t contains an input byte value in bits 31..24 and the + * corresponding lookup value in bits 23..0. + * Interpret the value as follows: + * if(value==0) { + * no match, see below + * } else if(value<0x1f0000) { + * partial match - use value as index to the next toUTable section + * and match the next unit; (value indexes toUTable[value]) + * } else { + * if(bit 23 set) { + * roundtrip; + * } else { + * fallback; + * } + * unset value bit 23; + * if(value<=0x2fffff) { + * (value-0x1f0000) is a code point; (BMP: value<=0x1fffff) + * } else { + * bits 17..0 (value&0x3ffff) is an index to + * the result UChars in toUUChars[]; (0 indexes toUUChars[0]) + * length of the result=((value>>18)-12); (length=0..19) + * } + * } + * + * The first word in a section contains the number of following words in the + * input byte position (bits 31..24, number=1..0xff). + * The value of the initial word is used when the current byte is not found + * in this section. + * If the value is not 0, then it represents a result as above. + * If the value is 0, then the search has to return a shorter match with an + * earlier default value as the result, or result in "unmappable" even for the + * initial bytes. + * If the value is 0 for the initial toUTable entry, then the initial byte + * does not start any mapping input. + * + * + * UChar toUUChars[]; + * + * Contains toUnicode mapping results, stored as sequences of UChars. + * Indexes and lengths stored in the toUTable[]. + * + * + * UChar fromUTableUChars[]; + * uint32_t fromUTableValues[]; + * + * The fromUTable is split into two arrays, but works otherwise much like + * the toUTable. The array is partitioned into sections like collation + * contraction tables and toUTable. + * A row in the table consists of same-index entries in fromUTableUChars[] + * and fromUTableValues[]. + * + * Interpret a value as follows: + * if(value==0) { + * no match, see below + * } else if(value<=0xffffff) { (bits 31..24 are 0) + * partial match - use value as index to the next fromUTable section + * and match the next unit; (value indexes fromUTable[value]) + * } else { + * if(value==0x80000001) { + * return no mapping, but request for ; + * } + * if(bit 31 set) { + * roundtrip; + * } else { + * fallback; + * } + * // bits 30..29 reserved, 0 + * length=(value>>24)&0x1f; (bits 28..24) + * if(length==1..3) { + * bits 23..0 contain 1..3 bytes, padded with 00s on the left; + * } else { + * bits 23..0 (value&0xffffff) is an index to + * the result bytes in fromUBytes[]; (0 indexes fromUBytes[0]) + * } + * } + * + * The first pair in a section contains the number of following pairs in the + * UChar position (16 bits, number=1..0xffff). + * The value of the initial pair is used when the current UChar is not found + * in this section. + * If the value is not 0, then it represents a result as above. + * If the value is 0, then the search has to return a shorter match with an + * earlier default value as the result, or result in "unmappable" even for the + * initial UChars. + * + * If the from Unicode trie is present, then the from Unicode search tables + * are not used for initial code points. + * In this case, the first entries (index 0) in the tables are not used + * (reserved, set to 0) because a value of 0 is used in trie results + * to indicate no mapping. + * + * + * uint16_t fromUStage12[]; + * + * Stages 1 & 2 of a trie that maps an initial code point. + * Indexes in stage 1 are all offset by the length of stage 1 so that the + * same array pointer can be used for both stages. + * If (c>>10)>=(length of stage 1) then c does not start any mapping. + * Same bit distribution as for regular conversion tries. + * + * + * uint16_t fromUStage3[]; + * uint32_t fromUStage3b[]; + * + * Stage 3 of the trie. The first array simply contains indexes to the second, + * which contains words in the same format as fromUTableValues[]. + * Use a stage 3 granularity of 4, which allows for 256k stage 3 entries, + * and 16-bit entries in stage 3 allow for 64k stage 3b entries. + * The stage 3 granularity means that the stage 2 entry needs to be left-shifted. + * + * Two arrays are used because it is expected that more than half of the stage 3 + * entries will be zero. The 16-bit index stage 3 array saves space even + * considering storing a total of 6 bytes per non-zero entry in both arrays + * together. + * Using a stage 3 granularity of >1 diminishes the compactability in that stage + * but provides a larger effective addressing space in stage 2. + * All but the final result stage use 16-bit entries to save space. + * + * fromUStage3b[] contains a zero for "no mapping" at its index 0, + * and may contain UCNV_EXT_FROM_U_SUBCHAR1 at index 1 for " SUB mapping" + * (i.e., "no mapping" with preference for rather than ), + * and all other items are unique non-zero results. + * + * The default value of a fromUTableValues[] section that is referenced + * _directly_ from a fromUStage3b[] item may also be UCNV_EXT_FROM_U_SUBCHAR1, + * but this value must not occur anywhere else in fromUTableValues[] + * because "no mapping" is always a property of a single code point, + * never of multiple. + * + * + * char fromUBytes[]; + * + * Contains fromUnicode mapping results, stored as sequences of chars. + * Indexes and lengths stored in the fromUTableValues[]. + */ +enum { + UCNV_EXT_INDEXES_LENGTH, /* 0 */ + + UCNV_EXT_TO_U_INDEX, /* 1 */ + UCNV_EXT_TO_U_LENGTH, + UCNV_EXT_TO_U_UCHARS_INDEX, + UCNV_EXT_TO_U_UCHARS_LENGTH, + + UCNV_EXT_FROM_U_UCHARS_INDEX, /* 5 */ + UCNV_EXT_FROM_U_VALUES_INDEX, + UCNV_EXT_FROM_U_LENGTH, + UCNV_EXT_FROM_U_BYTES_INDEX, + UCNV_EXT_FROM_U_BYTES_LENGTH, + + UCNV_EXT_FROM_U_STAGE_12_INDEX, /* 10 */ + UCNV_EXT_FROM_U_STAGE_1_LENGTH, + UCNV_EXT_FROM_U_STAGE_12_LENGTH, + UCNV_EXT_FROM_U_STAGE_3_INDEX, + UCNV_EXT_FROM_U_STAGE_3_LENGTH, + UCNV_EXT_FROM_U_STAGE_3B_INDEX, + UCNV_EXT_FROM_U_STAGE_3B_LENGTH, + + UCNV_EXT_COUNT_BYTES, /* 17 */ + UCNV_EXT_COUNT_UCHARS, + UCNV_EXT_FLAGS, + + UCNV_EXT_RESERVED_INDEX, /* 20, moves with additional indexes */ + + UCNV_EXT_SIZE=31, + UCNV_EXT_INDEXES_MIN_LENGTH=32 +}; + +/* get the pointer to an extension array from indexes[index] */ +#define UCNV_EXT_ARRAY(indexes, index, itemType) \ + ((const itemType *)((const char *)(indexes)+(indexes)[index])) + +#define UCNV_GET_MAX_BYTES_PER_UCHAR(indexes) \ + ((indexes)[UCNV_EXT_COUNT_BYTES]&0xff) + +/* internal API ------------------------------------------------------------- */ + +U_CFUNC UBool +ucnv_extInitialMatchToU(UConverter *cnv, const int32_t *cx, + int32_t firstLength, + const char **src, const char *srcLimit, + UChar **target, const UChar *targetLimit, + int32_t **offsets, int32_t srcIndex, + UBool flush, + UErrorCode *pErrorCode); + +U_CFUNC UChar32 +ucnv_extSimpleMatchToU(const int32_t *cx, + const char *source, int32_t length, + UBool useFallback); + +U_CFUNC void +ucnv_extContinueMatchToU(UConverter *cnv, + UConverterToUnicodeArgs *pArgs, int32_t srcIndex, + UErrorCode *pErrorCode); + + +U_CFUNC UBool +ucnv_extInitialMatchFromU(UConverter *cnv, const int32_t *cx, + UChar32 cp, + const UChar **src, const UChar *srcLimit, + char **target, const char *targetLimit, + int32_t **offsets, int32_t srcIndex, + UBool flush, + UErrorCode *pErrorCode); + +U_CFUNC int32_t +ucnv_extSimpleMatchFromU(const int32_t *cx, + UChar32 cp, uint32_t *pValue, + UBool useFallback); + +U_CFUNC void +ucnv_extContinueMatchFromU(UConverter *cnv, + UConverterFromUnicodeArgs *pArgs, int32_t srcIndex, + UErrorCode *pErrorCode); + +U_CFUNC void +ucnv_extGetUnicodeSet(const UConverterSharedData *sharedData, + USetAdder *sa, + UConverterUnicodeSet which, + UErrorCode *pErrorCode); + +/* toUnicode helpers -------------------------------------------------------- */ + +#define UCNV_EXT_TO_U_BYTE_SHIFT 24 +#define UCNV_EXT_TO_U_VALUE_MASK 0xffffff +#define UCNV_EXT_TO_U_MIN_CODE_POINT 0x1f0000 +#define UCNV_EXT_TO_U_MAX_CODE_POINT 0x2fffff +#define UCNV_EXT_TO_U_ROUNDTRIP_FLAG ((uint32_t)1<<23) +#define UCNV_EXT_TO_U_INDEX_MASK 0x3ffff +#define UCNV_EXT_TO_U_LENGTH_SHIFT 18 +#define UCNV_EXT_TO_U_LENGTH_OFFSET 12 + +/* maximum number of indexed UChars */ +#define UCNV_EXT_MAX_UCHARS 19 + +#define UCNV_EXT_TO_U_MAKE_WORD(byte, value) (((uint32_t)(byte)<>UCNV_EXT_TO_U_BYTE_SHIFT) +#define UCNV_EXT_TO_U_GET_VALUE(word) ((word)&UCNV_EXT_TO_U_VALUE_MASK) + +#define UCNV_EXT_TO_U_IS_PARTIAL(value) ((value)>UCNV_EXT_TO_U_LENGTH_SHIFT)-UCNV_EXT_TO_U_LENGTH_OFFSET) + +/* fromUnicode helpers ------------------------------------------------------ */ + +/* most trie constants are shared with ucnvmbcs.h */ + +/* see similar utrie.h UTRIE_INDEX_SHIFT and UTRIE_DATA_GRANULARITY */ +#define UCNV_EXT_STAGE_2_LEFT_SHIFT 2 +#define UCNV_EXT_STAGE_3_GRANULARITY 4 + +/* trie access, returns the stage 3 value=index to stage 3b; s1Index=c>>10 */ +#define UCNV_EXT_FROM_U(stage12, stage3, s1Index, c) \ + (stage3)[ ((int32_t)(stage12)[ (stage12)[s1Index] +(((c)>>4)&0x3f) ]< (impossible roundtrip to 0 bytes, value 01) */ +#define UCNV_EXT_FROM_U_SUBCHAR1 0x80000001 + +/* at most 3 bytes in the lower part of the value */ +#define UCNV_EXT_FROM_U_MAX_DIRECT_LENGTH 3 + +/* maximum number of indexed bytes */ +#define UCNV_EXT_MAX_BYTES 0x1f + +#define UCNV_EXT_FROM_U_IS_PARTIAL(value) (((value)>>UCNV_EXT_FROM_U_LENGTH_SHIFT)==0) +#define UCNV_EXT_FROM_U_GET_PARTIAL_INDEX(value) (value) + +#define UCNV_EXT_FROM_U_IS_ROUNDTRIP(value) (((value)&UCNV_EXT_FROM_U_ROUNDTRIP_FLAG)!=0) +#define UCNV_EXT_FROM_U_MASK_ROUNDTRIP(value) ((value)&~UCNV_EXT_FROM_U_ROUNDTRIP_FLAG) + +/* use after masking off the roundtrip flag */ +#define UCNV_EXT_FROM_U_GET_LENGTH(value) (int32_t)(((value)>>UCNV_EXT_FROM_U_LENGTH_SHIFT)&UCNV_EXT_MAX_BYTES) + +/* get bytes or bytes index */ +#define UCNV_EXT_FROM_U_GET_DATA(value) ((value)&UCNV_EXT_FROM_U_DATA_MASK) + +#endif + +#endif diff --git a/icuSources/common/ucnv_imp.h b/icuSources/common/ucnv_imp.h index d697a398..0f06c1e2 100644 --- a/icuSources/common/ucnv_imp.h +++ b/icuSources/common/ucnv_imp.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -21,6 +21,10 @@ #define UCNV_IMP_H #include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + +#include "unicode/uloc.h" #include "ucnv_bld.h" /* figures out if we need to go to file to read in the data tables. @@ -55,6 +59,21 @@ ucnv_createConverterFromSharedData(UConverter *myUConverter, UConverterSharedDat UConverter* ucnv_createConverterFromPackage(const char *packageName, const char *converterName, UErrorCode *err); +typedef struct { + char cnvName[UCNV_MAX_CONVERTER_NAME_LENGTH], locale[ULOC_FULLNAME_CAPACITY]; + const char *realName; + uint32_t options; +} UConverterLookupData; + +/** + * Load a converter but do not create a UConverter object. + * Simply return the UConverterSharedData. + * Performs alias lookup etc. + * @internal + */ +UConverterSharedData * +ucnv_loadSharedData(const char *converterName, UConverterLookupData *lookup, UErrorCode * err); + /** * This may unload the shared data in a thread safe manner. * This will only unload the data if no other converters are sharing it. @@ -68,13 +87,6 @@ ucnv_unloadSharedDataIfReady(UConverterSharedData *sharedData); void ucnv_incrementRefCount(UConverterSharedData *sharedData); - -/* returns true if "name" is in algorithmicConverterNames - * @param name The converter name. - * @return TRUE if "name" is in algorithmicConverterNames. - */ -UBool ucnv_isDataBasedConverter (const char *name); - /* Copy the string that is represented by the UConverterPlatform enum * @param platformString An output buffer * @param platform An enum representing a platform @@ -82,5 +94,6 @@ UBool ucnv_isDataBasedConverter (const char *name); */ int32_t ucnv_copyPlatformString(char *platformString, UConverterPlatform platform); +#endif #endif /* _UCNV_IMP */ diff --git a/icuSources/common/ucnv_io.c b/icuSources/common/ucnv_io.c index a313ef5e..a86af8f5 100644 --- a/icuSources/common/ucnv_io.c +++ b/icuSources/common/ucnv_io.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -28,11 +28,16 @@ */ #include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + #include "unicode/putil.h" #include "unicode/ucnv.h" /* This file implements ucnv_xXXX() APIs */ #include "unicode/udata.h" #include "umutex.h" +#include "uarrsort.h" +#include "udataswp.h" #include "cstring.h" #include "cmemory.h" #include "ucnv_io.h" @@ -51,14 +56,18 @@ * First there is the size of the Table of Contents (TOC). The TOC * entries contain the size of each section. In order to find the offset * you just need to sum up the previous offsets. + * The TOC length and entries are an array of uint32_t values. + * The first section after the TOC starts immediately after the TOC. * * 1) This section contains a list of converters. This list contains indexes * into the string table for the converter name. The index of this list is * also used by other sections, which are mentioned later on. + * This list is not sorted. * * 2) This section contains a list of tags. This list contains indexes * into the string table for the tag name. The index of this list is * also used by other sections, which are mentioned later on. + * This list is in priority order of standards. * * 3) This section contains a list of sorted unique aliases. This * list contains indexes into the string table for the alias name. The @@ -74,7 +83,7 @@ * an alias mapped to this converter is ambiguous. See UCNV_CONVERTER_INDEX_MASK * and UCNV_AMBIGUOUS_ALIAS_MAP_BIT for more information. This section is * the predigested form of the 5th section so that an alias lookup can be fast. - * + * * 5) This section contains a 2D array with indexes to the 6th section. This * section is the full form of all alias mappings. The column index is the * index into the converter list (column header). The row index is the index @@ -130,18 +139,18 @@ * -------------------------------------------. * T /##########################################/| * a / # # /# - * g / # ## ## ### # ### ### ### #/ - * s / # ##### #### ## ## #/# - * / ### # # ## # # # ### # # #/## + * g / # ## ## ### # ### ### ### #/ + * s / # ##### #### ## ## #/# + * / ### # # ## # # # ### # # #/## * ------------------------------------------/# # * A |### # # ## # # # ### # # #|# # * l |# # # # # ## # #|# # * i |# # # # # # #|# * a |# #|# * s | #|# - * e - * s - * + * e + * s + * */ /** @@ -157,6 +166,20 @@ static const char DATA_TYPE[] = "icu"; static UDataMemory *gAliasData=NULL; +enum { + tocLengthIndex=0, + converterListIndex=1, + tagListIndex=2, + aliasListIndex=3, + untaggedConvArrayIndex=4, + taggedAliasArrayIndex=5, + taggedAliasListsIndex=6, + reservedIndex1=7, + stringTableIndex=8, + minTocLength=8, /* min. tocLength in the file, does not count the tocLengthIndex! */ + offsetsCount /* length of the swapper's temporary offsets[] */ +}; + static const uint16_t *gConverterList = NULL; static const uint16_t *gTagList = NULL; static const uint16_t *gAliasList = NULL; @@ -196,6 +219,37 @@ isAcceptable(void *context, pInfo->formatVersion[0]==3); } +static UBool U_CALLCONV ucnv_io_cleanup(void) +{ + if (gAliasData) { + udata_close(gAliasData); + gAliasData = NULL; + } + + ucnv_io_flushAvailableConverterCache(); + + gConverterListSize = 0; + gTagListSize = 0; + gAliasListSize = 0; + gUntaggedConvArraySize = 0; + gTaggedAliasArraySize = 0; + gTaggedAliasListsSize = 0; + gStringTableSize = 0; + + gConverterList = NULL; + gTagList = NULL; + gAliasList = NULL; + gUntaggedConvArray = NULL; + gTaggedAliasArray = NULL; + gTaggedAliasLists = NULL; + gStringTable = NULL; + + gDefaultConverterName = NULL; + gDefaultConverterNameBuffer[0] = 0; + + return TRUE; /* Everything was cleaned up */ +} + static UBool haveAliasData(UErrorCode *pErrorCode) { int haveData; @@ -224,7 +278,7 @@ haveAliasData(UErrorCode *pErrorCode) { table = (const uint16_t *)udata_getMemory(data); tableStart = ((const uint32_t *)(table))[0]; - if (tableStart < 8) { + if (tableStart < minTocLength) { *pErrorCode = U_INVALID_FORMAT_ERROR; udata_close(data); return FALSE; @@ -269,6 +323,7 @@ haveAliasData(UErrorCode *pErrorCode) { currOffset += reservedSize1; gStringTable = table + currOffset; + ucln_common_registerCleanup(UCLN_COMMON_UCNV_IO, ucnv_io_cleanup); } umtx_unlock(NULL); @@ -293,39 +348,6 @@ isAlias(const char *alias, UErrorCode *pErrorCode) { } } -UBool -ucnv_io_cleanup() -{ - if (gAliasData) { - udata_close(gAliasData); - gAliasData = NULL; - } - - ucnv_io_flushAvailableConverterCache(); - - gConverterListSize = 0; - gTagListSize = 0; - gAliasListSize = 0; - gUntaggedConvArraySize = 0; - gTaggedAliasArraySize = 0; - gTaggedAliasListsSize = 0; - gStringTableSize = 0; - - gConverterList = NULL; - gTagList = NULL; - gAliasList = NULL; - gUntaggedConvArray = NULL; - gTaggedAliasArray = NULL; - gTaggedAliasLists = NULL; - gStringTable = NULL; - - gDefaultConverterName = NULL; - gDefaultConverterNameBuffer[0] = 0; - - return TRUE; /* Everything was cleaned up */ -} - - static uint32_t getTagNumber(const char *tagname) { if (gTagList) { uint32_t tagNum; @@ -341,18 +363,36 @@ static uint32_t getTagNumber(const char *tagname) { /* @see ucnv_compareNames */ U_CFUNC char * U_EXPORT2 -ucnv_io_stripForCompare(char *dst, const char *name) { +ucnv_io_stripASCIIForCompare(char *dst, const char *name) { char c1 = *name; char *dstItr = dst; while (c1) { /* Ignore delimiters '-', '_', and ' ' */ - while ((c1 = *name) == '-' || c1 == '_' || c1 == ' ') { + while ((c1 = *name) == 0x2d || c1 == 0x5f || c1 == 0x20) { ++name; } /* lowercase for case-insensitive comparison */ - *(dstItr++) = uprv_tolower(c1); + *(dstItr++) = uprv_asciitolower(c1); + ++name; + } + return dst; +} + +U_CFUNC char * U_EXPORT2 +ucnv_io_stripEBCDICForCompare(char *dst, const char *name) { + char c1 = *name; + char *dstItr = dst; + + while (c1) { + /* Ignore delimiters '-', '_', and ' ' */ + while ((c1 = *name) == 0x60 || c1 == 0x6d || c1 == 0x40) { + ++name; + } + + /* lowercase for case-insensitive comparison */ + *(dstItr++) = uprv_ebcdictolower(c1); ++name; } return dst; @@ -363,12 +403,12 @@ ucnv_io_stripForCompare(char *dst, const char *name) { * is case-insensitive. It also ignores the characters '-', '_', and * ' ' (dash, underscore, and space). Thus the strings "UTF-8", * "utf_8", and "Utf 8" are exactly equivalent. - * + * * This is a symmetrical (commutative) operation; order of arguments * is insignificant. This is an important property for sorting the * list (when the list is preprocessed into binary form) and for * performing binary searches on it at run time. - * + * * @param name1 a converter name or alias, zero-terminated * @param name2 a converter name or alias, zero-terminated * @return 0 if the names match, or a negative value if the name1 @@ -395,7 +435,7 @@ ucnv_compareNames(const char *name1, const char *name2) { if ((c1|c2)==0) { return 0; } - + /* Case-insensitive comparison */ rc = (int)(unsigned char)uprv_tolower(c1) - (int)(unsigned char)uprv_tolower(c2); @@ -414,21 +454,21 @@ ucnv_compareNames(const char *name1, const char *name2) { static U_INLINE uint32_t findConverter(const char *alias, UErrorCode *pErrorCode) { uint32_t mid, start, limit; - uint32_t lastMid; + uint32_t lastMid; int result; /* do a binary search for the alias */ start = 0; limit = gUntaggedConvArraySize; mid = limit; - lastMid = UINT32_MAX; + lastMid = UINT32_MAX; for (;;) { mid = (uint32_t)((start + limit) / 2); - if (lastMid == mid) { /* Have we moved? */ - break; /* We haven't moved, and it wasn't found. */ - } - lastMid = mid; + if (lastMid == mid) { /* Have we moved? */ + break; /* We haven't moved, and it wasn't found. */ + } + lastMid = mid; result = ucnv_compareNames(alias, GET_STRING(gAliasList[mid])); if (result < 0) { @@ -454,7 +494,7 @@ findConverter(const char *alias, UErrorCode *pErrorCode) { * Is this alias in this list? * alias and listOffset should be non-NULL. */ -static U_INLINE UBool +static U_INLINE UBool isAliasInList(const char *alias, uint32_t listOffset) { if (listOffset) { uint32_t currAlias; @@ -612,7 +652,7 @@ ucnv_io_nextStandardAliases(UEnumeration *enumerator, if (myContext->listIdx < listCount) { const char *myStr = GET_STRING(currList[myContext->listIdx++]); if (resultLength) { - *resultLength = uprv_strlen(myStr); + *resultLength = (int32_t)uprv_strlen(myStr); } return myStr; } @@ -848,6 +888,7 @@ static UBool haveAvailableConverterList(UErrorCode *pErrorCode) { if (gAvailableConverters == NULL) { gAvailableConverters = localConverterList; gAvailableConverterCount = localConverterCount; + /* haveData should have already registered the cleanup function */ } else { uprv_free((char **)localConverterList); @@ -891,7 +932,7 @@ ucnv_io_nextAllConverters(UEnumeration *enumerator, if (*myContext < gConverterListSize) { const char *myStr = GET_STRING(gConverterList[(*myContext)++]); if (resultLength) { - *resultLength = uprv_strlen(myStr); + *resultLength = (int32_t)uprv_strlen(myStr); } return myStr; } @@ -971,9 +1012,7 @@ ucnv_io_getDefaultConverterName() { UConverter *cnv = NULL; int32_t length = 0; - umtx_lock(NULL); name = uprv_getDefaultCodepage(); - umtx_unlock(NULL); /* if the name is there, test it out and get the canonical name with options */ if(name != NULL) { @@ -988,7 +1027,7 @@ ucnv_io_getDefaultConverterName() { || length>=sizeof(gDefaultConverterNameBuffer)) { /* Panic time, let's use a fallback. */ -#if (U_CHARSET_FAMILY == U_ASCII_FAMILY) +#if (U_CHARSET_FAMILY == U_ASCII_FAMILY) name = "US-ASCII"; /* there is no 'algorithmic' converter for EBCDIC */ #elif defined(OS390) @@ -1006,6 +1045,7 @@ ucnv_io_getDefaultConverterName() { gDefaultConverterNameBuffer[length]=0; gDefaultConverterName = gDefaultConverterNameBuffer; name = gDefaultConverterName; + ucln_common_registerCleanup(UCLN_COMMON_UCNV_IO, ucnv_io_cleanup); umtx_unlock(NULL); /* The close may make the current name go away. */ @@ -1019,7 +1059,9 @@ U_CFUNC void ucnv_io_setDefaultConverterName(const char *converterName) { if(converterName==NULL) { /* reset to the default codepage */ + umtx_lock(NULL); gDefaultConverterName=NULL; + umtx_unlock(NULL); } else { UErrorCode errorCode=U_ZERO_ERROR; const char *name=ucnv_io_getConverterName(converterName, &errorCode); @@ -1038,11 +1080,261 @@ ucnv_io_setDefaultConverterName(const char *converterName) { gDefaultConverterName=gDefaultConverterNameBuffer; } } - umtx_unlock(NULL); } } +/* alias table swapping ----------------------------------------------------- */ + +typedef char * U_CALLCONV StripForCompareFn(char *dst, const char *name); + +/* + * row of a temporary array + * + * gets platform-endian charset string indexes and sorting indexes; + * after sorting this array by strings, the actual arrays are permutated + * according to the sorting indexes + */ +typedef struct TempRow { + uint16_t strIndex, sortIndex; +} TempRow; + +typedef struct TempAliasTable { + const char *chars; + TempRow *rows; + uint16_t *resort; + StripForCompareFn *stripForCompare; +} TempAliasTable; + +enum { + STACK_ROW_CAPACITY=500 +}; + +static int32_t +io_compareRows(const void *context, const void *left, const void *right) { + char strippedLeft[UCNV_MAX_CONVERTER_NAME_LENGTH], + strippedRight[UCNV_MAX_CONVERTER_NAME_LENGTH]; + + TempAliasTable *tempTable=(TempAliasTable *)context; + const char *chars=tempTable->chars; + + return (int32_t)uprv_strcmp(tempTable->stripForCompare(strippedLeft, chars+2*((const TempRow *)left)->strIndex), + tempTable->stripForCompare(strippedRight, chars+2*((const TempRow *)right)->strIndex)); +} + +U_CAPI int32_t U_EXPORT2 +ucnv_swapAliases(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const UDataInfo *pInfo; + int32_t headerSize; + + const uint16_t *inTable; + uint32_t toc[offsetsCount]; + uint32_t offsets[offsetsCount]; /* 16-bit-addressed offsets from inTable/outTable */ + uint32_t i, count, tocLength, topOffset; + + TempRow rows[STACK_ROW_CAPACITY]; + uint16_t resort[STACK_ROW_CAPACITY]; + TempAliasTable tempTable; + + /* udata_swapDataHeader checks the arguments */ + headerSize=udata_swapDataHeader(ds, inData, length, outData, pErrorCode); + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + + /* check data format and format version */ + pInfo=(const UDataInfo *)((const char *)inData+4); + if(!( + pInfo->dataFormat[0]==0x43 && /* dataFormat="CvAl" */ + pInfo->dataFormat[1]==0x76 && + pInfo->dataFormat[2]==0x41 && + pInfo->dataFormat[3]==0x6c && + pInfo->formatVersion[0]==3 + )) { + udata_printError(ds, "ucnv_swapAliases(): data format %02x.%02x.%02x.%02x (format version %02x) is not an alias table\n", + pInfo->dataFormat[0], pInfo->dataFormat[1], + pInfo->dataFormat[2], pInfo->dataFormat[3], + pInfo->formatVersion[0]); + *pErrorCode=U_UNSUPPORTED_ERROR; + return 0; + } + + /* an alias table must contain at least the table of contents array */ + if(length>=0 && (length-headerSize)<4*(1+minTocLength)) { + udata_printError(ds, "ucnv_swapAliases(): too few bytes (%d after header) for an alias table\n", + length-headerSize); + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + + inTable=(const uint16_t *)((const char *)inData+headerSize); + toc[tocLengthIndex]=tocLength=ds->readUInt32(((const uint32_t *)inTable)[tocLengthIndex]); + if(tocLengthreadUInt32(((const uint32_t *)inTable)[i]); + } + + /* compute offsets */ + offsets[tocLengthIndex]=0; + offsets[converterListIndex]=2*(1+tocLength); /* count two 16-bit units per toc entry */ + for(i=tagListIndex; i<=stringTableIndex; ++i) { + offsets[i]=offsets[i-1]+toc[i-1]; + } + + /* compute the overall size of the after-header data, in numbers of 16-bit units */ + topOffset=offsets[i-1]+toc[i-1]; + + if(length>=0) { + uint16_t *outTable; + const uint16_t *p, *p2; + uint16_t *q, *q2; + uint16_t oldIndex; + + if((length-headerSize)<(2*(int32_t)topOffset)) { + udata_printError(ds, "ucnv_swapAliases(): too few bytes (%d after header) for an alias table\n", + length-headerSize); + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + + outTable=(uint16_t *)((char *)outData+headerSize); + + /* swap the entire table of contents */ + ds->swapArray32(ds, inTable, 4*(1+tocLength), outTable, pErrorCode); + + /* swap strings */ + ds->swapInvChars(ds, inTable+offsets[stringTableIndex], 2*(int32_t)toc[stringTableIndex], + outTable+offsets[stringTableIndex], pErrorCode); + if(U_FAILURE(*pErrorCode)) { + udata_printError(ds, "ucnv_swapAliases().swapInvChars(charset names) failed - %s\n", + u_errorName(*pErrorCode)); + return 0; + } + + if(ds->inCharset==ds->outCharset) { + /* no need to sort, just swap all 16-bit values together */ + ds->swapArray16(ds, + inTable+offsets[converterListIndex], + 2*(int32_t)(offsets[stringTableIndex]-offsets[converterListIndex]), + outTable+offsets[converterListIndex], + pErrorCode); + } else { + /* allocate the temporary table for sorting */ + count=toc[aliasListIndex]; + + tempTable.chars=(const char *)(outTable+offsets[stringTableIndex]); /* sort by outCharset */ + + if(count<=STACK_ROW_CAPACITY) { + tempTable.rows=rows; + tempTable.resort=resort; + } else { + tempTable.rows=(TempRow *)uprv_malloc(count*sizeof(TempRow)+count*2); + if(tempTable.rows==NULL) { + udata_printError(ds, "ucnv_swapAliases(): unable to allocate memory for sorting tables (max length: %u)\n", + count); + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + return 0; + } + tempTable.resort=(uint16_t *)(tempTable.rows+count); + } + + if(ds->outCharset==U_ASCII_FAMILY) { + tempTable.stripForCompare=ucnv_io_stripASCIIForCompare; + } else /* U_EBCDIC_FAMILY */ { + tempTable.stripForCompare=ucnv_io_stripEBCDICForCompare; + } + + /* + * Sort unique aliases+mapped names. + * + * We need to sort the list again by outCharset strings because they + * sort differently for different charset families. + * First we set up a temporary table with the string indexes and + * sorting indexes and sort that. + * Then we permutate and copy/swap the actual values. + */ + p=inTable+offsets[aliasListIndex]; + q=outTable+offsets[aliasListIndex]; + + p2=inTable+offsets[untaggedConvArrayIndex]; + q2=outTable+offsets[untaggedConvArrayIndex]; + + for(i=0; ireadUInt16(p[i]); + tempTable.rows[i].sortIndex=(uint16_t)i; + } + + uprv_sortArray(tempTable.rows, (int32_t)count, sizeof(TempRow), + io_compareRows, &tempTable, + FALSE, pErrorCode); + + if(U_SUCCESS(*pErrorCode)) { + /* copy/swap/permutate items */ + if(p!=q) { + for(i=0; iswapArray16(ds, p+oldIndex, 2, q+i, pErrorCode); + ds->swapArray16(ds, p2+oldIndex, 2, q2+i, pErrorCode); + } + } else { + /* + * If we swap in-place, then the permutation must use another + * temporary array (tempTable.resort) + * before the results are copied to the outBundle. + */ + uint16_t *r=tempTable.resort; + + for(i=0; iswapArray16(ds, p+oldIndex, 2, r+i, pErrorCode); + } + uprv_memcpy(q, r, 2*count); + + for(i=0; iswapArray16(ds, p2+oldIndex, 2, r+i, pErrorCode); + } + uprv_memcpy(q2, r, 2*count); + } + } + + if(tempTable.rows!=rows) { + uprv_free(tempTable.rows); + } + + if(U_FAILURE(*pErrorCode)) { + udata_printError(ds, "ucnv_swapAliases().uprv_sortArray(%u items) failed - %s\n", + count, u_errorName(*pErrorCode)); + return 0; + } + + /* swap remaining 16-bit values */ + ds->swapArray16(ds, + inTable+offsets[converterListIndex], + 2*(int32_t)(offsets[aliasListIndex]-offsets[converterListIndex]), + outTable+offsets[converterListIndex], + pErrorCode); + ds->swapArray16(ds, + inTable+offsets[taggedAliasArrayIndex], + 2*(int32_t)(offsets[stringTableIndex]-offsets[taggedAliasArrayIndex]), + outTable+offsets[taggedAliasArrayIndex], + pErrorCode); + } + } + + return headerSize+2*(int32_t)topOffset; +} + +#endif + /* * Hey, Emacs, please set the following: * @@ -1051,4 +1343,3 @@ ucnv_io_setDefaultConverterName(const char *converterName) { * End: * */ - diff --git a/icuSources/common/ucnv_io.h b/icuSources/common/ucnv_io.h index fe85950f..7ae6def4 100644 --- a/icuSources/common/ucnv_io.h +++ b/icuSources/common/ucnv_io.h @@ -1,6 +1,6 @@ /* ********************************************************************** - * Copyright (C) 1999-2003, International Business Machines + * Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -15,20 +15,36 @@ #include "unicode/utypes.h" +#if !UCONFIG_NO_CONVERSION + +#include "udataswp.h" + #define UCNV_AMBIGUOUS_ALIAS_MAP_BIT 0x8000 #define UCNV_CONVERTER_INDEX_MASK 0xFFF #define UCNV_NUM_RESERVED_TAGS 2 #define UCNV_NUM_HIDDEN_TAGS 1 /** + * \var ucnv_io_stripForCompare * Remove the underscores, dashes and spaces from the name, and convert * the name to lower case. * @param dst The destination buffer, which is <= the buffer of name. * @param dst The destination buffer, which is <= the buffer of name. * @return the destination buffer. */ +#if U_CHARSET_FAMILY==U_ASCII_FAMILY +# define ucnv_io_stripForCompare ucnv_io_stripASCIIForCompare +#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY +# define ucnv_io_stripForCompare ucnv_io_stripEBCDICForCompare +#else +# error U_CHARSET_FAMILY is not valid +#endif + +U_CFUNC char * U_EXPORT2 +ucnv_io_stripASCIIForCompare(char *dst, const char *name); + U_CFUNC char * U_EXPORT2 -ucnv_io_stripForCompare(char *dst, const char *name); +ucnv_io_stripEBCDICForCompare(char *dst, const char *name); /** * Map a converter alias name to a canonical converter name. @@ -137,6 +153,17 @@ ucnv_io_getDefaultConverterName(void); U_CFUNC void ucnv_io_setDefaultConverterName(const char *name); +/** + * Swap an ICU converter alias table. See ucnv_io.c. + * @internal + */ +U_CAPI int32_t U_EXPORT2 +ucnv_swapAliases(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode); + +#endif + #endif /* _UCNV_IO */ /* diff --git a/icuSources/common/ucnv_lmb.c b/icuSources/common/ucnv_lmb.c index 465040f8..e9942a4b 100644 --- a/icuSources/common/ucnv_lmb.c +++ b/icuSources/common/ucnv_lmb.c @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2000-2003, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucnv_lmb.cpp @@ -25,14 +25,20 @@ #include "unicode/utypes.h" -#if !UCONFIG_NO_LEGACY_CONVERSION +#if !UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION -#include "cmemory.h" #include "unicode/ucnv_err.h" -#include "ucnv_bld.h" #include "unicode/ucnv.h" +#include "unicode/uset.h" +#include "cmemory.h" +#include "cstring.h" +#include "uassert.h" +#include "ucnv_imp.h" +#include "ucnv_bld.h" #include "ucnv_cnv.h" +#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) + /* LMBCS @@ -218,7 +224,13 @@ Because of the extensive use of other character sets, the LMBCS converter keeps a mapping between optimization groups and IBM character sets, so that ICU converters can be created and used as needed. */ -static const char * const OptGroupByteToCPName[ULMBCS_CTRLOFFSET] = { +/* As you can see, even though any byte below 0x20 could be an optimization +byte, only those at 0x13 or below can map to an actual converter. To limit +some loops and searches, we define a value for that last group converter:*/ + +#define ULMBCS_GRP_LAST 0x13 /* last LMBCS group that has a converter */ + +static const char * const OptGroupByteToCPName[ULMBCS_GRP_LAST + 1] = { /* 0x0000 */ "lmb-excp", /* internal home for the LOTUS exceptions list */ /* 0x0001 */ "ibm-850", /* 0x0002 */ "ibm-851", @@ -244,12 +256,6 @@ static const char * const OptGroupByteToCPName[ULMBCS_CTRLOFFSET] = { and 0x0019, the 1-2-3 system range control char */ }; -/* As you can see, even though any byte below 0x20 could be an optimization -byte, only those at 0x13 or below can map to an actual converter. To limit -some loops and searches, we define a value for that last group converter:*/ - -#define ULMBCS_GRP_LAST 0x13 /* last LMBCS group that has a converter */ - /* That's approximately all the data that's needed for translating LMBCS to Unicode. @@ -480,7 +486,7 @@ FindLMBCSLocale(const char *LocaleID) if (*pTable->LocaleID == *LocaleID) /* Check only first char for speed */ { /* First char matches - check whole name, for entry-length */ - if (strncmp(pTable->LocaleID, LocaleID, strlen(pTable->LocaleID)) == 0) + if (uprv_strncmp(pTable->LocaleID, LocaleID, strlen(pTable->LocaleID)) == 0) return pTable->OptGroup; } else @@ -505,6 +511,13 @@ FindLMBCSLocale(const char *LocaleID) the definitions of these structures, see unicode\ucnv_bld.h */ +typedef struct + { + UConverterSharedData *OptGrpConverter[ULMBCS_GRP_LAST+1]; /* Converter per Opt. grp. */ + uint8_t OptGroup; /* default Opt. grp. for this LMBCS session */ + uint8_t localeConverterIndex; /* reasonable locale match for index */ + } +UConverterDataLMBCS; #define DECLARE_LMBCS_DATA(n) \ @@ -518,17 +531,17 @@ static const UConverterImpl _LMBCSImpl##n={\ _LMBCSToUnicodeWithOffsets,\ _LMBCSFromUnicode,\ _LMBCSFromUnicode,\ - _LMBCSGetNextUChar,\ NULL,\ NULL,\ NULL,\ NULL,\ - ucnv_getCompleteUnicodeSet\ + _LMBCSSafeClone,\ + _LMBCSGetUnicodeSet\ };\ static const UConverterStaticData _LMBCSStaticData##n={\ sizeof(UConverterStaticData),\ "LMBCS-" #n,\ - 0, UCNV_IBM, UCNV_LMBCS_##n, 1, 2,\ + 0, UCNV_IBM, UCNV_LMBCS_##n, 1, 3,\ { 0x3f, 0, 0, 0 },1,FALSE,FALSE,0,0,{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} \ };\ const UConverterSharedData _LMBCSData##n={\ @@ -558,21 +571,32 @@ _LMBCSOpenWorker(UConverter* _this, ulmbcs_byte_t OptGroup ) { - UConverterDataLMBCS * extraInfo = (UConverterDataLMBCS*)uprv_malloc (sizeof (UConverterDataLMBCS)); - if(extraInfo != NULL) + UConverterDataLMBCS * extraInfo = (UConverterDataLMBCS*)uprv_malloc (sizeof (UConverterDataLMBCS)); + if(extraInfo != NULL) { - ulmbcs_byte_t i; - ulmbcs_byte_t imax; - imax = sizeof(extraInfo->OptGrpConverter)/sizeof(extraInfo->OptGrpConverter[0]); - - for (i=0; i < imax; i++) - { - extraInfo->OptGrpConverter[i] = - (OptGroupByteToCPName[i] != NULL) ? - ucnv_open(OptGroupByteToCPName[i], err) : NULL; - } - extraInfo->OptGroup = OptGroup; - extraInfo->localeConverterIndex = FindLMBCSLocale(locale); + ulmbcs_byte_t i; + + uprv_memset(extraInfo, 0, sizeof(UConverterDataLMBCS)); + + for (i=0; i <= ULMBCS_GRP_LAST && U_SUCCESS(*err); i++) + { + if(OptGroupByteToCPName[i] != NULL) { + extraInfo->OptGrpConverter[i] = ucnv_loadSharedData(OptGroupByteToCPName[i], NULL, err); + } + } + + if(U_SUCCESS(*err)) { + extraInfo->OptGroup = OptGroup; + extraInfo->localeConverterIndex = FindLMBCSLocale(locale); + } else { + /* one of the subconverters could not be loaded, unload the previous ones */ + while(i > 0) { + if(extraInfo->OptGrpConverter[--i] != NULL) { + ucnv_unloadSharedDataIfReady(extraInfo->OptGrpConverter[i]); + extraInfo->OptGrpConverter[i] = NULL; + } + } + } } else { @@ -584,30 +608,69 @@ _LMBCSOpenWorker(UConverter* _this, static void _LMBCSClose(UConverter * _this) { - if (_this->extraInfo != NULL && !_this->isExtraLocal) + if (_this->extraInfo != NULL) { ulmbcs_byte_t Ix; UConverterDataLMBCS * extraInfo = (UConverterDataLMBCS *) _this->extraInfo; - for (Ix=0; Ix < ULMBCS_GRP_UNICODE; Ix++) + for (Ix=0; Ix <= ULMBCS_GRP_LAST; Ix++) { if (extraInfo->OptGrpConverter[Ix] != NULL) - ucnv_close (extraInfo->OptGrpConverter[Ix]); + ucnv_unloadSharedDataIfReady(extraInfo->OptGrpConverter[Ix]); + } + if (!_this->isExtraLocal) { + uprv_free (_this->extraInfo); } - uprv_free (_this->extraInfo); } } -/* -Here's an all-crash stop for debugging, since ICU does not have asserts. -Turn this on by defining LMBCS_DEBUG, or by changing it to -#if 1 -*/ -#if LMBCS_DEBUG -#define MyAssert(b) {if (!(b)) {*(char *)0 = 1;}} -#else -#define MyAssert(b) -#endif +typedef struct LMBCSClone { + UConverter cnv; + UConverterDataLMBCS lmbcs; +} LMBCSClone; + +static UConverter * +_LMBCSSafeClone(const UConverter *cnv, + void *stackBuffer, + int32_t *pBufferSize, + UErrorCode *status) { + LMBCSClone *newLMBCS; + UConverterDataLMBCS *extraInfo; + int32_t i; + + if(*pBufferSize<=0) { + *pBufferSize=(int32_t)sizeof(LMBCSClone); + return NULL; + } + + extraInfo=(UConverterDataLMBCS *)cnv->extraInfo; + newLMBCS=(LMBCSClone *)stackBuffer; + + /* ucnv.c/ucnv_safeClone() copied the main UConverter already */ + + uprv_memcpy(&newLMBCS->lmbcs, extraInfo, sizeof(UConverterDataLMBCS)); + + /* share the subconverters */ + for(i = 0; i <= ULMBCS_GRP_LAST; ++i) { + if(extraInfo->OptGrpConverter[i] != NULL) { + ucnv_incrementRefCount(extraInfo->OptGrpConverter[i]); + } + } + + newLMBCS->cnv.extraInfo = &newLMBCS->lmbcs; + newLMBCS->cnv.isExtraLocal = TRUE; + return &newLMBCS->cnv; +} + +static void +_LMBCSGetUnicodeSet(const UConverter *cnv, + USetAdder *sa, + UConverterUnicodeSet which, + UErrorCode *pErrorCode) { + /* all but U+F6xx, see LMBCS explanation above (search for F6xx) */ + sa->addRange(sa->set, 0, 0xf5ff); + sa->addRange(sa->set, 0xf700, 0x10ffff); +} /* Here's the basic helper function that we use when converting from @@ -627,33 +690,21 @@ LMBCSConversionWorker ( ) { ulmbcs_byte_t * pLMBCS = pStartLMBCS; - UConverter * xcnv = extraInfo->OptGrpConverter[group]; + UConverterSharedData * xcnv = extraInfo->OptGrpConverter[group]; int bytesConverted; uint32_t value; ulmbcs_byte_t firstByte; - MyAssert(xcnv); - MyAssert(groupsharedData, *pUniChar, &value, FALSE); + bytesConverted = ucnv_MBCSFromUChar32(xcnv, *pUniChar, &value, FALSE); /* get the first result byte */ - switch(bytesConverted) - { - case 4: - firstByte = (ulmbcs_byte_t)(value >> 24); - break; - case 3: - firstByte = (ulmbcs_byte_t)(value >> 16); - break; - case 2: - firstByte = (ulmbcs_byte_t)(value >> 8); - break; - case 1: - firstByte = (ulmbcs_byte_t)value; - break; - default: + if(bytesConverted > 0) { + firstByte = (ulmbcs_byte_t)(value >> ((bytesConverted - 1) * 8)); + } else { /* most common failure mode is an unassigned character */ groups_tried[group] = TRUE; return 0; @@ -664,7 +715,7 @@ LMBCSConversionWorker ( /* All initial byte values in lower ascii range should have been caught by now, except with the exception group. */ - MyAssert((firstByte <= ULMBCS_C0END) || (firstByte >= ULMBCS_C1START) || (group == ULMBCS_GRP_EXCEPT)); + U_ASSERT((firstByte <= ULMBCS_C0END) || (firstByte >= ULMBCS_C1START) || (group == ULMBCS_GRP_EXCEPT)); /* use converted data: first write 0, 1 or two group bytes */ if (group != ULMBCS_GRP_EXCEPT && extraInfo->OptGroup != group) @@ -826,7 +877,7 @@ _LMBCSFromUnicode(UConverterFromUnicodeArgs* args, } if (!bytes_written) /* the ambiguous group cases (Strategy 3) */ { - memset(groups_tried, 0, sizeof(groups_tried)); + uprv_memset(groups_tried, 0, sizeof(groups_tried)); /* check for non-default optimization group (Strategy 3A )*/ if (extraInfo->OptGroup != 1 @@ -930,16 +981,6 @@ _LMBCSFromUnicode(UConverterFromUnicodeArgs* args, /* Now, the Unicode from LMBCS section */ -/* - Special codes for the getNextUnicodeWorker -- usually as the result of - special error-callback behavior: - ULMBCS_SKIP To control skipping over LMBCS sequences - ULMBCS_MULTI To indicate that a single LMBCS char translates to - multiple uniChars -*/ -#define ULMBCS_SKIP U_ERROR_LIMIT -#define ULMBCS_MULTI ULMBCS_SKIP+1 - /* A function to call when we are looking at the Unicode group byte in LMBCS */ static UChar GetUniFromLMBCSUni(char const ** ppLMBCSin) /* Called with LMBCS-style Unicode byte stream */ @@ -958,26 +999,22 @@ GetUniFromLMBCSUni(char const ** ppLMBCSin) /* Called with LMBCS-style Unicode /* CHECK_SOURCE_LIMIT: Helper macro to verify that there are at least'index' - bytes left in source up to sourceLimit.Errors appropriately if not + bytes left in source up to sourceLimit.Errors appropriately if not. + If we reach the limit, then update the source pointer to there to consume + all input as required by ICU converter semantics. */ #define CHECK_SOURCE_LIMIT(index) \ if (args->source+index > args->sourceLimit){\ *err = U_TRUNCATED_CHAR_FOUND;\ - args->source = saveSource;\ + args->source = args->sourceLimit;\ return 0xffff;} -/* Return the Unicode representation for the current LMBCS character - - This worker function is used by both ucnv_getNextUChar() and ucnv_ToUnicode(). - The last parameter says whether the return value should be treated as UTF-16 or - UTF-32. The only difference is in surrogate handling -*/ +/* Return the Unicode representation for the current LMBCS character */ static UChar32 _LMBCSGetNextUCharWorker(UConverterToUnicodeArgs* args, - UErrorCode* err, - UBool returnUTF32) + UErrorCode* err) { UChar32 uniChar = 0; /* an output UNICODE char */ ulmbcs_byte_t CurByte; /* A byte from the input stream */ @@ -1015,7 +1052,7 @@ _LMBCSGetNextUCharWorker(UConverterToUnicodeArgs* args, { UConverterDataLMBCS * extraInfo; ulmbcs_byte_t group; - UConverter* cnv; + UConverterSharedData *cnv; if (CurByte == ULMBCS_GRP_CTRL) /* Control character group - no opt group update */ { @@ -1027,27 +1064,16 @@ _LMBCSGetNextUCharWorker(UConverterToUnicodeArgs* args, else if (CurByte == ULMBCS_GRP_UNICODE) /* Unicode compatibility group: BigEndian UTF16 */ { - UChar second; CHECK_SOURCE_LIMIT(2); - uniChar = GetUniFromLMBCSUni(&(args->source)); - - /* at this point we are usually done, but we need to make sure we are not in - a situation where we can successfully put together a surrogate pair */ - - if(returnUTF32 && UTF_IS_FIRST_SURROGATE(uniChar) && (args->source+3 <= args->sourceLimit) - && *(args->source)++ == ULMBCS_GRP_UNICODE - && UTF_IS_SECOND_SURROGATE(second = GetUniFromLMBCSUni(&(args->source)))) - { - uniChar = UTF16_GET_PAIR_VALUE(uniChar, second); - } + /* don't check for error indicators fffe/ffff below */ + return GetUniFromLMBCSUni(&(args->source)); } else if (CurByte <= ULMBCS_CTRLOFFSET) { group = CurByte; /* group byte is in the source */ extraInfo = (UConverterDataLMBCS *) args->converter->extraInfo; - cnv = extraInfo->OptGrpConverter[group]; - if (!cnv) + if (group > ULMBCS_GRP_LAST || (cnv = extraInfo->OptGrpConverter[group]) == NULL) { /* this is not a valid group byte - no converter*/ *err = U_INVALID_CHAR_FOUND; @@ -1061,12 +1087,12 @@ _LMBCSGetNextUCharWorker(UConverterToUnicodeArgs* args, if (*args->source == group) { /* single byte */ ++args->source; - uniChar = _MBCSSimpleGetNextUChar(cnv->sharedData, &args->source, args->source + 1, FALSE); + uniChar = ucnv_MBCSSimpleGetNextUChar(cnv, args->source, 1, FALSE); + ++args->source; } else { /* double byte */ - const char *newLimit = args->source + 2; - uniChar = _MBCSSimpleGetNextUChar(cnv->sharedData, &args->source, newLimit, FALSE); - args->source = newLimit; /* set the correct limit even in case of an error */ + uniChar = ucnv_MBCSSimpleGetNextUChar(cnv, args->source, 2, FALSE); + args->source += 2; } } else { /* single byte conversion */ @@ -1075,14 +1101,13 @@ _LMBCSGetNextUCharWorker(UConverterToUnicodeArgs* args, if (CurByte >= ULMBCS_C1START) { - uniChar = _MBCS_SINGLE_SIMPLE_GET_NEXT_BMP(cnv->sharedData, CurByte); + uniChar = _MBCS_SINGLE_SIMPLE_GET_NEXT_BMP(cnv, CurByte); } else { /* The non-optimizable oddballs where there is an explicit byte * AND the second byte is not in the upper ascii range */ - const char *s; char bytes[2]; extraInfo = (UConverterDataLMBCS *) args->converter->extraInfo; @@ -1091,8 +1116,7 @@ _LMBCSGetNextUCharWorker(UConverterToUnicodeArgs* args, /* Lookup value must include opt group */ bytes[0] = group; bytes[1] = CurByte; - s = bytes; - uniChar = _MBCSSimpleGetNextUChar(cnv->sharedData, &s, bytes + 2, FALSE); + uniChar = ucnv_MBCSSimpleGetNextUChar(cnv, bytes, 2, FALSE); } } } @@ -1103,92 +1127,31 @@ _LMBCSGetNextUCharWorker(UConverterToUnicodeArgs* args, cnv = extraInfo->OptGrpConverter[group]; if (group >= ULMBCS_DOUBLEOPTGROUP_START) /* double byte conversion */ { - if (!_MBCSIsLeadByte(cnv->sharedData, CurByte)) + if (!ucnv_MBCSIsLeadByte(cnv, CurByte)) { CHECK_SOURCE_LIMIT(0); /* let the MBCS conversion consume CurByte again */ - --args->source; - uniChar = _MBCSSimpleGetNextUChar(cnv->sharedData, &args->source, args->source + 1, FALSE); + uniChar = ucnv_MBCSSimpleGetNextUChar(cnv, args->source - 1, 1, FALSE); } else { CHECK_SOURCE_LIMIT(1); /* let the MBCS conversion consume CurByte again */ - --args->source; - /* since we know that we start at a lead byte, args->source _will_ be incremented by 2 */ - uniChar = _MBCSSimpleGetNextUChar(cnv->sharedData, &args->source, args->source + 2, FALSE); + uniChar = ucnv_MBCSSimpleGetNextUChar(cnv, args->source - 1, 2, FALSE); + ++args->source; } } else /* single byte conversion */ { - uniChar = _MBCS_SINGLE_SIMPLE_GET_NEXT_BMP(cnv->sharedData, CurByte); + uniChar = _MBCS_SINGLE_SIMPLE_GET_NEXT_BMP(cnv, CurByte); } } } - if (((uint32_t)uniChar - 0xfffe) <= 1) /* 0xfffe<=uniChar<=0xffff */ - { - UConverterToUnicodeArgs cbArgs = *args; - UConverterCallbackReason reason; - UChar UCh; - - if (uniChar == 0xfffe) - { - reason = UCNV_UNASSIGNED; - *err = U_INVALID_CHAR_FOUND; - } - else - { - reason = UCNV_ILLEGAL; - *err = U_ILLEGAL_CHAR_FOUND; - } - - cbArgs.target = &UCh; - cbArgs.targetLimit = &UCh + 1; - cbArgs.converter->fromCharErrorBehaviour(cbArgs.converter->toUContext, - &cbArgs, - saveSource, - args->source - saveSource, - reason, - err); - - if (cbArgs.target != &UCh) - { - uniChar = (UChar32) UCh; - } - /* Did error functor skip */ - if (U_SUCCESS(*err) && cbArgs.target == &UCh) - { - *err = ULMBCS_SKIP; - } - /* Did error functor try to write multiple UChars? */ - else if (*err == U_BUFFER_OVERFLOW_ERROR) - { - *err = ULMBCS_MULTI; - } - } return uniChar; } -/* The exported function that gets one UTF32 character from a LMBCS stream -*/ -static UChar32 -_LMBCSGetNextUChar(UConverterToUnicodeArgs* args, - UErrorCode* err) -{ - UChar32 nextUChar; - do { - nextUChar = _LMBCSGetNextUCharWorker(args, err, TRUE); - } while (*err == ULMBCS_SKIP); - - if (*err == ULMBCS_MULTI) - { - *err = U_ZERO_ERROR; - } - return nextUChar; -} - /* The exported function that converts lmbcs to one or more UChars - currently UTF-16 */ @@ -1196,50 +1159,44 @@ static void _LMBCSToUnicodeWithOffsets(UConverterToUnicodeArgs* args, UErrorCode* err) { + char LMBCS [ULMBCS_CHARSIZE_MAX]; UChar uniChar; /* one output UNICODE char */ - const char * saveSource = args->source; /* beginning of current code point */ + const char * saveSource; /* beginning of current code point */ const char * pStartLMBCS = args->source; /* beginning of whole string */ + const char * errSource = NULL; /* pointer to actual input in case an error occurs */ + int8_t savebytes = 0; - if (args->targetLimit == args->target) /* error check may belong in common code */ - { - *err = U_BUFFER_OVERFLOW_ERROR; - return; - } - /* Process from source to limit, or until error */ - while (!*err && args->sourceLimit > args->source && args->targetLimit > args->target) + while (U_SUCCESS(*err) && args->sourceLimit > args->source && args->targetLimit > args->target) { saveSource = args->source; /* beginning of current code point */ - if (args->converter->invalidCharLength) /* reassemble char from previous call */ + if (args->converter->toULength) /* reassemble char from previous call */ { - char LMBCS [ULMBCS_CHARSIZE_MAX]; - const char *pLMBCS = LMBCS, *saveSourceLimit; - size_t size_old = args->converter->invalidCharLength; + const char *saveSourceLimit; + size_t size_old = args->converter->toULength; - /* limit from source is either reminder of temp buffer, or user limit on source */ + /* limit from source is either remainder of temp buffer, or user limit on source */ size_t size_new_maybe_1 = sizeof(LMBCS) - size_old; size_t size_new_maybe_2 = args->sourceLimit - args->source; size_t size_new = (size_new_maybe_1 < size_new_maybe_2) ? size_new_maybe_1 : size_new_maybe_2; - uprv_memcpy(LMBCS, args->converter->invalidCharBuffer, size_old); + uprv_memcpy(LMBCS, args->converter->toUBytes, size_old); uprv_memcpy(LMBCS + size_old, args->source, size_new); saveSourceLimit = args->sourceLimit; - args->source = pLMBCS; - args->sourceLimit = pLMBCS+size_old+size_new; - uniChar = (UChar) _LMBCSGetNextUCharWorker(args, err, FALSE); - pLMBCS = args->source; - args->source =saveSource; + args->source = errSource = LMBCS; + args->sourceLimit = LMBCS+size_old+size_new; + savebytes = (int8_t)(size_old+size_new); + uniChar = (UChar) _LMBCSGetNextUCharWorker(args, err); + args->source = saveSource + ((args->source - LMBCS) - size_old); args->sourceLimit = saveSourceLimit; - args->source += (pLMBCS - LMBCS - size_old); - if (*err == U_TRUNCATED_CHAR_FOUND && !args->flush) + if (*err == U_TRUNCATED_CHAR_FOUND) { /* evil special case: source buffers so small a char spans more than 2 buffers */ - int8_t savebytes = (int8_t)(size_old+size_new); - args->converter->invalidCharLength = savebytes; - uprv_memcpy(args->converter->invalidCharBuffer, LMBCS, savebytes); + args->converter->toULength = savebytes; + uprv_memcpy(args->converter->toUBytes, LMBCS, savebytes); args->source = args->sourceLimit; *err = U_ZERO_ERROR; return; @@ -1247,12 +1204,14 @@ _LMBCSToUnicodeWithOffsets(UConverterToUnicodeArgs* args, else { /* clear the partial-char marker */ - args->converter->invalidCharLength = 0; + args->converter->toULength = 0; } } else { - uniChar = (UChar) _LMBCSGetNextUCharWorker(args, err, FALSE); + errSource = saveSource; + uniChar = (UChar) _LMBCSGetNextUCharWorker(args, err); + savebytes = (int8_t)(args->source - saveSource); } if (U_SUCCESS(*err)) { @@ -1273,53 +1232,22 @@ _LMBCSToUnicodeWithOffsets(UConverterToUnicodeArgs* args, *err = U_ILLEGAL_CHAR_FOUND; } } - else if (*err == ULMBCS_MULTI) - { - UChar * pUChar = args->converter->UCharErrorBuffer; - int8_t BufferLength = args->converter->UCharErrorBufferLength; - - *err = U_ZERO_ERROR; - do - { /* error functor wants to write multiple UniChars */ - *(args->target)++ = uniChar; - if(args->offsets) - { - *(args->offsets)++ = saveSource - pStartLMBCS; - } - uniChar = *pUChar++; - } - while(BufferLength-- && args->targetLimit > args->target); - - if (++BufferLength > 0) - { /* fix up remaining UChars that can't fit in caller's buffer */ - uprv_memmove( args->converter->UCharErrorBuffer, - args->converter->UCharErrorBuffer + args->converter->UCharErrorBufferLength - BufferLength, - sizeof(UChar) * BufferLength); - } - args->converter->UCharErrorBufferLength = BufferLength; - } - else if (*err == ULMBCS_SKIP) - { - *err = U_ZERO_ERROR; /* and just go around again..*/ - } } /* if target ran out before source, return U_BUFFER_OVERFLOW_ERROR */ if (U_SUCCESS(*err) && args->sourceLimit > args->source && args->targetLimit <= args->target) { *err = U_BUFFER_OVERFLOW_ERROR; } - - /* If character incomplete, store away partial char if more to come */ - if (*err == U_TRUNCATED_CHAR_FOUND) + else if (U_FAILURE(*err)) { - args->source = args->sourceLimit; - if (!args->flush ) - { - int8_t savebytes = (int8_t)(args->sourceLimit - saveSource); - args->converter->invalidCharLength = (int8_t)savebytes; - uprv_memcpy(args->converter->invalidCharBuffer, saveSource, savebytes); - *err = U_ZERO_ERROR; - } + /* If character incomplete or unmappable/illegal, store it in toUBytes[] */ + args->converter->toULength = savebytes; + if (savebytes > 0) { + uprv_memcpy(args->converter->toUBytes, errSource, savebytes); + } + if (*err == U_TRUNCATED_CHAR_FOUND) { + *err = U_ZERO_ERROR; + } } } diff --git a/icuSources/common/ucnv_set.c b/icuSources/common/ucnv_set.c new file mode 100644 index 00000000..c192ea4f --- /dev/null +++ b/icuSources/common/ucnv_set.c @@ -0,0 +1,66 @@ +/* +******************************************************************************* +* +* Copyright (C) 2003-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: ucnv_set.c +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2004sep07 +* created by: Markus W. Scherer +* +* Conversion API functions using USet (ucnv_getUnicodeSet()) +* moved here from ucnv.c for removing the dependency of other ucnv_ +* implementation functions on the USet implementation. +*/ + +#include "unicode/utypes.h" +#include "unicode/uset.h" +#include "unicode/ucnv.h" +#include "ucnv_bld.h" +#include "uset_imp.h" + +#if !UCONFIG_NO_CONVERSION + +U_CAPI void U_EXPORT2 +ucnv_getUnicodeSet(const UConverter *cnv, + USet *setFillIn, + UConverterUnicodeSet whichSet, + UErrorCode *pErrorCode) { + /* argument checking */ + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return; + } + if(cnv==NULL || setFillIn==NULL || whichSetsharedData->impl->getUnicodeSet==NULL) { + *pErrorCode=U_UNSUPPORTED_ERROR; + return; + } + + { + USetAdder sa={ + NULL, + uset_add, + uset_addRange, + uset_addString + }; + sa.set=setFillIn; + + /* empty the set */ + uset_clear(setFillIn); + + /* call the converter to add the code points it supports */ + cnv->sharedData->impl->getUnicodeSet(cnv, &sa, whichSet, pErrorCode); + } +} + +#endif diff --git a/icuSources/common/ucnv_u16.c b/icuSources/common/ucnv_u16.c index ab64edf8..86fd1999 100644 --- a/icuSources/common/ucnv_u16.c +++ b/icuSources/common/ucnv_u16.c @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2002-2003, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucnv_u16.c @@ -15,411 +15,520 @@ */ #include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + #include "unicode/ucnv.h" -#include "unicode/ucnv_err.h" #include "ucnv_bld.h" #include "ucnv_cnv.h" #include "cmemory.h" -/* UTF-16 Platform Endian --------------------------------------------------- */ +/* UTF-16BE ----------------------------------------------------------------- */ + +#if U_IS_BIG_ENDIAN +# define _UTF16PEFromUnicodeWithOffsets _UTF16BEFromUnicodeWithOffsets +#else +# define _UTF16PEFromUnicodeWithOffsets _UTF16LEFromUnicodeWithOffsets +#endif static void -_UTF16PEToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - UConverter *cnv = pArgs->converter; - const uint8_t *source = (const uint8_t *)pArgs->source; - UChar *target = pArgs->target; - int32_t *offsets = pArgs->offsets; - int32_t targetCapacity = pArgs->targetLimit - pArgs->target; - int32_t length = (const uint8_t *)pArgs->sourceLimit - source; - int32_t count; - int32_t sourceIndex = 0; - - if(length <= 0 && cnv->toUnicodeStatus == 0) { +_UTF16BEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { + UConverter *cnv; + const UChar *source; + uint8_t *target; + int32_t *offsets; + + int32_t targetCapacity, length, count, sourceIndex; + UChar c, trail; + char overflow[4]; + + source=pArgs->source; + length=pArgs->sourceLimit-source; + if(length<=0) { /* no input, nothing to do */ return; } - if(targetCapacity <= 0) { + targetCapacity=pArgs->targetLimit-pArgs->target; + if(targetCapacity<=0) { *pErrorCode=U_BUFFER_OVERFLOW_ERROR; return; } - /* complete a partial UChar from the last call */ - if(length != 0 && cnv->toUnicodeStatus != 0) { - /* - * copy the byte from the last call and the first one here into the target, - * byte-wise to keep the platform endianness - */ - uint8_t *p = (uint8_t *)target++; - *p++ = (uint8_t)cnv->toUnicodeStatus; - cnv->toUnicodeStatus = 0; - *p = *source++; + cnv=pArgs->converter; + target=(uint8_t *)pArgs->target; + offsets=pArgs->offsets; + sourceIndex=0; + + /* c!=0 indicates in several places outside the main loops that a surrogate was found */ + + if((c=(UChar)cnv->fromUChar32)!=0 && U16_IS_TRAIL(trail=*source) && targetCapacity>=4) { + /* the last buffer ended with a lead surrogate, output the surrogate pair */ + ++source; --length; - --targetCapacity; - if(offsets != NULL) { - *offsets++ = -1; + target[0]=(uint8_t)(c>>8); + target[1]=(uint8_t)c; + target[2]=(uint8_t)(trail>>8); + target[3]=(uint8_t)trail; + target+=4; + targetCapacity-=4; + if(offsets!=NULL) { + *offsets++=-1; + *offsets++=-1; + *offsets++=-1; + *offsets++=-1; } + sourceIndex=1; + cnv->fromUChar32=c=0; } /* copy an even number of bytes for complete UChars */ - count = 2 * targetCapacity; - if(count > length) { - count = length & ~1; - } - if(count > 0) { - uprv_memcpy(target, source, count); - source += count; - length -= count; - count >>= 1; - target += count; - targetCapacity -= count; - if(offsets != NULL) { - while(count > 0) { - *offsets++ = sourceIndex; - sourceIndex += 2; + count=2*length; + if(count>targetCapacity) { + count=targetCapacity&~1; + } + /* count is even */ + if(c==0) { + targetCapacity-=count; + count>>=1; + length-=count; + + if(offsets==NULL) { + while(count>0) { + c=*source++; + if(U16_IS_SINGLE(c)) { + target[0]=(uint8_t)(c>>8); + target[1]=(uint8_t)c; + target+=2; + } else if(U16_IS_SURROGATE_LEAD(c) && count>=2 && U16_IS_TRAIL(trail=*source)) { + ++source; + --count; + target[0]=(uint8_t)(c>>8); + target[1]=(uint8_t)c; + target[2]=(uint8_t)(trail>>8); + target[3]=(uint8_t)trail; + target+=4; + } else { + break; + } + --count; + } + } else { + while(count>0) { + c=*source++; + if(U16_IS_SINGLE(c)) { + target[0]=(uint8_t)(c>>8); + target[1]=(uint8_t)c; + target+=2; + *offsets++=sourceIndex; + *offsets++=sourceIndex++; + } else if(U16_IS_SURROGATE_LEAD(c) && count>=2 && U16_IS_TRAIL(trail=*source)) { + ++source; + --count; + target[0]=(uint8_t)(c>>8); + target[1]=(uint8_t)c; + target[2]=(uint8_t)(trail>>8); + target[3]=(uint8_t)trail; + target+=4; + *offsets++=sourceIndex; + *offsets++=sourceIndex; + *offsets++=sourceIndex; + *offsets++=sourceIndex; + sourceIndex+=2; + } else { + break; + } --count; } } - } - /* check for a remaining source byte and store the status */ - if(length >= 2) { - /* it must be targetCapacity==0 because otherwise the above would have copied more */ - *pErrorCode = U_BUFFER_OVERFLOW_ERROR; - } else if(length == 1) { - if(pArgs->flush) { - /* a UChar remains incomplete */ - *pErrorCode = U_TRUNCATED_CHAR_FOUND; + if(count==0) { + /* done with the loop for complete UChars */ + if(length>0 && targetCapacity>0) { + /* + * there is more input and some target capacity - + * it must be targetCapacity==1 because otherwise + * the above would have copied more; + * prepare for overflow output + */ + if(U16_IS_SINGLE(c=*source++)) { + overflow[0]=(char)(c>>8); + overflow[1]=(char)c; + length=2; /* 2 bytes to output */ + c=0; + /* } else { keep c for surrogate handling, length will be set there */ + } + } else { + length=0; + c=0; + } } else { - /* consume the last byte and store it, making sure that it will never set the status to 0 */ - cnv->toUnicodeStatus = *source++ | 0x100; + /* keep c for surrogate handling, length will be set there */ + targetCapacity+=2*count; } - } else /* length==0 */ if(cnv->toUnicodeStatus!=0 && pArgs->flush) { - /* a UChar remains incomplete */ - *pErrorCode = U_TRUNCATED_CHAR_FOUND; - } - - /* write back the updated pointers */ - pArgs->source = (const char *)source; - pArgs->target = target; - pArgs->offsets = offsets; -} - -static void -_UTF16PEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - UConverter *cnv = pArgs->converter; - const UChar *source = pArgs->source; - uint8_t *target = (uint8_t *)pArgs->target; - int32_t *offsets = pArgs->offsets; - int32_t targetCapacity = pArgs->targetLimit - pArgs->target; - int32_t length = pArgs->sourceLimit - source; - int32_t count; - int32_t sourceIndex = 0; - - if(length <= 0 && cnv->fromUnicodeStatus == 0) { - /* no input, nothing to do */ - return; - } - - if(targetCapacity <= 0) { - *pErrorCode = U_BUFFER_OVERFLOW_ERROR; - return; + } else { + length=0; /* from here on, length counts the bytes in overflow[] */ } - - /* complete a partial UChar from the last call */ - if(cnv->fromUnicodeStatus != 0) { - *target++ = (uint8_t)cnv->fromUnicodeStatus; - cnv->fromUnicodeStatus = 0; - --targetCapacity; - if(offsets != NULL) { - *offsets++ = -1; + + if(c!=0) { + /* + * c is a surrogate, and + * - source or target too short + * - or the surrogate is unmatched + */ + length=0; + if(U16_IS_SURROGATE_LEAD(c)) { + if(sourcesourceLimit) { + if(U16_IS_TRAIL(trail=*source)) { + /* output the surrogate pair, will overflow (see conditions comment above) */ + ++source; + overflow[0]=(char)(c>>8); + overflow[1]=(char)c; + overflow[2]=(char)(trail>>8); + overflow[3]=(char)trail; + length=4; /* 4 bytes to output */ + c=0; + } else { + /* unmatched lead surrogate */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + } + } else { + /* see if the trail surrogate is in the next buffer */ + } + } else { + /* unmatched trail surrogate */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; } + cnv->fromUChar32=c; } - /* copy an even number of bytes for complete UChars */ - count = 2 * length; - if(count > targetCapacity) { - count = targetCapacity & ~1; - } - if(count>0) { - uprv_memcpy(target, source, count); - target += count; - targetCapacity -= count; - count >>= 1; - source += count; - length -= count; - if(offsets != NULL) { - while(count > 0) { - *offsets++ = sourceIndex; - *offsets++ = sourceIndex++; - --count; - } - } + if(length>0) { + /* output length bytes with overflow (length>targetCapacity>0) */ + ucnv_fromUWriteBytes(cnv, + overflow, length, + (char **)&target, pArgs->targetLimit, + &offsets, sourceIndex, + pErrorCode); + targetCapacity=pArgs->targetLimit-(char *)target; } - if(length > 0) { - /* it must be targetCapacity<=1 because otherwise the above would have copied more */ - *pErrorCode = U_BUFFER_OVERFLOW_ERROR; - if(targetCapacity > 0) /* targetCapacity==1 */ { - /* copy one byte and keep the other in the status */ - const uint8_t *p = (const uint8_t *)source++; - *target++ = *p++; - cnv->fromUnicodeStatus = *p | 0x100; - if(offsets != NULL) { - *offsets++ = sourceIndex; - } - } + if(U_SUCCESS(*pErrorCode) && sourcesourceLimit && targetCapacity==0) { + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; } /* write back the updated pointers */ - pArgs->source = source; - pArgs->target = (char *)target; - pArgs->offsets = offsets; + pArgs->source=source; + pArgs->target=(char *)target; + pArgs->offsets=offsets; } -/* UTF-16 Opposite Endian --------------------------------------------------- */ - -/* - * For opposite-endian UTF-16, we keep a byte pointer to the UChars - * and copy two bytes at a time and reverse them. - */ - static void -_UTF16OEToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, +_UTF16BEToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode) { - UConverter *cnv = pArgs->converter; - const uint8_t *source = (const uint8_t *)pArgs->source; - UChar *target = pArgs->target; - uint8_t *target8 = (uint8_t *)target; /* byte pointer to the target */ - int32_t *offsets = pArgs->offsets; - int32_t targetCapacity = pArgs->targetLimit - pArgs->target; - int32_t length = (const uint8_t *)pArgs->sourceLimit - source; - int32_t count; - int32_t sourceIndex = 0; - - if(length <= 0 && cnv->toUnicodeStatus == 0) { + UConverter *cnv; + const uint8_t *source; + UChar *target; + int32_t *offsets; + + int32_t targetCapacity, length, count, sourceIndex; + UChar c, trail; + + cnv=pArgs->converter; + source=(const uint8_t *)pArgs->source; + length=(const uint8_t *)pArgs->sourceLimit-source; + if(length<=0 && cnv->toUnicodeStatus==0) { /* no input, nothing to do */ return; } - if(targetCapacity <= 0) { - *pErrorCode = U_BUFFER_OVERFLOW_ERROR; + targetCapacity=pArgs->targetLimit-pArgs->target; + if(targetCapacity<=0) { + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; return; } - /* complete a partial UChar from the last call */ - if(length != 0 && cnv->toUnicodeStatus != 0) { + target=pArgs->target; + offsets=pArgs->offsets; + sourceIndex=0; + c=0; + + /* complete a partial UChar or pair from the last call */ + if(cnv->toUnicodeStatus!=0) { /* - * copy the byte from the last call and the first one here into the target, - * byte-wise, reversing the platform endianness + * special case: single byte from a previous buffer, + * where the byte turned out not to belong to a trail surrogate + * and the preceding, unmatched lead surrogate was put into toUBytes[] + * for error handling */ - *target8++ = *source++; - *target8++ = (uint8_t)cnv->toUnicodeStatus; - cnv->toUnicodeStatus = 0; - ++target; - --length; - --targetCapacity; - if(offsets != NULL) { - *offsets++ = -1; - } + cnv->toUBytes[0]=(uint8_t)cnv->toUnicodeStatus; + cnv->toULength=1; + cnv->toUnicodeStatus=0; } - - /* copy an even number of bytes for complete UChars */ - count = 2 * targetCapacity; - if(count > length) { - count = length & ~1; - } - if(count>0) { - length -= count; - count >>= 1; - targetCapacity -= count; - if(offsets == NULL) { - while(count > 0) { - target8[1] = *source++; - target8[0] = *source++; - target8 += 2; - --count; - } - } else { - while(count>0) { - target8[1] = *source++; - target8[0] = *source++; - target8 += 2; - *offsets++ = sourceIndex; - sourceIndex += 2; - --count; + if((count=cnv->toULength)!=0) { + uint8_t *p=cnv->toUBytes; + do { + p[count++]=*source++; + ++sourceIndex; + --length; + if(count==2) { + c=((UChar)p[0]<<8)|p[1]; + if(U16_IS_SINGLE(c)) { + /* output the BMP code point */ + *target++=c; + if(offsets!=NULL) { + *offsets++=-1; + } + --targetCapacity; + count=0; + c=0; + break; + } else if(U16_IS_SURROGATE_LEAD(c)) { + /* continue collecting bytes for the trail surrogate */ + c=0; /* avoid unnecessary surrogate handling below */ + } else { + /* fall through to error handling for an unmatched trail surrogate */ + break; + } + } else if(count==4) { + c=((UChar)p[0]<<8)|p[1]; + trail=((UChar)p[2]<<8)|p[3]; + if(U16_IS_TRAIL(trail)) { + /* output the surrogate pair */ + *target++=c; + if(targetCapacity>=2) { + *target++=trail; + if(offsets!=NULL) { + *offsets++=-1; + *offsets++=-1; + } + targetCapacity-=2; + } else /* targetCapacity==1 */ { + targetCapacity=0; + cnv->UCharErrorBuffer[0]=trail; + cnv->UCharErrorBufferLength=1; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + count=0; + c=0; + break; + } else { + /* unmatched lead surrogate, handle here for consistent toUBytes[] */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + + /* back out reading the code unit after it */ + if(((const uint8_t *)pArgs->source-source)>=2) { + source-=2; + } else { + /* + * if the trail unit's first byte was in a previous buffer, then + * we need to put it into a special place because toUBytes[] will be + * used for the lead unit's bytes + */ + cnv->toUnicodeStatus=0x100|p[2]; + --source; + } + cnv->toULength=2; + + /* write back the updated pointers */ + pArgs->source=(const char *)source; + pArgs->target=target; + pArgs->offsets=offsets; + return; + } } - } - target=(UChar *)target8; + } while(length>0); + cnv->toULength=(int8_t)count; } - /* check for a remaining source byte and store the status */ - if(length >= 2) { - /* it must be targetCapacity==0 because otherwise the above would have copied more */ - *pErrorCode = U_BUFFER_OVERFLOW_ERROR; - } else if(length == 1) { - if(pArgs->flush) { - /* a UChar remains incomplete */ - *pErrorCode = U_TRUNCATED_CHAR_FOUND; + /* copy an even number of bytes for complete UChars */ + count=2*targetCapacity; + if(count>length) { + count=length&~1; + } + if(c==0 && count>0) { + length-=count; + count>>=1; + targetCapacity-=count; + if(offsets==NULL) { + do { + c=((UChar)source[0]<<8)|source[1]; + source+=2; + if(U16_IS_SINGLE(c)) { + *target++=c; + } else if(U16_IS_SURROGATE_LEAD(c) && count>=2 && + U16_IS_TRAIL(trail=((UChar)source[0]<<8)|source[1]) + ) { + source+=2; + --count; + *target++=c; + *target++=trail; + } else { + break; + } + } while(--count>0); } else { - /* consume the last byte and store it, making sure that it will never set the status to 0 */ - cnv->toUnicodeStatus = *source++ | 0x100; + do { + c=((UChar)source[0]<<8)|source[1]; + source+=2; + if(U16_IS_SINGLE(c)) { + *target++=c; + *offsets++=sourceIndex; + sourceIndex+=2; + } else if(U16_IS_SURROGATE_LEAD(c) && count>=2 && + U16_IS_TRAIL(trail=((UChar)source[0]<<8)|source[1]) + ) { + source+=2; + --count; + *target++=c; + *target++=trail; + *offsets++=sourceIndex; + *offsets++=sourceIndex; + sourceIndex+=4; + } else { + break; + } + } while(--count>0); } - } else /* length==0 */ if(cnv->toUnicodeStatus!=0 && pArgs->flush) { - /* a UChar remains incomplete */ - *pErrorCode = U_TRUNCATED_CHAR_FOUND; - } - - /* write back the updated pointers */ - pArgs->source = (const char *)source; - pArgs->target = target; - pArgs->offsets = offsets; -} - -static void -_UTF16OEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - UConverter *cnv = pArgs->converter; - const UChar *source = pArgs->source; - const uint8_t *source8 = (const uint8_t *)source; /* byte pointer to the source */ - uint8_t *target = (uint8_t *)pArgs->target; - int32_t *offsets = pArgs->offsets; - int32_t targetCapacity = pArgs->targetLimit - pArgs->target; - int32_t length = pArgs->sourceLimit - source; - int32_t count; - int32_t sourceIndex = 0; - - if(length <= 0 && cnv->fromUnicodeStatus == 0) { - /* no input, nothing to do */ - return; - } - if(targetCapacity <= 0) { - *pErrorCode = U_BUFFER_OVERFLOW_ERROR; - return; - } - - /* complete a partial UChar from the last call */ - if(cnv->fromUnicodeStatus != 0) { - *target++ = (uint8_t)cnv->fromUnicodeStatus; - cnv->fromUnicodeStatus = 0; - --targetCapacity; - if(offsets != NULL) { - *offsets++ = -1; + if(count==0) { + /* done with the loop for complete UChars */ + c=0; + } else { + /* keep c for surrogate handling, trail will be set there */ + length+=2*(count-1); /* one more byte pair was consumed than count decremented */ + targetCapacity+=count; } } - /* copy an even number of bytes for complete UChars */ - count = 2 * length; - if(count > targetCapacity) { - count = targetCapacity & ~1; - } - if(count > 0) { - targetCapacity -= count; - count >>= 1; - length -= count; - if(offsets == NULL) { - while(count > 0) { - target[1] = *source8++; - target[0] = *source8++; - target += 2; - --count; + if(c!=0) { + /* + * c is a surrogate, and + * - source or target too short + * - or the surrogate is unmatched + */ + cnv->toUBytes[0]=(uint8_t)(c>>8); + cnv->toUBytes[1]=(uint8_t)c; + cnv->toULength=2; + + if(U16_IS_SURROGATE_LEAD(c)) { + if(length>=2) { + if(U16_IS_TRAIL(trail=((UChar)source[0]<<8)|source[1])) { + /* output the surrogate pair, will overflow (see conditions comment above) */ + source+=2; + length-=2; + *target++=c; + if(offsets!=NULL) { + *offsets++=sourceIndex; + } + cnv->UCharErrorBuffer[0]=trail; + cnv->UCharErrorBufferLength=1; + cnv->toULength=0; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } else { + /* unmatched lead surrogate */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + } + } else { + /* see if the trail surrogate is in the next buffer */ } } else { - while(count>0) { - target[1] = *source8++; - target[0] = *source8++; - target += 2; - *offsets++ = sourceIndex; - *offsets++ = sourceIndex++; - --count; - } + /* unmatched trail surrogate */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; } - source=(const UChar *)source8; } - if(length > 0) { - /* it must be targetCapacity<=1 because otherwise the above would have copied more */ - *pErrorCode = U_BUFFER_OVERFLOW_ERROR; - if(targetCapacity > 0) /* targetCapacity==1 */ { - /* copy one byte and keep the other in the status */ - cnv->fromUnicodeStatus = *source8++ | 0x100; - *target++ = *source8; - ++source; - if(offsets != NULL) { - *offsets++ = sourceIndex; + if(U_SUCCESS(*pErrorCode)) { + /* check for a remaining source byte */ + if(length>0) { + if(targetCapacity==0) { + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } else { + /* it must be length==1 because otherwise the above would have copied more */ + cnv->toUBytes[cnv->toULength++]=*source++; } } } /* write back the updated pointers */ - pArgs->source = source; - pArgs->target = (char *)target; - pArgs->offsets = offsets; + pArgs->source=(const char *)source; + pArgs->target=target; + pArgs->offsets=offsets; } -/* UTF-16BE ----------------------------------------------------------------- */ +static UChar32 +_UTF16BEGetNextUChar(UConverterToUnicodeArgs *pArgs, UErrorCode *err) { + const uint8_t *s, *sourceLimit; + UChar32 c; -#if U_IS_BIG_ENDIAN -# define _UTF16BEToUnicodeWithOffsets _UTF16PEToUnicodeWithOffsets -# define _UTF16LEToUnicodeWithOffsets _UTF16OEToUnicodeWithOffsets -# define _UTF16BEFromUnicodeWithOffsets _UTF16PEFromUnicodeWithOffsets -# define _UTF16LEFromUnicodeWithOffsets _UTF16OEFromUnicodeWithOffsets -#else -# define _UTF16BEToUnicodeWithOffsets _UTF16OEToUnicodeWithOffsets -# define _UTF16LEToUnicodeWithOffsets _UTF16PEToUnicodeWithOffsets -# define _UTF16BEFromUnicodeWithOffsets _UTF16OEFromUnicodeWithOffsets -# define _UTF16LEFromUnicodeWithOffsets _UTF16PEFromUnicodeWithOffsets -#endif + s=(const uint8_t *)pArgs->source; + sourceLimit=(const uint8_t *)pArgs->sourceLimit; -static UChar32 T_UConverter_getNextUChar_UTF16_BE(UConverterToUnicodeArgs* args, - UErrorCode* err) -{ - UChar32 myUChar; - uint16_t first; - /*Checks boundaries and set appropriate error codes*/ - if (args->source+2 > args->sourceLimit) - { - if (args->source >= args->sourceLimit) - { - /*Either caller has reached the end of the byte stream*/ - *err = U_INDEX_OUTOFBOUNDS_ERROR; - } - else - { - /* a character was cut in half*/ - *err = U_TRUNCATED_CHAR_FOUND; - } + if(s>=sourceLimit) { + /* no input */ + *err=U_INDEX_OUTOFBOUNDS_ERROR; return 0xffff; } - /*Gets the corresponding codepoint*/ - first = (uint16_t)(((uint16_t)(*(args->source)) << 8) |((uint8_t)*((args->source)+1))); - myUChar = first; - args->source += 2; - - if(UTF_IS_FIRST_SURROGATE(first)) { - uint16_t second; + if(s+2>sourceLimit) { + /* only one byte: truncated UChar */ + pArgs->converter->toUBytes[0]=*s++; + pArgs->converter->toULength=1; + pArgs->source=(const char *)s; + *err = U_TRUNCATED_CHAR_FOUND; + return 0xffff; + } - if (args->source+2 > args->sourceLimit) { - *err = U_TRUNCATED_CHAR_FOUND; - return 0xffff; + /* get one UChar */ + c=((UChar32)*s<<8)|s[1]; + s+=2; + + /* check for a surrogate pair */ + if(U_IS_SURROGATE(c)) { + if(U16_IS_SURROGATE_LEAD(c)) { + if(s+2<=sourceLimit) { + UChar trail; + + /* get a second UChar and see if it is a trail surrogate */ + trail=((UChar)*s<<8)|s[1]; + if(U16_IS_TRAIL(trail)) { + c=U16_GET_SUPPLEMENTARY(c, trail); + s+=2; + } else { + /* unmatched lead surrogate */ + c=-2; + } + } else { + /* too few (2 or 3) bytes for a surrogate pair: truncated code point */ + uint8_t *bytes=pArgs->converter->toUBytes; + s-=2; + pArgs->converter->toULength=(int8_t)(sourceLimit-s); + do { + *bytes++=*s++; + } while(ssource)) << 8) |((uint8_t)*(args->source+1))); + if(c<0) { + /* write the unmatched surrogate */ + uint8_t *bytes=pArgs->converter->toUBytes; + pArgs->converter->toULength=2; + *bytes=*(s-2); + bytes[1]=*(s-1); - /* ignore unmatched surrogates and just deliver the first one in such a case */ - if(UTF_IS_SECOND_SURROGATE(second)) { - /* matched pair, get pair value */ - myUChar = UTF16_GET_PAIR_VALUE(first, second); - args->source += 2; + c=0xffff; + *err=U_ILLEGAL_CHAR_FOUND; } } - return myUChar; + pArgs->source=(const char *)s; + return c; } static const UConverterImpl _UTF16BEImpl={ @@ -436,7 +545,7 @@ static const UConverterImpl _UTF16BEImpl={ _UTF16BEToUnicodeWithOffsets, _UTF16BEFromUnicodeWithOffsets, _UTF16BEFromUnicodeWithOffsets, - T_UConverter_getNextUChar_UTF16_BE, + _UTF16BEGetNextUChar, NULL, NULL, @@ -445,7 +554,6 @@ static const UConverterImpl _UTF16BEImpl={ ucnv_getCompleteUnicodeSet }; -/* The 1200 CCSID refers to any version of Unicode with any endianess of UTF-16 */ static const UConverterStaticData _UTF16BEStaticData={ sizeof(UConverterStaticData), "UTF-16BE", @@ -465,57 +573,504 @@ const UConverterSharedData _UTF16BEData={ /* UTF-16LE ----------------------------------------------------------------- */ -static UChar32 T_UConverter_getNextUChar_UTF16_LE(UConverterToUnicodeArgs* args, - UErrorCode* err) -{ - UChar32 myUChar; - uint16_t first; - /*Checks boundaries and set appropriate error codes*/ - if (args->source+2 > args->sourceLimit) - { - if (args->source >= args->sourceLimit) - { - /*Either caller has reached the end of the byte stream*/ - *err = U_INDEX_OUTOFBOUNDS_ERROR; +static void +_UTF16LEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { + UConverter *cnv; + const UChar *source; + uint8_t *target; + int32_t *offsets; + + int32_t targetCapacity, length, count, sourceIndex; + UChar c, trail; + char overflow[4]; + + source=pArgs->source; + length=pArgs->sourceLimit-source; + if(length<=0) { + /* no input, nothing to do */ + return; + } + + targetCapacity=pArgs->targetLimit-pArgs->target; + if(targetCapacity<=0) { + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + return; + } + + cnv=pArgs->converter; + target=(uint8_t *)pArgs->target; + offsets=pArgs->offsets; + sourceIndex=0; + + /* c!=0 indicates in several places outside the main loops that a surrogate was found */ + + if((c=(UChar)cnv->fromUChar32)!=0 && U16_IS_TRAIL(trail=*source) && targetCapacity>=4) { + /* the last buffer ended with a lead surrogate, output the surrogate pair */ + ++source; + --length; + target[0]=(uint8_t)c; + target[1]=(uint8_t)(c>>8); + target[2]=(uint8_t)trail; + target[3]=(uint8_t)(trail>>8); + target+=4; + targetCapacity-=4; + if(offsets!=NULL) { + *offsets++=-1; + *offsets++=-1; + *offsets++=-1; + *offsets++=-1; } - else - { - /* a character was cut in half*/ - *err = U_TRUNCATED_CHAR_FOUND; + sourceIndex=1; + cnv->fromUChar32=c=0; + } + + /* copy an even number of bytes for complete UChars */ + count=2*length; + if(count>targetCapacity) { + count=targetCapacity&~1; + } + /* count is even */ + if(c==0) { + targetCapacity-=count; + count>>=1; + length-=count; + + if(offsets==NULL) { + while(count>0) { + c=*source++; + if(U16_IS_SINGLE(c)) { + target[0]=(uint8_t)c; + target[1]=(uint8_t)(c>>8); + target+=2; + } else if(U16_IS_SURROGATE_LEAD(c) && count>=2 && U16_IS_TRAIL(trail=*source)) { + ++source; + --count; + target[0]=(uint8_t)c; + target[1]=(uint8_t)(c>>8); + target[2]=(uint8_t)trail; + target[3]=(uint8_t)(trail>>8); + target+=4; + } else { + break; + } + --count; + } + } else { + while(count>0) { + c=*source++; + if(U16_IS_SINGLE(c)) { + target[0]=(uint8_t)c; + target[1]=(uint8_t)(c>>8); + target+=2; + *offsets++=sourceIndex; + *offsets++=sourceIndex++; + } else if(U16_IS_SURROGATE_LEAD(c) && count>=2 && U16_IS_TRAIL(trail=*source)) { + ++source; + --count; + target[0]=(uint8_t)c; + target[1]=(uint8_t)(c>>8); + target[2]=(uint8_t)trail; + target[3]=(uint8_t)(trail>>8); + target+=4; + *offsets++=sourceIndex; + *offsets++=sourceIndex; + *offsets++=sourceIndex; + *offsets++=sourceIndex; + sourceIndex+=2; + } else { + break; + } + --count; + } } - return 0xffff; + if(count==0) { + /* done with the loop for complete UChars */ + if(length>0 && targetCapacity>0) { + /* + * there is more input and some target capacity - + * it must be targetCapacity==1 because otherwise + * the above would have copied more; + * prepare for overflow output + */ + if(U16_IS_SINGLE(c=*source++)) { + overflow[0]=(char)c; + overflow[1]=(char)(c>>8); + length=2; /* 2 bytes to output */ + c=0; + /* } else { keep c for surrogate handling, length will be set there */ + } + } else { + length=0; + c=0; + } + } else { + /* keep c for surrogate handling, length will be set there */ + targetCapacity+=2*count; + } + } else { + length=0; /* from here on, length counts the bytes in overflow[] */ + } + + if(c!=0) { + /* + * c is a surrogate, and + * - source or target too short + * - or the surrogate is unmatched + */ + length=0; + if(U16_IS_SURROGATE_LEAD(c)) { + if(sourcesourceLimit) { + if(U16_IS_TRAIL(trail=*source)) { + /* output the surrogate pair, will overflow (see conditions comment above) */ + ++source; + overflow[0]=(char)c; + overflow[1]=(char)(c>>8); + overflow[2]=(char)trail; + overflow[3]=(char)(trail>>8); + length=4; /* 4 bytes to output */ + c=0; + } else { + /* unmatched lead surrogate */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + } + } else { + /* see if the trail surrogate is in the next buffer */ + } + } else { + /* unmatched trail surrogate */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + } + cnv->fromUChar32=c; } - /*Gets the corresponding codepoint*/ - first = (uint16_t)(((uint16_t)*((args->source)+1) << 8) | ((uint8_t)(*(args->source)))); - myUChar=first; - /*updates the source*/ - args->source += 2; + if(length>0) { + /* output length bytes with overflow (length>targetCapacity>0) */ + ucnv_fromUWriteBytes(cnv, + overflow, length, + (char **)&target, pArgs->targetLimit, + &offsets, sourceIndex, + pErrorCode); + targetCapacity=pArgs->targetLimit-(char *)target; + } - if (UTF_IS_FIRST_SURROGATE(first)) - { - uint16_t second; + if(U_SUCCESS(*pErrorCode) && sourcesourceLimit && targetCapacity==0) { + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + + /* write back the updated pointers */ + pArgs->source=source; + pArgs->target=(char *)target; + pArgs->offsets=offsets; +} - if (args->source+2 > args->sourceLimit) - { - *err = U_TRUNCATED_CHAR_FOUND; - return 0xffff; +static void +_UTF16LEToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { + UConverter *cnv; + const uint8_t *source; + UChar *target; + int32_t *offsets; + + int32_t targetCapacity, length, count, sourceIndex; + UChar c, trail; + + cnv=pArgs->converter; + source=(const uint8_t *)pArgs->source; + length=(const uint8_t *)pArgs->sourceLimit-source; + if(length<=0 && cnv->toUnicodeStatus==0) { + /* no input, nothing to do */ + return; + } + + targetCapacity=pArgs->targetLimit-pArgs->target; + if(targetCapacity<=0) { + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + return; + } + + target=pArgs->target; + offsets=pArgs->offsets; + sourceIndex=0; + c=0; + + /* complete a partial UChar or pair from the last call */ + if(cnv->toUnicodeStatus!=0) { + /* + * special case: single byte from a previous buffer, + * where the byte turned out not to belong to a trail surrogate + * and the preceding, unmatched lead surrogate was put into toUBytes[] + * for error handling + */ + cnv->toUBytes[0]=(uint8_t)cnv->toUnicodeStatus; + cnv->toULength=1; + cnv->toUnicodeStatus=0; + } + if((count=cnv->toULength)!=0) { + uint8_t *p=cnv->toUBytes; + do { + p[count++]=*source++; + ++sourceIndex; + --length; + if(count==2) { + c=((UChar)p[1]<<8)|p[0]; + if(U16_IS_SINGLE(c)) { + /* output the BMP code point */ + *target++=c; + if(offsets!=NULL) { + *offsets++=-1; + } + --targetCapacity; + count=0; + c=0; + break; + } else if(U16_IS_SURROGATE_LEAD(c)) { + /* continue collecting bytes for the trail surrogate */ + c=0; /* avoid unnecessary surrogate handling below */ + } else { + /* fall through to error handling for an unmatched trail surrogate */ + break; + } + } else if(count==4) { + c=((UChar)p[1]<<8)|p[0]; + trail=((UChar)p[3]<<8)|p[2]; + if(U16_IS_TRAIL(trail)) { + /* output the surrogate pair */ + *target++=c; + if(targetCapacity>=2) { + *target++=trail; + if(offsets!=NULL) { + *offsets++=-1; + *offsets++=-1; + } + targetCapacity-=2; + } else /* targetCapacity==1 */ { + targetCapacity=0; + cnv->UCharErrorBuffer[0]=trail; + cnv->UCharErrorBufferLength=1; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + count=0; + c=0; + break; + } else { + /* unmatched lead surrogate, handle here for consistent toUBytes[] */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + + /* back out reading the code unit after it */ + if(((const uint8_t *)pArgs->source-source)>=2) { + source-=2; + } else { + /* + * if the trail unit's first byte was in a previous buffer, then + * we need to put it into a special place because toUBytes[] will be + * used for the lead unit's bytes + */ + cnv->toUnicodeStatus=0x100|p[2]; + --source; + } + cnv->toULength=2; + + /* write back the updated pointers */ + pArgs->source=(const char *)source; + pArgs->target=target; + pArgs->offsets=offsets; + return; + } + } + } while(length>0); + cnv->toULength=(int8_t)count; + } + + /* copy an even number of bytes for complete UChars */ + count=2*targetCapacity; + if(count>length) { + count=length&~1; + } + if(c==0 && count>0) { + length-=count; + count>>=1; + targetCapacity-=count; + if(offsets==NULL) { + do { + c=((UChar)source[1]<<8)|source[0]; + source+=2; + if(U16_IS_SINGLE(c)) { + *target++=c; + } else if(U16_IS_SURROGATE_LEAD(c) && count>=2 && + U16_IS_TRAIL(trail=((UChar)source[1]<<8)|source[0]) + ) { + source+=2; + --count; + *target++=c; + *target++=trail; + } else { + break; + } + } while(--count>0); + } else { + do { + c=((UChar)source[1]<<8)|source[0]; + source+=2; + if(U16_IS_SINGLE(c)) { + *target++=c; + *offsets++=sourceIndex; + sourceIndex+=2; + } else if(U16_IS_SURROGATE_LEAD(c) && count>=2 && + U16_IS_TRAIL(trail=((UChar)source[1]<<8)|source[0]) + ) { + source+=2; + --count; + *target++=c; + *target++=trail; + *offsets++=sourceIndex; + *offsets++=sourceIndex; + sourceIndex+=4; + } else { + break; + } + } while(--count>0); } - /* get the second surrogate and assemble the code point */ - second = (uint16_t)(((uint16_t)*(args->source+1) << 8) |((uint8_t)(*(args->source)))); + if(count==0) { + /* done with the loop for complete UChars */ + c=0; + } else { + /* keep c for surrogate handling, trail will be set there */ + length+=2*(count-1); /* one more byte pair was consumed than count decremented */ + targetCapacity+=count; + } + } - /* ignore unmatched surrogates and just deliver the first one in such a case */ - if(UTF_IS_SECOND_SURROGATE(second)) - { - /* matched pair, get pair value */ - myUChar = UTF16_GET_PAIR_VALUE(first, second); - args->source += 2; + if(c!=0) { + /* + * c is a surrogate, and + * - source or target too short + * - or the surrogate is unmatched + */ + cnv->toUBytes[0]=(uint8_t)c; + cnv->toUBytes[1]=(uint8_t)(c>>8); + cnv->toULength=2; + + if(U16_IS_SURROGATE_LEAD(c)) { + if(length>=2) { + if(U16_IS_TRAIL(trail=((UChar)source[1]<<8)|source[0])) { + /* output the surrogate pair, will overflow (see conditions comment above) */ + source+=2; + length-=2; + *target++=c; + if(offsets!=NULL) { + *offsets++=sourceIndex; + } + cnv->UCharErrorBuffer[0]=trail; + cnv->UCharErrorBufferLength=1; + cnv->toULength=0; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } else { + /* unmatched lead surrogate */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + } + } else { + /* see if the trail surrogate is in the next buffer */ + } + } else { + /* unmatched trail surrogate */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; } } - return myUChar; + if(U_SUCCESS(*pErrorCode)) { + /* check for a remaining source byte */ + if(length>0) { + if(targetCapacity==0) { + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } else { + /* it must be length==1 because otherwise the above would have copied more */ + cnv->toUBytes[cnv->toULength++]=*source++; + } + } + } + + /* write back the updated pointers */ + pArgs->source=(const char *)source; + pArgs->target=target; + pArgs->offsets=offsets; +} + +static UChar32 +_UTF16LEGetNextUChar(UConverterToUnicodeArgs *pArgs, UErrorCode *err) { + const uint8_t *s, *sourceLimit; + UChar32 c; + + s=(const uint8_t *)pArgs->source; + sourceLimit=(const uint8_t *)pArgs->sourceLimit; + + if(s>=sourceLimit) { + /* no input */ + *err=U_INDEX_OUTOFBOUNDS_ERROR; + return 0xffff; + } + + if(s+2>sourceLimit) { + /* only one byte: truncated UChar */ + pArgs->converter->toUBytes[0]=*s++; + pArgs->converter->toULength=1; + pArgs->source=(const char *)s; + *err = U_TRUNCATED_CHAR_FOUND; + return 0xffff; + } + + /* get one UChar */ + c=((UChar32)s[1]<<8)|*s; + s+=2; + + /* check for a surrogate pair */ + if(U_IS_SURROGATE(c)) { + if(U16_IS_SURROGATE_LEAD(c)) { + if(s+2<=sourceLimit) { + UChar trail; + + /* get a second UChar and see if it is a trail surrogate */ + trail=((UChar)s[1]<<8)|*s; + if(U16_IS_TRAIL(trail)) { + c=U16_GET_SUPPLEMENTARY(c, trail); + s+=2; + } else { + /* unmatched lead surrogate */ + c=-2; + } + } else { + /* too few (2 or 3) bytes for a surrogate pair: truncated code point */ + uint8_t *bytes=pArgs->converter->toUBytes; + s-=2; + pArgs->converter->toULength=(int8_t)(sourceLimit-s); + do { + *bytes++=*s++; + } while(sconverter->toUBytes; + pArgs->converter->toULength=2; + *bytes=*(s-2); + bytes[1]=*(s-1); + + c=0xffff; + *err=U_ILLEGAL_CHAR_FOUND; + } + } + + pArgs->source=(const char *)s; + return c; } static const UConverterImpl _UTF16LEImpl={ @@ -532,7 +1087,7 @@ static const UConverterImpl _UTF16LEImpl={ _UTF16LEToUnicodeWithOffsets, _UTF16LEFromUnicodeWithOffsets, _UTF16LEFromUnicodeWithOffsets, - T_UConverter_getNextUChar_UTF16_LE, + _UTF16LEGetNextUChar, NULL, NULL, @@ -542,7 +1097,6 @@ static const UConverterImpl _UTF16LEImpl={ }; -/* The 1200 CCSID refers to any version of Unicode with any endianess of UTF-16 */ static const UConverterStaticData _UTF16LEStaticData={ sizeof(UConverterStaticData), "UTF-16LE", @@ -727,12 +1281,12 @@ _UTF16ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, _UTF16BEToUnicodeWithOffsets(pArgs, pErrorCode); pArgs->source=source; pArgs->sourceLimit=sourceLimit; + state=8; break; } - cnv->mode=0; /* reset */ - } else { - cnv->mode=state; } + + cnv->mode=state; } static UChar32 @@ -740,11 +1294,11 @@ _UTF16GetNextUChar(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode) { switch(pArgs->converter->mode) { case 8: - return T_UConverter_getNextUChar_UTF16_BE(pArgs, pErrorCode); + return _UTF16BEGetNextUChar(pArgs, pErrorCode); case 9: - return T_UConverter_getNextUChar_UTF16_LE(pArgs, pErrorCode); + return _UTF16LEGetNextUChar(pArgs, pErrorCode); default: - return ucnv_getNextUCharFromToUImpl(pArgs, _UTF16ToUnicodeWithOffsets, TRUE, pErrorCode); + return UCNV_GET_NEXT_UCHAR_USE_TO_U; } } @@ -792,3 +1346,5 @@ const UConverterSharedData _UTF16Data = { NULL, NULL, &_UTF16StaticData, FALSE, &_UTF16Impl, 0 }; + +#endif diff --git a/icuSources/common/ucnv_u32.c b/icuSources/common/ucnv_u32.c index 82c15d78..1a37e96f 100644 --- a/icuSources/common/ucnv_u32.c +++ b/icuSources/common/ucnv_u32.c @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2002-2003, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucnv_u32.c @@ -15,82 +15,25 @@ */ #include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + #include "unicode/ucnv.h" -#include "unicode/ucnv_err.h" #include "ucnv_bld.h" #include "ucnv_cnv.h" #include "cmemory.h" #define MAXIMUM_UCS2 0x0000FFFF #define MAXIMUM_UTF 0x0010FFFF -#define MAXIMUM_UCS4 0x7FFFFFFF #define HALF_SHIFT 10 #define HALF_BASE 0x0010000 #define HALF_MASK 0x3FF #define SURROGATE_HIGH_START 0xD800 -#define SURROGATE_HIGH_END 0xDBFF #define SURROGATE_LOW_START 0xDC00 -#define SURROGATE_LOW_END 0xDFFF /* -SURROGATE_LOW_START + HALF_BASE */ #define SURROGATE_LOW_BASE 9216 -/** - * Calls invalid char callback when an invalid character sequence is encountered. - * It presumes that the converter has a callback to call. - * - * @returns true when callback fails - */ -static UBool -T_UConverter_toUnicode_InvalidChar_Callback(UConverterToUnicodeArgs * args, - UConverterCallbackReason reason, - UErrorCode *err) -{ - UConverter *converter = args->converter; - - if (U_SUCCESS(*err)) - { - if (reason == UCNV_ILLEGAL) { - *err = U_ILLEGAL_CHAR_FOUND; - } else { - *err = U_INVALID_CHAR_FOUND; - } - } - - /* copy the toUBytes to the invalidCharBuffer */ - uprv_memcpy(converter->invalidCharBuffer, - converter->toUBytes, - converter->invalidCharLength); - - /* Call the ErrorFunction */ - args->converter->fromCharErrorBehaviour(converter->toUContext, - args, - converter->invalidCharBuffer, - converter->invalidCharLength, - reason, - err); - - return (UBool)U_FAILURE(*err); -} - -static UBool -T_UConverter_toUnicode_InvalidChar_OffsetCallback(UConverterToUnicodeArgs * args, - int32_t currentOffset, - UConverterCallbackReason reason, - UErrorCode *err) -{ - int32_t *saveOffsets = args->offsets; - UBool result; - - result = T_UConverter_toUnicode_InvalidChar_Callback(args, reason, err); - - while (saveOffsets < args->offsets) - { - *(saveOffsets++) = currentOffset; - } - return result; -} - /* UTF-32BE ----------------------------------------------------------------- */ static void @@ -105,8 +48,7 @@ T_UConverter_toUnicode_UTF32_BE(UConverterToUnicodeArgs * args, uint32_t ch, i; /* UTF-8 returns here for only non-offset, this needs to change.*/ - if (args->converter->toUnicodeStatus && myTarget < targetLimit) - { + if (args->converter->toUnicodeStatus && myTarget < targetLimit) { i = args->converter->toULength; /* restore # of bytes consumed */ ch = args->converter->toUnicodeStatus - 1;/*Stores the previously calculated ch from a previous call*/ @@ -114,58 +56,39 @@ T_UConverter_toUnicode_UTF32_BE(UConverterToUnicodeArgs * args, goto morebytes; } - while (mySource < sourceLimit && myTarget < targetLimit) - { + while (mySource < sourceLimit && myTarget < targetLimit) { i = 0; ch = 0; morebytes: - while (i < sizeof(uint32_t)) - { - if (mySource < sourceLimit) - { + while (i < sizeof(uint32_t)) { + if (mySource < sourceLimit) { ch = (ch << 8) | (uint8_t)(*mySource); toUBytes[i++] = (char) *(mySource++); } - else - { - if (args->flush) - { - if (U_SUCCESS(*err)) - { - *err = U_TRUNCATED_CHAR_FOUND; - args->converter->toUnicodeStatus = MAXIMUM_UCS4; - } - } - else - { /* stores a partially calculated target*/ - /* + 1 to make 0 a valid character */ - args->converter->toUnicodeStatus = ch + 1; - args->converter->toULength = (int8_t) i; - } + else { + /* stores a partially calculated target*/ + /* + 1 to make 0 a valid character */ + args->converter->toUnicodeStatus = ch + 1; + args->converter->toULength = (int8_t) i; goto donefornow; } } - if (ch <= MAXIMUM_UTF) - { + if (ch <= MAXIMUM_UTF && !U_IS_SURROGATE(ch)) { /* Normal valid byte when the loop has not prematurely terminated (i < inBytes) */ if (ch <= MAXIMUM_UCS2) { /* fits in 16 bits */ *(myTarget++) = (UChar) ch; } - else - { + else { /* write out the surrogates */ - ch -= HALF_BASE; - *(myTarget++) = (UChar) ((ch >> HALF_SHIFT) + SURROGATE_HIGH_START); - ch = (ch & HALF_MASK) + SURROGATE_LOW_START; - if (myTarget < targetLimit) - { + *(myTarget++) = U16_LEAD(ch); + ch = U16_TRAIL(ch); + if (myTarget < targetLimit) { *(myTarget++) = (UChar)ch; } - else - { + else { /* Put in overflow buffer (not handled here) */ args->converter->UCharErrorBuffer[0] = (UChar) ch; args->converter->UCharErrorBufferLength = 1; @@ -174,25 +97,15 @@ morebytes: } } } - else - { - args->source = (const char *) mySource; - args->target = myTarget; - args->converter->invalidCharLength = (int8_t)i; - if (T_UConverter_toUnicode_InvalidChar_Callback(args, UCNV_ILLEGAL, err)) - { - /* Stop if the error wasn't handled */ - break; - } - args->converter->invalidCharLength = 0; - mySource = (unsigned char *) args->source; - myTarget = args->target; + else { + args->converter->toULength = (int8_t)i; + *err = U_ILLEGAL_CHAR_FOUND; + break; } } donefornow: - if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) - { + if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) { /* End of target buffer */ *err = U_BUFFER_OVERFLOW_ERROR; } @@ -214,8 +127,7 @@ T_UConverter_toUnicode_UTF32_BE_OFFSET_LOGIC(UConverterToUnicodeArgs * args, uint32_t ch, i; int32_t offsetNum = 0; - if (args->converter->toUnicodeStatus && myTarget < targetLimit) - { + if (args->converter->toUnicodeStatus && myTarget < targetLimit) { i = args->converter->toULength; /* restore # of bytes consumed */ ch = args->converter->toUnicodeStatus - 1;/*Stores the previously calculated ch from a previous call*/ @@ -223,61 +135,42 @@ T_UConverter_toUnicode_UTF32_BE_OFFSET_LOGIC(UConverterToUnicodeArgs * args, goto morebytes; } - while (mySource < sourceLimit && myTarget < targetLimit) - { + while (mySource < sourceLimit && myTarget < targetLimit) { i = 0; ch = 0; morebytes: - while (i < sizeof(uint32_t)) - { - if (mySource < sourceLimit) - { + while (i < sizeof(uint32_t)) { + if (mySource < sourceLimit) { ch = (ch << 8) | (uint8_t)(*mySource); toUBytes[i++] = (char) *(mySource++); } - else - { - if (args->flush) - { - if (U_SUCCESS(*err)) - { - *err = U_TRUNCATED_CHAR_FOUND; - args->converter->toUnicodeStatus = MAXIMUM_UCS4; - } - } - else - { /* stores a partially calculated target*/ - /* + 1 to make 0 a valid character */ - args->converter->toUnicodeStatus = ch + 1; - args->converter->toULength = (int8_t) i; - } + else { + /* stores a partially calculated target*/ + /* + 1 to make 0 a valid character */ + args->converter->toUnicodeStatus = ch + 1; + args->converter->toULength = (int8_t) i; goto donefornow; } } - if (ch <= MAXIMUM_UTF) - { + if (ch <= MAXIMUM_UTF && !U_IS_SURROGATE(ch)) { /* Normal valid byte when the loop has not prematurely terminated (i < inBytes) */ - if (ch <= MAXIMUM_UCS2) - { + if (ch <= MAXIMUM_UCS2) { /* fits in 16 bits */ *(myTarget++) = (UChar) ch; *(myOffsets++) = offsetNum; } - else - { + else { /* write out the surrogates */ - ch -= HALF_BASE; - *(myTarget++) = (UChar) ((ch >> HALF_SHIFT) + SURROGATE_HIGH_START); + *(myTarget++) = U16_LEAD(ch); *myOffsets++ = offsetNum; - ch = (ch & HALF_MASK) + SURROGATE_LOW_START; + ch = U16_TRAIL(ch); if (myTarget < targetLimit) { *(myTarget++) = (UChar)ch; *(myOffsets++) = offsetNum; } - else - { + else { /* Put in overflow buffer (not handled here) */ args->converter->UCharErrorBuffer[0] = (UChar) ch; args->converter->UCharErrorBufferLength = 1; @@ -286,21 +179,10 @@ morebytes: } } } - else - { - args->source = (const char *) mySource; - args->target = myTarget; - args->converter->invalidCharLength = (int8_t)i; - args->offsets = myOffsets; - if (T_UConverter_toUnicode_InvalidChar_OffsetCallback(args, offsetNum, UCNV_ILLEGAL, err)) - { - /* Stop if the error wasn't handled */ - break; - } - args->converter->invalidCharLength = 0; - mySource = (unsigned char *) args->source; - myTarget = args->target; - myOffsets = args->offsets; + else { + args->converter->toULength = (int8_t)i; + *err = U_ILLEGAL_CHAR_FOUND; + break; } offsetNum += i; } @@ -331,33 +213,48 @@ T_UConverter_fromUnicode_UTF32_BE(UConverterFromUnicodeArgs * args, temp[0] = 0; - if (args->converter->fromUnicodeStatus) - { - ch = args->converter->fromUnicodeStatus; - args->converter->fromUnicodeStatus = 0; + if (args->converter->fromUChar32) { + ch = args->converter->fromUChar32; + args->converter->fromUChar32 = 0; goto lowsurogate; } - while (mySource < sourceLimit && myTarget < targetLimit) - { + while (mySource < sourceLimit && myTarget < targetLimit) { ch = *(mySource++); - if (SURROGATE_HIGH_START <= ch && ch < SURROGATE_LOW_START) - { + if (UTF_IS_SURROGATE(ch)) { + if (U_IS_LEAD(ch)) { lowsurogate: - if (mySource < sourceLimit) - { - ch2 = *mySource; - if (SURROGATE_LOW_START <= ch2 && ch2 <= SURROGATE_LOW_END) - { - ch = ((ch - SURROGATE_HIGH_START) << HALF_SHIFT) + ch2 + SURROGATE_LOW_BASE; - mySource++; + if (mySource < sourceLimit) { + ch2 = *mySource; + if (U_IS_TRAIL(ch2)) { + ch = ((ch - SURROGATE_HIGH_START) << HALF_SHIFT) + ch2 + SURROGATE_LOW_BASE; + mySource++; + } + else { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + args->converter->fromUChar32 = ch; + *err = U_ILLEGAL_CHAR_FOUND; + break; + } + } + else { + /* ran out of source */ + args->converter->fromUChar32 = ch; + if (args->flush) { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + *err = U_ILLEGAL_CHAR_FOUND; + } + break; } } - else if (!args->flush) - { - /* ran out of source */ - args->converter->fromUnicodeStatus = ch; + else { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + args->converter->fromUChar32 = ch; + *err = U_ILLEGAL_CHAR_FOUND; break; } } @@ -367,22 +264,18 @@ lowsurogate: temp[2] = (uint8_t) (ch >> 8); /* unsigned cast implicitly does (ch & FF) */ temp[3] = (uint8_t) (ch); /* unsigned cast implicitly does (ch & FF) */ - for (indexToWrite = 0; indexToWrite <= sizeof(uint32_t) - 1; indexToWrite++) - { - if (myTarget < targetLimit) - { + for (indexToWrite = 0; indexToWrite <= sizeof(uint32_t) - 1; indexToWrite++) { + if (myTarget < targetLimit) { *(myTarget++) = temp[indexToWrite]; } - else - { + else { args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = temp[indexToWrite]; *err = U_BUFFER_OVERFLOW_ERROR; } } } - if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) - { + if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) { *err = U_BUFFER_OVERFLOW_ERROR; } @@ -406,33 +299,48 @@ T_UConverter_fromUnicode_UTF32_BE_OFFSET_LOGIC(UConverterFromUnicodeArgs * args, temp[0] = 0; - if (args->converter->fromUnicodeStatus) - { - ch = args->converter->fromUnicodeStatus; - args->converter->fromUnicodeStatus = 0; + if (args->converter->fromUChar32) { + ch = args->converter->fromUChar32; + args->converter->fromUChar32 = 0; goto lowsurogate; } - while (mySource < sourceLimit && myTarget < targetLimit) - { + while (mySource < sourceLimit && myTarget < targetLimit) { ch = *(mySource++); - if (SURROGATE_HIGH_START <= ch && ch < SURROGATE_LOW_START) - { + if (UTF_IS_SURROGATE(ch)) { + if (U_IS_LEAD(ch)) { lowsurogate: - if (mySource < sourceLimit) - { - ch2 = *mySource; - if (SURROGATE_LOW_START <= ch2 && ch2 <= SURROGATE_LOW_END) - { - ch = ((ch - SURROGATE_HIGH_START) << HALF_SHIFT) + ch2 + SURROGATE_LOW_BASE; - mySource++; + if (mySource < sourceLimit) { + ch2 = *mySource; + if (U_IS_TRAIL(ch2)) { + ch = ((ch - SURROGATE_HIGH_START) << HALF_SHIFT) + ch2 + SURROGATE_LOW_BASE; + mySource++; + } + else { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + args->converter->fromUChar32 = ch; + *err = U_ILLEGAL_CHAR_FOUND; + break; + } + } + else { + /* ran out of source */ + args->converter->fromUChar32 = ch; + if (args->flush) { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + *err = U_ILLEGAL_CHAR_FOUND; + } + break; } } - else if (!args->flush) - { - /* ran out of source */ - args->converter->fromUnicodeStatus = ch; + else { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + args->converter->fromUChar32 = ch; + *err = U_ILLEGAL_CHAR_FOUND; break; } } @@ -442,15 +350,12 @@ lowsurogate: temp[2] = (uint8_t) (ch >> 8); /* unsigned cast implicitly does (ch & FF) */ temp[3] = (uint8_t) (ch); /* unsigned cast implicitly does (ch & FF) */ - for (indexToWrite = 0; indexToWrite <= sizeof(uint32_t) - 1; indexToWrite++) - { - if (myTarget < targetLimit) - { + for (indexToWrite = 0; indexToWrite <= sizeof(uint32_t) - 1; indexToWrite++) { + if (myTarget < targetLimit) { *(myTarget++) = temp[indexToWrite]; *(myOffsets++) = offsetNum; } - else - { + else { args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = temp[indexToWrite]; *err = U_BUFFER_OVERFLOW_ERROR; } @@ -458,8 +363,7 @@ lowsurogate: offsetNum++; } - if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) - { + if (mySource < sourceLimit && myTarget >= targetLimit && U_SUCCESS(*err)) { *err = U_BUFFER_OVERFLOW_ERROR; } @@ -472,65 +376,44 @@ static UChar32 T_UConverter_getNextUChar_UTF32_BE(UConverterToUnicodeArgs* args, UErrorCode* err) { - UChar myUCharBuf[2]; - UChar *myUCharPtr; - const unsigned char *mySource; + const uint8_t *mySource; UChar32 myUChar; int32_t length; - while (args->source < args->sourceLimit) + mySource = (const uint8_t *)args->source; + if (mySource >= (const uint8_t *)args->sourceLimit) { - if (args->source + 4 > args->sourceLimit) - { - /* got a partial character */ - *err = U_TRUNCATED_CHAR_FOUND; - return 0xffff; - } + /* no input */ + *err = U_INDEX_OUTOFBOUNDS_ERROR; + return 0xffff; + } - /* Don't even try to do a direct cast because the value may be on an odd address. */ - mySource = (unsigned char *) args->source; - myUChar = (mySource[0] << 24) - | (mySource[1] << 16) - | (mySource[2] << 8) - | (mySource[3]); + length = (int32_t)((const uint8_t *)args->sourceLimit - mySource); + if (length < 4) + { + /* got a partial character */ + uprv_memcpy(args->converter->toUBytes, mySource, length); + args->converter->toULength = (int8_t)length; + args->source = (const char *)(mySource + length); + *err = U_TRUNCATED_CHAR_FOUND; + return 0xffff; + } - args->source = (const char *)(mySource + 4); - if (myUChar <= MAXIMUM_UTF && myUChar >= 0) { - return myUChar; - } + /* Don't even try to do a direct cast because the value may be on an odd address. */ + myUChar = ((UChar32)mySource[0] << 24) + | ((UChar32)mySource[1] << 16) + | ((UChar32)mySource[2] << 8) + | ((UChar32)mySource[3]); - uprv_memcpy(args->converter->invalidCharBuffer, mySource, 4); - args->converter->invalidCharLength = 4; - - myUCharPtr = myUCharBuf; - *err = U_ILLEGAL_CHAR_FOUND; - args->target = myUCharPtr; - args->targetLimit = myUCharBuf + 2; - args->converter->fromCharErrorBehaviour(args->converter->toUContext, - args, - (const char *)mySource, - 4, - UCNV_ILLEGAL, - err); - - if(U_SUCCESS(*err)) { - length = (uint16_t)(args->target - myUCharBuf); - if(length > 0) { - return ucnv_getUChar32KeepOverflow(args->converter, myUCharBuf, length); - } - /* else (callback did not write anything) continue */ - } else if(*err == U_BUFFER_OVERFLOW_ERROR) { - *err = U_ZERO_ERROR; - return ucnv_getUChar32KeepOverflow(args->converter, myUCharBuf, 2); - } else { - /* break on error */ - /* ### what if a callback set an error but _also_ generated output?! */ - return 0xffff; - } + args->source = (const char *)(mySource + 4); + if ((uint32_t)myUChar <= MAXIMUM_UTF && !U_IS_SURROGATE(myUChar)) { + return myUChar; } - /* no input or only skipping callbacks */ - *err = U_INDEX_OUTOFBOUNDS_ERROR; + uprv_memcpy(args->converter->toUBytes, mySource, 4); + args->converter->toULength = 4; + + *err = U_ILLEGAL_CHAR_FOUND; return 0xffff; } @@ -613,44 +496,28 @@ morebytes: } else { - if (args->flush) - { - if (U_SUCCESS(*err)) - { - *err = U_TRUNCATED_CHAR_FOUND; - args->converter->toUnicodeStatus = 0; - } - } - else - { /* stores a partially calculated target*/ - /* + 1 to make 0 a valid character */ - args->converter->toUnicodeStatus = ch + 1; - args->converter->toULength = (int8_t) i; - } + /* stores a partially calculated target*/ + /* + 1 to make 0 a valid character */ + args->converter->toUnicodeStatus = ch + 1; + args->converter->toULength = (int8_t) i; goto donefornow; } } - if (ch <= MAXIMUM_UTF) - { + if (ch <= MAXIMUM_UTF && !U_IS_SURROGATE(ch)) { /* Normal valid byte when the loop has not prematurely terminated (i < inBytes) */ - if (ch <= MAXIMUM_UCS2) - { + if (ch <= MAXIMUM_UCS2) { /* fits in 16 bits */ *(myTarget++) = (UChar) ch; } - else - { + else { /* write out the surrogates */ - ch -= HALF_BASE; - *(myTarget++) = (UChar) ((ch >> HALF_SHIFT) + SURROGATE_HIGH_START); - ch = (ch & HALF_MASK) + SURROGATE_LOW_START; - if (myTarget < targetLimit) - { + *(myTarget++) = U16_LEAD(ch); + ch = U16_TRAIL(ch); + if (myTarget < targetLimit) { *(myTarget++) = (UChar)ch; } - else - { + else { /* Put in overflow buffer (not handled here) */ args->converter->UCharErrorBuffer[0] = (UChar) ch; args->converter->UCharErrorBufferLength = 1; @@ -659,19 +526,10 @@ morebytes: } } } - else - { - args->source = (const char *) mySource; - args->target = myTarget; - args->converter->invalidCharLength = (int8_t)i; - if (T_UConverter_toUnicode_InvalidChar_Callback(args, UCNV_ILLEGAL, err)) - { - /* Stop if the error wasn't handled */ - break; - } - args->converter->invalidCharLength = 0; - mySource = (unsigned char *) args->source; - myTarget = args->target; + else { + args->converter->toULength = (int8_t)i; + *err = U_ILLEGAL_CHAR_FOUND; + break; } } @@ -724,25 +582,15 @@ morebytes: } else { - if (args->flush) - { - if (U_SUCCESS(*err)) - { - *err = U_TRUNCATED_CHAR_FOUND; - args->converter->toUnicodeStatus = 0; - } - } - else - { /* stores a partially calculated target*/ - /* + 1 to make 0 a valid character */ - args->converter->toUnicodeStatus = ch + 1; - args->converter->toULength = (int8_t) i; - } + /* stores a partially calculated target*/ + /* + 1 to make 0 a valid character */ + args->converter->toUnicodeStatus = ch + 1; + args->converter->toULength = (int8_t) i; goto donefornow; } } - if (ch <= MAXIMUM_UTF) + if (ch <= MAXIMUM_UTF && !U_IS_SURROGATE(ch)) { /* Normal valid byte when the loop has not prematurely terminated (i < inBytes) */ if (ch <= MAXIMUM_UCS2) @@ -751,13 +599,11 @@ morebytes: *(myTarget++) = (UChar) ch; *(myOffsets++) = offsetNum; } - else - { + else { /* write out the surrogates */ - ch -= HALF_BASE; - *(myTarget++) = (UChar) ((ch >> HALF_SHIFT) + SURROGATE_HIGH_START); + *(myTarget++) = U16_LEAD(ch); *(myOffsets++) = offsetNum; - ch = (ch & HALF_MASK) + SURROGATE_LOW_START; + ch = U16_TRAIL(ch); if (myTarget < targetLimit) { *(myTarget++) = (UChar)ch; @@ -775,19 +621,9 @@ morebytes: } else { - args->source = (const char *) mySource; - args->target = myTarget; - args->converter->invalidCharLength = (int8_t)i; - args->offsets = myOffsets; - if (T_UConverter_toUnicode_InvalidChar_OffsetCallback(args, offsetNum, UCNV_ILLEGAL, err)) - { - /* Stop if the error wasn't handled */ - break; - } - args->converter->invalidCharLength = 0; - mySource = (unsigned char *) args->source; - myTarget = args->target; - myOffsets = args->offsets; + args->converter->toULength = (int8_t)i; + *err = U_ILLEGAL_CHAR_FOUND; + break; } offsetNum += i; } @@ -818,10 +654,10 @@ T_UConverter_fromUnicode_UTF32_LE(UConverterFromUnicodeArgs * args, temp[3] = 0; - if (args->converter->fromUnicodeStatus) + if (args->converter->fromUChar32) { - ch = args->converter->fromUnicodeStatus; - args->converter->fromUnicodeStatus = 0; + ch = args->converter->fromUChar32; + args->converter->fromUChar32 = 0; goto lowsurogate; } @@ -829,22 +665,41 @@ T_UConverter_fromUnicode_UTF32_LE(UConverterFromUnicodeArgs * args, { ch = *(mySource++); - if (SURROGATE_HIGH_START <= ch && ch < SURROGATE_LOW_START) - { -lowsurogate: - if (mySource < sourceLimit) + if (UTF_IS_SURROGATE(ch)) { + if (U_IS_LEAD(ch)) { - ch2 = *mySource; - if (SURROGATE_LOW_START <= ch2 && ch2 <= SURROGATE_LOW_END) +lowsurogate: + if (mySource < sourceLimit) { - ch = ((ch - SURROGATE_HIGH_START) << HALF_SHIFT) + ch2 + SURROGATE_LOW_BASE; - mySource++; + ch2 = *mySource; + if (U_IS_TRAIL(ch2)) { + ch = ((ch - SURROGATE_HIGH_START) << HALF_SHIFT) + ch2 + SURROGATE_LOW_BASE; + mySource++; + } + else { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + args->converter->fromUChar32 = ch; + *err = U_ILLEGAL_CHAR_FOUND; + break; + } + } + else { + /* ran out of source */ + args->converter->fromUChar32 = ch; + if (args->flush) { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + *err = U_ILLEGAL_CHAR_FOUND; + } + break; } } - else if (!args->flush) - { - /* ran out of source */ - args->converter->fromUnicodeStatus = ch; + else { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + args->converter->fromUChar32 = ch; + *err = U_ILLEGAL_CHAR_FOUND; break; } } @@ -893,10 +748,10 @@ T_UConverter_fromUnicode_UTF32_LE_OFFSET_LOGIC(UConverterFromUnicodeArgs * args, temp[3] = 0; - if (args->converter->fromUnicodeStatus) + if (args->converter->fromUChar32) { - ch = args->converter->fromUnicodeStatus; - args->converter->fromUnicodeStatus = 0; + ch = args->converter->fromUChar32; + args->converter->fromUChar32 = 0; goto lowsurogate; } @@ -904,22 +759,42 @@ T_UConverter_fromUnicode_UTF32_LE_OFFSET_LOGIC(UConverterFromUnicodeArgs * args, { ch = *(mySource++); - if (SURROGATE_HIGH_START <= ch && ch < SURROGATE_LOW_START) - { -lowsurogate: - if (mySource < sourceLimit) + if (UTF_IS_SURROGATE(ch)) { + if (U_IS_LEAD(ch)) { - ch2 = *mySource; - if (SURROGATE_LOW_START <= ch2 && ch2 <= SURROGATE_LOW_END) +lowsurogate: + if (mySource < sourceLimit) { - ch = ((ch - SURROGATE_HIGH_START) << HALF_SHIFT) + ch2 + SURROGATE_LOW_BASE; - mySource++; + ch2 = *mySource; + if (U_IS_TRAIL(ch2)) + { + ch = ((ch - SURROGATE_HIGH_START) << HALF_SHIFT) + ch2 + SURROGATE_LOW_BASE; + mySource++; + } + else { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + args->converter->fromUChar32 = ch; + *err = U_ILLEGAL_CHAR_FOUND; + break; + } + } + else { + /* ran out of source */ + args->converter->fromUChar32 = ch; + if (args->flush) { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + *err = U_ILLEGAL_CHAR_FOUND; + } + break; } } - else if (!args->flush) - { - /* ran out of source */ - args->converter->fromUnicodeStatus = ch; + else { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + args->converter->fromUChar32 = ch; + *err = U_ILLEGAL_CHAR_FOUND; break; } } @@ -959,65 +834,44 @@ static UChar32 T_UConverter_getNextUChar_UTF32_LE(UConverterToUnicodeArgs* args, UErrorCode* err) { - UChar myUCharBuf[2]; - UChar *myUCharPtr; - const unsigned char *mySource; + const uint8_t *mySource; UChar32 myUChar; int32_t length; - while (args->source < args->sourceLimit) + mySource = (const uint8_t *)args->source; + if (mySource >= (const uint8_t *)args->sourceLimit) { - if (args->source + 4 > args->sourceLimit) - { - /* got a partial character */ - *err = U_TRUNCATED_CHAR_FOUND; - return 0xffff; - } + /* no input */ + *err = U_INDEX_OUTOFBOUNDS_ERROR; + return 0xffff; + } - /* Don't even try to do a direct cast because the value may be on an odd address. */ - mySource = (unsigned char *) args->source; - myUChar = (mySource[0]) - | (mySource[1] << 8) - | (mySource[2] << 16) - | (mySource[3] << 24); + length = (int32_t)((const uint8_t *)args->sourceLimit - mySource); + if (length < 4) + { + /* got a partial character */ + uprv_memcpy(args->converter->toUBytes, mySource, length); + args->converter->toULength = (int8_t)length; + args->source = (const char *)(mySource + length); + *err = U_TRUNCATED_CHAR_FOUND; + return 0xffff; + } - args->source = (const char *)(mySource + 4); - if (myUChar <= MAXIMUM_UTF && myUChar >= 0) { - return myUChar; - } + /* Don't even try to do a direct cast because the value may be on an odd address. */ + myUChar = ((UChar32)mySource[3] << 24) + | ((UChar32)mySource[2] << 16) + | ((UChar32)mySource[1] << 8) + | ((UChar32)mySource[0]); - uprv_memcpy(args->converter->invalidCharBuffer, mySource, 4); - args->converter->invalidCharLength = 4; - - myUCharPtr = myUCharBuf; - *err = U_ILLEGAL_CHAR_FOUND; - args->target = myUCharPtr; - args->targetLimit = myUCharBuf + 2; - args->converter->fromCharErrorBehaviour(args->converter->toUContext, - args, - (const char *)mySource, - 4, - UCNV_ILLEGAL, - err); - - if(U_SUCCESS(*err)) { - length = (uint16_t)(args->target - myUCharBuf); - if(length > 0) { - return ucnv_getUChar32KeepOverflow(args->converter, myUCharBuf, length); - } - /* else (callback did not write anything) continue */ - } else if(*err == U_BUFFER_OVERFLOW_ERROR) { - *err = U_ZERO_ERROR; - return ucnv_getUChar32KeepOverflow(args->converter, myUCharBuf, 2); - } else { - /* break on error */ - /* ### what if a callback set an error but _also_ generated output?! */ - return 0xffff; - } + args->source = (const char *)(mySource + 4); + if ((uint32_t)myUChar <= MAXIMUM_UTF && !U_IS_SURROGATE(myUChar)) { + return myUChar; } - /* no input or only skipping callbacks */ - *err = U_INDEX_OUTOFBOUNDS_ERROR; + uprv_memcpy(args->converter->toUBytes, mySource, 4); + args->converter->toULength = 4; + + *err = U_ILLEGAL_CHAR_FOUND; return 0xffff; } @@ -1253,12 +1107,12 @@ _UTF32ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, T_UConverter_toUnicode_UTF32_BE(pArgs, pErrorCode); pArgs->source=source; pArgs->sourceLimit=sourceLimit; + state=8; break; } - cnv->mode=0; /* reset */ - } else { - cnv->mode=state; } + + cnv->mode=state; } static UChar32 @@ -1270,7 +1124,7 @@ _UTF32GetNextUChar(UConverterToUnicodeArgs *pArgs, case 9: return T_UConverter_getNextUChar_UTF32_LE(pArgs, pErrorCode); default: - return ucnv_getNextUCharFromToUImpl(pArgs, _UTF32ToUnicodeWithOffsets, FALSE, pErrorCode); + return UCNV_GET_NEXT_UCHAR_USE_TO_U; } } @@ -1323,3 +1177,5 @@ const UConverterSharedData _UTF32Data = { NULL, NULL, &_UTF32StaticData, FALSE, &_UTF32Impl, 0 }; + +#endif diff --git a/icuSources/common/ucnv_u7.c b/icuSources/common/ucnv_u7.c index 202edefd..f15da503 100644 --- a/icuSources/common/ucnv_u7.c +++ b/icuSources/common/ucnv_u7.c @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2002-2003, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucnv_u7.c @@ -15,14 +15,15 @@ */ #include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + #include "unicode/ucnv.h" -#include "unicode/ucnv_err.h" #include "ucnv_bld.h" #include "ucnv_cnv.h" /* UTF-7 -------------------------------------------------------------------- */ -/* ### TODO: in user guide, document version option (=1 for escaping set O characters) */ /* * UTF-7 is a stateful encoding of Unicode. * It is defined in RFC 2152. (http://www.ietf.org/rfc/rfc2152.txt) @@ -247,7 +248,6 @@ _UTF7ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, sourceIndex=byteIndex==0 ? 0 : -1; nextSourceIndex=0; -loop: if(inDirectMode) { directMode: /* @@ -270,8 +270,8 @@ directMode: /* illegal */ bytes[0]=b; byteIndex=1; - nextSourceIndex=sourceIndex+1; - goto callback; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + break; } else if(b!=PLUS) { /* write directly encoded character */ *target++=b; @@ -312,7 +312,8 @@ unicodeMode: if(b>=126) { /* illegal - test other illegal US-ASCII values by base64Value==-3 */ inDirectMode=TRUE; - goto callback; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + break; } else if((base64Value=fromBase64[b])>=0) { /* collect base64 bytes into UChars */ switch(base64Counter) { @@ -377,7 +378,8 @@ unicodeMode: /* absorb the minus and leave the Unicode Mode */ if(bits!=0) { /* bits are illegally left over, a UChar is incomplete */ - goto callback; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + break; } } sourceIndex=nextSourceIndex; @@ -392,7 +394,8 @@ unicodeMode: bytes[0]=PLUS; bytes[1]=b; byteIndex=2; - goto callback; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + break; } else if(bits==0) { /* un-read the character in case it is a plus sign */ --source; @@ -400,12 +403,14 @@ unicodeMode: goto directMode; } else { /* bits are illegally left over, a UChar is incomplete */ - goto callback; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + break; } } else /* base64Value==-3 for illegal characters */ { /* illegal */ inDirectMode=TRUE; - goto callback; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + break; } } else { /* target is full */ @@ -414,91 +419,26 @@ unicodeMode: } } } -endloop: - if(pArgs->flush && source>=sourceLimit) { - /* reset the state for the next conversion */ - if(!inDirectMode && bits!=0 && U_SUCCESS(*pErrorCode)) { - /* a character byte sequence remains incomplete */ - *pErrorCode=U_TRUNCATED_CHAR_FOUND; - } - cnv->toUnicodeStatus=0x1000000; /* inDirectMode=TRUE */ - cnv->toULength=0; - } else { - /* set the converter state back into UConverter */ - cnv->toUnicodeStatus=((uint32_t)inDirectMode<<24)|((uint32_t)((uint8_t)base64Counter)<<16)|(uint32_t)bits; - cnv->toULength=byteIndex; + if(U_SUCCESS(*pErrorCode) && pArgs->flush && source==sourceLimit && bits==0) { + /* + * if we are in Unicode mode, then the byteIndex might not be 0, + * but that is ok if bits==0 + * -> we set byteIndex=0 at the end of the stream to avoid a truncated error + * (not true for IMAP-mailbox-name where we must end in direct mode) + */ + byteIndex=0; } -finish: + /* set the converter state back into UConverter */ + cnv->toUnicodeStatus=((uint32_t)inDirectMode<<24)|((uint32_t)((uint8_t)base64Counter)<<16)|(uint32_t)bits; + cnv->toULength=byteIndex; + /* write back the updated pointers */ pArgs->source=(const char *)source; pArgs->target=target; pArgs->offsets=offsets; return; - -callback: - /* call the callback function with all the preparations and post-processing */ - /* update the arguments structure */ - pArgs->source=(const char *)source; - pArgs->target=target; - pArgs->offsets=offsets; - - /* copy the current bytes to invalidCharBuffer */ - for(b=0; b<(uint8_t)byteIndex; ++b) { - cnv->invalidCharBuffer[b]=(char)bytes[b]; - } - cnv->invalidCharLength=byteIndex; - - /* set the converter state in UConverter to deal with the next character */ - cnv->toUnicodeStatus=(uint32_t)inDirectMode<<24; - cnv->toULength=0; - - /* call the callback function */ - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - cnv->fromCharErrorBehaviour(cnv->toUContext, pArgs, cnv->invalidCharBuffer, cnv->invalidCharLength, UCNV_ILLEGAL, pErrorCode); - - /* get the converter state from UConverter */ - { - uint32_t status=cnv->toUnicodeStatus; - inDirectMode=(UBool)((status>>24)&1); - base64Counter=(int8_t)(status>>16); - bits=(uint16_t)status; - } - byteIndex=cnv->toULength; - - /* update target and deal with offsets if necessary */ - offsets=ucnv_updateCallbackOffsets(offsets, pArgs->target-target, sourceIndex); - target=pArgs->target; - - /* update the source pointer and index */ - sourceIndex=nextSourceIndex+((const uint8_t *)pArgs->source-source); - source=(const uint8_t *)pArgs->source; - - /* - * If the callback overflowed the target, then we need to - * stop here with an overflow indication. - */ - if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR) { - goto endloop; - } else if(cnv->UCharErrorBufferLength>0) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - goto endloop; - } else if(U_FAILURE(*pErrorCode)) { - /* break on error */ - cnv->toUnicodeStatus=0x1000000; /* inDirectMode=TRUE */ - cnv->toULength=0; - goto finish; - } else { - goto loop; - } -} - -static UChar32 -_UTF7GetNextUChar(UConverterToUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - return ucnv_getNextUCharFromToUImpl(pArgs, pArgs->converter->sharedData->impl->toUnicode, TRUE, pErrorCode); } static void @@ -788,7 +728,7 @@ static const UConverterImpl _UTF7Impl={ _UTF7ToUnicodeWithOffsets, _UTF7FromUnicodeWithOffsets, _UTF7FromUnicodeWithOffsets, - _UTF7GetNextUChar, + NULL, NULL, _UTF7GetName, @@ -967,7 +907,6 @@ _IMAPToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, sourceIndex=byteIndex==0 ? 0 : -1; nextSourceIndex=0; -loop: if(inDirectMode) { directMode: /* @@ -989,8 +928,8 @@ directMode: /* illegal */ bytes[0]=b; byteIndex=1; - nextSourceIndex=sourceIndex+1; - goto callback; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + break; } else if(b!=AMPERSAND) { /* write directly encoded character */ *target++=b; @@ -1032,7 +971,8 @@ unicodeMode: if(b>0x7e) { /* illegal - test other illegal US-ASCII values by base64Value==-3 */ inDirectMode=TRUE; - goto callback; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + break; } else if((base64Value=FROM_BASE64_IMAP(b))>=0) { /* collect base64 bytes into UChars */ switch(base64Counter) { @@ -1053,7 +993,8 @@ unicodeMode: if(isLegalIMAP(c)) { /* illegal */ inDirectMode=TRUE; - goto callback; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + goto endloop; } *target++=c; if(offsets!=NULL) { @@ -1070,7 +1011,8 @@ unicodeMode: if(isLegalIMAP(c)) { /* illegal */ inDirectMode=TRUE; - goto callback; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + goto endloop; } *target++=c; if(offsets!=NULL) { @@ -1087,7 +1029,8 @@ unicodeMode: if(isLegalIMAP(c)) { /* illegal */ inDirectMode=TRUE; - goto callback; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + goto endloop; } *target++=c; if(offsets!=NULL) { @@ -1116,7 +1059,8 @@ unicodeMode: if(bits!=0 || (base64Counter!=0 && base64Counter!=3 && base64Counter!=6)) { /* bits are illegally left over, a UChar is incomplete */ /* base64Counter other than 0, 3, 6 means non-minimal zero-padding, also illegal */ - goto callback; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + break; } } sourceIndex=nextSourceIndex; @@ -1134,7 +1078,8 @@ unicodeMode: /* base64Value==-3 for illegal characters */ /* illegal */ inDirectMode=TRUE; - goto callback; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + break; } } else { /* target is full */ @@ -1145,83 +1090,41 @@ unicodeMode: } endloop: - if(pArgs->flush && source>=sourceLimit) { - /* reset the state for the next conversion */ - if(!inDirectMode && U_SUCCESS(*pErrorCode)) { - /* a character byte sequence remains incomplete - IMAP must end in ASCII/direct mode */ - *pErrorCode=U_TRUNCATED_CHAR_FOUND; + /* + * the end of the input stream and detection of truncated input + * are handled by the framework, but here we must check if we are in Unicode + * mode and byteIndex==0 because we must end in direct mode + * + * conditions: + * successful + * in Unicode mode and byteIndex==0 + * end of input and no truncated input + */ + if( U_SUCCESS(*pErrorCode) && + !inDirectMode && byteIndex==0 && + pArgs->flush && source>=sourceLimit + ) { + if(base64Counter==-1) { + /* & at the very end of the input */ + /* make the ampersand the reported sequence */ + bytes[0]=AMPERSAND; + byteIndex=1; } - cnv->toUnicodeStatus=0x1000000; /* inDirectMode=TRUE */ - cnv->toULength=0; - } else { - /* set the converter state back into UConverter */ - cnv->toUnicodeStatus=((uint32_t)inDirectMode<<24)|((uint32_t)((uint8_t)base64Counter)<<16)|(uint32_t)bits; - cnv->toULength=byteIndex; + /* else if(base64Counter!=-1) byteIndex remains 0 because there is no particular byte sequence */ + + inDirectMode=TRUE; /* avoid looping */ + *pErrorCode=U_TRUNCATED_CHAR_FOUND; } -finish: + /* set the converter state back into UConverter */ + cnv->toUnicodeStatus=((uint32_t)inDirectMode<<24)|((uint32_t)((uint8_t)base64Counter)<<16)|(uint32_t)bits; + cnv->toULength=byteIndex; + /* write back the updated pointers */ pArgs->source=(const char *)source; pArgs->target=target; pArgs->offsets=offsets; return; - -callback: - /* call the callback function with all the preparations and post-processing */ - /* update the arguments structure */ - pArgs->source=(const char *)source; - pArgs->target=target; - pArgs->offsets=offsets; - - /* copy the current bytes to invalidCharBuffer */ - for(b=0; b<(uint8_t)byteIndex; ++b) { - cnv->invalidCharBuffer[b]=(char)bytes[b]; - } - cnv->invalidCharLength=byteIndex; - - /* set the converter state in UConverter to deal with the next character */ - cnv->toUnicodeStatus=(uint32_t)inDirectMode<<24; - cnv->toULength=0; - - /* call the callback function */ - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - cnv->fromCharErrorBehaviour(cnv->toUContext, pArgs, cnv->invalidCharBuffer, cnv->invalidCharLength, UCNV_ILLEGAL, pErrorCode); - - /* get the converter state from UConverter */ - { - uint32_t status=cnv->toUnicodeStatus; - inDirectMode=(UBool)((status>>24)&1); - base64Counter=(int8_t)(status>>16); - bits=(uint16_t)status; - } - byteIndex=cnv->toULength; - - /* update target and deal with offsets if necessary */ - offsets=ucnv_updateCallbackOffsets(offsets, pArgs->target-target, sourceIndex); - target=pArgs->target; - - /* update the source pointer and index */ - sourceIndex=nextSourceIndex+((const uint8_t *)pArgs->source-source); - source=(const uint8_t *)pArgs->source; - - /* - * If the callback overflowed the target, then we need to - * stop here with an overflow indication. - */ - if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR) { - goto endloop; - } else if(cnv->UCharErrorBufferLength>0) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - goto endloop; - } else if(U_FAILURE(*pErrorCode)) { - /* break on error */ - cnv->toUnicodeStatus=0x1000000; /* inDirectMode=TRUE */ - cnv->toULength=0; - goto finish; - } else { - goto loop; - } } static void @@ -1525,7 +1428,7 @@ static const UConverterImpl _IMAPImpl={ _IMAPToUnicodeWithOffsets, _IMAPFromUnicodeWithOffsets, _IMAPFromUnicodeWithOffsets, - _UTF7GetNextUChar, + NULL, NULL, NULL, @@ -1537,7 +1440,7 @@ static const UConverterImpl _IMAPImpl={ static const UConverterStaticData _IMAPStaticData={ sizeof(UConverterStaticData), "IMAP-mailbox-name", - 0, /* TODO CCSID for UTF-7 */ + 0, /* TODO CCSID for IMAP-mailbox-name */ UCNV_IBM, UCNV_IMAP_MAILBOX, 1, 4, { 0x3f, 0, 0, 0 }, 1, /* the subchar is not used */ @@ -1552,3 +1455,5 @@ const UConverterSharedData _IMAPData={ NULL, NULL, &_IMAPStaticData, FALSE, &_IMAPImpl, 0 }; + +#endif diff --git a/icuSources/common/ucnv_u8.c b/icuSources/common/ucnv_u8.c index 411701aa..a8635783 100644 --- a/icuSources/common/ucnv_u8.c +++ b/icuSources/common/ucnv_u8.c @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2002-2003, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucnv_u8.c @@ -19,8 +19,10 @@ */ #include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + #include "unicode/ucnv.h" -#include "unicode/ucnv_err.h" #include "ucnv_bld.h" #include "ucnv_cnv.h" #include "cmemory.h" @@ -29,16 +31,10 @@ /* Keep these here to make finicky compilers happy */ -U_CFUNC void T_UConverter_toUnicode_UTF8(UConverterToUnicodeArgs *args, - UErrorCode *err); -U_CFUNC void T_UConverter_toUnicode_UTF8_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, - UErrorCode *err); -U_CFUNC void T_UConverter_fromUnicode_UTF8(UConverterFromUnicodeArgs *args, +U_CFUNC void ucnv_fromUnicode_UTF8(UConverterFromUnicodeArgs *args, UErrorCode *err); -U_CFUNC void T_UConverter_fromUnicode_UTF8_OFFSETS_LOGIC(UConverterFromUnicodeArgs *args, +U_CFUNC void ucnv_fromUnicode_UTF8_OFFSETS_LOGIC(UConverterFromUnicodeArgs *args, UErrorCode *err); -U_CFUNC UChar32 T_UConverter_getNextUChar_UTF8(UConverterToUnicodeArgs *args, - UErrorCode *err); /* UTF-8 -------------------------------------------------------------------- */ @@ -88,64 +84,7 @@ static const int8_t bytesFromUTF8[256] = { static const uint32_t utf8_minChar32[7]={ 0, 0, 0x80, 0x800, 0x10000, 0xffffffff, 0xffffffff }; -/** - * Calls invalid char callback when an invalid character sequence is encountered. - * It presumes that the converter has a callback to call. - * - * @returns true when callback fails - */ -static UBool -T_UConverter_toUnicode_InvalidChar_Callback(UConverterToUnicodeArgs * args, - UConverterCallbackReason reason, - UErrorCode *err) -{ - UConverter *converter = args->converter; - - if (U_SUCCESS(*err)) - { - if (reason == UCNV_ILLEGAL) { - *err = U_ILLEGAL_CHAR_FOUND; - } else { - *err = U_INVALID_CHAR_FOUND; - } - } - - /* copy the toUBytes to the invalidCharBuffer */ - uprv_memcpy(converter->invalidCharBuffer, - converter->toUBytes, - converter->toULength); - converter->invalidCharLength = converter->toULength; - - /* Call the ErrorFunction */ - args->converter->fromCharErrorBehaviour(converter->toUContext, - args, - converter->invalidCharBuffer, - converter->invalidCharLength, - reason, - err); - - return (UBool)U_FAILURE(*err); -} - -static UBool -T_UConverter_toUnicode_InvalidChar_OffsetCallback(UConverterToUnicodeArgs * args, - int32_t currentOffset, - UConverterCallbackReason reason, - UErrorCode *err) -{ - int32_t *saveOffsets = args->offsets; - UBool result; - - result = T_UConverter_toUnicode_InvalidChar_Callback(args, reason, err); - - while (saveOffsets < args->offsets) - { - *(saveOffsets++) = currentOffset; - } - return result; -} - -U_CFUNC void T_UConverter_toUnicode_UTF8 (UConverterToUnicodeArgs * args, +static void ucnv_toUnicode_UTF8 (UConverterToUnicodeArgs * args, UErrorCode * err) { const unsigned char *mySource = (unsigned char *) args->source; @@ -158,7 +97,6 @@ U_CFUNC void T_UConverter_toUnicode_UTF8 (UConverterToUnicodeArgs * args, int32_t i, inBytes; /* Restore size of current sequence */ -start: if (args->converter->toUnicodeStatus && myTarget < targetLimit) { inBytes = args->converter->mode; /* restore # of bytes to consume */ @@ -200,19 +138,10 @@ morebytes: } else { - if (args->flush) - { - if (U_SUCCESS(*err)) - { - *err = U_TRUNCATED_CHAR_FOUND; - } - } - else - { /* stores a partially calculated target*/ - args->converter->toUnicodeStatus = ch; - args->converter->mode = inBytes; - args->converter->toULength = (int8_t) i; - } + /* stores a partially calculated target*/ + args->converter->toUnicodeStatus = ch; + args->converter->mode = inBytes; + args->converter->toULength = (int8_t) i; goto donefornow; } } @@ -236,6 +165,7 @@ morebytes: (isCESU8 ? i <= 3 : !UTF_IS_SURROGATE(ch))) { /* Normal valid byte when the loop has not prematurely terminated (i < inBytes) */ + args->converter->toULength = 0; if (ch <= MAXIMUM_UCS2) { /* fits in 16 bits */ @@ -263,22 +193,9 @@ morebytes: } else { - args->source = (const char *) mySource; - args->target = myTarget; - args->converter->toULength = (int8_t)i; - if (T_UConverter_toUnicode_InvalidChar_Callback(args, UCNV_ILLEGAL, err)) - { - /* Stop if the error wasn't handled */ - /* args and err should already be set properly */ - return; - } - - mySource = (unsigned char *) args->source; - myTarget = args->target; - - /* goto the start to handle state left behind by the callback */ - goto start; + *err = U_ILLEGAL_CHAR_FOUND; + break; } } } @@ -294,7 +211,7 @@ donefornow: args->source = (const char *) mySource; } -U_CFUNC void T_UConverter_toUnicode_UTF8_OFFSETS_LOGIC (UConverterToUnicodeArgs * args, +static void ucnv_toUnicode_UTF8_OFFSETS_LOGIC (UConverterToUnicodeArgs * args, UErrorCode * err) { const unsigned char *mySource = (unsigned char *) args->source; @@ -309,7 +226,6 @@ U_CFUNC void T_UConverter_toUnicode_UTF8_OFFSETS_LOGIC (UConverterToUnicodeArgs int32_t i, inBytes; /* Restore size of current sequence */ -start: if (args->converter->toUnicodeStatus && myTarget < targetLimit) { inBytes = args->converter->mode; /* restore # of bytes to consume */ @@ -350,20 +266,9 @@ morebytes: } else { - if (args->flush) - { - if (U_SUCCESS(*err)) - { - *err = U_TRUNCATED_CHAR_FOUND; - args->converter->toUnicodeStatus = 0; - } - } - else - { - args->converter->toUnicodeStatus = ch; - args->converter->mode = inBytes; - args->converter->toULength = (int8_t)i; - } + args->converter->toUnicodeStatus = ch; + args->converter->mode = inBytes; + args->converter->toULength = (int8_t)i; goto donefornow; } } @@ -387,6 +292,7 @@ morebytes: (isCESU8 ? i <= 3 : !UTF_IS_SURROGATE(ch))) { /* Normal valid byte when the loop has not prematurely terminated (i < inBytes) */ + args->converter->toULength = 0; if (ch <= MAXIMUM_UCS2) { /* fits in 16 bits */ @@ -416,26 +322,9 @@ morebytes: } else { - args->source = (const char *) mySource; - args->target = myTarget; - args->offsets = myOffsets; - args->converter->toULength = (int8_t)i; - if (T_UConverter_toUnicode_InvalidChar_OffsetCallback(args, - offsetNum, UCNV_ILLEGAL, err)) - { - /* Stop if the error wasn't handled */ - /* args and err should already be set properly */ - return; - } - - offsetNum += i + ((unsigned char *) args->source - mySource); - mySource = (unsigned char *) args->source; - myTarget = args->target; - myOffsets = args->offsets; - - /* goto the start to handle state left behind by the callback */ - goto start; + *err = U_ILLEGAL_CHAR_FOUND; + break; } } } @@ -451,7 +340,7 @@ donefornow: args->offsets = myOffsets; } -U_CFUNC void T_UConverter_fromUnicode_UTF8 (UConverterFromUnicodeArgs * args, +U_CFUNC void ucnv_fromUnicode_UTF8 (UConverterFromUnicodeArgs * args, UErrorCode * err) { UConverter *cnv = args->converter; @@ -460,14 +349,14 @@ U_CFUNC void T_UConverter_fromUnicode_UTF8 (UConverterFromUnicodeArgs * args, const UChar *sourceLimit = args->sourceLimit; const unsigned char *targetLimit = (unsigned char *) args->targetLimit; UBool isCESU8 = (UBool)(args->converter->sharedData == &_CESU8Data); - uint32_t ch, ch2; + UChar32 ch, ch2; int16_t indexToWrite; char temp[4]; - if (cnv->fromUSurrogateLead && myTarget < targetLimit) + if (cnv->fromUChar32 && myTarget < targetLimit) { - ch = cnv->fromUSurrogateLead; - cnv->fromUSurrogateLead = 0; + ch = cnv->fromUChar32; + cnv->fromUChar32 = 0; goto lowsurrogate; } @@ -511,63 +400,21 @@ lowsurrogate: } else { /* this is an unmatched lead code unit (1st surrogate) */ /* callback(illegal) */ - ch2 = ch; + cnv->fromUChar32 = ch; + *err = U_ILLEGAL_CHAR_FOUND; + break; } } else { /* no more input */ - cnv->fromUSurrogateLead = (UChar)ch; + cnv->fromUChar32 = ch; break; } } else { /* this is an unmatched trail code unit (2nd surrogate) */ /* callback(illegal) */ - ch2 = ch; - } - - if(ch2 != 0) { - /* call the callback function with all the preparations and post-processing */ + cnv->fromUChar32 = ch; *err = U_ILLEGAL_CHAR_FOUND; - - /* update the arguments structure */ - args->source=mySource; - args->target=(char *)myTarget; - - /* write the code point as code units */ - cnv->invalidUCharBuffer[0] = (UChar)ch2; - cnv->invalidUCharLength = 1; - - /* call the callback function */ - cnv->fromUCharErrorBehaviour(cnv->fromUContext, args, cnv->invalidUCharBuffer, 1, ch2, UCNV_ILLEGAL, err); - - /* get the converter state from UConverter */ - ch = cnv->fromUSurrogateLead; - cnv->fromUSurrogateLead = 0; - - myTarget=(uint8_t *)args->target; - mySource=args->source; - - /* - * If the callback overflowed the target, then we need to - * stop here with an overflow indication. - */ - if(*err==U_BUFFER_OVERFLOW_ERROR) { - break; - } else if(U_FAILURE(*err)) { - /* break on error */ - break; - } else if(cnv->charErrorBufferLength>0) { - /* target is full */ - *err=U_BUFFER_OVERFLOW_ERROR; - break; - /* - * } else if(ch != 0) { ... - * ### TODO 2002jul01 markus: It looks like this code (from ucnvmbcs.c) - * does not handle the case where the callback leaves ch=fromUSurrogateLead!=0 . - * We would have to check myTargetflush && mySource >= sourceLimit && cnv->fromUSurrogateLead != 0 && U_SUCCESS(*err)) { - /* a Unicode code point remains incomplete (only a first surrogate) */ - *err = U_TRUNCATED_CHAR_FOUND; - cnv->fromUSurrogateLead = 0; - } args->target = (char *) myTarget; args->source = mySource; } -U_CFUNC void T_UConverter_fromUnicode_UTF8_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, +U_CFUNC void ucnv_fromUnicode_UTF8_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, UErrorCode * err) { UConverter *cnv = args->converter; @@ -624,15 +466,15 @@ U_CFUNC void T_UConverter_fromUnicode_UTF8_OFFSETS_LOGIC (UConverterFromUnicodeA const UChar *sourceLimit = args->sourceLimit; const unsigned char *targetLimit = (unsigned char *) args->targetLimit; UBool isCESU8 = (UBool)(args->converter->sharedData == &_CESU8Data); - uint32_t ch, ch2; + UChar32 ch, ch2; int32_t offsetNum, nextSourceIndex; int16_t indexToWrite; char temp[4]; - if (cnv->fromUSurrogateLead && myTarget < targetLimit) + if (cnv->fromUChar32 && myTarget < targetLimit) { - ch = cnv->fromUSurrogateLead; - cnv->fromUSurrogateLead = 0; + ch = cnv->fromUChar32; + cnv->fromUChar32 = 0; offsetNum = -1; nextSourceIndex = 0; goto lowsurrogate; @@ -686,69 +528,21 @@ lowsurrogate: } else { /* this is an unmatched lead code unit (1st surrogate) */ /* callback(illegal) */ - ch2 = ch; + cnv->fromUChar32 = ch; + *err = U_ILLEGAL_CHAR_FOUND; + break; } } else { /* no more input */ - cnv->fromUSurrogateLead = (UChar)ch; + cnv->fromUChar32 = ch; break; } } else { /* this is an unmatched trail code unit (2nd surrogate) */ /* callback(illegal) */ - ch2 = ch; - } - - if(ch2 != 0) { - /* call the callback function with all the preparations and post-processing */ + cnv->fromUChar32 = ch; *err = U_ILLEGAL_CHAR_FOUND; - - /* update the arguments structure */ - args->source=mySource; - args->target=(char *)myTarget; - args->offsets=myOffsets; - - /* write the code point as code units */ - cnv->invalidUCharBuffer[0] = (UChar)ch2; - cnv->invalidUCharLength = 1; - - /* call the callback function */ - cnv->fromUCharErrorBehaviour(cnv->fromUContext, args, cnv->invalidUCharBuffer, 1, ch2, UCNV_ILLEGAL, err); - - /* get the converter state from UConverter */ - ch = cnv->fromUSurrogateLead; - cnv->fromUSurrogateLead = 0; - - /* update target and deal with offsets if necessary */ - myOffsets=ucnv_updateCallbackOffsets(myOffsets, ((uint8_t *)args->target)-myTarget, offsetNum); - myTarget=(uint8_t *)args->target; - - /* update the source pointer and index */ - offsetNum=nextSourceIndex+(args->source-mySource); - mySource=args->source; - - /* - * If the callback overflowed the target, then we need to - * stop here with an overflow indication. - */ - if(*err==U_BUFFER_OVERFLOW_ERROR) { - break; - } else if(U_FAILURE(*err)) { - /* break on error */ - break; - } else if(cnv->charErrorBufferLength>0) { - /* target is full */ - *err=U_BUFFER_OVERFLOW_ERROR; - break; - /* - * } else if(ch != 0) { ... - * ### TODO 2002jul01 markus: It looks like this code (from ucnvmbcs.c) - * does not handle the case where the callback leaves ch=fromUSurrogateLead!=0 . - * We would have to check myTargetflush && mySource >= sourceLimit && cnv->fromUSurrogateLead != 0 && U_SUCCESS(*err)) { - /* a Unicode code point remains incomplete (only a first surrogate) */ - *err = U_TRUNCATED_CHAR_FOUND; - cnv->fromUSurrogateLead = 0; - } args->target = (char *) myTarget; args->source = mySource; args->offsets = myOffsets; } -U_CFUNC UChar32 T_UConverter_getNextUChar_UTF8(UConverterToUnicodeArgs *args, +static UChar32 ucnv_getNextUChar_UTF8(UConverterToUnicodeArgs *args, UErrorCode *err) { - UChar buffer[2]; - const char *sourceInitial; + UConverter *cnv; + const uint8_t *sourceInitial; const uint8_t *source; - UChar* myUCharPtr; uint16_t extraBytesToWrite; uint8_t myByte; UChar32 ch; - int8_t isLegalSequence; - UBool isCESU8 = (UBool)(args->converter->sharedData == &_CESU8Data); + int8_t i, isLegalSequence; - while (args->source < args->sourceLimit) + /* UTF-8 only here, the framework handles CESU-8 to combine surrogate pairs */ + + cnv = args->converter; + sourceInitial = source = (const uint8_t *)args->source; + if (source >= (const uint8_t *)args->sourceLimit) { - sourceInitial = args->source; - myByte = (uint8_t)*(args->source++); - if (myByte < 0x80) - { - return (UChar32)myByte; - } + /* no input */ + *err = U_INDEX_OUTOFBOUNDS_ERROR; + return 0xffff; + } - extraBytesToWrite = (uint16_t)bytesFromUTF8[myByte]; - if (extraBytesToWrite == 0) { - isLegalSequence = FALSE; - ch = 0; - goto CALL_ERROR_FUNCTION; - } + myByte = (uint8_t)*(source++); + if (myByte < 0x80) + { + args->source = (const char *)source; + return (UChar32)myByte; + } - /*The byte sequence is longer than the buffer area passed*/ - source = (const uint8_t *)args->source; - if (((const char *)source + extraBytesToWrite - 1) > args->sourceLimit) - { - *err = U_TRUNCATED_CHAR_FOUND; - return 0xffff; - } - else - { - isLegalSequence = 1; - ch = myByte << 6; - switch(extraBytesToWrite) - { - /* note: code falls through cases! (sic)*/ - case 6: - ch += (myByte = *source++); - ch <<= 6; - if (!UTF8_IS_TRAIL(myByte)) - { - isLegalSequence = 0; - break; - } - case 5: - ch += (myByte = *source++); - ch <<= 6; - if (!UTF8_IS_TRAIL(myByte)) - { - isLegalSequence = 0; - break; - } - case 4: - ch += (myByte = *source++); - ch <<= 6; - if (!UTF8_IS_TRAIL(myByte)) - { - isLegalSequence = 0; - break; - } - case 3: - ch += (myByte = *source++); - ch <<= 6; - if (!UTF8_IS_TRAIL(myByte)) - { - isLegalSequence = 0; - break; - } - case 2: - ch += (myByte = *source++); - if (!UTF8_IS_TRAIL(myByte)) - { - isLegalSequence = 0; - } - }; - } - ch -= offsetsFromUTF8[extraBytesToWrite]; + extraBytesToWrite = (uint16_t)bytesFromUTF8[myByte]; + if (extraBytesToWrite == 0) { + cnv->toUBytes[0] = myByte; + cnv->toULength = 1; + *err = U_ILLEGAL_CHAR_FOUND; args->source = (const char *)source; + return 0xffff; + } - /* - * Legal UTF-8 byte sequences in Unicode 3.0.1 and up: - * - use only trail bytes after a lead byte (checked above) - * - use the right number of trail bytes for a given lead byte - * - encode a code point <= U+10ffff - * - use the fewest possible number of bytes for their code points - * - use at most 4 bytes (for i>=5 it is 0x10ffff= utf8_minChar32[extraBytesToWrite]) { - if(isCESU8) { - if(extraBytesToWrite <= 3) { - if( UTF_IS_FIRST_SURROGATE(ch) && - (const char *)(source + 3) <= args->sourceLimit && - source[0] == 0xed && (source[1] & 0xf0) == 0xb0 && (source[2] & 0xc0) == 0x80 - ) { - /* ch is a lead surrogate followed by a trail surrogate */ - ch = (ch << 10) + - ((source[1] & 0xf) << 6) + (source[2] & 0x3f) - - ((0xd800 << 10) - 0x10000); - args->source = (const char *)(source + 3); - } - return ch; /* return the code point */ - } - /* illegal CESU-8 */ + /*The byte sequence is longer than the buffer area passed*/ + if (((const char *)source + extraBytesToWrite - 1) > args->sourceLimit) + { + /* check if all of the remaining bytes are trail bytes */ + cnv->toUBytes[0] = myByte; + i = 1; + *err = U_TRUNCATED_CHAR_FOUND; + while(source < (const uint8_t *)args->sourceLimit) { + if(U8_IS_TRAIL(myByte = *source)) { + cnv->toUBytes[i++] = myByte; + ++source; } else { - if(!UTF_IS_SURROGATE(ch)) { - return ch; /* return the code point */ - } - /* illegal UTF-8 */ + /* error even before we run out of input */ + *err = U_ILLEGAL_CHAR_FOUND; + break; } } + cnv->toULength = i; + args->source = (const char *)source; + return 0xffff; + } -CALL_ERROR_FUNCTION: - extraBytesToWrite = (uint16_t)(args->source - sourceInitial); - args->converter->invalidCharLength = (uint8_t)extraBytesToWrite; - uprv_memcpy(args->converter->invalidCharBuffer, sourceInitial, extraBytesToWrite); - - myUCharPtr = buffer; - *err = U_ILLEGAL_CHAR_FOUND; - args->target = myUCharPtr; - args->targetLimit = buffer + 2; - args->converter->fromCharErrorBehaviour(args->converter->toUContext, - args, - sourceInitial, - extraBytesToWrite, - UCNV_ILLEGAL, - err); - - if(U_SUCCESS(*err)) { - extraBytesToWrite = (uint16_t)(args->target - buffer); - if(extraBytesToWrite > 0) { - return ucnv_getUChar32KeepOverflow(args->converter, buffer, extraBytesToWrite); - } - /* else (callback did not write anything) continue */ - } else if(*err == U_BUFFER_OVERFLOW_ERROR) { - *err = U_ZERO_ERROR; - return ucnv_getUChar32KeepOverflow(args->converter, buffer, 2); - } else { - /* break on error */ - /* ### what if a callback set an error but _also_ generated output?! */ - return 0xffff; + isLegalSequence = 1; + ch = myByte << 6; + switch(extraBytesToWrite) + { + /* note: code falls through cases! (sic)*/ + case 6: + ch += (myByte = *source); + ch <<= 6; + if (!UTF8_IS_TRAIL(myByte)) + { + isLegalSequence = 0; + break; } + ++source; + case 5: + ch += (myByte = *source); + ch <<= 6; + if (!UTF8_IS_TRAIL(myByte)) + { + isLegalSequence = 0; + break; + } + ++source; + case 4: + ch += (myByte = *source); + ch <<= 6; + if (!UTF8_IS_TRAIL(myByte)) + { + isLegalSequence = 0; + break; + } + ++source; + case 3: + ch += (myByte = *source); + ch <<= 6; + if (!UTF8_IS_TRAIL(myByte)) + { + isLegalSequence = 0; + break; + } + ++source; + case 2: + ch += (myByte = *source); + if (!UTF8_IS_TRAIL(myByte)) + { + isLegalSequence = 0; + break; + } + ++source; + }; + ch -= offsetsFromUTF8[extraBytesToWrite]; + args->source = (const char *)source; + + /* + * Legal UTF-8 byte sequences in Unicode 3.0.1 and up: + * - use only trail bytes after a lead byte (checked above) + * - use the right number of trail bytes for a given lead byte + * - encode a code point <= U+10ffff + * - use the fewest possible number of bytes for their code points + * - use at most 4 bytes (for i>=5 it is 0x10ffff= utf8_minChar32[extraBytesToWrite] && + !U_IS_SURROGATE(ch) + ) { + return ch; /* return the code point */ } - /* no input or only skipping callback calls */ - *err = U_INDEX_OUTOFBOUNDS_ERROR; + for(i = 0; sourceInitial < source; ++i) { + cnv->toUBytes[i] = *sourceInitial++; + } + cnv->toULength = i; + *err = U_ILLEGAL_CHAR_FOUND; return 0xffff; } @@ -968,11 +738,11 @@ static const UConverterImpl _UTF8Impl={ NULL, NULL, - T_UConverter_toUnicode_UTF8, - T_UConverter_toUnicode_UTF8_OFFSETS_LOGIC, - T_UConverter_fromUnicode_UTF8, - T_UConverter_fromUnicode_UTF8_OFFSETS_LOGIC, - T_UConverter_getNextUChar_UTF8, + ucnv_toUnicode_UTF8, + ucnv_toUnicode_UTF8_OFFSETS_LOGIC, + ucnv_fromUnicode_UTF8, + ucnv_fromUnicode_UTF8_OFFSETS_LOGIC, + ucnv_getNextUChar_UTF8, NULL, NULL, @@ -985,7 +755,8 @@ static const UConverterImpl _UTF8Impl={ static const UConverterStaticData _UTF8StaticData={ sizeof(UConverterStaticData), "UTF-8", - 1208, UCNV_IBM, UCNV_UTF8, 1, 4, + 1208, UCNV_IBM, UCNV_UTF8, + 1, 3, /* max 3 bytes per UChar from UTF-8 (4 bytes from surrogate _pair_) */ { 0xef, 0xbf, 0xbd, 0 },3,FALSE,FALSE, 0, 0, @@ -1001,6 +772,29 @@ const UConverterSharedData _UTF8Data={ /* CESU-8 converter data ---------------------------------------------------- */ +static const UConverterImpl _CESU8Impl={ + UCNV_CESU8, + + NULL, + NULL, + + NULL, + NULL, + NULL, + + ucnv_toUnicode_UTF8, + ucnv_toUnicode_UTF8_OFFSETS_LOGIC, + ucnv_fromUnicode_UTF8, + ucnv_fromUnicode_UTF8_OFFSETS_LOGIC, + NULL, + + NULL, + NULL, + NULL, + NULL, + ucnv_getCompleteUnicodeSet +}; + static const UConverterStaticData _CESU8StaticData={ sizeof(UConverterStaticData), "CESU-8", @@ -1014,6 +808,8 @@ static const UConverterStaticData _CESU8StaticData={ const UConverterSharedData _CESU8Data={ sizeof(UConverterSharedData), ~((uint32_t) 0), - NULL, NULL, &_CESU8StaticData, FALSE, &_UTF8Impl, + NULL, NULL, &_CESU8StaticData, FALSE, &_CESU8Impl, 0 }; + +#endif diff --git a/icuSources/common/ucnvbocu.c b/icuSources/common/ucnvbocu.c index 3db6caeb..dacd6c16 100644 --- a/icuSources/common/ucnvbocu.c +++ b/icuSources/common/ucnvbocu.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 2002-2003, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -14,10 +14,13 @@ * created by: Markus W. Scherer * * This is an implementation of the Binary Ordered Compression for Unicode, -* in its MIME-friendly form as defined in ### TODO http://... 1. doc/papers 2. design +* in its MIME-friendly form as defined in http://www.unicode.org/notes/tn6/ */ #include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + #include "unicode/ucnv.h" #include "unicode/ucnv_cb.h" #include "ucnv_bld.h" @@ -402,7 +405,7 @@ U_ALIGN_CODE(16) offsets=pArgs->offsets; /* get the converter state from UConverter */ - c=cnv->fromUSurrogateLead; + c=cnv->fromUChar32; prev=(int32_t)cnv->fromUnicodeStatus; if(prev==0) { prev=BOCU1_ASCII_PREV; @@ -424,47 +427,25 @@ fastSingle: if(targetCapacity>diff) { targetCapacity=diff; } - /* ### TODO if WithOffsets is never used without offsets, then remove all offsets==NULL branches and checks */ - if(offsets==NULL) { - while(targetCapacity>0 && (c=*source)<0x3000) { - if(c<=0x20) { - if(c!=0x20) { - prev=BOCU1_ASCII_PREV; - } - *target++=(uint8_t)c; - } else { - diff=c-prev; - if(DIFF_IS_SINGLE(diff)) { - prev=BOCU1_SIMPLE_PREV(c); - *target++=(uint8_t)PACK_SINGLE_DIFF(diff); - } else { - break; - } + while(targetCapacity>0 && (c=*source)<0x3000) { + if(c<=0x20) { + if(c!=0x20) { + prev=BOCU1_ASCII_PREV; } + *target++=(uint8_t)c; + *offsets++=nextSourceIndex++; ++source; --targetCapacity; - } - } else { - while(targetCapacity>0 && (c=*source)<0x3000) { - if(c<=0x20) { - if(c!=0x20) { - prev=BOCU1_ASCII_PREV; - } - *target++=(uint8_t)c; + } else { + diff=c-prev; + if(DIFF_IS_SINGLE(diff)) { + prev=BOCU1_SIMPLE_PREV(c); + *target++=(uint8_t)PACK_SINGLE_DIFF(diff); *offsets++=nextSourceIndex++; ++source; --targetCapacity; } else { - diff=c-prev; - if(DIFF_IS_SINGLE(diff)) { - prev=BOCU1_SIMPLE_PREV(c); - *target++=(uint8_t)PACK_SINGLE_DIFF(diff); - *offsets++=nextSourceIndex++; - ++source; - --targetCapacity; - } else { - break; - } + break; } } } @@ -488,9 +469,7 @@ fastSingle: prev=BOCU1_ASCII_PREV; } *target++=(uint8_t)c; - if(offsets!=NULL) { - *offsets++=sourceIndex; - } + *offsets++=sourceIndex; --targetCapacity; sourceIndex=nextSourceIndex; @@ -527,9 +506,7 @@ getTrail: prev=BOCU1_PREV(c); if(DIFF_IS_SINGLE(diff)) { *target++=(uint8_t)PACK_SINGLE_DIFF(diff); - if(offsets!=NULL) { - *offsets++=sourceIndex; - } + *offsets++=sourceIndex; --targetCapacity; sourceIndex=nextSourceIndex; if(c<0x3000) { @@ -551,10 +528,8 @@ getTrail: } *target++=(uint8_t)diff; *target++=(uint8_t)BOCU1_TRAIL_TO_BYTE(m); - if(offsets!=NULL) { - *offsets++=sourceIndex; - *offsets++=sourceIndex; - } + *offsets++=sourceIndex; + *offsets++=sourceIndex; targetCapacity-=2; sourceIndex=nextSourceIndex; } else { @@ -566,40 +541,23 @@ getTrail: /* write the output character bytes from diff and length */ /* from the first if in the loop we know that targetCapacity>0 */ if(length<=targetCapacity) { - if(offsets==NULL) { - switch(length) { - /* each branch falls through to the next one */ - case 4: - *target++=(uint8_t)(diff>>24); - case 3: - *target++=(uint8_t)(diff>>16); - /* case 2: handled above */ - *target++=(uint8_t)(diff>>8); - /* case 1: handled above */ - *target++=(uint8_t)diff; - default: - /* will never occur */ - break; - } - } else { - switch(length) { - /* each branch falls through to the next one */ - case 4: - *target++=(uint8_t)(diff>>24); - *offsets++=sourceIndex; - case 3: - *target++=(uint8_t)(diff>>16); - *offsets++=sourceIndex; - case 2: - *target++=(uint8_t)(diff>>8); - *offsets++=sourceIndex; - /* case 1: handled above */ - *target++=(uint8_t)diff; - *offsets++=sourceIndex; - default: - /* will never occur */ - break; - } + switch(length) { + /* each branch falls through to the next one */ + case 4: + *target++=(uint8_t)(diff>>24); + *offsets++=sourceIndex; + case 3: + *target++=(uint8_t)(diff>>16); + *offsets++=sourceIndex; + case 2: + *target++=(uint8_t)(diff>>8); + *offsets++=sourceIndex; + /* case 1: handled above */ + *target++=(uint8_t)diff; + *offsets++=sourceIndex; + default: + /* will never occur */ + break; } targetCapacity-=length; sourceIndex=nextSourceIndex; @@ -635,19 +593,13 @@ getTrail: /* each branch falls through to the next one */ case 3: *target++=(uint8_t)(diff>>16); - if(offsets!=NULL) { - *offsets++=sourceIndex; - } + *offsets++=sourceIndex; case 2: *target++=(uint8_t)(diff>>8); - if(offsets!=NULL) { - *offsets++=sourceIndex; - } + *offsets++=sourceIndex; case 1: *target++=(uint8_t)diff; - if(offsets!=NULL) { - *offsets++=sourceIndex; - } + *offsets++=sourceIndex; default: /* will never occur */ break; @@ -666,19 +618,9 @@ getTrail: } } - if(pArgs->flush && source>=sourceLimit) { - /* reset the state for the next conversion */ - if(c<0 && U_SUCCESS(*pErrorCode)) { - /* a Unicode code point remains incomplete (only a first surrogate) */ - *pErrorCode=U_TRUNCATED_CHAR_FOUND; - } - cnv->fromUSurrogateLead=0; - cnv->fromUnicodeStatus=BOCU1_ASCII_PREV; - } else { - /* set the converter state back into UConverter */ - cnv->fromUSurrogateLead= c<0 ? (UChar)-c : 0; - cnv->fromUnicodeStatus=(uint32_t)prev; - } + /* set the converter state back into UConverter */ + cnv->fromUChar32= c<0 ? -c : 0; + cnv->fromUnicodeStatus=(uint32_t)prev; /* write back the updated pointers */ pArgs->source=source; @@ -711,7 +653,7 @@ _Bocu1FromUnicode(UConverterFromUnicodeArgs *pArgs, targetCapacity=pArgs->targetLimit-pArgs->target; /* get the converter state from UConverter */ - c=cnv->fromUSurrogateLead; + c=cnv->fromUChar32; prev=(int32_t)cnv->fromUnicodeStatus; if(prev==0) { prev=BOCU1_ASCII_PREV; @@ -897,19 +839,9 @@ getTrail: } } - if(pArgs->flush && source>=sourceLimit) { - /* reset the state for the next conversion */ - if(c<0 && U_SUCCESS(*pErrorCode)) { - /* a Unicode code point remains incomplete (only a first surrogate) */ - *pErrorCode=U_TRUNCATED_CHAR_FOUND; - } - cnv->fromUSurrogateLead=0; - cnv->fromUnicodeStatus=BOCU1_ASCII_PREV; - } else { - /* set the converter state back into UConverter */ - cnv->fromUSurrogateLead= c<0 ? (UChar)-c : 0; - cnv->fromUnicodeStatus=(uint32_t)prev; - } + /* set the converter state back into UConverter */ + cnv->fromUChar32= c<0 ? -c : 0; + cnv->fromUnicodeStatus=(uint32_t)prev; /* write back the updated pointers */ pArgs->source=source; @@ -1039,7 +971,6 @@ _Bocu1ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, nextSourceIndex=0; /* conversion "loop" similar to _SCSUToUnicodeWithOffsets() */ -loop: if(count>0 && byteIndex>0 && targetdiff) { count=diff; } - if(offsets==NULL) { - while(count>0) { - if(BOCU1_START_NEG_2<=(c=*source) && c0) { - if(BOCU1_START_NEG_2<=(c=*source) && c0) { + if(BOCU1_START_NEG_2<=(c=*source) && c0x10ffff) { - goto callback; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + goto endloop; } break; } @@ -1201,23 +1107,17 @@ getTrail: prev=BOCU1_PREV(c); if(c<=0xffff) { *target++=(UChar)c; - if(offsets!=NULL) { - *offsets++=sourceIndex; - } + *offsets++=sourceIndex; } else { /* output surrogate pair */ *target++=UTF16_LEAD(c); if(targetUCharErrorBuffer[0]=UTF16_TRAIL(c); cnv->UCharErrorBufferLength=1; *pErrorCode=U_BUFFER_OVERFLOW_ERROR; @@ -1228,90 +1128,22 @@ getTrail: } endloop: - if(pArgs->flush && source>=sourceLimit) { - /* reset the state for the next conversion */ - if(byteIndex>0 && U_SUCCESS(*pErrorCode)) { - /* a character byte sequence remains incomplete */ - *pErrorCode=U_TRUNCATED_CHAR_FOUND; - } + if(*pErrorCode==U_ILLEGAL_CHAR_FOUND) { + /* set the converter state in UConverter to deal with the next character */ cnv->toUnicodeStatus=BOCU1_ASCII_PREV; cnv->mode=0; - cnv->toULength=0; } else { /* set the converter state back into UConverter */ cnv->toUnicodeStatus=(uint32_t)prev; cnv->mode=(diff<<2)|count; - cnv->toULength=byteIndex; } + cnv->toULength=byteIndex; -finish: /* write back the updated pointers */ pArgs->source=(const char *)source; pArgs->target=target; pArgs->offsets=offsets; return; - -callback: - /* call the callback function with all the preparations and post-processing */ - /* update the arguments structure */ - pArgs->source=(const char *)source; - pArgs->target=target; - pArgs->offsets=offsets; - - /* copy the current bytes to invalidCharBuffer */ - cnv->invalidCharBuffer[0]=bytes[0]; - cnv->invalidCharBuffer[1]=bytes[1]; - cnv->invalidCharBuffer[2]=bytes[2]; - cnv->invalidCharBuffer[3]=bytes[3]; - cnv->invalidCharLength=(int8_t)byteIndex; - - /* set the converter state in UConverter to deal with the next character */ - cnv->toUnicodeStatus=BOCU1_ASCII_PREV; - cnv->mode=0; - cnv->toULength=0; - - /* call the callback function */ - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - cnv->fromCharErrorBehaviour(cnv->toUContext, pArgs, (const char *)bytes, byteIndex, UCNV_ILLEGAL, pErrorCode); - - /* get the converter state from UConverter */ - prev=(int32_t)cnv->toUnicodeStatus; - if(prev==0) { - prev=BOCU1_ASCII_PREV; - } - diff=cnv->mode; - count=diff&3; - diff>>=2; - - byteIndex=cnv->toULength; - - /* update target and deal with offsets if necessary */ - offsets=ucnv_updateCallbackOffsets(offsets, pArgs->target-target, sourceIndex); - target=pArgs->target; - - /* update the source pointer and index */ - sourceIndex=nextSourceIndex+((const uint8_t *)pArgs->source-source); - source=(const uint8_t *)pArgs->source; - - /* - * If the callback overflowed the target, then we need to - * stop here with an overflow indication. - */ - if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR) { - goto endloop; - } else if(cnv->UCharErrorBufferLength>0) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - goto endloop; - } else if(U_FAILURE(*pErrorCode)) { - /* reset and break on error */ - cnv->toUnicodeStatus=BOCU1_ASCII_PREV; - cnv->mode=0; - cnv->toULength=0; - goto finish; - } else { - goto loop; - } } /* @@ -1356,7 +1188,6 @@ U_ALIGN_CODE(16) bytes=cnv->toUBytes; /* conversion "loop" similar to _SCSUToUnicodeWithOffsets() */ -loop: if(count>0 && byteIndex>0 && target0x10ffff) { - goto callback; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + goto endloop; } break; } @@ -1495,85 +1329,21 @@ getTrail: } endloop: - if(pArgs->flush && source>=sourceLimit) { - /* reset the state for the next conversion */ - if(byteIndex>0 && U_SUCCESS(*pErrorCode)) { - /* a character byte sequence remains incomplete */ - *pErrorCode=U_TRUNCATED_CHAR_FOUND; - } + if(*pErrorCode==U_ILLEGAL_CHAR_FOUND) { + /* set the converter state in UConverter to deal with the next character */ cnv->toUnicodeStatus=BOCU1_ASCII_PREV; cnv->mode=0; - cnv->toULength=0; } else { /* set the converter state back into UConverter */ cnv->toUnicodeStatus=(uint32_t)prev; cnv->mode=(diff<<2)|count; - cnv->toULength=byteIndex; } + cnv->toULength=byteIndex; -finish: /* write back the updated pointers */ pArgs->source=(const char *)source; pArgs->target=target; return; - -callback: - /* call the callback function with all the preparations and post-processing */ - /* update the arguments structure */ - pArgs->source=(const char *)source; - pArgs->target=target; - - /* copy the current bytes to invalidCharBuffer */ - cnv->invalidCharBuffer[0]=bytes[0]; - cnv->invalidCharBuffer[1]=bytes[1]; - cnv->invalidCharBuffer[2]=bytes[2]; - cnv->invalidCharBuffer[3]=bytes[3]; - cnv->invalidCharLength=(int8_t)byteIndex; - - /* set the converter state in UConverter to deal with the next character */ - cnv->toUnicodeStatus=BOCU1_ASCII_PREV; - cnv->mode=0; - cnv->toULength=0; - - /* call the callback function */ - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - cnv->fromCharErrorBehaviour(cnv->toUContext, pArgs, (const char *)bytes, byteIndex, UCNV_ILLEGAL, pErrorCode); - - /* get the converter state from UConverter */ - prev=(int32_t)cnv->toUnicodeStatus; - if(prev==0) { - prev=BOCU1_ASCII_PREV; - } - diff=cnv->mode; - count=diff&3; - diff>>=2; - - byteIndex=cnv->toULength; - - target=pArgs->target; - - /* update the source pointer and index */ - source=(const uint8_t *)pArgs->source; - - /* - * If the callback overflowed the target, then we need to - * stop here with an overflow indication. - */ - if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR) { - goto endloop; - } else if(cnv->UCharErrorBufferLength>0) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - goto endloop; - } else if(U_FAILURE(*pErrorCode)) { - /* reset and break on error */ - cnv->toUnicodeStatus=BOCU1_ASCII_PREV; - cnv->mode=0; - cnv->toULength=0; - goto finish; - } else { - goto loop; - } } /* miscellaneous ------------------------------------------------------------ */ @@ -1619,3 +1389,5 @@ const UConverterSharedData _Bocu1Data={ NULL, NULL, &_Bocu1StaticData, FALSE, &_Bocu1Impl, 0 }; + +#endif diff --git a/icuSources/common/ucnvdisp.c b/icuSources/common/ucnvdisp.c new file mode 100644 index 00000000..07196b3e --- /dev/null +++ b/icuSources/common/ucnvdisp.c @@ -0,0 +1,83 @@ +/* +****************************************************************************** +* +* Copyright (C) 1998-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +****************************************************************************** +* +* ucnvdisp.c: +* Implements APIs for the ICU's codeset conversion library display names. +* +* Modification History: +* +* Date Name Description +* 04/04/99 helena Fixed internal header inclusion. +* 05/09/00 helena Added implementation to handle fallback mappings. +* 06/20/2000 helena OS/400 port changes; mostly typecast. +* 09/08/2004 grhoten split from ucnv.c +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + +#include "unicode/ustring.h" +#include "unicode/ures.h" +#include "unicode/ucnv.h" +#include "cstring.h" +#include "ustr_imp.h" +#include "ucnv_imp.h" +#include "putilimp.h" + +U_CAPI int32_t U_EXPORT2 +ucnv_getDisplayName(const UConverter *cnv, + const char *displayLocale, + UChar *displayName, int32_t displayNameCapacity, + UErrorCode *pErrorCode) { + UResourceBundle *rb; + const UChar *name; + int32_t length; + + /* check arguments */ + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + + if(cnv==NULL || displayNameCapacity<0 || (displayNameCapacity>0 && displayName==NULL)) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* open the resource bundle and get the display name string */ + rb=ures_open(NULL, displayLocale, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return 0; + } + + /* use the internal name as the key */ + name=ures_getStringByKey(rb, cnv->sharedData->staticData->name, &length, pErrorCode); + ures_close(rb); + + if(U_SUCCESS(*pErrorCode)) { + /* copy the string */ + u_memcpy(displayName, name, uprv_min(length, displayNameCapacity)*U_SIZEOF_UCHAR); + } else { + /* convert the internal name into a Unicode string */ + *pErrorCode=U_ZERO_ERROR; + length=(int32_t)uprv_strlen(cnv->sharedData->staticData->name); + u_charsToUChars(cnv->sharedData->staticData->name, displayName, uprv_min(length, displayNameCapacity)); + } + return u_terminateUChars(displayName, displayNameCapacity, length, pErrorCode); +} + +#endif + +/* + * Hey, Emacs, please set the following: + * + * Local Variables: + * indent-tabs-mode: nil + * End: + * + */ diff --git a/icuSources/common/ucnvhz.c b/icuSources/common/ucnvhz.c index 1dffd44d..2178fa1e 100644 --- a/icuSources/common/ucnvhz.c +++ b/icuSources/common/ucnvhz.c @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2000-2003, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucnvhz.c @@ -16,10 +16,9 @@ #include "unicode/utypes.h" -#if !UCONFIG_NO_LEGACY_CONVERSION +#if !UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION #include "cmemory.h" -#include "unicode/ucnv_err.h" #include "unicode/ucnv.h" #include "unicode/ucnv_cb.h" #include "unicode/uset.h" @@ -69,7 +68,7 @@ _HZOpen(UConverter *cnv, const char *name,const char *locale,uint32_t options, U cnv->toUnicodeStatus = 0; cnv->fromUnicodeStatus= 0; cnv->mode=0; - cnv->fromUSurrogateLead=0x0000; + cnv->fromUChar32=0x0000; cnv->extraInfo = uprv_malloc (sizeof (UConverterDataHZ)); if(cnv->extraInfo != NULL){ ((UConverterDataHZ*)cnv->extraInfo)->gbConverter = ucnv_open("ibm-1386",errorCode); @@ -108,7 +107,7 @@ _HZReset(UConverter *cnv, UConverterResetChoice choice){ } if(choice!=UCNV_RESET_TO_UNICODE) { cnv->fromUnicodeStatus= 0; - cnv->fromUSurrogateLead=0x0000; + cnv->fromUChar32=0x0000; if(cnv->extraInfo != NULL){ ((UConverterDataHZ*)cnv->extraInfo)->isEscapeAppended = FALSE; ((UConverterDataHZ*)cnv->extraInfo)->targetIndex = 0; @@ -142,22 +141,20 @@ _HZReset(UConverter *cnv, UConverterResetChoice choice){ static void UConverter_toUnicode_HZ_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, UErrorCode* err){ - char tempBuf[3]; - const char* pBuf; + char tempBuf[2]; const char *mySource = ( char *) args->source; UChar *myTarget = args->target; - char *tempLimit = &tempBuf[3]; const char *mySourceLimit = args->sourceLimit; UChar32 targetUniChar = 0x0000; UChar mySourceChar = 0x0000; UConverterDataHZ* myData=(UConverterDataHZ*)(args->converter->extraInfo); - if ((args->converter == NULL) || (args->targetLimit < args->target) || (args->sourceLimit < args->source)){ + if ((args->converter == NULL) || (args->targetLimit < args->target) || (mySourceLimit < args->source)){ *err = U_ILLEGAL_ARGUMENT_ERROR; return; } - while(mySource< args->sourceLimit){ + while(mySource< mySourceLimit){ if(myTarget < args->targetLimit){ @@ -234,19 +231,14 @@ UConverter_toUnicode_HZ_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, tempBuf[1] = (char) (mySourceChar+0x80); mySourceChar= (UChar)(((args->converter->toUnicodeStatus+0x80) << 8) | ((mySourceChar & 0x00ff)+0x80)); args->converter->toUnicodeStatus =0x00; - pBuf = &tempBuf[0]; - tempLimit = &tempBuf[2]+1; - targetUniChar = _MBCSSimpleGetNextUChar(myData->gbConverter->sharedData, - &pBuf,tempLimit,args->converter->useFallback); + targetUniChar = ucnv_MBCSSimpleGetNextUChar(myData->gbConverter->sharedData, + tempBuf, 2, args->converter->useFallback); } } else{ if(args->converter->fromUnicodeStatus == 0x00){ - tempBuf[0] = (char) mySourceChar; - pBuf = &tempBuf[0]; - tempLimit = &tempBuf[1]; - targetUniChar = _MBCSSimpleGetNextUChar(myData->gbConverter->sharedData, - &pBuf,tempLimit,args->converter->useFallback); + targetUniChar = ucnv_MBCSSimpleGetNextUChar(myData->gbConverter->sharedData, + mySource - 1, 1, args->converter->useFallback); } else{ goto SAVE_STATE; @@ -262,62 +254,22 @@ UConverter_toUnicode_HZ_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, } else if(targetUniChar>=0xfffe){ SAVE_STATE: - { - const char *saveSource = args->source; - UChar *saveTarget = args->target; - int32_t *saveOffsets = args->offsets; - - UConverterCallbackReason reason; - int32_t currentOffset ; - int32_t saveIndex = (int32_t)(myTarget - args->target); - - args->converter->invalidCharLength=0; - - if(targetUniChar == 0xfffe){ - reason = UCNV_UNASSIGNED; - *err = U_INVALID_CHAR_FOUND; - } - else{ - reason = UCNV_ILLEGAL; - *err = U_ILLEGAL_CHAR_FOUND; - } - if(myData->isStateDBCS){ - - args->converter->invalidCharBuffer[args->converter->invalidCharLength++] = (char)(tempBuf[0]-0x80); - args->converter->invalidCharBuffer[args->converter->invalidCharLength++] = (char)(tempBuf[1]-0x80); - currentOffset= (int32_t)(mySource - args->source -2); - - } - else{ - args->converter->invalidCharBuffer[args->converter->invalidCharLength++] = (char)mySourceChar; - currentOffset= (int32_t)(mySource - args->source -1); - } - args->offsets = args->offsets?args->offsets+(myTarget - args->target):0; - args->target = myTarget; - args->source = mySource; - myTarget = saveTarget; - args->converter->fromCharErrorBehaviour ( - args->converter->toUContext, - args, - args->converter->invalidCharBuffer, - args->converter->invalidCharLength, - reason, - err); - - if(args->offsets){ - args->offsets = saveOffsets; - - for (;saveIndex < (args->target - myTarget);saveIndex++) { - args->offsets[saveIndex] += currentOffset; - } - } - args->source = saveSource; - myTarget = args->target; - args->target = saveTarget; - args->offsets = saveOffsets; - if(U_FAILURE(*err)) - break; + if(targetUniChar == 0xfffe){ + *err = U_INVALID_CHAR_FOUND; + } + else{ + *err = U_ILLEGAL_CHAR_FOUND; + } + if(myData->isStateDBCS){ + args->converter->toUBytes[0] = (uint8_t)(tempBuf[0]-0x80); + args->converter->toUBytes[1] = (uint8_t)(tempBuf[1]-0x80); + args->converter->toULength=2; + } + else{ + args->converter->toUBytes[0] = (uint8_t)mySourceChar; + args->converter->toULength=1; } + break; } } else{ @@ -325,18 +277,6 @@ SAVE_STATE: break; } } - if((args->flush==TRUE) - && (mySource == mySourceLimit) - && ( args->converter->toUnicodeStatus !=0x00)){ - *err = U_TRUNCATED_CHAR_FOUND; - args->converter->toUnicodeStatus = 0x00; - } - /* Reset the state of converter if we consumed - * the source and flush is true - */ - if( (mySource == mySourceLimit) && args->flush){ - _HZReset(args->converter, UCNV_RESET_TO_UNICODE); - } args->target = myTarget; args->source = mySource; @@ -347,11 +287,11 @@ static void UConverter_fromUnicode_HZ_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, UErrorCode * err){ const UChar *mySource = args->source; - unsigned char *myTarget = (unsigned char *) args->target; + char *myTarget = args->target; int32_t* offsets = args->offsets; int32_t mySourceIndex = 0; int32_t myTargetIndex = 0; - int32_t targetLength = (int32_t)(args->targetLimit - args->target); + int32_t targetLength = (int32_t)(args->targetLimit - myTarget); int32_t mySourceLength = (int32_t)(args->sourceLimit - args->source); int32_t length=0; uint32_t targetUniChar = 0x0000; @@ -359,16 +299,15 @@ UConverter_fromUnicode_HZ_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, UConverterDataHZ *myConverterData=(UConverterDataHZ*)args->converter->extraInfo; UBool isTargetUCharDBCS = (UBool) myConverterData->isTargetUCharDBCS; UBool oldIsTargetUCharDBCS = isTargetUCharDBCS; - UConverterCallbackReason reason; UBool isEscapeAppended =FALSE; int len =0; const char* escSeq=NULL; - if ((args->converter == NULL) || (args->targetLimit < args->target) || (args->sourceLimit < args->source)){ + if ((args->converter == NULL) || (args->targetLimit < myTarget) || (args->sourceLimit < args->source)){ *err = U_ILLEGAL_ARGUMENT_ERROR; return; } - if(args->converter->fromUSurrogateLead!=0 && myTargetIndex < targetLength) { + if(args->converter->fromUChar32!=0 && myTargetIndex < targetLength) { goto getTrail; } /*writing the char to the output stream */ @@ -376,7 +315,7 @@ UConverter_fromUnicode_HZ_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, targetUniChar = missingCharMarker; if (myTargetIndex < targetLength){ - c=mySourceChar = (UChar) args->source[mySourceIndex++]; + c=mySourceChar = (UChar) mySource[mySourceIndex++]; oldIsTargetUCharDBCS = isTargetUCharDBCS; @@ -388,7 +327,7 @@ UConverter_fromUnicode_HZ_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, continue; } else{ - length= _MBCSFromUChar32(myConverterData->gbConverter->sharedData, + length= ucnv_MBCSFromUChar32(myConverterData->gbConverter->sharedData, mySourceChar,&targetUniChar,args->converter->useFallback); } @@ -418,12 +357,12 @@ UConverter_fromUnicode_HZ_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, if(isTargetUCharDBCS){ if( myTargetIndex target[myTargetIndex++] =(char) ((targetUniChar >> 8) -0x80); + myTarget[myTargetIndex++] =(char) ((targetUniChar >> 8) -0x80); if(offsets){ *(offsets++) = mySourceIndex-1; } if(myTargetIndex < targetLength){ - args->target[myTargetIndex++] =(char) ((targetUniChar & 0x00FF) -0x80); + myTarget[myTargetIndex++] =(char) ((targetUniChar & 0x00FF) -0x80); if(offsets){ *(offsets++) = mySourceIndex-1; } @@ -439,7 +378,7 @@ UConverter_fromUnicode_HZ_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, }else{ if( myTargetIndex target[myTargetIndex++] = (char) (targetUniChar ); + myTarget[myTargetIndex++] = (char) (targetUniChar ); if(offsets){ *(offsets++) = mySourceIndex-1; } @@ -452,16 +391,12 @@ UConverter_fromUnicode_HZ_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, } else{ - /* oops.. the code point is unassingned - * set the error and reason - */ - reason =UCNV_UNASSIGNED; - *err =U_INVALID_CHAR_FOUND; + /* oops.. the code point is unassigned */ /*Handle surrogates */ /*check if the char is a First surrogate*/ if(UTF_IS_SURROGATE(mySourceChar)) { if(UTF_IS_SURROGATE_FIRST(mySourceChar)) { - args->converter->fromUSurrogateLead=(UChar)mySourceChar; + args->converter->fromUChar32=mySourceChar; getTrail: /*look ahead to find the trail surrogate*/ if(mySourceIndex < mySourceLength) { @@ -469,87 +404,32 @@ getTrail: UChar trail=(UChar) args->source[mySourceIndex]; if(UTF_IS_SECOND_SURROGATE(trail)) { ++mySourceIndex; - mySourceChar=UTF16_GET_PAIR_VALUE(args->converter->fromUSurrogateLead, trail); - args->converter->fromUSurrogateLead=0x00; + mySourceChar=UTF16_GET_PAIR_VALUE(args->converter->fromUChar32, trail); + args->converter->fromUChar32=0x00; /* there are no surrogates in GB2312*/ *err = U_INVALID_CHAR_FOUND; - reason=UCNV_UNASSIGNED; /* exit this condition tree */ } else { /* this is an unmatched lead code unit (1st surrogate) */ /* callback(illegal) */ - reason=UCNV_ILLEGAL; *err=U_ILLEGAL_CHAR_FOUND; } } else { /* no more input */ *err = U_ZERO_ERROR; - break; } } else { /* this is an unmatched trail code unit (2nd surrogate) */ /* callback(illegal) */ - reason=UCNV_ILLEGAL; *err=U_ILLEGAL_CHAR_FOUND; } + } else { + /* callback(unassigned) for a BMP code point */ + *err = U_INVALID_CHAR_FOUND; } - { - int32_t saveIndex=0; - int32_t currentOffset = (args->offsets) ? *(offsets-1)+1:0; - char * saveTarget = args->target; - const UChar* saveSource = args->source; - int32_t *saveOffsets = args->offsets; - - args->converter->invalidUCharLength = 0; - - if(mySourceChar>0xffff){ - args->converter->invalidUCharBuffer[args->converter->invalidUCharLength++] =(uint16_t)(((mySourceChar)>>10)+0xd7c0); - args->converter->invalidUCharBuffer[args->converter->invalidUCharLength++] =(uint16_t)(((mySourceChar)&0x3ff)|0xdc00); - } - else{ - args->converter->invalidUCharBuffer[args->converter->invalidUCharLength++] =(UChar)mySourceChar; - } - - myConverterData->isTargetUCharDBCS = (UBool)isTargetUCharDBCS; - args->target += myTargetIndex; - args->source += mySourceIndex; - args->offsets = args->offsets?offsets:0; - - - saveIndex = myTargetIndex; - /*copies current values for the ErrorFunctor to update */ - /*Calls the ErrorFunctor */ - args->converter->fromUCharErrorBehaviour ( args->converter->fromUContext, - args, - args->converter->invalidUCharBuffer, - args->converter->invalidUCharLength, - (UChar32) (mySourceChar), - reason, - err); - /*Update the local Indexes so that the conversion - *can restart at the right points - */ - myTargetIndex = (int32_t)(args->target - (char*)myTarget); - mySourceIndex = (int32_t)(args->source - mySource); - args->offsets = saveOffsets; - saveIndex = myTargetIndex - saveIndex; - if(args->offsets){ - args->offsets = saveOffsets; - while(saveIndex-->0){ - *offsets = currentOffset; - offsets++; - } - } - isTargetUCharDBCS=myConverterData->isTargetUCharDBCS; - args->source = saveSource; - args->target = saveTarget; - args->offsets = saveOffsets; - args->converter->fromUSurrogateLead=0x00; - if (U_FAILURE (*err)) - break; - - } + args->converter->fromUChar32=mySourceChar; + break; } } else{ @@ -558,19 +438,6 @@ getTrail: } targetUniChar=missingCharMarker; } - /*If at the end of conversion we are still carrying state information - *flush is TRUE, we can deduce that the input stream is truncated - */ - if (args->converter->fromUSurrogateLead !=0 && (mySourceIndex == mySourceLength) && args->flush){ - *err = U_TRUNCATED_CHAR_FOUND; - args->converter->toUnicodeStatus = 0x00; - } - /* Reset the state of converter if we consumed - * the source and flush is true - */ - if( (mySourceIndex == mySourceLength) && args->flush){ - _HZReset(args->converter, UCNV_RESET_FROM_UNICODE); - } args->target += myTargetIndex; args->source += mySourceIndex; @@ -598,7 +465,7 @@ _HZ_WriteSub(UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorCode *e } /* structure for SafeClone calculations */ -struct cloneStruct +struct cloneHZStruct { UConverter cnv; UAlignedMemory deadSpace1; @@ -614,8 +481,8 @@ _HZ_SafeClone(const UConverter *cnv, int32_t *pBufferSize, UErrorCode *status) { - struct cloneStruct * localClone; - int32_t size, bufferSizeNeeded = sizeof(struct cloneStruct); + struct cloneHZStruct * localClone; + int32_t size, bufferSizeNeeded = sizeof(struct cloneHZStruct); if (U_FAILURE(*status)){ return 0; @@ -626,9 +493,8 @@ _HZ_SafeClone(const UConverter *cnv, return 0; } - localClone = (struct cloneStruct *)stackBuffer; + localClone = (struct cloneHZStruct *)stackBuffer; uprv_memcpy(&localClone->cnv, cnv, sizeof(UConverter)); - localClone->cnv.isCopyLocal = TRUE; uprv_memcpy(&localClone->mydata, cnv->extraInfo, sizeof(UConverterDataHZ)); localClone->cnv.extraInfo = &localClone->mydata; @@ -644,17 +510,17 @@ _HZ_SafeClone(const UConverter *cnv, static void _HZ_GetUnicodeSet(const UConverter *cnv, - USet *set, + USetAdder *sa, UConverterUnicodeSet which, UErrorCode *pErrorCode) { /* the tilde '~' is hardcoded in the converter */ - uset_add(set, 0x7e); + sa->add(sa->set, 0x7e); /* add all of the code points that the sub-converter handles */ ((UConverterDataHZ*)cnv->extraInfo)-> gbConverter->sharedData->impl-> getUnicodeSet(((UConverterDataHZ*)cnv->extraInfo)->gbConverter, - set, which, pErrorCode); + sa, which, pErrorCode); } static const UConverterImpl _HZImpl={ diff --git a/icuSources/common/ucnvisci.c b/icuSources/common/ucnvisci.c index b1088c7c..dd3a0a92 100644 --- a/icuSources/common/ucnvisci.c +++ b/icuSources/common/ucnvisci.c @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2000-2003, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucnvisci.c @@ -17,10 +17,9 @@ #include "unicode/utypes.h" -#if !UCONFIG_NO_LEGACY_CONVERSION +#if !UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION #include "cmemory.h" -#include "unicode/ucnv_err.h" #include "ucnv_bld.h" #include "unicode/ucnv.h" #include "ucnv_cnv.h" @@ -116,7 +115,7 @@ typedef struct{ MaskEnum currentMaskFromUnicode; /* mask for current state in toUnicode */ MaskEnum currentMaskToUnicode; /* mask for current state in toUnicode */ MaskEnum defMaskToUnicode; /* mask for default state in toUnicode */ - UBool isFirstBuffer; + UBool isFirstBuffer; /* boolean for fromUnicode to see if we need to announce the first script */ char name[30]; }UConverterDataISCII; @@ -197,13 +196,12 @@ _ISCIIReset(UConverter *cnv, UConverterResetChoice choice){ data->contextCharToUnicode=NO_CHAR_MARKER; } if(choice!=UCNV_RESET_TO_UNICODE) { - cnv->fromUSurrogateLead=0x0000; + cnv->fromUChar32=0x0000; data->contextCharFromUnicode=0x00; data->currentMaskFromUnicode=data->defDeltaToUnicode; data->currentDeltaFromUnicode=data->defDeltaToUnicode; + data->isFirstBuffer=TRUE; } - data->isFirstBuffer=TRUE; - } /** @@ -811,7 +809,6 @@ UConverter_fromUnicode_ISCII_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, int32_t* offsets = args->offsets; uint32_t targetByteUnit = 0x0000; UChar32 sourceChar = 0x0000; - UConverterCallbackReason reason; UBool useFallback; UConverterDataISCII *converterData; uint16_t newDelta=0; @@ -828,7 +825,7 @@ UConverter_fromUnicode_ISCII_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, newDelta=converterData->currentDeltaFromUnicode; range = (uint16_t)(newDelta/DELTA); - if(args->converter->fromUSurrogateLead!=0 && target converter->fromUChar32)!=0) { goto getTrail; } @@ -946,16 +943,10 @@ UConverter_fromUnicode_ISCII_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, } } else{ - /* oops.. the code point is unassingned - * set the error and reason - */ - reason =UCNV_UNASSIGNED; - *err =U_INVALID_CHAR_FOUND; - + /* oops.. the code point is unassigned */ /*check if the char is a First surrogate*/ if(UTF_IS_SURROGATE(sourceChar)) { if(UTF_IS_SURROGATE_FIRST(sourceChar)) { - args->converter->fromUSurrogateLead=(UChar)sourceChar; getTrail: /*look ahead to find the trail surrogate*/ if(source < sourceLimit) { @@ -963,111 +954,34 @@ getTrail: UChar trail= (*source); if(UTF_IS_SECOND_SURROGATE(trail)) { source++; - sourceChar=UTF16_GET_PAIR_VALUE(args->converter->fromUSurrogateLead, trail); - args->converter->fromUSurrogateLead=0x00; - reason =UCNV_UNASSIGNED; + sourceChar=UTF16_GET_PAIR_VALUE(sourceChar, trail); *err =U_INVALID_CHAR_FOUND; /* convert this surrogate code point */ /* exit this condition tree */ } else { /* this is an unmatched lead code unit (1st surrogate) */ /* callback(illegal) */ - sourceChar = args->converter->fromUSurrogateLead; - reason=UCNV_ILLEGAL; *err=U_ILLEGAL_CHAR_FOUND; } } else { /* no more input */ *err = U_ZERO_ERROR; - break; } } else { /* this is an unmatched trail code unit (2nd surrogate) */ /* callback(illegal) */ - reason=UCNV_ILLEGAL; *err=U_ILLEGAL_CHAR_FOUND; } + } else { + /* callback(unassigned) for a BMP code point */ + *err = U_INVALID_CHAR_FOUND; } - { - /*variables for callback */ - const UChar* saveSource =NULL; - char* saveTarget =NULL; - int32_t* saveOffsets =NULL; - int currentOffset =0; - int32_t saveIndex =0; - - args->converter->invalidUCharLength = 0; - - if(sourceChar>0xffff){ - /* we have got a surrogate pair... dissable and populate the invalidUCharBuffer */ - args->converter->invalidUCharBuffer[args->converter->invalidUCharLength++] - =(uint16_t)(((sourceChar)>>10)+0xd7c0); - args->converter->invalidUCharBuffer[args->converter->invalidUCharLength++] - =(uint16_t)(((sourceChar)&0x3ff)|0xdc00); - } - else{ - args->converter->invalidUCharBuffer[args->converter->invalidUCharLength++] - =(UChar)sourceChar; - } - - if(offsets){ - currentOffset = *(offsets-1)+1; - } - saveSource = args->source; - saveTarget = args->target; - saveOffsets = args->offsets; - args->target = (char*)target; - args->source = source; - args->offsets = offsets; - - /*copies current values for the ErrorFunctor to update */ - /*Calls the ErrorFunctor */ - args->converter->fromUCharErrorBehaviour ( args->converter->fromUContext, - args, - args->converter->invalidUCharBuffer, - args->converter->invalidUCharLength, - (UChar32) (sourceChar), - reason, - err); - - saveIndex = (int32_t)(args->target - (char*)target); - if(args->offsets){ - args->offsets = saveOffsets; - while(saveIndex-->0){ - *offsets = currentOffset; - offsets++; - } - } - target = (unsigned char*)args->target; - args->source=saveSource; - args->target=saveTarget; - args->offsets=saveOffsets; - args->converter->fromUSurrogateLead=0x00; - if (U_FAILURE (*err)){ - break; - } - } + args->converter->fromUChar32=sourceChar; + break; } - - }/* end while(mySourceIndexconverter->fromUSurrogateLead !=0 && (source == sourceLimit) && args->flush){ - *err = U_TRUNCATED_CHAR_FOUND; - } - /* Reset the state of converter if we consumed - * the source and flush is true - */ - if( (source == sourceLimit) && args->flush){ - /*reset converter*/ - _ISCIIReset(args->converter,UCNV_RESET_FROM_UNICODE); - } - /*save the state and return */ args->source = source; args->target = (char*)target; @@ -1154,7 +1068,6 @@ UConverter_toUnicode_ISCII_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, uint32_t targetUniChar = 0x0000; uint8_t sourceChar = 0x0000; UConverterDataISCII* data; - UConverterCallbackReason reason; UChar32* toUnicodeStatus=NULL; UChar* contextCharToUnicode = NULL; @@ -1193,17 +1106,14 @@ UConverter_toUnicode_ISCII_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, data->currentDeltaToUnicode = data->defDeltaToUnicode; data->currentMaskToUnicode = data->defMaskToUnicode; }else{ - if((sourceChar >= 0x21 && sourceChar <= 0x3F)){ /* these are display codes consume and continue */ }else{ *err =U_ILLEGAL_CHAR_FOUND; /* reset */ *contextCharToUnicode=NO_CHAR_MARKER; - reason = UCNV_ILLEGAL; goto CALLBACK; } - } /* reset */ @@ -1233,11 +1143,9 @@ UConverter_toUnicode_ISCII_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, /* byte unit is unassigned */ targetUniChar = missingCharMarker; *err= U_INVALID_CHAR_FOUND; - reason = UCNV_UNASSIGNED; }else{ /* only 0xA1 - 0xEE are legal after EXT char */ *contextCharToUnicode= NO_CHAR_MARKER; - reason= UCNV_ILLEGAL; *err = U_ILLEGAL_CHAR_FOUND; } goto CALLBACK; @@ -1345,49 +1253,11 @@ UConverter_toUnicode_ISCII_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, /* we reach here only if targetUniChar == missingCharMarker * so assign codes to reason and err */ - reason = UCNV_UNASSIGNED; *err = U_INVALID_CHAR_FOUND; CALLBACK: - { - const char *saveSource = args->source; - UChar *saveTarget = args->target; - int32_t *saveOffsets = NULL; - int32_t currentOffset = (int32_t)(source - args->source -1); - int32_t saveIndex = (int32_t)(target - args->target); - - args->converter->invalidCharLength=0; - - args->converter->invalidCharBuffer[args->converter->invalidCharLength++] = - (char) sourceChar; - - if(args->offsets){ - saveOffsets=args->offsets; - args->offsets = args->offsets+(target - args->target); - } - - args->target =target; - target =saveTarget; - args->source = source; - - args->converter->fromCharErrorBehaviour ( - args->converter->toUContext, - args, - args->converter->invalidCharBuffer, - args->converter->invalidCharLength, - reason, - err); - - if(args->offsets){ - args->offsets = saveOffsets; - - for (;saveIndex < (args->target - target);saveIndex++) { - *(args->offsets)++ = currentOffset; - } - } - target=args->target; - args->source = saveSource; - args->target = saveTarget; - } + args->converter->toUBytes[0] = (uint8_t) sourceChar; + args->converter->toULength = 1; + break; } } @@ -1396,32 +1266,36 @@ CALLBACK: break; } } - if((args->flush==TRUE) - && (source == sourceLimit) - && data->contextCharToUnicode != NO_CHAR_MARKER){ - /* if we have ATR in context it is an error */ - if(data->contextCharToUnicode==ATR || data->contextCharToUnicode==EXT || *toUnicodeStatus == missingCharMarker){ - *err = U_TRUNCATED_CHAR_FOUND; + + if(U_SUCCESS(*err) && args->flush && source == sourceLimit) { + /* end of the input stream */ + UConverter *cnv = args->converter; + + if(*contextCharToUnicode==ATR || *contextCharToUnicode==EXT || *contextCharToUnicode==ISCII_INV){ + /* set toUBytes[] */ + cnv->toUBytes[0] = (uint8_t)*contextCharToUnicode; + cnv->toULength = 1; + + /* avoid looping on truncated sequences */ + *contextCharToUnicode = NO_CHAR_MARKER; }else{ + cnv->toULength = 0; + } + + if(*toUnicodeStatus != missingCharMarker) { + /* output a remaining target character */ WRITE_TO_TARGET_TO_U(args,source,target,args->offsets,(source - args->source -1), *toUnicodeStatus,data->currentDeltaToUnicode,err); - *toUnicodeStatus = missingCharMarker; + *toUnicodeStatus = missingCharMarker; } - - } - /* Reset the state of converter if we consumed - * the source and flush is true - */ - if( (source == sourceLimit) && args->flush){ - /*reset converter*/ - _ISCIIReset(args->converter,UCNV_RESET_TO_UNICODE); } + args->target = target; args->source = source; } /* structure for SafeClone calculations */ -struct cloneStruct +struct cloneISCIIStruct { UConverter cnv; UConverterDataISCII mydata; @@ -1434,8 +1308,8 @@ _ISCII_SafeClone(const UConverter *cnv, int32_t *pBufferSize, UErrorCode *status) { - struct cloneStruct * localClone; - int32_t bufferSizeNeeded = sizeof(struct cloneStruct); + struct cloneISCIIStruct * localClone; + int32_t bufferSizeNeeded = sizeof(struct cloneISCIIStruct); if (U_FAILURE(*status)){ return 0; @@ -1446,9 +1320,8 @@ _ISCII_SafeClone(const UConverter *cnv, return 0; } - localClone = (struct cloneStruct *)stackBuffer; + localClone = (struct cloneISCIIStruct *)stackBuffer; uprv_memcpy(&localClone->cnv, cnv, sizeof(UConverter)); - localClone->cnv.isCopyLocal = TRUE; uprv_memcpy(&localClone->mydata, cnv->extraInfo, sizeof(UConverterDataISCII)); localClone->cnv.extraInfo = &localClone->mydata; @@ -1459,7 +1332,7 @@ _ISCII_SafeClone(const UConverter *cnv, static void _ISCIIGetUnicodeSet(const UConverter *cnv, - USet *set, + USetAdder *sa, UConverterUnicodeSet which, UErrorCode *pErrorCode) { @@ -1468,19 +1341,19 @@ _ISCIIGetUnicodeSet(const UConverter *cnv, /* Since all ISCII versions allow switching to other ISCII scripts, we add all roundtrippable characters to this set. */ - uset_addRange(set, 0, ASCII_END); + sa->addRange(sa->set, 0, ASCII_END); for (script = DEVANAGARI; script <= MALAYALAM; script++) { mask = (uint8_t)(lookupInitialData[script][1]); for (idx = 0; idx < DELTA; idx++) { if (validityTable[idx] & mask) { - uset_add(set, idx + (script * DELTA) + INDIC_BLOCK_BEGIN); + sa->add(sa->set, idx + (script * DELTA) + INDIC_BLOCK_BEGIN); } } } - uset_add(set, DANDA); - uset_add(set, DOUBLE_DANDA); - uset_add(set, ZWNJ); - uset_add(set, ZWJ); + sa->add(sa->set, DANDA); + sa->add(sa->set, DOUBLE_DANDA); + sa->add(sa->set, ZWNJ); + sa->add(sa->set, ZWJ); } static const UConverterImpl _ISCIIImpl={ diff --git a/icuSources/common/ucnvlat1.c b/icuSources/common/ucnvlat1.c index 56f2e674..edb753e1 100644 --- a/icuSources/common/ucnvlat1.c +++ b/icuSources/common/ucnvlat1.c @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2000-2003, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucnvlat1.cpp @@ -13,8 +13,10 @@ */ #include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + #include "unicode/ucnv.h" -#include "unicode/ucnv_err.h" #include "unicode/uset.h" #include "ucnv_bld.h" #include "ucnv_cnv.h" @@ -26,7 +28,7 @@ /* ISO 8859-1 --------------------------------------------------------------- */ -/* This is a table-less and callback-less version of _MBCSSingleToBMPWithOffsets(). */ +/* This is a table-less and callback-less version of ucnv_MBCSSingleToBMPWithOffsets(). */ static void _Latin1ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode) { @@ -126,7 +128,7 @@ _Latin1ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, } } -/* This is a table-less and callback-less version of _MBCSSingleGetNextUChar(). */ +/* This is a table-less and callback-less version of ucnv_MBCSSingleGetNextUChar(). */ static UChar32 _Latin1GetNextUChar(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode) { @@ -141,28 +143,26 @@ _Latin1GetNextUChar(UConverterToUnicodeArgs *pArgs, return 0xffff; } -/* This is a table-less version of _MBCSSingleFromBMPWithOffsets(). */ +/* This is a table-less version of ucnv_MBCSSingleFromBMPWithOffsets(). */ static void _Latin1FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, UErrorCode *pErrorCode) { UConverter *cnv; - const UChar *source, *sourceLimit, *lastSource; - uint8_t *target; + const UChar *source, *sourceLimit; + uint8_t *target, *oldTarget; int32_t targetCapacity, length; int32_t *offsets; - UChar32 c, max; + UChar32 cp; + UChar c, max; int32_t sourceIndex; - UConverterCallbackReason reason; - int32_t i; - /* set up the local pointers */ cnv=pArgs->converter; source=pArgs->source; sourceLimit=pArgs->sourceLimit; - target=(uint8_t *)pArgs->target; + target=oldTarget=(uint8_t *)pArgs->target; targetCapacity=pArgs->targetLimit-pArgs->target; offsets=pArgs->offsets; @@ -173,11 +173,10 @@ _Latin1FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, } /* get the converter state from UConverter */ - c=cnv->fromUSurrogateLead; + cp=cnv->fromUChar32; /* sourceIndex=-1 if the current character began in the previous buffer */ - sourceIndex= c==0 ? 0 : -1; - lastSource=source; + sourceIndex= cp==0 ? 0 : -1; /* * since the conversion here is 1:1 UChar:uint8_t, we need only one counter @@ -189,13 +188,12 @@ _Latin1FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, } /* conversion loop */ - if(c!=0 && targetCapacity>0) { + if(cp!=0 && targetCapacity>0) { goto getTrail; } #if LATIN1_UNROLL_FROM_UNICODE /* unroll the loop with the most common case */ -unrolled: if(targetCapacity>=16) { int32_t count, loops; UChar u, oredChars; @@ -247,7 +245,7 @@ unrolled: targetCapacity-=16*count; if(offsets!=NULL) { - lastSource+=16*count; + oldTarget+=16*count; while(count>0) { *offsets++=sourceIndex++; *offsets++=sourceIndex++; @@ -268,156 +266,62 @@ unrolled: --count; } } - - c=0; } #endif - while(targetCapacity>0) { - /* - * Get a correct Unicode code point: - * a single UChar for a BMP code point or - * a matched surrogate pair for a "surrogate code point". - */ - c=*source++; - if(c<=max) { - /* convert the Unicode code point */ - *target++=(uint8_t)c; - --targetCapacity; - - /* normal end of conversion: prepare for a new character */ - c=0; - } else { - if(!UTF_IS_SURROGATE(c)) { - /* callback(unassigned) */ - reason=UCNV_UNASSIGNED; - *pErrorCode=U_INVALID_CHAR_FOUND; - } else if(UTF_IS_SURROGATE_FIRST(c)) { + /* conversion loop */ + c=0; + while(targetCapacity>0 && (c=*source++)<=max) { + /* convert the Unicode code point */ + *target++=(uint8_t)c; + --targetCapacity; + } + + if(c>max) { + cp=c; + if(!U_IS_SURROGATE(cp)) { + /* callback(unassigned) */ + } else if(U_IS_SURROGATE_LEAD(cp)) { getTrail: - if(source0) { - *offsets++=sourceIndex++; - --count; - } - /* offset and sourceIndex are now set for the current character */ - } - - /* update the arguments structure */ - pArgs->source=source; - pArgs->target=(char *)target; - pArgs->offsets=offsets; - - /* set the converter state in UConverter to deal with the next character */ - cnv->fromUSurrogateLead=0; - - /* write the code point as code units */ - i=0; - UTF_APPEND_CHAR_UNSAFE(cnv->invalidUCharBuffer, i, c); - cnv->invalidUCharLength=(int8_t)i; - /* i==length */ - - /* call the callback function */ - cnv->fromUCharErrorBehaviour(cnv->fromUContext, pArgs, cnv->invalidUCharBuffer, i, c, reason, pErrorCode); - - /* get the converter state from UConverter */ - c=cnv->fromUSurrogateLead; - - /* update target and deal with offsets if necessary */ - offsets=ucnv_updateCallbackOffsets(offsets, ((uint8_t *)pArgs->target)-target, sourceIndex); - target=(uint8_t *)pArgs->target; - - /* update the source pointer and index */ - sourceIndex+=length+(pArgs->source-source); - source=lastSource=pArgs->source; - targetCapacity=(uint8_t *)pArgs->targetLimit-target; - length=sourceLimit-source; - if(lengthcharErrorBufferLength>0) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - break; + /* no more input */ + cnv->fromUChar32=cp; + goto noMoreInput; } - -#if LATIN1_UNROLL_FROM_UNICODE - goto unrolled; -#endif + } else { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ } - } - if(U_SUCCESS(*pErrorCode) && source=(uint8_t *)pArgs->targetLimit) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + *pErrorCode= U_IS_SURROGATE(cp) ? U_ILLEGAL_CHAR_FOUND : U_INVALID_CHAR_FOUND; + cnv->fromUChar32=cp; } +noMoreInput: - /* set offsets since the start or the last callback */ + /* set offsets since the start */ if(offsets!=NULL) { - size_t count=source-lastSource; + size_t count=target-oldTarget; while(count>0) { *offsets++=sourceIndex++; --count; } } - if(pArgs->flush && source>=sourceLimit) { - /* reset the state for the next conversion */ - if(c!=0 && U_SUCCESS(*pErrorCode)) { - /* a Unicode code point remains incomplete (only a first surrogate) */ - *pErrorCode=U_TRUNCATED_CHAR_FOUND; - } - cnv->fromUSurrogateLead=0; - } else { - /* set the converter state back into UConverter */ - cnv->fromUSurrogateLead=(UChar)c; + if(U_SUCCESS(*pErrorCode) && source=(uint8_t *)pArgs->targetLimit) { + /* target is full */ + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; } /* write back the updated pointers */ @@ -428,10 +332,10 @@ getTrail: static void _Latin1GetUnicodeSet(const UConverter *cnv, - USet *set, + USetAdder *sa, UConverterUnicodeSet which, UErrorCode *pErrorCode) { - uset_addRange(set, 0, 0xff); + sa->addRange(sa->set, 0, 0xff); } static const UConverterImpl _Latin1Impl={ @@ -475,27 +379,28 @@ const UConverterSharedData _Latin1Data={ /* US-ASCII ----------------------------------------------------------------- */ -/* This is a table-less version of _MBCSSingleToBMPWithOffsets(). */ +/* This is a table-less version of ucnv_MBCSSingleToBMPWithOffsets(). */ static void _ASCIIToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode) { - const uint8_t *source, *sourceLimit, *lastSource; - UChar *target; + const uint8_t *source, *sourceLimit; + UChar *target, *oldTarget; int32_t targetCapacity, length; int32_t *offsets; int32_t sourceIndex; + uint8_t c; + /* set up the local pointers */ source=(const uint8_t *)pArgs->source; sourceLimit=(const uint8_t *)pArgs->sourceLimit; - target=pArgs->target; + target=oldTarget=pArgs->target; targetCapacity=pArgs->targetLimit-pArgs->target; offsets=pArgs->offsets; /* sourceIndex=-1 if the current character began in the previous buffer */ sourceIndex=0; - lastSource=source; /* * since the conversion here is 1:1 UChar:uint8_t, we need only one counter @@ -508,7 +413,6 @@ _ASCIIToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, #if ASCII_UNROLL_TO_UNICODE /* unroll the loop with the most common case */ -unrolled: if(targetCapacity>=16) { int32_t count, loops; UChar oredChars; @@ -544,7 +448,7 @@ unrolled: targetCapacity-=16*count; if(offsets!=NULL) { - lastSource+=16*count; + oldTarget+=16*count; while(count>0) { *offsets++=sourceIndex++; *offsets++=sourceIndex++; @@ -569,86 +473,26 @@ unrolled: #endif /* conversion loop */ - while(targetCapacity>0) { - if((*target++=*source++)<=0x7f) { - --targetCapacity; - } else { - UConverter *cnv; - - /* back out the illegal character */ - --target; - - /* call the callback function with all the preparations and post-processing */ - cnv=pArgs->converter; - - /* callback(illegal) */ - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - - /* set offsets since the start or the last callback */ - if(offsets!=NULL) { - int32_t count=(int32_t)(source-lastSource); - - /* predecrement: do not set the offset for the callback-causing character */ - while(--count>0) { - *offsets++=sourceIndex++; - } - /* offset and sourceIndex are now set for the current character */ - } - - /* update the arguments structure */ - pArgs->source=(const char *)source; - pArgs->target=target; - pArgs->offsets=offsets; - - /* copy the current bytes to invalidCharBuffer */ - cnv->invalidCharBuffer[0]=*(source-1); - cnv->invalidCharLength=1; - - /* call the callback function */ - cnv->fromCharErrorBehaviour(cnv->toUContext, pArgs, cnv->invalidCharBuffer, 1, UCNV_ILLEGAL, pErrorCode); - - /* update target and deal with offsets if necessary */ - offsets=ucnv_updateCallbackOffsets(offsets, pArgs->target-target, sourceIndex); - target=pArgs->target; - - /* update the source pointer and index */ - sourceIndex+=1+((const uint8_t *)pArgs->source-source); - source=lastSource=(const uint8_t *)pArgs->source; - targetCapacity=pArgs->targetLimit-target; - length=sourceLimit-source; - if(lengthUCharErrorBufferLength>0) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - break; - } - -#if ASCII_UNROLL_TO_UNICODE - goto unrolled; -#endif - } + c=0; + while(targetCapacity>0 && (c=*source++)<=0x7f) { + *target++=c; + --targetCapacity; } - if(U_SUCCESS(*pErrorCode) && source=pArgs->targetLimit) { + if(c>0x7f) { + /* callback(illegal); copy the current bytes to toUBytes[] */ + UConverter *cnv=pArgs->converter; + cnv->toUBytes[0]=c; + cnv->toULength=1; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + } else if(source=pArgs->targetLimit) { /* target is full */ *pErrorCode=U_BUFFER_OVERFLOW_ERROR; } - /* set offsets since the start or the last callback */ + /* set offsets since the start */ if(offsets!=NULL) { - size_t count=source-lastSource; + size_t count=target-oldTarget; while(count>0) { *offsets++=sourceIndex++; --count; @@ -661,76 +505,39 @@ unrolled: pArgs->offsets=offsets; } -/* This is a table-less version of _MBCSSingleGetNextUChar(). */ +/* This is a table-less version of ucnv_MBCSSingleGetNextUChar(). */ static UChar32 _ASCIIGetNextUChar(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode) { - UChar buffer[UTF_MAX_CHAR_LENGTH]; const uint8_t *source; uint8_t b; - /* set up the local pointers */ source=(const uint8_t *)pArgs->source; - - /* conversion loop */ - while(source<(const uint8_t *)pArgs->sourceLimit) { + if(source<(const uint8_t *)pArgs->sourceLimit) { b=*source++; pArgs->source=(const char *)source; if(b<=0x7f) { return b; } else { - /* call the callback function with all the preparations and post-processing */ UConverter *cnv=pArgs->converter; - - /* callback(illegal) */ + cnv->toUBytes[0]=b; + cnv->toULength=1; *pErrorCode=U_ILLEGAL_CHAR_FOUND; - - /* update the arguments structure */ - pArgs->target=buffer; - pArgs->targetLimit=buffer+UTF_MAX_CHAR_LENGTH; - - /* copy the current byte to invalidCharBuffer */ - cnv->invalidCharBuffer[0]=(char)b; - cnv->invalidCharLength=1; - - /* call the callback function */ - cnv->fromCharErrorBehaviour(cnv->toUContext, pArgs, cnv->invalidCharBuffer, 1, UCNV_ILLEGAL, pErrorCode); - - /* update the source pointer */ - source=(const uint8_t *)pArgs->source; - - /* - * return the first character if the callback wrote some - * we do not need to goto finish because the converter state is already set - */ - if(U_SUCCESS(*pErrorCode)) { - int32_t length=pArgs->target-buffer; - if(length>0) { - return ucnv_getUChar32KeepOverflow(cnv, buffer, length); - } - /* else (callback did not write anything) continue */ - } else if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR) { - *pErrorCode=U_ZERO_ERROR; - return ucnv_getUChar32KeepOverflow(cnv, buffer, UTF_MAX_CHAR_LENGTH); - } else { - /* break on error */ - /* ### what if a callback set an error but _also_ generated output?! */ - return 0xffff; - } + return 0xffff; } } - /* no output because of empty input or only skipping callbacks */ + /* no output because of empty input */ *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; return 0xffff; } static void _ASCIIGetUnicodeSet(const UConverter *cnv, - USet *set, + USetAdder *sa, UConverterUnicodeSet which, UErrorCode *pErrorCode) { - uset_addRange(set, 0, 0x7f); + sa->addRange(sa->set, 0, 0x7f); } static const UConverterImpl _ASCIIImpl={ @@ -771,3 +578,5 @@ const UConverterSharedData _ASCIIData={ NULL, NULL, &_ASCIIStaticData, FALSE, &_ASCIIImpl, 0 }; + +#endif diff --git a/icuSources/common/ucnvmbcs.c b/icuSources/common/ucnvmbcs.c index 0c283ecc..9f9c6f32 100644 --- a/icuSources/common/ucnvmbcs.c +++ b/icuSources/common/ucnvmbcs.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 2000-2003, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -21,7 +21,7 @@ * - efficient distinction of unassigned vs. illegal byte sequences * - it is possible in fromUnicode() to directly deal with simple * stateful encodings (used for EBCDIC_STATEFUL) -* - it is possible to convert Unicode code points other than U+0000 +* - it is possible to convert Unicode code points * to a single zero byte (but not as a fallback except for SBCS) * * Remaining limitations in fromUnicode: @@ -29,6 +29,10 @@ * - except for SBCS codepages: no fallback mapping from Unicode to a zero byte * - limitation to up to 4 bytes per character * +* ICU 2.8 (late 2003) adds a secondary data structure which lifts some of these +* limitations and adds m:n character mappings and other features. +* See ucnv_ext.h for details. +* * Change history: * * 5/6/2001 Ram Moved MBCS_SINGLE_RESULT_FROM_U,MBCS_STAGE_2_FROM_U, @@ -38,7 +42,7 @@ #include "unicode/utypes.h" -#if !UCONFIG_NO_LEGACY_CONVERSION +#if !UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION #include "unicode/ucnv.h" #include "unicode/ucnv_cb.h" @@ -46,6 +50,7 @@ #include "unicode/uset.h" #include "ucnv_bld.h" #include "ucnvmbcs.h" +#include "ucnv_ext.h" #include "ucnv_cnv.h" #include "umutex.h" #include "cmemory.h" @@ -56,9 +61,18 @@ #define MBCS_UNROLL_SINGLE_FROM_BMP 0 /* - * _MBCSHeader versions 4.1 + * _MBCSHeader versions 4.2 * (Note that the _MBCSHeader version is in addition to the converter formatVersion.) * + * Change from version 4.1: + * - Added an optional extension table structure at the end of the .cnv file. + * It is present if the upper bits of the header flags field contains a non-zero + * byte offset to it. + * Files that contain only a conversion table and no base table + * use the special outputType MBCS_OUTPUT_EXT_ONLY. + * These contain the base table name between the MBCS header and the extension + * data. + * * Change from version 4.0: * - Replace header.reserved with header.fromUBytesLength so that all * fields in the data have length. @@ -270,7 +284,7 @@ * Leading zero bytes are ignored, and the number of bytes is counted. * A zero byte mapping result is possible as a roundtrip result. * For some output types, the actual result is processed from this; - * see _MBCSFromUnicodeWithOffsets(). + * see ucnv_MBCSFromUnicodeWithOffsets(). * * Note that stage 1 always contains 0x440=1088 entries (0x440==0x110000>>10), * or (version 3 and up) for BMP-only codepages, it contains 64 entries. @@ -285,47 +299,6 @@ * adding new ones without crashing an unaware converter */ -/* prototypes --------------------------------------------------------------- */ - -static void -_MBCSSingleToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, - UErrorCode *pErrorCode); - -static void -_MBCSSingleToBMPWithOffsets(UConverterToUnicodeArgs *pArgs, - UErrorCode *pErrorCode); - -static UChar32 -_MBCSGetNextUChar(UConverterToUnicodeArgs *pArgs, - UErrorCode *pErrorCode); - -static UChar32 -_MBCSSingleGetNextUChar(UConverterToUnicodeArgs *pArgs, - UErrorCode *pErrorCode); - -static void -_MBCSDoubleFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, - UErrorCode *pErrorCode); - -static void -_MBCSSingleFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, - UErrorCode *pErrorCode); - -static void -_MBCSSingleFromBMPWithOffsets(UConverterFromUnicodeArgs *pArgs, - UErrorCode *pErrorCode); - -static void -fromUCallback(UConverter *cnv, - const void *context, UConverterFromUnicodeArgs *pArgs, - UChar32 codePoint, - UConverterCallbackReason reason, UErrorCode *pErrorCode); - -static void -toUCallback(UConverter *cnv, - const void *context, UConverterToUnicodeArgs *pArgs, - const char *codeUnits, int32_t length, - UConverterCallbackReason reason, UErrorCode *pErrorCode); /* GB 18030 data ------------------------------------------------------------ */ @@ -367,98 +340,104 @@ gb18030Ranges[13][4]={ /* Miscellaneous ------------------------------------------------------------ */ -static uint32_t -_MBCSSizeofFromUBytes(UConverterMBCSTable *mbcsTable) { - const uint16_t *table; - - uint32_t st3, maxStage3; - uint16_t st1, maxStage1, st2; - - if(mbcsTable->fromUBytesLength>0) { - /* - * We _know_ the number of bytes in the fromUnicodeBytes array - * starting with header.version 4.1. - * Otherwise, below, we need to enumerate the fromUnicode - * trie and find the highest entry. - */ - return mbcsTable->fromUBytesLength; - } - - /* Enumerate the from-Unicode trie table to find the highest stage 3 index. */ - table=mbcsTable->fromUnicodeTable; - maxStage3=0; - if(mbcsTable->unicodeMask&UCNV_HAS_SUPPLEMENTARY) { - maxStage1=0x440; - } else { - maxStage1=0x40; - } - +/* similar to ucnv_MBCSGetNextUChar() but recursive */ +static void +_getUnicodeSetForBytes(const UConverterSharedData *sharedData, + const int32_t (*stateTable)[256], const uint16_t *unicodeCodeUnits, + USetAdder *sa, + UConverterUnicodeSet which, + uint8_t state, uint32_t offset, int32_t lowByte, int32_t highByte, + + UErrorCode *pErrorCode) { + int32_t b, entry; + + for(b=lowByte; b<=highByte; ++b) { + entry=stateTable[state][b]; + if(MBCS_ENTRY_IS_TRANSITION(entry)) { + _getUnicodeSetForBytes( + sharedData, stateTable, unicodeCodeUnits, + sa, which, + (uint8_t)MBCS_ENTRY_TRANSITION_STATE(entry), + offset+MBCS_ENTRY_TRANSITION_OFFSET(entry), + 0, 0xff, + pErrorCode); + } else { + UChar32 c; + int32_t rowOffset=offset; + uint8_t action; - if(mbcsTable->outputType==MBCS_OUTPUT_1) { - const uint16_t *stage2; + c=U_SENTINEL; - for(st1=0; st1maxStage1) { - stage2=table+st2; - for(st2=0; st2<64; ++st2) { - st3=stage2[st2]; - if(st3>maxStage3) { - maxStage3=st3; - } + /* + * An if-else-if chain provides more reliable performance for + * the most common cases compared to a switch. + */ + action=(uint8_t)(MBCS_ENTRY_FINAL_ACTION(entry)); + if(action==MBCS_STATE_VALID_DIRECT_16) { + /* output BMP code point */ + c=(UChar)MBCS_ENTRY_FINAL_VALUE_16(entry); + } else if(action==MBCS_STATE_VALID_16) { + offset+=MBCS_ENTRY_FINAL_VALUE_16(entry); + c=unicodeCodeUnits[offset]; + if(c<0xfffe) { + /* output BMP code point */ + } else { + c=U_SENTINEL; } - } - } - - /* - * add 16 to get the limit not start index of the last stage 3 block, - * times 2 for number of bytes - */ - return (maxStage3+16)*2; - } else { - const uint32_t *stage2; - - for(st1=0; st1(maxStage1>>1)) { - stage2=(const uint32_t *)table+st2; - for(st2=0; st2<64; ++st2) { - st3=stage2[st2]&0xffff; - if(st3>maxStage3) { - maxStage3=st3; - } + } else if(action==MBCS_STATE_VALID_16_PAIR) { + offset+=MBCS_ENTRY_FINAL_VALUE_16(entry); + c=unicodeCodeUnits[offset++]; + if(c<0xd800) { + /* output BMP code point below 0xd800 */ + } else if(c<=0xdbff) { + /* output roundtrip or fallback supplementary code point */ + c=((c&0x3ff)<<10)+unicodeCodeUnits[offset]+(0x10000-0xdc00); + } else if(c==0xe000) { + /* output roundtrip BMP code point above 0xd800 or fallback BMP code point */ + c=unicodeCodeUnits[offset]; + } else { + c=U_SENTINEL; } + } else if(action==MBCS_STATE_VALID_DIRECT_20) { + /* output supplementary code point */ + c=(UChar32)(MBCS_ENTRY_FINAL_VALUE(entry)+0x10000); } - } - /* - * add 16 to get the limit not start index of the last stage 3 block, - * times 2..4 for number of bytes - */ - maxStage3=16*maxStage3+16; - switch(mbcsTable->outputType) { - case MBCS_OUTPUT_3: - case MBCS_OUTPUT_4_EUC: - maxStage3*=3; - break; - case MBCS_OUTPUT_4: - maxStage3*=4; - break; - default: - /* MBCS_OUTPUT_2... and MBCS_OUTPUT_3_EUC */ - maxStage3*=2; - break; + if(c>=0) { + sa->add(sa->set, c); + } + offset=rowOffset; } - return maxStage3; } } -static void -_MBCSGetUnicodeSet(const UConverter *cnv, - USet *set, - UConverterUnicodeSet which, - UErrorCode *pErrorCode) { - UConverterMBCSTable *mbcsTable; +/* + * Internal function returning a UnicodeSet for toUnicode() conversion. + * Currently only used for ISO-2022-CN, and only handles roundtrip mappings. + * In the future, if we add support for reverse-fallback sets, this function + * needs to be updated, and called for each initial state. + * Does not currently handle extensions. + * Does not empty the set first. + */ +U_CFUNC void +ucnv_MBCSGetUnicodeSetForBytes(const UConverterSharedData *sharedData, + USetAdder *sa, + UConverterUnicodeSet which, + uint8_t state, int32_t lowByte, int32_t highByte, + UErrorCode *pErrorCode) { + _getUnicodeSetForBytes( + sharedData, sharedData->mbcs.stateTable, sharedData->mbcs.unicodeCodeUnits, + sa, which, + state, 0, lowByte, highByte, + pErrorCode); +} + +U_CFUNC void +ucnv_MBCSGetUnicodeSetForUnicode(const UConverterSharedData *sharedData, + USetAdder *sa, + UConverterUnicodeSet which, + UErrorCode *pErrorCode) { + const UConverterMBCSTable *mbcsTable; const uint16_t *table; uint32_t st3; @@ -466,14 +445,8 @@ _MBCSGetUnicodeSet(const UConverter *cnv, UChar32 c; - if(cnv->options&_MBCS_OPTION_GB18030) { - uset_addRange(set, 0, 0xd7ff); - uset_addRange(set, 0xe000, 0x10ffff); - return; - } - /* enumerate the from-Unicode trie table */ - mbcsTable=&cnv->sharedData->table->mbcs; + mbcsTable=&sharedData->mbcs; table=mbcsTable->fromUnicodeTable; if(mbcsTable->unicodeMask&UCNV_HAS_SUPPLEMENTARY) { maxStage1=0x440; @@ -501,13 +474,55 @@ _MBCSGetUnicodeSet(const UConverter *cnv, * Add code points for which the roundtrip flag is set. * Once we get a set for fallback mappings, we have to use * a threshold variable with a value of 0x800. - * See _MBCSSingleFromBMPWithOffsets() and + * See ucnv_MBCSSingleFromBMPWithOffsets() and * MBCS_SINGLE_RESULT_FROM_U() for details. */ do { if(*stage3++>=0xf00) { - uset_add(set, c); + sa->add(sa->set, c); + } + } while((++c&0xf)!=0); + } else { + c+=16; /* empty stage 3 block */ + } + } + } else { + c+=1024; /* empty stage 2 block */ + } + } + } else if(mbcsTable->outputType==MBCS_OUTPUT_DBCS_ONLY) { + /* ignore single-byte results */ + const uint32_t *stage2; + const uint16_t *stage3, *results; + + results=(const uint16_t *)mbcsTable->fromUnicodeBytes; + + for(st1=0; st1(maxStage1>>1)) { + stage2=(const uint32_t *)table+st2; + for(st2=0; st2<64; ++st2) { + if((st3=stage2[st2])!=0) { + /* read the stage 3 block */ + stage3=results+16*(uint32_t)(uint16_t)st3; + + /* get the roundtrip flags for the stage 3 block */ + st3>>=16; + + /* + * Add code points for which the roundtrip flag is set. + * Once we get a set for fallback mappings, we have to check + * non-roundtrip stage 3 results for whether they are 0. + * See ucnv_MBCSFromUnicodeWithOffsets() for details. + * + * Ignore single-byte results (<0x100). + */ + do { + if((st3&1)!=0 && *stage3>=0x100) { + sa->add(sa->set, c); } + st3>>=1; + ++stage3; } while((++c&0xf)!=0); } else { c+=16; /* empty stage 3 block */ @@ -533,11 +548,11 @@ _MBCSGetUnicodeSet(const UConverter *cnv, * Add code points for which the roundtrip flag is set. * Once we get a set for fallback mappings, we have to check * non-roundtrip stage 3 results for whether they are 0. - * See _MBCSFromUnicodeWithOffsets() for details. + * See ucnv_MBCSFromUnicodeWithOffsets() for details. */ do { if(st3&1) { - uset_add(set, c); + sa->add(sa->set, c); } st3>>=1; } while((++c&0xf)!=0); @@ -550,6 +565,156 @@ _MBCSGetUnicodeSet(const UConverter *cnv, } } } + + ucnv_extGetUnicodeSet(sharedData, sa, which, pErrorCode); +} + +static void +ucnv_MBCSGetUnicodeSet(const UConverter *cnv, + USetAdder *sa, + UConverterUnicodeSet which, + UErrorCode *pErrorCode) { + if(cnv->options&_MBCS_OPTION_GB18030) { + sa->addRange(sa->set, 0, 0xd7ff); + sa->addRange(sa->set, 0xe000, 0x10ffff); + } else { + ucnv_MBCSGetUnicodeSetForUnicode(cnv->sharedData, sa, which, pErrorCode); + } +} + +/* conversion extensions for input not in the main table -------------------- */ + +/* + * Hardcoded extension handling for GB 18030. + * Definition of LINEAR macros and gb18030Ranges see near the beginning of the file. + * + * In the future, conversion extensions may handle m:n mappings and delta tables, + * see http://oss.software.ibm.com/cvs/icu/~checkout~/icuhtml/design/conversion/conversion_extensions.html + * + * If an input character cannot be mapped, then these functions set an error + * code. The framework will then call the callback function. + */ + +/* + * @return if(U_FAILURE) return the code point for cnv->fromUChar32 + * else return 0 after output has been written to the target + */ +static UChar32 +_extFromU(UConverter *cnv, const UConverterSharedData *sharedData, + UChar32 cp, + const UChar **source, const UChar *sourceLimit, + char **target, const char *targetLimit, + int32_t **offsets, int32_t sourceIndex, + UBool flush, + UErrorCode *pErrorCode) { + const int32_t *cx; + + cnv->useSubChar1=FALSE; + + if( (cx=sharedData->mbcs.extIndexes)!=NULL && + ucnv_extInitialMatchFromU( + cnv, cx, + cp, source, sourceLimit, + target, targetLimit, + offsets, sourceIndex, + flush, + pErrorCode) + ) { + return 0; /* an extension mapping handled the input */ + } + + /* GB 18030 */ + if((cnv->options&_MBCS_OPTION_GB18030)!=0) { + const uint32_t *range; + int32_t i; + + range=gb18030Ranges[0]; + for(i=0; itoUBytes[0..length[ + * @return if(U_FAILURE) return the length (toULength, byteIndex) for the input + * else return 0 after output has been written to the target + */ +static int8_t +_extToU(UConverter *cnv, const UConverterSharedData *sharedData, + int8_t length, + const char **source, const char *sourceLimit, + UChar **target, const UChar *targetLimit, + int32_t **offsets, int32_t sourceIndex, + UBool flush, + UErrorCode *pErrorCode) { + const int32_t *cx; + + if( (cx=sharedData->mbcs.extIndexes)!=NULL && + ucnv_extInitialMatchToU( + cnv, cx, + length, source, sourceLimit, + target, targetLimit, + offsets, sourceIndex, + flush, + pErrorCode) + ) { + return 0; /* an extension mapping handled the input */ + } + + /* GB 18030 */ + if(length==4 && (cnv->options&_MBCS_OPTION_GB18030)!=0) { + const uint32_t *range; + uint32_t linear; + int32_t i; + + linear=LINEAR_18030(cnv->toUBytes[0], cnv->toUBytes[1], cnv->toUBytes[2], cnv->toUBytes[3]); + range=gb18030Ranges[0]; + for(i=0; iNL ------------------------------------------------------ */ @@ -602,7 +767,7 @@ _EBCDICSwapLFNL(UConverterSharedData *sharedData, UErrorCode *pErrorCode) { uint32_t stage2Entry; uint32_t size, sizeofFromUBytes; - mbcsTable=&sharedData->table->mbcs; + mbcsTable=&sharedData->mbcs; table=mbcsTable->fromUnicodeTable; bytes=mbcsTable->fromUnicodeBytes; @@ -647,6 +812,29 @@ _EBCDICSwapLFNL(UConverterSharedData *sharedData, UErrorCode *pErrorCode) { } } + if(mbcsTable->fromUBytesLength>0) { + /* + * We _know_ the number of bytes in the fromUnicodeBytes array + * starting with header.version 4.1. + */ + sizeofFromUBytes=mbcsTable->fromUBytesLength; + } else { + /* + * Otherwise: + * There used to be code to enumerate the fromUnicode + * trie and find the highest entry, but it was removed in ICU 3.2 + * because it was not tested and caused a low code coverage number. + * See Jitterbug 3674. + * This affects only some .cnv file formats with a header.version + * below 4.1, and only when swaplfnl is requested. + * + * ucnvmbcs.c revision 1.99 is the last one with the + * ucnv_MBCSSizeofFromUBytes() function. + */ + *pErrorCode=U_INVALID_FORMAT_ERROR; + return FALSE; + } + /* * The table has an appropriate format. * Allocate and build @@ -654,7 +842,6 @@ _EBCDICSwapLFNL(UConverterSharedData *sharedData, UErrorCode *pErrorCode) { * - a modified from-Unicode output array * - a converter name string with the swap option appended */ - sizeofFromUBytes=_MBCSSizeofFromUBytes(mbcsTable); size= mbcsTable->countStates*1024+ sizeofFromUBytes+ @@ -714,107 +901,262 @@ _EBCDICSwapLFNL(UConverterSharedData *sharedData, UErrorCode *pErrorCode) { /* MBCS setup functions ----------------------------------------------------- */ static void -_MBCSLoad(UConverterSharedData *sharedData, +ucnv_MBCSLoad(UConverterSharedData *sharedData, + UConverterLoadArgs *pArgs, const uint8_t *raw, UErrorCode *pErrorCode) { UDataInfo info; - UConverterMBCSTable *mbcsTable=&sharedData->table->mbcs; + UConverterMBCSTable *mbcsTable=&sharedData->mbcs; _MBCSHeader *header=(_MBCSHeader *)raw; + uint32_t offset; if(header->version[0]!=4) { *pErrorCode=U_INVALID_TABLE_FORMAT; return; } - mbcsTable->countStates=(uint8_t)header->countStates; - mbcsTable->countToUFallbacks=header->countToUFallbacks; - mbcsTable->stateTable=(const int32_t (*)[256])(raw+sizeof(_MBCSHeader)); - mbcsTable->toUFallbacks=(const _MBCSToUFallback *)(mbcsTable->stateTable+header->countStates); - mbcsTable->unicodeCodeUnits=(const uint16_t *)(raw+header->offsetToUCodeUnits); - - mbcsTable->fromUnicodeTable=(const uint16_t *)(raw+header->offsetFromUTable); - mbcsTable->fromUnicodeBytes=(const uint8_t *)(raw+header->offsetFromUBytes); - mbcsTable->fromUBytesLength=header->fromUBytesLength; mbcsTable->outputType=(uint8_t)header->flags; - /* make sure that the output type is known */ - switch(mbcsTable->outputType) { - case MBCS_OUTPUT_1: - case MBCS_OUTPUT_2: - case MBCS_OUTPUT_3: - case MBCS_OUTPUT_4: - case MBCS_OUTPUT_3_EUC: - case MBCS_OUTPUT_4_EUC: - case MBCS_OUTPUT_2_SISO: - /* OK */ - break; - default: - *pErrorCode=U_INVALID_TABLE_FORMAT; - return; + /* extension data, header version 4.2 and higher */ + offset=header->flags>>8; + if(offset!=0) { + mbcsTable->extIndexes=(const int32_t *)(raw+offset); } - /* - * converter versions 6.1 and up contain a unicodeMask that is - * used here to select the most efficient function implementations - */ - info.size=sizeof(UDataInfo); - udata_getInfo((UDataMemory *)sharedData->dataMemory, &info); - if(info.formatVersion[0]>6 || (info.formatVersion[0]==6 && info.formatVersion[1]>=1)) { - /* mask off possible future extensions to be safe */ - mbcsTable->unicodeMask=(uint8_t)(sharedData->staticData->unicodeMask&3); - } else { - /* for older versions, assume worst case: contains anything possible (prevent over-optimizations) */ - mbcsTable->unicodeMask=UCNV_HAS_SUPPLEMENTARY|UCNV_HAS_SURROGATES; - } -} + if(mbcsTable->outputType==MBCS_OUTPUT_EXT_ONLY) { + UConverterLoadArgs args={ 0 }; + UConverterSharedData *baseSharedData; + const int32_t *extIndexes; + const char *baseName; -static void -_MBCSUnload(UConverterSharedData *sharedData) { - UConverterMBCSTable *mbcsTable=&sharedData->table->mbcs; + /* extension-only file, load the base table and set values appropriately */ + if((extIndexes=mbcsTable->extIndexes)==NULL) { + /* extension-only file without extension */ + *pErrorCode=U_INVALID_TABLE_FORMAT; + return; + } - if(mbcsTable->swapLFNLStateTable!=NULL) { - uprv_free(mbcsTable->swapLFNLStateTable); - } -} + if(pArgs->nestedLoads!=1) { + /* an extension table must not be loaded as a base table */ + *pErrorCode=U_INVALID_TABLE_FILE; + return; + } -static void -_MBCSReset(UConverter *cnv, UConverterResetChoice choice) { - if(choice<=UCNV_RESET_TO_UNICODE) { - /* toUnicode */ - cnv->toUnicodeStatus=0; /* offset */ - cnv->mode=0; /* state */ - cnv->toULength=0; /* byteIndex */ - } - if(choice!=UCNV_RESET_TO_UNICODE) { - /* fromUnicode */ - cnv->fromUSurrogateLead=0; - cnv->fromUnicodeStatus=1; /* prevLength */ - } -} + /* load the base table */ + baseName=(const char *)(header+1); + if(0==uprv_strcmp(baseName, sharedData->staticData->name)) { + /* forbid loading this same extension-only file */ + *pErrorCode=U_INVALID_TABLE_FORMAT; + return; + } -static void -_MBCSOpen(UConverter *cnv, - const char *name, + /* TODO parse package name out of the prefix of the base name in the extension .cnv file? */ + args.size=sizeof(UConverterLoadArgs); + args.nestedLoads=2; + args.reserved=pArgs->reserved; + args.options=pArgs->options; + args.pkg=pArgs->pkg; + args.name=baseName; + baseSharedData=ucnv_load(&args, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return; + } + if( baseSharedData->staticData->conversionType!=UCNV_MBCS || + baseSharedData->mbcs.baseSharedData!=NULL + ) { + ucnv_unload(baseSharedData); + *pErrorCode=U_INVALID_TABLE_FORMAT; + return; + } + + /* copy the base table data */ + uprv_memcpy(mbcsTable, &baseSharedData->mbcs, sizeof(UConverterMBCSTable)); + + /* overwrite values with relevant ones for the extension converter */ + mbcsTable->baseSharedData=baseSharedData; + mbcsTable->extIndexes=extIndexes; + + /* + * It would be possible to share the swapLFNL data with a base converter, + * but the generated name would have to be different, and the memory + * would have to be free'd only once. + * It is easier to just create the data for the extension converter + * separately when it is requested. + */ + mbcsTable->swapLFNLStateTable=NULL; + mbcsTable->swapLFNLFromUnicodeBytes=NULL; + mbcsTable->swapLFNLName=NULL; + + /* + * Set a special, runtime-only outputType if the extension converter + * is a DBCS version of a base converter that also maps single bytes. + */ + if( sharedData->staticData->conversionType==UCNV_DBCS || + (sharedData->staticData->conversionType==UCNV_MBCS && + sharedData->staticData->minBytesPerChar>=2) + ) { + if(baseSharedData->mbcs.outputType==MBCS_OUTPUT_2_SISO) { + /* the base converter is SI/SO-stateful */ + int32_t entry; + + /* get the dbcs state from the state table entry for SO=0x0e */ + entry=mbcsTable->stateTable[0][0xe]; + if( MBCS_ENTRY_IS_FINAL(entry) && + MBCS_ENTRY_FINAL_ACTION(entry)==MBCS_STATE_CHANGE_ONLY && + MBCS_ENTRY_FINAL_STATE(entry)!=0 + ) { + mbcsTable->dbcsOnlyState=(uint8_t)MBCS_ENTRY_FINAL_STATE(entry); + + mbcsTable->outputType=MBCS_OUTPUT_DBCS_ONLY; + } + } else if( + baseSharedData->staticData->conversionType==UCNV_MBCS && + baseSharedData->staticData->minBytesPerChar==1 && + baseSharedData->staticData->maxBytesPerChar==2 && + mbcsTable->countStates<=127 + ) { + /* non-stateful base converter, need to modify the state table */ + int32_t (*newStateTable)[256]; + int32_t *state; + int32_t i, count; + + /* allocate a new state table and copy the base state table contents */ + count=mbcsTable->countStates; + newStateTable=(int32_t (*)[256])uprv_malloc((count+1)*1024); + if(newStateTable==NULL) { + ucnv_unload(baseSharedData); + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + return; + } + + uprv_memcpy(newStateTable, mbcsTable->stateTable, count*1024); + + /* change all final single-byte entries to go to a new all-illegal state */ + state=newStateTable[0]; + for(i=0; i<256; ++i) { + if(MBCS_ENTRY_IS_FINAL(state[i])) { + state[i]=MBCS_ENTRY_TRANSITION(count, 0); + } + } + + /* build the new all-illegal state */ + state=newStateTable[count]; + for(i=0; i<256; ++i) { + state[i]=MBCS_ENTRY_FINAL(0, MBCS_STATE_ILLEGAL, 0); + } + mbcsTable->stateTable=(const int32_t (*)[256])newStateTable; + mbcsTable->countStates=(uint8_t)(count+1); + mbcsTable->stateTableOwned=TRUE; + + mbcsTable->outputType=MBCS_OUTPUT_DBCS_ONLY; + } + } + + /* + * unlike below for files with base tables, do not get the unicodeMask + * from the sharedData; instead, use the base table's unicodeMask, + * which we copied in the memcpy above; + * this is necessary because the static data unicodeMask, especially + * the UCNV_HAS_SUPPLEMENTARY flag, is part of the base table data + */ + } else { + /* conversion file with a base table; an additional extension table is optional */ + /* make sure that the output type is known */ + switch(mbcsTable->outputType) { + case MBCS_OUTPUT_1: + case MBCS_OUTPUT_2: + case MBCS_OUTPUT_3: + case MBCS_OUTPUT_4: + case MBCS_OUTPUT_3_EUC: + case MBCS_OUTPUT_4_EUC: + case MBCS_OUTPUT_2_SISO: + /* OK */ + break; + default: + *pErrorCode=U_INVALID_TABLE_FORMAT; + return; + } + + mbcsTable->countStates=(uint8_t)header->countStates; + mbcsTable->countToUFallbacks=header->countToUFallbacks; + mbcsTable->stateTable=(const int32_t (*)[256])(raw+sizeof(_MBCSHeader)); + mbcsTable->toUFallbacks=(const _MBCSToUFallback *)(mbcsTable->stateTable+header->countStates); + mbcsTable->unicodeCodeUnits=(const uint16_t *)(raw+header->offsetToUCodeUnits); + + mbcsTable->fromUnicodeTable=(const uint16_t *)(raw+header->offsetFromUTable); + mbcsTable->fromUnicodeBytes=(const uint8_t *)(raw+header->offsetFromUBytes); + mbcsTable->fromUBytesLength=header->fromUBytesLength; + + /* + * converter versions 6.1 and up contain a unicodeMask that is + * used here to select the most efficient function implementations + */ + info.size=sizeof(UDataInfo); + udata_getInfo((UDataMemory *)sharedData->dataMemory, &info); + if(info.formatVersion[0]>6 || (info.formatVersion[0]==6 && info.formatVersion[1]>=1)) { + /* mask off possible future extensions to be safe */ + mbcsTable->unicodeMask=(uint8_t)(sharedData->staticData->unicodeMask&3); + } else { + /* for older versions, assume worst case: contains anything possible (prevent over-optimizations) */ + mbcsTable->unicodeMask=UCNV_HAS_SUPPLEMENTARY|UCNV_HAS_SURROGATES; + } + } +} + +static void +ucnv_MBCSUnload(UConverterSharedData *sharedData) { + UConverterMBCSTable *mbcsTable=&sharedData->mbcs; + + if(mbcsTable->swapLFNLStateTable!=NULL) { + uprv_free(mbcsTable->swapLFNLStateTable); + } + if(mbcsTable->stateTableOwned) { + uprv_free((void *)mbcsTable->stateTable); + } + if(mbcsTable->baseSharedData!=NULL) { + ucnv_unload(mbcsTable->baseSharedData); + } +} + +static void +ucnv_MBCSOpen(UConverter *cnv, + const char *name, const char *locale, uint32_t options, UErrorCode *pErrorCode) { + UConverterMBCSTable *mbcsTable; + const int32_t *extIndexes; + uint8_t outputType; + int8_t maxBytesPerUChar; + + mbcsTable=&cnv->sharedData->mbcs; + outputType=mbcsTable->outputType; + + if(outputType==MBCS_OUTPUT_DBCS_ONLY) { + /* the swaplfnl option does not apply, remove it */ + cnv->options=options&=~UCNV_OPTION_SWAP_LFNL; + } + if((options&UCNV_OPTION_SWAP_LFNL)!=0) { /* do this because double-checked locking is broken */ UBool isCached; umtx_lock(NULL); - isCached=cnv->sharedData->table->mbcs.swapLFNLStateTable!=NULL; + isCached=mbcsTable->swapLFNLStateTable!=NULL; umtx_unlock(NULL); if(!isCached) { if(!_EBCDICSwapLFNL(cnv->sharedData, pErrorCode)) { + if(U_FAILURE(*pErrorCode)) { + return; /* something went wrong */ + } + /* the option does not apply, remove it */ - cnv->options&=~UCNV_OPTION_SWAP_LFNL; + cnv->options=options&=~UCNV_OPTION_SWAP_LFNL; } } } - if(uprv_strstr(name, "18030")!=NULL) { if(uprv_strstr(name, "gb18030")!=NULL || uprv_strstr(name, "GB18030")!=NULL) { /* set a flag for GB 18030 mode, which changes the callback behavior */ @@ -822,13 +1164,44 @@ _MBCSOpen(UConverter *cnv, } } - _MBCSReset(cnv, UCNV_RESET_BOTH); + /* fix maxBytesPerUChar depending on outputType and options etc. */ + if(outputType==MBCS_OUTPUT_2_SISO) { + cnv->maxBytesPerUChar=3; /* SO+DBCS */ + } + + extIndexes=mbcsTable->extIndexes; + if(extIndexes!=NULL) { + maxBytesPerUChar=(int8_t)UCNV_GET_MAX_BYTES_PER_UCHAR(extIndexes); + if(outputType==MBCS_OUTPUT_2_SISO) { + ++maxBytesPerUChar; /* SO + multiple DBCS */ + } + + if(maxBytesPerUChar>cnv->maxBytesPerUChar) { + cnv->maxBytesPerUChar=maxBytesPerUChar; + } + } + +#if 0 + /* + * documentation of UConverter fields used for status + * all of these fields are (re)set to 0 by ucnv_bld.c and ucnv_reset() + */ + + /* toUnicode */ + cnv->toUnicodeStatus=0; /* offset */ + cnv->mode=0; /* state */ + cnv->toULength=0; /* byteIndex */ + + /* fromUnicode */ + cnv->fromUChar32=0; + cnv->fromUnicodeStatus=1; /* prevLength */ +#endif } static const char * -_MBCSGetName(const UConverter *cnv) { - if((cnv->options&UCNV_OPTION_SWAP_LFNL)!=0 && cnv->sharedData->table->mbcs.swapLFNLName!=NULL) { - return cnv->sharedData->table->mbcs.swapLFNLName; +ucnv_MBCSGetName(const UConverter *cnv) { + if((cnv->options&UCNV_OPTION_SWAP_LFNL)!=0 && cnv->sharedData->mbcs.swapLFNLName!=NULL) { + return cnv->sharedData->mbcs.swapLFNLName; } else { return cnv->sharedData->staticData->name; } @@ -837,7 +1210,7 @@ _MBCSGetName(const UConverter *cnv) { /* MBCS-to-Unicode conversion functions ------------------------------------- */ static UChar32 -_MBCSGetFallback(UConverterMBCSTable *mbcsTable, uint32_t offset) { +ucnv_MBCSGetFallback(UConverterMBCSTable *mbcsTable, uint32_t offset) { const _MBCSToUFallback *toUFallbacks; uint32_t i, start, limit; @@ -864,9 +1237,10 @@ _MBCSGetFallback(UConverterMBCSTable *mbcsTable, uint32_t offset) { return 0xfffe; } -U_CFUNC void -_MBCSToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { +/* This version of ucnv_MBCSToUnicodeWithOffsets() is optimized for single-byte, single-state codepages. */ +static void +ucnv_MBCSSingleToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { UConverter *cnv; const uint8_t *source, *sourceLimit; UChar *target; @@ -874,32 +1248,15 @@ _MBCSToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, int32_t *offsets; const int32_t (*stateTable)[256]; - const uint16_t *unicodeCodeUnits; - - uint32_t offset; - uint8_t state; - int8_t byteIndex; - uint8_t *bytes; - int32_t sourceIndex, nextSourceIndex; + int32_t sourceIndex; int32_t entry; UChar c; uint8_t action; - UConverterCallbackReason reason; - - /* use optimized function if possible */ - cnv=pArgs->converter; - if(cnv->sharedData->table->mbcs.countStates==1) { - if(!(cnv->sharedData->table->mbcs.unicodeMask&UCNV_HAS_SUPPLEMENTARY)) { - _MBCSSingleToBMPWithOffsets(pArgs, pErrorCode); - } else { - _MBCSSingleToUnicodeWithOffsets(pArgs, pErrorCode); - } - return; - } /* set up the local pointers */ + cnv=pArgs->converter; source=(const uint8_t *)pArgs->source; sourceLimit=(const uint8_t *)pArgs->sourceLimit; target=pArgs->target; @@ -907,21 +1264,13 @@ _MBCSToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, offsets=pArgs->offsets; if((cnv->options&UCNV_OPTION_SWAP_LFNL)!=0) { - stateTable=(const int32_t (*)[256])cnv->sharedData->table->mbcs.swapLFNLStateTable; + stateTable=(const int32_t (*)[256])cnv->sharedData->mbcs.swapLFNLStateTable; } else { - stateTable=cnv->sharedData->table->mbcs.stateTable; + stateTable=cnv->sharedData->mbcs.stateTable; } - unicodeCodeUnits=cnv->sharedData->table->mbcs.unicodeCodeUnits; - - /* get the converter state from UConverter */ - offset=cnv->toUnicodeStatus; - state=(uint8_t)(cnv->mode); - byteIndex=cnv->toULength; - bytes=cnv->toUBytes; /* sourceIndex=-1 if the current character began in the previous buffer */ - sourceIndex=byteIndex==0 ? 0 : -1; - nextSourceIndex=0; + sourceIndex=0; /* conversion loop */ while(sourcesharedData->table->mbcs, offset))!=0xfffe) { - /* output fallback BMP code point */ - *target++=(UChar)entry; - if(offsets!=NULL) { - *offsets++=sourceIndex; - } - } else { - /* callback(unassigned) */ - goto unassigned; - } - } else { - /* callback(illegal) */ - goto illegal; - } - } else if(action==MBCS_STATE_VALID_DIRECT_16) { - /* output BMP code point */ - *target++=(UChar)MBCS_ENTRY_FINAL_VALUE_16(entry); - if(offsets!=NULL) { - *offsets++=sourceIndex; - } - } else if(action==MBCS_STATE_VALID_16_PAIR) { - offset+=MBCS_ENTRY_FINAL_VALUE_16(entry); - c=unicodeCodeUnits[offset++]; - if(c<0xd800) { - /* output BMP code point below 0xd800 */ - *target++=c; - if(offsets!=NULL) { - *offsets++=sourceIndex; - } - } else if(UCNV_TO_U_USE_FALLBACK(cnv) ? c<=0xdfff : c<=0xdbff) { - /* output roundtrip or fallback surrogate pair */ - *target++=(UChar)(c&0xdbff); - if(offsets!=NULL) { - *offsets++=sourceIndex; - } - if(targetUCharErrorBuffer[0]=unicodeCodeUnits[offset]; - cnv->UCharErrorBufferLength=1; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - - offset=0; - byteIndex=0; - break; - } - } else if(UCNV_TO_U_USE_FALLBACK(cnv) ? (c&0xfffe)==0xe000 : c==0xe000) { - /* output roundtrip BMP code point above 0xd800 or fallback BMP code point */ - *target++=unicodeCodeUnits[offset]; - if(offsets!=NULL) { - *offsets++=sourceIndex; - } - } else if(c==0xffff) { - /* callback(illegal) */ - goto illegal; - } else { - /* callback(unassigned) */ - goto unassigned; - } - } else if(action==MBCS_STATE_VALID_DIRECT_20) { -valid20: - entry=MBCS_ENTRY_FINAL_VALUE(entry); - /* output surrogate pair */ - *target++=(UChar)(0xd800|(UChar)(entry>>10)); - if(offsets!=NULL) { - *offsets++=sourceIndex; - } - c=(UChar)(0xdc00|(UChar)(entry&0x3ff)); - if(targetUCharErrorBuffer[0]=c; - cnv->UCharErrorBufferLength=1; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - - offset=0; - byteIndex=0; - break; - } - } else if(action==MBCS_STATE_CHANGE_ONLY) { - /* - * This serves as a state change without any output. - * It is useful for reading simple stateful encodings, - * for example using just Shift-In/Shift-Out codes. - * The 21 unused bits may later be used for more sophisticated - * state transitions. - */ - } else if(action==MBCS_STATE_FALLBACK_DIRECT_16) { - if(!UCNV_TO_U_USE_FALLBACK(cnv)) { - /* callback(unassigned) */ - goto unassigned; - } - /* output BMP code point */ - *target++=(UChar)MBCS_ENTRY_FINAL_VALUE_16(entry); - if(offsets!=NULL) { - *offsets++=sourceIndex; - } - } else if(action==MBCS_STATE_FALLBACK_DIRECT_20) { - if(!UCNV_TO_U_USE_FALLBACK(cnv)) { - /* callback(unassigned) */ - goto unassigned; - } - goto valid20; - } else if(action==MBCS_STATE_UNASSIGNED) { - /* callback(unassigned) */ - goto unassigned; - } else if(action==MBCS_STATE_ILLEGAL) { - /* callback(illegal) */ - goto illegal; - } else { - /* reserved, must never occur */ - } - - /* normal end of action codes: prepare for a new character */ - offset=0; - byteIndex=0; - sourceIndex=nextSourceIndex; - continue; - -illegal: - reason=UCNV_ILLEGAL; - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - goto callback; -unassigned: - reason=UCNV_UNASSIGNED; - *pErrorCode=U_INVALID_CHAR_FOUND; -callback: - /* call the callback function with all the preparations and post-processing */ - /* update the arguments structure */ - pArgs->source=(const char *)source; - pArgs->target=target; - pArgs->offsets=offsets; - - /* set the converter state in UConverter to deal with the next character */ - cnv->toUnicodeStatus=0; - cnv->mode=state; - cnv->toULength=0; + if(target>=targetLimit) { + /* target is full */ + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + break; + } - /* call the callback function */ - toUCallback(cnv, cnv->toUContext, pArgs, (const char *)bytes, byteIndex, reason, pErrorCode); + entry=stateTable[0][*source++]; + /* MBCS_ENTRY_IS_FINAL(entry) */ - /* get the converter state from UConverter */ - offset=cnv->toUnicodeStatus; - state=(uint8_t)cnv->mode; - byteIndex=cnv->toULength; + /* test the most common case first */ + if(MBCS_ENTRY_FINAL_IS_VALID_DIRECT_16(entry)) { + /* output BMP code point */ + *target++=(UChar)MBCS_ENTRY_FINAL_VALUE_16(entry); + if(offsets!=NULL) { + *offsets++=sourceIndex; + } - /* update target and deal with offsets if necessary */ - offsets=ucnv_updateCallbackOffsets(offsets, pArgs->target-target, sourceIndex); - target=pArgs->target; + /* normal end of action codes: prepare for a new character */ + ++sourceIndex; + continue; + } - /* update the source pointer and index */ - sourceIndex=nextSourceIndex+((const uint8_t *)pArgs->source-source); - source=(const uint8_t *)pArgs->source; + /* + * An if-else-if chain provides more reliable performance for + * the most common cases compared to a switch. + */ + action=(uint8_t)(MBCS_ENTRY_FINAL_ACTION(entry)); + if(action==MBCS_STATE_VALID_DIRECT_20 || + (action==MBCS_STATE_FALLBACK_DIRECT_20 && UCNV_TO_U_USE_FALLBACK(cnv)) + ) { + entry=MBCS_ENTRY_FINAL_VALUE(entry); + /* output surrogate pair */ + *target++=(UChar)(0xd800|(UChar)(entry>>10)); + if(offsets!=NULL) { + *offsets++=sourceIndex; + } + c=(UChar)(0xdc00|(UChar)(entry&0x3ff)); + if(targetUCharErrorBuffer[0]=c; + cnv->UCharErrorBufferLength=1; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + break; + } - /* - * If the callback overflowed the target, then we need to - * stop here with an overflow indication. - */ - if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR) { - break; - } else if(U_FAILURE(*pErrorCode)) { - /* break on error */ - offset=0; - state=0; - byteIndex=0; - break; - } else if(cnv->UCharErrorBufferLength>0) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - break; + ++sourceIndex; + continue; + } else if(action==MBCS_STATE_FALLBACK_DIRECT_16) { + if(UCNV_TO_U_USE_FALLBACK(cnv)) { + /* output BMP code point */ + *target++=(UChar)MBCS_ENTRY_FINAL_VALUE_16(entry); + if(offsets!=NULL) { + *offsets++=sourceIndex; } - /* - * We do not need to repeat the statements from the normal - * end of the action codes because we already updated all the - * necessary variables. - */ + ++sourceIndex; + continue; } + } else if(action==MBCS_STATE_UNASSIGNED) { + /* just fall through */ + } else if(action==MBCS_STATE_ILLEGAL) { + /* callback(illegal) */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; } else { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - break; + /* reserved, must never occur */ + ++sourceIndex; + continue; } - } - if(pArgs->flush && source>=sourceLimit) { - /* reset the state for the next conversion */ - if(byteIndex>0 && U_SUCCESS(*pErrorCode)) { - /* a character byte sequence remains incomplete */ - *pErrorCode=U_TRUNCATED_CHAR_FOUND; + if(U_FAILURE(*pErrorCode)) { + /* callback(illegal) */ + break; + } else /* unassigned sequences indicated with byteIndex>0 */ { + /* try an extension mapping */ + pArgs->source=(const char *)source; + cnv->toUBytes[0]=*(source-1); + cnv->toULength=_extToU(cnv, cnv->sharedData, + 1, (const char **)&source, (const char *)sourceLimit, + &target, targetLimit, + &offsets, sourceIndex, + pArgs->flush, + pErrorCode); + sourceIndex+=1+(int32_t)(source-(const uint8_t *)pArgs->source); + + if(U_FAILURE(*pErrorCode)) { + /* not mappable or buffer overflow */ + break; + } } - cnv->toUnicodeStatus=0; - cnv->mode=0; - cnv->toULength=0; - } else { - /* set the converter state back into UConverter */ - cnv->toUnicodeStatus=offset; - cnv->mode=state; - cnv->toULength=byteIndex; } /* write back the updated pointers */ @@ -1173,223 +1384,45 @@ callback: pArgs->offsets=offsets; } -/* This version of _MBCSToUnicodeWithOffsets() is optimized for single-byte, single-state codepages. */ +/* + * This version of ucnv_MBCSSingleToUnicodeWithOffsets() is optimized for single-byte, single-state codepages + * that only map to and from the BMP. + * In addition to single-byte optimizations, the offset calculations + * become much easier. + */ static void -_MBCSSingleToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { +ucnv_MBCSSingleToBMPWithOffsets(UConverterToUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { UConverter *cnv; - const uint8_t *source, *sourceLimit; + const uint8_t *source, *sourceLimit, *lastSource; UChar *target; - const UChar *targetLimit; + int32_t targetCapacity, length; int32_t *offsets; const int32_t (*stateTable)[256]; - int32_t sourceIndex, nextSourceIndex; + int32_t sourceIndex; int32_t entry; - UChar c; uint8_t action; - UConverterCallbackReason reason; /* set up the local pointers */ cnv=pArgs->converter; source=(const uint8_t *)pArgs->source; sourceLimit=(const uint8_t *)pArgs->sourceLimit; target=pArgs->target; - targetLimit=pArgs->targetLimit; + targetCapacity=pArgs->targetLimit-pArgs->target; offsets=pArgs->offsets; if((cnv->options&UCNV_OPTION_SWAP_LFNL)!=0) { - stateTable=(const int32_t (*)[256])cnv->sharedData->table->mbcs.swapLFNLStateTable; + stateTable=(const int32_t (*)[256])cnv->sharedData->mbcs.swapLFNLStateTable; } else { - stateTable=cnv->sharedData->table->mbcs.stateTable; + stateTable=cnv->sharedData->mbcs.stateTable; } /* sourceIndex=-1 if the current character began in the previous buffer */ sourceIndex=0; - nextSourceIndex=0; - - /* conversion loop */ - while(source>10)); - if(offsets!=NULL) { - *offsets++=sourceIndex; - } - c=(UChar)(0xdc00|(UChar)(entry&0x3ff)); - if(targetUCharErrorBuffer[0]=c; - cnv->UCharErrorBufferLength=1; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - break; - } - } else if(action==MBCS_STATE_FALLBACK_DIRECT_16) { - if(!UCNV_TO_U_USE_FALLBACK(cnv)) { - /* callback(unassigned) */ - goto unassigned; - } - /* output BMP code point */ - *target++=(UChar)MBCS_ENTRY_FINAL_VALUE_16(entry); - if(offsets!=NULL) { - *offsets++=sourceIndex; - } - } else if(action==MBCS_STATE_FALLBACK_DIRECT_20) { - if(!UCNV_TO_U_USE_FALLBACK(cnv)) { - /* callback(unassigned) */ - goto unassigned; - } - goto valid20; - } else if(action==MBCS_STATE_UNASSIGNED) { - /* callback(unassigned) */ - goto unassigned; - } else if(action==MBCS_STATE_ILLEGAL) { - /* callback(illegal) */ - reason=UCNV_ILLEGAL; - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - goto callback; - } else { - /* reserved, must never occur */ - } - - /* normal end of action codes: prepare for a new character */ - sourceIndex=nextSourceIndex; - continue; - -unassigned: - reason=UCNV_UNASSIGNED; - *pErrorCode=U_INVALID_CHAR_FOUND; -callback: - /* call the callback function with all the preparations and post-processing */ - /* update the arguments structure */ - pArgs->source=(const char *)source; - pArgs->target=target; - pArgs->offsets=offsets; - - /* call the callback function */ - toUCallback(cnv, cnv->toUContext, pArgs, (const char *)(source-1), 1, reason, pErrorCode); - - /* update target and deal with offsets if necessary */ - offsets=ucnv_updateCallbackOffsets(offsets, pArgs->target-target, sourceIndex); - target=pArgs->target; - - /* update the source pointer and index */ - sourceIndex=nextSourceIndex+((const uint8_t *)pArgs->source-source); - source=(const uint8_t *)pArgs->source; - - /* - * If the callback overflowed the target, then we need to - * stop here with an overflow indication. - */ - if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR) { - break; - } else if(U_FAILURE(*pErrorCode)) { - /* break on error */ - break; - } else if(cnv->UCharErrorBufferLength>0) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - break; - } - - /* - * We do not need to repeat the statements from the normal - * end of the action codes because we already updated all the - * necessary variables. - */ - } else { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - break; - } - } - - /* write back the updated pointers */ - pArgs->source=(const char *)source; - pArgs->target=target; - pArgs->offsets=offsets; -} - -/* - * This version of _MBCSSingleToUnicodeWithOffsets() is optimized for single-byte, single-state codepages - * that only map to and from the BMP. - * In addition to single-byte optimizations, the offset calculations - * become much easier. - */ -static void -_MBCSSingleToBMPWithOffsets(UConverterToUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - UConverter *cnv; - const uint8_t *source, *sourceLimit, *lastSource; - UChar *target; - int32_t targetCapacity, length; - int32_t *offsets; - - const int32_t (*stateTable)[256]; - - int32_t sourceIndex; - - int32_t entry; - uint8_t action; - UConverterCallbackReason reason; - - /* set up the local pointers */ - cnv=pArgs->converter; - source=(const uint8_t *)pArgs->source; - sourceLimit=(const uint8_t *)pArgs->sourceLimit; - target=pArgs->target; - targetCapacity=pArgs->targetLimit-pArgs->target; - offsets=pArgs->offsets; - - if((cnv->options&UCNV_OPTION_SWAP_LFNL)!=0) { - stateTable=(const int32_t (*)[256])cnv->sharedData->table->mbcs.swapLFNLStateTable; - } else { - stateTable=cnv->sharedData->table->mbcs.stateTable; - } - - /* sourceIndex=-1 if the current character began in the previous buffer */ - sourceIndex=0; - lastSource=source; + lastSource=source; /* * since the conversion here is 1:1 UChar:uint8_t, we need only one counter @@ -1497,30 +1530,23 @@ unrolled: */ action=(uint8_t)(MBCS_ENTRY_FINAL_ACTION(entry)); if(action==MBCS_STATE_FALLBACK_DIRECT_16) { - if(!UCNV_TO_U_USE_FALLBACK(cnv)) { - /* callback(unassigned) */ - reason=UCNV_UNASSIGNED; - *pErrorCode=U_INVALID_CHAR_FOUND; + if(UCNV_TO_U_USE_FALLBACK(cnv)) { + /* output BMP code point */ + *target++=(UChar)MBCS_ENTRY_FINAL_VALUE_16(entry); + --targetCapacity; + continue; } - /* output BMP code point */ - *target++=(UChar)MBCS_ENTRY_FINAL_VALUE_16(entry); - --targetCapacity; - continue; } else if(action==MBCS_STATE_UNASSIGNED) { - /* callback(unassigned) */ - reason=UCNV_UNASSIGNED; - *pErrorCode=U_INVALID_CHAR_FOUND; + /* just fall through */ } else if(action==MBCS_STATE_ILLEGAL) { /* callback(illegal) */ - reason=UCNV_ILLEGAL; *pErrorCode=U_ILLEGAL_CHAR_FOUND; } else { /* reserved, must never occur */ continue; } - /* call the callback function with all the preparations and post-processing */ - /* set offsets since the start or the last callback */ + /* set offsets since the start or the last extension */ if(offsets!=NULL) { int32_t count=(int32_t)(source-lastSource); @@ -1531,40 +1557,32 @@ unrolled: /* offset and sourceIndex are now set for the current character */ } - /* update the arguments structure */ - pArgs->source=(const char *)source; - pArgs->target=target; - pArgs->offsets=offsets; - - /* call the callback function */ - toUCallback(cnv, cnv->toUContext, pArgs, (const char *)(source-1), 1, reason, pErrorCode); - - /* update target and deal with offsets if necessary */ - offsets=ucnv_updateCallbackOffsets(offsets, pArgs->target-target, sourceIndex); - target=pArgs->target; - - /* update the source pointer and index */ - sourceIndex+=1+((const uint8_t *)pArgs->source-source); - source=lastSource=(const uint8_t *)pArgs->source; - targetCapacity=pArgs->targetLimit-target; - length=sourceLimit-source; - if(lengthUCharErrorBufferLength>0) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + if(U_FAILURE(*pErrorCode)) { + /* callback(illegal) */ break; + } else /* unassigned sequences indicated with byteIndex>0 */ { + /* try an extension mapping */ + lastSource=source; + cnv->toUBytes[0]=*(source-1); + cnv->toULength=_extToU(cnv, cnv->sharedData, + 1, (const char **)&source, (const char *)sourceLimit, + &target, target+targetCapacity, + &offsets, sourceIndex, + pArgs->flush, + pErrorCode); + sourceIndex+=1+(int32_t)(source-lastSource); + + if(U_FAILURE(*pErrorCode)) { + /* not mappable or buffer overflow */ + break; + } + + /* recalculate the targetCapacity after an extension mapping */ + targetCapacity=pArgs->targetLimit-target; + length=sourceLimit-source; + if(lengthoffsets=offsets; } -static UChar32 -_MBCSGetNextUChar(UConverterToUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - UChar buffer[UTF_MAX_CHAR_LENGTH]; - +U_CFUNC void +ucnv_MBCSToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { UConverter *cnv; const uint8_t *source, *sourceLimit; + UChar *target; + const UChar *targetLimit; + int32_t *offsets; const int32_t (*stateTable)[256]; const uint16_t *unicodeCodeUnits; @@ -1609,245 +1628,396 @@ _MBCSGetNextUChar(UConverterToUnicodeArgs *pArgs, int8_t byteIndex; uint8_t *bytes; + int32_t sourceIndex, nextSourceIndex; + int32_t entry; - UChar32 c; + UChar c; uint8_t action; - UConverterCallbackReason reason; /* use optimized function if possible */ cnv=pArgs->converter; - if(cnv->sharedData->table->mbcs.unicodeMask&UCNV_HAS_SURROGATES) { + + if(cnv->preToULength>0) { /* - * Calling the inefficient, generic getNextUChar() lets us deal correctly - * with the rare case of a codepage that maps single surrogates - * without adding the complexity to this already complicated function here. + * pass sourceIndex=-1 because we continue from an earlier buffer + * in the future, this may change with continuous offsets */ - return ucnv_getNextUCharFromToUImpl(pArgs, _MBCSToUnicodeWithOffsets, TRUE, pErrorCode); - } else if(cnv->sharedData->table->mbcs.countStates==1) { - return _MBCSSingleGetNextUChar(pArgs, pErrorCode); + ucnv_extContinueMatchToU(cnv, pArgs, -1, pErrorCode); + + if(U_FAILURE(*pErrorCode) || cnv->preToULength<0) { + return; + } + } + + if(cnv->sharedData->mbcs.countStates==1) { + if(!(cnv->sharedData->mbcs.unicodeMask&UCNV_HAS_SUPPLEMENTARY)) { + ucnv_MBCSSingleToBMPWithOffsets(pArgs, pErrorCode); + } else { + ucnv_MBCSSingleToUnicodeWithOffsets(pArgs, pErrorCode); + } + return; } /* set up the local pointers */ source=(const uint8_t *)pArgs->source; sourceLimit=(const uint8_t *)pArgs->sourceLimit; + target=pArgs->target; + targetLimit=pArgs->targetLimit; + offsets=pArgs->offsets; if((cnv->options&UCNV_OPTION_SWAP_LFNL)!=0) { - stateTable=(const int32_t (*)[256])cnv->sharedData->table->mbcs.swapLFNLStateTable; + stateTable=(const int32_t (*)[256])cnv->sharedData->mbcs.swapLFNLStateTable; } else { - stateTable=cnv->sharedData->table->mbcs.stateTable; + stateTable=cnv->sharedData->mbcs.stateTable; } - unicodeCodeUnits=cnv->sharedData->table->mbcs.unicodeCodeUnits; + unicodeCodeUnits=cnv->sharedData->mbcs.unicodeCodeUnits; /* get the converter state from UConverter */ offset=cnv->toUnicodeStatus; - state=(uint8_t)(cnv->mode); byteIndex=cnv->toULength; bytes=cnv->toUBytes; + /* + * if we are in the SBCS state for a DBCS-only converter, + * then load the DBCS state from the MBCS data + * (dbcsOnlyState==0 if it is not a DBCS-only converter) + */ + if((state=(uint8_t)(cnv->mode))==0) { + state=cnv->sharedData->mbcs.dbcsOnlyState; + } + + /* sourceIndex=-1 if the current character began in the previous buffer */ + sourceIndex=byteIndex==0 ? 0 : -1; + nextSourceIndex=0; + /* conversion loop */ while(source=targetLimit) { + /* target is full */ + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + break; + } + + if(byteIndex==0) { + /* optimized loop for 1/2-byte input and BMP output */ + if(offsets==NULL) { + do { + entry=stateTable[state][*source]; + if(MBCS_ENTRY_IS_TRANSITION(entry)) { + state=(uint8_t)MBCS_ENTRY_TRANSITION_STATE(entry); + offset=MBCS_ENTRY_TRANSITION_OFFSET(entry); + + ++source; + if( source=sourceLimit) { + break; + } + if(target>=targetLimit) { + /* target is full */ + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + break; + } + + ++nextSourceIndex; + bytes[byteIndex++]=*source++; + } else /* byteIndex>0 */ { + ++nextSourceIndex; + entry=stateTable[state][bytes[byteIndex++]=*source++]; + } + if(MBCS_ENTRY_IS_TRANSITION(entry)) { state=(uint8_t)MBCS_ENTRY_TRANSITION_STATE(entry); offset+=MBCS_ENTRY_TRANSITION_OFFSET(entry); - } else { - /* set the next state early so that we can reuse the entry variable */ - state=(uint8_t)MBCS_ENTRY_FINAL_STATE(entry); /* typically 0 */ + continue; + } - /* - * An if-else-if chain provides more reliable performance for - * the most common cases compared to a switch. - */ - action=(uint8_t)(MBCS_ENTRY_FINAL_ACTION(entry)); - if(action==MBCS_STATE_VALID_16) { - offset+=MBCS_ENTRY_FINAL_VALUE_16(entry); - c=unicodeCodeUnits[offset]; - if(c<0xfffe) { - /* output BMP code point */ - goto finish; - } else if(c==0xfffe) { - if(UCNV_TO_U_USE_FALLBACK(cnv) && (c=_MBCSGetFallback(&cnv->sharedData->table->mbcs, offset))!=0xfffe) { - goto finish; + /* save the previous state for proper extension mapping with SI/SO-stateful converters */ + cnv->mode=state; + + /* set the next state early so that we can reuse the entry variable */ + state=(uint8_t)MBCS_ENTRY_FINAL_STATE(entry); /* typically 0 */ + + /* + * An if-else-if chain provides more reliable performance for + * the most common cases compared to a switch. + */ + action=(uint8_t)(MBCS_ENTRY_FINAL_ACTION(entry)); + if(action==MBCS_STATE_VALID_16) { + offset+=MBCS_ENTRY_FINAL_VALUE_16(entry); + c=unicodeCodeUnits[offset]; + if(c<0xfffe) { + /* output BMP code point */ + *target++=c; + if(offsets!=NULL) { + *offsets++=sourceIndex; + } + byteIndex=0; + } else if(c==0xfffe) { + if(UCNV_TO_U_USE_FALLBACK(cnv) && (entry=(int32_t)ucnv_MBCSGetFallback(&cnv->sharedData->mbcs, offset))!=0xfffe) { + /* output fallback BMP code point */ + *target++=(UChar)entry; + if(offsets!=NULL) { + *offsets++=sourceIndex; } - /* callback(unassigned) */ - goto unassigned; - } else { - /* callback(illegal) */ - goto illegal; + byteIndex=0; } - } else if(action==MBCS_STATE_VALID_DIRECT_16) { - /* output BMP code point */ - c=(UChar)MBCS_ENTRY_FINAL_VALUE_16(entry); - goto finish; - } else if(action==MBCS_STATE_VALID_16_PAIR) { - offset+=MBCS_ENTRY_FINAL_VALUE_16(entry); - c=unicodeCodeUnits[offset++]; - if(c<0xd800) { - /* output BMP code point below 0xd800 */ - goto finish; - } else if(UCNV_TO_U_USE_FALLBACK(cnv) ? c<=0xdfff : c<=0xdbff) { - /* output roundtrip or fallback supplementary code point */ - c=((c&0x3ff)<<10)+unicodeCodeUnits[offset]+(0x10000-0xdc00); - goto finish; - } else if(UCNV_TO_U_USE_FALLBACK(cnv) ? (c&0xfffe)==0xe000 : c==0xe000) { - /* output roundtrip BMP code point above 0xd800 or fallback BMP code point */ - c=unicodeCodeUnits[offset]; - goto finish; - } else if(c==0xffff) { - /* callback(illegal) */ - goto illegal; - } else { - /* callback(unassigned) */ - goto unassigned; + } else { + /* callback(illegal) */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + } + } else if(action==MBCS_STATE_VALID_DIRECT_16) { + /* output BMP code point */ + *target++=(UChar)MBCS_ENTRY_FINAL_VALUE_16(entry); + if(offsets!=NULL) { + *offsets++=sourceIndex; + } + byteIndex=0; + } else if(action==MBCS_STATE_VALID_16_PAIR) { + offset+=MBCS_ENTRY_FINAL_VALUE_16(entry); + c=unicodeCodeUnits[offset++]; + if(c<0xd800) { + /* output BMP code point below 0xd800 */ + *target++=c; + if(offsets!=NULL) { + *offsets++=sourceIndex; } - } else if(action==MBCS_STATE_VALID_DIRECT_20) { - /* output supplementary code point */ - c=(UChar32)(MBCS_ENTRY_FINAL_VALUE(entry)+0x10000); - goto finish; - } else if(action==MBCS_STATE_CHANGE_ONLY) { - /* - * This serves as a state change without any output. - * It is useful for reading simple stateful encodings, - * for example using just Shift-In/Shift-Out codes. - * The 21 unused bits may later be used for more sophisticated - * state transitions. - */ - } else if(action==MBCS_STATE_FALLBACK_DIRECT_16) { - if(!UCNV_TO_U_USE_FALLBACK(cnv)) { - /* callback(unassigned) */ - goto unassigned; + byteIndex=0; + } else if(UCNV_TO_U_USE_FALLBACK(cnv) ? c<=0xdfff : c<=0xdbff) { + /* output roundtrip or fallback surrogate pair */ + *target++=(UChar)(c&0xdbff); + if(offsets!=NULL) { + *offsets++=sourceIndex; } - /* output BMP code point */ - c=(UChar)MBCS_ENTRY_FINAL_VALUE_16(entry); - goto finish; - } else if(action==MBCS_STATE_FALLBACK_DIRECT_20) { - if(!UCNV_TO_U_USE_FALLBACK(cnv)) { - /* callback(unassigned) */ - goto unassigned; + byteIndex=0; + if(targetUCharErrorBuffer[0]=unicodeCodeUnits[offset]; + cnv->UCharErrorBufferLength=1; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + + offset=0; + break; } - /* output supplementary code point */ - c=(UChar32)(MBCS_ENTRY_FINAL_VALUE(entry)+0x10000); - goto finish; - } else if(action==MBCS_STATE_UNASSIGNED) { - /* callback(unassigned) */ - goto unassigned; - } else if(action==MBCS_STATE_ILLEGAL) { + } else if(UCNV_TO_U_USE_FALLBACK(cnv) ? (c&0xfffe)==0xe000 : c==0xe000) { + /* output roundtrip BMP code point above 0xd800 or fallback BMP code point */ + *target++=unicodeCodeUnits[offset]; + if(offsets!=NULL) { + *offsets++=sourceIndex; + } + byteIndex=0; + } else if(c==0xffff) { /* callback(illegal) */ - goto illegal; - } else { - /* reserved, must never occur */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + } + } else if(action==MBCS_STATE_VALID_DIRECT_20 || + (action==MBCS_STATE_FALLBACK_DIRECT_20 && UCNV_TO_U_USE_FALLBACK(cnv)) + ) { + entry=MBCS_ENTRY_FINAL_VALUE(entry); + /* output surrogate pair */ + *target++=(UChar)(0xd800|(UChar)(entry>>10)); + if(offsets!=NULL) { + *offsets++=sourceIndex; } - - /* normal end of action codes: prepare for a new character */ - offset=0; byteIndex=0; - continue; - -illegal: - reason=UCNV_ILLEGAL; - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - goto callback; -unassigned: - reason=UCNV_UNASSIGNED; - *pErrorCode=U_INVALID_CHAR_FOUND; -callback: - /* call the callback function with all the preparations and post-processing */ - /* update the arguments structure */ - pArgs->source=(const char *)source; - pArgs->target=buffer; - pArgs->targetLimit=buffer+UTF_MAX_CHAR_LENGTH; - - /* set the converter state in UConverter to deal with the next character */ - cnv->toUnicodeStatus=0; - cnv->mode=state; - cnv->toULength=0; - - /* call the callback function */ - toUCallback(cnv, cnv->toUContext, pArgs, (const char *)bytes, byteIndex, reason, pErrorCode); - - /* get the converter state from UConverter */ - offset=cnv->toUnicodeStatus; - state=(uint8_t)cnv->mode; - byteIndex=cnv->toULength; - - /* update the source pointer */ - source=(const uint8_t *)pArgs->source; - - /* - * return the first character if the callback wrote some - * we do not need to goto finish because the converter state is already set - */ - if(U_SUCCESS(*pErrorCode)) { - entry=pArgs->target-buffer; - if(entry>0) { - return ucnv_getUChar32KeepOverflow(cnv, buffer, entry); + c=(UChar)(0xdc00|(UChar)(entry&0x3ff)); + if(targetUCharErrorBuffer[0]=c; + cnv->UCharErrorBufferLength=1; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + offset=0; + break; + } + } else if(action==MBCS_STATE_CHANGE_ONLY) { /* - * We do not need to repeat the statements from the normal - * end of the action codes because we already updated all the - * necessary variables. + * This serves as a state change without any output. + * It is useful for reading simple stateful encodings, + * for example using just Shift-In/Shift-Out codes. + * The 21 unused bits may later be used for more sophisticated + * state transitions. */ + if(cnv->sharedData->mbcs.dbcsOnlyState==0) { + byteIndex=0; + } else { + /* SI/SO are illegal for DBCS-only conversion */ + state=(uint8_t)(cnv->mode); /* restore the previous state */ + + /* callback(illegal) */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + } + } else if(action==MBCS_STATE_FALLBACK_DIRECT_16) { + if(UCNV_TO_U_USE_FALLBACK(cnv)) { + /* output BMP code point */ + *target++=(UChar)MBCS_ENTRY_FINAL_VALUE_16(entry); + if(offsets!=NULL) { + *offsets++=sourceIndex; + } + byteIndex=0; + } + } else if(action==MBCS_STATE_UNASSIGNED) { + /* just fall through */ + } else if(action==MBCS_STATE_ILLEGAL) { + /* callback(illegal) */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + } else { + /* reserved, must never occur */ + byteIndex=0; } - } - if(byteIndex>0) { - /* incomplete character byte sequence */ - *pErrorCode=U_TRUNCATED_CHAR_FOUND; - state=0; - } else { - /* no output because of empty input or only state changes and skipping callbacks */ - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + /* end of action codes: prepare for a new character */ + offset=0; + + if(byteIndex==0) { + sourceIndex=nextSourceIndex; + } else if(U_FAILURE(*pErrorCode)) { + /* callback(illegal) */ + break; + } else /* unassigned sequences indicated with byteIndex>0 */ { + /* try an extension mapping */ + pArgs->source=(const char *)source; + byteIndex=_extToU(cnv, cnv->sharedData, + byteIndex, (const char **)&source, (const char *)sourceLimit, + &target, targetLimit, + &offsets, sourceIndex, + pArgs->flush, + pErrorCode); + sourceIndex=nextSourceIndex+(int32_t)(source-(const uint8_t *)pArgs->source); + + if(U_FAILURE(*pErrorCode)) { + /* not mappable or buffer overflow */ + break; + } + } } - c=0xffff; -finish: - /* set the converter state back into UConverter, ready for a new character */ - cnv->toUnicodeStatus=0; + /* set the converter state back into UConverter */ + cnv->toUnicodeStatus=offset; cnv->mode=state; - cnv->toULength=0; + cnv->toULength=byteIndex; - /* write back the updated pointer */ + /* write back the updated pointers */ pArgs->source=(const char *)source; - return c; + pArgs->target=target; + pArgs->offsets=offsets; } /* - * This version of _MBCSGetNextUChar() is optimized for single-byte, single-state codepages. - * We still need a conversion loop in case a skipping callback is called. + * This version of ucnv_MBCSGetNextUChar() is optimized for single-byte, single-state codepages. + * We still need a conversion loop in case we find reserved action codes, which are to be ignored. */ static UChar32 -_MBCSSingleGetNextUChar(UConverterToUnicodeArgs *pArgs, +ucnv_MBCSSingleGetNextUChar(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode) { - UChar buffer[UTF_MAX_CHAR_LENGTH]; - UConverter *cnv; const int32_t (*stateTable)[256]; const uint8_t *source, *sourceLimit; int32_t entry; uint8_t action; - UConverterCallbackReason reason; /* set up the local pointers */ cnv=pArgs->converter; source=(const uint8_t *)pArgs->source; sourceLimit=(const uint8_t *)pArgs->sourceLimit; if((cnv->options&UCNV_OPTION_SWAP_LFNL)!=0) { - stateTable=(const int32_t (*)[256])cnv->sharedData->table->mbcs.swapLFNLStateTable; + stateTable=(const int32_t (*)[256])cnv->sharedData->mbcs.swapLFNLStateTable; } else { - stateTable=cnv->sharedData->table->mbcs.stateTable; + stateTable=cnv->sharedData->mbcs.stateTable; } /* conversion loop */ @@ -1868,188 +2038,184 @@ _MBCSSingleGetNextUChar(UConverterToUnicodeArgs *pArgs, * the most common cases compared to a switch. */ action=(uint8_t)(MBCS_ENTRY_FINAL_ACTION(entry)); - if(action==MBCS_STATE_VALID_DIRECT_20) { + if( action==MBCS_STATE_VALID_DIRECT_20 || + (action==MBCS_STATE_FALLBACK_DIRECT_20 && UCNV_TO_U_USE_FALLBACK(cnv)) + ) { /* output supplementary code point */ return (UChar32)(MBCS_ENTRY_FINAL_VALUE(entry)+0x10000); } else if(action==MBCS_STATE_FALLBACK_DIRECT_16) { - if(!UCNV_TO_U_USE_FALLBACK(cnv)) { - /* callback(unassigned) */ - reason=UCNV_UNASSIGNED; - *pErrorCode=U_INVALID_CHAR_FOUND; - } else { + if(UCNV_TO_U_USE_FALLBACK(cnv)) { /* output BMP code point */ return (UChar)MBCS_ENTRY_FINAL_VALUE_16(entry); } - } else if(action==MBCS_STATE_FALLBACK_DIRECT_20) { - if(!UCNV_TO_U_USE_FALLBACK(cnv)) { - /* callback(unassigned) */ - reason=UCNV_UNASSIGNED; - *pErrorCode=U_INVALID_CHAR_FOUND; - } else { - /* output supplementary code point */ - return (UChar32)(MBCS_ENTRY_FINAL_VALUE(entry)+0x10000); - } } else if(action==MBCS_STATE_UNASSIGNED) { - /* callback(unassigned) */ - reason=UCNV_UNASSIGNED; - *pErrorCode=U_INVALID_CHAR_FOUND; + /* just fall through */ } else if(action==MBCS_STATE_ILLEGAL) { /* callback(illegal) */ - reason=UCNV_ILLEGAL; *pErrorCode=U_ILLEGAL_CHAR_FOUND; } else { /* reserved, must never occur */ - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0xffff; + continue; } - /* call the callback function with all the preparations and post-processing */ - /* update the arguments structure */ - pArgs->target=buffer; - pArgs->targetLimit=buffer+UTF_MAX_CHAR_LENGTH; - - /* call the callback function */ - toUCallback(cnv, cnv->toUContext, pArgs, (const char *)(source-1), 1, reason, pErrorCode); - - /* update the source pointer */ - source=(const uint8_t *)pArgs->source; - - /* - * return the first character if the callback wrote some - * we do not need to goto finish because the converter state is already set - */ - if(U_SUCCESS(*pErrorCode)) { - entry=pArgs->target-buffer; - if(entry>0) { - return ucnv_getUChar32KeepOverflow(cnv, buffer, entry); - } - /* else (callback did not write anything) continue */ - } else if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR) { - *pErrorCode=U_ZERO_ERROR; - return ucnv_getUChar32KeepOverflow(cnv, buffer, UTF_MAX_CHAR_LENGTH); - } else { - /* break on error */ - /* ### what if a callback set an error but _also_ generated output?! */ - return 0xffff; + if(U_FAILURE(*pErrorCode)) { + /* callback(illegal) */ + break; + } else /* unassigned sequence */ { + /* defer to the generic implementation */ + pArgs->source=(const char *)source-1; + return UCNV_GET_NEXT_UCHAR_USE_TO_U; } } - /* no output because of empty input or only state changes and skipping callbacks */ + /* no output because of empty input or only state changes */ *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; return 0xffff; } /* - * This is a simple version of getNextUChar() that is used - * by other converter implementations. - * It does not use state from the converter, nor error codes. - * It does not handle the EBCDIC swaplfnl option (set in UConverter). + * Version of _MBCSToUnicodeWithOffsets() optimized for single-character + * conversion without offset handling. * - * Return value: - * U+fffe unassigned - * U+ffff illegal - * otherwise the Unicode code point + * When a character does not have a mapping to Unicode, then we return to the + * generic ucnv_getNextUChar() code for extension/GB 18030 and error/callback + * handling. + * We also defer to the generic code in other complicated cases and have them + * ultimately handled by _MBCSToUnicodeWithOffsets() itself. + * + * All normal mappings and errors are handled here. */ -U_CFUNC UChar32 -_MBCSSimpleGetNextUChar(UConverterSharedData *sharedData, - const char **pSource, const char *sourceLimit, - UBool useFallback) { - const uint8_t *source; +static UChar32 +ucnv_MBCSGetNextUChar(UConverterToUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { + UConverter *cnv; + const uint8_t *source, *sourceLimit, *lastSource; const int32_t (*stateTable)[256]; const uint16_t *unicodeCodeUnits; uint32_t offset; - uint8_t state, action; + uint8_t state; int32_t entry; + UChar32 c; + uint8_t action; - /* set up the local pointers */ - source=(const uint8_t *)*pSource; - if(source>=(const uint8_t *)sourceLimit) { - /* no input at all: "illegal" */ - return 0xffff; + /* use optimized function if possible */ + cnv=pArgs->converter; + + if(cnv->preToULength>0) { + /* use the generic code in ucnv_getNextUChar() to continue with a partial match */ + return UCNV_GET_NEXT_UCHAR_USE_TO_U; } -#if 0 -/* - * Code disabled 2002dec09 (ICU 2.4) because it is not currently used in ICU. markus - * TODO In future releases, verify that this function is never called for SBCS - * conversions, i.e., that sharedData->table->mbcs.countStates==1 is still true. - * Removal improves code coverage. - */ - /* use optimized function if possible */ - if(sharedData->table->mbcs.countStates==1) { - return _MBCSSingleSimpleGetNextUChar(sharedData, (uint8_t)(*(*pSource)++), useFallback); + if(cnv->sharedData->mbcs.unicodeMask&UCNV_HAS_SURROGATES) { + /* + * Using the generic ucnv_getNextUChar() code lets us deal correctly + * with the rare case of a codepage that maps single surrogates + * without adding the complexity to this already complicated function here. + */ + return UCNV_GET_NEXT_UCHAR_USE_TO_U; + } else if(cnv->sharedData->mbcs.countStates==1) { + return ucnv_MBCSSingleGetNextUChar(pArgs, pErrorCode); } -#endif - stateTable=sharedData->table->mbcs.stateTable; - unicodeCodeUnits=sharedData->table->mbcs.unicodeCodeUnits; + /* set up the local pointers */ + source=lastSource=(const uint8_t *)pArgs->source; + sourceLimit=(const uint8_t *)pArgs->sourceLimit; - /* converter state */ - offset=0; - state=0; + if((cnv->options&UCNV_OPTION_SWAP_LFNL)!=0) { + stateTable=(const int32_t (*)[256])cnv->sharedData->mbcs.swapLFNLStateTable; + } else { + stateTable=cnv->sharedData->mbcs.stateTable; + } + unicodeCodeUnits=cnv->sharedData->mbcs.unicodeCodeUnits; + + /* get the converter state from UConverter */ + offset=cnv->toUnicodeStatus; + + /* + * if we are in the SBCS state for a DBCS-only converter, + * then load the DBCS state from the MBCS data + * (dbcsOnlyState==0 if it is not a DBCS-only converter) + */ + if((state=(uint8_t)(cnv->mode))==0) { + state=cnv->sharedData->mbcs.dbcsOnlyState; + } /* conversion loop */ - do { + c=U_SENTINEL; + while(sourcemode=state; + + /* set the next state early so that we can reuse the entry variable */ + state=(uint8_t)MBCS_ENTRY_FINAL_STATE(entry); /* typically 0 */ /* * An if-else-if chain provides more reliable performance for * the most common cases compared to a switch. */ action=(uint8_t)(MBCS_ENTRY_FINAL_ACTION(entry)); - if(action==MBCS_STATE_VALID_16) { + if(action==MBCS_STATE_VALID_DIRECT_16) { + /* output BMP code point */ + c=(UChar)MBCS_ENTRY_FINAL_VALUE_16(entry); + break; + } else if(action==MBCS_STATE_VALID_16) { offset+=MBCS_ENTRY_FINAL_VALUE_16(entry); - entry=unicodeCodeUnits[offset]; - if(entry!=0xfffe) { - return (UChar32)entry; - } else if(UCNV_TO_U_USE_FALLBACK(cnv)) { - return _MBCSGetFallback(&sharedData->table->mbcs, offset); + c=unicodeCodeUnits[offset]; + if(c<0xfffe) { + /* output BMP code point */ + break; + } else if(c==0xfffe) { + if(UCNV_TO_U_USE_FALLBACK(cnv) && (c=ucnv_MBCSGetFallback(&cnv->sharedData->mbcs, offset))!=0xfffe) { + break; + } } else { - return 0xfffe; + /* callback(illegal) */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; } - } else if(action==MBCS_STATE_VALID_DIRECT_16) { - /* output BMP code point */ - return (UChar)MBCS_ENTRY_FINAL_VALUE_16(entry); } else if(action==MBCS_STATE_VALID_16_PAIR) { offset+=MBCS_ENTRY_FINAL_VALUE_16(entry); - entry=unicodeCodeUnits[offset++]; - if(entry<0xd800) { + c=unicodeCodeUnits[offset++]; + if(c<0xd800) { /* output BMP code point below 0xd800 */ - return (UChar32)entry; - } else if(UCNV_TO_U_USE_FALLBACK(cnv) ? entry<=0xdfff : entry<=0xdbff) { + break; + } else if(UCNV_TO_U_USE_FALLBACK(cnv) ? c<=0xdfff : c<=0xdbff) { /* output roundtrip or fallback supplementary code point */ - return (UChar32)(((entry&0x3ff)<<10)+unicodeCodeUnits[offset]+(0x10000-0xdc00)); - } else if(UCNV_TO_U_USE_FALLBACK(cnv) ? (entry&0xfffe)==0xe000 : entry==0xe000) { + c=((c&0x3ff)<<10)+unicodeCodeUnits[offset]+(0x10000-0xdc00); + break; + } else if(UCNV_TO_U_USE_FALLBACK(cnv) ? (c&0xfffe)==0xe000 : c==0xe000) { /* output roundtrip BMP code point above 0xd800 or fallback BMP code point */ - return unicodeCodeUnits[offset]; - } else if(entry==0xffff) { - return 0xffff; - } else { - return 0xfffe; - } - } else if(action==MBCS_STATE_VALID_DIRECT_20) { - /* output supplementary code point */ - return 0x10000+MBCS_ENTRY_FINAL_VALUE(entry); - } else if(action==MBCS_STATE_FALLBACK_DIRECT_16) { - if(!TO_U_USE_FALLBACK(useFallback)) { - return 0xfffe; - } - /* output BMP code point */ - return (UChar)MBCS_ENTRY_FINAL_VALUE_16(entry); - } else if(action==MBCS_STATE_FALLBACK_DIRECT_20) { - if(!TO_U_USE_FALLBACK(useFallback)) { - return 0xfffe; + c=unicodeCodeUnits[offset]; + break; + } else if(c==0xffff) { + /* callback(illegal) */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; } + } else if(action==MBCS_STATE_VALID_DIRECT_20 || + (action==MBCS_STATE_FALLBACK_DIRECT_20 && UCNV_TO_U_USE_FALLBACK(cnv)) + ) { /* output supplementary code point */ - return 0x10000+MBCS_ENTRY_FINAL_VALUE(entry); + c=(UChar32)(MBCS_ENTRY_FINAL_VALUE(entry)+0x10000); + break; } else if(action==MBCS_STATE_CHANGE_ONLY) { /* * This serves as a state change without any output. @@ -2058,26 +2224,72 @@ _MBCSSimpleGetNextUChar(UConverterSharedData *sharedData, * The 21 unused bits may later be used for more sophisticated * state transitions. */ - if(source==(const uint8_t *)sourceLimit) { - /* if there are only state changes, then return "unassigned" */ - return 0xfffe; + if(cnv->sharedData->mbcs.dbcsOnlyState!=0) { + /* SI/SO are illegal for DBCS-only conversion */ + state=(uint8_t)(cnv->mode); /* restore the previous state */ + + /* callback(illegal) */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + } + } else if(action==MBCS_STATE_FALLBACK_DIRECT_16) { + if(UCNV_TO_U_USE_FALLBACK(cnv)) { + /* output BMP code point */ + c=(UChar)MBCS_ENTRY_FINAL_VALUE_16(entry); + break; } } else if(action==MBCS_STATE_UNASSIGNED) { - return 0xfffe; + /* just fall through */ } else if(action==MBCS_STATE_ILLEGAL) { - return 0xffff; + /* callback(illegal) */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; } else { - /* reserved, must never occur */ + /* reserved (must never occur), or only state change */ + offset=0; + lastSource=source; + continue; } - /* state change only - prepare for a new character */ - state=(uint8_t)MBCS_ENTRY_FINAL_STATE(entry); /* typically 0 */ + /* end of action codes: prepare for a new character */ offset=0; + + if(U_FAILURE(*pErrorCode)) { + /* callback(illegal) */ + break; + } else /* unassigned sequence */ { + /* defer to the generic implementation */ + cnv->toUnicodeStatus=0; + cnv->mode=state; + pArgs->source=(const char *)lastSource; + return UCNV_GET_NEXT_UCHAR_USE_TO_U; + } } - } while(source<(const uint8_t *)sourceLimit); + } - *pSource=(const char *)source; - return 0xffff; + if(c<0) { + if(U_SUCCESS(*pErrorCode) && source==sourceLimit && lastSourcetoUBytes; + cnv->toULength=(int8_t)(source-lastSource); + do { + *bytes++=*lastSource++; + } while(lastSourcetoUnicodeStatus=0; + cnv->mode=state; + + /* write back the updated pointer */ + pArgs->source=(const char *)source; + return c; } #if 0 @@ -2086,16 +2298,17 @@ _MBCSSimpleGetNextUChar(UConverterSharedData *sharedData, * Removal improves code coverage. */ /** - * This version of _MBCSSimpleGetNextUChar() is optimized for single-byte, single-state codepages. + * This version of ucnv_MBCSSimpleGetNextUChar() is optimized for single-byte, single-state codepages. * It does not handle the EBCDIC swaplfnl option (set in UConverter). + * It does not handle conversion extensions (_extToU()). */ U_CFUNC UChar32 -_MBCSSingleSimpleGetNextUChar(UConverterSharedData *sharedData, +ucnv_MBCSSingleSimpleGetNextUChar(UConverterSharedData *sharedData, uint8_t b, UBool useFallback) { int32_t entry; uint8_t action; - entry=sharedData->table->mbcs.stateTable[0][b]; + entry=sharedData->mbcs.stateTable[0][b]; /* MBCS_ENTRY_IS_FINAL(entry) */ if(MBCS_ENTRY_FINAL_IS_VALID_DIRECT_16(entry)) { @@ -2134,11 +2347,164 @@ _MBCSSingleSimpleGetNextUChar(UConverterSharedData *sharedData, } #endif +/* + * This is a simple version of _MBCSGetNextUChar() that is used + * by other converter implementations. + * It only returns an "assigned" result if it consumes the entire input. + * It does not use state from the converter, nor error codes. + * It does not handle the EBCDIC swaplfnl option (set in UConverter). + * It handles conversion extensions but not GB 18030. + * + * Return value: + * U+fffe unassigned + * U+ffff illegal + * otherwise the Unicode code point + */ +U_CFUNC UChar32 +ucnv_MBCSSimpleGetNextUChar(UConverterSharedData *sharedData, + const char *source, int32_t length, + UBool useFallback) { + const int32_t (*stateTable)[256]; + const uint16_t *unicodeCodeUnits; + + uint32_t offset; + uint8_t state, action; + + UChar32 c; + int32_t i, entry; + + if(length<=0) { + /* no input at all: "illegal" */ + return 0xffff; + } + +#if 0 +/* + * Code disabled 2002dec09 (ICU 2.4) because it is not currently used in ICU. markus + * TODO In future releases, verify that this function is never called for SBCS + * conversions, i.e., that sharedData->mbcs.countStates==1 is still true. + * Removal improves code coverage. + */ + /* use optimized function if possible */ + if(sharedData->mbcs.countStates==1) { + if(length==1) { + return ucnv_MBCSSingleSimpleGetNextUChar(sharedData, (uint8_t)*source, useFallback); + } else { + return 0xffff; /* illegal: more than a single byte for an SBCS converter */ + } + } +#endif + + /* set up the local pointers */ + stateTable=sharedData->mbcs.stateTable; + unicodeCodeUnits=sharedData->mbcs.unicodeCodeUnits; + + /* converter state */ + offset=0; + state=sharedData->mbcs.dbcsOnlyState; + + /* conversion loop */ + for(i=0;;) { + entry=stateTable[state][(uint8_t)source[i++]]; + if(MBCS_ENTRY_IS_TRANSITION(entry)) { + state=(uint8_t)MBCS_ENTRY_TRANSITION_STATE(entry); + offset+=MBCS_ENTRY_TRANSITION_OFFSET(entry); + + if(i==length) { + return 0xffff; /* truncated character */ + } + } else { + /* + * An if-else-if chain provides more reliable performance for + * the most common cases compared to a switch. + */ + action=(uint8_t)(MBCS_ENTRY_FINAL_ACTION(entry)); + if(action==MBCS_STATE_VALID_16) { + offset+=MBCS_ENTRY_FINAL_VALUE_16(entry); + c=unicodeCodeUnits[offset]; + if(c!=0xfffe) { + /* done */ + } else if(UCNV_TO_U_USE_FALLBACK(cnv)) { + c=ucnv_MBCSGetFallback(&sharedData->mbcs, offset); + /* else done with 0xfffe */ + } + break; + } else if(action==MBCS_STATE_VALID_DIRECT_16) { + /* output BMP code point */ + c=(UChar)MBCS_ENTRY_FINAL_VALUE_16(entry); + break; + } else if(action==MBCS_STATE_VALID_16_PAIR) { + offset+=MBCS_ENTRY_FINAL_VALUE_16(entry); + c=unicodeCodeUnits[offset++]; + if(c<0xd800) { + /* output BMP code point below 0xd800 */ + } else if(UCNV_TO_U_USE_FALLBACK(cnv) ? c<=0xdfff : c<=0xdbff) { + /* output roundtrip or fallback supplementary code point */ + c=(UChar32)(((c&0x3ff)<<10)+unicodeCodeUnits[offset]+(0x10000-0xdc00)); + } else if(UCNV_TO_U_USE_FALLBACK(cnv) ? (c&0xfffe)==0xe000 : c==0xe000) { + /* output roundtrip BMP code point above 0xd800 or fallback BMP code point */ + c=unicodeCodeUnits[offset]; + } else if(c==0xffff) { + return 0xffff; + } else { + c=0xfffe; + } + break; + } else if(action==MBCS_STATE_VALID_DIRECT_20) { + /* output supplementary code point */ + c=0x10000+MBCS_ENTRY_FINAL_VALUE(entry); + break; + } else if(action==MBCS_STATE_FALLBACK_DIRECT_16) { + if(!TO_U_USE_FALLBACK(useFallback)) { + c=0xfffe; + break; + } + /* output BMP code point */ + c=(UChar)MBCS_ENTRY_FINAL_VALUE_16(entry); + break; + } else if(action==MBCS_STATE_FALLBACK_DIRECT_20) { + if(!TO_U_USE_FALLBACK(useFallback)) { + c=0xfffe; + break; + } + /* output supplementary code point */ + c=0x10000+MBCS_ENTRY_FINAL_VALUE(entry); + break; + } else if(action==MBCS_STATE_UNASSIGNED) { + c=0xfffe; + break; + } + + /* + * forbid MBCS_STATE_CHANGE_ONLY for this function, + * and MBCS_STATE_ILLEGAL and reserved action codes + */ + return 0xffff; + } + } + + if(i!=length) { + /* illegal for this function: not all input consumed */ + return 0xffff; + } + + if(c==0xfffe) { + /* try an extension mapping */ + const int32_t *cx=sharedData->mbcs.extIndexes; + if(cx!=NULL) { + return ucnv_extSimpleMatchToU(cx, source, length, useFallback); + } + } + + return c; +} + /* MBCS-from-Unicode conversion functions ----------------------------------- */ -U_CFUNC void -_MBCSFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { +/* This version of ucnv_MBCSFromUnicodeWithOffsets() is optimized for double-byte codepages. */ +static void +ucnv_MBCSDoubleFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { UConverter *cnv; const UChar *source, *sourceLimit; uint8_t *target; @@ -2146,34 +2512,20 @@ _MBCSFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, int32_t *offsets; const uint16_t *table; - const uint8_t *p, *bytes; - uint8_t outputType; + const uint8_t *bytes; UChar32 c; - int32_t prevSourceIndex, sourceIndex, nextSourceIndex; + int32_t sourceIndex, nextSourceIndex; - UConverterCallbackReason reason; uint32_t stage2Entry; uint32_t value; - int32_t length, prevLength; + int32_t length; uint8_t unicodeMask; /* use optimized function if possible */ cnv=pArgs->converter; - outputType=cnv->sharedData->table->mbcs.outputType; - unicodeMask=cnv->sharedData->table->mbcs.unicodeMask; - if(outputType==MBCS_OUTPUT_1 && !(unicodeMask&UCNV_HAS_SURROGATES)) { - if(!(unicodeMask&UCNV_HAS_SUPPLEMENTARY)) { - _MBCSSingleFromBMPWithOffsets(pArgs, pErrorCode); - } else { - _MBCSSingleFromUnicodeWithOffsets(pArgs, pErrorCode); - } - return; - } else if(outputType==MBCS_OUTPUT_2) { - _MBCSDoubleFromUnicodeWithOffsets(pArgs, pErrorCode); - return; - } + unicodeMask=cnv->sharedData->mbcs.unicodeMask; /* set up the local pointers */ source=pArgs->source; @@ -2182,36 +2534,21 @@ _MBCSFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, targetCapacity=pArgs->targetLimit-pArgs->target; offsets=pArgs->offsets; - table=cnv->sharedData->table->mbcs.fromUnicodeTable; + table=cnv->sharedData->mbcs.fromUnicodeTable; if((cnv->options&UCNV_OPTION_SWAP_LFNL)!=0) { - bytes=cnv->sharedData->table->mbcs.swapLFNLFromUnicodeBytes; + bytes=cnv->sharedData->mbcs.swapLFNLFromUnicodeBytes; } else { - bytes=cnv->sharedData->table->mbcs.fromUnicodeBytes; + bytes=cnv->sharedData->mbcs.fromUnicodeBytes; } /* get the converter state from UConverter */ - c=cnv->fromUSurrogateLead; - prevLength=cnv->fromUnicodeStatus; + c=cnv->fromUChar32; /* sourceIndex=-1 if the current character began in the previous buffer */ - prevSourceIndex=-1; sourceIndex= c==0 ? 0 : -1; nextSourceIndex=0; /* conversion loop */ - /* - * This is another piece of ugly code: - * A goto into the loop if the converter state contains a first surrogate - * from the previous function call. - * It saves me to check in each loop iteration a check of if(c==0) - * and duplicating the trail-surrogate-handling code in the else - * branch of that check. - * I could not find any other way to get around this other than - * using a function call for the conversion and callback, which would - * be even more inefficient. - * - * Markus Scherer 2000-jul-19 - */ if(c!=0 && targetCapacity>0) { goto getTrail; } @@ -2258,9 +2595,8 @@ getTrail: } else { /* this is an unmatched lead code unit (1st surrogate) */ /* callback(illegal) */ - reason=UCNV_ILLEGAL; *pErrorCode=U_ILLEGAL_CHAR_FOUND; - goto callback; + break; } } else { /* no more input */ @@ -2269,341 +2605,96 @@ getTrail: } else { /* this is an unmatched trail code unit (2nd surrogate) */ /* callback(illegal) */ - reason=UCNV_ILLEGAL; *pErrorCode=U_ILLEGAL_CHAR_FOUND; - goto callback; + break; } } /* convert the Unicode code point in c into codepage bytes */ - - /* - * The basic lookup is a triple-stage compact array (trie) lookup. - * For details see the beginning of this file. - * - * Single-byte codepages are handled with a different data structure - * by _MBCSSingle... functions. - * - * The result consists of a 32-bit value from stage 2 and - * a pointer to as many bytes as are stored per character. - * The pointer points to the character's bytes in stage 3. - * Bits 15..0 of the stage 2 entry contain the stage 3 index - * for that pointer, while bits 31..16 are flags for which of - * the 16 characters in the block are roundtrip-assigned. - * - * For 2-byte and 4-byte codepages, the bytes are stored as uint16_t - * respectively as uint32_t, in the platform encoding. - * For 3-byte codepages, the bytes are always stored in big-endian order. - * - * For EUC encodings that use only either 0x8e or 0x8f as the first - * byte of their longest byte sequences, the first two bytes in - * this third stage indicate with their 7th bits whether these bytes - * are to be written directly or actually need to be preceeded by - * one of the two Single-Shift codes. With this, the third stage - * stores one byte fewer per character than the actual maximum length of - * EUC byte sequences. - * - * Other than that, leading zero bytes are removed and the other - * bytes output. A single zero byte may be output if the "assigned" - * bit in stage 2 was on or also if the Unicode code point is U+0000. - * The data structure does not support zero byte output as a fallback - * for other code points, and also does not allow output of leading zeros. - */ stage2Entry=MBCS_STAGE_2_FROM_U(table, c); /* get the bytes and the length for the output */ - switch(outputType) { - case MBCS_OUTPUT_2: - value=MBCS_VALUE_2_FROM_STAGE_2(bytes, stage2Entry, c); - if(value<=0xff) { - length=1; - } else { - length=2; - } - break; - case MBCS_OUTPUT_2_SISO: - /* 1/2-byte stateful with Shift-In/Shift-Out */ - /* - * Save the old state in the converter object - * right here, then change the local prevLength state variable if necessary. - * Then, if this character turns out to be unassigned or a fallback that - * is not taken, the callback code must not save the new state in the converter - * because the new state is for a character that is not output. - * However, the callback must still restore the state from the converter - * in case the callback function changed it for its output. - */ - cnv->fromUnicodeStatus=prevLength; /* save the old state */ - value=MBCS_VALUE_2_FROM_STAGE_2(bytes, stage2Entry, c); - if(value<=0xff) { - if(prevLength==1) { - length=1; - } else { - /* change from double-byte mode to single-byte */ - value|=(uint32_t)UCNV_SI<<8; - length=2; - prevLength=1; - } - } else { - if(prevLength==2) { - length=2; - } else { - /* change from single-byte mode to double-byte */ - value|=(uint32_t)UCNV_SO<<16; - length=3; - prevLength=2; - } - } - break; - case MBCS_OUTPUT_3: - p=MBCS_POINTER_3_FROM_STAGE_2(bytes, stage2Entry, c); - value=((uint32_t)*p<<16)|((uint32_t)p[1]<<8)|p[2]; - if(value<=0xff) { - length=1; - } else if(value<=0xffff) { - length=2; - } else { - length=3; - } - break; - case MBCS_OUTPUT_4: - value=MBCS_VALUE_4_FROM_STAGE_2(bytes, stage2Entry, c); - if(value<=0xff) { - length=1; - } else if(value<=0xffff) { - length=2; - } else if(value<=0xffffff) { - length=3; - } else { - length=4; - } - break; - case MBCS_OUTPUT_3_EUC: - value=MBCS_VALUE_2_FROM_STAGE_2(bytes, stage2Entry, c); - /* EUC 16-bit fixed-length representation */ - if(value<=0xff) { - length=1; - } else if((value&0x8000)==0) { - value|=0x8e8000; - length=3; - } else if((value&0x80)==0) { - value|=0x8f0080; - length=3; - } else { - length=2; - } - break; - case MBCS_OUTPUT_4_EUC: - p=MBCS_POINTER_3_FROM_STAGE_2(bytes, stage2Entry, c); - value=((uint32_t)*p<<16)|((uint32_t)p[1]<<8)|p[2]; - /* EUC 16-bit fixed-length representation applied to the first two bytes */ - if(value<=0xff) { - length=1; - } else if(value<=0xffff) { - length=2; - } else if((value&0x800000)==0) { - value|=0x8e800000; - length=4; - } else if((value&0x8000)==0) { - value|=0x8f008000; - length=4; - } else { - length=3; - } - break; - default: - /* must not occur */ - /* - * To avoid compiler warnings that value & length may be - * used without having been initialized, we set them here. - * In reality, this is unreachable code. - * Not having a default branch also causes warnings with - * some compilers. - */ - value=0; - length=0; - break; + /* MBCS_OUTPUT_2 */ + value=MBCS_VALUE_2_FROM_STAGE_2(bytes, stage2Entry, c); + if(value<=0xff) { + length=1; + } else { + length=2; } /* is this code point assigned, or do we use fallbacks? */ - if(!(MBCS_FROM_U_IS_ROUNDTRIP(stage2Entry, c)!=0 || - (UCNV_FROM_U_USE_FALLBACK(cnv, c) && (value!=0 || c==0))) + if(!(MBCS_FROM_U_IS_ROUNDTRIP(stage2Entry, c) || + (UCNV_FROM_U_USE_FALLBACK(cnv, c) && value!=0)) ) { /* - * We allow a 0 byte output if the Unicode code point is - * U+0000 and also if the "assigned" bit is set for this entry. + * We allow a 0 byte output if the "assigned" bit is set for this entry. * There is no way with this data structure for fallback output - * for other than U+0000 to be a zero byte. + * to be a zero byte. */ - /* callback(unassigned) */ - goto unassigned; - } - /* write the output character bytes from value and length */ - /* from the first if in the loop we know that targetCapacity>0 */ - if(length<=targetCapacity) { - if(offsets==NULL) { - switch(length) { - /* each branch falls through to the next one */ - case 4: - *target++=(uint8_t)(value>>24); - case 3: - *target++=(uint8_t)(value>>16); - case 2: - *target++=(uint8_t)(value>>8); - case 1: - *target++=(uint8_t)value; - default: - /* will never occur */ - break; - } +unassigned: + /* try an extension mapping */ + pArgs->source=source; + c=_extFromU(cnv, cnv->sharedData, + c, &source, sourceLimit, + (char **)&target, (char *)target+targetCapacity, + &offsets, sourceIndex, + pArgs->flush, + pErrorCode); + nextSourceIndex+=(int32_t)(source-pArgs->source); + + if(U_FAILURE(*pErrorCode)) { + /* not mappable or buffer overflow */ + break; } else { - switch(length) { - /* each branch falls through to the next one */ - case 4: - *target++=(uint8_t)(value>>24); - *offsets++=sourceIndex; - case 3: - *target++=(uint8_t)(value>>16); - *offsets++=sourceIndex; - case 2: - *target++=(uint8_t)(value>>8); - *offsets++=sourceIndex; - case 1: - *target++=(uint8_t)value; - *offsets++=sourceIndex; - default: - /* will never occur */ - break; - } - } - targetCapacity-=length; - } else { - uint8_t *charErrorBuffer; + /* a mapping was written to the target, continue */ - /* - * We actually do this backwards here: - * In order to save an intermediate variable, we output - * first to the overflow buffer what does not fit into the - * regular target. - */ - /* we know that 1<=targetCapacitycharErrorBuffer; - switch(length) { - /* each branch falls through to the next one */ - case 3: - *charErrorBuffer++=(uint8_t)(value>>16); - case 2: - *charErrorBuffer++=(uint8_t)(value>>8); - case 1: - *charErrorBuffer=(uint8_t)value; - default: - /* will never occur */ - break; + /* recalculate the targetCapacity after an extension mapping */ + targetCapacity=pArgs->targetLimit-(char *)target; + + /* normal end of conversion: prepare for a new character */ + sourceIndex=nextSourceIndex; + continue; } - cnv->charErrorBufferLength=(int8_t)length; + } - /* now output what fits into the regular target */ - value>>=8*length; /* length was reduced by targetCapacity */ - switch(targetCapacity) { - /* each branch falls through to the next one */ - case 3: - *target++=(uint8_t)(value>>16); + /* write the output character bytes from value and length */ + /* from the first if in the loop we know that targetCapacity>0 */ + if(length==1) { + /* this is easy because we know that there is enough space */ + *target++=(uint8_t)value; + if(offsets!=NULL) { + *offsets++=sourceIndex; + } + --targetCapacity; + } else /* length==2 */ { + *target++=(uint8_t)(value>>8); + if(2<=targetCapacity) { + *target++=(uint8_t)value; if(offsets!=NULL) { *offsets++=sourceIndex; - } - case 2: - *target++=(uint8_t)(value>>8); - if(offsets!=NULL) { *offsets++=sourceIndex; } - case 1: - *target++=(uint8_t)value; + targetCapacity-=2; + } else { if(offsets!=NULL) { *offsets++=sourceIndex; } - default: - /* will never occur */ + cnv->charErrorBuffer[0]=(char)value; + cnv->charErrorBufferLength=1; + + /* target overflow */ + targetCapacity=0; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + c=0; break; } - - /* target overflow */ - targetCapacity=0; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - c=0; - break; } /* normal end of conversion: prepare for a new character */ c=0; - if(offsets!=NULL) { - prevSourceIndex=sourceIndex; - sourceIndex=nextSourceIndex; - } + sourceIndex=nextSourceIndex; continue; - - /* - * This is the same ugly trick as in ToUnicode(), for the - * same reasons... - */ -unassigned: - reason=UCNV_UNASSIGNED; - *pErrorCode=U_INVALID_CHAR_FOUND; -callback: - /* call the callback function with all the preparations and post-processing */ - /* update the arguments structure */ - pArgs->source=source; - pArgs->target=(char *)target; - pArgs->offsets=offsets; - - /* set the converter state in UConverter to deal with the next character */ - cnv->fromUSurrogateLead=0; - /* - * Do not save the prevLength SISO state because prevLength is set for - * the character that is now not output because it is unassigned or it is - * a fallback that is not taken. - * The above branch for MBCS_OUTPUT_2_SISO has saved the previous state already. - * See comments there. - */ - prevSourceIndex=sourceIndex; - - /* call the callback function */ - fromUCallback(cnv, cnv->fromUContext, pArgs, c, reason, pErrorCode); - - /* get the converter state from UConverter */ - c=cnv->fromUSurrogateLead; - prevLength=cnv->fromUnicodeStatus; - - /* update target and deal with offsets if necessary */ - offsets=ucnv_updateCallbackOffsets(offsets, ((uint8_t *)pArgs->target)-target, sourceIndex); - target=(uint8_t *)pArgs->target; - - /* update the source pointer and index */ - sourceIndex=nextSourceIndex+(pArgs->source-source); - source=pArgs->source; - targetCapacity=(uint8_t *)pArgs->targetLimit-target; - - /* - * If the callback overflowed the target, then we need to - * stop here with an overflow indication. - */ - if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR) { - break; - } else if(U_FAILURE(*pErrorCode)) { - /* break on error */ - c=0; - break; - } else if(cnv->charErrorBufferLength>0) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - break; - } - - /* - * We do not need to repeat the statements from the normal - * end of the conversion because we already updated all the - * necessary variables. - */ } else { /* target is full */ *pErrorCode=U_BUFFER_OVERFLOW_ERROR; @@ -2611,41 +2702,8 @@ callback: } } - if(pArgs->flush && source>=sourceLimit && U_SUCCESS(*pErrorCode)) { - /* end of input stream */ - if(c!=0) { - /* a Unicode code point remains incomplete (only a first surrogate) */ - *pErrorCode=U_TRUNCATED_CHAR_FOUND; - /* the following may change with Jitterbug 2449: would prepare for callback instead of resetting */ - c=0; - prevLength=1; - } else if(outputType==MBCS_OUTPUT_2_SISO && prevLength==2) { - /* EBCDIC_STATEFUL ending with DBCS: emit an SI to return the output stream to SBCS */ - if(targetCapacity>0) { - *target++=(uint8_t)UCNV_SI; - if(offsets!=NULL) { - /* set the last source character's index (sourceIndex points at sourceLimit now) */ - *offsets++=prevSourceIndex; - } - } else { - /* target is full */ - cnv->charErrorBuffer[0]=(char)UCNV_SI; - cnv->charErrorBufferLength=1; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - prevLength=1; /* we switched into SBCS */ - } - - /* reset the state for the next conversion */ - if(U_SUCCESS(*pErrorCode)) { - c=0; - prevLength=1; - } - } - /* set the converter state back into UConverter */ - cnv->fromUSurrogateLead=(UChar)c; - cnv->fromUnicodeStatus=prevLength; + cnv->fromUChar32=c; /* write back the updated pointers */ pArgs->source=source; @@ -2653,9 +2711,9 @@ callback: pArgs->offsets=offsets; } -/* This version of _MBCSFromUnicodeWithOffsets() is optimized for double-byte codepages. */ +/* This version of ucnv_MBCSFromUnicodeWithOffsets() is optimized for single-byte codepages. */ static void -_MBCSDoubleFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, +ucnv_MBCSSingleFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, UErrorCode *pErrorCode) { UConverter *cnv; const UChar *source, *sourceLimit; @@ -2664,272 +2722,12 @@ _MBCSDoubleFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, int32_t *offsets; const uint16_t *table; - const uint8_t *bytes; + const uint16_t *results; UChar32 c; int32_t sourceIndex, nextSourceIndex; - UConverterCallbackReason reason; - uint32_t stage2Entry; - uint32_t value; - int32_t length, prevLength; - uint8_t unicodeMask; - - /* use optimized function if possible */ - cnv=pArgs->converter; - unicodeMask=cnv->sharedData->table->mbcs.unicodeMask; - - /* set up the local pointers */ - source=pArgs->source; - sourceLimit=pArgs->sourceLimit; - target=(uint8_t *)pArgs->target; - targetCapacity=pArgs->targetLimit-pArgs->target; - offsets=pArgs->offsets; - - table=cnv->sharedData->table->mbcs.fromUnicodeTable; - if((cnv->options&UCNV_OPTION_SWAP_LFNL)!=0) { - bytes=cnv->sharedData->table->mbcs.swapLFNLFromUnicodeBytes; - } else { - bytes=cnv->sharedData->table->mbcs.fromUnicodeBytes; - } - - /* get the converter state from UConverter */ - c=cnv->fromUSurrogateLead; - prevLength=cnv->fromUnicodeStatus; - - /* sourceIndex=-1 if the current character began in the previous buffer */ - sourceIndex= c==0 ? 0 : -1; - nextSourceIndex=0; - - /* conversion loop */ - if(c!=0 && targetCapacity>0) { - goto getTrail; - } - - while(source0) { - /* - * Get a correct Unicode code point: - * a single UChar for a BMP code point or - * a matched surrogate pair for a "supplementary code point". - */ - c=*source++; - ++nextSourceIndex; - /* - * This also tests if the codepage maps single surrogates. - * If it does, then surrogates are not paired but mapped separately. - * Note that in this case unmatched surrogates are not detected. - */ - if(UTF_IS_SURROGATE(c) && !(unicodeMask&UCNV_HAS_SURROGATES)) { - if(UTF_IS_SURROGATE_FIRST(c)) { -getTrail: - if(source0 */ - if(length==1) { - /* this is easy because we know that there is enough space */ - *target++=(uint8_t)value; - if(offsets!=NULL) { - *offsets++=sourceIndex; - } - --targetCapacity; - } else /* length==2 */ { - *target++=(uint8_t)(value>>8); - if(2<=targetCapacity) { - *target++=(uint8_t)value; - if(offsets!=NULL) { - *offsets++=sourceIndex; - *offsets++=sourceIndex; - } - targetCapacity-=2; - } else { - if(offsets!=NULL) { - *offsets++=sourceIndex; - } - cnv->charErrorBuffer[0]=(char)value; - cnv->charErrorBufferLength=1; - - /* target overflow */ - targetCapacity=0; - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - c=0; - break; - } - } - - /* normal end of conversion: prepare for a new character */ - c=0; - sourceIndex=nextSourceIndex; - continue; - - /* - * This is the same ugly trick as in ToUnicode(), for the - * same reasons... - */ -unassigned: - reason=UCNV_UNASSIGNED; - *pErrorCode=U_INVALID_CHAR_FOUND; -callback: - /* call the callback function with all the preparations and post-processing */ - /* update the arguments structure */ - pArgs->source=source; - pArgs->target=(char *)target; - pArgs->offsets=offsets; - - /* set the converter state in UConverter to deal with the next character */ - cnv->fromUSurrogateLead=0; - cnv->fromUnicodeStatus=prevLength; - - /* call the callback function */ - fromUCallback(cnv, cnv->fromUContext, pArgs, c, reason, pErrorCode); - - /* get the converter state from UConverter */ - c=cnv->fromUSurrogateLead; - prevLength=cnv->fromUnicodeStatus; - - /* update target and deal with offsets if necessary */ - offsets=ucnv_updateCallbackOffsets(offsets, ((uint8_t *)pArgs->target)-target, sourceIndex); - target=(uint8_t *)pArgs->target; - - /* update the source pointer and index */ - sourceIndex=nextSourceIndex+(pArgs->source-source); - source=pArgs->source; - targetCapacity=(uint8_t *)pArgs->targetLimit-target; - - /* - * If the callback overflowed the target, then we need to - * stop here with an overflow indication. - */ - if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR) { - break; - } else if(U_FAILURE(*pErrorCode)) { - /* break on error */ - c=0; - break; - } else if(cnv->charErrorBufferLength>0) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - break; - } - - /* - * We do not need to repeat the statements from the normal - * end of the conversion because we already updated all the - * necessary variables. - */ - } else { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - break; - } - } - - if(pArgs->flush && source>=sourceLimit) { - /* reset the state for the next conversion */ - if(c!=0 && U_SUCCESS(*pErrorCode)) { - /* a Unicode code point remains incomplete (only a first surrogate) */ - *pErrorCode=U_TRUNCATED_CHAR_FOUND; - } - cnv->fromUSurrogateLead=0; - cnv->fromUnicodeStatus=1; - } else { - /* set the converter state back into UConverter */ - cnv->fromUSurrogateLead=(UChar)c; - cnv->fromUnicodeStatus=prevLength; - } - - /* write back the updated pointers */ - pArgs->source=source; - pArgs->target=(char *)target; - pArgs->offsets=offsets; -} - -/* This version of _MBCSFromUnicodeWithOffsets() is optimized for single-byte codepages. */ -static void -_MBCSSingleFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - UConverter *cnv; - const UChar *source, *sourceLimit; - uint8_t *target; - int32_t targetCapacity; - int32_t *offsets; - - const uint16_t *table; - const uint16_t *results; - - UChar32 c; - - int32_t sourceIndex, nextSourceIndex; - - UConverterCallbackReason reason; uint16_t value, minValue; UBool hasSupplementary; @@ -2941,11 +2739,11 @@ _MBCSSingleFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, targetCapacity=pArgs->targetLimit-pArgs->target; offsets=pArgs->offsets; - table=cnv->sharedData->table->mbcs.fromUnicodeTable; + table=cnv->sharedData->mbcs.fromUnicodeTable; if((cnv->options&UCNV_OPTION_SWAP_LFNL)!=0) { - results=(uint16_t *)cnv->sharedData->table->mbcs.swapLFNLFromUnicodeBytes; + results=(uint16_t *)cnv->sharedData->mbcs.swapLFNLFromUnicodeBytes; } else { - results=(uint16_t *)cnv->sharedData->table->mbcs.fromUnicodeBytes; + results=(uint16_t *)cnv->sharedData->mbcs.fromUnicodeBytes; } if(cnv->useFallback) { @@ -2955,10 +2753,10 @@ _MBCSSingleFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, /* use only roundtrips and fallbacks from private-use characters */ minValue=0xc00; } - hasSupplementary=(UBool)(cnv->sharedData->table->mbcs.unicodeMask&UCNV_HAS_SUPPLEMENTARY); + hasSupplementary=(UBool)(cnv->sharedData->mbcs.unicodeMask&UCNV_HAS_SUPPLEMENTARY); /* get the converter state from UConverter */ - c=cnv->fromUSurrogateLead; + c=cnv->fromUChar32; /* sourceIndex=-1 if the current character began in the previous buffer */ sourceIndex= c==0 ? 0 : -1; @@ -3006,9 +2804,8 @@ getTrail: } else { /* this is an unmatched lead code unit (1st surrogate) */ /* callback(illegal) */ - reason=UCNV_ILLEGAL; *pErrorCode=U_ILLEGAL_CHAR_FOUND; - goto callback; + break; } } else { /* no more input */ @@ -3017,9 +2814,8 @@ getTrail: } else { /* this is an unmatched trail code unit (2nd surrogate) */ /* callback(illegal) */ - reason=UCNV_ILLEGAL; *pErrorCode=U_ILLEGAL_CHAR_FOUND; - goto callback; + break; } } @@ -3040,65 +2836,31 @@ getTrail: /* normal end of conversion: prepare for a new character */ c=0; sourceIndex=nextSourceIndex; - continue; } else { /* unassigned */ - /* - * We allow a 0 byte output if the Unicode code point is - * U+0000 and also if the "assigned" bit is set for this entry. - * There is no way with this data structure for fallback output - * for other than U+0000 to be a zero byte. - */ - /* callback(unassigned) */ - } unassigned: - reason=UCNV_UNASSIGNED; - *pErrorCode=U_INVALID_CHAR_FOUND; -callback: - /* call the callback function with all the preparations and post-processing */ - /* update the arguments structure */ - pArgs->source=source; - pArgs->target=(char *)target; - pArgs->offsets=offsets; - - /* set the converter state in UConverter to deal with the next character */ - cnv->fromUSurrogateLead=0; - - /* call the callback function */ - fromUCallback(cnv, cnv->fromUContext, pArgs, c, reason, pErrorCode); - - /* get the converter state from UConverter */ - c=cnv->fromUSurrogateLead; - - /* update target and deal with offsets if necessary */ - offsets=ucnv_updateCallbackOffsets(offsets, ((uint8_t *)pArgs->target)-target, sourceIndex); - target=(uint8_t *)pArgs->target; + /* try an extension mapping */ + pArgs->source=source; + c=_extFromU(cnv, cnv->sharedData, + c, &source, sourceLimit, + (char **)&target, (char *)target+targetCapacity, + &offsets, sourceIndex, + pArgs->flush, + pErrorCode); + nextSourceIndex+=(int32_t)(source-pArgs->source); + + if(U_FAILURE(*pErrorCode)) { + /* not mappable or buffer overflow */ + break; + } else { + /* a mapping was written to the target, continue */ - /* update the source pointer and index */ - sourceIndex=nextSourceIndex+(pArgs->source-source); - source=pArgs->source; - targetCapacity=(uint8_t *)pArgs->targetLimit-target; + /* recalculate the targetCapacity after an extension mapping */ + targetCapacity=pArgs->targetLimit-(char *)target; - /* - * If the callback overflowed the target, then we need to - * stop here with an overflow indication. - */ - if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR) { - break; - } else if(U_FAILURE(*pErrorCode)) { - /* break on error */ - c=0; - break; - } else if(cnv->charErrorBufferLength>0) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - break; + /* normal end of conversion: prepare for a new character */ + sourceIndex=nextSourceIndex; + } } - - /* - * We do not need to repeat the statements from the normal - * end of the conversion because we already updated all the - * necessary variables. - */ } else { /* target is full */ *pErrorCode=U_BUFFER_OVERFLOW_ERROR; @@ -3106,17 +2868,8 @@ callback: } } - if(pArgs->flush && source>=sourceLimit) { - /* reset the state for the next conversion */ - if(c!=0 && U_SUCCESS(*pErrorCode)) { - /* a Unicode code point remains incomplete (only a first surrogate) */ - *pErrorCode=U_TRUNCATED_CHAR_FOUND; - } - cnv->fromUSurrogateLead=0; - } else { - /* set the converter state back into UConverter */ - cnv->fromUSurrogateLead=(UChar)c; - } + /* set the converter state back into UConverter */ + cnv->fromUChar32=c; /* write back the updated pointers */ pArgs->source=source; @@ -3125,13 +2878,13 @@ callback: } /* - * This version of _MBCSFromUnicode() is optimized for single-byte codepages + * This version of ucnv_MBCSFromUnicode() is optimized for single-byte codepages * that map only to and from the BMP. * In addition to single-byte/state optimizations, the offset calculations * become much easier. */ static void -_MBCSSingleFromBMPWithOffsets(UConverterFromUnicodeArgs *pArgs, +ucnv_MBCSSingleFromBMPWithOffsets(UConverterFromUnicodeArgs *pArgs, UErrorCode *pErrorCode) { UConverter *cnv; const UChar *source, *sourceLimit, *lastSource; @@ -3146,7 +2899,6 @@ _MBCSSingleFromBMPWithOffsets(UConverterFromUnicodeArgs *pArgs, int32_t sourceIndex; - UConverterCallbackReason reason; uint16_t value, minValue; /* set up the local pointers */ @@ -3157,11 +2909,11 @@ _MBCSSingleFromBMPWithOffsets(UConverterFromUnicodeArgs *pArgs, targetCapacity=pArgs->targetLimit-pArgs->target; offsets=pArgs->offsets; - table=cnv->sharedData->table->mbcs.fromUnicodeTable; + table=cnv->sharedData->mbcs.fromUnicodeTable; if((cnv->options&UCNV_OPTION_SWAP_LFNL)!=0) { - results=(uint16_t *)cnv->sharedData->table->mbcs.swapLFNLFromUnicodeBytes; + results=(uint16_t *)cnv->sharedData->mbcs.swapLFNLFromUnicodeBytes; } else { - results=(uint16_t *)cnv->sharedData->table->mbcs.fromUnicodeBytes; + results=(uint16_t *)cnv->sharedData->mbcs.fromUnicodeBytes; } if(cnv->useFallback) { @@ -3173,7 +2925,7 @@ _MBCSSingleFromBMPWithOffsets(UConverterFromUnicodeArgs *pArgs, } /* get the converter state from UConverter */ - c=cnv->fromUSurrogateLead; + c=cnv->fromUChar32; /* sourceIndex=-1 if the current character began in the previous buffer */ sourceIndex= c==0 ? 0 : -1; @@ -3270,15 +3022,6 @@ unrolled: continue; } else if(!UTF_IS_SURROGATE(c)) { /* normal, unassigned BMP character */ - /* - * We allow a 0 byte output if the Unicode code point is - * U+0000 and also if the "assigned" bit is set for this entry. - * There is no way with this data structure for fallback output - * for other than U+0000 to be a zero byte. - */ - /* callback(unassigned) */ - reason=UCNV_UNASSIGNED; - *pErrorCode=U_INVALID_CHAR_FOUND; } else if(UTF_IS_SURROGATE_FIRST(c)) { getTrail: if(source0) { + *offsets++=sourceIndex++; + --count; + } + /* offsets and sourceIndex are now set for the current character */ + } + + /* try an extension mapping */ + lastSource=source; + c=_extFromU(cnv, cnv->sharedData, + c, &source, sourceLimit, + (char **)&target, (char *)target+targetCapacity, + &offsets, sourceIndex, + pArgs->flush, + pErrorCode); + sourceIndex+=length+(int32_t)(source-lastSource); + lastSource=source; + + if(U_FAILURE(*pErrorCode)) { + /* not mappable or buffer overflow */ + break; + } else { + /* a mapping was written to the target, continue */ + + /* recalculate the targetCapacity after an extension mapping */ + targetCapacity=pArgs->targetLimit-(char *)target; + length=sourceLimit-source; + if(length=(uint8_t *)pArgs->targetLimit) { + /* target is full */ + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + + /* set offsets since the start or the last callback */ + if(offsets!=NULL) { + size_t count=source-lastSource; + while(count>0) { + *offsets++=sourceIndex++; + --count; + } + } + + /* set the converter state back into UConverter */ + cnv->fromUChar32=c; + + /* write back the updated pointers */ + pArgs->source=source; + pArgs->target=(char *)target; + pArgs->offsets=offsets; +} + +U_CFUNC void +ucnv_MBCSFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, + UErrorCode *pErrorCode) { + UConverter *cnv; + const UChar *source, *sourceLimit; + uint8_t *target; + int32_t targetCapacity; + int32_t *offsets; + + const uint16_t *table; + const uint8_t *p, *bytes; + uint8_t outputType; + + UChar32 c; + + int32_t prevSourceIndex, sourceIndex, nextSourceIndex; + + uint32_t stage2Entry; + uint32_t value; + int32_t length, prevLength; + uint8_t unicodeMask; + + cnv=pArgs->converter; + + if(cnv->preFromUFirstCP>=0) { + /* + * pass sourceIndex=-1 because we continue from an earlier buffer + * in the future, this may change with continuous offsets + */ + ucnv_extContinueMatchFromU(cnv, pArgs, -1, pErrorCode); + + if(U_FAILURE(*pErrorCode) || cnv->preFromULength<0) { + return; + } + } + + /* use optimized function if possible */ + outputType=cnv->sharedData->mbcs.outputType; + unicodeMask=cnv->sharedData->mbcs.unicodeMask; + if(outputType==MBCS_OUTPUT_1 && !(unicodeMask&UCNV_HAS_SURROGATES)) { + if(!(unicodeMask&UCNV_HAS_SUPPLEMENTARY)) { + ucnv_MBCSSingleFromBMPWithOffsets(pArgs, pErrorCode); + } else { + ucnv_MBCSSingleFromUnicodeWithOffsets(pArgs, pErrorCode); + } + return; + } else if(outputType==MBCS_OUTPUT_2) { + ucnv_MBCSDoubleFromUnicodeWithOffsets(pArgs, pErrorCode); + return; + } + + /* set up the local pointers */ + source=pArgs->source; + sourceLimit=pArgs->sourceLimit; + target=(uint8_t *)pArgs->target; + targetCapacity=pArgs->targetLimit-pArgs->target; + offsets=pArgs->offsets; + + table=cnv->sharedData->mbcs.fromUnicodeTable; + + if((cnv->options&UCNV_OPTION_SWAP_LFNL)!=0) { + bytes=cnv->sharedData->mbcs.swapLFNLFromUnicodeBytes; + } else { + bytes=cnv->sharedData->mbcs.fromUnicodeBytes; + } + + /* get the converter state from UConverter */ + c=cnv->fromUChar32; + + if(outputType==MBCS_OUTPUT_2_SISO) { + prevLength=cnv->fromUnicodeStatus; + if(prevLength==0) { + /* set the real value */ + prevLength=1; + } + } else { + /* prevent fromUnicodeStatus from being set to something non-0 */ + prevLength=0; + } + + /* sourceIndex=-1 if the current character began in the previous buffer */ + prevSourceIndex=-1; + sourceIndex= c==0 ? 0 : -1; + nextSourceIndex=0; + + /* conversion loop */ + /* + * This is another piece of ugly code: + * A goto into the loop if the converter state contains a first surrogate + * from the previous function call. + * It saves me to check in each loop iteration a check of if(c==0) + * and duplicating the trail-surrogate-handling code in the else + * branch of that check. + * I could not find any other way to get around this other than + * using a function call for the conversion and callback, which would + * be even more inefficient. + * + * Markus Scherer 2000-jul-19 + */ + if(c!=0 && targetCapacity>0) { + goto getTrail; + } + + while(source0) { + /* + * Get a correct Unicode code point: + * a single UChar for a BMP code point or + * a matched surrogate pair for a "supplementary code point". + */ + c=*source++; + ++nextSourceIndex; + /* + * This also tests if the codepage maps single surrogates. + * If it does, then surrogates are not paired but mapped separately. + * Note that in this case unmatched surrogates are not detected. + */ + if(UTF_IS_SURROGATE(c) && !(unicodeMask&UCNV_HAS_SURROGATES)) { + if(UTF_IS_SURROGATE_FIRST(c)) { +getTrail: + if(sourcefromUnicodeStatus=prevLength; /* save the old state */ + /* callback(unassigned) */ + goto unassigned; + } + /* convert this supplementary code point */ + /* exit this condition tree */ + } else { + /* this is an unmatched lead code unit (1st surrogate) */ + /* callback(illegal) */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + break; + } + } else { + /* no more input */ + break; + } + } else { + /* this is an unmatched trail code unit (2nd surrogate) */ + /* callback(illegal) */ + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + break; + } + } + + /* convert the Unicode code point in c into codepage bytes */ + + /* + * The basic lookup is a triple-stage compact array (trie) lookup. + * For details see the beginning of this file. + * + * Single-byte codepages are handled with a different data structure + * by _MBCSSingle... functions. + * + * The result consists of a 32-bit value from stage 2 and + * a pointer to as many bytes as are stored per character. + * The pointer points to the character's bytes in stage 3. + * Bits 15..0 of the stage 2 entry contain the stage 3 index + * for that pointer, while bits 31..16 are flags for which of + * the 16 characters in the block are roundtrip-assigned. + * + * For 2-byte and 4-byte codepages, the bytes are stored as uint16_t + * respectively as uint32_t, in the platform encoding. + * For 3-byte codepages, the bytes are always stored in big-endian order. + * + * For EUC encodings that use only either 0x8e or 0x8f as the first + * byte of their longest byte sequences, the first two bytes in + * this third stage indicate with their 7th bits whether these bytes + * are to be written directly or actually need to be preceeded by + * one of the two Single-Shift codes. With this, the third stage + * stores one byte fewer per character than the actual maximum length of + * EUC byte sequences. + * + * Other than that, leading zero bytes are removed and the other + * bytes output. A single zero byte may be output if the "assigned" + * bit in stage 2 was on. + * The data structure does not support zero byte output as a fallback, + * and also does not allow output of leading zeros. + */ + stage2Entry=MBCS_STAGE_2_FROM_U(table, c); + + /* get the bytes and the length for the output */ + switch(outputType) { + case MBCS_OUTPUT_2: + value=MBCS_VALUE_2_FROM_STAGE_2(bytes, stage2Entry, c); + if(value<=0xff) { + length=1; + } else { + length=2; + } + break; + case MBCS_OUTPUT_2_SISO: + /* 1/2-byte stateful with Shift-In/Shift-Out */ + /* + * Save the old state in the converter object + * right here, then change the local prevLength state variable if necessary. + * Then, if this character turns out to be unassigned or a fallback that + * is not taken, the callback code must not save the new state in the converter + * because the new state is for a character that is not output. + * However, the callback must still restore the state from the converter + * in case the callback function changed it for its output. + */ + cnv->fromUnicodeStatus=prevLength; /* save the old state */ + value=MBCS_VALUE_2_FROM_STAGE_2(bytes, stage2Entry, c); + if(value<=0xff) { + if(value==0 && MBCS_FROM_U_IS_ROUNDTRIP(stage2Entry, c)==0) { + /* no mapping, leave value==0 */ + length=0; + } else if(prevLength<=1) { + length=1; + } else { + /* change from double-byte mode to single-byte */ + value|=(uint32_t)UCNV_SI<<8; + length=2; + prevLength=1; + } + } else { + if(prevLength==2) { + length=2; + } else { + /* change from single-byte mode to double-byte */ + value|=(uint32_t)UCNV_SO<<16; + length=3; + prevLength=2; + } + } + break; + case MBCS_OUTPUT_DBCS_ONLY: + /* table with single-byte results, but only DBCS mappings used */ + value=MBCS_VALUE_2_FROM_STAGE_2(bytes, stage2Entry, c); + if(value<=0xff) { + /* no mapping or SBCS result, not taken for DBCS-only */ + value=stage2Entry=0; /* stage2Entry=0 to reset roundtrip flags */ + length=0; + } else { + length=2; + } + break; + case MBCS_OUTPUT_3: + p=MBCS_POINTER_3_FROM_STAGE_2(bytes, stage2Entry, c); + value=((uint32_t)*p<<16)|((uint32_t)p[1]<<8)|p[2]; + if(value<=0xff) { + length=1; + } else if(value<=0xffff) { + length=2; + } else { + length=3; + } + break; + case MBCS_OUTPUT_4: + value=MBCS_VALUE_4_FROM_STAGE_2(bytes, stage2Entry, c); + if(value<=0xff) { + length=1; + } else if(value<=0xffff) { + length=2; + } else if(value<=0xffffff) { + length=3; + } else { + length=4; + } + break; + case MBCS_OUTPUT_3_EUC: + value=MBCS_VALUE_2_FROM_STAGE_2(bytes, stage2Entry, c); + /* EUC 16-bit fixed-length representation */ + if(value<=0xff) { + length=1; + } else if((value&0x8000)==0) { + value|=0x8e8000; + length=3; + } else if((value&0x80)==0) { + value|=0x8f0080; + length=3; + } else { + length=2; + } + break; + case MBCS_OUTPUT_4_EUC: + p=MBCS_POINTER_3_FROM_STAGE_2(bytes, stage2Entry, c); + value=((uint32_t)*p<<16)|((uint32_t)p[1]<<8)|p[2]; + /* EUC 16-bit fixed-length representation applied to the first two bytes */ + if(value<=0xff) { + length=1; + } else if(value<=0xffff) { + length=2; + } else if((value&0x800000)==0) { + value|=0x8e800000; + length=4; + } else if((value&0x8000)==0) { + value|=0x8f008000; + length=4; + } else { + length=3; + } + break; + default: + /* must not occur */ + /* + * To avoid compiler warnings that value & length may be + * used without having been initialized, we set them here. + * In reality, this is unreachable code. + * Not having a default branch also causes warnings with + * some compilers. + */ + value=stage2Entry=0; /* stage2Entry=0 to reset roundtrip flags */ + length=0; + break; + } + + /* is this code point assigned, or do we use fallbacks? */ + if(!(MBCS_FROM_U_IS_ROUNDTRIP(stage2Entry, c)!=0 || + (UCNV_FROM_U_USE_FALLBACK(cnv, c) && value!=0)) + ) { + /* + * We allow a 0 byte output if the "assigned" bit is set for this entry. + * There is no way with this data structure for fallback output + * to be a zero byte. + */ + +unassigned: + /* try an extension mapping */ + pArgs->source=source; + c=_extFromU(cnv, cnv->sharedData, + c, &source, sourceLimit, + (char **)&target, (char *)target+targetCapacity, + &offsets, sourceIndex, + pArgs->flush, + pErrorCode); + nextSourceIndex+=(int32_t)(source-pArgs->source); + prevLength=cnv->fromUnicodeStatus; /* restore SISO state */ + + if(U_FAILURE(*pErrorCode)) { + /* not mappable or buffer overflow */ + break; + } else { + /* a mapping was written to the target, continue */ + + /* recalculate the targetCapacity after an extension mapping */ + targetCapacity=pArgs->targetLimit-(char *)target; + + /* normal end of conversion: prepare for a new character */ + if(offsets!=NULL) { + prevSourceIndex=sourceIndex; + sourceIndex=nextSourceIndex; + } + continue; + } + } + + /* write the output character bytes from value and length */ + /* from the first if in the loop we know that targetCapacity>0 */ + if(length<=targetCapacity) { + if(offsets==NULL) { + switch(length) { + /* each branch falls through to the next one */ + case 4: + *target++=(uint8_t)(value>>24); + case 3: + *target++=(uint8_t)(value>>16); + case 2: + *target++=(uint8_t)(value>>8); + case 1: + *target++=(uint8_t)value; + default: + /* will never occur */ + break; + } + } else { + switch(length) { + /* each branch falls through to the next one */ + case 4: + *target++=(uint8_t)(value>>24); + *offsets++=sourceIndex; + case 3: + *target++=(uint8_t)(value>>16); + *offsets++=sourceIndex; + case 2: + *target++=(uint8_t)(value>>8); + *offsets++=sourceIndex; + case 1: + *target++=(uint8_t)value; + *offsets++=sourceIndex; + default: + /* will never occur */ + break; + } + } + targetCapacity-=length; + } else { + uint8_t *charErrorBuffer; + + /* + * We actually do this backwards here: + * In order to save an intermediate variable, we output + * first to the overflow buffer what does not fit into the + * regular target. + */ + /* we know that 1<=targetCapacitycharErrorBuffer; + switch(length) { + /* each branch falls through to the next one */ + case 3: + *charErrorBuffer++=(uint8_t)(value>>16); + case 2: + *charErrorBuffer++=(uint8_t)(value>>8); + case 1: + *charErrorBuffer=(uint8_t)value; + default: + /* will never occur */ + break; + } + cnv->charErrorBufferLength=(int8_t)length; + + /* now output what fits into the regular target */ + value>>=8*length; /* length was reduced by targetCapacity */ + switch(targetCapacity) { + /* each branch falls through to the next one */ + case 3: + *target++=(uint8_t)(value>>16); + if(offsets!=NULL) { + *offsets++=sourceIndex; + } + case 2: + *target++=(uint8_t)(value>>8); + if(offsets!=NULL) { + *offsets++=sourceIndex; + } + case 1: + *target++=(uint8_t)value; + if(offsets!=NULL) { + *offsets++=sourceIndex; + } + default: + /* will never occur */ + break; + } - while(count>0) { - *offsets++=sourceIndex++; - --count; + /* target overflow */ + targetCapacity=0; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + c=0; + break; } - /* offset and sourceIndex are now set for the current character */ - } - - /* update the arguments structure */ - pArgs->source=source; - pArgs->target=(char *)target; - pArgs->offsets=offsets; - - /* set the converter state in UConverter to deal with the next character */ - cnv->fromUSurrogateLead=0; - - /* call the callback function */ - fromUCallback(cnv, cnv->fromUContext, pArgs, c, reason, pErrorCode); - - /* get the converter state from UConverter */ - c=cnv->fromUSurrogateLead; - - /* update target and deal with offsets if necessary */ - offsets=ucnv_updateCallbackOffsets(offsets, ((uint8_t *)pArgs->target)-target, sourceIndex); - target=(uint8_t *)pArgs->target; - /* update the source pointer and index */ - sourceIndex+=length+(pArgs->source-source); - source=lastSource=pArgs->source; - targetCapacity=(uint8_t *)pArgs->targetLimit-target; - length=sourceLimit-source; - if(lengthcharErrorBufferLength>0) { + if(offsets!=NULL) { + prevSourceIndex=sourceIndex; + sourceIndex=nextSourceIndex; + } + continue; + } else { /* target is full */ *pErrorCode=U_BUFFER_OVERFLOW_ERROR; break; } - -#if MBCS_UNROLL_SINGLE_FROM_BMP - /* unrolling makes it slower on Pentium III/Windows 2000?! */ - goto unrolled; -#endif - } - - if(U_SUCCESS(*pErrorCode) && source=(uint8_t *)pArgs->targetLimit) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; } - /* set offsets since the start or the last callback */ - if(offsets!=NULL) { - size_t count=source-lastSource; - while(count>0) { - *offsets++=sourceIndex++; - --count; + /* + * the end of the input stream and detection of truncated input + * are handled by the framework, but for EBCDIC_STATEFUL conversion + * we need to emit an SI at the very end + * + * conditions: + * successful + * EBCDIC_STATEFUL in DBCS mode + * end of input and no truncated input + */ + if( U_SUCCESS(*pErrorCode) && + outputType==MBCS_OUTPUT_2_SISO && prevLength==2 && + pArgs->flush && source>=sourceLimit && c==0 + ) { + /* EBCDIC_STATEFUL ending with DBCS: emit an SI to return the output stream to SBCS */ + if(targetCapacity>0) { + *target++=(uint8_t)UCNV_SI; + if(offsets!=NULL) { + /* set the last source character's index (sourceIndex points at sourceLimit now) */ + *offsets++=prevSourceIndex; + } + } else { + /* target is full */ + cnv->charErrorBuffer[0]=(char)UCNV_SI; + cnv->charErrorBufferLength=1; + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; } + prevLength=1; /* we switched into SBCS */ } - if(pArgs->flush && source>=sourceLimit) { - /* reset the state for the next conversion */ - if(c!=0 && U_SUCCESS(*pErrorCode)) { - /* a Unicode code point remains incomplete (only a first surrogate) */ - *pErrorCode=U_TRUNCATED_CHAR_FOUND; - } - cnv->fromUSurrogateLead=0; - } else { - /* set the converter state back into UConverter */ - cnv->fromUSurrogateLead=(UChar)c; - } + /* set the converter state back into UConverter */ + cnv->fromUChar32=c; + cnv->fromUnicodeStatus=prevLength; /* write back the updated pointers */ pArgs->source=source; @@ -3412,6 +3641,7 @@ getTrail: * conversion implementations. * It does not use the converter state nor call callbacks. * It does not handle the EBCDIC swaplfnl option (set in UConverter). + * It handles conversion extensions but not GB 18030. * * It converts one single Unicode code point into codepage bytes, encoded * as one 32-bit value. The function returns the number of bytes in *pValue: @@ -3424,157 +3654,175 @@ getTrail: * Currently, the function assumes but does not check that 0<=c<=0x10ffff. */ U_CFUNC int32_t -_MBCSFromUChar32(UConverterSharedData *sharedData, +ucnv_MBCSFromUChar32(UConverterSharedData *sharedData, UChar32 c, uint32_t *pValue, UBool useFallback) { - const uint16_t *table=sharedData->table->mbcs.fromUnicodeTable; + const int32_t *cx; + const uint16_t *table; +#if 0 +/* #if 0 because this is not currently used in ICU - reduce code, increase code coverage */ const uint8_t *p; +#endif uint32_t stage2Entry; uint32_t value; int32_t length; /* BMP-only codepages are stored without stage 1 entries for supplementary code points */ - if(c>=0x10000 && !(sharedData->table->mbcs.unicodeMask&UCNV_HAS_SUPPLEMENTARY)) { - return 0; - } + if(c<=0xffff || (sharedData->mbcs.unicodeMask&UCNV_HAS_SUPPLEMENTARY)) { + table=sharedData->mbcs.fromUnicodeTable; - /* convert the Unicode code point in c into codepage bytes (same as in _MBCSFromUnicodeWithOffsets) */ - if(sharedData->table->mbcs.outputType==MBCS_OUTPUT_1) { - value=MBCS_SINGLE_RESULT_FROM_U(table, (uint16_t *)sharedData->table->mbcs.fromUnicodeBytes, c); - /* is this code point assigned, or do we use fallbacks? */ - if(useFallback ? value>=0x800 : value>=0xc00) { - *pValue=value&0xff; - return 1; - } else { - return 0; - } - } + /* convert the Unicode code point in c into codepage bytes (same as in _MBCSFromUnicodeWithOffsets) */ + if(sharedData->mbcs.outputType==MBCS_OUTPUT_1) { + value=MBCS_SINGLE_RESULT_FROM_U(table, (uint16_t *)sharedData->mbcs.fromUnicodeBytes, c); + /* is this code point assigned, or do we use fallbacks? */ + if(useFallback ? value>=0x800 : value>=0xc00) { + *pValue=value&0xff; + return 1; + } + } else /* outputType!=MBCS_OUTPUT_1 */ { + stage2Entry=MBCS_STAGE_2_FROM_U(table, c); - stage2Entry=MBCS_STAGE_2_FROM_U(table, c); + /* get the bytes and the length for the output */ + switch(sharedData->mbcs.outputType) { + case MBCS_OUTPUT_2: + value=MBCS_VALUE_2_FROM_STAGE_2(sharedData->mbcs.fromUnicodeBytes, stage2Entry, c); + if(value<=0xff) { + length=1; + } else { + length=2; + } + break; +#if 0 +/* #if 0 because this is not currently used in ICU - reduce code, increase code coverage */ + case MBCS_OUTPUT_DBCS_ONLY: + /* table with single-byte results, but only DBCS mappings used */ + value=MBCS_VALUE_2_FROM_STAGE_2(sharedData->mbcs.fromUnicodeBytes, stage2Entry, c); + if(value<=0xff) { + /* no mapping or SBCS result, not taken for DBCS-only */ + value=stage2Entry=0; /* stage2Entry=0 to reset roundtrip flags */ + length=0; + } else { + length=2; + } + break; + case MBCS_OUTPUT_3: + p=MBCS_POINTER_3_FROM_STAGE_2(sharedData->mbcs.fromUnicodeBytes, stage2Entry, c); + value=((uint32_t)*p<<16)|((uint32_t)p[1]<<8)|p[2]; + if(value<=0xff) { + length=1; + } else if(value<=0xffff) { + length=2; + } else { + length=3; + } + break; + case MBCS_OUTPUT_4: + value=MBCS_VALUE_4_FROM_STAGE_2(sharedData->mbcs.fromUnicodeBytes, stage2Entry, c); + if(value<=0xff) { + length=1; + } else if(value<=0xffff) { + length=2; + } else if(value<=0xffffff) { + length=3; + } else { + length=4; + } + break; + case MBCS_OUTPUT_3_EUC: + value=MBCS_VALUE_2_FROM_STAGE_2(sharedData->mbcs.fromUnicodeBytes, stage2Entry, c); + /* EUC 16-bit fixed-length representation */ + if(value<=0xff) { + length=1; + } else if((value&0x8000)==0) { + value|=0x8e8000; + length=3; + } else if((value&0x80)==0) { + value|=0x8f0080; + length=3; + } else { + length=2; + } + break; + case MBCS_OUTPUT_4_EUC: + p=MBCS_POINTER_3_FROM_STAGE_2(sharedData->mbcs.fromUnicodeBytes, stage2Entry, c); + value=((uint32_t)*p<<16)|((uint32_t)p[1]<<8)|p[2]; + /* EUC 16-bit fixed-length representation applied to the first two bytes */ + if(value<=0xff) { + length=1; + } else if(value<=0xffff) { + length=2; + } else if((value&0x800000)==0) { + value|=0x8e800000; + length=4; + } else if((value&0x8000)==0) { + value|=0x8f008000; + length=4; + } else { + length=3; + } + break; +#endif + default: + /* must not occur */ + return -1; + } - /* get the bytes and the length for the output */ - switch(sharedData->table->mbcs.outputType) { - case MBCS_OUTPUT_2: - value=MBCS_VALUE_2_FROM_STAGE_2(sharedData->table->mbcs.fromUnicodeBytes, stage2Entry, c); - if(value<=0xff) { - length=1; - } else { - length=2; - } - break; - case MBCS_OUTPUT_3: - p=MBCS_POINTER_3_FROM_STAGE_2(sharedData->table->mbcs.fromUnicodeBytes, stage2Entry, c); - value=((uint32_t)*p<<16)|((uint32_t)p[1]<<8)|p[2]; - if(value<=0xff) { - length=1; - } else if(value<=0xffff) { - length=2; - } else { - length=3; - } - break; - case MBCS_OUTPUT_4: - value=MBCS_VALUE_4_FROM_STAGE_2(sharedData->table->mbcs.fromUnicodeBytes, stage2Entry, c); - if(value<=0xff) { - length=1; - } else if(value<=0xffff) { - length=2; - } else if(value<=0xffffff) { - length=3; - } else { - length=4; - } - break; - case MBCS_OUTPUT_3_EUC: - value=MBCS_VALUE_2_FROM_STAGE_2(sharedData->table->mbcs.fromUnicodeBytes, stage2Entry, c); - /* EUC 16-bit fixed-length representation */ - if(value<=0xff) { - length=1; - } else if((value&0x8000)==0) { - value|=0x8e8000; - length=3; - } else if((value&0x80)==0) { - value|=0x8f0080; - length=3; - } else { - length=2; - } - break; - case MBCS_OUTPUT_4_EUC: - p=MBCS_POINTER_3_FROM_STAGE_2(sharedData->table->mbcs.fromUnicodeBytes, stage2Entry, c); - value=((uint32_t)*p<<16)|((uint32_t)p[1]<<8)|p[2]; - /* EUC 16-bit fixed-length representation applied to the first two bytes */ - if(value<=0xff) { - length=1; - } else if(value<=0xffff) { - length=2; - } else if((value&0x800000)==0) { - value|=0x8e800000; - length=4; - } else if((value&0x8000)==0) { - value|=0x8f008000; - length=4; - } else { - length=3; + /* is this code point assigned, or do we use fallbacks? */ + if( MBCS_FROM_U_IS_ROUNDTRIP(stage2Entry, c) || + (FROM_U_USE_FALLBACK(useFallback, c) && value!=0) + ) { + /* + * We allow a 0 byte output if the "assigned" bit is set for this entry. + * There is no way with this data structure for fallback output + * to be a zero byte. + */ + /* assigned */ + *pValue=value; + return length; + } } - break; - default: - /* must not occur */ - return -1; } - /* is this code point assigned, or do we use fallbacks? */ - if( MBCS_FROM_U_IS_ROUNDTRIP(stage2Entry, c) || - (FROM_U_USE_FALLBACK(useFallback, c) && (value!=0 || c==0)) - ) { - /* - * We allow a 0 byte output if the Unicode code point is - * U+0000 and also if the "assigned" bit is set for this entry. - * There is no way with this data structure for fallback output - * for other than U+0000 to be a zero byte. - */ - /* assigned */ - *pValue=value; - return length; - } else { - return 0; + cx=sharedData->mbcs.extIndexes; + if(cx!=NULL) { + return ucnv_extSimpleMatchFromU(cx, c, pValue, useFallback); } + + /* unassigned */ + return 0; } #if 0 -/** - * ################################################################ - * # - * # This function has been moved to ucnv2022.c for inlining. - * # This implementation is here only for documentation purposes - * # - * ################################################################ +/* + * This function has been moved to ucnv2022.c for inlining. + * This implementation is here only for documentation purposes */ /** - * This version of _MBCSFromUChar32() is optimized for single-byte codepages. + * This version of ucnv_MBCSFromUChar32() is optimized for single-byte codepages. * It does not handle the EBCDIC swaplfnl option (set in UConverter). + * It does not handle conversion extensions (_extFromU()). * * It returns the codepage byte for the code point, or -1 if it is unassigned. */ U_CFUNC int32_t -_MBCSSingleFromUChar32(UConverterSharedData *sharedData, +ucnv_MBCSSingleFromUChar32(UConverterSharedData *sharedData, UChar32 c, UBool useFallback) { const uint16_t *table; int32_t value; /* BMP-only codepages are stored without stage 1 entries for supplementary code points */ - if(c>=0x10000 && !(sharedData->table->mbcs.unicodeMask&UCNV_HAS_SUPPLEMENTARY)) { + if(c>=0x10000 && !(sharedData->mbcs.unicodeMask&UCNV_HAS_SUPPLEMENTARY)) { return -1; } /* convert the Unicode code point in c into codepage bytes (same as in _MBCSFromUnicodeWithOffsets) */ - table=sharedData->table->mbcs.fromUnicodeTable; + table=sharedData->mbcs.fromUnicodeTable; /* get the byte for the output */ - value=MBCS_SINGLE_RESULT_FROM_U(table, (uint16_t *)sharedData->table->mbcs.fromUnicodeBytes, c); + value=MBCS_SINGLE_RESULT_FROM_U(table, (uint16_t *)sharedData->mbcs.fromUnicodeBytes, c); /* is this code point assigned, or do we use fallbacks? */ if(useFallback ? value>=0x800 : value>=0xc00) { return value&0xff; @@ -3587,12 +3835,13 @@ _MBCSSingleFromUChar32(UConverterSharedData *sharedData, /* miscellaneous ------------------------------------------------------------ */ static void -_MBCSGetStarters(const UConverter* cnv, +ucnv_MBCSGetStarters(const UConverter* cnv, UBool starters[256], UErrorCode *pErrorCode) { - const int32_t *state0=cnv->sharedData->table->mbcs.stateTable[0]; + const int32_t *state0; int i; + state0=cnv->sharedData->mbcs.stateTable[cnv->sharedData->mbcs.dbcsOnlyState]; for(i=0; i<256; ++i) { /* all bytes that cause a state transition from state 0 are lead bytes */ starters[i]= (UBool)MBCS_ENTRY_IS_TRANSITION(state0[i]); @@ -3604,12 +3853,12 @@ _MBCSGetStarters(const UConverter* cnv, * to check whether a byte is a lead byte. */ U_CFUNC UBool -_MBCSIsLeadByte(UConverterSharedData *sharedData, char byte) { - return (UBool)MBCS_ENTRY_IS_TRANSITION(sharedData->table->mbcs.stateTable[0][(uint8_t)byte]); +ucnv_MBCSIsLeadByte(UConverterSharedData *sharedData, char byte) { + return (UBool)MBCS_ENTRY_IS_TRANSITION(sharedData->mbcs.stateTable[0][(uint8_t)byte]); } static void -_MBCSWriteSub(UConverterFromUnicodeArgs *pArgs, +ucnv_MBCSWriteSub(UConverterFromUnicodeArgs *pArgs, int32_t offsetIndex, UErrorCode *pErrorCode) { UConverter *cnv=pArgs->converter; @@ -3618,7 +3867,11 @@ _MBCSWriteSub(UConverterFromUnicodeArgs *pArgs, int32_t length; /* first, select between subChar and subChar1 */ - if(cnv->subChar1!=0 && cnv->invalidUCharBuffer[0]<=0xff) { + if( cnv->subChar1!=0 && + (cnv->sharedData->mbcs.extIndexes!=NULL ? + cnv->useSubChar1 : + (cnv->invalidUCharBuffer[0]<=0xff)) + ) { /* select subChar1 if it is set (not 0) and the unmappable Unicode code point is up to U+00ff (IBM MBCS behavior) */ subchar=(char *)&cnv->subChar1; length=1; @@ -3628,7 +3881,10 @@ _MBCSWriteSub(UConverterFromUnicodeArgs *pArgs, length=cnv->subCharLen; } - switch(cnv->sharedData->table->mbcs.outputType) { + /* reset the selector for the next code point */ + cnv->useSubChar1=FALSE; + + switch(cnv->sharedData->mbcs.outputType) { case MBCS_OUTPUT_2_SISO: p=buffer; @@ -3643,7 +3899,7 @@ _MBCSWriteSub(UConverterFromUnicodeArgs *pArgs, *p++=subchar[0]; break; case 2: - if(cnv->fromUnicodeStatus==1) { + if(cnv->fromUnicodeStatus<=1) { /* SBCS mode and DBCS sub char: change to DBCS */ cnv->fromUnicodeStatus=2; *p++=UCNV_SO; @@ -3668,11 +3924,11 @@ _MBCSWriteSub(UConverterFromUnicodeArgs *pArgs, } U_CFUNC UConverterType -_MBCSGetType(const UConverter* converter) { +ucnv_MBCSGetType(const UConverter* converter) { /* SBCS, DBCS, and EBCDIC_STATEFUL are replaced by MBCS, but here we cheat a little */ - if(converter->sharedData->table->mbcs.countStates==1) { + if(converter->sharedData->mbcs.countStates==1) { return (UConverterType)UCNV_SBCS; - } else if((converter->sharedData->table->mbcs.outputType&0xff)==MBCS_OUTPUT_2_SISO) { + } else if((converter->sharedData->mbcs.outputType&0xff)==MBCS_OUTPUT_2_SISO) { return (UConverterType)UCNV_EBCDIC_STATEFUL; } else if(converter->sharedData->staticData->minBytesPerChar==2 && converter->sharedData->staticData->maxBytesPerChar==2) { return (UConverterType)UCNV_DBCS; @@ -3683,24 +3939,24 @@ _MBCSGetType(const UConverter* converter) { static const UConverterImpl _MBCSImpl={ UCNV_MBCS, - _MBCSLoad, - _MBCSUnload, + ucnv_MBCSLoad, + ucnv_MBCSUnload, - _MBCSOpen, + ucnv_MBCSOpen, + NULL, NULL, - _MBCSReset, - _MBCSToUnicodeWithOffsets, - _MBCSToUnicodeWithOffsets, - _MBCSFromUnicodeWithOffsets, - _MBCSFromUnicodeWithOffsets, - _MBCSGetNextUChar, + ucnv_MBCSToUnicodeWithOffsets, + ucnv_MBCSToUnicodeWithOffsets, + ucnv_MBCSFromUnicodeWithOffsets, + ucnv_MBCSFromUnicodeWithOffsets, + ucnv_MBCSGetNextUChar, - _MBCSGetStarters, - _MBCSGetName, - _MBCSWriteSub, + ucnv_MBCSGetStarters, + ucnv_MBCSGetName, + ucnv_MBCSWriteSub, NULL, - _MBCSGetUnicodeSet + ucnv_MBCSGetUnicodeSet }; @@ -3714,98 +3970,4 @@ const UConverterSharedData _MBCSData={ 0 }; -/* GB 18030 special handling ------------------------------------------------ */ - -/* definition of LINEAR macros and gb18030Ranges see near the beginning of the file */ - -/* the callback functions handle GB 18030 specially */ -static void -fromUCallback(UConverter *cnv, - const void *context, UConverterFromUnicodeArgs *pArgs, - UChar32 codePoint, - UConverterCallbackReason reason, UErrorCode *pErrorCode) { - int32_t i; - - if((cnv->options&_MBCS_OPTION_GB18030)!=0 && reason==UCNV_UNASSIGNED) { - const uint32_t *range; - - range=gb18030Ranges[0]; - for(i=0; iinvalidUCharBuffer, i, codePoint); - cnv->invalidUCharLength=(int8_t)i; - - /* call the normal callback function */ - cnv->fromUCharErrorBehaviour(context, pArgs, cnv->invalidUCharBuffer, i, codePoint, reason, pErrorCode); -} - -static void -toUCallback(UConverter *cnv, - const void *context, UConverterToUnicodeArgs *pArgs, - const char *codeUnits, int32_t length, - UConverterCallbackReason reason, UErrorCode *pErrorCode) { - int32_t i; - - if((cnv->options&_MBCS_OPTION_GB18030)!=0 && reason==UCNV_UNASSIGNED && length==4) { - const uint32_t *range; - uint32_t linear; - - linear=LINEAR_18030((uint8_t)codeUnits[0], (uint8_t)codeUnits[1], (uint8_t)codeUnits[2], (uint8_t)codeUnits[3]); - range=gb18030Ranges[0]; - for(i=0; iinvalidCharBuffer[i]=codeUnits[i]; - } - cnv->invalidCharLength=(int8_t)length; - - /* call the normal callback function */ - cnv->fromCharErrorBehaviour(context, pArgs, codeUnits, length, reason, pErrorCode); -} - #endif /* #if !UCONFIG_NO_LEGACY_CONVERSION */ diff --git a/icuSources/common/ucnvmbcs.h b/icuSources/common/ucnvmbcs.h index af9c0f95..4ac4358a 100644 --- a/icuSources/common/ucnvmbcs.h +++ b/icuSources/common/ucnvmbcs.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 2000-2001, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -18,11 +18,121 @@ #define __UCNVMBCS_H__ #include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + #include "unicode/ucnv.h" -#include "ucnv_bld.h" +#include "ucnv_cnv.h" + +/** + * ICU conversion (.cnv) data file structure, following the usual UDataInfo + * header. + * + * Format version: 6.2 + * + * struct UConverterStaticData -- struct containing the converter name, IBM CCSID, + * min/max bytes per character, etc. + * see ucnv_bld.h + * + * -------------------- + * + * The static data is followed by conversionType-specific data structures. + * At the moment, there are only variations of MBCS converters. They all have + * the same toUnicode structures, while the fromUnicode structures for SBCS + * differ from those for other MBCS-style converters. + * + * _MBCSHeader.version 4.2 adds an optional conversion extension data structure. + * If it is present, then an ICU version reading header versions 4.0 or 4.1 + * will be able to use the base table and ignore the extension. + * + * The unicodeMask in the static data is part of the base table data structure. + * Especially, the UCNV_HAS_SUPPLEMENTARY flag determines the length of the + * fromUnicode stage 1 array. + * The static data unicodeMask refers only to the base table's properties if + * a base table is included. + * In an extension-only file, the static data unicodeMask is 0. + * The extension data indexes have a separate field with the unicodeMask flags. + * + * MBCS-style data structure following the static data. + * Offsets are counted in bytes from the beginning of the MBCS header structure. + * Details about usage in comments in ucnvmbcs.c. + * + * struct _MBCSHeader (see the definition in this header file below) + * contains 32-bit fields as follows: + * 8 values: + * 0 uint8_t[4] MBCS version in UVersionInfo format (currently 4.2.0.0) + * 1 uint32_t countStates + * 2 uint32_t countToUFallbacks + * 3 uint32_t offsetToUCodeUnits + * 4 uint32_t offsetFromUTable + * 5 uint32_t offsetFromUBytes + * 6 uint32_t flags, bits: + * 31.. 8 offsetExtension -- _MBCSHeader.version 4.2 (ICU 2.8) and higher + * 0 for older versions and if + * there is not extension structure + * 7.. 0 outputType + * 7 uint32_t fromUBytesLength -- _MBCSHeader.version 4.1 (ICU 2.4) and higher + * counts bytes in fromUBytes[] + * + * if(outputType==MBCS_OUTPUT_EXT_ONLY) { + * -- base table name for extension-only table + * char baseTableName[variable]; -- with NUL plus padding for 4-alignment + * + * -- all _MBCSHeader fields except for version and flags are 0 + * } else { + * -- normal base table with optional extension + * + * int32_t stateTable[countStates][256]; + * + * struct _MBCSToUFallback { (fallbacks are sorted by offset) + * uint32_t offset; + * UChar32 codePoint; + * } toUFallbacks[countToUFallbacks]; + * + * uint16_t unicodeCodeUnits[(offsetFromUTable-offsetToUCodeUnits)/2]; + * (padded to an even number of units) + * + * -- stage 1 tables + * if(staticData.unicodeMask&UCNV_HAS_SUPPLEMENTARY) { + * -- stage 1 table for all of Unicode + * uint16_t fromUTable[0x440]; (32-bit-aligned) + * } else { + * -- BMP-only tables have a smaller stage 1 table + * uint16_t fromUTable[0x40]; (32-bit-aligned) + * } + * + * -- stage 2 tables + * length determined by top of stage 1 and bottom of stage 3 tables + * if(outputType==MBCS_OUTPUT_1) { + * -- SBCS: pure indexes + * uint16_t stage 2 indexes[?]; + * } else { + * -- DBCS, MBCS, EBCDIC_STATEFUL, ...: roundtrip flags and indexes + * uint32_t stage 2 flags and indexes[?]; + * } + * + * -- stage 3 tables with byte results + * if(outputType==MBCS_OUTPUT_1) { + * -- SBCS: each 16-bit result contains flags and the result byte, see ucnvmbcs.c + * uint16_t fromUBytes[fromUBytesLength/2]; + * } else { + * -- DBCS, MBCS, EBCDIC_STATEFUL, ... 2/3/4 bytes result, see ucnvmbcs.c + * uint8_t fromUBytes[fromUBytesLength]; or + * uint16_t fromUBytes[fromUBytesLength/2]; or + * uint32_t fromUBytes[fromUBytesLength/4]; + * } + * } + * + * -- extension table, details see ucnv_ext.h + * int32_t indexes[>=32]; ... + */ /* MBCS converter data and state -------------------------------------------- */ +enum { + MBCS_MAX_STATE_COUNT=128 +}; + /** * MBCS action codes for conversions to Unicode. * These values are in bits 23..20 of the state table entries. @@ -98,7 +208,13 @@ enum { MBCS_OUTPUT_4_EUC, /* 9 */ MBCS_OUTPUT_2_SISO=12, /* c */ - MBCS_OUTPUT_2_HZ /* d */ + MBCS_OUTPUT_2_HZ, /* d */ + + MBCS_OUTPUT_EXT_ONLY, /* e */ + + MBCS_OUTPUT_COUNT, + + MBCS_OUTPUT_DBCS_ONLY=0xdb /* runtime-only type for DBCS-only handling of SISO tables */ }; /** @@ -116,7 +232,7 @@ typedef struct { */ typedef struct UConverterMBCSTable { /* toUnicode */ - uint8_t countStates; + uint8_t countStates, dbcsOnlyState, stateTableOwned; uint32_t countToUFallbacks; const int32_t (*stateTable)/*[countStates]*/[256]; @@ -133,35 +249,14 @@ typedef struct UConverterMBCSTable { /* converter name for swaplfnl */ char *swapLFNLName; + + /* extension data */ + struct UConverterSharedData *baseSharedData; + const int32_t *extIndexes; } UConverterMBCSTable; /** - * MBCS data structure as part of a .cnv file: - * - * uint32_t [8]; -- 8 values: - * 0 MBCS version in UVersionInfo format (1.0.0.0) - * 1 countStates - * 2 countToUFallbacks - * 3 offsetToUCodeUnits (offsets are counted from the beginning of this header structure) - * 4 offsetFromUTable - * 5 offsetFromUBytes - * 6 flags, bits: - * 31.. 8 reserved - * 7.. 0 outputType - * 7 fromUBytesLength -- header.version 4.1 (ICU 2.4) and higher - * - * stateTable[countStates][256]; - * - * struct { (fallbacks are sorted by offset) - * uint32_t offset; - * UChar32 codePoint; - * } toUFallbacks[countToUFallbacks]; - * - * uint16_t unicodeCodeUnits[?]; (even number of units or padded) - * - * uint16_t fromUTable[0x440+?]; (32-bit-aligned) - * - * uint8_t fromUBytes[?]; + * MBCS data header. See data format description above. */ typedef struct { UVersionInfo version; @@ -174,11 +269,13 @@ typedef struct { fromUBytesLength; } _MBCSHeader; -/** +/* * This is a simple version of _MBCSGetNextUChar() that is used * by other converter implementations. + * It only returns an "assigned" result if it consumes the entire input. * It does not use state from the converter, nor error codes. * It does not handle the EBCDIC swaplfnl option (set in UConverter). + * It handles conversion extensions but not GB 18030. * * Return value: * U+fffe unassigned @@ -186,16 +283,17 @@ typedef struct { * otherwise the Unicode code point */ U_CFUNC UChar32 -_MBCSSimpleGetNextUChar(UConverterSharedData *sharedData, - const char **pSource, const char *sourceLimit, +ucnv_MBCSSimpleGetNextUChar(UConverterSharedData *sharedData, + const char *source, int32_t length, UBool useFallback); /** * This version of _MBCSSimpleGetNextUChar() is optimized for single-byte, single-state codepages. * It does not handle the EBCDIC swaplfnl option (set in UConverter). + * It does not handle conversion extensions (_extToU()). */ U_CFUNC UChar32 -_MBCSSingleSimpleGetNextUChar(UConverterSharedData *sharedData, +ucnv_MBCSSingleSimpleGetNextUChar(UConverterSharedData *sharedData, uint8_t b, UBool useFallback); /** @@ -205,24 +303,25 @@ _MBCSSingleSimpleGetNextUChar(UConverterSharedData *sharedData, * returns fallback values. */ #define _MBCS_SINGLE_SIMPLE_GET_NEXT_BMP(sharedData, b) \ - (UChar)MBCS_ENTRY_FINAL_VALUE_16((sharedData)->table->mbcs.stateTable[0][(uint8_t)(b)]) + (UChar)MBCS_ENTRY_FINAL_VALUE_16((sharedData)->mbcs.stateTable[0][(uint8_t)(b)]) /** * This is an internal function that allows other converter implementations * to check whether a byte is a lead byte. */ U_CFUNC UBool -_MBCSIsLeadByte(UConverterSharedData *sharedData, char byte); +ucnv_MBCSIsLeadByte(UConverterSharedData *sharedData, char byte); /** This is a macro version of _MBCSIsLeadByte(). */ #define _MBCS_IS_LEAD_BYTE(sharedData, byte) \ - (UBool)MBCS_ENTRY_IS_TRANSITION((sharedData)->table->mbcs.stateTable[0][(uint8_t)(byte)]) + (UBool)MBCS_ENTRY_IS_TRANSITION((sharedData)->mbcs.stateTable[0][(uint8_t)(byte)]) -/** +/* * This is another simple conversion function for internal use by other * conversion implementations. * It does not use the converter state nor call callbacks. * It does not handle the EBCDIC swaplfnl option (set in UConverter). + * It handles conversion extensions but not GB 18030. * * It converts one single Unicode code point into codepage bytes, encoded * as one 32-bit value. The function returns the number of bytes in *pValue: @@ -235,7 +334,7 @@ _MBCSIsLeadByte(UConverterSharedData *sharedData, char byte); * Currently, the function assumes but does not check that 0<=c<=0x10ffff. */ U_CFUNC int32_t -_MBCSFromUChar32(UConverterSharedData *sharedData, +ucnv_MBCSFromUChar32(UConverterSharedData *sharedData, UChar32 c, uint32_t *pValue, UBool useFallback); @@ -246,7 +345,7 @@ _MBCSFromUChar32(UConverterSharedData *sharedData, * It returns the codepage byte for the code point, or -1 if it is unassigned. */ U_CFUNC int32_t -_MBCSSingleFromUChar32(UConverterSharedData *sharedData, +ucnv_MBCSSingleFromUChar32(UConverterSharedData *sharedData, UChar32 c, UBool useFallback); @@ -255,14 +354,44 @@ _MBCSSingleFromUChar32(UConverterSharedData *sharedData, * we cheat a little about the type, returning the old types if appropriate. */ U_CFUNC UConverterType -_MBCSGetType(const UConverter* converter); +ucnv_MBCSGetType(const UConverter* converter); U_CFUNC void -_MBCSFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, +ucnv_MBCSFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, UErrorCode *pErrorCode); U_CFUNC void -_MBCSToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, +ucnv_MBCSToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode); +/* + * Internal function returning a UnicodeSet for toUnicode() conversion. + * Currently only used for ISO-2022-CN, and only handles roundtrip mappings. + * In the future, if we add support for reverse-fallback sets, this function + * needs to be updated, and called for each initial state. + * Does not currently handle extensions. + * Does not empty the set first. + */ +U_CFUNC void +ucnv_MBCSGetUnicodeSetForBytes(const UConverterSharedData *sharedData, + USetAdder *sa, + UConverterUnicodeSet which, + uint8_t state, int32_t lowByte, int32_t highByte, + UErrorCode *pErrorCode); + +/* + * Internal function returning a UnicodeSet for toUnicode() conversion. + * Currently only used for ISO-2022-CN, and only handles roundtrip mappings. + * In the future, if we add support for fallback sets, this function + * needs to be updated. + * Handles extensions. + * Does not empty the set first. + */ +U_CFUNC void +ucnv_MBCSGetUnicodeSetForUnicode(const UConverterSharedData *sharedData, + USetAdder *sa, + UConverterUnicodeSet which, + UErrorCode *pErrorCode); + +#endif #endif diff --git a/icuSources/common/ucnvscsu.c b/icuSources/common/ucnvscsu.c index e02f9a70..1211da7a 100644 --- a/icuSources/common/ucnvscsu.c +++ b/icuSources/common/ucnvscsu.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 2000-2003, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -20,6 +20,9 @@ */ #include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + #include "unicode/ucnv.h" #include "unicode/ucnv_cb.h" #include "ucnv_bld.h" @@ -181,7 +184,7 @@ _SCSUReset(UConverter *cnv, UConverterResetChoice choice) { break; } - cnv->fromUSurrogateLead=0; + cnv->fromUChar32=0; } } @@ -216,8 +219,6 @@ _SCSUClose(UConverter *cnv) { /* SCSU-to-Unicode conversion functions ------------------------------------- */ -/* ### TODO check operator precedence | << + < */ - static void _SCSUToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode) { @@ -272,11 +273,9 @@ _SCSUToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, * The end of the input or output buffer is also handled by the slower loop. * The slow loop jumps (goto) to the fast-path loop again as soon as possible. * - * The callback handling is done by jumping (goto) to the callback section at the end - * of the function. From there, it either jumps to here to continue or to - * the endloop section to clean up and return. + * The callback handling is done by returning with an error code. + * The conversion framework actually calls the callback function. */ -loop: if(isSingleByteMode) { /* fast path for single-byte mode */ if(state==readCommand) { @@ -367,13 +366,20 @@ singleByteMode: goto fastUnicode; } else /* Srs */ { /* callback(illegal) */ - cnv->invalidCharBuffer[0]=b; - cnv->invalidCharLength=1; - goto callback; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + cnv->toUBytes[0]=b; + cnv->toULength=1; + goto endloop; } + + /* store the first byte of a multibyte sequence in toUBytes[] */ + cnv->toUBytes[0]=b; + cnv->toULength=1; break; case quotePairOne: byteOne=b; + cnv->toUBytes[1]=b; + cnv->toULength=2; state=quotePairTwo; break; case quotePairTwo: @@ -426,6 +432,8 @@ singleByteMode: case definePairOne: dynamicWindow=(int8_t)((b>>5)&7); byteOne=(uint8_t)(b&0x1f); + cnv->toUBytes[1]=b; + cnv->toULength=2; state=definePairTwo; break; case definePairTwo: @@ -436,10 +444,9 @@ singleByteMode: case defineOne: if(b==0) { /* callback(illegal): Reserved window offset value 0 */ - cnv->invalidCharBuffer[0]=(char)(SD0+dynamicWindow); - cnv->invalidCharBuffer[1]=b; - cnv->invalidCharLength=2; - goto callback; + cnv->toUBytes[1]=b; + cnv->toULength=2; + goto endloop; } else if(btoUDynamicOffsets[dynamicWindow]=b<<7UL; } else if((uint8_t)(b-gapThreshold)<(reservedStart-gapThreshold)) { @@ -448,10 +455,9 @@ singleByteMode: scsu->toUDynamicOffsets[dynamicWindow]=fixedOffsets[b-fixedThreshold]; } else { /* callback(illegal): Reserved window offset value 0xa8..0xf8 */ - cnv->invalidCharBuffer[0]=(char)(SD0+dynamicWindow); - cnv->invalidCharBuffer[1]=b; - cnv->invalidCharLength=2; - goto callback; + cnv->toUBytes[1]=b; + cnv->toULength=2; + goto endloop; } sourceIndex=nextSourceIndex; state=readCommand; @@ -487,6 +493,8 @@ fastUnicode: case readCommand: if((uint8_t)(b-UC0)>(Urs-UC0)) { byteOne=b; + cnv->toUBytes[0]=b; + cnv->toULength=1; state=quotePairTwo; } else if(/* UC0<=b && */ b<=UC7) { dynamicWindow=(int8_t)(b-UC0); @@ -496,23 +504,32 @@ fastUnicode: } else if(/* UD0<=b && */ b<=UD7) { dynamicWindow=(int8_t)(b-UD0); isSingleByteMode=TRUE; + cnv->toUBytes[0]=b; + cnv->toULength=1; state=defineOne; goto singleByteMode; } else if(b==UDX) { isSingleByteMode=TRUE; + cnv->toUBytes[0]=b; + cnv->toULength=1; state=definePairOne; goto singleByteMode; } else if(b==UQU) { + cnv->toUBytes[0]=b; + cnv->toULength=1; state=quotePairOne; } else /* Urs */ { /* callback(illegal) */ - cnv->invalidCharBuffer[0]=b; - cnv->invalidCharLength=1; - goto callback; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + cnv->toUBytes[0]=b; + cnv->toULength=1; + goto endloop; } break; case quotePairOne: byteOne=b; + cnv->toUBytes[1]=b; + cnv->toULength=2; state=quotePairTwo; break; case quotePairTwo: @@ -528,80 +545,25 @@ fastUnicode: } endloop: - if(pArgs->flush && source>=sourceLimit) { - /* reset the state for the next conversion */ - if(state!=readCommand && U_SUCCESS(*pErrorCode)) { - /* a character byte sequence remains incomplete */ - *pErrorCode=U_TRUNCATED_CHAR_FOUND; - } - _SCSUReset(cnv, UCNV_RESET_TO_UNICODE); - } else { - /* set the converter state back into UConverter */ - scsu->toUIsSingleByteMode=isSingleByteMode; - scsu->toUState=state; - scsu->toUQuoteWindow=quoteWindow; - scsu->toUDynamicWindow=dynamicWindow; - scsu->toUByteOne=byteOne; + /* set the converter state back into UConverter */ + if(U_FAILURE(*pErrorCode) && *pErrorCode!=U_BUFFER_OVERFLOW_ERROR) { + /* reset to deal with the next character */ + state=readCommand; + } else if(state==readCommand) { + /* not in a multi-byte sequence, reset toULength */ + cnv->toULength=0; } + scsu->toUIsSingleByteMode=isSingleByteMode; + scsu->toUState=state; + scsu->toUQuoteWindow=quoteWindow; + scsu->toUDynamicWindow=dynamicWindow; + scsu->toUByteOne=byteOne; -finish: /* write back the updated pointers */ pArgs->source=(const char *)source; pArgs->target=target; pArgs->offsets=offsets; return; - -callback: - /* call the callback function with all the preparations and post-processing */ - /* update the arguments structure */ - pArgs->source=(const char *)source; - pArgs->target=target; - pArgs->offsets=offsets; - /* the current bytes were copied to invalidCharBuffer before the goto callback jump */ - - /* set the converter state in UConverter to deal with the next character */ - scsu->toUIsSingleByteMode=isSingleByteMode; - scsu->toUState=readCommand; - scsu->toUQuoteWindow=quoteWindow; - scsu->toUDynamicWindow=dynamicWindow; - scsu->toUByteOne=0; - - /* call the callback function */ - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - cnv->fromCharErrorBehaviour(cnv->toUContext, pArgs, cnv->invalidCharBuffer, cnv->invalidCharLength, UCNV_ILLEGAL, pErrorCode); - - /* get the converter state from UConverter */ - isSingleByteMode=scsu->toUIsSingleByteMode; - state=scsu->toUState; - quoteWindow=scsu->toUQuoteWindow; - dynamicWindow=scsu->toUDynamicWindow; - byteOne=scsu->toUByteOne; - - /* update target and deal with offsets if necessary */ - offsets=ucnv_updateCallbackOffsets(offsets, (int32_t)(pArgs->target-target), sourceIndex); - target=pArgs->target; - - /* update the source pointer and index */ - sourceIndex=(int32_t)(nextSourceIndex+((const uint8_t *)pArgs->source-source)); - source=(const uint8_t *)pArgs->source; - - /* - * If the callback overflowed the target, then we need to - * stop here with an overflow indication. - */ - if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR) { - goto endloop; - } else if(cnv->UCharErrorBufferLength>0) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - goto endloop; - } else if(U_FAILURE(*pErrorCode)) { - /* break on error */ - _SCSUReset(cnv, UCNV_RESET_TO_UNICODE); - goto finish; - } else { - goto loop; - } } /* @@ -619,7 +581,6 @@ _SCSUToUnicode(UConverterToUnicodeArgs *pArgs, const uint8_t *source, *sourceLimit; UChar *target; const UChar *targetLimit; - UBool isSingleByteMode; uint8_t state, byteOne; int8_t quoteWindow, dynamicWindow; @@ -658,11 +619,9 @@ _SCSUToUnicode(UConverterToUnicodeArgs *pArgs, * The end of the input or output buffer is also handled by the slower loop. * The slow loop jumps (goto) to the fast-path loop again as soon as possible. * - * The callback handling is done by jumping (goto) to the callback section at the end - * of the function. From there, it either jumps to here to continue or to - * the endloop section to clean up and return. + * The callback handling is done by returning with an error code. + * The conversion framework actually calls the callback function. */ -loop: if(isSingleByteMode) { /* fast path for single-byte mode */ if(state==readCommand) { @@ -731,13 +690,20 @@ singleByteMode: goto fastUnicode; } else /* Srs */ { /* callback(illegal) */ - cnv->invalidCharBuffer[0]=b; - cnv->invalidCharLength=1; - goto callback; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + cnv->toUBytes[0]=b; + cnv->toULength=1; + goto endloop; } + + /* store the first byte of a multibyte sequence in toUBytes[] */ + cnv->toUBytes[0]=b; + cnv->toULength=1; break; case quotePairOne: byteOne=b; + cnv->toUBytes[1]=b; + cnv->toULength=2; state=quotePairTwo; break; case quotePairTwo: @@ -772,6 +738,8 @@ singleByteMode: case definePairOne: dynamicWindow=(int8_t)((b>>5)&7); byteOne=(uint8_t)(b&0x1f); + cnv->toUBytes[1]=b; + cnv->toULength=2; state=definePairTwo; break; case definePairTwo: @@ -781,10 +749,9 @@ singleByteMode: case defineOne: if(b==0) { /* callback(illegal): Reserved window offset value 0 */ - cnv->invalidCharBuffer[0]=(char)(SD0+dynamicWindow); - cnv->invalidCharBuffer[1]=b; - cnv->invalidCharLength=2; - goto callback; + cnv->toUBytes[1]=b; + cnv->toULength=2; + goto endloop; } else if(btoUDynamicOffsets[dynamicWindow]=b<<7UL; } else if((uint8_t)(b-gapThreshold)<(reservedStart-gapThreshold)) { @@ -793,10 +760,9 @@ singleByteMode: scsu->toUDynamicOffsets[dynamicWindow]=fixedOffsets[b-fixedThreshold]; } else { /* callback(illegal): Reserved window offset value 0xa8..0xf8 */ - cnv->invalidCharBuffer[0]=(char)(SD0+dynamicWindow); - cnv->invalidCharBuffer[1]=b; - cnv->invalidCharLength=2; - goto callback; + cnv->toUBytes[1]=b; + cnv->toULength=2; + goto endloop; } state=readCommand; goto fastSingle; @@ -825,6 +791,8 @@ fastUnicode: case readCommand: if((uint8_t)(b-UC0)>(Urs-UC0)) { byteOne=b; + cnv->toUBytes[0]=b; + cnv->toULength=1; state=quotePairTwo; } else if(/* UC0<=b && */ b<=UC7) { dynamicWindow=(int8_t)(b-UC0); @@ -833,23 +801,32 @@ fastUnicode: } else if(/* UD0<=b && */ b<=UD7) { dynamicWindow=(int8_t)(b-UD0); isSingleByteMode=TRUE; + cnv->toUBytes[0]=b; + cnv->toULength=1; state=defineOne; goto singleByteMode; } else if(b==UDX) { isSingleByteMode=TRUE; + cnv->toUBytes[0]=b; + cnv->toULength=1; state=definePairOne; goto singleByteMode; } else if(b==UQU) { + cnv->toUBytes[0]=b; + cnv->toULength=1; state=quotePairOne; } else /* Urs */ { /* callback(illegal) */ - cnv->invalidCharBuffer[0]=b; - cnv->invalidCharLength=1; - goto callback; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + cnv->toUBytes[0]=b; + cnv->toULength=1; + goto endloop; } break; case quotePairOne: byteOne=b; + cnv->toUBytes[1]=b; + cnv->toULength=2; state=quotePairTwo; break; case quotePairTwo: @@ -861,80 +838,24 @@ fastUnicode: } endloop: - if(pArgs->flush && source>=sourceLimit) { - /* reset the state for the next conversion */ - if(state!=readCommand && U_SUCCESS(*pErrorCode)) { - /* a character byte sequence remains incomplete */ - *pErrorCode=U_TRUNCATED_CHAR_FOUND; - } - _SCSUReset(cnv, UCNV_RESET_TO_UNICODE); - } else { - /* set the converter state back into UConverter */ - scsu->toUIsSingleByteMode=isSingleByteMode; - scsu->toUState=state; - scsu->toUQuoteWindow=quoteWindow; - scsu->toUDynamicWindow=dynamicWindow; - scsu->toUByteOne=byteOne; + /* set the converter state back into UConverter */ + if(U_FAILURE(*pErrorCode) && *pErrorCode!=U_BUFFER_OVERFLOW_ERROR) { + /* reset to deal with the next character */ + state=readCommand; + } else if(state==readCommand) { + /* not in a multi-byte sequence, reset toULength */ + cnv->toULength=0; } + scsu->toUIsSingleByteMode=isSingleByteMode; + scsu->toUState=state; + scsu->toUQuoteWindow=quoteWindow; + scsu->toUDynamicWindow=dynamicWindow; + scsu->toUByteOne=byteOne; -finish: /* write back the updated pointers */ pArgs->source=(const char *)source; pArgs->target=target; return; - -callback: - /* call the callback function with all the preparations and post-processing */ - /* update the arguments structure */ - pArgs->source=(const char *)source; - pArgs->target=target; - /* the current bytes were copied to invalidCharBuffer before the goto callback jump */ - - /* set the converter state in UConverter to deal with the next character */ - scsu->toUIsSingleByteMode=isSingleByteMode; - scsu->toUState=readCommand; - scsu->toUQuoteWindow=quoteWindow; - scsu->toUDynamicWindow=dynamicWindow; - scsu->toUByteOne=0; - - /* call the callback function */ - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - cnv->fromCharErrorBehaviour(cnv->toUContext, pArgs, cnv->invalidCharBuffer, cnv->invalidCharLength, UCNV_ILLEGAL, pErrorCode); - - /* get the converter state from UConverter */ - isSingleByteMode=scsu->toUIsSingleByteMode; - state=scsu->toUState; - quoteWindow=scsu->toUQuoteWindow; - dynamicWindow=scsu->toUDynamicWindow; - byteOne=scsu->toUByteOne; - - target=pArgs->target; - - source=(const uint8_t *)pArgs->source; - - /* - * If the callback overflowed the target, then we need to - * stop here with an overflow indication. - */ - if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR) { - goto endloop; - } else if(cnv->UCharErrorBufferLength>0) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - goto endloop; - } else if(U_FAILURE(*pErrorCode)) { - /* break on error */ - _SCSUReset(cnv, UCNV_RESET_TO_UNICODE); - goto finish; - } else { - goto loop; - } -} - -static UChar32 -_SCSUGetNextUChar(UConverterToUnicodeArgs *pArgs, - UErrorCode *pErrorCode) { - return ucnv_getNextUCharFromToUImpl(pArgs, _SCSUToUnicode, TRUE, pErrorCode); } /* SCSU-from-Unicode conversion functions ----------------------------------- */ @@ -1095,7 +1016,6 @@ _SCSUFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, int32_t sourceIndex, nextSourceIndex; - uint32_t i; int32_t length; /* variables for compression heuristics */ @@ -1120,7 +1040,7 @@ _SCSUFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, dynamicWindow=scsu->fromUDynamicWindow; currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]; - c=cnv->fromUSurrogateLead; + c=cnv->fromUChar32; /* sourceIndex=-1 if the current character began in the previous buffer */ sourceIndex= c==0 ? 0 : -1; @@ -1188,7 +1108,8 @@ getTrailSingle: } else { /* this is an unmatched lead code unit (1st surrogate) */ /* callback(illegal) */ - goto callback; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + goto endloop; } } else { /* no more input */ @@ -1197,7 +1118,8 @@ getTrailSingle: } else { /* this is an unmatched trail code unit (2nd surrogate) */ /* callback(illegal) */ - goto callback; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + goto endloop; } /* compress supplementary character U+10000..U+10ffff */ @@ -1383,7 +1305,8 @@ getTrailUnicode: } else { /* this is an unmatched lead code unit (1st surrogate) */ /* callback(illegal) */ - goto callback; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + goto endloop; } } else { /* no more input */ @@ -1392,7 +1315,8 @@ getTrailUnicode: } else { /* this is an unmatched trail code unit (2nd surrogate) */ /* callback(illegal) */ - goto callback; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + goto endloop; } /* compress supplementary character */ @@ -1443,22 +1367,12 @@ getTrailUnicode: } endloop: - if(pArgs->flush && source>=sourceLimit) { - /* reset the state for the next conversion */ - if(c!=0 && U_SUCCESS(*pErrorCode)) { - /* a character byte sequence remains incomplete */ - *pErrorCode=U_TRUNCATED_CHAR_FOUND; - } - _SCSUReset(cnv, UCNV_RESET_FROM_UNICODE); - } else { - /* set the converter state back into UConverter */ - scsu->fromUIsSingleByteMode=isSingleByteMode; - scsu->fromUDynamicWindow=dynamicWindow; + /* set the converter state back into UConverter */ + scsu->fromUIsSingleByteMode=isSingleByteMode; + scsu->fromUDynamicWindow=dynamicWindow; - cnv->fromUSurrogateLead=(UChar)c; - } + cnv->fromUChar32=c; -finish: /* write back the updated pointers */ pArgs->source=source; pArgs->target=(char *)target; @@ -1566,59 +1480,6 @@ outputBytes: c=0; goto endloop; } - -callback: - /* call the callback function with all the preparations and post-processing */ - /* update the arguments structure */ - pArgs->source=source; - pArgs->target=(char *)target; - pArgs->offsets=offsets; - /* set the converter state in UConverter to deal with the next character */ - scsu->fromUIsSingleByteMode=isSingleByteMode; - scsu->fromUDynamicWindow=dynamicWindow; - cnv->fromUSurrogateLead=0; - - /* write the code point as code units */ - i=0; - UTF_APPEND_CHAR_UNSAFE(cnv->invalidUCharBuffer, i, c); - cnv->invalidUCharLength=(int8_t)i; - - /* call the callback function */ - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - cnv->fromUCharErrorBehaviour(cnv->fromUContext, pArgs, cnv->invalidUCharBuffer, i, c, UCNV_ILLEGAL, pErrorCode); - - /* get the converter state from UConverter */ - isSingleByteMode=scsu->fromUIsSingleByteMode; - dynamicWindow=scsu->fromUDynamicWindow; - currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]; - c=cnv->fromUSurrogateLead; - - /* update target and deal with offsets if necessary */ - offsets=ucnv_updateCallbackOffsets(offsets, (int32_t)(((uint8_t *)pArgs->target)-target), sourceIndex); - target=(uint8_t *)pArgs->target; - - /* update the source pointer and index */ - sourceIndex=(int32_t)(nextSourceIndex+(pArgs->source-source)); - source=pArgs->source; - targetCapacity=(int32_t)((uint8_t *)pArgs->targetLimit-target); - - /* - * If the callback overflowed the target, then we need to - * stop here with an overflow indication. - */ - if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR) { - goto endloop; - } else if(cnv->charErrorBufferLength>0) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - goto endloop; - } else if(U_FAILURE(*pErrorCode)) { - /* break on error */ - _SCSUReset(cnv, UCNV_RESET_FROM_UNICODE); - goto finish; - } else { - goto loop; - } } /* @@ -1643,7 +1504,6 @@ _SCSUFromUnicode(UConverterFromUnicodeArgs *pArgs, uint32_t c, delta; - uint32_t i; int32_t length; /* variables for compression heuristics */ @@ -1667,7 +1527,7 @@ _SCSUFromUnicode(UConverterFromUnicodeArgs *pArgs, dynamicWindow=scsu->fromUDynamicWindow; currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]; - c=cnv->fromUSurrogateLead; + c=cnv->fromUChar32; /* similar conversion "loop" as in toUnicode */ loop: @@ -1720,7 +1580,8 @@ getTrailSingle: } else { /* this is an unmatched lead code unit (1st surrogate) */ /* callback(illegal) */ - goto callback; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + goto endloop; } } else { /* no more input */ @@ -1729,7 +1590,8 @@ getTrailSingle: } else { /* this is an unmatched trail code unit (2nd surrogate) */ /* callback(illegal) */ - goto callback; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + goto endloop; } /* compress supplementary character U+10000..U+10ffff */ @@ -1902,7 +1764,8 @@ getTrailUnicode: } else { /* this is an unmatched lead code unit (1st surrogate) */ /* callback(illegal) */ - goto callback; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + goto endloop; } } else { /* no more input */ @@ -1911,7 +1774,8 @@ getTrailUnicode: } else { /* this is an unmatched trail code unit (2nd surrogate) */ /* callback(illegal) */ - goto callback; + *pErrorCode=U_ILLEGAL_CHAR_FOUND; + goto endloop; } /* compress supplementary character */ @@ -1961,22 +1825,12 @@ getTrailUnicode: } endloop: - if(pArgs->flush && source>=sourceLimit) { - /* reset the state for the next conversion */ - if(c!=0 && U_SUCCESS(*pErrorCode)) { - /* a character byte sequence remains incomplete */ - *pErrorCode=U_TRUNCATED_CHAR_FOUND; - } - _SCSUReset(cnv, UCNV_RESET_FROM_UNICODE); - } else { - /* set the converter state back into UConverter */ - scsu->fromUIsSingleByteMode=isSingleByteMode; - scsu->fromUDynamicWindow=dynamicWindow; + /* set the converter state back into UConverter */ + scsu->fromUIsSingleByteMode=isSingleByteMode; + scsu->fromUDynamicWindow=dynamicWindow; - cnv->fromUSurrogateLead=(UChar)c; - } + cnv->fromUChar32=c; -finish: /* write back the updated pointers */ pArgs->source=source; pArgs->target=(char *)target; @@ -2052,54 +1906,6 @@ outputBytes: c=0; goto endloop; } - -callback: - /* call the callback function with all the preparations and post-processing */ - /* update the arguments structure */ - pArgs->source=source; - pArgs->target=(char *)target; - /* set the converter state in UConverter to deal with the next character */ - scsu->fromUIsSingleByteMode=isSingleByteMode; - scsu->fromUDynamicWindow=dynamicWindow; - cnv->fromUSurrogateLead=0; - - /* write the code point as code units */ - i=0; - UTF_APPEND_CHAR_UNSAFE(cnv->invalidUCharBuffer, i, c); - cnv->invalidUCharLength=(int8_t)i; - - /* call the callback function */ - *pErrorCode=U_ILLEGAL_CHAR_FOUND; - cnv->fromUCharErrorBehaviour(cnv->fromUContext, pArgs, cnv->invalidUCharBuffer, i, c, UCNV_ILLEGAL, pErrorCode); - - /* get the converter state from UConverter */ - isSingleByteMode=scsu->fromUIsSingleByteMode; - dynamicWindow=scsu->fromUDynamicWindow; - currentOffset=scsu->fromUDynamicOffsets[dynamicWindow]; - c=cnv->fromUSurrogateLead; - - target=(uint8_t *)pArgs->target; - - source=pArgs->source; - targetCapacity=(int32_t)((uint8_t *)pArgs->targetLimit-target); - - /* - * If the callback overflowed the target, then we need to - * stop here with an overflow indication. - */ - if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR) { - goto endloop; - } else if(cnv->charErrorBufferLength>0) { - /* target is full */ - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - goto endloop; - } else if(U_FAILURE(*pErrorCode)) { - /* break on error */ - _SCSUReset(cnv, UCNV_RESET_FROM_UNICODE); - goto finish; - } else { - goto loop; - } } /* miscellaneous ------------------------------------------------------------ */ @@ -2141,7 +1947,7 @@ _SCSUWriteSub(UConverterFromUnicodeArgs *pArgs, } /* structure for SafeClone calculations */ -struct cloneStruct +struct cloneSCSUStruct { UConverter cnv; SCSUData mydata; @@ -2153,8 +1959,8 @@ _SCSUSafeClone(const UConverter *cnv, int32_t *pBufferSize, UErrorCode *status) { - struct cloneStruct * localClone; - int32_t bufferSizeNeeded = sizeof(struct cloneStruct); + struct cloneSCSUStruct * localClone; + int32_t bufferSizeNeeded = sizeof(struct cloneSCSUStruct); if (U_FAILURE(*status)){ return 0; @@ -2165,9 +1971,8 @@ _SCSUSafeClone(const UConverter *cnv, return 0; } - localClone = (struct cloneStruct *)stackBuffer; - uprv_memcpy(&localClone->cnv, cnv, sizeof(UConverter)); - localClone->cnv.isCopyLocal = TRUE; + localClone = (struct cloneSCSUStruct *)stackBuffer; + /* ucnv.c/ucnv_safeClone() copied the main UConverter already */ uprv_memcpy(&localClone->mydata, cnv->extraInfo, sizeof(SCSUData)); localClone->cnv.extraInfo = &localClone->mydata; @@ -2177,9 +1982,6 @@ _SCSUSafeClone(const UConverter *cnv, } - - - static const UConverterImpl _SCSUImpl={ UCNV_SCSU, @@ -2194,7 +1996,7 @@ static const UConverterImpl _SCSUImpl={ _SCSUToUnicodeWithOffsets, _SCSUFromUnicode, _SCSUFromUnicodeWithOffsets, - _SCSUGetNextUChar, + NULL, NULL, _SCSUGetName, @@ -2209,7 +2011,13 @@ static const UConverterStaticData _SCSUStaticData={ 0, /* CCSID for SCSU */ UCNV_IBM, UCNV_SCSU, 1, 3, /* one UChar generates at least 1 byte and at most 3 bytes */ - { 0x0e, 0xff, 0xfd, 0 }, 3, /* ### the subchar really must be written by an SCSU function! */ + /* + * ### TODO the subchar really must be written by an SCSU function + * however, currently SCSU's fromUnicode() never causes errors, therefore + * no callbacks will be called and no subchars written + * See Jitterbug 2837 - RFE: forbid converting surrogate code points in all charsets + */ + { 0x0e, 0xff, 0xfd, 0 }, 3, FALSE, FALSE, 0, 0, @@ -2222,4 +2030,4 @@ const UConverterSharedData _SCSUData={ 0 }; -/* ### clarify: if an error occurs, does a converter reset itself? or is it in a defined or undefined state? */ +#endif diff --git a/icuSources/common/ucol_swp.c b/icuSources/common/ucol_swp.c new file mode 100644 index 00000000..18e2c2ca --- /dev/null +++ b/icuSources/common/ucol_swp.c @@ -0,0 +1,327 @@ +/* +******************************************************************************* +* +* Copyright (C) 2003, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: ucol_swp.c +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2003sep10 +* created by: Markus W. Scherer +* +* Swap collation binaries. +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_COLLATION + +#include "unicode/udata.h" /* UDataInfo */ +#include "cmemory.h" +#include "utrie.h" +#include "udataswp.h" +#include "ucol_imp.h" +#include "ucol_swp.h" + +/* swap a header-less collation binary, inside a resource bundle or ucadata.icu */ +U_CAPI int32_t U_EXPORT2 +ucol_swapBinary(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const uint8_t *inBytes; + uint8_t *outBytes; + + const UCATableHeader *inHeader; + UCATableHeader *outHeader; + UCATableHeader header={ 0 }; + + uint32_t count; + + /* argument checking in case we were not called from ucol_swap() */ + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + if(ds==NULL || inData==NULL || length<-1 || (length>0 && outData==NULL)) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + inBytes=(const uint8_t *)inData; + outBytes=(uint8_t *)outData; + + inHeader=(const UCATableHeader *)inData; + outHeader=(UCATableHeader *)outData; + + /* + * The collation binary must contain at least the UCATableHeader, + * starting with its size field. + * sizeof(UCATableHeader)==42*4 in ICU 2.8 + * check the length against the header size before reading the size field + */ + if(length<0) { + header.size=udata_readInt32(ds, inHeader->size); + } else if((length<(42*4) || length<(header.size=udata_readInt32(ds, inHeader->size)))) { + udata_printError(ds, "ucol_swapBinary(): too few bytes (%d after header) for collation data\n", + length); + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + + header.magic=ds->readUInt32(inHeader->magic); + if(!( + header.magic==UCOL_HEADER_MAGIC && + inHeader->formatVersion[0]==2 && + inHeader->formatVersion[1]>=3 + )) { + udata_printError(ds, "ucol_swapBinary(): magic 0x%08x or format version %02x.%02x is not a collation binary\n", + header.magic, + inHeader->formatVersion[0], inHeader->formatVersion[1]); + *pErrorCode=U_UNSUPPORTED_ERROR; + return 0; + } + + if(inHeader->isBigEndian!=ds->inIsBigEndian || inHeader->charSetFamily!=ds->inCharset) { + udata_printError(ds, "ucol_swapBinary(): endianness %d or charset %d does not match the swapper\n", + inHeader->isBigEndian, inHeader->charSetFamily); + *pErrorCode=U_INVALID_FORMAT_ERROR; + return 0; + } + + if(length>=0) { + /* copy everything, takes care of data that needs no swapping */ + if(inBytes!=outBytes) { + uprv_memcpy(outBytes, inBytes, header.size); + } + + /* swap the necessary pieces in the order of their occurrence in the data */ + + /* read more of the UCATableHeader (the size field was read above) */ + header.options= ds->readUInt32(inHeader->options); + header.UCAConsts= ds->readUInt32(inHeader->UCAConsts); + header.contractionUCACombos= ds->readUInt32(inHeader->contractionUCACombos); + header.mappingPosition= ds->readUInt32(inHeader->mappingPosition); + header.expansion= ds->readUInt32(inHeader->expansion); + header.contractionIndex= ds->readUInt32(inHeader->contractionIndex); + header.contractionCEs= ds->readUInt32(inHeader->contractionCEs); + header.contractionSize= ds->readUInt32(inHeader->contractionSize); + header.endExpansionCE= ds->readUInt32(inHeader->endExpansionCE); + header.expansionCESize= ds->readUInt32(inHeader->expansionCESize); + header.endExpansionCECount= udata_readInt32(ds, inHeader->endExpansionCECount); + header.contractionUCACombosSize=udata_readInt32(ds, inHeader->contractionUCACombosSize); + + /* swap the 32-bit integers in the header */ + ds->swapArray32(ds, inHeader, (int32_t)((const char *)&inHeader->jamoSpecial-(const char *)inHeader), + outHeader, pErrorCode); + + /* set the output platform properties */ + outHeader->isBigEndian=ds->outIsBigEndian; + outHeader->charSetFamily=ds->outCharset; + + /* swap the options */ + if(header.options!=0) { + ds->swapArray32(ds, inBytes+header.options, header.expansion-header.options, + outBytes+header.options, pErrorCode); + } + + /* swap the expansions */ + if(header.mappingPosition!=0 && header.expansion!=0) { + if(header.contractionIndex!=0) { + /* expansions bounded by contractions */ + count=header.contractionIndex-header.expansion; + } else { + /* no contractions: expansions bounded by the main trie */ + count=header.mappingPosition-header.expansion; + } + ds->swapArray32(ds, inBytes+header.expansion, (int32_t)count, + outBytes+header.expansion, pErrorCode); + } + + /* swap the contractions */ + if(header.contractionSize!=0) { + /* contractionIndex: UChar[] */ + ds->swapArray16(ds, inBytes+header.contractionIndex, header.contractionSize*2, + outBytes+header.contractionIndex, pErrorCode); + + /* contractionCEs: CEs[] */ + ds->swapArray32(ds, inBytes+header.contractionCEs, header.contractionSize*4, + outBytes+header.contractionCEs, pErrorCode); + } + + /* swap the main trie */ + if(header.mappingPosition!=0) { + count=header.endExpansionCE-header.mappingPosition; + utrie_swap(ds, inBytes+header.mappingPosition, (int32_t)count, + outBytes+header.mappingPosition, pErrorCode); + } + + /* swap the max expansion table */ + if(header.endExpansionCECount!=0) { + ds->swapArray32(ds, inBytes+header.endExpansionCE, header.endExpansionCECount*4, + outBytes+header.endExpansionCE, pErrorCode); + } + + /* expansionCESize, unsafeCP, contrEndCP: uint8_t[], no need to swap */ + + /* swap UCA constants */ + if(header.UCAConsts!=0) { + /* + * if UCAConsts!=0 then contractionUCACombos because we are swapping + * the UCA data file, and we know that the UCA contains contractions + */ + count=header.contractionUCACombos-header.UCAConsts; + ds->swapArray32(ds, inBytes+header.UCAConsts, header.contractionUCACombos-header.UCAConsts, + outBytes+header.UCAConsts, pErrorCode); + } + + /* swap UCA contractions */ + if(header.contractionUCACombosSize!=0) { + count=header.contractionUCACombosSize*inHeader->contractionUCACombosWidth*U_SIZEOF_UCHAR; + ds->swapArray16(ds, inBytes+header.contractionUCACombos, (int32_t)count, + outBytes+header.contractionUCACombos, pErrorCode); + } + } + + return header.size; +} + +/* swap ICU collation data like ucadata.icu */ +U_CAPI int32_t U_EXPORT2 +ucol_swap(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const UDataInfo *pInfo; + int32_t headerSize, collationSize; + + /* udata_swapDataHeader checks the arguments */ + headerSize=udata_swapDataHeader(ds, inData, length, outData, pErrorCode); + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + + /* check data format and format version */ + pInfo=(const UDataInfo *)((const char *)inData+4); + if(!( + pInfo->dataFormat[0]==0x55 && /* dataFormat="UCol" */ + pInfo->dataFormat[1]==0x43 && + pInfo->dataFormat[2]==0x6f && + pInfo->dataFormat[3]==0x6c && + pInfo->formatVersion[0]==2 && + pInfo->formatVersion[1]>=3 + )) { + udata_printError(ds, "ucol_swap(): data format %02x.%02x.%02x.%02x (format version %02x.%02x) is not a collation file\n", + pInfo->dataFormat[0], pInfo->dataFormat[1], + pInfo->dataFormat[2], pInfo->dataFormat[3], + pInfo->formatVersion[0], pInfo->formatVersion[1]); + *pErrorCode=U_UNSUPPORTED_ERROR; + return 0; + } + + collationSize=ucol_swapBinary(ds, + (const char *)inData+headerSize, + length>=0 ? length-headerSize : -1, + (char *)outData+headerSize, + pErrorCode); + if(U_SUCCESS(*pErrorCode)) { + return headerSize+collationSize; + } else { + return 0; + } +} + +/* swap inverse UCA collation data (invuca.icu) */ +U_CAPI int32_t U_EXPORT2 +ucol_swapInverseUCA(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const UDataInfo *pInfo; + int32_t headerSize; + + const uint8_t *inBytes; + uint8_t *outBytes; + + const InverseUCATableHeader *inHeader; + InverseUCATableHeader *outHeader; + InverseUCATableHeader header={ 0 }; + + /* udata_swapDataHeader checks the arguments */ + headerSize=udata_swapDataHeader(ds, inData, length, outData, pErrorCode); + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + + /* check data format and format version */ + pInfo=(const UDataInfo *)((const char *)inData+4); + if(!( + pInfo->dataFormat[0]==0x49 && /* dataFormat="InvC" */ + pInfo->dataFormat[1]==0x6e && + pInfo->dataFormat[2]==0x76 && + pInfo->dataFormat[3]==0x43 && + pInfo->formatVersion[0]==2 && + pInfo->formatVersion[1]>=1 + )) { + udata_printError(ds, "ucol_swapInverseUCA(): data format %02x.%02x.%02x.%02x (format version %02x.%02x) is not an inverse UCA collation file\n", + pInfo->dataFormat[0], pInfo->dataFormat[1], + pInfo->dataFormat[2], pInfo->dataFormat[3], + pInfo->formatVersion[0], pInfo->formatVersion[1]); + *pErrorCode=U_UNSUPPORTED_ERROR; + return 0; + } + + inBytes=(const uint8_t *)inData+headerSize; + outBytes=(uint8_t *)outData+headerSize; + + inHeader=(const InverseUCATableHeader *)inBytes; + outHeader=(InverseUCATableHeader *)outBytes; + + /* + * The inverse UCA collation binary must contain at least the InverseUCATableHeader, + * starting with its size field. + * sizeof(UCATableHeader)==8*4 in ICU 2.8 + * check the length against the header size before reading the size field + */ + if(length<0) { + header.byteSize=udata_readInt32(ds, inHeader->byteSize); + } else if( + ((length-headerSize)<(8*4) || + (uint32_t)(length-headerSize)<(header.byteSize=udata_readInt32(ds, inHeader->byteSize))) + ) { + udata_printError(ds, "ucol_swapInverseUCA(): too few bytes (%d after header) for inverse UCA collation data\n", + length); + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + + if(length>=0) { + /* copy everything, takes care of data that needs no swapping */ + if(inBytes!=outBytes) { + uprv_memcpy(outBytes, inBytes, header.byteSize); + } + + /* swap the necessary pieces in the order of their occurrence in the data */ + + /* read more of the InverseUCATableHeader (the byteSize field was read above) */ + header.tableSize= ds->readUInt32(inHeader->tableSize); + header.contsSize= ds->readUInt32(inHeader->contsSize); + header.table= ds->readUInt32(inHeader->table); + header.conts= ds->readUInt32(inHeader->conts); + + /* swap the 32-bit integers in the header */ + ds->swapArray32(ds, inHeader, 5*4, outHeader, pErrorCode); + + /* swap the inverse table; tableSize counts uint32_t[3] rows */ + ds->swapArray32(ds, inBytes+header.table, header.tableSize*3*4, + outBytes+header.table, pErrorCode); + + /* swap the continuation table; contsSize counts UChars */ + ds->swapArray16(ds, inBytes+header.conts, header.contsSize*U_SIZEOF_UCHAR, + outBytes+header.conts, pErrorCode); + } + + return headerSize+header.byteSize; +} + +#endif /* #if !UCONFIG_NO_COLLATION */ diff --git a/icuSources/common/ucol_swp.h b/icuSources/common/ucol_swp.h new file mode 100644 index 00000000..e0cd6e47 --- /dev/null +++ b/icuSources/common/ucol_swp.h @@ -0,0 +1,58 @@ +/* +******************************************************************************* +* +* Copyright (C) 2003, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: ucol_swp.h +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2003sep10 +* created by: Markus W. Scherer +* +* Swap collation binaries. +*/ + +#ifndef __UCOL_SWP_H__ +#define __UCOL_SWP_H__ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_COLLATION + +#include "udataswp.h" + +/** + * Swap a header-less collation binary, inside a resource bundle or ucadata.icu. + * See udataswp.h. + * @internal + */ +U_CAPI int32_t U_EXPORT2 +ucol_swapBinary(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode); + +/** + * Swap ICU collation data like ucadata.icu. See udataswp.h. + * @internal + */ +U_CAPI int32_t U_EXPORT2 +ucol_swap(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode); + +/** + * Swap inverse UCA collation data (invuca.icu). See udataswp.h. + * @internal + */ +U_CAPI int32_t U_EXPORT2 +ucol_swapInverseUCA(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode); + +#endif /* #if !UCONFIG_NO_COLLATION */ + +#endif diff --git a/icuSources/common/udata.c b/icuSources/common/udata.c index b70896a6..35936500 100644 --- a/icuSources/common/udata.c +++ b/icuSources/common/udata.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -23,6 +23,7 @@ #include "unicode/uversion.h" #include "uhash.h" #include "ucln_cmn.h" +#include "putilimp.h" #include "udatamem.h" #include "umapfile.h" @@ -57,8 +58,6 @@ /* If you are excruciatingly bored turn this on .. */ /* #define UDATA_DEBUG 1 */ - - #if defined(UDATA_DEBUG) # include #endif @@ -80,8 +79,8 @@ static UDataMemory *gStubICUData = NULL; /* If gCommonICUData does get upda static UHashtable *gCommonDataCache = NULL; /* Global hash table of opened ICU data files. */ -UBool -udata_cleanup() +static UBool U_CALLCONV +udata_cleanup(void) { if (gCommonDataCache) { /* Delete the cache of user data mappings. */ uhash_close(gCommonDataCache); /* Table owns the contents, and will delete them. */ @@ -130,6 +129,7 @@ setCommonICUData(UDataMemory *pData, /* The new common data. Belongs to ca if (gCommonICUData==oldData) { gStubICUData = gCommonICUData; /* remember the old Common Data, so it can be cleaned up. */ gCommonICUData = newCommonData; + ucln_common_registerCleanup(UCLN_COMMON_UDATA, udata_cleanup); } else { if (warn==TRUE) { @@ -151,6 +151,7 @@ findBasename(const char *path) { } } +#ifdef UDATA_DEBUG static const char * packageNameFromPath(const char *path) { @@ -166,7 +167,7 @@ packageNameFromPath(const char *path) return path; } - +#endif /*----------------------------------------------------------------------* * * @@ -204,17 +205,31 @@ static void U_EXPORT2 U_CALLCONV DataCacheElement_deleter(void *pDCEl) { * Lazy create it if it doesn't yet exist. */ static UHashtable *udata_getHashTable() { - UErrorCode err = U_ZERO_ERROR; + UErrorCode err = U_ZERO_ERROR; + UBool cacheIsInitialized; + UHashtable *tHT = NULL; - if (gCommonDataCache != NULL) { + umtx_lock(NULL); + cacheIsInitialized = (gCommonDataCache != NULL); + umtx_unlock(NULL); + + if (cacheIsInitialized) { return gCommonDataCache; } + + tHT = uhash_open(uhash_hashChars, uhash_compareChars, &err); + uhash_setValueDeleter(tHT, DataCacheElement_deleter); + umtx_lock(NULL); if (gCommonDataCache == NULL) { - gCommonDataCache = uhash_open(uhash_hashChars, uhash_compareChars, &err); - uhash_setValueDeleter(gCommonDataCache, DataCacheElement_deleter); + gCommonDataCache = tHT; + tHT = NULL; + ucln_common_registerCleanup(UCLN_COMMON_UDATA, udata_cleanup); } umtx_unlock(NULL); + if (tHT != NULL) { + uhash_close(tHT); + } if (U_FAILURE(err)) { return NULL; /* TODO: handle this error better. */ @@ -252,6 +267,7 @@ static UDataMemory *udata_cacheDataItem(const char *path, UDataMemory *item, UEr int32_t nameLen; UHashtable *htable; UDataMemory *oldValue = NULL; + UErrorCode subErr = U_ZERO_ERROR; if (U_FAILURE(*pErr)) { return NULL; @@ -286,22 +302,24 @@ static UDataMemory *udata_cacheDataItem(const char *path, UDataMemory *item, UEr umtx_lock(NULL); oldValue = uhash_get(htable, path); if (oldValue != NULL) { - *pErr = U_USING_DEFAULT_WARNING; } + subErr = U_USING_DEFAULT_WARNING; + } else { uhash_put( htable, newElement->name, /* Key */ newElement, /* Value */ - pErr); + &subErr); } umtx_unlock(NULL); #ifdef UDATA_DEBUG - fprintf(stderr, "Cache: [%s] <<< %p : %s\n", newElement->name, - newElement->item, u_errorName(*pErr)); + fprintf(stderr, "Cache: [%s] <<< %p : %s. vFunc=%p\n", newElement->name, + newElement->item, u_errorName(subErr), newElement->item->vFuncs); #endif - if (*pErr == U_USING_DEFAULT_WARNING || U_FAILURE(*pErr)) { + if (subErr == U_USING_DEFAULT_WARNING || U_FAILURE(subErr)) { + *pErr = subErr; /* copy sub err unto fillin ONLY if something happens. */ uprv_free(newElement->name); uprv_free(newElement->item); uprv_free(newElement); @@ -313,6 +331,82 @@ static UDataMemory *udata_cacheDataItem(const char *path, UDataMemory *item, UEr +/*------------------------------------------------------------------------------- + * + * TinyString - a small set of really simple string functions, for + * the purpose of consolidating buffer overflow code in one place + * + * Use wherever you would otherwise declare a fixed sized char[xx] buffer. + * Do non-growing ops by accessing fields of struct directly + * Grow using the append function to automatically extend buffer + * as needed. + * + *-------------------------------------------------------------------------------*/ +typedef struct TinyString { + char *s; + int32_t length; + char fStaticBuf[100]; + int32_t fCapacity; +} TinyString; + +static void TinyString_init(TinyString *This) { + This->s = This->fStaticBuf; + *This->s = 0; + This->length = 0; + This->fCapacity = sizeof(This->fStaticBuf)-1; +} + +static void TinyString_append(TinyString *This, const char *what) { + int32_t newLen; + newLen = This->length + (int32_t)uprv_strlen(what); + if (newLen >= This->fCapacity) { + int32_t newCapacity = newLen * 2; + char *newBuf = (char *)uprv_malloc(newCapacity+1); + if (newBuf != NULL) { + uprv_strcpy(newBuf, This->s); + if (This->s != This->fStaticBuf) { + uprv_free(This->s); + } + This->s = newBuf; + This->fCapacity = newCapacity; + } + } + if (newLen < This->fCapacity) { + uprv_strcat(This->s+This->length, what); + This->length = newLen; + } +} + +static void TinyString_appendn(TinyString *This, const char *what, int32_t n) { + int32_t newLen; + newLen = This->length + n; + if (newLen >= This->fCapacity) { + int32_t newCapacity = newLen * 2; + char *newBuf = (char *)uprv_malloc(newCapacity+1); + if (newBuf != NULL) { + uprv_strcpy(newBuf, This->s); + if (This->s != This->fStaticBuf) { + uprv_free(This->s); + } + This->s = newBuf; + This->fCapacity = newCapacity; + } + } + if (newLen < This->fCapacity) { + uprv_strncat(This->s+This->length, what, n); + This->length = newLen; + } +} + +static void TinyString_dt(TinyString *This) { + if (This->s != This->fStaticBuf) { + uprv_free(This->s); + } + TinyString_init(This); +} + + + /*----------------------------------------------------------------------*============== * * @@ -321,7 +415,8 @@ static UDataMemory *udata_cacheDataItem(const char *path, UDataMemory *item, UEr * * *----------------------------------------------------------------------*/ -#define U_DATA_PATHITER_BUFSIZ 1024 /* paths can't be longer than this */ +#define U_DATA_PATHITER_BUFSIZ 128 /* Size of local buffer for paths */ + /* Overflow causes malloc of larger buf */ typedef struct { @@ -330,12 +425,21 @@ typedef struct const char *basename; /* item's basename (icudt22e_mt.res)*/ const char *suffix; /* item suffix (can be null) */ - uint32_t basenameLen; /* length of basename */ - char itemPath[U_DATA_PATHITER_BUFSIZ]; /* path passed in with item name */ + uint32_t basenameLen; /* length of basename */ + + char *itemPath; /* path passed in with item name */ + char itemPathBuf[U_DATA_PATHITER_BUFSIZ]; + + char *pathBuffer; /* output path for this it'ion */ + char pathBufferA[U_DATA_PATHITER_BUFSIZ]; - char pathBuffer[U_DATA_PATHITER_BUFSIZ]; /* output path for this it'ion */ + char *packageStub; /* example: "/icudt28b". Will ignore that leaf in set paths. */ + char packageStubBuf[U_DATA_PATHITER_BUFSIZ]; + uint32_t packageStubLen; - UBool checkLastFour; /* if TRUE then allow paths such as '/foo/myapp.dat' to match, checks last 4 chars of suffix with last 4 of path, then previous chars. */ + UBool checkLastFour; /* if TRUE then allow paths such as '/foo/myapp.dat' + * to match, checks last 4 chars of suffix with + * last 4 of path, then previous chars. */ } UDataPathIterator; @@ -345,13 +449,17 @@ typedef struct * * @param iter The iterator to be initialized. Its current state does not matter. * @param path The full pathname to be iterated over. If NULL, defaults to U_ICUDATA_NAME + * @param pkg Package which is being searched for, ex "icudt28l". Will ignore leave directories such as /icudt28l * @param item Item to be searched for. Can include full path, such as /a/b/foo.dat - * @param suffix Optional item suffix, if not-null (ex. ".dat") then 'path' can contain 'item' explicitly. Ex: 'stuff.dat' would be found in '/a/foo:/tmp/stuff.dat:/bar/baz' as item #2. '/blarg/stuff.dat' would also be found. + * @param suffix Optional item suffix, if not-null (ex. ".dat") then 'path' can contain 'item' explicitly. + * Ex: 'stuff.dat' would be found in '/a/foo:/tmp/stuff.dat:/bar/baz' as item #2. + * '/blarg/stuff.dat' would also be found. */ -static void udata_pathiter_init(UDataPathIterator *iter, const char *path, const char *item, const char *suffix, UBool doCheckLastFour) +static void udata_pathiter_init(UDataPathIterator *iter, const char *path, const char *pkg, + const char *item, const char *suffix, UBool doCheckLastFour) { #ifdef UDATA_DEBUG - fprintf(stderr, "SUFFIX1=%s [%p]\n", suffix, suffix); + fprintf(stderr, "SUFFIX1=%s PATH=%s\n", suffix, path); #endif /** Path **/ if(path == NULL) { @@ -360,9 +468,29 @@ static void udata_pathiter_init(UDataPathIterator *iter, const char *path, const iter->path = path; } + /** Package **/ + if(pkg == NULL) { + iter->packageStubLen = 0; + iter->packageStub=iter->packageStubBuf; + iter->packageStub[0] = 0; + } else { + if(uprv_strlen(pkg) + 2 > U_DATA_PATHITER_BUFSIZ) { + iter->packageStub = uprv_malloc(uprv_strlen(pkg)+2); + } else { + iter->packageStub = iter->packageStubBuf; + } + iter->packageStub[0] = U_FILE_SEP_CHAR; + uprv_strcpy(iter->packageStub+1, pkg); + iter->packageStubLen = (int32_t)uprv_strlen(iter->packageStub); + +#ifdef UDATA_DEBUG + fprintf(stderr, "STUB=%s [%d]\n", iter->packageStub, iter->packageStubLen); +#endif + } + /** Item **/ iter->basename = findBasename(item); - iter->basenameLen = uprv_strlen(iter->basename); + iter->basenameLen = (int32_t)uprv_strlen(iter->basename); if(iter->basename == NULL) { iter->nextPath = NULL; @@ -370,26 +498,53 @@ static void udata_pathiter_init(UDataPathIterator *iter, const char *path, const } /** Item path **/ + iter->itemPath = iter->itemPathBuf; if(iter->basename == item) { iter->itemPath[0] = 0; iter->nextPath = iter->path; } else { - uprv_strncpy(iter->itemPath, item, iter->basename - item); - iter->itemPath[iter->basename-item]=0; + int32_t itemPathLen = (int32_t)(iter->basename-item); + if (itemPathLen >= U_DATA_PATHITER_BUFSIZ) { + char *t = (char *)uprv_malloc(itemPathLen+1); + if (t != NULL) { + iter->itemPath = t; + } else { + /* Malloc failed. Ignore the itemPath. */ + itemPathLen = 0; + } + } + uprv_strncpy(iter->itemPath, item, itemPathLen); + iter->itemPath[itemPathLen]=0; iter->nextPath = iter->itemPath; } #ifdef UDATA_DEBUG - fprintf(stderr, "SUFFIX=%s [%p]\n", suffix, suffix); + fprintf(stderr, "SUFFIX=%s [%p]\n", suffix, suffix); #endif + /** Suffix **/ if(suffix != NULL) { iter->suffix = suffix; } else { iter->suffix = ""; } - + iter->checkLastFour = doCheckLastFour; + /* pathBuffer will hold the output path strings returned by the this iterator + * Get an upper bound of possible string size, and make sure that the buffer + * is big enough (sum of length of each piece, 2 extra delimiters, + trailing NULL) */ + { + int32_t maxPathLen = (int32_t)uprv_strlen(iter->path) + uprv_strlen(item) + uprv_strlen(iter->suffix) + iter->packageStubLen + 3; + iter->pathBuffer = iter->pathBufferA; + if (maxPathLen >= U_DATA_PATHITER_BUFSIZ) { + iter->pathBuffer = (char *)uprv_malloc(maxPathLen); + if (iter->pathBuffer == NULL) { + iter->pathBuffer = iter->pathBufferA; + iter->path = ""; + } + } + } + #ifdef UDATA_DEBUG fprintf(stderr, "%p: init %s -> [path=%s], [base=%s], [suff=%s], [itempath=%s], [nextpath=%s], [checklast4=%s]\n", iter, @@ -414,7 +569,7 @@ static void udata_pathiter_init(UDataPathIterator *iter, const char *path, const static const char *udata_pathiter_next(UDataPathIterator *iter, int32_t *outPathLen) { const char *path = NULL; - int32_t pathLen = 0; + uint32_t pathLen = 0; const char *pathBasename; if(outPathLen != NULL) { @@ -431,16 +586,16 @@ static const char *udata_pathiter_next(UDataPathIterator *iter, int32_t *outPath if(iter->nextPath == iter->itemPath) { /* we were processing item's path. */ iter->nextPath = iter->path; /* start with regular path next tm. */ - pathLen = uprv_strlen(path); + pathLen = (int32_t)uprv_strlen(path); } else { /* fix up next for next time */ iter->nextPath = uprv_strchr(path, U_PATH_SEP_CHAR); if(iter->nextPath == NULL) { /* segment: entire path */ - pathLen = uprv_strlen(path); + pathLen = (int32_t)uprv_strlen(path); } else { /* segment: until next segment */ - pathLen = iter->nextPath - path; + pathLen = (int32_t)(iter->nextPath - path); if(*iter->nextPath) { /* skip divider */ iter->nextPath ++; } @@ -455,7 +610,7 @@ static const char *udata_pathiter_next(UDataPathIterator *iter, int32_t *outPath fprintf(stderr, "rest of path (IDD) = %s\n", path); fprintf(stderr, " "); { - int qqq; + uint32_t qqq; for(qqq=0;qqqpathBuffer, path, pathLen); iter->pathBuffer[pathLen] = 0; @@ -484,8 +638,7 @@ static const char *udata_pathiter_next(UDataPathIterator *iter, int32_t *outPath } else { /* regular dir path */ - if(iter->pathBuffer[pathLen-1] != U_FILE_SEP_CHAR) /* trailing sep */ - { + if(iter->pathBuffer[pathLen-1] != U_FILE_SEP_CHAR) { if((pathLen>=4) && uprv_strncmp(iter->pathBuffer+(pathLen-4), ".dat", 4) == 0) { @@ -494,21 +647,31 @@ static const char *udata_pathiter_next(UDataPathIterator *iter, int32_t *outPath #endif continue; } + + /* Check if it is a directory with the same name as our package */ + if(iter->packageStubLen && + (pathLen > iter->packageStubLen) && + !uprv_strcmp(iter->pathBuffer + pathLen - iter->packageStubLen, iter->packageStub)) { +#ifdef UDATA_DEBUG + fprintf(stderr, "Found stub %s ( will add package %s of len %d)\n", iter->packageStub, iter->basename, iter->basenameLen); +#endif + pathLen -= iter->packageStubLen; + } iter->pathBuffer[pathLen++] = U_FILE_SEP_CHAR; } uprv_strncpy(iter->pathBuffer + pathLen, /* + basename */ - iter->basename, - iter->basenameLen); + iter->packageStub+1, + iter->packageStubLen-1); - pathLen += iter->basenameLen; + pathLen += iter->packageStubLen-1; if(*iter->suffix) /* tack on suffix */ { uprv_strcpy(iter->pathBuffer + pathLen, iter->suffix); - pathLen += uprv_strlen(iter->suffix); + pathLen += (int32_t)uprv_strlen(iter->suffix); } } @@ -531,6 +694,20 @@ static const char *udata_pathiter_next(UDataPathIterator *iter, int32_t *outPath } +/* + * Path Iterator Destructor. Clean up any allocated storage + */ +static void udata_pathiter_dt(UDataPathIterator *iter) { + if (iter->itemPath != iter->itemPathBuf) { + uprv_free(iter->itemPath); + iter->itemPath = NULL; + } + if (iter->pathBuffer != iter->pathBufferA) { + uprv_free(iter->pathBuffer); + iter->pathBuffer = NULL; + } +} + /* ==================================================================================*/ @@ -541,7 +718,7 @@ static const char *udata_pathiter_next(UDataPathIterator *iter, int32_t *outPath * our common data. * * * *----------------------------------------------------------------------*/ -extern const DataHeader U_IMPORT U_ICUDATA_ENTRY_POINT; +extern const DataHeader U_DATA_API U_ICUDATA_ENTRY_POINT; /*----------------------------------------------------------------------* @@ -562,7 +739,6 @@ openCommonData(const char *path, /* Path from OpenCHoice? */ UDataMemory tData; UDataPathIterator iter; const char *pathBuffer; - int32_t pathLen; const char *inBasename; if (U_FAILURE(*pErrorCode)) { @@ -618,10 +794,10 @@ openCommonData(const char *path, /* Path from OpenCHoice? */ * Hunt it down, trying all the path locations */ - udata_pathiter_init(&iter, u_getDataDirectory(), path, ".dat", TRUE); + udata_pathiter_init(&iter, u_getDataDirectory(), inBasename, path, ".dat", TRUE); while((UDataMemory_isLoaded(&tData)==FALSE) && - (pathBuffer = udata_pathiter_next(&iter, &pathLen)) != NULL) + (pathBuffer = udata_pathiter_next(&iter, NULL)) != NULL) { #ifdef UDATA_DEBUG fprintf(stderr, "ocd: trying path %s - ", pathBuffer); @@ -631,6 +807,7 @@ openCommonData(const char *path, /* Path from OpenCHoice? */ fprintf(stderr, "%s\n", UDataMemory_isLoaded(&tData)?"LOADED":"not loaded"); #endif } + udata_pathiter_dt(&iter); /* Note: this call may invalidate "pathBuffer" */ #if defined(OS390_STUBDATA) && defined(OS390BATCH) if (!UDataMemory_isLoaded(&tData)) { @@ -824,9 +1001,8 @@ checkDataItem if(pHeader->dataHeader.magic1==0xda && pHeader->dataHeader.magic2==0x27 && - pHeader->info.isBigEndian==U_IS_BIG_ENDIAN && (isAcceptable==NULL || isAcceptable(context, type, name, &pHeader->info)) - ) { + ) { rDataMem=UDataMemory_createNewInstance(fatalErr); if (U_FAILURE(*fatalErr)) { return NULL; @@ -881,42 +1057,150 @@ doOpenChoice(const char *path, const char *type, const char *name, UDataMemoryIsAcceptable *isAcceptable, void *context, UErrorCode *pErrorCode) { - UDataPathIterator iter; - const char *pathBuffer; - int32_t pathLen; + UDataMemory *retVal = NULL; + + const char *pathBuffer; + + TinyString tocEntryName; /* entry name in tree format. ex: 'icudt28b/coll/ar.res' */ + TinyString tocEntryPath; /* entry name in path format. ex: 'icudt28b\\coll\\ar.res' */ + TinyString oldIndFileName; /* ex: icudt28b_ar.res */ + TinyString oldStylePath; + TinyString oldStylePathBasename; + + TinyString pkgName; + TinyString treeName; +#if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR) + TinyString altSepPath; +#endif - char tocEntryName[100]; - char oldStylePath[1024]; - char oldStylePathBasename[100]; const char *dataPath; const char *tocEntrySuffix; + int32_t tocEntrySuffixIndex; + const char *tocEntryPathSuffix; UDataMemory dataMemory; UDataMemory *pCommonData; UDataMemory *pEntryData; const DataHeader *pHeader; const char *inBasename; UErrorCode errorCode=U_ZERO_ERROR; - UBool isICUData= (UBool)(path==NULL); - /* Make up a full mame by appending the type to the supplied + const char *treeChar; + + UBool isICUData = FALSE; + + if(path == NULL || + !strcmp(path, U_ICUDATA_ALIAS) || + !uprv_strncmp(path, U_ICUDATA_NAME U_TREE_SEPARATOR_STRING, + uprv_strlen(U_ICUDATA_NAME U_TREE_SEPARATOR_STRING)) || + !uprv_strncmp(path, U_ICUDATA_ALIAS U_TREE_SEPARATOR_STRING, + uprv_strlen(U_ICUDATA_ALIAS U_TREE_SEPARATOR_STRING))) { + isICUData = TRUE; + } + +#if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR) + /* remap from alternate path char to the main one */ + TinyString_init(&altSepPath); + if(path) { + char *p; + if((p=uprv_strchr(path,U_FILE_ALT_SEP_CHAR))) { + TinyString_append(&altSepPath, path); + while((p=uprv_strchr(altSepPath.s,U_FILE_ALT_SEP_CHAR))) { + *p = U_FILE_SEP_CHAR; + } +#if defined (UDATA_DEBUG) + fprintf(stderr, "Changed path from [%s] to [%s]\n", path, altSepPath.s); +#endif + path = altSepPath.s; + } + } +#endif + + TinyString_init(&oldIndFileName); + TinyString_init(&tocEntryName); + TinyString_init(&tocEntryPath); + TinyString_init(&oldStylePath); + TinyString_init(&oldStylePathBasename); + + TinyString_init(&pkgName); + TinyString_init(&treeName); + + + if(path==NULL) { + TinyString_append(&pkgName, U_ICUDATA_NAME); + } else { + const char *pkg; + const char *first; + pkg = uprv_strrchr(path, U_FILE_SEP_CHAR); + first = uprv_strchr(path, U_FILE_SEP_CHAR); + if(uprv_pathIsAbsolute(path) || (pkg != first)) { /* more than one slash in the path- not a tree name */ + /* see if this is an /absolute/path/to/package path */ + if(pkg) { + TinyString_append(&pkgName, pkg+1); + } else { + TinyString_append(&pkgName, path); + } + } else { + treeChar = uprv_strchr(path, U_TREE_SEPARATOR); + if(treeChar) { + TinyString_append(&treeName, treeChar+1); /* following '-' */ + if(!isICUData) { + TinyString_appendn(&pkgName, path, (int32_t)(treeChar-path)); + } else { + TinyString_append(&pkgName, U_ICUDATA_NAME); + } + } else { + if(!isICUData) { + TinyString_append(&pkgName, path); + } else { + TinyString_append(&pkgName, U_ICUDATA_NAME); + } + } + } + } + +#ifdef UDATA_DEBUG + fprintf(stderr, " P=%s T=%s\n", pkgName.s, treeName.s); +#endif + + /* Make up a full name by appending the type to the supplied * name, assuming that a type was supplied. */ /* prepend the package */ - uprv_strcpy(tocEntryName, packageNameFromPath(path)); + TinyString_append(&tocEntryName, pkgName.s); + TinyString_append(&tocEntryPath, pkgName.s); + TinyString_append(&oldIndFileName, pkgName.s); + tocEntrySuffixIndex = tocEntryName.length; - tocEntrySuffix = tocEntryName+uprv_strlen(tocEntryName); /* suffix starts here */ + if(treeName.s[0]) { + TinyString_append(&tocEntryName, U_TREE_ENTRY_SEP_STRING); + TinyString_append(&tocEntryName, treeName.s); - uprv_strcat(tocEntryName, "_"); + TinyString_append(&tocEntryPath, U_FILE_SEP_STRING); + TinyString_append(&tocEntryPath, treeName.s); + } - uprv_strcat(tocEntryName, name); + TinyString_append(&oldIndFileName, "_"); + TinyString_append(&tocEntryName, U_TREE_ENTRY_SEP_STRING); + TinyString_append(&tocEntryPath, U_FILE_SEP_STRING); + TinyString_append(&oldIndFileName, name); + TinyString_append(&tocEntryName, name); + TinyString_append(&tocEntryPath, name); if(type!=NULL && *type!=0) { - uprv_strcat(tocEntryName, "."); - uprv_strcat(tocEntryName, type); + TinyString_append(&tocEntryName, "."); + TinyString_append(&tocEntryName, type); + TinyString_append(&tocEntryPath, "."); + TinyString_append(&tocEntryPath, type); + TinyString_append(&oldIndFileName, "."); + TinyString_append(&oldIndFileName, type); } + tocEntrySuffix = tocEntryName.s+tocEntrySuffixIndex; /* suffix starts here */ + tocEntryPathSuffix = tocEntryPath.s+tocEntrySuffixIndex; /* suffix starts here */ #ifdef UDATA_DEBUG - fprintf(stderr, " tocEntryName = %s\n", tocEntryName); + fprintf(stderr, " tocEntryName = %s\n", tocEntryName.s); + fprintf(stderr, " tocEntryPath = %s\n", tocEntryName.s); + fprintf(stderr, " oldIndFileName = %s\n", oldIndFileName.s); #endif @@ -935,7 +1219,7 @@ doOpenChoice(const char *path, const char *type, const char *name, /************************ Begin loop looking for ind. files ***************/ #ifdef UDATA_DEBUG - fprintf(stderr, "IND: inBasename = %s\n", inBasename); + fprintf(stderr, "IND: inBasename = %s, pkg=%s\n", inBasename, packageNameFromPath(path)); #endif /* Deal with a null basename */ @@ -946,65 +1230,125 @@ doOpenChoice(const char *path, const char *type, const char *name, */ char *rightSlash; - uprv_strcpy(oldStylePath, path); - oldStylePath[uprv_strlen(path)-1]=0; /* chop off trailing slash */ + TinyString_append(&oldStylePath, path); + /* chop off trailing slash */ + oldStylePath.length--; + oldStylePath.s[oldStylePath.length] = 0; - rightSlash = (char*)uprv_strrchr(oldStylePath, U_FILE_SEP_CHAR); + rightSlash = (char*)uprv_strrchr(oldStylePath.s, U_FILE_SEP_CHAR); if(rightSlash != NULL) { rightSlash++; - inBasename = uprv_strcpy(oldStylePathBasename, rightSlash); - uprv_strcat(oldStylePath, U_FILE_SEP_STRING); - uprv_strcat(oldStylePath, inBasename); /* one more time, for the base name */ - path = oldStylePath; + TinyString_append(&oldStylePathBasename, rightSlash); + inBasename = oldStylePathBasename.s; + TinyString_append(&oldStylePath, U_FILE_SEP_STRING); + TinyString_append(&oldStylePath, inBasename); /* one more time, for the base name */ + path = oldStylePath.s; } else { *pErrorCode = U_FILE_ACCESS_ERROR; /* hopelessly bad case */ - return NULL; + retVal = NULL; + goto commonReturn; } } /* End of dealing with a null basename */ dataPath = u_getDataDirectory(); - /* #1 look in ind. files ================================== */ - /* init path iterator for individual files */ - udata_pathiter_init(&iter, dataPath, path, tocEntrySuffix, FALSE); - - while((pathBuffer = udata_pathiter_next(&iter, &pathLen))) - { + /* Check to make sure that there is a dataPath to iterate over */ + if ((dataPath && *dataPath) || !isICUData) { + UDataPathIterator iter; + /* #1a look in ind. files: package\nam.typ ========================= */ + /* init path iterator for individual files */ + udata_pathiter_init(&iter, dataPath, pkgName.s, path, tocEntryPathSuffix, FALSE); + + while((pathBuffer = udata_pathiter_next(&iter, NULL))) + { #ifdef UDATA_DEBUG - fprintf(stderr, "UDATA: trying individual file %s\n", pathBuffer); + fprintf(stderr, "UDATA: trying individual file %s\n", pathBuffer); #endif - if( uprv_mapFile(&dataMemory, pathBuffer) || - (inBasename!=pathBuffer && uprv_mapFile(&dataMemory, inBasename))) - { - pEntryData = checkDataItem(dataMemory.pHeader, isAcceptable, context, type, name, &errorCode, pErrorCode); - if (pEntryData != NULL) { - /* Data is good. - * Hand off ownership of the backing memory to the user's UDataMemory. - * and return it. */ - pEntryData->mapAddr = dataMemory.mapAddr; - pEntryData->map = dataMemory.map; - + if( uprv_mapFile(&dataMemory, pathBuffer) || + (inBasename!=pathBuffer && uprv_mapFile(&dataMemory, inBasename))) + { + pEntryData = checkDataItem(dataMemory.pHeader, isAcceptable, context, type, name, &errorCode, pErrorCode); + if (pEntryData != NULL) { + /* Data is good. + * Hand off ownership of the backing memory to the user's UDataMemory. + * and return it. */ + pEntryData->mapAddr = dataMemory.mapAddr; + pEntryData->map = dataMemory.map; + #ifdef UDATA_DEBUG - fprintf(stderr, "** Mapped file: %s\n", pathBuffer); + fprintf(stderr, "** Mapped file: %s\n", pathBuffer); #endif - return pEntryData; - } - - /* the data is not acceptable, or some error occured. Either way, unmap the memory */ - udata_close(&dataMemory); - - /* If we had a nasty error, bail out completely. */ - if (U_FAILURE(*pErrorCode)) { - return NULL; + udata_pathiter_dt(&iter); + retVal = pEntryData; + goto commonReturn; + } + + /* the data is not acceptable, or some error occured. Either way, unmap the memory */ + udata_close(&dataMemory); + + /* If we had a nasty error, bail out completely. */ + if (U_FAILURE(*pErrorCode)) { + udata_pathiter_dt(&iter); + retVal = NULL; + goto commonReturn; + } + + /* Otherwise remember that we found data but didn't like it for some reason */ + errorCode=U_INVALID_FORMAT_ERROR; } - - /* Otherwise remember that we found data but didn't like it for some reason */ - errorCode=U_INVALID_FORMAT_ERROR; +#ifdef UDATA_DEBUG + fprintf(stderr, "%s\n", UDataMemory_isLoaded(&dataMemory)?"LOADED":"not loaded"); +#endif } + udata_pathiter_dt(&iter); + + /* #1b look in ind. files - with old naming (package_nam.typ not package\nam.typ) ==================== */ + /* init path iterator for individual files */ + udata_pathiter_init(&iter, dataPath, "", path, oldIndFileName.s, FALSE); + + while((pathBuffer = udata_pathiter_next(&iter, NULL))) + { #ifdef UDATA_DEBUG - fprintf(stderr, "%s\n", UDataMemory_isLoaded(&dataMemory)?"LOADED":"not loaded"); + fprintf(stderr, "UDATA: trying individual file %s\n", pathBuffer); #endif + if( uprv_mapFile(&dataMemory, pathBuffer) || + (inBasename!=pathBuffer && uprv_mapFile(&dataMemory, inBasename))) + { + pEntryData = checkDataItem(dataMemory.pHeader, isAcceptable, context, type, name, &errorCode, pErrorCode); + if (pEntryData != NULL) { + /* Data is good. + * Hand off ownership of the backing memory to the user's UDataMemory. + * and return it. */ + pEntryData->mapAddr = dataMemory.mapAddr; + pEntryData->map = dataMemory.map; + +#ifdef UDATA_DEBUG + fprintf(stderr, "** Mapped file: %s\n", pathBuffer); +#endif + udata_pathiter_dt(&iter); + retVal = pEntryData; + goto commonReturn; + } + + /* the data is not acceptable, or some error occured. Either way, unmap the memory */ + udata_close(&dataMemory); + + /* If we had a nasty error, bail out completely. */ + if (U_FAILURE(*pErrorCode)) { + udata_pathiter_dt(&iter); + retVal = NULL; + goto commonReturn; + } + + /* Otherwise remember that we found data but didn't like it for some reason */ + errorCode=U_INVALID_FORMAT_ERROR; + } +#ifdef UDATA_DEBUG + fprintf(stderr, "%s\n", UDataMemory_isLoaded(&dataMemory)?"LOADED":"not loaded"); +#endif + } + udata_pathiter_dt(&iter); } /* #2 */ @@ -1022,21 +1366,34 @@ doOpenChoice(const char *path, const char *type, const char *name, pCommonData=openCommonData(path, isICUData, &errorCode); /** search for pkg **/ if(U_SUCCESS(errorCode)) { + int32_t length; + /* look up the data piece in the common data */ - pHeader=pCommonData->vFuncs->Lookup(pCommonData, tocEntryName, &errorCode); + pHeader=pCommonData->vFuncs->Lookup(pCommonData, tocEntryName.s, &length, &errorCode); #ifdef UDATA_DEBUG - fprintf(stderr, "pHeader=%p\n", pHeader); + fprintf(stderr, "%s: pHeader=%p - %s\n", tocEntryName.s, pHeader, u_errorName(errorCode)); #endif + if((pHeader == NULL) && !U_FAILURE(errorCode)) { + pHeader=pCommonData->vFuncs->Lookup(pCommonData, oldIndFileName.s, /* oldIndFileName is preceded by a slash */ + &length, &errorCode); +#ifdef UDATA_DEBUG + fprintf(stderr, "[OLD name] %s: pHeader=%p - %s\n", oldIndFileName.s, pHeader, u_errorName(errorCode)); +#endif + } + if(pHeader!=NULL) { pEntryData = checkDataItem(pHeader, isAcceptable, context, type, name, &errorCode, pErrorCode); #ifdef UDATA_DEBUG - fprintf(stderr, "pEntryData=%p\n", pEntryData); + fprintf(stderr, "pEntryData=%p\n", pEntryData); #endif if (U_FAILURE(*pErrorCode)) { - return NULL; + retVal = NULL; + goto commonReturn; } if (pEntryData != NULL) { - return pEntryData; + pEntryData->length = length; + retVal = pEntryData; + goto commonReturn; } } } @@ -1058,7 +1415,19 @@ doOpenChoice(const char *path, const char *type, const char *name, *pErrorCode=errorCode; } } - return NULL; + +commonReturn: + TinyString_dt(&tocEntryName); + TinyString_dt(&tocEntryPath); + TinyString_dt(&oldIndFileName); + TinyString_dt(&oldStylePath); + TinyString_dt(&oldStylePathBasename); + TinyString_dt(&pkgName); + TinyString_dt(&treeName); +#if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR) + TinyString_dt(&altSepPath); +#endif + return retVal; } @@ -1069,7 +1438,7 @@ U_CAPI UDataMemory * U_EXPORT2 udata_open(const char *path, const char *type, const char *name, UErrorCode *pErrorCode) { #ifdef UDATA_DEBUG - fprintf(stderr, "udata_open(): Opening: %s . %s\n", name, type); + fprintf(stderr, "udata_open(): Opening: %s : %s . %s\n", (path?path:"NULL"), name, type); fflush(stderr); #endif @@ -1090,7 +1459,7 @@ udata_openChoice(const char *path, const char *type, const char *name, UDataMemoryIsAcceptable *isAcceptable, void *context, UErrorCode *pErrorCode) { #ifdef UDATA_DEBUG - fprintf(stderr, "udata_openChoice(): Opening: %s . %s\n", name, type);fflush(stderr); + fprintf(stderr, "udata_openChoice(): Opening: %s : %s . %s\n", (path?path:"NULL"), name, type); #endif if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { @@ -1110,10 +1479,16 @@ udata_getInfo(UDataMemory *pData, UDataInfo *pInfo) { if(pInfo!=NULL) { if(pData!=NULL && pData->pHeader!=NULL) { const UDataInfo *info=&pData->pHeader->info; - if(pInfo->size>info->size) { - pInfo->size=info->size; + uint16_t dataInfoSize=udata_getInfoSize(info); + if(pInfo->size>dataInfoSize) { + pInfo->size=dataInfoSize; + } + uprv_memcpy((uint16_t *)pInfo+1, (const uint16_t *)info+1, pInfo->size-2); + if(info->isBigEndian!=U_IS_BIG_ENDIAN) { + /* opposite endianness */ + uint16_t x=info->reservedWord; + pInfo->reservedWord=(uint16_t)((x<<8)|(x>>8)); } - uprv_memcpy((uint16_t *)pInfo+1, (uint16_t *)info+1, pInfo->size-2); } else { pInfo->size=0; } diff --git a/icuSources/common/udatamem.c b/icuSources/common/udatamem.c index 6b39980c..b0778a63 100644 --- a/icuSources/common/udatamem.c +++ b/icuSources/common/udatamem.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************/ @@ -25,6 +25,7 @@ void UDataMemory_init(UDataMemory *This) { uprv_memset(This, 0, sizeof(UDataMemory)); + This->length=-1; } @@ -100,12 +101,58 @@ udata_close(UDataMemory *pData) { U_CAPI const void * U_EXPORT2 udata_getMemory(UDataMemory *pData) { if(pData!=NULL && pData->pHeader!=NULL) { - return (char *)(pData->pHeader)+pData->pHeader->dataHeader.headerSize; + return (char *)(pData->pHeader)+udata_getHeaderSize(pData->pHeader); } else { return NULL; } } +/** + * Get the length of the data item if possible. + * The length may be up to 15 bytes larger than the actual data. + * + * TODO Consider making this function public. + * It would have to return the actual length in more cases. + * For example, the length of the last item in a .dat package could be + * computed from the size of the whole .dat package minus the offset of the + * last item. + * The size of a file that was directly memory-mapped could be determined + * using some system API. + * + * In order to get perfect values for all data items, we may have to add a + * length field to UDataInfo, but that complicates data generation + * and may be overkill. + * + * @param pData The data item. + * @return the length of the data item, or -1 if not known + * @internal Currently used only in cintltst/udatatst.c + */ +U_CAPI int32_t U_EXPORT2 +udata_getLength(const UDataMemory *pData) { + if(pData!=NULL && pData->pHeader!=NULL && pData->length>=0) { + /* + * subtract the header size, + * return only the size of the actual data starting at udata_getMemory() + */ + return pData->length-udata_getHeaderSize(pData->pHeader); + } else { + return -1; + } +} + +/** + * Get the memory including the data header. + * Used in cintltst/udatatst.c + * @internal + */ +U_CAPI const void * U_EXPORT2 +udata_getRawMemory(const UDataMemory *pData) { + if(pData!=NULL && pData->pHeader!=NULL) { + return pData->pHeader; + } else { + return NULL; + } +} UBool UDataMemory_isLoaded(UDataMemory *This) { return This->pHeader != NULL; diff --git a/icuSources/common/udatamem.h b/icuSources/common/udatamem.h index 840e674e..504883d6 100644 --- a/icuSources/common/udatamem.h +++ b/icuSources/common/udatamem.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1999-2001, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************/ @@ -39,6 +39,7 @@ struct UDataMemory { /* Only non-null if a close operation should unmap */ /* the associated data, and additional info */ /* beyond the mapAddr is needed to do that. */ + int32_t length; /* Length of the data in bytes; -1 if unknown. */ }; UDataMemory *UDataMemory_createNewInstance(UErrorCode *pErr); @@ -49,5 +50,12 @@ void UDataMemory_setData (UDataMemory *This, const void *dataAddr); const DataHeader *UDataMemory_normalizeDataPointer(const void *p); + +U_CAPI int32_t U_EXPORT2 +udata_getLength(const UDataMemory *pData); + +U_CAPI const void * U_EXPORT2 +udata_getRawMemory(const UDataMemory *pData); + #endif diff --git a/icuSources/common/udataswp.c b/icuSources/common/udataswp.c new file mode 100644 index 00000000..cacf7166 --- /dev/null +++ b/icuSources/common/udataswp.c @@ -0,0 +1,415 @@ +/* +******************************************************************************* +* +* Copyright (C) 2003, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: udataswp.c +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2003jun05 +* created by: Markus W. Scherer +* +* Definitions for ICU data transformations for different platforms, +* changing between big- and little-endian data and/or between +* charset families (ASCII<->EBCDIC). +*/ + +#include +#include "unicode/utypes.h" +#include "unicode/udata.h" /* UDataInfo */ +#include "ucmndata.h" /* DataHeader */ +#include "cmemory.h" +#include "udataswp.h" + +/* swapping primitives ------------------------------------------------------ */ + +static int32_t U_CALLCONV +uprv_swapArray16(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const uint16_t *p; + uint16_t *q; + int32_t count; + uint16_t x; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + if(ds==NULL || inData==NULL || length<0 || (length&1)!=0 || outData==NULL) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* setup and swapping */ + p=(const uint16_t *)inData; + q=(uint16_t *)outData; + count=length/2; + while(count>0) { + x=*p++; + *q++=(uint16_t)((x<<8)|(x>>8)); + --count; + } + + return length; +} + +static int32_t U_CALLCONV +uprv_copyArray16(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + if(ds==NULL || inData==NULL || length<0 || (length&1)!=0 || outData==NULL) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + if(length>0 && inData!=outData) { + uprv_memcpy(outData, inData, length); + } + return length; +} + +static int32_t U_CALLCONV +uprv_swapArray32(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const uint32_t *p; + uint32_t *q; + int32_t count; + uint32_t x; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + if(ds==NULL || inData==NULL || length<0 || (length&3)!=0 || outData==NULL) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* setup and swapping */ + p=(const uint32_t *)inData; + q=(uint32_t *)outData; + count=length/4; + while(count>0) { + x=*p++; + *q++=(uint32_t)((x<<24)|((x<<8)&0xff0000)|((x>>8)&0xff00)|(x>>24)); + --count; + } + + return length; +} + +static int32_t U_CALLCONV +uprv_copyArray32(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + if(ds==NULL || inData==NULL || length<0 || (length&3)!=0 || outData==NULL) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + if(length>0 && inData!=outData) { + uprv_memcpy(outData, inData, length); + } + return length; +} + +static uint16_t U_CALLCONV +uprv_readSwapUInt16(uint16_t x) { + return (uint16_t)((x<<8)|(x>>8)); +} + +static uint16_t U_CALLCONV +uprv_readDirectUInt16(uint16_t x) { + return x; +} + +static uint32_t U_CALLCONV +uprv_readSwapUInt32(uint32_t x) { + return (uint32_t)((x<<24)|((x<<8)&0xff0000)|((x>>8)&0xff00)|(x>>24)); +} + +static uint32_t U_CALLCONV +uprv_readDirectUInt32(uint32_t x) { + return x; +} + +static void U_CALLCONV +uprv_writeSwapUInt16(uint16_t *p, uint16_t x) { + *p=(uint16_t)((x<<8)|(x>>8)); +} + +static void U_CALLCONV +uprv_writeDirectUInt16(uint16_t *p, uint16_t x) { + *p=x; +} + +static void U_CALLCONV +uprv_writeSwapUInt32(uint32_t *p, uint32_t x) { + *p=(uint32_t)((x<<24)|((x<<8)&0xff0000)|((x>>8)&0xff00)|(x>>24)); +} + +static void U_CALLCONV +uprv_writeDirectUInt32(uint32_t *p, uint32_t x) { + *p=x; +} + +U_CAPI int16_t U_EXPORT2 +udata_readInt16(const UDataSwapper *ds, int16_t x) { + return (int16_t)ds->readUInt16((uint16_t)x); +} + +U_CAPI int32_t U_EXPORT2 +udata_readInt32(const UDataSwapper *ds, int32_t x) { + return (int32_t)ds->readUInt32((uint32_t)x); +} + +/** + * Swap a block of invariant, NUL-terminated strings, but not padding + * bytes after the last string. + * @internal + */ +U_CAPI int32_t U_EXPORT2 +udata_swapInvStringBlock(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const char *inChars; + int32_t stringsLength; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + if(ds==NULL || inData==NULL || length<0 || (length>0 && outData==NULL)) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* reduce the strings length to not include bytes after the last NUL */ + inChars=(const char *)inData; + stringsLength=length; + while(stringsLength>0 && inChars[stringsLength-1]!=0) { + --stringsLength; + } + + /* swap up to the last NUL */ + ds->swapInvChars(ds, inData, stringsLength, outData, pErrorCode); + + /* copy the bytes after the last NUL */ + if(inData!=outData && length>stringsLength) { + uprv_memcpy((char *)outData+stringsLength, inChars+stringsLength, length-stringsLength); + } + + /* return the length including padding bytes */ + if(U_SUCCESS(*pErrorCode)) { + return length; + } else { + return 0; + } +} + +U_CAPI void U_EXPORT2 +udata_printError(const UDataSwapper *ds, + const char *fmt, + ...) { + va_list args; + + if(ds->printError!=NULL) { + va_start(args, fmt); + ds->printError(ds->printErrorContext, fmt, args); + va_end(args); + } +} + +/* swap a data header ------------------------------------------------------- */ + +U_CAPI int32_t U_EXPORT2 +udata_swapDataHeader(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const DataHeader *pHeader; + uint16_t headerSize, infoSize; + + /* argument checking */ + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + if(ds==NULL || inData==NULL || length<-1 || (length>0 && outData==NULL)) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* check minimum length and magic bytes */ + pHeader=(const DataHeader *)inData; + if( (length>=0 && lengthdataHeader.magic1!=0xda || + pHeader->dataHeader.magic2!=0x27 || + pHeader->info.sizeofUChar!=2 + ) { + udata_printError(ds, "udata_swapDataHeader(): initial bytes do not look like ICU data\n"); + *pErrorCode=U_UNSUPPORTED_ERROR; + return 0; + } + + headerSize=ds->readUInt16(pHeader->dataHeader.headerSize); + infoSize=ds->readUInt16(pHeader->info.size); + + if( headerSizedataHeader)+infoSize) || + (length>=0 && length0) { + DataHeader *outHeader; + const char *s; + int32_t maxLength; + + /* Most of the fields are just bytes and need no swapping. */ + if(inData!=outData) { + uprv_memcpy(outData, inData, headerSize); + } + outHeader=(DataHeader *)outData; + + outHeader->info.isBigEndian = ds->outIsBigEndian; + outHeader->info.charsetFamily = ds->outCharset; + + /* swap headerSize */ + ds->swapArray16(ds, &pHeader->dataHeader.headerSize, 2, &outHeader->dataHeader.headerSize, pErrorCode); + + /* swap UDataInfo size and reservedWord */ + ds->swapArray16(ds, &pHeader->info.size, 4, &outHeader->info.size, pErrorCode); + + /* swap copyright statement after the UDataInfo */ + infoSize+=sizeof(pHeader->dataHeader); + s=(const char *)inData+infoSize; + maxLength=headerSize-infoSize; + /* get the length of the string */ + for(length=0; lengthswapInvChars(ds, s, length, (char *)outData+infoSize, pErrorCode); + } + + return headerSize; +} + +/* API functions ------------------------------------------------------------ */ + +U_CAPI UDataSwapper * U_EXPORT2 +udata_openSwapper(UBool inIsBigEndian, uint8_t inCharset, + UBool outIsBigEndian, uint8_t outCharset, + UErrorCode *pErrorCode) { + UDataSwapper *swapper; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return NULL; + } + if(inCharset>U_EBCDIC_FAMILY || outCharset>U_EBCDIC_FAMILY) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + + /* allocate the swapper */ + swapper=uprv_malloc(sizeof(UDataSwapper)); + if(swapper==NULL) { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + uprv_memset(swapper, 0, sizeof(UDataSwapper)); + + /* set values and functions pointers according to in/out parameters */ + swapper->inIsBigEndian=inIsBigEndian; + swapper->inCharset=inCharset; + swapper->outIsBigEndian=outIsBigEndian; + swapper->outCharset=outCharset; + + swapper->readUInt16= inIsBigEndian==U_IS_BIG_ENDIAN ? uprv_readDirectUInt16 : uprv_readSwapUInt16; + swapper->readUInt32= inIsBigEndian==U_IS_BIG_ENDIAN ? uprv_readDirectUInt32 : uprv_readSwapUInt32; + + swapper->writeUInt16= outIsBigEndian==U_IS_BIG_ENDIAN ? uprv_writeDirectUInt16 : uprv_writeSwapUInt16; + swapper->writeUInt32= outIsBigEndian==U_IS_BIG_ENDIAN ? uprv_writeDirectUInt32 : uprv_writeSwapUInt32; + + swapper->compareInvChars= outCharset==U_ASCII_FAMILY ? uprv_compareInvAscii : uprv_compareInvEbcdic; + + swapper->swapArray16= inIsBigEndian==outIsBigEndian ? uprv_copyArray16 : uprv_swapArray16; + swapper->swapArray32= inIsBigEndian==outIsBigEndian ? uprv_copyArray32 : uprv_swapArray32; + + if(inCharset==U_ASCII_FAMILY) { + swapper->swapInvChars= outCharset==U_ASCII_FAMILY ? uprv_copyAscii : uprv_ebcdicFromAscii; + } else /* U_EBCDIC_FAMILY */ { + swapper->swapInvChars= outCharset==U_EBCDIC_FAMILY ? uprv_copyEbcdic : uprv_asciiFromEbcdic; + } + + return swapper; +} + +U_CAPI UDataSwapper * U_EXPORT2 +udata_openSwapperForInputData(const void *data, int32_t length, + UBool outIsBigEndian, uint8_t outCharset, + UErrorCode *pErrorCode) { + const DataHeader *pHeader; + uint16_t headerSize, infoSize; + UBool inIsBigEndian; + int8_t inCharset; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return NULL; + } + if( data==NULL || + (length>=0 && lengthU_EBCDIC_FAMILY + ) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + + pHeader=(const DataHeader *)data; + if( (length>=0 && lengthdataHeader.magic1!=0xda || + pHeader->dataHeader.magic2!=0x27 || + pHeader->info.sizeofUChar!=2 + ) { + *pErrorCode=U_UNSUPPORTED_ERROR; + return 0; + } + + inIsBigEndian=(UBool)pHeader->info.isBigEndian; + inCharset=pHeader->info.charsetFamily; + + if(inIsBigEndian==U_IS_BIG_ENDIAN) { + headerSize=pHeader->dataHeader.headerSize; + infoSize=pHeader->info.size; + } else { + headerSize=uprv_readSwapUInt16(pHeader->dataHeader.headerSize); + infoSize=uprv_readSwapUInt16(pHeader->info.size); + } + + if( headerSizedataHeader)+infoSize) || + (length>=0 && lengthEBCDIC). +*/ + +#ifndef __UDATASWP_H__ +#define __UDATASWP_H__ + +#include +#include "unicode/utypes.h" + +/* forward declaration */ + +U_CDECL_BEGIN + +struct UDataSwapper; +typedef struct UDataSwapper UDataSwapper; + +/** + * Function type for data transformation. + * Transforms data, or just returns the length of the data if + * the input length is -1. + * Swap functions assume that their data pointers are aligned properly. + * + * Quick implementation outline: + * (best to copy and adapt and existing swapper implementation) + * check that the data looks like the expected format + * if(length<0) { + * preflight: + * never dereference outData + * read inData and determine the data size + * assume that inData is long enough for this + * } else { + * outData can be NULL if length==0 + * inData==outData (in-place swapping) possible but not required! + * verify that length>=(actual size) + * if there is a chance that not every byte up to size is reached + * due to padding etc.: + * if(inData!=outData) { + * memcpy(outData, inData, actual size); + * } + * swap contents + * } + * return actual size + * + * Further implementation notes: + * - read integers from inData before swapping them + * because in-place swapping can make them unreadable + * - compareInvChars compares a local Unicode string with already-swapped + * output charset strings + * + * @param ds Pointer to UDataSwapper containing global data about the + * transformation and function pointers for handling primitive + * types. + * @param inData Pointer to the input data to be transformed or examined. + * @param length Length of the data, counting bytes. May be -1 for preflighting. + * If length>=0, then transform the data. + * If length==-1, then only determine the length of the data. + * The length cannot be determined from the data itself for all + * types of data (e.g., not for simple arrays of integers). + * @param outData Pointer to the output data buffer. + * If length>=0 (transformation), then the output buffer must + * have a capacity of at least length. + * If length==-1, then outData will not be used and can be NULL. + * @param pErrorCode ICU UErrorCode parameter, must not be NULL and must + * fulfill U_SUCCESS on input. + * @return The actual length of the data. + * + * @see UDataSwapper + * @draft ICU 2.8 + */ +typedef int32_t U_CALLCONV +UDataSwapFn(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode); + +/** + * Convert one uint16_t from input to platform endianness. + * @draft ICU 2.8 + */ +typedef uint16_t U_CALLCONV +UDataReadUInt16(uint16_t x); + +/** + * Convert one uint32_t from input to platform endianness. + * @draft ICU 2.8 + */ +typedef uint32_t U_CALLCONV +UDataReadUInt32(uint32_t x); + +/** + * Convert one uint16_t from platform to input endianness. + * @draft ICU 2.8 + */ +typedef void U_CALLCONV +UDataWriteUInt16(uint16_t *p, uint16_t x); + +/** + * Convert one uint32_t from platform to input endianness. + * @draft ICU 2.8 + */ +typedef void U_CALLCONV +UDataWriteUInt32(uint32_t *p, uint32_t x); + +/** + * Compare invariant-character strings, one in the output data and the + * other one caller-provided in Unicode. + * An output data string is compared because strings are usually swapped + * before the rest of the data, to allow for sorting of string tables + * according to the output charset. + * You can use -1 for the length parameters of NUL-terminated strings as usual. + * Returns Unicode code point order for invariant characters. + * @draft ICU 2.8 + */ +typedef int32_t U_CALLCONV +UDataCompareInvChars(const UDataSwapper *ds, + const char *outString, int32_t outLength, + const UChar *localString, int32_t localLength); + +/** + * Function for message output when an error occurs during data swapping. + * A format string and variable number of arguments are passed + * like for vprintf(). + * + * @param context A function-specific context pointer. + * @param fmt The format string. + * @param args The arguments for format string inserts. + * + * @draft ICU 2.8 + */ +typedef void U_CALLCONV +UDataPrintError(void *context, const char *fmt, va_list args); + +struct UDataSwapper { + /** Input endianness. @draft ICU 2.8 */ + UBool inIsBigEndian; + /** Input charset family. @see U_CHARSET_FAMILY @draft ICU 2.8 */ + uint8_t inCharset; + /** Output endianness. @draft ICU 2.8 */ + UBool outIsBigEndian; + /** Output charset family. @see U_CHARSET_FAMILY @draft ICU 2.8 */ + uint8_t outCharset; + + /* basic functions for reading data values */ + + /** Convert one uint16_t from input to platform endianness. @draft ICU 2.8 */ + UDataReadUInt16 *readUInt16; + /** Convert one uint32_t from input to platform endianness. @draft ICU 2.8 */ + UDataReadUInt32 *readUInt32; + /** Compare an invariant-character output string with a local one. @draft ICU 2.8 */ + UDataCompareInvChars *compareInvChars; + + /* basic functions for writing data values */ + + /** Convert one uint16_t from platform to input endianness. @draft ICU 2.8 */ + UDataWriteUInt16 *writeUInt16; + /** Convert one uint32_t from platform to input endianness. @draft ICU 2.8 */ + UDataWriteUInt32 *writeUInt32; + + /* basic functions for data transformations */ + + /** Transform an array of 16-bit integers. @draft ICU 2.8 */ + UDataSwapFn *swapArray16; + /** Transform an array of 32-bit integers. @draft ICU 2.8 */ + UDataSwapFn *swapArray32; + /** Transform an invariant-character string. @draft ICU 2.8 */ + UDataSwapFn *swapInvChars; + + /** + * Function for message output when an error occurs during data swapping. + * Can be NULL. + * @draft ICU 2.8 + */ + UDataPrintError *printError; + /** Context pointer for printError. @draft ICU 2.8 */ + void *printErrorContext; +}; + +U_CDECL_END + +U_CAPI UDataSwapper * U_EXPORT2 +udata_openSwapper(UBool inIsBigEndian, uint8_t inCharset, + UBool outIsBigEndian, uint8_t outCharset, + UErrorCode *pErrorCode); + +/** + * Open a UDataSwapper for the given input data and the specified output + * characteristics. + * Values of -1 for any of the characteristics mean the local platform's + * characteristics. + * + * @see udata_swap + * @draft ICU 2.8 + */ +U_CAPI UDataSwapper * U_EXPORT2 +udata_openSwapperForInputData(const void *data, int32_t length, + UBool outIsBigEndian, uint8_t outCharset, + UErrorCode *pErrorCode); + +U_CAPI void U_EXPORT2 +udata_closeSwapper(UDataSwapper *ds); + +/** + * Read the beginning of an ICU data piece, recognize magic bytes, + * swap the structure. + * Set a U_UNSUPPORTED_ERROR if it does not look like an ICU data piece. + * + * @return The size of the data header, in bytes. + * + * @draft ICU 2.8 + */ +U_CAPI int32_t U_EXPORT2 +udata_swapDataHeader(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode); + +/** + * Convert one int16_t from input to platform endianness. + * @draft ICU 2.8 + */ +U_CAPI int16_t U_EXPORT2 +udata_readInt16(const UDataSwapper *ds, int16_t x); + +/** + * Convert one int32_t from input to platform endianness. + * @draft ICU 2.8 + */ +U_CAPI int32_t U_EXPORT2 +udata_readInt32(const UDataSwapper *ds, int32_t x); + +/** + * Swap a block of invariant, NUL-terminated strings, but not padding + * bytes after the last string. + * @internal + */ +U_CAPI int32_t U_EXPORT2 +udata_swapInvStringBlock(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode); + +U_CAPI void U_EXPORT2 +udata_printError(const UDataSwapper *ds, + const char *fmt, + ...); + +/* internal exports from putil.c -------------------------------------------- */ + +/* declared here to keep them out of the public putil.h */ + +/** + * Swap invariant char * strings ASCII->EBCDIC. + * @internal + */ +U_CFUNC int32_t +uprv_ebcdicFromAscii(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode); + +/** + * Copy invariant ASCII char * strings and verify they are invariant. + * @internal + */ +U_CFUNC int32_t +uprv_copyAscii(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode); + +/** + * Swap invariant char * strings EBCDIC->ASCII. + * @internal + */ +U_CFUNC int32_t +uprv_asciiFromEbcdic(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode); + +/** + * Copy invariant EBCDIC char * strings and verify they are invariant. + * @internal + */ +U_CFUNC int32_t +uprv_copyEbcdic(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode); + +/** + * Compare ASCII invariant char * with Unicode invariant UChar * + * @internal + */ +U_CFUNC int32_t +uprv_compareInvAscii(const UDataSwapper *ds, + const char *outString, int32_t outLength, + const UChar *localString, int32_t localLength); + +/** + * Compare EBCDIC invariant char * with Unicode invariant UChar * + * @internal + */ +U_CFUNC int32_t +uprv_compareInvEbcdic(const UDataSwapper *ds, + const char *outString, int32_t outLength, + const UChar *localString, int32_t localLength); + +/* material... -------------------------------------------------------------- */ + +#if 0 + +/* udata.h */ + +/** + * Public API function in udata.c + * + * Same as udata_openChoice() but automatically swaps the data. + * isAcceptable, if not NULL, may accept data with endianness and charset family + * different from the current platform's properties. + * If the data is acceptable and the platform properties do not match, then + * the swap function is called to swap an allocated version of the data. + * Preflighting may or may not be performed depending on whether the size of + * the loaded data item is known. + * + * @param isAcceptable Same as for udata_openChoice(). May be NULL. + * + * @draft ICU 2.8 + */ +U_CAPI UDataMemory * U_EXPORT2 +udata_openSwap(const char *path, const char *type, const char *name, + UDataMemoryIsAcceptable *isAcceptable, void *isAcceptableContext, + UDataSwapFn *swap, + UDataPrintError *printError, void *printErrorContext, + UErrorCode *pErrorCode); + +#endif + +#endif diff --git a/icuSources/common/uenum.c b/icuSources/common/uenum.c index 26fb8124..549769c4 100644 --- a/icuSources/common/uenum.c +++ b/icuSources/common/uenum.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2002, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -14,6 +14,7 @@ * created by: Vladimir Weinstein */ +#include "unicode/putil.h" #include "uenumimp.h" #include "cmemory.h" @@ -87,24 +88,25 @@ uenum_unextDefault(UEnumeration* en, int32_t* resultLength, UErrorCode* status) { + UChar *ustr = NULL; + int32_t len = 0; if (en->next != NULL) { - UChar *tempUCharVal; - const char *tempCharVal = en->next(en, resultLength, status); - if (tempCharVal == NULL) { - return NULL; - } - tempUCharVal = (UChar*) - _getBuffer(en, (*resultLength+1) * sizeof(UChar)); - if (!tempUCharVal) { - *status = U_MEMORY_ALLOCATION_ERROR; - return NULL; + const char *cstr = en->next(en, &len, status); + if (cstr != NULL) { + ustr = (UChar*) _getBuffer(en, (len+1) * sizeof(UChar)); + if (ustr == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + } else { + u_charsToUChars(cstr, ustr, len+1); + } } - u_charsToUChars(tempCharVal, tempUCharVal, *resultLength + 1); - return tempUCharVal; } else { *status = U_UNSUPPORTED_ERROR; - return NULL; } + if (resultLength) { + *resultLength = len; + } + return ustr; } /* Don't call this directly. Only uenum_next should be calling this. */ @@ -116,9 +118,9 @@ uenum_nextDefault(UEnumeration* en, if (en->uNext != NULL) { char *tempCharVal; const UChar *tempUCharVal = en->uNext(en, resultLength, status); - if (tempUCharVal == NULL) { - return NULL; - } + if (tempUCharVal == NULL) { + return NULL; + } tempCharVal = (char*) _getBuffer(en, (*resultLength+1) * sizeof(char)); if (!tempCharVal) { diff --git a/icuSources/common/uhash.c b/icuSources/common/uhash.c index 54bbdc8b..7ba8b459 100644 --- a/icuSources/common/uhash.c +++ b/icuSources/common/uhash.c @@ -1,6 +1,6 @@ /* ****************************************************************************** -* Copyright (C) 1997-2001, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. ****************************************************************************** * Date Name Description @@ -71,12 +71,15 @@ * to 2.18; the inverse ratio ranges from 0.459 to 0.552.) If this * ratio is changed, the low and high water ratios should also be * adjusted to suit. + * + * These prime numbers were also chosen so that they are the largest + * prime number while being less than a power of two. */ static const int32_t PRIMES[] = { - 17, 37, 67, 131, 257, 521, 1031, 2053, 4099, 8209, 16411, 32771, - 65537, 131101, 262147, 524309, 1048583, 2097169, 4194319, 8388617, - 16777259, 33554467, 67108879, 134217757, 268435459, 536870923, - 1073741827, 2147483647 + 13, 31, 61, 127, 251, 509, 1021, 2039, 4093, 8191, 16381, 32749, + 65521, 131071, 262139, 524287, 1048573, 2097143, 4194301, 8388593, + 16777213, 33554393, 67108859, 134217689, 268435399, 536870909, + 1073741789, 2147483647 /*, 4294967291 */ }; #define PRIMES_LENGTH (sizeof(PRIMES) / sizeof(PRIMES[0])) @@ -273,6 +276,14 @@ uhash_geti(const UHashtable *hash, return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.integer; } +U_CAPI int32_t U_EXPORT2 +uhash_igeti(const UHashtable *hash, + int32_t key) { + UHashTok keyholder; + keyholder.integer = key; + return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.integer; +} + U_CAPI void* U_EXPORT2 uhash_put(UHashtable *hash, void* key, @@ -312,6 +323,20 @@ uhash_puti(UHashtable *hash, status).integer; } + +U_CAPI int32_t U_EXPORT2 +uhash_iputi(UHashtable *hash, + int32_t key, + int32_t value, + UErrorCode *status) { + UHashTok keyholder, valueholder; + keyholder.integer = key; + valueholder.integer = value; + return _uhash_put(hash, keyholder, valueholder, + 0, /* neither is a ptr */ + status).integer; +} + U_CAPI void* U_EXPORT2 uhash_remove(UHashtable *hash, const void* key) { @@ -336,6 +361,14 @@ uhash_removei(UHashtable *hash, return _uhash_remove(hash, keyholder).integer; } +U_CAPI int32_t U_EXPORT2 +uhash_iremovei(UHashtable *hash, + int32_t key) { + UHashTok keyholder; + keyholder.integer = key; + return _uhash_remove(hash, keyholder).integer; +} + U_CAPI void U_EXPORT2 uhash_removeAll(UHashtable *hash) { int32_t pos = -1; @@ -427,7 +460,7 @@ uhash_tokp(void* p) { int32_t hash = 0; \ const TYPE *p = (const TYPE*) STR; \ if (p != NULL) { \ - int32_t len = (int32_t)(STRLEN); \ + int32_t len = (int32_t)(STRLEN); \ int32_t inc = ((len - 32) / 32) + 1; \ const TYPE *limit = p + len; \ while (p 0)){ - *status = U_ILLEGAL_ARGUMENT_ERROR; - return 0; +} + +// returns the length of the label excluding the separator +// if *limit == separator then the length returned does not include +// the separtor. +static inline int32_t +getNextSeparator(UChar *src,int32_t srcLength, + UChar **limit, + UBool *done){ + if(srcLength == -1){ + int32_t i; + for(i=0 ; ;i++){ + if(src[i] == 0){ + *limit = src + i; // point to null + *done = TRUE; + return i; + } + if(isLabelSeparator(src[i])){ + *limit = src + (i+1); // go past the delimiter + return i; + + } + } + }else{ + int32_t i; + for(i=0;i0x007A){ + return FALSE; + } + //[\\u002D \\u0030-\\u0039 \\u0041-\\u005A \\u0061-\\u007A] + if( (ch==0x002D) || + (0x0030 <= ch && ch <= 0x0039) || + (0x0041 <= ch && ch <= 0x005A) || + (0x0061 <= ch && ch <= 0x007A) + ){ + return TRUE; + } + return FALSE; +} + +static int32_t +_internal_toASCII(const UChar* src, int32_t srcLength, + UChar* dest, int32_t destCapacity, + int32_t options, + UStringPrepProfile* nameprep, + UParseError* parseError, + UErrorCode* status){ + UChar b1Stack[MAX_LABEL_BUFFER_SIZE], b2Stack[MAX_LABEL_BUFFER_SIZE]; //initialize pointers to stack buffers UChar *b1 = b1Stack, *b2 = b2Stack; @@ -142,7 +210,7 @@ uidna_toASCII(const UChar* src, int32_t srcLength, b2Capacity = MAX_LABEL_BUFFER_SIZE , reqLength=0; - + int32_t namePrepOptions = ((options & UIDNA_ALLOW_UNASSIGNED) != 0) ? USPREP_ALLOW_UNASSIGNED: 0; UBool* caseFlags = NULL; // the source contains all ascii codepoints @@ -153,18 +221,12 @@ uidna_toASCII(const UChar* src, int32_t srcLength, int32_t j=0; //get the options - UBool allowUnassigned = (UBool)((options & UIDNA_ALLOW_UNASSIGNED) != 0); UBool useSTD3ASCIIRules = (UBool)((options & UIDNA_USE_STD3_RULES) != 0); - + int32_t failPos = -1; - // step 2 - StringPrep* prep = StringPrep::createNameprepInstance(*status); - if(U_FAILURE(*status)){ - goto CLEANUP; - } - - b1Len = prep->process(src,srcLength,b1, b1Capacity,allowUnassigned, parseError, *status); + // step 2 + b1Len = usprep_prepare(nameprep, src, srcLength, b1, b1Capacity, namePrepOptions, parseError, status); if(*status == U_BUFFER_OVERFLOW_ERROR){ // redo processing of string @@ -177,7 +239,7 @@ uidna_toASCII(const UChar* src, int32_t srcLength, *status = U_ZERO_ERROR; // reset error - b1Len = prep->process(src,srcLength,b1, b1Len,allowUnassigned, parseError, *status); + b1Len = usprep_prepare(nameprep, src, srcLength, b1, b1Len, namePrepOptions, parseError, status); } // error bail out if(U_FAILURE(*status)){ @@ -188,11 +250,7 @@ uidna_toASCII(const UChar* src, int32_t srcLength, for( j=0;j 0x7F){ srcIsASCII = FALSE; - } - // here we do not assemble surrogates - // since we know that LDH code points - // are in the ASCII range only - if(prep->isLDHChar(b1[j])==FALSE){ + }else if(isLDHChar(b1[j])==FALSE){ // if the char is in ASCII range verify that it is an LDH character srcIsLDH = FALSE; failPos = j; } @@ -200,7 +258,12 @@ uidna_toASCII(const UChar* src, int32_t srcLength, if(useSTD3ASCIIRules == TRUE){ // verify 3a and 3b - if( srcIsLDH == FALSE /* source contains some non-LDH characters */ + // 3(a) Verify the absence of non-LDH ASCII code points; that is, the + // absence of 0..2C, 2E..2F, 3A..40, 5B..60, and 7B..7F. + // 3(b) Verify the absence of leading and trailing hyphen-minus; that + // is, the absence of U+002D at the beginning and end of the + // sequence. + if( srcIsLDH == FALSE /* source at this point should not contain anyLDH characters */ || b1[0] == HYPHEN || b1[b1Len-1] == HYPHEN){ *status = U_IDNA_STD3_ASCII_RULES_ERROR; @@ -292,30 +355,20 @@ CLEANUP: } uprv_free(caseFlags); - delete prep; - return u_terminateUChars(dest, destCapacity, reqLength, status); } - -U_CAPI int32_t U_EXPORT2 -uidna_toUnicode(const UChar* src, int32_t srcLength, - UChar* dest, int32_t destCapacity, - int32_t options, - UParseError* parseError, - UErrorCode* status){ - - if(status == NULL || U_FAILURE(*status)){ - return 0; - } - if( (src==NULL) || (srcLength < -1) || (destCapacity<0) || (!dest && destCapacity > 0)){ - *status = U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } +static int32_t +_internal_toUnicode(const UChar* src, int32_t srcLength, + UChar* dest, int32_t destCapacity, + int32_t options, + UStringPrepProfile* nameprep, + UParseError* parseError, + UErrorCode* status){ //get the options - UBool allowUnassigned = (UBool)((options & UIDNA_ALLOW_UNASSIGNED) != 0); UBool useSTD3ASCIIRules = (UBool)((options & UIDNA_USE_STD3_RULES) != 0); + int32_t namePrepOptions = ((options & UIDNA_ALLOW_UNASSIGNED) != 0) ? USPREP_ALLOW_UNASSIGNED: 0; UChar b1Stack[MAX_LABEL_BUFFER_SIZE], b2Stack[MAX_LABEL_BUFFER_SIZE], b3Stack[MAX_LABEL_BUFFER_SIZE]; @@ -326,8 +379,7 @@ uidna_toUnicode(const UChar* src, int32_t srcLength, b2Capacity = MAX_LABEL_BUFFER_SIZE, b3Capacity = MAX_LABEL_BUFFER_SIZE, reqLength=0; - - StringPrep* prep = StringPrep::createNameprepInstance(*status); + b1Len = 0; UBool* caseFlags = NULL; @@ -335,44 +387,40 @@ uidna_toUnicode(const UChar* src, int32_t srcLength, UBool srcIsLDH = TRUE; int32_t failPos =0; - if(U_FAILURE(*status)){ - goto CLEANUP; - } - // step 1: find out if all the codepoints in src are ASCII if(srcLength==-1){ srcLength = 0; for(;src[srcLength]!=0;){ if(src[srcLength]> 0x7f){ srcIsASCII = FALSE; - } - // here we do not assemble surrogates - // since we know that LDH code points - // are in the ASCII range only - if(prep->isLDHChar(src[srcLength])==FALSE){ + }else if(isLDHChar(src[srcLength])==FALSE){ + // here we do not assemble surrogates + // since we know that LDH code points + // are in the ASCII range only srcIsLDH = FALSE; failPos = srcLength; } srcLength++; } - }else{ + }else if(srcLength > 0){ for(int32_t j=0; j 0x7f){ srcIsASCII = FALSE; - } - // here we do not assemble surrogates - // since we know that LDH code points - // are in the ASCII range only - if(prep->isLDHChar(src[j])==FALSE){ + }else if(isLDHChar(src[j])==FALSE){ + // here we do not assemble surrogates + // since we know that LDH code points + // are in the ASCII range only srcIsLDH = FALSE; failPos = j; } } + }else{ + return 0; } if(srcIsASCII == FALSE){ // step 2: process the string - b1Len = prep->process(src,srcLength,b1,b1Capacity,allowUnassigned, parseError, *status); + b1Len = usprep_prepare(nameprep, src, srcLength, b1, b1Capacity, namePrepOptions, parseError, status); if(*status == U_BUFFER_OVERFLOW_ERROR){ // redo processing of string /* we do not have enough room so grow the buffer*/ @@ -384,7 +432,7 @@ uidna_toUnicode(const UChar* src, int32_t srcLength, *status = U_ZERO_ERROR; // reset error - b1Len = prep->process(src,srcLength,b1, b1Len,allowUnassigned, parseError, *status); + b1Len = usprep_prepare(nameprep, src, srcLength, b1, b1Len, namePrepOptions, parseError, status); } //bail out on error if(U_FAILURE(*status)){ @@ -495,8 +543,7 @@ CLEANUP: } uprv_free(caseFlags); - delete prep; - + // The RFC states that // // ToUnicode never fails. If any step fails, then the original input @@ -518,45 +565,64 @@ CLEANUP: return u_terminateUChars(dest, destCapacity, reqLength, status); } -// returns the length of the label excluding the separator -// if *limit == separator then the length returned does not include -// the separtor. -static int32_t -getNextSeparator(UChar *src,int32_t srcLength,StringPrep* prep, - UChar **limit, - UBool *done, - UErrorCode *status){ - if(srcLength == -1){ - int32_t i; - for(i=0 ; ;i++){ - if(src[i] == 0){ - *limit = src + i; // point to null - *done = TRUE; - return i; - } - if(prep->isLabelSeparator(src[i],*status)){ - *limit = src + (i+1); // go past the delimiter - return i; - - } - } - }else{ - int32_t i; - for(i=0;iisLabelSeparator(src[i],*status)){ - *limit = src + (i+1); // go past the delimiter - return i; - } - } - // we have not found the delimiter - // if(i==srcLength) - *limit = src+srcLength; - *done = TRUE; +U_CAPI int32_t U_EXPORT2 +uidna_toASCII(const UChar* src, int32_t srcLength, + UChar* dest, int32_t destCapacity, + int32_t options, + UParseError* parseError, + UErrorCode* status){ + + if(status == NULL || U_FAILURE(*status)){ + return 0; + } + if((src==NULL) || (srcLength < -1) || (destCapacity<0) || (!dest && destCapacity > 0)){ + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } - return i; + UStringPrepProfile* nameprep = usprep_open(NULL,DATA_FILE_NAME, status); + + if(U_FAILURE(*status)){ + return -1; } + + int32_t retLen = _internal_toASCII(src, srcLength, dest, destCapacity, options, nameprep, parseError, status); + + /* close the profile*/ + usprep_close(nameprep); + + return retLen; } +U_CAPI int32_t U_EXPORT2 +uidna_toUnicode(const UChar* src, int32_t srcLength, + UChar* dest, int32_t destCapacity, + int32_t options, + UParseError* parseError, + UErrorCode* status){ + + if(status == NULL || U_FAILURE(*status)){ + return 0; + } + if( (src==NULL) || (srcLength < -1) || (destCapacity<0) || (!dest && destCapacity > 0)){ + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + UStringPrepProfile* nameprep = usprep_open(NULL, DATA_FILE_NAME, status); + + if(U_FAILURE(*status)){ + return -1; + } + + int32_t retLen = _internal_toUnicode(src, srcLength, dest, destCapacity, options, nameprep, parseError, status); + + usprep_close(nameprep); + + return retLen; +} + + U_CAPI int32_t U_EXPORT2 uidna_IDNToASCII( const UChar *src, int32_t srcLength, UChar* dest, int32_t destCapacity, @@ -574,7 +640,7 @@ uidna_IDNToASCII( const UChar *src, int32_t srcLength, int32_t reqLength = 0; - StringPrep* prep = StringPrep::createNameprepInstance(*status); + UStringPrepProfile* nameprep = usprep_open(NULL, DATA_FILE_NAME, status); if(U_FAILURE(*status)){ return 0; @@ -592,11 +658,12 @@ uidna_IDNToASCII( const UChar *src, int32_t srcLength, for(;;){ - labelLen = getNextSeparator(labelStart,remainingLen, prep, &delimiter,&done, status); + labelLen = getNextSeparator(labelStart,remainingLen, &delimiter,&done); - labelReqLength = uidna_toASCII( labelStart, labelLen, - currentDest, remainingDestCapacity, - options, parseError, status); + labelReqLength = _internal_toASCII( labelStart, labelLen, + currentDest, remainingDestCapacity, + options, nameprep, + parseError, status); if(*status == U_BUFFER_OVERFLOW_ERROR){ @@ -636,7 +703,7 @@ uidna_IDNToASCII( const UChar *src, int32_t srcLength, } - delete prep; + usprep_close(nameprep); return u_terminateUChars(dest, destCapacity, reqLength, status); } @@ -658,7 +725,7 @@ uidna_IDNToUnicode( const UChar* src, int32_t srcLength, int32_t reqLength = 0; - StringPrep* prep = StringPrep::createNameprepInstance(*status); + UStringPrepProfile* nameprep = usprep_open(NULL, DATA_FILE_NAME, status); if(U_FAILURE(*status)){ return 0; @@ -676,11 +743,12 @@ uidna_IDNToUnicode( const UChar* src, int32_t srcLength, for(;;){ - labelLen = getNextSeparator(labelStart,remainingLen, prep, &delimiter,&done, status); + labelLen = getNextSeparator(labelStart,remainingLen, &delimiter,&done); - labelReqLength = uidna_toUnicode(labelStart, labelLen, - currentDest, remainingDestCapacity, - options, parseError, status); + labelReqLength = _internal_toUnicode(labelStart, labelLen, + currentDest, remainingDestCapacity, + options, nameprep, + parseError, status); if(*status == U_BUFFER_OVERFLOW_ERROR){ @@ -721,7 +789,7 @@ uidna_IDNToUnicode( const UChar* src, int32_t srcLength, } - delete prep; + usprep_close(nameprep); return u_terminateUChars(dest, destCapacity, reqLength, status); } diff --git a/icuSources/common/uinit.c b/icuSources/common/uinit.c new file mode 100644 index 00000000..1f8fc089 --- /dev/null +++ b/icuSources/common/uinit.c @@ -0,0 +1,111 @@ +/* +****************************************************************************** +* * +* Copyright (C) 2001-2004, International Business Machines * +* Corporation and others. All Rights Reserved. * +* * +****************************************************************************** +* file name: uinit.c +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2001July05 +* created by: George Rhoten +*/ + +#include "unicode/utypes.h" +#include "unicode/uclean.h" +#include "utracimp.h" +#include "ustr_imp.h" +#include "unormimp.h" +#include "ucln_cmn.h" +#include "umutex.h" +#include "ucln.h" +#include "cmemory.h" +#include "uassert.h" + +static UBool gICUInitialized = FALSE; +static UMTX gICUInitMutex = NULL; + + +static cleanupFunc *gLibCleanupFunctions[UCLN_COMMON]; + +U_CAPI void U_EXPORT2 +ucln_registerCleanup(ECleanupLibraryType type, + cleanupFunc *func) +{ + U_ASSERT(UCLN_START < type && type < UCLN_COMMON); + if (UCLN_START < type && type < UCLN_COMMON) + { + gLibCleanupFunctions[type] = func; + } +} + +/************************************************ + The cleanup order is important in this function. + Please be sure that you have read ucln.h + ************************************************/ +U_CAPI void U_EXPORT2 +u_cleanup(void) +{ + ECleanupLibraryType libType; + + UTRACE_ENTRY_OC(UTRACE_U_CLEANUP); + umtx_lock(NULL); /* Force a memory barrier, so that we are sure to see */ + umtx_unlock(NULL); /* all state left around by any other threads. */ + + for (libType = UCLN_START+1; libType + * 23 '#' + * 24 '$' + * + * 40 '@' + * + * 5b '[' + * 5c '\' + * 5d ']' + * 5e '^' + * + * 60 '`' + * + * 7b '{' + * 7c '|' + * 7d '}' + * 7e '~' + */ +static const uint32_t invariantChars[4]={ + 0xfffffbff, /* 00..1f but not 0a */ + 0xffffffe5, /* 20..3f but not 21 23 24 */ + 0x87fffffe, /* 40..5f but not 40 5b..5e */ + 0x87fffffe /* 60..7f but not 60 7b..7e */ +}; + +/* + * test unsigned types (or values known to be non-negative) for invariant characters, + * tests ASCII-family character values + */ +#define UCHAR_IS_INVARIANT(c) (((c)<=0x7f) && (invariantChars[(c)>>5]&((uint32_t)1<<((c)&0x1f)))!=0) + +/* test signed types for invariant characters, adds test for positive values */ +#define SCHAR_IS_INVARIANT(c) ((0<=(c)) && UCHAR_IS_INVARIANT(c)) + +U_CAPI void U_EXPORT2 +u_charsToUChars(const char *cs, UChar *us, int32_t length) { + UChar u; + uint8_t c; + UBool onlyInvariantChars; + + /* + * Allow the entire ASCII repertoire to be mapped _to_ Unicode. + * For EBCDIC systems, this works for characters with codes from + * codepages 37 and 1047 or compatible. + */ + onlyInvariantChars=TRUE; + while(length>0) { + c=(uint8_t)(*cs++); +#if U_CHARSET_FAMILY==U_ASCII_FAMILY + u=(UChar)c; +#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY + u=(UChar)asciiFromEbcdic[c]; +#else +# error U_CHARSET_FAMILY is not valid +#endif + if(u==0 && c!=0) { + onlyInvariantChars=FALSE; + } + *us++=u; + --length; + } + U_ASSERT(onlyInvariantChars); /* only invariant chars? */ +} + +U_CAPI void U_EXPORT2 +u_UCharsToChars(const UChar *us, char *cs, int32_t length) { + UChar u; + UBool onlyInvariantChars; + + onlyInvariantChars=TRUE; + while(length>0) { + u=*us++; + if(!UCHAR_IS_INVARIANT(u)) { + onlyInvariantChars=FALSE; + u=0; + } +#if U_CHARSET_FAMILY==U_ASCII_FAMILY + *cs++=(char)u; +#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY + *cs++=(char)ebcdicFromAscii[u]; +#else +# error U_CHARSET_FAMILY is not valid +#endif + --length; + } + U_ASSERT(onlyInvariantChars); /* only invariant chars? */ +} + +U_CAPI UBool U_EXPORT2 +uprv_isInvariantString(const char *s, int32_t length) { + uint8_t c; + + for(;;) { + if(length<0) { + /* NUL-terminated */ + c=(uint8_t)*s++; + if(c==0) { + break; + } + } else { + /* count length */ + if(length==0) { + break; + } + --length; + c=(uint8_t)*s++; + if(c==0) { + continue; /* NUL is invariant */ + } + } + /* c!=0 now, one branch below checks c==0 for variant characters */ + + /* + * no assertions here because these functions are legitimately called + * for strings with variant characters + */ +#if U_CHARSET_FAMILY==U_ASCII_FAMILY + if(!UCHAR_IS_INVARIANT(c)) { + return FALSE; /* found a variant char */ + } +#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY + c=asciiFromEbcdic[c]; + if(c==0 || !UCHAR_IS_INVARIANT(c)) { + return FALSE; /* found a variant char */ + } +#else +# error U_CHARSET_FAMILY is not valid +#endif + } + return TRUE; +} + +U_CAPI UBool U_EXPORT2 +uprv_isInvariantUString(const UChar *s, int32_t length) { + UChar c; + + for(;;) { + if(length<0) { + /* NUL-terminated */ + c=*s++; + if(c==0) { + break; + } + } else { + /* count length */ + if(length==0) { + break; + } + --length; + c=*s++; + } + + /* + * no assertions here because these functions are legitimately called + * for strings with variant characters + */ + if(!UCHAR_IS_INVARIANT(c)) { + return FALSE; /* found a variant char */ + } + } + return TRUE; +} + +/* UDataSwapFn implementations used in udataswp.c ------- */ + +/* convert ASCII to EBCDIC and verify that all characters are invariant */ +U_CFUNC int32_t +uprv_ebcdicFromAscii(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const uint8_t *s; + uint8_t *t; + uint8_t c; + + int32_t count; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + if(ds==NULL || inData==NULL || length<0 || (length>0 && outData==NULL)) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* setup and swapping */ + s=(const uint8_t *)inData; + t=(uint8_t *)outData; + count=length; + while(count>0) { + c=*s++; + if(!UCHAR_IS_INVARIANT(c)) { + udata_printError(ds, "uprv_ebcdicFromAscii() string[%d] contains a variant character in position %d\n", + length, length-count); + *pErrorCode=U_INVALID_CHAR_FOUND; + return 0; + } + *t++=ebcdicFromAscii[c]; + --count; + } + + return length; +} + +/* this function only checks and copies ASCII strings without conversion */ +U_CFUNC int32_t +uprv_copyAscii(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const uint8_t *s; + uint8_t c; + + int32_t count; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + if(ds==NULL || inData==NULL || length<0 || (length>0 && outData==NULL)) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* setup and checking */ + s=(const uint8_t *)inData; + count=length; + while(count>0) { + c=*s++; + if(!UCHAR_IS_INVARIANT(c)) { + udata_printError(ds, "uprv_copyFromAscii() string[%d] contains a variant character in position %d\n", + length, length-count); + *pErrorCode=U_INVALID_CHAR_FOUND; + return 0; + } + --count; + } + + if(length>0 && inData!=outData) { + uprv_memcpy(outData, inData, length); + } + + return length; +} + +/* convert EBCDIC to ASCII and verify that all characters are invariant */ +U_CFUNC int32_t +uprv_asciiFromEbcdic(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const uint8_t *s; + uint8_t *t; + uint8_t c; + + int32_t count; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + if(ds==NULL || inData==NULL || length<0 || (length>0 && outData==NULL)) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* setup and swapping */ + s=(const uint8_t *)inData; + t=(uint8_t *)outData; + count=length; + while(count>0) { + c=*s++; + if(c!=0 && ((c=asciiFromEbcdic[c])==0 || !UCHAR_IS_INVARIANT(c))) { + udata_printError(ds, "uprv_asciiFromEbcdic() string[%d] contains a variant character in position %d\n", + length, length-count); + *pErrorCode=U_INVALID_CHAR_FOUND; + return 0; + } + *t++=c; + --count; + } + + return length; +} + +/* this function only checks and copies EBCDIC strings without conversion */ +U_CFUNC int32_t +uprv_copyEbcdic(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const uint8_t *s; + uint8_t c; + + int32_t count; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + if(ds==NULL || inData==NULL || length<0 || (length>0 && outData==NULL)) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* setup and checking */ + s=(const uint8_t *)inData; + count=length; + while(count>0) { + c=*s++; + if(c!=0 && ((c=asciiFromEbcdic[c])==0 || !UCHAR_IS_INVARIANT(c))) { + udata_printError(ds, "uprv_copyEbcdic() string[%] contains a variant character in position %d\n", + length, length-count); + *pErrorCode=U_INVALID_CHAR_FOUND; + return 0; + } + --count; + } + + if(length>0 && inData!=outData) { + uprv_memcpy(outData, inData, length); + } + + return length; +} + +/* compare invariant strings; variant characters compare less than others and unlike each other */ +U_CFUNC int32_t +uprv_compareInvAscii(const UDataSwapper *ds, + const char *outString, int32_t outLength, + const UChar *localString, int32_t localLength) { + int32_t minLength; + UChar32 c1, c2; + uint8_t c; + + if(outString==NULL || outLength<-1 || localString==NULL || localLength<-1) { + return 0; + } + + if(outLength<0) { + outLength=(int32_t)uprv_strlen(outString); + } + if(localLength<0) { + localLength=u_strlen(localString); + } + + minLength= outLength0) { + c=(uint8_t)*outString++; + if(UCHAR_IS_INVARIANT(c)) { + c1=c; + } else { + c1=-1; + } + + c2=*localString++; + if(!UCHAR_IS_INVARIANT(c2)) { + c1=-2; + } + + if((c1-=c2)!=0) { + return c1; + } + + --minLength; + } + + /* strings start with same prefix, compare lengths */ + return outLength-localLength; +} + +U_CFUNC int32_t +uprv_compareInvEbcdic(const UDataSwapper *ds, + const char *outString, int32_t outLength, + const UChar *localString, int32_t localLength) { + int32_t minLength; + UChar32 c1, c2; + uint8_t c; + + if(outString==NULL || outLength<-1 || localString==NULL || localLength<-1) { + return 0; + } + + if(outLength<0) { + outLength=(int32_t)uprv_strlen(outString); + } + if(localLength<0) { + localLength=u_strlen(localString); + } + + minLength= outLength0) { + c=(uint8_t)*outString++; + if(c==0) { + c1=0; + } else if((c1=asciiFromEbcdic[c])!=0 && UCHAR_IS_INVARIANT(c1)) { + /* c1 is set */ + } else { + c1=-1; + } + + c2=*localString++; + if(!UCHAR_IS_INVARIANT(c2)) { + c1=-2; + } + + if((c1-=c2)!=0) { + return c1; + } + + --minLength; + } + + /* strings start with same prefix, compare lengths */ + return outLength-localLength; +} diff --git a/icuSources/common/uinvchar.h b/icuSources/common/uinvchar.h new file mode 100644 index 00000000..2a333b81 --- /dev/null +++ b/icuSources/common/uinvchar.h @@ -0,0 +1,66 @@ +/* +******************************************************************************* +* +* Copyright (C) 1999-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: uinvchar.h +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:2 +* +* created on: 2004sep14 +* created by: Markus W. Scherer +* +* Definitions for handling invariant characters, moved here from putil.c +* for better modularization. +*/ + +#ifndef __UINVCHAR_H__ +#define __UINVCHAR_H__ + +#include "unicode/utypes.h" + +/** + * Check if a char string only contains invariant characters. + * See utypes.h for details. + * + * @param s Input string pointer. + * @param length Length of the string, can be -1 if NUL-terminated. + * @return TRUE if s contains only invariant characters. + * + * @internal (ICU 2.8) + */ +U_INTERNAL UBool U_EXPORT2 +uprv_isInvariantString(const char *s, int32_t length); + +/** + * Check if a Unicode string only contains invariant characters. + * See utypes.h for details. + * + * @param s Input string pointer. + * @param length Length of the string, can be -1 if NUL-terminated. + * @return TRUE if s contains only invariant characters. + * + * @internal (ICU 2.8) + */ +U_INTERNAL UBool U_EXPORT2 +uprv_isInvariantUString(const UChar *s, int32_t length); + +/** + * \def U_UPPER_ORDINAL + * Get the ordinal number of an uppercase invariant character + * @internal + */ +#if U_CHARSET_FAMILY==U_ASCII_FAMILY +# define U_UPPER_ORDINAL(x) ((x)-'A') +#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY +# define U_UPPER_ORDINAL(x) (((x) < 'J') ? ((x)-'A') : \ + (((x) < 'S') ? ((x)-'J'+9) : \ + ((x)-'S'+18))) +#else +# error Unknown charset family! +#endif + +#endif diff --git a/icuSources/common/uiter.cpp b/icuSources/common/uiter.cpp index 923ef2e0..6ca97508 100644 --- a/icuSources/common/uiter.cpp +++ b/icuSources/common/uiter.cpp @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2002-2003, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -232,13 +232,19 @@ uiter_setString(UCharIterator *iter, const UChar *s, int32_t length) { * except that UChars are assembled from byte pairs. */ +/* internal helper function */ +static inline UChar32 +utf16BEIteratorGet(UCharIterator *iter, int32_t index) { + const uint8_t *p=(const uint8_t *)iter->context; + return ((UChar)p[2*index]<<8)|(UChar)p[2*index+1]; +} + static UChar32 U_CALLCONV utf16BEIteratorCurrent(UCharIterator *iter) { int32_t index; if((index=iter->index)limit) { - const uint8_t *p=(const uint8_t *)iter->context; - return ((UChar)p[2*index]<<8)|(UChar)p[2*index+1]; + return utf16BEIteratorGet(iter, index); } else { return U_SENTINEL; } @@ -249,9 +255,8 @@ utf16BEIteratorNext(UCharIterator *iter) { int32_t index; if((index=iter->index)limit) { - const uint8_t *p=(const uint8_t *)iter->context; iter->index=index+1; - return ((UChar)p[2*index]<<8)|(UChar)p[2*index+1]; + return utf16BEIteratorGet(iter, index); } else { return U_SENTINEL; } @@ -262,9 +267,8 @@ utf16BEIteratorPrevious(UCharIterator *iter) { int32_t index; if((index=iter->index)>iter->start) { - const uint8_t *p=(const uint8_t *)iter->context; iter->index=--index; - return ((UChar)p[2*index]<<8)|(UChar)p[2*index+1]; + return utf16BEIteratorGet(iter, index); } else { return U_SENTINEL; } @@ -758,7 +762,7 @@ utf8IteratorMove(UCharIterator *iter, int32_t delta, UCharIteratorOrigin origin) iter->index=iter->length; /* may or may not be <0 (unknown) */ iter->start=iter->limit; iter->reservedField=0; - return iter->index>=0 ? iter->index : UITER_UNKNOWN_INDEX; + return iter->index>=0 ? iter->index : (int32_t)UITER_UNKNOWN_INDEX; } } @@ -840,7 +844,7 @@ utf8IteratorMove(UCharIterator *iter, int32_t delta, UCharIteratorOrigin origin) static UBool U_CALLCONV utf8IteratorHasNext(UCharIterator *iter) { - return iter->reservedField!=0 || iter->startlimit; + return iter->startlimit || iter->reservedField!=0; } static UBool U_CALLCONV @@ -1015,7 +1019,7 @@ uiter_setUTF8(UCharIterator *iter, const char *s, int32_t length) { if(length>=0) { iter->limit=length; } else { - iter->limit=uprv_strlen(s); + iter->limit=(int32_t)uprv_strlen(s); } iter->length= iter->limit<=1 ? iter->limit : -1; } else { diff --git a/icuSources/common/uloc.c b/icuSources/common/uloc.c index 3e3fad21..ddb1b206 100644 --- a/icuSources/common/uloc.c +++ b/icuSources/common/uloc.c @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1997-2003, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -16,6 +16,8 @@ * 04/06/99 stephen changed setDefault() to realloc and copy * 06/14/99 stephen Changed calls to ures_open for new params * 07/21/99 stephen Modified setDefault() to propagate to C++ +* 05/14/04 alan 7 years later: refactored, cleaned up, fixed bugs, +* brought canonicalization code into line with spec *****************************************************************************/ /* @@ -26,98 +28,128 @@ l = lang, C = ctry, M = charmap, V = variant */ - #include "unicode/utypes.h" #include "unicode/ustring.h" #include "unicode/uloc.h" +#include "putilimp.h" #include "ustr_imp.h" +#include "ulocimp.h" #include "uresimp.h" #include "umutex.h" #include "cstring.h" #include "cmemory.h" #include "ucln_cmn.h" +#include "locmap.h" +#include "uarrsort.h" +#include "uenumimp.h" +#include "uassert.h" -/**************************************************************************** - Global variable and type definitions -*****************************************************************************/ +#include /* for sprintf */ + +/* ### Declarations **************************************************/ /* Locale stuff from locid.cpp */ U_CFUNC void locale_set_default(const char *id); U_CFUNC const char *locale_get_default(void); +U_CFUNC int32_t +locale_getKeywords(const char *localeID, + char prev, + char *keywords, int32_t keywordCapacity, + char *values, int32_t valuesCapacity, int32_t *valLen, + UBool valuesToo, + UErrorCode *status); + +/* ### Constants **************************************************/ /* These strings describe the resources we attempt to load from the locale ResourceBundle data file.*/ -static const char _kLocaleID[] = "LocaleID"; -static const char _kLanguages[] = "Languages"; -static const char _kCountries[] = "Countries"; +static const char _kLanguages[] = "Languages"; +static const char _kScripts[] = "Scripts"; +static const char _kCountries[] = "Countries"; +static const char _kVariants[] = "Variants"; +static const char _kKeys[] = "Keys"; +static const char _kTypes[] = "Types"; static const char _kIndexLocaleName[] = "res_index"; -static const char _kIndexTag[] = "InstalledLocales"; - -#if 0 -/* We don't use these resources currently */ -static const char* _kLocaleString = "LocaleString"; -static const char* _kShortLanguage = "ShortLanguage"; -static const char* _kShortCountry = "ShortCountry"; -#endif - -#define TEMPBUFSIZE 8 - +static const char _kRootName[] = "root"; +static const char _kIndexTag[] = "InstalledLocales"; +static const char _kCurrency[] = "currency"; +static const char _kCurrencies[] = "Currencies"; static char** _installedLocales = NULL; static int32_t _installedLocalesCount = 0; -/* tables updated per http://www.egt.ie/standards/iso639 - and http://lcweb.loc.gov/standards/iso639-2/ - to include the revisions up to 2001/7/27 *CWB*/ -/* The 3 character codes are the terminology codes like RFC 3066. - This is compatible with prior ICU codes */ -/* "in" "iw" "ji" "jw" & "sh" have been withdrawn but are still in - the table but now at the end of the table because - 3 character codes are duplicates. This avoids bad searches - going from 3 to 2 character codes.*/ -/* The range qaa-qtz is reserved for local use. */ - -/* This list MUST be in sorted order, and MUST contain the two-letter codes -if one exists otherwise use the three letter code */ -static const char * const _languages[] = { - "aa", "ab", "ace", "ach", "ada", "ae", "af", "afa", - "afh", "ak", "akk", "ale", "alg", "am", "ang", "apa", +/* ### Data tables **************************************************/ + +/** + * Table of language codes, both 2- and 3-letter, with preference + * given to 2-letter codes where possible. Includes 3-letter codes + * that lack a 2-letter equivalent. + * + * This list must be in sorted order. This list is returned directly + * to the user by some API. + * + * This list must be kept in sync with LANGUAGES_3, with corresponding + * entries matched. + * + * This table should be terminated with a NULL entry, followed by a + * second list, and another NULL entry. The first list is visible to + * user code when this array is returned by API. The second list + * contains codes we support, but do not expose through user API. + * + * Notes + * + * Tables updated per http://lcweb.loc.gov/standards/iso639-2/ to + * include the revisions up to 2001/7/27 *CWB* + * + * The 3 character codes are the terminology codes like RFC 3066. This + * is compatible with prior ICU codes + * + * "in" "iw" "ji" "jw" & "sh" have been withdrawn but are still in the + * table but now at the end of the table because 3 character codes are + * duplicates. This avoids bad searches going from 3 to 2 character + * codes. + * + * The range qaa-qtz is reserved for local use + */ +static const char * const LANGUAGES[] = { + "aa", "ab", "ace", "ach", "ada", "ady", "ae", "af", "afa", + "afh", "ak", "akk", "ale", "alg", "am", "an", "ang", "apa", "ar", "arc", "arn", "arp", "art", "arw", "as", "ast", "ath", "aus", "av", "awa", "ay", "az", "ba", "bad", - "bai", "bal", "bam", "ban", "bas", "bat", "be", "bej", + "bai", "bal", "ban", "bas", "bat", "be", "bej", "bem", "ber", "bg", "bh", "bho", "bi", "bik", "bin", "bla", "bm", "bn", "bnt", "bo", "br", "bra", "bs", - "btk", "bua", "bug", "ca", "cad", "cai", "car", "cau", + "btk", "bua", "bug", "byn", "ca", "cad", "cai", "car", "cau", "ce", "ceb", "cel", "ch", "chb", "chg", "chk", "chm", "chn", "cho", "chp", "chr", "chy", "cmc", "co", "cop", - "cpe", "cpf", "cpp", "cre", "crp", "cs", "cu", "cus", - "cv", "cy", "da", "dak", "day", "de", "del", "den", - "dgr", "din", "doi", "dra", "dua", "dum", "dv", "dyu", + "cpe", "cpf", "cpp", "cr", "crh", "crp", "cs", "csb", "cu", "cus", + "cv", "cy", "da", "dak", "dar", "day", "de", "del", "den", + "dgr", "din", "doi", "dra", "dsb", "dua", "dum", "dv", "dyu", "dz", "ee", "efi", "egy", "eka", "el", "elx", "en", - "enm", "eo", "es", "et", "eu", "ewe", "ewo", "fa", + "enm", "eo", "es", "et", "eu", "ewo", "fa", "fan", "fat", "ff", "fi", "fiu", "fj", "fo", "fon", "fr", "frm", "fro", "fur", "fy", "ga", "gaa", "gay", "gba", "gd", "gem", "gez", "gil", "gl", "gmh", "gn", "goh", "gon", "gor", "got", "grb", "grc", "gu", "gv", "gwi", "ha", "hai", "haw", "he", "hi", "hil", "him", - "hit", "hmn", "ho", "hr", "hu", "hup", "hy", "hz", + "hit", "hmn", "ho", "hr", "hsb", "ht", "hu", "hup", "hy", "hz", "ia", "iba", "id", "ie", "ig", "ii", "ijo", "ik", - "ilo", "inc", "ine", "inh", "ira", "iro", "is", "it", - "iu", "ja", "jpr", "jrb", "jv", "ka", "kaa", "kab", + "ilo", "inc", "ine", "inh", "io", "ira", "iro", "is", "it", + "iu", "ja", "jbo", "jpr", "jrb", "jv", "ka", "kaa", "kab", "kac", "kam", "kar", "kaw", "kbd", "kg", "kha", "khi", "kho", "ki", "kj", "kk", "kl", "km", "kmb", "kn", - "ko", "kok", "kos", "kpe", "kr", "kro", "kru", "ks", + "ko", "kok", "kos", "kpe", "kr", "krc", "kro", "kru", "ks", "ku", "kum", "kut", "kv", "kw", "ky", "la", "lad", - "lah", "lam", "lb", "lez", "lg", "ln", "lo", "lol", + "lah", "lam", "lb", "lez", "lg", "li", "ln", "lo", "lol", "loz", "lt", "lu", "lua", "lui", "lun", "luo", "lus", "lv", "mad", "mag", "mai", "mak", "man", "map", "mas", - "mdr", "men", "mg", "mga", "mh", "mi", "mic", "min", + "mdf", "mdr", "men", "mg", "mga", "mh", "mi", "mic", "min", "mis", "mk", "mkh", "ml", "mn", "mnc", "mni", "mno", "mo", "moh", "mos", "mr", "ms", "mt", "mul", "mun", - "mus", "mwr", "my", "myn", "na", "nah", "nai", "nap", + "mus", "mwr", "my", "myn", "myv", "na", "nah", "nai", "nap", "nb", "nd", "nds", "ne", "new", "ng", "nia", "nic", - "niu", "nl", "nn", "no", "non", "nr", "nso", "nub", - "nv", "ny", "nym", "nyn", "nyo", "nzi", "oc", "oj", + "niu", "nl", "nn", "no", "nog", "non", "nr", "nso", "nub", + "nv", "nwc", "ny", "nym", "nyn", "nyo", "nzi", "oc", "oj", "om", "or", "os", "osa", "ota", "oto", "pa", "paa", "pag", "pal", "pam", "pap", "pau", "peo", "phi", "phn", "pi", "pl", "pon", "pra", "pro", "ps", "pt", "qu", @@ -130,11 +162,11 @@ static const char * const _languages[] = { "srr", "ss", "ssa", "st", "su", "suk", "sus", "sux", "sv", "sw", "syr", "ta", "tai", "te", "tem", "ter", "tet", "tg", "th", "ti", "tig", "tiv", "tk", "tkl", - "tl", "tli", "tmh", "tn", "to", "tog", "tpi", "tr", + "tl", "tlh", "tli", "tmh", "tn", "to", "tog", "tpi", "tr", "ts", "tsi", "tt", "tum", "tup", "tut", "tvl", "tw", - "ty", "tyv", "ug", "uga", "uk", "umb", "und", "ur", + "ty", "tyv", "udm", "ug", "uga", "uk", "umb", "und", "ur", "uz", "vai", "ve", "vi", "vo", "vot", "wa", "wak", - "wal", "war", "was", "wen", "wo", "xh", "yao", "yap", + "wal", "war", "was", "wen", "wo", "xal", "xh", "yao", "yap", "yi", "yo", "ypk", "za", "zap", "zen", "zh", "znd", "zu", "zun", NULL, @@ -142,40 +174,53 @@ NULL, NULL }; -/* This list MUST contain a three-letter code for every two-letter code in the - list above, and they MUST ne in the same order (i.e., the same language must - be in the same place in both lists)! */ -static const char * const _languages3[] = { -/* "aa", "ab", "ace", "ach", "ada", "ae", "af", "afa", */ - "aar", "abk", "ace", "ach", "ada", "ave", "afr", "afa", -/* "afh", "ak", "akk", "ale", "alg", "am", "ang", "apa", */ - "afh", "aka", "akk", "ale", "alg", "amh", "ang", "apa", +/** + * Table of 3-letter language codes. + * + * This is a lookup table used to convert 3-letter language codes to + * their 2-letter equivalent, where possible. It must be kept in sync + * with LANGUAGES. For all valid i, LANGUAGES[i] must refer to the + * same language as LANGUAGES_3[i]. The commented-out lines are + * copied from LANGUAGES to make eyeballing this baby easier. + * + * Where a 3-letter language code has no 2-letter equivalent, the + * 3-letter code occupies both LANGUAGES[i] and LANGUAGES_3[i]. + * + * This table should be terminated with a NULL entry, followed by a + * second list, and another NULL entry. The two lists correspond to + * the two lists in LANGUAGES. + */ +static const char * const LANGUAGES_3[] = { +/* "aa", "ab", "ace", "ach", "ada", "ady", "ae", "af", "afa", */ + "aar", "abk", "ace", "ach", "ada", "ady", "ave", "afr", "afa", +/* "afh", "ak", "akk", "ale", "alg", "am", "an", "ang", "apa", */ + "afh", "aka", "akk", "ale", "alg", "amh", "arg", "ang", "apa", /* "ar", "arc", "arn", "arp", "art", "arw", "as", "ast", */ "ara", "arc", "arn", "arp", "art", "arw", "asm", "ast", /* "ath", "aus", "av", "awa", "ay", "az", "ba", "bad", */ "ath", "aus", "ava", "awa", "aym", "aze", "bak", "bad", -/* "bai", "bal", "bam", "ban", "bas", "bat", "be", "bej", */ - "bai", "bal", "bam", "ban", "bas", "bat", "bel", "bej", +/* "bai", "bal", "ban", "bas", "bat", "be", "bej", */ + "bai", "bal", "ban", "bas", "bat", "bel", "bej", /* "bem", "ber", "bg", "bh", "bho", "bi", "bik", "bin", */ "bem", "ber", "bul", "bih", "bho", "bis", "bik", "bin", /* "bla", "bm", "bn", "bnt", "bo", "br", "bra", "bs", */ - "bla", "bm", "ben", "bnt", "bod", "bre", "bra", "bos", -/* "btk", "bua", "bug", "ca", "cad", "cai", "car", "cau", */ - "btk", "bua", "bug", "cat", "cad", "cai", "car", "cau", + "bla", "bam", "ben", "bnt", "bod", "bre", "bra", "bos", +/* "btk", "bua", "bug", "byn", "ca", "cad", "cai", "car", "cau", */ + "btk", "bua", "bug", "byn", "cat", "cad", "cai", "car", "cau", /* "ce", "ceb", "cel", "ch", "chb", "chg", "chk", "chm", */ "che", "ceb", "cel", "cha", "chb", "chg", "chk", "chm", /* "chn", "cho", "chp", "chr", "chy", "cmc", "co", "cop", */ "chn", "cho", "chp", "chr", "chy", "cmc", "cos", "cop", -/* "cpe", "cpf", "cpp", "cre", "crp", "cs", "cu", "cus", */ - "cpe", "cpf", "cpp", "cre", "crp", "ces", "chu", "cus", -/* "cv", "cy", "da", "dak", "day", "de", "del", "den", */ - "chv", "cym", "dan", "dak", "day", "deu", "del", "den", -/* "dgr", "din", "doi", "dra", "dua", "dum", "dv", "dyu", */ - "dgr", "din", "doi", "dra", "dua", "dum", "div", "dyu", +/* "cpe", "cpf", "cpp", "cr", "crh", "crp", "cs", "csb", "cu", "cus", */ + "cpe", "cpf", "cpp", "cre", "crh", "crp", "ces", "csb", "chu", "cus", +/* "cv", "cy", "da", "dak", "dar", "day", "de", "del", "den", */ + "chv", "cym", "dan", "dak", "dar", "day", "deu", "del", "den", +/* "dgr", "din", "doi", "dra", "dsb", "dua", "dum", "dv", "dyu", */ + "dgr", "din", "doi", "dra", "dsb", "dua", "dum", "div", "dyu", /* "dz", "ee", "efi", "egy", "eka", "el", "elx", "en", */ "dzo", "ewe", "efi", "egy", "eka", "ell", "elx", "eng", -/* "enm", "eo", "es", "et", "eu", "ewe", "ewo", "fa", */ - "enm", "epo", "spa", "est", "eus", "ewe", "ewo", "fas", +/* "enm", "eo", "es", "et", "eu", "ewo", "fa", */ + "enm", "epo", "spa", "est", "eus", "ewo", "fas", /* "fan", "fat", "ff", "fi", "fiu", "fj", "fo", "fon", */ "fan", "fat", "ful", "fin", "fiu", "fij", "fao", "fon", /* "fr", "frm", "fro", "fur", "fy", "ga", "gaa", "gay", */ @@ -186,42 +231,42 @@ static const char * const _languages3[] = { "goh", "gon", "gor", "got", "grb", "grc", "guj", "glv", /* "gwi", "ha", "hai", "haw", "he", "hi", "hil", "him", */ "gwi", "hau", "hai", "haw", "heb", "hin", "hil", "him", -/* "hit", "hmn", "ho", "hr", "hu", "hup", "hy", "hz", */ - "hit", "hmn", "hmo", "hrv", "hun", "hup", "hye", "her", +/* "hit", "hmn", "ho", "hr", "hsb", "ht", "hu", "hup", "hy", "hz", */ + "hit", "hmn", "hmo", "hrv", "hsb", "hat", "hun", "hup", "hye", "her", /* "ia", "iba", "id", "ie", "ig", "ii", "ijo", "ik", */ "ina", "iba", "ind", "ile", "ibo", "iii", "ijo", "ipk", -/* "ilo", "inc", "ine", "inh", "ira", "iro", "is", "it", */ - "ilo", "inc", "ine", "inh", "ira", "iro", "isl", "ita", -/* "iu", "ja", "jpr", "jrb", "jv", "ka", "kaa", "kab", */ - "iku", "jpn", "jpr", "jrb", "jaw", "kat", "kaa", "kab", +/* "ilo", "inc", "ine", "inh", "io", "ira", "iro", "is", "it", */ + "ilo", "inc", "ine", "inh", "ido", "ira", "iro", "isl", "ita", +/* "iu", "ja", "jbo", "jpr", "jrb", "jv", "ka", "kaa", "kab", */ + "iku", "jpn", "jbo", "jpr", "jrb", "jav", "kat", "kaa", "kab", /* "kac", "kam", "kar", "kaw", "kbd", "kg", "kha", "khi", */ "kac", "kam", "kar", "kaw", "kbd", "kon", "kha", "khi", /* "kho", "ki", "kj", "kk", "kl", "km", "kmb", "kn", */ "kho", "kik", "kua", "kaz", "kal", "khm", "kmb", "kan", -/* "ko", "kok", "kos", "kpe", "kr", "kro", "kru", "ks", */ - "kor", "kok", "kos", "kpe", "kau", "kro", "kru", "kas", +/* "ko", "kok", "kos", "kpe", "kr", "krc", "kro", "kru", "ks", */ + "kor", "kok", "kos", "kpe", "kau", "krc", "kro", "kru", "kas", /* "ku", "kum", "kut", "kv", "kw", "ky", "la", "lad", */ "kur", "kum", "kut", "kom", "cor", "kir", "lat", "lad", -/* "lah", "lam", "lb", "lez", "lg", "ln", "lo", "lol", */ - "lah", "lam", "ltz", "lez", "lug", "lin", "lao", "lol", +/* "lah", "lam", "lb", "lez", "lg", "li", "ln", "lo", "lol", */ + "lah", "lam", "ltz", "lez", "lug", "lim", "lin", "lao", "lol", /* "loz", "lt", "lu", "lua", "lui", "lun", "luo", "lus", */ "loz", "lit", "lub", "lua", "lui", "lun", "luo", "lus", /* "lv", "mad", "mag", "mai", "mak", "man", "map", "mas", */ "lav", "mad", "mag", "mai", "mak", "man", "map", "mas", -/* "mdr", "men", "mg", "mga", "mh", "mi", "mic", "min", */ - "mdr", "men", "mlg", "mga", "mah", "mri", "mic", "min", +/* "mdf", "mdr", "men", "mg", "mga", "mh", "mi", "mic", "min", */ + "mdf", "mdr", "men", "mlg", "mga", "mah", "mri", "mic", "min", /* "mis", "mk", "mkh", "ml", "mn", "mnc", "mni", "mno", */ "mis", "mkd", "mkh", "mal", "mon", "mnc", "mni", "mno", /* "mo", "moh", "mos", "mr", "ms", "mt", "mul", "mun", */ "mol", "moh", "mos", "mar", "msa", "mlt", "mul", "mun", -/* "mus", "mwr", "my", "myn", "na", "nah", "nai", "nap", */ - "mus", "mwr", "mya", "myn", "nau", "nah", "nai", "nap", +/* "mus", "mwr", "my", "myn", "myv", "na", "nah", "nai", "nap", */ + "mus", "mwr", "mya", "myn", "myv", "nau", "nah", "nai", "nap", /* "nb", "nd", "nds", "ne", "new", "ng", "nia", "nic", */ "nob", "nde", "nds", "nep", "new", "ndo", "nia", "nic", -/* "niu", "nl", "nn", "no", "non", "nr", "nso", "nub", */ - "niu", "nld", "nno", "nor", "non", "nbl", "nso", "nub", -/* "nv", "ny", "nym", "nyn", "nyo", "nzi", "oc", "oj", */ - "nav", "nya", "nym", "nyn", "nyo", "nzi", "oci", "oji", +/* "niu", "nl", "nn", "no", "nog", "non", "nr", "nso", "nub", */ + "niu", "nld", "nno", "nor", "nog", "non", "nbl", "nso", "nub", +/* "nv", "nwc", "ny", "nym", "nyn", "nyo", "nzi", "oc", "oj", */ + "nav", "nwc", "nya", "nym", "nyn", "nyo", "nzi", "oci", "oji", /* "om", "or", "os", "osa", "ota", "oto", "pa", "paa", */ "orm", "ori", "oss", "osa", "ota", "oto", "pan", "paa", /* "pag", "pal", "pam", "pap", "pau", "peo", "phi", "phn", */ @@ -246,16 +291,16 @@ static const char * const _languages3[] = { "swe", "swa", "syr", "tam", "tai", "tel", "tem", "ter", /* "tet", "tg", "th", "ti", "tig", "tiv", "tk", "tkl", */ "tet", "tgk", "tha", "tir", "tig", "tiv", "tuk", "tkl", -/* "tl", "tli", "tmh", "tn", "to", "tog", "tpi", "tr", */ - "tgl", "tli", "tmh", "tsn", "ton", "tog", "tpi", "tur", +/* "tl", "tlh", "tli", "tmh", "tn", "to", "tog", "tpi", "tr", */ + "tgl", "tlh", "tli", "tmh", "tsn", "ton", "tog", "tpi", "tur", /* "ts", "tsi", "tt", "tum", "tup", "tut", "tvl", "tw", */ "tso", "tsi", "tat", "tum", "tup", "tut", "tvl", "twi", -/* "ty", "tyv", "ug", "uga", "uk", "umb", "und", "ur", */ - "tah", "tyv", "uig", "uga", "ukr", "umb", "und", "urd", +/* "ty", "tyv", "udm", "ug", "uga", "uk", "umb", "und", "ur", */ + "tah", "tyv", "udm", "uig", "uga", "ukr", "umb", "und", "urd", /* "uz", "vai", "ve", "vi", "vo", "vot", "wa", "wak", */ "uzb", "vai", "ven", "vie", "vol", "vot", "wln", "wak", -/* "wal", "war", "was", "wen", "wo", "xh", "yao", "yap", */ - "wal", "war", "was", "wen", "wol", "xho", "yao", "yap", +/* "wal", "war", "was", "wen", "wo", "xal", "xh", "yao", "yap", */ + "wal", "war", "was", "wen", "wol", "xal", "xho", "yao", "yap", /* "yi", "yo", "ypk", "za", "zap", "zen", "zh", "znd", */ "yid", "yor", "ypk", "zha", "zap", "zen", "zho", "znd", /* "zu", "zun", */ @@ -266,17 +311,31 @@ NULL, NULL }; -/* ZR(ZAR) is now CD(COD) and FX(FXX) is PS(PSE) as per - http://www.evertype.com/standards/iso3166/iso3166-1-en.html - added new codes keeping the old ones for compatibility - updated to include 1999/12/03 revisions *CWB*/ - -/* RO(ROM) is now RO(ROU) according to - http://www.iso.org/iso/en/prods-services/iso3166ma/03updates-on-iso-3166/nlv3e-rou.html -*/ - -/* This list MUST be in sorted order, and MUST contain only two-letter codes! */ -static const char * const _countries[] = { +/** + * Table of 2-letter country codes. + * + * This list must be in sorted order. This list is returned directly + * to the user by some API. + * + * This list must be kept in sync with COUNTRIES_3, with corresponding + * entries matched. + * + * This table should be terminated with a NULL entry, followed by a + * second list, and another NULL entry. The first list is visible to + * user code when this array is returned by API. The second list + * contains codes we support, but do not expose through user API. + * + * Notes: + * + * ZR(ZAR) is now CD(COD) and FX(FXX) is PS(PSE) as per + * http://www.evertype.com/standards/iso3166/iso3166-1-en.html added + * new codes keeping the old ones for compatibility updated to include + * 1999/12/03 revisions *CWB* + * + * RO(ROM) is now RO(ROU) according to + * http://www.iso.org/iso/en/prods-services/iso3166ma/03updates-on-iso-3166/nlv3e-rou.html + */ +static const char * const COUNTRIES[] = { "AD", "AE", "AF", "AG", "AI", "AL", "AM", "AN", "AO", "AQ", "AR", "AS", "AT", "AU", "AW", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH", "BI", @@ -312,9 +371,20 @@ NULL, NULL }; -/* This list MUST contain a three-letter code for every two-letter code in - the above list, and they MUST be listed in the same order! */ -static const char * const _countries3[] = { +/** + * Table of 3-letter country codes. + * + * This is a lookup table used to convert 3-letter country codes to + * their 2-letter equivalent. It must be kept in sync with COUNTRIES. + * For all valid i, COUNTRIES[i] must refer to the same country as + * COUNTRIES_3[i]. The commented-out lines are copied from COUNTRIES + * to make eyeballing this baby easier. + * + * This table should be terminated with a NULL entry, followed by a + * second list, and another NULL entry. The two lists correspond to + * the two lists in COUNTRIES. + */ +static const char * const COUNTRIES_3[] = { /* "AD", "AE", "AF", "AG", "AI", "AL", "AM", "AN", */ "AND", "ARE", "AFG", "ATG", "AIA", "ALB", "ARM", "ANT", /* "AO", "AQ", "AR", "AS", "AT", "AU", "AW", "AZ", */ @@ -381,17 +451,610 @@ NULL, NULL }; -/******************************************************************************* - Implementation function definitions -*******************************************************************************/ +typedef struct CanonicalizationMap { + const char *id; /* input ID */ + const char *canonicalID; /* canonicalized output ID */ + const char *keyword; /* keyword, or NULL if none */ + const char *value; /* keyword value, or NULL if kw==NULL */ +} CanonicalizationMap; + +/** + * A map to canonicalize locale IDs. This handles a variety of + * different semantic kinds of transformations. + */ +static const CanonicalizationMap CANONICALIZE_MAP[] = { + { "", "en_US_POSIX", NULL, NULL }, /* .NET name */ + { "C", "en_US_POSIX", NULL, NULL }, /* POSIX name */ + { "art_LOJBAN", "jbo", NULL, NULL }, /* registered name */ + { "az_AZ_CYRL", "az_Cyrl_AZ", NULL, NULL }, /* .NET name */ + { "az_AZ_LATN", "az_Latn_AZ", NULL, NULL }, /* .NET name */ + { "ca_ES_PREEURO", "ca_ES", "currency", "ESP" }, + { "cel_GAULISH", "cel__GAULISH", NULL, NULL }, /* registered name */ + { "de_1901", "de__1901", NULL, NULL }, /* registered name */ + { "de_1906", "de__1906", NULL, NULL }, /* registered name */ + { "de__PHONEBOOK", "de", "collation", "phonebook" }, + { "de_AT_PREEURO", "de_AT", "currency", "ATS" }, + { "de_DE_PREEURO", "de_DE", "currency", "DEM" }, + { "de_LU_PREEURO", "de_LU", "currency", "LUF" }, + { "el_GR_PREEURO", "el_GR", "currency", "GRD" }, + { "en_BOONT", "en__BOONT", NULL, NULL }, /* registered name */ + { "en_SCOUSE", "en__SCOUSE", NULL, NULL }, /* registered name */ + { "en_BE_PREEURO", "en_BE", "currency", "BEF" }, + { "en_IE_PREEURO", "en_IE", "currency", "IEP" }, + { "es__TRADITIONAL", "es", "collation", "traditional" }, + { "es_ES_PREEURO", "es_ES", "currency", "ESP" }, + { "eu_ES_PREEURO", "eu_ES", "currency", "ESP" }, + { "fi_FI_PREEURO", "fi_FI", "currency", "FIM" }, + { "fr_BE_PREEURO", "fr_BE", "currency", "BEF" }, + { "fr_FR_PREEURO", "fr_FR", "currency", "FRF" }, + { "fr_LU_PREEURO", "fr_LU", "currency", "LUF" }, + { "ga_IE_PREEURO", "ga_IE", "currency", "IEP" }, + { "gl_ES_PREEURO", "gl_ES", "currency", "ESP" }, + { "hi__DIRECT", "hi", "collation", "direct" }, + { "it_IT_PREEURO", "it_IT", "currency", "ITL" }, + { "ja_JP_TRADITIONAL", "ja_JP", "calendar", "japanese" }, + { "nb_NO_NY", "nn_NO", NULL, NULL }, /* "markus said this was ok" :-) */ + { "nl_BE_PREEURO", "nl_BE", "currency", "BEF" }, + { "nl_NL_PREEURO", "nl_NL", "currency", "NLG" }, + { "pt_PT_PREEURO", "pt_PT", "currency", "PTE" }, + { "sl_ROZAJ", "sl__ROZAJ", NULL, NULL }, /* registered name */ + { "sr_SP_CYRL", "sr_Cyrl_SP", NULL, NULL }, /* .NET name */ + { "sr_SP_LATN", "sr_Latn_SP", NULL, NULL }, /* .NET name */ + { "uz_UZ_CYRL", "uz_Cyrl_UZ", NULL, NULL }, /* .NET name */ + { "uz_UZ_LATN", "uz_Latn_UZ", NULL, NULL }, /* .NET name */ + { "zh_CHS", "zh_Hans", NULL, NULL }, /* .NET name */ + { "zh_CHT", "zh_TW", NULL, NULL }, /* .NET name TODO: This should be zh_Hant once the locale structure is fixed. */ + { "zh_GAN", "zh__GAN", NULL, NULL }, /* registered name */ + { "zh_GUOYU", "zh", NULL, NULL }, /* registered name */ + { "zh_HAKKA", "zh__HAKKA", NULL, NULL }, /* registered name */ + { "zh_MIN", "zh__MIN", NULL, NULL }, /* registered name */ + { "zh_MIN_NAN", "zh__MINNAN", NULL, NULL }, /* registered name */ + { "zh_WUU", "zh__WUU", NULL, NULL }, /* registered name */ + { "zh_XIANG", "zh__XIANG", NULL, NULL }, /* registered name */ + { "zh_YUE", "zh__YUE", NULL, NULL }, /* registered name */ + { "th_TH_TRADITIONAL", "th_TH", "calendar", "buddhist" }, + { "zh_TW_STROKE", "zh_TW", "collation", "stroke" }, + { "zh__PINYIN", "zh", "collation", "pinyin" } +}; + +/* ### Keywords **************************************************/ + +#define ULOC_KEYWORD_BUFFER_LEN 25 +#define ULOC_MAX_NO_KEYWORDS 25 + +static const char * +locale_getKeywordsStart(const char *localeID) { + /* TODO This seems odd. No matter what charset we're on, won't '@' + be '@'? Or are we building on one EBCDIC machine and moving the + library to another? */ + const char *result = NULL; + static const uint8_t ebcdicSigns[] = { 0x7C, 0x44, 0x66, 0x80, 0xAC, 0xAE, 0xAF, 0xB5, 0xEC, 0xEF, 0x00 }; + if((result = uprv_strchr(localeID, '@')) != NULL) { + return result; + } else if(U_CHARSET_FAMILY == U_EBCDIC_FAMILY) { + const uint8_t *charToFind = ebcdicSigns; + while(*charToFind) { + if((result = uprv_strchr(localeID, *charToFind)) != NULL) { + return result; + } + charToFind++; + } + } + return NULL; +} + +/** + * @param buf buffer of size [ULOC_KEYWORD_BUFFER_LEN] + * @param keywordName incoming name to be canonicalized + * @param status return status (keyword too long) + * @return length of the keyword name + */ +static int32_t locale_canonKeywordName(char *buf, const char *keywordName, UErrorCode *status) +{ + int32_t i; + int32_t keywordNameLen = uprv_strlen(keywordName); + + if(keywordNameLen >= ULOC_KEYWORD_BUFFER_LEN) { + /* keyword name too long for internal buffer */ + *status = U_INTERNAL_PROGRAM_ERROR; + return 0; + } + + /* normalize the keyword name */ + for(i = 0; i < keywordNameLen; i++) { + buf[i] = uprv_tolower(keywordName[i]); + } + buf[i] = 0; + + return keywordNameLen; +} + +typedef struct { + char keyword[ULOC_KEYWORD_BUFFER_LEN]; + int32_t keywordLen; + const char *valueStart; + int32_t valueLen; +} KeywordStruct; + +static int32_t U_CALLCONV +compareKeywordStructs(const void *context, const void *left, const void *right) { + const char* leftString = ((const KeywordStruct *)left)->keyword; + const char* rightString = ((const KeywordStruct *)right)->keyword; + return uprv_strcmp(leftString, rightString); +} + +/** + * Both addKeyword and addValue must already be in canonical form. + * Either both addKeyword and addValue are NULL, or neither is NULL. + * If they are not NULL they must be zero terminated. + * If addKeyword is not NULL is must have length small enough to fit in KeywordStruct.keyword. + */ +static int32_t +_getKeywords(const char *localeID, + char prev, + char *keywords, int32_t keywordCapacity, + char *values, int32_t valuesCapacity, int32_t *valLen, + UBool valuesToo, + const char* addKeyword, + const char* addValue, + UErrorCode *status) +{ + KeywordStruct keywordList[ULOC_MAX_NO_KEYWORDS]; + + int32_t maxKeywords = ULOC_MAX_NO_KEYWORDS; + int32_t numKeywords = 0; + const char* pos = localeID; + const char* equalSign = NULL; + const char* semicolon = NULL; + int32_t i = 0, j, n; + int32_t keywordsLen = 0; + int32_t valuesLen = 0; + + if(prev == '@') { /* start of keyword definition */ + /* we will grab pairs, trim spaces, lowercase keywords, sort and return */ + do { + UBool duplicate = FALSE; + /* skip leading spaces */ + while(*pos == ' ') { + pos++; + } + if (!*pos) { /* handle trailing "; " */ + break; + } + if(numKeywords == maxKeywords) { + *status = U_INTERNAL_PROGRAM_ERROR; + return 0; + } + equalSign = uprv_strchr(pos, '='); + semicolon = uprv_strchr(pos, ';'); + /* lack of '=' [foo@currency] is illegal */ + /* ';' before '=' [foo@currency;collation=pinyin] is illegal */ + if(!equalSign || (semicolon && semicolon= ULOC_KEYWORD_BUFFER_LEN) { + /* keyword name too long for internal buffer */ + *status = U_INTERNAL_PROGRAM_ERROR; + return 0; + } + for(i = 0, n = 0; i < equalSign - pos; ++i) { + if (pos[i] != ' ') { + keywordList[numKeywords].keyword[n++] = uprv_tolower(pos[i]); + } + } + keywordList[numKeywords].keyword[n] = 0; + keywordList[numKeywords].keywordLen = n; + /* now grab the value part. First we skip the '=' */ + equalSign++; + /* then we leading spaces */ + while(*equalSign == ' ') { + equalSign++; + } + keywordList[numKeywords].valueStart = equalSign; + + pos = semicolon; + i = 0; + if(pos) { + while(*(pos - i - 1) == ' ') { + i++; + } + keywordList[numKeywords].valueLen = pos - equalSign - i; + pos++; + } else { + i = uprv_strlen(equalSign); + while(equalSign[i-1] == ' ') { + i--; + } + keywordList[numKeywords].valueLen = i; + } + /* If this is a duplicate keyword, then ignore it */ + for (j=0; j1) { + bufLen = uprv_strlen(buffer); + } else { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + if(startSearchHere == NULL || (startSearchHere[1]==0)) { + if(!keywordValue) { /* no keywords = nothing to remove */ + return bufLen; + } + + needLen = bufLen+1+keywordNameLen+1+keywordValueLen; + if(startSearchHere) { /* had a single @ */ + needLen--; /* already had the @ */ + /* startSearchHere points at the @ */ + } else { + startSearchHere=buffer+bufLen; + } + if(needLen >= bufferCapacity) { + *status = U_BUFFER_OVERFLOW_ERROR; + return needLen; /* no change */ + } + *startSearchHere = '@'; + startSearchHere++; + uprv_strcpy(startSearchHere, keywordNameBuffer); + startSearchHere += keywordNameLen; + *startSearchHere = '='; + startSearchHere++; + uprv_strcpy(startSearchHere, keywordValue); + startSearchHere+=keywordValueLen; + return needLen; + } /* end shortcut - no @ */ + + keywordStart = startSearchHere; + /* search for keyword */ + while(keywordStart) { + keywordStart++; + /* skip leading spaces (allowed?) */ + while(*keywordStart == ' ') { + keywordStart++; + } + nextEqualsign = uprv_strchr(keywordStart, '='); + /* need to normalize both keyword and keyword name */ + if(!nextEqualsign) { + break; + } + if(nextEqualsign - keywordStart >= ULOC_KEYWORD_BUFFER_LEN) { + /* keyword name too long for internal buffer */ + *status = U_INTERNAL_PROGRAM_ERROR; + return 0; + } + for(i = 0; i < nextEqualsign - keywordStart; i++) { + localeKeywordNameBuffer[i] = uprv_tolower(keywordStart[i]); + } + /* trim trailing spaces */ + while(keywordStart[i-1] == ' ') { + i--; + } + localeKeywordNameBuffer[i] = 0; + + nextSeparator = uprv_strchr(nextEqualsign, ';'); + rc = uprv_strcmp(keywordNameBuffer, localeKeywordNameBuffer); + if(rc == 0) { + nextEqualsign++; + while(*nextEqualsign == ' ') { + nextEqualsign++; + } + /* we actually found the keyword. Change the value */ + if (nextSeparator) { + keywordAtEnd = 0; + foundValueLen = nextSeparator - nextEqualsign; + } else { + keywordAtEnd = 1; + foundValueLen = uprv_strlen(nextEqualsign); + } + if(keywordValue) { /* adding a value - not removing */ + if(foundValueLen == keywordValueLen) { + uprv_strncpy(nextEqualsign, keywordValue, keywordValueLen); + return bufLen; /* no change in size */ + } else if(foundValueLen > keywordValueLen) { + int32_t delta = foundValueLen - keywordValueLen; + if(nextSeparator) { /* RH side */ + uprv_memmove(nextSeparator - delta, nextSeparator, bufLen-(nextSeparator-buffer)); + } + uprv_strncpy(nextEqualsign, keywordValue, keywordValueLen); + bufLen -= delta; + buffer[bufLen]=0; + return bufLen; + } else { /* FVL < KVL */ + int32_t delta = keywordValueLen - foundValueLen; + if((bufLen+delta) >= bufferCapacity) { + *status = U_BUFFER_OVERFLOW_ERROR; + return bufLen+delta; + } + if(nextSeparator) { /* RH side */ + uprv_memmove(nextSeparator+delta,nextSeparator, bufLen-(nextSeparator-buffer)); + } + uprv_strncpy(nextEqualsign, keywordValue, keywordValueLen); + bufLen += delta; + buffer[bufLen]=0; + return bufLen; + } + } else { /* removing a keyword */ + if(keywordAtEnd) { + /* zero out the ';' or '@' just before startSearchhere */ + keywordStart[-1] = 0; + return (keywordStart-buffer)-1; /* (string length without keyword) minus separator */ + } else { + uprv_memmove(keywordStart, nextSeparator+1, bufLen-((nextSeparator+1)-buffer)); + keywordStart[bufLen-((nextSeparator+1)-buffer)]=0; + return bufLen-((nextSeparator+1)-keywordStart); + } + } + } else if(rc<0){ /* end match keyword */ + /* could insert at this location. */ + insertHere = keywordStart; + } + keywordStart = nextSeparator; + } /* end loop searching */ + + if(!keywordValue) { + return bufLen; /* removal of non-extant keyword - no change */ + } + + /* we know there is at least one keyword. */ + needLen = bufLen+1+keywordNameLen+1+keywordValueLen; + if(needLen >= bufferCapacity) { + *status = U_BUFFER_OVERFLOW_ERROR; + return needLen; /* no change */ + } + + if(insertHere) { + uprv_memmove(insertHere+(1+keywordNameLen+1+keywordValueLen), insertHere, bufLen-(insertHere-buffer)); + keywordStart = insertHere; + } else { + keywordStart = buffer+bufLen; + *keywordStart = ';'; + keywordStart++; + } + uprv_strncpy(keywordStart, keywordNameBuffer, keywordNameLen); + keywordStart += keywordNameLen; + *keywordStart = '='; + keywordStart++; + uprv_strncpy(keywordStart, keywordValue, keywordValueLen); /* terminates. */ + keywordStart+=keywordValueLen; + if(insertHere) { + *keywordStart = ';'; + keywordStart++; + } + buffer[needLen]=0; + return needLen; +} -/*Lazy evaluated the list of installed locales*/ -static void _load_installedLocales(void); +/* ### ID parsing implementation **************************************************/ /*returns TRUE if a is an ID separator FALSE otherwise*/ #define _isIDSeparator(a) (a == '_' || a == '-') #define _isPrefixLetter(a) ((a=='x')||(a=='X')||(a=='i')||(a=='I')) + /*returns TRUE if one of the special prefixes is here (s=string) 'x-' or 'i-' */ #define _isIDPrefix(s) (_isPrefixLetter(s[0])&&_isIDSeparator(s[1])) @@ -401,26 +1064,41 @@ static void _load_installedLocales(void); */ #define _isTerminator(a) ((a==0)||(a=='.')||(a=='@')) +static char* _strnchr(const char* str, int32_t len, char c) { + U_ASSERT(str != 0 && len >= 0); + while (len-- != 0) { + char d = *str; + if (d == c) { + return (char*) str; + } else if (d == 0) { + break; + } + ++str; + } + return NULL; +} + +/** + * Lookup 'key' in the array 'list'. The array 'list' should contain + * a NULL entry, followed by more entries, and a second NULL entry. + * + * The 'list' param should be LANGUAGES, LANGUAGES_3, COUNTRIES, or + * COUNTRIES_3. + */ static int16_t _findIndex(const char* const* list, const char* key) { const char* const* anchor = list; - - while (*list) - { - if (uprv_strcmp(key, *list) == 0) - { - return (int16_t)(list - anchor); - } - list++; - } - list++; /* skip first NULL *CWB*/ - while (*list) /* scan obsolete table */ - { - if (uprv_strcmp(key, *list) == 0) - { - return (int16_t)(list - anchor); + int32_t pass = 0; + + /* Make two passes through two NULL-terminated arrays at 'list' */ + while (pass++ < 2) { + while (*list) { + if (uprv_strcmp(key, *list) == 0) { + return (int16_t)(list - anchor); + } + list++; } - list++; + ++list; /* skip final NULL *CWB*/ } return -1; } @@ -445,57 +1123,6 @@ _copyCount(char *dest, int32_t destCapacity, const char *src) { } } -/******************************************************************************* - API function definitions -*******************************************************************************/ - -U_CAPI const char* U_EXPORT2 -uloc_getDefault() -{ - return locale_get_default(); -} - -U_CAPI void U_EXPORT2 -uloc_setDefault(const char* newDefaultLocale, - UErrorCode* err) -{ - if (U_FAILURE(*err)) - return; - /* the error code isn't currently used for anything by this function*/ - - /* propagate change to C++ */ - locale_set_default(newDefaultLocale); -} - - -U_CAPI int32_t U_EXPORT2 -uloc_getParent(const char* localeID, - char* parent, - int32_t parentCapacity, - UErrorCode* err) -{ - const char *lastUnderscore; - int32_t i; - - if (U_FAILURE(*err)) - return 0; - - if (localeID == NULL) - localeID = uloc_getDefault(); - - lastUnderscore=uprv_strrchr(localeID, '_'); - if(lastUnderscore!=NULL) { - i=(int32_t)(lastUnderscore-localeID); - } else { - i=0; - } - - if(i>0) { - uprv_memcpy(parent, localeID, uprv_min(i, parentCapacity)); - } - return u_terminateChars(parent, parentCapacity, i, err); -} - /* * the internal functions _getLanguage(), _getCountry(), _getVariant() * avoid duplicating code to handle the earlier locale ID pieces @@ -538,9 +1165,9 @@ _getLanguage(const char *localeID, if(i==3) { /* convert 3 character code to 2 character code if possible *CWB*/ - offset=_findIndex(_languages3, lang); + offset=_findIndex(LANGUAGES_3, lang); if(offset>=0) { - i=_copyCount(language, languageCapacity, _languages[offset]); + i=_copyCount(language, languageCapacity, LANGUAGES[offset]); } } @@ -550,33 +1177,51 @@ _getLanguage(const char *localeID, return i; } -U_CAPI int32_t U_EXPORT2 -uloc_getLanguage(const char* localeID, - char* language, - int32_t languageCapacity, - UErrorCode* err) +static int32_t +_getScript(const char *localeID, + char *script, int32_t scriptCapacity, + const char **pEnd) { - /* uloc_getLanguage will return a 2 character iso-639 code if one exists. *CWB*/ - int32_t i=0; + int32_t idLen = 0; - if (err==NULL || U_FAILURE(*err)) { - return 0; + if (pEnd != NULL) { + *pEnd = localeID; } - - if(localeID==NULL) { - localeID=uloc_getDefault(); + + /* copy the second item as far as possible and count its length */ + while(!_isTerminator(localeID[idLen]) && !_isIDSeparator(localeID[idLen])) { + idLen++; } - i=_getLanguage(localeID, language, languageCapacity, NULL); - return u_terminateChars(language, languageCapacity, i, err); + /* If it's exactly 4 characters long, then it's a script and not a country. */ + if (idLen == 4) { + int32_t i; + if (pEnd != NULL) { + *pEnd = localeID+idLen; + } + if(idLen > scriptCapacity) { + idLen = scriptCapacity; + } + if (idLen >= 1) { + script[0]=(char)uprv_toupper(*(localeID++)); + } + for (i = 1; i < idLen; i++) { + script[i]=(char)uprv_tolower(*(localeID++)); + } + } + else { + idLen = 0; + } + return idLen; } static int32_t _getCountry(const char *localeID, char *country, int32_t countryCapacity, - const char **pEnd) { + const char **pEnd) +{ int32_t i=0; - char cnty[4]={ 0, 0, 0, 0 }; + char cnty[ULOC_COUNTRY_CAPACITY]={ 0, 0, 0, 0 }; int32_t offset; /* copy the country as far as possible and count its length */ @@ -584,7 +1229,7 @@ _getCountry(const char *localeID, if(i=0) { - i=_copyCount(country, countryCapacity, _countries[offset]); + i=_copyCount(country, countryCapacity, COUNTRIES[offset]); } } @@ -605,40 +1250,28 @@ _getCountry(const char *localeID, return i; } -U_CAPI int32_t U_EXPORT2 -uloc_getCountry(const char* localeID, - char* country, - int32_t countryCapacity, - UErrorCode* err) -{ - int32_t i=0; - - if(err==NULL || U_FAILURE(*err)) { - return 0; - } - - if(localeID==NULL) { - localeID=uloc_getDefault(); - } - - /* skip the language */ - _getLanguage(localeID, NULL, 0, &localeID); - if(_isIDSeparator(*localeID)) { - i=_getCountry(localeID+1, country, countryCapacity, NULL); - } - return u_terminateChars(country, countryCapacity, i, err); -} - -static int32_t -_getVariant(const char *localeID, - char prev, - char *variant, int32_t variantCapacity) { +/** + * @param needSeparator if true, then add leading '_' if any variants + * are added to 'variant' + */ +static int32_t +_getVariantEx(const char *localeID, + char prev, + char *variant, int32_t variantCapacity, + UBool needSeparator) { int32_t i=0; /* get one or more variant tags and separate them with '_' */ if(_isIDSeparator(prev)) { /* get a variant string after a '-' or '_' */ while(!_isTerminator(*localeID)) { + if (needSeparator) { + if (i "FOO_BAR". + * @param variants the source string of one or more variants, + * separated by '_'. This will be MODIFIED IN PLACE. Not zero + * terminated; if it is, trailing zero will NOT be maintained. + * @param variantsLen length of variants + * @param toDelete variant to delete, without separators, e.g. "EURO" + * or "PREEURO"; not zero terminated + * @param toDeleteLen length of toDelete + * @return number of characters deleted from variants + */ +static int32_t +_deleteVariant(char* variants, int32_t variantsLen, + const char* toDelete, int32_t toDeleteLen) { + int32_t delta = 0; /* number of chars deleted */ + for (;;) { + UBool flag = FALSE; + if (variantsLen < toDeleteLen) { + return delta; + } + if (uprv_strncmp(variants, toDelete, toDeleteLen) == 0 && + (variantsLen == toDeleteLen || + (flag=(variants[toDeleteLen] == '_')))) { + int32_t d = toDeleteLen + (flag?1:0); + variantsLen -= d; + delta += d; + uprv_memmove(variants, variants+d, variantsLen); + } else { + char* p = _strnchr(variants, variantsLen, '_'); + if (p == NULL) { + return delta; + } + ++p; + variantsLen -= p - variants; + variants = p; + } + } +} + +/* Keyword enumeration */ + +typedef struct UKeywordsContext { + char* keywords; + char* current; +} UKeywordsContext; + +static void U_CALLCONV +uloc_kw_closeKeywords(UEnumeration *enumerator) { + uprv_free(((UKeywordsContext *)enumerator->context)->keywords); + uprv_free(enumerator->context); + uprv_free(enumerator); +} + +static int32_t U_CALLCONV +uloc_kw_countKeywords(UEnumeration *en, UErrorCode *status) { + char *kw = ((UKeywordsContext *)en->context)->keywords; + int32_t result = 0; + while(*kw) { + result++; + kw += uprv_strlen(kw)+1; + } + return result; +} + +static const char* U_CALLCONV +uloc_kw_nextKeyword(UEnumeration* en, + int32_t* resultLength, + UErrorCode* status) { + const char* result = ((UKeywordsContext *)en->context)->current; + int32_t len = 0; + if(*result) { + len = uprv_strlen(((UKeywordsContext *)en->context)->current); + ((UKeywordsContext *)en->context)->current += len+1; + } else { + result = NULL; + } + if (resultLength) { + *resultLength = len; + } + return result; +} + +static void U_CALLCONV +uloc_kw_resetKeywords(UEnumeration* en, + UErrorCode* status) { + ((UKeywordsContext *)en->context)->current = ((UKeywordsContext *)en->context)->keywords; +} + +static const UEnumeration gKeywordsEnum = { + NULL, + NULL, + uloc_kw_closeKeywords, + uloc_kw_countKeywords, + uenum_unextDefault, + uloc_kw_nextKeyword, + uloc_kw_resetKeywords +}; + +U_CAPI UEnumeration* U_EXPORT2 +uloc_openKeywordList(const char *keywordList, int32_t keywordListSize, UErrorCode* status) { - int32_t i=0; - UBool haveVariant=FALSE; + UKeywordsContext *myContext = NULL; + UEnumeration *result = NULL; - if(err==NULL || U_FAILURE(*err)) { + if(U_FAILURE(*status)) { + return NULL; + } + result = (UEnumeration *)uprv_malloc(sizeof(UEnumeration)); + uprv_memcpy(result, &gKeywordsEnum, sizeof(UEnumeration)); + myContext = uprv_malloc(sizeof(UKeywordsContext)); + if (myContext == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + uprv_free(result); + return NULL; + } + myContext->keywords = (char *)uprv_malloc(keywordListSize+1); + uprv_memcpy(myContext->keywords, keywordList, keywordListSize); + myContext->keywords[keywordListSize] = 0; + myContext->current = myContext->keywords; + result->context = myContext; + return result; +} + +U_CAPI UEnumeration* U_EXPORT2 +uloc_openKeywords(const char* localeID, + UErrorCode* status) +{ + int32_t i=0; + char keywords[256]; + int32_t keywordsCapacity = 256; + if(status==NULL || U_FAILURE(*status)) { return 0; } @@ -691,139 +1460,514 @@ uloc_getVariant(const char* localeID, localeID=uloc_getDefault(); } - /* skip the language and the country */ + /* Skip the language */ _getLanguage(localeID, NULL, 0, &localeID); if(_isIDSeparator(*localeID)) { - _getCountry(localeID+1, NULL, 0, &localeID); - if(_isIDSeparator(*localeID)) { - haveVariant=TRUE; - i=_getVariant(localeID+1, *localeID, variant, variantCapacity); + const char *scriptID; + /* Skip the script if available */ + _getScript(localeID+1, NULL, 0, &scriptID); + if(scriptID != localeID+1) { + /* Found optional script */ + localeID = scriptID; + } + /* Skip the Country */ + if (_isIDSeparator(*localeID)) { + _getCountry(localeID+1, NULL, 0, &localeID); + if(_isIDSeparator(*localeID)) { + _getVariant(localeID+1, *localeID, NULL, 0); + } } } - /* if we do not have a variant tag yet then try a POSIX variant after '@' */ - if(!haveVariant && (localeID=uprv_strrchr(localeID, '@'))!=NULL) { - i=_getVariant(localeID+1, '@', variant, variantCapacity); + /* keywords are located after '@' */ + if((localeID = locale_getKeywordsStart(localeID)) != NULL) { + i=locale_getKeywords(localeID+1, '@', keywords, keywordsCapacity, NULL, 0, NULL, FALSE, status); + } + + if(i) { + return uloc_openKeywordList(keywords, i, status); + } else { + return NULL; } - return u_terminateChars(variant, variantCapacity, i, err); } -U_CAPI int32_t U_EXPORT2 -uloc_getName(const char* localeID, - char* name, - int32_t nameCapacity, - UErrorCode* err) -{ - int32_t i, fieldCount; - if(err==NULL || U_FAILURE(*err)) { +/* bit-flags for 'options' parameter of _canonicalize */ +#define _ULOC_STRIP_KEYWORDS 0x2 +#define _ULOC_CANONICALIZE 0x1 + +#define OPTION_SET(options, mask) ((options & mask) != 0) + +/** + * Canonicalize the given localeID, to level 1 or to level 2, + * depending on the options. To specify level 1, pass in options=0. + * To specify level 2, pass in options=_ULOC_CANONICALIZE. + * + * This is the code underlying uloc_getName and uloc_canonicalize. + */ +static int32_t +_canonicalize(const char* localeID, + char* result, + int32_t resultCapacity, + uint32_t options, + UErrorCode* err) { + int32_t j, len, fieldCount=0, scriptSize=0, variantSize=0, nameCapacity; + char localeBuffer[ULOC_FULLNAME_CAPACITY]; + const char* keywordAssign = NULL; + const char* separatorIndicator = NULL; + const char* addKeyword = NULL; + const char* addValue = NULL; + char* name; + char* variant = NULL; /* pointer into name, or NULL */ + int32_t sawEuro = 0; + + if (U_FAILURE(*err)) { return 0; } - if(localeID==NULL) { + if (localeID==NULL) { localeID=uloc_getDefault(); } + /* if we are doing a full canonicalization, then put results in + localeBuffer, if necessary; otherwise send them to result. */ + if (OPTION_SET(options, _ULOC_CANONICALIZE) && + (result == NULL || resultCapacity < sizeof(localeBuffer))) { + name = localeBuffer; + nameCapacity = sizeof(localeBuffer); + } else { + name = result; + nameCapacity = resultCapacity; + } + /* get all pieces, one after another, and separate with '_' */ - fieldCount=0; - i=_getLanguage(localeID, name, nameCapacity, &localeID); + len=_getLanguage(localeID, name, nameCapacity, &localeID); if(_isIDSeparator(*localeID)) { + const char *scriptID; + ++fieldCount; - if(i 0) { + /* Found optional script */ + localeID = scriptID; ++fieldCount; - if(i 0) { + variant = name+len; + len += variantSize; + localeID += variantSize + 1; /* skip '_' and variant */ + } } - ++i; - i+=_getVariant(localeID+1, *localeID, name+i, nameCapacity-i); } } - /* if we do not have a variant tag yet then try a POSIX variant after '@' */ - if(fieldCount<2 && (localeID=uprv_strrchr(localeID, '@'))!=NULL) { + /* Copy POSIX-style charset specifier, if any [mr.utf8] */ + if (!OPTION_SET(options, _ULOC_CANONICALIZE) && *localeID == '.') { + UBool done = FALSE; do { - if(i 0)) { + do { + if(len 0)); + if (posixVariantSize > 0) { + if (variant == NULL) { + variant = name+len; + } + len += posixVariantSize; + variantSize += posixVariantSize; } - ++i; + } + + /* Check for EURO variants. */ + sawEuro = _deleteVariant(variant, variantSize, "EURO", 4); + len -= sawEuro; + if (sawEuro > 0 && name[len-1] == '_') { /* delete trailing '_' */ + --len; + } + + /* Look up the ID in the canonicalization map */ + for (j=0; j<(int32_t)(sizeof(CANONICALIZE_MAP)/sizeof(CANONICALIZE_MAP[0])); j++) { + const char* id = CANONICALIZE_MAP[j].id; + int32_t n = uprv_strlen(id); + if (len == n && uprv_strncmp(name, id, n) == 0) { + if (n == 0 && localeID != NULL) { + break; /* Don't remap "" if keywords present */ + } + len = _copyCount(name, nameCapacity, CANONICALIZE_MAP[j].canonicalID); + addKeyword = CANONICALIZE_MAP[j].keyword; + addValue = CANONICALIZE_MAP[j].value; + break; + } + } + + /* Explicit EURO variant overrides keyword in CANONICALIZE_MAP */ + if (sawEuro > 0) { + addKeyword = "currency"; + addValue = "EUR"; + } + } + + if (!OPTION_SET(options, _ULOC_STRIP_KEYWORDS)) { + if (localeID!=NULL && keywordAssign!=NULL && + (!separatorIndicator || separatorIndicator > keywordAssign)) { + if(lenfallback->default->failure) */ + *pErrorCode=errorCode; + } + /* try to open the requested item in the table */ errorCode=U_ZERO_ERROR; - item=ures_getStringByKey(&table, itemKey, pLength, &errorCode); + if(subTableKey == NULL){ + item=ures_getStringByKey(&table, itemKey, pLength, &errorCode); + }else{ + UResourceBundle subTable; + ures_initStackObject(&subTable); + ures_getByKey(&table, subTableKey, &subTable, &errorCode); + item = ures_getStringByKey(&subTable, itemKey, pLength, &errorCode); + ures_close(&subTable); + } if(U_SUCCESS(errorCode)) { - /* we got the requested item! */ - ures_close(&table); - ures_close(rb); + /* if the item for the key is empty ... override the explicit fall back set */ + if(item[0]==0 && efnLen > 0){ + overrideExplicitFallback = TRUE; + }else{ + /* we got the requested item! */ + ures_close(&table); + ures_close(rb); + + if(errorCode==U_USING_DEFAULT_WARNING || + (errorCode==U_USING_FALLBACK_WARNING && *pErrorCode!=U_USING_DEFAULT_WARNING) + ) { + /* set the "strongest" error code (success->fallback->default->failure) */ + *pErrorCode=errorCode; + } - if(errorCode==U_USING_DEFAULT_WARNING || - (errorCode==U_USING_FALLBACK_WARNING && *pErrorCode!=U_USING_DEFAULT_WARNING) - ) { - /* set the "strongest" error code (success->fallback->default->failure) */ - *pErrorCode=errorCode; + /* + * It is safe to close the bundle and still return the + * string pointer because resource bundles are + * cached until u_cleanup(). + */ + return item; } - - /* - * It is safe to close the bundle and still return the - * string pointer because resource bundles are - * cached until u_cleanup(). - */ - return item; } /* @@ -926,7 +2101,7 @@ _res_getTableStringWithFallback(const char *path, const char *locale, return NULL; } - if(*locale==0 || 0==uprv_strcmp(locale, "root")) { + if(*locale==0 || 0==uprv_strcmp(locale, _kRootName) || 0==uprv_strcmp(locale,explicitFallbackName)) { /* end of fallback; even root does not have the requested item either */ ures_close(&table); ures_close(rb); @@ -936,28 +2111,41 @@ _res_getTableStringWithFallback(const char *path, const char *locale, /* could not find the table, or its item, try to fall back to a different RB and table */ errorCode=U_ZERO_ERROR; - uloc_getParent(locale, localeBuffer, sizeof(localeBuffer), &errorCode); + if(efnLen > 0 && overrideExplicitFallback == FALSE){ + /* continue the fallback lookup with the explicit fallback that is requested */ + locale = explicitFallbackName; + }else{ + uloc_getParent(locale, localeBuffer, sizeof(localeBuffer), &errorCode); + if(U_FAILURE(errorCode) || errorCode==U_STRING_NOT_TERMINATED_WARNING) { + /* error getting the parent locale ID - should never happen */ + *pErrorCode=U_INTERNAL_PROGRAM_ERROR; + return NULL; + } + + /* continue the fallback lookup with the parent locale ID */ + locale=localeBuffer; + + /* adjust error code as we fall back */ + if (uprv_strlen(locale) == 0) /* Falling back to root locale? */ + *pErrorCode = U_USING_DEFAULT_WARNING; + else if (*pErrorCode != U_USING_DEFAULT_WARNING) + *pErrorCode = U_USING_FALLBACK_WARNING; + } /* done with the locale string - ready to close table and rb */ ures_close(&table); ures_close(rb); - if(U_FAILURE(errorCode) || errorCode==U_STRING_NOT_TERMINATED_WARNING) { - /* error getting the parent locale ID - should never happen */ - *pErrorCode=U_INTERNAL_PROGRAM_ERROR; - return NULL; - } - - /* continue the fallback lookup with the parent locale ID */ - locale=localeBuffer; } } static int32_t _getStringOrCopyKey(const char *path, const char *locale, - const char *tableKey, const char *itemKey, + const char *tableKey, + const char* subTableKey, + const char *itemKey, const char *substitute, UChar *dest, int32_t destCapacity, UErrorCode *pErrorCode) { - const UChar *s; + const UChar *s = NULL; int32_t length; if(itemKey==NULL) { @@ -973,107 +2161,37 @@ _getStringOrCopyKey(const char *path, const char *locale, } else { /* second-level item, use special fallback */ s=_res_getTableStringWithFallback(path, locale, - tableKey, itemKey, + tableKey, + subTableKey, + itemKey, &length, pErrorCode); } if(U_SUCCESS(*pErrorCode)) { int32_t copyLength=uprv_min(length, destCapacity); - if(copyLength>0) { + if(copyLength>0 && s != NULL) { u_memcpy(dest, s, copyLength); } } else { /* no string from a resource bundle: convert the substitute */ length=(int32_t)uprv_strlen(substitute); u_charsToUChars(substitute, dest, uprv_min(length, destCapacity)); - *pErrorCode=U_USING_DEFAULT_WARNING; - } - - return u_terminateUChars(dest, destCapacity, length, pErrorCode); -} - -U_CAPI int32_t U_EXPORT2 -uloc_getDisplayLanguage(const char *locale, - const char *displayLocale, - UChar *dest, int32_t destCapacity, - UErrorCode *pErrorCode) { - char localeBuffer[200]; - int32_t length; - - /* argument checking */ - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return 0; - } - - if(destCapacity<0 || (destCapacity>0 && dest==NULL)) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - *pErrorCode=U_ZERO_ERROR; /* necessary because we will check for a warning code */ - length=uloc_getLanguage(locale, localeBuffer, sizeof(localeBuffer), pErrorCode); - if(U_FAILURE(*pErrorCode) || *pErrorCode==U_STRING_NOT_TERMINATED_WARNING) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - if(length==0) { - return u_terminateUChars(dest, destCapacity, 0, pErrorCode); - } - - return _getStringOrCopyKey(NULL, displayLocale, - _kLanguages, localeBuffer, - localeBuffer, - dest, destCapacity, - pErrorCode); -} - -U_CAPI int32_t U_EXPORT2 -uloc_getDisplayCountry(const char *locale, - const char *displayLocale, - UChar *dest, int32_t destCapacity, - UErrorCode *pErrorCode) { - char localeBuffer[200]; - int32_t length; - - /* argument checking */ - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return 0; - } - - if(destCapacity<0 || (destCapacity>0 && dest==NULL)) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - *pErrorCode=U_ZERO_ERROR; /* necessary because we will check for a warning code */ - length=uloc_getCountry(locale, localeBuffer, sizeof(localeBuffer), pErrorCode); - if(U_FAILURE(*pErrorCode) || *pErrorCode==U_STRING_NOT_TERMINATED_WARNING) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - if(length==0) { - return u_terminateUChars(dest, destCapacity, 0, pErrorCode); - } - - return _getStringOrCopyKey(NULL, displayLocale, - _kCountries, localeBuffer, - localeBuffer, - dest, destCapacity, - pErrorCode); -} - -/* - * TODO separate variant1_variant2_variant3... - * by getting each tag's display string and concatenating them with ", " - * in between - similar to uloc_getDisplayName() - */ -U_CAPI int32_t U_EXPORT2 -uloc_getDisplayVariant(const char *locale, - const char *displayLocale, - UChar *dest, int32_t destCapacity, - UErrorCode *pErrorCode) { - char localeBuffer[200]; + *pErrorCode=U_USING_DEFAULT_WARNING; + } + + return u_terminateUChars(dest, destCapacity, length, pErrorCode); +} + +static int32_t +_getDisplayNameForComponent(const char *locale, + const char *displayLocale, + UChar *dest, int32_t destCapacity, + int32_t (*getter)(const char *, char *, int32_t, UErrorCode *), + const char *tag, + UErrorCode *pErrorCode) { + char localeBuffer[ULOC_FULLNAME_CAPACITY*4]; int32_t length; + UErrorCode localStatus; /* argument checking */ if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { @@ -1085,15 +2203,9 @@ uloc_getDisplayVariant(const char *locale, return 0; } - /* - * display names for variants are top-level items of - * locale resource bundles - * the rb keys are "%%" followed by the variant tags - */ - *pErrorCode=U_ZERO_ERROR; /* necessary because we will check for a warning code */ - localeBuffer[0]=localeBuffer[1]='%'; - length=uloc_getVariant(locale, localeBuffer+2, sizeof(localeBuffer)-2, pErrorCode); - if(U_FAILURE(*pErrorCode) || *pErrorCode==U_STRING_NOT_TERMINATED_WARNING) { + localStatus = U_ZERO_ERROR; + length=(*getter)(locale, localeBuffer, sizeof(localeBuffer), &localStatus); + if(U_FAILURE(localStatus) || localStatus==U_STRING_NOT_TERMINATED_WARNING) { *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; return 0; } @@ -1101,21 +2213,69 @@ uloc_getDisplayVariant(const char *locale, return u_terminateUChars(dest, destCapacity, 0, pErrorCode); } - /* pass itemKey=NULL to look for a top-level item */ return _getStringOrCopyKey(NULL, displayLocale, - localeBuffer, NULL, - localeBuffer+2, /* substitute=variant without %% */ + tag, NULL, localeBuffer, + localeBuffer, dest, destCapacity, pErrorCode); } +U_CAPI int32_t U_EXPORT2 +uloc_getDisplayLanguage(const char *locale, + const char *displayLocale, + UChar *dest, int32_t destCapacity, + UErrorCode *pErrorCode) { + return _getDisplayNameForComponent(locale, displayLocale, dest, destCapacity, + uloc_getLanguage, _kLanguages, pErrorCode); +} + +U_CAPI int32_t U_EXPORT2 +uloc_getDisplayScript(const char* locale, + const char* displayLocale, + UChar *dest, int32_t destCapacity, + UErrorCode *pErrorCode) +{ + return _getDisplayNameForComponent(locale, displayLocale, dest, destCapacity, + uloc_getScript, _kScripts, pErrorCode); +} + +U_CAPI int32_t U_EXPORT2 +uloc_getDisplayCountry(const char *locale, + const char *displayLocale, + UChar *dest, int32_t destCapacity, + UErrorCode *pErrorCode) { + return _getDisplayNameForComponent(locale, displayLocale, dest, destCapacity, + uloc_getCountry, _kCountries, pErrorCode); +} + +/* + * TODO separate variant1_variant2_variant3... + * by getting each tag's display string and concatenating them with ", " + * in between - similar to uloc_getDisplayName() + */ +U_CAPI int32_t U_EXPORT2 +uloc_getDisplayVariant(const char *locale, + const char *displayLocale, + UChar *dest, int32_t destCapacity, + UErrorCode *pErrorCode) { + return _getDisplayNameForComponent(locale, displayLocale, dest, destCapacity, + uloc_getVariant, _kVariants, pErrorCode); +} + U_CAPI int32_t U_EXPORT2 uloc_getDisplayName(const char *locale, const char *displayLocale, UChar *dest, int32_t destCapacity, - UErrorCode *pErrorCode) { - int32_t length, length2; - UBool hasLanguage, hasCountry, hasVariant; + UErrorCode *pErrorCode) +{ + int32_t length, length2, length3 = 0; + UBool hasLanguage, hasScript, hasCountry, hasVariant, hasKeywords; + UEnumeration* keywordEnum = NULL; + int32_t keywordCount = 0; + const char *keyword = NULL; + int32_t keywordLen = 0; + char keywordValue[256]; + int32_t keywordValueLen = 0; /* argument checking */ if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { @@ -1155,6 +2315,36 @@ uloc_getDisplayName(const char *locale, *pErrorCode=U_ZERO_ERROR; } + /* append the script */ + if(length0; + length+=length2; + + if(hasScript) { + /* append ", " */ + if(length0; length+=length2; - if(hasCountry && !hasVariant) { - /* remove ", " */ - length-=2; + if(hasVariant) { + /* append ", " */ + if(length 0 ; keywordCount--){ + if(U_FAILURE(*pErrorCode)){ + break; + } + /* the uenum_next returns NUL terminated string */ + keyword = uenum_next(keywordEnum, &keywordLen, pErrorCode); + if(length + length3 < destCapacity) { + length3 += uloc_getDisplayKeyword(keyword, displayLocale, dest+length+length3, destCapacity-length-length3, pErrorCode); + } else { + length3 += uloc_getDisplayKeyword(keyword, displayLocale, NULL, 0, pErrorCode); + } + if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR) { + /* keep preflighting */ + *pErrorCode=U_ZERO_ERROR; + } + keywordValueLen = uloc_getKeywordValue(locale, keyword, keywordValue, 256, pErrorCode); + if(keywordValueLen) { + if(length + length3 < destCapacity) { + dest[length + length3] = 0x3D; } - ++length; - } else { - /* remove " (" */ - length-=2; + length3++; + if(length + length3 < destCapacity) { + length3 += uloc_getDisplayKeywordValue(locale, keyword, displayLocale, dest+length+length3, destCapacity-length-length3, pErrorCode); + } else { + length3 += uloc_getDisplayKeywordValue(locale, keyword, displayLocale, NULL, 0, pErrorCode); + } + if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR) { + /* keep preflighting */ + *pErrorCode=U_ZERO_ERROR; + } + } + if(keywordCount > 1) { + if(length + length3 + 1 < destCapacity && keywordCount) { + dest[length + length3]=0x2c; + dest[length + length3+1]=0x20; + } + length3++; /* ',' */ + length3++; /* ' ' */ + } + } + uenum_close(keywordEnum); + + hasKeywords = length3 > 0; + length += length3; + + + + if ((hasScript && !hasCountry) + || ((hasScript || hasCountry) && !hasVariant && !hasKeywords) + || ((hasScript || hasCountry || hasVariant) && !hasKeywords) + || (hasLanguage && !hasScript && !hasCountry && !hasVariant && !hasKeywords)) + { + /* remove ", " or " (" */ + length-=2; + } + + if (hasLanguage && (hasScript || hasCountry || hasVariant || hasKeywords)) { + /* append ")" */ + if(length _installedLocalesCount) - return NULL; - else - return _installedLocales[offset]; +U_CAPI int32_t U_EXPORT2 +uloc_getDisplayKeyword(const char* keyword, + const char* displayLocale, + UChar* dest, + int32_t destCapacity, + UErrorCode* status){ + + /* argument checking */ + if(status==NULL || U_FAILURE(*status)) { + return 0; + } + + if(destCapacity<0 || (destCapacity>0 && dest==NULL)) { + *status=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + + /* pass itemKey=NULL to look for a top-level item */ + return _getStringOrCopyKey(NULL, displayLocale, + _kKeys, NULL, + keyword, + keyword, + dest, destCapacity, + status); } -U_CAPI int32_t U_EXPORT2 -uloc_countAvailable() -{ - _load_installedLocales(); - return _installedLocalesCount; + +#define UCURRENCY_DISPLAY_NAME_INDEX 1 + +U_CAPI int32_t U_EXPORT2 +uloc_getDisplayKeywordValue( const char* locale, + const char* keyword, + const char* displayLocale, + UChar* dest, + int32_t destCapacity, + UErrorCode* status){ + + + char keywordValue[ULOC_FULLNAME_CAPACITY*4]; + int32_t capacity = ULOC_FULLNAME_CAPACITY*4; + int32_t keywordValueLen =0; + + /* argument checking */ + if(status==NULL || U_FAILURE(*status)) { + return 0; + } + + if(destCapacity<0 || (destCapacity>0 && dest==NULL)) { + *status=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* get the keyword value */ + keywordValue[0]=0; + keywordValueLen = uloc_getKeywordValue(locale, keyword, keywordValue, capacity, status); + + /* + * if the keyword is equal to currency .. then to get the display name + * we need to do the fallback ourselves + */ + if(uprv_stricmp(keyword, _kCurrency)==0){ + + int32_t dispNameLen = 0; + const UChar *dispName = NULL; + + UResourceBundle *bundle = ures_open(NULL, displayLocale, status); + UResourceBundle *currencies = ures_getByKey(bundle, _kCurrencies, NULL, status); + UResourceBundle *currency = ures_getByKeyWithFallback(currencies, keywordValue, NULL, status); + + dispName = ures_getStringByIndex(currency, UCURRENCY_DISPLAY_NAME_INDEX, &dispNameLen, status); + + /*close the bundles */ + ures_close(currency); + ures_close(currencies); + ures_close(bundle); + + if(U_FAILURE(*status)){ + if(*status == U_MISSING_RESOURCE_ERROR){ + /* we just want to write the value over if nothing is available */ + *status = U_USING_DEFAULT_WARNING; + }else{ + return 0; + } + } + + /* now copy the dispName over if not NULL */ + if(dispName != NULL){ + if(dispNameLen <= destCapacity){ + uprv_memcpy(dest, dispName, dispNameLen * U_SIZEOF_UCHAR); + return u_terminateUChars(dest, destCapacity, dispNameLen, status); + }else{ + *status = U_BUFFER_OVERFLOW_ERROR; + return dispNameLen; + } + }else{ + /* we have not found the display name for the value .. just copy over */ + if(keywordValueLen <= destCapacity){ + u_charsToUChars(keywordValue, dest, keywordValueLen); + return u_terminateUChars(dest, destCapacity, keywordValueLen, status); + }else{ + *status = U_BUFFER_OVERFLOW_ERROR; + return keywordValueLen; + } + } + + + }else{ + + return _getStringOrCopyKey(NULL, displayLocale, + _kTypes, keyword, + keywordValue, + keywordValue, + dest, destCapacity, + status); + } } -UBool uloc_cleanup(void) { +/* ### Get available **************************************************/ + +static UBool U_CALLCONV uloc_cleanup(void) { char ** temp; if (_installedLocales) { @@ -1294,6 +2645,7 @@ static void _load_installedLocales() _installedLocales = temp; _installedLocalesCount = localeCount; temp = NULL; + ucln_common_registerCleanup(UCLN_COMMON_ULOC, uloc_cleanup); } umtx_unlock(NULL); @@ -1304,7 +2656,23 @@ static void _load_installedLocales() } } +U_CAPI const char* U_EXPORT2 +uloc_getAvailable(int32_t offset) +{ + + _load_installedLocales(); + + if (offset > _installedLocalesCount) + return NULL; + return _installedLocales[offset]; +} +U_CAPI int32_t U_EXPORT2 +uloc_countAvailable() +{ + _load_installedLocales(); + return _installedLocalesCount; +} /** * Returns a list of all language codes defined in ISO 639. This is a pointer @@ -1315,7 +2683,7 @@ static void _load_installedLocales() U_CAPI const char* const* U_EXPORT2 uloc_getISOLanguages() { - return _languages; + return LANGUAGES; } /** @@ -1327,5 +2695,327 @@ uloc_getISOLanguages() U_CAPI const char* const* U_EXPORT2 uloc_getISOCountries() { - return _countries; + return COUNTRIES; +} + + +/* this function to be moved into cstring.c later */ +static char gDecimal = 0; + +static /* U_CAPI */ +double +/* U_EXPORT2 */ +_uloc_strtod(const char *start, char **end) { + char *decimal; + char *myEnd; + char buf[30]; + double rv; + if (!gDecimal) { + char rep[5]; + /* For machines that decide to change the decimal on you, + and try to be too smart with localization. + This normally should be just a '.'. */ + sprintf(rep, "%+1.1f", 1.0); + gDecimal = rep[2]; + } + + if(gDecimal == '.') { + return uprv_strtod(start, end); /* fall through to OS */ + } else { + uprv_strncpy(buf, start, 29); + buf[29]=0; + decimal = uprv_strchr(buf, '.'); + if(decimal) { + *decimal = gDecimal; + } else { + return uprv_strtod(start, end); /* no decimal point */ + } + rv = uprv_strtod(buf, &myEnd); + if(end) { + *end = (char*)(start+(myEnd-buf)); /* cast away const (to follow uprv_strtod API.) */ + } + return rv; + } +} + +typedef struct { + double q; + char *locale; +#if defined(ULOC_DEBUG_PURIFY) + int32_t dummy; /* to avoid uninitialized memory copy from qsort */ +#endif +} _acceptLangItem; + +static int32_t U_CALLCONV +uloc_acceptLanguageCompare(const void *context, const void *a, const void *b) +{ + const _acceptLangItem *aa = (const _acceptLangItem*)a; + const _acceptLangItem *bb = (const _acceptLangItem*)b; + + int32_t rc = 0; + if(bb->q < aa->q) { + rc = -1; /* A > B */ + } else if(bb->q > aa->q) { + rc = 1; /* A < B */ + } else { + rc = 0; /* A = B */ + } + + if(rc==0) { + rc = uprv_stricmp(aa->locale, bb->locale); + } + +#if defined(ULOC_DEBUG) + /* fprintf(stderr, "a:[%s:%g], b:[%s:%g] -> %d\n", + aa->locale, aa->q, + bb->locale, bb->q, + rc);*/ +#endif + + return rc; +} + +/* +mt-mt, ja;q=0.76, en-us;q=0.95, en;q=0.92, en-gb;q=0.89, fr;q=0.87, iu-ca;q=0.84, iu;q=0.82, ja-jp;q=0.79, mt;q=0.97, de-de;q=0.74, de;q=0.71, es;q=0.68, it-it;q=0.66, it;q=0.63, vi-vn;q=0.61, vi;q=0.58, nl-nl;q=0.55, nl;q=0.53 +*/ + +U_CAPI int32_t U_EXPORT2 +uloc_acceptLanguageFromHTTP(char *result, int32_t resultAvailable, UAcceptResult *outResult, + const char *httpAcceptLanguage, + UEnumeration* availableLocales, + UErrorCode *status) +{ + _acceptLangItem *j; + _acceptLangItem smallBuffer[30]; + char **strs; + char tmp[ULOC_FULLNAME_CAPACITY +1]; + int32_t n = 0; + const char *itemEnd; + const char *paramEnd; + const char *s; + const char *t; + int32_t res; + int32_t i; + int32_t l = uprv_strlen(httpAcceptLanguage); + int32_t jSize; + + j = smallBuffer; + jSize = sizeof(smallBuffer)/sizeof(smallBuffer[0]); + if(U_FAILURE(*status)) { + return -1; + } + + for(s=httpAcceptLanguage;s&&*s;) { + while(isspace(*s)) /* eat space at the beginning */ + s++; + itemEnd=uprv_strchr(s,','); + paramEnd=uprv_strchr(s,';'); + if(!itemEnd) { + itemEnd = httpAcceptLanguage+l; /* end of string */ + } + if(paramEnd && paramEnds)&&isspace(*t);t--) + ; + j[n].locale = uprv_strndup(s,(t+1)-s); + uloc_canonicalize(j[n].locale,tmp,sizeof(tmp)/sizeof(tmp[0]),status); + if(strcmp(j[n].locale,tmp)) { + uprv_free(j[n].locale); + j[n].locale=uprv_strdup(tmp); + } +#if defined(ULOC_DEBUG) + /*fprintf(stderr,"%d: s <%s> q <%g>\n", n, j[n].locale, j[n].q);*/ +#endif + n++; + s = itemEnd; + while(*s==',') { /* eat duplicate commas */ + s++; + } + if(n>=jSize) { + if(j==smallBuffer) { /* overflowed the small buffer. */ + j = uprv_malloc(sizeof(j[0])*(jSize*2)); + if(j!=NULL) { + uprv_memcpy(j,smallBuffer,sizeof(j[0])*jSize); + } +#if defined(ULOC_DEBUG) + fprintf(stderr,"malloced at size %d\n", jSize); +#endif + } else { + j = uprv_realloc(j, sizeof(j[0])*jSize*2); +#if defined(ULOC_DEBUG) + fprintf(stderr,"re-alloced at size %d\n", jSize); +#endif + } + jSize *= 2; + if(j==NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return -1; + } + } + } + uprv_sortArray(j, n, sizeof(j[0]), uloc_acceptLanguageCompare, NULL, TRUE, status); + if(U_FAILURE(*status)) { + if(j != smallBuffer) { +#if defined(ULOC_DEBUG) + fprintf(stderr,"freeing j %p\n", j); +#endif + uprv_free(j); + } + return -1; + } + strs = uprv_malloc((size_t)(sizeof(strs[0])*n)); + for(i=0;i q <%g>\n", i, j[i].locale, j[i].q);*/ +#endif + strs[i]=j[i].locale; + } + res = uloc_acceptLanguage(result, resultAvailable, outResult, + (const char**)strs, n, availableLocales, status); + for(i=0;i0) { + uprv_strncpy(result, l, uprv_min(len, resultAvailable)); + } + for(j=0;jmaxLen) { + maxLen = len; + } + } + uenum_reset(availableLocales, status); + /* save off parent info */ + if(uloc_getParent(acceptList[i], tmp, sizeof(tmp)/sizeof(tmp[0]), status)!=0) { + fallbackList[i] = uprv_strdup(tmp); + } else { + fallbackList[i]=0; + } + } + + for(maxLen--;maxLen>0;maxLen--) { + for(i=0;i0) { + uprv_strncpy(result, l, uprv_min(len, resultAvailable)); + } + for(i=0;ifReadOnly = FALSE; - if (size == 0) { - MS->fSize = 0xFFFF; - } else { - MS->fSize = size; - } - MS->fStart = NULL; - MS->fPos = 0; - MS->fReadPos = 0; - MS->fError = FALSE; - MS->fEof = FALSE; - MS->fStart = (uint8_t *)uprv_malloc(MS->fSize); - if(MS->fStart == NULL) { - MS->fError = TRUE; - uprv_free(MS); - return NULL; - } - return MS; -} - -U_CAPI UMemoryStream * U_EXPORT2 uprv_mstrm_openBuffer(const uint8_t *buffer, int32_t len){ - UMemoryStream *MS = (UMemoryStream *)uprv_malloc(sizeof(UMemoryStream)); - if(MS == NULL) { - return NULL; - } - MS->fReadOnly = TRUE; - MS->fStart = (uint8_t *)buffer; /*functions themselves take care about constness of buffer - see above line*/ - MS->fPos = len; - MS->fReadPos = 0; - MS->fError = FALSE; - MS->fEof = FALSE; - return MS; -} - -U_CAPI void U_EXPORT2 uprv_mstrm_close(UMemoryStream *MS){ - if(MS->fReadOnly == FALSE && MS->fStart != NULL) { - uprv_free(MS->fStart); - } - uprv_free(MS); -} - -U_CAPI UBool U_EXPORT2 uprv_mstrm_setError(UMemoryStream *MS){ - MS->fError = TRUE; - return MS->fError; -} - -U_CAPI UBool U_EXPORT2 uprv_mstrm_error(UMemoryStream *MS){ - return MS->fError; -} - -U_CAPI UBool U_EXPORT2 uprv_mstrm_eof(UMemoryStream *MS){ - return MS->fEof; -} - -U_CAPI int32_t U_EXPORT2 uprv_mstrm_read(UMemoryStream *MS, void* addr, int32_t len) { - if(MS->fError == FALSE) { - if(len + MS->fReadPos > MS->fPos) { - len = MS->fPos - MS->fReadPos; - MS->fError = TRUE; - MS->fEof = TRUE; - } - - uprv_memcpy(addr, MS->fStart+MS->fReadPos, len); - MS->fReadPos+=len; - - return len; - } else { - return 0; - } -} - -U_CAPI int32_t U_EXPORT2 uprv_mstrm_write(UMemoryStream *MS, const void *buffer, int32_t len){ - if(MS->fError == FALSE) { - if(MS->fReadOnly == FALSE) { - if(len + MS->fPos > MS->fSize) { - uint8_t *newstart = (uint8_t *)uprv_realloc(MS->fStart, MS->fSize+len); - if(newstart != NULL) { - MS->fSize+=len; - MS->fStart = newstart; - } else { - MS->fError = TRUE; - return -1; - } - } - uprv_memcpy(MS->fStart + MS->fPos, buffer, len); - MS->fPos += len; - return len; - } else { - MS->fError = TRUE; - return 0; - } - } else { - return 0; - } -} - -U_CAPI const uint8_t * U_EXPORT2 uprv_mstrm_getBuffer(UMemoryStream *MS, int32_t *len){ - if(MS->fError == FALSE) { - *len = MS->fPos; - return MS->fStart; - } else { - *len = 0; - return NULL; - } -} - -U_CAPI const uint8_t * U_EXPORT2 uprv_mstrm_getCurrentBuffer(UMemoryStream *MS, int32_t *len){ - if(MS->fError == FALSE) { - *len = MS->fPos-MS->fReadPos; - return MS->fStart+MS->fReadPos; - } else { - *len = 0; - return NULL; - } -} - -U_CAPI int32_t U_EXPORT2 uprv_mstrm_skip(UMemoryStream *MS, int32_t len){ - if(MS->fError == FALSE) { - MS->fReadPos+=len; - } else { - return 0; - } - if(MS->fReadPos>MS->fPos) { - MS->fError = TRUE; - return 0; - } else { - return len; - } -} - -U_CAPI int32_t U_EXPORT2 uprv_mstrm_jump(UMemoryStream *MS, const uint8_t *where){ - if(MS->fError == FALSE) { - MS->fReadPos=(where-MS->fStart); - } else { - return 0; - } - if(MS->fReadPos>MS->fPos) { - MS->fError = TRUE; - return 0; - } else { - return where-MS->fStart; - } -} - -U_CAPI void U_EXPORT2 -uprv_mstrm_write8(UMemoryStream *MS, uint8_t byte) { - if(MS!=NULL) { - uprv_mstrm_write(MS, &byte, 1); - } -} - -U_CAPI void U_EXPORT2 -uprv_mstrm_write16(UMemoryStream *MS, uint16_t word) { - if(MS!=NULL) { - uprv_mstrm_write(MS, &word, 2); - } -} - -U_CAPI void U_EXPORT2 -uprv_mstrm_write32(UMemoryStream *MS, uint32_t wyde) { - if(MS!=NULL) { - uprv_mstrm_write(MS, &wyde, 4); - } -} - -U_CAPI void U_EXPORT2 -uprv_mstrm_writeBlock(UMemoryStream *MS, const void *s, int32_t length) { - if(MS!=NULL) { - if(length>0) { - uprv_mstrm_write(MS, s, length); - } - } -} - -U_CAPI void U_EXPORT2 -uprv_mstrm_writePadding(UMemoryStream *MS, int32_t length) { - static const uint8_t padding[16]={ - 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa - }; - if(MS!=NULL) { - while(length>=16) { - uprv_mstrm_write(MS, padding, 16); - length-=16; - } - if(length>0) { - uprv_mstrm_write(MS, padding, length); - } - } -} - -U_CAPI void U_EXPORT2 -uprv_mstrm_writeString(UMemoryStream *MS, const char *s, int32_t length) { - if(MS!=NULL) { - if(length==-1) { - length=uprv_strlen(s); - } - if(length>0) { - uprv_mstrm_write(MS, s, length); - } - } -} - -U_CAPI void U_EXPORT2 -uprv_mstrm_writeUString(UMemoryStream *MS, const UChar *s, int32_t length) { - if(MS!=NULL) { - if(length==-1) { - length=u_strlen(s); - } - if(length>0) { - uprv_mstrm_write(MS, s, length*sizeof(UChar)); - } - } -} - -/* - * Hey, Emacs, please set the following: - * - * Local Variables: - * indent-tabs-mode: nil - * End: - * - */ diff --git a/icuSources/common/umemstrm.h b/icuSources/common/umemstrm.h deleted file mode 100644 index de58170b..00000000 --- a/icuSources/common/umemstrm.h +++ /dev/null @@ -1,69 +0,0 @@ -/* -****************************************************************************** -* -* Copyright (C) 1997-2001, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* -* File UMEMSTRM.H -* -* Contains UMemoryStream interface -* -* @author Vladimir Weinstein -* -* Modification History: -* -* Date Name Description -* 5/17/00 weiv Created. -* -****************************************************************************** -*/ - -#ifndef UMEMSTRM_H -#define UMEMSTRM_H - -#ifndef _UTYPES -#include "unicode/utypes.h" -#endif - -struct UMemoryStream; - -typedef struct UMemoryStream UMemoryStream; - -struct UMemoryStream{ - uint8_t *fStart; - int32_t fSize; - int32_t fPos; - int32_t fReadPos; - UBool fReadOnly; - UBool fError; - UBool fEof; -}; - -U_CAPI UMemoryStream * U_EXPORT2 uprv_mstrm_openNew(int32_t size); -U_CAPI UMemoryStream * U_EXPORT2 uprv_mstrm_openBuffer(const uint8_t *buffer, int32_t len); -U_CAPI void U_EXPORT2 uprv_mstrm_close(UMemoryStream *MS); -U_CAPI UBool U_EXPORT2 uprv_mstrm_setError(UMemoryStream *MS); -U_CAPI UBool U_EXPORT2 uprv_mstrm_error(UMemoryStream *MS); -U_CAPI UBool U_EXPORT2 uprv_mstrm_eof(UMemoryStream *MS); -U_CAPI int32_t U_EXPORT2 uprv_mstrm_read(UMemoryStream *MS, void* addr, int32_t len); -U_CAPI int32_t U_EXPORT2 uprv_mstrm_write(UMemoryStream *MS, const void *buffer, int32_t len); -U_CAPI const uint8_t * U_EXPORT2 uprv_mstrm_getBuffer(UMemoryStream *MS, int32_t *len); -U_CAPI const uint8_t * U_EXPORT2 uprv_mstrm_getCurrentBuffer(UMemoryStream *MS, int32_t *len); -U_CAPI int32_t U_EXPORT2 uprv_mstrm_skip(UMemoryStream *MS, int32_t len); -U_CAPI int32_t U_EXPORT2 uprv_mstrm_jump(UMemoryStream *MS, const uint8_t *where); - -U_CAPI void U_EXPORT2 uprv_mstrm_write8(UMemoryStream *MS, uint8_t byte); -U_CAPI void U_EXPORT2 uprv_mstrm_write16(UMemoryStream *MS, uint16_t word); -U_CAPI void U_EXPORT2 uprv_mstrm_write32(UMemoryStream *MS, uint32_t wyde); -U_CAPI void U_EXPORT2 uprv_mstrm_writeBlock(UMemoryStream *MS, const void *s, int32_t length); -U_CAPI void U_EXPORT2 uprv_mstrm_writePadding(UMemoryStream *MS, int32_t length); -U_CAPI void U_EXPORT2 uprv_mstrm_writeString(UMemoryStream *MS, const char *s, int32_t length); -U_CAPI void U_EXPORT2 uprv_mstrm_writeUString(UMemoryStream *MS, const UChar *s, int32_t length); - -#endif /* _FILESTRM*/ - - - - diff --git a/icuSources/common/umutex.c b/icuSources/common/umutex.c index d48b8057..5cf9e4ff 100644 --- a/icuSources/common/umutex.c +++ b/icuSources/common/umutex.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1997-2003, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -32,33 +32,19 @@ #endif -/* Check our settings... */ #include "unicode/utypes.h" #include "uassert.h" +#include "ucln_cmn.h" #if defined(POSIX) && (ICU_USE_THREADS==1) - /* Usage: uncomment the following, and breakpoint WeAreDeadlocked to - find reentrant issues. */ -/* # define POSIX_DEBUG_REENTRANCY 1 */ # include /* must be first, so that we get the multithread versions of things. */ -# ifdef POSIX_DEBUG_REENTRANCY - pthread_t gLastThread; - UBool gInMutex; - - U_EXPORT void WeAreDeadlocked(); - - void WeAreDeadlocked() - { - puts("ARGH!! We're deadlocked.. break on WeAreDeadlocked() next time."); - } -# endif /* POSIX_DEBUG_REENTRANCY */ #endif /* POSIX && (ICU_USE_THREADS==1) */ #ifdef WIN32 # define WIN32_LEAN_AND_MEAN -# define NOGDI +# define VC_EXTRALEAN # define NOUSER # define NOSERVICE # define NOIME @@ -69,326 +55,567 @@ #include "umutex.h" #include "cmemory.h" +/* + * A note on ICU Mutex Initialization and ICU startup: + * + * ICU mutexes, as used through the rest of the ICU code, are self-initializing. + * To make this work, ICU uses the _ICU GLobal Mutex_ to synchronize the lazy init + * of other ICU mutexes. For the global mutex itself, we need some other mechanism + * to safely initialize it on first use. This becomes important if two or more + * threads were more or less simultaenously the first to use ICU in a process, and + * were racing into the mutex initialization code. + * + * The solution for the global mutex init is platform dependent. + * On POSIX systems, C-style init can be used on a mutex, with the + * macro PTHREAD_MUTEX_INITIALIZER. The mutex is then ready for use, without + * first calling pthread_mutex_init(). + * + * Windows has no equivalent statically initialized mutex or CRITICAL SECION. + * InitializeCriticalSection() must be called. If the global mutex does not + * appear to be initialized, a thread will create and initialize a new + * CRITICAL_SECTION, then use a Windows InterlockedCompareAndExchange to + * avoid problems with race conditions. + * + * If an application has overridden the ICU mutex implementation + * by calling u_setMutexFunctions(), the user supplied init function must + * be safe in the event that multiple threads concurrently attempt to init + * the same mutex. The first thread should do the init, and the others should + * have no effect. + * + */ + +#define MAX_MUTEXES 30 +static UMTX gGlobalMutex = NULL; +static UMTX gIncDecMutex = NULL; #if (ICU_USE_THREADS == 1) +static UBool gMutexPoolInitialized = FALSE; +static char gMutexesInUse[MAX_MUTEXES]; + +#if defined(WIN32) +/*------------------------------------------------------------- + * + * WINDOWS platform variable declarations + * + *-------------------------------------------------------------*/ +static CRITICAL_SECTION gMutexes[MAX_MUTEXES]; +static CRITICAL_SECTION gGlobalWinMutex; + + +/* On WIN32 mutexes are reentrant. This makes it difficult to debug + * deadlocking problems that show up on POSIXy platforms, where + * mutexes deadlock upon reentry. ICU contains checking code for + * the global mutex as well as for other mutexes in the pool. + * + * This is for debugging purposes. + * + * This has no effect on non-WIN32 platforms, non-DEBUG builds, and + * non-ICU_USE_THREADS builds. + * + * Note: The CRITICAL_SECTION structure already has a RecursionCount + * member that can be used for this purpose, but portability to + * Win98/NT/2K needs to be tested before use. Works fine on XP. + * After portability is confirmed, the built-in RecursionCount can be + * used, and the gRecursionCountPool can be removed. + * + * Note: Non-global mutex checking only happens if there is no custom + * pMutexLockFn defined. Use one function, not two (don't use + * pMutexLockFn and pMutexUnlockFn) so the increment and decrement of + * the recursion count don't get out of sync. Users might set just + * one function, e.g., to perform a custom action, followed by a + * standard call to EnterCriticalSection. + */ +#if defined(U_DEBUG) && (ICU_USE_THREADS==1) +static int32_t gRecursionCount = 0; /* detect global mutex locking */ +static int32_t gRecursionCountPool[MAX_MUTEXES]; /* ditto for non-global */ +#endif -/* the global mutex. Use it proudly and wash it often. */ -static UMTX gGlobalMutex = NULL; -# ifdef _DEBUG -static int32_t gRecursionCount = 0; /* Detect Recursive entries. For debugging only. */ -# endif -#if defined(WIN32) -static CRITICAL_SECTION gPlatformMutex; - -#elif defined(POSIX) -static pthread_mutex_t gPlatformMutex; /* The global ICU mutex */ -static pthread_mutex_t gIncDecMutex; /* For use by atomic inc/dec, on Unixes only */ +#elif defined(POSIX) +/*------------------------------------------------------------- + * + * POSIX platform variable declarations + * + *-------------------------------------------------------------*/ +static pthread_mutex_t gMutexes[MAX_MUTEXES] = { + PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, + PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, + PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, + PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, + PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, + PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, + PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER +}; +#else +/*------------------------------------------------------------- + * + * UNKNOWN platform declarations + * + *-------------------------------------------------------------*/ +static void *gMutexes[MAX_MUTEXES] = { + NULL, NULL, NULL, + NULL, NULL, NULL, + NULL, NULL, NULL, + NULL, NULL, NULL, + NULL, NULL, NULL, + NULL, NULL, NULL, + NULL, NULL }; + +/* Unknown platform. OK so long as ICU_USE_THREAD is not set. + Note that user can still set mutex functions at run time, + and that the global mutex variable is still needed in that case. */ +#if (ICU_USE_THREADS == 1) +#error no ICU mutex implementation for this platform +#endif #endif #endif /* ICU_USE_THREADS==1 */ -U_CAPI UBool U_EXPORT2 -umtx_isInitialized(UMTX *mutex) -{ -#if (ICU_USE_THREADS == 1) - if (mutex == NULL) - { - return (UBool)(gGlobalMutex != NULL); - } else { - UBool isInited; - umtx_lock(NULL); - isInited = (*mutex != NULL); - umtx_unlock(NULL); - return isInited; - } -#else - return TRUE; /* Since we don't use threads, it's considered initialized. */ -#endif /* ICU_USE_THREADS==1 */ -} +/* + * User mutex implementation functions. If non-null, call back to these rather than + * directly using the system (Posix or Windows) APIs. + * (declarations are in uclean.h) + */ +static UMtxInitFn *pMutexInitFn = NULL; +static UMtxFn *pMutexDestroyFn = NULL; +static UMtxFn *pMutexLockFn = NULL; +static UMtxFn *pMutexUnlockFn = NULL; +static const void *gMutexContext = NULL; + + + +/* + * umtx_lock + */ U_CAPI void U_EXPORT2 umtx_lock(UMTX *mutex) { -#if (ICU_USE_THREADS == 1) - if (mutex == NULL) - { + if (mutex == NULL) { mutex = &gGlobalMutex; } - if (*mutex == NULL) - { - /* Lazy init of a non-global mutexes on first lock is NOT safe on processors - * that reorder memory operations. */ - /* U_ASSERT(FALSE); TODO: Turn this back on */ - if (mutex != &gGlobalMutex) { - umtx_init(mutex); - } else { - umtx_init(NULL); /* initialize the global mutex - only get - here if C++ static init is NOT working, - and u_init() hasn't been called. - - Not thread-safe if this call is contended! */ - } + if (*mutex == NULL) { + /* Lock of an uninitialized mutex. Initialize it before proceeding. */ + umtx_init(mutex); } -#if defined(WIN32) - - EnterCriticalSection((CRITICAL_SECTION*) *mutex); - #ifdef _DEBUG - if (mutex == &gGlobalMutex) { - gRecursionCount++; - U_ASSERT(gRecursionCount == 1); - } - #endif /*_DEBUG*/ + if (pMutexLockFn != NULL) { + (*pMutexLockFn)(gMutexContext, mutex); + } else { +#if (ICU_USE_THREADS == 1) +#if defined(WIN32) + EnterCriticalSection((CRITICAL_SECTION*) *mutex); #elif defined(POSIX) + pthread_mutex_lock((pthread_mutex_t*) *mutex); +#endif /* cascade of platforms */ +#endif /* ICU_USE_THREADS==1 */ + } -# ifdef POSIX_DEBUG_REENTRANCY - if (gInMutex == TRUE && mutex == &gGlobalMutex) /* in the mutex -- possible deadlock*/ - if(pthread_equal(gLastThread, pthread_self())) - WeAreDeadlocked(); -# endif - pthread_mutex_lock((pthread_mutex_t*) *mutex); - -# ifdef POSIX_DEBUG_REENTRANCY - if (mutex == &gGlobalMutex) { - gLastThread = pthread_self(); - gInMutex = TRUE; +#if defined(WIN32) && defined(U_DEBUG) && (ICU_USE_THREADS==1) + if (mutex == &gGlobalMutex) { /* Detect Reentrant locking of the global mutex. */ + gRecursionCount++; /* Recursion causes deadlocks on Unixes. */ + U_ASSERT(gRecursionCount == 1); /* Detection works on Windows. Debug problems there. */ } -# endif -#endif -#endif /* ICU_USE_THREADS==1 */ + /* This handles gGlobalMutex too, but only if there is no pMutexLockFn */ + else if (pMutexLockFn == NULL) { /* see comments above */ + int i = ((CRITICAL_SECTION*)*mutex) - &gMutexes[0]; + U_ASSERT(i >= 0 && i < MAX_MUTEXES); + ++gRecursionCountPool[i]; + + U_ASSERT(gRecursionCountPool[i] == 1); /* !Detect Deadlock! */ + + /* This works and is fast, but needs testing on Win98/NT/2K. + See comments above. [alan] + U_ASSERT((CRITICAL_SECTION*)*mutex >= &gMutexes[0] && + (CRITICAL_SECTION*)*mutex <= &gMutexes[MAX_MUTEXES]); + U_ASSERT(((CRITICAL_SECTION*)*mutex)->RecursionCount == 1); + */ + } +#endif /*U_DEBUG*/ } + + +/* + * umtx_unlock + */ U_CAPI void U_EXPORT2 umtx_unlock(UMTX* mutex) { -#if (ICU_USE_THREADS==1) - if(mutex == NULL) - { + if(mutex == NULL) { mutex = &gGlobalMutex; } - if(*mutex == NULL) - { - return; /* jitterbug 135, fix for multiprocessor machines */ + if(*mutex == NULL) { +#if (ICU_USE_THREADS == 1) + U_ASSERT(FALSE); /* This mutex is not initialized. */ +#endif + return; } -#if defined (WIN32) - #ifdef _DEBUG +#if defined (WIN32) && defined (U_DEBUG) && (ICU_USE_THREADS==1) if (mutex == &gGlobalMutex) { gRecursionCount--; - U_ASSERT(gRecursionCount == 0); + U_ASSERT(gRecursionCount == 0); /* Detect unlock of an already unlocked mutex */ } - #endif /*_DEBUG*/ - LeaveCriticalSection((CRITICAL_SECTION*)*mutex); - -#elif defined (POSIX) - pthread_mutex_unlock((pthread_mutex_t*)*mutex); - -#ifdef POSIX_DEBUG_REENTRANCY - if (mutex == &gGlobalMutex) { - gInMutex = FALSE; + /* This handles gGlobalMutex too, but only if there is no pMutexLockFn */ + else if (pMutexLockFn == NULL) { /* see comments above */ + int i = ((CRITICAL_SECTION*)*mutex) - &gMutexes[0]; + U_ASSERT(i >= 0 && i < MAX_MUTEXES); + --gRecursionCountPool[i]; + + U_ASSERT(gRecursionCountPool[i] == 0); /* !Detect Deadlock! */ + + /* This works and is fast, but needs testing on Win98/NT/2K. + Note that RecursionCount will be 1, not 0, since we haven't + left the CRITICAL_SECTION yet. See comments above. [alan] + U_ASSERT((CRITICAL_SECTION*)*mutex >= &gMutexes[0] && + (CRITICAL_SECTION*)*mutex <= &gMutexes[MAX_MUTEXES]); + U_ASSERT(((CRITICAL_SECTION*)*mutex)->RecursionCount == 1); + */ } #endif -#endif + if (pMutexUnlockFn) { + (*pMutexUnlockFn)(gMutexContext, mutex); + } else { +#if (ICU_USE_THREADS==1) +#if defined (WIN32) + LeaveCriticalSection((CRITICAL_SECTION*)*mutex); +#elif defined (POSIX) + pthread_mutex_unlock((pthread_mutex_t*)*mutex); +#endif /* cascade of platforms */ #endif /* ICU_USE_THREADS == 1 */ + } } + /* - * umtx_raw_init Do the platform specific mutex allocation and initialization + * initGlobalMutex Do the platform specific initialization of the ICU global mutex. + * Separated out from the other mutexes because it is different: + * Mutex storage is static for POSIX, init must be thread safe + * without the use of another mutex. */ +static void initGlobalMutex() { + /* + * If User Supplied mutex functions are in use + * init the icu global mutex using them. + */ + if (pMutexInitFn != NULL) { + if (gGlobalMutex==NULL) { + UErrorCode status = U_ZERO_ERROR; + (*pMutexInitFn)(gMutexContext, &gGlobalMutex, &status); + if (U_FAILURE(status)) { + /* TODO: how should errors here be handled? */ + return; + } + } + return; + } + + /* No user override of mutex functions. + * Use default ICU mutex implementations. + */ #if (ICU_USE_THREADS == 1) -static UMTX umtx_raw_init(void *mem) { - #if defined (WIN32) - if (mem == NULL) { - mem = uprv_malloc(sizeof(CRITICAL_SECTION)); - if (mem == NULL) {return NULL;} + /* + * for Windows, init the pool of critical sections that we + * will use as needed for ICU mutexes. + */ +#if defined (WIN32) + if (gMutexPoolInitialized == FALSE) { + int i; + for (i=0; iMethod(); - * // When 'mutex' goes out of scope and gets destroyed here - * // the lock is released + * umtx_unlock(NULL); * } * - * Note: Do NOT use the form 'Mutex mutex();' as that merely - * forward-declares a function returning a Mutex. This is a common - * mistake which silently slips through the compiler!! */ - + * an alternative C++ mutex API is defined in the file common/mutex.h + */ -/* Lock a mutex. Pass in NULL if you want the (ick) Single Global - Mutex. - * @param mutex The given mutex to be locked +/* Lock a mutex. + * @param mutex The given mutex to be locked. Pass NULL to specify + * the global ICU mutex. Recursive locks are an error + * and may cause a deadlock on some platforms. */ U_CAPI void U_EXPORT2 umtx_lock ( UMTX* mutex ); /* Unlock a mutex. Pass in NULL if you want the single global mutex. - * @param mutex The given mutex to be unlocked + * @param mutex The given mutex to be unlocked. Pass NULL to specify + * the global ICU mutex. */ U_CAPI void U_EXPORT2 umtx_unlock ( UMTX* mutex ); /* Initialize a mutex. Use it this way: umtx_init( &aMutex ); - * ICU Mutexes, aside from the global mutex, must be explicitly initialized - * before use. + * ICU Mutexes do not need explicit initialization before use. Use of this + * function is not necessary. + * Initialization of an already initialized mutex has no effect, and is safe to do. + * Initialization of mutexes is thread safe. Two threads can concurrently + * initialize the same mutex without causing problems. * @param mutex The given mutex to be initialized */ U_CAPI void U_EXPORT2 umtx_init ( UMTX* mutex ); /* Destroy a mutex. This will free the resources of a mutex. - Use it this way: - umtx_destroy( &aMutex ); - * @param mutex The given mutex to be destroyed + * Use it this way: + * umtx_destroy( &aMutex ); + * Destroying an already destroyed mutex has no effect, and causes no problems. + * This function is not thread safe. Two threads must not attempt to concurrently + * destroy the same mutex. + * @param mutex The given mutex to be destroyed. */ U_CAPI void U_EXPORT2 umtx_destroy( UMTX *mutex ); -/* Is a mutex initialized? - Use it this way: - umtx_isInitialized( &aMutex ); - This function is not normally needed. It is more efficient to - unconditionally call umtx_init(&aMutex) than it is to check first. - * @param mutex The given mutex to be tested -*/ -U_CAPI UBool U_EXPORT2 umtx_isInitialized( UMTX *mutex ); + /* * Atomic Increment and Decrement of an int32_t value. diff --git a/icuSources/common/unames.c b/icuSources/common/unames.c index 9d4fe257..f7389e67 100644 --- a/icuSources/common/unames.c +++ b/icuSources/common/unames.c @@ -1,8 +1,7 @@ - /* ****************************************************************************** * -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -15,20 +14,16 @@ * created by: Markus W. Scherer */ -/* set import/export definitions */ -#ifndef U_COMMON_IMPLEMENTATION -# define U_COMMON_IMPLEMENTATION -#endif - #include "unicode/utypes.h" +#include "unicode/putil.h" #include "unicode/uchar.h" #include "unicode/udata.h" -#include "unicode/uset.h" #include "ustr_imp.h" #include "umutex.h" #include "cmemory.h" #include "cstring.h" #include "ucln_cmn.h" +#include "udataswp.h" #include "uprops.h" /* prototypes ------------------------------------------------------------- */ @@ -81,80 +76,6 @@ static int32_t gMaxNameLength=0, gMaxISOCommentLength=0; */ static uint32_t gNameSet[8]={ 0 }, gISOCommentSet[8]={ 0 }; -static UBool -isDataLoaded(UErrorCode *pErrorCode); - -static UBool U_CALLCONV -isAcceptable(void *context, - const char *type, const char *name, - const UDataInfo *pInfo); - -static Group * -getGroup(UCharNames *names, uint32_t code); - -static uint16_t -getName(UCharNames *names, uint32_t code, UCharNameChoice nameChoice, - char *buffer, uint16_t bufferLength); - -static const uint8_t * -expandGroupLengths(const uint8_t *s, - uint16_t offsets[LINES_PER_GROUP+1], uint16_t lengths[LINES_PER_GROUP+1]); - -static uint16_t -expandGroupName(UCharNames *names, Group *group, - uint16_t lineNumber, UCharNameChoice nameChoice, - char *buffer, uint16_t bufferLength); - -static uint16_t -expandName(UCharNames *names, - const uint8_t *name, uint16_t nameLength, UCharNameChoice nameChoice, - char *buffer, uint16_t bufferLength); - -static UBool -compareName(UCharNames *names, - const uint8_t *name, uint16_t nameLength, UCharNameChoice nameChoice, - const char *otherName); - -static UBool -enumGroupNames(UCharNames *names, Group *group, - UChar32 start, UChar32 end, - UEnumCharNamesFn *fn, void *context, - UCharNameChoice nameChoice); - -static UBool -enumExtNames(UChar32 start, UChar32 end, - UEnumCharNamesFn *fn, void *context); - -static UBool -enumNames(UCharNames *names, - UChar32 start, UChar32 limit, - UEnumCharNamesFn *fn, void *context, - UCharNameChoice nameChoice); - -static uint16_t -getAlgName(AlgorithmicRange *range, uint32_t code, UCharNameChoice nameChoice, - char *buffer, uint16_t bufferLength); - -static uint16_t -writeFactorSuffix(const uint16_t *factors, uint16_t count, - const char *s, /* suffix elements */ - uint32_t code, - uint16_t indexes[8], /* output fields from here */ - const char *elementBases[8], const char *elements[8], - char *buffer, uint16_t bufferLength); - -static UBool -enumAlgNames(AlgorithmicRange *range, - UChar32 start, UChar32 limit, - UEnumCharNamesFn *fn, void *context, - UCharNameChoice nameChoice); - -static UChar32 -findAlgName(AlgorithmicRange *range, UCharNameChoice nameChoice, const char *otherName); - -static uint16_t -getExtName(uint32_t code, char *buffer, uint16_t bufferLength); - #define U_NONCHARACTER_CODE_POINT U_CHAR_CATEGORY_COUNT #define U_LEAD_SURROGATE U_CHAR_CATEGORY_COUNT + 1 #define U_TRAIL_SURROGATE U_CHAR_CATEGORY_COUNT + 2 @@ -164,526 +85,146 @@ getExtName(uint32_t code, char *buffer, uint16_t bufferLength); static const char * const charCatNames[U_CHAR_EXTENDED_CATEGORY_COUNT]; -static uint8_t -getCharCat(UChar32 cp); +/* implementation ----------------------------------------------------------- */ -static const char * -getCharCatName(UChar32 cp); - -/* public API --------------------------------------------------------------- */ +static UBool U_CALLCONV unames_cleanup(void) +{ + if(uCharNamesData) { + udata_close(uCharNamesData); + uCharNamesData = NULL; + } + if(uCharNames) { + uCharNames = NULL; + } + gMaxNameLength=0; + return TRUE; +} -U_CAPI int32_t U_EXPORT2 -u_charName(UChar32 code, UCharNameChoice nameChoice, - char *buffer, int32_t bufferLength, - UErrorCode *pErrorCode) { - AlgorithmicRange *algRange; - uint32_t *p; - uint32_t i; - int32_t length; +static UBool U_CALLCONV +isAcceptable(void *context, + const char *type, const char *name, + const UDataInfo *pInfo) { + return (UBool)( + pInfo->size>=20 && + pInfo->isBigEndian==U_IS_BIG_ENDIAN && + pInfo->charsetFamily==U_CHARSET_FAMILY && + pInfo->dataFormat[0]==0x75 && /* dataFormat="unam" */ + pInfo->dataFormat[1]==0x6e && + pInfo->dataFormat[2]==0x61 && + pInfo->dataFormat[3]==0x6d && + pInfo->formatVersion[0]==1); +} - /* check the argument values */ - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return 0; - } else if(nameChoice>=U_CHAR_NAME_CHOICE_COUNT || - bufferLength<0 || (bufferLength>0 && buffer==NULL) - ) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } +static UBool +isDataLoaded(UErrorCode *pErrorCode) { + /* load UCharNames from file if necessary */ + UBool isCached; - if((uint32_t)code>UCHAR_MAX_VALUE || !isDataLoaded(pErrorCode)) { - return u_terminateChars(buffer, bufferLength, 0, pErrorCode); - } + /* do this because double-checked locking is broken */ + umtx_lock(NULL); + isCached=uCharNames!=NULL; + umtx_unlock(NULL); - length=0; + if(!isCached) { + UCharNames *names; + UDataMemory *data; - /* try algorithmic names first */ - p=(uint32_t *)((uint8_t *)uCharNames+uCharNames->algNamesOffset); - i=*p; - algRange=(AlgorithmicRange *)(p+1); - while(i>0) { - if(algRange->start<=(uint32_t)code && (uint32_t)code<=algRange->end) { - length=getAlgName(algRange, (uint32_t)code, nameChoice, buffer, (uint16_t)bufferLength); - break; + /* check error code from previous attempt */ + if(U_FAILURE(gLoadErrorCode)) { + *pErrorCode=gLoadErrorCode; + return FALSE; } - algRange=(AlgorithmicRange *)((uint8_t *)algRange+algRange->size); - --i; - } - if(i==0) { - if (nameChoice == U_EXTENDED_CHAR_NAME) { - length = getName(uCharNames, (uint32_t )code, U_EXTENDED_CHAR_NAME, buffer, (uint16_t) bufferLength); - if (!length) { - /* extended character name */ - length = getExtName((uint32_t) code, buffer, (uint16_t) bufferLength); - } - } else { - /* normal character name */ - length=getName(uCharNames, (uint32_t)code, nameChoice, buffer, (uint16_t)bufferLength); + /* open the data outside the mutex block */ + data=udata_openChoice(NULL, DATA_TYPE, DATA_NAME, isAcceptable, NULL, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + gLoadErrorCode=*pErrorCode; + return FALSE; } - } - - return u_terminateChars(buffer, bufferLength, length, pErrorCode); -} - -#define _U_ISO_COMMENT U_CHAR_NAME_CHOICE_COUNT -U_CAPI int32_t U_EXPORT2 -u_getISOComment(UChar32 c, - char *dest, int32_t destCapacity, - UErrorCode *pErrorCode) { - int32_t length; + names=(UCharNames *)udata_getMemory(data); - /* check the argument values */ - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return 0; - } else if(destCapacity<0 || (destCapacity>0 && dest==NULL)) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } + /* in the mutex block, set the data for this process */ + { + umtx_lock(NULL); + if(uCharNames==NULL) { + uCharNames=names; + uCharNamesData=data; + data=NULL; + names=NULL; + ucln_common_registerCleanup(UCLN_COMMON_UNAMES, unames_cleanup); + } + umtx_unlock(NULL); + } - if((uint32_t)c>UCHAR_MAX_VALUE || !isDataLoaded(pErrorCode)) { - return u_terminateChars(dest, destCapacity, 0, pErrorCode); + /* if a different thread set it first, then close the extra data */ + if(data!=NULL) { + udata_close(data); /* NULL if it was set correctly */ + } } + return TRUE; +} - /* the ISO comment is stored like a normal character name */ - length=getName(uCharNames, (uint32_t)c, _U_ISO_COMMENT, dest, (uint16_t)destCapacity); - return u_terminateChars(dest, destCapacity, length, pErrorCode); +#define WRITE_CHAR(buffer, bufferLength, bufferPos, c) { \ + if((bufferLength)>0) { \ + *(buffer)++=c; \ + --(bufferLength); \ + } \ + ++(bufferPos); \ } -U_CAPI UChar32 U_EXPORT2 -u_charFromName(UCharNameChoice nameChoice, - const char *name, - UErrorCode *pErrorCode) { - char upper[120], lower[120]; - FindName findName; - AlgorithmicRange *algRange; - uint32_t *p; - uint32_t i; - UChar32 cp = 0; - char c0; - UChar32 error = 0xffff; /* Undefined, but use this for backwards compatibility. */ +#define U_ISO_COMMENT U_CHAR_NAME_CHOICE_COUNT - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return error; - } - - if(nameChoice>=U_CHAR_NAME_CHOICE_COUNT || name==NULL || *name==0) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return error; - } - - if(!isDataLoaded(pErrorCode)) { - return error; - } - - /* construct the uppercase and lowercase of the name first */ - for(i=0; i') { - for (--i; lower[i] && lower[i] != '-'; --i); - - if (lower[i] == '-') { /* We've got a category. */ - uint32_t cIdx; - - lower[i] = 0; - - for (++i; lower[i] != '>'; ++i) { - if (lower[i] >= '0' && lower[i] <= '9') { - cp = (cp << 4) + lower[i] - '0'; - } else if (lower[i] >= 'a' && lower[i] <= 'f') { - cp = (cp << 4) + lower[i] - 'a' + 10; - } else { - *pErrorCode = U_ILLEGAL_CHAR_FOUND; - return error; - } - } - - /* Now validate the category name. - We could use a binary search, or a trie, if - we really wanted to. */ - - for (lower[i] = 0, cIdx = 0; cIdx < LENGTHOF(charCatNames); ++cIdx) { - - if (!uprv_strcmp(lower + 1, charCatNames[cIdx])) { - if (getCharCat(cp) == cIdx) { - return cp; - } - break; - } - } - } - } - } - - *pErrorCode = U_ILLEGAL_CHAR_FOUND; - return error; - } - - /* try algorithmic names now */ - p=(uint32_t *)((uint8_t *)uCharNames+uCharNames->algNamesOffset); - i=*p; - algRange=(AlgorithmicRange *)(p+1); - while(i>0) { - if((cp=findAlgName(algRange, nameChoice, upper))!=0xffff) { - return cp; - } - algRange=(AlgorithmicRange *)((uint8_t *)algRange+algRange->size); - --i; - } - - /* normal character name */ - findName.otherName=upper; - findName.code=error; - enumNames(uCharNames, 0, UCHAR_MAX_VALUE + 1, DO_FIND_NAME, &findName, nameChoice); - if (findName.code == error) { - *pErrorCode = U_ILLEGAL_CHAR_FOUND; - } - return findName.code; -} - -U_CAPI void U_EXPORT2 -u_enumCharNames(UChar32 start, UChar32 limit, - UEnumCharNamesFn *fn, - void *context, - UCharNameChoice nameChoice, - UErrorCode *pErrorCode) { - AlgorithmicRange *algRange; - uint32_t *p; - uint32_t i; - - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return; - } - - if(nameChoice>=U_CHAR_NAME_CHOICE_COUNT || fn==NULL) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return; - } - - if((uint32_t) limit > UCHAR_MAX_VALUE + 1) { - limit = UCHAR_MAX_VALUE + 1; - } - if((uint32_t)start>=(uint32_t)limit) { - return; - } - - if(!isDataLoaded(pErrorCode)) { - return; - } - - /* interleave the data-driven ones with the algorithmic ones */ - /* iterate over all algorithmic ranges; assume that they are in ascending order */ - p=(uint32_t *)((uint8_t *)uCharNames+uCharNames->algNamesOffset); - i=*p; - algRange=(AlgorithmicRange *)(p+1); - while(i>0) { - /* enumerate the character names before the current algorithmic range */ - /* here: startstart) { - if((uint32_t)limit<=algRange->start) { - enumNames(uCharNames, start, limit, fn, context, nameChoice); - return; - } - if(!enumNames(uCharNames, start, (UChar32)algRange->start, fn, context, nameChoice)) { - return; - } - start=(UChar32)algRange->start; - } - /* enumerate the character names in the current algorithmic range */ - /* here: algRange->start<=startend) { - if((uint32_t)limit<=(algRange->end+1)) { - enumAlgNames(algRange, start, limit, fn, context, nameChoice); - return; - } - if(!enumAlgNames(algRange, start, (UChar32)algRange->end+1, fn, context, nameChoice)) { - return; - } - start=(UChar32)algRange->end+1; - } - /* continue to the next algorithmic range (here: startsize); - --i; - } - /* enumerate the character names after the last algorithmic range */ - enumNames(uCharNames, start, limit, fn, context, nameChoice); -} - -/* implementation ----------------------------------------------------------- */ - -UBool -unames_cleanup() -{ - if(uCharNamesData) { - udata_close(uCharNamesData); - uCharNamesData = NULL; - } - if(uCharNames) { - uCharNames = NULL; - } - gMaxNameLength=0; - return TRUE; -} - -static UBool -isDataLoaded(UErrorCode *pErrorCode) { - /* load UCharNames from file if necessary */ - UBool isCached; - - /* do this because double-checked locking is broken */ - umtx_lock(NULL); - isCached=uCharNames!=NULL; - umtx_unlock(NULL); - - if(!isCached) { - UCharNames *names; - UDataMemory *data; - - /* check error code from previous attempt */ - if(U_FAILURE(gLoadErrorCode)) { - *pErrorCode=gLoadErrorCode; - return FALSE; - } - - /* open the data outside the mutex block */ - data=udata_openChoice(NULL, DATA_TYPE, DATA_NAME, isAcceptable, NULL, pErrorCode); - if(U_FAILURE(*pErrorCode)) { - gLoadErrorCode=*pErrorCode; - return FALSE; - } - - names=(UCharNames *)udata_getMemory(data); - - /* in the mutex block, set the data for this process */ - { - umtx_lock(NULL); - if(uCharNames==NULL) { - uCharNames=names; - uCharNamesData=data; - data=NULL; - names=NULL; - } - umtx_unlock(NULL); - } - - /* if a different thread set it first, then close the extra data */ - if(data!=NULL) { - udata_close(data); /* NULL if it was set correctly */ - } - } - return TRUE; -} - -static UBool U_CALLCONV -isAcceptable(void *context, - const char *type, const char *name, - const UDataInfo *pInfo) { - return (UBool)( - pInfo->size>=20 && - pInfo->isBigEndian==U_IS_BIG_ENDIAN && - pInfo->charsetFamily==U_CHARSET_FAMILY && - pInfo->dataFormat[0]==0x75 && /* dataFormat="unam" */ - pInfo->dataFormat[1]==0x6e && - pInfo->dataFormat[2]==0x61 && - pInfo->dataFormat[3]==0x6d && - pInfo->formatVersion[0]==1); -} - -/* - * getGroup() does a binary search for the group that contains the - * Unicode code point "code". - * The return value is always a valid Group* that may contain "code" - * or else is the highest group before "code". - * If the lowest group is after "code", then that one is returned. - */ -static Group * -getGroup(UCharNames *names, uint32_t code) { - uint16_t groupMSB=(uint16_t)(code>>GROUP_SHIFT), - start=0, - limit=*(uint16_t *)((char *)names+names->groupsOffset), - number; - Group *groups=(Group *)((char *)names+names->groupsOffset+2); - - /* binary search for the group of names that contains the one for code */ - while(start>GROUP_SHIFT)==group->groupMSB) { - return expandGroupName(names, group, (uint16_t)(code&GROUP_MASK), nameChoice, - buffer, bufferLength); - } else { - /* group not found */ - /* zero-terminate */ - if(bufferLength>0) { - *buffer=0; - } - return 0; - } -} - -/* - * expandGroupLengths() reads a block of compressed lengths of 32 strings and - * expands them into offsets and lengths for each string. - * Lengths are stored with a variable-width encoding in consecutive nibbles: - * If a nibble<0xc, then it is the length itself (0=empty string). - * If a nibble>=0xc, then it forms a length value with the following nibble. - * Calculation see below. - * The offsets and lengths arrays must be at least 33 (one more) long because - * there is no check here at the end if the last nibble is still used. - */ -static const uint8_t * -expandGroupLengths(const uint8_t *s, - uint16_t offsets[LINES_PER_GROUP+1], uint16_t lengths[LINES_PER_GROUP+1]) { - /* read the lengths of the 32 strings in this group and get each string's offset */ - uint16_t i=0, offset=0, length=0; - uint8_t lengthByte; - - /* all 32 lengths must be read to get the offset of the first group string */ - while(i=12) { - /* double-nibble length spread across two bytes */ - length=(uint16_t)(((length&0x3)<<4|lengthByte>>4)+12); - lengthByte&=0xf; - } else if((lengthByte /* &0xf0 */)>=0xc0) { - /* double-nibble length spread across this one byte */ - length=(uint16_t)((lengthByte&0x3f)+12); - } else { - /* single-nibble length in MSBs */ - length=(uint16_t)(lengthByte>>4); - lengthByte&=0xf; - } - - *offsets++=offset; - *lengths++=length; - - offset+=length; - ++i; - - /* read odd nibble - LSBs of lengthByte */ - if((lengthByte&0xf0)==0) { - /* this nibble was not consumed for a double-nibble length above */ - length=lengthByte; - if(length<12) { - /* single-nibble length in LSBs */ - *offsets++=offset; - *lengths++=length; - - offset+=length; - ++i; - } - } else { - length=0; /* prevent double-nibble detection in the next iteration */ - } - } - - /* now, s is at the first group string */ - return s; -} - -static uint16_t -expandGroupName(UCharNames *names, Group *group, - uint16_t lineNumber, UCharNameChoice nameChoice, - char *buffer, uint16_t bufferLength) { - uint16_t offsets[LINES_PER_GROUP+2], lengths[LINES_PER_GROUP+2]; - const uint8_t *s=(uint8_t *)names+names->groupStringOffset+ - (group->offsetHigh<<16|group->offsetLow); - s=expandGroupLengths(s, offsets, lengths); - return expandName(names, s+offsets[lineNumber], lengths[lineNumber], nameChoice, - buffer, bufferLength); -} - -#define WRITE_CHAR(buffer, bufferLength, bufferPos, c) { \ - if((bufferLength)>0) { \ - *(buffer)++=c; \ - --(bufferLength); \ - } \ - ++(bufferPos); \ -} - -/* - * Important: expandName() and compareName() are almost the same - - * apply fixes to both. - * - * UnicodeData.txt uses ';' as a field separator, so no - * field can contain ';' as part of its contents. - * In unames.dat, it is marked as token[';']==-1 only if the - * semicolon is used in the data file - which is iff we - * have Unicode 1.0 names or ISO comments. - * So, it will be token[';']==-1 if we store U1.0 names/ISO comments - * although we know that it will never be part of a name. - */ -static uint16_t -expandName(UCharNames *names, - const uint8_t *name, uint16_t nameLength, UCharNameChoice nameChoice, - char *buffer, uint16_t bufferLength) { - uint16_t *tokens=(uint16_t *)names+8; - uint16_t token, tokenCount=*tokens++, bufferPos=0; - uint8_t *tokenStrings=(uint8_t *)names+names->tokenStringOffset; - uint8_t c; - - if(nameChoice==U_UNICODE_10_CHAR_NAME || nameChoice==_U_ISO_COMMENT) { - /* - * skip the modern name if it is not requested _and_ - * if the semicolon byte value is a character, not a token number - */ - if((uint8_t)';'>=tokenCount || tokens[(uint8_t)';']==(uint16_t)(-1)) { - while(nameLength>0) { - --nameLength; - if(*name++==';') { - break; - } - } - if(nameChoice==_U_ISO_COMMENT) { - /* skip the Unicode 1.0 name as well to get the ISO comment */ - while(nameLength>0) { - --nameLength; - if(*name++==';') { - break; - } - } - } - } else { - /* - * the semicolon byte value is a token number, therefore - * only modern names are stored in unames.dat and there is no - * such requested Unicode 1.0 name here - */ - nameLength=0; - } +/* + * Important: expandName() and compareName() are almost the same - + * apply fixes to both. + * + * UnicodeData.txt uses ';' as a field separator, so no + * field can contain ';' as part of its contents. + * In unames.dat, it is marked as token[';']==-1 only if the + * semicolon is used in the data file - which is iff we + * have Unicode 1.0 names or ISO comments. + * So, it will be token[';']==-1 if we store U1.0 names/ISO comments + * although we know that it will never be part of a name. + */ +static uint16_t +expandName(UCharNames *names, + const uint8_t *name, uint16_t nameLength, UCharNameChoice nameChoice, + char *buffer, uint16_t bufferLength) { + uint16_t *tokens=(uint16_t *)names+8; + uint16_t token, tokenCount=*tokens++, bufferPos=0; + uint8_t *tokenStrings=(uint8_t *)names+names->tokenStringOffset; + uint8_t c; + + if(nameChoice==U_UNICODE_10_CHAR_NAME || nameChoice==U_ISO_COMMENT) { + /* + * skip the modern name if it is not requested _and_ + * if the semicolon byte value is a character, not a token number + */ + if((uint8_t)';'>=tokenCount || tokens[(uint8_t)';']==(uint16_t)(-1)) { + while(nameLength>0) { + --nameLength; + if(*name++==';') { + break; + } + } + if(nameChoice==U_ISO_COMMENT) { + /* skip the Unicode 1.0 name as well to get the ISO comment */ + while(nameLength>0) { + --nameLength; + if(*name++==';') { + break; + } + } + } + } else { + /* + * the semicolon byte value is a token number, therefore + * only modern names are stored in unames.dat and there is no + * such requested Unicode 1.0 name here + */ + nameLength=0; + } } /* write each letter directly, and write a token word per token */ @@ -828,9 +369,219 @@ compareName(UCharNames *names, } } } - - /* complete match? */ - return (UBool)(*otherName==0); + + /* complete match? */ + return (UBool)(*otherName==0); +} + +static const char * const charCatNames[U_CHAR_EXTENDED_CATEGORY_COUNT] = { + "unassigned", + "uppercase letter", + "lowercase letter", + "titlecase letter", + "modifier letter", + "other letter", + "non spacing mark", + "enclosing mark", + "combining spacing mark", + "decimal digit number", + "letter number", + "other number", + "space separator", + "line separator", + "paragraph separator", + "control", + "format", + "private use area", + "surrogate", + "dash punctuation", + "start punctuation", + "end punctuation", + "connector punctuation", + "other punctuation", + "math symbol", + "currency symbol", + "modifier symbol", + "other symbol", + "initial punctuation", + "final punctuation", + "noncharacter", + "lead surrogate", + "trail surrogate" +}; + +static uint8_t getCharCat(UChar32 cp) { + uint8_t cat; + + if (UTF_IS_UNICODE_NONCHAR(cp)) { + return U_NONCHARACTER_CODE_POINT; + } + + if ((cat = u_charType(cp)) == U_SURROGATE) { + cat = UTF_IS_LEAD(cp) ? U_LEAD_SURROGATE : U_TRAIL_SURROGATE; + } + + return cat; +} + +static const char *getCharCatName(UChar32 cp) { + uint8_t cat = getCharCat(cp); + + /* Return unknown if the table of names above is not up to + date. */ + + if (cat >= LENGTHOF(charCatNames)) { + return "unknown"; + } else { + return charCatNames[cat]; + } +} + +static uint16_t getExtName(uint32_t code, char *buffer, uint16_t bufferLength) { + const char *catname = getCharCatName(code); + uint16_t length = 0; + + UChar32 cp; + int ndigits, i; + + WRITE_CHAR(buffer, bufferLength, length, '<'); + while (catname[length - 1]) { + WRITE_CHAR(buffer, bufferLength, length, catname[length - 1]); + } + WRITE_CHAR(buffer, bufferLength, length, '-'); + for (cp = code, ndigits = 0; cp; ++ndigits, cp >>= 4) + ; + if (ndigits < 4) + ndigits = 4; + for (cp = code, i = ndigits; (cp || i > 0) && bufferLength; cp >>= 4, bufferLength--) { + uint8_t v = (uint8_t)(cp & 0xf); + buffer[--i] = (v < 10 ? '0' + v : 'A' + v - 10); + } + buffer += ndigits; + length += ndigits; + WRITE_CHAR(buffer, bufferLength, length, '>'); + + return length; +} + +/* + * getGroup() does a binary search for the group that contains the + * Unicode code point "code". + * The return value is always a valid Group* that may contain "code" + * or else is the highest group before "code". + * If the lowest group is after "code", then that one is returned. + */ +static Group * +getGroup(UCharNames *names, uint32_t code) { + uint16_t groupMSB=(uint16_t)(code>>GROUP_SHIFT), + start=0, + limit=*(uint16_t *)((char *)names+names->groupsOffset), + number; + Group *groups=(Group *)((char *)names+names->groupsOffset+2); + + /* binary search for the group of names that contains the one for code */ + while(start=0xc, then it forms a length value with the following nibble. + * Calculation see below. + * The offsets and lengths arrays must be at least 33 (one more) long because + * there is no check here at the end if the last nibble is still used. + */ +static const uint8_t * +expandGroupLengths(const uint8_t *s, + uint16_t offsets[LINES_PER_GROUP+1], uint16_t lengths[LINES_PER_GROUP+1]) { + /* read the lengths of the 32 strings in this group and get each string's offset */ + uint16_t i=0, offset=0, length=0; + uint8_t lengthByte; + + /* all 32 lengths must be read to get the offset of the first group string */ + while(i=12) { + /* double-nibble length spread across two bytes */ + length=(uint16_t)(((length&0x3)<<4|lengthByte>>4)+12); + lengthByte&=0xf; + } else if((lengthByte /* &0xf0 */)>=0xc0) { + /* double-nibble length spread across this one byte */ + length=(uint16_t)((lengthByte&0x3f)+12); + } else { + /* single-nibble length in MSBs */ + length=(uint16_t)(lengthByte>>4); + lengthByte&=0xf; + } + + *offsets++=offset; + *lengths++=length; + + offset+=length; + ++i; + + /* read odd nibble - LSBs of lengthByte */ + if((lengthByte&0xf0)==0) { + /* this nibble was not consumed for a double-nibble length above */ + length=lengthByte; + if(length<12) { + /* single-nibble length in LSBs */ + *offsets++=offset; + *lengths++=length; + + offset+=length; + ++i; + } + } else { + length=0; /* prevent double-nibble detection in the next iteration */ + } + } + + /* now, s is at the first group string */ + return s; +} + +static uint16_t +expandGroupName(UCharNames *names, Group *group, + uint16_t lineNumber, UCharNameChoice nameChoice, + char *buffer, uint16_t bufferLength) { + uint16_t offsets[LINES_PER_GROUP+2], lengths[LINES_PER_GROUP+2]; + const uint8_t *s=(uint8_t *)names+names->groupStringOffset+ + (group->offsetHigh<<16|group->offsetLow); + s=expandGroupLengths(s, offsets, lengths); + return expandName(names, s+offsets[lineNumber], lengths[lineNumber], nameChoice, + buffer, bufferLength); +} + +static uint16_t +getName(UCharNames *names, uint32_t code, UCharNameChoice nameChoice, + char *buffer, uint16_t bufferLength) { + Group *group=getGroup(names, code); + if((uint16_t)(code>>GROUP_SHIFT)==group->groupMSB) { + return expandGroupName(names, group, (uint16_t)(code&GROUP_MASK), nameChoice, + buffer, bufferLength); + } else { + /* group not found */ + /* zero-terminate */ + if(bufferLength>0) { + *buffer=0; + } + return 0; + } } /* @@ -996,6 +747,80 @@ enumNames(UCharNames *names, return TRUE; } +static uint16_t +writeFactorSuffix(const uint16_t *factors, uint16_t count, + const char *s, /* suffix elements */ + uint32_t code, + uint16_t indexes[8], /* output fields from here */ + const char *elementBases[8], const char *elements[8], + char *buffer, uint16_t bufferLength) { + uint16_t i, factor, bufferPos=0; + char c; + + /* write elements according to the factors */ + + /* + * the factorized elements are determined by modulo arithmetic + * with the factors of this algorithm + * + * note that for fewer operations, count is decremented here + */ + --count; + for(i=count; i>0; --i) { + factor=factors[i]; + indexes[i]=(uint16_t)(code%factor); + code/=factor; + } + /* + * we don't need to calculate the last modulus because start<=code<=end + * guarantees here that code<=factors[0] + */ + indexes[0]=(uint16_t)code; + + /* write each element */ + for(;;) { + if(elementBases!=NULL) { + *elementBases++=s; + } + + /* skip indexes[i] strings */ + factor=indexes[i]; + while(factor>0) { + while(*s++!=0) {} + --factor; + } + if(elements!=NULL) { + *elements++=s; + } + + /* write element */ + while((c=*s++)!=0) { + WRITE_CHAR(buffer, bufferLength, bufferPos, c); + } + + /* we do not need to perform the rest of this loop for i==count - break here */ + if(i>=count) { + break; + } + + /* skip the rest of the strings for this factors[i] */ + factor=(uint16_t)(factors[i]-indexes[i]-1); + while(factor>0) { + while(*s++!=0) {} + --factor; + } + + ++i; + } + + /* zero-terminate */ + if(bufferLength>0) { + *buffer=0; + } + + return bufferPos; +} + /* * Important: * Parts of findAlgName() are almost the same as some of getAlgName(). @@ -1086,80 +911,6 @@ getAlgName(AlgorithmicRange *range, uint32_t code, UCharNameChoice nameChoice, return bufferPos; } -static uint16_t -writeFactorSuffix(const uint16_t *factors, uint16_t count, - const char *s, /* suffix elements */ - uint32_t code, - uint16_t indexes[8], /* output fields from here */ - const char *elementBases[8], const char *elements[8], - char *buffer, uint16_t bufferLength) { - uint16_t i, factor, bufferPos=0; - char c; - - /* write elements according to the factors */ - - /* - * the factorized elements are determined by modulo arithmetic - * with the factors of this algorithm - * - * note that for fewer operations, count is decremented here - */ - --count; - for(i=count; i>0; --i) { - factor=factors[i]; - indexes[i]=(uint16_t)(code%factor); - code/=factor; - } - /* - * we don't need to calculate the last modulus because start<=code<=end - * guarantees here that code<=factors[0] - */ - indexes[0]=(uint16_t)code; - - /* write each element */ - for(;;) { - if(elementBases!=NULL) { - *elementBases++=s; - } - - /* skip indexes[i] strings */ - factor=indexes[i]; - while(factor>0) { - while(*s++!=0) {} - --factor; - } - if(elements!=NULL) { - *elements++=s; - } - - /* write element */ - while((c=*s++)!=0) { - WRITE_CHAR(buffer, bufferLength, bufferPos, c); - } - - /* we do not need to perform the rest of this loop for i==count - break here */ - if(i>=count) { - break; - } - - /* skip the rest of the strings for this factors[i] */ - factor=(uint16_t)(factors[i]-indexes[i]-1); - while(factor>0) { - while(*s++!=0) {} - --factor; - } - - ++i; - } - - /* zero-terminate */ - if(bufferLength>0) { - *buffer=0; - } - - return bufferPos; -} - /* * Important: enumAlgNames() and findAlgName() are almost the same. * Any fix must be applied to both. @@ -1390,131 +1141,41 @@ findAlgName(AlgorithmicRange *range, UCharNameChoice nameChoice, const char *oth index=(uint16_t)(indexes[--i]+1); if(index= LENGTHOF(charCatNames)) { - return "unknown"; - } else { - return charCatNames[cat]; - } -} - -static uint16_t getExtName(uint32_t code, char *buffer, uint16_t bufferLength) { - const char *catname = getCharCatName(code); - uint16_t length = 0; + indexes[i]=index; + s=elements[i]; + while(*s++!=0) {} + elements[i]=s; + break; + } else { + /* reset this index to 0 and its element string to the first one */ + indexes[i]=0; + elements[i]=elementBases[i]; + } + } - UChar32 cp; - int ndigits, i; - - WRITE_CHAR(buffer, bufferLength, length, '<'); - while (catname[length - 1]) { - WRITE_CHAR(buffer, bufferLength, length, catname[length - 1]); + /* to make matters a little easier, just compare all elements of the suffix */ + t=otherName; + for(i=0; i>= 4) - ; - if (ndigits < 4) - ndigits = 4; - for (cp = code, i = ndigits; (cp || i > 0) && bufferLength; cp >>= 4, bufferLength--) { - uint8_t v = (uint8_t)(cp & 0xf); - buffer[--i] = (v < 10 ? '0' + v : 'A' + v - 10); + default: + /* undefined type */ + break; } - buffer += ndigits; - length += ndigits; - WRITE_CHAR(buffer, bufferLength, length, '>'); - return length; + return 0xffff; } /* sets of name characters, maximum name lengths ---------------------------- */ @@ -1702,72 +1363,327 @@ calcGroupNameSetsLengths(int32_t maxNameLength) { lineLimit=line+length; - /* read regular name */ - length=calcNameSetLength(tokens, tokenCount, tokenStrings, tokenLengths, gNameSet, &line, lineLimit); - if(length>maxNameLength) { - maxNameLength=length; - } - if(line==lineLimit) { - continue; - } + /* read regular name */ + length=calcNameSetLength(tokens, tokenCount, tokenStrings, tokenLengths, gNameSet, &line, lineLimit); + if(length>maxNameLength) { + maxNameLength=length; + } + if(line==lineLimit) { + continue; + } + + /* read Unicode 1.0 name */ + length=calcNameSetLength(tokens, tokenCount, tokenStrings, tokenLengths, gNameSet, &line, lineLimit); + if(length>maxNameLength) { + maxNameLength=length; + } + if(line==lineLimit) { + continue; + } + + /* read ISO comment */ + length=calcNameSetLength(tokens, tokenCount, tokenStrings, tokenLengths, gISOCommentSet, &line, lineLimit); + if(length>maxISOCommentLength) { + maxISOCommentLength=length; + } + } + + ++group; + --groupCount; + } + + if(tokenLengths!=NULL) { + uprv_free(tokenLengths); + } + + /* set gMax... - name length last for threading */ + gMaxISOCommentLength=maxISOCommentLength; + gMaxNameLength=maxNameLength; +} + +static UBool +calcNameSetsLengths(UErrorCode *pErrorCode) { + static const char extChars[]="0123456789ABCDEF<>-"; + int32_t i, maxNameLength; + + if(gMaxNameLength!=0) { + return TRUE; + } + + if(!isDataLoaded(pErrorCode)) { + return FALSE; + } + + /* set hex digits, used in various names, and <>-, used in extended names */ + for(i=0; i=U_CHAR_NAME_CHOICE_COUNT || + bufferLength<0 || (bufferLength>0 && buffer==NULL) + ) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + if((uint32_t)code>UCHAR_MAX_VALUE || !isDataLoaded(pErrorCode)) { + return u_terminateChars(buffer, bufferLength, 0, pErrorCode); + } + + length=0; + + /* try algorithmic names first */ + p=(uint32_t *)((uint8_t *)uCharNames+uCharNames->algNamesOffset); + i=*p; + algRange=(AlgorithmicRange *)(p+1); + while(i>0) { + if(algRange->start<=(uint32_t)code && (uint32_t)code<=algRange->end) { + length=getAlgName(algRange, (uint32_t)code, nameChoice, buffer, (uint16_t)bufferLength); + break; + } + algRange=(AlgorithmicRange *)((uint8_t *)algRange+algRange->size); + --i; + } + + if(i==0) { + if (nameChoice == U_EXTENDED_CHAR_NAME) { + length = getName(uCharNames, (uint32_t )code, U_EXTENDED_CHAR_NAME, buffer, (uint16_t) bufferLength); + if (!length) { + /* extended character name */ + length = getExtName((uint32_t) code, buffer, (uint16_t) bufferLength); + } + } else { + /* normal character name */ + length=getName(uCharNames, (uint32_t)code, nameChoice, buffer, (uint16_t)bufferLength); + } + } + + return u_terminateChars(buffer, bufferLength, length, pErrorCode); +} + +U_CAPI int32_t U_EXPORT2 +u_getISOComment(UChar32 c, + char *dest, int32_t destCapacity, + UErrorCode *pErrorCode) { + int32_t length; + + /* check the argument values */ + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } else if(destCapacity<0 || (destCapacity>0 && dest==NULL)) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + if((uint32_t)c>UCHAR_MAX_VALUE || !isDataLoaded(pErrorCode)) { + return u_terminateChars(dest, destCapacity, 0, pErrorCode); + } + + /* the ISO comment is stored like a normal character name */ + length=getName(uCharNames, (uint32_t)c, U_ISO_COMMENT, dest, (uint16_t)destCapacity); + return u_terminateChars(dest, destCapacity, length, pErrorCode); +} + +U_CAPI UChar32 U_EXPORT2 +u_charFromName(UCharNameChoice nameChoice, + const char *name, + UErrorCode *pErrorCode) { + char upper[120], lower[120]; + FindName findName; + AlgorithmicRange *algRange; + uint32_t *p; + uint32_t i; + UChar32 cp = 0; + char c0; + UChar32 error = 0xffff; /* Undefined, but use this for backwards compatibility. */ + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return error; + } + + if(nameChoice>=U_CHAR_NAME_CHOICE_COUNT || name==NULL || *name==0) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return error; + } + + if(!isDataLoaded(pErrorCode)) { + return error; + } + + /* construct the uppercase and lowercase of the name first */ + for(i=0; i') { + for (--i; lower[i] && lower[i] != '-'; --i) { + } + + if (lower[i] == '-') { /* We've got a category. */ + uint32_t cIdx; + + lower[i] = 0; + + for (++i; lower[i] != '>'; ++i) { + if (lower[i] >= '0' && lower[i] <= '9') { + cp = (cp << 4) + lower[i] - '0'; + } else if (lower[i] >= 'a' && lower[i] <= 'f') { + cp = (cp << 4) + lower[i] - 'a' + 10; + } else { + *pErrorCode = U_ILLEGAL_CHAR_FOUND; + return error; + } + } + + /* Now validate the category name. + We could use a binary search, or a trie, if + we really wanted to. */ - /* read Unicode 1.0 name */ - length=calcNameSetLength(tokens, tokenCount, tokenStrings, tokenLengths, gNameSet, &line, lineLimit); - if(length>maxNameLength) { - maxNameLength=length; - } - if(line==lineLimit) { - continue; - } + for (lower[i] = 0, cIdx = 0; cIdx < LENGTHOF(charCatNames); ++cIdx) { - /* read ISO comment */ - length=calcNameSetLength(tokens, tokenCount, tokenStrings, tokenLengths, gISOCommentSet, &line, lineLimit); - if(length>maxISOCommentLength) { - maxISOCommentLength=length; + if (!uprv_strcmp(lower + 1, charCatNames[cIdx])) { + if (getCharCat(cp) == cIdx) { + return cp; + } + break; + } + } + } } } - ++group; - --groupCount; + *pErrorCode = U_ILLEGAL_CHAR_FOUND; + return error; } - if(tokenLengths!=NULL) { - uprv_free(tokenLengths); + /* try algorithmic names now */ + p=(uint32_t *)((uint8_t *)uCharNames+uCharNames->algNamesOffset); + i=*p; + algRange=(AlgorithmicRange *)(p+1); + while(i>0) { + if((cp=findAlgName(algRange, nameChoice, upper))!=0xffff) { + return cp; + } + algRange=(AlgorithmicRange *)((uint8_t *)algRange+algRange->size); + --i; } - /* set gMax... - name length last for threading */ - gMaxISOCommentLength=maxISOCommentLength; - gMaxNameLength=maxNameLength; + /* normal character name */ + findName.otherName=upper; + findName.code=error; + enumNames(uCharNames, 0, UCHAR_MAX_VALUE + 1, DO_FIND_NAME, &findName, nameChoice); + if (findName.code == error) { + *pErrorCode = U_ILLEGAL_CHAR_FOUND; + } + return findName.code; } -static UBool -calcNameSetsLengths(UErrorCode *pErrorCode) { - static const char extChars[]="0123456789ABCDEF<>-"; - int32_t i, maxNameLength; +U_CAPI void U_EXPORT2 +u_enumCharNames(UChar32 start, UChar32 limit, + UEnumCharNamesFn *fn, + void *context, + UCharNameChoice nameChoice, + UErrorCode *pErrorCode) { + AlgorithmicRange *algRange; + uint32_t *p; + uint32_t i; - if(gMaxNameLength!=0) { - return TRUE; + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return; } - if(!isDataLoaded(pErrorCode)) { - return FALSE; + if(nameChoice>=U_CHAR_NAME_CHOICE_COUNT || fn==NULL) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return; } - /* set hex digits, used in various names, and <>-, used in extended names */ - for(i=0; i UCHAR_MAX_VALUE + 1) { + limit = UCHAR_MAX_VALUE + 1; + } + if((uint32_t)start>=(uint32_t)limit) { + return; } - /* set sets and lengths from algorithmic names */ - maxNameLength=calcAlgNameSetsLengths(0); - - /* set sets and lengths from extended names */ - maxNameLength=calcExtNameSetsLengths(maxNameLength); - - /* set sets and lengths from group names, set global maximum values */ - calcGroupNameSetsLengths(maxNameLength); + if(!isDataLoaded(pErrorCode)) { + return; + } - return TRUE; + /* interleave the data-driven ones with the algorithmic ones */ + /* iterate over all algorithmic ranges; assume that they are in ascending order */ + p=(uint32_t *)((uint8_t *)uCharNames+uCharNames->algNamesOffset); + i=*p; + algRange=(AlgorithmicRange *)(p+1); + while(i>0) { + /* enumerate the character names before the current algorithmic range */ + /* here: startstart) { + if((uint32_t)limit<=algRange->start) { + enumNames(uCharNames, start, limit, fn, context, nameChoice); + return; + } + if(!enumNames(uCharNames, start, (UChar32)algRange->start, fn, context, nameChoice)) { + return; + } + start=(UChar32)algRange->start; + } + /* enumerate the character names in the current algorithmic range */ + /* here: algRange->start<=startend) { + if((uint32_t)limit<=(algRange->end+1)) { + enumAlgNames(algRange, start, limit, fn, context, nameChoice); + return; + } + if(!enumAlgNames(algRange, start, (UChar32)algRange->end+1, fn, context, nameChoice)) { + return; + } + start=(UChar32)algRange->end+1; + } + /* continue to the next algorithmic range (here: startsize); + --i; + } + /* enumerate the character names after the last algorithmic range */ + enumNames(uCharNames, start, limit, fn, context, nameChoice); } U_CAPI int32_t U_EXPORT2 @@ -1802,7 +1718,7 @@ uprv_getMaxISOCommentLength() { * @param uset USet to receive characters. Existing contents are deleted. */ static void -charSetToUSet(uint32_t cset[8], USet* uset) { +charSetToUSet(uint32_t cset[8], USetAdder *sa) { UChar us[256]; char cs[256]; @@ -1810,7 +1726,6 @@ charSetToUSet(uint32_t cset[8], USet* uset) { UErrorCode errorCode; errorCode=U_ZERO_ERROR; - uset_clear(uset); if(!calcNameSetsLengths(&errorCode)) { return; @@ -1830,18 +1745,18 @@ charSetToUSet(uint32_t cset[8], USet* uset) { /* add each UChar to the USet */ for(i=0; iadd(sa->set, us[i]); } } } /** * Fills set with characters that are used in Unicode character names. - * @param set USet to receive characters. Existing contents are deleted. + * @param set USet to receive characters. */ U_CAPI void U_EXPORT2 -uprv_getCharNameCharacters(USet* set) { - charSetToUSet(gNameSet, set); +uprv_getCharNameCharacters(USetAdder *sa) { + charSetToUSet(gNameSet, sa); } #if 0 @@ -1851,14 +1766,369 @@ urename.h and uprops.h changed accordingly. */ /** * Fills set with characters that are used in Unicode character names. - * @param set USet to receive characters. Existing contents are deleted. + * @param set USetAdder to receive characters. */ U_CAPI void U_EXPORT2 -uprv_getISOCommentCharacters(USet* set) { - charSetToUSet(gISOCommentSet, set); +uprv_getISOCommentCharacters(USetAdder *sa) { + charSetToUSet(gISOCommentSet, sa); } #endif +/* data swapping ------------------------------------------------------------ */ + +/* + * The token table contains non-negative entries for token bytes, + * and -1 for bytes that represent themselves in the data file's charset. + * -2 entries are used for lead bytes. + * + * Direct bytes (-1 entries) must be translated from the input charset family + * to the output charset family. + * makeTokenMap() writes a permutation mapping for this. + * Use it once for single-/lead-byte tokens and once more for all trail byte + * tokens. (';' is an unused trail byte marked with -1.) + */ +static void +makeTokenMap(const UDataSwapper *ds, + int16_t tokens[], uint16_t tokenCount, + uint8_t map[256], + UErrorCode *pErrorCode) { + UBool usedOutChar[256]; + uint16_t i, j; + uint8_t c1, c2; + + if(U_FAILURE(*pErrorCode)) { + return; + } + + if(ds->inCharset==ds->outCharset) { + /* Same charset family: identity permutation */ + for(i=0; i<256; ++i) { + map[i]=(uint8_t)i; + } + } else { + uprv_memset(map, 0, 256); + uprv_memset(usedOutChar, 0, 256); + + if(tokenCount>256) { + tokenCount=256; + } + + /* set the direct bytes (byte 0 always maps to itself) */ + for(i=1; iswapInvChars(ds, &c1, 1, &c2, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + udata_printError(ds, "unames/makeTokenMap() finds variant character 0x%02x used (input charset family %d) - %s\n", + i, ds->inCharset, u_errorName(*pErrorCode)); + return; + } + + /* enter the converted character into the map and mark it used */ + map[c1]=c2; + usedOutChar[c2]=TRUE; + } + } + + /* set the mappings for the rest of the permutation */ + for(i=j=1; idataFormat[0]==0x75 && /* dataFormat="unam" */ + pInfo->dataFormat[1]==0x6e && + pInfo->dataFormat[2]==0x61 && + pInfo->dataFormat[3]==0x6d && + pInfo->formatVersion[0]==1 + )) { + udata_printError(ds, "uchar_swapNames(): data format %02x.%02x.%02x.%02x (format version %02x) is not recognized as unames.icu\n", + pInfo->dataFormat[0], pInfo->dataFormat[1], + pInfo->dataFormat[2], pInfo->dataFormat[3], + pInfo->formatVersion[0]); + *pErrorCode=U_UNSUPPORTED_ERROR; + return 0; + } + + inBytes=(const uint8_t *)inData+headerSize; + outBytes=(uint8_t *)outData+headerSize; + if(length<0) { + algNamesOffset=ds->readUInt32(((const uint32_t *)inBytes)[3]); + } else { + length-=headerSize; + if( length<20 || + (uint32_t)length<(algNamesOffset=ds->readUInt32(((const uint32_t *)inBytes)[3])) + ) { + udata_printError(ds, "uchar_swapNames(): too few bytes (%d after header) for unames.icu\n", + length); + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + } + + if(length<0) { + /* preflighting: iterate through algorithmic ranges */ + offset=algNamesOffset; + count=ds->readUInt32(*((const uint32_t *)(inBytes+offset))); + offset+=4; + + for(i=0; ireadUInt16(inRange->size); + } + } else { + /* swap data */ + const uint16_t *p; + uint16_t *q, *temp; + + int16_t tokens[512]; + uint16_t tokenCount; + + uint8_t map[256], trailMap[256]; + + /* copy the data for inaccessible bytes */ + if(inBytes!=outBytes) { + uprv_memcpy(outBytes, inBytes, length); + } + + /* the initial 4 offsets first */ + tokenStringOffset=ds->readUInt32(((const uint32_t *)inBytes)[0]); + groupsOffset=ds->readUInt32(((const uint32_t *)inBytes)[1]); + groupStringOffset=ds->readUInt32(((const uint32_t *)inBytes)[2]); + ds->swapArray32(ds, inBytes, 16, outBytes, pErrorCode); + + /* + * now the tokens table + * it needs to be permutated along with the compressed name strings + */ + p=(const uint16_t *)(inBytes+16); + q=(uint16_t *)(outBytes+16); + + /* read and swap the tokenCount */ + tokenCount=ds->readUInt16(*p); + ds->swapArray16(ds, p, 2, q, pErrorCode); + ++p; + ++q; + + /* read the first 512 tokens and make the token maps */ + if(tokenCount<=512) { + count=tokenCount; + } else { + count=512; + } + for(i=0; i256 ? tokenCount-256 : 0), trailMap, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return 0; + } + + /* + * swap and permutate the tokens + * go through a temporary array to support in-place swapping + */ + temp=(uint16_t *)uprv_malloc(tokenCount*2); + if(temp==NULL) { + udata_printError(ds, "out of memory swapping %u unames.icu tokens\n", + tokenCount); + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + return 0; + } + + /* swap and permutate single-/lead-byte tokens */ + for(i=0; iswapArray16(ds, p+i, 2, temp+map[i], pErrorCode); + } + + /* swap and permutate trail-byte tokens */ + for(; iswapArray16(ds, p+i, 2, temp+(i&0xffffff00)+trailMap[i&0xff], pErrorCode); + } + + /* copy the result into the output and free the temporary array */ + uprv_memcpy(q, temp, tokenCount*2); + uprv_free(temp); + + /* + * swap the token strings but not a possible padding byte after + * the terminating NUL of the last string + */ + udata_swapInvStringBlock(ds, inBytes+tokenStringOffset, (int32_t)(groupsOffset-tokenStringOffset), + outBytes+tokenStringOffset, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + udata_printError(ds, "uchar_swapNames(token strings) failed - %s\n", + u_errorName(*pErrorCode)); + return 0; + } + + /* swap the group table */ + count=ds->readUInt16(*((const uint16_t *)(inBytes+groupsOffset))); + ds->swapArray16(ds, inBytes+groupsOffset, (int32_t)((1+count*3)*2), + outBytes+groupsOffset, pErrorCode); + + /* + * swap the group strings + * swap the string bytes but not the nibble-encoded string lengths + */ + if(ds->inCharset!=ds->outCharset) { + uint16_t offsets[LINES_PER_GROUP+1], lengths[LINES_PER_GROUP+1]; + + const uint8_t *inStrings, *nextInStrings; + uint8_t *outStrings; + + uint8_t c; + + inStrings=inBytes+groupStringOffset; + outStrings=outBytes+groupStringOffset; + + stringsCount=algNamesOffset-groupStringOffset; + + /* iterate through string groups until only a few padding bytes are left */ + while(stringsCount>32) { + nextInStrings=expandGroupLengths(inStrings, offsets, lengths); + + /* move past the length bytes */ + stringsCount-=(uint32_t)(nextInStrings-inStrings); + outStrings+=nextInStrings-inStrings; + inStrings=nextInStrings; + + count=offsets[31]+lengths[31]; /* total number of string bytes in this group */ + stringsCount-=count; + + /* swap the string bytes using map[] and trailMap[] */ + while(count>0) { + c=*inStrings++; + *outStrings++=map[c]; + if(tokens[c]!=-2) { + --count; + } else { + /* token lead byte: swap the trail byte, too */ + *outStrings++=trailMap[*inStrings++]; + count-=2; + } + } + } + } + + /* swap the algorithmic ranges */ + offset=algNamesOffset; + count=ds->readUInt32(*((const uint32_t *)(inBytes+offset))); + ds->swapArray32(ds, inBytes+offset, 4, outBytes+offset, pErrorCode); + offset+=4; + + for(i=0; i(uint32_t)length) { + udata_printError(ds, "uchar_swapNames(): too few bytes (%d after header) for unames.icu algorithmic range %u\n", + length, i); + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + + inRange=(const AlgorithmicRange *)(inBytes+offset); + outRange=(AlgorithmicRange *)(outBytes+offset); + offset+=ds->readUInt16(inRange->size); + + ds->swapArray32(ds, inRange, 8, outRange, pErrorCode); + ds->swapArray16(ds, &inRange->size, 2, &outRange->size, pErrorCode); + switch(inRange->type) { + case 0: + /* swap prefix string */ + ds->swapInvChars(ds, inRange+1, (int32_t)uprv_strlen((const char *)(inRange+1)), + outRange+1, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + udata_printError(ds, "uchar_swapNames(prefix string of algorithmic range %u) failed - %s\n", + i, u_errorName(*pErrorCode)); + return 0; + } + break; + case 1: + { + /* swap factors and the prefix and factor strings */ + uint16_t factors[8]; + uint32_t j, factorsCount; + + factorsCount=inRange->variant; + if(factorsCount==0 || factorsCount>LENGTHOF(factors)) { + udata_printError(ds, "uchar_swapNames(): too many factors (%u) in algorithmic range %u\n", + factorsCount, i); + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + + /* read and swap the factors */ + p=(const uint16_t *)(inRange+1); + q=(uint16_t *)(outRange+1); + for(j=0; jreadUInt16(p[j]); + } + ds->swapArray16(ds, p, (int32_t)(factorsCount*2), q, pErrorCode); + + /* swap the strings, up to the last terminating NUL */ + p+=factorsCount; + q+=factorsCount; + stringsCount=(uint32_t)((inBytes+offset)-(const uint8_t *)p); + while(stringsCount>0 && ((const uint8_t *)p)[stringsCount-1]!=0) { + --stringsCount; + } + ds->swapInvChars(ds, p, (int32_t)stringsCount, q, pErrorCode); + } + break; + default: + udata_printError(ds, "uchar_swapNames(): unknown type %u of algorithmic range %u\n", + inRange->type, i); + *pErrorCode=U_UNSUPPORTED_ERROR; + return 0; + } + } + } + + return headerSize+(int32_t)offset; +} + /* * Hey, Emacs, please set the following: * diff --git a/icuSources/common/unicode/brkiter.h b/icuSources/common/unicode/brkiter.h index 1c48876d..9e397128 100644 --- a/icuSources/common/unicode/brkiter.h +++ b/icuSources/common/unicode/brkiter.h @@ -1,6 +1,6 @@ /* ******************************************************************************** -* Copyright (C) 1997-2003, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************** * @@ -45,7 +45,13 @@ U_NAMESPACE_END U_NAMESPACE_BEGIN +#if !UCONFIG_NO_SERVICE +/** + * Opaque type returned by registerInstance. + * @stable + */ typedef const void* URegistryKey; +#endif /** * The BreakIterator class implements methods for finding the location @@ -270,7 +276,11 @@ public: * boundaries have been returned. * @stable ICU 2.0 */ +#ifdef U_CYGWIN + static U_COMMON_API const int32_t DONE; +#else static const int32_t DONE; +#endif /** * Return the index of the first character in the text being scanned. @@ -367,8 +377,8 @@ public: * The caller owns the returned object and is responsible for deleting it. * @stable ICU 2.0 */ - static BreakIterator* createWordInstance(const Locale& where, - UErrorCode& status); + static BreakIterator* U_EXPORT2 + createWordInstance(const Locale& where, UErrorCode& status); /** * Create BreakIterator for line-breaks using specified locale. @@ -391,8 +401,8 @@ public: * The caller owns the returned object and is responsible for deleting it. * @stable ICU 2.0 */ - static BreakIterator* createLineInstance(const Locale& where, - UErrorCode& status); + static BreakIterator* U_EXPORT2 + createLineInstance(const Locale& where, UErrorCode& status); /** * Create BreakIterator for character-breaks using specified locale @@ -413,8 +423,8 @@ public: * The caller owns the returned object and is responsible for deleting it. * @stable ICU 2.0 */ - static BreakIterator* createCharacterInstance(const Locale& where, - UErrorCode& status); + static BreakIterator* U_EXPORT2 + createCharacterInstance(const Locale& where, UErrorCode& status); /** * Create BreakIterator for sentence-breaks using specified locale @@ -434,15 +444,15 @@ public: * The caller owns the returned object and is responsible for deleting it. * @stable ICU 2.0 */ - static BreakIterator* createSentenceInstance(const Locale& where, - UErrorCode& status); + static BreakIterator* U_EXPORT2 + createSentenceInstance(const Locale& where, UErrorCode& status); /** * Create BreakIterator for title-casing breaks using the specified locale * Returns an instance of a BreakIterator implementing title breaks. - * The iterator returned locates title boundaries as described for + * The iterator returned locates title boundaries as described for * Unicode 3.2 only. For Unicode 4.0 and above title boundary iteration, - * please use Word Boundary iterator.{@link createWordInstance()} + * please use Word Boundary iterator.{@link #createWordInstance } * * @param where the locale. * @param status The error code. @@ -459,18 +469,19 @@ public: * The caller owns the returned object and is responsible for deleting it. * @stable ICU 2.1 */ - static BreakIterator* createTitleInstance(const Locale& where, - UErrorCode& status); + static BreakIterator* U_EXPORT2 + createTitleInstance(const Locale& where, UErrorCode& status); /** * Get the set of Locales for which TextBoundaries are installed. *

Note: this will not return locales added through the register - * call.

+ * call. To see the registered locales too, use the getAvailableLocales + * function that returns a StringEnumeration object

* @param count the output parameter of number of elements in the locale list * @return available locales * @stable ICU 2.0 */ - static const Locale* getAvailableLocales(int32_t& count); + static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count); /** * Get name of the object for the desired Locale, in the desired langauge. @@ -481,7 +492,7 @@ public: * @return user-displayable name * @stable ICU 2.0 */ - static UnicodeString& getDisplayName(const Locale& objectLocale, + static UnicodeString& U_EXPORT2 getDisplayName(const Locale& objectLocale, const Locale& displayLocale, UnicodeString& name); @@ -493,7 +504,7 @@ public: * @return user-displayable name * @stable ICU 2.0 */ - static UnicodeString& getDisplayName(const Locale& objectLocale, + static UnicodeString& U_EXPORT2 getDisplayName(const Locale& objectLocale, UnicodeString& name); /** @@ -525,9 +536,10 @@ public: */ inline UBool isBufferClone(void); +#if !UCONFIG_NO_SERVICE /** * Register a new break iterator of the indicated kind, to use in the given locale. - * The break iterator will be adoped. Clones of the iterator will be returned + * The break iterator will be adopted. Clones of the iterator will be returned * if a request for a break iterator of the given kind matches or falls back to * this locale. * @param toAdopt the BreakIterator instance to be adopted @@ -535,9 +547,12 @@ public: * @param kind the type of iterator for which this instance is to be registered * @param status the in/out status code, no special meanings are assigned * @return a registry key that can be used to unregister this instance - * @draft ICU 2.4 + * @stable ICU 2.4 */ - static URegistryKey registerInstance(BreakIterator* toAdopt, const Locale& locale, UBreakIteratorType kind, UErrorCode& status); + static URegistryKey U_EXPORT2 registerInstance(BreakIterator* toAdopt, + const Locale& locale, + UBreakIteratorType kind, + UErrorCode& status); /** * Unregister a previously-registered BreakIterator using the key returned from the @@ -546,25 +561,36 @@ public: * @param key the registry key returned by a previous call to registerInstance * @param status the in/out status code, no special meanings are assigned * @return TRUE if the iterator for the key was successfully unregistered - * @draft ICU 2.4 + * @stable ICU 2.4 */ - static UBool unregister(URegistryKey key, UErrorCode& status); + static UBool U_EXPORT2 unregister(URegistryKey key, UErrorCode& status); /** - * Return a StringEnumeration over the locales available at the time of the call, + * Return a StringEnumeration over the locales available at the time of the call, * including registered locales. * @return a StringEnumeration over the locales available at the time of the call - * @draft ICU 2.4 + * @stable ICU 2.4 */ - static StringEnumeration* getAvailableLocales(void); + static StringEnumeration* U_EXPORT2 getAvailableLocales(void); +#endif - private: - static BreakIterator* makeCharacterInstance(const Locale& loc, UErrorCode& status); - static BreakIterator* makeWordInstance(const Locale& loc, UErrorCode& status); - static BreakIterator* makeLineInstance(const Locale& loc, UErrorCode& status); - static BreakIterator* makeSentenceInstance(const Locale& loc, UErrorCode& status); - static BreakIterator* makeTitleInstance(const Locale& loc, UErrorCode& status); + /** + * Returns the locale for this break iterator. Two flavors are available: valid and + * actual locale. + * @draft ICU 2.8 likely to change in ICU 3.0, based on feedback + */ + Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const; + /** Get the locale for this break iterator object. You can choose between valid and actual locale. + * @param type type of the locale we're looking for (valid or actual) + * @param status error code for the operation + * @return the locale + * @internal + */ + const char *getLocaleID(ULocDataLocaleType type, UErrorCode& status) const; + + private: + static BreakIterator* buildInstance(const Locale& loc, const char *type, UBool dict, UErrorCode& status); static BreakIterator* createInstance(const Locale& loc, UBreakIteratorType kind, UErrorCode& status); static BreakIterator* makeInstance(const Locale& loc, int32_t kind, UErrorCode& status); @@ -578,7 +604,13 @@ protected: UBool fBufferClone; /** @internal */ BreakIterator (const BreakIterator &other) : UObject(other), fBufferClone(FALSE) {} + private: + + /** @internal */ + char actualLocale[ULOC_FULLNAME_CAPACITY]; + char validLocale[ULOC_FULLNAME_CAPACITY]; + /** * The assignment operator has no real implementation. * It's provided to make the compiler happy. Do not call. diff --git a/icuSources/common/unicode/caniter.h b/icuSources/common/unicode/caniter.h index a06d4a8e..1deb3be6 100644 --- a/icuSources/common/unicode/caniter.h +++ b/icuSources/common/unicode/caniter.h @@ -1,6 +1,6 @@ /* ******************************************************************************* - * Copyright (C) 1996-2003, International Business Machines Corporation and * + * Copyright (C) 1996-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* */ @@ -17,7 +17,7 @@ /** Should permutation skip characters with combining class zero * Should be either TRUE or FALSE. This is a compile time option - * @draft ICU 2.4 + * @stable ICU 2.4 */ #ifndef CANITER_SKIP_ZEROES #define CANITER_SKIP_ZEROES TRUE @@ -31,36 +31,36 @@ class Hashtable; * This class allows one to iterate through all the strings that are canonically equivalent to a given * string. For example, here are some sample results: Results for: {LATIN CAPITAL LETTER A WITH RING ABOVE}{LATIN SMALL LETTER D}{COMBINING DOT ABOVE}{COMBINING CEDILLA} -1: \u0041\u030A\u0064\u0307\u0327 +1: \\u0041\\u030A\\u0064\\u0307\\u0327 = {LATIN CAPITAL LETTER A}{COMBINING RING ABOVE}{LATIN SMALL LETTER D}{COMBINING DOT ABOVE}{COMBINING CEDILLA} -2: \u0041\u030A\u0064\u0327\u0307 +2: \\u0041\\u030A\\u0064\\u0327\\u0307 = {LATIN CAPITAL LETTER A}{COMBINING RING ABOVE}{LATIN SMALL LETTER D}{COMBINING CEDILLA}{COMBINING DOT ABOVE} -3: \u0041\u030A\u1E0B\u0327 +3: \\u0041\\u030A\\u1E0B\\u0327 = {LATIN CAPITAL LETTER A}{COMBINING RING ABOVE}{LATIN SMALL LETTER D WITH DOT ABOVE}{COMBINING CEDILLA} -4: \u0041\u030A\u1E11\u0307 +4: \\u0041\\u030A\\u1E11\\u0307 = {LATIN CAPITAL LETTER A}{COMBINING RING ABOVE}{LATIN SMALL LETTER D WITH CEDILLA}{COMBINING DOT ABOVE} -5: \u00C5\u0064\u0307\u0327 +5: \\u00C5\\u0064\\u0307\\u0327 = {LATIN CAPITAL LETTER A WITH RING ABOVE}{LATIN SMALL LETTER D}{COMBINING DOT ABOVE}{COMBINING CEDILLA} -6: \u00C5\u0064\u0327\u0307 +6: \\u00C5\\u0064\\u0327\\u0307 = {LATIN CAPITAL LETTER A WITH RING ABOVE}{LATIN SMALL LETTER D}{COMBINING CEDILLA}{COMBINING DOT ABOVE} -7: \u00C5\u1E0B\u0327 +7: \\u00C5\\u1E0B\\u0327 = {LATIN CAPITAL LETTER A WITH RING ABOVE}{LATIN SMALL LETTER D WITH DOT ABOVE}{COMBINING CEDILLA} -8: \u00C5\u1E11\u0307 +8: \\u00C5\\u1E11\\u0307 = {LATIN CAPITAL LETTER A WITH RING ABOVE}{LATIN SMALL LETTER D WITH CEDILLA}{COMBINING DOT ABOVE} -9: \u212B\u0064\u0307\u0327 +9: \\u212B\\u0064\\u0307\\u0327 = {ANGSTROM SIGN}{LATIN SMALL LETTER D}{COMBINING DOT ABOVE}{COMBINING CEDILLA} -10: \u212B\u0064\u0327\u0307 +10: \\u212B\\u0064\\u0327\\u0307 = {ANGSTROM SIGN}{LATIN SMALL LETTER D}{COMBINING CEDILLA}{COMBINING DOT ABOVE} -11: \u212B\u1E0B\u0327 +11: \\u212B\\u1E0B\\u0327 = {ANGSTROM SIGN}{LATIN SMALL LETTER D WITH DOT ABOVE}{COMBINING CEDILLA} -12: \u212B\u1E11\u0307 +12: \\u212B\\u1E11\\u0307 = {ANGSTROM SIGN}{LATIN SMALL LETTER D WITH CEDILLA}{COMBINING DOT ABOVE} *
Note: the code is intended for use with small strings, and is not suitable for larger ones, * since it has not been optimized for that situation. * Note, CanonicalIterator is not intended to be subclassed. * @author M. Davis * @author C++ port by V. Weinstein - * @draft ICU 2.4 + * @stable ICU 2.4 */ class U_COMMON_API CanonicalIterator : public UObject { public: @@ -68,77 +68,77 @@ public: * Construct a CanonicalIterator object * @param source string to get results for * @param status Fill-in parameter which receives the status of this operation. - * @draft ICU 2.4 + * @stable ICU 2.4 */ - CanonicalIterator(const UnicodeString &source, UErrorCode &status); + CanonicalIterator(const UnicodeString &source, UErrorCode &status); /** Destructor * Cleans pieces - * @draft ICU 2.4 + * @stable ICU 2.4 */ - ~CanonicalIterator(); + virtual ~CanonicalIterator(); /** * Gets the NFD form of the current source we are iterating over. * @return gets the source: NOTE: it is the NFD form of source - * @draft ICU 2.4 + * @stable ICU 2.4 */ - UnicodeString getSource(); + UnicodeString getSource(); /** * Resets the iterator so that one can start again from the beginning. - * @draft ICU 2.4 + * @stable ICU 2.4 */ - void reset(); + void reset(); /** * Get the next canonically equivalent string. - *
Warning: The strings are not guaranteed to be in any particular order. + *
Warning: The strings are not guaranteed to be in any particular order. * @return the next string that is canonically equivalent. A bogus string is returned when * the iteration is done. - * @draft ICU 2.4 + * @stable ICU 2.4 */ - UnicodeString next(); + UnicodeString next(); /** * Set a new source for this iterator. Allows object reuse. * @param newSource the source string to iterate against. This allows the same iterator to be used * while changing the source string, saving object creation. * @param status Fill-in parameter which receives the status of this operation. - * @draft ICU 2.4 + * @stable ICU 2.4 */ - void setSource(const UnicodeString &newSource, UErrorCode &status); + void setSource(const UnicodeString &newSource, UErrorCode &status); /** - * Dumb recursive implementation of permutation. + * Dumb recursive implementation of permutation. * TODO: optimize * @param source the string to find permutations for * @param skipZeros determine if skip zeros * @param result the results in a set. * @param status Fill-in parameter which receives the status of this operation. - * @internal + * @internal */ - static void permute(UnicodeString &source, UBool skipZeros, Hashtable *result, UErrorCode &status); - + static void U_EXPORT2 permute(UnicodeString &source, UBool skipZeros, Hashtable *result, UErrorCode &status); + /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. + * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const; + static UClassID U_EXPORT2 getStaticClassID(); /** - * ICU "poor man's RTTI", returns a UClassID for this class. + * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ - static inline UClassID getStaticClassID(); + virtual UClassID getDynamicClassID() const; private: // ===================== PRIVATES ============================== // private default constructor - CanonicalIterator(); - + CanonicalIterator(); + /** * Copy constructor. Private for now. @@ -165,21 +165,21 @@ private: // current is used in iterating to combine pieces int32_t *current; int32_t current_length; - + // transient fields UnicodeString buffer; - + // we have a segment, in NFD. Find all the strings that are canonically equivalent to it. UnicodeString *getEquivalents(const UnicodeString &segment, int32_t &result_len, UErrorCode &status); //private String[] getEquivalents(String segment) - + //Set getEquivalents2(String segment); Hashtable *getEquivalents2(const UChar *segment, int32_t segLen, UErrorCode &status); //Hashtable *getEquivalents2(const UnicodeString &segment, int32_t segLen, UErrorCode &status); - + /** - * See if the decomposition of cp2 is at segment starting at segmentPos + * See if the decomposition of cp2 is at segment starting at segmentPos * (with canonical rearrangment!) - * If so, take the remainder, and return the equivalents + * If so, take the remainder, and return the equivalents */ //Set extract(int comp, String segment, int segmentPos, StringBuffer buffer); Hashtable *extract(UChar32 comp, const UChar *segment, int32_t segLen, int32_t segmentPos, UErrorCode &status); @@ -187,21 +187,8 @@ private: void cleanPieces(); - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; -inline UClassID -CanonicalIterator::getStaticClassID() -{ return (UClassID)&fgClassID; } - -inline UClassID -CanonicalIterator::getDynamicClassID() const -{ return CanonicalIterator::getStaticClassID(); } - U_NAMESPACE_END #endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/icuSources/common/unicode/chariter.h b/icuSources/common/unicode/chariter.h index 181398ed..94ce9a8d 100644 --- a/icuSources/common/unicode/chariter.h +++ b/icuSources/common/unicode/chariter.h @@ -1,7 +1,7 @@ /* ******************************************************************** * -* Copyright (C) 1997-2002, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************** @@ -84,100 +84,100 @@ U_NAMESPACE_BEGIN */ class U_COMMON_API ForwardCharacterIterator : public UObject { public: - /** - * Value returned by most of ForwardCharacterIterator's functions - * when the iterator has reached the limits of its iteration. - * @stable ICU 2.0 - */ - enum { DONE = 0xffff }; - - /** - * Destructor. - * @stable ICU 2.0 - */ - virtual ~ForwardCharacterIterator() {} - - /** - * Returns true when both iterators refer to the same - * character in the same character-storage object. - * @param that The ForwardCharacterIterator to be compared for equality - * @return true when both iterators refer to the same - * character in the same character-storage object - * @stable ICU 2.0 - */ - virtual UBool operator==(const ForwardCharacterIterator& that) const = 0; - - /** - * Returns true when the iterators refer to different - * text-storage objects, or to different characters in the - * same text-storage object. - * @param that The ForwardCharacterIterator to be compared for inequality - * @Returns true when the iterators refer to different - * text-storage objects, or to different characters in the - * same text-storage object - * @stable ICU 2.0 - */ - inline UBool operator!=(const ForwardCharacterIterator& that) const; - - /** - * Generates a hash code for this iterator. - * @return the hash code. - * @stable ICU 2.0 - */ - virtual int32_t hashCode(void) const = 0; - - /** - * Returns a UClassID for this ForwardCharacterIterator ("poor man's - * RTTI").

Despite the fact that this function is public, - * DO NOT CONSIDER IT PART OF CHARACTERITERATOR'S API! - * @Returns a UClassID for this ForwardCharacterIterator - * @stable ICU 2.0 - */ - virtual UClassID getDynamicClassID(void) const = 0; - - /** - * Gets the current code unit for returning and advances to the next code unit - * in the iteration range - * (toward endIndex()). If there are - * no more code units to return, returns DONE. - * @return the current code unit. - * @stable ICU 2.0 - */ - virtual UChar nextPostInc(void) = 0; - - /** - * Gets the current code point for returning and advances to the next code point - * in the iteration range - * (toward endIndex()). If there are - * no more code points to return, returns DONE. - * @return the current code point. - * @stable ICU 2.0 - */ - virtual UChar32 next32PostInc(void) = 0; - - /** - * Returns FALSE if there are no more code units or code points - * at or after the current position in the iteration range. - * This is used with nextPostInc() or next32PostInc() in forward - * iteration. - * @returns FALSE if there are no more code units or code points - * at or after the current position in the iteration range. - * @stable ICU 2.0 - */ - virtual UBool hasNext() = 0; - + /** + * Value returned by most of ForwardCharacterIterator's functions + * when the iterator has reached the limits of its iteration. + * @stable ICU 2.0 + */ + enum { DONE = 0xffff }; + + /** + * Destructor. + * @stable ICU 2.0 + */ + virtual ~ForwardCharacterIterator(); + + /** + * Returns true when both iterators refer to the same + * character in the same character-storage object. + * @param that The ForwardCharacterIterator to be compared for equality + * @return true when both iterators refer to the same + * character in the same character-storage object + * @stable ICU 2.0 + */ + virtual UBool operator==(const ForwardCharacterIterator& that) const = 0; + + /** + * Returns true when the iterators refer to different + * text-storage objects, or to different characters in the + * same text-storage object. + * @param that The ForwardCharacterIterator to be compared for inequality + * @return true when the iterators refer to different + * text-storage objects, or to different characters in the + * same text-storage object + * @stable ICU 2.0 + */ + inline UBool operator!=(const ForwardCharacterIterator& that) const; + + /** + * Generates a hash code for this iterator. + * @return the hash code. + * @stable ICU 2.0 + */ + virtual int32_t hashCode(void) const = 0; + + /** + * Returns a UClassID for this ForwardCharacterIterator ("poor man's + * RTTI").

Despite the fact that this function is public, + * DO NOT CONSIDER IT PART OF CHARACTERITERATOR'S API! + * @return a UClassID for this ForwardCharacterIterator + * @stable ICU 2.0 + */ + virtual UClassID getDynamicClassID(void) const = 0; + + /** + * Gets the current code unit for returning and advances to the next code unit + * in the iteration range + * (toward endIndex()). If there are + * no more code units to return, returns DONE. + * @return the current code unit. + * @stable ICU 2.0 + */ + virtual UChar nextPostInc(void) = 0; + + /** + * Gets the current code point for returning and advances to the next code point + * in the iteration range + * (toward endIndex()). If there are + * no more code points to return, returns DONE. + * @return the current code point. + * @stable ICU 2.0 + */ + virtual UChar32 next32PostInc(void) = 0; + + /** + * Returns FALSE if there are no more code units or code points + * at or after the current position in the iteration range. + * This is used with nextPostInc() or next32PostInc() in forward + * iteration. + * @returns FALSE if there are no more code units or code points + * at or after the current position in the iteration range. + * @stable ICU 2.0 + */ + virtual UBool hasNext() = 0; + protected: - /** Default constructor to be overridden in the implementing class. @stable ICU 2.0*/ - ForwardCharacterIterator() : UObject() {} - - /** Copy constructor to be overridden in the implementing class. @stable ICU 2.0*/ - ForwardCharacterIterator(const ForwardCharacterIterator &other) : UObject(other) {} - - /** - * Assignment operator to be overridden in the implementing class. - * @stable ICU 2.0 - */ - ForwardCharacterIterator &operator=(const ForwardCharacterIterator&) { return *this; } + /** Default constructor to be overridden in the implementing class. @stable ICU 2.0*/ + ForwardCharacterIterator(); + + /** Copy constructor to be overridden in the implementing class. @stable ICU 2.0*/ + ForwardCharacterIterator(const ForwardCharacterIterator &other); + + /** + * Assignment operator to be overridden in the implementing class. + * @stable ICU 2.0 + */ + ForwardCharacterIterator &operator=(const ForwardCharacterIterator&) { return *this; } }; /** @@ -351,361 +351,361 @@ protected: */ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { public: - /** - * Origin enumeration for the move() and move32() functions. - * @stable ICU 2.0 - */ - enum EOrigin { kStart, kCurrent, kEnd }; - - /** - * Returns a pointer to a new CharacterIterator of the same - * concrete class as this one, and referring to the same - * character in the same text-storage object as this one. The - * caller is responsible for deleting the new clone. - * @return a pointer to a new CharacterIterator - * @stable ICU 2.0 - */ - virtual CharacterIterator* clone(void) const = 0; - - /** - * Sets the iterator to refer to the first code unit in its - * iteration range, and returns that code unit. - * This can be used to begin an iteration with next(). - * @return the first code unit in its iteration range. - * @stable ICU 2.0 - */ - virtual UChar first(void) = 0; - - /** - * Sets the iterator to refer to the first code unit in its - * iteration range, returns that code unit, and moves the position - * to the second code unit. This is an alternative to setToStart() - * for forward iteration with nextPostInc(). - * @return the first code unit in its iteration range. - * @stable ICU 2.0 - */ - virtual UChar firstPostInc(void); - - /** - * Sets the iterator to refer to the first code point in its - * iteration range, and returns that code unit, - * This can be used to begin an iteration with next32(). - * Note that an iteration with next32PostInc(), beginning with, - * e.g., setToStart() or firstPostInc(), is more efficient. - * @return the first code point in its iteration range. - * @stable ICU 2.0 - */ - virtual UChar32 first32(void) = 0; - - /** - * Sets the iterator to refer to the first code point in its - * iteration range, returns that code point, and moves the position - * to the second code point. This is an alternative to setToStart() - * for forward iteration with next32PostInc(). - * @return the first code point in its iteration range. - * @stable ICU 2.0 - */ - virtual UChar32 first32PostInc(void); - - /** - * Sets the iterator to refer to the first code unit or code point in its - * iteration range. This can be used to begin a forward - * iteration with nextPostInc() or next32PostInc(). - * @return the start position of the iteration range - * @stable ICU 2.0 - */ - inline int32_t setToStart(); - - /** - * Sets the iterator to refer to the last code unit in its - * iteration range, and returns that code unit. - * This can be used to begin an iteration with previous(). - * @return the last code unit. - * @stable ICU 2.0 - */ - virtual UChar last(void) = 0; + /** + * Origin enumeration for the move() and move32() functions. + * @stable ICU 2.0 + */ + enum EOrigin { kStart, kCurrent, kEnd }; + + /** + * Returns a pointer to a new CharacterIterator of the same + * concrete class as this one, and referring to the same + * character in the same text-storage object as this one. The + * caller is responsible for deleting the new clone. + * @return a pointer to a new CharacterIterator + * @stable ICU 2.0 + */ + virtual CharacterIterator* clone(void) const = 0; + + /** + * Sets the iterator to refer to the first code unit in its + * iteration range, and returns that code unit. + * This can be used to begin an iteration with next(). + * @return the first code unit in its iteration range. + * @stable ICU 2.0 + */ + virtual UChar first(void) = 0; + + /** + * Sets the iterator to refer to the first code unit in its + * iteration range, returns that code unit, and moves the position + * to the second code unit. This is an alternative to setToStart() + * for forward iteration with nextPostInc(). + * @return the first code unit in its iteration range. + * @stable ICU 2.0 + */ + virtual UChar firstPostInc(void); + + /** + * Sets the iterator to refer to the first code point in its + * iteration range, and returns that code unit, + * This can be used to begin an iteration with next32(). + * Note that an iteration with next32PostInc(), beginning with, + * e.g., setToStart() or firstPostInc(), is more efficient. + * @return the first code point in its iteration range. + * @stable ICU 2.0 + */ + virtual UChar32 first32(void) = 0; + + /** + * Sets the iterator to refer to the first code point in its + * iteration range, returns that code point, and moves the position + * to the second code point. This is an alternative to setToStart() + * for forward iteration with next32PostInc(). + * @return the first code point in its iteration range. + * @stable ICU 2.0 + */ + virtual UChar32 first32PostInc(void); + + /** + * Sets the iterator to refer to the first code unit or code point in its + * iteration range. This can be used to begin a forward + * iteration with nextPostInc() or next32PostInc(). + * @return the start position of the iteration range + * @stable ICU 2.0 + */ + inline int32_t setToStart(); + + /** + * Sets the iterator to refer to the last code unit in its + * iteration range, and returns that code unit. + * This can be used to begin an iteration with previous(). + * @return the last code unit. + * @stable ICU 2.0 + */ + virtual UChar last(void) = 0; - /** - * Sets the iterator to refer to the last code point in its - * iteration range, and returns that code unit. - * This can be used to begin an iteration with previous32(). - * @return the last code point. - * @stable ICU 2.0 - */ - virtual UChar32 last32(void) = 0; - - /** - * Sets the iterator to the end of its iteration range, just behind - * the last code unit or code point. This can be used to begin a backward - * iteration with previous() or previous32(). - * @return the end position of the iteration range - * @stable ICU 2.0 - */ - inline int32_t setToEnd(); - - /** - * Sets the iterator to refer to the "position"-th code unit - * in the text-storage object the iterator refers to, and - * returns that code unit. - * @param position the "position"-th code unit in the text-storage object - * @return the "position"-th code unit. - * @stable ICU 2.0 - */ - virtual UChar setIndex(int32_t position) = 0; - - /** - * Sets the iterator to refer to the beginning of the code point - * that contains the "position"-th code unit - * in the text-storage object the iterator refers to, and - * returns that code point. - * The current position is adjusted to the beginning of the code point - * (its first code unit). - * @param position the "position"-th code unit in the text-storage object - * @return the "position"-th code point. - * @stable ICU 2.0 - */ - virtual UChar32 setIndex32(int32_t position) = 0; - - /** - * Returns the code unit the iterator currently refers to. - * @return the current code unit. - * @stable ICU 2.0 - */ - virtual UChar current(void) const = 0; + /** + * Sets the iterator to refer to the last code point in its + * iteration range, and returns that code unit. + * This can be used to begin an iteration with previous32(). + * @return the last code point. + * @stable ICU 2.0 + */ + virtual UChar32 last32(void) = 0; + + /** + * Sets the iterator to the end of its iteration range, just behind + * the last code unit or code point. This can be used to begin a backward + * iteration with previous() or previous32(). + * @return the end position of the iteration range + * @stable ICU 2.0 + */ + inline int32_t setToEnd(); + + /** + * Sets the iterator to refer to the "position"-th code unit + * in the text-storage object the iterator refers to, and + * returns that code unit. + * @param position the "position"-th code unit in the text-storage object + * @return the "position"-th code unit. + * @stable ICU 2.0 + */ + virtual UChar setIndex(int32_t position) = 0; + + /** + * Sets the iterator to refer to the beginning of the code point + * that contains the "position"-th code unit + * in the text-storage object the iterator refers to, and + * returns that code point. + * The current position is adjusted to the beginning of the code point + * (its first code unit). + * @param position the "position"-th code unit in the text-storage object + * @return the "position"-th code point. + * @stable ICU 2.0 + */ + virtual UChar32 setIndex32(int32_t position) = 0; + + /** + * Returns the code unit the iterator currently refers to. + * @return the current code unit. + * @stable ICU 2.0 + */ + virtual UChar current(void) const = 0; - /** - * Returns the code point the iterator currently refers to. - * @return the current code point. - * @stable ICU 2.0 - */ - virtual UChar32 current32(void) const = 0; + /** + * Returns the code point the iterator currently refers to. + * @return the current code point. + * @stable ICU 2.0 + */ + virtual UChar32 current32(void) const = 0; - /** - * Advances to the next code unit in the iteration range - * (toward endIndex()), and returns that code unit. If there are - * no more code units to return, returns DONE. - * @return the next code unit. - * @stable ICU 2.0 - */ - virtual UChar next(void) = 0; + /** + * Advances to the next code unit in the iteration range + * (toward endIndex()), and returns that code unit. If there are + * no more code units to return, returns DONE. + * @return the next code unit. + * @stable ICU 2.0 + */ + virtual UChar next(void) = 0; - /** - * Advances to the next code point in the iteration range - * (toward endIndex()), and returns that code point. If there are - * no more code points to return, returns DONE. - * Note that iteration with "pre-increment" semantics is less - * efficient than iteration with "post-increment" semantics - * that is provided by next32PostInc(). - * @return the next code point. - * @stable ICU 2.0 - */ - virtual UChar32 next32(void) = 0; + /** + * Advances to the next code point in the iteration range + * (toward endIndex()), and returns that code point. If there are + * no more code points to return, returns DONE. + * Note that iteration with "pre-increment" semantics is less + * efficient than iteration with "post-increment" semantics + * that is provided by next32PostInc(). + * @return the next code point. + * @stable ICU 2.0 + */ + virtual UChar32 next32(void) = 0; - /** - * Advances to the previous code unit in the iteration range - * (toward startIndex()), and returns that code unit. If there are - * no more code units to return, returns DONE. - * @return the previous code unit. - * @stable ICU 2.0 - */ - virtual UChar previous(void) = 0; - - /** - * Advances to the previous code point in the iteration range - * (toward startIndex()), and returns that code point. If there are - * no more code points to return, returns DONE. - * @return the previous code point. - * @stable ICU 2.0 - */ - virtual UChar32 previous32(void) = 0; - - /** - * Returns FALSE if there are no more code units or code points - * before the current position in the iteration range. - * This is used with previous() or previous32() in backward - * iteration. - * @return FALSE if there are no more code units or code points - * before the current position in the iteration range, return TRUE otherwise. - * @stable ICU 2.0 - */ - virtual UBool hasPrevious() = 0; - - /** - * Returns the numeric index in the underlying text-storage - * object of the character returned by first(). Since it's - * possible to create an iterator that iterates across only - * part of a text-storage object, this number isn't - * necessarily 0. - * @returns the numeric index in the underlying text-storage - * object of the character returned by first(). - * @stable ICU 2.0 - */ - inline int32_t startIndex(void) const; + /** + * Advances to the previous code unit in the iteration range + * (toward startIndex()), and returns that code unit. If there are + * no more code units to return, returns DONE. + * @return the previous code unit. + * @stable ICU 2.0 + */ + virtual UChar previous(void) = 0; + + /** + * Advances to the previous code point in the iteration range + * (toward startIndex()), and returns that code point. If there are + * no more code points to return, returns DONE. + * @return the previous code point. + * @stable ICU 2.0 + */ + virtual UChar32 previous32(void) = 0; + + /** + * Returns FALSE if there are no more code units or code points + * before the current position in the iteration range. + * This is used with previous() or previous32() in backward + * iteration. + * @return FALSE if there are no more code units or code points + * before the current position in the iteration range, return TRUE otherwise. + * @stable ICU 2.0 + */ + virtual UBool hasPrevious() = 0; + + /** + * Returns the numeric index in the underlying text-storage + * object of the character returned by first(). Since it's + * possible to create an iterator that iterates across only + * part of a text-storage object, this number isn't + * necessarily 0. + * @returns the numeric index in the underlying text-storage + * object of the character returned by first(). + * @stable ICU 2.0 + */ + inline int32_t startIndex(void) const; - /** - * Returns the numeric index in the underlying text-storage - * object of the position immediately BEYOND the character - * returned by last(). - * @return the numeric index in the underlying text-storage - * object of the position immediately BEYOND the character - * returned by last(). - * @stable ICU 2.0 - */ - inline int32_t endIndex(void) const; + /** + * Returns the numeric index in the underlying text-storage + * object of the position immediately BEYOND the character + * returned by last(). + * @return the numeric index in the underlying text-storage + * object of the position immediately BEYOND the character + * returned by last(). + * @stable ICU 2.0 + */ + inline int32_t endIndex(void) const; - /** - * Returns the numeric index in the underlying text-storage - * object of the character the iterator currently refers to - * (i.e., the character returned by current()). - * @return the numberic index in the text-storage object of - * the character the iterator currently refers to - * @stable ICU 2.0 - */ - inline int32_t getIndex(void) const; - - /** - * Returns the length of the entire text in the underlying - * text-storage object. - * @return the length of the entire text in the text-storage object - * @stable ICU 2.0 - */ - inline int32_t getLength() const; - - /** - * Moves the current position relative to the start or end of the - * iteration range, or relative to the current position itself. - * The movement is expressed in numbers of code units forward - * or backward by specifying a positive or negative delta. - * @delta the position relative to origin. A positive delta means forward; - * a negative delta means backward. - * @origin Origin enumeration {kStart, kCurrent, kEnd} - * @return the new position - * @stable ICU 2.0 - */ - virtual int32_t move(int32_t delta, EOrigin origin) = 0; - - /** - * Moves the current position relative to the start or end of the - * iteration range, or relative to the current position itself. - * The movement is expressed in numbers of code points forward - * or backward by specifying a positive or negative delta. - * @delta the position relative to origin. A positive delta means forward; - * a negative delta means backward. - * @origin Origin enumeration {kStart, kCurrent, kEnd} - * @return the new position - * @stable ICU 2.0 - */ - virtual int32_t move32(int32_t delta, EOrigin origin) = 0; - - /** - * Copies the text under iteration into the UnicodeString - * referred to by "result". - * @param result Receives a copy of the text under iteration. - * @stable ICU 2.0 - */ - virtual void getText(UnicodeString& result) = 0; + /** + * Returns the numeric index in the underlying text-storage + * object of the character the iterator currently refers to + * (i.e., the character returned by current()). + * @return the numberic index in the text-storage object of + * the character the iterator currently refers to + * @stable ICU 2.0 + */ + inline int32_t getIndex(void) const; + + /** + * Returns the length of the entire text in the underlying + * text-storage object. + * @return the length of the entire text in the text-storage object + * @stable ICU 2.0 + */ + inline int32_t getLength() const; + + /** + * Moves the current position relative to the start or end of the + * iteration range, or relative to the current position itself. + * The movement is expressed in numbers of code units forward + * or backward by specifying a positive or negative delta. + * @param delta the position relative to origin. A positive delta means forward; + * a negative delta means backward. + * @param origin Origin enumeration {kStart, kCurrent, kEnd} + * @return the new position + * @stable ICU 2.0 + */ + virtual int32_t move(int32_t delta, EOrigin origin) = 0; + + /** + * Moves the current position relative to the start or end of the + * iteration range, or relative to the current position itself. + * The movement is expressed in numbers of code points forward + * or backward by specifying a positive or negative delta. + * @param delta the position relative to origin. A positive delta means forward; + * a negative delta means backward. + * @param origin Origin enumeration {kStart, kCurrent, kEnd} + * @return the new position + * @stable ICU 2.0 + */ + virtual int32_t move32(int32_t delta, EOrigin origin) = 0; + + /** + * Copies the text under iteration into the UnicodeString + * referred to by "result". + * @param result Receives a copy of the text under iteration. + * @stable ICU 2.0 + */ + virtual void getText(UnicodeString& result) = 0; protected: - /** - * Empty constructor. - * @stable ICU 2.0 - */ - CharacterIterator(); - - /** - * Constructor, just setting the length field in this base class. - * @stable ICU 2.0 - */ - CharacterIterator(int32_t length); - - /** - * Constructor, just setting the length and position fields in this base class. - * @stable ICU 2.0 - */ - CharacterIterator(int32_t length, int32_t position); - - /** - * Constructor, just setting the length, start, end, and position fields in this base class. - * @stable ICU 2.0 - */ - CharacterIterator(int32_t length, int32_t textBegin, int32_t textEnd, int32_t position); + /** + * Empty constructor. + * @stable ICU 2.0 + */ + CharacterIterator(); + + /** + * Constructor, just setting the length field in this base class. + * @stable ICU 2.0 + */ + CharacterIterator(int32_t length); + + /** + * Constructor, just setting the length and position fields in this base class. + * @stable ICU 2.0 + */ + CharacterIterator(int32_t length, int32_t position); + + /** + * Constructor, just setting the length, start, end, and position fields in this base class. + * @stable ICU 2.0 + */ + CharacterIterator(int32_t length, int32_t textBegin, int32_t textEnd, int32_t position); - /** - * Copy constructor. - * - * @param that The CharacterIterator to be copied - * @stable ICU 2.0 - */ - CharacterIterator(const CharacterIterator &that); - - /** - * Assignment operator. Sets this CharacterIterator to have the same behavior, - * as the one passed in. - * @param that The CharacterIterator passed in. - * @return the newly set CharacterIterator. - * @stable ICU 2.0 - */ - CharacterIterator &operator=(const CharacterIterator &that); - - /** - * Base class text length field. - * Necessary this for correct getText() and hashCode(). - * @stable ICU 2.0 - */ - int32_t textLength; - - /** - * Base class field for the current position. - * @stable ICU 2.0 - */ - int32_t pos; - - /** - * Base class field for the start of the iteration range. - * @stable ICU 2.0 - */ - int32_t begin; - - /** - * Base class field for the end of the iteration range. - * @stable ICU 2.0 - */ - int32_t end; + /** + * Copy constructor. + * + * @param that The CharacterIterator to be copied + * @stable ICU 2.0 + */ + CharacterIterator(const CharacterIterator &that); + + /** + * Assignment operator. Sets this CharacterIterator to have the same behavior, + * as the one passed in. + * @param that The CharacterIterator passed in. + * @return the newly set CharacterIterator. + * @stable ICU 2.0 + */ + CharacterIterator &operator=(const CharacterIterator &that); + + /** + * Base class text length field. + * Necessary this for correct getText() and hashCode(). + * @stable ICU 2.0 + */ + int32_t textLength; + + /** + * Base class field for the current position. + * @stable ICU 2.0 + */ + int32_t pos; + + /** + * Base class field for the start of the iteration range. + * @stable ICU 2.0 + */ + int32_t begin; + + /** + * Base class field for the end of the iteration range. + * @stable ICU 2.0 + */ + int32_t end; }; inline UBool ForwardCharacterIterator::operator!=(const ForwardCharacterIterator& that) const { - return !operator==(that); + return !operator==(that); } inline int32_t CharacterIterator::setToStart() { - return move(0, kStart); + return move(0, kStart); } inline int32_t CharacterIterator::setToEnd() { - return move(0, kEnd); + return move(0, kEnd); } inline int32_t CharacterIterator::startIndex(void) const { - return begin; + return begin; } inline int32_t CharacterIterator::endIndex(void) const { - return end; + return end; } inline int32_t CharacterIterator::getIndex(void) const { - return pos; + return pos; } inline int32_t CharacterIterator::getLength(void) const { - return textLength; + return textLength; } U_NAMESPACE_END diff --git a/icuSources/common/unicode/dbbi.h b/icuSources/common/unicode/dbbi.h index 6982b2e2..9c6278a9 100644 --- a/icuSources/common/unicode/dbbi.h +++ b/icuSources/common/unicode/dbbi.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2003 IBM Corp. All rights reserved. +* Copyright (C) 1999-2004 IBM Corp. All rights reserved. ********************************************************************** * Date Name Description * 12/1/99 rgillam Complete port from Java. @@ -57,7 +57,7 @@ class DictionaryBasedBreakIteratorTables; * currently making it public. Contact us for help. *

* NOTE The DictionaryBasedIterator class is still under development. The - * APIs are not in stable condition yet. + * APIs are not in stable condition yet. */ class U_COMMON_API DictionaryBasedBreakIterator : public RuleBasedBreakIterator { @@ -84,17 +84,12 @@ private: DictionaryBasedBreakIteratorTables *fTables; - /** - * Class ID - */ - static const char fgClassID; - /**======================================================================= - * Create a dictionary based break boundary detection iterator. + * Create a dictionary based break boundary detection iterator. * @param tablesImage The location for the dictionary to be loaded into memory - * @param dictionaryFilename The name of the dictionary file + * @param dictionaryFilename The name of the dictionary file * @param status the error code status - * @return A dictionary based break detection iterator. The UErrorCode& status + * @return A dictionary based break detection iterator. The UErrorCode& status * parameter is used to return status information to the user. * To check whether the construction succeeded or not, you should check * the value of U_SUCCESS(err). If you wish more detailed information, you @@ -132,7 +127,7 @@ public: DictionaryBasedBreakIterator(const DictionaryBasedBreakIterator &other); /** - * Assignment operator. + * Assignment operator. * @param that The object to be copied. * @return the newly set DictionaryBasedBreakIterator. * @stable ICU 2.0 @@ -160,7 +155,7 @@ public: /** * Sets the iterator to refer to the first boundary position following * the specified position. - * @offset The position from which to begin searching for a break position. + * @param offset The position from which to begin searching for a break position. * @return The position of the first break after the current position. * @stable ICU 2.0 */ @@ -169,12 +164,25 @@ public: /** * Sets the iterator to refer to the last boundary position before the * specified position. - * @offset The position to begin searching for a break from. + * @param offset The position to begin searching for a break from. * @return The position of the last boundary before the starting position. * @stable ICU 2.0 */ virtual int32_t preceding(int32_t offset); + /** + * Returns the class ID for this class. This is useful only for + * comparing to a return value from getDynamicClassID(). For example: + * + * Base* polymorphic_pointer = createPolymorphicObject(); + * if (polymorphic_pointer->getDynamicClassID() == + * Derived::getStaticClassID()) ... + * + * @return The class ID for all objects of this class. + * @stable ICU 2.0 + */ + static UClassID U_EXPORT2 getStaticClassID(void); + /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. * This method is to implement a simple version of RTTI, since not all @@ -188,19 +196,6 @@ public: */ virtual UClassID getDynamicClassID(void) const; - /** - * Returns the class ID for this class. This is useful only for - * comparing to a return value from getDynamicClassID(). For example: - * - * Base* polymorphic_pointer = createPolymorphicObject(); - * if (polymorphic_pointer->getDynamicClassID() == - * Derived::getStaticClassID()) ... - * - * @return The class ID for all objects of this class. - * @stable ICU 2.0 - */ - static inline UClassID getStaticClassID(void); - protected: //======================================================================= // implementation @@ -229,15 +224,15 @@ protected: void init(); /** - * @param stackBuffer user allocated space for the new clone. If NULL new memory will be allocated. + * @param stackBuffer user allocated space for the new clone. If NULL new memory will be allocated. * If buffer is not large enough, new memory will be allocated. - * @param BufferSize reference to size of allocated space. - * If BufferSize == 0, a sufficient size for use in cloning will + * @param BufferSize reference to size of allocated space. + * If BufferSize == 0, a sufficient size for use in cloning will * be returned ('pre-flighting') - * If BufferSize is not enough for a stack-based safe clone, + * If BufferSize is not enough for a stack-based safe clone, * new memory will be allocated. * @param status to indicate whether the operation went on smoothly or there were errors - * An informational status value, U_SAFECLONE_ALLOCATED_ERROR, is used if any allocations were + * An informational status value, U_SAFECLONE_ALLOCATED_ERROR, is used if any allocations were * necessary. * @return pointer to the new clone * @internal @@ -270,14 +265,6 @@ private: friend class BreakIterator; }; -inline UClassID -DictionaryBasedBreakIterator::getStaticClassID(void) -{ return (UClassID)(&fgClassID); } - -inline UClassID -DictionaryBasedBreakIterator::getDynamicClassID(void) const -{ return DictionaryBasedBreakIterator::getStaticClassID(); } - U_NAMESPACE_END #endif /* #if !UCONFIG_NO_BREAK_ITERATION */ diff --git a/icuSources/common/unicode/docmain.h b/icuSources/common/unicode/docmain.h index 2d7231a5..94ac7301 100644 --- a/icuSources/common/unicode/docmain.h +++ b/icuSources/common/unicode/docmain.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. * * FILE NAME: DOCMAIN.h @@ -15,11 +15,10 @@ /*! \mainpage * - * \section Usage - *

API Reference Usage

+ * \section API API Reference Usage * *

C++ Programmers:

- *

Use Class Hierarchy or Class Hierarchy or Alphabetical List * or Compound List * to find the class you are interested in. For example, to find BreakIterator, * you can go to the Alphabetical List, then click on @@ -28,7 +27,7 @@ * then detailed member descriptions.

* *

C Programmers:

- *

Use Module List or File Members + *

Use Module List or File Members * to find a list of all the functions and constants. * For example, to find BreakIterator functions you would click on * File List, @@ -58,8 +57,7 @@ * * *


- * - *

Module List

+ *\htmlonly

Module List

\endhtmlonly * * * @@ -88,7 +86,7 @@ * * * - * + * * * * @@ -127,12 +125,12 @@ * * * - * - * + * + * * * * - * + * * * * @@ -157,7 +155,7 @@ * * * - * + * * * * @@ -168,8 +166,23 @@ * * * - * + * * * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * *
Module Name
Unicode Text Compressionucnv.h
(encoding name "SCSU" or "BOCU-1")
ucnv.h
(encoding name "SCSU" or "BOCU-1")
ucnv.h C API
NumberFormat
Number Spellout
(Rule Based Number Formatting)
unum.h
(use UNUM_SPELLOUT)
Number Spellout
(Rule Based Number Formatting)
unum.h
(use UNUM_SPELLOUT)
RuleBasedNumberFormat
Text Transformation
(Transliteration)
Text Transformation
(Transliteration)
utrans.hTransliterator
StringSearch
Text Boundary Analysis
(Break Iteration)
Text Boundary Analysis
(Break Iteration)
ubrk.hBreakIterator
Regular ExpressionsN/Auregex.hRegexPattern, RegexMatcher
StringPrepusprep.husprep.h C API
International Domain Names in Applicationsuidna.huidna.h C API
Universal Time Scaleutmscale.hutmscale.h C API
*/ diff --git a/icuSources/common/unicode/locid.h b/icuSources/common/unicode/locid.h index 29073e40..fea77201 100644 --- a/icuSources/common/unicode/locid.h +++ b/icuSources/common/unicode/locid.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1996-2003, International Business Machines +* Copyright (C) 1996-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -34,6 +34,7 @@ #include "unicode/unistr.h" #include "unicode/putil.h" #include "unicode/uloc.h" +#include "unicode/strenum.h" /** * \file @@ -52,29 +53,29 @@ * The Locale class is not suitable for subclassing. * *

- * You create a Locale object using the constructor in + * You can create a Locale object using the constructor in * this class: - *

+ * \htmlonly
\endhtmlonly *
- * .      Locale( const   char*  language, 
- * .              const   char*  country, 
+ * .      Locale( const   char*  language,
+ * .              const   char*  country,
  * .              const   char*  variant);
  * 
- *
+ * \htmlonly
\endhtmlonly * The first argument to the constructors is a valid ISO * Language Code. These codes are the lower-case two-letter * codes as defined by ISO-639. - * You can find a full list of these codes at a number of sites, such as: - *
- * http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt + * You can find a full list of these codes at: + *
+ * http://www.loc.gov/standards/iso639-2/ * *

* The second argument to the constructors is a valid ISO Country * Code. These codes are the upper-case two-letter codes * as defined by ISO-3166. * You can find a full list of these codes at a number of sites, such as: - *
- * http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html + *
+ * http://www.iso.ch/iso/en/prods-services/iso3166ma/index.html * *

* The third constructor requires a third argument--the Variant. @@ -102,11 +103,11 @@ * that you can use to create Locale objects for commonly used * locales. For example, the following refers to a Locale object * for the United States: - *

+ * \htmlonly
\endhtmlonly *
  *       Locale::getUS()
  * 
- *
+ * \htmlonly
\endhtmlonly * *

* Once you've created a Locale you can query it for information about @@ -122,33 +123,33 @@ * a language appropriate to that locale. * *

- * The TIFC provides a number of classes that perform locale-sensitive + * ICU provides a number of classes that perform locale-sensitive * operations. For example, the NumberFormat class formats * numbers, currency, or percentages in a locale-sensitive manner. Classes * such as NumberFormat have a number of convenience methods * for creating a default object of that type. For example, the * NumberFormat class provides these three convenience methods * for creating a default NumberFormat object: - *

+ * \htmlonly
\endhtmlonly *
  *     UErrorCode success = U_ZERO_ERROR;
  *     Locale myLocale;
  *     NumberFormat *nf;
- * 
+ *
  *     nf = NumberFormat::createInstance( success );          delete nf;
  *     nf = NumberFormat::createCurrencyInstance( success );  delete nf;
  *     nf = NumberFormat::createPercentInstance( success );   delete nf;
  * 
- *
+ * \htmlonly
\endhtmlonly * Each of these methods has two variants; one with an explicit locale * and one without; the latter using the default locale. - *
+ * \htmlonly
\endhtmlonly *
  *     nf = NumberFormat::createInstance( myLocale, success );          delete nf;
  *     nf = NumberFormat::createCurrencyInstance( myLocale, success );  delete nf;
  *     nf = NumberFormat::createPercentInstance( myLocale, success );   delete nf;
  * 
- *
+ * \htmlonly
\endhtmlonly * A Locale is the mechanism for identifying the kind of object * (NumberFormat) that you would like to get. The locale is * just a mechanism for identifying objects, @@ -162,7 +163,7 @@ * For example, you can create a menu of all the collation objects * suitable for a given language. Such classes implement these * three class methods: - *
+ * \htmlonly
\endhtmlonly *
  *       static Locale* getAvailableLocales(int32_t& numLocales)
  *       static UnicodeString& getDisplayName(const Locale&  objectLocale,
@@ -171,7 +172,7 @@
  *       static UnicodeString& getDisplayName(const Locale&  objectLocale,
  *                                            UnicodeString& displayName)
  * 
- *
+ * \htmlonly
\endhtmlonly * * @stable ICU 2.0 * @see ResourceBundle @@ -180,48 +181,48 @@ U_NAMESPACE_BEGIN class U_COMMON_API Locale : public UObject { public: /** Useful constant for this language. @stable ICU 2.0 */ - static const Locale &getEnglish(void); + static const Locale &U_EXPORT2 getEnglish(void); /** Useful constant for this language. @stable ICU 2.0 */ - static const Locale &getFrench(void); + static const Locale &U_EXPORT2 getFrench(void); /** Useful constant for this language. @stable ICU 2.0 */ - static const Locale &getGerman(void); + static const Locale &U_EXPORT2 getGerman(void); /** Useful constant for this language. @stable ICU 2.0 */ - static const Locale &getItalian(void); + static const Locale &U_EXPORT2 getItalian(void); /** Useful constant for this language. @stable ICU 2.0 */ - static const Locale &getJapanese(void); + static const Locale &U_EXPORT2 getJapanese(void); /** Useful constant for this language. @stable ICU 2.0 */ - static const Locale &getKorean(void); + static const Locale &U_EXPORT2 getKorean(void); /** Useful constant for this language. @stable ICU 2.0 */ - static const Locale &getChinese(void); + static const Locale &U_EXPORT2 getChinese(void); /** Useful constant for this language. @stable ICU 2.0 */ - static const Locale &getSimplifiedChinese(void); + static const Locale &U_EXPORT2 getSimplifiedChinese(void); /** Useful constant for this language. @stable ICU 2.0 */ - static const Locale &getTraditionalChinese(void); + static const Locale &U_EXPORT2 getTraditionalChinese(void); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &getFrance(void); + static const Locale &U_EXPORT2 getFrance(void); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &getGermany(void); + static const Locale &U_EXPORT2 getGermany(void); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &getItaly(void); + static const Locale &U_EXPORT2 getItaly(void); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &getJapan(void); + static const Locale &U_EXPORT2 getJapan(void); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &getKorea(void); + static const Locale &U_EXPORT2 getKorea(void); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &getChina(void); + static const Locale &U_EXPORT2 getChina(void); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &getPRC(void); + static const Locale &U_EXPORT2 getPRC(void); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &getTaiwan(void); + static const Locale &U_EXPORT2 getTaiwan(void); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &getUK(void); + static const Locale &U_EXPORT2 getUK(void); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &getUS(void); + static const Locale &U_EXPORT2 getUS(void); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &getCanada(void); + static const Locale &U_EXPORT2 getCanada(void); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &getCanadaFrench(void); + static const Locale &U_EXPORT2 getCanadaFrench(void); /** @@ -231,7 +232,7 @@ public: * @see uloc_getDefault * @stable ICU 2.0 */ - Locale(); + Locale(); /** * Construct a locale from language, country, variant. @@ -244,20 +245,23 @@ public: * This parameter can be NULL; if so, * the locale is initialized to match the current default locale. * (This is the same as using the default constructor.) - * Please note: The Java Locale class does NOT accept the form + * Please note: The Java Locale class does NOT accept the form * 'new Locale("en_US")' but only 'new Locale("en","US")' - * + * * @param country Uppercase two-letter ISO-3166 code. (optional) * @param variant Uppercase vendor and browser specific code. See class * description. (optional) + * @param keywordsAndValues A string consisting of keyword/values pairs, such as + * "collation=phonebook;currency=euro" * * @see getDefault * @see uloc_getDefault * @stable ICU 2.0 */ Locale( const char * language, - const char * country = 0, - const char * variant = 0); + const char * country = 0, + const char * variant = 0, + const char * keywordsAndValues = 0); /** * Initializes a Locale object from another Locale object. @@ -272,7 +276,7 @@ public: * Destructor * @stable ICU 2.0 */ - ~Locale() ; + virtual ~Locale() ; /** * Replaces the entire contents of *this with the specified value. @@ -302,6 +306,19 @@ public: */ UBool operator!=(const Locale& other) const; + /** + * Clone this object. + * Clones can be used concurrently in multiple threads. + * If an error occurs, then NULL is returned. + * The caller must delete the clone. + * + * @return a clone of this object + * + * @see getDynamicClassID + * @draft ICU 2.8 + */ + Locale *clone() const; + /** * Common methods of getting the current default Locale. Used for the * presentation: menus, dialogs, etc. Generally set once when your applet or @@ -317,7 +334,7 @@ public: * @system * @stable ICU 2.0 */ - static const Locale& getDefault(void); + static const Locale& U_EXPORT2 getDefault(void); /** * Sets the default. Normally set once at the beginning of a process, @@ -325,27 +342,36 @@ public: * setDefault() only changes ICU's default locale ID, not * the default locale ID of the runtime environment. * - * @param newLocale Locale to set to. + * @param newLocale Locale to set to. If NULL, set to the value obtained + * from the runtime environement. * @param success The error code. * @system * @stable ICU 2.0 */ - static void setDefault(const Locale& newLocale, - UErrorCode& success); + static void U_EXPORT2 setDefault(const Locale& newLocale, + UErrorCode& success); - /** - * Creates a locale which has had minimal canonicalization - * as per uloc_getName(). + * Creates a locale which has had minimal canonicalization + * as per uloc_getName(). * @param name The name to create from. If name is null, * the default Locale is used. * @return new locale object * @stable ICU 2.0 * @see uloc_getName */ - static Locale createFromName(const char *name); + static Locale U_EXPORT2 createFromName(const char *name); + + /** + * Creates a locale from the given string after canonicalizing + * the string by calling uloc_canonicalize(). + * @param name the locale ID to create from. Must not be NULL. + * @return a new locale object corresponding to the given name + * @draft ICU 3.0 + * @see uloc_canonicalize + */ + static Locale U_EXPORT2 createCanonical(const char* name); - /** * Returns the locale's ISO-639 language code. * @return An alias to the code @@ -353,6 +379,15 @@ public: */ inline const char * getLanguage( ) const; + /** + * Returns the locale's ISO-15924 abbreviation script code. + * @return An alias to the code + * @see uscript_getShortName + * @see uscript_getCode + * @draft ICU 2.8 + */ + inline const char * getScript( ) const; + /** * Returns the locale's ISO-3166 country code. * @return An alias to the code @@ -377,6 +412,38 @@ public: */ inline const char * getName() const; + /** + * Returns the programmatic name of the entire locale as getName would return, + * but without keywords. + * @return A pointer to "name". + * @see getName + * @draft ICU 2.8 + */ + const char * getBaseName() const; + + + /** + * Gets the list of keywords for the specified locale. + * + * @return pointer to StringEnumeration class. Client must dispose of it by calling delete. + * @param status Returns any error information while performing this operation. + * @draft ICU 2.8 + */ + StringEnumeration * createKeywords(UErrorCode &status) const; + + /** + * Get the value for a keyword. + * + * @param keywordName name of the keyword for which we want the value. Case insensitive. + * @param status Returns any error information while performing this operation. + * @param buffer The buffer to receive the keyword value. + * @param bufferCapacity The capacity of receiving buffer + * @return the length of keyword value + * + * @draft ICU 2.8 + */ + int32_t getKeywordValue(const char* keywordName, char *buffer, int32_t bufferCapacity, UErrorCode &status) const; + /** * returns the locale's three-letter language code, as specified * in ISO draft standard ISO-639-2.. @@ -414,20 +481,48 @@ public: /** * Fills in "dispLang" with the name of this locale's language in a format suitable for - * user display in the locale specified by "inLocale". For example, if the locale's - * language code is "en" and inLocale's language code is "fr", this function would set + * user display in the locale specified by "displayLocale". For example, if the locale's + * language code is "en" and displayLocale's language code is "fr", this function would set * dispLang to "Anglais". - * @param inLocale Specifies the locale to be used to display the name. In other words, + * @param displayLocale Specifies the locale to be used to display the name. In other words, * if the locale's language code is "en", passing Locale::getFrench() for - * inLocale would result in "Anglais", while passing Locale::getGerman() - * for inLocale would result in "Englisch". + * displayLocale would result in "Anglais", while passing Locale::getGerman() + * for displayLocale would result in "Englisch". * @param dispLang Receives the language's display name. * @return A reference to "dispLang". * @stable ICU 2.0 */ - UnicodeString& getDisplayLanguage( const Locale& inLocale, + UnicodeString& getDisplayLanguage( const Locale& displayLocale, UnicodeString& dispLang) const; + /** + * Fills in "dispScript" with the name of this locale's script in a format suitable + * for user display in the default locale. For example, if the locale's script code + * is "LATN" and the default locale's language code is "en", this function would set + * dispScript to "Latin". + * @param dispScript Receives the scripts's display name. + * @return A reference to "dispScript". + * @draft ICU 2.8 + */ + UnicodeString& getDisplayScript( UnicodeString& dispScript) const; + + /** + * Fills in "dispScript" with the name of this locale's country in a format suitable + * for user display in the locale specified by "displayLocale". For example, if the locale's + * script code is "LATN" and displayLocale's language code is "en", this function would set + * dispScript to "Latin". + * @param displayLocale Specifies the locale to be used to display the name. In other + * words, if the locale's script code is "LATN", passing + * Locale::getFrench() for displayLocale would result in "", while + * passing Locale::getGerman() for displayLocale would result in + * "". + * @param dispScript Receives the scripts's display name. + * @return A reference to "dispScript". + * @draft ICU 2.8 + */ + UnicodeString& getDisplayScript( const Locale& displayLocale, + UnicodeString& dispScript) const; + /** * Fills in "dispCountry" with the name of this locale's country in a format suitable * for user display in the default locale. For example, if the locale's country code @@ -441,19 +536,19 @@ public: /** * Fills in "dispCountry" with the name of this locale's country in a format suitable - * for user display in the locale specified by "inLocale". For example, if the locale's - * country code is "US" and inLocale's language code is "fr", this function would set + * for user display in the locale specified by "displayLocale". For example, if the locale's + * country code is "US" and displayLocale's language code is "fr", this function would set * dispCountry to "Etats-Unis". - * @param inLocale Specifies the locale to be used to display the name. In other + * @param displayLocale Specifies the locale to be used to display the name. In other * words, if the locale's country code is "US", passing - * Locale::getFrench() for inLocale would result in "États-Unis", while - * passing Locale::getGerman() for inLocale would result in + * Locale::getFrench() for displayLocale would result in "États-Unis", while + * passing Locale::getGerman() for displayLocale would result in * "Vereinigte Staaten". * @param dispCountry Receives the country's display name. * @return A reference to "dispCountry". * @stable ICU 2.0 */ - UnicodeString& getDisplayCountry( const Locale& inLocale, + UnicodeString& getDisplayCountry( const Locale& displayLocale, UnicodeString& dispCountry) const; /** @@ -467,17 +562,17 @@ public: /** * Fills in "dispVar" with the name of this locale's variant code in a format - * suitable for user display in the locale specified by "inLocale". - * @param inLocale Specifies the locale to be used to display the name. + * suitable for user display in the locale specified by "displayLocale". + * @param displayLocale Specifies the locale to be used to display the name. * @param dispVar Receives the variant's display name. * @return A reference to "dispVar". * @stable ICU 2.0 */ - UnicodeString& getDisplayVariant( const Locale& inLocale, + UnicodeString& getDisplayVariant( const Locale& displayLocale, UnicodeString& dispVar) const; /** - * Fills in "name" with the name of this locale in a format suitable for user display + * Fills in "name" with the name of this locale in a format suitable for user display * in the default locale. This function uses getDisplayLanguage(), getDisplayCountry(), * and getDisplayVariant() to do its work, and outputs the display name in the format * "language (country[,variant])". For example, if the default locale is en_US, then @@ -490,18 +585,18 @@ public: UnicodeString& getDisplayName( UnicodeString& name) const; /** - * Fills in "name" with the name of this locale in a format suitable for user display - * in the locale specfied by "inLocale". This function uses getDisplayLanguage(), + * Fills in "name" with the name of this locale in a format suitable for user display + * in the locale specfied by "displayLocale". This function uses getDisplayLanguage(), * getDisplayCountry(), and getDisplayVariant() to do its work, and outputs the display - * name in the format "language (country[,variant])". For example, if inLocale is + * name in the format "language (country[,variant])". For example, if displayLocale is * fr_FR, then en_US's display name would be "Anglais (États-Unis)", and no_NO_NY's * display name would be "norvégien (Norvège,NY)". - * @param inLocale Specifies the locale to be used to display the name. + * @param displayLocale Specifies the locale to be used to display the name. * @param name Receives the locale's display name. * @return A reference to "name". * @stable ICU 2.0 */ - UnicodeString& getDisplayName( const Locale& inLocale, + UnicodeString& getDisplayName( const Locale& displayLocale, UnicodeString& name) const; /** @@ -510,12 +605,12 @@ public: */ int32_t hashCode(void) const; - /** - * Sets the locale to bogus - * A bogus locale represents a non-existing locale associated - * with services that can be instantiated from non-locale data - * in addition to locale (for example, collation can be - * instantiated from a locale and from a rule set). + /** + * Sets the locale to bogus + * A bogus locale represents a non-existing locale associated + * with services that can be instantiated from non-locale data + * in addition to locale (for example, collation can be + * instantiated from a locale and from a rule set). * @stable ICU 2.1 */ void setToBogus(); @@ -535,7 +630,7 @@ public: * get ownership of this list, and must NOT delete it. * @stable ICU 2.0 */ - static const Locale* getAvailableLocales(int32_t& count); + static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count); /** * Gets a list of all available 2-letter country codes defined in ISO 639. This is a @@ -545,7 +640,7 @@ public: * @return a list of all available country codes * @stable ICU 2.0 */ - static const char* const* getISOCountries(); + static const char* const* U_EXPORT2 getISOCountries(); /** * Gets a list of all available language codes defined in ISO 639. This is a pointer @@ -555,21 +650,21 @@ public: * @return a list of all available language codes * @stable ICU 2.0 */ - static const char* const* getISOLanguages(); + static const char* const* U_EXPORT2 getISOLanguages(); /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. + * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const; + static UClassID U_EXPORT2 getStaticClassID(); /** - * ICU "poor man's RTTI", returns a UClassID for this class. + * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ - static inline UClassID getStaticClassID(); + virtual UClassID getDynamicClassID() const; protected: /* only protected for testing purposes. DO NOT USE. */ /** @@ -585,7 +680,7 @@ private: * * @param cLocaleID The new locale name. */ - Locale& init(const char* cLocaleID); + Locale& init(const char* cLocaleID, UBool canonicalize); /* * Internal constructor to allow construction of a locale object with @@ -603,32 +698,26 @@ private: static Locale *getLocaleCache(void); char language[ULOC_LANG_CAPACITY]; + char script[ULOC_SCRIPT_CAPACITY]; char country[ULOC_COUNTRY_CAPACITY]; int32_t variantBegin; char* fullName; char fullNameBuffer[ULOC_FULLNAME_CAPACITY]; + // name without keywords + char* baseName; + char baseNameBuffer[ULOC_FULLNAME_CAPACITY]; UBool fIsBogus; - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; - static const Locale &getLocale(int locid); + /** + * A friend to allow the default locale to be set by either the C or C++ API. + * @internal + */ friend void locale_set_default_internal(const char *); }; -inline UClassID -Locale::getStaticClassID() -{ return (UClassID)&fgClassID; } - -inline UClassID -Locale::getDynamicClassID() const -{ return Locale::getStaticClassID(); } - inline UBool Locale::operator!=(const Locale& other) const { @@ -647,19 +736,25 @@ Locale::getLanguage() const return language; } +inline const char * +Locale::getScript() const +{ + return script; +} + inline const char * Locale::getVariant() const { return &fullName[variantBegin]; } -inline const char * +inline const char * Locale::getName() const { return fullName; } -inline UBool +inline UBool Locale::isBogus(void) const { return fIsBogus; } @@ -667,3 +762,4 @@ Locale::isBogus(void) const { U_NAMESPACE_END #endif + diff --git a/icuSources/common/unicode/normlzr.h b/icuSources/common/unicode/normlzr.h index 946f4c9d..447f0469 100644 --- a/icuSources/common/unicode/normlzr.h +++ b/icuSources/common/unicode/normlzr.h @@ -1,7 +1,7 @@ /* ******************************************************************** - * COPYRIGHT: - * Copyright (c) 1996-2003, International Business Machines Corporation and + * COPYRIGHT: + * Copyright (c) 1996-2004, International Business Machines Corporation and * others. All Rights Reserved. ******************************************************************** */ @@ -23,7 +23,7 @@ typedef struct UCharIterator UCharIterator; /**< C typedef for struct UCharItera U_NAMESPACE_BEGIN /** - * \brief C++ API: Unicode Normalization + * \brief C++ API: Unicode Normalization * * The Normalizer class consists of two parts: * - static functions that normalize strings or test if strings are normalized @@ -136,7 +136,7 @@ public: * @stable ICU 2.0 */ Normalizer(const UnicodeString& str, UNormalizationMode mode); - + /** * Creates a new Normalizer object for iterating over the * normalized form of a given string. @@ -173,7 +173,7 @@ public: * Destructor * @stable ICU 2.0 */ - ~Normalizer(); + virtual ~Normalizer(); //------------------------------------------------------------------------- @@ -194,7 +194,7 @@ public: * @param status The error code. * @stable ICU 2.0 */ - static void normalize(const UnicodeString& source, + static void U_EXPORT2 normalize(const UnicodeString& source, UNormalizationMode mode, int32_t options, UnicodeString& result, UErrorCode &status); @@ -216,7 +216,7 @@ public: * @param status The error code. * @stable ICU 2.0 */ - static void compose(const UnicodeString& source, + static void U_EXPORT2 compose(const UnicodeString& source, UBool compat, int32_t options, UnicodeString& result, UErrorCode &status); @@ -238,22 +238,22 @@ public: * @param status The error code. * @stable ICU 2.0 */ - static void decompose(const UnicodeString& source, + static void U_EXPORT2 decompose(const UnicodeString& source, UBool compat, int32_t options, UnicodeString& result, UErrorCode &status); /** - * Performing quick check on a string, to quickly determine if the string is + * Performing quick check on a string, to quickly determine if the string is * in a particular normalization format. * This is a wrapper for unorm_quickCheck(), using a UnicodeString. * * Three types of result can be returned UNORM_YES, UNORM_NO or * UNORM_MAYBE. Result UNORM_YES indicates that the argument * string is in the desired normalized format, UNORM_NO determines that - * argument string is not in the desired normalized format. A - * UNORM_MAYBE result indicates that a more thorough check is required, - * the user may have to put the string in its normalized form and compare the + * argument string is not in the desired normalized format. A + * UNORM_MAYBE result indicates that a more thorough check is required, + * the user may have to put the string in its normalized form and compare the * results. * @param source string for determining if it is in a normalized format * @param mode normalization format @@ -277,7 +277,7 @@ public: * @return UNORM_YES, UNORM_NO or UNORM_MAYBE * * @see isNormalized - * @draft ICU 2.6 + * @stable ICU 2.6 */ static inline UNormalizationCheckResult quickCheck(const UnicodeString &source, UNormalizationMode mode, int32_t options, UErrorCode &status); @@ -300,7 +300,7 @@ public: * "mode" normalization form. * * @see quickCheck - * @draft ICU 2.2 + * @stable ICU 2.2 */ static inline UBool isNormalized(const UnicodeString &src, UNormalizationMode mode, UErrorCode &errorCode); @@ -318,7 +318,7 @@ public: * "mode" normalization form. * * @see quickCheck - * @draft ICU 2.6 + * @stable ICU 2.6 */ static inline UBool isNormalized(const UnicodeString &src, UNormalizationMode mode, int32_t options, UErrorCode &errorCode); @@ -353,7 +353,7 @@ public: * @stable ICU 2.1 */ static UnicodeString & - concatenate(UnicodeString &left, UnicodeString &right, + U_EXPORT2 concatenate(UnicodeString &left, UnicodeString &right, UnicodeString &result, UNormalizationMode mode, int32_t options, UErrorCode &errorCode); @@ -420,7 +420,7 @@ public: * @see u_strCompare * @see u_strCaseCompare * - * @draft ICU 2.2 + * @stable ICU 2.2 */ static inline int32_t compare(const UnicodeString &s1, const UnicodeString &s2, @@ -430,7 +430,7 @@ public: //------------------------------------------------------------------------- // Iteration API //------------------------------------------------------------------------- - + /** * Return the current character in the normalized text. * current() may need to normalize some text at getIndex(). @@ -572,7 +572,7 @@ public: /** * Returns a pointer to a new Normalizer that is a clone of this one. * The caller is responsible for deleting the new clone. - * @return a pointer to a new Normalizer + * @return a pointer to a new Normalizer * @stable ICU 2.0 */ Normalizer* clone(void) const; @@ -593,12 +593,12 @@ public: * Set the normalization mode for this object. *

* Note:If the normalization mode is changed while iterating - * over a string, calls to {@link next()} and {@link previous()} may + * over a string, calls to {@link #next() } and {@link #previous() } may * return previously buffers characters in the old normalization mode * until the iteration is able to re-sync at the next base character. - * It is safest to call {@link setIndexOnly()}, {@link reset()}, - * {@link setText()}, {@link first()}, - * {@link last()}, etc. after calling setMode. + * It is safest to call {@link #setIndexOnly }, {@link #reset() }, + * {@link #setText }, {@link #first() }, + * {@link #last() }, etc. after calling setMode. *

* @param newMode the new mode for this Normalizer. * @see #getUMode @@ -634,7 +634,7 @@ public: * @see #getOption * @stable ICU 2.0 */ - void setOption(int32_t option, + void setOption(int32_t option, UBool value); /** @@ -657,7 +657,7 @@ public: * @param status a UErrorCode * @stable ICU 2.0 */ - void setText(const UnicodeString& newText, + void setText(const UnicodeString& newText, UErrorCode &status); /** @@ -668,7 +668,7 @@ public: * @param status a UErrorCode * @stable ICU 2.0 */ - void setText(const CharacterIterator& newText, + void setText(const CharacterIterator& newText, UErrorCode &status); /** @@ -692,18 +692,18 @@ public: void getText(UnicodeString& result); /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * @return a UClassID for the actual class. - * @draft ICU 2.2 + * ICU "poor man's RTTI", returns a UClassID for this class. + * @returns a UClassID for this class. + * @stable ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const; + static UClassID U_EXPORT2 getStaticClassID(); /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * @returns a UClassID for this class. - * @draft ICU 2.2 + * ICU "poor man's RTTI", returns a UClassID for the actual class. + * @return a UClassID for the actual class. + * @stable ICU 2.2 */ - static inline UClassID getStaticClassID(); + virtual UClassID getDynamicClassID() const; private: //------------------------------------------------------------------------- @@ -739,32 +739,19 @@ private: UnicodeString buffer; int32_t bufferPos; - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; //------------------------------------------------------------------------- // Inline implementations //------------------------------------------------------------------------- -inline UClassID -Normalizer::getStaticClassID() -{ return (UClassID)&fgClassID; } - -inline UClassID -Normalizer::getDynamicClassID() const -{ return Normalizer::getStaticClassID(); } - inline UBool Normalizer::operator!= (const Normalizer& other) const { return ! operator==(other); } inline UNormalizationCheckResult Normalizer::quickCheck(const UnicodeString& source, - UNormalizationMode mode, + UNormalizationMode mode, UErrorCode &status) { if(U_FAILURE(status)) { return UNORM_MAYBE; @@ -788,7 +775,7 @@ Normalizer::quickCheck(const UnicodeString& source, inline UBool Normalizer::isNormalized(const UnicodeString& source, - UNormalizationMode mode, + UNormalizationMode mode, UErrorCode &status) { if(U_FAILURE(status)) { return FALSE; diff --git a/icuSources/common/unicode/parseerr.h b/icuSources/common/unicode/parseerr.h index 2026fa6d..d1ba3948 100644 --- a/icuSources/common/unicode/parseerr.h +++ b/icuSources/common/unicode/parseerr.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2000, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -27,62 +27,58 @@ enum { U_PARSE_CONTEXT_LEN = 16 }; * enough that more information than a UErrorCode is needed to * localize the error. * - *

The code field is an integer error code specific to each parsing - * engine, but globally unique. See the engine header file for - * possible values. The line, offset, and context fields are - * optional; parsing engines may choose not to use to use them. + *

The line, offset, and context fields are optional; parsing + * engines may choose not to use to use them. + * + *

The preContext and postContext strings include some part of the + * context surrounding the error. If the source text is "let for=7" + * and "for" is the error (e.g., because it is a reserved word), then + * some examples of what a parser might produce are the following: + * + *

+ * preContext   postContext
+ * ""           ""            The parser does not support context
+ * "let "       "=7"          Pre- and post-context only
+ * "let "       "for=7"       Pre- and post-context and error text
+ * ""           "for"         Error text only
+ * 
* *

Examples of engines which use UParseError (or may use it in the - * future) are RuleBasedTransliterator and RuleBasedBreakIterator. + * future) are Transliterator, RuleBasedBreakIterator, and + * RegexPattern. * * @stable ICU 2.0 */ typedef struct UParseError { /** - * An integer indicating the type of error. If no error was - * encountered, the parse engine sets this to zero, and the - * other fields' values should be ignored. - * - *

Each parse engine should use a range of codes from - * 0xNNNN0001 to 0xNNNNFFFF, where NNNN is a 16-bit integer - * between 0x0001 and 0xFFFF unique to each parse engine. - * Parse engines should define the enum PARSE_ERROR_BASE - * to be 0xNNNN0000. - */ - /*int32_t code; */ - - /** - * The line on which the error occured. If the parse engine - * is not using this field, it should set it to zero. Otherwise - * it should be a positive integer. The default value of this field - * is -1. It will be set to 0 if the code populating this struct is not - * using line numbers. - * @stable ICU 2.0 + * The line on which the error occured. If the parser uses this + * field, it sets it to the line number of the source text line on + * which the error appears, which will be be a value >= 1. If the + * parse does not support line numbers, the value will be <= 0. + * @stable ICU 2.0 */ int32_t line; /** - * The character offset to the error. If the line field is - * being used, then this offset is from the start of the line. - * If the line field is not being used, then this offset is from - * the start of the text.The default value of this field - * is -1. It will be set to appropriate value by the code that - * populating the struct. - * @stable ICU 2.0 + * The character offset to the error. If the line field is >= 1, + * then this is the offset from the start of the line. Otherwise, + * this is the offset from the start of the text. If the parser + * does not support this field, it will have a value < 0. + * @stable ICU 2.0 */ - int32_t offset; + int32_t offset; /** - * Textual context before the error. Null-terminated. - * May be the empty string if not implemented by parser. + * Textual context before the error. Null-terminated. The empty + * string if not supported by parser. * @stable ICU 2.0 */ UChar preContext[U_PARSE_CONTEXT_LEN]; /** - * Textual context after the error. Null-terminated. - * May be the empty string if not implemented by parser. + * The error itself and/or textual context after the error. + * Null-terminated. The empty string if not supported by parser. * @stable ICU 2.0 */ UChar postContext[U_PARSE_CONTEXT_LEN]; diff --git a/icuSources/common/unicode/parsepos.h b/icuSources/common/unicode/parsepos.h index e741abab..0a46ea52 100644 --- a/icuSources/common/unicode/parsepos.h +++ b/icuSources/common/unicode/parsepos.h @@ -1,5 +1,5 @@ /* -* Copyright (C) {1997-2003}, International Business Machines Corporation and others. All Rights Reserved. +* Copyright (C) 1997-2004, International Business Machines Corporation and others. All Rights Reserved. ******************************************************************************* * * File PARSEPOS.H @@ -46,8 +46,10 @@ public: * @stable ICU 2.0 */ ParsePosition() - : UObject() - { this->index = 0; this->errorIndex = -1; } + : UObject(), + index(0), + errorIndex(-1) + {} /** * Create a new ParsePosition with the given initial index. @@ -55,8 +57,10 @@ public: * @stable ICU 2.0 */ ParsePosition(int32_t newIndex) - : UObject() - { this->index = newIndex; this->errorIndex = -1; } + : UObject(), + index(newIndex), + errorIndex(-1) + {} /** * Copy constructor @@ -64,14 +68,16 @@ public: * @stable ICU 2.0 */ ParsePosition(const ParsePosition& copy) - : UObject(copy) - { this->index = copy.index; this->errorIndex = copy.errorIndex; } + : UObject(copy), + index(copy.index), + errorIndex(copy.errorIndex) + {} /** * Destructor * @stable ICU 2.0 */ - ~ParsePosition() {} + virtual ~ParsePosition(); /** * Assignment operator @@ -93,6 +99,19 @@ public: */ UBool operator!=(const ParsePosition& that) const; + /** + * Clone this object. + * Clones can be used concurrently in multiple threads. + * If an error occurs, then NULL is returned. + * The caller must delete the clone. + * + * @return a clone of this object + * + * @see getDynamicClassID + * @draft ICU 2.8 + */ + ParsePosition *clone() const; + /** * Retrieve the current parse position. On input to a parse method, this * is the index of the character at which parsing will begin; on output, it @@ -126,18 +145,18 @@ public: int32_t getErrorIndex(void) const; /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. + * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const; + static UClassID U_EXPORT2 getStaticClassID(); /** - * ICU "poor man's RTTI", returns a UClassID for this class. + * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ - static inline UClassID getStaticClassID(); + virtual UClassID getDynamicClassID() const; private: /** @@ -153,21 +172,8 @@ private: */ int32_t errorIndex; - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; -inline UClassID -ParsePosition::getStaticClassID() -{ return (UClassID)&fgClassID; } - -inline UClassID -ParsePosition::getDynamicClassID() const -{ return ParsePosition::getStaticClassID(); } - inline ParsePosition& ParsePosition::operator=(const ParsePosition& copy) { diff --git a/icuSources/common/unicode/platform.h.in b/icuSources/common/unicode/platform.h.in index 1b43d655..e1dcfdc1 100644 --- a/icuSources/common/unicode/platform.h.in +++ b/icuSources/common/unicode/platform.h.in @@ -1,10 +1,10 @@ /* -******************************************************************************* +****************************************************************************** * -* Copyright (C) 1997-2003, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. * -******************************************************************************* +****************************************************************************** * * FILE NAME : platform.h * @@ -13,7 +13,7 @@ * 03/02/99 stephen Added AS400 support. * 03/30/99 stephen Added Linux support. * 04/13/99 stephen Reworked for autoconf. -******************************************************************************* +****************************************************************************** */ /* Define the platform we're on. */ @@ -77,54 +77,12 @@ #define U_HAVE_UINT64_T @HAVE_UINT64_T@ #endif - -/* Define whether namespace is supported */ -#ifndef U_HAVE_NAMESPACE -#define U_HAVE_NAMESPACE @U_HAVE_NAMESPACE@ -#endif - -/* Determines the endianness of the platform */ -#define U_IS_BIG_ENDIAN @U_IS_BIG_ENDIAN@ - -/* 1 or 0 to enable or disable threads. If undefined, default is: enable threads. */ -#define ICU_USE_THREADS @ICU_USE_THREADS@ - -/* Determine whether to disable renaming or not. This overrides the - setting in umachine.h which is for all platforms. */ -#ifndef U_DISABLE_RENAMING -#define U_DISABLE_RENAMING @U_DISABLE_RENAMING@ -#endif - -/* Determine whether to override new and delete. */ -#ifndef U_OVERRIDE_CXX_ALLOCATION -#define U_OVERRIDE_CXX_ALLOCATION @U_OVERRIDE_CXX_ALLOCATION@ -#endif -/* Determine whether to override placement new and delete for STL. */ -#ifndef U_HAVE_PLACEMENT_NEW -#define U_HAVE_PLACEMENT_NEW @U_HAVE_PLACEMENT_NEW@ -#endif - -/* Define the library suffix in a C syntax. */ -#define U_HAVE_LIB_SUFFIX @U_HAVE_LIB_SUFFIX@ -#define U_LIB_SUFFIX_C_NAME @ICULIBSUFFIXCNAME@ -#define U_LIB_SUFFIX_C_NAME_STRING "@ICULIBSUFFIXCNAME@" - -/*===========================================================================*/ -/* Platform/Language determination */ -/*===========================================================================*/ - -#ifdef macintosh -#ifdef XP_MAC -#undef XP_MAC -#endif -#define XP_MAC 1 -#include -#endif - /*===========================================================================*/ /* Generic data types */ /*===========================================================================*/ +#include + /* If your platform does not have the header, you may need to edit the typedefs below. */ #if U_HAVE_INTTYPES_H @@ -149,12 +107,6 @@ typedef unsigned char uint8_t; #else /* U_HAVE_INTTYPES_H */ -#include -#if STDC_HEADERS -#include -#include -#endif /* STDC_HEADERS */ - #if ! U_HAVE_INT8_T typedef signed char int8_t; #endif @@ -172,19 +124,11 @@ typedef unsigned short uint16_t; #endif #if ! U_HAVE_INT32_T -# if defined(_LP64) - typedef signed int int32_t; -# else - typedef signed long int32_t; -# endif +typedef signed int int32_t; #endif #if ! U_HAVE_UINT32_T -# if defined(_LP64) - typedef unsigned int uint32_t; -# else - typedef unsigned long uint32_t; -# endif +typedef unsigned int uint32_t; #endif #if ! U_HAVE_INT64_T @@ -199,11 +143,65 @@ typedef unsigned short uint16_t; #endif +/*===========================================================================*/ +/* Compiler and environment features */ +/*===========================================================================*/ + +/* Define whether namespace is supported */ +#ifndef U_HAVE_NAMESPACE +#define U_HAVE_NAMESPACE @U_HAVE_NAMESPACE@ +#endif + +/* Determines the endianness of the platform + It's done this way in case multiple architectures are being built at once. + For example, Darwin supports fat binaries, which can be both PPC and x86 based. */ +#if defined(BYTE_ORDER) && defined(BIG_ENDIAN) +#define U_IS_BIG_ENDIAN (BYTE_ORDER == BIG_ENDIAN) +#else +#define U_IS_BIG_ENDIAN @U_IS_BIG_ENDIAN@ +#endif + +/* 1 or 0 to enable or disable threads. If undefined, default is: enable threads. */ +#define ICU_USE_THREADS @ICU_USE_THREADS@ + +#ifndef U_DEBUG +#define U_DEBUG @ENABLE_DEBUG@ +#endif + +#ifndef U_RELEASE +#define U_RELEASE @ENABLE_RELEASE@ +#endif + +/* Determine whether to disable renaming or not. This overrides the + setting in umachine.h which is for all platforms. */ +#ifndef U_DISABLE_RENAMING +#define U_DISABLE_RENAMING @U_DISABLE_RENAMING@ +#endif + +/* Determine whether to override new and delete. */ +#ifndef U_OVERRIDE_CXX_ALLOCATION +#define U_OVERRIDE_CXX_ALLOCATION @U_OVERRIDE_CXX_ALLOCATION@ +#endif +/* Determine whether to override placement new and delete for STL. */ +#ifndef U_HAVE_PLACEMENT_NEW +#define U_HAVE_PLACEMENT_NEW @U_HAVE_PLACEMENT_NEW@ +#endif + +/* Determine whether to enable tracing. */ +#ifndef U_ENABLE_TRACING +#define U_ENABLE_TRACING @U_ENABLE_TRACING@ +#endif + +/* Define the library suffix in a C syntax. */ +#define U_HAVE_LIB_SUFFIX @U_HAVE_LIB_SUFFIX@ +#define U_LIB_SUFFIX_C_NAME @ICULIBSUFFIXCNAME@ +#define U_LIB_SUFFIX_C_NAME_STRING "@ICULIBSUFFIXCNAME@" + /*===========================================================================*/ /* Character data types */ /*===========================================================================*/ -#ifdef OS390 +#if defined(OS390) || defined(OS400) # define U_CHARSET_FAMILY 1 #endif @@ -224,12 +222,15 @@ typedef unsigned short uint16_t; #define U_HAVE_NL_LANGINFO_CODESET @U_HAVE_NL_LANGINFO_CODESET@ #define U_NL_LANGINFO_CODESET @U_NL_LANGINFO_CODESET@ +#if @U_HAVE_TZSET@ #define U_TZSET @U_TZSET@ -#define U_HAVE_TIMEZONE @U_HAVE_TIMEZONE@ -#if U_HAVE_TIMEZONE -# define U_TIMEZONE @U_TIMEZONE@ #endif +#if @U_HAVE_TIMEZONE@ +#define U_TIMEZONE @U_TIMEZONE@ +#endif +#if @U_HAVE_TZNAME@ #define U_TZNAME @U_TZNAME@ +#endif #define U_HAVE_MMAP @HAVE_MMAP@ #define U_HAVE_POPEN @U_HAVE_POPEN@ @@ -264,4 +265,3 @@ typedef unsigned short uint16_t; /*===========================================================================*/ #define U_MAKE "@U_MAKE@" - diff --git a/icuSources/common/unicode/pmacos.h b/icuSources/common/unicode/pmacos.h deleted file mode 100644 index 36a7ade0..00000000 --- a/icuSources/common/unicode/pmacos.h +++ /dev/null @@ -1,140 +0,0 @@ -/* -****************************************************************************** -* -* Copyright (C) 1997-2001, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* -* FILE NAME : pmacos.h -* -* Date Name Description -* 05/13/98 nos Creation (content moved here from ptypes.h). -* 03/02/99 stephen Added AS400 support. -* 03/30/99 stephen Added Linux support. -* 04/13/99 stephen Reworked for autoconf. -* 08/26/00 srl Moved to pmacos.h -****************************************************************************** -*/ - -/* Define the platform we're on. */ -#ifndef macintosh -#define macintosh -#endif - -#ifndef XP_MAC -#define XP_MAC -#endif - -/* We want the console window (argc/argv) */ -/* -#ifndef XP_MAC_CONSOLE -#define XP_MAC_CONSOLE -#endif -*/ - -/* Define whether inttypes.h is available */ -#define U_HAVE_INTTYPES_H 0 - -/* Define whether namespace is supported */ -#define U_HAVE_NAMESPACE 1 - -/* - * Define what support for C++ streams is available. - * If U_IOSTREAM_SOURCE is set to 199711, then is available - * (1997711 is the date the ISO/IEC C++ FDIS was published), and then - * one should qualify streams using the std namespace in ICU header - * files. - * If U_IOSTREAM_SOURCE is set to 198506, then is - * available instead (198506 is the date when Stroustrup published - * "An Extensible I/O Facility for C++" at the summer USENIX conference). - * If U_IOSTREAM_SOURCE is 0, then C++ streams are not available and - * support for them will be silently suppressed in ICU. - * - */ - -#ifndef U_IOSTREAM_SOURCE -#define U_IOSTREAM_SOURCE 198506 /* Wish we could use 199711 but that breaks while compiling chariter.cpp */ -#endif - -/* Determines whether specific types are available */ -#define HAVE_INT8_T 0 -#define HAVE_UINT8_T 0 -#define HAVE_INT16_T 0 -#define HAVE_UINT16_T 0 -#define HAVE_INT32_T 0 -#define HAVE_UINT32_T 0 -#define HAVE_BOOL_T 0 - -/* Determines the endianness of the platform */ -#define U_IS_BIG_ENDIAN 1 - -/*===========================================================================*/ -/* Generic data types */ -/*===========================================================================*/ - -/* If your platform does not have the header, you may - need to edit the typedefs below. */ -#if U_HAVE_INTTYPES_H -#include -#else - -#if ! HAVE_INT8_T -typedef signed char int8_t; -#endif - -#if ! HAVE_UINT8_T -typedef unsigned char uint8_t; -#endif - -#if ! HAVE_INT16_T -typedef signed short int16_t; -#endif - -#if ! HAVE_UINT16_T -typedef unsigned short uint16_t; -#endif - -#if ! HAVE_INT32_T -# if defined(_LP64) - typedef signed int int32_t; -# else - typedef signed long int32_t; -# endif -#endif - -#if ! HAVE_UINT32_T -# if defined(_LP64) - typedef unsigned int uint32_t; -# else - typedef unsigned long uint32_t; -# endif -#endif - -#endif - -/*===========================================================================*/ -/* Character data types */ -/*===========================================================================*/ - -#define U_HAVE_WCHAR_H 0 -#define U_SIZEOF_WCHAR_T 2 - -#define U_HAVE_WCSCPY 0 - -/*===========================================================================*/ -/* Symbol import-export control */ -/*===========================================================================*/ - -/* should be pragmas? */ - -#define U_EXPORT /*__declspec(dllexport)*/ -#define U_EXPORT2 -#define U_IMPORT /*__declspec(dllimport)*/ - -/*===========================================================================*/ -/* Programs used by ICU code */ -/*===========================================================================*/ - -#define U_MAKE "Make" - diff --git a/icuSources/common/unicode/pos400.h b/icuSources/common/unicode/pos400.h deleted file mode 100644 index 5f61af79..00000000 --- a/icuSources/common/unicode/pos400.h +++ /dev/null @@ -1,172 +0,0 @@ -/* -******************************************************************************* -* -* Copyright (C) 1997-2001, International Business Machines -* Corporation and others. All Rights Reserved. -* -******************************************************************************* -* -* FILE NAME : pos400.h -* -* Date Name Description -* 05/13/98 nos Creation (content moved here from ptypes.h). -* 03/02/99 stephen Added AS400 support. -* 03/30/99 stephen Added Linux support. -* 04/13/99 stephen Reworked for autoconf. -* 09/21/99 barry Created new for OS/400 platform. -******************************************************************************* -*/ - -/* Define the platform we're on. */ -#ifndef OS400 -#define OS400 -#endif - -/* Define whether inttypes.h is available */ -#define U_HAVE_INTTYPES_H 0 - -/* - * Define what support for C++ streams is available. - * If U_IOSTREAM_SOURCE is set to 199711, then is available - * (1997711 is the date the ISO/IEC C++ FDIS was published), and then - * one should qualify streams using the std namespace in ICU header - * files. - * If U_IOSTREAM_SOURCE is set to 198506, then is - * available instead (198506 is the date when Stroustrup published - * "An Extensible I/O Facility for C++" at the summer USENIX conference). - * If U_IOSTREAM_SOURCE is 0, then C++ streams are not available and - * support for them will be silently suppressed in ICU. - * - */ - -#ifndef U_IOSTREAM_SOURCE -#define U_IOSTREAM_SOURCE 198506 -#endif - -/* Determines whether specific types are available */ -#define U_HAVE_INT8_T 0 -#define U_HAVE_UINT8_T 0 -#define U_HAVE_INT16_T 0 -#define U_HAVE_UINT16_T 0 -#define U_HAVE_INT32_T 0 -#define U_HAVE_UINT32_T 0 -#define U_HAVE_INT64_T 0 -#define U_HAVE_UINT64_T 0 - -/* Define whether namespace is supported */ -#define U_HAVE_NAMESPACE 0 - -/* Determines the endianness of the platform */ -#define U_IS_BIG_ENDIAN 1 - -/* 1 or 0 to enable or disable threads. If undefined, default is: enable threads. */ -#define ICU_USE_THREADS 1 - -/* Determine whether to disable renaming or not. This overrides the - setting in umachine.h which is for all platforms. */ -#ifndef U_OVERRIDE_CXX_ALLOCATION -#define U_OVERRIDE_CXX_ALLOCATION 1 -#endif - -/*===========================================================================*/ -/* Generic data types */ -/*===========================================================================*/ - -/* If your platform does not have the header, you may - need to edit the typedefs below. */ -#if U_HAVE_INTTYPES_H -#include -#else - -#if ! U_HAVE_INT8_T -typedef signed char int8_t; -#endif - -#if ! U_HAVE_UINT8_T -typedef unsigned char uint8_t; -#endif - -#if ! U_HAVE_INT16_T -typedef signed short int16_t; -#endif - -#if ! U_HAVE_UINT16_T -typedef unsigned short uint16_t; -#endif - -#if ! U_HAVE_INT32_T -typedef signed long int32_t; -#endif - -#if ! U_HAVE_UINT32_T -typedef unsigned long uint32_t; -#endif - -#if ! U_HAVE_INT64_T -typedef signed long long int64_t; -#endif - -#if ! U_HAVE_UINT64_T -typedef unsigned long long uint64_t; -#endif - -#endif - -/*===========================================================================*/ -/* Character data types */ -/*===========================================================================*/ - -#define U_CHARSET_FAMILY 1 - -/*===========================================================================*/ -/* Information about wchar support */ -/*===========================================================================*/ - -#define U_HAVE_WCHAR_H 1 -#define U_SIZEOF_WCHAR_T 2 - -#define U_HAVE_WCSCPY 1 - -/*===========================================================================*/ -/* Information about POSIX support */ -/*===========================================================================*/ - -#define U_HAVE_NL_LANGINFO 0 -#define U_HAVE_NL_LANGINFO_CODESET 0 -#define U_NL_LANGINFO_CODESET - -/* These cannot be defined for this platform -#define U_TZSET -#define U_HAVE_TIMEZONE 0 -#if U_HAVE_TIMEZONE -# define U_TIMEZONE -#endif -#define U_TZNAME -*/ - -#define U_HAVE_MMAP 1 - -/*===========================================================================*/ -/* Symbol import-export control */ -/*===========================================================================*/ - -#define U_EXPORT -#define U_EXPORT2 -#define U_IMPORT - -/*===========================================================================*/ -/* Code alignment and C function inlining */ -/*===========================================================================*/ - -#ifndef U_INLINE -#define U_INLINE -#endif - -#define U_ALIGN_CODE(n) - -/*===========================================================================*/ -/* Programs used by ICU code */ -/*===========================================================================*/ - -#define U_MAKE "gmake" - diff --git a/icuSources/common/unicode/putil.h b/icuSources/common/unicode/putil.h index 60136f1d..685df530 100644 --- a/icuSources/common/unicode/putil.h +++ b/icuSources/common/unicode/putil.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1997-2003, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -42,207 +42,6 @@ * functions may have to be re-implemented. */ -/** - * Floating point utility to determine if a double is Not a Number (NaN). - * @internal - */ -U_CAPI UBool U_EXPORT2 uprv_isNaN(double d); -/** - * Floating point utility to determine if a double has an infinite value. - * @internal - */ -U_CAPI UBool U_EXPORT2 uprv_isInfinite(double d); -/** - * Floating point utility to determine if a double has a positive infinite value. - * @internal - */ -U_CAPI UBool U_EXPORT2 uprv_isPositiveInfinity(double d); -/** - * Floating point utility to determine if a double has a negative infinite value. - * @internal - */ -U_CAPI UBool U_EXPORT2 uprv_isNegativeInfinity(double d); -/** - * Floating point utility that returns a Not a Number (NaN) value. - * @internal - */ -U_CAPI double U_EXPORT2 uprv_getNaN(void); -/** - * Floating point utility that returns an infinite value. - * @internal - */ -U_CAPI double U_EXPORT2 uprv_getInfinity(void); - -/** - * Floating point utility to truncate a double. - * @internal - */ -U_CAPI double U_EXPORT2 uprv_trunc(double d); -/** - * Floating point utility to calculate the floor of a double. - * @internal - */ -U_CAPI double U_EXPORT2 uprv_floor(double d); -/** - * Floating point utility to calculate the ceiling of a double. - * @internal - */ -U_CAPI double U_EXPORT2 uprv_ceil(double d); -/** - * Floating point utility to calculate the absolute value of a double. - * @internal - */ -U_CAPI double U_EXPORT2 uprv_fabs(double d); -/** - * Floating point utility to calculate the fractional and integer parts of a double. - * @internal - */ -U_CAPI double U_EXPORT2 uprv_modf(double d, double* pinteger); -/** - * Floating point utility to calculate the remainder of a double divided by another double. - * @internal - */ -U_CAPI double U_EXPORT2 uprv_fmod(double d, double y); -/** - * Floating point utility to calculate d to the power of exponent (d^exponent). - * @internal - */ -U_CAPI double U_EXPORT2 uprv_pow(double d, double exponent); -/** - * Floating point utility to calculate 10 to the power of exponent (10^exponent). - * @internal - */ -U_CAPI double U_EXPORT2 uprv_pow10(int32_t exponent); -/** - * Floating point utility to calculate the maximum value of two doubles. - * @internal - */ -U_CAPI double U_EXPORT2 uprv_fmax(double d, double y); -/** - * Floating point utility to calculate the minimum value of two doubles. - * @internal - */ -U_CAPI double U_EXPORT2 uprv_fmin(double d, double y); -/** - * Private utility to calculate the maximum value of two integers. - * @internal - */ -U_CAPI int32_t U_EXPORT2 uprv_max(int32_t d, int32_t y); -/** - * Private utility to calculate the minimum value of two integers. - * @internal - */ -U_CAPI int32_t U_EXPORT2 uprv_min(int32_t d, int32_t y); - -#if U_IS_BIG_ENDIAN -# define uprv_isNegative(number) (*((signed char *)&(number))<0) -#else -# define uprv_isNegative(number) (*((signed char *)&(number)+sizeof(number)-1)<0) -#endif - -/** - * Return the largest positive number that can be represented by an integer - * type of arbitrary bit length. - * @internal - */ -U_CAPI double U_EXPORT2 uprv_maxMantissa(void); - -/** - * Return the floor of the log base 10 of a given double. - * This method compensates for inaccuracies which arise naturally when - * computing logs, and always gives the correct value. The parameter - * must be positive and finite. - * (Thanks to Alan Liu for supplying this function.) - * - * @param d the double value to apply the common log function for. - * @return the log of value d. - * @internal - */ -U_CAPI int16_t U_EXPORT2 uprv_log10(double d); - -/** - * Floating point utility to calculate the logarithm of a double. - * @internal - */ -U_CAPI double U_EXPORT2 uprv_log(double d); - -/** - * Does common notion of rounding e.g. uprv_floor(x + 0.5); - * @param x the double number - * @return the rounded double - * @internal - */ -U_CAPI double U_EXPORT2 uprv_round(double x); - -/** - * Returns the number of digits after the decimal point in a double number x. - * - * @param x the double number - * @return the number of digits after the decimal point in a double number x. - * @internal - */ -U_CAPI int32_t U_EXPORT2 uprv_digitsAfterDecimal(double x); - -/** - * Time zone utilities - * - * Wrappers for C runtime library functions relating to timezones. - * The t_tzset() function (similar to tzset) uses the current setting - * of the environment variable TZ to assign values to three global - * variables: daylight, timezone, and tzname. These variables have the - * following meanings, and are declared in <time.h>. - * - * daylight Nonzero if daylight-saving-time zone (DST) is specified - * in TZ; otherwise, 0. Default value is 1. - * timezone Difference in seconds between coordinated universal - * time and local time. E.g., -28,800 for PST (GMT-8hrs) - * tzname(0) Three-letter time-zone name derived from TZ environment - * variable. E.g., "PST". - * tzname(1) Three-letter DST zone name derived from TZ environment - * variable. E.g., "PDT". If DST zone is omitted from TZ, - * tzname(1) is an empty string. - * - * Notes: For example, to set the TZ environment variable to correspond - * to the current time zone in Germany, you can use one of the - * following statements: - * - * set TZ=GST1GDT - * set TZ=GST+1GDT - * - * If the TZ value is not set, t_tzset() attempts to use the time zone - * information specified by the operating system. Under Windows NT - * and Windows 95, this information is specified in the Control Panel’s - * Date/Time application. - * @internal - */ -U_CAPI void U_EXPORT2 uprv_tzset(void); - -/** - * Difference in seconds between coordinated universal - * time and local time. E.g., -28,800 for PST (GMT-8hrs) - * @return the difference in seconds between coordinated universal time and local time. - * @internal - */ -U_CAPI int32_t U_EXPORT2 uprv_timezone(void); - -/** - * tzname(0) Three-letter time-zone name derived from TZ environment - * variable. E.g., "PST". - * tzname(1) Three-letter DST zone name derived from TZ environment - * variable. E.g., "PDT". If DST zone is omitted from TZ, - * tzname(1) is an empty string. - * @internal - */ -U_CAPI char* U_EXPORT2 uprv_tzname(int n); - -/** - * Get UTC (GMT) time measured in seconds since 0:00 on 1/1/70. - * @return the UTC time measured in seconds - * @stable ICU 2.0 - * @internal - */ -U_CAPI int32_t U_EXPORT2 uprv_getUTCtime(void); - /** * Return the ICU data directory. * The data directory is where common format ICU data files (.dat files) @@ -263,7 +62,7 @@ U_CAPI int32_t U_EXPORT2 uprv_getUTCtime(void); * * @stable ICU 2.0 */ -U_CAPI const char* U_EXPORT2 u_getDataDirectory(void); +U_STABLE const char* U_EXPORT2 u_getDataDirectory(void); /** * Set the ICU data directory. @@ -284,7 +83,7 @@ U_CAPI const char* U_EXPORT2 u_getDataDirectory(void); * @see u_init * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 u_setDataDirectory(const char *directory); +U_STABLE void U_EXPORT2 u_setDataDirectory(const char *directory); /** * Please use ucnv_getDefaultName() instead. @@ -294,7 +93,7 @@ U_CAPI void U_EXPORT2 u_setDataDirectory(const char *directory); * @return the default codepage for this platform * @internal */ -U_CAPI const char* U_EXPORT2 uprv_getDefaultCodepage(void); +U_INTERNAL const char* U_EXPORT2 uprv_getDefaultCodepage(void); /** * Please use uloc_getDefault() instead. @@ -305,7 +104,7 @@ U_CAPI const char* U_EXPORT2 uprv_getDefaultCodepage(void); * @return the default locale ID string * @internal */ -U_CAPI const char* U_EXPORT2 uprv_getDefaultLocaleID(void); +U_INTERNAL const char* U_EXPORT2 uprv_getDefaultLocaleID(void); /** * Filesystem file and path separator characters. @@ -314,18 +113,24 @@ U_CAPI const char* U_EXPORT2 uprv_getDefaultLocaleID(void); */ #ifdef XP_MAC # define U_FILE_SEP_CHAR ':' +# define U_FILE_ALT_SEP_CHAR ':' # define U_PATH_SEP_CHAR ';' # define U_FILE_SEP_STRING ":" +# define U_FILE_ALT_SEP_STRING ":" # define U_PATH_SEP_STRING ";" #elif defined(WIN32) || defined(OS2) # define U_FILE_SEP_CHAR '\\' +# define U_FILE_ALT_SEP_CHAR '/' # define U_PATH_SEP_CHAR ';' # define U_FILE_SEP_STRING "\\" +# define U_FILE_ALT_SEP_STRING "/" # define U_PATH_SEP_STRING ";" #else # define U_FILE_SEP_CHAR '/' +# define U_FILE_ALT_SEP_CHAR '/' # define U_PATH_SEP_CHAR ':' # define U_FILE_SEP_STRING "/" +# define U_FILE_ALT_SEP_STRING "/" # define U_PATH_SEP_STRING ":" #endif @@ -335,7 +140,7 @@ U_CAPI const char* U_EXPORT2 uprv_getDefaultLocaleID(void); * that are encoded in the platform default encoding. * They are a small, constant subset of the encoding and include * just the latin letters, digits, and some punctuation. - * For details, see utypes.h . + * For details, see U_CHARSET_FAMILY. * * @param cs Input string, points to length * character bytes from a subset of the platform encoding. @@ -343,9 +148,11 @@ U_CAPI const char* U_EXPORT2 uprv_getDefaultLocaleID(void); * Unicode characters. * @param length The number of characters to convert; this may * include the terminating NUL. + * + * @see U_CHARSET_FAMILY * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 u_charsToUChars(const char *cs, UChar *us, int32_t length); /** @@ -354,7 +161,7 @@ u_charsToUChars(const char *cs, UChar *us, int32_t length); * that can be encoded in the platform default encoding. * They are a small, constant subset of the encoding and include * just the latin letters, digits, and some punctuation. - * For details, see utypes.h . + * For details, see U_CHARSET_FAMILY. * * @param us Input string, points to length * Unicode characters that can be encoded with the @@ -363,60 +170,11 @@ u_charsToUChars(const char *cs, UChar *us, int32_t length); * character bytes. * @param length The number of characters to convert; this may * include the terminating NUL. + * + * @see U_CHARSET_FAMILY * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 u_UCharsToChars(const UChar *us, char *cs, int32_t length); -/** - * \def U_UPPER_ORDINAL - * Get the ordinal number of an uppercase invariant character - * @stable ICU 2.4 - */ -#if U_CHARSET_FAMILY==U_ASCII_FAMILY -# define U_UPPER_ORDINAL(x) ((x)-'A') -#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY -# define U_UPPER_ORDINAL(x) (((x) < 'J') ? ((x)-'A') : \ - (((x) < 'S') ? ((x)-'J'+9) : \ - ((x)-'S'+18))) -#else -# error Unknown charset family! -#endif - -/** - * Maximum value of a (void*) - use to indicate the limit of an 'infinite' buffer. - * In fact, buffer sizes must not exceed 2GB so that the difference between - * the buffer limit and the buffer start can be expressed in an int32_t. - * - * The definition of U_MAX_PTR must fulfill the following conditions: - * - return the largest possible pointer greater than base - * - return a valid pointer according to the machine architecture (AS/400, 64-bit, etc.) - * - avoid wrapping around at high addresses - * - make sure that the returned pointer is not farther from base than 0x7fffffff - * - * @param base The beginning of a buffer to find the maximum offset from - * @internal - */ -#ifndef U_MAX_PTR -# ifdef OS390 -# define U_MAX_PTR(base) ((void *)0x7fffffff) -# elif defined(OS400) -/* - * With the provided macro we should never be out of range of a given segment - * (a traditional/typical segment that is). Our segments have 5 bytes for the id - * and 3 bytes for the offset. The key is that the casting takes care of only - * retrieving the offset portion minus x1000. Hence, the smallest offset seen in - * a program is x001000 and when casted to an int would be 0. That's why we can - * only add 0xffefff. Otherwise, we would exceed the segment. - * - * Currently, 16MB is the current addressing limitation on as/400. This macro - * may eventually be changed to use 2GB addressability for the newer version of - * as/400 machines. - */ -# define U_MAX_PTR(base) ((void *)(((char *)base)-((int32_t)(base))+((int32_t)0xffefff))) -# else -# define U_MAX_PTR(base) ((void *)(((char *)(base)+0x7fffffff) > (char *)(base) ? ((char *)(base)+0x7fffffff) : (char *)-1)) -# endif -#endif - #endif diff --git a/icuSources/common/unicode/pwin32.h b/icuSources/common/unicode/pwin32.h index 1f33a975..5d500326 100644 --- a/icuSources/common/unicode/pwin32.h +++ b/icuSources/common/unicode/pwin32.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1997-2003, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -21,8 +21,16 @@ #define WIN32 #endif +#if defined(__BORLANDC__) +#define U_HAVE_PLACEMENT_NEW 0 +#define U_HAVE_INTTYPES_H 1 +#define __STDC_CONSTANT_MACROS +#endif + /* Define whether inttypes.h is available */ +#ifndef U_HAVE_INTTYPES_H #define U_HAVE_INTTYPES_H 0 +#endif /* * Define what support for C++ streams is available. @@ -43,30 +51,42 @@ #endif /* Determines whether specific types are available */ -#define U_HAVE_INT8_T 0 -#define U_HAVE_UINT8_T 0 -#define U_HAVE_INT16_T 0 -#define U_HAVE_UINT16_T 0 -#define U_HAVE_INT32_T 0 -#define U_HAVE_UINT32_T 0 -#define U_HAVE_INT64_T 0 -#define U_HAVE_UINT64_T 0 +#ifndef U_HAVE_INT8_T +#define U_HAVE_INT8_T U_HAVE_INTTYPES_H +#endif -/* Define whether namespace is supported */ -#define U_HAVE_NAMESPACE 1 +#ifndef U_HAVE_UINT8_T +#define U_HAVE_UINT8_T U_HAVE_INTTYPES_H +#endif -/* Determines the endianness of the platform */ -#define U_IS_BIG_ENDIAN 0 +#ifndef U_HAVE_INT16_T +#define U_HAVE_INT16_T U_HAVE_INTTYPES_H +#endif -/* Determine whether to override new and delete. */ -#ifndef U_OVERRIDE_CXX_ALLOCATION -#define U_OVERRIDE_CXX_ALLOCATION 1 +#ifndef U_HAVE_UINT16_T +#define U_HAVE_UINT16_T U_HAVE_INTTYPES_H #endif -/* Determine whether to override placement new and delete for STL. */ -#ifndef U_HAVE_PLACEMENT_NEW -#define U_HAVE_PLACEMENT_NEW 1 + +#ifndef U_HAVE_INT32_T +#define U_HAVE_INT32_T U_HAVE_INTTYPES_H #endif +#ifndef U_HAVE_UINT32_T +#define U_HAVE_UINT32_T U_HAVE_INTTYPES_H +#endif + +#ifndef U_HAVE_INT64_T +#define U_HAVE_INT64_T U_HAVE_INTTYPES_H +#endif + +#ifndef U_HAVE_UINT64_T +#define U_HAVE_UINT64_T U_HAVE_INTTYPES_H +#endif + +/* Define 64 bit limits */ +#define INT64_C(x) ((int64_t)x) +#define UINT64_C(x) ((uint64_t)x) + /*===========================================================================*/ /* Generic data types */ /*===========================================================================*/ @@ -75,7 +95,7 @@ need to edit the typedefs below. */ #if U_HAVE_INTTYPES_H #include -#else +#else /* U_HAVE_INTTYPES_H */ #if ! U_HAVE_INT8_T typedef signed char int8_t; @@ -94,44 +114,98 @@ typedef unsigned short uint16_t; #endif #if ! U_HAVE_INT32_T -# if defined(_LP64) - typedef signed int int32_t; -# else - typedef signed long int32_t; -# endif +typedef signed int int32_t; #endif #if ! U_HAVE_UINT32_T -# if defined(_LP64) - typedef unsigned int uint32_t; -# else - typedef unsigned long uint32_t; -# endif +typedef unsigned int uint32_t; #endif #if ! U_HAVE_INT64_T - /* Could use _MSC_VER to detect Microsoft compiler. */ - typedef signed __int64 int64_t; +/* _MSC_VER is used to detect the Microsoft compiler. */ +#ifdef _MSC_VER + typedef signed __int64 int64_t; +#else + typedef signed long long int64_t; +#endif #endif #if ! U_HAVE_UINT64_T - /* Could use _MSC_VER to detect Microsoft compiler. */ - typedef unsigned __int64 uint64_t; +/* _MSC_VER is used to detect the Microsoft compiler. */ +#ifdef _MSC_VER + typedef unsigned __int64 uint64_t; +#else + typedef unsigned long long uint64_t; +#endif #endif - #endif /*===========================================================================*/ -/* Character data types */ +/* Compiler and environment features */ /*===========================================================================*/ -#define U_SIZEOF_WCHAR_T 2 +/* Define whether namespace is supported */ +#ifndef U_HAVE_NAMESPACE +#define U_HAVE_NAMESPACE 1 +#endif + +/* Determines the endianness of the platform */ +#define U_IS_BIG_ENDIAN 0 + +/* 1 or 0 to enable or disable threads. If undefined, default is: enable threads. */ +#define ICU_USE_THREADS 1 + +/* Windows currently only runs on x86 CPUs which currently all have strong memory models. */ +#define UMTX_STRONG_MEMORY_MODEL 1 + +#ifndef U_DEBUG +#ifdef _DEBUG +#define U_DEBUG 1 +#else +#define U_DEBUG 0 +#endif +#endif + +#ifndef U_RELEASE +#ifdef NDEBUG +#define U_RELEASE 1 +#else +#define U_RELEASE 0 +#endif +#endif +/* Determine whether to disable renaming or not. This overrides the + setting in umachine.h which is for all platforms. */ +#ifndef U_DISABLE_RENAMING +#define U_DISABLE_RENAMING 0 +#endif + +/* Determine whether to override new and delete. */ +#ifndef U_OVERRIDE_CXX_ALLOCATION +#define U_OVERRIDE_CXX_ALLOCATION 1 +#endif +/* Determine whether to override placement new and delete for STL. */ +#ifndef U_HAVE_PLACEMENT_NEW +#define U_HAVE_PLACEMENT_NEW 1 +#endif + +/* Determine whether to enable tracing. */ +#ifndef U_ENABLE_TRACING +#define U_ENABLE_TRACING 1 +#endif + +/* Define the library suffix in a C syntax. */ +#define U_HAVE_LIB_SUFFIX 0 +#define U_LIB_SUFFIX_C_NAME +#define U_LIB_SUFFIX_C_NAME_STRING "" /*===========================================================================*/ -/* Do we have wcscpy and other similar functions */ +/* Information about wchar support */ /*===========================================================================*/ -#define U_HAVE_WCSCPY 1 +#define U_HAVE_WCHAR_H 1 +#define U_SIZEOF_WCHAR_T 2 + +#define U_HAVE_WCSCPY 1 /*===========================================================================*/ /* Information about POSIX support */ @@ -144,13 +218,18 @@ typedef unsigned short uint16_t; #endif #define U_TZNAME _tzname -#define U_HAVE_MMAP 0 +#define U_HAVE_MMAP 0 +#define U_HAVE_POPEN 0 /*===========================================================================*/ /* Symbol import-export control */ /*===========================================================================*/ +#ifdef U_STATIC_IMPLEMENTATION +#define U_EXPORT +#else #define U_EXPORT __declspec(dllexport) +#endif #define U_EXPORT2 __cdecl #define U_IMPORT __declspec(dllimport) @@ -158,7 +237,9 @@ typedef unsigned short uint16_t; /* Code alignment and C function inlining */ /*===========================================================================*/ +#ifndef U_INLINE #define U_INLINE __inline +#endif #if defined(_MSC_VER) && defined(_M_IX86) #define U_ALIGN_CODE(val) __asm align val @@ -171,5 +252,7 @@ typedef unsigned short uint16_t; /* Programs used by ICU code */ /*===========================================================================*/ +#ifndef U_MAKE #define U_MAKE "nmake" - +#define U_MAKE_IS_NMAKE 1 +#endif diff --git a/icuSources/common/unicode/rbbi.h b/icuSources/common/unicode/rbbi.h index fdad980a..9af38301 100644 --- a/icuSources/common/unicode/rbbi.h +++ b/icuSources/common/unicode/rbbi.h @@ -1,6 +1,6 @@ /* *************************************************************************** -* Copyright (C) 1999-2003 International Business Machines Corporation * +* Copyright (C) 1999-2004 International Business Machines Corporation * * and others. All rights reserved. * *************************************************************************** @@ -26,10 +26,12 @@ struct UTrie; U_NAMESPACE_BEGIN +/** @internal */ struct RBBIDataHeader; class RuleBasedBreakIteratorTables; class BreakIterator; class RBBIDataWrapper; +struct RBBIStateTable; @@ -42,7 +44,7 @@ class RBBIDataWrapper; *

See the ICU User Guide for information on Break Iterator Rules.

* *

This class is not intended to be subclassed. (Class DictionaryBasedBreakIterator - * is a subclass, but that relationship is effectively internal to the ICU + * is a subclass, but that relationship is effectively internal to the ICU * implementation. The subclassing interface to RulesBasedBreakIterator is * not part of the ICU API, and may not remain stable.

* @@ -61,13 +63,11 @@ protected: * @internal */ RBBIDataWrapper *fData; - /** @internal */ - UTrie *fCharMappings; - /** Rule {tag} value for the most recent match. + /** Index of the Rule {tag} values for the most recent match. * @internal */ - int32_t fLastBreakTag; + int32_t fLastRuleStatusIndex; /** * Rule tag value valid flag. @@ -75,7 +75,7 @@ protected: * This flag lets us lazily compute the value if we are ever asked for it. * @internal */ - UBool fLastBreakTagValid; + UBool fLastStatusIndexValid; /** * Counter for the number of characters encountered with the "dictionary" @@ -93,26 +93,11 @@ protected: static UBool fTrace; - -private: - /** - * Class ID - */ - static const char fgClassID; - protected: //======================================================================= // constructors //======================================================================= - /** - * This constructor uses the udata interface to create a BreakIterator - * whose internal tables live in a memory-mapped file. "image" is a pointer - * to the beginning of that file. - * @internal - */ - RuleBasedBreakIterator(UDataMemory* image, UErrorCode &status); - /** * Constructor from a flattened set of RBBI data in malloced memory. * RulesBasedBreakIterators built from a custom set of rules @@ -134,7 +119,7 @@ public: /** Default constructor. Creates an empty shell of an iterator, with no * rules or text to iterate over. Object can subsequently be assigned to. - * @draft ICU 2.2 + * @stable ICU 2.2 */ RuleBasedBreakIterator(); @@ -152,11 +137,27 @@ public: * @param parseError In the event of a syntax error in the rules, provides the location * within the rules of the problem. * @param status Information on any errors encountered. - * @draft ICU 2.2 + * @stable ICU 2.2 */ RuleBasedBreakIterator( const UnicodeString &rules, UParseError &parseError, UErrorCode &status); + + + /** + * This constructor uses the udata interface to create a BreakIterator + * whose internal tables live in a memory-mapped file. "image" is an + * ICU UDataMemory handle for the pre-compiled break iterator tables. + * @param image handle to the memory image for the break iterator data. + * Ownership of the UDataMemory handle passes to the Break Iterator, + * which will be responsible for closing it when it is no longer needed. + * @param status Information on any errors encountered. + * @see udata_open + * @see #getBinaryRules + * @draft ICU 2.8 + */ + RuleBasedBreakIterator(UDataMemory* image, UErrorCode &status); + /** * Destructor * @stable ICU 2.0 @@ -176,7 +177,7 @@ public: * Equality operator. Returns TRUE if both BreakIterators are of the * same class, have the same behavior, and iterate over the same text. * @param that The BreakIterator to be compared for equality - * @Return TRUE if both BreakIterators are of the + * @return TRUE if both BreakIterators are of the * same class, have the same behavior, and iterate over the same text. * @stable ICU 2.0 */ @@ -195,10 +196,11 @@ public: * Returns a newly-constructed RuleBasedBreakIterator with the same * behavior, and iterating over the same text, as this one. * Differs from the copy constructor in that it is polymorphic, and - * will correctly clone (copy) a derived class. + * will correctly clone (copy) a derived class. * clone() is thread safe. Multiple threads may simultaeneously * clone the same source break iterator. - * @stable ICU 2.0 + * @return a newly-constructed RuleBasedBreakIterator + * @stable ICU 2.0 */ virtual BreakIterator* clone() const; @@ -328,27 +330,63 @@ public: /** * Return the status tag from the break rule that determined the most recently - * returned break position. The values appear in the rule source - * within brackets, {123}, for example. For rules that do not specify a - * status, a default value of 0 is returned. + * returned break position. For break rules that do not specify a + * status, a default value of 0 is returned. If more than one break rule + * would cause a boundary to be located at some position in the text, + * the numerically largest of the applicable status values is returned. *

- * Of the standard types of ICU break iterators, only the word break - * iterator provides status values. The values are defined in - * enum UWordBreak, and allow distinguishing between words + * Of the standard types of ICU break iterators, only word break and + * line break provide status values. The values are defined in + * the header file ubrk.h. For Word breaks, the status allows distinguishing between words * that contain alphabetic letters, "words" that appear to be numbers, * punctuation and spaces, words containing ideographic characters, and - * more. Call getRuleStatus after obtaining a boundary - * position from next(), previous(), or + * more. For Line Break, the status distinguishes between hard (mandatory) breaks + * and soft (potential) break positions. + *

+ * getRuleStatus() can be called after obtaining a boundary + * position from next(), previous(), or * any other break iterator functions that returns a boundary position. *

+ * When creating custom break rules, one is free to define whatever + * status values may be convenient for the application. + *

+ * Note: this function is not thread safe. It should not have been + * declared const, and the const remains only for compatibility + * reasons. (The function is logically const, but not bit-wise const). + *

* @return the status from the break rule that determined the most recently * returned break position. * * @see UWordBreak - * @draft ICU 2.2 + * @stable ICU 2.2 */ virtual int32_t getRuleStatus() const; + /** + * Get the status (tag) values from the break rule(s) that determined the most + * recently returned break position. + *

+ * The returned status value(s) are stored into an array provided by the caller. + * The values are stored in sorted (ascending) order. + * If the capacity of the output array is insufficient to hold the data, + * the output will be truncated to the available length, and a + * U_BUFFER_OVERFLOW_ERROR will be signaled. + * + * @param fillInVec an array to be filled in with the status values. + * @param capacity the length of the supplied vector. A length of zero causes + * the function to return the number of status values, in the + * normal way, without attemtping to store any values. + * @param status receives error codes. + * @return The number of rule status values from rules that determined + * the most recent boundary returned by the break iterator. + * In the event of a U_BUFFER_OVERFLOW_ERROR, the return value + * is the total number of status values that were available, + * not the reduced number that were actually returned. + * @see getRuleStatus + * @draft ICU 3.0 + */ + virtual int32_t getRuleStatusVec(int32_t *fillInVec, int32_t capacity, UErrorCode &status); + /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. * This method is to implement a simple version of RTTI, since not all @@ -360,7 +398,7 @@ public: * other classes have different class IDs. * @stable ICU 2.0 */ - inline virtual UClassID getDynamicClassID(void) const; + virtual UClassID getDynamicClassID(void) const; /** * Returns the class ID for this class. This is useful only for @@ -373,7 +411,7 @@ public: * @return The class ID for all objects of this class. * @stable ICU 2.0 */ - inline static UClassID getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(void); /* * Create a clone (copy) of this break iterator in memory provided @@ -411,7 +449,7 @@ public: * is much faster than building one from the source form of the * break rules. * - * The binary data is can only be used with the same version of ICU + * The binary data can only be used with the same version of ICU * and on the same platform type (processor endian-ness) * * @param length Returns the length of the binary data. (Out paramter.) @@ -473,26 +511,47 @@ protected: */ void init(); +private: + + /** + * This method backs the iterator back up to a "safe position" in the text. + * This is a position that we know, without any context, must be a break position. + * The various calling methods then iterate forward from this safe position to + * the appropriate position to return. (For more information, see the description + * of buildBackwardsStateTable() in RuleBasedBreakIterator.Builder.) + * @param statetable state table used of moving backwards + * @internal + */ + int32_t handlePrevious(const RBBIStateTable *statetable); + + /** + * This method is the actual implementation of the next() method. All iteration + * vectors through here. This method initializes the state machine to state 1 + * and advances through the text character by character until we reach the end + * of the text or the state machine transitions to state 0. We update our return + * value every time the state machine passes through a possible end state. + * @param statetable state table used of moving forwards + * @internal + */ + int32_t handleNext(const RBBIStateTable *statetable); + + /** + * @internal + */ + void makeRuleStatusValid(); + }; -//---------------------------------------------------------------------------------- +//------------------------------------------------------------------------------ // // Inline Functions Definitions ... // -//---------------------------------------------------------------------------------- +//------------------------------------------------------------------------------ inline UBool RuleBasedBreakIterator::operator!=(const BreakIterator& that) const { return !operator==(that); } -inline UClassID RuleBasedBreakIterator::getStaticClassID(void) { - return (UClassID)(&fgClassID); -} - -inline UClassID RuleBasedBreakIterator::getDynamicClassID(void) const { - return RuleBasedBreakIterator::getStaticClassID(); -} - U_NAMESPACE_END #endif /* #if !UCONFIG_NO_BREAK_ITERATION */ diff --git a/icuSources/common/unicode/rep.h b/icuSources/common/unicode/rep.h index 91ec30c2..efe3eadb 100644 --- a/icuSources/common/unicode/rep.h +++ b/icuSources/common/unicode/rep.h @@ -1,6 +1,6 @@ /* ************************************************************************** -* Copyright (C) 1999-2003, International Business Machines Corporation and +* Copyright (C) 1999-2004, International Business Machines Corporation and * others. All Rights Reserved. ************************************************************************** * Date Name Description @@ -14,7 +14,6 @@ #ifndef REP_H #define REP_H -#include "unicode/utypes.h" #include "unicode/uobject.h" U_NAMESPACE_BEGIN @@ -191,7 +190,7 @@ public: * @return a clone of this object * * @see getDynamicClassID - * @draft ICU 2.6 + * @stable ICU 2.6 */ virtual Replaceable *clone() const; @@ -199,7 +198,7 @@ protected: /** * Default constructor. - * @draft ICU 2.4 + * @stable ICU 2.4 */ Replaceable(); @@ -216,27 +215,23 @@ protected: /** * Virtual version of length(). - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual int32_t getLength() const = 0; /** * Virtual version of charAt(). - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UChar getCharAt(int32_t offset) const = 0; /** * Virtual version of char32At(). - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UChar32 getChar32At(int32_t offset) const = 0; }; -inline Replaceable::Replaceable() {} - -inline Replaceable::~Replaceable() {} - inline int32_t Replaceable::length() const { return getLength(); diff --git a/icuSources/common/unicode/resbund.h b/icuSources/common/unicode/resbund.h index c5fae7e3..3d566e8f 100644 --- a/icuSources/common/unicode/resbund.h +++ b/icuSources/common/unicode/resbund.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1996-2003, International Business Machines +* Copyright (C) 1996-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -45,7 +45,7 @@ #ifndef RESBUND_H #define RESBUND_H - + #include "unicode/utypes.h" #include "unicode/uobject.h" #include "unicode/ures.h" @@ -62,7 +62,7 @@ U_NAMESPACE_BEGIN *

* Resource bundles in ICU4C are currently defined using text files which conform to the following * BNF definition. - * More on resource bundle concepts and syntax can be found in the + * More on resource bundle concepts and syntax can be found in the * Users Guide. *

* @@ -145,13 +145,15 @@ public: ResourceBundle(const ResourceBundle &original); /** - * Constructor from a C UResourceBundle. + * Constructor from a C UResourceBundle. The resource bundle is + * copied and not adopted. ures_close will still need to be used on the + * original resource bundle. * * @param res A pointer to the C resource bundle. * @param status A UErrorCode value. * @stable ICU 2.0 */ - ResourceBundle(UResourceBundle *res, + ResourceBundle(UResourceBundle *res, UErrorCode &status); /** @@ -160,35 +162,51 @@ public: * @param other The resource bundle to copy. * @stable ICU 2.0 */ - ResourceBundle& + ResourceBundle& operator=(const ResourceBundle& other); - /** Destructor. + /** Destructor. * @stable ICU 2.0 */ - ~ResourceBundle(); + virtual ~ResourceBundle(); + + /** + * Clone this object. + * Clones can be used concurrently in multiple threads. + * If an error occurs, then NULL is returned. + * The caller must delete the clone. + * + * @return a clone of this object + * + * @see getDynamicClassID + * @draft ICU 2.8 + */ + ResourceBundle *clone() const; /** * Returns the size of a resource. Size for scalar types is always 1, and for vector/table types is * the number of child resources. + * @warning Integer array is treated as a scalar type. There are no + * APIs to access individual members of an integer array. It + * is always returned as a whole. * * @return number of resources in a given resource. * @stable ICU 2.0 */ - int32_t + int32_t getSize(void) const; /** * returns a string from a string resource type * * @param status fills in the outgoing error code - * could be U_MISSING_RESOURCE_ERROR if the key is not found - * could be a warning + * could be U_MISSING_RESOURCE_ERROR if the key is not found + * could be a warning * e.g.: U_USING_FALLBACK_WARNING,U_USING_DEFAULT_WARNING * @return a pointer to a zero-terminated UChar array which lives in a memory mapped/DLL file. * @stable ICU 2.0 */ - UnicodeString + UnicodeString getString(UErrorCode& status) const; /** @@ -197,8 +215,8 @@ public: * * @param len fills in the length of resulting byte chunk * @param status fills in the outgoing error code - * could be U_MISSING_RESOURCE_ERROR if the key is not found - * could be a warning + * could be U_MISSING_RESOURCE_ERROR if the key is not found + * could be a warning * e.g.: U_USING_FALLBACK_WARNING,U_USING_DEFAULT_WARNING * @return a pointer to a chunk of unsigned bytes which live in a memory mapped/DLL file. * @stable ICU 2.0 @@ -208,12 +226,12 @@ public: /** - * returns an integer vector from a resource. + * returns an integer vector from a resource. * * @param len fills in the length of resulting integer vector * @param status fills in the outgoing error code - * could be U_MISSING_RESOURCE_ERROR if the key is not found - * could be a warning + * could be U_MISSING_RESOURCE_ERROR if the key is not found + * could be a warning * e.g.: U_USING_FALLBACK_WARNING,U_USING_DEFAULT_WARNING * @return a pointer to a vector of integers that lives in a memory mapped/DLL file. * @stable ICU 2.0 @@ -222,31 +240,31 @@ public: getIntVector(int32_t& len, UErrorCode& status) const; /** - * returns an unsigned integer from a resource. + * returns an unsigned integer from a resource. * This integer is originally 28 bits. * * @param status fills in the outgoing error code - * could be U_MISSING_RESOURCE_ERROR if the key is not found - * could be a warning + * could be U_MISSING_RESOURCE_ERROR if the key is not found + * could be a warning * e.g.: U_USING_FALLBACK_WARNING,U_USING_DEFAULT_WARNING * @return an unsigned integer value * @stable ICU 2.0 */ - uint32_t + uint32_t getUInt(UErrorCode& status) const; /** - * returns a signed integer from a resource. + * returns a signed integer from a resource. * This integer is originally 28 bit and the sign gets propagated. * * @param status fills in the outgoing error code - * could be U_MISSING_RESOURCE_ERROR if the key is not found - * could be a warning + * could be U_MISSING_RESOURCE_ERROR if the key is not found + * could be a warning * e.g.: U_USING_FALLBACK_WARNING,U_USING_DEFAULT_WARNING * @return a signed integer value * @stable ICU 2.0 */ - int32_t + int32_t getInt(UErrorCode& status) const; /** @@ -255,7 +273,7 @@ public: * @return TRUE if there are more elements, FALSE if there is no more elements * @stable ICU 2.0 */ - UBool + UBool hasNext(void) const; /** @@ -263,18 +281,18 @@ public: * * @stable ICU 2.0 */ - void + void resetIterator(void); /** - * Returns the key associated with this resource. Not all the resources have a key - only + * Returns the key associated with this resource. Not all the resources have a key - only * those that are members of a table. * * @return a key associated to this resource, or NULL if it doesn't have a key * @stable ICU 2.0 */ const char* - getKey(void); + getKey(void) const; /** * Gets the locale ID of the resource bundle as a string. @@ -284,7 +302,7 @@ public: * @stable ICU 2.0 */ const char* - getName(void); + getName(void) const; /** @@ -293,53 +311,53 @@ public: * @return type of the given resource. * @stable ICU 2.0 */ - UResType - getType(void); + UResType + getType(void) const; /** - * Returns the next resource in a given resource or NULL if there are no more resources + * Returns the next resource in a given resource or NULL if there are no more resources * * @param status fills in the outgoing error code * @return ResourceBundle object. * @stable ICU 2.0 */ - ResourceBundle + ResourceBundle getNext(UErrorCode& status); /** - * Returns the next string in a resource or NULL if there are no more resources - * to iterate over. + * Returns the next string in a resource or NULL if there are no more resources + * to iterate over. * * @param status fills in the outgoing error code * @return an UnicodeString object. * @stable ICU 2.0 */ - UnicodeString + UnicodeString getNextString(UErrorCode& status); /** - * Returns the next string in a resource or NULL if there are no more resources - * to iterate over. + * Returns the next string in a resource or NULL if there are no more resources + * to iterate over. * * @param key fill in for key associated with this string * @param status fills in the outgoing error code * @return an UnicodeString object. * @stable ICU 2.0 */ - UnicodeString - getNextString(const char ** key, + UnicodeString + getNextString(const char ** key, UErrorCode& status); /** - * Returns the resource in a resource at the specified index. + * Returns the resource in a resource at the specified index. * * @param index an index to the wanted resource. * @param status fills in the outgoing error code * @return ResourceBundle object. If there is an error, resource is invalid. * @stable ICU 2.0 */ - ResourceBundle - get(int32_t index, + ResourceBundle + get(int32_t index, UErrorCode& status) const; /** @@ -350,36 +368,36 @@ public: * @return an UnicodeString object. If there is an error, string is bogus * @stable ICU 2.0 */ - UnicodeString - getStringEx(int32_t index, + UnicodeString + getStringEx(int32_t index, UErrorCode& status) const; /** * Returns a resource in a resource that has a given key. This procedure works only with table - * resources. + * resources. * * @param key a key associated with the wanted resource * @param status fills in the outgoing error code. * @return ResourceBundle object. If there is an error, resource is invalid. * @stable ICU 2.0 */ - ResourceBundle - get(const char* key, + ResourceBundle + get(const char* key, UErrorCode& status) const; /** * Returns a string in a resource that has a given key. This procedure works only with table - * resources. + * resources. * * @param key a key associated with the wanted string * @param status fills in the outgoing error code * @return an UnicodeString object. If there is an error, string is bogus * @stable ICU 2.0 */ - UnicodeString - getStringEx(const char* key, + UnicodeString + getStringEx(const char* key, UErrorCode& status) const; - + /** * Return the version number associated with this ResourceBundle as a string. Please * use getVersion, as this method is going to be deprecated. @@ -387,9 +405,9 @@ public: * @return A version number string as specified in the resource bundle or its parent. * The caller does not own this string. * @see getVersion - * @stable ICU 2.0 + * @deprecated ICU 2.8 Use getVersion instead. */ - const char* + const char* getVersionNumber(void) const; /** @@ -399,53 +417,58 @@ public: * as specified in the resource bundle or its parent. * @stable ICU 2.0 */ - void + void getVersion(UVersionInfo versionInfo) const; /** - * Return the Locale associated with this ResourceBundle. + * Return the Locale associated with this ResourceBundle. * * @return a Locale object - * @stable ICU 2.0 + * @deprecated ICU 2.8 Use getLocale(ULocDataLocaleType type, UErrorCode &status) overload instead. */ const Locale& getLocale(void) const; + /** + * Return the Locale associated with this ResourceBundle. + * @param type You can choose between requested, valid and actual + * locale. For description see the definition of + * ULocDataLocaleType in uloc.h + * @param status just for catching illegal arguments + * + * @return a Locale object + * @draft ICU 2.8 + */ + const Locale + getLocale(ULocDataLocaleType type, UErrorCode &status) const; + /** + * This API implements multilevel fallback + * @internal + */ + ResourceBundle + getWithFallback(const char* key, UErrorCode& status); /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const; + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ - static inline UClassID getStaticClassID(); + static UClassID U_EXPORT2 getStaticClassID(); private: ResourceBundle(); // default constructor not implemented - UResourceBundle *resource; + UResourceBundle *fResource; void constructForLocale(const UnicodeString& path, const Locale& locale, UErrorCode& error); - Locale *locName; + Locale *fLocale; - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; -inline UClassID -ResourceBundle::getStaticClassID() -{ return (UClassID)&fgClassID; } - -inline UClassID -ResourceBundle::getDynamicClassID() const -{ return ResourceBundle::getStaticClassID(); } - U_NAMESPACE_END #endif diff --git a/icuSources/common/unicode/schriter.h b/icuSources/common/unicode/schriter.h index e487512a..df8cd300 100644 --- a/icuSources/common/unicode/schriter.h +++ b/icuSources/common/unicode/schriter.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1998-2003, International Business Machines +* Copyright (C) 1998-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -50,9 +50,9 @@ public: * Create an iterator over the UnicodeString referred to by "textStr". * The iteration range is the whole string, and the starting * position is specified by "textPos". If "textPos" is outside the valid - * iteration range, the behavior of this object is undefined. - * @textStr The unicode string used to create an iterator - * @textPos The starting position of the iteration + * iteration range, the behavior of this object is undefined. + * @param textStr The unicode string used to create an iterator + * @param textPos The starting position of the iteration * @stable ICU 2.0 */ StringCharacterIterator(const UnicodeString& textStr, @@ -67,7 +67,7 @@ public: * "textBegin" and "textEnd" don't form a valid range on "text" (i.e., * textBegin >= textEnd or either is negative or greater than text.size()), * or "textPos" is outside the range defined by "textBegin" and "textEnd", - * the behavior of this iterator is undefined. + * the behavior of this iterator is undefined. * @param textStr The unicode string used to create the StringCharacterIterator * @param textBegin The begin position of the iteration range * @param textEnd The end position of the iteration range @@ -82,7 +82,7 @@ public: /** * Copy constructor. The new iterator iterates over the same range * of the same string as "that", and its initial position is the - * same as "that"'s current position. + * same as "that"'s current position. * The UnicodeString object in "that" is copied. * @param that The StringCharacterIterator to be copied * @stable ICU 2.0 @@ -90,7 +90,7 @@ public: StringCharacterIterator(const StringCharacterIterator& that); /** - * Destructor. + * Destructor. * @stable ICU 2.0 */ virtual ~StringCharacterIterator(); @@ -100,7 +100,7 @@ public: * range of the same string as "that", and refers to the same * character within that string as "that" does. * @param that The object to be copied. - * @return the newly created object. + * @return the newly created object. * @stable ICU 2.0 */ StringCharacterIterator& @@ -108,10 +108,10 @@ public: /** * Returns true if the iterators iterate over the same range of the - * same string and are pointing at the same character. + * same string and are pointing at the same character. * @param that The ForwardCharacterIterator to be compared for equality * @return true if the iterators iterate over the same range of the - * same string and are pointing at the same character. + * same string and are pointing at the same character. * @stable ICU 2.0 */ virtual UBool operator==(const ForwardCharacterIterator& that) const; @@ -119,12 +119,12 @@ public: /** * Returns a new StringCharacterIterator referring to the same * character in the same range of the same string as this one. The - * caller must delete the new iterator. - * @return the newly cloned object. + * caller must delete the new iterator. + * @return the newly cloned object. * @stable ICU 2.0 */ virtual CharacterIterator* clone(void) const; - + /** * Sets the iterator to iterate over the provided string. * @param newText The string to be iterated over @@ -136,24 +136,24 @@ public: * Copies the UnicodeString under iteration into the UnicodeString * referred to by "result". Even if this iterator iterates across * only a part of this string, the whole string is copied. - * @param result Receives a copy of the text under iteration. + * @param result Receives a copy of the text under iteration. * @stable ICU 2.0 */ virtual void getText(UnicodeString& result); /** - * Return a class ID for this object (not really public) + * Return a class ID for this object (not really public) * @return a class ID for this object. * @stable ICU 2.0 */ virtual UClassID getDynamicClassID(void) const; /** - * Return a class ID for this class (not really public) + * Return a class ID for this class (not really public) * @return a class ID for this class * @stable ICU 2.0 */ - static inline UClassID getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(void); protected: /** @@ -176,17 +176,7 @@ protected: */ UnicodeString text; -private: - static const char fgClassID; }; -inline UClassID -StringCharacterIterator::getStaticClassID(void) -{ return (UClassID)(&fgClassID); } - -inline UClassID -StringCharacterIterator::getDynamicClassID(void) const -{ return StringCharacterIterator::getStaticClassID(); } - U_NAMESPACE_END #endif diff --git a/icuSources/common/unicode/strenum.h b/icuSources/common/unicode/strenum.h index e060b451..4f6ce02d 100644 --- a/icuSources/common/unicode/strenum.h +++ b/icuSources/common/unicode/strenum.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2002, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -11,11 +11,10 @@ #define STRENUM_H #include "unicode/uobject.h" +#include "unicode/unistr.h" U_NAMESPACE_BEGIN -class UnicodeString; - /** * Base class for 'pure' C++ implementations of uenum api. Adds a * method that returns the next UnicodeString since in C++ this can @@ -43,120 +42,206 @@ class UnicodeString; * upon any subsequent call to the enumeration's destructor, next, * unext, snext, or reset.

* - * @draft ICU 2.4 + * ICU 2.8 adds some default implementations and helper functions + * for subclasses. + * + * @stable ICU 2.4 */ class U_COMMON_API StringEnumeration : public UObject { - public: - /** - * Destructor. - * @draft ICU 2.4 - */ - virtual ~StringEnumeration(); - - /** - *

Return the number of elements that the iterator traverses. If - * the iterator is out of sync with its service, status is set to - * U_ENUM_OUT_OF_SYNC_ERROR, and the return value is zero.

- * - *

The return value will not change except possibly as a result of - * a subsequent call to reset, or if the iterator becomes out of sync.

- * - *

This is a convenience function. It can end up being very - * expensive as all the items might have to be pre-fetched - * (depending on the storage format of the data being - * traversed).

- * - * @param status the error code. - * @return number of elements in the iterator. - * - * @draft ICU 2.4 */ - virtual int32_t count(UErrorCode& status) const = 0; - - /** - *

Returns the next element as a NUL-terminated char*. If there - * are no more elements, returns NULL. If the resultLength pointer - * is not NULL, the length of the string (not counting the - * terminating NUL) is returned at that address. If an error - * status is returned, the value at resultLength is undefined.

- * - *

The returned pointer is owned by this iterator and must not be - * deleted by the caller. The pointer is valid until the next call - * to next, unext, snext, reset, or the enumerator's destructor.

- * - *

If the iterator is out of sync with its service, status is set - * to U_ENUM_OUT_OF_SYNC_ERROR and NULL is returned.

- * - *

If the native service string is a UChar* string, it is - * converted to char* with the invariant converter. If the - * conversion fails (because a character cannot be converted) then - * status is set to U_INVARIANT_CONVERSION_ERROR and the return - * value is undefined (though not NULL).

- * - * @param status the error code. - * @param resultLength a pointer to receive the length, can be NULL. - * @return a pointer to the string, or NULL. - * - * @draft ICU 2.4 - */ - virtual const char* next(int32_t *resultLength, UErrorCode& status) = 0; - - /** - *

Returns the next element as a NUL-terminated UChar*. If there - * are no more elements, returns NULL. If the resultLength pointer - * is not NULL, the length of the string (not counting the - * terminating NUL) is returned at that address. If an error - * status is returned, the value at resultLength is undefined.

- * - *

The returned pointer is owned by this iterator and must not be - * deleted by the caller. The pointer is valid until the next call - * to next, unext, snext, reset, or the enumerator's destructor.

- * - *

If the iterator is out of sync with its service, status is set - * to U_ENUM_OUT_OF_SYNC_ERROR and NULL is returned.

- * - * @param status the error code. - * @param resultLength a ponter to receive the length, can be NULL. - * @return a pointer to the string, or NULL. - * - * @draft ICU 2.4 - */ - virtual const UChar* unext(int32_t *resultLength, UErrorCode& status) = 0; - - /** - *

Returns the next element a UnicodeString*. If there are no - * more elements, returns NULL.

- * - *

The returned pointer is owned by this iterator and must not be - * deleted by the caller. The pointer is valid until the next call - * to next, unext, snext, reset, or the enumerator's destructor.

- * - *

If the iterator is out of sync with its service, status is set - * to U_ENUM_OUT_OF_SYNC_ERROR and NULL is returned.

- * - * @param status the error code. - * @return a pointer to the string, or NULL. - * - * @draft ICU 2.4 - */ - virtual const UnicodeString* snext(UErrorCode& status) = 0; - - /** - *

Resets the iterator. This re-establishes sync with the - * service and rewinds the iterator to start at the first - * element.

- * - *

Previous pointers returned by next, unext, or snext become - * invalid, and the value returned by count might change.

- * - * @param status the error code. - * - * @draft ICU 2.4 - */ - virtual void reset(UErrorCode& status) = 0; -}; +public: + /** + * Destructor. + * @stable ICU 2.4 + */ + virtual ~StringEnumeration(); + + /** + * Clone this object, an instance of a subclass of StringEnumeration. + * Clones can be used concurrently in multiple threads. + * If a subclass does not implement clone(), or if an error occurs, + * then NULL is returned. + * The clone functions in all subclasses return a base class pointer + * because some compilers do not support covariant (same-as-this) + * return types; cast to the appropriate subclass if necessary. + * The caller must delete the clone. + * + * @return a clone of this object + * + * @see getDynamicClassID + * @draft ICU 2.8 + */ + virtual StringEnumeration *clone() const; + + /** + *

Return the number of elements that the iterator traverses. If + * the iterator is out of sync with its service, status is set to + * U_ENUM_OUT_OF_SYNC_ERROR, and the return value is zero.

+ * + *

The return value will not change except possibly as a result of + * a subsequent call to reset, or if the iterator becomes out of sync.

+ * + *

This is a convenience function. It can end up being very + * expensive as all the items might have to be pre-fetched + * (depending on the storage format of the data being + * traversed).

+ * + * @param status the error code. + * @return number of elements in the iterator. + * + * @stable ICU 2.4 */ + virtual int32_t count(UErrorCode& status) const = 0; + + /** + *

Returns the next element as a NUL-terminated char*. If there + * are no more elements, returns NULL. If the resultLength pointer + * is not NULL, the length of the string (not counting the + * terminating NUL) is returned at that address. If an error + * status is returned, the value at resultLength is undefined.

+ * + *

The returned pointer is owned by this iterator and must not be + * deleted by the caller. The pointer is valid until the next call + * to next, unext, snext, reset, or the enumerator's destructor.

+ * + *

If the iterator is out of sync with its service, status is set + * to U_ENUM_OUT_OF_SYNC_ERROR and NULL is returned.

+ * + *

If the native service string is a UChar* string, it is + * converted to char* with the invariant converter. If the + * conversion fails (because a character cannot be converted) then + * status is set to U_INVARIANT_CONVERSION_ERROR and the return + * value is undefined (though not NULL).

+ * + * Starting with ICU 2.8, the default implementation calls snext() + * and handles the conversion. + * + * @param status the error code. + * @param resultLength a pointer to receive the length, can be NULL. + * @return a pointer to the string, or NULL. + * + * @stable ICU 2.4 + */ + virtual const char* next(int32_t *resultLength, UErrorCode& status); + + /** + *

Returns the next element as a NUL-terminated UChar*. If there + * are no more elements, returns NULL. If the resultLength pointer + * is not NULL, the length of the string (not counting the + * terminating NUL) is returned at that address. If an error + * status is returned, the value at resultLength is undefined.

+ * + *

The returned pointer is owned by this iterator and must not be + * deleted by the caller. The pointer is valid until the next call + * to next, unext, snext, reset, or the enumerator's destructor.

+ * + *

If the iterator is out of sync with its service, status is set + * to U_ENUM_OUT_OF_SYNC_ERROR and NULL is returned.

+ * + * Starting with ICU 2.8, the default implementation calls snext() + * and handles the conversion. + * + * @param status the error code. + * @param resultLength a ponter to receive the length, can be NULL. + * @return a pointer to the string, or NULL. + * + * @stable ICU 2.4 + */ + virtual const UChar* unext(int32_t *resultLength, UErrorCode& status); -inline StringEnumeration::~StringEnumeration() { -} + /** + *

Returns the next element a UnicodeString*. If there are no + * more elements, returns NULL.

+ * + *

The returned pointer is owned by this iterator and must not be + * deleted by the caller. The pointer is valid until the next call + * to next, unext, snext, reset, or the enumerator's destructor.

+ * + *

If the iterator is out of sync with its service, status is set + * to U_ENUM_OUT_OF_SYNC_ERROR and NULL is returned.

+ * + * @param status the error code. + * @return a pointer to the string, or NULL. + * + * @stable ICU 2.4 + */ + virtual const UnicodeString* snext(UErrorCode& status) = 0; + + /** + *

Resets the iterator. This re-establishes sync with the + * service and rewinds the iterator to start at the first + * element.

+ * + *

Previous pointers returned by next, unext, or snext become + * invalid, and the value returned by count might change.

+ * + * @param status the error code. + * + * @stable ICU 2.4 + */ + virtual void reset(UErrorCode& status) = 0; + +protected: + /** + * UnicodeString field for use with default implementations and subclasses. + * @draft ICU 2.8 + */ + UnicodeString unistr; + /** + * char * default buffer for use with default implementations and subclasses. + * @draft ICU 2.8 + */ + char charsBuffer[32]; + /** + * char * buffer for use with default implementations and subclasses. + * Allocated in constructor and in ensureCharsCapacity(). + * @draft ICU 2.8 + */ + char *chars; + /** + * Capacity of chars, for use with default implementations and subclasses. + * @draft ICU 2.8 + */ + int32_t charsCapacity; + + /** + * Default constructor for use with default implementations and subclasses. + * @draft ICU 2.8 + */ + StringEnumeration(); + + /** + * Ensures that chars is at least as large as the requested capacity. + * For use with default implementations and subclasses. + * + * @param capacity Requested capacity. + * @param status ICU in/out error code. + * @draft ICU 2.8 + */ + void ensureCharsCapacity(int32_t capacity, UErrorCode &status); + + /** + * Converts s to Unicode and sets unistr to the result. + * For use with default implementations and subclasses, + * especially for implementations of snext() in terms of next(). + * This is provided with a helper function instead of a default implementation + * of snext() to avoid potential infinite loops between next() and snext(). + * + * For example: + * \code + * const UnicodeString* snext(UErrorCode& status) { + * int32_t resultLength=0; + * const char *s=next(&resultLength, status); + * return setChars(s, resultLength, status); + * } + * \endcode + * + * @param s String to be converted to Unicode. + * @param length Length of the string. + * @param status ICU in/out error code. + * @return A pointer to unistr. + * @draft ICU 2.8 + */ + UnicodeString *setChars(const char *s, int32_t length, UErrorCode &status); +}; U_NAMESPACE_END diff --git a/icuSources/common/unicode/symtable.h b/icuSources/common/unicode/symtable.h new file mode 100644 index 00000000..27094030 --- /dev/null +++ b/icuSources/common/unicode/symtable.h @@ -0,0 +1,106 @@ +/* +********************************************************************** +* Copyright (c) 2000-2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Date Name Description +* 02/04/00 aliu Creation. +********************************************************************** +*/ +#ifndef SYMTABLE_H +#define SYMTABLE_H + +#include "unicode/utypes.h" +#include "unicode/uobject.h" + +U_NAMESPACE_BEGIN + +class ParsePosition; +class UnicodeFunctor; +class UnicodeSet; +class UnicodeString; + +/** + * An interface that defines both lookup protocol and parsing of + * symbolic names. + * + *

A symbol table maintains two kinds of mappings. The first is + * between symbolic names and their values. For example, if the + * variable with the name "start" is set to the value "alpha" + * (perhaps, though not necessarily, through an expression such as + * "$start=alpha"), then the call lookup("start") will return the + * char[] array ['a', 'l', 'p', 'h', 'a']. + * + *

The second kind of mapping is between character values and + * UnicodeMatcher objects. This is used by RuleBasedTransliterator, + * which uses characters in the private use area to represent objects + * such as UnicodeSets. If U+E015 is mapped to the UnicodeSet [a-z], + * then lookupMatcher(0xE015) will return the UnicodeSet [a-z]. + * + *

Finally, a symbol table defines parsing behavior for symbolic + * names. All symbolic names start with the SYMBOL_REF character. + * When a parser encounters this character, it calls parseReference() + * with the position immediately following the SYMBOL_REF. The symbol + * table parses the name, if there is one, and returns it. + * + * @draft ICU 2.8 + */ +class U_COMMON_API SymbolTable /* not : public UObject because this is an interface/mixin class */ { +public: + + /** + * The character preceding a symbol reference name. + * @draft ICU 2.8 + */ + enum { SYMBOL_REF = 0x0024 /*$*/ }; + + /** + * Destructor. + * @draft ICU 2.8 + */ + virtual ~SymbolTable(); + + /** + * Lookup the characters associated with this string and return it. + * Return NULL if no such name exists. The resultant + * string may have length zero. + * @param s the symbolic name to lookup + * @return a string containing the name's value, or NULL if + * there is no mapping for s. + * @draft ICU 2.8 + */ + virtual const UnicodeString* lookup(const UnicodeString& s) const = 0; + + /** + * Lookup the UnicodeMatcher associated with the given character, and + * return it. Return NULL if not found. + * @param ch a 32-bit code point from 0 to 0x10FFFF inclusive. + * @return the UnicodeMatcher object represented by the given + * character, or NULL if there is no mapping for ch. + * @draft ICU 2.8 + */ + virtual const UnicodeFunctor* lookupMatcher(UChar32 ch) const = 0; + + /** + * Parse a symbol reference name from the given string, starting + * at the given position. If no valid symbol reference name is + * found, return the empty string and leave pos unchanged. That is, if the + * character at pos cannot start a name, or if pos is at or after + * text.length(), then return an empty string. This indicates an + * isolated SYMBOL_REF character. + * @param text the text to parse for the name + * @param pos on entry, the index of the first character to parse. + * This is the character following the SYMBOL_REF character. On + * exit, the index after the last parsed character. If the parse + * failed, pos is unchanged on exit. + * @param limit the index after the last character to be parsed. + * @return the parsed name, or an empty string if there is no + * valid symbolic name at the given position. + * @draft ICU 2.8 + */ + virtual UnicodeString parseReference(const UnicodeString& text, + ParsePosition& pos, int32_t limit) const = 0; +}; +U_NAMESPACE_END + +#endif diff --git a/icuSources/common/unicode/ubidi.h b/icuSources/common/unicode/ubidi.h index 7e29ff8e..a0528d21 100644 --- a/icuSources/common/unicode/ubidi.h +++ b/icuSources/common/unicode/ubidi.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1999-2001, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -36,14 +36,14 @@ /** *\file - * \brief C API: BIDI algorithm + * \brief C API: BIDI algorithm * *

BIDI algorithm for ICU

* * This is an implementation of the Unicode Bidirectional algorithm. * The algorithm is defined in the - * Unicode Technical Report 9, - * version 5, also described in The Unicode Standard, Version 3.0 .

+ * Unicode Standard Annex #9, + * version 13, also described in The Unicode Standard, Version 4.0 .

* * Note: Libraries that perform a bidirectional algorithm and * reorder strings accordingly are sometimes called "Storage Layout Engines". @@ -297,7 +297,7 @@ *\endcode * */ - + /*DOCXX_TAG*/ /*@{*/ @@ -316,7 +316,7 @@ * specifying the level of a character to override whatever the * BiDi implementation would resolve it to. *

  • paraLevel can be set to the - * pesudo-level values UBIDI_DEFAULT_LTR + * pseudo-level values UBIDI_DEFAULT_LTR * and UBIDI_DEFAULT_RTL.
  • * * @@ -362,22 +362,22 @@ typedef uint8_t UBiDiLevel; */ #define UBIDI_MAX_EXPLICIT_LEVEL 61 -/** Bit flag for level input. - * Overrides directional properties. +/** Bit flag for level input. + * Overrides directional properties. * @stable ICU 2.0 */ #define UBIDI_LEVEL_OVERRIDE 0x80 /** - * @memo UBiDiDirection values indicate the text direction. + * UBiDiDirection values indicate the text direction. * @stable ICU 2.0 */ enum UBiDiDirection { - /** @memo All left-to-right text. This is a 0 value. @stable ICU 2.0 */ + /** All left-to-right text. This is a 0 value. @stable ICU 2.0 */ UBIDI_LTR, - /** @memo All right-to-left text. This is a 1 value. @stable ICU 2.0 */ + /** All right-to-left text. This is a 1 value. @stable ICU 2.0 */ UBIDI_RTL, - /** @memo Mixed-directional text. @stable ICU 2.0 */ + /** Mixed-directional text. @stable ICU 2.0 */ UBIDI_MIXED }; @@ -413,7 +413,7 @@ typedef struct UBiDi UBiDi; * @return An empty UBiDi object. * @stable ICU 2.0 */ -U_CAPI UBiDi * U_EXPORT2 +U_STABLE UBiDi * U_EXPORT2 ubidi_open(void); /** @@ -451,7 +451,7 @@ ubidi_open(void); * @return An empty UBiDi object with preallocated memory. * @stable ICU 2.0 */ -U_CAPI UBiDi * U_EXPORT2 +U_STABLE UBiDi * U_EXPORT2 ubidi_openSized(int32_t maxLength, int32_t maxRunCount, UErrorCode *pErrorCode); /** @@ -459,8 +459,10 @@ ubidi_openSized(int32_t maxLength, int32_t maxRunCount, UErrorCode *pErrorCode); * associated with a UBiDi object.

    * * Important: - * If a UBiDi object is the child - * of another one (its parent), after calling + * A parent UBiDi object must not be destroyed or reused if + * it still has children. + * If a UBiDi object is the child + * of another one (its parent), after calling * ubidi_setLine(), then the child object must * be destroyed (closed) or reused (by calling * ubidi_setPara() or ubidi_setLine()) @@ -472,7 +474,7 @@ ubidi_openSized(int32_t maxLength, int32_t maxRunCount, UErrorCode *pErrorCode); * @see ubidi_setLine * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ubidi_close(UBiDi *pBiDi); /** @@ -484,13 +486,13 @@ ubidi_close(UBiDi *pBiDi); * in the Unicode Technical Report is to take text stored in logical * (keyboard, typing) order and to determine the reordering of it for visual * rendering. - * Some legacy codepages store text in visual order, and for operations + * Some legacy systems store text in visual order, and for operations * with standard, Unicode-based algorithms, the text needs to be transformed * to logical order. This is effectively the inverse algorithm of the * described BiDi algorithm. Note that there is no standard algorithm for * this "inverse BiDi" and that the current implementation provides only an * approximation of "inverse BiDi".

    - * + * *

    With isInverse set to TRUE, * this function changes the behavior of some of the subsequent functions * in a way that they can be used for the inverse BiDi algorithm. @@ -511,7 +513,7 @@ ubidi_close(UBiDi *pBiDi); * @see ubidi_writeReordered * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ubidi_setInverse(UBiDi *pBiDi, UBool isInverse); /** @@ -523,17 +525,17 @@ ubidi_setInverse(UBiDi *pBiDi, UBool isInverse); * @see ubidi_setInverse * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 ubidi_isInverse(UBiDi *pBiDi); /** * Perform the Unicode BiDi algorithm. It is defined in the - * Unicode Technical Report 9, - * version 5, - * also described in The Unicode Standard, Version 3.0 .

    + * Unicode Standard Anned #9, + * version 13, + * also described in The Unicode Standard, Version 4.0 .

    * * This function takes a single plain text paragraph with or without - * externally specified embedding levels from styled text + * externally specified embedding levels from styled text * and computes the left-right-directionality of each character.

    * * If the entire paragraph consists of text of only one direction, then @@ -597,7 +599,7 @@ ubidi_isInverse(UBiDi *pBiDi); * which must not indicate a failure before the function call. * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length, UBiDiLevel paraLevel, UBiDiLevel *embeddingLevels, UErrorCode *pErrorCode); @@ -609,7 +611,7 @@ ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length, * specified by referring to a UBiDi object representing * this information for a paragraph of text, and by specifying * a range of indexes in this paragraph.

    - * In the new line object, the indexes will range from 0 to limit-start.

    + * In the new line object, the indexes will range from 0 to limit-start-1.

    * * This is used after calling ubidi_setPara() * for a paragraph, and after line-breaking on that paragraph. @@ -645,7 +647,7 @@ ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length, * @see ubidi_setPara * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ubidi_setLine(const UBiDi *pParaBiDi, int32_t start, int32_t limit, UBiDi *pLineBiDi, @@ -663,7 +665,7 @@ ubidi_setLine(const UBiDi *pParaBiDi, * @see UBiDiDirection * @stable ICU 2.0 */ -U_CAPI UBiDiDirection U_EXPORT2 +U_STABLE UBiDiDirection U_EXPORT2 ubidi_getDirection(const UBiDi *pBiDi); /** @@ -677,7 +679,7 @@ ubidi_getDirection(const UBiDi *pBiDi); * @see ubidi_setLine * @stable ICU 2.0 */ -U_CAPI const UChar * U_EXPORT2 +U_STABLE const UChar * U_EXPORT2 ubidi_getText(const UBiDi *pBiDi); /** @@ -688,7 +690,7 @@ ubidi_getText(const UBiDi *pBiDi); * @return The length of the text that the UBiDi object was created for. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ubidi_getLength(const UBiDi *pBiDi); /** @@ -701,7 +703,7 @@ ubidi_getLength(const UBiDi *pBiDi); * @see UBiDiLevel * @stable ICU 2.0 */ -U_CAPI UBiDiLevel U_EXPORT2 +U_STABLE UBiDiLevel U_EXPORT2 ubidi_getParaLevel(const UBiDi *pBiDi); /** @@ -716,7 +718,7 @@ ubidi_getParaLevel(const UBiDi *pBiDi); * @see UBiDiLevel * @stable ICU 2.0 */ -U_CAPI UBiDiLevel U_EXPORT2 +U_STABLE UBiDiLevel U_EXPORT2 ubidi_getLevelAt(const UBiDi *pBiDi, int32_t charIndex); /** @@ -736,7 +738,7 @@ ubidi_getLevelAt(const UBiDi *pBiDi, int32_t charIndex); * @see UBiDiLevel * @stable ICU 2.0 */ -U_CAPI const UBiDiLevel * U_EXPORT2 +U_STABLE const UBiDiLevel * U_EXPORT2 ubidi_getLevels(UBiDi *pBiDi, UErrorCode *pErrorCode); /** @@ -761,7 +763,7 @@ ubidi_getLevels(UBiDi *pBiDi, UErrorCode *pErrorCode); * value is not necessary. * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ubidi_getLogicalRun(const UBiDi *pBiDi, int32_t logicalStart, int32_t *pLogicalLimit, UBiDiLevel *pLevel); @@ -781,7 +783,7 @@ ubidi_getLogicalRun(const UBiDi *pBiDi, int32_t logicalStart, * @return The number of runs. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ubidi_countRuns(UBiDi *pBiDi, UErrorCode *pErrorCode); /** @@ -835,7 +837,7 @@ ubidi_countRuns(UBiDi *pBiDi, UErrorCode *pErrorCode); * before first ones. * @stable ICU 2.0 */ -U_CAPI UBiDiDirection U_EXPORT2 +U_STABLE UBiDiDirection U_EXPORT2 ubidi_getVisualRun(UBiDi *pBiDi, int32_t runIndex, int32_t *pLogicalStart, int32_t *pLength); @@ -862,7 +864,7 @@ ubidi_getVisualRun(UBiDi *pBiDi, int32_t runIndex, * @see ubidi_getLogicalIndex * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ubidi_getVisualIndex(UBiDi *pBiDi, int32_t logicalIndex, UErrorCode *pErrorCode); /** @@ -886,7 +888,7 @@ ubidi_getVisualIndex(UBiDi *pBiDi, int32_t logicalIndex, UErrorCode *pErrorCode) * @see ubidi_getVisualIndex * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ubidi_getLogicalIndex(UBiDi *pBiDi, int32_t visualIndex, UErrorCode *pErrorCode); /** @@ -907,7 +909,7 @@ ubidi_getLogicalIndex(UBiDi *pBiDi, int32_t visualIndex, UErrorCode *pErrorCode) * @see ubidi_getVisualIndex * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ubidi_getLogicalMap(UBiDi *pBiDi, int32_t *indexMap, UErrorCode *pErrorCode); /** @@ -928,7 +930,7 @@ ubidi_getLogicalMap(UBiDi *pBiDi, int32_t *indexMap, UErrorCode *pErrorCode); * @see ubidi_getLogicalIndex * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ubidi_getVisualMap(UBiDi *pBiDi, int32_t *indexMap, UErrorCode *pErrorCode); /** @@ -951,7 +953,7 @@ ubidi_getVisualMap(UBiDi *pBiDi, int32_t *indexMap, UErrorCode *pErrorCode); * The index map will result in indexMap[logicalIndex]==visualIndex. * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ubidi_reorderLogical(const UBiDiLevel *levels, int32_t length, int32_t *indexMap); /** @@ -974,7 +976,7 @@ ubidi_reorderLogical(const UBiDiLevel *levels, int32_t length, int32_t *indexMap * The index map will result in indexMap[visualIndex]==logicalIndex. * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ubidi_reorderVisual(const UBiDiLevel *levels, int32_t length, int32_t *indexMap); /** @@ -991,7 +993,7 @@ ubidi_reorderVisual(const UBiDiLevel *levels, int32_t length, int32_t *indexMap) * @param length is the length of each array. * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ubidi_invertMap(const int32_t *srcMap, int32_t *destMap, int32_t length); /** option flags for ubidi_writeReordered() */ @@ -1069,6 +1071,12 @@ ubidi_invertMap(const int32_t *srcMap, int32_t *destMap, int32_t length); * characters; see the description of the destSize * and options parameters and of the option bit flags. * + * @see UBIDI_DO_MIRRORING + * @see UBIDI_INSERT_LRM_FOR_NUMERIC + * @see UBIDI_KEEP_BASE_COMBINING + * @see UBIDI_OUTPUT_REVERSE + * @see UBIDI_REMOVE_BIDI_CONTROLS + * * @param pBiDi A pointer to a UBiDi object that * is set by ubidi_setPara() or * ubidi_setLine() and contains the reordering @@ -1102,6 +1110,12 @@ ubidi_invertMap(const int32_t *srcMap, int32_t *destMap, int32_t length); * to logically stored text (although this is still an * imperfect implementation of an "inverse BiDi" algorithm * because it uses the "forward BiDi" algorithm at its core). + * The available options are: + * #UBIDI_DO_MIRRORING, + * #UBIDI_INSERT_LRM_FOR_NUMERIC, + * #UBIDI_KEEP_BASE_COMBINING, + * #UBIDI_OUTPUT_REVERSE, + * #UBIDI_REMOVE_BIDI_CONTROLS * * @param pErrorCode must be a valid pointer to an error code value, * which must not indicate a failure before the function call. @@ -1109,7 +1123,7 @@ ubidi_invertMap(const int32_t *srcMap, int32_t *destMap, int32_t length); * @return The length of the output string. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ubidi_writeReordered(UBiDi *pBiDi, UChar *dest, int32_t destSize, uint16_t options, @@ -1154,7 +1168,7 @@ ubidi_writeReordered(UBiDi *pBiDi, * * @param options A bit set of options for the reordering that control * how the reordered text is written. - * See ubidi_writeReordered(). + * See the options parameter in ubidi_writeReordered(). * * @param pErrorCode must be a valid pointer to an error code value, * which must not indicate a failure before the function call. @@ -1162,7 +1176,7 @@ ubidi_writeReordered(UBiDi *pBiDi, * @return The length of the output string. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ubidi_writeReverse(const UChar *src, int32_t srcLength, UChar *dest, int32_t destSize, uint16_t options, diff --git a/icuSources/common/unicode/ubrk.h b/icuSources/common/unicode/ubrk.h index c2e13773..81e12c00 100644 --- a/icuSources/common/unicode/ubrk.h +++ b/icuSources/common/unicode/ubrk.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 1996-2003, International Business Machines Corporation and others. All Rights Reserved. +* Copyright (C) 1996-2004, International Business Machines Corporation and others. All Rights Reserved. ***************************************************************************************** */ @@ -7,6 +7,7 @@ #define UBRK_H #include "unicode/utypes.h" +#include "unicode/uloc.h" /** * A text-break iterator. @@ -192,14 +193,19 @@ typedef enum UBreakIteratorType { UBRK_LINE, /** Sentence breaks @stable ICU 2.0 */ UBRK_SENTENCE, + +#ifndef U_HIDE_DEPRECATED_API /** * Title Case breaks * The iterator created using this type locates title boundaries as described for * Unicode 3.2 only. For Unicode 4.0 and above title boundary iteration, - * please use Word Boundary iterator. @draft ICU 2.2 + * please use Word Boundary iterator. * + * @deprecated ICU 2.8 Use the word break iterator for titlecasing for Unicode 4 and later. */ UBRK_TITLE +#endif /* U_HIDE_DEPRECATED_API */ + } UBreakIteratorType; /** Value indicating all text boundaries have been returned. @@ -214,7 +220,7 @@ typedef enum UBreakIteratorType { * word, to allow for further subdivisions of a category in future releases. * Applications should check for tag values falling within the range, rather * than for single individual values. - * @draft ICU 2.2 + * @stable ICU 2.2 */ typedef enum UWordBreak { /** Tag value for "words" that do not fit into any of other categories. @@ -241,6 +247,54 @@ typedef enum UWordBreak { UBRK_WORD_IDEO_LIMIT = 500 } UWordBreak; +/** + * Enum constants for the line break tags returned by getRuleStatus(). + * A range of values is defined for each category of + * word, to allow for further subdivisions of a category in future releases. + * Applications should check for tag values falling within the range, rather + * than for single individual values. + * @draft ICU 2.8 +*/ +typedef enum ULineBreakTag { + /** Tag value for soft line breaks, positions at which a line break + * is acceptable but not required */ + UBRK_LINE_SOFT = 0, + /** Upper bound for soft line breaks. */ + UBRK_LINE_SOFT_LIMIT = 100, + /** Tag value for a hard, or mandatory line break */ + UBRK_LINE_HARD = 100, + /** Upper bound for hard line breaks. */ + UBRK_LINE_HARD_LIMIT = 200 +} ULineBreakTag; + + + +/** + * Enum constants for the sentence break tags returned by getRuleStatus(). + * A range of values is defined for each category of + * sentence, to allow for further subdivisions of a category in future releases. + * Applications should check for tag values falling within the range, rather + * than for single individual values. + * @draft ICU 2.8 +*/ +typedef enum USentenceBreakTag { + /** Tag value for for sentences ending with a sentence terminator + * ('.', '?', '!', etc.) character, possibly followed by a + * hard separator (CR, LF, PS, etc.) + */ + UBRK_SENTENCE_TERM = 0, + /** Upper bound for tags for sentences ended by sentence terminators. */ + UBRK_SENTENCE_TERM_LIMIT = 100, + /** Tag value for for sentences that do not contain an ending + * sentence terminator ('.', '?', '!', etc.) character, but + * are ended only by a hard separator (CR, LF, PS, etc.) or end of input. + */ + UBRK_SENTENCE_SEP = 100, + /** Upper bound for tags for sentences ended by a separator. */ + UBRK_SENTENCE_SEP_LIMIT = 200 + /** Tag value for a hard, or mandatory line break */ +} USentenceBreakTag; + /** * Open a new UBreakIterator for locating text boundaries for a specified locale. @@ -256,7 +310,7 @@ typedef enum UWordBreak { * @see ubrk_openRules * @stable ICU 2.0 */ -U_CAPI UBreakIterator* U_EXPORT2 +U_STABLE UBreakIterator* U_EXPORT2 ubrk_open(UBreakIteratorType type, const char *locale, const UChar *text, @@ -276,9 +330,9 @@ ubrk_open(UBreakIteratorType type, * @param status A UErrorCode to receive any errors. * @return A UBreakIterator for the specified rules. * @see ubrk_open - * @draft ICU 2.2 + * @stable ICU 2.2 */ -U_CAPI UBreakIterator* U_EXPORT2 +U_STABLE UBreakIterator* U_EXPORT2 ubrk_openRules(const UChar *rules, int32_t rulesLength, const UChar *text, @@ -302,7 +356,7 @@ ubrk_openRules(const UChar *rules, * @return pointer to the new clone * @stable ICU 2.0 */ -U_CAPI UBreakIterator * U_EXPORT2 +U_STABLE UBreakIterator * U_EXPORT2 ubrk_safeClone( const UBreakIterator *bi, void *stackBuffer, @@ -321,7 +375,7 @@ ubrk_safeClone( * @param bi The break iterator to close. * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ubrk_close(UBreakIterator *bi); /** @@ -332,7 +386,7 @@ ubrk_close(UBreakIterator *bi); * @param status The error code * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ubrk_setText(UBreakIterator* bi, const UChar* text, int32_t textLength, @@ -342,11 +396,11 @@ ubrk_setText(UBreakIterator* bi, * Determine the most recently-returned text boundary. * * @param bi The break iterator to use. - * @return The character index most recently returned by \Ref{ubrk_next}, \Ref{ubrk_previous}, - * \Ref{ubrk_first}, or \Ref{ubrk_last}. + * @return The character index most recently returned by \ref ubrk_next, \ref ubrk_previous, + * \ref ubrk_first, or \ref ubrk_last. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ubrk_current(const UBreakIterator *bi); /** @@ -358,7 +412,7 @@ ubrk_current(const UBreakIterator *bi); * @see ubrk_previous * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ubrk_next(UBreakIterator *bi); /** @@ -370,7 +424,7 @@ ubrk_next(UBreakIterator *bi); * @see ubrk_next * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ubrk_previous(UBreakIterator *bi); /** @@ -381,7 +435,7 @@ ubrk_previous(UBreakIterator *bi); * @see ubrk_last * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ubrk_first(UBreakIterator *bi); /** @@ -394,7 +448,7 @@ ubrk_first(UBreakIterator *bi); * @see ubrk_first * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ubrk_last(UBreakIterator *bi); /** @@ -406,7 +460,7 @@ ubrk_last(UBreakIterator *bi); * @see ubrk_following * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ubrk_preceding(UBreakIterator *bi, int32_t offset); @@ -419,7 +473,7 @@ ubrk_preceding(UBreakIterator *bi, * @see ubrk_preceding * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ubrk_following(UBreakIterator *bi, int32_t offset); @@ -432,18 +486,18 @@ ubrk_following(UBreakIterator *bi, * @see ubrk_countAvailable * @stable ICU 2.0 */ -U_CAPI const char* U_EXPORT2 +U_STABLE const char* U_EXPORT2 ubrk_getAvailable(int32_t index); /** * Determine how many locales have text breaking information available. * This function is most useful as determining the loop ending condition for -* calls to \Ref{ubrk_getAvailable}. +* calls to \ref ubrk_getAvailable. * @return The number of locales for which text breaking information is available. * @see ubrk_getAvailable * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ubrk_countAvailable(void); @@ -456,7 +510,7 @@ ubrk_countAvailable(void); * @return True if "offset" is a boundary position. * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 ubrk_isBoundary(UBreakIterator *bi, int32_t offset); /** @@ -466,11 +520,44 @@ ubrk_isBoundary(UBreakIterator *bi, int32_t offset); * status, a default value of 0 is returned. *

    * For word break iterators, the possible values are defined in enum UWordBreak. - * @draft ICU 2.2 + * @stable ICU 2.2 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ubrk_getRuleStatus(UBreakIterator *bi); +/** + * Get the statuses from the break rules that determined the most recently + * returned break position. The values appear in the rule source + * within brackets, {123}, for example. The default status value for rules + * that do not explicitly provide one is zero. + *

    + * For word break iterators, the possible values are defined in enum UWordBreak. + * @param bi The break iterator to use + * @param fillInVec an array to be filled in with the status values. + * @param capacity the length of the supplied vector. A length of zero causes + * the function to return the number of status values, in the + * normal way, without attemtping to store any values. + * @param status receives error codes. + * @return The number of rule status values from rules that determined + * the most recent boundary returned by the break iterator. + * @draft ICU 3.0 + */ +U_DRAFT int32_t U_EXPORT2 +ubrk_getRuleStatusVec(UBreakIterator *bi, int32_t *fillInVec, int32_t capacity, UErrorCode *status); + +/** + * Return the locale of the break iterator. You can choose between the valid and + * the actual locale. + * @param bi break iterator + * @param type locale type (valid or actual) + * @param status error code + * @return locale string + * @draft ICU 2.8 likely to change in ICU 3.0, based on feedback + */ +U_DRAFT const char* U_EXPORT2 +ubrk_getLocaleByType(const UBreakIterator *bi, ULocDataLocaleType type, UErrorCode* status); + + #endif /* #if !UCONFIG_NO_BREAK_ITERATION */ #endif diff --git a/icuSources/common/unicode/ucat.h b/icuSources/common/unicode/ucat.h index 1da9dba5..ad9f0373 100644 --- a/icuSources/common/unicode/ucat.h +++ b/icuSources/common/unicode/ucat.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (c) 2003, International Business Machines +* Copyright (c) 2003-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Author: Alan Liu @@ -26,7 +26,7 @@ * The ICU resource bundles obey standard ICU inheritance policies. * To facilitate this, sets and messages are flattened into one tier. * This is done by creating resource bundle keys of the form - * % where set_num is the set number and msg_num is + * <set_num>%<msg_num> where set_num is the set number and msg_num is * the message number, formatted as decimal strings. * * Example: Consider a message catalog containing two sets: @@ -57,7 +57,7 @@ * The catgets function is commonly used in combination with functions * like printf and strftime. ICU components like message format can * be used instead, although they use a different format syntax. - * There is an unsupported ICU package, ustdio, that provides some of + * There is an ICU package, icuio, that provides some of * the POSIX-style formatting API. */ @@ -66,7 +66,7 @@ U_CDECL_BEGIN /** * An ICU message catalog descriptor, analogous to nl_catd. * - * @draft ICU 2.6 + * @stable ICU 2.6 */ typedef UResourceBundle* u_nl_catd; @@ -99,9 +99,9 @@ typedef UResourceBundle* u_nl_catd; * catalog. If the ec parameter indicates failure, then NULL will be * returned. * - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI u_nl_catd U_EXPORT2 +U_STABLE u_nl_catd U_EXPORT2 u_catopen(const char* name, const char* locale, UErrorCode* ec); /** @@ -110,9 +110,9 @@ u_catopen(const char* name, const char* locale, UErrorCode* ec); * @param catd a message catalog descriptor to be closed. May be NULL, * in which case no action is taken. * - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 u_catclose(u_nl_catd catd); /** @@ -145,9 +145,9 @@ u_catclose(u_nl_catd catd); * which ec indicates a failing error code upon entry to this * function. * - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI const UChar* U_EXPORT2 +U_STABLE const UChar* U_EXPORT2 u_catgets(u_nl_catd catd, int32_t set_num, int32_t msg_num, const UChar* s, int32_t* len, UErrorCode* ec); diff --git a/icuSources/common/unicode/uchar.h b/icuSources/common/unicode/uchar.h index 07d4948e..7fd490c8 100644 --- a/icuSources/common/unicode/uchar.h +++ b/icuSources/common/unicode/uchar.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1997-2003, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -39,7 +39,7 @@ U_CDECL_BEGIN * @see u_getUnicodeVersion * @stable ICU 2.0 */ -#define U_UNICODE_VERSION "4" +#define U_UNICODE_VERSION "4.0.1" /** * \file @@ -156,9 +156,9 @@ typedef enum UProperty { and "String property Age" are read by genpname. */ /* Note: Place UCHAR_ALPHABETIC before UCHAR_BINARY_START so that - debuggers display UCHAR_ALPHABETIC as the symbolic name for 0, - rather than UCHAR_BINARY_START. Likewise for other *_START - identifiers. */ + debuggers display UCHAR_ALPHABETIC as the symbolic name for 0, + rather than UCHAR_BINARY_START. Likewise for other *_START + identifiers. */ /** Binary property Alphabetic. Same as u_isUAlphabetic, different from u_isalpha. Lu+Ll+Lt+Lm+Lo+Nl+Other_Alphabetic @stable ICU 2.1 */ @@ -284,51 +284,149 @@ typedef enum UProperty { UCHAR_XID_START, /** Binary property Case_Sensitive. Either the source of a case mapping or _in_ the target of a case mapping. Not the same as - the general category Cased_Letter. @draft ICU 2.6 */ + the general category Cased_Letter. @stable ICU 2.6 */ UCHAR_CASE_SENSITIVE, + /** Binary property STerm (new in Unicode 4.0.1). + Sentence Terminal. Used in UAX #29: Text Boundaries + (http://www.unicode.org/reports/tr29/) + @draft ICU 3.0 */ + UCHAR_S_TERM, + /** Binary property Variation_Selector (new in Unicode 4.0.1). + Indicates all those characters that qualify as Variation Selectors. + For details on the behavior of these characters, + see StandardizedVariants.html and 15.6 Variation Selectors. + @draft ICU 3.0 */ + UCHAR_VARIATION_SELECTOR, + /** Binary property NFD_Inert. + ICU-specific property for characters that are inert under NFD, + i.e., they do not interact with adjacent characters. + Used for example in normalizing transforms in incremental mode + to find the boundary of safely normalizable text despite possible + text additions. + + There is one such property per normalization form. + These properties are computed as follows - an inert character is: + a) unassigned, or ALL of the following: + b) of combining class 0. + c) not decomposed by this normalization form. + AND if NFC or NFKC, + d) can never compose with a previous character. + e) can never compose with a following character. + f) can never change if another character is added. + Example: a-breve might satisfy all but f, but if you + add an ogonek it changes to a-ogonek + breve + + See also com.ibm.text.UCD.NFSkippable in the ICU4J repository, + and icu/source/common/unormimp.h . + @draft ICU 3.0 */ + UCHAR_NFD_INERT, + /** Binary property NFKD_Inert. + ICU-specific property for characters that are inert under NFKD, + i.e., they do not interact with adjacent characters. + Used for example in normalizing transforms in incremental mode + to find the boundary of safely normalizable text despite possible + text additions. + @see UCHAR_NFD_INERT + @draft ICU 3.0 */ + UCHAR_NFKD_INERT, + /** Binary property NFC_Inert. + ICU-specific property for characters that are inert under NFC, + i.e., they do not interact with adjacent characters. + Used for example in normalizing transforms in incremental mode + to find the boundary of safely normalizable text despite possible + text additions. + @see UCHAR_NFD_INERT + @draft ICU 3.0 */ + UCHAR_NFC_INERT, + /** Binary property NFKC_Inert. + ICU-specific property for characters that are inert under NFKC, + i.e., they do not interact with adjacent characters. + Used for example in normalizing transforms in incremental mode + to find the boundary of safely normalizable text despite possible + text additions. + @see UCHAR_NFD_INERT + @draft ICU 3.0 */ + UCHAR_NFKC_INERT, + /** Binary Property Segment_Starter. + ICU-specific property for characters that are starters in terms of + Unicode normalization and combining character sequences. + They have ccc=0 and do not occur in non-initial position of the + canonical decomposition of any character + (like " in NFD(a-umlaut) and a Jamo T in an NFD(Hangul LVT)). + ICU uses this property for segmenting a string for generating a set of + canonically equivalent strings, e.g. for canonical closure while + processing collation tailoring rules. + @draft ICU 3.0 */ + UCHAR_SEGMENT_STARTER, /** One more than the last constant for binary Unicode properties. @stable ICU 2.1 */ UCHAR_BINARY_LIMIT, /** Enumerated property Bidi_Class. - Same as u_charDirection, returns UCharDirection values. @draft ICU 2.2 */ + Same as u_charDirection, returns UCharDirection values. @stable ICU 2.2 */ UCHAR_BIDI_CLASS=0x1000, - /** First constant for enumerated/integer Unicode properties. @draft ICU 2.2 */ + /** First constant for enumerated/integer Unicode properties. @stable ICU 2.2 */ UCHAR_INT_START=UCHAR_BIDI_CLASS, /** Enumerated property Block. - Same as ublock_getCode, returns UBlockCode values. @draft ICU 2.2 */ + Same as ublock_getCode, returns UBlockCode values. @stable ICU 2.2 */ UCHAR_BLOCK, /** Enumerated property Canonical_Combining_Class. - Same as u_getCombiningClass, returns 8-bit numeric values. @draft ICU 2.2 */ + Same as u_getCombiningClass, returns 8-bit numeric values. @stable ICU 2.2 */ UCHAR_CANONICAL_COMBINING_CLASS, /** Enumerated property Decomposition_Type. - Returns UDecompositionType values. @draft ICU 2.2 */ + Returns UDecompositionType values. @stable ICU 2.2 */ UCHAR_DECOMPOSITION_TYPE, /** Enumerated property East_Asian_Width. See http://www.unicode.org/reports/tr11/ - Returns UEastAsianWidth values. @draft ICU 2.2 */ + Returns UEastAsianWidth values. @stable ICU 2.2 */ UCHAR_EAST_ASIAN_WIDTH, /** Enumerated property General_Category. - Same as u_charType, returns UCharCategory values. @draft ICU 2.2 */ + Same as u_charType, returns UCharCategory values. @stable ICU 2.2 */ UCHAR_GENERAL_CATEGORY, /** Enumerated property Joining_Group. - Returns UJoiningGroup values. @draft ICU 2.2 */ + Returns UJoiningGroup values. @stable ICU 2.2 */ UCHAR_JOINING_GROUP, /** Enumerated property Joining_Type. - Returns UJoiningType values. @draft ICU 2.2 */ + Returns UJoiningType values. @stable ICU 2.2 */ UCHAR_JOINING_TYPE, /** Enumerated property Line_Break. - Returns ULineBreak values. @draft ICU 2.2 */ + Returns ULineBreak values. @stable ICU 2.2 */ UCHAR_LINE_BREAK, /** Enumerated property Numeric_Type. - Returns UNumericType values. @draft ICU 2.2 */ + Returns UNumericType values. @stable ICU 2.2 */ UCHAR_NUMERIC_TYPE, /** Enumerated property Script. - Same as uscript_getScript, returns UScriptCode values. @draft ICU 2.2 */ + Same as uscript_getScript, returns UScriptCode values. @stable ICU 2.2 */ UCHAR_SCRIPT, /** Enumerated property Hangul_Syllable_Type, new in Unicode 4. - Returns UHangulSyllableType values. @draft ICU 2.6 */ + Returns UHangulSyllableType values. @stable ICU 2.6 */ UCHAR_HANGUL_SYLLABLE_TYPE, - /** One more than the last constant for enumerated/integer Unicode properties. @draft ICU 2.2 */ + /** Enumerated property NFD_Quick_Check. + Returns UNormalizationCheckResult values. @draft ICU 3.0 */ + UCHAR_NFD_QUICK_CHECK, + /** Enumerated property NFKD_Quick_Check. + Returns UNormalizationCheckResult values. @draft ICU 3.0 */ + UCHAR_NFKD_QUICK_CHECK, + /** Enumerated property NFC_Quick_Check. + Returns UNormalizationCheckResult values. @draft ICU 3.0 */ + UCHAR_NFC_QUICK_CHECK, + /** Enumerated property NFKC_Quick_Check. + Returns UNormalizationCheckResult values. @draft ICU 3.0 */ + UCHAR_NFKC_QUICK_CHECK, + /** Enumerated property Lead_Canonical_Combining_Class. + ICU-specific property for the ccc of the first code point + of the decomposition, or lccc(c)=ccc(NFD(c)[0]). + Useful for checking for canonically ordered text; + see UNORM_FCD and http://www.unicode.org/notes/tn5/#FCD . + Returns 8-bit numeric values like UCHAR_CANONICAL_COMBINING_CLASS. @draft ICU 3.0 */ + UCHAR_LEAD_CANONICAL_COMBINING_CLASS, + /** Enumerated property Trail_Canonical_Combining_Class. + ICU-specific property for the ccc of the last code point + of the decomposition, or tccc(c)=ccc(NFD(c)[last]). + Useful for checking for canonically ordered text; + see UNORM_FCD and http://www.unicode.org/notes/tn5/#FCD . + Returns 8-bit numeric values like UCHAR_CANONICAL_COMBINING_CLASS. @draft ICU 3.0 */ + UCHAR_TRAIL_CANONICAL_COMBINING_CLASS, + /** One more than the last constant for enumerated/integer Unicode properties. @stable ICU 2.2 */ UCHAR_INT_LIMIT, /** Bitmask property General_Category_Mask. @@ -338,66 +436,66 @@ typedef enum UProperty { When used with u_getPropertyValueName() and u_getPropertyValueEnum(), a multi-bit mask is used for sets of categories like "Letters". Mask values should be cast to uint32_t. - @draft ICU 2.4 */ + @stable ICU 2.4 */ UCHAR_GENERAL_CATEGORY_MASK=0x2000, - /** First constant for bit-mask Unicode properties. @draft ICU 2.4 */ + /** First constant for bit-mask Unicode properties. @stable ICU 2.4 */ UCHAR_MASK_START=UCHAR_GENERAL_CATEGORY_MASK, - /** One more than the last constant for bit-mask Unicode properties. @draft ICU 2.4 */ + /** One more than the last constant for bit-mask Unicode properties. @stable ICU 2.4 */ UCHAR_MASK_LIMIT, /** Double property Numeric_Value. - Corresponds to u_getNumericValue. @draft ICU 2.4 */ + Corresponds to u_getNumericValue. @stable ICU 2.4 */ UCHAR_NUMERIC_VALUE=0x3000, - /** First constant for double Unicode properties. @draft ICU 2.4 */ + /** First constant for double Unicode properties. @stable ICU 2.4 */ UCHAR_DOUBLE_START=UCHAR_NUMERIC_VALUE, - /** One more than the last constant for double Unicode properties. @draft ICU 2.4 */ + /** One more than the last constant for double Unicode properties. @stable ICU 2.4 */ UCHAR_DOUBLE_LIMIT, /** String property Age. - Corresponds to u_charAge. @draft ICU 2.4 */ + Corresponds to u_charAge. @stable ICU 2.4 */ UCHAR_AGE=0x4000, - /** First constant for string Unicode properties. @draft ICU 2.4 */ + /** First constant for string Unicode properties. @stable ICU 2.4 */ UCHAR_STRING_START=UCHAR_AGE, /** String property Bidi_Mirroring_Glyph. - Corresponds to u_charMirror. @draft ICU 2.4 */ + Corresponds to u_charMirror. @stable ICU 2.4 */ UCHAR_BIDI_MIRRORING_GLYPH, /** String property Case_Folding. - Corresponds to u_strFoldCase in ustring.h. @draft ICU 2.4 */ + Corresponds to u_strFoldCase in ustring.h. @stable ICU 2.4 */ UCHAR_CASE_FOLDING, /** String property ISO_Comment. - Corresponds to u_getISOComment. @draft ICU 2.4 */ + Corresponds to u_getISOComment. @stable ICU 2.4 */ UCHAR_ISO_COMMENT, /** String property Lowercase_Mapping. - Corresponds to u_strToLower in ustring.h. @draft ICU 2.4 */ + Corresponds to u_strToLower in ustring.h. @stable ICU 2.4 */ UCHAR_LOWERCASE_MAPPING, /** String property Name. - Corresponds to u_charName. @draft ICU 2.4 */ + Corresponds to u_charName. @stable ICU 2.4 */ UCHAR_NAME, /** String property Simple_Case_Folding. - Corresponds to u_foldCase. @draft ICU 2.4 */ + Corresponds to u_foldCase. @stable ICU 2.4 */ UCHAR_SIMPLE_CASE_FOLDING, /** String property Simple_Lowercase_Mapping. - Corresponds to u_tolower. @draft ICU 2.4 */ + Corresponds to u_tolower. @stable ICU 2.4 */ UCHAR_SIMPLE_LOWERCASE_MAPPING, /** String property Simple_Titlecase_Mapping. - Corresponds to u_totitle. @draft ICU 2.4 */ + Corresponds to u_totitle. @stable ICU 2.4 */ UCHAR_SIMPLE_TITLECASE_MAPPING, /** String property Simple_Uppercase_Mapping. - Corresponds to u_toupper. @draft ICU 2.4 */ + Corresponds to u_toupper. @stable ICU 2.4 */ UCHAR_SIMPLE_UPPERCASE_MAPPING, /** String property Titlecase_Mapping. - Corresponds to u_strToTitle in ustring.h. @draft ICU 2.4 */ + Corresponds to u_strToTitle in ustring.h. @stable ICU 2.4 */ UCHAR_TITLECASE_MAPPING, /** String property Unicode_1_Name. - Corresponds to u_charName. @draft ICU 2.4 */ + Corresponds to u_charName. @stable ICU 2.4 */ UCHAR_UNICODE_1_NAME, /** String property Uppercase_Mapping. - Corresponds to u_strToUpper in ustring.h. @draft ICU 2.4 */ + Corresponds to u_strToUpper in ustring.h. @stable ICU 2.4 */ UCHAR_UPPERCASE_MAPPING, - /** One more than the last constant for string Unicode properties. @draft ICU 2.4 */ + /** One more than the last constant for string Unicode properties. @stable ICU 2.4 */ UCHAR_STRING_LIMIT, - /** Represents a nonexistent or invalid property or property value. @draft ICU 2.4 */ + /** Represents a nonexistent or invalid property or property value. @stable ICU 2.4 */ UCHAR_INVALID_CODE = -1 } UProperty; @@ -642,7 +740,8 @@ typedef enum UCharDirection { * @stable ICU 2.0 */ enum UBlockCode { - /** New No_Block value in Unicode 4. @draft ICU 2.6 */ + + /** New No_Block value in Unicode 4. @stable ICU 2.6 */ UBLOCK_NO_BLOCK = 0, /*[none]*/ /* Special range indicating No_Block */ /** @stable ICU 2.0 */ @@ -953,66 +1052,71 @@ enum UBlockCode { /* New blocks in Unicode 3.2 */ - /** @draft ICU 2.2 */ - UBLOCK_CYRILLIC_SUPPLEMENTARY = 97, /*[0500]*/ - /** @draft ICU 2.2 */ + /** + * Unicode 4.0.1 renames the "Cyrillic Supplementary" block to "Cyrillic Supplement". + * @stable ICU 2.2 + */ + UBLOCK_CYRILLIC_SUPPLEMENTARY = 97, + /** @draft ICU 3.0 */ + UBLOCK_CYRILLIC_SUPPLEMENT = UBLOCK_CYRILLIC_SUPPLEMENTARY, /*[0500]*/ + /** @stable ICU 2.2 */ UBLOCK_TAGALOG = 98, /*[1700]*/ - /** @draft ICU 2.2 */ + /** @stable ICU 2.2 */ UBLOCK_HANUNOO = 99, /*[1720]*/ - /** @draft ICU 2.2 */ + /** @stable ICU 2.2 */ UBLOCK_BUHID = 100, /*[1740]*/ - /** @draft ICU 2.2 */ + /** @stable ICU 2.2 */ UBLOCK_TAGBANWA = 101, /*[1760]*/ - /** @draft ICU 2.2 */ + /** @stable ICU 2.2 */ UBLOCK_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A = 102, /*[27C0]*/ - /** @draft ICU 2.2 */ + /** @stable ICU 2.2 */ UBLOCK_SUPPLEMENTAL_ARROWS_A = 103, /*[27F0]*/ - /** @draft ICU 2.2 */ + /** @stable ICU 2.2 */ UBLOCK_SUPPLEMENTAL_ARROWS_B = 104, /*[2900]*/ - /** @draft ICU 2.2 */ + /** @stable ICU 2.2 */ UBLOCK_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B = 105, /*[2980]*/ - /** @draft ICU 2.2 */ + /** @stable ICU 2.2 */ UBLOCK_SUPPLEMENTAL_MATHEMATICAL_OPERATORS = 106, /*[2A00]*/ - /** @draft ICU 2.2 */ + /** @stable ICU 2.2 */ UBLOCK_KATAKANA_PHONETIC_EXTENSIONS = 107, /*[31F0]*/ - /** @draft ICU 2.2 */ + /** @stable ICU 2.2 */ UBLOCK_VARIATION_SELECTORS = 108, /*[FE00]*/ - /** @draft ICU 2.2 */ + /** @stable ICU 2.2 */ UBLOCK_SUPPLEMENTARY_PRIVATE_USE_AREA_A = 109, /*[F0000]*/ - /** @draft ICU 2.2 */ + /** @stable ICU 2.2 */ UBLOCK_SUPPLEMENTARY_PRIVATE_USE_AREA_B = 110, /*[100000]*/ /* New blocks in Unicode 4 */ - /** @draft ICU 2.6 */ + /** @stable ICU 2.6 */ UBLOCK_LIMBU = 111, /*[1900]*/ - /** @draft ICU 2.6 */ + /** @stable ICU 2.6 */ UBLOCK_TAI_LE = 112, /*[1950]*/ - /** @draft ICU 2.6 */ + /** @stable ICU 2.6 */ UBLOCK_KHMER_SYMBOLS = 113, /*[19E0]*/ - /** @draft ICU 2.6 */ + /** @stable ICU 2.6 */ UBLOCK_PHONETIC_EXTENSIONS = 114, /*[1D00]*/ - /** @draft ICU 2.6 */ + /** @stable ICU 2.6 */ UBLOCK_MISCELLANEOUS_SYMBOLS_AND_ARROWS = 115, /*[2B00]*/ - /** @draft ICU 2.6 */ + /** @stable ICU 2.6 */ UBLOCK_YIJING_HEXAGRAM_SYMBOLS = 116, /*[4DC0]*/ - /** @draft ICU 2.6 */ + /** @stable ICU 2.6 */ UBLOCK_LINEAR_B_SYLLABARY = 117, /*[10000]*/ - /** @draft ICU 2.6 */ + /** @stable ICU 2.6 */ UBLOCK_LINEAR_B_IDEOGRAMS = 118, /*[10080]*/ - /** @draft ICU 2.6 */ + /** @stable ICU 2.6 */ UBLOCK_AEGEAN_NUMBERS = 119, /*[10100]*/ - /** @draft ICU 2.6 */ + /** @stable ICU 2.6 */ UBLOCK_UGARITIC = 120, /*[10380]*/ - /** @draft ICU 2.6 */ + /** @stable ICU 2.6 */ UBLOCK_SHAVIAN = 121, /*[10450]*/ - /** @draft ICU 2.6 */ + /** @stable ICU 2.6 */ UBLOCK_OSMANYA = 122, /*[10480]*/ - /** @draft ICU 2.6 */ + /** @stable ICU 2.6 */ UBLOCK_CYPRIOT_SYLLABARY = 123, /*[10800]*/ - /** @draft ICU 2.6 */ + /** @stable ICU 2.6 */ UBLOCK_TAI_XUAN_JING_SYMBOLS = 124, /*[1D300]*/ - /** @draft ICU 2.6 */ + /** @stable ICU 2.6 */ UBLOCK_VARIATION_SELECTORS_SUPPLEMENT = 125, /*[E0100]*/ /** @stable ICU 2.0 */ @@ -1030,7 +1134,7 @@ typedef enum UBlockCode UBlockCode; * * @see UCHAR_EAST_ASIAN_WIDTH * @see u_getIntPropertyValue - * @draft ICU 2.2 + * @stable ICU 2.2 */ typedef enum UEastAsianWidth { U_EA_NEUTRAL, /*[N]*/ /*See note !!*/ @@ -1075,7 +1179,7 @@ typedef enum UCharNameChoice { * * @see u_getPropertyName() * @see u_getPropertyValueName() - * @draft ICU 2.4 + * @stable ICU 2.4 */ typedef enum UPropertyNameChoice { U_SHORT_PROPERTY_NAME, @@ -1087,7 +1191,7 @@ typedef enum UPropertyNameChoice { * Decomposition Type constants. * * @see UCHAR_DECOMPOSITION_TYPE - * @draft ICU 2.2 + * @stable ICU 2.2 */ typedef enum UDecompositionType { U_DT_NONE, /*[none]*/ /*See note !!*/ @@ -1115,7 +1219,7 @@ typedef enum UDecompositionType { * Joining Type constants. * * @see UCHAR_JOINING_TYPE - * @draft ICU 2.2 + * @stable ICU 2.2 */ typedef enum UJoiningType { U_JT_NON_JOINING, /*[U]*/ /*See note !!*/ @@ -1131,7 +1235,7 @@ typedef enum UJoiningType { * Joining Group constants. * * @see UCHAR_JOINING_GROUP - * @draft ICU 2.2 + * @stable ICU 2.2 */ typedef enum UJoiningGroup { U_JG_NO_JOINING_GROUP, @@ -1185,9 +1289,9 @@ typedef enum UJoiningGroup { U_JG_YUDH, U_JG_YUDH_HE, U_JG_ZAIN, - U_JG_FE, /**< @draft ICU 2.6 */ - U_JG_KHAPH, /**< @draft ICU 2.6 */ - U_JG_ZHAIN, /**< @draft ICU 2.6 */ + U_JG_FE, /**< @stable ICU 2.6 */ + U_JG_KHAPH, /**< @stable ICU 2.6 */ + U_JG_ZHAIN, /**< @stable ICU 2.6 */ U_JG_COUNT } UJoiningGroup; @@ -1195,7 +1299,7 @@ typedef enum UJoiningGroup { * Line Break constants. * * @see UCHAR_LINE_BREAK - * @draft ICU 2.2 + * @stable ICU 2.2 */ typedef enum ULineBreak { U_LB_UNKNOWN, /*[XX]*/ /*See note !!*/ @@ -1213,7 +1317,9 @@ typedef enum ULineBreak { U_LB_GLUE, /*[GL]*/ U_LB_HYPHEN, /*[HY]*/ U_LB_IDEOGRAPHIC, /*[ID]*/ - U_LB_INSEPERABLE, /*[IN]*/ + U_LB_INSEPERABLE, + /** Renamed from the misspelled "inseperable" in Unicode 4.0.1/ICU 3.0 @draft ICU 3.0 */ + U_LB_INSEPARABLE=U_LB_INSEPERABLE,/*[IN]*/ U_LB_INFIX_NUMERIC, /*[IS]*/ U_LB_LINE_FEED, /*[LF]*/ U_LB_NONSTARTER, /*[NS]*/ @@ -1236,7 +1342,7 @@ typedef enum ULineBreak { * Numeric Type constants. * * @see UCHAR_NUMERIC_TYPE - * @draft ICU 2.2 + * @stable ICU 2.2 */ typedef enum UNumericType { U_NT_NONE, /*[None]*/ /*See note !!*/ @@ -1250,7 +1356,7 @@ typedef enum UNumericType { * Hangul Syllable Type constants. * * @see UCHAR_HANGUL_SYLLABLE_TYPE - * @draft ICU 2.6 + * @stable ICU 2.6 */ typedef enum UHangulSyllableType { U_HST_NOT_APPLICABLE, /*[NA]*/ /*See note !!*/ @@ -1288,7 +1394,7 @@ typedef enum UHangulSyllableType { * @see u_getUnicodeVersion * @stable ICU 2.1 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_hasBinaryProperty(UChar32 c, UProperty which); /** @@ -1303,7 +1409,7 @@ u_hasBinaryProperty(UChar32 c, UProperty which); * @see u_hasBinaryProperty * @stable ICU 2.1 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_isUAlphabetic(UChar32 c); /** @@ -1318,7 +1424,7 @@ u_isUAlphabetic(UChar32 c); * @see u_hasBinaryProperty * @stable ICU 2.1 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_isULowercase(UChar32 c); /** @@ -1333,7 +1439,7 @@ u_isULowercase(UChar32 c); * @see u_hasBinaryProperty * @stable ICU 2.1 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_isUUppercase(UChar32 c); /** @@ -1354,7 +1460,7 @@ u_isUUppercase(UChar32 c); * @see u_hasBinaryProperty * @stable ICU 2.1 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_isUWhiteSpace(UChar32 c); /** @@ -1392,9 +1498,9 @@ u_isUWhiteSpace(UChar32 c); * @see u_getIntPropertyMinValue * @see u_getIntPropertyMaxValue * @see u_getUnicodeVersion - * @draft ICU 2.2 + * @stable ICU 2.2 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_getIntPropertyValue(UChar32 c, UProperty which); /** @@ -1413,9 +1519,9 @@ u_getIntPropertyValue(UChar32 c, UProperty which); * @see u_getUnicodeVersion * @see u_getIntPropertyMaxValue * @see u_getIntPropertyValue - * @draft ICU 2.2 + * @stable ICU 2.2 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_getIntPropertyMinValue(UProperty which); /** @@ -1442,9 +1548,9 @@ u_getIntPropertyMinValue(UProperty which); * @see u_getUnicodeVersion * @see u_getIntPropertyMaxValue * @see u_getIntPropertyValue - * @draft ICU 2.2 + * @stable ICU 2.2 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_getIntPropertyMaxValue(UProperty which); /** @@ -1465,9 +1571,9 @@ u_getIntPropertyMaxValue(UProperty which); * @return Numeric value of c, or U_NO_NUMERIC_VALUE if none is defined. * * @see U_NO_NUMERIC_VALUE - * @draft ICU 2.2 + * @stable ICU 2.2 */ -U_CAPI double U_EXPORT2 +U_STABLE double U_EXPORT2 u_getNumericValue(UChar32 c); /** @@ -1475,7 +1581,7 @@ u_getNumericValue(UChar32 c); * no numeric value is defined for a code point. * * @see u_getNumericValue - * @draft ICU 2.2 + * @stable ICU 2.2 */ #define U_NO_NUMERIC_VALUE ((double)-123456789.) @@ -1503,7 +1609,7 @@ u_getNumericValue(UChar32 c); * @see u_islower * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_islower(UChar32 c); /** @@ -1530,7 +1636,7 @@ u_islower(UChar32 c); * @see u_tolower * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_isupper(UChar32 c); /** @@ -1547,7 +1653,7 @@ u_isupper(UChar32 c); * @see u_totitle * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_istitle(UChar32 c); /** @@ -1568,7 +1674,7 @@ u_istitle(UChar32 c); * * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_isdigit(UChar32 c); /** @@ -1589,7 +1695,7 @@ u_isdigit(UChar32 c); * @see u_isalnum * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_isalpha(UChar32 c); /** @@ -1610,7 +1716,7 @@ u_isalpha(UChar32 c); * * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_isalnum(UChar32 c); /** @@ -1631,9 +1737,9 @@ u_isalnum(UChar32 c); * @param c the code point to be tested * @return TRUE if the code point is a hexadecimal digit * - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_isxdigit(UChar32 c); /** @@ -1647,9 +1753,9 @@ u_isxdigit(UChar32 c); * @param c the code point to be tested * @return TRUE if the code point is a punctuation character * - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_ispunct(UChar32 c); /** @@ -1666,9 +1772,9 @@ u_ispunct(UChar32 c); * @param c the code point to be tested * @return TRUE if the code point is a "graphic" character * - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_isgraph(UChar32 c); /** @@ -1695,9 +1801,9 @@ u_isgraph(UChar32 c); * @param c the code point to be tested * @return TRUE if the code point is a "blank" * - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_isblank(UChar32 c); /** @@ -1722,7 +1828,7 @@ u_isblank(UChar32 c); * @see u_istitle * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_isdefined(UChar32 c); /** @@ -1743,7 +1849,7 @@ u_isdefined(UChar32 c); * @see u_isUWhiteSpace * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_isspace(UChar32 c); /** @@ -1762,9 +1868,9 @@ u_isspace(UChar32 c); * @see u_isspace * @see u_isWhitespace * @see u_isUWhiteSpace - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_isJavaSpaceChar(UChar32 c); /** @@ -1798,7 +1904,7 @@ u_isJavaSpaceChar(UChar32 c); * @see u_isUWhiteSpace * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_isWhitespace(UChar32 c); /** @@ -1822,7 +1928,7 @@ u_isWhitespace(UChar32 c); * @see u_isprint * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_iscntrl(UChar32 c); /** @@ -1835,9 +1941,9 @@ u_iscntrl(UChar32 c); * @return TRUE if the code point is an ISO control code * * @see u_iscntrl - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_isISOControl(UChar32 c); /** @@ -1855,7 +1961,7 @@ u_isISOControl(UChar32 c); * @see u_iscntrl * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_isprint(UChar32 c); /** @@ -1876,7 +1982,7 @@ u_isprint(UChar32 c); * @see u_isdigit * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_isbase(UChar32 c); /** @@ -1895,7 +2001,7 @@ u_isbase(UChar32 c); * @see UCharDirection * @stable ICU 2.0 */ -U_CAPI UCharDirection U_EXPORT2 +U_STABLE UCharDirection U_EXPORT2 u_charDirection(UChar32 c); /** @@ -1913,7 +2019,7 @@ u_charDirection(UChar32 c); * @see UCHAR_BIDI_MIRRORED * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_isMirrored(UChar32 c); /** @@ -1935,7 +2041,7 @@ u_isMirrored(UChar32 c); * @see u_isMirrored * @stable ICU 2.0 */ -U_CAPI UChar32 U_EXPORT2 +U_STABLE UChar32 U_EXPORT2 u_charMirror(UChar32 c); /** @@ -1949,7 +2055,7 @@ u_charMirror(UChar32 c); * @see UCharCategory * @stable ICU 2.0 */ -U_CAPI int8_t U_EXPORT2 +U_STABLE int8_t U_EXPORT2 u_charType(UChar32 c); /** @@ -2006,7 +2112,7 @@ UCharEnumTypeRange(const void *context, UChar32 start, UChar32 limit, UCharCateg * @see UCharCategory * @see UCharEnumTypeRange */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 u_enumCharTypes(UCharEnumTypeRange *enumRange, const void *context); #if !UCONFIG_NO_NORMALIZATION @@ -2018,7 +2124,7 @@ u_enumCharTypes(UCharEnumTypeRange *enumRange, const void *context); * @return the combining class of the character * @stable ICU 2.0 */ -U_CAPI uint8_t U_EXPORT2 +U_STABLE uint8_t U_EXPORT2 u_getCombiningClass(UChar32 c); #endif @@ -2046,7 +2152,7 @@ u_getCombiningClass(UChar32 c); * @see u_getNumericValue * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_charDigitValue(UChar32 c); /** @@ -2058,7 +2164,7 @@ u_charDigitValue(UChar32 c); * @see UBlockCode * @stable ICU 2.0 */ -U_CAPI UBlockCode U_EXPORT2 +U_STABLE UBlockCode U_EXPORT2 ublock_getCode(UChar32 c); /** @@ -2093,7 +2199,7 @@ ublock_getCode(UChar32 c); * @see u_enumCharNames * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_charName(UChar32 code, UCharNameChoice nameChoice, char *buffer, int32_t bufferLength, UErrorCode *pErrorCode); @@ -2118,9 +2224,9 @@ u_charName(UChar32 code, UCharNameChoice nameChoice, * length of the name. * The length does not include the zero-termination. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_getISOComment(UChar32 c, char *dest, int32_t destCapacity, UErrorCode *pErrorCode); @@ -2145,7 +2251,7 @@ u_getISOComment(UChar32 c, * @see u_enumCharNames * @stable ICU 1.7 */ -U_CAPI UChar32 U_EXPORT2 +U_STABLE UChar32 U_EXPORT2 u_charFromName(UCharNameChoice nameChoice, const char *name, UErrorCode *pErrorCode); @@ -2194,7 +2300,7 @@ typedef UBool UEnumCharNamesFn(void *context, * @see u_charFromName * @stable ICU 1.7 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 u_enumCharNames(UChar32 start, UChar32 limit, UEnumCharNamesFn *fn, void *context, @@ -2230,9 +2336,9 @@ u_enumCharNames(UChar32 start, UChar32 limit, * * @see UProperty * @see UPropertyNameChoice - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI const char* U_EXPORT2 +U_STABLE const char* U_EXPORT2 u_getPropertyName(UProperty property, UPropertyNameChoice nameChoice); @@ -2253,9 +2359,9 @@ u_getPropertyName(UProperty property, * does not match any property. * * @see UProperty - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI UProperty U_EXPORT2 +U_STABLE UProperty U_EXPORT2 u_getPropertyEnum(const char* alias); /** @@ -2303,9 +2409,9 @@ u_getPropertyEnum(const char* alias); * * @see UProperty * @see UPropertyNameChoice - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI const char* U_EXPORT2 +U_STABLE const char* U_EXPORT2 u_getPropertyValueName(UProperty property, int32_t value, UPropertyNameChoice nameChoice); @@ -2339,9 +2445,9 @@ u_getPropertyValueName(UProperty property, * categories such as [:L:] to be represented. * * @see UProperty - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_getPropertyValueEnum(UProperty property, const char* alias); @@ -2362,7 +2468,7 @@ u_getPropertyValueEnum(UProperty property, * @see u_isIDPart * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_isIDStart(UChar32 c); /** @@ -2386,7 +2492,7 @@ u_isIDStart(UChar32 c); * @see u_isIDIgnorable * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_isIDPart(UChar32 c); /** @@ -2411,7 +2517,7 @@ u_isIDPart(UChar32 c); * @see u_isIDPart * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_isIDIgnorable(UChar32 c); /** @@ -2430,7 +2536,7 @@ u_isIDIgnorable(UChar32 c); * @see u_isIDStart * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_isJavaIDStart(UChar32 c); /** @@ -2451,7 +2557,7 @@ u_isJavaIDStart(UChar32 c); * @see u_isIDPart * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_isJavaIDPart(UChar32 c); /** @@ -2472,7 +2578,7 @@ u_isJavaIDPart(UChar32 c); * otherwise the code point itself. * @stable ICU 2.0 */ -U_CAPI UChar32 U_EXPORT2 +U_STABLE UChar32 U_EXPORT2 u_tolower(UChar32 c); /** @@ -2493,7 +2599,7 @@ u_tolower(UChar32 c); * otherwise the code point itself. * @stable ICU 2.0 */ -U_CAPI UChar32 U_EXPORT2 +U_STABLE UChar32 U_EXPORT2 u_toupper(UChar32 c); /** @@ -2514,7 +2620,7 @@ u_toupper(UChar32 c); * otherwise the code point itself. * @stable ICU 2.0 */ -U_CAPI UChar32 U_EXPORT2 +U_STABLE UChar32 U_EXPORT2 u_totitle(UChar32 c); /** Option value for case folding: use default mappings defined in CaseFolding.txt. @stable ICU 2.0 */ @@ -2556,7 +2662,7 @@ u_totitle(UChar32 c); * otherwise the code point itself. * @stable ICU 2.0 */ -U_CAPI UChar32 U_EXPORT2 +U_STABLE UChar32 U_EXPORT2 u_foldCase(UChar32 c, uint32_t options); /** @@ -2597,7 +2703,7 @@ u_foldCase(UChar32 c, uint32_t options); * @see u_isdigit * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_digit(UChar32 ch, int8_t radix); /** @@ -2628,7 +2734,7 @@ u_digit(UChar32 ch, int8_t radix); * @see u_isdigit * @stable ICU 2.0 */ -U_CAPI UChar32 U_EXPORT2 +U_STABLE UChar32 U_EXPORT2 u_forDigit(int32_t digit, int8_t radix); /** @@ -2645,7 +2751,7 @@ u_forDigit(int32_t digit, int8_t radix); * * @stable ICU 2.1 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 u_charAge(UChar32 c, UVersionInfo versionArray); /** @@ -2659,7 +2765,7 @@ u_charAge(UChar32 c, UVersionInfo versionArray); * the Unicode version number * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 u_getUnicodeVersion(UVersionInfo versionArray); /** @@ -2681,9 +2787,9 @@ u_getUnicodeVersion(UVersionInfo versionArray); * length of the name. * The length does not include the zero-termination. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_getFC_NFKC_Closure(UChar32 c, UChar *dest, int32_t destCapacity, UErrorCode *pErrorCode); U_CDECL_END diff --git a/icuSources/common/unicode/uchriter.h b/icuSources/common/unicode/uchriter.h index ae16a57a..f81a4bfd 100644 --- a/icuSources/common/unicode/uchriter.h +++ b/icuSources/common/unicode/uchriter.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1998-2003, International Business Machines +* Copyright (C) 1998-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** */ @@ -78,24 +78,24 @@ public: /** * Copy constructor. The new iterator iterates over the same range * of the same string as "that", and its initial position is the - * same as "that"'s current position. + * same as "that"'s current position. * @param that The UCharCharacterIterator to be copied * @stable ICU 2.0 */ UCharCharacterIterator(const UCharCharacterIterator& that); /** - * Destructor. + * Destructor. * @stable ICU 2.0 */ - ~UCharCharacterIterator(); + virtual ~UCharCharacterIterator(); /** * Assignment operator. *this is altered to iterate over the sane * range of the same string as "that", and refers to the same - * character within that string as "that" does. + * character within that string as "that" does. * @param that The object to be copied - * @return the newly created object + * @return the newly created object * @stable ICU 2.0 */ UCharCharacterIterator& @@ -103,7 +103,7 @@ public: /** * Returns true if the iterators iterate over the same range of the - * same string and are pointing at the same character. + * same string and are pointing at the same character. * @param that The ForwardCharacterIterator used to be compared for equality * @return true if the iterators iterate over the same range of the * same string and are pointing at the same character. @@ -112,7 +112,7 @@ public: virtual UBool operator==(const ForwardCharacterIterator& that) const; /** - * Generates a hash code for this iterator. + * Generates a hash code for this iterator. * @return the hash code. * @stable ICU 2.0 */ @@ -121,12 +121,12 @@ public: /** * Returns a new UCharCharacterIterator referring to the same * character in the same range of the same string as this one. The - * caller must delete the new iterator. + * caller must delete the new iterator. * @return the CharacterIterator newly created * @stable ICU 2.0 */ virtual CharacterIterator* clone(void) const; - + /** * Sets the iterator to refer to the first code unit in its * iteration range, and returns that code unit. @@ -188,8 +188,8 @@ public: /** * Sets the iterator to refer to the "position"-th code unit * in the text-storage object the iterator refers to, and - * returns that code unit. - * @position the position within the text-storage object + * returns that code unit. + * @param position the position within the text-storage object * @return the code unit * @stable ICU 2.0 */ @@ -202,21 +202,21 @@ public: * returns that code point. * The current position is adjusted to the beginning of the code point * (its first code unit). - * @position the position within the text-storage object + * @param position the position within the text-storage object * @return the code unit * @stable ICU 2.0 */ virtual UChar32 setIndex32(int32_t position); /** - * Returns the code unit the iterator currently refers to. + * Returns the code unit the iterator currently refers to. * @return the code unit the iterator currently refers to. * @stable ICU 2.0 */ virtual UChar current(void) const; /** - * Returns the code point the iterator currently refers to. + * Returns the code point the iterator currently refers to. * @return the code point the iterator currently refers to. * @stable ICU 2.0 */ @@ -225,8 +225,8 @@ public: /** * Advances to the next code unit in the iteration range (toward * endIndex()), and returns that code unit. If there are no more - * code units to return, returns DONE. - * @return the next code unit in the iteration range. + * code units to return, returns DONE. + * @return the next code unit in the iteration range. * @stable ICU 2.0 */ virtual UChar next(void); @@ -240,11 +240,11 @@ public: * @stable ICU 2.0 */ virtual UChar nextPostInc(void); - + /** * Advances to the next code point in the iteration range (toward * endIndex()), and returns that code point. If there are no more - * code points to return, returns DONE. + * code points to return, returns DONE. * Note that iteration with "pre-increment" semantics is less * efficient than iteration with "post-increment" semantics * that is provided by next32PostInc(). @@ -262,7 +262,7 @@ public: * @stable ICU 2.0 */ virtual UChar32 next32PostInc(void); - + /** * Returns FALSE if there are no more code units or code points * at or after the current position in the iteration range. @@ -277,7 +277,7 @@ public: /** * Advances to the previous code unit in the iteration range (toward * startIndex()), and returns that code unit. If there are no more - * code units to return, returns DONE. + * code units to return, returns DONE. * @return the previous code unit in the iteration range. * @stable ICU 2.0 */ @@ -287,7 +287,7 @@ public: * Advances to the previous code point in the iteration range (toward * startIndex()), and returns that code point. If there are no more * code points to return, returns DONE. - * @return the previous code point in the iteration range. + * @return the previous code point in the iteration range. * @stable ICU 2.0 */ virtual UChar32 previous32(void); @@ -308,9 +308,9 @@ public: * iteration range, or relative to the current position itself. * The movement is expressed in numbers of code units forward * or backward by specifying a positive or negative delta. - * @delta the position relative to origin. A positive delta means forward; + * @param delta the position relative to origin. A positive delta means forward; * a negative delta means backward. - * @origin Origin enumeration {kStart, kCurrent, kEnd} + * @param origin Origin enumeration {kStart, kCurrent, kEnd} * @return the new position * @stable ICU 2.0 */ @@ -321,9 +321,9 @@ public: * iteration range, or relative to the current position itself. * The movement is expressed in numbers of code points forward * or backward by specifying a positive or negative delta. - * @delta the position relative to origin. A positive delta means forward; + * @param delta the position relative to origin. A positive delta means forward; * a negative delta means backward. - * @origin Origin enumeration {kStart, kCurrent, kEnd} + * @param origin Origin enumeration {kStart, kCurrent, kEnd} * @return the new position * @stable ICU 2.0 */ @@ -334,29 +334,29 @@ public: * @stable ICU 2.0 */ void setText(const UChar* newText, int32_t newTextLength); - + /** * Copies the UChar array under iteration into the UnicodeString * referred to by "result". Even if this iterator iterates across * only a part of this string, the whole string is copied. - * @param result Receives a copy of the text under iteration. + * @param result Receives a copy of the text under iteration. * @stable ICU 2.0 */ virtual void getText(UnicodeString& result); /** - * Return a class ID for this object (not really public) - * @return a class ID for this object. + * Return a class ID for this class (not really public) + * @return a class ID for this class * @stable ICU 2.0 */ - virtual UClassID getDynamicClassID(void) const; + static UClassID U_EXPORT2 getStaticClassID(void); /** - * Return a class ID for this class (not really public) - * @return a class ID for this class + * Return a class ID for this object (not really public) + * @return a class ID for this object. * @stable ICU 2.0 */ - static inline UClassID getStaticClassID(void); + virtual UClassID getDynamicClassID(void) const; protected: /** @@ -367,20 +367,10 @@ protected: /** * Protected member text * @stable ICU 2.0 - */ + */ const UChar* text; -private: - static const char fgClassID; }; -inline UClassID -UCharCharacterIterator::getStaticClassID(void) -{ return (UClassID)(&fgClassID); } - -inline UClassID -UCharCharacterIterator::getDynamicClassID(void) const -{ return UCharCharacterIterator::getStaticClassID(); } - U_NAMESPACE_END #endif diff --git a/icuSources/common/unicode/uclean.h b/icuSources/common/unicode/uclean.h index c65251ec..82c6af49 100644 --- a/icuSources/common/unicode/uclean.h +++ b/icuSources/common/unicode/uclean.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * * -* Copyright (C) 2001-2003, International Business Machines * +* Copyright (C) 2001-2004, International Business Machines * * Corporation and others. All Rights Reserved. * * * ****************************************************************************** @@ -33,18 +33,22 @@ * application must guarantee that the first call to u_init() happen * without contention, in a single thread only. *

    + * If u_setMemoryFunctions() or + * u_setMutexFunctions are needed (uncommon), they must be + * called _before_ u_init(). + *

    * Extra, repeated, or otherwise unneeded calls to u_init() do no harm, * other than taking a small amount of time. * - * @param pErrorCode An ICU UErrorCode parameter. It must not be NULL. + * @param status An ICU UErrorCode parameter. It must not be NULL. * An Error will be returned if some required part of ICU data can not * be loaded or initialized. * The function returns immediately if the input error code indicates a * failure, as usual. * - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 u_init(UErrorCode *status); /** @@ -59,6 +63,15 @@ u_init(UErrorCode *status); * the ICU libraries (relatively uncommon), u_cleanup() should be called * just before the library unload. *

    + * u_cleanup() also clears any ICU heap functions, mutex functions or + * trace functions that may have been set for the process. + * This has the effect of restoring ICU to its initial condition, before + * any of these override functions were installed. Refer to + * u_setMemoryFunctions(), u_setMutexFunctions and + * utrace_setFunctions(). If ICU is to be reinitialized after after + * calling u_cleanup(), these runtime override functions will need to + * be set up again if they are still required. + *

    * u_cleanup() is not thread safe. All other threads should stop using ICU * before calling this function. *

    @@ -83,7 +96,155 @@ u_init(UErrorCode *status); * @stable ICU 2.0 * @system */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 u_cleanup(void); + + + +/** + * An opaque pointer type that represents an ICU mutex. + * For user-implemented mutexes, the value will typically point to a + * struct or object that implements the mutex. + * @draft ICU 2.8 + * @system + */ +typedef void *UMTX; + +/** + * Function Pointer type for a user supplied mutex initialization function. + * The user-supplied function will be called by ICU whenever ICU needs to create a + * new mutex. The function implementation should create a mutex, and store a pointer + * to something that uniquely identifies the mutex into the UMTX that is supplied + * as a paramter. + * @param context user supplied value, obtained from from u_setMutexFunctions(). + * @param mutex Receives a pointer that identifies the new mutex. + * The mutex init function must set the UMTX to a non-null value. + * Subsequent calls by ICU to lock, unlock, or destroy a mutex will + * identify the mutex by the UMTX value. + * @param status Error status. Report errors back to ICU by setting this variable + * with an error code. + * @draft ICU 2.8 + * @system + */ +typedef void U_CALLCONV UMtxInitFn (const void *context, UMTX *mutex, UErrorCode* status); + + +/** + * Function Pointer type for a user supplied mutex functions. + * One of the user-supplied functions with this signature will be called by ICU + * whenever ICU needs to lock, unlock, or destroy a mutex. + * @param context user supplied value, obtained from from u_setMutexFunctions(). + * @param mutex specify the mutex on which to operate. + * @draft ICU 2.8 + * @system + */ +typedef void U_CALLCONV UMtxFn (const void *context, UMTX *mutex); + + +/** + * Set the functions that ICU will use for mutex operations + * Use of this function is optional; by default (without this function), ICU will + * directly access system functions for mutex operations + * This function can only be used when ICU is in an initial, unused state, before + * u_init() has been called. + * This function may be used even when ICU has been built without multi-threaded + * support (see ICU_USE_THREADS pre-processor variable, umutex.h) + * @param context This pointer value will be saved, and then (later) passed as + * a parameter to the user-supplied mutex functions each time they + * are called. + * @param init Pointer to a mutex initialization function. Must be non-null. + * @param destroy Pointer to the mutex destroy function. Must be non-null. + * @param lock pointer to the mutex lock function. Must be non-null. + * @param unlock Pointer to the mutex unlock function. Must be non-null. + * @param status Receives error values. + * @draft ICU 2.8 + * @system + */ +U_DRAFT void U_EXPORT2 +u_setMutexFunctions(const void *context, UMtxInitFn *init, UMtxFn *destroy, UMtxFn *lock, UMtxFn *unlock, + UErrorCode *status); + + +/** + * Pointer type for a user supplied atomic increment or decrement function. + * @param context user supplied value, obtained from from u_setAtomicIncDecFunctions(). + * @param p Pointer to a 32 bit int to be incremented or decremented + * @return The value of the variable after the inc or dec operation. + * @draft ICU 2.8 + * @system + */ +typedef int32_t U_CALLCONV UMtxAtomicFn(const void *context, int32_t *p); + +/** + * Set the functions that ICU will use for atomic increment and decrement of int32_t values. + * Use of this function is optional; by default (without this function), ICU will + * use its own internal implementation of atomic increment/decrement. + * This function can only be used when ICU is in an initial, unused state, before + * u_init() has been called. + * @param context This pointer value will be saved, and then (later) passed as + * a parameter to the increment and decrement functions each time they + * are called. This function can only be called + * @param inc Pointer to a function to do an atomic increment operation. Must be non-null. + * @param dec Pointer to a function to do an atomic decrement operation. Must be non-null. + * @param status Receives error values. + * @draft ICU 2.8 + * @system + */ +U_DRAFT void U_EXPORT2 +u_setAtomicIncDecFunctions(const void *context, UMtxAtomicFn *inc, UMtxAtomicFn *dec, + UErrorCode *status); + + + +/** + * Pointer type for a user supplied memory allocation function. + * @param context user supplied value, obtained from from u_setMemoryFunctions(). + * @param size The number of bytes to be allocated + * @return Pointer to the newly allocated memory, or NULL if the allocation failed. + * @draft ICU 2.8 + * @system + */ +typedef void *U_CALLCONV UMemAllocFn(const void *context, size_t size); +/** + * Pointer type for a user supplied memory re-allocation function. + * @param context user supplied value, obtained from from u_setMemoryFunctions(). + * @param size The number of bytes to be allocated + * @return Pointer to the newly allocated memory, or NULL if the allocation failed. + * @draft ICU 2.8 + * @system + */ +typedef void *U_CALLCONV UMemReallocFn(const void *context, void *mem, size_t size); +/** + * Pointer type for a user supplied memory free function. Behavior should be + * similar the standard C library free(). + * @param context user supplied value, obtained from from u_setMemoryFunctions(). + * @param mem Pointer to the memory block to be resized + * @param size The new size for the block + * @return Pointer to the resized memory block, or NULL if the resizing failed. + * @draft ICU 2.8 + * @system + */ +typedef void U_CALLCONV UMemFreeFn (const void *context, void *mem); + +/** + * Set the functions that ICU will use for memory allocation. + * Use of this function is optional; by default (without this function), ICU will + * use the standard C library malloc() and free() functions. + * This function can only be used when ICU is in an initial, unused state, before + * u_init() has been called. + * @param context This pointer value will be saved, and then (later) passed as + * a parameter to the memory functions each time they + * are called. + * @param a Pointer to a user-supplied malloc function. + * @param r Pointer to a user-supplied realloc function. + * @param f Pointer to a user-supplied free function. + * @param status Receives error values. + * @draft ICU 2.8 + * @system + */ +U_DRAFT void U_EXPORT2 +u_setMemoryFunctions(const void *context, UMemAllocFn *a, UMemReallocFn *r, UMemFreeFn *f, + UErrorCode *status); + #endif diff --git a/icuSources/common/unicode/ucnv.h b/icuSources/common/unicode/ucnv.h index 4bb0e6c5..a042f7ab 100644 --- a/icuSources/common/unicode/ucnv.h +++ b/icuSources/common/unicode/ucnv.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * ucnv.h: @@ -23,20 +23,20 @@ *

    Character Conversion C API

    * *

    This API is used to convert codepage or character encoded data to and - * from UTF-16. You can open a converter with {@link ucnv_open()}. With that + * from UTF-16. You can open a converter with {@link ucnv_open() }. With that * converter, you can get its properties, set options, convert your data and * close the converter.

    * *

    Since many software programs recogize different converter names for * different types of converters, there are other functions in this API to - * iterate over the converter aliases. The functions {@link ucnv_getAvailableName()}, - * {@link ucnv_getAlias()} and {@link ucnv_getStandardName()} are some of the + * iterate over the converter aliases. The functions {@link ucnv_getAvailableName() }, + * {@link ucnv_getAlias() } and {@link ucnv_getStandardName() } are some of the * more frequently used alias functions to get this information.

    * *

    When a converter encounters an illegal, irregular, invalid or unmappable character * its default behavior is to use a substitution character to replace the - * bad byte sequence. This behavior can be changed by using {@link ucnv_getFromUCallBack()} - * or {@link ucnv_getToUCallBack()} on the converter. The header ucnv_err.h defines + * bad byte sequence. This behavior can be changed by using {@link ucnv_getFromUCallBack() } + * or {@link ucnv_getToUCallBack() } on the converter. The header ucnv_err.h defines * many other callback actions that can be used instead of a character substitution.

    * *

    More information about this API can be found in our @@ -47,13 +47,6 @@ #ifndef UCNV_H #define UCNV_H -/** Forward declaring the UConverter structure. @stable ICU 2.0 */ -struct UConverter; - -/** @stable ICU 2.0 */ -typedef struct UConverter UConverter; - -#include "unicode/utypes.h" #include "unicode/ucnv_err.h" #include "unicode/uenum.h" @@ -66,13 +59,16 @@ typedef struct UConverter UConverter; * See unicode/uset.h * * @see ucnv_getUnicodeSet - * @draft ICU 2.6 + * @stable ICU 2.6 */ struct USet; +/** @stable ICU 2.6 */ typedef struct USet USet; #endif +#if !UCONFIG_NO_CONVERSION + U_CDECL_BEGIN /** Maximum length of a converter name including the terminating NULL @stable ICU 2.0 */ @@ -234,7 +230,7 @@ U_CDECL_END * See convrtrs.txt. * * @see ucnv_open - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define UCNV_VERSION_OPTION_STRING ",version=" @@ -246,7 +242,7 @@ U_CDECL_END * See convrtrs.txt. * * @see ucnv_open - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define UCNV_SWAP_LFNL_OPTION_STRING ",swaplfnl" @@ -263,7 +259,7 @@ U_CDECL_END * lexically follows name2. * @stable ICU 2.0 */ -U_CAPI int U_EXPORT2 +U_STABLE int U_EXPORT2 ucnv_compareNames(const char *name1, const char *name2); @@ -302,7 +298,7 @@ ucnv_compareNames(const char *name1, const char *name2); * @see ucnv_close * @stable ICU 2.0 */ -U_CAPI UConverter* U_EXPORT2 +U_STABLE UConverter* U_EXPORT2 ucnv_open(const char *converterName, UErrorCode *err); @@ -329,7 +325,7 @@ ucnv_open(const char *converterName, UErrorCode *err); * @see ucnv_getDefaultName * @stable ICU 2.0 */ -U_CAPI UConverter* U_EXPORT2 +U_STABLE UConverter* U_EXPORT2 ucnv_openU(const UChar *name, UErrorCode *err); @@ -397,7 +393,7 @@ ucnv_openU(const UChar *name, * @see UConverterPlatform * @stable ICU 2.0 */ -U_CAPI UConverter* U_EXPORT2 +U_STABLE UConverter* U_EXPORT2 ucnv_openCCSID(int32_t codepage, UConverterPlatform platform, UErrorCode * err); @@ -414,6 +410,9 @@ ucnv_openCCSID(int32_t codepage, * stored in the converter cache or the alias table. The only way to open further converters * is call this function multiple times, or use the ucnv_safeClone() function to clone a * 'master' converter.

    + * + *

    A future version of ICU may add alias table lookups and/or caching + * to this function.

    * *

    Example Use: * cnv = ucnv_openPackage("myapp", "myconverter", &err); @@ -427,9 +426,9 @@ ucnv_openCCSID(int32_t codepage, * @see ucnv_open * @see ucnv_safeClone * @see ucnv_close - * @draft ICU 2.2 + * @stable ICU 2.2 */ -U_CAPI UConverter* U_EXPORT2 +U_STABLE UConverter* U_EXPORT2 ucnv_openPackage(const char *packageName, const char *converterName, UErrorCode *err); /** @@ -448,14 +447,19 @@ ucnv_openPackage(const char *packageName, const char *converterName, UErrorCode * @return pointer to the new clone * @stable ICU 2.0 */ -U_CAPI UConverter * U_EXPORT2 +U_STABLE UConverter * U_EXPORT2 ucnv_safeClone(const UConverter *cnv, void *stackBuffer, int32_t *pBufferSize, UErrorCode *status); -/** @stable ICU 2.0 */ -#define U_CNV_SAFECLONE_BUFFERSIZE 3072 +/** + * \def U_CNV_SAFECLONE_BUFFERSIZE + * Definition of a buffer size that is designed to be large enough for + * converters to be cloned with ucnv_safeClone(). + * @stable ICU 2.0 + */ +#define U_CNV_SAFECLONE_BUFFERSIZE 1024 /** * Deletes the unicode converter and releases resources associated @@ -468,7 +472,7 @@ ucnv_safeClone(const UConverter *cnv, * @see ucnv_openCCSID * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucnv_close(UConverter * converter); /** @@ -485,7 +489,7 @@ ucnv_close(UConverter * converter); * @see ucnv_setSubstChars * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucnv_getSubstChars(const UConverter *converter, char *subChars, int8_t *len, @@ -503,7 +507,7 @@ ucnv_getSubstChars(const UConverter *converter, * @see ucnv_getSubstChars * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucnv_setSubstChars(UConverter *converter, const char *subChars, int8_t len, @@ -522,7 +526,7 @@ ucnv_setSubstChars(UConverter *converter, * U_INDEX_OUTOFBOUNDS_ERROR will be returned. * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucnv_getInvalidChars(const UConverter *converter, char *errBytes, int8_t *len, @@ -541,7 +545,7 @@ ucnv_getInvalidChars(const UConverter *converter, * U_INDEX_OUTOFBOUNDS_ERROR will be returned. * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucnv_getInvalidUChars(const UConverter *converter, UChar *errUChars, int8_t *len, @@ -554,7 +558,7 @@ ucnv_getInvalidUChars(const UConverter *converter, * @param converter the Unicode converter * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucnv_reset(UConverter *converter); /** @@ -565,7 +569,7 @@ ucnv_reset(UConverter *converter); * @param converter the Unicode converter * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucnv_resetToUnicode(UConverter *converter); /** @@ -576,29 +580,95 @@ ucnv_resetToUnicode(UConverter *converter); * @param converter the Unicode converter * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucnv_resetFromUnicode(UConverter *converter); /** - * Returns the maximum length of bytes used by a character. This varies - * between 1 and 4 - * @param converter the Unicode converter - * @return the maximum number of bytes allowed by this particular converter + * Returns the maximum number of bytes that are output per UChar in conversion + * from Unicode using this converter. + * The returned number can be used with UCNV_GET_MAX_BYTES_FOR_STRING + * to calculate the size of a target buffer for conversion from Unicode. + * + * Note: Before ICU 2.8, this function did not return reliable numbers for + * some stateful converters (EBCDIC_STATEFUL, ISO-2022) and LMBCS. + * + * This number may not be the same as the maximum number of bytes per + * "conversion unit". In other words, it may not be the intuitively expected + * number of bytes per character that would be published for a charset, + * and may not fulfill any other purpose than the allocation of an output + * buffer of guaranteed sufficient size for a given input length and converter. + * + * Examples for special cases that are taken into account: + * - Supplementary code points may convert to more bytes than BMP code points. + * This function returns bytes per UChar (UTF-16 code unit), not per + * Unicode code point, for efficient buffer allocation. + * - State-shifting output (SI/SO, escapes, etc.) from stateful converters. + * - When m input UChars are converted to n output bytes, then the maximum m/n + * is taken into account. + * + * The number returned here does not take into account + * (see UCNV_GET_MAX_BYTES_FOR_STRING): + * - callbacks which output more than one charset character sequence per call, + * like escape callbacks + * - initial and final non-character bytes that are output by some converters + * (automatic BOMs, initial escape sequence, final SI, etc.) + * + * Examples for returned values: + * - SBCS charsets: 1 + * - Shift-JIS: 2 + * - UTF-16: 2 (2 per BMP, 4 per surrogate _pair_, BOM not counted) + * - UTF-8: 3 (3 per BMP, 4 per surrogate _pair_) + * - EBCDIC_STATEFUL (EBCDIC mixed SBCS/DBCS): 3 (SO + DBCS) + * - ISO-2022: 3 (always outputs UTF-8) + * - ISO-2022-JP: 6 (4-byte escape sequences + DBCS) + * - ISO-2022-CN: 8 (4-byte designator sequences + 2-byte SS2/SS3 + DBCS) + * + * @param converter The Unicode converter. + * @return The maximum number of bytes per UChar that are output by ucnv_fromUnicode(), + * to be used together with UCNV_GET_MAX_BYTES_FOR_STRING for buffer allocation. + * + * @see UCNV_GET_MAX_BYTES_FOR_STRING * @see ucnv_getMinCharSize * @stable ICU 2.0 */ -U_CAPI int8_t U_EXPORT2 +U_STABLE int8_t U_EXPORT2 ucnv_getMaxCharSize(const UConverter *converter); +#ifndef U_HIDE_DRAFT_API + +/** + * Calculates the size of a buffer for conversion from Unicode to a charset. + * The calculated size is guaranteed to be sufficient for this conversion. + * + * It takes into account initial and final non-character bytes that are output + * by some converters. + * It does not take into account callbacks which output more than one charset + * character sequence per call, like escape callbacks. + * The default (substitution) callback only outputs one charset character sequence. + * + * @param length Number of UChars to be converted. + * @param maxCharSize Return value from ucnv_getMaxCharSize() for the converter + * that will be used. + * @return Size of a buffer that will be large enough to hold the output bytes of + * converting length UChars with the converter that returned the maxCharSize. + * + * @see ucnv_getMaxCharSize + * @draft ICU 2.8 + */ +#define UCNV_GET_MAX_BYTES_FOR_STRING(length, maxCharSize) \ + (((int32_t)(length)+10)*(int32_t)(maxCharSize)) + +#endif /*U_HIDE_DRAFT_API*/ + /** * Returns the minimum byte length for characters in this codepage. - * This is either 1 or 2 for all supported codepages. + * This is usually either 1 or 2. * @param converter the Unicode converter * @return the minimum number of bytes allowed by this particular converter * @see ucnv_getMaxCharSize * @stable ICU 2.0 */ -U_CAPI int8_t U_EXPORT2 +U_STABLE int8_t U_EXPORT2 ucnv_getMinCharSize(const UConverter *converter); /** @@ -615,7 +685,7 @@ ucnv_getMinCharSize(const UConverter *converter); * @see ucnv_getName * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucnv_getDisplayName(const UConverter *converter, const char *displayLocale, UChar *displayName, @@ -632,7 +702,7 @@ ucnv_getDisplayName(const UConverter *converter, * @see ucnv_getDisplayName * @stable ICU 2.0 */ -U_CAPI const char * U_EXPORT2 +U_STABLE const char * U_EXPORT2 ucnv_getName(const UConverter *converter, UErrorCode *err); /** @@ -658,7 +728,7 @@ ucnv_getName(const UConverter *converter, UErrorCode *err); * @see ucnv_getPlatform * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucnv_getCCSID(const UConverter *converter, UErrorCode *err); @@ -672,7 +742,7 @@ ucnv_getCCSID(const UConverter *converter, * @return The codepage platform * @stable ICU 2.0 */ -U_CAPI UConverterPlatform U_EXPORT2 +U_STABLE UConverterPlatform U_EXPORT2 ucnv_getPlatform(const UConverter *converter, UErrorCode *err); @@ -684,7 +754,7 @@ ucnv_getPlatform(const UConverter *converter, * @return the type of the converter * @stable ICU 2.0 */ -U_CAPI UConverterType U_EXPORT2 +U_STABLE UConverterType U_EXPORT2 ucnv_getType(const UConverter * converter); /** @@ -702,23 +772,25 @@ ucnv_getType(const UConverter * converter); * @see ucnv_getType * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucnv_getStarters(const UConverter* converter, UBool starters[256], UErrorCode* err); + /** * Selectors for Unicode sets that can be returned by ucnv_getUnicodeSet(). * @see ucnv_getUnicodeSet - * @draft ICU 2.6 + * @stable ICU 2.6 */ typedef enum UConverterUnicodeSet { - /** Select the set of roundtrippable Unicode code points. @draft ICU 2.6 */ + /** Select the set of roundtrippable Unicode code points. @stable ICU 2.6 */ UCNV_ROUNDTRIP_SET, - /** Number of UConverterUnicodeSet selectors. @draft ICU 2.6 */ + /** Number of UConverterUnicodeSet selectors. @stable ICU 2.6 */ UCNV_SET_COUNT } UConverterUnicodeSet; + /** * Returns the set of Unicode code points that can be converted by an ICU converter. * @@ -741,9 +813,9 @@ typedef enum UConverterUnicodeSet { * sets with different properties. * * @param cnv The converter for which a set is requested. - * @param set A valid USet; it will be cleared by the function before + * @param setFillIn A valid USet *. It will be cleared by this function before * the converter's specific set is filled into the USet. - * @param which A UConverterUnicodeSet selector; + * @param whichSet A UConverterUnicodeSet selector; * currently UCNV_ROUNDTRIP_SET is the only supported value. * @param pErrorCode ICU error code in/out parameter. * Must fulfill U_SUCCESS before the function call. @@ -751,12 +823,12 @@ typedef enum UConverterUnicodeSet { * @see UConverterUnicodeSet * @see uset_open * @see uset_close - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucnv_getUnicodeSet(const UConverter *cnv, - USet *set, - UConverterUnicodeSet which, + USet *setFillIn, + UConverterUnicodeSet whichSet, UErrorCode *pErrorCode); /** @@ -770,7 +842,7 @@ ucnv_getUnicodeSet(const UConverter *cnv, * @see ucnv_setToUCallBack * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucnv_getToUCallBack (const UConverter * converter, UConverterToUCallback *action, const void **context); @@ -786,7 +858,7 @@ ucnv_getToUCallBack (const UConverter * converter, * @see ucnv_setFromUCallBack * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucnv_getFromUCallBack (const UConverter * converter, UConverterFromUCallback *action, const void **context); @@ -806,7 +878,7 @@ ucnv_getFromUCallBack (const UConverter * converter, * @see ucnv_getToUCallBack * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucnv_setToUCallBack (UConverter * converter, UConverterToUCallback newAction, const void* newContext, @@ -829,7 +901,7 @@ ucnv_setToUCallBack (UConverter * converter, * @see ucnv_getFromUCallBack * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucnv_setFromUCallBack (UConverter * converter, UConverterFromUCallback newAction, const void *newContext, @@ -856,6 +928,12 @@ ucnv_setFromUCallBack (UConverter * converter, * consumed. At that point, the caller should reset the source and * sourceLimit pointers to point to the next chunk. * + * At the end of the stream (flush==TRUE), the input is completely consumed + * when *source==sourceLimit and no error code is set. + * The converter object is then automatically reset by this function. + * (This means that a converter need not be reset explicitly between data + * streams if it finishes the previous stream without errors.) + * * This is a stateful conversion. Additionally, even when all source data has * been consumed, some data may be in the converters' internal state. * Call this function repeatedly, updating the target pointers with @@ -889,7 +967,7 @@ ucnv_setFromUCallBack (UConverter * converter, * @see ucnv_setToUCallBack * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucnv_fromUnicode (UConverter * converter, char **target, const char *targetLimit, @@ -918,6 +996,12 @@ ucnv_fromUnicode (UConverter * converter, * returned, it means that all of the source buffer has been * consumed. At that point, the caller should reset the source and * sourceLimit pointers to point to the next chunk. + * + * At the end of the stream (flush==TRUE), the input is completely consumed + * when *source==sourceLimit and no error code is set + * The converter object is then automatically reset by this function. + * (This means that a converter need not be reset explicitly between data + * streams if it finishes the previous stream without errors.) * * This is a stateful conversion. Additionally, even when all source data has * been consumed, some data may be in the converters' internal state. @@ -952,7 +1036,7 @@ ucnv_fromUnicode (UConverter * converter, * @see ucnv_getNextUChar * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucnv_toUnicode(UConverter *converter, UChar **target, const UChar *targetLimit, @@ -970,7 +1054,7 @@ ucnv_toUnicode(UConverter *converter, * It is only useful for whole strings, not for streaming conversion. * * The maximum output buffer capacity required (barring output from callbacks) will be - * srcLength*ucnv_getMaxCharSize(cnv). + * UCNV_GET_MAX_BYTES_FOR_STRING(srcLength, ucnv_getMaxCharSize(cnv)). * * @param cnv the converter object to be used (ucnv_resetFromUnicode() will be called) * @param src the input Unicode string @@ -986,9 +1070,10 @@ ucnv_toUnicode(UConverter *converter, * and a buffer of the indicated length would need to be passed in * @see ucnv_fromUnicode * @see ucnv_convert + * @see UCNV_GET_MAX_BYTES_FOR_STRING * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucnv_fromUChars(UConverter *cnv, char *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, @@ -1020,18 +1105,46 @@ ucnv_fromUChars(UConverter *cnv, * @see ucnv_convert * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucnv_toUChars(UConverter *cnv, UChar *dest, int32_t destCapacity, const char *src, int32_t srcLength, UErrorCode *pErrorCode); /** - * Will convert a codepage buffer into unicode one character at a time. - *

    This function was written to be efficient when transcoding small - * amounts of data at a time. - * In that case it will be more efficient than \Ref{ucnv_toUnicode}. - * When converting large buffers use \Ref{ucnv_toUnicode}.

    + * Convert a codepage buffer into Unicode one character at a time. + * The input is completely consumed when the U_INDEX_OUTOFBOUNDS_ERROR is set. + * + * Advantage compared to ucnv_toUnicode() or ucnv_toUChars(): + * - Faster for small amounts of data, for most converters, e.g., + * US-ASCII, ISO-8859-1, UTF-8/16/32, and most "normal" charsets. + * (For complex converters, e.g., SCSU, UTF-7 and ISO 2022 variants, + * it uses ucnv_toUnicode() internally.) + * - Convenient. + * + * Limitations compared to ucnv_toUnicode(): + * - Always assumes flush=TRUE. + * This makes ucnv_getNextUChar() unsuitable for "streaming" conversion, + * that is, for where the input is supplied in multiple buffers, + * because ucnv_getNextUChar() will assume the end of the input at the end + * of the first buffer. + * - Does not provide offset output. + * + * It is possible to "mix" ucnv_getNextUChar() and ucnv_toUnicode() because + * ucnv_getNextUChar() uses the current state of the converter + * (unlike ucnv_toUChars() which always resets first). + * However, if ucnv_getNextUChar() is called after ucnv_toUnicode() + * stopped in the middle of a character sequence (with flush=FALSE), + * then ucnv_getNextUChar() will always use the slower ucnv_toUnicode() + * internally until the next character boundary. + * (This is new in ICU 2.6. In earlier releases, ucnv_getNextUChar() had to + * start at a character boundary.) + * + * Instead of using ucnv_getNextUChar(), it is recommended + * to convert using ucnv_toUnicode() or ucnv_toUChars() + * and then iterate over the text using U16_NEXT() or a UCharIterator (uiter.h) + * or a C++ CharacterIterator or similar. + * This allows streaming conversion and offset output, for example. * *

    Handling of surrogate pairs and supplementary-plane code points:
    * There are two different kinds of codepages that provide mappings for surrogate characters: @@ -1068,7 +1181,7 @@ ucnv_toUChars(UConverter *cnv, * @see ucnv_convert * @stable ICU 2.0 */ -U_CAPI UChar32 U_EXPORT2 +U_STABLE UChar32 U_EXPORT2 ucnv_getNextUChar(UConverter * converter, const char **source, const char * sourceLimit, @@ -1200,9 +1313,9 @@ ucnv_getNextUChar(UConverter * converter, * @see ucnv_toUnicode * @see ucnv_fromUChars * @see ucnv_toUChars - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucnv_convertEx(UConverter *targetCnv, UConverter *sourceCnv, char **target, const char *targetLimit, const char **source, const char *sourceLimit, @@ -1266,7 +1379,7 @@ ucnv_convertEx(UConverter *targetCnv, UConverter *sourceCnv, * @see ucnv_getNextUChar * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucnv_convert(const char *toConverterName, const char *fromConverterName, char *target, @@ -1318,9 +1431,9 @@ ucnv_convert(const char *toConverterName, * @see ucnv_toUnicode * @see ucnv_fromUChars * @see ucnv_toUChars - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucnv_toAlgorithmic(UConverterType algorithmicType, UConverter *cnv, char *target, int32_t targetCapacity, @@ -1370,9 +1483,9 @@ ucnv_toAlgorithmic(UConverterType algorithmicType, * @see ucnv_toUnicode * @see ucnv_fromUChars * @see ucnv_toUChars - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucnv_fromAlgorithmic(UConverter *cnv, UConverterType algorithmicType, char *target, int32_t targetCapacity, @@ -1386,7 +1499,7 @@ ucnv_fromAlgorithmic(UConverter *cnv, * @see ucnv_close * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucnv_flushCache(void); /** @@ -1396,7 +1509,7 @@ ucnv_flushCache(void); * @see ucnv_getAvailableName * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucnv_countAvailable(void); /** @@ -1409,7 +1522,7 @@ ucnv_countAvailable(void); * @see ucnv_countAvailable * @stable ICU 2.0 */ -U_CAPI const char* U_EXPORT2 +U_STABLE const char* U_EXPORT2 ucnv_getAvailableName(int32_t n); /** @@ -1422,9 +1535,9 @@ ucnv_getAvailableName(int32_t n); * @see ucnv_getAvailableName * @see uenum_close * @see uenum_next - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI UEnumeration * U_EXPORT2 +U_STABLE UEnumeration * U_EXPORT2 ucnv_openAllNames(UErrorCode *pErrorCode); /** @@ -1437,7 +1550,7 @@ ucnv_openAllNames(UErrorCode *pErrorCode); * @return number of names on alias list for given alias * @stable ICU 2.0 */ -U_CAPI uint16_t U_EXPORT2 +U_STABLE uint16_t U_EXPORT2 ucnv_countAliases(const char *alias, UErrorCode *pErrorCode); /** @@ -1452,7 +1565,7 @@ ucnv_countAliases(const char *alias, UErrorCode *pErrorCode); * @see ucnv_countAliases * @stable ICU 2.0 */ -U_CAPI const char * U_EXPORT2 +U_STABLE const char * U_EXPORT2 ucnv_getAlias(const char *alias, uint16_t n, UErrorCode *pErrorCode); /** @@ -1468,7 +1581,7 @@ ucnv_getAlias(const char *alias, uint16_t n, UErrorCode *pErrorCode); * @param pErrorCode result of operation * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucnv_getAliases(const char *alias, const char **aliases, UErrorCode *pErrorCode); /** @@ -1492,9 +1605,9 @@ ucnv_getAliases(const char *alias, const char **aliases, UErrorCode *pErrorCode) * @see ucnv_getStandardName * @see uenum_close * @see uenum_next - * @draft ICU 2.2 + * @stable ICU 2.2 */ -U_CAPI UEnumeration * U_EXPORT2 +U_STABLE UEnumeration * U_EXPORT2 ucnv_openStandardNames(const char *convName, const char *standard, UErrorCode *pErrorCode); @@ -1504,7 +1617,7 @@ ucnv_openStandardNames(const char *convName, * @return number of standards * @stable ICU 2.0 */ -U_CAPI uint16_t U_EXPORT2 +U_STABLE uint16_t U_EXPORT2 ucnv_countStandards(void); /** @@ -1514,7 +1627,7 @@ ucnv_countStandards(void); * @return returns the name of the standard at given index. Owned by the library. * @stable ICU 2.0 */ -U_CAPI const char * U_EXPORT2 +U_STABLE const char * U_EXPORT2 ucnv_getStandard(uint16_t n, UErrorCode *pErrorCode); /** @@ -1536,7 +1649,7 @@ ucnv_getStandard(uint16_t n, UErrorCode *pErrorCode); * then NULL is returned. Owned by the library. * @stable ICU 2.0 */ -U_CAPI const char * U_EXPORT2 +U_STABLE const char * U_EXPORT2 ucnv_getStandardName(const char *name, const char *standard, UErrorCode *pErrorCode); /** @@ -1556,9 +1669,9 @@ ucnv_getStandardName(const char *name, const char *standard, UErrorCode *pErrorC * then NULL is returned. The returned string is * owned by the library. * @see ucnv_getStandardName - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI const char * U_EXPORT2 +U_STABLE const char * U_EXPORT2 ucnv_getCanonicalName(const char *alias, const char *standard, UErrorCode *pErrorCode); /** @@ -1571,7 +1684,7 @@ ucnv_getCanonicalName(const char *alias, const char *standard, UErrorCode *pErro * @see ucnv_setDefaultName * @stable ICU 2.0 */ -U_CAPI const char * U_EXPORT2 +U_STABLE const char * U_EXPORT2 ucnv_getDefaultName(void); /** @@ -1582,7 +1695,7 @@ ucnv_getDefaultName(void); * @system SYSTEM API * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucnv_setDefaultName(const char *name); /** @@ -1602,7 +1715,7 @@ ucnv_setDefaultName(const char *name); * @see ucnv_isAmbiguous * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucnv_fixFileSeparator(const UConverter *cnv, UChar *source, int32_t sourceLen); /** @@ -1613,7 +1726,7 @@ ucnv_fixFileSeparator(const UConverter *cnv, UChar *source, int32_t sourceLen); * character, FALSE otherwise. * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 ucnv_isAmbiguous(const UConverter *cnv); /** @@ -1623,7 +1736,7 @@ ucnv_isAmbiguous(const UConverter *cnv); * mapping, FALSE otherwise. * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucnv_setFallback(UConverter *cnv, UBool usesFallback); /** @@ -1632,7 +1745,7 @@ ucnv_setFallback(UConverter *cnv, UBool usesFallback); * @return TRUE if the converter uses fallback, FALSE otherwise. * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 ucnv_usesFallback(const UConverter *cnv); /** @@ -1692,12 +1805,13 @@ ucnv_usesFallback(const UConverter *cnv); * @return The name of the encoding detected. NULL if encoding is not detected. * @stable ICU 2.4 */ -U_CAPI const char* U_EXPORT2 +U_STABLE const char* U_EXPORT2 ucnv_detectUnicodeSignature(const char* source, int32_t sourceLength, int32_t *signatureLength, UErrorCode *pErrorCode); #endif -/*_UCNV*/ +#endif +/*_UCNV*/ diff --git a/icuSources/common/unicode/ucnv_cb.h b/icuSources/common/unicode/ucnv_cb.h index 315cab3d..f0e67ba1 100644 --- a/icuSources/common/unicode/ucnv_cb.h +++ b/icuSources/common/unicode/ucnv_cb.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2000-2001, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * ucnv_cb.h: @@ -62,6 +62,9 @@ #define UCNV_CB_H #include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + #include "unicode/ucnv.h" #include "unicode/ucnv_err.h" @@ -79,7 +82,7 @@ * @see ucnv_cbFromUWriteSub * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucnv_cbFromUWriteBytes (UConverterFromUnicodeArgs *args, const char* source, int32_t length, @@ -99,7 +102,7 @@ ucnv_cbFromUWriteBytes (UConverterFromUnicodeArgs *args, * @see ucnv_cbFromUWriteBytes * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucnv_cbFromUWriteSub (UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorCode * err); @@ -116,7 +119,7 @@ ucnv_cbFromUWriteSub (UConverterFromUnicodeArgs *args, * @see ucnv_cbToUWriteSub * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 ucnv_cbFromUWriteUChars(UConverterFromUnicodeArgs *args, +U_STABLE void U_EXPORT2 ucnv_cbFromUWriteUChars(UConverterFromUnicodeArgs *args, const UChar** source, const UChar* sourceLimit, int32_t offsetIndex, @@ -135,7 +138,7 @@ U_CAPI void U_EXPORT2 ucnv_cbFromUWriteUChars(UConverterFromUnicodeArgs *args, * @see ucnv_cbToUWriteSub * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 ucnv_cbToUWriteUChars (UConverterToUnicodeArgs *args, +U_STABLE void U_EXPORT2 ucnv_cbToUWriteUChars (UConverterToUnicodeArgs *args, const UChar* source, int32_t length, int32_t offsetIndex, @@ -151,7 +154,9 @@ U_CAPI void U_EXPORT2 ucnv_cbToUWriteUChars (UConverterToUnicodeArgs *args, * @see ucnv_cbToUWriteUChars * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 ucnv_cbToUWriteSub (UConverterToUnicodeArgs *args, +U_STABLE void U_EXPORT2 ucnv_cbToUWriteSub (UConverterToUnicodeArgs *args, int32_t offsetIndex, UErrorCode * err); #endif + +#endif diff --git a/icuSources/common/unicode/ucnv_err.h b/icuSources/common/unicode/ucnv_err.h index 58a610c3..2a6104c7 100644 --- a/icuSources/common/unicode/ucnv_err.h +++ b/icuSources/common/unicode/ucnv_err.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -80,17 +80,18 @@ * substituted to be the default substitution character. */ -/* This file isn't designed to be included all by itself. */ -#ifndef UCNV_H -# include "unicode/ucnv.h" - /* and the rest of this file will be ignored. */ -#endif - #ifndef UCNV_ERR_H #define UCNV_ERR_H #include "unicode/utypes.h" +#if !UCONFIG_NO_CONVERSION + +/** Forward declaring the UConverter structure. @stable ICU 2.0 */ +struct UConverter; + +/** @stable ICU 2.0 */ +typedef struct UConverter UConverter; /** * FROM_U, TO_U context options for sub callback @@ -110,13 +111,13 @@ */ #define UCNV_ESCAPE_ICU NULL /** - * FROM_U_CALLBACK_ESCAPE context option to escape the code unit according to JAVA (\uXXXX) + * FROM_U_CALLBACK_ESCAPE context option to escape the code unit according to JAVA (\\uXXXX) * @stable ICU 2.0 */ #define UCNV_ESCAPE_JAVA "J" /** - * FROM_U_CALLBACK_ESCAPE context option to escape the code unit according to C (\uXXXX \UXXXXXXXX) - * TO_U_CALLBACK_ESCAPE option to escape the character value accoding to C (\xXXXX) + * FROM_U_CALLBACK_ESCAPE context option to escape the code unit according to C (\\uXXXX \\UXXXXXXXX) + * TO_U_CALLBACK_ESCAPE option to escape the character value accoding to C (\\xXXXX) * @stable ICU 2.0 */ #define UCNV_ESCAPE_C "C" @@ -148,15 +149,15 @@ typedef enum { UCNV_UNASSIGNED = 0, /**< The code point is unassigned. The error code U_INVALID_CHAR_FOUND will be set. */ UCNV_ILLEGAL = 1, /**< The code point is illegal. For example, - \x81\x2E is illegal in SJIS because \x2E - is not a valid trail byte for the \x81 + \\x81\\x2E is illegal in SJIS because \\x2E + is not a valid trail byte for the \\x81 lead byte. Also, starting with Unicode 3.0.1, non-shortest byte sequences - in UTF-8 (like \xC1\xA1 instead of \x61 for U+0061) + in UTF-8 (like \\xC1\\xA1 instead of \\x61 for U+0061) are also illegal, not just irregular. The error code U_ILLEGAL_CHAR_FOUND will be set. */ UCNV_IRREGULAR = 2, /**< The codepoint is not a regular sequence in - the encoding. For example, \xED\xA0\x80..\xED\xBF\xBF + the encoding. For example, \\xED\\xA0\\x80..\\xED\\xBF\\xBF are irregular UTF-8 byte sequences for single surrogate code points. The error code U_INVALID_CHAR_FOUND will be set. */ @@ -172,7 +173,7 @@ typedef enum { by the new converter, the callback must clone the data and call ucnv_setFromUCallback (or setToUCallback) with the correct pointer. - @draft ICU 2.2 + @stable ICU 2.2 */ } UConverterCallbackReason; @@ -223,7 +224,7 @@ typedef struct { * @param err This should always be set to a failure status prior to calling. * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 UCNV_FROM_U_CALLBACK_STOP ( +U_STABLE void U_EXPORT2 UCNV_FROM_U_CALLBACK_STOP ( const void *context, UConverterFromUnicodeArgs *fromUArgs, const UChar* codeUnits, @@ -247,7 +248,7 @@ U_CAPI void U_EXPORT2 UCNV_FROM_U_CALLBACK_STOP ( * @param err This should always be set to a failure status prior to calling. * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 UCNV_TO_U_CALLBACK_STOP ( +U_STABLE void U_EXPORT2 UCNV_TO_U_CALLBACK_STOP ( const void *context, UConverterToUnicodeArgs *toUArgs, const char* codeUnits, @@ -274,7 +275,7 @@ U_CAPI void U_EXPORT2 UCNV_TO_U_CALLBACK_STOP ( * otherwise this value will be set to a failure status. * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 UCNV_FROM_U_CALLBACK_SKIP ( +U_STABLE void U_EXPORT2 UCNV_FROM_U_CALLBACK_SKIP ( const void *context, UConverterFromUnicodeArgs *fromUArgs, const UChar* codeUnits, @@ -304,7 +305,7 @@ U_CAPI void U_EXPORT2 UCNV_FROM_U_CALLBACK_SKIP ( * @see ucnv_setSubstChars * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 UCNV_FROM_U_CALLBACK_SUBSTITUTE ( +U_STABLE void U_EXPORT2 UCNV_FROM_U_CALLBACK_SUBSTITUTE ( const void *context, UConverterFromUnicodeArgs *fromUArgs, const UChar* codeUnits, @@ -327,17 +328,17 @@ U_CAPI void U_EXPORT2 UCNV_FROM_U_CALLBACK_SUBSTITUTE ( * Note that codeUnit(32bit int eg: unit of a surrogate pair) is represented as * %UD84D%UDC56 *

  • UCNV_ESCAPE_JAVA: Substitues the ILLEGAL SEQUENCE with the hexadecimal - * representation in the format \uXXXX, e.g. "\uFFFE\u00AC\uC8FE"). + * representation in the format \\uXXXX, e.g. "\\uFFFE\\u00AC\\uC8FE"). * In the Event the converter doesn't support the characters {\,u}[A-F][0-9], * it will substitute the illegal sequence with the substitution characters. * Note that codeUnit(32bit int eg: unit of a surrogate pair) is represented as - * \uD84D\uDC56
  • + * \\uD84D\\uDC56 *
  • UCNV_ESCAPE_C: Substitues the ILLEGAL SEQUENCE with the hexadecimal - * representation in the format \uXXXX, e.g. "\uFFFE\u00AC\uC8FE"). + * representation in the format \\uXXXX, e.g. "\\uFFFE\\u00AC\\uC8FE"). * In the Event the converter doesn't support the characters {\,u,U}[A-F][0-9], * it will substitute the illegal sequence with the substitution characters. * Note that codeUnit(32bit int eg: unit of a surrogate pair) is represented as - * \U00023456
  • + * \\U00023456 *
  • UCNV_ESCAPE_XML_DEC: Substitues the ILLEGAL SEQUENCE with the decimal * representation in the format &#DDDDDDDD;, e.g. "&#65534;&#172;&#51454;"). * In the Event the converter doesn't support the characters {&,#}[0-9], @@ -360,7 +361,7 @@ U_CAPI void U_EXPORT2 UCNV_FROM_U_CALLBACK_SUBSTITUTE ( * otherwise this value will be set to a failure status. * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 UCNV_FROM_U_CALLBACK_ESCAPE ( +U_STABLE void U_EXPORT2 UCNV_FROM_U_CALLBACK_ESCAPE ( const void *context, UConverterFromUnicodeArgs *fromUArgs, const UChar* codeUnits, @@ -388,7 +389,7 @@ U_CAPI void U_EXPORT2 UCNV_FROM_U_CALLBACK_ESCAPE ( * otherwise this value will be set to a failure status. * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 UCNV_TO_U_CALLBACK_SKIP ( +U_STABLE void U_EXPORT2 UCNV_TO_U_CALLBACK_SKIP ( const void *context, UConverterToUnicodeArgs *toUArgs, const char* codeUnits, @@ -414,7 +415,7 @@ U_CAPI void U_EXPORT2 UCNV_TO_U_CALLBACK_SKIP ( * otherwise this value will be set to a failure status. * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 UCNV_TO_U_CALLBACK_SUBSTITUTE ( +U_STABLE void U_EXPORT2 UCNV_TO_U_CALLBACK_SUBSTITUTE ( const void *context, UConverterToUnicodeArgs *toUArgs, const char* codeUnits, @@ -440,7 +441,7 @@ U_CAPI void U_EXPORT2 UCNV_TO_U_CALLBACK_SUBSTITUTE ( * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 UCNV_TO_U_CALLBACK_ESCAPE ( +U_STABLE void U_EXPORT2 UCNV_TO_U_CALLBACK_ESCAPE ( const void *context, UConverterToUnicodeArgs *toUArgs, const char* codeUnits, @@ -450,4 +451,6 @@ U_CAPI void U_EXPORT2 UCNV_TO_U_CALLBACK_ESCAPE ( #endif +#endif + /*UCNV_ERR_H*/ diff --git a/icuSources/common/unicode/uconfig.h b/icuSources/common/unicode/uconfig.h index b951101b..997cf686 100644 --- a/icuSources/common/unicode/uconfig.h +++ b/icuSources/common/unicode/uconfig.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2002-2003, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * file name: uconfig.h @@ -24,7 +24,7 @@ * The switches are fairly coarse, controlling large modules. * Basic services cannot be turned off. * - * @draft ICU 2.4 + * @stable ICU 2.4 */ /** @@ -36,7 +36,7 @@ * If you want "only collation" and do not build for EBCDIC, * then you can #define UCONFIG_NO_LEGACY_CONVERSION 1 as well. * - * @draft ICU 2.4 + * @stable ICU 2.4 */ #ifndef UCONFIG_ONLY_COLLATION # define UCONFIG_ONLY_COLLATION 0 @@ -58,6 +58,21 @@ /* common library switches -------------------------------------------------- */ +/** + * \def UCONFIG_NO_CONVERSION + * ICU will not completely build with this switch turned on. + * This switch turns off all converters. + * + * @draft ICU 3.2 + */ +#ifndef UCONFIG_NO_CONVERSION +# define UCONFIG_NO_CONVERSION 0 +#endif + +#if UCONFIG_NO_CONVERSION +# define UCONFIG_NO_LEGACY_CONVERSION 1 +#endif + /** * \def UCONFIG_NO_LEGACY_CONVERSION * This switch turns off all converters except for @@ -68,7 +83,7 @@ * Turning off legacy conversion is not possible on EBCDIC platforms * because they need ibm-37 or ibm-1047 default converters. * - * @draft ICU 2.4 + * @stable ICU 2.4 */ #ifndef UCONFIG_NO_LEGACY_CONVERSION # define UCONFIG_NO_LEGACY_CONVERSION 0 @@ -80,7 +95,7 @@ * It implies turning off several other services as well, for example * collation and IDNA. * - * @draft ICU 2.6 + * @stable ICU 2.6 */ #ifndef UCONFIG_NO_NORMALIZATION # define UCONFIG_NO_NORMALIZATION 0 @@ -100,7 +115,7 @@ * \def UCONFIG_NO_BREAK_ITERATION * This switch turns off break iteration. * - * @draft ICU 2.4 + * @stable ICU 2.4 */ #ifndef UCONFIG_NO_BREAK_ITERATION # define UCONFIG_NO_BREAK_ITERATION 0 @@ -110,7 +125,7 @@ * \def UCONFIG_NO_IDNA * This switch turns off IDNA. * - * @draft ICU 2.6 + * @stable ICU 2.6 */ #ifndef UCONFIG_NO_IDNA # define UCONFIG_NO_IDNA 0 @@ -119,10 +134,10 @@ /* i18n library switches ---------------------------------------------------- */ /** - * \def + * \def UCONFIG_NO_COLLATION * This switch turns off collation and collation-based string search. * - * @draft ICU 2.4 + * @stable ICU 2.4 */ #ifndef UCONFIG_NO_COLLATION # define UCONFIG_NO_COLLATION 0 @@ -132,7 +147,7 @@ * \def UCONFIG_NO_FORMATTING * This switch turns off formatting and calendar/timezone services. * - * @draft ICU 2.4 + * @stable ICU 2.4 */ #ifndef UCONFIG_NO_FORMATTING # define UCONFIG_NO_FORMATTING 0 @@ -142,7 +157,7 @@ * \def UCONFIG_NO_TRANSLITERATION * This switch turns off transliteration. * - * @draft ICU 2.4 + * @stable ICU 2.4 */ #ifndef UCONFIG_NO_TRANSLITERATION # define UCONFIG_NO_TRANSLITERATION 0 @@ -152,12 +167,20 @@ * \def UCONFIG_NO_REGULAR_EXPRESSIONS * This switch turns off regular expressions. * - * @draft ICU 2.4 + * @stable ICU 2.4 */ #ifndef UCONFIG_NO_REGULAR_EXPRESSIONS # define UCONFIG_NO_REGULAR_EXPRESSIONS 0 #endif - +/** + * \def UCONFIG_NO_SERVICE + * This switch turns off service registration. + * + * @draft ICU 3.2 + */ +#ifndef UCONFIG_NO_SERVICE +# define UCONFIG_NO_SERVICE 0 +#endif #endif diff --git a/icuSources/common/unicode/udata.h b/icuSources/common/unicode/udata.h index 18eb531c..ef81cc66 100644 --- a/icuSources/common/unicode/udata.h +++ b/icuSources/common/unicode/udata.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -36,6 +36,36 @@ U_CDECL_BEGIN * See the User Guide Data Management chapter. */ +/** + * Character used to separate package names from tree names + * @internal ICU 3.0 + */ +#define U_TREE_SEPARATOR '-' + +/** + * String used to separate package names from tree names + * @internal ICU 3.0 + */ +#define U_TREE_SEPARATOR_STRING "-" + +/** + * Character used to separate parts of entry names + * @internal ICU 3.0 + */ +#define U_TREE_ENTRY_SEP_CHAR '/' + +/** + * String used to separate parts of entry names + * @internal ICU 3.0 + */ +#define U_TREE_ENTRY_SEP_STRING "/" + +/** + * Alias for standard ICU data + * @internal ICU 3.0 + */ +#define U_ICUDATA_ALIAS "ICUDATA" + /** * UDataInfo contains the properties about the requested data. * This is meta data. @@ -70,40 +100,40 @@ U_CDECL_BEGIN * @stable ICU 2.0 */ typedef struct { - /** @memo sizeof(UDataInfo) + /** sizeof(UDataInfo) * @stable ICU 2.0 */ uint16_t size; - /** @memo unused, set to 0 + /** unused, set to 0 * @stable ICU 2.0*/ uint16_t reservedWord; /* platform data properties */ - /** @memo 0 for little-endian machine, 1 for big-endian + /** 0 for little-endian machine, 1 for big-endian * @stable ICU 2.0 */ uint8_t isBigEndian; - /** @memo see U_CHARSET_FAMILY values in utypes.h + /** see U_CHARSET_FAMILY values in utypes.h * @stable ICU 2.0*/ uint8_t charsetFamily; - /** @memo sizeof(UChar), one of { 1, 2, 4 } + /** sizeof(UChar), one of { 1, 2, 4 } * @stable ICU 2.0*/ uint8_t sizeofUChar; - /** @memo unused, set to 0 + /** unused, set to 0 * @stable ICU 2.0*/ uint8_t reservedByte; - /** @memo data format identifier + /** data format identifier * @stable ICU 2.0*/ uint8_t dataFormat[4]; - /** @memo versions: [0] major [1] minor [2] milli [3] micro + /** versions: [0] major [1] minor [2] milli [3] micro * @stable ICU 2.0*/ uint8_t formatVersion[4]; - /** @memo versions: [0] major [1] minor [2] milli [3] micro + /** versions: [0] major [1] minor [2] milli [3] micro * @stable ICU 2.0*/ uint8_t dataVersion[4]; } UDataInfo; @@ -156,7 +186,7 @@ UDataMemoryIsAcceptable(void *context, * @see udata_openChoice * @stable ICU 2.0 */ -U_CAPI UDataMemory * U_EXPORT2 +U_STABLE UDataMemory * U_EXPORT2 udata_open(const char *path, const char *type, const char *name, UErrorCode *pErrorCode); @@ -208,7 +238,7 @@ udata_open(const char *path, const char *type, const char *name, * to get a pointer to the actual data. * @stable ICU 2.0 */ -U_CAPI UDataMemory * U_EXPORT2 +U_STABLE UDataMemory * U_EXPORT2 udata_openChoice(const char *path, const char *type, const char *name, UDataMemoryIsAcceptable *isAcceptable, void *context, UErrorCode *pErrorCode); @@ -220,7 +250,7 @@ udata_openChoice(const char *path, const char *type, const char *name, * @param pData The pointer to data memory object * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 udata_close(UDataMemory *pData); /** @@ -229,7 +259,7 @@ udata_close(UDataMemory *pData); * @param pData The pointer to data memory object * @stable ICU 2.0 */ -U_CAPI const void * U_EXPORT2 +U_STABLE const void * U_EXPORT2 udata_getMemory(UDataMemory *pData); /** @@ -250,7 +280,7 @@ udata_getMemory(UDataMemory *pData); * adjusted and only part of the structure will be filled. * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 udata_getInfo(UDataMemory *pData, UDataInfo *pInfo); /** @@ -287,7 +317,7 @@ udata_getInfo(UDataMemory *pData, UDataInfo *pInfo); * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 udata_setCommonData(const void *data, UErrorCode *err); @@ -315,7 +345,7 @@ udata_setCommonData(const void *data, UErrorCode *err); * @see udata_setCommonData * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 udata_setAppData(const char *packageName, const void *data, UErrorCode *err); U_CDECL_END diff --git a/icuSources/common/unicode/udeprctd.h b/icuSources/common/unicode/udeprctd.h new file mode 100644 index 00000000..55301c87 --- /dev/null +++ b/icuSources/common/unicode/udeprctd.h @@ -0,0 +1,39 @@ +/* +******************************************************************************* +* Copyright (C) 2004, International Business Machines +* Corporation and others. All Rights Reserved. +******************************************************************************* +* +* file name: udeprctd.h +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* Created by: gendraft.pl, a perl script written by Ram Viswanadha +* +* Contains data for commenting out APIs. +* Gets included by umachine.h +* +* THIS FILE IS MACHINE-GENERATED, DON'T PLAY WITH IT IF YOU DON'T KNOW WHAT +* YOU ARE DOING, OTHERWISE VERY BAD THINGS WILL HAPPEN! +*/ + +#ifndef UDEPRCTD_H +#define UDEPRCTD_H + +#ifdef U_HIDE_DEPRECATED_API + +#define UBRK_TITLE_3_2 UBRK_TITLE_DEPRECATED_API_DO_NOT_USE +#define ucol_getLocale_3_2 ucol_getLocale_DEPRECATED_API_DO_NOT_USE +#define ULOC_REQUESTED_LOCALE_3_2 ULOC_REQUESTED_LOCALE_DEPRECATED_API_DO_NOT_USE +#define ures_countArrayItems_3_2 ures_countArrayItems_DEPRECATED_API_DO_NOT_USE +#define ures_getVersionNumber_3_2 ures_getVersionNumber_DEPRECATED_API_DO_NOT_USE +#define ures_getLocale_3_2 ures_getLocale_DEPRECATED_API_DO_NOT_USE +#define utrans_open_3_2 utrans_open_DEPRECATED_API_DO_NOT_USE +#define utrans_getID_3_2 utrans_getID_DEPRECATED_API_DO_NOT_USE +#define utrans_unregister_3_2 utrans_unregister_DEPRECATED_API_DO_NOT_USE +#define utrans_getAvailableID_3_2 utrans_getAvailableID_DEPRECATED_API_DO_NOT_USE + +#endif /* U_HIDE_DEPRECATED_API */ +#endif /* UDEPRCTD_H */ + diff --git a/icuSources/common/unicode/udraft.h b/icuSources/common/unicode/udraft.h new file mode 100644 index 00000000..bd92a60d --- /dev/null +++ b/icuSources/common/unicode/udraft.h @@ -0,0 +1,246 @@ +/* +******************************************************************************* +* Copyright (C) 2004, International Business Machines +* Corporation and others. All Rights Reserved. +******************************************************************************* +* +* file name: udraft.h +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* Created by: gendraft.pl, a perl script written by Ram Viswanadha +* +* Contains data for commenting out APIs. +* Gets included by umachine.h +* +* THIS FILE IS MACHINE-GENERATED, DON'T PLAY WITH IT IF YOU DON'T KNOW WHAT +* YOU ARE DOING, OTHERWISE VERY BAD THINGS WILL HAPPEN! +*/ + +#ifndef UDRAFT_H +#define UDRAFT_H + +#ifdef U_HIDE_DRAFT_API + +#define ULineBreakTag_3_2 ULineBreakTag_DRAFT_API_DO_NOT_USE +#define USentenceBreakTag_3_2 USentenceBreakTag_DRAFT_API_DO_NOT_USE +#define ULineBreakTag_3_2 ULineBreakTag_DRAFT_API_DO_NOT_USE +#define USentenceBreakTag_3_2 USentenceBreakTag_DRAFT_API_DO_NOT_USE +#define ubrk_getRuleStatusVec_3_2 ubrk_getRuleStatusVec_DRAFT_API_DO_NOT_USE +#define ubrk_getLocaleByType_3_2 ubrk_getLocaleByType_DRAFT_API_DO_NOT_USE +#define UCAL_EXTENDED_YEAR_3_2 UCAL_EXTENDED_YEAR_DRAFT_API_DO_NOT_USE +#define UCAL_JULIAN_DAY_3_2 UCAL_JULIAN_DAY_DRAFT_API_DO_NOT_USE +#define UCAL_MILLISECONDS_IN_DAY_3_2 UCAL_MILLISECONDS_IN_DAY_DRAFT_API_DO_NOT_USE +#define UCAL_DAY_OF_MONTH_3_2 UCAL_DAY_OF_MONTH_DRAFT_API_DO_NOT_USE +#define ucal_getLocaleByType_3_2 ucal_getLocaleByType_DRAFT_API_DO_NOT_USE +#define UCHAR_S_TERM_3_2 UCHAR_S_TERM_DRAFT_API_DO_NOT_USE +#define UCHAR_VARIATION_SELECTOR_3_2 UCHAR_VARIATION_SELECTOR_DRAFT_API_DO_NOT_USE +#define UCHAR_NFD_INERT_3_2 UCHAR_NFD_INERT_DRAFT_API_DO_NOT_USE +#define UCHAR_NFKD_INERT_3_2 UCHAR_NFKD_INERT_DRAFT_API_DO_NOT_USE +#define UCHAR_NFC_INERT_3_2 UCHAR_NFC_INERT_DRAFT_API_DO_NOT_USE +#define UCHAR_NFKC_INERT_3_2 UCHAR_NFKC_INERT_DRAFT_API_DO_NOT_USE +#define UCHAR_SEGMENT_STARTER_3_2 UCHAR_SEGMENT_STARTER_DRAFT_API_DO_NOT_USE +#define UCHAR_NFD_QUICK_CHECK_3_2 UCHAR_NFD_QUICK_CHECK_DRAFT_API_DO_NOT_USE +#define UCHAR_NFKD_QUICK_CHECK_3_2 UCHAR_NFKD_QUICK_CHECK_DRAFT_API_DO_NOT_USE +#define UCHAR_NFC_QUICK_CHECK_3_2 UCHAR_NFC_QUICK_CHECK_DRAFT_API_DO_NOT_USE +#define UCHAR_NFKC_QUICK_CHECK_3_2 UCHAR_NFKC_QUICK_CHECK_DRAFT_API_DO_NOT_USE +#define UCHAR_LEAD_CANONICAL_COMBINING_CLASS_3_2 UCHAR_LEAD_CANONICAL_COMBINING_CLASS_DRAFT_API_DO_NOT_USE +#define UCHAR_TRAIL_CANONICAL_COMBINING_CLASS_3_2 UCHAR_TRAIL_CANONICAL_COMBINING_CLASS_DRAFT_API_DO_NOT_USE +#define UBLOCK_CYRILLIC_SUPPLEMENT_3_2 UBLOCK_CYRILLIC_SUPPLEMENT_DRAFT_API_DO_NOT_USE +#define U_LB_INSEPARABLE_3_2 U_LB_INSEPARABLE_DRAFT_API_DO_NOT_USE +#define UCNV_GET_MAX_BYTES_FOR_STRING_3_2 UCNV_GET_MAX_BYTES_FOR_STRING_DRAFT_API_DO_NOT_USE +#define ucol_openFromShortString_3_2 ucol_openFromShortString_DRAFT_API_DO_NOT_USE +#define ucol_getContractions_3_2 ucol_getContractions_DRAFT_API_DO_NOT_USE +#define ucol_openAvailableLocales_3_2 ucol_openAvailableLocales_DRAFT_API_DO_NOT_USE +#define ucol_getKeywords_3_2 ucol_getKeywords_DRAFT_API_DO_NOT_USE +#define ucol_getKeywordValues_3_2 ucol_getKeywordValues_DRAFT_API_DO_NOT_USE +#define ucol_getFunctionalEquivalent_3_2 ucol_getFunctionalEquivalent_DRAFT_API_DO_NOT_USE +#define ucol_getShortDefinitionString_3_2 ucol_getShortDefinitionString_DRAFT_API_DO_NOT_USE +#define ucol_normalizeShortDefinitionString_3_2 ucol_normalizeShortDefinitionString_DRAFT_API_DO_NOT_USE +#define ucol_getUCAVersion_3_2 ucol_getUCAVersion_DRAFT_API_DO_NOT_USE +#define ucol_getLocaleByType_3_2 ucol_getLocaleByType_DRAFT_API_DO_NOT_USE +#define ucol_cloneBinary_3_2 ucol_cloneBinary_DRAFT_API_DO_NOT_USE +#define ucol_openBinary_3_2 ucol_openBinary_DRAFT_API_DO_NOT_USE +#define UCONFIG_NO_CONVERSION_3_2 UCONFIG_NO_CONVERSION_DRAFT_API_DO_NOT_USE +#define ucurr_forLocale_3_2 ucurr_forLocale_DRAFT_API_DO_NOT_USE +#define ucurr_getDefaultFractionDigits_3_2 ucurr_getDefaultFractionDigits_DRAFT_API_DO_NOT_USE +#define ucurr_getRoundingIncrement_3_2 ucurr_getRoundingIncrement_DRAFT_API_DO_NOT_USE +#define UDateFormatField_3_2 UDateFormatField_DRAFT_API_DO_NOT_USE +#define UDAT_ERA_FIELD_3_2 UDAT_ERA_FIELD_DRAFT_API_DO_NOT_USE +#define UDAT_YEAR_FIELD_3_2 UDAT_YEAR_FIELD_DRAFT_API_DO_NOT_USE +#define UDAT_MONTH_FIELD_3_2 UDAT_MONTH_FIELD_DRAFT_API_DO_NOT_USE +#define UDAT_DATE_FIELD_3_2 UDAT_DATE_FIELD_DRAFT_API_DO_NOT_USE +#define UDAT_HOUR_OF_DAY1_FIELD_3_2 UDAT_HOUR_OF_DAY1_FIELD_DRAFT_API_DO_NOT_USE +#define UDAT_HOUR_OF_DAY0_FIELD_3_2 UDAT_HOUR_OF_DAY0_FIELD_DRAFT_API_DO_NOT_USE +#define UDAT_MINUTE_FIELD_3_2 UDAT_MINUTE_FIELD_DRAFT_API_DO_NOT_USE +#define UDAT_SECOND_FIELD_3_2 UDAT_SECOND_FIELD_DRAFT_API_DO_NOT_USE +#define UDAT_FRACTIONAL_SECOND_FIELD_3_2 UDAT_FRACTIONAL_SECOND_FIELD_DRAFT_API_DO_NOT_USE +#define UDAT_DAY_OF_WEEK_FIELD_3_2 UDAT_DAY_OF_WEEK_FIELD_DRAFT_API_DO_NOT_USE +#define UDAT_DAY_OF_YEAR_FIELD_3_2 UDAT_DAY_OF_YEAR_FIELD_DRAFT_API_DO_NOT_USE +#define UDAT_DAY_OF_WEEK_IN_MONTH_FIELD_3_2 UDAT_DAY_OF_WEEK_IN_MONTH_FIELD_DRAFT_API_DO_NOT_USE +#define UDAT_WEEK_OF_YEAR_FIELD_3_2 UDAT_WEEK_OF_YEAR_FIELD_DRAFT_API_DO_NOT_USE +#define UDAT_WEEK_OF_MONTH_FIELD_3_2 UDAT_WEEK_OF_MONTH_FIELD_DRAFT_API_DO_NOT_USE +#define UDAT_AM_PM_FIELD_3_2 UDAT_AM_PM_FIELD_DRAFT_API_DO_NOT_USE +#define UDAT_HOUR1_FIELD_3_2 UDAT_HOUR1_FIELD_DRAFT_API_DO_NOT_USE +#define UDAT_HOUR0_FIELD_3_2 UDAT_HOUR0_FIELD_DRAFT_API_DO_NOT_USE +#define UDAT_TIMEZONE_FIELD_3_2 UDAT_TIMEZONE_FIELD_DRAFT_API_DO_NOT_USE +#define UDAT_YEAR_WOY_FIELD_3_2 UDAT_YEAR_WOY_FIELD_DRAFT_API_DO_NOT_USE +#define UDAT_DOW_LOCAL_FIELD_3_2 UDAT_DOW_LOCAL_FIELD_DRAFT_API_DO_NOT_USE +#define UDAT_EXTENDED_YEAR_FIELD_3_2 UDAT_EXTENDED_YEAR_FIELD_DRAFT_API_DO_NOT_USE +#define UDAT_JULIAN_DAY_FIELD_3_2 UDAT_JULIAN_DAY_FIELD_DRAFT_API_DO_NOT_USE +#define UDAT_MILLISECONDS_IN_DAY_FIELD_3_2 UDAT_MILLISECONDS_IN_DAY_FIELD_DRAFT_API_DO_NOT_USE +#define UDAT_TIMEZONE_RFC_FIELD_3_2 UDAT_TIMEZONE_RFC_FIELD_DRAFT_API_DO_NOT_USE +#define UDAT_FIELD_COUNT_3_2 UDAT_FIELD_COUNT_DRAFT_API_DO_NOT_USE +#define UDateFormatField_3_2 UDateFormatField_DRAFT_API_DO_NOT_USE +#define udat_getLocaleByType_3_2 udat_getLocaleByType_DRAFT_API_DO_NOT_USE +#define ULOC_SCRIPT_CAPACITY_3_2 ULOC_SCRIPT_CAPACITY_DRAFT_API_DO_NOT_USE +#define ULOC_KEYWORDS_CAPACITY_3_2 ULOC_KEYWORDS_CAPACITY_DRAFT_API_DO_NOT_USE +#define ULOC_KEYWORD_AND_VALUES_CAPACITY_3_2 ULOC_KEYWORD_AND_VALUES_CAPACITY_DRAFT_API_DO_NOT_USE +#define ULOC_KEYWORD_SEPARATOR_3_2 ULOC_KEYWORD_SEPARATOR_DRAFT_API_DO_NOT_USE +#define ULOC_KEYWORD_ASSIGN_3_2 ULOC_KEYWORD_ASSIGN_DRAFT_API_DO_NOT_USE +#define ULOC_KEYWORD_ITEM_SEPARATOR_3_2 ULOC_KEYWORD_ITEM_SEPARATOR_DRAFT_API_DO_NOT_USE +#define UAcceptResult_3_2 UAcceptResult_DRAFT_API_DO_NOT_USE +#define uloc_getScript_3_2 uloc_getScript_DRAFT_API_DO_NOT_USE +#define uloc_canonicalize_3_2 uloc_canonicalize_DRAFT_API_DO_NOT_USE +#define uloc_getDisplayScript_3_2 uloc_getDisplayScript_DRAFT_API_DO_NOT_USE +#define uloc_getDisplayKeyword_3_2 uloc_getDisplayKeyword_DRAFT_API_DO_NOT_USE +#define uloc_getDisplayKeywordValue_3_2 uloc_getDisplayKeywordValue_DRAFT_API_DO_NOT_USE +#define uloc_getBaseName_3_2 uloc_getBaseName_DRAFT_API_DO_NOT_USE +#define uloc_openKeywords_3_2 uloc_openKeywords_DRAFT_API_DO_NOT_USE +#define uloc_getKeywordValue_3_2 uloc_getKeywordValue_DRAFT_API_DO_NOT_USE +#define uloc_setKeywordValue_3_2 uloc_setKeywordValue_DRAFT_API_DO_NOT_USE +#define uloc_acceptLanguageFromHTTP_3_2 uloc_acceptLanguageFromHTTP_DRAFT_API_DO_NOT_USE +#define uloc_acceptLanguage_3_2 uloc_acceptLanguage_DRAFT_API_DO_NOT_USE +#define UMeasurementSystem_3_2 UMeasurementSystem_DRAFT_API_DO_NOT_USE +#define UMeasurementSystem_3_2 UMeasurementSystem_DRAFT_API_DO_NOT_USE +#define ulocdata_getExemplarSet_3_2 ulocdata_getExemplarSet_DRAFT_API_DO_NOT_USE +#define ulocdata_getMeasurementSystem_3_2 ulocdata_getMeasurementSystem_DRAFT_API_DO_NOT_USE +#define ulocdata_getPaperSize_3_2 ulocdata_getPaperSize_DRAFT_API_DO_NOT_USE +#define UINT64_C_3_2 UINT64_C_DRAFT_API_DO_NOT_USE +#define umsg_getLocaleByType_3_2 umsg_getLocaleByType_DRAFT_API_DO_NOT_USE +#define U_ETHER_3_2 U_ETHER_DRAFT_API_DO_NOT_USE +#define US_INV_3_2 US_INV_DRAFT_API_DO_NOT_USE +#define UNUM_PATTERN_DECIMAL_3_2 UNUM_PATTERN_DECIMAL_DRAFT_API_DO_NOT_USE +#define UNUM_ORDINAL_3_2 UNUM_ORDINAL_DRAFT_API_DO_NOT_USE +#define UNUM_DURATION_3_2 UNUM_DURATION_DRAFT_API_DO_NOT_USE +#define UNUM_PATTERN_RULEBASED_3_2 UNUM_PATTERN_RULEBASED_DRAFT_API_DO_NOT_USE +#define UNUM_SIGNIFICANT_DIGITS_USED_3_2 UNUM_SIGNIFICANT_DIGITS_USED_DRAFT_API_DO_NOT_USE +#define UNUM_MIN_SIGNIFICANT_DIGITS_3_2 UNUM_MIN_SIGNIFICANT_DIGITS_DRAFT_API_DO_NOT_USE +#define UNUM_MAX_SIGNIFICANT_DIGITS_3_2 UNUM_MAX_SIGNIFICANT_DIGITS_DRAFT_API_DO_NOT_USE +#define UNUM_LENIENT_PARSE_3_2 UNUM_LENIENT_PARSE_DRAFT_API_DO_NOT_USE +#define UNUM_DEFAULT_RULESET_3_2 UNUM_DEFAULT_RULESET_DRAFT_API_DO_NOT_USE +#define UNUM_PUBLIC_RULESETS_3_2 UNUM_PUBLIC_RULESETS_DRAFT_API_DO_NOT_USE +#define UNUM_SIGNIFICANT_DIGIT_SYMBOL_3_2 UNUM_SIGNIFICANT_DIGIT_SYMBOL_DRAFT_API_DO_NOT_USE +#define unum_formatDoubleCurrency_3_2 unum_formatDoubleCurrency_DRAFT_API_DO_NOT_USE +#define unum_parseInt64_3_2 unum_parseInt64_DRAFT_API_DO_NOT_USE +#define unum_parseDoubleCurrency_3_2 unum_parseDoubleCurrency_DRAFT_API_DO_NOT_USE +#define unum_getLocaleByType_3_2 unum_getLocaleByType_DRAFT_API_DO_NOT_USE +#define URegularExpression_3_2 URegularExpression_DRAFT_API_DO_NOT_USE +#define UREGEX_CANON_EQ_3_2 UREGEX_CANON_EQ_DRAFT_API_DO_NOT_USE +#define UREGEX_UWORD_3_2 UREGEX_UWORD_DRAFT_API_DO_NOT_USE +#define uregex_open_3_2 uregex_open_DRAFT_API_DO_NOT_USE +#define uregex_openC_3_2 uregex_openC_DRAFT_API_DO_NOT_USE +#define uregex_close_3_2 uregex_close_DRAFT_API_DO_NOT_USE +#define uregex_clone_3_2 uregex_clone_DRAFT_API_DO_NOT_USE +#define uregex_pattern_3_2 uregex_pattern_DRAFT_API_DO_NOT_USE +#define uregex_flags_3_2 uregex_flags_DRAFT_API_DO_NOT_USE +#define uregex_setText_3_2 uregex_setText_DRAFT_API_DO_NOT_USE +#define uregex_getText_3_2 uregex_getText_DRAFT_API_DO_NOT_USE +#define uregex_matches_3_2 uregex_matches_DRAFT_API_DO_NOT_USE +#define uregex_lookingAt_3_2 uregex_lookingAt_DRAFT_API_DO_NOT_USE +#define uregex_find_3_2 uregex_find_DRAFT_API_DO_NOT_USE +#define uregex_findNext_3_2 uregex_findNext_DRAFT_API_DO_NOT_USE +#define uregex_groupCount_3_2 uregex_groupCount_DRAFT_API_DO_NOT_USE +#define uregex_group_3_2 uregex_group_DRAFT_API_DO_NOT_USE +#define uregex_start_3_2 uregex_start_DRAFT_API_DO_NOT_USE +#define uregex_end_3_2 uregex_end_DRAFT_API_DO_NOT_USE +#define uregex_reset_3_2 uregex_reset_DRAFT_API_DO_NOT_USE +#define uregex_replaceAll_3_2 uregex_replaceAll_DRAFT_API_DO_NOT_USE +#define uregex_replaceFirst_3_2 uregex_replaceFirst_DRAFT_API_DO_NOT_USE +#define uregex_appendReplacement_3_2 uregex_appendReplacement_DRAFT_API_DO_NOT_USE +#define uregex_appendTail_3_2 uregex_appendTail_DRAFT_API_DO_NOT_USE +#define uregex_split_3_2 uregex_split_DRAFT_API_DO_NOT_USE +#define ures_getLocaleByType_3_2 ures_getLocaleByType_DRAFT_API_DO_NOT_USE +#define ures_openAvailableLocales_3_2 ures_openAvailableLocales_DRAFT_API_DO_NOT_USE +#define USCRIPT_KATAKANA_OR_HIRAGANA_3_2 USCRIPT_KATAKANA_OR_HIRAGANA_DRAFT_API_DO_NOT_USE +#define USET_ADD_CASE_MAPPINGS_3_2 USET_ADD_CASE_MAPPINGS_DRAFT_API_DO_NOT_USE +#define uset_set_3_2 uset_set_DRAFT_API_DO_NOT_USE +#define uset_applyPattern_3_2 uset_applyPattern_DRAFT_API_DO_NOT_USE +#define uset_applyIntPropertyValue_3_2 uset_applyIntPropertyValue_DRAFT_API_DO_NOT_USE +#define uset_applyPropertyAlias_3_2 uset_applyPropertyAlias_DRAFT_API_DO_NOT_USE +#define uset_resemblesPattern_3_2 uset_resemblesPattern_DRAFT_API_DO_NOT_USE +#define uset_removeAll_3_2 uset_removeAll_DRAFT_API_DO_NOT_USE +#define uset_retain_3_2 uset_retain_DRAFT_API_DO_NOT_USE +#define uset_retainAll_3_2 uset_retainAll_DRAFT_API_DO_NOT_USE +#define uset_compact_3_2 uset_compact_DRAFT_API_DO_NOT_USE +#define uset_complementAll_3_2 uset_complementAll_DRAFT_API_DO_NOT_USE +#define uset_indexOf_3_2 uset_indexOf_DRAFT_API_DO_NOT_USE +#define uset_charAt_3_2 uset_charAt_DRAFT_API_DO_NOT_USE +#define uset_containsAll_3_2 uset_containsAll_DRAFT_API_DO_NOT_USE +#define uset_containsNone_3_2 uset_containsNone_DRAFT_API_DO_NOT_USE +#define uset_containsSome_3_2 uset_containsSome_DRAFT_API_DO_NOT_USE +#define uset_equals_3_2 uset_equals_DRAFT_API_DO_NOT_USE +#define USPREP_DEFAULT_3_2 USPREP_DEFAULT_DRAFT_API_DO_NOT_USE +#define USPREP_ALLOW_UNASSIGNED_3_2 USPREP_ALLOW_UNASSIGNED_DRAFT_API_DO_NOT_USE +#define UStringPrepProfile_3_2 UStringPrepProfile_DRAFT_API_DO_NOT_USE +#define usprep_open_3_2 usprep_open_DRAFT_API_DO_NOT_USE +#define usprep_close_3_2 usprep_close_DRAFT_API_DO_NOT_USE +#define usprep_prepare_3_2 usprep_prepare_DRAFT_API_DO_NOT_USE +#define U_IS_BMP_3_2 U_IS_BMP_DRAFT_API_DO_NOT_USE +#define U_IS_SUPPLEMENTARY_3_2 U_IS_SUPPLEMENTARY_DRAFT_API_DO_NOT_USE +#define UDateTimeScale_3_2 UDateTimeScale_DRAFT_API_DO_NOT_USE +#define UDTS_JAVA_TIME_3_2 UDTS_JAVA_TIME_DRAFT_API_DO_NOT_USE +#define UDTS_UNIX_TIME_3_2 UDTS_UNIX_TIME_DRAFT_API_DO_NOT_USE +#define UDTS_ICU4C_TIME_3_2 UDTS_ICU4C_TIME_DRAFT_API_DO_NOT_USE +#define UDTS_WINDOWS_FILE_TIME_3_2 UDTS_WINDOWS_FILE_TIME_DRAFT_API_DO_NOT_USE +#define UDTS_WINDOWS_DATE_TIME_3_2 UDTS_WINDOWS_DATE_TIME_DRAFT_API_DO_NOT_USE +#define UDTS_MAC_OLD_TIME_3_2 UDTS_MAC_OLD_TIME_DRAFT_API_DO_NOT_USE +#define UDTS_MAC_TIME_3_2 UDTS_MAC_TIME_DRAFT_API_DO_NOT_USE +#define UDTS_EXCEL_TIME_3_2 UDTS_EXCEL_TIME_DRAFT_API_DO_NOT_USE +#define UDTS_DB2_TIME_3_2 UDTS_DB2_TIME_DRAFT_API_DO_NOT_USE +#define UDTS_MAX_SCALE_3_2 UDTS_MAX_SCALE_DRAFT_API_DO_NOT_USE +#define UDateTimeScale_3_2 UDateTimeScale_DRAFT_API_DO_NOT_USE +#define UTSV_UNITS_VALUE_3_2 UTSV_UNITS_VALUE_DRAFT_API_DO_NOT_USE +#define UTSV_EPOCH_OFFSET_VALUE_3_2 UTSV_EPOCH_OFFSET_VALUE_DRAFT_API_DO_NOT_USE +#define UTSV_FROM_MIN_VALUE_3_2 UTSV_FROM_MIN_VALUE_DRAFT_API_DO_NOT_USE +#define UTSV_FROM_MAX_VALUE_3_2 UTSV_FROM_MAX_VALUE_DRAFT_API_DO_NOT_USE +#define UTSV_TO_MIN_VALUE_3_2 UTSV_TO_MIN_VALUE_DRAFT_API_DO_NOT_USE +#define UTSV_TO_MAX_VALUE_3_2 UTSV_TO_MAX_VALUE_DRAFT_API_DO_NOT_USE +#define UTSV_EPOCH_OFFSET_PLUS_1_VALUE_3_2 UTSV_EPOCH_OFFSET_PLUS_1_VALUE_DRAFT_API_DO_NOT_USE +#define UTSV_EPOCH_OFFSET_MINUS_1_VALUE_3_2 UTSV_EPOCH_OFFSET_MINUS_1_VALUE_DRAFT_API_DO_NOT_USE +#define utmscale_getTimeScaleValue_3_2 utmscale_getTimeScaleValue_DRAFT_API_DO_NOT_USE +#define utmscale_fromInt64_3_2 utmscale_fromInt64_DRAFT_API_DO_NOT_USE +#define utmscale_toInt64_3_2 utmscale_toInt64_DRAFT_API_DO_NOT_USE +#define UTraceLevel_3_2 UTraceLevel_DRAFT_API_DO_NOT_USE +#define UTraceFunctionNumber_3_2 UTraceFunctionNumber_DRAFT_API_DO_NOT_USE +#define UTraceEntry_3_2 UTraceEntry_DRAFT_API_DO_NOT_USE +#define UTraceExit_3_2 UTraceExit_DRAFT_API_DO_NOT_USE +#define UTraceData_3_2 UTraceData_DRAFT_API_DO_NOT_USE +#define UTRACE_OFF_3_2 UTRACE_OFF_DRAFT_API_DO_NOT_USE +#define UTRACE_ERROR_3_2 UTRACE_ERROR_DRAFT_API_DO_NOT_USE +#define UTRACE_WARNING_3_2 UTRACE_WARNING_DRAFT_API_DO_NOT_USE +#define UTRACE_OPEN_CLOSE_3_2 UTRACE_OPEN_CLOSE_DRAFT_API_DO_NOT_USE +#define UTRACE_INFO_3_2 UTRACE_INFO_DRAFT_API_DO_NOT_USE +#define UTRACE_VERBOSE_3_2 UTRACE_VERBOSE_DRAFT_API_DO_NOT_USE +#define UTraceLevel_3_2 UTraceLevel_DRAFT_API_DO_NOT_USE +#define UTraceFunctionNumber_3_2 UTraceFunctionNumber_DRAFT_API_DO_NOT_USE +#define utrace_setLevel_3_2 utrace_setLevel_DRAFT_API_DO_NOT_USE +#define utrace_getLevel_3_2 utrace_getLevel_DRAFT_API_DO_NOT_USE +#define utrace_setFunctions_3_2 utrace_setFunctions_DRAFT_API_DO_NOT_USE +#define utrace_getFunctions_3_2 utrace_getFunctions_DRAFT_API_DO_NOT_USE +#define utrace_vformat_3_2 utrace_vformat_DRAFT_API_DO_NOT_USE +#define utrace_format_3_2 utrace_format_DRAFT_API_DO_NOT_USE +#define utrace_functionName_3_2 utrace_functionName_DRAFT_API_DO_NOT_USE +#define utrans_openU_3_2 utrans_openU_DRAFT_API_DO_NOT_USE +#define utrans_getUnicodeID_3_2 utrans_getUnicodeID_DRAFT_API_DO_NOT_USE +#define utrans_unregisterID_3_2 utrans_unregisterID_DRAFT_API_DO_NOT_USE +#define utrans_openIDs_3_2 utrans_openIDs_DRAFT_API_DO_NOT_USE +#define U_DATA_API_3_2 U_DATA_API_DRAFT_API_DO_NOT_USE +#define unistr_3_2 unistr_DRAFT_API_DO_NOT_USE +#define UnicodeSet_3_2 UnicodeSet_DRAFT_API_DO_NOT_USE +#define UnicodeString_3_2 UnicodeString_DRAFT_API_DO_NOT_USE + +#endif /* U_HIDE_DRAFT_API */ +#endif /* UDRAFT_H */ + diff --git a/icuSources/common/unicode/uenum.h b/icuSources/common/unicode/uenum.h index 80a12790..63690f8b 100644 --- a/icuSources/common/unicode/uenum.h +++ b/icuSources/common/unicode/uenum.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2002, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -22,10 +22,10 @@ /** * An enumeration object. * For usage in C programs. - * @draft ICU 2.2 + * @stable ICU 2.2 */ struct UEnumeration; -/** structure representing an enumeration object instance @draft ICU 2.2 */ +/** structure representing an enumeration object instance @stable ICU 2.2 */ typedef struct UEnumeration UEnumeration; /** @@ -33,9 +33,9 @@ typedef struct UEnumeration UEnumeration; * does nothing. After this call, any char* or UChar* pointer * returned by uenum_unext() or uenum_next() is invalid. * @param en UEnumeration structure pointer - * @draft ICU 2.2 + * @stable ICU 2.2 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 uenum_close(UEnumeration* en); /** @@ -50,9 +50,9 @@ uenum_close(UEnumeration* en); * @param status error code, can be U_ENUM_OUT_OF_SYNC_ERROR if the * iterator is out of sync. * @return number of elements in the iterator - * @draft ICU 2.2 + * @stable ICU 2.2 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uenum_count(UEnumeration* en, UErrorCode* status); /** @@ -64,7 +64,7 @@ uenum_count(UEnumeration* en, UErrorCode* status); * The result is terminated by (UChar)0. * @param en the iterator object * @param resultLength pointer to receive the length of the result - * (not including the terminating \0). + * (not including the terminating \\0). * If the pointer is NULL it is ignored. * @param status the error code, set to U_ENUM_OUT_OF_SYNC_ERROR if * the iterator is out of sync with its service. @@ -74,9 +74,9 @@ uenum_count(UEnumeration* en, UErrorCode* status); * until the next call to any uenum_... method, including * uenum_next() or uenum_unext(). When all strings have been * traversed, returns NULL. - * @draft ICU 2.2 + * @stable ICU 2.2 */ -U_CAPI const UChar* U_EXPORT2 +U_STABLE const UChar* U_EXPORT2 uenum_unext(UEnumeration* en, int32_t* resultLength, UErrorCode* status); @@ -93,7 +93,7 @@ uenum_unext(UEnumeration* en, * (but non-NULL). * @param en the iterator object * @param resultLength pointer to receive the length of the result - * (not including the terminating \0). + * (not including the terminating \\0). * If the pointer is NULL it is ignored. * @param status the error code, set to U_ENUM_OUT_OF_SYNC_ERROR if * the iterator is out of sync with its service. Set to @@ -107,9 +107,9 @@ uenum_unext(UEnumeration* en, * until the next call to any uenum_... method, including * uenum_next() or uenum_unext(). When all strings have been * traversed, returns NULL. - * @draft ICU 2.2 + * @stable ICU 2.2 */ -U_CAPI const char* U_EXPORT2 +U_STABLE const char* U_EXPORT2 uenum_next(UEnumeration* en, int32_t* resultLength, UErrorCode* status); @@ -121,9 +121,9 @@ uenum_next(UEnumeration* en, * @param en the iterator object * @param status the error code, set to U_ENUM_OUT_OF_SYNC_ERROR if * the iterator is out of sync with its service. - * @draft ICU 2.2 + * @stable ICU 2.2 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 uenum_reset(UEnumeration* en, UErrorCode* status); #endif diff --git a/icuSources/common/unicode/uidna.h b/icuSources/common/unicode/uidna.h index 7470621c..7b1dd0b3 100644 --- a/icuSources/common/unicode/uidna.h +++ b/icuSources/common/unicode/uidna.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * - * Copyright (C) 2003, International Business Machines + * Copyright (C) 2003-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -44,31 +44,35 @@ * once. * ToUnicode(ToUnicode(ToUnicode...(ToUnicode(string)))) == ToUnicode(string) * ToASCII(ToASCII(ToASCII...(ToASCII(string))) == ToASCII(string). - *\end_file + * */ +#ifndef U_HIDE_DRAFT_API + /** * Option to prohibit processing of unassigned codepoints in the input and * do not check if the input conforms to STD-3 ASCII rules. * * @see uidna_toASCII uidna_toUnicode - * @draft ICU 2.6 + * @stable ICU 2.6 */ #define UIDNA_DEFAULT 0x0000 /** * Option to allow processing of unassigned codepoints in the input * * @see uidna_toASCII uidna_toUnicode - * @draft ICU 2.6 + * @stable ICU 2.6 */ #define UIDNA_ALLOW_UNASSIGNED 0x0001 /** * Option to check if input conforms to STD-3 ASCII rules * * @see uidna_toASCII uidna_toUnicode - * @draft ICU 2.6 + * @stable ICU 2.6 */ #define UIDNA_USE_STD3_RULES 0x0002 + +#endif /*U_HIDE_DRAFT_API*/ /** * This function implements the ToASCII operation as defined in the IDNA RFC. @@ -84,18 +88,18 @@ * @param destCapacity Size of dest. * @param options A bit set of options: * - * - UIDNA_DEFAULT Use default options, i.e., do not process unassigned code points - * and do not use STD3 ASCII rules - * If unassigned code points are found the operation fails with - * U_UNASSIGNED_CODE_POINT_FOUND error code. + * - UIDNA_DEFAULT Use default options, i.e., do not process unassigned code points + * and do not use STD3 ASCII rules + * If unassigned code points are found the operation fails with + * U_UNASSIGNED_ERROR error code. * - * - UIDNA_UNASSIGNED Unassigned values can be converted to ASCII for query operations - * If this option is set, the unassigned code points are in the input - * are treated as normal Unicode code points. + * - UIDNA_ALLOW_UNASSIGNED Unassigned values can be converted to ASCII for query operations + * If this option is set, the unassigned code points are in the input + * are treated as normal Unicode code points. * - * - UIDNA_USE_STD3_RULES Use STD3 ASCII rules for host name syntax restrictions - * If this option is set and the input does not satisfy STD3 rules, - * the operation will fail with U_IDNA_STD3_ASCII_RULES_ERROR + * - UIDNA_USE_STD3_RULES Use STD3 ASCII rules for host name syntax restrictions + * If this option is set and the input does not satisfy STD3 rules, + * the operation will fail with U_IDNA_STD3_ASCII_RULES_ERROR * * @param parseError Pointer to UParseError struct to receive information on position * of error if an error is encountered. Can be NULL. @@ -106,9 +110,9 @@ * too many code points. * U_BUFFER_OVERFLOW_ERROR if destCapacity is not enough * @return Number of ASCII characters converted. - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uidna_toASCII(const UChar* src, int32_t srcLength, UChar* dest, int32_t destCapacity, int32_t options, @@ -129,23 +133,23 @@ uidna_toASCII(const UChar* src, int32_t srcLength, * @param destCapacity Size of dest. * @param options A bit set of options: * - * - UIDNA_DEFAULT Use default options, i.e., do not process unassigned code points - * and do not use STD3 ASCII rules - * If unassigned code points are found the operation fails with - * U_UNASSIGNED_CODE_POINT_FOUND error code. + * - UIDNA_DEFAULT Use default options, i.e., do not process unassigned code points + * and do not use STD3 ASCII rules + * If unassigned code points are found the operation fails with + * U_UNASSIGNED_ERROR error code. * - * - UIDNA_UNASSIGNED Unassigned values can be converted to ASCII for query operations - * If this option is set, the unassigned code points are in the input - * are treated as normal Unicode code points. Note: This option is - * required on toUnicode operation because the RFC mandates - * verification of decoded ACE input by applying toASCII and comparing - * its output with source + * - UIDNA_ALLOW_UNASSIGNED Unassigned values can be converted to ASCII for query operations + * If this option is set, the unassigned code points are in the input + * are treated as normal Unicode code points. Note: This option is + * required on toUnicode operation because the RFC mandates + * verification of decoded ACE input by applying toASCII and comparing + * its output with source * * * - * - UIDNA_USE_STD3_RULES Use STD3 ASCII rules for host name syntax restrictions - * If this option is set and the input does not satisfy STD3 rules, - * the operation will fail with U_IDNA_STD3_ASCII_RULES_ERROR + * - UIDNA_USE_STD3_RULES Use STD3 ASCII rules for host name syntax restrictions + * If this option is set and the input does not satisfy STD3 rules, + * the operation will fail with U_IDNA_STD3_ASCII_RULES_ERROR * * @param parseError Pointer to UParseError struct to receive information on position * of error if an error is encountered. Can be NULL. @@ -156,9 +160,9 @@ uidna_toASCII(const UChar* src, int32_t srcLength, * too many code points. * U_BUFFER_OVERFLOW_ERROR if destCapacity is not enough * @return Number of Unicode characters converted. - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uidna_toUnicode(const UChar* src, int32_t srcLength, UChar* dest, int32_t destCapacity, int32_t options, @@ -184,18 +188,18 @@ uidna_toUnicode(const UChar* src, int32_t srcLength, * @param destCapacity Size of dest. * @param options A bit set of options: * - * - UIDNA_DEFAULT Use default options, i.e., do not process unassigned code points - * and do not use STD3 ASCII rules - * If unassigned code points are found the operation fails with - * U_UNASSIGNED_CODE_POINT_FOUND error code. + * - UIDNA_DEFAULT Use default options, i.e., do not process unassigned code points + * and do not use STD3 ASCII rules + * If unassigned code points are found the operation fails with + * U_UNASSIGNED_CODE_POINT_FOUND error code. * - * - UIDNA_UNASSIGNED Unassigned values can be converted to ASCII for query operations - * If this option is set, the unassigned code points are in the input - * are treated as normal Unicode code points. + * - UIDNA_ALLOW_UNASSIGNED Unassigned values can be converted to ASCII for query operations + * If this option is set, the unassigned code points are in the input + * are treated as normal Unicode code points. * - * - UIDNA_USE_STD3_RULES Use STD3 ASCII rules for host name syntax restrictions - * If this option is set and the input does not satisfy STD3 rules, - * the operation will fail with U_IDNA_STD3_ASCII_RULES_ERROR + * - UIDNA_USE_STD3_RULES Use STD3 ASCII rules for host name syntax restrictions + * If this option is set and the input does not satisfy STD3 rules, + * the operation will fail with U_IDNA_STD3_ASCII_RULES_ERROR * * @param parseError Pointer to UParseError struct to receive information on position * of error if an error is encountered. Can be NULL. @@ -206,9 +210,9 @@ uidna_toUnicode(const UChar* src, int32_t srcLength, * too many code points. * U_BUFFER_OVERFLOW_ERROR if destCapacity is not enough * @return Number of ASCII characters converted. - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uidna_IDNToASCII( const UChar* src, int32_t srcLength, UChar* dest, int32_t destCapacity, int32_t options, @@ -230,18 +234,18 @@ uidna_IDNToASCII( const UChar* src, int32_t srcLength, * @param destCapacity Size of dest. * @param options A bit set of options: * - * - UIDNA_DEFAULT Use default options, i.e., do not process unassigned code points - * and do not use STD3 ASCII rules - * If unassigned code points are found the operation fails with - * U_UNASSIGNED_CODE_POINT_FOUND error code. + * - UIDNA_DEFAULT Use default options, i.e., do not process unassigned code points + * and do not use STD3 ASCII rules + * If unassigned code points are found the operation fails with + * U_UNASSIGNED_CODE_POINT_FOUND error code. * - * - UIDNA_UNASSIGNED Unassigned values can be converted to ASCII for query operations - * If this option is set, the unassigned code points are in the input - * are treated as normal Unicode code points. + * - UIDNA_ALLOW_UNASSIGNED Unassigned values can be converted to ASCII for query operations + * If this option is set, the unassigned code points are in the input + * are treated as normal Unicode code points. * - * - UIDNA_USE_STD3_RULES Use STD3 ASCII rules for host name syntax restrictions - * If this option is set and the input does not satisfy STD3 rules, - * the operation will fail with U_IDNA_STD3_ASCII_RULES_ERROR + * - UIDNA_USE_STD3_RULES Use STD3 ASCII rules for host name syntax restrictions + * If this option is set and the input does not satisfy STD3 rules, + * the operation will fail with U_IDNA_STD3_ASCII_RULES_ERROR * * @param parseError Pointer to UParseError struct to receive information on position * of error if an error is encountered. Can be NULL. @@ -252,9 +256,9 @@ uidna_IDNToASCII( const UChar* src, int32_t srcLength, * too many code points. * U_BUFFER_OVERFLOW_ERROR if destCapacity is not enough * @return Number of ASCII characters converted. - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uidna_IDNToUnicode( const UChar* src, int32_t srcLength, UChar* dest, int32_t destCapacity, int32_t options, @@ -262,7 +266,7 @@ uidna_IDNToUnicode( const UChar* src, int32_t srcLength, UErrorCode* status); /** - * Compare two strings for IDNs for equivalence. + * Compare two IDN strings for equivalence. * This function splits the domain names into labels and compares them. * According to IDN RFC, whenever two labels are compared, they are * considered equal if and only if their ASCII forms (obtained by @@ -277,25 +281,25 @@ uidna_IDNToUnicode( const UChar* src, int32_t srcLength, * @param length2 Length of second source string, or -1 if NUL-terminated. * @param options A bit set of options: * - * - UIDNA_DEFAULT Use default options, i.e., do not process unassigned code points - * and do not use STD3 ASCII rules - * If unassigned code points are found the operation fails with - * U_UNASSIGNED_CODE_POINT_FOUND error code. + * - UIDNA_DEFAULT Use default options, i.e., do not process unassigned code points + * and do not use STD3 ASCII rules + * If unassigned code points are found the operation fails with + * U_UNASSIGNED_CODE_POINT_FOUND error code. * - * - UIDNA_UNASSIGNED Unassigned values can be converted to ASCII for query operations - * If this option is set, the unassigned code points are in the input - * are treated as normal Unicode code points. + * - UIDNA_ALLOW_UNASSIGNED Unassigned values can be converted to ASCII for query operations + * If this option is set, the unassigned code points are in the input + * are treated as normal Unicode code points. * - * - UIDNA_USE_STD3_RULES Use STD3 ASCII rules for host name syntax restrictions - * If this option is set and the input does not satisfy STD3 rules, - * the operation will fail with U_IDNA_STD3_ASCII_RULES_ERROR + * - UIDNA_USE_STD3_RULES Use STD3 ASCII rules for host name syntax restrictions + * If this option is set and the input does not satisfy STD3 rules, + * the operation will fail with U_IDNA_STD3_ASCII_RULES_ERROR * * @param status ICU error code in/out parameter. * Must fulfill U_SUCCESS before the function call. * @return <0 or 0 or >0 as usual for string comparisons - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uidna_compare( const UChar *s1, int32_t length1, const UChar *s2, int32_t length2, int32_t options, diff --git a/icuSources/common/unicode/uiter.h b/icuSources/common/unicode/uiter.h index b69f0087..963df5cf 100644 --- a/icuSources/common/unicode/uiter.h +++ b/icuSources/common/unicode/uiter.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2002-2003, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -50,7 +50,7 @@ typedef enum UCharIteratorOrigin { UITER_START, UITER_CURRENT, UITER_LIMIT, UITER_ZERO, UITER_LENGTH } UCharIteratorOrigin; -/** Constants for UCharIterator. @draft ICU 2.6 */ +/** Constants for UCharIterator. @stable ICU 2.6 */ enum { /** * Constant value that may be returned by UCharIteratorMove @@ -64,11 +64,12 @@ enum { * The actual index can be determined with getIndex(UITER_CURRENT) * which will count the UChars if necessary. * - * @draft ICU 2.6 + * @stable ICU 2.6 */ UITER_UNKNOWN_INDEX=-2 }; + /** * Constant for UCharIterator getState() indicating an error or * an unknown state. @@ -78,7 +79,7 @@ enum { * a valid state for each position. This will be clearly documented * for each such iterator (none of the public ones here). * - * @draft ICU 2.6 + * @stable ICU 2.6 */ #define UITER_NO_STATE ((uint32_t)0xffffffff) @@ -242,6 +243,10 @@ UCharIteratorReserved(UCharIterator *iter, int32_t something); * to save and restore the iterator position more efficiently than with * getIndex()/move(). * + * The iterator state is defined as a uint32_t value because it is designed + * for use in ucol_nextSortKeyPart() which provides 32 bits to store the state + * of the character iterator. + * * With some UCharIterator implementations (e.g., UTF-8), * getting and setting the UTF-16 index with existing functions * (getIndex(UITER_CURRENT) followed by move(pos, UITER_ZERO)) is possible but @@ -268,7 +273,7 @@ UCharIteratorReserved(UCharIterator *iter, int32_t something); * @see UCharIterator * @see UCharIteratorSetState * @see UITER_NO_STATE - * @draft ICU 2.6 + * @stable ICU 2.6 */ typedef uint32_t U_CALLCONV UCharIteratorGetState(const UCharIterator *iter); @@ -296,7 +301,7 @@ UCharIteratorGetState(const UCharIterator *iter); * * @see UCharIterator * @see UCharIteratorGetState - * @draft ICU 2.6 + * @stable ICU 2.6 */ typedef void U_CALLCONV UCharIteratorSetState(UCharIterator *iter, uint32_t state, UErrorCode *pErrorCode); @@ -317,6 +322,15 @@ UCharIteratorSetState(UCharIterator *iter, uint32_t state, UErrorCode *pErrorCod * they only use the "public" function pointers and never access the "protected" * fields directly. * + * The current() and next() functions only check the current index against the + * limit, and previous() only checks the current index against the start, + * to see if the iterator already reached the end of the iteration range. + * + * The assumption - in all iterators - is that the index is moved via the API, + * which means it won't go out of bounds, or the index is modified by + * user code that knows enough about the iterator implementation to set valid + * index values. + * * UCharIterator functions return code unit values 0..0xffff, * or U_SENTINEL if the iteration bounds are reached. * @@ -443,7 +457,7 @@ struct UCharIterator { * This function pointer is NULL if the iterator does not implement it. * * @see UCharIteratorGet - * @draft ICU 2.6 + * @stable ICU 2.6 */ UCharIteratorGetState *getState; @@ -453,7 +467,7 @@ struct UCharIterator { * This function pointer is NULL if the iterator does not implement it. * * @see UCharIteratorSet - * @draft ICU 2.6 + * @stable ICU 2.6 */ UCharIteratorSetState *setState; }; @@ -476,7 +490,7 @@ struct UCharIterator { * @see UnicodeString::char32At() * @stable ICU 2.1 */ -U_CAPI UChar32 U_EXPORT2 +U_STABLE UChar32 U_EXPORT2 uiter_current32(UCharIterator *iter); /** @@ -493,7 +507,7 @@ uiter_current32(UCharIterator *iter); * @see U16_NEXT * @stable ICU 2.1 */ -U_CAPI UChar32 U_EXPORT2 +U_STABLE UChar32 U_EXPORT2 uiter_next32(UCharIterator *iter); /** @@ -510,7 +524,7 @@ uiter_next32(UCharIterator *iter); * @see U16_PREV * @stable ICU 2.1 */ -U_CAPI UChar32 U_EXPORT2 +U_STABLE UChar32 U_EXPORT2 uiter_previous32(UCharIterator *iter); /** @@ -529,9 +543,9 @@ uiter_previous32(UCharIterator *iter); * @see UCharIterator * @see UCharIteratorGetState * @see UITER_NO_STATE - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI uint32_t U_EXPORT2 +U_STABLE uint32_t U_EXPORT2 uiter_getState(const UCharIterator *iter); /** @@ -547,9 +561,9 @@ uiter_getState(const UCharIterator *iter); * * @see UCharIterator * @see UCharIteratorSetState - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 uiter_setState(UCharIterator *iter, uint32_t state, UErrorCode *pErrorCode); /** @@ -574,7 +588,7 @@ uiter_setState(UCharIterator *iter, uint32_t state, UErrorCode *pErrorCode); * @see UCharIterator * @stable ICU 2.1 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 uiter_setString(UCharIterator *iter, const UChar *s, int32_t length); /** @@ -595,9 +609,9 @@ uiter_setString(UCharIterator *iter, const UChar *s, int32_t length); * * @see UCharIterator * @see uiter_setString - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 uiter_setUTF16BE(UCharIterator *iter, const char *s, int32_t length); /** @@ -631,9 +645,9 @@ uiter_setUTF16BE(UCharIterator *iter, const char *s, int32_t length); * @param length Length of s in bytes, or -1 if NUL-terminated * * @see UCharIterator - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 uiter_setUTF8(UCharIterator *iter, const char *s, int32_t length); #ifdef XP_CPLUSPLUS @@ -658,7 +672,7 @@ uiter_setUTF8(UCharIterator *iter, const char *s, int32_t length); * @see UCharIterator * @stable ICU 2.1 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 uiter_setCharacterIterator(UCharIterator *iter, CharacterIterator *charIter); /** @@ -683,7 +697,7 @@ uiter_setCharacterIterator(UCharIterator *iter, CharacterIterator *charIter); * @see UCharIterator * @stable ICU 2.1 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 uiter_setReplaceable(UCharIterator *iter, const Replaceable *rep); #endif diff --git a/icuSources/common/unicode/uloc.h b/icuSources/common/unicode/uloc.h index 2b40b2fc..f584ec1c 100644 --- a/icuSources/common/unicode/uloc.h +++ b/icuSources/common/unicode/uloc.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1997-2003, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -22,6 +22,7 @@ #define ULOC_H #include "unicode/utypes.h" +#include "unicode/uenum.h" /** * \file @@ -39,7 +40,7 @@ *

    * You create a Locale with one of the three options listed below. * Each of the component is separated by '_' in the locale string. - *

    + * \htmlonly
    \endhtmlonly *
      * \code
      *       newLanguage
    @@ -49,7 +50,7 @@
      *       newLanguage + newCountry + newVariant
      * \endcode
      * 
    - *
    + * \htmlonly
    \endhtmlonly * The first option is a valid ISO * Language Code. These codes are the lower-case two-letter * codes as defined by ISO-639. @@ -92,13 +93,13 @@ * that you can use to specify the commonly used * locales. For example, the following refers to a locale * for the United States: - *
    + * \htmlonly
    \endhtmlonly *
      * \code
      *       ULOC_US
      * \endcode
      * 
    - *
    + * \htmlonly
    \endhtmlonly * *

    * Once you've specified a locale you can query it for information about @@ -118,7 +119,7 @@ * operations. For example, the unum_xxx functions format * numbers, currency, or percentages in a locale-sensitive manner. *

    - *
    + * \htmlonly
    \endhtmlonly *
      * \code
      *     UErrorCode success = U_ZERO_ERROR;
    @@ -133,10 +134,10 @@
      *     unum_close(nf);
      * \endcode
      * 
    - *
    + * \htmlonly
    \endhtmlonly * Each of these methods has two variants; one with an explicit locale * and one without; the latter using the default locale. - *
    + * \htmlonly
    \endhtmlonly *
      * \code 
      * 
    @@ -148,7 +149,7 @@
      *     unum_close(nf);
      * \endcode
      * 
    - *
    + * \htmlonly
    \endhtmlonly * A Locale is the mechanism for identifying the kind of services * (UNumberFormat) that you would like to get. The locale is * just a mechanism for identifying these services. @@ -162,7 +163,7 @@ * For example, you can create a menu of all the collation objects * suitable for a given language. Such classes implement these * three class methods: - *
    + * \htmlonly
    \endhtmlonly *
      * \code
      *       const char* uloc_getAvailable(int32_t index);
    @@ -176,13 +177,13 @@
      * 
      * \endcode
      * 
    - *
    + * \htmlonly
    \endhtmlonly *

    * Concerning POSIX/RFC1766 Locale IDs, * the getLanguage/getCountry/getVariant/getName functions do understand - * the POSIX type form of language_COUNTRY.ENCODING@VARIANT + * the POSIX type form of language_COUNTRY.ENCODING\@VARIANT * and if there is not an ICU-stype variant, uloc_getVariant() for example - * will return the one listed after the @at sign. As well, the hyphen + * will return the one listed after the \@at sign. As well, the hyphen * "-" is recognized as a country/variant separator similarly to RFC1766. * So for example, "en-us" will be interpreted as en_US. * As a result, uloc_getName() is far from a no-op, and will have the @@ -191,7 +192,7 @@ * Applications should call uloc_getName() at the point where a locale ID * is coming from an external source (user entry, OS, web browser) * and pass the resulting string to other ICU functions. For example, - * don't use de-de@EURO as an argument to resourcebundle. + * don't use de-de\@EURO as an argument to resourcebundle. * * @see UResourceBundle */ @@ -246,6 +247,7 @@ * @stable ICU 2.0 */ #define ULOC_LANG_CAPACITY 12 + /** * Useful constant for the maximum size of the country part of a locale ID * (including the terminating NULL). @@ -257,8 +259,48 @@ * (including the terminating NULL). * @stable ICU 2.0 */ -#define ULOC_FULLNAME_CAPACITY 50 +#define ULOC_FULLNAME_CAPACITY 56 + + +#ifndef U_HIDE_DRAFT_API + +/** + * Useful constant for the maximum size of the script part of a locale ID + * (including the terminating NULL). + * @draft ICU 2.8 + */ +#define ULOC_SCRIPT_CAPACITY 6 +/** + * Useful constant for the maximum size of keywords in a locale + * @draft ICU 2.8 + */ +#define ULOC_KEYWORDS_CAPACITY 50 + +/** + * Useful constant for the maximum size of keywords in a locale + * @draft ICU 2.8 + */ +#define ULOC_KEYWORD_AND_VALUES_CAPACITY 100 + +/** + * Character separating keywords from the locale string + * different for EBCDIC - TODO + * @draft ICU 2.8 + */ +#define ULOC_KEYWORD_SEPARATOR '@' +/** + * Character for assigning value to a keyword + * @draft ICU 2.8 + */ +#define ULOC_KEYWORD_ASSIGN '=' +/** + * Character separating keywords + * @draft ICU 2.8 + */ +#define ULOC_KEYWORD_ITEM_SEPARATOR ';' + +#endif /*U_HIDE_DRAFT_API*/ /** * Constants for *_getLocale() @@ -275,30 +317,50 @@ * @stable ICU 2.1 */ typedef enum { - /** This is locale the data actually comes from */ + /** This is locale the data actually comes from + * @stable ICU 2.1 + */ ULOC_ACTUAL_LOCALE = 0, - /** This is the most specific locale supported by ICU */ + /** This is the most specific locale supported by ICU + * @stable ICU 2.1 + */ ULOC_VALID_LOCALE = 1, - /** This is the requested locale */ + +#ifndef U_HIDE_DEPRECATED_API + /** This is the requested locale + * @deprecated ICU 2.8 + */ ULOC_REQUESTED_LOCALE = 2, +#endif /* U_HIDE_DEPRECATED_API */ + ULOC_DATA_LOCALE_TYPE_LIMIT } ULocDataLocaleType ; /** - * Gets ICU's default locale. This pointer and/or the contents of the pointer may - * become invalid if the uloc_setDefault() is called, so copy the contents of the - * pointer before calling uloc_setDefault(). - * + * Gets ICU's default locale. + * The returned string is a snapshot in time, and will remain valid + * and unchanged even when uloc_setDefault() is called. + * The returned storage is owned by ICU, and must not be altered or deleted + * by the caller. + * * @return the ICU default locale * @system * @stable ICU 2.0 */ -U_CAPI const char* U_EXPORT2 +U_STABLE const char* U_EXPORT2 uloc_getDefault(void); /** - * Sets ICU's default locale. Call this once during setup or program initialization. + * Sets ICU's default locale. + * By default (without calling this function), ICU's default locale will be based + * on information obtained from the underlying system environment. + *

    + * Changes to ICU's default locale do not propagate back to the + * system environment. + *

    + * Changes to ICU's default locale to not affect any ICU services that + * may already be open based on the previous default locale value. * * @param localeID the new ICU default locale. A value of NULL will try to get * the system's default locale. @@ -306,28 +368,46 @@ uloc_getDefault(void); * @system * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 uloc_setDefault(const char* localeID, UErrorCode* status); /** * Gets the language code for the specified locale. * - * @param localeID the locale to get the ISO langauge code with - * @param language the langauge code for localeID + * @param localeID the locale to get the ISO language code with + * @param language the language code for localeID * @param languageCapacity the size of the language buffer to store the * language code with - * @param err error information if retrieving the language code failed - * @return the actual buffer size needed for the langauge code. If it's greater + * @param err error information if retrieving the language code failed + * @return the actual buffer size needed for the language code. If it's greater * than languageCapacity, the returned language code will be truncated. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uloc_getLanguage(const char* localeID, char* language, int32_t languageCapacity, UErrorCode* err); +/** + * Gets the script code for the specified locale. + * + * @param localeID the locale to get the ISO language code with + * @param script the language code for localeID + * @param scriptCapacity the size of the language buffer to store the + * language code with + * @param err error information if retrieving the language code failed + * @return the actual buffer size needed for the language code. If it's greater + * than scriptCapacity, the returned language code will be truncated. + * @draft ICU 2.8 + */ +U_DRAFT int32_t U_EXPORT2 +uloc_getScript(const char* localeID, + char* script, + int32_t scriptCapacity, + UErrorCode* err); + /** * Gets the country code for the specified locale. * @@ -340,7 +420,7 @@ uloc_getLanguage(const char* localeID, * than countryCapacity, the returned country code will be truncated. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_DRAFT int32_t U_EXPORT2 uloc_getCountry(const char* localeID, char* country, int32_t countryCapacity, @@ -358,11 +438,35 @@ uloc_getCountry(const char* localeID, * than variantCapacity, the returned variant code will be truncated. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uloc_getVariant(const char* localeID, char* variant, int32_t variantCapacity, UErrorCode* err); + + +/** + * Gets the full name for the specified locale. + * Note: This has the effect of 'canonicalizing' the ICU locale ID to + * a certain extent. Upper and lower case are set as needed. + * It does NOT map aliased names in any way. + * See the top of this header file. + * This API supports preflighting. + * + * @param localeID the locale to get the full name with + * @param name fill in buffer for the name without keywords. + * @param nameCapacity capacity of the fill in buffer. + * @param err error information if retrieving the full name failed + * @return the actual buffer size needed for the full name. If it's greater + * than nameCapacity, the returned full name will be truncated. + * @stable ICU 2.0 + */ +U_STABLE int32_t U_EXPORT2 +uloc_getName(const char* localeID, + char* name, + int32_t nameCapacity, + UErrorCode* err); + /** * Gets the full name for the specified locale. * Note: This has the effect of 'canonicalizing' the string to @@ -378,10 +482,10 @@ uloc_getVariant(const char* localeID, * @param err error information if retrieving the full name failed * @return the actual buffer size needed for the full name. If it's greater * than nameCapacity, the returned full name will be truncated. - * @stable ICU 2.0 + * @draft ICU 2.8 */ -U_CAPI int32_t U_EXPORT2 -uloc_getName(const char* localeID, +U_DRAFT int32_t U_EXPORT2 +uloc_canonicalize(const char* localeID, char* name, int32_t nameCapacity, UErrorCode* err); @@ -389,11 +493,11 @@ uloc_getName(const char* localeID, /** * Gets the ISO language code for the specified locale. * - * @param localeID the locale to get the ISO langauge code with - * @return language the ISO langauge code for localeID + * @param localeID the locale to get the ISO language code with + * @return language the ISO language code for localeID * @stable ICU 2.0 */ -U_CAPI const char* U_EXPORT2 +U_STABLE const char* U_EXPORT2 uloc_getISO3Language(const char* localeID); @@ -404,50 +508,74 @@ uloc_getISO3Language(const char* localeID); * @return country the ISO country code for localeID * @stable ICU 2.0 */ -U_CAPI const char* U_EXPORT2 +U_STABLE const char* U_EXPORT2 uloc_getISO3Country(const char* localeID); /** * Gets the Win32 LCID value for the specified locale. + * If the ICU locale is not recognized by Windows, 0 will be returned. * * @param localeID the locale to get the Win32 LCID value with * @return country the Win32 LCID for localeID * @stable ICU 2.0 */ -U_CAPI uint32_t U_EXPORT2 +U_STABLE uint32_t U_EXPORT2 uloc_getLCID(const char* localeID); /** * Gets the language name suitable for display for the specified locale. * - * @param locale the locale to get the ISO langauge code with - * @param inLocale Specifies the locale to be used to display the name. In other words, + * @param locale the locale to get the ISO language code with + * @param displayLocale Specifies the locale to be used to display the name. In other words, * if the locale's language code is "en", passing Locale::getFrench() for * inLocale would result in "Anglais", while passing Locale::getGerman() * for inLocale would result in "Englisch". - * @param language the displayable langauge code for localeID + * @param language the displayable language code for localeID * @param languageCapacity the size of the language buffer to store the * displayable language code with * @param status error information if retrieving the displayable language code failed - * @return the actual buffer size needed for the displayable langauge code. If it's greater + * @return the actual buffer size needed for the displayable language code. If it's greater * than languageCapacity, the returned language code will be truncated. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uloc_getDisplayLanguage(const char* locale, - const char* inLocale, + const char* displayLocale, UChar* language, int32_t languageCapacity, UErrorCode* status); +/** + * Gets the script name suitable for display for the specified locale. + * + * @param locale the locale to get the displayable script code with. NULL may be used to specify the default. + * @param displayLocale Specifies the locale to be used to display the name. In other words, + * if the locale's language code is "en", passing Locale::getFrench() for + * inLocale would result in "", while passing Locale::getGerman() + * for inLocale would result in "". NULL may be used to specify the default. + * @param script the displayable country code for localeID + * @param scriptCapacity the size of the script buffer to store the + * displayable script code with + * @param status error information if retrieving the displayable script code failed + * @return the actual buffer size needed for the displayable script code. If it's greater + * than scriptCapacity, the returned displayable script code will be truncated. + * @draft ICU 2.8 + */ +U_DRAFT int32_t U_EXPORT2 +uloc_getDisplayScript(const char* locale, + const char* displayLocale, + UChar* script, + int32_t scriptCapacity, + UErrorCode* status); + /** * Gets the country name suitable for display for the specified locale. * - * @param locale the locale to get the displayable country code with - * @param inLocale Specifies the locale to be used to display the name. In other words, + * @param locale the locale to get the displayable country code with. NULL may be used to specify the default. + * @param displayLocale Specifies the locale to be used to display the name. In other words, * if the locale's language code is "en", passing Locale::getFrench() for * inLocale would result in "Anglais", while passing Locale::getGerman() - * for inLocale would result in "Englisch". + * for inLocale would result in "Englisch". NULL may be used to specify the default. * @param country the displayable country code for localeID * @param countryCapacity the size of the country buffer to store the * displayable country code with @@ -456,22 +584,22 @@ uloc_getDisplayLanguage(const char* locale, * than countryCapacity, the returned displayable country code will be truncated. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uloc_getDisplayCountry(const char* locale, - const char* inLocale, - UChar* country, - int32_t countryCapacity, - UErrorCode* status); /* NULL may be used to specify the default */ + const char* displayLocale, + UChar* country, + int32_t countryCapacity, + UErrorCode* status); /** - * Gets the variant code suitable for display for the specified locale. + * Gets the variant name suitable for display for the specified locale. * - * @param locale the locale to get the displayable variant code with - * @param inLocale Specifies the locale to be used to display the name. In other words, + * @param locale the locale to get the displayable variant code with. NULL may be used to specify the default. + * @param displayLocale Specifies the locale to be used to display the name. In other words, * if the locale's language code is "en", passing Locale::getFrench() for * inLocale would result in "Anglais", while passing Locale::getGerman() - * for inLocale would result in "Englisch". + * for inLocale would result in "Englisch". NULL may be used to specify the default. * @param variant the displayable variant code for localeID * @param variantCapacity the size of the variant buffer to store the * displayable variant code with @@ -480,32 +608,105 @@ uloc_getDisplayCountry(const char* locale, * than variantCapacity, the returned displayable variant code will be truncated. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uloc_getDisplayVariant(const char* locale, - const char* inLocale, - UChar* variant, - int32_t variantCapacity, - UErrorCode* status); /* NULL may be used to specify the default */ + const char* displayLocale, + UChar* variant, + int32_t variantCapacity, + UErrorCode* status); +/** + * Gets the keyword name suitable for display for the specified locale. + * E.g: for the locale string de_DE\@collation=PHONEBOOK, this API gets the display + * string for the keyword collation. + * Usage: + * + * UErrorCode status = U_ZERO_ERROR; + * const char* keyword =NULL; + * int32_t keywordLen = 0; + * int32_t keywordCount = 0; + * UChar displayKeyword[256]; + * int32_t displayKeywordLen = 0; + * UEnumeration* keywordEnum = uloc_openKeywords("de_DE@collation=PHONEBOOK;calendar=TRADITIONAL", &status); + * for(keywordCount = uenum_count(keywordEnum, &status); keywordCount > 0 ; keywordCount--){ + * if(U_FAILURE(status)){ + * ...something went wrong so handle the error... + * break; + * } + * // the uenum_next returns NUL terminated string + * keyword = uenum_next(keywordEnum, &keywordLen, &status); + * displayKeywordLen = uloc_getDisplayKeyword(keyword, "en_US", displayKeyword, 256); + * ... do something interesting ..... + * } + * uenum_close(keywordEnum); + * + * @param keyword The keyword whose display string needs to be returned. + * @param displayLocale Specifies the locale to be used to display the name. In other words, + * if the locale's language code is "en", passing Locale::getFrench() for + * inLocale would result in "Anglais", while passing Locale::getGerman() + * for inLocale would result in "Englisch". NULL may be used to specify the default. + * @param dest the buffer to which the displayable keyword should be written. + * @param destCapacity The size of the buffer (number of UChars). If it is 0, then + * dest may be NULL and the function will only return the length of the + * result without writing any of the result string (pre-flighting). + * @param status error information if retrieving the displayable string failed. + * Should not be NULL and should not indicate failure on entry. + * @return the actual buffer size needed for the displayable variant code. + * @see #uloc_openKeywords + * @draft ICU 2.8 + */ +U_DRAFT int32_t U_EXPORT2 +uloc_getDisplayKeyword(const char* keyword, + const char* displayLocale, + UChar* dest, + int32_t destCapacity, + UErrorCode* status); +/** + * Gets the value of the keyword suitable for display for the specified locale. + * E.g: for the locale string de_DE\@collation=PHONEBOOK, this API gets the display + * string for PHONEBOOK, in the display locale, when "collation" is specified as the keyword. + * + * @param locale The locale to get the displayable variant code with. NULL may be used to specify the default. + * @param keyword The keyword for whose value should be used. + * @param displayLocale Specifies the locale to be used to display the name. In other words, + * if the locale's language code is "en", passing Locale::getFrench() for + * inLocale would result in "Anglais", while passing Locale::getGerman() + * for inLocale would result in "Englisch". NULL may be used to specify the default. + * @param dest the buffer to which the displayable keyword should be written. + * @param destCapacity The size of the buffer (number of UChars). If it is 0, then + * dest may be NULL and the function will only return the length of the + * result without writing any of the result string (pre-flighting). + * @param status error information if retrieving the displayable string failed. + * Should not be NULL and must not indicate failure on entry. + * @return the actual buffer size needed for the displayable variant code. + * @draft ICU 2.8 + */ +U_DRAFT int32_t U_EXPORT2 +uloc_getDisplayKeywordValue( const char* locale, + const char* keyword, + const char* displayLocale, + UChar* dest, + int32_t destCapacity, + UErrorCode* status); /** * Gets the full name suitable for display for the specified locale. * - * @param localeID the locale to get the displayable name with + * @param localeID the locale to get the displayable name with. NULL may be used to specify the default. * @param inLocaleID Specifies the locale to be used to display the name. In other words, * if the locale's language code is "en", passing Locale::getFrench() for * inLocale would result in "Anglais", while passing Locale::getGerman() - * for inLocale would result in "Englisch". + * for inLocale would result in "Englisch". NULL may be used to specify the default. * @param result the displayable name for localeID * @param maxResultSize the size of the name buffer to store the * displayable full name with * @param err error information if retrieving the displayable name failed * @return the actual buffer size needed for the displayable name. If it's greater - * than variantCapacity, the returned displayable name will be truncated. + * than maxResultSize, the returned displayable name will be truncated. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uloc_getDisplayName(const char* localeID, - const char* inLocaleID, /* NULL may be used to specify the default */ + const char* inLocaleID, UChar* result, int32_t maxResultSize, UErrorCode* err); @@ -521,7 +722,7 @@ uloc_getDisplayName(const char* localeID, * @return a specified locale name of all available locales * @stable ICU 2.0 */ -U_CAPI const char* U_EXPORT2 +U_STABLE const char* U_EXPORT2 uloc_getAvailable(int32_t n); /** @@ -530,7 +731,7 @@ uloc_getAvailable(int32_t n); * @return the size of the locale list * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 uloc_countAvailable(void); +U_STABLE int32_t U_EXPORT2 uloc_countAvailable(void); /** * @@ -541,7 +742,7 @@ U_CAPI int32_t U_EXPORT2 uloc_countAvailable(void); * @return a list of all available language codes * @stable ICU 2.0 */ -U_CAPI const char* const* U_EXPORT2 +U_STABLE const char* const* U_EXPORT2 uloc_getISOLanguages(void); /** @@ -553,7 +754,7 @@ uloc_getISOLanguages(void); * @return a list of all available country codes * @stable ICU 2.0 */ -U_CAPI const char* const* U_EXPORT2 +U_STABLE const char* const* U_EXPORT2 uloc_getISOCountries(void); /** @@ -569,12 +770,144 @@ uloc_getISOCountries(void); * @return The length of the parent locale ID. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uloc_getParent(const char* localeID, char* parent, int32_t parentCapacity, UErrorCode* err); + + + +/** + * Gets the full name for the specified locale. + * Note: This has the effect of 'canonicalizing' the string to + * a certain extent. Upper and lower case are set as needed, + * and if the components were in 'POSIX' format they are changed to + * ICU format. It does NOT map aliased names in any way. + * See the top of this header file. + * This API strips off the keyword part, so "de_DE\@collation=phonebook" + * will become "de_DE". + * This API supports preflighting. + * + * @param localeID the locale to get the full name with + * @param name fill in buffer for the name without keywords. + * @param nameCapacity capacity of the fill in buffer. + * @param err error information if retrieving the full name failed + * @return the actual buffer size needed for the full name. If it's greater + * than nameCapacity, the returned full name will be truncated. + * @draft ICU 2.8 + */ +U_DRAFT int32_t U_EXPORT2 +uloc_getBaseName(const char* localeID, + char* name, + int32_t nameCapacity, + UErrorCode* err); + +/** + * Gets an enumeration of keywords for the specified locale. Enumeration + * must get disposed of by the client using uenum_close function. + * + * @param localeID the locale to get the variant code with + * @param status error information if retrieving the keywords failed + * @return enumeration of keywords or NULL if there are no keywords. + * @draft ICU 2.8 + */ +U_DRAFT UEnumeration* U_EXPORT2 +uloc_openKeywords(const char* localeID, + UErrorCode* status); + +/** + * Get the value for a keyword. Locale name does not need to be normalized. + * + * @param localeID locale name containing the keyword ("de_DE@currency=EURO;collation=PHONEBOOK") + * @param keywordName name of the keyword for which we want the value. Case insensitive. + * @param buffer receiving buffer + * @param bufferCapacity capacity of receiving buffer + * @param status containing error code - buffer not big enough. + * @return the length of keyword value + * @draft ICU 2.8 + */ +U_DRAFT int32_t U_EXPORT2 +uloc_getKeywordValue(const char* localeID, + const char* keywordName, + char* buffer, int32_t bufferCapacity, + UErrorCode* status); + + +/** + * Set the value of the specified keyword. + * NOTE: Unlike almost every other ICU function which takes a + * buffer, this function will NOT truncate the output text. If a + * BUFFER_OVERFLOW_ERROR is received, it means that the original + * buffer is untouched. This is done to prevent incorrect or possibly + * even malformed locales from being generated and used. + * + * @param keywordName name of the keyword to be set. Case insensitive. + * @param keywordValue value of the keyword to be set. If 0-length or + * NULL, will result in the keyword being removed. No error is given if + * that keyword does not exist. + * @param buffer input buffer containing locale to be modified. + * @param bufferCapacity capacity of receiving buffer + * @param status containing error code - buffer not big enough. + * @return the length needed for the buffer + * @see uloc_getKeywordValue + * @draft ICU 3.2 + */ +U_DRAFT int32_t U_EXPORT2 +uloc_setKeywordValue(const char* keywordName, + const char* keywordValue, + char* buffer, int32_t bufferCapacity, + UErrorCode* status); + +/** + * enums for the 'outResult' parameter return value + * @see uloc_acceptLanguageFromHTTP + * @see uloc_acceptLanguage + * @draft ICU 3.2 + */ +typedef enum { + ULOC_ACCEPT_FAILED = 0, /* No exact match was found. */ + ULOC_ACCEPT_VALID = 1, /* An exact match was found. */ + ULOC_ACCEPT_FALLBACK = 2 /* A fallback was found, for example, + Accept list contained 'ja_JP' + which matched available locale 'ja'. */ +} UAcceptResult; + + +/** + * @param httpAcceptLanguage - "Accept-Language:" header as per HTTP. + * @param result - buffer to accept the result locale + * @param resultAvailable the size of the result buffer. + * @param availableLocales - list of available locales to match + * @param status Error status, may be BUFFER_OVERFLOW_ERROR + * @return length needed for the locale. + * @draft ICU 3.2 + */ +U_DRAFT int32_t U_EXPORT2 +uloc_acceptLanguageFromHTTP(char *result, int32_t resultAvailable, + UAcceptResult *outResult, + const char *httpAcceptLanguage, + UEnumeration* availableLocales, + UErrorCode *status); + +/** + * @param acceptList -list of acceptable languages + * @param acceptListCount - count of acceptList items + * @param result - buffer to accept the result locale + * @param resultAvailable the size of the result buffer. + * @param availableLocales - list of available locales to match + * @param status Error status, may be BUFFER_OVERFLOW_ERROR + * @return length needed for the locale. + * @draft ICU 3.2 + */ +U_DRAFT int32_t U_EXPORT2 +uloc_acceptLanguage(char *result, int32_t resultAvailable, + UAcceptResult *outResult, const char **acceptList, + int32_t acceptListCount, + UEnumeration* availableLocales, + UErrorCode *status); + /*eof*/ diff --git a/icuSources/common/unicode/umachine.h b/icuSources/common/unicode/umachine.h index 2909386b..d841f534 100644 --- a/icuSources/common/unicode/umachine.h +++ b/icuSources/common/unicode/umachine.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1999-2002, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -43,14 +43,16 @@ #if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) # include "unicode/pwin32.h" -#elif defined(__OS400__) -# include "unicode/pos400.h" -#elif defined(__MWERKS__) -# include "unicode/pmacos.h" #else # include "unicode/platform.h" #endif +/* + * ANSI C headers: + * stddef.h defines wchar_t + */ +#include + /*==========================================================================*/ /* XP_CPLUSPLUS is a cross-platform symbol which should be defined when */ /* using C++. It should not be defined when compiling under C. */ @@ -65,9 +67,9 @@ #endif /*==========================================================================*/ -/* For C wrappers, we use the symbol U_CAPI. */ +/* For C wrappers, we use the symbol U_STABLE. */ /* This works properly if the includer is C or C++. */ -/* Functions are declared U_CAPI return-type U_EXPORT2 function-name()... */ +/* Functions are declared U_STABLE return-type U_EXPORT2 function-name()... */ /*==========================================================================*/ /** @@ -143,6 +145,11 @@ /** This is used to declare a function as a public ICU C API @stable ICU 2.0*/ #define U_CAPI U_CFUNC U_EXPORT +#define U_STABLE U_CAPI +#define U_DRAFT U_CAPI +#define U_DEPRECATED U_CAPI +#define U_OBSOLETE U_CAPI +#define U_INTERNAL U_CAPI /*==========================================================================*/ /* limits for int32_t etc., like in POSIX inttypes.h */ @@ -188,37 +195,36 @@ #endif #if defined(U_INT64_T_UNAVAILABLE) -# ifndef INTMAX_MIN -# define INTMAX_MIN INT32_MIN -# endif -# ifndef INTMAX_MAX -# define INTMAX_MAX INT32_MAX -# endif -# ifndef UINTMAX_MAX -# define UINTMAX_MAX UINT32_MAX -# endif +# error int64_t is required for decimal format and rule-based number format. #else -# ifndef INT64_MIN -/** The smallest value a 64 bit signed integer can hold @stable ICU 2.0 */ -# define INT64_MIN ((int64_t)(-9223372036854775807-1)) -# endif -# ifndef INT64_MAX -/** The largest value a 64 bit signed integer can hold @stable ICU 2.0 */ -# define INT64_MAX ((int64_t)(9223372036854775807)) -# endif -# ifndef UINT64_MAX -/** The largest value a 64 bit unsigned integer can hold @stable ICU 2.0 */ -# define UINT64_MAX ((uint64_t)(18446744073709551615)) -# endif -# ifndef INTMAX_MIN -# define INTMAX_MIN INT64_MIN -# endif -# ifndef INTMAX_MAX -# define INTMAX_MAX INT64_MAX -# endif -# ifndef UINTMAX_MAX -# define UINTMAX_MAX UINT64_MAX -# endif +# ifndef INT64_C +/** + * Provides a platform independent way to specify a signed 64-bit integer constant. + * note: may be wrong for some 64 bit platforms - ensure your compiler provides INT64_C + * @draft ICU 2.8 + */ +# define INT64_C(c) c ## LL +# endif +# ifndef UINT64_C +/** + * Provides a platform independent way to specify an unsigned 64-bit integer constant. + * note: may be wrong for some 64 bit platforms - ensure your compiler provides UINT64_C + * @draft ICU 2.8 + */ +# define UINT64_C(c) c ## ULL +# endif +# ifndef U_INT64_MIN +/** The smallest value a 64 bit signed integer can hold @stable ICU 2.8 */ +# define U_INT64_MIN ((int64_t)(INT64_C(-9223372036854775807)-1)) +# endif +# ifndef U_INT64_MAX +/** The largest value a 64 bit signed integer can hold @stable ICU 2.8 */ +# define U_INT64_MAX ((int64_t)(INT64_C(9223372036854775807))) +# endif +# ifndef U_UINT64_MAX +/** The largest value a 64 bit unsigned integer can hold @stable ICU 2.8 */ +# define U_UINT64_MAX ((uint64_t)(UINT64_C(18446744073709551615))) +# endif #endif /*==========================================================================*/ @@ -238,6 +244,107 @@ typedef int8_t UBool; #endif +/*==========================================================================*/ +/* Unicode data types */ +/*==========================================================================*/ + +/* wchar_t-related definitions -------------------------------------------- */ + +/** + * \def U_HAVE_WCHAR_H + * Indicates whether is available (1) or not (0). Set to 1 by default. + * + * @stable ICU 2.0 + */ +#ifndef U_HAVE_WCHAR_H +# define U_HAVE_WCHAR_H 1 +#endif + +/** + * \def U_SIZEOF_WCHAR_T + * U_SIZEOF_WCHAR_T==sizeof(wchar_t) (0 means it is not defined or autoconf could not set it) + * + * @stable ICU 2.0 + */ +#if U_SIZEOF_WCHAR_T==0 +# undef U_SIZEOF_WCHAR_T +# define U_SIZEOF_WCHAR_T 4 +#endif + +/* + * \def U_WCHAR_IS_UTF16 + * Defined if wchar_t uses UTF-16. + * + * @stable ICU 2.0 + */ +/* + * \def U_WCHAR_IS_UTF32 + * Defined if wchar_t uses UTF-32. + * + * @stable ICU 2.0 + */ +#if !defined(U_WCHAR_IS_UTF16) && !defined(U_WCHAR_IS_UTF32) +# ifdef __STDC_ISO_10646__ +# if (U_SIZEOF_WCHAR_T==2) +# define U_WCHAR_IS_UTF16 +# elif (U_SIZEOF_WCHAR_T==4) +# define U_WCHAR_IS_UTF32 +# endif +# elif defined __UCS2__ +# if (__OS390__ || __OS400__) && (U_SIZEOF_WCHAR_T==2) +# define U_WCHAR_IS_UTF16 +# endif +# elif defined __UCS4__ +# if (U_SIZEOF_WCHAR_T==4) +# define U_WCHAR_IS_UTF32 +# endif +# elif defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) +# define U_WCHAR_IS_UTF16 +# endif +#endif + +/* UChar and UChar32 definitions -------------------------------------------- */ + +/** Number of bytes in a UChar. @stable ICU 2.0 */ +#define U_SIZEOF_UCHAR 2 + +/** + * \var UChar + * Define UChar to be wchar_t if that is 16 bits wide; always assumed to be unsigned. + * If wchar_t is not 16 bits wide, then define UChar to be uint16_t. + * This makes the definition of UChar platform-dependent + * but allows direct string type compatibility with platforms with + * 16-bit wchar_t types. + * + * @stable ICU 2.0 + */ + +/* Define UChar to be compatible with wchar_t if possible. */ +#if U_SIZEOF_WCHAR_T==2 + typedef wchar_t UChar; +#else + typedef uint16_t UChar; +#endif + +/** + * Define UChar32 as a type for single Unicode code points. + * UChar32 is a signed 32-bit integer (same as int32_t). + * + * The Unicode code point range is 0..0x10ffff. + * All other values (negative or >=0x110000) are illegal as Unicode code points. + * They may be used as sentinel values to indicate "done", "error" + * or similar non-code point conditions. + * + * Before ICU 2.4 (Jitterbug 2146), UChar32 was defined + * to be wchar_t if that is 32 bits wide (wchar_t may be signed or unsigned) + * or else to be uint32_t. + * That is, the definition of UChar32 was platform-dependent. + * + * @see U_SENTINEL + * @stable ICU 2.4 + */ +typedef int32_t UChar32; + /*==========================================================================*/ /* U_INLINE and U_ALIGN_CODE Set default values if these are not already */ /* defined. Definitions normally are in */ diff --git a/icuSources/common/unicode/umisc.h b/icuSources/common/unicode/umisc.h index 7b1adb3b..d47fa383 100644 --- a/icuSources/common/unicode/umisc.h +++ b/icuSources/common/unicode/umisc.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2001, International Business Machines +* Copyright (C) 1999-2003, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * file name: umisc.h diff --git a/icuSources/common/unicode/unifilt.h b/icuSources/common/unicode/unifilt.h index ed810d7b..694a7bd0 100644 --- a/icuSources/common/unicode/unifilt.h +++ b/icuSources/common/unicode/unifilt.h @@ -1,5 +1,6 @@ /* -* Copyright (C) 1999, International Business Machines Corporation and others. All Rights Reserved. +* Copyright (C) 1999-2004, International Business Machines Corporation and others. +* All Rights Reserved. ********************************************************************** * Date Name Description * 11/17/99 aliu Creation. @@ -19,6 +20,7 @@ U_NAMESPACE_BEGIN * characters outside the range contextStart..contextLimit-1. This * allows explicit matching by rules and UnicodeSets of text outside a * defined range. + * @draft ICU 3.0 */ #define U_ETHER ((UChar)0xFFFF) @@ -68,13 +70,13 @@ public: /** * UnicodeFunctor API. Cast 'this' to a UnicodeMatcher* pointer * and return the pointer. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UnicodeMatcher* toMatcher() const; /** * Implement UnicodeMatcher API. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UMatchDegree matches(const Replaceable& text, int32_t& offset, @@ -83,42 +85,35 @@ public: /** * UnicodeFunctor API. Nothing to do. - * @draft ICU 2.4 + * @stable ICU 2.4 */ - virtual void setData(const TransliterationRuleData*) {} + virtual void setData(const TransliterationRuleData*); /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const = 0; + virtual UClassID getDynamicClassID() const = 0; /** * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } + static UClassID U_EXPORT2 getStaticClassID(); protected: - /** + /* + * Since this class has pure virtual functions, + * a constructor can't be used. * @stable ICU 2.0 */ - UnicodeFilter(); - -private: - - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; +/* UnicodeFilter();*/ }; -inline UnicodeFilter::UnicodeFilter() {} -inline UnicodeFilter::~UnicodeFilter() {} +/*inline UnicodeFilter::UnicodeFilter() {}*/ U_NAMESPACE_END diff --git a/icuSources/common/unicode/unifunct.h b/icuSources/common/unicode/unifunct.h index abedddb6..36898e9e 100644 --- a/icuSources/common/unicode/unifunct.h +++ b/icuSources/common/unicode/unifunct.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (c) 2002-2003, International Business Machines Corporation +* Copyright (c) 2002-2004, International Business Machines Corporation * and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -23,15 +23,15 @@ class TransliterationRuleData; * UnicodeFunctor is an abstract base class for objects * that perform match and/or replace operations on Unicode strings. * @author Alan Liu - * @draft ICU 2.4 + * @stable ICU 2.4 */ class U_COMMON_API UnicodeFunctor : public UObject { - public: +public: /** * Destructor - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual ~UnicodeFunctor(); @@ -39,7 +39,7 @@ class U_COMMON_API UnicodeFunctor : public UObject { * Return a copy of this object. All UnicodeFunctor objects * have to support cloning in order to allow classes using * UnicodeFunctor to implement cloning. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UnicodeFunctor* clone() const = 0; @@ -51,7 +51,7 @@ class U_COMMON_API UnicodeFunctor : public UObject { * cannot be cast to a pointer to a UnicodeMatcher, since * UnicodeMatcher is a mixin that does not derive from * UnicodeFunctor. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UnicodeMatcher* toMatcher() const; @@ -63,45 +63,32 @@ class U_COMMON_API UnicodeFunctor : public UObject { * cannot be cast to a pointer to a UnicodeReplacer, since * UnicodeReplacer is a mixin that does not derive from * UnicodeFunctor. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UnicodeReplacer* toReplacer() const; /** * Return the class ID for this class. This is useful only for - * comparing to a return value from getDynamicClassID(). For example: - *

    -     * .      Base* polymorphic_pointer = createPolymorphicObject();
    -     * .      if (polymorphic_pointer->getDynamicClassID() ==
    -     * .          Derived::getStaticClassID()) ...
    -     * 
    + * comparing to a return value from getDynamicClassID(). * @return The class ID for all objects of this class. * @stable ICU 2.0 */ - static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; } + static UClassID U_EXPORT2 getStaticClassID(void); /** * Returns a unique class ID polymorphically. This method * is to implement a simple version of RTTI, since not all C++ * compilers support genuine RTTI. Polymorphic operator==() and * clone() methods call this method. - * - *

    Concrete subclasses of UnicodeFunctor that wish clients to - * be able to identify them should implement getDynamicClassID() - * and also a static method and data member: - * - *

    -     * static UClassID getStaticClassID() { return (UClassID)&fgClassID; }
    -     * static char fgClassID;
    -     * 
    * - * Subclasses that do not implement this method will have a - * dynamic class ID of UnicodeFunctor::getStatisClassID(). + *

    Concrete subclasses of UnicodeFunctor should use the macro + * UOBJECT_DEFINE_RTTI_IMPLEMENTATION from uobject.h to + * provide definitios getStaticClassID and getDynamicClassID. * * @return The class ID for this object. All objects of a given * class have the same class ID. Objects of other classes have * different class IDs. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UClassID getDynamicClassID(void) const = 0; @@ -115,24 +102,18 @@ class U_COMMON_API UnicodeFunctor : public UObject { */ virtual void setData(const TransliterationRuleData*) = 0; - protected: +protected: /** + * Since this class has pure virtual functions, + * a constructor can't be used. * @stable ICU 2.0 */ - UnicodeFunctor(); + /*UnicodeFunctor();*/ - private: - - /** - * Class identifier for subclasses of UnicodeFunctor that do not - * define their class (anonymous subclasses). - */ - static const char fgClassID; }; -inline UnicodeFunctor::UnicodeFunctor() {} -inline UnicodeFunctor::~UnicodeFunctor() {} +/*inline UnicodeFunctor::UnicodeFunctor() {}*/ U_NAMESPACE_END diff --git a/icuSources/common/unicode/unimatch.h b/icuSources/common/unicode/unimatch.h index e1a87182..f23bfd01 100644 --- a/icuSources/common/unicode/unimatch.h +++ b/icuSources/common/unicode/unimatch.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2001, International Business Machines Corporation and others. All Rights Reserved. +* Copyright (C) 2001-2004, International Business Machines Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description * 07/18/01 aliu Creation. @@ -19,7 +19,7 @@ class UnicodeSet; /** * Constants returned by UnicodeMatcher::matches() * indicating the degree of match. - * @draft ICU 2.4 + * @stable ICU 2.4 */ enum UMatchDegree { /** @@ -27,7 +27,7 @@ enum UMatchDegree { * mismatch between the text and this matcher. The text contains * a character which does not match, or the text does not contain * all desired characters for a non-incremental match. - * @draft ICU 2.4 + * @stable ICU 2.4 */ U_MISMATCH, @@ -39,7 +39,7 @@ enum UMatchDegree { * complete match. Alternatively, for variable-length matchers, * all characters of the text match, and if more characters were * supplied at limit, they might also match. - * @draft ICU 2.4 + * @stable ICU 2.4 */ U_PARTIAL_MATCH, @@ -49,7 +49,7 @@ enum UMatchDegree { * incremental variable-length match, this value is returned if * the given text matches, and it is known that additional * characters would not alter the extent of the match. - * @draft ICU 2.4 + * @stable ICU 2.4 */ U_MATCH }; @@ -57,16 +57,16 @@ enum UMatchDegree { /** * UnicodeMatcher defines a protocol for objects that can * match a range of characters in a Replaceable string. - * @draft ICU 2.4 + * @stable ICU 2.4 */ class U_COMMON_API UnicodeMatcher /* not : public UObject because this is an interface/mixin class */ { public: /** * Destructor. - * @draft ICU 2.4 + * @stable ICU 2.4 */ - virtual inline ~UnicodeMatcher() {}; + virtual ~UnicodeMatcher(); /** * Return a UMatchDegree value indicating the degree of match for @@ -112,7 +112,7 @@ public: * @return a match degree value indicating a full match, a partial * match, or a mismatch. If incremental is FALSE then * U_PARTIAL_MATCH should never be returned. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UMatchDegree matches(const Replaceable& text, int32_t& offset, @@ -126,10 +126,10 @@ public: * @param result the string to receive the pattern. Previous * contents will be deleted. * @param escapeUnprintable if TRUE then convert unprintable - * character to their hex escape representations, \uxxxx or - * \Uxxxxxxxx. Unprintable characters are those other than + * character to their hex escape representations, \\uxxxx or + * \\Uxxxxxxxx. Unprintable characters are those other than * U+000A, U+0020..U+007E. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UnicodeString& toPattern(UnicodeString& result, UBool escapeUnprintable = FALSE) const = 0; @@ -139,7 +139,7 @@ public: * & 0xFF == v, at offset, in the forward direction (with limit > * offset). This is used by RuleBasedTransliterator for * indexing. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UBool matchesIndexValue(uint8_t v) const = 0; @@ -147,7 +147,7 @@ public: * Union the set of all characters that may be matched by this object * into the given set. * @param toUnionTo the set into which to union the source characters - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual void addMatchSetTo(UnicodeSet& toUnionTo) const = 0; }; diff --git a/icuSources/common/unicode/uniset.h b/icuSources/common/unicode/uniset.h index 80762e95..48464cfd 100644 --- a/icuSources/common/unicode/uniset.h +++ b/icuSources/common/unicode/uniset.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2003, International Business Machines Corporation and others. All Rights Reserved. +* Copyright (C) 1999-2004, International Business Machines Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description * 10/20/99 alan Creation. @@ -11,9 +11,7 @@ #define UNICODESET_H #include "unicode/unifilt.h" -#include "unicode/utypes.h" #include "unicode/unistr.h" -#include "unicode/uchar.h" #include "unicode/uset.h" U_NAMESPACE_BEGIN @@ -22,8 +20,8 @@ class ParsePosition; class SymbolTable; class UVector; class CaseEquivClass; +class RuleCharacterIterator; - /** * A mutable set of Unicode characters and multicharacter strings. Objects of this class * represent character classes used in regular expressions. @@ -68,7 +66,7 @@ class CaseEquivClass; * similar to that employed by version 8 regular expression character * classes. Here are some simple examples: * - *

    + * \htmlonly
    \endhtmlonly * * * @@ -82,32 +80,32 @@ class CaseEquivClass; * * * - * * * - * + * * * * * - * * * - * + * * * *
    []
    [a-e]The characters 'a' through 'e' inclusive, in Unicode code + * The characters 'a' through 'e' inclusive, in Unicode code * point order
    [\u4E01][\\u4E01]The character U+4E01
    [a{ab}{ac}]The character 'a' and the multicharacter strings "ab" and + * The character 'a' and the multicharacter strings "ab" and * "ac"
    [\p{Lu}][\\p{Lu}]All characters in the general category Uppercase Letter
    - *
    - * + * \htmlonly
    \endhtmlonly + * * Any character may be preceded by a backslash in order to remove any special * meaning. White space characters, as defined by UCharacter.isWhitespace(), are * ignored, unless they are escaped. * *

    Property patterns specify a set of characters having a certain * property as defined by the Unicode standard. Both the POSIX-like - * "[:Lu:]" and the Perl-like syntax "\p{Lu}" are recognized. For a + * "[:Lu:]" and the Perl-like syntax "\\p{Lu}" are recognized. For a * complete list of supported property patterns, see the User's Guide * for UnicodeSet at * @@ -119,7 +117,7 @@ class CaseEquivClass; * Unicode property sets. When elements are concatenated, they * specify their union. To complement a set, place a '^' immediately * after the opening '['. Property patterns are inverted by modifying - * their delimiters; "[:^foo]" and "\P{foo}". In any other location, + * their delimiters; "[:^foo]" and "\\P{foo}". In any other location, * '^' has no special meaning. * *

    Ranges are indicated by placing two a '-' between two @@ -129,16 +127,16 @@ class CaseEquivClass; * right character it is a syntax error. If a '-' occurs as the first * character after the opening '[' or '[^', or if it occurs as the * last character before the closing ']', then it is taken as a - * literal. Thus "[a\u005C-b]", "[-ab]", and "[ab-]" all indicate the same + * literal. Thus "[a\-b]", "[-ab]", and "[ab-]" all indicate the same * set of three characters, 'a', 'b', and '-'. * *

    Sets may be intersected using the '&' operator or the asymmetric * set difference may be taken using the '-' operator, for example, - * "[[:L:]&[\u005Cu0000-\u005Cu0FFF]]" indicates the set of all Unicode letters + * "[[:L:]&[\\u0000-\\u0FFF]]" indicates the set of all Unicode letters * with values less than 4096. Operators ('&' and '|') have equal * precedence and bind left-to-right. Thus - * "[[:L:]-[a-z]-[\u005Cu0100-\u005Cu01FF]]" is equivalent to - * "[[[:L:]-[a-z]]-[\u005Cu0100-\u005Cu01FF]]". This only really matters for + * "[[:L:]-[a-z]-[\\u0100-\\u01FF]]" is equivalent to + * "[[[:L:]-[a-z]]-[\\u0100-\\u01FF]]". This only really matters for * difference; intersection is commutative. * * @@ -155,11 +153,11 @@ class CaseEquivClass; *
    [[pat1]-[pat2]] * The asymmetric difference of sets specified by pat1 and * pat2 - *
    [:Lu:] or \p{Lu} + *
    [:Lu:] or \\p{Lu} * The set of characters having the specified * Unicode property; in * this case, Unicode uppercase letters - *
    [:^Lu:] or \P{Lu} + *
    [:^Lu:] or \\P{Lu} * The set of characters not having the given * Unicode property *
    @@ -168,7 +166,7 @@ class CaseEquivClass; * *

    Formal syntax

    * - *
    + * \htmlonly
    \endhtmlonly * * * @@ -200,7 +198,7 @@ class CaseEquivClass; * * * * @@ -250,7 +248,7 @@ class CaseEquivClass; * * *
    pattern :=  char :=  any character that is not special
    * | ('\'
    any character)
    - * | ('\u' hex hex hex hex)
    + * | ('\\u' hex hex hex hex)
    *
    - *
    + * \htmlonly
    \endhtmlonly * * @author Alan Liu * @stable ICU 2.0 @@ -280,15 +278,23 @@ public: /** * Minimum value that can be stored in a UnicodeSet. - * @draft ICU 2.4 + * @stable ICU 2.4 */ +#ifdef U_CYGWIN + static U_COMMON_API const UChar32 MIN_VALUE; +#else static const UChar32 MIN_VALUE; +#endif /** * Maximum value that can be stored in a UnicodeSet. - * @draft ICU 2.4 + * @stable ICU 2.4 */ +#ifdef U_CYGWIN + static U_COMMON_API const UChar32 MAX_VALUE; +#else static const UChar32 MAX_VALUE; +#endif //---------------------------------------------------------------- // Constructors &c @@ -308,7 +314,7 @@ public: * * @param start first character, inclusive, of range * @param end last character, inclusive, of range - * @draft ICU 2.4 + * @stable ICU 2.4 */ UnicodeSet(UChar32 start, UChar32 end); @@ -329,12 +335,33 @@ public: * @param pattern a string specifying what characters are in the set * @param options bitmask for options to apply to the pattern. * Valid options are USET_IGNORE_SPACE and USET_CASE_INSENSITIVE. + * @param symbols a symbol table mapping variable names to values + * and stand-in characters to UnicodeSets; may be NULL * @param status returns U_ILLEGAL_ARGUMENT_ERROR if the pattern * contains a syntax error. * @internal */ UnicodeSet(const UnicodeString& pattern, uint32_t options, + const SymbolTable* symbols, + UErrorCode& status); + + /** + * Constructs a set from the given pattern. See the class description + * for the syntax of the pattern language. + * @param pattern a string specifying what characters are in the set + * @param pos on input, the position in pattern at which to start parsing. + * On output, the position after the last character parsed. + * @param options bitmask for options to apply to the pattern. + * Valid options are USET_IGNORE_SPACE and USET_CASE_INSENSITIVE. + * @param symbols a symbol table mapping variable names to values + * and stand-in characters to UnicodeSets; may be NULL + * @param status input-output error code + * @draft ICU 2.8 + */ + UnicodeSet(const UnicodeString& pattern, ParsePosition& pos, + uint32_t options, + const SymbolTable* symbols, UErrorCode& status); #ifdef U_USE_UNICODESET_DEPRECATES @@ -413,14 +440,14 @@ public: * * @param start first character in the set, inclusive * @param end last character in the set, inclusive - * @draft ICU 2.4 + * @stable ICU 2.4 */ UnicodeSet& set(UChar32 start, UChar32 end); /** * Return true if the given position, in the given pattern, appears * to be the start of a UnicodeSet pattern. - * @draft ICU 2.4 + * @stable ICU 2.4 */ static UBool resemblesPattern(const UnicodeString& pattern, int32_t pos); @@ -432,10 +459,12 @@ public: * @param pattern a string specifying what characters are in the set * @param status returns U_ILLEGAL_ARGUMENT_ERROR if the pattern * contains a syntax error. + * Empties the set passed before applying the pattern. + * @return a reference to this * @stable ICU 2.0 */ - virtual UnicodeSet& applyPattern(const UnicodeString& pattern, - UErrorCode& status); + UnicodeSet& applyPattern(const UnicodeString& pattern, + UErrorCode& status); /** * Modifies this set to represent the set specified by the given @@ -444,12 +473,53 @@ public: * @param pattern a string specifying what characters are in the set * @param options bitmask for options to apply to the pattern. * Valid options are USET_IGNORE_SPACE and USET_CASE_INSENSITIVE. + * @param symbols a symbol table mapping variable names to + * values and stand-ins to UnicodeSets; may be NULL * @param status returns U_ILLEGAL_ARGUMENT_ERROR if the pattern * contains a syntax error. + * Empties the set passed before applying the pattern. + * @return a reference to this * @internal */ UnicodeSet& applyPattern(const UnicodeString& pattern, uint32_t options, + const SymbolTable* symbols, + UErrorCode& status); + + /** + * Parses the given pattern, starting at the given position. The + * character at pattern.charAt(pos.getIndex()) must be '[', or the + * parse fails. Parsing continues until the corresponding closing + * ']'. If a syntax error is encountered between the opening and + * closing brace, the parse fails. Upon return from a successful + * parse, the ParsePosition is updated to point to the character + * following the closing ']', and a StringBuffer containing a + * pairs list for the parsed pattern is returned. This method calls + * itself recursively to parse embedded subpatterns. + * Empties the set passed before applying the pattern. + * + * @param pattern the string containing the pattern to be parsed. + * The portion of the string from pos.getIndex(), which must be a + * '[', to the corresponding closing ']', is parsed. + * @param pos upon entry, the position at which to being parsing. + * The character at pattern.charAt(pos.getIndex()) must be a '['. + * Upon return from a successful parse, pos.getIndex() is either + * the character after the closing ']' of the parsed pattern, or + * pattern.length() if the closing ']' is the last character of + * the pattern string. + * @param options bitmask for options to apply to the pattern. + * Valid options are USET_IGNORE_SPACE and USET_CASE_INSENSITIVE. + * @param symbols a symbol table mapping variable names to + * values and stand-ins to UnicodeSets; may be NULL + * @param status returns U_ILLEGAL_ARGUMENT_ERROR if the pattern + * contains a syntax error. + * @return a reference to this + * @draft ICU 2.8 + */ + UnicodeSet& applyPattern(const UnicodeString& pattern, + ParsePosition& pos, + uint32_t options, + const SymbolTable* symbols, UErrorCode& status); /** @@ -459,13 +529,13 @@ public: * @param result the string to receive the rules. Previous * contents will be deleted. * @param escapeUnprintable if TRUE then convert unprintable - * character to their hex escape representations, \uxxxx or - * \Uxxxxxxxx. Unprintable characters are those other than + * character to their hex escape representations, \\uxxxx or + * \\Uxxxxxxxx. Unprintable characters are those other than * U+000A, U+0020..U+007E. * @stable ICU 2.0 */ virtual UnicodeString& toPattern(UnicodeString& result, - UBool escapeUnprintable = FALSE) const; + UBool escapeUnprintable = FALSE) const; /** * Modifies this set to contain those code points which have the given value @@ -486,7 +556,7 @@ public: * * @return a reference to this set * - * @draft ICU 2.4 + * @stable ICU 2.4 */ UnicodeSet& applyIntPropertyValue(UProperty prop, int32_t value, @@ -504,8 +574,8 @@ public: * property alias, or a special ID. Special IDs are matched loosely and * correspond to the following sets: * - * "ANY" = [\u0000-\U0010FFFF], - * "ASCII" = [\u0000-\u007F]. + * "ANY" = [\\u0000-\\U0010FFFF], + * "ASCII" = [\\u0000-\\u007F]. * * @param value a value alias, either short or long. The name is matched * loosely. See PropertyValueAliases.txt for names and a description of @@ -517,15 +587,16 @@ public: * * @return a reference to this set * - * @draft ICU 2.4 + * @stable ICU 2.4 */ UnicodeSet& applyPropertyAlias(const UnicodeString& prop, const UnicodeString& value, UErrorCode& ec); /** - * Returns the number of elements in this set (its cardinality), - * n, where 0 <= n <= 65536. + * Returns the number of elements in this set (its cardinality). + * Note than the elements of a set may include both individual + * codepoints and strings. * * @return the number of elements in this set (its cardinality). * @stable ICU 2.0 @@ -547,7 +618,7 @@ public: * @stable ICU 2.0 */ virtual UBool contains(UChar32 c) const; - + /** * Returns true if this set contains every character * of the given range. @@ -563,35 +634,35 @@ public: * multicharacter string. * @param s string to be checked for containment * @return true if this set contains the specified string - * @draft ICU 2.4 + * @stable ICU 2.4 */ UBool contains(const UnicodeString& s) const; - + /** * Returns true if this set contains all the characters and strings * of the given set. * @param c set to be checked for containment * @return true if the test condition is met - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UBool containsAll(const UnicodeSet& c) const; - + /** * Returns true if this set contains all the characters * of the given string. * @param s string containing characters to be checked for containment * @return true if the test condition is met - * @draft ICU 2.4 + * @stable ICU 2.4 */ UBool containsAll(const UnicodeString& s) const; - + /** * Returns true if this set contains none of the characters * of the given range. * @param start first character, inclusive, of the range * @param end last character, inclusive, of the range * @return true if the test condition is met - * @draft ICU 2.4 + * @stable ICU 2.4 */ UBool containsNone(UChar32 start, UChar32 end) const; @@ -600,57 +671,57 @@ public: * of the given set. * @param c set to be checked for containment * @return true if the test condition is met - * @draft ICU 2.4 + * @stable ICU 2.4 */ UBool containsNone(const UnicodeSet& c) const; - + /** * Returns true if this set contains none of the characters * of the given string. * @param s string containing characters to be checked for containment * @return true if the test condition is met - * @draft ICU 2.4 + * @stable ICU 2.4 */ UBool containsNone(const UnicodeString& s) const; - + /** * Returns true if this set contains one or more of the characters * in the given range. * @param start first character, inclusive, of the range * @param end last character, inclusive, of the range * @return true if the condition is met - * @draft ICU 2.4 + * @stable ICU 2.4 */ inline UBool containsSome(UChar32 start, UChar32 end) const; - + /** * Returns true if this set contains one or more of the characters * and strings of the given set. * @param s The set to be checked for containment * @return true if the condition is met - * @draft ICU 2.4 + * @stable ICU 2.4 */ inline UBool containsSome(const UnicodeSet& s) const; - + /** * Returns true if this set contains one or more of the characters * of the given string. * @param s string containing characters to be checked for containment * @return true if the condition is met - * @draft ICU 2.4 + * @stable ICU 2.4 */ inline UBool containsSome(const UnicodeString& s) const; - + /** * Implement UnicodeMatcher::matches() - * @draft ICU 2.4 + * @stable ICU 2.4 */ - UMatchDegree matches(const Replaceable& text, + virtual UMatchDegree matches(const Replaceable& text, int32_t& offset, int32_t limit, UBool incremental); - private: +private: /** * Returns the longest match for s in text at the given position. * If limit > start then match forward from start+1 to limit @@ -675,7 +746,7 @@ public: static int32_t matchRest(const Replaceable& text, int32_t start, int32_t limit, const UnicodeString& s); - + /** * Returns the smallest value i such that c < list[i]. Caller * must ensure that c is a legal value or this method will enter @@ -687,16 +758,16 @@ public: */ int32_t findCodePoint(UChar32 c) const; - public: +public: /** * Implementation of UnicodeMatcher API. Union the set of all * characters that may be matched by this object into the given * set. * @param toUnionTo the set into which to union the source characters - * @draft ICU 2.4 + * @stable ICU 2.4 */ - void addMatchSetTo(UnicodeSet& toUnionTo) const; + virtual void addMatchSetTo(UnicodeSet& toUnionTo) const; /** * Returns the index of the given character within this set, where @@ -704,7 +775,7 @@ public: * is not in this set, return -1. The inverse of this method is * charAt(). * @return an index from 0..size()-1, or -1 - * @draft ICU 2.4 + * @stable ICU 2.4 */ int32_t indexOf(UChar32 c) const; @@ -715,7 +786,7 @@ public: * indexOf(). * @param index an index from 0..size()-1 * @return the character at the given index, or (UChar32)-1. - * @draft ICU 2.4 + * @stable ICU 2.4 */ UChar32 charAt(int32_t index) const; @@ -750,11 +821,11 @@ public: *
    Warning: you cannot add an empty string ("") to a UnicodeSet. * @param s the source string * @return this object, for chaining - * @draft ICU 2.4 + * @stable ICU 2.4 */ UnicodeSet& add(const UnicodeString& s); - private: + private: /** * @return a code point IF the string consists of a single one. * otherwise returns -1. @@ -763,14 +834,14 @@ public: static int32_t getSingleCP(const UnicodeString& s); void _add(const UnicodeString& s); - + public: /** * Adds each of the characters in this string to the set. Thus "ch" => {"c", "h"} * If this set already any particular character, it has no effect on that character. * @param s the source string * @return this object, for chaining - * @draft ICU 2.4 + * @stable ICU 2.4 */ UnicodeSet& addAll(const UnicodeString& s); @@ -779,7 +850,7 @@ public: * If this set already any particular character, it has no effect on that character. * @param s the source string * @return this object, for chaining - * @draft ICU 2.4 + * @stable ICU 2.4 */ UnicodeSet& retainAll(const UnicodeString& s); @@ -788,7 +859,7 @@ public: * If this set already any particular character, it has no effect on that character. * @param s the source string * @return this object, for chaining - * @draft ICU 2.4 + * @stable ICU 2.4 */ UnicodeSet& complementAll(const UnicodeString& s); @@ -797,7 +868,7 @@ public: * If this set already any particular character, it has no effect on that character. * @param s the source string * @return this object, for chaining - * @draft ICU 2.4 + * @stable ICU 2.4 */ UnicodeSet& removeAll(const UnicodeString& s); @@ -807,19 +878,19 @@ public: * @param s the source string * @return a newly created set containing the given string. * The caller owns the return object and is responsible for deleting it. - * @draft ICU 2.4 + * @stable ICU 2.4 */ - static UnicodeSet* createFrom(const UnicodeString& s); + static UnicodeSet* U_EXPORT2 createFrom(const UnicodeString& s); + - /** * Makes a set from each of the characters in the string. Thus "ch" => {"c", "h"} * @param s the source string * @return a newly created set containing the given characters * The caller owns the return object and is responsible for deleting it. - * @draft ICU 2.4 + * @stable ICU 2.4 */ - static UnicodeSet* createFromAll(const UnicodeString& s); + static UnicodeSet* U_EXPORT2 createFromAll(const UnicodeString& s); /** * Retain only the elements in this set that are contained in the @@ -870,7 +941,7 @@ public: * returns. * @param s the source string * @return this object, for chaining - * @draft ICU 2.4 + * @stable ICU 2.4 */ UnicodeSet& remove(const UnicodeString& s); @@ -912,7 +983,7 @@ public: *
    Warning: you cannot add an empty string ("") to a UnicodeSet. * @param s the string to complement * @return this object, for chaining - * @draft ICU 2.4 + * @stable ICU 2.4 */ UnicodeSet& complement(const UnicodeString& s); @@ -960,7 +1031,7 @@ public: * * @param c set that defines which elements will be xor'ed from * this set. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UnicodeSet& complementAll(const UnicodeSet& c); @@ -982,7 +1053,7 @@ public: * 2. For each string 'e' in the resulting set, if e != * foldCase(e), 'e' will be removed. * - * Example: [aq\u00DF{Bc}{bC}{Fi}] => [aAqQ\u00DF\uFB01{ss}{bc}{fi}] + * Example: [aq\\u00DF{Bc}{bC}{Fi}] => [aAqQ\\u00DF\\uFB01{ss}{bc}{fi}] * * (Here foldCase(x) refers to the operation u_strFoldCase, and a * == b denotes that the contents are the same, not pointer @@ -1001,7 +1072,7 @@ public: * this set. * @see #getRangeStart * @see #getRangeEnd - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual int32_t getRangeCount(void) const; @@ -1010,7 +1081,7 @@ public: * specified range of this set. * @see #getRangeCount * @see #getRangeEnd - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UChar32 getRangeStart(int32_t index) const; @@ -1019,7 +1090,7 @@ public: * specified range of this set. * @see #getRangeStart * @see #getRangeEnd - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UChar32 getRangeEnd(int32_t index) const; @@ -1069,14 +1140,14 @@ public: * @return the total length of the serialized format, including * the header, that is, n+2*m+(m!=0?2:1), or 0 on error other * than U_BUFFER_OVERFLOW_ERROR. - * @draft ICU 2.4 + * @stable ICU 2.4 */ int32_t serialize(uint16_t *dest, int32_t destCapacity, UErrorCode& ec) const; /** * Reallocate this objects internal structures to take up the least * possible space, without changing this object's value. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UnicodeSet& compact(); @@ -1091,7 +1162,7 @@ public: * @return The class ID for all objects of this class. * @stable ICU 2.0 */ - static UClassID getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(void); /** * Implement UnicodeFunctor API. @@ -1099,7 +1170,7 @@ public: * @return The class ID for this object. All objects of a given * class have the same class ID. Objects of other classes have * different class IDs. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UClassID getDynamicClassID(void) const; @@ -1113,49 +1184,11 @@ private: const UnicodeString* getString(int32_t index) const; -private: - - static const char fgClassID; - //---------------------------------------------------------------- // RuleBasedTransliterator support //---------------------------------------------------------------- - friend class TransliteratorParser; - friend class TransliteratorIDParser; - - friend class RBBIRuleScanner; - friend class RegexCompile; - - /** - * Constructs a set from the given pattern. See the class description - * for the syntax of the pattern language. - - * @param pattern a string specifying what characters are in the set - * @param pos on input, the position in pattern at which to start parsing. - * On output, the position after the last character parsed. - * @param varNameToChar a mapping from variable names (String) to characters - * (Character). May be null. If varCharToSet is non-null, then names may - * map to either single characters or sets, depending on whether a mapping - * exists in varCharToSet. If varCharToSet is null then all names map to - * single characters. - * @param varCharToSet a mapping from characters (Character objects from - * varNameToChar) to UnicodeSet objects. May be null. Is only used if - * varNameToChar is also non-null. - * @exception U_ILLEGAL_ARGUMENT_ERROR if the pattern - * contains a syntax error. - */ - UnicodeSet(const UnicodeString& pattern, ParsePosition& pos, - const SymbolTable& symbols, - UErrorCode& status); - - /** - * Constructs a set from the given pattern. Identical to the - * 4-parameter ParsePosition contstructor, but does not take a - * SymbolTable, and does not recognize embedded variables. - */ - UnicodeSet(const UnicodeString& pattern, ParsePosition& pos, - uint32_t options, UErrorCode& status); +private: /** * Returns true if this set contains any character whose low byte @@ -1170,35 +1203,11 @@ private: // Implementation: Pattern parsing //---------------------------------------------------------------- - /** - * Parses the given pattern, starting at the given position. The - * character at pattern.charAt(pos.getIndex()) must be '[', or the - * parse fails. Parsing continues until the corresponding closing - * ']'. If a syntax error is encountered between the opening and - * closing brace, the parse fails. Upon return from a successful - * parse, the ParsePosition is updated to point to the character - * following the closing ']', and a StringBuffer containing a - * pairs list for the parsed pattern is returned. This method calls - * itself recursively to parse embedded subpatterns. - * - * @param pattern the string containing the pattern to be parsed. - * The portion of the string from pos.getIndex(), which must be a - * '[', to the corresponding closing ']', is parsed. - * @param pos upon entry, the position at which to being parsing. - * The character at pattern.charAt(pos.getIndex()) must be a '['. - * Upon return from a successful parse, pos.getIndex() is either - * the character after the closing ']' of the parsed pattern, or - * pattern.length() if the closing ']' is the last character of - * the pattern string. - * @return a StringBuffer containing a pairs list for the parsed - * substring of pattern - * @exception U_ILLEGAL_ARGUMENT_ERROR if the parse fails. - */ - void applyPattern(const UnicodeString& pattern, - ParsePosition& pos, - uint32_t options, + void applyPattern(RuleCharacterIterator& chars, const SymbolTable* symbols, - UErrorCode& status); + UnicodeString& rebuiltPat, + uint32_t options, + UErrorCode& ec); //---------------------------------------------------------------- // Implementation: Utility methods @@ -1212,13 +1221,6 @@ private: UBool allocateStrings(); - void _applyPattern(const UnicodeString& pattern, - ParsePosition& pos, - uint32_t options, - const SymbolTable* symbols, - UnicodeString& rebuiltPat, - UErrorCode& status); - UnicodeString& _toPattern(UnicodeString& result, UBool escapeUnprintable) const; @@ -1241,12 +1243,15 @@ private: /** * Return true if the given position, in the given pattern, appears - * to be the start of a property set pattern [:foo:], \p{foo}, or - * \P{foo}, or \N{name}. + * to be the start of a property set pattern [:foo:], \\p{foo}, or + * \\P{foo}, or \\N{name}. */ static UBool resemblesPropertyPattern(const UnicodeString& pattern, int32_t pos); + static UBool resemblesPropertyPattern(RuleCharacterIterator& chars, + int32_t iterOpts); + /** * Parse the given property pattern at the given parse position * and set this UnicodeSet to the result. @@ -1258,11 +1263,11 @@ private: * Recognized syntax: * * [:foo:] [:^foo:] - white space not allowed within "[:" or ":]" - * \p{foo} \P{foo} - white space not allowed within "\p" or "\P" - * \N{name} - white space not allowed within "\N" + * \\p{foo} \\P{foo} - white space not allowed within "\\p" or "\\P" + * \\N{name} - white space not allowed within "\\N" * * Other than the above restrictions, white space is ignored. Case - * is ignored except in "\p" and "\P" and "\N". In 'name' leading + * is ignored except in "\\p" and "\\P" and "\\N". In 'name' leading * and trailing space is deleted, and internal runs of whitespace * are collapsed to a single space. * @@ -1277,7 +1282,7 @@ private: * @param ppos on entry, the position at which to begin parsing. * This should be one of the locations marked '^': * - * [:blah:] \p{blah} \P{blah} \N{name} + * [:blah:] \\p{blah} \\P{blah} \\N{name} * ^ % ^ % ^ % ^ % * * On return, the position after the last character parsed, that is, @@ -1289,6 +1294,10 @@ private: ParsePosition& ppos, UErrorCode &ec); + void applyPropertyPattern(RuleCharacterIterator& chars, + UnicodeString& rebuiltPat, + UErrorCode& ec); + /** * A filter that returns TRUE if the given code point should be * included in the UnicodeSet being constructed. @@ -1301,17 +1310,18 @@ private: * property-conformant. That is, if it returns value v for one * code point, then it must return v for all affiliated code * points, as defined by the inclusions list. See - * uprv_getInclusions(). + * getInclusions(). + * src is a UPropertySource value. */ void applyFilter(Filter filter, void* context, + int32_t src, UErrorCode &status); /** - * Return a cached copy of the inclusions list that - * uprv_getInclusions() produces. + * Return a cached copy of the inclusions list for the property source. */ - static const UnicodeSet* getInclusions(UErrorCode &errorCode); + static const UnicodeSet* getInclusions(int32_t src, UErrorCode &errorCode); friend class UnicodeSetIterator; @@ -1330,14 +1340,6 @@ private: static const CaseEquivClass* getCaseMapOf(UChar folded); }; -inline UClassID -UnicodeSet::getStaticClassID(void) -{ return (UClassID)&fgClassID; } - -inline UClassID -UnicodeSet::getDynamicClassID(void) const -{ return UnicodeSet::getStaticClassID(); } - inline UBool UnicodeSet::operator!=(const UnicodeSet& o) const { return !operator==(o); } diff --git a/icuSources/common/unicode/unistr.h b/icuSources/common/unicode/unistr.h index 3cc63404..3827458b 100644 --- a/icuSources/common/unicode/unistr.h +++ b/icuSources/common/unicode/unistr.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1998-2003, International Business Machines +* Copyright (C) 1998-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -21,8 +21,6 @@ #ifndef UNISTR_H #define UNISTR_H -#include "unicode/utypes.h" -#include "unicode/uobject.h" #include "unicode/rep.h" struct UConverter; // unicode/ucnv.h @@ -33,26 +31,37 @@ class StringThreadTest; /** * Option bit for u_strCaseCompare, u_strcasecmp, unorm_compare, etc: * Compare strings in code point order instead of code unit order. - * @draft ICU 2.2 + * @stable ICU 2.2 */ #define U_COMPARE_CODE_POINT_ORDER 0x8000 #endif #ifndef USTRING_H /* see ustring.h */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_strlen(const UChar *s); #endif U_NAMESPACE_BEGIN class Locale; // unicode/locid.h -class UCharReference; class StringCharacterIterator; class BreakIterator; // unicode/brkiter.h /* The include has been moved to unicode/ustream.h */ +/** + * Constant to be used in the UnicodeString(char *, int32_t, EInvariant) constructor + * which constructs a Unicode string from an invariant-character char * string. + * About invariant characters see utypes.h. + * This constructor has no runtime dependency on conversion code and is + * therefore recommended over ones taking a charset name string + * (where the empty string "" indicates invariant-character conversion). + * + * @draft ICU 3.2 + */ +#define US_INV UnicodeString::kInvariant + /** * Unicode String literals in C++. * Dependent on the platform properties, different UnicodeString @@ -75,7 +84,7 @@ class BreakIterator; // unicode/brkiter.h #elif U_SIZEOF_UCHAR==1 && U_CHARSET_FAMILY==U_ASCII_FAMILY # define UNICODE_STRING(cs, _length) UnicodeString(TRUE, (const UChar *)cs, _length) #else -# define UNICODE_STRING(cs, _length) UnicodeString(cs, _length, "") +# define UNICODE_STRING(cs, _length) UnicodeString(cs, _length, US_INV) #endif /** @@ -96,7 +105,7 @@ class BreakIterator; // unicode/brkiter.h #elif U_SIZEOF_UCHAR==1 && U_CHARSET_FAMILY==U_ASCII_FAMILY # define UNICODE_STRING_SIMPLE(cs) UnicodeString(TRUE, (const UChar *)cs, -1) #else -# define UNICODE_STRING_SIMPLE(cs) UnicodeString(cs, "") +# define UNICODE_STRING_SIMPLE(cs) UnicodeString(cs, -1, US_INV) #endif /** @@ -111,7 +120,7 @@ class BreakIterator; // unicode/brkiter.h * *

    In ICU, a Unicode string consists of 16-bit Unicode code units. * A Unicode character may be stored with either - * one code unit — which is the most common case — or with a matched pair of + * one code unit — which is the most common case — or with a matched pair of * special code units ("surrogates"). * The data type for code units is UChar.
    * For single-character handling, a Unicode character code point is a value @@ -173,6 +182,22 @@ class U_COMMON_API UnicodeString : public Replaceable { public: + /** + * Constant to be used in the UnicodeString(char *, int32_t, EInvariant) constructor + * which constructs a Unicode string from an invariant-character char * string. + * Use the macro US_INV instead of the full qualification for this value. + * + * @see US_INV + * @draft ICU 3.2 + */ + enum EInvariant { + /** + * @see EInvariant + * @draft ICU 3.2 + */ + kInvariant + }; + //======================================== // Read-only operations //======================================== @@ -200,8 +225,8 @@ public: /** * Greater than operator. Performs only bitwise comparison. * @param text The UnicodeString to compare to this one. - * @return TRUE if the characters in text are bitwise - * greater than the characters in this, FALSE otherwise + * @return TRUE if the characters in this are bitwise + * greater than the characters in text, FALSE otherwise * @stable ICU 2.0 */ inline UBool operator> (const UnicodeString& text) const; @@ -209,8 +234,8 @@ public: /** * Less than operator. Performs only bitwise comparison. * @param text The UnicodeString to compare to this one. - * @return TRUE if the characters in text are bitwise - * less than the characters in this, FALSE otherwise + * @return TRUE if the characters in this are bitwise + * less than the characters in text, FALSE otherwise * @stable ICU 2.0 */ inline UBool operator< (const UnicodeString& text) const; @@ -218,8 +243,8 @@ public: /** * Greater than or equal operator. Performs only bitwise comparison. * @param text The UnicodeString to compare to this one. - * @return TRUE if the characters in text are bitwise - * greater than or equal to the characters in this, FALSE otherwise + * @return TRUE if the characters in this are bitwise + * greater than or equal to the characters in text, FALSE otherwise * @stable ICU 2.0 */ inline UBool operator>= (const UnicodeString& text) const; @@ -227,58 +252,58 @@ public: /** * Less than or equal operator. Performs only bitwise comparison. * @param text The UnicodeString to compare to this one. - * @return TRUE if the characters in text are bitwise - * less than or equal to the characters in this, FALSE otherwise + * @return TRUE if the characters in this are bitwise + * less than or equal to the characters in text, FALSE otherwise * @stable ICU 2.0 */ inline UBool operator<= (const UnicodeString& text) const; /** * Compare the characters bitwise in this UnicodeString to - * the characters in text. + * the characters in text. * @param text The UnicodeString to compare to this one. - * @return The result of bitwise character comparison: 0 if text - * contains the same characters as this, -1 if the characters in - * text are bitwise less than the characters in this, +1 if the - * characters in text are bitwise greater than the characters - * in this. + * @return The result of bitwise character comparison: 0 if this + * contains the same characters as text, -1 if the characters in + * this are bitwise less than the characters in text, +1 if the + * characters in this are bitwise greater than the characters + * in text. * @stable ICU 2.0 */ inline int8_t compare(const UnicodeString& text) const; /** - * Compare the characters bitwise in the range - * [start, start + length) with the characters - * in srcText + * Compare the characters bitwise in the range + * [start, start + length) with the characters + * in text * @param start the offset at which the compare operation begins * @param length the number of characters of text to compare. - * @param srcText the text to be compared - * @return The result of bitwise character comparison: 0 if text - * contains the same characters as this, -1 if the characters in - * text are bitwise less than the characters in this, +1 if the - * characters in text are bitwise greater than the characters - * in this. + * @param text the other text to be compared against this string. + * @return The result of bitwise character comparison: 0 if this + * contains the same characters as text, -1 if the characters in + * this are bitwise less than the characters in text, +1 if the + * characters in this are bitwise greater than the characters + * in text. * @stable ICU 2.0 */ inline int8_t compare(int32_t start, int32_t length, - const UnicodeString& srcText) const; + const UnicodeString& text) const; /** - * Compare the characters bitwise in the range - * [start, start + length) with the characters - * in srcText in the range - * [srcStart, srcStart + srcLength). + * Compare the characters bitwise in the range + * [start, start + length) with the characters + * in srcText in the range + * [srcStart, srcStart + srcLength). * @param start the offset at which the compare operation begins * @param length the number of characters in this to compare. * @param srcText the text to be compared * @param srcStart the offset into srcText to start comparison * @param srcLength the number of characters in src to compare - * @return The result of bitwise character comparison: 0 if text - * contains the same characters as this, -1 if the characters in - * text are bitwise less than the characters in this, +1 if the - * characters in text are bitwise greater than the characters - * in this. + * @return The result of bitwise character comparison: 0 if this + * contains the same characters as srcText, -1 if the characters in + * this are bitwise less than the characters in srcText, +1 if the + * characters in this are bitwise greater than the characters + * in srcText. * @stable ICU 2.0 */ inline int8_t compare(int32_t start, @@ -288,32 +313,32 @@ public: int32_t srcLength) const; /** - * Compare the characters bitwise in this UnicodeString with the first + * Compare the characters bitwise in this UnicodeString with the first * srcLength characters in srcChars. * @param srcChars The characters to compare to this UnicodeString. * @param srcLength the number of characters in srcChars to compare - * @return The result of bitwise character comparison: 0 if text - * contains the same characters as this, -1 if the characters in - * text are bitwise less than the characters in this, +1 if the - * characters in text are bitwise greater than the characters - * in this. + * @return The result of bitwise character comparison: 0 if this + * contains the same characters as srcChars, -1 if the characters in + * this are bitwise less than the characters in srcChars, +1 if the + * characters in this are bitwise greater than the characters + * in srcChars. * @stable ICU 2.0 */ inline int8_t compare(const UChar *srcChars, int32_t srcLength) const; /** - * Compare the characters bitwise in the range - * [start, start + length) with the first + * Compare the characters bitwise in the range + * [start, start + length) with the first * length characters in srcChars * @param start the offset at which the compare operation begins * @param length the number of characters to compare. * @param srcChars the characters to be compared - * @return The result of bitwise character comparison: 0 if text - * contains the same characters as this, -1 if the characters in - * text are bitwise less than the characters in this, +1 if the - * characters in text are bitwise greater than the characters - * in this. + * @return The result of bitwise character comparison: 0 if this + * contains the same characters as srcChars, -1 if the characters in + * this are bitwise less than the characters in srcChars, +1 if the + * characters in this are bitwise greater than the characters + * in srcChars. * @stable ICU 2.0 */ inline int8_t compare(int32_t start, @@ -321,20 +346,20 @@ public: const UChar *srcChars) const; /** - * Compare the characters bitwise in the range - * [start, start + length) with the characters - * in srcChars in the range - * [srcStart, srcStart + srcLength). + * Compare the characters bitwise in the range + * [start, start + length) with the characters + * in srcChars in the range + * [srcStart, srcStart + srcLength). * @param start the offset at which the compare operation begins * @param length the number of characters in this to compare * @param srcChars the characters to be compared * @param srcStart the offset into srcChars to start comparison * @param srcLength the number of characters in srcChars to compare - * @return The result of bitwise character comparison: 0 if text - * contains the same characters as this, -1 if the characters in - * text are bitwise less than the characters in this, +1 if the - * characters in text are bitwise greater than the characters - * in this. + * @return The result of bitwise character comparison: 0 if this + * contains the same characters as srcChars, -1 if the characters in + * this are bitwise less than the characters in srcChars, +1 if the + * characters in this are bitwise greater than the characters + * in srcChars. * @stable ICU 2.0 */ inline int8_t compare(int32_t start, @@ -344,20 +369,20 @@ public: int32_t srcLength) const; /** - * Compare the characters bitwise in the range - * [start, limit) with the characters - * in srcText in the range - * [srcStart, srcLimit). + * Compare the characters bitwise in the range + * [start, limit) with the characters + * in srcText in the range + * [srcStart, srcLimit). * @param start the offset at which the compare operation begins * @param limit the offset immediately following the compare operation * @param srcText the text to be compared * @param srcStart the offset into srcText to start comparison * @param srcLimit the offset into srcText to limit comparison - * @return The result of bitwise character comparison: 0 if text - * contains the same characters as this, -1 if the characters in - * text are bitwise less than the characters in this, +1 if the - * characters in text are bitwise greater than the characters - * in this. + * @return The result of bitwise character comparison: 0 if this + * contains the same characters as srcText, -1 if the characters in + * this are bitwise less than the characters in srcText, +1 if the + * characters in this are bitwise greater than the characters + * in srcText. * @stable ICU 2.0 */ inline int8_t compareBetween(int32_t start, @@ -716,19 +741,19 @@ public: /** * Determine if this starts with the characters in text * @param text The text to match. - * @return TRUE if this starts with the characters in text, + * @return TRUE if this starts with the characters in text, * FALSE otherwise * @stable ICU 2.0 */ inline UBool startsWith(const UnicodeString& text) const; /** - * Determine if this starts with the characters in srcText - * in the range [srcStart, srcStart + srcLength). + * Determine if this starts with the characters in srcText + * in the range [srcStart, srcStart + srcLength). * @param srcText The text to match. * @param srcStart the offset into srcText to start matching * @param srcLength the number of characters in srcText to match - * @return TRUE if this starts with the characters in text, + * @return TRUE if this starts with the characters in text, * FALSE otherwise * @stable ICU 2.0 */ @@ -740,7 +765,7 @@ public: * Determine if this starts with the characters in srcChars * @param srcChars The characters to match. * @param srcLength the number of characters in srcChars - * @return TRUE if this starts with the characters in srcChars, + * @return TRUE if this starts with the characters in srcChars, * FALSE otherwise * @stable ICU 2.0 */ @@ -748,8 +773,8 @@ public: int32_t srcLength) const; /** - * Determine if this ends with the characters in srcChars - * in the range [srcStart, srcStart + srcLength). + * Determine if this ends with the characters in srcChars + * in the range [srcStart, srcStart + srcLength). * @param srcChars The characters to match. * @param srcStart the offset into srcText to start matching * @param srcLength the number of characters in srcChars to match @@ -763,19 +788,19 @@ public: /** * Determine if this ends with the characters in text * @param text The text to match. - * @return TRUE if this ends with the characters in text, + * @return TRUE if this ends with the characters in text, * FALSE otherwise * @stable ICU 2.0 */ inline UBool endsWith(const UnicodeString& text) const; /** - * Determine if this ends with the characters in srcText - * in the range [srcStart, srcStart + srcLength). + * Determine if this ends with the characters in srcText + * in the range [srcStart, srcStart + srcLength). * @param srcText The text to match. * @param srcStart the offset into srcText to start matching * @param srcLength the number of characters in srcText to match - * @return TRUE if this ends with the characters in text, + * @return TRUE if this ends with the characters in text, * FALSE otherwise * @stable ICU 2.0 */ @@ -787,7 +812,7 @@ public: * Determine if this ends with the characters in srcChars * @param srcChars The characters to match. * @param srcLength the number of characters in srcChars - * @return TRUE if this ends with the characters in srcChars, + * @return TRUE if this ends with the characters in srcChars, * FALSE otherwise * @stable ICU 2.0 */ @@ -795,12 +820,12 @@ public: int32_t srcLength) const; /** - * Determine if this ends with the characters in srcChars - * in the range [srcStart, srcStart + srcLength). + * Determine if this ends with the characters in srcChars + * in the range [srcStart, srcStart + srcLength). * @param srcChars The characters to match. * @param srcStart the offset into srcText to start matching * @param srcLength the number of characters in srcChars to match - * @return TRUE if this ends with the characters in srcChars, + * @return TRUE if this ends with the characters in srcChars, * FALSE otherwise * @stable ICU 2.0 */ @@ -815,7 +840,7 @@ public: * Locate in this the first occurrence of the characters in text, * using bitwise comparison. * @param text The text to search for. - * @return The offset into this of the start of text, + * @return The offset into this of the start of text, * or -1 if not found. * @stable ICU 2.0 */ @@ -826,7 +851,7 @@ public: * starting at offset start, using bitwise comparison. * @param text The text to search for. * @param start The offset at which searching will start. - * @return The offset into this of the start of text, + * @return The offset into this of the start of text, * or -1 if not found. * @stable ICU 2.0 */ @@ -835,12 +860,12 @@ public: /** * Locate in this the first occurrence in the range - * [start, start + length) of the characters + * [start, start + length) of the characters * in text, using bitwise comparison. * @param text The text to search for. * @param start The offset at which searching will start. * @param length The number of characters to search - * @return The offset into this of the start of text, + * @return The offset into this of the start of text, * or -1 if not found. * @stable ICU 2.0 */ @@ -851,16 +876,16 @@ public: /** * Locate in this the first occurrence in the range * [start, start + length) of the characters - * in srcText in the range - * [srcStart, srcStart + srcLength), - * using bitwise comparison. + * in srcText in the range + * [srcStart, srcStart + srcLength), + * using bitwise comparison. * @param srcText The text to search for. * @param srcStart the offset into srcText at which * to start matching * @param srcLength the number of characters in srcText to match * @param start the offset into this at which to start matching * @param length the number of characters in this to search - * @return The offset into this of the start of text, + * @return The offset into this of the start of text, * or -1 if not found. * @stable ICU 2.0 */ @@ -872,12 +897,12 @@ public: /** * Locate in this the first occurrence of the characters in - * srcChars - * starting at offset start, using bitwise comparison. + * srcChars + * starting at offset start, using bitwise comparison. * @param srcChars The text to search for. * @param srcLength the number of characters in srcChars to match * @param start the offset into this at which to start matching - * @return The offset into this of the start of text, + * @return The offset into this of the start of text, * or -1 if not found. * @stable ICU 2.0 */ @@ -887,13 +912,13 @@ public: /** * Locate in this the first occurrence in the range - * [start, start + length) of the characters + * [start, start + length) of the characters * in srcChars, using bitwise comparison. * @param srcChars The text to search for. * @param srcLength the number of characters in srcChars * @param start The offset at which searching will start. * @param length The number of characters to search - * @return The offset into this of the start of srcChars, + * @return The offset into this of the start of srcChars, * or -1 if not found. * @stable ICU 2.0 */ @@ -901,20 +926,20 @@ public: int32_t srcLength, int32_t start, int32_t length) const; - + /** - * Locate in this the first occurrence in the range - * [start, start + length) of the characters - * in srcChars in the range - * [srcStart, srcStart + srcLength), - * using bitwise comparison. + * Locate in this the first occurrence in the range + * [start, start + length) of the characters + * in srcChars in the range + * [srcStart, srcStart + srcLength), + * using bitwise comparison. * @param srcChars The text to search for. - * @param srcStart the offset into srcChars at which + * @param srcStart the offset into srcChars at which * to start matching * @param srcLength the number of characters in srcChars to match * @param start the offset into this at which to start matching * @param length the number of characters in this to search - * @return The offset into this of the start of text, + * @return The offset into this of the start of text, * or -1 if not found. * @stable ICU 2.0 */ @@ -934,7 +959,7 @@ public: inline int32_t indexOf(UChar c) const; /** - * Locate in this the first occurrence of the code point c, + * Locate in this the first occurrence of the code point c, * using bitwise comparison. * * @param c The code point to search for. @@ -968,8 +993,8 @@ public: /** * Locate in this the first occurrence of the BMP code point c - * in the range [start, start + length), - * using bitwise comparison. + * in the range [start, start + length), + * using bitwise comparison. * @param c The code unit to search for. * @param start the offset into this at which to start matching * @param length the number of characters in this to search @@ -981,9 +1006,9 @@ public: int32_t length) const; /** - * Locate in this the first occurrence of the code point c - * in the range [start, start + length), - * using bitwise comparison. + * Locate in this the first occurrence of the code point c + * in the range [start, start + length), + * using bitwise comparison. * * @param c The code point to search for. * @param start the offset into this at which to start matching @@ -996,10 +1021,10 @@ public: int32_t length) const; /** - * Locate in this the last occurrence of the characters in text, + * Locate in this the last occurrence of the characters in text, * using bitwise comparison. * @param text The text to search for. - * @return The offset into this of the start of text, + * @return The offset into this of the start of text, * or -1 if not found. * @stable ICU 2.0 */ @@ -1010,7 +1035,7 @@ public: * starting at offset start, using bitwise comparison. * @param text The text to search for. * @param start The offset at which searching will start. - * @return The offset into this of the start of text, + * @return The offset into this of the start of text, * or -1 if not found. * @stable ICU 2.0 */ @@ -1018,13 +1043,13 @@ public: int32_t start) const; /** - * Locate in this the last occurrence in the range + * Locate in this the last occurrence in the range * [start, start + length) of the characters * in text, using bitwise comparison. * @param text The text to search for. * @param start The offset at which searching will start. * @param length The number of characters to search - * @return The offset into this of the start of text, + * @return The offset into this of the start of text, * or -1 if not found. * @stable ICU 2.0 */ @@ -1033,18 +1058,18 @@ public: int32_t length) const; /** - * Locate in this the last occurrence in the range - * [start, start + length) of the characters - * in srcText in the range - * [srcStart, srcStart + srcLength), - * using bitwise comparison. + * Locate in this the last occurrence in the range + * [start, start + length) of the characters + * in srcText in the range + * [srcStart, srcStart + srcLength), + * using bitwise comparison. * @param srcText The text to search for. - * @param srcStart the offset into srcText at which + * @param srcStart the offset into srcText at which * to start matching * @param srcLength the number of characters in srcText to match * @param start the offset into this at which to start matching * @param length the number of characters in this to search - * @return The offset into this of the start of text, + * @return The offset into this of the start of text, * or -1 if not found. * @stable ICU 2.0 */ @@ -1055,12 +1080,12 @@ public: int32_t length) const; /** - * Locate in this the last occurrence of the characters in srcChars - * starting at offset start, using bitwise comparison. + * Locate in this the last occurrence of the characters in srcChars + * starting at offset start, using bitwise comparison. * @param srcChars The text to search for. * @param srcLength the number of characters in srcChars to match * @param start the offset into this at which to start matching - * @return The offset into this of the start of text, + * @return The offset into this of the start of text, * or -1 if not found. * @stable ICU 2.0 */ @@ -1069,14 +1094,14 @@ public: int32_t start) const; /** - * Locate in this the last occurrence in the range - * [start, start + length) of the characters + * Locate in this the last occurrence in the range + * [start, start + length) of the characters * in srcChars, using bitwise comparison. * @param srcChars The text to search for. * @param srcLength the number of characters in srcChars * @param start The offset at which searching will start. * @param length The number of characters to search - * @return The offset into this of the start of srcChars, + * @return The offset into this of the start of srcChars, * or -1 if not found. * @stable ICU 2.0 */ @@ -1084,20 +1109,20 @@ public: int32_t srcLength, int32_t start, int32_t length) const; - + /** - * Locate in this the last occurrence in the range - * [start, start + length) of the characters - * in srcChars in the range - * [srcStart, srcStart + srcLength), - * using bitwise comparison. + * Locate in this the last occurrence in the range + * [start, start + length) of the characters + * in srcChars in the range + * [srcStart, srcStart + srcLength), + * using bitwise comparison. * @param srcChars The text to search for. * @param srcStart the offset into srcChars at which * to start matching * @param srcLength the number of characters in srcChars to match * @param start the offset into this at which to start matching * @param length the number of characters in this to search - * @return The offset into this of the start of text, + * @return The offset into this of the start of text, * or -1 if not found. * @stable ICU 2.0 */ @@ -1117,7 +1142,7 @@ public: inline int32_t lastIndexOf(UChar c) const; /** - * Locate in this the last occurrence of the code point c, + * Locate in this the last occurrence of the code point c, * using bitwise comparison. * * @param c The code point to search for. @@ -1151,8 +1176,8 @@ public: /** * Locate in this the last occurrence of the BMP code point c - * in the range [start, start + length), - * using bitwise comparison. + * in the range [start, start + length), + * using bitwise comparison. * @param c The code unit to search for. * @param start the offset into this at which to start matching * @param length the number of characters in this to search @@ -1164,9 +1189,9 @@ public: int32_t length) const; /** - * Locate in this the last occurrence of the code point c - * in the range [start, start + length), - * using bitwise comparison. + * Locate in this the last occurrence of the code point c + * in the range [start, start + length), + * using bitwise comparison. * * @param c The code point to search for. * @param start the offset into this at which to start matching @@ -1303,7 +1328,7 @@ public: /* Substring extraction */ /** - * Copy the characters in the range + * Copy the characters in the range * [start, start + length) into the array dst, * beginning at dstStart. * If the string aliases to dst itself as an external buffer, @@ -1317,9 +1342,9 @@ public: * will be extracted * @stable ICU 2.0 */ - inline void extract(int32_t start, - int32_t length, - UChar *dst, + inline void extract(int32_t start, + int32_t length, + UChar *dst, int32_t dstStart = 0) const; /** @@ -1348,7 +1373,7 @@ public: UErrorCode &errorCode) const; /** - * Copy the characters in the range + * Copy the characters in the range * [start, start + length) into the UnicodeString * target. * @param start offset of first character which will be copied @@ -1362,23 +1387,23 @@ public: UnicodeString& target) const; /** - * Copy the characters in the range [start, limit) + * Copy the characters in the range [start, limit) * into the array dst, beginning at dstStart. * @param start offset of first character which will be copied into the array * @param limit offset immediately following the last character to be copied - * @param dst array in which to copy characters. The length of dst + * @param dst array in which to copy characters. The length of dst * must be at least (dstStart + (limit - start)). * @param dstStart the offset in dst where the first character * will be extracted * @stable ICU 2.0 */ - inline void extractBetween(int32_t start, - int32_t limit, - UChar *dst, + inline void extractBetween(int32_t start, + int32_t limit, + UChar *dst, int32_t dstStart = 0) const; /** - * Copy the characters in the range [start, limit) + * Copy the characters in the range [start, limit) * into the UnicodeString target. Replaceable API. * @param start offset of first character which will be copied * @param limit offset immediately following the last character to be copied @@ -1392,14 +1417,48 @@ public: /** * Copy the characters in the range + * [start, start + length) into an array of characters. + * All characters must be invariant (see utypes.h). + * Use US_INV as the last, signature-distinguishing parameter. + * + * This function does not write any more than targetLength + * characters but returns the length of the entire output string + * so that one can allocate a larger buffer and call the function again + * if necessary. + * The output string is NUL-terminated if possible. + * + * @param start offset of first character which will be copied + * @param startLength the number of characters to extract + * @param target the target buffer for extraction, can be NULL + * if targetLength is 0 + * @param targetCapacity the length of the target buffer + * @param inv Signature-distinguishing paramater, use US_INV. + * @return the output string length, not including the terminating NUL + * @draft ICU 3.2 + */ + int32_t extract(int32_t start, + int32_t startLength, + char *target, + int32_t targetCapacity, + enum EInvariant inv) const; + +#if !UCONFIG_NO_CONVERSION + + /** + * Copy the characters in the range * [start, start + length) into an array of characters * in a specified codepage. * The output string is NUL-terminated. * + * Recommendation: For invariant-character strings use + * extract(int32_t start, int32_t length, char *target, int32_t targetCapacity, enum EInvariant inv) const + * because it avoids object code dependencies of UnicodeString on + * the conversion code. + * * @param start offset of first character which will be copied * @param startLength the number of characters to extract * @param target the target buffer for extraction - * @param codepage the desired codepage for the characters. 0 has + * @param codepage the desired codepage for the characters. 0 has * the special meaning of the default codepage * If codepage is an empty string (""), * then a simple conversion is performed on the codepage-invariant @@ -1416,7 +1475,7 @@ public: const char *codepage = 0) const; /** - * Copy the characters in the range + * Copy the characters in the range * [start, start + length) into an array of characters * in a specified codepage. * This function does not write any more than targetLength @@ -1425,11 +1484,16 @@ public: * if necessary. * The output string is NUL-terminated if possible. * + * Recommendation: For invariant-character strings use + * extract(int32_t start, int32_t length, char *target, int32_t targetCapacity, enum EInvariant inv) const + * because it avoids object code dependencies of UnicodeString on + * the conversion code. + * * @param start offset of first character which will be copied * @param startLength the number of characters to extract * @param target the target buffer for extraction * @param targetLength the length of the target buffer - * @param codepage the desired codepage for the characters. 0 has + * @param codepage the desired codepage for the characters. 0 has * the special meaning of the default codepage * If codepage is an empty string (""), * then a simple conversion is performed on the codepage-invariant @@ -1466,12 +1530,16 @@ public: UConverter *cnv, UErrorCode &errorCode) const; +#endif + /* Length operations */ /** - * Return the length of the UnicodeString object. - * The length is the number of characters in the text. + * Return the length of the UnicodeString object. + * The length is the number of UChar code units are in the UnicodeString. + * If you want the number of code points, please use countChar32(). * @return the length of the UnicodeString object + * @see countChar32 * @stable ICU 2.0 */ inline int32_t length(void) const; @@ -1486,6 +1554,7 @@ public: * @param start the index of the first code unit to check * @param length the number of UChar code units to check * @return the number of code points in the specified code units + * @see length * @stable ICU 2.0 */ int32_t @@ -1512,7 +1581,7 @@ public: * than 'number'. Same as (u_countChar32(s, length)>number). * @see countChar32 * @see u_strHasMoreChar32Than - * @draft ICU 2.4 + * @stable ICU 2.4 */ UBool hasMoreChar32Than(int32_t start, int32_t length, int32_t number) const; @@ -1591,7 +1660,7 @@ public: * * @param src The text containing the characters to replace. * @return a reference to this - * @draft ICU 2.4 + * @stable ICU 2.4 */ UnicodeString &fastCopyFrom(const UnicodeString &src); @@ -1615,21 +1684,21 @@ public: /** * Set the text in the UnicodeString object to the characters - * in srcText in the range + * in srcText in the range * [srcStart, srcText.length()). * srcText is not modified. * @param srcText the source for the new characters * @param srcStart the offset into srcText where new characters * will be obtained * @return a reference to this - * @draft ICU2.2 + * @stable ICU 2.2 */ - inline UnicodeString& setTo(const UnicodeString& srcText, + inline UnicodeString& setTo(const UnicodeString& srcText, int32_t srcStart); /** * Set the text in the UnicodeString object to the characters - * in srcText in the range + * in srcText in the range * [srcStart, srcStart + srcLength). * srcText is not modified. * @param srcText the source for the new characters @@ -1640,13 +1709,13 @@ public: * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& setTo(const UnicodeString& srcText, - int32_t srcStart, + inline UnicodeString& setTo(const UnicodeString& srcText, + int32_t srcStart, int32_t srcLength); /** - * Set the text in the UnicodeString object to the characters in - * srcText. + * Set the text in the UnicodeString object to the characters in + * srcText. * srcText is not modified. * @param srcText the source for the new characters * @return a reference to this @@ -1668,7 +1737,7 @@ public: /** * Set the characters in the UnicodeString object to the code unit * srcChar. - * @param srcChar the code unit which becomes the UnicodeString's character + * @param srcChar the code unit which becomes the UnicodeString's character * content * @return a reference to this * @stable ICU 2.0 @@ -1678,7 +1747,7 @@ public: /** * Set the characters in the UnicodeString object to the code point * srcChar. - * @param srcChar the code point which becomes the UnicodeString's character + * @param srcChar the code point which becomes the UnicodeString's character * content * @return a reference to this * @stable ICU 2.0 @@ -1781,7 +1850,7 @@ public: * @return A reference to this * @stable ICU 2.0 */ - UnicodeString& setCharAt(int32_t offset, + UnicodeString& setCharAt(int32_t offset, UChar ch); @@ -1817,24 +1886,24 @@ public: /** * Append the characters - * in srcText in the range - * [srcStart, srcStart + srcLength) to the - * UnicodeString object at offset start. srcText + * in srcText in the range + * [srcStart, srcStart + srcLength) to the + * UnicodeString object at offset start. srcText * is not modified. * @param srcText the source for the new characters - * @param srcStart the offset into srcText where new characters + * @param srcStart the offset into srcText where new characters * will be obtained - * @param srcLength the number of characters in srcText in + * @param srcLength the number of characters in srcText in * the append string * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& append(const UnicodeString& srcText, - int32_t srcStart, + inline UnicodeString& append(const UnicodeString& srcText, + int32_t srcStart, int32_t srcLength); /** - * Append the characters in srcText to the UnicodeString object at + * Append the characters in srcText to the UnicodeString object at * offset start. srcText is not modified. * @param srcText the source for the new characters * @return a reference to this @@ -1843,24 +1912,24 @@ public: inline UnicodeString& append(const UnicodeString& srcText); /** - * Append the characters in srcChars in the range - * [srcStart, srcStart + srcLength) to the UnicodeString - * object at offset + * Append the characters in srcChars in the range + * [srcStart, srcStart + srcLength) to the UnicodeString + * object at offset * start. srcChars is not modified. * @param srcChars the source for the new characters - * @param srcStart the offset into srcChars where new characters + * @param srcStart the offset into srcChars where new characters * will be obtained - * @param srcLength the number of characters in srcChars in + * @param srcLength the number of characters in srcChars in * the append string * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& append(const UChar *srcChars, - int32_t srcStart, + inline UnicodeString& append(const UChar *srcChars, + int32_t srcStart, int32_t srcLength); /** - * Append the characters in srcChars to the UnicodeString object + * Append the characters in srcChars to the UnicodeString object * at offset start. srcChars is not modified. * @param srcChars the source for the new characters * @param srcLength the number of Unicode characters in srcChars @@ -1890,54 +1959,54 @@ public: /* Insert operations */ /** - * Insert the characters in srcText in the range - * [srcStart, srcStart + srcLength) into the UnicodeString + * Insert the characters in srcText in the range + * [srcStart, srcStart + srcLength) into the UnicodeString * object at offset start. srcText is not modified. * @param start the offset where the insertion begins - * @param srcText the source for the new characters - * @param srcStart the offset into srcText where new characters + * @param srcText the source for the new characters + * @param srcStart the offset into srcText where new characters * will be obtained - * @param srcLength the number of characters in srcText in + * @param srcLength the number of characters in srcText in * the insert string * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& insert(int32_t start, - const UnicodeString& srcText, - int32_t srcStart, + inline UnicodeString& insert(int32_t start, + const UnicodeString& srcText, + int32_t srcStart, int32_t srcLength); /** * Insert the characters in srcText into the UnicodeString object * at offset start. srcText is not modified. * @param start the offset where the insertion begins - * @param srcText the source for the new characters + * @param srcText the source for the new characters * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& insert(int32_t start, + inline UnicodeString& insert(int32_t start, const UnicodeString& srcText); /** - * Insert the characters in srcChars in the range + * Insert the characters in srcChars in the range * [srcStart, srcStart + srcLength) into the UnicodeString * object at offset start. srcChars is not modified. * @param start the offset at which the insertion begins * @param srcChars the source for the new characters - * @param srcStart the offset into srcChars where new characters + * @param srcStart the offset into srcChars where new characters * will be obtained - * @param srcLength the number of characters in srcChars + * @param srcLength the number of characters in srcChars * in the insert string * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& insert(int32_t start, - const UChar *srcChars, - int32_t srcStart, + inline UnicodeString& insert(int32_t start, + const UChar *srcChars, + int32_t srcStart, int32_t srcLength); /** - * Insert the characters in srcChars into the UnicodeString object + * Insert the characters in srcChars into the UnicodeString object * at offset start. srcChars is not modified. * @param start the offset where the insertion begins * @param srcChars the source for the new characters @@ -1945,61 +2014,61 @@ public: * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& insert(int32_t start, + inline UnicodeString& insert(int32_t start, const UChar *srcChars, int32_t srcLength); /** - * Insert the code unit srcChar into the UnicodeString object at + * Insert the code unit srcChar into the UnicodeString object at * offset start. * @param start the offset at which the insertion occurs * @param srcChar the code unit to insert * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& insert(int32_t start, + inline UnicodeString& insert(int32_t start, UChar srcChar); /** - * Insert the code point srcChar into the UnicodeString object at + * Insert the code point srcChar into the UnicodeString object at * offset start. * @param start the offset at which the insertion occurs * @param srcChar the code point to insert * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& insert(int32_t start, + inline UnicodeString& insert(int32_t start, UChar32 srcChar); /* Replace operations */ /** - * Replace the characters in the range - * [start, start + length) with the characters in - * srcText in the range - * [srcStart, srcStart + srcLength). + * Replace the characters in the range + * [start, start + length) with the characters in + * srcText in the range + * [srcStart, srcStart + srcLength). * srcText is not modified. * @param start the offset at which the replace operation begins - * @param length the number of characters to replace. The character at + * @param length the number of characters to replace. The character at * start + length is not modified. * @param srcText the source for the new characters - * @param srcStart the offset into srcText where new characters + * @param srcStart the offset into srcText where new characters * will be obtained - * @param srcLength the number of characters in srcText in + * @param srcLength the number of characters in srcText in * the replace string * @return a reference to this * @stable ICU 2.0 */ - UnicodeString& replace(int32_t start, - int32_t length, - const UnicodeString& srcText, - int32_t srcStart, + UnicodeString& replace(int32_t start, + int32_t length, + const UnicodeString& srcText, + int32_t srcStart, int32_t srcLength); /** - * Replace the characters in the range - * [start, start + length) + * Replace the characters in the range + * [start, start + length) * with the characters in srcText. srcText is * not modified. * @param start the offset at which the replace operation begins @@ -2009,15 +2078,15 @@ public: * @return a reference to this * @stable ICU 2.0 */ - UnicodeString& replace(int32_t start, - int32_t length, + UnicodeString& replace(int32_t start, + int32_t length, const UnicodeString& srcText); /** - * Replace the characters in the range - * [start, start + length) with the characters in - * srcChars in the range - * [srcStart, srcStart + srcLength). srcChars + * Replace the characters in the range + * [start, start + length) with the characters in + * srcChars in the range + * [srcStart, srcStart + srcLength). srcChars * is not modified. * @param start the offset at which the replace operation begins * @param length the number of characters to replace. The character at @@ -2025,19 +2094,19 @@ public: * @param srcChars the source for the new characters * @param srcStart the offset into srcChars where new characters * will be obtained - * @param srcLength the number of characters in srcChars + * @param srcLength the number of characters in srcChars * in the replace string * @return a reference to this * @stable ICU 2.0 */ - UnicodeString& replace(int32_t start, - int32_t length, - const UChar *srcChars, - int32_t srcStart, + UnicodeString& replace(int32_t start, + int32_t length, + const UChar *srcChars, + int32_t srcStart, int32_t srcLength); /** - * Replace the characters in the range + * Replace the characters in the range * [start, start + length) with the characters in * srcChars. srcChars is not modified. * @param start the offset at which the replace operation begins @@ -2048,13 +2117,13 @@ public: * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& replace(int32_t start, - int32_t length, + inline UnicodeString& replace(int32_t start, + int32_t length, const UChar *srcChars, int32_t srcLength); /** - * Replace the characters in the range + * Replace the characters in the range * [start, start + length) with the code unit * srcChar. * @param start the offset at which the replace operation begins @@ -2064,12 +2133,12 @@ public: * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& replace(int32_t start, - int32_t length, + inline UnicodeString& replace(int32_t start, + int32_t length, UChar srcChar); /** - * Replace the characters in the range + * Replace the characters in the range * [start, start + length) with the code point * srcChar. * @param start the offset at which the replace operation begins @@ -2079,12 +2148,12 @@ public: * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& replace(int32_t start, - int32_t length, + inline UnicodeString& replace(int32_t start, + int32_t length, UChar32 srcChar); /** - * Replace the characters in the range [start, limit) + * Replace the characters in the range [start, limit) * with the characters in srcText. srcText is not modified. * @param start the offset at which the replace operation begins * @param limit the offset immediately following the replace range @@ -2092,28 +2161,28 @@ public: * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& replaceBetween(int32_t start, - int32_t limit, + inline UnicodeString& replaceBetween(int32_t start, + int32_t limit, const UnicodeString& srcText); /** - * Replace the characters in the range [start, limit) - * with the characters in srcText in the range + * Replace the characters in the range [start, limit) + * with the characters in srcText in the range * [srcStart, srcLimit). srcText is not modified. * @param start the offset at which the replace operation begins * @param limit the offset immediately following the replace range * @param srcText the source for the new characters - * @param srcStart the offset into srcChars where new characters + * @param srcStart the offset into srcChars where new characters * will be obtained - * @param srcLimit the offset immediately following the range to copy + * @param srcLimit the offset immediately following the range to copy * in srcText * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& replaceBetween(int32_t start, - int32_t limit, - const UnicodeString& srcText, - int32_t srcStart, + inline UnicodeString& replaceBetween(int32_t start, + int32_t limit, + const UnicodeString& srcText, + int32_t srcStart, int32_t srcLimit); /** @@ -2133,15 +2202,15 @@ public: /** * Replaceable API * @return TRUE if it has MetaData - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UBool hasMetaData() const; - + /** * Copy a substring of this object, retaining attribute (out-of-band) * information. This method is used to duplicate or reorder substrings. * The destination index must not overlap the source range. - * + * * @param start the beginning index, inclusive; 0 <= start <= * limit. * @param limit the ending index, exclusive; start <= limit <= @@ -2157,7 +2226,7 @@ public: /* Search and replace operations */ /** - * Replace all occurrences of characters in oldText with the characters + * Replace all occurrences of characters in oldText with the characters * in newText * @param oldText the text containing the search text * @param newText the text containing the replacement text @@ -2168,7 +2237,7 @@ public: const UnicodeString& newText); /** - * Replace all occurrences of characters in oldText with characters + * Replace all occurrences of characters in oldText with characters * in newText * in the range [start, start + length). * @param start the start of the range in which replace will performed @@ -2184,10 +2253,10 @@ public: const UnicodeString& newText); /** - * Replace all occurrences of characters in oldText in the range - * [oldStart, oldStart + oldLength) with the characters - * in newText in the range - * [newStart, newStart + newLength) + * Replace all occurrences of characters in oldText in the range + * [oldStart, oldStart + oldLength) with the characters + * in newText in the range + * [newStart, newStart + newLength) * in the range [start, start + length). * @param start the start of the range in which replace will performed * @param length the length of the range in which replace will be performed @@ -2220,18 +2289,18 @@ public: inline UnicodeString& remove(void); /** - * Remove the characters in the range + * Remove the characters in the range * [start, start + length) from the UnicodeString object. * @param start the offset of the first character to remove * @param length the number of characters to remove * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& remove(int32_t start, + inline UnicodeString& remove(int32_t start, int32_t length = (int32_t)INT32_MAX); /** - * Remove the characters in the range + * Remove the characters in the range * [start, limit) from the UnicodeString object. * @param start the offset of the first character to remove * @param limit the offset immediately following the range to remove @@ -2245,12 +2314,12 @@ public: /* Length operations */ /** - * Pad the start of this UnicodeString with the character padChar. - * If the length of this UnicodeString is less than targetLength, + * Pad the start of this UnicodeString with the character padChar. + * If the length of this UnicodeString is less than targetLength, * length() - targetLength copies of padChar will be added to the * beginning of this UnicodeString. * @param targetLength the desired length of the string - * @param padChar the character to use for padding. Defaults to + * @param padChar the character to use for padding. Defaults to * space (U+0020) * @return TRUE if the text was padded, FALSE otherwise. * @stable ICU 2.0 @@ -2259,12 +2328,12 @@ public: UChar padChar = 0x0020); /** - * Pad the end of this UnicodeString with the character padChar. - * If the length of this UnicodeString is less than targetLength, + * Pad the end of this UnicodeString with the character padChar. + * If the length of this UnicodeString is less than targetLength, * length() - targetLength copies of padChar will be added to the * end of this UnicodeString. * @param targetLength the desired length of the string - * @param padChar the character to use for padding. Defaults to + * @param padChar the character to use for padding. Defaults to * space (U+0020) * @return TRUE if the text was padded, FALSE otherwise. * @stable ICU 2.0 @@ -2366,6 +2435,7 @@ public: * that are to be titlecased. * If none is provided (0), then a standard titlecase * break iterator is opened. + * Otherwise the provided iterator is set to the string's text. * @return A reference to this. * @stable ICU 2.1 */ @@ -2393,6 +2463,7 @@ public: * that are to be titlecased. * If none is provided (0), then a standard titlecase * break iterator is opened. + * Otherwise the provided iterator is set to the string's text. * @param locale The locale to consider. * @return A reference to this. * @stable ICU 2.1 @@ -2548,7 +2619,7 @@ public: * * @see getBuffer(int32_t minCapacity) * @see getBuffer() - * @draft ICU 2.2 + * @stable ICU 2.2 */ inline const UChar *getTerminatedBuffer(); @@ -2556,7 +2627,7 @@ public: // Constructors //======================================== - /** Construct an empty UnicodeString. + /** Construct an empty UnicodeString. * @stable ICU 2.0 */ UnicodeString(); @@ -2649,15 +2720,23 @@ public: */ UnicodeString(UChar *buffer, int32_t buffLength, int32_t buffCapacity); +#if !UCONFIG_NO_CONVERSION + /** * char* constructor. * @param codepageData an array of bytes, null-terminated * @param codepage the encoding of codepageData. The special - * value 0 for codepage indicates that the text is in the + * value 0 for codepage indicates that the text is in the * platform's default codepage. + * * If codepage is an empty string (""), * then a simple conversion is performed on the codepage-invariant * subset ("invariant characters") of the platform encoding. See utypes.h. + * Recommendation: For invariant-character strings use the constructor + * UnicodeString(const char *src, int32_t length, enum EInvariant inv) + * because it avoids object code dependencies of UnicodeString on + * the conversion code. + * * @stable ICU 2.0 */ UnicodeString(const char *codepageData, @@ -2668,11 +2747,16 @@ public: * @param codepageData an array of bytes. * @param dataLength The number of bytes in codepageData. * @param codepage the encoding of codepageData. The special - * value 0 for codepage indicates that the text is in the + * value 0 for codepage indicates that the text is in the * platform's default codepage. * If codepage is an empty string (""), * then a simple conversion is performed on the codepage-invariant * subset ("invariant characters") of the platform encoding. See utypes.h. + * Recommendation: For invariant-character strings use the constructor + * UnicodeString(const char *src, int32_t length, enum EInvariant inv) + * because it avoids object code dependencies of UnicodeString on + * the conversion code. + * * @stable ICU 2.0 */ UnicodeString(const char *codepageData, @@ -2705,6 +2789,34 @@ public: UConverter *cnv, UErrorCode &errorCode); +#endif + + /** + * Constructs a Unicode string from an invariant-character char * string. + * About invariant characters see utypes.h. + * This constructor has no runtime dependency on conversion code and is + * therefore recommended over ones taking a charset name string + * (where the empty string "" indicates invariant-character conversion). + * + * Use the macro US_INV as the third, signature-distinguishing parameter. + * + * For example: + * \code + * void fn(const char *s) { + * UnicodeString ustr(s, -1, US_INV); + * // use ustr ... + * } + * \endcode + * + * @param src String using only invariant characters. + * @param length Length of src, or -1 if NUL-terminated. + * @param inv Signature-distinguishing paramater, use US_INV. + * + * @see US_INV + * @draft ICU 3.2 + */ + UnicodeString(const char *src, int32_t length, enum EInvariant inv); + /** * Copy constructor. @@ -2717,7 +2829,7 @@ public: * 'Substring' constructor from tail of source string. * @param src The UnicodeString object to copy. * @param srcStart The offset into src at which to start copying. - * @draft ICU2.2 + * @stable ICU 2.2 */ UnicodeString(const UnicodeString& src, int32_t srcStart); @@ -2726,7 +2838,7 @@ public: * @param src The UnicodeString object to copy. * @param srcStart The offset into src at which to start copying. * @param srcLength The number of characters from src to copy. - * @draft ICU2.2 + * @stable ICU 2.2 */ UnicodeString(const UnicodeString& src, int32_t srcStart, int32_t srcLength); @@ -2744,14 +2856,14 @@ public: * * @see Replaceable::clone * @see getDynamicClassID - * @draft ICU 2.6 + * @stable ICU 2.6 */ virtual Replaceable *clone() const; - /** Destructor. + /** Destructor. * @stable ICU 2.0 */ - ~UnicodeString(); + virtual ~UnicodeString(); /* Miscellaneous operations */ @@ -2760,23 +2872,23 @@ public: * Unescape a string of characters and return a string containing * the result. The following escape sequences are recognized: * - * \uhhhh 4 hex digits; h in [0-9A-Fa-f] - * \Uhhhhhhhh 8 hex digits - * \xhh 1-2 hex digits - * \ooo 1-3 octal digits; o in [0-7] - * \cX control-X; X is masked with 0x1F + * \\uhhhh 4 hex digits; h in [0-9A-Fa-f] + * \\Uhhhhhhhh 8 hex digits + * \\xhh 1-2 hex digits + * \\ooo 1-3 octal digits; o in [0-7] + * \\cX control-X; X is masked with 0x1F * * as well as the standard ANSI C escapes: * - * \a => U+0007, \b => U+0008, \t => U+0009, \n => U+000A, - * \v => U+000B, \f => U+000C, \r => U+000D, \e => U+001B, - * \" => U+0022, \' => U+0027, \? => U+003F, \\ => U+005C + * \\a => U+0007, \\b => U+0008, \\t => U+0009, \\n => U+000A, + * \\v => U+000B, \\f => U+000C, \\r => U+000D, \\e => U+001B, + * \\" => U+0022, \\' => U+0027, \\? => U+003F, \\\\ => U+005C * * Anything else following a backslash is generically escaped. For - * example, "[a\-z]" returns "[a-z]". + * example, "[a\\-z]" returns "[a-z]". * * If an escape sequence is ill-formed, this method returns an empty - * string. An example of an ill-formed sequence is "\u" followed by + * string. An example of an ill-formed sequence is "\\u" followed by * fewer than 4 hex digits. * * This function is similar to u_unescape() but not identical to it. @@ -2814,18 +2926,18 @@ public: UChar32 unescapeAt(int32_t &offset) const; /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. + * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const; + static UClassID U_EXPORT2 getStaticClassID(); /** - * ICU "poor man's RTTI", returns a UClassID for this class. + * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ - static inline UClassID getStaticClassID(); + virtual UClassID getDynamicClassID() const; //======================================== // Implementation methods @@ -2834,21 +2946,21 @@ public: protected: /** * Implement Replaceable::getLength() (see jitterbug 1027). - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual int32_t getLength() const; /** * The change in Replaceable to use virtual getCharAt() allows * UnicodeString::charAt() to be inline again (see jitterbug 709). - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UChar getCharAt(int32_t offset) const; /** * The change in Replaceable to use virtual getChar32At() allows * UnicodeString::char32At() to be inline again (see jitterbug 709). - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UChar32 getChar32At(int32_t offset) const; @@ -2912,9 +3024,9 @@ private: int32_t start, int32_t length) const; - void doExtract(int32_t start, - int32_t length, - UChar *dst, + void doExtract(int32_t start, + int32_t length, + UChar *dst, int32_t dstStart) const; inline void doExtract(int32_t start, @@ -2923,16 +3035,16 @@ private: inline UChar doCharAt(int32_t offset) const; - UnicodeString& doReplace(int32_t start, - int32_t length, - const UnicodeString& srcText, - int32_t srcStart, + UnicodeString& doReplace(int32_t start, + int32_t length, + const UnicodeString& srcText, + int32_t srcStart, int32_t srcLength); - UnicodeString& doReplace(int32_t start, - int32_t length, - const UChar *srcChars, - int32_t srcStart, + UnicodeString& doReplace(int32_t start, + int32_t length, + const UChar *srcChars, + int32_t srcStart, int32_t srcLength); UnicodeString& doReverse(int32_t start, @@ -2965,6 +3077,8 @@ private: inline void pinIndices(int32_t& start, int32_t& length) const; +#if !UCONFIG_NO_CONVERSION + /* Internal extract() using UConverter. */ int32_t doExtract(int32_t start, int32_t length, char *dest, int32_t destCapacity, @@ -2994,6 +3108,9 @@ private: int32_t dataLength, UConverter *converter, UErrorCode &status); + +#endif + /* * This function is called when write access to the array * is necessary. @@ -3014,7 +3131,7 @@ private: // common function for case mappings UnicodeString & caseMap(BreakIterator *titleIter, - const Locale& locale, + const char *locale, uint32_t options, int32_t toWhichCase); @@ -3067,15 +3184,23 @@ private: uint16_t fFlags; // bit flags: see constants above UChar fStackBuffer [ US_STACKBUF_SIZE ]; // buffer for small strings - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; +/** + * Create a new UnicodeString with the concatenation of two others. + * + * @param s1 The first string to be copied to the new one. + * @param s2 The second string to be copied to the new one, after s1. + * @return UnicodeString(s1).append(s2) + * @draft ICU 2.8 + */ +U_COMMON_API UnicodeString U_EXPORT2 +operator+ (const UnicodeString &s1, const UnicodeString &s2); + U_NAMESPACE_END +// inline implementations -------------------------------------------------- *** + //======================================== // Array copying //======================================== @@ -3083,7 +3208,7 @@ U_NAMESPACE_END * Copy an array of UnicodeString OBJECTS (not pointers). * @internal */ -inline void +inline void uprv_arrayCopy(const U_NAMESPACE_QUALIFIER UnicodeString *src, U_NAMESPACE_QUALIFIER UnicodeString *dst, int32_t count) { while(count-- > 0) *dst++ = *src++; } @@ -3091,8 +3216,8 @@ uprv_arrayCopy(const U_NAMESPACE_QUALIFIER UnicodeString *src, U_NAMESPACE_QUALI * Copy an array of UnicodeString OBJECTS (not pointers). * @internal */ -inline void -uprv_arrayCopy(const U_NAMESPACE_QUALIFIER UnicodeString *src, int32_t srcStart, +inline void +uprv_arrayCopy(const U_NAMESPACE_QUALIFIER UnicodeString *src, int32_t srcStart, U_NAMESPACE_QUALIFIER UnicodeString *dst, int32_t dstStart, int32_t count) { uprv_arrayCopy(src+srcStart, dst+dstStart, count); } @@ -3134,38 +3259,30 @@ UnicodeString::pinIndices(int32_t& start, } } -inline UChar* +inline UChar* UnicodeString::getArrayStart() { return fArray; } -inline const UChar* +inline const UChar* UnicodeString::getArrayStart() const { return fArray; } //======================================== // Read-only implementation methods //======================================== -inline UClassID -UnicodeString::getStaticClassID() -{ return (UClassID)&fgClassID; } - -inline UClassID -UnicodeString::getDynamicClassID() const -{ return UnicodeString::getStaticClassID(); } - -inline int32_t +inline int32_t UnicodeString::length() const { return fLength; } -inline int32_t +inline int32_t UnicodeString::getCapacity() const { return fCapacity; } -inline int32_t +inline int32_t UnicodeString::hashCode() const { return doHashCode(); } -inline UBool +inline UBool UnicodeString::isBogus() const { return (UBool)(fFlags & kIsBogus); } @@ -3229,22 +3346,22 @@ inline UBool UnicodeString::operator<= (const UnicodeString& text) const { return doCompare(0, fLength, text, 0, text.fLength) != 1; } -inline int8_t +inline int8_t UnicodeString::compare(const UnicodeString& text) const { return doCompare(0, fLength, text, 0, text.fLength); } -inline int8_t +inline int8_t UnicodeString::compare(int32_t start, int32_t _length, const UnicodeString& srcText) const { return doCompare(start, _length, srcText, 0, srcText.fLength); } -inline int8_t +inline int8_t UnicodeString::compare(const UChar *srcChars, int32_t srcLength) const { return doCompare(0, fLength, srcChars, 0, srcLength); } -inline int8_t +inline int8_t UnicodeString::compare(int32_t start, int32_t _length, const UnicodeString& srcText, @@ -3258,7 +3375,7 @@ UnicodeString::compare(int32_t start, const UChar *srcChars) const { return doCompare(start, _length, srcChars, 0, _length); } -inline int8_t +inline int8_t UnicodeString::compare(int32_t start, int32_t _length, const UChar *srcChars, @@ -3272,7 +3389,7 @@ UnicodeString::compareBetween(int32_t start, const UnicodeString& srcText, int32_t srcStart, int32_t srcLimit) const -{ return doCompare(start, limit - start, +{ return doCompare(start, limit - start, srcText, srcStart, srcLimit - srcStart); } inline int8_t @@ -3290,22 +3407,22 @@ UnicodeString::doCompareCodePointOrder(int32_t start, } } -inline int8_t +inline int8_t UnicodeString::compareCodePointOrder(const UnicodeString& text) const { return doCompareCodePointOrder(0, fLength, text, 0, text.fLength); } -inline int8_t +inline int8_t UnicodeString::compareCodePointOrder(int32_t start, int32_t _length, const UnicodeString& srcText) const { return doCompareCodePointOrder(start, _length, srcText, 0, srcText.fLength); } -inline int8_t +inline int8_t UnicodeString::compareCodePointOrder(const UChar *srcChars, int32_t srcLength) const { return doCompareCodePointOrder(0, fLength, srcChars, 0, srcLength); } -inline int8_t +inline int8_t UnicodeString::compareCodePointOrder(int32_t start, int32_t _length, const UnicodeString& srcText, @@ -3319,7 +3436,7 @@ UnicodeString::compareCodePointOrder(int32_t start, const UChar *srcChars) const { return doCompareCodePointOrder(start, _length, srcChars, 0, _length); } -inline int8_t +inline int8_t UnicodeString::compareCodePointOrder(int32_t start, int32_t _length, const UChar *srcChars, @@ -3333,7 +3450,7 @@ UnicodeString::compareCodePointOrderBetween(int32_t start, const UnicodeString& srcText, int32_t srcStart, int32_t srcLimit) const -{ return doCompareCodePointOrder(start, limit - start, +{ return doCompareCodePointOrder(start, limit - start, srcText, srcStart, srcLimit - srcStart); } inline int8_t @@ -3352,12 +3469,12 @@ UnicodeString::doCaseCompare(int32_t start, } } -inline int8_t +inline int8_t UnicodeString::caseCompare(const UnicodeString &text, uint32_t options) const { return doCaseCompare(0, fLength, text, 0, text.fLength, options); } -inline int8_t +inline int8_t UnicodeString::caseCompare(int32_t start, int32_t _length, const UnicodeString &srcText, @@ -3365,14 +3482,14 @@ UnicodeString::caseCompare(int32_t start, return doCaseCompare(start, _length, srcText, 0, srcText.fLength, options); } -inline int8_t +inline int8_t UnicodeString::caseCompare(const UChar *srcChars, int32_t srcLength, uint32_t options) const { return doCaseCompare(0, fLength, srcChars, 0, srcLength, options); } -inline int8_t +inline int8_t UnicodeString::caseCompare(int32_t start, int32_t _length, const UnicodeString &srcText, @@ -3390,7 +3507,7 @@ UnicodeString::caseCompare(int32_t start, return doCaseCompare(start, _length, srcChars, 0, _length, options); } -inline int8_t +inline int8_t UnicodeString::caseCompare(int32_t start, int32_t _length, const UChar *srcChars, @@ -3410,7 +3527,7 @@ UnicodeString::caseCompareBetween(int32_t start, return doCaseCompare(start, limit - start, srcText, srcStart, srcLimit - srcStart, options); } -inline int32_t +inline int32_t UnicodeString::indexOf(const UnicodeString& srcText, int32_t srcStart, int32_t srcLength, @@ -3426,24 +3543,24 @@ UnicodeString::indexOf(const UnicodeString& srcText, return -1; } -inline int32_t +inline int32_t UnicodeString::indexOf(const UnicodeString& text) const { return indexOf(text, 0, text.fLength, 0, fLength); } -inline int32_t +inline int32_t UnicodeString::indexOf(const UnicodeString& text, int32_t start) const { pinIndex(start); return indexOf(text, 0, text.fLength, start, fLength - start); } -inline int32_t +inline int32_t UnicodeString::indexOf(const UnicodeString& text, int32_t start, int32_t _length) const { return indexOf(text, 0, text.fLength, start, _length); } -inline int32_t +inline int32_t UnicodeString::indexOf(const UChar *srcChars, int32_t srcLength, int32_t start) const { @@ -3451,55 +3568,55 @@ UnicodeString::indexOf(const UChar *srcChars, return indexOf(srcChars, 0, srcLength, start, fLength - start); } -inline int32_t +inline int32_t UnicodeString::indexOf(const UChar *srcChars, int32_t srcLength, int32_t start, int32_t _length) const { return indexOf(srcChars, 0, srcLength, start, _length); } -inline int32_t +inline int32_t UnicodeString::indexOf(UChar c, int32_t start, int32_t _length) const { return doIndexOf(c, start, _length); } -inline int32_t +inline int32_t UnicodeString::indexOf(UChar32 c, int32_t start, int32_t _length) const { return doIndexOf(c, start, _length); } -inline int32_t +inline int32_t UnicodeString::indexOf(UChar c) const { return doIndexOf(c, 0, fLength); } -inline int32_t +inline int32_t UnicodeString::indexOf(UChar32 c) const { return indexOf(c, 0, fLength); } -inline int32_t +inline int32_t UnicodeString::indexOf(UChar c, int32_t start) const { pinIndex(start); return doIndexOf(c, start, fLength - start); } -inline int32_t +inline int32_t UnicodeString::indexOf(UChar32 c, int32_t start) const { pinIndex(start); return indexOf(c, start, fLength - start); } -inline int32_t +inline int32_t UnicodeString::lastIndexOf(const UChar *srcChars, int32_t srcLength, int32_t start, int32_t _length) const { return lastIndexOf(srcChars, 0, srcLength, start, _length); } -inline int32_t +inline int32_t UnicodeString::lastIndexOf(const UChar *srcChars, int32_t srcLength, int32_t start) const { @@ -3507,7 +3624,7 @@ UnicodeString::lastIndexOf(const UChar *srcChars, return lastIndexOf(srcChars, 0, srcLength, start, fLength - start); } -inline int32_t +inline int32_t UnicodeString::lastIndexOf(const UnicodeString& srcText, int32_t srcStart, int32_t srcLength, @@ -3523,156 +3640,156 @@ UnicodeString::lastIndexOf(const UnicodeString& srcText, return -1; } -inline int32_t +inline int32_t UnicodeString::lastIndexOf(const UnicodeString& text, int32_t start, int32_t _length) const { return lastIndexOf(text, 0, text.fLength, start, _length); } -inline int32_t +inline int32_t UnicodeString::lastIndexOf(const UnicodeString& text, int32_t start) const { pinIndex(start); return lastIndexOf(text, 0, text.fLength, start, fLength - start); } -inline int32_t +inline int32_t UnicodeString::lastIndexOf(const UnicodeString& text) const { return lastIndexOf(text, 0, text.fLength, 0, fLength); } -inline int32_t +inline int32_t UnicodeString::lastIndexOf(UChar c, int32_t start, int32_t _length) const { return doLastIndexOf(c, start, _length); } -inline int32_t +inline int32_t UnicodeString::lastIndexOf(UChar32 c, int32_t start, int32_t _length) const { return doLastIndexOf(c, start, _length); } -inline int32_t +inline int32_t UnicodeString::lastIndexOf(UChar c) const { return doLastIndexOf(c, 0, fLength); } -inline int32_t +inline int32_t UnicodeString::lastIndexOf(UChar32 c) const { return lastIndexOf(c, 0, fLength); } -inline int32_t +inline int32_t UnicodeString::lastIndexOf(UChar c, int32_t start) const { pinIndex(start); return doLastIndexOf(c, start, fLength - start); } -inline int32_t +inline int32_t UnicodeString::lastIndexOf(UChar32 c, int32_t start) const { pinIndex(start); return lastIndexOf(c, start, fLength - start); } -inline UBool +inline UBool UnicodeString::startsWith(const UnicodeString& text) const { return compare(0, text.fLength, text, 0, text.fLength) == 0; } -inline UBool +inline UBool UnicodeString::startsWith(const UnicodeString& srcText, int32_t srcStart, int32_t srcLength) const { return doCompare(0, srcLength, srcText, srcStart, srcLength) == 0; } -inline UBool +inline UBool UnicodeString::startsWith(const UChar *srcChars, int32_t srcLength) const { return doCompare(0, srcLength, srcChars, 0, srcLength) == 0; } -inline UBool +inline UBool UnicodeString::startsWith(const UChar *srcChars, int32_t srcStart, int32_t srcLength) const { return doCompare(0, srcLength, srcChars, srcStart, srcLength) == 0;} -inline UBool +inline UBool UnicodeString::endsWith(const UnicodeString& text) const -{ return doCompare(fLength - text.fLength, text.fLength, +{ return doCompare(fLength - text.fLength, text.fLength, text, 0, text.fLength) == 0; } -inline UBool +inline UBool UnicodeString::endsWith(const UnicodeString& srcText, int32_t srcStart, int32_t srcLength) const { srcText.pinIndices(srcStart, srcLength); - return doCompare(fLength - srcLength, srcLength, + return doCompare(fLength - srcLength, srcLength, srcText, srcStart, srcLength) == 0; } -inline UBool +inline UBool UnicodeString::endsWith(const UChar *srcChars, int32_t srcLength) const { if(srcLength < 0) { srcLength = u_strlen(srcChars); } - return doCompare(fLength - srcLength, srcLength, + return doCompare(fLength - srcLength, srcLength, srcChars, 0, srcLength) == 0; } -inline UBool +inline UBool UnicodeString::endsWith(const UChar *srcChars, int32_t srcStart, int32_t srcLength) const { if(srcLength < 0) { srcLength = u_strlen(srcChars + srcStart); } - return doCompare(fLength - srcLength, srcLength, + return doCompare(fLength - srcLength, srcLength, srcChars, srcStart, srcLength) == 0; } //======================================== // replace //======================================== -inline UnicodeString& -UnicodeString::replace(int32_t start, - int32_t _length, - const UnicodeString& srcText) +inline UnicodeString& +UnicodeString::replace(int32_t start, + int32_t _length, + const UnicodeString& srcText) { return doReplace(start, _length, srcText, 0, srcText.fLength); } -inline UnicodeString& -UnicodeString::replace(int32_t start, - int32_t _length, - const UnicodeString& srcText, - int32_t srcStart, +inline UnicodeString& +UnicodeString::replace(int32_t start, + int32_t _length, + const UnicodeString& srcText, + int32_t srcStart, int32_t srcLength) { return doReplace(start, _length, srcText, srcStart, srcLength); } -inline UnicodeString& -UnicodeString::replace(int32_t start, - int32_t _length, +inline UnicodeString& +UnicodeString::replace(int32_t start, + int32_t _length, const UChar *srcChars, int32_t srcLength) { return doReplace(start, _length, srcChars, 0, srcLength); } -inline UnicodeString& -UnicodeString::replace(int32_t start, - int32_t _length, - const UChar *srcChars, - int32_t srcStart, +inline UnicodeString& +UnicodeString::replace(int32_t start, + int32_t _length, + const UChar *srcChars, + int32_t srcStart, int32_t srcLength) { return doReplace(start, _length, srcChars, srcStart, srcLength); } -inline UnicodeString& -UnicodeString::replace(int32_t start, - int32_t _length, +inline UnicodeString& +UnicodeString::replace(int32_t start, + int32_t _length, UChar srcChar) { return doReplace(start, _length, &srcChar, 0, 1); } inline UnicodeString& -UnicodeString::replace(int32_t start, - int32_t _length, +UnicodeString::replace(int32_t start, + int32_t _length, UChar32 srcChar) { UChar buffer[U16_MAX_LENGTH]; int32_t count = 0; @@ -3681,32 +3798,32 @@ UnicodeString::replace(int32_t start, return doReplace(start, _length, buffer, 0, count); } -inline UnicodeString& -UnicodeString::replaceBetween(int32_t start, - int32_t limit, +inline UnicodeString& +UnicodeString::replaceBetween(int32_t start, + int32_t limit, const UnicodeString& srcText) { return doReplace(start, limit - start, srcText, 0, srcText.fLength); } inline UnicodeString& -UnicodeString::replaceBetween(int32_t start, - int32_t limit, - const UnicodeString& srcText, - int32_t srcStart, +UnicodeString::replaceBetween(int32_t start, + int32_t limit, + const UnicodeString& srcText, + int32_t srcStart, int32_t srcLimit) { return doReplace(start, limit - start, srcText, srcStart, srcLimit - srcStart); } -inline UnicodeString& +inline UnicodeString& UnicodeString::findAndReplace(const UnicodeString& oldText, const UnicodeString& newText) -{ return findAndReplace(0, fLength, oldText, 0, oldText.fLength, +{ return findAndReplace(0, fLength, oldText, 0, oldText.fLength, newText, 0, newText.fLength); } -inline UnicodeString& +inline UnicodeString& UnicodeString::findAndReplace(int32_t start, int32_t _length, const UnicodeString& oldText, const UnicodeString& newText) -{ return findAndReplace(start, _length, oldText, 0, oldText.fLength, +{ return findAndReplace(start, _length, oldText, 0, oldText.fLength, newText, 0, newText.fLength); } // ============================ @@ -3718,19 +3835,21 @@ UnicodeString::doExtract(int32_t start, UnicodeString& target) const { target.replace(0, target.fLength, *this, start, _length); } -inline void -UnicodeString::extract(int32_t start, - int32_t _length, - UChar *target, +inline void +UnicodeString::extract(int32_t start, + int32_t _length, + UChar *target, int32_t targetStart) const { doExtract(start, _length, target, targetStart); } -inline void +inline void UnicodeString::extract(int32_t start, int32_t _length, UnicodeString& target) const { doExtract(start, _length, target); } +#if !UCONFIG_NO_CONVERSION + inline int32_t UnicodeString::extract(int32_t start, int32_t _length, @@ -3742,12 +3861,17 @@ UnicodeString::extract(int32_t start, return extract(start, _length, dst, dst!=0 ? 0xffffffff : 0, codepage); } -inline void -UnicodeString::extractBetween(int32_t start, - int32_t limit, - UChar *dst, - int32_t dstStart) const -{ doExtract(start, limit - start, dst, dstStart); } +#endif + +inline void +UnicodeString::extractBetween(int32_t start, + int32_t limit, + UChar *dst, + int32_t dstStart) const { + pinIndex(start); + pinIndex(limit); + doExtract(start, limit - start, dst, dstStart); +} inline UChar UnicodeString::doCharAt(int32_t offset) const @@ -3821,25 +3945,25 @@ UnicodeString::getTerminatedBuffer() { } } -inline UnicodeString& -UnicodeString::operator= (UChar ch) +inline UnicodeString& +UnicodeString::operator= (UChar ch) { return doReplace(0, fLength, &ch, 0, 1); } -inline UnicodeString& -UnicodeString::operator= (UChar32 ch) +inline UnicodeString& +UnicodeString::operator= (UChar32 ch) { return replace(0, fLength, ch); } -inline UnicodeString& -UnicodeString::setTo(const UnicodeString& srcText, - int32_t srcStart, +inline UnicodeString& +UnicodeString::setTo(const UnicodeString& srcText, + int32_t srcStart, int32_t srcLength) { unBogus(); return doReplace(0, fLength, srcText, srcStart, srcLength); } -inline UnicodeString& -UnicodeString::setTo(const UnicodeString& srcText, +inline UnicodeString& +UnicodeString::setTo(const UnicodeString& srcText, int32_t srcStart) { unBogus(); @@ -3847,14 +3971,14 @@ UnicodeString::setTo(const UnicodeString& srcText, return doReplace(0, fLength, srcText, srcStart, srcText.fLength - srcStart); } -inline UnicodeString& +inline UnicodeString& UnicodeString::setTo(const UnicodeString& srcText) { unBogus(); return doReplace(0, fLength, srcText, 0, srcText.fLength); } -inline UnicodeString& +inline UnicodeString& UnicodeString::setTo(const UChar *srcChars, int32_t srcLength) { @@ -3862,25 +3986,25 @@ UnicodeString::setTo(const UChar *srcChars, return doReplace(0, fLength, srcChars, 0, srcLength); } -inline UnicodeString& +inline UnicodeString& UnicodeString::setTo(UChar srcChar) { unBogus(); return doReplace(0, fLength, &srcChar, 0, 1); } -inline UnicodeString& +inline UnicodeString& UnicodeString::setTo(UChar32 srcChar) { unBogus(); return replace(0, fLength, srcChar); } -inline UnicodeString& +inline UnicodeString& UnicodeString::operator+= (UChar ch) { return doReplace(fLength, 0, &ch, 0, 1); } -inline UnicodeString& +inline UnicodeString& UnicodeString::operator+= (UChar32 ch) { UChar buffer[U16_MAX_LENGTH]; int32_t _length = 0; @@ -3889,36 +4013,36 @@ UnicodeString::operator+= (UChar32 ch) { return doReplace(fLength, 0, buffer, 0, _length); } -inline UnicodeString& +inline UnicodeString& UnicodeString::operator+= (const UnicodeString& srcText) { return doReplace(fLength, 0, srcText, 0, srcText.fLength); } -inline UnicodeString& -UnicodeString::append(const UnicodeString& srcText, - int32_t srcStart, +inline UnicodeString& +UnicodeString::append(const UnicodeString& srcText, + int32_t srcStart, int32_t srcLength) { return doReplace(fLength, 0, srcText, srcStart, srcLength); } -inline UnicodeString& +inline UnicodeString& UnicodeString::append(const UnicodeString& srcText) { return doReplace(fLength, 0, srcText, 0, srcText.fLength); } -inline UnicodeString& -UnicodeString::append(const UChar *srcChars, - int32_t srcStart, +inline UnicodeString& +UnicodeString::append(const UChar *srcChars, + int32_t srcStart, int32_t srcLength) { return doReplace(fLength, 0, srcChars, srcStart, srcLength); } -inline UnicodeString& +inline UnicodeString& UnicodeString::append(const UChar *srcChars, int32_t srcLength) { return doReplace(fLength, 0, srcChars, 0, srcLength); } -inline UnicodeString& +inline UnicodeString& UnicodeString::append(UChar srcChar) { return doReplace(fLength, 0, &srcChar, 0, 1); } -inline UnicodeString& +inline UnicodeString& UnicodeString::append(UChar32 srcChar) { UChar buffer[U16_MAX_LENGTH]; int32_t _length = 0; @@ -3927,43 +4051,43 @@ UnicodeString::append(UChar32 srcChar) { return doReplace(fLength, 0, buffer, 0, _length); } -inline UnicodeString& -UnicodeString::insert(int32_t start, - const UnicodeString& srcText, - int32_t srcStart, +inline UnicodeString& +UnicodeString::insert(int32_t start, + const UnicodeString& srcText, + int32_t srcStart, int32_t srcLength) { return doReplace(start, 0, srcText, srcStart, srcLength); } -inline UnicodeString& -UnicodeString::insert(int32_t start, +inline UnicodeString& +UnicodeString::insert(int32_t start, const UnicodeString& srcText) { return doReplace(start, 0, srcText, 0, srcText.fLength); } -inline UnicodeString& -UnicodeString::insert(int32_t start, - const UChar *srcChars, - int32_t srcStart, +inline UnicodeString& +UnicodeString::insert(int32_t start, + const UChar *srcChars, + int32_t srcStart, int32_t srcLength) { return doReplace(start, 0, srcChars, srcStart, srcLength); } -inline UnicodeString& -UnicodeString::insert(int32_t start, +inline UnicodeString& +UnicodeString::insert(int32_t start, const UChar *srcChars, int32_t srcLength) { return doReplace(start, 0, srcChars, 0, srcLength); } -inline UnicodeString& -UnicodeString::insert(int32_t start, +inline UnicodeString& +UnicodeString::insert(int32_t start, UChar srcChar) { return doReplace(start, 0, &srcChar, 0, 1); } -inline UnicodeString& -UnicodeString::insert(int32_t start, +inline UnicodeString& +UnicodeString::insert(int32_t start, UChar32 srcChar) { return replace(start, 0, srcChar); } -inline UnicodeString& +inline UnicodeString& UnicodeString::remove() { // remove() of a bogus string makes the string empty and non-bogus @@ -3975,8 +4099,8 @@ UnicodeString::remove() return *this; } -inline UnicodeString& -UnicodeString::remove(int32_t start, +inline UnicodeString& +UnicodeString::remove(int32_t start, int32_t _length) { if(start <= 0 && _length == INT32_MAX) { @@ -3987,12 +4111,12 @@ UnicodeString::remove(int32_t start, } } -inline UnicodeString& +inline UnicodeString& UnicodeString::removeBetween(int32_t start, int32_t limit) { return doReplace(start, limit - start, NULL, 0, 0); } -inline UBool +inline UBool UnicodeString::truncate(int32_t targetLength) { if(isBogus() && targetLength == 0) { @@ -4007,16 +4131,15 @@ UnicodeString::truncate(int32_t targetLength) } } -inline UnicodeString& +inline UnicodeString& UnicodeString::reverse() { return doReverse(0, fLength); } -inline UnicodeString& +inline UnicodeString& UnicodeString::reverse(int32_t start, int32_t _length) { return doReverse(start, _length); } - U_NAMESPACE_END #endif diff --git a/icuSources/common/unicode/unorm.h b/icuSources/common/unicode/unorm.h index cbc78a08..8bdbee7c 100644 --- a/icuSources/common/unicode/unorm.h +++ b/icuSources/common/unicode/unorm.h @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (c) 1996-2003, International Business Machines Corporation +* Copyright (c) 1996-2004, International Business Machines Corporation * and others. All Rights Reserved. ******************************************************************************* * File unorm.h @@ -31,7 +31,7 @@ * decomposed form, allowing for easier sorting and searching of text. * unorm_normalize supports the standard normalization forms described in *
    - * Unicode Standard Annex #15 — Unicode Normalization Forms. + * Unicode Standard Annex #15 — Unicode Normalization Forms. * * Characters with accents or other adornments can be encoded in * several different ways in Unicode. For example, take the character A-acute. @@ -149,18 +149,35 @@ typedef enum { * Use 0 for default options, * including normalization according to the Unicode version * that is currently supported by ICU (see u_getUnicodeVersion). - * @draft ICU 2.6 + * @stable ICU 2.6 */ enum { /** * Options bit set value to select Unicode 3.2 normalization * (except NormalizationCorrections). * At most one Unicode version can be selected at a time. - * @draft ICU 2.6 + * @stable ICU 2.6 */ UNORM_UNICODE_3_2=0x20 }; +/** + * Lowest-order bit number of unorm_compare() options bits corresponding to + * normalization options bits. + * + * The options parameter for unorm_compare() uses most bits for + * itself and for various comparison and folding flags. + * The most significant bits, however, are shifted down and passed on + * to the normalization implementation. + * (That is, from unorm_compare(..., options, ...), + * options>>UNORM_COMPARE_NORM_OPTIONS_SHIFT will be passed on to the + * internal normalization functions.) + * + * @see unorm_compare + * @stable ICU 2.6 + */ +#define UNORM_COMPARE_NORM_OPTIONS_SHIFT 20 + /** * Normalize a string. * The string will be normalized according the specified normalization mode @@ -179,12 +196,12 @@ enum { * the output was truncated, and the error code is set to U_BUFFER_OVERFLOW_ERROR. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 unorm_normalize(const UChar *source, int32_t sourceLength, UNormalizationMode mode, int32_t options, UChar *result, int32_t resultLength, UErrorCode *status); - +#endif /** * Result values for unorm_quickCheck(). * For details see Unicode Technical Report 15. @@ -205,7 +222,7 @@ typedef enum UNormalizationCheckResult { */ UNORM_MAYBE } UNormalizationCheckResult; - +#if !UCONFIG_NO_NORMALIZATION /** * Performing quick check on a string, to quickly determine if the string is * in a particular normalization format. @@ -226,7 +243,7 @@ typedef enum UNormalizationCheckResult { * @see unorm_isNormalized * @stable ICU 2.0 */ -U_CAPI UNormalizationCheckResult U_EXPORT2 +U_STABLE UNormalizationCheckResult U_EXPORT2 unorm_quickCheck(const UChar *source, int32_t sourcelength, UNormalizationMode mode, UErrorCode *status); @@ -245,9 +262,9 @@ unorm_quickCheck(const UChar *source, int32_t sourcelength, * * @see unorm_quickCheck * @see unorm_isNormalized - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI UNormalizationCheckResult U_EXPORT2 +U_STABLE UNormalizationCheckResult U_EXPORT2 unorm_quickCheckWithOptions(const UChar *src, int32_t srcLength, UNormalizationMode mode, int32_t options, UErrorCode *pErrorCode); @@ -271,9 +288,9 @@ unorm_quickCheckWithOptions(const UChar *src, int32_t srcLength, * "mode" normalization form. * * @see unorm_quickCheck - * @draft ICU 2.2 + * @stable ICU 2.2 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 unorm_isNormalized(const UChar *src, int32_t srcLength, UNormalizationMode mode, UErrorCode *pErrorCode); @@ -293,9 +310,9 @@ unorm_isNormalized(const UChar *src, int32_t srcLength, * * @see unorm_quickCheck * @see unorm_isNormalized - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 unorm_isNormalizedWithOptions(const UChar *src, int32_t srcLength, UNormalizationMode mode, int32_t options, UErrorCode *pErrorCode); @@ -373,7 +390,7 @@ unorm_isNormalizedWithOptions(const UChar *src, int32_t srcLength, * * @stable ICU 2.1 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 unorm_next(UCharIterator *src, UChar *dest, int32_t destCapacity, UNormalizationMode mode, int32_t options, @@ -406,7 +423,7 @@ unorm_next(UCharIterator *src, * * @stable ICU 2.1 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 unorm_previous(UCharIterator *src, UChar *dest, int32_t destCapacity, UNormalizationMode mode, int32_t options, @@ -450,7 +467,7 @@ unorm_previous(UCharIterator *src, * * @stable ICU 2.1 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 unorm_concatenate(const UChar *left, int32_t leftLength, const UChar *right, int32_t rightLength, UChar *dest, int32_t destCapacity, @@ -460,14 +477,14 @@ unorm_concatenate(const UChar *left, int32_t leftLength, /** * Option bit for unorm_compare: * Both input strings are assumed to fulfill FCD conditions. - * @draft ICU 2.2 + * @stable ICU 2.2 */ #define UNORM_INPUT_IS_FCD 0x20000 /** * Option bit for unorm_compare: * Perform case-insensitive comparison. - * @draft ICU 2.2 + * @stable ICU 2.2 */ #define U_COMPARE_IGNORE_CASE 0x10000 @@ -476,28 +493,11 @@ unorm_concatenate(const UChar *left, int32_t leftLength, /** * Option bit for u_strCaseCompare, u_strcasecmp, unorm_compare, etc: * Compare strings in code point order instead of code unit order. - * @draft ICU 2.2 + * @stable ICU 2.2 */ #define U_COMPARE_CODE_POINT_ORDER 0x8000 #endif -/** - * Lowest-order bit number of unorm_compare() options bits corresponding to - * normalization options bits. - * - * The options parameter for unorm_compare() uses most bits for - * itself and for various comparison and folding flags. - * The most significant bits, however, are shifted down and passed on - * to the normalization implementation. - * (That is, from unorm_compare(..., options, ...), - * options>>UNORM_COMPARE_NORM_OPTIONS_SHIFT will be passed on to the - * internal normalization functions.) - * - * @see unorm_compare - * @draft ICU 2.6 - */ -#define UNORM_COMPARE_NORM_OPTIONS_SHIFT 20 - /** * Compare two strings for canonical equivalence. * Further options include case-insensitive comparison and @@ -562,9 +562,9 @@ unorm_concatenate(const UChar *left, int32_t leftLength, * @see u_strCompare * @see u_strCaseCompare * - * @draft ICU 2.2 + * @stable ICU 2.2 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 unorm_compare(const UChar *s1, int32_t length1, const UChar *s2, int32_t length2, uint32_t options, diff --git a/icuSources/common/unicode/uobject.h b/icuSources/common/unicode/uobject.h index 51cc5437..49f6ed0c 100644 --- a/icuSources/common/unicode/uobject.h +++ b/icuSources/common/unicode/uobject.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 2002-2003, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -34,7 +34,7 @@ U_NAMESPACE_BEGIN * applications that statically link the C Runtime library, meaning that * the app and ICU will be using different heaps. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ #ifndef U_OVERRIDE_CXX_ALLOCATION #define U_OVERRIDE_CXX_ALLOCATION 1 @@ -43,7 +43,7 @@ U_NAMESPACE_BEGIN /** U_HAVE_PLACEMENT_NEW - Define this to define the placement new and * delete in UMemory for STL. * - * @draft ICU 2.6 + * @stable ICU 2.6 */ #ifndef U_HAVE_PLACEMENT_NEW #define U_HAVE_PLACEMENT_NEW 1 @@ -62,7 +62,7 @@ U_NAMESPACE_BEGIN * UMemory does not contain any virtual functions. * Common "boilerplate" functions are defined in UObject. * - * @draft ICU 2.4 + * @stable ICU 2.4 */ class U_COMMON_API UMemory { public: @@ -74,16 +74,16 @@ public: * (uprv_malloc(), uprv_free(), uprv_realloc()); * they or something else could be used here to implement C++ new/delete * for ICU4C C++ classes - * @draft ICU 2.4 + * @stable ICU 2.4 */ - static void *operator new(size_t size); + static void * U_EXPORT2 operator new(size_t size); /** * Override for ICU4C C++ memory management. * See new(). - * @draft ICU 2.4 + * @stable ICU 2.4 */ - static void *operator new[](size_t size); + static void * U_EXPORT2 operator new[](size_t size); /** * Override for ICU4C C++ memory management. @@ -91,31 +91,31 @@ public: * (uprv_malloc(), uprv_free(), uprv_realloc()); * they or something else could be used here to implement C++ new/delete * for ICU4C C++ classes - * @draft ICU 2.4 + * @stable ICU 2.4 */ - static void operator delete(void *p); + static void U_EXPORT2 operator delete(void *p); /** * Override for ICU4C C++ memory management. * See delete(). - * @draft ICU 2.4 + * @stable ICU 2.4 */ - static void operator delete[](void *p); + static void U_EXPORT2 operator delete[](void *p); #if U_HAVE_PLACEMENT_NEW /** * Override for ICU4C C++ memory management for STL. * See new(). - * @draft ICU 2.6 + * @stable ICU 2.6 */ - static inline void * operator new(size_t, void *ptr) { return ptr; } + static inline void * U_EXPORT2 operator new(size_t, void *ptr) { return ptr; } /** * Override for ICU4C C++ memory management for STL. * See delete(). - * @draft ICU 2.6 + * @stable ICU 2.6 */ - static inline void operator delete(void *, void *) {} + static inline void U_EXPORT2 operator delete(void *, void *) {} #endif /* U_HAVE_PLACEMENT_NEW */ #endif /* U_OVERRIDE_CXX_ALLOCATION */ @@ -151,23 +151,23 @@ public: * This is because some compilers do not support covariant (same-as-this) * return types; cast to the appropriate subclass if necessary. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ class U_COMMON_API UObject : public UMemory { public: /** * Destructor. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ - virtual inline ~UObject() {} + virtual ~UObject(); /** * ICU4C "poor man's RTTI", returns a UClassID for the actual ICU class. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const = 0; + virtual UClassID getDynamicClassID() const = 0; protected: // the following functions are protected to prevent instantiation and @@ -181,8 +181,9 @@ protected: // commented out because UObject is abstract (see getDynamicClassID) // inline UObject(const UObject &other) {} -#if U_ICU_VERSION_MAJOR_NUM>2 || (U_ICU_VERSION_MAJOR_NUM==2 && U_ICU_VERSION_MINOR_NUM>6) - // TODO post ICU 2.4 (This comment inserted in 2.2) +#if 0 + // TODO Sometime in the future. Implement operator==(). + // (This comment inserted in 2.2) // some or all of the following "boilerplate" functions may be made public // in a future ICU4C release when all subclasses implement them @@ -212,8 +213,68 @@ protected: * here would be to declare and empty-implement a protected or public one. UObject &UObject::operator=(const UObject &); */ + +// Future implementation for RTTI that support subtyping. [alan] +// +// public: +// /** +// * @internal +// */ +// static UClassID getStaticClassID(); +// +// /** +// * @internal +// */ +// UBool instanceOf(UClassID type) const; }; +/** + * This is a simple macro to add ICU RTTI to an ICU object implementation. + * This does not go into the header. This should only be used in *.cpp files. + * + * @param myClass The name of the class that needs RTTI defined. + * @internal + */ +#define UOBJECT_DEFINE_RTTI_IMPLEMENTATION(myClass) \ + UClassID U_EXPORT2 myClass::getStaticClassID() { \ + static const char classID = 0; \ + return (UClassID)&classID; \ + } \ + UClassID myClass::getDynamicClassID() const \ + { return myClass::getStaticClassID(); } + + +/** + * This macro adds ICU RTTI to an ICU abstract class implementation. + * This macro should be invoked in *.cpp files. The corresponding + * header should declare getStaticClassID. + * + * @param myClass The name of the class that needs RTTI defined. + * @internal + */ +#define UOBJECT_DEFINE_ABSTRACT_RTTI_IMPLEMENTATION(myClass) \ + UClassID U_EXPORT2 myClass::getStaticClassID() { \ + static const char classID = 0; \ + return (UClassID)&classID; \ + } + +// /** +// * This macro adds ICU RTTI to an ICU concrete class implementation. +// * This macro should be invoked in *.cpp files. The corresponding +// * header should declare getDynamicClassID and getStaticClassID. +// * +// * @param myClass The name of the class that needs RTTI defined. +// * @param myParent The name of the myClass's parent. +// * @internal +// */ +/*#define UOBJECT_DEFINE_RTTI_IMPLEMENTATION(myClass, myParent) \ + UOBJECT_DEFINE_ABSTRACT_RTTI_IMPLEMENTATION(myClass, myParent) \ + UClassID myClass::getDynamicClassID() const { \ + return myClass::getStaticClassID(); \ + } +*/ + + U_NAMESPACE_END #endif diff --git a/icuSources/common/unicode/uobslete.h b/icuSources/common/unicode/uobslete.h new file mode 100644 index 00000000..763da02e --- /dev/null +++ b/icuSources/common/unicode/uobslete.h @@ -0,0 +1,29 @@ +/* +******************************************************************************* +* Copyright (C) 2004, International Business Machines +* Corporation and others. All Rights Reserved. +******************************************************************************* +* +* file name: uobslete.h +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* Created by: gendraft.pl, a perl script written by Ram Viswanadha +* +* Contains data for commenting out APIs. +* Gets included by umachine.h +* +* THIS FILE IS MACHINE-GENERATED, DON'T PLAY WITH IT IF YOU DON'T KNOW WHAT +* YOU ARE DOING, OTHERWISE VERY BAD THINGS WILL HAPPEN! +*/ + +#ifndef UOBSLETE_H +#define UOBSLETE_H + +#ifdef U_HIDE_OBSOLETE_API + + +#endif /* U_HIDE_OBSOLETE_API */ +#endif /* UOBSLETE_H */ + diff --git a/icuSources/common/unicode/urename.h b/icuSources/common/unicode/urename.h index 6e0b4ab9..55625921 100644 --- a/icuSources/common/unicode/urename.h +++ b/icuSources/common/unicode/urename.h @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 2002-2003, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************* * @@ -29,1358 +29,1436 @@ /* C exports renaming data */ -#define T_CString_integerToString T_CString_integerToString_2_6 -#define T_CString_stricmp T_CString_stricmp_2_6 -#define T_CString_stringToInteger T_CString_stringToInteger_2_6 -#define T_CString_strnicmp T_CString_strnicmp_2_6 -#define T_CString_toLowerCase T_CString_toLowerCase_2_6 -#define T_CString_toUpperCase T_CString_toUpperCase_2_6 -#define T_FileStream_close T_FileStream_close_2_6 -#define T_FileStream_eof T_FileStream_eof_2_6 -#define T_FileStream_error T_FileStream_error_2_6 -#define T_FileStream_file_exists T_FileStream_file_exists_2_6 -#define T_FileStream_getc T_FileStream_getc_2_6 -#define T_FileStream_open T_FileStream_open_2_6 -#define T_FileStream_peek T_FileStream_peek_2_6 -#define T_FileStream_putc T_FileStream_putc_2_6 -#define T_FileStream_read T_FileStream_read_2_6 -#define T_FileStream_readLine T_FileStream_readLine_2_6 -#define T_FileStream_remove T_FileStream_remove_2_6 -#define T_FileStream_rewind T_FileStream_rewind_2_6 -#define T_FileStream_size T_FileStream_size_2_6 -#define T_FileStream_stderr T_FileStream_stderr_2_6 -#define T_FileStream_stdin T_FileStream_stdin_2_6 -#define T_FileStream_stdout T_FileStream_stdout_2_6 -#define T_FileStream_ungetc T_FileStream_ungetc_2_6 -#define T_FileStream_write T_FileStream_write_2_6 -#define T_FileStream_writeLine T_FileStream_writeLine_2_6 -#define T_UConverter_fromUnicode_UTF8 T_UConverter_fromUnicode_UTF8_2_6 -#define T_UConverter_fromUnicode_UTF8_OFFSETS_LOGIC T_UConverter_fromUnicode_UTF8_OFFSETS_LOGIC_2_6 -#define T_UConverter_getNextUChar_UTF8 T_UConverter_getNextUChar_UTF8_2_6 -#define T_UConverter_toUnicode_UTF8 T_UConverter_toUnicode_UTF8_2_6 -#define T_UConverter_toUnicode_UTF8_OFFSETS_LOGIC T_UConverter_toUnicode_UTF8_OFFSETS_LOGIC_2_6 -#define UCNV_FROM_U_CALLBACK_ESCAPE UCNV_FROM_U_CALLBACK_ESCAPE_2_6 -#define UCNV_FROM_U_CALLBACK_SKIP UCNV_FROM_U_CALLBACK_SKIP_2_6 -#define UCNV_FROM_U_CALLBACK_STOP UCNV_FROM_U_CALLBACK_STOP_2_6 -#define UCNV_FROM_U_CALLBACK_SUBSTITUTE UCNV_FROM_U_CALLBACK_SUBSTITUTE_2_6 -#define UCNV_TO_U_CALLBACK_ESCAPE UCNV_TO_U_CALLBACK_ESCAPE_2_6 -#define UCNV_TO_U_CALLBACK_SKIP UCNV_TO_U_CALLBACK_SKIP_2_6 -#define UCNV_TO_U_CALLBACK_STOP UCNV_TO_U_CALLBACK_STOP_2_6 -#define UCNV_TO_U_CALLBACK_SUBSTITUTE UCNV_TO_U_CALLBACK_SUBSTITUTE_2_6 -#define UDataMemory_createNewInstance UDataMemory_createNewInstance_2_6 -#define UDataMemory_init UDataMemory_init_2_6 -#define UDataMemory_isLoaded UDataMemory_isLoaded_2_6 -#define UDataMemory_normalizeDataPointer UDataMemory_normalizeDataPointer_2_6 -#define UDataMemory_setData UDataMemory_setData_2_6 -#define UDatamemory_assign UDatamemory_assign_2_6 -#define _ASCIIData _ASCIIData_2_6 -#define _Bocu1Data _Bocu1Data_2_6 -#define _CESU8Data _CESU8Data_2_6 -#define _HZData _HZData_2_6 -#define _IMAPData _IMAPData_2_6 -#define _ISCIIData _ISCIIData_2_6 -#define _ISO2022CNData _ISO2022CNData_2_6 -#define _ISO2022Data _ISO2022Data_2_6 -#define _ISO2022JPData _ISO2022JPData_2_6 -#define _ISO2022KRData _ISO2022KRData_2_6 -#define _LMBCSData1 _LMBCSData1_2_6 -#define _LMBCSData11 _LMBCSData11_2_6 -#define _LMBCSData16 _LMBCSData16_2_6 -#define _LMBCSData17 _LMBCSData17_2_6 -#define _LMBCSData18 _LMBCSData18_2_6 -#define _LMBCSData19 _LMBCSData19_2_6 -#define _LMBCSData2 _LMBCSData2_2_6 -#define _LMBCSData3 _LMBCSData3_2_6 -#define _LMBCSData4 _LMBCSData4_2_6 -#define _LMBCSData5 _LMBCSData5_2_6 -#define _LMBCSData6 _LMBCSData6_2_6 -#define _LMBCSData8 _LMBCSData8_2_6 -#define _Latin1Data _Latin1Data_2_6 -#define _MBCSData _MBCSData_2_6 -#define _MBCSFromUChar32 _MBCSFromUChar32_2_6 -#define _MBCSFromUnicodeWithOffsets _MBCSFromUnicodeWithOffsets_2_6 -#define _MBCSGetType _MBCSGetType_2_6 -#define _MBCSIsLeadByte _MBCSIsLeadByte_2_6 -#define _MBCSSimpleGetNextUChar _MBCSSimpleGetNextUChar_2_6 -#define _MBCSToUnicodeWithOffsets _MBCSToUnicodeWithOffsets_2_6 -#define _SCSUData _SCSUData_2_6 -#define _UTF16BEData _UTF16BEData_2_6 -#define _UTF16Data _UTF16Data_2_6 -#define _UTF16LEData _UTF16LEData_2_6 -#define _UTF32BEData _UTF32BEData_2_6 -#define _UTF32Data _UTF32Data_2_6 -#define _UTF32LEData _UTF32LEData_2_6 -#define _UTF7Data _UTF7Data_2_6 -#define _UTF8Data _UTF8Data_2_6 -#define breakiterator_cleanup breakiterator_cleanup_2_6 -#define cacheDeleter cacheDeleter_2_6 -#define calendar_cleanup calendar_cleanup_2_6 -#define collator_cleanup collator_cleanup_2_6 -#define currency_cleanup currency_cleanup_2_6 -#define deleteStringPair deleteStringPair_2_6 -#define deleteUObject deleteUObject_2_6 -#define locale_cleanup locale_cleanup_2_6 -#define locale_get_default locale_get_default_2_6 -#define locale_set_default locale_set_default_2_6 -#define numfmt_cleanup numfmt_cleanup_2_6 -#define pname_cleanup pname_cleanup_2_6 -#define putil_cleanup putil_cleanup_2_6 -#define regex_cleanup regex_cleanup_2_6 -#define res_countArrayItems res_countArrayItems_2_6 -#define res_findResource res_findResource_2_6 -#define res_getAlias res_getAlias_2_6 -#define res_getArrayItem res_getArrayItem_2_6 -#define res_getBinary res_getBinary_2_6 -#define res_getIntVector res_getIntVector_2_6 -#define res_getResource res_getResource_2_6 -#define res_getString res_getString_2_6 -#define res_getTableItemByIndex res_getTableItemByIndex_2_6 -#define res_getTableItemByKey res_getTableItemByKey_2_6 -#define res_getTableSize res_getTableSize_2_6 -#define res_load res_load_2_6 -#define res_unload res_unload_2_6 -#define service_cleanup service_cleanup_2_6 -#define timeZone_cleanup timeZone_cleanup_2_6 -#define transliterator_cleanup transliterator_cleanup_2_6 -#define u_UCharsToChars u_UCharsToChars_2_6 -#define u_austrcpy u_austrcpy_2_6 -#define u_austrncpy u_austrncpy_2_6 -#define u_catclose u_catclose_2_6 -#define u_catgets u_catgets_2_6 -#define u_catopen u_catopen_2_6 -#define u_charAge u_charAge_2_6 -#define u_charDigitValue u_charDigitValue_2_6 -#define u_charDirection u_charDirection_2_6 -#define u_charFromName u_charFromName_2_6 -#define u_charMirror u_charMirror_2_6 -#define u_charName u_charName_2_6 -#define u_charType u_charType_2_6 -#define u_charsToUChars u_charsToUChars_2_6 -#define u_cleanup u_cleanup_2_6 -#define u_countChar32 u_countChar32_2_6 -#define u_digit u_digit_2_6 -#define u_enumCharNames u_enumCharNames_2_6 -#define u_enumCharTypes u_enumCharTypes_2_6 -#define u_errorName u_errorName_2_6 -#define u_fclose u_fclose_2_6 -#define u_fflush u_fflush_2_6 -#define u_fgetConverter u_fgetConverter_2_6 -#define u_fgetc u_fgetc_2_6 -#define u_fgetcodepage u_fgetcodepage_2_6 -#define u_fgetcx u_fgetcx_2_6 -#define u_fgetfile u_fgetfile_2_6 -#define u_fgetlocale u_fgetlocale_2_6 -#define u_fgets u_fgets_2_6 -#define u_file_read u_file_read_2_6 -#define u_file_write u_file_write_2_6 -#define u_file_write_flush u_file_write_flush_2_6 -#define u_finit u_finit_2_6 -#define u_foldCase u_foldCase_2_6 -#define u_fopen u_fopen_2_6 -#define u_forDigit u_forDigit_2_6 -#define u_formatMessage u_formatMessage_2_6 -#define u_formatMessageWithError u_formatMessageWithError_2_6 -#define u_fprintf u_fprintf_2_6 -#define u_fprintf_u u_fprintf_u_2_6 -#define u_fputc u_fputc_2_6 -#define u_fputs u_fputs_2_6 -#define u_fscanf u_fscanf_2_6 -#define u_fscanf_u u_fscanf_u_2_6 -#define u_fsetcodepage u_fsetcodepage_2_6 -#define u_fsetlocale u_fsetlocale_2_6 -#define u_fsettransliterator u_fsettransliterator_2_6 -#define u_fungetc u_fungetc_2_6 -#define u_getCombiningClass u_getCombiningClass_2_6 -#define u_getDataDirectory u_getDataDirectory_2_6 -#define u_getDefaultConverter u_getDefaultConverter_2_6 -#define u_getFC_NFKC_Closure u_getFC_NFKC_Closure_2_6 -#define u_getISOComment u_getISOComment_2_6 -#define u_getIntPropertyMaxValue u_getIntPropertyMaxValue_2_6 -#define u_getIntPropertyMinValue u_getIntPropertyMinValue_2_6 -#define u_getIntPropertyValue u_getIntPropertyValue_2_6 -#define u_getNumericValue u_getNumericValue_2_6 -#define u_getPropertyEnum u_getPropertyEnum_2_6 -#define u_getPropertyName u_getPropertyName_2_6 -#define u_getPropertyValueEnum u_getPropertyValueEnum_2_6 -#define u_getPropertyValueName u_getPropertyValueName_2_6 -#define u_getUnicodeProperties u_getUnicodeProperties_2_6 -#define u_getUnicodeVersion u_getUnicodeVersion_2_6 -#define u_getVersion u_getVersion_2_6 -#define u_growBufferFromStatic u_growBufferFromStatic_2_6 -#define u_hasBinaryProperty u_hasBinaryProperty_2_6 -#define u_init u_init_2_6 -#define u_internalFoldCase u_internalFoldCase_2_6 -#define u_internalStrFoldCase u_internalStrFoldCase_2_6 -#define u_internalStrToLower u_internalStrToLower_2_6 -#define u_internalStrToTitle u_internalStrToTitle_2_6 -#define u_internalStrToUpper u_internalStrToUpper_2_6 -#define u_internalToLower u_internalToLower_2_6 -#define u_internalToTitle u_internalToTitle_2_6 -#define u_internalToUpper u_internalToUpper_2_6 -#define u_isIDIgnorable u_isIDIgnorable_2_6 -#define u_isIDPart u_isIDPart_2_6 -#define u_isIDStart u_isIDStart_2_6 -#define u_isISOControl u_isISOControl_2_6 -#define u_isJavaIDPart u_isJavaIDPart_2_6 -#define u_isJavaIDStart u_isJavaIDStart_2_6 -#define u_isJavaSpaceChar u_isJavaSpaceChar_2_6 -#define u_isMirrored u_isMirrored_2_6 -#define u_isUAlphabetic u_isUAlphabetic_2_6 -#define u_isULowercase u_isULowercase_2_6 -#define u_isUUppercase u_isUUppercase_2_6 -#define u_isUWhiteSpace u_isUWhiteSpace_2_6 -#define u_isWhitespace u_isWhitespace_2_6 -#define u_isalnum u_isalnum_2_6 -#define u_isalpha u_isalpha_2_6 -#define u_isbase u_isbase_2_6 -#define u_isblank u_isblank_2_6 -#define u_iscntrl u_iscntrl_2_6 -#define u_isdefined u_isdefined_2_6 -#define u_isdigit u_isdigit_2_6 -#define u_isgraph u_isgraph_2_6 -#define u_islower u_islower_2_6 -#define u_isprint u_isprint_2_6 -#define u_ispunct u_ispunct_2_6 -#define u_isspace u_isspace_2_6 -#define u_istitle u_istitle_2_6 -#define u_isupper u_isupper_2_6 -#define u_isxdigit u_isxdigit_2_6 -#define u_lengthOfIdenticalLevelRun u_lengthOfIdenticalLevelRun_2_6 -#define u_locbund_clone u_locbund_clone_2_6 -#define u_locbund_delete u_locbund_delete_2_6 -#define u_locbund_getCurrencyFormat u_locbund_getCurrencyFormat_2_6 -#define u_locbund_getDateFormat u_locbund_getDateFormat_2_6 -#define u_locbund_getNumberFormat u_locbund_getNumberFormat_2_6 -#define u_locbund_getPercentFormat u_locbund_getPercentFormat_2_6 -#define u_locbund_getScientificFormat u_locbund_getScientificFormat_2_6 -#define u_locbund_getSpelloutFormat u_locbund_getSpelloutFormat_2_6 -#define u_locbund_getTimeFormat u_locbund_getTimeFormat_2_6 -#define u_locbund_new u_locbund_new_2_6 -#define u_loccache_get u_loccache_get_2_6 -#define u_memcasecmp u_memcasecmp_2_6 -#define u_memchr u_memchr_2_6 -#define u_memchr32 u_memchr32_2_6 -#define u_memcmp u_memcmp_2_6 -#define u_memcmpCodePointOrder u_memcmpCodePointOrder_2_6 -#define u_memcpy u_memcpy_2_6 -#define u_memmove u_memmove_2_6 -#define u_memrchr u_memrchr_2_6 -#define u_memrchr32 u_memrchr32_2_6 -#define u_memset u_memset_2_6 -#define u_parseMessage u_parseMessage_2_6 -#define u_parseMessageWithError u_parseMessageWithError_2_6 -#define u_printf_char_handler u_printf_char_handler_2_6 -#define u_printf_count_handler u_printf_count_handler_2_6 -#define u_printf_currency_handler u_printf_currency_handler_2_6 -#define u_printf_date_handler u_printf_date_handler_2_6 -#define u_printf_double_handler u_printf_double_handler_2_6 -#define u_printf_hex_handler u_printf_hex_handler_2_6 -#define u_printf_integer_handler u_printf_integer_handler_2_6 -#define u_printf_octal_handler u_printf_octal_handler_2_6 -#define u_printf_parse_spec u_printf_parse_spec_2_6 -#define u_printf_percent_handler u_printf_percent_handler_2_6 -#define u_printf_pointer_handler u_printf_pointer_handler_2_6 -#define u_printf_scidbl_handler u_printf_scidbl_handler_2_6 -#define u_printf_scientific_handler u_printf_scientific_handler_2_6 -#define u_printf_simple_percent_handler u_printf_simple_percent_handler_2_6 -#define u_printf_spellout_handler u_printf_spellout_handler_2_6 -#define u_printf_string_handler u_printf_string_handler_2_6 -#define u_printf_time_handler u_printf_time_handler_2_6 -#define u_printf_uchar_handler u_printf_uchar_handler_2_6 -#define u_printf_uinteger_handler u_printf_uinteger_handler_2_6 -#define u_printf_ustring_handler u_printf_ustring_handler_2_6 -#define u_releaseDefaultConverter u_releaseDefaultConverter_2_6 -#define u_scanf_char_handler u_scanf_char_handler_2_6 -#define u_scanf_count_handler u_scanf_count_handler_2_6 -#define u_scanf_currency_handler u_scanf_currency_handler_2_6 -#define u_scanf_date_handler u_scanf_date_handler_2_6 -#define u_scanf_double_handler u_scanf_double_handler_2_6 -#define u_scanf_hex_handler u_scanf_hex_handler_2_6 -#define u_scanf_integer_handler u_scanf_integer_handler_2_6 -#define u_scanf_octal_handler u_scanf_octal_handler_2_6 -#define u_scanf_parse_spec u_scanf_parse_spec_2_6 -#define u_scanf_percent_handler u_scanf_percent_handler_2_6 -#define u_scanf_pointer_handler u_scanf_pointer_handler_2_6 -#define u_scanf_scanset_handler u_scanf_scanset_handler_2_6 -#define u_scanf_scanset_in u_scanf_scanset_in_2_6 -#define u_scanf_scanset_init u_scanf_scanset_init_2_6 -#define u_scanf_scidbl_handler u_scanf_scidbl_handler_2_6 -#define u_scanf_scientific_handler u_scanf_scientific_handler_2_6 -#define u_scanf_simple_percent_handler u_scanf_simple_percent_handler_2_6 -#define u_scanf_spellout_handler u_scanf_spellout_handler_2_6 -#define u_scanf_string_handler u_scanf_string_handler_2_6 -#define u_scanf_time_handler u_scanf_time_handler_2_6 -#define u_scanf_uchar_handler u_scanf_uchar_handler_2_6 -#define u_scanf_uinteger_handler u_scanf_uinteger_handler_2_6 -#define u_scanf_ustring_handler u_scanf_ustring_handler_2_6 -#define u_setDataDirectory u_setDataDirectory_2_6 -#define u_shapeArabic u_shapeArabic_2_6 -#define u_snprintf u_snprintf_2_6 -#define u_snprintf_u u_snprintf_u_2_6 -#define u_sprintf u_sprintf_2_6 -#define u_sprintf_char_handler u_sprintf_char_handler_2_6 -#define u_sprintf_count_handler u_sprintf_count_handler_2_6 -#define u_sprintf_currency_handler u_sprintf_currency_handler_2_6 -#define u_sprintf_date_handler u_sprintf_date_handler_2_6 -#define u_sprintf_double_handler u_sprintf_double_handler_2_6 -#define u_sprintf_hex_handler u_sprintf_hex_handler_2_6 -#define u_sprintf_integer_handler u_sprintf_integer_handler_2_6 -#define u_sprintf_octal_handler u_sprintf_octal_handler_2_6 -#define u_sprintf_parse_spec u_sprintf_parse_spec_2_6 -#define u_sprintf_percent_handler u_sprintf_percent_handler_2_6 -#define u_sprintf_pointer_handler u_sprintf_pointer_handler_2_6 -#define u_sprintf_scidbl_handler u_sprintf_scidbl_handler_2_6 -#define u_sprintf_scientific_handler u_sprintf_scientific_handler_2_6 -#define u_sprintf_simple_percent_handler u_sprintf_simple_percent_handler_2_6 -#define u_sprintf_spellout_handler u_sprintf_spellout_handler_2_6 -#define u_sprintf_string_handler u_sprintf_string_handler_2_6 -#define u_sprintf_time_handler u_sprintf_time_handler_2_6 -#define u_sprintf_u u_sprintf_u_2_6 -#define u_sprintf_uchar_handler u_sprintf_uchar_handler_2_6 -#define u_sprintf_uinteger_handler u_sprintf_uinteger_handler_2_6 -#define u_sprintf_ustring_handler u_sprintf_ustring_handler_2_6 -#define u_sscanf u_sscanf_2_6 -#define u_sscanf_char_handler u_sscanf_char_handler_2_6 -#define u_sscanf_count_handler u_sscanf_count_handler_2_6 -#define u_sscanf_currency_handler u_sscanf_currency_handler_2_6 -#define u_sscanf_date_handler u_sscanf_date_handler_2_6 -#define u_sscanf_double_handler u_sscanf_double_handler_2_6 -#define u_sscanf_hex_handler u_sscanf_hex_handler_2_6 -#define u_sscanf_integer_handler u_sscanf_integer_handler_2_6 -#define u_sscanf_octal_handler u_sscanf_octal_handler_2_6 -#define u_sscanf_parse_spec u_sscanf_parse_spec_2_6 -#define u_sscanf_percent_handler u_sscanf_percent_handler_2_6 -#define u_sscanf_pointer_handler u_sscanf_pointer_handler_2_6 -#define u_sscanf_scanset_handler u_sscanf_scanset_handler_2_6 -#define u_sscanf_scidbl_handler u_sscanf_scidbl_handler_2_6 -#define u_sscanf_scientific_handler u_sscanf_scientific_handler_2_6 -#define u_sscanf_simple_percent_handler u_sscanf_simple_percent_handler_2_6 -#define u_sscanf_spellout_handler u_sscanf_spellout_handler_2_6 -#define u_sscanf_string_handler u_sscanf_string_handler_2_6 -#define u_sscanf_time_handler u_sscanf_time_handler_2_6 -#define u_sscanf_u u_sscanf_u_2_6 -#define u_sscanf_uchar_handler u_sscanf_uchar_handler_2_6 -#define u_sscanf_uinteger_handler u_sscanf_uinteger_handler_2_6 -#define u_sscanf_ustring_handler u_sscanf_ustring_handler_2_6 -#define u_strCaseCompare u_strCaseCompare_2_6 -#define u_strCompare u_strCompare_2_6 -#define u_strCompareIter u_strCompareIter_2_6 -#define u_strFindFirst u_strFindFirst_2_6 -#define u_strFindLast u_strFindLast_2_6 -#define u_strFoldCase u_strFoldCase_2_6 -#define u_strFromPunycode u_strFromPunycode_2_6 -#define u_strFromUTF32 u_strFromUTF32_2_6 -#define u_strFromUTF8 u_strFromUTF8_2_6 -#define u_strFromWCS u_strFromWCS_2_6 -#define u_strHasMoreChar32Than u_strHasMoreChar32Than_2_6 -#define u_strToLower u_strToLower_2_6 -#define u_strToPunycode u_strToPunycode_2_6 -#define u_strToTitle u_strToTitle_2_6 -#define u_strToUTF32 u_strToUTF32_2_6 -#define u_strToUTF8 u_strToUTF8_2_6 -#define u_strToUpper u_strToUpper_2_6 -#define u_strToWCS u_strToWCS_2_6 -#define u_strcasecmp u_strcasecmp_2_6 -#define u_strcat u_strcat_2_6 -#define u_strchr u_strchr_2_6 -#define u_strchr32 u_strchr32_2_6 -#define u_strcmp u_strcmp_2_6 -#define u_strcmpCodePointOrder u_strcmpCodePointOrder_2_6 -#define u_strcpy u_strcpy_2_6 -#define u_strcspn u_strcspn_2_6 -#define u_strlen u_strlen_2_6 -#define u_strncasecmp u_strncasecmp_2_6 -#define u_strncat u_strncat_2_6 -#define u_strncmp u_strncmp_2_6 -#define u_strncmpCodePointOrder u_strncmpCodePointOrder_2_6 -#define u_strncpy u_strncpy_2_6 -#define u_strpbrk u_strpbrk_2_6 -#define u_strrchr u_strrchr_2_6 -#define u_strrchr32 u_strrchr32_2_6 -#define u_strrstr u_strrstr_2_6 -#define u_strspn u_strspn_2_6 -#define u_strstr u_strstr_2_6 -#define u_strtok_r u_strtok_r_2_6 -#define u_terminateChars u_terminateChars_2_6 -#define u_terminateUChar32s u_terminateUChar32s_2_6 -#define u_terminateUChars u_terminateUChars_2_6 -#define u_terminateWChars u_terminateWChars_2_6 -#define u_tolower u_tolower_2_6 -#define u_totitle u_totitle_2_6 -#define u_toupper u_toupper_2_6 -#define u_uastrcpy u_uastrcpy_2_6 -#define u_uastrncpy u_uastrncpy_2_6 -#define u_unescape u_unescape_2_6 -#define u_unescapeAt u_unescapeAt_2_6 -#define u_versionFromString u_versionFromString_2_6 -#define u_versionToString u_versionToString_2_6 -#define u_vformatMessage u_vformatMessage_2_6 -#define u_vformatMessageWithError u_vformatMessageWithError_2_6 -#define u_vfprintf u_vfprintf_2_6 -#define u_vfprintf_u u_vfprintf_u_2_6 -#define u_vfscanf u_vfscanf_2_6 -#define u_vfscanf_u u_vfscanf_u_2_6 -#define u_vparseMessage u_vparseMessage_2_6 -#define u_vparseMessageWithError u_vparseMessageWithError_2_6 -#define u_vsnprintf u_vsnprintf_2_6 -#define u_vsnprintf_u u_vsnprintf_u_2_6 -#define u_vsprintf u_vsprintf_2_6 -#define u_vsprintf_u u_vsprintf_u_2_6 -#define u_vsscanf u_vsscanf_2_6 -#define u_vsscanf_u u_vsscanf_u_2_6 -#define u_writeDiff u_writeDiff_2_6 -#define u_writeIdenticalLevelRun u_writeIdenticalLevelRun_2_6 -#define u_writeIdenticalLevelRunTwoChars u_writeIdenticalLevelRunTwoChars_2_6 -#define ubidi_close ubidi_close_2_6 -#define ubidi_countRuns ubidi_countRuns_2_6 -#define ubidi_getDirection ubidi_getDirection_2_6 -#define ubidi_getLength ubidi_getLength_2_6 -#define ubidi_getLevelAt ubidi_getLevelAt_2_6 -#define ubidi_getLevels ubidi_getLevels_2_6 -#define ubidi_getLogicalIndex ubidi_getLogicalIndex_2_6 -#define ubidi_getLogicalMap ubidi_getLogicalMap_2_6 -#define ubidi_getLogicalRun ubidi_getLogicalRun_2_6 -#define ubidi_getMemory ubidi_getMemory_2_6 -#define ubidi_getParaLevel ubidi_getParaLevel_2_6 -#define ubidi_getRuns ubidi_getRuns_2_6 -#define ubidi_getText ubidi_getText_2_6 -#define ubidi_getVisualIndex ubidi_getVisualIndex_2_6 -#define ubidi_getVisualMap ubidi_getVisualMap_2_6 -#define ubidi_getVisualRun ubidi_getVisualRun_2_6 -#define ubidi_invertMap ubidi_invertMap_2_6 -#define ubidi_isInverse ubidi_isInverse_2_6 -#define ubidi_open ubidi_open_2_6 -#define ubidi_openSized ubidi_openSized_2_6 -#define ubidi_reorderLogical ubidi_reorderLogical_2_6 -#define ubidi_reorderVisual ubidi_reorderVisual_2_6 -#define ubidi_setInverse ubidi_setInverse_2_6 -#define ubidi_setLine ubidi_setLine_2_6 -#define ubidi_setPara ubidi_setPara_2_6 -#define ubidi_writeReordered ubidi_writeReordered_2_6 -#define ubidi_writeReverse ubidi_writeReverse_2_6 -#define ublock_getCode ublock_getCode_2_6 -#define ubrk_close ubrk_close_2_6 -#define ubrk_countAvailable ubrk_countAvailable_2_6 -#define ubrk_current ubrk_current_2_6 -#define ubrk_first ubrk_first_2_6 -#define ubrk_following ubrk_following_2_6 -#define ubrk_getAvailable ubrk_getAvailable_2_6 -#define ubrk_getRuleStatus ubrk_getRuleStatus_2_6 -#define ubrk_isBoundary ubrk_isBoundary_2_6 -#define ubrk_last ubrk_last_2_6 -#define ubrk_next ubrk_next_2_6 -#define ubrk_open ubrk_open_2_6 -#define ubrk_openRules ubrk_openRules_2_6 -#define ubrk_preceding ubrk_preceding_2_6 -#define ubrk_previous ubrk_previous_2_6 -#define ubrk_safeClone ubrk_safeClone_2_6 -#define ubrk_setText ubrk_setText_2_6 -#define ucal_add ucal_add_2_6 -#define ucal_clear ucal_clear_2_6 -#define ucal_clearField ucal_clearField_2_6 -#define ucal_close ucal_close_2_6 -#define ucal_countAvailable ucal_countAvailable_2_6 -#define ucal_countAvailableTZIDs ucal_countAvailableTZIDs_2_6 -#define ucal_equivalentTo ucal_equivalentTo_2_6 -#define ucal_get ucal_get_2_6 -#define ucal_getAttribute ucal_getAttribute_2_6 -#define ucal_getAvailable ucal_getAvailable_2_6 -#define ucal_getAvailableTZIDs ucal_getAvailableTZIDs_2_6 -#define ucal_getDSTSavings ucal_getDSTSavings_2_6 -#define ucal_getDefaultTimeZone ucal_getDefaultTimeZone_2_6 -#define ucal_getLimit ucal_getLimit_2_6 -#define ucal_getMillis ucal_getMillis_2_6 -#define ucal_getNow ucal_getNow_2_6 -#define ucal_getTimeZoneDisplayName ucal_getTimeZoneDisplayName_2_6 -#define ucal_inDaylightTime ucal_inDaylightTime_2_6 -#define ucal_isSet ucal_isSet_2_6 -#define ucal_open ucal_open_2_6 -#define ucal_openCountryTimeZones ucal_openCountryTimeZones_2_6 -#define ucal_openTimeZones ucal_openTimeZones_2_6 -#define ucal_roll ucal_roll_2_6 -#define ucal_set ucal_set_2_6 -#define ucal_setAttribute ucal_setAttribute_2_6 -#define ucal_setDate ucal_setDate_2_6 -#define ucal_setDateTime ucal_setDateTime_2_6 -#define ucal_setDefaultTimeZone ucal_setDefaultTimeZone_2_6 -#define ucal_setMillis ucal_setMillis_2_6 -#define ucal_setTimeZone ucal_setTimeZone_2_6 -#define uchar_addPropertyStarts uchar_addPropertyStarts_2_6 -#define uchar_cleanup uchar_cleanup_2_6 -#define ucln_i18n_registerCleanup ucln_i18n_registerCleanup_2_6 -#define ucln_registerCleanup ucln_registerCleanup_2_6 -#define ucln_ustdio_registerCleanup ucln_ustdio_registerCleanup_2_6 -#define ucmp8_close ucmp8_close_2_6 -#define ucmp8_compact ucmp8_compact_2_6 -#define ucmp8_expand ucmp8_expand_2_6 -#define ucmp8_flattenMem ucmp8_flattenMem_2_6 -#define ucmp8_getArray ucmp8_getArray_2_6 -#define ucmp8_getCount ucmp8_getCount_2_6 -#define ucmp8_getIndex ucmp8_getIndex_2_6 -#define ucmp8_getkBlockCount ucmp8_getkBlockCount_2_6 -#define ucmp8_getkUnicodeCount ucmp8_getkUnicodeCount_2_6 -#define ucmp8_init ucmp8_init_2_6 -#define ucmp8_initAdopt ucmp8_initAdopt_2_6 -#define ucmp8_initAlias ucmp8_initAlias_2_6 -#define ucmp8_initBogus ucmp8_initBogus_2_6 -#define ucmp8_initFromData ucmp8_initFromData_2_6 -#define ucmp8_isBogus ucmp8_isBogus_2_6 -#define ucmp8_open ucmp8_open_2_6 -#define ucmp8_openAdopt ucmp8_openAdopt_2_6 -#define ucmp8_openAlias ucmp8_openAlias_2_6 -#define ucmp8_set ucmp8_set_2_6 -#define ucmp8_setRange ucmp8_setRange_2_6 -#define ucnv_cbFromUWriteBytes ucnv_cbFromUWriteBytes_2_6 -#define ucnv_cbFromUWriteSub ucnv_cbFromUWriteSub_2_6 -#define ucnv_cbFromUWriteUChars ucnv_cbFromUWriteUChars_2_6 -#define ucnv_cbToUWriteSub ucnv_cbToUWriteSub_2_6 -#define ucnv_cbToUWriteUChars ucnv_cbToUWriteUChars_2_6 -#define ucnv_cleanup ucnv_cleanup_2_6 -#define ucnv_close ucnv_close_2_6 -#define ucnv_compareNames ucnv_compareNames_2_6 -#define ucnv_convert ucnv_convert_2_6 -#define ucnv_convertEx ucnv_convertEx_2_6 -#define ucnv_copyPlatformString ucnv_copyPlatformString_2_6 -#define ucnv_countAliases ucnv_countAliases_2_6 -#define ucnv_countAvailable ucnv_countAvailable_2_6 -#define ucnv_countStandards ucnv_countStandards_2_6 -#define ucnv_createAlgorithmicConverter ucnv_createAlgorithmicConverter_2_6 -#define ucnv_createConverter ucnv_createConverter_2_6 -#define ucnv_createConverterFromPackage ucnv_createConverterFromPackage_2_6 -#define ucnv_createConverterFromSharedData ucnv_createConverterFromSharedData_2_6 -#define ucnv_detectUnicodeSignature ucnv_detectUnicodeSignature_2_6 -#define ucnv_fixFileSeparator ucnv_fixFileSeparator_2_6 -#define ucnv_flushCache ucnv_flushCache_2_6 -#define ucnv_flushInternalCharBuffer ucnv_flushInternalCharBuffer_2_6 -#define ucnv_flushInternalUnicodeBuffer ucnv_flushInternalUnicodeBuffer_2_6 -#define ucnv_fromAlgorithmic ucnv_fromAlgorithmic_2_6 -#define ucnv_fromUChars ucnv_fromUChars_2_6 -#define ucnv_fromUnicode ucnv_fromUnicode_2_6 -#define ucnv_getAlias ucnv_getAlias_2_6 -#define ucnv_getAliases ucnv_getAliases_2_6 -#define ucnv_getAvailableName ucnv_getAvailableName_2_6 -#define ucnv_getCCSID ucnv_getCCSID_2_6 -#define ucnv_getCanonicalName ucnv_getCanonicalName_2_6 -#define ucnv_getCompleteUnicodeSet ucnv_getCompleteUnicodeSet_2_6 -#define ucnv_getDefaultName ucnv_getDefaultName_2_6 -#define ucnv_getDisplayName ucnv_getDisplayName_2_6 -#define ucnv_getFromUCallBack ucnv_getFromUCallBack_2_6 -#define ucnv_getInvalidChars ucnv_getInvalidChars_2_6 -#define ucnv_getInvalidUChars ucnv_getInvalidUChars_2_6 -#define ucnv_getMaxCharSize ucnv_getMaxCharSize_2_6 -#define ucnv_getMinCharSize ucnv_getMinCharSize_2_6 -#define ucnv_getName ucnv_getName_2_6 -#define ucnv_getNextUChar ucnv_getNextUChar_2_6 -#define ucnv_getNextUCharFromToUImpl ucnv_getNextUCharFromToUImpl_2_6 -#define ucnv_getNonSurrogateUnicodeSet ucnv_getNonSurrogateUnicodeSet_2_6 -#define ucnv_getPlatform ucnv_getPlatform_2_6 -#define ucnv_getStandard ucnv_getStandard_2_6 -#define ucnv_getStandardName ucnv_getStandardName_2_6 -#define ucnv_getStarters ucnv_getStarters_2_6 -#define ucnv_getSubstChars ucnv_getSubstChars_2_6 -#define ucnv_getToUCallBack ucnv_getToUCallBack_2_6 -#define ucnv_getType ucnv_getType_2_6 -#define ucnv_getUChar32KeepOverflow ucnv_getUChar32KeepOverflow_2_6 -#define ucnv_getUnicodeSet ucnv_getUnicodeSet_2_6 -#define ucnv_incrementRefCount ucnv_incrementRefCount_2_6 -#define ucnv_init ucnv_init_2_6 -#define ucnv_io_cleanup ucnv_io_cleanup_2_6 -#define ucnv_io_countAliases ucnv_io_countAliases_2_6 -#define ucnv_io_countAvailableAliases ucnv_io_countAvailableAliases_2_6 -#define ucnv_io_countAvailableConverters ucnv_io_countAvailableConverters_2_6 -#define ucnv_io_countStandards ucnv_io_countStandards_2_6 -#define ucnv_io_flushAvailableConverterCache ucnv_io_flushAvailableConverterCache_2_6 -#define ucnv_io_getAlias ucnv_io_getAlias_2_6 -#define ucnv_io_getAliases ucnv_io_getAliases_2_6 -#define ucnv_io_getAvailableConverter ucnv_io_getAvailableConverter_2_6 -#define ucnv_io_getConverterName ucnv_io_getConverterName_2_6 -#define ucnv_io_getDefaultConverterName ucnv_io_getDefaultConverterName_2_6 -#define ucnv_io_setDefaultConverterName ucnv_io_setDefaultConverterName_2_6 -#define ucnv_io_stripForCompare ucnv_io_stripForCompare_2_6 -#define ucnv_isAmbiguous ucnv_isAmbiguous_2_6 -#define ucnv_open ucnv_open_2_6 -#define ucnv_openAllNames ucnv_openAllNames_2_6 -#define ucnv_openCCSID ucnv_openCCSID_2_6 -#define ucnv_openPackage ucnv_openPackage_2_6 -#define ucnv_openStandardNames ucnv_openStandardNames_2_6 -#define ucnv_openU ucnv_openU_2_6 -#define ucnv_reset ucnv_reset_2_6 -#define ucnv_resetFromUnicode ucnv_resetFromUnicode_2_6 -#define ucnv_resetToUnicode ucnv_resetToUnicode_2_6 -#define ucnv_safeClone ucnv_safeClone_2_6 -#define ucnv_setDefaultName ucnv_setDefaultName_2_6 -#define ucnv_setFallback ucnv_setFallback_2_6 -#define ucnv_setFromUCallBack ucnv_setFromUCallBack_2_6 -#define ucnv_setSubstChars ucnv_setSubstChars_2_6 -#define ucnv_setToUCallBack ucnv_setToUCallBack_2_6 -#define ucnv_toAlgorithmic ucnv_toAlgorithmic_2_6 -#define ucnv_toUChars ucnv_toUChars_2_6 -#define ucnv_toUnicode ucnv_toUnicode_2_6 -#define ucnv_unloadSharedDataIfReady ucnv_unloadSharedDataIfReady_2_6 -#define ucnv_updateCallbackOffsets ucnv_updateCallbackOffsets_2_6 -#define ucnv_usesFallback ucnv_usesFallback_2_6 -#define ucol_allocWeights ucol_allocWeights_2_6 -#define ucol_assembleTailoringTable ucol_assembleTailoringTable_2_6 -#define ucol_bld_cleanup ucol_bld_cleanup_2_6 -#define ucol_calcSortKey ucol_calcSortKey_2_6 -#define ucol_calcSortKeySimpleTertiary ucol_calcSortKeySimpleTertiary_2_6 -#define ucol_cleanup ucol_cleanup_2_6 -#define ucol_cloneRuleData ucol_cloneRuleData_2_6 -#define ucol_close ucol_close_2_6 -#define ucol_closeElements ucol_closeElements_2_6 -#define ucol_countAvailable ucol_countAvailable_2_6 -#define ucol_createElements ucol_createElements_2_6 -#define ucol_doCE ucol_doCE_2_6 -#define ucol_equal ucol_equal_2_6 -#define ucol_equals ucol_equals_2_6 -#define ucol_getAttribute ucol_getAttribute_2_6 -#define ucol_getAvailable ucol_getAvailable_2_6 -#define ucol_getBound ucol_getBound_2_6 -#define ucol_getCEGenerator ucol_getCEGenerator_2_6 -#define ucol_getDisplayName ucol_getDisplayName_2_6 -#define ucol_getFirstCE ucol_getFirstCE_2_6 -#define ucol_getLocale ucol_getLocale_2_6 -#define ucol_getMaxExpansion ucol_getMaxExpansion_2_6 -#define ucol_getNextCE ucol_getNextCE_2_6 -#define ucol_getNextGenerated ucol_getNextGenerated_2_6 -#define ucol_getOffset ucol_getOffset_2_6 -#define ucol_getPrevCE ucol_getPrevCE_2_6 -#define ucol_getRules ucol_getRules_2_6 -#define ucol_getRulesEx ucol_getRulesEx_2_6 -#define ucol_getSimpleCEGenerator ucol_getSimpleCEGenerator_2_6 -#define ucol_getSortKey ucol_getSortKey_2_6 -#define ucol_getSortKeySize ucol_getSortKeySize_2_6 -#define ucol_getSortKeyWithAllocation ucol_getSortKeyWithAllocation_2_6 -#define ucol_getStrength ucol_getStrength_2_6 -#define ucol_getTailoredSet ucol_getTailoredSet_2_6 -#define ucol_getVariableTop ucol_getVariableTop_2_6 -#define ucol_getVersion ucol_getVersion_2_6 -#define ucol_greater ucol_greater_2_6 -#define ucol_greaterOrEqual ucol_greaterOrEqual_2_6 -#define ucol_initBuffers ucol_initBuffers_2_6 -#define ucol_initCollator ucol_initCollator_2_6 -#define ucol_initInverseUCA ucol_initInverseUCA_2_6 -#define ucol_initUCA ucol_initUCA_2_6 -#define ucol_inv_getGapPositions ucol_inv_getGapPositions_2_6 -#define ucol_inv_getNextCE ucol_inv_getNextCE_2_6 -#define ucol_inv_getPrevCE ucol_inv_getPrevCE_2_6 -#define ucol_isTailored ucol_isTailored_2_6 -#define ucol_keyHashCode ucol_keyHashCode_2_6 -#define ucol_mergeSortkeys ucol_mergeSortkeys_2_6 -#define ucol_next ucol_next_2_6 -#define ucol_nextSortKeyPart ucol_nextSortKeyPart_2_6 -#define ucol_nextWeight ucol_nextWeight_2_6 -#define ucol_open ucol_open_2_6 -#define ucol_openElements ucol_openElements_2_6 -#define ucol_openRules ucol_openRules_2_6 -#define ucol_open_internal ucol_open_internal_2_6 -#define ucol_previous ucol_previous_2_6 -#define ucol_primaryOrder ucol_primaryOrder_2_6 -#define ucol_prv_getSpecialCE ucol_prv_getSpecialCE_2_6 -#define ucol_prv_getSpecialPrevCE ucol_prv_getSpecialPrevCE_2_6 -#define ucol_reset ucol_reset_2_6 -#define ucol_restoreVariableTop ucol_restoreVariableTop_2_6 -#define ucol_safeClone ucol_safeClone_2_6 -#define ucol_secondaryOrder ucol_secondaryOrder_2_6 -#define ucol_setAttribute ucol_setAttribute_2_6 -#define ucol_setOffset ucol_setOffset_2_6 -#define ucol_setOptionsFromHeader ucol_setOptionsFromHeader_2_6 -#define ucol_setReqValidLocales ucol_setReqValidLocales_2_6 -#define ucol_setStrength ucol_setStrength_2_6 -#define ucol_setText ucol_setText_2_6 -#define ucol_setVariableTop ucol_setVariableTop_2_6 -#define ucol_sortKeyToString ucol_sortKeyToString_2_6 -#define ucol_strcoll ucol_strcoll_2_6 -#define ucol_strcollIter ucol_strcollIter_2_6 -#define ucol_tertiaryOrder ucol_tertiaryOrder_2_6 -#define ucol_tok_assembleTokenList ucol_tok_assembleTokenList_2_6 -#define ucol_tok_closeTokenList ucol_tok_closeTokenList_2_6 -#define ucol_tok_getNextArgument ucol_tok_getNextArgument_2_6 -#define ucol_tok_initTokenList ucol_tok_initTokenList_2_6 -#define ucol_tok_parseNextToken ucol_tok_parseNextToken_2_6 -#define ucol_updateInternalState ucol_updateInternalState_2_6 -#define ucurr_forLocale ucurr_forLocale_2_6 -#define ucurr_getDefaultFractionDigits ucurr_getDefaultFractionDigits_2_6 -#define ucurr_getName ucurr_getName_2_6 -#define ucurr_getRoundingIncrement ucurr_getRoundingIncrement_2_6 -#define ucurr_register ucurr_register_2_6 -#define ucurr_unregister ucurr_unregister_2_6 -#define udat_applyPattern udat_applyPattern_2_6 -#define udat_clone udat_clone_2_6 -#define udat_close udat_close_2_6 -#define udat_countAvailable udat_countAvailable_2_6 -#define udat_countSymbols udat_countSymbols_2_6 -#define udat_format udat_format_2_6 -#define udat_get2DigitYearStart udat_get2DigitYearStart_2_6 -#define udat_getAvailable udat_getAvailable_2_6 -#define udat_getCalendar udat_getCalendar_2_6 -#define udat_getNumberFormat udat_getNumberFormat_2_6 -#define udat_getSymbols udat_getSymbols_2_6 -#define udat_isLenient udat_isLenient_2_6 -#define udat_open udat_open_2_6 -#define udat_parse udat_parse_2_6 -#define udat_parseCalendar udat_parseCalendar_2_6 -#define udat_set2DigitYearStart udat_set2DigitYearStart_2_6 -#define udat_setCalendar udat_setCalendar_2_6 -#define udat_setLenient udat_setLenient_2_6 -#define udat_setNumberFormat udat_setNumberFormat_2_6 -#define udat_setSymbols udat_setSymbols_2_6 -#define udat_toPattern udat_toPattern_2_6 -#define udata_checkCommonData udata_checkCommonData_2_6 -#define udata_cleanup udata_cleanup_2_6 -#define udata_close udata_close_2_6 -#define udata_getInfo udata_getInfo_2_6 -#define udata_getMemory udata_getMemory_2_6 -#define udata_open udata_open_2_6 -#define udata_openChoice udata_openChoice_2_6 -#define udata_setAppData udata_setAppData_2_6 -#define udata_setCommonData udata_setCommonData_2_6 -#define uenum_close uenum_close_2_6 -#define uenum_count uenum_count_2_6 -#define uenum_next uenum_next_2_6 -#define uenum_nextDefault uenum_nextDefault_2_6 -#define uenum_openStringEnumeration uenum_openStringEnumeration_2_6 -#define uenum_reset uenum_reset_2_6 -#define uenum_unext uenum_unext_2_6 -#define uenum_unextDefault uenum_unextDefault_2_6 -#define ufile_close_translit ufile_close_translit_2_6 -#define ufile_fill_uchar_buffer ufile_fill_uchar_buffer_2_6 -#define ufile_flush_translit ufile_flush_translit_2_6 -#define ufmt_defaultCPToUnicode ufmt_defaultCPToUnicode_2_6 -#define ufmt_digitvalue ufmt_digitvalue_2_6 -#define ufmt_isdigit ufmt_isdigit_2_6 -#define ufmt_ltou ufmt_ltou_2_6 -#define ufmt_unicodeToDefaultCP ufmt_unicodeToDefaultCP_2_6 -#define ufmt_utol ufmt_utol_2_6 -#define uhash_close uhash_close_2_6 -#define uhash_compareCaselessUnicodeString uhash_compareCaselessUnicodeString_2_6 -#define uhash_compareChars uhash_compareChars_2_6 -#define uhash_compareIChars uhash_compareIChars_2_6 -#define uhash_compareLong uhash_compareLong_2_6 -#define uhash_compareUChars uhash_compareUChars_2_6 -#define uhash_compareUnicodeString uhash_compareUnicodeString_2_6 -#define uhash_count uhash_count_2_6 -#define uhash_deleteHashtable uhash_deleteHashtable_2_6 -#define uhash_deleteUVector uhash_deleteUVector_2_6 -#define uhash_deleteUnicodeString uhash_deleteUnicodeString_2_6 -#define uhash_find uhash_find_2_6 -#define uhash_freeBlock uhash_freeBlock_2_6 -#define uhash_get uhash_get_2_6 -#define uhash_geti uhash_geti_2_6 -#define uhash_hashCaselessUnicodeString uhash_hashCaselessUnicodeString_2_6 -#define uhash_hashChars uhash_hashChars_2_6 -#define uhash_hashIChars uhash_hashIChars_2_6 -#define uhash_hashLong uhash_hashLong_2_6 -#define uhash_hashUChars uhash_hashUChars_2_6 -#define uhash_hashUCharsN uhash_hashUCharsN_2_6 -#define uhash_hashUnicodeString uhash_hashUnicodeString_2_6 -#define uhash_iget uhash_iget_2_6 -#define uhash_iput uhash_iput_2_6 -#define uhash_iremove uhash_iremove_2_6 -#define uhash_nextElement uhash_nextElement_2_6 -#define uhash_open uhash_open_2_6 -#define uhash_openSize uhash_openSize_2_6 -#define uhash_put uhash_put_2_6 -#define uhash_puti uhash_puti_2_6 -#define uhash_remove uhash_remove_2_6 -#define uhash_removeAll uhash_removeAll_2_6 -#define uhash_removeElement uhash_removeElement_2_6 -#define uhash_removei uhash_removei_2_6 -#define uhash_setKeyComparator uhash_setKeyComparator_2_6 -#define uhash_setKeyDeleter uhash_setKeyDeleter_2_6 -#define uhash_setKeyHasher uhash_setKeyHasher_2_6 -#define uhash_setResizePolicy uhash_setResizePolicy_2_6 -#define uhash_setValueDeleter uhash_setValueDeleter_2_6 -#define uhash_toki uhash_toki_2_6 -#define uhash_tokp uhash_tokp_2_6 -#define uidna_IDNToASCII uidna_IDNToASCII_2_6 -#define uidna_IDNToUnicode uidna_IDNToUnicode_2_6 -#define uidna_compare uidna_compare_2_6 -#define uidna_toASCII uidna_toASCII_2_6 -#define uidna_toUnicode uidna_toUnicode_2_6 -#define uiter_current32 uiter_current32_2_6 -#define uiter_getState uiter_getState_2_6 -#define uiter_next32 uiter_next32_2_6 -#define uiter_previous32 uiter_previous32_2_6 -#define uiter_setCharacterIterator uiter_setCharacterIterator_2_6 -#define uiter_setReplaceable uiter_setReplaceable_2_6 -#define uiter_setState uiter_setState_2_6 -#define uiter_setString uiter_setString_2_6 -#define uiter_setUTF16BE uiter_setUTF16BE_2_6 -#define uiter_setUTF8 uiter_setUTF8_2_6 -#define uloc_cleanup uloc_cleanup_2_6 -#define uloc_countAvailable uloc_countAvailable_2_6 -#define uloc_getAvailable uloc_getAvailable_2_6 -#define uloc_getCountry uloc_getCountry_2_6 -#define uloc_getDefault uloc_getDefault_2_6 -#define uloc_getDisplayCountry uloc_getDisplayCountry_2_6 -#define uloc_getDisplayLanguage uloc_getDisplayLanguage_2_6 -#define uloc_getDisplayName uloc_getDisplayName_2_6 -#define uloc_getDisplayVariant uloc_getDisplayVariant_2_6 -#define uloc_getISO3Country uloc_getISO3Country_2_6 -#define uloc_getISO3Language uloc_getISO3Language_2_6 -#define uloc_getISOCountries uloc_getISOCountries_2_6 -#define uloc_getISOLanguages uloc_getISOLanguages_2_6 -#define uloc_getLCID uloc_getLCID_2_6 -#define uloc_getLanguage uloc_getLanguage_2_6 -#define uloc_getName uloc_getName_2_6 -#define uloc_getParent uloc_getParent_2_6 -#define uloc_getVariant uloc_getVariant_2_6 -#define uloc_setDefault uloc_setDefault_2_6 -#define umsg_applyPattern umsg_applyPattern_2_6 -#define umsg_clone umsg_clone_2_6 -#define umsg_close umsg_close_2_6 -#define umsg_format umsg_format_2_6 -#define umsg_getLocale umsg_getLocale_2_6 -#define umsg_open umsg_open_2_6 -#define umsg_parse umsg_parse_2_6 -#define umsg_setLocale umsg_setLocale_2_6 -#define umsg_toPattern umsg_toPattern_2_6 -#define umsg_vformat umsg_vformat_2_6 -#define umsg_vparse umsg_vparse_2_6 -#define umtx_atomic_dec umtx_atomic_dec_2_6 -#define umtx_atomic_inc umtx_atomic_inc_2_6 -#define umtx_destroy umtx_destroy_2_6 -#define umtx_init umtx_init_2_6 -#define umtx_isInitialized umtx_isInitialized_2_6 -#define umtx_lock umtx_lock_2_6 -#define umtx_unlock umtx_unlock_2_6 -#define unames_cleanup unames_cleanup_2_6 -#define unorm_addPropertyStarts unorm_addPropertyStarts_2_6 -#define unorm_cleanup unorm_cleanup_2_6 -#define unorm_closeIter unorm_closeIter_2_6 -#define unorm_cmpEquivFold unorm_cmpEquivFold_2_6 -#define unorm_compare unorm_compare_2_6 -#define unorm_compose unorm_compose_2_6 -#define unorm_concatenate unorm_concatenate_2_6 -#define unorm_decompose unorm_decompose_2_6 -#define unorm_getCanonStartSet unorm_getCanonStartSet_2_6 -#define unorm_getDecomposition unorm_getDecomposition_2_6 -#define unorm_getFCDTrie unorm_getFCDTrie_2_6 -#define unorm_haveData unorm_haveData_2_6 -#define unorm_internalIsFullCompositionExclusion unorm_internalIsFullCompositionExclusion_2_6 -#define unorm_internalNormalize unorm_internalNormalize_2_6 -#define unorm_isCanonSafeStart unorm_isCanonSafeStart_2_6 -#define unorm_isNFSkippable unorm_isNFSkippable_2_6 -#define unorm_isNormalized unorm_isNormalized_2_6 -#define unorm_isNormalizedWithOptions unorm_isNormalizedWithOptions_2_6 -#define unorm_next unorm_next_2_6 -#define unorm_normalize unorm_normalize_2_6 -#define unorm_openIter unorm_openIter_2_6 -#define unorm_previous unorm_previous_2_6 -#define unorm_quickCheck unorm_quickCheck_2_6 -#define unorm_quickCheckWithOptions unorm_quickCheckWithOptions_2_6 -#define unorm_setIter unorm_setIter_2_6 -#define unum_applyPattern unum_applyPattern_2_6 -#define unum_clone unum_clone_2_6 -#define unum_close unum_close_2_6 -#define unum_countAvailable unum_countAvailable_2_6 -#define unum_format unum_format_2_6 -#define unum_formatDouble unum_formatDouble_2_6 -#define unum_getAttribute unum_getAttribute_2_6 -#define unum_getAvailable unum_getAvailable_2_6 -#define unum_getDoubleAttribute unum_getDoubleAttribute_2_6 -#define unum_getSymbol unum_getSymbol_2_6 -#define unum_getTextAttribute unum_getTextAttribute_2_6 -#define unum_open unum_open_2_6 -#define unum_parse unum_parse_2_6 -#define unum_parseDouble unum_parseDouble_2_6 -#define unum_setAttribute unum_setAttribute_2_6 -#define unum_setDoubleAttribute unum_setDoubleAttribute_2_6 -#define unum_setSymbol unum_setSymbol_2_6 -#define unum_setTextAttribute unum_setTextAttribute_2_6 -#define unum_toPattern unum_toPattern_2_6 -#define uprv_ceil uprv_ceil_2_6 -#define uprv_cnttab_addContraction uprv_cnttab_addContraction_2_6 -#define uprv_cnttab_changeContraction uprv_cnttab_changeContraction_2_6 -#define uprv_cnttab_changeLastCE uprv_cnttab_changeLastCE_2_6 -#define uprv_cnttab_clone uprv_cnttab_clone_2_6 -#define uprv_cnttab_close uprv_cnttab_close_2_6 -#define uprv_cnttab_constructTable uprv_cnttab_constructTable_2_6 -#define uprv_cnttab_findCE uprv_cnttab_findCE_2_6 -#define uprv_cnttab_findCP uprv_cnttab_findCP_2_6 -#define uprv_cnttab_getCE uprv_cnttab_getCE_2_6 -#define uprv_cnttab_insertContraction uprv_cnttab_insertContraction_2_6 -#define uprv_cnttab_isTailored uprv_cnttab_isTailored_2_6 -#define uprv_cnttab_open uprv_cnttab_open_2_6 -#define uprv_cnttab_setContraction uprv_cnttab_setContraction_2_6 -#define uprv_comparePropertyNames uprv_comparePropertyNames_2_6 -#define uprv_defaultCodePageForLocale uprv_defaultCodePageForLocale_2_6 -#define uprv_digitsAfterDecimal uprv_digitsAfterDecimal_2_6 -#define uprv_dtostr uprv_dtostr_2_6 -#define uprv_fabs uprv_fabs_2_6 -#define uprv_floor uprv_floor_2_6 -#define uprv_fmax uprv_fmax_2_6 -#define uprv_fmin uprv_fmin_2_6 -#define uprv_fmod uprv_fmod_2_6 -#define uprv_free uprv_free_2_6 -#define uprv_getCharNameCharacters uprv_getCharNameCharacters_2_6 -#define uprv_getDefaultCodepage uprv_getDefaultCodepage_2_6 -#define uprv_getDefaultLocaleID uprv_getDefaultLocaleID_2_6 -#define uprv_getInclusions uprv_getInclusions_2_6 -#define uprv_getInfinity uprv_getInfinity_2_6 -#define uprv_getMaxCharNameLength uprv_getMaxCharNameLength_2_6 -#define uprv_getMaxValues uprv_getMaxValues_2_6 -#define uprv_getNaN uprv_getNaN_2_6 -#define uprv_getUTCtime uprv_getUTCtime_2_6 -#define uprv_haveProperties uprv_haveProperties_2_6 -#define uprv_init_collIterate uprv_init_collIterate_2_6 -#define uprv_isInfinite uprv_isInfinite_2_6 -#define uprv_isNaN uprv_isNaN_2_6 -#define uprv_isNegativeInfinity uprv_isNegativeInfinity_2_6 -#define uprv_isPositiveInfinity uprv_isPositiveInfinity_2_6 -#define uprv_isRuleWhiteSpace uprv_isRuleWhiteSpace_2_6 -#define uprv_itou uprv_itou_2_6 -#define uprv_log uprv_log_2_6 -#define uprv_log10 uprv_log10_2_6 -#define uprv_malloc uprv_malloc_2_6 -#define uprv_mapFile uprv_mapFile_2_6 -#define uprv_max uprv_max_2_6 -#define uprv_maxMantissa uprv_maxMantissa_2_6 -#define uprv_min uprv_min_2_6 -#define uprv_modf uprv_modf_2_6 -#define uprv_mstrm_close uprv_mstrm_close_2_6 -#define uprv_mstrm_eof uprv_mstrm_eof_2_6 -#define uprv_mstrm_error uprv_mstrm_error_2_6 -#define uprv_mstrm_getBuffer uprv_mstrm_getBuffer_2_6 -#define uprv_mstrm_getCurrentBuffer uprv_mstrm_getCurrentBuffer_2_6 -#define uprv_mstrm_jump uprv_mstrm_jump_2_6 -#define uprv_mstrm_openBuffer uprv_mstrm_openBuffer_2_6 -#define uprv_mstrm_openNew uprv_mstrm_openNew_2_6 -#define uprv_mstrm_read uprv_mstrm_read_2_6 -#define uprv_mstrm_setError uprv_mstrm_setError_2_6 -#define uprv_mstrm_skip uprv_mstrm_skip_2_6 -#define uprv_mstrm_write uprv_mstrm_write_2_6 -#define uprv_mstrm_write16 uprv_mstrm_write16_2_6 -#define uprv_mstrm_write32 uprv_mstrm_write32_2_6 -#define uprv_mstrm_write8 uprv_mstrm_write8_2_6 -#define uprv_mstrm_writeBlock uprv_mstrm_writeBlock_2_6 -#define uprv_mstrm_writePadding uprv_mstrm_writePadding_2_6 -#define uprv_mstrm_writeString uprv_mstrm_writeString_2_6 -#define uprv_mstrm_writeUString uprv_mstrm_writeUString_2_6 -#define uprv_openRuleWhiteSpaceSet uprv_openRuleWhiteSpaceSet_2_6 -#define uprv_pow uprv_pow_2_6 -#define uprv_pow10 uprv_pow10_2_6 -#define uprv_realloc uprv_realloc_2_6 -#define uprv_round uprv_round_2_6 -#define uprv_strCompare uprv_strCompare_2_6 -#define uprv_strdup uprv_strdup_2_6 -#define uprv_strtod uprv_strtod_2_6 -#define uprv_timezone uprv_timezone_2_6 -#define uprv_tolower uprv_tolower_2_6 -#define uprv_toupper uprv_toupper_2_6 -#define uprv_trunc uprv_trunc_2_6 -#define uprv_tzname uprv_tzname_2_6 -#define uprv_tzset uprv_tzset_2_6 -#define uprv_uca_addAnElement uprv_uca_addAnElement_2_6 -#define uprv_uca_assembleTable uprv_uca_assembleTable_2_6 -#define uprv_uca_canonicalClosure uprv_uca_canonicalClosure_2_6 -#define uprv_uca_cloneTempTable uprv_uca_cloneTempTable_2_6 -#define uprv_uca_closeTempTable uprv_uca_closeTempTable_2_6 -#define uprv_uca_initImplicitConstants uprv_uca_initImplicitConstants_2_6 -#define uprv_uca_initTempTable uprv_uca_initTempTable_2_6 -#define uprv_unmapFile uprv_unmapFile_2_6 -#define ures_appendResPath ures_appendResPath_2_6 -#define ures_cleanup ures_cleanup_2_6 -#define ures_close ures_close_2_6 -#define ures_copyResb ures_copyResb_2_6 -#define ures_countArrayItems ures_countArrayItems_2_6 -#define ures_findResource ures_findResource_2_6 -#define ures_findSubResource ures_findSubResource_2_6 -#define ures_freeResPath ures_freeResPath_2_6 -#define ures_getBinary ures_getBinary_2_6 -#define ures_getByIndex ures_getByIndex_2_6 -#define ures_getByKey ures_getByKey_2_6 -#define ures_getInt ures_getInt_2_6 -#define ures_getIntVector ures_getIntVector_2_6 -#define ures_getKey ures_getKey_2_6 -#define ures_getLocale ures_getLocale_2_6 -#define ures_getName ures_getName_2_6 -#define ures_getNextResource ures_getNextResource_2_6 -#define ures_getNextString ures_getNextString_2_6 -#define ures_getPath ures_getPath_2_6 -#define ures_getSize ures_getSize_2_6 -#define ures_getString ures_getString_2_6 -#define ures_getStringByIndex ures_getStringByIndex_2_6 -#define ures_getStringByKey ures_getStringByKey_2_6 -#define ures_getType ures_getType_2_6 -#define ures_getUInt ures_getUInt_2_6 -#define ures_getVersion ures_getVersion_2_6 -#define ures_getVersionNumber ures_getVersionNumber_2_6 -#define ures_hasNext ures_hasNext_2_6 -#define ures_init ures_init_2_6 -#define ures_initStackObject ures_initStackObject_2_6 -#define ures_isStackObject ures_isStackObject_2_6 -#define ures_open ures_open_2_6 -#define ures_openDirect ures_openDirect_2_6 -#define ures_openFillIn ures_openFillIn_2_6 -#define ures_openU ures_openU_2_6 -#define ures_resetIterator ures_resetIterator_2_6 -#define ures_setIsStackObject ures_setIsStackObject_2_6 -#define uscript_closeRun uscript_closeRun_2_6 -#define uscript_getCode uscript_getCode_2_6 -#define uscript_getName uscript_getName_2_6 -#define uscript_getScript uscript_getScript_2_6 -#define uscript_getShortName uscript_getShortName_2_6 -#define uscript_nextRun uscript_nextRun_2_6 -#define uscript_openRun uscript_openRun_2_6 -#define uscript_resetRun uscript_resetRun_2_6 -#define uscript_setRunText uscript_setRunText_2_6 -#define usearch_close usearch_close_2_6 -#define usearch_first usearch_first_2_6 -#define usearch_following usearch_following_2_6 -#define usearch_getAttribute usearch_getAttribute_2_6 -#define usearch_getBreakIterator usearch_getBreakIterator_2_6 -#define usearch_getCollator usearch_getCollator_2_6 -#define usearch_getMatchedLength usearch_getMatchedLength_2_6 -#define usearch_getMatchedStart usearch_getMatchedStart_2_6 -#define usearch_getMatchedText usearch_getMatchedText_2_6 -#define usearch_getOffset usearch_getOffset_2_6 -#define usearch_getPattern usearch_getPattern_2_6 -#define usearch_getText usearch_getText_2_6 -#define usearch_handleNextCanonical usearch_handleNextCanonical_2_6 -#define usearch_handleNextExact usearch_handleNextExact_2_6 -#define usearch_handlePreviousCanonical usearch_handlePreviousCanonical_2_6 -#define usearch_handlePreviousExact usearch_handlePreviousExact_2_6 -#define usearch_last usearch_last_2_6 -#define usearch_next usearch_next_2_6 -#define usearch_open usearch_open_2_6 -#define usearch_openFromCollator usearch_openFromCollator_2_6 -#define usearch_preceding usearch_preceding_2_6 -#define usearch_previous usearch_previous_2_6 -#define usearch_reset usearch_reset_2_6 -#define usearch_setAttribute usearch_setAttribute_2_6 -#define usearch_setBreakIterator usearch_setBreakIterator_2_6 -#define usearch_setCollator usearch_setCollator_2_6 -#define usearch_setOffset usearch_setOffset_2_6 -#define usearch_setPattern usearch_setPattern_2_6 -#define usearch_setText usearch_setText_2_6 -#define uset_add uset_add_2_6 -#define uset_addAll uset_addAll_2_6 -#define uset_addRange uset_addRange_2_6 -#define uset_addString uset_addString_2_6 -#define uset_cleanup uset_cleanup_2_6 -#define uset_clear uset_clear_2_6 -#define uset_close uset_close_2_6 -#define uset_complement uset_complement_2_6 -#define uset_contains uset_contains_2_6 -#define uset_containsRange uset_containsRange_2_6 -#define uset_containsString uset_containsString_2_6 -#define uset_getItem uset_getItem_2_6 -#define uset_getItemCount uset_getItemCount_2_6 -#define uset_getSerializedRange uset_getSerializedRange_2_6 -#define uset_getSerializedRangeCount uset_getSerializedRangeCount_2_6 -#define uset_getSerializedSet uset_getSerializedSet_2_6 -#define uset_isEmpty uset_isEmpty_2_6 -#define uset_open uset_open_2_6 -#define uset_openPattern uset_openPattern_2_6 -#define uset_openPatternOptions uset_openPatternOptions_2_6 -#define uset_remove uset_remove_2_6 -#define uset_removeRange uset_removeRange_2_6 -#define uset_removeString uset_removeString_2_6 -#define uset_serialize uset_serialize_2_6 -#define uset_serializedContains uset_serializedContains_2_6 -#define uset_setSerializedToOne uset_setSerializedToOne_2_6 -#define uset_size uset_size_2_6 -#define uset_toPattern uset_toPattern_2_6 -#define ustrprep_cleanup ustrprep_cleanup_2_6 -#define utf8_appendCharSafeBody utf8_appendCharSafeBody_2_6 -#define utf8_back1SafeBody utf8_back1SafeBody_2_6 -#define utf8_countTrailBytes utf8_countTrailBytes_2_6 -#define utf8_nextCharSafeBody utf8_nextCharSafeBody_2_6 -#define utf8_prevCharSafeBody utf8_prevCharSafeBody_2_6 -#define utrans_clone utrans_clone_2_6 -#define utrans_close utrans_close_2_6 -#define utrans_countAvailableIDs utrans_countAvailableIDs_2_6 -#define utrans_getAvailableID utrans_getAvailableID_2_6 -#define utrans_getID utrans_getID_2_6 -#define utrans_open utrans_open_2_6 -#define utrans_openInverse utrans_openInverse_2_6 -#define utrans_register utrans_register_2_6 -#define utrans_setFilter utrans_setFilter_2_6 -#define utrans_trans utrans_trans_2_6 -#define utrans_transIncremental utrans_transIncremental_2_6 -#define utrans_transIncrementalUChars utrans_transIncrementalUChars_2_6 -#define utrans_transUChars utrans_transUChars_2_6 -#define utrans_unregister utrans_unregister_2_6 -#define utrie_clone utrie_clone_2_6 -#define utrie_close utrie_close_2_6 -#define utrie_enum utrie_enum_2_6 -#define utrie_get32 utrie_get32_2_6 -#define utrie_getData utrie_getData_2_6 -#define utrie_open utrie_open_2_6 -#define utrie_serialize utrie_serialize_2_6 -#define utrie_set32 utrie_set32_2_6 -#define utrie_setRange32 utrie_setRange32_2_6 -#define utrie_unserialize utrie_unserialize_2_6 +#define T_CString_int64ToString T_CString_int64ToString_3_2 +#define T_CString_integerToString T_CString_integerToString_3_2 +#define T_CString_stricmp T_CString_stricmp_3_2 +#define T_CString_stringToInteger T_CString_stringToInteger_3_2 +#define T_CString_strnicmp T_CString_strnicmp_3_2 +#define T_CString_toLowerCase T_CString_toLowerCase_3_2 +#define T_CString_toUpperCase T_CString_toUpperCase_3_2 +#define T_FileStream_close T_FileStream_close_3_2 +#define T_FileStream_eof T_FileStream_eof_3_2 +#define T_FileStream_error T_FileStream_error_3_2 +#define T_FileStream_file_exists T_FileStream_file_exists_3_2 +#define T_FileStream_getc T_FileStream_getc_3_2 +#define T_FileStream_open T_FileStream_open_3_2 +#define T_FileStream_peek T_FileStream_peek_3_2 +#define T_FileStream_putc T_FileStream_putc_3_2 +#define T_FileStream_read T_FileStream_read_3_2 +#define T_FileStream_readLine T_FileStream_readLine_3_2 +#define T_FileStream_remove T_FileStream_remove_3_2 +#define T_FileStream_rewind T_FileStream_rewind_3_2 +#define T_FileStream_size T_FileStream_size_3_2 +#define T_FileStream_stderr T_FileStream_stderr_3_2 +#define T_FileStream_stdin T_FileStream_stdin_3_2 +#define T_FileStream_stdout T_FileStream_stdout_3_2 +#define T_FileStream_ungetc T_FileStream_ungetc_3_2 +#define T_FileStream_write T_FileStream_write_3_2 +#define T_FileStream_writeLine T_FileStream_writeLine_3_2 +#define UCNV_FROM_U_CALLBACK_ESCAPE UCNV_FROM_U_CALLBACK_ESCAPE_3_2 +#define UCNV_FROM_U_CALLBACK_SKIP UCNV_FROM_U_CALLBACK_SKIP_3_2 +#define UCNV_FROM_U_CALLBACK_STOP UCNV_FROM_U_CALLBACK_STOP_3_2 +#define UCNV_FROM_U_CALLBACK_SUBSTITUTE UCNV_FROM_U_CALLBACK_SUBSTITUTE_3_2 +#define UCNV_TO_U_CALLBACK_ESCAPE UCNV_TO_U_CALLBACK_ESCAPE_3_2 +#define UCNV_TO_U_CALLBACK_SKIP UCNV_TO_U_CALLBACK_SKIP_3_2 +#define UCNV_TO_U_CALLBACK_STOP UCNV_TO_U_CALLBACK_STOP_3_2 +#define UCNV_TO_U_CALLBACK_SUBSTITUTE UCNV_TO_U_CALLBACK_SUBSTITUTE_3_2 +#define UDataMemory_createNewInstance UDataMemory_createNewInstance_3_2 +#define UDataMemory_init UDataMemory_init_3_2 +#define UDataMemory_isLoaded UDataMemory_isLoaded_3_2 +#define UDataMemory_normalizeDataPointer UDataMemory_normalizeDataPointer_3_2 +#define UDataMemory_setData UDataMemory_setData_3_2 +#define UDatamemory_assign UDatamemory_assign_3_2 +#define _ASCIIData _ASCIIData_3_2 +#define _Bocu1Data _Bocu1Data_3_2 +#define _CESU8Data _CESU8Data_3_2 +#define _HZData _HZData_3_2 +#define _IMAPData _IMAPData_3_2 +#define _ISCIIData _ISCIIData_3_2 +#define _ISO2022Data _ISO2022Data_3_2 +#define _LMBCSData1 _LMBCSData1_3_2 +#define _LMBCSData11 _LMBCSData11_3_2 +#define _LMBCSData16 _LMBCSData16_3_2 +#define _LMBCSData17 _LMBCSData17_3_2 +#define _LMBCSData18 _LMBCSData18_3_2 +#define _LMBCSData19 _LMBCSData19_3_2 +#define _LMBCSData2 _LMBCSData2_3_2 +#define _LMBCSData3 _LMBCSData3_3_2 +#define _LMBCSData4 _LMBCSData4_3_2 +#define _LMBCSData5 _LMBCSData5_3_2 +#define _LMBCSData6 _LMBCSData6_3_2 +#define _LMBCSData8 _LMBCSData8_3_2 +#define _Latin1Data _Latin1Data_3_2 +#define _MBCSData _MBCSData_3_2 +#define _SCSUData _SCSUData_3_2 +#define _UTF16BEData _UTF16BEData_3_2 +#define _UTF16Data _UTF16Data_3_2 +#define _UTF16LEData _UTF16LEData_3_2 +#define _UTF32BEData _UTF32BEData_3_2 +#define _UTF32Data _UTF32Data_3_2 +#define _UTF32LEData _UTF32LEData_3_2 +#define _UTF7Data _UTF7Data_3_2 +#define _UTF8Data _UTF8Data_3_2 +#define cmemory_cleanup cmemory_cleanup_3_2 +#define cmemory_inUse cmemory_inUse_3_2 +#define locale_getKeywords locale_getKeywords_3_2 +#define locale_get_default locale_get_default_3_2 +#define locale_set_default locale_set_default_3_2 +#define res_countArrayItems res_countArrayItems_3_2 +#define res_findResource res_findResource_3_2 +#define res_getAlias res_getAlias_3_2 +#define res_getArrayItem res_getArrayItem_3_2 +#define res_getBinary res_getBinary_3_2 +#define res_getIntVector res_getIntVector_3_2 +#define res_getResource res_getResource_3_2 +#define res_getString res_getString_3_2 +#define res_getTableItemByIndex res_getTableItemByIndex_3_2 +#define res_getTableItemByKey res_getTableItemByKey_3_2 +#define res_load res_load_3_2 +#define res_unload res_unload_3_2 +#define transliterator_cleanup transliterator_cleanup_3_2 +#define u_UCharsToChars u_UCharsToChars_3_2 +#define u_austrcpy u_austrcpy_3_2 +#define u_austrncpy u_austrncpy_3_2 +#define u_catclose u_catclose_3_2 +#define u_catgets u_catgets_3_2 +#define u_catopen u_catopen_3_2 +#define u_charAge u_charAge_3_2 +#define u_charDigitValue u_charDigitValue_3_2 +#define u_charDirection u_charDirection_3_2 +#define u_charFromName u_charFromName_3_2 +#define u_charMirror u_charMirror_3_2 +#define u_charName u_charName_3_2 +#define u_charType u_charType_3_2 +#define u_charsToUChars u_charsToUChars_3_2 +#define u_cleanup u_cleanup_3_2 +#define u_countChar32 u_countChar32_3_2 +#define u_digit u_digit_3_2 +#define u_enumCharNames u_enumCharNames_3_2 +#define u_enumCharTypes u_enumCharTypes_3_2 +#define u_errorName u_errorName_3_2 +#define u_fclose u_fclose_3_2 +#define u_feof u_feof_3_2 +#define u_fflush u_fflush_3_2 +#define u_fgetConverter u_fgetConverter_3_2 +#define u_fgetc u_fgetc_3_2 +#define u_fgetcodepage u_fgetcodepage_3_2 +#define u_fgetcx u_fgetcx_3_2 +#define u_fgetfile u_fgetfile_3_2 +#define u_fgetlocale u_fgetlocale_3_2 +#define u_fgets u_fgets_3_2 +#define u_file_read u_file_read_3_2 +#define u_file_write u_file_write_3_2 +#define u_file_write_flush u_file_write_flush_3_2 +#define u_finit u_finit_3_2 +#define u_foldCase u_foldCase_3_2 +#define u_fopen u_fopen_3_2 +#define u_forDigit u_forDigit_3_2 +#define u_formatMessage u_formatMessage_3_2 +#define u_formatMessageWithError u_formatMessageWithError_3_2 +#define u_fprintf u_fprintf_3_2 +#define u_fprintf_u u_fprintf_u_3_2 +#define u_fputc u_fputc_3_2 +#define u_fputs u_fputs_3_2 +#define u_frewind u_frewind_3_2 +#define u_fscanf u_fscanf_3_2 +#define u_fscanf_u u_fscanf_u_3_2 +#define u_fsetcodepage u_fsetcodepage_3_2 +#define u_fsetlocale u_fsetlocale_3_2 +#define u_fsettransliterator u_fsettransliterator_3_2 +#define u_fstropen u_fstropen_3_2 +#define u_fungetc u_fungetc_3_2 +#define u_getCombiningClass u_getCombiningClass_3_2 +#define u_getDataDirectory u_getDataDirectory_3_2 +#define u_getDefaultConverter u_getDefaultConverter_3_2 +#define u_getFC_NFKC_Closure u_getFC_NFKC_Closure_3_2 +#define u_getISOComment u_getISOComment_3_2 +#define u_getIntPropertyMaxValue u_getIntPropertyMaxValue_3_2 +#define u_getIntPropertyMinValue u_getIntPropertyMinValue_3_2 +#define u_getIntPropertyValue u_getIntPropertyValue_3_2 +#define u_getNumericValue u_getNumericValue_3_2 +#define u_getPropertyEnum u_getPropertyEnum_3_2 +#define u_getPropertyName u_getPropertyName_3_2 +#define u_getPropertyValueEnum u_getPropertyValueEnum_3_2 +#define u_getPropertyValueName u_getPropertyValueName_3_2 +#define u_getUnicodeProperties u_getUnicodeProperties_3_2 +#define u_getUnicodeVersion u_getUnicodeVersion_3_2 +#define u_getVersion u_getVersion_3_2 +#define u_growBufferFromStatic u_growBufferFromStatic_3_2 +#define u_hasBinaryProperty u_hasBinaryProperty_3_2 +#define u_init u_init_3_2 +#define u_isIDIgnorable u_isIDIgnorable_3_2 +#define u_isIDPart u_isIDPart_3_2 +#define u_isIDStart u_isIDStart_3_2 +#define u_isISOControl u_isISOControl_3_2 +#define u_isJavaIDPart u_isJavaIDPart_3_2 +#define u_isJavaIDStart u_isJavaIDStart_3_2 +#define u_isJavaSpaceChar u_isJavaSpaceChar_3_2 +#define u_isMirrored u_isMirrored_3_2 +#define u_isUAlphabetic u_isUAlphabetic_3_2 +#define u_isULowercase u_isULowercase_3_2 +#define u_isUUppercase u_isUUppercase_3_2 +#define u_isUWhiteSpace u_isUWhiteSpace_3_2 +#define u_isWhitespace u_isWhitespace_3_2 +#define u_isalnum u_isalnum_3_2 +#define u_isalpha u_isalpha_3_2 +#define u_isbase u_isbase_3_2 +#define u_isblank u_isblank_3_2 +#define u_iscntrl u_iscntrl_3_2 +#define u_isdefined u_isdefined_3_2 +#define u_isdigit u_isdigit_3_2 +#define u_isgraph u_isgraph_3_2 +#define u_islower u_islower_3_2 +#define u_isprint u_isprint_3_2 +#define u_ispunct u_ispunct_3_2 +#define u_isspace u_isspace_3_2 +#define u_istitle u_istitle_3_2 +#define u_isupper u_isupper_3_2 +#define u_isxdigit u_isxdigit_3_2 +#define u_lengthOfIdenticalLevelRun u_lengthOfIdenticalLevelRun_3_2 +#define u_locbund_close u_locbund_close_3_2 +#define u_locbund_getNumberFormat u_locbund_getNumberFormat_3_2 +#define u_locbund_init u_locbund_init_3_2 +#define u_memcasecmp u_memcasecmp_3_2 +#define u_memchr u_memchr_3_2 +#define u_memchr32 u_memchr32_3_2 +#define u_memcmp u_memcmp_3_2 +#define u_memcmpCodePointOrder u_memcmpCodePointOrder_3_2 +#define u_memcpy u_memcpy_3_2 +#define u_memmove u_memmove_3_2 +#define u_memrchr u_memrchr_3_2 +#define u_memrchr32 u_memrchr32_3_2 +#define u_memset u_memset_3_2 +#define u_parseMessage u_parseMessage_3_2 +#define u_parseMessageWithError u_parseMessageWithError_3_2 +#define u_printf_parse u_printf_parse_3_2 +#define u_releaseDefaultConverter u_releaseDefaultConverter_3_2 +#define u_scanf_parse u_scanf_parse_3_2 +#define u_setAtomicIncDecFunctions u_setAtomicIncDecFunctions_3_2 +#define u_setDataDirectory u_setDataDirectory_3_2 +#define u_setMemoryFunctions u_setMemoryFunctions_3_2 +#define u_setMutexFunctions u_setMutexFunctions_3_2 +#define u_shapeArabic u_shapeArabic_3_2 +#define u_snprintf u_snprintf_3_2 +#define u_snprintf_u u_snprintf_u_3_2 +#define u_sprintf u_sprintf_3_2 +#define u_sprintf_u u_sprintf_u_3_2 +#define u_sscanf u_sscanf_3_2 +#define u_sscanf_u u_sscanf_u_3_2 +#define u_strCaseCompare u_strCaseCompare_3_2 +#define u_strCompare u_strCompare_3_2 +#define u_strCompareIter u_strCompareIter_3_2 +#define u_strFindFirst u_strFindFirst_3_2 +#define u_strFindLast u_strFindLast_3_2 +#define u_strFoldCase u_strFoldCase_3_2 +#define u_strFromPunycode u_strFromPunycode_3_2 +#define u_strFromUTF32 u_strFromUTF32_3_2 +#define u_strFromUTF8 u_strFromUTF8_3_2 +#define u_strFromWCS u_strFromWCS_3_2 +#define u_strHasMoreChar32Than u_strHasMoreChar32Than_3_2 +#define u_strToLower u_strToLower_3_2 +#define u_strToPunycode u_strToPunycode_3_2 +#define u_strToTitle u_strToTitle_3_2 +#define u_strToUTF32 u_strToUTF32_3_2 +#define u_strToUTF8 u_strToUTF8_3_2 +#define u_strToUpper u_strToUpper_3_2 +#define u_strToWCS u_strToWCS_3_2 +#define u_strcasecmp u_strcasecmp_3_2 +#define u_strcat u_strcat_3_2 +#define u_strchr u_strchr_3_2 +#define u_strchr32 u_strchr32_3_2 +#define u_strcmp u_strcmp_3_2 +#define u_strcmpCodePointOrder u_strcmpCodePointOrder_3_2 +#define u_strcmpFold u_strcmpFold_3_2 +#define u_strcpy u_strcpy_3_2 +#define u_strcspn u_strcspn_3_2 +#define u_strlen u_strlen_3_2 +#define u_strncasecmp u_strncasecmp_3_2 +#define u_strncat u_strncat_3_2 +#define u_strncmp u_strncmp_3_2 +#define u_strncmpCodePointOrder u_strncmpCodePointOrder_3_2 +#define u_strncpy u_strncpy_3_2 +#define u_strpbrk u_strpbrk_3_2 +#define u_strrchr u_strrchr_3_2 +#define u_strrchr32 u_strrchr32_3_2 +#define u_strrstr u_strrstr_3_2 +#define u_strspn u_strspn_3_2 +#define u_strstr u_strstr_3_2 +#define u_strtok_r u_strtok_r_3_2 +#define u_terminateChars u_terminateChars_3_2 +#define u_terminateUChar32s u_terminateUChar32s_3_2 +#define u_terminateUChars u_terminateUChars_3_2 +#define u_terminateWChars u_terminateWChars_3_2 +#define u_tolower u_tolower_3_2 +#define u_totitle u_totitle_3_2 +#define u_toupper u_toupper_3_2 +#define u_uastrcpy u_uastrcpy_3_2 +#define u_uastrncpy u_uastrncpy_3_2 +#define u_unescape u_unescape_3_2 +#define u_unescapeAt u_unescapeAt_3_2 +#define u_versionFromString u_versionFromString_3_2 +#define u_versionToString u_versionToString_3_2 +#define u_vformatMessage u_vformatMessage_3_2 +#define u_vformatMessageWithError u_vformatMessageWithError_3_2 +#define u_vfprintf u_vfprintf_3_2 +#define u_vfprintf_u u_vfprintf_u_3_2 +#define u_vfscanf u_vfscanf_3_2 +#define u_vfscanf_u u_vfscanf_u_3_2 +#define u_vparseMessage u_vparseMessage_3_2 +#define u_vparseMessageWithError u_vparseMessageWithError_3_2 +#define u_vsnprintf u_vsnprintf_3_2 +#define u_vsnprintf_u u_vsnprintf_u_3_2 +#define u_vsprintf u_vsprintf_3_2 +#define u_vsprintf_u u_vsprintf_u_3_2 +#define u_vsscanf u_vsscanf_3_2 +#define u_vsscanf_u u_vsscanf_u_3_2 +#define u_writeDiff u_writeDiff_3_2 +#define u_writeIdenticalLevelRun u_writeIdenticalLevelRun_3_2 +#define u_writeIdenticalLevelRunTwoChars u_writeIdenticalLevelRunTwoChars_3_2 +#define ubidi_close ubidi_close_3_2 +#define ubidi_countRuns ubidi_countRuns_3_2 +#define ubidi_getDirection ubidi_getDirection_3_2 +#define ubidi_getLength ubidi_getLength_3_2 +#define ubidi_getLevelAt ubidi_getLevelAt_3_2 +#define ubidi_getLevels ubidi_getLevels_3_2 +#define ubidi_getLogicalIndex ubidi_getLogicalIndex_3_2 +#define ubidi_getLogicalMap ubidi_getLogicalMap_3_2 +#define ubidi_getLogicalRun ubidi_getLogicalRun_3_2 +#define ubidi_getMemory ubidi_getMemory_3_2 +#define ubidi_getParaLevel ubidi_getParaLevel_3_2 +#define ubidi_getRuns ubidi_getRuns_3_2 +#define ubidi_getText ubidi_getText_3_2 +#define ubidi_getVisualIndex ubidi_getVisualIndex_3_2 +#define ubidi_getVisualMap ubidi_getVisualMap_3_2 +#define ubidi_getVisualRun ubidi_getVisualRun_3_2 +#define ubidi_invertMap ubidi_invertMap_3_2 +#define ubidi_isInverse ubidi_isInverse_3_2 +#define ubidi_open ubidi_open_3_2 +#define ubidi_openSized ubidi_openSized_3_2 +#define ubidi_reorderLogical ubidi_reorderLogical_3_2 +#define ubidi_reorderVisual ubidi_reorderVisual_3_2 +#define ubidi_setInverse ubidi_setInverse_3_2 +#define ubidi_setLine ubidi_setLine_3_2 +#define ubidi_setPara ubidi_setPara_3_2 +#define ubidi_writeReordered ubidi_writeReordered_3_2 +#define ubidi_writeReverse ubidi_writeReverse_3_2 +#define ublock_getCode ublock_getCode_3_2 +#define ubrk_close ubrk_close_3_2 +#define ubrk_countAvailable ubrk_countAvailable_3_2 +#define ubrk_current ubrk_current_3_2 +#define ubrk_first ubrk_first_3_2 +#define ubrk_following ubrk_following_3_2 +#define ubrk_getAvailable ubrk_getAvailable_3_2 +#define ubrk_getLocaleByType ubrk_getLocaleByType_3_2 +#define ubrk_getRuleStatus ubrk_getRuleStatus_3_2 +#define ubrk_getRuleStatusVec ubrk_getRuleStatusVec_3_2 +#define ubrk_isBoundary ubrk_isBoundary_3_2 +#define ubrk_last ubrk_last_3_2 +#define ubrk_next ubrk_next_3_2 +#define ubrk_open ubrk_open_3_2 +#define ubrk_openRules ubrk_openRules_3_2 +#define ubrk_preceding ubrk_preceding_3_2 +#define ubrk_previous ubrk_previous_3_2 +#define ubrk_safeClone ubrk_safeClone_3_2 +#define ubrk_setText ubrk_setText_3_2 +#define ubrk_swap ubrk_swap_3_2 +#define ucal_add ucal_add_3_2 +#define ucal_clear ucal_clear_3_2 +#define ucal_clearField ucal_clearField_3_2 +#define ucal_close ucal_close_3_2 +#define ucal_countAvailable ucal_countAvailable_3_2 +#define ucal_equivalentTo ucal_equivalentTo_3_2 +#define ucal_get ucal_get_3_2 +#define ucal_getAttribute ucal_getAttribute_3_2 +#define ucal_getAvailable ucal_getAvailable_3_2 +#define ucal_getDSTSavings ucal_getDSTSavings_3_2 +#define ucal_getDefaultTimeZone ucal_getDefaultTimeZone_3_2 +#define ucal_getLimit ucal_getLimit_3_2 +#define ucal_getLocaleByType ucal_getLocaleByType_3_2 +#define ucal_getMillis ucal_getMillis_3_2 +#define ucal_getNow ucal_getNow_3_2 +#define ucal_getTimeZoneDisplayName ucal_getTimeZoneDisplayName_3_2 +#define ucal_inDaylightTime ucal_inDaylightTime_3_2 +#define ucal_isSet ucal_isSet_3_2 +#define ucal_open ucal_open_3_2 +#define ucal_openCountryTimeZones ucal_openCountryTimeZones_3_2 +#define ucal_openTimeZones ucal_openTimeZones_3_2 +#define ucal_roll ucal_roll_3_2 +#define ucal_set ucal_set_3_2 +#define ucal_setAttribute ucal_setAttribute_3_2 +#define ucal_setDate ucal_setDate_3_2 +#define ucal_setDateTime ucal_setDateTime_3_2 +#define ucal_setDefaultTimeZone ucal_setDefaultTimeZone_3_2 +#define ucal_setMillis ucal_setMillis_3_2 +#define ucal_setTimeZone ucal_setTimeZone_3_2 +#define ucase_addPropertyStarts ucase_addPropertyStarts_3_2 +#define ucase_close ucase_close_3_2 +#define ucase_fold ucase_fold_3_2 +#define ucase_getSingleton ucase_getSingleton_3_2 +#define ucase_getType ucase_getType_3_2 +#define ucase_getTypeOrIgnorable ucase_getTypeOrIgnorable_3_2 +#define ucase_isCaseSensitive ucase_isCaseSensitive_3_2 +#define ucase_isSoftDotted ucase_isSoftDotted_3_2 +#define ucase_open ucase_open_3_2 +#define ucase_openBinary ucase_openBinary_3_2 +#define ucase_swap ucase_swap_3_2 +#define ucase_toFullFolding ucase_toFullFolding_3_2 +#define ucase_toFullLower ucase_toFullLower_3_2 +#define ucase_toFullTitle ucase_toFullTitle_3_2 +#define ucase_toFullUpper ucase_toFullUpper_3_2 +#define ucase_tolower ucase_tolower_3_2 +#define ucase_totitle ucase_totitle_3_2 +#define ucase_toupper ucase_toupper_3_2 +#define uchar_addPropertyStarts uchar_addPropertyStarts_3_2 +#define uchar_getHST uchar_getHST_3_2 +#define uchar_swapNames uchar_swapNames_3_2 +#define ucln_common_lib_cleanup ucln_common_lib_cleanup_3_2 +#define ucln_common_registerCleanup ucln_common_registerCleanup_3_2 +#define ucln_i18n_registerCleanup ucln_i18n_registerCleanup_3_2 +#define ucln_registerCleanup ucln_registerCleanup_3_2 +#define ucmp8_close ucmp8_close_3_2 +#define ucmp8_compact ucmp8_compact_3_2 +#define ucmp8_expand ucmp8_expand_3_2 +#define ucmp8_flattenMem ucmp8_flattenMem_3_2 +#define ucmp8_getArray ucmp8_getArray_3_2 +#define ucmp8_getCount ucmp8_getCount_3_2 +#define ucmp8_getIndex ucmp8_getIndex_3_2 +#define ucmp8_getkBlockCount ucmp8_getkBlockCount_3_2 +#define ucmp8_getkUnicodeCount ucmp8_getkUnicodeCount_3_2 +#define ucmp8_init ucmp8_init_3_2 +#define ucmp8_initAdopt ucmp8_initAdopt_3_2 +#define ucmp8_initAlias ucmp8_initAlias_3_2 +#define ucmp8_initBogus ucmp8_initBogus_3_2 +#define ucmp8_initFromData ucmp8_initFromData_3_2 +#define ucmp8_isBogus ucmp8_isBogus_3_2 +#define ucmp8_open ucmp8_open_3_2 +#define ucmp8_openAdopt ucmp8_openAdopt_3_2 +#define ucmp8_openAlias ucmp8_openAlias_3_2 +#define ucmp8_set ucmp8_set_3_2 +#define ucmp8_setRange ucmp8_setRange_3_2 +#define ucnv_MBCSFromUChar32 ucnv_MBCSFromUChar32_3_2 +#define ucnv_MBCSFromUnicodeWithOffsets ucnv_MBCSFromUnicodeWithOffsets_3_2 +#define ucnv_MBCSGetType ucnv_MBCSGetType_3_2 +#define ucnv_MBCSGetUnicodeSetForBytes ucnv_MBCSGetUnicodeSetForBytes_3_2 +#define ucnv_MBCSGetUnicodeSetForUnicode ucnv_MBCSGetUnicodeSetForUnicode_3_2 +#define ucnv_MBCSIsLeadByte ucnv_MBCSIsLeadByte_3_2 +#define ucnv_MBCSSimpleGetNextUChar ucnv_MBCSSimpleGetNextUChar_3_2 +#define ucnv_MBCSToUnicodeWithOffsets ucnv_MBCSToUnicodeWithOffsets_3_2 +#define ucnv_cbFromUWriteBytes ucnv_cbFromUWriteBytes_3_2 +#define ucnv_cbFromUWriteSub ucnv_cbFromUWriteSub_3_2 +#define ucnv_cbFromUWriteUChars ucnv_cbFromUWriteUChars_3_2 +#define ucnv_cbToUWriteSub ucnv_cbToUWriteSub_3_2 +#define ucnv_cbToUWriteUChars ucnv_cbToUWriteUChars_3_2 +#define ucnv_close ucnv_close_3_2 +#define ucnv_compareNames ucnv_compareNames_3_2 +#define ucnv_convert ucnv_convert_3_2 +#define ucnv_convertEx ucnv_convertEx_3_2 +#define ucnv_copyPlatformString ucnv_copyPlatformString_3_2 +#define ucnv_countAliases ucnv_countAliases_3_2 +#define ucnv_countAvailable ucnv_countAvailable_3_2 +#define ucnv_countStandards ucnv_countStandards_3_2 +#define ucnv_createAlgorithmicConverter ucnv_createAlgorithmicConverter_3_2 +#define ucnv_createConverter ucnv_createConverter_3_2 +#define ucnv_createConverterFromPackage ucnv_createConverterFromPackage_3_2 +#define ucnv_createConverterFromSharedData ucnv_createConverterFromSharedData_3_2 +#define ucnv_detectUnicodeSignature ucnv_detectUnicodeSignature_3_2 +#define ucnv_extContinueMatchFromU ucnv_extContinueMatchFromU_3_2 +#define ucnv_extContinueMatchToU ucnv_extContinueMatchToU_3_2 +#define ucnv_extGetUnicodeSet ucnv_extGetUnicodeSet_3_2 +#define ucnv_extInitialMatchFromU ucnv_extInitialMatchFromU_3_2 +#define ucnv_extInitialMatchToU ucnv_extInitialMatchToU_3_2 +#define ucnv_extSimpleMatchFromU ucnv_extSimpleMatchFromU_3_2 +#define ucnv_extSimpleMatchToU ucnv_extSimpleMatchToU_3_2 +#define ucnv_fixFileSeparator ucnv_fixFileSeparator_3_2 +#define ucnv_flushCache ucnv_flushCache_3_2 +#define ucnv_fromAlgorithmic ucnv_fromAlgorithmic_3_2 +#define ucnv_fromUChars ucnv_fromUChars_3_2 +#define ucnv_fromUWriteBytes ucnv_fromUWriteBytes_3_2 +#define ucnv_fromUnicode ucnv_fromUnicode_3_2 +#define ucnv_fromUnicode_UTF8 ucnv_fromUnicode_UTF8_3_2 +#define ucnv_fromUnicode_UTF8_OFFSETS_LOGIC ucnv_fromUnicode_UTF8_OFFSETS_LOGIC_3_2 +#define ucnv_getAlias ucnv_getAlias_3_2 +#define ucnv_getAliases ucnv_getAliases_3_2 +#define ucnv_getAvailableName ucnv_getAvailableName_3_2 +#define ucnv_getCCSID ucnv_getCCSID_3_2 +#define ucnv_getCanonicalName ucnv_getCanonicalName_3_2 +#define ucnv_getCompleteUnicodeSet ucnv_getCompleteUnicodeSet_3_2 +#define ucnv_getDefaultName ucnv_getDefaultName_3_2 +#define ucnv_getDisplayName ucnv_getDisplayName_3_2 +#define ucnv_getFromUCallBack ucnv_getFromUCallBack_3_2 +#define ucnv_getInvalidChars ucnv_getInvalidChars_3_2 +#define ucnv_getInvalidUChars ucnv_getInvalidUChars_3_2 +#define ucnv_getMaxCharSize ucnv_getMaxCharSize_3_2 +#define ucnv_getMinCharSize ucnv_getMinCharSize_3_2 +#define ucnv_getName ucnv_getName_3_2 +#define ucnv_getNextUChar ucnv_getNextUChar_3_2 +#define ucnv_getNonSurrogateUnicodeSet ucnv_getNonSurrogateUnicodeSet_3_2 +#define ucnv_getPlatform ucnv_getPlatform_3_2 +#define ucnv_getStandard ucnv_getStandard_3_2 +#define ucnv_getStandardName ucnv_getStandardName_3_2 +#define ucnv_getStarters ucnv_getStarters_3_2 +#define ucnv_getSubstChars ucnv_getSubstChars_3_2 +#define ucnv_getToUCallBack ucnv_getToUCallBack_3_2 +#define ucnv_getType ucnv_getType_3_2 +#define ucnv_getUnicodeSet ucnv_getUnicodeSet_3_2 +#define ucnv_incrementRefCount ucnv_incrementRefCount_3_2 +#define ucnv_io_countAliases ucnv_io_countAliases_3_2 +#define ucnv_io_countAvailableAliases ucnv_io_countAvailableAliases_3_2 +#define ucnv_io_countAvailableConverters ucnv_io_countAvailableConverters_3_2 +#define ucnv_io_countStandards ucnv_io_countStandards_3_2 +#define ucnv_io_flushAvailableConverterCache ucnv_io_flushAvailableConverterCache_3_2 +#define ucnv_io_getAlias ucnv_io_getAlias_3_2 +#define ucnv_io_getAliases ucnv_io_getAliases_3_2 +#define ucnv_io_getAvailableConverter ucnv_io_getAvailableConverter_3_2 +#define ucnv_io_getConverterName ucnv_io_getConverterName_3_2 +#define ucnv_io_getDefaultConverterName ucnv_io_getDefaultConverterName_3_2 +#define ucnv_io_setDefaultConverterName ucnv_io_setDefaultConverterName_3_2 +#define ucnv_io_stripASCIIForCompare ucnv_io_stripASCIIForCompare_3_2 +#define ucnv_io_stripEBCDICForCompare ucnv_io_stripEBCDICForCompare_3_2 +#define ucnv_isAmbiguous ucnv_isAmbiguous_3_2 +#define ucnv_load ucnv_load_3_2 +#define ucnv_loadSharedData ucnv_loadSharedData_3_2 +#define ucnv_open ucnv_open_3_2 +#define ucnv_openAllNames ucnv_openAllNames_3_2 +#define ucnv_openCCSID ucnv_openCCSID_3_2 +#define ucnv_openPackage ucnv_openPackage_3_2 +#define ucnv_openStandardNames ucnv_openStandardNames_3_2 +#define ucnv_openU ucnv_openU_3_2 +#define ucnv_reset ucnv_reset_3_2 +#define ucnv_resetFromUnicode ucnv_resetFromUnicode_3_2 +#define ucnv_resetToUnicode ucnv_resetToUnicode_3_2 +#define ucnv_safeClone ucnv_safeClone_3_2 +#define ucnv_setDefaultName ucnv_setDefaultName_3_2 +#define ucnv_setFallback ucnv_setFallback_3_2 +#define ucnv_setFromUCallBack ucnv_setFromUCallBack_3_2 +#define ucnv_setSubstChars ucnv_setSubstChars_3_2 +#define ucnv_setToUCallBack ucnv_setToUCallBack_3_2 +#define ucnv_swap ucnv_swap_3_2 +#define ucnv_swapAliases ucnv_swapAliases_3_2 +#define ucnv_toAlgorithmic ucnv_toAlgorithmic_3_2 +#define ucnv_toUChars ucnv_toUChars_3_2 +#define ucnv_toUWriteCodePoint ucnv_toUWriteCodePoint_3_2 +#define ucnv_toUWriteUChars ucnv_toUWriteUChars_3_2 +#define ucnv_toUnicode ucnv_toUnicode_3_2 +#define ucnv_unload ucnv_unload_3_2 +#define ucnv_unloadSharedDataIfReady ucnv_unloadSharedDataIfReady_3_2 +#define ucnv_usesFallback ucnv_usesFallback_3_2 +#define ucol_allocWeights ucol_allocWeights_3_2 +#define ucol_assembleTailoringTable ucol_assembleTailoringTable_3_2 +#define ucol_calcSortKey ucol_calcSortKey_3_2 +#define ucol_calcSortKeySimpleTertiary ucol_calcSortKeySimpleTertiary_3_2 +#define ucol_cloneBinary ucol_cloneBinary_3_2 +#define ucol_cloneRuleData ucol_cloneRuleData_3_2 +#define ucol_close ucol_close_3_2 +#define ucol_closeElements ucol_closeElements_3_2 +#define ucol_collatorToIdentifier ucol_collatorToIdentifier_3_2 +#define ucol_countAvailable ucol_countAvailable_3_2 +#define ucol_createElements ucol_createElements_3_2 +#define ucol_doCE ucol_doCE_3_2 +#define ucol_equal ucol_equal_3_2 +#define ucol_equals ucol_equals_3_2 +#define ucol_getAttribute ucol_getAttribute_3_2 +#define ucol_getAttributeOrDefault ucol_getAttributeOrDefault_3_2 +#define ucol_getAvailable ucol_getAvailable_3_2 +#define ucol_getBound ucol_getBound_3_2 +#define ucol_getCEGenerator ucol_getCEGenerator_3_2 +#define ucol_getCEStrengthDifference ucol_getCEStrengthDifference_3_2 +#define ucol_getContractions ucol_getContractions_3_2 +#define ucol_getDisplayName ucol_getDisplayName_3_2 +#define ucol_getFirstCE ucol_getFirstCE_3_2 +#define ucol_getFunctionalEquivalent ucol_getFunctionalEquivalent_3_2 +#define ucol_getKeywordValues ucol_getKeywordValues_3_2 +#define ucol_getKeywords ucol_getKeywords_3_2 +#define ucol_getLocale ucol_getLocale_3_2 +#define ucol_getLocaleByType ucol_getLocaleByType_3_2 +#define ucol_getMaxExpansion ucol_getMaxExpansion_3_2 +#define ucol_getNextCE ucol_getNextCE_3_2 +#define ucol_getNextGenerated ucol_getNextGenerated_3_2 +#define ucol_getOffset ucol_getOffset_3_2 +#define ucol_getPrevCE ucol_getPrevCE_3_2 +#define ucol_getRules ucol_getRules_3_2 +#define ucol_getRulesEx ucol_getRulesEx_3_2 +#define ucol_getShortDefinitionString ucol_getShortDefinitionString_3_2 +#define ucol_getSimpleCEGenerator ucol_getSimpleCEGenerator_3_2 +#define ucol_getSortKey ucol_getSortKey_3_2 +#define ucol_getSortKeySize ucol_getSortKeySize_3_2 +#define ucol_getSortKeyWithAllocation ucol_getSortKeyWithAllocation_3_2 +#define ucol_getStrength ucol_getStrength_3_2 +#define ucol_getTailoredSet ucol_getTailoredSet_3_2 +#define ucol_getUCAVersion ucol_getUCAVersion_3_2 +#define ucol_getUnsafeSet ucol_getUnsafeSet_3_2 +#define ucol_getVariableTop ucol_getVariableTop_3_2 +#define ucol_getVersion ucol_getVersion_3_2 +#define ucol_greater ucol_greater_3_2 +#define ucol_greaterOrEqual ucol_greaterOrEqual_3_2 +#define ucol_identifierToShortString ucol_identifierToShortString_3_2 +#define ucol_initBuffers ucol_initBuffers_3_2 +#define ucol_initCollator ucol_initCollator_3_2 +#define ucol_initInverseUCA ucol_initInverseUCA_3_2 +#define ucol_initUCA ucol_initUCA_3_2 +#define ucol_inv_getGapPositions ucol_inv_getGapPositions_3_2 +#define ucol_inv_getNextCE ucol_inv_getNextCE_3_2 +#define ucol_inv_getPrevCE ucol_inv_getPrevCE_3_2 +#define ucol_isTailored ucol_isTailored_3_2 +#define ucol_keyHashCode ucol_keyHashCode_3_2 +#define ucol_mergeSortkeys ucol_mergeSortkeys_3_2 +#define ucol_next ucol_next_3_2 +#define ucol_nextSortKeyPart ucol_nextSortKeyPart_3_2 +#define ucol_nextWeight ucol_nextWeight_3_2 +#define ucol_normalizeShortDefinitionString ucol_normalizeShortDefinitionString_3_2 +#define ucol_open ucol_open_3_2 +#define ucol_openAvailableLocales ucol_openAvailableLocales_3_2 +#define ucol_openBinary ucol_openBinary_3_2 +#define ucol_openElements ucol_openElements_3_2 +#define ucol_openFromIdentifier ucol_openFromIdentifier_3_2 +#define ucol_openFromShortString ucol_openFromShortString_3_2 +#define ucol_openRules ucol_openRules_3_2 +#define ucol_open_internal ucol_open_internal_3_2 +#define ucol_previous ucol_previous_3_2 +#define ucol_primaryOrder ucol_primaryOrder_3_2 +#define ucol_prv_getSpecialCE ucol_prv_getSpecialCE_3_2 +#define ucol_prv_getSpecialPrevCE ucol_prv_getSpecialPrevCE_3_2 +#define ucol_reset ucol_reset_3_2 +#define ucol_restoreVariableTop ucol_restoreVariableTop_3_2 +#define ucol_safeClone ucol_safeClone_3_2 +#define ucol_secondaryOrder ucol_secondaryOrder_3_2 +#define ucol_setAttribute ucol_setAttribute_3_2 +#define ucol_setOffset ucol_setOffset_3_2 +#define ucol_setOptionsFromHeader ucol_setOptionsFromHeader_3_2 +#define ucol_setReqValidLocales ucol_setReqValidLocales_3_2 +#define ucol_setStrength ucol_setStrength_3_2 +#define ucol_setText ucol_setText_3_2 +#define ucol_setVariableTop ucol_setVariableTop_3_2 +#define ucol_shortStringToIdentifier ucol_shortStringToIdentifier_3_2 +#define ucol_sortKeyToString ucol_sortKeyToString_3_2 +#define ucol_strcoll ucol_strcoll_3_2 +#define ucol_strcollIter ucol_strcollIter_3_2 +#define ucol_swap ucol_swap_3_2 +#define ucol_swapBinary ucol_swapBinary_3_2 +#define ucol_swapInverseUCA ucol_swapInverseUCA_3_2 +#define ucol_tertiaryOrder ucol_tertiaryOrder_3_2 +#define ucol_tok_assembleTokenList ucol_tok_assembleTokenList_3_2 +#define ucol_tok_closeTokenList ucol_tok_closeTokenList_3_2 +#define ucol_tok_getNextArgument ucol_tok_getNextArgument_3_2 +#define ucol_tok_initTokenList ucol_tok_initTokenList_3_2 +#define ucol_tok_parseNextToken ucol_tok_parseNextToken_3_2 +#define ucol_updateInternalState ucol_updateInternalState_3_2 +#define ucurr_forLocale ucurr_forLocale_3_2 +#define ucurr_getDefaultFractionDigits ucurr_getDefaultFractionDigits_3_2 +#define ucurr_getName ucurr_getName_3_2 +#define ucurr_getRoundingIncrement ucurr_getRoundingIncrement_3_2 +#define ucurr_register ucurr_register_3_2 +#define ucurr_unregister ucurr_unregister_3_2 +#define udat_applyPattern udat_applyPattern_3_2 +#define udat_clone udat_clone_3_2 +#define udat_close udat_close_3_2 +#define udat_countAvailable udat_countAvailable_3_2 +#define udat_countSymbols udat_countSymbols_3_2 +#define udat_format udat_format_3_2 +#define udat_get2DigitYearStart udat_get2DigitYearStart_3_2 +#define udat_getAvailable udat_getAvailable_3_2 +#define udat_getCalendar udat_getCalendar_3_2 +#define udat_getLocaleByType udat_getLocaleByType_3_2 +#define udat_getNumberFormat udat_getNumberFormat_3_2 +#define udat_getSymbols udat_getSymbols_3_2 +#define udat_isLenient udat_isLenient_3_2 +#define udat_open udat_open_3_2 +#define udat_parse udat_parse_3_2 +#define udat_parseCalendar udat_parseCalendar_3_2 +#define udat_set2DigitYearStart udat_set2DigitYearStart_3_2 +#define udat_setCalendar udat_setCalendar_3_2 +#define udat_setLenient udat_setLenient_3_2 +#define udat_setNumberFormat udat_setNumberFormat_3_2 +#define udat_setSymbols udat_setSymbols_3_2 +#define udat_toPattern udat_toPattern_3_2 +#define udata_checkCommonData udata_checkCommonData_3_2 +#define udata_close udata_close_3_2 +#define udata_closeSwapper udata_closeSwapper_3_2 +#define udata_getHeaderSize udata_getHeaderSize_3_2 +#define udata_getInfo udata_getInfo_3_2 +#define udata_getInfoSize udata_getInfoSize_3_2 +#define udata_getLength udata_getLength_3_2 +#define udata_getMemory udata_getMemory_3_2 +#define udata_getRawMemory udata_getRawMemory_3_2 +#define udata_open udata_open_3_2 +#define udata_openChoice udata_openChoice_3_2 +#define udata_openSwapper udata_openSwapper_3_2 +#define udata_openSwapperForInputData udata_openSwapperForInputData_3_2 +#define udata_printError udata_printError_3_2 +#define udata_readInt16 udata_readInt16_3_2 +#define udata_readInt32 udata_readInt32_3_2 +#define udata_setAppData udata_setAppData_3_2 +#define udata_setCommonData udata_setCommonData_3_2 +#define udata_swapDataHeader udata_swapDataHeader_3_2 +#define udata_swapInvStringBlock udata_swapInvStringBlock_3_2 +#define uenum_close uenum_close_3_2 +#define uenum_count uenum_count_3_2 +#define uenum_next uenum_next_3_2 +#define uenum_nextDefault uenum_nextDefault_3_2 +#define uenum_openCharStringsEnumeration uenum_openCharStringsEnumeration_3_2 +#define uenum_openStringEnumeration uenum_openStringEnumeration_3_2 +#define uenum_reset uenum_reset_3_2 +#define uenum_unext uenum_unext_3_2 +#define uenum_unextDefault uenum_unextDefault_3_2 +#define ufile_close_translit ufile_close_translit_3_2 +#define ufile_fill_uchar_buffer ufile_fill_uchar_buffer_3_2 +#define ufile_flush_translit ufile_flush_translit_3_2 +#define ufile_getch ufile_getch_3_2 +#define ufile_getch32 ufile_getch32_3_2 +#define ufmt_64tou ufmt_64tou_3_2 +#define ufmt_defaultCPToUnicode ufmt_defaultCPToUnicode_3_2 +#define ufmt_digitvalue ufmt_digitvalue_3_2 +#define ufmt_isdigit ufmt_isdigit_3_2 +#define ufmt_ptou ufmt_ptou_3_2 +#define ufmt_uto64 ufmt_uto64_3_2 +#define ufmt_utop ufmt_utop_3_2 +#define uhash_close uhash_close_3_2 +#define uhash_compareCaselessUnicodeString uhash_compareCaselessUnicodeString_3_2 +#define uhash_compareChars uhash_compareChars_3_2 +#define uhash_compareIChars uhash_compareIChars_3_2 +#define uhash_compareLong uhash_compareLong_3_2 +#define uhash_compareUChars uhash_compareUChars_3_2 +#define uhash_compareUnicodeString uhash_compareUnicodeString_3_2 +#define uhash_count uhash_count_3_2 +#define uhash_deleteHashtable uhash_deleteHashtable_3_2 +#define uhash_deleteUVector uhash_deleteUVector_3_2 +#define uhash_deleteUnicodeString uhash_deleteUnicodeString_3_2 +#define uhash_find uhash_find_3_2 +#define uhash_freeBlock uhash_freeBlock_3_2 +#define uhash_get uhash_get_3_2 +#define uhash_geti uhash_geti_3_2 +#define uhash_hashCaselessUnicodeString uhash_hashCaselessUnicodeString_3_2 +#define uhash_hashChars uhash_hashChars_3_2 +#define uhash_hashIChars uhash_hashIChars_3_2 +#define uhash_hashLong uhash_hashLong_3_2 +#define uhash_hashUChars uhash_hashUChars_3_2 +#define uhash_hashUCharsN uhash_hashUCharsN_3_2 +#define uhash_hashUnicodeString uhash_hashUnicodeString_3_2 +#define uhash_iget uhash_iget_3_2 +#define uhash_igeti uhash_igeti_3_2 +#define uhash_iput uhash_iput_3_2 +#define uhash_iputi uhash_iputi_3_2 +#define uhash_iremove uhash_iremove_3_2 +#define uhash_iremovei uhash_iremovei_3_2 +#define uhash_nextElement uhash_nextElement_3_2 +#define uhash_open uhash_open_3_2 +#define uhash_openSize uhash_openSize_3_2 +#define uhash_put uhash_put_3_2 +#define uhash_puti uhash_puti_3_2 +#define uhash_remove uhash_remove_3_2 +#define uhash_removeAll uhash_removeAll_3_2 +#define uhash_removeElement uhash_removeElement_3_2 +#define uhash_removei uhash_removei_3_2 +#define uhash_setKeyComparator uhash_setKeyComparator_3_2 +#define uhash_setKeyDeleter uhash_setKeyDeleter_3_2 +#define uhash_setKeyHasher uhash_setKeyHasher_3_2 +#define uhash_setResizePolicy uhash_setResizePolicy_3_2 +#define uhash_setValueDeleter uhash_setValueDeleter_3_2 +#define uhash_toki uhash_toki_3_2 +#define uhash_tokp uhash_tokp_3_2 +#define uhst_addPropertyStarts uhst_addPropertyStarts_3_2 +#define uidna_IDNToASCII uidna_IDNToASCII_3_2 +#define uidna_IDNToUnicode uidna_IDNToUnicode_3_2 +#define uidna_compare uidna_compare_3_2 +#define uidna_toASCII uidna_toASCII_3_2 +#define uidna_toUnicode uidna_toUnicode_3_2 +#define uiter_current32 uiter_current32_3_2 +#define uiter_getState uiter_getState_3_2 +#define uiter_next32 uiter_next32_3_2 +#define uiter_previous32 uiter_previous32_3_2 +#define uiter_setCharacterIterator uiter_setCharacterIterator_3_2 +#define uiter_setReplaceable uiter_setReplaceable_3_2 +#define uiter_setState uiter_setState_3_2 +#define uiter_setString uiter_setString_3_2 +#define uiter_setUTF16BE uiter_setUTF16BE_3_2 +#define uiter_setUTF8 uiter_setUTF8_3_2 +#define uloc_acceptLanguage uloc_acceptLanguage_3_2 +#define uloc_acceptLanguageFromHTTP uloc_acceptLanguageFromHTTP_3_2 +#define uloc_canonicalize uloc_canonicalize_3_2 +#define uloc_countAvailable uloc_countAvailable_3_2 +#define uloc_getAvailable uloc_getAvailable_3_2 +#define uloc_getBaseName uloc_getBaseName_3_2 +#define uloc_getCountry uloc_getCountry_3_2 +#define uloc_getDefault uloc_getDefault_3_2 +#define uloc_getDisplayCountry uloc_getDisplayCountry_3_2 +#define uloc_getDisplayKeyword uloc_getDisplayKeyword_3_2 +#define uloc_getDisplayKeywordValue uloc_getDisplayKeywordValue_3_2 +#define uloc_getDisplayLanguage uloc_getDisplayLanguage_3_2 +#define uloc_getDisplayName uloc_getDisplayName_3_2 +#define uloc_getDisplayScript uloc_getDisplayScript_3_2 +#define uloc_getDisplayVariant uloc_getDisplayVariant_3_2 +#define uloc_getISO3Country uloc_getISO3Country_3_2 +#define uloc_getISO3Language uloc_getISO3Language_3_2 +#define uloc_getISOCountries uloc_getISOCountries_3_2 +#define uloc_getISOLanguages uloc_getISOLanguages_3_2 +#define uloc_getKeywordValue uloc_getKeywordValue_3_2 +#define uloc_getLCID uloc_getLCID_3_2 +#define uloc_getLanguage uloc_getLanguage_3_2 +#define uloc_getName uloc_getName_3_2 +#define uloc_getParent uloc_getParent_3_2 +#define uloc_getScript uloc_getScript_3_2 +#define uloc_getVariant uloc_getVariant_3_2 +#define uloc_openKeywordList uloc_openKeywordList_3_2 +#define uloc_openKeywords uloc_openKeywords_3_2 +#define uloc_setDefault uloc_setDefault_3_2 +#define uloc_setKeywordValue uloc_setKeywordValue_3_2 +#define ulocdata_getExemplarSet ulocdata_getExemplarSet_3_2 +#define ulocdata_getMeasurementSystem ulocdata_getMeasurementSystem_3_2 +#define ulocdata_getPaperSize ulocdata_getPaperSize_3_2 +#define umsg_applyPattern umsg_applyPattern_3_2 +#define umsg_clone umsg_clone_3_2 +#define umsg_close umsg_close_3_2 +#define umsg_format umsg_format_3_2 +#define umsg_getLocale umsg_getLocale_3_2 +#define umsg_getLocaleByType umsg_getLocaleByType_3_2 +#define umsg_open umsg_open_3_2 +#define umsg_parse umsg_parse_3_2 +#define umsg_setLocale umsg_setLocale_3_2 +#define umsg_toPattern umsg_toPattern_3_2 +#define umsg_vformat umsg_vformat_3_2 +#define umsg_vparse umsg_vparse_3_2 +#define umtx_atomic_dec umtx_atomic_dec_3_2 +#define umtx_atomic_inc umtx_atomic_inc_3_2 +#define umtx_cleanup umtx_cleanup_3_2 +#define umtx_destroy umtx_destroy_3_2 +#define umtx_init umtx_init_3_2 +#define umtx_lock umtx_lock_3_2 +#define umtx_unlock umtx_unlock_3_2 +#define unorm_addPropertyStarts unorm_addPropertyStarts_3_2 +#define unorm_closeIter unorm_closeIter_3_2 +#define unorm_compare unorm_compare_3_2 +#define unorm_compose unorm_compose_3_2 +#define unorm_concatenate unorm_concatenate_3_2 +#define unorm_decompose unorm_decompose_3_2 +#define unorm_getCanonStartSet unorm_getCanonStartSet_3_2 +#define unorm_getCanonicalDecomposition unorm_getCanonicalDecomposition_3_2 +#define unorm_getDecomposition unorm_getDecomposition_3_2 +#define unorm_getFCD16FromCodePoint unorm_getFCD16FromCodePoint_3_2 +#define unorm_getFCDTrie unorm_getFCDTrie_3_2 +#define unorm_getNX unorm_getNX_3_2 +#define unorm_getQuickCheck unorm_getQuickCheck_3_2 +#define unorm_getUnicodeVersion unorm_getUnicodeVersion_3_2 +#define unorm_haveData unorm_haveData_3_2 +#define unorm_internalIsFullCompositionExclusion unorm_internalIsFullCompositionExclusion_3_2 +#define unorm_internalNormalize unorm_internalNormalize_3_2 +#define unorm_internalNormalizeWithNX unorm_internalNormalizeWithNX_3_2 +#define unorm_internalQuickCheck unorm_internalQuickCheck_3_2 +#define unorm_isCanonSafeStart unorm_isCanonSafeStart_3_2 +#define unorm_isNFSkippable unorm_isNFSkippable_3_2 +#define unorm_isNormalized unorm_isNormalized_3_2 +#define unorm_isNormalizedWithOptions unorm_isNormalizedWithOptions_3_2 +#define unorm_next unorm_next_3_2 +#define unorm_normalize unorm_normalize_3_2 +#define unorm_openIter unorm_openIter_3_2 +#define unorm_previous unorm_previous_3_2 +#define unorm_quickCheck unorm_quickCheck_3_2 +#define unorm_quickCheckWithOptions unorm_quickCheckWithOptions_3_2 +#define unorm_setIter unorm_setIter_3_2 +#define unorm_swap unorm_swap_3_2 +#define unum_applyPattern unum_applyPattern_3_2 +#define unum_clone unum_clone_3_2 +#define unum_close unum_close_3_2 +#define unum_countAvailable unum_countAvailable_3_2 +#define unum_format unum_format_3_2 +#define unum_formatDouble unum_formatDouble_3_2 +#define unum_formatDoubleCurrency unum_formatDoubleCurrency_3_2 +#define unum_formatInt64 unum_formatInt64_3_2 +#define unum_getAttribute unum_getAttribute_3_2 +#define unum_getAvailable unum_getAvailable_3_2 +#define unum_getDoubleAttribute unum_getDoubleAttribute_3_2 +#define unum_getLocaleByType unum_getLocaleByType_3_2 +#define unum_getSymbol unum_getSymbol_3_2 +#define unum_getTextAttribute unum_getTextAttribute_3_2 +#define unum_open unum_open_3_2 +#define unum_parse unum_parse_3_2 +#define unum_parseDouble unum_parseDouble_3_2 +#define unum_parseDoubleCurrency unum_parseDoubleCurrency_3_2 +#define unum_parseInt64 unum_parseInt64_3_2 +#define unum_setAttribute unum_setAttribute_3_2 +#define unum_setDoubleAttribute unum_setDoubleAttribute_3_2 +#define unum_setSymbol unum_setSymbol_3_2 +#define unum_setTextAttribute unum_setTextAttribute_3_2 +#define unum_toPattern unum_toPattern_3_2 +#define upname_swap upname_swap_3_2 +#define uprops_getSource uprops_getSource_3_2 +#define uprops_swap uprops_swap_3_2 +#define uprv_asciiFromEbcdic uprv_asciiFromEbcdic_3_2 +#define uprv_asciitolower uprv_asciitolower_3_2 +#define uprv_ceil uprv_ceil_3_2 +#define uprv_cnttab_addContraction uprv_cnttab_addContraction_3_2 +#define uprv_cnttab_changeContraction uprv_cnttab_changeContraction_3_2 +#define uprv_cnttab_changeLastCE uprv_cnttab_changeLastCE_3_2 +#define uprv_cnttab_clone uprv_cnttab_clone_3_2 +#define uprv_cnttab_close uprv_cnttab_close_3_2 +#define uprv_cnttab_constructTable uprv_cnttab_constructTable_3_2 +#define uprv_cnttab_findCE uprv_cnttab_findCE_3_2 +#define uprv_cnttab_findCP uprv_cnttab_findCP_3_2 +#define uprv_cnttab_getCE uprv_cnttab_getCE_3_2 +#define uprv_cnttab_insertContraction uprv_cnttab_insertContraction_3_2 +#define uprv_cnttab_isTailored uprv_cnttab_isTailored_3_2 +#define uprv_cnttab_open uprv_cnttab_open_3_2 +#define uprv_cnttab_setContraction uprv_cnttab_setContraction_3_2 +#define uprv_compareASCIIPropertyNames uprv_compareASCIIPropertyNames_3_2 +#define uprv_compareEBCDICPropertyNames uprv_compareEBCDICPropertyNames_3_2 +#define uprv_compareInvAscii uprv_compareInvAscii_3_2 +#define uprv_compareInvEbcdic uprv_compareInvEbcdic_3_2 +#define uprv_convertToLCID uprv_convertToLCID_3_2 +#define uprv_convertToPosix uprv_convertToPosix_3_2 +#define uprv_copyAscii uprv_copyAscii_3_2 +#define uprv_copyEbcdic uprv_copyEbcdic_3_2 +#define uprv_dtostr uprv_dtostr_3_2 +#define uprv_ebcdicFromAscii uprv_ebcdicFromAscii_3_2 +#define uprv_ebcdictolower uprv_ebcdictolower_3_2 +#define uprv_fabs uprv_fabs_3_2 +#define uprv_floor uprv_floor_3_2 +#define uprv_fmax uprv_fmax_3_2 +#define uprv_fmin uprv_fmin_3_2 +#define uprv_fmod uprv_fmod_3_2 +#define uprv_free uprv_free_3_2 +#define uprv_getCharNameCharacters uprv_getCharNameCharacters_3_2 +#define uprv_getDefaultCodepage uprv_getDefaultCodepage_3_2 +#define uprv_getDefaultLocaleID uprv_getDefaultLocaleID_3_2 +#define uprv_getInfinity uprv_getInfinity_3_2 +#define uprv_getMaxCharNameLength uprv_getMaxCharNameLength_3_2 +#define uprv_getMaxValues uprv_getMaxValues_3_2 +#define uprv_getNaN uprv_getNaN_3_2 +#define uprv_getStaticCurrencyName uprv_getStaticCurrencyName_3_2 +#define uprv_getUTCtime uprv_getUTCtime_3_2 +#define uprv_haveProperties uprv_haveProperties_3_2 +#define uprv_init_collIterate uprv_init_collIterate_3_2 +#define uprv_int32Comparator uprv_int32Comparator_3_2 +#define uprv_isInfinite uprv_isInfinite_3_2 +#define uprv_isInvariantString uprv_isInvariantString_3_2 +#define uprv_isInvariantUString uprv_isInvariantUString_3_2 +#define uprv_isNaN uprv_isNaN_3_2 +#define uprv_isNegativeInfinity uprv_isNegativeInfinity_3_2 +#define uprv_isPositiveInfinity uprv_isPositiveInfinity_3_2 +#define uprv_isRuleWhiteSpace uprv_isRuleWhiteSpace_3_2 +#define uprv_itou uprv_itou_3_2 +#define uprv_loadPropsData uprv_loadPropsData_3_2 +#define uprv_log uprv_log_3_2 +#define uprv_log10 uprv_log10_3_2 +#define uprv_malloc uprv_malloc_3_2 +#define uprv_mapFile uprv_mapFile_3_2 +#define uprv_max uprv_max_3_2 +#define uprv_maxMantissa uprv_maxMantissa_3_2 +#define uprv_min uprv_min_3_2 +#define uprv_modf uprv_modf_3_2 +#define uprv_openRuleWhiteSpaceSet uprv_openRuleWhiteSpaceSet_3_2 +#define uprv_pathIsAbsolute uprv_pathIsAbsolute_3_2 +#define uprv_pow uprv_pow_3_2 +#define uprv_pow10 uprv_pow10_3_2 +#define uprv_realloc uprv_realloc_3_2 +#define uprv_round uprv_round_3_2 +#define uprv_sortArray uprv_sortArray_3_2 +#define uprv_strCompare uprv_strCompare_3_2 +#define uprv_strdup uprv_strdup_3_2 +#define uprv_strndup uprv_strndup_3_2 +#define uprv_syntaxError uprv_syntaxError_3_2 +#define uprv_timezone uprv_timezone_3_2 +#define uprv_toupper uprv_toupper_3_2 +#define uprv_trunc uprv_trunc_3_2 +#define uprv_tzname uprv_tzname_3_2 +#define uprv_tzset uprv_tzset_3_2 +#define uprv_uca_addAnElement uprv_uca_addAnElement_3_2 +#define uprv_uca_assembleTable uprv_uca_assembleTable_3_2 +#define uprv_uca_canonicalClosure uprv_uca_canonicalClosure_3_2 +#define uprv_uca_cloneTempTable uprv_uca_cloneTempTable_3_2 +#define uprv_uca_closeTempTable uprv_uca_closeTempTable_3_2 +#define uprv_uca_getCodePointFromRaw uprv_uca_getCodePointFromRaw_3_2 +#define uprv_uca_getImplicitFromRaw uprv_uca_getImplicitFromRaw_3_2 +#define uprv_uca_getImplicitPrimary uprv_uca_getImplicitPrimary_3_2 +#define uprv_uca_getRawFromCodePoint uprv_uca_getRawFromCodePoint_3_2 +#define uprv_uca_getRawFromImplicit uprv_uca_getRawFromImplicit_3_2 +#define uprv_uca_initImplicitConstants uprv_uca_initImplicitConstants_3_2 +#define uprv_uca_initTempTable uprv_uca_initTempTable_3_2 +#define uprv_uint16Comparator uprv_uint16Comparator_3_2 +#define uprv_uint32Comparator uprv_uint32Comparator_3_2 +#define uprv_unmapFile uprv_unmapFile_3_2 +#define uregex_appendReplacement uregex_appendReplacement_3_2 +#define uregex_appendTail uregex_appendTail_3_2 +#define uregex_clone uregex_clone_3_2 +#define uregex_close uregex_close_3_2 +#define uregex_end uregex_end_3_2 +#define uregex_find uregex_find_3_2 +#define uregex_findNext uregex_findNext_3_2 +#define uregex_flags uregex_flags_3_2 +#define uregex_getText uregex_getText_3_2 +#define uregex_group uregex_group_3_2 +#define uregex_groupCount uregex_groupCount_3_2 +#define uregex_lookingAt uregex_lookingAt_3_2 +#define uregex_matches uregex_matches_3_2 +#define uregex_open uregex_open_3_2 +#define uregex_openC uregex_openC_3_2 +#define uregex_pattern uregex_pattern_3_2 +#define uregex_replaceAll uregex_replaceAll_3_2 +#define uregex_replaceFirst uregex_replaceFirst_3_2 +#define uregex_reset uregex_reset_3_2 +#define uregex_setText uregex_setText_3_2 +#define uregex_split uregex_split_3_2 +#define uregex_start uregex_start_3_2 +#define ures_appendResPath ures_appendResPath_3_2 +#define ures_close ures_close_3_2 +#define ures_copyResb ures_copyResb_3_2 +#define ures_countArrayItems ures_countArrayItems_3_2 +#define ures_findResource ures_findResource_3_2 +#define ures_findSubResource ures_findSubResource_3_2 +#define ures_freeResPath ures_freeResPath_3_2 +#define ures_getBinary ures_getBinary_3_2 +#define ures_getByIndex ures_getByIndex_3_2 +#define ures_getByKey ures_getByKey_3_2 +#define ures_getByKeyWithFallback ures_getByKeyWithFallback_3_2 +#define ures_getFunctionalEquivalent ures_getFunctionalEquivalent_3_2 +#define ures_getInt ures_getInt_3_2 +#define ures_getIntVector ures_getIntVector_3_2 +#define ures_getKey ures_getKey_3_2 +#define ures_getKeywordValues ures_getKeywordValues_3_2 +#define ures_getLocale ures_getLocale_3_2 +#define ures_getLocaleByType ures_getLocaleByType_3_2 +#define ures_getName ures_getName_3_2 +#define ures_getNextResource ures_getNextResource_3_2 +#define ures_getNextString ures_getNextString_3_2 +#define ures_getPath ures_getPath_3_2 +#define ures_getSize ures_getSize_3_2 +#define ures_getString ures_getString_3_2 +#define ures_getStringByIndex ures_getStringByIndex_3_2 +#define ures_getStringByKey ures_getStringByKey_3_2 +#define ures_getType ures_getType_3_2 +#define ures_getUInt ures_getUInt_3_2 +#define ures_getVersion ures_getVersion_3_2 +#define ures_getVersionNumber ures_getVersionNumber_3_2 +#define ures_hasNext ures_hasNext_3_2 +#define ures_initStackObject ures_initStackObject_3_2 +#define ures_open ures_open_3_2 +#define ures_openAvailableLocales ures_openAvailableLocales_3_2 +#define ures_openDirect ures_openDirect_3_2 +#define ures_openFillIn ures_openFillIn_3_2 +#define ures_openU ures_openU_3_2 +#define ures_resetIterator ures_resetIterator_3_2 +#define ures_swap ures_swap_3_2 +#define uscript_closeRun uscript_closeRun_3_2 +#define uscript_getCode uscript_getCode_3_2 +#define uscript_getName uscript_getName_3_2 +#define uscript_getScript uscript_getScript_3_2 +#define uscript_getShortName uscript_getShortName_3_2 +#define uscript_nextRun uscript_nextRun_3_2 +#define uscript_openRun uscript_openRun_3_2 +#define uscript_resetRun uscript_resetRun_3_2 +#define uscript_setRunText uscript_setRunText_3_2 +#define usearch_close usearch_close_3_2 +#define usearch_first usearch_first_3_2 +#define usearch_following usearch_following_3_2 +#define usearch_getAttribute usearch_getAttribute_3_2 +#define usearch_getBreakIterator usearch_getBreakIterator_3_2 +#define usearch_getCollator usearch_getCollator_3_2 +#define usearch_getMatchedLength usearch_getMatchedLength_3_2 +#define usearch_getMatchedStart usearch_getMatchedStart_3_2 +#define usearch_getMatchedText usearch_getMatchedText_3_2 +#define usearch_getOffset usearch_getOffset_3_2 +#define usearch_getPattern usearch_getPattern_3_2 +#define usearch_getText usearch_getText_3_2 +#define usearch_handleNextCanonical usearch_handleNextCanonical_3_2 +#define usearch_handleNextExact usearch_handleNextExact_3_2 +#define usearch_handlePreviousCanonical usearch_handlePreviousCanonical_3_2 +#define usearch_handlePreviousExact usearch_handlePreviousExact_3_2 +#define usearch_last usearch_last_3_2 +#define usearch_next usearch_next_3_2 +#define usearch_open usearch_open_3_2 +#define usearch_openFromCollator usearch_openFromCollator_3_2 +#define usearch_preceding usearch_preceding_3_2 +#define usearch_previous usearch_previous_3_2 +#define usearch_reset usearch_reset_3_2 +#define usearch_setAttribute usearch_setAttribute_3_2 +#define usearch_setBreakIterator usearch_setBreakIterator_3_2 +#define usearch_setCollator usearch_setCollator_3_2 +#define usearch_setOffset usearch_setOffset_3_2 +#define usearch_setPattern usearch_setPattern_3_2 +#define usearch_setText usearch_setText_3_2 +#define userv_deleteStringPair userv_deleteStringPair_3_2 +#define uset_add uset_add_3_2 +#define uset_addAll uset_addAll_3_2 +#define uset_addRange uset_addRange_3_2 +#define uset_addString uset_addString_3_2 +#define uset_applyIntPropertyValue uset_applyIntPropertyValue_3_2 +#define uset_applyPattern uset_applyPattern_3_2 +#define uset_applyPropertyAlias uset_applyPropertyAlias_3_2 +#define uset_charAt uset_charAt_3_2 +#define uset_clear uset_clear_3_2 +#define uset_close uset_close_3_2 +#define uset_compact uset_compact_3_2 +#define uset_complement uset_complement_3_2 +#define uset_complementAll uset_complementAll_3_2 +#define uset_contains uset_contains_3_2 +#define uset_containsAll uset_containsAll_3_2 +#define uset_containsNone uset_containsNone_3_2 +#define uset_containsRange uset_containsRange_3_2 +#define uset_containsSome uset_containsSome_3_2 +#define uset_containsString uset_containsString_3_2 +#define uset_equals uset_equals_3_2 +#define uset_getItem uset_getItem_3_2 +#define uset_getItemCount uset_getItemCount_3_2 +#define uset_getSerializedRange uset_getSerializedRange_3_2 +#define uset_getSerializedRangeCount uset_getSerializedRangeCount_3_2 +#define uset_getSerializedSet uset_getSerializedSet_3_2 +#define uset_indexOf uset_indexOf_3_2 +#define uset_isEmpty uset_isEmpty_3_2 +#define uset_open uset_open_3_2 +#define uset_openPattern uset_openPattern_3_2 +#define uset_openPatternOptions uset_openPatternOptions_3_2 +#define uset_remove uset_remove_3_2 +#define uset_removeAll uset_removeAll_3_2 +#define uset_removeRange uset_removeRange_3_2 +#define uset_removeString uset_removeString_3_2 +#define uset_resemblesPattern uset_resemblesPattern_3_2 +#define uset_retain uset_retain_3_2 +#define uset_retainAll uset_retainAll_3_2 +#define uset_serialize uset_serialize_3_2 +#define uset_serializedContains uset_serializedContains_3_2 +#define uset_set uset_set_3_2 +#define uset_setSerializedToOne uset_setSerializedToOne_3_2 +#define uset_size uset_size_3_2 +#define uset_toPattern uset_toPattern_3_2 +#define usprep_close usprep_close_3_2 +#define usprep_open usprep_open_3_2 +#define usprep_prepare usprep_prepare_3_2 +#define usprep_swap usprep_swap_3_2 +#define ustr_foldCase ustr_foldCase_3_2 +#define ustr_toLower ustr_toLower_3_2 +#define ustr_toTitle ustr_toTitle_3_2 +#define ustr_toUpper ustr_toUpper_3_2 +#define utf8_appendCharSafeBody utf8_appendCharSafeBody_3_2 +#define utf8_back1SafeBody utf8_back1SafeBody_3_2 +#define utf8_countTrailBytes utf8_countTrailBytes_3_2 +#define utf8_nextCharSafeBody utf8_nextCharSafeBody_3_2 +#define utf8_prevCharSafeBody utf8_prevCharSafeBody_3_2 +#define utmscale_fromInt64 utmscale_fromInt64_3_2 +#define utmscale_getTimeScaleValue utmscale_getTimeScaleValue_3_2 +#define utmscale_toInt64 utmscale_toInt64_3_2 +#define utrace_cleanup utrace_cleanup_3_2 +#define utrace_data utrace_data_3_2 +#define utrace_entry utrace_entry_3_2 +#define utrace_exit utrace_exit_3_2 +#define utrace_format utrace_format_3_2 +#define utrace_functionName utrace_functionName_3_2 +#define utrace_getFunctions utrace_getFunctions_3_2 +#define utrace_getLevel utrace_getLevel_3_2 +#define utrace_level utrace_level_3_2 +#define utrace_setFunctions utrace_setFunctions_3_2 +#define utrace_setLevel utrace_setLevel_3_2 +#define utrace_vformat utrace_vformat_3_2 +#define utrans_clone utrans_clone_3_2 +#define utrans_close utrans_close_3_2 +#define utrans_countAvailableIDs utrans_countAvailableIDs_3_2 +#define utrans_getAvailableID utrans_getAvailableID_3_2 +#define utrans_getID utrans_getID_3_2 +#define utrans_getUnicodeID utrans_getUnicodeID_3_2 +#define utrans_open utrans_open_3_2 +#define utrans_openIDs utrans_openIDs_3_2 +#define utrans_openInverse utrans_openInverse_3_2 +#define utrans_openU utrans_openU_3_2 +#define utrans_register utrans_register_3_2 +#define utrans_rep_caseContextIterator utrans_rep_caseContextIterator_3_2 +#define utrans_setFilter utrans_setFilter_3_2 +#define utrans_trans utrans_trans_3_2 +#define utrans_transIncremental utrans_transIncremental_3_2 +#define utrans_transIncrementalUChars utrans_transIncrementalUChars_3_2 +#define utrans_transUChars utrans_transUChars_3_2 +#define utrans_unregister utrans_unregister_3_2 +#define utrans_unregisterID utrans_unregisterID_3_2 +#define utrie_clone utrie_clone_3_2 +#define utrie_close utrie_close_3_2 +#define utrie_enum utrie_enum_3_2 +#define utrie_get32 utrie_get32_3_2 +#define utrie_getData utrie_getData_3_2 +#define utrie_open utrie_open_3_2 +#define utrie_serialize utrie_serialize_3_2 +#define utrie_set32 utrie_set32_3_2 +#define utrie_setRange32 utrie_setRange32_3_2 +#define utrie_swap utrie_swap_3_2 +#define utrie_unserialize utrie_unserialize_3_2 /* C++ class names renaming defines */ #ifdef XP_CPLUSPLUS #if !U_HAVE_NAMESPACE -#define AbsoluteValueSubstitution AbsoluteValueSubstitution_2_6 -#define AlternateSubstitutionSubtable AlternateSubstitutionSubtable_2_6 -#define AnchorTable AnchorTable_2_6 -#define AnyTransliterator AnyTransliterator_2_6 -#define ArabicOpenTypeLayoutEngine ArabicOpenTypeLayoutEngine_2_6 -#define ArabicShaping ArabicShaping_2_6 -#define BasicCalendarFactory BasicCalendarFactory_2_6 -#define BinarySearchLookupTable BinarySearchLookupTable_2_6 -#define BreakDictionary BreakDictionary_2_6 -#define BreakIterator BreakIterator_2_6 -#define BuddhistCalendar BuddhistCalendar_2_6 -#define CFactory CFactory_2_6 -#define Calendar Calendar_2_6 -#define CalendarService CalendarService_2_6 -#define CanonicalIterator CanonicalIterator_2_6 -#define ChainingContextualSubstitutionFormat1Subtable ChainingContextualSubstitutionFormat1Subtable_2_6 -#define ChainingContextualSubstitutionFormat2Subtable ChainingContextualSubstitutionFormat2Subtable_2_6 -#define ChainingContextualSubstitutionFormat3Subtable ChainingContextualSubstitutionFormat3Subtable_2_6 -#define ChainingContextualSubstitutionSubtable ChainingContextualSubstitutionSubtable_2_6 -#define CharShaper CharShaper_2_6 -#define CharSubstitutionFilter CharSubstitutionFilter_2_6 -#define CharacterIterator CharacterIterator_2_6 -#define ChoiceFormat ChoiceFormat_2_6 -#define ClassDefFormat1Table ClassDefFormat1Table_2_6 -#define ClassDefFormat2Table ClassDefFormat2Table_2_6 -#define ClassDefinitionTable ClassDefinitionTable_2_6 -#define CollationElementIterator CollationElementIterator_2_6 -#define CollationKey CollationKey_2_6 -#define Collator Collator_2_6 -#define CollatorFactory CollatorFactory_2_6 -#define CompoundTransliterator CompoundTransliterator_2_6 -#define ContextualGlyphSubstitutionProcessor ContextualGlyphSubstitutionProcessor_2_6 -#define ContextualSubstitutionBase ContextualSubstitutionBase_2_6 -#define ContextualSubstitutionFormat1Subtable ContextualSubstitutionFormat1Subtable_2_6 -#define ContextualSubstitutionFormat2Subtable ContextualSubstitutionFormat2Subtable_2_6 -#define ContextualSubstitutionFormat3Subtable ContextualSubstitutionFormat3Subtable_2_6 -#define ContextualSubstitutionSubtable ContextualSubstitutionSubtable_2_6 -#define CoverageFormat1Table CoverageFormat1Table_2_6 -#define CoverageFormat2Table CoverageFormat2Table_2_6 -#define CoverageTable CoverageTable_2_6 -#define CursiveAttachmentSubtable CursiveAttachmentSubtable_2_6 -#define DateFormat DateFormat_2_6 -#define DateFormatSymbols DateFormatSymbols_2_6 -#define DecimalFormat DecimalFormat_2_6 -#define DecimalFormatSymbols DecimalFormatSymbols_2_6 -#define DefaultCalendarFactory DefaultCalendarFactory_2_6 -#define DefaultCharMapper DefaultCharMapper_2_6 -#define DeviceTable DeviceTable_2_6 -#define DictionaryBasedBreakIterator DictionaryBasedBreakIterator_2_6 -#define DictionaryBasedBreakIteratorTables DictionaryBasedBreakIteratorTables_2_6 -#define DigitList DigitList_2_6 -#define Entry Entry_2_6 -#define EscapeTransliterator EscapeTransliterator_2_6 -#define EventListener EventListener_2_6 -#define ExtensionSubtable ExtensionSubtable_2_6 -#define FeatureListTable FeatureListTable_2_6 -#define FieldPosition FieldPosition_2_6 -#define FontRuns FontRuns_2_6 -#define Format Format_2_6 -#define Format1AnchorTable Format1AnchorTable_2_6 -#define Format2AnchorTable Format2AnchorTable_2_6 -#define Format3AnchorTable Format3AnchorTable_2_6 -#define Formattable Formattable_2_6 -#define ForwardCharacterIterator ForwardCharacterIterator_2_6 -#define FractionalPartSubstitution FractionalPartSubstitution_2_6 -#define FunctionReplacer FunctionReplacer_2_6 -#define GDEFMarkFilter GDEFMarkFilter_2_6 -#define GXLayoutEngine GXLayoutEngine_2_6 -#define GlyphDefinitionTableHeader GlyphDefinitionTableHeader_2_6 -#define GlyphIterator GlyphIterator_2_6 -#define GlyphPositioningLookupProcessor GlyphPositioningLookupProcessor_2_6 -#define GlyphPositioningTableHeader GlyphPositioningTableHeader_2_6 -#define GlyphShaper GlyphShaper_2_6 -#define GlyphSubstitutionLookupProcessor GlyphSubstitutionLookupProcessor_2_6 -#define GlyphSubstitutionTableHeader GlyphSubstitutionTableHeader_2_6 -#define GregorianCalendar GregorianCalendar_2_6 -#define HanOpenTypeLayoutEngine HanOpenTypeLayoutEngine_2_6 -#define HebrewShaping HebrewShaping_2_6 -#define HexToUnicodeTransliterator HexToUnicodeTransliterator_2_6 -#define ICUBreakIteratorFactory ICUBreakIteratorFactory_2_6 -#define ICUBreakIteratorService ICUBreakIteratorService_2_6 -#define ICUCollatorFactory ICUCollatorFactory_2_6 -#define ICUCollatorService ICUCollatorService_2_6 -#define ICULayoutEngine ICULayoutEngine_2_6 -#define ICULocaleService ICULocaleService_2_6 -#define ICUNotifier ICUNotifier_2_6 -#define ICUNumberFormatFactory ICUNumberFormatFactory_2_6 -#define ICUNumberFormatService ICUNumberFormatService_2_6 -#define ICUResourceBundleFactory ICUResourceBundleFactory_2_6 -#define ICUService ICUService_2_6 -#define ICUServiceFactory ICUServiceFactory_2_6 -#define ICUServiceKey ICUServiceKey_2_6 -#define ICU_Utility ICU_Utility_2_6 -#define IndicClassTable IndicClassTable_2_6 -#define IndicOpenTypeLayoutEngine IndicOpenTypeLayoutEngine_2_6 -#define IndicRearrangementProcessor IndicRearrangementProcessor_2_6 -#define IndicReordering IndicReordering_2_6 -#define IntegralPartSubstitution IntegralPartSubstitution_2_6 -#define JapaneseCalendar JapaneseCalendar_2_6 -#define LECharMapper LECharMapper_2_6 -#define LEFontInstance LEFontInstance_2_6 -#define LEGlyphFilter LEGlyphFilter_2_6 -#define LXUtilities LXUtilities_2_6 -#define LayoutEngine LayoutEngine_2_6 -#define LigatureSubstitutionProcessor LigatureSubstitutionProcessor_2_6 -#define LigatureSubstitutionSubtable LigatureSubstitutionSubtable_2_6 -#define Locale Locale_2_6 -#define LocaleKey LocaleKey_2_6 -#define LocaleKeyFactory LocaleKeyFactory_2_6 -#define LocaleRuns LocaleRuns_2_6 -#define LocaleUtility LocaleUtility_2_6 -#define LookupListTable LookupListTable_2_6 -#define LookupProcessor LookupProcessor_2_6 -#define LookupSubtable LookupSubtable_2_6 -#define LookupTable LookupTable_2_6 -#define LowercaseTransliterator LowercaseTransliterator_2_6 -#define MPreFixups MPreFixups_2_6 -#define MarkArray MarkArray_2_6 -#define MarkToBasePositioningSubtable MarkToBasePositioningSubtable_2_6 -#define MarkToLigaturePositioningSubtable MarkToLigaturePositioningSubtable_2_6 -#define MarkToMarkPositioningSubtable MarkToMarkPositioningSubtable_2_6 -#define MessageFormat MessageFormat_2_6 -#define MessageFormatAdapter MessageFormatAdapter_2_6 -#define ModulusSubstitution ModulusSubstitution_2_6 -#define MorphSubtableHeader MorphSubtableHeader_2_6 -#define MorphTableHeader MorphTableHeader_2_6 -#define MultipleSubstitutionSubtable MultipleSubstitutionSubtable_2_6 -#define MultiplierSubstitution MultiplierSubstitution_2_6 -#define NFFactory NFFactory_2_6 -#define NFRule NFRule_2_6 -#define NFRuleSet NFRuleSet_2_6 -#define NFSubstitution NFSubstitution_2_6 -#define NamePrep NamePrep_2_6 -#define NameUnicodeTransliterator NameUnicodeTransliterator_2_6 -#define NonContextualGlyphSubstitutionProcessor NonContextualGlyphSubstitutionProcessor_2_6 -#define NormalizationTransliterator NormalizationTransliterator_2_6 -#define Normalizer Normalizer_2_6 -#define NullFilter NullFilter_2_6 -#define NullSubstitution NullSubstitution_2_6 -#define NullTransliterator NullTransliterator_2_6 -#define NumberFormat NumberFormat_2_6 -#define NumeratorSubstitution NumeratorSubstitution_2_6 -#define OpenTypeLayoutEngine OpenTypeLayoutEngine_2_6 -#define OpenTypeUtilities OpenTypeUtilities_2_6 -#define PairPositioningFormat1Subtable PairPositioningFormat1Subtable_2_6 -#define PairPositioningFormat2Subtable PairPositioningFormat2Subtable_2_6 -#define PairPositioningSubtable PairPositioningSubtable_2_6 -#define ParagraphLayout ParagraphLayout_2_6 -#define ParseData ParseData_2_6 -#define ParsePosition ParsePosition_2_6 -#define PropertyAliases PropertyAliases_2_6 -#define Quantifier Quantifier_2_6 -#define RBBIDataWrapper RBBIDataWrapper_2_6 -#define RBBINode RBBINode_2_6 -#define RBBIRuleBuilder RBBIRuleBuilder_2_6 -#define RBBIRuleScanner RBBIRuleScanner_2_6 -#define RBBISetBuilder RBBISetBuilder_2_6 -#define RBBIStateDescriptor RBBIStateDescriptor_2_6 -#define RBBISymbolTable RBBISymbolTable_2_6 -#define RBBISymbolTableEntry RBBISymbolTableEntry_2_6 -#define RBBITableBuilder RBBITableBuilder_2_6 -#define RangeDescriptor RangeDescriptor_2_6 -#define RegexCompile RegexCompile_2_6 -#define RegexMatcher RegexMatcher_2_6 -#define RegexPattern RegexPattern_2_6 -#define RegexStaticSets RegexStaticSets_2_6 -#define RemoveTransliterator RemoveTransliterator_2_6 -#define Replaceable Replaceable_2_6 -#define ReplaceableGlue ReplaceableGlue_2_6 -#define ResourceBundle ResourceBundle_2_6 -#define RuleBasedBreakIterator RuleBasedBreakIterator_2_6 -#define RuleBasedCollator RuleBasedCollator_2_6 -#define RuleBasedNumberFormat RuleBasedNumberFormat_2_6 -#define RuleBasedTransliterator RuleBasedTransliterator_2_6 -#define RuleHalf RuleHalf_2_6 -#define RunArray RunArray_2_6 -#define SameValueSubstitution SameValueSubstitution_2_6 -#define ScriptListTable ScriptListTable_2_6 -#define ScriptRunIterator ScriptRunIterator_2_6 -#define ScriptTable ScriptTable_2_6 -#define SearchIterator SearchIterator_2_6 -#define SegmentArrayProcessor SegmentArrayProcessor_2_6 -#define SegmentSingleProcessor SegmentSingleProcessor_2_6 -#define ServiceEnumeration ServiceEnumeration_2_6 -#define ServiceListener ServiceListener_2_6 -#define Shaper Shaper_2_6 -#define SimpleArrayProcessor SimpleArrayProcessor_2_6 -#define SimpleDateFormat SimpleDateFormat_2_6 -#define SimpleFactory SimpleFactory_2_6 -#define SimpleLocaleKeyFactory SimpleLocaleKeyFactory_2_6 -#define SimpleTimeZone SimpleTimeZone_2_6 -#define SinglePositioningFormat1Subtable SinglePositioningFormat1Subtable_2_6 -#define SinglePositioningFormat2Subtable SinglePositioningFormat2Subtable_2_6 -#define SinglePositioningSubtable SinglePositioningSubtable_2_6 -#define SingleSubstitutionFormat1Subtable SingleSubstitutionFormat1Subtable_2_6 -#define SingleSubstitutionFormat2Subtable SingleSubstitutionFormat2Subtable_2_6 -#define SingleSubstitutionSubtable SingleSubstitutionSubtable_2_6 -#define SingleTableProcessor SingleTableProcessor_2_6 -#define Spec Spec_2_6 -#define StateTableProcessor StateTableProcessor_2_6 -#define StringCharacterIterator StringCharacterIterator_2_6 -#define StringEnumeration StringEnumeration_2_6 -#define StringMatcher StringMatcher_2_6 -#define StringPair StringPair_2_6 -#define StringPrep StringPrep_2_6 -#define StringReplacer StringReplacer_2_6 -#define StringSearch StringSearch_2_6 -#define StyleRuns StyleRuns_2_6 -#define SubstitutionLookup SubstitutionLookup_2_6 -#define SubtableProcessor SubtableProcessor_2_6 -#define SymbolTable SymbolTable_2_6 -#define TZEnumeration TZEnumeration_2_6 -#define ThaiLayoutEngine ThaiLayoutEngine_2_6 -#define ThaiShaping ThaiShaping_2_6 -#define TimeZone TimeZone_2_6 -#define TitlecaseTransliterator TitlecaseTransliterator_2_6 -#define TransliterationRule TransliterationRule_2_6 -#define TransliterationRuleData TransliterationRuleData_2_6 -#define TransliterationRuleSet TransliterationRuleSet_2_6 -#define Transliterator Transliterator_2_6 -#define TransliteratorAlias TransliteratorAlias_2_6 -#define TransliteratorIDParser TransliteratorIDParser_2_6 -#define TransliteratorParser TransliteratorParser_2_6 -#define TransliteratorRegistry TransliteratorRegistry_2_6 -#define TrimmedArrayProcessor TrimmedArrayProcessor_2_6 -#define UCharCharacterIterator UCharCharacterIterator_2_6 -#define UMemory UMemory_2_6 -#define UObject UObject_2_6 -#define UStack UStack_2_6 -#define UVector UVector_2_6 -#define UVector32 UVector32_2_6 -#define UnescapeTransliterator UnescapeTransliterator_2_6 -#define UnicodeAndFilter UnicodeAndFilter_2_6 -#define UnicodeArabicOpenTypeLayoutEngine UnicodeArabicOpenTypeLayoutEngine_2_6 -#define UnicodeFilter UnicodeFilter_2_6 -#define UnicodeFilterLogic UnicodeFilterLogic_2_6 -#define UnicodeFunctor UnicodeFunctor_2_6 -#define UnicodeMatcher UnicodeMatcher_2_6 -#define UnicodeNameTransliterator UnicodeNameTransliterator_2_6 -#define UnicodeNotFilter UnicodeNotFilter_2_6 -#define UnicodeOrFilter UnicodeOrFilter_2_6 -#define UnicodeReplacer UnicodeReplacer_2_6 -#define UnicodeSet UnicodeSet_2_6 -#define UnicodeSetIterator UnicodeSetIterator_2_6 -#define UnicodeString UnicodeString_2_6 -#define UnicodeToHexTransliterator UnicodeToHexTransliterator_2_6 -#define UppercaseTransliterator UppercaseTransliterator_2_6 -#define ValueRecord ValueRecord_2_6 -#define ValueRuns ValueRuns_2_6 -#define _UF _UF_2_6 -#define locale_set_default_internal locale_set_default_internal_2_6 -#define uprv_cnttab_cloneContraction uprv_cnttab_cloneContraction_2_6 -#define uprv_growTable uprv_growTable_2_6 -#define uprv_uca_addContraction uprv_uca_addContraction_2_6 -#define uprv_uca_addPrefix uprv_uca_addPrefix_2_6 -#define uprv_uca_getMaxExpansionJamo uprv_uca_getMaxExpansionJamo_2_6 -#define uprv_uca_setMaxExpansion uprv_uca_setMaxExpansion_2_6 -#define uprv_uca_setMaxJamoExpansion uprv_uca_setMaxJamoExpansion_2_6 -#define util64_fromDouble util64_fromDouble_2_6 -#define util64_pow util64_pow_2_6 -#define util64_tou util64_tou_2_6 -#define util64_utoi util64_utoi_2_6 -#define util_equalRules util_equalRules_2_6 +#define AbsoluteValueSubstitution AbsoluteValueSubstitution_3_2 +#define AlternateSubstitutionSubtable AlternateSubstitutionSubtable_3_2 +#define AnchorTable AnchorTable_3_2 +#define AnyTransliterator AnyTransliterator_3_2 +#define ArabicOpenTypeLayoutEngine ArabicOpenTypeLayoutEngine_3_2 +#define ArabicShaping ArabicShaping_3_2 +#define BasicCalendarFactory BasicCalendarFactory_3_2 +#define BinarySearchLookupTable BinarySearchLookupTable_3_2 +#define BreakDictionary BreakDictionary_3_2 +#define BreakIterator BreakIterator_3_2 +#define BuddhistCalendar BuddhistCalendar_3_2 +#define CFactory CFactory_3_2 +#define Calendar Calendar_3_2 +#define CalendarAstronomer CalendarAstronomer_3_2 +#define CalendarCache CalendarCache_3_2 +#define CalendarData CalendarData_3_2 +#define CalendarService CalendarService_3_2 +#define CanonShaping CanonShaping_3_2 +#define CanonicalIterator CanonicalIterator_3_2 +#define CaseMapTransliterator CaseMapTransliterator_3_2 +#define ChainingContextualSubstitutionFormat1Subtable ChainingContextualSubstitutionFormat1Subtable_3_2 +#define ChainingContextualSubstitutionFormat2Subtable ChainingContextualSubstitutionFormat2Subtable_3_2 +#define ChainingContextualSubstitutionFormat3Subtable ChainingContextualSubstitutionFormat3Subtable_3_2 +#define ChainingContextualSubstitutionSubtable ChainingContextualSubstitutionSubtable_3_2 +#define CharSubstitutionFilter CharSubstitutionFilter_3_2 +#define CharacterIterator CharacterIterator_3_2 +#define ChoiceFormat ChoiceFormat_3_2 +#define ClassDefFormat1Table ClassDefFormat1Table_3_2 +#define ClassDefFormat2Table ClassDefFormat2Table_3_2 +#define ClassDefinitionTable ClassDefinitionTable_3_2 +#define CollationElementIterator CollationElementIterator_3_2 +#define CollationKey CollationKey_3_2 +#define Collator Collator_3_2 +#define CollatorFactory CollatorFactory_3_2 +#define CompoundTransliterator CompoundTransliterator_3_2 +#define ContextualGlyphSubstitutionProcessor ContextualGlyphSubstitutionProcessor_3_2 +#define ContextualSubstitutionBase ContextualSubstitutionBase_3_2 +#define ContextualSubstitutionFormat1Subtable ContextualSubstitutionFormat1Subtable_3_2 +#define ContextualSubstitutionFormat2Subtable ContextualSubstitutionFormat2Subtable_3_2 +#define ContextualSubstitutionFormat3Subtable ContextualSubstitutionFormat3Subtable_3_2 +#define ContextualSubstitutionSubtable ContextualSubstitutionSubtable_3_2 +#define CoverageFormat1Table CoverageFormat1Table_3_2 +#define CoverageFormat2Table CoverageFormat2Table_3_2 +#define CoverageTable CoverageTable_3_2 +#define CurrencyAmount CurrencyAmount_3_2 +#define CurrencyFormat CurrencyFormat_3_2 +#define CurrencyUnit CurrencyUnit_3_2 +#define CursiveAttachmentSubtable CursiveAttachmentSubtable_3_2 +#define DateFormat DateFormat_3_2 +#define DateFormatSymbols DateFormatSymbols_3_2 +#define DecimalFormat DecimalFormat_3_2 +#define DecimalFormatSymbols DecimalFormatSymbols_3_2 +#define DefaultCalendarFactory DefaultCalendarFactory_3_2 +#define DefaultCharMapper DefaultCharMapper_3_2 +#define DeviceTable DeviceTable_3_2 +#define DictionaryBasedBreakIterator DictionaryBasedBreakIterator_3_2 +#define DictionaryBasedBreakIteratorTables DictionaryBasedBreakIteratorTables_3_2 +#define DigitList DigitList_3_2 +#define Entry Entry_3_2 +#define EnumToOffset EnumToOffset_3_2 +#define EscapeTransliterator EscapeTransliterator_3_2 +#define EventListener EventListener_3_2 +#define ExtensionSubtable ExtensionSubtable_3_2 +#define FeatureListTable FeatureListTable_3_2 +#define FieldPosition FieldPosition_3_2 +#define FontRuns FontRuns_3_2 +#define Format Format_3_2 +#define Format1AnchorTable Format1AnchorTable_3_2 +#define Format2AnchorTable Format2AnchorTable_3_2 +#define Format3AnchorTable Format3AnchorTable_3_2 +#define Formattable Formattable_3_2 +#define ForwardCharacterIterator ForwardCharacterIterator_3_2 +#define FractionalPartSubstitution FractionalPartSubstitution_3_2 +#define FunctionReplacer FunctionReplacer_3_2 +#define GDEFMarkFilter GDEFMarkFilter_3_2 +#define GXLayoutEngine GXLayoutEngine_3_2 +#define GlyphDefinitionTableHeader GlyphDefinitionTableHeader_3_2 +#define GlyphIterator GlyphIterator_3_2 +#define GlyphLookupTableHeader GlyphLookupTableHeader_3_2 +#define GlyphPositioningLookupProcessor GlyphPositioningLookupProcessor_3_2 +#define GlyphPositioningTableHeader GlyphPositioningTableHeader_3_2 +#define GlyphSubstitutionLookupProcessor GlyphSubstitutionLookupProcessor_3_2 +#define GlyphSubstitutionTableHeader GlyphSubstitutionTableHeader_3_2 +#define Grego Grego_3_2 +#define GregorianCalendar GregorianCalendar_3_2 +#define HanOpenTypeLayoutEngine HanOpenTypeLayoutEngine_3_2 +#define HebrewCalendar HebrewCalendar_3_2 +#define ICUBreakIteratorFactory ICUBreakIteratorFactory_3_2 +#define ICUBreakIteratorService ICUBreakIteratorService_3_2 +#define ICUCollatorFactory ICUCollatorFactory_3_2 +#define ICUCollatorService ICUCollatorService_3_2 +#define ICULayoutEngine ICULayoutEngine_3_2 +#define ICULocaleService ICULocaleService_3_2 +#define ICUNotifier ICUNotifier_3_2 +#define ICUNumberFormatFactory ICUNumberFormatFactory_3_2 +#define ICUNumberFormatService ICUNumberFormatService_3_2 +#define ICUResourceBundleFactory ICUResourceBundleFactory_3_2 +#define ICUService ICUService_3_2 +#define ICUServiceFactory ICUServiceFactory_3_2 +#define ICUServiceKey ICUServiceKey_3_2 +#define ICU_Utility ICU_Utility_3_2 +#define IndicClassTable IndicClassTable_3_2 +#define IndicOpenTypeLayoutEngine IndicOpenTypeLayoutEngine_3_2 +#define IndicRearrangementProcessor IndicRearrangementProcessor_3_2 +#define IndicReordering IndicReordering_3_2 +#define IntegralPartSubstitution IntegralPartSubstitution_3_2 +#define IslamicCalendar IslamicCalendar_3_2 +#define JapaneseCalendar JapaneseCalendar_3_2 +#define KeywordEnumeration KeywordEnumeration_3_2 +#define LECharMapper LECharMapper_3_2 +#define LEFontInstance LEFontInstance_3_2 +#define LEGlyphFilter LEGlyphFilter_3_2 +#define LEGlyphStorage LEGlyphStorage_3_2 +#define LEInsertionCallback LEInsertionCallback_3_2 +#define LEInsertionList LEInsertionList_3_2 +#define LXUtilities LXUtilities_3_2 +#define LayoutEngine LayoutEngine_3_2 +#define LigatureSubstitutionProcessor LigatureSubstitutionProcessor_3_2 +#define LigatureSubstitutionSubtable LigatureSubstitutionSubtable_3_2 +#define LocDataParser LocDataParser_3_2 +#define Locale Locale_3_2 +#define LocaleBased LocaleBased_3_2 +#define LocaleKey LocaleKey_3_2 +#define LocaleKeyFactory LocaleKeyFactory_3_2 +#define LocaleRuns LocaleRuns_3_2 +#define LocaleUtility LocaleUtility_3_2 +#define LocalizationInfo LocalizationInfo_3_2 +#define LookupListTable LookupListTable_3_2 +#define LookupProcessor LookupProcessor_3_2 +#define LookupSubtable LookupSubtable_3_2 +#define LookupTable LookupTable_3_2 +#define LowercaseTransliterator LowercaseTransliterator_3_2 +#define MPreFixups MPreFixups_3_2 +#define MarkArray MarkArray_3_2 +#define MarkToBasePositioningSubtable MarkToBasePositioningSubtable_3_2 +#define MarkToLigaturePositioningSubtable MarkToLigaturePositioningSubtable_3_2 +#define MarkToMarkPositioningSubtable MarkToMarkPositioningSubtable_3_2 +#define Math Math_3_2 +#define Measure Measure_3_2 +#define MeasureFormat MeasureFormat_3_2 +#define MeasureUnit MeasureUnit_3_2 +#define MessageFormat MessageFormat_3_2 +#define MessageFormatAdapter MessageFormatAdapter_3_2 +#define ModulusSubstitution ModulusSubstitution_3_2 +#define MoonRiseSetCoordFunc MoonRiseSetCoordFunc_3_2 +#define MoonTimeAngleFunc MoonTimeAngleFunc_3_2 +#define MorphSubtableHeader MorphSubtableHeader_3_2 +#define MorphTableHeader MorphTableHeader_3_2 +#define MultipleSubstitutionSubtable MultipleSubstitutionSubtable_3_2 +#define MultiplierSubstitution MultiplierSubstitution_3_2 +#define NFFactory NFFactory_3_2 +#define NFRule NFRule_3_2 +#define NFRuleSet NFRuleSet_3_2 +#define NFSubstitution NFSubstitution_3_2 +#define NameToEnum NameToEnum_3_2 +#define NameUnicodeTransliterator NameUnicodeTransliterator_3_2 +#define NonContextualGlyphSubstitutionProcessor NonContextualGlyphSubstitutionProcessor_3_2 +#define NonContiguousEnumToOffset NonContiguousEnumToOffset_3_2 +#define NormalizationTransliterator NormalizationTransliterator_3_2 +#define Normalizer Normalizer_3_2 +#define NullSubstitution NullSubstitution_3_2 +#define NullTransliterator NullTransliterator_3_2 +#define NumberFormat NumberFormat_3_2 +#define NumberFormatFactory NumberFormatFactory_3_2 +#define NumeratorSubstitution NumeratorSubstitution_3_2 +#define OlsonTimeZone OlsonTimeZone_3_2 +#define OpenTypeLayoutEngine OpenTypeLayoutEngine_3_2 +#define OpenTypeUtilities OpenTypeUtilities_3_2 +#define PairPositioningFormat1Subtable PairPositioningFormat1Subtable_3_2 +#define PairPositioningFormat2Subtable PairPositioningFormat2Subtable_3_2 +#define PairPositioningSubtable PairPositioningSubtable_3_2 +#define ParagraphLayout ParagraphLayout_3_2 +#define ParseData ParseData_3_2 +#define ParsePosition ParsePosition_3_2 +#define PropertyAliases PropertyAliases_3_2 +#define Quantifier Quantifier_3_2 +#define RBBIDataWrapper RBBIDataWrapper_3_2 +#define RBBINode RBBINode_3_2 +#define RBBIRuleBuilder RBBIRuleBuilder_3_2 +#define RBBIRuleScanner RBBIRuleScanner_3_2 +#define RBBISetBuilder RBBISetBuilder_3_2 +#define RBBIStateDescriptor RBBIStateDescriptor_3_2 +#define RBBISymbolTable RBBISymbolTable_3_2 +#define RBBISymbolTableEntry RBBISymbolTableEntry_3_2 +#define RBBITableBuilder RBBITableBuilder_3_2 +#define RangeDescriptor RangeDescriptor_3_2 +#define RegexCompile RegexCompile_3_2 +#define RegexMatcher RegexMatcher_3_2 +#define RegexPattern RegexPattern_3_2 +#define RegexStaticSets RegexStaticSets_3_2 +#define RemoveTransliterator RemoveTransliterator_3_2 +#define Replaceable Replaceable_3_2 +#define ReplaceableGlue ReplaceableGlue_3_2 +#define ResourceBundle ResourceBundle_3_2 +#define RiseSetCoordFunc RiseSetCoordFunc_3_2 +#define RuleBasedBreakIterator RuleBasedBreakIterator_3_2 +#define RuleBasedCollator RuleBasedCollator_3_2 +#define RuleBasedNumberFormat RuleBasedNumberFormat_3_2 +#define RuleBasedTransliterator RuleBasedTransliterator_3_2 +#define RuleCharacterIterator RuleCharacterIterator_3_2 +#define RuleHalf RuleHalf_3_2 +#define RunArray RunArray_3_2 +#define SameValueSubstitution SameValueSubstitution_3_2 +#define ScriptListTable ScriptListTable_3_2 +#define ScriptRunIterator ScriptRunIterator_3_2 +#define ScriptTable ScriptTable_3_2 +#define SearchIterator SearchIterator_3_2 +#define SegmentArrayProcessor SegmentArrayProcessor_3_2 +#define SegmentSingleProcessor SegmentSingleProcessor_3_2 +#define ServiceEnumeration ServiceEnumeration_3_2 +#define ServiceListener ServiceListener_3_2 +#define SimpleArrayProcessor SimpleArrayProcessor_3_2 +#define SimpleDateFormat SimpleDateFormat_3_2 +#define SimpleFactory SimpleFactory_3_2 +#define SimpleLocaleKeyFactory SimpleLocaleKeyFactory_3_2 +#define SimpleNumberFormatFactory SimpleNumberFormatFactory_3_2 +#define SimpleTimeZone SimpleTimeZone_3_2 +#define SinglePositioningFormat1Subtable SinglePositioningFormat1Subtable_3_2 +#define SinglePositioningFormat2Subtable SinglePositioningFormat2Subtable_3_2 +#define SinglePositioningSubtable SinglePositioningSubtable_3_2 +#define SingleSubstitutionFormat1Subtable SingleSubstitutionFormat1Subtable_3_2 +#define SingleSubstitutionFormat2Subtable SingleSubstitutionFormat2Subtable_3_2 +#define SingleSubstitutionSubtable SingleSubstitutionSubtable_3_2 +#define SingleTableProcessor SingleTableProcessor_3_2 +#define Spec Spec_3_2 +#define StateTableProcessor StateTableProcessor_3_2 +#define StringCharacterIterator StringCharacterIterator_3_2 +#define StringEnumeration StringEnumeration_3_2 +#define StringLocalizationInfo StringLocalizationInfo_3_2 +#define StringMatcher StringMatcher_3_2 +#define StringPair StringPair_3_2 +#define StringReplacer StringReplacer_3_2 +#define StringSearch StringSearch_3_2 +#define StyleRuns StyleRuns_3_2 +#define SubstitutionLookup SubstitutionLookup_3_2 +#define SubtableProcessor SubtableProcessor_3_2 +#define SunTimeAngleFunc SunTimeAngleFunc_3_2 +#define SymbolTable SymbolTable_3_2 +#define TZEnumeration TZEnumeration_3_2 +#define ThaiLayoutEngine ThaiLayoutEngine_3_2 +#define ThaiShaping ThaiShaping_3_2 +#define TimeZone TimeZone_3_2 +#define TitlecaseTransliterator TitlecaseTransliterator_3_2 +#define TransliterationRule TransliterationRule_3_2 +#define TransliterationRuleData TransliterationRuleData_3_2 +#define TransliterationRuleSet TransliterationRuleSet_3_2 +#define Transliterator Transliterator_3_2 +#define TransliteratorAlias TransliteratorAlias_3_2 +#define TransliteratorIDParser TransliteratorIDParser_3_2 +#define TransliteratorParser TransliteratorParser_3_2 +#define TransliteratorRegistry TransliteratorRegistry_3_2 +#define TrimmedArrayProcessor TrimmedArrayProcessor_3_2 +#define UCharCharacterIterator UCharCharacterIterator_3_2 +#define UMemory UMemory_3_2 +#define UObject UObject_3_2 +#define UStack UStack_3_2 +#define UStringEnumeration UStringEnumeration_3_2 +#define UVector UVector_3_2 +#define UVector32 UVector32_3_2 +#define UnescapeTransliterator UnescapeTransliterator_3_2 +#define UnicodeArabicOpenTypeLayoutEngine UnicodeArabicOpenTypeLayoutEngine_3_2 +#define UnicodeFilter UnicodeFilter_3_2 +#define UnicodeFunctor UnicodeFunctor_3_2 +#define UnicodeMatcher UnicodeMatcher_3_2 +#define UnicodeNameTransliterator UnicodeNameTransliterator_3_2 +#define UnicodeReplacer UnicodeReplacer_3_2 +#define UnicodeSet UnicodeSet_3_2 +#define UnicodeSetIterator UnicodeSetIterator_3_2 +#define UnicodeString UnicodeString_3_2 +#define UppercaseTransliterator UppercaseTransliterator_3_2 +#define ValueRecord ValueRecord_3_2 +#define ValueRuns ValueRuns_3_2 +#define locale_set_default_internal locale_set_default_internal_3_2 +#define uprv_parseCurrency uprv_parseCurrency_3_2 +#define util64_fromDouble util64_fromDouble_3_2 +#define util64_pow util64_pow_3_2 +#define util64_tou util64_tou_3_2 +#define util64_utoi util64_utoi_3_2 #endif #endif diff --git a/icuSources/common/unicode/ures.h b/icuSources/common/unicode/ures.h index 91d53036..c1cecd49 100644 --- a/icuSources/common/unicode/ures.h +++ b/icuSources/common/unicode/ures.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1997-2003, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -61,16 +61,16 @@ typedef struct UResourceBundle UResourceBundle; * @stable ICU 2.0 */ typedef enum { - /** Resource type constant for "no resource". @draft ICU 2.6 */ + /** Resource type constant for "no resource". @stable ICU 2.6 */ URES_NONE=-1, - /** Resource type constant for 16-bit Unicode strings. @draft ICU 2.6 */ + /** Resource type constant for 16-bit Unicode strings. @stable ICU 2.6 */ URES_STRING=0, - /** Resource type constant for binary data. @draft ICU 2.6 */ + /** Resource type constant for binary data. @stable ICU 2.6 */ URES_BINARY=1, - /** Resource type constant for tables of key-value pairs. @draft ICU 2.6 */ + /** Resource type constant for tables of key-value pairs. @stable ICU 2.6 */ URES_TABLE=2, /** @@ -78,30 +78,38 @@ typedef enum { * internally stores a string which identifies the actual resource * storing the data (can be in a different resource bundle). * Resolved internally before delivering the actual resource through the API. - * @draft ICU 2.6 + * @stable ICU 2.6 */ URES_ALIAS=3, + /** + * Internal use only. + * Alternative resource type constant for tables of key-value pairs. + * Never returned by ures_getType(). + * @internal + */ + URES_TABLE32=4, + /** * Resource type constant for a single 28-bit integer, interpreted as * signed or unsigned by the ures_getInt() or ures_getUInt() function. * @see ures_getInt * @see ures_getUInt - * @draft ICU 2.6 + * @stable ICU 2.6 */ URES_INT=7, - /** Resource type constant for arrays of resources. @draft ICU 2.6 */ + /** Resource type constant for arrays of resources. @stable ICU 2.6 */ URES_ARRAY=8, /** * Resource type constant for vectors of 32-bit integers. * @see ures_getIntVector - * @draft ICU 2.6 + * @stable ICU 2.6 */ URES_INT_VECTOR=14, - +#ifndef U_HIDE_DEPRECATED_API /** @deprecated ICU 2.6 Use the URES_ constant instead. */ RES_NONE=URES_NONE, /** @deprecated ICU 2.6 Use the URES_ constant instead. */ @@ -118,6 +126,8 @@ typedef enum { RES_ARRAY=URES_ARRAY, /** @deprecated ICU 2.6 Use the URES_ constant instead. */ RES_INT_VECTOR=URES_INT_VECTOR, +#endif /* U_HIDE_DEPRECATED_API */ + /** @deprecated ICU 2.6 Not used. */ RES_RESERVED=15 } UResType; @@ -153,7 +163,7 @@ typedef enum { * @see ures_close * @stable ICU 2.0 */ -U_CAPI UResourceBundle* U_EXPORT2 +U_STABLE UResourceBundle* U_EXPORT2 ures_open(const char* path, const char* locale, UErrorCode* status); @@ -175,7 +185,7 @@ ures_open(const char* path, * @see ures_close * @stable ICU 2.0 */ -U_CAPI UResourceBundle* U_EXPORT2 +U_STABLE UResourceBundle* U_EXPORT2 ures_openDirect(const char* path, const char* locale, UErrorCode* status); @@ -195,7 +205,7 @@ ures_openDirect(const char* path, * @see ures_open * @stable ICU 2.0 */ -U_CAPI UResourceBundle* U_EXPORT2 +U_STABLE UResourceBundle* U_EXPORT2 ures_openU(const UChar* path, const char* locale, UErrorCode* status); @@ -207,16 +217,16 @@ ures_openU(const UChar* path, *@param resourceBundle resource bundle containing the desired strings *@param resourceKey key tagging the resource *@param err fills in the outgoing error code - * could be U_MISSING_RESOURCE_ERROR if the key is not found + * could be U_MISSING_RESOURCE_ERROR if the key is not found * could be a non-failing error * e.g.: U_USING_FALLBACK_WARNING,U_USING_FALLBACK_WARNING *@return: for Arrays: returns the number of resources in the array * Tables: returns the number of resources in the table * single string: returns 1 *@see ures_getSize - * @stable ICU 2.0 + * @deprecated ICU 2.8 User ures_getSize instead */ -U_CAPI int32_t U_EXPORT2 +U_DEPRECATED int32_t U_EXPORT2 ures_countArrayItems(const UResourceBundle* resourceBundle, const char* resourceKey, UErrorCode* err); @@ -228,7 +238,7 @@ ures_countArrayItems(const UResourceBundle* resourceBundle, * @see ures_open * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ures_close(UResourceBundle* resourceBundle); /** @@ -239,9 +249,9 @@ ures_close(UResourceBundle* resourceBundle); * @return A version number string as specified in the resource bundle or its parent. * The caller does not own this string. * @see ures_getVersion - * @stable ICU 2.0 + * @deprecated ICU 2.8 Use ures_getVersion instead. */ -U_CAPI const char* U_EXPORT2 +U_DEPRECATED const char* U_EXPORT2 ures_getVersionNumber(const UResourceBundle* resourceBundle); /** @@ -253,7 +263,7 @@ ures_getVersionNumber(const UResourceBundle* resourceBundle); * as specified in the resource bundle or its parent. * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ures_getVersion(const UResourceBundle* resB, UVersionInfo versionInfo); @@ -267,12 +277,31 @@ ures_getVersion(const UResourceBundle* resB, * @param resourceBundle resource bundle in question * @param status just for catching illegal arguments * @return A Locale name - * @stable ICU 2.0 + * @deprecated ICU 2.8 Use ures_getLocaleByType instead. */ -U_CAPI const char* U_EXPORT2 +U_DEPRECATED const char* U_EXPORT2 ures_getLocale(const UResourceBundle* resourceBundle, UErrorCode* status); + +/** + * Return the name of the Locale associated with this ResourceBundle. + * You can choose between requested, valid and real locale. + * + * @param resourceBundle resource bundle in question + * @param type You can choose between requested, valid and actual + * locale. For description see the definition of + * ULocDataLocaleType in uloc.h + * @param status just for catching illegal arguments + * @return A Locale name + * @draft ICU 2.8 + */ +U_DRAFT const char* U_EXPORT2 +ures_getLocaleByType(const UResourceBundle* resourceBundle, + ULocDataLocaleType type, + UErrorCode* status); + + /** * Same as ures_open() but uses the fill-in parameter instead of allocating * a bundle, if r!=NULL. @@ -286,7 +315,7 @@ ures_getLocale(const UResourceBundle* resourceBundle, * @return a newly allocated resource bundle or NULL if it doesn't exist. * @internal */ -U_CAPI void U_EXPORT2 +U_INTERNAL void U_EXPORT2 ures_openFillIn(UResourceBundle *r, const char* path, const char* localeID, @@ -298,7 +327,7 @@ ures_openFillIn(UResourceBundle *r, * @param resourceBundle a string resource * @param len fills in the length of resulting string * @param status fills in the outgoing error code - * could be U_MISSING_RESOURCE_ERROR if the key is not found + * could be U_MISSING_RESOURCE_ERROR if the key is not found * Always check the value of status. Don't count on returning NULL. * could be a non-failing error * e.g.: U_USING_FALLBACK_WARNING,U_USING_DEFAULT_WARNING @@ -309,7 +338,7 @@ ures_openFillIn(UResourceBundle *r, * @see ures_getUInt * @stable ICU 2.0 */ -U_CAPI const UChar* U_EXPORT2 +U_STABLE const UChar* U_EXPORT2 ures_getString(const UResourceBundle* resourceBundle, int32_t* len, UErrorCode* status); @@ -320,7 +349,7 @@ ures_getString(const UResourceBundle* resourceBundle, * @param resourceBundle a string resource * @param len fills in the length of resulting byte chunk * @param status fills in the outgoing error code - * could be U_MISSING_RESOURCE_ERROR if the key is not found + * could be U_MISSING_RESOURCE_ERROR if the key is not found * Always check the value of status. Don't count on returning NULL. * could be a non-failing error * e.g.: U_USING_FALLBACK_WARNING,U_USING_DEFAULT_WARNING @@ -331,7 +360,7 @@ ures_getString(const UResourceBundle* resourceBundle, * @see ures_getUInt * @stable ICU 2.0 */ -U_CAPI const uint8_t* U_EXPORT2 +U_STABLE const uint8_t* U_EXPORT2 ures_getBinary(const UResourceBundle* resourceBundle, int32_t* len, UErrorCode* status); @@ -342,7 +371,7 @@ ures_getBinary(const UResourceBundle* resourceBundle, * @param resourceBundle an int vector resource * @param len fills in the length of resulting byte chunk * @param status fills in the outgoing error code - * could be U_MISSING_RESOURCE_ERROR if the key is not found + * could be U_MISSING_RESOURCE_ERROR if the key is not found * Always check the value of status. Don't count on returning NULL. * could be a non-failing error * e.g.: U_USING_FALLBACK_WARNING,U_USING_DEFAULT_WARNING @@ -353,7 +382,7 @@ ures_getBinary(const UResourceBundle* resourceBundle, * @see ures_getUInt * @stable ICU 2.0 */ -U_CAPI const int32_t* U_EXPORT2 +U_STABLE const int32_t* U_EXPORT2 ures_getIntVector(const UResourceBundle* resourceBundle, int32_t* len, UErrorCode* status); @@ -364,7 +393,7 @@ ures_getIntVector(const UResourceBundle* resourceBundle, * * @param resourceBundle a string resource * @param status fills in the outgoing error code - * could be U_MISSING_RESOURCE_ERROR if the key is not found + * could be U_MISSING_RESOURCE_ERROR if the key is not found * could be a non-failing error * e.g.: U_USING_FALLBACK_WARNING,U_USING_DEFAULT_WARNING * @return an integer value @@ -374,7 +403,7 @@ ures_getIntVector(const UResourceBundle* resourceBundle, * @see ures_getString * @stable ICU 2.0 */ -U_CAPI uint32_t U_EXPORT2 +U_STABLE uint32_t U_EXPORT2 ures_getUInt(const UResourceBundle* resourceBundle, UErrorCode *status); @@ -384,7 +413,7 @@ ures_getUInt(const UResourceBundle* resourceBundle, * * @param resourceBundle a string resource * @param status fills in the outgoing error code - * could be U_MISSING_RESOURCE_ERROR if the key is not found + * could be U_MISSING_RESOURCE_ERROR if the key is not found * could be a non-failing error * e.g.: U_USING_FALLBACK_WARNING,U_USING_DEFAULT_WARNING * @return an integer value @@ -394,23 +423,22 @@ ures_getUInt(const UResourceBundle* resourceBundle, * @see ures_getString * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ures_getInt(const UResourceBundle* resourceBundle, UErrorCode *status); /** * Returns the size of a resource. Size for scalar types is always 1, * and for vector/table types is the number of child resources. - * @warning Currently, this function works correctly for string, table and - * array resources. For other types of resources, the result is - * undefined. This is a bug and will be fixed. - * + * @warning Integer array is treated as a scalar type. There are no + * APIs to access individual members of an integer array. It + * is always returned as a whole. * @param resourceBundle a resource * @return number of resources in a given resource. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 -ures_getSize(UResourceBundle *resourceBundle); +U_STABLE int32_t U_EXPORT2 +ures_getSize(const UResourceBundle *resourceBundle); /** * Returns the type of a resource. Available types are defined in enum UResType @@ -420,8 +448,8 @@ ures_getSize(UResourceBundle *resourceBundle); * @see UResType * @stable ICU 2.0 */ -U_CAPI UResType U_EXPORT2 -ures_getType(UResourceBundle *resourceBundle); +U_STABLE UResType U_EXPORT2 +ures_getType(const UResourceBundle *resourceBundle); /** * Returns the key associated with a given resource. Not all the resources have a key - only @@ -431,8 +459,8 @@ ures_getType(UResourceBundle *resourceBundle); * @return a key associated to this resource, or NULL if it doesn't have a key * @stable ICU 2.0 */ -U_CAPI const char * U_EXPORT2 -ures_getKey(UResourceBundle *resourceBundle); +U_STABLE const char * U_EXPORT2 +ures_getKey(const UResourceBundle *resourceBundle); /* ITERATION API This API provides means for iterating through a resource @@ -444,7 +472,7 @@ ures_getKey(UResourceBundle *resourceBundle); * @param resourceBundle a resource * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ures_resetIterator(UResourceBundle *resourceBundle); /** @@ -454,8 +482,8 @@ ures_resetIterator(UResourceBundle *resourceBundle); * @return TRUE if there are more elements, FALSE if there is no more elements * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 -ures_hasNext(UResourceBundle *resourceBundle); +U_STABLE UBool U_EXPORT2 +ures_hasNext(const UResourceBundle *resourceBundle); /** * Returns the next resource in a given resource or NULL if there are no more resources @@ -469,7 +497,7 @@ ures_hasNext(UResourceBundle *resourceBundle); * @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must delete it * @stable ICU 2.0 */ -U_CAPI UResourceBundle* U_EXPORT2 +U_STABLE UResourceBundle* U_EXPORT2 ures_getNextResource(UResourceBundle *resourceBundle, UResourceBundle *fillIn, UErrorCode *status); @@ -486,7 +514,7 @@ ures_getNextResource(UResourceBundle *resourceBundle, * @return a pointer to a zero-terminated UChar array which lives in a memory mapped/DLL file. * @stable ICU 2.0 */ -U_CAPI const UChar* U_EXPORT2 +U_STABLE const UChar* U_EXPORT2 ures_getNextString(UResourceBundle *resourceBundle, int32_t* len, const char ** key, @@ -504,7 +532,7 @@ ures_getNextString(UResourceBundle *resourceBundle, * @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must delete it * @stable ICU 2.0 */ -U_CAPI UResourceBundle* U_EXPORT2 +U_STABLE UResourceBundle* U_EXPORT2 ures_getByIndex(const UResourceBundle *resourceBundle, int32_t indexR, UResourceBundle *fillIn, @@ -521,7 +549,7 @@ ures_getByIndex(const UResourceBundle *resourceBundle, * @return a pointer to a zero-terminated UChar array which lives in a memory mapped/DLL file. * @stable ICU 2.0 */ -U_CAPI const UChar* U_EXPORT2 +U_STABLE const UChar* U_EXPORT2 ures_getStringByIndex(const UResourceBundle *resourceBundle, int32_t indexS, int32_t* len, @@ -539,7 +567,7 @@ ures_getStringByIndex(const UResourceBundle *resourceBundle, * @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must delete it * @stable ICU 2.0 */ -U_CAPI UResourceBundle* U_EXPORT2 +U_STABLE UResourceBundle* U_EXPORT2 ures_getByKey(const UResourceBundle *resourceBundle, const char* key, UResourceBundle *fillIn, @@ -557,7 +585,7 @@ ures_getByKey(const UResourceBundle *resourceBundle, * @return a pointer to a zero-terminated UChar array which lives in a memory mapped/DLL file. * @stable ICU 2.0 */ -U_CAPI const UChar* U_EXPORT2 +U_STABLE const UChar* U_EXPORT2 ures_getStringByKey(const UResourceBundle *resB, const char* key, int32_t* len, @@ -572,7 +600,7 @@ U_NAMESPACE_BEGIN * * @param resB a resource * @param status: fills in the outgoing error code - * could be U_MISSING_RESOURCE_ERROR if the key is not found + * could be U_MISSING_RESOURCE_ERROR if the key is not found * could be a non-failing error * e.g.: U_USING_FALLBACK_WARNING,U_USING_DEFAULT_WARNING * @return an UnicodeString object. If there is an error, string is bogus @@ -650,5 +678,42 @@ U_NAMESPACE_END #endif + +/** + * Get a resource with multi-level fallback. Normally only the top level resources will + * fallback to its parent. This performs fallback on subresources. For example, when a table + * is defined in a resource bundle and a parent resource bundle, normally no fallback occurs + * on the sub-resources because the table is defined in the current resource bundle, but this + * function can perform fallback on the sub-resources of the table. + * @param resB a resource + * @param inKey a key associated with the requested resource + * @param fillIn if NULL a new UResourceBundle struct is allocated and must be deleted by the caller. + * Alternatively, you can supply a struct to be filled by this function. + * @param status: fills in the outgoing error code + * could be U_MISSING_RESOURCE_ERROR if the key is not found + * could be a non-failing error + * e.g.: U_USING_FALLBACK_WARNING,U_USING_DEFAULT_WARNING + * @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must delete it + * @internal ICU 3.0 + */ +U_INTERNAL UResourceBundle* U_EXPORT2 +ures_getByKeyWithFallback(const UResourceBundle *resB, + const char* inKey, + UResourceBundle *fillIn, + UErrorCode *status); + + +/** + * Create a string enumerator, owned by the caller, of all locales located within + * the specified resource tree. + * @param path path to the tree, such as (NULL) or U_ICUDATA_ALIAS or or "ICUDATA-coll" + * This call is similar to uloc_getAvailable(). + * @param status error code + * @draft ICU 3.2 + */ +U_DRAFT UEnumeration* U_EXPORT2 +ures_openAvailableLocales(const char *path, UErrorCode *status); + + #endif /*_URES*/ /*eof*/ diff --git a/icuSources/common/unicode/uscript.h b/icuSources/common/unicode/uscript.h index 5985de89..f31d7480 100644 --- a/icuSources/common/unicode/uscript.h +++ b/icuSources/common/unicode/uscript.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1997-2003, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -14,12 +14,12 @@ */ #ifndef USCRIPT_H #define USCRIPT_H -#include "utypes.h" +#include "unicode/utypes.h" /** * Constants for Unicode script values from ScriptNames.txt . * - * @draft ICU 2.2 + * @stable ICU 2.2 */ typedef enum UScriptCode { USCRIPT_INVALID_CODE = -1, @@ -30,7 +30,7 @@ typedef enum UScriptCode { USCRIPT_BENGALI = 4, /* Beng */ USCRIPT_BOPOMOFO = 5, /* Bopo */ USCRIPT_CHEROKEE = 6, /* Cher */ - USCRIPT_COPTIC = 7, /* Qaac */ + USCRIPT_COPTIC = 7, /* Copt */ USCRIPT_CYRILLIC = 8, /* Cyrl (Cyrs) */ USCRIPT_DESERET = 9, /* Dsrt */ USCRIPT_DEVANAGARI = 10, /* Deva */ @@ -63,9 +63,9 @@ typedef enum UScriptCode { USCRIPT_THAANA = 37, /* Thaa */ USCRIPT_THAI = 38, /* Thai */ USCRIPT_TIBETAN = 39, /* Tibt */ - /** Canadian_Aboriginal script. @draft ICU 2.6 */ + /** Canadian_Aboriginal script. @stable ICU 2.6 */ USCRIPT_CANADIAN_ABORIGINAL = 40, /* Cans */ - /** Canadian_Aboriginal script (alias). @draft ICU 2.2 */ + /** Canadian_Aboriginal script (alias). @stable ICU 2.2 */ USCRIPT_UCAS = USCRIPT_CANADIAN_ABORIGINAL, USCRIPT_YI = 41, /* Yiii */ USCRIPT_TAGALOG = 42, /* Tglg */ @@ -73,7 +73,7 @@ typedef enum UScriptCode { USCRIPT_BUHID = 44, /* Buhd */ USCRIPT_TAGBANWA = 45, /* Tagb */ - /* New scripts in Unicode 4 @draft ICU 2.6 */ + /* New scripts in Unicode 4 @stable ICU 2.6 */ USCRIPT_BRAILLE, /* Brai */ USCRIPT_CYPRIOT, /* Cprt */ USCRIPT_LIMBU, /* Limb */ @@ -83,6 +83,9 @@ typedef enum UScriptCode { USCRIPT_TAI_LE, /* Tale */ USCRIPT_UGARITIC, /* Ugar */ + /** New script code in Unicode 4.0.1 @draft ICU 3.0 */ + USCRIPT_KATAKANA_OR_HIRAGANA,/*Hrkt */ + USCRIPT_CODE_LIMIT } UScriptCode; @@ -102,9 +105,9 @@ typedef enum UScriptCode { * @param capacity the capacity (size) fo UScriptCode buffer passed in. * @param err the error status code. * @return The number of script codes filled in the buffer passed in - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uscript_getCode(const char* nameOrAbbrOrLocale,UScriptCode* fillIn,int32_t capacity,UErrorCode *err); /** @@ -113,9 +116,9 @@ uscript_getCode(const char* nameOrAbbrOrLocale,UScriptCode* fillIn,int32_t capac * @param scriptCode UScriptCode enum * @return script long name as given in * PropertyValueAliases.txt, or NULL if scriptCode is invalid - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI const char* U_EXPORT2 +U_STABLE const char* U_EXPORT2 uscript_getName(UScriptCode scriptCode); /** @@ -124,9 +127,9 @@ uscript_getName(UScriptCode scriptCode); * @param scriptCode UScriptCode enum * @return script abbreviated name as given in * PropertyValueAliases.txt, or NULL if scriptCode is invalid - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI const char* U_EXPORT2 +U_STABLE const char* U_EXPORT2 uscript_getShortName(UScriptCode scriptCode); /** @@ -135,9 +138,9 @@ uscript_getShortName(UScriptCode scriptCode); * @param codepoint UChar32 codepoint * @param err the error status code. * @return The UScriptCode, or 0 if codepoint is invalid - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI UScriptCode U_EXPORT2 +U_STABLE UScriptCode U_EXPORT2 uscript_getScript(UChar32 codepoint, UErrorCode *err); #endif diff --git a/icuSources/common/unicode/uset.h b/icuSources/common/unicode/uset.h index 28f2fec0..b82ceb8f 100644 --- a/icuSources/common/unicode/uset.h +++ b/icuSources/common/unicode/uset.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2002-2003, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -28,34 +28,36 @@ #define __USET_H__ #include "unicode/utypes.h" +#include "unicode/uchar.h" #ifndef UCNV_H struct USet; /** * A UnicodeSet. Use the uset_* API to manipulate. Create with * uset_open*, and destroy with uset_close. - * @draft ICU 2.4 + * @stable ICU 2.4 */ typedef struct USet USet; #endif /** - * Bitmask values to be passed to the UnicodeSet constructor or - * applyPattern() taking an option parameter. - * @draft + * Bitmask values to be passed to uset_openPatternOptions() or + * uset_applyPattern() taking an option parameter. + * @stable ICU 2.4 */ enum { /** * Ignore white space within patterns unless quoted or escaped. - * @draft + * @stable ICU 2.4 */ USET_IGNORE_SPACE = 1, /** * Enable case insensitive matching. E.g., "[ab]" with this flag * will match 'a', 'A', 'b', and 'B'. "[^ab]" with this flag will - * match all except 'a', 'A', 'b', and 'B'. - * @draft + * match all except 'a', 'A', 'b', and 'B'. This performs a full + * closure over case mappings, e.g. U+017F for s. + * @stable ICU 2.4 */ USET_CASE_INSENSITIVE = 2, @@ -65,6 +67,17 @@ enum { * @internal */ USET_CASE = 2, + + /** + * Enable case insensitive matching. E.g., "[ab]" with this flag + * will match 'a', 'A', 'b', and 'B'. "[^ab]" with this flag will + * match all except 'a', 'A', 'b', and 'B'. This adds the lower-, + * title-, and uppercase mappings as well as the case folding + * of each existing element in the set. + * @draft ICU 3.2 + */ + USET_ADD_CASE_MAPPINGS = 4, + /** * Enough for any single-code point set * @internal @@ -75,27 +88,27 @@ enum { /** * A serialized form of a Unicode set. Limited manipulations are * possible directly on a serialized set. See below. - * @draft ICU 2.4 + * @stable ICU 2.4 */ typedef struct USerializedSet { /** * The serialized Unicode Set. - * @draft ICU 2.4 + * @stable ICU 2.4 */ const uint16_t *array; /** * The length of the array that contains BMP characters. - * @draft ICU 2.4 + * @stable ICU 2.4 */ int32_t bmpLength; /** * The total length of the array. - * @draft ICU 2.4 + * @stable ICU 2.4 */ int32_t length; /** * A small buffer for the array to reduce memory allocations. - * @draft ICU 2.4 + * @stable ICU 2.4 */ uint16_t staticArray[USET_SERIALIZED_STATIC_ARRAY_CAPACITY]; } USerializedSet; @@ -111,9 +124,9 @@ typedef struct USerializedSet { * @param end last character of the range, inclusive * @return a newly created USet. The caller must call uset_close() on * it when done. - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI USet* U_EXPORT2 +U_STABLE USet* U_EXPORT2 uset_open(UChar32 start, UChar32 end); /** @@ -123,9 +136,9 @@ uset_open(UChar32 start, UChar32 end); * @param patternLength the length of the pattern, or -1 if null * terminated * @param ec the error code - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI USet* U_EXPORT2 +U_STABLE USet* U_EXPORT2 uset_openPattern(const UChar* pattern, int32_t patternLength, UErrorCode* ec); @@ -138,9 +151,9 @@ uset_openPattern(const UChar* pattern, int32_t patternLength, * @param options bitmask for options to apply to the pattern. * Valid options are USET_IGNORE_SPACE and USET_CASE_INSENSITIVE. * @param ec the error code - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI USet* U_EXPORT2 +U_STABLE USet* U_EXPORT2 uset_openPatternOptions(const UChar* pattern, int32_t patternLength, uint32_t options, UErrorCode* ec); @@ -149,11 +162,126 @@ uset_openPatternOptions(const UChar* pattern, int32_t patternLength, * Disposes of the storage used by a USet object. This function should * be called exactly once for objects returned by uset_open(). * @param set the object to dispose of - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 uset_close(USet* set); +/** + * Causes the USet object to represent the range start - end. + * If start > end then this USet is set to an empty range. + * @param set the object to set to the given range + * @param start first character in the set, inclusive + * @param end last character in the set, inclusive + * @draft ICU 3.2 + */ +U_DRAFT void U_EXPORT2 +uset_set(USet* set, + UChar32 start, UChar32 end); + +/** + * Modifies the set to represent the set specified by the given + * pattern. See the UnicodeSet class description for the syntax of + * the pattern language. See also the User Guide chapter about UnicodeSet. + * Empties the set passed before applying the pattern. + * @param set The set to which the pattern is to be applied. + * @param pattern A pointer to UChar string specifying what characters are in the set. + * The character at pattern[0] must be a '['. + * @param patternLength The length of the UChar string. -1 if NUL terminated. + * @param options A bitmask for options to apply to the pattern. + * Valid options are USET_IGNORE_SPACE and USET_CASE_INSENSITIVE. + * @param status Returns an error if the pattern cannot be parsed. + * @return Upon successful parse, the value is either + * the index of the character after the closing ']' + * of the parsed pattern. + * If the status code indicates failure, then the return value + * is the index of the error in the source. + * + * @draft ICU 2.8 + */ +U_DRAFT int32_t U_EXPORT2 +uset_applyPattern(USet *set, + const UChar *pattern, int32_t patternLength, + uint32_t options, + UErrorCode *status); + +/** + * Modifies the set to contain those code points which have the given value + * for the given binary or enumerated property, as returned by + * u_getIntPropertyValue. Prior contents of this set are lost. + * + * @param set the object to contain the code points defined by the property + * + * @param prop a property in the range UCHAR_BIN_START..UCHAR_BIN_LIMIT-1 + * or UCHAR_INT_START..UCHAR_INT_LIMIT-1 + * or UCHAR_MASK_START..UCHAR_MASK_LIMIT-1. + * + * @param value a value in the range u_getIntPropertyMinValue(prop).. + * u_getIntPropertyMaxValue(prop), with one exception. If prop is + * UCHAR_GENERAL_CATEGORY_MASK, then value should not be a UCharCategory, but + * rather a mask value produced by U_GET_GC_MASK(). This allows grouped + * categories such as [:L:] to be represented. + * + * @param ec error code input/output parameter + * + * @draft ICU 3.2 + */ +U_DRAFT void U_EXPORT2 +uset_applyIntPropertyValue(USet* set, + UProperty prop, int32_t value, UErrorCode* ec); + +/** + * Modifies the set to contain those code points which have the + * given value for the given property. Prior contents of this + * set are lost. + * + * @param set the object to contain the code points defined by the given + * property and value alias + * + * @param prop a string specifying a property alias, either short or long. + * The name is matched loosely. See PropertyAliases.txt for names and a + * description of loose matching. If the value string is empty, then this + * string is interpreted as either a General_Category value alias, a Script + * value alias, a binary property alias, or a special ID. Special IDs are + * matched loosely and correspond to the following sets: + * + * "ANY" = [\\u0000-\\U0010FFFF], + * "ASCII" = [\\u0000-\\u007F]. + * + * @param propLength the length of the prop, or -1 if NULL + * + * @param value a string specifying a value alias, either short or long. + * The name is matched loosely. See PropertyValueAliases.txt for names + * and a description of loose matching. In addition to aliases listed, + * numeric values and canonical combining classes may be expressed + * numerically, e.g., ("nv", "0.5") or ("ccc", "220"). The value string + * may also be empty. + * + * @param valueLength the length of the value, or -1 if NULL + * + * @param ec error code input/output parameter + * + * @draft ICU 3.2 + */ +U_DRAFT void U_EXPORT2 +uset_applyPropertyAlias(USet* set, + const UChar *prop, int32_t propLength, + const UChar *value, int32_t valueLength, + UErrorCode* ec); + +/** + * Return true if the given position, in the given pattern, appears + * to be the start of a UnicodeSet pattern. + * + * @param pattern a string specifying the pattern + * @param patternLength the length of the pattern, or -1 if NULL + * @param pos the given position + * @draft ICU 3.2 + */ +U_DRAFT UBool U_EXPORT2 +uset_resemblesPattern(const UChar *pattern, int32_t patternLength, + int32_t pos); + /** * Returns a string representation of this set. If the result of * calling this function is passed to a uset_openPattern(), it @@ -162,14 +290,14 @@ uset_close(USet* set); * @param result the string to receive the rules, may be NULL * @param resultCapacity the capacity of result, may be 0 if result is NULL * @param escapeUnprintable if TRUE then convert unprintable - * character to their hex escape representations, \uxxxx or - * \Uxxxxxxxx. Unprintable characters are those other than + * character to their hex escape representations, \\uxxxx or + * \\Uxxxxxxxx. Unprintable characters are those other than * U+000A, U+0020..U+007E. * @param ec error code. * @return length of string, possibly larger than resultCapacity - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uset_toPattern(const USet* set, UChar* result, int32_t resultCapacity, UBool escapeUnprintable, @@ -180,9 +308,9 @@ uset_toPattern(const USet* set, * uset_contains(set, c) will return TRUE. * @param set the object to which to add the character * @param c the character to add - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 uset_add(USet* set, UChar32 c); /** @@ -194,9 +322,9 @@ uset_add(USet* set, UChar32 c); * * @param set the object to which to add the set * @param additionalSet the source set whose elements are to be added to this set. - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 uset_addAll(USet* set, const USet *additionalSet); /** @@ -205,9 +333,9 @@ uset_addAll(USet* set, const USet *additionalSet); * @param set the object to which to add the character * @param start the first character of the range to add, inclusive * @param end the last character of the range to add, inclusive - * @draft ICU 2.2 + * @stable ICU 2.2 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 uset_addRange(USet* set, UChar32 start, UChar32 end); /** @@ -216,9 +344,9 @@ uset_addRange(USet* set, UChar32 start, UChar32 end); * @param set the object to which to add the character * @param str the string to add * @param strLen the length of the string or -1 if null terminated. - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 uset_addString(USet* set, const UChar* str, int32_t strLen); /** @@ -226,9 +354,9 @@ uset_addString(USet* set, const UChar* str, int32_t strLen); * uset_contains(set, c) will return FALSE. * @param set the object from which to remove the character * @param c the character to remove - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 uset_remove(USet* set, UChar32 c); /** @@ -237,9 +365,9 @@ uset_remove(USet* set, UChar32 c); * @param set the object to which to add the character * @param start the first character of the range to remove, inclusive * @param end the last character of the range to remove, inclusive - * @draft ICU 2.2 + * @stable ICU 2.2 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 uset_removeRange(USet* set, UChar32 start, UChar32 end); /** @@ -248,28 +376,94 @@ uset_removeRange(USet* set, UChar32 start, UChar32 end); * @param set the object to which to add the character * @param str the string to remove * @param strLen the length of the string or -1 if null terminated. - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 uset_removeString(USet* set, const UChar* str, int32_t strLen); +/** + * Removes from this set all of its elements that are contained in the + * specified set. This operation effectively modifies this + * set so that its value is the asymmetric set difference of + * the two sets. + * @param set the object from which the elements are to be removed + * @param removeSet the object that defines which elements will be + * removed from this set + * @draft ICU 3.2 + */ +U_DRAFT void U_EXPORT2 +uset_removeAll(USet* set, const USet* removeSet); + +/** + * Retain only the elements in this set that are contained in the + * specified range. If start > end then an empty range is + * retained, leaving the set empty. This is equivalent to + * a boolean logic AND, or a set INTERSECTION. + * + * @param set the object for which to retain only the specified range + * @param start first character, inclusive, of range to be retained + * to this set. + * @param end last character, inclusive, of range to be retained + * to this set. + * @draft ICU 3.2 + */ +U_DRAFT void U_EXPORT2 +uset_retain(USet* set, UChar32 start, UChar32 end); + +/** + * Retains only the elements in this set that are contained in the + * specified set. In other words, removes from this set all of + * its elements that are not contained in the specified set. This + * operation effectively modifies this set so that its value is + * the intersection of the two sets. + * + * @param set the object on which to perform the retain + * @param retain set that defines which elements this set will retain + * @draft ICU 3.2 + */ +U_DRAFT void U_EXPORT2 +uset_retainAll(USet* set, const USet* retain); + +/** + * Reallocate this objects internal structures to take up the least + * possible space, without changing this object's value. + * + * @param set the object on which to perfrom the compact + * @draft ICU 3.2 + */ +U_DRAFT void U_EXPORT2 +uset_compact(USet* set); + /** * Inverts this set. This operation modifies this set so that * its value is its complement. This operation does not affect * the multicharacter strings, if any. * @param set the set - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 uset_complement(USet* set); +/** + * Complements in this set all elements contained in the specified + * set. Any character in the other set will be removed if it is + * in this set, or will be added if it is not in this set. + * + * @param set the set with which to complement + * @param complement set that defines which elements will be xor'ed + * from this set. + * @draft ICU 3.2 + */ +U_DRAFT void U_EXPORT2 +uset_complementAll(USet* set, const USet* complement); + /** * Removes all of the elements from this set. This set will be * empty after this call returns. * @param set the set - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 uset_clear(USet* set); /** @@ -277,9 +471,9 @@ uset_clear(USet* set); * strings. * @param set the set * @return true if set is empty - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 uset_isEmpty(const USet* set); /** @@ -287,9 +481,9 @@ uset_isEmpty(const USet* set); * @param set the set * @param c The codepoint to check for within the set * @return true if set contains c - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 uset_contains(const USet* set, UChar32 c); /** @@ -299,9 +493,9 @@ uset_contains(const USet* set, UChar32 c); * @param start the first character of the range to test, inclusive * @param end the last character of the range to test, inclusive * @return TRUE if set contains the range - * @draft ICU 2.2 + * @stable ICU 2.2 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 uset_containsRange(const USet* set, UChar32 start, UChar32 end); /** @@ -310,20 +504,46 @@ uset_containsRange(const USet* set, UChar32 start, UChar32 end); * @param str the string * @param strLen the length of the string or -1 if null terminated. * @return true if set contains str - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 uset_containsString(const USet* set, const UChar* str, int32_t strLen); +/** + * Returns the index of the given character within this set, where + * the set is ordered by ascending code point. If the character + * is not in this set, return -1. The inverse of this method is + * charAt(). + * @param set the set + * @param c the character to obtain the index for + * @return an index from 0..size()-1, or -1 + * @draft ICU 3.2 + */ +U_DRAFT int32_t U_EXPORT2 +uset_indexOf(const USet* set, UChar32 c); + +/** + * Returns the character at the given index within this set, where + * the set is ordered by ascending code point. If the index is + * out of range, return (UChar32)-1. The inverse of this method is + * indexOf(). + * @param set the set + * @param index an index from 0..size()-1 to obtain the char for + * @return the character at the given index, or (UChar32)-1. + * @draft ICU 3.2 + */ +U_DRAFT UChar32 U_EXPORT2 +uset_charAt(const USet* set, int32_t index); + /** * Returns the number of characters and strings contained in the given * USet. * @param set the set * @return a non-negative integer counting the characters and strings * contained in set - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uset_size(const USet* set); /** @@ -332,9 +552,9 @@ uset_size(const USet* set); * @param set the set * @return a non-negative integer counting the character ranges * and/or strings contained in set - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uset_getItemCount(const USet* set); /** @@ -353,14 +573,58 @@ uset_getItemCount(const USet* set); * @return the length of the string (>= 2), or 0 if the item is a * range, in which case it is the range *start..*end, or -1 if * itemIndex is out of range - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uset_getItem(const USet* set, int32_t itemIndex, UChar32* start, UChar32* end, UChar* str, int32_t strCapacity, UErrorCode* ec); +/** + * Returns true if set1 contains all the characters and strings + * of set2. It answers the question, 'Is set1 a subset of set2?' + * @param set1 set to be checked for containment + * @param set2 set to be checked for containment + * @return true if the test condition is met + * @draft ICU 3.2 + */ +U_DRAFT UBool U_EXPORT2 +uset_containsAll(const USet* set1, const USet* set2); + +/** + * Returns true if set1 contains none of the characters and strings + * of set2. It answers the question, 'Is set1 a disjoint set of set2?' + * @param set1 set to be checked for containment + * @param set2 set to be checked for containment + * @return true if the test condition is met + * @draft ICU 3.2 + */ +U_DRAFT UBool U_EXPORT2 +uset_containsNone(const USet* set1, const USet* set2); + +/** + * Returns true if set1 contains some of the characters and strings + * of set2. It answers the question, 'Does set1 and set2 have an intersection?' + * @param set1 set to be checked for containment + * @param set2 set to be checked for containment + * @return true if the test condition is met + * @draft ICU 3.2 + */ +U_DRAFT UBool U_EXPORT2 +uset_containsSome(const USet* set1, const USet* set2); + +/** + * Returns true if set1 contains all of the characters and strings + * of set2, and vis versa. It answers the question, 'Is set1 equal to set2?' + * @param set1 set to be checked for containment + * @param set2 set to be checked for containment + * @return true if the test condition is met + * @draft ICU 3.2 + */ +U_DRAFT UBool U_EXPORT2 +uset_equals(const USet* set1, const USet* set2); + /********************************************************************* * Serialized set API *********************************************************************/ @@ -412,9 +676,9 @@ uset_getItem(const USet* set, int32_t itemIndex, * @return the total length of the serialized format, including * the header, that is, n+2*m+(m!=0?2:1), or 0 on error other * than U_BUFFER_OVERFLOW_ERROR. - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uset_serialize(const USet* set, uint16_t* dest, int32_t destCapacity, UErrorCode* pErrorCode); /** @@ -423,9 +687,9 @@ uset_serialize(const USet* set, uint16_t* dest, int32_t destCapacity, UErrorCode * @param src pointer to start of array * @param srcLength length of array * @return true if the given array is valid, otherwise false - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 uset_getSerializedSet(USerializedSet* fillSet, const uint16_t* src, int32_t srcLength); /** @@ -433,9 +697,9 @@ uset_getSerializedSet(USerializedSet* fillSet, const uint16_t* src, int32_t srcL * else). * @param fillSet pointer to result * @param c The codepoint to set - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 uset_setSerializedToOne(USerializedSet* fillSet, UChar32 c); /** @@ -444,9 +708,9 @@ uset_setSerializedToOne(USerializedSet* fillSet, UChar32 c); * @param set the serialized set * @param c The codepoint to check for within the set * @return true if set contains c - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 uset_serializedContains(const USerializedSet* set, UChar32 c); /** @@ -456,9 +720,9 @@ uset_serializedContains(const USerializedSet* set, UChar32 c); * @param set the serialized set * @return a non-negative integer counting the character ranges * contained in set - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uset_getSerializedRangeCount(const USerializedSet* set); /** @@ -472,9 +736,9 @@ uset_getSerializedRangeCount(const USerializedSet* set); * @param pEnd pointer to variable to receive last character in range, * inclusive * @return true if rangeIndex is valid, otherwise false - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 uset_getSerializedRange(const USerializedSet* set, int32_t rangeIndex, UChar32* pStart, UChar32* pEnd); diff --git a/icuSources/common/unicode/usetiter.h b/icuSources/common/unicode/usetiter.h index b161d9aa..9584b748 100644 --- a/icuSources/common/unicode/usetiter.h +++ b/icuSources/common/unicode/usetiter.h @@ -1,10 +1,8 @@ /* ********************************************************************** -* Copyright (c) 2002-2003, International Business Machines +* Copyright (c) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** -* $Source: /cvs/root/ICU/icuSources/common/unicode/usetiter.h,v $ -********************************************************************** */ #ifndef USETITER_H #define USETITER_H @@ -48,24 +46,24 @@ class UnicodeString; * } * * @author M. Davis - * @draft ICU 2.2 + * @stable ICU 2.4 */ class U_COMMON_API UnicodeSetIterator : public UObject { protected: - + /** * Value of codepoint if the iterator points to a string. * If codepoint == IS_STRING, then examine * string for the current iteration result. - * @draft ICU 2.4 + * @stable ICU 2.4 */ enum { IS_STRING = -1 }; /** * Current code point, or the special value IS_STRING, if * the iterator points to a string. - * @draft ICU 2.4 + * @stable ICU 2.4 */ UChar32 codepoint; @@ -76,7 +74,7 @@ class U_COMMON_API UnicodeSetIterator : public UObject { * iterating over code points using next(), or if * codepoint == IS_STRING, then the value of * codepointEnd is undefined. - * @draft ICU 2.4 + * @stable ICU 2.4 */ UChar32 codepointEnd; @@ -84,7 +82,7 @@ class U_COMMON_API UnicodeSetIterator : public UObject { * If codepoint == IS_STRING, then string points * to the current string. If codepoint != IS_STRING, the * value of string is undefined. - * @draft ICU 2.4 + * @stable ICU 2.4 */ const UnicodeString* string; @@ -94,21 +92,21 @@ class U_COMMON_API UnicodeSetIterator : public UObject { * Create an iterator over the given set. The iterator is valid * only so long as set is valid. * @param set set to iterate over - * @draft ICU 2.4 + * @stable ICU 2.4 */ UnicodeSetIterator(const UnicodeSet& set); - + /** * Create an iterator over nothing. next() and * nextRange() return false. This is a convenience * constructor allowing the target to be set later. - * @draft ICU 2.4 + * @stable ICU 2.4 */ UnicodeSetIterator(); - + /** * Destructor. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual ~UnicodeSetIterator(); @@ -120,14 +118,14 @@ class U_COMMON_API UnicodeSetIterator : public UObject { * nextRange() was called, and the caller can retrieve it * with getCodepoint() and, for a range, * getCodepointEnd(). - * @draft ICU 2.4 + * @stable ICU 2.4 */ inline UBool isString() const; /** * Returns the current code point, if isString() returned * false. Otherwise returns an undefined result. - * @draft ICU 2.4 + * @stable ICU 2.4 */ inline UChar32 getCodepoint() const; @@ -135,14 +133,14 @@ class U_COMMON_API UnicodeSetIterator : public UObject { * Returns the end of the current code point range, if * isString() returned false and nextRange() was * called. Otherwise returns an undefined result. - * @draft ICU 2.4 + * @stable ICU 2.4 */ inline UChar32 getCodepointEnd() const; /** * Returns the current string, if isString() returned * true. Otherwise returns an undefined result. - * @draft ICU 2.4 + * @stable ICU 2.4 */ inline const UnicodeString& getString() const; @@ -152,7 +150,7 @@ class U_COMMON_API UnicodeSetIterator : public UObject { * false. If codepoint == IS_STRING, the value is a * string in the string field. Otherwise the value is a * single code point in the codepoint field. - * + * *

    The order of iteration is all code points in sorted order, * followed by all strings sorted order. codepointEnd is * undefined after calling this method. string is @@ -163,10 +161,10 @@ class U_COMMON_API UnicodeSetIterator : public UObject { * * @return true if there was another element in the set and this * object contains the element. - * @draft ICU 2.4 + * @stable ICU 2.4 */ UBool next(); - + /** * Returns the next element in the set, either a code point range * or a string. If there are no more elements in the set, return @@ -174,7 +172,7 @@ class U_COMMON_API UnicodeSetIterator : public UObject { * string in the string field. Otherwise the value is a * range of one or more code points from codepoint to * codepointeEnd inclusive. - * + * *

    The order of iteration is all code points ranges in sorted * order, followed by all strings sorted order. Ranges are * disjoint and non-contiguous. string is undefined @@ -185,108 +183,93 @@ class U_COMMON_API UnicodeSetIterator : public UObject { * * @return true if there was another element in the set and this * object contains the element. - * @draft ICU 2.4 + * @stable ICU 2.4 */ UBool nextRange(); - + /** * Sets this iterator to visit the elements of the given set and * resets it to the start of that set. The iterator is valid only * so long as set is valid. * @param set the set to iterate over. - * @draft ICU 2.4 + * @stable ICU 2.4 */ void reset(const UnicodeSet& set); - + /** * Resets this iterator to the start of the set. - * @draft ICU 2.4 + * @stable ICU 2.4 */ void reset(); - + /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. + * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.4 */ - virtual inline UClassID getDynamicClassID() const; + static UClassID U_EXPORT2 getStaticClassID(); /** - * ICU "poor man's RTTI", returns a UClassID for this class. + * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.4 */ - static inline UClassID getStaticClassID(); + virtual UClassID getDynamicClassID() const; // ======================= PRIVATES =========================== - + protected: // endElement and nextElements are really UChar32's, but we keep // them as signed int32_t's so we can do comparisons with // endElement set to -1. Leave them as int32_t's. /** The set - * @draft ICU 2.4 + * @stable ICU 2.4 */ const UnicodeSet* set; /** End range - * @draft ICU 2.4 + * @stable ICU 2.4 */ int32_t endRange; /** Range - * @draft ICU 2.4 + * @stable ICU 2.4 */ int32_t range; /** End element - * @draft ICU 2.4 + * @stable ICU 2.4 */ int32_t endElement; /** Next element - * @draft ICU 2.4 + * @stable ICU 2.4 */ int32_t nextElement; //UBool abbreviated; /** Next string - * @draft ICU 2.4 + * @stable ICU 2.4 */ int32_t nextString; /** String count - * @draft ICU 2.4 + * @stable ICU 2.4 */ int32_t stringCount; /** Copy constructor. Disallowed. - * @draft ICU 2.4 + * @stable ICU 2.4 */ UnicodeSetIterator(const UnicodeSetIterator&); // disallow /** Assignment operator. Disallowed. - * @draft ICU 2.4 + * @stable ICU 2.4 */ UnicodeSetIterator& operator=(const UnicodeSetIterator&); // disallow /** Load range - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual void loadRange(int32_t range); -private: - - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; -inline UClassID -UnicodeSetIterator::getStaticClassID() -{ return (UClassID)&fgClassID; } - -inline UClassID -UnicodeSetIterator::getDynamicClassID() const -{ return UnicodeSetIterator::getStaticClassID(); } - inline UBool UnicodeSetIterator::isString() const { return codepoint == (UChar32)IS_STRING; } diff --git a/icuSources/common/unicode/ushape.h b/icuSources/common/unicode/ushape.h index 25911074..34e81e34 100644 --- a/icuSources/common/unicode/ushape.h +++ b/icuSources/common/unicode/ushape.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 2000-2001, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -96,7 +96,7 @@ * the return value indicates the necessary destination buffer size. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_shapeArabic(const UChar *source, int32_t sourceLength, UChar *dest, int32_t destSize, uint32_t options, diff --git a/icuSources/common/unicode/usprep.h b/icuSources/common/unicode/usprep.h new file mode 100644 index 00000000..5bedc11f --- /dev/null +++ b/icuSources/common/unicode/usprep.h @@ -0,0 +1,155 @@ +/* + ******************************************************************************* + * + * Copyright (C) 2003-2004, International Business Machines + * Corporation and others. All Rights Reserved. + * + ******************************************************************************* + * file name: usprep.h + * encoding: US-ASCII + * tab size: 8 (not used) + * indentation:4 + * + * created on: 2003jul2 + * created by: Ram Viswanadha + */ + +#ifndef __USPREP_H__ +#define __USPREP_H__ + +#include "unicode/utypes.h" +/** + *\file + * StringPrep API implements the StingPrep framework as described by RFC 3454. + * StringPrep prepares Unicode strings for use in network protocols. + * Profiles of StingPrep are set of rules and data according to with the + * Unicode Strings are prepared. Each profiles contains tables which describe + * how a code point should be treated. The tables are broadly classied into + *

      + *
    • Unassinged Table: Contains code points that are unassigned + * in the Unicode Version supported by StringPrep. Currently + * RFC 3454 supports Unicode 3.2.
    • + *
    • Prohibited Table: Contains code points that are prohibted from + * the output of the StringPrep processing function.
    • + *
    • Mapping Table: Contains code ponts that are deleted from the output or case mapped.
    • + *
    + * + * The procedure for preparing Unicode strings: + *
      + *
    1. Map: For each character in the input, check if it has a mapping + * and, if so, replace it with its mapping.
    2. + *
    3. Normalize: Possibly normalize the result of step 1 using Unicode + * normalization.
    4. + *
    5. Prohibit: Check for any characters that are not allowed in the + * output. If any are found, return an error.
    6. + *
    7. Check bidi: Possibly check for right-to-left characters, and if + * any are found, make sure that the whole string satisfies the + * requirements for bidirectional strings. If the string does not + * satisfy the requirements for bidirectional strings, return an + * error.
    8. + *
    + * @author Ram Viswanadha + */ +#if !UCONFIG_NO_IDNA + +#include "unicode/parseerr.h" + +#ifndef U_HIDE_DRAFT_API + +/** + * The StringPrep profile + * @draft ICU 2.8 + */ +typedef struct UStringPrepProfile UStringPrepProfile; + + +/** + * Option to prohibit processing of unassigned code points in the input + * + * @see usprep_prepare + * @draft ICU 2.8 + */ +#define USPREP_DEFAULT 0x0000 + +/** + * Option to allow processing of unassigned code points in the input + * + * @see usprep_prepare + * @draft ICU 2.8 + */ +#define USPREP_ALLOW_UNASSIGNED 0x0001 + + +#endif /*U_HIDE_DRAFT_API*/ + +/** + * Creates a StringPrep profile from the data file. + * + * @param path string containing the full path pointing to the directory + * where the profile reside followed by the package name + * e.g. "/usr/resource/my_app/profiles/mydata" on a Unix system. + * if NULL, ICU default data files will be used. + * @param fileName name of the profile file to be opened + * @param status ICU error code in/out parameter. Must not be NULL. + * Must fulfill U_SUCCESS before the function call. + * @return Pointer to UStringPrepProfile that is opened. Should be closed by + * calling usprep_close() + * @see usprep_close() + * @draft ICU 2.8 + */ +U_DRAFT UStringPrepProfile* U_EXPORT2 +usprep_open(const char* path, + const char* fileName, + UErrorCode* status); + + +/** + * Closes the profile + * @param profile The profile to close + * @draft ICU 2.8 + */ +U_DRAFT void U_EXPORT2 +usprep_close(UStringPrepProfile* profile); + + +/** + * Prepare the input buffer for use in applications with the given profile. This operation maps, normalizes(NFKC), + * checks for prohited and BiDi characters in the order defined by RFC 3454 + * depending on the options specified in the profile. + * + * @param prep The profile to use + * @param src Pointer to UChar buffer containing the string to prepare + * @param srcLength Number of characters in the source string + * @param dest Pointer to the destination buffer to receive the output + * @param destCapacity The capacity of destination array + * @param options A bit set of options: + * + * - USPREP_NONE Prohibit processing of unassigned code points in the input + * + * - USPREP_ALLOW_UNASSIGNED Treat the unassigned code points are in the input + * as normal Unicode code points. + * + * @param parseError Pointer to UParseError struct to receive information on position + * of error if an error is encountered. Can be NULL. + * @param status ICU in/out error code parameter. + * U_INVALID_CHAR_FOUND if src contains + * unmatched single surrogates. + * U_INDEX_OUTOFBOUNDS_ERROR if src contains + * too many code points. + * U_BUFFER_OVERFLOW_ERROR if destCapacity is not enough + * @return The number of UChars in the destination buffer + * @draft ICU 2.8 + */ + +U_DRAFT int32_t U_EXPORT2 +usprep_prepare( const UStringPrepProfile* prep, + const UChar* src, int32_t srcLength, + UChar* dest, int32_t destCapacity, + int32_t options, + UParseError* parseError, + UErrorCode* status ); + + +#endif /* #if !UCONFIG_NO_IDNA */ + +#endif diff --git a/icuSources/common/unicode/ustring.h b/icuSources/common/unicode/ustring.h index bf8a959a..6ebb6fbe 100644 --- a/icuSources/common/unicode/ustring.h +++ b/icuSources/common/unicode/ustring.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1998-2003, International Business Machines +* Copyright (C) 1998-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -17,12 +17,13 @@ #define USTRING_H #include "unicode/utypes.h" +#include "unicode/putil.h" #include "unicode/uiter.h" /** Simple declaration for u_strToTitle() to avoid including unicode/ubrk.h. @stable ICU 2.1*/ #ifndef UBRK_TYPEDEF_UBREAK_ITERATOR # define UBRK_TYPEDEF_UBREAK_ITERATOR - typedef void *UBreakIterator; + typedef void UBreakIterator; #endif /** @@ -76,7 +77,7 @@ * @return The number of UChars in chars, minus the terminator. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_strlen(const UChar *s); /** @@ -92,7 +93,7 @@ u_strlen(const UChar *s); * @return The number of code points in the specified code units. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_countChar32(const UChar *s, int32_t length); /** @@ -111,9 +112,9 @@ u_countChar32(const UChar *s, int32_t length); * the 'number' parameter. * @return Boolean value for whether the string contains more Unicode code points * than 'number'. Same as (u_countChar32(s, length)>number). - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 u_strHasMoreChar32Than(const UChar *s, int32_t length, int32_t number); /** @@ -126,7 +127,7 @@ u_strHasMoreChar32Than(const UChar *s, int32_t length, int32_t number); * @return A pointer to dst. * @stable ICU 2.0 */ -U_CAPI UChar* U_EXPORT2 +U_STABLE UChar* U_EXPORT2 u_strcat(UChar *dst, const UChar *src); @@ -144,7 +145,7 @@ u_strcat(UChar *dst, * @return A pointer to dst. * @stable ICU 2.0 */ -U_CAPI UChar* U_EXPORT2 +U_STABLE UChar* U_EXPORT2 u_strncat(UChar *dst, const UChar *src, int32_t n); @@ -169,7 +170,7 @@ u_strncat(UChar *dst, * @see u_strFindFirst * @see u_strFindLast */ -U_CAPI UChar * U_EXPORT2 +U_STABLE UChar * U_EXPORT2 u_strstr(const UChar *s, const UChar *substring); /** @@ -188,12 +189,12 @@ u_strstr(const UChar *s, const UChar *substring); * @return A pointer to the first occurrence of substring in s, * or s itself if the substring is empty, * or NULL if substring is not in s. - * @draft ICU 2.4 + * @stable ICU 2.4 * * @see u_strstr * @see u_strFindLast */ -U_CAPI UChar * U_EXPORT2 +U_STABLE UChar * U_EXPORT2 u_strFindFirst(const UChar *s, int32_t length, const UChar *substring, int32_t subLength); /** @@ -213,7 +214,7 @@ u_strFindFirst(const UChar *s, int32_t length, const UChar *substring, int32_t s * @see u_strstr * @see u_strFindFirst */ -U_CAPI UChar * U_EXPORT2 +U_STABLE UChar * U_EXPORT2 u_strchr(const UChar *s, UChar c); /** @@ -233,7 +234,7 @@ u_strchr(const UChar *s, UChar c); * @see u_strstr * @see u_strFindFirst */ -U_CAPI UChar * U_EXPORT2 +U_STABLE UChar * U_EXPORT2 u_strchr32(const UChar *s, UChar32 c); /** @@ -250,13 +251,13 @@ u_strchr32(const UChar *s, UChar32 c); * @return A pointer to the last occurrence of substring in s, * or s itself if the substring is empty, * or NULL if substring is not in s. - * @draft ICU 2.4 + * @stable ICU 2.4 * * @see u_strstr * @see u_strFindFirst * @see u_strFindLast */ -U_CAPI UChar * U_EXPORT2 +U_STABLE UChar * U_EXPORT2 u_strrstr(const UChar *s, const UChar *substring); /** @@ -275,12 +276,12 @@ u_strrstr(const UChar *s, const UChar *substring); * @return A pointer to the last occurrence of substring in s, * or s itself if the substring is empty, * or NULL if substring is not in s. - * @draft ICU 2.4 + * @stable ICU 2.4 * * @see u_strstr * @see u_strFindLast */ -U_CAPI UChar * U_EXPORT2 +U_STABLE UChar * U_EXPORT2 u_strFindLast(const UChar *s, int32_t length, const UChar *substring, int32_t subLength); /** @@ -293,14 +294,14 @@ u_strFindLast(const UChar *s, int32_t length, const UChar *substring, int32_t su * @param c The BMP code point to find. * @return A pointer to the last occurrence of c in s * or NULL if c is not in s. - * @draft ICU 2.4 + * @stable ICU 2.4 * * @see u_strrchr32 * @see u_memrchr * @see u_strrstr * @see u_strFindLast */ -U_CAPI UChar * U_EXPORT2 +U_STABLE UChar * U_EXPORT2 u_strrchr(const UChar *s, UChar c); /** @@ -313,14 +314,14 @@ u_strrchr(const UChar *s, UChar c); * @param c The code point to find. * @return A pointer to the last occurrence of c in s * or NULL if c is not in s. - * @draft ICU 2.4 + * @stable ICU 2.4 * * @see u_strrchr * @see u_memchr32 * @see u_strrstr * @see u_strFindLast */ -U_CAPI UChar * U_EXPORT2 +U_STABLE UChar * U_EXPORT2 u_strrchr32(const UChar *s, UChar32 c); /** @@ -335,7 +336,7 @@ u_strrchr32(const UChar *s, UChar32 c); * characters in matchSet, or NULL if no such character is found. * @stable ICU 2.0 */ -U_CAPI UChar * U_EXPORT2 +U_STABLE UChar * U_EXPORT2 u_strpbrk(const UChar *string, const UChar *matchSet); /** @@ -351,7 +352,7 @@ u_strpbrk(const UChar *string, const UChar *matchSet); * @see u_strspn * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_strcspn(const UChar *string, const UChar *matchSet); /** @@ -367,7 +368,7 @@ u_strcspn(const UChar *string, const UChar *matchSet); * @see u_strcspn * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_strspn(const UChar *string, const UChar *matchSet); /** @@ -395,7 +396,7 @@ u_strspn(const UChar *string, const UChar *matchSet); * when there are no more tokens. * @stable ICU 2.0 */ -U_CAPI UChar * U_EXPORT2 +U_STABLE UChar * U_EXPORT2 u_strtok_r(UChar *src, const UChar *delim, UChar **saveState); @@ -406,11 +407,11 @@ u_strtok_r(UChar *src, * @param s1 A string to compare. * @param s2 A string to compare. * @return 0 if s1 and s2 are bitwise equal; a negative - * value if s1 is bitwise less than s2,/code>; a positive + * value if s1 is bitwise less than s2,; a positive * value if s1 is bitwise greater than s2. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_strcmp(const UChar *s1, const UChar *s2); @@ -425,7 +426,7 @@ u_strcmp(const UChar *s1, * in code point order * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_strcmpCodePointOrder(const UChar *s1, const UChar *s2); /** @@ -453,9 +454,9 @@ u_strcmpCodePointOrder(const UChar *s1, const UChar *s2); * * @return <0 or 0 or >0 as usual for string comparisons * - * @draft ICU 2.2 + * @stable ICU 2.2 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_strCompare(const UChar *s1, int32_t length1, const UChar *s2, int32_t length2, UBool codePointOrder); @@ -478,9 +479,9 @@ u_strCompare(const UChar *s1, int32_t length1, * * @see u_strCompare * - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_strCompareIter(UCharIterator *iter1, UCharIterator *iter2, UBool codePointOrder); #ifndef U_COMPARE_CODE_POINT_ORDER @@ -488,7 +489,7 @@ u_strCompareIter(UCharIterator *iter1, UCharIterator *iter2, UBool codePointOrde /** * Option bit for u_strCaseCompare, u_strcasecmp, unorm_compare, etc: * Compare strings in code point order instead of code unit order. - * @draft ICU 2.2 + * @stable ICU 2.2 */ #define U_COMPARE_CODE_POINT_ORDER 0x8000 #endif @@ -531,9 +532,9 @@ u_strCompareIter(UCharIterator *iter1, UCharIterator *iter2, UBool codePointOrde * * @return <0 or 0 or >0 as usual for string comparisons * - * @draft ICU 2.2 + * @stable ICU 2.2 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_strCaseCompare(const UChar *s1, int32_t length1, const UChar *s2, int32_t length2, uint32_t options, @@ -547,11 +548,11 @@ u_strCaseCompare(const UChar *s1, int32_t length1, * @param ucs2 A string to compare. * @param n The maximum number of characters to compare. * @return 0 if s1 and s2 are bitwise equal; a negative - * value if s1 is bitwise less than s2,/code>; a positive - * value if s1 is bitwise greater than s2,/code>. + * value if s1 is bitwise less than s2; a positive + * value if s1 is bitwise greater than s2. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_strncmp(const UChar *ucs1, const UChar *ucs2, int32_t n); @@ -569,7 +570,7 @@ u_strncmp(const UChar *ucs1, * in code point order * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_strncmpCodePointOrder(const UChar *s1, const UChar *s2, int32_t n); /** @@ -591,7 +592,7 @@ u_strncmpCodePointOrder(const UChar *s1, const UChar *s2, int32_t n); * @return A negative, zero, or positive integer indicating the comparison result. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_strcasecmp(const UChar *s1, const UChar *s2, uint32_t options); /** @@ -615,7 +616,7 @@ u_strcasecmp(const UChar *s1, const UChar *s2, uint32_t options); * @return A negative, zero, or positive integer indicating the comparison result. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_strncasecmp(const UChar *s1, const UChar *s2, int32_t n, uint32_t options); /** @@ -639,7 +640,7 @@ u_strncasecmp(const UChar *s1, const UChar *s2, int32_t n, uint32_t options); * @return A negative, zero, or positive integer indicating the comparison result. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_memcasecmp(const UChar *s1, const UChar *s2, int32_t length, uint32_t options); /** @@ -650,7 +651,7 @@ u_memcasecmp(const UChar *s1, const UChar *s2, int32_t length, uint32_t options) * @return A pointer to dst. * @stable ICU 2.0 */ -U_CAPI UChar* U_EXPORT2 +U_STABLE UChar* U_EXPORT2 u_strcpy(UChar *dst, const UChar *src); @@ -665,11 +666,13 @@ u_strcpy(UChar *dst, * @return A pointer to dst. * @stable ICU 2.0 */ -U_CAPI UChar* U_EXPORT2 +U_STABLE UChar* U_EXPORT2 u_strncpy(UChar *dst, const UChar *src, int32_t n); +#if !UCONFIG_NO_CONVERSION + /** * Copy a byte string encoded in the default codepage to a ustring. * Adds a null terminator. @@ -680,7 +683,7 @@ u_strncpy(UChar *dst, * @return A pointer to dst. * @stable ICU 2.0 */ -U_CAPI UChar* U_EXPORT2 u_uastrcpy(UChar *dst, +U_STABLE UChar* U_EXPORT2 u_uastrcpy(UChar *dst, const char *src ); /** @@ -695,7 +698,7 @@ U_CAPI UChar* U_EXPORT2 u_uastrcpy(UChar *dst, * @return A pointer to dst. * @stable ICU 2.0 */ -U_CAPI UChar* U_EXPORT2 u_uastrncpy(UChar *dst, +U_STABLE UChar* U_EXPORT2 u_uastrncpy(UChar *dst, const char *src, int32_t n); @@ -709,7 +712,7 @@ U_CAPI UChar* U_EXPORT2 u_uastrncpy(UChar *dst, * @return A pointer to dst. * @stable ICU 2.0 */ -U_CAPI char* U_EXPORT2 u_austrcpy(char *dst, +U_STABLE char* U_EXPORT2 u_austrcpy(char *dst, const UChar *src ); /** @@ -724,10 +727,12 @@ U_CAPI char* U_EXPORT2 u_austrcpy(char *dst, * @return A pointer to dst. * @stable ICU 2.0 */ -U_CAPI char* U_EXPORT2 u_austrncpy(char *dst, +U_STABLE char* U_EXPORT2 u_austrncpy(char *dst, const UChar *src, int32_t n ); +#endif + /** * Synonym for memcpy(), but with UChars only. * @param dest The destination string @@ -736,7 +741,7 @@ U_CAPI char* U_EXPORT2 u_austrncpy(char *dst, * @return A pointer to dest * @stable ICU 2.0 */ -U_CAPI UChar* U_EXPORT2 +U_STABLE UChar* U_EXPORT2 u_memcpy(UChar *dest, const UChar *src, int32_t count); /** @@ -747,7 +752,7 @@ u_memcpy(UChar *dest, const UChar *src, int32_t count); * @return A pointer to dest * @stable ICU 2.0 */ -U_CAPI UChar* U_EXPORT2 +U_STABLE UChar* U_EXPORT2 u_memmove(UChar *dest, const UChar *src, int32_t count); /** @@ -759,7 +764,7 @@ u_memmove(UChar *dest, const UChar *src, int32_t count); * @return A pointer to dest. * @stable ICU 2.0 */ -U_CAPI UChar* U_EXPORT2 +U_STABLE UChar* U_EXPORT2 u_memset(UChar *dest, UChar c, int32_t count); /** @@ -773,7 +778,7 @@ u_memset(UChar *dest, UChar c, int32_t count); * When buf1 > buf2, a positive number is returned. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_memcmp(const UChar *buf1, const UChar *buf2, int32_t count); /** @@ -789,7 +794,7 @@ u_memcmp(const UChar *buf1, const UChar *buf2, int32_t count); * in code point order * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_memcmpCodePointOrder(const UChar *s1, const UChar *s2, int32_t count); /** @@ -809,7 +814,7 @@ u_memcmpCodePointOrder(const UChar *s1, const UChar *s2, int32_t count); * @see u_memchr32 * @see u_strFindFirst */ -U_CAPI UChar* U_EXPORT2 +U_STABLE UChar* U_EXPORT2 u_memchr(const UChar *s, UChar c, int32_t count); /** @@ -829,7 +834,7 @@ u_memchr(const UChar *s, UChar c, int32_t count); * @see u_memchr * @see u_strFindFirst */ -U_CAPI UChar* U_EXPORT2 +U_STABLE UChar* U_EXPORT2 u_memchr32(const UChar *s, UChar32 c, int32_t count); /** @@ -843,13 +848,13 @@ u_memchr32(const UChar *s, UChar32 c, int32_t count); * @param count The length of the string. * @return A pointer to the last occurrence of c in s * or NULL if c is not in s. - * @draft ICU 2.4 + * @stable ICU 2.4 * * @see u_strrchr * @see u_memrchr32 * @see u_strFindLast */ -U_CAPI UChar* U_EXPORT2 +U_STABLE UChar* U_EXPORT2 u_memrchr(const UChar *s, UChar c, int32_t count); /** @@ -863,13 +868,13 @@ u_memrchr(const UChar *s, UChar c, int32_t count); * @param count The length of the string. * @return A pointer to the last occurrence of c in s * or NULL if c is not in s. - * @draft ICU 2.4 + * @stable ICU 2.4 * * @see u_strrchr32 * @see u_memrchr * @see u_strFindLast */ -U_CAPI UChar* U_EXPORT2 +U_STABLE UChar* U_EXPORT2 u_memrchr32(const UChar *s, UChar32 c, int32_t count); /** @@ -927,24 +932,24 @@ u_memrchr32(const UChar *s, UChar32 c, int32_t count); * Unicode characters to the destination buffer. The following escape * sequences are recognized: * - * \uhhhh 4 hex digits; h in [0-9A-Fa-f] - * \Uhhhhhhhh 8 hex digits - * \xhh 1-2 hex digits - * \x{h...} 1-8 hex digits - * \ooo 1-3 octal digits; o in [0-7] - * \cX control-X; X is masked with 0x1F + * \\uhhhh 4 hex digits; h in [0-9A-Fa-f] + * \\Uhhhhhhhh 8 hex digits + * \\xhh 1-2 hex digits + * \\x{h...} 1-8 hex digits + * \\ooo 1-3 octal digits; o in [0-7] + * \\cX control-X; X is masked with 0x1F * * as well as the standard ANSI C escapes: * - * \a => U+0007, \b => U+0008, \t => U+0009, \n => U+000A, - * \v => U+000B, \f => U+000C, \r => U+000D, \e => U+001B, - * \" => U+0022, \' => U+0027, \? => U+003F, \\ => U+005C + * \\a => U+0007, \\b => U+0008, \\t => U+0009, \\n => U+000A, + * \\v => U+000B, \\f => U+000C, \\r => U+000D, \\e => U+001B, + * \\" => U+0022, \\' => U+0027, \\? => U+003F, \\\\ => U+005C * * Anything else following a backslash is generically escaped. For - * example, "[a\-z]" returns "[a-z]". + * example, "[a\\-z]" returns "[a-z]". * * If an escape sequence is ill-formed, this method returns an empty - * string. An example of an ill-formed sequence is "\u" followed by + * string. An example of an ill-formed sequence is "\\u" followed by * fewer than 4 hex digits. * * The above characters are recognized in the compiler's codepage, @@ -969,7 +974,7 @@ u_memrchr32(const UChar *s, UChar32 c, int32_t count); * @see UnicodeString#unescapeAt() * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_unescape(const char *src, UChar *dest, int32_t destCapacity); @@ -1017,7 +1022,7 @@ U_CDECL_END * @see UnicodeString#unescapeAt() * @stable ICU 2.0 */ -U_CAPI UChar32 U_EXPORT2 +U_STABLE UChar32 U_EXPORT2 u_unescapeAt(UNESCAPE_CHAR_AT charAt, int32_t *offset, int32_t length, @@ -1043,7 +1048,7 @@ u_unescapeAt(UNESCAPE_CHAR_AT charAt, * only some of the result was written to the destination buffer. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_strToUpper(UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, const char *locale, @@ -1069,7 +1074,7 @@ u_strToUpper(UChar *dest, int32_t destCapacity, * only some of the result was written to the destination buffer. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_strToLower(UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, const char *locale, @@ -1115,7 +1120,7 @@ u_strToLower(UChar *dest, int32_t destCapacity, * only some of the result was written to the destination buffer. * @stable ICU 2.1 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_strToTitle(UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, UBreakIterator *titleIter, @@ -1146,7 +1151,7 @@ u_strToTitle(UChar *dest, int32_t destCapacity, * only some of the result was written to the destination buffer. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_strFoldCase(UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, uint32_t options, @@ -1171,7 +1176,7 @@ u_strFoldCase(UChar *dest, int32_t destCapacity, * @return The pointer to destination buffer. * @stable ICU 2.0 */ -U_CAPI wchar_t* U_EXPORT2 +U_STABLE wchar_t* U_EXPORT2 u_strToWCS(wchar_t *dest, int32_t destCapacity, int32_t *pDestLength, @@ -1197,7 +1202,7 @@ u_strToWCS(wchar_t *dest, * @return The pointer to destination buffer. * @stable ICU 2.0 */ -U_CAPI UChar* U_EXPORT2 +U_STABLE UChar* U_EXPORT2 u_strFromWCS(UChar *dest, int32_t destCapacity, int32_t *pDestLength, @@ -1223,7 +1228,7 @@ u_strFromWCS(UChar *dest, * @return The pointer to destination buffer. * @stable ICU 2.0 */ -U_CAPI char* U_EXPORT2 +U_STABLE char* U_EXPORT2 u_strToUTF8(char *dest, int32_t destCapacity, int32_t *pDestLength, @@ -1250,7 +1255,7 @@ u_strToUTF8(char *dest, * @return The pointer to destination buffer. * @stable ICU 2.0 */ -U_CAPI UChar* U_EXPORT2 +U_STABLE UChar* U_EXPORT2 u_strFromUTF8(UChar *dest, int32_t destCapacity, int32_t *pDestLength, @@ -1277,7 +1282,7 @@ u_strFromUTF8(UChar *dest, * @return The pointer to destination buffer. * @stable ICU 2.0 */ -U_CAPI UChar32* U_EXPORT2 +U_STABLE UChar32* U_EXPORT2 u_strToUTF32(UChar32 *dest, int32_t destCapacity, int32_t *pDestLength, @@ -1304,7 +1309,7 @@ u_strToUTF32(UChar32 *dest, * @return The pointer to destination buffer. * @stable ICU 2.0 */ -U_CAPI UChar* U_EXPORT2 +U_STABLE UChar* U_EXPORT2 u_strFromUTF32(UChar *dest, int32_t destCapacity, int32_t *pDestLength, diff --git a/icuSources/common/unicode/utf.h b/icuSources/common/unicode/utf.h index a47d5c1c..201691d0 100644 --- a/icuSources/common/unicode/utf.h +++ b/icuSources/common/unicode/utf.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -16,11 +16,13 @@ /** * \file - * \brief C API: UChar and UChar32 data types and code point macros + * \brief C API: Code point macros * - * This file defines the UChar and UChar32 data types for Unicode code units - * and code points, as well as macros for checking whether a code point is - * a surrogate or a non-character. + * This file defines macros for checking whether a code point is + * a surrogate or a non-character etc. + * + * The UChar and UChar32 data types for Unicode code units and code points + * are defined in umachines.h because they can be machine-dependent. * * utf.h is included by utypes.h and itself includes utf8.h and utf16.h after some * common definitions. Those files define macros for efficiently getting code points @@ -90,117 +92,15 @@ * Compound statements (curly braces {}) must be used for if-else-while... * bodies and all macro statements should be terminated with semicolon. * - * @draft ICU 2.4 + * @stable ICU 2.4 */ #ifndef __UTF_H__ #define __UTF_H__ -/* wchar_t-related definitions ---------------------------------------------- */ - -/* - * ANSI C headers: - * stddef.h defines wchar_t - */ -#include "unicode/umachine.h" -#include +#include "unicode/utypes.h" /* include the utfXX.h after the following definitions */ -/** - * \def U_HAVE_WCHAR_H - * Indicates whether is available (1) or not (0). Set to 1 by default. - * - * @stable ICU 2.0 - */ -#ifndef U_HAVE_WCHAR_H -# define U_HAVE_WCHAR_H 1 -#endif - -/** - * \def U_SIZEOF_WCHAR_T - * U_SIZEOF_WCHAR_T==sizeof(wchar_t) (0 means it is not defined or autoconf could not set it) - * - * @stable ICU 2.0 - */ -#if U_SIZEOF_WCHAR_T==0 -# undef U_SIZEOF_WCHAR_T -# define U_SIZEOF_WCHAR_T 4 -#endif - -/* - * \def U_WCHAR_IS_UTF16 - * Defined if wchar_t uses UTF-16. - * - * @stable ICU 2.0 - */ -/* - * \def U_WCHAR_IS_UTF32 - * Defined if wchar_t uses UTF-32. - * - * @stable ICU 2.0 - */ -#if !defined(U_WCHAR_IS_UTF16) && !defined(U_WCHAR_IS_UTF32) -# ifdef __STDC_ISO_10646__ -# if (U_SIZEOF_WCHAR_T==2) -# define U_WCHAR_IS_UTF16 -# elif (U_SIZEOF_WCHAR_T==4) -# define U_WCHAR_IS_UTF32 -# endif -# elif defined __UCS2__ -# if (__OS390__ || __OS400__) && (U_SIZEOF_WCHAR_T==2) -# define U_WCHAR_IS_UTF16 -# endif -# elif defined __UCS4__ -# if (U_SIZEOF_WCHAR_T==4) -# define U_WCHAR_IS_UTF32 -# endif -# elif defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) -# define U_WCHAR_IS_UTF16 -# endif -#endif - -/* UChar and UChar32 definitions -------------------------------------------- */ - -/** Number of bytes in a UChar. @stable ICU 2.0 */ -#define U_SIZEOF_UCHAR 2 - -/** - * \var UChar - * Define UChar to be wchar_t if that is 16 bits wide; always assumed to be unsigned. - * If wchar_t is not 16 bits wide, then define UChar to be uint16_t. - * This makes the definition of UChar platform-dependent - * but allows direct string type compatibility with platforms with - * 16-bit wchar_t types. - * - * @stable ICU 2.0 - */ - -/* Define UChar to be compatible with wchar_t if possible. */ -#if U_SIZEOF_WCHAR_T==2 - typedef wchar_t UChar; -#else - typedef uint16_t UChar; -#endif - -/** - * Define UChar32 as a type for single Unicode code points. - * UChar32 is a signed 32-bit integer (same as int32_t). - * - * The Unicode code point range is 0..0x10ffff. - * All other values (negative or >=0x110000) are illegal as Unicode code points. - * They may be used as sentinel values to indicate "done", "error" - * or similar non-code point conditions. - * - * Before ICU 2.4 (Jitterbug 2146), UChar32 was defined - * to be wchar_t if that is 32 bits wide (wchar_t may be signed or unsigned) - * or else to be uint32_t. - * That is, the definition of UChar32 was platform-dependent. - * - * @see U_SENTINEL - * @draft ICU 2.4 - */ -typedef int32_t UChar32; - /* single-code point definitions -------------------------------------------- */ /** @@ -219,7 +119,7 @@ typedef int32_t UChar32; * * @return -1 * @see UChar32 - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U_SENTINEL (-1) @@ -227,7 +127,7 @@ typedef int32_t UChar32; * Is this code point a Unicode noncharacter? * @param c 32-bit code point * @return TRUE or FALSE - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U_IS_UNICODE_NONCHAR(c) \ ((c)>=0xfdd0 && \ @@ -249,7 +149,7 @@ typedef int32_t UChar32; * * @param c 32-bit code point * @return TRUE or FALSE - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U_IS_UNICODE_CHAR(c) \ ((uint32_t)(c)<0xd800 || \ @@ -257,11 +157,31 @@ typedef int32_t UChar32; (uint32_t)(c)<=0x10ffff && \ !U_IS_UNICODE_NONCHAR(c))) +#ifndef U_HIDE_DRAFT_API + +/** + * Is this code point a BMP code point (U+0000..U+ffff)? + * @param c 32-bit code point + * @return TRUE or FALSE + * @draft ICU 2.8 + */ +#define U_IS_BMP(c) ((uint32_t)(c)<=0xffff) + +/** + * Is this code point a supplementary code point (U+10000..U+10ffff)? + * @param c 32-bit code point + * @return TRUE or FALSE + * @draft ICU 2.8 + */ +#define U_IS_SUPPLEMENTARY(c) ((uint32_t)((c)-0x10000)<=0xfffff) + +#endif /*U_HIDE_DRAFT_API*/ + /** * Is this code point a lead surrogate (U+d800..U+dbff)? * @param c 32-bit code point * @return TRUE or FALSE - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U_IS_LEAD(c) (((c)&0xfffffc00)==0xd800) @@ -269,7 +189,7 @@ typedef int32_t UChar32; * Is this code point a trail surrogate (U+dc00..U+dfff)? * @param c 32-bit code point * @return TRUE or FALSE - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00) @@ -277,7 +197,7 @@ typedef int32_t UChar32; * Is this code point a surrogate (U+d800..U+dfff)? * @param c 32-bit code point * @return TRUE or FALSE - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800) @@ -286,7 +206,7 @@ typedef int32_t UChar32; * is it a lead surrogate? * @param c 32-bit code point * @return TRUE or FALSE - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U_IS_SURROGATE_LEAD(c) (((c)&0x400)==0) diff --git a/icuSources/common/unicode/utf16.h b/icuSources/common/unicode/utf16.h index eb3f5dde..7bf38720 100644 --- a/icuSources/common/unicode/utf16.h +++ b/icuSources/common/unicode/utf16.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1999-2001, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -31,21 +31,21 @@ * bodies and all macro statements should be terminated with semicolon. */ +#ifndef __UTF16_H__ +#define __UTF16_H__ + /* utf.h must be included first. */ #ifndef __UTF_H__ # include "unicode/utf.h" #endif -#ifndef __UTF16_H__ -#define __UTF16_H__ - /* single-code point definitions -------------------------------------------- */ /** * Does this code unit alone encode a code point (BMP, not a surrogate)? * @param c 16-bit code unit * @return TRUE or FALSE - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U16_IS_SINGLE(c) !U_IS_SURROGATE(c) @@ -53,7 +53,7 @@ * Is this code unit a lead surrogate (U+d800..U+dbff)? * @param c 16-bit code unit * @return TRUE or FALSE - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800) @@ -61,7 +61,7 @@ * Is this code unit a trail surrogate (U+dc00..U+dfff)? * @param c 16-bit code unit * @return TRUE or FALSE - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00) @@ -69,7 +69,7 @@ * Is this code unit a surrogate (U+d800..U+dfff)? * @param c 16-bit code unit * @return TRUE or FALSE - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U16_IS_SURROGATE(c) U_IS_SURROGATE(c) @@ -78,7 +78,7 @@ * is it a lead surrogate? * @param c 16-bit code unit * @return TRUE or FALSE - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U16_IS_SURROGATE_LEAD(c) (((c)&0x400)==0) @@ -97,10 +97,10 @@ * @param lead lead surrogate (U+d800..U+dbff) * @param trail trail surrogate (U+dc00..U+dfff) * @return supplementary code point (U+10000..U+10ffff) - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U16_GET_SUPPLEMENTARY(lead, trail) \ - (((lead)<<10UL)+(trail)-U16_SURROGATE_OFFSET) + (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET) /** @@ -108,7 +108,7 @@ * supplementary code point (0x10000..0x10ffff). * @param supplementary 32-bit code point (U+10000..U+10ffff) * @return lead surrogate (U+d800..U+dbff) for supplementary - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U16_LEAD(supplementary) (UChar)(((supplementary)>>10)+0xd7c0) @@ -117,7 +117,7 @@ * supplementary code point (0x10000..0x10ffff). * @param supplementary 32-bit code point (U+10000..U+10ffff) * @return trail surrogate (U+dc00..U+dfff) for supplementary - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U16_TRAIL(supplementary) (UChar)(((supplementary)&0x3ff)|0xdc00) @@ -126,14 +126,14 @@ * The result is not defined if c is not a Unicode code point (U+0000..U+10ffff). * @param c 32-bit code point * @return 1 or 2 - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2) /** * The maximum number of 16-bit code units per Unicode code point (U+0000..U+10ffff). * @return 2 - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U16_MAX_LENGTH 2 @@ -152,7 +152,7 @@ * @param i string offset * @param c output UChar32 variable * @see U16_GET - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U16_GET_UNSAFE(s, i, c) { \ (c)=(s)[i]; \ @@ -183,7 +183,7 @@ * @param length string length * @param c output UChar32 variable * @see U16_GET_UNSAFE - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U16_GET(s, start, i, length, c) { \ (c)=(s)[i]; \ @@ -220,7 +220,7 @@ * @param i string offset * @param c output UChar32 variable * @see U16_NEXT - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U16_NEXT_UNSAFE(s, i, c) { \ (c)=(s)[(i)++]; \ @@ -247,7 +247,7 @@ * @param length string length * @param c output UChar32 variable * @see U16_NEXT_UNSAFE - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U16_NEXT(s, i, length, c) { \ (c)=(s)[(i)++]; \ @@ -271,7 +271,7 @@ * @param i string offset * @param c code point to append * @see U16_APPEND - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U16_APPEND_UNSAFE(s, i, c) { \ if((uint32_t)(c)<=0xffff) { \ @@ -297,7 +297,7 @@ * @param c code point to append * @param isError output UBool set to TRUE if an error occurs, otherwise not modified * @see U16_APPEND_UNSAFE - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U16_APPEND(s, i, capacity, c, isError) { \ if((uint32_t)(c)<=0xffff) { \ @@ -318,7 +318,7 @@ * @param s const UChar * string * @param i string offset * @see U16_FWD_1 - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U16_FWD_1_UNSAFE(s, i) { \ if(U16_IS_LEAD((s)[(i)++])) { \ @@ -335,7 +335,7 @@ * @param i string offset, i(start) && U16_IS_LEAD((s)[(i)-1])) { \ @@ -443,7 +443,7 @@ * @param i string offset * @param c output UChar32 variable * @see U16_PREV - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U16_PREV_UNSAFE(s, i, c) { \ (c)=(s)[--(i)]; \ @@ -471,7 +471,7 @@ * @param i string offset, start<=i * @param c output UChar32 variable * @see U16_PREV_UNSAFE - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U16_PREV(s, start, i, c) { \ (c)=(s)[--(i)]; \ @@ -493,7 +493,7 @@ * @param s const UChar * string * @param i string offset * @see U16_BACK_1 - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U16_BACK_1_UNSAFE(s, i) { \ if(U16_IS_TRAIL((s)[--(i)])) { \ @@ -511,7 +511,7 @@ * @param start starting string offset (usually 0) * @param i string offset, start<=i * @see U16_BACK_1_UNSAFE - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U16_BACK_1(s, start, i) { \ if(U16_IS_TRAIL((s)[--(i)]) && (i)>(start) && U16_IS_LEAD((s)[(i)-1])) { \ @@ -530,7 +530,7 @@ * @param i string offset * @param n number of code points to skip * @see U16_BACK_N - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U16_BACK_N_UNSAFE(s, i, n) { \ int32_t __N=(n); \ @@ -552,7 +552,7 @@ * @param i string offset, i=0x80) { \ + if(((uint8_t)(c))>=0x80) { \ if(U8_IS_LEAD(c)) { \ - (c)=utf8_nextCharSafeBody(s, &(i), (int32_t)(length), c, -1); \ + (c)=utf8_nextCharSafeBody((const uint8_t *)s, &(i), (int32_t)(length), c, -1); \ } else { \ (c)=U_SENTINEL; \ } \ @@ -266,11 +267,11 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); * "Unsafe" macro, assumes a valid code point and sufficient space in the string. * Otherwise, the result is undefined. * - * @param s const UChar * string buffer + * @param s const uint8_t * string buffer * @param i string offset * @param c code point to append * @see U8_APPEND - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U8_APPEND_UNSAFE(s, i, c) { \ if((uint32_t)(c)<=0x7f) { \ @@ -300,13 +301,13 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); * If the code point is not valid or trail bytes do not fit, * then isError is set to TRUE. * - * @param s const UChar * string buffer + * @param s const uint8_t * string buffer * @param i string offset, i * *

    This concept has been abandoned. - * A lot of the ICU source code — especially low-level code like - * conversion, normalization, and collation — assumes UTF-16, + * A lot of the ICU source code — especially low-level code like + * conversion, normalization, and collation — assumes UTF-16, * utf.h enforces the default of UTF-16. * The UTF-8 and UTF-32 macros remain for now for completeness and backward compatibility.

    * @@ -137,14 +137,16 @@ * @deprecated ICU 2.4. Use the macros in utf.h, utf16.h, utf8.h instead. */ +#ifndef __UTF_OLD_H__ +#define __UTF_OLD_H__ + +#ifndef U_HIDE_DEPRECATED_API + /* utf.h must be included first. */ #ifndef __UTF_H__ # include "unicode/utf.h" #endif -#ifndef __UTF_OLD_H__ -#define __UTF_OLD_H__ - /* Formerly utf.h, part 1 --------------------------------------------------- */ #ifdef U_USE_UTF_DEPRECATES @@ -324,16 +326,16 @@ typedef int32_t UTextOffset; /** @deprecated ICU 2.4. Renamed to U8_GET_UNSAFE, see utf_old.h. */ #define UTF8_GET_CHAR_UNSAFE(s, i, c) { \ - int32_t __I=(int32_t)(i); \ - UTF8_SET_CHAR_START_UNSAFE(s, __I); \ - UTF8_NEXT_CHAR_UNSAFE(s, __I, c); \ + int32_t _utf8_get_char_unsafe_index=(int32_t)(i); \ + UTF8_SET_CHAR_START_UNSAFE(s, _utf8_get_char_unsafe_index); \ + UTF8_NEXT_CHAR_UNSAFE(s, _utf8_get_char_unsafe_index, c); \ } /** @deprecated ICU 2.4. Use U8_GET instead, see utf_old.h. */ #define UTF8_GET_CHAR_SAFE(s, start, i, length, c, strict) { \ - int32_t __I=(int32_t)(i); \ - UTF8_SET_CHAR_START_SAFE(s, start, __I); \ - UTF8_NEXT_CHAR_SAFE(s, __I, length, c, strict); \ + int32_t _utf8_get_char_safe_index=(int32_t)(i); \ + UTF8_SET_CHAR_START_SAFE(s, start, _utf8_get_char_safe_index); \ + UTF8_NEXT_CHAR_SAFE(s, _utf8_get_char_safe_index, length, c, strict); \ } /** @deprecated ICU 2.4. Renamed to U8_NEXT_UNSAFE, see utf_old.h. */ @@ -1157,4 +1159,7 @@ typedef int32_t UTextOffset; */ #define UTF_SET_CHAR_LIMIT(s, start, i, length) U16_SET_CP_LIMIT(s, start, i, length) +#endif /* U_HIDE_DEPRECATED_API */ + #endif + diff --git a/icuSources/common/unicode/utrace.h b/icuSources/common/unicode/utrace.h new file mode 100644 index 00000000..cf21b982 --- /dev/null +++ b/icuSources/common/unicode/utrace.h @@ -0,0 +1,351 @@ +/* +******************************************************************************* +* +* Copyright (C) 2003-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: utrace.h +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2003aug06 +* created by: Markus W. Scherer +* +* Definitions for ICU tracing/logging. +* +*/ + +#ifndef __UTRACE_H__ +#define __UTRACE_H__ + +#include +#include "unicode/utypes.h" + +U_CDECL_BEGIN + +#ifndef U_HIDE_DRAFT_API + +/** + * Trace severity levels. Higher levels increase the verbosity of the trace output. + * @see utrace_setLevel + * @draft ICU 2.8 + */ +typedef enum UTraceLevel { + /** Disable all tracing @draft ICU 2.8*/ + UTRACE_OFF=-1, + /** Trace error conditions only @draft ICU 2.8*/ + UTRACE_ERROR=0, + /** Trace errors and warnings @draft ICU 2.8*/ + UTRACE_WARNING=3, + /** Trace opens and closes of ICU services @draft ICU 2.8*/ + UTRACE_OPEN_CLOSE=5, + /** Trace an intermediate number of ICU operations @draft ICU 2.8*/ + UTRACE_INFO=7, + /** Trace the maximum number of ICU operations @draft ICU 2.8*/ + UTRACE_VERBOSE=9 +} UTraceLevel; + +/** + * These are the ICU functions that will be traced when tracing is enabled. + * @draft ICU 2.8 + */ +typedef enum UTraceFunctionNumber { + UTRACE_FUNCTION_START=0, + UTRACE_U_INIT=UTRACE_FUNCTION_START, + UTRACE_U_CLEANUP, + UTRACE_FUNCTION_LIMIT, + + UTRACE_CONVERSION_START=0x1000, + UTRACE_UCNV_OPEN=UTRACE_CONVERSION_START, + UTRACE_UCNV_OPEN_PACKAGE, + UTRACE_UCNV_OPEN_ALGORITHMIC, + UTRACE_UCNV_CLONE, + UTRACE_UCNV_CLOSE, + UTRACE_UCNV_FLUSH_CACHE, + UTRACE_UCNV_LOAD, + UTRACE_UCNV_UNLOAD, + UTRACE_CONVERSION_LIMIT, + + UTRACE_COLLATION_START=0x2000, + UTRACE_UCOL_OPEN=UTRACE_COLLATION_START, + UTRACE_UCOL_CLOSE, + UTRACE_UCOL_STRCOLL, + UTRACE_UCOL_GET_SORTKEY, + UTRACE_UCOL_GETLOCALE, + UTRACE_UCOL_NEXTSORTKEYPART, + UTRACE_UCOL_STRCOLLITER, + UTRACE_UCOL_OPEN_FROM_SHORT_STRING, + UTRACE_COLLATION_LIMIT +} UTraceFunctionNumber; + +#endif /*U_HIDE_DRAFT_API*/ + +/** + * Setter for the trace level. + * @param traceLevel A UTraceLevel value. + * @draft ICU 2.8 + */ +U_DRAFT void U_EXPORT2 +utrace_setLevel(int32_t traceLevel); + +/** + * Getter for the trace level. + * @return The UTraceLevel value being used by ICU. + * @draft ICU 2.8 + */ +U_DRAFT int32_t U_EXPORT2 +utrace_getLevel(void); + +/* Trace function pointers types ----------------------------- */ + +/** + * Type signature for the trace function to be called when entering a function. + * @param context value supplied at the time the trace functions are set. + * @param fnNumber Enum value indicating the ICU function being entered. + * @draft ICU 2.8 + */ +typedef void U_CALLCONV +UTraceEntry(const void *context, int32_t fnNumber); + +/** + * Type signature for the trace function to be called when exiting from a function. + * @param context value supplied at the time the trace functions are set. + * @param fnNumber Enum value indicating the ICU function being exited. + * @param fmt A formatting string that describes the number and types + * of arguments included with the variable args. The fmt + * string has the same form as the utrace_vformat format + * string. + * @param args A variable arguments list. Contents are described by + * the fmt parameter. + * @see utrace_vformat + * @draft ICU 2.8 + */ +typedef void U_CALLCONV +UTraceExit(const void *context, int32_t fnNumber, + const char *fmt, va_list args); + +/** + * Type signature for the trace function to be called from within an ICU function + * to display data or messages. + * @param context value supplied at the time the trace functions are set. + * @param fnNumber Enum value indicating the ICU function being exited. + * @param level The current tracing level + * @param fmt A format string describing the tracing data that is supplied + * as variable args + * @param args The data being traced, passed as variable args. + * @draft ICU 2.8 + */ +typedef void U_CALLCONV +UTraceData(const void *context, int32_t fnNumber, int32_t level, + const char *fmt, va_list args); + +/** + * Set ICU Tracing functions. Installs application-provided tracing + * functions into ICU. After doing this, subsequent ICU operations + * will call back to the installed functions, providing a trace + * of the use of ICU. Passing a NULL pointer for a tracing function + * is allowed, and inhibits tracing action at points where that function + * would be called. + *

    + * Tracing and Threads: Tracing functions are global to a process, and + * will be called in response to ICU operations performed by any + * thread. If tracing of an individual thread is desired, the + * tracing functions must themselves filter by checking that the + * current thread is the desired thread. + * + * @param context an uninterpretted pointer. Whatever is passed in + * here will in turn be passed to each of the tracing + * functions UTraceEntry, UTraceExit and UTraceData. + * ICU does not use or alter this pointer. + * @param e Callback function to be called on entry to a + * a traced ICU function. + * @param x Callback function to be called on exit from a + * traced ICU function. + * @param d Callback function to be called from within a + * traced ICU function, for the purpose of providing + * data to the trace. + * + * @draft ICU 2.8 + */ +U_DRAFT void U_EXPORT2 +utrace_setFunctions(const void *context, + UTraceEntry *e, UTraceExit *x, UTraceData *d); + +/** + * Get the currently installed ICU tracing functions. Note that a null function + * pointer will be returned if no trace function has been set. + * + * @param context The currently installed tracing context. + * @param e The currently installed UTraceEntry function. + * @param x The currently installed UTraceExit function. + * @param d The currently installed UTraceData function. + * @draft ICU 2.8 + */ +U_DRAFT void U_EXPORT2 +utrace_getFunctions(const void **context, + UTraceEntry **e, UTraceExit **x, UTraceData **d); + + + +/* + * + * ICU trace format string syntax + * + * Format Strings are passed to UTraceData functions, and define the + * number and types of the trace data being passed on each call. + * + * The UTraceData function, which is supplied by the application, + * not by ICU, can either forward the trace data (passed via + * varargs) and the format string back to ICU for formatting into + * a displayable string, or it can interpret the format itself, + * and do as it wishes with the trace data. + * + * + * Goals for the format string + * - basic data output + * - easy to use for trace programmer + * - sufficient provision for data types for trace output readability + * - well-defined types and binary portable APIs + * + * Non-goals + * - printf compatibility + * - fancy formatting + * - argument reordering and other internationalization features + * + * ICU trace format strings contain plain text with argument inserts, + * much like standard printf format strings. + * Each insert begins with a '%', then optionally contains a 'v', + * then exactly one type character. + * Two '%' in a row represent a '%' instead of an insert. + * The trace format strings need not have \n at the end. + * + * + * Types + * ----- + * + * Type characters: + * - c A char character in the default codepage. + * - s A NUL-terminated char * string in the default codepage. + * - S A UChar * string. Requires two params, (ptr, length). Length=-1 for nul term. + * - b A byte (8-bit integer). + * - h A 16-bit integer. Also a 16 bit Unicode code unit. + * - d A 32-bit integer. Also a 20 bit Unicode code point value. + * - l A 64-bit integer. + * - p A data pointer. + * + * Vectors + * ------- + * + * If the 'v' is not specified, then one item of the specified type + * is passed in. + * If the 'v' (for "vector") is specified, then a vector of items of the + * specified type is passed in, via a pointer to the first item + * and an int32_t value for the length of the vector. + * Length==-1 means zero or NUL termination. Works for vectors of all types. + * + * Note: %vS is a vector of (UChar *) strings. The strings must + * be nul terminated as there is no way to provide a + * separate length parameter for each string. The length + * parameter (required for all vectors) is the number of + * strings, not the length of the strings. + * + * Examples + * -------- + * + * These examples show the parameters that will be passed to an application's + * UTraceData() function for various formats. + * + * - the precise formatting is up to the application! + * - the examples use type casts for arguments only to _show_ the types of + * arguments without needing variable declarations in the examples; + * the type casts will not be necessary in actual code + * + * UTraceDataFunc(context, fnNumber, level, + * "There is a character %c in the string %s.", // Format String + * (char)c, (const char *)s); // varargs parameters + * -> There is a character 0x42 'B' in the string "Bravo". + * + * UTraceDataFunc(context, fnNumber, level, + * "Vector of bytes %vb vector of chars %vc", + * (const uint8_t *)bytes, (int32_t)bytesLength, + * (const char *)chars, (int32_t)charsLength); + * -> Vector of bytes + * 42 63 64 3f [4] + * vector of chars + * "Bcd?"[4] + * + * UTraceDataFunc(context, fnNumber, level, + * "An int32_t %d and a whole bunch of them %vd", + * (int32_t)-5, (const int32_t *)ints, (int32_t)intsLength); + * -> An int32_t 0xfffffffb and a whole bunch of them + * fffffffb 00000005 0000010a [3] + * + */ + + + +/** + * Trace output Formatter. An application's UTraceData tracing functions may call + * back to this function to format the trace output in a + * human readable form. Note that a UTraceData function may choose + * to not format the data; it could, for example, save it in + * in the raw form it was received (more compact), leaving + * formatting for a later trace analyis tool. + * @param outBuf pointer to a buffer to receive the formatted output. Output + * will be nul terminated if there is space in the buffer - + * if the length of the requested output < the output buffer size. + * @param capacity Length of the output buffer. + * @param indent Number of spaces to indent the output. Intended to allow + * data displayed from nested functions to be indented for readability. + * @param fmt Format specification for the data to output + * @param args Data to be formatted. + * @return Length of formatted output, including the terminating NUL. + * If buffer capacity is insufficient, the required capacity is returned. + * @draft ICU 2.8 + */ +U_DRAFT int32_t U_EXPORT2 +utrace_vformat(char *outBuf, int32_t capacity, + int32_t indent, const char *fmt, va_list args); + +/** + * Trace output Formatter. An application's UTraceData tracing functions may call + * this function to format any additional trace data, beyond that + * provided by default, in human readable form with the same + * formatting conventions used by utrace_vformat(). + * @param outBuf pointer to a buffer to receive the formatted output. Output + * will be nul terminated if there is space in the buffer - + * if the length of the requested output < the output buffer size. + * @param capacity Length of the output buffer. + * @param indent Number of spaces to indent the output. Intended to allow + * data displayed from nested functions to be indented for readability. + * @param fmt Format specification for the data to output + * @param ... Data to be formatted. + * @return Length of formatted output, including the terminating NUL. + * If buffer capacity is insufficient, the required capacity is returned. + * @draft ICU 2.8 + */ +U_DRAFT int32_t U_EXPORT2 +utrace_format(char *outBuf, int32_t capacity, + int32_t indent, const char *fmt, ...); + + + +/* Trace function numbers --------------------------------------------------- */ + +/** + * Get the name of a function from its trace function number. + * + * @param fnNumber The trace number for an ICU function. + * @return The name string for the function. + * + * @see UTraceFunctionNumber + * @draft ICU 2.8 + */ +U_DRAFT const char * U_EXPORT2 +utrace_functionName(int32_t fnNumber); + +U_CDECL_END + +#endif diff --git a/icuSources/common/unicode/utypes.h b/icuSources/common/unicode/utypes.h index 0a193955..e20cd793 100644 --- a/icuSources/common/unicode/utypes.h +++ b/icuSources/common/unicode/utypes.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1996-2003, International Business Machines +* Copyright (C) 1996-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -38,6 +38,19 @@ #include "unicode/uversion.h" #include "unicode/uconfig.h" +#ifdef U_HIDE_DRAFT_API +#include "unicode/udraft.h" +#endif + +#ifdef U_HIDE_DEPRECATED_API +#include "unicode/udeprctd.h" +#endif + +#ifdef U_HIDE_DEPRECATED_API +#include "unicode/uobslete.h" +#endif + + /*! * \file * \brief Basic definitions for ICU, for both C and C++ APIs @@ -75,7 +88,7 @@ * *

    Those "invariant characters" should be all the uppercase and lowercase * latin letters, the digits, the space, and "basic punctuation". - * Also, '\n', '\r', '\t' should be available.

    + * Also, '\\n', '\\r', '\\t' should be available.

    * *

    The list of "invariant characters" is:
    * \code @@ -126,15 +139,6 @@ * @stable ICU 2.0 */ -#ifdef __APPLE__ -#undef U_IS_BIG_ENDIAN -#if __BIG_ENDIAN__ -#define U_IS_BIG_ENDIAN 1 -#else // __BIG_ENDIAN__ -#define U_IS_BIG_ENDIAN 0 -#endif // __BIG_ENDIAN__ -#endif // __APPLE__ - /** * \def U_ICUDATA_TYPE_LITLETTER * The non-string form of U_ICUDATA_TYPE_LETTER @@ -278,7 +282,7 @@ typedef double UDate; * \code * class Derived { * public: - * static UClassID getStaticClassID(); + * static UClassID U_EXPORT2 getStaticClassID(); * private: * static char fgClassID; * } @@ -310,6 +314,13 @@ typedef void* UClassID; * @stable ICU 2.0 */ +/** + * \def U_DATA_API + * Set to export library symbols from inside the stubdata library, + * and to import them from outside. + * @draft ICU 3.0 + */ + /** * \def U_COMMON_API * Set to export library symbols from inside the common library, @@ -335,64 +346,72 @@ typedef void* UClassID; * \def U_LAYOUTEX_API * Set to export library symbols from inside the layout extensions library, * and to import them from outside. - * @draft ICU 2.6 + * @stable ICU 2.6 */ /** - * \def U_USTDIO_API + * \def U_IO_API * Set to export library symbols from inside the ustdio library, * and to import them from outside. * @stable ICU 2.0 */ #if defined(U_COMBINED_IMPLEMENTATION) +#define U_DATA_API U_EXPORT #define U_COMMON_API U_EXPORT #define U_I18N_API U_EXPORT #define U_LAYOUT_API U_EXPORT #define U_LAYOUTEX_API U_EXPORT -#define U_USTDIO_API U_EXPORT +#define U_IO_API U_EXPORT #elif defined(U_STATIC_IMPLEMENTATION) +#define U_DATA_API #define U_COMMON_API #define U_I18N_API #define U_LAYOUT_API #define U_LAYOUTEX_API -#define U_USTDIO_API +#define U_IO_API #elif defined(U_COMMON_IMPLEMENTATION) +#define U_DATA_API U_IMPORT #define U_COMMON_API U_EXPORT #define U_I18N_API U_IMPORT #define U_LAYOUT_API U_IMPORT #define U_LAYOUTEX_API U_IMPORT -#define U_USTDIO_API U_IMPORT +#define U_IO_API U_IMPORT #elif defined(U_I18N_IMPLEMENTATION) +#define U_DATA_API U_IMPORT #define U_COMMON_API U_IMPORT #define U_I18N_API U_EXPORT #define U_LAYOUT_API U_IMPORT #define U_LAYOUTEX_API U_IMPORT -#define U_USTDIO_API U_IMPORT +#define U_IO_API U_IMPORT #elif defined(U_LAYOUT_IMPLEMENTATION) +#define U_DATA_API U_IMPORT #define U_COMMON_API U_IMPORT #define U_I18N_API U_IMPORT #define U_LAYOUT_API U_EXPORT #define U_LAYOUTEX_API U_IMPORT -#define U_USTDIO_API U_IMPORT +#define U_IO_API U_IMPORT #elif defined(U_LAYOUTEX_IMPLEMENTATION) +#define U_DATA_API U_IMPORT #define U_COMMON_API U_IMPORT #define U_I18N_API U_IMPORT #define U_LAYOUT_API U_IMPORT #define U_LAYOUTEX_API U_EXPORT -#define U_USTDIO_API U_IMPORT -#elif defined(U_USTDIO_IMPLEMENTATION) +#define U_IO_API U_IMPORT +#elif defined(U_IO_IMPLEMENTATION) +#define U_DATA_API U_IMPORT #define U_COMMON_API U_IMPORT #define U_I18N_API U_IMPORT #define U_LAYOUT_API U_IMPORT #define U_LAYOUTEX_API U_IMPORT -#define U_USTDIO_API U_EXPORT +#define U_IO_API U_EXPORT #else +#define U_DATA_API U_IMPORT #define U_COMMON_API U_IMPORT #define U_I18N_API U_IMPORT #define U_LAYOUT_API U_IMPORT #define U_LAYOUTEX_API U_IMPORT -#define U_USTDIO_API U_IMPORT +#define U_IO_API U_IMPORT #endif /** @@ -406,6 +425,7 @@ typedef void* UClassID; #define U_STANDARD_CPP_NAMESPACE #endif + /*===========================================================================*/ /* Global delete operator */ /*===========================================================================*/ @@ -537,9 +557,9 @@ typedef enum UErrorCode { U_MEMORY_ALLOCATION_ERROR = 7, /**< Memory allocation error */ U_INDEX_OUTOFBOUNDS_ERROR = 8, /**< Trying to access the index that is out of bounds */ U_PARSE_ERROR = 9, /**< Equivalent to Java ParseException */ - U_INVALID_CHAR_FOUND = 10, /**< In the Character conversion routines: Invalid character or sequence was encountered. In other APIs: Invalid character or code point name. */ - U_TRUNCATED_CHAR_FOUND = 11, /**< In the Character conversion routines: More bytes are required to complete the conversion successfully */ - U_ILLEGAL_CHAR_FOUND = 12, /**< In codeset conversion: a sequence that does NOT belong in the codepage has been encountered */ + U_INVALID_CHAR_FOUND = 10, /**< Character conversion: Unmappable input sequence. In other APIs: Invalid character. */ + U_TRUNCATED_CHAR_FOUND = 11, /**< Character conversion: Incomplete input sequence. */ + U_ILLEGAL_CHAR_FOUND = 12, /**< Character conversion: Illegal input sequence/combination of input units.. */ U_INVALID_TABLE_FORMAT = 13, /**< Conversion table file found, but corrupted */ U_INVALID_TABLE_FILE = 14, /**< Conversion table file not found */ U_BUFFER_OVERFLOW_ERROR = 15, /**< A result would not fit in the supplied buffer */ @@ -555,6 +575,9 @@ typedef enum UErrorCode { It is very possible that a circular alias definition has occured */ U_ENUM_OUT_OF_SYNC_ERROR = 25, /**< UEnumeration out of sync with underlying collection */ U_INVARIANT_CONVERSION_ERROR = 26, /**< Unable to convert a UChar* string to char* with the invariant converter. */ + U_INVALID_STATE_ERROR = 27, /**< Requested operation can not be completed with ICU in its current state */ + U_COLLATOR_VERSION_MISMATCH = 28, /**< Collator version is not compatible with the base version */ + U_USELESS_COLLATOR_ERROR = 29, /**< Collator is options only and no base is specified */ U_STANDARD_ERROR_LIMIT, /**< This must always be the last value to indicate the limit for standard errors */ /* @@ -633,40 +656,49 @@ typedef enum UErrorCode { U_BRK_UNDEFINED_VARIABLE, /**< Use of an undefined $Variable in an RBBI rule. */ U_BRK_INIT_ERROR, /**< Initialization failure. Probable missing ICU Data. */ U_BRK_RULE_EMPTY_SET, /**< Rule contains an empty Unicode Set. */ + U_BRK_UNRECOGNIZED_OPTION, /**< !!option in RBBI rules not recognized. */ + U_BRK_MALFORMED_RULE_TAG, /**< The {nnn} tag on a rule is mal formed */ U_BRK_ERROR_LIMIT, /**< This must always be the last value to indicate the limit for Break Iterator failures */ /* * The error codes in the range 0x10300-0x103ff are reserved for regular expression related errrs */ - U_REGEX_ERROR_START=0x10300, /**< Start of codes indicating Regexp failures */ - U_REGEX_INTERNAL_ERROR, /**< An internal error (bug) was detected. */ - U_REGEX_RULE_SYNTAX, /**< Syntax error in regexp pattern. */ - U_REGEX_INVALID_STATE, /**< RegexMatcher in invalid state for requested operation */ - U_REGEX_BAD_ESCAPE_SEQUENCE, /**< Unrecognized backslash escape sequence in pattern */ - U_REGEX_PROPERTY_SYNTAX, /**< Incorrect Unicode property */ - U_REGEX_UNIMPLEMENTED, /**< Use of regexp feature that is not yet implemented. */ - U_REGEX_MISMATCHED_PAREN, /**< Incorrectly nested parentheses in regexp pattern. */ - U_REGEX_NUMBER_TOO_BIG, /**< Decimal number is too large. */ - U_REGEX_BAD_INTERVAL, /**< Error in {min,max} interval */ - U_REGEX_MAX_LT_MIN, /**< In {min,max}, max is less than min. */ - U_REGEX_INVALID_BACK_REF, /**< Back-reference to a non-existent capture group. */ - U_REGEX_INVALID_FLAG, /**< Invalid value for match mode flags. */ - U_REGEX_LOOK_BEHIND_LIMIT, /**< Look-Behind pattern matches must have a bounded maximum length. */ - U_REGEX_SET_CONTAINS_STRING, /**< Regexps cannot have UnicodeSets containing strings.*/ - U_REGEX_ERROR_LIMIT, /**< This must always be the last value to indicate the limit for regexp errors */ - - /* - * The error code in the range 0x10400-0x104ff are reserved for IDNA related error codes - */ - U_IDNA_ERROR_START=0x10400, - U_IDNA_PROHIBITED_CODEPOINT_FOUND_ERROR, - U_IDNA_UNASSIGNED_CODEPOINT_FOUND_ERROR, - U_IDNA_CHECK_BIDI_ERROR, - U_IDNA_STD3_ASCII_RULES_ERROR, - U_IDNA_ACE_PREFIX_ERROR, - U_IDNA_VERIFICATION_ERROR, - U_IDNA_LABEL_TOO_LONG_ERROR, - U_IDNA_ERROR_LIMIT, + U_REGEX_ERROR_START=0x10300, /**< Start of codes indicating Regexp failures */ + U_REGEX_INTERNAL_ERROR, /**< An internal error (bug) was detected. */ + U_REGEX_RULE_SYNTAX, /**< Syntax error in regexp pattern. */ + U_REGEX_INVALID_STATE, /**< RegexMatcher in invalid state for requested operation */ + U_REGEX_BAD_ESCAPE_SEQUENCE, /**< Unrecognized backslash escape sequence in pattern */ + U_REGEX_PROPERTY_SYNTAX, /**< Incorrect Unicode property */ + U_REGEX_UNIMPLEMENTED, /**< Use of regexp feature that is not yet implemented. */ + U_REGEX_MISMATCHED_PAREN, /**< Incorrectly nested parentheses in regexp pattern. */ + U_REGEX_NUMBER_TOO_BIG, /**< Decimal number is too large. */ + U_REGEX_BAD_INTERVAL, /**< Error in {min,max} interval */ + U_REGEX_MAX_LT_MIN, /**< In {min,max}, max is less than min. */ + U_REGEX_INVALID_BACK_REF, /**< Back-reference to a non-existent capture group. */ + U_REGEX_INVALID_FLAG, /**< Invalid value for match mode flags. */ + U_REGEX_LOOK_BEHIND_LIMIT, /**< Look-Behind pattern matches must have a bounded maximum length. */ + U_REGEX_SET_CONTAINS_STRING, /**< Regexps cannot have UnicodeSets containing strings.*/ + U_REGEX_ERROR_LIMIT, /**< This must always be the last value to indicate the limit for regexp errors */ + + /* + * The error code in the range 0x10400-0x104ff are reserved for IDNA related error codes + */ + U_IDNA_ERROR_START=0x10400, + U_IDNA_PROHIBITED_ERROR, + U_IDNA_UNASSIGNED_ERROR, + U_IDNA_CHECK_BIDI_ERROR, + U_IDNA_STD3_ASCII_RULES_ERROR, + U_IDNA_ACE_PREFIX_ERROR, + U_IDNA_VERIFICATION_ERROR, + U_IDNA_LABEL_TOO_LONG_ERROR, + U_IDNA_ERROR_LIMIT, + /* + * Aliases for StringPrep + */ + U_STRINGPREP_PROHIBITED_ERROR = U_IDNA_PROHIBITED_ERROR, + U_STRINGPREP_UNASSIGNED_ERROR = U_IDNA_UNASSIGNED_ERROR, + U_STRINGPREP_CHECK_BIDI_ERROR = U_IDNA_CHECK_BIDI_ERROR, + U_ERROR_LIMIT=U_IDNA_ERROR_LIMIT /**< This must always be the last value to indicate the limit for UErrorCode (last error code +1) */ } UErrorCode; @@ -706,15 +738,8 @@ typedef enum UErrorCode { * in the UErrorCode enum above. * @stable ICU 2.0 */ -U_CAPI const char * U_EXPORT2 +U_STABLE const char * U_EXPORT2 u_errorName(UErrorCode code); - -/*===========================================================================*/ -/* Include header for platform utilies */ -/*===========================================================================*/ - -#include "unicode/putil.h" - #endif /* _UTYPES */ diff --git a/icuSources/common/unicode/uversion.h b/icuSources/common/unicode/uversion.h index fdd289c3..f9a7755b 100644 --- a/icuSources/common/unicode/uversion.h +++ b/icuSources/common/unicode/uversion.h @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 2000-2003, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************* * @@ -41,77 +41,82 @@ /** The standard copyright notice that gets compiled into each library. * This value will change in the subsequent releases of ICU - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U_COPYRIGHT_STRING \ - " Copyright (C) 2003, International Business Machines Corporation and others. All Rights Reserved. " + " Copyright (C) 2004, International Business Machines Corporation and others. All Rights Reserved. " /** Maximum length of the copyright string. - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U_COPYRIGHT_STRING_LENGTH 128 /** The current ICU major version as an integer. * This value will change in the subsequent releases of ICU - * @draft ICU 2.4 + * @stable ICU 2.4 */ -#define U_ICU_VERSION_MAJOR_NUM 2 +#define U_ICU_VERSION_MAJOR_NUM 3 /** The current ICU minor version as an integer. * This value will change in the subsequent releases of ICU - * @draft ICU 2.6 + * @stable ICU 2.6 */ -#define U_ICU_VERSION_MINOR_NUM 6 +#define U_ICU_VERSION_MINOR_NUM 2 /** The current ICU patchlevel version as an integer. * This value will change in the subsequent releases of ICU - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U_ICU_VERSION_PATCHLEVEL_NUM 0 /** Glued version suffix for renamers * This value will change in the subsequent releases of ICU - * @draft ICU 2.6 + * @stable ICU 2.6 */ -#define U_ICU_VERSION_SUFFIX _2_6 +#define U_ICU_VERSION_SUFFIX _3_2 /** The current ICU library version as a dotted-decimal string. The patchlevel * only appears in this string if it non-zero. * This value will change in the subsequent releases of ICU - * @draft ICU 2.4 + * @stable ICU 2.4 */ -#define U_ICU_VERSION "2.6" +#define U_ICU_VERSION "3.2" /** The current ICU library major/minor version as a string without dots, for library name suffixes. * This value will change in the subsequent releases of ICU - * @draft ICU 2.6 + * @stable ICU 2.6 */ -#define U_ICU_VERSION_SHORT "26" +#define U_ICU_VERSION_SHORT "32" /** An ICU version consists of up to 4 numbers from 0..255. - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U_MAX_VERSION_LENGTH 4 /** In a string, ICU version fields are delimited by dots. - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U_VERSION_DELIMITER '.' /** The maximum length of an ICU version string. - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define U_MAX_VERSION_STRING_LENGTH 20 /** The binary form of a version on ICU APIs is an array of 4 uint8_t. - * @draft ICU 2.4 + * @stable ICU 2.4 */ typedef uint8_t UVersionInfo[U_MAX_VERSION_LENGTH]; #if U_HAVE_NAMESPACE && defined(XP_CPLUSPLUS) -#define U_ICU_NAMESPACE icu_2_6 +#if U_DISABLE_RENAMING +#define U_ICU_NAMESPACE icu +namespace U_ICU_NAMESPACE { } +#else +#define U_ICU_NAMESPACE icu_3_2 namespace U_ICU_NAMESPACE { } namespace icu = U_ICU_NAMESPACE; +#endif U_NAMESPACE_USE #endif @@ -129,9 +134,9 @@ U_NAMESPACE_USE * @param versionString A string with dotted-decimal version information, * with up to four non-negative number fields with * values of up to 255 each. - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 u_versionFromString(UVersionInfo versionArray, const char *versionString); /** @@ -144,9 +149,9 @@ u_versionFromString(UVersionInfo versionArray, const char *versionString); * a string corresponding to the numeric version * information in versionArray. * The buffer size must be at least U_MAX_VERSION_STRING_LENGTH. - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 u_versionToString(UVersionInfo versionArray, char *versionString); /** @@ -157,7 +162,7 @@ u_versionToString(UVersionInfo versionArray, char *versionString); * @param versionArray the version # information, the result will be filled in * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 u_getVersion(UVersionInfo versionArray); @@ -174,21 +179,23 @@ u_getVersion(UVersionInfo versionArray); * compression, generating quad level always when strength is quad or more * version 4 - ICU 2.2 - tracking UCA changes, ignore completely ignorables * in contractions, ignore primary ignorables after shifted + * version 5 - ICU 2.8 - changed implicit generation code * This value may change in the subsequent releases of ICU - * @draft ICU 2.4 + * @stable ICU 2.4 */ -#define UCOL_RUNTIME_VERSION 4 +#define UCOL_RUNTIME_VERSION 5 /** Builder code version. When this is different, same tailoring might result * in assigning different collation elements to code points * version 2 was in ICU 1.8.1. added support for prefixes, tweaked canonical * closure. However, the tailorings should probably get same CEs assigned * version 5 - ICU 2.2 - fixed some bugs, renamed some indirect values. + * version 6 - ICU 2.8 - fixed bug in builder that allowed 0xFF in primary values * Backward compatible with the old rules. * This value may change in the subsequent releases of ICU - * @draft ICU 2.4 + * @stable ICU 2.4 */ -#define UCOL_BUILDER_VERSION 5 +#define UCOL_BUILDER_VERSION 6 /** *** Removed *** Instead we use the data we read from FractionalUCA.txt * This is the version of FractionalUCA.txt tailoring rules @@ -196,13 +203,13 @@ u_getVersion(UVersionInfo versionArray); * supplementary code points * Version 4 in ICU 2.2, following UCA=3.1.1d6, UCD=3.2.0 * This value may change in the subsequent releases of ICU - * @draft ICU 2.4 + * @stable ICU 2.4 */ /*#define UCOL_FRACTIONAL_UCA_VERSION 4*/ /** This is the version of the tailorings * This value may change in the subsequent releases of ICU - * @draft ICU 2.4 + * @stable ICU 2.4 */ #define UCOL_TAILORINGS_VERSION 1 diff --git a/icuSources/common/unifilt.cpp b/icuSources/common/unifilt.cpp index 88727e2c..69ac3070 100644 --- a/icuSources/common/unifilt.cpp +++ b/icuSources/common/unifilt.cpp @@ -1,5 +1,7 @@ /* -* Copyright (C) 2001, International Business Machines Corporation and others. All Rights Reserved. +********************************************************************** +* Copyright (c) 2001-2004, International Business Machines +* Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description * 07/18/01 aliu Creation. @@ -10,8 +12,14 @@ #include "unicode/rep.h" U_NAMESPACE_BEGIN +UOBJECT_DEFINE_ABSTRACT_RTTI_IMPLEMENTATION(UnicodeFilter) + -const char UnicodeFilter::fgClassID=0; +/* Define this here due to the lack of another file. + It can't be defined in the header */ +UnicodeMatcher::~UnicodeMatcher() {} + +UnicodeFilter::~UnicodeFilter() {} /** * UnicodeFunctor API. Cast 'this' to a UnicodeMatcher* pointer @@ -21,6 +29,8 @@ UnicodeMatcher* UnicodeFilter::toMatcher() const { return (UnicodeMatcher*) this; } +void UnicodeFilter::setData(const TransliterationRuleData*) {} + /** * Default implementation of UnicodeMatcher::matches() for Unicode * filters. Matches a single code point at offset (either one or diff --git a/icuSources/common/unifunct.cpp b/icuSources/common/unifunct.cpp index f849410a..b834eeed 100644 --- a/icuSources/common/unifunct.cpp +++ b/icuSources/common/unifunct.cpp @@ -1,19 +1,17 @@ /* ********************************************************************** -* Copyright (c) 2002, International Business Machines +* Copyright (c) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** -* $Source: /cvs/root/ICU/icuSources/common/unifunct.cpp,v $ -* $Date: 2003/02/05 21:31:15 $ -* $Revision: 1.1.1.1 $ -********************************************************************** */ #include "unicode/unifunct.h" U_NAMESPACE_BEGIN -const char UnicodeFunctor::fgClassID = 0; +UOBJECT_DEFINE_ABSTRACT_RTTI_IMPLEMENTATION(UnicodeFunctor) + +UnicodeFunctor::~UnicodeFunctor() {} UnicodeMatcher* UnicodeFunctor::toMatcher() const { return 0; diff --git a/icuSources/common/uniset.cpp b/icuSources/common/uniset.cpp index 18ccc924..07794e70 100644 --- a/icuSources/common/uniset.cpp +++ b/icuSources/common/uniset.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -8,34 +8,20 @@ ********************************************************************** */ +#include "unicode/utypes.h" #include "unicode/uniset.h" #include "unicode/parsepos.h" -#include "unicode/uchar.h" -#include "unicode/uscript.h" -#include "symtable.h" +#include "unicode/symtable.h" +#include "ruleiter.h" #include "cmemory.h" #include "uhash.h" #include "util.h" #include "uvector.h" -#include "uprops.h" #include "charstr.h" #include "ustrfmt.h" #include "mutex.h" #include "uassert.h" #include "hash.h" -#include "ucmp8.h" - -// HIGH_VALUE > all valid values. 110000 for codepoints -#define UNICODESET_HIGH 0x0110000 - -// LOW <= all valid values. ZERO for codepoints -#define UNICODESET_LOW 0x000000 - -// initial storage. Must be >= 0 -#define START_EXTRA 16 - -// extra amount for growth. Must be >= 0 -#define GROW_EXTRA START_EXTRA // Define UChar constants using hex for EBCDIC compatibility // Used #define to reduce private static exports and memory access time. @@ -55,93 +41,21 @@ #define UPPER_N ((UChar)78) /*N*/ #define EQUALS ((UChar)0x003D) /*=*/ -static const UChar POSIX_OPEN[] = { 91,58,0 }; // "[:" -static const UChar POSIX_CLOSE[] = { 58,93,0 }; // ":]" -static const UChar PERL_OPEN[] = { 92,112,0 }; // "\\p" -static const UChar PERL_CLOSE[] = { 125,0 }; // "}" -static const UChar NAME_OPEN[] = { 92,78,0 }; // "\\N" - -// Special property set IDs -static const char ANY[] = "ANY"; // [\u0000-\U0010FFFF] -static const char ASCII[] = "ASCII"; // [\u0000-\u007F] - -static const char NAME_PROP[] = "na"; // Unicode name property alias - -// TODO: Remove the following special-case code when -// these four C99-compatibility properties are implemented -// as enums/names. -U_CDECL_BEGIN - typedef UBool (U_CALLCONV *_C99_Property_Function)(UChar32); -U_CDECL_END -static const struct _C99_Map { - const char* name; - _C99_Property_Function func; -} _C99_DISPATCH[] = { - // These three entries omitted; they clash with PropertyAliases - // names for Unicode properties, so UnicodeSet already maps them - // to those properties. - //{ "alpha", u_isalpha }, - //{ "lower", u_islower }, - //{ "upper", u_isupper }, - - // MUST be in SORTED order - { "blank", u_isblank }, - { "cntrl", u_iscntrl }, - { "digit", u_isdigit }, - { "graph", u_isgraph }, - { "print", u_isprint }, - { "punct", u_ispunct }, - { "space", u_isspace }, - { "title", u_istitle }, - { "xdigit", u_isxdigit } -}; -#define _C99_COUNT (9) - -// TEMPORARY: Remove when deprecated category code constructor is removed. -static const UChar CATEGORY_NAMES[] = { - // Must be kept in sync with uchar.h/UCharCategory - 0x43, 0x6E, /* "Cn" */ - 0x4C, 0x75, /* "Lu" */ - 0x4C, 0x6C, /* "Ll" */ - 0x4C, 0x74, /* "Lt" */ - 0x4C, 0x6D, /* "Lm" */ - 0x4C, 0x6F, /* "Lo" */ - 0x4D, 0x6E, /* "Mn" */ - 0x4D, 0x65, /* "Me" */ - 0x4D, 0x63, /* "Mc" */ - 0x4E, 0x64, /* "Nd" */ - 0x4E, 0x6C, /* "Nl" */ - 0x4E, 0x6F, /* "No" */ - 0x5A, 0x73, /* "Zs" */ - 0x5A, 0x6C, /* "Zl" */ - 0x5A, 0x70, /* "Zp" */ - 0x43, 0x63, /* "Cc" */ - 0x43, 0x66, /* "Cf" */ - 0x43, 0x6F, /* "Co" */ - 0x43, 0x73, /* "Cs" */ - 0x50, 0x64, /* "Pd" */ - 0x50, 0x73, /* "Ps" */ - 0x50, 0x65, /* "Pe" */ - 0x50, 0x63, /* "Pc" */ - 0x50, 0x6F, /* "Po" */ - 0x53, 0x6D, /* "Sm" */ - 0x53, 0x63, /* "Sc" */ - 0x53, 0x6B, /* "Sk" */ - 0x53, 0x6F, /* "So" */ - 0x50, 0x69, /* "Pi" */ - 0x50, 0x66, /* "Pf" */ - 0x00 -}; +// HIGH_VALUE > all valid values. 110000 for codepoints +#define UNICODESET_HIGH 0x0110000 -/** - * Delimiter string used in patterns to close a category reference: - * ":]". Example: "[:Lu:]". - */ -static const UChar CATEGORY_CLOSE[] = {COLON, SET_CLOSE, 0x0000}; /* ":]" */ +// LOW <= all valid values. ZERO for codepoints +#define UNICODESET_LOW 0x000000 + +// initial storage. Must be >= 0 +#define START_EXTRA 16 + +// extra amount for growth. Must be >= 0 +#define GROW_EXTRA START_EXTRA U_NAMESPACE_BEGIN -const char ParsePosition::fgClassID=0; +SymbolTable::~SymbolTable() {} /** * Minimum value that can be stored in a UnicodeSet. @@ -153,46 +67,7 @@ const UChar32 UnicodeSet::MIN_VALUE = UNICODESET_LOW; */ const UChar32 UnicodeSet::MAX_VALUE = UNICODESET_HIGH - 1; -const char UnicodeSet::fgClassID = 0; - -static UnicodeSet* INCLUSIONS = NULL; // cached uprv_getInclusions() - -static Hashtable* CASE_EQUIV_HASH = NULL; // for closeOver(USET_CASE) - -static CompactByteArray* CASE_EQUIV_CBA = NULL; // for closeOver(USET_CASE) - -// helper functions for matching of pattern syntax pieces ------------------ *** -// these functions are parallel to the PERL_OPEN etc. strings above - -// using these functions is not only faster than UnicodeString::compare() and -// caseCompare(), but they also make UnicodeSet work for simple patterns when -// no Unicode properties data is available - when caseCompare() fails - -static inline UBool -isPerlOpen(const UnicodeString &pattern, int32_t pos) { - UChar c; - return pattern.charAt(pos)==BACKSLASH && ((c=pattern.charAt(pos+1))==LOWER_P || c==UPPER_P); -} - -static inline UBool -isPerlClose(const UnicodeString &pattern, int32_t pos) { - return pattern.charAt(pos)==CLOSE_BRACE; -} - -static inline UBool -isNameOpen(const UnicodeString &pattern, int32_t pos) { - return pattern.charAt(pos)==BACKSLASH && pattern.charAt(pos+1)==UPPER_N; -} - -static inline UBool -isPOSIXOpen(const UnicodeString &pattern, int32_t pos) { - return pattern.charAt(pos)==SET_OPEN && pattern.charAt(pos+1)==COLON; -} - -static inline UBool -isPOSIXClose(const UnicodeString &pattern, int32_t pos) { - return pattern.charAt(pos)==COLON && pattern.charAt(pos+1)==SET_CLOSE; -} +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(UnicodeSet) /** * Modify the given UChar32 variable so that it is in range, by @@ -305,130 +180,6 @@ UnicodeSet::UnicodeSet(UChar32 start, UChar32 end) : _dbgct(this); } -/** - * Constructs a set from the given pattern, optionally ignoring - * white space. See the class description for the syntax of the - * pattern language. - * @param pattern a string specifying what characters are in the set - */ -UnicodeSet::UnicodeSet(const UnicodeString& pattern, - UErrorCode& status) : - len(0), capacity(START_EXTRA), bufferCapacity(0), - list(0), buffer(0), strings(0) -{ - if(U_SUCCESS(status)){ - list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); - /* test for NULL */ - if(list == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - }else{ - allocateStrings(); - applyPattern(pattern, USET_IGNORE_SPACE, status); - } - } - _dbgct(this); -} - -/** - * Constructs a set from the given pattern, optionally ignoring - * white space. See the class description for the syntax of the - * pattern language. - * @param pattern a string specifying what characters are in the set - * @param options bitmask for options to apply to the pattern. - * Valid options are USET_IGNORE_SPACE and USET_CASE_INSENSITIVE. - */ -UnicodeSet::UnicodeSet(const UnicodeString& pattern, - uint32_t options, - UErrorCode& status) : - len(0), capacity(START_EXTRA), bufferCapacity(0), - list(0), buffer(0), strings(0) -{ - if(U_SUCCESS(status)){ - list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); - /* test for NULL */ - if(list == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - }else{ - allocateStrings(); - applyPattern(pattern, options, status); - } - } - _dbgct(this); -} - -// For internal use by RuleBasedTransliterator -UnicodeSet::UnicodeSet(const UnicodeString& pattern, ParsePosition& pos, - const SymbolTable& symbols, - UErrorCode& status) : - len(0), capacity(START_EXTRA), bufferCapacity(0), - list(0), buffer(0), strings(0) -{ - if(U_SUCCESS(status)){ - list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); - /* test for NULL */ - if(list == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - }else{ - allocateStrings(); - applyPattern(pattern, pos, USET_IGNORE_SPACE, &symbols, status); - } - } - _dbgct(this); -} - -// For internal use by TransliteratorIDParser -UnicodeSet::UnicodeSet(const UnicodeString& pattern, ParsePosition& pos, - uint32_t options, UErrorCode& status) : - len(0), capacity(START_EXTRA), bufferCapacity(0), - list(0), buffer(0), strings(0) -{ - if(U_SUCCESS(status)){ - list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); - /* test for NULL */ - if(list == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - }else{ - allocateStrings(); - applyPattern(pattern, pos, options, NULL, status); - } - } - _dbgct(this); -} - -#ifdef U_USE_UNICODESET_DEPRECATES -/** - * DEPRECATED Constructs a set from the given Unicode character category. - * @param category an integer indicating the character category as - * defined in uchar.h. - * @deprecated To be removed after 2002-DEC-31 - */ -UnicodeSet::UnicodeSet(int8_t category, UErrorCode& status) : - len(0), capacity(START_EXTRA), bufferCapacity(0), - list(0), buffer(0), strings(0) -{ - static const UChar OPEN[] = { 91, 58, 0 }; // "[:" - static const UChar CLOSE[]= { 58, 93, 0 }; // ":]" - if (U_SUCCESS(status)) { - if (category < 0 || category >= U_CHAR_CATEGORY_COUNT) { - status = U_ILLEGAL_ARGUMENT_ERROR; - } else { - UnicodeString pattern(FALSE, CATEGORY_NAMES + category*2, 2); - pattern.insert(0, OPEN); - pattern.append(CLOSE); - list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); - /* test for NULL */ - if(list == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - }else{ - allocateStrings(); - applyPattern(pattern, status); - } - } - } - _dbgct(this); -} -#endif - /** * Constructs a set that is identical to the given UnicodeSet. */ @@ -531,234 +282,10 @@ UnicodeSet& UnicodeSet::set(UChar32 start, UChar32 end) { return *this; } -/** - * Modifies this set to represent the set specified by the given - * pattern, optionally ignoring white space. See the class - * description for the syntax of the pattern language. - * @param pattern a string specifying what characters are in the set - * @param ignoreSpaces if true, all spaces in the - * pattern are ignored. Spaces are those characters for which - * uprv_isRuleWhiteSpace() is true. - * Characters preceded by '\\' are escaped, losing any special - * meaning they otherwise have. Spaces may be included by - * escaping them. - * @exception IllegalArgumentException if the pattern - * contains a syntax error. - */ -UnicodeSet& UnicodeSet::applyPattern(const UnicodeString& pattern, - UErrorCode& status) { - return applyPattern(pattern, USET_IGNORE_SPACE, status); -} - -/** - * Modifies this set to represent the set specified by the given - * pattern, optionally ignoring white space. See the class - * description for the syntax of the pattern language. - * @param pattern a string specifying what characters are in the set - * @param options bitmask for options to apply to the pattern. - * Valid options are USET_IGNORE_SPACE and USET_CASE_INSENSITIVE. - */ -UnicodeSet& UnicodeSet::applyPattern(const UnicodeString& pattern, - uint32_t options, - UErrorCode& status) { - if (U_FAILURE(status)) { - return *this; - } - - ParsePosition pos(0); - applyPattern(pattern, pos, options, NULL, status); - if (U_FAILURE(status)) return *this; - - int32_t i = pos.getIndex(); - int32_t n = pattern.length(); - - if (options & USET_IGNORE_SPACE) { - // Skip over trailing whitespace - while (itoPattern()
    representation of a - * string to the given StringBuffer. - */ -void UnicodeSet::_appendToPat(UnicodeString& buf, const UnicodeString& s, UBool escapeUnprintable) { - UChar32 cp; - for (int32_t i = 0; i < s.length(); i += UTF_CHAR_LENGTH(cp)) { - _appendToPat(buf, cp = s.char32At(i), escapeUnprintable); - } -} - -/** - * Append the toPattern() representation of a - * character to the given StringBuffer. - */ -void UnicodeSet::_appendToPat(UnicodeString& buf, UChar32 c, UBool escapeUnprintable) { - if (escapeUnprintable && ICU_Utility::isUnprintable(c)) { - // Use hex escape notation (\uxxxx or \Uxxxxxxxx) for anything - // unprintable - if (ICU_Utility::escapeUnprintable(buf, c)) { - return; - } - } - // Okay to let ':' pass through - switch (c) { - case SET_OPEN: - case SET_CLOSE: - case HYPHEN: - case COMPLEMENT: - case INTERSECTION: - case BACKSLASH: - case 123/*{*/: - case 125/*}*/: - case SymbolTable::SYMBOL_REF: - case COLON: - buf.append(BACKSLASH); - break; - default: - // Escape whitespace - if (uprv_isRuleWhiteSpace(c)) { - buf.append(BACKSLASH); - } - break; - } - buf.append(c); -} - -/** - * Returns a string representation of this set. If the result of - * calling this function is passed to a UnicodeSet constructor, it - * will produce another set that is equal to this one. - */ -UnicodeString& UnicodeSet::toPattern(UnicodeString& result, - UBool escapeUnprintable) const { - result.truncate(0); - return _toPattern(result, escapeUnprintable); -} - -/** - * Append a string representation of this set to result. This will be - * a cleaned version of the string passed to applyPattern(), if there - * is one. Otherwise it will be generated. - */ -UnicodeString& UnicodeSet::_toPattern(UnicodeString& result, - UBool escapeUnprintable) const { - if (pat.length() > 0) { - int32_t i; - int32_t backslashCount = 0; - for (i=0; i 1 && - getRangeStart(0) == MIN_VALUE && - getRangeEnd(count-1) == MAX_VALUE) { - - // Emit the inverse - result.append(COMPLEMENT); - - for (int32_t i = 1; i < count; ++i) { - UChar32 start = getRangeEnd(i-1)+1; - UChar32 end = getRangeStart(i)-1; - _appendToPat(result, start, escapeUnprintable); - if (start != end) { - result.append(HYPHEN); - _appendToPat(result, end, escapeUnprintable); - } - } - } - - // Default; emit the ranges as pairs - else { - for (int32_t i = 0; i < count; ++i) { - UChar32 start = getRangeStart(i); - UChar32 end = getRangeEnd(i); - _appendToPat(result, start, escapeUnprintable); - if (start != end) { - result.append(HYPHEN); - _appendToPat(result, end, escapeUnprintable); - } - } - } - - for (int32_t i = 0; isize(); ++i) { - result.append(OPEN_BRACE); - _appendToPat(result, - *(const UnicodeString*) strings->elementAt(i), - escapeUnprintable); - result.append(CLOSE_BRACE); - } - return result.append(SET_CLOSE); -} - /** * Returns the number of elements in this set (its cardinality), - * n, where 0 <= n <= 65536. + * Note than the elements of a set may include both individual + * codepoints and strings. * * @return the number of elements in this set (its cardinality). */ @@ -824,7 +351,7 @@ int32_t UnicodeSet::findCodePoint(UChar32 c) const { // list[len - 1] == HIGH and that c is legal (0..HIGH-1). if (c < list[0]) return 0; // High runner test. c is often after the last range, so an - // initial check for this condition pays off. + // initial check for this condition pays off. if (len >= 2 && c >= list[len-2]) return len-1; int32_t lo = 0; int32_t hi = len - 1; @@ -893,7 +420,7 @@ UBool UnicodeSet::containsAll(const UnicodeSet& c) const { if (!strings->containsAll(*c.strings)) return FALSE; return TRUE; } - + /** * Returns true if this set contains all the characters * of the given string. @@ -908,7 +435,7 @@ UBool UnicodeSet::containsAll(const UnicodeString& s) const { } return TRUE; } - + /** * Returns true if this set contains none of the characters * of the given range. @@ -944,7 +471,7 @@ UBool UnicodeSet::containsNone(const UnicodeSet& c) const { if (!strings->containsNone(*c.strings)) return FALSE; return TRUE; } - + /** * Returns true if this set contains none of the characters * of the given string. @@ -1004,8 +531,8 @@ UBool UnicodeSet::matchesIndexValue(uint8_t v) const { } /** - * Implementation of UnicodeMatcher::matches(). Always matches the - * longest possible multichar string. + * Implementation of UnicodeMatcher::matches(). Always matches the + * longest possible multichar string. */ UMatchDegree UnicodeSet::matches(const Replaceable& text, int32_t& offset, @@ -1022,7 +549,7 @@ UMatchDegree UnicodeSet::matches(const Replaceable& text, } } else { if (strings->size() != 0) { // try strings first - + // might separate forward and backward loops later // for now they are combined @@ -1056,7 +583,7 @@ UMatchDegree UnicodeSet::matches(const Replaceable& text, // forward direction. if (forward && c > firstChar) break; if (c != firstChar) continue; - + int32_t matchLen = matchRest(text, offset, limit, trial); if (incremental) { @@ -1250,13 +777,13 @@ UnicodeSet& UnicodeSet::add(UChar32 c) { // already in set? if ((i & 1) != 0) return *this; - + // HIGH is 0x110000 // assert(list[len-1] == HIGH); - + // empty = [HIGH] // [start_0, limit_0, start_1, limit_1, HIGH] - + // [..., start_k-1, limit_k-1, start_k, limit_k, ..., HIGH] // ^ // list[i] @@ -1332,7 +859,7 @@ UnicodeSet& UnicodeSet::add(UChar32 c) { list[i+1] = c+1; len += 2; } - + #ifdef DEBUG_US_ADD dump(list, len); printf("\n"); @@ -1343,9 +870,9 @@ UnicodeSet& UnicodeSet::add(UChar32 c) { printf("ERROR: list has been corrupted\n"); exit(1); } - } + } #endif - + pat.truncate(0); return *this; } @@ -1464,7 +991,7 @@ UnicodeSet& UnicodeSet::removeAll(const UnicodeString& s) { * @param the source string * @return a newly created set containing the given string */ -UnicodeSet* UnicodeSet::createFrom(const UnicodeString& s) { +UnicodeSet* U_EXPORT2 UnicodeSet::createFrom(const UnicodeString& s) { UnicodeSet *set = new UnicodeSet(); set->add(s); return set; @@ -1476,7 +1003,7 @@ UnicodeSet* UnicodeSet::createFrom(const UnicodeString& s) { * @param the source string * @return a newly created set containing the given characters */ -UnicodeSet* UnicodeSet::createFromAll(const UnicodeString& s) { +UnicodeSet* U_EXPORT2 UnicodeSet::createFromAll(const UnicodeString& s) { UnicodeSet *set = new UnicodeSet(); set->addAll(s); return set; @@ -1511,7 +1038,7 @@ UnicodeSet& UnicodeSet::retain(UChar32 c) { * The set will not contain the specified range once the call * returns. If end > start then an empty range is * removed, leaving the set unchanged. - * + * * @param start first character, inclusive, of range to be removed * from this set. * @param end last character, inclusive, of range to be removed @@ -1582,7 +1109,7 @@ UnicodeSet& UnicodeSet::complement(UChar32 c) { * complement(MIN_VALUE, MAX_VALUE). */ UnicodeSet& UnicodeSet::complement(void) { - if (list[0] == UNICODESET_LOW) { + if (list[0] == UNICODESET_LOW) { ensureBufferCapacity(len-1); uprv_memcpy(buffer, list + 1, (len-1)*sizeof(UChar32)); --len; @@ -1619,7 +1146,7 @@ UnicodeSet& UnicodeSet::complement(const UnicodeString& s) { complement((UChar32)cp, (UChar32)cp); } return *this; -} +} /** * Adds all of the elements in the specified set to this set if @@ -1634,7 +1161,7 @@ UnicodeSet& UnicodeSet::complement(const UnicodeString& s) { UnicodeSet& UnicodeSet::addAll(const UnicodeSet& c) { add(c.list, c.len, 0); - // Add strings in order + // Add strings in order for (int32_t i=0; isize(); ++i) { const UnicodeString* s = (const UnicodeString*)c.strings->elementAt(i); if (!strings->contains((void*) s)) { @@ -1842,515 +1369,6 @@ int32_t UnicodeSet::serialize(uint16_t *dest, int32_t destCapacity, UErrorCode& return destLength; } -//---------------------------------------------------------------- -// Implementation: Pattern parsing -//---------------------------------------------------------------- - -/** - * Parses the given pattern, starting at the given position. The - * character at pattern.charAt(pos.getIndex()) must be '[', or the - * parse fails. Parsing continues until the corresponding closing - * ']'. If a syntax error is encountered between the opening and - * closing brace, the parse fails. Upon return from a successful - * parse, the ParsePosition is updated to point to the character - * following the closing ']', and a StringBuffer containing a - * pairs list for the parsed pattern is returned. This method calls - * itself recursively to parse embedded subpatterns. - * - * @param pattern the string containing the pattern to be parsed. - * The portion of the string from pos.getIndex(), which must be a - * '[', to the corresponding closing ']', is parsed. - * @param pos upon entry, the position at which to being parsing. - * The character at pattern.charAt(pos.getIndex()) must be a '['. - * Upon return from a U_SUCCESSful parse, pos.getIndex() is either - * the character after the closing ']' of the parsed pattern, or - * pattern.length() if the closing ']' is the last character of - * the pattern string. - * @return a StringBuffer containing a pairs list for the parsed - * substring of pattern - * @exception IllegalArgumentException if the parse fails. - */ -void UnicodeSet::applyPattern(const UnicodeString& pattern, - ParsePosition& pos, - uint32_t options, - const SymbolTable* symbols, - UErrorCode& status) { - if (U_FAILURE(status)) { - return; - } - - // Need to build the pattern in a temporary string because - // _applyPattern calls add() etc., which set pat to empty. - UnicodeString rebuiltPat; - _applyPattern(pattern, pos, options, symbols, rebuiltPat, status); - pat = rebuiltPat; -} - -void UnicodeSet::_applyPattern(const UnicodeString& pattern, - ParsePosition& pos, - uint32_t options, - const SymbolTable* symbols, - UnicodeString& rebuiltPat, - UErrorCode& status) { - - if (U_FAILURE(status)) { - return; - } - - // If the pattern contains any of the following, we save a - // rebuilt (variable-substituted) copy of the source pattern: - // - a category - // - an intersection or subtraction operator - // - an anchor (trailing '$', indicating RBT ether) - UBool rebuildPattern = FALSE; - UnicodeString newPat(SET_OPEN); - int32_t nestedPatStart = - 1; // see below for usage - UBool nestedPatDone = FALSE; // see below for usage - UnicodeString multiCharBuffer; - - UBool invert = FALSE; - clear(); - - const UChar32 NONE = (UChar32) -1; - UChar32 lastChar = NONE; // This is either a char (0..10FFFF) or NONE - UBool isLastLiteral = FALSE; // TRUE if lastChar was a literal - UChar lastOp = 0; - - /* This loop iterates over the characters in the pattern. We start at - * the position specified by pos. We exit the loop when either a - * matching closing ']' is seen, or we read all characters of the - * pattern. In the latter case an error will be thrown. - */ - - /* Pattern syntax: - * pat := '[' '^'? elem* ']' - * elem := a | a '-' a | set | set op set - * set := pat | (a set variable) - * op := '&' | '-' - * a := (a character, possibly defined by a var) - */ - - // mode 0: No chars parsed yet; next must be '[' - // mode 1: '[' seen; if next is '^' or ':' then special - // mode 15: "[^" seen; if next is '-' then literal - // mode 2: '[' '^'? '-'? seen; parse pattern and close with ']' - // mode 3: '[:' seen; parse category and close with ':]' - // mode 4: ']' seen; parse complete - // mode 5: Top-level property pattern seen - int8_t mode = 0; - int32_t i = pos.getIndex(); - int32_t limit = pattern.length(); - UnicodeSet nestedAux; - const UnicodeSet* nestedSet; // never owned - UnicodeString scratch; - /* In the case of an embedded SymbolTable variable, we look it up and - * then take characters from the resultant char[] array. These chars - * are subjected to an extra level of lookup in the SymbolTable in case - * they are stand-ins for a nested UnicodeSet. */ - const UnicodeString* varValueBuffer = NULL; - int32_t ivarValueBuffer = 0; - int32_t anchor = 0; - UChar32 c; - while (ilength()) { - c = varValueBuffer->char32At(ivarValueBuffer); - ivarValueBuffer += UTF_CHAR_LENGTH(c); - const UnicodeFunctor *m = symbols->lookupMatcher(c); // may be NULL - if (m != NULL && m->getDynamicClassID() != UnicodeSet::getStaticClassID()) { - status = U_ILLEGAL_ARGUMENT_ERROR; - return; - } - nestedSet = (UnicodeSet*) m; - nestedPatDone = FALSE; - } else { - varValueBuffer = NULL; - c = pattern.char32At(i); - i += UTF_CHAR_LENGTH(c); - } - } else { - c = pattern.char32At(i); - i += UTF_CHAR_LENGTH(c); - } - - if ((options & USET_IGNORE_SPACE) && uprv_isRuleWhiteSpace(c)) { - continue; - } - - // Keep track of the count of characters after an alleged anchor - if (anchor > 0) { - ++anchor; - } - - // Parse the opening '[' and optional following '^' - switch (mode) { - case 0: - if (resemblesPropertyPattern(pattern, i-1)) { - mode = 3; - break; // Fall through - } else if (c == SET_OPEN) { - mode = 1; // Next look for '^' or ':' - continue; - } else { - // throw new IllegalArgumentException("Missing opening '['"); - status = U_ILLEGAL_ARGUMENT_ERROR; - return; - } - case 1: - mode = 2; - switch (c) { - case COMPLEMENT: - invert = TRUE; - newPat.append(c); - mode = 15; - continue; // Back to top to fetch next character - case HYPHEN: - isLiteral = TRUE; // Treat leading '-' as a literal - break; // Fall through - } - break; - case 15: - mode = 2; - if (c == HYPHEN) { - isLiteral = TRUE; // [^-...] starts with literal '-' - } - break; - // else fall through and parse this character normally - } - - // After opening matter is parsed ("[", "[^", or "[:"), the mode - // will be 2 if we want a closing ']', or 3 if we should parse a - // category and close with ":]". - - // Only process escapes, variable references, and nested sets - // if we are _not_ retrieving characters from the variable - // buffer. Characters in the variable buffer have already - // benn through escape and variable reference processing. - if (varValueBuffer == NULL) { - /** - * Handle property set patterns. - */ - if (resemblesPropertyPattern(pattern, i-1)) { - ParsePosition pp(i-1); - nestedAux.applyPropertyPattern(pattern, pp, status); - if (U_FAILURE(status)) { - U_ASSERT(pp.getIndex() == i-1); - //throw new IllegalArgumentException("Invalid property pattern " + - // pattern.substring(i-1)); - return; - } - nestedSet = &nestedAux; - nestedPatStart = newPat.length(); - nestedPatDone = TRUE; // we're going to do it just below - - switch (lastOp) { - case HYPHEN: - case INTERSECTION: - newPat.append(lastOp); - break; - } - - // If we have a top-level property pattern, then trim - // off the opening '[' and use the property pattern - // as the entire pattern. - if (mode == 3) { - newPat.truncate(0); - } - UnicodeString str; - pattern.extractBetween(i-1, pp.getIndex(), str); - newPat.append(str); - rebuildPattern = TRUE; - - i = pp.getIndex(); // advance past property pattern - - if (mode == 3) { - // Entire pattern is a category; leave parse - // loop. This is one of 2 ways we leave this - // loop if the pattern is well-formed. - *this = nestedAux; - mode = 5; - break; - } - } - - /* Handle escapes. If a character is escaped, then it assumes its - * literal value. This is true for all characters, both special - * characters and characters with no special meaning. We also - * interpret '\\uxxxx' Unicode escapes here (as literals). - */ - else if (c == BACKSLASH) { - UChar32 escaped = pattern.unescapeAt(i); - if (escaped == (UChar32) -1) { - status = U_ILLEGAL_ARGUMENT_ERROR; - return; - } - isLiteral = TRUE; - c = escaped; - } - - /* Parse variable references. These are treated as literals. If a - * variable refers to a UnicodeSet, its stand in character is - * returned in the UChar[] buffer. - * Variable names are only parsed if varNameToChar is not null. - * Set variables are only looked up if varCharToSet is not null. - */ - else if (symbols != NULL && !isLiteral && c == SymbolTable::SYMBOL_REF) { - pos.setIndex(i); - UnicodeString name = symbols->parseReference(pattern, pos, limit); - if (name.length() != 0) { - varValueBuffer = symbols->lookup(name); - if (varValueBuffer == NULL) { - //throw new IllegalArgumentException("Undefined variable: " - // + name); - status = U_ILLEGAL_ARGUMENT_ERROR; - return; - } - ivarValueBuffer = 0; - i = pos.getIndex(); // Make i point PAST last char of var name - } else { - // Got a null; this means we have an isolated $. - // Tentatively assume this is an anchor. - anchor = 1; - } - continue; // Back to the top to get varValueBuffer[0] - } - - /* An opening bracket indicates the first bracket of a nested - * subpattern. - */ - else if (!isLiteral && c == SET_OPEN) { - // Record position before nested pattern - nestedPatStart = newPat.length(); - - // Recurse to get the pairs for this nested set. - // Backup i to '['. - pos.setIndex(--i); - switch (lastOp) { - case HYPHEN: - case INTERSECTION: - newPat.append(lastOp); - break; - } - nestedAux._applyPattern(pattern, pos, options, symbols, newPat, status); - nestedSet = &nestedAux; - nestedPatDone = TRUE; - if (U_FAILURE(status)) { - return; - } - i = pos.getIndex(); - } - - else if (!isLiteral && c == OPEN_BRACE) { - // start of a string. find the rest. - int32_t length = 0; - int32_t st = i; - multiCharBuffer.truncate(0); - while (i < pattern.length()) { - UChar32 ch = pattern.char32At(i); - i += UTF_CHAR_LENGTH(ch); - if (ch == CLOSE_BRACE) { - length = -length; // signal that we saw '}' - break; - } else if (ch == BACKSLASH) { - ch = pattern.unescapeAt(i); - if (ch == (UChar32) -1) { - status = U_ILLEGAL_ARGUMENT_ERROR; - return; - } - } - --length; // sic; see above - multiCharBuffer.append(ch); - } - if (length < 1) { - status = U_ILLEGAL_ARGUMENT_ERROR; - return; - } - // We have new string. Add it to set and continue; - // we don't need to drop through to the further - // processing - add(multiCharBuffer); - pattern.extractBetween(st, i, multiCharBuffer); - newPat.append(OPEN_BRACE).append(multiCharBuffer); - rebuildPattern = TRUE; - continue; - } - } - - /* At this point we have either a character c, or a nested set. If - * we have encountered a nested set, either embedded in the pattern, - * or as a variable, we have a non-null nestedSet, and c should be - * ignored. Otherwise c is the current character, and isLiteral - * indicates whether it is an escaped literal (or variable) or a - * normal unescaped character. Unescaped characters '-', '&', and - * ']' have special meanings. - */ - if (nestedSet != NULL) { - if (lastChar != NONE) { - if (lastOp != 0) { - // throw new IllegalArgumentException("Illegal rhs for " + lastChar + lastOp); - status = U_ILLEGAL_ARGUMENT_ERROR; - return; - } - add(lastChar, lastChar); - if (nestedPatDone) { - // If there was a character before the nested set, - // then we need to insert it in newPat before the - // pattern for the nested set. This position was - // recorded in nestedPatStart. - UnicodeString s; - _appendToPat(s, lastChar, FALSE); - newPat.insert(nestedPatStart, s); - } else { - _appendToPat(newPat, lastChar, FALSE); - } - lastChar = NONE; - } - switch (lastOp) { - case HYPHEN: - removeAll(*nestedSet); - break; - case INTERSECTION: - retainAll(*nestedSet); - break; - case 0: - addAll(*nestedSet); - break; - } - - // Get the pattern for the nested set, if we haven't done so - // already. - if (!nestedPatDone) { - if (lastOp != 0) { - newPat.append(lastOp); - } - nestedSet->_toPattern(newPat, FALSE); - } - rebuildPattern = TRUE; - - lastOp = 0; - - } else if (!isLiteral && c == SET_CLOSE) { - // Final closing delimiter. This is one of 2 ways we - // leave this loop if the pattern is well-formed. - if (anchor > 2 || anchor == 1) { - //throw new IllegalArgumentException("Syntax error near $" + pattern); - status = U_ILLEGAL_ARGUMENT_ERROR; - return; - } - if (anchor == 2) { - rebuildPattern = TRUE; - newPat.append((UChar)SymbolTable::SYMBOL_REF); - add(U_ETHER); - } - mode = 4; - break; - } else if (lastOp == 0 && !isLiteral && (c == HYPHEN || c == INTERSECTION)) { - // assert(c <= 0xFFFF); - lastOp = (UChar) c; - } else if (lastOp == HYPHEN) { - if (lastChar >= c || lastChar == NONE) { - // Don't allow redundant (a-a) or empty (b-a) ranges; - // these are most likely typos. - //throw new IllegalArgumentException("Invalid range " + lastChar + - // '-' + c); - status = U_ILLEGAL_ARGUMENT_ERROR; - return; - } - add(lastChar, c); - _appendToPat(newPat, lastChar, FALSE); - newPat.append(HYPHEN); - _appendToPat(newPat, c, FALSE); - lastOp = 0; - lastChar = NONE; - } else if (lastOp != 0) { - // We have & or & - // throw new IllegalArgumentException("Unquoted " + lastOp); - status = U_ILLEGAL_ARGUMENT_ERROR; - return; - } else { - if (lastChar != NONE) { - // We have - add(lastChar, lastChar); - _appendToPat(newPat, lastChar, FALSE); - } - lastChar = c; - isLastLiteral = isLiteral; - } - } - - if (mode < 4) { - // throw new IllegalArgumentException("Missing ']'"); - status = U_ILLEGAL_ARGUMENT_ERROR; - return; - } - - // Treat a trailing '$' as indicating U_ETHER. This code is only - // executed if symbols == NULL; otherwise other code parses the - // anchor. - if (lastChar == (UChar)SymbolTable::SYMBOL_REF && !isLastLiteral) { - rebuildPattern = TRUE; - newPat.append(lastChar); - add(U_ETHER); - } - - else if (lastChar != NONE) { - add(lastChar, lastChar); - _appendToPat(newPat, lastChar, FALSE); - } - - // Handle unprocessed stuff preceding the closing ']' - if (lastOp == HYPHEN) { - // Trailing '-' is treated as literal - add(lastOp, lastOp); - newPat.append(HYPHEN); - } else if (lastOp == INTERSECTION) { - // throw new IllegalArgumentException("Unquoted trailing " + lastOp); - status = U_ILLEGAL_ARGUMENT_ERROR; - return; - } - - if (mode == 4) { - newPat.append(SET_CLOSE); - } - - /** - * If this pattern should be compiled case-insensitive, then - * we need to close over case BEFORE complementing. This - * makes patterns like /[^abc]/i work. - */ - if ((options & USET_CASE_INSENSITIVE) != 0) { - closeOver(USET_CASE); - } - - /** - * If we saw a '^' after the initial '[' of this pattern, then perform - * the complement. (Inversion after '[:' is handled elsewhere.) - */ - if (invert) { - complement(); - } - - pos.setIndex(i); - - // Use the rebuilt pattern (newPat) only if necessary. Prefer the - // generated pattern. - if (rebuildPattern) { - rebuiltPat.append(newPat); - } else { - _generatePattern(rebuiltPat, FALSE); - } -} - //---------------------------------------------------------------- // Implementation: Utility methods //---------------------------------------------------------------- @@ -2646,1019 +1664,172 @@ void UnicodeSet::retain(const UChar32* other, int32_t otherLen, int8_t polarity) pat.truncate(0); } -//---------------------------------------------------------------- -// Property set implementation -//---------------------------------------------------------------- - -static UBool numericValueFilter(UChar32 ch, void* context) { - return u_getNumericValue(ch) == *(double*)context; -} - -static UBool generalCategoryMaskFilter(UChar32 ch, void* context) { - int32_t value = *(int32_t*)context; - return (U_GET_GC_MASK((UChar32) ch) & value) != 0; -} - -static UBool versionFilter(UChar32 ch, void* context) { - UVersionInfo v, none = { 0, 0, 0, 0}; - UVersionInfo* version = (UVersionInfo*)context; - u_charAge(ch, v); - return uprv_memcmp(&v, &none, sizeof(v)) > 0 && uprv_memcmp(&v, version, sizeof(v)) <= 0; -} - -typedef struct { - UProperty prop; - int32_t value; -} IntPropertyContext; - -static UBool intPropertyFilter(UChar32 ch, void* context) { - IntPropertyContext* c = (IntPropertyContext*)context; - return u_getIntPropertyValue((UChar32) ch, c->prop) == c->value; -} - - /** - * Generic filter-based scanning code for UCD property UnicodeSets. + * Append the toPattern() representation of a + * string to the given StringBuffer. */ -void UnicodeSet::applyFilter(UnicodeSet::Filter filter, - void* context, - UErrorCode &status) { - // Walk through all Unicode characters, noting the start - // and end of each range for which filter.contain(c) is - // true. Add each range to a set. - // - // To improve performance, use the INCLUSIONS set, which - // encodes information about character ranges that are known - // to have identical properties. INCLUSIONS contains - // only the first characters of such ranges. - // - // TODO Where possible, instead of scanning over code points, - // use internal property data to initialize UnicodeSets for - // those properties. Scanning code points is slow. - if (U_FAILURE(status)) return; - - const UnicodeSet* inclusions = getInclusions(status); - if (U_FAILURE(status)) { - return; - } - - clear(); - - UChar32 startHasProperty = -1; - int limitRange = inclusions->getRangeCount(); - - for (int j=0; jgetRangeStart(j); - UChar32 end = inclusions->getRangeEnd(j); - - // for all the code points in the range, process - for (UChar32 ch = start; ch <= end; ++ch) { - // only add to this UnicodeSet on inflection points -- - // where the hasProperty value changes to false - if ((*filter)(ch, context)) { - if (startHasProperty < 0) { - startHasProperty = ch; - } - } else if (startHasProperty >= 0) { - add(startHasProperty, ch-1); - startHasProperty = -1; - } - } - } - if (startHasProperty >= 0) { - add((UChar32)startHasProperty, (UChar32)0x10FFFF); +void UnicodeSet::_appendToPat(UnicodeString& buf, const UnicodeString& s, UBool +escapeUnprintable) { + UChar32 cp; + for (int32_t i = 0; i < s.length(); i += UTF_CHAR_LENGTH(cp)) { + _appendToPat(buf, cp = s.char32At(i), escapeUnprintable); } } -static UBool mungeCharName(char* dst, const char* src, int32_t dstCapacity) { - /* Note: we use ' ' in compiler code page */ - int32_t j = 0; - char ch; - --dstCapacity; /* make room for term. zero */ - while ((ch = *src++) != 0) { - if (ch == ' ' && (j==0 || (j>0 && dst[j-1]==' '))) { - continue; +/** + * Append the toPattern() representation of a + * character to the given StringBuffer. + */ +void UnicodeSet::_appendToPat(UnicodeString& buf, UChar32 c, UBool +escapeUnprintable) { + if (escapeUnprintable && ICU_Utility::isUnprintable(c)) { + // Use hex escape notation (\uxxxx or \Uxxxxxxxx) for anything + // unprintable + if (ICU_Utility::escapeUnprintable(buf, c)) { + return; } - if (j >= dstCapacity) return FALSE; - dst[j++] = ch; } - if (j > 0 && dst[j-1] == ' ') --j; - dst[j] = 0; - return TRUE; -} - -//---------------------------------------------------------------- -// Property set API -//---------------------------------------------------------------- - -#define FAIL(ec) {ec=U_ILLEGAL_ARGUMENT_ERROR; return *this;} - -// TODO: Remove the following special-case code when -// these four C99-compatibility properties are implemented -// as enums/names. -static UBool c99Filter(UChar32 ch, void* context) { - struct _C99_Map* m = (struct _C99_Map*) context; - return m->func(ch); -} - -UnicodeSet& -UnicodeSet::applyIntPropertyValue(UProperty prop, int32_t value, UErrorCode& ec) { - if (U_FAILURE(ec)) return *this; - - if (prop == UCHAR_GENERAL_CATEGORY_MASK) { - applyFilter(generalCategoryMaskFilter, &value, ec); -#if UCONFIG_NO_NORMALIZATION - } else if(prop == UCHAR_HANGUL_SYLLABLE_TYPE) { - /* - * Special code for when normalization is off. - * HST is still available because it is hardcoded in uprops.c, but - * the inclusions set does not have the necessary code points - * for normalization properties. - * I am hardcoding HST in this case because it is the only property - * that prevents genbrk from compiling char.txt when normalization is off. - * This saves me from turning off break iteration or making more - * complicated changes in genbrk. - * - * This code is not efficient. For efficiency turn on normalization. - * - * markus 20030505 - */ - UChar32 c; - - clear(); - for(c=0x1100; c<=0xd7a3; ++c) { - if(c==0x1200) { - c=0xac00; - } - if(value == u_getIntPropertyValue(c, UCHAR_HANGUL_SYLLABLE_TYPE)) { - add(c); - } + // Okay to let ':' pass through + switch (c) { + case SET_OPEN: + case SET_CLOSE: + case HYPHEN: + case COMPLEMENT: + case INTERSECTION: + case BACKSLASH: + case OPEN_BRACE: + case CLOSE_BRACE: + case COLON: + case SymbolTable::SYMBOL_REF: + buf.append(BACKSLASH); + break; + default: + // Escape whitespace + if (uprv_isRuleWhiteSpace(c)) { + buf.append(BACKSLASH); } -#endif - } else { - IntPropertyContext c = {prop, value}; - applyFilter(intPropertyFilter, &c, ec); + break; } - return *this; + buf.append(c); } -UnicodeSet& -UnicodeSet::applyPropertyAlias(const UnicodeString& prop, - const UnicodeString& value, - UErrorCode& ec) { - if (U_FAILURE(ec)) return *this; - - UProperty p; - int32_t v; - CharString pname(prop); - CharString vname(value); - UBool mustNotBeEmpty = FALSE; - - if (value.length() > 0) { - p = u_getPropertyEnum(pname); - if (p == UCHAR_INVALID_CODE) FAIL(ec); - - // Treat gc as gcm - if (p == UCHAR_GENERAL_CATEGORY) { - p = UCHAR_GENERAL_CATEGORY_MASK; - } - - if ((p >= UCHAR_BINARY_START && p < UCHAR_BINARY_LIMIT) || - (p >= UCHAR_INT_START && p < UCHAR_INT_LIMIT) || - (p >= UCHAR_MASK_START && p < UCHAR_MASK_LIMIT)) { - v = u_getPropertyValueEnum(p, vname); - if (v == UCHAR_INVALID_CODE) { - // Handle numeric CCC - if (p == UCHAR_CANONICAL_COMBINING_CLASS) { - char* end; - double value = uprv_strtod(vname, &end); - v = (int32_t) value; - if (v != value || v < 0 || *end != 0) { - // non-integral or negative value, or trailing junk - FAIL(ec); - } - // If the resultant set is empty then the numeric value - // was invalid. - mustNotBeEmpty = TRUE; - } else { - FAIL(ec); - } - } - } - - else { - - switch (p) { - case UCHAR_NUMERIC_VALUE: - { - char* end; - double value = uprv_strtod(vname, &end); - if (*end != 0) { - FAIL(ec); - } - applyFilter(numericValueFilter, &value, ec); - return *this; - } - break; - case UCHAR_NAME: - case UCHAR_UNICODE_1_NAME: - { - // Must munge name, since u_charFromName() does not do - // 'loose' matching. - char buf[128]; // it suffices that this be > uprv_getMaxCharNameLength - if (!mungeCharName(buf, vname, sizeof(buf))) FAIL(ec); - UCharNameChoice choice = (p == UCHAR_NAME) ? - U_EXTENDED_CHAR_NAME : U_UNICODE_10_CHAR_NAME; - UChar32 ch = u_charFromName(choice, buf, &ec); - if (U_SUCCESS(ec)) { - clear(); - add(ch); - return *this; - } else { - FAIL(ec); - } - } - break; - case UCHAR_AGE: - { - // Must munge name, since u_versionFromString() does not do - // 'loose' matching. - char buf[128]; - if (!mungeCharName(buf, vname, sizeof(buf))) FAIL(ec); - UVersionInfo version; - u_versionFromString(version, buf); - applyFilter(versionFilter, &version, ec); - return *this; +/** + * Append a string representation of this set to result. This will be + * a cleaned version of the string passed to applyPattern(), if there + * is one. Otherwise it will be generated. + */ +UnicodeString& UnicodeSet::_toPattern(UnicodeString& result, + UBool escapeUnprintable) const { + if (pat.length() > 0) { + int32_t i; + int32_t backslashCount = 0; + for (i=0; i= UCHAR_BINARY_START && p < UCHAR_BINARY_LIMIT) { - v = 1; - } else if (0 == uprv_comparePropertyNames(ANY, pname)) { - set(MIN_VALUE, MAX_VALUE); - return *this; - } else if (0 == uprv_comparePropertyNames(ASCII, pname)) { - set(0, 0x7F); - return *this; + ICU_Utility::escapeUnprintable(result, c); + backslashCount = 0; + } else { + result.append(c); + if (c == BACKSLASH) { + ++backslashCount; } else { - - // TODO: Remove the following special-case code when - // these four C99-compatibility properties are implemented - // as enums/names. - for (int32_t i=0; i<_C99_COUNT; ++i) { - int32_t c = uprv_comparePropertyNames(pname, _C99_DISPATCH[i].name); - if (c == 0) { - applyFilter(c99Filter, (void*) &_C99_DISPATCH[i], ec); - return *this; - } else if (c < 0) { - // Further entries will not match; bail out - break; - } - } - - FAIL(ec); + backslashCount = 0; } } } - } - - applyIntPropertyValue(p, v, ec); - - if (U_SUCCESS(ec) && (mustNotBeEmpty && isEmpty())) { - // mustNotBeEmpty is set to true if an empty set indicates - // invalid input. - ec = U_ILLEGAL_ARGUMENT_ERROR; - } - - return *this; -} - -//---------------------------------------------------------------- -// Property set patterns -//---------------------------------------------------------------- - -/** - * Return true if the given position, in the given pattern, appears - * to be the start of a property set pattern. - */ -UBool UnicodeSet::resemblesPropertyPattern(const UnicodeString& pattern, - int32_t pos) { - // Patterns are at least 5 characters long - if ((pos+5) > pattern.length()) { - return FALSE; - } - - // Look for an opening [:, [:^, \p, or \P - return isPOSIXOpen(pattern, pos) || isPerlOpen(pattern, pos) || isNameOpen(pattern, pos); -} - -/** - * Parse the given property pattern at the given parse position. - */ -UnicodeSet& UnicodeSet::applyPropertyPattern(const UnicodeString& pattern, - ParsePosition& ppos, - UErrorCode &ec) { - int32_t pos = ppos.getIndex(); - - UBool posix = FALSE; // true for [:pat:], false for \p{pat} \P{pat} \N{pat} - UBool isName = FALSE; // true for \N{pat}, o/w false - UBool invert = FALSE; - - if (U_FAILURE(ec)) return *this; - - // Minimum length is 5 characters, e.g. \p{L} - if ((pos+5) > pattern.length()) { - FAIL(ec); - } - - // On entry, ppos should point to one of the following locations: - // Look for an opening [:, [:^, \p, or \P - if (isPOSIXOpen(pattern, pos)) { - posix = TRUE; - pos += 2; - pos = ICU_Utility::skipWhitespace(pattern, pos); - if (pos < pattern.length() && pattern.charAt(pos) == COMPLEMENT) { - ++pos; - invert = TRUE; - } - } else if (isPerlOpen(pattern, pos) || isNameOpen(pattern, pos)) { - UChar c = pattern.charAt(pos+1); - invert = (c == UPPER_P); - isName = (c == UPPER_N); - pos += 2; - pos = ICU_Utility::skipWhitespace(pattern, pos); - if (pos == pattern.length() || pattern.charAt(pos++) != OPEN_BRACE) { - // Syntax error; "\p" or "\P" not followed by "{" - FAIL(ec); - } - } else { - // Open delimiter not seen - FAIL(ec); - } - - // Look for the matching close delimiter, either :] or } - int32_t close = pattern.indexOf(posix ? POSIX_CLOSE : PERL_CLOSE, pos); - if (close < 0) { - // Syntax error; close delimiter missing - FAIL(ec); - } - - // Look for an '=' sign. If this is present, we will parse a - // medium \p{gc=Cf} or long \p{GeneralCategory=Format} - // pattern. - int32_t equals = pattern.indexOf(EQUALS, pos); - UnicodeString propName, valueName; - if (equals >= 0 && equals < close && !isName) { - // Equals seen; parse medium/long pattern - pattern.extractBetween(pos, equals, propName); - pattern.extractBetween(equals+1, close, valueName); - } - - else { - // Handle case where no '=' is seen, and \N{} - pattern.extractBetween(pos, close, propName); - - // Handle \N{name} - if (isName) { - // This is a little inefficient since it means we have to - // parse NAME_PROP back to UCHAR_NAME even though we already - // know it's UCHAR_NAME. If we refactor the API to - // support args of (UProperty, char*) then we can remove - // NAME_PROP and make this a little more efficient. - valueName = propName; - propName = NAME_PROP; - } - } - - applyPropertyAlias(propName, valueName, ec); - - if (U_SUCCESS(ec)) { - if (invert) { - complement(); - } - - // Move to the limit position after the close delimiter if the - // parse succeeded. - ppos.setIndex(close + (posix ? 2 : 1)); + return result; } - return *this; -} - -//---------------------------------------------------------------- -// Inclusions list -//---------------------------------------------------------------- - -const UnicodeSet* UnicodeSet::getInclusions(UErrorCode &status) { - umtx_lock(NULL); - UBool f = (INCLUSIONS == NULL); - umtx_unlock(NULL); - if (f) { - UnicodeSet* incl = new UnicodeSet(); - if (incl != NULL) { - uprv_getInclusions((USet*)incl, &status); - if (U_SUCCESS(status)) { - umtx_lock(NULL); - if (INCLUSIONS == NULL) { - INCLUSIONS = incl; - incl = NULL; - } - umtx_unlock(NULL); - } - delete incl; - } else { - status = U_MEMORY_ALLOCATION_ERROR; - } - } - return INCLUSIONS; + return _generatePattern(result, escapeUnprintable); } /** - * Cleanup function for UnicodeSet + * Returns a string representation of this set. If the result of + * calling this function is passed to a UnicodeSet constructor, it + * will produce another set that is equal to this one. */ -U_CFUNC UBool uset_cleanup(void) { - if (INCLUSIONS != NULL) { - delete INCLUSIONS; - INCLUSIONS = NULL; - } - - if (CASE_EQUIV_HASH != NULL) { - delete CASE_EQUIV_HASH; - CASE_EQUIV_HASH = NULL; - } - - if (CASE_EQUIV_CBA != NULL) { - ucmp8_close(CASE_EQUIV_CBA); - CASE_EQUIV_CBA = NULL; - } - - return TRUE; -} - -//---------------------------------------------------------------- -// Case folding API -//---------------------------------------------------------------- - -UnicodeSet& UnicodeSet::closeOver(int32_t attribute) { - if ((attribute & USET_CASE) != 0) { - UnicodeSet foldSet; - UnicodeString str; - int32_t n = getRangeCount(); - for (int32_t i=0; isize() > 0) { - for (int32_t j=0; jsize(); ++j) { - str = * (const UnicodeString*) strings->elementAt(j); - foldSet.caseCloseOne(str.foldCase()); - } - } - *this = foldSet; - } - return *this; +UnicodeString& UnicodeSet::toPattern(UnicodeString& result, + UBool escapeUnprintable) const { + result.truncate(0); + return _toPattern(result, escapeUnprintable); } -//---------------------------------------------------------------- -// Case folding implementation -//---------------------------------------------------------------- - /** - * Data structure representing a case-fold equivalency class. It is a - * SET containing 0 or more code units, and 0 or more strings of - * length 2 code units or longer. - * - * This class is implemented as a 8-UChar buffer with a few - * convenience methods on it. The format of the buffer: - * - All single code units in this set, followed by a terminating - * zero. If none, then just a terminating zero. - * - Zero or more 0-terminated strings, each of length >= 2 - * code units. - * - A single terminating (UChar)0. - * - * Usage: - * - * const CaseEquivClass& c = ...; - * const UChar* p; - * for (c.getStrings(p); *p; c.nextString(p)) { - * foo(p); - * } - */ -class CaseEquivClass { -public: - UChar data[8]; - - /** - * Return the string of single code units. May be "". Will never - * be NULL. - */ - const UChar* getSingles() const { - return data; - } - - /** - * Return the first multi-code-unit string. May be "" if there - * are none. Will never be NULL. - * @param p pointer to be set to point to the first string. - */ - void getStrings(const UChar*& p) const { - p = data; - nextString(p); - } - - /** - * Advance a pointer from one multi-code-unit string to the next. - * May advance 'p' to point to "" if there are no more. - * Do NOT call if *p == 0. - * @param p pointer to be advanced to point to the next string. - */ - static void nextString(const UChar*& p) { - while (*p++) {} - } -}; - -/** - * IMPORTANT: The following two static data arrays represent the - * information used to do case closure. The first array is an array - * of pairs. That is, for each even index e, entries [e] and [e+1] - * form a pair of case equivalent code units. The entry at [e] is the - * folded one, that is, the one for which u_foldCase(x)==x. - * - * The second static array is an array of CaseEquivClass objects. - * Since these objects are just adorned UChar[] arrays, they can be - * initialized in place in the array, and all of them can live in a - * single piece of static memory, with no heap allocation. - */ - -// MACHINE-GENERATED: Do not edit (see com.ibm.icu.dev.tools.translit.UnicodeSetCloseOver) -static const UChar CASE_PAIRS[] = { - 0x0061,0x0041,0x0062,0x0042,0x0063,0x0043,0x0064,0x0044,0x0065,0x0045, - 0x0066,0x0046,0x0067,0x0047,0x0068,0x0048,0x0069,0x0049,0x006A,0x004A, - 0x006C,0x004C,0x006D,0x004D,0x006E,0x004E,0x006F,0x004F,0x0070,0x0050, - 0x0071,0x0051,0x0072,0x0052,0x0074,0x0054,0x0075,0x0055,0x0076,0x0056, - 0x0077,0x0057,0x0078,0x0058,0x0079,0x0059,0x007A,0x005A,0x00E0,0x00C0, - 0x00E1,0x00C1,0x00E2,0x00C2,0x00E3,0x00C3,0x00E4,0x00C4,0x00E6,0x00C6, - 0x00E7,0x00C7,0x00E8,0x00C8,0x00E9,0x00C9,0x00EA,0x00CA,0x00EB,0x00CB, - 0x00EC,0x00CC,0x00ED,0x00CD,0x00EE,0x00CE,0x00EF,0x00CF,0x00F0,0x00D0, - 0x00F1,0x00D1,0x00F2,0x00D2,0x00F3,0x00D3,0x00F4,0x00D4,0x00F5,0x00D5, - 0x00F6,0x00D6,0x00F8,0x00D8,0x00F9,0x00D9,0x00FA,0x00DA,0x00FB,0x00DB, - 0x00FC,0x00DC,0x00FD,0x00DD,0x00FE,0x00DE,0x00FF,0x0178,0x0101,0x0100, - 0x0103,0x0102,0x0105,0x0104,0x0107,0x0106,0x0109,0x0108,0x010B,0x010A, - 0x010D,0x010C,0x010F,0x010E,0x0111,0x0110,0x0113,0x0112,0x0115,0x0114, - 0x0117,0x0116,0x0119,0x0118,0x011B,0x011A,0x011D,0x011C,0x011F,0x011E, - 0x0121,0x0120,0x0123,0x0122,0x0125,0x0124,0x0127,0x0126,0x0129,0x0128, - 0x012B,0x012A,0x012D,0x012C,0x012F,0x012E,0x0133,0x0132,0x0135,0x0134, - 0x0137,0x0136,0x013A,0x0139,0x013C,0x013B,0x013E,0x013D,0x0140,0x013F, - 0x0142,0x0141,0x0144,0x0143,0x0146,0x0145,0x0148,0x0147,0x014B,0x014A, - 0x014D,0x014C,0x014F,0x014E,0x0151,0x0150,0x0153,0x0152,0x0155,0x0154, - 0x0157,0x0156,0x0159,0x0158,0x015B,0x015A,0x015D,0x015C,0x015F,0x015E, - 0x0161,0x0160,0x0163,0x0162,0x0165,0x0164,0x0167,0x0166,0x0169,0x0168, - 0x016B,0x016A,0x016D,0x016C,0x016F,0x016E,0x0171,0x0170,0x0173,0x0172, - 0x0175,0x0174,0x0177,0x0176,0x017A,0x0179,0x017C,0x017B,0x017E,0x017D, - 0x0183,0x0182,0x0185,0x0184,0x0188,0x0187,0x018C,0x018B,0x0192,0x0191, - 0x0195,0x01F6,0x0199,0x0198,0x019E,0x0220,0x01A1,0x01A0,0x01A3,0x01A2, - 0x01A5,0x01A4,0x01A8,0x01A7,0x01AD,0x01AC,0x01B0,0x01AF,0x01B4,0x01B3, - 0x01B6,0x01B5,0x01B9,0x01B8,0x01BD,0x01BC,0x01BF,0x01F7,0x01CE,0x01CD, - 0x01D0,0x01CF,0x01D2,0x01D1,0x01D4,0x01D3,0x01D6,0x01D5,0x01D8,0x01D7, - 0x01DA,0x01D9,0x01DC,0x01DB,0x01DD,0x018E,0x01DF,0x01DE,0x01E1,0x01E0, - 0x01E3,0x01E2,0x01E5,0x01E4,0x01E7,0x01E6,0x01E9,0x01E8,0x01EB,0x01EA, - 0x01ED,0x01EC,0x01EF,0x01EE,0x01F5,0x01F4,0x01F9,0x01F8,0x01FB,0x01FA, - 0x01FD,0x01FC,0x01FF,0x01FE,0x0201,0x0200,0x0203,0x0202,0x0205,0x0204, - 0x0207,0x0206,0x0209,0x0208,0x020B,0x020A,0x020D,0x020C,0x020F,0x020E, - 0x0211,0x0210,0x0213,0x0212,0x0215,0x0214,0x0217,0x0216,0x0219,0x0218, - 0x021B,0x021A,0x021D,0x021C,0x021F,0x021E,0x0223,0x0222,0x0225,0x0224, - 0x0227,0x0226,0x0229,0x0228,0x022B,0x022A,0x022D,0x022C,0x022F,0x022E, - 0x0231,0x0230,0x0233,0x0232,0x0253,0x0181,0x0254,0x0186,0x0256,0x0189, - 0x0257,0x018A,0x0259,0x018F,0x025B,0x0190,0x0260,0x0193,0x0263,0x0194, - 0x0268,0x0197,0x0269,0x0196,0x026F,0x019C,0x0272,0x019D,0x0275,0x019F, - 0x0280,0x01A6,0x0283,0x01A9,0x0288,0x01AE,0x028A,0x01B1,0x028B,0x01B2, - 0x0292,0x01B7,0x03AC,0x0386,0x03AD,0x0388,0x03AE,0x0389,0x03AF,0x038A, - 0x03B1,0x0391,0x03B3,0x0393,0x03B4,0x0394,0x03B6,0x0396,0x03B7,0x0397, - 0x03BB,0x039B,0x03BD,0x039D,0x03BE,0x039E,0x03BF,0x039F,0x03C4,0x03A4, - 0x03C5,0x03A5,0x03C7,0x03A7,0x03C8,0x03A8,0x03CA,0x03AA,0x03CB,0x03AB, - 0x03CC,0x038C,0x03CD,0x038E,0x03CE,0x038F,0x03D9,0x03D8,0x03DB,0x03DA, - 0x03DD,0x03DC,0x03DF,0x03DE,0x03E1,0x03E0,0x03E3,0x03E2,0x03E5,0x03E4, - 0x03E7,0x03E6,0x03E9,0x03E8,0x03EB,0x03EA,0x03ED,0x03EC,0x03EF,0x03EE, - 0x0430,0x0410,0x0431,0x0411,0x0432,0x0412,0x0433,0x0413,0x0434,0x0414, - 0x0435,0x0415,0x0436,0x0416,0x0437,0x0417,0x0438,0x0418,0x0439,0x0419, - 0x043A,0x041A,0x043B,0x041B,0x043C,0x041C,0x043D,0x041D,0x043E,0x041E, - 0x043F,0x041F,0x0440,0x0420,0x0441,0x0421,0x0442,0x0422,0x0443,0x0423, - 0x0444,0x0424,0x0445,0x0425,0x0446,0x0426,0x0447,0x0427,0x0448,0x0428, - 0x0449,0x0429,0x044A,0x042A,0x044B,0x042B,0x044C,0x042C,0x044D,0x042D, - 0x044E,0x042E,0x044F,0x042F,0x0450,0x0400,0x0451,0x0401,0x0452,0x0402, - 0x0453,0x0403,0x0454,0x0404,0x0455,0x0405,0x0456,0x0406,0x0457,0x0407, - 0x0458,0x0408,0x0459,0x0409,0x045A,0x040A,0x045B,0x040B,0x045C,0x040C, - 0x045D,0x040D,0x045E,0x040E,0x045F,0x040F,0x0461,0x0460,0x0463,0x0462, - 0x0465,0x0464,0x0467,0x0466,0x0469,0x0468,0x046B,0x046A,0x046D,0x046C, - 0x046F,0x046E,0x0471,0x0470,0x0473,0x0472,0x0475,0x0474,0x0477,0x0476, - 0x0479,0x0478,0x047B,0x047A,0x047D,0x047C,0x047F,0x047E,0x0481,0x0480, - 0x048B,0x048A,0x048D,0x048C,0x048F,0x048E,0x0491,0x0490,0x0493,0x0492, - 0x0495,0x0494,0x0497,0x0496,0x0499,0x0498,0x049B,0x049A,0x049D,0x049C, - 0x049F,0x049E,0x04A1,0x04A0,0x04A3,0x04A2,0x04A5,0x04A4,0x04A7,0x04A6, - 0x04A9,0x04A8,0x04AB,0x04AA,0x04AD,0x04AC,0x04AF,0x04AE,0x04B1,0x04B0, - 0x04B3,0x04B2,0x04B5,0x04B4,0x04B7,0x04B6,0x04B9,0x04B8,0x04BB,0x04BA, - 0x04BD,0x04BC,0x04BF,0x04BE,0x04C2,0x04C1,0x04C4,0x04C3,0x04C6,0x04C5, - 0x04C8,0x04C7,0x04CA,0x04C9,0x04CC,0x04CB,0x04CE,0x04CD,0x04D1,0x04D0, - 0x04D3,0x04D2,0x04D5,0x04D4,0x04D7,0x04D6,0x04D9,0x04D8,0x04DB,0x04DA, - 0x04DD,0x04DC,0x04DF,0x04DE,0x04E1,0x04E0,0x04E3,0x04E2,0x04E5,0x04E4, - 0x04E7,0x04E6,0x04E9,0x04E8,0x04EB,0x04EA,0x04ED,0x04EC,0x04EF,0x04EE, - 0x04F1,0x04F0,0x04F3,0x04F2,0x04F5,0x04F4,0x04F9,0x04F8,0x0501,0x0500, - 0x0503,0x0502,0x0505,0x0504,0x0507,0x0506,0x0509,0x0508,0x050B,0x050A, - 0x050D,0x050C,0x050F,0x050E,0x0561,0x0531,0x0562,0x0532,0x0563,0x0533, - 0x0564,0x0534,0x0565,0x0535,0x0566,0x0536,0x0567,0x0537,0x0568,0x0538, - 0x0569,0x0539,0x056A,0x053A,0x056B,0x053B,0x056C,0x053C,0x056D,0x053D, - 0x056E,0x053E,0x056F,0x053F,0x0570,0x0540,0x0571,0x0541,0x0572,0x0542, - 0x0573,0x0543,0x0574,0x0544,0x0575,0x0545,0x0576,0x0546,0x0577,0x0547, - 0x0578,0x0548,0x0579,0x0549,0x057A,0x054A,0x057B,0x054B,0x057C,0x054C, - 0x057D,0x054D,0x057E,0x054E,0x057F,0x054F,0x0580,0x0550,0x0581,0x0551, - 0x0582,0x0552,0x0583,0x0553,0x0584,0x0554,0x0585,0x0555,0x0586,0x0556, - 0x1E01,0x1E00,0x1E03,0x1E02,0x1E05,0x1E04,0x1E07,0x1E06,0x1E09,0x1E08, - 0x1E0B,0x1E0A,0x1E0D,0x1E0C,0x1E0F,0x1E0E,0x1E11,0x1E10,0x1E13,0x1E12, - 0x1E15,0x1E14,0x1E17,0x1E16,0x1E19,0x1E18,0x1E1B,0x1E1A,0x1E1D,0x1E1C, - 0x1E1F,0x1E1E,0x1E21,0x1E20,0x1E23,0x1E22,0x1E25,0x1E24,0x1E27,0x1E26, - 0x1E29,0x1E28,0x1E2B,0x1E2A,0x1E2D,0x1E2C,0x1E2F,0x1E2E,0x1E31,0x1E30, - 0x1E33,0x1E32,0x1E35,0x1E34,0x1E37,0x1E36,0x1E39,0x1E38,0x1E3B,0x1E3A, - 0x1E3D,0x1E3C,0x1E3F,0x1E3E,0x1E41,0x1E40,0x1E43,0x1E42,0x1E45,0x1E44, - 0x1E47,0x1E46,0x1E49,0x1E48,0x1E4B,0x1E4A,0x1E4D,0x1E4C,0x1E4F,0x1E4E, - 0x1E51,0x1E50,0x1E53,0x1E52,0x1E55,0x1E54,0x1E57,0x1E56,0x1E59,0x1E58, - 0x1E5B,0x1E5A,0x1E5D,0x1E5C,0x1E5F,0x1E5E,0x1E63,0x1E62,0x1E65,0x1E64, - 0x1E67,0x1E66,0x1E69,0x1E68,0x1E6B,0x1E6A,0x1E6D,0x1E6C,0x1E6F,0x1E6E, - 0x1E71,0x1E70,0x1E73,0x1E72,0x1E75,0x1E74,0x1E77,0x1E76,0x1E79,0x1E78, - 0x1E7B,0x1E7A,0x1E7D,0x1E7C,0x1E7F,0x1E7E,0x1E81,0x1E80,0x1E83,0x1E82, - 0x1E85,0x1E84,0x1E87,0x1E86,0x1E89,0x1E88,0x1E8B,0x1E8A,0x1E8D,0x1E8C, - 0x1E8F,0x1E8E,0x1E91,0x1E90,0x1E93,0x1E92,0x1E95,0x1E94,0x1EA1,0x1EA0, - 0x1EA3,0x1EA2,0x1EA5,0x1EA4,0x1EA7,0x1EA6,0x1EA9,0x1EA8,0x1EAB,0x1EAA, - 0x1EAD,0x1EAC,0x1EAF,0x1EAE,0x1EB1,0x1EB0,0x1EB3,0x1EB2,0x1EB5,0x1EB4, - 0x1EB7,0x1EB6,0x1EB9,0x1EB8,0x1EBB,0x1EBA,0x1EBD,0x1EBC,0x1EBF,0x1EBE, - 0x1EC1,0x1EC0,0x1EC3,0x1EC2,0x1EC5,0x1EC4,0x1EC7,0x1EC6,0x1EC9,0x1EC8, - 0x1ECB,0x1ECA,0x1ECD,0x1ECC,0x1ECF,0x1ECE,0x1ED1,0x1ED0,0x1ED3,0x1ED2, - 0x1ED5,0x1ED4,0x1ED7,0x1ED6,0x1ED9,0x1ED8,0x1EDB,0x1EDA,0x1EDD,0x1EDC, - 0x1EDF,0x1EDE,0x1EE1,0x1EE0,0x1EE3,0x1EE2,0x1EE5,0x1EE4,0x1EE7,0x1EE6, - 0x1EE9,0x1EE8,0x1EEB,0x1EEA,0x1EED,0x1EEC,0x1EEF,0x1EEE,0x1EF1,0x1EF0, - 0x1EF3,0x1EF2,0x1EF5,0x1EF4,0x1EF7,0x1EF6,0x1EF9,0x1EF8,0x1F00,0x1F08, - 0x1F01,0x1F09,0x1F02,0x1F0A,0x1F03,0x1F0B,0x1F04,0x1F0C,0x1F05,0x1F0D, - 0x1F06,0x1F0E,0x1F07,0x1F0F,0x1F10,0x1F18,0x1F11,0x1F19,0x1F12,0x1F1A, - 0x1F13,0x1F1B,0x1F14,0x1F1C,0x1F15,0x1F1D,0x1F20,0x1F28,0x1F21,0x1F29, - 0x1F22,0x1F2A,0x1F23,0x1F2B,0x1F24,0x1F2C,0x1F25,0x1F2D,0x1F26,0x1F2E, - 0x1F27,0x1F2F,0x1F30,0x1F38,0x1F31,0x1F39,0x1F32,0x1F3A,0x1F33,0x1F3B, - 0x1F34,0x1F3C,0x1F35,0x1F3D,0x1F36,0x1F3E,0x1F37,0x1F3F,0x1F40,0x1F48, - 0x1F41,0x1F49,0x1F42,0x1F4A,0x1F43,0x1F4B,0x1F44,0x1F4C,0x1F45,0x1F4D, - 0x1F51,0x1F59,0x1F53,0x1F5B,0x1F55,0x1F5D,0x1F57,0x1F5F,0x1F60,0x1F68, - 0x1F61,0x1F69,0x1F62,0x1F6A,0x1F63,0x1F6B,0x1F64,0x1F6C,0x1F65,0x1F6D, - 0x1F66,0x1F6E,0x1F67,0x1F6F,0x1F70,0x1FBA,0x1F71,0x1FBB,0x1F72,0x1FC8, - 0x1F73,0x1FC9,0x1F74,0x1FCA,0x1F75,0x1FCB,0x1F76,0x1FDA,0x1F77,0x1FDB, - 0x1F78,0x1FF8,0x1F79,0x1FF9,0x1F7A,0x1FEA,0x1F7B,0x1FEB,0x1F7C,0x1FFA, - 0x1F7D,0x1FFB,0x1FB0,0x1FB8,0x1FB1,0x1FB9,0x1FD0,0x1FD8,0x1FD1,0x1FD9, - 0x1FE0,0x1FE8,0x1FE1,0x1FE9,0x1FE5,0x1FEC,0x2170,0x2160,0x2171,0x2161, - 0x2172,0x2162,0x2173,0x2163,0x2174,0x2164,0x2175,0x2165,0x2176,0x2166, - 0x2177,0x2167,0x2178,0x2168,0x2179,0x2169,0x217A,0x216A,0x217B,0x216B, - 0x217C,0x216C,0x217D,0x216D,0x217E,0x216E,0x217F,0x216F,0x24D0,0x24B6, - 0x24D1,0x24B7,0x24D2,0x24B8,0x24D3,0x24B9,0x24D4,0x24BA,0x24D5,0x24BB, - 0x24D6,0x24BC,0x24D7,0x24BD,0x24D8,0x24BE,0x24D9,0x24BF,0x24DA,0x24C0, - 0x24DB,0x24C1,0x24DC,0x24C2,0x24DD,0x24C3,0x24DE,0x24C4,0x24DF,0x24C5, - 0x24E0,0x24C6,0x24E1,0x24C7,0x24E2,0x24C8,0x24E3,0x24C9,0x24E4,0x24CA, - 0x24E5,0x24CB,0x24E6,0x24CC,0x24E7,0x24CD,0x24E8,0x24CE,0x24E9,0x24CF, - 0xFF41,0xFF21,0xFF42,0xFF22,0xFF43,0xFF23,0xFF44,0xFF24,0xFF45,0xFF25, - 0xFF46,0xFF26,0xFF47,0xFF27,0xFF48,0xFF28,0xFF49,0xFF29,0xFF4A,0xFF2A, - 0xFF4B,0xFF2B,0xFF4C,0xFF2C,0xFF4D,0xFF2D,0xFF4E,0xFF2E,0xFF4F,0xFF2F, - 0xFF50,0xFF30,0xFF51,0xFF31,0xFF52,0xFF32,0xFF53,0xFF33,0xFF54,0xFF34, - 0xFF55,0xFF35,0xFF56,0xFF36,0xFF57,0xFF37,0xFF58,0xFF38,0xFF59,0xFF39, - 0xFF5A,0xFF3A, -}; - -// MACHINE-GENERATED: Do not edit (see com.ibm.icu.dev.tools.translit.UnicodeSetCloseOver) -static const CaseEquivClass CASE_NONPAIRS[] = { - {{0x1E9A,0, 0x0061,0x02BE,0, 0}}, - {{0xFB00,0, 0x0066,0x0066,0, 0}}, - {{0xFB03,0, 0x0066,0x0066,0x0069,0, 0}}, - {{0xFB04,0, 0x0066,0x0066,0x006C,0, 0}}, - {{0xFB01,0, 0x0066,0x0069,0, 0}}, - {{0xFB02,0, 0x0066,0x006C,0, 0}}, - {{0x1E96,0, 0x0068,0x0331,0, 0}}, - {{0x0130,0, 0x0069,0x0307,0, 0}}, - {{0x01F0,0, 0x006A,0x030C,0, 0}}, - {{0x004B,0x006B,0x212A,0, 0}}, - {{0x0053,0x0073,0x017F,0, 0}}, - {{0x00DF,0, 0x0073,0x0073,0, 0}}, - {{0xFB05,0xFB06,0, 0x0073,0x0074,0, 0}}, - {{0x1E97,0, 0x0074,0x0308,0, 0}}, - {{0x1E98,0, 0x0077,0x030A,0, 0}}, - {{0x1E99,0, 0x0079,0x030A,0, 0}}, - {{0x00C5,0x00E5,0x212B,0, 0}}, - {{0x01C4,0x01C5,0x01C6,0, 0}}, - {{0x01C7,0x01C8,0x01C9,0, 0}}, - {{0x01CA,0x01CB,0x01CC,0, 0}}, - {{0x01F1,0x01F2,0x01F3,0, 0}}, - {{0x0149,0, 0x02BC,0x006E,0, 0}}, - {{0x1FB4,0, 0x03AC,0x03B9,0, 0}}, - {{0x1FC4,0, 0x03AE,0x03B9,0, 0}}, - {{0x1FB6,0, 0x03B1,0x0342,0, 0}}, - {{0x1FB7,0, 0x03B1,0x0342,0x03B9,0, 0}}, - {{0x1FB3,0x1FBC,0, 0x03B1,0x03B9,0, 0}}, - {{0x0392,0x03B2,0x03D0,0, 0}}, - {{0x0395,0x03B5,0x03F5,0, 0}}, - {{0x1FC6,0, 0x03B7,0x0342,0, 0}}, - {{0x1FC7,0, 0x03B7,0x0342,0x03B9,0, 0}}, - {{0x1FC3,0x1FCC,0, 0x03B7,0x03B9,0, 0}}, - {{0x0398,0x03B8,0x03D1,0x03F4,0, 0}}, - {{0x0345,0x0399,0x03B9,0x1FBE,0, 0}}, - {{0x1FD2,0, 0x03B9,0x0308,0x0300,0, 0}}, - {{0x0390,0x1FD3,0, 0x03B9,0x0308,0x0301,0, 0}}, - {{0x1FD7,0, 0x03B9,0x0308,0x0342,0, 0}}, - {{0x1FD6,0, 0x03B9,0x0342,0, 0}}, - {{0x039A,0x03BA,0x03F0,0, 0}}, - {{0x00B5,0x039C,0x03BC,0, 0}}, - {{0x03A0,0x03C0,0x03D6,0, 0}}, - {{0x03A1,0x03C1,0x03F1,0, 0}}, - {{0x1FE4,0, 0x03C1,0x0313,0, 0}}, - {{0x03A3,0x03C2,0x03C3,0x03F2,0, 0}}, - {{0x1FE2,0, 0x03C5,0x0308,0x0300,0, 0}}, - {{0x03B0,0x1FE3,0, 0x03C5,0x0308,0x0301,0, 0}}, - {{0x1FE7,0, 0x03C5,0x0308,0x0342,0, 0}}, - {{0x1F50,0, 0x03C5,0x0313,0, 0}}, - {{0x1F52,0, 0x03C5,0x0313,0x0300,0, 0}}, - {{0x1F54,0, 0x03C5,0x0313,0x0301,0, 0}}, - {{0x1F56,0, 0x03C5,0x0313,0x0342,0, 0}}, - {{0x1FE6,0, 0x03C5,0x0342,0, 0}}, - {{0x03A6,0x03C6,0x03D5,0, 0}}, - {{0x03A9,0x03C9,0x2126,0, 0}}, - {{0x1FF6,0, 0x03C9,0x0342,0, 0}}, - {{0x1FF7,0, 0x03C9,0x0342,0x03B9,0, 0}}, - {{0x1FF3,0x1FFC,0, 0x03C9,0x03B9,0, 0}}, - {{0x1FF4,0, 0x03CE,0x03B9,0, 0}}, - {{0x0587,0, 0x0565,0x0582,0, 0}}, - {{0xFB14,0, 0x0574,0x0565,0, 0}}, - {{0xFB15,0, 0x0574,0x056B,0, 0}}, - {{0xFB17,0, 0x0574,0x056D,0, 0}}, - {{0xFB13,0, 0x0574,0x0576,0, 0}}, - {{0xFB16,0, 0x057E,0x0576,0, 0}}, - {{0x1E60,0x1E61,0x1E9B,0, 0}}, - {{0x1F80,0x1F88,0, 0x1F00,0x03B9,0, 0}}, - {{0x1F81,0x1F89,0, 0x1F01,0x03B9,0, 0}}, - {{0x1F82,0x1F8A,0, 0x1F02,0x03B9,0, 0}}, - {{0x1F83,0x1F8B,0, 0x1F03,0x03B9,0, 0}}, - {{0x1F84,0x1F8C,0, 0x1F04,0x03B9,0, 0}}, - {{0x1F85,0x1F8D,0, 0x1F05,0x03B9,0, 0}}, - {{0x1F86,0x1F8E,0, 0x1F06,0x03B9,0, 0}}, - {{0x1F87,0x1F8F,0, 0x1F07,0x03B9,0, 0}}, - {{0x1F90,0x1F98,0, 0x1F20,0x03B9,0, 0}}, - {{0x1F91,0x1F99,0, 0x1F21,0x03B9,0, 0}}, - {{0x1F92,0x1F9A,0, 0x1F22,0x03B9,0, 0}}, - {{0x1F93,0x1F9B,0, 0x1F23,0x03B9,0, 0}}, - {{0x1F94,0x1F9C,0, 0x1F24,0x03B9,0, 0}}, - {{0x1F95,0x1F9D,0, 0x1F25,0x03B9,0, 0}}, - {{0x1F96,0x1F9E,0, 0x1F26,0x03B9,0, 0}}, - {{0x1F97,0x1F9F,0, 0x1F27,0x03B9,0, 0}}, - {{0x1FA0,0x1FA8,0, 0x1F60,0x03B9,0, 0}}, - {{0x1FA1,0x1FA9,0, 0x1F61,0x03B9,0, 0}}, - {{0x1FA2,0x1FAA,0, 0x1F62,0x03B9,0, 0}}, - {{0x1FA3,0x1FAB,0, 0x1F63,0x03B9,0, 0}}, - {{0x1FA4,0x1FAC,0, 0x1F64,0x03B9,0, 0}}, - {{0x1FA5,0x1FAD,0, 0x1F65,0x03B9,0, 0}}, - {{0x1FA6,0x1FAE,0, 0x1F66,0x03B9,0, 0}}, - {{0x1FA7,0x1FAF,0, 0x1F67,0x03B9,0, 0}}, - {{0x1FB2,0, 0x1F70,0x03B9,0, 0}}, - {{0x1FC2,0, 0x1F74,0x03B9,0, 0}}, - {{0x1FF2,0, 0x1F7C,0x03B9,0, 0}}, - {{0, 0xD801,0xDC00,0, 0xD801,0xDC28,0, 0}}, - {{0, 0xD801,0xDC01,0, 0xD801,0xDC29,0, 0}}, - {{0, 0xD801,0xDC02,0, 0xD801,0xDC2A,0, 0}}, - {{0, 0xD801,0xDC03,0, 0xD801,0xDC2B,0, 0}}, - {{0, 0xD801,0xDC04,0, 0xD801,0xDC2C,0, 0}}, - {{0, 0xD801,0xDC05,0, 0xD801,0xDC2D,0, 0}}, - {{0, 0xD801,0xDC06,0, 0xD801,0xDC2E,0, 0}}, - {{0, 0xD801,0xDC07,0, 0xD801,0xDC2F,0, 0}}, - {{0, 0xD801,0xDC08,0, 0xD801,0xDC30,0, 0}}, - {{0, 0xD801,0xDC09,0, 0xD801,0xDC31,0, 0}}, - {{0, 0xD801,0xDC0A,0, 0xD801,0xDC32,0, 0}}, - {{0, 0xD801,0xDC0B,0, 0xD801,0xDC33,0, 0}}, - {{0, 0xD801,0xDC0C,0, 0xD801,0xDC34,0, 0}}, - {{0, 0xD801,0xDC0D,0, 0xD801,0xDC35,0, 0}}, - {{0, 0xD801,0xDC0E,0, 0xD801,0xDC36,0, 0}}, - {{0, 0xD801,0xDC0F,0, 0xD801,0xDC37,0, 0}}, - {{0, 0xD801,0xDC10,0, 0xD801,0xDC38,0, 0}}, - {{0, 0xD801,0xDC11,0, 0xD801,0xDC39,0, 0}}, - {{0, 0xD801,0xDC12,0, 0xD801,0xDC3A,0, 0}}, - {{0, 0xD801,0xDC13,0, 0xD801,0xDC3B,0, 0}}, - {{0, 0xD801,0xDC14,0, 0xD801,0xDC3C,0, 0}}, - {{0, 0xD801,0xDC15,0, 0xD801,0xDC3D,0, 0}}, - {{0, 0xD801,0xDC16,0, 0xD801,0xDC3E,0, 0}}, - {{0, 0xD801,0xDC17,0, 0xD801,0xDC3F,0, 0}}, - {{0, 0xD801,0xDC18,0, 0xD801,0xDC40,0, 0}}, - {{0, 0xD801,0xDC19,0, 0xD801,0xDC41,0, 0}}, - {{0, 0xD801,0xDC1A,0, 0xD801,0xDC42,0, 0}}, - {{0, 0xD801,0xDC1B,0, 0xD801,0xDC43,0, 0}}, - {{0, 0xD801,0xDC1C,0, 0xD801,0xDC44,0, 0}}, - {{0, 0xD801,0xDC1D,0, 0xD801,0xDC45,0, 0}}, - {{0, 0xD801,0xDC1E,0, 0xD801,0xDC46,0, 0}}, - {{0, 0xD801,0xDC1F,0, 0xD801,0xDC47,0, 0}}, - {{0, 0xD801,0xDC20,0, 0xD801,0xDC48,0, 0}}, - {{0, 0xD801,0xDC21,0, 0xD801,0xDC49,0, 0}}, - {{0, 0xD801,0xDC22,0, 0xD801,0xDC4A,0, 0}}, - {{0, 0xD801,0xDC23,0, 0xD801,0xDC4B,0, 0}}, - {{0, 0xD801,0xDC24,0, 0xD801,0xDC4C,0, 0}}, - {{0, 0xD801,0xDC25,0, 0xD801,0xDC4D,0, 0}} -}; - -#define CASE_PAIRS_LENGTH (sizeof(CASE_PAIRS)/sizeof(CASE_PAIRS[0])) -#define CASE_NONPAIRS_LENGTH (sizeof(CASE_NONPAIRS)/sizeof(CASE_NONPAIRS[0])) - -/** - * Add to this set all members of the case fold equivalency class - * that contains 'folded'. - * @param folded a string within a case fold equivalency class. - * It must have the property that UCharacter.foldCase(folded, - * DEFAULT_CASE_MAP).equals(folded). + * Generate and append a string representation of this set to result. + * This does not use this.pat, the cleaned up copy of the string + * passed to applyPattern(). */ -void UnicodeSet::caseCloseOne(const UnicodeString& folded) { - if (folded.length() == 1) { - caseCloseOne(folded.charAt(0)); - return; - } - - const CaseEquivClass* c = getCaseMapOf(folded); - if (c != NULL) { - caseCloseOne(*c); - return; - } +UnicodeString& UnicodeSet::_generatePattern(UnicodeString& result, + UBool escapeUnprintable) const { + result.append(SET_OPEN); - // Add 'folded' itself; it belongs to no equivalency class. - add(folded); -} +// // Check against the predefined categories. We implicitly build +// // up ALL category sets the first time toPattern() is called. +// for (int8_t cat=0; cat> 1) - 1; - int32_t x; - do { - x = (low + high) >> 1; - UChar ch = CASE_PAIRS[x << 1]; - if (folded < ch) { - high = x - 1; - } else if (folded > ch) { - low = x + 1; - } else { - break; - } - } while (low < high); - - x = (low + high) & ~1; // ((low + high) >> 1) << 1 - if (folded == CASE_PAIRS[x]) { - add(CASE_PAIRS[x]); - add(CASE_PAIRS[x+1]); - } else { - // If the search fails, then add folded itself; it is a - // case-unique code unit. - add(folded); - } -} + // If the set contains at least 2 intervals and includes both + // MIN_VALUE and MAX_VALUE, then the inverse representation will + // be more economical. + if (count > 1 && + getRangeStart(0) == MIN_VALUE && + getRangeEnd(count-1) == MAX_VALUE) { -/** - * Add to this set all members of the given CaseEquivClass object. - */ -void UnicodeSet::caseCloseOne(const CaseEquivClass& c) { - const UChar* p = c.getSingles(); - while (*p) { - add(*p++); // add all single code units - } - for (c.getStrings(p); *p; c.nextString(p)) { - add(p); // add all strings - } -} + // Emit the inverse + result.append(COMPLEMENT); -/** - * Given a folded string of length >= 2 code units, return the - * CaseEquivClass containing this string, or NULL if none. - */ -const CaseEquivClass* UnicodeSet::getCaseMapOf(const UnicodeString& folded) { - umtx_lock(NULL); - UBool f = (CASE_EQUIV_HASH == NULL); - umtx_unlock(NULL); - - if (f) { - // Create the Hashtable, which maps UnicodeStrings to index - // values into CASE_NONPAIRS. - UErrorCode ec = U_ZERO_ERROR; - Hashtable* hash = new Hashtable(); - if (hash != NULL) { - int32_t i; - for (i=0; i<(int32_t)CASE_NONPAIRS_LENGTH; ++i) { - const CaseEquivClass* c = &CASE_NONPAIRS[i]; - const UChar* p; - for (c->getStrings(p); *p; c->nextString(p)) { - hash->put(UnicodeString(p), (void*) c, ec); - } - } - if (U_SUCCESS(ec)) { - umtx_lock(NULL); - if (CASE_EQUIV_HASH == NULL) { - CASE_EQUIV_HASH = hash; - hash = NULL; + for (int32_t i = 1; i < count; ++i) { + UChar32 start = getRangeEnd(i-1)+1; + UChar32 end = getRangeStart(i)-1; + _appendToPat(result, start, escapeUnprintable); + if (start != end) { + if ((start+1) != end) { + result.append(HYPHEN); } - umtx_unlock(NULL); + _appendToPat(result, end, escapeUnprintable); } - delete hash; } } - return (CASE_EQUIV_HASH != NULL) ? - (const CaseEquivClass*) CASE_EQUIV_HASH->get(folded) : NULL; -} - -/** - * Given a folded code unit, return the CaseEquivClass containing it, - * or NULL if none. - */ -const CaseEquivClass* UnicodeSet::getCaseMapOf(UChar folded) { - umtx_lock(NULL); - UBool f = (CASE_EQUIV_CBA == NULL); - umtx_unlock(NULL); - - if (f) { - // Create the CompactByteArray, which maps single code units - // to index values into CASE_NONPAIRS. - CompactByteArray* cba = ucmp8_open(-1); - if (ucmp8_isBogus(cba)) { - ucmp8_close(cba); - cba = NULL; - } else { - int32_t i; - for (i=0; i<(int32_t)CASE_NONPAIRS_LENGTH; ++i) { - const UChar* p = CASE_NONPAIRS[i].getSingles(); - UChar ch; - while ((ch = *p++) != 0) { - ucmp8_set(cba, ch, (int8_t) i); + // Default; emit the ranges as pairs + else { + for (int32_t i = 0; i < count; ++i) { + UChar32 start = getRangeStart(i); + UChar32 end = getRangeEnd(i); + _appendToPat(result, start, escapeUnprintable); + if (start != end) { + if ((start+1) != end) { + result.append(HYPHEN); } + _appendToPat(result, end, escapeUnprintable); } - ucmp8_compact(cba, 256); - } - - umtx_lock(NULL); - if (CASE_EQUIV_CBA == NULL) { - CASE_EQUIV_CBA = cba; - cba = NULL; - } - umtx_unlock(NULL); - if (cba != NULL) { - ucmp8_close(cba); } } - if (CASE_EQUIV_CBA != NULL) { - int32_t index = ucmp8_getu(CASE_EQUIV_CBA, folded); - if (index != 255) { - return &CASE_NONPAIRS[index]; - } + for (int32_t i = 0; isize(); ++i) { + result.append(OPEN_BRACE); + _appendToPat(result, + *(const UnicodeString*) strings->elementAt(i), + escapeUnprintable); + result.append(CLOSE_BRACE); } - return NULL; + return result.append(SET_CLOSE); } + U_NAMESPACE_END diff --git a/icuSources/common/uniset_props.cpp b/icuSources/common/uniset_props.cpp new file mode 100644 index 00000000..c0ffa87c --- /dev/null +++ b/icuSources/common/uniset_props.cpp @@ -0,0 +1,2012 @@ +/* +******************************************************************************* +* +* Copyright (C) 1999-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: uniset_props.cpp +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2004aug25 +* created by: Markus W. Scherer +* +* Character property dependent functions moved here from uniset.cpp +*/ + +#include "unicode/utypes.h" +#include "unicode/uniset.h" +#include "unicode/parsepos.h" +#include "unicode/uchar.h" +#include "unicode/uscript.h" +#include "unicode/symtable.h" +#include "unicode/uset.h" +#include "unicode/locid.h" +#include "unicode/brkiter.h" +#include "uset_imp.h" +#include "ruleiter.h" +#include "cmemory.h" +#include "uhash.h" +#include "ucln_cmn.h" +#include "util.h" +#include "uvector.h" +#include "uprops.h" +#include "propname.h" +#include "unormimp.h" +#include "ucase.h" +#include "uinvchar.h" +#include "charstr.h" +#include "cstring.h" +#include "mutex.h" +#include "uassert.h" +#include "hash.h" +#include "ucmp8.h" + +// initial storage. Must be >= 0 +// *** same as in uniset.cpp ! *** +#define START_EXTRA 16 + +// Define UChar constants using hex for EBCDIC compatibility +// Used #define to reduce private static exports and memory access time. +#define SET_OPEN ((UChar)0x005B) /*[*/ +#define SET_CLOSE ((UChar)0x005D) /*]*/ +#define HYPHEN ((UChar)0x002D) /*-*/ +#define COMPLEMENT ((UChar)0x005E) /*^*/ +#define COLON ((UChar)0x003A) /*:*/ +#define BACKSLASH ((UChar)0x005C) /*\*/ +#define INTERSECTION ((UChar)0x0026) /*&*/ +#define UPPER_U ((UChar)0x0055) /*U*/ +#define LOWER_U ((UChar)0x0075) /*u*/ +#define OPEN_BRACE ((UChar)123) /*{*/ +#define CLOSE_BRACE ((UChar)125) /*}*/ +#define UPPER_P ((UChar)0x0050) /*P*/ +#define LOWER_P ((UChar)0x0070) /*p*/ +#define UPPER_N ((UChar)78) /*N*/ +#define EQUALS ((UChar)0x003D) /*=*/ + +static const UChar POSIX_OPEN[] = { SET_OPEN,COLON,0 }; // "[:" +static const UChar POSIX_CLOSE[] = { COLON,SET_CLOSE,0 }; // ":]" +static const UChar PERL_OPEN[] = { BACKSLASH,LOWER_P,0 }; // "\\p" +static const UChar PERL_CLOSE[] = { CLOSE_BRACE,0 }; // "}" +static const UChar NAME_OPEN[] = { BACKSLASH,UPPER_N,0 }; // "\\N" +static const UChar HYPHEN_RIGHT_BRACE[] = {HYPHEN,SET_CLOSE,0}; /*-]*/ + +// Special property set IDs +static const char ANY[] = "ANY"; // [\u0000-\U0010FFFF] +static const char ASCII[] = "ASCII"; // [\u0000-\u007F] + +// Unicode name property alias +#define NAME_PROP "na" +#define NAME_PROP_LENGTH 2 + +// TODO: Remove the following special-case code when +// these four C99-compatibility properties are implemented +// as enums/names. +U_CDECL_BEGIN + typedef UBool (U_CALLCONV *C99_Property_Function)(UChar32); +U_CDECL_END +static const struct C99_Map { + const char* name; + C99_Property_Function func; +} C99_DISPATCH[] = { + // These three entries omitted; they clash with PropertyAliases + // names for Unicode properties, so UnicodeSet already maps them + // to those properties. + //{ "alpha", u_isalpha }, + //{ "lower", u_islower }, + //{ "upper", u_isupper }, + + // MUST be in SORTED order + { "blank", u_isblank }, + { "cntrl", u_iscntrl }, + { "digit", u_isdigit }, + { "graph", u_isgraph }, + { "print", u_isprint }, + { "punct", u_ispunct }, + { "space", u_isspace }, + { "title", u_istitle }, + { "xdigit", u_isxdigit } +}; +#define C99_COUNT (9) + +// TEMPORARY: Remove when deprecated category code constructor is removed. +static const UChar CATEGORY_NAMES[] = { + // Must be kept in sync with uchar.h/UCharCategory + 0x43, 0x6E, /* "Cn" */ + 0x4C, 0x75, /* "Lu" */ + 0x4C, 0x6C, /* "Ll" */ + 0x4C, 0x74, /* "Lt" */ + 0x4C, 0x6D, /* "Lm" */ + 0x4C, 0x6F, /* "Lo" */ + 0x4D, 0x6E, /* "Mn" */ + 0x4D, 0x65, /* "Me" */ + 0x4D, 0x63, /* "Mc" */ + 0x4E, 0x64, /* "Nd" */ + 0x4E, 0x6C, /* "Nl" */ + 0x4E, 0x6F, /* "No" */ + 0x5A, 0x73, /* "Zs" */ + 0x5A, 0x6C, /* "Zl" */ + 0x5A, 0x70, /* "Zp" */ + 0x43, 0x63, /* "Cc" */ + 0x43, 0x66, /* "Cf" */ + 0x43, 0x6F, /* "Co" */ + 0x43, 0x73, /* "Cs" */ + 0x50, 0x64, /* "Pd" */ + 0x50, 0x73, /* "Ps" */ + 0x50, 0x65, /* "Pe" */ + 0x50, 0x63, /* "Pc" */ + 0x50, 0x6F, /* "Po" */ + 0x53, 0x6D, /* "Sm" */ + 0x53, 0x63, /* "Sc" */ + 0x53, 0x6B, /* "Sk" */ + 0x53, 0x6F, /* "So" */ + 0x50, 0x69, /* "Pi" */ + 0x50, 0x66, /* "Pf" */ + 0x00 +}; + +/** + * Delimiter string used in patterns to close a category reference: + * ":]". Example: "[:Lu:]". + */ +static const UChar CATEGORY_CLOSE[] = {COLON, SET_CLOSE, 0x0000}; /* ":]" */ + +U_NAMESPACE_BEGIN + +static UnicodeSet *INCLUSIONS[UPROPS_SRC_COUNT] = { NULL }; // cached getInclusions() + +static Hashtable* CASE_EQUIV_HASH = NULL; // for closeOver(USET_CASE) + +static CompactByteArray* CASE_EQUIV_CBA = NULL; // for closeOver(USET_CASE) + +// helper functions for matching of pattern syntax pieces ------------------ *** +// these functions are parallel to the PERL_OPEN etc. strings above + +// using these functions is not only faster than UnicodeString::compare() and +// caseCompare(), but they also make UnicodeSet work for simple patterns when +// no Unicode properties data is available - when caseCompare() fails + +static inline UBool +isPerlOpen(const UnicodeString &pattern, int32_t pos) { + UChar c; + return pattern.charAt(pos)==BACKSLASH && ((c=pattern.charAt(pos+1))==LOWER_P || c==UPPER_P); +} + +static inline UBool +isPerlClose(const UnicodeString &pattern, int32_t pos) { + return pattern.charAt(pos)==CLOSE_BRACE; +} + +static inline UBool +isNameOpen(const UnicodeString &pattern, int32_t pos) { + return pattern.charAt(pos)==BACKSLASH && pattern.charAt(pos+1)==UPPER_N; +} + +static inline UBool +isPOSIXOpen(const UnicodeString &pattern, int32_t pos) { + return pattern.charAt(pos)==SET_OPEN && pattern.charAt(pos+1)==COLON; +} + +static inline UBool +isPOSIXClose(const UnicodeString &pattern, int32_t pos) { + return pattern.charAt(pos)==COLON && pattern.charAt(pos+1)==SET_CLOSE; +} + +// TODO memory debugging provided inside uniset.cpp +// could be made available here but probably obsolete with use of modern +// memory leak checker tools +#define _dbgct(me) + +//---------------------------------------------------------------- +// Constructors &c +//---------------------------------------------------------------- + +/** + * Constructs a set from the given pattern, optionally ignoring + * white space. See the class description for the syntax of the + * pattern language. + * @param pattern a string specifying what characters are in the set + */ +UnicodeSet::UnicodeSet(const UnicodeString& pattern, + UErrorCode& status) : + len(0), capacity(START_EXTRA), bufferCapacity(0), + list(0), buffer(0), strings(0) +{ + if(U_SUCCESS(status)){ + list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); + /* test for NULL */ + if(list == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + }else{ + allocateStrings(); + applyPattern(pattern, USET_IGNORE_SPACE, NULL, status); + } + } + _dbgct(this); +} + +/** + * Constructs a set from the given pattern, optionally ignoring + * white space. See the class description for the syntax of the + * pattern language. + * @param pattern a string specifying what characters are in the set + * @param options bitmask for options to apply to the pattern. + * Valid options are USET_IGNORE_SPACE and USET_CASE_INSENSITIVE. + */ +UnicodeSet::UnicodeSet(const UnicodeString& pattern, + uint32_t options, + const SymbolTable* symbols, + UErrorCode& status) : + len(0), capacity(START_EXTRA), bufferCapacity(0), + list(0), buffer(0), strings(0) +{ + if(U_SUCCESS(status)){ + list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); + /* test for NULL */ + if(list == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + }else{ + allocateStrings(); + applyPattern(pattern, options, symbols, status); + } + } + _dbgct(this); +} + +UnicodeSet::UnicodeSet(const UnicodeString& pattern, ParsePosition& pos, + uint32_t options, + const SymbolTable* symbols, + UErrorCode& status) : + len(0), capacity(START_EXTRA), bufferCapacity(0), + list(0), buffer(0), strings(0) +{ + if(U_SUCCESS(status)){ + list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); + /* test for NULL */ + if(list == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + }else{ + allocateStrings(); + applyPattern(pattern, pos, options, symbols, status); + } + } + _dbgct(this); +} + +#ifdef U_USE_UNICODESET_DEPRECATES +/** + * DEPRECATED Constructs a set from the given Unicode character category. + * @param category an integer indicating the character category as + * defined in uchar.h. + * @deprecated To be removed after 2002-DEC-31 + */ +UnicodeSet::UnicodeSet(int8_t category, UErrorCode& status) : + len(0), capacity(START_EXTRA), bufferCapacity(0), + list(0), buffer(0), strings(0) +{ + static const UChar OPEN[] = { 91, 58, 0 }; // "[:" + static const UChar CLOSE[]= { 58, 93, 0 }; // ":]" + if (U_SUCCESS(status)) { + if (category < 0 || category >= U_CHAR_CATEGORY_COUNT) { + status = U_ILLEGAL_ARGUMENT_ERROR; + } else { + UnicodeString pattern(FALSE, CATEGORY_NAMES + category*2, 2); + pattern.insert(0, OPEN); + pattern.append(CLOSE); + list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); + /* test for NULL */ + if(list == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + }else{ + allocateStrings(); + applyPattern(pattern, status); + } + } + } + _dbgct(this); +} +#endif + +//---------------------------------------------------------------- +// Public API +//---------------------------------------------------------------- + +/** + * Modifies this set to represent the set specified by the given + * pattern, optionally ignoring white space. See the class + * description for the syntax of the pattern language. + * @param pattern a string specifying what characters are in the set + * @param ignoreSpaces if true, all spaces in the + * pattern are ignored. Spaces are those characters for which + * uprv_isRuleWhiteSpace() is true. + * Characters preceded by '\\' are escaped, losing any special + * meaning they otherwise have. Spaces may be included by + * escaping them. + * @exception IllegalArgumentException if the pattern + * contains a syntax error. + */ +UnicodeSet& UnicodeSet::applyPattern(const UnicodeString& pattern, + UErrorCode& status) { + return applyPattern(pattern, USET_IGNORE_SPACE, NULL, status); +} + + +/** + * Modifies this set to represent the set specified by the given + * pattern, optionally ignoring white space. See the class + * description for the syntax of the pattern language. + * @param pattern a string specifying what characters are in the set + * @param options bitmask for options to apply to the pattern. + * Valid options are USET_IGNORE_SPACE and USET_CASE_INSENSITIVE. + */ +UnicodeSet& UnicodeSet::applyPattern(const UnicodeString& pattern, + uint32_t options, + const SymbolTable* symbols, + UErrorCode& status) { + if (U_FAILURE(status)) { + return *this; + } + + ParsePosition pos(0); + applyPattern(pattern, pos, options, symbols, status); + if (U_FAILURE(status)) return *this; + + int32_t i = pos.getIndex(); + + if (options & USET_IGNORE_SPACE) { + // Skip over trailing whitespace + ICU_Utility::skipWhitespace(pattern, i, TRUE); + } + + if (i != pattern.length()) { + status = U_ILLEGAL_ARGUMENT_ERROR; + } + return *this; +} + +UnicodeSet& UnicodeSet::applyPattern(const UnicodeString& pattern, + ParsePosition& pos, + uint32_t options, + const SymbolTable* symbols, + UErrorCode& status) { + if (U_FAILURE(status)) { + return *this; + } + // Need to build the pattern in a temporary string because + // _applyPattern calls add() etc., which set pat to empty. + UnicodeString rebuiltPat; + RuleCharacterIterator chars(pattern, symbols, pos); + applyPattern(chars, symbols, rebuiltPat, options, status); + if (U_FAILURE(status)) return *this; + if (chars.inVariable()) { + // syntaxError(chars, "Extra chars in variable value"); + status = U_MALFORMED_SET; + return *this; + } + pat = rebuiltPat; + return *this; +} + +/** + * Return true if the given position, in the given pattern, appears + * to be the start of a UnicodeSet pattern. + */ +UBool UnicodeSet::resemblesPattern(const UnicodeString& pattern, int32_t pos) { + return ((pos+1) < pattern.length() && + pattern.charAt(pos) == (UChar)91/*[*/) || + resemblesPropertyPattern(pattern, pos); +} + +//---------------------------------------------------------------- +// Implementation: Pattern parsing +//---------------------------------------------------------------- + +/** + * A small all-inline class to manage a UnicodeSet pointer. Add + * operator->() etc. as needed. + */ +class UnicodeSetPointer { + UnicodeSet* p; +public: + inline UnicodeSetPointer() : p(0) {} + inline ~UnicodeSetPointer() { delete p; } + inline UnicodeSet* pointer() { return p; } + inline UBool allocate() { + if (p == 0) { + p = new UnicodeSet(); + } + return p != 0; + } +}; + +/** + * Parse the pattern from the given RuleCharacterIterator. The + * iterator is advanced over the parsed pattern. + * @param chars iterator over the pattern characters. Upon return + * it will be advanced to the first character after the parsed + * pattern, or the end of the iteration if all characters are + * parsed. + * @param symbols symbol table to use to parse and dereference + * variables, or null if none. + * @param rebuiltPat the pattern that was parsed, rebuilt or + * copied from the input pattern, as appropriate. + * @param options a bit mask of zero or more of the following: + * IGNORE_SPACE, CASE. + */ +void UnicodeSet::applyPattern(RuleCharacterIterator& chars, + const SymbolTable* symbols, + UnicodeString& rebuiltPat, + uint32_t options, + UErrorCode& ec) { + if (U_FAILURE(ec)) return; + + // Syntax characters: [ ] ^ - & { } + + // Recognized special forms for chars, sets: c-c s-s s&s + + int32_t opts = RuleCharacterIterator::PARSE_VARIABLES | + RuleCharacterIterator::PARSE_ESCAPES; + if ((options & USET_IGNORE_SPACE) != 0) { + opts |= RuleCharacterIterator::SKIP_WHITESPACE; + } + + UnicodeString patLocal, buf; + UBool usePat = FALSE; + UnicodeSetPointer scratch; + RuleCharacterIterator::Pos backup; + + // mode: 0=before [, 1=between [...], 2=after ] + // lastItem: 0=none, 1=char, 2=set + int8_t lastItem = 0, mode = 0; + UChar32 lastChar = 0; + UChar op = 0; + + UBool invert = FALSE; + + clear(); + + while (mode != 2 && !chars.atEnd()) { + U_ASSERT((lastItem == 0 && op == 0) || + (lastItem == 1 && (op == 0 || op == HYPHEN /*'-'*/)) || + (lastItem == 2 && (op == 0 || op == HYPHEN /*'-'*/ || + op == INTERSECTION /*'&'*/))); + + UChar32 c = 0; + UBool literal = FALSE; + UnicodeSet* nested = 0; // alias - do not delete + + // -------- Check for property pattern + + // setMode: 0=none, 1=unicodeset, 2=propertypat, 3=preparsed + int8_t setMode = 0; + if (resemblesPropertyPattern(chars, opts)) { + setMode = 2; + } + + // -------- Parse '[' of opening delimiter OR nested set. + // If there is a nested set, use `setMode' to define how + // the set should be parsed. If the '[' is part of the + // opening delimiter for this pattern, parse special + // strings "[", "[^", "[-", and "[^-". Check for stand-in + // characters representing a nested set in the symbol + // table. + + else { + // Prepare to backup if necessary + chars.getPos(backup); + c = chars.next(opts, literal, ec); + if (U_FAILURE(ec)) return; + + if (c == 0x5B /*'['*/ && !literal) { + if (mode == 1) { + chars.setPos(backup); // backup + setMode = 1; + } else { + // Handle opening '[' delimiter + mode = 1; + patLocal.append((UChar) 0x5B /*'['*/); + chars.getPos(backup); // prepare to backup + c = chars.next(opts, literal, ec); + if (U_FAILURE(ec)) return; + if (c == 0x5E /*'^'*/ && !literal) { + invert = TRUE; + patLocal.append((UChar) 0x5E /*'^'*/); + chars.getPos(backup); // prepare to backup + c = chars.next(opts, literal, ec); + if (U_FAILURE(ec)) return; + } + // Fall through to handle special leading '-'; + // otherwise restart loop for nested [], \p{}, etc. + if (c == HYPHEN /*'-'*/) { + literal = TRUE; + // Fall through to handle literal '-' below + } else { + chars.setPos(backup); // backup + continue; + } + } + } else if (symbols != 0) { + const UnicodeFunctor *m = symbols->lookupMatcher(c); + if (m != 0) { + if (m->getDynamicClassID() != UnicodeSet::getStaticClassID()) { + ec = U_MALFORMED_SET; + return; + } + // casting away const, but `nested' won't be modified + // (important not to modify stored set) + nested = (UnicodeSet*) m; + setMode = 3; + } + } + } + + // -------- Handle a nested set. This either is inline in + // the pattern or represented by a stand-in that has + // previously been parsed and was looked up in the symbol + // table. + + if (setMode != 0) { + if (lastItem == 1) { + if (op != 0) { + // syntaxError(chars, "Char expected after operator"); + ec = U_MALFORMED_SET; + return; + } + add(lastChar, lastChar); + _appendToPat(patLocal, lastChar, FALSE); + lastItem = 0; + op = 0; + } + + if (op == HYPHEN /*'-'*/ || op == INTERSECTION /*'&'*/) { + patLocal.append(op); + } + + if (nested == 0) { + // lazy allocation + if (!scratch.allocate()) { + ec = U_MEMORY_ALLOCATION_ERROR; + return; + } + nested = scratch.pointer(); + } + switch (setMode) { + case 1: + nested->applyPattern(chars, symbols, patLocal, options, ec); + break; + case 2: + chars.skipIgnored(opts); + nested->applyPropertyPattern(chars, patLocal, ec); + if (U_FAILURE(ec)) return; + break; + case 3: // `nested' already parsed + nested->_toPattern(patLocal, FALSE); + break; + } + + usePat = TRUE; + + if (mode == 0) { + // Entire pattern is a category; leave parse loop + *this = *nested; + mode = 2; + break; + } + + switch (op) { + case HYPHEN: /*'-'*/ + removeAll(*nested); + break; + case INTERSECTION: /*'&'*/ + retainAll(*nested); + break; + case 0: + addAll(*nested); + break; + } + + op = 0; + lastItem = 2; + + continue; + } + + if (mode == 0) { + // syntaxError(chars, "Missing '['"); + ec = U_MALFORMED_SET; + return; + } + + // -------- Parse special (syntax) characters. If the + // current character is not special, or if it is escaped, + // then fall through and handle it below. + + if (!literal) { + switch (c) { + case 0x5D /*']'*/: + if (lastItem == 1) { + add(lastChar, lastChar); + _appendToPat(patLocal, lastChar, FALSE); + } + // Treat final trailing '-' as a literal + if (op == HYPHEN /*'-'*/) { + add(op, op); + patLocal.append(op); + } else if (op == INTERSECTION /*'&'*/) { + // syntaxError(chars, "Trailing '&'"); + ec = U_MALFORMED_SET; + return; + } + patLocal.append((UChar) 0x5D /*']'*/); + mode = 2; + continue; + case HYPHEN /*'-'*/: + if (op == 0) { + if (lastItem != 0) { + op = (UChar) c; + continue; + } else { + // Treat final trailing '-' as a literal + add(c, c); + c = chars.next(opts, literal, ec); + if (U_FAILURE(ec)) return; + if (c == 0x5D /*']'*/ && !literal) { + patLocal.append(HYPHEN_RIGHT_BRACE); + mode = 2; + continue; + } + } + } + // syntaxError(chars, "'-' not after char or set"); + ec = U_MALFORMED_SET; + return; + case INTERSECTION /*'&'*/: + if (lastItem == 2 && op == 0) { + op = (UChar) c; + continue; + } + // syntaxError(chars, "'&' not after set"); + ec = U_MALFORMED_SET; + return; + case 0x5E /*'^'*/: + // syntaxError(chars, "'^' not after '['"); + ec = U_MALFORMED_SET; + return; + case 0x7B /*'{'*/: + if (op != 0) { + // syntaxError(chars, "Missing operand after operator"); + ec = U_MALFORMED_SET; + return; + } + if (lastItem == 1) { + add(lastChar, lastChar); + _appendToPat(patLocal, lastChar, FALSE); + } + lastItem = 0; + buf.truncate(0); + { + UBool ok = FALSE; + while (!chars.atEnd()) { + c = chars.next(opts, literal, ec); + if (U_FAILURE(ec)) return; + if (c == 0x7D /*'}'*/ && !literal) { + ok = TRUE; + break; + } + buf.append(c); + } + if (buf.length() < 1 || !ok) { + // syntaxError(chars, "Invalid multicharacter string"); + ec = U_MALFORMED_SET; + return; + } + } + // We have new string. Add it to set and continue; + // we don't need to drop through to the further + // processing + add(buf); + patLocal.append((UChar) 0x7B /*'{'*/); + _appendToPat(patLocal, buf, FALSE); + patLocal.append((UChar) 0x7D /*'}'*/); + continue; + case SymbolTable::SYMBOL_REF: + // symbols nosymbols + // [a-$] error error (ambiguous) + // [a$] anchor anchor + // [a-$x] var "x"* literal '$' + // [a-$.] error literal '$' + // *We won't get here in the case of var "x" + { + chars.getPos(backup); + c = chars.next(opts, literal, ec); + if (U_FAILURE(ec)) return; + UBool anchor = (c == 0x5D /*']'*/ && !literal); + if (symbols == 0 && !anchor) { + c = SymbolTable::SYMBOL_REF; + chars.setPos(backup); + break; // literal '$' + } + if (anchor && op == 0) { + if (lastItem == 1) { + add(lastChar, lastChar); + _appendToPat(patLocal, lastChar, FALSE); + } + add(U_ETHER); + usePat = TRUE; + patLocal.append((UChar) SymbolTable::SYMBOL_REF); + patLocal.append((UChar) 0x5D /*']'*/); + mode = 2; + continue; + } + // syntaxError(chars, "Unquoted '$'"); + ec = U_MALFORMED_SET; + return; + } + default: + break; + } + } + + // -------- Parse literal characters. This includes both + // escaped chars ("\u4E01") and non-syntax characters + // ("a"). + + switch (lastItem) { + case 0: + lastItem = 1; + lastChar = c; + break; + case 1: + if (op == HYPHEN /*'-'*/) { + if (lastChar >= c) { + // Don't allow redundant (a-a) or empty (b-a) ranges; + // these are most likely typos. + // syntaxError(chars, "Invalid range"); + ec = U_MALFORMED_SET; + return; + } + add(lastChar, c); + _appendToPat(patLocal, lastChar, FALSE); + patLocal.append(op); + _appendToPat(patLocal, c, FALSE); + lastItem = 0; + op = 0; + } else { + add(lastChar, lastChar); + _appendToPat(patLocal, lastChar, FALSE); + lastChar = c; + } + break; + case 2: + if (op != 0) { + // syntaxError(chars, "Set expected after operator"); + ec = U_MALFORMED_SET; + return; + } + lastChar = c; + lastItem = 1; + break; + } + } + + if (mode != 2) { + // syntaxError(chars, "Missing ']'"); + ec = U_MALFORMED_SET; + return; + } + + chars.skipIgnored(opts); + + /** + * Handle global flags (invert, case insensitivity). If this + * pattern should be compiled case-insensitive, then we need + * to close over case BEFORE COMPLEMENTING. This makes + * patterns like /[^abc]/i work. + */ + if ((options & USET_CASE_INSENSITIVE) != 0) { + closeOver(USET_CASE); + } + else if ((options & USET_ADD_CASE_MAPPINGS) != 0) { + closeOver(USET_ADD_CASE_MAPPINGS); + } + if (invert) { + complement(); + } + + // Use the rebuilt pattern (patLocal) only if necessary. Prefer the + // generated pattern. + if (usePat) { + rebuiltPat.append(patLocal); + } else { + _generatePattern(rebuiltPat, FALSE); + } +} + +//---------------------------------------------------------------- +// Property set implementation +//---------------------------------------------------------------- + +static UBool numericValueFilter(UChar32 ch, void* context) { + return u_getNumericValue(ch) == *(double*)context; +} + +static UBool generalCategoryMaskFilter(UChar32 ch, void* context) { + int32_t value = *(int32_t*)context; + return (U_GET_GC_MASK((UChar32) ch) & value) != 0; +} + +static UBool versionFilter(UChar32 ch, void* context) { + UVersionInfo v, none = { 0, 0, 0, 0}; + UVersionInfo* version = (UVersionInfo*)context; + u_charAge(ch, v); + return uprv_memcmp(&v, &none, sizeof(v)) > 0 && uprv_memcmp(&v, version, sizeof(v)) <= 0; +} + +typedef struct { + UProperty prop; + int32_t value; +} IntPropertyContext; + +static UBool intPropertyFilter(UChar32 ch, void* context) { + IntPropertyContext* c = (IntPropertyContext*)context; + return u_getIntPropertyValue((UChar32) ch, c->prop) == c->value; +} + + +/** + * Generic filter-based scanning code for UCD property UnicodeSets. + */ +void UnicodeSet::applyFilter(UnicodeSet::Filter filter, + void* context, + int32_t src, + UErrorCode &status) { + // Walk through all Unicode characters, noting the start + // and end of each range for which filter.contain(c) is + // true. Add each range to a set. + // + // To improve performance, use the INCLUSIONS set, which + // encodes information about character ranges that are known + // to have identical properties. INCLUSIONS contains + // only the first characters of such ranges. + // + // TODO Where possible, instead of scanning over code points, + // use internal property data to initialize UnicodeSets for + // those properties. Scanning code points is slow. + if (U_FAILURE(status)) return; + + const UnicodeSet* inclusions = getInclusions(src, status); + if (U_FAILURE(status)) { + return; + } + + clear(); + + UChar32 startHasProperty = -1; + int limitRange = inclusions->getRangeCount(); + + for (int j=0; jgetRangeStart(j); + UChar32 end = inclusions->getRangeEnd(j); + + // for all the code points in the range, process + for (UChar32 ch = start; ch <= end; ++ch) { + // only add to this UnicodeSet on inflection points -- + // where the hasProperty value changes to false + if ((*filter)(ch, context)) { + if (startHasProperty < 0) { + startHasProperty = ch; + } + } else if (startHasProperty >= 0) { + add(startHasProperty, ch-1); + startHasProperty = -1; + } + } + } + if (startHasProperty >= 0) { + add((UChar32)startHasProperty, (UChar32)0x10FFFF); + } +} + +static UBool mungeCharName(char* dst, const char* src, int32_t dstCapacity) { + /* Note: we use ' ' in compiler code page */ + int32_t j = 0; + char ch; + --dstCapacity; /* make room for term. zero */ + while ((ch = *src++) != 0) { + if (ch == ' ' && (j==0 || (j>0 && dst[j-1]==' '))) { + continue; + } + if (j >= dstCapacity) return FALSE; + dst[j++] = ch; + } + if (j > 0 && dst[j-1] == ' ') --j; + dst[j] = 0; + return TRUE; +} + +//---------------------------------------------------------------- +// Property set API +//---------------------------------------------------------------- + +#define FAIL(ec) {ec=U_ILLEGAL_ARGUMENT_ERROR; return *this;} + +// TODO: Remove the following special-case code when +// these four C99-compatibility properties are implemented +// as enums/names. +static UBool c99Filter(UChar32 ch, void* context) { + struct C99_Map* m = (struct C99_Map*) context; + return m->func(ch); +} + +UnicodeSet& +UnicodeSet::applyIntPropertyValue(UProperty prop, int32_t value, UErrorCode& ec) { + if (U_FAILURE(ec)) return *this; + + if (prop == UCHAR_GENERAL_CATEGORY_MASK) { + applyFilter(generalCategoryMaskFilter, &value, UPROPS_SRC_CHAR, ec); + } else { + IntPropertyContext c = {prop, value}; + applyFilter(intPropertyFilter, &c, uprops_getSource(prop), ec); + } + return *this; +} + +UnicodeSet& +UnicodeSet::applyPropertyAlias(const UnicodeString& prop, + const UnicodeString& value, + UErrorCode& ec) { + if (U_FAILURE(ec)) return *this; + + // prop and value used to be converted to char * using the default + // converter instead of the invariant conversion. + // This should not be necessary because all Unicode property and value + // names use only invariant characters. + // If there are any variant characters, then we won't find them anyway. + // Checking first avoids assertion failures in the conversion. + if( !uprv_isInvariantUString(prop.getBuffer(), prop.length()) || + !uprv_isInvariantUString(value.getBuffer(), value.length()) + ) { + FAIL(ec); + } + CharString pname(prop); + CharString vname(value); + + UProperty p; + int32_t v; + UBool mustNotBeEmpty = FALSE; + + if (value.length() > 0) { + p = u_getPropertyEnum(pname); + if (p == UCHAR_INVALID_CODE) FAIL(ec); + + // Treat gc as gcm + if (p == UCHAR_GENERAL_CATEGORY) { + p = UCHAR_GENERAL_CATEGORY_MASK; + } + + if ((p >= UCHAR_BINARY_START && p < UCHAR_BINARY_LIMIT) || + (p >= UCHAR_INT_START && p < UCHAR_INT_LIMIT) || + (p >= UCHAR_MASK_START && p < UCHAR_MASK_LIMIT)) { + v = u_getPropertyValueEnum(p, vname); + if (v == UCHAR_INVALID_CODE) { + // Handle numeric CCC + if (p == UCHAR_CANONICAL_COMBINING_CLASS || + p == UCHAR_TRAIL_CANONICAL_COMBINING_CLASS || + p == UCHAR_LEAD_CANONICAL_COMBINING_CLASS) { + char* end; + double value = uprv_strtod(vname, &end); + v = (int32_t) value; + if (v != value || v < 0 || *end != 0) { + // non-integral or negative value, or trailing junk + FAIL(ec); + } + // If the resultant set is empty then the numeric value + // was invalid. + mustNotBeEmpty = TRUE; + } else { + FAIL(ec); + } + } + } + + else { + + switch (p) { + case UCHAR_NUMERIC_VALUE: + { + char* end; + double value = uprv_strtod(vname, &end); + if (*end != 0) { + FAIL(ec); + } + applyFilter(numericValueFilter, &value, UPROPS_SRC_CHAR, ec); + return *this; + } + break; + case UCHAR_NAME: + case UCHAR_UNICODE_1_NAME: + { + // Must munge name, since u_charFromName() does not do + // 'loose' matching. + char buf[128]; // it suffices that this be > uprv_getMaxCharNameLength + if (!mungeCharName(buf, vname, sizeof(buf))) FAIL(ec); + UCharNameChoice choice = (p == UCHAR_NAME) ? + U_EXTENDED_CHAR_NAME : U_UNICODE_10_CHAR_NAME; + UChar32 ch = u_charFromName(choice, buf, &ec); + if (U_SUCCESS(ec)) { + clear(); + add(ch); + return *this; + } else { + FAIL(ec); + } + } + break; + case UCHAR_AGE: + { + // Must munge name, since u_versionFromString() does not do + // 'loose' matching. + char buf[128]; + if (!mungeCharName(buf, vname, sizeof(buf))) FAIL(ec); + UVersionInfo version; + u_versionFromString(version, buf); + applyFilter(versionFilter, &version, UPROPS_SRC_CHAR, ec); + return *this; + } + break; + default: + // p is a non-binary, non-enumerated property that we + // don't support (yet). + FAIL(ec); + } + } + } + + else { + // value is empty. Interpret as General Category, Script, or + // Binary property. + p = UCHAR_GENERAL_CATEGORY_MASK; + v = u_getPropertyValueEnum(p, pname); + if (v == UCHAR_INVALID_CODE) { + p = UCHAR_SCRIPT; + v = u_getPropertyValueEnum(p, pname); + if (v == UCHAR_INVALID_CODE) { + p = u_getPropertyEnum(pname); + if (p >= UCHAR_BINARY_START && p < UCHAR_BINARY_LIMIT) { + v = 1; + } else if (0 == uprv_comparePropertyNames(ANY, pname)) { + set(MIN_VALUE, MAX_VALUE); + return *this; + } else if (0 == uprv_comparePropertyNames(ASCII, pname)) { + set(0, 0x7F); + return *this; + } else { + + // TODO: Remove the following special-case code when + // these four C99-compatibility properties are implemented + // as enums/names. + for (int32_t i=0; i pattern.length()) { + return FALSE; + } + + // Look for an opening [:, [:^, \p, or \P + return isPOSIXOpen(pattern, pos) || isPerlOpen(pattern, pos) || isNameOpen(pattern, pos); +} + +/** + * Return true if the given iterator appears to point at a + * property pattern. Regardless of the result, return with the + * iterator unchanged. + * @param chars iterator over the pattern characters. Upon return + * it will be unchanged. + * @param iterOpts RuleCharacterIterator options + */ +UBool UnicodeSet::resemblesPropertyPattern(RuleCharacterIterator& chars, + int32_t iterOpts) { + // NOTE: literal will always be FALSE, because we don't parse escapes. + UBool result = FALSE, literal; + UErrorCode ec = U_ZERO_ERROR; + iterOpts &= ~RuleCharacterIterator::PARSE_ESCAPES; + RuleCharacterIterator::Pos pos; + chars.getPos(pos); + UChar32 c = chars.next(iterOpts, literal, ec); + if (c == 0x5B /*'['*/ || c == 0x5C /*'\\'*/) { + UChar32 d = chars.next(iterOpts & ~RuleCharacterIterator::SKIP_WHITESPACE, + literal, ec); + result = (c == 0x5B /*'['*/) ? (d == 0x3A /*':'*/) : + (d == 0x4E /*'N'*/ || d == 0x70 /*'p'*/ || d == 0x50 /*'P'*/); + } + chars.setPos(pos); + return result && U_SUCCESS(ec); +} + +/** + * Parse the given property pattern at the given parse position. + */ +UnicodeSet& UnicodeSet::applyPropertyPattern(const UnicodeString& pattern, + ParsePosition& ppos, + UErrorCode &ec) { + int32_t pos = ppos.getIndex(); + + UBool posix = FALSE; // true for [:pat:], false for \p{pat} \P{pat} \N{pat} + UBool isName = FALSE; // true for \N{pat}, o/w false + UBool invert = FALSE; + + if (U_FAILURE(ec)) return *this; + + // Minimum length is 5 characters, e.g. \p{L} + if ((pos+5) > pattern.length()) { + FAIL(ec); + } + + // On entry, ppos should point to one of the following locations: + // Look for an opening [:, [:^, \p, or \P + if (isPOSIXOpen(pattern, pos)) { + posix = TRUE; + pos += 2; + pos = ICU_Utility::skipWhitespace(pattern, pos); + if (pos < pattern.length() && pattern.charAt(pos) == COMPLEMENT) { + ++pos; + invert = TRUE; + } + } else if (isPerlOpen(pattern, pos) || isNameOpen(pattern, pos)) { + UChar c = pattern.charAt(pos+1); + invert = (c == UPPER_P); + isName = (c == UPPER_N); + pos += 2; + pos = ICU_Utility::skipWhitespace(pattern, pos); + if (pos == pattern.length() || pattern.charAt(pos++) != OPEN_BRACE) { + // Syntax error; "\p" or "\P" not followed by "{" + FAIL(ec); + } + } else { + // Open delimiter not seen + FAIL(ec); + } + + // Look for the matching close delimiter, either :] or } + int32_t close = pattern.indexOf(posix ? POSIX_CLOSE : PERL_CLOSE, pos); + if (close < 0) { + // Syntax error; close delimiter missing + FAIL(ec); + } + + // Look for an '=' sign. If this is present, we will parse a + // medium \p{gc=Cf} or long \p{GeneralCategory=Format} + // pattern. + int32_t equals = pattern.indexOf(EQUALS, pos); + UnicodeString propName, valueName; + if (equals >= 0 && equals < close && !isName) { + // Equals seen; parse medium/long pattern + pattern.extractBetween(pos, equals, propName); + pattern.extractBetween(equals+1, close, valueName); + } + + else { + // Handle case where no '=' is seen, and \N{} + pattern.extractBetween(pos, close, propName); + + // Handle \N{name} + if (isName) { + // This is a little inefficient since it means we have to + // parse NAME_PROP back to UCHAR_NAME even though we already + // know it's UCHAR_NAME. If we refactor the API to + // support args of (UProperty, char*) then we can remove + // NAME_PROP and make this a little more efficient. + valueName = propName; + propName = UnicodeString(NAME_PROP, NAME_PROP_LENGTH, US_INV); + } + } + + applyPropertyAlias(propName, valueName, ec); + + if (U_SUCCESS(ec)) { + if (invert) { + complement(); + } + + // Move to the limit position after the close delimiter if the + // parse succeeded. + ppos.setIndex(close + (posix ? 2 : 1)); + } + + return *this; +} + +/** + * Parse a property pattern. + * @param chars iterator over the pattern characters. Upon return + * it will be advanced to the first character after the parsed + * pattern, or the end of the iteration if all characters are + * parsed. + * @param rebuiltPat the pattern that was parsed, rebuilt or + * copied from the input pattern, as appropriate. + */ +void UnicodeSet::applyPropertyPattern(RuleCharacterIterator& chars, + UnicodeString& rebuiltPat, + UErrorCode& ec) { + if (U_FAILURE(ec)) return; + UnicodeString pattern; + chars.lookahead(pattern); + ParsePosition pos(0); + applyPropertyPattern(pattern, pos, ec); + if (U_FAILURE(ec)) return; + if (pos.getIndex() == 0) { + // syntaxError(chars, "Invalid property pattern"); + ec = U_MALFORMED_SET; + return; + } + chars.jumpahead(pos.getIndex()); + rebuiltPat.append(pattern, 0, pos.getIndex()); +} + +//---------------------------------------------------------------- +// Inclusions list +//---------------------------------------------------------------- + +U_CDECL_BEGIN + +// USetAdder implementation +// Does not use uset.h to reduce code dependencies +static void U_CALLCONV +_set_add(USet *set, UChar32 c) { + ((UnicodeSet *)set)->add(c); +} + +static void U_CALLCONV +_set_addRange(USet *set, UChar32 start, UChar32 end) { + ((UnicodeSet *)set)->add(start, end); +} + +static void U_CALLCONV +_set_addString(USet *set, const UChar *str, int32_t length) { + ((UnicodeSet *)set)->add(UnicodeString((UBool)(length<0), str, length)); +} + +/** + * Cleanup function for UnicodeSet + */ +static UBool U_CALLCONV uset_cleanup(void) { + int32_t i; + + for(i = UPROPS_SRC_NONE; i < UPROPS_SRC_COUNT; ++i) { + if (INCLUSIONS[i] != NULL) { + delete INCLUSIONS[i]; + INCLUSIONS[i] = NULL; + } + } + + if (CASE_EQUIV_HASH != NULL) { + delete CASE_EQUIV_HASH; + CASE_EQUIV_HASH = NULL; + } + + if (CASE_EQUIV_CBA != NULL) { + ucmp8_close(CASE_EQUIV_CBA); + CASE_EQUIV_CBA = NULL; + } + + return TRUE; +} + +U_CDECL_END + +const UnicodeSet* UnicodeSet::getInclusions(int32_t src, UErrorCode &status) { + umtx_lock(NULL); + UBool f = (INCLUSIONS[src] == NULL); + umtx_unlock(NULL); + if (f) { + UnicodeSet* incl = new UnicodeSet(); + USetAdder sa = { + (USet *)incl, + _set_add, + _set_addRange, + _set_addString + }; + + if (incl != NULL) { + switch(src) { + case UPROPS_SRC_CHAR: + uchar_addPropertyStarts(&sa, &status); + break; + case UPROPS_SRC_HST: + uhst_addPropertyStarts(&sa, &status); + break; +#if !UCONFIG_NO_NORMALIZATION + case UPROPS_SRC_NORM: + unorm_addPropertyStarts(&sa, &status); + break; +#endif + case UPROPS_SRC_CASE: + ucase_addPropertyStarts(ucase_getSingleton(&status), &sa, &status); + break; + default: + status = U_INTERNAL_PROGRAM_ERROR; + break; + } + if (U_SUCCESS(status)) { + umtx_lock(NULL); + if (INCLUSIONS[src] == NULL) { + INCLUSIONS[src] = incl; + incl = NULL; + ucln_common_registerCleanup(UCLN_COMMON_USET, uset_cleanup); + } + umtx_unlock(NULL); + } + delete incl; + } else { + status = U_MEMORY_ALLOCATION_ERROR; + } + } + return INCLUSIONS[src]; +} + +//---------------------------------------------------------------- +// Case folding API +//---------------------------------------------------------------- + +// add the result of a full case mapping to the set +// use str as a temporary string to avoid constructing one +static inline void +addCaseMapping(UnicodeSet &set, int32_t result, const UChar *full, UnicodeString &str) { + if(result >= 0) { + if(result > UCASE_MAX_STRING_LENGTH) { + // add a single-code point case mapping + set.add(result); + } else { + // add a string case mapping from full with length result + str.setTo((UBool)FALSE, full, result); + set.add(str); + } + } + // result < 0: the code point mapped to itself, no need to add it + // see ucase.h +} + +UnicodeSet& UnicodeSet::closeOver(int32_t attribute) { + if ((attribute & USET_CASE) != 0) { + UnicodeSet foldSet; + UnicodeString str; + int32_t n = getRangeCount(); + for (int32_t i=0; isize() > 0) { + for (int32_t j=0; jsize(); ++j) { + str = * (const UnicodeString*) strings->elementAt(j); + foldSet.caseCloseOne(str.foldCase()); + } + } + *this = foldSet; + } + else if ((attribute & USET_ADD_CASE_MAPPINGS)) { + UnicodeSet foldSet(*this); + UnicodeString str; + UErrorCode status = U_ZERO_ERROR; + UCaseProps *csp = ucase_getSingleton(&status); + if (U_SUCCESS(status)) { + int32_t n = getRangeCount(); + UChar32 result; + const UChar *full; + int32_t locCache = 0; + + for (int32_t i=0; isize() > 0) { + Locale root(""); +#if !UCONFIG_NO_BREAK_ITERATION + BreakIterator *bi = BreakIterator::createWordInstance(root, status); +#endif + if (U_SUCCESS(status)) { + const UnicodeString *pStr; + + for (int32_t j=0; jsize(); ++j) { + pStr = (const UnicodeString *) strings->elementAt(j); + (str = *pStr).toLower(root); + foldSet.add(str); +#if !UCONFIG_NO_BREAK_ITERATION + (str = *pStr).toTitle(bi, root); + foldSet.add(str); +#endif + (str = *pStr).toUpper(root); + foldSet.add(str); + (str = *pStr).foldCase(); + foldSet.add(str); + } + } +#if !UCONFIG_NO_BREAK_ITERATION + delete bi; +#endif + } + *this = foldSet; + } + } + return *this; +} + +//---------------------------------------------------------------- +// Case folding implementation +//---------------------------------------------------------------- + +/** + * Data structure representing a case-fold equivalency class. It is a + * SET containing 0 or more code units, and 0 or more strings of + * length 2 code units or longer. + * + * This class is implemented as a 8-UChar buffer with a few + * convenience methods on it. The format of the buffer: + * - All single code units in this set, followed by a terminating + * zero. If none, then just a terminating zero. + * - Zero or more 0-terminated strings, each of length >= 2 + * code units. + * - A single terminating (UChar)0. + * + * Usage: + * + * const CaseEquivClass& c = ...; + * const UChar* p; + * for (c.getStrings(p); *p; c.nextString(p)) { + * foo(p); + * } + */ +class CaseEquivClass { +public: + UChar data[8]; + + /** + * Return the string of single code units. May be "". Will never + * be NULL. + */ + const UChar* getSingles() const { + return data; + } + + /** + * Return the first multi-code-unit string. May be "" if there + * are none. Will never be NULL. + * @param p pointer to be set to point to the first string. + */ + void getStrings(const UChar*& p) const { + p = data; + nextString(p); + } + + /** + * Advance a pointer from one multi-code-unit string to the next. + * May advance 'p' to point to "" if there are no more. + * Do NOT call if *p == 0. + * @param p pointer to be advanced to point to the next string. + */ + static void nextString(const UChar*& p) { + while (*p++) {} + } +}; + +/** + * IMPORTANT: The following two static data arrays represent the + * information used to do case closure. The first array is an array + * of pairs. That is, for each even index e, entries [e] and [e+1] + * form a pair of case equivalent code units. The entry at [e] is the + * folded one, that is, the one for which u_foldCase(x)==x. + * + * The second static array is an array of CaseEquivClass objects. + * Since these objects are just adorned UChar[] arrays, they can be + * initialized in place in the array, and all of them can live in a + * single piece of static memory, with no heap allocation. + */ + +// MACHINE-GENERATED: Do not edit (see com.ibm.icu.dev.tools.translit.UnicodeSetCloseOver) +static const UChar CASE_PAIRS[] = { + 0x0061,0x0041,0x0062,0x0042,0x0063,0x0043,0x0064,0x0044,0x0065,0x0045, + 0x0066,0x0046,0x0067,0x0047,0x0068,0x0048,0x0069,0x0049,0x006A,0x004A, + 0x006C,0x004C,0x006D,0x004D,0x006E,0x004E,0x006F,0x004F,0x0070,0x0050, + 0x0071,0x0051,0x0072,0x0052,0x0074,0x0054,0x0075,0x0055,0x0076,0x0056, + 0x0077,0x0057,0x0078,0x0058,0x0079,0x0059,0x007A,0x005A,0x00E0,0x00C0, + 0x00E1,0x00C1,0x00E2,0x00C2,0x00E3,0x00C3,0x00E4,0x00C4,0x00E6,0x00C6, + 0x00E7,0x00C7,0x00E8,0x00C8,0x00E9,0x00C9,0x00EA,0x00CA,0x00EB,0x00CB, + 0x00EC,0x00CC,0x00ED,0x00CD,0x00EE,0x00CE,0x00EF,0x00CF,0x00F0,0x00D0, + 0x00F1,0x00D1,0x00F2,0x00D2,0x00F3,0x00D3,0x00F4,0x00D4,0x00F5,0x00D5, + 0x00F6,0x00D6,0x00F8,0x00D8,0x00F9,0x00D9,0x00FA,0x00DA,0x00FB,0x00DB, + 0x00FC,0x00DC,0x00FD,0x00DD,0x00FE,0x00DE,0x00FF,0x0178,0x0101,0x0100, + 0x0103,0x0102,0x0105,0x0104,0x0107,0x0106,0x0109,0x0108,0x010B,0x010A, + 0x010D,0x010C,0x010F,0x010E,0x0111,0x0110,0x0113,0x0112,0x0115,0x0114, + 0x0117,0x0116,0x0119,0x0118,0x011B,0x011A,0x011D,0x011C,0x011F,0x011E, + 0x0121,0x0120,0x0123,0x0122,0x0125,0x0124,0x0127,0x0126,0x0129,0x0128, + 0x012B,0x012A,0x012D,0x012C,0x012F,0x012E,0x0133,0x0132,0x0135,0x0134, + 0x0137,0x0136,0x013A,0x0139,0x013C,0x013B,0x013E,0x013D,0x0140,0x013F, + 0x0142,0x0141,0x0144,0x0143,0x0146,0x0145,0x0148,0x0147,0x014B,0x014A, + 0x014D,0x014C,0x014F,0x014E,0x0151,0x0150,0x0153,0x0152,0x0155,0x0154, + 0x0157,0x0156,0x0159,0x0158,0x015B,0x015A,0x015D,0x015C,0x015F,0x015E, + 0x0161,0x0160,0x0163,0x0162,0x0165,0x0164,0x0167,0x0166,0x0169,0x0168, + 0x016B,0x016A,0x016D,0x016C,0x016F,0x016E,0x0171,0x0170,0x0173,0x0172, + 0x0175,0x0174,0x0177,0x0176,0x017A,0x0179,0x017C,0x017B,0x017E,0x017D, + 0x0183,0x0182,0x0185,0x0184,0x0188,0x0187,0x018C,0x018B,0x0192,0x0191, + 0x0195,0x01F6,0x0199,0x0198,0x019E,0x0220,0x01A1,0x01A0,0x01A3,0x01A2, + 0x01A5,0x01A4,0x01A8,0x01A7,0x01AD,0x01AC,0x01B0,0x01AF,0x01B4,0x01B3, + 0x01B6,0x01B5,0x01B9,0x01B8,0x01BD,0x01BC,0x01BF,0x01F7,0x01CE,0x01CD, + 0x01D0,0x01CF,0x01D2,0x01D1,0x01D4,0x01D3,0x01D6,0x01D5,0x01D8,0x01D7, + 0x01DA,0x01D9,0x01DC,0x01DB,0x01DD,0x018E,0x01DF,0x01DE,0x01E1,0x01E0, + 0x01E3,0x01E2,0x01E5,0x01E4,0x01E7,0x01E6,0x01E9,0x01E8,0x01EB,0x01EA, + 0x01ED,0x01EC,0x01EF,0x01EE,0x01F5,0x01F4,0x01F9,0x01F8,0x01FB,0x01FA, + 0x01FD,0x01FC,0x01FF,0x01FE,0x0201,0x0200,0x0203,0x0202,0x0205,0x0204, + 0x0207,0x0206,0x0209,0x0208,0x020B,0x020A,0x020D,0x020C,0x020F,0x020E, + 0x0211,0x0210,0x0213,0x0212,0x0215,0x0214,0x0217,0x0216,0x0219,0x0218, + 0x021B,0x021A,0x021D,0x021C,0x021F,0x021E,0x0223,0x0222,0x0225,0x0224, + 0x0227,0x0226,0x0229,0x0228,0x022B,0x022A,0x022D,0x022C,0x022F,0x022E, + 0x0231,0x0230,0x0233,0x0232,0x0253,0x0181,0x0254,0x0186,0x0256,0x0189, + 0x0257,0x018A,0x0259,0x018F,0x025B,0x0190,0x0260,0x0193,0x0263,0x0194, + 0x0268,0x0197,0x0269,0x0196,0x026F,0x019C,0x0272,0x019D,0x0275,0x019F, + 0x0280,0x01A6,0x0283,0x01A9,0x0288,0x01AE,0x028A,0x01B1,0x028B,0x01B2, + 0x0292,0x01B7,0x03AC,0x0386,0x03AD,0x0388,0x03AE,0x0389,0x03AF,0x038A, + 0x03B1,0x0391,0x03B3,0x0393,0x03B4,0x0394,0x03B6,0x0396,0x03B7,0x0397, + 0x03BB,0x039B,0x03BD,0x039D,0x03BE,0x039E,0x03BF,0x039F,0x03C4,0x03A4, + 0x03C5,0x03A5,0x03C7,0x03A7,0x03C8,0x03A8,0x03CA,0x03AA,0x03CB,0x03AB, + 0x03CC,0x038C,0x03CD,0x038E,0x03CE,0x038F,0x03D9,0x03D8,0x03DB,0x03DA, + 0x03DD,0x03DC,0x03DF,0x03DE,0x03E1,0x03E0,0x03E3,0x03E2,0x03E5,0x03E4, + 0x03E7,0x03E6,0x03E9,0x03E8,0x03EB,0x03EA,0x03ED,0x03EC,0x03EF,0x03EE, + 0x0430,0x0410,0x0431,0x0411,0x0432,0x0412,0x0433,0x0413,0x0434,0x0414, + 0x0435,0x0415,0x0436,0x0416,0x0437,0x0417,0x0438,0x0418,0x0439,0x0419, + 0x043A,0x041A,0x043B,0x041B,0x043C,0x041C,0x043D,0x041D,0x043E,0x041E, + 0x043F,0x041F,0x0440,0x0420,0x0441,0x0421,0x0442,0x0422,0x0443,0x0423, + 0x0444,0x0424,0x0445,0x0425,0x0446,0x0426,0x0447,0x0427,0x0448,0x0428, + 0x0449,0x0429,0x044A,0x042A,0x044B,0x042B,0x044C,0x042C,0x044D,0x042D, + 0x044E,0x042E,0x044F,0x042F,0x0450,0x0400,0x0451,0x0401,0x0452,0x0402, + 0x0453,0x0403,0x0454,0x0404,0x0455,0x0405,0x0456,0x0406,0x0457,0x0407, + 0x0458,0x0408,0x0459,0x0409,0x045A,0x040A,0x045B,0x040B,0x045C,0x040C, + 0x045D,0x040D,0x045E,0x040E,0x045F,0x040F,0x0461,0x0460,0x0463,0x0462, + 0x0465,0x0464,0x0467,0x0466,0x0469,0x0468,0x046B,0x046A,0x046D,0x046C, + 0x046F,0x046E,0x0471,0x0470,0x0473,0x0472,0x0475,0x0474,0x0477,0x0476, + 0x0479,0x0478,0x047B,0x047A,0x047D,0x047C,0x047F,0x047E,0x0481,0x0480, + 0x048B,0x048A,0x048D,0x048C,0x048F,0x048E,0x0491,0x0490,0x0493,0x0492, + 0x0495,0x0494,0x0497,0x0496,0x0499,0x0498,0x049B,0x049A,0x049D,0x049C, + 0x049F,0x049E,0x04A1,0x04A0,0x04A3,0x04A2,0x04A5,0x04A4,0x04A7,0x04A6, + 0x04A9,0x04A8,0x04AB,0x04AA,0x04AD,0x04AC,0x04AF,0x04AE,0x04B1,0x04B0, + 0x04B3,0x04B2,0x04B5,0x04B4,0x04B7,0x04B6,0x04B9,0x04B8,0x04BB,0x04BA, + 0x04BD,0x04BC,0x04BF,0x04BE,0x04C2,0x04C1,0x04C4,0x04C3,0x04C6,0x04C5, + 0x04C8,0x04C7,0x04CA,0x04C9,0x04CC,0x04CB,0x04CE,0x04CD,0x04D1,0x04D0, + 0x04D3,0x04D2,0x04D5,0x04D4,0x04D7,0x04D6,0x04D9,0x04D8,0x04DB,0x04DA, + 0x04DD,0x04DC,0x04DF,0x04DE,0x04E1,0x04E0,0x04E3,0x04E2,0x04E5,0x04E4, + 0x04E7,0x04E6,0x04E9,0x04E8,0x04EB,0x04EA,0x04ED,0x04EC,0x04EF,0x04EE, + 0x04F1,0x04F0,0x04F3,0x04F2,0x04F5,0x04F4,0x04F9,0x04F8,0x0501,0x0500, + 0x0503,0x0502,0x0505,0x0504,0x0507,0x0506,0x0509,0x0508,0x050B,0x050A, + 0x050D,0x050C,0x050F,0x050E,0x0561,0x0531,0x0562,0x0532,0x0563,0x0533, + 0x0564,0x0534,0x0565,0x0535,0x0566,0x0536,0x0567,0x0537,0x0568,0x0538, + 0x0569,0x0539,0x056A,0x053A,0x056B,0x053B,0x056C,0x053C,0x056D,0x053D, + 0x056E,0x053E,0x056F,0x053F,0x0570,0x0540,0x0571,0x0541,0x0572,0x0542, + 0x0573,0x0543,0x0574,0x0544,0x0575,0x0545,0x0576,0x0546,0x0577,0x0547, + 0x0578,0x0548,0x0579,0x0549,0x057A,0x054A,0x057B,0x054B,0x057C,0x054C, + 0x057D,0x054D,0x057E,0x054E,0x057F,0x054F,0x0580,0x0550,0x0581,0x0551, + 0x0582,0x0552,0x0583,0x0553,0x0584,0x0554,0x0585,0x0555,0x0586,0x0556, + 0x1E01,0x1E00,0x1E03,0x1E02,0x1E05,0x1E04,0x1E07,0x1E06,0x1E09,0x1E08, + 0x1E0B,0x1E0A,0x1E0D,0x1E0C,0x1E0F,0x1E0E,0x1E11,0x1E10,0x1E13,0x1E12, + 0x1E15,0x1E14,0x1E17,0x1E16,0x1E19,0x1E18,0x1E1B,0x1E1A,0x1E1D,0x1E1C, + 0x1E1F,0x1E1E,0x1E21,0x1E20,0x1E23,0x1E22,0x1E25,0x1E24,0x1E27,0x1E26, + 0x1E29,0x1E28,0x1E2B,0x1E2A,0x1E2D,0x1E2C,0x1E2F,0x1E2E,0x1E31,0x1E30, + 0x1E33,0x1E32,0x1E35,0x1E34,0x1E37,0x1E36,0x1E39,0x1E38,0x1E3B,0x1E3A, + 0x1E3D,0x1E3C,0x1E3F,0x1E3E,0x1E41,0x1E40,0x1E43,0x1E42,0x1E45,0x1E44, + 0x1E47,0x1E46,0x1E49,0x1E48,0x1E4B,0x1E4A,0x1E4D,0x1E4C,0x1E4F,0x1E4E, + 0x1E51,0x1E50,0x1E53,0x1E52,0x1E55,0x1E54,0x1E57,0x1E56,0x1E59,0x1E58, + 0x1E5B,0x1E5A,0x1E5D,0x1E5C,0x1E5F,0x1E5E,0x1E63,0x1E62,0x1E65,0x1E64, + 0x1E67,0x1E66,0x1E69,0x1E68,0x1E6B,0x1E6A,0x1E6D,0x1E6C,0x1E6F,0x1E6E, + 0x1E71,0x1E70,0x1E73,0x1E72,0x1E75,0x1E74,0x1E77,0x1E76,0x1E79,0x1E78, + 0x1E7B,0x1E7A,0x1E7D,0x1E7C,0x1E7F,0x1E7E,0x1E81,0x1E80,0x1E83,0x1E82, + 0x1E85,0x1E84,0x1E87,0x1E86,0x1E89,0x1E88,0x1E8B,0x1E8A,0x1E8D,0x1E8C, + 0x1E8F,0x1E8E,0x1E91,0x1E90,0x1E93,0x1E92,0x1E95,0x1E94,0x1EA1,0x1EA0, + 0x1EA3,0x1EA2,0x1EA5,0x1EA4,0x1EA7,0x1EA6,0x1EA9,0x1EA8,0x1EAB,0x1EAA, + 0x1EAD,0x1EAC,0x1EAF,0x1EAE,0x1EB1,0x1EB0,0x1EB3,0x1EB2,0x1EB5,0x1EB4, + 0x1EB7,0x1EB6,0x1EB9,0x1EB8,0x1EBB,0x1EBA,0x1EBD,0x1EBC,0x1EBF,0x1EBE, + 0x1EC1,0x1EC0,0x1EC3,0x1EC2,0x1EC5,0x1EC4,0x1EC7,0x1EC6,0x1EC9,0x1EC8, + 0x1ECB,0x1ECA,0x1ECD,0x1ECC,0x1ECF,0x1ECE,0x1ED1,0x1ED0,0x1ED3,0x1ED2, + 0x1ED5,0x1ED4,0x1ED7,0x1ED6,0x1ED9,0x1ED8,0x1EDB,0x1EDA,0x1EDD,0x1EDC, + 0x1EDF,0x1EDE,0x1EE1,0x1EE0,0x1EE3,0x1EE2,0x1EE5,0x1EE4,0x1EE7,0x1EE6, + 0x1EE9,0x1EE8,0x1EEB,0x1EEA,0x1EED,0x1EEC,0x1EEF,0x1EEE,0x1EF1,0x1EF0, + 0x1EF3,0x1EF2,0x1EF5,0x1EF4,0x1EF7,0x1EF6,0x1EF9,0x1EF8,0x1F00,0x1F08, + 0x1F01,0x1F09,0x1F02,0x1F0A,0x1F03,0x1F0B,0x1F04,0x1F0C,0x1F05,0x1F0D, + 0x1F06,0x1F0E,0x1F07,0x1F0F,0x1F10,0x1F18,0x1F11,0x1F19,0x1F12,0x1F1A, + 0x1F13,0x1F1B,0x1F14,0x1F1C,0x1F15,0x1F1D,0x1F20,0x1F28,0x1F21,0x1F29, + 0x1F22,0x1F2A,0x1F23,0x1F2B,0x1F24,0x1F2C,0x1F25,0x1F2D,0x1F26,0x1F2E, + 0x1F27,0x1F2F,0x1F30,0x1F38,0x1F31,0x1F39,0x1F32,0x1F3A,0x1F33,0x1F3B, + 0x1F34,0x1F3C,0x1F35,0x1F3D,0x1F36,0x1F3E,0x1F37,0x1F3F,0x1F40,0x1F48, + 0x1F41,0x1F49,0x1F42,0x1F4A,0x1F43,0x1F4B,0x1F44,0x1F4C,0x1F45,0x1F4D, + 0x1F51,0x1F59,0x1F53,0x1F5B,0x1F55,0x1F5D,0x1F57,0x1F5F,0x1F60,0x1F68, + 0x1F61,0x1F69,0x1F62,0x1F6A,0x1F63,0x1F6B,0x1F64,0x1F6C,0x1F65,0x1F6D, + 0x1F66,0x1F6E,0x1F67,0x1F6F,0x1F70,0x1FBA,0x1F71,0x1FBB,0x1F72,0x1FC8, + 0x1F73,0x1FC9,0x1F74,0x1FCA,0x1F75,0x1FCB,0x1F76,0x1FDA,0x1F77,0x1FDB, + 0x1F78,0x1FF8,0x1F79,0x1FF9,0x1F7A,0x1FEA,0x1F7B,0x1FEB,0x1F7C,0x1FFA, + 0x1F7D,0x1FFB,0x1FB0,0x1FB8,0x1FB1,0x1FB9,0x1FD0,0x1FD8,0x1FD1,0x1FD9, + 0x1FE0,0x1FE8,0x1FE1,0x1FE9,0x1FE5,0x1FEC,0x2170,0x2160,0x2171,0x2161, + 0x2172,0x2162,0x2173,0x2163,0x2174,0x2164,0x2175,0x2165,0x2176,0x2166, + 0x2177,0x2167,0x2178,0x2168,0x2179,0x2169,0x217A,0x216A,0x217B,0x216B, + 0x217C,0x216C,0x217D,0x216D,0x217E,0x216E,0x217F,0x216F,0x24D0,0x24B6, + 0x24D1,0x24B7,0x24D2,0x24B8,0x24D3,0x24B9,0x24D4,0x24BA,0x24D5,0x24BB, + 0x24D6,0x24BC,0x24D7,0x24BD,0x24D8,0x24BE,0x24D9,0x24BF,0x24DA,0x24C0, + 0x24DB,0x24C1,0x24DC,0x24C2,0x24DD,0x24C3,0x24DE,0x24C4,0x24DF,0x24C5, + 0x24E0,0x24C6,0x24E1,0x24C7,0x24E2,0x24C8,0x24E3,0x24C9,0x24E4,0x24CA, + 0x24E5,0x24CB,0x24E6,0x24CC,0x24E7,0x24CD,0x24E8,0x24CE,0x24E9,0x24CF, + 0xFF41,0xFF21,0xFF42,0xFF22,0xFF43,0xFF23,0xFF44,0xFF24,0xFF45,0xFF25, + 0xFF46,0xFF26,0xFF47,0xFF27,0xFF48,0xFF28,0xFF49,0xFF29,0xFF4A,0xFF2A, + 0xFF4B,0xFF2B,0xFF4C,0xFF2C,0xFF4D,0xFF2D,0xFF4E,0xFF2E,0xFF4F,0xFF2F, + 0xFF50,0xFF30,0xFF51,0xFF31,0xFF52,0xFF32,0xFF53,0xFF33,0xFF54,0xFF34, + 0xFF55,0xFF35,0xFF56,0xFF36,0xFF57,0xFF37,0xFF58,0xFF38,0xFF59,0xFF39, + 0xFF5A,0xFF3A, +}; + +// MACHINE-GENERATED: Do not edit (see com.ibm.icu.dev.tools.translit.UnicodeSetCloseOver) +static const CaseEquivClass CASE_NONPAIRS[] = { + {{0x1E9A,0, 0x0061,0x02BE,0, 0}}, + {{0xFB00,0, 0x0066,0x0066,0, 0}}, + {{0xFB03,0, 0x0066,0x0066,0x0069,0, 0}}, + {{0xFB04,0, 0x0066,0x0066,0x006C,0, 0}}, + {{0xFB01,0, 0x0066,0x0069,0, 0}}, + {{0xFB02,0, 0x0066,0x006C,0, 0}}, + {{0x1E96,0, 0x0068,0x0331,0, 0}}, + {{0x0130,0, 0x0069,0x0307,0, 0}}, + {{0x01F0,0, 0x006A,0x030C,0, 0}}, + {{0x004B,0x006B,0x212A,0, 0}}, + {{0x0053,0x0073,0x017F,0, 0}}, + {{0x00DF,0, 0x0073,0x0073,0, 0}}, + {{0xFB05,0xFB06,0, 0x0073,0x0074,0, 0}}, + {{0x1E97,0, 0x0074,0x0308,0, 0}}, + {{0x1E98,0, 0x0077,0x030A,0, 0}}, + {{0x1E99,0, 0x0079,0x030A,0, 0}}, + {{0x00C5,0x00E5,0x212B,0, 0}}, + {{0x01C4,0x01C5,0x01C6,0, 0}}, + {{0x01C7,0x01C8,0x01C9,0, 0}}, + {{0x01CA,0x01CB,0x01CC,0, 0}}, + {{0x01F1,0x01F2,0x01F3,0, 0}}, + {{0x0149,0, 0x02BC,0x006E,0, 0}}, + {{0x1FB4,0, 0x03AC,0x03B9,0, 0}}, + {{0x1FC4,0, 0x03AE,0x03B9,0, 0}}, + {{0x1FB6,0, 0x03B1,0x0342,0, 0}}, + {{0x1FB7,0, 0x03B1,0x0342,0x03B9,0, 0}}, + {{0x1FB3,0x1FBC,0, 0x03B1,0x03B9,0, 0}}, + {{0x0392,0x03B2,0x03D0,0, 0}}, + {{0x0395,0x03B5,0x03F5,0, 0}}, + {{0x1FC6,0, 0x03B7,0x0342,0, 0}}, + {{0x1FC7,0, 0x03B7,0x0342,0x03B9,0, 0}}, + {{0x1FC3,0x1FCC,0, 0x03B7,0x03B9,0, 0}}, + {{0x0398,0x03B8,0x03D1,0x03F4,0, 0}}, + {{0x0345,0x0399,0x03B9,0x1FBE,0, 0}}, + {{0x1FD2,0, 0x03B9,0x0308,0x0300,0, 0}}, + {{0x0390,0x1FD3,0, 0x03B9,0x0308,0x0301,0, 0}}, + {{0x1FD7,0, 0x03B9,0x0308,0x0342,0, 0}}, + {{0x1FD6,0, 0x03B9,0x0342,0, 0}}, + {{0x039A,0x03BA,0x03F0,0, 0}}, + {{0x00B5,0x039C,0x03BC,0, 0}}, + {{0x03A0,0x03C0,0x03D6,0, 0}}, + {{0x03A1,0x03C1,0x03F1,0, 0}}, + {{0x1FE4,0, 0x03C1,0x0313,0, 0}}, + {{0x03A3,0x03C2,0x03C3,0x03F2,0, 0}}, + {{0x1FE2,0, 0x03C5,0x0308,0x0300,0, 0}}, + {{0x03B0,0x1FE3,0, 0x03C5,0x0308,0x0301,0, 0}}, + {{0x1FE7,0, 0x03C5,0x0308,0x0342,0, 0}}, + {{0x1F50,0, 0x03C5,0x0313,0, 0}}, + {{0x1F52,0, 0x03C5,0x0313,0x0300,0, 0}}, + {{0x1F54,0, 0x03C5,0x0313,0x0301,0, 0}}, + {{0x1F56,0, 0x03C5,0x0313,0x0342,0, 0}}, + {{0x1FE6,0, 0x03C5,0x0342,0, 0}}, + {{0x03A6,0x03C6,0x03D5,0, 0}}, + {{0x03A9,0x03C9,0x2126,0, 0}}, + {{0x1FF6,0, 0x03C9,0x0342,0, 0}}, + {{0x1FF7,0, 0x03C9,0x0342,0x03B9,0, 0}}, + {{0x1FF3,0x1FFC,0, 0x03C9,0x03B9,0, 0}}, + {{0x1FF4,0, 0x03CE,0x03B9,0, 0}}, + {{0x0587,0, 0x0565,0x0582,0, 0}}, + {{0xFB14,0, 0x0574,0x0565,0, 0}}, + {{0xFB15,0, 0x0574,0x056B,0, 0}}, + {{0xFB17,0, 0x0574,0x056D,0, 0}}, + {{0xFB13,0, 0x0574,0x0576,0, 0}}, + {{0xFB16,0, 0x057E,0x0576,0, 0}}, + {{0x1E60,0x1E61,0x1E9B,0, 0}}, + {{0x1F80,0x1F88,0, 0x1F00,0x03B9,0, 0}}, + {{0x1F81,0x1F89,0, 0x1F01,0x03B9,0, 0}}, + {{0x1F82,0x1F8A,0, 0x1F02,0x03B9,0, 0}}, + {{0x1F83,0x1F8B,0, 0x1F03,0x03B9,0, 0}}, + {{0x1F84,0x1F8C,0, 0x1F04,0x03B9,0, 0}}, + {{0x1F85,0x1F8D,0, 0x1F05,0x03B9,0, 0}}, + {{0x1F86,0x1F8E,0, 0x1F06,0x03B9,0, 0}}, + {{0x1F87,0x1F8F,0, 0x1F07,0x03B9,0, 0}}, + {{0x1F90,0x1F98,0, 0x1F20,0x03B9,0, 0}}, + {{0x1F91,0x1F99,0, 0x1F21,0x03B9,0, 0}}, + {{0x1F92,0x1F9A,0, 0x1F22,0x03B9,0, 0}}, + {{0x1F93,0x1F9B,0, 0x1F23,0x03B9,0, 0}}, + {{0x1F94,0x1F9C,0, 0x1F24,0x03B9,0, 0}}, + {{0x1F95,0x1F9D,0, 0x1F25,0x03B9,0, 0}}, + {{0x1F96,0x1F9E,0, 0x1F26,0x03B9,0, 0}}, + {{0x1F97,0x1F9F,0, 0x1F27,0x03B9,0, 0}}, + {{0x1FA0,0x1FA8,0, 0x1F60,0x03B9,0, 0}}, + {{0x1FA1,0x1FA9,0, 0x1F61,0x03B9,0, 0}}, + {{0x1FA2,0x1FAA,0, 0x1F62,0x03B9,0, 0}}, + {{0x1FA3,0x1FAB,0, 0x1F63,0x03B9,0, 0}}, + {{0x1FA4,0x1FAC,0, 0x1F64,0x03B9,0, 0}}, + {{0x1FA5,0x1FAD,0, 0x1F65,0x03B9,0, 0}}, + {{0x1FA6,0x1FAE,0, 0x1F66,0x03B9,0, 0}}, + {{0x1FA7,0x1FAF,0, 0x1F67,0x03B9,0, 0}}, + {{0x1FB2,0, 0x1F70,0x03B9,0, 0}}, + {{0x1FC2,0, 0x1F74,0x03B9,0, 0}}, + {{0x1FF2,0, 0x1F7C,0x03B9,0, 0}}, + {{0, 0xD801,0xDC00,0, 0xD801,0xDC28,0, 0}}, + {{0, 0xD801,0xDC01,0, 0xD801,0xDC29,0, 0}}, + {{0, 0xD801,0xDC02,0, 0xD801,0xDC2A,0, 0}}, + {{0, 0xD801,0xDC03,0, 0xD801,0xDC2B,0, 0}}, + {{0, 0xD801,0xDC04,0, 0xD801,0xDC2C,0, 0}}, + {{0, 0xD801,0xDC05,0, 0xD801,0xDC2D,0, 0}}, + {{0, 0xD801,0xDC06,0, 0xD801,0xDC2E,0, 0}}, + {{0, 0xD801,0xDC07,0, 0xD801,0xDC2F,0, 0}}, + {{0, 0xD801,0xDC08,0, 0xD801,0xDC30,0, 0}}, + {{0, 0xD801,0xDC09,0, 0xD801,0xDC31,0, 0}}, + {{0, 0xD801,0xDC0A,0, 0xD801,0xDC32,0, 0}}, + {{0, 0xD801,0xDC0B,0, 0xD801,0xDC33,0, 0}}, + {{0, 0xD801,0xDC0C,0, 0xD801,0xDC34,0, 0}}, + {{0, 0xD801,0xDC0D,0, 0xD801,0xDC35,0, 0}}, + {{0, 0xD801,0xDC0E,0, 0xD801,0xDC36,0, 0}}, + {{0, 0xD801,0xDC0F,0, 0xD801,0xDC37,0, 0}}, + {{0, 0xD801,0xDC10,0, 0xD801,0xDC38,0, 0}}, + {{0, 0xD801,0xDC11,0, 0xD801,0xDC39,0, 0}}, + {{0, 0xD801,0xDC12,0, 0xD801,0xDC3A,0, 0}}, + {{0, 0xD801,0xDC13,0, 0xD801,0xDC3B,0, 0}}, + {{0, 0xD801,0xDC14,0, 0xD801,0xDC3C,0, 0}}, + {{0, 0xD801,0xDC15,0, 0xD801,0xDC3D,0, 0}}, + {{0, 0xD801,0xDC16,0, 0xD801,0xDC3E,0, 0}}, + {{0, 0xD801,0xDC17,0, 0xD801,0xDC3F,0, 0}}, + {{0, 0xD801,0xDC18,0, 0xD801,0xDC40,0, 0}}, + {{0, 0xD801,0xDC19,0, 0xD801,0xDC41,0, 0}}, + {{0, 0xD801,0xDC1A,0, 0xD801,0xDC42,0, 0}}, + {{0, 0xD801,0xDC1B,0, 0xD801,0xDC43,0, 0}}, + {{0, 0xD801,0xDC1C,0, 0xD801,0xDC44,0, 0}}, + {{0, 0xD801,0xDC1D,0, 0xD801,0xDC45,0, 0}}, + {{0, 0xD801,0xDC1E,0, 0xD801,0xDC46,0, 0}}, + {{0, 0xD801,0xDC1F,0, 0xD801,0xDC47,0, 0}}, + {{0, 0xD801,0xDC20,0, 0xD801,0xDC48,0, 0}}, + {{0, 0xD801,0xDC21,0, 0xD801,0xDC49,0, 0}}, + {{0, 0xD801,0xDC22,0, 0xD801,0xDC4A,0, 0}}, + {{0, 0xD801,0xDC23,0, 0xD801,0xDC4B,0, 0}}, + {{0, 0xD801,0xDC24,0, 0xD801,0xDC4C,0, 0}}, + {{0, 0xD801,0xDC25,0, 0xD801,0xDC4D,0, 0}} +}; + +#define CASE_PAIRS_LENGTH (sizeof(CASE_PAIRS)/sizeof(CASE_PAIRS[0])) +#define CASE_NONPAIRS_LENGTH (sizeof(CASE_NONPAIRS)/sizeof(CASE_NONPAIRS[0])) + +/** + * Add to this set all members of the case fold equivalency class + * that contains 'folded'. + * @param folded a string within a case fold equivalency class. + * It must have the property that UCharacter.foldCase(folded, + * DEFAULT_CASE_MAP).equals(folded). + */ +void UnicodeSet::caseCloseOne(const UnicodeString& folded) { + if (folded.length() == 1) { + caseCloseOne(folded.charAt(0)); + return; + } + + const CaseEquivClass* c = getCaseMapOf(folded); + if (c != NULL) { + caseCloseOne(*c); + return; + } + + // Add 'folded' itself; it belongs to no equivalency class. + add(folded); +} + +/** + * Add to this set all members of the case fold equivalency class + * that contains 'folded'. + * @param folded a code UNIT within a case fold equivalency class. + * It must have the property that uchar_foldCase(folded, + * DEFAULT_CASE_MAP) == folded. + */ +void UnicodeSet::caseCloseOne(UChar folded) { + // We must do a DOUBLE LOOKUP, first in the CompactByteArray that + // indexes into CASE_NONPAIRS[] and then into the CASE_PAIRS[] + // sorted array. A character will occur in one or the other, or + // neither, but not both. + + // Look in the CompactByteArray. + const CaseEquivClass* c = getCaseMapOf(folded); + if (c != NULL) { + caseCloseOne(*c); + return; + } + + // Binary search in pairs array, looking at only even entries. + // The indices low, high, and x will be halved with respect to + // CASE_PAIRS[]; that is, they must be doubled before indexing. + + // CASE_PAIRS has 1312 elements, of 656 pairs, so the search + // takes no more than 10 passes. + int32_t low = 0; + int32_t high = (CASE_PAIRS_LENGTH >> 1) - 1; + int32_t x; + do { + x = (low + high) >> 1; + UChar ch = CASE_PAIRS[(uint32_t)(x << 1)]; + if (folded < ch) { + high = x - 1; + } else if (folded > ch) { + low = x + 1; + } else { + break; + } + } while (low < high); + + x = (low + high) & ~1; // ((low + high) >> 1) << 1 + if (folded == CASE_PAIRS[x]) { + add(CASE_PAIRS[x]); + add(CASE_PAIRS[x+1]); + } else { + // If the search fails, then add folded itself; it is a + // case-unique code unit. + add(folded); + } +} + +/** + * Add to this set all members of the given CaseEquivClass object. + */ +void UnicodeSet::caseCloseOne(const CaseEquivClass& c) { + const UChar* p = c.getSingles(); + while (*p) { + add(*p++); // add all single code units + } + for (c.getStrings(p); *p; c.nextString(p)) { + add(p); // add all strings + } +} + +/** + * Given a folded string of length >= 2 code units, return the + * CaseEquivClass containing this string, or NULL if none. + */ +const CaseEquivClass* UnicodeSet::getCaseMapOf(const UnicodeString& folded) { + umtx_lock(NULL); + UBool f = (CASE_EQUIV_HASH == NULL); + umtx_unlock(NULL); + + if (f) { + // Create the Hashtable, which maps UnicodeStrings to index + // values into CASE_NONPAIRS. + UErrorCode ec = U_ZERO_ERROR; + Hashtable* hash = new Hashtable(); + if (hash != NULL) { + int32_t i; + for (i=0; i<(int32_t)CASE_NONPAIRS_LENGTH; ++i) { + const CaseEquivClass* c = &CASE_NONPAIRS[i]; + const UChar* p; + for (c->getStrings(p); *p; c->nextString(p)) { + hash->put(UnicodeString(p), (void*) c, ec); + } + } + if (U_SUCCESS(ec)) { + umtx_lock(NULL); + if (CASE_EQUIV_HASH == NULL) { + CASE_EQUIV_HASH = hash; + hash = NULL; + ucln_common_registerCleanup(UCLN_COMMON_USET, uset_cleanup); + } + umtx_unlock(NULL); + } + delete hash; + } + } + + return (CASE_EQUIV_HASH != NULL) ? + (const CaseEquivClass*) CASE_EQUIV_HASH->get(folded) : NULL; +} + +/** + * Given a folded code unit, return the CaseEquivClass containing it, + * or NULL if none. + */ +const CaseEquivClass* UnicodeSet::getCaseMapOf(UChar folded) { + umtx_lock(NULL); + UBool f = (CASE_EQUIV_CBA == NULL); + umtx_unlock(NULL); + + if (f) { + // Create the CompactByteArray, which maps single code units + // to index values into CASE_NONPAIRS. + CompactByteArray* cba = ucmp8_open(-1); + if (ucmp8_isBogus(cba)) { + ucmp8_close(cba); + cba = NULL; + } else { + int32_t i; + for (i=0; i<(int32_t)CASE_NONPAIRS_LENGTH; ++i) { + const UChar* p = CASE_NONPAIRS[i].getSingles(); + UChar ch; + while ((ch = *p++) != 0) { + ucmp8_set(cba, ch, (int8_t) i); + } + } + ucmp8_compact(cba, 256); + } + + umtx_lock(NULL); + if (CASE_EQUIV_CBA == NULL) { + CASE_EQUIV_CBA = cba; + cba = NULL; + ucln_common_registerCleanup(UCLN_COMMON_USET, uset_cleanup); + } + umtx_unlock(NULL); + if (cba != NULL) { + ucmp8_close(cba); + } + } + + if (CASE_EQUIV_CBA != NULL) { + int32_t index = ucmp8_getu(CASE_EQUIV_CBA, folded); + if (index != 255) { + return &CASE_NONPAIRS[index]; + } + } + return NULL; +} + +U_NAMESPACE_END diff --git a/icuSources/common/unistr.cpp b/icuSources/common/unistr.cpp index 5fc4d446..640ef899 100644 --- a/icuSources/common/unistr.cpp +++ b/icuSources/common/unistr.cpp @@ -1,6 +1,6 @@ /* ****************************************************************************** -* Copyright (C) 1999-2003, International Business Machines Corporation and * +* Copyright (C) 1999-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ****************************************************************************** * @@ -20,17 +20,12 @@ #include "unicode/utypes.h" #include "unicode/putil.h" -#include "unicode/locid.h" #include "cstring.h" #include "cmemory.h" #include "unicode/ustring.h" #include "unicode/unistr.h" -#include "unicode/uchar.h" -#include "unicode/ucnv.h" -#include "unicode/ubrk.h" #include "uhash.h" #include "ustr_imp.h" -#include "unormimp.h" #include "umutex.h" #if 0 @@ -101,7 +96,20 @@ U_CDECL_END U_NAMESPACE_BEGIN -const char UnicodeString::fgClassID=0; +/* The Replaceable virtual destructor can't be defined in the header + due to how AIX works with multiple definitions of virtual functions. +*/ +Replaceable::~Replaceable() {} +Replaceable::Replaceable() {} +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(UnicodeString) + +UnicodeString U_EXPORT2 +operator+ (const UnicodeString &s1, const UnicodeString &s2) { + return + UnicodeString(s1.length()+s2.length()+1, (UChar32)0, 0). + append(s1). + append(s2); +} //======================================== // Reference Counting functions, put at top of file so that optimizing compilers @@ -272,7 +280,7 @@ UnicodeString::UnicodeString(UChar *buff, fCapacity = US_STACKBUF_SIZE; fArray = fStackBuffer; fFlags = kShortString; - } else if(buffLength < -1 || buffLength > buffCapacity) { + } else if(buffLength < -1 || buffCapacity < 0 || buffLength > buffCapacity) { setToBogus(); } else if(buffLength == -1) { // fLength = u_strlen(buff); but do not look beyond buffCapacity @@ -284,66 +292,22 @@ UnicodeString::UnicodeString(UChar *buff, } } -UnicodeString::UnicodeString(const char *codepageData, - const char *codepage) - : fLength(0), - fCapacity(US_STACKBUF_SIZE), - fArray(fStackBuffer), - fFlags(kShortString) -{ - if(codepageData != 0) { - doCodepageCreate(codepageData, (int32_t)uprv_strlen(codepageData), codepage); - } -} - - -UnicodeString::UnicodeString(const char *codepageData, - int32_t dataLength, - const char *codepage) +UnicodeString::UnicodeString(const char *src, int32_t length, EInvariant) : fLength(0), fCapacity(US_STACKBUF_SIZE), fArray(fStackBuffer), fFlags(kShortString) { - if(codepageData != 0) { - doCodepageCreate(codepageData, dataLength, codepage); - } -} - -UnicodeString::UnicodeString(const char *src, int32_t srcLength, - UConverter *cnv, - UErrorCode &errorCode) - : fLength(0), - fCapacity(US_STACKBUF_SIZE), - fArray(fStackBuffer), - fFlags(kShortString) -{ - if(U_SUCCESS(errorCode)) { - // check arguments - if(src==NULL) { - // treat as an empty string, do nothing more - } else if(srcLength<-1) { - errorCode=U_ILLEGAL_ARGUMENT_ERROR; - } else { - // get input length - if(srcLength==-1) { - srcLength=(int32_t)uprv_strlen(src); - } - if(srcLength>0) { - if(cnv!=0) { - // use the provided converter - ucnv_resetToUnicode(cnv); - doCodepageCreate(src, srcLength, cnv, errorCode); - } else { - // use the default converter - cnv=u_getDefaultConverter(&errorCode); - doCodepageCreate(src, srcLength, cnv, errorCode); - u_releaseDefaultConverter(cnv); - } - } + if(src==NULL) { + // treat as an empty string + } else { + if(length<0) { + length=uprv_strlen(src); } - - if(U_FAILURE(errorCode)) { + if(cloneArrayIfNeeded(length, length, FALSE)) { + u_charsToUChars(src, getArrayStart(), length); + fLength = length; + } else { setToBogus(); } } @@ -661,52 +625,6 @@ UnicodeString::doCompareCodePointOrder(int32_t start, } } -int8_t -UnicodeString::doCaseCompare(int32_t start, - int32_t length, - const UChar *srcChars, - int32_t srcStart, - int32_t srcLength, - uint32_t options) const -{ - // compare illegal string values - // treat const UChar *srcChars==NULL as an empty string - if(isBogus()) { - return -1; - } - - // pin indices to legal values - pinIndices(start, length); - - if(srcChars == NULL) { - srcStart = srcLength = 0; - } - - // get the correct pointer - const UChar *chars = getArrayStart(); - - chars += start; - srcChars += srcStart; - - if(chars != srcChars) { - UErrorCode errorCode=U_ZERO_ERROR; - int32_t result=unorm_cmpEquivFold(chars, length, srcChars, srcLength, - options|U_COMPARE_IGNORE_CASE, &errorCode); - if(result!=0) { - return (int8_t)(result >> 24 | 1); - } - } else { - // get the srcLength if necessary - if(srcLength < 0) { - srcLength = u_strlen(srcChars + srcStart); - } - if(length != srcLength) { - return (int8_t)((length - srcLength) >> 24 | 1); - } - } - return 0; -} - int32_t UnicodeString::getLength() const { return length(); @@ -786,6 +704,37 @@ UnicodeString::extract(UChar *dest, int32_t destCapacity, return fLength; } +int32_t +UnicodeString::extract(int32_t start, + int32_t length, + char *target, + int32_t targetCapacity, + enum EInvariant) const +{ + // if the arguments are illegal, then do nothing + if(targetCapacity < 0 || (targetCapacity > 0 && target == NULL)) { + return 0; + } + + // pin the indices to legal values + pinIndices(start, length); + + if(length <= targetCapacity) { + u_UCharsToChars(getArrayStart() + start, target, length); + } + UErrorCode status = U_ZERO_ERROR; + return u_terminateChars(target, targetCapacity, length, &status); +} + +void +UnicodeString::extractBetween(int32_t start, + int32_t limit, + UnicodeString& target) const { + pinIndex(start); + pinIndex(limit); + doExtract(start, limit - start, target); +} + int32_t UnicodeString::indexOf(const UChar *srcChars, int32_t srcStart, @@ -1041,9 +990,16 @@ UnicodeString::setTo(UChar *buffer, return *this; } - if(buffLength < 0 || buffLength > buffCapacity) { + if(buffLength < -1 || buffCapacity < 0 || buffLength > buffCapacity) { setToBogus(); return *this; + } else if(buffLength == -1) { + // buffLength = u_strlen(buff); but do not look beyond buffCapacity + const UChar *p = buffer, *limit = buffer + buffCapacity; + while(p != limit && *p != 0) { + ++p; + } + buffLength = (int32_t)(p - buffer); } releaseArray(); @@ -1071,156 +1027,6 @@ UnicodeString::setCharAt(int32_t offset, return *this; } -/* - * Implement argument checking and buffer handling - * for string case mapping as a common function. - */ -enum { - TO_LOWER, - TO_UPPER, - TO_TITLE, - FOLD_CASE -}; - -UnicodeString & -UnicodeString::toLower() { - return caseMap(0, Locale::getDefault(), 0, TO_LOWER); -} - -UnicodeString & -UnicodeString::toLower(const Locale &locale) { - return caseMap(0, locale, 0, TO_LOWER); -} - -UnicodeString & -UnicodeString::toUpper() { - return caseMap(0, Locale::getDefault(), 0, TO_UPPER); -} - -UnicodeString & -UnicodeString::toUpper(const Locale &locale) { - return caseMap(0, locale, 0, TO_UPPER); -} - -#if !UCONFIG_NO_BREAK_ITERATION - -UnicodeString & -UnicodeString::toTitle(BreakIterator *titleIter) { - return caseMap(titleIter, Locale::getDefault(), 0, TO_TITLE); -} - -UnicodeString & -UnicodeString::toTitle(BreakIterator *titleIter, const Locale &locale) { - return caseMap(titleIter, locale, 0, TO_TITLE); -} - -#endif - -UnicodeString & -UnicodeString::foldCase(uint32_t options) { - return caseMap(0, Locale::getDefault(), options, FOLD_CASE); -} - -UnicodeString & -UnicodeString::caseMap(BreakIterator *titleIter, - const Locale& locale, - uint32_t options, - int32_t toWhichCase) { - if(fLength <= 0) { - // nothing to do - return *this; - } - - // We need to allocate a new buffer for the internal string case mapping function. - // This is very similar to how doReplace() below keeps the old array pointer - // and deletes the old array itself after it is done. - // In addition, we are forcing cloneArrayIfNeeded() to always allocate a new array. - UChar *oldArray = fArray; - int32_t oldLength = fLength; - int32_t *bufferToDelete = 0; - - // Make sure that if the string is in fStackBuffer we do not overwrite it! - int32_t capacity; - if(fLength <= US_STACKBUF_SIZE) { - if(fArray == fStackBuffer) { - capacity = 2 * US_STACKBUF_SIZE; // make sure that cloneArrayIfNeeded() allocates a new buffer - } else { - capacity = US_STACKBUF_SIZE; - } - } else { - capacity = fLength + 20; - } - if(!cloneArrayIfNeeded(capacity, capacity, FALSE, &bufferToDelete, TRUE)) { - return *this; - } - - UErrorCode errorCode; - -#if !UCONFIG_NO_BREAK_ITERATION - // set up the titlecasing break iterator - UBreakIterator *cTitleIter = 0; - - if(toWhichCase == TO_TITLE) { - if(titleIter != 0) { - cTitleIter = (UBreakIterator *)titleIter; - } else { - errorCode = U_ZERO_ERROR; - cTitleIter = ubrk_open(UBRK_WORD, locale.getName(), - oldArray, oldLength, - &errorCode); - if(U_FAILURE(errorCode)) { - uprv_free(bufferToDelete); - setToBogus(); - return *this; - } - } - } -#endif - - // Case-map, and if the result is too long, then reallocate and repeat. - do { - errorCode = U_ZERO_ERROR; - if(toWhichCase==TO_LOWER) { - fLength = u_internalStrToLower(fArray, fCapacity, - oldArray, oldLength, - 0, oldLength, - locale.getName(), - &errorCode); - } else if(toWhichCase==TO_UPPER) { - fLength = u_internalStrToUpper(fArray, fCapacity, - oldArray, oldLength, - locale.getName(), - &errorCode); -#if !UCONFIG_NO_BREAK_ITERATION - } else if(toWhichCase==TO_TITLE) { - fLength = u_internalStrToTitle(fArray, fCapacity, - oldArray, oldLength, - cTitleIter, locale.getName(), - &errorCode); -#endif - } else { - fLength = u_internalStrFoldCase(fArray, fCapacity, - oldArray, oldLength, - options, - &errorCode); - } - } while(errorCode==U_BUFFER_OVERFLOW_ERROR && cloneArrayIfNeeded(fLength, fLength, FALSE)); - -#if !UCONFIG_NO_BREAK_ITERATION - if(cTitleIter != 0 && titleIter == 0) { - ubrk_close(cTitleIter); - } -#endif - - if (bufferToDelete) { - uprv_free(bufferToDelete); - } - if(U_FAILURE(errorCode)) { - setToBogus(); - } - return *this; -} - UnicodeString& UnicodeString::doReplace( int32_t start, int32_t length, @@ -1427,53 +1233,6 @@ UnicodeString::padTrailing(int32_t targetLength, } } -UnicodeString& -UnicodeString::trim() -{ - if(isBogus()) { - return *this; - } - - UChar32 c; - int32_t i = fLength, length; - - // first cut off trailing white space - for(;;) { - length = i; - if(i <= 0) { - break; - } - UTF_PREV_CHAR(fArray, 0, i, c); - if(!(c == 0x20 || u_isWhitespace(c))) { - break; - } - } - if(length < fLength) { - fLength = length; - } - - // find leading white space - int32_t start; - i = 0; - for(;;) { - start = i; - if(i >= length) { - break; - } - UTF_NEXT_CHAR(fArray, i, length, c); - if(!(c == 0x20 || u_isWhitespace(c))) { - break; - } - } - - // move string forward over leading white space - if(start > 0) { - doReplace(0, start, 0, 0, 0); - } - - return *this; -} - //======================================== // Hashing //======================================== @@ -1489,272 +1248,6 @@ UnicodeString::doHashCode() const return hashCode; } -//======================================== -// Codeset conversion -//======================================== -int32_t -UnicodeString::extract(int32_t start, - int32_t length, - char *target, - uint32_t dstSize, - const char *codepage) const -{ - // if the arguments are illegal, then do nothing - if(/*dstSize < 0 || */(dstSize > 0 && target == 0)) { - return 0; - } - - // pin the indices to legal values - pinIndices(start, length); - - // create the converter - UConverter *converter; - UErrorCode status = U_ZERO_ERROR; - - // just write the NUL if the string length is 0 - if(length == 0) { - if(dstSize >= 0x80000000) { - // careful: dstSize is unsigned! (0xffffffff means "unlimited") - // make sure that the NUL-termination works (takes int32_t) - dstSize=0x7fffffff; - } - return u_terminateChars(target, dstSize, 0, &status); - } - - // if the codepage is the default, use our cache - // if it is an empty string, then use the "invariant character" conversion - if (codepage == 0) { - converter = u_getDefaultConverter(&status); - } else if (*codepage == 0) { - // use the "invariant characters" conversion - int32_t destLength; - // careful: dstSize is unsigned! (0xffffffff means "unlimited") - if(dstSize >= 0x80000000) { - destLength = length; - // make sure that the NUL-termination works (takes int32_t) - dstSize=0x7fffffff; - } else if(length <= (int32_t)dstSize) { - destLength = length; - } else { - destLength = (int32_t)dstSize; - } - u_UCharsToChars(getArrayStart() + start, target, destLength); - return u_terminateChars(target, (int32_t)dstSize, length, &status); - } else { - converter = ucnv_open(codepage, &status); - } - - length = doExtract(start, length, target, (int32_t)dstSize, converter, status); - - // close the converter - if (codepage == 0) { - u_releaseDefaultConverter(converter); - } else { - ucnv_close(converter); - } - - return length; -} - -int32_t -UnicodeString::extract(char *dest, int32_t destCapacity, - UConverter *cnv, - UErrorCode &errorCode) const { - if(U_FAILURE(errorCode)) { - return 0; - } - - if(isBogus() || destCapacity<0 || (destCapacity>0 && dest==0)) { - errorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - // nothing to do? - if(fLength<=0) { - return u_terminateChars(dest, destCapacity, 0, &errorCode); - } - - // get the converter - UBool isDefaultConverter; - if(cnv==0) { - isDefaultConverter=TRUE; - cnv=u_getDefaultConverter(&errorCode); - if(U_FAILURE(errorCode)) { - return 0; - } - } else { - isDefaultConverter=FALSE; - ucnv_resetFromUnicode(cnv); - } - - // convert - int32_t length=doExtract(0, fLength, dest, destCapacity, cnv, errorCode); - - // release the converter - if(isDefaultConverter) { - u_releaseDefaultConverter(cnv); - } - - return length; -} - -void -UnicodeString::extractBetween(int32_t start, - int32_t limit, - UnicodeString& target) const -{ doExtract(start, limit - start, target); } - -int32_t -UnicodeString::doExtract(int32_t start, int32_t length, - char *dest, int32_t destCapacity, - UConverter *cnv, - UErrorCode &errorCode) const { - if(U_FAILURE(errorCode)) { - if(destCapacity!=0) { - *dest=0; - } - return 0; - } - - const UChar *src=fArray+start, *srcLimit=src+length; - char *originalDest=dest; - const char *destLimit; - - if(destCapacity==0) { - destLimit=dest=0; - } else if(destCapacity==-1) { - // Pin the limit to U_MAX_PTR if the "magic" destCapacity is used. - destLimit=(char*)U_MAX_PTR(dest); - // for NUL-termination, translate into highest int32_t - destCapacity=0x7fffffff; - } else { - destLimit=dest+destCapacity; - } - - // perform the conversion - ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, 0, TRUE, &errorCode); - length=(int32_t)(dest-originalDest); - - // if an overflow occurs, then get the preflighting length - if(errorCode==U_BUFFER_OVERFLOW_ERROR) { - char buffer[1024]; - - destLimit=buffer+sizeof(buffer); - do { - dest=buffer; - errorCode=U_ZERO_ERROR; - ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, 0, TRUE, &errorCode); - length+=(int32_t)(dest-buffer); - } while(errorCode==U_BUFFER_OVERFLOW_ERROR); - } - - return u_terminateChars(originalDest, destCapacity, length, &errorCode); -} - -void -UnicodeString::doCodepageCreate(const char *codepageData, - int32_t dataLength, - const char *codepage) -{ - // if there's nothing to convert, do nothing - if(codepageData == 0 || dataLength <= 0) { - return; - } - - UErrorCode status = U_ZERO_ERROR; - - // create the converter - // if the codepage is the default, use our cache - // if it is an empty string, then use the "invariant character" conversion - UConverter *converter = (codepage == 0 ? - u_getDefaultConverter(&status) : - *codepage == 0 ? - 0 : - ucnv_open(codepage, &status)); - - // if we failed, set the appropriate flags and return - if(U_FAILURE(status)) { - setToBogus(); - return; - } - - // perform the conversion - if(converter == 0) { - // use the "invariant characters" conversion - if(cloneArrayIfNeeded(dataLength, dataLength, FALSE)) { - u_charsToUChars(codepageData, getArrayStart(), dataLength); - fLength = dataLength; - } else { - setToBogus(); - } - return; - } - - // convert using the real converter - doCodepageCreate(codepageData, dataLength, converter, status); - if(U_FAILURE(status)) { - setToBogus(); - } - - // close the converter - if(codepage == 0) { - u_releaseDefaultConverter(converter); - } else { - ucnv_close(converter); - } -} - -void -UnicodeString::doCodepageCreate(const char *codepageData, - int32_t dataLength, - UConverter *converter, - UErrorCode &status) { - if(U_FAILURE(status)) { - return; - } - - // set up the conversion parameters - const char *mySource = codepageData; - const char *mySourceEnd = mySource + dataLength; - UChar *myTarget; - - // estimate the size needed: - // 1.25 UChar's per source byte should cover most cases - int32_t arraySize = dataLength + (dataLength >> 2); - - // we do not care about the current contents - UBool doCopyArray = FALSE; - for(;;) { - if(!cloneArrayIfNeeded(arraySize, arraySize, doCopyArray)) { - setToBogus(); - break; - } - - // perform the conversion - myTarget = fArray + fLength; - ucnv_toUnicode(converter, &myTarget, fArray + fCapacity, - &mySource, mySourceEnd, 0, TRUE, &status); - - // update the conversion parameters - fLength = (int32_t)(myTarget - fArray); - - // allocate more space and copy data, if needed - if(status == U_BUFFER_OVERFLOW_ERROR) { - // reset the error code - status = U_ZERO_ERROR; - - // keep the previous conversion results - doCopyArray = TRUE; - - // estimate the new size needed, larger than before - // try 2 UChar's per remaining source byte - arraySize = (int32_t)(fLength + 2 * (mySourceEnd - mySource)); - } else { - break; - } - } -} - //======================================== // External Buffer //======================================== diff --git a/icuSources/common/unistr_case.cpp b/icuSources/common/unistr_case.cpp new file mode 100644 index 00000000..dd4a0819 --- /dev/null +++ b/icuSources/common/unistr_case.cpp @@ -0,0 +1,244 @@ +/* +******************************************************************************* +* +* Copyright (C) 1999-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: unistr_case.cpp +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:2 +* +* created on: 2004aug19 +* created by: Markus W. Scherer +* +* Case-mapping functions moved here from unistr.cpp +*/ + +#include "unicode/utypes.h" +#include "unicode/putil.h" +#include "unicode/locid.h" +#include "cstring.h" +#include "cmemory.h" +#include "unicode/ustring.h" +#include "unicode/unistr.h" +#include "unicode/uchar.h" +#include "unicode/ubrk.h" +#include "ustr_imp.h" +#include "unormimp.h" + +U_NAMESPACE_BEGIN + +//======================================== +// Read-only implementation +//======================================== + +int8_t +UnicodeString::doCaseCompare(int32_t start, + int32_t length, + const UChar *srcChars, + int32_t srcStart, + int32_t srcLength, + uint32_t options) const +{ + // compare illegal string values + // treat const UChar *srcChars==NULL as an empty string + if(isBogus()) { + return -1; + } + + // pin indices to legal values + pinIndices(start, length); + + if(srcChars == NULL) { + srcStart = srcLength = 0; + } + + // get the correct pointer + const UChar *chars = getArrayStart(); + + chars += start; + srcChars += srcStart; + + if(chars != srcChars) { + UErrorCode errorCode=U_ZERO_ERROR; + int32_t result=u_strcmpFold(chars, length, srcChars, srcLength, + options|U_COMPARE_IGNORE_CASE, &errorCode); + if(result!=0) { + return (int8_t)(result >> 24 | 1); + } + } else { + // get the srcLength if necessary + if(srcLength < 0) { + srcLength = u_strlen(srcChars + srcStart); + } + if(length != srcLength) { + return (int8_t)((length - srcLength) >> 24 | 1); + } + } + return 0; +} + +//======================================== +// Write implementation +//======================================== + +/* + * Implement argument checking and buffer handling + * for string case mapping as a common function. + */ +enum { + TO_LOWER, + TO_UPPER, + TO_TITLE, + FOLD_CASE +}; + +UnicodeString & +UnicodeString::caseMap(BreakIterator *titleIter, + const char *locale, + uint32_t options, + int32_t toWhichCase) { + if(fLength <= 0) { + // nothing to do + return *this; + } + + UErrorCode errorCode; + + errorCode = U_ZERO_ERROR; + UCaseProps *csp=ucase_getSingleton(&errorCode); + if(U_FAILURE(errorCode)) { + setToBogus(); + return *this; + } + + // We need to allocate a new buffer for the internal string case mapping function. + // This is very similar to how doReplace() below keeps the old array pointer + // and deletes the old array itself after it is done. + // In addition, we are forcing cloneArrayIfNeeded() to always allocate a new array. + UChar *oldArray = fArray; + int32_t oldLength = fLength; + int32_t *bufferToDelete = 0; + + // Make sure that if the string is in fStackBuffer we do not overwrite it! + int32_t capacity; + if(fLength <= US_STACKBUF_SIZE) { + if(fArray == fStackBuffer) { + capacity = 2 * US_STACKBUF_SIZE; // make sure that cloneArrayIfNeeded() allocates a new buffer + } else { + capacity = US_STACKBUF_SIZE; + } + } else { + capacity = fLength + 20; + } + if(!cloneArrayIfNeeded(capacity, capacity, FALSE, &bufferToDelete, TRUE)) { + return *this; + } + +#if !UCONFIG_NO_BREAK_ITERATION + // set up the titlecasing break iterator + UBreakIterator *cTitleIter = 0; + + if(toWhichCase == TO_TITLE) { + errorCode = U_ZERO_ERROR; + if(titleIter != 0) { + cTitleIter = (UBreakIterator *)titleIter; + ubrk_setText(cTitleIter, oldArray, oldLength, &errorCode); + } else { + cTitleIter = ubrk_open(UBRK_WORD, locale, + oldArray, oldLength, + &errorCode); + } + if(U_FAILURE(errorCode)) { + uprv_free(bufferToDelete); + setToBogus(); + return *this; + } + } +#endif + + // Case-map, and if the result is too long, then reallocate and repeat. + do { + errorCode = U_ZERO_ERROR; + if(toWhichCase==TO_LOWER) { + fLength = ustr_toLower(csp, fArray, fCapacity, + oldArray, oldLength, + locale, &errorCode); + } else if(toWhichCase==TO_UPPER) { + fLength = ustr_toUpper(csp, fArray, fCapacity, + oldArray, oldLength, + locale, &errorCode); + } else if(toWhichCase==TO_TITLE) { +#if UCONFIG_NO_BREAK_ITERATION + errorCode=U_UNSUPPORTED_ERROR; +#else + fLength = ustr_toTitle(csp, fArray, fCapacity, + oldArray, oldLength, + cTitleIter, locale, &errorCode); +#endif + } else { + fLength = ustr_foldCase(csp, fArray, fCapacity, + oldArray, oldLength, + options, + &errorCode); + } + } while(errorCode==U_BUFFER_OVERFLOW_ERROR && cloneArrayIfNeeded(fLength, fLength, FALSE)); + +#if !UCONFIG_NO_BREAK_ITERATION + if(cTitleIter != 0 && titleIter == 0) { + ubrk_close(cTitleIter); + } +#endif + + if (bufferToDelete) { + uprv_free(bufferToDelete); + } + if(U_FAILURE(errorCode)) { + setToBogus(); + } + return *this; +} + +UnicodeString & +UnicodeString::toLower() { + return caseMap(0, Locale::getDefault().getName(), 0, TO_LOWER); +} + +UnicodeString & +UnicodeString::toLower(const Locale &locale) { + return caseMap(0, locale.getName(), 0, TO_LOWER); +} + +UnicodeString & +UnicodeString::toUpper() { + return caseMap(0, Locale::getDefault().getName(), 0, TO_UPPER); +} + +UnicodeString & +UnicodeString::toUpper(const Locale &locale) { + return caseMap(0, locale.getName(), 0, TO_UPPER); +} + +#if !UCONFIG_NO_BREAK_ITERATION + +UnicodeString & +UnicodeString::toTitle(BreakIterator *titleIter) { + return caseMap(titleIter, Locale::getDefault().getName(), 0, TO_TITLE); +} + +UnicodeString & +UnicodeString::toTitle(BreakIterator *titleIter, const Locale &locale) { + return caseMap(titleIter, locale.getName(), 0, TO_TITLE); +} + +#endif + +UnicodeString & +UnicodeString::foldCase(uint32_t options) { + /* The Locale parameter isn't used. Use "" instead. */ + return caseMap(0, "", options, FOLD_CASE); +} + +U_NAMESPACE_END diff --git a/icuSources/common/unistr_cnv.cpp b/icuSources/common/unistr_cnv.cpp new file mode 100644 index 00000000..f5defc66 --- /dev/null +++ b/icuSources/common/unistr_cnv.cpp @@ -0,0 +1,369 @@ +/* +******************************************************************************* +* +* Copyright (C) 1999-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: unistr_cnv.cpp +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:2 +* +* created on: 2004aug19 +* created by: Markus W. Scherer +* +* Character conversion functions moved here from unistr.cpp +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + +#include "unicode/putil.h" +#include "cstring.h" +#include "cmemory.h" +#include "unicode/ustring.h" +#include "unicode/unistr.h" +#include "unicode/ucnv.h" +#include "putilimp.h" +#include "ustr_cnv.h" +#include "ustr_imp.h" + +U_NAMESPACE_BEGIN + +//======================================== +// Constructors +//======================================== + +UnicodeString::UnicodeString(const char *codepageData, + const char *codepage) + : fLength(0), + fCapacity(US_STACKBUF_SIZE), + fArray(fStackBuffer), + fFlags(kShortString) +{ + if(codepageData != 0) { + doCodepageCreate(codepageData, (int32_t)uprv_strlen(codepageData), codepage); + } +} + + +UnicodeString::UnicodeString(const char *codepageData, + int32_t dataLength, + const char *codepage) + : fLength(0), + fCapacity(US_STACKBUF_SIZE), + fArray(fStackBuffer), + fFlags(kShortString) +{ + if(codepageData != 0) { + doCodepageCreate(codepageData, dataLength, codepage); + } +} + +UnicodeString::UnicodeString(const char *src, int32_t srcLength, + UConverter *cnv, + UErrorCode &errorCode) + : fLength(0), + fCapacity(US_STACKBUF_SIZE), + fArray(fStackBuffer), + fFlags(kShortString) +{ + if(U_SUCCESS(errorCode)) { + // check arguments + if(src==NULL) { + // treat as an empty string, do nothing more + } else if(srcLength<-1) { + errorCode=U_ILLEGAL_ARGUMENT_ERROR; + } else { + // get input length + if(srcLength==-1) { + srcLength=(int32_t)uprv_strlen(src); + } + if(srcLength>0) { + if(cnv!=0) { + // use the provided converter + ucnv_resetToUnicode(cnv); + doCodepageCreate(src, srcLength, cnv, errorCode); + } else { + // use the default converter + cnv=u_getDefaultConverter(&errorCode); + doCodepageCreate(src, srcLength, cnv, errorCode); + u_releaseDefaultConverter(cnv); + } + } + } + + if(U_FAILURE(errorCode)) { + setToBogus(); + } + } +} + +//======================================== +// Codeset conversion +//======================================== +int32_t +UnicodeString::extract(int32_t start, + int32_t length, + char *target, + uint32_t dstSize, + const char *codepage) const +{ + // if the arguments are illegal, then do nothing + if(/*dstSize < 0 || */(dstSize > 0 && target == 0)) { + return 0; + } + + // pin the indices to legal values + pinIndices(start, length); + + // create the converter + UConverter *converter; + UErrorCode status = U_ZERO_ERROR; + + // just write the NUL if the string length is 0 + if(length == 0) { + if(dstSize >= 0x80000000) { + // careful: dstSize is unsigned! (0xffffffff means "unlimited") + // make sure that the NUL-termination works (takes int32_t) + dstSize=0x7fffffff; + } + return u_terminateChars(target, dstSize, 0, &status); + } + + // if the codepage is the default, use our cache + // if it is an empty string, then use the "invariant character" conversion + if (codepage == 0) { + converter = u_getDefaultConverter(&status); + } else if (*codepage == 0) { + // use the "invariant characters" conversion + int32_t destLength; + // careful: dstSize is unsigned! (0xffffffff means "unlimited") + if(dstSize >= 0x80000000) { + destLength = length; + // make sure that the NUL-termination works (takes int32_t) + dstSize=0x7fffffff; + } else if(length <= (int32_t)dstSize) { + destLength = length; + } else { + destLength = (int32_t)dstSize; + } + u_UCharsToChars(getArrayStart() + start, target, destLength); + return u_terminateChars(target, (int32_t)dstSize, length, &status); + } else { + converter = ucnv_open(codepage, &status); + } + + length = doExtract(start, length, target, (int32_t)dstSize, converter, status); + + // close the converter + if (codepage == 0) { + u_releaseDefaultConverter(converter); + } else { + ucnv_close(converter); + } + + return length; +} + +int32_t +UnicodeString::extract(char *dest, int32_t destCapacity, + UConverter *cnv, + UErrorCode &errorCode) const { + if(U_FAILURE(errorCode)) { + return 0; + } + + if(isBogus() || destCapacity<0 || (destCapacity>0 && dest==0)) { + errorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + // nothing to do? + if(fLength<=0) { + return u_terminateChars(dest, destCapacity, 0, &errorCode); + } + + // get the converter + UBool isDefaultConverter; + if(cnv==0) { + isDefaultConverter=TRUE; + cnv=u_getDefaultConverter(&errorCode); + if(U_FAILURE(errorCode)) { + return 0; + } + } else { + isDefaultConverter=FALSE; + ucnv_resetFromUnicode(cnv); + } + + // convert + int32_t length=doExtract(0, fLength, dest, destCapacity, cnv, errorCode); + + // release the converter + if(isDefaultConverter) { + u_releaseDefaultConverter(cnv); + } + + return length; +} + +int32_t +UnicodeString::doExtract(int32_t start, int32_t length, + char *dest, int32_t destCapacity, + UConverter *cnv, + UErrorCode &errorCode) const { + if(U_FAILURE(errorCode)) { + if(destCapacity!=0) { + *dest=0; + } + return 0; + } + + const UChar *src=fArray+start, *srcLimit=src+length; + char *originalDest=dest; + const char *destLimit; + + if(destCapacity==0) { + destLimit=dest=0; + } else if(destCapacity==-1) { + // Pin the limit to U_MAX_PTR if the "magic" destCapacity is used. + destLimit=(char*)U_MAX_PTR(dest); + // for NUL-termination, translate into highest int32_t + destCapacity=0x7fffffff; + } else { + destLimit=dest+destCapacity; + } + + // perform the conversion + ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, 0, TRUE, &errorCode); + length=(int32_t)(dest-originalDest); + + // if an overflow occurs, then get the preflighting length + if(errorCode==U_BUFFER_OVERFLOW_ERROR) { + char buffer[1024]; + + destLimit=buffer+sizeof(buffer); + do { + dest=buffer; + errorCode=U_ZERO_ERROR; + ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, 0, TRUE, &errorCode); + length+=(int32_t)(dest-buffer); + } while(errorCode==U_BUFFER_OVERFLOW_ERROR); + } + + return u_terminateChars(originalDest, destCapacity, length, &errorCode); +} + +void +UnicodeString::doCodepageCreate(const char *codepageData, + int32_t dataLength, + const char *codepage) +{ + // if there's nothing to convert, do nothing + if(codepageData == 0 || dataLength == 0 || dataLength < -1) { + return; + } + if(dataLength == -1) { + dataLength = uprv_strlen(codepageData); + } + + UErrorCode status = U_ZERO_ERROR; + + // create the converter + // if the codepage is the default, use our cache + // if it is an empty string, then use the "invariant character" conversion + UConverter *converter = (codepage == 0 ? + u_getDefaultConverter(&status) : + *codepage == 0 ? + 0 : + ucnv_open(codepage, &status)); + + // if we failed, set the appropriate flags and return + if(U_FAILURE(status)) { + setToBogus(); + return; + } + + // perform the conversion + if(converter == 0) { + // use the "invariant characters" conversion + if(cloneArrayIfNeeded(dataLength, dataLength, FALSE)) { + u_charsToUChars(codepageData, getArrayStart(), dataLength); + fLength = dataLength; + } else { + setToBogus(); + } + return; + } + + // convert using the real converter + doCodepageCreate(codepageData, dataLength, converter, status); + if(U_FAILURE(status)) { + setToBogus(); + } + + // close the converter + if(codepage == 0) { + u_releaseDefaultConverter(converter); + } else { + ucnv_close(converter); + } +} + +void +UnicodeString::doCodepageCreate(const char *codepageData, + int32_t dataLength, + UConverter *converter, + UErrorCode &status) { + if(U_FAILURE(status)) { + return; + } + + // set up the conversion parameters + const char *mySource = codepageData; + const char *mySourceEnd = mySource + dataLength; + UChar *myTarget; + + // estimate the size needed: + // 1.25 UChar's per source byte should cover most cases + int32_t arraySize = dataLength + (dataLength >> 2); + + // we do not care about the current contents + UBool doCopyArray = FALSE; + for(;;) { + if(!cloneArrayIfNeeded(arraySize, arraySize, doCopyArray)) { + setToBogus(); + break; + } + + // perform the conversion + myTarget = fArray + fLength; + ucnv_toUnicode(converter, &myTarget, fArray + fCapacity, + &mySource, mySourceEnd, 0, TRUE, &status); + + // update the conversion parameters + fLength = (int32_t)(myTarget - fArray); + + // allocate more space and copy data, if needed + if(status == U_BUFFER_OVERFLOW_ERROR) { + // reset the error code + status = U_ZERO_ERROR; + + // keep the previous conversion results + doCopyArray = TRUE; + + // estimate the new size needed, larger than before + // try 2 UChar's per remaining source byte + arraySize = (int32_t)(fLength + 2 * (mySourceEnd - mySource)); + } else { + break; + } + } +} + +U_NAMESPACE_END + +#endif diff --git a/icuSources/common/unistr_props.cpp b/icuSources/common/unistr_props.cpp new file mode 100644 index 00000000..ffd747d5 --- /dev/null +++ b/icuSources/common/unistr_props.cpp @@ -0,0 +1,68 @@ +/* +******************************************************************************* +* +* Copyright (C) 1999-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: unistr_props.cpp +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:2 +* +* created on: 2004aug25 +* created by: Markus W. Scherer +* +* Character property dependent functions moved here from unistr.cpp +*/ + +#include "unicode/utypes.h" +#include "unicode/uchar.h" +#include "unicode/unistr.h" + +UnicodeString& +UnicodeString::trim() +{ + if(isBogus()) { + return *this; + } + + UChar32 c; + int32_t i = fLength, length; + + // first cut off trailing white space + for(;;) { + length = i; + if(i <= 0) { + break; + } + UTF_PREV_CHAR(fArray, 0, i, c); + if(!(c == 0x20 || u_isWhitespace(c))) { + break; + } + } + if(length < fLength) { + fLength = length; + } + + // find leading white space + int32_t start; + i = 0; + for(;;) { + start = i; + if(i >= length) { + break; + } + UTF_NEXT_CHAR(fArray, i, length, c); + if(!(c == 0x20 || u_isWhitespace(c))) { + break; + } + } + + // move string forward over leading white space + if(start > 0) { + doReplace(0, start, 0, 0, 0); + } + + return *this; +} diff --git a/icuSources/common/unorm.cpp b/icuSources/common/unorm.cpp index c2e05253..fc9cfb0b 100644 --- a/icuSources/common/unorm.cpp +++ b/icuSources/common/unorm.cpp @@ -1,6 +1,6 @@ /* ****************************************************************************** -* Copyright (c) 1996-2003, International Business Machines +* Copyright (c) 1996-2004, International Business Machines * Corporation and others. All Rights Reserved. ****************************************************************************** * File unorm.cpp @@ -24,23 +24,24 @@ #include "unicode/utypes.h" -// moved up to make unorm_cmpEquivFold work without normalization -#include "unicode/ustring.h" -#include "unormimp.h" -#include "ustr_imp.h" - #if !UCONFIG_NO_NORMALIZATION #include "unicode/udata.h" #include "unicode/uchar.h" +#include "unicode/ustring.h" #include "unicode/uiter.h" #include "unicode/uniset.h" #include "unicode/usetiter.h" #include "unicode/unorm.h" +#include "ucln_cmn.h" +#include "unormimp.h" +#include "ucase.h" #include "cmemory.h" #include "umutex.h" #include "utrie.h" #include "unicode/uset.h" +#include "udataswp.h" +#include "putilimp.h" /* * Status of tailored normalization @@ -75,7 +76,7 @@ * except that this is not implemented for Jamo * - c is treated as having a combining class of 0 */ -#define LENGTHOF(array) (sizeof(array)/sizeof((array)[0])) +#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) /* * This new implementation of the normalization code loads its data from @@ -98,10 +99,22 @@ enum { */ enum { _NORM_OPTIONS_NX_MASK=0x1f, - _NORM_OPTIONS_UNICODE_MASK=0xe0, - _NORM_OPTIONS_SETS_MASK=0xff, + _NORM_OPTIONS_UNICODE_MASK=0x60, + _NORM_OPTIONS_SETS_MASK=0x7f, + + _NORM_OPTIONS_UNICODE_SHIFT=5, + + /* + * The following options are used only in some composition functions. + * They use bits 12 and up to preserve lower bits for the available options + * space in unorm_compare() - + * see documentation for UNORM_COMPARE_NORM_OPTIONS_SHIFT. + */ - _NORM_OPTIONS_UNICODE_SHIFT=5 + /** Options bit 12, for compatibility vs. canonical decomposition. */ + _NORM_OPTIONS_COMPAT=0x1000, + /** Options bit 13, no discontiguous composition (FCC vs. NFC). */ + _NORM_OPTIONS_COMPOSE_CONTIGUOUS=0x2000 }; static inline UBool @@ -148,23 +161,6 @@ isJamoVTNorm32JamoV(uint32_t norm32) { return norm32<_NORM_JAMO_V_TOP; } -/* some prototypes ---------------------------------------------------------- */ - -static const UChar * -_findPreviousStarter(const UChar *start, const UChar *src, - uint32_t ccOrQCMask, uint32_t decompQCMask, UChar minNoMaybe); - -static const UChar * -_findNextStarter(const UChar *src, const UChar *limit, - uint32_t qcMask, uint32_t decompQCMask, UChar minNoMaybe); - -static const UChar * -_composePart(UChar *stackBuffer, UChar *&buffer, int32_t &bufferCapacity, int32_t &length, - const UChar *prevStarter, const UChar *src, - uint32_t qcMask, uint8_t &prevCC, - const UnicodeSet *nx, - UErrorCode *pErrorCode); - /* load unorm.dat ----------------------------------------------------------- */ #define DATA_NAME "unorm" @@ -195,7 +191,7 @@ static UnicodeSet *nxCache[_NORM_OPTIONS_SETS_MASK+1]={ NULL }; U_CDECL_BEGIN -UBool +static UBool U_CALLCONV unorm_cleanup() { int32_t i; @@ -266,7 +262,8 @@ isAcceptable(void * /* context */, static UBool U_CALLCONV _enumPropertyStartsRange(const void *context, UChar32 start, UChar32 /*limit*/, uint32_t /*value*/) { /* add the start code point to the USet */ - uset_add((USet *)context, start); + USetAdder *sa=(USetAdder *)context; + sa->add(sa->set, start); return TRUE; } @@ -341,7 +338,6 @@ loadNormData(UErrorCode &errorCode) { } else { p=(const int32_t *)udata_getMemory(normData); } - umtx_unlock(NULL); /* initialize some variables */ extraData=(uint16_t *)((uint8_t *)(p+_NORM_INDEX_TOP)+indexes[_NORM_INDEX_TRIE_SIZE]); @@ -354,6 +350,8 @@ loadNormData(UErrorCode &errorCode) { (indexes[_NORM_INDEX_FCD_TRIE_SIZE]+indexes[_NORM_INDEX_AUX_TRIE_SIZE])/2; } haveNormData=1; + ucln_common_registerCleanup(UCLN_COMMON_UNORM, unorm_cleanup); + umtx_unlock(NULL); /* if a different thread set it first, then close the extra data */ if(data!=NULL) { @@ -451,13 +449,9 @@ _getExtraData(uint32_t norm32) { static const UnicodeSet * internalGetNXHangul(UErrorCode &errorCode) { /* internal function, does not check for incoming U_FAILURE */ - UBool isCached; - /* do this because double-checked locking is broken */ - umtx_lock(NULL); - isCached=nxCache[UNORM_NX_HANGUL]!=NULL; - umtx_unlock(NULL); + UMTX_CHECK(NULL, (UBool)(nxCache[UNORM_NX_HANGUL]!=NULL), isCached); if(!isCached) { UnicodeSet *set=new UnicodeSet(0xac00, 0xd7a3); @@ -479,107 +473,47 @@ internalGetNXHangul(UErrorCode &errorCode) { return nxCache[UNORM_NX_HANGUL]; } +/* unorm.cpp 1.116 had and used static const UnicodeSet * -internalGetNXCJKCompat(UErrorCode &errorCode) { - /* internal function, does not check for incoming U_FAILURE */ - - UBool isCached; - - /* do this because double-checked locking is broken */ - umtx_lock(NULL); - isCached=nxCache[UNORM_NX_CJK_COMPAT]!=NULL; - umtx_unlock(NULL); - - if(!isCached) { - /* build a set from [CJK Ideographs]&[has canonical decomposition] */ - UnicodeSet *set, *hasDecomp; - - set=new UnicodeSet(UNICODE_STRING("[:Ideographic:]", 15), errorCode); - if(set==NULL) { - errorCode=U_MEMORY_ALLOCATION_ERROR; - return NULL; - } - if(U_FAILURE(errorCode)) { - delete set; - return NULL; - } - - /* start with an empty set for [has canonical decomposition] */ - hasDecomp=new UnicodeSet(); - if(hasDecomp==NULL) { - delete set; - errorCode=U_MEMORY_ALLOCATION_ERROR; - return NULL; - } - - /* iterate over all ideographs and remember which canonically decompose */ - UnicodeSetIterator it(*set); - UChar32 start, end; - uint32_t norm32; - - while(it.nextRange() && !it.isString()) { - start=it.getCodepoint(); - end=it.getCodepointEnd(); - while(start<=end) { - UTRIE_GET32(&normTrie, start, norm32); - if(norm32&_NORM_QC_NFD) { - hasDecomp->add(start); - } - ++start; - } - } - - /* hasDecomp now contains all ideographs that decompose canonically */ - - umtx_lock(NULL); - if(nxCache[UNORM_NX_CJK_COMPAT]==NULL) { - nxCache[UNORM_NX_CJK_COMPAT]=hasDecomp; - hasDecomp=NULL; - } - umtx_unlock(NULL); - - delete hasDecomp; - delete set; - } - - return nxCache[UNORM_NX_CJK_COMPAT]; +internalGetNXFromPattern(int32_t options, const char *pattern, UErrorCode &errorCode) { + ... } +*/ +/* get and set an exclusion set from a serialized UnicodeSet */ static const UnicodeSet * -internalGetNXUnicode(uint32_t options, UErrorCode &errorCode) { +internalGetSerializedNX(int32_t options, int32_t nxIndex, UErrorCode &errorCode) { /* internal function, does not check for incoming U_FAILURE */ - options&=_NORM_OPTIONS_UNICODE_MASK; - if(options==0) { - return NULL; - } - UBool isCached; - /* do this because double-checked locking is broken */ - umtx_lock(NULL); - isCached=nxCache[options]!=NULL; - umtx_unlock(NULL); + UMTX_CHECK(NULL, (UBool)(nxCache[options]!=NULL), isCached); - if(!isCached) { - /* build a set with all code points that were not designated by the specified Unicode version */ + if( !isCached && + canonStartSets!=NULL && + canonStartSets[nxIndex]!=0 && canonStartSets[nxIndex+1]>canonStartSets[nxIndex] + ) { + USerializedSet sset; UnicodeSet *set; + UChar32 start, end; + int32_t i; - switch(options) { - case UNORM_UNICODE_3_2: - set=new UnicodeSet(UNICODE_STRING("[:^Age=3.2:]", 12), errorCode); - break; - default: - errorCode=U_ILLEGAL_ARGUMENT_ERROR; + if( !uset_getSerializedSet( + &sset, + canonStartSets+canonStartSets[nxIndex], + canonStartSets[nxIndex+1]-canonStartSets[nxIndex]) + ) { + errorCode=U_INVALID_FORMAT_ERROR; return NULL; } + /* turn the serialized set into a UnicodeSet */ + set=new UnicodeSet(); if(set==NULL) { errorCode=U_MEMORY_ALLOCATION_ERROR; return NULL; } - if(U_FAILURE(errorCode)) { - delete set; - return NULL; + for(i=0; uset_getSerializedRange(&sset, i, &start, &end); ++i) { + set->add(start, end); } umtx_lock(NULL); @@ -595,6 +529,37 @@ internalGetNXUnicode(uint32_t options, UErrorCode &errorCode) { return nxCache[options]; } +static const UnicodeSet * +internalGetNXCJKCompat(UErrorCode &errorCode) { + /* build a set from [[:Ideographic:]&[:NFD_QC=No:]]=[CJK Ideographs]&[has canonical decomposition] */ + return internalGetSerializedNX( + UNORM_NX_CJK_COMPAT, + _NORM_SET_INDEX_NX_CJK_COMPAT_OFFSET, + errorCode); +} + +static const UnicodeSet * +internalGetNXUnicode(uint32_t options, UErrorCode &errorCode) { + /* internal function, does not check for incoming U_FAILURE */ + int32_t nxIndex; + + options&=_NORM_OPTIONS_UNICODE_MASK; + switch(options) { + case 0: + return NULL; + case UNORM_UNICODE_3_2: + /* [:^Age=3.2:] */ + nxIndex=_NORM_SET_INDEX_NX_UNICODE32_OFFSET; + break; + default: + errorCode=U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + + /* build a set with all code points that were not designated by the specified Unicode version */ + return internalGetSerializedNX(options, nxIndex, errorCode); +} + /* Get a decomposition exclusion set. The data must be loaded. */ static const UnicodeSet * internalGetNX(int32_t options, UErrorCode &errorCode) { @@ -602,10 +567,7 @@ internalGetNX(int32_t options, UErrorCode &errorCode) { UBool isCached; - /* do this because double-checked locking is broken */ - umtx_lock(NULL); - isCached=nxCache[options]!=NULL; - umtx_unlock(NULL); + UMTX_CHECK(NULL, (UBool)(nxCache[options]!=NULL), isCached); if(!isCached) { /* return basic sets */ @@ -667,6 +629,11 @@ getNX(int32_t options, UErrorCode &errorCode) { } } +U_CFUNC const UnicodeSet * +unorm_getNX(int32_t options, UErrorCode *pErrorCode) { + return getNX(options, *pErrorCode); +} + static inline UBool nx_contains(const UnicodeSet *nx, UChar32 c) { return nx!=NULL && nx->contains(c); @@ -735,10 +702,15 @@ _decompose(uint32_t norm32, int32_t &length, * @return pointer to decomposition, or 0 if none * @internal */ -static const UChar * -_decompose(UChar32 c, UChar buffer[4], int32_t &length) { +U_CFUNC const UChar * +unorm_getCanonicalDecomposition(UChar32 c, UChar buffer[4], int32_t *pLength) { uint32_t norm32; + if(c0) { buffer[2]=(UChar)(JAMO_T_BASE+c2); - length=3; + *pLength=3; } else { - length=2; + *pLength=2; } buffer[1]=(UChar)(JAMO_V_BASE+c%JAMO_V_COUNT); @@ -762,7 +734,7 @@ _decompose(UChar32 c, UChar buffer[4], int32_t &length) { } else { /* normal decomposition */ uint8_t cc, trailCC; - return _decompose(norm32, length, cc, trailCC); + return _decompose(norm32, *pLength, cc, trailCC); } } else { return 0; @@ -947,6 +919,14 @@ unorm_isCanonSafeStart(UChar32 c) { } } +U_CAPI void U_EXPORT2 +unorm_getUnicodeVersion(UVersionInfo *versionInfo, UErrorCode *pErrorCode){ + if(unorm_haveData(pErrorCode)){ + uprv_memcpy(*versionInfo, dataVersion, 4); + } +} + + U_CAPI UBool U_EXPORT2 unorm_getCanonStartSet(UChar32 c, USerializedSet *fillSet) { UErrorCode errorCode=U_ZERO_ERROR; @@ -1149,26 +1129,66 @@ unorm_isNFSkippable(UChar32 c, UNormalizationMode mode) { } U_CAPI void U_EXPORT2 -unorm_addPropertyStarts(USet *set, UErrorCode *pErrorCode) { +unorm_addPropertyStarts(USetAdder *sa, UErrorCode *pErrorCode) { UChar c; - if(!_haveData(*pErrorCode)) { + if(U_FAILURE(*pErrorCode) || !_haveData(*pErrorCode)) { return; } /* add the start code point of each same-value range of each trie */ - utrie_enum(&normTrie, NULL, _enumPropertyStartsRange, set); - utrie_enum(&fcdTrie, NULL, _enumPropertyStartsRange, set); + utrie_enum(&normTrie, NULL, _enumPropertyStartsRange, sa); + utrie_enum(&fcdTrie, NULL, _enumPropertyStartsRange, sa); if(formatVersion_2_1) { - utrie_enum(&auxTrie, NULL, _enumPropertyStartsRange, set); + utrie_enum(&auxTrie, NULL, _enumPropertyStartsRange, sa); } /* add Hangul LV syllables and LV+1 because of skippables */ for(c=HANGUL_BASE; cadd(sa->set, c); + sa->add(sa->set, c+1); + } + sa->add(sa->set, HANGUL_BASE+HANGUL_COUNT); /* add Hangul+1 to continue with other properties */ +} + +U_CAPI UNormalizationCheckResult U_EXPORT2 +unorm_getQuickCheck(UChar32 c, UNormalizationMode mode) { + static const uint32_t qcMask[UNORM_MODE_COUNT]={ + 0, 0, _NORM_QC_NFD, _NORM_QC_NFKD, _NORM_QC_NFC, _NORM_QC_NFKC + }; + + UErrorCode errorCode; + uint32_t norm32; + + errorCode=U_ZERO_ERROR; + if(!_haveData(errorCode)) { + return UNORM_YES; + } + + UTRIE_GET32(&normTrie, c, norm32); + norm32&=qcMask[mode]; + + if(norm32==0) { + return UNORM_YES; + } else if(norm32&_NORM_QC_ANY_NO) { + return UNORM_NO; + } else /* _NORM_QC_ANY_MAYBE */ { + return UNORM_MAYBE; + } +} + +U_CAPI uint16_t U_EXPORT2 +unorm_getFCD16FromCodePoint(UChar32 c) { + UErrorCode errorCode; + uint16_t fcd; + + errorCode=U_ZERO_ERROR; + if(!_haveData(errorCode)) { + return 0; } - uset_add(set, HANGUL_BASE+HANGUL_COUNT); /* add Hangul+1 to continue with other properties */ + + UTRIE_GET16(&fcdTrie, c, fcd); + return fcd; } /* reorder UTF-16 in-place -------------------------------------------------- */ @@ -1313,324 +1333,77 @@ _mergeOrdered(UChar *start, UChar *current, } } -/* quick check functions ---------------------------------------------------- */ - -static UBool -unorm_checkFCD(const UChar *src, int32_t srcLength, const UnicodeSet *nx) { - const UChar *limit; +/* find the last true starter in [start..src[ and return the pointer to it */ +static const UChar * +_findPreviousStarter(const UChar *start, const UChar *src, + uint32_t ccOrQCMask, uint32_t decompQCMask, UChar minNoMaybe) { + uint32_t norm32; UChar c, c2; - uint16_t fcd16; - int16_t prevCC, cc; - - /* initialize */ - prevCC=0; - if(srcLength>=0) { - /* string with length */ - limit=src+srcLength; - } else /* srcLength==-1 */ { - /* zero-terminated string */ - limit=NULL; + while(start>8); - if(cc!=0) { - if(prevCC<0) { - /* the previous character was <_NORM_MIN_WITH_LEAD_CC, we need to get its trail cc */ - if(!nx_contains(nx, (UChar32)-prevCC)) { - prevCC=(int16_t)(_getFCD16((UChar)-prevCC)&0xff); - } else { - prevCC=0; /* excluded: fcd16==0 */ - } - } - - if(cc=0) { - /* string with length */ - limit=src+srcLength; - } else /* srcLength==-1 */ { - /* zero-terminated string */ - limit=NULL; - } - - U_ALIGN_CODE(16); - - for(;;) { - /* skip a run of code units below the minimum or with irrelevant data for the quick check */ - if(limit==NULL) { - for(;;) { - c=*src++; - if(c=minNoMaybe && ((norm32=_getNorm32(c))&ccOrQCMask)!=0) { - break; - } - prevCC=0; - } - } - - /* check one above-minimum, relevant code unit */ - if(isNorm32LeadSurrogate(norm32)) { - /* c is a lead surrogate, get the real norm32 */ - if(src!=limit && UTF_IS_SECOND_SURROGATE(c2=*src)) { - ++src; - norm32=_getNorm32FromSurrogatePair(norm32, c2); - } else { - c2=0; - norm32=0; - } - } else { - c2=0; - } - - if(nx_contains(nx, c, c2)) { - /* excluded: norm32==0 */ - norm32=0; - } - - /* check the combining order */ - cc=(uint8_t)(norm32>>_NORM_CC_SHIFT); - if(cc!=0 && cc>_NORM_EXTRA_SHIFT)); + return norm32&_NORM_COMBINES_ANY; } else { - /* - * reminder: this function is called with [src..decompLimit[ - * not containing any Hangul/Jamo characters, - * therefore the only specials are lead surrogates - */ /* c is a lead surrogate, get the real norm32 */ - if(src!=decompLimit && UTF_IS_SECOND_SURROGATE(c2=*src)) { - ++src; - length=2; + if(p!=limit && UTF_IS_SECOND_SURROGATE(c2=*p)) { + ++p; norm32=_getNorm32FromSurrogatePair(norm32, c2); } else { c2=0; - length=1; - norm32=0; + return 0; } } - /* get the decomposition and the lead and trail cc's */ if(nx_contains(nx, c, c2)) { - /* excluded: norm32==0 */ - cc=trailCC=0; - p=NULL; - } else if((norm32&_NORM_QC_NFD)==0) { - /* c does not decompose */ - cc=trailCC=(uint8_t)(norm32>>_NORM_CC_SHIFT); - p=NULL; - } else { - /* c decomposes, get everything from the variable-length extra data */ - p=_decompose(norm32, length, cc, trailCC); - if(length==1) { - /* fastpath a single code unit from decomposition */ - c=*p; - c2=0; - p=NULL; - } + return 0; /* excluded: norm32==0 */ } - /* append the decomposition to the destination buffer, assume length>0 */ - if((destIndex+length)<=destCapacity) { - UChar *reorderSplit=dest+destIndex; - if(p==NULL) { - /* fastpath: single code point */ - if(cc!=0 && cc0); - } - } - } else { - /* buffer overflow */ - /* keep incrementing the destIndex for preflighting */ - destIndex+=length; - } + cc=(uint8_t)(norm32>>_NORM_CC_SHIFT); - prevCC=trailCC; - if(prevCC==0) { - reorderStartIndex=destIndex; + combineFlags=norm32&_NORM_COMBINES_ANY; + if(combineFlags!=0) { + combiningIndex=*(_getExtraData(norm32)-1); } + return combineFlags; } - - return prevCC; } -static int32_t -unorm_makeFCD(UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - const UnicodeSet *nx, - UErrorCode *pErrorCode) { - const UChar *limit, *prevSrc, *decompStart; - int32_t destIndex, length; - UChar c, c2; - uint16_t fcd16; - int16_t prevCC, cc; +/* + * given a composition-result starter (c, c2) - which means its cc==0, + * it combines forward, it has extra data, its norm32!=0, + * it is not a Hangul or Jamo, + * get just its combineFwdIndex + * + * norm32(c) is special if and only if c2!=0 + */ +static inline uint16_t +_getCombiningIndexFromStarter(UChar c, UChar c2) { + uint32_t norm32; - if(!_haveData(*pErrorCode)) { - return 0; + norm32=_getNorm32(c); + if(c2!=0) { + norm32=_getNorm32FromSurrogatePair(norm32, c2); } + return *(_getExtraData(norm32)-1); +} - /* initialize */ - decompStart=src; - destIndex=0; - prevCC=0; - - /* avoid compiler warnings */ - c=0; - fcd16=0; +/* + * Find the recomposition result for + * a forward-combining character + * (specified with a pointer to its part of the combiningTable[]) + * and a backward-combining character + * (specified with its combineBackIndex). + * + * If these two characters combine, then set (value, value2) + * with the code unit(s) of the composition character. + * + * Return value: + * 0 do not combine + * 1 combine + * >1 combine, and the composition is a forward-combining starter + * + * See unormimp.h for a description of the composition table format. + */ +static inline uint16_t +_combine(const uint16_t *table, uint16_t combineBackIndex, + uint16_t &value, uint16_t &value2) { + uint16_t key; - if(srcLength>=0) { - /* string with length */ - limit=src+srcLength; - } else /* srcLength==-1 */ { - /* zero-terminated string */ - limit=NULL; + /* search in the starter's composition table */ + for(;;) { + key=*table++; + if(key>=combineBackIndex) { + break; + } + table+= *table&0x8000 ? 2 : 1; } - U_ALIGN_CODE(16); + /* mask off bit 15, the last-entry-in-the-list flag */ + if((key&0x7fff)==combineBackIndex) { + /* found! combine! */ + value=*table; - for(;;) { - /* skip a run of code units below the minimum or with irrelevant data for the FCD check */ - prevSrc=src; - if(limit==NULL) { - for(;;) { - c=*src; - if(c<_NORM_MIN_WITH_LEAD_CC) { - if(c==0) { - break; - } - prevCC=(int16_t)-c; - } else if((fcd16=_getFCD16(c))==0) { - prevCC=0; - } else { - break; - } - ++src; + /* is the composition a starter that combines forward? */ + key=(uint16_t)((value&0x2000)+1); + + /* get the composition result code point from the variable-length result value */ + if(value&0x8000) { + if(value&0x4000) { + /* surrogate pair composition result */ + value=(uint16_t)((value&0x3ff)|0xd800); + value2=*(table+1); + } else { + /* BMP composition result U+2000..U+ffff */ + value=*(table+1); + value2=0; } } else { - for(;;) { - if(src==limit) { - break; - } else if((c=*src)<_NORM_MIN_WITH_LEAD_CC) { - prevCC=(int16_t)-c; - } else if((fcd16=_getFCD16(c))==0) { - prevCC=0; - } else { - break; - } - ++src; - } + /* BMP composition result U+0000..U+1fff */ + value&=0x1fff; + value2=0; } - /* - * prevCC has values from the following ranges: - * 0..0xff - the previous trail combining class - * <0 - the negative value of the previous code unit; - * that code unit was <_NORM_MIN_WITH_LEAD_CC and its _getFCD16() - * was deferred so that average text is checked faster - */ + return key; + } else { + /* not found */ + return 0; + } +} - /* copy these code units all at once */ - if(src!=prevSrc) { - length=(int32_t)(src-prevSrc); - if((destIndex+length)<=destCapacity) { - uprv_memcpy(dest+destIndex, prevSrc, length*U_SIZEOF_UCHAR); - } - destIndex+=length; - prevSrc=src; +static inline UBool +_composeHangul(UChar prev, UChar c, uint32_t norm32, const UChar *&src, const UChar *limit, + UBool compat, UChar *dest, const UnicodeSet *nx) { + if(isJamoVTNorm32JamoV(norm32)) { + /* c is a Jamo V, compose with previous Jamo L and following Jamo T */ + prev=(UChar)(prev-JAMO_L_BASE); + if(prev=0 - */ - - /* end of source reached? */ - if(limit==NULL ? c==0 : src==limit) { - break; + } else if(isHangulWithoutJamoT(prev)) { + /* c is a Jamo T, compose with previous Hangul LV that does not contain a Jamo T */ + c=(UChar)(prev+(c-JAMO_T_BASE)); + if(nx_contains(nx, c)) { + return FALSE; } - - /* set a pointer to after the last source position where prevCC==0 */ - if(prevCC==0) { - decompStart=prevSrc; + if(dest!=0) { + *dest=c; } + return TRUE; + } + return FALSE; +} - /* c already contains *src and fcd16 is set for it, increment src */ - ++src; +/* + * recompose the characters in [p..limit[ + * (which is in NFD - decomposed and canonically ordered), + * adjust limit, and return the trailing cc + * + * since for NFKC we may get Jamos in decompositions, we need to + * recompose those too + * + * note that recomposition never lengthens the text: + * any character consists of either one or two code units; + * a composition may contain at most one more code unit than the original starter, + * while the combining mark that is removed has at least one code unit + */ +static uint8_t +_recompose(UChar *p, UChar *&limit, int32_t options, const UnicodeSet *nx) { + UChar *starter, *pRemove, *q, *r; + uint32_t combineFlags; + UChar c, c2; + uint16_t combineFwdIndex, combineBackIndex; + uint16_t result, value, value2; + uint8_t cc, prevCC; + UBool starterIsSupplementary; - /* check one above-minimum, relevant code unit */ - if(UTF_IS_FIRST_SURROGATE(c)) { - /* c is a lead surrogate, get the real fcd16 */ - if(src!=limit && UTF_IS_SECOND_SURROGATE(c2=*src)) { - ++src; - fcd16=_getFCD16FromSurrogatePair(fcd16, c2); - } else { - c2=0; - fcd16=0; - } - } else { - c2=0; - } + starter=NULL; /* no starter */ + combineFwdIndex=0; /* will not be used until starter!=NULL - avoid compiler warnings */ + combineBackIndex=0; /* will always be set if combineFlags!=0 - avoid compiler warnings */ + value=value2=0; /* always set by _combine() before used - avoid compiler warnings */ + starterIsSupplementary=FALSE; /* will not be used until starter!=NULL - avoid compiler warnings */ + prevCC=0; - /* we are looking at the character (c, c2) at [prevSrc..src[ */ - if(nx_contains(nx, c, c2)) { - fcd16=0; /* excluded: fcd16==0 */ - } + for(;;) { + combineFlags=_getNextCombining(p, limit, c, c2, combineBackIndex, cc, nx); + if((combineFlags&_NORM_COMBINES_BACK) && starter!=NULL) { + if(combineBackIndex&0x8000) { + /* c is a Jamo V/T, see if we can compose it with the previous character */ + /* for the PRI #29 fix, check that there is no intervening combining mark */ + if((options&UNORM_BEFORE_PRI_29) || prevCC==0) { + pRemove=NULL; /* NULL while no Hangul composition */ + combineFlags=0; + c2=*starter; + if(combineBackIndex==0xfff2) { + /* Jamo V, compose with previous Jamo L and following Jamo T */ + c2=(UChar)(c2-JAMO_L_BASE); + if(c2>8); - if(cc==0 || cc>=prevCC) { - /* the order is ok */ - if(cc==0) { - decompStart=prevSrc; - } - prevCC=(int16_t)(fcd16&0xff); + /* + * Normally, the following can not occur: + * Since the input is in NFD, there are no Hangul LV syllables that + * a Jamo T could combine with. + * All Jamo Ts are combined above when handling Jamo Vs. + * + * However, before the PRI #29 fix, this can occur due to + * an intervening combining mark between the Hangul LV and the Jamo T. + */ + } else { + /* Jamo T, compose with previous Hangul that does not have a Jamo T */ + if(isHangulWithoutJamoT(c2)) { + c2+=(UChar)(c-JAMO_T_BASE); + if(!nx_contains(nx, c2)) { + pRemove=p-1; + *starter=c2; + } + } + } - /* just append (c, c2) */ - length= c2==0 ? 1 : 2; - if((destIndex+length)<=destCapacity) { - dest[destIndex++]=c; - if(c2!=0) { - dest[destIndex++]=c2; - } - } else { - destIndex+=length; - } - } else { - /* - * back out the part of the source that we copied already but - * is now going to be decomposed; - * prevSrc is set to after what was copied - */ - destIndex-=(int32_t)(prevSrc-decompStart); + if(pRemove!=NULL) { + /* remove the Jamo(s) */ + q=pRemove; + r=p; + while(r + * the rest of the loop body will reset starter to NULL; + * technically, a composed Hangul syllable is a starter, but it + * does not combine forward now that we have consumed all eligible Jamos; + * for Jamo V/T, combineFlags does not contain _NORM_COMBINES_FWD + */ - /* preset output values for most characters */ - c2=0; - combiningIndex=0; - cc=0; - - if((norm32&(_NORM_CC_MASK|_NORM_COMBINES_ANY))==0) { - return 0; - } else { - if(isNorm32Regular(norm32)) { - /* set cc etc. below */ - } else if(isNorm32HangulOrJamo(norm32)) { - /* a compatibility decomposition contained Jamos */ - combiningIndex=(uint16_t)(0xfff0|(norm32>>_NORM_EXTRA_SHIFT)); - return norm32&_NORM_COMBINES_ANY; - } else { - /* c is a lead surrogate, get the real norm32 */ - if(p!=limit && UTF_IS_SECOND_SURROGATE(c2=*p)) { - ++p; - norm32=_getNorm32FromSurrogatePair(norm32, c2); - } else { - c2=0; - return 0; - } - } - - if(nx_contains(nx, c, c2)) { - return 0; /* excluded: norm32==0 */ - } - - cc=(uint8_t)(norm32>>_NORM_CC_SHIFT); - - combineFlags=norm32&_NORM_COMBINES_ANY; - if(combineFlags!=0) { - combiningIndex=*(_getExtraData(norm32)-1); - } - return combineFlags; - } -} - -/* - * given a composition-result starter (c, c2) - which means its cc==0, - * it combines forward, it has extra data, its norm32!=0, - * it is not a Hangul or Jamo, - * get just its combineFwdIndex - * - * norm32(c) is special if and only if c2!=0 - */ -static inline uint16_t -_getCombiningIndexFromStarter(UChar c, UChar c2) { - uint32_t norm32; - - norm32=_getNorm32(c); - if(c2!=0) { - norm32=_getNorm32FromSurrogatePair(norm32, c2); - } - return *(_getExtraData(norm32)-1); -} - -/* - * Find the recomposition result for - * a forward-combining character - * (specified with a pointer to its part of the combiningTable[]) - * and a backward-combining character - * (specified with its combineBackIndex). - * - * If these two characters combine, then set (value, value2) - * with the code unit(s) of the composition character. - * - * Return value: - * 0 do not combine - * 1 combine - * >1 combine, and the composition is a forward-combining starter - * - * See unormimp.h for a description of the composition table format. - */ -static inline uint16_t -_combine(const uint16_t *table, uint16_t combineBackIndex, - uint16_t &value, uint16_t &value2) { - uint16_t key; - - /* search in the starter's composition table */ - for(;;) { - key=*table++; - if(key>=combineBackIndex) { - break; - } - table+= *table&0x8000 ? 2 : 1; - } - - /* mask off bit 15, the last-entry-in-the-list flag */ - if((key&0x7fff)==combineBackIndex) { - /* found! combine! */ - value=*table; - - /* is the composition a starter that combines forward? */ - key=(uint16_t)((value&0x2000)+1); - - /* get the composition result code point from the variable-length result value */ - if(value&0x8000) { - if(value&0x4000) { - /* surrogate pair composition result */ - value=(uint16_t)((value&0x3ff)|0xd800); - value2=*(table+1); - } else { - /* BMP composition result U+2000..U+ffff */ - value=*(table+1); - value2=0; - } - } else { - /* BMP composition result U+0000..U+1fff */ - value&=0x1fff; - value2=0; - } - - return key; - } else { - /* not found */ - return 0; - } -} - -/* - * recompose the characters in [p..limit[ - * (which is in NFD - decomposed and canonically ordered), - * adjust limit, and return the trailing cc - * - * since for NFKC we may get Jamos in decompositions, we need to - * recompose those too - * - * note that recomposition never lengthens the text: - * any character consists of either one or two code units; - * a composition may contain at most one more code unit than the original starter, - * while the combining mark that is removed has at least one code unit - */ -static uint8_t -_recompose(UChar *p, UChar *&limit, const UnicodeSet *nx) { - UChar *starter, *pRemove, *q, *r; - uint32_t combineFlags; - UChar c, c2; - uint16_t combineFwdIndex, combineBackIndex; - uint16_t result, value, value2; - uint8_t cc, prevCC; - UBool starterIsSupplementary; - - starter=NULL; /* no starter */ - combineFwdIndex=0; /* will not be used until starter!=NULL - avoid compiler warnings */ - combineBackIndex=0; /* will always be set if combineFlags!=0 - avoid compiler warnings */ - value=value2=0; /* always set by _combine() before used - avoid compiler warnings */ - starterIsSupplementary=FALSE; /* will not be used until starter!=NULL - avoid compiler warnings */ - prevCC=0; - - for(;;) { - combineFlags=_getNextCombining(p, limit, c, c2, combineBackIndex, cc, nx); - if((combineFlags&_NORM_COMBINES_BACK) && starter!=NULL) { - if(combineBackIndex&0x8000) { - /* c is a Jamo V/T, see if we can compose it with the previous character */ - pRemove=NULL; /* NULL while no Hangul composition */ - c2=*starter; - if(combineBackIndex==0xfff2) { - /* Jamo V, compose with previous Jamo L and following Jamo T */ - c2=(UChar)(c2-JAMO_L_BASE); - if(c2 - * the rest of the loop body will reset starter to NULL; - * technically, a composed Hangul syllable is a starter, but it - * does not combine forward now that we have consumed all eligible Jamos; - * for Jamo V/T, combineFlags does not contain _NORM_COMBINES_FWD - */ - - } else if( - /* the starter is not a Jamo V/T and */ - !(combineFwdIndex&0x8000) && - /* the combining mark is not blocked and */ - (prevCCbufferCapacity) { + if(!u_growBufferFromStatic(stackBuffer, &buffer, &bufferCapacity, 2*length, 0)) { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + length=_decompose(buffer, bufferCapacity, + prevStarter, src-prevStarter, + compat, nx, + trailCC); + } + + /* recompose the decomposition */ + recomposeLimit=buffer+length; + if(length>=2) { + prevCC=_recompose(buffer, recomposeLimit, options, nx); + } + + /* return with a pointer to the recomposition and its length */ + length=recomposeLimit-buffer; + return buffer; +} + +static int32_t +_compose(UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + int32_t options, const UnicodeSet *nx, + UErrorCode *pErrorCode) { + UChar stackBuffer[_STACK_BUFFER_CAPACITY]; + UChar *buffer; + int32_t bufferCapacity; + + const UChar *limit, *prevSrc, *prevStarter; + uint32_t norm32, ccOrQCMask, qcMask; + int32_t destIndex, reorderStartIndex, length; + UChar c, c2, minNoMaybe; + uint8_t cc, prevCC; + + if(options&_NORM_OPTIONS_COMPAT) { + minNoMaybe=(UChar)indexes[_NORM_INDEX_MIN_NFKC_NO_MAYBE]; + qcMask=_NORM_QC_NFKC; + } else { + minNoMaybe=(UChar)indexes[_NORM_INDEX_MIN_NFC_NO_MAYBE]; + qcMask=_NORM_QC_NFC; + } + + /* initialize */ + buffer=stackBuffer; + bufferCapacity=_STACK_BUFFER_CAPACITY; + + /* + * prevStarter points to the last character before the current one + * that is a "true" starter with cc==0 and quick check "yes". + * + * prevStarter will be used instead of looking for a true starter + * while incrementally decomposing [prevStarter..prevSrc[ + * in _composePart(). Having a good prevStarter allows to just decompose + * the entire [prevStarter..prevSrc[. + * + * When _composePart() backs out from prevSrc back to prevStarter, + * then it also backs out destIndex by the same amount. + * Therefore, at all times, the (prevSrc-prevStarter) source units + * must correspond 1:1 to destination units counted with destIndex, + * except for reordering. + * This is true for the qc "yes" characters copied in the fast loop, + * and for pure reordering. + * prevStarter must be set forward to src when this is not true: + * In _composePart() and after composing a Hangul syllable. + * + * This mechanism relies on the assumption that the decomposition of a true starter + * also begins with a true starter. gennorm/store.c checks for this. + */ + prevStarter=src; + + ccOrQCMask=_NORM_CC_MASK|qcMask; + destIndex=reorderStartIndex=0; + prevCC=0; + + /* avoid compiler warnings */ + norm32=0; + c=0; + + if(srcLength>=0) { + /* string with length */ + limit=src+srcLength; + } else /* srcLength==-1 */ { + /* zero-terminated string */ + limit=NULL; + } + + U_ALIGN_CODE(16); + + for(;;) { + /* count code units below the minimum or with irrelevant data for the quick check */ + prevSrc=src; + if(limit==NULL) { + while((c=*src)0 && + _composeHangul( + *(prevSrc-1), c, norm32, src, limit, (UBool)((options&_NORM_OPTIONS_COMPAT)!=0), + destIndex<=destCapacity ? dest+(destIndex-1) : 0, + nx) + ) { + prevStarter=src; + continue; + } + + /* the Jamo V/T did not compose into a Hangul syllable, just append to dest */ + c2=0; + length=1; + prevStarter=prevSrc; + } else { + if(isNorm32Regular(norm32)) { + c2=0; + length=1; + } else { + /* c is a lead surrogate, get the real norm32 */ + if(src!=limit && UTF_IS_SECOND_SURROGATE(c2=*src)) { + ++src; + length=2; + norm32=_getNorm32FromSurrogatePair(norm32, c2); + } else { + /* c is an unpaired lead surrogate, nothing to do */ + c2=0; + length=1; + norm32=0; + } + } + + /* we are looking at the character (c, c2) at [prevSrc..src[ */ + if(nx_contains(nx, c, c2)) { + /* excluded: norm32==0 */ + cc=0; + } else if((norm32&qcMask)==0) { + cc=(uint8_t)(norm32>>_NORM_CC_SHIFT); + } else { + const UChar *p; + uint32_t decompQCMask; + + /* + * find appropriate boundaries around this character, + * decompose the source text from between the boundaries, + * and recompose it + * + * this puts the intermediate text into the side buffer because + * it might be longer than the recomposition end result, + * or the destination buffer may be too short or missing + * + * note that destIndex may be adjusted backwards to account + * for source text that passed the quick check but needed to + * take part in the recomposition + */ + decompQCMask=(qcMask<<2)&0xf; /* decomposition quick check mask */ + + /* + * find the last true starter in [prevStarter..src[ + * it is either the decomposition of the current character (at prevSrc), + * or prevStarter + */ + if(_isTrueStarter(norm32, ccOrQCMask, decompQCMask)) { + prevStarter=prevSrc; + } else { + /* adjust destIndex: back out what had been copied with qc "yes" */ + destIndex-=(int32_t)(prevSrc-prevStarter); + } + + /* find the next true starter in [src..limit[ - modifies src to point to the next starter */ + src=_findNextStarter(src, limit, qcMask, decompQCMask, minNoMaybe); + + /* compose [prevStarter..src[ */ + p=_composePart(stackBuffer, buffer, bufferCapacity, + length, /* output */ + prevStarter, src, + prevCC, /* output */ + options, nx, + pErrorCode); + + if(p==NULL) { + destIndex=0; /* an error occurred (out of memory) */ + break; + } + + /* append the recomposed buffer contents to the destination buffer */ + if((destIndex+length)<=destCapacity) { + while(length>0) { + dest[destIndex++]=*p++; + --length; + } + } else { + /* buffer overflow */ + /* keep incrementing the destIndex for preflighting */ + destIndex+=length; + } + + /* set the next starter */ + prevStarter=src; + + continue; + } + } + + /* append the single code point (c, c2) to the destination buffer */ + if((destIndex+length)<=destCapacity) { + if(cc!=0 && cc>_NORM_CC_SHIFT); + p=NULL; + } else { + /* c decomposes, get everything from the variable-length extra data */ + p=_decompose(norm32, length, cc, trailCC); + if(length==1) { + /* fastpath a single code unit from decomposition */ + c=*p; + c2=0; + p=NULL; + } + } + + /* append the decomposition to the destination buffer, assume length>0 */ + if((destIndex+length)<=destCapacity) { + UChar *reorderSplit=dest+destIndex; + if(p==NULL) { + /* fastpath: single code point */ + if(cc!=0 && cc0); + } } + } else { + /* buffer overflow */ + /* keep incrementing the destIndex for preflighting */ + destIndex+=length; + } + + prevCC=trailCC; + if(prevCC==0) { + reorderStartIndex=destIndex; } } + + return prevCC; } -/* find the last true starter in [start..src[ and return the pointer to it */ -static const UChar * -_findPreviousStarter(const UChar *start, const UChar *src, - uint32_t ccOrQCMask, uint32_t decompQCMask, UChar minNoMaybe) { - uint32_t norm32; +static int32_t +unorm_makeFCD(UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + const UnicodeSet *nx, + UErrorCode *pErrorCode) { + const UChar *limit, *prevSrc, *decompStart; + int32_t destIndex, length; UChar c, c2; + uint16_t fcd16; + int16_t prevCC, cc; - while(start=0) { + /* string with length */ + limit=src+srcLength; + } else /* srcLength==-1 */ { + /* zero-terminated string */ + limit=NULL; + } + + U_ALIGN_CODE(16); for(;;) { - if(src==limit) { - break; /* end of string */ + /* skip a run of code units below the minimum or with irrelevant data for the FCD check */ + prevSrc=src; + if(limit==NULL) { + for(;;) { + c=*src; + if(c<_NORM_MIN_WITH_LEAD_CC) { + if(c==0) { + break; + } + prevCC=(int16_t)-c; + } else if((fcd16=_getFCD16(c))==0) { + prevCC=0; + } else { + break; + } + ++src; + } + } else { + for(;;) { + if(src==limit) { + break; + } else if((c=*src)<_NORM_MIN_WITH_LEAD_CC) { + prevCC=(int16_t)-c; + } else if((fcd16=_getFCD16(c))==0) { + prevCC=0; + } else { + break; + } + ++src; + } } - c=*src; - if(c=0 + */ - norm32=_getNorm32(c); - if((norm32&ccOrQCMask)==0) { - break; /* true starter */ + /* end of source reached? */ + if(limit==NULL ? c==0 : src==limit) { + break; } - if(isNorm32LeadSurrogate(norm32)) { - /* c is a lead surrogate, get the real norm32 */ - if((src+1)==limit || !UTF_IS_SECOND_SURROGATE(c2=*(src+1))) { - break; /* unmatched first surrogate: counts as a true starter */ - } - norm32=_getNorm32FromSurrogatePair(norm32, c2); + /* set a pointer to after the last source position where prevCC==0 */ + if(prevCC==0) { + decompStart=prevSrc; + } - if((norm32&ccOrQCMask)==0) { - break; /* true starter */ + /* c already contains *src and fcd16 is set for it, increment src */ + ++src; + + /* check one above-minimum, relevant code unit */ + if(UTF_IS_FIRST_SURROGATE(c)) { + /* c is a lead surrogate, get the real fcd16 */ + if(src!=limit && UTF_IS_SECOND_SURROGATE(c2=*src)) { + ++src; + fcd16=_getFCD16FromSurrogatePair(fcd16, c2); + } else { + c2=0; + fcd16=0; } } else { c2=0; } - /* (c, c2) is not a true starter but its decomposition may be */ - if(norm32&decompQCMask) { - /* (c, c2) decomposes, get everything from the variable-length extra data */ - p=_decompose(norm32, decompQCMask, length, cc, trailCC); + /* we are looking at the character (c, c2) at [prevSrc..src[ */ + if(nx_contains(nx, c, c2)) { + fcd16=0; /* excluded: fcd16==0 */ + } - /* get the first character's norm32 to check if it is a true starter */ - if(cc==0 && (_getNorm32(p, qcMask)&qcMask)==0) { - break; /* true starter */ + /* check the combining order, get the lead cc */ + cc=(int16_t)(fcd16>>8); + if(cc==0 || cc>=prevCC) { + /* the order is ok */ + if(cc==0) { + decompStart=prevSrc; + } + prevCC=(int16_t)(fcd16&0xff); + + /* just append (c, c2) */ + length= c2==0 ? 1 : 2; + if((destIndex+length)<=destCapacity) { + dest[destIndex++]=c; + if(c2!=0) { + dest[destIndex++]=c2; + } + } else { + destIndex+=length; } + } else { + /* + * back out the part of the source that we copied already but + * is now going to be decomposed; + * prevSrc is set to after what was copied + */ + destIndex-=(int32_t)(prevSrc-decompStart); + + /* + * find the part of the source that needs to be decomposed; + * to be safe and simple, decompose to before the next character with lead cc==0 + */ + src=_findSafeFCD(src, limit, fcd16); + + /* + * the source text does not fulfill the conditions for FCD; + * decompose and reorder a limited piece of the text + */ + prevCC=_decomposeFCD(decompStart, src, + dest, destIndex, destCapacity, + nx); + decompStart=src; } - - src+= c2==0 ? 1 : 2; /* not a true starter, continue */ } - return src; + return u_terminateUChars(dest, destCapacity, destIndex, pErrorCode); } -/* decompose and recompose [prevStarter..src[ */ -static const UChar * -_composePart(UChar *stackBuffer, UChar *&buffer, int32_t &bufferCapacity, int32_t &length, - const UChar *prevStarter, const UChar *src, - uint32_t qcMask, uint8_t &prevCC, - const UnicodeSet *nx, - UErrorCode *pErrorCode) { - UChar *recomposeLimit; - uint8_t trailCC; - UBool compat; +/* quick check functions ---------------------------------------------------- */ - compat=(UBool)((qcMask&_NORM_QC_NFKC)!=0); +static UBool +unorm_checkFCD(const UChar *src, int32_t srcLength, const UnicodeSet *nx) { + const UChar *limit; + UChar c, c2; + uint16_t fcd16; + int16_t prevCC, cc; - /* decompose [prevStarter..src[ */ - length=_decompose(buffer, bufferCapacity, - prevStarter, src-prevStarter, - compat, nx, - trailCC); - if(length>bufferCapacity) { - if(!u_growBufferFromStatic(stackBuffer, &buffer, &bufferCapacity, 2*length, 0)) { - *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - return NULL; - } - length=_decompose(buffer, bufferCapacity, - prevStarter, src-prevStarter, - compat, nx, - trailCC); - } + /* initialize */ + prevCC=0; - /* recompose the decomposition */ - recomposeLimit=buffer+length; - if(length>=2) { - prevCC=_recompose(buffer, recomposeLimit, nx); + if(srcLength>=0) { + /* string with length */ + limit=src+srcLength; + } else /* srcLength==-1 */ { + /* zero-terminated string */ + limit=NULL; } - /* return with a pointer to the recomposition and its length */ - length=recomposeLimit-buffer; - return buffer; -} - -static inline UBool -_composeHangul(UChar prev, UChar c, uint32_t norm32, const UChar *&src, const UChar *limit, - UBool compat, UChar *dest, const UnicodeSet *nx) { - if(isJamoVTNorm32JamoV(norm32)) { - /* c is a Jamo V, compose with previous Jamo L and following Jamo T */ - prev=(UChar)(prev-JAMO_L_BASE); - if(prev>8); + if(cc!=0) { + if(prevCC<0) { + /* the previous character was <_NORM_MIN_WITH_LEAD_CC, we need to get its trail cc */ + if(!nx_contains(nx, (UChar32)-prevCC)) { + prevCC=(int16_t)(_getFCD16((UChar)-prevCC)&0xff); + } else { + prevCC=0; /* excluded: fcd16==0 */ + } + } + + if(cc=0) { /* string with length */ limit=src+srcLength; @@ -2864,244 +3032,152 @@ _compose(UChar *dest, int32_t destCapacity, U_ALIGN_CODE(16); for(;;) { - /* count code units below the minimum or with irrelevant data for the quick check */ - prevSrc=src; + /* skip a run of code units below the minimum or with irrelevant data for the quick check */ if(limit==NULL) { - while((c=*src)=minNoMaybe && ((norm32=_getNorm32(c))&ccOrQCMask)!=0) { + break; + } prevCC=0; - ++src; } } - /* copy these code units all at once */ - if(src!=prevSrc) { - length=(int32_t)(src-prevSrc); - if((destIndex+length)<=destCapacity) { - uprv_memcpy(dest+destIndex, prevSrc, length*U_SIZEOF_UCHAR); - } - destIndex+=length; - reorderStartIndex=destIndex; - - /* set prevStarter to the last character in the quick check loop */ - prevStarter=src-1; - if(UTF_IS_SECOND_SURROGATE(*prevStarter) && prevSrc>_NORM_CC_SHIFT); + if(cc!=0 && cc0 && - _composeHangul( - *(prevSrc-1), c, norm32, src, limit, compat, - destIndex<=destCapacity ? dest+(destIndex-1) : 0, - nx) - ) { - prevStarter=src; - continue; - } - - /* the Jamo V/T did not compose into a Hangul syllable, just append to dest */ - c2=0; - length=1; - prevStarter=prevSrc; - } else { - if(isNorm32Regular(norm32)) { - c2=0; - length=1; - } else { - /* c is a lead surrogate, get the real norm32 */ - if(src!=limit && UTF_IS_SECOND_SURROGATE(c2=*src)) { - ++src; - length=2; - norm32=_getNorm32FromSurrogatePair(norm32, c2); - } else { - /* c is an unpaired lead surrogate, nothing to do */ - c2=0; - length=1; - norm32=0; - } - } - - /* we are looking at the character (c, c2) at [prevSrc..src[ */ - if(nx_contains(nx, c, c2)) { - /* excluded: norm32==0 */ - cc=0; - } else if((norm32&qcMask)==0) { - cc=(uint8_t)(norm32>>_NORM_CC_SHIFT); + /* check for "no" or "maybe" quick check flags */ + qcNorm32=norm32&qcMask; + if(qcNorm32&_NORM_QC_ANY_NO) { + result=UNORM_NO; + break; + } else if(qcNorm32!=0) { + /* "maybe" can only occur for NFC and NFKC */ + if(allowMaybe) { + result=UNORM_MAYBE; } else { - const UChar *p; + /* normalize a section around here to see if it is really normalized or not */ + const UChar *prevStarter; uint32_t decompQCMask; + int32_t length; - /* - * find appropriate boundaries around this character, - * decompose the source text from between the boundaries, - * and recompose it - * - * this puts the intermediate text into the side buffer because - * it might be longer than the recomposition end result, - * or the destination buffer may be too short or missing - * - * note that destIndex may be adjusted backwards to account - * for source text that passed the quick check but needed to - * take part in the recomposition - */ decompQCMask=(qcMask<<2)&0xf; /* decomposition quick check mask */ - /* - * find the last true starter in [prevStarter..src[ - * it is either the decomposition of the current character (at prevSrc), - * or prevStarter - */ - if(_isTrueStarter(norm32, ccOrQCMask, decompQCMask)) { - prevStarter=prevSrc; - } else { - /* adjust destIndex: back out what had been copied with qc "yes" */ - destIndex-=(int32_t)(prevSrc-prevStarter); + /* find the previous starter */ + prevStarter=src-1; /* set prevStarter to the beginning of the current character */ + if(UTF_IS_TRAIL(*prevStarter)) { + --prevStarter; /* safe because unpaired surrogates do not result in "maybe" */ } + prevStarter=_findPreviousStarter(start, prevStarter, ccOrQCMask, decompQCMask, minNoMaybe); /* find the next true starter in [src..limit[ - modifies src to point to the next starter */ src=_findNextStarter(src, limit, qcMask, decompQCMask, minNoMaybe); - /* compose [prevStarter..src[ */ - p=_composePart(stackBuffer, buffer, bufferCapacity, - length, /* output */ - prevStarter, src, - qcMask, - prevCC, /* output */ - nx, - pErrorCode); - - if(p==NULL) { - destIndex=0; /* an error occurred (out of memory) */ + /* decompose and recompose [prevStarter..src[ */ + _composePart(stackBuffer, buffer, bufferCapacity, + length, + prevStarter, + src, + prevCC, + options, nx, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + result=UNORM_MAYBE; /* error (out of memory) */ break; } - /* append the recomposed buffer contents to the destination buffer */ - if((destIndex+length)<=destCapacity) { - while(length>0) { - dest[destIndex++]=*p++; - --length; - } - } else { - /* buffer overflow */ - /* keep incrementing the destIndex for preflighting */ - destIndex+=length; + /* compare the normalized version with the original */ + if(0!=uprv_strCompare(prevStarter, (int32_t)(src-prevStarter), buffer, length, FALSE, FALSE)) { + result=UNORM_NO; /* normalization differs */ + break; } - /* set the next starter */ - prevStarter=src; - - continue; - } - } - - /* append the single code point (c, c2) to the destination buffer */ - if((destIndex+length)<=destCapacity) { - if(cc!=0 && ccdataFormat[0]==0x4e && /* dataFormat="Norm" */ + pInfo->dataFormat[1]==0x6f && + pInfo->dataFormat[2]==0x72 && + pInfo->dataFormat[3]==0x6d && + pInfo->formatVersion[0]==2 + )) { + udata_printError(ds, "unorm_swap(): data format %02x.%02x.%02x.%02x (format version %02x) is not recognized as unorm.icu\n", + pInfo->dataFormat[0], pInfo->dataFormat[1], + pInfo->dataFormat[2], pInfo->dataFormat[3], + pInfo->formatVersion[0]); + *pErrorCode=U_UNSUPPORTED_ERROR; + return 0; } - level1=level2=0; - c1=c2=-1; - - // comparison loop - for(;;) { - // here a code unit value of -1 means "get another code unit" - // below it will mean "this source is finished" - - if(c1<0) { - // get next code unit from string 1, post-increment - for(;;) { - if(s1==limit1 || ((c1=*s1)==0 && (limit1==NULL || (options&_STRNCMP_STYLE)))) { - if(level1==0) { - c1=-1; - break; - } - } else { - ++s1; - break; - } - - // reached end of level buffer, pop one level - do { - --level1; - start1=stack1[level1].start; - } while(start1==NULL); - s1=stack1[level1].s; - limit1=stack1[level1].limit; - } - } - - if(c2<0) { - // get next code unit from string 2, post-increment - for(;;) { - if(s2==limit2 || ((c2=*s2)==0 && (limit2==NULL || (options&_STRNCMP_STYLE)))) { - if(level2==0) { - c2=-1; - break; - } - } else { - ++s2; - break; - } - - // reached end of level buffer, pop one level - do { - --level2; - start2=stack2[level2].start; - } while(start2==NULL); - s2=stack2[level2].s; - limit2=stack2[level2].limit; - } - } - - // compare c1 and c2 - // either variable c1, c2 is -1 only if the corresponding string is finished - if(c1==c2) { - if(c1<0) { - return 0; // c1==c2==-1 indicating end of strings - } - c1=c2=-1; // make us fetch new code units - continue; - } else if(c1<0) { - return -1; // string 1 ends before string 2 - } else if(c2<0) { - return 1; // string 2 ends before string 1 - } - // c1!=c2 && c1>=0 && c2>=0 - - // get complete code points for c1, c2 for lookups if either is a surrogate - cp1=c1; - if(UTF_IS_SURROGATE(c1)) { - UChar c; - - if(UTF_IS_SURROGATE_FIRST(c1)) { - if(s1!=limit1 && UTF_IS_TRAIL(c=*s1)) { - // advance ++s1; only below if cp1 decomposes/case-folds - cp1=UTF16_GET_PAIR_VALUE(c1, c); - } - } else /* isTrail(c1) */ { - if(start1<=(s1-2) && UTF_IS_LEAD(c=*(s1-2))) { - cp1=UTF16_GET_PAIR_VALUE(c, c1); - } - } - } - - cp2=c2; - if(UTF_IS_SURROGATE(c2)) { - UChar c; - - if(UTF_IS_SURROGATE_FIRST(c2)) { - if(s2!=limit2 && UTF_IS_TRAIL(c=*s2)) { - // advance ++s2; only below if cp2 decomposes/case-folds - cp2=UTF16_GET_PAIR_VALUE(c2, c); - } - } else /* isTrail(c2) */ { - if(start2<=(s2-2) && UTF_IS_LEAD(c=*(s2-2))) { - cp2=UTF16_GET_PAIR_VALUE(c, c2); - } - } - } - - // go down one level for each string - // continue with the main loop as soon as there is a real change - - if( level1==0 && (options&U_COMPARE_IGNORE_CASE) && - (length=u_internalFoldCase((UChar32)cp1, fold1, 32, options))>=0 - ) { - // cp1 case-folds to fold1[length] - if(UTF_IS_SURROGATE(c1)) { - if(UTF_IS_SURROGATE_FIRST(c1)) { - // advance beyond source surrogate pair if it case-folds - ++s1; - } else /* isTrail(c1) */ { - // we got a supplementary code point when hitting its trail surrogate, - // therefore the lead surrogate must have been the same as in the other string; - // compare this decomposition with the lead surrogate in the other string - // remember that this simulates bulk text replacement: - // the decomposition would replace the entire code point - --s2; - c2=*(s2-1); - } - } - - // push current level pointers - stack1[0].start=start1; - stack1[0].s=s1; - stack1[0].limit=limit1; - ++level1; - - // set next level pointers to case folding - start1=s1=fold1; - limit1=fold1+length; - - // get ready to read from decomposition, continue with loop - c1=-1; - continue; - } - - if( level2==0 && (options&U_COMPARE_IGNORE_CASE) && - (length=u_internalFoldCase((UChar32)cp2, fold2, 32, options))>=0 - ) { - // cp2 case-folds to fold2[length] - if(UTF_IS_SURROGATE(c2)) { - if(UTF_IS_SURROGATE_FIRST(c2)) { - // advance beyond source surrogate pair if it case-folds - ++s2; - } else /* isTrail(c2) */ { - // we got a supplementary code point when hitting its trail surrogate, - // therefore the lead surrogate must have been the same as in the other string; - // compare this decomposition with the lead surrogate in the other string - // remember that this simulates bulk text replacement: - // the decomposition would replace the entire code point - --s1; - c1=*(s1-1); - } - } - - // push current level pointers - stack2[0].start=start2; - stack2[0].s=s2; - stack2[0].limit=limit2; - ++level2; - - // set next level pointers to case folding - start2=s2=fold2; - limit2=fold2+length; - - // get ready to read from decomposition, continue with loop - c2=-1; - continue; - } - - if( level1<2 && (options&_COMPARE_EQUIV) && - 0!=(p=_decompose((UChar32)cp1, decomp1, length)) - ) { - // cp1 decomposes into p[length] - if(UTF_IS_SURROGATE(c1)) { - if(UTF_IS_SURROGATE_FIRST(c1)) { - // advance beyond source surrogate pair if it decomposes - ++s1; - } else /* isTrail(c1) */ { - // we got a supplementary code point when hitting its trail surrogate, - // therefore the lead surrogate must have been the same as in the other string; - // compare this decomposition with the lead surrogate in the other string - // remember that this simulates bulk text replacement: - // the decomposition would replace the entire code point - --s2; - c2=*(s2-1); - } - } - - // push current level pointers - stack1[level1].start=start1; - stack1[level1].s=s1; - stack1[level1].limit=limit1; - ++level1; - - // set empty intermediate level if skipped - if(level1<2) { - stack1[level1++].start=NULL; - } - - // set next level pointers to decomposition - start1=s1=p; - limit1=p+length; - - // get ready to read from decomposition, continue with loop - c1=-1; - continue; - } - - if( level2<2 && (options&_COMPARE_EQUIV) && - 0!=(p=_decompose((UChar32)cp2, decomp2, length)) - ) { - // cp2 decomposes into p[length] - if(UTF_IS_SURROGATE(c2)) { - if(UTF_IS_SURROGATE_FIRST(c2)) { - // advance beyond source surrogate pair if it decomposes - ++s2; - } else /* isTrail(c2) */ { - // we got a supplementary code point when hitting its trail surrogate, - // therefore the lead surrogate must have been the same as in the other string; - // compare this decomposition with the lead surrogate in the other string - // remember that this simulates bulk text replacement: - // the decomposition would replace the entire code point - --s1; - c1=*(s1-1); - } - } - - // push current level pointers - stack2[level2].start=start2; - stack2[level2].s=s2; - stack2[level2].limit=limit2; - ++level2; - - // set empty intermediate level if skipped - if(level2<2) { - stack2[level2++].start=NULL; - } - - // set next level pointers to decomposition - start2=s2=p; - limit2=p+length; - - // get ready to read from decomposition, continue with loop - c2=-1; - continue; - } - - // no decomposition/case folding, max level for both sides: - // return difference result - - // code point order comparison must not just return cp1-cp2 - // because when single surrogates are present then the surrogate pairs - // that formed cp1 and cp2 may be from different string indexes - - // example: { d800 d800 dc01 } vs. { d800 dc00 }, compare at second code units - // c1=d800 cp1=10001 c2=dc00 cp2=10000 - // cp1-cp2>0 but c1-c2<0 and in fact in UTF-32 it is { d800 10001 } < { 10000 } - - // therefore, use same fix-up as in ustring.c/uprv_strCompare() - // except: uprv_strCompare() fetches c=*s while this functions fetches c=*s++ - // so we have slightly different pointer/start/limit comparisons here + inBytes=(const uint8_t *)inData+headerSize; + outBytes=(uint8_t *)outData+headerSize; - if(c1>=0xd800 && c2>=0xd800 && (options&U_COMPARE_CODE_POINT_ORDER)) { - /* subtract 0x2800 from BMP code points to make them smaller than supplementary ones */ - if( - (c1<=0xdbff && s1!=limit1 && UTF_IS_TRAIL(*s1)) || - (UTF_IS_TRAIL(c1) && start1!=(s1-1) && UTF_IS_LEAD(*(s1-2))) - ) { - /* part of a surrogate pair, leave >=d800 */ - } else { - /* BMP code point - may be surrogate code point - make =d800 */ - } else { - /* BMP code point - may be surrogate code point - make =0) { + length-=headerSize; + if(length<32*4) { + udata_printError(ds, "unorm_swap(): too few bytes (%d after header) for unorm.icu\n", + length); + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; } - - return c1-c2; - } -} - -#if !UCONFIG_NO_NORMALIZATION - -U_CAPI int32_t U_EXPORT2 -unorm_compare(const UChar *s1, int32_t length1, - const UChar *s2, int32_t length2, - uint32_t options, - UErrorCode *pErrorCode) { - UChar fcd1[300], fcd2[300]; - UChar *d1, *d2; - const UnicodeSet *nx; - UNormalizationMode mode; - int32_t result; - - /* argument checking */ - if(pErrorCode==0 || U_FAILURE(*pErrorCode)) { - return 0; - } - if(s1==0 || length1<-1 || s2==0 || length2<-1) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - if(!_haveData(*pErrorCode)) { - return 0; - } - if(!uprv_haveProperties(pErrorCode)) { - return 0; - } - - nx=getNX((int32_t)(options>>UNORM_COMPARE_NORM_OPTIONS_SHIFT), *pErrorCode); - if(U_FAILURE(*pErrorCode)) { - return 0; } - d1=d2=0; - options|=_COMPARE_EQUIV; - result=0; - - /* - * UAX #21 Case Mappings, as fixed for Unicode version 4 - * (see Jitterbug 2021), defines a canonical caseless match as - * - * A string X is a canonical caseless match - * for a string Y if and only if - * NFD(toCasefold(NFD(X))) = NFD(toCasefold(NFD(Y))) - * - * For better performance, we check for FCD (or let the caller tell us that - * both strings are in FCD) for the inner normalization. - * BasicNormalizerTest::FindFoldFCDExceptions() makes sure that - * case-folding preserves the FCD-ness of a string. - * The outer normalization is then only performed by unorm_cmpEquivFold() - * when there is a difference. - * - * Exception: When using the Turkic case-folding option, we do perform - * full NFD first. This is because in the Turkic case precomposed characters - * with 0049 capital I or 0069 small i fold differently whether they - * are first decomposed or not, so an FCD check - a check only for - * canonical order - is not sufficient. - */ - if(options&U_FOLD_CASE_EXCLUDE_SPECIAL_I) { - mode=UNORM_NFD; - options&=~UNORM_INPUT_IS_FCD; - } else { - mode=UNORM_FCD; + /* read the first 32 indexes (ICU 2.8/format version 2.2: _NORM_INDEX_TOP==32, might grow) */ + for(i=0; i<32; ++i) { + indexes[i]=udata_readInt32(ds, inIndexes[i]); } - if(!(options&UNORM_INPUT_IS_FCD)) { - int32_t _len1, _len2; - UBool isFCD1, isFCD2; + /* calculate the total length of the data */ + size= + 32*4+ /* size of indexes[] */ + indexes[_NORM_INDEX_TRIE_SIZE]+ + indexes[_NORM_INDEX_UCHAR_COUNT]*2+ + indexes[_NORM_INDEX_COMBINE_DATA_COUNT]*2+ + indexes[_NORM_INDEX_FCD_TRIE_SIZE]+ + indexes[_NORM_INDEX_AUX_TRIE_SIZE]+ + indexes[_NORM_INDEX_CANON_SET_COUNT]*2; - // check if s1 and/or s2 fulfill the FCD conditions - isFCD1= UNORM_YES==_quickCheck(s1, length1, mode, TRUE, nx, pErrorCode); - isFCD2= UNORM_YES==_quickCheck(s2, length2, mode, TRUE, nx, pErrorCode); - if(U_FAILURE(*pErrorCode)) { + if(length>=0) { + if(lengthswapArray32(ds, inBytes, count, outBytes, pErrorCode); + offset+=count; - if(!isFCD2) { - _len2=unorm_internalNormalize(fcd2, LENGTHOF(fcd2), - s2, length2, - mode, nx, - pErrorCode); - if(*pErrorCode!=U_BUFFER_OVERFLOW_ERROR) { - s2=fcd2; - } else { - d2=(UChar *)uprv_malloc(_len2*U_SIZEOF_UCHAR); - if(d2==0) { - *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - goto cleanup; - } + /* swap the main UTrie */ + count=indexes[_NORM_INDEX_TRIE_SIZE]; + utrie_swap(ds, inBytes+offset, count, outBytes+offset, pErrorCode); + offset+=count; - *pErrorCode=U_ZERO_ERROR; - _len2=unorm_internalNormalize(d2, _len2, - s2, length2, - mode, nx, - pErrorCode); - if(U_FAILURE(*pErrorCode)) { - goto cleanup; - } + /* swap the uint16_t extraData[] and the uint16_t combiningTable[] */ + count=(indexes[_NORM_INDEX_UCHAR_COUNT]+indexes[_NORM_INDEX_COMBINE_DATA_COUNT])*2; + ds->swapArray16(ds, inBytes+offset, count, outBytes+offset, pErrorCode); + offset+=count; - s2=d2; - } - length2=_len2; + /* swap the FCD UTrie */ + count=indexes[_NORM_INDEX_FCD_TRIE_SIZE]; + if(count!=0) { + utrie_swap(ds, inBytes+offset, count, outBytes+offset, pErrorCode); + offset+=count; } - } - if(U_SUCCESS(*pErrorCode)) { - result=unorm_cmpEquivFold(s1, length1, s2, length2, options, pErrorCode); - } + /* swap the aux UTrie */ + count=indexes[_NORM_INDEX_AUX_TRIE_SIZE]; + if(count!=0) { + utrie_swap(ds, inBytes+offset, count, outBytes+offset, pErrorCode); + offset+=count; + } -cleanup: - if(d1!=0) { - uprv_free(d1); - } - if(d2!=0) { - uprv_free(d2); + /* swap the uint16_t combiningTable[] */ + count=indexes[_NORM_INDEX_CANON_SET_COUNT]*2; + ds->swapArray16(ds, inBytes+offset, count, outBytes+offset, pErrorCode); + offset+=count; } - return result; + return headerSize+size; } #endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/icuSources/common/unorm_it.c b/icuSources/common/unorm_it.c index 83e0d15d..cb18cf19 100644 --- a/icuSources/common/unorm_it.c +++ b/icuSources/common/unorm_it.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2003, International Business Machines +* Copyright (C) 2003-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -137,7 +137,7 @@ moveContentsTowardStart(UCharIterator *api, UChar chars[], uint32_t states[], in srcIndex=delta; if(srcIndex>api->start) { /* look for a position in the arrays with a known state */ - while(srcIndexlimit) { /* look for a position in the arrays with a known state */ - while(srcIndex>start && chars[srcIndex]==UITER_NO_STATE) { + while(srcIndex>start && states[srcIndex]==UITER_NO_STATE) { --srcIndex; } } @@ -191,16 +191,15 @@ readNext(UNormIterator *uni, UCharIterator *iter) { UCharIterator *api=&uni->api; /* make capacity/4 room at the end of the arrays */ - int32_t limit, capacity, room, delta; + int32_t limit, capacity, room; UErrorCode errorCode; limit=api->limit; capacity=uni->capacity; room=capacity/4; - delta=room-(capacity-limit); - if(delta>0) { + if(room>(capacity-limit)) { /* move array contents to make room */ - moveContentsTowardStart(api, uni->chars, uni->states, delta); + moveContentsTowardStart(api, uni->chars, uni->states, room); api->index=limit=api->limit; uni->hasPrevious=TRUE; } @@ -262,16 +261,15 @@ readPrevious(UNormIterator *uni, UCharIterator *iter) { UCharIterator *api=&uni->api; /* make capacity/4 room at the start of the arrays */ - int32_t start, capacity, room, delta; + int32_t start, capacity, room; UErrorCode errorCode; start=api->start; capacity=uni->capacity; room=capacity/4; - delta=room-start; - if(delta>0) { + if(room>start) { /* move array contents to make room */ - moveContentsTowardEnd(api, uni->chars, uni->states, delta); + moveContentsTowardEnd(api, uni->chars, uni->states, room); api->index=start=api->start; uni->hasNext=TRUE; } @@ -563,12 +561,11 @@ unorm_openIter(void *stackMem, int32_t stackMemSize, UErrorCode *pErrorCode) { if(align==0) { /* already aligned */ uni=(UNormIterator *)stackMem; - } else if((stackMemSize-=align)>=sizeof(UNormIterator)) { + } else if((stackMemSize-=(int32_t)align)>=(int32_t)sizeof(UNormIterator)) { /* needs alignment */ uni=(UNormIterator *)((char *)stackMem+align); - } else { - /* does not fit */ } + /* else does not fit */ } if(uni!=NULL) { diff --git a/icuSources/common/unormcmp.cpp b/icuSources/common/unormcmp.cpp new file mode 100644 index 00000000..106e8399 --- /dev/null +++ b/icuSources/common/unormcmp.cpp @@ -0,0 +1,688 @@ +/* +******************************************************************************* +* +* Copyright (C) 2001-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: unormcmp.cpp +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2004sep13 +* created by: Markus W. Scherer +* +* unorm_compare() function moved here from unorm.cpp for better modularization. +* Depends on both normalization and case folding. +* Allows unorm.cpp to not depend on any character properties code. +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_NORMALIZATION + +#include "unicode/ustring.h" +#include "unicode/unorm.h" +#include "unicode/uniset.h" +#include "unormimp.h" +#include "ucase.h" +#include "cmemory.h" + +#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) + +/* compare canonically equivalent ------------------------------------------- */ + +/* + * Compare two strings for canonical equivalence. + * Further options include case-insensitive comparison and + * code point order (as opposed to code unit order). + * + * In this function, canonical equivalence is optional as well. + * If canonical equivalence is tested, then both strings must fulfill + * the FCD check. + * + * Semantically, this is equivalent to + * strcmp[CodePointOrder](NFD(foldCase(s1)), NFD(foldCase(s2))) + * where code point order, NFD and foldCase are all optional. + * + * String comparisons almost always yield results before processing both strings + * completely. + * They are generally more efficient working incrementally instead of + * performing the sub-processing (strlen, normalization, case-folding) + * on the entire strings first. + * + * It is also unnecessary to not normalize identical characters. + * + * This function works in principle as follows: + * + * loop { + * get one code unit c1 from s1 (-1 if end of source) + * get one code unit c2 from s2 (-1 if end of source) + * + * if(either string finished) { + * return result; + * } + * if(c1==c2) { + * continue; + * } + * + * // c1!=c2 + * try to decompose/case-fold c1/c2, and continue if one does; + * + * // still c1!=c2 and neither decomposes/case-folds, return result + * return c1-c2; + * } + * + * When a character decomposes, then the pointer for that source changes to + * the decomposition, pushing the previous pointer onto a stack. + * When the end of the decomposition is reached, then the code unit reader + * pops the previous source from the stack. + * (Same for case-folding.) + * + * This is complicated further by operating on variable-width UTF-16. + * The top part of the loop works on code units, while lookups for decomposition + * and case-folding need code points. + * Code points are assembled after the equality/end-of-source part. + * The source pointer is only advanced beyond all code units when the code point + * actually decomposes/case-folds. + * + * If we were on a trail surrogate unit when assembling a code point, + * and the code point decomposes/case-folds, then the decomposition/folding + * result must be compared with the part of the other string that corresponds to + * this string's lead surrogate. + * Since we only assemble a code point when hitting a trail unit when the + * preceding lead units were identical, we back up the other string by one unit + * in such a case. + * + * The optional code point order comparison at the end works with + * the same fix-up as the other code point order comparison functions. + * See ustring.c and the comment near the end of this function. + * + * Assumption: A decomposition or case-folding result string never contains + * a single surrogate. This is a safe assumption in the Unicode Standard. + * Therefore, we do not need to check for surrogate pairs across + * decomposition/case-folding boundaries. + * + * Further assumptions (see verifications tstnorm.cpp): + * The API function checks for FCD first, while the core function + * first case-folds and then decomposes. This requires that case-folding does not + * un-FCD any strings. + * + * The API function may also NFD the input and turn off decomposition. + * This requires that case-folding does not un-NFD strings either. + * + * TODO If any of the above two assumptions is violated, + * then this entire code must be re-thought. + * If this happens, then a simple solution is to case-fold both strings up front + * and to turn off UNORM_INPUT_IS_FCD. + * We already do this when not both strings are in FCD because makeFCD + * would be a partial NFD before the case folding, which does not work. + * Note that all of this is only a problem when case-folding _and_ + * canonical equivalence come together. + * (Comments in unorm_compare() are more up to date than this TODO.) + * + * This function could be moved to a different source file, at increased cost + * for calling the decomposition access function. + */ + +/* stack element for previous-level source/decomposition pointers */ +struct CmpEquivLevel { + const UChar *start, *s, *limit; +}; +typedef struct CmpEquivLevel CmpEquivLevel; + +/* internal function */ +static int32_t +unorm_cmpEquivFold(const UChar *s1, int32_t length1, + const UChar *s2, int32_t length2, + uint32_t options, + UErrorCode *pErrorCode) { + UCaseProps *csp; + + /* current-level start/limit - s1/s2 as current */ + const UChar *start1, *start2, *limit1, *limit2; + + /* decomposition and case folding variables */ + const UChar *p; + int32_t length; + + /* stacks of previous-level start/current/limit */ + CmpEquivLevel stack1[2], stack2[2]; + + /* decomposition buffers for Hangul */ + UChar decomp1[4], decomp2[4]; + + /* case folding buffers, only use current-level start/limit */ + UChar fold1[UCASE_MAX_STRING_LENGTH+1], fold2[UCASE_MAX_STRING_LENGTH+1]; + + /* track which is the current level per string */ + int32_t level1, level2; + + /* current code units, and code points for lookups */ + UChar32 c1, c2, cp1, cp2; + + /* no argument error checking because this itself is not an API */ + + /* + * assume that at least one of the options _COMPARE_EQUIV and U_COMPARE_IGNORE_CASE is set + * otherwise this function must behave exactly as uprv_strCompare() + * not checking for that here makes testing this function easier + */ + + /* normalization/properties data loaded? */ + if( ((options&_COMPARE_EQUIV)!=0 && !unorm_haveData(pErrorCode)) || + U_FAILURE(*pErrorCode) + ) { + return 0; + } + if((options&U_COMPARE_IGNORE_CASE)!=0) { + csp=ucase_getSingleton(pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return 0; + } + } else { + csp=NULL; + } + + /* initialize */ + start1=s1; + if(length1==-1) { + limit1=NULL; + } else { + limit1=s1+length1; + } + + start2=s2; + if(length2==-1) { + limit2=NULL; + } else { + limit2=s2+length2; + } + + level1=level2=0; + c1=c2=-1; + + /* comparison loop */ + for(;;) { + /* + * here a code unit value of -1 means "get another code unit" + * below it will mean "this source is finished" + */ + + if(c1<0) { + /* get next code unit from string 1, post-increment */ + for(;;) { + if(s1==limit1 || ((c1=*s1)==0 && (limit1==NULL || (options&_STRNCMP_STYLE)))) { + if(level1==0) { + c1=-1; + break; + } + } else { + ++s1; + break; + } + + /* reached end of level buffer, pop one level */ + do { + --level1; + start1=stack1[level1].start; + } while(start1==NULL); + s1=stack1[level1].s; + limit1=stack1[level1].limit; + } + } + + if(c2<0) { + /* get next code unit from string 2, post-increment */ + for(;;) { + if(s2==limit2 || ((c2=*s2)==0 && (limit2==NULL || (options&_STRNCMP_STYLE)))) { + if(level2==0) { + c2=-1; + break; + } + } else { + ++s2; + break; + } + + /* reached end of level buffer, pop one level */ + do { + --level2; + start2=stack2[level2].start; + } while(start2==NULL); + s2=stack2[level2].s; + limit2=stack2[level2].limit; + } + } + + /* + * compare c1 and c2 + * either variable c1, c2 is -1 only if the corresponding string is finished + */ + if(c1==c2) { + if(c1<0) { + return 0; /* c1==c2==-1 indicating end of strings */ + } + c1=c2=-1; /* make us fetch new code units */ + continue; + } else if(c1<0) { + return -1; /* string 1 ends before string 2 */ + } else if(c2<0) { + return 1; /* string 2 ends before string 1 */ + } + /* c1!=c2 && c1>=0 && c2>=0 */ + + /* get complete code points for c1, c2 for lookups if either is a surrogate */ + cp1=c1; + if(U_IS_SURROGATE(c1)) { + UChar c; + + if(U_IS_SURROGATE_LEAD(c1)) { + if(s1!=limit1 && U16_IS_TRAIL(c=*s1)) { + /* advance ++s1; only below if cp1 decomposes/case-folds */ + cp1=U16_GET_SUPPLEMENTARY(c1, c); + } + } else /* isTrail(c1) */ { + if(start1<=(s1-2) && U16_IS_LEAD(c=*(s1-2))) { + cp1=U16_GET_SUPPLEMENTARY(c, c1); + } + } + } + + cp2=c2; + if(U_IS_SURROGATE(c2)) { + UChar c; + + if(U_IS_SURROGATE_LEAD(c2)) { + if(s2!=limit2 && U16_IS_TRAIL(c=*s2)) { + /* advance ++s2; only below if cp2 decomposes/case-folds */ + cp2=U16_GET_SUPPLEMENTARY(c2, c); + } + } else /* isTrail(c2) */ { + if(start2<=(s2-2) && U16_IS_LEAD(c=*(s2-2))) { + cp2=U16_GET_SUPPLEMENTARY(c, c2); + } + } + } + + /* + * go down one level for each string + * continue with the main loop as soon as there is a real change + */ + + if( level1==0 && (options&U_COMPARE_IGNORE_CASE) && + (length=ucase_toFullFolding(csp, (UChar32)cp1, &p, options))>=0 + ) { + /* cp1 case-folds to the code point "length" or to p[length] */ + if(U_IS_SURROGATE(c1)) { + if(U_IS_SURROGATE_LEAD(c1)) { + /* advance beyond source surrogate pair if it case-folds */ + ++s1; + } else /* isTrail(c1) */ { + /* + * we got a supplementary code point when hitting its trail surrogate, + * therefore the lead surrogate must have been the same as in the other string; + * compare this decomposition with the lead surrogate in the other string + * remember that this simulates bulk text replacement: + * the decomposition would replace the entire code point + */ + --s2; + c2=*(s2-1); + } + } + + /* push current level pointers */ + stack1[0].start=start1; + stack1[0].s=s1; + stack1[0].limit=limit1; + ++level1; + + /* copy the folding result to fold1[] */ + if(length<=UCASE_MAX_STRING_LENGTH) { + u_memcpy(fold1, p, length); + } else { + int32_t i=0; + U16_APPEND_UNSAFE(fold1, i, length); + length=i; + } + + /* set next level pointers to case folding */ + start1=s1=fold1; + limit1=fold1+length; + + /* get ready to read from decomposition, continue with loop */ + c1=-1; + continue; + } + + if( level2==0 && (options&U_COMPARE_IGNORE_CASE) && + (length=ucase_toFullFolding(csp, (UChar32)cp2, &p, options))>=0 + ) { + /* cp2 case-folds to the code point "length" or to p[length] */ + if(U_IS_SURROGATE(c2)) { + if(U_IS_SURROGATE_LEAD(c2)) { + /* advance beyond source surrogate pair if it case-folds */ + ++s2; + } else /* isTrail(c2) */ { + /* + * we got a supplementary code point when hitting its trail surrogate, + * therefore the lead surrogate must have been the same as in the other string; + * compare this decomposition with the lead surrogate in the other string + * remember that this simulates bulk text replacement: + * the decomposition would replace the entire code point + */ + --s1; + c1=*(s1-1); + } + } + + /* push current level pointers */ + stack2[0].start=start2; + stack2[0].s=s2; + stack2[0].limit=limit2; + ++level2; + + /* copy the folding result to fold2[] */ + if(length<=UCASE_MAX_STRING_LENGTH) { + u_memcpy(fold2, p, length); + } else { + int32_t i=0; + U16_APPEND_UNSAFE(fold2, i, length); + length=i; + } + + /* set next level pointers to case folding */ + start2=s2=fold2; + limit2=fold2+length; + + /* get ready to read from decomposition, continue with loop */ + c2=-1; + continue; + } + + if( level1<2 && (options&_COMPARE_EQUIV) && + 0!=(p=unorm_getCanonicalDecomposition((UChar32)cp1, decomp1, &length)) + ) { + /* cp1 decomposes into p[length] */ + if(U_IS_SURROGATE(c1)) { + if(U_IS_SURROGATE_LEAD(c1)) { + /* advance beyond source surrogate pair if it decomposes */ + ++s1; + } else /* isTrail(c1) */ { + /* + * we got a supplementary code point when hitting its trail surrogate, + * therefore the lead surrogate must have been the same as in the other string; + * compare this decomposition with the lead surrogate in the other string + * remember that this simulates bulk text replacement: + * the decomposition would replace the entire code point + */ + --s2; + c2=*(s2-1); + } + } + + /* push current level pointers */ + stack1[level1].start=start1; + stack1[level1].s=s1; + stack1[level1].limit=limit1; + ++level1; + + /* set empty intermediate level if skipped */ + if(level1<2) { + stack1[level1++].start=NULL; + } + + /* set next level pointers to decomposition */ + start1=s1=p; + limit1=p+length; + + /* get ready to read from decomposition, continue with loop */ + c1=-1; + continue; + } + + if( level2<2 && (options&_COMPARE_EQUIV) && + 0!=(p=unorm_getCanonicalDecomposition((UChar32)cp2, decomp2, &length)) + ) { + /* cp2 decomposes into p[length] */ + if(U_IS_SURROGATE(c2)) { + if(U_IS_SURROGATE_LEAD(c2)) { + /* advance beyond source surrogate pair if it decomposes */ + ++s2; + } else /* isTrail(c2) */ { + /* + * we got a supplementary code point when hitting its trail surrogate, + * therefore the lead surrogate must have been the same as in the other string; + * compare this decomposition with the lead surrogate in the other string + * remember that this simulates bulk text replacement: + * the decomposition would replace the entire code point + */ + --s1; + c1=*(s1-1); + } + } + + /* push current level pointers */ + stack2[level2].start=start2; + stack2[level2].s=s2; + stack2[level2].limit=limit2; + ++level2; + + /* set empty intermediate level if skipped */ + if(level2<2) { + stack2[level2++].start=NULL; + } + + /* set next level pointers to decomposition */ + start2=s2=p; + limit2=p+length; + + /* get ready to read from decomposition, continue with loop */ + c2=-1; + continue; + } + + /* + * no decomposition/case folding, max level for both sides: + * return difference result + * + * code point order comparison must not just return cp1-cp2 + * because when single surrogates are present then the surrogate pairs + * that formed cp1 and cp2 may be from different string indexes + * + * example: { d800 d800 dc01 } vs. { d800 dc00 }, compare at second code units + * c1=d800 cp1=10001 c2=dc00 cp2=10000 + * cp1-cp2>0 but c1-c2<0 and in fact in UTF-32 it is { d800 10001 } < { 10000 } + * + * therefore, use same fix-up as in ustring.c/uprv_strCompare() + * except: uprv_strCompare() fetches c=*s while this functions fetches c=*s++ + * so we have slightly different pointer/start/limit comparisons here + */ + + if(c1>=0xd800 && c2>=0xd800 && (options&U_COMPARE_CODE_POINT_ORDER)) { + /* subtract 0x2800 from BMP code points to make them smaller than supplementary ones */ + if( + (c1<=0xdbff && s1!=limit1 && U16_IS_TRAIL(*s1)) || + (U16_IS_TRAIL(c1) && start1!=(s1-1) && U16_IS_LEAD(*(s1-2))) + ) { + /* part of a surrogate pair, leave >=d800 */ + } else { + /* BMP code point - may be surrogate code point - make =d800 */ + } else { + /* BMP code point - may be surrogate code point - make >UNORM_COMPARE_NORM_OPTIONS_SHIFT); + nx=unorm_getNX(normOptions, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return 0; + } + + d1=d2=0; + options|=_COMPARE_EQUIV; + result=0; + + /* + * UAX #21 Case Mappings, as fixed for Unicode version 4 + * (see Jitterbug 2021), defines a canonical caseless match as + * + * A string X is a canonical caseless match + * for a string Y if and only if + * NFD(toCasefold(NFD(X))) = NFD(toCasefold(NFD(Y))) + * + * For better performance, we check for FCD (or let the caller tell us that + * both strings are in FCD) for the inner normalization. + * BasicNormalizerTest::FindFoldFCDExceptions() makes sure that + * case-folding preserves the FCD-ness of a string. + * The outer normalization is then only performed by unorm_cmpEquivFold() + * when there is a difference. + * + * Exception: When using the Turkic case-folding option, we do perform + * full NFD first. This is because in the Turkic case precomposed characters + * with 0049 capital I or 0069 small i fold differently whether they + * are first decomposed or not, so an FCD check - a check only for + * canonical order - is not sufficient. + */ + if(options&U_FOLD_CASE_EXCLUDE_SPECIAL_I) { + mode=UNORM_NFD; + options&=~UNORM_INPUT_IS_FCD; + } else { + mode=UNORM_FCD; + } + + if(!(options&UNORM_INPUT_IS_FCD)) { + int32_t _len1, _len2; + UBool isFCD1, isFCD2; + + // check if s1 and/or s2 fulfill the FCD conditions + isFCD1= UNORM_YES==unorm_internalQuickCheck(s1, length1, mode, TRUE, nx, pErrorCode); + isFCD2= UNORM_YES==unorm_internalQuickCheck(s2, length2, mode, TRUE, nx, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return 0; + } + + /* + * ICU 2.4 had a further optimization: + * If both strings were not in FCD, then they were both NFD'ed, + * and the _COMPARE_EQUIV option was turned off. + * It is not entirely clear that this is valid with the current + * definition of the canonical caseless match. + * Therefore, ICU 2.6 removes that optimization. + */ + + if(!isFCD1) { + _len1=unorm_internalNormalizeWithNX(fcd1, LENGTHOF(fcd1), + s1, length1, + mode, normOptions, nx, + pErrorCode); + if(*pErrorCode!=U_BUFFER_OVERFLOW_ERROR) { + s1=fcd1; + } else { + d1=(UChar *)uprv_malloc(_len1*U_SIZEOF_UCHAR); + if(d1==0) { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + goto cleanup; + } + + *pErrorCode=U_ZERO_ERROR; + _len1=unorm_internalNormalizeWithNX(d1, _len1, + s1, length1, + mode, normOptions, nx, + pErrorCode); + if(U_FAILURE(*pErrorCode)) { + goto cleanup; + } + + s1=d1; + } + length1=_len1; + } + + if(!isFCD2) { + _len2=unorm_internalNormalizeWithNX(fcd2, LENGTHOF(fcd2), + s2, length2, + mode, normOptions, nx, + pErrorCode); + if(*pErrorCode!=U_BUFFER_OVERFLOW_ERROR) { + s2=fcd2; + } else { + d2=(UChar *)uprv_malloc(_len2*U_SIZEOF_UCHAR); + if(d2==0) { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + goto cleanup; + } + + *pErrorCode=U_ZERO_ERROR; + _len2=unorm_internalNormalizeWithNX(d2, _len2, + s2, length2, + mode, normOptions, nx, + pErrorCode); + if(U_FAILURE(*pErrorCode)) { + goto cleanup; + } + + s2=d2; + } + length2=_len2; + } + } + + if(U_SUCCESS(*pErrorCode)) { + result=unorm_cmpEquivFold(s1, length1, s2, length2, options, pErrorCode); + } + +cleanup: + if(d1!=0) { + uprv_free(d1); + } + if(d2!=0) { + uprv_free(d2); + } + + return result; +} + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/icuSources/common/unormimp.h b/icuSources/common/unormimp.h index 284bca59..6be9f303 100644 --- a/icuSources/common/unormimp.h +++ b/icuSources/common/unormimp.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2001-2003, International Business Machines +* Copyright (C) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -21,15 +21,20 @@ #if !UCONFIG_NO_NORMALIZATION +#ifdef XP_CPLUSPLUS +#include "unicode/uniset.h" +#endif + #include "unicode/uiter.h" #include "unicode/unorm.h" #include "unicode/uset.h" #include "utrie.h" #include "ustr_imp.h" +#include "udataswp.h" /* * This new implementation of the normalization code loads its data from - * unorm.dat, which is generated with the gennorm tool. + * unorm.icu, which is generated with the gennorm tool. * The format of that file is described at the end of this file. */ @@ -91,11 +96,19 @@ enum { /* canonStartSets[0..31] contains indexes for what is in the array */ enum { - _NORM_SET_INDEX_CANON_SETS_LENGTH, /* number of uint16_t in canonical starter sets */ + _NORM_SET_INDEX_CANON_SETS_LENGTH, /* number of uint16_t in canonical starter sets */ _NORM_SET_INDEX_CANON_BMP_TABLE_LENGTH, /* number of uint16_t in the BMP search table (contains pairs) */ _NORM_SET_INDEX_CANON_SUPP_TABLE_LENGTH,/* number of uint16_t in the supplementary search table (contains triplets) */ - _NORM_SET_INDEX_TOP=32 /* changing this requires a new formatVersion */ + /* from formatVersion 2.3: */ + _NORM_SET_INDEX_NX_CJK_COMPAT_OFFSET, /* uint16_t offset from canonStartSets[0] to the + exclusion set for CJK compatibility characters */ + _NORM_SET_INDEX_NX_UNICODE32_OFFSET, /* uint16_t offset from canonStartSets[0] to the + exclusion set for Unicode 3.2 characters */ + _NORM_SET_INDEX_NX_RESERVED_OFFSET, /* uint16_t offset from canonStartSets[0] to the + end of the previous exclusion set */ + + _NORM_SET_INDEX_TOP=32 /* changing this requires a new formatVersion */ }; /* more constants for canonical starter sets */ @@ -174,7 +187,16 @@ enum { /** Options bit 0, do not decompose Hangul syllables. @draft ICU 2.6 */ UNORM_NX_HANGUL=1, /** Options bit 1, do not decompose CJK compatibility characters. @draft ICU 2.6 */ - UNORM_NX_CJK_COMPAT=2 + UNORM_NX_CJK_COMPAT=2, + /** + * Options bit 8, use buggy recomposition described in + * Unicode Public Review Issue #29 + * at http://www.unicode.org/review/resolved-pri.html#pri29 + * + * Used in IDNA implementation according to strict interpretation + * of IDNA definition based on Unicode 3.2 which predates PRI #29. + */ + UNORM_BEFORE_PRI_29=0x100 }; /** @@ -203,6 +225,22 @@ unorm_internalNormalize(UChar *dest, int32_t destCapacity, UNormalizationMode mode, int32_t options, UErrorCode *pErrorCode); +#ifdef XP_CPLUSPLUS + +/** + * Internal API for normalizing. + * Does not check for bad input. + * Requires _haveData() to be true. + * @internal + */ +U_CFUNC int32_t +unorm_internalNormalizeWithNX(UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + UNormalizationMode mode, int32_t options, const UnicodeSet *nx, + UErrorCode *pErrorCode); + +#endif + /** * internal API, used by normlzr.cpp * @internal @@ -223,6 +261,22 @@ unorm_compose(UChar *dest, int32_t destCapacity, UBool compat, int32_t options, UErrorCode *pErrorCode); +#ifdef XP_CPLUSPLUS + +/** + * internal API, used by unormcmp.cpp + * @internal + */ +U_CFUNC UNormalizationCheckResult +unorm_internalQuickCheck(const UChar *src, + int32_t srcLength, + UNormalizationMode mode, + UBool allowMaybe, + const UnicodeSet *nx, + UErrorCode *pErrorCode); + +#endif + #endif /* #if !UCONFIG_NO_NORMALIZATION */ /** @@ -249,20 +303,15 @@ unorm_compose(UChar *dest, int32_t destCapacity, */ #define _STRNCMP_STYLE 0x1000 +#if !UCONFIG_NO_NORMALIZATION + /** - * Internal API, used by u_strcasecmp() etc. - * Compare strings for canonical equivalence (optional), - * case-insensitively (optional), - * in code point order or code unit order. + * Internal API to get the 16-bit FCD value (lccc + tccc) for c, + * for u_getIntPropertyValue(). * @internal */ -U_CAPI int32_t U_EXPORT2 -unorm_cmpEquivFold(const UChar *s1, int32_t length1, - const UChar *s2, int32_t length2, - uint32_t options, - UErrorCode *pErrorCode); - -#if !UCONFIG_NO_NORMALIZATION +U_CAPI uint16_t U_EXPORT2 +unorm_getFCD16FromCodePoint(UChar32 c); /** * Internal API, used by collation code. @@ -328,8 +377,29 @@ U_NAMESPACE_END #endif +/** + * internal API, used by StringPrep + * @internal + */ +U_CAPI void U_EXPORT2 +unorm_getUnicodeVersion(UVersionInfo *versionInfo, UErrorCode *pErrorCode); + +/** + * Get the canonical decomposition for one code point. + * Requires unorm_haveData() and buffer!=NULL and pLength!=NULL. + * @param c code point + * @param buffer out-only buffer for algorithmic decompositions of Hangul + * @param length out-only, takes the length of the decomposition, if any + * @return pointer to decomposition, or 0 if none + * @internal + */ +U_CFUNC const UChar * +unorm_getCanonicalDecomposition(UChar32 c, UChar buffer[4], int32_t *pLength); + /** * internal API, used by the canonical iterator + * TODO Consider using signature similar to unorm_getCanonicalDecomposition() + * for more efficiency * @internal */ U_CAPI int32_t U_EXPORT2 @@ -364,21 +434,51 @@ unorm_getCanonStartSet(UChar32 c, USerializedSet *fillSet); U_CAPI UBool U_EXPORT2 unorm_isNFSkippable(UChar32 c, UNormalizationMode mode); +#ifdef XP_CPLUSPLUS + +/** + * Get normalization exclusion set for the options. + * Requires unorm_haveData(). + * @internal + */ +U_CFUNC const UnicodeSet * +unorm_getNX(int32_t options, UErrorCode *pErrorCode); + +#endif + /** * Enumerate each normalization data trie and add the * start of each range of same properties to the set. * @internal */ U_CAPI void U_EXPORT2 -unorm_addPropertyStarts(USet *set, UErrorCode *pErrorCode); +unorm_addPropertyStarts(USetAdder *sa, UErrorCode *pErrorCode); + +/** + * Swap unorm.icu. See udataswp.h. + * @internal + */ +U_CAPI int32_t U_EXPORT2 +unorm_swap(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode); /** - * Description of the format of unorm.dat version 2.2. + * Get the NF*_QC property for a code point, for u_getIntPropertyValue(). + * @internal + */ +U_CAPI UNormalizationCheckResult U_EXPORT2 +unorm_getQuickCheck(UChar32 c, UNormalizationMode mode); + +/** + * Description of the format of unorm.icu version 2.3. * * Main change from version 1 to version 2: * Use of new, common UTrie instead of normalization-specific tries. * Change to version 2.1: add third/auxiliary trie with associated data. * Change to version 2.2: add skippable (f) flag data (_NORM_AUX_NFC_SKIP_F_MASK). + * Change to version 2.3: add serialized sets for normalization exclusions + * stored inside canonStartSets[] * * For more details of how to use the data structures see the code * in unorm.cpp (runtime normalization code) and @@ -391,7 +491,7 @@ unorm_addPropertyStarts(USet *set, UErrorCode *pErrorCode); * unorm.dat customarily begins with a UDataInfo structure, see udata.h and .c. * After that there are the following structures: * - * uint16_t indexes[_NORM_INDEX_TOP]; -- _NORM_INDEX_TOP=32, see enum in this file + * int32_t indexes[_NORM_INDEX_TOP]; -- _NORM_INDEX_TOP=32, see enum in this file * * UTrie normTrie; -- size in bytes=indexes[_NORM_INDEX_TRIE_SIZE] * @@ -662,6 +762,31 @@ unorm_addPropertyStarts(USet *set, UErrorCode *pErrorCode); * if the high word has bit 15 set, then build a set with a single code point * which is (((high16(cp)&0x1f00)<<8)|result; * else there is a USerializedSet at canonStartSets+result + * + * FormatVersion 2.3 adds 2 serialized sets for normalization exclusions. + * They are stored in the data file so that the runtime normalization code need + * not depend on other properties and their data and implementation files. + * The _NORM_SET_INDEX_NX_..._OFFSET offsets in the canonStartSets index table + * give the location for each set. + * There is no set stored for UNORM_NX_HANGUL because it's trivial to create + * without using properties. + * + * Set contents: + * + * _NORM_SET_INDEX_NX_CJK_COMPAT_OFFSET (for UNORM_NX_CJK_COMPAT) + * [[:Ideographic:]&[:NFD_QC=No:]] + * =[CJK Ideographs]&[has canonical decomposition] + * + * _NORM_SET_INDEX_NX_UNICODE32_OFFSET (for UNORM_UNICODE_3_2) + * [:^Age=3.2:] + * =set with all code points that were not designated by the specified Unicode version + * + * _NORM_SET_INDEX_NX_RESERVED_OFFSET + * This is an offset that points to where the next, future set would start. + * Currently it indicates where the previous set ends, and thus its length. + * The name for this enum constant may in the future be applied to different + * index slots. In order to get the limit of a set, use its index slot and + * the immediately following one regardless of that one's enum name. */ #endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/icuSources/common/uobject.cpp b/icuSources/common/uobject.cpp index e425c881..581cd742 100644 --- a/icuSources/common/uobject.cpp +++ b/icuSources/common/uobject.cpp @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 2002, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -15,13 +15,12 @@ */ #include "unicode/uobject.h" - -#if U_OVERRIDE_CXX_ALLOCATION - #include "cmemory.h" U_NAMESPACE_BEGIN +#if U_OVERRIDE_CXX_ALLOCATION + /* * Default implementation of UMemory::new/delete * using uprv_malloc() and uprv_free(). @@ -57,27 +56,48 @@ U_NAMESPACE_BEGIN * and replace with uprv_malloc/uprv_free. */ -void *UMemory::operator new(size_t size) { +void * U_EXPORT2 UMemory::operator new(size_t size) { return uprv_malloc(size); } -void UMemory::operator delete(void *p) { +void U_EXPORT2 UMemory::operator delete(void *p) { if(p!=NULL) { uprv_free(p); } } -void *UMemory::operator new[](size_t size) { +void * U_EXPORT2 UMemory::operator new[](size_t size) { return uprv_malloc(size); } -void UMemory::operator delete[](void *p) { +void U_EXPORT2 UMemory::operator delete[](void *p) { if(p!=NULL) { uprv_free(p); } } +#endif + +UObject::~UObject() {} + +// Future implementation for RTTI that support subtyping. [alan] +// +// UClassID UObject::getStaticClassID() { +// return (UClassID) NULL; +// } +// +// UBool UObject::instanceOf(UClassID type) const { +// UClassID c = getDynamicClassID(); +// for (;;) { +// if (c == type) { +// return TRUE; +// } else if (c == (UClassID) NULL) { +// return FALSE; +// } +// c = * (UClassID*) c; +// } +// } + U_NAMESPACE_END -#endif diff --git a/icuSources/common/uprops.c b/icuSources/common/uprops.c index 5ba5a634..1abc8729 100644 --- a/icuSources/common/uprops.c +++ b/icuSources/common/uprops.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2002-2003, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -15,6 +15,10 @@ * * Implementations for mostly non-core Unicode character properties * stored in uprops.icu. +* +* With the APIs implemented here, almost all properties files and +* their associated implementation files are used from this file, +* including those for normalization and case mappings. */ #include "unicode/utypes.h" @@ -26,128 +30,62 @@ #define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) -/** - * Unicode property names and property value names are compared - * "loosely". Property[Value]Aliases.txt say: - * "With loose matching of property names, the case distinctions, whitespace, - * and '_' are ignored." - * - * This function does just that, for ASCII (char *) name strings. - * It is almost identical to ucnv_compareNames() but also ignores - * ASCII White_Space characters (U+0009..U+000d). - * - * @internal - */ -U_CAPI int32_t U_EXPORT2 -uprv_comparePropertyNames(const char *name1, const char *name2) { - int32_t rc; - unsigned char c1, c2; - - for(;;) { - /* Ignore delimiters '-', '_', and ASCII White_Space */ - while((c1=(unsigned char)*name1)=='-' || c1=='_' || - c1==' ' || c1=='\t' || c1=='\n' || c1=='\v' || c1=='\f' || c1=='\r' - ) { - ++name1; - } - while((c2=(unsigned char)*name2)=='-' || c2=='_' || - c2==' ' || c2=='\t' || c2=='\n' || c2=='\v' || c2=='\f' || c2=='\r' - ) { - ++name2; - } - - /* If we reach the ends of both strings then they match */ - if((c1|c2)==0) { - return 0; - } - - /* Case-insensitive comparison */ - if(c1!=c2) { - rc=(int32_t)(unsigned char)uprv_tolower(c1)-(int32_t)(unsigned char)uprv_tolower(c2); - if(rc!=0) { - return rc; - } - } - - ++name1; - ++name2; - } -} - /* API functions ------------------------------------------------------------ */ -U_CAPI void U_EXPORT2 -u_charAge(UChar32 c, UVersionInfo versionArray) { - if(versionArray!=NULL) { - uint32_t version=u_getUnicodeProperties(c, 0)>>UPROPS_AGE_SHIFT; - versionArray[0]=(uint8_t)(version>>4); - versionArray[1]=(uint8_t)(version&0xf); - versionArray[2]=versionArray[3]=0; - } -} - -U_CAPI UScriptCode U_EXPORT2 -uscript_getScript(UChar32 c, UErrorCode *pErrorCode) { - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return 0; - } - if((uint32_t)c>0x10ffff) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - return (UScriptCode)(u_getUnicodeProperties(c, 0)&UPROPS_SCRIPT_MASK); -} - -U_CAPI UBlockCode U_EXPORT2 -ublock_getCode(UChar32 c) { - return (UBlockCode)((u_getUnicodeProperties(c, 0)&UPROPS_BLOCK_MASK)>>UPROPS_BLOCK_SHIFT); -} - static const struct { int32_t column; uint32_t mask; -} binProps[]={ +} binProps[UCHAR_BINARY_LIMIT]={ /* * column and mask values for binary properties from u_getUnicodeProperties(). * Must be in order of corresponding UProperty, * and there must be exacly one entry per binary UProperty. + * + * Properties with mask 0 are handled in code. + * For them, column is the UPropertySource value. */ - { 1, U_MASK(UPROPS_ALPHABETIC) }, - { 1, U_MASK(UPROPS_ASCII_HEX_DIGIT) }, - { 1, U_MASK(UPROPS_BIDI_CONTROL) }, - { -1, U_MASK(UPROPS_MIRROR_SHIFT) }, - { 1, U_MASK(UPROPS_DASH) }, - { 1, U_MASK(UPROPS_DEFAULT_IGNORABLE_CODE_POINT) }, - { 1, U_MASK(UPROPS_DEPRECATED) }, - { 1, U_MASK(UPROPS_DIACRITIC) }, - { 1, U_MASK(UPROPS_EXTENDER) }, - { 0, 0 }, /* UCHAR_FULL_COMPOSITION_EXCLUSION */ - { 1, U_MASK(UPROPS_GRAPHEME_BASE) }, - { 1, U_MASK(UPROPS_GRAPHEME_EXTEND) }, - { 1, U_MASK(UPROPS_GRAPHEME_LINK) }, - { 1, U_MASK(UPROPS_HEX_DIGIT) }, - { 1, U_MASK(UPROPS_HYPHEN) }, - { 1, U_MASK(UPROPS_ID_CONTINUE) }, - { 1, U_MASK(UPROPS_ID_START) }, - { 1, U_MASK(UPROPS_IDEOGRAPHIC) }, - { 1, U_MASK(UPROPS_IDS_BINARY_OPERATOR) }, - { 1, U_MASK(UPROPS_IDS_TRINARY_OPERATOR) }, - { 1, U_MASK(UPROPS_JOIN_CONTROL) }, - { 1, U_MASK(UPROPS_LOGICAL_ORDER_EXCEPTION) }, - { 1, U_MASK(UPROPS_LOWERCASE) }, - { 1, U_MASK(UPROPS_MATH) }, - { 1, U_MASK(UPROPS_NONCHARACTER_CODE_POINT) }, - { 1, U_MASK(UPROPS_QUOTATION_MARK) }, - { 1, U_MASK(UPROPS_RADICAL) }, - { 1, U_MASK(UPROPS_SOFT_DOTTED) }, - { 1, U_MASK(UPROPS_TERMINAL_PUNCTUATION) }, - { 1, U_MASK(UPROPS_UNIFIED_IDEOGRAPH) }, - { 1, U_MASK(UPROPS_UPPERCASE) }, - { 1, U_MASK(UPROPS_WHITE_SPACE) }, - { 1, U_MASK(UPROPS_XID_CONTINUE) }, - { 1, U_MASK(UPROPS_XID_START) }, - { -1, U_MASK(UPROPS_CASE_SENSITIVE_SHIFT) } + { 1, U_MASK(UPROPS_ALPHABETIC) }, + { 1, U_MASK(UPROPS_ASCII_HEX_DIGIT) }, + { 1, U_MASK(UPROPS_BIDI_CONTROL) }, + { -1, U_MASK(UPROPS_MIRROR_SHIFT) }, + { 1, U_MASK(UPROPS_DASH) }, + { 1, U_MASK(UPROPS_DEFAULT_IGNORABLE_CODE_POINT) }, + { 1, U_MASK(UPROPS_DEPRECATED) }, + { 1, U_MASK(UPROPS_DIACRITIC) }, + { 1, U_MASK(UPROPS_EXTENDER) }, + { UPROPS_SRC_NORM, 0 }, /* UCHAR_FULL_COMPOSITION_EXCLUSION */ + { 1, U_MASK(UPROPS_GRAPHEME_BASE) }, + { 1, U_MASK(UPROPS_GRAPHEME_EXTEND) }, + { 1, U_MASK(UPROPS_GRAPHEME_LINK) }, + { 1, U_MASK(UPROPS_HEX_DIGIT) }, + { 1, U_MASK(UPROPS_HYPHEN) }, + { 1, U_MASK(UPROPS_ID_CONTINUE) }, + { 1, U_MASK(UPROPS_ID_START) }, + { 1, U_MASK(UPROPS_IDEOGRAPHIC) }, + { 1, U_MASK(UPROPS_IDS_BINARY_OPERATOR) }, + { 1, U_MASK(UPROPS_IDS_TRINARY_OPERATOR) }, + { 1, U_MASK(UPROPS_JOIN_CONTROL) }, + { 1, U_MASK(UPROPS_LOGICAL_ORDER_EXCEPTION) }, + { UPROPS_SRC_CASE, 0 }, /* UCHAR_LOWERCASE */ + { 1, U_MASK(UPROPS_MATH) }, + { 1, U_MASK(UPROPS_NONCHARACTER_CODE_POINT) }, + { 1, U_MASK(UPROPS_QUOTATION_MARK) }, + { 1, U_MASK(UPROPS_RADICAL) }, + { UPROPS_SRC_CASE, 0 }, /* UCHAR_SOFT_DOTTED */ + { 1, U_MASK(UPROPS_TERMINAL_PUNCTUATION) }, + { 1, U_MASK(UPROPS_UNIFIED_IDEOGRAPH) }, + { UPROPS_SRC_CASE, 0 }, /* UCHAR_UPPERCASE */ + { 1, U_MASK(UPROPS_WHITE_SPACE) }, + { 1, U_MASK(UPROPS_XID_CONTINUE) }, + { 1, U_MASK(UPROPS_XID_START) }, + { UPROPS_SRC_CASE, 0 }, /* UCHAR_CASE_SENSITIVE */ + { 2, U_MASK(UPROPS_V2_S_TERM) }, + { 2, U_MASK(UPROPS_V2_VARIATION_SELECTOR) }, + { UPROPS_SRC_NORM, 0 }, /* UCHAR_NFD_INERT */ + { UPROPS_SRC_NORM, 0 }, /* UCHAR_NFKD_INERT */ + { UPROPS_SRC_NORM, 0 }, /* UCHAR_NFC_INERT */ + { UPROPS_SRC_NORM, 0 }, /* UCHAR_NFKC_INERT */ + { UPROPS_SRC_NORM, 0 } /* UCHAR_SEGMENT_STARTER */ }; U_CAPI UBool U_EXPORT2 @@ -155,57 +93,53 @@ u_hasBinaryProperty(UChar32 c, UProperty which) { /* c is range-checked in the functions that are called from here */ if(which>8; + case UCHAR_TRAIL_CANONICAL_COMBINING_CLASS: + return unorm_getFCD16FromCodePoint(c)&0xff; +#endif default: return 0; /* undefined */ } @@ -309,6 +227,8 @@ u_getIntPropertyMaxValue(UProperty which) { max=(uprv_getMaxValues(0)&UPROPS_BLOCK_MASK)>>UPROPS_BLOCK_SHIFT; return max!=0 ? max : (int32_t)UBLOCK_COUNT-1; case UCHAR_CANONICAL_COMBINING_CLASS: + case UCHAR_LEAD_CANONICAL_COMBINING_CLASS: + case UCHAR_TRAIL_CANONICAL_COMBINING_CLASS: return 0xff; /* TODO do we need to be more precise, getting the actual maximum? */ case UCHAR_DECOMPOSITION_TYPE: max=uprv_getMaxValues(2)&UPROPS_DT_MASK; @@ -334,6 +254,14 @@ u_getIntPropertyMaxValue(UProperty which) { return max!=0 ? max : (int32_t)USCRIPT_CODE_LIMIT-1; case UCHAR_HANGUL_SYLLABLE_TYPE: return (int32_t)U_HST_COUNT-1; +#if !UCONFIG_NO_NORMALIZATION + case UCHAR_NFD_QUICK_CHECK: + case UCHAR_NFKD_QUICK_CHECK: + return (int32_t)UNORM_YES; /* these are never "maybe", only "no" or "yes" */ + case UCHAR_NFC_QUICK_CHECK: + case UCHAR_NFKC_QUICK_CHECK: + return (int32_t)UNORM_MAYBE; +#endif default: return -1; /* undefined */ } @@ -342,6 +270,40 @@ u_getIntPropertyMaxValue(UProperty which) { } } +U_CAPI UPropertySource U_EXPORT2 +uprops_getSource(UProperty which) { + if(which=sizeof(path)) { + *status=U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } else if(uprv_isInvariantUString(myPath, length)) { + /* + * the invariant converter is sufficient for package and tree names + * and is more efficient + */ + u_UCharsToChars(myPath, path, length+1); /* length+1 to include the NUL */ + } else { +#if !UCONFIG_NO_CONVERSION + /* use the default converter to support variant-character paths */ + UConverter *cnv=u_getDefaultConverter(status); + if(U_FAILURE(*status)) { + return NULL; + } + + length=ucnv_fromUChars(cnv, path, (int32_t)sizeof(path), myPath, length, status); + u_releaseDefaultConverter(cnv); + if(U_FAILURE(*status)) { + return NULL; + } + if(length>=sizeof(path)) { + /* not NUL-terminated - path too long */ + *status=U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } +#else + /* the default converter is not available */ + *status=U_UNSUPPORTED_ERROR; + return NULL; +#endif + } + + return ures_open(path, localeID, status); +} diff --git a/icuSources/common/uresbund.c b/icuSources/common/uresbund.c index d72df6a1..c3a7f0cf 100644 --- a/icuSources/common/uresbund.c +++ b/icuSources/common/uresbund.c @@ -1,6 +1,6 @@ /* ****************************************************************************** -* Copyright (C) 1997-2003, International Business Machines Corporation and * +* Copyright (C) 1997-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ****************************************************************************** * @@ -20,14 +20,19 @@ */ #include "unicode/ustring.h" - +#include "unicode/ucnv.h" #include "uresimp.h" +#include "ustr_imp.h" #include "cwchar.h" #include "ucln_cmn.h" #include "cmemory.h" #include "cstring.h" #include "uhash.h" +#include "unicode/uenum.h" +#include "uenumimp.h" +#include "ulocimp.h" #include "umutex.h" +#include "putilimp.h" /* @@ -134,29 +139,6 @@ static const ResourceData *getFallbackData(const UResourceBundle* resBundle, con } } -/** INTERNAL: Initializes the cache for resources */ -static void initCache(UErrorCode *status) { - UBool makeCache = FALSE; - umtx_lock(&resbMutex); - makeCache = (cache == NULL); - umtx_unlock(&resbMutex); - if(makeCache) { - UHashtable *newCache = uhash_open(hashEntry, compareEntries, status); - if (U_FAILURE(*status)) { - return; - } - umtx_lock(&resbMutex); - if(cache == NULL) { - cache = newCache; - newCache = NULL; - } - umtx_unlock(&resbMutex); - if(newCache != NULL) { - uhash_close(newCache); - } - } -} - /* Works just like ucnv_flushCache() */ /* TODO: figure out why fCountExisting may not go to zero. Do not make this function public yet. */ static int32_t ures_flushCache() @@ -189,6 +171,7 @@ static int32_t ures_flushCache() /* 04/05/2002 [weiv] fCountExisting should now be accurate. If it's not zero, that means that */ /* some resource bundles are still open somewhere. */ + /*U_ASSERT(resB->fCountExisting == 0);*/ if (resB->fCountExisting == 0) { rbDeletedNum++; uhash_removeElement(cache, e); @@ -209,24 +192,45 @@ static int32_t ures_flushCache() return rbDeletedNum; } -UBool ures_cleanup(void) +static UBool U_CALLCONV ures_cleanup(void) { if (cache != NULL) { ures_flushCache(); if (cache != NULL && uhash_count(cache) == 0) { uhash_close(cache); cache = NULL; - umtx_destroy(&resbMutex); } } + if (cache == NULL && resbMutex != NULL) { + umtx_destroy(&resbMutex); + } return (cache == NULL); } -U_CFUNC void ures_init(UErrorCode *status) { - umtx_init(&resbMutex); +/** INTERNAL: Initializes the cache for resources */ +static void initCache(UErrorCode *status) { + UBool makeCache = FALSE; + umtx_lock(&resbMutex); + makeCache = (cache == NULL); + umtx_unlock(&resbMutex); + if(makeCache) { + UHashtable *newCache = uhash_open(hashEntry, compareEntries, status); + if (U_FAILURE(*status)) { + return; + } + umtx_lock(&resbMutex); + if(cache == NULL) { + cache = newCache; + newCache = NULL; + ucln_common_registerCleanup(UCLN_COMMON_URES, ures_cleanup); + } + umtx_unlock(&resbMutex); + if(newCache != NULL) { + uhash_close(newCache); + } + } } - /** INTERNAL: sets the name (locale) of the resource bundle to given name */ static void setEntryName(UResourceDataEntry *res, char *name, UErrorCode *status) { @@ -243,6 +247,7 @@ static void setEntryName(UResourceDataEntry *res, char *name, UErrorCode *status /** * INTERNAL: Inits and opens an entry from a data DLL. + * CAUTION: resbMutex must be locked when calling this function. */ static UResourceDataEntry *init_entry(const char *localeID, const char *path, UErrorCode *status) { UResourceDataEntry *r = NULL; @@ -269,9 +274,7 @@ static UResourceDataEntry *init_entry(const char *localeID, const char *path, UE } if(path != NULL) { /* if we actually have path, we'll use it */ - if(uprv_strcmp(path, u_getDataDirectory()) != 0) { /* unless it is system default path */ - myPath = path; - } + myPath = path; } find.fName = name; @@ -374,6 +377,7 @@ static UResourceDataEntry *init_entry(const char *localeID, const char *path, UE } /* INTERNAL: */ +/* CAUTION: resbMutex must be locked when calling this function! */ static UResourceDataEntry *findFirstExisting(const char* path, char* name, UBool *isRoot, UBool *hasChopped, UBool *isDefault, UErrorCode* status) { UResourceDataEntry *r = NULL; UBool hasRealData = FALSE; @@ -407,6 +411,26 @@ static UResourceDataEntry *findFirstExisting(const char* path, char* name, UBool return r; } +static void ures_setIsStackObject( UResourceBundle* resB, UBool state) { + if(state) { + resB->fMagic1 = 0; + resB->fMagic2 = 0; + } else { + resB->fMagic1 = MAGIC1; + resB->fMagic2 = MAGIC2; + } +} + +static UBool ures_isStackObject(const UResourceBundle* resB) { + return((resB->fMagic1 == MAGIC1 && resB->fMagic2 == MAGIC2)?FALSE:TRUE); +} + + +U_CFUNC void ures_initStackObject(UResourceBundle* resB) { + uprv_memset(resB, 0, sizeof(UResourceBundle)); + ures_setIsStackObject(resB, TRUE); +} + static UResourceDataEntry *entryOpen(const char* path, const char* localeID, UErrorCode* status) { UErrorCode intStatus = U_ZERO_ERROR; UErrorCode parentStatus = U_ZERO_ERROR; @@ -514,6 +538,7 @@ static UResourceDataEntry *entryOpen(const char* path, const char* localeID, UEr /** * Functions to create and destroy resource bundles. + * CAUTION: resbMutex must be locked when calling this function. */ /* INTERNAL: */ static void entryCloseInt(UResourceDataEntry *resB) { @@ -569,21 +594,54 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r, const UChar *alias = res_getAlias(rdata, r, &len); if(len > 0) { /* we have an alias, now let's cut it up */ + char stackAlias[200]; char *chAlias = NULL, *path = NULL, *locale = NULL, *keyPath = NULL; - chAlias = (char *)uprv_malloc((len+1)*sizeof(char)); - /* test for NULL */ - if(chAlias == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - return NULL; + int32_t capacity; + + /* + * Allocate enough space for both the char * version + * of the alias and parent->fResPath. + * + * We do this so that res_findResource() can modify the path, + * which allows us to remove redundant _res_findResource() variants + * in uresdata.c. + * res_findResource() now NUL-terminates each segment so that table keys + * can always be compared with strcmp() instead of strncmp(). + * Saves code there and simplifies testing and code coverage. + * + * markus 2003oct17 + */ + ++len; /* count the terminating NUL */ + if(parent != NULL && parent->fResPath != NULL) { + capacity = uprv_strlen(parent->fResPath) + 1; + } else { + capacity = 0; + } + if(capacity < len) { + capacity = len; + } + if(capacity <= sizeof(stackAlias)) { + capacity = sizeof(stackAlias); + chAlias = stackAlias; + } else { + chAlias = (char *)uprv_malloc(capacity); + /* test for NULL */ + if(chAlias == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return NULL; } + } u_UCharsToChars(alias, chAlias, len); - chAlias[len] = 0; if(*chAlias == RES_PATH_SEPARATOR) { /* there is a path included */ locale = uprv_strchr(chAlias+1, RES_PATH_SEPARATOR); - *locale = 0; - locale++; + if(locale == NULL) { + locale = uprv_strchr(chAlias, 0); /* avoid locale == NULL to make code below work */ + } else { + *locale = 0; + locale++; + } path = chAlias+1; if(uprv_strcmp(path, "ICUDATA") == 0) { /* want ICU data */ path = NULL; @@ -614,23 +672,40 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r, /* first, we are going to get a corresponding parent * resource to the one we are searching. */ - const char* aKey = parent->fResPath; + char *aKey = parent->fResPath; if(aKey) { + uprv_strcpy(chAlias, aKey); /* allocated large enough above */ + aKey = chAlias; r = res_findResource(&(mainRes->fResData), mainRes->fRes, &aKey, &temp); } else { r = mainRes->fRes; } if(key) { - /* we need to make keyPath from parents fResPath and - * current key, if there is a key associated - */ - aKey = key; + /* we need to make keyPath from parent's fResPath and + * current key, if there is a key associated + */ + len = uprv_strlen(key) + 1; + if(len > capacity) { + capacity = len; + if(chAlias == stackAlias) { + chAlias = (char *)uprv_malloc(capacity); + } else { + chAlias = (char *)uprv_realloc(chAlias, capacity); + } + if(chAlias == NULL) { + ures_close(mainRes); + *status = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + } + uprv_memcpy(chAlias, key, len); + aKey = chAlias; r = res_findResource(&(mainRes->fResData), r, &aKey, &temp); } else if(index != -1) { /* if there is no key, but there is an index, try to get by the index */ /* here we have either a table or an array, so get the element */ - if(RES_GET_TYPE(r) == URES_TABLE) { - r = res_getTableItemByIndex(&(mainRes->fResData), r, index, &aKey); + if(RES_GET_TYPE(r) == URES_TABLE || RES_GET_TYPE(r) == URES_TABLE32) { + r = res_getTableItemByIndex(&(mainRes->fResData), r, index, (const char **)&aKey); } else { /* array */ r = res_getArrayItem(&(mainRes->fResData), r, index); } @@ -651,7 +726,7 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r, */ result = mainRes; while(*keyPath && U_SUCCESS(*status)) { - r = res_findResource(&(result->fResData), result->fRes, (const char**)&keyPath, &temp); + r = res_findResource(&(result->fResData), result->fRes, &keyPath, &temp); if(r == RES_BOGUS) { *status = U_MISSING_RESOURCE_ERROR; result = resB; @@ -664,8 +739,12 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r, } else { /* we failed to open the resource we're aliasing to */ *status = intStatus; } - uprv_free(chAlias); - ures_close(mainRes); + if(chAlias != stackAlias) { + uprv_free(chAlias); + } + if(mainRes != result) { + ures_close(mainRes); + } return result; } } else { @@ -687,6 +766,7 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r, } ures_setIsStackObject(resB, FALSE); resB->fResPath = NULL; + resB->fResPathLen = 0; } else { if(resB->fData != NULL) { entryClose(resB->fData); @@ -697,6 +777,9 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r, if(ures_isStackObject(resB) != FALSE) { ures_initStackObject(resB); } + if(parent != resB) { + ures_freeResPath(resB); + } } resB->fData = realData; entryIncrease(resB->fData); @@ -704,8 +787,9 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r, resB->fIsTopLevel = FALSE; resB->fIndex = -1; resB->fKey = key; - ures_freeResPath(resB); - if(parent->fResPath) { + resB->fParentRes = parent; + resB->fTopLevelData = parent->fTopLevelData; + if(parent->fResPath && parent != resB) { ures_appendResPath(resB, parent->fResPath, parent->fResPathLen); } if(key != NULL) { @@ -759,6 +843,7 @@ UResourceBundle *ures_copyResb(UResourceBundle *r, const UResourceBundle *origin } uprv_memcpy(r, original, sizeof(UResourceBundle)); r->fResPath = NULL; + r->fResPathLen = 0; if(original->fResPath) { ures_appendResPath(r, original->fResPath, original->fResPathLen); } @@ -794,6 +879,7 @@ U_CAPI const UChar* U_EXPORT2 ures_getString(const UResourceBundle* resB, int32_ case URES_BINARY: case URES_ARRAY: case URES_TABLE: + case URES_TABLE32: default: *status = U_RESOURCE_TYPE_MISMATCH; } @@ -818,6 +904,7 @@ U_CAPI const uint8_t* U_EXPORT2 ures_getBinary(const UResourceBundle* resB, int3 case URES_INT_VECTOR: case URES_ARRAY: case URES_TABLE: + case URES_TABLE32: default: *status = U_RESOURCE_TYPE_MISMATCH; } @@ -842,6 +929,7 @@ U_CAPI const int32_t* U_EXPORT2 ures_getIntVector(const UResourceBundle* resB, i case URES_ARRAY: case URES_BINARY: case URES_TABLE: + case URES_TABLE32: default: *status = U_RESOURCE_TYPE_MISMATCH; } @@ -882,14 +970,17 @@ U_CAPI uint32_t U_EXPORT2 ures_getUInt(const UResourceBundle* resB, UErrorCode * } -U_CAPI UResType U_EXPORT2 ures_getType(UResourceBundle *resB) { +U_CAPI UResType U_EXPORT2 ures_getType(const UResourceBundle *resB) { + UResType type; + if(resB == NULL) { return URES_NONE; } - return (UResType) (RES_GET_TYPE(resB->fRes)); + type = (UResType) RES_GET_TYPE(resB->fRes); + return type == URES_TABLE32 ? URES_TABLE : type; } -U_CAPI const char * U_EXPORT2 ures_getKey(UResourceBundle *resB) { +U_CAPI const char * U_EXPORT2 ures_getKey(const UResourceBundle *resB) { if(resB == NULL) { return NULL; } @@ -897,7 +988,7 @@ U_CAPI const char * U_EXPORT2 ures_getKey(UResourceBundle *resB) { return(resB->fKey); } -U_CAPI int32_t U_EXPORT2 ures_getSize(UResourceBundle *resB) { +U_CAPI int32_t U_EXPORT2 ures_getSize(const UResourceBundle *resB) { if(resB == NULL) { return 0; } @@ -924,7 +1015,7 @@ U_CAPI void U_EXPORT2 ures_resetIterator(UResourceBundle *resB){ resB->fIndex = -1; } -U_CAPI UBool U_EXPORT2 ures_hasNext(UResourceBundle *resB) { +U_CAPI UBool U_EXPORT2 ures_hasNext(const UResourceBundle *resB) { if(resB == NULL) { return FALSE; } @@ -952,6 +1043,7 @@ U_CAPI const UChar* U_EXPORT2 ures_getNextString(UResourceBundle *resB, int32_t* case URES_STRING: return res_getString(&(resB->fResData), resB->fRes, len); case URES_TABLE: + case URES_TABLE32: r = res_getTableItemByIndex(&(resB->fResData), resB->fRes, resB->fIndex, key); if(r == RES_BOGUS && resB->fHasFallback) { /* TODO: do the fallback */ @@ -1000,6 +1092,7 @@ U_CAPI UResourceBundle* U_EXPORT2 ures_getNextResource(UResourceBundle *resB, UR case URES_STRING: return ures_copyResb(fillIn, resB, status); case URES_TABLE: + case URES_TABLE32: r = res_getTableItemByIndex(&(resB->fResData), resB->fRes, resB->fIndex, &key); if(r == RES_BOGUS && resB->fHasFallback) { /* TODO: do the fallback */ @@ -1042,6 +1135,7 @@ U_CAPI UResourceBundle* U_EXPORT2 ures_getByIndex(const UResourceBundle *resB, i case URES_STRING: return ures_copyResb(fillIn, resB, status); case URES_TABLE: + case URES_TABLE32: r = res_getTableItemByIndex(&(resB->fResData), resB->fRes, indexR, &key); if(r == RES_BOGUS && resB->fHasFallback) { /* TODO: do the fallback */ @@ -1084,6 +1178,7 @@ U_CAPI const UChar* U_EXPORT2 ures_getStringByIndex(const UResourceBundle *resB, case URES_STRING: return res_getString(&(resB->fResData), resB->fRes, len); case URES_TABLE: + case URES_TABLE32: r = res_getTableItemByIndex(&(resB->fResData), resB->fRes, indexS, &key); if(r == RES_BOGUS && resB->fHasFallback) { /* TODO: do the fallback */ @@ -1120,16 +1215,21 @@ ures_findResource(const char* path, UResourceBundle *fillIn, UErrorCode *status) char *packageName = NULL; char *pathToResource = NULL; char *locale = NULL, *localeEnd = NULL; + int32_t length; + if(status == NULL || U_FAILURE(*status)) { return result; } - pathToResource = (char *)uprv_malloc((uprv_strlen(path)+1)*sizeof(char)); + + length = uprv_strlen(path)+1; + pathToResource = (char *)uprv_malloc(length*sizeof(char)); /* test for NULL */ if(pathToResource == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; return result; - } - uprv_strcpy(pathToResource, path); + } + uprv_memcpy(pathToResource, path, length); + locale = pathToResource; if(*pathToResource == RES_PATH_SEPARATOR) { /* there is a path specification */ pathToResource++; @@ -1143,7 +1243,7 @@ ures_findResource(const char* path, UResourceBundle *fillIn, UErrorCode *status) } } - localeEnd = strchr(locale, RES_PATH_SEPARATOR); + localeEnd = uprv_strchr(locale, RES_PATH_SEPARATOR); if(localeEnd != NULL) { *localeEnd = 0; } @@ -1163,11 +1263,10 @@ ures_findResource(const char* path, UResourceBundle *fillIn, UErrorCode *status) } U_CAPI UResourceBundle* U_EXPORT2 -ures_findSubResource(const UResourceBundle *resB, const char* path, UResourceBundle *fillIn, UErrorCode *status) +ures_findSubResource(const UResourceBundle *resB, char* path, UResourceBundle *fillIn, UErrorCode *status) { Resource res = RES_BOGUS; UResourceBundle *result = fillIn; - const char *pathToResource = path; const char *key; if(status == NULL || U_FAILURE(*status)) { @@ -1175,16 +1274,81 @@ ures_findSubResource(const UResourceBundle *resB, const char* path, UResourceBun } /* here we do looping and circular alias checking */ + /* this loop is here because aliasing is resolved on this level, not on res level */ + /* so, when we encounter an alias, it is not an aggregate resource, so we return */ + do { + res = res_findResource(&(resB->fResData), resB->fRes, &path, &key); + if(res != RES_BOGUS) { + result = init_resb_result(&(resB->fResData), res, key, -1, resB->fData, resB, 0, fillIn, status); + resB = result; + } else { + *status = U_MISSING_RESOURCE_ERROR; + break; + } + } while(uprv_strlen(path)); /* there is more stuff in the path */ - res = res_findResource(&(resB->fResData), resB->fRes, &pathToResource, &key); + return result; +} - if(res != RES_BOGUS) { - result = init_resb_result(&(resB->fResData), res, key, -1, resB->fData, resB, 0, fillIn, status); - } else { - *status = U_MISSING_RESOURCE_ERROR; - } +U_CAPI UResourceBundle* U_EXPORT2 +ures_getByKeyWithFallback(const UResourceBundle *resB, + const char* inKey, + UResourceBundle *fillIn, + UErrorCode *status) { + Resource res = RES_BOGUS; + /*UResourceDataEntry *realData = NULL;*/ + const char *key = inKey; + UResourceBundle *helper = NULL; - return result; + if (status==NULL || U_FAILURE(*status)) { + return fillIn; + } + if(resB == NULL) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return fillIn; + } + + if(RES_GET_TYPE(resB->fRes) == URES_TABLE || RES_GET_TYPE(resB->fRes) == URES_TABLE32) { + int32_t t; + res = res_getTableItemByKey(&(resB->fResData), resB->fRes, &t, &key); + if(res == RES_BOGUS) { + UResourceDataEntry *dataEntry = resB->fData; + char path[256]; + char* myPath = path; + + while(res == RES_BOGUS && dataEntry->fParent != NULL) { /* Otherwise, we'll look in parents */ + dataEntry = dataEntry->fParent; + if(dataEntry->fBogus == U_ZERO_ERROR) { + uprv_strncpy(path, resB->fResPath, resB->fResPathLen); + uprv_strcpy(path+resB->fResPathLen, inKey); + myPath = path; + key = inKey; + do { + res = res_findResource(&(dataEntry->fData), dataEntry->fData.rootRes, &myPath, &key); + if (RES_GET_TYPE(res) == URES_ALIAS && *myPath) { + /* We hit an alias, but we didn't finish following the path. */ + helper = init_resb_result(&(dataEntry->fData), res, inKey, -1, dataEntry, resB, 0, helper, status); + dataEntry = helper->fData; + } + } while(uprv_strlen(myPath)); + } + } + /*const ResourceData *rd = getFallbackData(resB, &key, &realData, &res, status);*/ + if(res != RES_BOGUS) { + /* check if resB->fResPath gives the right name here */ + fillIn = init_resb_result(&(dataEntry->fData), res, inKey, -1, dataEntry, resB, 0, fillIn, status); + } else { + *status = U_MISSING_RESOURCE_ERROR; + } + } else { + fillIn = init_resb_result(&(resB->fResData), res, key, -1, resB->fData, resB, 0, fillIn, status); + } + } + else { + *status = U_RESOURCE_TYPE_MISMATCH; + } + ures_close(helper); + return fillIn; } @@ -1201,7 +1365,7 @@ U_CAPI UResourceBundle* U_EXPORT2 ures_getByKey(const UResourceBundle *resB, con return fillIn; } - if(RES_GET_TYPE(resB->fRes) == URES_TABLE) { + if(RES_GET_TYPE(resB->fRes) == URES_TABLE || RES_GET_TYPE(resB->fRes) == URES_TABLE32) { int32_t t; res = res_getTableItemByKey(&(resB->fResData), resB->fRes, &t, &key); if(res == RES_BOGUS) { @@ -1253,7 +1417,7 @@ U_CAPI const UChar* U_EXPORT2 ures_getStringByKey(const UResourceBundle *resB, c return NULL; } - if(RES_GET_TYPE(resB->fRes) == URES_TABLE) { + if(RES_GET_TYPE(resB->fRes) == URES_TABLE || RES_GET_TYPE(resB->fRes) == URES_TABLE32) { int32_t t=0; res = res_getTableItemByKey(&(resB->fResData), resB->fRes, &t, &key); @@ -1266,6 +1430,7 @@ U_CAPI const UChar* U_EXPORT2 ures_getStringByKey(const UResourceBundle *resB, c switch (RES_GET_TYPE(res)) { case URES_STRING: case URES_TABLE: + case URES_TABLE32: case URES_ARRAY: return res_getString(rd, res, len); case URES_ALIAS: @@ -1289,6 +1454,7 @@ U_CAPI const UChar* U_EXPORT2 ures_getStringByKey(const UResourceBundle *resB, c switch (RES_GET_TYPE(res)) { case URES_STRING: case URES_TABLE: + case URES_TABLE32: case URES_ARRAY: return res_getString(&(resB->fResData), res, len); case URES_ALIAS: @@ -1344,6 +1510,35 @@ ures_getLocale(const UResourceBundle* resourceBundle, UErrorCode* status) } } +U_CAPI const char* U_EXPORT2 +ures_getLocaleByType(const UResourceBundle* resourceBundle, + ULocDataLocaleType type, + UErrorCode* status) { + if (status==NULL || U_FAILURE(*status)) { + return NULL; + } + if (!resourceBundle) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } else { + switch(type) { + case ULOC_ACTUAL_LOCALE: + return resourceBundle->fData->fName; + break; + case ULOC_VALID_LOCALE: + return resourceBundle->fTopLevelData->fName; + break; + case ULOC_REQUESTED_LOCALE: + return NULL; + break; + default: + *status = U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + } +} + + /* U_CFUNC void ures_setResPath(UResourceBundle *resB, const char* toAdd) { if(resB->fResPath == NULL) { @@ -1388,6 +1583,7 @@ U_CFUNC void ures_freeResPath(UResourceBundle *resB) { resB->fResPathLen = 0; } + U_CFUNC const char* ures_getName(const UResourceBundle* resB) { if(resB == NULL) { return NULL; @@ -1442,18 +1638,13 @@ ures_openFillIn(UResourceBundle *r, const char* path, r->fSize = res_countArrayItems(&(r->fResData), r->fRes); /*r->fParent = RES_BOGUS;*/ /*r->fResPath = NULL;*/ + r->fParentRes = NULL; + r->fTopLevelData = r->fData; + ures_freeResPath(r); - /* - if(r->fData->fPath != NULL) { - ures_setResPath(r, r->fData->fPath); - ures_appendResPath(r, RES_PATH_PACKAGE_S); - ures_appendResPath(r, r->fData->fName); - } else { - ures_setResPath(r, r->fData->fName); - } - */ } } + U_CAPI UResourceBundle* U_EXPORT2 ures_open(const char* path, const char* localeID, @@ -1469,7 +1660,7 @@ ures_open(const char* path, } /* first "canonicalize" the locale ID */ - length = uloc_getName(localeID, canonLocaleID, sizeof(canonLocaleID), status); + length = uloc_getBaseName(localeID, canonLocaleID, sizeof(canonLocaleID), status); if(U_FAILURE(*status) || *status == U_STRING_NOT_TERMINATED_WARNING) { *status = U_ILLEGAL_ARGUMENT_ERROR; return NULL; @@ -1492,6 +1683,8 @@ ures_open(const char* path, uprv_free(r); return NULL; } + r->fParentRes = NULL; + r->fTopLevelData = r->fData; hasData = r->fData; while(hasData->fBogus != U_ZERO_ERROR) { @@ -1513,6 +1706,7 @@ ures_open(const char* path, /*r->fParent = RES_BOGUS;*/ r->fSize = res_countArrayItems(&(r->fResData), r->fRes); r->fResPath = NULL; + r->fResPathLen = 0; /* if(r->fData->fPath != NULL) { ures_setResPath(r, r->fData->fPath); @@ -1527,31 +1721,6 @@ ures_open(const char* path, return r; } -U_CAPI UResourceBundle* U_EXPORT2 ures_openU(const UChar* myPath, - const char* localeID, - UErrorCode* status) -{ - UResourceBundle *r; - int32_t pathSize = u_strlen(myPath) + 1; - char *path = (char *)uprv_malloc(pathSize); - /* test for NULL */ - if(path == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - return NULL; - } - - u_UCharsToChars(myPath, path, pathSize); - - r = ures_open(path, localeID, status); - uprv_free(path); - - if (U_FAILURE(*status)) { - return NULL; - } - - return r; -} - /** * Opens a resource bundle without "canonicalizing" the locale name. No fallback will be performed * or sought. However, alias substitution will happen! @@ -1559,6 +1728,7 @@ U_CAPI UResourceBundle* U_EXPORT2 ures_openU(const UChar* myPath, U_CAPI UResourceBundle* U_EXPORT2 ures_openDirect(const char* path, const char* localeID, UErrorCode* status) { UResourceBundle *r; + UErrorCode subStatus = U_ZERO_ERROR; if(status == NULL || U_FAILURE(*status)) { return NULL; @@ -1574,12 +1744,13 @@ ures_openDirect(const char* path, const char* localeID, UErrorCode* status) { r->fIsTopLevel = TRUE; ures_setIsStackObject(r, FALSE); r->fIndex = -1; - r->fData = entryOpen(path, localeID, status); - if(U_FAILURE(*status)) { + r->fData = entryOpen(path, localeID, &subStatus); + if(U_FAILURE(subStatus)) { + *status = subStatus; uprv_free(r); return NULL; } - if(*status != U_ZERO_ERROR /*r->fData->fBogus != U_ZERO_ERROR*/) { + if(subStatus != U_ZERO_ERROR /*r->fData->fBogus != U_ZERO_ERROR*/) { /* we didn't find one we were looking for - so openDirect */ /* should fail */ entryClose(r->fData); @@ -1597,36 +1768,11 @@ ures_openDirect(const char* path, const char* localeID, UErrorCode* status) { /*r->fParent = RES_BOGUS;*/ r->fSize = res_countArrayItems(&(r->fResData), r->fRes); r->fResPath = NULL; - /* - if(r->fData->fPath != NULL) { - ures_setResPath(r, r->fData->fPath); - ures_appendResPath(r, RES_PATH_PACKAGE_S); - ures_appendResPath(r, r->fData->fName); - } else { - ures_setResPath(r, r->fData->fName); - } - */ - return r; -} - -U_CFUNC void ures_setIsStackObject( UResourceBundle* resB, UBool state) { - if(state) { - resB->fMagic1 = 0; - resB->fMagic2 = 0; - } else { - resB->fMagic1 = MAGIC1; - resB->fMagic2 = MAGIC2; - } -} - -U_CFUNC UBool ures_isStackObject(UResourceBundle* resB) { - return((resB->fMagic1 == MAGIC1 && resB->fMagic2 == MAGIC2)?FALSE:TRUE); -} - + r->fResPathLen = 0; + r->fParentRes = NULL; + r->fTopLevelData = r->fData; -U_CFUNC void ures_initStackObject(UResourceBundle* resB) { - memset(resB, 0, sizeof(UResourceBundle)); - ures_setIsStackObject(resB, TRUE); + return r; } /** @@ -1640,23 +1786,23 @@ ures_countArrayItems(const UResourceBundle* resourceBundle, { UResourceBundle resData; ures_initStackObject(&resData); - if (status==NULL || U_FAILURE(*status)) { - return 0; - } - if(resourceBundle == NULL) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } + if (status==NULL || U_FAILURE(*status)) { + return 0; + } + if(resourceBundle == NULL) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } ures_getByKey(resourceBundle, resourceKey, &resData, status); - + if(resData.fResData.data != NULL) { - int32_t result = res_countArrayItems(&resData.fResData, resData.fRes); - ures_close(&resData); - return result; + int32_t result = res_countArrayItems(&resData.fResData, resData.fRes); + ures_close(&resData); + return result; } else { - *status = U_MISSING_RESOURCE_ERROR; - ures_close(&resData); - return 0; + *status = U_MISSING_RESOURCE_ERROR; + ures_close(&resData); + return 0; } } @@ -1675,6 +1821,12 @@ ures_close(UResourceBundle* resB) if(ures_isStackObject(resB) == FALSE) { uprv_free(resB); } + else { +#if 0 /*U_DEBUG*/ + /* poison the data */ + uprv_memset(resB, -1, sizeof(UResourceBundle)); +#endif + } } } @@ -1692,7 +1844,7 @@ ures_getVersionNumber(const UResourceBundle* resourceBundle) int32_t len; const UChar* minor_version = ures_getStringByKey(resourceBundle, kVersionTag, &minor_len, &status); - + /* Determine the length of of the final version string. This is */ /* the length of the major part + the length of the separator */ /* (==1) + the length of the minor part (+ 1 for the zero byte at */ @@ -1705,13 +1857,13 @@ ures_getVersionNumber(const UResourceBundle* resourceBundle) ((UResourceBundle *)resourceBundle)->fVersion = (char *)uprv_malloc(1 + len); - + if(minor_len > 0) { u_UCharsToChars(minor_version, resourceBundle->fVersion , minor_len); resourceBundle->fVersion[len] = '\0'; } else { - uprv_strcat(resourceBundle->fVersion, kDefaultMinorVersion); + uprv_strcpy(resourceBundle->fVersion, kDefaultMinorVersion); } } @@ -1724,4 +1876,516 @@ U_CAPI void U_EXPORT2 ures_getVersion(const UResourceBundle* resB, UVersionInfo u_versionFromString(versionInfo, ures_getVersionNumber(resB)); } +/** Tree support functions *******************************/ +#define INDEX_LOCALE_NAME "res_index" +#define INDEX_TAG "InstalledLocales" +#define DEFAULT_TAG "default" + +#if defined(URES_TREE_DEBUG) +#include +#endif + +typedef struct ULocalesContext { + UResourceBundle installed; + UResourceBundle curr; +} ULocalesContext; + +static void U_CALLCONV +ures_loc_closeLocales(UEnumeration *enumerator) { + ULocalesContext *ctx = (ULocalesContext *)enumerator->context; + ures_close(&ctx->curr); + ures_close(&ctx->installed); + uprv_free(ctx); + uprv_free(enumerator); +} + +static int32_t U_CALLCONV +ures_loc_countLocales(UEnumeration *en, UErrorCode *status) { + ULocalesContext *ctx = (ULocalesContext *)en->context; + return ures_getSize(&ctx->installed); +} + +static const char* U_CALLCONV +ures_loc_nextLocale(UEnumeration* en, + int32_t* resultLength, + UErrorCode* status) { + ULocalesContext *ctx = (ULocalesContext *)en->context; + UResourceBundle *res = &(ctx->installed); + UResourceBundle *k = NULL; + const char *result = NULL; + int32_t len = 0; + if(ures_hasNext(res) && (k = ures_getNextResource(res, &ctx->curr, status))) { + result = ures_getKey(k); + len = uprv_strlen(result); + } + if (resultLength) { + *resultLength = len; + } + return result; +} + +static void U_CALLCONV +ures_loc_resetLocales(UEnumeration* en, + UErrorCode* status) { + UResourceBundle *res = &((ULocalesContext *)en->context)->installed; + ures_resetIterator(res); +} + + +static const UEnumeration gLocalesEnum = { + NULL, + NULL, + ures_loc_closeLocales, + ures_loc_countLocales, + uenum_unextDefault, + ures_loc_nextLocale, + ures_loc_resetLocales +}; + + +U_CAPI UEnumeration* U_EXPORT2 +ures_openAvailableLocales(const char *path, UErrorCode *status) +{ + UResourceBundle *index = NULL; + UEnumeration *en = NULL; + ULocalesContext *myContext = NULL; + + if(U_FAILURE(*status)) { + return NULL; + } + myContext = uprv_malloc(sizeof(ULocalesContext)); + en = (UEnumeration *)uprv_malloc(sizeof(UEnumeration)); + if(!en || !myContext) { + *status = U_MEMORY_ALLOCATION_ERROR; + uprv_free(en); + uprv_free(myContext); + return NULL; + } + uprv_memcpy(en, &gLocalesEnum, sizeof(UEnumeration)); + + ures_initStackObject(&myContext->installed); + ures_initStackObject(&myContext->curr); + index = ures_openDirect(path, INDEX_LOCALE_NAME, status); + ures_getByKey(index, INDEX_TAG, &myContext->installed, status); + if(U_SUCCESS(*status)) { +#if defined(URES_TREE_DEBUG) + fprintf(stderr, "Got %s::%s::[%s] : %s\n", + path, INDEX_LOCALE_NAME, INDEX_TAG, ures_getKey(&myContext->installed)); +#endif + en->context = myContext; + } else { +#if defined(URES_TREE_DEBUG) + fprintf(stderr, "%s open failed - %s\n", path, u_errorName(*status)); +#endif + ures_close(&myContext->installed); + uprv_free(myContext); + uprv_free(en); + en = NULL; + } + + ures_close(index); + + return en; +} + +U_CAPI int32_t U_EXPORT2 +ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, + const char *path, const char *resName, const char *keyword, const char *locid, + UBool *isAvailable, UBool omitDefault, UErrorCode *status) +{ + char kwVal[1024] = ""; /* value of keyword 'keyword' */ + char defVal[1024] = ""; /* default value for given locale */ + char defLoc[1024] = ""; /* default value for given locale */ + char base[1024] = ""; /* base locale */ + char found[1024]; + char parent[1024]; + char full[1024] = ""; + UResourceBundle bund1, bund2; + UResourceBundle *res = NULL; + UErrorCode subStatus = U_ZERO_ERROR; + int32_t length = 0; + if(U_FAILURE(*status)) return 0; + if(isAvailable) { + *isAvailable = TRUE; + } + uloc_getKeywordValue(locid, keyword, kwVal, 1024-1,&subStatus); + if(!uprv_strcmp(kwVal, DEFAULT_TAG)) { + kwVal[0]=0; + } + uloc_getBaseName(locid, base, 1024-1,&subStatus); +#if defined(URES_TREE_DEBUG) + fprintf(stderr, "getFunctionalEquivalent: \"%s\" [%s=%s] in %s - %s\n", + locid, keyword, kwVal, base, u_errorName(subStatus)); +#endif + ures_initStackObject(&bund1); + ures_initStackObject(&bund2); + + + uprv_strcpy(parent, base); + uprv_strcpy(found, base); + + if(U_FAILURE(subStatus)) { + *status = subStatus; + return 0; + } + + do { + subStatus = U_ZERO_ERROR; + res = ures_open(path, parent, &subStatus); + if(((subStatus == U_USING_FALLBACK_WARNING) || + (subStatus == U_USING_DEFAULT_WARNING)) && isAvailable) { + *isAvailable = FALSE; + } + isAvailable = NULL; /* only want to set this the first time around */ + +#if defined(URES_TREE_DEBUG) + fprintf(stderr, "%s;%s -> %s [%s]\n", path?path:"ICUDATA", parent, u_errorName(subStatus), ures_getLocale(res, &subStatus)); +#endif + if(U_FAILURE(subStatus)) { + *status = subStatus; + } else if(subStatus == U_ZERO_ERROR) { + ures_getByKey(res,resName,&bund1, &subStatus); + if(subStatus == U_ZERO_ERROR) { + const UChar *defUstr; + int32_t defLen; + /* look for default item */ +#if defined(URES_TREE_DEBUG) + fprintf(stderr, "%s;%s : loaded default -> %s\n", + path?path:"ICUDATA", parent, u_errorName(subStatus)); +#endif + defUstr = ures_getStringByKey(&bund1, DEFAULT_TAG, &defLen, &subStatus); + if(U_SUCCESS(subStatus) && defLen) { + u_UCharsToChars(defUstr, defVal, u_strlen(defUstr)); +#if defined(URES_TREE_DEBUG) + fprintf(stderr, "%s;%s -> default %s=%s, %s\n", + path?path:"ICUDATA", parent, keyword, defVal, u_errorName(subStatus)); +#endif + uprv_strcpy(defLoc, parent); + if(kwVal[0]==0) { + uprv_strcpy(kwVal, defVal); +#if defined(URES_TREE_DEBUG) + fprintf(stderr, "%s;%s -> kwVal = %s\n", + path?path:"ICUDATA", parent, keyword, kwVal); +#endif + } + } + } + } + + subStatus = U_ZERO_ERROR; + + uprv_strcpy(found, parent); + uloc_getParent(found,parent,1023,&subStatus); + ures_close(res); + } while(!defVal[0] && *found && U_SUCCESS(*status)); + + /* Now, see if we can find the kwVal collator.. start the search over.. */ + uprv_strcpy(parent, base); + uprv_strcpy(found, base); + + do { + subStatus = U_ZERO_ERROR; + res = ures_open(path, parent, &subStatus); + if((subStatus == U_USING_FALLBACK_WARNING) && isAvailable) { + *isAvailable = FALSE; + } + isAvailable = NULL; /* only want to set this the first time around */ + +#if defined(URES_TREE_DEBUG) + fprintf(stderr, "%s;%s -> %s (looking for %s)\n", + path?path:"ICUDATA", parent, u_errorName(subStatus), kwVal); +#endif + if(U_FAILURE(subStatus)) { + *status = subStatus; + } else if(subStatus == U_ZERO_ERROR) { + ures_getByKey(res,resName,&bund1, &subStatus); +#if defined(URES_TREE_DEBUG) +/**/ fprintf(stderr,"@%d [%s] %s\n", __LINE__, resName, u_errorName(subStatus)); +#endif + if(subStatus == U_ZERO_ERROR) { + ures_getByKey(&bund1, kwVal, &bund2, &subStatus); +#if defined(URES_TREE_DEBUG) +/**/ fprintf(stderr,"@%d [%s] %s\n", __LINE__, kwVal, u_errorName(subStatus)); +#endif + if(subStatus == U_ZERO_ERROR) { +#if defined(URES_TREE_DEBUG) + fprintf(stderr, "%s;%s -> full0 %s=%s, %s\n", + path?path:"ICUDATA", parent, keyword, kwVal, u_errorName(subStatus)); +#endif + uprv_strcpy(full, parent); + if(*full == 0) { + uprv_strcpy(full, "root"); + } + /* now, recalculate default kw if need be */ + if(uprv_strlen(defLoc) > uprv_strlen(full)) { + const UChar *defUstr; + int32_t defLen; + /* look for default item */ +#if defined(URES_TREE_DEBUG) + fprintf(stderr, "%s;%s -> recalculating Default0\n", + path?path:"ICUDATA", full); +#endif + defUstr = ures_getStringByKey(&bund1, DEFAULT_TAG, &defLen, &subStatus); + if(U_SUCCESS(subStatus) && defLen) { + u_UCharsToChars(defUstr, defVal, u_strlen(defUstr)); +#if defined(URES_TREE_DEBUG) + fprintf(stderr, "%s;%s -> default0 %s=%s, %s\n", + path?path:"ICUDATA", full, keyword, defVal, u_errorName(subStatus)); +#endif + uprv_strcpy(defLoc, full); + } + } /* end of recalculate default KW */ +#if defined(URES_TREE_DEBUG) + else { + fprintf(stderr, "No trim0, %s <= %s\n", defLoc, full); + } +#endif + } else { +#if defined(URES_TREE_DEBUG) + fprintf(stderr, "err=%s in %s looking for %s\n", + u_errorName(subStatus), parent, kwVal); +#endif + } + } + } + + subStatus = U_ZERO_ERROR; + + uprv_strcpy(found, parent); + uloc_getParent(found,parent,1023,&subStatus); + ures_close(res); + } while(!full[0] && *found && U_SUCCESS(*status)); + + if((full[0]==0) && uprv_strcmp(kwVal, defVal)) { +#if defined(URES_TREE_DEBUG) + fprintf(stderr, "Failed to locate kw %s - try default %s\n", kwVal, defVal); +#endif + uprv_strcpy(kwVal, defVal); + uprv_strcpy(parent, base); + uprv_strcpy(found, base); + + do { /* search for 'default' named item */ + subStatus = U_ZERO_ERROR; + res = ures_open(path, parent, &subStatus); + if((subStatus == U_USING_FALLBACK_WARNING) && isAvailable) { + *isAvailable = FALSE; + } + isAvailable = NULL; /* only want to set this the first time around */ + +#if defined(URES_TREE_DEBUG) + fprintf(stderr, "%s;%s -> %s (looking for default %s)\n", + path?path:"ICUDATA", parent, u_errorName(subStatus), kwVal); +#endif + if(U_FAILURE(subStatus)) { + *status = subStatus; + } else if(subStatus == U_ZERO_ERROR) { + ures_getByKey(res,resName,&bund1, &subStatus); + if(subStatus == U_ZERO_ERROR) { + ures_getByKey(&bund1, kwVal, &bund2, &subStatus); + if(subStatus == U_ZERO_ERROR) { +#if defined(URES_TREE_DEBUG) + fprintf(stderr, "%s;%s -> full1 %s=%s, %s\n", path?path:"ICUDATA", + parent, keyword, kwVal, u_errorName(subStatus)); +#endif + uprv_strcpy(full, parent); + if(*full == 0) { + uprv_strcpy(full, "root"); + } + + /* now, recalculate default kw if need be */ + if(uprv_strlen(defLoc) > uprv_strlen(full)) { + const UChar *defUstr; + int32_t defLen; + /* look for default item */ +#if defined(URES_TREE_DEBUG) + fprintf(stderr, "%s;%s -> recalculating Default1\n", + path?path:"ICUDATA", full); +#endif + defUstr = ures_getStringByKey(&bund1, DEFAULT_TAG, &defLen, &subStatus); + if(U_SUCCESS(subStatus) && defLen) { + u_UCharsToChars(defUstr, defVal, u_strlen(defUstr)); +#if defined(URES_TREE_DEBUG) + fprintf(stderr, "%s;%s -> default %s=%s, %s\n", + path?path:"ICUDATA", full, keyword, defVal, u_errorName(subStatus)); +#endif + uprv_strcpy(defLoc, full); + } + } /* end of recalculate default KW */ +#if defined(URES_TREE_DEBUG) + else { + fprintf(stderr, "No trim1, %s <= %s\n", defLoc, full); + } +#endif + } + } + } + subStatus = U_ZERO_ERROR; + + uprv_strcpy(found, parent); + uloc_getParent(found,parent,1023,&subStatus); + ures_close(res); + } while(!full[0] && *found && U_SUCCESS(*status)); + } + + if(U_SUCCESS(*status)) { + if(!full[0]) { +#if defined(URES_TREE_DEBUG) + fprintf(stderr, "Still could not load keyword %s=%s\n", keyword, kwVal); +#endif + *status = U_MISSING_RESOURCE_ERROR; + } else if(omitDefault) { +#if defined(URES_TREE_DEBUG) + fprintf(stderr,"Trim? full=%s, defLoc=%s, found=%s\n", full, defLoc, found); +#endif + if(uprv_strlen(defLoc) <= uprv_strlen(full)) { + /* found the keyword in a *child* of where the default tag was present. */ + if(!uprv_strcmp(kwVal, defVal)) { /* if the requested kw is default, */ + /* and the default is in or in an ancestor of the current locale */ +#if defined(URES_TREE_DEBUG) + fprintf(stderr, "Removing unneeded var %s=%s\n", keyword, kwVal); +#endif + kwVal[0]=0; + } + } + } + uprv_strcpy(found, full); + if(kwVal[0]) { + uprv_strcat(found, "@"); + uprv_strcat(found, keyword); + uprv_strcat(found, "="); + uprv_strcat(found, kwVal); + } else if(!omitDefault) { + uprv_strcat(found, "@"); + uprv_strcat(found, keyword); + uprv_strcat(found, "="); + uprv_strcat(found, defVal); + } + } + /* we found the default locale - no need to repeat it.*/ + + ures_close(&bund1); + ures_close(&bund2); + + length = uprv_strlen(found); + + if(U_SUCCESS(*status)) { + int32_t copyLength = uprv_min(length, resultCapacity); + if(copyLength>0) { + uprv_strncpy(result, found, copyLength); + } + if(length == 0) { + *status = U_MISSING_RESOURCE_ERROR; + } + } else { + length = 0; + result[0]=0; + } + return u_terminateChars(result, resultCapacity, length, status); +} + +U_CAPI UEnumeration* U_EXPORT2 +ures_getKeywordValues(const char *path, const char *keyword, UErrorCode *status) +{ +#define VALUES_BUF_SIZE 2048 +#define VALUES_LIST_SIZE 512 + + char valuesBuf[VALUES_BUF_SIZE]; + int32_t valuesIndex = 0; + const char *valuesList[VALUES_LIST_SIZE]; + int32_t valuesCount = 0; + + const char *locale; + int32_t locLen; + + UEnumeration *locs = NULL; + + UResourceBundle item; + UResourceBundle subItem; + + ures_initStackObject(&item); + ures_initStackObject(&subItem); + locs = ures_openAvailableLocales(path, status); + + if(U_FAILURE(*status)) { + ures_close(&item); + ures_close(&subItem); + return NULL; + } + + valuesBuf[0]=0; + valuesBuf[1]=0; + + while((locale = uenum_next(locs, &locLen, status))) { + UResourceBundle *bund = NULL; + UResourceBundle *subPtr = NULL; + UErrorCode subStatus = U_ZERO_ERROR; /* don't fail if a bundle is unopenable */ + bund = ures_openDirect(path, locale, &subStatus); + +#if defined(URES_TREE_DEBUG) + if(!bund || U_FAILURE(subStatus)) { + fprintf(stderr, "%s-%s values: Can't open %s locale - skipping. (%s)\n", + path?path:"", keyword, locale, u_errorName(subStatus)); + } +#endif + + ures_getByKey(bund, keyword, &item, &subStatus); + + if(!bund || U_FAILURE(subStatus)) { +#if defined(URES_TREE_DEBUG) + fprintf(stderr, "%s-%s values: Can't find in %s - skipping. (%s)\n", + path?path:"", keyword, locale, u_errorName(subStatus)); +#endif + ures_close(bund); + bund = NULL; + continue; + } + + while((subPtr = ures_getNextResource(&item,&subItem,&subStatus)) + && U_SUCCESS(subStatus)) { + const char *k; + int32_t i; + k = ures_getKey(&subItem); + +#if defined(URES_TREE_DEBUG) + /* fprintf(stderr, "%s | %s | %s | %s\n", path?path:"", keyword, locale, k); */ +#endif + for(i=0;k&&i= (VALUES_LIST_SIZE-1)) || /* no more space in list .. */ + ((valuesIndex+kLen+1+1) >= VALUES_BUF_SIZE)) { /* no more space in buffer (string + 2 nulls) */ + *status = U_ILLEGAL_ARGUMENT_ERROR; /* out of space.. */ + } else { + uprv_strcpy(valuesBuf+valuesIndex, k); + valuesList[valuesCount++] = valuesBuf+valuesIndex; + valuesIndex += kLen; +#if defined(URES_TREE_DEBUG) + fprintf(stderr, "%s | %s | %s | [%s] (UNIQUE)\n", + path?path:"", keyword, locale, k); +#endif + valuesBuf[valuesIndex++] = 0; /* terminate */ + } + } + } + ures_close(bund); + } + valuesBuf[valuesIndex++] = 0; /* terminate */ + + ures_close(&item); + ures_close(&subItem); + uenum_close(locs); +#if defined(URES_TREE_DEBUG) + fprintf(stderr, "%s: size %d, #%d\n", u_errorName(*status), + valuesIndex, valuesCount); +#endif + return uloc_openKeywordList(valuesBuf, valuesIndex, status); +} + /* eof */ diff --git a/icuSources/common/uresdata.c b/icuSources/common/uresdata.c index fd48bac1..4e3136f6 100644 --- a/icuSources/common/uresdata.c +++ b/icuSources/common/uresdata.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * * -* Copyright (C) 1999-2003, International Business Machines Corporation * +* Copyright (C) 1999-2004, International Business Machines Corporation * * and others. All Rights Reserved. * * * ******************************************************************************* @@ -20,18 +20,24 @@ */ #include "unicode/utypes.h" -#include "cstring.h" #include "unicode/udata.h" +#include "cmemory.h" +#include "cstring.h" +#include "uarrsort.h" +#include "udataswp.h" +#include "ucol_swp.h" #include "uresdata.h" #include "uresimp.h" +#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) + /* * Resource access helpers */ /* get a const char* pointer to the key with the keyOffset byte offset from pRoot */ #define RES_GET_KEY(pRoot, keyOffset) ((const char *)(pRoot)+(keyOffset)) -#define URESDATA_ITEM_NOT_FOUND 0xFFFF +#define URESDATA_ITEM_NOT_FOUND -1 /* * All the type-access functions assume that @@ -44,9 +50,9 @@ */ static Resource _res_getArrayItem(Resource *pRoot, Resource res, int32_t indexR) { - int32_t *p=(int32_t *)RES_GET_POINTER(pRoot, res); + const int32_t *p=(const int32_t *)RES_GET_POINTER(pRoot, res); if(indexR<*p) { - return ((Resource *)(p))[1+indexR]; + return ((const Resource *)(p))[1+indexR]; } else { return RES_BOGUS; /* indexR>itemCount */ } @@ -61,75 +67,72 @@ _res_getArrayItem(Resource *pRoot, Resource res, int32_t indexR) { * In order to 4-align the Resource item values, there is a padding * word if count is even, i.e., there is exactly (~count&1) * 16-bit padding words. + * + * For Table32, both the count and the key offsets are int32_t's + * and need not alignment. */ static const char * -_res_getTableKey(const Resource *pRoot, const Resource res, uint16_t indexS) { - uint16_t *p=(uint16_t *)RES_GET_POINTER(pRoot, res); - if(indexS<*p) { +_res_getTableKey(const Resource *pRoot, const Resource res, int32_t indexS) { + const uint16_t *p=(const uint16_t *)RES_GET_POINTER(pRoot, res); + if((uint32_t)indexS<(uint32_t)*p) { return RES_GET_KEY(pRoot, p[indexS+1]); } else { return NULL; /* indexS>itemCount */ } } -static Resource -_res_getTableItem(const Resource *pRoot, const Resource res, uint16_t indexR) { - uint16_t *p=(uint16_t *)RES_GET_POINTER(pRoot, res); - uint16_t count=*p; - if(indexRitemCount */ + return NULL; /* indexS>itemCount */ } } -static Resource -_res_findTableItem(const Resource *pRoot, const Resource res, const char *key) { - uint16_t *p=(uint16_t *)RES_GET_POINTER(pRoot, res); - uint16_t i, start, limit; - - limit=*p++; /* number of entries */ - if(limit == 0) { /* this table is empty */ - return RES_BOGUS; - } - - /* do a binary search for the key */ - start=0; - while(startitemCount */ } +} - /* did we really find it? */ - if(uprv_strcmp(key, RES_GET_KEY(pRoot, p[start]))==0) { - limit=*(p-1); /* itemCount */ - return ((Resource *)(p+limit+(~limit&1)))[start]; +static Resource +_res_getTable32Item(const Resource *pRoot, const Resource res, int32_t indexR) { + const int32_t *p=(const int32_t *)RES_GET_POINTER(pRoot, res); + int32_t count=*p; + if((uint32_t)indexR<(uint32_t)count) { + return ((const Resource *)(p+1+count))[indexR]; } else { - return RES_BOGUS; /* not found */ + return RES_BOGUS; /* indexR>itemCount */ } } + static Resource -_res_findTableItemN(const Resource *pRoot, const Resource res, const char *key, int32_t keyLen, const char **realKey) { - uint16_t *p=(uint16_t *)RES_GET_POINTER(pRoot, res); - uint16_t i, start, limit; +_res_findTableItem(const Resource *pRoot, const Resource res, const char *key, + int32_t *index, const char **realKey) { + const uint16_t *p=(const uint16_t *)RES_GET_POINTER(pRoot, res); + int32_t i, start, limit; limit=*p++; /* number of entries */ if(limit == 0) { /* this table is empty */ - return RES_BOGUS; + *index=URESDATA_ITEM_NOT_FOUND; + return RES_BOGUS; } /* do a binary search for the key */ start=0; while(startdata=udata_openChoice(path, "res", name, isAcceptable, NULL, errorCode); if(U_FAILURE(*errorCode)) { @@ -212,7 +223,9 @@ res_load(ResourceData *pResData, pResData->rootRes=*pResData->pRoot; /* currently, we accept only resources that have a Table as their roots */ - if(RES_GET_TYPE(pResData->rootRes)!=URES_TABLE) { + rootType=RES_GET_TYPE(pResData->rootRes); + if(rootType!=URES_TABLE && rootType!=URES_TABLE32) { + *errorCode=U_INVALID_FORMAT_ERROR; udata_close(pResData->data); pResData->data=NULL; return FALSE; @@ -232,11 +245,11 @@ res_unload(ResourceData *pResData) { U_CFUNC const UChar * res_getString(const ResourceData *pResData, const Resource res, int32_t *pLength) { if(res!=RES_BOGUS && RES_GET_TYPE(res)==URES_STRING) { - int32_t *p=(int32_t *)RES_GET_POINTER(pResData->pRoot, res); + const int32_t *p=(const int32_t *)RES_GET_POINTER(pResData->pRoot, res); if (pLength) { *pLength=*p; } - return (UChar *)++p; + return (const UChar *)++p; } else { if (pLength) { *pLength=0; @@ -248,11 +261,11 @@ res_getString(const ResourceData *pResData, const Resource res, int32_t *pLength U_CFUNC const UChar * res_getAlias(const ResourceData *pResData, const Resource res, int32_t *pLength) { if(res!=RES_BOGUS && RES_GET_TYPE(res)==URES_ALIAS) { - int32_t *p=(int32_t *)RES_GET_POINTER(pResData->pRoot, res); + const int32_t *p=(const int32_t *)RES_GET_POINTER(pResData->pRoot, res); if (pLength) { *pLength=*p; } - return (UChar *)++p; + return (const UChar *)++p; } else { if (pLength) { *pLength=0; @@ -264,12 +277,12 @@ res_getAlias(const ResourceData *pResData, const Resource res, int32_t *pLength) U_CFUNC const uint8_t * res_getBinary(const ResourceData *pResData, const Resource res, int32_t *pLength) { if(res!=RES_BOGUS) { - int32_t *p=(int32_t *)RES_GET_POINTER(pResData->pRoot, res); + const int32_t *p=(const int32_t *)RES_GET_POINTER(pResData->pRoot, res); *pLength=*p++; if (*pLength == 0) { p = NULL; } - return (uint8_t *)p; + return (const uint8_t *)p; } else { *pLength=0; return NULL; @@ -280,7 +293,7 @@ res_getBinary(const ResourceData *pResData, const Resource res, int32_t *pLength U_CFUNC const int32_t * res_getIntVector(const ResourceData *pResData, const Resource res, int32_t *pLength) { if(res!=RES_BOGUS && RES_GET_TYPE(res)==URES_INT_VECTOR) { - int32_t *p=(int32_t *)RES_GET_POINTER(pResData->pRoot, res); + const int32_t *p=(const int32_t *)RES_GET_POINTER(pResData->pRoot, res); *pLength=*p++; if (*pLength == 0) { p = NULL; @@ -295,14 +308,24 @@ res_getIntVector(const ResourceData *pResData, const Resource res, int32_t *pLen U_CFUNC int32_t res_countArrayItems(const ResourceData *pResData, const Resource res) { if(res!=RES_BOGUS) { - if(RES_GET_TYPE(res)==URES_STRING) { + switch(RES_GET_TYPE(res)) { + case URES_STRING: + case URES_BINARY: + case URES_ALIAS: + case URES_INT: + case URES_INT_VECTOR: return 1; - } else if(RES_GET_TYPE(res)==URES_ARRAY) { - Resource *p=RES_GET_POINTER(pResData->pRoot, res); - int32_t count=*(int32_t *)p; - return count; - } else if(RES_GET_TYPE(res)==URES_TABLE) { - return res_getTableSize(pResData, res); + case URES_ARRAY: + case URES_TABLE32: { + const int32_t *p=(const int32_t *)RES_GET_POINTER(pResData->pRoot, res); + return *p; + } + case URES_TABLE: { + const uint16_t *p=(const uint16_t *)RES_GET_POINTER(pResData->pRoot, res); + return *p; + } + default: + break; } } return 0; @@ -310,7 +333,13 @@ res_countArrayItems(const ResourceData *pResData, const Resource res) { U_CFUNC Resource res_getResource(const ResourceData *pResData, const char *key) { - return _res_findTableItem(pResData->pRoot, pResData->rootRes, key); + int32_t index; + const char *realKey; + if(RES_GET_TYPE(pResData->rootRes)==URES_TABLE) { + return _res_findTableItem(pResData->pRoot, pResData->rootRes, key, &index, &realKey); + } else { + return _res_findTable32Item(pResData->pRoot, pResData->rootRes, key, &index, &realKey); + } } U_CFUNC Resource @@ -319,20 +348,32 @@ res_getArrayItem(const ResourceData *pResData, Resource array, const int32_t ind } U_CFUNC Resource -res_findResource(const ResourceData *pResData, Resource r, const char** path, const char** key) { +res_findResource(const ResourceData *pResData, Resource r, char** path, const char** key) { /* we pass in a path. CollationElements/Sequence or zoneStrings/3/2 etc. * iterates over a path and stops when a scalar resource is found. This * CAN be an alias. Path gets set to the part that has not yet been processed. */ - const char *pathP = *path, *nextSepP = *path; + char *pathP = *path, *nextSepP = *path; char *closeIndex = NULL; Resource t1 = r; Resource t2; - int32_t indexR = 0, keyLen = 0; + int32_t indexR = 0; UResType type = RES_GET_TYPE(t1); + + /* if you come in with an empty path, you'll be getting back the same resource */ + if(!uprv_strlen(pathP)) { + return r; + } + + /* one needs to have an aggregate resource in order to search in it */ + if(!(type == URES_TABLE || type == URES_TABLE32 || type == URES_ARRAY)) { + return RES_BOGUS; + } - while(nextSepP && *pathP && t1 != RES_BOGUS && (type == URES_TABLE || type == URES_ARRAY)) { + while(nextSepP && *pathP && t1 != RES_BOGUS && + (type == URES_TABLE || type == URES_TABLE32 || type == URES_ARRAY) + ) { /* Iteration stops if: the path has been consumed, we found a non-existing * resource (t1 == RES_BOGUS) or we found a scalar resource (including alias) */ @@ -341,17 +382,26 @@ res_findResource(const ResourceData *pResData, Resource r, const char** path, co * and set path to the remaining part of the string */ if(nextSepP != NULL) { - keyLen = nextSepP-pathP; + *nextSepP = 0; /* overwrite the separator with a NUL to terminate the key */ *path = nextSepP+1; } else { - keyLen = uprv_strlen(pathP); - *path += keyLen; + *path = uprv_strchr(pathP, 0); } /* if the resource is a table */ /* try the key based access */ if(type == URES_TABLE) { - t2 = _res_findTableItemN(pResData->pRoot, t1, pathP, keyLen, key); + t2 = _res_findTableItem(pResData->pRoot, t1, pathP, &indexR, key); + if(t2 == RES_BOGUS) { + /* if we fail to get the resource by key, maybe we got an index */ + indexR = uprv_strtol(pathP, &closeIndex, 10); + if(closeIndex != pathP) { + /* if we indeed have an index, try to get the item by index */ + t2 = res_getTableItemByIndex(pResData, t1, indexR, key); + } + } + } else if(type == URES_TABLE32) { + t2 = _res_findTable32Item(pResData->pRoot, t1, pathP, &indexR, key); if(t2 == RES_BOGUS) { /* if we fail to get the resource by key, maybe we got an index */ indexR = uprv_strtol(pathP, &closeIndex, 10); @@ -374,23 +424,20 @@ res_findResource(const ResourceData *pResData, Resource r, const char** path, co t1 = t2; type = RES_GET_TYPE(t1); /* position pathP to next resource key/index */ - pathP += keyLen+1; + pathP = *path; } return t1; } U_CFUNC Resource -res_getTableItemByKey(const ResourceData *pResData, Resource table, int32_t* indexR, const char* * key) { - uint16_t tempIndex; - if(key != NULL) { - tempIndex = _res_findTableIndex(pResData->pRoot, table, *key); - if(tempIndex != URESDATA_ITEM_NOT_FOUND) { - *key = _res_getTableKey(pResData->pRoot, table, tempIndex); - *indexR = tempIndex; - return _res_getTableItem(pResData->pRoot, table, tempIndex); +res_getTableItemByKey(const ResourceData *pResData, Resource table, + int32_t *indexR, const char **key) { + if(key != NULL && *key != NULL) { + if(RES_GET_TYPE(table)==URES_TABLE) { + return _res_findTableItem(pResData->pRoot, table, *key, indexR, key); } else { - return RES_BOGUS; + return _res_findTable32Item(pResData->pRoot, table, *key, indexR, key); } } else { return RES_BOGUS; @@ -398,19 +445,626 @@ res_getTableItemByKey(const ResourceData *pResData, Resource table, int32_t* ind } U_CFUNC Resource -res_getTableItemByIndex(const ResourceData *pResData, Resource table, int32_t indexR, const char * * key) { +res_getTableItemByIndex(const ResourceData *pResData, Resource table, + int32_t indexR, const char **key) { if(indexR>-1) { - if(key != NULL) { - *key = _res_getTableKey(pResData->pRoot, table, (uint16_t)indexR); + if(RES_GET_TYPE(table)==URES_TABLE) { + if(key != NULL) { + *key = _res_getTableKey(pResData->pRoot, table, indexR); + } + return _res_getTableItem(pResData->pRoot, table, indexR); + } else { + if(key != NULL) { + *key = _res_getTable32Key(pResData->pRoot, table, indexR); + } + return _res_getTable32Item(pResData->pRoot, table, indexR); } - return _res_getTableItem(pResData->pRoot, table, (uint16_t)indexR); } else { return RES_BOGUS; } } -U_CFUNC int32_t -res_getTableSize(const ResourceData *pResData, Resource table) { - uint16_t *p=(uint16_t *)RES_GET_POINTER(pResData->pRoot, table); - return *p; +/* resource bundle swapping ------------------------------------------------- */ + +/* + * Need to always enumerate the entire item tree, + * track the lowest address of any item to use as the limit for char keys[], + * track the highest address of any item to return the size of the data. + * + * We should have thought of storing those in the data... + * It is possible to extend the data structure by putting additional values + * in places that are inaccessible by ordinary enumeration of the item tree. + * For example, additional integers could be stored at the beginning or + * end of the key strings; this could be indicated by a minor version number, + * and the data swapping would have to know about these values. + * + * The data structure does not forbid keys to be shared, so we must swap + * all keys once instead of each key when it is referenced. + * + * These swapping functions assume that a resource bundle always has a length + * that is a multiple of 4 bytes. + * Currently, this is trivially true because genrb writes bundle tree leaves + * physically first, before their branches, so that the root table with its + * array of resource items (uint32_t values) is always last. + */ + +/* definitions for table sorting ------------------------ */ + +/* + * row of a temporary array + * + * gets platform-endian key string indexes and sorting indexes; + * after sorting this array by keys, the actual key/value arrays are permutated + * according to the sorting indexes + */ +typedef struct Row { + int32_t keyIndex, sortIndex; +} Row; + +static int32_t +ures_compareRows(const void *context, const void *left, const void *right) { + const char *keyChars=(const char *)context; + return (int32_t)uprv_strcmp(keyChars+((const Row *)left)->keyIndex, + keyChars+((const Row *)right)->keyIndex); +} + +typedef struct TempTable { + const char *keyChars; + Row *rows; + int32_t *resort; +} TempTable; + +enum { + STACK_ROW_CAPACITY=200 +}; + +/* binary data with known formats is swapped too */ +typedef enum UResSpecialType { + URES_NO_SPECIAL_TYPE, + URES_COLLATION_BINARY, + URES_SPECIAL_TYPE_COUNT +} UResSpecialType; + +/* resource table key for collation binaries: "%%CollationBin" */ +static const UChar gCollationBinKey[]={ + 0x25, 0x25, + 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x69, 0x6e, + 0 +}; + +/* + * preflight one resource item and set bottom and top values; + * length, bottom, and top count Resource item offsets (4 bytes each), not bytes + */ +static void +ures_preflightResource(const UDataSwapper *ds, + const Resource *inBundle, int32_t length, + Resource res, + int32_t *pBottom, int32_t *pTop, int32_t *pMaxTableLength, + UErrorCode *pErrorCode) { + const Resource *p; + int32_t offset; + + if(res==0 || RES_GET_TYPE(res)==URES_INT) { + /* empty string or integer, nothing to do */ + return; + } + + /* all other types use an offset to point to their data */ + offset=(int32_t)RES_GET_OFFSET(res); + if(0<=length && length<=offset) { + udata_printError(ds, "ures_preflightResource(res=%08x) resource offset exceeds bundle length %d\n", + res, length); + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return; + } else if(offset<*pBottom) { + *pBottom=offset; + } + p=inBundle+offset; + + switch(RES_GET_TYPE(res)) { + case URES_ALIAS: + /* physically same value layout as string, fall through */ + case URES_STRING: + /* top=offset+1+(string length +1)/2 rounded up */ + offset+=1+((udata_readInt32(ds, (int32_t)*p)+1)+1)/2; + break; + case URES_BINARY: + /* top=offset+1+(binary length)/4 rounded up */ + offset+=1+(udata_readInt32(ds, (int32_t)*p)+3)/4; + break; + case URES_TABLE: + case URES_TABLE32: + { + Resource item; + int32_t i, count; + + if(RES_GET_TYPE(res)==URES_TABLE) { + /* get table item count */ + const uint16_t *pKey16=(const uint16_t *)p; + count=ds->readUInt16(*pKey16++); + + /* top=((1+ table item count)/2 rounded up)+(table item count) */ + offset+=((1+count)+1)/2; + } else { + /* get table item count */ + const int32_t *pKey32=(const int32_t *)p; + count=udata_readInt32(ds, *pKey32++); + + /* top=(1+ table item count)+(table item count) */ + offset+=1+count; + } + + if(count>*pMaxTableLength) { + *pMaxTableLength=count; + } + + p=inBundle+offset; /* pointer to table resources */ + offset+=count; + + /* recurse */ + if(offset<=length) { + for(i=0; ireadUInt32(*p++); + ures_preflightResource(ds, inBundle, length, item, + pBottom, pTop, pMaxTableLength, + pErrorCode); + if(U_FAILURE(*pErrorCode)) { + udata_printError(ds, "ures_preflightResource(table res=%08x)[%d].recurse(%08x) failed - %s\n", + res, i, item, u_errorName(*pErrorCode)); + break; + } + } + } + } + break; + case URES_ARRAY: + { + Resource item; + int32_t i, count; + + /* top=offset+1+(array length) */ + count=udata_readInt32(ds, (int32_t)*p++); + offset+=1+count; + + /* recurse */ + if(offset<=length) { + for(i=0; ireadUInt32(*p++); + ures_preflightResource(ds, inBundle, length, item, + pBottom, pTop, pMaxTableLength, + pErrorCode); + if(U_FAILURE(*pErrorCode)) { + udata_printError(ds, "ures_preflightResource(array res=%08x)[%d].recurse(%08x) failed - %s\n", + res, i, item, u_errorName(*pErrorCode)); + break; + } + } + } + } + break; + case URES_INT_VECTOR: + /* top=offset+1+(vector length) */ + offset+=1+udata_readInt32(ds, (int32_t)*p); + break; + default: + /* also catches RES_BOGUS */ + udata_printError(ds, "ures_preflightResource(res=%08x) unknown resource type\n", res); + *pErrorCode=U_UNSUPPORTED_ERROR; + break; + } + + if(U_FAILURE(*pErrorCode)) { + /* nothing to do */ + } else if(0<=length && length*pTop) { + *pTop=offset; + } +} + +/* + * swap one resource item + * since preflighting succeeded, we need not check offsets against length any more + */ +static void +ures_swapResource(const UDataSwapper *ds, + const Resource *inBundle, Resource *outBundle, + Resource res, /* caller swaps res itself */ + UResSpecialType specialType, + TempTable *pTempTable, + UErrorCode *pErrorCode) { + const Resource *p; + Resource *q; + int32_t offset, count; + + if(res==0 || RES_GET_TYPE(res)==URES_INT) { + /* empty string or integer, nothing to do */ + return; + } + + /* all other types use an offset to point to their data */ + offset=(int32_t)RES_GET_OFFSET(res); + p=inBundle+offset; + q=outBundle+offset; + + switch(RES_GET_TYPE(res)) { + case URES_ALIAS: + /* physically same value layout as string, fall through */ + case URES_STRING: + count=udata_readInt32(ds, (int32_t)*p); + /* swap length */ + ds->swapArray32(ds, p, 4, q, pErrorCode); + /* swap each UChar (the terminating NUL would not change) */ + ds->swapArray16(ds, p+1, 2*count, q+1, pErrorCode); + break; + case URES_BINARY: + count=udata_readInt32(ds, (int32_t)*p); + /* swap length */ + ds->swapArray32(ds, p, 4, q, pErrorCode); + /* no need to swap or copy bytes - ures_swap() copied them all */ + + /* swap known formats */ + if(specialType==URES_COLLATION_BINARY) { +#if !UCONFIG_NO_COLLATION + ucol_swapBinary(ds, p+1, count, q+1, pErrorCode); +#endif + } + break; + case URES_TABLE: + case URES_TABLE32: + { + const uint16_t *pKey16; + uint16_t *qKey16; + + const int32_t *pKey32; + int32_t *qKey32; + + Resource item; + int32_t i, oldIndex; + + if(RES_GET_TYPE(res)==URES_TABLE) { + /* get table item count */ + pKey16=(const uint16_t *)p; + qKey16=(uint16_t *)q; + count=ds->readUInt16(*pKey16); + + pKey32=qKey32=NULL; + + /* swap count */ + ds->swapArray16(ds, pKey16++, 2, qKey16++, pErrorCode); + + offset+=((1+count)+1)/2; + } else { + /* get table item count */ + pKey32=(const int32_t *)p; + qKey32=(int32_t *)q; + count=udata_readInt32(ds, *pKey32); + + pKey16=qKey16=NULL; + + /* swap count */ + ds->swapArray32(ds, pKey32++, 4, qKey32++, pErrorCode); + + offset+=1+count; + } + + if(count==0) { + break; + } + + p=inBundle+offset; /* pointer to table resources */ + q=outBundle+offset; + + /* recurse */ + for(i=0; icompareInvChars(ds, outData+readUInt16(pKey[i]), "%%CollationBin") + * etc. + * + * use some UDataSwapFn pointer from somewhere for collation swapping + * because the common library cannot directly call into the i18n library + */ + if(0==ds->compareInvChars(ds, + ((const char *)outBundle)+ + (pKey16!=NULL ? + ds->readUInt16(pKey16[i]) : + udata_readInt32(ds, pKey32[i])), + -1, + gCollationBinKey, LENGTHOF(gCollationBinKey)-1) + ) { + specialType=URES_COLLATION_BINARY; + } else { + specialType=URES_NO_SPECIAL_TYPE; + } + + item=ds->readUInt32(p[i]); + ures_swapResource(ds, inBundle, outBundle, item, specialType, pTempTable, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + udata_printError(ds, "ures_swapResource(table res=%08x)[%d].recurse(%08x) failed - %s\n", + res, i, item, u_errorName(*pErrorCode)); + return; + } + } + + if(ds->inCharset==ds->outCharset) { + /* no need to sort, just swap the offset/value arrays */ + if(pKey16!=NULL) { + ds->swapArray16(ds, pKey16, count*2, qKey16, pErrorCode); + ds->swapArray32(ds, p, count*4, q, pErrorCode); + } else { + /* swap key offsets and items as one array */ + ds->swapArray32(ds, pKey32, count*2*4, qKey32, pErrorCode); + } + break; + } + + /* + * We need to sort tables by outCharset key strings because they + * sort differently for different charset families. + * ures_swap() already set pTempTable->keyChars appropriately. + * First we set up a temporary table with the key indexes and + * sorting indexes and sort that. + * Then we permutate and copy/swap the actual values. + */ + if(pKey16!=NULL) { + for(i=0; irows[i].keyIndex=ds->readUInt16(pKey16[i]); + pTempTable->rows[i].sortIndex=i; + } + } else { + for(i=0; irows[i].keyIndex=udata_readInt32(ds, pKey32[i]); + pTempTable->rows[i].sortIndex=i; + } + } + uprv_sortArray(pTempTable->rows, count, sizeof(Row), + ures_compareRows, pTempTable->keyChars, + FALSE, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + udata_printError(ds, "ures_swapResource(table res=%08x).uprv_sortArray(%d items) failed - %s\n", + res, count, u_errorName(*pErrorCode)); + return; + } + + /* + * copy/swap/permutate items + * + * If we swap in-place, then the permutation must use another + * temporary array (pTempTable->resort) + * before the results are copied to the outBundle. + */ + /* keys */ + if(pKey16!=NULL) { + uint16_t *rKey16; + + if(pKey16!=qKey16) { + rKey16=qKey16; + } else { + rKey16=(uint16_t *)pTempTable->resort; + } + for(i=0; irows[i].sortIndex; + ds->swapArray16(ds, pKey16+oldIndex, 2, rKey16+i, pErrorCode); + } + if(qKey16!=rKey16) { + uprv_memcpy(qKey16, rKey16, 2*count); + } + } else { + int32_t *rKey32; + + if(pKey32!=qKey32) { + rKey32=qKey32; + } else { + rKey32=pTempTable->resort; + } + for(i=0; irows[i].sortIndex; + ds->swapArray32(ds, pKey32+oldIndex, 4, rKey32+i, pErrorCode); + } + if(qKey32!=rKey32) { + uprv_memcpy(qKey32, rKey32, 4*count); + } + } + + /* resources */ + { + Resource *r; + + + if(p!=q) { + r=q; + } else { + r=(Resource *)pTempTable->resort; + } + for(i=0; irows[i].sortIndex; + ds->swapArray32(ds, p+oldIndex, 4, r+i, pErrorCode); + } + if(q!=r) { + uprv_memcpy(q, r, 4*count); + } + } + } + break; + case URES_ARRAY: + { + Resource item; + int32_t i; + + count=udata_readInt32(ds, (int32_t)*p); + /* swap length */ + ds->swapArray32(ds, p++, 4, q++, pErrorCode); + + /* recurse */ + for(i=0; ireadUInt32(p[i]); + ures_swapResource(ds, inBundle, outBundle, item, URES_NO_SPECIAL_TYPE, pTempTable, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + udata_printError(ds, "ures_swapResource(array res=%08x)[%d].recurse(%08x) failed - %s\n", + res, i, item, u_errorName(*pErrorCode)); + return; + } + } + + /* swap items */ + ds->swapArray32(ds, p, 4*count, q, pErrorCode); + } + break; + case URES_INT_VECTOR: + count=udata_readInt32(ds, (int32_t)*p); + /* swap length and each integer */ + ds->swapArray32(ds, p, 4*(1+count), q, pErrorCode); + break; + default: + /* also catches RES_BOGUS */ + *pErrorCode=U_UNSUPPORTED_ERROR; + break; + } +} + +U_CAPI int32_t U_EXPORT2 +ures_swap(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const UDataInfo *pInfo; + const Resource *inBundle; + Resource rootRes; + int32_t headerSize, maxTableLength; + + Row rows[STACK_ROW_CAPACITY]; + int32_t resort[STACK_ROW_CAPACITY]; + TempTable tempTable; + + /* the following integers count Resource item offsets (4 bytes each), not bytes */ + int32_t bundleLength, stringsBottom, bottom, top; + + /* udata_swapDataHeader checks the arguments */ + headerSize=udata_swapDataHeader(ds, inData, length, outData, pErrorCode); + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + + /* check data format and format version */ + pInfo=(const UDataInfo *)((const char *)inData+4); + if(!( + pInfo->dataFormat[0]==0x52 && /* dataFormat="ResB" */ + pInfo->dataFormat[1]==0x65 && + pInfo->dataFormat[2]==0x73 && + pInfo->dataFormat[3]==0x42 && + pInfo->formatVersion[0]==1 + )) { + udata_printError(ds, "ures_swap(): data format %02x.%02x.%02x.%02x (format version %02x) is not a resource bundle\n", + pInfo->dataFormat[0], pInfo->dataFormat[1], + pInfo->dataFormat[2], pInfo->dataFormat[3], + pInfo->formatVersion[0]); + *pErrorCode=U_UNSUPPORTED_ERROR; + return 0; + } + + /* a resource bundle must contain at least one resource item */ + if(length<0) { + bundleLength=-1; + } else { + bundleLength=(length-headerSize)/4; + + /* formatVersion 1.1 must have a root item and at least 5 indexes */ + if( bundleLength< + (pInfo->formatVersion[1]==0 ? 1 : 1+5) + ) { + udata_printError(ds, "ures_swap(): too few bytes (%d after header) for a resource bundle\n", + length-headerSize); + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + } + + inBundle=(const Resource *)((const char *)inData+headerSize); + rootRes=ds->readUInt32(*inBundle); + + if(pInfo->formatVersion[1]==0) { + /* preflight to get the bottom, top and maxTableLength values */ + stringsBottom=1; /* just past root */ + bottom=0x7fffffff; + top=maxTableLength=0; + ures_preflightResource(ds, inBundle, bundleLength, rootRes, + &bottom, &top, &maxTableLength, + pErrorCode); + if(U_FAILURE(*pErrorCode)) { + udata_printError(ds, "ures_preflightResource(root res=%08x) failed - %s\n", + rootRes, u_errorName(*pErrorCode)); + return 0; + } + } else { + /* formatVersion 1.1 adds the indexes[] array */ + const int32_t *inIndexes; + + inIndexes=(const int32_t *)(inBundle+1); + + stringsBottom=1+udata_readInt32(ds, inIndexes[URES_INDEX_LENGTH]); + bottom=udata_readInt32(ds, inIndexes[URES_INDEX_STRINGS_TOP]); + top=udata_readInt32(ds, inIndexes[URES_INDEX_BUNDLE_TOP]); + maxTableLength=udata_readInt32(ds, inIndexes[URES_INDEX_MAX_TABLE_LENGTH]); + + if(0<=bundleLength && bundleLength=0) { + Resource *outBundle=(Resource *)((char *)outData+headerSize); + + /* copy the bundle for binary and inaccessible data */ + if(inData!=outData) { + uprv_memcpy(outBundle, inBundle, 4*top); + } + + /* swap the key strings, but not the padding bytes (0xaa) after the last string and its NUL */ + udata_swapInvStringBlock(ds, inBundle+stringsBottom, 4*(bottom-stringsBottom), + outBundle+stringsBottom, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + udata_printError(ds, "ures_swap().udata_swapInvStringBlock(keys[%d]) failed - %s\n", 4*(bottom-1), + u_errorName(*pErrorCode)); + return 0; + } + + /* allocate the temporary table for sorting resource tables */ + tempTable.keyChars=(const char *)outBundle; /* sort by outCharset */ + if(maxTableLength<=STACK_ROW_CAPACITY) { + tempTable.rows=rows; + tempTable.resort=resort; + } else { + tempTable.rows=(Row *)uprv_malloc(maxTableLength*sizeof(Row)+maxTableLength*4); + if(tempTable.rows==NULL) { + udata_printError(ds, "ures_swap(): unable to allocate memory for sorting tables (max length: %d)\n", + maxTableLength); + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + return 0; + } + tempTable.resort=(int32_t *)(tempTable.rows+maxTableLength); + } + + /* swap the resources */ + ures_swapResource(ds, inBundle, outBundle, rootRes, URES_NO_SPECIAL_TYPE, &tempTable, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + udata_printError(ds, "ures_swapResource(root res=%08x) failed - %s\n", + rootRes, u_errorName(*pErrorCode)); + } + + if(tempTable.rows!=rows) { + uprv_free(tempTable.rows); + } + + /* swap the root resource and indexes */ + ds->swapArray32(ds, inBundle, stringsBottom*4, outBundle, pErrorCode); + } + + return headerSize+4*top; } diff --git a/icuSources/common/uresdata.h b/icuSources/common/uresdata.h index 531762b8..92a8667d 100644 --- a/icuSources/common/uresdata.h +++ b/icuSources/common/uresdata.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * * -* Copyright (C) 1999-2002, International Business Machines * +* Copyright (C) 1999-2003, International Business Machines * * Corporation and others. All Rights Reserved. * * * ****************************************************************************** @@ -20,6 +20,7 @@ #include "unicode/utypes.h" #include "unicode/udata.h" +#include "udataswp.h" /* * A Resource is a 32-bit value that has 2 bit fields: @@ -38,16 +39,38 @@ typedef uint32_t Resource; #define RES_GET_INT(res) (((int32_t)((res)<<4L))>>4L) #define RES_GET_UINT(res) ((res)&0x0fffffff) +/* indexes[] value names; indexes are generally 32-bit (Resource) indexes */ +enum { + URES_INDEX_LENGTH, /* [0] contains URES_INDEX_TOP==the length of indexes[] */ + URES_INDEX_STRINGS_TOP, /* [1] contains the top of the strings, */ + /* same as the bottom of resources, rounded up */ + URES_INDEX_RESOURCES_TOP, /* [2] contains the top of all resources */ + URES_INDEX_BUNDLE_TOP, /* [3] contains the top of the bundle, */ + /* in case it were ever different from [2] */ + URES_INDEX_MAX_TABLE_LENGTH,/* [4] max. length of any table */ + URES_INDEX_TOP +}; + +/* number of bytes at the beginning of the bundle before the strings start */ +enum { + URES_STRINGS_BOTTOM=(1+URES_INDEX_TOP)*4 +}; + /* - * File format for .res resource bundle files (formatVersion=1) + * File format for .res resource bundle files (formatVersion=1.1) * * An ICU4C resource bundle file (.res) is a binary, memory-mappable file * with nested, hierarchical data structures. * It physically contains the following: * * Resource root; -- 32-bit Resource item, root item for this bundle's tree; - * currently, the root item must be a table resource item - * char keys[]; -- up to 65k of characters for key strings, + * currently, the root item must be a table or table32 resource item + * int32_t indexes[indexes[0]]; -- array of indexes for friendly + * reading and swapping; see URES_INDEX_* above + * new in formatVersion 1.1 + * char keys[]; -- characters for key strings + * (formatVersion 1.0: up to 65k of characters; 1.1: <2G) + * (minus the space for root and indexes[]), * which consist of invariant characters (ASCII/EBCDIC) and are NUL-terminated; * padded to multiple of 4 bytes for 4-alignment of the following data * data; -- data directly and indirectly indexed by the root item; @@ -110,6 +133,8 @@ typedef uint32_t Resource; * - this value should be 32-aligned - * 2 Table: uint16_t count, uint16_t keyStringOffsets[count], (uint16_t padding), Resource[count] * 3 Alias: (physically same value layout as string, new in ICU 2.4) + * 4 Table32: int32_t count, int32_t keyStringOffsets[count], Resource[count] + * (new in formatVersion 1.1/ICU 2.8) * * 7 Integer: (28-bit offset is integer value) * 8 Array: int32_t count, Resource[count] @@ -171,11 +196,23 @@ res_getResource(const ResourceData *pResData, const char *key); U_CFUNC int32_t res_countArrayItems(const ResourceData *pResData, const Resource res); -U_CFUNC int32_t res_getTableSize(const ResourceData *pResData, Resource table); - U_CFUNC Resource res_getArrayItem(const ResourceData *pResData, Resource array, const int32_t indexS); U_CFUNC Resource res_getTableItemByIndex(const ResourceData *pResData, Resource table, int32_t indexS, const char ** key); U_CFUNC Resource res_getTableItemByKey(const ResourceData *pResData, Resource table, int32_t *indexS, const char* * key); -U_CFUNC Resource res_findResource(const ResourceData *pResData, Resource r, const char** path, const char** key); + +/* + * Modifies the contents of *path (replacing separators with NULs), + * and also moves *path forward while it finds items. + */ +U_CFUNC Resource res_findResource(const ResourceData *pResData, Resource r, char** path, const char** key); + +/** + * Swap an ICU resource bundle. See udataswp.h. + * @internal + */ +U_CAPI int32_t U_EXPORT2 +ures_swap(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode); #endif diff --git a/icuSources/common/uresimp.h b/icuSources/common/uresimp.h index 55f3eaec..9c5fe665 100644 --- a/icuSources/common/uresimp.h +++ b/icuSources/common/uresimp.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2000-2003, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** */ @@ -53,7 +53,7 @@ struct UResourceDataEntry { int32_t fHashKey; /* for faster access in the hashtable */ }; -#define RES_BUFSIZE 256 +#define RES_BUFSIZE 64 #define RES_PATH_SEPARATOR '/' #define RES_PATH_SEPARATOR_S "/" @@ -73,16 +73,12 @@ struct UResourceBundle { ResourceData fResData; Resource fRes; - /* parent of this resource - - * lives in the same data entry - */ - /* This cannot be done right now - need support in genrb */ - /*Resource fParent; */ + UResourceDataEntry *fTopLevelData; /* for getting the valid locale */ + const UResourceBundle *fParentRes; /* needed to get the actual locale for a child resource */ + }; -U_CFUNC void ures_initStackObject(UResourceBundle* resB); -U_CFUNC void ures_setIsStackObject( UResourceBundle* resB, UBool state); -U_CFUNC UBool ures_isStackObject( UResourceBundle* resB); +U_CAPI void U_EXPORT2 ures_initStackObject(UResourceBundle* resB); /* Some getters used by the copy constructor */ U_CFUNC const char* ures_getName(const UResourceBundle* resB); @@ -99,6 +95,9 @@ U_CFUNC UResourceBundle *ures_copyResb(UResourceBundle *r, const UResourceBundle * and path inside the locale, for example: "/myData/en/zoneStrings/3". Keys and indexes are supported. Keys * need to reference data in named structures, while indexes can reference both named and anonymous resources. * Features a fill-in parameter. + * + * Note, this function does NOT have a syntax for specifying items within a tree. May want to consider a + * syntax that delineates between package/tree and resource. * * @param pathToResource a path that will lead to the requested resource * @param fillIn if NULL a new UResourceBundle struct is allocated and must be deleted by the caller. @@ -129,7 +128,40 @@ ures_findResource(const char* pathToResource, */ U_CAPI UResourceBundle* U_EXPORT2 ures_findSubResource(const UResourceBundle *resB, - const char* pathToResource, + char* pathToResource, UResourceBundle *fillIn, UErrorCode *status); +/** + * Returns a functionally equivalent locale (considering keywords) for the specified keyword. + * @param result fillin for the equivalent locale + * @param resultCapacity capacity of the fillin buffer + * @param path path to the tree, or NULL for ICU data + * @param resName top level resource. Example: "collations" + * @param keyword locale keyword. Example: "collation" + * @param locid The requested locale + * @param isAvailable If non-null, pointer to fillin parameter that indicates whether the + * requested locale was available. The locale is defined as 'available' if it physically + * exists within the specified tree. + * @param omitDefault if TRUE, omit keyword and value if default. 'de_DE\@collation=standard' -> 'de_DE' + * @param status error code + * @return the actual buffer size needed for the full locale. If it's greater + * than resultCapacity, the returned full name will be truncated and an error code will be returned. + * @internal ICU 3.0 + */ +U_INTERNAL int32_t U_EXPORT2 +ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, + const char *path, const char *resName, const char *keyword, const char *locid, + UBool *isAvailable, UBool omitDefault, UErrorCode *status); + +/** + * Given a tree path and keyword, return a string enumeration of all possible values for that keyword. + * @param path path to the tree, or NULL for ICU data + * @param keyword a particular keyword to consider, must match a top level resource name + * within the tree. + * @param status error code + * @internal ICU 3.0 + */ +U_INTERNAL UEnumeration* U_EXPORT2 +ures_getKeywordValues(const char *path, const char *keyword, UErrorCode *status); + #endif /*URESIMP_H*/ diff --git a/icuSources/common/usc_impl.c b/icuSources/common/usc_impl.c index 83b0727c..1807e1bd 100644 --- a/icuSources/common/usc_impl.c +++ b/icuSources/common/usc_impl.c @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2002, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -19,7 +19,18 @@ #define ARRAY_SIZE(array) (sizeof array / sizeof array[0]) -#define PAREN_STACK_DEPTH 128 +#define PAREN_STACK_DEPTH 32 + +#define MOD(sp) ((sp) % PAREN_STACK_DEPTH) +#define LIMIT_INC(sp) (((sp) < PAREN_STACK_DEPTH)? (sp) + 1 : PAREN_STACK_DEPTH) +#define INC(sp,count) (MOD((sp) + (count))) +#define INC1(sp) (INC(sp, 1)) +#define DEC(sp,count) (MOD((sp) + PAREN_STACK_DEPTH - (count))) +#define DEC1(sp) (DEC(sp, 1)) +#define STACK_IS_EMPTY(scriptRun) ((scriptRun)->pushCount <= 0) +#define STACK_IS_NOT_EMPTY(scriptRun) (! STACK_IS_EMPTY(scriptRun)) +#define TOP(scriptRun) ((scriptRun)->parenStack[(scriptRun)->parenSP]) +#define SYNC_FIXUP(scriptRun) ((scriptRun)->fixupCount = 0) struct ParenStackEntry { @@ -38,6 +49,8 @@ struct UScriptRun struct ParenStackEntry parenStack[PAREN_STACK_DEPTH]; int32_t parenSP; + int32_t pushCount; + int32_t fixupCount; }; static int8_t highBit(int32_t value); @@ -62,6 +75,47 @@ static const UChar32 pairedChars[] = { 0x301a, 0x301b }; +static void push(UScriptRun *scriptRun, int32_t pairIndex, UScriptCode scriptCode) +{ + scriptRun->pushCount = LIMIT_INC(scriptRun->pushCount); + scriptRun->fixupCount = LIMIT_INC(scriptRun->fixupCount); + + scriptRun->parenSP = INC1(scriptRun->parenSP); + scriptRun->parenStack[scriptRun->parenSP].pairIndex = pairIndex; + scriptRun->parenStack[scriptRun->parenSP].scriptCode = scriptCode; +} + +static void pop(UScriptRun *scriptRun) +{ + if (STACK_IS_EMPTY(scriptRun)) { + return; + } + + if (scriptRun->fixupCount > 0) { + scriptRun->fixupCount -= 1; + } + + scriptRun->pushCount -= 1; + scriptRun->parenSP = DEC1(scriptRun->parenSP); + + /* If the stack is now empty, reset the stack + pointers to their initial values. + */ + if (STACK_IS_EMPTY(scriptRun)) { + scriptRun->parenSP = -1; + } +} + +static void fixup(UScriptRun *scriptRun, UScriptCode scriptCode) +{ + int32_t fixupSP = DEC(scriptRun->parenSP, scriptRun->fixupCount); + + while (scriptRun->fixupCount-- > 0) { + fixupSP = INC1(fixupSP); + scriptRun->parenStack[fixupSP].scriptCode = scriptCode; + } +} + static int8_t highBit(int32_t value) { @@ -177,6 +231,8 @@ uscript_resetRun(UScriptRun *scriptRun) scriptRun->scriptLimit = 0; scriptRun->scriptCode = USCRIPT_INVALID_CODE; scriptRun->parenSP = -1; + scriptRun->pushCount = 0; + scriptRun->fixupCount = 0; } } @@ -201,7 +257,6 @@ uscript_setRunText(UScriptRun *scriptRun, const UChar *src, int32_t length, UErr U_CAPI UBool U_EXPORT2 uscript_nextRun(UScriptRun *scriptRun, int32_t *pRunStart, int32_t *pRunLimit, UScriptCode *pRunScript) { - int32_t startSP = -1; /* used to find the first new open character */ UErrorCode error = U_ZERO_ERROR; /* if we've fallen off the end of the text, we're done */ @@ -209,7 +264,7 @@ uscript_nextRun(UScriptRun *scriptRun, int32_t *pRunStart, int32_t *pRunLimit, U return FALSE; } - startSP = scriptRun->parenSP; + SYNC_FIXUP(scriptRun); scriptRun->scriptCode = USCRIPT_COMMON; for (scriptRun->scriptStart = scriptRun->scriptLimit; scriptRun->scriptLimit < scriptRun->textLength; scriptRun->scriptLimit += 1) { @@ -248,33 +303,16 @@ uscript_nextRun(UScriptRun *scriptRun, int32_t *pRunStart, int32_t *pRunLimit, U */ if (pairIndex >= 0) { if ((pairIndex & 1) == 0) { - - /* - * If the paren stack is full, empty it. This - * means that deeply nested paired punctuation - * characters will be ignored, but that's an unusual - * case, and it's better to ignore them than to - * write off the end of the stack... - */ - if (++scriptRun->parenSP >= PAREN_STACK_DEPTH) { - scriptRun->parenSP = 0; - } - - scriptRun->parenStack[scriptRun->parenSP].pairIndex = pairIndex; - scriptRun->parenStack[scriptRun->parenSP].scriptCode = scriptRun->scriptCode; - } else if (scriptRun->parenSP >= 0) { + push(scriptRun, pairIndex, scriptRun->scriptCode); + } else { int32_t pi = pairIndex & ~1; - while (scriptRun->parenSP >= 0 && scriptRun->parenStack[scriptRun->parenSP].pairIndex != pi) { - scriptRun->parenSP -= 1; + while (STACK_IS_NOT_EMPTY(scriptRun) && TOP(scriptRun).pairIndex != pi) { + pop(scriptRun); } - if (scriptRun->parenSP < startSP) { - startSP = scriptRun->parenSP; - } - - if (scriptRun->parenSP >= 0) { - sc = scriptRun->parenStack[scriptRun->parenSP].scriptCode; + if (STACK_IS_NOT_EMPTY(scriptRun)) { + sc = TOP(scriptRun).scriptCode; } } } @@ -283,22 +321,15 @@ uscript_nextRun(UScriptRun *scriptRun, int32_t *pRunStart, int32_t *pRunLimit, U if (scriptRun->scriptCode <= USCRIPT_INHERITED && sc > USCRIPT_INHERITED) { scriptRun->scriptCode = sc; - /* - * now that we have a final script code, fix any open - * characters we pushed before we knew the script code. - */ - while (startSP < scriptRun->parenSP) { - scriptRun->parenStack[++startSP].scriptCode = scriptRun->scriptCode; - } + fixup(scriptRun, scriptRun->scriptCode); } /* * if this character is a close paired character, - * pop it from the stack + * pop the matching open character from the stack */ - if (pairIndex >= 0 && (pairIndex & 1) != 0 && scriptRun->parenSP >= 0) { - scriptRun->parenSP -= 1; - startSP -= 1; + if (pairIndex >= 0 && (pairIndex & 1) != 0) { + pop(scriptRun); } } else { /* diff --git a/icuSources/common/uscript.c b/icuSources/common/uscript.c index c7f2957f..546d5f88 100644 --- a/icuSources/common/uscript.c +++ b/icuSources/common/uscript.c @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1997-2001, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -16,6 +16,7 @@ #include "unicode/uscript.h" #include "unicode/ures.h" #include "unicode/uchar.h" +#include "unicode/putil.h" #include "uprops.h" #include "cmemory.h" #include "cstring.h" @@ -47,7 +48,7 @@ uscript_getCode(const char* nameOrAbbrOrLocale, if(code==(UScriptCode)UCHAR_INVALID_CODE){ /* Do not propagate error codes from just not finding a locale bundle. */ UErrorCode localErrorCode = U_ZERO_ERROR; - UResourceBundle* resB = ures_open(u_getDataDirectory(),nameOrAbbrOrLocale,&localErrorCode); + UResourceBundle* resB = ures_open(NULL,nameOrAbbrOrLocale,&localErrorCode); if(U_SUCCESS(localErrorCode)&& localErrorCode != U_USING_DEFAULT_WARNING){ UResourceBundle* resD = ures_getByKey(resB,kLocaleScript,NULL,&localErrorCode); if(U_SUCCESS(localErrorCode) ){ diff --git a/icuSources/common/uset.cpp b/icuSources/common/uset.cpp index 22b35dc8..cd5f323a 100644 --- a/icuSources/common/uset.cpp +++ b/icuSources/common/uset.cpp @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2002-2003, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -27,65 +27,22 @@ #include "unicode/uniset.h" #include "cmemory.h" #include "unicode/ustring.h" +#include "unicode/parsepos.h" U_CAPI USet* U_EXPORT2 uset_open(UChar32 start, UChar32 end) { return (USet*) new UnicodeSet(start, end); } -U_CAPI USet* U_EXPORT2 -uset_openPattern(const UChar* pattern, int32_t patternLength, - UErrorCode* ec) -{ - UnicodeString pat(patternLength==-1, pattern, patternLength); - UnicodeSet* set = new UnicodeSet(pat, *ec); - /* test for NULL */ - if(set == 0) { - *ec = U_MEMORY_ALLOCATION_ERROR; - return 0; - } - - if (U_FAILURE(*ec)) { - delete set; - set = NULL; - } - return (USet*) set; -} - -U_CAPI USet* U_EXPORT2 -uset_openPatternOptions(const UChar* pattern, int32_t patternLength, - uint32_t options, - UErrorCode* ec) -{ - UnicodeString pat(patternLength==-1, pattern, patternLength); - UnicodeSet* set = new UnicodeSet(pat, options, *ec); - /* test for NULL */ - if(set == 0) { - *ec = U_MEMORY_ALLOCATION_ERROR; - return 0; - } - - if (U_FAILURE(*ec)) { - delete set; - set = NULL; - } - return (USet*) set; -} - - U_CAPI void U_EXPORT2 uset_close(USet* set) { delete (UnicodeSet*) set; } -U_CAPI int32_t U_EXPORT2 -uset_toPattern(const USet* set, - UChar* result, int32_t resultCapacity, - UBool escapeUnprintable, - UErrorCode* ec) { - UnicodeString pat; - ((const UnicodeSet*) set)->toPattern(pat, escapeUnprintable); - return pat.extract(result, resultCapacity, *ec); +U_CAPI void U_EXPORT2 +uset_set(USet* set, + UChar32 start, UChar32 end) { + ((UnicodeSet*) set)->set(start, end); } U_CAPI void U_EXPORT2 @@ -132,11 +89,36 @@ uset_removeString(USet* set, const UChar* str, int32_t strLen) { ((UnicodeSet*) set)->remove(s); } +U_CAPI void U_EXPORT2 +uset_removeAll(USet* set, const USet* remove) { + ((UnicodeSet*) set)->removeAll(*(const UnicodeSet*)remove); +} + +U_CAPI void U_EXPORT2 +uset_retain(USet* set, UChar32 start, UChar32 end) { + ((UnicodeSet*) set)->retain(start, end); +} + +U_CAPI void U_EXPORT2 +uset_retainAll(USet* set, const USet* retain) { + ((UnicodeSet*) set)->retainAll(*(const UnicodeSet*)retain); +} + +U_CAPI void U_EXPORT2 +uset_compact(USet* set) { + ((UnicodeSet*) set)->compact(); +} + U_CAPI void U_EXPORT2 uset_complement(USet* set) { ((UnicodeSet*) set)->complement(); } +U_CAPI void U_EXPORT2 +uset_complementAll(USet* set, const USet* complement) { + ((UnicodeSet*) set)->complementAll(*(const UnicodeSet*)complement); +} + U_CAPI void U_EXPORT2 uset_clear(USet* set) { ((UnicodeSet*) set)->clear(); @@ -163,6 +145,36 @@ uset_containsString(const USet* set, const UChar* str, int32_t strLen) { return ((const UnicodeSet*) set)->contains(s); } +U_CAPI UBool U_EXPORT2 +uset_containsAll(const USet* set1, const USet* set2) { + return ((const UnicodeSet*) set1)->containsAll(* (const UnicodeSet*) set2); +} + +U_CAPI UBool U_EXPORT2 +uset_containsNone(const USet* set1, const USet* set2) { + return ((const UnicodeSet*) set1)->containsNone(* (const UnicodeSet*) set2); +} + +U_CAPI UBool U_EXPORT2 +uset_containsSome(const USet* set1, const USet* set2) { + return ((const UnicodeSet*) set1)->containsSome(* (const UnicodeSet*) set2); +} + +U_CAPI UBool U_EXPORT2 +uset_equals(const USet* set1, const USet* set2) { + return *(const UnicodeSet*)set1 == *(const UnicodeSet*)set2; +} + +U_CAPI int32_t U_EXPORT2 +uset_indexOf(const USet* set, UChar32 c) { + return ((UnicodeSet*) set)->indexOf(c); +} + +U_CAPI UChar32 U_EXPORT2 +uset_charAt(const USet* set, int32_t index) { + return ((UnicodeSet*) set)->charAt(index); +} + U_CAPI int32_t U_EXPORT2 uset_size(const USet* set) { return ((const UnicodeSet*) set)->size(); diff --git a/icuSources/common/uset_imp.h b/icuSources/common/uset_imp.h new file mode 100644 index 00000000..b5a969e1 --- /dev/null +++ b/icuSources/common/uset_imp.h @@ -0,0 +1,60 @@ +/* +******************************************************************************* +* +* Copyright (C) 2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: uset_imp.h +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2004sep07 +* created by: Markus W. Scherer +* +* Internal USet definitions. +*/ + +#ifndef __USET_IMP_H__ +#define __USET_IMP_H__ + +#include "unicode/utypes.h" +#include "unicode/uset.h" + +U_CDECL_BEGIN + +typedef void U_CALLCONV +USetAdd(USet *set, UChar32 c); + +typedef void U_CALLCONV +USetAddRange(USet *set, UChar32 start, UChar32 end); + +typedef void U_CALLCONV +USetAddString(USet *set, const UChar *str, int32_t length); + +/** + * Interface for adding items to a USet, to keep low-level code from + * statically depending on the USet implementation. + * Calls will look like sa->add(sa->set, c); + */ +struct USetAdder { + USet *set; + USetAdd *add; + USetAddRange *addRange; + USetAddString *addString; +}; +typedef struct USetAdder USetAdder; + +U_CDECL_END + +/** + * Get the set of "white space" characters in the sense of ICU rule + * parsers. Caller must close/delete result. + * @internal + */ +U_CAPI USet* U_EXPORT2 +uprv_openRuleWhiteSpaceSet(UErrorCode* ec); + +#endif + diff --git a/icuSources/common/uset_props.cpp b/icuSources/common/uset_props.cpp new file mode 100644 index 00000000..d2f8824d --- /dev/null +++ b/icuSources/common/uset_props.cpp @@ -0,0 +1,146 @@ +/* +******************************************************************************* +* +* Copyright (C) 2002-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: uset_props.cpp +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2004aug30 +* created by: Markus W. Scherer +* +* C wrappers around UnicodeSet functions that are implemented in +* uniset_props.cpp, split off for modularization. +*/ + +#include "unicode/utypes.h" +#include "unicode/uobject.h" +#include "unicode/uset.h" +#include "unicode/uniset.h" +#include "cmemory.h" +#include "unicode/ustring.h" +#include "unicode/parsepos.h" + +U_CAPI USet* U_EXPORT2 +uset_openPattern(const UChar* pattern, int32_t patternLength, + UErrorCode* ec) +{ + UnicodeString pat(patternLength==-1, pattern, patternLength); + UnicodeSet* set = new UnicodeSet(pat, *ec); + /* test for NULL */ + if(set == 0) { + *ec = U_MEMORY_ALLOCATION_ERROR; + return 0; + } + + if (U_FAILURE(*ec)) { + delete set; + set = NULL; + } + return (USet*) set; +} + +U_CAPI USet* U_EXPORT2 +uset_openPatternOptions(const UChar* pattern, int32_t patternLength, + uint32_t options, + UErrorCode* ec) +{ + UnicodeString pat(patternLength==-1, pattern, patternLength); + UnicodeSet* set = new UnicodeSet(pat, options, NULL, *ec); + /* test for NULL */ + if(set == 0) { + *ec = U_MEMORY_ALLOCATION_ERROR; + return 0; + } + + if (U_FAILURE(*ec)) { + delete set; + set = NULL; + } + return (USet*) set; +} + + +U_CAPI int32_t U_EXPORT2 +uset_applyPattern(USet *set, + const UChar *pattern, int32_t patternLength, + uint32_t options, + UErrorCode *status){ + + // status code needs to be checked since we + // dereference it + if(status == NULL || U_FAILURE(*status)){ + return 0; + } + + // check only the set paramenter + // if pattern is NULL or null terminate + // UnicodeString constructor takes care of it + if(set == NULL){ + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + UnicodeString pat(pattern, patternLength); + + ParsePosition pos; + + ((UnicodeSet*) set)->applyPattern(pat, pos, options, NULL, *status); + + return pos.getIndex(); +} + +U_CAPI void U_EXPORT2 +uset_applyIntPropertyValue(USet* set, + UProperty prop, int32_t value, UErrorCode* ec) { + ((UnicodeSet*) set)->applyIntPropertyValue(prop, value, *ec); +} + +U_CAPI void U_EXPORT2 +uset_applyPropertyAlias(USet* set, + const UChar *prop, int32_t propLength, + const UChar *value, int32_t valueLength, + UErrorCode* ec) { + + UnicodeString p(prop, propLength); + UnicodeString v(value, valueLength); + + ((UnicodeSet*) set)->applyPropertyAlias(p, v, *ec); +} + +U_CAPI UBool U_EXPORT2 +uset_resemblesPattern(const UChar *pattern, int32_t patternLength, + int32_t pos) { + + UnicodeString pat(pattern, patternLength); + + return ((pos+1) < pat.length() && + pat.charAt(pos) == (UChar)91/*[*/) || + UnicodeSet::resemblesPattern(pat, pos); +} + +U_CAPI int32_t U_EXPORT2 +uset_toPattern(const USet* set, + UChar* result, int32_t resultCapacity, + UBool escapeUnprintable, + UErrorCode* ec) { + UnicodeString pat; + ((const UnicodeSet*) set)->toPattern(pat, escapeUnprintable); + return pat.extract(result, resultCapacity, *ec); +} + +U_CAPI USet* U_EXPORT2 +uprv_openRuleWhiteSpaceSet(UErrorCode* ec) { + static const UChar _PATTERN[] = { + /* "[[:Cf:][:WSpace:]]" */ + 91, 91, 58, 67, 102, 58, 93, 91, 58, 87, + 83, 112, 97, 99, 101, 58, 93, 93, 0 + }; + return uset_openPattern(_PATTERN, + sizeof(_PATTERN)/sizeof(_PATTERN[0])-1, ec); +} + diff --git a/icuSources/common/usetiter.cpp b/icuSources/common/usetiter.cpp index 0636b028..75a75de4 100644 --- a/icuSources/common/usetiter.cpp +++ b/icuSources/common/usetiter.cpp @@ -1,10 +1,8 @@ /* ********************************************************************** -* Copyright (c) 2002, International Business Machines +* Copyright (c) 2002-2003, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** -* $Source: /cvs/root/ICU/icuSources/common/usetiter.cpp,v $ -********************************************************************** */ #include "unicode/usetiter.h" #include "unicode/uniset.h" @@ -13,7 +11,7 @@ U_NAMESPACE_BEGIN -const char UnicodeSetIterator::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(UnicodeSetIterator) /** * Create an iterator diff --git a/icuSources/common/ushape.c b/icuSources/common/ushape.c index 9e5113d8..a4f62977 100644 --- a/icuSources/common/ushape.c +++ b/icuSources/common/ushape.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 2000-2001, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -19,8 +19,9 @@ #include "unicode/utypes.h" #include "unicode/uchar.h" #include "unicode/ustring.h" -#include "cmemory.h" #include "unicode/ushape.h" +#include "cmemory.h" +#include "putilimp.h" #include "ustr_imp.h" #if UTF_SIZE<16 diff --git a/icuSources/common/usprep.cpp b/icuSources/common/usprep.cpp new file mode 100644 index 00000000..975a598d --- /dev/null +++ b/icuSources/common/usprep.cpp @@ -0,0 +1,904 @@ +/* + ******************************************************************************* + * + * Copyright (C) 2003-2004, International Business Machines + * Corporation and others. All Rights Reserved. + * + ******************************************************************************* + * file name: usprep.cpp + * encoding: US-ASCII + * tab size: 8 (not used) + * indentation:4 + * + * created on: 2003jul2 + * created by: Ram Viswanadha + */ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_IDNA + +#include "unicode/usprep.h" + +#include "unicode/unorm.h" +#include "unicode/ustring.h" +#include "unicode/uchar.h" +#include "unicode/uversion.h" +#include "umutex.h" +#include "cmemory.h" +#include "sprpimpl.h" +#include "ustr_imp.h" +#include "uhash.h" +#include "cstring.h" +#include "udataswp.h" +#include "ucln_cmn.h" +#include "unormimp.h" + +U_CDECL_BEGIN + +/* +Static cache for already opened StringPrep profiles +*/ +static UHashtable *SHARED_DATA_HASHTABLE = NULL; + +static UMTX usprepMutex = NULL; + +/* format version of spp file */ +static uint8_t formatVersion[4]={ 0, 0, 0, 0 }; + +/* the Unicode version of the sprep data */ +static UVersionInfo dataVersion={ 0, 0, 0, 0 }; + +static UBool U_CALLCONV +isSPrepAcceptable(void * /* context */, + const char * /* type */, + const char * /* name */, + const UDataInfo *pInfo) { + if( + pInfo->size>=20 && + pInfo->isBigEndian==U_IS_BIG_ENDIAN && + pInfo->charsetFamily==U_CHARSET_FAMILY && + pInfo->dataFormat[0]==0x53 && /* dataFormat="SPRP" */ + pInfo->dataFormat[1]==0x50 && + pInfo->dataFormat[2]==0x52 && + pInfo->dataFormat[3]==0x50 && + pInfo->formatVersion[0]==3 && + pInfo->formatVersion[2]==UTRIE_SHIFT && + pInfo->formatVersion[3]==UTRIE_INDEX_SHIFT + ) { + uprv_memcpy(formatVersion, pInfo->formatVersion, 4); + uprv_memcpy(dataVersion, pInfo->dataVersion, 4); + return TRUE; + } else { + return FALSE; + } +} + +static int32_t U_CALLCONV +getSPrepFoldingOffset(uint32_t data) { + + return (int32_t)data; + +} + +/* hashes an entry */ +static int32_t U_EXPORT2 U_CALLCONV +hashEntry(const UHashTok parm) { + UStringPrepKey *b = (UStringPrepKey *)parm.pointer; + UHashTok namekey, pathkey; + namekey.pointer = b->name; + pathkey.pointer = b->path; + return uhash_hashChars(namekey)+37*uhash_hashChars(pathkey); +} + +/* compares two entries */ +static UBool U_EXPORT2 U_CALLCONV +compareEntries(const UHashTok p1, const UHashTok p2) { + UStringPrepKey *b1 = (UStringPrepKey *)p1.pointer; + UStringPrepKey *b2 = (UStringPrepKey *)p2.pointer; + UHashTok name1, name2, path1, path2; + name1.pointer = b1->name; + name2.pointer = b2->name; + path1.pointer = b1->path; + path2.pointer = b2->path; + return ((UBool)(uhash_compareChars(name1, name2) & + uhash_compareChars(path1, path2))); +} + +static void +usprep_unload(UStringPrepProfile* data){ + udata_close(data->sprepData); +} + +static int32_t +usprep_internal_flushCache(UBool noRefCount){ + UStringPrepProfile *profile = NULL; + UStringPrepKey *key = NULL; + int32_t pos = -1; + int32_t deletedNum = 0; + const UHashElement *e; + + /* + * if shared data hasn't even been lazy evaluated yet + * return 0 + */ + umtx_lock(&usprepMutex); + if (SHARED_DATA_HASHTABLE == NULL) { + umtx_unlock(&usprepMutex); + return 0; + } + + /*creates an enumeration to iterate through every element in the table */ + while ((e = uhash_nextElement(SHARED_DATA_HASHTABLE, &pos)) != NULL) + { + profile = (UStringPrepProfile *) e->value.pointer; + key = (UStringPrepKey *) e->key.pointer; + + if ((noRefCount== FALSE && profile->refCount == 0) || + noRefCount== TRUE) { + deletedNum++; + uhash_removeElement(SHARED_DATA_HASHTABLE, e); + + /* unload the data */ + usprep_unload(profile); + + if(key->name != NULL) { + uprv_free(key->name); + key->name=NULL; + } + if(key->path != NULL) { + uprv_free(key->path); + key->path=NULL; + } + uprv_free(profile); + uprv_free(key); + } + + } + umtx_unlock(&usprepMutex); + + return deletedNum; +} + +/* Works just like ucnv_flushCache() +static int32_t +usprep_flushCache(){ + return usprep_internal_flushCache(FALSE); +} +*/ + +static UBool U_CALLCONV usprep_cleanup(void){ + if (SHARED_DATA_HASHTABLE != NULL) { + usprep_internal_flushCache(TRUE); + if (SHARED_DATA_HASHTABLE != NULL && uhash_count(SHARED_DATA_HASHTABLE) == 0) { + uhash_close(SHARED_DATA_HASHTABLE); + SHARED_DATA_HASHTABLE = NULL; + } + } + + umtx_destroy(&usprepMutex); /* Don't worry about destroying the mutex even */ + /* if the hash table still exists. The mutex */ + /* will lazily re-init itself if needed. */ + return (SHARED_DATA_HASHTABLE == NULL); +} +U_CDECL_END + +static void +usprep_init() { + umtx_init(&usprepMutex); +} + +/** Initializes the cache for resources */ +static void +initCache(UErrorCode *status) { + UBool makeCache = FALSE; + umtx_lock(&usprepMutex); + makeCache = (SHARED_DATA_HASHTABLE == NULL); + umtx_unlock(&usprepMutex); + if(makeCache) { + UHashtable *newCache = uhash_open(hashEntry, compareEntries, status); + if (U_FAILURE(*status)) { + return; + } + umtx_lock(&usprepMutex); + if(SHARED_DATA_HASHTABLE == NULL) { + SHARED_DATA_HASHTABLE = newCache; + ucln_common_registerCleanup(UCLN_COMMON_USPREP, usprep_cleanup); + newCache = NULL; + } + umtx_unlock(&usprepMutex); + if(newCache != NULL) { + uhash_close(newCache); + } + } +} + +static UBool U_CALLCONV +loadData(UStringPrepProfile* profile, + const char* path, + const char* name, + const char* type, + UErrorCode* errorCode) { + /* load Unicode SPREP data from file */ + UTrie _sprepTrie={ 0,0,0,0,0,0,0 }; + UDataMemory *dataMemory; + const int32_t *p=NULL; + const uint8_t *pb; + UVersionInfo normUnicodeVersion; + int32_t normUniVer, sprepUniVer, normCorrVer; + + if(errorCode==NULL || U_FAILURE(*errorCode)) { + return 0; + } + + /* open the data outside the mutex block */ + //TODO: change the path + dataMemory=udata_openChoice(path, type, name, isSPrepAcceptable, NULL, errorCode); + if(U_FAILURE(*errorCode)) { + return FALSE; + } + + p=(const int32_t *)udata_getMemory(dataMemory); + pb=(const uint8_t *)(p+_SPREP_INDEX_TOP); + utrie_unserialize(&_sprepTrie, pb, p[_SPREP_INDEX_TRIE_SIZE], errorCode); + _sprepTrie.getFoldingOffset=getSPrepFoldingOffset; + + + if(U_FAILURE(*errorCode)) { + udata_close(dataMemory); + return FALSE; + } + + /* in the mutex block, set the data for this process */ + umtx_lock(&usprepMutex); + if(profile->sprepData==NULL) { + profile->sprepData=dataMemory; + dataMemory=NULL; + uprv_memcpy(&profile->indexes, p, sizeof(profile->indexes)); + uprv_memcpy(&profile->sprepTrie, &_sprepTrie, sizeof(UTrie)); + } else { + p=(const int32_t *)udata_getMemory(profile->sprepData); + } + umtx_unlock(&usprepMutex); + /* initialize some variables */ + profile->mappingData=(uint16_t *)((uint8_t *)(p+_SPREP_INDEX_TOP)+profile->indexes[_SPREP_INDEX_TRIE_SIZE]); + + unorm_getUnicodeVersion(&normUnicodeVersion, errorCode); + normUniVer = (normUnicodeVersion[0] << 24) + (normUnicodeVersion[1] << 16) + + (normUnicodeVersion[2] << 8 ) + (normUnicodeVersion[3]); + sprepUniVer = (dataVersion[0] << 24) + (dataVersion[1] << 16) + + (dataVersion[2] << 8 ) + (dataVersion[3]); + normCorrVer = profile->indexes[_SPREP_NORM_CORRECTNS_LAST_UNI_VERSION]; + + if(U_FAILURE(*errorCode)){ + udata_close(dataMemory); + return FALSE; + } + if( normUniVer < sprepUniVer && /* the Unicode version of SPREP file must be less than the Unicode Vesion of the normalization data */ + normUniVer < normCorrVer && /* the Unicode version of the NormalizationCorrections.txt file should be less than the Unicode Vesion of the normalization data */ + ((profile->indexes[_SPREP_OPTIONS] & _SPREP_NORMALIZATION_ON) > 0) /* normalization turned on*/ + ){ + *errorCode = U_INVALID_FORMAT_ERROR; + udata_close(dataMemory); + return FALSE; + } + profile->isDataLoaded = TRUE; + + /* if a different thread set it first, then close the extra data */ + if(dataMemory!=NULL) { + udata_close(dataMemory); /* NULL if it was set correctly */ + } + + + return profile->isDataLoaded; +} + +static UStringPrepProfile* +usprep_getProfile(const char* path, + const char* name, + UErrorCode *status){ + + UStringPrepProfile* profile = NULL; + + initCache(status); + + if(U_FAILURE(*status)){ + return NULL; + } + + UStringPrepKey stackKey; + /* + * const is cast way to save malloc, strcpy and free calls + * we use the passed in pointers for fetching the data from the + * hash table which is safe + */ + stackKey.name = (char*) name; + stackKey.path = (char*) path; + + /* fetch the data from the cache */ + profile = (UStringPrepProfile*) (uhash_get(SHARED_DATA_HASHTABLE,&stackKey)); + + if(profile == NULL){ + UStringPrepKey* key = (UStringPrepKey*) uprv_malloc(sizeof(UStringPrepKey)); + if(key == NULL){ + *status = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + /* else load the data and put the data in the cache */ + profile = (UStringPrepProfile*) uprv_malloc(sizeof(UStringPrepProfile)); + if(profile == NULL){ + *status = U_MEMORY_ALLOCATION_ERROR; + uprv_free(key); + return NULL; + } + + /* initialize the data struct members */ + uprv_memset(profile->indexes,0,sizeof(profile->indexes)); + profile->mappingData = NULL; + profile->sprepData = NULL; + profile->refCount = 0; + + /* initialize the key memebers */ + key->name = (char*) uprv_malloc(uprv_strlen(name)+1); + if(key->name == NULL){ + *status = U_MEMORY_ALLOCATION_ERROR; + uprv_free(key); + uprv_free(profile); + return NULL; + } + + uprv_strcpy(key->name, name); + + key->path=NULL; + + if(path != NULL){ + key->path = (char*) uprv_malloc(uprv_strlen(path)+1); + if(key->path == NULL){ + *status = U_MEMORY_ALLOCATION_ERROR; + uprv_free(key->path); + uprv_free(key); + uprv_free(profile); + return NULL; + } + uprv_strcpy(key->path, path); + } + + /* load the data */ + if(!loadData(profile, path, name, _SPREP_DATA_TYPE, status) || U_FAILURE(*status) ){ + return NULL; + } + + /* get the options */ + profile->doNFKC = (UBool)((profile->indexes[_SPREP_OPTIONS] & _SPREP_NORMALIZATION_ON) > 0); + profile->checkBiDi = (UBool)((profile->indexes[_SPREP_OPTIONS] & _SPREP_CHECK_BIDI_ON) > 0); + + umtx_lock(&usprepMutex); + /* add the data object to the cache */ + uhash_put(SHARED_DATA_HASHTABLE, key, profile, status); + umtx_unlock(&usprepMutex); + } + umtx_lock(&usprepMutex); + /* increment the refcount */ + profile->refCount++; + umtx_unlock(&usprepMutex); + + return profile; +} + +U_CAPI UStringPrepProfile* U_EXPORT2 +usprep_open(const char* path, + const char* name, + UErrorCode* status){ + + if(status == NULL || U_FAILURE(*status)){ + return NULL; + } + /* initialize the mutex */ + usprep_init(); + + /* initialize the profile struct members */ + return usprep_getProfile(path,name,status);; +} + +U_CAPI void U_EXPORT2 +usprep_close(UStringPrepProfile* profile){ + if(profile==NULL){ + return; + } + + umtx_lock(&usprepMutex); + /* decrement the ref count*/ + if(profile->refCount > 0){ + profile->refCount--; + } + umtx_unlock(&usprepMutex); + +} + +U_CFUNC void +uprv_syntaxError(const UChar* rules, + int32_t pos, + int32_t rulesLen, + UParseError* parseError){ + if(parseError == NULL){ + return; + } + parseError->offset = pos; + parseError->line = 0 ; // we are not using line numbers + + // for pre-context + int32_t start = (pos <=U_PARSE_CONTEXT_LEN)? 0 : (pos - (U_PARSE_CONTEXT_LEN-1)); + int32_t limit = pos; + + u_memcpy(parseError->preContext,rules+start,limit-start); + //null terminate the buffer + parseError->preContext[limit-start] = 0; + + // for post-context; include error rules[pos] + start = pos; + limit = start + (U_PARSE_CONTEXT_LEN-1); + if (limit > rulesLen) { + limit = rulesLen; + } + if (start < rulesLen) { + u_memcpy(parseError->postContext,rules+start,limit-start); + } + //null terminate the buffer + parseError->postContext[limit-start]= 0; +} + + +static inline UStringPrepType +getValues(uint16_t trieWord, int16_t& value, UBool& isIndex){ + + UStringPrepType type; + if(trieWord == 0){ + /* + * Initial value stored in the mapping table + * just return USPREP_TYPE_LIMIT .. so that + * the source codepoint is copied to the destination + */ + type = USPREP_TYPE_LIMIT; + }else if(trieWord >= _SPREP_TYPE_THRESHOLD){ + type = (UStringPrepType) (trieWord - _SPREP_TYPE_THRESHOLD); + }else{ + /* get the type */ + type = USPREP_MAP; + /* ascertain if the value is index or delta */ + if(trieWord & 0x02){ + isIndex = TRUE; + value = trieWord >> 2; //mask off the lower 2 bits and shift + + }else{ + isIndex = FALSE; + value = (int16_t)trieWord; + value = (value >> 2); + + } + + if((trieWord>>2) == _SPREP_MAX_INDEX_VALUE){ + type = USPREP_DELETE; + isIndex =FALSE; + value = 0; + } + } + return type; +} + + + +static int32_t +usprep_map( const UStringPrepProfile* profile, + const UChar* src, int32_t srcLength, + UChar* dest, int32_t destCapacity, + int32_t options, + UParseError* parseError, + UErrorCode* status ){ + + uint16_t result; + int32_t destIndex=0; + int32_t srcIndex; + UBool allowUnassigned = (UBool) ((options & USPREP_ALLOW_UNASSIGNED)>0); + UStringPrepType type; + int16_t value; + UBool isIndex; + const int32_t* indexes = profile->indexes; + + // no error checking the caller check for error and arguments + // no string length check the caller finds out the string length + + for(srcIndex=0;srcIndexsprepTrie,ch,result); + + type = getValues(result, value, isIndex); + + // check if the source codepoint is unassigned + if(type == USPREP_UNASSIGNED && allowUnassigned == FALSE){ + + uprv_syntaxError(src,srcIndex-U16_LENGTH(ch), srcLength,parseError); + *status = U_STRINGPREP_UNASSIGNED_ERROR; + return 0; + + }else if(type == USPREP_MAP){ + + int32_t index, length; + + if(isIndex){ + index = value; + if(index >= indexes[_SPREP_ONE_UCHAR_MAPPING_INDEX_START] && + index < indexes[_SPREP_TWO_UCHARS_MAPPING_INDEX_START]){ + length = 1; + }else if(index >= indexes[_SPREP_TWO_UCHARS_MAPPING_INDEX_START] && + index < indexes[_SPREP_THREE_UCHARS_MAPPING_INDEX_START]){ + length = 2; + }else if(index >= indexes[_SPREP_THREE_UCHARS_MAPPING_INDEX_START] && + index < indexes[_SPREP_FOUR_UCHARS_MAPPING_INDEX_START]){ + length = 3; + }else{ + length = profile->mappingData[index++]; + + } + + /* copy mapping to destination */ + for(int32_t i=0; i< length; i++){ + if(destIndex < destCapacity ){ + dest[destIndex] = profile->mappingData[index+i]; + } + destIndex++; /* for pre-flighting */ + } + continue; + }else{ + // subtract the delta to arrive at the code point + ch -= value; + } + + }else if(type==USPREP_DELETE){ + // just consume the codepoint and contine + continue; + } + //copy the code point into destination + if(ch <= 0xFFFF){ + if(destIndex < destCapacity ){ + dest[destIndex] = (UChar)ch; + } + destIndex++; + }else{ + if(destIndex+1 < destCapacity ){ + dest[destIndex] = U16_LEAD(ch); + dest[destIndex+1] = U16_TRAIL(ch); + } + destIndex +=2; + } + + } + + return u_terminateUChars(dest, destCapacity, destIndex, status); +} + + +static int32_t +usprep_normalize( const UChar* src, int32_t srcLength, + UChar* dest, int32_t destCapacity, + UErrorCode* status ){ + /* + * Option UNORM_BEFORE_PRI_29: + * + * IDNA as interpreted by IETF members (see unicode mailing list 2004H1) + * requires strict adherence to Unicode 3.2 normalization, + * including buggy composition from before fixing Public Review Issue #29. + * Note that this results in some valid but nonsensical text to be + * either corrupted or rejected, depending on the text. + * See http://www.unicode.org/review/resolved-pri.html#pri29 + * See unorm.cpp and cnormtst.c + */ + return unorm_normalize( + src, srcLength, + UNORM_NFKC, UNORM_UNICODE_3_2|UNORM_BEFORE_PRI_29, + dest, destCapacity, + status); +} + + + /* + 1) Map -- For each character in the input, check if it has a mapping + and, if so, replace it with its mapping. + + 2) Normalize -- Possibly normalize the result of step 1 using Unicode + normalization. + + 3) Prohibit -- Check for any characters that are not allowed in the + output. If any are found, return an error. + + 4) Check bidi -- Possibly check for right-to-left characters, and if + any are found, make sure that the whole string satisfies the + requirements for bidirectional strings. If the string does not + satisfy the requirements for bidirectional strings, return an + error. + [Unicode3.2] defines several bidirectional categories; each character + has one bidirectional category assigned to it. For the purposes of + the requirements below, an "RandALCat character" is a character that + has Unicode bidirectional categories "R" or "AL"; an "LCat character" + is a character that has Unicode bidirectional category "L". Note + + + that there are many characters which fall in neither of the above + definitions; Latin digits ( through ) are examples of + this because they have bidirectional category "EN". + + In any profile that specifies bidirectional character handling, all + three of the following requirements MUST be met: + + 1) The characters in section 5.8 MUST be prohibited. + + 2) If a string contains any RandALCat character, the string MUST NOT + contain any LCat character. + + 3) If a string contains any RandALCat character, a RandALCat + character MUST be the first character of the string, and a + RandALCat character MUST be the last character of the string. +*/ + +#define MAX_STACK_BUFFER_SIZE 300 + + +U_CAPI int32_t U_EXPORT2 +usprep_prepare( const UStringPrepProfile* profile, + const UChar* src, int32_t srcLength, + UChar* dest, int32_t destCapacity, + int32_t options, + UParseError* parseError, + UErrorCode* status ){ + + // check error status + if(status == NULL || U_FAILURE(*status)){ + return 0; + } + + //check arguments + if(profile==NULL || src==NULL || srcLength<-1 || (dest==NULL && destCapacity!=0)) { + *status=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + UChar b1Stack[MAX_STACK_BUFFER_SIZE], b2Stack[MAX_STACK_BUFFER_SIZE]; + UChar *b1 = b1Stack, *b2 = b2Stack; + int32_t b1Len, b2Len=0, + b1Capacity = MAX_STACK_BUFFER_SIZE , + b2Capacity = MAX_STACK_BUFFER_SIZE; + uint16_t result; + int32_t b2Index = 0; + UCharDirection direction=U_CHAR_DIRECTION_COUNT, firstCharDir=U_CHAR_DIRECTION_COUNT; + UBool leftToRight=FALSE, rightToLeft=FALSE; + int32_t rtlPos =-1, ltrPos =-1; + + //get the string length + if(srcLength == -1){ + srcLength = u_strlen(src); + } + // map + b1Len = usprep_map(profile, src, srcLength, b1, b1Capacity, options, parseError, status); + + if(*status == U_BUFFER_OVERFLOW_ERROR){ + // redo processing of string + /* we do not have enough room so grow the buffer*/ + b1 = (UChar*) uprv_malloc(b1Len * U_SIZEOF_UCHAR); + if(b1==NULL){ + *status = U_MEMORY_ALLOCATION_ERROR; + goto CLEANUP; + } + + *status = U_ZERO_ERROR; // reset error + + b1Len = usprep_map(profile, src, srcLength, b1, b1Len, options, parseError, status); + + } + + // normalize + if(profile->doNFKC == TRUE){ + b2Len = usprep_normalize(b1,b1Len, b2,b2Capacity,status); + + if(*status == U_BUFFER_OVERFLOW_ERROR){ + // redo processing of string + /* we do not have enough room so grow the buffer*/ + b2 = (UChar*) uprv_malloc(b2Len * U_SIZEOF_UCHAR); + if(b2==NULL){ + *status = U_MEMORY_ALLOCATION_ERROR; + goto CLEANUP; + } + + *status = U_ZERO_ERROR; // reset error + + b2Len = usprep_normalize(b1,b1Len, b2,b2Len,status); + + } + + }else{ + b2 = b1; + b2Len = b1Len; + } + + + if(U_FAILURE(*status)){ + goto CLEANUP; + } + + UChar32 ch; + UStringPrepType type; + int16_t value; + UBool isIndex; + + // Prohibit and checkBiDi in one pass + for(b2Index=0; b2IndexsprepTrie,ch,result); + + type = getValues(result, value, isIndex); + + if( type == USPREP_PROHIBITED || + ((result < _SPREP_TYPE_THRESHOLD) && (result & 0x01) /* first bit says it the code point is prohibited*/) + ){ + *status = U_STRINGPREP_PROHIBITED_ERROR; + uprv_syntaxError(b1, b2Index-U16_LENGTH(ch), b2Len, parseError); + goto CLEANUP; + } + + direction = u_charDirection(ch); + if(firstCharDir == U_CHAR_DIRECTION_COUNT){ + firstCharDir = direction; + } + if(direction == U_LEFT_TO_RIGHT){ + leftToRight = TRUE; + ltrPos = b2Index-1; + } + if(direction == U_RIGHT_TO_LEFT || direction == U_RIGHT_TO_LEFT_ARABIC){ + rightToLeft = TRUE; + rtlPos = b2Index-1; + } + } + if(profile->checkBiDi == TRUE){ + // satisfy 2 + if( leftToRight == TRUE && rightToLeft == TRUE){ + *status = U_STRINGPREP_CHECK_BIDI_ERROR; + uprv_syntaxError(b2,(rtlPos>ltrPos) ? rtlPos : ltrPos, b2Len, parseError); + goto CLEANUP; + } + + //satisfy 3 + if( rightToLeft == TRUE && + !((firstCharDir == U_RIGHT_TO_LEFT || firstCharDir == U_RIGHT_TO_LEFT_ARABIC) && + (direction == U_RIGHT_TO_LEFT || direction == U_RIGHT_TO_LEFT_ARABIC)) + ){ + *status = U_STRINGPREP_CHECK_BIDI_ERROR; + uprv_syntaxError(b2, rtlPos, b2Len, parseError); + return FALSE; + } + } + if(b2Len <= destCapacity){ + uprv_memmove(dest,b2, b2Len*U_SIZEOF_UCHAR); + } + +CLEANUP: + if(b1!=b1Stack){ + uprv_free(b1); + b1=NULL; + } + + if(b2!=b1Stack && b2!=b2Stack && b2!=b1 /* b1 should not be freed twice */){ + uprv_free(b2); + b2=NULL; + } + return u_terminateUChars(dest, destCapacity, b2Len, status); +} + + +/* data swapping ------------------------------------------------------------ */ + +U_CAPI int32_t U_EXPORT2 +usprep_swap(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const UDataInfo *pInfo; + int32_t headerSize; + + const uint8_t *inBytes; + uint8_t *outBytes; + + const int32_t *inIndexes; + int32_t indexes[16]; + + int32_t i, offset, count, size; + + /* udata_swapDataHeader checks the arguments */ + headerSize=udata_swapDataHeader(ds, inData, length, outData, pErrorCode); + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + + /* check data format and format version */ + pInfo=(const UDataInfo *)((const char *)inData+4); + if(!( + pInfo->dataFormat[0]==0x53 && /* dataFormat="SPRP" */ + pInfo->dataFormat[1]==0x50 && + pInfo->dataFormat[2]==0x52 && + pInfo->dataFormat[3]==0x50 && + pInfo->formatVersion[0]==3 + )) { + udata_printError(ds, "usprep_swap(): data format %02x.%02x.%02x.%02x (format version %02x) is not recognized as StringPrep .spp data\n", + pInfo->dataFormat[0], pInfo->dataFormat[1], + pInfo->dataFormat[2], pInfo->dataFormat[3], + pInfo->formatVersion[0]); + *pErrorCode=U_UNSUPPORTED_ERROR; + return 0; + } + + inBytes=(const uint8_t *)inData+headerSize; + outBytes=(uint8_t *)outData+headerSize; + + inIndexes=(const int32_t *)inBytes; + + if(length>=0) { + length-=headerSize; + if(length<16*4) { + udata_printError(ds, "usprep_swap(): too few bytes (%d after header) for StringPrep .spp data\n", + length); + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + } + + /* read the first 16 indexes (ICU 2.8/format version 3: _SPREP_INDEX_TOP==16, might grow) */ + for(i=0; i<16; ++i) { + indexes[i]=udata_readInt32(ds, inIndexes[i]); + } + + /* calculate the total length of the data */ + size= + 16*4+ /* size of indexes[] */ + indexes[_SPREP_INDEX_TRIE_SIZE]+ + indexes[_SPREP_INDEX_MAPPING_DATA_SIZE]; + + if(length>=0) { + if(lengthswapArray32(ds, inBytes, count, outBytes, pErrorCode); + offset+=count; + + /* swap the UTrie */ + count=indexes[_SPREP_INDEX_TRIE_SIZE]; + utrie_swap(ds, inBytes+offset, count, outBytes+offset, pErrorCode); + offset+=count; + + /* swap the uint16_t mappingTable[] */ + count=indexes[_SPREP_INDEX_MAPPING_DATA_SIZE]; + ds->swapArray16(ds, inBytes+offset, count, outBytes+offset, pErrorCode); + offset+=count; + } + + return headerSize+size; +} + +#endif /* #if !UCONFIG_NO_IDNA */ diff --git a/icuSources/common/ustack.cpp b/icuSources/common/ustack.cpp new file mode 100644 index 00000000..ef528686 --- /dev/null +++ b/icuSources/common/ustack.cpp @@ -0,0 +1,14 @@ +/* +********************************************************************** +* Copyright (C) 2003-2003, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +*/ + +#include "uvector.h" + +U_NAMESPACE_BEGIN + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(UStack) + +U_NAMESPACE_END diff --git a/icuSources/common/ustr_cnv.c b/icuSources/common/ustr_cnv.c new file mode 100644 index 00000000..a0537e60 --- /dev/null +++ b/icuSources/common/ustr_cnv.c @@ -0,0 +1,230 @@ +/* +******************************************************************************* +* +* Copyright (C) 1998-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: ustr_cnv.c +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2004aug24 +* created by: Markus W. Scherer +* +* Character conversion functions moved here from ustring.c +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_CONVERSION + +#include "unicode/ustring.h" +#include "unicode/ucnv.h" +#include "cstring.h" +#include "cmemory.h" +#include "umutex.h" +#include "ustr_cnv.h" + +/* mutexed access to a shared default converter ----------------------------- */ + +static UConverter *gDefaultConverter = NULL; + +U_CAPI UConverter* U_EXPORT2 +u_getDefaultConverter(UErrorCode *status) +{ + UConverter *converter = NULL; + + if (gDefaultConverter != NULL) { + umtx_lock(NULL); + + /* need to check to make sure it wasn't taken out from under us */ + if (gDefaultConverter != NULL) { + converter = gDefaultConverter; + gDefaultConverter = NULL; + } + umtx_unlock(NULL); + } + + /* if the cache was empty, create a converter */ + if(converter == NULL) { + converter = ucnv_open(NULL, status); + if(U_FAILURE(*status)) { + ucnv_close(converter); + converter = NULL; + } + } + + return converter; +} + +U_CAPI void U_EXPORT2 +u_releaseDefaultConverter(UConverter *converter) +{ + if(gDefaultConverter == NULL) { + if (converter != NULL) { + ucnv_reset(converter); + } + umtx_lock(NULL); + + if(gDefaultConverter == NULL) { + gDefaultConverter = converter; + converter = NULL; + } + umtx_unlock(NULL); + } + + if(converter != NULL) { + ucnv_close(converter); + } +} + +/* conversions between char* and UChar* ------------------------------------- */ + +/* maximum string length for u_uastrcpy() and u_austrcpy() implementations */ +#define MAX_STRLEN 0x0FFFFFFF + +/* + returns the minimum of (the length of the null-terminated string) and n. +*/ +static int32_t u_astrnlen(const char *s1, int32_t n) +{ + int32_t len = 0; + + if (s1) + { + while (n-- && *(s1++)) + { + len++; + } + } + return len; +} + +U_CAPI UChar* U_EXPORT2 +u_uastrncpy(UChar *ucs1, + const char *s2, + int32_t n) +{ + UChar *target = ucs1; + UErrorCode err = U_ZERO_ERROR; + UConverter *cnv = u_getDefaultConverter(&err); + if(U_SUCCESS(err) && cnv != NULL) { + ucnv_reset(cnv); + ucnv_toUnicode(cnv, + &target, + ucs1+n, + &s2, + s2+u_astrnlen(s2, n), + NULL, + TRUE, + &err); + ucnv_reset(cnv); /* be good citizens */ + u_releaseDefaultConverter(cnv); + if(U_FAILURE(err) && (err != U_BUFFER_OVERFLOW_ERROR) ) { + *ucs1 = 0; /* failure */ + } + if(target < (ucs1+n)) { /* U_BUFFER_OVERFLOW_ERROR isn't an err, just means no termination will happen. */ + *target = 0; /* terminate */ + } + } else { + *ucs1 = 0; + } + return ucs1; +} + +U_CAPI UChar* U_EXPORT2 +u_uastrcpy(UChar *ucs1, + const char *s2 ) +{ + UErrorCode err = U_ZERO_ERROR; + UConverter *cnv = u_getDefaultConverter(&err); + if(U_SUCCESS(err) && cnv != NULL) { + ucnv_toUChars(cnv, + ucs1, + MAX_STRLEN, + s2, + uprv_strlen(s2), + &err); + u_releaseDefaultConverter(cnv); + if(U_FAILURE(err)) { + *ucs1 = 0; + } + } else { + *ucs1 = 0; + } + return ucs1; +} + +/* + returns the minimum of (the length of the null-terminated string) and n. +*/ +static int32_t u_ustrnlen(const UChar *ucs1, int32_t n) +{ + int32_t len = 0; + + if (ucs1) + { + while (n-- && *(ucs1++)) + { + len++; + } + } + return len; +} + +U_CAPI char* U_EXPORT2 +u_austrncpy(char *s1, + const UChar *ucs2, + int32_t n) +{ + char *target = s1; + UErrorCode err = U_ZERO_ERROR; + UConverter *cnv = u_getDefaultConverter(&err); + if(U_SUCCESS(err) && cnv != NULL) { + ucnv_reset(cnv); + ucnv_fromUnicode(cnv, + &target, + s1+n, + &ucs2, + ucs2+u_ustrnlen(ucs2, n), + NULL, + TRUE, + &err); + ucnv_reset(cnv); /* be good citizens */ + u_releaseDefaultConverter(cnv); + if(U_FAILURE(err) && (err != U_BUFFER_OVERFLOW_ERROR) ) { + *s1 = 0; /* failure */ + } + if(target < (s1+n)) { /* U_BUFFER_OVERFLOW_ERROR isn't an err, just means no termination will happen. */ + *target = 0; /* terminate */ + } + } else { + *s1 = 0; + } + return s1; +} + +U_CAPI char* U_EXPORT2 +u_austrcpy(char *s1, + const UChar *ucs2 ) +{ + UErrorCode err = U_ZERO_ERROR; + UConverter *cnv = u_getDefaultConverter(&err); + if(U_SUCCESS(err) && cnv != NULL) { + int32_t len = ucnv_fromUChars(cnv, + s1, + MAX_STRLEN, + ucs2, + -1, + &err); + u_releaseDefaultConverter(cnv); + s1[len] = 0; + } else { + *s1 = 0; + } + return s1; +} + +#endif diff --git a/icuSources/common/ustr_cnv.h b/icuSources/common/ustr_cnv.h new file mode 100644 index 00000000..942b4c64 --- /dev/null +++ b/icuSources/common/ustr_cnv.h @@ -0,0 +1,42 @@ +/* +********************************************************************** +* Copyright (C) 1999-2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* file name: ustr_cnv.h +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2004Aug27 +* created by: George Rhoten +*/ + +#ifndef USTR_CNV_IMP_H +#define USTR_CNV_IMP_H + +#include "unicode/utypes.h" +#include "unicode/ucnv.h" + +#if !UCONFIG_NO_CONVERSION + +/** + * Get the default converter. This is a commonly used converter + * that is used for the ustring and UnicodeString API. + * Remember to use the u_releaseDefaultConverter when you are done. + * @internal + */ +U_CAPI UConverter* U_EXPORT2 +u_getDefaultConverter(UErrorCode *status); + + +/** + * Release the default converter to the converter cache. + * @internal + */ +U_CAPI void U_EXPORT2 +u_releaseDefaultConverter(UConverter *converter); + +#endif + +#endif diff --git a/icuSources/common/ustr_imp.h b/icuSources/common/ustr_imp.h index ba60f790..3b162e8a 100644 --- a/icuSources/common/ustr_imp.h +++ b/icuSources/common/ustr_imp.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2001, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ustr_imp.h @@ -16,31 +16,15 @@ #define __USTR_IMP_H__ #include "unicode/utypes.h" -#include "unicode/ucnv.h" #include "unicode/uiter.h" +#include "ucase.h" /** Simple declaration for u_strToTitle() to avoid including unicode/ubrk.h. */ #ifndef UBRK_TYPEDEF_UBREAK_ITERATOR # define UBRK_TYPEDEF_UBREAK_ITERATOR - typedef void *UBreakIterator; + typedef void UBreakIterator; #endif -/** - * Bit mask for getting just the options from a string compare options word - * that are relevant for case-insensitive string comparison. - * See uchar.h. Also include _STRNCMP_STYLE and U_COMPARE_CODE_POINT_ORDER. - * @internal - */ -#define _STRCASECMP_OPTIONS_MASK 0xffff - -/** - * Bit mask for getting just the options from a string compare options word - * that are relevant for case folding (of a single string or code point). - * See uchar.h. - * @internal - */ -#define _FOLD_CASE_OPTIONS_MASK 0xff - /** * Compare two strings in code point order or code unit order. * Works in strcmp style (both lengths -1), @@ -53,15 +37,39 @@ uprv_strCompare(const UChar *s1, int32_t length1, const UChar *s2, int32_t length2, UBool strncmpStyle, UBool codePointOrder); +/** + * Internal API, used by u_strcasecmp() etc. + * Compare strings case-insensitively, + * in code point order or code unit order. + * @internal + */ +U_CFUNC int32_t +u_strcmpFold(const UChar *s1, int32_t length1, + const UChar *s2, int32_t length2, + uint32_t options, + UErrorCode *pErrorCode); + /** * Are the Unicode properties loaded? * This must be used before internal functions are called that do * not perform this check. + * Generate a debug assertion failure if data is not loaded, to flag the fact + * that u_init() wasn't called first, before trying to access character properties. * @internal */ U_CFUNC UBool uprv_haveProperties(UErrorCode *pErrorCode); +/** + * Load the Unicode property data. + * Intended primarily for use from u_init(). + * Has no effect if property data is already loaded. + * NOT thread safe. + * @internal + */ +U_CFUNC int8_t +uprv_loadPropsData(UErrorCode *errorCode); + /** * Type of a function that may be passed to the internal case mapping functions * or similar for growing the destination buffer. @@ -88,26 +96,27 @@ u_growBufferFromStatic(void *context, /* * Internal string casing functions implementing * ustring.h/ustrcase.c and UnicodeString case mapping functions. - * - * Lowercases [srcStart..srcLimit[ but takes - * context [0..srcLength[ into account. + */ + +/** * @internal */ U_CFUNC int32_t -u_internalStrToLower(UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - int32_t srcStart, int32_t srcLimit, - const char *locale, - UErrorCode *pErrorCode); +ustr_toLower(UCaseProps *csp, + UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + const char *locale, + UErrorCode *pErrorCode); /** * @internal */ U_CFUNC int32_t -u_internalStrToUpper(UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - const char *locale, - UErrorCode *pErrorCode); +ustr_toUpper(UCaseProps *csp, + UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + const char *locale, + UErrorCode *pErrorCode); #if !UCONFIG_NO_BREAK_ITERATION @@ -115,11 +124,12 @@ u_internalStrToUpper(UChar *dest, int32_t destCapacity, * @internal */ U_CFUNC int32_t -u_internalStrToTitle(UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - UBreakIterator *titleIter, - const char *locale, - UErrorCode *pErrorCode); +ustr_toTitle(UCaseProps *csp, + UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + UBreakIterator *titleIter, + const char *locale, + UErrorCode *pErrorCode); #endif @@ -128,79 +138,11 @@ u_internalStrToTitle(UChar *dest, int32_t destCapacity, * @internal */ U_CFUNC int32_t -u_internalStrFoldCase(UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - uint32_t options, - UErrorCode *pErrorCode); - -/** - * Get the full lowercase mapping for c. - * @param iter Character iterator to check for context for SpecialCasing. - * The current index must be on the character after c. - * This function may or may not change the iterator index. - * If iter==NULL then a context-independent result is returned. - * @return the length of the output, negative if same as c - * @internal - */ -U_CAPI int32_t U_EXPORT2 -u_internalToLower(UChar32 c, UCharIterator *iter, - UChar *dest, int32_t destCapacity, - const char *locale); - -/** - * Get the full uppercase mapping for c. - * @param iter Character iterator to check for context for SpecialCasing. - * The current index must be on the character after c. - * This function may or may not change the iterator index. - * If iter==NULL then a context-independent result is returned. - * @return the length of the output, negative if same as c - * @internal - */ -U_CAPI int32_t U_EXPORT2 -u_internalToUpper(UChar32 c, UCharIterator *iter, - UChar *dest, int32_t destCapacity, - const char *locale); - -/** - * Get the full titlecase mapping for c. - * @param iter Character iterator to check for context for SpecialCasing. - * The current index must be on the character after c. - * This function may or may not change the iterator index. - * If iter==NULL then a context-independent result is returned. - * @return the length of the output, negative if same as c - * @internal - */ -U_CAPI int32_t U_EXPORT2 -u_internalToTitle(UChar32 c, UCharIterator *iter, - UChar *dest, int32_t destCapacity, - const char *locale); - -/** - * Get the full case folding mapping for c. - * @return the length of the output, negative if same as c - * @internal - */ -U_CAPI int32_t U_EXPORT2 -u_internalFoldCase(UChar32 c, - UChar *dest, int32_t destCapacity, - uint32_t options); - -/** - * Get the default converter. This is a commonly used converter - * that is used for the ustring and UnicodeString API. - * Remember to use the u_releaseDefaultConverter when you are done. - * @internal - */ -U_CAPI UConverter* U_EXPORT2 -u_getDefaultConverter(UErrorCode *status); - - -/** - * Release the default converter to the converter cache. - * @internal - */ -U_CAPI void U_EXPORT2 -u_releaseDefaultConverter(UConverter *converter); +ustr_foldCase(UCaseProps *csp, + UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + uint32_t options, + UErrorCode *pErrorCode); /** * NUL-terminate a UChar * string if possible. @@ -239,6 +181,4 @@ u_terminateUChar32s(UChar32 *dest, int32_t destCapacity, int32_t length, UErrorC U_CAPI int32_t U_EXPORT2 u_terminateWChars(wchar_t *dest, int32_t destCapacity, int32_t length, UErrorCode *pErrorCode); -#define u_getMaxCaseExpansion() 10 - #endif diff --git a/icuSources/common/ustr_wcs.c b/icuSources/common/ustr_wcs.c new file mode 100644 index 00000000..119c63ad --- /dev/null +++ b/icuSources/common/ustr_wcs.c @@ -0,0 +1,518 @@ +/* +******************************************************************************* +* +* Copyright (C) 2001-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: ustr_wcs.c +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2004sep07 +* created by: Markus W. Scherer +* +* u_strToWCS() and u_strFromWCS() functions +* moved here from ustrtrns.c for better modularization. +*/ + +#include "unicode/utypes.h" +#include "unicode/ustring.h" +#include "cstring.h" +#include "cwchar.h" +#include "cmemory.h" +#include "ustr_imp.h" +#include "ustr_cnv.h" + +static U_INLINE UBool +u_growAnyBufferFromStatic(void *context, + void **pBuffer, int32_t *pCapacity, int32_t reqCapacity, + int32_t length, int32_t size) { + + void *newBuffer=uprv_malloc(reqCapacity*size); + if(newBuffer!=NULL) { + if(length>0) { + uprv_memcpy(newBuffer, *pBuffer, length*size); + } + *pCapacity=reqCapacity; + } else { + *pCapacity=0; + } + + /* release the old pBuffer if it was not statically allocated */ + if(*pBuffer!=(void *)context) { + uprv_free(*pBuffer); + } + + *pBuffer=newBuffer; + return (UBool)(newBuffer!=NULL); +} + +#define _STACK_BUFFER_CAPACITY 1000 +#define _BUFFER_CAPACITY_MULTIPLIER 2 + +#if !defined(U_WCHAR_IS_UTF16) && !defined(U_WCHAR_IS_UTF32) +/* helper function */ +static wchar_t* +_strToWCS(wchar_t *dest, + int32_t destCapacity, + int32_t *pDestLength, + const UChar *src, + int32_t srcLength, + UErrorCode *pErrorCode){ + + char stackBuffer [_STACK_BUFFER_CAPACITY]; + char* tempBuf = stackBuffer; + int32_t tempBufCapacity = _STACK_BUFFER_CAPACITY; + char* tempBufLimit = stackBuffer + tempBufCapacity; + UConverter* conv = NULL; + char* saveBuf = tempBuf; + wchar_t* intTarget=NULL; + int32_t intTargetCapacity=0; + int count=0,retVal=0; + + const UChar *pSrcLimit =NULL; + const UChar *pSrc = src; + + conv = u_getDefaultConverter(pErrorCode); + + if(U_FAILURE(*pErrorCode)){ + return NULL; + } + + if(srcLength == -1){ + srcLength = u_strlen(pSrc); + } + + pSrcLimit = pSrc + srcLength; + + for(;;) { + /* reset the error state */ + *pErrorCode = U_ZERO_ERROR; + + /* convert to chars using default converter */ + ucnv_fromUnicode(conv,&tempBuf,tempBufLimit,&pSrc,pSrcLimit,NULL,(UBool)(pSrc==pSrcLimit),pErrorCode); + count =(tempBuf - saveBuf); + + /* This should rarely occur */ + if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR){ + tempBuf = saveBuf; + + /* we dont have enough room on the stack grow the buffer */ + if(!u_growAnyBufferFromStatic(stackBuffer,(void**) &tempBuf, &tempBufCapacity, + (_BUFFER_CAPACITY_MULTIPLIER * (srcLength)), count,sizeof(char))){ + goto cleanup; + } + + saveBuf = tempBuf; + tempBufLimit = tempBuf + tempBufCapacity; + tempBuf = tempBuf + count; + + } else { + break; + } + } + + if(U_FAILURE(*pErrorCode)){ + goto cleanup; + } + + /* done with conversion null terminate the char buffer */ + if(count>=tempBufCapacity){ + tempBuf = saveBuf; + /* we dont have enough room on the stack grow the buffer */ + if(!u_growAnyBufferFromStatic(stackBuffer,(void**) &tempBuf, &tempBufCapacity, + tempBufCapacity-count+1, count,sizeof(char))){ + goto cleanup; + } + saveBuf = tempBuf; + } + + saveBuf[count]=0; + + + /* allocate more space than required + * here we assume that every char requires + * no more than 2 wchar_ts + */ + intTargetCapacity = (count * _BUFFER_CAPACITY_MULTIPLIER + 1) /*for null termination */; + intTarget = (wchar_t*)uprv_malloc( intTargetCapacity * sizeof(wchar_t) ); + + if(intTarget){ + + int32_t nulLen = 0; + int32_t remaining = intTargetCapacity; + wchar_t* pIntTarget=intTarget; + tempBuf = saveBuf; + + /* now convert the mbs to wcs */ + for(;;){ + + /* we can call the system API since we are sure that + * there is atleast 1 null in the input + */ + retVal = uprv_mbstowcs(pIntTarget,(tempBuf+nulLen),remaining); + + if(retVal==-1){ + *pErrorCode = U_INVALID_CHAR_FOUND; + break; + }else if(retVal== remaining){/* should never occur */ + int numWritten = (pIntTarget-intTarget); + u_growAnyBufferFromStatic(NULL,(void**) &intTarget, + &intTargetCapacity, + intTargetCapacity * _BUFFER_CAPACITY_MULTIPLIER, + numWritten, + sizeof(wchar_t)); + pIntTarget = intTarget; + remaining=intTargetCapacity; + + if(nulLen!=count){ /*there are embedded nulls*/ + pIntTarget+=numWritten; + remaining-=numWritten; + } + + }else{ + int32_t nulVal; + /*scan for nulls */ + /* we donot check for limit since tempBuf is null terminated */ + while(tempBuf[nulLen++] != 0){ + } + nulVal = (nulLen < srcLength) ? 1 : 0; + pIntTarget = pIntTarget + retVal+nulVal; + remaining -=(retVal+nulVal); + + /* check if we have reached the source limit*/ + if(nulLen>=(count)){ + break; + } + } + } + count = (int32_t)(pIntTarget-intTarget); + + if(0 < count && count <= destCapacity){ + uprv_memcpy(dest,intTarget,count*sizeof(wchar_t)); + } + + if(pDestLength){ + *pDestLength = count; + } + + /* free the allocated memory */ + uprv_free(intTarget); + + }else{ + *pErrorCode = U_MEMORY_ALLOCATION_ERROR; + } +cleanup: + /* are we still using stack buffer */ + if(stackBuffer != saveBuf){ + uprv_free(saveBuf); + } + u_terminateWChars(dest,destCapacity,count,pErrorCode); + + u_releaseDefaultConverter(conv); + + return dest; +} +#endif + +U_CAPI wchar_t* U_EXPORT2 +u_strToWCS(wchar_t *dest, + int32_t destCapacity, + int32_t *pDestLength, + const UChar *src, + int32_t srcLength, + UErrorCode *pErrorCode){ + + /* args check */ + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)){ + return NULL; + } + + if((src==NULL) || (srcLength < -1) || (destCapacity<0) || (!dest && destCapacity > 0)){ + *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + +#ifdef U_WCHAR_IS_UTF16 + /* wchar_t is UTF-16 just do a memcpy */ + if(srcLength == -1){ + srcLength = u_strlen(src); + } + if(0 < srcLength && srcLength <= destCapacity){ + uprv_memcpy(dest,src,srcLength*U_SIZEOF_UCHAR); + } + if(pDestLength){ + *pDestLength = srcLength; + } + + u_terminateUChars(dest,destCapacity,srcLength,pErrorCode); + + return dest; + +#elif defined U_WCHAR_IS_UTF32 + + return (wchar_t*)u_strToUTF32((UChar32*)dest, destCapacity, pDestLength, + src, srcLength, pErrorCode); + +#else + + return _strToWCS(dest,destCapacity,pDestLength,src,srcLength, pErrorCode); + +#endif + +} + +#if !defined(U_WCHAR_IS_UTF16) && !defined(U_WCHAR_IS_UTF32) +/* helper function */ +static UChar* +_strFromWCS( UChar *dest, + int32_t destCapacity, + int32_t *pDestLength, + const wchar_t *src, + int32_t srcLength, + UErrorCode *pErrorCode){ + + int32_t retVal =0, count =0 ; + UConverter* conv = NULL; + UChar* pTarget = NULL; + UChar* pTargetLimit = NULL; + UChar* target = NULL; + + UChar uStack [_STACK_BUFFER_CAPACITY]; + + wchar_t wStack[_STACK_BUFFER_CAPACITY]; + wchar_t* pWStack = wStack; + + + char cStack[_STACK_BUFFER_CAPACITY]; + int32_t cStackCap = _STACK_BUFFER_CAPACITY; + char* pCSrc=cStack; + char* pCSave=pCSrc; + char* pCSrcLimit=NULL; + + const wchar_t* pSrc = src; + const wchar_t* pSrcLimit = NULL; + + if(srcLength ==-1){ + /* if the wchar_t source is null terminated we can safely + * assume that there are no embedded nulls, this is a fast + * path for null terminated strings. + */ + for(;;){ + /* convert wchars to chars */ + retVal = uprv_wcstombs(pCSrc,src, cStackCap); + + if(retVal == -1){ + *pErrorCode = U_ILLEGAL_CHAR_FOUND; + goto cleanup; + }else if(retVal == cStackCap){ + /* Should rarely occur */ + u_growAnyBufferFromStatic(cStack,(void**)&pCSrc,&cStackCap, + cStackCap * _BUFFER_CAPACITY_MULTIPLIER, 0, sizeof(char)); + pCSave = pCSrc; + }else{ + /* converted every thing */ + pCSrc = pCSrc+retVal; + break; + } + } + + }else{ + /* here the source is not null terminated + * so it may have nulls embeded and we need to + * do some extra processing + */ + int32_t remaining =cStackCap; + + pSrcLimit = src + srcLength; + + for(;;){ + register int32_t nulLen = 0; + + /* find nulls in the string */ + while(nulLen= _STACK_BUFFER_CAPACITY){ + /* Should rarely occcur */ + /* allocate new buffer buffer */ + pWStack =(wchar_t*) uprv_malloc(sizeof(wchar_t) * (nulLen + 1)); + if(pWStack==NULL){ + *pErrorCode = U_MEMORY_ALLOCATION_ERROR; + goto cleanup; + } + } + if(nulLen>0){ + /* copy the contents to tempStack */ + uprv_memcpy(pWStack,pSrc,nulLen*sizeof(wchar_t)); + } + + /* null terminate the tempBuffer */ + pWStack[nulLen] =0 ; + + if(remaining < (nulLen * MB_CUR_MAX)){ + /* Should rarely occur */ + int32_t len = (pCSrc-pCSave); + pCSrc = pCSave; + /* we do not have enough room so grow the buffer*/ + u_growAnyBufferFromStatic(cStack,(void**)&pCSrc,&cStackCap, + cStackCap+(nulLen*MB_CUR_MAX),len,sizeof(char)); + + pCSave = pCSrc; + pCSrc = pCSave+len; + remaining = cStackCap-(pCSrc - pCSave); + } + /* convert to chars */ + retVal = uprv_wcstombs(pCSrc,pWStack,remaining); + + pCSrc += retVal; + pSrc += nulLen; + srcLength-=nulLen; /* decrement the srcLength */ + break; + } + } + } + + /* OK..now we have converted from wchar_ts to chars now + * convert chars to UChars + */ + pCSrcLimit = pCSrc; + pCSrc = pCSave; + pTarget = target= dest; + pTargetLimit = dest + destCapacity; + + conv= u_getDefaultConverter(pErrorCode); + + if(U_FAILURE(*pErrorCode)|| conv==NULL){ + goto cleanup; + } + + for(;;) { + + *pErrorCode = U_ZERO_ERROR; + + /* convert to stack buffer*/ + ucnv_toUnicode(conv,&pTarget,pTargetLimit,(const char**)&pCSrc,pCSrcLimit,NULL,(UBool)(pCSrc==pCSrcLimit),pErrorCode); + + /* increment count to number written to stack */ + count+= pTarget - target; + + if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR){ + target = uStack; + pTarget = uStack; + pTargetLimit = uStack + _STACK_BUFFER_CAPACITY; + } else { + break; + } + + } + + if(pDestLength){ + *pDestLength =count; + } + + u_terminateUChars(dest,destCapacity,count,pErrorCode); + +cleanup: + + if(cStack != pCSave){ + uprv_free(pCSave); + } + + if(wStack != pWStack){ + uprv_free(pWStack); + } + + u_releaseDefaultConverter(conv); + + return dest; +} +#endif + +U_CAPI UChar* U_EXPORT2 +u_strFromWCS(UChar *dest, + int32_t destCapacity, + int32_t *pDestLength, + const wchar_t *src, + int32_t srcLength, + UErrorCode *pErrorCode) +{ + + /* args check */ + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)){ + return NULL; + } + + if((src==NULL) || (srcLength < -1) || (destCapacity<0) || (!dest && destCapacity > 0)){ + *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + +#ifdef U_WCHAR_IS_UTF16 + /* wchar_t is UTF-16 just do a memcpy */ + if(srcLength == -1){ + srcLength = u_strlen(src); + } + if(0 < srcLength && srcLength <= destCapacity){ + uprv_memcpy(dest,src,srcLength*U_SIZEOF_UCHAR); + } + if(pDestLength){ + *pDestLength = srcLength; + } + + u_terminateUChars(dest,destCapacity,srcLength,pErrorCode); + + return dest; + +#elif defined U_WCHAR_IS_UTF32 + + return u_strFromUTF32(dest, destCapacity, pDestLength, + (UChar32*)src, srcLength, pErrorCode); + +#else + + return _strFromWCS(dest,destCapacity,pDestLength,src,srcLength,pErrorCode); + +#endif + +} diff --git a/icuSources/common/ustrcase.c b/icuSources/common/ustrcase.c index 31e2a608..d7531f2d 100644 --- a/icuSources/common/ustrcase.c +++ b/icuSources/common/ustrcase.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2001-2003, International Business Machines +* Copyright (C) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -19,35 +19,160 @@ */ #include "unicode/utypes.h" +#include "unicode/uloc.h" #include "unicode/ustring.h" #include "unicode/ubrk.h" #include "cmemory.h" +#include "ucase.h" #include "unormimp.h" #include "ustr_imp.h" /* string casing ------------------------------------------------------------ */ +/* append a full case mapping result, see UCASE_MAX_STRING_LENGTH */ +static U_INLINE int32_t +appendResult(UChar *dest, int32_t destIndex, int32_t destCapacity, + int32_t result, const UChar *s) { + UChar32 c; + int32_t length; + + /* decode the result */ + if(result<0) { + /* (not) original code point */ + c=~result; + length=-1; + } else if(result<=UCASE_MAX_STRING_LENGTH) { + c=U_SENTINEL; + length=result; + } else { + c=result; + length=-1; + } + + if(destIndex0) { + dest[destIndex++]=*s++; + --length; + } + } else { + /* overflow */ + destIndex+=length; + } + } + } else { + /* preflight */ + if(length<0) { + destIndex+=U16_LENGTH(c); + } else { + destIndex+=length; + } + } + return destIndex; +} + +static UChar32 U_CALLCONV +utf16_caseContextIterator(void *context, int8_t dir) { + UCaseContext *csc=(UCaseContext *)context; + UChar32 c; + + if(dir<0) { + /* reset for backward iteration */ + csc->index=csc->cpStart; + csc->dir=dir; + } else if(dir>0) { + /* reset for forward iteration */ + csc->index=csc->cpLimit; + csc->dir=dir; + } else { + /* continue current iteration direction */ + dir=csc->dir; + } + + if(dir<0) { + if(csc->startindex) { + U16_PREV((const UChar *)csc->p, csc->start, csc->index, c); + return c; + } + } else { + if(csc->indexlimit) { + U16_NEXT((const UChar *)csc->p, csc->index, csc->limit, c); + return c; + } + } + return U_SENTINEL; +} + +typedef int32_t U_CALLCONV +UCaseMapFull(const UCaseProps *csp, UChar32 c, + UCaseContextIterator *iter, void *context, + const UChar **pString, + const char *locale, int32_t *locCache); + +/* + * Lowercases [srcStart..srcLimit[ but takes + * context [0..srcLength[ into account. + */ +static int32_t +_caseMap(UCaseProps *csp, UCaseMapFull *map, + UChar *dest, int32_t destCapacity, + const UChar *src, UCaseContext *csc, + int32_t srcStart, int32_t srcLimit, + const char *locale, int32_t *locCache, + UErrorCode *pErrorCode) { + const UChar *s; + UChar32 c; + int32_t srcIndex, destIndex; + + /* case mapping loop */ + srcIndex=srcStart; + destIndex=0; + while(srcIndexcpStart=srcIndex; + U16_NEXT(src, srcIndex, srcLimit, c); + csc->cpLimit=srcIndex; + c=map(csp, c, utf16_caseContextIterator, csc, &s, locale, locCache); + destIndex=appendResult(dest, destIndex, destCapacity, c, s); + } + + if(destIndex>destCapacity) { + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + return destIndex; +} + #if !UCONFIG_NO_BREAK_ITERATION /* - * Internal titlecasing function, - * using u_internalStrToLower() and u_internalToTitle(). + * Internal titlecasing function. * * Must get titleIter!=NULL. */ -U_CFUNC int32_t -u_internalStrToTitle(UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - UBreakIterator *titleIter, - const char *locale, - UErrorCode *pErrorCode) { - UCharIterator iter; +static int32_t +_toTitle(UCaseProps *csp, + UChar *dest, int32_t destCapacity, + const UChar *src, UCaseContext *csc, + int32_t srcLength, + UBreakIterator *titleIter, + const char *locale, int32_t *locCache, + UErrorCode *pErrorCode) { + const UChar *s; UChar32 c; - int32_t prev, index, destIndex, length; + int32_t prev, index, destIndex; UBool isFirstIndex; /* set up local variables */ - uiter_setString(&iter, src, srcLength); destIndex=0; prev=0; isFirstIndex=TRUE; @@ -67,20 +192,14 @@ u_internalStrToTitle(UChar *dest, int32_t destCapacity, /* lowercase [prev..index[ */ if(prev=srcLength) { @@ -88,28 +207,108 @@ u_internalStrToTitle(UChar *dest, int32_t destCapacity, } /* titlecase the character at the found index */ - UTF_NEXT_CHAR(src, index, srcLength, c); - iter.move(&iter, index, UITER_ZERO); - if(destIndexcpStart=index; + U16_NEXT(src, index, srcLength, c); + csc->cpLimit=index; + c=ucase_toFullTitle(csp, c, utf16_caseContextIterator, csc, &s, locale, locCache); + destIndex=appendResult(dest, destIndex, destCapacity, c, s); prev=index; } + if(destIndex>destCapacity) { + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } return destIndex; } +U_CFUNC int32_t +ustr_toTitle(UCaseProps *csp, + UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + UBreakIterator *titleIter, + const char *locale, + UErrorCode *pErrorCode) { + UCaseContext csc={ NULL }; + int32_t locCache; + + csc.p=(void *)src; + csc.limit=srcLength; + locCache=0; + + return _toTitle(csp, + dest, destCapacity, + src, &csc, srcLength, + titleIter, locale, &locCache, pErrorCode); +} + #endif +/* functions available in the common library (for unistr_case.cpp) */ + +U_CFUNC int32_t +ustr_toLower(UCaseProps *csp, + UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + const char *locale, + UErrorCode *pErrorCode) { + UCaseContext csc={ NULL }; + int32_t locCache; + + csc.p=(void *)src; + csc.limit=srcLength; + locCache=0; + + return _caseMap(csp, ucase_toFullLower, + dest, destCapacity, + src, &csc, 0, srcLength, + locale, &locCache, pErrorCode); +} + +U_CFUNC int32_t +ustr_toUpper(UCaseProps *csp, + UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + const char *locale, + UErrorCode *pErrorCode) { + UCaseContext csc={ NULL }; + int32_t locCache; + + csc.p=(void *)src; + csc.limit=srcLength; + locCache=0; + + return _caseMap(csp, ucase_toFullUpper, + dest, destCapacity, + src, &csc, 0, srcLength, + locale, &locCache, pErrorCode); +} + +U_CFUNC int32_t +ustr_foldCase(UCaseProps *csp, + UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + uint32_t options, + UErrorCode *pErrorCode) { + int32_t srcIndex, destIndex; + + const UChar *s; + UChar32 c; + + /* case mapping loop */ + srcIndex=destIndex=0; + while(srcIndexdestCapacity) { + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + return destIndex; +} + /* * Implement argument checking and buffer handling * for string case mapping as a common function. @@ -121,16 +320,21 @@ enum { FOLD_CASE }; +/* common internal function for public API functions */ + static int32_t -u_strCaseMap(UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - UBreakIterator *titleIter, - const char *locale, - uint32_t options, - int32_t toWhichCase, - UErrorCode *pErrorCode) { +caseMap(UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + UBreakIterator *titleIter, + const char *locale, + uint32_t options, + int32_t toWhichCase, + UErrorCode *pErrorCode) { UChar buffer[300]; UChar *temp; + + UCaseProps *csp; + int32_t destLength; UBool ownTitleIter; @@ -147,6 +351,11 @@ u_strCaseMap(UChar *dest, int32_t destCapacity, return 0; } + csp=ucase_getSingleton(pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return 0; + } + /* get the string length */ if(srcLength==-1) { srcLength=u_strlen(src); @@ -176,30 +385,51 @@ u_strCaseMap(UChar *dest, int32_t destCapacity, ownTitleIter=FALSE; destLength=0; - if(toWhichCase==TO_LOWER) { - destLength=u_internalStrToLower(temp, destCapacity, - src, srcLength, - 0, srcLength, - locale, pErrorCode); - } else if(toWhichCase==TO_UPPER) { - destLength=u_internalStrToUpper(temp, destCapacity, src, srcLength, - locale, pErrorCode); -#if !UCONFIG_NO_BREAK_ITERATION - } else if(toWhichCase==TO_TITLE) { - if(titleIter==NULL) { - titleIter=ubrk_open(UBRK_WORD, locale, - src, srcLength, - pErrorCode); - ownTitleIter=(UBool)U_SUCCESS(*pErrorCode); + if(toWhichCase==FOLD_CASE) { + destLength=ustr_foldCase(csp, temp, destCapacity, src, srcLength, + options, pErrorCode); + } else { + UCaseContext csc={ NULL }; + int32_t locCache; + + csc.p=(void *)src; + csc.limit=srcLength; + locCache=0; + + /* the internal functions require locale!=NULL */ + if(locale==NULL) { + locale=uloc_getDefault(); } - if(U_SUCCESS(*pErrorCode)) { - destLength=u_internalStrToTitle(temp, destCapacity, src, srcLength, - titleIter, locale, pErrorCode); + + if(toWhichCase==TO_LOWER) { + destLength=_caseMap(csp, ucase_toFullLower, + temp, destCapacity, + src, &csc, + 0, srcLength, + locale, &locCache, pErrorCode); + } else if(toWhichCase==TO_UPPER) { + destLength=_caseMap(csp, ucase_toFullUpper, + temp, destCapacity, + src, &csc, + 0, srcLength, + locale, &locCache, pErrorCode); + } else /* if(toWhichCase==TO_TITLE) */ { + #if UCONFIG_NO_BREAK_ITERATION + *pErrorCode=U_UNSUPPORTED_ERROR; + #else + if(titleIter==NULL) { + titleIter=ubrk_open(UBRK_WORD, locale, + src, srcLength, + pErrorCode); + ownTitleIter=(UBool)U_SUCCESS(*pErrorCode); + } + if(U_SUCCESS(*pErrorCode)) { + destLength=_toTitle(csp, temp, destCapacity, + src, &csc, srcLength, + titleIter, locale, &locCache, pErrorCode); + } + #endif } -#endif - } else { - destLength=u_internalStrFoldCase(temp, destCapacity, src, srcLength, - options, pErrorCode); } if(temp!=dest) { /* copy the result string to the destination buffer */ @@ -223,15 +453,17 @@ u_strCaseMap(UChar *dest, int32_t destCapacity, return u_terminateUChars(dest, destCapacity, destLength, pErrorCode); } +/* public API functions */ + U_CAPI int32_t U_EXPORT2 u_strToLower(UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, const char *locale, UErrorCode *pErrorCode) { - return u_strCaseMap(dest, destCapacity, - src, srcLength, - NULL, locale, 0, - TO_LOWER, pErrorCode); + return caseMap(dest, destCapacity, + src, srcLength, + NULL, locale, 0, + TO_LOWER, pErrorCode); } U_CAPI int32_t U_EXPORT2 @@ -239,36 +471,355 @@ u_strToUpper(UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, const char *locale, UErrorCode *pErrorCode) { - return u_strCaseMap(dest, destCapacity, - src, srcLength, - NULL, locale, 0, - TO_UPPER, pErrorCode); + return caseMap(dest, destCapacity, + src, srcLength, + NULL, locale, 0, + TO_UPPER, pErrorCode); } +#if !UCONFIG_NO_BREAK_ITERATION + U_CAPI int32_t U_EXPORT2 u_strToTitle(UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, UBreakIterator *titleIter, const char *locale, UErrorCode *pErrorCode) { - return u_strCaseMap(dest, destCapacity, - src, srcLength, - titleIter, locale, 0, - TO_TITLE, pErrorCode); + return caseMap(dest, destCapacity, + src, srcLength, + titleIter, locale, 0, + TO_TITLE, pErrorCode); } +#endif + U_CAPI int32_t U_EXPORT2 u_strFoldCase(UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, uint32_t options, UErrorCode *pErrorCode) { - return u_strCaseMap(dest, destCapacity, - src, srcLength, - NULL, NULL, options, - FOLD_CASE, pErrorCode); + return caseMap(dest, destCapacity, + src, srcLength, + NULL, NULL, options, + FOLD_CASE, pErrorCode); +} + +/* case-insensitive string comparisons -------------------------------------- */ + +/* + * This function is a copy of unorm_cmpEquivFold() minus the parts for + * canonical equivalence. + * Keep the functions in sync, and see there for how this works. + * The duplication is for modularization: + * It makes caseless (but not canonical caseless) matches independent of + * the normalization code. + */ + +/* stack element for previous-level source/decomposition pointers */ +struct CmpEquivLevel { + const UChar *start, *s, *limit; +}; +typedef struct CmpEquivLevel CmpEquivLevel; + +/* internal function */ +U_CFUNC int32_t +u_strcmpFold(const UChar *s1, int32_t length1, + const UChar *s2, int32_t length2, + uint32_t options, + UErrorCode *pErrorCode) { + UCaseProps *csp; + + /* current-level start/limit - s1/s2 as current */ + const UChar *start1, *start2, *limit1, *limit2; + + /* case folding variables */ + const UChar *p; + int32_t length; + + /* stacks of previous-level start/current/limit */ + CmpEquivLevel stack1[2], stack2[2]; + + /* case folding buffers, only use current-level start/limit */ + UChar fold1[UCASE_MAX_STRING_LENGTH+1], fold2[UCASE_MAX_STRING_LENGTH+1]; + + /* track which is the current level per string */ + int32_t level1, level2; + + /* current code units, and code points for lookups */ + UChar32 c1, c2, cp1, cp2; + + /* no argument error checking because this itself is not an API */ + + /* + * assume that at least the option U_COMPARE_IGNORE_CASE is set + * otherwise this function would have to behave exactly as uprv_strCompare() + */ + csp=ucase_getSingleton(pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return 0; + } + + /* initialize */ + start1=s1; + if(length1==-1) { + limit1=NULL; + } else { + limit1=s1+length1; + } + + start2=s2; + if(length2==-1) { + limit2=NULL; + } else { + limit2=s2+length2; + } + + level1=level2=0; + c1=c2=-1; + + /* comparison loop */ + for(;;) { + /* + * here a code unit value of -1 means "get another code unit" + * below it will mean "this source is finished" + */ + + if(c1<0) { + /* get next code unit from string 1, post-increment */ + for(;;) { + if(s1==limit1 || ((c1=*s1)==0 && (limit1==NULL || (options&_STRNCMP_STYLE)))) { + if(level1==0) { + c1=-1; + break; + } + } else { + ++s1; + break; + } + + /* reached end of level buffer, pop one level */ + do { + --level1; + start1=stack1[level1].start; + } while(start1==NULL); + s1=stack1[level1].s; + limit1=stack1[level1].limit; + } + } + + if(c2<0) { + /* get next code unit from string 2, post-increment */ + for(;;) { + if(s2==limit2 || ((c2=*s2)==0 && (limit2==NULL || (options&_STRNCMP_STYLE)))) { + if(level2==0) { + c2=-1; + break; + } + } else { + ++s2; + break; + } + + /* reached end of level buffer, pop one level */ + do { + --level2; + start2=stack2[level2].start; + } while(start2==NULL); + s2=stack2[level2].s; + limit2=stack2[level2].limit; + } + } + + /* + * compare c1 and c2 + * either variable c1, c2 is -1 only if the corresponding string is finished + */ + if(c1==c2) { + if(c1<0) { + return 0; /* c1==c2==-1 indicating end of strings */ + } + c1=c2=-1; /* make us fetch new code units */ + continue; + } else if(c1<0) { + return -1; /* string 1 ends before string 2 */ + } else if(c2<0) { + return 1; /* string 2 ends before string 1 */ + } + /* c1!=c2 && c1>=0 && c2>=0 */ + + /* get complete code points for c1, c2 for lookups if either is a surrogate */ + cp1=c1; + if(U_IS_SURROGATE(c1)) { + UChar c; + + if(U_IS_SURROGATE_LEAD(c1)) { + if(s1!=limit1 && U16_IS_TRAIL(c=*s1)) { + /* advance ++s1; only below if cp1 decomposes/case-folds */ + cp1=U16_GET_SUPPLEMENTARY(c1, c); + } + } else /* isTrail(c1) */ { + if(start1<=(s1-2) && U16_IS_LEAD(c=*(s1-2))) { + cp1=U16_GET_SUPPLEMENTARY(c, c1); + } + } + } + + cp2=c2; + if(U_IS_SURROGATE(c2)) { + UChar c; + + if(U_IS_SURROGATE_LEAD(c2)) { + if(s2!=limit2 && U16_IS_TRAIL(c=*s2)) { + /* advance ++s2; only below if cp2 decomposes/case-folds */ + cp2=U16_GET_SUPPLEMENTARY(c2, c); + } + } else /* isTrail(c2) */ { + if(start2<=(s2-2) && U16_IS_LEAD(c=*(s2-2))) { + cp2=U16_GET_SUPPLEMENTARY(c, c2); + } + } + } + + /* + * go down one level for each string + * continue with the main loop as soon as there is a real change + */ + + if( level1==0 && + (length=ucase_toFullFolding(csp, (UChar32)cp1, &p, options))>=0 + ) { + /* cp1 case-folds to the code point "length" or to p[length] */ + if(U_IS_SURROGATE(c1)) { + if(U_IS_SURROGATE_LEAD(c1)) { + /* advance beyond source surrogate pair if it case-folds */ + ++s1; + } else /* isTrail(c1) */ { + /* + * we got a supplementary code point when hitting its trail surrogate, + * therefore the lead surrogate must have been the same as in the other string; + * compare this decomposition with the lead surrogate in the other string + * remember that this simulates bulk text replacement: + * the decomposition would replace the entire code point + */ + --s2; + c2=*(s2-1); + } + } + + /* push current level pointers */ + stack1[0].start=start1; + stack1[0].s=s1; + stack1[0].limit=limit1; + ++level1; + + /* copy the folding result to fold1[] */ + if(length<=UCASE_MAX_STRING_LENGTH) { + u_memcpy(fold1, p, length); + } else { + int32_t i=0; + U16_APPEND_UNSAFE(fold1, i, length); + length=i; + } + + /* set next level pointers to case folding */ + start1=s1=fold1; + limit1=fold1+length; + + /* get ready to read from decomposition, continue with loop */ + c1=-1; + continue; + } + + if( level2==0 && + (length=ucase_toFullFolding(csp, (UChar32)cp2, &p, options))>=0 + ) { + /* cp2 case-folds to the code point "length" or to p[length] */ + if(U_IS_SURROGATE(c2)) { + if(U_IS_SURROGATE_LEAD(c2)) { + /* advance beyond source surrogate pair if it case-folds */ + ++s2; + } else /* isTrail(c2) */ { + /* + * we got a supplementary code point when hitting its trail surrogate, + * therefore the lead surrogate must have been the same as in the other string; + * compare this decomposition with the lead surrogate in the other string + * remember that this simulates bulk text replacement: + * the decomposition would replace the entire code point + */ + --s1; + c1=*(s1-1); + } + } + + /* push current level pointers */ + stack2[0].start=start2; + stack2[0].s=s2; + stack2[0].limit=limit2; + ++level2; + + /* copy the folding result to fold2[] */ + if(length<=UCASE_MAX_STRING_LENGTH) { + u_memcpy(fold2, p, length); + } else { + int32_t i=0; + U16_APPEND_UNSAFE(fold2, i, length); + length=i; + } + + /* set next level pointers to case folding */ + start2=s2=fold2; + limit2=fold2+length; + + /* get ready to read from decomposition, continue with loop */ + c2=-1; + continue; + } + + /* + * no decomposition/case folding, max level for both sides: + * return difference result + * + * code point order comparison must not just return cp1-cp2 + * because when single surrogates are present then the surrogate pairs + * that formed cp1 and cp2 may be from different string indexes + * + * example: { d800 d800 dc01 } vs. { d800 dc00 }, compare at second code units + * c1=d800 cp1=10001 c2=dc00 cp2=10000 + * cp1-cp2>0 but c1-c2<0 and in fact in UTF-32 it is { d800 10001 } < { 10000 } + * + * therefore, use same fix-up as in ustring.c/uprv_strCompare() + * except: uprv_strCompare() fetches c=*s while this functions fetches c=*s++ + * so we have slightly different pointer/start/limit comparisons here + */ + + if(c1>=0xd800 && c2>=0xd800 && (options&U_COMPARE_CODE_POINT_ORDER)) { + /* subtract 0x2800 from BMP code points to make them smaller than supplementary ones */ + if( + (c1<=0xdbff && s1!=limit1 && U16_IS_TRAIL(*s1)) || + (U16_IS_TRAIL(c1) && start1!=(s1-1) && U16_IS_LEAD(*(s1-2))) + ) { + /* part of a surrogate pair, leave >=d800 */ + } else { + /* BMP code point - may be surrogate code point - make =d800 */ + } else { + /* BMP code point - may be surrogate code point - make charsCapacity) { + if(capacity<(charsCapacity+charsCapacity/2)) { + // avoid allocation thrashing + capacity=charsCapacity+charsCapacity/2; + } + if(chars!=charsBuffer) { + uprv_free(chars); + } + chars=(char *)uprv_malloc(capacity); + if(chars==NULL) { + chars=charsBuffer; + charsCapacity=sizeof(charsBuffer); + status=U_MEMORY_ALLOCATION_ERROR; + } else { + charsCapacity=capacity; + } + } +} + +UnicodeString * +StringEnumeration::setChars(const char *s, int32_t length, UErrorCode &status) { + if(U_SUCCESS(status) && s!=NULL) { + if(length<0) { + length=(int32_t)uprv_strlen(s); + } + + UChar *buffer=unistr.getBuffer(length+1); + if(buffer!=NULL) { + u_charsToUChars(s, buffer, length); + buffer[length]=0; + unistr.releaseBuffer(length); + return &unistr; + } else { + status=U_MEMORY_ALLOCATION_ERROR; + } + } + + return NULL; +} + +// UStringEnumeration implementation --------------------------------------- *** + +UStringEnumeration::UStringEnumeration(UEnumeration* _uenum) : + uenum(_uenum) { + U_ASSERT(_uenum != 0); +} + +UStringEnumeration::~UStringEnumeration() { + uenum_close(uenum); +} + +int32_t UStringEnumeration::count(UErrorCode& status) const { + return uenum_count(uenum, &status); +} + +const UnicodeString* UStringEnumeration::snext(UErrorCode& status) { + int32_t length; + const UChar* str = uenum_unext(uenum, &length, &status); + if (str == 0 || U_FAILURE(status)) { + return 0; + } + return &unistr.setTo(str, length); +} + +void UStringEnumeration::reset(UErrorCode& status) { + uenum_reset(uenum, &status); +} + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(UStringEnumeration/*, StringEnumeration*/) +U_NAMESPACE_END + +// C wrapper --------------------------------------------------------------- *** #define THIS(en) ((StringEnumeration*)(en->context)) @@ -74,7 +204,7 @@ ustrenum_reset(UEnumeration* en, * Pseudo-vtable for UEnumeration wrapper around StringEnumeration. * The StringEnumeration pointer will be stored in 'context'. */ -static const UEnumeration TEMPLATE = { +static const UEnumeration USTRENUM_VT = { NULL, NULL, // store StringEnumeration pointer here ustrenum_close, @@ -99,7 +229,7 @@ uenum_openStringEnumeration(StringEnumeration* adopted, UErrorCode* ec) { if (result == NULL) { *ec = U_MEMORY_ALLOCATION_ERROR; } else { - uprv_memcpy(result, &TEMPLATE, sizeof(TEMPLATE)); + uprv_memcpy(result, &USTRENUM_VT, sizeof(USTRENUM_VT)); result->context = adopted; } } @@ -109,4 +239,75 @@ uenum_openStringEnumeration(StringEnumeration* adopted, UErrorCode* ec) { return result; } -//eof +// C wrapper --------------------------------------------------------------- *** + +U_CDECL_BEGIN + +typedef struct UCharStringEnumeration { + UEnumeration uenum; + int32_t index, count; +} UCharStringEnumeration; + +static void U_CALLCONV +ucharstrenum_close(UEnumeration* en) { + uprv_free(en); +} + +static int32_t U_CALLCONV +ucharstrenum_count(UEnumeration* en, + UErrorCode* /*ec*/) { + return ((UCharStringEnumeration*)en)->count; +} + +static const char* U_CALLCONV +ucharstrenum_next(UEnumeration* en, + int32_t* resultLength, + UErrorCode* /*ec*/) { + UCharStringEnumeration *e = (UCharStringEnumeration*) en; + if (e->index >= e->count) { + return NULL; + } + const char* result = ((const char**)e->uenum.context)[e->index++]; + if (resultLength) { + *resultLength = (int32_t)uprv_strlen(result); + } + return result; +} + +static void U_CALLCONV +ucharstrenum_reset(UEnumeration* en, + UErrorCode* /*ec*/) { + ((UCharStringEnumeration*)en)->index = 0; +} + +static const UEnumeration UCHARSTRENUM_VT = { + NULL, + NULL, // store StringEnumeration pointer here + ucharstrenum_close, + ucharstrenum_count, + uenum_unextDefault, + ucharstrenum_next, + ucharstrenum_reset +}; + +U_CDECL_END + +U_CAPI UEnumeration* U_EXPORT2 +uenum_openCharStringsEnumeration(const char** strings, int32_t count, + UErrorCode* ec) { + UCharStringEnumeration* result = NULL; + if (U_SUCCESS(*ec) && count >= 0 && (count == 0 || strings != 0)) { + result = (UCharStringEnumeration*) uprv_malloc(sizeof(UCharStringEnumeration)); + if (result == NULL) { + *ec = U_MEMORY_ALLOCATION_ERROR; + } else { + U_ASSERT((char*)result==(char*)(&result->uenum)); + uprv_memcpy(result, &UCHARSTRENUM_VT, sizeof(UCHARSTRENUM_VT)); + result->uenum.context = strings; + result->index = 0; + result->count = count; + } + } + return (UEnumeration*) result; +} + diff --git a/icuSources/common/ustrenum.h b/icuSources/common/ustrenum.h index ba3a135f..f43e0ad2 100644 --- a/icuSources/common/ustrenum.h +++ b/icuSources/common/ustrenum.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (c) 2002, International Business Machines +* Copyright (c) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Author: Alan Liu @@ -22,6 +22,77 @@ U_CAPI UEnumeration* U_EXPORT2 uenum_openStringEnumeration(StringEnumeration* adopted, UErrorCode* ec); -/* _USTRENUM_H_ */ +/** + * Given an array of const char* strings (invariant chars only), + * return a UEnumeration. Must have strings[i] != 0 for i in + * 0..count-1. + */ +U_CAPI UEnumeration* U_EXPORT2 +uenum_openCharStringsEnumeration(const char** strings, int32_t count, + UErrorCode* ec); + +//---------------------------------------------------------------------- +U_NAMESPACE_BEGIN + +/** + * A wrapper to make a UEnumeration into a StringEnumeration. The + * wrapper adopts the UEnumeration is wraps. + */ +class U_COMMON_API UStringEnumeration : public StringEnumeration { + +public: + /** + * Constructor. This constructor adopts its UEnumeration + * argument. + * @param uenum a UEnumeration object. This object takes + * ownership of 'uenum' and will close it in its destructor. The + * caller must not call uenum_close on 'uenum' after calling this + * constructor. + */ + UStringEnumeration(UEnumeration* uenum); + + /** + * Destructor. This closes the UEnumeration passed in to the + * constructor. + */ + virtual ~UStringEnumeration(); + + /** + * Return the number of elements that the iterator traverses. + * @param status the error code. + * @return number of elements in the iterator. + */ + virtual int32_t count(UErrorCode& status) const; + + /** + * Returns the next element a UnicodeString*. If there are no + * more elements, returns NULL. + * @param status the error code. + * @return a pointer to the string, or NULL. + */ + virtual const UnicodeString* snext(UErrorCode& status); + + /** + * Resets the iterator. + * @param status the error code. + */ + virtual void reset(UErrorCode& status); + + /** + * ICU4C "poor man's RTTI", returns a UClassID for the actual ICU class. + */ + virtual UClassID getDynamicClassID() const; + + /** + * ICU4C "poor man's RTTI", returns a UClassID for this ICU class. + */ + static UClassID U_EXPORT2 getStaticClassID(); + +private: + UEnumeration *uenum; // owned +}; + +U_NAMESPACE_END + #endif -/*eof*/ + diff --git a/icuSources/common/ustrfmt.c b/icuSources/common/ustrfmt.c index 4072177a..81b778c1 100644 --- a/icuSources/common/ustrfmt.c +++ b/icuSources/common/ustrfmt.c @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2001-2003, International Business Machines +* Copyright (C) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** */ @@ -9,13 +9,6 @@ #include "ustrfmt.h" #include -U_CAPI double U_EXPORT2 -uprv_strtod(const char* source, char** end) -{ - return strtod(source,end); -} - - U_CAPI char* U_EXPORT2 uprv_dtostr(double value, char *buffer, int maximumDigits,UBool fixedPoint) { diff --git a/icuSources/common/ustrfmt.h b/icuSources/common/ustrfmt.h index c371aa17..814b5373 100644 --- a/icuSources/common/ustrfmt.h +++ b/icuSources/common/ustrfmt.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2001-2003, International Business Machines +* Copyright (C) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** */ @@ -10,8 +10,6 @@ #include "unicode/utypes.h" -U_CAPI double U_EXPORT2 -uprv_strtod(const char* source, char** end); U_CAPI char* U_EXPORT2 uprv_dtostr(double value, char *buffer, int maximumDigits,UBool fixedPoint); U_CAPI int32_t U_EXPORT2 diff --git a/icuSources/common/ustring.c b/icuSources/common/ustring.c index a8fef5b1..8c49959c 100644 --- a/icuSources/common/ustring.c +++ b/icuSources/common/ustring.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1998-2003, International Business Machines +* Copyright (C) 1998-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -16,26 +16,15 @@ */ #include "unicode/utypes.h" -#include "unicode/uchar.h" -#include "unicode/uiter.h" -#include "unicode/ustring.h" #include "unicode/putil.h" -#include "unicode/ucnv.h" +#include "unicode/ustring.h" #include "cstring.h" #include "cwchar.h" #include "cmemory.h" -#include "umutex.h" #include "ustr_imp.h" -/* forward declaractions of definitions for the shared default converter */ - -static UConverter *gDefaultConverter = NULL; - /* ANSI string.h - style functions ------------------------------------------ */ -/* maximum string length for u_uastrcpy() and u_austrcpy() implementations */ -#define MAX_STRLEN 0x0FFFFFFF - /* U+ffff is the highest BMP code point, the highest one that fits into a 16-bit UChar */ #define U_BMP_MAX 0xffff @@ -1166,200 +1155,6 @@ u_memcmpCodePointOrder(const UChar *s1, const UChar *s2, int32_t count) { return uprv_strCompare(s1, count, s2, count, FALSE, TRUE); } -/* conversions between char* and UChar* ------------------------------------- */ - -/* - returns the minimum of (the length of the null-terminated string) and n. -*/ -static int32_t u_astrnlen(const char *s1, int32_t n) -{ - int32_t len = 0; - - if (s1) - { - while (n-- && *(s1++)) - { - len++; - } - } - return len; -} - -U_CAPI UChar* U_EXPORT2 -u_uastrncpy(UChar *ucs1, - const char *s2, - int32_t n) -{ - UChar *target = ucs1; - UErrorCode err = U_ZERO_ERROR; - UConverter *cnv = u_getDefaultConverter(&err); - if(U_SUCCESS(err) && cnv != NULL) { - ucnv_reset(cnv); - ucnv_toUnicode(cnv, - &target, - ucs1+n, - &s2, - s2+u_astrnlen(s2, n), - NULL, - TRUE, - &err); - ucnv_reset(cnv); /* be good citizens */ - u_releaseDefaultConverter(cnv); - if(U_FAILURE(err) && (err != U_BUFFER_OVERFLOW_ERROR) ) { - *ucs1 = 0; /* failure */ - } - if(target < (ucs1+n)) { /* U_BUFFER_OVERFLOW_ERROR isn't an err, just means no termination will happen. */ - *target = 0; /* terminate */ - } - } else { - *ucs1 = 0; - } - return ucs1; -} - -U_CAPI UChar* U_EXPORT2 -u_uastrcpy(UChar *ucs1, - const char *s2 ) -{ - UErrorCode err = U_ZERO_ERROR; - UConverter *cnv = u_getDefaultConverter(&err); - if(U_SUCCESS(err) && cnv != NULL) { - ucnv_toUChars(cnv, - ucs1, - MAX_STRLEN, - s2, - uprv_strlen(s2), - &err); - u_releaseDefaultConverter(cnv); - if(U_FAILURE(err)) { - *ucs1 = 0; - } - } else { - *ucs1 = 0; - } - return ucs1; -} - -/* - returns the minimum of (the length of the null-terminated string) and n. -*/ -static int32_t u_ustrnlen(const UChar *ucs1, int32_t n) -{ - int32_t len = 0; - - if (ucs1) - { - while (n-- && *(ucs1++)) - { - len++; - } - } - return len; -} - -U_CAPI char* U_EXPORT2 -u_austrncpy(char *s1, - const UChar *ucs2, - int32_t n) -{ - char *target = s1; - UErrorCode err = U_ZERO_ERROR; - UConverter *cnv = u_getDefaultConverter(&err); - if(U_SUCCESS(err) && cnv != NULL) { - ucnv_reset(cnv); - ucnv_fromUnicode(cnv, - &target, - s1+n, - &ucs2, - ucs2+u_ustrnlen(ucs2, n), - NULL, - TRUE, - &err); - ucnv_reset(cnv); /* be good citizens */ - u_releaseDefaultConverter(cnv); - if(U_FAILURE(err) && (err != U_BUFFER_OVERFLOW_ERROR) ) { - *s1 = 0; /* failure */ - } - if(target < (s1+n)) { /* U_BUFFER_OVERFLOW_ERROR isn't an err, just means no termination will happen. */ - *target = 0; /* terminate */ - } - } else { - *s1 = 0; - } - return s1; -} - -U_CAPI char* U_EXPORT2 -u_austrcpy(char *s1, - const UChar *ucs2 ) -{ - UErrorCode err = U_ZERO_ERROR; - UConverter *cnv = u_getDefaultConverter(&err); - if(U_SUCCESS(err) && cnv != NULL) { - int32_t len = ucnv_fromUChars(cnv, - s1, - MAX_STRLEN, - ucs2, - -1, - &err); - u_releaseDefaultConverter(cnv); - s1[len] = 0; - } else { - *s1 = 0; - } - return s1; -} - -/* mutexed access to a shared default converter ----------------------------- */ - -U_CAPI UConverter* U_EXPORT2 -u_getDefaultConverter(UErrorCode *status) -{ - UConverter *converter = NULL; - - if (gDefaultConverter != NULL) { - umtx_lock(NULL); - - /* need to check to make sure it wasn't taken out from under us */ - if (gDefaultConverter != NULL) { - converter = gDefaultConverter; - gDefaultConverter = NULL; - } - umtx_unlock(NULL); - } - - /* if the cache was empty, create a converter */ - if(converter == NULL) { - converter = ucnv_open(NULL, status); - if(U_FAILURE(*status)) { - return NULL; - } - } - - return converter; -} - -U_CAPI void U_EXPORT2 -u_releaseDefaultConverter(UConverter *converter) -{ - if(gDefaultConverter == NULL) { - if (converter != NULL) { - ucnv_reset(converter); - } - umtx_lock(NULL); - - if(gDefaultConverter == NULL) { - gDefaultConverter = converter; - converter = NULL; - } - umtx_unlock(NULL); - } - - if(converter != NULL) { - ucnv_close(converter); - } -} - /* u_unescape & support fns ------------------------------------------------- */ /* This map must be in ASCENDING ORDER OF THE ESCAPE CODE */ @@ -1478,6 +1273,24 @@ u_unescapeAt(UNESCAPE_CHAR_AT charAt, } ++(*offset); } + if (result < 0 || result >= 0x110000) { + goto err; + } + /* If an escape sequence specifies a lead surrogate, see if + * there is a trail surrogate after it, either as an escape or + * as a literal. If so, join them up into a supplementary. + */ + if (*offset < length && U16_IS_LEAD(result)) { + int32_t ahead = *offset + 1; + c = charAt(*offset, context); + if (c == 0x5C /*'\\'*/ && ahead < length) { + c = (UChar) u_unescapeAt(charAt, &ahead, length, context); + } + if (U16_IS_TRAIL(c)) { + *offset = ahead; + result = U16_GET_SUPPLEMENTARY(result, c); + } + } return result; } diff --git a/icuSources/common/ustrtrns.c b/icuSources/common/ustrtrns.c index 0126b95e..a1f2e5ab 100644 --- a/icuSources/common/ustrtrns.c +++ b/icuSources/common/ustrtrns.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 2001-2003, International Business Machines +* Copyright (C) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -18,46 +18,18 @@ /******************************************************************************* * * u_strTo* and u_strFrom* APIs + * WCS functions moved to ustr_wcs.c for better modularization * ******************************************************************************* */ #include "unicode/putil.h" -#include "unicode/ucnv.h" #include "unicode/ustring.h" #include "cstring.h" -#include "cwchar.h" #include "cmemory.h" #include "ustr_imp.h" - -static U_INLINE UBool -u_growAnyBufferFromStatic(void *context, - void **pBuffer, int32_t *pCapacity, int32_t reqCapacity, - int32_t length, int32_t size) { - - void *newBuffer=uprv_malloc(reqCapacity*size); - if(newBuffer!=NULL) { - if(length>0) { - uprv_memcpy(newBuffer, *pBuffer, length*size); - } - *pCapacity=reqCapacity; - } else { - *pCapacity=0; - } - - /* release the old pBuffer if it was not statically allocated */ - if(*pBuffer!=(void *)context) { - uprv_free(*pBuffer); - } - - *pBuffer=newBuffer; - return (UBool)(newBuffer!=NULL); -} - -#define _STACK_BUFFER_CAPACITY 1000 - U_CAPI UChar* U_EXPORT2 u_strFromUTF32(UChar *dest, int32_t destCapacity, @@ -77,7 +49,7 @@ u_strFromUTF32(UChar *dest, return NULL; } - if((srcLength < -1) || (destCapacity<0) || (!dest && destCapacity > 0)){ + if((src==NULL) || (srcLength < -1) || (destCapacity<0) || (!dest && destCapacity > 0)){ *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; return NULL; } @@ -163,7 +135,7 @@ u_strToUTF32(UChar32 *dest, } - if((srcLength < -1) || (destCapacity<0) || (!dest && destCapacity > 0)){ + if((src==NULL) || (srcLength < -1) || (destCapacity<0) || (!dest && destCapacity > 0)){ *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; return NULL; } @@ -234,7 +206,7 @@ u_strFromUTF8(UChar *dest, return NULL; } - if((srcLength < -1) || (destCapacity<0) || (!dest && destCapacity > 0)){ + if((src==NULL) || (srcLength < -1) || (destCapacity<0) || (!dest && destCapacity > 0)){ *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; return NULL; } @@ -332,7 +304,7 @@ u_strToUTF8(char *dest, return NULL; } - if((srcLength < -1) || (destCapacity<0) || (!dest && destCapacity > 0)){ + if((pSrc==NULL) || (srcLength < -1) || (destCapacity<0) || (!dest && destCapacity > 0)){ *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; return NULL; } @@ -437,465 +409,3 @@ u_strToUTF8(char *dest, return (char*)dest; } - -#if !defined(U_WCHAR_IS_UTF16) && !defined(U_WCHAR_IS_UTF32) -/* helper function */ -static wchar_t* -_strToWCS(wchar_t *dest, - int32_t destCapacity, - int32_t *pDestLength, - const UChar *src, - int32_t srcLength, - UErrorCode *pErrorCode){ - - char stackBuffer [_STACK_BUFFER_CAPACITY]; - char* tempBuf = stackBuffer; - int32_t tempBufCapacity = _STACK_BUFFER_CAPACITY; - char* tempBufLimit = stackBuffer + tempBufCapacity; - UConverter* conv = NULL; - char* saveBuf = tempBuf; - wchar_t* intTarget=NULL; - int32_t intTargetCapacity=0; - int count=0,retVal=0; - - const UChar *pSrcLimit =NULL; - const UChar *pSrc = src; - - conv = u_getDefaultConverter(pErrorCode); - - if(U_FAILURE(*pErrorCode)){ - return NULL; - } - - if(srcLength == -1){ - srcLength = u_strlen(pSrc); - } - - pSrcLimit = pSrc + srcLength; - - for(;;) { - /* reset the error state */ - *pErrorCode = U_ZERO_ERROR; - - /* convert to chars using default converter */ - ucnv_fromUnicode(conv,&tempBuf,tempBufLimit,&pSrc,pSrcLimit,NULL,(UBool)(pSrc==pSrcLimit),pErrorCode); - count =(tempBuf - saveBuf); - - /* This should rarely occur */ - if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR){ - tempBuf = saveBuf; - - /* we dont have enough room on the stack grow the buffer */ - if(!u_growAnyBufferFromStatic(stackBuffer,(void**) &tempBuf, &tempBufCapacity, - (2*(pSrcLimit-pSrc)+100), count,sizeof(char))){ - goto cleanup; - } - - saveBuf = tempBuf; - tempBufLimit = tempBuf + tempBufCapacity; - tempBuf = tempBuf + count; - - } else { - break; - } - } - - if(U_FAILURE(*pErrorCode)){ - goto cleanup; - } - - /* done with conversion null terminate the char buffer */ - if(count>=tempBufCapacity){ - tempBuf = saveBuf; - /* we dont have enough room on the stack grow the buffer */ - if(!u_growAnyBufferFromStatic(stackBuffer,(void**) &tempBuf, &tempBufCapacity, - tempBufCapacity-count+1, count,sizeof(char))){ - goto cleanup; - } - saveBuf = tempBuf; - } - - saveBuf[count]=0; - - - /* allocate more space than required - * here we assume that every char requires - * no more than 2 wchar_ts - */ - intTargetCapacity = (count*2+1) /*for null termination */; - intTarget = (wchar_t*)uprv_malloc( intTargetCapacity * sizeof(wchar_t) ); - - if(intTarget){ - - int32_t nulLen = 0; - int32_t remaining = intTargetCapacity; - wchar_t* pIntTarget=intTarget; - tempBuf = saveBuf; - - /* now convert the mbs to wcs */ - for(;;){ - - /* we can call the system API since we are sure that - * there is atleast 1 null in the input - */ - retVal = uprv_mbstowcs(pIntTarget,(tempBuf+nulLen),remaining); - - if(retVal==-1){ - *pErrorCode = U_INVALID_CHAR_FOUND; - break; - }else if(retVal== remaining){/* should never occur */ - int numWritten = (pIntTarget-intTarget); - u_growAnyBufferFromStatic(NULL,(void**) &intTarget, - &intTargetCapacity, - intTargetCapacity*2, - numWritten, - sizeof(wchar_t)); - pIntTarget = intTarget; - remaining=intTargetCapacity; - - if(nulLen!=count){ /*there are embedded nulls*/ - pIntTarget+=numWritten; - remaining-=numWritten; - } - - }else{ - /*scan for nulls */ - /* we donot check for limit since tempBuf is null terminated */ - while(tempBuf[nulLen++] != 0){ - } - pIntTarget = pIntTarget + retVal+1; - remaining -=(retVal+1); - - /* check if we have reached the source limit*/ - if(nulLen>=(count)){ - break; - } - } - } - count = (int32_t)(pIntTarget-intTarget); - - if(0 < count && count <= destCapacity){ - uprv_memcpy(dest,intTarget,count*sizeof(wchar_t)); - } - - if(pDestLength){ - *pDestLength = count; - } - - /* free the allocated memory */ - uprv_free(intTarget); - - }else{ - *pErrorCode = U_MEMORY_ALLOCATION_ERROR; - } -cleanup: - /* are we still using stack buffer */ - if(stackBuffer != saveBuf){ - uprv_free(saveBuf); - } - u_terminateWChars(dest,destCapacity,count,pErrorCode); - - u_releaseDefaultConverter(conv); - - return dest; -} -#endif - -U_CAPI wchar_t* U_EXPORT2 -u_strToWCS(wchar_t *dest, - int32_t destCapacity, - int32_t *pDestLength, - const UChar *src, - int32_t srcLength, - UErrorCode *pErrorCode){ - - /* args check */ - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)){ - return NULL; - } - - if((srcLength < -1) || (destCapacity<0) || (!dest && destCapacity > 0)){ - *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; - return NULL; - } - -#ifdef U_WCHAR_IS_UTF16 - /* wchar_t is UTF-16 just do a memcpy */ - if(srcLength == -1){ - srcLength = u_strlen(src); - } - if(0 < srcLength && srcLength <= destCapacity){ - uprv_memcpy(dest,src,srcLength*U_SIZEOF_UCHAR); - } - if(pDestLength){ - *pDestLength = srcLength; - } - - u_terminateUChars(dest,destCapacity,srcLength,pErrorCode); - - return dest; - -#elif defined U_WCHAR_IS_UTF32 - - return (wchar_t*)u_strToUTF32((UChar32*)dest, destCapacity, pDestLength, - src, srcLength, pErrorCode); - -#else - - return _strToWCS(dest,destCapacity,pDestLength,src,srcLength, pErrorCode); - -#endif -} - -#if !defined(U_WCHAR_IS_UTF16) && !defined(U_WCHAR_IS_UTF32) -/* helper function */ -static UChar* -_strFromWCS( UChar *dest, - int32_t destCapacity, - int32_t *pDestLength, - const wchar_t *src, - int32_t srcLength, - UErrorCode *pErrorCode){ - - int32_t retVal =0, count =0 ; - UConverter* conv = NULL; - UChar* pTarget = NULL; - UChar* pTargetLimit = NULL; - UChar* target = NULL; - - UChar uStack [_STACK_BUFFER_CAPACITY]; - - wchar_t wStack[_STACK_BUFFER_CAPACITY]; - wchar_t* pWStack = wStack; - - - char cStack[_STACK_BUFFER_CAPACITY]; - int32_t cStackCap = _STACK_BUFFER_CAPACITY; - char* pCSrc=cStack; - char* pCSave=pCSrc; - char* pCSrcLimit=NULL; - - const wchar_t* pSrc = src; - const wchar_t* pSrcLimit = NULL; - - if(srcLength ==-1){ - /* if the wchar_t source is null terminated we can safely - * assume that there are no embedded nulls, this is a fast - * path for null terminated strings. - */ - for(;;){ - /* convert wchars to chars */ - retVal = uprv_wcstombs(pCSrc,src, cStackCap); - - if(retVal == -1){ - *pErrorCode = U_ILLEGAL_CHAR_FOUND; - goto cleanup; - }else if(retVal == cStackCap){ - /* Should rarely occur */ - u_growAnyBufferFromStatic(cStack,(void**)&pCSrc,&cStackCap, - cStackCap*2,0,sizeof(char)); - pCSave = pCSrc; - }else{ - /* converted every thing */ - pCSrc = pCSrc+retVal; - break; - } - } - - }else{ - /* here the source is not null terminated - * so it may have nulls embeded and we need to - * do some extra processing - */ - int32_t remaining =cStackCap; - - pSrcLimit = src + srcLength; - - for(;;){ - register int32_t nulLen = 0; - - /* find nulls in the string */ - while(nulLen _STACK_BUFFER_CAPACITY){ - /* Should rarely occcur */ - /* allocate new buffer buffer */ - pWStack =(wchar_t*) uprv_malloc(sizeof(wchar_t) * nulLen); - if(pWStack==NULL){ - *pErrorCode = U_MEMORY_ALLOCATION_ERROR; - goto cleanup; - } - } - if(nulLen>0){ - /* copy the contents to tempStack */ - uprv_memcpy(pWStack,pSrc,nulLen*sizeof(wchar_t)); - } - - /* null terminate the tempBuffer */ - pWStack[nulLen] =0 ; - - if(remaining < (nulLen * MB_CUR_MAX)){ - /* Should rarely occur */ - int32_t len = (pCSrc-pCSave); - pCSrc = pCSave; - /* we do not have enough room so grow the buffer*/ - u_growAnyBufferFromStatic(cStack,(void**)&pCSrc,&cStackCap, - cStackCap+(nulLen*MB_CUR_MAX),len,sizeof(char)); - - pCSave = pCSrc; - pCSrc = pCSave+len; - remaining = cStackCap-(pCSrc - pCSave); - } - /* convert to chars */ - retVal = uprv_wcstombs(pCSrc,pWStack,remaining); - - pCSrc += retVal +1; - pSrc += nulLen; - srcLength-=nulLen; /* decrement the srcLength */ - break; - } - } - } - - /* OK..now we have converted from wchar_ts to chars now - * convert chars to UChars - */ - pCSrcLimit = pCSrc; - pCSrc = pCSave; - pTarget = target= dest; - pTargetLimit = dest + destCapacity; - - conv= u_getDefaultConverter(pErrorCode); - - if(U_FAILURE(*pErrorCode)|| conv==NULL){ - goto cleanup; - } - - for(;;) { - - *pErrorCode = U_ZERO_ERROR; - - /* convert to stack buffer*/ - ucnv_toUnicode(conv,&pTarget,pTargetLimit,(const char**)&pCSrc,pCSrcLimit,NULL,(UBool)(pCSrc==pCSrcLimit),pErrorCode); - - /* increment count to number written to stack */ - count+= pTarget - target; - - if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR){ - target = uStack; - pTarget = uStack; - pTargetLimit = uStack + _STACK_BUFFER_CAPACITY; - } else { - break; - } - - } - - if(pDestLength){ - *pDestLength =count; - } - - u_terminateUChars(dest,destCapacity,count,pErrorCode); - -cleanup: - - if(cStack != pCSave){ - uprv_free(pCSave); - } - - if(wStack != pWStack){ - uprv_free(pWStack); - } - - u_releaseDefaultConverter(conv); - - return dest; -} -#endif - -U_CAPI UChar* U_EXPORT2 -u_strFromWCS(UChar *dest, - int32_t destCapacity, - int32_t *pDestLength, - const wchar_t *src, - int32_t srcLength, - UErrorCode *pErrorCode) -{ - - /* args check */ - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)){ - return NULL; - } - - if((srcLength < -1) || (destCapacity<0) || (!dest && destCapacity > 0)){ - *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; - return NULL; - } - -#ifdef U_WCHAR_IS_UTF16 - /* wchar_t is UTF-16 just do a memcpy */ - if(srcLength == -1){ - srcLength = u_strlen(src); - } - if(0 < srcLength && srcLength <= destCapacity){ - uprv_memcpy(dest,src,srcLength*U_SIZEOF_UCHAR); - } - if(pDestLength){ - *pDestLength = srcLength; - } - - u_terminateUChars(dest,destCapacity,srcLength,pErrorCode); - - return dest; - -#elif defined U_WCHAR_IS_UTF32 - - return u_strFromUTF32(dest, destCapacity, pDestLength, - (UChar32*)src, srcLength, pErrorCode); - -#else - - return _strFromWCS(dest,destCapacity,pDestLength,src,srcLength,pErrorCode); - -#endif - -} diff --git a/icuSources/common/util.cpp b/icuSources/common/util.cpp index d41e70d8..203fde51 100644 --- a/icuSources/common/util.cpp +++ b/icuSources/common/util.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (c) 2001, International Business Machines +* Copyright (c) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -68,7 +68,7 @@ static const UChar HEX[16] = {48,49,50,51,52,53,54,55, // 0-7 * Return true if the character is NOT printable ASCII. */ UBool ICU_Utility::isUnprintable(UChar32 c) { - return !(c == 0x0A || (c >= 0x20 && c <= 0x7E)); + return !(c >= 0x20 && c <= 0x7E); } /** @@ -103,6 +103,8 @@ UBool ICU_Utility::escapeUnprintable(UnicodeString& result, UChar32 c) { * For example, in the string "abc'hide'h", the 'h' in "hide" will not be * found by a search for 'h'. */ +// FOR FUTURE USE. DISABLE FOR NOW for coverage reasons. +/* int32_t ICU_Utility::quotedIndexOf(const UnicodeString& text, int32_t start, int32_t limit, UChar charToFind) { @@ -119,6 +121,7 @@ int32_t ICU_Utility::quotedIndexOf(const UnicodeString& text, } return -1; } +*/ /** * Skip over a sequence of zero or more white space characters at pos. @@ -340,8 +343,6 @@ int32_t ICU_Utility::parsePattern(const UnicodeString& pat, return -1; // text ended before end of pat } -static const UChar ZERO_X[] = {48, 120, 0}; // "0x" - /** * Parse an integer at pos, either of the form \d+ or of the form * 0x[0-9A-Fa-f]+ or 0[0-7]+, that is, in standard decimal, hex, @@ -356,13 +357,16 @@ int32_t ICU_Utility::parseInteger(const UnicodeString& rule, int32_t& pos, int32 int32_t p = pos; int8_t radix = 10; - if (0 == rule.caseCompare(p, 2, ZERO_X, U_FOLD_CASE_DEFAULT)) { - p += 2; - radix = 16; - } else if (p < limit && rule.charAt(p) == 48 /*0*/) { - p++; - count = 1; - radix = 8; + if (p < limit && rule.charAt(p) == 48 /*0*/) { + if (p+1 < limit && (rule.charAt(p+1) == 0x78 /*x*/ || rule.charAt(p+1) == 0x58 /*X*/)) { + p += 2; + radix = 16; + } + else { + p++; + count = 1; + radix = 8; + } } while (p < limit) { @@ -605,4 +609,16 @@ void ICU_Utility::appendToRule(UnicodeString& rule, } } +U_CAPI UBool U_EXPORT2 +uprv_isRuleWhiteSpace(UChar32 c) { + /* "white space" in the sense of ICU rule parsers + This is a FIXED LIST that is NOT DEPENDENT ON UNICODE PROPERTIES. + See UTR #31: http://www.unicode.org/reports/tr31/. + U+0009..U+000D, U+0020, U+0085, U+200E..U+200F, and U+2028..U+2029 + */ + return (c >= 0x0009 && c <= 0x2029 && + (c <= 0x000D || c == 0x0020 || c == 0x0085 || + c == 0x200E || c == 0x200F || c >= 0x2028)); +} + //eof diff --git a/icuSources/common/util.h b/icuSources/common/util.h index 1031d488..a5841dc9 100644 --- a/icuSources/common/util.h +++ b/icuSources/common/util.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (c) 2001, International Business Machines +* Copyright (c) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -71,9 +71,10 @@ class U_COMMON_API ICU_Utility /* not : public UObject because all methods are s * @param c character to search for * @return Offset of the first instance of c, or -1 if not found. */ - static int32_t quotedIndexOf(const UnicodeString& text, - int32_t start, int32_t limit, - UChar c); +//?FOR FUTURE USE. DISABLE FOR NOW for coverage reasons. +// static int32_t quotedIndexOf(const UnicodeString& text, +// int32_t start, int32_t limit, +// UChar c); /** * Skip over a sequence of zero or more white space characters at pos. @@ -233,5 +234,12 @@ private: U_NAMESPACE_END +/** + * Is this character a "white space" in the sense of ICU rule parsers? + * @internal + */ +U_CAPI UBool U_EXPORT2 +uprv_isRuleWhiteSpace(UChar32 c); + #endif //eof diff --git a/icuSources/common/utrace.c b/icuSources/common/utrace.c new file mode 100644 index 00000000..eca15036 --- /dev/null +++ b/icuSources/common/utrace.c @@ -0,0 +1,486 @@ +/* +******************************************************************************* +* Copyright (C) 2003-2004, International Business Machines +* Corporation and others. All Rights Reserved. +******************************************************************************* +* file name: utrace.c +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +*/ + +#define UTRACE_IMPL +#include "unicode/utrace.h" +#include "utracimp.h" +#include "cstring.h" +#include "uassert.h" +#include "ucln_cmn.h" + + +static UTraceEntry *pTraceEntryFunc = NULL; +static UTraceExit *pTraceExitFunc = NULL; +static UTraceData *pTraceDataFunc = NULL; +static const void *gTraceContext = NULL; + +U_EXPORT int32_t +utrace_level; + +U_CAPI void U_EXPORT2 +utrace_entry(int32_t fnNumber) { + if (pTraceEntryFunc != NULL) { + (*pTraceEntryFunc)(gTraceContext, fnNumber); + } +} + + +static const char gExitFmt[] = "Returns."; +static const char gExitFmtValue[] = "Returns %d."; +static const char gExitFmtStatus[] = "Returns. Status = %d."; +static const char gExitFmtValueStatus[] = "Returns %d. Status = %d."; +static const char gExitFmtPtrStatus[] = "Returns %d. Status = %p."; + +U_CAPI void U_EXPORT2 +utrace_exit(int32_t fnNumber, int32_t returnType, ...) { + if (pTraceExitFunc != NULL) { + va_list args; + const char *fmt; + + switch (returnType) { + case 0: + fmt = gExitFmt; + break; + case UTRACE_EXITV_I32: + fmt = gExitFmtValue; + break; + case UTRACE_EXITV_STATUS: + fmt = gExitFmtStatus; + break; + case UTRACE_EXITV_I32 | UTRACE_EXITV_STATUS: + fmt = gExitFmtValueStatus; + break; + case UTRACE_EXITV_PTR | UTRACE_EXITV_STATUS: + fmt = gExitFmtPtrStatus; + break; + default: + U_ASSERT(FALSE); + fmt = gExitFmt; + } + + va_start(args, returnType); + (*pTraceExitFunc)(gTraceContext, fnNumber, fmt, args); + va_end(args); + } +} + + + +U_CAPI void U_EXPORT2 +utrace_data(int32_t fnNumber, int32_t level, const char *fmt, ...) { + if (pTraceDataFunc != NULL) { + va_list args; + va_start(args, fmt ); + (*pTraceDataFunc)(gTraceContext, fnNumber, level, fmt, args); + va_end(args); + } +} + + +static void outputChar(char c, char *outBuf, int32_t *outIx, int32_t capacity, int32_t indent) { + int32_t i; + /* Check whether a start of line indenting is needed. Three cases: + * 1. At the start of the first line (output index == 0). + * 2. At the start of subsequent lines (preceeding char in buffer == '\n') + * 3. When preflighting buffer len (buffer capacity is exceeded), when + * a \n is output. Ideally we wouldn't do the indent until the following char + * is received, but that won't work because there's no place to remember that + * the preceding char was \n. Meaning that we may overstimate the + * buffer size needed. No harm done. + */ + if (*outIx==0 || /* case 1. */ + (c!='\n' && c!=0 && *outIx < capacity && outBuf[(*outIx)-1]=='\n') || /* case 2. */ + (c=='\n' && *outIx>=capacity)) /* case 3 */ + { + /* At the start of a line. Indent. */ + for(i=0; i= 0; shiftCount-=4) { + char c = gHexChars[(val >> shiftCount) & 0xf]; + outputChar(c, outBuf, outIx, capacity, 0); + } +} + +/* Output a pointer value in hex. Work with any size of pointer */ +static void outputPtrBytes(void *val, char *outBuf, int32_t *outIx, int32_t capacity) { + int32_t i; + int32_t incVal = 1; /* +1 for big endian, -1 for little endian */ + char *p = (char *)&val; /* point to current byte to output in the ptr val */ + +#if !U_IS_BIG_ENDIAN + /* Little Endian. Move p to most significant end of the value */ + incVal = -1; + p += sizeof(void *) - 1; +#endif + + /* Loop through the bytes of the ptr as it sits in memory, from + * most significant to least significant end */ + for (i=0; i 0) { + outputHexBytes(longArg, charsToOutput, outBuf, &outIx, capacity); + outputChar(' ', outBuf, &outIx, capacity, indent); + } + if (vectorLen == -1 && longArg == 0) { + break; + } + } + } + outputChar('[', outBuf, &outIx, capacity, indent); + outputHexBytes(vectorLen, 8, outBuf, &outIx, capacity); + outputChar(']', outBuf, &outIx, capacity, indent); + } + break; + + + default: + /* %. in format string, where . is some character not in the set + * of recognized format chars. Just output it as if % wasn't there. + * (Covers "%%" outputing a single '%') + */ + outputChar(fmtC, outBuf, &outIx, capacity, indent); + } + } + outputChar(0, outBuf, &outIx, capacity, indent); /* Make sure that output is null terminated */ + return outIx + 1; /* outIx + 1 because outIx does not increment when outputing final null. */ +} + + + + +U_CAPI int32_t U_EXPORT2 +utrace_format(char *outBuf, int32_t capacity, + int32_t indent, const char *fmt, ...) { + int32_t retVal; + va_list args; + va_start(args, fmt ); + retVal = utrace_vformat(outBuf, capacity, indent, fmt, args); + va_end(args); + return retVal; +} + + +U_CAPI void U_EXPORT2 +utrace_setFunctions(const void *context, + UTraceEntry *e, UTraceExit *x, UTraceData *d) { + pTraceEntryFunc = e; + pTraceExitFunc = x; + pTraceDataFunc = d; + gTraceContext = context; +} + + +U_CAPI void U_EXPORT2 +utrace_getFunctions(const void **context, + UTraceEntry **e, UTraceExit **x, UTraceData **d) { + *e = pTraceEntryFunc; + *x = pTraceExitFunc; + *d = pTraceDataFunc; + *context = gTraceContext; +} + +U_CAPI void U_EXPORT2 +utrace_setLevel(int32_t level) { + if (level < UTRACE_OFF) { + level = UTRACE_OFF; + } + if (level > UTRACE_VERBOSE) { + level = UTRACE_VERBOSE; + } + utrace_level = level; +} + +U_CAPI int32_t U_EXPORT2 +utrace_getLevel() { + return utrace_level; +} + + +U_CFUNC UBool +utrace_cleanup() { + pTraceEntryFunc = NULL; + pTraceExitFunc = NULL; + pTraceDataFunc = NULL; + utrace_level = UTRACE_OFF; + gTraceContext = NULL; + return TRUE; +} + + +static const char * const +trFnName[] = { + "u_init", + "u_cleanup", + NULL +}; + + +static const char * const +trConvNames[] = { + "ucnv_open", + "ucnv_openPackage", + "ucnv_openAlgorithmic", + "ucnv_clone", + "ucnv_close", + "ucnv_flushCache", + "ucnv_load", + "ucnv_unload", + NULL +}; + + +static const char * const +trCollNames[] = { + "ucol_open", + "ucol_close", + "ucol_strcoll", + "ucol_getSortKey", + "ucol_getLocale", + "ucol_nextSortKeyPart", + "ucol_strcollIter", + NULL +}; + + +U_CAPI const char * U_EXPORT2 +utrace_functionName(int32_t fnNumber) { + if(UTRACE_FUNCTION_START <= fnNumber && fnNumber < UTRACE_FUNCTION_LIMIT) { + return trFnName[fnNumber]; + } else if(UTRACE_CONVERSION_START <= fnNumber && fnNumber < UTRACE_CONVERSION_LIMIT) { + return trConvNames[fnNumber - UTRACE_CONVERSION_START]; + } else if(UTRACE_COLLATION_START <= fnNumber && fnNumber < UTRACE_COLLATION_LIMIT){ + return trCollNames[fnNumber - UTRACE_COLLATION_START]; + } else { + return "[BOGUS Trace Function Number]"; + } +} + diff --git a/icuSources/common/utracimp.h b/icuSources/common/utracimp.h new file mode 100644 index 00000000..130bcf34 --- /dev/null +++ b/icuSources/common/utracimp.h @@ -0,0 +1,384 @@ +/* +******************************************************************************* +* +* Copyright (C) 2003-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: utracimp.h +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2003aug06 +* created by: Markus W. Scherer +* +* Internal header for ICU tracing/logging. +* +* +* Various notes: +* - using a trace level variable to only call trace functions +* when the level is sufficient +* - using the same variable for tracing on/off to never make a function +* call when off +* - the function number is put into a local variable by the entry macro +* and used implicitly to avoid copy&paste/typing mistakes by the developer +* - the application must call utrace_setFunctions() and pass in +* implementations for the trace functions +* - ICU trace macros call ICU functions that route through the function +* pointers if they have been set; +* this avoids an indirection at the call site +* (which would cost more code for another check and for the indirection) +* +* ### TODO Issues: +* - Verify that va_list is portable among compilers for the same platform. +* va_list should be portable because printf() would fail otherwise! +* - Should enum values like UTraceLevel be passed into int32_t-type arguments, +* or should enum types be used? +*/ + +#ifndef __UTRACIMP_H__ +#define __UTRACIMP_H__ + +#include "unicode/utrace.h" +#include + +U_CDECL_BEGIN + +/** + * \var utrace_level + * Trace level variable. Negative for "off". + * Use only via UTRACE_ macros. + * @internal + */ +#ifdef UTRACE_IMPL +U_EXPORT int32_t +#else +U_CFUNC U_COMMON_API int32_t +#endif +utrace_level; + + +/** + * Traced Function Exit return types. + * Flags indicating the number and types of varargs included in a call + * to a UTraceExit function. + * Bits 0-3: The function return type. First variable param. + * Bit 4: Flag for presence of U_ErrorCode status param. + * @internal + */ +typedef enum UTraceExitVal { + /** The traced function returns no value @internal */ + UTRACE_EXITV_NONE = 0, + /** The traced function returns an int32_t, or compatible, type. @internal */ + UTRACE_EXITV_I32 = 1, + /** The traced function returns a pointer @internal */ + UTRACE_EXITV_PTR = 2, + /** The traced function returns a UBool @internal */ + UTRACE_EXITV_BOOL = 3, + /** Mask to extract the return type values from a UTraceExitVal @internal */ + UTRACE_EXITV_MASK = 0xf, + /** Bit indicating that the traced function includes a UErrorCode parameter @internal */ + UTRACE_EXITV_STATUS = 0x10 +} UTraceExitVal; + +/** + * Trace function for the entry point of a function. + * Do not use directly, use UTRACE_ENTRY instead. + * @param fnNumber The UTraceFunctionNumber for the current function. + * @internal + */ +U_CAPI void U_EXPORT2 +utrace_entry(int32_t fnNumber); + +/** + * Trace function for each exit point of a function. + * Do not use directly, use UTRACE_EXIT* instead. + * @param fnNumber The UTraceFunctionNumber for the current function. + * @param returnType The type of the value returned by the function. + * @param errorCode The UErrorCode value at function exit. See UTRACE_EXIT. + * @internal + */ +U_CAPI void U_EXPORT2 +utrace_exit(int32_t fnNumber, int32_t returnType, ...); + + +/** + * Trace function used inside functions that have a UTRACE_ENTRY() statement. + * Do not use directly, use UTRACE_DATAX() macros instead. + * + * @param utraceFnNumber The number of the current function, from the local + * variable of the same name. + * @param level The trace level for this message. + * @param fmt The trace format string. + * + * @internal + */ +U_CAPI void U_EXPORT2 +utrace_data(int32_t utraceFnNumber, int32_t level, const char *fmt, ...); + +U_CDECL_END + +#if U_ENABLE_TRACING + +/** + * Boolean expression to see if ICU tracing is turned on + * to at least the specified level. + * @internal + */ +#define UTRACE_LEVEL(level) (utrace_level>=(level)) + +/** + * Flag bit in utraceFnNumber, the local variable added to each function + * with tracing code to contains the function number. + * + * Set the flag if the function's entry is traced, which will cause the + * function's exit to also be traced. utraceFnNumber is uncoditionally + * set at entry, whether or not the entry is traced, so that it will + * always be available for error trace output. + * @internal + */ +#define UTRACE_TRACED_ENTRY 0x80000000 + +/** + * Trace statement for the entry point of a function. + * Stores the function number in a local variable. + * In C code, must be placed immediately after the last variable declaration. + * Must be matched with UTRACE_EXIT() at all function exit points. + * + * Tracing should start with UTRACE_ENTRY after checking for + * U_FAILURE at function entry, so that if a function returns immediately + * because of a pre-existing error condition, it does not show up in the trace, + * consistent with ICU's error handling model. + * + * @param fnNumber The UTraceFunctionNumber for the current function. + * @internal + */ +#define UTRACE_ENTRY(fnNumber) \ + int32_t utraceFnNumber=(fnNumber); \ + if(utrace_level>=UTRACE_INFO) { \ + utrace_entry(fnNumber); \ + utraceFnNumber |= UTRACE_TRACED_ENTRY; \ + } + + +/** + * Trace statement for the entry point of open and close functions. + * Produces trace output at a less verbose setting than plain UTRACE_ENTRY + * Stores the function number in a local variable. + * In C code, must be placed immediately after the last variable declaration. + * Must be matched with UTRACE_EXIT() at all function exit points. + * + * @param fnNumber The UTraceFunctionNumber for the current function. + * @internal + */ +#define UTRACE_ENTRY_OC(fnNumber) \ + int32_t utraceFnNumber=(fnNumber); \ + if(utrace_level>=UTRACE_OPEN_CLOSE) { \ + utrace_entry(fnNumber); \ + utraceFnNumber |= UTRACE_TRACED_ENTRY; \ + } + +/** + * Trace statement for each exit point of a function that has a UTRACE_ENTRY() + * statement. + * + * @param errorCode The function's ICU UErrorCode value at function exit, + * or U_ZERO_ERROR if the function does not use a UErrorCode. + * 0==U_ZERO_ERROR indicates success, + * positive values an error (see u_errorName()), + * negative values an informational status. + * + * @internal + */ +#define UTRACE_EXIT() \ + {if(utraceFnNumber & UTRACE_TRACED_ENTRY) { \ + utrace_exit(utraceFnNumber & ~UTRACE_TRACED_ENTRY, UTRACE_EXITV_NONE); \ + }} + +/** + * Trace statement for each exit point of a function that has a UTRACE_ENTRY() + * statement, and that returns a value. + * + * @param val The function's return value, int32_t or comatible type. + * + * @internal + */ +#define UTRACE_EXIT_VALUE(val) \ + {if(utraceFnNumber & UTRACE_TRACED_ENTRY) { \ + utrace_exit(utraceFnNumber & ~UTRACE_TRACED_ENTRY, UTRACE_EXITV_I32, val); \ + }} + +#define UTRACE_EXIT_STATUS(status) \ + {if(utraceFnNumber & UTRACE_TRACED_ENTRY) { \ + utrace_exit(utraceFnNumber & ~UTRACE_TRACED_ENTRY, UTRACE_EXITV_STATUS, status); \ + }} + +#define UTRACE_EXIT_VALUE_STATUS(val, status) \ + {if(utraceFnNumber & UTRACE_TRACED_ENTRY) { \ + utrace_exit(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (UTRACE_EXITV_I32 | UTRACE_EXITV_STATUS), val, status); \ + }} + +#define UTRACE_EXIT_PTR_STATUS(ptr, status) \ + {if(utraceFnNumber & UTRACE_TRACED_ENTRY) { \ + utrace_exit(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (UTRACE_EXITV_PTR | UTRACE_EXITV_STATUS), ptr, status); \ + }} + +/** + * Trace statement used inside functions that have a UTRACE_ENTRY() statement. + * Takes no data arguments. + * The number of arguments for this macro must match the number of inserts + * in the format string. Vector inserts count as two arguments. + * Calls utrace_data() if the level is high enough. + * @internal + */ +#define UTRACE_DATA0(level, fmt) \ + if(UTRACE_LEVEL(level)) { \ + utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt)); \ + } + +/** + * Trace statement used inside functions that have a UTRACE_ENTRY() statement. + * Takes one data argument. + * The number of arguments for this macro must match the number of inserts + * in the format string. Vector inserts count as two arguments. + * Calls utrace_data() if the level is high enough. + * @internal + */ +#define UTRACE_DATA1(level, fmt, a) \ + if(UTRACE_LEVEL(level)) { \ + utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY , (level), (fmt), (a)); \ + } + +/** + * Trace statement used inside functions that have a UTRACE_ENTRY() statement. + * Takes two data arguments. + * The number of arguments for this macro must match the number of inserts + * in the format string. Vector inserts count as two arguments. + * Calls utrace_data() if the level is high enough. + * @internal + */ +#define UTRACE_DATA2(level, fmt, a, b) \ + if(UTRACE_LEVEL(level)) { \ + utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY , (level), (fmt), (a), (b)); \ + } + +/** + * Trace statement used inside functions that have a UTRACE_ENTRY() statement. + * Takes three data arguments. + * The number of arguments for this macro must match the number of inserts + * in the format string. Vector inserts count as two arguments. + * Calls utrace_data() if the level is high enough. + * @internal + */ +#define UTRACE_DATA3(level, fmt, a, b, c) \ + if(UTRACE_LEVEL(level)) { \ + utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c)); \ + } + +/** + * Trace statement used inside functions that have a UTRACE_ENTRY() statement. + * Takes four data arguments. + * The number of arguments for this macro must match the number of inserts + * in the format string. Vector inserts count as two arguments. + * Calls utrace_data() if the level is high enough. + * @internal + */ +#define UTRACE_DATA4(level, fmt, a, b, c, d) \ + if(UTRACE_LEVEL(level)) { \ + utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c), (d)); \ + } + +/** + * Trace statement used inside functions that have a UTRACE_ENTRY() statement. + * Takes five data arguments. + * The number of arguments for this macro must match the number of inserts + * in the format string. Vector inserts count as two arguments. + * Calls utrace_data() if the level is high enough. + * @internal + */ +#define UTRACE_DATA5(level, fmt, a, b, c, d, e) \ + if(UTRACE_LEVEL(level)) { \ + utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c), (d), (e)); \ + } + +/** + * Trace statement used inside functions that have a UTRACE_ENTRY() statement. + * Takes six data arguments. + * The number of arguments for this macro must match the number of inserts + * in the format string. Vector inserts count as two arguments. + * Calls utrace_data() if the level is high enough. + * @internal + */ +#define UTRACE_DATA6(level, fmt, a, b, c, d, e, f) \ + if(UTRACE_LEVEL(level)) { \ + utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c), (d), (e), (f)); \ + } + +/** + * Trace statement used inside functions that have a UTRACE_ENTRY() statement. + * Takes seven data arguments. + * The number of arguments for this macro must match the number of inserts + * in the format string. Vector inserts count as two arguments. + * Calls utrace_data() if the level is high enough. + * @internal + */ +#define UTRACE_DATA7(level, fmt, a, b, c, d, e, f, g) \ + if(UTRACE_LEVEL(level)) { \ + utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c), (d), (e), (f), (g)); \ + } + +/** + * Trace statement used inside functions that have a UTRACE_ENTRY() statement. + * Takes eight data arguments. + * The number of arguments for this macro must match the number of inserts + * in the format string. Vector inserts count as two arguments. + * Calls utrace_data() if the level is high enough. + * @internal + */ +#define UTRACE_DATA8(level, fmt, a, b, c, d, e, f, g, h) \ + if(UTRACE_LEVEL(level)) { \ + utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c), (d), (e), (f), (g), (h)); \ + } + +/** + * Trace statement used inside functions that have a UTRACE_ENTRY() statement. + * Takes nine data arguments. + * The number of arguments for this macro must match the number of inserts + * in the format string. Vector inserts count as two arguments. + * Calls utrace_data() if the level is high enough. + * @internal + */ +#define UTRACE_DATA9(level, fmt, a, b, c, d, e, f, g, h, i) \ + if(UTRACE_LEVEL(level)) { \ + utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c), (d), (e), (f), (g), (h), (i)); \ + } + +#else + +/* + * When tracing is disabled, the following macros become empty + */ + +#define UTRACE_LEVEL(level) 0 +#define UTRACE_ENTRY(fnNumber) +#define UTRACE_ENTRY_OC(fnNumber) +#define UTRACE_EXIT() +#define UTRACE_EXIT_VALUE(val) +#define UTRACE_EXIT_STATUS(status) +#define UTRACE_EXIT_VALUE_STATUS(val, status) +#define UTRACE_EXIT_PTR_STATUS(ptr, status) +#define UTRACE_DATA0(level, fmt) +#define UTRACE_DATA1(level, fmt, a) +#define UTRACE_DATA2(level, fmt, a, b) +#define UTRACE_DATA3(level, fmt, a, b, c) +#define UTRACE_DATA4(level, fmt, a, b, c, d) +#define UTRACE_DATA5(level, fmt, a, b, c, d, e) +#define UTRACE_DATA6(level, fmt, a, b, c, d, e, f) +#define UTRACE_DATA7(level, fmt, a, b, c, d, e, f, g) +#define UTRACE_DATA8(level, fmt, a, b, c, d, e, f, g, h) +#define UTRACE_DATA9(level, fmt, a, b, c, d, e, f, g, h, i) + +#endif + +#endif diff --git a/icuSources/common/utrie.c b/icuSources/common/utrie.c index cc53138b..b6b72c88 100644 --- a/icuSources/common/utrie.c +++ b/icuSources/common/utrie.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 2001-2003, International Business Machines +* Copyright (C) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -23,6 +23,7 @@ #endif #include "unicode/utypes.h" +#include "udataswp.h" #include "cmemory.h" #include "utrie.h" @@ -34,7 +35,8 @@ U_CAPI UNewTrie * U_EXPORT2 utrie_open(UNewTrie *fillIn, uint32_t *aliasData, int32_t maxDataLength, - uint32_t initialValue, UBool latin1Linear) { + uint32_t initialValue, uint32_t leadUnitValue, + UBool latin1Linear) { UNewTrie *trie; int32_t i, j; @@ -89,6 +91,7 @@ utrie_open(UNewTrie *fillIn, trie->data[--j]=initialValue; } + trie->leadUnitValue=leadUnitValue; trie->indexLength=UTRIE_MAX_INDEX_LENGTH; trie->dataCapacity=maxDataLength; trie->isLatin1Linear=latin1Linear; @@ -118,7 +121,9 @@ utrie_clone(UNewTrie *fillIn, const UNewTrie *other, uint32_t *aliasData, int32_ isDataAllocated=TRUE; } - trie=utrie_open(fillIn, aliasData, aliasDataCapacity, other->data[0], other->isLatin1Linear); + trie=utrie_open(fillIn, aliasData, aliasDataCapacity, + other->data[0], other->leadUnitValue, + other->isLatin1Linear); if(trie==NULL) { uprv_free(aliasData); } else { @@ -154,6 +159,20 @@ utrie_getData(UNewTrie *trie, int32_t *pLength) { return trie->data; } +static int32_t +utrie_allocDataBlock(UNewTrie *trie) { + int32_t newBlock, newTop; + + newBlock=trie->dataLength; + newTop=newBlock+UTRIE_DATA_BLOCK_LENGTH; + if(newTop>trie->dataCapacity) { + /* out of memory in the data array */ + return -1; + } + trie->dataLength=newTop; + return newBlock; +} + /** * No error checking for illegal arguments. * @@ -162,7 +181,7 @@ utrie_getData(UNewTrie *trie, int32_t *pLength) { */ static int32_t utrie_getDataBlock(UNewTrie *trie, UChar32 c) { - int32_t indexValue, newBlock, newTop; + int32_t indexValue, newBlock; c>>=UTRIE_SHIFT; indexValue=trie->index[c]; @@ -171,13 +190,11 @@ utrie_getDataBlock(UNewTrie *trie, UChar32 c) { } /* allocate a new data block */ - newBlock=trie->dataLength; - newTop=newBlock+UTRIE_DATA_BLOCK_LENGTH; - if(newTop>trie->dataCapacity) { + newBlock=utrie_allocDataBlock(trie); + if(newBlock<0) { /* out of memory in the data array */ return -1; } - trie->dataLength=newTop; trie->index[c]=newBlock; /* copy-on-write for a block from a setRange() */ @@ -385,15 +402,30 @@ utrie_fold(UNewTrie *trie, UNewTrieGetFoldedValue *getFoldedValue, UErrorCode *p uprv_memcpy(leadIndexes, index+(0xd800>>UTRIE_SHIFT), 4*UTRIE_SURROGATE_BLOCK_COUNT); /* - * to protect the copied lead surrogate values, - * mark all their indexes as repeat blocks - * (causes copy-on-write) + * set all values for lead surrogate code *units* to leadUnitValue + * so that, by default, runtime lookups will find no data for associated + * supplementary code points, unless there is data for such code points + * which will result in a non-zero folding value below that is set for + * the respective lead units + * + * the above saved the indexes for surrogate code *points* + * fill the indexes with simplified code from utrie_setRange32() */ - for(c=0xd800; c<=0xdbff; ++c) { - block=index[c>>UTRIE_SHIFT]; - if(block>0) { - index[c>>UTRIE_SHIFT]=-block; + if(trie->leadUnitValue==trie->data[0]) { + block=0; /* leadUnitValue==initialValue, use all-initial-value block */ + } else { + /* create and fill the repeatBlock */ + block=utrie_allocDataBlock(trie); + if(block<0) { + /* data table overflow */ + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + return; } + utrie_fillBlock(trie->data+block, 0, UTRIE_DATA_BLOCK_LENGTH, trie->leadUnitValue, trie->data[0], TRUE); + block=-block; /* negative block number to indicate that it is a repeat block */ + } + for(c=(0xd800>>UTRIE_SHIFT); c<(0xdc00>>UTRIE_SHIFT); ++c) { + trie->index[c]=block; } /* @@ -418,10 +450,14 @@ utrie_fold(UNewTrie *trie, UNewTrieGetFoldedValue *getFoldedValue, UErrorCode *p /* is there an identical index block? */ block=_findSameIndexBlock(index, indexLength, c>>UTRIE_SHIFT); - /* get a folded value for [c..c+0x400[ and, if 0, set it for the lead surrogate */ + /* + * get a folded value for [c..c+0x400[ and, + * if different from the value for the lead surrogate code point, + * set it for the lead surrogate code unit + */ value=getFoldedValue(trie, c, block+UTRIE_SURROGATE_BLOCK_COUNT); - if(value!=0) { - if(!utrie_set32(trie, 0xd7c0+(c>>10), value)) { + if(value!=utrie_get32(trie, U16_LEAD(c), NULL)) { + if(!utrie_set32(trie, U16_LEAD(c), value)) { /* data table overflow */ *pErrorCode=U_MEMORY_ALLOCATION_ERROR; return; @@ -670,7 +706,7 @@ struct UTrieHeader { */ uint32_t options; - /** indexLength is a multiple of 1024>>UTRIE_SHIFT */ + /** indexLength is a multiple of UTRIE_SURROGATE_BLOCK_COUNT */ int32_t indexLength; /** dataLength>=UTRIE_DATA_BLOCK_LENGTH */ @@ -699,6 +735,48 @@ enum { UTRIE_OPTIONS_LATIN1_IS_LINEAR=0x200 }; +/* + * Default function for the folding value: + * Just store the offset (16 bits) if there is any non-initial-value entry. + * + * The offset parameter is never 0. + * Returning the offset itself is safe for UTRIE_SHIFT>=5 because + * for UTRIE_SHIFT==5 the maximum index length is UTRIE_MAX_INDEX_LENGTH==0x8800 + * which fits into 16-bit trie values; + * for higher UTRIE_SHIFT, UTRIE_MAX_INDEX_LENGTH decreases. + * + * Theoretically, it would be safer for all possible UTRIE_SHIFT including + * those of 4 and lower to return offset>>UTRIE_SURROGATE_BLOCK_BITS + * which would always result in a value of 0x40..0x43f + * (start/end 1k blocks of supplementary Unicode code points). + * However, this would be uglier, and would not work for some existing + * binary data file formats. + * + * Also, we do not plan to change UTRIE_SHIFT because it would change binary + * data file formats, and we would probably not make it smaller because of + * the then even larger BMP index length even for empty tries. + */ +static uint32_t U_CALLCONV +defaultGetFoldedValue(UNewTrie *trie, UChar32 start, int32_t offset) { + uint32_t value, initialValue; + UChar32 limit; + UBool inBlockZero; + + initialValue=trie->data[0]; + limit=start+0x400; + while(start0 && dt==NULL) || getFoldedValue==NULL) { + if(trie==NULL || capacity<0 || (capacity>0 && dt==NULL)) { *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; return 0; } + if(getFoldedValue==NULL) { + getFoldedValue=defaultGetFoldedValue; + } + data = (uint8_t*)dt; /* fold and compact if necessary, also checks that indexLength is within limits */ if(!trie->isCompacted) { @@ -799,6 +881,12 @@ utrie_serialize(UNewTrie *trie, void *dt, int32_t capacity, return length; } +/* inverse to defaultGetFoldedValue() */ +static int32_t U_CALLCONV +defaultGetFoldingOffset(uint32_t data) { + return (int32_t)data; +} + U_CAPI int32_t U_EXPORT2 utrie_unserialize(UTrie *trie, const void *data, int32_t length, UErrorCode *pErrorCode) { UTrieHeader *header; @@ -836,7 +924,7 @@ utrie_unserialize(UTrie *trie, const void *data, int32_t length, UErrorCode *pEr trie->indexLength=header->indexLength; trie->dataLength=header->dataLength; - length-=sizeof(UTrieHeader); + length-=(int32_t)sizeof(UTrieHeader); /* enough data for the index? */ if(length<2*trie->indexLength) { @@ -856,7 +944,7 @@ utrie_unserialize(UTrie *trie, const void *data, int32_t length, UErrorCode *pEr } trie->data32=(const uint32_t *)p16; trie->initialValue=trie->data32[0]; - return sizeof(UTrieHeader)+2*trie->indexLength+4*trie->dataLength; + length=(int32_t)sizeof(UTrieHeader)+2*trie->indexLength+4*trie->dataLength; } else { if(length<2*trie->dataLength) { *pErrorCode=U_INVALID_FORMAT_ERROR; @@ -866,8 +954,85 @@ utrie_unserialize(UTrie *trie, const void *data, int32_t length, UErrorCode *pEr /* the "data16" data is used via the index pointer */ trie->data32=NULL; trie->initialValue=trie->index[trie->indexLength]; - return sizeof(UTrieHeader)+2*trie->indexLength+2*trie->dataLength; + length=(int32_t)sizeof(UTrieHeader)+2*trie->indexLength+2*trie->dataLength; + } + + trie->getFoldingOffset=defaultGetFoldingOffset; + + return length; +} + +/* swapping ----------------------------------------------------------------- */ + +U_CAPI int32_t U_EXPORT2 +utrie_swap(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const UTrieHeader *inTrie; + UTrieHeader trie; + int32_t size; + UBool dataIs32; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + if(ds==NULL || inData==NULL || (length>=0 && outData==NULL)) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* setup and swapping */ + if(length>=0 && lengthreadUInt32(inTrie->signature); + trie.options=ds->readUInt32(inTrie->options); + trie.indexLength=udata_readInt32(ds, inTrie->indexLength); + trie.dataLength=udata_readInt32(ds, inTrie->dataLength); + + if( trie.signature!=0x54726965 || + (trie.options&UTRIE_OPTIONS_SHIFT_MASK)!=UTRIE_SHIFT || + ((trie.options>>UTRIE_OPTIONS_INDEX_SHIFT)&UTRIE_OPTIONS_SHIFT_MASK)!=UTRIE_INDEX_SHIFT || + trie.indexLength=0) { + UTrieHeader *outTrie; + + if(lengthswapArray32(ds, inTrie, sizeof(UTrieHeader), outTrie, pErrorCode); + + /* swap the index and the data */ + if(dataIs32) { + ds->swapArray16(ds, inTrie+1, trie.indexLength*2, outTrie+1, pErrorCode); + ds->swapArray32(ds, (const uint16_t *)(inTrie+1)+trie.indexLength, trie.dataLength*4, + (uint16_t *)(outTrie+1)+trie.indexLength, pErrorCode); + } else { + ds->swapArray16(ds, inTrie+1, (trie.indexLength+trie.dataLength)*2, outTrie+1, pErrorCode); + } } + + return size; } /* enumeration -------------------------------------------------------------- */ @@ -883,7 +1048,7 @@ enumSameValue(const void *context, uint32_t value) { * The values are transformed from the raw trie entries by the enumValue function. */ U_CAPI void U_EXPORT2 -utrie_enum(UTrie *trie, +utrie_enum(const UTrie *trie, UTrieEnumValue *enumValue, UTrieEnumRange *enumRange, const void *context) { const uint32_t *data32; const uint16_t *index; @@ -963,24 +1128,26 @@ utrie_enum(UTrie *trie, for(l=0xd800; l<0xdc00;) { /* lead surrogate access */ offset=index[l>>UTRIE_SHIFT]<indexLength) { - /* no entries for a whole block of lead surrogates */ - l+=UTRIE_DATA_BLOCK_LENGTH; - c+=UTRIE_DATA_BLOCK_LENGTH<<10; - continue; + if(offset==(data32!=NULL ? 0 : trie->indexLength)) { + /* no entries for a whole block of lead surrogates */ + if(prevValue!=initialValue) { + if(prevgetFoldingOffset(value); if(offset<=0) { diff --git a/icuSources/common/utrie.h b/icuSources/common/utrie.h index 8403c5e7..0492f0f0 100644 --- a/icuSources/common/utrie.h +++ b/icuSources/common/utrie.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 2001-2003, International Business Machines +* Copyright (C) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -18,6 +18,7 @@ #define __UTRIE_H__ #include "unicode/utypes.h" +#include "udataswp.h" U_CDECL_BEGIN @@ -80,7 +81,7 @@ enum { /** * Number of index (stage 1) entries per lead surrogate. - * Same as number of indexe entries for 1024 trail surrogates, + * Same as number of index entries for 1024 trail surrogates, * ==0x400>>UTRIE_SHIFT */ UTRIE_SURROGATE_BLOCK_COUNT=(1<&2 - exit 4 - ;; - esac + echo $ICUPKGDATA_DIR ;; --icudatadir) - echo $pkgdatadir + echo $ICUDATA_DIR ;; --shlib-c) diff --git a/icuSources/config/icu-config-top b/icuSources/config/icu-config-top index da8684f2..874a3ab8 100644 --- a/icuSources/config/icu-config-top +++ b/icuSources/config/icu-config-top @@ -3,9 +3,8 @@ #set -x # BEGIN of icu-config-top #****************************************************************************** -# Copyright (C) 1999-2002, International Business Machines +# Copyright (C) 1999-2004, International Business Machines # Corporation and others. All Rights Reserved. -# $Revision: 1.1.1.1 $ #****************************************************************************** # This script is designed to aid configuration of ICU. # rpath links a library search path right into the binaries. diff --git a/icuSources/config/icu-config.1.in b/icuSources/config/icu-config.1.in index a84cef1c..3492b287 100644 --- a/icuSources/config/icu-config.1.in +++ b/icuSources/config/icu-config.1.in @@ -2,14 +2,14 @@ .\" .\" icu-config.1: manual page for the icu-config utility .\" -.\" Copyright (C) 2002 IBM, Inc. and others. +.\" Copyright (C) 2002-2004 IBM, Inc. and others. .\" .\" Based on Yves Arrouye's pkgdata page .\" Modified by Steven R. Loomis . .\" With help from http://www.igpm.rwth-aachen.de/~albrecht/manpage.html -.TH ICU-CONFIG 1 "17 May 2002" "ICU MANPAGE" "ICU @VERSION@ Manual" -.\".Dd "17 May 2002" +.TH ICU-CONFIG 1 "17 May 2004" "ICU MANPAGE" "ICU @VERSION@ Manual" +.\".Dd "17 May 2004" .\".Dt ICU-CONFIG 1 .\".Os @@ -86,7 +86,7 @@ .BI "\-\-ldflags\-system" ] [ -.BI "\-\-ldflags\-ustdio" +.BI "\-\-ldflags\-icuio" ] [ .BI "\-\-mandir" @@ -233,15 +233,15 @@ Print any flags which should be passed to the linker. These may include this option will attempt to link in the "common" (libicuuc) and "i18n" (libicui18n) libraries, as well as the data library. If additional libraries are required, any of the following two flags may be added in conjunction with this one, -for example "\-\-ldflags \-\-ldflags-ustdio" if the ustdio library is required +for example "\-\-ldflags \-\-ldflags-icuio" if the icuio library is required in addition to the standard ICU libraries. Equivalent to the $(LDFLAGS) Makefile variable. .TP .BI "\-\-ldflags\-layout" Prints the link option for the ICU layout library. .TP -.BI "\-\-ldflags\-ustdio" -Prints the link option to add the UStdio package +.BI "\-\-ldflags\-icuio" +Prints the link option to add the ICU I/O package .TP .BI "\-\-ldflags\-libsonly" Similar to \fI\-\-ldflags\fP but only includes the \-l options. @@ -284,5 +284,5 @@ Steven Loomis .SH VERSION @VERSION@ .SH COPYRIGHT -Copyright (C) 2002 IBM, Inc. and others. +Copyright (C) 2002-2004 IBM, Inc. and others. diff --git a/icuSources/config/make2sh.sed b/icuSources/config/make2sh.sed index f4917113..92a9a833 100644 --- a/icuSources/config/make2sh.sed +++ b/icuSources/config/make2sh.sed @@ -1,6 +1,7 @@ -# Copyright (C) 1999-2003, International Business Machines Corporation and others. All Rights Reserved. +# Copyright (C) 1999-2004, International Business Machines Corporation and others. All Rights Reserved. s%^\([a-zA-Z\._-]*\)[ ]*+=%\1=$(\1) % s%^[A-Z]*_SO_TARG*%## &% +s%^LD_SONAME.*%## &% s%$(\([^\)]*\))%${\1}%g s%^ %#M# % s@^[a-zA-Z%$.][^=]*$@#M#&@ diff --git a/icuSources/config/mh-aix b/icuSources/config/mh-aix index 22ff31df..c09e2082 100644 --- a/icuSources/config/mh-aix +++ b/icuSources/config/mh-aix @@ -1,10 +1,8 @@ ## -*-makefile-*- ## Aix-specific setup (for xlC) -## Copyright (c) 1999-2002, International Business Machines Corporation and +## Copyright (c) 1999-2004, International Business Machines Corporation and ## others. All Rights Reserved. ## -## $Id: mh-aix,v 1.1.1.2 2003/07/03 18:13:33 avery Exp $ -## ## Please note: AIX does NOT have library versioning per se (there is no 'SONAME' capability). ## So, we are using 'windows' style library names, that is, libicuuc20.1.so instead of libicuuc.so.20.1 @@ -51,7 +49,9 @@ MIDDLE_SO_TARGET= $(basename $(SO_TARGET))$(SO_TARGET_VERSION_MAJOR).$(SO) ICULIBSUFFIX_VERSION = $(LIB_VERSION_MAJOR) # this one is for icudefs.mk's use +ifeq ($(ENABLE_SHARED),YES) SO_TARGET_VERSION_SUFFIX = $(SO_TARGET_VERSION_MAJOR) +endif ## Compiler switch to embed a library name. Not present on AIX. LD_SONAME = @@ -84,8 +84,6 @@ STATIC_O = o %.o: $(srcdir)/%.cpp $(COMPILE.cc) $(DYNAMICCPPFLAGS) $(DYNAMICCXXFLAGS) -o $@ $< -../data/%.o: ../data/%.c - $(COMPILE.c) $(DYNAMICCPPFLAGS) $(DYNAMICCFLAGS) -o $@ $< ## Dependency rules %.d : %.u @@ -104,9 +102,9 @@ STATIC_O = o ## Versioned libraries rules %$(SO_TARGET_VERSION_MAJOR).$(SO): %$(SO_TARGET_VERSION).$(SO) - $(RM) $@ && ln -s $*$(SO_TARGET_VERSION).$(SO) $@ + $(RM) $@ && ln -s ${*F}$(SO_TARGET_VERSION).$(SO) $@ %.$(SO): %$(SO_TARGET_VERSION).$(SO) - $(RM) $@ && ln -s $*$(SO_TARGET_VERSION).$(SO) $@ + $(RM) $@ && ln -s ${*F}$(SO_TARGET_VERSION).$(SO) $@ ## BIR - bind with internal references [so app data and icu data doesn't collide] diff --git a/icuSources/config/mh-aix-gcc b/icuSources/config/mh-aix-gcc new file mode 100644 index 00000000..a5d4e911 --- /dev/null +++ b/icuSources/config/mh-aix-gcc @@ -0,0 +1,116 @@ +## -*-makefile-*- +## Copyright (c) 2003-2004 IBM, Ken Foskey, and others. All rights reserved. +## +## Aix-specific setup (for gcc) +## +## Please note: AIX does NOT have library versioning per se (there is no 'SONAME' capability). +## So, we are using 'windows' style library names, that is, libicuuc20.1.so instead of libicuuc.so.20.1 + +## Commands to generate dependency files +GEN_DEPS.c= $(CC) -E -MM $(DEFS) $(CPPFLAGS) +GEN_DEPS.cc= $(CXX) -E -MM $(DEFS) $(CPPFLAGS) + +## Commands to link +## We need to use the C++ linker, even when linking C programs, since +## our libraries contain C++ code (C++ static init not called) +LINK.c= $(AIX_PREDELETE) $(CXX) $(CXXFLAGS) $(LDFLAGS) +LINK.cc= $(AIX_PREDELETE) $(CXX) $(CXXFLAGS) $(LDFLAGS) + +## Commands to make a shared library +SHLIB.c= $(AIX_PREDELETE) $(CC) $(CFLAGS) $(LDFLAGS) -shared -Wl,-bexpall +SHLIB.cc= $(AIX_PREDELETE) $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared -Wl,-bexpall +#SHLIB.c= $(AIX_PREDELETE) $(AIX_SHLIB) -p 5000 $(LDFLAGS) -bexpall +#SHLIB.cc= $(AIX_PREDELETE) $(AIX_SHLIB) -p 5000 $(LDFLAGS) -bexpall + +## Compiler switch to embed a runtime search path +LD_RPATH= -I +LD_RPATH_PRE= + +## enable the shared lib loader +LDFLAGS += -Wl,-bbigtoc + +## We need to delete things prior to linking, or else we'll get +## SEVERE ERROR: output file in use .. on AIX. +## But, shell script version should NOT delete target as we don't +## have $@ in that context. (SH = only shell script, icu-config) +AIX_PREDELETE=rm -f $@ ; +#SH# AIX_PREDELETE= + +## Environment variable to set a runtime search path +LDLIBRARYPATH_ENVVAR = LIBPATH + +## Override Versioned target for a shared library. +FINAL_SO_TARGET= $(basename $(SO_TARGET))$(SO_TARGET_VERSION).$(SO) +MIDDLE_SO_TARGET= $(basename $(SO_TARGET))$(SO_TARGET_VERSION_MAJOR).$(SO) + +# The following is for Makefile.inc's use. +ICULIBSUFFIX_VERSION = $(LIB_VERSION_MAJOR) + +# this one is for icudefs.mk's use +ifeq ($(ENABLE_SHARED),YES) +SO_TARGET_VERSION_SUFFIX = $(SO_TARGET_VERSION_MAJOR) +endif + +## Compiler switch to embed a library name. Not present on AIX. +LD_SONAME = + +## Shared object suffix +SO= a +A= a + +## Non-shared intermediate object suffix +STATIC_O = o + +## Special AIX rules + +## Build archive from shared object +%.a : %.so + $(AR) $(ARFLAGS) $@ $< + +## Build import list from export list +%.e : %.exp + @echo "Building an import list for $<" + @$(SHELL) -ec "echo '#! $*.a($*.so)' | cat - $< > $@" + +## Compilation rules +%.$(STATIC_O): $(srcdir)/%.c + $(COMPILE.c) $(STATICCPPFLAGS) $(STATICCFLAGS) -o $@ $< +%.o: $(srcdir)/%.c + $(COMPILE.c) $(DYNAMICCPPFLAGS) $(DYNAMICCFLAGS) -o $@ $< + +%.$(STATIC_O): $(srcdir)/%.cpp + $(COMPILE.cc) $(STATICCPPFLAGS) $(STATICCXXFLAGS) -o $@ $< +%.o: $(srcdir)/%.cpp + $(COMPILE.cc) $(DYNAMICCPPFLAGS) $(DYNAMICCXXFLAGS) -o $@ $< + + +## Dependency rules +%.d: $(srcdir)/%.c + @echo "generating dependency information for $<" + @$(SHELL) -ec '$(GEN_DEPS.c) $< \ + | sed '\''s%\($*\)\.o[ :]*%\1.o $@ : %g'\'' > $@; \ + [ -s $@ ] || rm -f $@' + +%.d: $(srcdir)/%.cpp + @echo "generating dependency information for $<" + @$(SHELL) -ec '$(GEN_DEPS.cc) $< \ + | sed '\''s%\($*\)\.o[ :]*%\1.o $@ : %g'\'' > $@; \ + [ -s $@ ] || rm -f $@' + +## Versioned libraries rules +%$(SO_TARGET_VERSION_MAJOR).$(SO): %$(SO_TARGET_VERSION).$(SO) + $(RM) $@ && ln -s ${*F}$(SO_TARGET_VERSION).$(SO) $@ +%.$(SO): %$(SO_TARGET_VERSION).$(SO) + $(RM) $@ && ln -s ${*F}$(SO_TARGET_VERSION).$(SO) $@ + + +## BIR - bind with internal references [so app data and icu data doesn't collide] +# LDflags that pkgdata will use +BIR_LDFLAGS= -Wl,-bE:$(NAME).map,-bnoexpall + +# CPPflags for genccode/gencmn +BIR_CPPFLAGS= -DU_HAVE_BIND_INTERNAL_REFERENCES + +# Dependencies [i.e. map files] for the final library +BIR_DEPS= $(NAME).map + diff --git a/icuSources/config/mh-aix-va b/icuSources/config/mh-aix-va index da00df4e..c39ccee9 100644 --- a/icuSources/config/mh-aix-va +++ b/icuSources/config/mh-aix-va @@ -1,9 +1,7 @@ ## -*-makefile-*- ## Aix-specific setup (for Visual Age 5+) -## Copyright (c) 1999-2002, International Business Machines Corporation and +## Copyright (c) 1999-2004, International Business Machines Corporation and ## others. All Rights Reserved. -## -## $Id: mh-aix-va,v 1.1.1.2 2003/07/03 18:13:33 avery Exp $ ## Commands to generate dependency files GEN_DEPS.c= $(CC) -E -M $(DEFS) $(CPPFLAGS) @@ -15,7 +13,8 @@ GEN_DEPS.cc= $(CXX) -E -M $(DEFS) $(CPPFLAGS) CFLAGS += -qproto -qroconst CXXFLAGS += -qproto -qroconst -LDFLAGS += -brtl -bh:5 +# If you readd this line, you must change the SO value +#LDFLAGS += -brtl ## We need to delete things prior to linking, or else we'll get ## SEVERE ERROR: output file in use .. on AIX. @@ -52,12 +51,19 @@ MIDDLE_SO_TARGET= $(basename $(SO_TARGET))$(SO_TARGET_VERSION_MAJOR).$(SO) ICULIBSUFFIX_VERSION = $(LIB_VERSION_MAJOR) # this one is for icudefs.mk's use +ifeq ($(ENABLE_SHARED),YES) SO_TARGET_VERSION_SUFFIX = $(SO_TARGET_VERSION_MAJOR) +endif LD_SONAME = +## The type of assembly needed when pkgdata is used for generating shared libraries. +GENCCODE_ASSEMBLY=-a xlc + ## Shared object suffix -SO= so +#SO= so +# without the -brtl option, the library names use .a. AIX is funny that way. +SO= a ## Non-shared intermediate object suffix STATIC_O = o @@ -81,8 +87,6 @@ STATIC_O = o %.o: $(srcdir)/%.cpp $(COMPILE.cc) $(DYNAMICCPPFLAGS) $(DYNAMICCXXFLAGS) -o $@ $< -../data/%.o: ../data/%.c - $(COMPILE.c) $(DYNAMICCPPFLAGS) $(DYNAMICCFLAGS) -o $@ $< ## Dependency rules %.d : %.u @@ -100,8 +104,8 @@ STATIC_O = o ## Versioned libraries rules %$(SO_TARGET_VERSION_MAJOR).$(SO): %$(SO_TARGET_VERSION).$(SO) - $(RM) $@ && ln -s $*$(SO_TARGET_VERSION).$(SO) $@ + $(RM) $@ && ln -s ${*F}$(SO_TARGET_VERSION).$(SO) $@ %.$(SO): %$(SO_TARGET_VERSION).$(SO) - $(RM) $@ && ln -s $*$(SO_TARGET_VERSION).$(SO) $@ + $(RM) $@ && ln -s ${*F}$(SO_TARGET_VERSION).$(SO) $@ ## End Aix-specific setup diff --git a/icuSources/config/mh-alpha-linux-cc b/icuSources/config/mh-alpha-linux-cc index 9f934ed9..5020add6 100644 --- a/icuSources/config/mh-alpha-linux-cc +++ b/icuSources/config/mh-alpha-linux-cc @@ -1,9 +1,7 @@ ## -*-makefile-*- ## Alpha-Linux-specific setup -## Copyright (c) 1999-2000, International Business Machines Corporation and +## Copyright (c) 1999-2004, International Business Machines Corporation and ## others. All Rights Reserved. -## -## $Id: mh-alpha-linux-cc,v 1.1.1.1 2003/02/05 21:31:17 avery Exp $ ## Commands to generate dependency files #GEN_DEPS.c= $(CC) $(DEFS) $(CPPFLAGS) -MD -c -msg_quiet @@ -18,9 +16,6 @@ SHAREDLIBCPPFLAGS = -DPIC LIBCPPFLAGS = -D_REENTRANT THREADSCPPFLAGS = -D_REENTRANT -# Use int for int32_t -DEFS += -D_LP64 - # The tests need complete IEEE floating point support CFLAGS += -ieee CXXFLAGS += -ieee @@ -39,7 +34,7 @@ LD_RPATH= LD_RPATH_PRE= -Wl,-rpath, ## Compiler switch to embed a library name -LD_SONAME = -Wl,-soname -Wl,$(MIDDLE_SO_TARGET) +LD_SONAME = -Wl,-soname -Wl,$(notdir $(MIDDLE_SO_TARGET)) ## Shared object suffix SO = so @@ -57,8 +52,6 @@ STATIC_O = ao %.o: $(srcdir)/%.cpp $(COMPILE.cc) $(DYNAMICCPPFLAGS) $(DYNAMICCXXFLAGS) -o $@ $< -../data/%.o: ../data/%.c - $(COMPILE.c) $(DYNAMICCPPFLAGS) $(DYNAMICCFLAGS) -o $@ $< ## Dependency rules #%.d: $(srcdir)/%.c @@ -76,9 +69,9 @@ STATIC_O = ao ## Versioned libraries rules %.$(SO).$(SO_TARGET_VERSION_MAJOR): %.$(SO).$(SO_TARGET_VERSION) - $(RM) $@ && ln -s $< $@ + $(RM) $@ && ln -s ${ $@; \ + [ -s $@ ] || rm -f $@' + +%.d: $(srcdir)/%.cpp + @echo "generating dependency information for $<" + @$(SHELL) -ec '$(GEN_DEPS.cc) $< \ + | sed '\''s%\($*\)\.o[ :]*%\1.o $@ : %g'\'' > $@; \ + [ -s $@ ] || rm -f $@' + +## Versioned libraries rules + +%.$(SO).$(SO_TARGET_VERSION_MAJOR): %.$(SO).$(SO_TARGET_VERSION) + $(RM) $@ && ln -s ${ $@; \ - [ -s $@ ] || rm -f $@' + @echo -n "$@ " > $@ + @$(SHELL) -ec '$(GEN_DEPS.c) $< >> $@; [ -s $@ ] || rm -f $@' %.d: $(srcdir)/%.cpp @echo "generating dependency information for $<" - @$(SHELL) -ec '$(GEN_DEPS.cc) $< \ - | sed '\''s%\($*\)\.o[ :]*%\1.o $@ : %g'\'' > $@; \ - [ -s $@ ] || rm -f $@' + @echo -n "$@ " > $@ + @$(SHELL) -ec '$(GEN_DEPS.cc) $< >> $@; [ -s $@ ] || rm -f $@' ## Versioned target for a shared library. -FINAL_SO_TARGET= $(basename $(SO_TARGET))$(SO_TARGET_VERSION)$(ICULIBSUFFIX).$(SO) -MIDDLE_SO_TARGET= $(basename $(SO_TARGET))$(SO_TARGET_VERSION_MAJOR)$(ICULIBSUFFIX).$(SO) +## Since symbolic links don't work the same way on Windows, +## we only use the version major number. +#FINAL_SO_TARGET=$(basename $(SO_TARGET))$(SO_TARGET_VERSION).$(SO) +FINAL_SO_TARGET=$(basename $(SO_TARGET))$(SO_TARGET_VERSION_MAJOR).$(SO) +MIDDLE_SO_TARGET=$(FINAL_SO_TARGET) ## Versioned libraries rules -%$(SO_TARGET_VERSION_MAJOR).$(SO): %$(SO_TARGET_VERSION)$(ICULIBSUFFIX).$(SO) - $(RM) $@ && cp $< $@ -%.$(SO): %$(SO_TARGET_VERSION)$(ICULIBSUFFIX).$(SO) - $(RM) $@ && ln -s $< $@ +#%$(SO_TARGET_VERSION_MAJOR).$(SO): %$(SO_TARGET_VERSION).$(SO) +# $(RM) $@ && cp ${ $@; \ -# [ -s $@ ] || rm -f $@' -# -#%.d: $(srcdir)/%.cpp -# @echo "generating dependency information for $<" -# $(SHELL) -ec '$(GEN_DEPS.cc) $< \ -# | sed '\''s%\($*\)\.o[ :]*%\1.o $@ : %g'\'' > $@; \ -# [ -s $@ ] || rm -f $@' ## Dependency rules +## This is a start to how depdendencies could work +# The commented out rules may not properly delete the file when ^C is pressed +# or the compiler fails. +# make currently doesn't like rules with C:\\PROGRA~1\\.. in the depedency. +# So system headers are ignored by ignoring \\ %.d : $(srcdir)/%.c @echo "generating dependency information for $<" @$(GEN_DEPS.c) $< > $@ +# @echo -n "generating dependency information for " +# @echo -n "$@ $(basename $<).o : " > $@ +# @$(SHELL) -ec '$(GEN_DEPS.c) $< \ +# | grep "#line 1 " | grep -v \\\\ | cut -d " " -f 3 \ +# | /usr/bin/sort -u | sed s/\"$$/\\\\/ | sed s/^\"/\ / >> $@ \ +# || (rm -f $@ && echo $@ && false)' %.d : $(srcdir)/%.cpp @echo "generating dependency information for $<" @$(GEN_DEPS.cc) $< > $@ +# @echo -n "generating dependency information for " +# @echo -n "$@ $(basename $<).o : " > $@ +# @$(SHELL) -ec '$(GEN_DEPS.cc) $< \ +# | grep "#line 1 " | grep -v \\\\ | cut -d " " -f 3 \ +# | /usr/bin/sort -u | sed s/\"$$/\\\\/ | sed s/^\"/\ / >> $@ \ +# || (rm -f $@ && echo $@ && false)' ## Compile a Windows resource file %.res : $(srcdir)/%.rc - @rc.exe /fo$@ $< + rc.exe /fo$@ $(SOURCE_FILE) ## Versioned target for a shared library. -FINAL_SO_TARGET= $(basename $(SO_TARGET))$(SO_TARGET_VERSION_MAJOR).$(SO) -MIDDLE_SO_TARGET=$(SO_TARGET) +FINAL_SO_TARGET= $(basename $(SO_TARGET))$(SO_TARGET_VERSION_MAJOR).$(SO) +MIDDLE_SO_TARGET=$(FINAL_SO_TARGET) -## Versioned import library names. -IMPORT_LIB = $(LIBICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX)$(IMPORT_LIB_EXT) -MIDDLE_IMPORT_LIB = $(LIBICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX)$(SO_TARGET_VERSION_MAJOR)$(IMPORT_LIB_EXT) -FINAL_IMPORT_LIB := $(MIDDLE_IMPORT_LIB) +## Special pkgdata information that is needed +PKGDATA_VERSIONING = -r $(SO_TARGET_VERSION_MAJOR) +ICUPKGDATA_INSTALL_DIR = $(shell cygpath -dma $(DESTDIR)$(ICUPKGDATA_DIR))#M# +ICUPKGDATA_INSTALL_LIBDIR = $(shell cygpath -dma $(DESTDIR)$(libdir))#M# + +## Versioned import library names. The library names are versioned, +## but the import libraries do not need versioning. +IMPORT_LIB = $(basename $(SO_TARGET))$(IMPORT_LIB_EXT) +MIDDLE_IMPORT_LIB = $(IMPORT_LIB) +FINAL_IMPORT_LIB = $(MIDDLE_IMPORT_LIB) ## Versioned libraries rules #%$(SO_TARGET_VERSION_MAJOR).$(SO): %$(SO_TARGET_VERSION).$(SO) -# $(RM) $@ && cp $< $@ +# $(RM) $@ && cp ${ /dev/null @mv $@ $@~ - @( echo '/\.[ch]$$' ; echo '+,$$d' ; echo "wq" ) | ed $@~ 2>/dev/null >/dev/null || exit 0 @echo -n "$@ " > $@ @cat < $@~ >> $@ @-rm $@~ %.d : $(srcdir)/%.cpp @echo "generating dependency information for $<" - @$(GEN_DEPS.cc) $< -o $@ + @$(GEN_DEPS.cc) $< >/dev/null @mv $@ $@~ - @( echo '/\.[ch]$$' ; echo '+,$$d' ; echo "wq" ) | ed $@~ 2>/dev/null >/dev/null || exit 0 @echo -n "$@ " > $@ @cat < $@~ >> $@ @-rm $@~ ## Versioned libraries rules -%.$(SO_TARGET_VERSION_MAJOR).$(SO): %.$(SO_TARGET_VERSION).$(SO) +%.$(SO).$(SO_TARGET_VERSION_MAJOR): %.$(SO).$(SO_TARGET_VERSION) $(RM) $@ && ln -s ${ CFLAGS += +Olibcalls -Ae +ESlit -CXXFLAGS += +Olibcalls +W495 +W740 +W749 +CXXFLAGS += +Olibcalls +W495 +W740 +W749 +W823 ## Commands to compile COMPILE.c= $(CC) $(DEFS) $(CPPFLAGS) $(CFLAGS) -c @@ -52,7 +57,11 @@ LD_RPATH_PRE= LDLIBRARYPATH_ENVVAR = SHLIB_PATH ## Compiler switch to embed a library name -LD_SONAME = -Wl,+h,$(MIDDLE_SO_TARGET) +LD_SONAME = -Wl,+h,$(notdir $(MIDDLE_SO_TARGET)) + +## The type of assembly needed when pkgdata is used for generating shared libraries. +# Commented out for now because the hp1 test machine runs out of memory. +#GENCCODE_ASSEMBLY=-a aCC ## Shared object suffix SO= sl @@ -70,8 +79,6 @@ STATIC_O = o %.o: $(srcdir)/%.cpp $(COMPILE.cc) $(DYNAMICCPPFLAGS) $(DYNAMICCXXFLAGS) -o $@ $< -../data/%.o: ../data/%.c - $(COMPILE.c) $(DYNAMICCPPFLAGS) $(DYNAMICCFLAGS) -o $@ $< ## Dependency rules %.d : $(srcdir)/%.c @@ -85,9 +92,9 @@ STATIC_O = o ## Versioned libraries rules %.$(SO).$(SO_TARGET_VERSION_MAJOR): %.$(SO).$(SO_TARGET_VERSION) - $(RM) $@ && ln -s $< $@ + $(RM) $@ && ln -s ${ /dev/null' + +%.d: $(srcdir)/%.cpp + @echo "generating dependency information for $<" + @$(SHELL) -ec '$(GEN_DEPS.cc) $< > /dev/null' + +## Versioned libraries rules + +%.$(SO).$(SO_TARGET_VERSION_MAJOR): %.$(SO).$(SO_TARGET_VERSION) + $(RM) $@ && ln -s ${ $@ + @$(SHELL) -ec '$(GEN_DEPS.c) $< >> $@; [ -s $@ ] || rm -f $@' + +%.d: $(srcdir)/%.cpp + @echo "generating dependency information for $<" + @echo -n "$@ " > $@ + @$(SHELL) -ec '$(GEN_DEPS.cc) $< >> $@; [ -s $@ ] || rm -f $@' + +## Versioned target for a shared library. +## Since symbolic links don't work the same way on Windows, +## we only use the version major number. +#FINAL_SO_TARGET=$(basename $(SO_TARGET))$(SO_TARGET_VERSION).$(SO) +FINAL_SO_TARGET=$(basename $(SO_TARGET))$(SO_TARGET_VERSION_MAJOR).$(SO) +MIDDLE_SO_TARGET=$(FINAL_SO_TARGET) + +## Special pkgdata information that is needed +PKGDATA_VERSIONING = -r $(SO_TARGET_VERSION_MAJOR) +ICUPKGDATA_INSTALL_DIR = $(shell cygpath -dma $(DESTDIR)$(ICUPKGDATA_DIR))#M# +ICUPKGDATA_INSTALL_LIBDIR = $(shell cygpath -dma $(DESTDIR)$(libdir))#M# + +## Versioned libraries rules +#%$(SO_TARGET_VERSION_MAJOR).$(SO): %$(SO_TARGET_VERSION).$(SO) +# $(RM) $@ && cp ${ $@ + +%.d : $(srcdir)/%.cpp + @echo "generating dependency information for $<" + @$(GEN_DEPS.cc) $< > $@ + +## Versioned libraries rules + +%.$(SO).$(SO_TARGET_VERSION_MAJOR): %.$(SO).$(SO_TARGET_VERSION) + $(RM) $@ && ln -s ${ -## -## $Id: mh-qnx,v 1.1.1.1 2003/07/03 18:13:33 avery Exp $ # @@ -35,7 +33,7 @@ LD_RPATH= LD_RPATH_PRE = -Wl,-rpath, ## Compiler switch to embed a library name -LD_SONAME = -Wl,-soname -Wl,$(MIDDLE_SO_TARGET) +LD_SONAME = -Wl,-soname -Wl,$(notdir $(MIDDLE_SO_TARGET)) ## Shared object suffix SO = so @@ -53,8 +51,6 @@ STATIC_O = ao %.o: $(srcdir)/%.cpp $(COMPILE.cc) $(DYNAMICCPPFLAGS) $(DYNAMICCXXFLAGS) -o $@ $< -../data/%.o: ../data/%.c - $(COMPILE.c) $(DYNAMICCPPFLAGS) $(DYNAMICCFLAGS) -o $@ $< ## Dependency rules %.d: $(srcdir)/%.c diff --git a/icuSources/config/mh-solaris b/icuSources/config/mh-solaris index cf12e9cc..8f5d3043 100644 --- a/icuSources/config/mh-solaris +++ b/icuSources/config/mh-solaris @@ -1,9 +1,7 @@ ## -*-makefile-*- ## Solaris-specific setup using Sun's workshop compilers -## Copyright (c) 1999-2000, International Business Machines Corporation and +## Copyright (c) 1999-2004, International Business Machines Corporation and ## others. All Rights Reserved. -## -## $Id: mh-solaris,v 1.1.1.1 2003/02/05 21:31:17 avery Exp $ ## Flags for position independent code SHAREDLIBCFLAGS = -KPIC @@ -18,8 +16,8 @@ GEN_DEPS.cc= $(CXX) -xM $(DEFS) $(CPPFLAGS) CPPFLAGS += -libmil # -mt means 'compiles and links a multithreaded program' -CFLAGS += -mt -CXXFLAGS += -mt +THREADSCFLAGS += -mt +THREADSCXXFLAGS += -mt ## Commands to link ## For Sun Workshop, use CC to link to bring in C++ runtime @@ -35,7 +33,10 @@ LD_RPATH= -R LD_RPATH_PRE= ## Compiler switch to embed a library name -LD_SONAME = -h $(MIDDLE_SO_TARGET) +LD_SONAME = -h $(notdir $(MIDDLE_SO_TARGET)) + +## The type of assembly needed when pkgdata is used for generating shared libraries. +GENCCODE_ASSEMBLY=-a sun ## Shared object suffix SO= so @@ -53,8 +54,6 @@ STATIC_O = o %.o: $(srcdir)/%.cpp $(COMPILE.cc) $(DYNAMICCPPFLAGS) $(DYNAMICCXXFLAGS) -o $@ $< -../data/%.o: ../data/%.c - $(COMPILE.c) $(DYNAMICCPPFLAGS) $(DYNAMICCFLAGS) -o $@ $< ## Dependency rules %.d : $(srcdir)/%.c @@ -68,12 +67,15 @@ STATIC_O = o ## Versioned libraries rules %.$(SO).$(SO_TARGET_VERSION_MAJOR): %.$(SO).$(SO_TARGET_VERSION) - $(RM) $@ && ln -s $< $@ + $(RM) $@ && ln -s ${&6 -echo "configure:566: checking for ICU version numbers" >&5 +echo "configure:570: checking for ICU version numbers" >&5 geticuversion() { sed -n 's/^[ ]*#[ ]*define[ ]*U_ICU_VERSION[ ]*"\([^"]*\)".*/\1/p' "$@" @@ -581,15 +585,16 @@ LIB_VERSION_MAJOR=`echo $LIB_VERSION | sed 's/\..*//'` echo "$ac_t""release $VERSION, library $LIB_VERSION" 1>&6 -UNICODE_VERSION="4" +UNICODE_VERSION="4.0.1" +#AC_SUBST(CINTLTST_CPPFLAGS) # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:593: checking for $ac_word" >&5 +echo "configure:598: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -619,7 +624,7 @@ if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:623: checking for $ac_word" >&5 +echo "configure:628: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -670,7 +675,7 @@ fi # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:674: checking for $ac_word" >&5 +echo "configure:679: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -702,7 +707,7 @@ fi fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:706: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 +echo "configure:711: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -713,12 +718,12 @@ cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext << EOF -#line 717 "configure" +#line 722 "configure" #include "confdefs.h" main(){return(0);} EOF -if { (eval echo configure:722: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:727: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -744,12 +749,12 @@ if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:748: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:753: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:753: checking whether we are using GNU C" >&5 +echo "configure:758: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -758,7 +763,7 @@ else yes; #endif EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:762: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:767: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no @@ -777,7 +782,7 @@ ac_test_CFLAGS="${CFLAGS+set}" ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:781: checking whether ${CC-cc} accepts -g" >&5 +echo "configure:786: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -813,7 +818,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:817: checking for $ac_word" >&5 +echo "configure:822: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -845,7 +850,7 @@ test -n "$CXX" || CXX="gcc" echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:849: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 +echo "configure:854: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 ac_ext=C # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -856,12 +861,12 @@ cross_compiling=$ac_cv_prog_cxx_cross cat > conftest.$ac_ext << EOF -#line 860 "configure" +#line 865 "configure" #include "confdefs.h" int main(){return(0);} EOF -if { (eval echo configure:865: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:870: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cxx_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -887,12 +892,12 @@ if test $ac_cv_prog_cxx_works = no; then { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:891: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:896: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6 cross_compiling=$ac_cv_prog_cxx_cross echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6 -echo "configure:896: checking whether we are using GNU C++" >&5 +echo "configure:901: checking whether we are using GNU C++" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -901,7 +906,7 @@ else yes; #endif EOF -if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:905: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:910: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gxx=yes else ac_cv_prog_gxx=no @@ -920,7 +925,7 @@ ac_test_CXXFLAGS="${CXXFLAGS+set}" ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS= echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6 -echo "configure:924: checking whether ${CXX-g++} accepts -g" >&5 +echo "configure:929: checking whether ${CXX-g++} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -951,57 +956,6 @@ else fi fi -for ac_declaration in \ - ''\ - '#include ' \ - 'extern "C" void std::exit (int) throw (); using std::exit;' \ - 'extern "C" void std::exit (int); using std::exit;' \ - 'extern "C" void exit (int) throw ();' \ - 'extern "C" void exit (int);' \ - 'void exit (int);' -do - cat > conftest.$ac_ext < -$ac_declaration -int main() { -exit (42); -; return 0; } -EOF -if { (eval echo configure:973: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - : -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - continue -fi -rm -f conftest* - cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - break -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 -fi -rm -f conftest* -done -if test -n "$ac_declaration"; then - echo '#ifdef __cplusplus' >>confdefs.h - echo $ac_declaration >>confdefs.h - echo '#endif' >>confdefs.h -fi - - ac_aux_dir= for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do if test -f $ac_dir/install-sh; then @@ -1033,7 +987,7 @@ ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:1037: checking for a BSD compatible install" >&5 +echo "configure:991: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1094,40 +1048,11 @@ if test "$srcdir" = "."; then fi fi -# Extract the first word of "autoconf", so it can be a program name with args. -set dummy autoconf; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1101: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_AUTOCONF'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$AUTOCONF"; then - ac_cv_prog_AUTOCONF="$AUTOCONF" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_AUTOCONF="autoconf" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_AUTOCONF" && ac_cv_prog_AUTOCONF="true" -fi -fi -AUTOCONF="$ac_cv_prog_AUTOCONF" -if test -n "$AUTOCONF"; then - echo "$ac_t""$AUTOCONF" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - +#AC_CHECK_PROG(AUTOCONF, autoconf, autoconf, true) # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1131: checking for $ac_word" >&5 +echo "configure:1056: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1160,7 +1085,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1164: checking for $ac_word" >&5 +echo "configure:1089: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_U_MAKE'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1201,7 +1126,7 @@ test -n "$U_MAKE" || U_MAKE="make" # Extract the first word of "doxygen", so it can be a program name with args. set dummy doxygen; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1205: checking for $ac_word" >&5 +echo "configure:1130: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_DOXYGEN'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1241,7 +1166,7 @@ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } fi echo $ac_n "checking host system type""... $ac_c" 1>&6 -echo "configure:1245: checking host system type" >&5 +echo "configure:1170: checking host system type" >&5 host_alias=$host case "$host_alias" in @@ -1262,12 +1187,12 @@ host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` echo "$ac_t""$host" 1>&6 echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6 -echo "configure:1266: checking for Cygwin environment" >&5 +echo "configure:1191: checking for Cygwin environment" >&5 if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1207: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_cygwin=yes else @@ -1295,19 +1220,19 @@ echo "$ac_t""$ac_cv_cygwin" 1>&6 CYGWIN= test "$ac_cv_cygwin" = yes && CYGWIN=yes echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6 -echo "configure:1299: checking for mingw32 environment" >&5 +echo "configure:1224: checking for mingw32 environment" >&5 if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1236: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_mingw32=yes else @@ -1326,7 +1251,7 @@ test "$ac_cv_mingw32" = yes && MINGW32=yes echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 -echo "configure:1330: checking for executable suffix" >&5 +echo "configure:1255: checking for executable suffix" >&5 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1336,7 +1261,7 @@ else rm -f conftest* echo 'int main () { return 0; }' > conftest.$ac_ext ac_cv_exeext= - if { (eval echo configure:1340: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then + if { (eval echo configure:1265: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then for file in conftest.*; do case $file in *.c | *.o | *.obj) ;; @@ -1359,16 +1284,16 @@ ac_exeext=$EXEEXT echo $ac_n "checking whether strict compiling is on""... $ac_c" 1>&6 -echo "configure:1363: checking whether strict compiling is on" >&5 +echo "configure:1288: checking whether strict compiling is on" >&5 # Check whether --enable-strict or --disable-strict was given. if test "${enable_strict+set}" = set; then enableval="$enable_strict" - if test "$enableval" = no - then - ac_use_strict_options=no + if test "$enableval" = no + then + ac_use_strict_options=no else - ac_use_strict_options=yes + ac_use_strict_options=yes fi else @@ -1381,19 +1306,35 @@ fi then if test "$GCC" = yes then - CFLAGS="$CFLAGS -Wall -ansi -pedantic -Wshadow -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -Winline" + CFLAGS="$CFLAGS -Wall -ansi -pedantic -Wshadow -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -Winline -Wno-long-long" case "${host}" in *-*-solaris*) CFLAGS="$CFLAGS -D__STDC__=0";; esac + else + case "${host}" in + *-*-cygwin) + if test "`$CC /help 2>&1 | head -c9`" = "Microsoft" + then + CFLAGS="$CFLAGS /W4" + fi + esac fi if test "$GXX" = yes then - CXXFLAGS="$CXXFLAGS -W -Wall -ansi -pedantic -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -Winline" + CXXFLAGS="$CXXFLAGS -W -Wall -ansi -pedantic -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -Winline -Wno-long-long" case "${host}" in *-*-solaris*) CXXFLAGS="$CXXFLAGS -D__STDC__=0";; esac + else + case "${host}" in + *-*-cygwin) + if test "`$CXX /help 2>&1 | head -c9`" = "Microsoft" + then + CXXFLAGS="$CXXFLAGS /W4" + fi + esac fi fi @@ -1409,23 +1350,16 @@ else fi echo $ac_n "checking for 64-bit executable support""... $ac_c" 1>&6 -echo "configure:1413: checking for 64-bit executable support" >&5 - if test "$ENABLE_64BIT_LIBS" = no; then - case "${host}" in - *-*-hpux*) - case "${CXX}" in - *CC) - CFLAGS="${CFLAGS} +DAportable" - CXXFLAGS="${CXXFLAGS} +DAportable" - ;; - esac;; - esac - else +echo "configure:1354: checking for 64-bit executable support" >&5 + if test "$ENABLE_64BIT_LIBS" != no; then case "${host}" in *-*-solaris*) - if test "$ac_cv_prog_gcc" = no; then + SPARCV9=`isainfo -n 2>&1 | grep sparcv9` + if test "$GCC" = yes; then + # We could add a check for -m64 depending on the gcc version. + ENABLE_64BIT_LIBS=no + else SOL64=`$CXX -xarch=v9 2>&1 && $CC -xarch=v9 2>&1 | grep -v usage:` - SPARCV9=`isainfo -n 2>&1 | grep sparcv9` if test -z "$SOL64" && test -n "$SPARCV9"; then CFLAGS="${CFLAGS} -xtarget=ultra -xarch=v9" CXXFLAGS="${CXXFLAGS} -xtarget=ultra -xarch=v9" @@ -1434,26 +1368,61 @@ echo "configure:1413: checking for 64-bit executable support" >&5 else ENABLE_64BIT_LIBS=no fi + fi + ;; + ia64-*-linux*) + if test "$GCC" = yes; then + # gcc compiler support + if test -n "`$CXX -dumpspecs 2>&1 && $CC -dumpspecs 2>&1 | grep -v __LP64__`"; then + ENABLE_64BIT_LIBS=yes + else + ENABLE_64BIT_LIBS=no + fi + else + # check for ecc/ecpc compiler support + if test -n "`$CXX --help 2>&1 && $CC --help 2>&1 | grep -v Intel`"; then + if test -n "`$CXX --help 2>&1 && $CC --help 2>&1 | grep -v Itanium`"; then + ENABLE_64BIT_LIBS=yes + else + ENABLE_64BIT_LIBS=no + fi + else + # unknown + ENABLE_64BIT_LIBS=no + fi + fi + ;; + x86_64-*-linux*) + if test "$GCC" = yes; then + if test -n "`$CXX -dumpspecs 2>&1 && $CC -dumpspecs 2>&1 | grep -v __LP64__`"; then + ENABLE_64BIT_LIBS=yes + else + ENABLE_64BIT_LIBS=no + fi else + # unknown ENABLE_64BIT_LIBS=no fi ;; - *-*-aix*) - OLD_CFLAGS="${CFLAGS}" - OLD_CXXFLAGS="${CXXFLAGS}" - OLD_LDFLAGS="${LDFLAGS}" - CFLAGS="${CFLAGS} -q64" - CXXFLAGS="${CXXFLAGS} -q64" - LDFLAGS="${LDFLAGS} -q64" - if test "$cross_compiling" = yes; then + *-*-aix*|powerpc64-*-linux*) + if test "$ac_cv_prog_gcc" = no; then + # Note: Have not tested 64-bitness with gcc. + # Maybe the flag "-maix64" could be used with gcc? + OLD_CFLAGS="${CFLAGS}" + OLD_CXXFLAGS="${CXXFLAGS}" + OLD_LDFLAGS="${LDFLAGS}" + CFLAGS="${CFLAGS} -q64" + CXXFLAGS="${CXXFLAGS} -q64" + LDFLAGS="${LDFLAGS} -q64" + if test "$cross_compiling" = yes; then ENABLE_64BIT_LIBS=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:1426: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ENABLE_64BIT_LIBS=yes else @@ -1465,28 +1434,33 @@ fi rm -fr conftest* fi - if test "$ENABLE_64BIT_LIBS" = no; then - CFLAGS="${OLD_CFLAGS}" - CXXFLAGS="${OLD_CXXFLAGS}" - LDFLAGS="${OLD_LDFLAGS}" - else - ARFLAGS="${ARFLAGS} -X64" + if test "$ENABLE_64BIT_LIBS" = no; then + CFLAGS="${OLD_CFLAGS}" + CXXFLAGS="${OLD_CXXFLAGS}" + LDFLAGS="${OLD_LDFLAGS}" + else + case "${host}" in + *-*-aix*) + ARFLAGS="${ARFLAGS} -X64" + esac + fi fi ;; *-*-hpux*) + OLD_CFLAGS="${CFLAGS}" OLD_CXXFLAGS="${CXXFLAGS}" - CFLAGS="${CFLAGS} +DA2.0W" - CXXFLAGS="${CXXFLAGS} +DA2.0W" + CFLAGS="${CFLAGS} +DD64" + CXXFLAGS="${CXXFLAGS} +DD64" if test "$cross_compiling" = yes; then ENABLE_64BIT_LIBS=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:1464: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ENABLE_64BIT_LIBS=yes else @@ -1501,6 +1475,32 @@ fi if test "$ENABLE_64BIT_LIBS" = no; then CFLAGS="${OLD_CFLAGS}" CXXFLAGS="${OLD_CXXFLAGS}" + CFLAGS="${CFLAGS} +DA2.0W" + CXXFLAGS="${CXXFLAGS} +DA2.0W" + if test "$cross_compiling" = yes; then + ENABLE_64BIT_LIBS=no +else + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + ENABLE_64BIT_LIBS=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ENABLE_64BIT_LIBS=no +fi +rm -fr conftest* +fi + + if test "$ENABLE_64BIT_LIBS" = no; then + CFLAGS="${OLD_CFLAGS}" + CXXFLAGS="${OLD_CXXFLAGS}" + fi fi ;; *) @@ -1522,33 +1522,49 @@ else case "${host}" in *-*-solaris*) - if test "$ac_cv_prog_gcc" = yes; then + if test "$GCC" = yes; then icu_cv_host_frag=mh-solaris-gcc else icu_cv_host_frag=mh-solaris fi ;; alpha*-*-linux-gnu) - if test "$ac_cv_prog_gcc" = yes; then + if test "$GCC" = yes; then icu_cv_host_frag=mh-alpha-linux-gcc else icu_cv_host_frag=mh-alpha-linux-cc fi ;; +powerpc*-*-linux*) + if test "$GCC" = yes; then + icu_cv_host_frag=mh-linux + else + icu_cv_host_frag=mh-linux-va + fi ;; *-*-linux*) icu_cv_host_frag=mh-linux ;; *-*-cygwin) - if test "$ac_cv_prog_gcc" = yes; then + if test "$GCC" = yes; then icu_cv_host_frag=mh-cygwin else icu_cv_host_frag=mh-cygwin-msvc fi ;; +*-*-mingw32) + if test "$GCC" = yes; then + icu_cv_host_frag=mh-mingw + else + icu_cv_host_frag=mh-cygwin-msvc + fi ;; *-*-*bsd*) icu_cv_host_frag=mh-bsd-gcc ;; *-*-aix*) - if test -n "`$CXX --help 2>&1 | grep 'IBM C and C++ Compilers$'`"; then - icu_cv_host_frag=mh-aix + if test "$GCC" = yes; then + icu_cv_host_frag=mh-aix-gcc else - icu_cv_host_frag=mh-aix-va + if test -n "`$CXX --help 2>&1 | grep 'IBM C and C++ Compilers$'`"; then + icu_cv_host_frag=mh-aix + else + icu_cv_host_frag=mh-aix-va + fi fi ;; *-*-hpux*) - if test "$ac_cv_prog_gcc" = yes; then + if test "$GCC" = yes; then icu_cv_host_frag=mh-hpux-gcc else case "$CXX" in @@ -1560,9 +1576,11 @@ alpha*-*-linux-gnu) *-*-os400*) icu_cv_host_frag=mh-os400 ;; *-apple-rhapsody*) icu_cv_host_frag=mh-darwin ;; *-apple-darwin*) icu_cv_host_frag=mh-darwin ;; +*-*-beos) icu_cv_host_frag=mh-beos ;; *-*-irix*) icu_cv_host_frag=mh-irix ;; *-dec-osf*) icu_cv_host_frag=mh-alpha-osf ;; *-*-nto*) icu_cv_host_frag=mh-qnx ;; +*-ncr-*) icu_cv_host_frag=mh-mpras ;; *-sequent-*) icu_cv_host_frag=mh-ptx ;; *) icu_cv_host_frag=mh-unknown ;; esac @@ -1573,52 +1591,9 @@ fi echo "$ac_t""$icu_cv_host_frag" 1>&6 -hpuxcma=false - case "${host}" in - *-*-hpux10*) hpuxcma=true - echo $ac_n "checking for floor in -lm""... $ac_c" 1>&6 -echo "configure:1582: checking for floor in -lm" >&5 -ac_lib_var=`echo m'_'floor | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lm $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - LIB_M="-lm" -else - echo "$ac_t""no" 1>&6 -fi - ;; *-*-hpux*) echo $ac_n "checking for floor in -lm""... $ac_c" 1>&6 -echo "configure:1622: checking for floor in -lm" >&5 +echo "configure:1597: checking for floor in -lm" >&5 ac_lib_var=`echo m'_'floor | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1626,7 +1601,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lm $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1616: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1659,7 +1634,7 @@ fi ;; *) echo $ac_n "checking for floor in -lm""... $ac_c" 1>&6 -echo "configure:1663: checking for floor in -lm" >&5 +echo "configure:1638: checking for floor in -lm" >&5 ac_lib_var=`echo m'_'floor | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1667,7 +1642,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lm $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1657: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1709,39 +1684,8 @@ fi esac - -if test $hpuxcma = false; then - # Check whether --enable-hpuxcma or --disable-hpuxcma was given. -if test "${enable_hpuxcma+set}" = set; then - enableval="$enable_hpuxcma" - case "${enableval}" in - yes) hpuxcma=true;; - no) hpuxcma=false;; - *) { echo "configure: error: bad value ${enableval} for --enable-hpuxcma" 1>&2; exit 1; } ;; - esac -fi - -fi - - - -if test "$hpuxcma" = true; then - HPUX_CMA_TRUE= - HPUX_CMA_FALSE='#' -else - HPUX_CMA_TRUE='#' - HPUX_CMA_FALSE= -fi - -if test $hpuxcma = true; then - case "${host}" in - *-*-hpux*) hpuxcma=true ;; - *) { echo "configure: error: --enable-hpuxcma is not valid on this platform ${host}" 1>&2; exit 1; } ;; - esac -fi - echo $ac_n "checking whether to build shared libraries""... $ac_c" 1>&6 -echo "configure:1745: checking whether to build shared libraries" >&5 +echo "configure:1689: checking whether to build shared libraries" >&5 enabled=no # Check whether --enable-shared or --disable-shared was given. if test "${enable_shared+set}" = set; then @@ -1760,7 +1704,7 @@ echo "$ac_t""$enabled" 1>&6 echo $ac_n "checking whether to build static libraries""... $ac_c" 1>&6 -echo "configure:1764: checking whether to build static libraries" >&5 +echo "configure:1708: checking whether to build static libraries" >&5 enabled=no # Check whether --enable-static or --disable-static was given. if test "${enable_static+set}" = set; then @@ -1775,10 +1719,42 @@ fi echo "$ac_t""$enabled" 1>&6 +echo $ac_n "checking whether to build debug libraries""... $ac_c" 1>&6 +echo "configure:1724: checking whether to build debug libraries" >&5 +enabled=no +ENABLE_DEBUG=0 +# Check whether --enable-debug or --disable-debug was given. +if test "${enable_debug+set}" = set; then + enableval="$enable_debug" + case "${enableval}" in + yes|"") enabled=yes; ENABLE_DEBUG=1 ;; + *) ;; + esac +fi + +echo "$ac_t""$enabled" 1>&6 + + +echo $ac_n "checking whether to build release libraries""... $ac_c" 1>&6 +echo "configure:1740: checking whether to build release libraries" >&5 +enabled=yes +ENABLE_RELEASE=1 +# Check whether --enable-release or --disable-release was given. +if test "${enable_release+set}" = set; then + enableval="$enable_release" + case "${enableval}" in + no) enabled=no; ENABLE_RELEASE=0 ;; + *) ;; + esac +fi + +echo "$ac_t""$enabled" 1>&6 + + # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1782: checking for $ac_word" >&5 +echo "configure:1758: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1808,7 +1784,7 @@ fi # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1812: checking for $ac_word" >&5 +echo "configure:1788: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_AR'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1843,7 +1819,7 @@ fi echo $ac_n "checking whether to enable renaming of symbols""... $ac_c" 1>&6 -echo "configure:1847: checking whether to enable renaming of symbols" >&5 +echo "configure:1823: checking whether to enable renaming of symbols" >&5 enabled=yes U_DISABLE_RENAMING=0 # Check whether --enable-renaming or --disable-renaming was given. @@ -1859,6 +1835,23 @@ fi echo "$ac_t""$enabled" 1>&6 +echo $ac_n "checking whether to enable function and data tracing""... $ac_c" 1>&6 +echo "configure:1840: checking whether to enable function and data tracing" >&5 +enabled=yes +U_ENABLE_TRACING=1 +# Check whether --enable-tracing or --disable-tracing was given. +if test "${enable_tracing+set}" = set; then + enableval="$enable_tracing" + case "${enableval}" in + yes|"") enabled=yes ;; + no) enabled=no; U_ENABLE_TRACING=0 ;; + *) ;; + esac +fi + +echo "$ac_t""$enabled" 1>&6 + + # Check whether --enable-rpath or --disable-rpath was given. if test "${enable_rpath+set}" = set; then enableval="$enable_rpath" @@ -1876,21 +1869,21 @@ fi echo $ac_n "checking for definition of U_INLINE for C""... $ac_c" 1>&6 -echo "configure:1880: checking for definition of U_INLINE for C" >&5 +echo "configure:1873: checking for definition of U_INLINE for C" >&5 if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1887: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_inline=$ac_kw; break else @@ -1925,73 +1918,18 @@ else fi - if test "$threads" = true; then THREADS_TRUE= - THREADS_FALSE='#' else THREADS_TRUE='#' - THREADS_FALSE= fi ICU_USE_THREADS=0 if test $threads = true; then - if test $hpuxcma = true; then - echo $ac_n "checking for pthread_create in -lcma""... $ac_c" 1>&6 -echo "configure:1943: checking for pthread_create in -lcma" >&5 -ac_lib_var=`echo cma'_'pthread_create | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lcma $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_lib=HAVE_LIB`echo cma | sed -e 's/[^a-zA-Z0-9_]/_/g' \ - -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` - cat >> confdefs.h <&6 -fi - - if test $ac_cv_lib_cma_pthread_create = yes; then - ICU_USE_THREADS=1 - fi - else echo $ac_n "checking for pthread_attr_init in -lpthread""... $ac_c" 1>&6 -echo "configure:1995: checking for pthread_attr_init in -lpthread" >&5 +echo "configure:1933: checking for pthread_attr_init in -lpthread" >&5 ac_lib_var=`echo pthread'_'pthread_attr_init | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1999,7 +1937,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpthread $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1952: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2040,19 +1978,19 @@ fi if test $ac_cv_lib_pthread_pthread_attr_init = yes; then ICU_USE_THREADS=1 else - + echo $ac_n "checking for library containing pthread_mutex_destroy""... $ac_c" 1>&6 -echo "configure:2047: checking for library containing pthread_mutex_destroy" >&5 +echo "configure:1985: checking for library containing pthread_mutex_destroy" >&5 if eval "test \"`echo '$''{'ac_cv_search_pthread_mutex_destroy'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_func_search_save_LIBS="$LIBS" ac_cv_search_pthread_mutex_destroy="no" -for i in pthread pthreads c_r cma; do +for i in pthread pthreads c_r ; do LIBS="-l$i $ac_func_search_save_LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2005: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_search_pthread_mutex_destroy="-l$i" break @@ -2075,7 +2013,7 @@ rm -f conftest* done if test "$ac_cv_search_pthread_mutex_destroy" = "no"; then cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2028: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_search_pthread_mutex_destroy="none required" else @@ -2110,7 +2048,7 @@ fi ICU_USE_THREADS=1 else echo $ac_n "checking for pthread_mutex_init in -lpthread""... $ac_c" 1>&6 -echo "configure:2114: checking for pthread_mutex_init in -lpthread" >&5 +echo "configure:2052: checking for pthread_mutex_init in -lpthread" >&5 ac_lib_var=`echo pthread'_'pthread_mutex_init | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -2118,7 +2056,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpthread $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2071: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2162,12 +2100,12 @@ fi fi echo $ac_n "checking for pthread_mutex_lock""... $ac_c" 1>&6 -echo "configure:2166: checking for pthread_mutex_lock" >&5 +echo "configure:2104: checking for pthread_mutex_lock" >&5 if eval "test \"`echo '$''{'ac_cv_func_pthread_mutex_lock'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2132: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_pthread_mutex_lock=yes" else @@ -2213,8 +2151,24 @@ fi if test $ac_cv_func_pthread_mutex_lock = yes; then ICU_USE_THREADS=1 fi + case "${host}" in + *-pc-cygwin*|*-pc-mingw*) + if test "$ac_cv_prog_gcc" = no; then + ICU_USE_THREADS=1 + fi ;; + *-*-hpux*) + case "${icu_cv_host_frag}" in + mh-hpux-acc) + OLD_CXXFLAGS="${CXXFLAGS}" + CXXFLAGS="${CXXFLAGS} -mt" + if test x"`${CXX} ${CXXFLAGS} 2>&1`" != x""; then + CXXFLAGS="${OLD_CXXFLAGS}" + fi + ;; + esac + ;; + esac fi - fi fi @@ -2224,12 +2178,12 @@ fi # Do this check instead. HAVE_MMAP=0 echo $ac_n "checking for mmap""... $ac_c" 1>&6 -echo "configure:2228: checking for mmap" >&5 +echo "configure:2182: checking for mmap" >&5 if eval "test \"`echo '$''{'ac_cv_func_mmap_ok'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -2241,7 +2195,7 @@ int main() { mmap((void *)0, 0, PROT_READ, 0, 0, 0); ; return 0; } EOF -if { (eval echo configure:2245: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2199: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_func_mmap_ok=yes else @@ -2260,8 +2214,18 @@ then fi +GENCCODE_ASSEMBLY= +case "${host}" in +i*86-*-*bsd*|i*86-*-linux*|x86_64-*-linux*|powerpc*-*-linux*) + if test "$GCC" = yes; then + GENCCODE_ASSEMBLY="-a gcc" + fi ;; +esac + + + echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:2265: checking how to run the C preprocessor" >&5 +echo "configure:2229: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= @@ -2276,13 +2240,13 @@ else # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2286: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2250: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -2293,13 +2257,13 @@ else rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2303: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2267: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -2310,13 +2274,13 @@ else rm -rf conftest* CPP="${CC-cc} -nologo -E" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2320: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2284: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -2344,17 +2308,17 @@ for ac_hdr in inttypes.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:2348: checking for $ac_hdr" >&5 +echo "configure:2312: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2358: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2322: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -2420,17 +2384,23 @@ ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cxx_cross + OLD_CXXFLAGS="${CXXFLAGS}" + case "${icu_cv_host_frag}" in + mh-hpux-acc) + CXXFLAGS="${CXXFLAGS} -AA" + ;; + esac echo $ac_n "checking iostream usability""... $ac_c" 1>&6 -echo "configure:2425: checking iostream usability" >&5 +echo "configure:2395: checking iostream usability" >&5 cat > conftest.$ac_ext < int main() { ; return 0; } EOF -if { (eval echo configure:2434: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:2404: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_header_iostream=yes else @@ -2440,13 +2410,18 @@ else ac_cv_header_iostream=no fi rm -f conftest* + if test $icu_cv_host_frag = mh-cygwin-msvc + then + ac_cv_header_iostream=yes + fi echo "$ac_t""$ac_cv_header_iostream" 1>&6 if test $ac_cv_header_iostream = yes then U_IOSTREAM_SOURCE=199711 else + CXXFLAGS="${OLD_CXXFLAGS}" echo $ac_n "checking how to run the C++ preprocessor""... $ac_c" 1>&6 -echo "configure:2450: checking how to run the C++ preprocessor" >&5 +echo "configure:2425: checking how to run the C++ preprocessor" >&5 if test -z "$CXXCPP"; then if eval "test \"`echo '$''{'ac_cv_prog_CXXCPP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -2459,12 +2434,12 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes cross_compiling=$ac_cv_prog_cxx_cross CXXCPP="${CXX-g++} -E" cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2468: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2443: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -2490,17 +2465,17 @@ echo "$ac_t""$CXXCPP" 1>&6 ac_safe=`echo "iostream.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for iostream.h""... $ac_c" 1>&6 -echo "configure:2494: checking for iostream.h" >&5 +echo "configure:2469: checking for iostream.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2504: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2479: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -2523,19 +2498,19 @@ fi if test $ac_cv_header_iostream_h = yes; then echo $ac_n "checking whether ostream is really defined""... $ac_c" 1>&6 -echo "configure:2527: checking whether ostream is really defined" >&5 +echo "configure:2502: checking whether ostream is really defined" >&5 if eval "test \"`echo '$''{'ac_cv_iostream_ok'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < int main() { ostream &testout = cout; testout << "test" << endl; ; return 0; } EOF -if { (eval echo configure:2539: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2514: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_iostream_ok=yes else @@ -2559,6 +2534,13 @@ fi if test $U_IOSTREAM_SOURCE -ge $streams then U_IOSTREAM_SOURCE=$streams + case "${icu_cv_host_frag}" in + mh-hpux-acc) + if test $U_IOSTREAM_SOURCE -lt 199711; then + CXXFLAGS=${OLD_CXXFLAGS} + fi + ;; + esac else { echo "configure: error: ${withval} iostream is not available" 1>&2; exit 1; } fi @@ -2574,14 +2556,14 @@ cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6 -echo "configure:2578: checking whether byte ordering is bigendian" >&5 +echo "configure:2560: checking whether byte ordering is bigendian" >&5 if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_cv_c_bigendian=unknown # See if sys/param.h defines the BYTE_ORDER macro. cat > conftest.$ac_ext < #include @@ -2592,11 +2574,11 @@ int main() { #endif ; return 0; } EOF -if { (eval echo configure:2596: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:2578: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* # It does; now see whether it defined to BIG_ENDIAN or not. cat > conftest.$ac_ext < #include @@ -2607,7 +2589,7 @@ int main() { #endif ; return 0; } EOF -if { (eval echo configure:2611: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:2593: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_bigendian=yes else @@ -2627,7 +2609,7 @@ if test "$cross_compiling" = yes; then { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:2626: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_c_bigendian=no else @@ -2675,12 +2657,12 @@ fi U_HAVE_NL_LANGINFO_CODESET=0 U_NL_LANGINFO_CODESET=-1 echo $ac_n "checking for nl_langinfo""... $ac_c" 1>&6 -echo "configure:2679: checking for nl_langinfo" >&5 +echo "configure:2661: checking for nl_langinfo" >&5 if eval "test \"`echo '$''{'ac_cv_func_nl_langinfo'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2689: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_nl_langinfo=yes" else @@ -2726,21 +2708,21 @@ fi if test $U_HAVE_NL_LANGINFO -eq 1; then echo $ac_n "checking for nl_langinfo's argument to obtain the codeset""... $ac_c" 1>&6 -echo "configure:2730: checking for nl_langinfo's argument to obtain the codeset" >&5 +echo "configure:2712: checking for nl_langinfo's argument to obtain the codeset" >&5 if eval "test \"`echo '$''{'ac_cv_nl_langinfo_codeset'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_cv_nl_langinfo_codeset="unknown" for a in CODESET _NL_CTYPE_CODESET_NAME; do cat > conftest.$ac_ext < int main() { nl_langinfo($a); ; return 0; } EOF -if { (eval echo configure:2744: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2726: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_nl_langinfo_codeset="$a"; break else @@ -2769,12 +2751,12 @@ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftes cross_compiling=$ac_cv_prog_cxx_cross echo $ac_n "checking for namespace support""... $ac_c" 1>&6 -echo "configure:2773: checking for namespace support" >&5 +echo "configure:2755: checking for namespace support" >&5 if eval "test \"`echo '$''{'ac_cv_namespace_ok'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2770: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_namespace_ok=yes else @@ -2805,17 +2787,18 @@ fi echo $ac_n "checking for properly overriding new and delete""... $ac_c" 1>&6 -echo "configure:2809: checking for properly overriding new and delete" >&5 +echo "configure:2791: checking for properly overriding new and delete" >&5 U_OVERRIDE_CXX_ALLOCATION=0 U_HAVE_PLACEMENT_NEW=0 if eval "test \"`echo '$''{'ac_cv_override_cxx_allocation_ok'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < - class UObject { + class UMemory { + public: void *operator new(size_t size) {return malloc(size);} void *operator new[](size_t size) {return malloc(size);} void operator delete(void *p) {free(p);} @@ -2826,7 +2809,7 @@ int main() { ; return 0; } EOF -if { (eval echo configure:2830: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2813: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_override_cxx_allocation_ok=yes else @@ -2843,15 +2826,16 @@ if test $ac_cv_override_cxx_allocation_ok = yes then U_OVERRIDE_CXX_ALLOCATION=1 echo $ac_n "checking for placement new and delete""... $ac_c" 1>&6 -echo "configure:2847: checking for placement new and delete" >&5 +echo "configure:2830: checking for placement new and delete" >&5 if eval "test \"`echo '$''{'ac_cv_override_placement_new_ok'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < - class UObject { + class UMemory { + public: void *operator new(size_t size) {return malloc(size);} void *operator new[](size_t size) {return malloc(size);} void operator delete(void *p) {free(p);} @@ -2864,7 +2848,7 @@ int main() { ; return 0; } EOF -if { (eval echo configure:2868: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2852: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_override_placement_new_ok=yes else @@ -2893,12 +2877,12 @@ ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$a cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking for popen""... $ac_c" 1>&6 -echo "configure:2897: checking for popen" >&5 +echo "configure:2881: checking for popen" >&5 if eval "test \"`echo '$''{'ac_cv_func_popen'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2909: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_popen=yes" else @@ -2949,12 +2933,12 @@ fi echo $ac_n "checking for tzset""... $ac_c" 1>&6 -echo "configure:2953: checking for tzset" >&5 +echo "configure:2937: checking for tzset" >&5 if eval "test \"`echo '$''{'ac_cv_func_tzset'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2965: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_tzset=yes" else @@ -2996,17 +2980,19 @@ else echo "$ac_t""no" 1>&6 fi +U_HAVE_TZSET=0 if test x$ac_cv_func_tzset = xyes then U_TZSET=tzset + U_HAVE_TZSET=1 else echo $ac_n "checking for _tzset""... $ac_c" 1>&6 -echo "configure:3005: checking for _tzset" >&5 +echo "configure:2991: checking for _tzset" >&5 if eval "test \"`echo '$''{'ac_cv_func__tzset'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3019: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func__tzset=yes" else @@ -3050,21 +3036,26 @@ fi if test x$ac_cv_func__tzset = xyes then - U_TZSET=_tzset + U_TZSET=_tzset + U_HAVE_TZSET=1 fi fi + + +U_HAVE_TZNAME=0 echo $ac_n "checking for tzname""... $ac_c" 1>&6 -echo "configure:3059: checking for tzname" >&5 +echo "configure:3049: checking for tzname" >&5 if eval "test \"`echo '$''{'ac_cv_var_tzname'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include #ifndef tzname /* For SGI. */ extern char *tzname[]; /* RS6000 and others reject char **tzname. */ @@ -3073,7 +3064,7 @@ int main() { atoi(*tzname); ; return 0; } EOF -if { (eval echo configure:3077: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3068: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_var_tzname=yes else @@ -3088,15 +3079,17 @@ fi echo "$ac_t""$ac_cv_var_tzname" 1>&6 if test $ac_cv_var_tzname = yes; then U_TZNAME=tzname + U_HAVE_TZNAME=1 else echo $ac_n "checking for _tzname""... $ac_c" 1>&6 -echo "configure:3094: checking for _tzname" >&5 +echo "configure:3086: checking for _tzname" >&5 if eval "test \"`echo '$''{'ac_cv_var__tzname'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include extern char *_tzname[]; @@ -3104,7 +3097,7 @@ int main() { atoi(*_tzname); ; return 0; } EOF -if { (eval echo configure:3108: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3101: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_var__tzname=yes else @@ -3119,17 +3112,19 @@ fi echo "$ac_t""$ac_cv_var__tzname" 1>&6 if test $ac_cv_var__tzname = yes; then U_TZNAME=_tzname + U_HAVE_TZNAME=1 fi fi + echo $ac_n "checking for timezone""... $ac_c" 1>&6 -echo "configure:3128: checking for timezone" >&5 +echo "configure:3123: checking for timezone" >&5 if eval "test \"`echo '$''{'ac_cv_var_timezone'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3142: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_var_timezone=yes else @@ -3162,12 +3157,12 @@ if test $ac_cv_var_timezone = yes; then U_HAVE_TIMEZONE=1 else echo $ac_n "checking for __timezone""... $ac_c" 1>&6 -echo "configure:3166: checking for __timezone" >&5 +echo "configure:3161: checking for __timezone" >&5 if eval "test \"`echo '$''{'ac_cv_var___timezone'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -3175,7 +3170,7 @@ int main() { __timezone = 1; ; return 0; } EOF -if { (eval echo configure:3179: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3174: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_var___timezone=yes else @@ -3193,12 +3188,12 @@ echo "$ac_t""$ac_cv_var___timezone" 1>&6 U_HAVE_TIMEZONE=1 else echo $ac_n "checking for _timezone""... $ac_c" 1>&6 -echo "configure:3197: checking for _timezone" >&5 +echo "configure:3192: checking for _timezone" >&5 if eval "test \"`echo '$''{'ac_cv_var__timezone'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -3206,7 +3201,7 @@ int main() { _timezone = 1; ; return 0; } EOF -if { (eval echo configure:3210: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3205: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_var__timezone=yes else @@ -3229,12 +3224,12 @@ fi echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 -echo "configure:3233: checking for ANSI C header files" >&5 +echo "configure:3228: checking for ANSI C header files" >&5 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -3242,7 +3237,7 @@ else #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:3246: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:3241: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -3259,7 +3254,7 @@ rm -f conftest* if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF @@ -3277,7 +3272,7 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF @@ -3298,7 +3293,7 @@ if test "$cross_compiling" = yes; then : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') @@ -3309,7 +3304,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } EOF -if { (eval echo configure:3313: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:3308: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then : else @@ -3333,12 +3328,12 @@ EOF fi echo $ac_n "checking for int8_t""... $ac_c" 1>&6 -echo "configure:3337: checking for int8_t" >&5 +echo "configure:3332: checking for int8_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_int8_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -3366,12 +3361,12 @@ EOF fi echo $ac_n "checking for uint8_t""... $ac_c" 1>&6 -echo "configure:3370: checking for uint8_t" >&5 +echo "configure:3365: checking for uint8_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_uint8_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -3399,12 +3394,12 @@ EOF fi echo $ac_n "checking for int16_t""... $ac_c" 1>&6 -echo "configure:3403: checking for int16_t" >&5 +echo "configure:3398: checking for int16_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_int16_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -3432,12 +3427,12 @@ EOF fi echo $ac_n "checking for uint16_t""... $ac_c" 1>&6 -echo "configure:3436: checking for uint16_t" >&5 +echo "configure:3431: checking for uint16_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_uint16_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -3465,12 +3460,12 @@ EOF fi echo $ac_n "checking for int32_t""... $ac_c" 1>&6 -echo "configure:3469: checking for int32_t" >&5 +echo "configure:3464: checking for int32_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_int32_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -3498,12 +3493,12 @@ EOF fi echo $ac_n "checking for uint32_t""... $ac_c" 1>&6 -echo "configure:3502: checking for uint32_t" >&5 +echo "configure:3497: checking for uint32_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_uint32_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -3531,12 +3526,12 @@ EOF fi echo $ac_n "checking for int64_t""... $ac_c" 1>&6 -echo "configure:3535: checking for int64_t" >&5 +echo "configure:3530: checking for int64_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_int64_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -3564,12 +3559,12 @@ EOF fi echo $ac_n "checking for uint64_t""... $ac_c" 1>&6 -echo "configure:3568: checking for uint64_t" >&5 +echo "configure:3563: checking for uint64_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_uint64_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -3655,17 +3650,17 @@ fi ac_safe=`echo "wchar.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for wchar.h""... $ac_c" 1>&6 -echo "configure:3659: checking for wchar.h" >&5 +echo "configure:3654: checking for wchar.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:3669: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:3664: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -3698,14 +3693,14 @@ EOF U_HAVE_WCHAR_H=1 echo $ac_n "checking for library containing wcscpy""... $ac_c" 1>&6 -echo "configure:3702: checking for library containing wcscpy" >&5 +echo "configure:3697: checking for library containing wcscpy" >&5 if eval "test \"`echo '$''{'ac_cv_search_wcscpy'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_func_search_save_LIBS="$LIBS" ac_cv_search_wcscpy="no" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3715: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_search_wcscpy="none required" else @@ -3727,7 +3722,7 @@ rm -f conftest* test "$ac_cv_search_wcscpy" = "no" && for i in wcs w; do LIBS="-l$i $ac_func_search_save_LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3737: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_search_wcscpy="-l$i" break @@ -3769,7 +3764,7 @@ fi ac_default_sizeof_wchar_t=4 echo $ac_n "checking size of wchar_t""... $ac_c" 1>&6 -echo "configure:3773: checking size of wchar_t" >&5 +echo "configure:3768: checking size of wchar_t" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_wchar_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -3777,7 +3772,7 @@ else ac_cv_sizeof_wchar_t=$ac_default_sizeof_wchar_t else cat > conftest.$ac_ext < @@ -3795,7 +3790,7 @@ main() exit(0); } EOF -if { (eval echo configure:3799: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:3794: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_wchar_t=`cat conftestval` else @@ -3822,10 +3817,11 @@ if test $U_SIZEOF_WCHAR_T = 0; then fi -ECHO_N=$ac_n -ECHO_C=$ac_c - - +#dnl Echo +#ECHO_N=$ac_n +#ECHO_C=$ac_c +#AC_SUBST(ECHO_N) +#AC_SUBST(ECHO_C) # Check whether --enable-extras or --disable-extras was given. if test "${enable_extras+set}" = set; then @@ -3840,34 +3836,28 @@ else fi - if test "$extras" = true; then EXTRAS_TRUE= - EXTRAS_FALSE='#' else EXTRAS_TRUE='#' - EXTRAS_FALSE= fi # Check whether --enable-extras or --disable-extras was given. if test "${enable_extras+set}" = set; then enableval="$enable_extras" case "${enableval}" in - yes) ustdio=true ;; - no) ustdio=false ;; - *) { echo "configure: error: bad value ${enableval} for --enable-ustdio" 1>&2; exit 1; } ;; + yes) icuio=true ;; + no) icuio=false ;; + *) { echo "configure: error: bad value ${enableval} for --enable-icuio" 1>&2; exit 1; } ;; esac else - ustdio=true + icuio=true fi - -if test "$ustdio" = true; then - USTDIO_TRUE= - USTDIO_FALSE='#' +if test "$icuio" = true; then + ICUIO_TRUE= else - USTDIO_TRUE='#' - USTDIO_FALSE= + ICUIO_TRUE='#' fi # Check whether --enable-layout or --disable-layout was given. @@ -3883,13 +3873,10 @@ else fi - if test "$layout" = true; then LAYOUT_TRUE= - LAYOUT_FALSE='#' else LAYOUT_TRUE='#' - LAYOUT_FALSE= fi # Check whether --with-data-packaging or --without-data-packaging was given. @@ -3900,7 +3887,8 @@ if test "${with_data_packaging+set}" = set; then auto) datapackaging=$withval ;; common) datapackaging=archive ;; dll) datapackaging=library ;; - *) { echo "configure: error: bad value ${withval} for --with-iostream" 1>&2; exit 1; } ;; + static) datapackaging=static ;; + *) { echo "configure: error: bad value ${withval} for --with-data-packaging" 1>&2; exit 1; } ;; esac else datapackaging= @@ -3913,16 +3901,8 @@ thedatadir=`eval echo $datadir` thelibdir=`test "x$exec_prefix" = xNONE && exec_prefix="$prefix"; eval echo $libdir` -case $datapackaging in - common) - pkgicudatadir=$datadir - thepkgicudatadir=$thedatadir - ;; - *) - pkgicudatadir=$libdir - thepkgicudatadir=$thelibdir - ;; -esac +pkgicudatadir=$datadir +thepkgicudatadir=$thedatadir @@ -3977,7 +3957,7 @@ esac echo $ac_n "checking for a library suffix to use""... $ac_c" 1>&6 -echo "configure:3981: checking for a library suffix to use" >&5 +echo "configure:3961: checking for a library suffix to use" >&5 # Check whether --with-library-suffix or --without-library-suffix was given. if test "${with_library_suffix+set}" = set; then withval="$with_library_suffix" @@ -4015,13 +3995,10 @@ else fi - if test "$tests" = true; then TESTS_TRUE= - TESTS_FALSE='#' else TESTS_TRUE='#' - TESTS_FALSE= fi # Check whether --enable-samples or --disable-samples was given. @@ -4037,13 +4014,10 @@ else fi - if test "$samples" = true; then SAMPLES_TRUE= - SAMPLES_FALSE='#' else SAMPLES_TRUE='#' - SAMPLES_FALSE= fi ICUDATA_CHAR=$U_ENDIAN_CHAR @@ -4052,8 +4026,8 @@ case "${host}" in *-*-solaris*) platform=U_SOLARIS ;; *-*-linux*) platform=U_LINUX ;; *-*-*bsd*) platform=U_BSD ;; - *-*-aix*) platform=AIX ;; - *-*-hpux*) platform=HPUX ;; + *-*-aix*) platform=U_AIX ;; + *-*-hpux*) platform=U_HPUX ;; *-apple-darwin*|*-apple-rhapsody*) platform=U_DARWIN ;; *-*-cygwin*|*-*-mingw*) platform=U_CYGWIN ;; *-*ibm-openedition*|*-*-os390*) platform=OS390 @@ -4062,7 +4036,9 @@ case "${host}" in ICUDATA_CHAR="e" ;; *-*-nto*) platform=U_QNX ;; *-dec-osf*) platform=U_OSF ;; - *-*-irix*) platform=IRIX ;; + *-*-beos) platform=U_BEOS ;; + *-*-irix*) platform=U_IRIX ;; + *-ncr-*) platform=U_MPRAS ;; *-sequent-*) platform=PTX ;; *) platform=U_UNKNOWN_PLATFORM ;; esac @@ -4089,7 +4065,7 @@ esac case "${host}" in *-*-hpux*) - if test "$ac_cv_prog_gcc" != yes; then + if test "${icu_cv_host_frag}" = "mh-hpux-cc"; then for file in samples/date/date \ samples/cal/cal test/cintltst/cintltst \ tools/makeconv/makeconv tools/genrb/genrb \ @@ -4098,7 +4074,8 @@ case "${host}" in tools/gencnval/gencnval tools/gennorm/gennorm \ tools/gennames/gennames tools/gentest/gentest \ tools/pkgdata/pkgdata tools/genprops/genprops \ - tools/genidna/genidna + tools/gencase/gencase \ + tools/gensprep/gensprep do if test -f $file.c; then mv $file.c $file.cpp @@ -4125,10 +4102,6 @@ fi -if test $hpuxcma = true; then - CPPFLAGS="${CPPFLAGS} -D_PTHREADS_DRAFT4 -DHPUX_CMA" -fi - if test $ICU_USE_THREADS -ne 0 then @@ -4137,15 +4110,6 @@ then CXXFLAGS="$CXXFLAGS \$(THREADSCXXFLAGS)" fi -if test "$ac_cv_lib_dld_shl_load" = "yes"; then - CPPFLAGS="${CPPFLAGS} -DICU_USE_SHL_LOAD" -fi - - -if test "$ac_cv_func_dllload" = "yes"; then - CPPFLAGS="${CPPFLAGS} -DICU_USE_SHL_LOAD" -fi - trap '' 1 2 15 cat > confcache <<\EOF # This file is a shell script that caches the results of configure @@ -4247,36 +4211,47 @@ done ac_given_srcdir=$srcdir ac_given_INSTALL="$INSTALL" -trap 'rm -fr `echo "README icudefs.mk \ +trap 'rm -fr `echo "icudefs.mk \ Makefile \ - data/Makefile data/icupkg.inc \ - common/Makefile config/Makefile.inc i18n/Makefile \ + data/icupkg.inc \ + config/Makefile.inc \ + data/Makefile \ + stubdata/Makefile \ + common/Makefile \ + i18n/Makefile \ layout/Makefile \ layoutex/Makefile \ - extra/Makefile extra/ustdio/Makefile \ - extra/uconv/Makefile extra/scrptrun/Makefile - stubdata/Makefile \ - tools/Makefile tools/ctestfw/Makefile tools/makeconv/Makefile \ - tools/genrb/Makefile \ - tools/genuca/Makefile \ - tools/pkgdata/Makefile \ - tools/genccode/Makefile tools/gencmn/Makefile \ - tools/gencnval/Makefile tools/gentz/Makefile \ - tools/gennames/Makefile tools/toolutil/Makefile \ + io/Makefile \ + extra/Makefile \ + extra/uconv/Makefile extra/scrptrun/Makefile \ + tools/Makefile tools/ctestfw/Makefile \ + tools/makeconv/Makefile \ + tools/genrb/Makefile \ + tools/genuca/Makefile \ + tools/genccode/Makefile \ + tools/gencmn/Makefile \ + tools/gencnval/Makefile \ + tools/gennames/Makefile \ tools/gentest/Makefile \ tools/gennorm/Makefile \ tools/genprops/Makefile \ + tools/gencase/Makefile \ tools/genpname/Makefile \ tools/genbrk/Makefile \ - tools/genidna/Makefile \ + tools/gensprep/Makefile \ + tools/icuswap/Makefile \ + tools/pkgdata/Makefile \ + tools/toolutil/Makefile \ tools/dumpce/Makefile \ - test/Makefile test/testdata/Makefile \ + test/Makefile \ + test/testdata/Makefile \ + test/testdata/pkgdata.inc \ + test/hdrtst/Makefile \ test/intltest/Makefile \ test/cintltst/Makefile \ test/iotest/Makefile \ - test/ieeetest/Makefile \ - test/testmap/Makefile \ test/thaitest/Makefile \ + test/testmap/Makefile \ test/letest/Makefile \ test/threadtest/Makefile \ samples/Makefile samples/date/Makefile \ @@ -4323,7 +4298,6 @@ s%@CXX@%$CXX%g s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g s%@INSTALL_DATA@%$INSTALL_DATA%g -s%@AUTOCONF@%$AUTOCONF%g s%@STRIP@%$STRIP%g s%@U_MAKE@%$U_MAKE%g s%@DOXYGEN@%$DOXYGEN%g @@ -4336,19 +4310,20 @@ s%@EXEEXT@%$EXEEXT%g s%@ARFLAGS@%$ARFLAGS%g s%@COMPILE_LINK_ENVVAR@%$COMPILE_LINK_ENVVAR%g s%@LIB_M@%$LIB_M%g -s%@HPUX_CMA_TRUE@%$HPUX_CMA_TRUE%g -s%@HPUX_CMA_FALSE@%$HPUX_CMA_FALSE%g s%@ENABLE_SHARED@%$ENABLE_SHARED%g s%@ENABLE_STATIC@%$ENABLE_STATIC%g +s%@ENABLE_DEBUG@%$ENABLE_DEBUG%g +s%@ENABLE_RELEASE@%$ENABLE_RELEASE%g s%@RANLIB@%$RANLIB%g s%@AR@%$AR%g s%@U_DISABLE_RENAMING@%$U_DISABLE_RENAMING%g +s%@U_ENABLE_TRACING@%$U_ENABLE_TRACING%g s%@ENABLE_RPATH@%$ENABLE_RPATH%g s%@U_INLINE@%$U_INLINE%g s%@THREADS_TRUE@%$THREADS_TRUE%g -s%@THREADS_FALSE@%$THREADS_FALSE%g s%@ICU_USE_THREADS@%$ICU_USE_THREADS%g s%@HAVE_MMAP@%$HAVE_MMAP%g +s%@GENCCODE_ASSEMBLY@%$GENCCODE_ASSEMBLY%g s%@CPP@%$CPP%g s%@U_HAVE_INTTYPES_H@%$U_HAVE_INTTYPES_H%g s%@CXXCPP@%$CXXCPP%g @@ -4361,7 +4336,9 @@ s%@U_HAVE_NAMESPACE@%$U_HAVE_NAMESPACE%g s%@U_OVERRIDE_CXX_ALLOCATION@%$U_OVERRIDE_CXX_ALLOCATION%g s%@U_HAVE_PLACEMENT_NEW@%$U_HAVE_PLACEMENT_NEW%g s%@U_HAVE_POPEN@%$U_HAVE_POPEN%g +s%@U_HAVE_TZSET@%$U_HAVE_TZSET%g s%@U_TZSET@%$U_TZSET%g +s%@U_HAVE_TZNAME@%$U_HAVE_TZNAME%g s%@U_TZNAME@%$U_TZNAME%g s%@U_HAVE_TIMEZONE@%$U_HAVE_TIMEZONE%g s%@U_TIMEZONE@%$U_TIMEZONE%g @@ -4376,14 +4353,9 @@ s%@HAVE_UINT64_T@%$HAVE_UINT64_T%g s%@U_HAVE_WCHAR_H@%$U_HAVE_WCHAR_H%g s%@U_HAVE_WCSCPY@%$U_HAVE_WCSCPY%g s%@U_SIZEOF_WCHAR_T@%$U_SIZEOF_WCHAR_T%g -s%@ECHO_N@%$ECHO_N%g -s%@ECHO_C@%$ECHO_C%g s%@EXTRAS_TRUE@%$EXTRAS_TRUE%g -s%@EXTRAS_FALSE@%$EXTRAS_FALSE%g -s%@USTDIO_TRUE@%$USTDIO_TRUE%g -s%@USTDIO_FALSE@%$USTDIO_FALSE%g +s%@ICUIO_TRUE@%$ICUIO_TRUE%g s%@LAYOUT_TRUE@%$LAYOUT_TRUE%g -s%@LAYOUT_FALSE@%$LAYOUT_FALSE%g s%@thesysconfdir@%$thesysconfdir%g s%@thedatadir@%$thedatadir%g s%@thelibdir@%$thelibdir%g @@ -4395,9 +4367,7 @@ s%@ICULIBSUFFIX@%$ICULIBSUFFIX%g s%@U_HAVE_LIB_SUFFIX@%$U_HAVE_LIB_SUFFIX%g s%@ICULIBSUFFIXCNAME@%$ICULIBSUFFIXCNAME%g s%@TESTS_TRUE@%$TESTS_TRUE%g -s%@TESTS_FALSE@%$TESTS_FALSE%g s%@SAMPLES_TRUE@%$SAMPLES_TRUE%g -s%@SAMPLES_FALSE@%$SAMPLES_FALSE%g s%@ICUDATA_CHAR@%$ICUDATA_CHAR%g s%@platform@%$platform%g s%@platform_make_fragment_name@%$platform_make_fragment_name%g @@ -4445,34 +4415,45 @@ EOF cat >> $CONFIG_STATUS <=11) [default=no]], - [case "${enableval}" in - yes) hpuxcma=true;; - no) hpuxcma=false;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-hpuxcma) ;; - esac], - ) -fi - -dnl Note, we set the conditional outside of IF for non hpux plats -ICU_CONDITIONAL(HPUX_CMA, test "$hpuxcma" = true) - -dnl Should this be a nested CASE? -if test $hpuxcma = true; then - case "${host}" in - *-*-hpux*) hpuxcma=true ;; - *) AC_MSG_ERROR(--enable-hpuxcma is not valid on this platform ${host}) ;; - esac -fi - dnl Check whether to build shared libraries AC_MSG_CHECKING([whether to build shared libraries]) enabled=no AC_ARG_ENABLE(shared, - [ --enable-shared[=PKGS] build shared libraries [default=yes]], + [ --enable-shared build shared libraries [default=yes]], [ case "${enableval}" in yes|"") enabled=yes; ENABLE_SHARED=YES ;; no);; @@ -136,7 +107,7 @@ dnl Check whether to build static libraries AC_MSG_CHECKING([whether to build static libraries]) enabled=no AC_ARG_ENABLE(static, - [ --enable-static[=PKGS] build static libraries [default=no]], + [ --enable-static build static libraries [default=no]], [ case "${enableval}" in yes|"") enabled=yes; ENABLE_STATIC=YES ;; no) ;; @@ -146,6 +117,34 @@ AC_ARG_ENABLE(static, AC_MSG_RESULT($enabled) AC_SUBST(ENABLE_STATIC) +dnl Check whether to build debug libraries +AC_MSG_CHECKING([whether to build debug libraries]) +enabled=no +ENABLE_DEBUG=0 +AC_ARG_ENABLE(debug, + [ --enable-debug build debug libraries [default=no]], + [ case "${enableval}" in + yes|"") enabled=yes; ENABLE_DEBUG=1 ;; + *) ;; + esac], +) +AC_MSG_RESULT($enabled) +AC_SUBST(ENABLE_DEBUG) + +dnl Check whether to build release libraries +AC_MSG_CHECKING([whether to build release libraries]) +enabled=yes +ENABLE_RELEASE=1 +AC_ARG_ENABLE(release, + [ --enable-release build release libraries [default=yes]], + [ case "${enableval}" in + no) enabled=no; ENABLE_RELEASE=0 ;; + *) ;; + esac], +) +AC_MSG_RESULT($enabled) +AC_SUBST(ENABLE_RELEASE) + AC_PROG_RANLIB AC_PATH_PROG(AR,ar,[echo archiver ar not found re-run configure ; false],$PATH:/bin:/usr/bin:/usr/ccs/bin) @@ -163,6 +162,20 @@ AC_ARG_ENABLE(renaming, AC_MSG_RESULT($enabled) AC_SUBST(U_DISABLE_RENAMING) +AC_MSG_CHECKING([whether to enable function and data tracing]) +enabled=yes +U_ENABLE_TRACING=1 +AC_ARG_ENABLE(tracing, + [ --enable-tracing enable function and data tracing [default=yes]], + [ case "${enableval}" in + yes|"") enabled=yes ;; + no) enabled=no; U_ENABLE_TRACING=0 ;; + *) ;; + esac], +) +AC_MSG_RESULT($enabled) +AC_SUBST(U_ENABLE_TRACING) + dnl Check whether to use the evil rpath or not AC_ARG_ENABLE(rpath, [ --enable-rpath use rpath when linking [default is only if necessary]], @@ -182,7 +195,7 @@ dnl AC_CACHE_CHECK([for definition of U_INLINE for C], ac_cv_c_inline, [ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do - AC_TRY_COMPILE(, [} $ac_kw foo() {], [ac_cv_c_inline=$ac_kw; break]) + AC_TRY_COMPILE(, [return 0;} $ac_kw int foo() {], [ac_cv_c_inline=$ac_kw; break]) done ]) case "$ac_cv_c_inline" in @@ -196,7 +209,7 @@ threads=true dnl Enable/disable threads AC_ARG_ENABLE(threads, - [ --enable-threads build ICU with threads [default=yes]], + [ --enable-threads build ICU with thread safety [default=yes]], [case "${enableval}" in yes) threads=true ;; no) threads=false ;; @@ -208,14 +221,6 @@ ICU_CONDITIONAL(THREADS, test "$threads" = true) ICU_USE_THREADS=0 if test $threads = true; then - dnl Test for HPUX cma threads first.. - if test $hpuxcma = true; then - dnl HPUX cma case - AC_CHECK_LIB(cma, pthread_create) - if test $ac_cv_lib_cma_pthread_create = yes; then - ICU_USE_THREADS=1 - fi - else dnl For Compaq Tru64 (OSF1), we must look for pthread_attr_init dnl and must do this before seaching for pthread_mutex_destroy, or dnl we will pick up libpthreads.so not libpthread.so @@ -229,11 +234,10 @@ if test $threads = true; then dnl Locate the right library for POSIX threads. We look for the dnl symbols in the libraries first, because on Solaris libc provides dnl pthread_create but libpthread has the real code :( - dnl AIX uses libpthreads instead of libpthread, and HP/UX uses libcma - dnl (but that was checked above). + dnl AIX uses libpthreads instead of libpthread, and HP/UX uses libpthread dnl FreeBSD users may need libpthread if they do not have libc_r. - AC_SEARCH_LIBS_FIRST(pthread_mutex_destroy, pthread pthreads c_r cma) + AC_SEARCH_LIBS_FIRST(pthread_mutex_destroy, pthread pthreads c_r ) if test "$ac_cv_search_pthread_mutex_destroy" != no; then ICU_USE_THREADS=1 @@ -250,8 +254,27 @@ if test $threads = true; then if test $ac_cv_func_pthread_mutex_lock = yes; then ICU_USE_THREADS=1 fi + dnl Check to see if we are using CygWin with MSVC + case "${host}" in + *-pc-cygwin*|*-pc-mingw*) + if test "$ac_cv_prog_gcc" = no; then + dnl We're using normal windows compilers. Threading is available. + ICU_USE_THREADS=1 + fi ;; + *-*-hpux*) + dnl Add -mt because it does several nice things on newer compilers. + case "${icu_cv_host_frag}" in + mh-hpux-acc) + OLD_CXXFLAGS="${CXXFLAGS}" + CXXFLAGS="${CXXFLAGS} -mt" + if test x"`${CXX} ${CXXFLAGS} 2>&1`" != x""; then + CXXFLAGS="${OLD_CXXFLAGS}" + fi + ;; + esac + ;; + esac fi - fi fi AC_SUBST(ICU_USE_THREADS) @@ -282,6 +305,18 @@ then fi AC_SUBST(HAVE_MMAP) +dnl Check to see if genccode can generate simple assembly. +GENCCODE_ASSEMBLY= +case "${host}" in +i*86-*-*bsd*|i*86-*-linux*|x86_64-*-linux*|powerpc*-*-linux*) + if test "$GCC" = yes; then + dnl We're using gcc, and the simple -a gcc command line works for genccode + GENCCODE_ASSEMBLY="-a gcc" + fi ;; +esac +AC_SUBST(GENCCODE_ASSEMBLY) + + dnl Checks for header files AC_CHECK_HEADERS(inttypes.h) if test $ac_cv_header_inttypes_h = no; then @@ -314,14 +349,28 @@ if test x$streams != xnone then AC_LANG_SAVE AC_LANG_CPLUSPLUS + OLD_CXXFLAGS="${CXXFLAGS}" + case "${icu_cv_host_frag}" in + mh-hpux-acc) + CXXFLAGS="${CXXFLAGS} -AA" + ;; + esac AC_MSG_CHECKING([iostream usability]) AC_TRY_COMPILE([#include ],[], [ac_cv_header_iostream=yes],[ac_cv_header_iostream=no]) + if test $icu_cv_host_frag = mh-cygwin-msvc + then + dnl is always there on Windows. + dnl We do this to prevent the C++ preprocessor from being used because + dnl autoconf can't deal with the Windows C++ preprocessor + ac_cv_header_iostream=yes + fi AC_MSG_RESULT($ac_cv_header_iostream) if test $ac_cv_header_iostream = yes then U_IOSTREAM_SOURCE=199711 else + CXXFLAGS="${OLD_CXXFLAGS}" AC_CHECK_HEADER(iostream.h) if test $ac_cv_header_iostream_h = yes; then AC_MSG_CHECKING([whether ostream is really defined]) @@ -339,6 +388,13 @@ then if test $U_IOSTREAM_SOURCE -ge $streams then U_IOSTREAM_SOURCE=$streams + case "${icu_cv_host_frag}" in + mh-hpux-acc) + if test $U_IOSTREAM_SOURCE -lt 199711; then + CXXFLAGS=${OLD_CXXFLAGS} + fi + ;; + esac else AC_MSG_ERROR(${withval} iostream is not available) fi @@ -406,7 +462,8 @@ AC_CACHE_VAL(ac_cv_override_cxx_allocation_ok, [AC_TRY_LINK( changequote(<<, >>)dnl <<#include - class UObject { + class UMemory { + public: void *operator new(size_t size) {return malloc(size);} void *operator new[](size_t size) {return malloc(size);} void operator delete(void *p) {free(p);} @@ -424,7 +481,8 @@ then [AC_TRY_LINK( changequote(<<, >>)dnl <<#include - class UObject { + class UMemory { + public: void *operator new(size_t size) {return malloc(size);} void *operator new[](size_t size) {return malloc(size);} void operator delete(void *p) {free(p);} @@ -455,23 +513,30 @@ fi AC_SUBST(U_HAVE_POPEN) AC_CHECK_FUNC(tzset) +U_HAVE_TZSET=0 if test x$ac_cv_func_tzset = xyes then U_TZSET=tzset + U_HAVE_TZSET=1 else AC_CHECK_FUNC(_tzset) if test x$ac_cv_func__tzset = xyes then - U_TZSET=_tzset + U_TZSET=_tzset + U_HAVE_TZSET=1 fi fi +AC_SUBST(U_HAVE_TZSET) AC_SUBST(U_TZSET) + +U_HAVE_TZNAME=0 AC_CACHE_CHECK(for tzname,ac_cv_var_tzname, [AC_TRY_LINK( changequote(<<, >>)dnl <<#ifndef __USE_POSIX #define __USE_POSIX #endif +#include #include #ifndef tzname /* For SGI. */ extern char *tzname[]; /* RS6000 and others reject char **tzname. */ @@ -480,19 +545,23 @@ changequote([, ])dnl [atoi(*tzname);], ac_cv_var_tzname=yes, ac_cv_var_tzname=no)]) if test $ac_cv_var_tzname = yes; then U_TZNAME=tzname + U_HAVE_TZNAME=1 else AC_CACHE_CHECK(for _tzname,ac_cv_var__tzname, [AC_TRY_LINK( changequote(<<, >>)dnl - <<#include + <<#include + #include extern char *_tzname[]; >>, changequote([, ])dnl [atoi(*_tzname);], ac_cv_var__tzname=yes, ac_cv_var__tzname=no)]) if test $ac_cv_var__tzname = yes; then U_TZNAME=_tzname + U_HAVE_TZNAME=1 fi fi +AC_SUBST(U_HAVE_TZNAME) AC_SUBST(U_TZNAME) AC_CACHE_CHECK(for timezone,ac_cv_var_timezone, @@ -646,11 +715,11 @@ if test $U_SIZEOF_WCHAR_T = 0; then fi AC_SUBST(U_SIZEOF_WCHAR_T) -dnl Echo -ECHO_N=$ac_n -ECHO_C=$ac_c -AC_SUBST(ECHO_N) -AC_SUBST(ECHO_C) +#dnl Echo +#ECHO_N=$ac_n +#ECHO_C=$ac_c +#AC_SUBST(ECHO_N) +#AC_SUBST(ECHO_C) dnl Enable/disable extras AC_ARG_ENABLE(extras, @@ -663,14 +732,14 @@ AC_ARG_ENABLE(extras, extras=true) ICU_CONDITIONAL(EXTRAS, test "$extras" = true) AC_ARG_ENABLE(extras, - [ --enable-ustdio build ICU's ustdio library [default=yes]], + [ --enable-icuio build ICU's icuio library [default=yes]], [case "${enableval}" in - yes) ustdio=true ;; - no) ustdio=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-ustdio) ;; + yes) icuio=true ;; + no) icuio=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-icuio) ;; esac], - ustdio=true) -ICU_CONDITIONAL(USTDIO, test "$ustdio" = true) + icuio=true) +ICU_CONDITIONAL(ICUIO, test "$icuio" = true) dnl Enable/disable layout AC_ARG_ENABLE(layout, @@ -690,26 +759,21 @@ AC_ARG_WITH(data-packaging, auto) datapackaging=$withval ;; common) datapackaging=archive ;; dll) datapackaging=library ;; - *) AC_MSG_ERROR(bad value ${withval} for --with-iostream) ;; + static) datapackaging=static ;; + *) AC_MSG_ERROR(bad value ${withval} for --with-data-packaging) ;; esac], [datapackaging=]) +dnl Note: 'thesysconfdir' is an evaluated version, for Man pages, so also for thedatadir, thelibdir, etc.. thesysconfdir=`eval echo $sysconfdir` AC_SUBST(thesysconfdir) thedatadir=`eval echo $datadir` AC_SUBST(thedatadir) thelibdir=`test "x$exec_prefix" = xNONE && exec_prefix="$prefix"; eval echo $libdir` AC_SUBST(thelibdir) -case $datapackaging in - common) - pkgicudatadir=$datadir - thepkgicudatadir=$thedatadir - ;; - *) - pkgicudatadir=$libdir - thepkgicudatadir=$thelibdir - ;; -esac +dnl Always put raw data files in share/icu/{version}, etc. Never use lib/icu/{version} for data files.. Actual shared libraries will go in {libdir}. +pkgicudatadir=$datadir +thepkgicudatadir=$thedatadir AC_SUBST(pkgicudatadir) AC_SUBST(thepkgicudatadir) @@ -815,8 +879,8 @@ case "${host}" in *-*-solaris*) platform=U_SOLARIS ;; *-*-linux*) platform=U_LINUX ;; *-*-*bsd*) platform=U_BSD ;; - *-*-aix*) platform=AIX ;; - *-*-hpux*) platform=HPUX ;; + *-*-aix*) platform=U_AIX ;; + *-*-hpux*) platform=U_HPUX ;; *-apple-darwin*|*-apple-rhapsody*) platform=U_DARWIN ;; *-*-cygwin*|*-*-mingw*) platform=U_CYGWIN ;; *-*ibm-openedition*|*-*-os390*) platform=OS390 @@ -825,7 +889,9 @@ case "${host}" in ICUDATA_CHAR="e" ;; *-*-nto*) platform=U_QNX ;; *-dec-osf*) platform=U_OSF ;; - *-*-irix*) platform=IRIX ;; + *-*-beos) platform=U_BEOS ;; + *-*-irix*) platform=U_IRIX ;; + *-ncr-*) platform=U_MPRAS ;; *-sequent-*) platform=PTX ;; *) platform=U_UNKNOWN_PLATFORM ;; esac @@ -856,7 +922,7 @@ dnl static constructors in C++ libs. Hack around that here dnl by renaming some .c files to .cpp case "${host}" in *-*-hpux*) - if test "$ac_cv_prog_gcc" != yes; then + if test "${icu_cv_host_frag}" = "mh-hpux-cc"; then for file in samples/date/date \ samples/cal/cal test/cintltst/cintltst \ tools/makeconv/makeconv tools/genrb/genrb \ @@ -865,7 +931,8 @@ case "${host}" in tools/gencnval/gencnval tools/gennorm/gennorm \ tools/gennames/gennames tools/gentest/gentest \ tools/pkgdata/pkgdata tools/genprops/genprops \ - tools/genidna/genidna + tools/gencase/gencase \ + tools/gensprep/gensprep do if test -f $file.c; then mv $file.c $file.cpp @@ -892,12 +959,6 @@ fi AC_SUBST(AIX_SHLIB) -dnl SPECIAL handling for HPUX 10 and also '11 & --enable-hpuxcma=true' -if test $hpuxcma = true; then - CPPFLAGS="${CPPFLAGS} -D_PTHREADS_DRAFT4 -DHPUX_CMA" -fi -dnl END special - dnl Now that we're done using CPPFLAGS etc. for tests, we can change it dnl for build. @@ -908,45 +969,46 @@ then CXXFLAGS="$CXXFLAGS \$(THREADSCXXFLAGS)" fi -if test "$ac_cv_lib_dld_shl_load" = "yes"; then - CPPFLAGS="${CPPFLAGS} -DICU_USE_SHL_LOAD" -fi - -dnl added for s/390 DLL loading detection - -if test "$ac_cv_func_dllload" = "yes"; then - CPPFLAGS="${CPPFLAGS} -DICU_USE_SHL_LOAD" -fi - dnl output the Makefiles -AC_OUTPUT([README icudefs.mk \ +AC_OUTPUT([icudefs.mk \ Makefile \ - data/Makefile data/icupkg.inc \ - common/Makefile config/Makefile.inc i18n/Makefile \ + data/icupkg.inc \ + config/Makefile.inc \ + data/Makefile \ + stubdata/Makefile \ + common/Makefile \ + i18n/Makefile \ layout/Makefile \ layoutex/Makefile \ - extra/Makefile extra/ustdio/Makefile \ - extra/uconv/Makefile extra/scrptrun/Makefile - stubdata/Makefile \ - tools/Makefile tools/ctestfw/Makefile tools/makeconv/Makefile \ - tools/genrb/Makefile \ - tools/genuca/Makefile \ - tools/pkgdata/Makefile \ - tools/genccode/Makefile tools/gencmn/Makefile \ - tools/gencnval/Makefile tools/gentz/Makefile \ - tools/gennames/Makefile tools/toolutil/Makefile \ + io/Makefile \ + extra/Makefile \ + extra/uconv/Makefile extra/scrptrun/Makefile \ + tools/Makefile tools/ctestfw/Makefile \ + tools/makeconv/Makefile \ + tools/genrb/Makefile \ + tools/genuca/Makefile \ + tools/genccode/Makefile \ + tools/gencmn/Makefile \ + tools/gencnval/Makefile \ + tools/gennames/Makefile \ tools/gentest/Makefile \ tools/gennorm/Makefile \ tools/genprops/Makefile \ + tools/gencase/Makefile \ tools/genpname/Makefile \ tools/genbrk/Makefile \ - tools/genidna/Makefile \ + tools/gensprep/Makefile \ + tools/icuswap/Makefile \ + tools/pkgdata/Makefile \ + tools/toolutil/Makefile \ tools/dumpce/Makefile \ - test/Makefile test/testdata/Makefile \ + test/Makefile \ + test/testdata/Makefile \ + test/testdata/pkgdata.inc \ + test/hdrtst/Makefile \ test/intltest/Makefile \ test/cintltst/Makefile \ test/iotest/Makefile \ - test/ieeetest/Makefile \ test/thaitest/Makefile \ test/testmap/Makefile \ test/letest/Makefile \ diff --git a/icuSources/data/Makefile.in b/icuSources/data/Makefile.in index 684e4f85..461e37d8 100644 --- a/icuSources/data/Makefile.in +++ b/icuSources/data/Makefile.in @@ -1,5 +1,5 @@ ## Makefile.in for ICU data -## Copyright (c) 1999-2003, International Business Machines Corporation and +## Copyright (c) 1999-2004, International Business Machines Corporation and ## others. All Rights Reserved. ## Source directory information @@ -17,38 +17,68 @@ include $(top_builddir)/icudefs.mk subdir = data #lib icu data for link -LIB_ICUDATA_NAME=lib$(ICUDATA_NAME) +LIB_ICUDATA_NAME=$(LIBICU)$(DATA_STUBNAME)$(ICULIBSUFFIX) +LIB_STATIC_ICUDATA_NAME=$(LIBSICU)$(DATA_STUBNAME)$(ICULIBSUFFIX) -# sanity! -ICUDT=$(ICUDATA_PLATFORM_NAME)_ +# Allow Windows to override these options +ifeq ($(PKGDATA_OPTS),) +PKGDATA_OPTS = -O $(top_builddir)/data/icupkg.inc +endif +ifeq ($(PKGDATA_VERSIONING),) +PKGDATA_VERSIONING = -r $(SO_TARGET_VERSION) +endif + +# This allows all the data to be in one directory +ifeq ($(PKGDATA_MODE),dll) +ICUPKGDATA_OUTDIR = $(LIBDIR) +else +ICUPKGDATA_OUTDIR = $(OUTDIR) +endif top_builddir_from_tmp = $(patsubst ..%,../..%,$(top_builddir)) -CURDIR=$(shell pwd) -PKGDATA = $(top_builddir)/tools/pkgdata/pkgdata -O $(top_builddir)/data/icupkg.inc -d $(CURDIR)/out -PKGDATA_VERSIONING = -r $(SO_TARGET_VERSION) +CURDIR:=$(CURR_FULL_DIR) +PKGDATA = $(BINDIR)/pkgdata $(PKGDATA_OPTS) -q -c -s $(CURDIR)/out/build/$(ICUDATA_PLATFORM_NAME) -d $(ICUPKGDATA_OUTDIR) + # OBJDATADIR must be a short path (with ..'s) to the data. +ifeq ($(top_srcdir),..) +SRCDATADIR=. +else SRCDATADIR=$(top_srcdir)/data +endif +ifeq ($(top_builddir),..) +OUTDIR=./out +else OUTDIR=$(top_builddir)/data/out -BUILDDIR=$(OUTDIR)/build +endif + +OUTTMPDIR=$(OUTDIR)/tmp +BUILDDIR=$(OUTDIR)/build/$(ICUDATA_PLATFORM_NAME) UNICODEDATADIR=$(SRCDATADIR)/unidata LOCSRCDIR=$(SRCDATADIR)/locales -TRNSSRCDIR=$(SRCDATADIR)/translit +COLSRCDIR=$(SRCDATADIR)/coll +COLBLDDIR=$(BUILDDIR)/coll +RBNFSRCDIR=$(SRCDATADIR)/rbnf +RBNFBLDDIR=$(BUILDDIR)/rbnf +TRANSLITSRCDIR=$(SRCDATADIR)/translit +TRANSLITBLDDIR=$(BUILDDIR)/translit +MISCSRCDIR=$(SRCDATADIR)/misc BRKSRCDIR=$(SRCDATADIR)/brkitr MISCSRCDIR=$(SRCDATADIR)/misc UCMSRCDIR=$(SRCDATADIR)/mappings COMINCDIR=$(top_srcdir)/common/unicode SRCLISTDEPS=Makefile $(srcdir)/Makefile.in +BUILD_DIRS=$(OUTDIR) $(BUILDDIR) $(COLBLDDIR) $(RBNFBLDDIR) $(TRANSLITBLDDIR) $(TESTOUTDIR) $(TESTBUILDDIR) $(OUTTMPDIR) $(OUTTMPDIR_390STUB) $(OUTTMPDIR)/$(COLLATION_TREE) $(OUTTMPDIR)/$(RBNF_TREE) $(OUTTMPDIR)/$(TRANSLIT_TREE) # relative lib links from pkgdata are the same as for tmp TOOLDIR=$(top_builddir)/tools ## List of phony targets -.PHONY : all all-local all-recursive install install-local install-files install-dlls build-cmnfile build-dll \ +.PHONY : all all-local all-recursive install install-local install-files \ install-recursive clean clean-local clean-recursive distclean \ distclean-local distclean-recursive dist dist-local dist-recursive \ -check check-local check-recursive build-testdlls build-basetestdata build-local +check check-local check-recursive build-local clean-resindex build-dir ## Clear suffix list .SUFFIXES : @@ -70,10 +100,11 @@ OS390PKG=package390 OS390INSTALL=install390 # Additional data for 390 -OS390LIST=$(BUILDDIR)/icudata390.lst +OS390LIST=$(OUTTMPDIR)/icudata390.lst +OUTTMPDIR_390STUB=$(top_builddir)/data/out/tmp_390stub endif -all-local: icupkg.inc build-local packagedata testdata packagetest $(OS390PKG) +all-local: build-dir icupkg.inc build-local packagedata $(POST_DATA_BUILD) $(OS390PKG) dist-local: @@ -81,101 +112,149 @@ clean-map: -test -z *.map || $(RMV) *.map clean-local: cleanpackage cleanfiles clean-map - $(RMV) $(TESTOUTDIR)/testdata.dat cleanfiles: test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES) cleanpackage: $(RMV) $(OUTDIR) - $(RMV) $(TESTOUTDIR) - + $(RMV) $(LIBDIR)/$(LIB_ICUDATA_NAME)*.$(SO)* $(LIBDIR)/$(LIB_STATIC_ICUDATA_NAME).$(A) check-local: # During this INVOKE we only want to use stubdata. # We don't want to try to write over files that we are using. -PKGDATA_INVOKE:=$(subst :$(top_builddir)/data/out,,$(INVOKE)) +PKGDATA_INVOKE:=$(subst $(LIBDIR):$(top_builddir)/stubdata,$(top_builddir)/stubdata:$(LIBDIR),$(INVOKE)) $(PKGDATA_INVOKE_OPTS) -packagedata: icupkg.inc $(BUILDDIR)/icudata.lst - $(PKGDATA_INVOKE) $(PKGDATA) -e $(ICUDATA_ENTRY_POINT) -T $(BUILDDIR) -p $(ICUDATA_NAME) -m $(PKGDATA_MODE) $(PKGDATA_VERSIONING) $(BUILDDIR)/icudata.lst +packagedata: icupkg.inc $(OUTTMPDIR)/icudata.lst build-local ifneq ($(ENABLE_STATIC),) - $(PKGDATA_INVOKE) $(PKGDATA) -e $(ICUDATA_ENTRY_POINT) -T $(BUILDDIR) -p $(ICUDATA_NAME) -m static $(BUILDDIR)/icudata.lst + $(PKGDATA_INVOKE) $(PKGDATA) -e $(ICUDATA_ENTRY_POINT) -T $(OUTTMPDIR) -p $(ICUDATA_NAME) $(PKGDATA_LIBSTATICNAME) -m static $(OUTTMPDIR)/icudata.lst endif + $(PKGDATA_INVOKE) $(PKGDATA) -e $(ICUDATA_ENTRY_POINT) -T $(OUTTMPDIR) -p $(ICUDATA_NAME) -m $(PKGDATA_MODE) $(PKGDATA_VERSIONING) $(PKGDATA_LIBNAME) $(OUTTMPDIR)/icudata.lst ## Install ICU data. -install-local: $(BUILDDIR)/icudata.lst ./icupkg.inc install-convrtrstxt $(OS390INSTALL) +install-local: $(OUTTMPDIR)/icudata.lst ./icupkg.inc packagedata $(OS390INSTALL) $(MKINSTALLDIRS) $(TMPDATADIR) $(DESTDIR)$(ICUPKGDATA_DIR) - $(PKGDATA_INVOKE) $(PKGDATA) -m $(PKGDATA_MODE) $(PKGDATA_VERSIONING) -e $(ICUDATA_ENTRY_POINT) -T $(BUILDDIR) -s $(BUILDDIR) -p $(ICUDATA_NAME) $(BUILDDIR)/icudata.lst -I $(DESTDIR)$(ICUPKGDATA_DIR) ifneq ($(ENABLE_STATIC),) - $(PKGDATA_INVOKE) $(PKGDATA) -m static -e $(ICUDATA_ENTRY_POINT) -T $(BUILDDIR) -s $(BUILDDIR) -p $(ICUDATA_NAME) $(BUILDDIR)/icudata.lst -I $(DESTDIR)$(ICUPKGDATA_DIR) + $(PKGDATA_INVOKE) $(PKGDATA) -m static -e $(ICUDATA_ENTRY_POINT) -T $(OUTTMPDIR) -s $(BUILDDIR) -p $(ICUDATA_NAME) $(PKGDATA_LIBSTATICNAME) $(OUTTMPDIR)/icudata.lst -I $(ICUPKGDATA_INSTALL_LIBDIR) endif + $(PKGDATA_INVOKE) $(PKGDATA) -m $(PKGDATA_MODE) $(PKGDATA_VERSIONING) -e $(ICUDATA_ENTRY_POINT) -T $(OUTTMPDIR) -s $(BUILDDIR) -p $(ICUDATA_NAME) $(PKGDATA_LIBNAME) $(OUTTMPDIR)/icudata.lst -I $(ICUPKGDATA_INSTALL_DIR) -install-convrtrstxt: $(DESTDIR)$(pkgsysconfdir)/convrtrs.txt -$(DESTDIR)$(pkgsysconfdir)/convrtrs.txt: $(UCMSRCDIR)/convrtrs.txt - $(MKINSTALLDIRS) $(DESTDIR)$(pkgsysconfdir) - $(INSTALL_DATA) $< $@ #### #### #### 390 support -install390: $(BUILDDIR)/icudata390.lst ./icupkg.inc +install390: package390 $(MKINSTALLDIRS) $(TMPDATADIR) $(DESTDIR)$(libdir) - $(INVOKE) $(PKGDATA) -s $(BUILDDIR) -T $(BUILDDIR)/tmp3901 -p $(ICUDATA_NAME)$(STUB_SUFFIX) -e $(ICUDATA_ENTRY_POINT) $(BUILDDIR)/icudata390.lst -m dll $(PKGDATA_VERSIONING) -I $(DESTDIR)$(ICUPKGDATA_DIR) + $(INVOKE) $(PKGDATA) -s $(BUILDDIR)$(STUB_SUFFIX) -T $(OUTTMPDIR_390STUB) -p $(ICUDATA_NAME)$(STUB_SUFFIX) $(PKGDATA_LIBNAME)$(STUB_SUFFIX) -e $(ICUDATA_ENTRY_POINT) $(OS390LIST) -m dll $(PKGDATA_VERSIONING) -I $(DESTDIR)$(ICUPKGDATA_DIR) ifeq ($(PKGDATA_MODE),dll) - $(INSTALL-L) $(OUTDIR)/$(LIB_ICUDATA_NAME)$(STUB_SUFFIX)$(IMPORT_LIB_EXT) $(DESTDIR)$(ICUPKGDATA_DIR)/$(LIB_ICUDATA_NAME)$(STUB_SUFFIX)$(IMPORT_LIB_EXT) + $(INSTALL-L) $(ICUPKGDATA_OUTDIR)/$(LIB_ICUDATA_NAME)$(STUB_SUFFIX)$(SO_TARGET_VERSION)$(IMPORT_LIB_EXT) $(DESTDIR)$(ICUPKGDATA_DIR)/$(LIB_ICUDATA_NAME)$(STUB_SUFFIX)$(SO_TARGET_VERSION)$(IMPORT_LIB_EXT) endif -#### $(LIB_ICUDATA_NAME)$(BATCH_SUFFIX) is the subset data for batch mode -package390: $(BUILDDIR)/icudata390.lst $(BUILDDIR)/icudata.lst ./icupkg.inc - @$(MKINSTALLDIRS) $(BUILDDIR)/tmp3901 - $(INVOKE) $(PKGDATA) -s $(BUILDDIR) -T $(BUILDDIR)/tmp3901 -p $(ICUDATA_NAME)$(STUB_SUFFIX) -e $(ICUDATA_ENTRY_POINT) $(BUILDDIR)/icudata390.lst -m dll $(PKGDATA_VERSIONING) - cp $(OUTDIR)/$(LIB_ICUDATA_NAME)$(STUB_SUFFIX).$(SO) $(top_builddir)/stubdata/$(LIB_ICUDATA_NAME)$(STUB_SUFFIX).$(SO) +#### $(LIB_ICUDATA_NAME)$(STUB_SUFFIX) is the subset data for batch mode +package390: $(OUTTMPDIR)/icudata390.lst $(OUTTMPDIR)/icudata.lst ./icupkg.inc packagedata + ln -s $(ICUDATA_NAME) $(OUTDIR)/build/$(ICUDATA_NAME)$(STUB_SUFFIX) + $(INVOKE) $(PKGDATA) -s $(BUILDDIR)$(STUB_SUFFIX) -T $(OUTTMPDIR_390STUB) -p $(ICUDATA_NAME)$(STUB_SUFFIX) $(PKGDATA_LIBNAME)$(STUB_SUFFIX) -e $(ICUDATA_ENTRY_POINT) $(OS390LIST) -m dll $(PKGDATA_VERSIONING) + cp $(ICUPKGDATA_OUTDIR)/$(LIB_ICUDATA_NAME)$(STUB_SUFFIX).$(SO) $(top_builddir)/stubdata/$(LIB_ICUDATA_NAME)$(STUB_SUFFIX).$(SO) ##### Define all the data files. the build rule that depends on them is below. +# X_FILES_SHORT = just the base names (for lists) +# X_FILES = full paths (for dependency) ## DAT files - Misc. data files. -DAT_FILES_SHORT=uprops.icu pnames.icu unames.icu unorm.icu cnvalias.icu tz.icu ucadata.icu invuca.icu uidna.icu -DAT_FILES=$(DAT_FILES_SHORT:%=$(BUILDDIR)/$(ICUDT)%) +DAT_FILES_SHORT=uprops.icu ucase.icu pnames.icu unames.icu unorm.icu cnvalias.icu ucadata.icu invuca.icu uidna.spp +DAT_FILES=$(DAT_FILES_SHORT:%=$(BUILDDIR)/%) ## BRK files -# ALL of these files can be deleted (the following BRK files) - they are copied -BRK_FILES_SHORT=char.brk line.brk line_th.brk sent.brk word.brk title.brk word_th.brk -BRK_FILES=$(BRK_FILES_SHORT:%=$(BUILDDIR)/$(ICUDT)%) -# don't include thaidict.brk - it goes into a resource bundle - plus it isn't deleted +-include $(BRKSRCDIR)/brkfiles.mk +-include $(BRKSRCDIR)/brklocal.mk +ALL_BRK_SOURCE=char.txt title.txt word.txt $(BRK_SOURCE) $(BRK_SOURCE_LOCAL) +BRK_FILES_SHORT=$(ALL_BRK_SOURCE:%.txt=%.brk) +BRK_FILES=$(BRK_FILES_SHORT:%=$(BUILDDIR)/%) -## UCM files +## UCM files -include $(UCMSRCDIR)/ucmcore.mk -include $(UCMSRCDIR)/ucmfiles.mk -include $(UCMSRCDIR)/ucmebcdic.mk -include $(UCMSRCDIR)/ucmlocal.mk ALL_UCM_SOURCE=ibm-37_P100-1995.ucm ibm-1047_P100-1995.ucm $(UCM_SOURCE_CORE) $(UCM_SOURCE_FILES) $(UCM_SOURCE_EBCDIC) $(UCM_SOURCE_LOCAL) UCM_FILES = $(ALL_UCM_SOURCE:%=$(SRCDATADIR)/%) -CNV_FILES = $(ALL_UCM_SOURCE:%.ucm=$(BUILDDIR)/$(ICUDT)%.cnv) +CNV_FILES = $(ALL_UCM_SOURCE:%.ucm=$(BUILDDIR)/%.cnv) +CNV_FILES_SHORT = $(ALL_UCM_SOURCE:%.ucm=%.cnv) ## RES files -include $(LOCSRCDIR)/resfiles.mk +-include $(COLSRCDIR)/colfiles.mk +-include $(RBNFSRCDIR)/rbnffiles.mk +-include $(TRANSLITSRCDIR)/trnsfiles.mk -include $(LOCSRCDIR)/reslocal.mk -RES_SOURCE= root.txt $(GENRB_SOURCE) $(GENRB_ALIAS_SOURCE) $(GENRB_SOURCE_LOCAL) -RES_SRC_FILES = $(RES_SOURCE:%=$(LOCSRCDIR)/%) +-include $(COLSRCDIR)/collocal.mk +-include $(RBNFSRCDIR)/rbnflocal.mk +-include $(TRANSLITSRCDIR)/translocal.mk +RES_SRC= root.txt $(GENRB_SOURCE) $(GENRB_ALIAS_SOURCE) $(GENRB_SOURCE_LOCAL) +RES_SRC_FILES = $(RES_SRC:%=$(LOCSRCDIR)/%) INSTALLED_RB_FILES = $(GENRB_SOURCE:%.txt=%) $(GENRB_SOURCE_LOCAL:%.txt=%) -GENRBOPTS=-k -q - -## TRNS files --include $(TRNSSRCDIR)/trnsfiles.mk --include $(TRNSSRCDIR)/trnslocal.mk -TRNS_SOURCE= $(TRANSLIT_SOURCE) $(TRANSLIT_SOURCE_LOCAL) -TRNS_SRC_FILES=$(TRNS_SOURCE:%=$(TRNSSRCDIR)/%) - -ALL_RES_SOURCE= $(RES_SOURCE) $(TRNS_SOURCE) -RES_FILES = $(ALL_RES_SOURCE:%.txt=$(BUILDDIR)/$(ICUDT)%.res) +COL_SRC= root.txt $(COLLATION_SOURCE) $(COLLATION_ALIAS_SOURCE) $(COLLATION_SOURCE_LOCAL) +COL_SRC_FILES = $(COL_SRC:%=$(COLSRCDIR)/%) +INSTALLED_COL_FILES = $(COLLATION_SOURCE:%.txt=%) $(COLLATION_SOURCE_LOCAL:%.txt=%) +RBNF_SRC= root.txt $(RBNF_SOURCE) $(RBNF_ALIAS_SOURCE) $(RBNF_SOURCE_LOCAL) +RBNF_SRC_FILES = $(RBNF_SRC:%=$(RBNFSRCDIR)/%) +INSTALLED_RBNF_FILES = $(RBNF_SOURCE:%.txt=%) $(RBNF_SOURCE_LOCAL:%.txt=%) +INSTALLED_TRANSLIT_FILES = $(TRANSLIT_SOURCE:%.txt=%) $(TRANSLIT_SOURCE_LOCAL:%.txt=%) +TRANSLIT_SRC= root.txt $(TRANSLIT_SOURCE) $(TRANSLIT_ALIAS_SOURCE) $(TRANSLIT_SOURCE_LOCAL) +TRANSLIT_SRC_FILES = $(TRANSLIT_SRC:%=$(TRANSLITSRCDIR)/%) +INSTALLED_TRANSLIT_FILES = $(TRANSLIT_SOURCE:%.txt=%) $(TRANSLIT_SOURCE_LOCAL:%.txt=%) +GENRBOPTS=-k + +## MISC files +-include $(MISCSRCDIR)/miscfiles.mk +-include $(MISCSRCDIR)/misclocal.mk +MSC_SOURCE= $(MISC_SOURCE) $(MISC_SOURCE_LOCAL) +MSC_SRC_FILES=$(MSC_SOURCE:%=$(MISCSRCDIR)/%) + +ifeq ($(ENABLE_SO_VERSION_DATA),1) +ifeq ($(PKGDATA_MODE),dll) +SO_VERSION_DATA = $(OUTTMPDIR)/icudata.res +$(SO_VERSION_DATA) : $(MISCSRCDIR)/icudata.rc + rc.exe /i$(srcdir)/../common /fo$@ $(SOURCE_FILE) +endif +endif -INDEX_FILES=$(BUILDDIR)/res_index.txt -INDEX_RES_FILES=$(INDEX_FILES:$(BUILDDIR)/%.txt=$(BUILDDIR)/$(ICUDT)%.res) +ALL_RES_SRC= $(RES_SRC) $(TRNS_SOURCE) $(MSC_SOURCE) +RES_FILES = $(ALL_RES_SRC:%.txt=$(BUILDDIR)/%.res) +RES_FILES_SHORT = $(ALL_RES_SRC:%.txt=%.res) + +INDEX_NAME=res_index +INDEX_FILE=$(OUTTMPDIR)/$(INDEX_NAME).txt +INDEX_RES_FILE=$(INDEX_FILE:$(OUTTMPDIR)/%.txt=$(BUILDDIR)/%.res) +INDEX_RES_FILE_SHORT=$(INDEX_FILE:$(OUTTMPDIR)/%.txt=%.res) + +COLLATION_TREE=coll +COLLATION_INDEX_FILE=$(OUTTMPDIR)/$(COLLATION_TREE)/$(INDEX_NAME).txt +COLLATION_INDEX_RES=$(COLBLDDIR)/$(INDEX_NAME).res +COLLATION_INDEX_RES_SHORT=$(COLLATION_TREE)/$(INDEX_NAME).res +COLLATION_FILES = $(COL_SRC:%.txt=$(COLBLDDIR)/%.res) $(COLLATION_INDEX_RES) +COLLATION_FILES_SHORT = $(COL_SRC:%.txt=$(COLLATION_TREE)/%.res) + +RBNF_TREE=rbnf +RBNF_INDEX_FILE=$(OUTTMPDIR)/$(RBNF_TREE)/$(INDEX_NAME).txt +RBNF_INDEX_RES=$(RBNFBLDDIR)/$(INDEX_NAME).res +RBNF_INDEX_RES_SHORT=$(RBNF_TREE)/$(INDEX_NAME).res +RBNF_FILES = $(RBNF_SRC:%.txt=$(RBNFBLDDIR)/%.res) $(RBNF_INDEX_RES) +RBNF_FILES_SHORT = $(RBNF_SRC:%.txt=$(RBNF_TREE)/%.res) + +TRANSLIT_TREE=translit +#TRANSLIT_INDEX_FILE=$(OUTTMPDIR)/$(TRANSLIT_TREE)/$(INDEX_NAME).txt +#TRANSLIT_INDEX_RES=$(TRANSLITBLDDIR)/$(INDEX_NAME).res +#TRANSLIT_INDEX_RES_SHORT=$(TRANSLIT_TREE)/$(INDEX_NAME).res +TRANSLIT_FILES = $(TRANSLIT_SRC:%.txt=$(TRANSLITBLDDIR)/%.res) +TRANSLIT_FILES_SHORT = $(TRANSLIT_SRC:%.txt=$(TRANSLIT_TREE)/%.res) ## All generated files -ALL_FILES = $(DAT_FILES) $(CNV_FILES) $(BRK_FILES) $(RES_FILES) $(INDEX_RES_FILES) +ALL_FILES = $(DAT_FILES) $(CNV_FILES) $(BRK_FILES) $(RES_FILES) $(INDEX_RES_FILE) $(COLLATION_FILES) $(RBNF_FILES) $(TRANSLIT_FILES) +# a list to use in the .lst files (package-relative) +ALL_FILES_LIST = $(DAT_FILES_SHORT) $(CNV_FILES_SHORT) $(BRK_FILES_SHORT) $(RES_FILES_SHORT) $(INDEX_RES_FILE_SHORT) $(COLLATION_FILES_SHORT) $(COLLATION_INDEX_RES_SHORT) $(RBNF_FILES_SHORT) $(RBNF_INDEX_RES_SHORT) $(TRANSLIT_FILES_SHORT) ##################################################### # General data build rules @@ -183,19 +262,18 @@ ALL_FILES = $(DAT_FILES) $(CNV_FILES) $(BRK_FILES) $(RES_FILES) $(INDEX_RES_FILE ## Files to remove for 'make clean' CLEANFILES = *~ icupkg.inc -$(BUILDDIR)/icudata.lst: $(SRCLISTDEPS) +$(OUTTMPDIR)/icudata.lst: $(SRCLISTDEPS) @echo "generating $@ (list of data files)" @-$(RMV) $@ - @for file in $(ALL_FILES); do \ + @for file in $(ALL_FILES_LIST); do \ echo $$file >> $@; \ done; -build-local: build-data build-testdata - -build-data: build-dir $(ALL_FILES) $(BUILDDIR)/icudata.lst $(OS390LIST) +build-local: build-dir $(SO_VERSION_DATA) $(ALL_FILES) $(OUTTMPDIR)/icudata.lst $(OS390LIST) -build-dir: - -$(MKINSTALLDIRS) $(OUTDIR) $(BUILDDIR) $(TESTOUTDIR) $(TESTBUILDDIR) +build-dir: $(BUILD_DIRS) +$(BUILD_DIRS): + -$(MKINSTALLDIRS) $(BUILD_DIRS) # Now, sections for building each kind of data. @@ -204,36 +282,36 @@ build-dir: # DAT FILES # uprops.icu -$(BUILDDIR)/$(ICUDT)uprops.icu: $(UNICODEDATADIR)/UnicodeData.txt $(UNICODEDATADIR)/BidiMirroring.txt $(TOOLDIR)/genprops/genprops$(EXEEXT) $(BUILDDIR)/$(ICUDT)pnames.icu - ICU_DATA=$(BUILDDIR) $(INVOKE) $(TOOLDIR)/genprops/genprops -s $(UNICODEDATADIR) -d $(BUILDDIR) -u $(UNICODE_VERSION) +$(BUILDDIR)/uprops.icu: $(UNICODEDATADIR)/UnicodeData.txt $(UNICODEDATADIR)/BidiMirroring.txt $(BINDIR)/genprops$(EXEEXT) $(BUILDDIR)/$(ICUDT)pnames.icu + $(INVOKE) $(BINDIR)/genprops -s $(UNICODEDATADIR) -i $(BUILDDIR) -d $(BUILDDIR) -u $(UNICODE_VERSION) + +# ucase.icu +$(BUILDDIR)/ucase.icu: $(UNICODEDATADIR)/UnicodeData.txt $(BINDIR)/gencase$(EXEEXT) + $(INVOKE) $(BINDIR)/gencase -s $(UNICODEDATADIR) -i $(BUILDDIR) -d $(BUILDDIR) -u $(UNICODE_VERSION) # pnames.icu -$(BUILDDIR)/$(ICUDT)pnames.icu: $(UNICODEDATADIR)/PropertyAliases.txt $(UNICODEDATADIR)/PropertyValueAliases.txt $(UNICODEDATADIR)/Blocks.txt $(COMINCDIR)/uscript.h $(COMINCDIR)/uchar.h $(TOOLDIR)/genpname/genpname$(EXEEXT) - ICU_DATA=$(BUILDDIR) $(INVOKE) $(TOOLDIR)/genpname/genpname -d $(BUILDDIR) +$(BUILDDIR)/pnames.icu: $(UNICODEDATADIR)/PropertyAliases.txt $(UNICODEDATADIR)/PropertyValueAliases.txt $(UNICODEDATADIR)/Blocks.txt $(COMINCDIR)/uscript.h $(COMINCDIR)/uchar.h $(BINDIR)/genpname$(EXEEXT) + $(INVOKE) $(BINDIR)/genpname -d $(BUILDDIR) # unorm.icu -$(BUILDDIR)/$(ICUDT)unorm.icu: $(UNICODEDATADIR)/UnicodeData.txt $(UNICODEDATADIR)/DerivedNormalizationProps.txt $(UNICODEDATADIR)/BidiMirroring.txt $(TOOLDIR)/gennorm/gennorm$(EXEEXT) - ICU_DATA=$(BUILDDIR) $(INVOKE) $(TOOLDIR)/gennorm/gennorm -s $(UNICODEDATADIR) -d $(BUILDDIR) -u $(UNICODE_VERSION) +$(BUILDDIR)/unorm.icu: $(UNICODEDATADIR)/UnicodeData.txt $(UNICODEDATADIR)/DerivedNormalizationProps.txt $(UNICODEDATADIR)/BidiMirroring.txt $(BINDIR)/gennorm$(EXEEXT) $(BUILDDIR)/$(ICUDT)pnames.icu $(BUILDDIR)/$(ICUDT)uprops.icu $(BUILDDIR)/$(ICUDT)ucase.icu + $(INVOKE) $(BINDIR)/gennorm -s $(UNICODEDATADIR) -i $(BUILDDIR) -d $(BUILDDIR) -u $(UNICODE_VERSION) # ucadata.icu -$(BUILDDIR)/$(ICUDT)ucadata.icu $(BUILDDIR)/$(ICUDT)invuca.icu: $(UNICODEDATADIR)/FractionalUCA.txt $(TOOLDIR)/genuca/genuca$(EXEEXT) $(BUILDDIR)/$(ICUDT)unorm.icu - $(INVOKE) $(TOOLDIR)/genuca/genuca -s $(UNICODEDATADIR) -d $(BUILDDIR) -i $(BUILDDIR) +$(BUILDDIR)/ucadata.icu $(BUILDDIR)/$(ICUDT)invuca.icu: $(UNICODEDATADIR)/FractionalUCA.txt $(BINDIR)/genuca$(EXEEXT) $(BUILDDIR)/$(ICUDT)unorm.icu $(BUILDDIR)/$(ICUDT)ucase.icu + $(INVOKE) $(BINDIR)/genuca -s $(UNICODEDATADIR) -d $(BUILDDIR) -i $(BUILDDIR) # unames.icu -$(BUILDDIR)/$(ICUDT)unames.icu: $(UNICODEDATADIR)/UnicodeData.txt $(TOOLDIR)/gennames/gennames$(EXEEXT) - ICU_DATA=$(BUILDDIR) $(INVOKE) $(TOOLDIR)/gennames/gennames -1 -d $(BUILDDIR) $(UNICODEDATADIR)/UnicodeData.txt -u $(UNICODE_VERSION) +$(BUILDDIR)/unames.icu: $(UNICODEDATADIR)/UnicodeData.txt $(BINDIR)/gennames$(EXEEXT) + $(INVOKE) $(BINDIR)/gennames -1 -d $(BUILDDIR) $(UNICODEDATADIR)/UnicodeData.txt -u $(UNICODE_VERSION) # cnvalias.icu -$(BUILDDIR)/$(ICUDT)cnvalias.icu: $(UCMSRCDIR)/convrtrs.txt $(TOOLDIR)/gencnval/gencnval$(EXEEXT) - ICU_DATA=$(BUILDDIR) $(INVOKE) $(TOOLDIR)/gencnval/gencnval -d $(BUILDDIR) $(UCMSRCDIR)/convrtrs.txt +$(BUILDDIR)/cnvalias.icu: $(UCMSRCDIR)/convrtrs.txt $(BINDIR)/gencnval$(EXEEXT) + $(INVOKE) $(BINDIR)/gencnval -d $(BUILDDIR) $(UCMSRCDIR)/convrtrs.txt -# tz.icu -$(BUILDDIR)/$(ICUDT)tz.icu: $(MISCSRCDIR)/timezone.txt $(TOOLDIR)/gentz/gentz$(EXEEXT) - ICU_DATA=$(BUILDDIR) $(INVOKE) $(TOOLDIR)/gentz/gentz -d $(BUILDDIR) $(MISCSRCDIR)/timezone.txt - -# uidna.icu -$(BUILDDIR)/$(ICUDT)uidna.icu: $(MISCSRCDIR)/rfc3454_A_1.txt $(MISCSRCDIR)/rfc3454_B_1.txt $(MISCSRCDIR)/rfc3454_B_2.txt $(MISCSRCDIR)/rfc3454_C_X.txt $(TOOLDIR)/genidna/genidna$(EXEEXT) - ICU_DATA=$(BUILDDIR) $(INVOKE) $(TOOLDIR)/genidna/genidna -d $(BUILDDIR) -s $(SRCDATADIR) +# uidna.spp +$(BUILDDIR)/uidna.spp: $(MISCSRCDIR)/NamePrepProfile.txt $(BINDIR)/gensprep$(EXEEXT) $(BUILDDIR)/uprops.icu $(BUILDDIR)/unames.icu $(BUILDDIR)/pnames.icu + $(INVOKE) $(BINDIR)/gensprep -d $(BUILDDIR) -i $(BUILDDIR) -s $(MISCSRCDIR) -b uidna -n $(UNICODEDATADIR) -u 3.2.0 -k NamePrepProfile.txt #################################################### BRK # BRK FILES @@ -241,30 +319,74 @@ $(BUILDDIR)/$(ICUDT)uidna.icu: $(MISCSRCDIR)/rfc3454_A_1.txt $(MISCSRCDIR)/rfc34 thaidict.brk: $(SRCDATADIR)/thaidict.brk $(RMV) $@ && ln -s $(BUILDDIR) $@ -$(BUILDDIR)/$(ICUDT)%.brk: $(BRKSRCDIR)/%.txt $(TOOLDIR)/genbrk/genbrk$(EXEEXT) - ICU_DATA=$(BUILDDIR) $(INVOKE) $(TOOLDIR)/genbrk/genbrk -r $< -o $@ +$(BUILDDIR)/%.brk: $(BRKSRCDIR)/%.txt $(BINDIR)/genbrk$(EXEEXT) $(DAT_FILES) + $(INVOKE) $(BINDIR)/genbrk -c -i $(BUILDDIR) -r $< -o $@ #################################################### CNV # CNV FILES -$(BUILDDIR)/$(ICUDT)%.cnv: $(UCMSRCDIR)/%.ucm $(TOOLDIR)/makeconv/makeconv$(EXEEXT) - ICU_DATA=$(BUILDDIR) $(INVOKE) $(TOOLDIR)/makeconv/makeconv -p $(ICUDATA_PLATFORM_NAME) -c -d $(BUILDDIR) $(UCMSRCDIR)/$( $@; \ + echo "$(INDEX_NAME) {" >> $@; \ + echo " InstalledLocales {" >> $@; \ + for file in $(INSTALLED_COL_FILES); do \ + echo " $$file {\"\"}" >> $@; \ + done; \ + echo " }" >> $@; \ + echo "}" >> $@; + +### RBNF res +$(RBNFBLDDIR)/%.res: $(RBNFSRCDIR)/%.txt $(BINDIR)/genrb$(EXEEXT) $(DAT_FILES) + $(INVOKE) $(BINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -s $(RBNFSRCDIR) -d $(RBNFBLDDIR) $( $@; \ + echo "$(INDEX_NAME) {" >> $@; \ + echo " InstalledLocales {" >> $@; \ + for file in $(INSTALLED_RBNF_FILES); do \ + echo " $$file {\"\"}" >> $@; \ + done; \ + echo " }" >> $@; \ + echo "}" >> $@; + +### TRANSLIT res +$(TRANSLITBLDDIR)/%.res: $(TRANSLITSRCDIR)/%.txt $(BINDIR)/genrb$(EXEEXT) $(DAT_FILES) + $(INVOKE) $(BINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -s $(TRANSLITSRCDIR) -d $(TRANSLITBLDDIR) $( $@; \ - echo "res_index {" >> $@; \ + echo "$(INDEX_NAME) {" >> $@; \ echo " InstalledLocales {" >> $@; \ for file in $(INSTALLED_RB_FILES); do \ echo " $$file {\"\"}" >> $@; \ @@ -272,8 +394,11 @@ $(BUILDDIR)/res_index.txt: $(SRCLISTDEPS) echo " }" >> $@; \ echo "}" >> $@; -$(BUILDDIR)/$(ICUDT)%.res: $(INDEX_FILES) $(TOOLDIR)/genrb/genrb$(EXEEXT) - ICU_DATA=$(BUILDDIR) $(INVOKE) $(TOOLDIR)/genrb/genrb $(GENRBOPTS) -p $(ICUDATA_PLATFORM_NAME) -d $(BUILDDIR) $(INDEX_FILES) +clean-resindex: + -$(RMV) $(BUILDDIR)/$(INDEX_NAME).txt $(OUTTMPDIR)/icudata.lst + +$(INDEX_RES_FILE): $(INDEX_FILE) $(BINDIR)/genrb$(EXEEXT) + $(INVOKE) $(BINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -d $(BUILDDIR) $(INDEX_FILE) ################################################################### Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @@ -287,82 +412,20 @@ icupkg.inc: $(srcdir)/icupkg.inc.in $(top_builddir)/config.status ########### ########### 390 (z/OS) support UCMFILES390=ebcdic-xml-us.ucm ibm-37_P100-1995.ucm ibm-1047_P100-1995.ucm ibm-4909_P100-1999.ucm -ALLFILES390=uprops.icu pnames.icu unorm.icu cnvalias.icu $(UCMFILES390:.ucm=.cnv) +ALLFILES390=uprops.icu ucase.icu pnames.icu unorm.icu cnvalias.icu $(UCMFILES390:.ucm=.cnv) -$(BUILDDIR)/icudata390.lst: $(SRCLISTDEPS) +$(OUTTMPDIR)/icudata390.lst: $(SRCLISTDEPS) @echo "generating $@ (list of 390 data files)" @-$(RMV) $@ @for file in $(ALLFILES390); do \ - echo $(BUILDDIR)/$(ICUDT)$$file >> $@; \ - done; - -######################################################################### -############################## Test ## stuff ############################ - -TESTSRCDATADIR=$(top_srcdir)/test/testdata -TESTOUTDIR=$(top_builddir)/test/testdata/out - -# Contains all 'intermediate' files (and temp files) except for 'unpackaged data' below -TESTBUILDDIR=$(TESTOUTDIR)/build - -# unpackaged files - live in 'out' so that the path can find them as part of the pkg -UNPACKAGEDTESTDATA=$(TESTOUTDIR)/$(TESTDT)nam.typ - -# pkg name for testdata -TESTDATA=testdata -# prefix for files that are testdata -TESTDT=$(TESTDATA)_ - -# File definitions -TEST_DAT_FILES=$(TESTBUILDDIR)/$(TESTDT)test.icu - -TEST_UCM_SOURCE= test1.ucm test3.ucm test4.ucm ibm9027.ucm -TEST_UCM_FILES=$(TEST_UCM_SOURCE:%=$(TESTSRCDATADIR)/data/%) -TEST_CNV_FILES=$(TEST_UCM_SOURCE:%.ucm=$(TESTBUILDDIR)/$(TESTDT)%.cnv) - -TEST_RES = casing.txt mc.txt root.txt te.txt te_IN.txt testtypes.txt testaliases.txt testempty.txt DataDrivenCollationTest.txt idna_rules.txt -TEST_RES_FILES=$(TEST_RES:%.txt=$(TESTBUILDDIR)/$(TESTDT)%.res) $(TESTBUILDDIR)/$(TESTDT)iscii.res - -ALL_TEST_FILES = $(TEST_DAT_FILES) $(TEST_BRK_FILES) $(TEST_CNV_FILES) $(TEST_RES_FILES) $(TESTOUTDIR)/$(TESTDT)nam.typ - -# list - -$(TESTBUILDDIR)/testdata.lst: $(SRCLISTDEPS) - @echo "generating $@ (list of data files)" - @-$(RMV) $@ - @for file in $(TEST_RES_FILES) $(TEST_DAT_FILES) $(TEST_CNV_FILES); do \ echo $$file >> $@; \ done; +ifeq ($(POST_DATA_BUILD), os400-data-rebind) +os400-data-rebind: $(LIBICUUC) -build-testdata: $(ALL_TEST_FILES) $(TESTBUILDDIR)/testdata.lst $(TESTBUILDDIR)/$(TESTDT)iscii.res - -# test.icu -$(TESTBUILDDIR)/$(TESTDT)test.icu: $(TOOLDIR)/gentest/gentest$(EXEEXT) - ICU_DATA=$(BUILDDIR) $(INVOKE) $(TOOLDIR)/gentest/gentest -d $(TESTBUILDDIR) - -$(TESTBUILDDIR)/$(TESTDT)%.cnv: $(TESTSRCDATADIR)/%.ucm $(TOOLDIR)/makeconv/makeconv$(EXEEXT) - ICU_DATA=$(BUILDDIR) $(INVOKE) $(TOOLDIR)/makeconv/makeconv -p $(TESTDATA) -c -d $(TESTBUILDDIR) $(TESTSRCDATADIR)/$(/dev/null || ( echo "WARNING: could not open ISCII - it may have been disabled." | tee $@ ) - @echo Finished testing genrb -e option - -################################################################### TYP -# TYP FILES - -$(TESTOUTDIR)/$(TESTDT)nam.typ: $(TESTBUILDDIR)/$(TESTDT)te_IN.res - cp $< $@ - - -testdata: $(ALL_TEST_FILES) $(UNPACKAGEDTESTDATA) - -packagetest: testdata icupkg.inc $(TESTBUILDDIR)/testdata.lst - $(INVOKE) $(PKGDATA) -T $(TESTBUILDDIR) -d $(TESTOUTDIR) -s $(TESTBUILDDIR) -p $(TESTDATA) -m common $(TESTBUILDDIR)/testdata.lst - +$(LIBICUUC): $(LIBICUDT) + $(RMV) $(LIBICUUC) + (cd ../common && $(MAKE) RECURSIVE=YES) || exit; +endif diff --git a/icuSources/data/README b/icuSources/data/README deleted file mode 100644 index aa1a78f3..00000000 --- a/icuSources/data/README +++ /dev/null @@ -1,11 +0,0 @@ -== Copyright (c) 2000 IBM, Inc. All rights reserved. == - - -This directory contains the intermediate, generated ICU data. For example, -.res, .cnv, and some .dat files end up here. - -It is also used as a temporary directory by some ICU tools build processes. - -You should NOT set your ICU_DATA directory to point here. Instead, -point it to ".." (that is, icu/source/data). - diff --git a/icuSources/data/brkitr/brkfiles.mk b/icuSources/data/brkitr/brkfiles.mk new file mode 100644 index 00000000..84863aec --- /dev/null +++ b/icuSources/data/brkitr/brkfiles.mk @@ -0,0 +1,31 @@ +# * Copyright (C) 1997-2004, International Business Machines +# * Corporation and others. All Rights Reserved. +# A list of txt's to build +# Note: +# +# If you are thinking of modifying this file, READ THIS. +# +# Instead of changing this file [unless you want to check it back in], +# you should consider creating a 'brklocal.mk' file in this same directory. +# Then, you can have your local changes remain even if you upgrade or +# reconfigure ICU. +# +# Example 'brklocal.mk' files: +# +# * To add an additional locale to the list: +# _____________________________________________________ +# | BRK_SOURCE_LOCAL = myLocale.txt ... +# +# * To REPLACE the default list and only build with a few +# locale: +# _____________________________________________________ +# | BRK_SOURCE = ar.txt ar_AE.txt en.txt de.txt zh.txt +# +# + + +# don't include thaidict.brk - it goes into a resource bundle - plus it isn't deleted. +# char.txt, title.txt and word.txt are not included so that more tests pass by default, +# and so that the makefile rules are simplier. +BRK_SOURCE = \ +line.txt sent.txt line_th.txt word_th.txt word_ja.txt word_POSIX.txt diff --git a/icuSources/data/brkitr/char.txt b/icuSources/data/brkitr/char.txt index ff6969fd..9214e61e 100644 --- a/icuSources/data/brkitr/char.txt +++ b/icuSources/data/brkitr/char.txt @@ -1,5 +1,5 @@ # -# Copyright (C) 2002-2003, International Business Machines Corporation and others. +# Copyright (C) 2002-2004, International Business Machines Corporation and others. # All Rights Reserved. # # file: char.txt @@ -15,9 +15,9 @@ # $CR = \r; $LF = \n; -$Control = [[:Zl:] [:Zp:] [:Cc:] [:Cf:]]; +$Control = [[:Zl:] [:Zp:] [:Cc:] [:Cf:] - [:Grapheme_Extend = TRUE:]]; -$Extend = [[:Grapheme_Extend = TRUE:]]; +$Extend = [[:Grapheme_Extend = TRUE:]]; # # Korean Syllable Definitions @@ -31,15 +31,31 @@ $LVT = [:Hangul_Syllable_Type = LVT:]; $HangulSyllable = $L+ | ($L* ($LV? $V+ | $LV | $LVT) $T*) | $T+; -# -# Forward Break Rules -# +## ------------------------------------------------- + +!!forward; + $CR $LF; ([^$Control] | $HangulSyllable) $Extend*; -.; +## ------------------------------------------------- -# -# Reverse Rule, back up to the beginning of some preceding grapheme cluster. -# -! ($Extend | $V | $T )* ($LF $CR | ($LV | $LVT)?$L* | .); +!!reverse; + +$BackHangulSyllable = $L+ | ($T* ($V+$LV? | $LV | $LVT) $L*) | $T+; +$BackOneCluster = ($LF $CR) | ($Extend* ([^$Control] | $BackHangulSyllable)); +$BackOneCluster; + +## ------------------------------------------------- + +!!safe_reverse; + +# rule 6, 7, 8 +$V+ $L; + +## ------------------------------------------------- + +!!safe_forward; + +# rule 6, 7, 8 +$V+ $T; diff --git a/icuSources/data/brkitr/line.txt b/icuSources/data/brkitr/line.txt index 128d3698..944a1ced 100644 --- a/icuSources/data/brkitr/line.txt +++ b/icuSources/data/brkitr/line.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2002-2003 International Business Machines Corporation and +# Copyright (c) 2002-2004 International Business Machines Corporation and # others. All Rights Reserved. # # file: line.txt @@ -12,6 +12,10 @@ # Character Classes defined by TR 14. # +!!chain; +!!LBCMNoChain; +!!lookAheadHardBreak; + $AI = [:LineBreak = Ambiguous:]; $AL = [:LineBreak = Alphabetic:]; $BA = [:LineBreak = Break_After:]; @@ -29,6 +33,7 @@ $ID = [:LineBreak = Ideographic:]; $IN = [:LineBreak = Inseperable:]; $IS = [:LineBreak = Infix_Numeric:]; $LF = [:LineBreak = Line_Feed:]; +$NL = [:LineBreak = Next_Line:]; $NS = [:LineBreak = Nonstarter:]; $NU = [:LineBreak = Numeric:]; $OP = [:LineBreak = Open_Punctuation:]; @@ -39,105 +44,348 @@ $SA = [:LineBreak = Complex_Context:]; $SG = [:LineBreak = Surrogate:]; $SP = [:LineBreak = Space:]; $SY = [:LineBreak = Break_Symbols:]; +$WJ = [:LineBreak = Word_Joiner:]; $XX = [:LineBreak = Unknown:]; $ZW = [:LineBreak = ZWSpace:]; # -# Character classes from TR 29. Needed for finding characters. -# +# Korean Syllable Definitions # -$Extend = [:Grapheme_Extend = TRUE:]; +$L = [:Hangul_Syllable_Type = L:]; +$V = [:Hangul_Syllable_Type = V:]; +$T = [:Hangul_Syllable_Type = T:]; +$LV = [:Hangul_Syllable_Type = LV:]; +$LVT = [:Hangul_Syllable_Type = LVT:]; + +$HangulSyllable = $L+ | ($L* ($LV? $V+ | $LV | $LVT) $T*) | $T+; # -# Rule LB1. By default, treat AI (characters with ambiguous east Asian width) and -# SA (South East Asian: Thai, Lao, Khmer) as $AL (Alphabetic) +# Rule LB1. By default, treat AI (characters with ambiguous east Asian width), +# SA (South East Asian: Thai, Lao, Khmer) +# XX (Unknown, unassigned) +# as $AL (Alphabetic) # -$ALPlus = $AL | $AI | $SA; +$ALPlus = $AL | $AI | $SA | $XX; # # Combining Marks. X $CM* behaves as if it were X. Rule LB6. # $ALcm = $ALPlus $CM*; -$IDcm = ($ID $CM* | $SP $CM+); -$NUcm = $NU $Extend*; -$HYcm = $HY $Extend*; -$QUcm = $QU $Extend*; -$POcm = $PO $Extend*; -$OPcm = $OP $Extend*; -$BAcm = $BA $Extend*; -$BBcm = $BB $Extend*; -$NScm = $NS $Extend*; -$GLcm = $GL $Extend*; -$B2cm = $B2 $Extend*; -$INcm = $IN $Extend*; - +$BAcm = $BA $CM*; +$BBcm = $BB $CM*; +$B2cm = $B2 $CM*; +$CLcm = $CL $CM*; +$EXcm = $EX $CM*; +$GLcm = $GL $CM*; +$HYcm = $HY $CM*; +$IDcm = ($ID | $HangulSyllable) $CM*; +$INcm = $IN $CM*; +$IScm = $IS $CM*; +$NScm = $NS $CM*; +$NUcm = $NU $CM*; +$OPcm = $OP $CM*; +$POcm = $PO $CM*; +$PRcm = $PR $CM*; +$QUcm = $QU $CM*; +$SPcm = $SP $CM*; +$SYcm = $SY $CM*; +$WJcm = $WJ $CM*; -# New Lines. Always break after, never break before. -# Rule LB 3 # -# Endings. NewLine or Zero Width Space, or both. Rules 4, 5 -# Because we never break before these things, $Endings -# appears at the end of line break rule. +# Each class of character can stand by itself as an unbroken token, with trailing combining stuff # -$NLF = $BK | $CR | $LF | $CR $LF; -$Endings = $SP* $ZW* $NLF?; +$ALPlus $CM+; +$BA $CM+; +$BB $CM+; +$B2 $CM+; +$CL $CM+; +$EX $CM+; +$GL $CM+; +$HY $CM+; +$ID $CM+; +$IN $CM+; +$IS $CM+; +$NS $CM+; +$NU $CM+; +$OP $CM+; +$PO $CM+; +$PR $CM+; +$QU $CM+; +$SP $CM+; +$SY $CM+; +$WJ $CM+; +## ------------------------------------------------- -# -# Openings Sequences that can precede Words, and that should not be separated from them. -# Rules LB 9, 10 -# -$Openings = (($QUcm $SP*)? $OPcm $SP*)*; +!!forward; # -# Closings Seqences that follow words, and that should not be separated from them, -# Rule LB 8, 11, 15 -$Closings = ($SP*( ($CL ($SP* $NScm)? | $EX | $IS | $SY) $Extend*) | $BAcm | $HYcm | $NScm)*; +# Rule LB 3 +$LB3Breaks = [$BK $CR $LF $NL]; +$LB3NonBreaks = [^$BK $CR $LF $NL]; +$LB5NonBreaks = [[$LB3NonBreaks] - [$ZW]]; -# -# Words. Includes mixed Alpha-numerics. -# Rules 11a, 16, 17, 19, more or less. -# -$NumberInterior = $IDcm | ($NUcm | $ALcm | $IS $NUcm)+; -$Number = $PR? ($OPcm | $HYcm)? $NumberInterior $CL? $POcm?; # Fancy Number 18 -$Word = (($IDcm | ($ALcm | $NUcm)+) ($POcm? | $INcm?)) ; # Alpha-numeric. 16, 17 -$Dashes = (($B2cm $SP*)*); # Dashes 11a - - +$LB3NonBreaks? $LB3Breaks {100}; +$LB5NonBreaks $CM* $LB3Breaks {100}; +$CR $LF {100}; +# LB 4 x SP +# x ZW +$ZW [$SP $ZW]; +$LB5NonBreaks $CM* [$SP $ZW]; - - - -$Word15 = ($BBcm* ($Word | $Number | $Dashes)? ($BAcm | $HYcm | $NScm)*) | # Rule 15. Stuff sticks around words. - [^[:Cc:] $BK $CR $LF $ZW $SP $GL] $Extend* | # Allow characters that don't meet the - [^$BK $CR $LF $ZW $SP $GL ]; # more elaborate definitions for WORD - # to be glued. - -$GluedWord = ($GLcm | $QUcm)? $Word15 (($GLcm | $QUcm) $Word15)*; # "Glue" will stick anything below it together. - # Rules 13, 14 +# LB 5 Break after zero width space +$LB5Breaks = [$LB3Breaks $ZW]; +# LB 6 # -# The actual rule, a combination of everything defined above. +# Korean Syllable Definitions # -$Openings $GluedWord $Closings $Endings; -# $GluedWord; +($HangulSyllable) $CM*; + +# LB 7 Combining marks. $SP $CM needs to behave like $ID. +# X $CM needs to behave like X, where X is not $SP. +# $CM not covered by the above needs to behave like $AL +# +$LB5NonBreaks $CM+; # Stick together any combining sequences that don't match other rules. + +# LB 8 +$LB5NonBreaks $CM* $CL; +$LB5NonBreaks $CM* $EX; +$LB5NonBreaks $CM* $IS; +$LB5NonBreaks $CM* $SY; + +# LB 9 +$OPcm $SP* .?; +$OPcm $SP* $LB5NonBreaks $CM*; + +# LB 10 +$QUcm $SP* $OPcm; + +# LB 11 +$CLcm $SP* $NScm; + +# LB 11a +($B2cm)+; + +# LB 11b +$LB5NonBreaks $CM* ($GLcm | $WJcm); +($GLcm | $WJcm) .?; + +# LB 12 +$LB12NonBreaks = [$LB5NonBreaks - $SP]; +# LB 14 +$LB12NonBreaks $CM* $QUcm+ .?; +$LB12NonBreaks $CM* $QUcm+ $LB5NonBreaks $CM*; +$SP $CM+ $QUcm+ .?; # LB7a SP CM+ behaves as ID +$SP $CM+ $QUcm+ $LB5NonBreaks $CM*; +$QUcm $LB3NonBreaks?; +$QUcm $LB5NonBreaks $CM*; # Don't let a combining mark go onto $CR, $BK, etc. +# LB 14a +$LB14NonBreaks = [$LB12NonBreaks - $CB]; +$LB14CanBreakAfter = $LB14NonBreaks $CM* | $SP $CM+; + +# LB 15 +$LB14CanBreakAfter ($BAcm | $HYcm | $NScm); +$BBcm [^$CB]; +$BBcm [^$CB $CR $LF $BK $NL $ZW] $CM*; + +# LB 16 +$ALcm $INcm; +$CM+ $INcm; # by rule 7c, any otherwise unattached CM behaves as AL +$IDcm $INcm; +$SP $CM+ $INcm; # by rule 7a, $SP $CM behaves like ID +$INcm $INcm; +$NUcm $INcm; + + +# $LB 17 +($IDcm | $SP $CM+) $POcm; +$ALcm+ $NUcm; # includes $LB19 +$CM+ $NUcm; # Rule 7c +$NUcm $ALcm+; + +# LB 18 +$PRcm? ($OPcm | $HYcm)? $NUcm ($NUcm | $IScm | $SYcm)* $CLcm? $POcm?; +$PRcm $ALcm; +$PRcm $IDcm; + +# LB 19 +$CM* $ALcm+; # The $CM* is from rule 7C, and unattached CM is treated as AL +$IScm $ALcm; # # Reverse Rules. # -# Back up to a hard break or a space that will cause a boundary. -# Not all spaces cause line breaks. $SpaceGlue represents a sequence -# containing a space that may inhibit a break from occuring. -# +## ------------------------------------------------- + +!!reverse; + +$CM+ $ALPlus; +$CM+ $BA; +$CM+ $BB; +$CM+ $B2; +$CM+ $CL; +$CM+ $EX; +$CM+ $GL; +$CM+ $HY; +$CM+ $ID; +$CM+ $IN; +$CM+ $IS; +$CM+ $NS; +$CM+ $NU; +$CM+ $OP; +$CM+ $PO; +$CM+ $PR; +$CM+ $QU; +$CM+ $SP; +$CM+ $SY; +$CM+ $WJ; + +# LB 3 + +$LB3Breaks $LB3NonBreaks; +$LB3Breaks $CM* $LB5NonBreaks; +$LF $CR; + +# LB 4 x SP +# x ZW +[$SP $ZW] $LB3NonBreaks; +[$SP $ZW] $CM* $LB5NonBreaks; + +# LB 5 Break after zero width space + +# LB 6 Jamo is treated like an alphabet + +$BackHangulSyllable = $L+ | ($T* ($V+$LV? | $LV | $LVT) $L*) | $T+; +$CM* $BackHangulSyllable; + +# LB 7 Combining marks. +# $SP $CM needs to behave like $ID. +# X $CM needs to behave like X, where X is not $SP. +# $CM not covered by the above needs to behave like $AL +# Stick together any combining sequences that don't match other rules. +$CM+ $LB5NonBreaks; + +# LB 8 +$CL $CM* $LB5NonBreaks; +$EX $CM* $LB5NonBreaks; +$IS $CM* $LB5NonBreaks; +$SY $CM* $LB5NonBreaks; + +# LB 9 +$LB5NonBreaks $SP* $CM* $OP; + +# LB 10 +$CM* $OP $SP* $CM* $QU; + +# LB 11 +$CM* $NS $SP* $CM* $CL; + +# LB 11a +($CM* $B2)+; + +# LB 11b +$CM* ($GL | $WJ) $CM* $LB5NonBreaks; +$CM* $LB5NonBreaks $CM* ($GL | $WJ); +. $CM* ($GL | $WJ); + +# LB 12 + +# LB 14 +$CM* $QU $CM* $LB12NonBreaks; +$CM* $QU $CM+ $SP; +$CM* $LB5NonBreaks $CM* $QU; + +# LB 14a +$BackLB14CanBreakAfter = ($CM* [$LB14NonBreaks - $CM]) | ($CM+ $SP); + +# LB 15 +$CM* ($BA | $HY | $NS) $BackLB14CanBreakAfter; +($CM* ($BA | $HY | $NS))+ $CM+ / $LB5Breaks; +[$CR $LF $BK $NL $ZW] $CM* $BB; +$CM* [^$CB $CR $LF $BK $NL $ZW] $CM* $BB; + +# LB 16 +$CM* $IN $CM* $ALPlus; +# by rule 7c, any otherwise unattached CM behaves as AL +$CM* $IN $CM+ / $LB5Breaks; + +$CM* $IN $CM* ($ID | $CM $SP); +$CM* $IN $CM* $IN; +$CM* $IN $CM* $NU; + +# $LB 17 +$CM* $PO $CM* ($ID | $CM $SP); +$CM* $NU ($CM* $ALPlus)+; # includes $LB19 +$CM* $NU $CM+ / $LB5Breaks; # Rule 7c + +$CM* $ALPlus $CM* $NU; + +# LB 18 +($CM* $PO)? ($CM* $CL)? ($CM* ($NU | $IS | $SY))* $CM* $NU ($CM* ($OP | $HY))? ($CM* $PR)?; +$CM* $ALPlus $CM* $PR; +$CM* ($ID | $BackHangulSyllable) $CM* $PR; + +# LB 19 +$CM* $ALPlus $CM* $ALPlus; +# The $CM* is from rule 7C, and unattached CM is treated as AL +$CM* $ALPlus $CM* $IS; +$CM* $ALPlus $CM+ / $LB5Breaks; + +## problem state table can't handle lookahead when it is at the +## start of the string, currently handled in the rbbi code +## todo fix this + +## ------------------------------------------------- + +!!safe_reverse; + +# LB 6 +$V+ $L; + +# LB 7 +$CM+ [^$CM $BK $CR $LF $NL $ZW $SP]; +$CM+ $SP / .; + +# LB 9 +$SP+ $CM* $OP; + +# LB 10 +$SP+ $CM* $QU; + +# LB 11 +$SP+ $CM* $CL; + +# LB 18 +($CM* ($IS | $SY))+ $CM* $NU; +$CL $CM* ($NU | $IS | $SY); + +## ------------------------------------------------- + +!!safe_forward; + +# LB 6 +$V+ $T; + +# LB 7 +[^$BK $CR $LF $NL $ZW $SP] $CM+; +$SP $CM+ / [^$CM]; + +# LB 9 +$OP $CM* $SP+; + +# LB 10 +$QU $CM* $SP+; -$SpaceGlue = ([$ZW $CL $IS $NS $OP] ($Extend* $SP)) | (($Extend* $SP)+ $OP); -$ClumpingChars = [^$SP $BK $CR $LF]; +# LB 11 +$CL $CM* $SP+; -!. . $ClumpingChars* ($SpaceGlue $ClumpingChars*)* (. | $LF $CR); +# LB 18 +$CM* $PRcm? ($OPcm | $HYcm)? $NU; diff --git a/icuSources/data/brkitr/line_th.txt b/icuSources/data/brkitr/line_th.txt index 383b44c7..6a151836 100644 --- a/icuSources/data/brkitr/line_th.txt +++ b/icuSources/data/brkitr/line_th.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2002, International Business Machines Corporation and +# Copyright (c) 2002-2003, International Business Machines Corporation and # others. All Rights Reserved. # # file: line.txt @@ -266,29 +266,29 @@ $thai_etc = $paiyannoi \u0e25 $paiyannoi; # $Extend = # From UNIDATA/DerivedCoreProperties.txt [\u0300-\u034E \u0360-\u036F \u0483-\u0486 \u0488-\u0489 \u0591-\u05A1 \u05A3-\u05B9 - \u05BB-\u05BD \u05BF \u05C1-\u05C2 \u05C4 \u064B-\u0655 \u0670 \u06D6-\u06DC - \u06DE \u06DF-\u06E4 \u06E7-\u06E8 \u06EA-\u06ED \u0711 \u0730-\u074A - \u07A6-\u07B0 \u0901-\u0902 \u0903 \u093C \u093E-\u0940 \u0941-\u0948 - \u0949-\u094C \u0951-\u0954 \u0962-\u0963 \u0981 \u0982-\u0983 \u09BC - \u09BE-\u09C0 \u09C1-\u09C4 \u09C7-\u09C8 \u09CB-\u09CC \u09D7 \u09E2-\u09E3 - \u0A02 \u0A3C \u0A3E-\u0A40 \u0A41-\u0A42 \u0A47-\u0A48 \u0A4B-\u0A4C - \u0A70-\u0A71 \u0A81-\u0A82 \u0A83 \u0ABC \u0ABE-\u0AC0 \u0AC1-\u0AC5 - \u0AC7-\u0AC8 \u0AC9 \u0ACB-\u0ACC \u0B01 \u0B02-\u0B03 \u0B3C \u0B3E - \u0B3F \u0B40 \u0B41-\u0B43 \u0B47-\u0B48 \u0B4B-\u0B4C \u0B56 \u0B57 - \u0B82 \u0BBE-\u0BBF \u0BC0 \u0BC1-\u0BC2 \u0BC6-\u0BC8 \u0BCA-\u0BCC \u0BD7 + \u05BB-\u05BD \u05BF \u05C1-\u05C2 \u05C4 \u064B-\u0655 \u0670 \u06D6-\u06DC + \u06DE \u06DF-\u06E4 \u06E7-\u06E8 \u06EA-\u06ED \u0711 \u0730-\u074A + \u07A6-\u07B0 \u0901-\u0902 \u0903 \u093C \u093E-\u0940 \u0941-\u0948 + \u0949-\u094C \u0951-\u0954 \u0962-\u0963 \u0981 \u0982-\u0983 \u09BC + \u09BE-\u09C0 \u09C1-\u09C4 \u09C7-\u09C8 \u09CB-\u09CC \u09D7 \u09E2-\u09E3 + \u0A02 \u0A3C \u0A3E-\u0A40 \u0A41-\u0A42 \u0A47-\u0A48 \u0A4B-\u0A4C + \u0A70-\u0A71 \u0A81-\u0A82 \u0A83 \u0ABC \u0ABE-\u0AC0 \u0AC1-\u0AC5 + \u0AC7-\u0AC8 \u0AC9 \u0ACB-\u0ACC \u0B01 \u0B02-\u0B03 \u0B3C \u0B3E + \u0B3F \u0B40 \u0B41-\u0B43 \u0B47-\u0B48 \u0B4B-\u0B4C \u0B56 \u0B57 + \u0B82 \u0BBE-\u0BBF \u0BC0 \u0BC1-\u0BC2 \u0BC6-\u0BC8 \u0BCA-\u0BCC \u0BD7 \u0C01-\u0C03 \u0C3E-\u0C40 \u0C41-\u0C44 \u0C46-\u0C48 \u0C4A-\u0C4C - \u0C55-\u0C56 \u0C82-\u0C83 \u0CBE \u0CBF \u0CC0-\u0CC4 \u0CC6 - \u0CC7-\u0CC8 \u0CCA-\u0CCB \u0CCC \u0CD5-\u0CD6 \u0D02-\u0D03 \u0D3E-\u0D40 - \u0D41-\u0D43 \u0D46-\u0D48 \u0D4A-\u0D4C \u0D57 \u0D82-\u0D83 \u0DCF-\u0DD1 - \u0DD2-\u0DD4 \u0DD6 \u0DD8-\u0DDF \u0DF2-\u0DF3 \u0E31 \u0E34-\u0E39 - \u0E47-\u0E4E \u0EB1 \u0EB4-\u0EB9 \u0EBB-\u0EBC \u0EC8-\u0ECD \u0F18-\u0F19 - \u0F35 \u0F37 \u0F39 \u0F3E-\u0F3F \u0F71-\u0F7E \u0F7F \u0F80-\u0F84 - \u0F86-\u0F87 \u0F90-\u0F97 \u0F99-\u0FBC \u0FC6 \u102C \u102D-\u1030 \u1031 - \u1032 \u1036-\u1037 \u1038 \u1056-\u1057 \u1058-\u1059 \u1712-\u1714 + \u0C55-\u0C56 \u0C82-\u0C83 \u0CBE \u0CBF \u0CC0-\u0CC4 \u0CC6 + \u0CC7-\u0CC8 \u0CCA-\u0CCB \u0CCC \u0CD5-\u0CD6 \u0D02-\u0D03 \u0D3E-\u0D40 + \u0D41-\u0D43 \u0D46-\u0D48 \u0D4A-\u0D4C \u0D57 \u0D82-\u0D83 \u0DCF-\u0DD1 + \u0DD2-\u0DD4 \u0DD6 \u0DD8-\u0DDF \u0DF2-\u0DF3 \u0E31 \u0E34-\u0E39 + \u0E47-\u0E4E \u0EB1 \u0EB4-\u0EB9 \u0EBB-\u0EBC \u0EC8-\u0ECD \u0F18-\u0F19 + \u0F35 \u0F37 \u0F39 \u0F3E-\u0F3F \u0F71-\u0F7E \u0F7F \u0F80-\u0F84 + \u0F86-\u0F87 \u0F90-\u0F97 \u0F99-\u0FBC \u0FC6 \u102C \u102D-\u1030 \u1031 + \u1032 \u1036-\u1037 \u1038 \u1056-\u1057 \u1058-\u1059 \u1712-\u1714 \u1732-\u1734 \u1752-\u1753 \u1772-\u1773 \u17B4-\u17B6 \u17B7-\u17BD - \u17BE-\u17C5 \u17C6 \u17C7-\u17C8 \u17C9-\u17D1 \u17D3 \u180B-\u180D - \u18A9 \u20D0-\u20DC \u20DD-\u20E0 \u20E1 \u20E2-\u20E4 \u20E5-\u20EA - \u302A-\u302F \u3099-\u309A \uFB1E \uFE00-\uFE0F \uFE20-\uFE23 \uFF9E-\uFF9F + \u17BE-\u17C5 \u17C6 \u17C7-\u17C8 \u17C9-\u17D1 \u17D3 \u180B-\u180D + \u18A9 \u20D0-\u20DC \u20DD-\u20E0 \u20E1 \u20E2-\u20E4 \u20E5-\u20EA + \u302A-\u302F \u3099-\u309A \uFB1E \uFE00-\uFE0F \uFE20-\uFE23 \uFF9E-\uFF9F \U0001D165-\U0001D166 \U0001D167-\U0001D169 \U0001D16D-\U0001D172 \U0001D17B-\U0001D182 \U0001D185-\U0001D18B \U0001D1AA-\U0001D1AD]; @@ -347,21 +347,21 @@ $Closings = ($SPcm*( ($CL ($SPcm* $NScm)? | $EX | $IS | $SY) $Extend*) | $B # Words. Includes mixed Alpha-numerics. # Rules 11a, 16, 17, 19, more or less. # -$NumberInterior = $IDcm | ($NUcm | $ALcm | $IS $NUcm)+; -$Number = $PR? ($OPcm | $HYcm)? $NumberInterior $CL? $POcm?; # Fancy Number 18 -$Word = (($IDcm | ($ALcm | $NUcm)+) ($POcm? | $INcm?)); # Alpha-numeric. 16, 17 -$Dashes = (($B2cm $SPcm*)*); # Dashes 11a +$NumberInterior = $IDcm | ($NUcm | $ALcm | $IS $NUcm)+; +$Number = $PR? ($OPcm | $HYcm)? $NumberInterior $CL? $POcm?; # Fancy Number 18 +$Word = (($IDcm | ($ALcm | $NUcm)+) ($POcm? | $INcm?)); # Alpha-numeric. 16, 17 +$Dashes = (($B2cm $SPcm*)*); # Dashes 11a $ThaiRange = $dictionary+ | $thai_etc; $WordLikeThing = $Number | $Word | $Dashes | $ThaiRange; - - + + $Word15 = ($BBcm* ($WordLikeThing)? ($BAcm | $HYcm | $NScm)*) | # Rule 15. Stuff sticks around words. - [^[:Cc:] $BK $CR $LF $ZW $SP $GL] $Extend* | # Allow characters that don't meet the - [^$BK $CR $LF $ZW $SP $GL ]; # more elaborate definitions for WORD - # to be glued. - + [^[:Cc:] $BK $CR $LF $ZW $SP $GL] $Extend* | # Allow characters that don't meet the + [^$BK $CR $LF $ZW $SP $GL ]; # more elaborate definitions for WORD to be glued. + + $GluedWord = ($GLcm | $QUcm)? $Word15 (($GLcm | $QUcm) $Word15)*; # "Glue" will stick anything below it together. # Rules 13, 14 @@ -371,10 +371,10 @@ $GluedWord = ($GLcm | $QUcm)? $Word15 (($GLcm | $QUcm) $Word15)*; # "Glue" wil $Openings $GluedWord $Closings $paiyannoi? $EndingsMandatory; $Openings $GluedWord $Closings $Endings; -$Openings $GluedWord $Closings $paiyannoi / +$Openings $GluedWord $Closings $paiyannoi / ([^\u0e25 $Extend] | \u0e25[^$paiyannoi $Extend]); - - + + #"$word($nbsp+$word)*$paiyannoi/([^[\u0e25$_ignore_]]|" # + "\u0e25[^$paiyannoi$_ignore_]);" diff --git a/icuSources/data/brkitr/sent.txt b/icuSources/data/brkitr/sent.txt index 14b568ba..c13b22d7 100644 --- a/icuSources/data/brkitr/sent.txt +++ b/icuSources/data/brkitr/sent.txt @@ -1,41 +1,39 @@ # -# Copyright (C) 2002-2003, International Business Machines Corporation and others. +# Copyright (C) 2002-2004, International Business Machines Corporation and others. # All Rights Reserved. # -# file: sent.txt +# file: sent.txt # # ICU Sentence Break Rules # See Unicode Standard Annex #29. # These rules are based on TR 29 version 4.0.0 # - + # # Character categories as defined in TR 29 # $Sep = [\u000a \u000d \u0085 \u2028 \u2029]; -$Format = [[:Format:]]; +$Format = [[:Format:] - [:Grapheme_Extend:]]; $Sp = [[:Whitespace:] - $Sep]; $Lower = [[:Lowercase:]]; $Upper = [[:TitleCase_Letter:] [:Uppercase:]]; $OLetter = [[:Alphabetic:] [:name = HEBREW PUNCTUATION GERESH:] - [$Lower $Upper]]; -$Numeric = [:LineBreak = Numeric:]; +$Numeric = [[:Nd:][:name = ARABIC DECIMAL SEPARATOR:][:name = ARABIC THOUSANDS SEPARATOR:]]; + +$ATerm = [.]; -$ATerm = [.]; +$Term = [:STerm:]; -$Term = [\u0021 \u003F \u0589 \u061F \u06D4 \u0700 \u0701 \u0702 \u0964 \u1362 - \u1367 \u1368 \u104a \u104b \u166e \u1803 \u1809 \u203C \u203D \u2047 - \u2048 \u2049 \u3002 \uFE52 \uFE57 \uFF01 \uFF0E \uFF1F \uFF61]; - $Close = [[:Open_Punctuation:] [:Close_Punctuation:] [:Linebreak = Quotation:] - [[:name = HEBREW PUNCTUATION GERESH:] $ATerm $Term]]; - - + + # Define extended forms of the character classes, # incorporate grapheme cluster + format chars. -$Extend = [[:Grapheme_Extend = TRUE:]]; +$Extend = [[:Grapheme_Extend = TRUE:]]; $ATermEx = $ATerm $Extend* $Format*; $NumericEx = $Numeric $Extend* $Format*; $UpperEx = $Upper $Extend* $Format*; @@ -49,6 +47,9 @@ $SepSeq = $Sep | \u000d\u000a; # $InteriorChars are those that never trigger a following break. $InteriorChars = [^$Term $ATerm $Sep]; #Note: includes Extend and Format chars +## ------------------------------------------------- + +!!forward; # Rule 6. Match an ATerm (.) that does not cause a break because a number immediately follows it. $NumberFollows = $InteriorChars* $ATermEx $NumericEx; @@ -64,24 +65,86 @@ $LowerWordFollows = $InteriorChars* $ATermEx $Close* $Sp* [^$OLetter $Upper $Lo # Rules 3, 9, 10, 11 # Matches a simple sentence, or the trailing part of a complex sentence, # where a simple sentence contains no interior "."s. -$EndSequence = $InteriorChars* ($TermEx | $ATermEx) $Close* $Sp* $SepSeq? | - $InteriorChars* $SepSeq?; +$TermEndSequence = $InteriorChars* ($TermEx | $ATermEx) $Close* $Sp* $SepSeq?; +$EndSequence = $InteriorChars* $SepSeq?; +# Put them all together. +($NumberFollows | $UppersSurround | $LowerWordFollows)* $TermEndSequence{0}; # status = UBRK_SENTENCE_TERM +($NumberFollows | $UppersSurround | $LowerWordFollows)* $EndSequence{100}; # status = UBRK_SENTENCE_SEP +## ------------------------------------------------- -# Put them all together. -($NumberFollows | $UppersSurround | $LowerWordFollows)* $EndSequence; +!!reverse; - -# -# Reverse Rules -# -$EndGorp = ($Term | $ATerm | $Sep | $Close | $Extend | $Format | $Sp); -$RevEndSequence = $EndGorp* $InteriorChars* $EndGorp* | $Sep [^$ATerm $Term]*; -$ReverseLowerWordFollows = $Lower [^$OLetter $Upper $Lower $Sep]* $ATerm $InteriorChars*; -$ReverseUpperSurround = $Upper $Format* $Extend* $ATerm $Format* $Extend* $Upper $InteriorChars*; -$ReverseNumberFollows = $Numeric $Format* $Extend* $ATerm $InteriorChars*; - -! $RevEndSequence ($ReverseLowerWordFollows | $ReverseUpperSurround | $ReverseNumberFollows)* .?; -#! .*; - +# rule 6 + +$RULE6 = $Numeric $Format* $Extend* $ATerm; + +# rule 7 + +$RULE7 = $Upper $Format* $Extend* $ATerm $Format* $Extend* $Upper; + +# rule 8 + +$RULE8 = $Lower ($Format* $Extend* [^$OLetter $Upper $Lower $Sep])* + ($Format* $Extend* $Sp)* ($Format* $Extend* $Close)* + $Format* $Extend* $ATerm; + +# rule 9, 10, 11 + +# $CR $LF +$End = $Sep | \u000a\u000d + | $Format* $Extend* $Sp* $Format* $Extend* $Close* $Format* + $Extend* ($Term | $ATerm) + | $Sep $Format* $Extend* $Sp* $Format* $Extend* $Close* $Format* + $Extend* ($Term | $ATerm); + +# rule 12 + +$RULE12 = [^$Sep $Term $ATerm]; + +$Join = ($RULE6 | $RULE7 | $RULE8 | $RULE12)*; + +$End; + +$End? $Join [$RULE12 - $Sp - $Close]; + +# forces a break at the beginning of text "$Sp blah blah blah" +# remember the break iterators takes the longest match +$End? $Join $Sp / [^$Term $ATerm $Sp $Close]; + +# forces a break at the beginning of text "$Close blah blah blah" +$End? $Join $Close / [^$Term $ATerm $Close]; + +## ------------------------------------------------- + +!!safe_reverse; + +# rule 4 +$Extend+ [^$Extend]; + +# rule 7 +$Extend* $ATerm $Format* $Extend* $Upper; + +# rule 8 +($Extend* $Term)+ ($Extend* $Sp $Format*)* ($Extend* $Close $Format*)* $Extend* $ATerm; + +# rule 11 +($Extend* $Sp $Format*)* ($Extend* $Close $Format*)*; +($Extend* $Sp $Format*)* ($Extend* $Close $Format*)* $Extend* ($Term | $ATerm); + +## ------------------------------------------------- + +!!safe_forward; + +# rule 7 + +$ATerm $Extend* $Format* $Upper; + +# rule 8 + +$Lower .; + +# rule 11 + +($Close $Extend* $Format*)* ($Sp $Extend* $Format*)*; diff --git a/icuSources/data/brkitr/title.txt b/icuSources/data/brkitr/title.txt index d12517f6..e3f6566c 100644 --- a/icuSources/data/brkitr/title.txt +++ b/icuSources/data/brkitr/title.txt @@ -11,7 +11,7 @@ $NotCased = [^ $Cased]; # # If the iterator was not stopped on a cased character, advance it to the first cased char # -($NotCased | $CaseIgnorable)*; +$NotCased+; # # If the iterator starts on a cased item, advance through all adjacent cased items plus @@ -22,5 +22,11 @@ $Cased ($Cased | $CaseIgnorable)* $NotCased*; # # Reverse Rules # -!$NotCased* ($Cased | $CaseIgnorable)* $NotCased?; +! $NotCased+; + +# +# If the iterator starts on a cased item, advance through all adjacent cased items plus +# any non-cased stuff, to reach the start of the next word. +# +! $NotCased* ($Cased | $CaseIgnorable)* $Cased; \ No newline at end of file diff --git a/icuSources/data/brkitr/word.txt b/icuSources/data/brkitr/word.txt index f8bc820c..1fdaa3a0 100644 --- a/icuSources/data/brkitr/word.txt +++ b/icuSources/data/brkitr/word.txt @@ -1,132 +1,236 @@ # -# Copyright (C) 2002-2003, International Business Machines Corporation and others. -# All Rights Reserved. +# Copyright (C) 2002-2004, International Business Machines Corporation +# and others. All Rights Reserved. # -# file: word.txt +# file: word.txt # -# ICU Word Break Rules +# ICU Word Break Rules # See Unicode Standard Annex #29. -# These rules are based on Version 4.0.0, dated 2003-04-17 +# These rules are based on Version 4.1 draft, dated 2004-11-11 # - - -#################################################################################### +############################################################################## # # Character class definitions from TR 29 # -#################################################################################### -$Katakana = [[:Script = KATAKANA:] [:name = KATAKANA-HIRAGANA PROLONGED SOUND MARK:] - [:name = HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK:] - [:name = HALFWIDTH KATAKANA VOICED SOUND MARK:] - [:name = HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK:]]; - - -$ALetter = [[:Alphabetic:] [:name= HEBREW PUNCTUATION GERESH:] - - [:Ideographic:] - - $Katakana - - [:Script = Thai:] - - [:Script = Lao:] - - [:Script = Hiragana:]]; - -$MidLetter = [[:name = APOSTROPHE:] [:name = MIDDLE DOT:] [:name = HEBREW PUNCTUATION GERSHAYIM:] - [:name = RIGHT SINGLE QUOTATION MARK:] [:name = HYPHENATION POINT:]]; - -$MidNumLet = [[:name = FULL STOP:] [:name = COLON:]]; - -$MidNum = [[:LineBreak = Infix_Numeric:] - $MidNumLet]; -$Numeric = [:LineBreak = Numeric:]; - +############################################################################## + +!!chain; + +$Katakana = [[:Script = KATAKANA:] + [:name = VERTICAL KANA REPEAT MARK:] + [:name = VERTICAL KANA REPEAT WITH VOICED SOUND MARK:] + [:name = VERTICAL KANA REPEAT MARK UPPER HALF:] + [:name = VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF:] + [:name = VERTICAL KANA REPEAT MARK LOWER HALF:] + [:name = KATAKANA-HIRAGANA VOICED SOUND MARK:] + [:name = KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK:] + [:name = KATAKANA-HIRAGANA DOUBLE HYPHEN:] + [:name = KATAKANA-HIRAGANA PROLONGED SOUND MARK:] + [:name = HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK:] + [:name = HALFWIDTH KATAKANA VOICED SOUND MARK:] + [:name = HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK:]]; + + +$ALetter = [[:Alphabetic:] [:name= HEBREW PUNCTUATION GERESH:] + - [:Ideographic:] + - $Katakana + - [:Script = Hiragana:] + - [:Script = Lao:] + - [:Grapheme_Extend = TRUE:]]; + +$MidLetter = [[:name = APOSTROPHE:] [:name = MIDDLE DOT:] + [:name = HEBREW PUNCTUATION GERSHAYIM:] + [:name = RIGHT SINGLE QUOTATION MARK:] + [:name = HYPHENATION POINT:] + [:name = COLON:]]; + + +$MidNum = [[:LineBreak = Infix_Numeric:] - [:name = COLON:]]; +$Numeric = [[:Nd:][:name = ARABIC DECIMAL SEPARATOR:][:name = ARABIC THOUSANDS SEPARATOR:]]; +$ExtendNumLet = [[:Connector_Punctuation:] + - [:name = KATAKANA MIDDLE DOT:] + - [:name = HALFWIDTH KATAKANA MIDDLE DOT:]]; + + # # Character Class Definitions. # The names are those from TR29. # -$CR = \u000d; -$LF = \u000a; -$Control = [[:Zl:] [:Zp:] [:Cc:] [:Cf:]]; -$Extend = [[:Grapheme_Extend = TRUE:]]; +$CR = \u000d; +$LF = \u000a; +$Extend = [[:Grapheme_Extend = TRUE:]]; +$Control = [[:Zl:] [:Zp:] [:Cc:] [:Cf:] - $Extend]; +$Format = [[:Cf:] - $Extend]; +$Hiragana = [:Hiragana:]; +$Ideographic = [:IDEOGRAPHIC:]; +$ALetterEx = $ALetter $Extend*; +$NumericEx = $Numeric $Extend*; +$MidNumEx = $MidNum $Extend*; +$MidLetterEx = $MidLetter $Extend*; +$KatakanaEx = $Katakana $Extend*; +$ExtendNumLetEx = $ExtendNumLet $Extend*; +## ------------------------------------------------- -#################################################################################### -# -# Word Break Rules. Definitions and Rules specific to word break begin Here. -# -#################################################################################### +!!forward; -$Format = [[:Cf:]]; +# Rule 3 - don't break grapheme clusters. +# see character breaks +$CR $LF; +#[^$Control] $Extend*; +#$NumericEx $Extend* {100}; +#$ALetterEx $Extend* {200}; +[^$Control] $Extend+; +$NumericEx {100}; +$ALetterEx {200}; +$KatakanaEx {300}; -# Rule 3: Treat a grapheme cluster as if it were a single character. -# Hangul Syllables are easier to deal with here than they are in Grapheme Clusters -# because we don't need to find the boundaries between adjacent syllables - -# they won't be word boundaries. -# +# rule 5 +$ALetterEx $Format* $ALetterEx {200}; -# -# "Extended" definitions. Grapheme Cluster + Format Chars, treated like the base char. -# -$ALetterEx = $ALetter $Extend*; -$NumericEx = $Numeric $Extend*; -$MidNumEx = $MidNum $Extend*; -$MidNumLetEx = $MidNumLet $Extend*; -$MidLetterEx = $MidLetter $Extend*; -$KatakanaEx = $Katakana $Extend*; -$FormatEx = $Format $Extend*; +# rule 6 and 7 +$ALetterEx $Format* $MidLetterEx $Format* $ALetterEx {200}; +# rule 8 -# -# Numbers. Rules 8, 11, 12 form the TR. -# -$NumberSequence = $NumericEx ($FormatEx* ($MidNumEx | $MidNumLetEx)? $FormatEx* $NumericEx)*; -$NumberSequence {100}; +$NumericEx $Format* $NumericEx {100}; -# -# Words. Alpha-numerics. Rule 5, 6, 7, 9, 10 -# - must include at least one letter. -# - may include both letters and numbers. -# - may include MideLetter, MidNumber punctuation. -# -$LetterSequence = $ALetterEx ($FormatEx* ($MidLetterEx | $MidNumLetEx)? $FormatEx* $ALetterEx)*; # rules #6, #7 -($NumberSequence $FormatEx*)? $LetterSequence ($FormatEx* ($NumberSequence | $LetterSequence))* {200}; +# rule 9 -# -# Do not break between Katakana. Rule #13. -# -$KatakanaEx ($FormatEx* $KatakanaEx)* {300}; -[:Hiragana:] $Extend* {300}; +$ALetterEx $Format* $NumericEx {200}; -# -# Ideographic Characters. Stand by themselves as words. -# Separated from the "Everything Else" rule, below, only so that they -# can be tagged with a return value. TODO: is this what we want? -# -[:IDEOGRAPHIC:] $Extend* {400}; +# rule 10 -# -# Everything Else, with no tag. -# Non-Control chars combine with $Extend (combining) chars. -# Controls are do not. -# -[^$Control [:Ideographic:]] $Extend*; -$CR $LF; +$NumericEx $Format* $ALetterEx {200}; -# -# Reverse Rules. Back up over any of the chars that can group together. -# (Reverse rules do not need to be exact; they can back up too far, -# but must back up at least enough, and must stop on a boundary.) -# +# rule 11 and 12 + +$NumericEx $Format* $MidNumEx $Format* $NumericEx {100}; + +# rule 13 + +$KatakanaEx $Format* $KatakanaEx {300}; +$Hiragana $Extend* {300}; +$Ideographic $Extend* {400}; + +# rule 13a/b + +$ALetterEx $Format* $ExtendNumLetEx {200}; # (13a) +$NumericEx $Format* $ExtendNumLetEx {100}; # (13a) +$KatakanaEx $Format* $ExtendNumLetEx {300}; # (13a) +$ExtendNumLetEx $Format* $ExtendNumLetEx{200}; # (13a) + +$ExtendNumLetEx $Format* $ALetterEx {200}; # (13b) +$ExtendNumLetEx $Format* $NumericEx {100}; # (13b) +$ExtendNumLetEx $Format* $KatakanaEx {300}; # (13b) + + + +## ------------------------------------------------- -# NonStarters are the set of all characters that can appear at the 2nd - nth position of -# a word. (They may also be the first.) The reverse rule skips over these, until it -# reaches something that can only be the start (and probably only) char in a "word". -# A space or punctuation meets the test. +!!reverse; + +$BackALetterEx = $Extend* $ALetter; +$BackNumericEx = $Extend* $Numeric; +$BackMidNumEx = $Extend* $MidNum; +$BackMidLetterEx = $Extend* $MidLetter; +$BackKatakanaEx = $Extend* $Katakana; +$BackExtendNumLetEx= $Extend* $ExtendNumLet; + +$LF $CR; + +# see character breaks + +$Extend* [^$Control]; + +# rule 5 + +$BackALetterEx $Format* $BackALetterEx; + +# rule 6 and 7 + +$BackALetterEx $Format* $BackMidLetterEx $Format* $BackALetterEx; + + +# rule 8 + +$BackNumericEx $Format* $BackNumericEx; + +# rule 9 + +$BackNumericEx $Format* $BackALetterEx; + +# rule 10 + +$BackALetterEx $Format* $BackNumericEx; + +# rule 11 and 12 + +$BackNumericEx $Format* $BackMidNumEx $Format* $BackNumericEx; + +# rule 13 + +$BackKatakanaEx $Format* $BackKatakanaEx; + +# rules 13 a/b # -$NonStarters = [$Numeric $ALetter $Katakana $MidLetter $MidNum $MidNumLet $Extend $Format]; +($BackALetterEx | $BackNumericEx | $BackKatakanaEx | $BackExtendNumLetEx) $Format* $BackExtendNumLetEx; +$BackExtendNumLetEx $Format* ($BackALetterEx | $BackNumericEx | $BackKatakanaEx); + +## ------------------------------------------------- + +!!safe_reverse; + +# rule 3 +$Extend+ [^$Extend]; +$Extend+; # comes into play when buffer _begins_ with an $Extend+. + +# rule 4 +$Format+ $BackALetterEx; +$Format+ $BackNumericEx; +$Format+ $BackMidLetterEx; +$Format+ $BackMidNumEx; +$Format+ $BackKatakanaEx; +$Format+ $BackExtendNumLetEx; + + +# rule 6 +$MidLetter $Format* $BackALetterEx; + +# rule 11 +$MidNum $Format* $BackNumericEx; + +## ------------------------------------------------- + +!!safe_forward; + +# rule 3 +$Extend+; + +# rule 4 +$Extend* $Format+ $ALetterEx; +$Extend* $Format+ $NumericEx; +$Extend* $Format+ $MidLetterEx; +$Extend* $Format+ $MidNumEx; +$Extend* $Format+ $KatakanaEx; +$Extend* $Format+ $ExtendNumLetEx; + +$Extend+ $Format* $ALetterEx; +$Extend+ $Format* $NumericEx; +$Extend+ $Format* $MidLetterEx; +$Extend+ $Format* $MidNumEx; +$Extend+ $Format* $KatakanaEx; +$Extend+ $Format* $ExtendNumLetEx; + +# rule 6 +$MidLetterEx $Format* $ALetterEx; -#!.*; -! ($NonStarters* | \n \r) .; +# rule 11 +$MidNumEx $Format* $NumericEx; diff --git a/icuSources/data/brkitr/word_POSIX.txt b/icuSources/data/brkitr/word_POSIX.txt new file mode 100644 index 00000000..dc58f9a2 --- /dev/null +++ b/icuSources/data/brkitr/word_POSIX.txt @@ -0,0 +1,235 @@ +# +# Copyright (C) 2002-2004, International Business Machines Corporation +# and others. All Rights Reserved. +# +# file: word_POSIX.txt +# +# ICU Word Break Rules +# See Unicode Standard Annex #29. +# These rules are based on Version 4.1 draft, dated 2004-11-11 +# + +############################################################################## +# +# Character class definitions from TR 29 +# +############################################################################## + +!!chain; + +$Katakana = [[:Script = KATAKANA:] + [:name = VERTICAL KANA REPEAT MARK:] + [:name = VERTICAL KANA REPEAT WITH VOICED SOUND MARK:] + [:name = VERTICAL KANA REPEAT MARK UPPER HALF:] + [:name = VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF:] + [:name = VERTICAL KANA REPEAT MARK LOWER HALF:] + [:name = KATAKANA-HIRAGANA VOICED SOUND MARK:] + [:name = KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK:] + [:name = KATAKANA-HIRAGANA DOUBLE HYPHEN:] + [:name = KATAKANA-HIRAGANA PROLONGED SOUND MARK:] + [:name = HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK:] + [:name = HALFWIDTH KATAKANA VOICED SOUND MARK:] + [:name = HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK:]]; + + +$ALetter = [[:Alphabetic:] [:name= HEBREW PUNCTUATION GERESH:] + - [:Ideographic:] + - $Katakana + - [:Script = Hiragana:] + - [:Script = Lao:] + - [:Grapheme_Extend = TRUE:]]; + +$MidLetter = [[:name = APOSTROPHE:] [:name = MIDDLE DOT:] + [:name = HEBREW PUNCTUATION GERSHAYIM:] + [:name = RIGHT SINGLE QUOTATION MARK:] + [:name = HYPHENATION POINT:]]; + + +$MidNum = [[:LineBreak = Infix_Numeric:]]; +$Numeric = [[:Nd:][:name = ARABIC DECIMAL SEPARATOR:][:name = ARABIC THOUSANDS SEPARATOR:]]; +$ExtendNumLet = [[:Connector_Punctuation:] + - [:name = KATAKANA MIDDLE DOT:] + - [:name = HALFWIDTH KATAKANA MIDDLE DOT:]]; + + + +# +# Character Class Definitions. +# The names are those from TR29. +# + +$CR = \u000d; +$LF = \u000a; +$Extend = [[:Grapheme_Extend = TRUE:]]; +$Control = [[:Zl:] [:Zp:] [:Cc:] [:Cf:] - $Extend]; +$Format = [[:Cf:] - $Extend]; +$Hiragana = [:Hiragana:]; +$Ideographic = [:IDEOGRAPHIC:]; + +$ALetterEx = $ALetter $Extend*; +$NumericEx = $Numeric $Extend*; +$MidNumEx = $MidNum $Extend*; +$MidLetterEx = $MidLetter $Extend*; +$KatakanaEx = $Katakana $Extend*; +$ExtendNumLetEx = $ExtendNumLet $Extend*; + +## ------------------------------------------------- + +!!forward; + + +# Rule 3 - don't break grapheme clusters. +# see character breaks + +$CR $LF; +#[^$Control] $Extend*; +#$NumericEx $Extend* {100}; +#$ALetterEx $Extend* {200}; +[^$Control] $Extend+; +$NumericEx {100}; +$ALetterEx {200}; +$KatakanaEx {300}; + +# rule 5 + +$ALetterEx $Format* $ALetterEx {200}; + +# rule 6 and 7 +$ALetterEx $Format* $MidLetterEx $Format* $ALetterEx {200}; + +# rule 8 + +$NumericEx $Format* $NumericEx {100}; + +# rule 9 + +$ALetterEx $Format* $NumericEx {200}; + +# rule 10 + +$NumericEx $Format* $ALetterEx {200}; + +# rule 11 and 12 + +$NumericEx $Format* $MidNumEx $Format* $NumericEx {100}; + +# rule 13 + +$KatakanaEx $Format* $KatakanaEx {300}; +$Hiragana $Extend* {300}; +$Ideographic $Extend* {400}; + +# rule 13a/b + +$ALetterEx $Format* $ExtendNumLetEx {200}; # (13a) +$NumericEx $Format* $ExtendNumLetEx {100}; # (13a) +$KatakanaEx $Format* $ExtendNumLetEx {300}; # (13a) +$ExtendNumLetEx $Format* $ExtendNumLetEx{200}; # (13a) + +$ExtendNumLetEx $Format* $ALetterEx {200}; # (13b) +$ExtendNumLetEx $Format* $NumericEx {100}; # (13b) +$ExtendNumLetEx $Format* $KatakanaEx {300}; # (13b) + + + +## ------------------------------------------------- + +!!reverse; + +$BackALetterEx = $Extend* $ALetter; +$BackNumericEx = $Extend* $Numeric; +$BackMidNumEx = $Extend* $MidNum; +$BackMidLetterEx = $Extend* $MidLetter; +$BackKatakanaEx = $Extend* $Katakana; +$BackExtendNumLetEx= $Extend* $ExtendNumLet; + +$LF $CR; + +# see character breaks + +$Extend* [^$Control]; + +# rule 5 + +$BackALetterEx $Format* $BackALetterEx; + +# rule 6 and 7 + +$BackALetterEx $Format* $BackMidLetterEx $Format* $BackALetterEx; + + +# rule 8 + +$BackNumericEx $Format* $BackNumericEx; + +# rule 9 + +$BackNumericEx $Format* $BackALetterEx; + +# rule 10 + +$BackALetterEx $Format* $BackNumericEx; + +# rule 11 and 12 + +$BackNumericEx $Format* $BackMidNumEx $Format* $BackNumericEx; + +# rule 13 + +$BackKatakanaEx $Format* $BackKatakanaEx; + +# rules 13 a/b +# +($BackALetterEx | $BackNumericEx | $BackKatakanaEx | $BackExtendNumLetEx) $Format* $BackExtendNumLetEx; +$BackExtendNumLetEx $Format* ($BackALetterEx | $BackNumericEx | $BackKatakanaEx); + +## ------------------------------------------------- + +!!safe_reverse; + +# rule 3 +$Extend+ [^$Extend]; +$Extend+; # comes into play when buffer _begins_ with an $Extend+. + +# rule 4 +$Format+ $BackALetterEx; +$Format+ $BackNumericEx; +$Format+ $BackMidLetterEx; +$Format+ $BackMidNumEx; +$Format+ $BackKatakanaEx; +$Format+ $BackExtendNumLetEx; + + +# rule 6 +$MidLetter $Format* $BackALetterEx; + +# rule 11 +$MidNum $Format* $BackNumericEx; + +## ------------------------------------------------- + +!!safe_forward; + +# rule 3 +$Extend+; + +# rule 4 +$Extend* $Format+ $ALetterEx; +$Extend* $Format+ $NumericEx; +$Extend* $Format+ $MidLetterEx; +$Extend* $Format+ $MidNumEx; +$Extend* $Format+ $KatakanaEx; +$Extend* $Format+ $ExtendNumLetEx; + +$Extend+ $Format* $ALetterEx; +$Extend+ $Format* $NumericEx; +$Extend+ $Format* $MidLetterEx; +$Extend+ $Format* $MidNumEx; +$Extend+ $Format* $KatakanaEx; +$Extend+ $Format* $ExtendNumLetEx; + +# rule 6 +$MidLetterEx $Format* $ALetterEx; + +# rule 11 +$MidNumEx $Format* $NumericEx; diff --git a/icuSources/data/brkitr/word_ja.txt b/icuSources/data/brkitr/word_ja.txt new file mode 100644 index 00000000..d36b2492 --- /dev/null +++ b/icuSources/data/brkitr/word_ja.txt @@ -0,0 +1,250 @@ +# +# Copyright (C) 2002-2004, International Business Machines Corporation +# and others. All Rights Reserved. +# +# file: word_ja.txt +# +# ICU Word Break Rules +# See Unicode Standard Annex #29. +# These rules are based on Version 4.1 draft, dated 2004-11-11 +# + +############################################################################## +# +# Character class definitions from TR 29 +# +############################################################################## + +!!chain; + +$Katakana = [[:Script = KATAKANA:] + [:name = VERTICAL KANA REPEAT MARK:] + [:name = VERTICAL KANA REPEAT WITH VOICED SOUND MARK:] + [:name = VERTICAL KANA REPEAT MARK UPPER HALF:] + [:name = VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF:] + [:name = VERTICAL KANA REPEAT MARK LOWER HALF:] + [:name = KATAKANA-HIRAGANA VOICED SOUND MARK:] + [:name = KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK:] + [:name = KATAKANA-HIRAGANA DOUBLE HYPHEN:] + [:name = KATAKANA-HIRAGANA PROLONGED SOUND MARK:] + [:name = HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK:] + [:name = HALFWIDTH KATAKANA VOICED SOUND MARK:] + [:name = HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK:]]; + + +$ALetter = [[:Alphabetic:] [:name= HEBREW PUNCTUATION GERESH:] + - [:Ideographic:] + - $Katakana + - [:Script = Hiragana:] + - [:Script = Lao:] + - [:Grapheme_Extend = TRUE:]]; + +$MidLetter = [[:name = APOSTROPHE:] [:name = MIDDLE DOT:] + [:name = HEBREW PUNCTUATION GERSHAYIM:] + [:name = RIGHT SINGLE QUOTATION MARK:] + [:name = HYPHENATION POINT:] + [:name = COLON:]]; + + +$MidNum = [[:LineBreak = Infix_Numeric:] - [:name = COLON:]]; +$Numeric = [[:Nd:][:name = ARABIC DECIMAL SEPARATOR:][:name = ARABIC THOUSANDS SEPARATOR:]]; +$ExtendNumLet = [[:Connector_Punctuation:] + - [:name = KATAKANA MIDDLE DOT:] + - [:name = HALFWIDTH KATAKANA MIDDLE DOT:]]; + + + +# +# Character Class Definitions. +# The names are those from TR29. +# + +$CR = \u000d; +$LF = \u000a; +$Extend = [[:Grapheme_Extend = TRUE:]]; +$Control = [[:Zl:] [:Zp:] [:Cc:] [:Cf:] - $Extend]; +$Format = [[:Cf:] - $Extend]; +$Hiragana = [:Hiragana:]; +$Ideographic = [:IDEOGRAPHIC:]; + +$ALetterEx = $ALetter $Extend*; +$NumericEx = $Numeric $Extend*; +$MidNumEx = $MidNum $Extend*; +$MidLetterEx = $MidLetter $Extend*; +$KatakanaEx = $Katakana $Extend*; +$HiraganaEx = $Hiragana $Extend*; +$IdeographicEx = $Ideographic $Extend*; +$ExtendNumLetEx = $ExtendNumLet $Extend*; + +## ------------------------------------------------- + +!!forward; + + +# Rule 3 - don't break grapheme clusters. +# see character breaks + +$CR $LF; +#[^$Control] $Extend*; +#$NumericEx $Extend* {100}; +#$ALetterEx $Extend* {200}; +[^$Control] $Extend+; +$NumericEx {100}; +$ALetterEx {200}; +$KatakanaEx {300}; +$HiraganaEx {300}; +$IdeographicEx {400}; + +# rule 5 + +$ALetterEx $Format* $ALetterEx {200}; + +# rule 6 and 7 +$ALetterEx $Format* $MidLetterEx $Format* $ALetterEx {200}; + +# rule 8 + +$NumericEx $Format* $NumericEx {100}; + +# rule 9 + +$ALetterEx $Format* $NumericEx {200}; + +# rule 10 + +$NumericEx $Format* $ALetterEx {200}; + +# rule 11 and 12 + +$NumericEx $Format* $MidNumEx $Format* $NumericEx {100}; + +# rule 13 + +$KatakanaEx $Format* $KatakanaEx {300}; +$HiraganaEx $Format* $HiraganaEx {300}; +$IdeographicEx $Format* $IdeographicEx {400}; + +# rule 13a/b + +$ALetterEx $Format* $ExtendNumLetEx {200}; # (13a) +$NumericEx $Format* $ExtendNumLetEx {100}; # (13a) +$KatakanaEx $Format* $ExtendNumLetEx {300}; # (13a) +$ExtendNumLetEx $Format* $ExtendNumLetEx{200}; # (13a) + +$ExtendNumLetEx $Format* $ALetterEx {200}; # (13b) +$ExtendNumLetEx $Format* $NumericEx {100}; # (13b) +$ExtendNumLetEx $Format* $KatakanaEx {300}; # (13b) + + + +## ------------------------------------------------- + +!!reverse; + +$BackALetterEx = $Extend* $ALetter; +$BackNumericEx = $Extend* $Numeric; +$BackMidNumEx = $Extend* $MidNum; +$BackMidLetterEx = $Extend* $MidLetter; +$BackKatakanaEx = $Extend* $Katakana; +$BackHiraganaEx = $Extend* $Hiragana; +$BackIdeographicEx = $Extend* $Ideographic; +$BackExtendNumLetEx= $Extend* $ExtendNumLet; + +$LF $CR; + +# see character breaks + +$Extend* [^$Control]; + +# rule 5 + +$BackALetterEx $Format* $BackALetterEx; + +# rule 6 and 7 + +$BackALetterEx $Format* $BackMidLetterEx $Format* $BackALetterEx; + + +# rule 8 + +$BackNumericEx $Format* $BackNumericEx; + +# rule 9 + +$BackNumericEx $Format* $BackALetterEx; + +# rule 10 + +$BackALetterEx $Format* $BackNumericEx; + +# rule 11 and 12 + +$BackNumericEx $Format* $BackMidNumEx $Format* $BackNumericEx; + +# rule 13 + +$BackKatakanaEx $Format* $BackKatakanaEx; +$BackHiraganaEx $Format* $BackHiraganaEx; +$BackIdeographicEx $Format* $BackIdeographicEx; + +# rules 13 a/b +# +($BackALetterEx | $BackNumericEx | $BackKatakanaEx | $BackExtendNumLetEx) $Format* $BackExtendNumLetEx; +$BackExtendNumLetEx $Format* ($BackALetterEx | $BackNumericEx | $BackKatakanaEx); + +## ------------------------------------------------- + +!!safe_reverse; + +# rule 3 +$Extend+ [^$Extend]; +$Extend+; # comes into play when buffer _begins_ with an $Extend+. + +# rule 4 +$Format+ $BackALetterEx; +$Format+ $BackNumericEx; +$Format+ $BackMidLetterEx; +$Format+ $BackMidNumEx; +$Format+ $BackKatakanaEx; +$Format+ $BackHiraganaEx; +$Format+ $BackIdeographicEx; +$Format+ $BackExtendNumLetEx; + + +# rule 6 +$MidLetter $Format* $BackALetterEx; + +# rule 11 +$MidNum $Format* $BackNumericEx; + +## ------------------------------------------------- + +!!safe_forward; + +# rule 3 +$Extend+; + +# rule 4 +$Extend* $Format+ $ALetterEx; +$Extend* $Format+ $NumericEx; +$Extend* $Format+ $MidLetterEx; +$Extend* $Format+ $MidNumEx; +$Extend* $Format+ $KatakanaEx; +$Extend* $Format+ $HiraganaEx; +$Extend* $Format+ $IdeographicEx; +$Extend* $Format+ $ExtendNumLetEx; + +$Extend+ $Format* $ALetterEx; +$Extend+ $Format* $NumericEx; +$Extend+ $Format* $MidLetterEx; +$Extend+ $Format* $MidNumEx; +$Extend+ $Format* $KatakanaEx; +$Extend+ $Format* $HiraganaEx; +$Extend+ $Format* $IdeographicEx; +$Extend+ $Format* $ExtendNumLetEx; + +# rule 6 +$MidLetterEx $Format* $ALetterEx; + +# rule 11 +$MidNumEx $Format* $NumericEx; \ No newline at end of file diff --git a/icuSources/data/brkitr/word_th.txt b/icuSources/data/brkitr/word_th.txt index ccaee0a7..d551d5db 100644 --- a/icuSources/data/brkitr/word_th.txt +++ b/icuSources/data/brkitr/word_th.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2002, International Business Machines Corporation and +# Copyright (c) 2002-2003, International Business Machines Corporation and # others. All Rights Reserved. # # word.txt Word Breaking Rules for ICU Rules Based Break Iterator. @@ -11,7 +11,7 @@ $Katakana = [[:L:] & [:Kana:]]; # # Definition of $Ideographic is from TR14, Line Breaking. # -$Ideographic = +$Ideographic = [ \u1100-\u1159 \u115F \u2E80-\u2E99 \u2E9B-\u2EF3 \u2F00-\u2FD5 \u2FF0-\u2FFB \u3000 \u3003-\u3004 \u3006-\u3007 \u3012-\u3013 \u3020-\u3029 \u3030-\u303A \u303D-\u303F \u3042 \u3044 \u3046 \u3048 \u304A-\u3062 @@ -31,35 +31,34 @@ $Ideographic = # These definitions are from the character break rules. # $CGJ = [\u034f]; #Combining Grapheme Joiner -$Link = [\u094D \u09CD \u0A4D \u0ACD \u0B4D \u0BCD \u0C4D \u0CCD \u0D4D \u0DCA \u0E3A \u1039 \u17D2]; -$NotControl = [^[:Zl:] [:Zp:] [:Cc:]]; #Line Separator, - #Paragraph Separtor, - # General Category == Control +$Link = [\u094D \u09CD \u0A4D \u0ACD \u0B4D \u0BCD \u0C4D \u0CCD \u0D4D \u0DCA \u0E3A \u1039 \u17D2]; +$NotControl = [^[:Zl:] [:Zp:] [:Cc:]]; #Line Separator, Paragraph Separtor, General Category == Control + $Extend = # From UNIDATA/DerivedCoreProperties.txt [\u0300-\u034E \u0360-\u036F \u0483-\u0486 \u0488-\u0489 \u0591-\u05A1 \u05A3-\u05B9 - \u05BB-\u05BD \u05BF \u05C1-\u05C2 \u05C4 \u064B-\u0655 \u0670 \u06D6-\u06DC - \u06DE \u06DF-\u06E4 \u06E7-\u06E8 \u06EA-\u06ED \u0711 \u0730-\u074A - \u07A6-\u07B0 \u0901-\u0902 \u0903 \u093C \u093E-\u0940 \u0941-\u0948 - \u0949-\u094C \u0951-\u0954 \u0962-\u0963 \u0981 \u0982-\u0983 \u09BC - \u09BE-\u09C0 \u09C1-\u09C4 \u09C7-\u09C8 \u09CB-\u09CC \u09D7 \u09E2-\u09E3 - \u0A02 \u0A3C \u0A3E-\u0A40 \u0A41-\u0A42 \u0A47-\u0A48 \u0A4B-\u0A4C - \u0A70-\u0A71 \u0A81-\u0A82 \u0A83 \u0ABC \u0ABE-\u0AC0 \u0AC1-\u0AC5 - \u0AC7-\u0AC8 \u0AC9 \u0ACB-\u0ACC \u0B01 \u0B02-\u0B03 \u0B3C \u0B3E - \u0B3F \u0B40 \u0B41-\u0B43 \u0B47-\u0B48 \u0B4B-\u0B4C \u0B56 \u0B57 - \u0B82 \u0BBE-\u0BBF \u0BC0 \u0BC1-\u0BC2 \u0BC6-\u0BC8 \u0BCA-\u0BCC \u0BD7 + \u05BB-\u05BD \u05BF \u05C1-\u05C2 \u05C4 \u064B-\u0655 \u0670 \u06D6-\u06DC + \u06DE \u06DF-\u06E4 \u06E7-\u06E8 \u06EA-\u06ED \u0711 \u0730-\u074A + \u07A6-\u07B0 \u0901-\u0902 \u0903 \u093C \u093E-\u0940 \u0941-\u0948 + \u0949-\u094C \u0951-\u0954 \u0962-\u0963 \u0981 \u0982-\u0983 \u09BC + \u09BE-\u09C0 \u09C1-\u09C4 \u09C7-\u09C8 \u09CB-\u09CC \u09D7 \u09E2-\u09E3 + \u0A02 \u0A3C \u0A3E-\u0A40 \u0A41-\u0A42 \u0A47-\u0A48 \u0A4B-\u0A4C + \u0A70-\u0A71 \u0A81-\u0A82 \u0A83 \u0ABC \u0ABE-\u0AC0 \u0AC1-\u0AC5 + \u0AC7-\u0AC8 \u0AC9 \u0ACB-\u0ACC \u0B01 \u0B02-\u0B03 \u0B3C \u0B3E + \u0B3F \u0B40 \u0B41-\u0B43 \u0B47-\u0B48 \u0B4B-\u0B4C \u0B56 \u0B57 + \u0B82 \u0BBE-\u0BBF \u0BC0 \u0BC1-\u0BC2 \u0BC6-\u0BC8 \u0BCA-\u0BCC \u0BD7 \u0C01-\u0C03 \u0C3E-\u0C40 \u0C41-\u0C44 \u0C46-\u0C48 \u0C4A-\u0C4C - \u0C55-\u0C56 \u0C82-\u0C83 \u0CBE \u0CBF \u0CC0-\u0CC4 \u0CC6 - \u0CC7-\u0CC8 \u0CCA-\u0CCB \u0CCC \u0CD5-\u0CD6 \u0D02-\u0D03 \u0D3E-\u0D40 - \u0D41-\u0D43 \u0D46-\u0D48 \u0D4A-\u0D4C \u0D57 \u0D82-\u0D83 \u0DCF-\u0DD1 - \u0DD2-\u0DD4 \u0DD6 \u0DD8-\u0DDF \u0DF2-\u0DF3 \u0E31 \u0E34-\u0E39 - \u0E47-\u0E4E \u0EB1 \u0EB4-\u0EB9 \u0EBB-\u0EBC \u0EC8-\u0ECD \u0F18-\u0F19 - \u0F35 \u0F37 \u0F39 \u0F3E-\u0F3F \u0F71-\u0F7E \u0F7F \u0F80-\u0F84 - \u0F86-\u0F87 \u0F90-\u0F97 \u0F99-\u0FBC \u0FC6 \u102C \u102D-\u1030 \u1031 - \u1032 \u1036-\u1037 \u1038 \u1056-\u1057 \u1058-\u1059 \u1712-\u1714 + \u0C55-\u0C56 \u0C82-\u0C83 \u0CBE \u0CBF \u0CC0-\u0CC4 \u0CC6 + \u0CC7-\u0CC8 \u0CCA-\u0CCB \u0CCC \u0CD5-\u0CD6 \u0D02-\u0D03 \u0D3E-\u0D40 + \u0D41-\u0D43 \u0D46-\u0D48 \u0D4A-\u0D4C \u0D57 \u0D82-\u0D83 \u0DCF-\u0DD1 + \u0DD2-\u0DD4 \u0DD6 \u0DD8-\u0DDF \u0DF2-\u0DF3 \u0E31 \u0E34-\u0E39 + \u0E47-\u0E4E \u0EB1 \u0EB4-\u0EB9 \u0EBB-\u0EBC \u0EC8-\u0ECD \u0F18-\u0F19 + \u0F35 \u0F37 \u0F39 \u0F3E-\u0F3F \u0F71-\u0F7E \u0F7F \u0F80-\u0F84 + \u0F86-\u0F87 \u0F90-\u0F97 \u0F99-\u0FBC \u0FC6 \u102C \u102D-\u1030 \u1031 + \u1032 \u1036-\u1037 \u1038 \u1056-\u1057 \u1058-\u1059 \u1712-\u1714 \u1732-\u1734 \u1752-\u1753 \u1772-\u1773 \u17B4-\u17B6 \u17B7-\u17BD - \u17BE-\u17C5 \u17C6 \u17C7-\u17C8 \u17C9-\u17D1 \u17D3 \u180B-\u180D - \u18A9 \u20D0-\u20DC \u20DD-\u20E0 \u20E1 \u20E2-\u20E4 \u20E5-\u20EA - \u302A-\u302F \u3099-\u309A \uFB1E \uFE00-\uFE0F \uFE20-\uFE23 \uFF9E-\uFF9F + \u17BE-\u17C5 \u17C6 \u17C7-\u17C8 \u17C9-\u17D1 \u17D3 \u180B-\u180D + \u18A9 \u20D0-\u20DC \u20DD-\u20E0 \u20E1 \u20E2-\u20E4 \u20E5-\u20EA + \u302A-\u302F \u3099-\u309A \uFB1E \uFE00-\uFE0F \uFE20-\uFE23 \uFF9E-\uFF9F \U0001D165-\U0001D166 \U0001D167-\U0001D169 \U0001D16D-\U0001D172 \U0001D17B-\U0001D182 \U0001D185-\U0001D18B \U0001D1AA-\U0001D1AD]; @@ -72,30 +71,30 @@ $Extend = # From UNIDATA/DerivedCoreProperties.txt $L = [\u1100-\u115f]; $V = [\u1160-\u11a2]; $T = [\u11a8-\u11f9]; -$LV = [ \uac00 \uac1c \uac38 \uac54 \uac70 \uac8c \uaca8 \uacc4 \uace0 \uacfc \uad18 \uad34 \uad50 \uad6c \uad88 \uada4 - \uadc0 \uaddc \uadf8 \uae14 \uae30 \uae4c \uae68 \uae84 \uaea0 \uaebc \uaed8 \uaef4 \uaf10 \uaf2c \uaf48 \uaf64 - \uaf80 \uaf9c \uafb8 \uafd4 \uaff0 \ub00c \ub028 \ub044 \ub060 \ub07c \ub098 \ub0b4 \ub0d0 \ub0ec \ub108 \ub124 - \ub140 \ub15c \ub178 \ub194 \ub1b0 \ub1cc \ub1e8 \ub204 \ub220 \ub23c \ub258 \ub274 \ub290 \ub2ac \ub2c8 \ub2e4 - \ub300 \ub31c \ub338 \ub354 \ub370 \ub38c \ub3a8 \ub3c4 \ub3e0 \ub3fc \ub418 \ub434 \ub450 \ub46c \ub488 \ub4a4 - \ub4c0 \ub4dc \ub4f8 \ub514 \ub530 \ub54c \ub568 \ub584 \ub5a0 \ub5bc \ub5d8 \ub5f4 \ub610 \ub62c \ub648 \ub664 - \ub680 \ub69c \ub6b8 \ub6d4 \ub6f0 \ub70c \ub728 \ub744 \ub760 \ub77c \ub798 \ub7b4 \ub7d0 \ub7ec \ub808 \ub824 - \ub840 \ub85c \ub878 \ub894 \ub8b0 \ub8cc \ub8e8 \ub904 \ub920 \ub93c \ub958 \ub974 \ub990 \ub9ac \ub9c8 \ub9e4 - \uba00 \uba1c \uba38 \uba54 \uba70 \uba8c \ubaa8 \ubac4 \ubae0 \ubafc \ubb18 \ubb34 \ubb50 \ubb6c \ubb88 \ubba4 - \ubbc0 \ubbdc \ubbf8 \ubc14 \ubc30 \ubc4c \ubc68 \ubc84 \ubca0 \ubcbc \ubcd8 \ubcf4 \ubd10 \ubd2c \ubd48 \ubd64 - \ubd80 \ubd9c \ubdb8 \ubdd4 \ubdf0 \ube0c \ube28 \ube44 \ube60 \ube7c \ube98 \ubeb4 \ubed0 \ubeec \ubf08 \ubf24 - \ubf40 \ubf5c \ubf78 \ubf94 \ubfb0 \ubfcc \ubfe8 \uc004 \uc020 \uc03c \uc058 \uc074 \uc090 \uc0ac \uc0c8 \uc0e4 - \uc100 \uc11c \uc138 \uc154 \uc170 \uc18c \uc1a8 \uc1c4 \uc1e0 \uc1fc \uc218 \uc234 \uc250 \uc26c \uc288 \uc2a4 - \uc2c0 \uc2dc \uc2f8 \uc314 \uc330 \uc34c \uc368 \uc384 \uc3a0 \uc3bc \uc3d8 \uc3f4 \uc410 \uc42c \uc448 \uc464 - \uc480 \uc49c \uc4b8 \uc4d4 \uc4f0 \uc50c \uc528 \uc544 \uc560 \uc57c \uc598 \uc5b4 \uc5d0 \uc5ec \uc608 \uc624 - \uc640 \uc65c \uc678 \uc694 \uc6b0 \uc6cc \uc6e8 \uc704 \uc720 \uc73c \uc758 \uc774 \uc790 \uc7ac \uc7c8 \uc7e4 - \uc800 \uc81c \uc838 \uc854 \uc870 \uc88c \uc8a8 \uc8c4 \uc8e0 \uc8fc \uc918 \uc934 \uc950 \uc96c \uc988 \uc9a4 - \uc9c0 \uc9dc \uc9f8 \uca14 \uca30 \uca4c \uca68 \uca84 \ucaa0 \ucabc \ucad8 \ucaf4 \ucb10 \ucb2c \ucb48 \ucb64 - \ucb80 \ucb9c \ucbb8 \ucbd4 \ucbf0 \ucc0c \ucc28 \ucc44 \ucc60 \ucc7c \ucc98 \uccb4 \uccd0 \uccec \ucd08 \ucd24 - \ucd40 \ucd5c \ucd78 \ucd94 \ucdb0 \ucdcc \ucde8 \uce04 \uce20 \uce3c \uce58 \uce74 \uce90 \uceac \ucec8 \ucee4 - \ucf00 \ucf1c \ucf38 \ucf54 \ucf70 \ucf8c \ucfa8 \ucfc4 \ucfe0 \ucffc \ud018 \ud034 \ud050 \ud06c \ud088 \ud0a4 - \ud0c0 \ud0dc \ud0f8 \ud114 \ud130 \ud14c \ud168 \ud184 \ud1a0 \ud1bc \ud1d8 \ud1f4 \ud210 \ud22c \ud248 \ud264 - \ud280 \ud29c \ud2b8 \ud2d4 \ud2f0 \ud30c \ud328 \ud344 \ud360 \ud37c \ud398 \ud3b4 \ud3d0 \ud3ec \ud408 \ud424 - \ud440 \ud45c \ud478 \ud494 \ud4b0 \ud4cc \ud4e8 \ud504 \ud520 \ud53c \ud558 \ud574 \ud590 \ud5ac \ud5c8 \ud5e4 +$LV = [ \uac00 \uac1c \uac38 \uac54 \uac70 \uac8c \uaca8 \uacc4 \uace0 \uacfc \uad18 \uad34 \uad50 \uad6c \uad88 \uada4 + \uadc0 \uaddc \uadf8 \uae14 \uae30 \uae4c \uae68 \uae84 \uaea0 \uaebc \uaed8 \uaef4 \uaf10 \uaf2c \uaf48 \uaf64 + \uaf80 \uaf9c \uafb8 \uafd4 \uaff0 \ub00c \ub028 \ub044 \ub060 \ub07c \ub098 \ub0b4 \ub0d0 \ub0ec \ub108 \ub124 + \ub140 \ub15c \ub178 \ub194 \ub1b0 \ub1cc \ub1e8 \ub204 \ub220 \ub23c \ub258 \ub274 \ub290 \ub2ac \ub2c8 \ub2e4 + \ub300 \ub31c \ub338 \ub354 \ub370 \ub38c \ub3a8 \ub3c4 \ub3e0 \ub3fc \ub418 \ub434 \ub450 \ub46c \ub488 \ub4a4 + \ub4c0 \ub4dc \ub4f8 \ub514 \ub530 \ub54c \ub568 \ub584 \ub5a0 \ub5bc \ub5d8 \ub5f4 \ub610 \ub62c \ub648 \ub664 + \ub680 \ub69c \ub6b8 \ub6d4 \ub6f0 \ub70c \ub728 \ub744 \ub760 \ub77c \ub798 \ub7b4 \ub7d0 \ub7ec \ub808 \ub824 + \ub840 \ub85c \ub878 \ub894 \ub8b0 \ub8cc \ub8e8 \ub904 \ub920 \ub93c \ub958 \ub974 \ub990 \ub9ac \ub9c8 \ub9e4 + \uba00 \uba1c \uba38 \uba54 \uba70 \uba8c \ubaa8 \ubac4 \ubae0 \ubafc \ubb18 \ubb34 \ubb50 \ubb6c \ubb88 \ubba4 + \ubbc0 \ubbdc \ubbf8 \ubc14 \ubc30 \ubc4c \ubc68 \ubc84 \ubca0 \ubcbc \ubcd8 \ubcf4 \ubd10 \ubd2c \ubd48 \ubd64 + \ubd80 \ubd9c \ubdb8 \ubdd4 \ubdf0 \ube0c \ube28 \ube44 \ube60 \ube7c \ube98 \ubeb4 \ubed0 \ubeec \ubf08 \ubf24 + \ubf40 \ubf5c \ubf78 \ubf94 \ubfb0 \ubfcc \ubfe8 \uc004 \uc020 \uc03c \uc058 \uc074 \uc090 \uc0ac \uc0c8 \uc0e4 + \uc100 \uc11c \uc138 \uc154 \uc170 \uc18c \uc1a8 \uc1c4 \uc1e0 \uc1fc \uc218 \uc234 \uc250 \uc26c \uc288 \uc2a4 + \uc2c0 \uc2dc \uc2f8 \uc314 \uc330 \uc34c \uc368 \uc384 \uc3a0 \uc3bc \uc3d8 \uc3f4 \uc410 \uc42c \uc448 \uc464 + \uc480 \uc49c \uc4b8 \uc4d4 \uc4f0 \uc50c \uc528 \uc544 \uc560 \uc57c \uc598 \uc5b4 \uc5d0 \uc5ec \uc608 \uc624 + \uc640 \uc65c \uc678 \uc694 \uc6b0 \uc6cc \uc6e8 \uc704 \uc720 \uc73c \uc758 \uc774 \uc790 \uc7ac \uc7c8 \uc7e4 + \uc800 \uc81c \uc838 \uc854 \uc870 \uc88c \uc8a8 \uc8c4 \uc8e0 \uc8fc \uc918 \uc934 \uc950 \uc96c \uc988 \uc9a4 + \uc9c0 \uc9dc \uc9f8 \uca14 \uca30 \uca4c \uca68 \uca84 \ucaa0 \ucabc \ucad8 \ucaf4 \ucb10 \ucb2c \ucb48 \ucb64 + \ucb80 \ucb9c \ucbb8 \ucbd4 \ucbf0 \ucc0c \ucc28 \ucc44 \ucc60 \ucc7c \ucc98 \uccb4 \uccd0 \uccec \ucd08 \ucd24 + \ucd40 \ucd5c \ucd78 \ucd94 \ucdb0 \ucdcc \ucde8 \uce04 \uce20 \uce3c \uce58 \uce74 \uce90 \uceac \ucec8 \ucee4 + \ucf00 \ucf1c \ucf38 \ucf54 \ucf70 \ucf8c \ucfa8 \ucfc4 \ucfe0 \ucffc \ud018 \ud034 \ud050 \ud06c \ud088 \ud0a4 + \ud0c0 \ud0dc \ud0f8 \ud114 \ud130 \ud14c \ud168 \ud184 \ud1a0 \ud1bc \ud1d8 \ud1f4 \ud210 \ud22c \ud248 \ud264 + \ud280 \ud29c \ud2b8 \ud2d4 \ud2f0 \ud30c \ud328 \ud344 \ud360 \ud37c \ud398 \ud3b4 \ud3d0 \ud3ec \ud408 \ud424 + \ud440 \ud45c \ud478 \ud494 \ud4b0 \ud4cc \ud4e8 \ud504 \ud520 \ud53c \ud558 \ud574 \ud590 \ud5ac \ud5c8 \ud5e4 \ud600 \ud61c \ud638 \ud654 \ud670 \ud68c \ud6a8 \ud6c4 \ud6e0 \ud6fc \ud718 \ud734 \ud750 \ud76c \ud788 ]; $LVT = [[\uac00-\ud7a3] - $LV]; $Hangul_Sequence = ((($L+ $LV?) | ($L* $LV)) $V* $T* ) | ($L* $LVT $T*); @@ -129,7 +128,7 @@ $LetterBase = [:L:]; $CGJSequence = $CGJ+ ($Base | $Hangul_Sequence); $Join_Control = [\u200d-\u200e]; # Zero Width Joiner, Zero Width Non-Joiner $LinkSequence = $Link+ $Extend* $Join_Control? $LetterBase; -$LetterEx = ($Letter | $Hangul_Sequence) $Extend* ((($LinkSequence | $CGJSequence) $Extend*)*); +$LetterEx = ($Letter | $Hangul_Sequence) $Extend* ((($LinkSequence | $CGJSequence) $Extend*)*); @@ -142,8 +141,8 @@ $NumericEx = $Numeric $Extend*; $InfixNumeric = [\u002c \u002e \u003a \u003b \u0589]; $PostfixNumeric = [\% \u00a2 \u00b0 \u2030 \u2031 \u2032-\u2037 \u20a7 \u2103 \u2109 \u2126 \ufe6a \uff05 \uffe0]; -$PrefixNumeric = [[[:Sc:] \u002b \u005c \u00b1 \u2116 \u2212 \u2213 \-] - [$PostfixNumeric]]; - +$PrefixNumeric = [[[:Sc:] \u002b \u005c \u00b1 \u2116 \u2212 \u2213 \-] - [$PostfixNumeric]]; + $NumericPrefix = $PrefixNumeric $NumericEx ($InfixNumeric $NumericEx)?; $NumericInterior = $NumericEx ($InfixNumeric? $NumericEx)*; diff --git a/icuSources/data/coll/ar.txt b/icuSources/data/coll/ar.txt new file mode 100644 index 00000000..d8961b14 --- /dev/null +++ b/icuSources/data/coll/ar.txt @@ -0,0 +1,20 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/ar.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/ar.xml + */ +ar{ + Version{"1.2"} + collations{ + standard{ + Sequence{"&ة=ت"} + Version{"3.0"} + } + } +} diff --git a/icuSources/data/coll/ar_AE.txt b/icuSources/data/coll/ar_AE.txt new file mode 100644 index 00000000..8a256685 --- /dev/null +++ b/icuSources/data/coll/ar_AE.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "ar" + */ +ar_AE{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ar_BH.txt b/icuSources/data/coll/ar_BH.txt new file mode 100644 index 00000000..8ba84c54 --- /dev/null +++ b/icuSources/data/coll/ar_BH.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "ar" + */ +ar_BH{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ar_DZ.txt b/icuSources/data/coll/ar_DZ.txt new file mode 100644 index 00000000..a47fd0b2 --- /dev/null +++ b/icuSources/data/coll/ar_DZ.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "ar" + */ +ar_DZ{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ar_EG.txt b/icuSources/data/coll/ar_EG.txt new file mode 100644 index 00000000..3df7b395 --- /dev/null +++ b/icuSources/data/coll/ar_EG.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "ar" + */ +ar_EG{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ar_IN.txt b/icuSources/data/coll/ar_IN.txt new file mode 100644 index 00000000..463fd8bc --- /dev/null +++ b/icuSources/data/coll/ar_IN.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "ar" + */ +ar_IN{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ar_IQ.txt b/icuSources/data/coll/ar_IQ.txt new file mode 100644 index 00000000..add1ed6e --- /dev/null +++ b/icuSources/data/coll/ar_IQ.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "ar" + */ +ar_IQ{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ar_JO.txt b/icuSources/data/coll/ar_JO.txt new file mode 100644 index 00000000..12f2e2f6 --- /dev/null +++ b/icuSources/data/coll/ar_JO.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "ar" + */ +ar_JO{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ar_KW.txt b/icuSources/data/coll/ar_KW.txt new file mode 100644 index 00000000..14ede807 --- /dev/null +++ b/icuSources/data/coll/ar_KW.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "ar" + */ +ar_KW{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ar_LB.txt b/icuSources/data/coll/ar_LB.txt new file mode 100644 index 00000000..1c9894ea --- /dev/null +++ b/icuSources/data/coll/ar_LB.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "ar" + */ +ar_LB{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ar_LY.txt b/icuSources/data/coll/ar_LY.txt new file mode 100644 index 00000000..5e9c6393 --- /dev/null +++ b/icuSources/data/coll/ar_LY.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "ar" + */ +ar_LY{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ar_MA.txt b/icuSources/data/coll/ar_MA.txt new file mode 100644 index 00000000..e287ae85 --- /dev/null +++ b/icuSources/data/coll/ar_MA.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "ar" + */ +ar_MA{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ar_OM.txt b/icuSources/data/coll/ar_OM.txt new file mode 100644 index 00000000..42f08ee3 --- /dev/null +++ b/icuSources/data/coll/ar_OM.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "ar" + */ +ar_OM{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ar_QA.txt b/icuSources/data/coll/ar_QA.txt new file mode 100644 index 00000000..d8efb9e1 --- /dev/null +++ b/icuSources/data/coll/ar_QA.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "ar" + */ +ar_QA{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ar_SA.txt b/icuSources/data/coll/ar_SA.txt new file mode 100644 index 00000000..4ba87355 --- /dev/null +++ b/icuSources/data/coll/ar_SA.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "ar" + */ +ar_SA{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ar_SD.txt b/icuSources/data/coll/ar_SD.txt new file mode 100644 index 00000000..e78f5ca9 --- /dev/null +++ b/icuSources/data/coll/ar_SD.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "ar" + */ +ar_SD{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ar_SY.txt b/icuSources/data/coll/ar_SY.txt new file mode 100644 index 00000000..b721c8ea --- /dev/null +++ b/icuSources/data/coll/ar_SY.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "ar" + */ +ar_SY{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ar_TN.txt b/icuSources/data/coll/ar_TN.txt new file mode 100644 index 00000000..6ab0dac6 --- /dev/null +++ b/icuSources/data/coll/ar_TN.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "ar" + */ +ar_TN{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ar_YE.txt b/icuSources/data/coll/ar_YE.txt new file mode 100644 index 00000000..8b878e14 --- /dev/null +++ b/icuSources/data/coll/ar_YE.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "ar" + */ +ar_YE{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/be.txt b/icuSources/data/coll/be.txt new file mode 100644 index 00000000..aefcf90a --- /dev/null +++ b/icuSources/data/coll/be.txt @@ -0,0 +1,15 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/be.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/be.xml + */ +be{ + Version{"1.2"} + collations:alias{"ru/collations"} +} diff --git a/icuSources/data/coll/be_BY.txt b/icuSources/data/coll/be_BY.txt new file mode 100644 index 00000000..8a10293d --- /dev/null +++ b/icuSources/data/coll/be_BY.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "be" + */ +be_BY{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/bg.txt b/icuSources/data/coll/bg.txt new file mode 100644 index 00000000..1bf7c4f0 --- /dev/null +++ b/icuSources/data/coll/bg.txt @@ -0,0 +1,15 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/bg.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/bg.xml + */ +bg{ + Version{"1.2"} + collations:alias{"ru/collations"} +} diff --git a/icuSources/data/coll/bg_BG.txt b/icuSources/data/coll/bg_BG.txt new file mode 100644 index 00000000..d2e018c9 --- /dev/null +++ b/icuSources/data/coll/bg_BG.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "bg" + */ +bg_BG{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ca.txt b/icuSources/data/coll/ca.txt new file mode 100644 index 00000000..ad5de732 --- /dev/null +++ b/icuSources/data/coll/ca.txt @@ -0,0 +1,20 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/ca.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/ca.xml + */ +ca{ + Version{"1.2"} + collations{ + standard{ + Sequence{" [backwards 2]&C source: ../../../locale/icu/collation/cs.xml + */ +cs{ + Version{"1.2"} + collations{ + standard{ + Sequence{"&C<č<<<Č&H source: ../../../locale/icu/collation/da.xml + */ +da{ + Version{"1.2"} + collations{ + standard{ + Sequence{ + " [caseFirst upper ]" + "&D<<đ<<<Đ<<ð<<<Ð" + "&t<<<þ/h" + "&T<<<Þ/H" + "&Y<<ü<<<Ü<<ű<<<Ű" + "&[before 1]ʒ<æ<<<Æ<<ä<<<Ä<<ę<<<Ę<ø<<<Ø<<ö<<<Ö<<ő<<<Ő<<œ<<<Œ<å<<<Å<<<" + "aa<< source: ../../../locale/icu/collation/de.xml + */ +de{ + Version{"1.2"} + collations{ + phonebook{ + Sequence{"&a<<æ/e<<ä/e&A<<Æ/E<<Ä/E&œ<<ö/e&Œ<<Ö/E&u<<ü/e&U<<Ü/E"} + Version{"2.0"} + } + standard{ + Sequence{"&ae<<æ<<<Æ"} + Version{"1.0"} + } + } +} diff --git a/icuSources/data/coll/de_AT.txt b/icuSources/data/coll/de_AT.txt new file mode 100644 index 00000000..2d0189fe --- /dev/null +++ b/icuSources/data/coll/de_AT.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "de" + */ +de_AT{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/de_BE.txt b/icuSources/data/coll/de_BE.txt new file mode 100644 index 00000000..19735aff --- /dev/null +++ b/icuSources/data/coll/de_BE.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "de" + */ +de_BE{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/de_CH.txt b/icuSources/data/coll/de_CH.txt new file mode 100644 index 00000000..b6c1c6a1 --- /dev/null +++ b/icuSources/data/coll/de_CH.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "de" + */ +de_CH{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/de_DE.txt b/icuSources/data/coll/de_DE.txt new file mode 100644 index 00000000..1aac5eda --- /dev/null +++ b/icuSources/data/coll/de_DE.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "de" + */ +de_DE{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/de_LU.txt b/icuSources/data/coll/de_LU.txt new file mode 100644 index 00000000..a13ff303 --- /dev/null +++ b/icuSources/data/coll/de_LU.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "de" + */ +de_LU{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/de__PHONEBOOK.txt b/icuSources/data/coll/de__PHONEBOOK.txt new file mode 100644 index 00000000..f3a80ed7 --- /dev/null +++ b/icuSources/data/coll/de__PHONEBOOK.txt @@ -0,0 +1,13 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +de__PHONEBOOK{ + collations{ + default{"phonebook"} + } +} diff --git a/icuSources/data/coll/el.txt b/icuSources/data/coll/el.txt new file mode 100644 index 00000000..3655f842 --- /dev/null +++ b/icuSources/data/coll/el.txt @@ -0,0 +1,20 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/el.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/el.xml + */ +el{ + Version{"1.2"} + collations{ + standard{ + Sequence{" [normalization on ]"} + Version{"2.0"} + } + } +} diff --git a/icuSources/data/coll/el_GR.txt b/icuSources/data/coll/el_GR.txt new file mode 100644 index 00000000..68f4aae4 --- /dev/null +++ b/icuSources/data/coll/el_GR.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "el" + */ +el_GR{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/en.txt b/icuSources/data/coll/en.txt new file mode 100644 index 00000000..851a9231 --- /dev/null +++ b/icuSources/data/coll/en.txt @@ -0,0 +1,20 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/en.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/en.xml + */ +en{ + Version{"1.2"} + collations{ + standard{ + Sequence{"&ae<<æ<<<Æ"} + Version{"1.0"} + } + } +} diff --git a/icuSources/data/coll/en_AU.txt b/icuSources/data/coll/en_AU.txt new file mode 100644 index 00000000..fc21ff9f --- /dev/null +++ b/icuSources/data/coll/en_AU.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "en" + */ +en_AU{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/en_BE.txt b/icuSources/data/coll/en_BE.txt new file mode 100644 index 00000000..9908f0e8 --- /dev/null +++ b/icuSources/data/coll/en_BE.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/en_BE.xml +// * +// *************************************************************************** +en_BE{ + Version{"1.2"} + collations{ + standard{ + Sequence{" [backwards 2]"} + Version{"1.0.1"} + } + } +} diff --git a/icuSources/data/coll/en_BW.txt b/icuSources/data/coll/en_BW.txt new file mode 100644 index 00000000..1d8651b5 --- /dev/null +++ b/icuSources/data/coll/en_BW.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "en" + */ +en_BW{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/en_CA.txt b/icuSources/data/coll/en_CA.txt new file mode 100644 index 00000000..9020b03a --- /dev/null +++ b/icuSources/data/coll/en_CA.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "en" + */ +en_CA{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/en_GB.txt b/icuSources/data/coll/en_GB.txt new file mode 100644 index 00000000..ec7e32f8 --- /dev/null +++ b/icuSources/data/coll/en_GB.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "en" + */ +en_GB{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/en_HK.txt b/icuSources/data/coll/en_HK.txt new file mode 100644 index 00000000..74e499e0 --- /dev/null +++ b/icuSources/data/coll/en_HK.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "en" + */ +en_HK{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/en_IE.txt b/icuSources/data/coll/en_IE.txt new file mode 100644 index 00000000..dccb957e --- /dev/null +++ b/icuSources/data/coll/en_IE.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "en" + */ +en_IE{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/en_IN.txt b/icuSources/data/coll/en_IN.txt new file mode 100644 index 00000000..7bef9550 --- /dev/null +++ b/icuSources/data/coll/en_IN.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "en" + */ +en_IN{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/en_MT.txt b/icuSources/data/coll/en_MT.txt new file mode 100644 index 00000000..39b2ecf2 --- /dev/null +++ b/icuSources/data/coll/en_MT.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "en" + */ +en_MT{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/en_NZ.txt b/icuSources/data/coll/en_NZ.txt new file mode 100644 index 00000000..fd349616 --- /dev/null +++ b/icuSources/data/coll/en_NZ.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "en" + */ +en_NZ{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/en_PH.txt b/icuSources/data/coll/en_PH.txt new file mode 100644 index 00000000..d48337bb --- /dev/null +++ b/icuSources/data/coll/en_PH.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "en" + */ +en_PH{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/en_SG.txt b/icuSources/data/coll/en_SG.txt new file mode 100644 index 00000000..9e1559dc --- /dev/null +++ b/icuSources/data/coll/en_SG.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "en" + */ +en_SG{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/en_US.txt b/icuSources/data/coll/en_US.txt new file mode 100644 index 00000000..dbbf283c --- /dev/null +++ b/icuSources/data/coll/en_US.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "en" + */ +en_US{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/en_US_POSIX.txt b/icuSources/data/coll/en_US_POSIX.txt new file mode 100644 index 00000000..2626c6a6 --- /dev/null +++ b/icuSources/data/coll/en_US_POSIX.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "en" + */ +en_US_POSIX{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/en_VI.txt b/icuSources/data/coll/en_VI.txt new file mode 100644 index 00000000..fec55b7b --- /dev/null +++ b/icuSources/data/coll/en_VI.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "en" + */ +en_VI{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/en_ZA.txt b/icuSources/data/coll/en_ZA.txt new file mode 100644 index 00000000..0ac0b653 --- /dev/null +++ b/icuSources/data/coll/en_ZA.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "en" + */ +en_ZA{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/en_ZW.txt b/icuSources/data/coll/en_ZW.txt new file mode 100644 index 00000000..45946e69 --- /dev/null +++ b/icuSources/data/coll/en_ZW.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "en" + */ +en_ZW{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/eo.txt b/icuSources/data/coll/eo.txt new file mode 100644 index 00000000..acb18cda --- /dev/null +++ b/icuSources/data/coll/eo.txt @@ -0,0 +1,20 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/eo.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/eo.xml + */ +eo{ + Version{"1.2"} + collations{ + standard{ + Sequence{"&C<ĉ<<<Ĉ&G<ĝ<<<Ĝ&H<ĥ<<<Ĥ&J<ĵ<<<Ĵ&S<ŝ<<<Ŝ&U<ŭ<<<Ŭ"} + Version{"1.0"} + } + } +} diff --git a/icuSources/data/coll/es.txt b/icuSources/data/coll/es.txt new file mode 100644 index 00000000..3ccdf234 --- /dev/null +++ b/icuSources/data/coll/es.txt @@ -0,0 +1,24 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/es.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/es.xml + */ +es{ + Version{"1.2"} + collations{ + standard{ + Sequence{"&N<ñ<<<Ñ&ae<<æ<<<Æ"} + Version{"1.1"} + } + traditional{ + Sequence{"&N<ñ<<<Ñ&C source: ../../../locale/icu/collation/et.xml + */ +et{ + Version{"1.2"} + collations{ + standard{ + Sequence{ + "&[before 1]T<š<<<Š source: ../../../locale/icu/collation/fa.xml + */ +fa{ + Version{"1.2"} + collations{ + standard{ + Sequence{ + " [normalization on ]" + "&َ<<ِ<<ُ<<ً<<ٍ<<ٌ" + "&[before 1]ا<آ" + "&ا<<ٱ<ء<<أ<<ٲ<<إ<<ٳ<<ؤ<<یٔ<<<ىٔ<<<ئ" + "&ک<<ڪ<<ګ<<ك<<ڬ<<ڭ<<ڮ" + "&ۏ<ه<<ە<<ہ<<ة<<ۃ<<ۀ<<ھ" + "&ی<<ى<<ے<<ي<<ې<<ۑ<<ۍ<<ێ" + } + Version{"2.0"} + } + } +} diff --git a/icuSources/data/coll/fa_AF.txt b/icuSources/data/coll/fa_AF.txt new file mode 100644 index 00000000..fc3a96bf --- /dev/null +++ b/icuSources/data/coll/fa_AF.txt @@ -0,0 +1,12 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/fa_AF.xml +// * +// *************************************************************************** +fa_AF{ + Version{"1.2"} + collations:alias{"ps/collations"} +} diff --git a/icuSources/data/coll/fa_IR.txt b/icuSources/data/coll/fa_IR.txt new file mode 100644 index 00000000..d21c805e --- /dev/null +++ b/icuSources/data/coll/fa_IR.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "fa" + */ +fa_IR{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/fi.txt b/icuSources/data/coll/fi.txt new file mode 100644 index 00000000..eae63104 --- /dev/null +++ b/icuSources/data/coll/fi.txt @@ -0,0 +1,27 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/fi.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/fi.xml + */ +fi{ + Version{"1.2"} + collations{ + standard{ + Sequence{ + "&D<<ð<<<Ð<<đ<<<Đ" + "&N<<ŋ<<<Ŋ" + "&T<<þ/h<<<Þ/h" + "&V< source: ../../../locale/icu/collation/fo.xml + */ +fo{ + Version{"1.2"} + collations{ + standard{ + Sequence{ + "&D<<đ<<<Đ<<ð<<<Ð" + "&t<<<þ/h" + "&T<<<Þ/H" + "&Y<<ü<<<Ü<<ű<<<Ű" + "&[before 1]ʒ<æ<<<Æ<<ä<<<Ä<<ę<<<Ę<ø<<<Ø<<ö<<<Ö<<ő<<<Ő<<œ<<<Œ<å<<<Å<<<" + "aa<< source: ../../../locale/icu/collation/fr.xml + */ +fr{ + Version{"1.2"} + collations{ + standard{ + Sequence{" [backwards 2]&ae<<æ<<<Æ"} + Version{"2.0"} + } + } +} diff --git a/icuSources/data/coll/fr_BE.txt b/icuSources/data/coll/fr_BE.txt new file mode 100644 index 00000000..06173072 --- /dev/null +++ b/icuSources/data/coll/fr_BE.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "fr" + */ +fr_BE{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/fr_CA.txt b/icuSources/data/coll/fr_CA.txt new file mode 100644 index 00000000..0b7f8692 --- /dev/null +++ b/icuSources/data/coll/fr_CA.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "fr" + */ +fr_CA{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/fr_CH.txt b/icuSources/data/coll/fr_CH.txt new file mode 100644 index 00000000..d0b0cb1d --- /dev/null +++ b/icuSources/data/coll/fr_CH.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "fr" + */ +fr_CH{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/fr_FR.txt b/icuSources/data/coll/fr_FR.txt new file mode 100644 index 00000000..3ae19af4 --- /dev/null +++ b/icuSources/data/coll/fr_FR.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "fr" + */ +fr_FR{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/fr_LU.txt b/icuSources/data/coll/fr_LU.txt new file mode 100644 index 00000000..b3a86e91 --- /dev/null +++ b/icuSources/data/coll/fr_LU.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "fr" + */ +fr_LU{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ga.txt b/icuSources/data/coll/ga.txt new file mode 100644 index 00000000..9c9af490 --- /dev/null +++ b/icuSources/data/coll/ga.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "root" + */ +ga{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ga_IE.txt b/icuSources/data/coll/ga_IE.txt new file mode 100644 index 00000000..ae8d3853 --- /dev/null +++ b/icuSources/data/coll/ga_IE.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "root" + */ +ga_IE{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/gu.txt b/icuSources/data/coll/gu.txt new file mode 100644 index 00000000..0a9f1b38 --- /dev/null +++ b/icuSources/data/coll/gu.txt @@ -0,0 +1,20 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/gu.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/gu.xml + */ +gu{ + Version{"1.2"} + collations{ + standard{ + Sequence{" [normalization on ]&હ<઼<ઁ<ં<ઃ&ઽ<્"} + Version{"1.0"} + } + } +} diff --git a/icuSources/data/coll/gu_IN.txt b/icuSources/data/coll/gu_IN.txt new file mode 100644 index 00000000..9fb65a7b --- /dev/null +++ b/icuSources/data/coll/gu_IN.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "gu" + */ +gu_IN{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/haw.txt b/icuSources/data/coll/haw.txt new file mode 100644 index 00000000..6b6b3fb1 --- /dev/null +++ b/icuSources/data/coll/haw.txt @@ -0,0 +1,37 @@ +// *************************************************************************** +// * +// * Copyright (C) 2003-2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// Hawaiian language +// Based on data from Keola Donaghy, University of Hawaii +// Submitted by Deborah Goldsmith, Apple Computer, Inc. + +haw { + Version { "x0.2" } + collations { + standard { + Version { "1.1" } + Sequence { + "&a < e < i < o < u < h < k < l < m < n < p < w < \u02bb" + "&a <<< A" + "&e <<< E" + "&i <<< I" + "&o <<< O" + "&u <<< U" + "&h <<< H" + "&k <<< K" + "&l <<< L" + "&m <<< M" + "&n <<< N" + "&p <<< P" + "&w <<< W" + // This is the real alphabet + //"&a < e < i < o < u < h < k < l < m < n < p < w < \u02bb" + // or maybe + //"&u < h < k < l < m < n < p < w < \u02bb < b < c < d < f < g < j < q < r < s < t < v < x < y < z" + } + } + } +} diff --git a/icuSources/data/coll/he.txt b/icuSources/data/coll/he.txt new file mode 100644 index 00000000..4f012612 --- /dev/null +++ b/icuSources/data/coll/he.txt @@ -0,0 +1,20 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/he.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/he.xml + */ +he{ + Version{"1.2"} + collations{ + standard{ + Sequence{" [normalization on ]"} + Version{"3.0"} + } + } +} diff --git a/icuSources/data/coll/he_IL.txt b/icuSources/data/coll/he_IL.txt new file mode 100644 index 00000000..370471db --- /dev/null +++ b/icuSources/data/coll/he_IL.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "he" + */ +he_IL{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/hi.txt b/icuSources/data/coll/hi.txt new file mode 100644 index 00000000..fdd7e0eb --- /dev/null +++ b/icuSources/data/coll/hi.txt @@ -0,0 +1,29 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/hi.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/hi.xml + */ +hi{ + Version{"1.2"} + collations{ + direct{ + Sequence{ + "&[last regular ]<ँ<ं<ः<अ<आ<इ<ई<उ<ऊ<ऋ<ऌ<ऍ<ऎ<ए<ऐ<ऑ<ऒ<ओ<औ<क<ख<ग<घ<ङ<च<छ" + "<ज<झ<ञ<ट<ठ<ड<ढ<ण<त<थ<द<ध<न<ऩ<प<फ<ब<भ<म<य<र<ऱ<ल<ळ<ऴ<व<श<ष<स<ह<़<ऽ<ा<ि" + "<ी<ु<ू<ृ<ॄ<ॅ<ॆ<े<ै<ॉ<ॊ<ो<ौ<्<ॐ<॑<॒<॓<॔<क़<ख़<ग़<ज़<ड़<ढ़<फ़<य़<ॠ<ॡ<ॢ" + "<ॣ<।<॥<०<१<२<३<४<५<६<७<८<९<॰" + } + Version{"1.0"} + } + standard{ + Sequence{" [normalization on ]&[before 1]0<ॐ<।<॥<॰&ह<़<ँ<ं<ः<॑<॒<॓<॔&ऽ<्"} + Version{"2.0"} + } + } +} diff --git a/icuSources/data/coll/hi_IN.txt b/icuSources/data/coll/hi_IN.txt new file mode 100644 index 00000000..c9fd7226 --- /dev/null +++ b/icuSources/data/coll/hi_IN.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "hi" + */ +hi_IN{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/hi__DIRECT.txt b/icuSources/data/coll/hi__DIRECT.txt new file mode 100644 index 00000000..5f4b5221 --- /dev/null +++ b/icuSources/data/coll/hi__DIRECT.txt @@ -0,0 +1,13 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +hi__DIRECT{ + collations{ + default{"direct"} + } +} diff --git a/icuSources/data/coll/hr.txt b/icuSources/data/coll/hr.txt new file mode 100644 index 00000000..0b732731 --- /dev/null +++ b/icuSources/data/coll/hr.txt @@ -0,0 +1,27 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/hr.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/hr.xml + */ +hr{ + Version{"1.2"} + collations{ + standard{ + Sequence{ + "&C<č<<<Č<ć<<<Ć" + "&D source: ../../../locale/icu/collation/hu.xml + */ +hu{ + Version{"1.2"} + collations{ + standard{ + Sequence{ + "&C source: ../../../locale/icu/collation/is.xml + */ +is{ + Version{"1.2"} + collations{ + standard{ + Sequence{ + "&[before 1]b<á<<<Á" + "&d<<đ<<<Đ<ð<<<Ð" + "&[before 1]f<é<<<É" + "&[before 1]j<í<<<Í" + "&[before 1]p<ó<<<Ó" + "&[before 1]v<ú<<<Ú" + "&[before 1]z<ý<<<Ý" + "&[before 1]ʒ<þ<<<Þ<æ<<<Æ<<ä<<<Ä<ö<<<Ö<<ø<<<Ø<å<<<Å" + } + Version{"2.0"} + } + } +} diff --git a/icuSources/data/coll/is_IS.txt b/icuSources/data/coll/is_IS.txt new file mode 100644 index 00000000..ec8fe7f2 --- /dev/null +++ b/icuSources/data/coll/is_IS.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "is" + */ +is_IS{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/it.txt b/icuSources/data/coll/it.txt new file mode 100644 index 00000000..9b58c5b8 --- /dev/null +++ b/icuSources/data/coll/it.txt @@ -0,0 +1,20 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/it.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/it.xml + */ +it{ + Version{"1.2"} + collations{ + standard{ + Sequence{"&ae<<æ<<<Æ"} + Version{"1.0"} + } + } +} diff --git a/icuSources/data/coll/it_CH.txt b/icuSources/data/coll/it_CH.txt new file mode 100644 index 00000000..668fe59d --- /dev/null +++ b/icuSources/data/coll/it_CH.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "it" + */ +it_CH{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/it_IT.txt b/icuSources/data/coll/it_IT.txt new file mode 100644 index 00000000..8941cdc9 --- /dev/null +++ b/icuSources/data/coll/it_IT.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "it" + */ +it_IT{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ja.txt b/icuSources/data/coll/ja.txt new file mode 100644 index 00000000..f7f9689c --- /dev/null +++ b/icuSources/data/coll/ja.txt @@ -0,0 +1,513 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/ja.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/ja.xml + */ +ja{ + Version{"1.2"} + collations{ + standard{ + Sequence{ + " [strength 3 ] [hiraganaQ on ]" + "&ヽ=ヽ=ゝ" + "&[before 3]ァ<<<ァ|ー=ァ|ー=ぁ|ー=ア|ー=ア|ー=あ|ー=カ|ー=カ|ー=か|ー=ガ|ー=が|ー=サ|ー=サ|ー=さ" + "|ー=ザ|ー=ざ|ー=タ|ー=タ|ー=た|ー=ダ|ー=だ|ー=ナ|ー=ナ|ー=な|ー=ハ|ー=ハ|ー=は|ー=バ|ー=ば|ー=パ|ー=ぱ" + "|ー=マ|ー=マ|ー=ま|ー=ャ|ー=ャ|ー=ゃ|ー=ヤ|ー=ヤ|ー=や|ー=ラ|ー=ラ|ー=ら|ー=ヮ|ー=ゎ|ー=ワ|ー=ワ|ー=わ" + "|ー=ヵ|ー=ヷ|ー" + "&[before 3]ィ<<<ィ|ー=ィ|ー=ぃ|ー=イ|ー=イ|ー=い|ー=キ|ー=キ|ー=き|ー=ギ|ー=ぎ|ー=シ|ー=シ|ー=し" + "|ー=ジ|ー=じ|ー=チ|ー=チ|ー=ち|ー=ヂ|ー=ぢ|ー=ニ|ー=ニ|ー=に|ー=ヒ|ー=ヒ|ー=ひ|ー=ビ|ー=び|ー=ピ|ー=ぴ" + "|ー=ミ|ー=ミ|ー=み|ー=リ|ー=リ|ー=り|ー=ヰ|ー=ゐ|ー=ヸ|ー" + "&[before 3]ゥ<<<ゥ|ー=ゥ|ー=ぅ|ー=ウ|ー=ウ|ー=う|ー=ク|ー=ク|ー=く|ー=グ|ー=ぐ|ー=ス|ー=ス|ー=す" + "|ー=ズ|ー=ず|ー=ッ|ー=ッ|ー=っ|ー=ツ|ー=ツ|ー=つ|ー=ヅ|ー=づ|ー=ヌ|ー=ヌ|ー=ぬ|ー=フ|ー=フ|ー=ふ|ー=ブ" + "|ー=ぶ|ー=プ|ー=ぷ|ー=ム|ー=ム|ー=む|ー=ュ|ー=ュ|ー=ゅ|ー=ユ|ー=ユ|ー=ゆ|ー=ル|ー=ル|ー=る|ー=ヴ|ー=ゔ" + "|ー" + "&[before 3]ェ<<<ェ|ー=ェ|ー=ぇ|ー=エ|ー=エ|ー=え|ー=ケ|ー=ケ|ー=け|ー=ゲ|ー=げ|ー=セ|ー=セ|ー=せ" + "|ー=ゼ|ー=ぜ|ー=テ|ー=テ|ー=て|ー=デ|ー=で|ー=ネ|ー=ネ|ー=ね|ー=ヘ|ー=ヘ|ー=へ|ー=ベ|ー=べ|ー=ペ|ー=ぺ" + "|ー=メ|ー=メ|ー=め|ー=レ|ー=レ|ー=れ|ー=ヱ|ー=ゑ|ー=ヶ|ー=ヹ|ー" + "&[before 3]ォ<<<ォ|ー=ォ|ー=ぉ|ー=オ|ー=オ|ー=お|ー=コ|ー=コ|ー=こ|ー=ゴ|ー=ご|ー=ソ|ー=ソ|ー=そ" + "|ー=ゾ|ー=ぞ|ー=ト|ー=ト|ー=と|ー=ド|ー=ど|ー=ノ|ー=ノ|ー=の|ー=ホ|ー=ホ|ー=ほ|ー=ボ|ー=ぼ|ー=ポ|ー=ぽ" + "|ー=モ|ー=モ|ー=も|ー=ョ|ー=ョ|ー=ょ|ー=ヨ|ー=ヨ|ー=よ|ー=ロ|ー=ロ|ー=ろ|ー=ヲ|ー=ヲ|ー=を|ー=ヺ|ー" + "&[before 3]ア<<<ア|ヽ=ア|ヽ=あ|ゝ=ァ|ヽ=ァ|ヽ=ぁ|ゝ" + "&[before 3]イ<<<イ|ヽ=イ|ヽ=い|ゝ=ィ|ヽ=ィ|ヽ=ぃ|ゝ" + "&[before 3]ウ<<<ウ|ヽ=ウ|ヽ=う|ゝ=ゥ|ヽ=ゥ|ヽ=ぅ|ゝ=ヴ|ヽ=ゔ|ゝ=ウ|ヾ/゙=ウ|ヾ/゙=う|ゞ/゙=ゥ|ヾ" + "/゙=ゥ|ヾ/゙=ぅ|ゞ/゙=ヴ|ヾ/゙=ゔ|ゞ/゙" + "&[before 3]エ<<<エ|ヽ=エ|ヽ=え|ゝ=ェ|ヽ=ェ|ヽ=ぇ|ゝ" + "&[before 3]オ<<<オ|ヽ=オ|ヽ=お|ゝ=ォ|ヽ=ォ|ヽ=ぉ|ゝ" + "&[before 3]カ<<<カ|ヽ=カ|ヽ=か|ゝ=ヵ|ヽ" + "&[before 3]ガ<<<ガ|ヽ=が|ゝ" + "&[before 3]キ<<<キ|ヽ=キ|ヽ=き|ゝ=ギ|ヽ=ぎ|ゝ=キ|ヾ/゙=キ|ヾ/゙=き|ゞ/゙=ギ|ヾ/゙=ぎ|ゞ/゙" + "&[before 3]ク<<<ク|ヽ=ク|ヽ=く|ゝ=グ|ヽ=ぐ|ゝ=ク|ヾ/゙=ク|ヾ/゙=く|ゞ/゙=グ|ヾ/゙=ぐ|ゞ/゙" + "&[before 3]ケ<<<ケ|ヽ=ケ|ヽ=け|ゝ=ヶ|ヽ" + "&[before 3]ゲ<<<ゲ|ヽ=げ|ゝ" + "&[before 3]コ<<<コ|ヽ=コ|ヽ=こ|ゝ=ゴ|ヽ=ご|ゝ=コ|ヾ/゙=コ|ヾ/゙=こ|ゞ/゙=ゴ|ヾ/゙=ご|ゞ/゙" + "&[before 3]サ<<<サ|ヽ=サ|ヽ=さ|ゝ=ザ|ヽ=ざ|ゝ=サ|ヾ/゙=サ|ヾ/゙=さ|ゞ/゙=ザ|ヾ/゙=ざ|ゞ/゙" + "&[before 3]シ<<<シ|ヽ=シ|ヽ=し|ゝ=ジ|ヽ=じ|ゝ=シ|ヾ/゙=シ|ヾ/゙=し|ゞ/゙=ジ|ヾ/゙=じ|ゞ/゙" + "&[before 3]ス<<<ス|ヽ=ス|ヽ=す|ゝ=ズ|ヽ=ず|ゝ=ス|ヾ/゙=ス|ヾ/゙=す|ゞ/゙=ズ|ヾ/゙=ず|ゞ/゙" + "&[before 3]セ<<<セ|ヽ=セ|ヽ=せ|ゝ=ゼ|ヽ=ぜ|ゝ=セ|ヾ/゙=セ|ヾ/゙=せ|ゞ/゙=ゼ|ヾ/゙=ぜ|ゞ/゙" + "&[before 3]ソ<<<ソ|ヽ=ソ|ヽ=そ|ゝ=ゾ|ヽ=ぞ|ゝ=ソ|ヾ/゙=ソ|ヾ/゙=そ|ゞ/゙=ゾ|ヾ/゙=ぞ|ゞ/゙" + "&[before 3]タ<<<タ|ヽ=タ|ヽ=た|ゝ=ダ|ヽ=だ|ゝ=タ|ヾ/゙=タ|ヾ/゙=た|ゞ/゙=ダ|ヾ/゙=だ|ゞ/゙" + "&[before 3]チ<<<チ|ヽ=チ|ヽ=ち|ゝ=ヂ|ヽ=ぢ|ゝ=チ|ヾ/゙=チ|ヾ/゙=ち|ゞ/゙=ヂ|ヾ/゙=ぢ|ゞ/゙" + "&[before 3]ツ<<<ツ|ヽ=ツ|ヽ=つ|ゝ=ッ|ヽ=ッ|ヽ=っ|ゝ=ヅ|ヽ=づ|ゝ=ツ|ヾ/゙=ツ|ヾ/゙=つ|ゞ/゙=ヅ|ヾ" + "/゙=づ|ゞ/゙=ツ|ヽ=ツ|ヽ=つ|ゝ=ッ|ヾ/゙=ッ|ヾ/゙=っ|ゞ/゙=ツ|ヾ/゙=ツ|ヾ/゙=つ|ゞ/゙" + "&[before 3]テ<<<テ|ヽ=テ|ヽ=て|ゝ=デ|ヽ=で|ゝ=テ|ヾ/゙=テ|ヾ/゙=て|ゞ/゙=デ|ヾ/゙=で|ゞ/゙" + "&[before 3]ト<<<ト|ヽ=ト|ヽ=と|ゝ=ド|ヽ=ど|ゝ=ト|ヾ/゙=ト|ヾ/゙=と|ゞ/゙=ド|ヾ/゙=ど|ゞ/゙" + "&[before 3]ナ<<<ナ|ヽ=ナ|ヽ=な|ゝ" + "&[before 3]ニ<<<ニ|ヽ=ニ|ヽ=に|ゝ" + "&[before 3]ヌ<<<ヌ|ヽ=ヌ|ヽ=ぬ|ゝ" + "&[before 3]ネ<<<ネ|ヽ=ネ|ヽ=ね|ゝ" + "&[before 3]ノ<<<ノ|ヽ=ノ|ヽ=の|ゝ" + "&[before 3]ハ<<<ハ|ヽ=ハ|ヽ=は|ゝ=バ|ヽ=ば|ゝ=ハ|ヾ/゙=ハ|ヾ/゙=は|ゞ/゙=バ|ヾ/゙=ば|ゞ/゙=パ|ヽ" + "=ぱ|ゝ=パ|ヾ/゙=ぱ|ゞ/゙" + "&[before 3]ヒ<<<ヒ|ヽ=ヒ|ヽ=ひ|ゝ=ビ|ヽ=び|ゝ=ヒ|ヾ/゙=ヒ|ヾ/゙=ひ|ゞ/゙=ビ|ヾ/゙=び|ゞ/゙=ピ|ヽ" + "=ぴ|ゝ=ピ|ヾ/゙=ぴ|ゞ/゙" + "&[before 3]フ<<<フ|ヽ=フ|ヽ=ふ|ゝ=ブ|ヽ=ぶ|ゝ=フ|ヾ/゙=フ|ヾ/゙=ふ|ゞ/゙=ブ|ヾ/゙=ぶ|ゞ/゙=プ|ヽ" + "=ぷ|ゝ=プ|ヾ/゙=ぷ|ゞ/゙" + "&[before 3]ヘ<<<ヘ|ヽ=ヘ|ヽ=へ|ゝ=ベ|ヽ=べ|ゝ=ヘ|ヾ/゙=ヘ|ヾ/゙=へ|ゞ/゙=ベ|ヾ/゙=べ|ゞ/゙=ペ|ヽ" + "=ぺ|ゝ=ペ|ヾ/゙=ぺ|ゞ/゙" + "&[before 3]ホ<<<ホ|ヽ=ホ|ヽ=ほ|ゝ=ボ|ヽ=ぼ|ゝ=ホ|ヾ/゙=ホ|ヾ/゙=ほ|ゞ/゙=ボ|ヾ/゙=ぼ|ゞ/゙=ポ|ヽ" + "=ぽ|ゝ=ポ|ヾ/゙=ぽ|ゞ/゙" + "&[before 3]マ<<<マ|ヽ=マ|ヽ=ま|ゝ" + "&[before 3]ミ<<<ミ|ヽ=ミ|ヽ=み|ゝ" + "&[before 3]ム<<<ム|ヽ=ム|ヽ=む|ゝ" + "&[before 3]メ<<<メ|ヽ=メ|ヽ=め|ゝ" + "&[before 3]モ<<<モ|ヽ=モ|ヽ=も|ゝ" + "&[before 3]ヤ<<<ヤ|ヽ=ヤ|ヽ=や|ゝ=ャ|ヽ=ャ|ヽ=ゃ|ゝ" + "&[before 3]ユ<<<ユ|ヽ=ユ|ヽ=ゆ|ゝ=ュ|ヽ=ュ|ヽ=ゅ|ゝ" + "&[before 3]ヨ<<<ヨ|ヽ=ヨ|ヽ=よ|ゝ=ョ|ヽ=ョ|ヽ=ょ|ゝ" + "&[before 3]ラ<<<ラ|ヽ=ラ|ヽ=ら|ゝ" + "&[before 3]リ<<<リ|ヽ=リ|ヽ=り|ゝ" + "&[before 3]ル<<<ル|ヽ=ル|ヽ=る|ゝ" + "&[before 3]レ<<<レ|ヽ=レ|ヽ=れ|ゝ" + "&[before 3]ロ<<<ロ|ヽ=ロ|ヽ=ろ|ゝ" + "&[before 3]ワ<<<ワ|ヽ=ワ|ヽ=わ|ゝ=ヮ|ヽ=ゎ|ゝ=ヷ|ヽ=ワ|ヾ/゙=ワ|ヾ/゙=わ|ゞ/゙=ヷ|ヾ/゙=ヮ|ヾ/゙" + "=ゎ|ゞ/゙" + "&[before 3]ヰ<<<ヰ|ヽ=ゐ|ゝ=ヸ|ヽ=ヰ|ヾ/゙=ゐ|ゞ/゙=ヸ|ヾ/゙" + "&[before 3]ヱ<<<ヱ|ヽ=ゑ|ゝ=ヹ|ヽ=ヱ|ヾ/゙=ゑ|ゞ/゙=ヹ|ヾ/゙" + "&[before 3]ヲ<<<ヲ|ヽ=ヲ|ヽ=を|ゝ=ヺ|ヽ=ヲ|ヾ/゙=ヲ|ヾ/゙=を|ゞ/゙=ヺ|ヾ/゙" + "&[before 3]ン<<<ン|ヽ=ン|ヽ=ん|ゝ" + "&ァ=ァ=ぁ=ァ" + "&ア=ア=あ=ア" + "&ィ=ィ=ぃ=ィ" + "&イ=イ=い=イ" + "&ゥ=ゥ=ぅ=ゥ" + "&ウ=ウ=う=ウ" + "&ェ=ェ=ぇ=ェ" + "&エ=エ=え=エ" + "&ォ=ォ=ぉ=ォ" + "&オ=オ=お=オ" + "&カ=カ=か=カ" + "&キ=キ=き=キ" + "&ク=ク=く=ク" + "&ケ=ケ=け=ケ" + "&コ=コ=こ=コ" + "&サ=サ=さ=サ" + "&シ=シ=し=シ" + "&ス=ス=す=ス" + "&セ=セ=せ=セ" + "&ソ=ソ=そ=ソ" + "&タ=タ=た=タ" + "&チ=チ=ち=チ" + "&ッ=ッ=っ=ッ" + "&ツ=ツ=つ=ツ" + "&テ=テ=て=テ" + "&ト=ト=と=ト" + "&ナ=ナ=な=ナ" + "&ニ=ニ=に=ニ" + "&ヌ=ヌ=ぬ=ヌ" + "&ネ=ネ=ね=ネ" + "&ノ=ノ=の=ノ" + "&ハ=ハ=は=ハ" + "&ヒ=ヒ=ひ=ヒ" + "&フ=フ=ふ=フ" + "&ヘ=ヘ=へ=ヘ" + "&ホ=ホ=ほ=ホ" + "&マ=マ=ま=マ" + "&ミ=ミ=み=ミ" + "&ム=ム=む=ム" + "&メ=メ=め=メ" + "&モ=モ=も=モ" + "&ャ=ャ=ゃ=ャ" + "&ヤ=ヤ=や=ヤ" + "&ュ=ュ=ゅ=ュ" + "&ユ=ユ=ゆ=ユ" + "&ョ=ョ=ょ=ョ" + "&ヨ=ヨ=よ=ヨ" + "&ラ=ラ=ら=ラ" + "&リ=リ=り=リ" + "&ル=ル=る=ル" + "&レ=レ=れ=レ" + "&ロ=ロ=ろ=ロ" + "&ヮ=ヮ=ゎ" + "&ワ=ワ=わ=ワ" + "&ヰ=ヰ=ゐ" + "&ヱ=ヱ=ゑ" + "&ヲ=ヲ=を=ヲ" + "&ン=ン=ん=ン" + "&ヵ=ヵ" + "&ヶ=ヶ" + "&ー=ー" + "&゙=゙" + "&゚=゚" + "&'\u0020'='\u3000'= ̄" + "&'!'=!" + "&'\"'="" + "&'#'=#" + "&'$'=$" + "&'%'=%" + "&'&'=&" + "&''='" + "&'('=(" + "&')'=)" + "&'*'=*" + "&'+'=+" + "&','=," + "&'-'=-" + "&'.'=." + "&'/'=/" + "&0=0" + "&1=1" + "&2=2" + "&3=3" + "&4=4" + "&5=5" + "&6=6" + "&7=7" + "&8=8" + "&9=9" + "&':'=:" + "&';'=;" + "&'<'=<" + "&'='==" + "&'>'=>" + "&'?'=?" + "&'@'=@" + "&A=A" + "&B=B" + "&C=C" + "&D=D" + "&E=E" + "&F=F" + "&G=G" + "&H=H" + "&I=I" + "&J=J" + "&K=K" + "&L=L" + "&M=M" + "&N=N" + "&O=O" + "&P=P" + "&Q=Q" + "&R=R" + "&S=S" + "&T=T" + "&U=U" + "&V=V" + "&W=W" + "&X=X" + "&Y=Y" + "&Z=Z" + "&'['=[" + "&''=\" + "&']'=]" + "&'^'=^" + "&'_'=_" + "&'`'=`" + "&a=a" + "&b=b" + "&c=c" + "&d=d" + "&e=e" + "&f=f" + "&g=g" + "&h=h" + "&i=i" + "&j=j" + "&k=k" + "&l=l" + "&m=m" + "&n=n" + "&o=o" + "&p=p" + "&q=q" + "&r=r" + "&s=s" + "&t=t" + "&u=u" + "&v=v" + "&w=w" + "&x=x" + "&y=y" + "&z=z" + "&'{'={" + "&'|'=|" + "&'}'=}" + "&'~'=~" + "&¢=¢" + "&£=£" + "&¥=¥" + "&¦=¦" + "&¬=¬" + "&ᄀ=ᄀ" + "&ᄁ=ᄁ" + "&ᄂ=ᄂ" + "&ᄃ=ᄃ" + "&ᄄ=ᄄ" + "&ᄅ=ᄅ" + "&ᄆ=ᄆ" + "&ᄇ=ᄇ" + "&ᄈ=ᄈ" + "&ᄉ=ᄉ" + "&ᄊ=ᄊ" + "&ᄋ=ᄋ" + "&ᄌ=ᄌ" + "&ᄍ=ᄍ" + "&ᄎ=ᄎ" + "&ᄏ=ᄏ" + "&ᄐ=ᄐ" + "&ᄑ=ᄑ" + "&ᄒ=ᄒ" + "&ᄚ=ᄚ" + "&ᄡ=ᄡ" + "&ᅠ=ᅠ" + "&ᅡ=ᅡ" + "&ᅢ=ᅢ" + "&ᅣ=ᅣ" + "&ᅤ=ᅤ" + "&ᅥ=ᅥ" + "&ᅦ=ᅦ" + "&ᅧ=ᅧ" + "&ᅨ=ᅨ" + "&ᅩ=ᅩ" + "&ᅪ=ᅪ" + "&ᅫ=ᅫ" + "&ᅬ=ᅬ" + "&ᅭ=ᅭ" + "&ᅮ=ᅮ" + "&ᅯ=ᅯ" + "&ᅰ=ᅰ" + "&ᅱ=ᅱ" + "&ᅲ=ᅲ" + "&ᅳ=ᅳ" + "&ᅴ=ᅴ" + "&ᅵ=ᅵ" + "&ᆪ=ᆪ" + "&ᆬ=ᆬ" + "&ᆭ=ᆭ" + "&ᆰ=ᆰ" + "&ᆱ=ᆱ" + "&ᆲ=ᆲ" + "&ᆳ=ᆳ" + "&ᆴ=ᆴ" + "&ᆵ=ᆵ" + "&₩=₩" + "&←=←" + "&↑=↑" + "&→=→" + "&↓=↓" + "&│=│" + "&■=■" + "&○=○" + "&、=、" + "&。=。" + "&「=「" + "&」=」" + "&[last regular ]<亜<唖<娃<阿<哀<愛<挨<姶<逢<葵<茜<穐<悪<握<渥<旭<葦<芦<鯵<梓<圧<斡<扱<宛<姐<虻" + "<飴<絢<綾<鮎<或<粟<袷<安<庵<按<暗<案<闇<鞍<杏<以<伊<位<依<偉<囲<夷<委<威<尉<惟<意<慰<易<椅<為<畏<異<移" + "<維<緯<胃<萎<衣<謂<違<遺<医<井<亥<域<育<郁<磯<一<壱<溢<逸<稲<茨<芋<鰯<允<印<咽<員<因<姻<引<飲<淫<胤<蔭" + "<院<陰<隠<韻<吋<右<宇<烏<羽<迂<雨<卯<鵜<窺<丑<碓<臼<渦<嘘<唄<欝<蔚<鰻<姥<厩<浦<瓜<閏<噂<云<運<雲<荏<餌" + "<叡<営<嬰<影<映<曳<栄<永<泳<洩<瑛<盈<穎<頴<英<衛<詠<鋭<液<疫<益<駅<悦<謁<越<閲<榎<厭<円<園<堰<奄<宴<延" + "<怨<掩<援<沿<演<炎<焔<煙<燕<猿<縁<艶<苑<薗<遠<鉛<鴛<塩<於<汚<甥<凹<央<奥<往<応<押<旺<横<欧<殴<王<翁<襖" + "<鴬<鴎<黄<岡<沖<荻<億<屋<憶<臆<桶<牡<乙<俺<卸<恩<温<穏<音<下<化<仮<何<伽<価<佳<加<可<嘉<夏<嫁<家<寡<科" + "<暇<果<架<歌<河<火<珂<禍<禾<稼<箇<花<苛<茄<荷<華<菓<蝦<課<嘩<貨<迦<過<霞<蚊<俄<峨<我<牙<画<臥<芽<蛾<賀" + "<雅<餓<駕<介<会<解<回<塊<壊<廻<快<怪<悔<恢<懐<戒<拐<改<魁<晦<械<海<灰<界<皆<絵<芥<蟹<開<階<貝<凱<劾<外" + "<咳<害<崖<慨<概<涯<碍<蓋<街<該<鎧<骸<浬<馨<蛙<垣<柿<蛎<鈎<劃<嚇<各<廓<拡<撹<格<核<殻<獲<確<穫<覚<角<赫" + "<較<郭<閣<隔<革<学<岳<楽<額<顎<掛<笠<樫<橿<梶<鰍<潟<割<喝<恰<括<活<渇<滑<葛<褐<轄<且<鰹<叶<椛<樺<鞄<株" + "<兜<竃<蒲<釜<鎌<噛<鴨<栢<茅<萱<粥<刈<苅<瓦<乾<侃<冠<寒<刊<勘<勧<巻<喚<堪<姦<完<官<寛<干<幹<患<感<慣<憾" + "<換<敢<柑<桓<棺<款<歓<汗<漢<澗<潅<環<甘<監<看<竿<管<簡<緩<缶<翰<肝<艦<莞<観<諌<貫<還<鑑<間<閑<関<陥<韓" + "<館<舘<丸<含<岸<巌<玩<癌<眼<岩<翫<贋<雁<頑<顔<願<企<伎<危<喜<器<基<奇<嬉<寄<岐<希<幾<忌<揮<机<旗<既<期" + "<棋<棄<機<帰<毅<気<汽<畿<祈<季<稀<紀<徽<規<記<貴<起<軌<輝<飢<騎<鬼<亀<偽<儀<妓<宜<戯<技<擬<欺<犠<疑<祇" + "<義<蟻<誼<議<掬<菊<鞠<吉<吃<喫<桔<橘<詰<砧<杵<黍<却<客<脚<虐<逆<丘<久<仇<休<及<吸<宮<弓<急<救<朽<求<汲" + "<泣<灸<球<究<窮<笈<級<糾<給<旧<牛<去<居<巨<拒<拠<挙<渠<虚<許<距<鋸<漁<禦<魚<亨<享<京<供<侠<僑<兇<競<共" + "<凶<協<匡<卿<叫<喬<境<峡<強<彊<怯<恐<恭<挟<教<橋<況<狂<狭<矯<胸<脅<興<蕎<郷<鏡<響<饗<驚<仰<凝<尭<暁<業" + "<局<曲<極<玉<桐<粁<僅<勤<均<巾<錦<斤<欣<欽<琴<禁<禽<筋<緊<芹<菌<衿<襟<謹<近<金<吟<銀<九<倶<句<区<狗<玖" + "<矩<苦<躯<駆<駈<駒<具<愚<虞<喰<空<偶<寓<遇<隅<串<櫛<釧<屑<屈<掘<窟<沓<靴<轡<窪<熊<隈<粂<栗<繰<桑<鍬<勲" + "<君<薫<訓<群<軍<郡<卦<袈<祁<係<傾<刑<兄<啓<圭<珪<型<契<形<径<恵<慶<慧<憩<掲<携<敬<景<桂<渓<畦<稽<系<経" + "<継<繋<罫<茎<荊<蛍<計<詣<警<軽<頚<鶏<芸<迎<鯨<劇<戟<撃<激<隙<桁<傑<欠<決<潔<穴<結<血<訣<月<件<倹<倦<健" + "<兼<券<剣<喧<圏<堅<嫌<建<憲<懸<拳<捲<検<権<牽<犬<献<研<硯<絹<県<肩<見<謙<賢<軒<遣<鍵<険<顕<験<鹸<元<原" + "<厳<幻<弦<減<源<玄<現<絃<舷<言<諺<限<乎<個<古<呼<固<姑<孤<己<庫<弧<戸<故<枯<湖<狐<糊<袴<股<胡<菰<虎<誇" + "<跨<鈷<雇<顧<鼓<五<互<伍<午<呉<吾<娯<後<御<悟<梧<檎<瑚<碁<語<誤<護<醐<乞<鯉<交<佼<侯<候<倖<光<公<功<効" + "<勾<厚<口<向<后<喉<坑<垢<好<孔<孝<宏<工<巧<巷<幸<広<庚<康<弘<恒<慌<抗<拘<控<攻<昂<晃<更<杭<校<梗<構<江" + "<洪<浩<港<溝<甲<皇<硬<稿<糠<紅<紘<絞<綱<耕<考<肯<肱<腔<膏<航<荒<行<衡<講<貢<購<郊<酵<鉱<砿<鋼<閤<降<項" + "<香<高<鴻<剛<劫<号<合<壕<拷<濠<豪<轟<麹<克<刻<告<国<穀<酷<鵠<黒<獄<漉<腰<甑<忽<惚<骨<狛<込<此<頃<今<困" + "<坤<墾<婚<恨<懇<昏<昆<根<梱<混<痕<紺<艮<魂<些<佐<叉<唆<嵯<左<差<査<沙<瑳<砂<詐<鎖<裟<坐<座<挫<債<催<再" + "<最<哉<塞<妻<宰<彩<才<採<栽<歳<済<災<采<犀<砕<砦<祭<斎<細<菜<裁<載<際<剤<在<材<罪<財<冴<坂<阪<堺<榊<肴" + "<咲<崎<埼<碕<鷺<作<削<咋<搾<昨<朔<柵<窄<策<索<錯<桜<鮭<笹<匙<冊<刷<察<拶<撮<擦<札<殺<薩<雑<皐<鯖<捌<錆" + "<鮫<皿<晒<三<傘<参<山<惨<撒<散<桟<燦<珊<産<算<纂<蚕<讃<賛<酸<餐<斬<暫<残<仕<仔<伺<使<刺<司<史<嗣<四<士" + "<始<姉<姿<子<屍<市<師<志<思<指<支<孜<斯<施<旨<枝<止<死<氏<獅<祉<私<糸<紙<紫<肢<脂<至<視<詞<詩<試<誌<諮" + "<資<賜<雌<飼<歯<事<似<侍<児<字<寺<慈<持<時<次<滋<治<爾<璽<痔<磁<示<而<耳<自<蒔<辞<汐<鹿<式<識<鴫<竺<軸" + "<宍<雫<七<叱<執<失<嫉<室<悉<湿<漆<疾<質<実<蔀<篠<偲<柴<芝<屡<蕊<縞<舎<写<射<捨<赦<斜<煮<社<紗<者<謝<車" + "<遮<蛇<邪<借<勺<尺<杓<灼<爵<酌<釈<錫<若<寂<弱<惹<主<取<守<手<朱<殊<狩<珠<種<腫<趣<酒<首<儒<受<呪<寿<授" + "<樹<綬<需<囚<収<周<宗<就<州<修<愁<拾<洲<秀<秋<終<繍<習<臭<舟<蒐<衆<襲<讐<蹴<輯<週<酋<酬<集<醜<什<住<充" + "<十<従<戎<柔<汁<渋<獣<縦<重<銃<叔<夙<宿<淑<祝<縮<粛<塾<熟<出<術<述<俊<峻<春<瞬<竣<舜<駿<准<循<旬<楯<殉" + "<淳<準<潤<盾<純<巡<遵<醇<順<処<初<所<暑<曙<渚<庶<緒<署<書<薯<藷<諸<助<叙<女<序<徐<恕<鋤<除<傷<償<勝<匠" + "<升<召<哨<商<唱<嘗<奨<妾<娼<宵<将<小<少<尚<庄<床<廠<彰<承<抄<招<掌<捷<昇<昌<昭<晶<松<梢<樟<樵<沼<消<渉" + "<湘<焼<焦<照<症<省<硝<礁<祥<称<章<笑<粧<紹<肖<菖<蒋<蕉<衝<裳<訟<証<詔<詳<象<賞<醤<鉦<鍾<鐘<障<鞘<上<丈" + "<丞<乗<冗<剰<城<場<壌<嬢<常<情<擾<条<杖<浄<状<畳<穣<蒸<譲<醸<錠<嘱<埴<飾<拭<植<殖<燭<織<職<色<触<食<蝕" + "<辱<尻<伸<信<侵<唇<娠<寝<審<心<慎<振<新<晋<森<榛<浸<深<申<疹<真<神<秦<紳<臣<芯<薪<親<診<身<辛<進<針<震" + "<人<仁<刃<塵<壬<尋<甚<尽<腎<訊<迅<陣<靭<笥<諏<須<酢<図<厨<逗<吹<垂<帥<推<水<炊<睡<粋<翠<衰<遂<酔<錐<錘" + "<随<瑞<髄<崇<嵩<数<枢<趨<雛<据<杉<椙<菅<頗<雀<裾<澄<摺<寸<世<瀬<畝<是<凄<制<勢<姓<征<性<成<政<整<星<晴" + "<棲<栖<正<清<牲<生<盛<精<聖<声<製<西<誠<誓<請<逝<醒<青<静<斉<税<脆<隻<席<惜<戚<斥<昔<析<石<積<籍<績<脊" + "<責<赤<跡<蹟<碩<切<拙<接<摂<折<設<窃<節<説<雪<絶<舌<蝉<仙<先<千<占<宣<専<尖<川<戦<扇<撰<栓<栴<泉<浅<洗" + "<染<潜<煎<煽<旋<穿<箭<線<繊<羨<腺<舛<船<薦<詮<賎<践<選<遷<銭<銑<閃<鮮<前<善<漸<然<全<禅<繕<膳<糎<噌<塑" + "<岨<措<曾<曽<楚<狙<疏<疎<礎<祖<租<粗<素<組<蘇<訴<阻<遡<鼠<僧<創<双<叢<倉<喪<壮<奏<爽<宋<層<匝<惣<想<捜" + "<掃<挿<掻<操<早<曹<巣<槍<槽<漕<燥<争<痩<相<窓<糟<総<綜<聡<草<荘<葬<蒼<藻<装<走<送<遭<鎗<霜<騒<像<増<憎" + "<臓<蔵<贈<造<促<側<則<即<息<捉<束<測<足<速<俗<属<賊<族<続<卒<袖<其<揃<存<孫<尊<損<村<遜<他<多<太<汰<詑" + "<唾<堕<妥<惰<打<柁<舵<楕<陀<駄<騨<体<堆<対<耐<岱<帯<待<怠<態<戴<替<泰<滞<胎<腿<苔<袋<貸<退<逮<隊<黛<鯛" + "<代<台<大<第<醍<題<鷹<滝<瀧<卓<啄<宅<托<択<拓<沢<濯<琢<託<鐸<濁<諾<茸<凧<蛸<只<叩<但<達<辰<奪<脱<巽<竪" + "<辿<棚<谷<狸<鱈<樽<誰<丹<単<嘆<坦<担<探<旦<歎<淡<湛<炭<短<端<箪<綻<耽<胆<蛋<誕<鍛<団<壇<弾<断<暖<檀<段" + "<男<談<値<知<地<弛<恥<智<池<痴<稚<置<致<蜘<遅<馳<築<畜<竹<筑<蓄<逐<秩<窒<茶<嫡<着<中<仲<宙<忠<抽<昼<柱" + "<注<虫<衷<註<酎<鋳<駐<樗<瀦<猪<苧<著<貯<丁<兆<凋<喋<寵<帖<帳<庁<弔<張<彫<徴<懲<挑<暢<朝<潮<牒<町<眺<聴" + "<脹<腸<蝶<調<諜<超<跳<銚<長<頂<鳥<勅<捗<直<朕<沈<珍<賃<鎮<陳<津<墜<椎<槌<追<鎚<痛<通<塚<栂<掴<槻<佃<漬" + "<柘<辻<蔦<綴<鍔<椿<潰<坪<壷<嬬<紬<爪<吊<釣<鶴<亭<低<停<偵<剃<貞<呈<堤<定<帝<底<庭<廷<弟<悌<抵<挺<提<梯" + "<汀<碇<禎<程<締<艇<訂<諦<蹄<逓<邸<鄭<釘<鼎<泥<摘<擢<敵<滴<的<笛<適<鏑<溺<哲<徹<撤<轍<迭<鉄<典<填<天<展" + "<店<添<纏<甜<貼<転<顛<点<伝<殿<澱<田<電<兎<吐<堵<塗<妬<屠<徒<斗<杜<渡<登<菟<賭<途<都<鍍<砥<砺<努<度<土" + "<奴<怒<倒<党<冬<凍<刀<唐<塔<塘<套<宕<島<嶋<悼<投<搭<東<桃<梼<棟<盗<淘<湯<涛<灯<燈<当<痘<祷<等<答<筒<糖" + "<統<到<董<蕩<藤<討<謄<豆<踏<逃<透<鐙<陶<頭<騰<闘<働<動<同<堂<導<憧<撞<洞<瞳<童<胴<萄<道<銅<峠<鴇<匿<得" + "<徳<涜<特<督<禿<篤<毒<独<読<栃<橡<凸<突<椴<届<鳶<苫<寅<酉<瀞<噸<屯<惇<敦<沌<豚<遁<頓<呑<曇<鈍<奈<那<内" + "<乍<凪<薙<謎<灘<捺<鍋<楢<馴<縄<畷<南<楠<軟<難<汝<二<尼<弐<迩<匂<賑<肉<虹<廿<日<乳<入<如<尿<韮<任<妊<忍" + "<認<濡<禰<祢<寧<葱<猫<熱<年<念<捻<撚<燃<粘<乃<廼<之<埜<嚢<悩<濃<納<能<脳<膿<農<覗<蚤<巴<把<播<覇<杷<波" + "<派<琶<破<婆<罵<芭<馬<俳<廃<拝<排<敗<杯<盃<牌<背<肺<輩<配<倍<培<媒<梅<楳<煤<狽<買<売<賠<陪<這<蝿<秤<矧" + "<萩<伯<剥<博<拍<柏<泊<白<箔<粕<舶<薄<迫<曝<漠<爆<縛<莫<駁<麦<函<箱<硲<箸<肇<筈<櫨<幡<肌<畑<畠<八<鉢<溌" + "<発<醗<髪<伐<罰<抜<筏<閥<鳩<噺<塙<蛤<隼<伴<判<半<反<叛<帆<搬<斑<板<氾<汎<版<犯<班<畔<繁<般<藩<販<範<釆" + "<煩<頒<飯<挽<晩<番<盤<磐<蕃<蛮<匪<卑<否<妃<庇<彼<悲<扉<批<披<斐<比<泌<疲<皮<碑<秘<緋<罷<肥<被<誹<費<避" + "<非<飛<樋<簸<備<尾<微<枇<毘<琵<眉<美<鼻<柊<稗<匹<疋<髭<彦<膝<菱<肘<弼<必<畢<筆<逼<桧<姫<媛<紐<百<謬<俵" + "<彪<標<氷<漂<瓢<票<表<評<豹<廟<描<病<秒<苗<錨<鋲<蒜<蛭<鰭<品<彬<斌<浜<瀕<貧<賓<頻<敏<瓶<不<付<埠<夫<婦" + "<富<冨<布<府<怖<扶<敷<斧<普<浮<父<符<腐<膚<芙<譜<負<賦<赴<阜<附<侮<撫<武<舞<葡<蕪<部<封<楓<風<葺<蕗<伏" + "<副<復<幅<服<福<腹<複<覆<淵<弗<払<沸<仏<物<鮒<分<吻<噴<墳<憤<扮<焚<奮<粉<糞<紛<雰<文<聞<丙<併<兵<塀<幣" + "<平<弊<柄<並<蔽<閉<陛<米<頁<僻<壁<癖<碧<別<瞥<蔑<箆<偏<変<片<篇<編<辺<返<遍<便<勉<娩<弁<鞭<保<舗<鋪<圃" + "<捕<歩<甫<補<輔<穂<募<墓<慕<戊<暮<母<簿<菩<倣<俸<包<呆<報<奉<宝<峰<峯<崩<庖<抱<捧<放<方<朋<法<泡<烹<砲" + "<縫<胞<芳<萌<蓬<蜂<褒<訪<豊<邦<鋒<飽<鳳<鵬<乏<亡<傍<剖<坊<妨<帽<忘<忙<房<暴<望<某<棒<冒<紡<肪<膨<謀<貌" + "<貿<鉾<防<吠<頬<北<僕<卜<墨<撲<朴<牧<睦<穆<釦<勃<没<殆<堀<幌<奔<本<翻<凡<盆<摩<磨<魔<麻<埋<妹<昧<枚<毎" + "<哩<槙<幕<膜<枕<鮪<柾<鱒<桝<亦<俣<又<抹<末<沫<迄<侭<繭<麿<万<慢<満<漫<蔓<味<未<魅<巳<箕<岬<密<蜜<湊<蓑" + "<稔<脈<妙<粍<民<眠<務<夢<無<牟<矛<霧<鵡<椋<婿<娘<冥<名<命<明<盟<迷<銘<鳴<姪<牝<滅<免<棉<綿<緬<面<麺<摸" + "<模<茂<妄<孟<毛<猛<盲<網<耗<蒙<儲<木<黙<目<杢<勿<餅<尤<戻<籾<貰<問<悶<紋<門<匁<也<冶<夜<爺<耶<野<弥<矢" + "<厄<役<約<薬<訳<躍<靖<柳<薮<鑓<愉<愈<油<癒<諭<輸<唯<佑<優<勇<友<宥<幽<悠<憂<揖<有<柚<湧<涌<猶<猷<由<祐" + "<裕<誘<遊<邑<郵<雄<融<夕<予<余<与<誉<輿<預<傭<幼<妖<容<庸<揚<揺<擁<曜<楊<様<洋<溶<熔<用<窯<羊<耀<葉<蓉" + "<要<謡<踊<遥<陽<養<慾<抑<欲<沃<浴<翌<翼<淀<羅<螺<裸<来<莱<頼<雷<洛<絡<落<酪<乱<卵<嵐<欄<濫<藍<蘭<覧<利" + "<吏<履<李<梨<理<璃<痢<裏<裡<里<離<陸<律<率<立<葎<掠<略<劉<流<溜<琉<留<硫<粒<隆<竜<龍<侶<慮<旅<虜<了<亮" + "<僚<両<凌<寮<料<梁<涼<猟<療<瞭<稜<糧<良<諒<遼<量<陵<領<力<緑<倫<厘<林<淋<燐<琳<臨<輪<隣<鱗<麟<瑠<塁<涙" + "<累<類<令<伶<例<冷<励<嶺<怜<玲<礼<苓<鈴<隷<零<霊<麗<齢<暦<歴<列<劣<烈<裂<廉<恋<憐<漣<煉<簾<練<聯<蓮<連" + "<錬<呂<魯<櫓<炉<賂<路<露<労<婁<廊<弄<朗<楼<榔<浪<漏<牢<狼<篭<老<聾<蝋<郎<六<麓<禄<肋<録<論<倭<和<話<歪" + "<賄<脇<惑<枠<鷲<亙<亘<鰐<詫<藁<蕨<椀<湾<碗<腕<弌<丐<丕<个<丱<丶<丼<丿<乂<乖<乘<亂<亅<豫<亊<舒<弍<于<亞" + "<亟<亠<亢<亰<亳<亶<从<仍<仄<仆<仂<仗<仞<仭<仟<价<伉<佚<估<佛<佝<佗<佇<佶<侈<侏<侘<佻<佩<佰<侑<佯<來<侖" + "<儘<俔<俟<俎<俘<俛<俑<俚<俐<俤<俥<倚<倨<倔<倪<倥<倅<伜<俶<倡<倩<倬<俾<俯<們<倆<偃<假<會<偕<偐<偈<做<偖" + "<偬<偸<傀<傚<傅<傴<傲<僉<僊<傳<僂<僖<僞<僥<僭<僣<僮<價<僵<儉<儁<儂<儖<儕<儔<儚<儡<儺<儷<儼<儻<儿<兀<兒" + "<兌<兔<兢<竸<兩<兪<兮<冀<冂<囘<册<冉<冏<冑<冓<冕<冖<冤<冦<冢<冩<冪<冫<决<冱<冲<冰<况<冽<凅<凉<凛<几<處" + "<凩<凭<凰<凵<凾<刄<刋<刔<刎<刧<刪<刮<刳<刹<剏<剄<剋<剌<剞<剔<剪<剴<剩<剳<剿<剽<劍<劔<劒<剱<劈<劑<辨<辧" + "<劬<劭<劼<劵<勁<勍<勗<勞<勣<勦<飭<勠<勳<勵<勸<勹<匆<匈<甸<匍<匐<匏<匕<匚<匣<匯<匱<匳<匸<區<卆<卅<丗<卉" + "<卍<凖<卞<卩<卮<夘<卻<卷<厂<厖<厠<厦<厥<厮<厰<厶<參<簒<雙<叟<曼<燮<叮<叨<叭<叺<吁<吽<呀<听<吭<吼<吮<吶" + "<吩<吝<呎<咏<呵<咎<呟<呱<呷<呰<咒<呻<咀<呶<咄<咐<咆<哇<咢<咸<咥<咬<哄<哈<咨<咫<哂<咤<咾<咼<哘<哥<哦<唏" + "<唔<哽<哮<哭<哺<哢<唹<啀<啣<啌<售<啜<啅<啖<啗<唸<唳<啝<喙<喀<咯<喊<喟<啻<啾<喘<喞<單<啼<喃<喩<喇<喨<嗚" + "<嗅<嗟<嗄<嗜<嗤<嗔<嘔<嗷<嘖<嗾<嗽<嘛<嗹<噎<噐<營<嘴<嘶<嘲<嘸<噫<噤<嘯<噬<噪<嚆<嚀<嚊<嚠<嚔<嚏<嚥<嚮<嚶" + "<嚴<囂<嚼<囁<囃<囀<囈<囎<囑<囓<囗<囮<囹<圀<囿<圄<圉<圈<國<圍<圓<團<圖<嗇<圜<圦<圷<圸<坎<圻<址<坏<坩<埀" + "<垈<坡<坿<垉<垓<垠<垳<垤<垪<垰<埃<埆<埔<埒<埓<堊<埖<埣<堋<堙<堝<塲<堡<塢<塋<塰<毀<塒<堽<塹<墅<墹<墟<墫" + "<墺<壞<墻<墸<墮<壅<壓<壑<壗<壙<壘<壥<壜<壤<壟<壯<壺<壹<壻<壼<壽<夂<夊<夐<夛<梦<夥<夬<夭<夲<夸<夾<竒<奕" + "<奐<奎<奚<奘<奢<奠<奧<奬<奩<奸<妁<妝<佞<侫<妣<妲<姆<姨<姜<妍<姙<姚<娥<娟<娑<娜<娉<娚<婀<婬<婉<娵<娶<婢" + "<婪<媚<媼<媾<嫋<嫂<媽<嫣<嫗<嫦<嫩<嫖<嫺<嫻<嬌<嬋<嬖<嬲<嫐<嬪<嬶<嬾<孃<孅<孀<孑<孕<孚<孛<孥<孩<孰<孳<孵" + "<學<斈<孺<宀<它<宦<宸<寃<寇<寉<寔<寐<寤<實<寢<寞<寥<寫<寰<寶<寳<尅<將<專<對<尓<尠<尢<尨<尸<尹<屁<屆<屎" + "<屓<屐<屏<孱<屬<屮<乢<屶<屹<岌<岑<岔<妛<岫<岻<岶<岼<岷<峅<岾<峇<峙<峩<峽<峺<峭<嶌<峪<崋<崕<崗<嵜<崟<崛" + "<崑<崔<崢<崚<崙<崘<嵌<嵒<嵎<嵋<嵬<嵳<嵶<嶇<嶄<嶂<嶢<嶝<嶬<嶮<嶽<嶐<嶷<嶼<巉<巍<巓<巒<巖<巛<巫<已<巵<帋" + "<帚<帙<帑<帛<帶<帷<幄<幃<幀<幎<幗<幔<幟<幢<幤<幇<幵<并<幺<麼<广<庠<廁<廂<廈<廐<廏<廖<廣<廝<廚<廛<廢<廡" + "<廨<廩<廬<廱<廳<廰<廴<廸<廾<弃<弉<彝<彜<弋<弑<弖<弩<弭<弸<彁<彈<彌<彎<弯<彑<彖<彗<彙<彡<彭<彳<彷<徃<徂" + "<彿<徊<很<徑<徇<從<徙<徘<徠<徨<徭<徼<忖<忻<忤<忸<忱<忝<悳<忿<怡<恠<怙<怐<怩<怎<怱<怛<怕<怫<怦<怏<怺<恚" + "<恁<恪<恷<恟<恊<恆<恍<恣<恃<恤<恂<恬<恫<恙<悁<悍<惧<悃<悚<悄<悛<悖<悗<悒<悧<悋<惡<悸<惠<惓<悴<忰<悽<惆" + "<悵<惘<慍<愕<愆<惶<惷<愀<惴<惺<愃<愡<惻<惱<愍<愎<慇<愾<愨<愧<慊<愿<愼<愬<愴<愽<慂<慄<慳<慷<慘<慙<慚<慫" + "<慴<慯<慥<慱<慟<慝<慓<慵<憙<憖<憇<憬<憔<憚<憊<憑<憫<憮<懌<懊<應<懷<懈<懃<懆<憺<懋<罹<懍<懦<懣<懶<懺<懴" + "<懿<懽<懼<懾<戀<戈<戉<戍<戌<戔<戛<戞<戡<截<戮<戰<戲<戳<扁<扎<扞<扣<扛<扠<扨<扼<抂<抉<找<抒<抓<抖<拔<抃" + "<抔<拗<拑<抻<拏<拿<拆<擔<拈<拜<拌<拊<拂<拇<抛<拉<挌<拮<拱<挧<挂<挈<拯<拵<捐<挾<捍<搜<捏<掖<掎<掀<掫<捶" + "<掣<掏<掉<掟<掵<捫<捩<掾<揩<揀<揆<揣<揉<插<揶<揄<搖<搴<搆<搓<搦<搶<攝<搗<搨<搏<摧<摯<摶<摎<攪<撕<撓<撥" + "<撩<撈<撼<據<擒<擅<擇<撻<擘<擂<擱<擧<舉<擠<擡<抬<擣<擯<攬<擶<擴<擲<擺<攀<擽<攘<攜<攅<攤<攣<攫<攴<攵<攷" + "<收<攸<畋<效<敖<敕<敍<敘<敞<敝<敲<數<斂<斃<變<斛<斟<斫<斷<旃<旆<旁<旄<旌<旒<旛<旙<无<旡<旱<杲<昊<昃<旻" + "<杳<昵<昶<昴<昜<晏<晄<晉<晁<晞<晝<晤<晧<晨<晟<晢<晰<暃<暈<暎<暉<暄<暘<暝<曁<暹<曉<暾<暼<曄<暸<曖<曚<曠" + "<昿<曦<曩<曰<曵<曷<朏<朖<朞<朦<朧<霸<朮<朿<朶<杁<朸<朷<杆<杞<杠<杙<杣<杤<枉<杰<枩<杼<杪<枌<枋<枦<枡<枅" + "<枷<柯<枴<柬<枳<柩<枸<柤<柞<柝<柢<柮<枹<柎<柆<柧<檜<栞<框<栩<桀<桍<栲<桎<梳<栫<桙<档<桷<桿<梟<梏<梭<梔" + "<條<梛<梃<檮<梹<桴<梵<梠<梺<椏<梍<桾<椁<棊<椈<棘<椢<椦<棡<椌<棍<棔<棧<棕<椶<椒<椄<棗<棣<椥<棹<棠<棯<椨" + "<椪<椚<椣<椡<棆<楹<楷<楜<楸<楫<楔<楾<楮<椹<楴<椽<楙<椰<楡<楞<楝<榁<楪<榲<榮<槐<榿<槁<槓<榾<槎<寨<槊<槝" + "<榻<槃<榧<樮<榑<榠<榜<榕<榴<槞<槨<樂<樛<槿<權<槹<槲<槧<樅<榱<樞<槭<樔<槫<樊<樒<櫁<樣<樓<橄<樌<橲<樶<橸" + "<橇<橢<橙<橦<橈<樸<樢<檐<檍<檠<檄<檢<檣<檗<蘗<檻<櫃<櫂<檸<檳<檬<櫞<櫑<櫟<檪<櫚<櫪<櫻<欅<蘖<櫺<欒<欖<鬱" + "<欟<欸<欷<盜<欹<飮<歇<歃<歉<歐<歙<歔<歛<歟<歡<歸<歹<歿<殀<殄<殃<殍<殘<殕<殞<殤<殪<殫<殯<殲<殱<殳<殷<殼" + "<毆<毋<毓<毟<毬<毫<毳<毯<麾<氈<氓<气<氛<氤<氣<汞<汕<汢<汪<沂<沍<沚<沁<沛<汾<汨<汳<沒<沐<泄<泱<泓<沽<泗" + "<泅<泝<沮<沱<沾<沺<泛<泯<泙<泪<洟<衍<洶<洫<洽<洸<洙<洵<洳<洒<洌<浣<涓<浤<浚<浹<浙<涎<涕<濤<涅<淹<渕<渊" + "<涵<淇<淦<涸<淆<淬<淞<淌<淨<淒<淅<淺<淙<淤<淕<淪<淮<渭<湮<渮<渙<湲<湟<渾<渣<湫<渫<湶<湍<渟<湃<渺<湎<渤" + "<滿<渝<游<溂<溪<溘<滉<溷<滓<溽<溯<滄<溲<滔<滕<溏<溥<滂<溟<潁<漑<灌<滬<滸<滾<漿<滲<漱<滯<漲<滌<漾<漓<滷" + "<澆<潺<潸<澁<澀<潯<潛<濳<潭<澂<潼<潘<澎<澑<濂<潦<澳<澣<澡<澤<澹<濆<澪<濟<濕<濬<濔<濘<濱<濮<濛<瀉<瀋<濺" + "<瀑<瀁<瀏<濾<瀛<瀚<潴<瀝<瀘<瀟<瀰<瀾<瀲<灑<灣<炙<炒<炯<烱<炬<炸<炳<炮<烟<烋<烝<烙<焉<烽<焜<焙<煥<煕<熈" + "<煦<煢<煌<煖<煬<熏<燻<熄<熕<熨<熬<燗<熹<熾<燒<燉<燔<燎<燠<燬<燧<燵<燼<燹<燿<爍<爐<爛<爨<爭<爬<爰<爲<爻" + "<爼<爿<牀<牆<牋<牘<牴<牾<犂<犁<犇<犒<犖<犢<犧<犹<犲<狃<狆<狄<狎<狒<狢<狠<狡<狹<狷<倏<猗<猊<猜<猖<猝<猴" + "<猯<猩<猥<猾<獎<獏<默<獗<獪<獨<獰<獸<獵<獻<獺<珈<玳<珎<玻<珀<珥<珮<珞<璢<琅<瑯<琥<珸<琲<琺<瑕<琿<瑟<瑙" + "<瑁<瑜<瑩<瑰<瑣<瑪<瑶<瑾<璋<璞<璧<瓊<瓏<瓔<珱<瓠<瓣<瓧<瓩<瓮<瓲<瓰<瓱<瓸<瓷<甄<甃<甅<甌<甎<甍<甕<甓<甞" + "<甦<甬<甼<畄<畍<畊<畉<畛<畆<畚<畩<畤<畧<畫<畭<畸<當<疆<疇<畴<疊<疉<疂<疔<疚<疝<疥<疣<痂<疳<痃<疵<疽<疸" + "<疼<疱<痍<痊<痒<痙<痣<痞<痾<痿<痼<瘁<痰<痺<痲<痳<瘋<瘍<瘉<瘟<瘧<瘠<瘡<瘢<瘤<瘴<瘰<瘻<癇<癈<癆<癜<癘<癡" + "<癢<癨<癩<癪<癧<癬<癰<癲<癶<癸<發<皀<皃<皈<皋<皎<皖<皓<皙<皚<皰<皴<皸<皹<皺<盂<盍<盖<盒<盞<盡<盥<盧<盪" + "<蘯<盻<眈<眇<眄<眩<眤<眞<眥<眦<眛<眷<眸<睇<睚<睨<睫<睛<睥<睿<睾<睹<瞎<瞋<瞑<瞠<瞞<瞰<瞶<瞹<瞿<瞼<瞽<瞻" + "<矇<矍<矗<矚<矜<矣<矮<矼<砌<砒<礦<砠<礪<硅<碎<硴<碆<硼<碚<碌<碣<碵<碪<碯<磑<磆<磋<磔<碾<碼<磅<磊<磬<磧" + "<磚<磽<磴<礇<礒<礑<礙<礬<礫<祀<祠<祗<祟<祚<祕<祓<祺<祿<禊<禝<禧<齋<禪<禮<禳<禹<禺<秉<秕<秧<秬<秡<秣<稈" + "<稍<稘<稙<稠<稟<禀<稱<稻<稾<稷<穃<穗<穉<穡<穢<穩<龝<穰<穹<穽<窈<窗<窕<窘<窖<窩<竈<窰<窶<竅<竄<窿<邃<竇" + "<竊<竍<竏<竕<竓<站<竚<竝<竡<竢<竦<竭<竰<笂<笏<笊<笆<笳<笘<笙<笞<笵<笨<笶<筐<筺<笄<筍<笋<筌<筅<筵<筥<筴" + "<筧<筰<筱<筬<筮<箝<箘<箟<箍<箜<箚<箋<箒<箏<筝<箙<篋<篁<篌<篏<箴<篆<篝<篩<簑<簔<篦<篥<籠<簀<簇<簓<篳<篷" + "<簗<簍<篶<簣<簧<簪<簟<簷<簫<簽<籌<籃<籔<籏<籀<籐<籘<籟<籤<籖<籥<籬<籵<粃<粐<粤<粭<粢<粫<粡<粨<粳<粲<粱" + "<粮<粹<粽<糀<糅<糂<糘<糒<糜<糢<鬻<糯<糲<糴<糶<糺<紆<紂<紜<紕<紊<絅<絋<紮<紲<紿<紵<絆<絳<絖<絎<絲<絨<絮" + "<絏<絣<經<綉<絛<綏<絽<綛<綺<綮<綣<綵<緇<綽<綫<總<綢<綯<緜<綸<綟<綰<緘<緝<緤<緞<緻<緲<緡<縅<縊<縣<縡<縒" + "<縱<縟<縉<縋<縢<繆<繦<縻<縵<縹<繃<縷<縲<縺<繧<繝<繖<繞<繙<繚<繹<繪<繩<繼<繻<纃<緕<繽<辮<繿<纈<纉<續<纒" + "<纐<纓<纔<纖<纎<纛<纜<缸<缺<罅<罌<罍<罎<罐<网<罕<罔<罘<罟<罠<罨<罩<罧<罸<羂<羆<羃<羈<羇<羌<羔<羞<羝<羚" + "<羣<羯<羲<羹<羮<羶<羸<譱<翅<翆<翊<翕<翔<翡<翦<翩<翳<翹<飜<耆<耄<耋<耒<耘<耙<耜<耡<耨<耿<耻<聊<聆<聒<聘" + "<聚<聟<聢<聨<聳<聲<聰<聶<聹<聽<聿<肄<肆<肅<肛<肓<肚<肭<冐<肬<胛<胥<胙<胝<胄<胚<胖<脉<胯<胱<脛<脩<脣<脯" + "<腋<隋<腆<脾<腓<腑<胼<腱<腮<腥<腦<腴<膃<膈<膊<膀<膂<膠<膕<膤<膣<腟<膓<膩<膰<膵<膾<膸<膽<臀<臂<膺<臉<臍" + "<臑<臙<臘<臈<臚<臟<臠<臧<臺<臻<臾<舁<舂<舅<與<舊<舍<舐<舖<舩<舫<舸<舳<艀<艙<艘<艝<艚<艟<艤<艢<艨<艪<艫" + "<舮<艱<艷<艸<艾<芍<芒<芫<芟<芻<芬<苡<苣<苟<苒<苴<苳<苺<莓<范<苻<苹<苞<茆<苜<茉<苙<茵<茴<茖<茲<茱<荀<茹" + "<荐<荅<茯<茫<茗<茘<莅<莚<莪<莟<莢<莖<茣<莎<莇<莊<荼<莵<荳<荵<莠<莉<莨<菴<萓<菫<菎<菽<萃<菘<萋<菁<菷<萇" + "<菠<菲<萍<萢<萠<莽<萸<蔆<菻<葭<萪<萼<蕚<蒄<葷<葫<蒭<葮<蒂<葩<葆<萬<葯<葹<萵<蓊<葢<蒹<蒿<蒟<蓙<蓍<蒻<蓚" + "<蓐<蓁<蓆<蓖<蒡<蔡<蓿<蓴<蔗<蔘<蔬<蔟<蔕<蔔<蓼<蕀<蕣<蕘<蕈<蕁<蘂<蕋<蕕<薀<薤<薈<薑<薊<薨<蕭<薔<薛<藪<薇" + "<薜<蕷<蕾<薐<藉<薺<藏<薹<藐<藕<藝<藥<藜<藹<蘊<蘓<蘋<藾<藺<蘆<蘢<蘚<蘰<蘿<虍<乕<虔<號<虧<虱<蚓<蚣<蚩<蚪" + "<蚋<蚌<蚶<蚯<蛄<蛆<蚰<蛉<蠣<蚫<蛔<蛞<蛩<蛬<蛟<蛛<蛯<蜒<蜆<蜈<蜀<蜃<蛻<蜑<蜉<蜍<蛹<蜊<蜴<蜿<蜷<蜻<蜥<蜩" + "<蜚<蝠<蝟<蝸<蝌<蝎<蝴<蝗<蝨<蝮<蝙<蝓<蝣<蝪<蠅<螢<螟<螂<螯<蟋<螽<蟀<蟐<雖<螫<蟄<螳<蟇<蟆<螻<蟯<蟲<蟠<蠏" + "<蠍<蟾<蟶<蟷<蠎<蟒<蠑<蠖<蠕<蠢<蠡<蠱<蠶<蠹<蠧<蠻<衄<衂<衒<衙<衞<衢<衫<袁<衾<袞<衵<衽<袵<衲<袂<袗<袒<袮" + "<袙<袢<袍<袤<袰<袿<袱<裃<裄<裔<裘<裙<裝<裹<褂<裼<裴<裨<裲<褄<褌<褊<褓<襃<褞<褥<褪<褫<襁<襄<褻<褶<褸<襌" + "<褝<襠<襞<襦<襤<襭<襪<襯<襴<襷<襾<覃<覈<覊<覓<覘<覡<覩<覦<覬<覯<覲<覺<覽<覿<觀<觚<觜<觝<觧<觴<觸<訃<訖" + "<訐<訌<訛<訝<訥<訶<詁<詛<詒<詆<詈<詼<詭<詬<詢<誅<誂<誄<誨<誡<誑<誥<誦<誚<誣<諄<諍<諂<諚<諫<諳<諧<諤<諱" + "<謔<諠<諢<諷<諞<諛<謌<謇<謚<諡<謖<謐<謗<謠<謳<鞫<謦<謫<謾<謨<譁<譌<譏<譎<證<譖<譛<譚<譫<譟<譬<譯<譴<譽" + "<讀<讌<讎<讒<讓<讖<讙<讚<谺<豁<谿<豈<豌<豎<豐<豕<豢<豬<豸<豺<貂<貉<貅<貊<貍<貎<貔<豼<貘<戝<貭<貪<貽<貲" + "<貳<貮<貶<賈<賁<賤<賣<賚<賽<賺<賻<贄<贅<贊<贇<贏<贍<贐<齎<贓<賍<贔<贖<赧<赭<赱<赳<趁<趙<跂<趾<趺<跏<跚" + "<跖<跌<跛<跋<跪<跫<跟<跣<跼<踈<踉<跿<踝<踞<踐<踟<蹂<踵<踰<踴<蹊<蹇<蹉<蹌<蹐<蹈<蹙<蹤<蹠<踪<蹣<蹕<蹶<蹲" + "<蹼<躁<躇<躅<躄<躋<躊<躓<躑<躔<躙<躪<躡<躬<躰<軆<躱<躾<軅<軈<軋<軛<軣<軼<軻<軫<軾<輊<輅<輕<輒<輙<輓<輜" + "<輟<輛<輌<輦<輳<輻<輹<轅<轂<輾<轌<轉<轆<轎<轗<轜<轢<轣<轤<辜<辟<辣<辭<辯<辷<迚<迥<迢<迪<迯<邇<迴<逅<迹" + "<迺<逑<逕<逡<逍<逞<逖<逋<逧<逶<逵<逹<迸<遏<遐<遑<遒<逎<遉<逾<遖<遘<遞<遨<遯<遶<隨<遲<邂<遽<邁<邀<邊<邉" + "<邏<邨<邯<邱<邵<郢<郤<扈<郛<鄂<鄒<鄙<鄲<鄰<酊<酖<酘<酣<酥<酩<酳<酲<醋<醉<醂<醢<醫<醯<醪<醵<醴<醺<釀<釁" + "<釉<釋<釐<釖<釟<釡<釛<釼<釵<釶<鈞<釿<鈔<鈬<鈕<鈑<鉞<鉗<鉅<鉉<鉤<鉈<銕<鈿<鉋<鉐<銜<銖<銓<銛<鉚<鋏<銹<銷" + "<鋩<錏<鋺<鍄<錮<錙<錢<錚<錣<錺<錵<錻<鍜<鍠<鍼<鍮<鍖<鎰<鎬<鎭<鎔<鎹<鏖<鏗<鏨<鏥<鏘<鏃<鏝<鏐<鏈<鏤<鐚<鐔" + "<鐓<鐃<鐇<鐐<鐶<鐫<鐵<鐡<鐺<鑁<鑒<鑄<鑛<鑠<鑢<鑞<鑪<鈩<鑰<鑵<鑷<鑽<鑚<鑼<鑾<钁<鑿<閂<閇<閊<閔<閖<閘<閙" + "<閠<閨<閧<閭<閼<閻<閹<閾<闊<濶<闃<闍<闌<闕<闔<闖<關<闡<闥<闢<阡<阨<阮<阯<陂<陌<陏<陋<陷<陜<陞<陝<陟<陦" + "<陲<陬<隍<隘<隕<隗<險<隧<隱<隲<隰<隴<隶<隸<隹<雎<雋<雉<雍<襍<雜<霍<雕<雹<霄<霆<霈<霓<霎<霑<霏<霖<霙<霤" + "<霪<霰<霹<霽<霾<靄<靆<靈<靂<靉<靜<靠<靤<靦<靨<勒<靫<靱<靹<鞅<靼<鞁<靺<鞆<鞋<鞏<鞐<鞜<鞨<鞦<鞣<鞳<鞴<韃" + "<韆<韈<韋<韜<韭<齏<韲<竟<韶<韵<頏<頌<頸<頤<頡<頷<頽<顆<顏<顋<顫<顯<顰<顱<顴<顳<颪<颯<颱<颶<飄<飃<飆<飩" + "<飫<餃<餉<餒<餔<餘<餡<餝<餞<餤<餠<餬<餮<餽<餾<饂<饉<饅<饐<饋<饑<饒<饌<饕<馗<馘<馥<馭<馮<馼<駟<駛<駝<駘" + "<駑<駭<駮<駱<駲<駻<駸<騁<騏<騅<駢<騙<騫<騷<驅<驂<驀<驃<騾<驕<驍<驛<驗<驟<驢<驥<驤<驩<驫<驪<骭<骰<骼<髀" + "<髏<髑<髓<體<髞<髟<髢<髣<髦<髯<髫<髮<髴<髱<髷<髻<鬆<鬘<鬚<鬟<鬢<鬣<鬥<鬧<鬨<鬩<鬪<鬮<鬯<鬲<魄<魃<魏<魍" + "<魎<魑<魘<魴<鮓<鮃<鮑<鮖<鮗<鮟<鮠<鮨<鮴<鯀<鯊<鮹<鯆<鯏<鯑<鯒<鯣<鯢<鯤<鯔<鯡<鰺<鯲<鯱<鯰<鰕<鰔<鰉<鰓<鰌" + "<鰆<鰈<鰒<鰊<鰄<鰮<鰛<鰥<鰤<鰡<鰰<鱇<鰲<鱆<鰾<鱚<鱠<鱧<鱶<鱸<鳧<鳬<鳰<鴉<鴈<鳫<鴃<鴆<鴪<鴦<鶯<鴣<鴟<鵄" + "<鴕<鴒<鵁<鴿<鴾<鵆<鵈<鵝<鵞<鵤<鵑<鵐<鵙<鵲<鶉<鶇<鶫<鵯<鵺<鶚<鶤<鶩<鶲<鷄<鷁<鶻<鶸<鶺<鷆<鷏<鷂<鷙<鷓<鷸" + "<鷦<鷭<鷯<鷽<鸚<鸛<鸞<鹵<鹹<鹽<麁<麈<麋<麌<麒<麕<麑<麝<麥<麩<麸<麪<麭<靡<黌<黎<黏<黐<黔<黜<點<黝<黠<黥" + "<黨<黯<黴<黶<黷<黹<黻<黼<黽<鼇<鼈<皷<鼕<鼡<鼬<鼾<齊<齒<齔<齣<齟<齠<齡<齦<齧<齬<齪<齷<齲<齶<龕<龜<龠<堯" + "<槇<遙<瑤<凜<熙" + } + Version{"4.0"} + } + } +} diff --git a/icuSources/data/coll/ja_JP.txt b/icuSources/data/coll/ja_JP.txt new file mode 100644 index 00000000..5882e6b4 --- /dev/null +++ b/icuSources/data/coll/ja_JP.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "ja" + */ +ja_JP{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/kk.txt b/icuSources/data/coll/kk.txt new file mode 100644 index 00000000..20f81dc1 --- /dev/null +++ b/icuSources/data/coll/kk.txt @@ -0,0 +1,20 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/kk.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/kk.xml + */ +kk{ + Version{"1.2"} + collations{ + standard{ + Sequence{" [normalization on ][suppressContractions [Ѐ-џ] ]&[before 1]ү<ұ<<<Ұ"} + Version{"1.0"} + } + } +} diff --git a/icuSources/data/coll/kk_KZ.txt b/icuSources/data/coll/kk_KZ.txt new file mode 100644 index 00000000..8eee6c7f --- /dev/null +++ b/icuSources/data/coll/kk_KZ.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "kk" + */ +kk_KZ{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/kl.txt b/icuSources/data/coll/kl.txt new file mode 100644 index 00000000..f3e04a93 --- /dev/null +++ b/icuSources/data/coll/kl.txt @@ -0,0 +1,26 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/kl.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/kl.xml + */ +kl{ + Version{"1.2"} + collations{ + standard{ + Sequence{ + "&D<<đ<<<Đ<<ð<<<Ð" + "&Q<<ĸ<< source: ../../../locale/icu/collation/kn.xml + */ +kn{ + Version{"1.2"} + collations{ + standard{ + Sequence{" [normalization on ]"} + Version{"1.0"} + } + } +} diff --git a/icuSources/data/coll/kn_IN.txt b/icuSources/data/coll/kn_IN.txt new file mode 100644 index 00000000..6b997673 --- /dev/null +++ b/icuSources/data/coll/kn_IN.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "kn" + */ +kn_IN{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ko.txt b/icuSources/data/coll/ko.txt new file mode 100644 index 00000000..bd917b29 --- /dev/null +++ b/icuSources/data/coll/ko.txt @@ -0,0 +1,687 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/ko.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/ko.xml + */ +ko{ + Version{"1.2"} + collations{ + standard{ + Sequence{ + "[optimize [가-각간갇-갊감-갗같-객갠갤갬-갭갯-갱갸-갹갼걀걋걍걔걘걜거-걱건걷-걸걺검-겁것-겆겉-게겐겔겜-겝겟-겡겨" + "-겪견겯-결겸-겹겻-경곁계곈곌곕곗고-곡곤곧-골곪곬곯-곱곳공-곶과-곽관괄괆괌-괍괏광괘괜괠괩괬-괭괴-괵괸괼굄-굅굇굉교굔굘굡굣구" + "-국군굳-굶굻-굽굿궁-궂궈-궉권궐궜-궝궤궷귀-귁귄귈귐-귑귓규균귤그-극근귿-긁금-급긋긍긔기-긱긴긷-길긺김-깁깃깅-깆깊까-깎깐" + "깔깖깜-깝깟-깡깥깨-깩깬깰깸-깹깻-깽꺄-꺅꺌꺼-꺾껀껄껌-껍껏-껑께-껙껜껨껫껭껴껸껼꼇-꼈꼍꼐꼬-꼭꼰꼲꼴꼼-꼽꼿꽁-꽃꽈-꽉꽐꽜" + "-꽝꽤-꽥꽹꾀꾄꾈꾐-꾑꾕꾜꾸-꾹꾼꿀꿇-꿉꿋꿍-꿎꿔꿜꿨-꿩꿰-꿱꿴꿸뀀-뀁뀄뀌뀐뀔뀜-뀝뀨끄-끅끈끊끌끎끓-끕끗끙끝끼-끽낀낄낌-낍" + "낏낑나-낚난낟-낢남-납낫-낯낱낳-낵낸낼냄-냅냇-냉냐-냑냔냘냠냥너-넉넋-넌널넒-넓넘-넙넛-넝넣-넥넨넬넴-넵넷-넹녀-녁년녈념-" + "녑녔-녕녘녜녠노-녹논놀놂놈-놉놋농높-놔놘놜놨뇌뇐뇔뇜-뇝뇟뇨-뇩뇬뇰뇹뇻뇽누-눅눈눋-눌눔-눕눗눙눠눴눼뉘뉜뉠뉨-뉩뉴-뉵뉼늄-늅늉" + "느-늑는늘-늚늠-늡늣능-늦늪늬늰늴니-닉닌닐닖님-닙닛닝닢다-닦단닫-닯닳-답닷-닻닿-댁댄댈댐-댑댓-댕댜더-덖던덛-덜덞-덟덤-덥" + "덧덩덫덮데-덱덴델뎀-뎁뎃-뎅뎌뎐뎔뎠-뎡뎨뎬도-독돈돋-돌돎돐돔-돕돗동돛돝돠돤돨돼됐되된될됨-됩됫됴두-둑둔둘둠-둡둣둥둬뒀뒈뒝뒤뒨" + "뒬뒵뒷뒹듀듄듈듐듕드-득든듣-들듦듬-듭듯등듸디-딕딘딛-딜딤-딥딧-딪따-딱딴딸땀-땁땃-땅땋-땍땐땔땜-땝땟-땡떠-떡떤떨떪-떫떰-" + "떱떳-떵떻-떽뗀뗄뗌-뗍뗏-뗑뗘뗬또-똑똔똘똥똬똴뙈뙤뙨뚜-뚝뚠뚤뚫-뚬뚱뛔뛰뛴뛸뜀-뜁뜅뜨-뜩뜬뜯-뜰뜸-뜹뜻띄띈띌띔-띕띠띤띨띰-띱" + "띳띵라-락란랄람-랍랏-랒랖-랙랜랠램-랩랫-랭랴-략랸럇량러-럭런럴럼-럽럿-렁렇-렉렌렐렘-렙렛렝려-력련렬렴-렵렷-령례롄롑롓로-" + "록론롤롬-롭롯롱롸롼뢍뢨뢰뢴뢸룀-룁룃룅료룐룔룝룟룡루-룩룬룰룸-룹룻룽뤄뤘뤠뤼-뤽륀륄륌륏륑류-륙륜률륨-륩륫륭르-륵른를름-릅릇릉-" + "릊릍-릎리-릭린릴림-립릿링마-막만많-맒맘-맙맛망-맞맡맣-맥맨맬맴-맵맷-맺먀-먁먈먕머-먹먼멀멂멈-멉멋멍-멎멓-멕멘멜멤-멥멧-" + "멩며-멱면멸몃-명몇몌모-목몫-몬몰몲몸-몹못몽뫄뫈뫘-뫙뫼묀묄묍묏묑묘묜묠묩묫무-묶문묻-묾뭄-뭅뭇뭉뭍뭏-뭐뭔뭘뭡뭣뭬뮈뮌뮐뮤뮨뮬뮴" + "뮷므믄믈믐믓미-믹민믿-밀밂밈-밉밋-밍및밑바-반받-밟밤-밥밧방밭배-백밴밸뱀-뱁뱃-뱅뱉뱌-뱍뱐뱝버-벅번벋-벌벎범-법벗벙-벚베-" + "벡벤벧-벨벰-벱벳-벵벼-벽변별볍볏-병볕볘볜보-볶본볼봄-봅봇봉봐봔봤봬뵀뵈-뵉뵌뵐뵘-뵙뵤뵨부-북분붇-붊붐-붑붓붕붙-붚붜붤붰붸뷔" + "-뷕뷘뷜뷩뷰뷴뷸븀븃븅브-븍븐블븜-븝븟비-빅빈빌빎빔-빕빗빙-빛빠-빡빤빨빪빰-빱빳-빵빻-빽뺀뺄뺌-뺍뺏-뺑뺘-뺙뺨뻐-뻑뻔뻗-뻘뻠" + "뻣-뻥뻬뼁뼈-뼉뼘-뼙뼛-뼝뽀-뽁뽄뽈뽐-뽑뽕뾔뾰뿅뿌-뿍뿐뿔뿜뿟뿡쀼쁑쁘쁜쁠쁨-쁩삐-삑삔삘삠-삡삣삥사-삭삯-산삳-삶삼-삽삿-상샅" + "새-색샌샐샘-샙샛-생샤-샥샨샬샴-샵샷샹섀섄섈섐섕서-선섣-설섦-섧섬-섭섯-성섶세-섹센셀셈-셉셋-셍셔-셕션셜셤-셥셧-셩셰셴셸솅" + "소-솎손솔솖솜-솝솟송솥솨-솩솬솰솽쇄쇈쇌쇔쇗-쇘쇠쇤쇨쇰-쇱쇳쇼-쇽숀숄숌-숍숏숑수-숙순숟-술숨-숩숫숭숯숱-숲숴쉈쉐-쉑쉔쉘쉠쉥쉬" + "-쉭쉰쉴쉼-쉽쉿슁슈-슉슐슘슛슝스-슥슨슬-슭슴-습슷승시-식신싣-실싫-십싯싱싶싸-싹싻-싼쌀쌈-쌉쌌-쌍쌓-쌕쌘쌜쌤-쌥쌨-쌩썅써-" + "썩썬썰썲썸-썹썼-썽쎄쎈쎌쏀쏘-쏙쏜쏟-쏠쏢쏨-쏩쏭쏴-쏵쏸쐈쐐쐤쐬쐰쐴쐼-쐽쑈쑤-쑥쑨쑬쑴-쑵쑹쒀쒔쒜쒸쒼쓩쓰-쓱쓴쓸쓺쓿-씁씌씐씔씜" + "씨-씩씬씰씸-씹씻씽아-악안-않알-앎앓-압앗-앙앝-앞애-액앤앨앰-앱앳-앵야-약얀얄얇얌-얍얏양얕얗-얘얜얠얩어-억언-얹얻-얾엄-" + "엊엌엎에-엑엔엘엠-엡엣엥여-엮연열엶-엷염-영옅-예옌옐옘-옙옛-옜오-옥온올-옮옰옳-옵옷옹옻와-왁완왈왐-왑왓-왕왜-왝왠왬왯왱외" + "-왹왼욀욈-욉욋욍요-욕욘욜욤-욥욧용우-욱운울-욺움-웁웃웅워-웍원월웜-웝웠-웡웨-웩웬웰웸-웹웽위-윅윈윌윔-윕윗윙유-육윤율윰-" + "윱윳융윷으-윽은을읊음-읍읏응-의읜읠읨읫이-익인일-읾잃-입잇-잊잎자-작잔잖-잘잚잠-잡잣-잦재-잭잰잴잼-잽잿-쟁쟈-쟉쟌쟎쟐쟘쟝" + "쟤쟨쟬저-적전절젊점-접젓정-젖제-젝젠젤젬-젭젯젱져젼졀졈-졉졌-졍졔조-족존졸졺좀-좁좃종-좇좋-좍좔좝좟좡좨좼-좽죄죈죌죔-죕죗죙" + "죠-죡죤죵주-죽준줄-줆줌-줍줏중줘줬줴쥐-쥑쥔쥘쥠-쥡쥣쥬쥰쥴쥼즈-즉즌즐즘-즙즛증지-직진짇-질짊짐-집짓징-짖짙-짚짜-짝짠짢짤짧" + "짬-짭짯-짱째-짹짼쨀쨈-쨉쨋-쨍쨔쨘쨩쩌-쩍쩐쩔쩜-쩝쩟-쩡쩨쩽쪄쪘쪼-쪽쫀쫄쫌-쫍쫏쫑쫓쫘-쫙쫠쫬쫴쬈쬐쬔쬘쬠-쬡쭁쭈-쭉쭌쭐쭘-쭙" + "쭝쭤쭸-쭹쮜쮸쯔쯤쯧쯩찌-찍찐찔찜-찝찡-찢찧-착찬찮찰참-찹찻-찾채-책챈챌챔-챕챗-챙챠챤챦챨챰챵처-척천철첨-첩첫-청체-첵첸첼쳄" + "-쳅쳇쳉쳐쳔쳤쳬쳰촁초-촉촌촐촘-촙촛총촤촨촬촹최쵠쵤쵬-쵭쵯쵱쵸춈추-축춘출춤-춥춧충춰췄췌췐취췬췰췸-췹췻췽츄츈츌츔츙츠-측츤츨츰-" + "츱츳층치-칙친칟-칡침-칩칫칭카-칵칸칼캄-캅캇캉캐-캑캔캘캠-캡캣-캥캬-캭컁커-컥컨컫-컬컴-컵컷-컹케-켁켄켈켐-켑켓켕켜켠켤켬-" + "켭켯-켱켸코-콕콘콜콤-콥콧콩콰-콱콴콸쾀쾅쾌쾡쾨쾰쿄쿠-쿡쿤쿨쿰-쿱쿳쿵쿼퀀퀄퀑퀘퀭퀴-퀵퀸퀼큄-큅큇큉큐큔큘큠크-큭큰클큼-큽킁키-" + "킥킨킬킴-킵킷킹타-탁탄탈-탉탐-탑탓-탕태-택탠탤탬-탭탯-탱탸턍터-턱턴털턺텀-텁텃-텅테-텍텐텔템-텝텟텡텨텬텼톄톈토-톡톤톨톰-" + "톱톳통톺톼퇀퇘퇴퇸툇툉툐투-툭툰툴툼-툽툿퉁퉈퉜퉤튀-튁튄튈튐-튑튕튜튠튤튬튱트-특튼튿-틀틂틈-틉틋틔틘틜틤-틥티-틱틴틸팀-팁팃팅파" + "-팎판팔팖팜-팝팟-팡팥패-팩팬팰팸-팹팻-팽퍄-퍅퍼-퍽펀펄펌-펍펏-펑페-펙펜펠펨-펩펫펭펴편펼폄-폅폈-평폐폘폡폣포-폭폰폴폼-폽" + "폿퐁퐈퐝푀푄표푠푤푭푯푸-푹푼푿-풀풂품-풉풋풍풔풩퓌퓐퓔퓜퓟퓨퓬퓰퓸퓻퓽프픈플픔-픕픗피-픽핀필핌-핍핏핑하-학한할핥함-합핫항해-핵" + "핸핼햄-햅햇-행햐향허-헉헌헐헒험-헙헛헝헤-헥헨헬헴-헵헷헹혀-혁현혈혐-협혓-형혜혠혤혭호-혹혼홀홅홈-홉홋홍홑화-확환활홧황홰-홱" + "홴횃횅회-획횐횔횝횟횡효횬횰횹횻후-훅훈훌훑훔훗훙훠훤훨훰훵훼-훽휀휄휑휘-휙휜휠휨-휩휫휭휴-휵휸휼흄흇흉흐-흑흔흖-흙흠-흡흣흥흩희" + "흰흴흼-흽힁히-힉힌힐힘-힙힛힝] ]" + "&가<<伽<<佳<<假<<價<<加<<可<<呵<<哥<<嘉<<嫁<<家<<暇<<架<<枷<<柯<<歌<<珂<<痂<<稼<<苛<<茄<<街" + "<<袈<<訶<<賈<<跏<<軻<<迦<<駕<<仮<<傢<<咖<<哿<<坷<<宊<<斝<<榎<<檟<<珈<<笳<<耞<<舸<<葭<<謌" + "&각<<刻<<却<<各<<恪<<慤<<殼<<珏<<脚<<覺<<角<<閣<<卻<<咯<<埆<<搉<<擱<<桷" + "&간<<侃<<刊<<墾<<奸<<姦<<干<<幹<<懇<<揀<<杆<<柬<<桿<<澗<<癎<<看<<磵<<稈<<竿<<簡<<肝<<艮<<艱" + "<<諫<<間<<偘<<慳<<栞<<榦<<玕<<秆<<茛<<衎<<赶<<迀<<齦" + "&갈<<乫<<喝<<曷<<渴<<碣<<竭<<葛<<褐<<蝎<<鞨<<噶<<楬<<秸<<羯<<蠍<<鶡" + "&감<<勘<<坎<<堪<<嵌<<感<<憾<<戡<<敢<<柑<<橄<<減<<甘<<疳<<監<<瞰<<紺<<邯<<鑑<<鑒<<龕<<坩<<埳" + "<<嵁<<弇<<憨<<撼<<欿<<歛<<泔<<淦<<澉<<矙<<轗<<酣<<鹻" + "&갑<<匣<<岬<<甲<<胛<<鉀<<閘<<韐" + "&강<<剛<<堈<<姜<<岡<<崗<<康<<强<<彊<<慷<<江<<畺<<疆<<糠<<絳<<綱<<羌<<腔<<舡<<薑<<襁<<講<<鋼" + "<<降<<鱇<<傋<<僵<<壃<<忼<<扛<<杠<<橿<<殭<<矼<<穅<<繈<<罡<<羗<<羫<<茳<<豇<<韁" + "&개<<介<<价<<個<<凱<<塏<<愷<<愾<<慨<<改<<槪<<漑<<疥<<皆<<盖<<箇<<芥<<蓋<<鎧<<開<<剴<<匃<<揩" + "<<槩<<玠<<磕<<闓" + "&객<<喀<<客" + "&갱<<坑<<粳<<羹<<硜<<賡<<鏗" + "&갹<<醵" + "&거<<倨<<去<<居<<巨<<拒<<据<<據<<擧<<渠<<炬<<祛<<距<<踞<<遽<<鉅<<鋸<<呿<<昛<<秬<<筥<<籧<<胠" + "<<腒<<苣<<莒<<蕖<<蘧<<袪<<裾<<駏" + "&건<<乾<<件<<健<<巾<<建<<愆<<楗<<腱<<虔<<蹇<<鍵<<騫<<揵<<犍<<睷<<褰<<謇<<鞬" + "&걸<<乞<<傑<<杰<<桀<<乬<<朅<<榤" + "&검<<儉<<劍<<劒<<檢<<瞼<<鈐<<黔<<撿<<芡" + "&겁<<劫<<怯<<迲<<刦<<刧" + "&게<<偈<<憩<<揭" + "&격<<擊<<格<<檄<<激<<膈<<覡<<隔<<挌<<毄<<闃<<骼<<鬲<<鴃" + "&견<<堅<<牽<<犬<<甄<<絹<<繭<<肩<<見<<譴<<遣<<鵑<<樫<<狷<<畎<<筧<<縳<<繾<<羂<<蠲<<鰹" + "&결<<抉<<決<<潔<<結<<缺<<訣<<玦<<觖<<闋" + "&겸<<兼<<慊<<箝<<謙<<鉗<<鎌<<傔<<嗛<<岒<<拑<<歉<<縑<<蒹<<黚<<鼸" + "&경<<京<<俓<<倞<<傾<<儆<<勁<<勍<<卿<<坰<<境<<庚<<徑<<慶<<憬<<擎<<敬<<景<<暻<<更<<梗<<涇<<炅" + "<<烱<<璟<<璥<<瓊<<痙<<硬<<磬<<竟<<競<<絅<<經<<耕<<耿<<脛<<莖<<警<<輕<<逕<<鏡<<頃<<頸<<驚<<" + "鯨<<冏<<剄<<哽<<惸<<憼<<扃<<檠<<煢<<焭<<熲<<畊<<竸<<綆<<顈<<罄<<褧<<謦<<駉<<鯁<<黥" + "&계<<係<<啓<<堺<<契<<季<<屆<<悸<<戒<<桂<<械<<棨<<溪<<界<<癸<<磎<<稽<<系<<繫<<繼<<計<<誡<<谿" + "<<階<<鷄<<堦<<烓<<瘈<<禊<<筓<<綮<<縘<<罽<<葪<<薊<<雞<<髻" + "&고<<古<<叩<<告<<呱<<固<<姑<<孤<<尻<<庫<<拷<<攷<<故<<敲<<暠<<枯<<槁<<沽<<痼<<皐<<睾<<稿<<羔" + "<<考<<股<<膏<<苦<<苽<<菰<<藁<<蠱<<袴<<誥<<辜<<錮<<雇<<顧<<高<<鼓<<估<<凅<<刳<<塙<<杲<<栲<<" + "槀<<槹<<櫜<<牯<<皋<<盬<<瞽<<稁<<箍<<篙<<糕<<罟<<羖<<翺<<胯<<觚<<詁<<郜<<酤<<鈷<<靠<<鴣<<鷱" + "&곡<<哭<<斛<<曲<<梏<<穀<<谷<<鵠<<嚳<<槲<<縠<<觳<<轂" + "&곤<<困<<坤<<崑<<昆<<梱<<棍<<滾<<琨<<袞<<鯤<<堃<<崐<<悃<<捆<<緄<<衮<<裍<<褌<<錕<<閫<<髡<<鵾" + "<<鶤<<齫" + "&골<<汨<<骨<<搰<<榾<<矻<<鶻" + "&공<<供<<公<<共<<功<<孔<<工<<恐<<恭<<拱<<控<<攻<<珙<<空<<蚣<<貢<<鞏<<倥<<崆<<悾<<栱<<槓<<箜" + "<<蛩<<蛬<<贛<<跫<<釭<<龔" + "&곶<<串" + "&과<<寡<<戈<<果<<瓜<<科<<菓<<誇<<課<<跨<<過<<鍋<<顆<<侉<<堝<<夥<<夸<<撾<<猓<<稞<<窠<<蝌<<裹" + "<<踝<<銙<<騍" + "&곽<<廓<<槨<<藿<<郭<<椁<<癨<<躩<<霍<<鞹" + "&관<<冠<<官<<寬<<慣<<棺<<款<<灌<<琯<<瓘<<管<<罐<<菅<<觀<<貫<<關<<館<<丱<<涫<<爟<<盥<<祼<<窾" + "<<筦<<綰<<輨<<錧<<鑵<<雚<<顴<<髖<<鸛" + "&괄<<刮<<恝<<括<<适<<佸<<栝<<筈<<聒<<髺<<鴰" + "&광<<侊<<光<<匡<<壙<<廣<<曠<<洸<<炚<<狂<<珖<<筐<<胱<<鑛<<恇<<桄<<框<<爌<<獷<<磺<<絖<<纊<<茪" + "<<誆<<誑" + "&괘<<卦<<掛<<罫<<咼<<挂<<罣<<詿" + "&괴<<乖<<傀<<塊<<壞<<怪<<愧<<拐<<槐<<魁<<媿<<廥<<恠<<瑰<<璝<<蒯<<襘" + "&괵<<馘" + "&굉<<宏<<紘<<肱<<轟<<浤<<觥<<訇<<閎" + "&교<<交<<僑<<咬<<喬<<嬌<<嶠<<巧<<攪<<敎<<校<<橋<<狡<<皎<<矯<<絞<<翹<<膠<<蕎<<蛟<<較<<轎<<郊" + "<<餃<<驕<<鮫<<佼<<嘄<<嘐<<噭<<嚙<<姣<<憍<<撟<<晈<<暞<<榷<<磽<<窖<<趫<<蹻<<鉸<<骹<<鵁<<齩" + "&구<<丘<<久<<九<<仇<<俱<<具<<勾<<區<<口<<句<<咎<<嘔<<坵<<垢<<寇<<嶇<<廐<<懼<<拘<<救<<枸<<柩" + "<<構<<歐<<毆<<毬<<求<<溝<<灸<<狗<<玖<<球<<瞿<<矩<<究<<絿<<耉<<臼<<舅<<舊<<苟<<衢<<謳<<購<<" + "軀<<逑<<邱<<鉤<<銶<<駒<<驅<<鳩<<鷗<<龜<<佉<<佝<<俅<<傴<<冓<<劬<<匶<<厹<<叴<<坸<<姤<<媾<<嫗<" + "<屨<<岣<<彀<<戵<<扣<<捄<<搆<<摳<<昫<<榘<<漚<<璆<<甌<<疚<<痀<<癯<<窛<<窶<<篝<<糗<<胊<<蒟<<蚯" + "<<裘<<覯<<詬<<遘<<釦<<韝<<韭<<韮<<颶<<駈<<鬮<<鷇<<鸜" + "&국<<國<<局<<菊<<鞠<<鞫<<麴<<匊<<掬<<跼<<麯" + "&군<<君<<窘<<群<<裙<<軍<<郡<<捃<<桾<<皸" + "&굴<<堀<<屈<<掘<<窟<<倔<<崛<<淈<<詘" + "&궁<<宮<<弓<<穹<<窮<<芎<<躬<<躳" + "&권<<倦<<券<<勸<<卷<<圈<<拳<<捲<<權<<淃<<眷<<勌<<惓<<棬<<睠<<綣<<蜷" + "&궐<<厥<<獗<<蕨<<蹶<<闕" + "&궤<<机<<櫃<<潰<<詭<<軌<<饋<<佹<<几<<劂<<匱<<憒<<撅<<樻<<氿<<簋<<繢<<跪<<闠<<餽<<麂" + "&귀<<晷<<歸<<貴<<鬼" + "&규<<叫<<圭<<奎<<揆<<槻<<珪<<硅<<窺<<竅<<糾<<葵<<規<<赳<<逵<<閨<<刲<<嫢<<嬀<<巋<<暌<<楏<<樛" + "<<潙<<睽<<糺<<虬<<虯<<跬<<邽<<闚<<頍<<馗" + "&균<<勻<<均<<畇<<筠<<菌<<鈞<<囷<<麏" + "&귤<<橘" + "&극<<克<<剋<<劇<<戟<<棘<<極<<隙<<亟<<尅<<屐<<郄" + "&근<<僅<<劤<<勤<<懃<<斤<<根<<槿<<瑾<<筋<<芹<<菫<<覲<<謹<<近<<饉<<卺<<厪<<墐<<巹<<廑<<漌<<觔" + "<<跟<<釿<<靳" + "&금<<今<<妗<<擒<<昑<<檎<<琴<<禁<<禽<<芩<<衾<<衿<<襟<<錦<<唫<<噤<<嶔<<笒<<黅" + "&급<<伋<<及<<急<<扱<<汲<<級<<給<<圾<<岌<<皀<<礏<<笈<<芨" + "&긍<<亘<<兢<<矜<<肯<<亙<<殑" + "&기<<企<<伎<<其<<冀<<嗜<<器<<圻<<基<<埼<<夔<<奇<<妓<<寄<<岐<<崎<<己<<幾<<忌<<技<<旗<<旣<<朞" + "<<期<<杞<<棋<<棄<<機<<欺<<氣<<汽<<沂<<淇<<玘<<琦<<琪<<璂<<璣<<畸<<畿<<碁<<磯<<祁<<祇<<祈<<" + "祺<<箕<<紀<<綺<<羈<<耆<<耭<<肌<<記<<譏<<豈<<起<<錡<<錤<<飢<<饑<<騎<<騏<<驥<<麒<<僛<<剞<<墍<" + "<屺<<庋<<弃<<忮<<愭<<掎<<攲<<旂<<暣<<曁<<棊<<歧<<炁<<猉<<禨<<綥<<綦<<羇<<肵<<芪<<芰<<蘄<<虁" + "<<蜝<<蟣<<覉<<覬<<跂<<隑<<頎<<鬐<<鰭<<黖" + "&긴<<緊" + "&길<<佶<<吉<<拮<<桔<<姞<<蛣" + "&김<<金" + "&끽<<喫" + "&나<<儺<<娜<<懦<<拏<<拿<<那<<挐<<挪<<梛<<糥<<糯" + "&낙<<諾" + "&난<<暖<<煖<<難<<偄<<煗<<赧<<餪" + "&날<<捏<<捺" + "&남<<南<<枏<<楠<<湳<<男<<喃<<柟" + "&납<<納<<衲" + "&낭<<囊<<娘<<曩" + "&내<<乃<<內<<奈<<柰<<耐<<匂<<奶<<嬭<<迺<<鼐" + "&녀<<女" + "&녁<<惄" + "&년<<年<<撚<<秊<<碾" + "&념<<念<<恬<<拈<<捻" + "&녕<<寧<<寗<<佞<<儜<<嚀<<濘" + "&노<<努<<奴<<弩<<怒<<瑙<<駑<<呶<<孥<<峱<<猱<<笯<<臑" + "&농<<濃<<膿<<農<<儂<<噥<<穠<<醲" + "&뇌<<惱<<腦<<餒" + "&뇨<<尿<<嫋<<嬲<<淖<<磠<<裊<<鐃" + "&누<<啂<<耨" + "&눈<<嫩" + "&눌<<訥<<吶<<肭" + "&뉴<<杻<<紐<<忸<<靵" + "&뉵<<衄" + "&능<<能" + "&니<<尼<<泥<<呢<<怩<<柅<<祢<<禰<<膩" + "&닉<<匿<<溺<<昵<<暱" + "&다<<多<<茶<<爹" + "&단<<丹<<亶<<但<<單<<團<<壇<<彖<<斷<<旦<<檀<<段<<湍<<短<<端<<簞<<緞<<蛋<<袒<<鄲<<鍛<<慱<<担" + "<<椴<<漙<<癉<<耑<<胆<<腶<<蜑" + "&달<<撻<<澾<<獺<<疸<<達<<妲<<怛<<闥<<靼<<韃" + "&담<<啖<<坍<<憺<<擔<<曇<<淡<<湛<<潭<<澹<<痰<<聃<<膽<<蕁<<覃<<談<<譚<<錟<<儋<<啗<<噉<<墰<<壜" + "<<毯<<禫<<罎<<薝<<郯<<黮<<黵" + "&답<<沓<<畓<<答<<踏<<遝" + "&당<<唐<<堂<<塘<<幢<<戇<<撞<<棠<<當<<糖<<螳<<黨<<倘<<儻<<党<<搪<<檔<<溏<<瑭<<璫<<瞠<<礑<<蟷" + "<<襠<<讜<<鏜<<鐺<<餳<<餹" + "&대<<代<<垈<<坮<<大<<對<<岱<<帶<<待<<戴<<擡<<玳<<臺<<袋<<貸<<隊<<黛<<儓<<懟<<旲<<汏<<碓<<鐓" + "&댁<<宅" + "&덕<<德<<悳" + "&도<<倒<<刀<<到<<圖<<堵<<塗<<導<<屠<<島<<嶋<<度<<徒<<悼<<挑<<掉<<搗<<桃<<棹<<櫂<<淘<<渡<<滔" + "<<濤<<燾<<盜<<睹<<禱<<稻<<萄<<覩<<賭<<跳<<蹈<<逃<<途<<道<<都<<鍍<<陶<<韜<<叨<<壔<<弢<<忉<<" + "慆<<掏<<搯<<擣<<檮<<洮<<涂<<稌<<菟<<酴<<闍<<鞀<<鞱<<饕<<鼗" + "&독<<毒<<瀆<<牘<<犢<<獨<<督<<禿<<篤<<纛<<讀<<櫝<<黷" + "&돈<<墩<<惇<<敦<<旽<<暾<<沌<<焞<<燉<<豚<<頓<<弴<<潡<<躉" + "&돌<<乭<<突<<咄<<堗" + "&동<<仝<<冬<<凍<<動<<同<<憧<<東<<桐<<棟<<洞<<潼<<疼<<瞳<<童<<胴<<董<<銅<<侗<<僮<<哃<<垌<<峒" + "<<彤<<朣<<橦<<涷<<艟<<苳<<茼<<蕫<<蝀<<錬<<鮗" + "&두<<兜<<斗<<杜<<枓<<痘<<竇<<荳<<豆<<逗<<頭<<抖<<斁<<肚<<脰<<蚪<<蠹<<陡" + "&둔<<屯<<臀<<芚<<遁<<遯<<鈍<<窀<<迍" + "&둘<<乧" + "&득<<得" + "&등<<嶝<<橙<<燈<<登<<等<<藤<<謄<<鄧<<騰<<凳<<墱<<滕<<磴<<籐<<縢<<螣<<鐙" + "&라<<喇<<懶<<癩<<羅<<蘿<<螺<<裸<<邏<<倮<<囉<<曪<<瘰<<砢<<臝<<鑼<<騾<<驘" + "&락<<洛<<烙<<珞<<絡<<落<<酪<<駱<<嗠<<犖" + "&란<<亂<<卵<<欄<<欒<<瀾<<爛<<蘭<<鸞<<嬾<<幱<<攔<<灓<<襴<<鑾<<闌" + "&랄<<剌<<辣<<埒<<辢" + "&람<<嵐<<擥<<攬<<欖<<濫<<籃<<纜<<藍<<襤<<覽<<婪<<惏" + "&랍<<拉<<臘<<蠟<<鑞" + "&랑<<廊<<朗<<浪<<狼<<琅<<瑯<<螂<<郞<<榔<<硠<<稂<<莨<<蜋<<閬" + "&래<<來<<崍<<徠<<萊<<淶<<騋" + "&랭<<冷" + "&략<<掠<<略<<畧" + "&량<<亮<<倆<<兩<<凉<<梁<<樑<<粮<<粱<<糧<<良<<諒<<輛<<量<<喨<<悢<<椋<<涼<<踉<<魎" + "&려<<侶<<儷<<勵<<呂<<廬<<慮<<戾<<旅<<櫚<<濾<<礪<<藜<<蠣<<閭<<驢<<驪<<麗<<黎<<儢<<厲<<唳<<梠" + "<<癘<<糲<<膂<<臚<<蠡<<邌<<鑢" + "&력<<力<<曆<<歷<<瀝<<礫<<轢<<靂<<攊<<櫟<<櫪<<癧<<轣<<酈" + "&련<<憐<<戀<<攣<<漣<<煉<<璉<<練<<聯<<蓮<<輦<<連<<鍊<<孌<<楝<<湅<<臠<<鏈<<鰊<<鰱" + "&렬<<冽<<列<<劣<<洌<<烈<<裂<<挒<<捩<<颲" + "&렴<<廉<<斂<<殮<<濂<<簾<<奩<<瀲<<磏" + "&렵<<獵<<躐<<鬣" + "&령<<令<<伶<<囹<<岺<<嶺<<怜<<玲<<笭<<羚<<翎<<聆<<逞<<鈴<<零<<靈<<領<<齡<<另<<呤<<姈<<岭<<昤" + "<<欞<<泠<<秢<<苓<<蛉<<軨<<鴒<<鹷" + "&례<<例<<澧<<禮<<醴<<隷<<隸<<鱧" + "&로<<勞<<撈<<擄<<櫓<<潞<<瀘<<爐<<盧<<老<<蘆<<虜<<路<<輅<<露<<魯<<鷺<<鹵<<壚<<滷<<玈<<癆<<窂" + "<<艪<<艫<<轤<<鐪<<鑪<<顱<<髗<<鱸<<鸕" + "&록<<碌<<祿<<綠<<菉<<錄<<鹿<<麓<<圥<<彔<<淥<<漉<<簏<<轆<<騄" + "&론<<論" + "&롱<<壟<<弄<<朧<<瀧<<瓏<<籠<<聾<<儱<<攏<<曨<<礱<<蘢<<隴<<龎" + "&뢰<<儡<<瀨<<牢<<磊<<賂<<賚<<賴<<雷<<攂<<礌<<礧<<籟<<纇<<罍<<耒<<蕾<<誄<<酹<<顂" + "&료<<了<<僚<<寮<<廖<<料<<燎<<療<<瞭<<聊<<蓼<<遼<<鬧<<嘹<<嫽<<撩<<暸<<潦<<獠<<繚<<膋<<醪<<鐐" + "<<飂<<飉" + "&룡<<龍<<龒" + "&루<<壘<<婁<<屢<<樓<<淚<<漏<<瘻<<累<<縷<<蔞<<褸<<鏤<<陋<<僂<<嘍<<嶁<<慺<<耬<<螻<<髏" + "&류<<劉<<旒<<柳<<榴<<流<<溜<<瀏<<琉<<瑠<<留<<瘤<<硫<<謬<<類<<橊<<縲<<纍<<遛<<鶹" + "&륙<<六<<戮<<陸<<勠" + "&륜<<侖<<倫<<崙<<淪<<綸<<輪<<掄" + "&률<<律<<慄<<栗<<嵂<<溧" + "&륭<<隆<<癃<<窿" + "&륵<<勒<<肋<<泐" + "&름<<凜<<凛<<廩<<澟" + "&릉<<凌<<楞<<稜<<綾<<菱<<陵<<倰<<蔆" + "&리<<俚<<利<<厘<<吏<<唎<<履<<悧<<李<<梨<<浬<<犁<<狸<<理<<璃<<痢<<籬<<罹<<羸<<莉<<裏<<裡<<里" + "<<釐<<離<<鯉<<俐<<剺<<哩<<嫠<<涖<<漓<<离<<莅<<蜊<<螭<<貍<<邐<<魑<<黐" + "&린<<吝<<潾<<燐<<璘<<藺<<躪<<隣<<鱗<<麟<<嶙<<悋<<獜<<磷<<粦<<粼<<繗<<躙<<轔<<鄰<<鏻<<驎" + "&림<<林<<淋<<琳<<臨<<霖<<痳" + "&립<<砬<<立<<笠<<粒<<岦" + "&마<<摩<<瑪<<痲<<碼<<磨<<馬<<魔<<麻<<劘<<媽<<螞<<蟇<<麽<<麿" + "&막<<寞<<幕<<漠<<膜<<莫<<邈<<瞙<<鏌" + "&만<<万<<卍<<娩<<巒<<彎<<慢<<挽<<晩<<曼<<滿<<漫<<灣<<瞞<<萬<<蔓<<蠻<<輓<<饅<<鰻<<墁<<嫚<<幔" + "<<縵<<謾<<蹣<<鏋<<鏝<<鬘" + "&말<<唜<<抹<<末<<沫<<茉<<襪<<靺<<帕<<秣" + "&망<<亡<<妄<<忘<<忙<<望<<網<<罔<<芒<<茫<<莽<<輞<<邙<<惘<<汒<<漭<<莾<<蟒<<魍" + "&매<<埋<<妹<<媒<<寐<<昧<<枚<<梅<<每<<煤<<罵<<買<<賣<<邁<<魅<<呆<<楳<<沬<<玫<<眛<<苺<<莓<<酶" + "<<霉" + "&맥<<脈<<貊<<陌<<驀<<麥<<脉<<貃<<貘" + "&맹<<孟<<氓<<猛<<盲<<盟<<萌<<儚<<甍<<甿<<虻" + "&멱<<冪<<覓<<幎<<糸" + "&면<<免<<冕<<勉<<棉<<沔<<眄<<眠<<綿<<緬<<面<<麵<<俛<<湎<<糆<<緜<<麪" + "&멸<<滅<<蔑<<篾<<衊" + "&명<<冥<<名<<命<<明<<暝<<椧<<溟<<皿<<瞑<<茗<<蓂<<螟<<酩<<銘<<鳴<<洺" + "&몌<<袂" + "&모<<侮<<冒<<募<<姆<<帽<<慕<<摸<<摹<<暮<<某<<模<<母<<毛<<牟<<牡<<瑁<<眸<<矛<<耗<<芼<<茅<<謀" + "<<謨<<貌<<侔<<姥<<媢<<嫫<<恈<<旄<<皃<<眊<<粍<<糢<<耄<<蝥<<蟊<<鉾<<髦" + "&목<<木<<沐<<牧<<目<<睦<<穆<<鶩<<凩<<苜" + "&몰<<歿<<沒" + "&몽<<夢<<朦<<蒙<<幪<<懞<<曚<<溕<<濛<<瞢<<矇<<艨<<雺<<鸏" + "&묘<<卯<<墓<<妙<<廟<<描<<昴<<杳<<渺<<猫<<竗<<苗<<錨<<淼<<眇<<藐<<貓" + "&무<<務<<巫<<憮<<懋<<戊<<拇<<撫<<无<<楙<<武<<毋<<無<<珷<<畝<<繆<<舞<<茂<<蕪<<誣<<貿<<霧<<鵡" + "<<儛<<嘸<<廡<<膴<<騖" + "&묵<<墨<<默<<嘿" + "&문<<們<<刎<<吻<<問<<文<<汶<<紊<<紋<<聞<<蚊<<門<<雯<<匁<<悗<<懣<<抆<<捫<<炆<<璊" + "&물<<勿<<沕<<物" + "&미<<味<<媚<<尾<<嵋<<彌<<微<<未<<梶<<楣<<渼<<湄<<眉<<米<<美<<薇<<謎<<迷<<靡<<黴<<亹<<娓<<媄" + "<<媺<<弥<<弭<<敉<<瀰<<獼<<糜<<縻<<苿<<蘼<<麋" + "&민<<岷<<悶<<愍<<憫<<敏<<旻<<旼<<民<<泯<<玟<<珉<<緡<<閔<<忞<<忟<<暋<<湣<<緍<<罠<<苠<<閩<<鰵" + "<<黽" + "&밀<<密<<蜜<<謐<<樒<<滵" + "&박<<剝<<博<<拍<<搏<<撲<<朴<<樸<<泊<<珀<<璞<<箔<<粕<<縛<<膊<<舶<<薄<<迫<<雹<<駁<<亳<<欂<<牔" + "<<鎛<<駮<<髆" + "&반<<伴<<半<<反<<叛<<拌<<搬<<攀<<斑<<槃<<泮<<潘<<班<<畔<<瘢<<盤<<盼<<磐<<磻<<礬<<絆<<般<<蟠" + "<<返<<頒<<飯<<媻<<扳<<搫<<攽<<朌<<胖<<螌<<頖" + "&발<<勃<<拔<<撥<<渤<<潑<<發<<跋<<醱<<鉢<<髮<<魃<<哱<<浡<<脖<<鈸<<鵓" + "&방<<倣<<傍<<坊<<妨<<尨<<幇<<彷<<房<<放<<方<<旁<<昉<<枋<<榜<<滂<<磅<<紡<<肪<<膀<<舫<<芳<<蒡" + "<<蚌<<訪<<謗<<邦<<防<<龐<<仿<<厖<<幫<<徬<<搒<<旊<<梆<<牓<<舽<<螃<<鎊<<髣<<魴" + "&배<<倍<<俳<<培<<徘<<拜<<排<<杯<<湃<<焙<<盃<<背<<胚<<裴<<裵<<褙<<賠<<輩<<配<<陪<<坏<<坯<<扒" + "<<琲<<蓓" + "&백<<伯<<佰<<帛<<柏<<栢<<白<<百<<魄<<粨" + "&번<<幡<<樊<<煩<<燔<<番<<繁<<蕃<<藩<<飜<<繙<<翻<<膰<<蘩<<袢" + "&벌<<伐<<筏<<罰<<閥<<橃<<罸" + "&범<<凡<<帆<<梵<<氾<<汎<<泛<<犯<<範<<范<<笵<<訉<<颿" + "&법<<法<<琺" + "&벽<<僻<<劈<<壁<<擘<<檗<<璧<<癖<<碧<<蘗<<闢<<霹<<擗<<甓<<疈<<襞<<鷿<<鼊" + "&변<<卞<<弁<<變<<辨<<辯<<邊<<忭<<抃<<籩<<辮<<腁<<賆<<駢<<骿<<鴘" + "&별<<別<<瞥<<鱉<<鼈<<彆<<鷩" + "&병<<丙<<倂<<兵<<屛<<幷<<昞<<昺<<柄<<棅<<炳<<甁<<病<<秉<<竝<<輧<<餠<<騈<<並<<塀<<絣<<缾<<迸" + "<<鈵<<鋲<<鉼" + "&보<<保<<堡<<報<<寶<<普<<步<<洑<<湺<<潽<<珤<<甫<<菩<<補<<褓<<譜<<輔<<俌<<盙<<簠<<葆<<靌<<鴇" + "<<黼" + "&복<<伏<<僕<<匐<<卜<<宓<<復<<服<<福<<腹<<茯<<蔔<<複<<覆<<輹<<輻<<馥<<鰒<<墣<<幞<<扑<<濮<<箙" + "<<菔<<蝠<<蝮<<鵩" + "&본<<本" + "&볼<<乶" + "&봉<<俸<<奉<<封<<峯<<峰<<捧<<棒<<烽<<熢<<琫<<縫<<蓬<<蜂<<逢<<鋒<<鳳<<丰<<夆<<篷<<綘<<菶<<鴌" + "&부<<不<<付<<俯<<傅<<剖<<副<<否<<咐<<埠<<夫<<婦<<孚<<孵<<富<<府<<扶<<敷<<斧<<浮<<溥<<父<<符" + "<<簿<<缶<<腐<<腑<<膚<<艀<<芙<<莩<<訃<<負<<賦<<賻<<赴<<趺<<部<<釜<<阜<<附<<駙<<鳧<<仆<<俘<<" + "媍<<抔<<拊<<掊<<桴<<榑<<涪<<玞<<祔<<筟<<罘<<罦<<胕<<芣<<苻<<蔀<<蚨<<蜉<<袝<<裒<<跗<<鈇<<頫<" + "<鮒<<麩" + "&북<<北" + "&분<<分<<吩<<噴<<墳<<奔<<奮<<忿<<憤<<扮<<昐<<汾<<焚<<盆<<粉<<糞<<紛<<芬<<賁<<雰<<体<<坌<<帉" + "<<枌<<棻<<棼<<氛<<湓<<濆<<犇<<畚<<砏<<笨<<肦<<膹<<蕡<<轒<<黺<<鼢" + "&불<<佛<<弗<<彿<<拂<<岪<<祓<<紱<<艴<<茀<<韍<<髴<<黻" + "&붕<<崩<<朋<<棚<<硼<<繃<<鵬<<堋<<漰<<鬅" + "&비<<丕<<備<<匕<<匪<<卑<<妃<<婢<<庇<<悲<<憊<<扉<<批<<斐<<枇<<榧<<比<<毖<<毗<<毘<<沸<<琵<<痺" + "<<砒<<碑<<秕<<秘<<粃<<緋<<翡<<肥<<脾<<臂<<菲<<蜚<<裨<<誹<<譬<<費<<鄙<<非<<飛<<鼻<<仳<<俾<<" + "剕<<圮<<埤<<妣<<屁<<庳<<悱<<棐<<椑<<沘<<淝<<淠<<濞<<狉<<狒<<痞<<痹<<睥<<祕<<篦<<紕<<羆<<腓<" + "<芘<<芾<<萆<<蓖<<蚍<<貔<<贔<<轡<<邳<<郫<<閟<<陴<<霏<<鞴<<騑<<騛<<髀<<鼙" + "&빈<<嚬<<嬪<<彬<<斌<<檳<<殯<<浜<<濱<<瀕<<牝<<玭<<貧<<賓<<頻<<儐<<擯<<矉<<繽<<臏<<蘋<<豳<<邠" + "<<鑌<<霦<<顰<<鬂<<鬢" + "&빙<<憑<<氷<<聘<<騁<<冰<<凭<<凴<<娉" + "&사<<乍<<事<<些<<仕<<伺<<似<<使<<俟<<僿<<史<<司<<唆<<嗣<<四<<士<<奢<<娑<<寫<<寺<<射<<巳<<師" + "<<徙<<思<<捨<<斜<<斯<<柶<<査<<梭<<死<<沙<<泗<<渣<<瀉<<獅<<砂<<社<<祀<<祠<<私<<篩<<紗<<絲<<" + "肆<<舍<<莎<<蓑<<蛇<<裟<<詐<<詞<<謝<<賜<<赦<<辭<<邪<<飼<<駟<<麝<<傞<<剚<<卸<<咋<<姒<<楂<<榭<" + "<汜<<痧<<皶<<竢<<笥<<缷<<蜡<<覗<<駛<<魦<<鯊<<鰤" + "&삭<<削<<朔<<槊<<爍<<蒴<<鑠" + "&산<<傘<<刪<<山<<散<<汕<<珊<<産<<疝<<算<<蒜<<酸<<霰<<剷<<姍<<孿<<橵<<潸<<澘<<狻<<繖<<訕<<鏟" + "<<閊<<毿" + "&살<<乷<<撒<<殺<<煞<<薩" + "&삼<<三<<杉<<森<<渗<<芟<<蔘<<衫<<糝<<釤<<鬖" + "&삽<<揷<<澁<<鈒<<颯<<卅<<唼<<歃<<翣<<鍤<<霅<<霎" + "&상<<上<<傷<<像<<償<<商<<喪<<嘗<<孀<<尙<<峠<<常<<床<<庠<<廂<<想<<桑<<橡<<湘<<爽<<牀<<狀<<相" + "<<祥<<箱<<翔<<裳<<觴<<詳<<象<<賞<<霜<<塽<<徜<<晌<<殤<<甞<<緗<<鎟<<顙<<鬺" + "&새<<塞<<璽<<賽<<鰓" + "&색<<嗇<<穡<<索<<色<<槭<<濇<<瀒" + "&생<<牲<<生<<甥<<笙<<眚<<鉎" + "&서<<墅<<壻<<嶼<<序<<庶<<徐<<恕<<抒<<捿<<敍<<暑<<曙<<書<<栖<<棲<<犀<<瑞<<筮<<絮<<緖<<署<<胥" + "<<舒<<薯<<西<<誓<<逝<<鋤<<黍<<鼠<<噬<<婿<<揟<<撕<<湑<<澨<<紓<<耡<<芧<<鉏" + "&석<<夕<<奭<<席<<惜<<昔<<晳<<析<<汐<<淅<<潟<<石<<碩<<蓆<<釋<<錫<<晰<<矽<<腊<<舃<<蜥<<鉐<<鼫" + "&선<<仙<<僊<<先<<善<<嬋<<宣<<扇<<敾<<旋<<渲<<煽<<琁<<瑄<<璇<<璿<<癬<<禪<<線<<繕<<羨<<腺<<膳" + "<<船<<蘚<<蟬<<詵<<跣<<選<<銑<<鐥<<饍<<鮮<<墡<<嫙<<尟<<尠<<屳<<愃<<歚<<熯<<筅<<綫<<譔<<譱<<" + "鏇<<騸<<鱓<<鱻" + "&설<<卨<<屑<<楔<<泄<<洩<<渫<<舌<<薛<<褻<<設<<說<<雪<<齧<<偰<<媟<<揲<<暬<<爇<<碟<<稧<<紲" + "&섬<<剡<<暹<<殲<<纖<<蟾<<贍<<閃<<陝<<孅<<憸<<摻<<睒<<譫<<銛<<韱" + "&섭<<攝<<涉<<燮<<囁<<懾<<灄<<聶<<躡<<鑷<<顳" + "&성<<城<<姓<<宬<<性<<惺<<成<<星<<晟<<猩<<珹<<盛<<省<<筬<<聖<<聲<<腥<<誠<<醒<<瑆<<騂" + "&세<<世<<勢<<歲<<洗<<稅<<笹<<細<<貰<<帨<<洒<<繐<<蛻" + "&소<<召<<嘯<<塑<<宵<<小<<少<<巢<<所<<掃<<搔<<昭<<梳<<沼<<消<<溯<<瀟<<炤<<燒<<甦<<疏<<疎<<瘙" + "<<笑<<篠<<簫<<素<<紹<<蔬<<蕭<<蘇<<訴<<逍<<遡<<邵<<銷<<韶<<騷<<佋<<俏<<卲<<嗉<<埽<<塐<<愬<<" + "捎<<樔<<泝<<筱<<箾<<繅<<翛<<膆<<艘<<蛸<<踈<<酥<<霄<<魈<<鮹<<鰺" + "&속<<俗<<屬<<束<<涑<<粟<<續<<謖<<贖<<速<<洬<<遬" + "&손<<孫<<巽<<損<<蓀<<遜<<飡<<飧<<飱" + "&솔<<率<<窣<<蟀" + "&송<<宋<<悚<<松<<淞<<訟<<誦<<送<<頌<<柗<<竦<<鬆" + "&쇄<<刷<<灑<<碎<<鎖<<惢<<曬<<瑣" + "&쇠<<衰<<釗" + "&수<<修<<受<<嗽<<囚<<垂<<壽<<嫂<<守<<岫<<峀<<帥<<愁<<戍<<手<<授<<搜<<收<<數<<樹<<殊<<水<<洙" + "<<漱<<燧<<狩<<獸<<琇<<璲<<瘦<<睡<<秀<<穗<<竪<<粹<<綏<<綬<<繡<<羞<<脩<<茱<<蒐<<蓚<<藪<<袖<<" + "誰<<讐<<輸<<遂<<邃<<酬<<銖<<銹<<隋<<隧<<隨<<雖<<需<<須<<首<<髓<<鬚<<叟<<售<<廋<<晬<<殳<<泅<" + "<溲<<濉<<睟<<睢<<瞍<<祟<<籔<<脺<<膄<<膸<<讎<<豎<<陲<<颼<<饈" + "&숙<<叔<<塾<<夙<<孰<<宿<<淑<<潚<<熟<<琡<<璹<<肅<<菽<<俶<<倏<<儵<<婌<<橚<<驌<<鷫" + "&순<<巡<<徇<<循<<恂<<旬<<栒<<楯<<橓<<殉<<洵<<淳<<珣<<盾<<瞬<<筍<<純<<脣<<舜<<荀<<蓴<<蕣<<詢" + "<<諄<<醇<<錞<<順<<馴<<侚<<狥<<盹<<眴<<紃<<肫<<駨<<鬊<<鶉" + "&술<<戌<<術<<述<<鉥<<絉" + "&숭<<崇<<崧<<嵩<<菘" + "&쉬<<倅<<淬<<焠" + "&슬<<瑟<<膝<<蝨<<虱" + "&습<<濕<<拾<<習<<褶<<襲<<慴<<熠<<隰" + "&승<<丞<<乘<<僧<<勝<<升<<承<<昇<<繩<<蠅<<陞<<塍<<鬙" + "&시<<侍<<匙<<嘶<<始<<媤<<尸<<屎<<屍<<市<<弑<<恃<<施<<是<<時<<枾<<柴<<猜<<矢<<示<<翅<<蒔<<蓍" + "<<視<<試<<詩<<諡<<豕<<豺<<偲<<兕<<厮<<啻<<塒<<廝<<枲<<柹<<澌<<緦<<翤<<諟<<諰<<豉<<釃<<鍉<<" + "顋&식<<埴<<寔<<式<<息<<拭<<植<<殖<<湜<<熄<<篒<<蝕<<識<<軾<<食<<飾<<喰<<媳<<栻" + "&신<<伸<<侁<<信<<呻<<娠<<宸<<愼<<新<<晨<<燼<<申<<神<<紳<<腎<<臣<<莘<<薪<<藎<<蜃<<訊<<身<<辛" + "<<迅<<哂<<噺<<囟<<姺<<汛<<矧<<脤<<贐<<頣<<駪" + "&실<<失<<室<<實<<悉<<蟋<<飋" + "&심<<審<<尋<<心<<沁<<深<<瀋<<甚<<芯<<諶<<梣<<潯<<燖<<葚<<鐔<<鱏" + "&십<<什<<十<<辻" + "&쌍<<雙" + "&씨<<氏" + "&아<<亞<<俄<<兒<<啞<<娥<<峨<<我<<牙<<芽<<莪<<蛾<<衙<<訝<<阿<<雅<<餓<<鴉<<鵝<<丫<<哦<<娿<<婀" + "<<峩<<疴<<砑<<笌<<迓<<錏<<鵞" + "&악<<堊<<岳<<嶽<<幄<<惡<<愕<<握<<樂<<渥<<鄂<<鍔<<顎<<鰐<<齷<<偓<<卾<<咢<<喔<<噩<<腭<<萼<<覨" + "<<諤<<鶚<<齶" + "&안<<安<<岸<<按<<晏<<案<<眼<<雁<<鞍<<顔<<鮟<<桉<<犴<<贋<<鴈" + "&알<<斡<<謁<<軋<<閼<<嘎<<戞<<揠<<穵<<訐<<遏<<頞<<鴶" + "&암<<唵<<岩<<巖<<庵<<暗<<癌<<菴<<闇<<啽<<媕<<嵓<<晻<<腤<<葊<<蓭<<諳<<頷<<馣<<黯" + "&압<<壓<<押<<狎<<鴨" + "&앙<<仰<<央<<怏<<昻<<殃<<秧<<鴦<<卬<<坱<<泱<<盎<<鞅" + "&애<<厓<<哀<<埃<<崖<<愛<<曖<<涯<<碍<<艾<<隘<<靄<<僾<<唉<<啀<<噯<<娭<<崕<<挨<<捱<<欸<<漄<<獃" + "<<皚<<睚<<瞹<<磑<<礙<<薆<<藹<<靉<<騃" + "&액<<厄<<扼<<掖<<液<<縊<<腋<<額<<呝<<戹<<搤<<阨" + "&앵<<櫻<<罌<<鶯<<鸚<<嚶<<嫈<<罃<<鷪" + "&야<<也<<倻<<冶<<夜<<惹<<揶<<椰<<爺<<耶<<野<<埜" + "&약<<弱<<約<<若<<葯<<蒻<<藥<<躍<<爚<<禴<<篛<<籥<<鑰<<鰯<<鶸<<龠" + "&양<<佯<<壤<<孃<<恙<<揚<<攘<<敭<<暘<<楊<<樣<<洋<<瀁<<煬<<痒<<瘍<<禳<<穰<<羊<<襄<<讓<<釀<<陽" + "<<養<<徉<<漾<<瀼<<烊<<癢<<眻<<蘘<<輰<<鑲<<颺<<驤" + "&어<<圄<<御<<於<<漁<<瘀<<禦<<語<<馭<<魚<<齬<<圉<<敔<<淤<<飫" + "&억<<億<<憶<<抑<<檍<<臆<<繶" + "&언<<偃<<堰<<彦<<焉<<言<<諺<<傿<<匽<<嫣<<讞<<鄢<<鼴<<鼹" + "&얼<<孼<<蘖<<臬" + "&엄<<俺<<儼<<嚴<<奄<<掩<<淹<<崦<<广<<曮<<罨<<醃<<閹" + "&업<<嶪<<業<<嶫<<鄴" + "&에<<恚<<曀" + "&엔<<円" + "&여<<予<<余<<如<<歟<<汝<<璵<<礖<<與<<艅<<茹<<輿<<轝<<餘<<舁" + "&역<<亦<<域<<役<<易<<疫<<繹<<譯<<逆<<驛<<嶧<<懌<<淢<<閾" + "&연<<嚥<<堧<<姸<<娟<<宴<<延<<捐<<挻<<椽<<沇<<沿<<涎<<涓<<淵<<演<<烟<<然<<煙<<燃<<燕<<硏<<硯" + "<<筵<<緣<<縯<<衍<<軟<<鉛<<鳶<<兗<<囦<<埏<<嬿<<悁<<掾<<曣<<櫞<<渷<<臙<<莚<<蜵<<蠕<<讌<<鷰" + "&열<<悅<<涅<<熱<<閱<<噎" + "&염<<厭<<染<<炎<<焰<<琰<<艶<<苒<<閻<<髥<<鹽<<冉<<塩<<懕<<扊<<檿<<檶<<灎<<灩<<釅<<饜<<魘<<黶" + "&엽<<曄<<燁<<葉<<曅<<熀<<爗<<靨" + "&영<<塋<<嶸<<影<<映<<暎<<楹<<榮<<永<<泳<<渶<<潁<<濚<<瀛<<瀯<<煐<<營<<獰<<瑛<<瓔<<盈<<穎<<纓" + "<<英<<詠<<迎<<鍈<<霙<<咏<<嬴<<嬰<<浧<<濴<<癭<<碤<<縈<<蠑<<贏<<郢<<韺" + "&예<<乂<<倪<<刈<<叡<<曳<<汭<<濊<<猊<<睿<<穢<<芮<<藝<<蘂<<裔<<詣<<譽<<豫<<銳<<霓<<預<<囈<<嫛" + "<<拽<<掜<<枘<<獩<<睨<<瞖<<繄<<翳<<苅<<蕊<<蕋<<薉<<蚋<<蜺<<鯢<<鷖<<麑" + "&오<<五<<伍<<俉<<傲<<午<<吾<<吳<<嗚<<塢<<墺<<奧<<娛<<寤<<悟<<懊<<敖<<旿<<晤<<梧<<汚<<澳<<烏" + "<<熬<<獒<<筽<<蜈<<誤<<鰲<<鼇<<仵<<俣<<唔<<嗷<<噁<<圬<<媪<<嫯<<忤<<慠<<捂<<汙<<窹<<聱<<茣<<" + "襖<<謷<<迃<<迕<<遨<<鏊<<鏖<<隩<<驁<<鼯" + "&옥<<屋<<沃<<獄<<玉<<鈺" + "&온<<溫<<瑥<<瘟<<穩<<縕<<蘊<<媼<<慍<<昷<<氳<<熅<<薀<<轀<<醞<<韞<<饂<<鰮" + "&올<<兀<<嗢<<膃" + "&옹<<壅<<擁<<瓮<<甕<<癰<<翁<<邕<<雍<<饔<<喁<<廱<<滃<<癕<<禺<<罋<<蓊<<雝<<顒" + "&와<<渦<<瓦<<窩<<窪<<臥<<蛙<<蝸<<訛<<哇<<囮<<婐<<枙<<洼<<猧<<窊<<萵<<譌" + "&완<<婉<<完<<宛<<梡<<椀<<浣<<玩<<琓<<琬<<碗<<緩<<翫<<脘<<腕<<莞<<豌<<阮<<頑<<刓<<垸<<妧<<岏" + "<<忨<<惋<<涴<<盌" + "&왈<<曰" + "&왕<<往<<旺<<枉<<汪<<王<<尫<<瀇<<迬" + "&왜<<倭<<娃<<歪<<矮<<媧" + "&외<<外<<嵬<<巍<<猥<<畏<<偎<<崴<<嵔<<渨<<煨<<碨<<磈<<聵<<隗" + "&요<<僥<<凹<<堯<<夭<<妖<<姚<<寥<<嶢<<拗<<搖<<撓<<擾<<曜<<橈<<燿<<瑤<<窈<<窯<<繇<<繞<<耀<<腰" + "<<蟯<<要<<謠<<遙<<邀<<饒<<偠<<喓<<坳<<墝<<嬈<<幺<<徭<<徼<<殀<<澆<<祅<<穾<<窅<<蕘<<遶<<鷂" + "&욕<<慾<<欲<<浴<<縟<<褥<<辱<<溽<<蓐" + "&용<<俑<<傭<<冗<<勇<<埇<<墉<<容<<庸<<慂<<榕<<涌<<湧<<溶<<熔<<瑢<<用<<甬<<聳<<茸<<蓉<<踊<<鎔" + "<<鏞<<傛<<宂<<嵱<<慵<<憃<<槦<<硧<<舂<<蛹<<踴" + "&우<<于<<佑<<偶<<優<<又<<友<<右<<宇<<寓<<尤<<愚<<憂<<旴<<牛<<玗<<瑀<<盂<<祐<<禑<<禹<<紆<<羽" + "<<芋<<藕<<虞<<迂<<遇<<郵<<釪<<隅<<雨<<雩<<亏<<亴<<俁<<偊<<吁<<堣<<嵎<<庽<<杅<<疣<<盱<<竽<<" + "耦<<耰<<謣<<踽<<鍝<<麀<<麌<<齲" + "&욱<<勖<<彧<<旭<<昱<<栯<<煜<<稶<<郁<<頊<<燠" + "&운<<云<<橒<<殞<<澐<<熉<<耘<<芸<<蕓<<運<<隕<<雲<<韻<<惲<<沄<<篔<<紜<<霣<<韵" + "&울<<蔚<<鬱<<亐" + "&웅<<熊<<雄" + "&원<<元<<原<<員<<圓<<園<<垣<<媛<<嫄<<寃<<怨<<愿<<援<<沅<<洹<<湲<<源<<爰<<猿<<瑗<<苑<<袁<<轅" + "<<遠<<院<<願<<鴛<<冤<<圜<<杬<<楥<<猨<<綩<<芫<<薗<<蜿<<謜<<鋺<<騵<<鵷<<黿" + "&월<<月<<越<<鉞<<刖<<粤" + "&위<<位<<偉<<僞<<危<<圍<<委<<威<<尉<<慰<<暐<<渭<<爲<<瑋<<緯<<胃<<萎<<葦<<蔿<<蝟<<衛<<褘<<謂" + "<<違<<韋<<魏<<喟<<幃<<煒<<熨<<痿<<葳<<衞<<諉<<逶<<闈<<韙<<韡<<餧<<骪" + "&유<<乳<<侑<<儒<<兪<<唯<<喩<<孺<<宥<<幼<<幽<<庾<<悠<<惟<<愈<<愉<<揄<<攸<<有<<柔<<柚<<楡<<楢" + "<<油<<洧<<游<<濡<<猶<<猷<<瑜<<由<<癒<<維<<臾<<萸<<裕<<誘<<諛<<諭<<踰<<蹂<<遊<<逾<<遺<<酉<<" + "釉<<鍮<<冘<<呦<<囿<<壝<<帷<<揉<<斿<<泑<<牖<<瘉<<瘐<<窬<<窳<<籲<<糅<<緌<<腴<<莠<<蕕<<蕤<<蚰<" + "<蚴<<蝤<<褕<<讉<<逌<<鞣<<鮪<<黝<<鼬<<龥" + "&육<<堉<<毓<<肉<<育<<儥" + "&윤<<允<<奫<<尹<<潤<<玧<<胤<<贇<<鈗<<閏<<昀<<鋆" + "&율<<聿<<潏<<矞" + "&융<<戎<<瀜<<絨<<融<<狨" + "&은<<垠<<恩<<慇<<殷<<誾<<銀<<隱<<听<<嚚<<圁<<垽<<憖<<檼<<溵<<狺<<珢<<癮<<訔<<鄞<<齗" + "&을<<乙<<鳦" + "&음<<吟<<淫<<蔭<<陰<<音<<飮<<喑<<崟<<廕<<愔<<霪" + "&읍<<揖<<泣<<邑<<悒<<挹<<浥" + "&응<<凝<<應<<膺<<鷹" + "&의<<依<<倚<<儀<<宜<<意<<懿<<擬<<椅<<毅<<疑<<矣<<義<<艤<<薏<<蟻<<衣<<誼<<議<<醫<<儗<<凒<<劓" + "<<嶷<<欹<<漪<<猗<<礒<<螘<<饐" + "&이<<二<<以<<伊<<夷<<姨<<已<<弛<<彛<<怡<<爾<<珥<<異<<痍<<移<<而<<耳<<肄<<苡<<荑<<貽<<貳<<邇" + "<<飴<<餌<<咿<<坨<<尔<<彝<<栮<<洟<<珆<<訑<<詑<<迤<<隶" + "&익<<瀷<<益<<翊<<翌<<翼<<謚<<弋<<熤<<鷁" + "&인<<人<<仁<<刃<<印<<咽<<因<<姻<<寅<<引<<忍<<湮<<絪<<茵<<蚓<<認<<靭<<靷<<仞<<堙<<夤<<婣<<扨" + "<<氤<<洇<<禋<<籾<<芢<<裀" + "&일<<一<<佚<<佾<<壹<<日<<溢<<逸<<鎰<<馹<<泆<<軼" + "&임<<任<<壬<<妊<<姙<<恁<<稔<<荏<<賃<<絍<<衽<<銋<<飪" + "&입<<入<<卄<<廿" + "&잉<<仍<<剩<<孕<<芿<<媵" + "&자<<仔<<刺<<咨<<姉<<姿<<子<<字<<孜<<恣<<慈<<滋<<炙<<煮<<玆<<瓷<<疵<<磁<<紫<<者<<自<<茨<<蔗" + "<<藉<<諮<<資<<雌<<呰<<嬨<<孖<<孶<<柘<<泚<<牸<<眥<<眦<<粢<<耔<<胾<<茈<<茲<<莿<<虸<<觜<<訾<<" + "貲<<赭<<鎡<<頿<<髭<<鮓<<鶿<<鷓" + "&작<<作<<勺<<嚼<<斫<<昨<<灼<<炸<<爵<<綽<<芍<<酌<<雀<<鵲<<岝<<怍<<斱<<柞<<汋<<焯<<犳<<碏" + "&잔<<孱<<棧<<殘<<潺<<盞<<剗<<戔<<驏" + "&잠<<岑<<暫<<潛<<箴<<簪<<蠶<<涔<<潜<<濳" + "&잡<<雜<<卡<<囃<<眨<<磼<<襍" + "&장<<丈<<仗<<匠<<場<<墻<<壯<<奬<<將<<帳<<庄<<張<<掌<<暲<<杖<<樟<<檣<<欌<<漿<<牆<<獐<<璋<<章" + "<<粧<<腸<<臟<<臧<<莊<<葬<<蔣<<薔<<藏<<裝<<贓<<醬<<長<<障<<傽<<奘<<妝<<嬙<<嶂<<廧<<戕<<漳<<" + "牂<<瘴<<糚<<羘<<萇<<装<<賬<<鄣<<鏘<<餦<<麞" + "&재<<再<<哉<<在<<宰<<才<<材<<栽<<梓<<渽<<滓<<災<<縡<<裁<<財<<載<<齋<<齎<<夈<<崽<<扗<<榟<<灾" + "<<纔" + "&쟁<<爭<<箏<<諍<<錚<<崢<<猙<<琤<<鎗" + "&저<<佇<<低<<儲<<咀<<姐<<底<<抵<<杵<<楮<<樗<<沮<<渚<<狙<<猪<<疽<<箸<<紵<<苧<<菹<<著<<藷<<詛" + "<<貯<<躇<<這<<邸<<雎<<齟<<宁<<岨<<杼<<柢<<氐<<潴<<瀦<<牴<<罝<<羝<<苴<<蛆<<袛<<褚<<觝<<詆<<" + "豬<<陼" + "&적<<勣<<吊<<嫡<<寂<<摘<<敵<<滴<<狄<<的<<積<<笛<<籍<<績<<翟<<荻<<謫<<賊<<赤<<跡<<蹟<<迪<<迹" + "<<適<<鏑<<樀<<磧<<糴<<菂<<覿<<逖<<馰" + "&전<<佃<<佺<<傳<<全<<典<<前<<剪<<塡<<塼<<奠<<專<<展<<廛<<悛<<戰<<栓<<殿<<氈<<澱<<煎<<琠<<田" + "<<甸<<畑<<癲<<筌<<箋<<箭<<篆<<纏<<詮<<輾<<轉<<鈿<<銓<<錢<<鐫<<電<<顚<<顫<<餞<<吮<<囀<<嫥<<" + "屇<<巓<<戩<<揃<<旃<<栴<<槇<<湔<<澶<<牋<<瑱<<甎<<畋<<畠<<痊<<癜<<磚<<籛<<羶<<翦<<腆<<膞<<荃<" + "<躔<<輇<<邅<<鄽<<鋑<<錪<<靛<<靦<<顓<<飦<<餰<<鬋<<鱣<<鸇" + "&절<<切<<截<<折<<浙<<癤<<竊<<節<<絶<<岊<<晢<<窃" + "&점<<占<<岾<<店<<漸<<点<<粘<<霑<<鮎<<點<<佔<<墊<<玷<<笘<<簟<<苫<<蔪<<蛅<<覘<<颭<<黏" + "&접<<接<<摺<<蝶<<椄<<楪<<蜨<<跕<<蹀<<鰈" + "&정<<丁<<井<<亭<<停<<偵<<呈<<姃<<定<<幀<<庭<<廷<<征<<情<<挺<<政<<整<<旌<<晶<<晸<<柾<<楨<<檉" + "<<正<<汀<<淀<<淨<<渟<<湞<<瀞<<炡<<玎<<珽<<町<<睛<<碇<<禎<<程<<穽<<精<<綎<<艇<<訂<<諪<<貞<<" + "鄭<<酊<<釘<<鉦<<鋌<<錠<<霆<<靖<<靜<<頂<<鼎<<佂<<叮<<婧<<婷<<怔<<掟<<桯<<梃<<棖<<灯<<珵<<疔<" + "<筳<<莛<<証<<遉<<酲<<鋥<<靚" + "&제<<制<<劑<<啼<<堤<<帝<<弟<<悌<<提<<梯<<濟<<祭<<第<<臍<<薺<<製<<諸<<蹄<<醍<<除<<際<<霽<<題" + "<<齊<<儕<<娣<<擠<<猘<<瑅<<睇<<禔<<稊<<緹<<踶<<蹏<<躋<<鍗<<隄<<韲<<鮧<<鯷" + "&조<<俎<<兆<<凋<<助<<嘲<<弔<<彫<<措<<操<<早<<晁<<曺<<曹<<朝<<條<<棗<<槽<<漕<<潮<<照<<燥<<爪" + "<<璪<<眺<<祖<<祚<<租<<稠<<窕<<粗<<糟<<組<<繰<<肇<<藻<<蚤<<詔<<調<<趙<<躁<<造<<遭<<釣<<阻<<" + "雕<<鳥<<佻<<傮<<刁<<厝<<嘈<<噪<<嬥<<徂<<懆<<找<<殂<<澡<<琱<<皁<<祧<<竈<<笊<<糙<<糶<<絩<<絛<" + "<胙<<臊<<艚<<蔦<<蜩<<誂<<譟<<鈟<<銚<<鋽<<鯛<<鵰<<鼂" + "&족<<族<<簇<<足<<鏃<<瘯" + "&존<<存<<尊<<拵" + "&졸<<卒<<拙<<猝" + "&종<<倧<<宗<<從<<悰<<慫<<棕<<淙<<琮<<種<<終<<綜<<縱<<腫<<踪<<踵<<鍾<<鐘<<伀<<慒<<柊<<椶<<樅" + "<<瑽<<瘇<<粽<<螽<<蹤" + "&좌<<佐<<坐<<左<<座<<挫<<剉<<痤<<莝<<髽" + "&죄<<罪" + "&주<<主<<住<<侏<<做<<姝<<胄<<呪<<周<<嗾<<奏<<宙<<州<<廚<<晝<<朱<<柱<<株<<注<<洲<<湊<<澍<<炷" + "<<珠<<疇<<籌<<紂<<紬<<綢<<舟<<蛛<<註<<誅<<走<<躊<<輳<<週<<酎<<酒<<鑄<<駐<<丟<<侜<<儔<<尌<<" + "幬<<拄<<硃<<籒<<肘<<腠<<蔟<<蛀<<裯<<詋<<賙<<趎<<輈<<遒<<鉒<<霌<<霔<<鼄" + "&죽<<竹<<粥" + "&준<<俊<<儁<<准<<埈<<寯<<峻<<晙<<樽<<浚<<準<<濬<<焌<<畯<<竣<<蠢<<逡<<遵<<雋<<駿<<噂<<埻<<墫" + "<<惷<<撙<<皴<<綧<<罇<<踆<<蹲<<鐏<<隼<<餕<<鱒<<鵔" + "&줄<<茁<<乼" + "&중<<中<<仲<<衆<<重<<眾" + "&즉<<卽<<即<<喞" + "&즐<<櫛<<騭" + "&즙<<楫<<汁<<葺<<檝<<蕺" + "&증<<增<<憎<<曾<<拯<<烝<<甑<<症<<繒<<蒸<<證<<贈<<嶒<<矰<<罾" + "&지<<之<<只<<咫<<地<<址<<志<<持<<指<<摯<<支<<旨<<智<<枝<<枳<<止<<池<<沚<<漬<<知<<砥<<祉<<祗" + "<<紙<<肢<<脂<<至<<芝<<芷<<蜘<<誌<<贄<<趾<<遲<<坻<<墀<<扺<<榰<<泜<<痣<<秪<<篪<<舐<<踟<<躓<<" + "軹<<阯<<鮨<<鷙" + "&직<<直<<稙<<稷<<織<<職<<禝" + "&진<<唇<<嗔<<塵<<振<<搢<<晉<<晋<<桭<<榛<<殄<<津<<溱<<珍<<瑨<<璡<<畛<<疹<<盡<<眞<<瞋<<秦<<縉" + "<<縝<<臻<<蔯<<袗<<診<<賑<<軫<<辰<<進<<鎭<<陣<<陳<<震<<侲<<儘<<珒<<稹<<蓁<<螴<<趁<<鉁<<鬒" + "&질<<侄<<叱<<姪<<嫉<<帙<<桎<<瓆<<疾<<秩<<窒<<膣<<蛭<<質<<跌<<迭<<垤<<絰<<蒺<<郅<<鑕" + "&짐<<斟<<朕<<鴆" + "&집<<執<<潗<<緝<<輯<<鏶<<集<<咠<<戢" + "&징<<徵<<懲<<澄<<澂<<瀓<<癥<<瞪" + "&차<<且<<侘<<借<<叉<<嗟<<嵯<<差<<次<<此<<磋<<箚<<蹉<<車<<遮<<佽<<偖<<奓<<岔<<徣<<槎<<瑳<<硨" + "&착<<捉<<搾<<着<<窄<<錯<<鑿<<齪<<戳<<擉<<斲" + "&찬<<撰<<澯<<燦<<璨<<瓚<<竄<<簒<<纂<<粲<<纘<<讚<<贊<<鑽<<餐<<饌<<儧<<儹<<劗<<巑<<攢<<欑<<爨" + "<<趲" + "&찰<<刹<<察<<擦<<札<<紮<<扎<<拶" + "&참<<僭<<參<<塹<<慘<<慙<<懺<<斬<<站<<讒<<讖<<儳<<叅<<嶄<<巉<<慚<<憯<<攙<<槧<<欃<<毚<<譖<<鏨" + "<<鑱<<饞<<驂<<黲" + "&창<<倉<<倡<<創<<唱<<娼<<廠<<彰<<愴<<敞<<昌<<昶<<暢<<槍<<滄<<漲<<猖<<瘡<<窓<<脹<<艙<<菖<<蒼" + "<<倀<<傖<<凔<<刱<<悵<<惝<<戧<<搶<<椙<<氅<<瑲<<窗<<窻<<蹌<<鋹<<錆<<閶<<鬯<<鶬" + "&채<<債<<埰<<寀<<寨<<彩<<採<<砦<<綵<<菜<<蔡<<采<<釵<<棌<<茝" + "&책<<冊<<柵<<策<<責<<嘖<<幘<<磔<<笧<<簀<<蚱" + "&처<<凄<<妻<<悽<<處<<淒<<萋<<褄<<覷<<郪" + "&척<<倜<<剔<<尺<<慽<<戚<<拓<<擲<<斥<<滌<<瘠<<脊<<蹠<<陟<<隻<<呎<<坧<<塉<<惕<<捗<<摭<<蜴<<跖" + "<<躑" + "&천<<仟<<千<<喘<<天<<川<<擅<<泉<<淺<<玔<<穿<<舛<<薦<<賤<<踐<<遷<<釧<<闡<<阡<<韆<<俴<<倩<<僢" + "<<儃<<洊<<濺<<瓩<<祆<<粁<<臶<<芊<<茜<<荐<<蒨<<蕆<<蚕<<辿<<靝" + "&철<<凸<<哲<<喆<<徹<<撤<<澈<<綴<<輟<<轍<<鐵<<剟<<啜<<埑<<惙<<掇<<歠<<銕<<錣<<飻<<餮" + "&첨<<僉<<尖<<沾<<添<<甛<<瞻<<簽<<籤<<詹<<諂<<幨<<忝<<惉<<檐<<櫼<<瀸<<簷<<襜" + "&첩<<堞<<妾<<帖<<捷<<牒<<疊<<睫<<諜<<貼<<輒<<倢<<呫<<喋<<怗<<褺" + "&청<<廳<<晴<<淸<<聽<<菁<<請<<靑<<鯖<<凊<<圊<<蜻<<鶄" + "&체<<剃<<替<<涕<<滯<<締<<諦<<逮<<遞<<體<<嚏<<彘<<棣<<殢<<砌<<蒂<<蔕<<蕞<<軆<<靆<<髰" + "&초<<初<<剿<<哨<<憔<<抄<<招<<梢<<椒<<楚<<樵<<炒<<焦<<硝<<礁<<礎<<秒<<稍<<肖<<艸<<苕<<草<<蕉" + "<<貂<<超<<酢<<醋<<醮<<偢<<僬<<劭<<勦<<噍<<嫶<<岧<<峭<<嶕<<怊<<悄<<愀<<杪<<燋<<綃<<耖<<誚<<" + "譙<<趠<<軺<<迢<<鈔<<鍫<<鍬<<鞘<<顦<<髫<<鷦<<齠" + "&촉<<促<<囑<<燭<<矗<<蜀<<觸<<曯<<爥<<矚<<薥<<躅<<髑" + "&촌<<寸<<忖<<村<<邨<<吋" + "&총<<叢<<塚<<寵<<悤<<憁<<摠<<總<<聰<<蔥<<銃<<葱<<蓯<<鏦<<騘<<驄" + "&촬<<撮" + "&최<<催<<崔<<最<<嘬<<摧<<榱<<漼<<璀<<磪<<縗<<脧" + "&추<<墜<<抽<<推<<椎<<楸<<樞<<湫<<皺<<秋<<芻<<萩<<諏<<趨<<追<<鄒<<酋<<醜<<錐<<錘<<鎚<<雛<<騶" + "<<鰍<<僦<<啾<<娵<<帚<<惆<<捶<<揫<<搥<<甃<<瘳<<龝<<箒<<箠<<簉<<縋<<縐<<蒭<<陬<<隹<<鞦<<騅<<" + "魋<<鰌<<鵻<<鶖<<鶵<<麄<<麤" + "&축<<丑<<畜<<祝<<竺<<筑<<築<<縮<<蓄<<蹙<<蹴<<軸<<逐<<妯<<舳<<豖<<蹜<<鼀" + "&춘<<春<<椿<<瑃" + "&출<<出<<朮<<黜<<秫" + "&충<<充<<忠<<沖<<蟲<<衝<<衷<<冲<<忡<<珫" + "&췌<<悴<<膵<<萃<<贅<<惴<<揣<<疩<<瘁<<顇" + "&취<<取<<吹<<嘴<<娶<<就<<炊<<翠<<聚<<脆<<臭<<趣<<醉<<驟<<鷲<<冣<<橇<<毳" + "&측<<側<<仄<<厠<<惻<<測<<廁<<昃" + "&층<<層" + "&치<<侈<<値<<嗤<<峙<<幟<<恥<<梔<<治<<淄<<熾<<痔<<痴<<癡<<稚<<穉<<緇<<緻<<置<<致<<蚩<<輜<<雉" + "<<馳<<齒<<卮<<哆<<寘<<巵<<畤<<痓<<絺<<菑<<薙<<褫<<豸<<跱<<錙<<阤<<鯔<<鴙<<鴟<<鵄" + "&칙<<則<<勅<<飭<<敕" + "&친<<親<<櫬<<藽<<襯<<齔" + "&칠<<七<<柒<<漆" + "&침<<侵<<寢<<枕<<沈<<浸<<琛<<砧<<針<<鍼<<寖<<忱<<椹<<沉<<郴<<鋟<<駸" + "&칩<<蟄" + "&칭<<秤<<稱" + "&쾌<<快<<噲<<夬" + "&타<<他<<咤<<唾<<墮<<妥<<惰<<打<<拖<<朶<<楕<<舵<<陀<<馱<<駝<<佗<<垞<<拕<<柁<<橢<<沱<<詫<<跎" + "<<躱<<駞<<鮀<<鴕<<鼉" + "&탁<<倬<<卓<<啄<<坼<<托<<擢<<晫<<柝<<濁<<濯<<琢<<琸<<託<<鐸<<拆<<橐<<沰<<涿<<矺<<籜<<蘀<<踔" + "<<逴" + "&탄<<呑<<嘆<<坦<<彈<<憚<<歎<<灘<<炭<<綻<<誕<<憻<<攤<<殫<<癱<<驒" + "&탈<<奪<<脫<<侻" + "&탐<<探<<眈<<耽<<貪<<嗿<<忐<<酖" + "&탑<<塔<<搭<<榻<<傝<<塌<<搨" + "&탕<<宕<<帑<<湯<<蕩<<燙<<盪<<碭<<蘯" + "&태<<兌<<台<<太<<怠<<態<<殆<<汰<<泰<<笞<<胎<<苔<<跆<<邰<<颱<<埭<<娧<<孡<<抬<<迨<<駄<<駘" + "&택<<擇<<澤" + "&탱<<撑<<撐<<牚" + "&터<<攄" + "&토<<兎<<吐<<土<<討" + "&톤<<噋<<噸<<瓲" + "&통<<慟<<桶<<痛<<筒<<統<<通<<恫<<樋<<筩" + "&퇴<<堆<<槌<<腿<<褪<<退<<頹<<隤" + "&투<<偸<<套<<妬<<投<<透<<鬪<<妒<<渝<<骰" + "&퉁<<佟" + "&특<<慝<<特<<忒" + "&틈<<闖" + "&파<<坡<<婆<<巴<<把<<播<<擺<<杷<<波<<派<<爬<<琶<<破<<罷<<芭<<跛<<頗<<叵<<妑<<岥<<怕<<灞<<爸" + "<<玻<<皤<<笆<<簸<<耙<<菠<<葩<<鄱" + "&판<<判<<坂<<板<<版<<瓣<<販<<辦<<鈑<<阪<<汴" + "&팔<<八<<叭<<捌<<朳<<汃" + "&패<<佩<<唄<<悖<<敗<<沛<<浿<<牌<<狽<<稗<<覇<<貝<<孛<<旆<<珮<<霈<<霸" + "&팽<<彭<<澎<<烹<<膨<<砰<<祊<<蟚<<蟛" + "&퍅<<愎" + "&편<<便<<偏<<扁<<片<<篇<<編<<翩<<遍<<鞭<<騙<<匾<<徧<<惼<<緶<<艑<<萹<<蝙<<褊<<諞" + "&폄<<貶<<砭<<窆" + "&평<<坪<<平<<枰<<萍<<評<<怦<<抨<<泙<<苹<<蓱<<鮃" + "&폐<<吠<<嬖<<幣<<廢<<弊<<斃<<肺<<蔽<<閉<<陛<<敝<<狴<<獘<<癈" + "&포<<佈<<包<<匍<<匏<<咆<<哺<<圃<<布<<怖<<抛<<抱<<捕<<泡<<浦<<疱<<砲<<胞<<脯<<苞<<葡<<蒲<<袍" + "<<褒<<逋<<鋪<<飽<<鮑<<儤<<庖<<晡<<曓<<炮<<炰<<舖<<誧<<鉋<<鞄<<餔<<鯆" + "&폭<<幅<<暴<<曝<<瀑<<爆" + "&표<<俵<<剽<<彪<<慓<<杓<<標<<漂<<瓢<<票<<表<<豹<<飇<<飄<<驃<<僄<<勡<<嘌<<嫖<<摽<<殍<<熛<<縹" + "<<裱<<鏢<<鑣<<髟<<鰾" + "&품<<品<<稟<<禀" + "&풍<<楓<<諷<<豊<<風<<馮<<瘋<<葑" + "&피<<彼<<披<<疲<<皮<<被<<避<<陂<<詖<<辟<<鞁<<髲" + "&픽<<腷" + "&필<<匹<<弼<<必<<泌<<珌<<畢<<疋<<筆<<苾<<馝<<佖<<咇<<滭<<篳<<罼<<蓽<<觱<<蹕<<鞸<<韠<<駜<<鵯" + "&핍<<乏<<逼<<偪" + "&하<<下<<何<<厦<<夏<<廈<<昰<<河<<瑕<<荷<<蝦<<賀<<遐<<霞<<鰕<<呀<<嚇<<岈<<懗<<煆<<瘕<<罅<<鍜" + "&학<<壑<<學<<虐<<謔<<鶴<<狢<<瘧<<皬<<确<<郝<<鷽" + "&한<<寒<<恨<<悍<<旱<<汗<<漢<<澣<<瀚<<罕<<翰<<閑<<閒<<限<<韓<<僩<<嫺<<嫻<<捍<<暵<<閈<<駻<<鷳" + "<<鼾" + "&할<<割<<轄<<瞎" + "&함<<函<<含<<咸<<啣<<喊<<檻<<涵<<緘<<艦<<銜<<陷<<鹹<<莟<<菡<<諴<<轞<<闞" + "&합<<合<<哈<<盒<<蛤<<閤<<闔<<陜<<匌<<嗑<<柙<<榼<<溘<<盍<<郃" + "&항<<亢<<伉<<姮<<嫦<<巷<<恒<<抗<<杭<<桁<<沆<<港<<缸<<肛<<航<<項<<夯<<恆<<炕<<缿<<頏" + "&해<<亥<<偕<<咳<<垓<<奚<<孩<<害<<懈<<楷<<海<<瀣<<蟹<<解<<該<<諧<<邂<<駭<<骸<<咍<<嶰<<廨<<欬" + "<<獬<<瑎<<痎<<薤<<醢<<頦<<鮭" + "&핵<<劾<<核<<翮<<覈" + "&행<<倖<<幸<<杏<<荇<<行<<悻" + "&향<<享<<向<<嚮<<珦<<鄕<<響<<餉<<饗<<香<<薌" + "&허<<噓<<墟<<虛<<許<<歔" + "&헌<<憲<<櫶<<獻<<軒<<巚<<幰<<攇" + "&헐<<歇" + "&험<<險<<驗<<嶮<<獫<<玁" + "&혁<<奕<<爀<<赫<<革<<弈<<洫<<焱<<鬩" + "&현<<俔<<峴<<弦<<懸<<晛<<泫<<炫<<玄<<玹<<現<<眩<<睍<<絃<<絢<<縣<<舷<<衒<<賢<<鉉<<顯<<儇<<嬛" + "<<昡<<琄<<痃<<県<<繯<<翾<<蜆<<誢<<鋗<<駽" + "&혈<<孑<<穴<<血<<頁<<絜<<趐" + "&혐<<嫌" + "&협<<俠<<協<<夾<<峽<<挾<<浹<<狹<<脅<<脇<<莢<<鋏<<頰<<匧<<叶<<埉<<恊<<悏<<愜<<篋" + "&형<<亨<<兄<<刑<<型<<形<<泂<<滎<<瀅<<灐<<炯<<熒<<珩<<瑩<<荊<<螢<<衡<<逈<<邢<<鎣<<馨<<夐<<娙" + "<<詗<<迥<<陘" + "&혜<<兮<<彗<<惠<<慧<<暳<<蕙<<蹊<<醯<<鞋<<傒<<嘒<<寭<<徯<<槥<<盻<<謑<<譿" + "&호<<乎<<互<<呼<<壕<<壺<<好<<岵<<弧<<戶<<扈<<昊<<晧<<毫<<浩<<淏<<湖<<滸<<澔<<濠<<濩<<灝<<狐" + "<<琥<<瑚<<瓠<<皓<<祜<<糊<<縞<<胡<<芦<<葫<<蒿<<虎<<號<<蝴<<護<<豪<<鎬<<頀<<顥<<儫<<冱<<嘷<<" + "嫭<<嫮<<怙<<沍<<滈<<滬<<犒<<猢<<皜<<皞<<箎<<聕<<醐<<餬<<鬍" + "&혹<<惑<<或<<酷" + "&혼<<婚<<昏<<混<<渾<<琿<<魂<<圂<<惛<<溷<<焜<<閽" + "&홀<<忽<<惚<<笏<<囫" + "&홍<<哄<<弘<<汞<<泓<<洪<<烘<<紅<<虹<<訌<<鴻<<晎<<澒<<篊<<鉷<<鬨" + "&화<<化<<和<<嬅<<樺<<火<<畵<<禍<<禾<<花<<華<<話<<譁<<貨<<靴<<俰<<嘩<<婲<<擭<<畫<<驊<<龢" + "&확<<擴<<攫<<確<<碻<<穫<<矍<<矡<<礭<<鑊" + "&환<<丸<<喚<<奐<<宦<<幻<<患<<換<<歡<<晥<<桓<<渙<<煥<<環<<紈<<還<<驩<<鰥<<寰<<懽<<擐<<瓛<<皖" + "<<睆<<絙<<豢<<轘<<鍰<<鐶<<鬟" + "&활<<活<<滑<<猾<<豁<<闊<<蛞" + "&황<<凰<<幌<<徨<<恍<<惶<<愰<<慌<<晃<<晄<<榥<<況<<湟<<滉<<潢<<煌<<璜<<皇<<篁<<簧<<荒<<蝗<<遑" + "<<隍<<黃<<喤<<媓<<怳<<瑝<<肓<<貺<<鎤" + "&회<<匯<<回<<廻<<徊<<恢<<悔<<懷<<晦<<會<<檜<<淮<<澮<<灰<<獪<<繪<<膾<<茴<<蛔<<誨<<賄<<佪<<栃" + "<<洄<<滙<<盔<<詼<<迴<<頮<<鱠" + "&획<<劃<<獲<<嚄" + "&횡<<宖<<橫<<鐄<<澋<<鈜<<黌" + "&효<<哮<<嚆<<孝<<效<<斅<<曉<<梟<<涍<<淆<<爻<<肴<<酵<<驍<<傚<<囂<<崤<<殽<<熇<<皛<<虓<<餚" + "&후<<侯<<候<<厚<<后<<吼<<喉<<嗅<<帿<<後<<朽<<煦<<珝<<逅<<吽<<喣<<垕<<堠<<涸<<猴<<篌<<詡<<譃" + "<<酗<<餱" + "&훈<<勛<<勳<<塤<<壎<<焄<<熏<<燻<<薰<<訓<<暈<<曛<<爋<<獯<<纁<<葷<<鑂" + "&훌<<欻" + "&훙<<薨" + "&훤<<喧<<暄<<煊<<萱<<烜<<諠<<諼" + "&훼<<卉<<喙<<毁<<燬<<芔<<虫<<虺" + "&휘<<彙<<徽<<揮<<暉<<煇<<諱<<輝<<麾<<撝<<翬" + "&휴<<休<<携<<烋<<畦<<虧<<咻<<擕<<隳<<髹<<鵂" + "&휼<<恤<<譎<<鷸<<卹" + "&흉<<兇<<凶<<匈<<洶<<胸<<恟<<胷" + "&흑<<黑" + "&흔<<昕<<欣<<炘<<痕<<很<<忻<<掀<<焮<<訢<<釁" + "&흘<<吃<<屹<<紇<<訖<<仡<<汔<<疙<<迄<<齕" + "&흠<<欠<<欽<<歆<<廞" + "&흡<<吸<<恰<<洽<<翕<<噏<<歙<<潝<<翖" + "&흥<<興" + "&희<<僖<<凞<<喜<<噫<<囍<<姬<<嬉<<希<<憙<<憘<<戱<<晞<<曦<<熙<<熹<<熺<<犧<<禧<<稀<<羲<<咥<<唏" + "<<嘻<<悕<<戲<<暿<<欷<<燹<<爔<<豨<<餼" + "&힐<<詰<<犵<<纈<<襭<<頡<<黠" + } + Version{"2.1"} + } + } +} diff --git a/icuSources/data/coll/ko_KR.txt b/icuSources/data/coll/ko_KR.txt new file mode 100644 index 00000000..14a97114 --- /dev/null +++ b/icuSources/data/coll/ko_KR.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "ko" + */ +ko_KR{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/lt.txt b/icuSources/data/coll/lt.txt new file mode 100644 index 00000000..f59270b2 --- /dev/null +++ b/icuSources/data/coll/lt.txt @@ -0,0 +1,26 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/lt.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/lt.xml + */ +lt{ + Version{"1.2"} + collations{ + standard{ + Sequence{ + "&̨<<̇" + "&[before 1]D<č<<<Č" + "&[before 1]J source: ../../../locale/icu/collation/lv.xml + */ +lv{ + Version{"1.2"} + collations{ + standard{ + Sequence{ + "&[before 1]D<č<<<Č" + "&[before 1]H<ģ<<<Ģ" + "&[before 1]J source: ../../../locale/icu/collation/mk.xml + */ +mk{ + Version{"1.2"} + collations:alias{"ru/collations"} +} diff --git a/icuSources/data/coll/mk_MK.txt b/icuSources/data/coll/mk_MK.txt new file mode 100644 index 00000000..3aa7040f --- /dev/null +++ b/icuSources/data/coll/mk_MK.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "mk" + */ +mk_MK{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ml.txt b/icuSources/data/coll/ml.txt new file mode 100644 index 00000000..64cffaf8 --- /dev/null +++ b/icuSources/data/coll/ml.txt @@ -0,0 +1,20 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/ml.xml +// * +// *************************************************************************** +ml{ + /** + * Draft + */ + Version{"1.2"} + collations{ + standard{ + Sequence{" [normalization on ]&ല<വ&ഴ<റ&ഹ<ഃ<ം"} + Version{"1.0"} + } + } +} diff --git a/icuSources/data/coll/mr.txt b/icuSources/data/coll/mr.txt new file mode 100644 index 00000000..7e8f5eaa --- /dev/null +++ b/icuSources/data/coll/mr.txt @@ -0,0 +1,20 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/mr.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/mr.xml + */ +mr{ + Version{"1.2"} + collations{ + standard{ + Sequence{" [normalization on ]"} + Version{"1.0"} + } + } +} diff --git a/icuSources/data/coll/mr_IN.txt b/icuSources/data/coll/mr_IN.txt new file mode 100644 index 00000000..c37f6cc1 --- /dev/null +++ b/icuSources/data/coll/mr_IN.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "mr" + */ +mr_IN{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ms.txt b/icuSources/data/coll/ms.txt new file mode 100644 index 00000000..2ad39389 --- /dev/null +++ b/icuSources/data/coll/ms.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "root" + */ +ms{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ms_BN.txt b/icuSources/data/coll/ms_BN.txt new file mode 100644 index 00000000..857cc0ac --- /dev/null +++ b/icuSources/data/coll/ms_BN.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "root" + */ +ms_BN{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ms_MY.txt b/icuSources/data/coll/ms_MY.txt new file mode 100644 index 00000000..e859feb9 --- /dev/null +++ b/icuSources/data/coll/ms_MY.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "root" + */ +ms_MY{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/mt.txt b/icuSources/data/coll/mt.txt new file mode 100644 index 00000000..75038a3c --- /dev/null +++ b/icuSources/data/coll/mt.txt @@ -0,0 +1,27 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/mt.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/mt.xml + */ +mt{ + Version{"1.2"} + collations{ + standard{ + Sequence{ + " [caseFirst upper ]" + "&[before 1]d<Ċ<<<ċ" + "&[before 1]g<Ġ<<<ġ" + "&[before 1]h source: ../../../locale/icu/collation/nb.xml + */ +nb{ + Version{"1.2"} + collations{ + standard{ + Sequence{ + "&D<<đ<<<Đ<<ð<<<Ð" + "&t<<<þ/h" + "&T<<<Þ/H" + "&Y<<ü<<<Ü<<ű<<<Ű" + "&[before 1]ʒ<æ<<<Æ<<ä<<<Ä<<ę<<<Ę<ø<<<Ø<<ö<<<Ö<<ő<<<Ő<<œ<<<Œ<å<<<Å" + } + Version{"2.0"} + } + } +} diff --git a/icuSources/data/coll/nb_NO.txt b/icuSources/data/coll/nb_NO.txt new file mode 100644 index 00000000..66a1b2ca --- /dev/null +++ b/icuSources/data/coll/nb_NO.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "nb" + */ +nb_NO{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/nl.txt b/icuSources/data/coll/nl.txt new file mode 100644 index 00000000..993821d5 --- /dev/null +++ b/icuSources/data/coll/nl.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "root" + */ +nl{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/nl_BE.txt b/icuSources/data/coll/nl_BE.txt new file mode 100644 index 00000000..2e2397fa --- /dev/null +++ b/icuSources/data/coll/nl_BE.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "root" + */ +nl_BE{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/nl_NL.txt b/icuSources/data/coll/nl_NL.txt new file mode 100644 index 00000000..018be58f --- /dev/null +++ b/icuSources/data/coll/nl_NL.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "root" + */ +nl_NL{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/nn.txt b/icuSources/data/coll/nn.txt new file mode 100644 index 00000000..4cfb2aba --- /dev/null +++ b/icuSources/data/coll/nn.txt @@ -0,0 +1,26 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/nn.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/nn.xml + */ +nn{ + Version{"1.2"} + collations{ + standard{ + Sequence{ + "&D<<đ<<<Đ<<ð<<<Ð" + "&t<<<þ/h" + "&T<<<Þ/H" + "&Y<<ü<<<Ü<<ű<<<Ű" + "&[before 1]ʒ<æ<<<Æ<<ä<<<Ä<<ę<<<Ę<ø<<<Ø<<ö<<<Ö<<ő<<<Ő<<œ<<<Œ<å<<<Å" + } + Version{"2.0"} + } + } +} diff --git a/icuSources/data/coll/nn_NO.txt b/icuSources/data/coll/nn_NO.txt new file mode 100644 index 00000000..25ec816d --- /dev/null +++ b/icuSources/data/coll/nn_NO.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "nn" + */ +nn_NO{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/om.txt b/icuSources/data/coll/om.txt new file mode 100644 index 00000000..fbd29f7f --- /dev/null +++ b/icuSources/data/coll/om.txt @@ -0,0 +1,23 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/om.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/om.xml + */ +om{ + Version{"1.2"} + collations{ + standard{ + Sequence{ + "&Z source: ../../../locale/icu/collation/pa.xml + */ +pa{ + Version{"1.2"} + collations{ + standard{ + Sequence{" [normalization on ]"} + Version{"1.0"} + } + } +} diff --git a/icuSources/data/coll/pa_IN.txt b/icuSources/data/coll/pa_IN.txt new file mode 100644 index 00000000..9ed1da0c --- /dev/null +++ b/icuSources/data/coll/pa_IN.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "pa" + */ +pa_IN{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/pl.txt b/icuSources/data/coll/pl.txt new file mode 100644 index 00000000..c1ebb6c6 --- /dev/null +++ b/icuSources/data/coll/pl.txt @@ -0,0 +1,29 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/pl.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/pl.xml + */ +pl{ + Version{"1.2"} + collations{ + standard{ + Sequence{ + "&A<ą<<<Ą" + "&C<ć<<<Ć" + "&E<ę<<<Ę" + "&L<ł<<<Ł" + "&N<ń<<<Ń" + "&O<ó<<<Ó" + "&S<ś<<<Ś" + "&Z<ź<<<Ź<ż<<<Ż" + } + Version{"2"} + } + } +} diff --git a/icuSources/data/coll/pl_PL.txt b/icuSources/data/coll/pl_PL.txt new file mode 100644 index 00000000..30d083e6 --- /dev/null +++ b/icuSources/data/coll/pl_PL.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "pl" + */ +pl_PL{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ps.txt b/icuSources/data/coll/ps.txt new file mode 100644 index 00000000..8c647a89 --- /dev/null +++ b/icuSources/data/coll/ps.txt @@ -0,0 +1,38 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/ps.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/ps.xml + */ +ps{ + Version{"1.2"} + collations{ + standard{ + Sequence{ + " [normalization on ]" + "&َ<<ِ<<ُ<<ً<<ٍ<<ٌ" + "&[before 1]ا<آ" + "&ا<<أ<<ٲ<<ٱ<<إ<<ٳ<ء" + "&ت<ټ<<ٹ" + "&ج<ځ<<حٔ" + "&چ<څ" + "&د<ډ<<ڈ" + "&ر<ړ<<ڑ" + "&ژ<ږ" + "&ک<<ڪ<<ك" + "&ګ<<گ" + "&ڼ<<ڻ" + "&و<<ؤ<<ۇ<<ۉ" + "&ه<<<ۀ<<<هٔ<<ە<<ہ<<ھ<<ة<<ۃ" + "&ی<<ى<<ے<<ي<<ې<<ۍ<<یٔ<<<ىٔ<<<ئ" + "&'\u00A0'<<'\u200C'<<'\u200D'" + } + Version{"1.0"} + } + } +} diff --git a/icuSources/data/coll/ps_AF.txt b/icuSources/data/coll/ps_AF.txt new file mode 100644 index 00000000..69c13495 --- /dev/null +++ b/icuSources/data/coll/ps_AF.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "ps" + */ +ps_AF{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/pt.txt b/icuSources/data/coll/pt.txt new file mode 100644 index 00000000..9402fe9f --- /dev/null +++ b/icuSources/data/coll/pt.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "root" + */ +pt{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/pt_BR.txt b/icuSources/data/coll/pt_BR.txt new file mode 100644 index 00000000..98d162d0 --- /dev/null +++ b/icuSources/data/coll/pt_BR.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "root" + */ +pt_BR{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/pt_PT.txt b/icuSources/data/coll/pt_PT.txt new file mode 100644 index 00000000..679d66f2 --- /dev/null +++ b/icuSources/data/coll/pt_PT.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "root" + */ +pt_PT{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ro.txt b/icuSources/data/coll/ro.txt new file mode 100644 index 00000000..0dd525e3 --- /dev/null +++ b/icuSources/data/coll/ro.txt @@ -0,0 +1,20 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/ro.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/ro.xml + */ +ro{ + Version{"1.2"} + collations{ + standard{ + Sequence{"&A<ă<<<Ă<â<<<Â&D<đ<<<Đ&I<î<<<Î&S<ş=ș<<<Ş=Ș&T<ţ=ț<<<Ţ=Ț&Z<ż<<<Ż"} + Version{"1.0"} + } + } +} diff --git a/icuSources/data/coll/ro_RO.txt b/icuSources/data/coll/ro_RO.txt new file mode 100644 index 00000000..f78ac4a8 --- /dev/null +++ b/icuSources/data/coll/ro_RO.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "ro" + */ +ro_RO{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/root.txt b/icuSources/data/coll/root.txt new file mode 100644 index 00000000..e05f0b4c --- /dev/null +++ b/icuSources/data/coll/root.txt @@ -0,0 +1,22 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/root.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/root.xml + */ +root{ + "%%UCARULES":include{"../unidata/UCARules.txt"} + Version{"1.2"} + collations{ + default{"standard"} + standard{ + Sequence{""} + Version{"0.0"} + } + } +} diff --git a/icuSources/data/coll/ru.txt b/icuSources/data/coll/ru.txt new file mode 100644 index 00000000..344ceb01 --- /dev/null +++ b/icuSources/data/coll/ru.txt @@ -0,0 +1,20 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/ru.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/ru.xml + */ +ru{ + Version{"1.2"} + collations{ + standard{ + Sequence{"[suppressContractions [Ѐ-џ] ]"} + Version{"1.1"} + } + } +} diff --git a/icuSources/data/coll/ru_RU.txt b/icuSources/data/coll/ru_RU.txt new file mode 100644 index 00000000..e768fd98 --- /dev/null +++ b/icuSources/data/coll/ru_RU.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "ru" + */ +ru_RU{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/ru_UA.txt b/icuSources/data/coll/ru_UA.txt new file mode 100644 index 00000000..b8562158 --- /dev/null +++ b/icuSources/data/coll/ru_UA.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "ru" + */ +ru_UA{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/sh.txt b/icuSources/data/coll/sh.txt new file mode 100644 index 00000000..01800599 --- /dev/null +++ b/icuSources/data/coll/sh.txt @@ -0,0 +1,15 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/sh.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/sh.xml + */ +sh{ + Version{"1.2"} + collations:alias{"hr/collations"} +} diff --git a/icuSources/data/coll/sh_YU.txt b/icuSources/data/coll/sh_YU.txt new file mode 100644 index 00000000..9d1d2705 --- /dev/null +++ b/icuSources/data/coll/sh_YU.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "sh" + */ +sh_YU{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/sk.txt b/icuSources/data/coll/sk.txt new file mode 100644 index 00000000..4a97b905 --- /dev/null +++ b/icuSources/data/coll/sk.txt @@ -0,0 +1,30 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/sk.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/sk.xml + */ +sk{ + Version{"1.2"} + collations{ + standard{ + Sequence{ + "&A<ä<<<Ä" + "&C<č<<<Č" + "&D<đ<<<Đ" + "&H source: ../../../locale/icu/collation/sl.xml + */ +sl{ + Version{"1.2"} + collations{ + standard{ + Sequence{"&C<č<<<Č<ć<<<Ć&S<š<<<Š&Z<ž<<<Ž"} + Version{"1.0"} + } + } +} diff --git a/icuSources/data/coll/sl_SI.txt b/icuSources/data/coll/sl_SI.txt new file mode 100644 index 00000000..473121a3 --- /dev/null +++ b/icuSources/data/coll/sl_SI.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "sl" + */ +sl_SI{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/sq.txt b/icuSources/data/coll/sq.txt new file mode 100644 index 00000000..b1516fca --- /dev/null +++ b/icuSources/data/coll/sq.txt @@ -0,0 +1,32 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/sq.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/sq.xml + */ +sq{ + Version{"1.2"} + collations{ + standard{ + Sequence{ + "&[before 1]D<ç<<<Ç" + "&[before 1]E source: ../../../locale/icu/collation/sr.xml + */ +sr{ + Version{"1.2"} + collations:alias{"ru/collations"} +} diff --git a/icuSources/data/coll/sr_YU.txt b/icuSources/data/coll/sr_YU.txt new file mode 100644 index 00000000..43f0fdd2 --- /dev/null +++ b/icuSources/data/coll/sr_YU.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "sr" + */ +sr_YU{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/sv.txt b/icuSources/data/coll/sv.txt new file mode 100644 index 00000000..d347ea8a --- /dev/null +++ b/icuSources/data/coll/sv.txt @@ -0,0 +1,29 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/sv.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/sv.xml + */ +sv{ + Version{"1.2"} + collations{ + standard{ + Sequence{ + "&D<<đ<<<Đ<<ð<<<Ð" + "&t<<<þ/h" + "&T<<<Þ/H" + "&v<< source: ../../../locale/icu/collation/ta.xml + */ +ta{ + Version{"1.2"} + collations{ + standard{ + Sequence{" [normalization on ]"} + Version{"1.0"} + } + } +} diff --git a/icuSources/data/coll/ta_IN.txt b/icuSources/data/coll/ta_IN.txt new file mode 100644 index 00000000..63afd17b --- /dev/null +++ b/icuSources/data/coll/ta_IN.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "ta" + */ +ta_IN{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/te.txt b/icuSources/data/coll/te.txt new file mode 100644 index 00000000..1438cac4 --- /dev/null +++ b/icuSources/data/coll/te.txt @@ -0,0 +1,20 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/te.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/te.xml + */ +te{ + Version{"1.2"} + collations{ + standard{ + Sequence{" [normalization on ]&హ<ఁ<ం<ః<్"} + Version{"1.0"} + } + } +} diff --git a/icuSources/data/coll/te_IN.txt b/icuSources/data/coll/te_IN.txt new file mode 100644 index 00000000..04530cca --- /dev/null +++ b/icuSources/data/coll/te_IN.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "te" + */ +te_IN{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/th.txt b/icuSources/data/coll/th.txt new file mode 100644 index 00000000..f5acbd9d --- /dev/null +++ b/icuSources/data/coll/th.txt @@ -0,0 +1,29 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/th.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/th.xml + */ +th{ + Version{"1.2"} + collations{ + standard{ + Sequence{ + " [normalization on ]" + "&ฤ<ฤๅ" + "&ฦ<ฦๅ" + "&ไ<ๅ" + "&[before 2]็<<๎" + "&๋<<์<<ํ" + "&[last secondary ignorable ]<<<'\u0020'<<<'-'<<<'.'<<<'...'<<<ฯ<<<ๆ<" + "<<๏<<<๚<<<๛" + } + Version{"3.0"} + } + } +} diff --git a/icuSources/data/coll/th_TH.txt b/icuSources/data/coll/th_TH.txt new file mode 100644 index 00000000..d6b10c0b --- /dev/null +++ b/icuSources/data/coll/th_TH.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "th" + */ +th_TH{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/tr.txt b/icuSources/data/coll/tr.txt new file mode 100644 index 00000000..e94d5f5c --- /dev/null +++ b/icuSources/data/coll/tr.txt @@ -0,0 +1,20 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/tr.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/tr.xml + */ +tr{ + Version{"1.2"} + collations{ + standard{ + Sequence{"&C<ç<<<Ç&G<ğ<<<Ğ&[before 1]i<ı<< source: ../../../locale/icu/collation/uk.xml + */ +uk{ + Version{"1.2"} + collations{ + standard{ + Sequence{"&Г<ґ<<<Ґ"} + Version{"1.0"} + } + } +} diff --git a/icuSources/data/coll/uk_UA.txt b/icuSources/data/coll/uk_UA.txt new file mode 100644 index 00000000..f3906612 --- /dev/null +++ b/icuSources/data/coll/uk_UA.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "uk" + */ +uk_UA{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/vi.txt b/icuSources/data/coll/vi.txt new file mode 100644 index 00000000..c0d4e077 --- /dev/null +++ b/icuSources/data/coll/vi.txt @@ -0,0 +1,28 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/vi.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/vi.xml + */ +vi{ + Version{"1.2"} + collations{ + standard{ + Sequence{ + " [normalization on ]" + "&̀<<̉<<̃<<́<<̣" + "&a<ă<<<Ă<â<<<Â" + "&d<đ<<<Đ" + "&e<ê<<<Ê" + "&o<ô<<<Ô<ơ<<<Ơ" + "&u<ư<<<Ư" + } + Version{"3.1"} + } + } +} diff --git a/icuSources/data/coll/vi_VN.txt b/icuSources/data/coll/vi_VN.txt new file mode 100644 index 00000000..74e97b7e --- /dev/null +++ b/icuSources/data/coll/vi_VN.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "vi" + */ +vi_VN{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/zh.txt b/icuSources/data/coll/zh.txt new file mode 100644 index 00000000..10de0215 --- /dev/null +++ b/icuSources/data/coll/zh.txt @@ -0,0 +1,1667 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/zh.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/collation/zh.xml + */ +zh{ + Version{"1.2"} + collations{ + big5han{ + Sequence{ + "&[before 2]a<<ā<<<Ā<<á<<<Á<<ǎ<<<Ǎ<<à<<<À" + "&[before 2]e<<ē<<<Ē<<é<<<É<<ě<<<Ě<<è<<<È" + "&e<<ê̄<<<Ê̄<<ế<<<Ế<<ê̌<<<Ê̌<<ề<<<Ề" + "&[before 2]i<<ī<<<Ī<<í<<<Í<<ǐ<<<Ǐ<<ì<<<Ì" + "&[before 2]m< source: ../../../locale/icu/collation/zh_Hant.xml + */ +zh_Hant{ + Version{"1.2"} + collations{ + default{"stroke"} + } +} diff --git a/icuSources/data/coll/zh_MO.txt b/icuSources/data/coll/zh_MO.txt new file mode 100644 index 00000000..e0a705b0 --- /dev/null +++ b/icuSources/data/coll/zh_MO.txt @@ -0,0 +1,14 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/zh_MO.xml +// * +// *************************************************************************** +zh_MO{ + Version{"1.2"} + collations{ + default{"stroke"} + } +} diff --git a/icuSources/data/coll/zh_SG.txt b/icuSources/data/coll/zh_SG.txt new file mode 100644 index 00000000..5643361a --- /dev/null +++ b/icuSources/data/coll/zh_SG.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +/** + * validSubLocale of "zh" + */ +zh_SG{ + /** + * so genrb doesn't issue warnings + */ + ___{""} +} diff --git a/icuSources/data/coll/zh_TW.txt b/icuSources/data/coll/zh_TW.txt new file mode 100644 index 00000000..c2e7af1e --- /dev/null +++ b/icuSources/data/coll/zh_TW.txt @@ -0,0 +1,14 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/collation/zh_TW.xml +// * +// *************************************************************************** +zh_TW{ + Version{"1.2"} + collations{ + default{"stroke"} + } +} diff --git a/icuSources/data/coll/zh_TW_STROKE.txt b/icuSources/data/coll/zh_TW_STROKE.txt new file mode 100644 index 00000000..dff534fe --- /dev/null +++ b/icuSources/data/coll/zh_TW_STROKE.txt @@ -0,0 +1,13 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +zh_TW_STROKE{ + collations{ + default{"stroke"} + } +} diff --git a/icuSources/data/coll/zh__PINYIN.txt b/icuSources/data/coll/zh__PINYIN.txt new file mode 100644 index 00000000..a65cae15 --- /dev/null +++ b/icuSources/data/coll/zh__PINYIN.txt @@ -0,0 +1,13 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +zh__PINYIN{ + collations{ + default{"pinyin"} + } +} diff --git a/icuSources/data/icupkg.inc.in b/icuSources/data/icupkg.inc.in index 8cb1b67c..dbb4c218 100644 --- a/icuSources/data/icupkg.inc.in +++ b/icuSources/data/icupkg.inc.in @@ -1,6 +1,6 @@ #****************************************************************************** # -# Copyright (C) 2000, International Business Machines +# Copyright (C) 2000-2004, International Business Machines # Corporation and others. All Rights Reserved. # #****************************************************************************** @@ -17,9 +17,7 @@ include $(top_builddir)/icudefs.mk CPPFLAGS+= -I$(top_builddir)/common -I$(top_srcdir)/common LDFLAGS=@LDFLAGS@ -FFLAGS=@FFLAGS@ LIBS=@LIBS@ -ICULIBS=$(LIBS) -licu-uc -licu-i18n exec_prefix=@exec_prefix@ prefix=@prefix@ program_transform_name=@program_transform_name@ @@ -45,7 +43,7 @@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM=@INSTALL_PROGRAM@ INSTALL_SCRIPT=@INSTALL_SCRIPT@ INSTALL_DATA=@INSTALL_DATA@ -AUTOCONF=@AUTOCONF@ +MKINSTALLDIRS = $(SHELL) $(top_srcdir)/mkinstalldirs host=@host@ host_alias=@host_alias@ host_cpu=@host_cpu@ @@ -55,36 +53,14 @@ LIB_M=@LIB_M@ CPP=@CPP@ U_HAVE_INTTYPES_H=@U_HAVE_INTTYPES_H@ U_IS_BIG_ENDIAN=@U_IS_BIG_ENDIAN@ -HAVE_INT8_T=@HAVE_INT8_T@ -HAVE_UINT8_T=@HAVE_UINT8_T@ -HAVE_INT16_T=@HAVE_INT16_T@ -HAVE_UINT16_T=@HAVE_UINT16_T@ -HAVE_INT32_T=@HAVE_INT32_T@ -HAVE_UINT32_T=@HAVE_UINT32_T@ -HAVE_BOOL_T=@HAVE_BOOL_T@ -EXTRAS_TRUE=@EXTRAS_TRUE@ -EXTRAS_FALSE=@EXTRAS_FALSE@ -TESTS_TRUE=@TESTS_TRUE@ -TESTS_FALSE=@TESTS_FALSE@ -SAMPLES_TRUE=@SAMPLES_TRUE@ -SAMPLES_FALSE=@SAMPLES_FALSE@ platform=@platform@ ld_rpath_suf=@ld_rpath_suf@ -subdir = tools/tmp - ##### Add the following to source/config/Makefile.in -GENCCODE=$(top_builddir)/tools/genccode/genccode -GENCMN=$(top_builddir)/tools/gencmn/gencmn - -LPATHS=$(top_builddir)/common:$(top_builddir)/i18n:$(top_builddir)/tools/toolutil - -TOOL=env $(LDLIBRARYPATH_ENVVAR)=$(LPATHS) +GENCCODE=$(BINDIR)/genccode +GENCMN=$(BINDIR)/gencmn -ifeq ($(strip $(PLATFORM)),OS390) - TOOL= -endif diff --git a/icuSources/data/locales/af.txt b/icuSources/data/locales/af.txt index b5285146..da672be6 100644 --- a/icuSources/data/locales/af.txt +++ b/icuSources/data/locales/af.txt @@ -1,95 +1,241 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/af.xml // * // *************************************************************************** - -af { - Version { "3.0" } - - AmPmMarkers { - "VM", - "NM", +/** + * ICU source: ../../../locale/icu/main/af.xml + */ +af{ + Countries{ + AE{"Verenigde Arabiese Emirate"} + AF{"Afganistan"} + AG{"Antigua en Barbuda"} + AL{"Albanië"} + AM{"Armenië"} + AR{"Argentinië"} + AT{"Oostenryk"} + AU{"Australië"} + AZ{"Aserbeidjan"} + BA{"Bosnië en Herzegowina"} + BD{"Bangladesj"} + BE{"België"} + BF{"Boerkina Fasso"} + BG{"Bulgarye"} + BH{"Bahrein"} + BN{"Broenei"} + BO{"Bolivië"} + BR{"Brasilië"} + BT{"Bhoetan"} + BY{"Wit-Rusland"} + CA{"Kanada"} + CF{"Sentraal-Afrikaanse Republiek"} + CG{"Kongo"} + CH{"Switserland"} + CI{"Ivoorkus"} + CL{"Chili"} + CM{"Kameroen"} + CN{"Sjina"} + CU{"Kuba"} + CV{"Kaap Verde"} + CY{"Ciprus"} + CZ{"Tjeggiese Republiek"} + DE{"Duitsland"} + DJ{"Djiboeti"} + DK{"Denemarke"} + DO{"Dominikaanse Republiek"} + DZ{"Algerië"} + EE{"Estland"} + EG{"Egipte"} + EH{"Wes-Sahara"} + ES{"Spanje"} + ET{"Ethiopië"} + FJ{"Fidji"} + FM{"Mikronesië"} + FR{"Frankryk"} + GA{"Gaboen"} + GB{"Groot-Brittanje"} + GE{"Georgië"} + GM{"Gambië"} + GN{"Guinee"} + GQ{"Ekwatoriaal-Guinee"} + GR{"Griekeland"} + GW{"Guinee-Bissau"} + HR{"Kroasië"} + HT{"Haïti"} + HU{"Hongarye"} + ID{"Indonesië"} + IE{"Ierland"} + IN{"Indië"} + IQ{"Irak"} + IS{"Ysland"} + IT{"Italië"} + JM{"Jamaika"} + JO{"Jordanië"} + KE{"Kenia"} + KG{"Kirgisië"} + KH{"Kambodja"} + KM{"Comore"} + KN{"Saint Kitts en Nevis"} + KP{"Noord-Korea"} + KR{"Suid-Korea"} + KW{"Koeweit"} + KZ{"Kasakstan"} + LB{"Libanon"} + LR{"Liberië"} + LT{"Litaue"} + LU{"Luxemburg"} + LV{"Letland"} + LY{"Libië"} + MA{"Marokko"} + MG{"Madagaskar"} + MH{"Marshall-eilande"} + MK{"Macedonië"} + MN{"Mongolië"} + MR{"Mouritanië"} + MV{"Maldive"} + MX{"Meksiko"} + MY{"Maleisië"} + MZ{"Mosambiek"} + NA{"Namibië"} + NE{"Nigerië"} + NL{"Nederland"} + NO{"Noorweë"} + NR{"Naoeroe"} + NZ{"Nieu-Seeland"} + PG{"Papoea Nieu-Guinee"} + PH{"Filippyne"} + PL{"Pole"} + QA{"Katar"} + RO{"Roemenië"} + RU{"Rusland"} + SA{"Saoedi-Arabië"} + SB{"Solomon Eilande"} + SC{"Seychelle"} + SD{"Soedan"} + SE{"Swede"} + SG{"Singapoer"} + SI{"Slowenië"} + SK{"Slowakye"} + SO{"Somalië"} + SP{"Serwië"} + ST{"Sao Tome en Principe"} + SV{"Salvador"} + SY{"Sirië"} + TD{"Tsjaad"} + TJ{"Tadjikistan"} + TM{"Turkmenië"} + TN{"Tunisië"} + TR{"Turkye"} + TT{"Trinidad en Tobago"} + TZ{"Tanzanië"} + UA{"Oekraine"} + US{"Verenigde State van Amerika"} + UZ{"Oesbekistan"} + VA{"Vatikaan"} + VC{"Saint Vincent en die Grenadine"} + VN{"Viëtnam"} + YE{"Jemen"} + ZA{"Suid-Afrika"} + ZM{"Zambië"} } - DayAbbreviations { - "So", - "Ma", - "Di", - "Wo", - "Do", - "Vr", - "Sa", + Currencies{ + ZAR{ + "R", + "Rand", + } } - DayNames { - "Sondag", - "Maandag", - "Dinsdag", - "Woensdag", - "Donderdag", - "Vrydag", - "Saterdag", + ExemplarCharacters{"[a-záéèâêîôûëïöʼn]"} + Languages{ + af{"Afrikaans"} } - MonthAbbreviations { - "Jan", - "Feb", - "Mar", - "Apr", - "Mei", - "Jun", - "Jul", - "Aug", - "Sep", - "Okt", - "Nov", - "Des", + LocaleScript{ + "Latn", } - MonthNames { - "Januarie", - "Februarie", - "Maart", - "April", - "Mei", - "Junie", - "Julie", - "Augustus", - "September", - "Oktober", - "November", - "Desember", + NumberElements{ + ",", + " ", + ";", + "%", + "0", + "#", + "-", + "E", + "‰", + "∞", + "�", + "+", } - -// NumberElements { -// ".", -// ",", -// ";", -// "%", -// "0", -// "#", -// "-", -// "E", -// "\u2030", -// "\u221e", -// "\ufffd", -// } - LocaleID:int { 0x36 } - ExemplarCharacters { "[a-z \u00e1 \u00e9 \u00e8 \u00e2 \u00ea \u00ee \u00f4 \u00fb \u00eb \u00ef \u00f6]" } -// LocaleScript{ -// "Latn", // ISO 15924 Name -// } -// LocaleString{ "af" } - - // /**************** Info Below is needed ****************/ - // CollationElements{} - // Countries{} - // Eras{} - // Languages{} - // ShortLanguage { } - // localPatternChars{} - // - - // Currency display names - Currencies { - ZAR { "R", "ZAR" } + Version{"1.2"} + calendar{ + gregorian{ + AmPmMarkers{ + "vm.", + "nm.", + } + dayNames{ + format{ + abbreviated{ + "So", + "Ma", + "Di", + "Wo", + "Do", + "Vr", + "Sa", + } + wide{ + "Sondag", + "Maandag", + "Dinsdag", + "Woensdag", + "Donderdag", + "Vrydag", + "Saterdag", + } + } + } + eras{ + abbreviated{ + "v.C.", + "n.C.", + } + } + monthNames{ + format{ + abbreviated{ + "Jan", + "Feb", + "Mar", + "Apr", + "Mei", + "Jun", + "Jul", + "Aug", + "Sep", + "Okt", + "Nov", + "Des", + } + wide{ + "Januarie", + "Februarie", + "Maart", + "April", + "Mei", + "Junie", + "Julie", + "Augustus", + "September", + "Oktober", + "November", + "Desember", + } + } + } + } } } diff --git a/icuSources/data/locales/af_ZA.txt b/icuSources/data/locales/af_ZA.txt index ae98b60a..0f6d11f3 100644 --- a/icuSources/data/locales/af_ZA.txt +++ b/icuSources/data/locales/af_ZA.txt @@ -1,31 +1,32 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/af_ZA.xml // * // *************************************************************************** - -af_ZA { - Version { "2.0" } - - DateTimePatterns { - "h:mm:ss a", - "h:mm:ss a", - "h:mm:ss a", - "h:mm a", - "EEEE dd MMMM yyyy", - "dd MMMM yyyy", - "dd MMM yyyy", - "yyyy/MM/dd", - "{1} {0}", - } - NumberPatterns { +af_ZA{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "\u00a4#,##0.00;-\u00a4#,##0.00", + "¤#,##0.00;-¤#,##0.00", "#,##0%", "#E0", } - LocaleID:int { 0x0436 } -// LocaleString { "af_ZA" } -// ShortCountry{ "ZAK" } + Version{"1.2"} + calendar{ + gregorian{ + DateTimePatterns{ + "h:mm:ss a", + "h:mm:ss a", + "h:mm:ss a", + "h:mm a", + "EEEE dd MMMM yyyy", + "dd MMMM yyyy", + "dd MMM yyyy", + "yyyy/MM/dd", + "{1} {0}", + } + } + } } diff --git a/icuSources/data/locales/am.txt b/icuSources/data/locales/am.txt index a5f52cca..2ab50a94 100644 --- a/icuSources/data/locales/am.txt +++ b/icuSources/data/locales/am.txt @@ -1,348 +1,360 @@ -// *************************************************************************** -// * -// * Copyright (C) 2001-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** -// * Amharic language. -// * Contributed by Daniel Yacob , Ge'ez Frontier Foundation - -am { - Version{ "2.0" } - DayAbbreviations { - "\u12A5\u1211\u12F5", - "\u1230\u129E", - "\u121B\u12AD\u1230", - "\u1228\u1261\u12D5", - "\u1210\u1219\u1235", - "\u12D3\u122D\u1265", - "\u1245\u12F3\u121C", - } - DayNames { - "\u12A5\u1211\u12F5", - "\u1230\u129E", - "\u121B\u12AD\u1230\u129E", - "\u1228\u1261\u12D5", - "\u1210\u1219\u1235", - "\u12D3\u122D\u1265", - "\u1245\u12F3\u121C", - } -// LanguageLibraryUse { "amh" } - MonthAbbreviations { - "\u1303\u1295\u12E9", - "\u134C\u1265\u1229", - "\u121B\u122D\u127D", - "\u12A4\u1355\u1228", - "\u121C\u12ED", - "\u1301\u1295", - "\u1301\u120B\u12ED", - "\u12A6\u1308\u1235", - "\u1234\u1355\u1274", - "\u12A6\u12AD\u1270", - "\u1296\u126C\u121D", - "\u12F2\u1234\u121D", - } - MonthNames { - "\u1303\u1295\u12E9\u12C8\u122A", - "\u134C\u1265\u1229\u12C8\u122A", - "\u121B\u122D\u127D", - "\u12A4\u1355\u1228\u120D", - "\u121C\u12ED", - "\u1301\u1295", - "\u1301\u120B\u12ED", - "\u12A6\u1308\u1235\u1275", - "\u1234\u1355\u1274\u121D\u1260\u122D", - "\u12A6\u12AD\u1270\u12CD\u1260\u122D", - "\u1296\u126C\u121D\u1260\u122D", - "\u12F2\u1234\u121D\u1260\u122D", - } - LocaleScript { - "Ethi", - } - ExemplarCharacters{"[:Ethi:]"} - DateTimeElements:intvector { - 7, - 1, - } - Eras { - "\u12D3/\u12D3", - "\u12D3/\u121D" - } - Languages { - aa { "\u12A0\u134B\u122D\u129B" } - ab { "\u12A0\u1265\u1210\u12DA\u129B" } - af { "\u12A0\u134D\u122A\u1243\u1295\u1235\u129B" } - am { "\u12A0\u121B\u122D\u129B" } - ar { "\u12D0\u122D\u1262\u129B" } - as { "\u12A0\u1233\u121C\u12DB\u12CA" } - ay { "\u12A0\u12EB\u121B\u122D\u129B" } - az { "\u12A0\u12DC\u122D\u1263\u12ED\u1303\u1295\u129B" } - ba { "\u1263\u1235\u12AA\u122D\u129B" } - be { "\u1264\u120B\u122B\u123B\u129B" } - bg { "\u1261\u120D\u130B\u122A\u129B" } - bh { "\u1262\u1203\u122A" } - bi { "\u1262\u1235\u120B\u121D\u129B" } - bn { "\u1260\u1295\u130B\u120A\u129B" } - bo { "\u1275\u1260\u1275\u1295\u129B" } - br { "\u1265\u122C\u1276\u1295\u129B" } - ca { "\u12AB\u1273\u120B\u1295\u129B" } - co { "\u12AE\u122D\u1232\u12AB\u129B" } - cs { "\u127C\u12AD\u129B" } - cy { "\u12C8\u120D\u123D" } - da { "\u12F4\u1292\u123D" } - de { "\u1300\u122D\u1218\u1295" } - dz { "\u12F5\u12DE\u1295\u130D\u12BB\u129B" } - el { "\u130D\u122A\u12AD\u129B" } - en { "\u12A5\u1295\u130D\u120A\u12DD\u129B" } - eo { "\u12A4\u1235\u1350\u122B\u1295\u1276" } - es { "\u1235\u1353\u1292\u123D" } - et { "\u12A4\u1235\u1276\u1292\u12A0\u1295" } - eu { "\u1263\u1235\u12AD\u129B" } - fa { "\u1350\u122D\u1232\u12EB\u129B" } - fi { "\u134A\u1292\u123D" } - fj { "\u134A\u1302\u129B" } - fo { "\u134B\u122E\u129B" } - fr { "\u1348\u1228\u1295\u1233\u12ED\u129B" } - fy { "\u134D\u122A\u1235\u129B" } - ga { "\u12A0\u12ED\u122A\u123D" } - gd { "\u12A5\u1235\u12AE\u1275\u1235 \u130C\u120D\u12AD\u129B" } - gl { "\u130B\u1208\u130B\u129B" } - gn { "\u1313\u122B\u1292\u129B" } - gu { "\u1309\u1303\u122D\u1272\u129B" } - ha { "\u1203\u12CD\u1233\u129B" } - he { "\u12D5\u1265\u122B\u1235\u1325" } - hi { "\u1210\u1295\u12F5\u129B" } - hr { "\u12AD\u122E\u123D\u12EB\u1295\u129B" } - hu { "\u1200\u1295\u130B\u122A\u129B" } - hy { "\u12A0\u122D\u1218\u1293\u12CA" } - ia { "\u12A2\u1295\u1274\u122D\u120A\u1295\u1313" } - id { "\u12A5\u1295\u12F6\u1292\u1232\u129B" } - ie { "\u12A5\u1295\u1270\u122D\u120A\u1295\u130D\u12C8" } - ik { "\u12A5\u1291\u1352\u12EB\u1245\u129B" } - is { "\u12A0\u12ED\u1235\u120B\u1295\u12F5\u129B" } - it { "\u1323\u120A\u12EB\u1295\u129B" } - iu { "\u12A5\u1291\u12AD\u1272\u1271\u1275\u129B" } - ja { "\u1303\u1353\u1295\u129B" } - jv { "\u1303\u126B\u1295\u129B" } - ka { "\u130A\u12EE\u122D\u130A\u12EB\u1295" } - kk { "\u12AB\u12DB\u12AD\u129B" } - kl { "\u12AB\u120B\u120A\u1231\u1275\u129B" } - km { "\u12AD\u1218\u122D\u129B" } - kn { "\u12AB\u1293\u12F3\u129B" } - ko { "\u12AE\u122A\u12EB\u129B" } - ks { "\u12AB\u123D\u121A\u122D\u129B" } - ku { "\u12A9\u122D\u12F5\u123D\u129B" } - ky { "\u12AA\u122D\u130A\u12DD\u129B" } - la { "\u120B\u1272\u1295\u129B" } - ln { "\u120A\u1295\u130B\u120B\u129B" } - lo { "\u120B\u12CD\u1235\u129B" } - lt { "\u120A\u1271\u12A0\u1292\u12EB\u1295" } - lv { "\u120B\u1275\u126A\u12EB\u1295" } - mg { "\u121B\u120B\u130B\u1235\u129B" } - mi { "\u121B\u12EE\u122A\u129B" } - mk { "\u121B\u12A8\u12F6\u1292\u129B" } - ml { "\u121B\u120B\u12EB\u120B\u121D\u129B" } - mn { "\u121E\u1295\u130E\u120B\u12CA\u129B" } - mo { "\u121E\u120D\u12F3\u126B\u12CA\u1293" } - mr { "\u121B\u122B\u12DA\u129B" } - ms { "\u121B\u120B\u12ED\u129B" } - mt { "\u121B\u120D\u1272\u1235\u129B" } - my { "\u1261\u122D\u121B\u129B" } - na { "\u1293\u12A1\u1229" } - ne { "\u1294\u1353\u120A\u129B" } - nl { "\u12F0\u127D" } - no { "\u1296\u122D\u12CC\u1302\u12EB\u1295" } - oc { "\u12A6\u12AA\u1273\u1295\u129B" } - om { "\u12A6\u122E\u121D\u129B" } - or { "\u12A6\u122A\u12EB\u129B" } - pa { "\u1353\u1295\u1303\u1262\u129B" } - pl { "\u1356\u120A\u123D" } - ps { "\u1351\u123D\u1276\u129B" } - pt { "\u1356\u122D\u1271\u130B\u120A\u129B" } - qu { "\u12B5\u127F\u129B" } - rm { "\u122E\u121B\u1295\u1235"} - rn { "\u1229\u1295\u12F2\u129B" } - ro { "\u122E\u121B\u1292\u12EB\u1295" } - ru { "\u122B\u123D\u129B" } - rw { "\u12AA\u1295\u12EB\u122D\u12CB\u1295\u12F5\u129B" } - sa { "\u1233\u1295\u1235\u12AD\u122A\u1275\u129B" } - sd { "\u1232\u1295\u12F5\u1202\u129B" } - sg { "\u1233\u1295\u130E\u129B" } - sh { "\u0073\u0068"} - si { "\u1235\u1295\u1203\u120D\u129B" } - sk { "\u1235\u120E\u126B\u12AD\u129B" } - sl { "\u1235\u120E\u126A\u129B" } - sm { "\u1233\u121E\u12A0\u129B" } - sn { "\u123E\u1293\u129B" } - so { "\u1231\u121B\u120D\u129B" } - sq { "\u120D\u1264\u1292\u129B" } - sr { "\u1230\u122D\u1262\u129B" } - ss { "\u1235\u12CB\u1272\u129B" } - st { "\u1236\u12DE\u129B" } - su { "\u1231\u12F3\u1295\u129B" } - sv { "\u1235\u12CA\u12F5\u1295\u129B" } - sw { "\u1235\u12CB\u1202\u120A\u129B" } - ta { "\u1273\u121A\u120D\u129B" } - te { "\u1270\u1209\u1309\u129B" } - tg { "\u1273\u1302\u12AA\u129B" } - th { "\u1273\u12ED\u129B" } - ti { "\u1275\u130D\u122D\u129B" } - tk { "\u1271\u122D\u12AD\u1218\u1295\u129B" } - tl { "\u1273\u130B\u120E\u1308\u129B" } - tn { "\u133D\u12CB\u1293\u12CA\u129B" } - to { "\u1276\u1295\u130B" } - tr { "\u1271\u122D\u12AD\u129B" } - ts { "\u133E\u1295\u130B\u129B" } - tt { "\u1273\u1273\u122D\u129B" } - tw { "\u1275\u12CA\u129B" } - ug { "\u12A1\u12CA\u130D\u1201\u122D\u129B" } - uk { "\u12E9\u12AD\u1228\u1292\u129B" } - ur { "\u12A1\u122D\u12F1\u129B" } - uz { "\u12A1\u12DD\u1260\u12AD\u129B" } - vi { "\u126A\u1275\u1293\u121D\u129B" } - vo { "\u126E\u120B\u1351\u12AD\u129B" } - wo { "\u12CE\u120E\u134D\u129B" } - xh { "\u12DE\u1233\u129B" } - yi { "\u12ED\u12F2\u123B\u12CA\u129B" } - yo { "\u12EE\u1229\u1263\u12CA\u129B" } - za { "\u12E1\u12CB\u1295\u130D\u129B" } - zh { "\u127B\u12ED\u1295\u129B" } - zu { "\u12D9\u1209\u129B" } - gez { "\u130D\u12D5\u12DD\u129B" } - tig { "\u1275\u130D\u1228" } - sid { "\u1232\u12F3\u121D\u129B" } - } - Countries { - AD { "\u12A0\u1295\u12F6\u122B" } - AE { "\u12E8\u1270\u1263\u1260\u1229\u1275 \u12A0\u1228\u1265 \u12A4\u121D\u122C\u1275\u1235" } - AL { "\u12A0\u120D\u1263\u1292\u12EB" } - AM { "\u12A0\u122D\u121C\u1292\u12EB" } - AN { "\u1294\u12D8\u122D\u120B\u1295\u12F5\u1235 \u12A0\u1295\u1272\u120D\u1235" } - AR { "\u12A0\u122D\u1300\u1295\u1272\u1293" } - AT { "\u12A6\u1235\u1275\u122A\u12EB" } - AU { "\u12A0\u12CD\u1235\u1275\u122C\u120A\u12EB" } - AZ { "\u12A0\u12D8\u122D\u1263\u1303\u1295" } - BA { "\u1266\u1235\u1292\u12EB \u12A5\u1293 \u1204\u122D\u12DE\u130E\u126A\u1292\u12EB" } - BB { "\u1263\u122D\u1264\u12F6\u1235" } - BE { "\u1264\u120D\u1304\u121D" } - BG { "\u1261\u120D\u130C\u122A\u12EB" } - BH { "\u1263\u1205\u122C\u1295" } - BM { "\u1264\u122D\u1219\u12F3" } - BO { "\u1266\u120A\u126A\u12EB" } - BR { "\u1265\u122B\u12DA\u120D" } - BT { "\u1261\u1205\u1273\u1295" } - BY { "\u1264\u120B\u1229\u1235" } - BZ { "\u1264\u120A\u12D8" } - CD { "\u12AE\u1295\u130E" } - CF { "\u12E8\u1218\u12AB\u12A8\u1208\u129B\u12CD \u12A0\u134D\u122A\u12AB \u122A\u1350\u1265\u120A\u12AD" } - CH { "\u1235\u12CA\u12D8\u122D\u120B\u1295\u12F5" } - CL { "\u127A\u120A" } - CM { "\u12AB\u121C\u1229\u1295" } - CN { "\u127B\u12ED\u1293" } - CO { "\u12AE\u120E\u121D\u1262\u12EB" } - CV { "\u12AC\u1355 \u126C\u122D\u12F4" } - CY { "\u1233\u12ED\u1355\u1228\u1235" } - CZ { "\u127C\u12AD \u122A\u1351\u1265\u120A\u12AD" } - DE { "\u1300\u122D\u1218\u1295" } - DK { "\u12F4\u1295\u121B\u122D\u12AD" } - DM { "\u12F6\u121A\u1292\u12AB" } - DO { "\u12F6\u121A\u1292\u12AD \u122A\u1351\u1265\u120A\u12AD" } - DZ { "\u12A0\u120D\u1304\u122A\u12EB" } - EC { "\u12A2\u12B3\u12F6\u122D" } - EE { "\u12A4\u1235\u1276\u1292\u12EB" } - EG { "\u130D\u1265\u133D" } - EH { "\u121D\u12D5\u122B\u1263\u12CA \u1233\u1205\u122B" } - ER { "\u12A4\u122D\u1275\u122B" } - ES { "\u1235\u1354\u1295" } - ET { "\u12A2\u1275\u12EE\u1335\u12EB" } - FI { "\u134A\u1295\u120B\u1295\u12F5" } - FJ { "\u134A\u1302" } - FM { "\u121A\u12AD\u122E\u1294\u12E2\u12EB" } - GB { "\u12A5\u1295\u130D\u120A\u12DD" } - GE { "\u1306\u122D\u1302\u12EB" } - GF { "\u12E8\u1348\u1228\u1295\u1233\u12ED \u1309\u12CA\u12A0\u1293" } - GM { "\u130B\u121D\u1262\u12EB" } - GN { "\u130A\u1292" } - GQ { "\u12A2\u12B3\u1276\u122A\u12EB\u120D \u130A\u1292" } - GR { "\u130D\u122A\u12AD" } - GW { "\u1262\u1233\u12CE"} - GY { "\u1309\u12EB\u1293" } - HK { "\u1206\u1295\u130D \u12AE\u1295\u130D" } - HR { "\u12AD\u122E\u12A4\u123D\u12EB" } - HT { "\u1200\u12ED\u1272" } - HU { "\u1200\u1295\u130B\u122A" } - ID { "\u12A2\u1295\u12F6\u1294\u12E2\u12EB" } - IE { "\u12A0\u12E8\u122D\u120B\u1295\u12F5" } - IL { "\u12A5\u1235\u122B\u12A4\u120D" } - IN { "\u1205\u1295\u12F5" } - IQ { "\u12A2\u122B\u1245" } - IS { "\u12A0\u12ED\u1235\u120B\u1295\u12F5" } - IT { "\u1323\u120A\u12EB\u1295" } - JM { "\u1303\u121B\u12ED\u12AB" } - JO { "\u1306\u122D\u12F3\u1295" } - JP { "\u1303\u1353\u1295" } - KH { "\u12AB\u121D\u1266\u12F2\u12EB" } - KM { "\u12AE\u121E\u122E\u1235" } - KP { "\u12F0\u1261\u1265 \u12AE\u122A\u12EB" } - KR { "\u1230\u121C\u1295 \u12AE\u122A\u12EB" } - KW { "\u12AD\u12CC\u1275" } - LB { "\u120A\u1263\u1296\u1235" } - LT { "\u120A\u1271\u12CC\u1292\u12EB" } - LV { "\u120B\u1275\u126A\u12EB" } - LY { "\u120A\u1262\u12EB" } - MA { "\u121E\u122E\u12AE" } - MD { "\u121E\u120D\u12F6\u126B" } - MK { "\u121B\u12A8\u12F6\u1292\u12EB" } - MN { "\u121E\u1295\u130E\u120A\u12EB" } - MO { "\u121B\u12AB\u12CE" } - MR { "\u121E\u122A\u1274\u1292\u12EB" } - MT { "\u121B\u120D\u1273" } - MU { "\u121B\u1229\u1238\u1235" } - MX { "\u121C\u12AD\u1232\u12AE" } - MY { "\u121B\u120C\u12E2\u12EB" } - NA { "\u1293\u121A\u1262\u12EB" } - NC { "\u1292\u12CD \u12AB\u120C\u12F6\u1292\u12EB" } - NG { "\u1293\u12ED\u1304\u122A\u12EB" } - NL { "\u1294\u12D8\u122D\u120B\u1295\u12F5" } - NO { "\u1296\u122D\u12CC" } - NP { "\u1294\u1353\u120D" } - NZ { "\u1292\u12CD \u12DA\u120B\u1295\u12F5" } - PE { "\u1354\u1229" } - PF { "\u12E8\u1348\u1228\u1295\u1233\u12ED \u1356\u120A\u1294\u12E2\u12EB" } - PG { "\u1353\u1351\u12CB \u1292\u12CD \u130A\u1292" } - PL { "\u1356\u120B\u1295\u12F5" } - PR { "\u1356\u122D\u1273 \u122A\u12AE" } - RO { "\u122E\u121C\u1292\u12EB" } - RU { "\u122B\u123A\u12EB" } - SA { "\u1233\u12CD\u12F5\u12A0\u1228\u1262\u12EB" } - SD { "\u1231\u12F3\u1295" } - SE { "\u1235\u12CA\u12F5\u1295" } - SG { "\u1232\u1295\u130B\u1356\u122D" } - SI { "\u1235\u120E\u126C\u1292\u12EB" } - SK { "\u1235\u120E\u126B\u12AA\u12EB" } - SN { "\u1234\u1294\u130B\u120D" } - SO { "\u1231\u121B\u120C" } - SP { "\u1230\u122D\u1262\u12EB" } - SY { "\u1232\u122A\u12EB" } - TD { "\u127B\u12F5" } - TF { "\u12E8\u1348\u1228\u1295\u1233\u12ED \u12F0\u1261\u1263\u12CA \u130D\u12DB\u1276\u127D" } - TH { "\u1273\u12ED\u120B\u1295\u12F5" } - TJ { "\u1273\u1303\u12AA\u1235\u1273\u1295" } - TL { "\u121D\u1235\u122B\u1245 \u1272\u121E\u122D" } - TN { "\u1271\u1292\u12DA\u12EB" } - TR { "\u1271\u122D\u12AD" } - TT { "\u1275\u122A\u1292\u12F3\u12F5 \u12A5\u1293 \u1276\u1263\u130E" } - TZ { "\u1273\u1295\u12DB\u1292\u12EB" } - UG { "\u12E9\u130B\u1295\u12F3" } - US { "\u12A0\u121C\u122A\u12AB" } - UZ { "\u12E9\u12DD\u1260\u12AA\u1235\u1273\u1295" } - VE { "\u126C\u1295\u12D9\u12CC\u120B" } - VG { "\u12E8\u12A5\u1295\u130D\u120A\u12DD \u12F5\u1295\u130D\u120D \u12F0\u1234\u1276\u127D" } - VI { "\u12E8\u12A0\u121C\u122A\u12AB \u1268\u122D\u1302\u1295 \u12F0\u1234\u1276\u127D" } - YE { "\u12E8\u1218\u1295" } - YU { "\u12E9\u130E\u12DD\u120B\u126A\u12EB" } - ZA { "\u12F0\u1261\u1265 \u12A0\u134D\u122A\u12AB" } - ZM { "\u12DB\u121D\u1262\u12EB" } - - } -} +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/am.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/am.xml + */ +am{ + Countries{ + AD{"አንዶራ"} + AE{"የተባበሩት አረብ ኤምሬትስ"} + AL{"አልባኒያ"} + AM{"አርሜኒያ"} + AN{"ኔዘርላንድስ አንቲልስ"} + AR{"አርጀንቲና"} + AT{"ኦስትሪያ"} + AU{"አውስትሬሊያ"} + AZ{"አዘርባጃን"} + BA{"ቦስኒያ እና ሄርዞጎቪኒያ"} + BB{"ባርቤዶስ"} + BE{"ቤልጄም"} + BG{"ቡልጌሪያ"} + BH{"ባህሬን"} + BM{"ቤርሙዳ"} + BO{"ቦሊቪያ"} + BR{"ብራዚል"} + BT{"ቡህታን"} + BY{"ቤላሩስ"} + BZ{"ቤሊዘ"} + CD{"ኮንጎ"} + CF{"የመካከለኛው አፍሪካ ሪፐብሊክ"} + CH{"ስዊዘርላንድ"} + CL{"ቺሊ"} + CM{"ካሜሩን"} + CN{"ቻይና"} + CO{"ኮሎምቢያ"} + CV{"ኬፕ ቬርዴ"} + CY{"ሳይፕረስ"} + CZ{"ቼክ ሪፑብሊክ"} + DE{"ጀርመን"} + DK{"ዴንማርክ"} + DM{"ዶሚኒካ"} + DO{"ዶሚኒክ ሪፑብሊክ"} + DZ{"አልጄሪያ"} + EC{"ኢኳዶር"} + EE{"ኤስቶኒያ"} + EG{"ግብጽ"} + EH{"ምዕራባዊ ሳህራ"} + ER{"ኤርትራ"} + ES{"ስፔን"} + ET{"ኢትዮጵያ"} + FI{"ፊንላንድ"} + FJ{"ፊጂ"} + FM{"ሚክሮኔዢያ"} + GB{"እንግሊዝ"} + GE{"ጆርጂያ"} + GF{"የፈረንሳይ ጉዊአና"} + GM{"ጋምቢያ"} + GN{"ጊኒ"} + GQ{"ኢኳቶሪያል ጊኒ"} + GR{"ግሪክ"} + GW{"ቢሳዎ"} + GY{"ጉያና"} + HR{"ክሮኤሽያ"} + HT{"ሀይቲ"} + HU{"ሀንጋሪ"} + ID{"ኢንዶኔዢያ"} + IE{"አየርላንድ"} + IL{"እስራኤል"} + IN{"ህንድ"} + IQ{"ኢራቅ"} + IS{"አይስላንድ"} + IT{"ጣሊያን"} + JM{"ጃማይካ"} + JO{"ጆርዳን"} + JP{"ጃፓን"} + KH{"ካምቦዲያ"} + KM{"ኮሞሮስ"} + KP{"ደቡብ ኮሪያ"} + KR{"ሰሜን ኮሪያ"} + KW{"ክዌት"} + LB{"ሊባኖስ"} + LT{"ሊቱዌኒያ"} + LV{"ላትቪያ"} + LY{"ሊቢያ"} + MA{"ሞሮኮ"} + MD{"ሞልዶቫ"} + MK{"ማከዶኒያ"} + MN{"ሞንጎሊያ"} + MR{"ሞሪቴኒያ"} + MT{"ማልታ"} + MU{"ማሩሸስ"} + MX{"ሜክሲኮ"} + MY{"ማሌዢያ"} + NA{"ናሚቢያ"} + NC{"ኒው ካሌዶኒያ"} + NG{"ናይጄሪያ"} + NL{"ኔዘርላንድ"} + NO{"ኖርዌ"} + NP{"ኔፓል"} + NZ{"ኒው ዚላንድ"} + PE{"ፔሩ"} + PF{"የፈረንሳይ ፖሊኔዢያ"} + PG{"ፓፑዋ ኒው ጊኒ"} + PL{"ፖላንድ"} + PR{"ፖርታ ሪኮ"} + RO{"ሮሜኒያ"} + RU{"ራሺያ"} + SA{"ሳውድአረቢያ"} + SD{"ሱዳን"} + SE{"ስዊድን"} + SG{"ሲንጋፖር"} + SI{"ስሎቬኒያ"} + SK{"ስሎቫኪያ"} + SN{"ሴኔጋል"} + SO{"ሱማሌ"} + SP{"ሰርቢያ"} + SY{"ሲሪያ"} + TD{"ቻድ"} + TF{"የፈረንሳይ ደቡባዊ ግዛቶች"} + TH{"ታይላንድ"} + TJ{"ታጃኪስታን"} + TL{"ምስራቅ ቲሞር"} + TN{"ቱኒዚያ"} + TR{"ቱርክ"} + TT{"ትሪኒዳድ እና ቶባጎ"} + TZ{"ታንዛኒያ"} + UG{"ዩጋንዳ"} + US{"አሜሪካ"} + UZ{"ዩዝበኪስታን"} + VE{"ቬንዙዌላ"} + VG{"የእንግሊዝ ድንግል ደሴቶች"} + VI{"የአሜሪካ ቨርጂን ደሴቶች"} + YE{"የመን"} + YU{"ዩጎዝላቪያ"} + ZA{"ደቡብ አፍሪካ"} + ZM{"ዛምቢያ"} + } + ExemplarCharacters{"[:Ethi:]"} + Languages{ + aa{"አፋርኛ"} + ab{"አብሐዚኛ"} + af{"አፍሪቃንስኛ"} + am{"አማርኛ"} + ar{"ዐርቢኛ"} + as{"አሳሜዛዊ"} + ay{"አያማርኛ"} + az{"አዜርባይጃንኛ"} + ba{"ባስኪርኛ"} + be{"ቤላራሻኛ"} + bg{"ቡልጋሪኛ"} + bh{"ቢሃሪ"} + bi{"ቢስላምኛ"} + bn{"በንጋሊኛ"} + bo{"ትበትንኛ"} + br{"ብሬቶንኛ"} + byn{"ብሊን"} + ca{"ካታላንኛ"} + co{"ኮርሲካኛ"} + cs{"ቼክኛ"} + cy{"ወልሽ"} + da{"ዴኒሽ"} + de{"ጀርመን"} + dz{"ድዞንግኻኛ"} + el{"ግሪክኛ"} + en{"እንግሊዝኛ"} + eo{"ኤስፐራንቶ"} + es{"ስፓኒሽ"} + et{"ኤስቶኒአን"} + eu{"ባስክኛ"} + fa{"ፐርሲያኛ"} + fi{"ፊኒሽ"} + fj{"ፊጂኛ"} + fo{"ፋሮኛ"} + fr{"ፈረንሳይኛ"} + fy{"ፍሪስኛ"} + ga{"አይሪሽ"} + gd{"እስኮትስ ጌልክኛ"} + gez{"ግዕዝኛ"} + gl{"ጋለጋኛ"} + gn{"ጓራኒኛ"} + gu{"ጉጃርቲኛ"} + ha{"ሃውሳኛ"} + he{"ዕብራስጥ"} + hi{"ሐንድኛ"} + hr{"ክሮሽያንኛ"} + hu{"ሀንጋሪኛ"} + hy{"አርመናዊ"} + ia{"ኢንቴርሊንጓ"} + id{"እንዶኒሲኛ"} + ie{"እንተርሊንግወ"} + ik{"እኑፒያቅኛ"} + is{"አይስላንድኛ"} + it{"ጣሊያንኛ"} + iu{"እኑክቲቱትኛ"} + ja{"ጃፓንኛ"} + jv{"ጃቫንኛ"} + ka{"ጊዮርጊያን"} + kk{"ካዛክኛ"} + kl{"ካላሊሱትኛ"} + km{"ክመርኛ"} + kn{"ካናዳኛ"} + ko{"ኮሪያኛ"} + ks{"ካሽሚርኛ"} + ku{"ኩርድሽኛ"} + ky{"ኪርጊዝኛ"} + la{"ላቲንኛ"} + ln{"ሊንጋላኛ"} + lo{"ላውስኛ"} + lt{"ሊቱአኒያን"} + lv{"ላትቪያን"} + mg{"ማላጋስኛ"} + mi{"ማዮሪኛ"} + mk{"ማከዶኒኛ"} + ml{"ማላያላምኛ"} + mn{"ሞንጎላዊኛ"} + mo{"ሞልዳቫዊና"} + mr{"ማራዚኛ"} + ms{"ማላይኛ"} + mt{"ማልቲስኛ"} + my{"ቡርማኛ"} + na{"ናኡሩ"} + ne{"ኔፓሊኛ"} + nl{"ደች"} + no{"ኖርዌጂያን"} + oc{"ኦኪታንኛ"} + om{"ኦሮምኛ"} + or{"ኦሪያኛ"} + pa{"ፓንጃቢኛ"} + pl{"ፖሊሽ"} + ps{"ፑሽቶኛ"} + pt{"ፖርቱጋሊኛ"} + qu{"ኵቿኛ"} + rm{"ሮማንስ"} + rn{"ሩንዲኛ"} + ro{"ሮማኒያን"} + ru{"ራሽኛ"} + rw{"ኪንያርዋንድኛ"} + sa{"ሳንስክሪትኛ"} + sd{"ሲንድሂኛ"} + sg{"ሳንጎኛ"} + si{"ስንሃልኛ"} + sid{"ሲዳምኛ"} + sk{"ስሎቫክኛ"} + sl{"ስሎቪኛ"} + sm{"ሳሞአኛ"} + sn{"ሾናኛ"} + so{"ሱማልኛ"} + sq{"ልቤኒኛ"} + sr{"ሰርቢኛ"} + ss{"ስዋቲኛ"} + st{"ሶዞኛ"} + su{"ሱዳንኛ"} + sv{"ስዊድንኛ"} + sw{"ስዋሂሊኛ"} + ta{"ታሚልኛ"} + te{"ተሉጉኛ"} + tg{"ታጂኪኛ"} + th{"ታይኛ"} + ti{"ትግርኛ"} + tig{"ትግረ"} + tk{"ቱርክመንኛ"} + tl{"ታጋሎገኛ"} + tn{"ጽዋናዊኛ"} + to{"ቶንጋ"} + tr{"ቱርክኛ"} + ts{"ጾንጋኛ"} + tt{"ታታርኛ"} + tw{"ትዊኛ"} + ug{"ኡዊግሁርኛ"} + uk{"ዩክረኒኛ"} + ur{"ኡርዱኛ"} + uz{"ኡዝበክኛ"} + vi{"ቪትናምኛ"} + vo{"ቮላፑክኛ"} + wo{"ዎሎፍኛ"} + xh{"ዞሳኛ"} + yi{"ይዲሻዊኛ"} + yo{"ዮሩባዊኛ"} + za{"ዡዋንግኛ"} + zh{"ቻይንኛ"} + zu{"ዙሉኛ"} + } + LocaleScript{ + "Ethi", + } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 7, + 1, + } + dayNames{ + format{ + abbreviated{ + "እሑድ", + "ሰኞ", + "ማክሰ", + "ረቡዕ", + "ሐሙስ", + "ዓርብ", + "ቅዳሜ", + } + wide{ + "እሑድ", + "ሰኞ", + "ማክሰኞ", + "ረቡዕ", + "ሐሙስ", + "ዓርብ", + "ቅዳሜ", + } + } + } + eras{ + abbreviated{ + "ዓ/ዓ", + "ዓ/ም", + } + } + monthNames{ + format{ + abbreviated{ + "ጃንዩ", + "ፌብሩ", + "ማርች", + "ኤፕረ", + "ሜይ", + "ጁን", + "ጁላይ", + "ኦገስ", + "ሴፕቴ", + "ኦክተ", + "ኖቬም", + "ዲሴም", + } + wide{ + "ጃንዩወሪ", + "ፌብሩወሪ", + "ማርች", + "ኤፕረል", + "ሜይ", + "ጁን", + "ጁላይ", + "ኦገስት", + "ሴፕቴምበር", + "ኦክተውበር", + "ኖቬምበር", + "ዲሴምበር", + } + } + } + } + } +} diff --git a/icuSources/data/locales/am_ET.txt b/icuSources/data/locales/am_ET.txt index a64d773f..7a5e01a7 100644 --- a/icuSources/data/locales/am_ET.txt +++ b/icuSources/data/locales/am_ET.txt @@ -1,57 +1,46 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 2001-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/am_ET.xml // * // *************************************************************************** -// * Amharic language locale for Ethiopia. -// * Contributed by Daniel Yacob , Ge'ez Frontier Foundation - -am_ET { - Version{ "2.0" } - AmPmMarkers { - "\u1321\u12CB\u1275", - "\u12A8\u1233\u12D3\u1275", - } - DateTimePatterns { - "hh:mm:ss a", - "hh:mm:ss a", - "h:mm:ss a", - "h:mm a", - "EEEE\u1363 dd MMMM \u1240\u1295 yyyy G", - "dd MMMM yyyy", - "dd-MMM-yy", - "dd/MM/yy", - "{1} {0}", +am_ET{ + Currencies{ + ETB{ + "$", + "ETB", + } + USD{ + "US$", + "USD", + } } - // Measurement { "Metric" } -// NumberElements { -// ".", -// ",", -// ";", -// "%", -// "0", -// "#", -// "-", -// "E", -// "\u2030", -// "\u221E", -// "\uFFFD", -// } - NumberPatterns { + NumberPatterns{ "#,##0.###;-#,##0.###", - "\u00A4#,##0.00;-\u00A4#,##0.00", + "¤#,##0.00;-¤#,##0.00", "#,##0%", "#E0", } - // PaperSize { - // Height { "297" } - // Width { "210" } - // Units { "mm" } - // } - - // Currency display names - Currencies { - ETB { "$", "ETB" } + Version{"1.2"} + calendar{ + gregorian{ + AmPmMarkers{ + "ጡዋት", + "ከሳዓት", + } + DateTimePatterns{ + "hh:mm:ss a", + "hh:mm:ss a", + "h:mm:ss a", + "h:mm a", + "EEEE፣ dd MMMM ቀን yyyy G", + "dd MMMM yyyy", + "dd-MMM-yy", + "dd/MM/yy", + "{1} {0}", + } + } } - } +} diff --git a/icuSources/data/locales/ar.txt b/icuSources/data/locales/ar.txt index 6b20fe38..8cd7c964 100644 --- a/icuSources/data/locales/ar.txt +++ b/icuSources/data/locales/ar.txt @@ -1,182 +1,577 @@ -// **************************************************************************** -// * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -ar { - Version{"2.0"} - AmPmMarkers { - "\u0635", - "\u0645", - } - CollationElements { - Version { "2.0" } - Sequence { "[normalization on]& Z < \u0621<< \u0622<< \u0623<< \u0624<< \u0625<< \u0626< \u0627< \u0628< " - "\u067E< \u0629= \u062A< \u062B< \u062C< \u0686< \u062D< \u062E< \u062F< \u0630<" - " \u0631< \u0632< \u0698< \u0633< \u0634< \u0635< \u0636< \u0637< \u0638< \u0639" - "< \u063A< \u0641< \u0642< \u0643< \u06AF< \u0644< \u0645< \u0646< \u0647< \u0648" - "< \u0649<< \u064A< \u0670< \u0671< \u0672< \u0673< \u0674< \u0675< \u0676< \u0677" - "< \u0678< \u0679< \u067A< \u067B< \u067C< \u067D< \u067F< \u0680< \u0681< \u0682" - "< \u0683< \u0684< \u0685< \u0687< \u0688< \u0689< \u068A< \u068B< \u068C< \u068D" - "< \u068E< \u068F< \u0690< \u0691< \u0692< \u0693< \u0694< \u0695< \u0696< \u0697" - "< \u0699< \u069A< \u069B< \u069C< \u069D< \u069E< \u069F< \u06A0< \u06A1< \u06A2" - "< \u06A3< \u06A4< \u06A5< \u06A6< \u06A7< \u06A8< \u06A9< \u06AA< \u06AB< \u06AC" - "< \u06AD< \u06AE< \u06B0< \u06B1< \u06B2< \u06B3< \u06B4< \u06B5< \u06B6< \u06B7" - "< \u06BA< \u06BB< \u06BC< \u06BD< \u06BE< \u06C0< \u06C1< \u06C2< \u06C3< \u06C4" - "< \u06C5< \u06C6< \u06C7< \u06C8< \u06C9< \u06CA< \u06CB< \u06CC< \u06CD< \u06CE" - "< \u06D0< \u06D1< \u06D2< \u06D3< \u06D5< \u0651"} - } - Countries { - AE { "\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062A" } - BH { "\u0627\u0644\u0628\u062D\u0631\u064A\u0646" } - DZ { "\u0627\u0644\u062C\u0632\u0627\u0626\u0631" } - EG { "\u0645\u0635\u0631" } - IQ { "\u0627\u0644\u0639\u0631\u0627\u0642" } - IN { "\u0627\u0644\u0647\u0646\u062F" } - JO { "\u0627\u0644\u0623\u0631\u062F\u0646" } - KW { "\u0627\u0644\u0643\u0648\u064A\u062A" } - LB { "\u0644\u0628\u0646\u0627\u0646" } - LY { "\u0644\u064A\u0628\u064A\u0627" } - MA { "\u0627\u0644\u0645\u063A\u0631\u0628" } - OM { "\u0633\u0644\u0637\u0646\u0629 \u0639\u0645\u0627\u0646" } - QA { "\u0642\u0637\u0631" } - SA { "\u0627\u0644\u0633\u0639\u0648\u062F\u064A\u0629" } - SD { "\u0627\u0644\u0633\u0648\u062F\u0627\u0646" } - SY { "\u0633\u0648\u0631\u064A\u0627" } - TN { "\u062A\u0648\u0646\u0633" } - YE { "\u0627\u0644\u064A\u0645\u0646" } - } - DateTimeElements:intvector { - 7, - 1, - } - DateTimePatterns { - "z h:mm:ss a", - "h:mm:ss a", - "h:mm:ss a", - "h:mm a", - "EEEE d MMMM yyyy", - "d MMMM yyyy", - "yyyy/MM/dd", - "yyyy/M/d", - "{1} {0}", - } - DayAbbreviations { - "\u0627\u0644\u0623\u062D\u062F", - "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", - "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", - "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", - "\u0627\u0644\u062E\u0645\u064A\u0633", - "\u0627\u0644\u062C\u0645\u0639\u0629", - "\u0627\u0644\u0633\u0628\u062A", - } - DayNames { - "\u0627\u0644\u0623\u062D\u062F", - "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", - "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", - "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", - "\u0627\u0644\u062E\u0645\u064A\u0633", - "\u0627\u0644\u062C\u0645\u0639\u0629", - "\u0627\u0644\u0633\u0628\u062A", - } - Eras { - "\u0642.\u0645", - "\u0645", - } - Languages { - ar { "\u0627\u0644\u0639\u0631\u0628\u064A\u0629" } - } - LocaleID:int { 0x01 } -// LocaleString { "ar" } - MonthAbbreviations { - "\u064A\u0646\u0627\u064A\u0631", - "\u0641\u0628\u0631\u0627\u064A\u0631", - "\u0645\u0627\u0631\u0633", - "\u0623\u0628\u0631\u064A\u0644", - "\u0645\u0627\u064A\u0648", - "\u064A\u0648\u0646\u064A\u0648", - "\u064A\u0648\u0644\u064A\u0648", - "\u0623\u063A\u0633\u0637\u0633", - "\u0633\u0628\u062A\u0645\u0628\u0631", - "\u0623\u0643\u062A\u0648\u0628\u0631", - "\u0646\u0648\u0641\u0645\u0628\u0631", - "\u062F\u064A\u0633\u0645\u0628\u0631", - } - MonthNames { - "\u064A\u0646\u0627\u064A\u0631", - "\u0641\u0628\u0631\u0627\u064A\u0631", - "\u0645\u0627\u0631\u0633", - "\u0623\u0628\u0631\u064A\u0644", - "\u0645\u0627\u064A\u0648", - "\u064A\u0648\u0646\u064A\u0648", - "\u064A\u0648\u0644\u064A\u0648", - "\u0623\u063A\u0633\u0637\u0633", - "\u0633\u0628\u062A\u0645\u0628\u0631", - "\u0623\u0643\u062A\u0648\u0628\u0631", - "\u0646\u0648\u0641\u0645\u0628\u0631", - "\u062F\u064A\u0633\u0645\u0628\u0631", - } - NumberElements { - "\u066B", - "\u066C", - ";", - "\u066A", - "\u0660", - "#", - "-", - "E", - "\u2030", - "\u221E", - "\u066B", - } - NumberPatterns { - "#,##0.###;#,##0.###-", - "#,##0.00 \u00A4;-#,##0.00 \u00A4", - "#,##0%", - "#E0", - } -// ShortLanguage { "ara" } - localPatternChars { "GanjkHmsSEDFwWxhKzAe" } - zoneStrings { - { - "Africa/Casablanca", - "GMT", - "GMT", - "GMT", - "GMT", - } - } - LocaleScript:array { - "Arab" - } - ExemplarCharacters{ -// "[\u0621 \u0627-\u063A \u0641-\u064A\u0651 \u0653-\u0655 \u0670-\u06B7 \u06BA-\u06BE \u06C1 \u06C3-\u06CE \u06D0-\u06D2]" - "[\u0621-\u063A\u0640-\u0655\u0660-\u066C\u200c\u200d\u200f\u200e]" - } - - // Currency display names - Currencies { - AED { "\u062F.\u0625.\u200F", "AED" } - BHD { "\u062F.\u0628.\u200F", "BHD" } - DZD { "\u062F.\u062C.\u200F", "DZD" } - EGP { "\u062C.\u0645.\u200F", "EGP" } - IQD { "\u062F.\u0639.\u200F", "IQD" } - JOD { "\u062F.\u0623.\u200F", "JOD" } - KWD { "\u062F.\u0643.\u200F", "KWD" } - LBP { "\u0644.\u0644.\u200F", "LBP" } - LYD { "\u062F.\u0644.\u200F", "LYD" } - MAD { "\u062F.\u0645.\u200F", "MAD" } - OMR { "\u0631.\u0639.\u200F", "OMR" } - QAR { "\u0631.\u0642.\u200F", "QAR" } - SAR { "\u0631.\u0633.\u200F", "SAR" } - SDP { "\u062C.\u0633.\u200F", "SDP" } - SYP { "\u0644.\u0633.\u200F", "SYP" } - TND { "\u062F.\u062A.\u200F", "TND" } - YER { "\u0631.\u064A.\u200F", "YER" } - } - - // (ICU 2.6) International Calendar Data. Note, THE FORMAT OF THIS DATA WILL CHANGE IN FUTURE RELEASES. - Eras_buddhist:array{ "\u0627\u0644\u062A\u0642\u0648\u064A\u0645 \u0627\u0644\u0628\u0648\u0630\u064A" } -} +// *************************************************************************** +// * +// * Copyright (C) 2005 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ar.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/ar.xml + */ +ar{ + Countries{ + AD{"اندورا"} + AE{"الامارات العربية المتحدة"} + AF{"افغانستان"} + AG{"انتيغوا وبربودا"} + AI{"البانيا"} + AM{"ارمينيا"} + AO{"انغولا"} + AR{"الارجنتين"} + AT{"النمسا"} + AU{"استراليا"} + AZ{"آذربيجان"} + BA{"البوسنة والهرسك"} + BB{"بربادوس"} + BD{"بنغلاديش"} + BE{"بلجيكا"} + BF{"بوركينا فاسو"} + BG{"بلغاريا"} + BH{"البحرين"} + BI{"بوروندي"} + BJ{"بنين"} + BN{"بروناي"} + BO{"بوليفيا"} + BR{"البرازيل"} + BS{"البهاما"} + BT{"بوتان"} + BW{"بوتسوانا"} + BY{"روسيا البيضاء"} + BZ{"بليز"} + CA{"كندا"} + CF{"جمهورية افريقيا الوسطى"} + CG{"الكونغو"} + CH{"سويسرا"} + CL{"تشيلي"} + CM{"الكاميرون"} + CN{"الصين"} + CO{"كولومبيا"} + CR{"كوستاريكا"} + CU{"كوبا"} + CV{"الرأس الاخضر"} + CY{"قبرص"} + CZ{"جمهورية التشيك"} + DE{"المانيا"} + DJ{"جيبوتي"} + DK{"الدانمرك"} + DM{"دومينيكا"} + DO{"الجمهورية الدومينيكية"} + DZ{"الجزائر"} + EC{"اكوادور"} + EE{"استونيا"} + EG{"مصر"} + EH{"الصحراء الغربية"} + ER{"ارتيريا"} + ES{"اسبانيا"} + ET{"اثيوبيا"} + FI{"فنلندا"} + FJ{"فيجي"} + FM{"ميكرونيزيا"} + FR{"فرنسا"} + GA{"غابون"} + GB{"المملكة المتحدة"} + GD{"غرينادا"} + GE{"جورجيا"} + GH{"غانا"} + GM{"غامبيا"} + GN{"غينيا"} + GQ{"غينيا الاستوائية"} + GR{"اليونان"} + GT{"غواتيمالا"} + GW{"غينيا بيساو"} + GY{"غوايانا"} + HN{"هندوراس"} + HR{"كرواتيا"} + HT{"هايتي"} + HU{"هنغاريا"} + ID{"اندونيسيا"} + IE{"ايرلندا"} + IL{"اسرائيل"} + IN{"الهند"} + IQ{"العراق"} + IR{"ايران"} + IS{"ايسلندا"} + IT{"ايطاليا"} + JM{"جامايكا"} + JO{"الاردن"} + JP{"اليابان"} + KE{"كينيا"} + KG{"قيرغيزستان"} + KH{"كمبوديا"} + KI{"كيريباتي"} + KM{"جزر القمر"} + KN{"سانت كيتس ونيفيس"} + KP{"كوريا الشمالية"} + KR{"كوريا الجنوبية"} + KW{"الكويت"} + KZ{"كازاخستان"} + LA{"لاوس"} + LB{"لبنان"} + LC{"سانت لوسيا"} + LI{"ليختنشتاين"} + LK{"سري لانكا"} + LR{"ليبيريا"} + LS{"ليسوتو"} + LT{"ليتوانيا"} + LU{"لوكسومبرغ"} + LV{"لاتفيا"} + LY{"ليبيا"} + MA{"المغرب"} + MC{"موناكو"} + MD{"مولدوفا"} + MG{"مدغشقر"} + MH{"جزر المارشال"} + MK{"مقدونيا"} + ML{"مالي"} + MM{"ميانمار"} + MN{"منغوليا"} + MR{"موريتانيا"} + MT{"مالطة"} + MU{"موريشوس"} + MV{"مالديف"} + MW{"ملاوي"} + MX{"المكسيك"} + MY{"ماليزيا"} + MZ{"موزمبيق"} + NA{"ناميبيا"} + NE{"النيجر"} + NG{"نيجيريا"} + NI{"نيكاراغوا"} + NL{"هولندا"} + NO{"النرويج"} + NP{"النيبال"} + NR{"ناورو"} + NZ{"زيلندا الجديدة"} + OM{"عمان"} + PA{"بنما"} + PE{"بيرو"} + PG{"بابوا غينيا الجديدة"} + PH{"الفيلبين"} + PK{"الباكستان"} + PL{"بولندا"} + PT{"البرتغال"} + PW{"بالاو"} + PY{"باراغواي"} + QA{"قطر"} + RO{"رومانيا"} + RU{"روسيا"} + RW{"رواندا"} + SA{"العربية السعودية"} + SB{"جزر سليمان"} + SC{"سيشل"} + SD{"السودان"} + SE{"السويد"} + SG{"سنغافورة"} + SI{"سلوفينيا"} + SK{"سلوفاكيا"} + SL{"سيراليون"} + SM{"سان مارينو"} + SN{"السنغال"} + SO{"الصومال"} + SR{"سورينام"} + ST{"سان تومي وبرينسيبي"} + SV{"السلفادور"} + SY{"سورية"} + SZ{"سوازيلاند"} + TD{"تشاد"} + TG{"توغو"} + TH{"تايلند"} + TJ{"تاجيكستان"} + TM{"تركمانستان"} + TN{"تونس"} + TO{"تونغا"} + TR{"تركيا"} + TT{"ترينيداد وتوباغو"} + TV{"توفالو"} + TW{"تايوان"} + TZ{"تانزانيا"} + UA{"اوكرانيا"} + UG{"اوغندا"} + US{"الاولايات المتحدة الامريكية"} + UY{"اروغواي"} + UZ{"ازبكستان"} + VA{"الفاتيكان"} + VC{"سانت فنسنت وجزر غرينادين"} + VE{"فنزويلا"} + VN{"فيتنام"} + VU{"فانوآتو"} + WS{"ساموا"} + YE{"اليمن"} + ZA{"جنوب افريقيا"} + ZM{"زامبيا"} + ZW{"زيمبابوي"} + } + Currencies{ + AED{ + "د.إ.‏", + "AED", + } + BHD{ + "د.ب.‏", + "BHD", + } + DZD{ + "د.ج.‏", + "DZD", + } + EGP{ + "ج.م.‏", + "EGP", + } + IQD{ + "د.ع.‏", + "IQD", + } + JOD{ + "د.أ.‏", + "JOD", + } + KWD{ + "د.ك.‏", + "KWD", + } + LBP{ + "ل.ل.‏", + "LBP", + } + LYD{ + "د.ل.‏", + "LYD", + } + MAD{ + "د.م.‏", + "MAD", + } + OMR{ + "ر.ع.‏", + "OMR", + } + QAR{ + "ر.ق.‏", + "QAR", + } + SAR{ + "ر.س.‏", + "SAR", + } + SDP{ + "ج.س.‏", + "SDP", + } + SYP{ + "ل.س.‏", + "SYP", + } + TND{ + "د.ت.‏", + "TND", + } + TRY{ + "TRY", + "ليرة تركية جديدة", + } + YER{ + "ر.ي.‏", + "YER", + } + } + ExemplarCharacters{"[ء-غـ-ْ‌‍‏‎]"} + Keys{ + calendar{"تقويم"} + collation{"الترتيب"} + currency{"العملات"} + } + Languages{ + aa{"الافارية"} + ab{"الابخازية"} + af{"الافريقية"} + afa{"افرو-اسيوية"} + ang{"انكليزية، قديم"} + ar{"العربية"} + arc{"الارامية"} + az{"اذرية"} + bal{"البلوشية"} + be{"البيلوروسية"} + ber{"البربرية"} + bg{"البلغارية"} + bn{"البنغالية"} + bo{"التبتية"} + bs{"البوسنية"} + ca{"الكاتالوينية"} + ce{"الشيشانية"} + cop{"قبطية"} + cs{"التشيكية"} + cy{"الولزية"} + da{"الدانماركية"} + de{"الالمانية"} + dv{"المالديفية"} + dz{"الزونخاية"} + egy{"مصرية، قديمة"} + el{"اليونانية"} + en{"الانجليزية"} + eo{"اسبرانتو"} + es{"الاسبانية"} + et{"استونية"} + fa{"الفارسية"} + fi{"الفنلندية"} + fj{"الفيجية"} + fr{"الفرنسية"} + gu{"الغوجاراتية"} + he{"العبرية"} + hi{"الهندية"} + hr{"الكرواتية"} + ht{"الهايتية"} + hu{"الهنغارية"} + hy{"الارمنية"} + id{"الاندونيسية"} + ira{"الايرانية"} + it{"الايطالية"} + ja{"اليابانية"} + km{"الخميرية"} + ko{"الكورية"} + ks{"الكاشميرية"} + ku{"الكردية"} + la{"اللاتينية"} + lt{"اللتوانية"} + lv{"اللاتفية"} + mn{"المنغولية"} + ms{"لغة الملايو"} + mt{"المالطية"} + my{"البورمية"} + ne{"النيبالية"} + nl{"الهولندية"} + pa{"البنجابية"} + pl{"البولونية"} + ps{"البشتونية"} + pt{"البرتغالية"} + ro{"الرومانية"} + ru{"الروسية"} + smi{"اللغات السامية"} + sq{"الالبانية"} + sr{"الصربية"} + sv{"السويدية"} + sw{"السواحلية"} + syr{"السريانية"} + th{"التايلاندية"} + tl{"التاغالوغية"} + tr{"التركية"} + tt{"التترية"} + ug{"الاغورية"} + uk{"الاوكرانية"} + ur{"الاردية"} + vi{"الفيتنامية"} + zh{"الصينية"} + } + LocaleScript{ + "Arab", + } + NumberElements{ + "٫", + "٬", + ";", + "٪", + "٠", + "#", + "-", + "E", + "‰", + "∞", + "�", + "+", + } + NumberPatterns{ + "#,##0.###;#,##0.###-", + "¤ #,##0.00;¤ #,##0.00-", + "#,##0%", + "#E0", + } + Scripts{ + Arab{"العربية"} + Armn{"الارمنية"} + Beng{"البنغالية"} + Brai{"برايل"} + Copt{"القبطية"} + Cprt{"القبرصية"} + Ethi{"الاثيوبية"} + Geor{"الجورجية"} + Grek{"اليونانية"} + Gujr{"تاغجراتية"} + Hebr{"العبرية"} + Khmr{"الخميرية"} + Latn{"اللاتنية"} + Mong{"المغولية"} + Syrc{"السريانية"} + Taml{"التاميل"} + Tglg{"التغالوغية"} + Thai{"التايلندية"} + Tibt{"التبتية"} + } + Types{ + calendar{ + buddhist{"تقويم بوني"} + chinese{"تقويم صيني"} + gregorian{"تقويم ميلادي"} + hebrew{"تقويم عبري"} + islamic{"تقويم اسلامي"} + islamic-civil{"تقويم اسلامي مدني"} + japanese{"تقويم ياباني"} + } + collation{ + direct{"ترتيب مباشر"} + phonebook{"ترتيب دليل الهاتف"} + traditional{"تقليدي"} + } + } + Version{"1.3"} + calendar{ + buddhist{ + eras{ + abbreviated{ + "التقويم البوذي", + } + } + } + gregorian{ + AmPmMarkers{ + "ص", + "م", + } + DateTimeElements:intvector{ + 7, + 1, + } + DateTimePatterns{ + "z h:mm:ss a", + "h:mm:ss a", + "h:mm:ss a", + "h:mm a", + "EEEE, d MMMM, yyyy", + "d MMMM, yyyy", + "dd/MM/yyyy", + "d/M/yyyy", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "ح", + "ن", + "ث", + "ر", + "خ", + "ج", + "س", + } + narrow{ + "ح", + "ن", + "ث", + "ر", + "خ", + "ج", + "س", + } + wide{ + "الأحد", + "الاثنين", + "الثلاثاء", + "الأربعاء", + "الخميس", + "الجمعة", + "السبت", + } + } + } + eras{ + abbreviated{ + "ق.م", + "م", + } + } + monthNames{ + format{ + abbreviated{ + "يناير", + "فبراير", + "مارس", + "أبريل", + "مايو", + "يونيو", + "يوليو", + "أغسطس", + "سبتمبر", + "أكتوبر", + "نوفمبر", + "ديسمبر", + } + narrow{ + "ي", + "ف", + "م", + "آ", + "و", + "ن", + "ل", + "غ", + "س", + "ك", + "ب", + "د", + } + wide{ + "يناير", + "فبراير", + "مارس", + "أبريل", + "مايو", + "يونيو", + "يوليو", + "أغسطس", + "سبتمبر", + "أكتوبر", + "نوفمبر", + "ديسمبر", + } + } + } + weekend:intvector{ + 5, + 0, + 6, + 86400000, + } + } + islamic{ + eras{ + abbreviated{ + "ه‍", + } + } + monthNames{ + format{ + abbreviated:alias{"ar/calendar/islamic/monthNames/format/wide"} + wide{ + "محرم", + "صفر", + "ربيع الأول", + "ربيع الآخر", + "جمادى الأولى", + "جمادى الآخرة", + "رجب", + "شعبان", + "رمضان", + "شوال", + "ذو القعدة", + "ذو الحجة", + } + } + } + } + islamic-civil{ + eras:alias{"ar/calendar/islamic/eras"} + monthNames:alias{"ar/calendar/islamic/monthNames"} + } + } + localPatternChars{"GanjkHmsSEDFwWxhKzAeugXZ"} +} diff --git a/icuSources/data/locales/ar_AE.txt b/icuSources/data/locales/ar_AE.txt index 1e64f059..8d56e029 100644 --- a/icuSources/data/locales/ar_AE.txt +++ b/icuSources/data/locales/ar_AE.txt @@ -1,13 +1,11 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ar_AE.xml // * // *************************************************************************** - -ar_AE { - Version{"2.0"} -// LocaleString { "ar_AE" } -// ShortCountry { "ARE" } - LocaleID:int { 0x3801 } +ar_AE{ + Version{"1.2"} } diff --git a/icuSources/data/locales/ar_BH.txt b/icuSources/data/locales/ar_BH.txt index 7e1b4715..98b32644 100644 --- a/icuSources/data/locales/ar_BH.txt +++ b/icuSources/data/locales/ar_BH.txt @@ -1,13 +1,11 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ar_BH.xml // * // *************************************************************************** - -ar_BH { - Version{"2.0"} -// LocaleString { "ar_BH" } -// ShortCountry { "BHR" } - LocaleID:int { 0x3c01 } +ar_BH{ + Version{"1.2"} } diff --git a/icuSources/data/locales/ar_DZ.txt b/icuSources/data/locales/ar_DZ.txt index ed7548ca..e6956883 100644 --- a/icuSources/data/locales/ar_DZ.txt +++ b/icuSources/data/locales/ar_DZ.txt @@ -1,37 +1,25 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ar_DZ.xml // * // *************************************************************************** - -ar_DZ { - Version{"2.0"} - DateTimePatterns { - "z h:mm:ss a", - "h:mm:ss a", - "h:mm:ss a", - "h:mm a", - "EEEE d MMMM yyyy", - "d MMMM yyyy", - "dd/MM/yyyy", - "d/M/yyyy", - "{1} {0}", - } - NumberElements { - "\u066B", - "\u066C", - ";", - "\u066A", - "0", - "#", - "-", - "E", - "\u2030", - "\u221E", - "\u066B", - } -// LocaleString { "ar_DZ" } -// ShortCountry { "DZA" } - LocaleID:int { 0x1401 } +ar_DZ{ + NumberElements{ + "٫", + "٬", + ";", + "٪", + "0", + "#", + "-", + "E", + "‰", + "∞", + "�", + "+", + } + Version{"1.2"} } diff --git a/icuSources/data/locales/ar_EG.txt b/icuSources/data/locales/ar_EG.txt index 6bbe97a2..ffcc97c8 100644 --- a/icuSources/data/locales/ar_EG.txt +++ b/icuSources/data/locales/ar_EG.txt @@ -1,13 +1,21 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ar_EG.xml // * // *************************************************************************** - -ar_EG { - Version{"2.0"} -// LocaleString { "ar_EG" } -// ShortCountry { "EGY" } - LocaleID:int { 0x0c01 } +ar_EG{ + Version{"1.2"} + calendar{ + gregorian{ + weekend:intvector{ + 6, + 0, + 7, + 86400000, + } + } + } } diff --git a/icuSources/data/locales/ar_IN.txt b/icuSources/data/locales/ar_IN.txt index 2f49c6c1..0038fbdc 100644 --- a/icuSources/data/locales/ar_IN.txt +++ b/icuSources/data/locales/ar_IN.txt @@ -1,30 +1,42 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 2001-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ar_IN.xml // * -// * Generated from - Universal Locales for Linux Project // *************************************************************************** - -ar_IN { - Version{ "2.0" } - DateTimePatterns { - "h:mm:ss a z", - "h:mm:ss a z", - "h:mm:ss a", - "h:mm a", - "EEEE d MMMM yyyy", - "d MMMM yyyy", - "dd-MM-yyyy", - "d-M-yy", - "{1} {0}" - } - NumberPatterns { +ar_IN{ + NumberPatterns{ "##,##,##0.###;-##,##,##0.###", - "\u00A4 ##,##,##0.00;-\u00A4 ##,##,##0.00", + "¤ ##,##,##0.00;-¤ ##,##,##0.00", "##,##,##0%", "#E0", } -// LocaleString { "ar_IN" } -// ShortCountry { "IND" } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "h:mm:ss a z", + "h:mm:ss a z", + "h:mm:ss a", + "h:mm a", + "EEEE d MMMM yyyy", + "d MMMM yyyy", + "dd-MM-yyyy", + "d-M-yy", + "{1} {0}", + } + weekend:intvector{ + 1, + 0, + 1, + 86400000, + } + } + } } diff --git a/icuSources/data/locales/ar_IQ.txt b/icuSources/data/locales/ar_IQ.txt index fc3f7390..5c2b3954 100644 --- a/icuSources/data/locales/ar_IQ.txt +++ b/icuSources/data/locales/ar_IQ.txt @@ -1,13 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ar_IQ.xml // * // *************************************************************************** - -ar_IQ { - Version{ "2.0" } -// LocaleString { "ar_IQ" } -// ShortCountry { "IRQ" } - LocaleID:int { 0x0801 } +ar_IQ{ + NumberPatterns{ + "#,##0.###;#,##0.###-", + "¤ #,##0.000;¤ #,##0.000-", + "#,##0%", + "#E0", + } + Version{"1.2"} } diff --git a/icuSources/data/locales/ar_JO.txt b/icuSources/data/locales/ar_JO.txt index c97cf921..e9fed2ed 100644 --- a/icuSources/data/locales/ar_JO.txt +++ b/icuSources/data/locales/ar_JO.txt @@ -1,50 +1,66 @@ -// *************************************************************************** -// * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -ar_JO { - Version{ "2.0" } - DayAbbreviations { - "\u0627\u0644\u0623\u062D\u062F", - "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", - "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", - "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", - "\u0627\u0644\u062E\u0645\u064A\u0633", - "\u0627\u0644\u062C\u0645\u0639\u0629", - "\u0627\u0644\u0633\u0628\u062A", - } -// LocaleString { "ar_JO" } - MonthAbbreviations { - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062B\u0627\u0646\u064A", - "\u0634\u0628\u0627\u0637", - "\u0622\u0630\u0627\u0631", - "\u0646\u064A\u0633\u0627\u0646", - "\u0623\u064a\u0627\u0631", - "\u062D\u0632\u064A\u0631\u0627\u0646", - "\u062A\u0645\u0648\u0632", - "\u0622\u0628", - "\u0623\u064A\u0644\u0648\u0644", - "\u062A\u0634\u0631\u064A\u0646 \u0627\u0644\u0623\u0648\u0644", - "\u062A\u0634\u0631\u064A\u0646 \u0627\u0644\u062B\u0627\u0646\u064A", - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644", - } - MonthNames { - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062B\u0627\u0646\u064A", - "\u0634\u0628\u0627\u0637", - "\u0622\u0630\u0627\u0631", - "\u0646\u064A\u0633\u0627\u0646", - "\u0623\u064a\u0627\u0631", - "\u062D\u0632\u064A\u0631\u0627\u0646", - "\u062A\u0645\u0648\u0632", - "\u0622\u0628", - "\u0623\u064A\u0644\u0648\u0644", - "\u062A\u0634\u0631\u064A\u0646 \u0627\u0644\u0623\u0648\u0644", - "\u062A\u0634\u0631\u064A\u0646 \u0627\u0644\u062B\u0627\u0646\u064A", - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644", - } -// ShortCountry { "JOR" } - LocaleID:int { 0x2c01 } -} +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ar_JO.xml +// * +// *************************************************************************** +ar_JO{ + NumberPatterns{ + "#,##0.###;#,##0.###-", + "¤ #,##0.000;¤ #,##0.000-", + "#,##0%", + "#E0", + } + Version{"1.2"} + calendar{ + gregorian{ + dayNames{ + format{ + abbreviated{ + "الأحد", + "الاثنين", + "الثلاثاء", + "الأربعاء", + "الخميس", + "الجمعة", + "السبت", + } + } + } + monthNames{ + format{ + abbreviated{ + "كانون الثاني", + "شباط", + "آذار", + "نيسان", + "أيار", + "حزيران", + "تموز", + "آب", + "أيلول", + "تشرين الأول", + "تشرين الثاني", + "كانون الأول", + } + wide{ + "كانون الثاني", + "شباط", + "آذار", + "نيسان", + "أيار", + "حزيران", + "تموز", + "آب", + "أيلول", + "تشرين الأول", + "تشرين الثاني", + "كانون الأول", + } + } + } + } + } +} diff --git a/icuSources/data/locales/ar_KW.txt b/icuSources/data/locales/ar_KW.txt index 0be9db23..e6268160 100644 --- a/icuSources/data/locales/ar_KW.txt +++ b/icuSources/data/locales/ar_KW.txt @@ -1,13 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ar_KW.xml // * // *************************************************************************** - -ar_KW { - Version{ "2.0" } -// LocaleString { "ar_KW" } -// ShortCountry { "KWT" } - LocaleID:int { 0x3401 } +ar_KW{ + NumberPatterns{ + "#,##0.###;#,##0.###-", + "¤ #,##0.000;¤ #,##0.000-", + "#,##0%", + "#E0", + } + Version{"1.2"} } diff --git a/icuSources/data/locales/ar_LB.txt b/icuSources/data/locales/ar_LB.txt index 2197b896..56a960d4 100644 --- a/icuSources/data/locales/ar_LB.txt +++ b/icuSources/data/locales/ar_LB.txt @@ -1,50 +1,60 @@ -// *************************************************************************** -// * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -ar_LB { - Version{ "2.0" } - DayAbbreviations { - "\u0627\u0644\u0623\u062D\u062F", - "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", - "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", - "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", - "\u0627\u0644\u062E\u0645\u064A\u0633", - "\u0627\u0644\u062C\u0645\u0639\u0629", - "\u0627\u0644\u0633\u0628\u062A", - } -// LocaleString { "ar_LB" } - MonthAbbreviations { - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062B\u0627\u0646\u064A", - "\u0634\u0628\u0627\u0637", - "\u0622\u0630\u0627\u0631", - "\u0646\u064A\u0633\u0627\u0646", - "\u0646\u0648\u0627\u0631", - "\u062D\u0632\u064A\u0631\u0627\u0646", - "\u062A\u0645\u0648\u0632", - "\u0622\u0628", - "\u0623\u064A\u0644\u0648\u0644", - "\u062A\u0634\u0631\u064A\u0646 \u0627\u0644\u0623\u0648\u0644", - "\u062A\u0634\u0631\u064A\u0646 \u0627\u0644\u062B\u0627\u0646\u064A", - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644", - } - MonthNames { - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062B\u0627\u0646\u064A", - "\u0634\u0628\u0627\u0637", - "\u0622\u0630\u0627\u0631", - "\u0646\u064A\u0633\u0627\u0646", - "\u0646\u0648\u0627\u0631", - "\u062D\u0632\u064A\u0631\u0627\u0646", - "\u062A\u0645\u0648\u0632", - "\u0622\u0628", - "\u0623\u064A\u0644\u0648\u0644", - "\u062A\u0634\u0631\u064A\u0646 \u0627\u0644\u0623\u0648\u0644", - "\u062A\u0634\u0631\u064A\u0646 \u0627\u0644\u062B\u0627\u0646\u064A", - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644", - } -// ShortCountry { "LBN" } - LocaleID:int { 0x3001 } -} +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ar_LB.xml +// * +// *************************************************************************** +ar_LB{ + Version{"1.2"} + calendar{ + gregorian{ + dayNames{ + format{ + abbreviated{ + "الأحد", + "الاثنين", + "الثلاثاء", + "الأربعاء", + "الخميس", + "الجمعة", + "السبت", + } + } + } + monthNames{ + format{ + abbreviated{ + "كانون الثاني", + "شباط", + "آذار", + "نيسان", + "نوار", + "حزيران", + "تموز", + "آب", + "أيلول", + "تشرين الأول", + "تشرين الثاني", + "كانون الأول", + } + wide{ + "كانون الثاني", + "شباط", + "آذار", + "نيسان", + "نوار", + "حزيران", + "تموز", + "آب", + "أيلول", + "تشرين الأول", + "تشرين الثاني", + "كانون الأول", + } + } + } + } + } +} diff --git a/icuSources/data/locales/ar_LY.txt b/icuSources/data/locales/ar_LY.txt index 2edd1ada..f7c532a8 100644 --- a/icuSources/data/locales/ar_LY.txt +++ b/icuSources/data/locales/ar_LY.txt @@ -1,13 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ar_LY.xml // * // *************************************************************************** - -ar_LY { - Version{ "2.0" } -// LocaleString { "ar_LY" } -// ShortCountry { "LBY" } - LocaleID:int { 0x1001 } +ar_LY{ + NumberPatterns{ + "#,##0.###;#,##0.###-", + "¤ #,##0.000;¤ #,##0.000-", + "#,##0%", + "#E0", + } + Version{"1.2"} } diff --git a/icuSources/data/locales/ar_MA.txt b/icuSources/data/locales/ar_MA.txt index 371c9244..b5fabd6e 100644 --- a/icuSources/data/locales/ar_MA.txt +++ b/icuSources/data/locales/ar_MA.txt @@ -1,37 +1,25 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ar_MA.xml // * // *************************************************************************** - -ar_MA { - Version{ "2.0" } - DateTimePatterns { - "z h:mm:ss a", - "h:mm:ss a", - "h:mm:ss a", - "h:mm a", - "EEEE d MMMM yyyy", - "d MMMM yyyy", - "dd/MM/yyyy", - "d/M/yyyy", - "{1} {0}", - } - NumberElements { - "\u066B", - "\u066C", - ";", - "\u066A", - "0", - "#", - "-", - "E", - "\u2030", - "\u221E", - "\u066B", +ar_MA{ + NumberElements{ + "٫", + "٬", + ";", + "٪", + "0", + "#", + "-", + "E", + "‰", + "∞", + "�", + "+", } -// LocaleString { "ar_MA" } -// ShortCountry { "MAR" } - LocaleID:int { 0x1801 } + Version{"1.2"} } diff --git a/icuSources/data/locales/ar_OM.txt b/icuSources/data/locales/ar_OM.txt index 49c24079..9ee04835 100644 --- a/icuSources/data/locales/ar_OM.txt +++ b/icuSources/data/locales/ar_OM.txt @@ -1,13 +1,11 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ar_OM.xml // * // *************************************************************************** - -ar_OM { - Version{"2.0"} -// LocaleString { "ar_OM" } -// ShortCountry { "OMN" } - LocaleID:int { 0x2001 } +ar_OM{ + Version{"1.2"} } diff --git a/icuSources/data/locales/ar_QA.txt b/icuSources/data/locales/ar_QA.txt index ef95c792..a471b44e 100644 --- a/icuSources/data/locales/ar_QA.txt +++ b/icuSources/data/locales/ar_QA.txt @@ -1,36 +1,34 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ar_QA.xml // * // *************************************************************************** - -ar_QA { - Version{"2.0"} -// LocaleString { "ar_QA" } -// ShortCountry { "QAT" } - LocaleID:int { 0x4001 } - MonthAbbreviations { - "\u064A\u0646\u0627\u064A\u0631", - "\u0641\u0628\u0631\u0627\u064A\u0631", - "\u0645\u0627\u0631\u0633", - "\u0623\u0628\u0631\u064A\u0644", - "\u0645\u0627\u064A\u0648", - "\u064A\u0648\u0646\u064A\u0648", - "\u064A\u0648\u0644\u064A\u0648", - "\u0623\u063A\u0633\u0637\u0633", - "\u0633\u0628\u062A\u0645\u0628\u0631", - "\u0623\u0643\u062A\u0648\u0628\u0631", - "\u0646\u0648\u0641\u0645\u0628\u0631", - "\u062F\u064A\u0633\u0645\u0628\u0631", +ar_QA{ + NumberPatterns{ + "###0.###;###0.###-", + "¤###0.00;-¤###0.00", + "#,##0%", + "#E0", } - DayAbbreviations { - "\u0627\u0644\u0623\u062D\u062F", - "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", - "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", - "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", - "\u0627\u0644\u062E\u0645\u064A\u0633", - "\u0627\u0644\u062C\u0645\u0639\u0629", - "\u0627\u0644\u0633\u0628\u062A", + Version{"1.2"} + calendar{ + gregorian{ + dayNames{ + format{ + abbreviated{ + "الأحد", + "الاثنين", + "الثلاثاء", + "الأربعاء", + "الخميس", + "الجمعة", + "السبت", + } + } + } + } } } diff --git a/icuSources/data/locales/ar_SA.txt b/icuSources/data/locales/ar_SA.txt index 100cd13b..f7530bd5 100644 --- a/icuSources/data/locales/ar_SA.txt +++ b/icuSources/data/locales/ar_SA.txt @@ -1,36 +1,34 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ar_SA.xml // * // *************************************************************************** - -ar_SA { - Version{"2.0"} -// LocaleString { "ar_SA" } -// ShortCountry { "SAU" } - LocaleID:int { 0x0401 } - MonthAbbreviations { - "\u064A\u0646\u0627\u064A\u0631", - "\u0641\u0628\u0631\u0627\u064A\u0631", - "\u0645\u0627\u0631\u0633", - "\u0623\u0628\u0631\u064A\u0644", - "\u0645\u0627\u064A\u0648", - "\u064A\u0648\u0646\u064A\u0648", - "\u064A\u0648\u0644\u064A\u0648", - "\u0623\u063A\u0633\u0637\u0633", - "\u0633\u0628\u062A\u0645\u0628\u0631", - "\u0623\u0643\u062A\u0648\u0628\u0631", - "\u0646\u0648\u0641\u0645\u0628\u0631", - "\u062F\u064A\u0633\u0645\u0628\u0631", +ar_SA{ + NumberPatterns{ + "###0.###;###0.###-", + "¤###0.00;-¤###0.00", + "#,##0%", + "#E0", } - DayAbbreviations { - "\u0627\u0644\u0623\u062D\u062F", - "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", - "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", - "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", - "\u0627\u0644\u062E\u0645\u064A\u0633", - "\u0627\u0644\u062C\u0645\u0639\u0629", - "\u0627\u0644\u0633\u0628\u062A", + Version{"1.2"} + calendar{ + gregorian{ + dayNames{ + format{ + abbreviated{ + "الأحد", + "الاثنين", + "الثلاثاء", + "الأربعاء", + "الخميس", + "الجمعة", + "السبت", + } + } + } + } } } diff --git a/icuSources/data/locales/ar_SD.txt b/icuSources/data/locales/ar_SD.txt index 70af342c..43a27ec1 100644 --- a/icuSources/data/locales/ar_SD.txt +++ b/icuSources/data/locales/ar_SD.txt @@ -1,12 +1,11 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ar_SD.xml // * // *************************************************************************** - -ar_SD { - Version{"2.0"} -// LocaleString { "ar_SD" } -// ShortCountry { "SDN" } +ar_SD{ + Version{"1.2"} } diff --git a/icuSources/data/locales/ar_SY.txt b/icuSources/data/locales/ar_SY.txt index cc57fe40..32f06efe 100644 --- a/icuSources/data/locales/ar_SY.txt +++ b/icuSources/data/locales/ar_SY.txt @@ -1,54 +1,76 @@ -// *************************************************************************** -// * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -ar_SY { - Version{ "2.0" } - DayAbbreviations { - "\u0627\u0644\u0623\u062D\u062F", - "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", - "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", - "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", - "\u0627\u0644\u062E\u0645\u064A\u0633", - "\u0627\u0644\u062C\u0645\u0639\u0629", - "\u0627\u0644\u0633\u0628\u062A", - } -// LocaleString { "ar_SY" } - MonthAbbreviations { - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062B\u0627\u0646\u064A", - "\u0634\u0628\u0627\u0637", - "\u0622\u0630\u0627\u0631", - "\u0646\u064A\u0633\u0627\u0646", - "\u0646\u0648\u0627\u0631", - "\u062D\u0632\u064A\u0631\u0627\u0646", - "\u062A\u0645\u0648\u0632", - "\u0622\u0628", - "\u0623\u064A\u0644\u0648\u0644", - "\u062A\u0634\u0631\u064A\u0646 \u0627\u0644\u0623\u0648\u0644", - "\u062A\u0634\u0631\u064A\u0646 \u0627\u0644\u062B\u0627\u0646\u064A", - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644", - } - MonthNames { - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062B\u0627\u0646\u064A", - "\u0634\u0628\u0627\u0637", - "\u0622\u0630\u0627\u0631", - "\u0646\u064A\u0633\u0627\u0646", - "\u0646\u0648\u0627\u0631", - "\u062D\u0632\u064A\u0631\u0627\u0646", - "\u062A\u0645\u0648\u0632", - "\u0622\u0628", - "\u0623\u064A\u0644\u0648\u0644", - "\u062A\u0634\u0631\u064A\u0646 \u0627\u0644\u0623\u0648\u0644", - "\u062A\u0634\u0631\u064A\u0646 \u0627\u0644\u062B\u0627\u0646\u064A", - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644", - } -// ShortCountry { "SYR" } - LocaleID:int { 0x2801 } - DateTimeElements:intvector { - 5, - 1 - } -} +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ar_SY.xml +// * +// *************************************************************************** +ar_SY{ + NumberPatterns{ + "###0.###;###0.###-", + "¤###0.00;-¤###0.00", + "#,##0%", + "#E0", + } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 5, + 1, + } + dayNames{ + format{ + abbreviated{ + "الأحد", + "الاثنين", + "الثلاثاء", + "الأربعاء", + "الخميس", + "الجمعة", + "السبت", + } + } + } + monthNames{ + format{ + abbreviated{ + "كانون الثاني", + "شباط", + "آذار", + "نيسان", + "نوار", + "حزيران", + "تموز", + "آب", + "أيلول", + "تشرين الأول", + "تشرين الثاني", + "كانون الأول", + } + wide{ + "كانون الثاني", + "شباط", + "آذار", + "نيسان", + "نوار", + "حزيران", + "تموز", + "آب", + "أيلول", + "تشرين الأول", + "تشرين الثاني", + "كانون الأول", + } + } + } + weekend:intvector{ + 6, + 0, + 7, + 86400000, + } + } + } +} diff --git a/icuSources/data/locales/ar_TN.txt b/icuSources/data/locales/ar_TN.txt index 42c8ee5d..dfeac6df 100644 --- a/icuSources/data/locales/ar_TN.txt +++ b/icuSources/data/locales/ar_TN.txt @@ -1,60 +1,48 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ar_TN.xml // * // *************************************************************************** - -ar_TN { - Version{ "2.0" } - DateTimePatterns { - "z h:mm:ss a", - "h:mm:ss a", - "h:mm:ss a", - "h:mm a", - "EEEE d MMMM yyyy", - "d MMMM yyyy", - "dd/MM/yyyy", - "d/M/yyyy", - "{1} {0}", - } - NumberElements { - "\u066B", - "\u066C", - ";", - "\u066A", - "0", - "#", - "-", - "E", - "\u2030", - "\u221E", - "\u066B", +ar_TN{ + NumberElements{ + "٫", + "٬", + ";", + "٪", + "0", + "#", + "-", + "E", + "‰", + "∞", + "�", + "+", } - MonthAbbreviations { - "\u064A\u0646\u0627\u064A\u0631", - "\u0641\u0628\u0631\u0627\u064A\u0631", - "\u0645\u0627\u0631\u0633", - "\u0623\u0628\u0631\u064A\u0644", - "\u0645\u0627\u064A\u0648", - "\u064A\u0648\u0646\u064A\u0648", - "\u064A\u0648\u0644\u064A\u0648", - "\u0623\u063A\u0633\u0637\u0633", - "\u0633\u0628\u062A\u0645\u0628\u0631", - "\u0623\u0643\u062A\u0648\u0628\u0631", - "\u0646\u0648\u0641\u0645\u0628\u0631", - "\u062F\u064A\u0633\u0645\u0628\u0631", + NumberPatterns{ + "###0.###;###0.###-", + "¤###0.00;-¤###0.00", + "#,##0%", + "#E0", } - DayAbbreviations { - "\u0627\u0644\u0623\u062D\u062F", - "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", - "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", - "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", - "\u0627\u0644\u062E\u0645\u064A\u0633", - "\u0627\u0644\u062C\u0645\u0639\u0629", - "\u0627\u0644\u0633\u0628\u062A", + Version{"1.2"} + calendar{ + gregorian{ + dayNames{ + format{ + abbreviated{ + "الأحد", + "الاثنين", + "الثلاثاء", + "الأربعاء", + "الخميس", + "الجمعة", + "السبت", + } + } + } + } } -// LocaleString { "ar_TN" } -// ShortCountry { "TUN" } - LocaleID:int { 0x1c01 } } diff --git a/icuSources/data/locales/ar_YE.txt b/icuSources/data/locales/ar_YE.txt index 157fccae..83784eac 100644 --- a/icuSources/data/locales/ar_YE.txt +++ b/icuSources/data/locales/ar_YE.txt @@ -1,36 +1,34 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ar_YE.xml // * // *************************************************************************** - -ar_YE { - Version{ "2.0" } -// LocaleString { "ar_YE" } -// ShortCountry { "YEM" } - LocaleID:int { 0x2401 } - MonthAbbreviations { - "\u064A\u0646\u0627\u064A\u0631", - "\u0641\u0628\u0631\u0627\u064A\u0631", - "\u0645\u0627\u0631\u0633", - "\u0623\u0628\u0631\u064A\u0644", - "\u0645\u0627\u064A\u0648", - "\u064A\u0648\u0646\u064A\u0648", - "\u064A\u0648\u0644\u064A\u0648", - "\u0623\u063A\u0633\u0637\u0633", - "\u0633\u0628\u062A\u0645\u0628\u0631", - "\u0623\u0643\u062A\u0648\u0628\u0631", - "\u0646\u0648\u0641\u0645\u0628\u0631", - "\u062F\u064A\u0633\u0645\u0628\u0631", +ar_YE{ + NumberPatterns{ + "###0.###;###0.###-", + "¤###0.00;-¤###0.00", + "#,##0%", + "#E0", } - DayAbbreviations { - "\u0627\u0644\u0623\u062D\u062F", - "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", - "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", - "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", - "\u0627\u0644\u062E\u0645\u064A\u0633", - "\u0627\u0644\u062C\u0645\u0639\u0629", - "\u0627\u0644\u0633\u0628\u062A", + Version{"1.2"} + calendar{ + gregorian{ + dayNames{ + format{ + abbreviated{ + "الأحد", + "الاثنين", + "الثلاثاء", + "الأربعاء", + "الخميس", + "الجمعة", + "السبت", + } + } + } + } } } diff --git a/icuSources/data/locales/be.txt b/icuSources/data/locales/be.txt index ef157ef6..69fd7333 100644 --- a/icuSources/data/locales/be.txt +++ b/icuSources/data/locales/be.txt @@ -1,122 +1,124 @@ -// *************************************************************************** -// * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -be { - Version { "2.0" } - - // We use UCA collation table optimized for Cyrillic - // as defined in the Russian locale - CollationElements:alias { "ru" } - - Countries { - BY { "\u0411\u0435\u043B\u0430\u0440\u0443\u0441\u044C" } - } - DateTimePatterns { - "HH.mm.ss z", - "HH.mm.ss z", - "HH.mm.ss", - "HH.mm", - "EEEE, d MMMM yyyy", - "d MMMM yyyy", - "d.M.yyyy", - "d.M.yy", - "{1} {0}", - } - DateTimeElements:intvector { - 2, - 1, // "Minimal Days in First Week" is unknown. Root value used instead - } - DayAbbreviations { - "\u043d\u0434", - "\u043F\u043D", - "\u0430\u045e", - "\u0441\u0440", - "\u0447\u0446", - "\u043F\u0442", - "\u0441\u0431", - } - DayNames { - "\u043D\u044F\u0434\u0437\u0435\u043B\u044F", - "\u043F\u0430\u043D\u044F\u0434\u0437\u0435\u043B\u0430\u043A", - "\u0430\u045E\u0442\u043E\u0440\u0430\u043A", - "\u0441\u0435\u0440\u0430\u0434\u0430", - "\u0447\u0430\u0446\u0432\u0435\u0440", - "\u043F\u044F\u0442\u043D\u0456\u0446\u0430", - "\u0441\u0443\u0431\u043E\u0442\u0430", - } - Eras { - "\u0434\u0430 \u043D.\u0435.", - "\u043D.\u0435.", - } - Languages { - be { "\u0411\u0435\u043B\u0430\u0440\u0443\u0441\u043A\u0456" } - } - LocaleID:int { 0x23 } -// LocaleString { "be" } - MonthAbbreviations { - "\u0441\u0442\u0443", - "\u043b\u044e\u0442", - "\u0441\u0430\u043a", - "\u043a\u0440\u0430", - "\u043c\u0430\u0439", - "\u0447\u044d\u0440", - "\u043b\u0456\u043f", - "\u0436\u043d\u0456", - "\u0432\u0435\u0440", - "\u043a\u0430\u0441", - "\u043b\u0456\u0441", - "\u0441\u043d\u0435", - } - MonthNames { - "\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044c", - "\u043b\u044e\u0442\u044b", - "\u0441\u0430\u043a\u0430\u0432\u0456\u043a", - "\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a", - "\u043c\u0430\u0439", - "\u0447\u044d\u0440\u0432\u0435\u043d\u044c", - "\u043b\u0456\u043f\u0435\u043d\u044c", - "\u0436\u043d\u0456\u0432\u0435\u043d\u044c", - "\u0432\u0435\u0440\u0430\u0441\u0435\u043d\u044c", - "\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a", - "\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434", - "\u0441\u043d\u0435\u0436\u0430\u043d\u044c", - } - NumberElements { - ",", - "\u00A0", - ";", - "%", - "0", - "#", - "-", - "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", - } -// ShortLanguage { "bel" } - localPatternChars { "GanjkHmsSEDFwWxhKzAe" } - zoneStrings { - { - "Africa/Casablanca", - "GMT", - "GMT", - "GMT", - "GMT", - } - } - LocaleScript{ - "Cyrl", // Abbreviation - } - ExemplarCharacters { "[\u0430-\u0437 \u0439-\u0448 \u044b-\u044f \u2019\u0451\u0456\u045e {\u0434\u0436} {\u0434\u0437}]" } - - // Currency display names - Currencies { - BYB { "\u0420\u0443\u0431", "BYB" } - } -} +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/be.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/be.xml + */ +be{ + Countries{ + BY{"Беларусь"} + } + Currencies{ + BYB{ + "Руб", + "BYB", + } + } + ExemplarCharacters{"[а-з й-ш ы-я ’ёіў {дж} {дз}]"} + Languages{ + be{"Беларускі"} + } + LocaleScript{ + "Cyrl", + } + NumberElements{ + ",", + " ", + ";", + "%", + "0", + "#", + "-", + "E", + "‰", + "∞", + "�", + "+", + } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "HH.mm.ss z", + "HH.mm.ss z", + "HH.mm.ss", + "HH.mm", + "EEEE, d MMMM yyyy", + "d MMMM yyyy", + "d.M.yyyy", + "d.M.yy", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "нд", + "пн", + "аў", + "ср", + "чц", + "пт", + "сб", + } + wide{ + "нядзеля", + "панядзелак", + "аўторак", + "серада", + "чацвер", + "пятніца", + "субота", + } + } + } + eras{ + abbreviated{ + "да н.е.", + "н.е.", + } + } + monthNames{ + format{ + abbreviated{ + "сту", + "лют", + "сак", + "кра", + "май", + "чэр", + "ліп", + "жні", + "вер", + "кас", + "ліс", + "сне", + } + wide{ + "студзень", + "люты", + "сакавік", + "красавік", + "май", + "чэрвень", + "ліпень", + "жнівень", + "верасень", + "кастрычнік", + "лістапад", + "снежань", + } + } + } + } + } + localPatternChars{"GanjkHmsSEDFwWxhKzAeugXZ"} +} diff --git a/icuSources/data/locales/be_BY.txt b/icuSources/data/locales/be_BY.txt index a30e78f1..e9e40848 100644 --- a/icuSources/data/locales/be_BY.txt +++ b/icuSources/data/locales/be_BY.txt @@ -1,19 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/be_BY.xml // * // *************************************************************************** - -be_BY { - Version{ "2.0" } -// LocaleString { "be_BY" } - NumberPatterns { +be_BY{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "\u00A4#,##0;-\u00A4#,##0", + "¤#,##0;-¤#,##0", "#,##0%", "#E0", } -// ShortCountry { "BLR" } - LocaleID:int { 0x0423 } + Version{"1.2"} } diff --git a/icuSources/data/locales/bg.txt b/icuSources/data/locales/bg.txt index 927edd96..cb5313e8 100644 --- a/icuSources/data/locales/bg.txt +++ b/icuSources/data/locales/bg.txt @@ -1,125 +1,1864 @@ -// *************************************************************************** -// * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -bg { - // We use UCA collation table optimized for Cyrillic - // as defined in the Russian locale - CollationElements:alias { "ru" } - - Version{ "2.0" } - Countries { - BG { "\u0411\u044A\u043B\u0433\u0430\u0440\u0438\u044F" } - } - DateTimePatterns { - "HH:mm:ss z", - "HH:mm:ss", - "HH:mm:ss", - "HH:mm", - "dd MMMM yyyy, EEEE", - "dd MMMM yyyy", - "dd.MM.yy", - "dd.MM.yy", - "{1} {0}", - } - DayAbbreviations { - "\u043D\u0435\u0434.", - "\u043F\u043E\u043D.", - "\u0432\u0442.", - "\u0441\u0440.", - "\u0447\u0435\u0442\u0432.", - "\u043F\u0435\u0442.", - "\u0441\u044A\u0431.", - } - DateTimeElements:intvector { - 2, - 1, - } - DayNames { - "\u043D\u0435\u0434\u0435\u043B\u044F", - "\u043F\u043E\u043D\u0435\u0434\u0435\u043B\u043D\u0438\u043A", - "\u0432\u0442\u043E\u0440\u043D\u0438\u043A", - "\u0441\u0440\u044F\u0434\u0430", - "\u0447\u0435\u0442\u0432\u044A\u0440\u0442\u044A\u043A", - "\u043F\u0435\u0442\u044A\u043A", - "\u0441\u044A\u0431\u043E\u0442\u0430", - } - Eras { - "\u043F\u0440.\u043D.\u0435.", - "\u043D.\u0435.", - } - Languages { - bg { "\u0431\u044A\u043B\u0433\u0430\u0440\u0441\u043A\u0438" } - } - LocaleID:int { 0x02 } -// LocaleString { "bg" } - MonthAbbreviations { - "\u044f\u043d.", - "\u0444\u0435\u0432.", - "\u043c\u0430\u0440\u0442", - "\u0430\u043f\u0440.", - "\u043c\u0430\u0439", - "\u044e\u043d\u0438", - "\u044e\u043b\u0438", - "\u0430\u0432\u0433.", - "\u0441\u0435\u043f.", - "\u043e\u043a\u0442.", - "\u043d\u043e\u0435\u043c.", - "\u0434\u0435\u043a.", - } - MonthNames { - "\u044F\u043D\u0443\u0430\u0440\u0438", - "\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438", - "\u043C\u0430\u0440\u0442", - "\u0430\u043F\u0440\u0438\u043B", - "\u043C\u0430\u0439", - "\u044E\u043D\u0438", - "\u044E\u043B\u0438", - "\u0430\u0432\u0433\u0443\u0441\u0442", - "\u0441\u0435\u043F\u0442\u0435\u043C\u0432\u0440\u0438", - "\u043E\u043A\u0442\u043E\u043C\u0432\u0440\u0438", - "\u043D\u043E\u0435\u043C\u0432\u0440\u0438", - "\u0434\u0435\u043A\u0435\u043C\u0432\u0440\u0438", - } - NumberElements { - ",", - "\u00A0", - ";", - "%", - "0", - "#", - "-", - "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", - } -// ShortLanguage { "bul" } - localPatternChars { "GanjkHmsSEDFwWxhKzAe" } - zoneStrings { - { - "Africa/Casablanca", - "GMT", - "GMT", - "GMT", - "GMT", - } -// { -// "Europe/Sofia", -// } - } - LocaleScript{ - "Cyrl", // Abbreviation - } - ExemplarCharacters { "[\u0430-\u044c \u044e\u044f\u0463\u046b]" } - - // Currency display names - Currencies { - BGL { "\u043B\u0432", "BGL" } - BGN { "\u043B\u0432.", "BGN" } - } -} +// *************************************************************************** +// * +// * Copyright (C) 2005 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/bg.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/bg.xml + */ +bg{ + Countries{ + AD{"Андора"} + AE{"Обединени Арабски Емирства"} + AF{"Афганистан"} + AG{"Антигуа и Барбуда"} + AI{"Ангуила"} + AL{"Албания"} + AM{"Армения"} + AN{"Холандски Антили"} + AO{"Ангола"} + AQ{"Антарктика"} + AR{"Аржентина"} + AS{"Американско Самоа"} + AT{"Австрия"} + AU{"Австралия"} + AW{"Аруба"} + AZ{"Азербайджан"} + BA{"Босна и Херцеговина"} + BB{"Барбадос"} + BD{"Бангладеш"} + BE{"Белгия"} + BF{"Буркина Фасо"} + BG{"България"} + BH{"Бахрейн"} + BI{"Бурунди"} + BJ{"Бенин"} + BM{"Бермуда"} + BN{"Бруней Дарусалам"} + BO{"Боливия"} + BR{"Бразилия"} + BS{"Бахами"} + BT{"Бутан"} + BV{"Остров Буве"} + BW{"Ботсуана"} + BY{"Беларус"} + BZ{"Белиз"} + CA{"Канада"} + CC{"Кокосови (Кийлинг) острови"} + CD{"Демократична Република Конго"} + CF{"Централноафриканска Република"} + CG{"Конго"} + CH{"Швейцария"} + CI{"Кот д’Ивоар"} + CK{"Острови Кук"} + CL{"Чили"} + CM{"Камерун"} + CN{"Китай"} + CO{"Колумбия"} + CR{"Коста Рика"} + CU{"Куба"} + CV{"Кабо Верде"} + CX{"Остров Кристмас"} + CY{"Кипър"} + CZ{"Чешка Република"} + DE{"Германия"} + DJ{"Джибути"} + DK{"Дания"} + DM{"Доминика"} + DO{"Доминиканска Република"} + DZ{"Алжир"} + EC{"Еквадор"} + EE{"Естония"} + EG{"Египет"} + EH{"Западна Сахара"} + ER{"Еритрея"} + ES{"Испания"} + ET{"Етиопия"} + FI{"Финландия"} + FJ{"Фиджи"} + FK{"Фолклендски острови"} + FM{"Микронезия, Обединени Щати"} + FO{"Фарьорски острови"} + FR{"Франция"} + GA{"Габон"} + GB{"Обединено кралство"} + GD{"Гренада"} + GE{"Грузия"} + GF{"Френска Гвиана"} + GH{"Гана"} + GI{"Гибралтар"} + GL{"Гренландия"} + GM{"Гамбия"} + GN{"Гвинея"} + GP{"Гваделупа"} + GQ{"Екваториална Гвинея"} + GR{"Гърция"} + GS{"Южна Джорджия и Южни Сандвичеви Острови"} + GT{"Гватемала"} + GU{"Гуам"} + GW{"Гвинея-Бисау"} + GY{"Гвиана"} + HK{"Хонг-Конг О.А.Р. на Китай"} + HM{"Остров Хърд и Острови Макдоналд"} + HN{"Хондурас"} + HR{"Хърватска"} + HT{"Хаити"} + HU{"Унгария"} + ID{"Индонезия"} + IE{"Ирландия"} + IL{"Израел"} + IN{"Индия"} + IO{"Британски територии в Индийския океан"} + IQ{"Ирак"} + IR{"Иран, Ислямска република"} + IS{"Исландия"} + IT{"Италия"} + JM{"Ямайка"} + JO{"Йордания"} + JP{"Япония"} + KE{"Кения"} + KG{"Киргизстан"} + KH{"Камбоджа"} + KI{"Кирибати"} + KM{"Комори"} + KN{"Сейнт Китс и Невис"} + KP{"Корея, Северна"} + KR{"Корея, Южна"} + KW{"Кувейт"} + KY{"Кайманови острови"} + KZ{"Казахстан"} + LA{"Народна Демократична Република Лаос"} + LB{"Ливан"} + LC{"Сейнт Лусия"} + LI{"Лихтенщайн"} + LK{"Шри Ланка"} + LR{"Либерия"} + LS{"Лесото"} + LT{"Литва"} + LU{"Люксембург"} + LV{"Латвия"} + LY{"Либийска Арабска Джамахирия"} + MA{"Мароко"} + MC{"Монако"} + MD{"Молдова, Република"} + MG{"Мадагаскар"} + MH{"Маршалови Острови"} + MK{"Македония, Република"} + ML{"Мали"} + MM{"Мианмар"} + MN{"Монголия"} + MO{"Макао О.А.Р. на Китай"} + MP{"Северни Мариански Острови"} + MQ{"Мартиника"} + MR{"Мавритания"} + MS{"Монсерат"} + MT{"Малта"} + MU{"Мавриций"} + MV{"Малдиви"} + MW{"Малави"} + MX{"Мексико"} + MY{"Малайзия"} + MZ{"Мозамбик"} + NA{"Намибия"} + NC{"Нова Каледония"} + NE{"Нигер"} + NF{"Остров Норфолк"} + NG{"Нигерия"} + NI{"Никарагуа"} + NL{"Холандия"} + NO{"Норвегия"} + NP{"Непал"} + NR{"Науру"} + NU{"Ниуе"} + NZ{"Нова Зеландия"} + OM{"Оман"} + PA{"Панама"} + PE{"Перу"} + PF{"Френска Полинезия"} + PG{"Папуа Нова Гвинея"} + PH{"Филипини"} + PK{"Пакистан"} + PL{"Полша"} + PM{"Сен Пиер и Мигелон"} + PN{"Питкайрн"} + PR{"Пуерто Рико"} + PS{"Палестински територии"} + PT{"Португалия"} + PW{"Палау"} + PY{"Парагвай"} + QA{"Катар"} + RE{"Реюниън"} + RO{"Румъния"} + RU{"Руска Федерация"} + RW{"Руанда"} + SA{"Саудитска Арабия"} + SB{"Соломонови Острови"} + SC{"Сейшели"} + SD{"Судан"} + SE{"Швеция"} + SG{"Сингапур"} + SH{"Света Елена"} + SI{"Словения"} + SJ{"Свалбард и Ян Майен"} + SK{"Словакия"} + SL{"Сиера Леоне"} + SM{"Сан Марино"} + SN{"Сенегал"} + SO{"Сомалия"} + SR{"Суринам"} + ST{"Сао Томе и Принципе"} + SV{"Ел Салвадор"} + SY{"Сирийска Арабска Република"} + SZ{"Суазиленд"} + TC{"Острови Туркс и Кайкос"} + TD{"Чад"} + TF{"Френски Южни Територии"} + TG{"Того"} + TH{"Тайланд"} + TJ{"Таджикистан"} + TK{"Токелау"} + TL{"Източен Тимор"} + TM{"Туркменистан"} + TN{"Тунис"} + TO{"Тонга"} + TR{"Турция"} + TT{"Тринидад и Тобаго"} + TV{"Тувалу"} + TW{"Тайван"} + TZ{"Танзания"} + UA{"Украйна"} + UG{"Уганда"} + UM{"САЩ - външни острови"} + US{"САЩ"} + UY{"Уругвай"} + UZ{"Узбекистан"} + VA{"Свещено море (Ватиканска държава)"} + VC{"Сейнт Винсънт и Гренадини"} + VE{"Венецуела"} + VG{"Британски Вирджински Острови"} + VI{"САЩ, Вирджински Острови"} + VN{"Виетнам"} + VU{"Вануату"} + WF{"Уолис и Футуна"} + WS{"Самоа"} + YE{"Йемен"} + YT{"Мейот"} + YU{"Югославия"} + ZA{"Южна Африка"} + ZM{"Замбия"} + ZW{"Зимбабве"} + } + Currencies{ + ADD{ + "ADD", + "Андорски динар", + } + ADP{ + "ADP", + "Андорска песета", + } + AED{ + "AED", + "Обединени арабски емирства-дирхам", + } + AFA{ + "AFA", + "Афганистански афган (1927-2002)", + } + AFN{ + "Af", + "Афганистански афган", + } + ALK{ + "ALK", + "Албански лек (1946-1961)", + } + ALL{ + "lek", + "Албански лек", + } + ALV{ + "ALV", + "Албански валутен лек", + } + ALX{ + "ALX", + "Албански конвертируем долар", + } + AMD{ + "dram", + "Арменски драм", + } + ANG{ + "NA f.", + "Антилски гулден", + } + AOA{ + "AOA", + "Анголска кванца", + } + AOK{ + "AOK", + "Анголска кванца (1977-1990)", + } + AON{ + "AON", + "Анголска нова кванца (1990-2000)", + } + AOR{ + "AOR", + "Анголска нова кванца (1995-1999)", + } + AOS{ + "AOS", + "Анголско ескудо", + } + ARP{ + "ARP", + "Аржентинско песо (1983-1985)", + } + ARS{ + "Arg$", + "Аржентинско песо", + } + ATS{ + "ATS", + "Австрийски шилинг", + } + AUD{ + "$A", + "Австралийски долар", + } + AUP{ + "AUP", + "Австралийска лира", + } + AWG{ + "AWG", + "Арубски гилдер - о. Аруба", + } + AZM{ + "AZM", + "Азербайджански манат", + } + BAD{ + "BAD", + "Босна и Херцеговина-динар", + } + BAM{ + "KM", + "Босненска конвертируема марка", + } + BAN{ + "BAN", + "Босна и Херцеговина-нов динар", + } + BBD{ + "BDS$", + "Барбейдоски долар", + } + BDT{ + "Tk", + "Бангладешка така", + } + BEC{ + "BEC", + "Белгийски франк (конвертируем)", + } + BEF{ + "BF", + "Белгийски франк", + } + BEL{ + "BEL", + "Белгийски франк (финансов)", + } + BGL{ + "лв", + "BGL", + } + BGM{ + "BGM", + "Български социалистически лев", + } + BGN{ + "лв.", + "BGN", + } + BGO{ + "BGO", + "Български лев (1879-1952)", + } + BGX{ + "BGX", + "Български конвертируем лев", + } + BHD{ + "BD", + "Бахрейнски динар", + } + BIF{ + "Fbu", + "Бурундийски франк", + } + BMD{ + "Ber$", + "Бермудски долар", + } + BMP{ + "BMP", + "Бермудска лира", + } + BND{ + "BND", + "Брунейски долар", + } + BOB{ + "Bs", + "Боливийско боливиано", + } + BOL{ + "BOL", + "Боливийско боливиано (1863-1962)", + } + BOP{ + "BOP", + "Боливийско песо", + } + BRL{ + "R$", + "Бразилски реал", + } + BSD{ + "BSD", + "Бахамски долар", + } + BSP{ + "BSP", + "Бахамска лира", + } + BTN{ + "Nu", + "Бутански нгултрум", + } + BTR{ + "BTR", + "Бутанска рупия", + } + BUR{ + "BUR", + "Бирманска рупия", + } + BWP{ + "BWP", + "Ботсуанска пула", + } + BYB{ + "BYB", + "Беларуска нова рубла (1994-1999)", + } + BYL{ + "BYL", + "Беларуска рубла (1992-1994)", + } + BYR{ + "Rbl", + "Беларуска рубла", + } + BZD{ + "BZ$", + "Белизийски долар", + } + BZH{ + "BZH", + "Британски хондураски долар", + } + CAD{ + "Can$", + "Канадски долар", + } + CDF{ + "CDF", + "Конгоански франк", + } + CHF{ + "SwF", + "Швейцарски франк", + } + CKD{ + "CKD", + "Острови Кук-долар", + } + CLE{ + "CLE", + "Чилийско ескудо", + } + CLP{ + "Ch$", + "Чилийско песо", + } + CNY{ + "Y", + "Китайски ренминби юан", + } + COP{ + "Col$", + "Колумбийско песо", + } + CRC{ + "C", + "Костарикански колон", + } + CSC{ + "CSC", + "Чехословашка крона", + } + CSK{ + "CSK", + "Чехословашка конвертируема крона", + } + CUP{ + "CUP", + "Кубинско песо", + } + CVE{ + "CVEsc", + "Кабо Верде ескудо", + } + CYP{ + "£C", + "Кипърска лира", + } + CZK{ + "CZK", + "Чешка крона", + } + DEM{ + "DEM", + "Германска марка", + } + DJF{ + "DF", + "Джибутски франк", + } + DKK{ + "DKr", + "Датска крона", + } + DOP{ + "RD$", + "Доминиканско песо", + } + DZD{ + "DA", + "Алжирски динар", + } + DZF{ + "DZF", + "Алжирски нов франк", + } + ECS{ + "ECS", + "Еквадорско сукре", + } + EEK{ + "EEK", + "Естонска крона", + } + EGP{ + "EGP", + "Египетска лира", + } + ERN{ + "ERN", + "Еритрейска накфа", + } + ESP{ + "ESP", + "Испанска песета", + } + ETB{ + "Br", + "Етиопски бир", + } + ETD{ + "ETD", + "Етиопски долар", + } + EUR{ + "€", + "Евро", + } + FIM{ + "FIM", + "Финландска марка", + } + FIN{ + "FIN", + "Финландска марка (1860-1962)", + } + FJD{ + "F$", + "Фиджи - долар", + } + FJP{ + "FJP", + "Фиджи - лира", + } + FKP{ + "FKP", + "Фолкландска лира", + } + FRF{ + "FRF", + "Френски франк", + } + GAF{ + "GAF", + "Габон - CFA франк", + } + GBP{ + "£", + "Британска лира", + } + GEL{ + "lari", + "Грузински лари", + } + GHC{ + "GHC", + "Ганайски седи", + } + GHO{ + "GHO", + "Ганайски стари седи", + } + GHP{ + "GHP", + "Ганайска лира", + } + GIP{ + "GIP", + "Гибралтарска лира", + } + GLK{ + "GLK", + "Гренландска крона", + } + GMD{ + "GMD", + "Гамбийски даласи", + } + GMP{ + "GMP", + "Гамбийска лира", + } + GNF{ + "GF", + "Гвинейски франк", + } + GNI{ + "GNI", + "Гвинейски франк (1960-1972)", + } + GPF{ + "GPF", + "Гваделупски франк", + } + GRD{ + "GRD", + "Гръцка драхма", + } + GRN{ + "GRN", + "Гръцка нова драхма", + } + GTQ{ + "Q", + "Гватемалски кветзал", + } + GWP{ + "GWP", + "Гвинея-Бисау песо", + } + GYD{ + "G$", + "Гаянски долар", + } + HKD{ + "HK$", + "Хонгконгски долар", + } + HNL{ + "L", + "Хондураска лемпира", + } + HRD{ + "HRD", + "Хърватски динар", + } + HRK{ + "HRK", + "Хърватска куна", + } + HTG{ + "HTG", + "Хаитски гурд", + } + HUF{ + "Ft", + "Унгарски форинт", + } + IDN{ + "IDN", + "Индонезийска нова рупия", + } + IDR{ + "Rp", + "Индонезийска рупия", + } + IEP{ + "IR£", + "Ирландска лира", + } + ILL{ + "ILL", + "Израелски шекел", + } + ILP{ + "ILP", + "Израелска лира", + } + ILS{ + "ILS", + "Израелски нов шекел", + } + INR{ + "INR", + "Индийска рупия", + } + IQD{ + "ID", + "Иракски динар", + } + IRR{ + "RI", + "Ирански риал", + } + ISK{ + "ISK", + "Исландска крона", + } + ITL{ + "₤", + "Италианска лира", + } + JMD{ + "J$", + "Ямайски долар", + } + JMP{ + "JMP", + "Ямайска лира", + } + JOD{ + "JD", + "Йордански динар", + } + JPY{ + "¥", + "Японска йена", + } + KES{ + "K Sh", + "Кенийски шилинг", + } + KGS{ + "som", + "Киргистански сом", + } + KHO{ + "KHO", + "Камбоджански стар риел", + } + KHR{ + "CR", + "Камбоджански риел", + } + KMF{ + "CF", + "Коморски франк", + } + KPW{ + "KPW", + "Севернокорейски вон", + } + KRW{ + "KRW", + "КНДР вон", + } + KWD{ + "KD", + "Кувейтски динар", + } + KYD{ + "KYD", + "Кайманови острови - долар", + } + KZR{ + "KZR", + "Казахстанска рубла", + } + KZT{ + "T", + "Казахстанско тенге", + } + LAK{ + "LAK", + "Лаоски кип", + } + LBP{ + "LL", + "Ливанска лира", + } + LIF{ + "LIF", + "Лихтенщайнски франк", + } + LKR{ + "SL Re", + "Шриланкска рупия", + } + LNR{ + "LNR", + "Сейлонска рупия", + } + LRD{ + "LRD", + "Либерийски долар", + } + LSL{ + "M", + "Лесотско лоти", + } + LTL{ + "LTL", + "Литовски литаз", + } + LUF{ + "LUF", + "Люксембургски франк", + } + LVL{ + "LVL", + "Латвийски лат", + } + LVR{ + "LVR", + "Латвийска рубла", + } + LYD{ + "LD", + "Либийски динар", + } + LYP{ + "LYP", + "Либийска лира", + } + MAD{ + "MAD", + "Марокански дирхам", + } + MAF{ + "MAF", + "Марокански франк", + } + MDL{ + "MDL", + "Молдовско леу", + } + MGF{ + "MGF", + "Малгашки франк - Мадагаскар", + } + MHD{ + "MHD", + "Маршалски острови-долар", + } + MKD{ + "MDen", + "Македонски денар", + } + MKN{ + "MKN", + "Македонски денар (1992-1993)", + } + MMK{ + "MMK", + "Миянмарски (Бирма) кият", + } + MMX{ + "MMX", + "Миянмарски конвертируем долар", + } + MNT{ + "Tug", + "Монголски тугрик", + } + MOP{ + "MOP", + "Макао - патака", + } + MQF{ + "MQF", + "Мартиника - франк", + } + MRO{ + "UM", + "Мавританска огия", + } + MTL{ + "Lm", + "Малтийска лира", + } + MUR{ + "MUR", + "Маврицийска рупия", + } + MVP{ + "MVP", + "Малдивска рупия - Малдиви", + } + MVR{ + "MVR", + "Малдивска руфия", + } + MWK{ + "MK", + "Малавийска квача", + } + MWP{ + "MWP", + "Малавийска лира", + } + MXN{ + "MEX$", + "Мексиканско ново песо", + } + MXP{ + "MXP", + "Мексиканско сребърно песо (1861-1992)", + } + MYR{ + "RM", + "Малайзийски рингит", + } + MZE{ + "MZE", + "Мозамбикско ескудо", + } + MZM{ + "Mt", + "Мозамбикски метикал", + } + NAD{ + "N$", + "Намибийски долар", + } + NGN{ + "NGN", + "Нигерийска найра", + } + NGP{ + "NGP", + "Нигерийска лира", + } + NIC{ + "NIC", + "Никарагуанска кордоба", + } + NIG{ + "NIG", + "Никарагуанска златна кордоба", + } + NLG{ + "NLG", + "Холандски гулден", + } + NOK{ + "NKr", + "Норвежка крона", + } + NPR{ + "Nrs", + "Непалска рупия", + } + NZD{ + "$NZ", + "Новозеландски долар", + } + NZP{ + "NZP", + "Новозеландска лира", + } + OMR{ + "RO", + "Омански риал", + } + PAB{ + "PAB", + "Панамски балбоа", + } + PEN{ + "PEN", + "Перуански нов сол", + } + PES{ + "PES", + "Перуански сол", + } + PGK{ + "PGK", + "Папуа-новогвинейска кина", + } + PHP{ + "PHP", + "Филипинско песо", + } + PKR{ + "Pra", + "Пакистанска рупия", + } + PLN{ + "Zl", + "Полска злота", + } + PLX{ + "PLX", + "Полски конвентируем долар", + } + PLZ{ + "PLZ", + "Полска злота (1950-1995)", + } + PSP{ + "PSP", + "Палестинска лира", + } + PTE{ + "PTE", + "Португалско ескудо", + } + PYG{ + "PYG", + "Парагвайско гуарани", + } + QAR{ + "QR", + "Катарски риал", + } + ROL{ + "leu", + "Румънска лея", + } + RON{ + "RON", + "Румънска нова лея", + } + RUB{ + "RUB", + "Руска рубла", + } + RUR{ + "RUR", + "Руска рубла (1991-1998)", + } + RWF{ + "RWF", + "Руандски франк", + } + SAR{ + "SRl", + "Саудитскоарабски риал", + } + SBD{ + "SI$", + "Соломонови острови - долар", + } + SCR{ + "SR", + "Сейшелска рупия", + } + SDD{ + "SDD", + "Судански динар", + } + SDP{ + "SDP", + "Суданска лира", + } + SEK{ + "SKr", + "Шведска крона", + } + SGD{ + "S$", + "Сингапурски долар", + } + SHP{ + "SHP", + "Света Елена лира", + } + SIT{ + "SIT", + "Словенски толар", + } + SKK{ + "Sk", + "Словашка крона", + } + SLL{ + "SLL", + "Сиералеонско леоне", + } + SML{ + "SML", + "Сан Марино - лира", + } + SOS{ + "So. Sh.", + "Сомалийски шилинг", + } + SRG{ + "Sf", + "Суринамски гилдер", + } + SSP{ + "SSP", + "Шотландска лира", + } + STD{ + "Db", + "Сао Томе и Принсипи - добра", + } + STE{ + "STE", + "Сао Томе и Принсипи - ескудо", + } + SUN{ + "SUN", + "Съветска нова рубла", + } + SUR{ + "SUR", + "Съветска рубла", + } + SVC{ + "SVC", + "Салвадорски колон", + } + SYP{ + "LS", + "Сирийска лира", + } + SZL{ + "E", + "Свазилендски лилангени", + } + THB{ + "THB", + "Тайландски бат", + } + TJR{ + "TJR", + "Таджикистанска рубла", + } + TJS{ + "TJS", + "Таджикистански сомони", + } + TMM{ + "TMM", + "Туркменистански манат", + } + TND{ + "TND", + "Тунизийски динар", + } + TOP{ + "T$", + "Тонга - па анга", + } + TPE{ + "TPE", + "Тиморско ескудо", + } + TPP{ + "TPP", + "Тиморска патака", + } + TRL{ + "TL", + "Турска лира", + } + TRY{ + "TRY", + "Нова турска лира", + } + TTD{ + "TT$", + "Тринидат и Тобаго - долар", + } + TTO{ + "TTO", + "Тринидат и Тобаго - стар долар", + } + TWD{ + "NT$", + "Тайвански долар", + } + TZS{ + "T Sh", + "Танзанийски шилинг", + } + UAH{ + "UAH", + "Украинска хривня", + } + UAK{ + "UAK", + "Украински карбованец", + } + UGS{ + "UGS", + "Угандийски шилинг (1966-1987)", + } + UGX{ + "U Sh", + "Угандийски нов шилинг", + } + USD{ + "US$", + "САЩ долар", + } + UYP{ + "UYP", + "Уругвайско песо (1975-1993)", + } + UYU{ + "Ur$", + "Уругвайско песо", + } + UZS{ + "UZS", + "Узбекистански сум", + } + VAL{ + "VAL", + "Ватикана - лира", + } + VEB{ + "Be", + "Венесуелски боливар", + } + VND{ + "VND", + "Виетнамски донг", + } + VNN{ + "VNN", + "Виетнамски нов донг", + } + VNS{ + "VNS", + "Виетнамски национален донг", + } + VUV{ + "VT", + "Вануату - вату", + } + WSP{ + "WSP", + "Самоа - лира", + } + WST{ + "WST", + "Самоа - тала", + } + XAF{ + "XAF", + "Буркина Фасо - CFA - франк", + } + XAU{ + "XAU", + "Злато", + } + XCD{ + "EC$", + "Източнокарибски долар - Антигуа", + } + XEU{ + "XEU", + "Еку на ЕИО", + } + XFO{ + "XFO", + "Френски златен франк", + } + XOF{ + "XOF", + "Бенин - CFA франк", + } + XPF{ + "CFPF", + "Френскополинезийски франк", + } + YDD{ + "YDD", + "Йеменски динар", + } + YER{ + "YRl", + "Йеменски риал", + } + YUM{ + "YUM", + "Югославски динар", + } + YUN{ + "YUN", + "Югославски конвертируем динар", + } + ZAL{ + "ZAL", + "Южноафрикански ранд (финансов)", + } + ZAP{ + "ZAP", + "Южноафриканска лира", + } + ZAR{ + "R", + "Южноафрикански ранд", + } + ZMK{ + "ZMK", + "Замбийска квача", + } + ZMP{ + "ZMP", + "Замбийска лира", + } + ZRN{ + "ZRN", + "Заирско ново зайре", + } + ZRZ{ + "ZRZ", + "Заирско зайре", + } + ZWD{ + "Z$", + "Зимбабвийски долар", + } + } + ExemplarCharacters{"[а-ь юяѣѫ]"} + Keys{ + calendar{"Календар"} + collation{"Сортиране"} + currency{"Валути"} + } + Languages{ + ab{"Абкхазски"} + af{"Африканс"} + afa{"Афро-азиатски (други)"} + afh{"Африхили"} + ale{"Алеутски"} + am{"Амхарски"} + ang{"Староанглийски (ca.450-1100)"} + apa{"Езици на апахите"} + ar{"Арабски"} + art{"Изкуствен (други)"} + aus{"Австралийски езици"} + av{"Аварски"} + ay{"Аймара"} + az{"Азербайджански"} + ba{"Башкирски"} + bat{"Прибалтийски (други)"} + be{"Беларуски"} + ber{"берберски"} + bg{"Български"} + bn{"Бенгалски"} + bnt{"Банту"} + bo{"Тибетски"} + br{"Бретонски"} + bs{"Босненски"} + ca{"Каталонски"} + cai{"Централноамерикански индиански (други)"} + car{"Карибски"} + cau{"Кавказски (други)"} + ce{"Чеченски"} + cel{"Келтски (други)"} + chr{"чероки"} + chy{"чейенски"} + co{"Корсикански"} + cpe{"Креолски, от английски (други)"} + cpf{"Креолски, от френски (други)"} + cpp{"Креолски, от португалски (други)"} + crp{"Креолски (други)"} + cs{"Чешки"} + cu{"Църковно славянски"} + cy{"Уелски"} + da{"Датски"} + de{"Немски"} + den{"Славянски"} + dum{"Холандски, средновековен (1050-1350)"} + dv{"Дивехи"} + egy{"Египетски (древен)"} + el{"Гръцки"} + en{"Английски"} + enm{"Английски (1100-1500)"} + eo{"Есперанто"} + es{"Испански"} + et{"Естонски"} + eu{"Баски"} + fa{"Персийски"} + fi{"Фински"} + fiu{"Угрофинска (други)"} + fr{"Френски"} + frm{"Френски (1400-1600)"} + fro{"Френски (842-1400)"} + ga{"Ирландски"} + gd{"Шотландски галски"} + gem{"Германски (други)"} + gmh{"Немски (1050-1500)"} + goh{"Немски (750-1050)"} + got{"Готически"} + grc{"Древногръцки (до 1453)"} + gu{"Гуджарати"} + haw{"Хавайски"} + he{"Иврит"} + hi{"Хинди"} + hit{"Хитски"} + hr{"Хърватски"} + ht{"Хаитянски"} + hu{"Унгарски"} + hy{"Арменски"} + id{"Индонезийски"} + inc{"Индийски (други)"} + ine{"Индо-европейски (други)"} + io{"Идо"} + ira{"Ирански"} + is{"Исландски"} + it{"Италиански"} + ja{"Японски"} + jpr{"еврейско-персийски"} + jrb{"еврейско-арабски"} + jv{"Явански"} + ka{"Грузински"} + kg{"Конгоански"} + ki{"кикуйу"} + kk{"Казахски"} + km{"Кхмерски"} + ko{"Корейски"} + ks{"Кашмирски"} + ku{"Кюрдски"} + ky{"Киргизски"} + la{"Латински"} + lb{"Люксембургски"} + lo{"Лаоски"} + lt{"Литовски"} + lv{"Латвийски"} + mas{"масайски"} + mg{"Малгашки"} + mga{"Ирландски (900-1200)"} + mi{"Маорски"} + mis{"Други езици"} + mk{"Македонски"} + ml{"Малайски"} + mn{"Монголски"} + mo{"Молдовски"} + ms{"Малайски"} + mt{"Малтийски"} + my{"Бирмански"} + nai{"Северноамерикански индиански (други)"} + nap{"Неаполитански"} + ne{"Непалски"} + nl{"Холандски"} + no{"Норвежки"} + nub{"Нубийски езици"} + ny{"Чинянджа"} + os{"Осетски"} + ota{"Турски, отомански (1500-1928)"} + oto{"Старотурски езици"} + pa{"Пенджабски"} + paa{"Папуаски (други)"} + peo{"Староперсийски (600-400 пр.н.е.)"} + phi{"Филипински (други)"} + phn{"Финикийски"} + pl{"Полски"} + pro{"Провансалски (to 1500)"} + ps{"Пущу"} + pt{"Португалски"} + qu{"Кечуа"} + raj{"Раджастански"} + rm{"Реторомански"} + rn{"Рунди"} + ro{"Румънски"} + roa{"Романски (други)"} + ru{"Руски"} + rw{"Киняруанда"} + sa{"Санкскритски"} + sah{"Якутски"} + sai{"Южноамерикански индиански (други)"} + sc{"Сардински"} + sem{"Семитски (други)"} + sg{"Санго"} + sga{"Староирландски (до 900)"} + sh{"Сърбохърватски"} + si{"Синхалски"} + sk{"Словашки"} + sl{"Словенски"} + sla{"Славянски (други)"} + sm{"Самоански"} + so{"Сомалийски"} + sq{"Албански"} + sr{"Сръбски"} + ss{"Суази"} + st{"Сесуто"} + sux{"Шумерски"} + sv{"Шведски"} + sw{"Суахили"} + syr{"Сирийски"} + ta{"Тамилски"} + tai{"Тайландски (други)"} + te{"Телугу"} + tg{"Таджикски"} + th{"Таи"} + tk{"Туркменски"} + tr{"Турски"} + tt{"Татарски"} + tut{"Алтайски (други)"} + ty{"Таитянски"} + uk{"Украински"} + und{"Неопределен"} + ur{"Урду"} + uz{"Узбекски"} + vi{"Виетнамски"} + zh{"Китайски"} + zu{"Зулуски"} + } + LocaleScript{ + "Cyrl", + } + NumberElements{ + ",", + " ", + ";", + "%", + "0", + "#", + "-", + "E", + "‰", + "∞", + "�", + "+", + } + Scripts{ + Arab{"Арабска"} + Armn{"Арменска"} + Beng{"Бенгалска"} + Brai{"Брайлова"} + Cher{"Чероки"} + Copt{"Коптска"} + Cyrl{"Кирилица"} + Deva{"Деванагари"} + Ethi{"Етиопска"} + Geor{"Грузинска"} + Goth{"Готическа"} + Grek{"Гръцка"} + Gujr{"Гуджарати"} + Hang{"Корейска"} + Hani{"Китайска"} + Hans{"Опростен китайски"} + Hant{"Традиционен китайски"} + Hebr{"Иврит"} + Hira{"Японски хирагана"} + Kana{"Японски катакана"} + Khmr{"Кхмерска"} + Laoo{"Лаоска"} + Latn{"Латинска"} + Mong{"Монголска"} + Mymr{"Бирманска"} + Runr{"Руническа"} + Taml{"Тамилска"} + Telu{"Телугу"} + Thai{"Таи"} + Tibt{"Тибетска"} + Zyyy{"Обща"} + } + Types{ + calendar{ + buddhist{"Будистки календар"} + chinese{"Китайски календар"} + gregorian{"Григориански календар"} + hebrew{"Еврейски календар"} + islamic{"Ислямски календар"} + islamic-civil{"Ислямски цивилен календар"} + japanese{"Японски календар"} + } + collation{ + direct{"Директно"} + phonebook{"Азбучен ред"} + pinyin{"Сортиране Pinyin"} + stroke{"Сортиране по щрих"} + traditional{"Традиционно"} + } + } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm:ss", + "HH:mm", + "dd MMMM yyyy, EEEE", + "dd MMMM yyyy", + "dd.MM.yyyy", + "dd.MM.yy", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "нед.", + "пон.", + "вт.", + "ср.", + "четв.", + "пет.", + "съб.", + } + narrow{ + "н", + "п", + "в", + "с", + "ч", + "п", + "с", + } + wide{ + "неделя", + "понеделник", + "вторник", + "сряда", + "четвъртък", + "петък", + "събота", + } + } + } + eras{ + abbreviated{ + "пр.н.е.", + "н.е.", + } + } + monthNames{ + format{ + abbreviated{ + "ян.", + "фев.", + "март", + "апр.", + "май", + "юни", + "юли", + "авг.", + "сеп.", + "окт.", + "ноем.", + "дек.", + } + narrow{ + "я", + "ф", + "м", + "а", + "м", + "ю", + "ю", + "а", + "с", + "о", + "н", + "д", + } + wide{ + "януари", + "февруари", + "март", + "април", + "май", + "юни", + "юли", + "август", + "септември", + "октомври", + "ноември", + "декември", + } + } + } + } + } + localPatternChars{"GanjkHmsSEDFwWxhKzAeugXZ"} + zoneStrings{ + { + "America/Los_Angeles", + "Тихоокеанска часова зона", + "PST", + "Тихоокеанска лятна часова зона", + "PDT", + "Лос Анжелис", + } + { + "America/Denver", + "Американска планинска часова зона", + "MST", + "Американска планинска лятна часова зона", + "MDT", + "Денвър", + } + { + "America/Phoenix", + "Американска планинска часова зона", + "MST", + "Американска планинска часова зона", + "MST", + "Финикс", + } + { + "America/Chicago", + "Американска централна часова зона", + "CST", + "Американска централна лятна часова зона", + "CDT", + "Чикаго", + } + { + "America/New_York", + "Американска източна часова зона", + "EST", + "Американска източна лятна часова зона", + "EDT", + "Ню Йорк", + } + { + "America/Indianapolis", + "Американска източна часова зона", + "EST", + "Американска източна часова зона", + "EST", + "Индианополис", + } + { + "Pacific/Honolulu", + "Часова зона Хавай", + "HST", + "Лятна часова зона Хавай", + "HST", + "Хонолулу", + } + { + "America/Anchorage", + "Часова зона Аляска", + "AST", + "Лятна часова зона Аляска", + "ADT", + "Anchorage", + } + { + "America/Halifax", + "Атлантическа часова зона", + "AST", + "Атлантическа лятна часова зона", + "ADT", + "Халифакс", + } + { + "America/St_Johns", + "Часова зона Нюфаундленд", + "CNT", + "Лятна часова зона Нюфаундленд", + "CDT", + "Сейнт Джоунс", + } + { + "Europe/Paris", + "Централноевропейска часова зона", + "CET", + "Централноевропеска лятна часова зона", + "CEST", + "Париж", + } + { + "Etc/GMT", + "Часова зона Гринуич", + "GMT", + "Часова зона Гринуич", + "GMT", + "Лондон", + } + { + "Africa/Casablanca", + "Часова зона Гринуич", + "GMT", + "Часова зона Гринуич", + "GMT", + "Казабланка", + } + { + "Asia/Jerusalem", + "Часова зона Израел", + "IST", + "Лятна часова зона Израел", + "IDT", + "Йерусалим", + } + { + "Asia/Tokyo", + "Японска часова зона", + "JST", + "Японска часова зона", + "JST", + "Токио", + } + { + "Europe/Bucharest", + "Източноевропейска часова зона", + "EET", + "Източноевропейска лятна часова зона", + "EEST", + "Букурещ", + } + { + "Asia/Shanghai", + "Китайска часова зона", + "CTT", + "Китайска часова зона", + "CDT", + "Шанхай", + } + } +} diff --git a/icuSources/data/locales/bg_BG.txt b/icuSources/data/locales/bg_BG.txt index fc590e47..377f913f 100644 --- a/icuSources/data/locales/bg_BG.txt +++ b/icuSources/data/locales/bg_BG.txt @@ -1,19 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/bg_BG.xml // * // *************************************************************************** - -bg_BG { - Version { "2.0" } -// LocaleString { "bg_BG" } - NumberPatterns { +bg_BG{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "#,##0.00 \u00A4;-#,##0.00 \u00A4", + "#,##0.00 ¤;-#,##0.00 ¤", "#,##0%", "#E0", } -// ShortCountry { "BGR" } - LocaleID:int { 0x0402 } + Version{"1.2"} } diff --git a/icuSources/data/locales/bn.txt b/icuSources/data/locales/bn.txt index ec465f68..6c8ff63e 100644 --- a/icuSources/data/locales/bn.txt +++ b/icuSources/data/locales/bn.txt @@ -1,79 +1,202 @@ -// *************************************************************************** -// * -// * Copyright (C) 2001-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// * Generated from - Universal Locales for Linux Project -// *************************************************************************** - -bn { - Version{ "2.0" } - Languages { - bn { "\u09ac\u09be\u0982\u09b2\u09be" } - } - Countries { - IN { "\u09ad\u09be\u09b0\u09a4" } - } - AmPmMarkers { - "\u09AA\u09C2\u09B0\u09CD\u09AC\u09BE\u09B9\u09CD\u09A3", - "\u0985\u09AA\u09B0\u09BE\u09B9\u09CD\u09A3", - } - DayAbbreviations { - "\u09B0\u09AC\u09BF", - "\u09B8\u09CB\u09AE", - "\u09AE\u0999\u0997\u09B2", - "\u09AC\u09C1\u09A7", - "\u09AC\u09C3\u09B9\u09B8\u09CD\u09AA\u09A4\u09BF", - "\u09B6\u09C1\u0995\u09CD\u09B0", - "\u09B6\u09A8\u09BF", - } - DayNames { - "\u09B0\u09AC\u09BF\u09AC\u09BE\u09B0", - "\u09B8\u09CB\u09AE\u09AC\u09BE\u09B0", - "\u09AE\u0999\u0997\u09B2\u09AC\u09BE\u09B0", - "\u09AC\u09C1\u09A7\u09AC\u09BE\u09B0", - "\u09AC\u09C3\u09B9\u09B8\u09CD\u09AA\u09A4\u09BF\u09AC\u09BE\u09B0", - "\u09B6\u09C1\u0995\u09CD\u09B0\u09AC\u09BE\u09B0", - "\u09B6\u09A8\u09BF\u09AC\u09BE\u09B0", - } - MonthAbbreviations { - "\u099C\u09BE\u09A8\u09C1\u09DF\u09BE\u09B0\u09C0", - "\u09AB\u09C7\u09AC\u09CD\u09B0\u09C1\u09DF\u09BE\u09B0\u09C0", - "\u09AE\u09BE\u09B0\u09CD\u099A", - "\u098F\u09AA\u09CD\u09B0\u09BF\u09B2", - "\u09AE\u09C7", - "\u099C\u09C1\u09A8", - "\u099C\u09C1\u09B2\u09BE\u0987", - "\u0986\u0997\u09B8\u09CD\u099F", - "\u09B8\u09C7\u09AA\u09CD\u099F\u09C7\u09AE\u09CD\u09AC\u09B0", - "\u0985\u0995\u09CD\u099F\u09CB\u09AC\u09B0", - "\u09A8\u09AD\u09C7\u09AE\u09CD\u09AC\u09B0", - "\u09A1\u09BF\u09B8\u09C7\u09AE\u09CD\u09AC\u09B0", - } - MonthNames { - "\u099C\u09BE\u09A8\u09C1\u09DF\u09BE\u09B0\u09C0", - "\u09AB\u09C7\u09AC\u09CD\u09B0\u09C1\u09DF\u09BE\u09B0\u09C0", - "\u09AE\u09BE\u09B0\u09CD\u099A", - "\u098F\u09AA\u09CD\u09B0\u09BF\u09B2", - "\u09AE\u09C7", - "\u099C\u09C1\u09A8", - "\u099C\u09C1\u09B2\u09BE\u0987", - "\u0986\u0997\u09B8\u09CD\u099F", - "\u09B8\u09C7\u09AA\u09CD\u099F\u09C7\u09AE\u09CD\u09AC\u09B0", - "\u0985\u0995\u09CD\u099F\u09CB\u09AC\u09B0", - "\u09A8\u09AD\u09C7\u09AE\u09CD\u09AC\u09B0", - "\u09A1\u09BF\u09B8\u09C7\u09AE\u09CD\u09AC\u09B0", - } - //LocaleString { "bn" } - LocaleID:int { 0x45 } - LocaleScript:array{ - "Beng" - } - ExemplarCharacters{"[[:Beng:]\u200c\u200d]"} - - // Currency display names - Currencies { - INR { "\u099F\u09BE\u0995\u09BE", "INR" } - BDT { "\u09F3", "BDT" } // Bangladesh Taka - } -} +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/bn.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/bn.xml + */ +bn{ + Countries{ + AF{"আফগানিস্তান"} + AL{"আলব্যানিয়া"} + AM{"আর্মেনিয়া"} + AR{"আর্জেণ্টাইনা"} + AT{"অস্ট্রিয়া"} + AU{"অস্ট্রেলিয়া"} + AZ{"আজারবাইজান"} + BD{"বাংলাদেশ"} + BE{"বেল্জিয়ম"} + BG{"বুলগেরিয়া"} + BO{"বোলিভিয়া"} + BR{"ব্রাজিল"} + BT{"ভুটান"} + BY{"বেলোরুশিয়া"} + CG{"কঙ্গো"} + CH{"সুইজর্লণ্ড"} + CL{"চিলি"} + CN{"চীন"} + CO{"কোলোম্বিয়া"} + CR{"কোস্টারিকা"} + CU{"কিউবা"} + CZ{"চেকিয়া"} + DE{"জার্মানি"} + DK{"ডেন্মার্ক"} + DZ{"এলজিরিয়া"} + EC{"ইকোয়াডর"} + EE{"এস্তোনিয়া"} + EG{"মিশর"} + EH{"পশ্চিমী সাহারা"} + ES{"স্পেন"} + ET{"ইফিওপিয়া"} + FI{"ফিন্ল্যাণ্ড"} + FR{"ফ্রান্স"} + GB{"গ্রেটবৃটেন"} + GE{"জর্জিয়া"} + GH{"গানা"} + GR{"গ্রীস্"} + GT{"গোয়াটিমালা"} + GY{"গিয়ানা"} + HN{"হণ্ডুরাস"} + HU{"হাঙ্গেরি"} + ID{"ইন্দোনেশিয়া"} + IE{"আয়ার্লণ্ড"} + IL{"ইস্রায়েল"} + IN{"ভারত"} + IQ{"ইরাক"} + IR{"ইরান"} + IS{"আইসলণ্ড"} + IT{"ইতালী"} + JM{"জ্যামেকা"} + JO{"জর্ডন"} + JP{"জাপান"} + KE{"কেনিয়া"} + KG{"কির্গিজিয়া"} + KH{"কাম্বোজ"} + KR{"দক্ষিণ কোরিয়া"} + KZ{"কাজাকস্থান"} + LA{"লাওস"} + LB{"লেবানন"} + LK{"শ্রীলঙ্কা"} + LR{"লাইবিরিয়া"} + LT{"লিত্ভা"} + LU{"লাক্সেমবার্গ"} + LV{"লাত্ভিয়া"} + LY{"লিবিয়া"} + MA{"মোরক্কো"} + MD{"মোল্দাভিয়া"} + MG{"মাদাগাস্কার"} + MN{"মঙ্গোলিয়া"} + MX{"মক্সিকো"} + MY{"মাল্যাশিয়া"} + NI{"নিকারাগোয়া"} + NL{"হলণ্ড"} + NO{"নরওয়ে"} + NP{"নেপাল"} + NZ{"নিউ জিলণ্ড"} + PA{"পানামা"} + PE{"পিরু"} + PH{"ফিলিপাইন"} + PK{"পাকিস্তান"} + PL{"পোল্যাণ্ড"} + PT{"পর্তুগাল"} + PY{"প্যারাগোয়ে"} + RO{"রুমানিয়া"} + RU{"রাশিয়া"} + SA{"সাউদি আরব"} + SD{"সুদান"} + SE{"সুইডেন"} + SG{"সিঙ্গাপুর"} + SK{"শ্লোভাকিয়া"} + SO{"সোমালি"} + SV{"সালভেডর"} + SY{"সিরিয়া"} + TH{"থাই"} + TJ{"তাজিকস্থান"} + TM{"তুর্কমেনিয়া"} + TN{"টিউনিস্"} + TR{"তুরস্ক"} + TW{"তাইওয়ান"} + UA{"ইউক্রেইন"} + US{"মার্কিন যুক্তরাষ্ট্র"} + UY{"উরুগোয়ে"} + UZ{"উজ্বেকিস্থান"} + VE{"ভেনেজুয়েলা"} + VN{"ভিয়েতনাম"} + YE{"ইমেন"} + ZA{"দক্ষিণ আফ্রিকা"} + } + Currencies{ + BDT{ + "৳", + "BDT", + } + INR{ + "টাকা", + "INR", + } + } + ExemplarCharacters{"[[:Beng:]‌‍]"} + Languages{ + bn{"বাংলা"} + } + LocaleScript{ + "Beng", + } + Version{"1.2"} + calendar{ + gregorian{ + AmPmMarkers{ + "পূর্বাহ্ণ", + "অপরাহ্ণ", + } + dayNames{ + format{ + abbreviated{ + "রবি", + "সোম", + "মঙ্গল", + "বুধ", + "বৃহস্পতি", + "শুক্র", + "শনি", + } + wide{ + "রবিবার", + "সোমবার", + "মঙ্গলবার", + "বুধবার", + "বৃহষ্পতিবার", + "শুক্রবার", + "শনিবার", + } + } + } + monthNames{ + format{ + abbreviated{ + "জানুয়ারী", + "ফেব্রুয়ারী", + "মার্চ", + "এপ্রিল", + "মে", + "জুন", + "জুলাই", + "আগস্ট", + "সেপ্টেম্বর", + "অক্টোবর", + "নভেম্বর", + "ডিসেম্বর", + } + wide{ + "জানুয়ারী", + "ফেব্রুয়ারী", + "মার্চ", + "এপ্রিল", + "মে", + "জুন", + "জুলাই", + "আগস্ট", + "সেপ্টেম্বর", + "অক্টোবর", + "নভেম্বর", + "ডিসেম্বর", + } + } + } + } + } +} diff --git a/icuSources/data/locales/bn_IN.txt b/icuSources/data/locales/bn_IN.txt index 88a5f8fc..655768fb 100644 --- a/icuSources/data/locales/bn_IN.txt +++ b/icuSources/data/locales/bn_IN.txt @@ -1,43 +1,42 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 2001-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/bn_IN.xml // * -// * Generated from - Universal Locales for Linux Project // *************************************************************************** - -bn_IN { - Version{ "2.0" } - DateTimePatterns { - "h:mm:ss a z", - "h:mm:ss a z", - "h:mm:ss a", - "h:mm a", - "EEEE d MMMM yyyy", - "d MMMM yyyy", - "dd-MM-yyyy", - "d-M-yy", - "{1} {0}" - } -// NumberElements { -// ".", -// ",", -// ";", -// "%", -// "0", -// "#", -// "-", -// "E", -// "\u2030", -// "\u221E", -// "\uFFFD", -// } - NumberPatterns { +bn_IN{ + NumberPatterns{ "##,##,##0.###;-##,##,##0.###", - "\u00A4 ##,##,##0.00;-\u00A4 ##,##,##0.00", + "¤ ##,##,##0.00;-¤ ##,##,##0.00", "##,##,##0%", "#E0", } -// LocaleString { "bn_IN" } - LocaleID:int { 0x0445 } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "h:mm:ss a z", + "h:mm:ss a z", + "h:mm:ss a", + "h:mm a", + "EEEE d MMMM yyyy", + "d MMMM yyyy", + "dd-MM-yyyy", + "d-M-yy", + "{1} {0}", + } + weekend:intvector{ + 1, + 0, + 1, + 86400000, + } + } + } } diff --git a/icuSources/data/locales/ca.txt b/icuSources/data/locales/ca.txt index b087905d..744cb8df 100644 --- a/icuSources/data/locales/ca.txt +++ b/icuSources/data/locales/ca.txt @@ -1,84 +1,370 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ca.xml // * // *************************************************************************** - -ca { - Version { "2.0" } - CollationElements { - Version { "1.0" } - Sequence { "[backwards 2]" - "&C < ch <<< Ch <<< CH" - "&L < ll <<< l\u00b7l <<< Ll <<< L\u00b7l <<< LL <<< L\u00b7L" } - } - Countries { - ES { "Espanya" } - } - DateTimePatterns { - "HH:mm:ss z", - "HH:mm:ss z", - "HH:mm:ss", - "HH:mm", - "EEEE dd MMMM yyyy", - "d MMMM yyyy", - "dd/MM/yyyy", - "dd/MM/yy", - "{1} {0}", - } - DayAbbreviations { - "dg.", - "dl.", - "dt.", - "dc.", - "dj.", - "dv.", - "ds.", +/** + * ICU source: ../../../locale/icu/main/ca.xml + */ +ca{ + Countries{ + AD{"Andorra"} + AE{"Unió dels Emirats Àrabs"} + AF{"Afganistan"} + AI{"Anguilla"} + AL{"Albània"} + AM{"Armènia"} + AN{"Antilles Holandeses"} + AO{"Angola"} + AR{"Argentina"} + AT{"Âustria"} + AU{"Austràlia"} + AW{"Aruba"} + AZ{"Azerbaidjan"} + BA{"Bòsnia i Hercegovina"} + BB{"Barbados"} + BD{"Bangla Desh"} + BE{"Bèlgica"} + BF{"Burkina Faso"} + BG{"Bulgària"} + BH{"Bahrain"} + BI{"Burundi"} + BJ{"Benin"} + BM{"Bermudes"} + BN{"Brunei"} + BO{"Bolívia"} + BR{"Brasil"} + BS{"Bahames"} + BT{"Bhutan"} + BW{"Botswana"} + BY{"Bielorússia"} + BZ{"Belize"} + CA{"Canadà"} + CF{"República Centrafricana"} + CG{"Congo"} + CH{"Switzerland"} + CI{"Costa d’Ivori"} + CL{"Xile"} + CM{"Camerun"} + CN{"Xina"} + CO{"Colòmbia"} + CR{"Costa Rica"} + CU{"Cuba"} + CV{"Cap Verd"} + CY{"Xipre"} + CZ{"República Txeca"} + DE{"Alemanya"} + DJ{"Djibouti"} + DK{"Dinamarca"} + DM{"Dominica"} + DO{"República Dominicana"} + DZ{"Algèria"} + EC{"Equador"} + EE{"Estònia"} + EG{"Egipte"} + EH{"Sàhara Occidental"} + ER{"Eritrea"} + ES{"Espanya"} + ET{"Etiòpia"} + FI{"Finlàndia"} + FJ{"Fiji"} + FM{"Micronèsia"} + FR{"França"} + GA{"Gabon"} + GB{"Regne Unit"} + GE{"Geòrgia"} + GF{"Guaiana Francesa"} + GH{"Ghana"} + GM{"Gàmbia"} + GN{"Guinea"} + GP{"Guadeloupe"} + GQ{"Guinea Equatorial"} + GR{"Grècia"} + GT{"Guatemala"} + GW{"Guinea Bissau"} + GY{"Guyana"} + HN{"Hondures"} + HR{"Croàcia"} + HT{"Haití"} + HU{"Hongria"} + ID{"Indonèsia"} + IE{"Irlanda"} + IL{"Israel"} + IN{"Índia"} + IQ{"Iraq"} + IR{"Iran"} + IS{"Islàndia"} + IT{"Itàlia"} + JM{"Jamaica"} + JO{"Jordània"} + JP{"Japó"} + KE{"Kenya"} + KG{"Kirgizistan"} + KH{"Cambodja"} + KI{"Kiribati"} + KM{"Comores"} + KP{"Corea del Nord"} + KR{"Corea del Sud"} + KW{"Kuwait"} + KZ{"Kazakhstan"} + LA{"Laos"} + LB{"Líban"} + LI{"Liechtenstein"} + LK{"Sri Lanka"} + LR{"Libèria"} + LS{"Lesotho"} + LT{"Lituània"} + LU{"Luxemburg"} + LV{"Letònia"} + LY{"Líbia"} + MA{"Marroc"} + MC{"Mònaco"} + MD{"Moldàvia"} + MG{"Madagascar"} + MK{"Macedònia"} + ML{"Mali"} + MM{"Myanmar"} + MN{"Mongòlia"} + MQ{"Martinica"} + MR{"Mauritània"} + MS{"Montserrat"} + MT{"Malta"} + MU{"Maurici"} + MX{"Mèxic"} + MY{"Malàisia"} + MZ{"Moçambic"} + NA{"Namíbia"} + NC{"Nova Caledònia"} + NE{"Níger"} + NG{"Nigèria"} + NI{"Nicaragua"} + NL{"Països Baixos"} + NO{"Noruega"} + NP{"Nepal"} + NU{"Niue"} + NZ{"Nova Zelanda"} + OM{"Oman"} + PA{"Panamà"} + PE{"Perú"} + PF{"Polinèsia Francesa"} + PG{"Papua Nova Guinea"} + PH{"Filipines"} + PK{"Pakistan"} + PL{"Polònia"} + PR{"Puerto Rico"} + PT{"Portugal"} + PY{"Paraguai"} + QA{"Qatar"} + RO{"Romania"} + RU{"Rússia"} + RW{"Rwanda"} + SA{"Aràbia Saudí"} + SC{"Seychelles"} + SD{"Sudan"} + SE{"Suècia"} + SG{"Singapur"} + SI{"Eslovènia"} + SK{"Eslovàquia"} + SL{"Sierra Leone"} + SN{"Senegal"} + SO{"Somàlia"} + SP{"Sèrbia"} + SR{"Surinam"} + SV{"El Salvador"} + SY{"Síria"} + SZ{"Swazilàndia"} + TD{"Txad"} + TF{"Territoris Meridionals Francesos"} + TG{"Togo"} + TH{"Tailàndia"} + TJ{"Tadjikistan"} + TK{"Tokelau"} + TL{"Timor"} + TM{"Turkmenistan"} + TN{"Tunísia"} + TO{"Tonga"} + TR{"Turquia"} + TT{"Trinitat i Tobago"} + TW{"Taiwan"} + TZ{"Tanzània"} + UA{"Ucraïna"} + UG{"Uganda"} + US{"Estats Units"} + UY{"Uruguai"} + UZ{"Uzbekistan"} + VA{"Vaticà"} + VE{"Veneçuela"} + VG{"Illes Verges Britàniques"} + VI{"Illes Verges dels USA"} + VN{"Vietnam"} + VU{"Vanuatu"} + YE{"Iemen"} + YT{"Mayotte"} + YU{"Iugoslàvia"} + ZA{"Sud-àfrica"} + ZM{"Zàmbia"} + ZW{"Zimbabwe"} } - DayNames { - "diumenge", - "dilluns", - "dimarts", - "dimecres", - "dijous", - "divendres", - "dissabte", - } - Languages { - ca { "catal\u00E0" } + Currencies{ + ESP{ + "₧", + "ESP", + { + "¤ #,##0;-¤ #,##0", + ",", + ".", + } + } } - LocaleID:int { 0x03 } -// LocaleString { "ca" } - MonthAbbreviations { - "gen.", - "feb.", - "mar\u00E7", - "abr.", - "maig", - "juny", - "jul.", - "ag.", - "set.", - "oct.", - "nov.", - "des.", + ExemplarCharacters{"[a-z é í ó ú à è ò ï ü ŀ ç ñ]"} + Languages{ + aa{"àfar"} + ab{"abkhaz"} + af{"afrikaans"} + am{"amhàric"} + ar{"ârab"} + as{"assamès"} + ay{"aimara"} + az{"àzeri"} + ba{"baixkir"} + be{"bielorús"} + bg{"búlgar"} + bh{"bihari"} + bi{"bislama"} + bn{"bengalí"} + bo{"tibetà"} + br{"bretó"} + ca{"català"} + co{"cors"} + cs{"txec"} + cy{"gal·lès"} + da{"danès"} + de{"alemany"} + dz{"bhutanès"} + el{"grec"} + en{"anglès"} + eo{"esperanto"} + es{"espanyol"} + et{"estonià"} + eu{"basc"} + fa{"persa"} + fi{"finès"} + fj{"fijià"} + fo{"feroès"} + fr{"francès"} + fy{"frisó"} + ga{"irlandès"} + gd{"escocès"} + gl{"gallec"} + gn{"guaraní"} + gu{"gujarati"} + ha{"hausa"} + he{"hebreu"} + hi{"hindi"} + hr{"croat"} + hu{"hongarès"} + hy{"armeni"} + ia{"interlingua"} + id{"indonesi"} + ie{"interlingue"} + ik{"inupiak"} + is{"islandès"} + it{"italià"} + iu{"inuktitut"} + ja{"japonès"} + jv{"javanès"} + ka{"georgià"} + kk{"kazakh"} + kl{"greenlandès"} + km{"cambodjà"} + kn{"kannada"} + ko{"coreà"} + ks{"caixmiri"} + ku{"kurd"} + ky{"kirguís"} + la{"llatí"} + ln{"lingala"} + lo{"laosià"} + lt{"lituà"} + lv{"letó"} + mg{"malgaix"} + mi{"maori"} + mk{"macedoni"} + ml{"malaialam"} + mn{"mongol"} + mo{"moldau"} + mr{"marathi"} + ms{"malai"} + mt{"maltès"} + my{"birmà"} + na{"nauruà"} + ne{"nepalès"} + nl{"neerlandès"} + no{"noruec"} + oc{"occità"} + om{"oromo (afan)"} + or{"oriya"} + pa{"panjabi"} + pl{"polonès"} + ps{"paixto"} + pt{"portuguès"} + qu{"quètxua"} + rm{"retoromànic"} + rn{"kirundi"} + ro{"romanès"} + ru{"rus"} + rw{"kinyarwanda"} + sa{"sànscrit"} + sd{"sindhi"} + sg{"sango"} + sh{"serbo-croat"} + si{"sinhalès"} + sk{"eslovac"} + sl{"eslovè"} + sm{"samoà"} + sn{"shona"} + so{"somali"} + sq{"albanès"} + sr{"serbi"} + ss{"siswati"} + st{"sotho"} + su{"sundanès"} + sv{"suec"} + sw{"swahili"} + ta{"tàmil"} + te{"telugu"} + tg{"tadjik"} + th{"thai"} + ti{"tigrinya"} + tk{"turcman"} + tl{"tagàlog"} + tn{"tswana"} + to{"tonga"} + tr{"turc"} + ts{"tsonga"} + tt{"tàtar"} + tw{"twi"} + ug{"uigur"} + uk{"ucraïnès"} + ur{"urdú"} + uz{"uzbek"} + vi{"vietnamita"} + vo{"volapuk"} + wo{"wòlof"} + xh{"xosa"} + yi{"jiddish"} + yo{"ioruba"} + za{"zhuang"} + zh{"xinés"} + zu{"zulu"} } - MonthNames { - "gener", - "febrer", - "mar\u00E7", - "abril", - "maig", - "juny", - "juliol", - "agost", - "setembre", - "octubre", - "novembre", - "desembre", + LocaleScript{ + "Latn", } - NumberElements { + NumberElements{ ",", ".", ";", @@ -87,30 +373,84 @@ ca { "#", "-", "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", + "‰", + "∞", + "�", + "+", } -// ShortLanguage { "cat" } - localPatternChars { "GuMtkHmsSEDFwWahKzUe" } - zoneStrings { - { - "Africa/Casablanca", - "GMT", - "GMT", - "GMT", - "GMT", + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "HH:mm:ss z", + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm", + "EEEE dd MMMM yyyy", + "d MMMM yyyy", + "dd/MM/yyyy", + "dd/MM/yy", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "dg.", + "dl.", + "dt.", + "dc.", + "dj.", + "dv.", + "ds.", + } + wide{ + "diumenge", + "dilluns", + "dimarts", + "dimecres", + "dijous", + "divendres", + "dissabte", + } + } + } + monthNames{ + format{ + abbreviated{ + "gen.", + "feb.", + "març", + "abr.", + "maig", + "juny", + "jul.", + "ag.", + "set.", + "oct.", + "nov.", + "des.", + } + wide{ + "gener", + "febrer", + "març", + "abril", + "maig", + "juny", + "juliol", + "agost", + "setembre", + "octubre", + "novembre", + "desembre", + } + } + } } } -// LocaleScript{ -// "Latn", // ISO 15924 Name -// } - ExemplarCharacters { "[a-z \u00e9 \u00ed \u00f3 \u00fa \u00e0 \u00e8 \u00f2 \u00ef \u00fc \u0140 \u00e7 \u00f1]" } - - - // Currency display names - Currencies { - ESP { "\u20A7", "ESP" } // Spanish Peseta - } + localPatternChars{"GuMtkHmsSEDFwWahKzUeygAZ"} } diff --git a/icuSources/data/locales/ca_ES.txt b/icuSources/data/locales/ca_ES.txt index b60a37a7..8ce16644 100644 --- a/icuSources/data/locales/ca_ES.txt +++ b/icuSources/data/locales/ca_ES.txt @@ -1,23 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ca_ES.xml // * // *************************************************************************** - -ca_ES { - Version{ "2.0" } - DateTimeElements:intvector { - 2, - 1, - } - NumberPatterns { +ca_ES{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "#,##0.00 \u00A4;-#,##0.00 \u00A4", + "#,##0.00 ¤;-#,##0.00 ¤", "#,##0%", "#E0", } -// LocaleString { "ca_ES" } -// ShortCountry { "ESP" } - LocaleID:int { 0x0403 } + Version{"1.2"} } diff --git a/icuSources/data/locales/ca_ES_PREEURO.txt b/icuSources/data/locales/ca_ES_PREEURO.txt deleted file mode 100644 index dc39ca9f..00000000 --- a/icuSources/data/locales/ca_ES_PREEURO.txt +++ /dev/null @@ -1,16 +0,0 @@ -// *************************************************************************** -// * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -ca_ES_PREEURO { - Version{ "2.0" } - NumberPatterns { - "#,##0.###;#,##0.###", - "\u00A4 #,##0;-\u00A4 #,##0", - "#,##0%", - "#E0", - } -} diff --git a/icuSources/data/locales/cs.txt b/icuSources/data/locales/cs.txt index 39dfff8f..f468c07f 100644 --- a/icuSources/data/locales/cs.txt +++ b/icuSources/data/locales/cs.txt @@ -1,123 +1,2157 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2005 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/cs.xml // * // *************************************************************************** - -cs { - Version{ "2.0" } - AmPmMarkers { - "dop.", - "odp.", - } - CollationElements { - Version { "1.0" } - Sequence { "& C < c\u030C <<< C\u030C& H < " - "ch <<< cH <<< Ch <<< CH & R < r\u030C <<< R\u030C& S < s\u030C <<< S\u030C& Z < z\u030C <<<" - " Z\u030C" } - } - Countries { - CZ { "\u010Cesk\u00E1 republika" } - } - DateTimePatterns { - "H:mm:ss z", - "H:mm:ss z", - "H:mm:ss", - "H:mm", - "EEEE, d. MMMM yyyy", - "d. MMMM yyyy", - "d.M.yyyy", - "d.M.yy", - "{1} {0}", +/** + * ICU source: ../../../locale/icu/main/cs.xml + */ +cs{ + Countries{ + AD{"Andorra"} + AE{"Spojené arabské emiráty"} + AF{"Afghánistán"} + AG{"Antigua a Barbuda"} + AI{"Anguila"} + AL{"Albánie"} + AM{"Arménie"} + AN{"Nizozemské Antily"} + AO{"Angola"} + AQ{"Antarktida"} + AR{"Argentina"} + AS{"Americká Samoa"} + AT{"Rakousko"} + AU{"Austrálie"} + AW{"Aruba"} + AZ{"Ázerbájdžán"} + BA{"Bosna a Hercegovina"} + BB{"Barbados"} + BD{"Bangladéš"} + BE{"Belgie"} + BF{"Burkina Faso"} + BG{"Bulharsko"} + BH{"Bahrajn"} + BI{"Burundi"} + BJ{"Benin"} + BM{"Bermudy"} + BN{"Brunej Darussalam"} + BO{"Bolívie"} + BR{"Brazílie"} + BS{"Bahamy"} + BT{"Bhútán"} + BV{"Ostrov Bouvet"} + BW{"Botswana"} + BY{"Bělorusko"} + BZ{"Belize"} + CA{"Kanada"} + CC{"Kokosové ostrovy"} + CD{"Kongo, demokratická republika"} + CF{"Středoafrická republika"} + CG{"Kongo"} + CH{"Švýcarsko"} + CI{"Pobřeží slonoviny"} + CK{"Cookovy ostrovy"} + CL{"Chile"} + CM{"Kamerun"} + CN{"Čína"} + CO{"Kolumbie"} + CR{"Kostarika"} + CU{"Kuba"} + CV{"Kapverdy"} + CX{"Vánoční ostrovy"} + CY{"Kypr"} + CZ{"Česká republika"} + DE{"Německo"} + DJ{"Džibuti"} + DK{"Dánsko"} + DM{"Dominika"} + DO{"Dominikánská republika"} + DZ{"Alžírsko"} + EC{"Ekvádor"} + EE{"Estonsko"} + EG{"Egypt"} + EH{"Západní Sahara"} + ER{"Eritrea"} + ES{"Španělsko"} + ET{"Etiopie"} + FI{"Finsko"} + FJ{"Fidži"} + FK{"Falklandské ostrovy"} + FM{"Mikronésie, federativní stát"} + FO{"Faerské ostrovy"} + FR{"Francie"} + GA{"Gabon"} + GB{"Velká Británie"} + GD{"Grenada"} + GE{"Gruzie"} + GF{"Francouzská Guyana"} + GH{"Ghana"} + GI{"Gibraltar"} + GL{"Grónsko"} + GM{"Gambie"} + GN{"Guinea"} + GP{"Guadeloupe"} + GQ{"Rovníková Guinea"} + GR{"Řecko"} + GS{"Jižní Georgie a Jižní Sandwichovy ostrovy"} + GT{"Guatemala"} + GU{"Guam"} + GW{"Guinea-Bissau"} + GY{"Guyana"} + HK{"Hongkong, zvláštní administrativní oblast Číny"} + HM{"Ostrovy Heard a McDonald"} + HN{"Honduras"} + HR{"Chorvatsko"} + HT{"Haiti"} + HU{"Maďarsko"} + ID{"Indonésie"} + IE{"Irsko"} + IL{"Izrael"} + IN{"Indie"} + IO{"Britské území v Indickém oceánu"} + IQ{"Irák"} + IR{"Írán"} + IS{"Island"} + IT{"Itálie"} + JM{"Jamajka"} + JO{"Jordánsko"} + JP{"Japonsko"} + KE{"Keňa"} + KG{"Kyrgyzstán"} + KH{"Kambodža"} + KI{"Kiribati"} + KM{"Komory"} + KN{"Svatý Kitts a Nevis"} + KP{"Severní Korea"} + KR{"Jižní Korea"} + KW{"Kuvajt"} + KY{"Kajmanské ostrovy"} + KZ{"Kazachstán"} + LA{"Lidově demokratická republika Laos"} + LB{"Libanon"} + LC{"Svatá Lucie"} + LI{"Lichtenštejnsko"} + LK{"Srí Lanka"} + LR{"Libérie"} + LS{"Lesotho"} + LT{"Litva"} + LU{"Lucembursko"} + LV{"Lotyšsko"} + LY{"Libye"} + MA{"Maroko"} + MC{"Monako"} + MD{"Moldavsko, republika"} + MG{"Madagaskar"} + MH{"Marshallovy ostrovy"} + MK{"Macedonia"} + ML{"Mali"} + MM{"Myanmar (Burma)"} + MN{"Mongolsko"} + MO{"Macao S.A.R., China"} + MP{"Severní Mariany"} + MQ{"Martinik"} + MR{"Mauritánie"} + MS{"Montserrat"} + MT{"Malta"} + MU{"Mauricius"} + MV{"Maladivy"} + MW{"Malawi"} + MX{"Mexiko"} + MY{"Malajsie"} + MZ{"Mosambik"} + NA{"Namibie"} + NC{"Nová Kaledonie"} + NE{"Niger"} + NF{"Norfolk"} + NG{"Nigérie"} + NI{"Nikaragua"} + NL{"Nizozemsko"} + NO{"Norsko"} + NP{"Nepál"} + NR{"Nauru"} + NU{"Niue"} + NZ{"Nový Zéland"} + OM{"Omán"} + PA{"Panama"} + PE{"Peru"} + PF{"Francouzská Polynésie"} + PG{"Papua-Nová Guinea"} + PH{"Filipíny"} + PK{"Pákistán"} + PL{"Polsko"} + PM{"Svatý Pierre a Miquelon"} + PN{"Pitcairn"} + PR{"Portoriko"} + PS{"Palestinian Territory"} + PT{"Portugalsko"} + PW{"Palau"} + PY{"Paraguay"} + QA{"Katar"} + RE{"Réunion"} + RO{"Rumunsko"} + RU{"Rusko"} + RW{"Rwanda"} + SA{"Saúdská Arábie"} + SB{"Šalamounovy ostrovy"} + SC{"Seychely"} + SD{"Súdán"} + SE{"Švédsko"} + SG{"Singapur"} + SH{"Svatá Helena"} + SI{"Slovinsko"} + SJ{"Svalbard a Jan Mayen"} + SK{"Slovensko"} + SL{"Sierra Leone"} + SM{"San Marino"} + SN{"Senegal"} + SO{"Somálsko"} + SP{"Serbia"} + SR{"Surinam"} + ST{"Svatý Tomáš"} + SV{"El Salvador"} + SY{"Sýrie"} + SZ{"Svazijsko"} + TC{"Ostrovy Caicos a Turks"} + TD{"Čad"} + TF{"Francouzská jižní teritoria"} + TG{"Togo"} + TH{"Thajsko"} + TJ{"Tádžikistán"} + TK{"Tokelau"} + TL{"Východní Timor"} + TM{"Turkmenistán"} + TN{"Tunisko"} + TO{"Tonga"} + TR{"Turecko"} + TT{"Trinidad a Tobago"} + TV{"Tuvalu"} + TW{"Tchaj-wan"} + TZ{"Tanzanie"} + UA{"Ukrajina"} + UG{"Uganda"} + UM{"Menší odlehlé ostrovy USA"} + US{"Spojené státy"} + UY{"Uruguay"} + UZ{"Uzbekistán"} + VA{"Svatý stolec"} + VC{"Svatý Vincent a Grenadiny"} + VE{"Venezuela"} + VG{"Britské Panenské ostrovy"} + VI{"Americké Panenské ostrovy"} + VN{"Vietnam"} + VU{"Vanuatu"} + WF{"Wallis a Futuna"} + WS{"Samoa"} + YE{"Jemen"} + YT{"Mayotte"} + YU{"Jugoslávie"} + ZA{"Jižní Afrika"} + ZM{"Zambie"} + ZW{"Zimbabwe"} } - DayAbbreviations { - "ne", - "po", - "\u00FAt", - "st", - "\u010dt", - "p\u00E1", - "so", - } - DayNames { - "ned\u011Ble", - "pond\u011Bl\u00ED", - "\u00FAter\u00FD", - "st\u0159eda", - "\u010dtvrtek", - "p\u00E1tek", - "sobota", - } - Eras { - "p\u0159.Kr.", - "po Kr.", + Currencies{ + ADD{ + "ADD", + "Diner andorrský", + } + ADP{ + "ADP", + "Peseta andorrská", + } + AED{ + "AED", + "Dirham SAE", + } + AFA{ + "AFA", + "Afghán (1927-2002)", + } + AFN{ + "Af", + "Afghán", + } + AIF{ + "AIF", + "Affars and Issas Franc", + } + ALK{ + "ALK", + "Lek (1946-1961)", + } + ALL{ + "lek", + "Lek", + } + ALV{ + "ALV", + "Albanian Lek Valute", + } + AMD{ + "dram", + "Dram arménský", + } + ANG{ + "NA f.", + "Zlatý Nizozemských Antil", + } + AOA{ + "AOA", + "Kwanza", + } + AOK{ + "AOK", + "Kwanza (1977-1990)", + } + AON{ + "AON", + "Kwanza nová (1990-2000)", + } + AOR{ + "AOR", + "Kwanza reajustado (1995-1999)", + } + AOS{ + "AOS", + "Escudo angolské", + } + ARA{ + "ARA", + "Austral", + } + ARM{ + "ARM", + "Peso argentinské Moneda Nacional", + } + ARP{ + "ARP", + "Peso argentinské (1983-1985)", + } + ARS{ + "Arg$", + "Peso argentinské", + } + ATS{ + "ATS", + "Šilink", + } + AUD{ + "$A", + "Dolar australský", + } + AUP{ + "AUP", + "Libra australská", + } + AWG{ + "AWG", + "Zlatý arubský", + } + AZM{ + "AZM", + "Manat ázerbajdžánský", + } + BAD{ + "BAD", + "Dinár Bosny a Hercegoviny", + } + BAM{ + "KM", + "Marka konvertibilní", + } + BAN{ + "BAN", + "Nový Dinár Bosny a Hercegoviny", + } + BBD{ + "BDS$", + "Dolar barbadoský", + } + BDT{ + "Tk", + "Taka", + } + BEC{ + "BEC", + "Frank konvertibilní", + } + BEF{ + "BF", + "Frank belgický", + } + BEL{ + "BEL", + "Frank finanční", + } + BGL{ + "lev", + "Lev", + } + BGM{ + "BGM", + "Lev Bulharský socialistický", + } + BGN{ + "BGN", + "Lev Bulharský", + } + BGO{ + "BGO", + "Lev Bulharský (1879-1952)", + } + BHD{ + "BD", + "Dinár bahrajnský", + } + BIF{ + "Fbu", + "Frank burundský", + } + BMD{ + "Ber$", + "Dolar bermudský", + } + BMP{ + "BMP", + "Libra bermudská", + } + BND{ + "BND", + "Dolar brunejský", + } + BOB{ + "Bs", + "Boliviano", + } + BOL{ + "BOL", + "Boliviano (1863-1962)", + } + BOP{ + "BOP", + "Peso", + } + BOV{ + "BOV", + "Mvdol", + } + BRB{ + "BRB", + "Cruzeiro (1967-1986)", + } + BRC{ + "BRC", + "Cruzado", + } + BRE{ + "BRE", + "Cruzeiro (1990-1993)", + } + BRL{ + "R$", + "Real brazilský", + } + BRN{ + "BRN", + "Cruzado nové", + } + BRR{ + "BRR", + "Cruzeiro real", + } + BRZ{ + "BRZ", + "Cruzeiro (1942-1967)", + } + BSD{ + "BSD", + "Dolar bahamský", + } + BSP{ + "BSP", + "Libra bahamská", + } + BTN{ + "Nu", + "Ngultrum", + } + BTR{ + "BTR", + "Rupie bhútánská", + } + BUK{ + "BUK", + "Kyat barmský", + } + BUR{ + "BUR", + "Rupie barmská", + } + BWP{ + "BWP", + "Pula", + } + BYB{ + "BYB", + "Rubl nový běloruský (1994-1999)", + } + BYL{ + "BYL", + "Rubl běloruský (1992-1994)", + } + BYR{ + "Rbl", + "Rubl běloruský", + } + BZD{ + "BZ$", + "Dolar belizský", + } + BZH{ + "BZH", + "Dolar Britského Hondurasu", + } + CAD{ + "Can$", + "Dolar kanadský", + } + CDF{ + "CDF", + "Frank konžský", + } + CDG{ + "CDG", + "Frank Konžské republiky", + } + CDL{ + "CDL", + "Zaire konžský", + } + CFF{ + "CFF", + "Frank Středoafrické republiky CFA", + } + CHF{ + "SwF", + "Frank švýcarský", + } + CKD{ + "CKD", + "Dolar Cookových ostrovů", + } + CLC{ + "CLC", + "Condor chilský", + } + CLE{ + "CLE", + "Escudo chilské", + } + CLF{ + "CLF", + "Unidades de fomento", + } + CLP{ + "Ch$", + "Peso chilské", + } + CMF{ + "CMF", + "Frank kamerunský CFA", + } + CNP{ + "CNP", + "Juan jen min piao", + } + CNX{ + "CNX", + "Dolar lidové banky", + } + CNY{ + "Y", + "Juan renminbi", + } + COB{ + "COB", + "Peso kolumbijské", + } + COF{ + "COF", + "Krank konžský CFA", + } + COP{ + "Col$", + "Peso kolumbijské", + } + CRC{ + "C", + "Colón kostarický", + } + CSC{ + "CSC", + "Koruna československá", + } + CSK{ + "CSK", + "Koruna československá", + } + CUP{ + "CUP", + "Peso kubánské", + } + CVE{ + "CVEsc", + "Escudo kapverdské", + } + CWG{ + "CWG", + "Zlatý Curacao", + } + CYP{ + "£", + "Libra kyperská", + } + CZK{ + "Kč", + "Koruna česká", + } + DDM{ + "DDM", + "Marka NDR", + } + DEM{ + "DEM", + "Marka německá", + } + DES{ + "DES", + "Sperrmark německá", + } + DJF{ + "DF", + "Frank džibutský", + } + DKK{ + "DKr", + "Koruna dánská", + } + DOP{ + "RD$", + "Peso dominikánské", + } + DZD{ + "DA", + "Dinár alžírský", + } + DZF{ + "DZF", + "Frank nový alžírský", + } + DZG{ + "DZG", + "Frank alžírský germinal", + } + ECS{ + "ECS", + "Sucre ekvádorský", + } + ECV{ + "ECV", + "Ecuador Unidad de Valor Constante (UVC)", + } + EEK{ + "EEK", + "Kroon", + } + EGP{ + "EGP", + "Libra egyptská", + } + ERN{ + "ERN", + "Nakfa", + } + ESP{ + "ESP", + "Peseta španělská", + } + ETB{ + "Br", + "Birr etiopský", + } + ETD{ + "ETD", + "Dolar etiopský", + } + EUR{ + "€", + "Euro", + } + FIM{ + "FIM", + "Markka", + } + FIN{ + "FIN", + "Markka (1860-1962)", + } + FJD{ + "F$", + "Dolar fidžijský", + } + FJP{ + "FJP", + "Libra fidžijská", + } + FKP{ + "FKP", + "Libra falklandská", + } + FOK{ + "FOK", + "Koruna Faerských ostrovů", + } + FRF{ + "FRF", + "Frank francouzský", + } + FRG{ + "FRG", + "Frank francouzský germinal/Frank poincare", + } + GAF{ + "GAF", + "Frank gabonský CFA", + } + GBP{ + "£", + "Libra šterlinků", + } + GEK{ + "GEK", + "Georgian Kupon Larit", + } + GEL{ + "lari", + "Lari", + } + GHC{ + "GHC", + "Cedi", + } + GHO{ + "GHO", + "Ghana Old Cedi", + } + GHP{ + "GHP", + "Libra ghanská", + } + GHR{ + "GHR", + "Ghana Revalued Cedi", + } + GIP{ + "GIP", + "Libra gibraltarská", + } + GLK{ + "GLK", + "Greenland Krone", + } + GMD{ + "GMD", + "Dalasi", + } + GMP{ + "GMP", + "Libra gambijská", + } + GNF{ + "GF", + "Frank guinejský", + } + GNI{ + "GNI", + "Frank guinejský (1960-1972)", + } + GNS{ + "GNS", + "Guinea Syli", + } + GPF{ + "GPF", + "Frank guadeloupský", + } + GQE{ + "GQE", + "Equatorial Guinea Ekwele Guineana", + } + GQF{ + "GQF", + "Equatorial Guinea Franco", + } + GQP{ + "GQP", + "Equatorial Guinea Peseta Guineana", + } + GRD{ + "GRD", + "Drachma", + } + GRN{ + "GRN", + "Drachma nová řecká", + } + GTQ{ + "Q", + "Quetzal", + } + GUF{ + "GUF", + "French Guyana Franc Guiana", + } + GWE{ + "GWE", + "Escudo guinejské", + } + GWM{ + "GWM", + "Portuguese Guinea Mil Reis", + } + GWP{ + "GWP", + "Peso Guinnea-Bissau", + } + GYD{ + "G$", + "Dolar guyanský", + } + HKD{ + "HK$", + "Dolar hongkongský", + } + HNL{ + "L", + "Lempira", + } + HRD{ + "HRD", + "Dinar chorvatský", + } + HRK{ + "HRK", + "Kuna chorvatská", + } + HTG{ + "HTG", + "Gourde", + } + HUF{ + "Ft", + "Forint", + } + IBP{ + "IBP", + "Libra severoirská", + } + IDG{ + "IDG", + "Indonesian Nica Guilder", + } + IDJ{ + "IDJ", + "Indonesian Java Rupiah", + } + IDN{ + "IDN", + "Indonesian New Rupiah", + } + IDR{ + "Rp", + "Rupie indonézská", + } + IEP{ + "IR£", + "Libra irská", + } + ILL{ + "ILL", + "Šekel izraelský", + } + ILP{ + "ILP", + "Libra izraelská", + } + ILS{ + "ILS", + "Šekel nový izraelský", + } + IMP{ + "IMP", + "Libra šterlinků Ostrov Man", + } + INR{ + "INR", + "Rupie indická", + } + IQD{ + "ID", + "Dinár irácký", + } + IRR{ + "RI", + "Rijál íránský", + } + ISK{ + "ISK", + "Koruna islandská", + } + ITL{ + "₤", + "Lira italská", + } + JEP{ + "JEP", + "Libra šterlinků Jersey", + } + JMD{ + "J$", + "Dolar jamajský", + } + JMP{ + "JMP", + "Libra jamajská", + } + JOD{ + "JD", + "Dinár jordánský", + } + JPY{ + "¥", + "Jen", + } + KES{ + "K Sh", + "Šilink keňský", + } + KGS{ + "som", + "Som", + } + KHO{ + "KHO", + "Riel starý", + } + KHR{ + "CR", + "Riel", + } + KID{ + "KID", + "Dolar kiribatský", + } + KMF{ + "CF", + "Frank komorský", + } + KPW{ + "KPW", + "Won severokorejský", + } + KRH{ + "KRH", + "Hwan jihokorejský", + } + KRO{ + "KRO", + "Won starý jihokorejský", + } + KRW{ + "KRW", + "Won jihokorejský", + } + KWD{ + "KD", + "Dinár kuvajtský", + } + KYD{ + "KYD", + "Dolar Kajmanských ostrovů", + } + KZR{ + "KZR", + "Rubl kazašský", + } + KZT{ + "T", + "Tenge", + } + LAK{ + "LAK", + "Kip", + } + LBP{ + "LL", + "Libra libanonská", + } + LIF{ + "LIF", + "Frank lichtenštejnský", + } + LKR{ + "SL Re", + "Rupie srílanská", + } + LNR{ + "LNR", + "Rupie cejlonská", + } + LRD{ + "LRD", + "Dolar liberijský", + } + LSL{ + "M", + "Loti", + } + LTL{ + "LTL", + "Litus litevský", + } + LTT{ + "LTT", + "Talon", + } + LUF{ + "LUF", + "Frank lucemburský", + } + LVL{ + "LVL", + "Lat lotyšský", + } + LVR{ + "LVR", + "Rubl lotyšský", + } + LYD{ + "LD", + "Dinár lybijský", + } + LYP{ + "LYP", + "Libra lybijská", + } + MAD{ + "MAD", + "Dirham marocký", + } + MAF{ + "MAF", + "Frank marocký", + } + MCF{ + "MCF", + "Frank nouveau monacký", + } + MCG{ + "MCG", + "Frank monacký germinal", + } + MDC{ + "MDC", + "Moldovan Leu Cupon", + } + MDL{ + "MDL", + "Leu moldavský", + } + MDR{ + "MDR", + "Moldovan Ruble Cupon", + } + MGA{ + "MGA", + "Ariary madagaskarský", + } + MGF{ + "MGF", + "Frank madagaskarský", + } + MHD{ + "MHD", + "Dolar Marshallových ostrovů", + } + MKD{ + "MDen", + "Denár", + } + MKN{ + "MKN", + "Denár (1992-1993)", + } + MLF{ + "MLF", + "Frank malijský", + } + MMK{ + "MMK", + "Kyat", + } + MNT{ + "Tug", + "Tugrik", + } + MOP{ + "MOP", + "Pataca", + } + MQF{ + "MQF", + "Frank martinikský", + } + MRO{ + "UM", + "Ouguiya", + } + MTL{ + "Lm", + "Lira maltská", + } + MTP{ + "MTP", + "Libra maltská", + } + MUR{ + "MUR", + "Rupie mauricijská", + } + MVP{ + "MVP", + "Rupie maledivská", + } + MVR{ + "MVR", + "Rufiyaa", + } + MWK{ + "MK", + "Kwacha", + } + MWP{ + "MWP", + "Libra malawijská", + } + MXN{ + "MEX$", + "Peso mexické", + } + MXP{ + "MXP", + "Peso stříbrné mexické (1861-1992)", + } + MXV{ + "MXV", + "Mexican Unidad de Inversion (UDI)", + } + MYR{ + "RM", + "Ringgit malajskijský", + } + MZE{ + "MZE", + "Escudo Mosambiku", + } + MZM{ + "Mt", + "Metical", + } + NAD{ + "N$", + "Dolar namibijský", + } + NCF{ + "NCF", + "Frank Nové Kaledonie germinal", + } + NGN{ + "NGN", + "Naira", + } + NGP{ + "NGP", + "Libra nigerijská", + } + NHF{ + "NHF", + "Frank Nových Hebrid CFP", + } + NIC{ + "NIC", + "Cordoba", + } + NIG{ + "NIG", + "Cordoba zlatá", + } + NIO{ + "NIO", + "Cordoba oro", + } + NLG{ + "NLG", + "Zlatý holandský", + } + NOK{ + "NKr", + "Koruna norská", + } + NPR{ + "Nrs", + "Rupie nepálská", + } + NZD{ + "$NZ", + "Dolar novozélandský", + } + NZP{ + "NZP", + "Libra novozélandská", + } + OMR{ + "RO", + "Rijál ománský", + } + OMS{ + "OMS", + "Rijál ománský saidi", + } + PAB{ + "PAB", + "Balboa", + } + PDK{ + "PDK", + "Transdniestria Ruble Kupon", + } + PDN{ + "PDN", + "Transdniestria New Ruble", + } + PDR{ + "PDR", + "Transdniestria Ruble", + } + PEI{ + "PEI", + "Inti", + } + PEN{ + "PEN", + "Nuevo sol", + } + PES{ + "PES", + "Sol", + } + PGK{ + "PGK", + "Kina", + } + PHP{ + "PHP", + "Peso filipínské", + } + PKR{ + "Pra", + "Rupie pákistánská", + } + PLN{ + "Zl", + "Zlotý", + } + PLZ{ + "PLZ", + "Zlotý (1950-1995)", + } + PSP{ + "PSP", + "Libra palestinská", + } + PTC{ + "PTC", + "Conto portugalské", + } + PTE{ + "PTE", + "Escudo portugalské", + } + PYG{ + "PYG", + "Guarani", + } + QAR{ + "QR", + "Rijál katarský", + } + REF{ + "REF", + "Frank Reunion", + } + ROL{ + "leu", + "Lei", + } + RON{ + "RON", + "Lei nový", + } + RUB{ + "RUB", + "Rubl ruský", + } + RUR{ + "RUR", + "Rubl ruský (1991-1998)", + } + RWF{ + "RWF", + "Frank rwandský", + } + SAR{ + "SRl", + "Rijál saudský", + } + SAS{ + "SAS", + "Rijál saudský sovereign", + } + SBD{ + "SI$", + "Dolar Šalamounových ostrovů", + } + SCR{ + "SR", + "Rupie seychelská", + } + SDD{ + "SDD", + "Dinár súdánský", + } + SDP{ + "SDP", + "Libra súdánská", + } + SEK{ + "SKr", + "Koruna švédská", + } + SGD{ + "S$", + "Dolar singapurský", + } + SHP{ + "SHP", + "Libra Svaté Heleny", + } + SIB{ + "SIB", + "Slovenia Tolar Bons", + } + SIT{ + "SIT", + "Tolar", + } + SKK{ + "Sk", + "Koruna slovenská", + } + SML{ + "SML", + "Lira San Marino", + } + SOS{ + "So. Sh.", + "Šilink somálský", + } + SQS{ + "SQS", + "Somaliland Shilling", + } + SRG{ + "Sf", + "Zlatý surinamský", + } + SSP{ + "SSP", + "Libra skotská", + } + STD{ + "Db", + "Dobra", + } + STE{ + "STE", + "Escudo Svatého Tomáše", + } + SUN{ + "SUN", + "Rubl nový", + } + SUR{ + "SUR", + "Rubl", + } + SVC{ + "SVC", + "Colon salvadorský", + } + SYP{ + "LS", + "Libra syrská", + } + SZL{ + "E", + "Lilangeni", + } + TCC{ + "TCC", + "Koruna Turks a Caicos", + } + TDF{ + "TDF", + "Frank čadský CFA", + } + THB{ + "THB", + "Baht", + } + TJR{ + "TJR", + "Tajikistan Ruble", + } + TJS{ + "TJS", + "Somoni", + } + TMM{ + "TMM", + "Manat", + } + TND{ + "TND", + "Dinár tuniský", + } + TOS{ + "TOS", + "Libra šterlinků tonžská", + } + TPE{ + "TPE", + "Escudo timorské", + } + TPP{ + "TPP", + "Pataca timorská", + } + TRL{ + "TL", + "Lira turecká", + } + TRY{ + "TRY", + "Nová turecká lira", + } + TTD{ + "TT$", + "Dolar Trinidad a Tobago", + } + TTO{ + "TTO", + "Dolar starý Trinidad a Tobago", + } + TVD{ + "TVD", + "Dolar tuvalský", + } + TWD{ + "NT$", + "Dolar tchajvanský nový", + } + TZS{ + "T Sh", + "Šilink tanzanský", + } + UAH{ + "UAH", + "Hřivna", + } + UAK{ + "UAK", + "Karbovanec", + } + UGS{ + "UGS", + "Šilink ugandský (1966-1987)", + } + UGX{ + "U Sh", + "Šilink ugandský", + } + USD{ + "US$", + "Dolar americký", + } + USN{ + "USN", + "Dolar americký (příští den)", + } + USS{ + "USS", + "Dolar americký (týž den)", + } + UYF{ + "UYF", + "Peso uruguayské fuerte", + } + UYP{ + "UYP", + "Peso uruguayské (1975-1993)", + } + UYU{ + "Ur$", + "Peso uruguayské", + } + UZC{ + "UZC", + "Uzbekistan Coupon Som", + } + UZS{ + "UZS", + "Sum uzbecký", + } + VAL{ + "VAL", + "Lira Vatikánu", + } + VEB{ + "Be", + "Bolivar", + } + VGD{ + "VGD", + "Dolar Britských Panenských ostrovů", + } + VUV{ + "VT", + "Vatu", + } + WSP{ + "WSP", + "Libra Západní Samoa", + } + WST{ + "WST", + "Tala", + } + XAF{ + "XAF", + "Frank BEAC/CFA", + } + XAM{ + "XAM", + "Asijská peněžní jednotka", + } + XAU{ + "XAU", + "Zlato", + } + XBA{ + "XBA", + "Evropská smíšená jednotka", + } + XBB{ + "XBB", + "Evropská peněžní jednotka", + } + XBC{ + "XBC", + "Evropská jednotka účtu 9 (XBC)", + } + XBD{ + "XBD", + "Evropská jednotka účtu 17 (XBD)", + } + XCD{ + "EC$", + "Dolar východokaribský", + } + XCF{ + "XCF", + "Frank Nouveau CFA", + } + XDR{ + "XDR", + "SDR", + } + XEF{ + "XEF", + "Frank BCEAEC/CFA", + } + XEU{ + "XEU", + "Evropská měnová jednotka", + } + XFO{ + "XFO", + "Frank zlatý", + } + XFU{ + "XFU", + "Frank UIC", + } + XID{ + "XID", + "Dinár islámský", + } + XNF{ + "XNF", + "Frank Francouzských Antil CFA", + } + XOF{ + "XOF", + "Frank BCEAO/CFA", + } + XPF{ + "CFPF", + "Frank CFP", + } + YDD{ + "YDD", + "Dinár jemenský", + } + YEI{ + "YEI", + "Rijál jemenský imadi", + } + YER{ + "YRl", + "Rijál jemenský", + } + YUD{ + "YUD", + "Dinár jugoslávský nový", + } + YUF{ + "YUF", + "Dinár jugoslávský federativní", + } + YUG{ + "YUG", + "Dinár jugoslávský 1994", + } + YUM{ + "YUM", + "Dinár jugoslávský", + } + YUN{ + "YUN", + "Dinár jugoslávský", + } + YUR{ + "YUR", + "Dinár jugoslávský reformovaný", + } + ZAL{ + "ZAL", + "Rand finanční", + } + ZAP{ + "ZAP", + "Libra jihoafrická", + } + ZAR{ + "R", + "Rand", + } + ZMK{ + "ZMK", + "Kwacha", + } + ZMP{ + "ZMP", + "Libra zambijská", + } + ZRN{ + "ZRN", + "Zaire nový", + } + ZRZ{ + "ZRZ", + "Zaire", + } + ZWD{ + "Z$", + "Dolar zimbabwský", + } } - Languages { - cs { "\u010De\u0161tina" } + ExemplarCharacters{"[a-z ý á é í ó ú ě ů č ď ň ř š ť ž]"} + Keys{ + calendar{"Kalendář"} + collation{"Třídění"} + currency{"Měna"} } - LocaleID:int { 0x05 } -// LocaleString { "cs" } - MonthAbbreviations { - "I", - "II", - "III", - "IV", - "V", - "VI", - "VII", - "VIII", - "IX", - "X", - "XI", - "XII", + Languages{ + aa{"Afarština"} + ab{"Abcházština"} + af{"Afrikánština"} + am{"Amharština"} + ar{"Arabština"} + as{"Assaméština"} + ay{"Aymárština"} + az{"Azerbajdžánština"} + ba{"Baskirština"} + be{"Běloruština"} + bg{"Bulharština"} + bh{"Biharština"} + bi{"Bislámština"} + bn{"Bengálština"} + bo{"Tibetština"} + br{"Bretaňština"} + ca{"Katalánština"} + co{"Korsičtina"} + cs{"Čeština"} + cy{"Velština"} + da{"Dánština"} + de{"Němčina"} + dz{"Bhútánština"} + el{"Řečtina"} + en{"Angličtina"} + eo{"Esperanto"} + es{"Španělština"} + et{"Estonština"} + eu{"Baskičtina"} + fa{"Perština"} + fi{"Finština"} + fj{"Fidži"} + fo{"Faerština"} + fr{"Francouzština"} + fy{"Fríština"} + ga{"Irština"} + gd{"Skotská galština"} + gl{"Haličština"} + gn{"Guaranština"} + gu{"Gujaratština"} + ha{"Hausa"} + he{"Hebrejština"} + hi{"Hindština"} + hr{"Chorvatština"} + hu{"Maďarština"} + hy{"Arménština"} + ia{"Interlingua"} + id{"Indonéština"} + ie{"Interlingue"} + ik{"Inupiakština"} + is{"Islandština"} + it{"Italština"} + iu{"Inuktitutština"} + ja{"Japonština"} + jv{"Javánština"} + ka{"Gruzínština"} + kk{"Kazachština"} + kl{"Grónština"} + km{"Kambodžština"} + kn{"Kannadština"} + ko{"Korejština"} + ks{"Kašmírština"} + ku{"Kurdština"} + ky{"Kirgizština"} + la{"Latina"} + ln{"Lingalština"} + lo{"Laoština"} + lt{"Litevština"} + lv{"Lotyština"} + mg{"Malgaština"} + mi{"Maorština"} + mk{"Makedonština"} + ml{"Malabarština"} + mn{"Mongolština"} + mo{"Moldavština"} + mr{"Marathi"} + ms{"Malajština"} + mt{"Maltština"} + my{"Barmština"} + na{"Nauru"} + ne{"Nepálština"} + nl{"Holandština"} + no{"Norština"} + oc{"Occitan"} + om{"Oromo (Afan)"} + or{"Oriya"} + pa{"Paňdžábština"} + pl{"Polština"} + ps{"Pashto (Pushto)"} + pt{"Portugalština"} + qu{"Kečuánština"} + rm{"Rétorománština"} + rn{"Kirundi"} + ro{"Rumunština"} + ru{"Ruština"} + rw{"Kinyarwandština"} + sa{"Sanskrt"} + sd{"Sindhi"} + sg{"Sangho"} + sh{"Srbochorvatština"} + si{"Sinhálština"} + sk{"Slovenština"} + sl{"Slovinština"} + sm{"Samoyština"} + sn{"Shona"} + so{"Somálština"} + sq{"Albánština"} + sr{"Srbština"} + ss{"Siswatština"} + st{"Sesotho"} + su{"Sundanština"} + sv{"Švédština"} + sw{"Svahilština"} + ta{"Tamilština"} + te{"Telugština"} + tg{"Tádžičtina"} + th{"Thajština"} + ti{"Tigrinijština"} + tk{"Turkmenština"} + tl{"Tagalog"} + tn{"Setswanština"} + to{"Tonga"} + tr{"Turečtina"} + ts{"Tsonga"} + tt{"Tatarština"} + tw{"Twi"} + ug{"Uighurština"} + uk{"Ukrajinština"} + ur{"Urdština"} + uz{"Uzbečtina"} + vi{"Vietnamština"} + vo{"Volapuk"} + wo{"Wolof"} + xh{"Xhosa"} + yi{"Jidiš"} + yo{"Yoruba"} + za{"Zhuang"} + zh{"Čínština"} + zu{"Zulu"} } - MonthNames { - "leden", - "\u00FAnor", - "b\u0159ezen", - "duben", - "kv\u011Bten", - "\u010Derven", - "\u010Dervenec", - "srpen", - "z\u00E1\u0159\u00ED", - "\u0159\u00EDjen", - "listopad", - "prosinec", + LocaleScript{ + "Latn", } - NumberElements { + NumberElements{ ",", - "\u00A0", + " ", ";", "%", "0", "#", "-", "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", + "‰", + "∞", + "�", + "+", + } + Types{ + calendar{ + buddhist{"Budhistický kalendář"} + chinese{"Čínský kalendář"} + gregorian{"Gregoriánský kalendář"} + hebrew{"Hebrejský kalendář"} + islamic{"Muslimský kalendář"} + islamic-civil{"Muslimský občanský kalendář"} + japanese{"Japonský kalendář"} + } } -// ShortLanguage { "ces" } - localPatternChars { "GuMtkHmsSEDFwWahKzUe" } - zoneStrings { + Version{"1.3"} + calendar{ + gregorian{ + AmPmMarkers{ + "dop.", + "odp.", + } + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "H:mm:ss z", + "H:mm:ss z", + "H:mm:ss", + "H:mm", + "EEEE, d. MMMM yyyy", + "d. MMMM yyyy", + "d.M.yyyy", + "d.M.yy", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "ne", + "po", + "út", + "st", + "čt", + "pá", + "so", + } + wide{ + "neděle", + "pondělí", + "úterý", + "středa", + "čtvrtek", + "pátek", + "sobota", + } + } + } + eras{ + abbreviated{ + "př.Kr.", + "po Kr.", + } + } + monthNames{ + format{ + abbreviated{ + "1.", + "2.", + "3.", + "4.", + "5.", + "6.", + "7.", + "8.", + "9.", + "10.", + "11.", + "12.", + } + narrow{ + "l", + "ú", + "b", + "d", + "k", + "č", + "č", + "s", + "z", + "ř", + "l", + "p", + } + wide{ + "ledna", + "února", + "března", + "dubna", + "května", + "června", + "července", + "srpna", + "září", + "října", + "listopadu", + "prosince", + } + } + stand-alone{ + abbreviated{ + "1.", + "2.", + "3.", + "4.", + "5.", + "6.", + "7.", + "8.", + "9.", + "10.", + "11.", + "12.", + } + narrow{ + "l", + "ú", + "b", + "d", + "k", + "č", + "č", + "s", + "z", + "ř", + "l", + "p", + } + wide{ + "Leden", + "Únor", + "Březen", + "Duben", + "Květen", + "Červen", + "Červenec", + "Srpen", + "Září", + "Říjen", + "Listopad", + "Prosinec", + } + } + } + } + } + localPatternChars{"GuMtkHmsSEDFwWahKzUeygAZ"} + zoneStrings{ { - "Africa/Casablanca", + "America/Los_Angeles", + "Pacifický standardní čas", + "PST", + "Pacifický letní čas", + "PDT", + "Los Angeles", + } + { + "America/Denver", + "Horský standardní čas", + "MST", + "Horský letní čas", + "MDT", + "Denver", + } + { + "America/Phoenix", + "Horský standardní čas", + "MST", + "Horský standardní čas", + "MST", + "Phoenix", + } + { + "America/Chicago", + "Centrální standardní čas", + "CST", + "Centrální letní čas", + "CDT", + "Chicago", + } + { + "America/New_York", + "Východní standardní čas", + "EST", + "Východní letní čas", + "EDT", + "New York", + } + { + "America/Indianapolis", + "Východní standardní čas", + "EST", + "Východní standardní čas", + "EST", + "Indianapolis", + } + { + "Pacific/Honolulu", + "Havajský standardní čas", + "HST", + "Havajský standardní čas", + "HST", + "Honolulu", + } + { + "America/Anchorage", + "Aljašský standardní čas", + "AST", + "Aljašský letní čas", + "ADT", + "Anchorage", + } + { + "America/Halifax", + "Atlantický standardní čas", + "AST", + "Atlantický letní čas", + "ADT", + "Halifax", + } + { + "America/St_Johns", + "Newfoundlandský standardní čas", + "CNT", + "Newfoundlandský letní čas", + "CDT", + "St. Johns", + } + { + "Europe/Paris", + "Středoevropský standardní čas", + "CET", + "Středoevropský letní čas", + "CEST", + "Paříž", + } + { + "Etc/GMT", + "Greenwichský střední čas", "GMT", + "Greenwichský střední čas", "GMT", + "Londýn", + } + { + "Africa/Casablanca", + "Greenwichský střední čas", "GMT", + "Greenwichský střední čas", "GMT", + "Casablanca", + } + { + "Asia/Jerusalem", + "Izraelský standardní čas", + "IST", + "Izraelský letní čas", + "IDT", + "Jeruzalém", + } + { + "Asia/Tokyo", + "Japonský standardní čas", + "JST", + "Japonský standardní čas", + "JST", + "Tokio", + } + { + "Europe/Bucharest", + "Východoevropský standardní čas", + "EET", + "Východoevropský letní čas", + "EEST", + "Bukurešť", + } + { + "Asia/Shanghai", + "Čínský standardní čas", + "CTT", + "Čínský standardní čas", + "CDT", + "Šanghaj", } - } -// LocaleScript{ -// "Latn", // ISO 15924 Name -// } - ExemplarCharacters { "[a-z \u00fd \u00e1 \u00e9 \u00ed \u00f3 \u00fa \u011b \u016f \u010d \u010f \u0148 \u0159 \u0161 \u0165 \u017e]" } - - // Currency display names - Currencies { - CZK { "K\u010D", "CZK" } } } diff --git a/icuSources/data/locales/cs_CZ.txt b/icuSources/data/locales/cs_CZ.txt index 72df106d..e60ee7e2 100644 --- a/icuSources/data/locales/cs_CZ.txt +++ b/icuSources/data/locales/cs_CZ.txt @@ -1,19 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/cs_CZ.xml // * // *************************************************************************** - -cs_CZ { - Version{ "2.0" } -// LocaleString { "cs_CZ" } - NumberPatterns { +cs_CZ{ + NumberPatterns{ "#,##0.##;-#,##0.##", - "#,##0.00 \u00A4;-#,##0.00 \u00A4", + "#,##0.00 ¤;-#,##0.00 ¤", "#,##0%", "#E0", } -// ShortCountry { "CZE" } - LocaleID:int { 0x0405 } + Version{"1.2"} } diff --git a/icuSources/data/locales/cy.txt b/icuSources/data/locales/cy.txt new file mode 100644 index 00000000..76873129 --- /dev/null +++ b/icuSources/data/locales/cy.txt @@ -0,0 +1,82 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/cy.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/cy.xml + */ +cy{ + Countries{ + GB{"Prydain Fawr"} + } + ExemplarCharacters{"[a-z âäáàêëéèîïíìôöóòûüúùŵẅẃẁŷÿýỳ]"} + Languages{ + cy{"Cymraeg"} + } + LocaleScript{ + "Latn", + } + Version{"1.2"} + calendar{ + gregorian{ + dayNames{ + format{ + abbreviated{ + "Sul", + "Llun", + "Maw", + "Mer", + "Iau", + "Gwen", + "Sad", + } + wide{ + "Dydd Sul", + "Dydd Llun", + "Dydd Mawrth", + "Dydd Mercher", + "Dydd Iau", + "Dydd Gwener", + "Dydd Sadwrn", + } + } + } + monthNames{ + format{ + abbreviated{ + "Ion", + "Chwef", + "Mawrth", + "Ebrill", + "Mai", + "Meh", + "Gorff", + "Awst", + "Medi", + "Hyd", + "Tach", + "Rhag", + } + wide{ + "Ionawr", + "Chwefror", + "Mawrth", + "Ebrill", + "Mai", + "Mehefin", + "Gorffenaf", + "Awst", + "Medi", + "Hydref", + "Tachwedd", + "Rhagfyr", + } + } + } + } + } +} diff --git a/icuSources/data/locales/cy_GB.txt b/icuSources/data/locales/cy_GB.txt new file mode 100644 index 00000000..4c8fdf6d --- /dev/null +++ b/icuSources/data/locales/cy_GB.txt @@ -0,0 +1,36 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/cy_GB.xml +// * +// *************************************************************************** +cy_GB{ + NumberPatterns{ + "#,##0.###;-#,##0.###", + "¤#,##0.00;-¤#,##0.00", + "#,##0%", + "#E0", + } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "HH:mm:ss z", + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm", + "EEEE, dd MMMM yyyy", + "dd MMMM yyyy", + "d MMM yyyy", + "dd/MM/yyyy", + "{1} {0}", + } + } + } +} diff --git a/icuSources/data/locales/da.txt b/icuSources/data/locales/da.txt index 09b3b671..7ed2c12a 100644 --- a/icuSources/data/locales/da.txt +++ b/icuSources/data/locales/da.txt @@ -1,396 +1,2114 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2005 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/da.xml // * // *************************************************************************** - -da { - Version {"2.0"} - - "%%TRADITIONAL" { "Traditionelt" } - - "%%REVISED" { "Revideret" } - - CollationElements { - Version { "2.0" } - Sequence { "& A < \u00E6\u0301 <<< \u00C6\u0301& Z < \u00E6 <<< \u00C6<<" - " a\u0308 <<< A\u0308 < \u00F8 <<< \u00D8 << o\u0308 <<< O\u0308 << o\u030B<<< O\u030B< a\u030A" - " <<< A\u030A<<< aa <<< aA <<< Aa <<< AA & V<<< w<<< W & Y << u\u0308 <<< U\u0308 &D < \u00F0<<< \u00D0 &T < \u00FE<<< \u00DE" } - } - Countries { - //AD { "Andorra" } - AE { "Forenede Arabiske Emirater" } - //AF { "Afghanistan" } - AG { "Antigua og Barbuda" } - //AI { "Anguilla" } - AL { "Albanien" } - AM { "Armenien" } - AN { "Hollandske Antiller" } - //AO { "Angola" } - AQ { "Antarktis" } - //AR { "Argentina" } - AS { "Amerikansk Samoa" } - AT { "\u00d8strig" } - AU { "Australien" } - //AW { "Aruba" } - AZ { "Aserbajdsjan" } - BA { "Bosnien-Hercegovina" } - //BB { "Barbados" } - //BD { "Bangladesh" } - BE { "Belgien" } - //BF { "Burkina Faso" } - BG { "Bulgarien" } - //BH { "Bahrain" } - //BI { "Burundi" } - //BJ { "Benin" } - //BM { "Bermuda" } - BN { "Brunei Darussalam" } - //BO { "Bolivia" } - BR { "Brasilien" } - //BS { "Bahamas" } - //BT { "Bhutan" } - BV { "Bouvet\u00f8" } - //BW { "Botswana" } - BY { "Hviderusland" } - //BZ { "Belize" } - //CA { "Canada" } - CC { "Cocos-\u00f8erne (Keeling\u00f8erne)" } - CD { "Den Demokratiske Republik Congo" } - CF { "Den Centralafrikanske Republik" } - //CG { "Congo" } - CH { "Schweiz" } - CI { "Elfenbenskysten" } - CK { "Cook-\u00f8erne" } - //CL { "Chile" } - CM { "Cameroun" } - CN { "Kina" } - //CO { "Colombia" } - //CR { "Costa Rica" } - CV { "Kap Verde" } - CX { "Jule\u00f8en" } - CY { "Cypern" } - CZ { "Tjekkiet" } - DE { "Tyskland" } - //DJ { "Djibouti" } - DK { "Danmark" } - //DM { "Dominica" } - DO { "Den Dominikanske Republik" } - DZ { "Algeriet" } - //EC { "Ecuador" } - EE { "Estland" } - EG { "Egypten" } - EH { "Vestsahara" } - //ER { "Eritrea" } - ES { "Spanien" } - ET { "Etiopien" } - //FI { "Finland" } - FJ { "Fiji-\u00f8erne" } - FK { "Falklands\u00f8erne" } - FM { "Mikronesiens Forenede Stater" } - FO { "F\u00e6r\u00f8erne" } - FR { "Frankrig" } - //GA { "Gabon" } - GB { "Storbritannien" } - //GD { "Grenada" } - GE { "Georgien" } - GF { "Fransk Guyana" } - //GH { "Ghana" } - //GI { "Gibraltar" } - GL { "Gr\u00f8nland" } - //GM { "Gambia" } - //GN { "Guinea" } - //GP { "Guadeloupe" } - GQ { "\u00c6kvatorialguinea" } - GR { "Gr\u00e6kenland" } - GS { "South Georgia og De Sydlige Sandwich\u00f8er" } - //GT { "Guatemala" } - //GU { "Guam" } - //GW { "Guinea-Bissau" } - //GY { "Guyana" } - HK { "SAR Hongkong" } - HM { "Heard- og McDonald-\u00f8erne" } - //HN { "Honduras" } - HR { "Kroatien" } - //HT { "Haiti" } - HU { "Ungarn" } - ID { "Indonesien" } - IE { "Irland" } - //IL { "Israel" } - IN { "Indien" } - IO { "Det Britiske Territorium i Det Indiske Ocean" } - IQ { "Irak" } - //IR { "Iran" } - IS { "Island" } - IT { "Italien" } - //JM { "Jamaica" } - //JO { "Jordan" } - //JP { "Japan" } - //KE { "Kenya" } - KG { "Kirgisistan" } - KH { "Cambodja" } - KI { "Kiribati" } - KM { "Comorerne" } - KN { "Saint Kitts og Nevis" } - KR { "Sydkorea" } - //KW { "Kuwait" } - KY { "Cayman\u00f8erne" } - KZ { "Kasakhstan" } - //LA { "Laos" } - LB { "Libanon" } - //LC { "Saint Lucia" } - //LI { "Liechtenstein" } - //LK { "Sri Lanka" } - //LR { "Liberia" } - //LS { "Lesotho" } - LT { "Litauen" } - //LU { "Luxembourg" } - LV { "Letland" } - LY { "Libyen" } - MA { "Marokko" } - //MC { "Monaco" } - MD { "Moldova" } - MG { "Madagaskar" } - MH { "Marshall\u00f8erne" } - MK { "Republikken Makedonien" } - //ML { "Mali" } - //MM { "Myanmar" } - MN { "Mongoliet" } - MO { "SAR Macao" } - MP { "Nordmarianerne" } - //MQ { "Martinique" } - MR { "Mauretanien" } - //MS { "Montserrat" } - //MT { "Malta" } - //MU { "Mauritius" } - MV { "Maldiverne" } - //MW { "Malawi" } - //MX { "Mexico" } - //MY { "Malaysia" } - //MZ { "Mozambique" } - //NA { "Namibia" } - NC { "Ny Caledonien" } - //NE { "Niger" } - //NF { "Norfolk Island" } - //NG { "Nigeria" } - //NI { "Nicaragua" } - NL { "Holland" } - NO { "Norge" } - //NP { "Nepal" } - //NR { "Nauru" } - //NU { "Niue" } - //NZ { "New Zealand" } - //OM { "Oman" } - //PA { "Panama" } - //PE { "Peru" } - PF { "Fransk Polynesien" } - PG { "Papua Ny Guinea" } - PH { "Filippinerne" } - //PK { "Pakistan" } - PL { "Polen" } - PM { "Saint Pierre og Miquelon" } - //PN { "Pitcairn" } - //PR { "Puerto Rico" } - PS { "De pal\u00e6stinensiske omr\u00e5der" } - //PT { "Portugal" } - //PW { "Palau" } - //PY { "Paraguay" } - //QA { "Qatar" } - RE { "Reunion" } - RO { "Rum\u00e6nien" } - RU { "Rusland" } - //RW { "Rwanda" } - SA { "Saudi-Arabien" } - SB { "Salomon\u00f8erne" } - SC { "Seychellerne" } - //SD { "Sudan" } - SE { "Sverige" } - //SG { "Singapore" } - SH { "St. Helena" } - SI { "Slovenien" } - SJ { "Svalbard og Jan Mayen" } - SK { "Slovakiet" } - //SL { "Sierra Leone" } - //SM { "San Marino" } - //SN { "Senegal" } - //SO { "Somalia" } - SR { "Surinam" } - ST { "Sao Tome og Principe" } - //SV { "El Salvador" } - SY { "Syrien" } - //SZ { "Swaziland" } - TC { "Turks- og Caicos\u00f8erne" } - TD { "Tchad" } - TF { "Franske Besiddelser i Det Sydlige Indiske Ocean" } - //TG { "Togo" } - //TH { "Thailand" } - TJ { "Tadsjikistan" } - //TK { "Tokelau" } - TL { "\u00d8sttimor" } - //TM { "Turkmenistan" } - TN { "Tunesien" } - //TO { "Tonga" } - TR { "Tyrkiet" } - TT { "Trinidad og Tobago" } - //TV { "Tuvalu" } - //TW { "Taiwan" } - //TZ { "Tanzania" } - //UA { "Ukraine" } - //UG { "Uganda" } - UM { "De Mindre Amerikanske Overs\u00f8iske \u00d8er" } - US { "USA" } // This is a bad translation!//The translation { "USA" } is correct in my opinion. It is possible to use {"Amerikas Forenede Stater"} but it is not of common use. - //UY { "Uruguay" } - UZ { "Usbekistan" } - VA { "Vatikanstaten" } - VC { "St. Vincent og Grenadinerne" } - //VE { "Venezuela" } - VG { "De Britiske Jomfru\u00f8er" } - VI { "De Amerikanske Jomfru\u00f8er" } - //VN { "Vietnam" } - //VU { "Vanuatu" } - WF { "Wallis og Futuna\u00f8erne" } - //WS { "Samoa" } - //YE { "Yemen" } - //YT { "Mayotte" } - YU { "Jugoslavien" } - ZA { "Sydafrika" } - //ZM { "Zambia" } - //ZW { "Zimbabwe" } - } - DateTimeElements:intvector { - 2, - 4, - } - DateTimePatterns { - "'kl. 'H.mm.ss z", - "H.mm.ss z", - "H.mm.ss", - "H.mm", - "EEEE, d. MMMM yyyy", - "d. MMMM yyyy", - "d/M-yyyy", - "d/M-yy", - "{1} {0}", +/** + * ICU source: ../../../locale/icu/main/da.xml + */ +da{ + Countries{ + AD{"Andorra"} + AE{"Forenede Arabiske Emirater"} + AF{"Afghanistan"} + AG{"Antigua og Barbuda"} + AI{"Anguilla"} + AL{"Albanien"} + AM{"Armenien"} + AN{"Hollandske Antiller"} + AO{"Angola"} + AQ{"Antarktis"} + AR{"Argentina"} + AS{"Amerikansk Samoa"} + AT{"Østrig"} + AU{"Australien"} + AW{"Aruba"} + AZ{"Aserbajdsjan"} + BA{"Bosnien-Hercegovina"} + BB{"Barbados"} + BD{"Bangladesh"} + BE{"Belgien"} + BF{"Burkina Faso"} + BG{"Bulgarien"} + BH{"Bahrain"} + BI{"Burundi"} + BJ{"Benin"} + BM{"Bermuda"} + BN{"Brunei Darussalam"} + BO{"Bolivia"} + BR{"Brasilien"} + BS{"Bahamas"} + BT{"Bhutan"} + BV{"Bouvetø"} + BW{"Botswana"} + BY{"Hviderusland"} + BZ{"Belize"} + CA{"Canada"} + CC{"Cocos-øerne (Keelingøerne)"} + CD{"Den Demokratiske Republik Congo"} + CF{"Centralafrikanske Republik"} + CG{"Congo"} + CH{"Schweiz"} + CI{"Elfenbenskysten"} + CK{"Cook-øerne"} + CL{"Chile"} + CM{"Cameroun"} + CN{"Kina"} + CO{"Colombia"} + CR{"Costa Rica"} + CU{"Cuba"} + CV{"Kap Verde"} + CX{"Juleøen"} + CY{"Cypern"} + CZ{"Tjekkiet"} + DE{"Tyskland"} + DJ{"Djibouti"} + DK{"Danmark"} + DM{"Dominica"} + DO{"Den Dominikanske Republik"} + DZ{"Algeriet"} + EC{"Ecuador"} + EE{"Estland"} + EG{"Egypten"} + EH{"Vestsahara"} + ER{"Eritrea"} + ES{"Spanien"} + ET{"Etiopien"} + FI{"Finland"} + FJ{"Fiji-øerne"} + FK{"Falklandsøerne"} + FM{"Mikronesiens Forenede Stater"} + FO{"Færøerne"} + FR{"Frankrig"} + GA{"Gabon"} + GB{"Storbritannien"} + GD{"Grenada"} + GE{"Georgien"} + GF{"Fransk Guyana"} + GH{"Ghana"} + GI{"Gibraltar"} + GL{"Grønland"} + GM{"Gambia"} + GN{"Guinea"} + GP{"Guadeloupe"} + GQ{"Ækvatorialguinea"} + GR{"Grækenland"} + GS{"South Georgia og De Sydlige Sandwichøer"} + GT{"Guatemala"} + GU{"Guam"} + GW{"Guinea-Bissau"} + GY{"Guyana"} + HK{"SAR Hongkong"} + HM{"Heard- og McDonald-øerne"} + HN{"Honduras"} + HR{"Kroatien"} + HT{"Haiti"} + HU{"Ungarn"} + ID{"Indonesien"} + IE{"Irland"} + IL{"Israel"} + IN{"Indien"} + IO{"Det Britiske Territorium i Det Indiske Ocean"} + IQ{"Irak"} + IR{"Iran"} + IS{"Island"} + IT{"Italien"} + JM{"Jamaica"} + JO{"Jordan"} + JP{"Japan"} + KE{"Kenya"} + KG{"Kirgisistan"} + KH{"Cambodja"} + KI{"Kiribati"} + KM{"Comorerne"} + KN{"Saint Kitts og Nevis"} + KP{"Nordkorea"} + KR{"Sydkorea"} + KW{"Kuwait"} + KY{"Caymanøerne"} + KZ{"Kasakhstan"} + LA{"Laos"} + LB{"Libanon"} + LC{"Saint Lucia"} + LI{"Liechtenstein"} + LK{"Sri Lanka"} + LR{"Liberia"} + LS{"Lesotho"} + LT{"Litauen"} + LU{"Luxembourg"} + LV{"Letland"} + LY{"Libyen"} + MA{"Marokko"} + MC{"Monaco"} + MD{"Republikken Moldova"} + MG{"Madagaskar"} + MH{"Marshalløerne"} + MK{"Republikken Makedonien"} + ML{"Mali"} + MM{"Myanmar"} + MN{"Mongoliet"} + MO{"SAR Macao"} + MP{"Nordmarianerne"} + MQ{"Martinique"} + MR{"Mauretanien"} + MS{"Montserrat"} + MT{"Malta"} + MU{"Mauritius"} + MV{"Maldiverne"} + MW{"Malawi"} + MX{"Mexico"} + MY{"Malaysia"} + MZ{"Mozambique"} + NA{"Namibia"} + NC{"Ny Caledonien"} + NE{"Niger"} + NF{"Norfolk Island"} + NG{"Nigeria"} + NI{"Nicaragua"} + NL{"Holland"} + NO{"Norge"} + NP{"Nepal"} + NR{"Nauru"} + NU{"Niue"} + NZ{"New Zealand"} + OM{"Oman"} + PA{"Panama"} + PE{"Peru"} + PF{"Fransk Polynesien"} + PG{"Papua Ny Guinea"} + PH{"Filippinerne"} + PK{"Pakistan"} + PL{"Polen"} + PM{"Saint Pierre og Miquelon"} + PN{"Pitcairn"} + PR{"Puerto Rico"} + PS{"De palæstinensiske områder"} + PT{"Portugal"} + PW{"Palau"} + PY{"Paraguay"} + QA{"Qatar"} + RE{"Reunion"} + RO{"Rumænien"} + RU{"Rusland"} + RW{"Rwanda"} + SA{"Saudi-Arabien"} + SB{"Salomonøerne"} + SC{"Seychellerne"} + SD{"Sudan"} + SE{"Sverige"} + SG{"Singapore"} + SH{"St. Helena"} + SI{"Slovenien"} + SJ{"Svalbard og Jan Mayen"} + SK{"Slovakiet"} + SL{"Sierra Leone"} + SM{"San Marino"} + SN{"Senegal"} + SO{"Somalia"} + SP{"Serbien"} + SR{"Surinam"} + ST{"São Tomé og Príncipe"} + SV{"El Salvador"} + SY{"Syrien"} + SZ{"Swaziland"} + TC{"Turks- og Caicosøerne"} + TD{"Tchad"} + TF{"Franske Besiddelser i Det Sydlige Indiske Ocean"} + TG{"Togo"} + TH{"Thailand"} + TJ{"Tadsjikistan"} + TK{"Tokelau"} + TL{"Timor-Leste"} + TM{"Turkmenistan"} + TN{"Tunesien"} + TO{"Tonga"} + TR{"Tyrkiet"} + TT{"Trinidad og Tobago"} + TV{"Tuvalu"} + TW{"Taiwan"} + TZ{"Tanzania"} + UA{"Ukraine"} + UG{"Uganda"} + UM{"De Mindre Amerikanske Oversøiske Øer"} + US{"USA"} + UY{"Uruguay"} + UZ{"Usbekistan"} + VA{"Vatikanstaten"} + VC{"St. Vincent og Grenadinerne"} + VE{"Venezuela"} + VG{"De britiske jomfruøer"} + VI{"De amerikanske jomfruøer"} + VN{"Vietnam"} + VU{"Vanuatu"} + WF{"Wallis og Futunaøerne"} + WS{"Samoa"} + YE{"Yemen"} + YT{"Mayotte"} + YU{"Jugoslavien"} + ZA{"Sydafrika"} + ZM{"Zambia"} + ZW{"Zimbabwe"} } - DayAbbreviations { - "s\u00F8", - "ma", - "ti", - "on", - "to", - "fr", - "l\u00F8", - } - DayNames { - "s\u00F8ndag", - "mandag", - "tirsdag", - "onsdag", - "torsdag", - "fredag", - "l\u00F8rdag", + Currencies{ + ADD{ + "ADD", + "Andorransk diner", + } + ADP{ + "ADP", + "Andorransk peseta", + } + AED{ + "AED", + "Dirham fra de Forenede Arabiske Emirater", + } + AIF{ + "AIF", + "Affars og Issas franc", + } + ALK{ + "ALK", + "Albansk lek (1946-1961)", + } + ALL{ + "lek", + "Albansk lek", + } + ALV{ + "ALV", + "Albansk lek", + } + AMD{ + "dram", + "Armensk dram", + } + ANG{ + "NA f.", + "Gylden fra De Nederlandske Antiller", + } + AOA{ + "AOA", + "Angolansk kwanza", + } + AOK{ + "AOK", + "Angolansk kwanza (1977-1990)", + } + AON{ + "AON", + "Ny angolansk kwanza (1990-2000)", + } + AOR{ + "AOR", + "Angolansk kwanza reajustado (1995-1999)", + } + AOS{ + "AOS", + "Angolansk escudo", + } + ARA{ + "ARA", + "Argentinsk austral", + } + ARM{ + "ARM", + "Argentinsk peso moneda nacional", + } + ARP{ + "ARP", + "Argentinsk peso (1983-1985)", + } + ARS{ + "Arg$", + "Argentinsk peso", + } + ATS{ + "ATS", + "Østrigsk schilling", + } + AUD{ + "$A", + "Australsk dollar", + } + AUP{ + "AUP", + "Australsk pund", + } + AWG{ + "AWG", + "Arubansk gylden", + } + AZM{ + "AZM", + "Aserbajdsjansk manat", + } + BAD{ + "BAD", + "Bosnien-Hercegovinsk dinar", + } + BAM{ + "KM", + "Bosnien-Hercegovinsk konvertibel mark", + } + BAN{ + "BAN", + "Ny bosnien-hercegovinsk dinar", + } + BBD{ + "BDS$", + "Barbadisk dollar", + } + BDT{ + "Tk", + "Bangladeshisk taka", + } + BEC{ + "BEC", + "Belgisk franc (konvertibel)", + } + BEF{ + "BF", + "Belgisk franc", + } + BEL{ + "BEL", + "Belgisk franc (financial)", + } + BGL{ + "lev", + "Bulgarsk hard lev", + } + BGM{ + "BGM", + "Bulgarsk socialist lev", + } + BGN{ + "BGN", + "Ny Bulgarsk lev", + } + BGO{ + "BGO", + "Bulgarsk lev (1879-1952)", + } + BHD{ + "BD", + "Bahrainsk dinar", + } + BIF{ + "Fbu", + "Burundisk franc", + } + BMD{ + "Ber$", + "Bermudansk dollar", + } + BMP{ + "BMP", + "Bermudansk pund", + } + BND{ + "BND", + "Bruneisk dollar", + } + BOP{ + "BOP", + "Boliviansk peso", + } + BOV{ + "BOV", + "Boliviansk mvdol", + } + BRB{ + "BRB", + "Brasiliansk cruzeiro novo (1967-1986)", + } + BRC{ + "BRC", + "Brasiliansk cruzado", + } + BRE{ + "BRE", + "Brasiliansk cruzeiro (1990-1993)", + } + BRL{ + "R$", + "Brasiliansk real", + } + BRN{ + "BRN", + "Brasiliansk cruzado novo", + } + BRR{ + "BRR", + "Brasiliansk cruzeiro", + } + BRZ{ + "BRZ", + "Brasiliansk cruzeiro (1942-1967)", + } + BSD{ + "BSD", + "Bahamansk dollar", + } + BSP{ + "BSP", + "Bahamansk pund", + } + BTN{ + "Nu", + "Bhutansk ngultrum", + } + BTR{ + "BTR", + "Bhutansk rupee", + } + BUK{ + "BUK", + "Burmesisk kyat", + } + BUR{ + "BUR", + "Burmesisk rupee", + } + BWP{ + "BWP", + "Botswansk pula", + } + BYB{ + "BYB", + "Ny hviderussisk rubel (1994-1999)", + } + BYL{ + "BYL", + "Hviderussisk rubel (1992-1994)", + } + BYR{ + "Rbl", + "Hviderussisk rubel", + } + BZD{ + "BZ$", + "Belizisk dollar", + } + BZH{ + "BZH", + "Britisk Honduras dollar", + } + CAD{ + "Can$", + "Canadisk dollar", + } + CDF{ + "CDF", + "Congolesisk franc congolais", + } + CDG{ + "CDG", + "Congolesisk franc", + } + CDL{ + "CDL", + "Congolesisk Zaire", + } + CFF{ + "CFF", + "CFA-franc fra den Centralafrikanske republik", + } + CHF{ + "SwF", + "Schweizisk franc", + } + CKD{ + "CKD", + "Dollar fra Cookøerne", + } + CLC{ + "CLC", + "Chilensk condor", + } + CLE{ + "CLE", + "Chilensk escudo", + } + CLF{ + "CLF", + "Chilensk unidades de fomento", + } + CLP{ + "Ch$", + "Chilensk peso", + } + CMF{ + "CMF", + "Camerounsk CFA-franc", + } + CNP{ + "CNP", + "Kinesisk jen min piao yuan", + } + CNY{ + "Y", + "Kinesisk yuan renminbi", + } + COB{ + "COB", + "Colombiansk papirpeso", + } + COF{ + "COF", + "Congolesisk CFA-franc", + } + COP{ + "Col$", + "Colombiansk peso", + } + CRC{ + "C", + "Costaricansk colon", + } + CSC{ + "CSC", + "Tjekkoslovakisk koruna", + } + CSK{ + "CSK", + "Tjekkoslovakisk hard koruna", + } + CUP{ + "CUP", + "Cubansk peso", + } + CVE{ + "CVEsc", + "Kapverdisk escudo", + } + CWG{ + "CWG", + "Curacaosk gylden", + } + CYP{ + "£C", + "Cypriotisk pund", + } + CZK{ + "CZK", + "Tjekkisk koruna", + } + DDM{ + "DDM", + "Østtysk mark", + } + DEM{ + "DEM", + "Tysk mark", + } + DES{ + "DES", + "Tysk sperrmark", + } + DJF{ + "DF", + "Djiboutisk franc", + } + DKK{ + "kr", + "Dansk krone", + } + DOP{ + "RD$", + "Dominikansk peso", + } + DZD{ + "DA", + "Algerisk dinar", + } + DZF{ + "DZF", + "Ny algerisk franc", + } + DZG{ + "DZG", + "Algerisk franc germinal", + } + ECS{ + "ECS", + "Ecuadoriansk sucre", + } + EEK{ + "EEK", + "Estisk kroon", + } + EGP{ + "EGP", + "Egyptisk pund", + } + ERN{ + "ERN", + "Eritreisk nakfa", + } + ESP{ + "ESP", + "Spansk peseta", + } + ETB{ + "Br", + "Etiopisk birr", + } + ETD{ + "ETD", + "Etiopisk dollar", + } + EUR{ + "€", + "Euro", + } + FIM{ + "FIM", + "Finsk mark", + } + FIN{ + "FIN", + "Finsk mark (1860-1962)", + } + FJD{ + "F$", + "Fijiansk dollar", + } + FJP{ + "FJP", + "Fijiansk pund", + } + FKP{ + "FKP", + "Pund fra Falklandsøerne", + } + FOK{ + "FOK", + "Færøsk krone", + } + FRF{ + "FRF", + "Fransk franc", + } + GAF{ + "GAF", + "Gabonesisk CFA-franc", + } + GBP{ + "£", + "Britisk pund", + } + GEK{ + "GEK", + "Georgisk kupon larit", + } + GEL{ + "lari", + "Georgisk lari", + } + GHC{ + "GHC", + "Ghanesisk cedi", + } + GHO{ + "GHO", + "Gammel ghanesisk cedi", + } + GHP{ + "GHP", + "Ghanesisk pund", + } + GHR{ + "GHR", + "Ghanesisk revalueret cedi", + } + GIP{ + "GIP", + "Gibraltarisk pund", + } + GLK{ + "GLK", + "Grønlandsk krone", + } + GMD{ + "GMD", + "Gambisk dalasi", + } + GMP{ + "GMP", + "Gambisk pund", + } + GNF{ + "GF", + "Guineansk franc", + } + GNI{ + "GNI", + "Guineansk franc (1960-1972)", + } + GNS{ + "GNS", + "Guineansk syli", + } + GPF{ + "GPF", + "Guadeloupsk franc", + } + GQE{ + "GQE", + "Ækvatorialguineask ekwele guineana", + } + GQF{ + "GQF", + "Ækvatorialguineask franco", + } + GQP{ + "GQP", + "Ækvatorialguineask peseta guineana", + } + GRD{ + "GRD", + "Græsk drachma", + } + GRN{ + "GRN", + "Ny græsk drachma", + } + GTQ{ + "Q", + "Guatemalansk quetzal", + } + GUF{ + "GUF", + "Fransk-guyansk franc guiana", + } + GWE{ + "GWE", + "Portugisisk guinea escudo", + } + GWM{ + "GWM", + "Portugisisk guinea mil reis", + } + GWP{ + "GWP", + "Guineansk peso", + } + GYD{ + "G$", + "Guyansk dollar", + } + HNL{ + "L", + "Honduransk lempira", + } + HRD{ + "HRD", + "Kroatisk dinar", + } + HRK{ + "HRK", + "Kroatisk kuna", + } + HTG{ + "HTG", + "Haitisk gourde", + } + HUF{ + "Ft", + "Ungarsk forint", + } + IBP{ + "IBP", + "Nordirsk pund", + } + IDG{ + "IDG", + "Indonesisk nica guilder", + } + IDJ{ + "IDJ", + "Indonesisk java rupiah", + } + IDN{ + "IDN", + "Ny indonesisk rupiah", + } + IDR{ + "Rp", + "Indonesisk pupiah", + } + IEP{ + "IR£", + "Irsk pund", + } + ILL{ + "ILL", + "Israelsk shekel", + } + ILP{ + "ILP", + "Israelsk pund", + } + ILS{ + "ILS", + "Ny israelsk shekel", + } + INR{ + "=0#Rs.|1#Re.|1 vormittags -> in the morning - // nachm. -> nachmittags -> in the afternoon - AmPmMarkers { - "vorm.", - "nachm.", - } - Countries { - //AF { "Afghanistan" } - EG { "\u00c4gypten" } - AL { "Albanien" } - DZ { "Algerien" } - //AD { "Andorra" } - //AO { "Angola" } - AG { "Antigua und Barbuda" } - GQ { "\u00c4quatorialguinea" } - AR { "Argentinien" } - AM { "Armenien" } - AZ { "Aserbaidschan" } - ET { "\u00c4thiopien" } - AU { "Australien" } - //BS { "Bahamas" } - //BH { "Bahrain" } - BD { "Bangladesch" } - //BB { "Barbados" } - BE { "Belgien" } - //BZ { "Belize" } - //BJ { "Benin" } - //BT { "Bhutan" } - BO { "Bolivien" } - BA { "Bosnien und Herzegowina" } - BW { "Botsuana" } - BR { "Brasilien" } - BN { "Brunei Darussalam" } - BG { "Bulgarien" } - //BF { "Burkina Faso" } - //BI { "Burundi" } - //CL { "Chile" } - //CN { "China" } - //CR { "Costa Rica" } - CI { "Elfenbeink\u00fcste" } - DK { "D\u00e4nemark" } - DE { "Deutschland" } - //DM { "Dominica" } - DO { "Dominikanische Republik" } - DJ { "Dschibuti" } - //EC { "Ecuador" } - //SV { "El Salvador" } - //ER { "Eritrea" } - EE { "Estland" } - FJ { "Fidschi" } - FI { "Finnland" } - FR { "Frankreich" } - GA { "Gabun" } - //GM { "Gambia" } - GE { "Georgien" } - //GH { "Ghana" } - //GD { "Grenada" } - GR { "Griechenland" } - //GT { "Guatemala" } - //GN { "Guinea" } - //GW { "Guinea-Bissau" } - //GY { "Guyana" } - //HT { "Haiti" } - //HN { "Honduras" } - IN { "Indien" } - ID { "Indonesien" } - IQ { "Irak" } - //IR { "Iran" } - IE { "Irland" } - IS { "Island" } - //IL { "Israel" } - IT { "Italien" } - JM { "Jamaika" } - //JP { "Japan" } - YE { "Jemen" } - JO { "Jordanien" } - YU { "Jugoslawien" } - KH { "Kambodscha" } - CM { "Kamerun" } - CA { "Kanada" } - CV { "Kap Verde" } - KZ { "Kasachstan" } - QA { "Katar" } - KE { "Kenia" } - KG { "Kirgisistan" } - //KI { "Kiribati" } - CO { "Kolumbien" } - KM { "Komoren" } - CG { "Kongo" } - CD { "Demokratische Republik Kongo" } - KP { "Demokratische Volksrepublik Korea" } - KR { "Korea, Republik" } - HR { "Kroatien" } - CU { "Kuba" } - //KW { "Kuwait" } - //LA { "Laos" } - //LS { "Lesotho" } - LV { "Lettland" } - LB { "Libanon" } - //LR { "Liberia" } - LY { "Libyen" } - //LI { "Liechtenstein" } - LT { "Litauen" } - LU { "Luxemburg" } - MG { "Madagaskar" } - //MW { "Malawi" } - //MY { "Malaysia" } - MV { "Malediven" } - //ML { "Mali" } - //MT { "Malta" } - MA { "Marokko" } - MH { "Marshallinseln" } - MR { "Mauretanien" } - //MU { "Mauritius" } - MK { "Mazedonien" } - MX { "Mexiko" } - FM { "Mikronesien" } - MD { "Moldau, Republik" } // D-Localizer: "Moldawien, Republik" is incorrect - //MC { "Monaco" } - MN { "Mongolei" } - MZ { "Mosambik" } - //MM { "Myanmar" } - //NA { "Namibia" } - //NR { "Nauru" } - //NP { "Nepal" } - NZ { "Neuseeland" } - //NI { "Nicaragua" } - NL { "Niederlande" } - //NE { "Niger" } - //NG { "Nigeria" } - NO { "Norwegen" } - //OM { "Oman" } - AT { "\u00d6sterreich" } - //PK { "Pakistan" } - //PW { "Palau" } - //PA { "Panama" } - PG { "Papua-Neuguinea" } - //PY { "Paraguay" } - //PE { "Peru" } - PH { "Philippinen" } - PL { "Polen" } - //PT { "Portugal" } - RW { "Ruanda" } - RO { "Rum\u00e4nien" } - RU { "Russische F\u00f6deration" } - KN { "St. Kitts und Nevis" } - LC { "St. Lucia" } - VC { "St. Vincent und die Grenadinen" } - SB { "Salomonen" } - ZM { "Sambia" } - //WS { "Samoa" } - //SM { "San Marino" } - ST { "S\u00e3o Tom\u00e9 und Pr\u00edncipe" } - SA { "Saudi-Arabien" } - SE { "Schweden" } - CH { "Schweiz" } - //SN { "Senegal" } - SC { "Seychellen" } - //SL { "Sierra Leone" } - ZW { "Simbabwe" } - SG { "Singapur" } - SK { "Slowakei" } - SI { "Slowenien" } - //SO { "Somalia" } - ES { "Spanien" } - //LK { "Sri Lanka" } - ZA { "S\u00fcdafrika" } - //SD { "Sudan" } - //SR { "Suriname" } - SZ { "Swasiland" } - SY { "Syrien" } - TJ { "Tadschikistan" } - //TW { "Taiwan" } - TZ { "Tansania" } - //TH { "Thailand" } - //TG { "Togo" } - //TO { "Tonga" } - TT { "Trinidad und Tobago" } - TD { "Tschad" } - CZ { "Tschechische Republik" } - TN { "Tunesien" } - TR { "T\u00fcrkei" } - //TM { "Turkmenistan" } - //TV { "Tuvalu" } - //UG { "Uganda" } - //UA { "Ukraine" } - HU { "Ungarn" } - //UY { "Uruguay" } - UZ { "Usbekistan" } - //VU { "Vanuatu" } - VA { "Vatikanstadt" } - //VE { "Venezuela" } - AE { "Vereinigte Arabische Emirate" } - GB { "Vereinigtes K\u00f6nigreich" } - US { "Vereinigte Staaten" } - //VN { "Vietnam" } - BY { "Wei\u00dfrussland" } - CF { "Zentralafrikanische Republik" } - CY { "Zypern" } - - UM { "Amerikanisch-Ozeanien" } - AS { "Amerikanisch-Samoa" } - VI { "Amerikanische Jungferninseln" } - //AI { "Anguilla" } - AQ { "Antarktis" } - //AW { "Aruba" } - SJ { "Svalbard und Jan Mayen" } - //BM { "Bermuda" } - BV { "Bouvetinsel" } - VG { "Britische Jungferninseln" } - IO { "Britisches Territorium im Indischen Ozean" } - CK { "Cookinseln" } - FK { "Falklandinseln" } - FO { "F\u00e4r\u00f6er-Inseln" } - GF { "Franz\u00f6sisch-Guayana" } - PF { "Franz\u00f6sisch-Polynesien" } - TF { "Franz\u00f6sische S\u00fcd- und Antarktisgebiete" } - //GI { "Gibraltar" } - GL { "Gr\u00f6nland" } - //GP { "Guadeloupe" } - //GU { "Guam" } - HM { "Heard und McDonaldinseln" } - KY { "Cayman-Inseln" } // D-Localizer translated - CC { "Kokosinseln" } - //MO { "Macau S.A.R.,China" } - //MQ { "Martinique" } - //YT { "Mayotte" } - //MS { "Montserrat" } - NC { "Neukaledonien" } - AN { "Niederl\u00e4ndische Antillen" } - //NU { "Niue" } - MP { "N\u00f6rdliche Marianen" } - NF { "Norfolkinsel" } - //PN { "Pitcairn" } - //PR { "Puerto Rico" } - RE { "R\u00e9union" } - SH { "St. Helena" } - PM { "St. Pierre und Miquelon" } - GS { "S\u00fcdgeorgien und die S\u00fcdlichen Sandwichinseln" } - //TK { "Tokelau" } - TC { "Turks- und Caicosinseln" } - WF { "Wallis und Futuna" } - CX { "Weihnachtsinsel" } - - // some entries that are not in the official list: - //EH { "West Sahara" } - //HK { "Hong Kong S.A.R., China" } - SP { "Serbien" } - // Zaire is now the Democratic Republic of Congo (CD) - // same as in root: ZR { "Zaire" } - } - DateTimeElements:intvector { - 2, - 4, - } - DateTimePatterns { - "H:mm' Uhr 'z", - "HH:mm:ss z", - "HH:mm:ss", - "HH:mm", - "EEEE, d. MMMM yyyy", - "d. MMMM yyyy", - "dd.MM.yyyy", - "dd.MM.yy", - "{1} {0}", - } - DayAbbreviations { - "So", - "Mo", - "Di", - "Mi", - "Do", - "Fr", - "Sa", - } - DayNames { - "Sonntag", - "Montag", - "Dienstag", - "Mittwoch", - "Donnerstag", - "Freitag", - "Samstag", +/** + * ICU source: ../../../locale/icu/main/de.xml + */ +de{ + Countries{ + AD{"Andorra"} + AE{"Vereinigte Arabische Emirate"} + AF{"Afghanistan"} + AG{"Antigua und Barbuda"} + AI{"Anguilla"} + AL{"Albanien"} + AM{"Armenien"} + AN{"Niederländische Antillen"} + AO{"Angola"} + AQ{"Antarktis"} + AR{"Argentinien"} + AS{"Amerikanisch-Samoa"} + AT{"Österreich"} + AU{"Australien"} + AW{"Aruba"} + AZ{"Aserbaidschan"} + BA{"Bosnien und Herzegowina"} + BB{"Barbados"} + BD{"Bangladesch"} + BE{"Belgien"} + BF{"Burkina Faso"} + BG{"Bulgarien"} + BH{"Bahrain"} + BI{"Burundi"} + BJ{"Benin"} + BM{"Bermuda"} + BN{"Brunei Darussalam"} + BO{"Bolivien"} + BR{"Brasilien"} + BS{"Bahamas"} + BT{"Bhutan"} + BV{"Bouvetinsel"} + BW{"Botsuana"} + BY{"Belarus"} + BZ{"Belize"} + CA{"Kanada"} + CC{"Kokosinseln (Keeling)"} + CD{"Demokratische Republik Kongo"} + CF{"Zentralafrikanische Republik"} + CG{"Kongo"} + CH{"Schweiz"} + CI{"Côte d’Ivoire"} + CK{"Cookinseln"} + CL{"Chile"} + CM{"Kamerun"} + CN{"China"} + CO{"Kolumbien"} + CR{"Costa Rica"} + CU{"Kuba"} + CV{"Kap Verde"} + CX{"Weihnachtsinsel"} + CY{"Zypern"} + CZ{"Tschechische Republik"} + DE{"Deutschland"} + DJ{"Dschibuti"} + DK{"Dänemark"} + DM{"Dominica"} + DO{"Dominikanische Republik"} + DZ{"Algerien"} + EC{"Ecuador"} + EE{"Estland"} + EG{"Ägypten"} + EH{"Westsahara"} + ER{"Eritrea"} + ES{"Spanien"} + ET{"Äthiopien"} + FI{"Finnland"} + FJ{"Fidschi"} + FK{"Falklandinseln"} + FM{"Mikronesien"} + FO{"Färöer"} + FR{"Frankreich"} + GA{"Gabun"} + GB{"Vereinigtes Königreich"} + GD{"Grenada"} + GE{"Georgien"} + GF{"Französisch-Guayana"} + GH{"Ghana"} + GI{"Gibraltar"} + GL{"Grönland"} + GM{"Gambia"} + GN{"Guinea"} + GP{"Guadeloupe"} + GQ{"Äquatorialguinea"} + GR{"Griechenland"} + GS{"Südgeorgien und die Südlichen Sandwichinseln"} + GT{"Guatemala"} + GU{"Guam"} + GW{"Guinea-Bissau"} + GY{"Guyana"} + HK{"Hong Kong S.A.R., China"} + HM{"Heard und McDonaldinseln"} + HN{"Honduras"} + HR{"Kroatien"} + HT{"Haiti"} + HU{"Ungarn"} + ID{"Indonesien"} + IE{"Irland"} + IL{"Israel"} + IN{"Indien"} + IO{"Britisches Territorium im Indischen Ozean"} + IQ{"Irak"} + IR{"Iran"} + IS{"Island"} + IT{"Italien"} + JM{"Jamaika"} + JO{"Jordanien"} + JP{"Japan"} + KE{"Kenia"} + KG{"Kirgisistan"} + KH{"Kambodscha"} + KI{"Kiribati"} + KM{"Komoren"} + KN{"St. Kitts und Nevis"} + KP{"Demokratische Volksrepublik Korea"} + KR{"Republik Korea"} + KW{"Kuwait"} + KY{"Kaimaninseln"} + KZ{"Kasachstan"} + LA{"Laos"} + LB{"Libanon"} + LC{"St. Lucia"} + LI{"Liechtenstein"} + LK{"Sri Lanka"} + LR{"Liberia"} + LS{"Lesotho"} + LT{"Litauen"} + LU{"Luxemburg"} + LV{"Lettland"} + LY{"Libyen"} + MA{"Marokko"} + MC{"Monaco"} + MD{"Republik Moldau"} + MG{"Madagaskar"} + MH{"Marshallinseln"} + MK{"Mazedonien"} + ML{"Mali"} + MM{"Myanmar"} + MN{"Mongolei"} + MO{"Macau S.A.R., China"} + MP{"Nördliche Marianen"} + MQ{"Martinique"} + MR{"Mauretanien"} + MS{"Montserrat"} + MT{"Malta"} + MU{"Mauritius"} + MV{"Malediven"} + MW{"Malawi"} + MX{"Mexiko"} + MY{"Malaysia"} + MZ{"Mosambik"} + NA{"Namibia"} + NC{"Neukaledonien"} + NE{"Niger"} + NF{"Norfolkinsel"} + NG{"Nigeria"} + NI{"Nicaragua"} + NL{"Niederlande"} + NO{"Norwegen"} + NP{"Nepal"} + NR{"Nauru"} + NU{"Niue"} + NZ{"Neuseeland"} + OM{"Oman"} + PA{"Panama"} + PE{"Peru"} + PF{"Französisch-Polynesien"} + PG{"Papua-Neuguinea"} + PH{"Philippinen"} + PK{"Pakistan"} + PL{"Polen"} + PM{"St. Pierre und Miquelon"} + PN{"Pitcairn"} + PR{"Puerto Rico"} + PS{"Palästinensische Gebiete"} + PT{"Portugal"} + PW{"Palau"} + PY{"Paraguay"} + QA{"Katar"} + RE{"Réunion"} + RO{"Rumänien"} + RU{"Russische Föderation"} + RW{"Ruanda"} + SA{"Saudi-Arabien"} + SB{"Salomonen"} + SC{"Seychellen"} + SD{"Sudan"} + SE{"Schweden"} + SG{"Singapur"} + SH{"St. Helena"} + SI{"Slowenien"} + SJ{"Svalbard und Jan Mayen"} + SK{"Slowakei"} + SL{"Sierra Leone"} + SM{"San Marino"} + SN{"Senegal"} + SO{"Somalia"} + SP{"Serbien"} + SR{"Suriname"} + ST{"São Tomé und Príncipe"} + SV{"El Salvador"} + SY{"Syrien"} + SZ{"Swasiland"} + TC{"Turks- und Caicosinseln"} + TD{"Tschad"} + TF{"Französische Süd- und Antarktisgebiete"} + TG{"Togo"} + TH{"Thailand"} + TJ{"Tadschikistan"} + TK{"Tokelau"} + TL{"Osttimor"} + TM{"Turkmenistan"} + TN{"Tunesien"} + TO{"Tonga"} + TR{"Türkei"} + TT{"Trinidad und Tobago"} + TV{"Tuvalu"} + TW{"Taiwan"} + TZ{"Tansania"} + UA{"Ukraine"} + UG{"Uganda"} + UM{"Amerikanisch-Ozeanien"} + US{"Vereinigte Staaten"} + UY{"Uruguay"} + UZ{"Usbekistan"} + VA{"Vatikanstadt"} + VC{"St. Vincent und die Grenadinen"} + VE{"Venezuela"} + VG{"Britische Jungferninseln"} + VI{"Amerikanische Jungferninseln"} + VN{"Vietnam"} + VU{"Vanuatu"} + WF{"Wallis und Futuna"} + WS{"Samoa"} + YE{"Jemen"} + YT{"Mayotte"} + YU{"Jugoslawien"} + ZA{"Südafrika"} + ZM{"Sambia"} + ZW{"Simbabwe"} } - Eras { - "v. Chr.", - "n. Chr.", + Currencies{ + ADD{ + "ADD", + "Andorranischer Diner", + } + ADP{ + "ADP", + "Andorranische Pesete", + } + AED{ + "AED", + "UAE Dirham", + } + AFA{ + "AFA", + "Afghani", + } + AFN{ + "Af", + "Afghani", + } + AIF{ + "AIF", + "Afar und Issa Franc", + } + ALK{ + "ALK", + "Albanischer Lek (1946-1961)", + } + ALL{ + "ALL", + "Lek", + } + ALV{ + "ALV", + "Albanischer Lek Valute", + } + AMD{ + "AMD", + "Dram", + } + ANG{ + "ANG", + "Niederl. Antillen Gulden", + } + AOA{ + "AOA", + "Kwanza", + } + AOK{ + "AOK", + "Angolanischer Kwanza (1977-1990)", + } + AON{ + "AON", + "Neuer Kwanza", + } + AOR{ + "AOR", + "Kwanza Reajustado", + } + AOS{ + "AOS", + "Angolanischer Escudo", + } + ARA{ + "ARA", + "Argentinischer Austral", + } + ARM{ + "ARM", + "Argentinischer Peso Moneda Nacional", + } + ARP{ + "ARP", + "Argentinischer Peso (1983-1985)", + } + ARS{ + "ARS", + "Argentinischer Peso", + } + ATS{ + "öS", + "Österreichischer Schilling", + } + AUD{ + "AUD", + "Australischer Dollar", + } + AUP{ + "AUP", + "Australisches Pfund", + } + AWG{ + "AWG", + "Aruba Florin", + } + AZM{ + "AZM", + "Aserbeidschan Manat", + } + BAD{ + "BAD", + "Bosnien und Herzegowina Dinar", + } + BAM{ + "BAM", + "Konvertierbare Mark", + } + BAN{ + "BAN", + "Bosnien und Herzegowina Neuer Dinar", + } + BBD{ + "BBD", + "Barbados-Dollar", + } + BDT{ + "BDT", + "Taka", + } + BEC{ + "BEC", + "Belgischer Franc (konvertibel)", + } + BEF{ + "BEF", + "Belgischer Franc", + } + BGL{ + "BGL", + "Lew", + } + BGN{ + "BGN", + "Lew", + } + BGO{ + "BGO", + "Lew (1879-1952)", + } + BHD{ + "BHD", + "Bahrain-Dinar", + } + BIF{ + "BIF", + "Burundi-Franc", + } + BMD{ + "BMD", + "Bermuda-Dollar", + } + BMP{ + "BMP", + "Bermuda-Pfund", + } + BND{ + "BND", + "Brunei-Dollar", + } + BOB{ + "BOB", + "Boliviano", + } + BOL{ + "BOL", + "Boliviano (1863-1962)", + } + BOP{ + "BOP", + "Bolivianischer Peso", + } + BOV{ + "BOV", + "Mvdol", + } + BRB{ + "BRB", + "Brasilianischer Cruzeiro Novo (1967-1986)", + } + BRC{ + "BRC", + "Brasilianischer Cruzado", + } + BRE{ + "BRE", + "Brasilianischer Cruzeiro (1990-1993)", + } + BRL{ + "BRL", + "Real", + } + BRN{ + "BRN", + "Brasilianischer Cruzado Novo", + } + BRR{ + "BRR", + "Brasilianischer Cruzeiro", + } + BRZ{ + "BRZ", + "Brasilianischer Cruzeiro (1942-1967)", + } + BSD{ + "BSD", + "Bahama-Dollar", + } + BSP{ + "BSP", + "Bahama-Pfund", + } + BTN{ + "BTN", + "Ngultrum", + } + BTR{ + "BTR", + "Bhutan Rupie", + } + BUK{ + "BUK", + "Birmanischer Kyat", + } + BUR{ + "BUR", + "Birmanische Rupie", + } + BWP{ + "BWP", + "Pula", + } + BYB{ + "BYB", + "Belarus Rubel (alt)", + } + BYL{ + "BYL", + "Belarus Rubel (1992-1994)", + } + BYR{ + "BYR", + "Belarus Rubel (neu)", + } + BZD{ + "BZD", + "Belize-Dollar", + } + CAD{ + "CAD", + "Kanadischer Dollar", + } + CDF{ + "CDF", + "Franc congolais", + } + CDG{ + "CDG", + "Republik Kongo Franc", + } + CDL{ + "CDL", + "Kongolesische Zaire", + } + CFF{ + "CFF", + "Zentralafrikanische Republik CFA Franc", + } + CHF{ + "SFr.", + "Schweizer Franken", + } + CLC{ + "CLC", + "Chilenischer Condor", + } + CLE{ + "CLE", + "Chilenischer Escudo", + } + CLF{ + "CLF", + "Unidades de Fomento", + } + CLP{ + "CLP", + "Chilenischer Peso", + } + CMF{ + "CMF", + "Kamerun CFA Franc", + } + CNP{ + "CNP", + "Chinesischer Jen Min Piao Yuan", + } + CNY{ + "CNY", + "Renminbi Yuan", + } + COB{ + "COB", + "Kolumbianischer Papier-Peso", + } + COF{ + "COF", + "Kongo CFA Franc", + } + COP{ + "COP", + "Kolumbianischer Peso", + } + CRC{ + "CRC", + "Costa Rica Colon", + } + CSC{ + "CSC", + "Tschechoslowakische Krone", + } + CUP{ + "CUP", + "Kubanischer Peso", + } + CVE{ + "CVE", + "Kap Verde Escudo", + } + CYP{ + "CYP", + "Zypern Pfund", + } + CZK{ + "CZK", + "Tschechische Krone", + } + DEM{ + "DM", + "Deutsche Mark", + } + DES{ + "DES", + "Sperrmark", + } + DJF{ + "DJF", + "Dschibuti-Franc", + } + DKK{ + "DKK", + "Dänische Krone", + } + DOP{ + "DOP", + "Dominikanischer Peso", + } + DZD{ + "DZD", + "Algerischer Dinar", + } + DZF{ + "DZF", + "Algerischer Neuer Franc", + } + DZG{ + "DZG", + "Algerischer Franc Germinal", + } + ECS{ + "ECS", + "Ecuadorianischer Sucre", + } + ECV{ + "ECV", + "Verrechnungseinheit für EC", + } + EEK{ + "EEK", + "Estnische Krone", + } + EGP{ + "EGP", + "Ägyptisches Pfund", + } + ERN{ + "ERN", + "Nakfa", + } + ESP{ + "ESP", + "Spanische Pesete", + } + ETB{ + "ETB", + "Birr", + } + ETD{ + "ETD", + "Äthiopischer Dollar", + } + EUR{ + "€", + "Euro", + } + FIM{ + "FIM", + "Finnische Mark", + } + FIN{ + "FIN", + "Finnische Mark (1860-1962)", + } + FJD{ + "FJD", + "Fidschi Dollar", + } + FJP{ + "FJP", + "Fidschi Pfund", + } + FKP{ + "FKP", + "Falkland Pfund", + } + FOK{ + "FOK", + "Färöer Inseln Krone", + } + FRF{ + "FF", + "Französischer Franc", + } + FRG{ + "FRG", + "Französischer Franc Germinal/Franc Poincare", + } + GBP{ + "£", + "Pfund Sterling", + } + GEK{ + "GEK", + "Georgischer Kupon Larit", + } + GEL{ + "GEL", + "Georgischer Lari", + } + GHC{ + "GHC", + "Cedi", + } + GHO{ + "GHO", + "Ghana Cedi (alt)", + } + GHP{ + "GHP", + "Ghana Pfund", + } + GIP{ + "GIP", + "Gibraltar Pfund", + } + GLK{ + "GLK", + "Grönland Krone", + } + GMD{ + "GMD", + "Dalasi", + } + GMP{ + "GMP", + "Gambia Pfund", + } + GNF{ + "GNF", + "Guinea Franc", + } + GQE{ + "GQE", + "Äquatorialguinea Ekwele Guineana", + } + GQF{ + "GQF", + "Äquatorialguinea Franco", + } + GQP{ + "GQP", + "Äquatorialguinea Peseta Guineana", + } + GRD{ + "GRD", + "Griechische Drachme", + } + GRN{ + "GRN", + "Neue Griechische Drachme", + } + GTQ{ + "GTQ", + "Quetzal", + } + GUF{ + "GUF", + "Französisch Guayana Franc Guiana", + } + GWE{ + "GWE", + "Portugiesisch Guinea Escudo", + } + GWM{ + "GWM", + "Portugiesisch Guinea Mil Reis", + } + GWP{ + "GWP", + "Guinea Bissau Peso", + } + GYD{ + "GYD", + "Guyana Dollar", + } + HKD{ + "HKD", + "Hongkong Dollar", + } + HNL{ + "HNL", + "Lempira", + } + HRD{ + "HRD", + "Kroatischer Dinar", + } + HRK{ + "HRK", + "Kuna", + } + HTG{ + "HTG", + "Gourde", + } + HUF{ + "HUF", + "Forint", + } + IBP{ + "IBP", + "Nordirisches Pfund", + } + IDG{ + "IDG", + "Indonesischer Nica Guilder", + } + IDJ{ + "IDJ", + "Indonesische Java Rupiah", + } + IDN{ + "IDN", + "Indonesische Neue Rupiah", + } + IDR{ + "IDR", + "Rupiah", + } + IEP{ + "IEP", + "Irisches Pfund", + } + ILL{ + "ILL", + "Schekel", + } + ILP{ + "ILP", + "Israelisches Pfund", + } + ILS{ + "ILS", + "Schekel", + } + INR{ + "=0#Rs.|1#Re.|1>;\n" - " x.x: << komma >>;\n" - " null; eins; =%%main=;\n" - "%%main:\n" - // words for numbers from 0 to 12. Notice that the values - // from 13 to 19 can derived algorithmically, unlike in most - // other languages - " null; ein; zwei; drei; vier; f\u00fcnf; sechs; sieben; acht; neun;\n" - " zehn; elf; zw\u00f6lf; >>zehn;\n" - // rules for the multiples of 10. Notice that the ones digit - // goes on the front - " 20: [>>und]zwanzig;\n" - " 30: [>>und]drei\u00dfig;\n" - " 40: [>>und]vierzig;\n" - " 50: [>>und]f\u00fcnfzig;\n" - " 60: [>>und]sechzig;\n" - " 70: [>>und]siebzig;\n" - " 80: [>>und]achtzig;\n" - " 90: [>>und]neunzig;\n" - " 100: hundert[>%alt-ones>];\n" - " 200: <%alt-ones>];\n" - " 1000: tausend[>%alt-ones>];\n" - " 2000: <%alt-ones>];\n" - " 1,000,000: eine Million[ >%alt-ones>];\n" - " 2,000,000: << Millionen[ >%alt-ones>];\n" - " 1,000,000,000: eine Milliarde[ >%alt-ones>];\n" - " 2,000,000,000: << Milliarden[ >%alt-ones>];\n" - " 1,000,000,000,000: eine Billion[ >%alt-ones>];\n" - " 2,000,000,000,000: << Billionen[ >%alt-ones>];\n" - " 1,000,000,000,000,000: =#,##0=;" - "%%lenient-parse:\n" - " &\u0000 << ' ' << '-'\n" - " & ae , \u00e4 & ae , \u00c4\n" - " & oe , \u00f6 & oe , \u00d6\n" - " & ue , \u00fc & ue , \u00dc\n" - } - - // Currency display names - - // See for example "W\u00e4hrungscodes" at - // http://www-cik.uni-paderborn.de/vddk/Dokumentationen/Dokumentation_IDM_1_3/ISO-Tabellen/Wahrungscodes/body_wahrungscodes.html - // (On the page it says "Quelle: gem\u00e4\u00df ISO 4217 3-alpha-code (Stand: Juli 2000)" - // and "Verzeichnis der ISO-Codes f\u00FCr W\u00e4hrung mit Land".) - - // See also http://umrechnen.de/ - Currencies { - AED { "AED", "UAE Dirham" } - AFA { "AFA", "Afghani" } - ALL { "ALL", "Lek" } - AMD { "AMD", "Dram" } - ANG { "ANG", "Niederl. Antillen Gulden" } - AOA { "AOA", "Kwanza" } - AON { "AON", "Neuer Kwanza" } - AOR { "AOR", "Kwanza Reajustado" } - ARS { "ARS", "Argentinischer Peso" } - ATS { "\u00F6S", "\u00D6sterreichischer Schilling" } - AUD { "AUD", "Australischer Dollar" } - AWG { "AWG", "Aruba Florin" } - AZM { "AZM", "Aserbeidschan Manat" } - BAM { "BAM", "Konvertierbare Mark" } - BBD { "BBD", "Barbados-Dollar" } - BDT { "BDT", "Taka" } - BEF { "BEF", "Belgischer Franc" } - BGL { "BGL", "Lew" } - BGN { "BGN", "Bulgarian Lev" } - BHD { "BHD", "Bahrain-Dinar" } - BIF { "BIF", "Burundi-Franc" } - BMD { "BMD", "Bermuda-Dollar" } - BND { "BND", "Brunei-Dollar" } - BOB { "BOB", "Boliviano" } - BOV { "BOV", "Mvdol" } // financial instrument - BRL { "BRL", "Real" } - BSD { "BSD", "Bahama-Dollar" } - BTN { "BTN", "Ngultrum" } - BWP { "BWP", "Pula" } - BYB { "BYB", "Belarus Rubel (alt)" } - BYR { "BYR", "Belarus Rubel (neu)" } - BZD { "BZD", "Belize-Dollar" } - CAD { "CAD", "Kanadischer Dollar" } - CDF { "CDF", "Franc congolais" } - CHF { "SFr.", "Schweizer Franken" } - CLF { "CLF", "Unidades de Fomento" } - CLP { "CLP", "Chilenischer Peso" } - CNY { "CNY", "Renminbi Yuan" } - COP { "COP", "Kolumbianischer Peso" } - CRC { "CRC", "Costa Rica Colon" } - CUP { "CUP", "Kubanischer Peso" } - CVE { "CVE", "Kap Verde Escudo" } - CYP { "CYP", "Zypern Pfund" } - CZK { "CZK", "Tschechische Krone" } - DEM { "DM", "Deutsche Mark" } - DJF { "DJF", "Dschibuti-Franc" } - DKK { "DKK", "D\u00E4nische Krone" } - DOP { "DOP", "Dominikanischer Peso" } - DZD { "DZD", "Algerischer Dinar" } - ECS { "ECS", "Ecuadorianischer Sucre" } - ECV { "ECV", "Verrechnungseinheit f\u00FCr EC" } - EEK { "EEK", "Estnische Krone" } - EGP { "EGP", "\u00C4gyptisches Pfund" } - ERN { "ERN", "Nakfa" } - ESP { "ESP", "Spanische Pesete" } - ETB { "ETB", "Birr" } - EUR { "\u20AC", "Euro" } - FIM { "FIM", "Finnische Mark" } - FJD { "FJD", "Fidschi Dollar" } - FKP { "FKP", "Falkland Pfund" } - FRF { "FF", "Franz\u00F6sischer Franc" } - GBP { "\u00A3", "Pfund Sterling" } - GEL { "GEL", "Georgischer Lari" } - GHC { "GHC", "Cedi" } - GIP { "GIP", "Gibraltar Pfund" } - GMD { "GMD", "Dalasi" } - GNF { "GNF", "Guinea Franc" } - GRD { "GRD", "Griechische Drachme" } - GTQ { "GTQ", "Quetzal" } - GWP { "GWP", "Guinea Bissau Peso" } - GYD { "GYD", "Guyana Dollar" } - HKD { "HKD", "Hongkong Dollar" } - HNL { "HNL", "Lempira" } - HRK { "HRK", "Kuna" } - HTG { "HTG", "Gourde" } - HUF { "HUF", "Forint" } - IDR { "IDR", "Rupiah" } - IEP { "IEP", "Irisches Pfund" } - ILS { "ILS", "Schekel" } - INR { "=0#Rs.|1#Re.|1>;\n" - "20: \u03b5\u03af\u03ba\u03bf\u03c3\u03b9; \u03b5\u03b9\u03ba\u03bf\u03c3\u03b9>>;\n" - "30: \u03c4\u03c1\u03b9\u03ac\u03bd\u03c4\u03b1; \u03c4\u03c1\u03b9\u03b1\u03bd\u03c4\u03b1>>;\n" - "40: \u03c3\u03b1\u03c1\u03ac\u03bd\u03c4\u03b1; \u03c3\u03b1\u03c1\u03b1\u03bd\u03c4\u03b1>>;\n" - "50: \u03c0\u03b5\u03bd\u03ae\u03bd\u03c4\u03b1; \u03c0\u03b5\u03bd\u03b7\u03bd\u03c4\u03b1>>;\n" - "60: \u03b5\u03be\u03ae\u03bd\u03c4\u03b1; \u03b5\u03be\u03b7\u03bd\u03c4\u03b1>>;\n" - "70: \u03b5\u03b2\u03b4\u03bf\u03bc\u03ae\u03bd\u03c4\u03b1; " - "\u03b5\u03b2\u03b4\u03bf\u03bc\u03b7\u03bd\u03c4\u03b1>>;\n" - "80: \u03bf\u03b3\u03b4\u03cc\u03bd\u03c4\u03b1; \u03bf\u03b3\u03b4\u03bf\u03bd\u03c4\u03b1>>;\n" - "90: \u03b5\u03bd\u03bd\u03b5\u03bd\u03ae\u03bd\u03c4\u03b1; " - "\u03b5\u03bd\u03bd\u03b5\u03bd\u03b7\u03bd\u03c4\u03b1>>;\n" - "100: \u03b5\u03ba\u03b1\u03c4\u03cc[\u03bd >>];\n" - "200: \u03b4\u03b9\u03b1\u03ba\u03cc\u03c3\u03b9\u03b1[ >>];\n" - "300: \u03c4\u03c1\u03b9\u03b1\u03ba\u03cc\u03c3\u03b9\u03b1[ >>];\n" - "400: \u03c4\u03b5\u03c4\u03c1\u03b1\u03ba\u03cc\u03c3\u03b9\u03b1[ >>];\n" - "500: \u03c0\u03b5\u03bd\u03c4\u03b1\u03ba\u03cc\u03c3\u03b9\u03b1[ >>];\n" - "600: \u03b5\u03be\u03b1\u03ba\u03cc\u03c3\u03b9\u03b1[ >>];\n" - "700: \u03b5\u03c0\u03c4\u03b1\u03ba\u03cc\u03c3\u03b9\u03b1[ >>];\n" - "800: \u03bf\u03ba\u03c4\u03b1\u03ba\u03cc\u03c3\u03b9\u03b1[ >>];\n" - "900: \u03b5\u03bd\u03bd\u03b9\u03b1\u03ba\u03cc\u03c3\u03b9\u03b1[ >>];\n" - "1000: \u03c7\u03af\u03bb\u03b9\u03b1[ >>];\n" - "2000: << \u03c7\u03af\u03bb\u03b9\u03b1[ >>];\n" - "1,000,000: << \u03b5\u03ba\u03b1\u03c4\u03bf\u03bc\u03bc\u03b9\u03cc\u03c1\u03b9\u03bf[ >>];\n" - "1,000,000,000: << \u03b4\u03b9\u03c3\u03b5\u03ba\u03b1\u03c4\u03bf\u03bc\u03bc\u03b9\u03cc\u03c1\u03b9\u03bf[ >>];\n" - "1,000,000,000,000: =#,##0=" - } -*/ - - TransliterateLATIN { - "UNGEGN", - "::Greek-Latin/UNGEGN;" - } - - // Currency display names - Currencies { - GRD { "\u0394\u03C1\u03C7", "GRD" } - } -} +// *************************************************************************** +// * +// * Copyright (C) 2005 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/el.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/el.xml + */ +el{ + Countries{ + AD{"Ανδόρα"} + AE{"Ηνωμένα Αραβικά Εμιράτα"} + AF{"Αφγανιστάν"} + AG{"Αντίγκουα και Μπαρμπούντα"} + AI{"Ανγκουίλα"} + AL{"Αλβανία"} + AM{"Αρμενία"} + AN{"Ολλανδικές Αντίλλες"} + AO{"Ανγκόλα"} + AQ{"Ανταρκτική"} + AR{"Αργεντινή"} + AS{"Αμερικανική Σαμόα"} + AT{"Αυστρία"} + AU{"Αυστραλία"} + AW{"Αρούμπα"} + AZ{"Αζερμπαϊτζάν"} + BA{"Βοσνία - Ερζεγοβίνη"} + BB{"Μπαρμπάντος"} + BD{"Μπανγκλαντές"} + BE{"Βέλγιο"} + BF{"Μπουρκίνα Φάσο"} + BG{"Βουλγαρία"} + BH{"Μπαχρέιν"} + BI{"Μπουρούντι"} + BJ{"Μπένιν"} + BM{"Βερμούδες"} + BN{"Μπρουνέι Νταρουσαλάμ"} + BO{"Βολιβία"} + BR{"Βραζιλία"} + BS{"Μπαχάμες"} + BT{"Μπουτάν"} + BV{"Νήσος Μπουβέ"} + BW{"Μποτσουάνα"} + BY{"Λευκορωσία"} + BZ{"Μπελίζ"} + CA{"Καναδάς"} + CC{"Νήσοι Κόκος (Κήλινγκ)"} + CD{"Κονγκό, Λαϊκή Δημοκρατία του"} + CF{"Κεντροαφρικανική Δημοκρατία"} + CG{"Κονγκό"} + CH{"Ελβετία"} + CI{"Ακτή Ελεφαντόδοντος"} + CK{"Νήσοι Κουκ"} + CL{"Χιλή"} + CM{"Καμερούν"} + CN{"Κίνα"} + CO{"Κολομβία"} + CR{"Κόστα Ρίκα"} + CU{"Κούβα"} + CV{"Νήσοι Πράσινου Ακρωτηρίου"} + CX{"Νήσος Χριστουγέννων"} + CY{"Κύπρος"} + CZ{"Τσεχία"} + DE{"Γερμανία"} + DJ{"Τζιμπουτί"} + DK{"Δανία"} + DM{"Ντομίνικα"} + DO{"Δομινικανή Δημοκρατία"} + DZ{"Αλγερία"} + EC{"Ισημερινός"} + EE{"Εσθονία"} + EG{"Αίγυπτος"} + EH{"Δυτική Σαχάρα"} + ER{"Ερυθραία"} + ES{"Ισπανία"} + ET{"Αιθιοπία"} + FI{"Φινλανδία"} + FJ{"Φίτζι"} + FK{"Νήσοι Φώκλαντ"} + FM{"Μικρονησία, Ομόσπονδες Πολιτείες της"} + FO{"Νήσοι Φερόες"} + FR{"Γαλλία"} + GA{"Γκαμπόν"} + GB{"Ηνωμένο Βασίλειο"} + GD{"Γρενάδα"} + GE{"Γεωργία"} + GF{"Γαλλική Γουιάνα"} + GH{"Γκάνα"} + GI{"Γιβραλτάρ"} + GL{"Γροιλανδία"} + GM{"Γκάμπια"} + GN{"Γουινέα"} + GP{"Γουαδελούπη"} + GQ{"Ισημερινή Γουινέα"} + GR{"Ελλάδα"} + GS{"Νότια Γεωργία και Νήσοι Νότιες Σάντουιτς"} + GT{"Γουατεμάλα"} + GU{"Γκουάμ"} + GW{"Γουινέα-Μπισάου"} + GY{"Γουιάνα"} + HK{"Χονγκ Κονγκ, Ειδική Διοικητική Περιφέρεια της Κίνας"} + HM{"Νήσοι Χερντ και Μακντόναλντ"} + HN{"Ονδούρα"} + HR{"Κροατία"} + HT{"Αϊτή"} + HU{"Ουγγαρία"} + ID{"Ινδονησία"} + IE{"Ιρλανδία"} + IL{"Ισραήλ"} + IN{"Ινδία"} + IO{"Βρετανικά Έδάφη Ινδικού Ωκεανού"} + IQ{"Ιράκ"} + IR{"Ιράν, Ισλαμική Δημοκρατία του"} + IS{"Ισλανδία"} + IT{"Ιταλία"} + JM{"Τζαμάικα"} + JO{"Ιορδανία"} + JP{"Ιαπωνία"} + KE{"Κένυα"} + KG{"Κιργιζία"} + KH{"Καμπότζη"} + KI{"Κιριμπάτι"} + KM{"Κομόρες"} + KN{"Σαιντ Κιτς και Νέβις"} + KP{"Κορέα, Βόρεια"} + KR{"Κορέα, Νότια"} + KW{"Κουβέιτ"} + KY{"Νήσοι Κέιμαν"} + KZ{"Καζακστάν"} + LA{"Λατινική Αμερική"} + LB{"Λίβανος"} + LC{"Αγία Λουκία"} + LI{"Λιχτενστάιν"} + LK{"Σρι Λάνκα"} + LR{"Λιβερία"} + LS{"Λεσότο"} + LT{"Λιθουανία"} + LU{"Λουξεμβούργο"} + LV{"Λετονία"} + MA{"Μαρόκο"} + MC{"Μονακό"} + MD{"Μολδαβία, Δημοκρατία της"} + MG{"Μαδαγασκάρη"} + MH{"Νήσοι Μάρσαλ"} + MK{"ΠΓΔ Μακεδονίας"} + ML{"Μάλι"} + MM{"Μιανμάρ"} + MN{"Μογγολία"} + MO{"Μακάο, Ειδική Διοικητική Περιφέρεια της Κίνας"} + MP{"Νήσοι Βόρειες Μαριάνες"} + MQ{"Μαρτινίκα"} + MR{"Μαυριτανία"} + MS{"Μονσεράτ"} + MT{"Μάλτα"} + MU{"Μαυρίκιος"} + MV{"Μαλδίβες"} + MW{"Μαλάουι"} + MX{"Μεξικό"} + MY{"Μαλαισία"} + MZ{"Μοζαμβίκη"} + NA{"Ναμίμπια"} + NC{"Νέα Καληδονία"} + NE{"Νίγηρ"} + NF{"Νήσος Νόρφολκ"} + NG{"Νιγηρία"} + NI{"Νικαράγουα"} + NL{"Ολλανδία"} + NO{"Νορβηγία"} + NP{"Νεπάλ"} + NR{"Ναούρου"} + NU{"Νιούε"} + NZ{"Νέα Ζηλανδία"} + OM{"Ομάν"} + PA{"Παναμάς"} + PE{"Περού"} + PF{"Γαλλική Πολυνησία"} + PG{"Παπούα - Νέα Γουινέα"} + PH{"Φιλιππίνες"} + PK{"Πακιστάν"} + PL{"Πολωνία"} + PM{"Σαιντ Πιέρ και Μικελόν"} + PN{"Πίτκερν"} + PR{"Πουέρτο Ρίκο"} + PS{"Παλαιστινιακά Εδάφη"} + PT{"Πορτογαλία"} + PW{"Παλάου"} + PY{"Παραγουάη"} + QA{"Κατάρ"} + RE{"Ρεϋνιόν"} + RO{"Ρουμανία"} + RU{"Ρωσία"} + RW{"Ρουάντα"} + SA{"Σαουδική Αραβία"} + SB{"Νήσοι Σολομώντος"} + SC{"Σεϋχέλλες"} + SD{"Σουδάν"} + SE{"Σουηδία"} + SG{"Σιγκαπούρη"} + SH{"Αγία Ελένη"} + SI{"Σλοβενία"} + SJ{"Νήσοι Σβάλμπαρ και Γιαν Μαγιέν"} + SK{"Σλοβακία"} + SL{"Σιέρα Λεόνε"} + SM{"Άγιος Μαρίνος"} + SN{"Σενεγάλη"} + SO{"Σομαλία"} + SP{"Σερβία"} + SR{"Σουρινάμ"} + ST{"Σάο Τομέ και Πρίνσιπε"} + SV{"Ελ Σαλβαδόρ"} + SY{"Συρία, Αραβική Δημοκρατία της"} + SZ{"Σουαζιλάνδη"} + TC{"Νήσοι Τερκς και Κάικος"} + TD{"Τσαντ"} + TF{"Γαλλικά Νότια Εδάφη"} + TG{"Τόγκο"} + TH{"Ταϊλάνδη"} + TJ{"Τατζικιστάν"} + TK{"Τοκελάου"} + TL{"Ανατολικό Τιμόρ"} + TM{"Τουρκμενιστάν"} + TN{"Τυνησία"} + TO{"Τόνγκα"} + TR{"Τουρκία"} + TT{"Τρινιδάδ και Τομπάγκο"} + TV{"Τουβαλού"} + TW{"Ταϊβάν"} + TZ{"Τανζανία"} + UA{"Ουκρανία"} + UG{"Ουγκάντα"} + UM{"Απομακρυσμένες Νησίδες των Ηνωμένων Πολιτειών"} + US{"Ηνωμένες Πολιτείες"} + UY{"Ουρουγουάη"} + UZ{"Ουζμπεκιστάν"} + VA{"Αγία Έδρα (Βατικανό)"} + VC{"Άγιος Βικέντιος και Γρεναδίνες"} + VE{"Βενεζουέλα"} + VG{"Βρετανικές Παρθένοι Νήσοι"} + VI{"Αμερικανικές Παρθένοι Νήσοι"} + VN{"Βιετνάμ"} + VU{"Βανουάτου"} + WF{"Νήσοι Ουαλλίς και Φουτουνά"} + WS{"Σαμόα"} + YE{"Υεμένη"} + YT{"Μαγιότ"} + YU{"Γιουγκοσλαβία"} + ZA{"Νότια Αφρική"} + ZM{"Ζάμπια"} + ZW{"Ζιμπάμπουε"} + } + Currencies{ + ADD{ + "ADD", + "Δηνάριο Ανδόρας", + } + ADP{ + "ADP", + "Πεσέτα Ανδόρας", + } + AED{ + "AED", + "Ντιράμ Ηνωμένων Αραβικών Εμιράτων", + } + AIF{ + "AIF", + "Φράγκο Affars και Issas", + } + ALK{ + "ALK", + "Λεκ Αλβανίας (1946-1961)", + } + ALL{ + "lek", + "Λεκ Αλβανίας", + } + ALV{ + "ALV", + "Λεκ Valute Αλβανίας", + } + ALX{ + "ALX", + "Αλβανικά Πιστοποιητικά Ξένου Συναλλάγματος σε Δολάρια", + } + AMD{ + "dram", + "Dram Αρμενίας", + } + ANG{ + "NA f.", + "Γκίλντα Ολλανδικών Αντιλλών", + } + AOA{ + "AOA", + "Kwanza Ανγκόλας", + } + AOK{ + "AOK", + "Kwanza Ανγκόλας (1977-1990)", + } + AON{ + "AON", + "Νέα Kwanza Ανγκόλας (1990-2000)", + } + AOR{ + "AOR", + "Kwanza Reajustado Ανγκόλας (1995-1999)", + } + AOS{ + "AOS", + "Εσκούδο Ανγκόλας", + } + ARA{ + "ARA", + "Austral Αργεντινής", + } + ARM{ + "ARM", + "Εθνικό Νόμισμα Πέσο Αργεντινής", + } + ARP{ + "ARP", + "Πέσο Αργεντινής (1983-1985)", + } + ARS{ + "Arg$", + "Πέσο Αργεντινής", + } + ATS{ + "ATS", + "Σελίνι Αυστρίας", + } + AUD{ + "$A", + "Δολάριο Αυστραλίας", + } + AUP{ + "AUP", + "Λίρα Αυστραλίας", + } + AWG{ + "AWG", + "Γκίλντα Αρούμπα", + } + AZM{ + "AZM", + "Μανάτ Αζερμπαϊτζάν", + } + BAD{ + "BAD", + "Δηνάριο Βοσνίας-Ερζεγοβίνης", + } + BAM{ + "KM", + "Μάρκο Βοσνίας-Ερζεγοβίνης", + } + BAN{ + "BAN", + "Νέο Δηνάριο Βοσνίας-Ερζεγοβίνης", + } + BBD{ + "BDS$", + "Δολάριο Μπαρμπάντος", + } + BDT{ + "Tk", + "Τάκα Μπαγκλαντές", + } + BEC{ + "BEC", + "Φράγκο Βελγίου (μετατρέψιμο)", + } + BEF{ + "BF", + "Φράγκο Βελγίου", + } + BEL{ + "BEL", + "Φράγκο Βελγίου (οικονομικό)", + } + BGL{ + "lev", + "Μεταλλικό Λεβ Βουλγαρίας", + } + BGM{ + "BGM", + "Σοσιαλιστικό Λεβ Βουλγαρίας", + } + BGN{ + "BGN", + "Νέο Λεβ Βουλγαρίας", + } + BGO{ + "BGO", + "Λεβ Βουλγαρίας (1879-1952)", + } + BGX{ + "BGX", + "Πιστοποιητικά Ξένου Συναλλάγματος σε Λεβ", + } + BHD{ + "BD", + "Δηνάριο Bahraini", + } + BIF{ + "Fbu", + "Φράγκο Burundi", + } + BMD{ + "Ber$", + "Δολάριο Βερμούδων", + } + BMP{ + "BMP", + "Λίρα Βερμούδων", + } + BND{ + "BND", + "Δολάριο Brunei", + } + BOP{ + "BOP", + "Πέσο Βολιβίας", + } + BOV{ + "BOV", + "Mvdol Βολιβίας", + } + BRB{ + "BRB", + "Νέο Cruzeiro Βραζιλίας (1967-1986)", + } + BRC{ + "BRC", + "Cruzado Βραζιλίας", + } + BRE{ + "BRE", + "Cruzeiro Βραζιλίας (1990-1993)", + } + BRL{ + "R$", + "Real Βραζιλίας", + } + BRN{ + "BRN", + "Νέο Cruzado Βραζιλίας", + } + BRR{ + "BRR", + "Cruzeiro Βραζιλίας", + } + BRZ{ + "BRZ", + "Cruzeiro Βραζιλίας (1942-1967)", + } + BSD{ + "BSD", + "Δολάριο Μπαχάμες", + } + BSP{ + "BSP", + "Λίρα Μπαχάμες", + } + BTN{ + "Nu", + "Ngultrum Μπουτάν", + } + BTR{ + "BTR", + "Ρούπια Μπουτάν", + } + BUK{ + "BUK", + "Kyat Βιρμανίας", + } + BUR{ + "BUR", + "Ρούπια Βιρμανίας", + } + BWP{ + "BWP", + "Pula Μποτσουάνα", + } + BYB{ + "BYB", + "Νέο Ρούβλι Λευκορωσίας (1994-1999)", + } + BYL{ + "BYL", + "Ρούβλι Λευκορωσίας (1992-1994)", + } + BYR{ + "Rbl", + "Ρούβλι Λευκορωσίας", + } + BZD{ + "BZ$", + "Δολάριο Belize", + } + BZH{ + "BZH", + "Δολάριο Βρετανικής Ονδούρας", + } + CAD{ + "Can$", + "Δολάριο Καναδά", + } + CDF{ + "CDF", + "Φράγκο Congolais Κονγκό", + } + CDG{ + "CDG", + "Φράγκο Δημοκρατίας Κονγκό", + } + CDL{ + "CDL", + "Congolese Ζαΐρ", + } + CFF{ + "CFF", + "Φράγκο Κεντρικής Αφρικανικής Δημοκρατίας CFA", + } + CHF{ + "SwF", + "Φράγκο Ελβετίας", + } + CKD{ + "CKD", + "Δολάριο Νήσων Κουκ", + } + CLC{ + "CLC", + "Condor Χιλής", + } + CLE{ + "CLE", + "Εσκούδο Χιλής", + } + CLF{ + "CLF", + "Unidades de Fomento Χιλής", + } + CLP{ + "Ch$", + "Πέσο Χιλής", + } + CMF{ + "CMF", + "Φράγκο Καμερούν CFA", + } + CNP{ + "CNP", + "Jen Min Piao Yuan Κίνας", + } + CNX{ + "CNX", + "Πιστοποιητικά Ξένου Συναλλάγματος σε Δολάρια ΗΠΑ, Κίνας", + } + CNY{ + "Y", + "Yuan Renminbi Κίνας", + } + COB{ + "COB", + "Χάρτινο Πέσο Κολομβίας", + } + COF{ + "COF", + "Φράγκο Κονγκό CFA", + } + COP{ + "Col$", + "Πέσο Κολομβίας", + } + CRC{ + "C", + "Colon Κόστα Ρίκα", + } + CSC{ + "CSC", + "Κορόνα Τσεχοσλοβακίας", + } + CSK{ + "CSK", + "Σκληρή Κορόνα Τσεχοσλοβακίας", + } + CUP{ + "CUP", + "Πέσο Κούβας", + } + CUX{ + "CUX", + "Πιστοποιητικά Ξένου Συναλλάγματος Κούβας", + } + CVE{ + "CVEsc", + "Εσκούδο Πράσινου Ακρωτηρίου", + } + CWG{ + "CWG", + "Γκίλντα Curacao", + } + CYP{ + "£", + "Λίρα Κύπρου", + } + CZK{ + "CZK", + "Κορόνα Τσέχικης Δημοκρατίας", + } + DDM{ + "DDM", + "Ostmark Ανατολικής Γερμανίας", + } + DEM{ + "DEM", + "Μάρκο Γερμανίας", + } + DES{ + "DES", + "Sperrmark Γερμανίας", + } + DJF{ + "DF", + "Φράγκο Τζιμπουτί", + } + DKK{ + "DKr", + "Κορόνα Δανίας", + } + DOP{ + "RD$", + "Πέσο Δομίνικου", + } + DZD{ + "DA", + "Δηνάριο Αλγερίας", + } + DZF{ + "DZF", + "Νέο Φράγκο Αλγερίας", + } + DZG{ + "DZG", + "Germinal Φράγκο Αλγερίας", + } + ECS{ + "ECS", + "Sucre Ισημερινού", + } + ECV{ + "ECV", + "Unidad de Valor Constante (UVC) Ισημερινού", + } + EEK{ + "EEK", + "Κορόνα Εσθονίας", + } + EGP{ + "EGP", + "Λίρα Αιγύπτου", + } + ERN{ + "ERN", + "Eritrean Nakfa", + } + ESP{ + "ESP", + "Πεσέτα Ισπανίας", + } + ETB{ + "Br", + "Birr Αιθιοπίας", + } + ETD{ + "ETD", + "Δολάριο Αιθιοπίας", + } + EUR{ + "€", + "Ευρώ", + } + FIM{ + "FIM", + "Μάρκο Φινλανδίας", + } + FIN{ + "FIN", + "Μάρκο Φινλανδίας (1860-1962)", + } + FJD{ + "F$", + "Δολάριο Φίτζι", + } + FJP{ + "FJP", + "Λίρα Φίτζι", + } + FKP{ + "FKP", + "Λίρα Νησιών Φώλκλαντ", + } + FOK{ + "FOK", + "Kronur Νήσων Faeroe", + } + FRF{ + "FRF", + "Φράγκο Γαλλίας", + } + FRG{ + "FRG", + "Φράγκο Germinal/Φράγκο Poincare Γαλλίας", + } + GAF{ + "GAF", + "Φράγκο Γκαμπόν CFA", + } + GBP{ + "£", + "Λίρα Στερλίνα Βρετανίας", + } + GEK{ + "GEK", + "Kupon Larit Γεωργίας", + } + GEL{ + "lari", + "Lari Γεωργίας", + } + GHC{ + "GHC", + "Cedi Γκάνας", + } + GHO{ + "GHO", + "Παλαιό Cedi Γκάνας", + } + GHP{ + "GHP", + "Λίρα Γκάνας", + } + GHR{ + "GHR", + "Ανατιμημένο Cedi Γκάνας", + } + GIP{ + "GIP", + "Λίρα Γιβραλτάρ", + } + GLK{ + "GLK", + "Κορόνα Γροιλανδίας", + } + GMD{ + "GMD", + "Dalasi Γκάμπια", + } + GMP{ + "GMP", + "Λίρα Γκάμπια", + } + GNF{ + "GF", + "Φράγκο Γουινέας", + } + GNI{ + "GNI", + "Φράγκο Γουινέας (1960-1972)", + } + GNS{ + "GNS", + "Syli Γουινέας", + } + GPF{ + "GPF", + "Φράγκο Γουαδελούπης", + } + GQE{ + "GQE", + "Ekwele Guineana Ισημερινής Γουινέας", + } + GQF{ + "GQF", + "Φράγκο Ισημερινής Γουινέας", + } + GQP{ + "GQP", + "Πεσέτα Guineana Ισημερινής Γουινέας", + } + GRD{ + "Δρχ", + "Δρχ", + } + GRN{ + "GRN", + "Νέα Δραχμή Ελλάδας", + } + GTQ{ + "Q", + "Quetzal Γουατεμάλα", + } + GUF{ + "GUF", + "Φράγκο Guiana Γαλλικής Γουιάνας", + } + GWE{ + "GWE", + "Γκινέα Εσκούδο Πορτογαλίας", + } + GWM{ + "GWM", + "Γκινέα Mil Reis Πορτογαλίας", + } + GWP{ + "GWP", + "Πέσο Guinea-Bissau", + } + GYD{ + "G$", + "Δολάριο Γουιάνας", + } + HKD{ + "HK$", + "Δολάριο Χονγκ Κονγκ", + } + HRD{ + "HRD", + "Δηνάριο Κροατίας", + } + HRK{ + "HRK", + "Kuna Δηνάριο", + } + HTG{ + "HTG", + "Gourde Αϊτής", + } + HUF{ + "Ft", + "Φιορίνι Ουγγαρίας", + } + IBP{ + "IBP", + "Λίρα Βόρειας Ιρλανδίας", + } + IDG{ + "IDG", + "Γκίλντα Nica Ινδονησίας", + } + IDJ{ + "IDJ", + "Ρούπια Ιάβας Ινδονησίας", + } + IDN{ + "IDN", + "Νέα Ρούπια Ινδονησίας", + } + IDR{ + "Rp", + "Ρούπια Ινδονησίας", + } + IEP{ + "IR£", + "Λίρα Ιρλανδίας", + } + ILL{ + "ILL", + "Sheqel Ισραήλ", + } + ILP{ + "ILP", + "Λίρα Ισραήλ", + } + ILS{ + "ILS", + "Νέο Sheqel Ισραήλ", + } + IMP{ + "IMP", + "Λίρα Στερλίνα Νήσου Man", + } + INR{ + "INR", + "Ρούπια Ινδίας", + } + IQD{ + "ID", + "Δηνάριο Ιράκ", + } + IRR{ + "RI", + "Rial Ιράκ", + } + ISK{ + "ISK", + "Κορόνα Ισλανδίας", + } + ITL{ + "₤", + "Λιρέτα Ιταλίας", + } + JEP{ + "JEP", + "Λίρα Στερλίνα Υερσέης", + } + JMD{ + "J$", + "Δολάριο Τζαμάικας", + } + JMP{ + "JMP", + "Λίρα Τζαμάικας", + } + JOD{ + "JD", + "Δηνάριο Ιορδανίας", + } + JPY{ + "¥", + "Γιεν Ιαπωνίας", + } + KES{ + "K Sh", + "Σελίνι Κένυας", + } + KHO{ + "KHO", + "Παλαιό Riel Καμπότζης", + } + KHR{ + "CR", + "Riel Καμπότζης", + } + KID{ + "KID", + "Δολάριο Kiribati", + } + KMF{ + "CF", + "Φράγκο Comoro", + } + KPP{ + "KPP", + "Won Δημοκρατίας Βόρειας Κορέας", + } + KPW{ + "KPW", + "Won Βόρειας Κορέας", + } + KRH{ + "KRH", + "Hwan Νότιας Κορέας", + } + KRO{ + "KRO", + "Παλαιό Won Νότιας Κορέας", + } + KRW{ + "KRW", + "Won Νότιας Κορέας", + } + KWD{ + "KD", + "Δηνάριο Κουβέιτ", + } + KYD{ + "KYD", + "Δολάριο Νήσων Κάιμαν", + } + KZR{ + "KZR", + "Ρούβλι Καζακστάν", + } + KZT{ + "T", + "Tenge Καζακστάν", + } + LAK{ + "LAK", + "Kip Λάος", + } + LBP{ + "LL", + "Λίρα Λιβάνου", + } + LIF{ + "LIF", + "Φράγκο Λιχτενστάιν", + } + LKR{ + "SL Re", + "Ρούπια Σρι Λάνκα", + } + LNR{ + "LNR", + "Ρούπια Ceylon", + } + LRD{ + "LRD", + "Δολάριο Λιβερίας", + } + LTL{ + "LTL", + "Lita Λιθουανίας", + } + LTT{ + "LTT", + "Talonas Λιθουανίας", + } + LUF{ + "LUF", + "Φράγκο Λουξεμβούργου", + } + LVL{ + "LVL", + "Lats Λετονίας", + } + LVR{ + "LVR", + "Ρούβλι Λετονίας", + } + LYB{ + "LYB", + "Λίρα Βρετανικής Στρατιωτικής Εξουσίας Λιβύης", + } + LYD{ + "LD", + "Δηνάριο Λιβύης", + } + LYP{ + "LYP", + "Λίρα Λιβύης", + } + MAD{ + "MAD", + "Ντιράμ Μαρόκου", + } + MAF{ + "MAF", + "Φράγκο Μαρόκου", + } + MCF{ + "MCF", + "Νέο Φράγκο Μονακό", + } + MCG{ + "MCG", + "Φράγκο Germinal Μονακό", + } + MDC{ + "MDC", + "Λέι Cupon Μολδαβίας", + } + MDL{ + "MDL", + "Λέι Μολδαβίας", + } + MDR{ + "MDR", + "Ρούβλι Cupon Μολδαβίας", + } + MGA{ + "MGA", + "Ariary Μαδαγασκάρης", + } + MGF{ + "MGF", + "Φράγκο Μαδαγασκάρης", + } + MHD{ + "MHD", + "Δολάριο Νήσων Marshall", + } + MKD{ + "MDen", + "Δηνάριο Π.Γ.Δ.Μ.", + } + MKN{ + "MKN", + "Δηνάριο Π.Γ.Δ.Μ. (1992-1993)", + } + MLF{ + "MLF", + "Φράγκο Μαλί", + } + MMK{ + "MMK", + "Kyat Μιανμάρ", + } + MMX{ + "MMX", + "Πιστοποιητικά Ξένου Συναλλάγματος σε Δολάρια, Μιανμάρ", + } + MNT{ + "Tug", + "Tugrik Μογγολίας", + } + MOP{ + "MOP", + "Pataca Μακάο", + } + MQF{ + "MQF", + "Φράγκο Μαρτινίκας", + } + MRO{ + "UM", + "Ouguiya Μαυριτανίας", + } + MTL{ + "Lm", + "Λιρέτα Μάλτας", + } + MTP{ + "MTP", + "Λίρα Μάλτας", + } + MUR{ + "MUR", + "Ρούπια Μαυρικίου", + } + MVP{ + "MVP", + "Ρούπια Νήσων Μαλδίβων", + } + MVR{ + "MVR", + "Rufiyaa Νήσων Μαλδίβων", + } + MWK{ + "MK", + "Kwacha Μαλάουι", + } + MWP{ + "MWP", + "Λίρα Μαλάουι", + } + MXN{ + "MEX$", + "Πέσο Μεξικού", + } + MXP{ + "MXP", + "Ασημένιο Πέσο Μεξικού (1861-1992)", + } + MXV{ + "MXV", + "Unidad de Inversion (UDI) Μεξικού", + } + MYR{ + "RM", + "Ringgit Μαλαισίας", + } + MZE{ + "MZE", + "Εσκούδο Μοζαμβίκης", + } + MZM{ + "Mt", + "Metical Μοζαμβίκης", + } + NAD{ + "N$", + "Δολάριο Ναμίμπια", + } + NCF{ + "NCF", + "Φράγκο Germinal Νέας Καληδονίας", + } + NGN{ + "NGN", + "Naira Νιγηρίας", + } + NGP{ + "NGP", + "Λίρα Νιγηρίας", + } + NHF{ + "NHF", + "Φράγκο Νέων Εβρίδων CFP", + } + NIC{ + "NIC", + "Κόρδοβα Νικαράγουας", + } + NIG{ + "NIG", + "Χρυσή Κόρδοβα Νικαράγουας", + } + NIO{ + "NIO", + "Χρυσή Κόρδοβα Νικαράγουας", + } + NLG{ + "NLG", + "Γκίλντα Ολλανδίας", + } + NOK{ + "NKr", + "Κορόνα Νορβηγίας", + } + NPR{ + "Nrs", + "Ρούπια Νεπάλ", + } + NZD{ + "$NZ", + "Δολάριο Νέας Ζηλανδίας", + } + NZP{ + "NZP", + "Λίρα Νέας Ζηλανδίας", + } + OMR{ + "RO", + "Rial Ομάν", + } + OMS{ + "OMS", + "Rial Saidi Ομάν", + } + PAB{ + "PAB", + "Μπαλμπόα Παναμά", + } + PEI{ + "PEI", + "Inti Περού", + } + PEN{ + "PEN", + "Sol Nuevo Περού", + } + PES{ + "PES", + "Sol Περού", + } + PGK{ + "PGK", + "Kina Παπούα Νέα Γουινέα", + } + PHP{ + "PHP", + "Πέσο Φιλιππίνων", + } + PKR{ + "Pra", + "Ρούπια Πακιστάν", + } + PLN{ + "Zl", + "Ζλότυ Πολωνίας", + } + PLX{ + "PLX", + "Πιστοποιητικά Ξένου Συναλλάγματος σε Δολάρια, Πολωνίας", + } + PLZ{ + "PLZ", + "Ζλότυ Πολωνίας (1950-1995)", + } + PSP{ + "PSP", + "Λίρα Παλαιστίνης", + } + PTC{ + "PTC", + "Conto Πορτογαλίας", + } + PTE{ + "PTE", + "Εσκούδο Πορτογαλίας", + } + PYG{ + "PYG", + "Γκουαρανί Παραγουάης", + } + QAR{ + "QR", + "Rial Κατάρ", + } + REF{ + "REF", + "Φράγκο Reunion", + } + ROL{ + "leu", + "Λέι Ρουμανίας", + } + RON{ + "RON", + "Νέο Λέι Ρουμανίας", + } + RUB{ + "RUB", + "Ρούβλι Ρωσίας", + } + RUR{ + "RUR", + "Ρούβλι Ρωσίας (1991-1998)", + } + RWF{ + "RWF", + "Φράγκο Ρουάντας", + } + SBD{ + "SI$", + "Δολάριο Νήσων Σολομώντος", + } + SCR{ + "SR", + "Ρούπια Σεϋχέλες", + } + SDD{ + "SDD", + "Δηνάριο Σουδάν", + } + SDP{ + "SDP", + "Λίρα Σουδάν", + } + SEK{ + "SKr", + "Κορόνα Σουηδίας", + } + SGD{ + "S$", + "Δολάριο Σιγκαπούρης", + } + SHP{ + "SHP", + "Λίρα Αγίας Ελένης", + } + SIB{ + "SIB", + "Tolar Bons Σλοβενίας", + } + SIT{ + "SIT", + "Tolar Σλοβενίας", + } + SKK{ + "Sk", + "Κορόνα Σλοβενίας", + } + SLL{ + "SLL", + "Leone Σιέρα Λεόνε", + } + SML{ + "SML", + "Λιρέτα Αγίου Μαρίνου", + } + SOS{ + "So. Sh.", + "Σελίνι Σομαλίας", + } + SQS{ + "SQS", + "Σελίνι Σομαλίας", + } + SRG{ + "Sf", + "Γκίλντα Σουρινάμ", + } + SSP{ + "SSP", + "Λίρα Σκωτίας", + } + SUN{ + "SUN", + "Νέο Σοβιετικό Ρούβλι", + } + SUR{ + "SUR", + "Σοβιετικό Ρούβλι", + } + SVC{ + "SVC", + "Colon Ελ Σαλβαδόρ", + } + SYP{ + "LS", + "Λίρα Συρίας", + } + SZL{ + "E", + "Lilangeni Ζουαζιλάνδη", + } + TCC{ + "TCC", + "Κορόνα Νήσων Τερκς και Κάικος", + } + TDF{ + "TDF", + "Φράγκο Τσαντ CFA", + } + THB{ + "THB", + "Μπατ Ταϊλάνδης", + } + TJR{ + "TJR", + "Ρούβλι Τατζικιστάν", + } + TJS{ + "TJS", + "Somoni Τατζικιστάν", + } + TMM{ + "TMM", + "Μανάτ Τουρκμενιστάν", + } + TND{ + "TND", + "Δηνάριο Τυνησίας", + } + TOS{ + "TOS", + "Λίρα Στερλίνα Τόνγκα", + } + TPE{ + "TPE", + "Εσκούδο Τιμόρ", + } + TPP{ + "TPP", + "Pataca Τιμόρ", + } + TRL{ + "TL", + "Λίρα Τουρκίας", + } + TRY{ + "TRY", + "Νέα Τουρκική Λίρα", + } + TTD{ + "TT$", + "Δολάριο Τρινιδάδ και Τομπάγκο", + } + TTO{ + "TTO", + "Παλαιό Δολάριο Τρινιδάδ και Τομπάγκο", + } + TVD{ + "TVD", + "Tuvalu Δολάριο", + } + TWD{ + "NT$", + "Νέο Δολάριο Ταϊβάν", + } + TZS{ + "T Sh", + "Σελίνι Τανζανίας", + } + UAH{ + "UAH", + "Hryvnia Ουκρανίας", + } + UAK{ + "UAK", + "Karbovanetz Ουκρανίας", + } + UGS{ + "UGS", + "Σελίνι Ουγκάντας (1966-1987)", + } + UGX{ + "U Sh", + "Σελίνι Ουγκάντας", + } + USD{ + "US$", + "Δολάριο ΗΠΑ", + } + USN{ + "USN", + "Δολάριο ΗΠΑ (Επόμενη Ημέρα)", + } + USS{ + "USS", + "Δολάριο ΗΠΑ (Ίδια Ημέρα)", + } + UYF{ + "UYF", + "Μεταλλικό Πέσο Ουρουγουάης", + } + UYP{ + "UYP", + "Πέσο Ουρουγουάης (1975-1993)", + } + UYU{ + "Ur$", + "Πέσο Uruguayo Ουρουγουάης", + } + UZC{ + "UZC", + "Coupon Som Ουζμπεκιστάν", + } + UZS{ + "UZS", + "Sum Ουζμπεκιστάν", + } + VAL{ + "VAL", + "Λιρέτα Βατικανού", + } + VDD{ + "VDD", + "Piastre Dong Viet Βορείου Βιετνάμ", + } + VDN{ + "VDN", + "Νέο Dong Βορείου Βιετνάμ", + } + VDP{ + "VDP", + "Viet Minh Piastre Dong Viet Βορείου Βιετνάμ", + } + VEB{ + "Be", + "Μπολιβάλ Βενεζουέλας", + } + VGD{ + "VGD", + "Δολάριο Βρετανικών Παρθένων Νήσων", + } + VND{ + "VND", + "Dong Βιετνάμ", + } + VNN{ + "VNN", + "Νέο Dong Βιετνάμ", + } + VNR{ + "VNR", + "Dong Δημοκρατίας Βιετνάμ", + } + VNS{ + "VNS", + "Εθνικό Dong Βιετνάμ", + } + WSP{ + "WSP", + "Λίρα Δυτικής Σαμόα", + } + WST{ + "WST", + "Tala Δυτικής Σαμόα", + } + XAD{ + "XAD", + "Μονάδα Λογαριασμού Ασιατικού Δηναρίου", + } + XAF{ + "XAF", + "Φράγκο BEAC CFA", + } + XAM{ + "XAM", + "Ασιατική Νομισματική Μονάδα", + } + XAU{ + "XAU", + "Χρυσός", + } + XBA{ + "XBA", + "Ευρωπαϊκή Σύνθετη Μονάδα", + } + XBB{ + "XBB", + "Ευρωπαϊκή Νομισματική Μονάδα", + } + XBC{ + "XBC", + "Ευρωπαϊκή Μονάδα Λογαριασμού (XBC)", + } + XBD{ + "XBD", + "Ευρωπαϊκή Μονάδα Λογαριασμού (XBD)", + } + XCD{ + "EC$", + "Δολάριο Ανατολικής Καραϊβικής", + } + XCF{ + "XCF", + "Νέο Φράγκο CFA", + } + XDR{ + "XDR", + "Ειδικά Δικαιώματα Ανάληψης", + } + XEF{ + "XEF", + "Φράγκο BCEAEC CFA", + } + XEU{ + "XEU", + "Ευρωπαϊκή Συναλλαγματική Μονάδα", + } + XFO{ + "XFO", + "Χρυσό Φράγκο Γαλλίας", + } + XFU{ + "XFU", + "UIC-Φράγκο Γαλλίας", + } + XID{ + "XID", + "Ισλαμικό Δηνάριο", + } + XMF{ + "XMF", + "Νέο Μητροπολιτικό Φράγκο Γαλλίας", + } + XNF{ + "XNF", + "Φράγκο Γαλλικών Αντιλλών CFA", + } + XOF{ + "XOF", + "Φράγκο BCEAO CFA", + } + XPF{ + "CFPF", + "Φράγκο CFP", + } + XTR{ + "XTR", + "Μεταβιβάσιμο Ρούβλι COMECON", + } + YDD{ + "YDD", + "Δηνάριο Υεμένης", + } + YEI{ + "YEI", + "Imadi Riyal Υεμένης", + } + YER{ + "YRl", + "Rial Υεμένης", + } + YUD{ + "YUD", + "Μεταλλικό Δηνάριο Γιουγκοσλαβίας", + } + YUF{ + "YUF", + "Δηνάριο Γιουγκοσλαβικής Ομοσπονδίας", + } + YUG{ + "YUG", + "Δηνάριο Γιουγκοσλαβίας", + } + YUM{ + "YUM", + "Νέο Δηνάριο Γιουγκοσλαβίας", + } + YUN{ + "YUN", + "Μετατρέψιμο Δηνάριο Γιουγκοσλαβίας", + } + YUO{ + "YUO", + "Οκτωβριανό Δηνάριο Γιουγκοσλαβίας", + } + YUR{ + "YUR", + "Ανανεωμένο Δηνάριο Γιουγκοσλαβίας", + } + ZAL{ + "ZAL", + "Ραντ Νότιας Αφρικής (οικονομικό)", + } + ZAP{ + "ZAP", + "Λίρα Νότιας Αφρικής", + } + ZAR{ + "R", + "Ραντ Νότιας Αφρικής", + } + ZMK{ + "ZMK", + "Kwacha Ζάμπιας", + } + ZMP{ + "ZMP", + "Λίρα Ζάμπιας", + } + ZRN{ + "ZRN", + "Νέο Zaire Ζαΐρ", + } + ZRZ{ + "ZRZ", + "Zaire Ζαΐρ", + } + ZWD{ + "Z$", + "Δολάριο Ζιμπάμπουε", + } + } + ExemplarCharacters{"[ΐά-ώ]"} + Keys{ + calendar{"Ημερολόγιο"} + collation{"Τακτοποίηση"} + currency{"Νόμισμα"} + } + Languages{ + ar{"Αραβικά"} + arc{"Αραμαϊκά"} + be{"Λευκορωσικά"} + bg{"Βουλγαρικά"} + bo{"Θιβετιανά"} + bs{"Βοσνιακά"} + ca{"Καταλανικά"} + co{"Κορσικανικά"} + cop{"Κοπτικά"} + cs{"Τσεχικά"} + cy{"Ουαλικά"} + da{"Δανικά"} + de{"Γερμανικά"} + egy{"Αιγυπτιακά (Αρχαία)"} + el{"Ελληνικά"} + en{"Αγγλικά"} + es{"Ισπανικά"} + et{"Εσθονικά"} + eu{"Βασκικά"} + fa{"Περσικά"} + fi{"Φινλανδικά"} + fr{"Γαλλικά"} + ga{"Ιρλανδικά"} + gd{"Σκωτικά Κελτικά"} + grc{"Ελληνικά, Αρχαία (έως 1453)"} + haw{"Χαβανεζικά"} + he{"Εβραϊκά"} + hr{"Κροατικά"} + hu{"Ουγγρικά"} + hy{"Αρμενικά"} + id{"Ινδονησιακά"} + ine{"Ινδοευρωπαϊκά (¨Αλλη)"} + ira{"Ιρανικά"} + is{"Ισλανδικά"} + it{"Ιταλικά"} + ja{"Ιαπωνικά"} + ka{"Γεωργιανά"} + ko{"Κορεατικά"} + la{"Λατινικά"} + lt{"Λιθουανικά"} + lv{"Λετονικά"} + mk{"Σλαβομακεδονικά"} + mn{"Μογγολικά"} + mo{"Μολδαβικά"} + mt{"Μαλτεζικά"} + mul{"Πολλαπλές Γλώσσες"} + nai{"Ινδιανικά Βόρειας Αμερικής (Άλλα)"} + nl{"Ολλανδικά"} + no{"Νορβηγικά"} + ota{"Τουρκικά, Οθωμανικά (1500-1928)"} + peo{"Αρχαία Περσικά (600-400 π.Χ.)"} + phi{"Φιλιππινέζικα (Άλλα)"} + phn{"Φοινικικά"} + pl{"Πολωνικά"} + pt{"Πορτογαλικά"} + ro{"Ρουμανικά"} + rom{"Ρωμανικά"} + ru{"Ρωσικά"} + sem{"Σημιτικά (Άλλα)"} + sh{"Σερβοκροατικά"} + sk{"Σλοβακικά"} + sl{"Σλοβενικά"} + sla{"Σλαβικά (Άλλα)"} + sq{"Αλβανικά"} + sr{"Σερβικά"} + sv{"Σουηδικά"} + tr{"Τουρκικά"} + uk{"Ουκρανικά"} + vi{"Βιετναμεζικά"} + yi{"Ιουδαϊκά"} + zh{"Κινεζικά"} + } + LocaleScript{ + "Grek", + } + NumberElements{ + ",", + ".", + ";", + "%", + "0", + "#", + "-", + "E", + "‰", + "∞", + "�", + "+", + } + Scripts{ + Arab{"Αραβικό"} + Armn{"Αρμενικό"} + Brai{"Μπράιγ"} + Copt{"Κοπτικό"} + Cprt{"Κυπριακό"} + Cyrl{"Κυριλλικό"} + Ethi{"Αιθιοπικό"} + Geor{"Γεωργιανό"} + Goth{"Γοτθικό"} + Grek{"Ελληνικό"} + Hebr{"Εβραϊκό"} + Latn{"Λατινικό"} + Mong{"Μογγολικό"} + Syrc{"Συριακό"} + Thai{"Ταϊλανδικό"} + Tibt{"Θιβετιανό"} + Zyyy{"Κοινό"} + } + Types{ + calendar{ + buddhist{"Βουδιστικό Ημερολόγιο"} + chinese{"Κινέζικο Ημερολόγιο"} + gregorian{"Γρηγοριανό Ημερολόγιο"} + hebrew{"Εβραϊκό Ημερολόγιο"} + islamic{"Ισλαμικό Ημερολόγιο"} + islamic-civil{"Ισλαμικό-Αστικό Ημερολόγιο"} + japanese{"Ιαπωνικό Ημερολόγιο"} + } + collation{ + direct{"Σειρά Direct"} + phonebook{"Σειρά Τηλεφωνικού Καταλόγου"} + pinyin{"Σειρά Pinyin"} + stroke{"Σειρά Stroke"} + traditional{"Παραδοσιακή"} + } + } + Version{"1.2"} + calendar{ + gregorian{ + AmPmMarkers{ + "ΠΜ", + "ΜΜ", + } + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "h:mm:ss a z", + "h:mm:ss a z", + "h:mm:ss a", + "h:mm a", + "EEEE, dd MMMM yyyy", + "dd MMMM yyyy", + "dd MMM yyyy", + "dd/MM/yyyy", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "Κυρ", + "Δευ", + "Τρι", + "Τετ", + "Πεμ", + "Παρ", + "Σαβ", + } + narrow{ + "Κ", + "Δ", + "Τ", + "Τ", + "Π", + "Π", + "Σ", + } + wide{ + "Κυριακή", + "Δευτέρα", + "Τρίτη", + "Τετάρτη", + "Πέμπτη", + "Παρασκευή", + "Σάββατο", + } + } + } + eras{ + abbreviated{ + "π.Χ.", + "μ.Χ.", + } + } + monthNames{ + format{ + abbreviated{ + "Ιαν", + "Φεβ", + "Μαρ", + "Απρ", + "Μαϊ", + "Ιουν", + "Ιουλ", + "Αυγ", + "Σεπ", + "Οκτ", + "Νοε", + "Δεκ", + } + narrow{ + "Ι", + "Φ", + "Μ", + "Α", + "Μ", + "Ι", + "Ι", + "Α", + "Σ", + "Ο", + "Ν", + "Δ", + } + wide{ + "Ιανουαρίου", + "Φεβρουαρίου", + "Μαρτίου", + "Απριλίου", + "Μαΐου", + "Ιουνίου", + "Ιουλίου", + "Αυγούστου", + "Σεπτεμβρίου", + "Οκτωβρίου", + "Νοεμβρίου", + "Δεκεμβρίου", + } + } + stand-alone{ + abbreviated{ + "Ιαν", + "Φεβ", + "Μαρ", + "Απρ", + "Μαϊ", + "Ιουν", + "Ιουλ", + "Αυγ", + "Σεπ", + "Οκτ", + "Νοε", + "Δεκ", + } + narrow{ + "Ι", + "Φ", + "Μ", + "Α", + "Μ", + "Ι", + "Ι", + "Α", + "Σ", + "Ο", + "Ν", + "Δ", + } + wide{ + "Ιανουάριος", + "Φεβρουάριος", + "Μάρτιος", + "Απρίλιος", + "Μάιος", + "Ιούνιος", + "Ιούλιος", + "Αύγουστος", + "Σεπτέμβριος", + "Οκτώβριος", + "Νοέμβριος", + "Δεκέμβριος", + } + } + } + } + } + localPatternChars{"GanjkHmsSEDFwWxhKzAeugXZ"} +} diff --git a/icuSources/data/locales/el_GR.txt b/icuSources/data/locales/el_GR.txt index 6beddbc2..dcc4b761 100644 --- a/icuSources/data/locales/el_GR.txt +++ b/icuSources/data/locales/el_GR.txt @@ -1,20 +1,28 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/el_GR.xml // * // *************************************************************************** - -el_GR { - Version { "2.0" } -// LocaleString { "el_GR" } - - NumberPatterns { +el_GR{ + Currencies{ + GRD{ + "Δρχ", + "Δρχ", + { + "#,##0.00 ¤;-#,##0.00 ¤", + ",", + ".", + } + } + } + NumberPatterns{ "#,##0.###;-#,##0.###", - "#,##0.00\u00a4;-\u00a4#,##0.00", + "#,##0.00¤;-¤#,##0.00", "#,##0%", "#E0", } -// ShortCountry { "GRC" } - LocaleID:int { 0x0408 } + Version{"1.2"} } diff --git a/icuSources/data/locales/el_GR_PREEURO.txt b/icuSources/data/locales/el_GR_PREEURO.txt deleted file mode 100644 index 118d927d..00000000 --- a/icuSources/data/locales/el_GR_PREEURO.txt +++ /dev/null @@ -1,17 +0,0 @@ -// ******************************************************************************* -// * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// ******************************************************************************* - -el_GR_PREEURO { - Version { "2.0" } - NumberPatterns { - "#,##0.###;-#,##0.###", - "#,##0.00 \u00A4;-#,##0.00 \u00A4", - "#,##0%", - "#E0", - } - -} diff --git a/icuSources/data/locales/en.txt b/icuSources/data/locales/en.txt index 350d7529..e4d7efd8 100644 --- a/icuSources/data/locales/en.txt +++ b/icuSources/data/locales/en.txt @@ -1,32 +1,2450 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/en.xml // * // *************************************************************************** - -en { - Version { "2.0" } - NumberPatterns { +/** + * ICU source: ../../../locale/icu/main/en.xml + */ +en{ + Countries{ + AD{"Andorra"} + AE{"United Arab Emirates"} + AF{"Afghanistan"} + AG{"Antigua and Barbuda"} + AI{"Anguilla"} + AL{"Albania"} + AM{"Armenia"} + AN{"Netherlands Antilles"} + AO{"Angola"} + AQ{"Antarctica"} + AR{"Argentina"} + AS{"American Samoa"} + AT{"Austria"} + AU{"Australia"} + AW{"Aruba"} + AZ{"Azerbaijan"} + BA{"Bosnia and Herzegovina"} + BB{"Barbados"} + BD{"Bangladesh"} + BE{"Belgium"} + BF{"Burkina Faso"} + BG{"Bulgaria"} + BH{"Bahrain"} + BI{"Burundi"} + BJ{"Benin"} + BM{"Bermuda"} + BN{"Brunei"} + BO{"Bolivia"} + BR{"Brazil"} + BS{"Bahamas"} + BT{"Bhutan"} + BV{"Bouvet Island"} + BW{"Botswana"} + BY{"Belarus"} + BZ{"Belize"} + CA{"Canada"} + CC{"Cocos (Keeling) Islands"} + CD{"Democratic Republic of the Congo"} + CF{"Central African Republic"} + CG{"Congo"} + CH{"Switzerland"} + CI{"Côte d’Ivoire"} + CK{"Cook Islands"} + CL{"Chile"} + CM{"Cameroon"} + CN{"China"} + CO{"Colombia"} + CR{"Costa Rica"} + CU{"Cuba"} + CV{"Cape Verde"} + CX{"Christmas Island"} + CY{"Cyprus"} + CZ{"Czech Republic"} + DE{"Germany"} + DJ{"Djibouti"} + DK{"Denmark"} + DM{"Dominica"} + DO{"Dominican Republic"} + DZ{"Algeria"} + EC{"Ecuador"} + EE{"Estonia"} + EG{"Egypt"} + EH{"Western Sahara"} + ER{"Eritrea"} + ES{"Spain"} + ET{"Ethiopia"} + FI{"Finland"} + FJ{"Fiji"} + FK{"Falkland Islands"} + FM{"Micronesia"} + FO{"Faroe Islands"} + FR{"France"} + GA{"Gabon"} + GB{"United Kingdom"} + GD{"Grenada"} + GE{"Georgia"} + GF{"French Guiana"} + GH{"Ghana"} + GI{"Gibraltar"} + GL{"Greenland"} + GM{"Gambia"} + GN{"Guinea"} + GP{"Guadeloupe"} + GQ{"Equatorial Guinea"} + GR{"Greece"} + GS{"South Georgia and the South Sandwich Islands"} + GT{"Guatemala"} + GU{"Guam"} + GW{"Guinea-Bissau"} + GY{"Guyana"} + HK{"Hong Kong S.A.R., China"} + HM{"Heard Island and McDonald Islands"} + HN{"Honduras"} + HR{"Croatia"} + HT{"Haiti"} + HU{"Hungary"} + ID{"Indonesia"} + IE{"Ireland"} + IL{"Israel"} + IN{"India"} + IO{"British Indian Ocean Territory"} + IQ{"Iraq"} + IR{"Iran"} + IS{"Iceland"} + IT{"Italy"} + JM{"Jamaica"} + JO{"Jordan"} + JP{"Japan"} + KE{"Kenya"} + KG{"Kyrgyzstan"} + KH{"Cambodia"} + KI{"Kiribati"} + KM{"Comoros"} + KN{"Saint Kitts and Nevis"} + KP{"North Korea"} + KR{"South Korea"} + KW{"Kuwait"} + KY{"Cayman Islands"} + KZ{"Kazakhstan"} + LA{"Laos"} + LB{"Lebanon"} + LC{"Saint Lucia"} + LI{"Liechtenstein"} + LK{"Sri Lanka"} + LR{"Liberia"} + LS{"Lesotho"} + LT{"Lithuania"} + LU{"Luxembourg"} + LV{"Latvia"} + LY{"Libya"} + MA{"Morocco"} + MC{"Monaco"} + MD{"Moldova"} + MG{"Madagascar"} + MH{"Marshall Islands"} + MK{"Macedonia"} + ML{"Mali"} + MM{"Myanmar"} + MN{"Mongolia"} + MO{"Macao S.A.R., China"} + MP{"Northern Mariana Islands"} + MQ{"Martinique"} + MR{"Mauritania"} + MS{"Montserrat"} + MT{"Malta"} + MU{"Mauritius"} + MV{"Maldives"} + MW{"Malawi"} + MX{"Mexico"} + MY{"Malaysia"} + MZ{"Mozambique"} + NA{"Namibia"} + NC{"New Caledonia"} + NE{"Niger"} + NF{"Norfolk Island"} + NG{"Nigeria"} + NI{"Nicaragua"} + NL{"Netherlands"} + NO{"Norway"} + NP{"Nepal"} + NR{"Nauru"} + NU{"Niue"} + NZ{"New Zealand"} + OM{"Oman"} + PA{"Panama"} + PE{"Peru"} + PF{"French Polynesia"} + PG{"Papua New Guinea"} + PH{"Philippines"} + PK{"Pakistan"} + PL{"Poland"} + PM{"Saint Pierre and Miquelon"} + PN{"Pitcairn"} + PR{"Puerto Rico"} + PS{"Palestinian Territory"} + PT{"Portugal"} + PW{"Palau"} + PY{"Paraguay"} + QA{"Qatar"} + RE{"Réunion"} + RO{"Romania"} + RU{"Russia"} + RW{"Rwanda"} + SA{"Saudi Arabia"} + SB{"Solomon Islands"} + SC{"Seychelles"} + SD{"Sudan"} + SE{"Sweden"} + SG{"Singapore"} + SH{"Saint Helena"} + SI{"Slovenia"} + SJ{"Svalbard and Jan Mayen"} + SK{"Slovakia"} + SL{"Sierra Leone"} + SM{"San Marino"} + SN{"Senegal"} + SO{"Somalia"} + SP{"Serbia"} + SR{"Suriname"} + ST{"Sao Tome and Principe"} + SV{"El Salvador"} + SY{"Syria"} + SZ{"Swaziland"} + TC{"Turks and Caicos Islands"} + TD{"Chad"} + TF{"French Southern Territories"} + TG{"Togo"} + TH{"Thailand"} + TJ{"Tajikistan"} + TK{"Tokelau"} + TL{"Timor-Leste"} + TM{"Turkmenistan"} + TN{"Tunisia"} + TO{"Tonga"} + TR{"Turkey"} + TT{"Trinidad and Tobago"} + TV{"Tuvalu"} + TW{"Taiwan"} + TZ{"Tanzania"} + UA{"Ukraine"} + UG{"Uganda"} + UM{"United States Minor Outlying Islands"} + US{"United States"} + UY{"Uruguay"} + UZ{"Uzbekistan"} + VA{"Vatican"} + VC{"Saint Vincent and the Grenadines"} + VE{"Venezuela"} + VG{"British Virgin Islands"} + VI{"U.S. Virgin Islands"} + VN{"Vietnam"} + VU{"Vanuatu"} + WF{"Wallis and Futuna"} + WS{"Samoa"} + YE{"Yemen"} + YT{"Mayotte"} + YU{"Yugoslavia"} + ZA{"South Africa"} + ZM{"Zambia"} + ZW{"Zimbabwe"} + } + Currencies{ + ADD{ + "ADD", + "Andorran Diner", + } + ADP{ + "ADP", + "Andorran Peseta", + } + AED{ + "AED", + "United Arab Emirates Dirham", + } + AFA{ + "AFA", + "Afghani (1927-2002)", + } + AFN{ + "Af", + "Afghani", + } + AIF{ + "AIF", + "Affars and Issas Franc", + } + ALK{ + "ALK", + "Albanian Lek (1946-1961)", + } + ALL{ + "lek", + "Albanian Lek", + } + ALV{ + "ALV", + "Albanian Lek Valute", + } + ALX{ + "ALX", + "Albanian Dollar Foreign Exchange Certificates", + } + AMD{ + "dram", + "Armenian Dram", + } + ANG{ + "NA f.", + "Netherlands Antillan Guilder", + } + AOA{ + "AOA", + "Angolan Kwanza", + } + AOK{ + "AOK", + "Angolan Kwanza (1977-1990)", + } + AON{ + "AON", + "Angolan New Kwanza (1990-2000)", + } + AOR{ + "AOR", + "Angolan Kwanza Reajustado (1995-1999)", + } + AOS{ + "AOS", + "Angolan Escudo", + } + ARA{ + "ARA", + "Argentine Austral", + } + ARM{ + "ARM", + "Argentine Peso Moneda Nacional", + } + ARP{ + "ARP", + "Argentine Peso (1983-1985)", + } + ARS{ + "Arg$", + "Argentine Peso", + } + ATS{ + "ATS", + "Austrian Schilling", + } + AUD{ + "$A", + "Australian Dollar", + } + AUP{ + "AUP", + "Australian Pound", + } + AWG{ + "AWG", + "Aruban Guilder", + } + AZM{ + "AZM", + "Azerbaijanian Manat", + } + BAD{ + "BAD", + "Bosnia-Herzegovina Dinar", + } + BAM{ + "KM", + "Bosnia-Herzegovina Convertible Mark", + } + BAN{ + "BAN", + "Bosnia-Herzegovina New Dinar", + } + BBD{ + "BDS$", + "Barbados Dollar", + } + BDT{ + "Tk", + "Bangladesh Taka", + } + BEC{ + "BEC", + "Belgian Franc (convertible)", + } + BEF{ + "BF", + "Belgian Franc", + } + BEL{ + "BEL", + "Belgian Franc (financial)", + } + BGL{ + "lev", + "Bulgarian Hard Lev", + } + BGM{ + "BGM", + "Bulgarian Socialist Lev", + } + BGN{ + "BGN", + "Bulgarian New Lev", + } + BGO{ + "BGO", + "Bulgarian Lev (1879-1952)", + } + BGX{ + "BGX", + "Bulgarian Lev Foreign Exchange Certificates", + } + BHD{ + "BD", + "Bahraini Dinar", + } + BIF{ + "Fbu", + "Burundi Franc", + } + BMD{ + "Ber$", + "Bermudan Dollar", + } + BMP{ + "BMP", + "Bermudan Pound", + } + BND{ + "BND", + "Brunei Dollar", + } + BOB{ + "Bs", + "Boliviano", + } + BOL{ + "BOL", + "Boliviano (1863-1962)", + } + BOP{ + "BOP", + "Bolivian Peso", + } + BOV{ + "BOV", + "Bolivian Mvdol", + } + BRB{ + "BRB", + "Brazilian Cruzeiro Novo (1967-1986)", + } + BRC{ + "BRC", + "Brazilian Cruzado", + } + BRE{ + "BRE", + "Brazilian Cruzeiro (1990-1993)", + } + BRL{ + "R$", + "Brazilian Real", + } + BRN{ + "BRN", + "Brazilian Cruzado Novo", + } + BRR{ + "BRR", + "Brazilian Cruzeiro", + } + BRZ{ + "BRZ", + "Brazilian Cruzeiro (1942-1967)", + } + BSD{ + "BSD", + "Bahamian Dollar", + } + BSP{ + "BSP", + "Bahamian Pound", + } + BTN{ + "Nu", + "Bhutan Ngultrum", + } + BTR{ + "BTR", + "Bhutan Rupee", + } + BUK{ + "BUK", + "Burmese Kyat", + } + BUR{ + "BUR", + "Burmese Rupee", + } + BWP{ + "BWP", + "Botswanan Pula", + } + BYB{ + "BYB", + "Belarussian New Ruble (1994-1999)", + } + BYL{ + "BYL", + "Belarussian Ruble (1992-1994)", + } + BYR{ + "Rbl", + "Belarussian Ruble", + } + BZD{ + "BZ$", + "Belize Dollar", + } + BZH{ + "BZH", + "British Honduras Dollar", + } + CAD{ + "Can$", + "Canadian Dollar", + } + CDF{ + "CDF", + "Congolese Franc Congolais", + } + CDG{ + "CDG", + "Congolese Republic Franc", + } + CDL{ + "CDL", + "Congolese Zaire", + } + CFF{ + "CFF", + "Central African Republic CFA Franc", + } + CHF{ + "SwF", + "Swiss Franc", + } + CKD{ + "CKD", + "Cook Islands Dollar", + } + CLC{ + "CLC", + "Chilean Condor", + } + CLE{ + "CLE", + "Chilean Escudo", + } + CLF{ + "CLF", + "Chilean Unidades de Fomento", + } + CLP{ + "Ch$", + "Chilean Peso", + } + CMF{ + "CMF", + "Cameroon CFA Franc", + } + CNP{ + "CNP", + "Chinese Jen Min Piao Yuan", + } + CNX{ + "CNX", + "Chinese US Dollar Foreign Exchange Certificates", + } + CNY{ + "Y", + "Chinese Yuan Renminbi", + } + COB{ + "COB", + "Colombian Paper Peso", + } + COF{ + "COF", + "Congo CFA Franc", + } + COP{ + "Col$", + "Colombian Peso", + } + CRC{ + "C", + "Costa Rican Colon", + } + CSC{ + "CSC", + "Czechoslovak Koruna", + } + CSK{ + "CSK", + "Czechoslovak Hard Koruna", + } + CUP{ + "CUP", + "Cuban Peso", + } + CUX{ + "CUX", + "Cuban Foreign Exchange Certificates", + } + CVE{ + "CVEsc", + "Cape Verde Escudo", + } + CWG{ + "CWG", + "Curacao Guilder", + } + CYP{ + "£C", + "Cyprus Pound", + } + CZK{ + "CZK", + "Czech Republic Koruna", + } + DDM{ + "DDM", + "East German Ostmark", + } + DEM{ + "DEM", + "Deutsche Mark", + } + DES{ + "DES", + "German Sperrmark", + } + DJF{ + "DF", + "Djibouti Franc", + } + DKK{ + "DKr", + "Danish Krone", + } + DOP{ + "RD$", + "Dominican Peso", + } + DZD{ + "DA", + "Algerian Dinar", + } + DZF{ + "DZF", + "Algerian New Franc", + } + DZG{ + "DZG", + "Algerian Franc Germinal", + } + ECS{ + "ECS", + "Ecuador Sucre", + } + ECV{ + "ECV", + "Ecuador Unidad de Valor Constante (UVC)", + } + EEK{ + "EEK", + "Estonian Kroon", + } + EGP{ + "EGP", + "Egyptian Pound", + } + ERN{ + "ERN", + "Eritrean Nakfa", + } + ESP{ + "₧", + "Spanish Peseta", + } + ETB{ + "Br", + "Ethiopian Birr", + } + ETD{ + "ETD", + "Ethiopian Dollar", + } + EUR{ + "€", + "Euro", + } + FIM{ + "FIM", + "Finnish Markka", + } + FIN{ + "FIN", + "Finnish Markka (1860-1962)", + } + FJD{ + "F$", + "Fiji Dollar", + } + FJP{ + "FJP", + "Fiji Pound", + } + FKP{ + "FKP", + "Falkland Islands Pound", + } + FOK{ + "FOK", + "Faeroe Islands Kronur", + } + FRF{ + "FRF", + "French Franc", + } + FRG{ + "FRG", + "French Franc Germinal/Franc Poincare", + } + GAF{ + "GAF", + "Gabon CFA Franc", + } + GBP{ + "£", + "British Pound Sterling", + } + GEK{ + "GEK", + "Georgian Kupon Larit", + } + GEL{ + "lari", + "Georgian Lari", + } + GHC{ + "GHC", + "Ghana Cedi", + } + GHO{ + "GHO", + "Ghana Old Cedi", + } + GHP{ + "GHP", + "Ghana Pound", + } + GHR{ + "GHR", + "Ghana Revalued Cedi", + } + GIP{ + "GIP", + "Gibraltar Pound", + } + GLK{ + "GLK", + "Greenland Krone", + } + GMD{ + "GMD", + "Gambia Dalasi", + } + GMP{ + "GMP", + "Gambia Pound", + } + GNF{ + "GF", + "Guinea Franc", + } + GNI{ + "GNI", + "Guinea Franc (1960-1972)", + } + GNS{ + "GNS", + "Guinea Syli", + } + GPF{ + "GPF", + "Guadeloupe Franc", + } + GQE{ + "GQE", + "Equatorial Guinea Ekwele Guineana", + } + GQF{ + "GQF", + "Equatorial Guinea Franco", + } + GQP{ + "GQP", + "Equatorial Guinea Peseta Guineana", + } + GRD{ + "GRD", + "Greek Drachma", + } + GRN{ + "GRN", + "Greek New Drachma", + } + GTQ{ + "Q", + "Guatemala Quetzal", + } + GUF{ + "GUF", + "French Guyana Franc Guiana", + } + GWE{ + "GWE", + "Portuguese Guinea Escudo", + } + GWM{ + "GWM", + "Portuguese Guinea Mil Reis", + } + GWP{ + "GWP", + "Guinea-Bissau Peso", + } + GYD{ + "G$", + "Guyana Dollar", + } + HKD{ + "HK$", + "Hong Kong Dollar", + } + HNL{ + "L", + "Hoduras Lempira", + } + HRD{ + "HRD", + "Croatian Dinar", + } + HRK{ + "HRK", + "Croatian Kuna", + } + HTG{ + "HTG", + "Haitian Gourde", + } + HUF{ + "Ft", + "Hungarian Forint", + } + IBP{ + "IBP", + "Northern Irish Pound", + } + IDG{ + "IDG", + "Indonesian Nica Guilder", + } + IDJ{ + "IDJ", + "Indonesian Java Rupiah", + } + IDN{ + "IDN", + "Indonesian New Rupiah", + } + IDR{ + "Rp", + "Indonesian Rupiah", + } + IEP{ + "IR£", + "Irish Pound", + } + ILL{ + "ILL", + "Israeli Sheqel", + } + ILP{ + "ILP", + "Israeli Pound", + } + ILS{ + "ILS", + "Israeli New Sheqel", + } + IMP{ + "IMP", + "Isle of Man Pound Sterling", + } + INR{ + "=0#Rs.|1#Re.|1> is. - " -x: minus >>;\n" - // faction rule. This rule is used for formatting numbers - // with fractional parts. The result of formatting the - // number's integral part is substituted for the <<, and - // the result of formatting the number's fractional part - // (one digit at a time, e.g., 0.123 is "zero point one two - // three") replaces the >>. - " x.x: << point >>;\n" - // the rules for the values from 0 to 19 are simply the - // words for those numbers - " zero; one; two; three; four; five; six; seven; eight; nine;\n" - " ten; eleven; twelve; thirteen; fourteen; fifteen; sixteen;\n" - " seventeen; eighteen; nineteen;\n" - // beginning at 20, we use the >> to mark the position where - // the result of formatting the number's ones digit. Thus, - // we only need a new rule at every multiple of 10. Text in - // backets is omitted if the value being formatted is an - // even multiple of 10. - " 20: twenty[->>];\n" - " 30: thirty[->>];\n" - " 40: forty[->>];\n" - " 50: fifty[->>];\n" - " 60: sixty[->>];\n" - " 70: seventy[->>];\n" - " 80: eighty[->>];\n" - " 90: ninety[->>];\n" - // beginning at 100, we can use << to mark the position where - // the result of formatting the multiple of 100 is to be - // inserted. Notice also that the meaning of >> has shifted: - // here, it refers to both the ones place and the tens place. - // The meanings of the << and >> tokens depend on the base value - // of the rule. A rule's divisor is (usually) the highest - // power of 10 that is less than or equal to the rule's base - // value. The value being formatted is divided by the rule's - // divisor, and the integral quotient is used to get the text - // for <<, while the remainder is used to produce the text - // for >>. Again, text in brackets is omitted if the value - // being formatted is an even multiple of the rule's divisor - // (in this case, an even multiple of 100) - " 100: << hundred[ >>];\n" - // The rules for the higher numbers work the same way as the - // rule for 100: Again, the << and >> tokens depend on the - // rule's divisor, which for all these rules is also the rule's - // base value. To group by thousand, we simply don't have any - // rules between 1,000 and 1,000,000. - " 1000: << thousand[ >>];\n" - " 1,000,000: << million[ >>];\n" - " 1,000,000,000: << billion[ >>];\n" - " 1,000,000,000,000: << trillion[ >>];\n" - // overflow rule. This rule specifies that values of a - // quadrillion or more are shown in numerals rather than words. - // The == token means to format (with new rules) the value - // being formatted by this rule and place the result where - // the == is. The #,##0 inside the == signs is a - // DecimalFormat pattern. It specifies that the value should - // be formatted with a DecimalFormat object, and that it - // should be formatted with no decimal places, at least one - // digit, and a thousands separator. - " 1,000,000,000,000,000: =#,##0=;\n" - - // %default is a more elaborate form of %simplified; It is basically - // the same, except that it introduces "and" before the ones digit - // when appropriate (basically, between the tens and ones digits) and - // separates the thousands groups with commas in values over 100,000. - "%default:\n" - // negative-number and fraction rules. These are the same - // as those for %simplified, but have to be stated here too - // because this is an entry point - " -x: minus >>;\n" - " x.x: << point >>;\n" - // just use %simplified for values below 100 - " =%simplified=;\n" - // for values from 100 to 9,999 use %%and to decide whether or - // not to interpose the "and" - " 100: << hundred[ >%%and>];\n" - " 1000: << thousand[ >%%and>];\n" - // for values of 100,000 and up, use %%commas to interpose the - // commas in the right places (and also to interpose the "and") - " 100,000>>: << thousand[>%%commas>];\n" - " 1,000,000: << million[>%%commas>];\n" - " 1,000,000,000: << billion[>%%commas>];\n" - " 1,000,000,000,000: << trillion[>%%commas>];\n" - " 1,000,000,000,000,000: =#,##0=;\n" - // if the value passed to this rule set is greater than 100, don't - // add the "and"; if it's less than 100, add "and" before the last - // digits - "%%and:\n" - " and =%default=;\n" - " 100: =%default=;\n" - // this rule set is used to place the commas - "%%commas:\n" - // for values below 100, add "and" (the apostrophe at the - // beginning is ignored, but causes the space that follows it - // to be significant: this is necessary because the rules - // calling %%commas don't put a space before it) - " ' and =%default=;\n" - // put a comma after the thousands (or whatever preceded the - // hundreds) - " 100: , =%default=;\n" - // put a comma after the millions (or whatever precedes the - // thousands) - " 1000: , <%default< thousand, >%default>;\n" - // and so on... - " 1,000,000: , =%default=;" - // %%lenient-parse isn't really a set of number formatting rules; - // it's a set of collation rules. Lenient-parse mode uses a Collator - // object to compare fragments of the text being parsed to the text - // in the rules, allowing more leeway in the matching text. This set - // of rules tells the formatter to ignore commas when parsing (it - // already ignores spaces, which is why we refer to the space; it also - // ignores hyphens, making "twenty one" and "twenty-one" parse - // identically) - "%%lenient-parse:\n" - // " & ' ' , ',' ;\n" - " &\u0000 << ' ' << ',' << '-'; \n" - } - - -// * This rule set adds an English ordinal abbreviation to the end of a -// * number. For example, 2 is formatted as "2nd". Parsing doesn't work with -// * this rule set. To parse, use DecimalFormat on the numeral. - OrdinalRules { - // this rule set formats the numeral and calls %%abbrev to - // supply the abbreviation - "%main:\n" - " =#,##0==%%abbrev=;\n" - // this rule set supplies the abbreviation - "%%abbrev:\n" - // the abbreviations. Everything from 4 to 19 ends in "th" - " th; st; nd; rd; th;\n" - // at 20, we begin repeating the cycle every 10 (13 is "13th", - // but 23 and 33 are "23rd" and "33rd") We do this by - // ignoring all bug the ones digit in selecting the abbreviation - " 20: >>;\n" - // at 100, we repeat the whole cycle by considering only the - // tens and ones digits in picking an abbreviation - " 100: >>;\n" - } - -// * This rule set formats a number of seconds in sexagesimal notation -// * (i.e., hours, minutes, and seconds). %with-words formats it with -// * words (3,740 is "1 hour, 2 minutes, 20 seconds") and %in-numerals -// * formats it entirely in numerals (3,740 is "1:02:20"). - DurationRules { - // main rule set for formatting with words - "%with-words:\n" - // take care of singular and plural forms of "second" - " 0 seconds; 1 second; =0= seconds;\n" - // use %%min to format values greater than 60 seconds - " 60/60: <%%min<[, >>];\n" - // use %%hr to format values greater than 3,600 seconds - // (the ">>>" below causes us to see the number of minutes - // when when there are zero minutes) - " 3600/60: <%%hr<[, >>>];\n" - // this rule set takes care of the singular and plural forms - // of "minute" - "%%min:\n" - " 0 minutes; 1 minute; =0= minutes;\n" - // this rule set takes care of the singular and plural forms - // of "hour" - "%%hr:\n" - " 0 hours; 1 hour; =0= hours;\n" - - // main rule set for formatting in numerals - "%in-numerals:\n" - // values below 60 seconds are shown with "sec." - " =0= sec.;\n" - // higher values are shown with colons: %%min-sec is used for - // values below 3,600 seconds... - " 60: =%%min-sec=;\n" - // ...and %%hr-min-sec is used for values of 3,600 seconds - // and above - " 3600: =%%hr-min-sec=;\n" - // this rule causes values of less than 10 minutes to show without - // a leading zero - "%%min-sec:\n" - " 0: :=00=;\n" - " 60/60: <0<>>;\n" - // this rule set is used for values of 3,600 or more. Minutes are always - // shown, and always shown with two digits - "%%hr-min-sec:\n" - " 0: :=00=;\n" - " 60/60: <00<>>;\n" - " 3600/60: <#,##0<:>>>;\n" - // the lenient-parse rules allow several different characters to be used - // as delimiters between hours, minutes, and seconds - "%%lenient-parse:\n" - " & ':' = '.' = ' ' = '-';\n" - } - - // Last update: May 2003 - Currencies { - ADD { "ADD", "Andorran Diner" } // 1873-06/30/2002 - ADP { "ADP", "Andorran Peseta" } // 1936- - AED { "AED", "United Arab Emirates Dirham" } // 12/2/1971- - AFA { "AFA", "Afghani (1927-2002)" } // 1927- - AFN { "Af", "Afghani" } - AIF { "AIF", "Affars and Issas Franc" } // 07/05/1967-06/27/1977 - ALK { "ALK", "Albanian Lek (1946-1961)" } // 1946-1961 - ALL { "lek", "Albanian Lek" } // 1961- - ALV { "ALV", "Albanian Lek Valute" } // 1992-1993 - ALX { "ALX", "Albanian Dollar Foreign Exchange Certificates" } // 1953-1965 - AMD { "dram","Armenian Dram" } // 11/22/1993- - ANG { "NA f.","Netherlands Antillan Guilder" } // 05/10/1940- - AOA { "AOA", "Angolan Kwanza" } // 09/1926-12/31/1958 - AOK { "AOK", "Angolan Kwanza (1977-1990)" } // 01/08/1977-09/25/1990 - AON { "AON", "Angolan New Kwanza (1990-2000)" } // 09/25/1990-07/01/1995 - AOR { "AOR", "Angolan Kwanza Reajustado (1995-1999)" } // 07/01/1995-12/13/1999 - AOS { "AOS", "Angolan Escudo" } // 12/31/1958-11/11/1976 - ARA { "ARA", "Argentine Austral" } // 06/14/1985-01/01/1992 - ARM { "ARM", "Argentine Peso Moneda Nacional" } // 1899-01/01/1970 - ARP { "ARP", "Argentine Peso (1983-1985)" } // 06/01/1983-06/14/1985 - ARS { "Arg$","Argentine Peso" } // 01/01/1992- - ATS { "ATS", "Austrian Schilling" } // 12/04/1947-02/28/2002 - AUD { "$A", "Australian Dollar" } // 02/14/1966- - AUP { "AUP", "Australian Pound" } // 1902-02/14/1966 - AWG { "AWG", "Aruban Guilder" } // 01/01/1986- - AZM { "AZM", "Azerbaijanian Manat" } // 1992- - BAD { "BAD", "Bosnia-Herzegovina Dinar" } // 07/01/1992-08/15/1994 - BAM { "KM", "Bosnia-Herzegovina Convertible Mark" } // 01/01/1995- - BAN { "BAN", "Bosnia-Herzegovina New Dinar" } // 08/15/1994-01/01/1995 - BBD { "BDS$","Barbados Dollar" } // 11/29/1966- - BDT { "Tk", "Bangladesh Taka" } // 01/01/1972- - BEC { "BEC", "Belgian Franc (convertible)" } - BEF { "BF", "Belgian Franc" } // 1831-2002 - BEL { "BEL", "Belgian Franc (financial)" } - BGL { "lev", "Bulgarian Hard Lev" } // 01/01/1962-01/01/1999 - BGM { "BGM", "Bulgarian Socialist Lev" } // 05/1952-01/01/1962 - BGN { "BGN", "Bulgarian New Lev" } // 01/01/1999- - BGO { "BGO", "Bulgarian Lev (1879-1952)" } // 07/08/1879-05/1952 - BGX { "BGX", "Bulgarian Lev Foreign Exchange Certificates" } // 1965-1986 - BHD { "BD", "Bahraini Dinar" } // 10/1965- - BIF { "Fbu", "Burundi Franc" } // 05/19/1964- - BMD { "Ber$","Bermudan Dollar" } // 02/06/1970- - BMP { "BMP", "Bermudan Pound" } // 1914-02/06/1970 - BND { "BND", "Brunei Dollar" } // 06/12/1967- - BOB { "Bs", "Boliviano" } // 1986- - BOL { "BOL", "Boliviano (1863-1962)" } // 06/23/1863-12/31/1962 - BOP { "BOP", "Bolivian Peso" } // 01/01/1963-1986 - BOV { "BOV", "Bolivian Mvdol" } - BRB { "BRB", "Brazilian Cruzeiro Novo (1967-1986)" } // 02/13/1967-02/28/1986 - BRC { "BRC", "Brazilian Cruzado" } // 02/28/1986-01/15/1989 - BRE { "BRE", "Brazilian Cruzeiro (1990-1993)" } // 03/16/1990-08/01/1993 - BRL { "R$", "Brazilian Real" } // 07/01/1994- - BRN { "BRN", "Brazilian Cruzado Novo" } // 01/15/1989-03/16/1990 - BRR { "BRR", "Brazilian Cruzeiro" } // 08/01/1993-07/01/1994 - BRZ { "BRZ", "Brazilian Cruzeiro (1942-1967)" } // 1942-1967 - BSD { "BSD", "Bahamian Dollar" } // 5/25/1966- - BSP { "BSP", "Bahamian Pound" } // 1869-5/25/1966 - BTN { "Nu", "Bhutan Ngultrum" } // 1974- - BTR { "BTR", "Bhutan Rupee" } // 1928-1974 - BUK { "BUK", "Burmese Kyat" } // 01/04/1948-06/18/1989 - BUR { "BUR", "Burmese Rupee" } // 04/01/1937-07/01/1952 - BWP { "BWP", "Botswanan Pula" } // 1976- - BYB { "BYB", "Belarussian New Ruble (1994-1999)" } // 08/1994-01/01/2000 - BYL { "BYL", "Belarussian Ruble (1992-1994)" } // 09/25/1992-08/1994 - BYR { "Rbl", "Belarussian Ruble" } // 01/01/2000- - BZD { "BZ$", "Belize Dollar" } // 1973- - BZH { "BZH", "British Honduras Dollar" } // 1855-1972 - CAD { "Can$","Canadian Dollar" } // 1858- - CDF { "CDF", "Congolese Franc Congolais" } // 07/1998- - CDG { "CDG", "Congolese Republic Franc" } // 06/30/1960-07/22/1967 - CDL { "CDL", "Congolese Zaire" } // 07/23/1967-10/27/1971 - CFF { "CFF", "Central African Republic CFA Franc" } // 04/01/1973-1992 - CHF { "SwF", "Swiss Franc" } // 03/17/1799- - CKD { "CKD", "Cook Islands Dollar" } // 1987- - CLC { "CLC", "Chilean Condor" } // 1817-12/31/1959 - CLE { "CLE", "Chilean Escudo" } // 1/1/1960-1975 - CLF { "CLF", "Chilean Unidades de Fomento" } // 1975- - CLP { "Ch$", "Chilean Peso" } // 1975- - CMF { "CMF", "Cameroon CFA Franc" } // 01/01/1960-1992 - CNP { "CNP", "Chinese Jen Min Piao Yuan" } // 1948-04/30/1953 - CNX { "CNX", "Chinese US Dollar Foreign Exchange Certificates" } // 1979-1998 - CNY { "Y", "Chinese Yuan Renminbi" } // 03/01/1953- - COB { "COB", "Colombian Paper Peso" } - COF { "COF", "Congo CFA Franc" } // 04/01/1973-1992 - COP { "Col$","Colombian Peso" } // 6/9/1871- - CRC { "C", "Costa Rican Colon" } // 10/26/1896- - CSC { "CSC", "Czechoslovak Koruna" } // 05/1945-06/01/1953 - CSK { "CSK", "Czechoslovak Hard Koruna" } // 06/01/1953-12/31/1992 - CUP { "CUP", "Cuban Peso" } // 1881- - CUX { "CUX", "Cuban Foreign Exchange Certificates" } // 1985- - CVE { "CVEsc","Cape Verde Escudo" } // 05/22/1911- - CWG { "CWG", "Curacao Guilder" } // 1848-1960 - CYP { "\u00A3C","Cyprus Pound" } // 9/5/1917- - CZK { "CZK", "Czech Republic Koruna" } // 01/01/1993- - DDM { "DDM", "East German Ostmark" } // 07/20/1948-10/02/1990 - DEM { "DEM", "Deutsche Mark" } // 6/20/1948-2002 - DES { "DES", "German Sperrmark" } // 03/31/1951-12/29/1958 - DJF { "DF", "Djibouti Franc" } // 06/27/1977- - DKK { "DKr", "Danish Krone" } // 5/27/1873- - DOP { "RD$", "Dominican Peso" } // 10/1947- - DZD { "DA", "Algerian Dinar" } // 04/01/1964- - DZF { "DZF", "Algerian New Franc" } // 01/01/1960-04/01/1964 - DZG { "DZG", "Algerian Franc Germinal" } // 08/04/1851-12/31/1959 - ECS { "ECS", "Ecuador Sucre" } // 4/1/1884-2000 - ECV { "ECV", "Ecuador Unidad de Valor Constante (UVC)" } // 1980- - EEK { "EEK", "Estonian Kroon" } // 06/21/1992- - EGP { "EGP", "Egyptian Pound" } // 11/14/1885- - ERN { "ERN", "Eritrean Nakfa" } // 1997- - ESP { "ESP","Spanish Peseta" } // 01/01/1859-02/28/2002 - ETB { "Br", "Ethiopian Birr" } // 09/15/1976- - ETD { "ETD", "Ethiopian Dollar" } // 07/23/1945-09/15/1976 - EUR { "\u20AC","Euro" } // 01/01/1999- - FIM { "FIM", "Finnish Markka" } // 1/1/1963-2002 - FIN { "FIN", "Finnish Markka (1860-1962)" } // 4/4/1860-12/31/1962 - FJD { "F$", "Fiji Dollar" } // 01/13/1969- - FJP { "FJP", "Fiji Pound" } // 1917-01/13/1969 - FKP { "FKP", "Falkland Islands Pound" } // 1901- - FOK { "FOK", "Faeroe Islands Kronur" } // 1940- - FRF { "FRF", "French Franc" } // 01/01/1960-2002 - FRG { "FRG", "French Franc Germinal/Franc Poincare" } // 04/07/1803-12/31/1959 - GAF { "GAF", "Gabon CFA Franc" } // 04/01/1973-1992 - GBP { "\u00A3","British Pound Sterling" } // 07/27/1694- - GEK { "GEK", "Georgian Kupon Larit" } // 04/05/1993-09/23/1995 - GEL { "lari","Georgian Lari" } // 09/23/1995- - GHC { "GHC", "Ghana Cedi" } // 03/09/1979- - GHO { "GHO", "Ghana Old Cedi" } // 07/19/1965-02/17/1967 - GHP { "GHP", "Ghana Pound" } // 07/14/1958- - GHR { "GHR", "Ghana Revalued Cedi" } // 02/17/1967-03/09/1979 - GIP { "GIP", "Gibraltar Pound" } // 1713- - GLK { "GLK", "Greenland Krone" } // 1874-07/01/1967 - GMD { "GMD", "Gambia Dalasi" } // 07/01/1971- - GMP { "GMP", "Gambia Pound" } // 05/13/1964-07/01/1971 - GNF { "GF", "Guinea Franc" } // 01/06/1986- - GNI { "GNI", "Guinea Franc (1960-1972)" } // 03/01/1960-10/02/1972 - GNS { "GNS", "Guinea Syli" } // 10/02/1972-01/06/1986 - GPF { "GPF", "Guadeloupe Franc" } // 07/11/1851-12/31/1959 - GQE { "GQE", "Equatorial Guinea Ekwele Guineana" } // 07/07/1975-01/01/1985 - GQF { "GQF", "Equatorial Guinea Franco" } // 01/01/1985-1992 - GQP { "GQP", "Equatorial Guinea Peseta Guineana" } // 10/12/1968-07/07/1975 - GRD { "GRD", "Greek Drachma" } // 05/01/1954-2002 - GRN { "GRN", "Greek New Drachma" } // 11/11/1944-05/01/1954 - GTQ { "Q", "Guatemala Quetzal" } // 05/27/1925- - GUF { "GUF", "French Guyana Franc Guiana" } // 07/11/1851-12/31/1959 - GWE { "GWE", "Portuguese Guinea Escudo" } // 1879-09/10/1974 - GWM { "GWM", "Portuguese Guinea Mil Reis" } // 1879-09/10/1974 - GWP { "GWP", "Guinea-Bissau Peso" } // 9/10/1974-12/31/1996 - GYD { "G$", "Guyana Dollar" } // 05/26/1966- - HKD { "HK$", "Hong Kong Dollar" } // 2/2/1895- - HNL { "L", "Hoduras Lempira" } // 04/03/1926- - HRD { "HRD", "Croatian Dinar" } - HRK { "HRK", "Croatian Kuna" } // 05/30/1994- - HTG { "HTG", "Haitian Gourde" } // 08/26/1872- - HUF { "Ft", "Hungarian Forint" } // 07/23/1946- - IBP { "IBP", "Northern Irish Pound" } // 07/27/1694- - IDG { "IDG", "Indonesian Nica Guilder" } // 09/1945-05/13/1950 - IDJ { "IDJ", "Indonesian Java Rupiah" } // 10/17/1945-03/13/1950 - IDN { "IDN", "Indonesian New Rupiah" } // 11/02/1949-12/13/1965 - IDR { "Rp", "Indonesian Rupiah" } // 12/13/1965- - IEP { "IR\u00A3","Irish Pound" } // 1922-2001 - ILL { "ILL", "Israeli Sheqel" } // 02/22/1980-09/04/1985 - ILP { "ILP", "Israeli Pound" } // 08/16/1948-02/22/1980 - ILS { "ILS","Israeli New Sheqel" } // 09/04/1985- - IMP { "IMP", "Isle of Man Pound Sterling" } // 1865- - INR { "=0#Rs.|1#Re.|1>;\n" - " x.x: << point >>;\n" - " zero; one; two; three; four; five; six; seven; eight; nine;\n" - " ten; eleven; twelve; thirteen; fourteen; fifteen; sixteen;\n" - " seventeen; eighteen; nineteen;\n" - " 20: twenty[->>];\n" - " 30: thirty[->>];\n" - " 40: forty[->>];\n" - " 50: fifty[->>];\n" - " 60: sixty[->>];\n" - " 70: seventy[->>];\n" - " 80: eighty[->>];\n" - " 90: ninety[->>];\n" - " 100: << hundred[ >>];\n" - " 1000: << thousand[ >>];\n" - " 1,000,000: << million[ >>];\n" - " 1,000,000,000,000: << billion[ >>];\n" - " 1,000,000,000,000,000: =#,##0=;\n" - "%default:\n" - " -x: minus >>;\n" - " x.x: << point >>;\n" - " =%simplified=;\n" - " 100: << hundred[ >%%and>];\n" - " 1000: << thousand[ >%%and>];\n" - " 100,000>>: << thousand[>%%commas>];\n" - " 1,000,000: << million[>%%commas>];\n" - " 1,000,000,000,000: << billion[>%%commas>];\n" - " 1,000,000,000,000,000: =#,##0=;\n" - "%%and:\n" - " and =%default=;\n" - " 100: =%default=;\n" - "%%commas:\n" - " ' and =%default=;\n" - " 100: , =%default=;\n" - " 1000: , <%default< thousand, >%default>;\n" - " 1,000,000: , =%default=;" - "%%lenient-parse:\n" - " & ' ' , ',' ;\n" - } } diff --git a/icuSources/data/locales/en_GB_EURO.txt b/icuSources/data/locales/en_GB_EURO.txt deleted file mode 100644 index 7ee2ab39..00000000 --- a/icuSources/data/locales/en_GB_EURO.txt +++ /dev/null @@ -1,19 +0,0 @@ -// *************************************************************************** -// * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -en_GB_EURO { - Version{"2.0"} - - NumberPatterns { - "#,##0.###;-#,##0.###", - "\u00a4#,##0.00;-\u00a4#,##0.00", - "#,##0%", - "#E0", - } - -} - diff --git a/icuSources/data/locales/en_HK.txt b/icuSources/data/locales/en_HK.txt index 0b3757e9..d64826de 100644 --- a/icuSources/data/locales/en_HK.txt +++ b/icuSources/data/locales/en_HK.txt @@ -1,44 +1,42 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/en_HK.xml // * // *************************************************************************** - -en_HK { - Version { "2.0" } -// AmPmMarkers { -// "AM", -// "PM", -// } - DateTimePatterns { - "h:mm:ss a z", - "h:mm:ss a z", - "h:mm:ss a", - "h:mm a", - "EEEE, d MMMM yyyy", - "d MMMM yyyy", - "d MMM yy", - "dd/MM/yy", - "{1} {0}", +en_HK{ + Currencies{ + HKD{ + "$", + "Hong Kong Dollar", + } + USD{ + "US$", + "USD", + } } -// NumberElements { -// ".", -// ",", -// ";", -// "%", -// "0", -// "#", -// "-", -// "E", -// "\u2030", -// "\u221E", -// "\uFFFD", -// } - NumberPatterns { + NumberPatterns{ "#,##0.###;-#,##0.###", - "\u00A4#,##0.00;(\u00A4#,##0.00)", + "¤#,##0.00;(¤#,##0.00)", "#,##0%", "#E0", } + Version{"1.2"} + calendar{ + gregorian{ + DateTimePatterns{ + "h:mm:ss a z", + "h:mm:ss a z", + "h:mm:ss a", + "h:mm a", + "EEEE, d MMMM yyyy", + "d MMMM yyyy", + "d MMM yyyy", + "dd/MM/yyyy", + "{1} {0}", + } + } + } } diff --git a/icuSources/data/locales/en_IE.txt b/icuSources/data/locales/en_IE.txt index 04f0939c..c805803e 100644 --- a/icuSources/data/locales/en_IE.txt +++ b/icuSources/data/locales/en_IE.txt @@ -1,52 +1,46 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/en_IE.xml // * // *************************************************************************** - -en_IE { - Version { "2.0" } - AmPmMarkers { - "a.m.", - "p.m.", - } -// DateTimeElements:intvector { -// 2, -// 1, -// } - DateTimePatterns { - "HH:mm:ss z", - "HH:mm:ss z", - "HH:mm:ss", - "HH:mm", - "EEEE d MMMM yyyy", - "d MMMM yyyy", - "d MMM yyyy", - "dd/MM/yyyy", - "{1} {0}", +en_IE{ + Currencies{ + IEP{ + "£", + "Irish Pound", + } } - NumberPatterns { - "#,##0.###;-#,##0.###", - "\u00a4#,##0.00;-\u00a4#,##0.00", - "#,##0%", - "#E0", + Version{"1.2"} + calendar{ + gregorian{ + AmPmMarkers{ + "a.m.", + "p.m.", + } + DateTimePatterns{ + "HH:mm:ss z", + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm", + "EEEE d MMMM yyyy", + "d MMMM yyyy", + "d MMM yyyy", + "dd/MM/yyyy", + "{1} {0}", + } + } } -// Duplicated in parent -// Languages { -// en { "English" } -// } - LocaleID:int { 0x1809 } -// LocaleString { "en_IE" } -// ShortCountry { "IRL" } - zoneStrings { + zoneStrings{ { - "Europe/London", + "Europe/Dublin", "Greenwich Mean Time", "GMT", - "Ireland Summer Time", + "Irish Summer Time", "IST", + "Dublin", } } - } diff --git a/icuSources/data/locales/en_IN.txt b/icuSources/data/locales/en_IN.txt index bced981c..b1d21cc8 100644 --- a/icuSources/data/locales/en_IN.txt +++ b/icuSources/data/locales/en_IN.txt @@ -1,45 +1,42 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/en_IN.xml // * // *************************************************************************** - -en_IN { - Version{"2.0"} -// AmPmMarkers { -// "AM", -// "PM", -// } - DateTimePatterns { - "h:mm:ss a z", - "h:mm:ss a z", - "h:mm:ss a", - "h:mm a", - "EEEE d MMMM yyyy", - "d MMMM yyyy", - "dd-MMM-yy", - "dd/MM/yy", - "{1} {0}", - } - -// NumberElements { -// ".", -// ",", -// ";", -// "%", -// "0", -// "#", -// "-", -// "E", -// "\u2030", -// "\u221E", -// "\uFFFD", -// } - NumberPatterns { +en_IN{ + NumberPatterns{ "##,##,##0.###;-##,##,##0.###", - "\u00A4 ##,##,##0.00;-\u00A4 ##,##,##0.00", + "¤ ##,##,##0.00;-¤ ##,##,##0.00", "##,##,##0%", "#E0", } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "h:mm:ss a z", + "h:mm:ss a z", + "h:mm:ss a", + "h:mm a", + "EEEE d MMMM yyyy", + "d MMMM yyyy", + "dd-MMM-yy", + "dd/MM/yy", + "{1} {0}", + } + weekend:intvector{ + 1, + 0, + 1, + 86400000, + } + } + } } diff --git a/icuSources/data/locales/en_MT.txt b/icuSources/data/locales/en_MT.txt index a1b2eb3d..02e9b00d 100644 --- a/icuSources/data/locales/en_MT.txt +++ b/icuSources/data/locales/en_MT.txt @@ -1,38 +1,36 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1998-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/en_MT.xml // * // *************************************************************************** -// English, Malta locale -// srl@monkey.sbay.org - -en_MT { - Version{ "2.0" } - -// ShortCountry { MLT } - - - NumberPatterns { - "#,##0.###;-#,##0.###", - "\u00A4#,##0.00;(\u00A4#,##0.00)", - "#,##0%", - "#E0", +en_MT{ + Currencies{ + GBP{ + "GBP", + "British Pound Sterling", + } } - - DateTimePatterns { - "h:mm:ss a z", - "h:mm:ss a z", - "h:mm:ss a", - "h:mm a", - "dd MMMM yyyy", - "dd MMMM yyyy", - "dd-MMM-yyyy", - "dd/MM/yy", - "{1} {0}", + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 1, + 4, + } + DateTimePatterns{ + "HH:mm:ss z", + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm", + "EEEE, d MMMM yyyy", + "dd MMMM yyyy", + "dd MMM yyyy", + "dd/MM/yyyy", + "{1} {0}", + } + } } - - -// LocaleID {"043A"} ?? - } diff --git a/icuSources/data/locales/en_NZ.txt b/icuSources/data/locales/en_NZ.txt index e6a54fe3..cf36c0e3 100644 --- a/icuSources/data/locales/en_NZ.txt +++ b/icuSources/data/locales/en_NZ.txt @@ -1,43 +1,32 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/en_NZ.xml // * // *************************************************************************** - -en_NZ { - Version { "2.0" } -// Duplicated in parent -// Countries { -// US { "United States" } -// GB { "United Kingdom" } -// CA { "Canada" } -// IE { "Ireland" } -// AU { "Australia" } -// NZ { "New Zealand" } -// } - DateTimePatterns { - "h:mm:ss a z", - "h:mm:ss a", - "h:mm:ss a", - "h:mm a", - "EEEE, d MMMM yyyy", - "d MMMM yyyy", - "d/MM/yyyy", - "d/MM/yy", - "{1} {0}", +en_NZ{ + Currencies{ + NZD{ + "$", + "New Zealand Dollar", + } } -// Duplicated in parent -// Languages { -// en { "English" } -// } - LocaleID:int { 0x1409 } -// LocaleString { "en_NZ" } -// ShortCountry { "NZL" } - - // Currency display names - Currencies { - NZD { "$", "New Zealand Dollar" } - USD { "US$", "US Dollar" } + Version{"1.2"} + calendar{ + gregorian{ + DateTimePatterns{ + "h:mm:ss a z", + "h:mm:ss a", + "h:mm:ss a", + "h:mm a", + "EEEE, d MMMM yyyy", + "d MMMM yyyy", + "d/MM/yyyy", + "d/MM/yy", + "{1} {0}", + } + } } } diff --git a/icuSources/data/locales/en_PH.txt b/icuSources/data/locales/en_PH.txt index 2bac84d4..dfe2c92e 100644 --- a/icuSources/data/locales/en_PH.txt +++ b/icuSources/data/locales/en_PH.txt @@ -1,47 +1,38 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/en_PH.xml // * // *************************************************************************** - -en_PH { - Version{"2.0"} -// AmPmMarkers { -// "AM", -// "PM", -// } - - DateTimePatterns { - "h:mm:ss a z", - "h:mm:ss a z", - "h:mm:ss a", - "h:mm a", - "EEEE, MMMM d, yyyy", - "MMMM d, yyyy", - "MM d, yy", - "M/d/yy", - "{1} {0}", +en_PH{ + Currencies{ + PHP{ + "PHP", + "Peso", + } } -// NumberElements { -// ".", -// ",", -// ";", -// "%", -// "0", -// "#", -// "-", -// "E", -// "\u2030", -// "\u221E", -// "\uFFFD", -// } - NumberPatterns { + NumberPatterns{ "#,##0.###;-#,##0.###", - "\u00A4#,##0.00;(\u00A4#,##0.00)", + "¤#,##0.00;(¤#,##0.00)", "#,##0%", "#E0", } - LocaleID:int { 0x3409 } - + Version{"1.2"} + calendar{ + gregorian{ + DateTimePatterns{ + "h:mm:ss a z", + "h:mm:ss a z", + "h:mm:ss a", + "h:mm a", + "EEEE, MMMM d, yyyy", + "MMMM d, yyyy", + "MM d, yy", + "M/d/yy", + "{1} {0}", + } + } + } } diff --git a/icuSources/data/locales/en_PK.txt b/icuSources/data/locales/en_PK.txt new file mode 100644 index 00000000..4f86079a --- /dev/null +++ b/icuSources/data/locales/en_PK.txt @@ -0,0 +1,35 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/en_PK.xml +// * +// *************************************************************************** +en_PK{ + NumberPatterns{ + "##,##,##0.###;-##,##,##0.###", + "¤ ##,##,##0.00;-¤ ##,##,##0.00", + "##,##,##0%", + "#E0", + } + /** + * Draft + */ + Version{"1.2"} + calendar{ + gregorian{ + DateTimePatterns{ + "h:mm:ss a z", + "h:mm:ss a z", + "h:mm:ss a", + "h:mm a", + "EEEE d MMMM yyyy", + "d MMMM yyyy", + "dd-MMM-yy", + "dd/MM/yy", + "{1} {0}", + } + } + } +} diff --git a/icuSources/data/locales/en_SG.txt b/icuSources/data/locales/en_SG.txt index a265bebe..8f7863f6 100644 --- a/icuSources/data/locales/en_SG.txt +++ b/icuSources/data/locales/en_SG.txt @@ -1,41 +1,46 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2005 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/en_SG.xml // * // *************************************************************************** -// -// $Revision: 1.1.1.2 $ -// $Tag: -// Singapore English locale: Data By Syn Wee Quek - -en_SG { - - Version { "2.0" } - DateTimePatterns { - "a hh:mm:ss", - "a hh:mm:ss", - "a hh:mm", - "a hh:mm", - "dd MMMM yyyy", - "dd MMM yyyy", - "dd-MMM-yy", - "dd/MM/yy", - "{1} {0}" +en_SG{ + Currencies{ + SGD{ + "$", + "Singapore Dollar", + } + USD{ + "US$", + "USD", + } } - - -// ShortCountry { "SIN" } // copied to zh_SG.txt - - zoneStrings { + Version{"1.2"} + calendar{ + gregorian{ + DateTimePatterns{ + "h:mm:ss a z", + "h:mm:ss a z", + "h:mm:ss a", + "h:mm a", + "EEEE, dd MMMM yyyy", + "dd MMMM yyyy", + "dd MMM yyyy", + "dd/MM/yyyy", + "{1} {0}", + } + } + } + zoneStrings{ { - "SST", + "Pacific/Guadalcanal", "Singapore Standard Time", "SST", "Singapore Standard Time", "SST", - "Singapore" + "Singapore", } } - } diff --git a/icuSources/data/locales/en_US.txt b/icuSources/data/locales/en_US.txt index d01a6a9b..758febbe 100644 --- a/icuSources/data/locales/en_US.txt +++ b/icuSources/data/locales/en_US.txt @@ -1,19 +1,28 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/en_US.xml // * // *************************************************************************** - -en_US { - Version{ "2.0" } -// LocaleString { "en_US" } - NumberPatterns { +en_US{ + Currencies{ + USD{ + "$", + "US Dollar", + } + } + MeasurementSystem:int{1} + NumberPatterns{ "#,##0.###;-#,##0.###", - "\u00A4#,##0.00;(\u00A4#,##0.00)", + "¤#,##0.00;(¤#,##0.00)", "#,##0%", "#E0", } -// ShortCountry { "USA" } - LocaleID:int { 0x0409 } + PaperSize:intvector{ + 279, + 216, + } + Version{"1.2"} } diff --git a/icuSources/data/locales/en_US_POSIX.txt b/icuSources/data/locales/en_US_POSIX.txt index f6bdacdd..1f8ff776 100644 --- a/icuSources/data/locales/en_US_POSIX.txt +++ b/icuSources/data/locales/en_US_POSIX.txt @@ -1,22 +1,16 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/en_US_POSIX.xml // * // *************************************************************************** - -// This is an invariant locale. -// This has been also known as the C locale on Unix or the invariant locale in Windows. -en_US_POSIX { - Version{ "2.0" } - // No grouping separators - NumberPatterns { - "###0.###;-###0.###", - "\u00A4 ###0.00;-\u00A4 ###0.00", - "###0%", - "0.000000E+000", - } - NumberElements { +/** + * ICU source: ../../../locale/icu/main/en_US_POSIX.xml + */ +en_US_POSIX{ + NumberElements{ ".", ",", ";", @@ -27,9 +21,17 @@ en_US_POSIX { "E", "0/00", "INF", - "\uFFFD", - ".", + "NaN", + "+", + } + NumberPatterns{ + "0.######;-0.######", + "¤ 0.00;-¤ 0.00", + "0%", + "0.000000E+000", + } + Version{"1.2"} + boundaries{ + word{"word_POSIX"} } -// LocaleString { "en_US_POSIX" } - LocaleID:int { 0x7F } } diff --git a/icuSources/data/locales/en_VI.txt b/icuSources/data/locales/en_VI.txt index 1ef64212..8cbaef39 100644 --- a/icuSources/data/locales/en_VI.txt +++ b/icuSources/data/locales/en_VI.txt @@ -1,19 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/en_VI.xml // * // *************************************************************************** - -en_VI { - Version{ "2.0" } -// LocaleString { "en_VI" } - NumberPatterns { +en_VI{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "\u00A4#,##0.00;(\u00A4#,##0.00)", + "¤#,##0.00;(¤#,##0.00)", "#,##0%", "#E0", } -// ShortCountry { "VIR" } - LocaleID:int { 0x2409 } + Version{"1.2"} } diff --git a/icuSources/data/locales/en_ZA.txt b/icuSources/data/locales/en_ZA.txt index e68aa8c0..a7001daf 100644 --- a/icuSources/data/locales/en_ZA.txt +++ b/icuSources/data/locales/en_ZA.txt @@ -1,42 +1,26 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/en_ZA.xml // * // *************************************************************************** - -en_ZA { - Version { "2.0" } -// Duplicated in parent -// Countries { -// US { "United States" } -// GB { "United Kingdom" } -// CA { "Canada" } -// IE { "Ireland" } -// ZA { "South Africa" } -// } - DateTimePatterns { - "h:mm:ss a", - "h:mm:ss a", - "h:mm:ss a", - "h:mm a", - "EEEE dd MMMM yyyy", - "dd MMMM yyyy", - "dd MMM yyyy", - "yyyy/MM/dd", - "{1} {0}", - } -// Duplicated in parent -// Languages { -// en { "English" } -// } - LocaleID:int { 0x1c09 } -// LocaleString { "en_ZA" } - NumberPatterns { - "#,##0.###;-#,##0.###", - "\u00A4#,##0.00;-\u00A4#,##0.00", - "#,##0%", - "#E0", +en_ZA{ + Version{"1.2"} + calendar{ + gregorian{ + DateTimePatterns{ + "h:mm:ss a", + "h:mm:ss a", + "h:mm:ss a", + "h:mm a", + "EEEE dd MMMM yyyy", + "dd MMMM yyyy", + "dd MMM yyyy", + "yyyy/MM/dd", + "{1} {0}", + } + } } -// ShortCountry { "ZAF" } } diff --git a/icuSources/data/locales/en_ZW.txt b/icuSources/data/locales/en_ZW.txt index 2e0cbd99..adce5903 100644 --- a/icuSources/data/locales/en_ZW.txt +++ b/icuSources/data/locales/en_ZW.txt @@ -1,28 +1,32 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/en_ZW.xml // * // *************************************************************************** - -en_ZW { - Version { "2.0" } - DateTimePatterns { - "h:mm:ss a", - "h:mm:ss a", - "h:mm:ss a", - "h:mm a", - "EEEE dd MMMM yyyy", - "dd MMMM yyyy", - "dd MMM,yy", - "d/M/yyyy", - "{1} {0}", +en_ZW{ + Currencies{ + ZWD{ + "Z$", + "Zimbabwean Dollar", + } } - NumberPatterns { - "#,##0.###;-#,##0.###", - "\u00a4#,##0.00;-\u00a4#,##0.00", - "#,##0%", - "#E0", + Version{"1.2"} + calendar{ + gregorian{ + DateTimePatterns{ + "h:mm:ss a", + "h:mm:ss a", + "h:mm:ss a", + "h:mm a", + "EEEE dd MMMM yyyy", + "dd MMMM yyyy", + "dd MMM,yy", + "d/M/yyyy", + "{1} {0}", + } + } } - LocaleID:int { 0x3009 } } diff --git a/icuSources/data/locales/eo.txt b/icuSources/data/locales/eo.txt index ebb3d1b2..fda34d00 100644 --- a/icuSources/data/locales/eo.txt +++ b/icuSources/data/locales/eo.txt @@ -1,172 +1,483 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1999-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/eo.xml // * // *************************************************************************** -// or better http://www.jtcsv.com/cgibin/icu-bugs - -eo { - Version { "3.0" } - - // collation: accented characters have primary (base character) differences - // see Jitterbug 1440 http://www.jtcsv.com/cgibin/icu-bugs?findid=1440 - CollationElements { - Version { "1.0" } - Sequence { "&C<\u0109<<<\u0108 &G<\u011d<<<\u011c &H<\u0125<<<\u0124" - "&J<\u0135<<<\u0134 &S<\u015d<<<\u015c &U<\u016d<<<\u016c" } - } - - Countries { - AT { "A\u016dstrujo" } - BE { "Belgujo" } - CA { "Kanado" } - CH { "Svisujo" } - DE { "Germanujo" } - DK { "Danujo" } - ES { "Hispanujo" } - FI { "Finnlando" } - GR { "Grekujo" } - IT { "Italujo" } - JP { "Japanujo" } - NL { "Nederlando" } - NO { "Norvego" } - PT { "Portugalujo" } - SE { "Svedujo" } - TR { "Turkujo" } - US { "Usono" } - } - DateTimePatterns { - "H'-a horo kaj 'm z", - "HH:mm:ss z", - "HH:mm:ss", - "HH:mm", - "EEEE, d'-a de 'MMMM yyyy", - "yyyy-MMMM-dd", - "yyyy-MMM-dd", - "yy-MM-dd", - "{1} {0}", - } - DateTimeElements:intvector { - 2, - 4, - } - AmPmMarkers { - "atm", - "ptm", +/** + * ICU source: ../../../locale/icu/main/eo.xml + */ +eo{ + Countries{ + AD{"Andoro"} + AE{"Unuiĝintaj Arabaj Emirlandos"} + AF{"Afganujo"} + AG{"Antigvo-Barbudo"} + AI{"Angvilo"} + AL{"Albanujo"} + AM{"Armenujo"} + AN{"Nederlandaj Antiloj"} + AO{"Angolo"} + AQ{"Antarkto"} + AR{"Argentino"} + AT{"Aŭstrujo"} + AU{"Aŭstralio"} + AW{"Arubo"} + AZ{"Azerbajĝano"} + BA{"Bosnio-Hercegovino"} + BB{"Barbado"} + BD{"Bangladeŝo"} + BE{"Belgujo"} + BF{"Burkino"} + BG{"Bulgarujo"} + BH{"Barejno"} + BI{"Burundo"} + BJ{"Benino"} + BM{"Bermudoj"} + BN{"Brunejo"} + BO{"Bolivio"} + BR{"Brazilo"} + BS{"Bahamoj"} + BT{"Butano"} + BW{"Bocvano"} + BY{"Belorusujo"} + BZ{"Belizo"} + CA{"Kanado"} + CF{"Centr-Afrika Respubliko"} + CG{"Kongolo"} + CH{"Svisujo"} + CI{"Ebur-Bordo"} + CK{"Kukinsuloj"} + CL{"Ĉilio"} + CM{"Kameruno"} + CN{"Ĉinujo"} + CO{"Kolombio"} + CR{"Kostariko"} + CU{"Kubo"} + CV{"Kabo-Verdo"} + CY{"Kipro"} + CZ{"Ĉeĥujo"} + DE{"Germanujo"} + DJ{"Ĝibutio"} + DK{"Danujo"} + DM{"Dominiko"} + DO{"Domingo"} + DZ{"Alĝerio"} + EC{"Ekvadoro"} + EE{"Estonujo"} + EG{"Egipto"} + EH{"Okcidenta Saharo"} + ER{"Eritreo"} + ES{"Hispanujo"} + ET{"Etiopujo"} + FI{"Finnlando"} + FJ{"Fiĝoj"} + FM{"Mikronezio"} + FO{"Ferooj"} + FR{"Francujo"} + GA{"Gabono"} + GB{"Unuiĝinta Reĝlando"} + GD{"Grenado"} + GE{"Kartvelujo"} + GF{"Franca Gviano"} + GH{"Ganao"} + GI{"Ĝibraltaro"} + GL{"Gronlando"} + GM{"Gambio"} + GN{"Gvineo"} + GP{"Gvadelupo"} + GQ{"Ekvatora Gvineo"} + GR{"Grekujo"} + GS{"Sud-Georgio kaj Sud-Sandviĉinsuloj"} + GT{"Gvatemalo"} + GU{"Gvamo"} + GW{"Gvineo-Bisaŭo"} + GY{"Gujano"} + HM{"Herda kaj Makdonaldaj Insuloj"} + HN{"Honduro"} + HR{"Kroatujo"} + HT{"Haitio"} + HU{"Hungarujo"} + ID{"Indonezio"} + IE{"Irlando"} + IL{"Israelo"} + IN{"Hindujo"} + IO{"Brita Hindoceana Teritorio"} + IQ{"Irako"} + IR{"Irano"} + IS{"Islando"} + IT{"Italujo"} + JM{"Jamajko"} + JO{"Jordanio"} + JP{"Japanujo"} + KE{"Kenjo"} + KG{"Kirgizistano"} + KH{"Kamboĝo"} + KI{"Kiribato"} + KM{"Komoroj"} + KN{"Sent-Kristofo kaj Neviso"} + KP{"Nord-Koreo"} + KR{"Sud-Koreo"} + KW{"Kuvajto"} + KY{"Kejmanoj"} + KZ{"Kazaĥstano"} + LA{"Laoso"} + LB{"Libano"} + LC{"Sent-Lucio"} + LI{"Liĥtenŝtejno"} + LK{"Sri-Lanko"} + LR{"Liberio"} + LS{"Lesoto"} + LT{"Litovujo"} + LU{"Luksemburgo"} + LV{"Latvujo"} + LY{"Libio"} + MA{"Maroko"} + MC{"Monako"} + MD{"Moldavujo"} + MG{"Madagaskaro"} + MH{"Marŝaloj"} + MK{"Makedonujo"} + ML{"Malio"} + MM{"Mjanmao"} + MN{"Mongolujo"} + MP{"Nord-Marianoj"} + MQ{"Martiniko"} + MR{"Maŭritanujo"} + MT{"Malto"} + MU{"Maŭricio"} + MV{"Maldivoj"} + MW{"Malavio"} + MX{"Meksiko"} + MY{"Malajzio"} + MZ{"Mozambiko"} + NA{"Namibio"} + NC{"Nov-Kaledonio"} + NE{"Niĝero"} + NF{"Norfolkinsulo"} + NG{"Niĝerio"} + NI{"Nikaragvo"} + NL{"Nederlando"} + NO{"Norvegujo"} + NP{"Nepalo"} + NR{"Nauro"} + NU{"Niuo"} + NZ{"Nov-Zelando"} + OM{"Omano"} + PA{"Panamo"} + PE{"Peruo"} + PF{"Franca Polinezio"} + PG{"Papuo-Nov-Gvineo"} + PH{"Filipinoj"} + PK{"Pakistano"} + PL{"Pollando"} + PM{"Sent-Piero kaj Mikelono"} + PN{"Pitkarna Insulo"} + PR{"Puerto-Riko"} + PT{"Portugalujo"} + PW{"Belaŭo"} + PY{"Paragvajo"} + QA{"Kataro"} + RE{"Reunio"} + RO{"Rumanujo"} + RU{"Rusujo"} + RW{"Ruando"} + SA{"Saŭda Arabujo"} + SB{"Salomonoj"} + SC{"Sejŝeloj"} + SD{"Sudano"} + SE{"Svedujo"} + SG{"Singapuro"} + SH{"Sent-Heleno"} + SI{"Slovenujo"} + SJ{"Svalbardo kaj Jan-Majen-insulo"} + SK{"Slovakujo"} + SL{"Siera-Leono"} + SM{"San-Marino"} + SN{"Senegalo"} + SO{"Somalujo"} + SP{"Serbujo"} + SR{"Surinamo"} + ST{"Sao-Tomeo kaj Principeo"} + SV{"Salvadoro"} + SY{"Sirio"} + SZ{"Svazilando"} + TD{"Ĉado"} + TG{"Togolo"} + TH{"Tajlando"} + TJ{"Taĝikujo"} + TM{"Turkmenujo"} + TN{"Tunizio"} + TO{"Tongo"} + TR{"Turkujo"} + TT{"Trinidado kaj Tobago"} + TV{"Tuvalo"} + TW{"Tajvano"} + TZ{"Tanzanio"} + UA{"Ukrajno"} + UG{"Ugando"} + UM{"Usonaj malgrandaj insuloj"} + US{"Usono"} + UY{"Urugvajo"} + UZ{"Uzbekujo"} + VA{"Vatikano"} + VC{"Sent-Vincento kaj la Grenadinoj"} + VE{"Venezuelo"} + VG{"Britaj Virgulininsuloj"} + VI{"Usonaj Virgulininsuloj"} + VN{"Vjetnamo"} + VU{"Vanuatuo"} + WF{"Valiso kaj Futuno"} + WS{"Samoo"} + YE{"Jemeno"} + YT{"Majoto"} + ZA{"Sud-Afriko"} + ZM{"Zambio"} + ZW{"Zimbabvo"} } - DayAbbreviations { - "di", - "lu", - "ma", - "me", - "\u0135a", - "ve", - "sa", + ExemplarCharacters{"[a-z ŭ ĉ ĝ ĥ ĵ ŝ]"} + Languages{ + aa{"afara"} + ab{"abĥaza"} + af{"afrikansa"} + am{"amhara"} + ar{"araba"} + as{"asama"} + ay{"ajmara"} + az{"azerbajĝana"} + ba{"baŝkira"} + be{"belorusa"} + bg{"bulgara"} + bh{"bihara"} + bi{"bislamo"} + bn{"bengala"} + bo{"tibeta"} + br{"bretona"} + ca{"kataluna"} + co{"korsika"} + cs{"ĉeĥa"} + cy{"kimra"} + da{"dana"} + de{"germana"} + dz{"dzonko"} + el{"greka"} + en{"angla"} + eo{"esperanto"} + es{"hispana"} + et{"estona"} + eu{"eŭska"} + fa{"persa"} + fi{"finna"} + fj{"fiĝia"} + fo{"feroa"} + fr{"franca"} + fy{"frisa"} + ga{"irlanda"} + gd{"gaela"} + gl{"galega"} + gn{"gvarania"} + gu{"guĝarata"} + ha{"haŭsa"} + he{"hebrea"} + hi{"hinda"} + hr{"kroata"} + hu{"hungara"} + hy{"armena"} + ia{"interlingvao"} + id{"indonezia"} + ie{"okcidentalo"} + ik{"eskima"} + is{"islanda"} + it{"itala"} + iu{"inuita"} + ja{"japana"} + jv{"java"} + ka{"kartvela"} + kk{"kazaĥa"} + kl{"gronlanda"} + km{"kmera"} + kn{"kanara"} + ko{"korea"} + ks{"kaŝmira"} + ku{"kurda"} + ky{"kirgiza"} + la{"latino"} + ln{"lingala"} + lo{"laŭa"} + lt{"litova"} + lv{"latva"} + mg{"malagasa"} + mi{"maoria"} + mk{"makedona"} + ml{"malajalama"} + mn{"mongola"} + mr{"marata"} + ms{"malaja"} + mt{"malta"} + my{"birma"} + na{"naura"} + ne{"nepala"} + nl{"nederlanda"} + no{"norvega"} + oc{"okcitana"} + om{"oroma"} + or{"orijo"} + pa{"panĝaba"} + pl{"pola"} + ps{"paŝtua"} + pt{"portugala"} + qu{"keĉua"} + rm{"romanĉa"} + rn{"burunda"} + ro{"rumana"} + ru{"rusa"} + rw{"ruanda"} + sa{"sanskrito"} + sd{"sinda"} + sg{"sangoa"} + sh{"serbo-Kroata"} + si{"sinhala"} + sk{"slovaka"} + sl{"slovena"} + sm{"samoa"} + sn{"ŝona"} + so{"somala"} + sq{"albana"} + sr{"serba"} + ss{"svazia"} + st{"sota"} + su{"sunda"} + sv{"sveda"} + sw{"svahila"} + ta{"tamila"} + te{"telugua"} + tg{"taĝika"} + th{"taja"} + ti{"tigraja"} + tk{"turkmena"} + tl{"filipina"} + tn{"cvana"} + to{"tongaa"} + tr{"turka"} + ts{"conga"} + tt{"tatara"} + tw{"akana"} + ug{"ujgura"} + uk{"ukraina"} + ur{"urduo"} + uz{"uzbeka"} + vi{"vjetnama"} + vo{"volapuko"} + wo{"volofa"} + xh{"ksosa"} + yi{"jida"} + yo{"joruba"} + za{"ĝuanga"} + zh{"ĉina"} + zu{"zulua"} } - DayNames { - "diman\u0109o", - "lundo", - "mardo", - "merkredo", - "\u0135a\u016ddo", - "vendredo", - "sabato", + LocaleScript{ + "Latn", } - Eras { - "aK", - "pK", - } - Languages { - da { "dana" } - de { "germana" } - el { "greka" } - en { "angla" } - eo { "esperanto" } - es { "hispana" } - fi { "finna" } - it { "itala" } - ja { "japana" } - nl { "nederlanda" } - no { "norvega" } - pt { "portugala" } - sv { "sveda" } - tr { "turka" } - } - //LocaleID { "07e0" } -// LocaleString { "eo" } - MonthAbbreviations { - "jan", - "feb", - "mar", - "apr", - "maj", - "jun", - "jul", - "a\u016dg", - "sep", - "okt", - "nov", - "dec", - } - MonthNames { - "januaro", - "februaro", - "marto", - "aprilo", - "majo", - "junio", - "julio", - "a\u016dgusto", - "septembro", - "oktobro", - "novembro", - "decembro", - } - NumberElements { + NumberElements{ ",", - "\u00A0", + " ", ";", "%", "0", "#", "-", "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", + "‰", + "∞", + "�", + "+", } -// ShortLanguage { "epo" } - localPatternChars { "GjMtkHmslTDUSnahKzJd" } -// LocaleScript{ -// "Latn", // ISO 15924 Name -// } - ExemplarCharacters { "[a-z \u016d \u0109 \u011d \u0125 \u0135 \u015d]" } - //------------------------------------------------------------ - // Rule Based Number Format Support - //------------------------------------------------------------ - -// data from 'Esperanto-programita 1' courtesy of Markus Scherer - - SpelloutRules { - "-x: minus >>;\n" - "x.x: << komo >>;\n" - "nulo; unu; du; tri; kvar; kvin; ses; sep; ok; na\u016d;\n" - "10: dek[ >>];\n" - "20: <>];\n" - "100: cent[ >>];\n" - "200: <>];\n" - "1000: mil[ >>];\n" - "2000: <>];\n" - "10000: dekmil[ >>];\n" - "11000>: << mil[ >>];\n" - "1,000,000: miliono[ >>];\n" - "2,000,000: << milionoj[ >>];\n" - "1,000,000,000: miliardo[ >>];\n" - "2,000,000,000: << miliardoj[ >>];\n" - "1,000,000,000,000: biliono[ >>];\n" - "2,000,000,000,000: << bilionoj[ >>];\n" - "1,000,000,000,000,000: =#,##0=;\n" + Version{"1.2"} + calendar{ + gregorian{ + AmPmMarkers{ + "atm", + "ptm", + } + DateTimeElements:intvector{ + 2, + 4, + } + DateTimePatterns{ + "H'-a horo kaj 'm z", + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm", + "EEEE, d'-a de 'MMMM yyyy", + "yyyy-MMMM-dd", + "yyyy-MMM-dd", + "yy-MM-dd", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "di", + "lu", + "ma", + "me", + "ĵa", + "ve", + "sa", + } + wide{ + "dimanĉo", + "lundo", + "mardo", + "merkredo", + "ĵaŭdo", + "vendredo", + "sabato", + } + } + } + eras{ + abbreviated{ + "aK", + "pK", + } + } + monthNames{ + format{ + abbreviated{ + "jan", + "feb", + "mar", + "apr", + "maj", + "jun", + "jul", + "aŭg", + "sep", + "okt", + "nov", + "dec", + } + wide{ + "januaro", + "februaro", + "marto", + "aprilo", + "majo", + "junio", + "julio", + "aŭgusto", + "septembro", + "oktobro", + "novembro", + "decembro", + } + } + } + } } + localPatternChars{"GjMtkHmslTDUSnahKzJdugAZ"} } diff --git a/icuSources/data/locales/es.txt b/icuSources/data/locales/es.txt index c8c5951c..9142d450 100644 --- a/icuSources/data/locales/es.txt +++ b/icuSources/data/locales/es.txt @@ -1,543 +1,2309 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/es.xml // * // *************************************************************************** - -es { - Version { "2.0" } - - "%%TRADITIONAL" { "Tradicional" } - - "%%REVISED" { "Revisado" } - - CollationElements { - Version { "1.0" } - Sequence { "& N < n\u0303<<< N\u0303" } - } - /* Duplicates from root commented out. */ - Countries { - AE { "Emiratos \u00C1rabes Unidos" } - AS { "Samoa Americana" } - //AR { "Argentina" } - BE { "B\u00E9lgica" } - BH { "Bahr\u00e9in" } - //BO { "Bolivia" } - BR { "Brasil" } - BW { "Botsuana" } - BZ { "Belice" } - BY { "Bielorrusia" } - CA { "Canad\u00E1" } - CH { "Suiza" } - //CL { "Chile" } - //CO { "Colombia" } - //CR { "Costa Rica" } - CZ { "Rep\u00fablica Checa" } - DE { "Alemania" } - DJ { "Yibuti" } - DK { "Dinamarca" } - DO { "Rep\u00FAblica Dominicana" } - DZ { "Argelia" } - //EC { "Ecuador" } - EG { "Egipto" } - ES { "Espa\u00F1a" } - ET { "Etiop\u00eda" } - FI { "Finlandia" } - FO { "Islas Feroe" } - FR { "Francia" } - GB { "Reino Unido" } - GL { "Groenlandia" } - GR { "Grecia" } - //GT { "Guatemala" } - HK { "Hong Kong, R.A.E. de China" } - //HN { "Honduras" } - HR { "Croacia" } - HU { "Hungr\u00EDa" } - IE { "Irlanda" } - IQ { "Irak" } - IR { "Ir\u00E1n" } - IS { "Islandia" } - IT { "Italia" } - JO { "Jordania" } - JP { "Jap\u00F3n" } - KE { "Kenia" } - KP { "Corea del Norte" } - KR { "Corea del Sur" } - LB { "L\u00EDbano" } - LT { "Lituania" } - LU { "Luxemburgo" } - LV { "Letonia" } - LY { "Libia" } - MA { "Marruecos" } - MH { "Islas Marshall" } - MO { "Macao, R.A.E. de China" } - MP { "Islas Marianas del Norte" } - MX { "M\u00E9xico" } - //NI { "Nicaragua" } - NL { "Pa\u00EDses Bajos" } - NO { "Noruega" } - NZ { "Nueva Zelanda" } - OM { "Om\u00E1n" } - PA { "Panam\u00E1" } - PE { "Per\u00FA" } - PF { "Polinesia Francesa" } - PG { "Pap\u00faa Nueva Guinea" } - PH { "Filipinas" } - PK { "Pakist\u00E1n" } - PL { "Polonia" } - //PR { "Puerto Rico" } - //PY { "Paraguay" } - RO { "Rumania" } - RU { "Rusia" } - SA { "Arabia Saud\u00ED" } - SD { "Sud\u00E1n" } - SE { "Suecia" } - SG { "Singapur" } - SI { "Eslovenia" } - SK { "Eslovaquia" } - SP { "Serbia" } - //SV { "El Salvador" } - SY { "Siria" } - TH { "Tailandia" } - TN { "T\u00FAnez" } - TR { "Turqu\u00EDa" } - TT { "Trinidad y Tabago" } - TW { "Taiw\u00E1n" } - UA { "Ucrania" } - UM { "Islas menores alejadas de Estados Unidos" } - US { "Estados Unidos" } - //UY { "Uruguay" } - //VE { "Venezuela" } - VG { "Islas V\u00edrgenes Brit\u00e1nicas" } - VI { "Islas V\u00EDrgenes de los Estados Unidos" } - ZA { "Sud\u00E1frica" } - ZW { "Zimbabue" } +/** + * ICU source: ../../../locale/icu/main/es.xml + */ +es{ + Countries{ + AD{"Andorra"} + AE{"Emiratos Árabes Unidos"} + AF{"Afganistán"} + AG{"Antigua y Barbuda"} + AI{"Anguila"} + AL{"Albania"} + AM{"Armenia"} + AN{"Antillas Neerlandesas"} + AO{"Angola"} + AQ{"Antártida"} + AR{"Argentina"} + AS{"Samoa Americana"} + AT{"Austria"} + AU{"Australia"} + AW{"Aruba"} + AZ{"Azerbaiyán"} + BA{"Bosnia-Herzegovina"} + BB{"Barbados"} + BD{"Bangladesh"} + BE{"Bélgica"} + BF{"Burkina Faso"} + BG{"Bulgaria"} + BH{"Bahráin"} + BI{"Burundi"} + BJ{"Benín"} + BM{"Bermudas"} + BN{"Brunéi"} + BO{"Bolivia"} + BR{"Brasil"} + BS{"Bahamas"} + BT{"Bután"} + BV{"Isla Bouvet"} + BW{"Botsuana"} + BY{"Bielorrusia"} + BZ{"Belice"} + CA{"Canadá"} + CC{"Islas Cocos (Keeling)"} + CD{"República Democrática del Congo"} + CF{"República Centroafricana"} + CG{"Congo"} + CH{"Suiza"} + CI{"Costa de Marfil"} + CK{"Islas Cook"} + CL{"Chile"} + CM{"Camerún"} + CN{"China"} + CO{"Colombia"} + CR{"Costa Rica"} + CU{"Cuba"} + CV{"Cabo Verde"} + CX{"Isla Navidad"} + CY{"Chipre"} + CZ{"República Checa"} + DE{"Alemania"} + DJ{"Yibuti"} + DK{"Dinamarca"} + DM{"Dominica"} + DO{"República Dominicana"} + DZ{"Argelia"} + EC{"Ecuador"} + EE{"Estonia"} + EG{"Egipto"} + EH{"Sáhara Occidental"} + ER{"Eritrea"} + ES{"España"} + ET{"Etiopía"} + FI{"Finlandia"} + FJ{"Fiyi"} + FK{"Islas Falkland (Malvinas)"} + FM{"Micronesia"} + FO{"Islas Feroe"} + FR{"Francia"} + GA{"Gabón"} + GB{"Reino Unido"} + GD{"Granada"} + GE{"Georgia"} + GF{"Guayana Francesa"} + GH{"Ghana"} + GI{"Gibraltar"} + GL{"Groenlandia"} + GM{"Gambia"} + GN{"Guinea"} + GP{"Guadalupe"} + GQ{"Guinea Ecuatorial"} + GR{"Grecia"} + GS{"Islas Georgia del Sur y Sandwich del Sur"} + GT{"Guatemala"} + GU{"Guam"} + GW{"Guinea-Bissau"} + GY{"Guyana"} + HK{"Hong-Kong, Región administrativa especial de China"} + HM{"Islas Heard y McDonald"} + HN{"Honduras"} + HR{"Croacia"} + HT{"Haití"} + HU{"Hungría"} + ID{"Indonesia"} + IE{"Irlanda"} + IL{"Israel"} + IN{"India"} + IO{"Territorios Británico del Océano Índico"} + IQ{"Iraq"} + IR{"Irán"} + IS{"Islandia"} + IT{"Italia"} + JM{"Jamaica"} + JO{"Jordania"} + JP{"Japón"} + KE{"Kenia"} + KG{"Kirguizistán"} + KH{"Camboya"} + KI{"Kiribati"} + KM{"Comoras"} + KN{"San Cristóbal y Nieves"} + KP{"Corea del Norte"} + KR{"Corea del Sur"} + KW{"Kuwait"} + KY{"Islas Caimán"} + KZ{"Kazajstán"} + LA{"Laos"} + LB{"Líbano"} + LC{"Saint Lucia"} + LI{"Liechtenstein"} + LK{"Sri Lanka"} + LR{"Liberia"} + LS{"Lesotho"} + LT{"Lituania"} + LU{"Luxemburgo"} + LV{"Letonia"} + LY{"Libia"} + MA{"Marruecos"} + MC{"Mónaco"} + MD{"Moldova"} + MG{"Madagascar"} + MH{"Islas Marshall"} + MK{"Macedonia"} + ML{"Malí"} + MM{"Myanmar"} + MN{"Mongolia"} + MO{"Macao, Región administrativa especial de China"} + MP{"Islas Marianas del Norte"} + MQ{"Martinica"} + MR{"Mauritania"} + MS{"Montserrat"} + MT{"Malta"} + MU{"Mauricio"} + MV{"Maldivas"} + MW{"Malawi"} + MX{"México"} + MY{"Malasia"} + MZ{"Mozambique"} + NA{"Namibia"} + NC{"Nueva Caledonia"} + NE{"Níger"} + NF{"Isla Norfolk"} + NG{"Nigeria"} + NI{"Nicaragua"} + NL{"Países Bajos"} + NO{"Noruega"} + NP{"Nepal"} + NR{"Nauru"} + NU{"Isla Niue"} + NZ{"Nueva Zelanda"} + OM{"Omán"} + PA{"Panamá"} + PE{"Perú"} + PF{"Polinesia Francesa"} + PG{"Papúa Nueva Guinea"} + PH{"Filipinas"} + PK{"Pakistán"} + PL{"Polonia"} + PM{"San Pedro y Miquelón"} + PN{"Pitcairn"} + PR{"Puerto Rico"} + PS{"Territorios Palestinos"} + PT{"Portugal"} + PW{"Palau"} + PY{"Paraguay"} + QA{"Qatar"} + RE{"Réunion"} + RO{"Rumanía"} + RU{"Rusia"} + RW{"Ruanda"} + SA{"Arabia Saudí"} + SB{"Islas Salomón"} + SC{"Seychelles"} + SD{"Sudán"} + SE{"Suecia"} + SG{"Singapur"} + SH{"Santa Elena"} + SI{"Eslovenia"} + SJ{"Svalbard y Jan Mayen"} + SK{"Eslovaquia"} + SL{"Sierra Leona"} + SM{"San Marino"} + SN{"Senegal"} + SO{"Somalia"} + SP{"Serbia"} + SR{"Suriname"} + ST{"Santo Tomé y Príncipe"} + SV{"El Salvador"} + SY{"Siria"} + SZ{"Suazilandia"} + TC{"Islas Turcas y Caicos"} + TD{"Chad"} + TF{"Territorios Australes Franceses"} + TG{"Togo"} + TH{"Tailandia"} + TJ{"Tayikistán"} + TK{"Islas Tokelau"} + TL{"Timor Oriental"} + TM{"Turkmenistán"} + TN{"Túnez"} + TO{"Tonga"} + TR{"Turquía"} + TT{"Trinidad y Tabago"} + TV{"Tuvalu"} + TW{"Taiwán"} + TZ{"Tanzania"} + UA{"Ucrania"} + UG{"Uganda"} + UM{"Islas menores alejadas de los Estados Unidos"} + US{"Estados Unidos"} + UY{"Uruguay"} + UZ{"Uzbekistán"} + VA{"Ciudad del Vaticano"} + VC{"San Vicente y las Granadinas"} + VE{"Venezuela"} + VG{"Islas Vírgenes Británicas"} + VI{"Islas Vírgenes de los Estados Unidos"} + VN{"Vietnam"} + VU{"Vanuatu"} + WF{"Wallis y Futuna"} + WS{"Samoa"} + YE{"Yemen"} + YT{"Mayotte"} + YU{"Yugoslavia"} + ZA{"Sudáfrica"} + ZM{"Zambia"} + ZW{"Zimbabue"} } - DateTimeElements:intvector { - 2, - 1, + Currencies{ + ADD{ + "ADD", + "diner andorrano", + } + ADP{ + "ADP", + "peseta andorrana", + } + AED{ + "AED", + "dirham de los Emiratos Árabes Unidos", + } + AFA{ + "AFA", + "afgani (1927-2002)", + } + AFN{ + "Af", + "afgani", + } + AIF{ + "AIF", + "franco de Affars e Issas", + } + ALK{ + "ALK", + "lek albanés (1946-1961)", + } + ALL{ + "lek", + "lek albanés", + } + ALV{ + "ALV", + "lek valute albanés", + } + ALX{ + "ALX", + "certificados de cambio albaneses en dólares", + } + AMD{ + "dram", + "dram armenio", + } + ANG{ + "NA f.", + "florín de las Antillas Neerlandesas", + } + AOA{ + "AOA", + "kwanza angoleño", + } + AOK{ + "AOK", + "kwanza angoleño (1977-1990)", + } + AON{ + "AON", + "nuevo kwanza angoleño (1990-2000)", + } + AOR{ + "AOR", + "kwanza reajustado angoleño (1995-1999)", + } + AOS{ + "AOS", + "escudo angoleño", + } + ARA{ + "ARA", + "austral argentino", + } + ARM{ + "ARM", + "peso moneda nacional argentino", + } + ARP{ + "ARP", + "peso argentino (1983-1985)", + } + ARS{ + "Arg$", + "peso argentino", + } + ATS{ + "ATS", + "chelín austriaco", + } + AUD{ + "$A", + "dólar australiano", + } + AUP{ + "AUP", + "libra australiana", + } + AWG{ + "AWG", + "florín de Aruba", + } + AZM{ + "AZM", + "manat azerí", + } + BAD{ + "BAD", + "dinar bosnio", + } + BAM{ + "KM", + "marco bosnio convertible", + } + BAN{ + "BAN", + "nuevo dinar bosnio", + } + BBD{ + "BDS$", + "dólar de Barbados", + } + BDT{ + "Tk", + "taka de Bangladesh", + } + BEC{ + "BEC", + "franco belga (convertible)", + } + BEF{ + "BF", + "franco belga", + } + BEL{ + "BEL", + "franco belga (financiero)", + } + BGL{ + "lev", + "lev fuerte búlgaro", + } + BGM{ + "BGM", + "lev socialista búlgaro", + } + BGN{ + "BGN", + "nuevo lev búlgaro", + } + BGO{ + "BGO", + "lev búlgaro (1879-1952)", + } + BGX{ + "BGX", + "certificados de cambio búlgaros en leva", + } + BHD{ + "BD", + "dinar bahreiní", + } + BIF{ + "Fbu", + "franco de Burundi", + } + BMD{ + "Ber$", + "dólar de Bermudas", + } + BMP{ + "BMP", + "libra de Bermudas", + } + BND{ + "BND", + "dólar de Brunéi", + } + BOB{ + "Bs", + "boliviano", + } + BOL{ + "BOL", + "boliviano (1863-1962)", + } + BOP{ + "BOP", + "peso boliviano", + } + BOV{ + "BOV", + "MVDOL boliviano", + } + BRB{ + "BRB", + "nuevo cruceiro brasileño (1967-1986)", + } + BRC{ + "BRC", + "cruzado brasileño", + } + BRE{ + "BRE", + "cruceiro brasileño (1990-1993)", + } + BRL{ + "R$", + "real brasileño", + } + BRN{ + "BRN", + "nuevo cruzado brasileño", + } + BRR{ + "BRR", + "cruceiro brasileño", + } + BRZ{ + "BRZ", + "cruceiro brasileño (1942-1967)", + } + BSD{ + "BSD", + "dólar de las Bahamas", + } + BSP{ + "BSP", + "libra de las Bahamas", + } + BTN{ + "Nu", + "ngultrum butanés", + } + BTR{ + "BTR", + "rupia butanesa", + } + BUK{ + "BUK", + "kyat birmano", + } + BUR{ + "BUR", + "rupia birmana", + } + BWP{ + "BWP", + "pula botsuano", + } + BYB{ + "BYB", + "nuevo rublo bielorruso (1994-1999)", + } + BYL{ + "BYL", + "rublo bielorruso (1992-1994)", + } + BYR{ + "Rbl", + "rublo bielorruso", + } + BZD{ + "BZ$", + "dólar de Belice", + } + BZH{ + "BZH", + "dólar de Honduras Británica", + } + CAD{ + "Can$", + "dólar canadiense", + } + CDF{ + "CDF", + "franco congoleño", + } + CDG{ + "CDG", + "franco de la República del Congo", + } + CDL{ + "CDL", + "zaire congoleño", + } + CFF{ + "CFF", + "franco CFA de la República Centroafricana", + } + CHF{ + "SwF", + "franco suizo", + } + CKD{ + "CKD", + "dólar de las Islas Cook", + } + CLC{ + "CLC", + "cóndor chileno", + } + CLE{ + "CLE", + "escudo chileno", + } + CLF{ + "CLF", + "unidad de fomento chilena", + } + CLP{ + "Ch$", + "peso chileno", + } + CMF{ + "CMF", + "franco CFA de Camerún", + } + CNP{ + "CNP", + "jen min piao yuan chino", + } + CNX{ + "CNX", + "certificados de cambio chinos en dólares estadounidenses", + } + CNY{ + "Y", + "yuan renminbi chino", + } + COB{ + "COB", + "peso de papel colombiano", + } + COF{ + "COF", + "franco CFA del Congo", + } + COP{ + "Col$", + "peso colombiano", + } + CRC{ + "C", + "colón costarricense", + } + CSC{ + "CSC", + "corona checoslovaca", + } + CSK{ + "CSK", + "corona fuerte checoslovaca", + } + CUP{ + "CUP", + "peso cubano", + } + CUX{ + "CUX", + "certificados de cambio cubanos", + } + CVE{ + "CVEsc", + "escudo de Cabo Verde", + } + CWG{ + "CWG", + "florín de Curazao", + } + CYP{ + "£C", + "libra chipriota", + } + CZK{ + "CZK", + "corona checa", + } + DDM{ + "DDM", + "ostmark de Alemania del Este", + } + DEM{ + "DEM", + "marco alemán", + } + DES{ + "DES", + "sperrmark alemán", + } + DJF{ + "DF", + "franco de Yibuti", + } + DKK{ + "DKr", + "corona danesa", + } + DOP{ + "RD$", + "peso dominicano", + } + DZD{ + "DA", + "dinar argelino", + } + DZF{ + "DZF", + "nuevo franco argelino", + } + DZG{ + "DZG", + "franco germinal argelino", + } + ECS{ + "ECS", + "sucre ecuatoriano", + } + ECV{ + "ECV", + "unidad de valor constante (UVC) ecuatoriana", + } + EEK{ + "EEK", + "corona estonia", + } + EGP{ + "EGP", + "libra egipcia", + } + ERN{ + "ERN", + "nakfa eritreo", + } + ESP{ + "₧", + "peseta española", + } + ETB{ + "Br", + "birr etíope", + } + ETD{ + "ETD", + "dólar etíope", + } + EUR{ + "€", + "euro", + } + FIM{ + "FIM", + "marco finlandés", + } + FIN{ + "FIN", + "marco finlandés (1860-1962)", + } + FJD{ + "F$", + "dólar de las Islas Fiyi", + } + FJP{ + "FJP", + "libra de las Islas Fiyi", + } + FKP{ + "FKP", + "libra de las Islas Malvinas", + } + FOK{ + "FOK", + "corona de las Islas Feroe", + } + FRF{ + "FRF", + "franco francés", + } + FRG{ + "FRG", + "franco germinal/franco Poincaré francés", + } + GAF{ + "GAF", + "franco CFA de Gabón", + } + GBP{ + "£", + "libra esterlina británica", + } + GEK{ + "GEK", + "kupon larit georgiano", + } + GEL{ + "lari", + "lari georgiano", + } + GHC{ + "GHC", + "cedi ghanés", + } + GHO{ + "GHO", + "antiguo cedi ghanés", + } + GHP{ + "GHP", + "libra ghanesa", + } + GHR{ + "GHR", + "cedi revaluado ghanés", + } + GIP{ + "GIP", + "libra de Gibraltar", + } + GLK{ + "GLK", + "corona de Groenlandia", + } + GMD{ + "GMD", + "dalasi gambiano", + } + GMP{ + "GMP", + "libra gambiana", + } + GNF{ + "GF", + "franco guineo", + } + GNI{ + "GNI", + "franco guineo (1960-1972)", + } + GNS{ + "GNS", + "syli guineano", + } + GPF{ + "GPF", + "franco de Guadalupe", + } + GQE{ + "GQE", + "ekuele de Guinea Ecuatorial", + } + GQF{ + "GQF", + "franco de Guinea Ecuatorial", + } + GQP{ + "GQP", + "peseta guineana de Guinea Ecuatorial", + } + GRD{ + "GRD", + "dracma griego", + } + GRN{ + "GRN", + "nuevo dracma griego", + } + GTQ{ + "Q", + "quetzal guatemalteco", + } + GUF{ + "GUF", + "franco guayanés de la Guayana Francesa", + } + GWE{ + "GWE", + "escudo de Guinea Portuguesa", + } + GWM{ + "GWM", + "mil reis de Guinea Portuguesa", + } + GWP{ + "GWP", + "peso de Guinea-Bissáu", + } + GYD{ + "G$", + "dólar guyanés", + } + HKD{ + "HK$", + "dólar de Hong Kong", + } + HNL{ + "L", + "lempira hondureño", + } + HRD{ + "HRD", + "dinar croata", + } + HRK{ + "HRK", + "kuna croata", + } + HTG{ + "HTG", + "gourde haitiano", + } + HUF{ + "Ft", + "forinto húngaro", + } + IBP{ + "IBP", + "libra de Irlanda del Norte", + } + IDG{ + "IDG", + "florín Nica indonesio", + } + IDJ{ + "IDJ", + "rupia Java indonesia", + } + IDN{ + "IDN", + "nueva rupia indonesia", + } + IDR{ + "Rp", + "rupia indonesia", + } + IEP{ + "IR£", + "libra irlandesa", + } + ILL{ + "ILL", + "sheqel israelí", + } + ILP{ + "ILP", + "libra israelí", + } + ILS{ + "ILS", + "nuevo sheqel israelí", + } + IMP{ + "IMP", + "libra esterlina de la Isla de Man", + } + INR{ + "=0#Rs.|1#Re.|1>;\n" - "x.x: << punto >>;\n" - // words for values from 0 to 19 - "cero; uno; dos; tres; cuatro; cinco; seis; siete; ocho; nueve;\n" - "diez; once; doce; trece; catorce; quince; diecis\u00e9is;\n" - " diecisiete; dieciocho; diecinueve;\n" - // words for values from 20 to 29 (necessary because the ones digit - // often picks up an accent mark it doesn't have when standing alone) - "veinte; veintiuno; veintid\u00f3s; veintitr\u00e9s; veinticuatro;\n" - " veinticinco; veintis\u00e9is; veintisiete; veintiocho;\n" - " veintinueve;\n" - // words for multiples of 10 (notice that the tens digit is separated - // from the ones digit by the word "y".) - "30: treinta[ y >>];\n" - "40: cuarenta[ y >>];\n" - "50: cincuenta[ y >>];\n" - "60: sesenta[ y >>];\n" - "70: setenta[ y >>];\n" - "80: ochenta[ y >>];\n" - "90: noventa[ y >>];\n" - // 100 by itself is "cien," but 100 followed by something is "cineto" - "100: cien;\n" - "101: ciento >>;\n" - // words for multiples of 100 (must be stated because they're - // rarely simple concatenations) - "200: doscientos[ >>];\n" - "300: trescientos[ >>];\n" - "400: cuatrocientos[ >>];\n" - "500: quinientos[ >>];\n" - "600: seiscientos[ >>];\n" - "700: setecientos[ >>];\n" - "800: ochocientos[ >>];\n" - "900: novecientos[ >>];\n" - // for 1,000, the multiplier on "mil" is omitted: 2,000 is "dos mil," - // but 1,000 is just "mil." - "1000: mil[ >>];\n" - "2000: << mil[ >>];\n" - // 1,000,000 is "un millon," not "uno millon" - "1,000,000: un mill\u00f3n[ >>];\n" - "2,000,000: << mill\u00f3n[ >>];\n" - // overflow rule - "1,000,000,000: =#,##0= (incomplete data);" - } - - // Currency display names - Currencies { - ADP { "ADP", "Peseta Andorrana" } - AED { "AED", "Dirham de los Emiratos \u00C1rabes Unidos" } - AFA { "AFA", "Afghani" } - ALL { "ALL", "Lek Alban\u00E9s" } - AMD { "AMD", "Dram Armenio" } - ANG { "ANG", "Guilder de India Occidental" } - AOK { "AOK", "Kwanza Angol\u00E9s" } - ARA { "ARA", "Austral Argentino" } - ARS { "ARS", "Peso Argentino" } - ATS { "ATS", "Chel\u00EDn Austriaco" } - AUD { "AUD", "D\u00F3lar Australiano" } - AWG { "AWG", "Guilder de Aruba" } - AZM { "AZM", "Manat de Azerbaijan" } - BAD { "BAD", "Dinar de Bosnia-Herzogovinia" } - BBD { "BBD", "D\u00F3lar de Barbados" } - BDT { "BDT", "Taka de Bangladesh" } - BEF { "BEF", "Franco Belga" } - BGL { "BGL", "Lev Bulgaro" } - BHD { "BHD", "Dinar de Barein" } - BIF { "BIF", "Franco de Burundi" } - BMD { "BMD", "D\u00F3lar de Bermudas" } - BND { "BND", "D\u00F3lar de Brunei" } - BOB { "$b", "Boliviano de Bolivia" } - BRL { "BRL", "Real de Brazil" } - BSD { "BSD", "D\u00F3lar de Bahamas" } - BWP { "BWP", "Pula de Botswana" } - BYR { "BYR", "Rublo de Belorusia" } - BZD { "BZD", "D\u00F3lar de Belize" } - CAD { "CAD", "D\u00F3lar Canadiense" } - CHF { "CHF", "Franco Suizo" } - CLP { "CLP", "Peso Chileno" } - COP { "COP", "Peso de Colombia" } - CRC { "CRC", "Colon de Costa Rica" } - CUP { "CUP", "Peso Cubano" } - CVE { "CVE", "Escudo de Cabo Verde" } - CYP { "CYP", "Libra de Chipre" } - CZK { "CZK", "Krona Checa" } - DEM { "DEM", "Marco Alem\u00E1n" } - DJF { "DJF", "Franco de Djibouti" } - DKK { "DKK", "Corona Danesa" } - DOP { "RD$", "Peso Dominicano" } - // DRP { "DRP", "Peso de la Rep\u00FAblica Dominicana" } -- invalid - DZD { "DZD", "Dinar de Algeria" } - ECS { "S/.", "Sucre de Ecuador" } - // ECU { "ECU", "Moenda \u00DAnica Europea (EURO)" } -- invalid - EEK { "EEK", "Corona de Estonia" } - EGP { "EGP", "Libra Egipcia" } - ESP { "\u20A7", "Peseta Espa\u00F1ola" } - ETB { "ETB", "Birr de Etiop\u00EDa" } - EUR { "\u20AC", "Moneda de los estados miembros de EMU" } - FIM { "FIM", "Marco Finland\u00E9s" } - FJD { "FJD", "D\u00F3lar de Fiji" } - FKP { "FKP", "Libra de Falkland" } - FRF { "FRF", "Franco Franc\u00E9s" } - GBP { "\u00A3", "Libra Brit\u00E1nica" } - GEK { "GEK", "Kupon de Georgia" } - GHC { "GHC", "Cedi de Ghana" } - GIP { "GIP", "Libra de Gibraltar" } - GMD { "GMD", "Dalasi de Gambia" } - GNF { "GNF", "Franco de Guinea" } - GRD { "GRD", "Dracma Griego" } - GTQ { "Q", "Quedzal de Guatemala" } - GWP { "GWP", "Peso de Guinea" } - GYD { "GYD", "D\u00F3lar Guayan\u00E9s" } - HKD { "HKD", "D\u00F3lar de Hong Kong" } - HNL { "L.", "Lempira de Honduras" } - HRD { "HRD", "Dinar de Croacia" } - HTG { "HTG", "Gourde de Haiti" } - HUF { "HUF", "Flor\u00EDn H\u00FAngaro" } - IDR { "IDR", "Rupia Indonesia" } - IEP { "IEP", "Libra Irlandesa" } - ILS { "ILS", "Scheckel Israel\u00ED" } - INR { "=0#Rs.|1#Re.|1 source: ../../../locale/icu/main/et.xml + */ +et{ + Countries{ + AD{"Andorra"} + AE{"Araabia Ühendemiraadid"} + AF{"Afganistan"} + AG{"Antigua ja Barbuda"} + AI{"Anguilla"} + AL{"Albaania"} + AM{"Armeenia"} + AN{"Hollandi Antillid"} + AO{"Angola"} + AQ{"Antarktika"} + AR{"Argentina"} + AS{"Ameerika Samoa"} + AT{"Austria"} + AU{"Austraalia"} + AW{"Aruba"} + AZ{"AserbaidĪaan"} + BA{"Bosnia ja Hertsegoviina"} + BB{"Barbados"} + BD{"Bangladesh"} + BE{"Belgia"} + BF{"Burkina Faso"} + BG{"Bulgaaria"} + BH{"Bahrein"} + BI{"Burundi"} + BJ{"Benin"} + BM{"Bermuda"} + BN{"Brunei"} + BO{"Boliivia"} + BR{"Brasiilia"} + BS{"Bahama saared"} + BT{"Bhutan"} + BV{"Bouvet’ saar"} + BW{"Botswana"} + BY{"Valgevene"} + BZ{"Belize"} + CA{"Kanada"} + CC{"Kookossaared"} + CD{"Kongo DV"} + CF{"Kesk-Aafrika Vabariik"} + CG{"Kongo"} + CH{"Ĩveits"} + CI{"Cote d’Ivoire"} + CK{"Cooki saared"} + CL{"Tiiili"} + CM{"Kamerun"} + CN{"Hiina"} + CO{"Colombia"} + CR{"Costa Rica"} + CU{"Kuuba"} + CV{"Cabo Verde"} + CX{"Jõulusaar"} + CY{"Küpros"} + CZ{"Tiehhi Vabariik"} + DE{"Saksamaa"} + DJ{"Djibouti"} + DK{"Taani"} + DM{"Dominica"} + DO{"Dominikaani Vabariik"} + DZ{"AlĪeeria"} + EC{"Ecuador"} + EE{"Eesti"} + EG{"Egiptus"} + EH{"Lääne-Sahara"} + ER{"Eritrea"} + ES{"Hispaania"} + ET{"Etioopia"} + FI{"Soome"} + FJ{"FidĪi"} + FK{"Falklandi saared"} + FM{"Mikroneesia Liiduriigid"} + FO{"Fääri saared"} + FR{"Prantsusmaa"} + GA{"Gabon"} + GB{"Ühendkuningriik"} + GD{"Grenada"} + GE{"Gruusia"} + GF{"Prantsuse Guajaana"} + GH{"Ghana"} + GI{"Gibraltar"} + GL{"Gröönimaa"} + GM{"Gambia"} + GN{"Guinea"} + GP{"Guadeloupe"} + GQ{"Ekvatoriaal-Guinea"} + GR{"Kreeka"} + GS{"Lõuna-Georgia ja Lõuna-Sandwichi saared"} + GT{"Guatemala"} + GU{"Guam"} + GW{"Guinea-Bissau"} + GY{"Guyana"} + HK{"Hongkongi erihalduspiirkond"} + HM{"Heard ja McDonald"} + HN{"Honduras"} + HR{"Horvaatia"} + HT{"Haiti"} + HU{"Ungari"} + ID{"Indoneesia"} + IE{"Iirimaa"} + IL{"Iisrael"} + IN{"India"} + IO{"Briti India ookeani ala"} + IQ{"Iraak"} + IR{"Iraan"} + IS{"Island"} + IT{"Itaalia"} + JM{"Jamaica"} + JO{"Jordaania"} + JP{"Jaapan"} + KE{"Kenya"} + KG{"Kõrgõzstan"} + KH{"KambodĪa"} + KI{"Kiribati"} + KM{"Komoorid"} + KN{"Saint Kitts ja Nevis"} + KP{"Põhja-Korea"} + KR{"Lõuna-Korea"} + KW{"Kuveit"} + KY{"Kaimani saared"} + KZ{"Kasahstan"} + LA{"Laose DRV"} + LB{"Liibanon"} + LC{"Saint Lucia"} + LI{"Liechtenstein"} + LK{"Sri Lanka"} + LR{"Libeeria"} + LS{"Lesotho"} + LT{"Leedu"} + LU{"Luksemburg"} + LV{"Läti"} + LY{"Liibüa"} + MA{"Maroko"} + MC{"Monaco"} + MD{"Moldova"} + MG{"Madagaskar"} + MH{"Marshalli Saared"} + MK{"Makedoonia Vabariik"} + ML{"Mali"} + MM{"Myanmar"} + MN{"Mongoolia"} + MO{"Aomeni Hiina erihalduspiirkond"} + MP{"Põhja-Mariaanid"} + MQ{"Martinique"} + MR{"Mauritaania"} + MS{"Montserrat"} + MT{"Malta"} + MU{"Mauritius"} + MV{"Maldiivid"} + MW{"Malawi"} + MX{"Mehhiko"} + MY{"Malaisia"} + MZ{"Mosambiik"} + NA{"Namiibia"} + NC{"Uus-Kaledoonia"} + NE{"Niger"} + NF{"Norfolk"} + NG{"Nigeeria"} + NI{"Nicaragua"} + NL{"Holland"} + NO{"Norra"} + NP{"Nepal"} + NR{"Nauru"} + NU{"Niue"} + NZ{"Uus-Meremaa"} + OM{"Omaan"} + PA{"Panama"} + PE{"Peruu"} + PF{"Prantsuse Polüneesia"} + PG{"Paapua Uus-Guinea"} + PH{"Filipiinid"} + PK{"Pakistan"} + PL{"Poola"} + PM{"Saint-Pierre ja Miquelon"} + PN{"Pitcairn"} + PR{"Puerto Rico"} + PS{"Palestiina Omavalitsus"} + PT{"Portugal"} + PW{"Belau"} + PY{"Paraguay"} + QA{"Katar"} + RE{"Réunion"} + RO{"Rumeenia"} + RU{"Venemaa"} + RW{"Rwanda"} + SA{"Saudi Araabia"} + SB{"Saalomoni Saared"} + SC{"Seiiellid"} + SD{"Sudaan"} + SE{"Rootsi"} + SG{"Singapur"} + SH{"Saint Helena"} + SI{"Sloveenia"} + SJ{"Svalbard ja Jan Mayen"} + SK{"Slovakkia"} + SL{"Sierra Leone"} + SM{"San Marino"} + SN{"Senegal"} + SO{"Somaalia"} + SP{"Serbia"} + SR{"Suriname"} + ST{"Sao Tomé ja Principe"} + SV{"El Salvador"} + SY{"Süüria"} + SZ{"Svaasimaa"} + TC{"Turks ja Caicos"} + TD{"Tiaad"} + TF{"Prantsuse Lõunaalad"} + TG{"Togo"} + TH{"Tai"} + TJ{"TadĪikistan"} + TK{"Tokelau"} + TL{"Ida-Timor"} + TM{"Türkmenistan"} + TN{"Tuneesia"} + TO{"Tonga"} + TR{"Türgi"} + TT{"Trinidad ja Tobago"} + TV{"Tuvalu"} + TW{"Taiwan"} + TZ{"Tansaania"} + UA{"Ukraina"} + UG{"Uganda"} + UM{"Ühendriikide hajasaared"} + US{"Ameerika Ühendriigid"} + UY{"Uruguay"} + UZ{"Usbekistan"} + VA{"Püha Tool (Vatikan)"} + VC{"Saint Vincent ja Grenadiinid"} + VE{"Venezuela"} + VG{"Briti Neitsisaared"} + VI{"USA Neitsisaared"} + VN{"Vietnam"} + VU{"Vanuatu"} + WF{"Wallis ja Futuna"} + WS{"Samoa"} + YE{"Jeemen"} + YT{"Mayotte"} + YU{"Jugoslaavia"} + ZA{"Lõuna-Aafrika Vabariik"} + ZM{"Sambia"} + ZW{"Zimbabwe"} } - Languages { - et { "Eesti" } + Currencies{ + EEK{ + "kr", + "EEK", + } } - LocaleID:int { 0x25 } -// LocaleString { "et" } - MonthAbbreviations { - "jaan.", - "veebr.", - "m\u00E4rts", - "apr.", - "mai", - "juuni", - "juuli", - "aug.", - "sept.", - "okt.", - "nov.", - "dets.", + ExemplarCharacters{"[a-z õ ä ö ü š ž]"} + Languages{ + ar{"Araabia"} + bg{"Bulgaaria"} + cs{"Tiehhi"} + da{"Taani"} + de{"Saksa"} + el{"Kreeka"} + en{"Inglise"} + es{"Hispaania"} + et{"Eesti"} + fi{"Soome"} + fr{"Prantsuse"} + he{"Heebrea"} + hr{"Horvaadi"} + hu{"Ungari"} + it{"Itaalia"} + ja{"Jaapani"} + ko{"Korea"} + lt{"Leedu"} + lv{"Läti"} + nl{"Hollandi"} + no{"Norra"} + pl{"Poola"} + pt{"Portugali"} + ro{"Rumeenia"} + ru{"Vene"} + sk{"Slovaki"} + sl{"Sloveeni"} + sv{"Rootsi"} + tr{"Türgi"} + zh{"Hiina"} } - MonthNames { - "jaanuar", - "veebruar", - "m\u00E4rts", - "aprill", - "mai", - "juuni", - "juuli", - "august", - "september", - "oktoober", - "november", - "detsember", + LocaleScript{ + "Latn", } - NumberElements { + NumberElements{ ",", - "\u00A0", + " ", ";", "%", "0", "#", "-", "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", + "‰", + "∞", + "�", + "+", } -// ShortLanguage { "est" } - localPatternChars { "GanjkHmsSEDFwWxhKzAe" } - zoneStrings { - { - "Africa/Casablanca", - "GMT", - "GMT", - "GMT", - "GMT", + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "H:mm:ss z", + "H:mm:ss z", + "H:mm:ss", + "H:mm", + "EEEE, d, MMMM yyyy", + "d MMMM yyyy", + "dd.MM.yyyy", + "dd.MM.yy", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "P", + "E", + "T", + "K", + "N", + "R", + "L", + } + wide{ + "pühapäev", + "esmaspäev", + "teisipäev", + "kolmapäev", + "neljapäev", + "reede", + "laupäev", + } + } + } + eras{ + abbreviated{ + "e.m.a.", + "m.a.j.", + } + } + monthNames{ + format{ + abbreviated{ + "jaan", + "veebr", + "märts", + "apr", + "mai", + "juuni", + "juuli", + "aug", + "sept", + "okt", + "nov", + "dets", + } + wide{ + "jaanuar", + "veebruar", + "märts", + "aprill", + "mai", + "juuni", + "juuli", + "august", + "september", + "oktoober", + "november", + "detsember", + } + } + } } } -// LocaleScript{ -// "Latn", // ISO 15924 Name -// } - ExemplarCharacters { "[a-z \u00f5 \u00e4 \u00f6 \u00fc \u0161 \u017e]" } - - // Currency display names - Currencies { - EEK { "kr", "EEK" } - } + localPatternChars{"GanjkHmsSEDFwWxhKzAeugXZ"} } diff --git a/icuSources/data/locales/et_EE.txt b/icuSources/data/locales/et_EE.txt index 8e984408..b726b0de 100644 --- a/icuSources/data/locales/et_EE.txt +++ b/icuSources/data/locales/et_EE.txt @@ -1,19 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/et_EE.xml // * // *************************************************************************** - -et_EE { - Version{ "2.0" } -// LocaleString { "et_EE" } - NumberPatterns { +et_EE{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "#,##0.00 \u00A4;-#,##0.00 \u00A4", + "#,##0.00 ¤;-#,##0.00 ¤", "#,##0%", "#E0", } -// ShortCountry { "EST" } - LocaleID:int { 0x0425 } + Version{"1.2"} } diff --git a/icuSources/data/locales/eu.txt b/icuSources/data/locales/eu.txt index 5e82f134..8427338e 100644 --- a/icuSources/data/locales/eu.txt +++ b/icuSources/data/locales/eu.txt @@ -1,62 +1,145 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/eu.xml // * // *************************************************************************** - -eu { - Version { "2.0" } - Languages { - eu { "euskara" } - } - DayAbbreviations { - "ig", - "al", - "as", - "az", - "og", - "or", - "lr", +/** + * ICU source: ../../../locale/icu/main/eu.xml + */ +eu{ + Countries{ + AE{"Arabiar Emirrerri Batuak"} + AF{"Afganistan"} + AG{"Antigua eta Barbuda"} + AQ{"Antartika"} + BA{"Bosnia-Herzegovina"} + BE{"Belgika"} + BO{"Bolibia"} + BR{"Brasil"} + BS{"Bahamak"} + BY{"Bielorrusia"} + CA{"Kanada"} + CF{"Afrika Erdiko Errepublika"} + CG{"Kongo"} + CH{"Suitza"} + CI{"Boli Kosta"} + CL{"Txile"} + CM{"Kamerun"} + CN{"Txina"} + CO{"Kolonbia"} + CU{"Kuba"} + CV{"Cabo Verde"} + CY{"Zipre"} + CZ{"Txekiar errepublika"} + DE{"Alemania"} + DJ{"Djibuti"} + DK{"Danimarka"} + DM{"Dominika"} + DO{"Dominikar Errepublika"} + DZ{"Aljeria"} + EC{"Ekuador"} + EG{"Egipto"} + EH{"Mendebaldeko Sahara"} + ES{"Espainia"} + ET{"Etiopia"} + FI{"Finlandia"} + FM{"Mikronesia"} + FR{"Frantzia"} + GN{"Ginea"} + GQ{"Ekuatore Ginea"} + GR{"Grezia"} + GW{"Ginea-Bissau"} + HR{"Kroazia"} + HU{"Hungaria"} + IE{"Irlanda"} + IQ{"Irak"} + IS{"Islandia"} + IT{"Italia"} + JM{"Jamaika"} + JO{"Jordania"} + JP{"Japonia"} + KE{"Kenia"} + KG{"Kirgizistan"} + KH{"Kanbodia"} + KM{"Komoreak"} + KN{"Saint Kitts eta Nevis"} + KP{"Ipar Korea"} + KR{"Hego Korea"} + LB{"Libano"} + LC{"Santa Luzia"} + LT{"Lituania"} + LU{"Luxenburgo"} + LV{"Letonia"} + LY{"Libia"} + MA{"Maroko"} + MC{"Monako"} + MD{"Moldavia"} + MG{"Madagaskar"} + MH{"Marshall uharteak"} + MK{"Mazedonia"} + MU{"Maurizio"} + MV{"Maldivak"} + MX{"Mexiko"} + MY{"Malasia"} + MZ{"Mozambike"} + NI{"Nikaragua"} + NL{"Herbehereak"} + NO{"Norvegia"} + NZ{"Zeelanda Berria"} + PG{"Papua Ginea Berria"} + PH{"Filipinak"} + PL{"Polonia"} + PY{"Paraguai"} + QA{"Katar"} + RO{"Errumania"} + RU{"Errusia"} + RW{"Ruanda"} + SB{"Salomon uharteak"} + SC{"Seychelleak"} + SE{"Suedia"} + SG{"Singapur"} + SI{"Eslovenia"} + SK{"Eslovakia"} + SL{"Sierra Leona"} + SP{"Serbia"} + SR{"Surinam"} + ST{"Sao Tomé eta Principe"} + SY{"Siria"} + SZ{"Swazilandia"} + TD{"Txad"} + TH{"Tailandia"} + TJ{"Tadjikistan"} + TR{"Turkia"} + TT{"Trinidad eta Tobago"} + UA{"Ukraina"} + US{"Ameriketako Estatu Batuak"} + UY{"Uruguai"} + VA{"Vatikano"} + VC{"Saint Vincent eta Grenadinak"} + ZA{"Hegoafrika"} } - DayNames { - "igandea", - "astelehena", - "asteartea", - "asteazkena", - "osteguna", - "ostirala", - "larunbata", + Currencies{ + ESP{ + "₧", + "ESP", + { + "¤ #,##0;-¤ #,##0", + ",", + ".", + } + } } - MonthAbbreviations { - "urt", - "ots", - "mar", - "api", - "mai", - "eka", - "uzt", - "abu", - "ira", - "urr", - "aza", - "abe", + ExemplarCharacters{"[a-zñç]"} + Languages{ + eu{"euskara"} } - MonthNames { - "urtarrila", - "otsaila", - "martxoa", - "apirila", - "maiatza", - "ekaina", - "uztaila", - "abuztua", - "iraila", - "urria", - "azaroa", - "abendua", + LocaleScript{ + "Latn", } - NumberElements { + NumberElements{ ",", ".", ";", @@ -65,28 +148,68 @@ eu { "#", "-", "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", + "‰", + "∞", + "�", + "+", } - LocaleID:int { 0x2D } -// LocaleScript{ -// "Latn", // ISO 15924 Name -// } - ExemplarCharacters { "[a-z \u00f1 \u00e7]" } - - // /**************** Info Below is needed ****************/ - // CollationElements{} - // Countries{} - // Eras{} - // Languages{} - // ShortLanguage { } - // localPatternChars{} - // - - // Currency display names - Currencies { - ESP { "\u20A7", "ESP" } + Version{"1.2"} + calendar{ + gregorian{ + dayNames{ + format{ + abbreviated{ + "ig", + "al", + "as", + "az", + "og", + "or", + "lr", + } + wide{ + "igandea", + "astelehena", + "asteartea", + "asteazkena", + "osteguna", + "ostirala", + "larunbata", + } + } + } + monthNames{ + format{ + abbreviated{ + "urt", + "ots", + "mar", + "api", + "mai", + "eka", + "uzt", + "abu", + "ira", + "urr", + "aza", + "abe", + } + wide{ + "urtarrila", + "otsaila", + "martxoa", + "apirila", + "maiatza", + "ekaina", + "uztaila", + "abuztua", + "iraila", + "urria", + "azaroa", + "abendua", + } + } + } + } } } diff --git a/icuSources/data/locales/eu_ES.txt b/icuSources/data/locales/eu_ES.txt index d5f1a4e4..3f1510e2 100644 --- a/icuSources/data/locales/eu_ES.txt +++ b/icuSources/data/locales/eu_ES.txt @@ -1,32 +1,36 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/eu_ES.xml // * // *************************************************************************** - -eu_ES { - Version { "2.0" } - DateTimeElements:intvector { - 2, - 1, - } - DateTimePatterns { - "HH:mm:ss z", - "HH:mm:ss z", - "HH:mm:ss", - "HH:mm", - "EEEE, yyyy'eko' MMMM'ren' dd'a'", - "EEE, yyyy'eko' MMM'ren' dd'a'", - "yy'-'MMM'-'dd", - "yy'-'MM'-'dd", - "{1} {0}", - } - NumberPatterns { +eu_ES{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "#,##0.00 \u00A4;-#,##0.00 \u00A4", + "#,##0.00 ¤;-#,##0.00 ¤", "#,##0%", "#E0", } - LocaleID:int { 0x042D } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "HH:mm:ss z", + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm", + "EEEE, yyyy'eko' MMMM'ren' dd'a'", + "EEE, yyyy'eko' MMM'ren' dd'a'", + "yy'-'MMM'-'dd", + "yy'-'MM'-'dd", + "{1} {0}", + } + } + } } diff --git a/icuSources/data/locales/eu_ES_PREEURO.txt b/icuSources/data/locales/eu_ES_PREEURO.txt deleted file mode 100644 index fe2bd56d..00000000 --- a/icuSources/data/locales/eu_ES_PREEURO.txt +++ /dev/null @@ -1,16 +0,0 @@ -// *************************************************************************** -// * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -eu_ES_PREEURO { - Version { "2.0" } - NumberPatterns { - "#,#0.##;-#,#0.##", - "\u00a4 #,##0;-\u00a4 #,##0", - "#,#0%", - "#E0", - } -} diff --git a/icuSources/data/locales/fa.txt b/icuSources/data/locales/fa.txt index 5d877a8a..ec79380d 100644 --- a/icuSources/data/locales/fa.txt +++ b/icuSources/data/locales/fa.txt @@ -1,722 +1,599 @@ -// *************************************************************************** -// * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -// Created by Roozbeh Pournader - -fa { - Version { "3.0" } - AmPmMarkers { - "\u0642.\u0638.", - "\u0628.\u0638.", - } - CollationElements { - Version { "2.0" } - Sequence { "[normalization on]" - "&\u064e<<\u0650<<\u064f<<\u064b<<\u064d<<\u064c" - "&\u0622 <\u0627<<\u0671<\u0621<<\u0623<<\u0672<<\u0625" - "<<\u0673<<\u0624<<\u06cc\u0654<<<\u0649\u0654<<<\u0626" - "&\u06a9<<\u06aa<<\u06ab<<\u0643<<\u06ac<<\u06ad<<\u06ae" - "&\u06cf <\u0647<<\u06d5<<\u06c1<<\u0629<<\u06c3<<\u06c0<<\u06be" - "&\u06cc<<\u0649<<\u06d2<<\u064a<<\u06d0<<\u06d1<<\u06cd<<\u06ce" - } - } - LocaleScript:array { - "Arab" // ISO 15924 Name - } - DateTimePatterns { - "HH:mm:ss (z)", - "HH:mm:ss (z)", - "HH:mm:ss", - "HH:mm", - "EEEE\u060c d MMMM yyyy", - "d MMMM yyyy", - "yyyy/MM/d", - "yyyy/MM/d", - "{1} {0}", - } - ExemplarCharacters{"[\u0621-\u0624\u0626-\u063a\u0641\u0642\u0644-\u0648\u064b-\u0652\u0654\u0670\u067e\u0686\u0698\u06a9\u06af\u06cc\u200c\u200d\u200f\u200e]"} - DayAbbreviations { - "\u06cc.", - "\u062f.", - "\u0633.", - "\u0686.", - "\u067e.", - "\u062c.", - "\u0634.", - } - DayNames { - "\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647", - "\u062f\u0648\u0634\u0646\u0628\u0647", - "\u0633\u0647\u200c\u0634\u0646\u0628\u0647", - "\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647", - "\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647", - "\u062c\u0645\u0639\u0647", - "\u0634\u0646\u0628\u0647", - } - MonthAbbreviations { - "\u0698\u0627\u0646", - "\u0641\u0648\u0631", - "\u0645\u0627\u0631", - "\u0622\u0648\u0631", - "\u0645\u0640\u0647", - "\u0698\u0648\u0646", - "\u0698\u0648\u06cc", - "\u0627\u0648\u062a", - "\u0633\u067e\u062a", - "\u0627\u06a9\u062a", - "\u0646\u0648\u0627", - "\u062f\u0633\u0627", - } - MonthNames { - "\u0698\u0627\u0646\u0648\u06cc\u0647", - "\u0641\u0648\u0631\u06cc\u0647", - "\u0645\u0627\u0631\u0633", - "\u0622\u0648\u0631\u06cc\u0644", - "\u0645\u0647", - "\u0698\u0648\u0626\u0646", - "\u0698\u0648\u0626\u06cc\u0647", - "\u0627\u0648\u062a", - "\u0633\u067e\u062a\u0627\u0645\u0628\u0631", - "\u0627\u06a9\u062a\u0628\u0631", - "\u0646\u0648\u0627\u0645\u0628\u0631", - "\u062f\u0633\u0627\u0645\u0628\u0631", - } - LocaleID:int { 0x29 } - Eras { - "\u0642.\u0645.", - "\u0645.", - } - zoneStrings { - { - "Asia/Tehran", - "\u0648\u0642\u062a \u0627\u0633\u062a\u0627\u0646\u062f\u0627\u0631\u062f \u062a\u0647\u0631\u0627\u0646", - "IRST", - "\u0648\u0642\u062a \u062a\u0627\u0628\u0633\u062a\u0627\u0646\u06cc \u062a\u0647\u0631\u0627\u0646", - "IRDT", - "\u062a\u0647\u0631\u0627\u0646", - } - } - SpelloutRules { - "%main:\n" - " -x: \u0645\u0646\u0641\u06cc >>;\n" - " x.x: << \u0645\u0645\u06cc\u0632 >>;\n" - " \u0635\u0641\u0631; \u06cc\u06a9; \u062f\u0648; \u0633\u0647; \u0686\u0647\u0627\u0631; \u067e\u0646\u062c; \u0634\u0634; \u0647\u0641\u062a; \u0647\u0634\u062a; \u0646\u0647;\n" - " \u062f\u0647; \u06cc\u0627\u0632\u062f\u0647; \u062f\u0648\u0627\u0632\u062f\u0647; \u0633\u06cc\u0632\u062f\u0647; \u0686\u0647\u0627\u0631\u062f\u0647; \u067e\u0627\u0646\u0632\u062f\u0647; \u0634\u0627\u0646\u0632\u062f\u0647;\n" - " \u0647\u0641\u062f\u0647; \u0647\u062c\u062f\u0647; \u0646\u0648\u0632\u062f\u0647;\n" - " 20: \u0628\u06cc\u0633\u062a[ \u0648 >>];\n" - " 30: \u0633\u06cc[ \u0648 >>];\n" - " 40: \u0686\u0647\u0644[ \u0648 >>];\n" - " 50: \u067e\u0646\u062c\u0627\u0647[ \u0648 >>];\n" - " 60: \u0634\u0635\u062a[ \u0648 >>];\n" - " 70: \u0647\u0641\u062a\u0627\u062f[ \u0648 >>];\n" - " 80: \u0647\u0634\u062a\u0627\u062f[ \u0648 >>];\n" - " 90: \u0646\u0648\u062f[ \u0648 >>];\n" - " 100: \u0635\u062f[ \u0648 >>];\n" - " 200: \u062f\u0648\u06cc\u0633\u062a[ \u0648 >>];\n" - " 300: \u0633\u06cc\u0635\u062f[ \u0648 >>];\n" - " 400: \u0686\u0647\u0627\u0631\u0635\u062f[ \u0648 >>];\n" - " 500: \u067e\u0627\u0646\u0635\u062f[ \u0648 >>];\n" - " 600: \u0634\u0634\u0635\u062f[ \u0648 >>];\n" - " 700: \u0647\u0641\u062a\u0635\u062f[ \u0648 >>];\n" - " 800: \u0647\u0634\u062a\u0635\u062f[ \u0648 >>];\n" - " 900: \u0646\u0647\u0635\u062f[ \u0648 >>];\n" - " 1000: << \u0647\u0632\u0627\u0631[ \u0648 >>];\n" - " 1,000,000: << \u0645\u06cc\u0644\u06cc\u0648\u0646[ \u0648 >>];\n" - " 1,000,000,000: << \u0645\u06cc\u0644\u06cc\u0627\u0631\u062f[ \u0648 >>];\n" - " 1,000,000,000,000: =#,##0=;\n" - } - - Countries { - AD { "\u0622\u0646\u062f\u0648\u0631\u0627" } - AE { "\u0627\u0645\u0627\u0631\u0627\u062a \u0645\u062a\u062d\u062f\u0647\u200c\u06cc \u0639\u0631\u0628\u06cc" } - AF { "\u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646" } - AG { "\u0622\u0646\u062a\u06cc\u06af\u0648\u0627 \u0648 \u0628\u0627\u0631\u0628\u0648\u062f\u0627" } - AI { "\u0622\u0646\u06af\u06cc\u0644" } - AL { "\u0622\u0644\u0628\u0627\u0646\u06cc" } - AM { "\u0627\u0631\u0645\u0646\u0633\u062a\u0627\u0646" } - AN { "\u0622\u0646\u062a\u06cc\u0644 \u0647\u0644\u0646\u062f" } - AO { "\u0622\u0646\u06af\u0648\u0644\u0627" } - AQ { "\u062c\u0646\u0648\u0628\u06af\u0627\u0646" } - AR { "\u0622\u0631\u0698\u0627\u0646\u062a\u06cc\u0646" } - AS { "\u0633\u0627\u0645\u0648\u0627\u06cc \u0627\u0645\u0631\u06cc\u06a9\u0627" } - AT { "\u0627\u062a\u0631\u06cc\u0634" } - AU { "\u0627\u0633\u062a\u0631\u0627\u0644\u06cc\u0627" } - AW { "\u0622\u0631\u0648\u0628\u0627" } - AZ { "\u0622\u0630\u0631\u0628\u0627\u06cc\u062c\u0627\u0646" } - - BA { "\u0628\u0648\u0633\u0646\u06cc \u0648 \u0647\u0631\u0632\u06af\u0648\u06cc\u0646" } - BB { "\u0628\u0627\u0631\u0628\u0627\u062f\u0648\u0633" } - BD { "\u0628\u0646\u06af\u0644\u0627\u062f\u0634" } - BE { "\u0628\u0644\u0698\u06cc\u06a9" } - BF { "\u0628\u0648\u0631\u06a9\u06cc\u0646\u0627\u0641\u0627\u0633\u0648" } - BG { "\u0628\u0644\u063a\u0627\u0631\u0633\u062a\u0627\u0646" } - BH { "\u0628\u062d\u0631\u06cc\u0646" } - BI { "\u0628\u0648\u0631\u0648\u0646\u062f\u06cc" } - BJ { "\u0628\u0646\u06cc\u0646" } - BM { "\u0628\u0631\u0645\u0648\u062f\u0627" } - BN { "\u0628\u0631\u0648\u0646\u0626\u06cc" } - BO { "\u0628\u0648\u0644\u06cc\u0648\u06cc" } - BR { "\u0628\u0631\u0632\u06cc\u0644" } - BS { "\u0628\u0627\u0647\u0627\u0645\u0627" } - BT { "\u0628\u0648\u062a\u0627\u0646" } - BV { "\u062c\u0632\u06cc\u0631\u0647\u200c\u06cc \u0628\u0648\u0648\u062a" } - BW { "\u0628\u0648\u062a\u0633\u0648\u0627\u0646\u0627" } - BY { "\u0628\u06cc\u0644\u0648\u0631\u0648\u0633\u06cc" } - BZ { "\u0628\u0644\u06cc\u0632" } - - CA { "\u06a9\u0627\u0646\u0627\u062f\u0627" } - CC { "\u062c\u0632\u0627\u06cc\u0631 \u06a9\u0648\u06a9\u0648\u0633"} - CD { "\u062c\u0645\u0647\u0648\u0631\u06cc \u062f\u0645\u0648\u06a9\u0631\u0627\u062a\u06cc\u06a9 \u06a9\u0646\u06af\u0648" } - CF { "\u062c\u0645\u0647\u0648\u0631\u06cc \u0627\u0641\u0631\u06cc\u0642\u0627\u06cc \u0645\u0631\u06a9\u0632\u06cc" } - CG { "\u06a9\u0648\u0646\u06af\u0648" } - CH { "\u0633\u0648\u0626\u06cc\u0633" } - CI { "\u0633\u0627\u062d\u0644 \u0639\u0627\u062c" } - CK { "\u062c\u0632\u0627\u06cc\u0631 \u06a9\u0648\u06a9" } - CL { "\u0634\u06cc\u0644\u06cc" } - CM { "\u06a9\u0627\u0645\u0631\u0648\u0646" } - CN { "\u0686\u06cc\u0646" } - CO { "\u06a9\u0644\u0645\u0628\u06cc\u0627" } - CR { "\u06a9\u0627\u0633\u062a\u0627\u0631\u06cc\u06a9\u0627" } - CU { "\u06a9\u0648\u0628\u0627" } - CV { "\u06a9\u06cc\u067e \u0648\u0631\u062f" } - CX { "\u062c\u0632\u06cc\u0631\u0647\u200c\u06cc \u06a9\u0631\u06cc\u0633\u0645\u0633" } - CY { "\u0642\u0628\u0631\u0633" } - CZ { "\u062c\u0645\u0647\u0648\u0631\u06cc \u0686\u06a9" } - - DE { "\u0622\u0644\u0645\u0627\u0646" } - DJ { "\u062c\u06cc\u0628\u0648\u062a\u06cc" } - DK { "\u062f\u0627\u0646\u0645\u0627\u0631\u06a9" } - DM { "\u062f\u0648\u0645\u06cc\u0646\u06cc\u06a9\u0627" } - DO { "\u062c\u0645\u0647\u0648\u0631\u06cc \u062f\u0648\u0645\u06cc\u0646\u06cc\u06a9\u0646" } - DZ { "\u0627\u0644\u062c\u0632\u0627\u06cc\u0631" } - - EC { "\u0627\u06a9\u0648\u0627\u062f\u0631" } - EE { "\u0627\u0633\u062a\u0648\u0646\u06cc" } - EG { "\u0645\u0635\u0631" } - EH { "\u0635\u062d\u0631\u0627\u06cc \u063a\u0631\u0628\u06cc" } - ER { "\u0627\u0631\u06cc\u062a\u0631\u0647" } - ES { "\u0627\u0633\u067e\u0627\u0646\u06cc\u0627" } - ET { "\u0627\u062a\u06cc\u0648\u067e\u06cc" } - - FI { "\u0641\u0646\u0644\u0627\u0646\u062f" } - FJ { "\u0641\u06cc\u062c\u06cc" } - FK { "\u062c\u0632\u0627\u06cc\u0631 \u0641\u0627\u0644\u06a9\u0644\u0646\u062f" } - FM { "\u0645\u06cc\u06a9\u0631\u0648\u0646\u0632\u06cc" } - FO { "\u062c\u0632\u0627\u06cc\u0631 \u0641\u0627\u0631\u0648" } - FR { "\u0641\u0631\u0627\u0646\u0633\u0647" } - - GA { "\u06af\u0627\u0628\u0648\u0646" } - GB { "\u0627\u0646\u06af\u0644\u0633\u062a\u0627\u0646" } - GD { "\u06af\u0631\u0627\u0646\u0627\u062f\u0627" } - GE { "\u06af\u0631\u062c\u0633\u062a\u0627\u0646" } - GF { "\u06af\u0648\u06cc\u0627\u0646 \u0641\u0631\u0627\u0646\u0633\u0647" } - GH { "\u063a\u0646\u0627" } - GI { "\u06af\u06cc\u0628\u0631\u0627\u0644\u062a\u0627\u0631" } - GL { "\u06af\u0631\u0648\u0626\u0646\u0644\u0646\u062f" } - GM { "\u06af\u0627\u0645\u0628\u06cc\u0627" } - GN { "\u06af\u06cc\u0646\u0647" } - GP { "\u06af\u0648\u0627\u062f\u0644\u0648\u067e" } - GQ { "\u06af\u06cc\u0646\u0647\u200c\u06cc \u0627\u0633\u062a\u0648\u0627\u06cc\u06cc" } - GR { "\u06cc\u0648\u0646\u0627\u0646" } - GS { "\u062c\u0648\u0631\u062c\u06cc\u0627\u06cc \u062c\u0646\u0648\u0628\u06cc \u0648 \u062c\u0632\u0627\u06cc\u0631 \u0633\u0627\u0646\u062f\u0648\u06cc\u0686 \u062c\u0646\u0648\u0628\u06cc" } - GT { "\u06af\u0648\u0627\u062a\u0645\u0627\u0644\u0627" } - GU { "\u06af\u0648\u0627\u0645" } - GW { "\u06af\u06cc\u0646\u0647\u200c\u06cc \u0628\u06cc\u0633\u0627\u0626\u0648" } - GY { "\u06af\u0648\u06cc\u0627\u0646" } - - HK { "\u0647\u0646\u06af\u200c\u06a9\u0646\u06af" } - HM { "\u062c\u0632\u06cc\u0631\u0647\u200c\u06cc \u0647\u0631\u062f \u0648 \u062c\u0632\u0627\u06cc\u0631 \u0645\u06a9\u200c\u062f\u0648\u0646\u0627\u0644\u062f" } - HN { "\u0647\u0646\u062f\u0648\u0631\u0627\u0633" } - HR { "\u06a9\u0631\u0648\u0627\u0633\u06cc" } - HT { "\u0647\u0627\u06cc\u06cc\u062a\u06cc" } - HU { "\u0645\u062c\u0627\u0631\u0633\u062a\u0627\u0646" } - - ID { "\u0627\u0646\u062f\u0648\u0646\u0632\u06cc" } - IE { "\u0627\u06cc\u0631\u0644\u0646\u062f" } - IL { "\u0627\u0633\u0631\u0627\u0626\u06cc\u0644" } - IN { "\u0647\u0646\u062f" } - IO { "\u0645\u0633\u062a\u0639\u0645\u0631\u0647\u200c\u0647\u0627\u06cc \u0627\u0646\u06af\u0644\u0633\u062a\u0627\u0646 \u062f\u0631 \u0627\u0642\u06cc\u0627\u0646\u0648\u0633 \u0647\u0646\u062f" } - IQ { "\u0639\u0631\u0627\u0642" } - IR { "\u0627\u06cc\u0631\u0627\u0646" } - IS { "\u0627\u06cc\u0633\u0644\u0646\u062f" } - IT { "\u0627\u06cc\u062a\u0627\u0644\u06cc\u0627" } - - JM { "\u062c\u0627\u0645\u0627\u0626\u06cc\u06a9\u0627" } - JO { "\u0627\u0631\u062f\u0646" } - JP { "\u0698\u0627\u067e\u0646" } - - KE { "\u06a9\u0646\u06cc\u0627" } - KG { "\u0642\u0631\u0642\u06cc\u0632\u0633\u062a\u0627\u0646" } - KH { "\u06a9\u0627\u0645\u0628\u0648\u062c" } - KI { "\u06a9\u06cc\u0631\u06cc\u0628\u0627\u062a\u06cc" } - KM { "\u06a9\u0648\u0645\u0648\u0631\u0648" } - KN { "\u0633\u0646\u062a \u06a9\u06cc\u062a\u0633 \u0648 \u0646\u0648\u06cc\u0633" } - KP { "\u06a9\u0631\u0647\u200c\u06cc \u0634\u0645\u0627\u0644\u06cc" } - KR { "\u06a9\u0631\u0647\u200c\u06cc \u062c\u0646\u0648\u0628\u06cc" } - KW { "\u06a9\u0648\u06cc\u062a" } - KY { "\u062c\u0632\u0627\u06cc\u0631 \u06a9\u0650\u06cc\u0645\u0646" } - KZ { "\u0642\u0632\u0627\u0642\u0633\u062a\u0627\u0646" } - - LA { "\u0644\u0627\u0626\u0648\u0633" } - LB { "\u0644\u0628\u0646\u0627\u0646" } - LC { "\u0633\u0646\u062a \u0644\u0648\u0633\u06cc\u0627" } - LI { "\u0644\u06cc\u062e\u062a\u0646\u200c\u0627\u0634\u062a\u0627\u06cc\u0646" } - LK { "\u0633\u0631\u06cc\u200c\u0644\u0627\u0646\u06a9\u0627" } - LR { "\u0644\u06cc\u0628\u0631\u06cc\u0627" } - LS { "\u0644\u0633\u0648\u062a\u0648" } - LT { "\u0644\u06cc\u062a\u0648\u0627\u0646\u06cc" } - LU { "\u0644\u0648\u06a9\u0632\u0627\u0645\u0628\u0648\u0631\u06af" } - LV { "\u0644\u062a\u0648\u0646\u06cc" } - LY { "\u0644\u06cc\u0628\u06cc" } - - MA { "\u0645\u0631\u0627\u06a9\u0634" } - MC { "\u0645\u0648\u0646\u0627\u06a9\u0648" } - MD { "\u0645\u0648\u0644\u062f\u0648\u0648\u0627" } - MG { "\u0645\u0627\u062f\u0627\u06af\u0627\u0633\u06a9\u0627\u0631" } - MH { "\u062c\u0632\u0627\u06cc\u0631 \u0645\u0627\u0631\u0634\u0627\u0644"} - MK { "\u0645\u0642\u062f\u0648\u0646\u06cc\u0647" } - ML { "\u0645\u0627\u0644\u06cc" } - MM { "\u0645\u06cc\u0627\u0646\u0645\u0627\u0631" } - MN { "\u0645\u063a\u0648\u0644\u0633\u062a\u0627\u0646" } - MO { "\u0645\u0627\u06a9\u0627\u0626\u0648" } - MP { "\u062c\u0632\u0627\u06cc\u0631 \u0645\u0627\u0631\u06cc\u0627\u0646\u0627\u06cc \u0634\u0645\u0627\u0644\u06cc"} - MQ { "\u0645\u0627\u0631\u062a\u06cc\u0646\u06cc\u06a9" } - MR { "\u0645\u0648\u0631\u06cc\u062a\u0627\u0646\u06cc" } - MS { "\u0645\u0648\u0646\u062a\u200c\u0633\u0631\u0627\u062a" } - MT { "\u0645\u0627\u0644\u062a" } - MU { "\u0645\u0648\u0631\u06cc\u062a\u06cc\u0648\u0633" } - MV { "\u0645\u0627\u0644\u062f\u06cc\u0648" } - MW { "\u0645\u0627\u0644\u0627\u0648\u06cc" } - MX { "\u0645\u06a9\u0632\u06cc\u06a9" } - MY { "\u0645\u0627\u0644\u0632\u06cc" } - MZ { "\u0645\u0648\u0632\u0627\u0645\u0628\u06cc\u06a9" } - - NA { "\u0646\u0627\u0645\u06cc\u0628\u06cc\u0627" } - NC { "\u06a9\u0627\u0644\u062f\u0648\u0646\u06cc\u0627\u06cc \u062c\u062f\u06cc\u062f" } - NE { "\u0646\u06cc\u062c\u0631" } - NF { "\u062c\u0632\u06cc\u0631\u0647\u200c\u06cc \u0646\u0648\u0631\u0641\u0648\u0644\u06a9" } - NG { "\u0646\u06cc\u062c\u0631\u06cc\u0647" } - NI { "\u0646\u06cc\u06a9\u0627\u0631\u0627\u06af\u0648\u0626\u0647" } - NL { "\u0647\u0644\u0646\u062f" } - NO { "\u0646\u0631\u0648\u0698" } - NP { "\u0646\u067e\u0627\u0644" } - NR { "\u0646\u0627\u0626\u0648\u0631\u0648" } - NU { "\u0646\u06cc\u0648\u0626\u0647" } - NZ { "\u0632\u0644\u0627\u0646\u062f \u0646\u0648" } - - OM { "\u0639\u0645\u0627\u0646" } - - PA { "\u067e\u0627\u0646\u0627\u0645\u0627" } - PE { "\u067e\u0631\u0648" } - PF { "\u067e\u0644\u06cc\u200c\u0646\u0632\u06cc \u0641\u0631\u0627\u0646\u0633\u0647" } - PG { "\u067e\u0627\u067e\u0648\u0627 \u06af\u06cc\u0646\u0647\u200c\u06cc \u0646\u0648" } - PH { "\u0641\u06cc\u0644\u06cc\u067e\u06cc\u0646" } - PK { "\u067e\u0627\u06a9\u0633\u062a\u0627\u0646" } - PL { "\u0644\u0647\u0633\u062a\u0627\u0646" } - PM { "\u0633\u0646\u062a \u067e\u06cc\u0631 \u0648 \u0645\u06cc\u06a9\u0644\u0648\u0646" } - PN { "\u067e\u06cc\u062a\u06a9\u0627\u06cc\u0631\u0646" } - PR { "\u067e\u0648\u0631\u062a\u0648 \u0631\u06cc\u06a9\u0648" } - PT { "\u067e\u0631\u062a\u063a\u0627\u0644" } - PW { "\u067e\u0627\u0644\u0627\u0626\u0648" } - PY { "\u067e\u0627\u0631\u0627\u06af\u0648\u0626\u0647" } - - QA { "\u0642\u0637\u0631" } - - RE { "\u0631\u06cc\u0648\u0646\u06cc\u0648\u0646" } - RO { "\u0631\u0648\u0645\u0627\u0646\u06cc" } - RU { "\u0631\u0648\u0633\u06cc\u0647" } - RW { "\u0631\u0648\u0627\u0646\u062f\u0627" } - - SA { "\u0639\u0631\u0628\u0633\u062a\u0627\u0646 \u0633\u0639\u0648\u062f\u06cc" } - SB { "\u062c\u0632\u0627\u06cc\u0631 \u0633\u0644\u06cc\u0645\u0627\u0646" } - SC { "\u0633\u06cc\u0634\u0644" } - SD { "\u0633\u0648\u062f\u0627\u0646" } - SE { "\u0633\u0648\u0626\u062f" } - SG { "\u0633\u0646\u06af\u0627\u067e\u0648\u0631" } - SH { "\u0633\u0646\u062a \u0647\u0644\u0646" } - SI { "\u0627\u0633\u0644\u0648\u0648\u0646\u06cc" } - SJ { "\u0627\u0633\u0648\u0627\u0644\u0628\u0627\u0631\u062f \u0648 \u062c\u0627\u0646 \u0645\u0627\u06cc\u0646" } - SK { "\u0627\u0633\u0644\u0648\u0627\u06a9\u06cc" } - SL { "\u0633\u06cc\u0631\u0627\u0644\u0626\u0648\u0646" } - SM { "\u0633\u0627\u0646 \u0645\u0627\u0631\u06cc\u0646\u0648" } - SN { "\u0633\u0646\u06af\u0627\u0644" } - SO { "\u0633\u0648\u0645\u0627\u0644\u06cc" } - SP { "\u0635\u0631\u0628\u0633\u062a\u0627\u0646" } - SR { "\u0633\u0648\u0631\u06cc\u0646\u0627\u0645" } - ST { "\u0633\u0627\u0626\u0648 \u062a\u0648\u0645\u0647 \u0648 \u067e\u0631\u06cc\u0646\u0633\u06cc\u067e\u0647" } - SV { "\u0627\u0644\u0633\u0627\u0644\u0648\u0627\u062f\u0648\u0631" } - SY { "\u0633\u0648\u0631\u06cc\u0647" } - SZ { "\u0633\u0648\u0627\u0632\u06cc\u0644\u0646\u062f" } - - TC { "\u062c\u0632\u0627\u06cc\u0631 \u062a\u0631\u06a9 \u0648 \u06a9\u0627\u06cc\u06a9\u0648\u0633" } - TD { "\u0686\u0627\u062f" } - TF { "\u0645\u0633\u062a\u0639\u0645\u0631\u0647\u200c\u0647\u0627\u06cc \u062c\u0646\u0648\u0628\u06cc \u0641\u0631\u0627\u0646\u0633\u0647" } - TG { "\u062a\u0648\u06af\u0648" } - TH { "\u062a\u0627\u06cc\u0644\u0646\u062f" } - TJ { "\u062a\u0627\u062c\u06cc\u06a9\u0633\u062a\u0627\u0646" } - TK { "\u062a\u0648\u06a9\u0644\u0627\u0626\u0648" } - TM { "\u062a\u0631\u06a9\u0645\u0646\u0633\u062a\u0627\u0646" } - TN { "\u062a\u0648\u0646\u0633" } - TO { "\u062a\u0648\u0646\u06af\u0627" } - TL { "\u062a\u06cc\u0645\u0648\u0631 \u0634\u0631\u0642\u06cc" } - TR { "\u062a\u0631\u06a9\u06cc\u0647" } - TT { "\u062a\u0631\u06cc\u0646\u06cc\u062f\u0627\u062f \u0648 \u062a\u0648\u0628\u0627\u06af\u0648" } - TV { "\u062a\u0648\u0648\u0627\u0644\u0648" } - TW { "\u062a\u0627\u06cc\u0648\u0627\u0646" } - TZ { "\u062a\u0627\u0646\u0632\u0627\u0646\u06cc\u0627" } - - UA { "\u0627\u0648\u06a9\u0631\u0627\u06cc\u0646" } - UG { "\u0627\u0648\u06af\u0627\u0646\u062f\u0627" } - UM { "\u062c\u0632\u0627\u06cc\u0631 \u06a9\u0648\u0686\u06a9 \u062f\u0648\u0631\u0627\u0641\u062a\u0627\u062f\u0647\u200c\u06cc \u0627\u06cc\u0627\u0644\u0627\u062a \u0645\u062a\u062d\u062f\u0647" } - US { "\u0627\u06cc\u0627\u0644\u0627\u062a \u0645\u062a\u062d\u062f\u0647\u200c\u06cc \u0627\u0645\u0631\u06cc\u06a9\u0627" } - UY { "\u0627\u0648\u0631\u0648\u06af\u0648\u0626\u0647" } - UZ { "\u0627\u0632\u0628\u06a9\u0633\u062a\u0627\u0646" } - - VA { "\u0648\u0627\u062a\u06cc\u06a9\u0627\u0646" } - VC { "\u0633\u0646\u062a \u0648\u06cc\u0646\u0633\u0646\u062a \u0648 \u06af\u0631\u0646\u0627\u062f\u06cc\u0646" } - VE { "\u0648\u0646\u0632\u0648\u0626\u0644\u0627" } - VG { "\u062c\u0632\u0627\u06cc\u0631 \u0648\u06cc\u0631\u062c\u06cc\u0646 \u0627\u0646\u06af\u0644\u0633\u062a\u0627\u0646" } - VI { "\u062c\u0632\u0627\u06cc\u0631 \u0648\u06cc\u0631\u062c\u06cc\u0646 \u0627\u06cc\u0627\u0644\u0627\u062a \u0645\u062a\u062d\u062f\u0647" } - VN { "\u0648\u06cc\u062a\u0646\u0627\u0645" } - VU { "\u0648\u0627\u0646\u0648\u0627\u062a\u0648" } - - WF { "\u0648\u0627\u0644\u06cc\u0633 \u0648 \u0641\u06cc\u0648\u062a\u0648\u0646\u0627" } - WS { "\u0633\u0627\u0645\u0648\u0627" } - - YE { "\u06cc\u0645\u0646" } - YT { "\u0645\u0627\u06cc\u0648\u062a" } - YU { "\u06cc\u0648\u06af\u0633\u0644\u0627\u0648\u06cc" } - - ZA { "\u0627\u0641\u0631\u06cc\u0642\u0627\u06cc \u062c\u0646\u0648\u0628\u06cc" } -// ZR { "\u0632\u0626\u06cc\u0631" } // Zaire is now the Democratic Republic of Congo (CD) - ZM { "\u0632\u0627\u0645\u0628\u06cc\u0627" } - ZW { "\u0632\u06cc\u0645\u0628\u0627\u0628\u0648\u0647" } - } - Languages { - root { "\u0631\u06cc\u0634\u0647" } - aa { "\u0622\u0641\u0627\u0631\u06cc" } - ab { "\u0622\u0628\u062e\u0627\u0632\u06cc" } - ae { "\u0627\u0648\u0633\u062a\u0627\u06cc\u06cc" } - af { "\u0622\u0641\u0631\u06cc\u06a9\u0627\u0646\u0633" } - afa { "\u0627\u0641\u0631\u06cc\u0642\u0627 \u0648 \u0622\u0633\u06cc\u0627\u06cc\u06cc (\u063a\u06cc\u0631\u0647)" } - am { "\u0627\u0645\u0647\u0631\u06cc" } - ang { "\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc \u0628\u0627\u0633\u062a\u0627\u0646 (\u062d\u062f\u0648\u062f \u06f4\u06f5\u06f0-\u06f1\u06f1\u06f0\u06f0 \u0645.)" } - apa { "\u0632\u0628\u0627\u0646\u200c\u0647\u0627\u06cc \u0622\u067e\u0627\u0686\u06cc\u0627\u06cc\u06cc"} - ar { "\u0639\u0631\u0628\u06cc" } - arc { "\u0622\u0631\u0627\u0645\u06cc" } - art { "\u0633\u0627\u062e\u062a\u0647\u200c\u06af\u06cc (\u063a\u06cc\u0631\u0647)" } - as { "\u0622\u0633\u0627\u0645\u06cc" } - aus { "\u0632\u0628\u0627\u0646\u200c\u0647\u0627\u06cc \u0627\u0633\u062a\u0631\u0627\u0644\u06cc\u0627\u06cc\u06cc" } - // ? awa { "Awadhi" } - ay { "\u0622\u06cc\u0645\u0627\u0631\u0627\u06cc\u06cc" } - az { "\u0622\u0630\u0631\u0628\u0627\u06cc\u062c\u0627\u0646\u06cc" } - ba { "\u0628\u0627\u0634\u06a9\u06cc\u0631" } - // ? bai { "Bamileke Languages" } - bal { "\u0628\u0644\u0648\u0686\u06cc" } - bat { "\u0628\u0627\u0644\u062a\u06cc\u06a9\u06cc (\u063a\u06cc\u0631\u0647)" } - be { "\u0628\u0644\u0648\u0631\u0648\u0633\u06cc" } - // ? ber { "Beber" } - bg { "\u0628\u0644\u063a\u0627\u0631\u06cc" } - bh { "\u0628\u06cc\u0647\u0627\u0631\u06cc" } - bho { "\u0628\u0648\u062c\u067e\u0648\u0631\u06cc" } - bi { "\u0628\u06cc\u0633\u0644\u0627\u0645\u0627" } - // ? bin { "Bini" } - // ? bla { "Siksika" } - bn { "\u0628\u0646\u06af\u0627\u0644\u06cc" } - bo { "\u062a\u0628\u062a\u06cc" } - // ? br { "Brenton" } - // ? bra { "Braj" } - bs { "\u0628\u0648\u0633\u0646\u06cc\u0627\u06cc\u06cc"} - ca { "\u06a9\u0627\u062a\u0627\u0644\u0648\u0646\u06cc\u0627\u06cc\u06cc" } - cai { "\u0633\u0631\u062e\u200c\u067e\u0648\u0633\u062a\u06cc \u0627\u0645\u0631\u06cc\u06a9\u0627\u06cc \u0645\u0631\u06a9\u0632\u06cc (\u063a\u06cc\u0631\u0647)" } - // ? cau { "Caucasian (Other)" } - ce { "\u0686\u0686\u0646\u06cc" } - cel { "\u0633\u0644\u062a\u06cc (\u063a\u06cc\u0631\u0647)" } - ch { "\u0686\u0627\u0645\u0648\u0631\u0648\u06cc\u06cc" } - // ? chn { "Chinook Jargon" } - chr { "\u0686\u0631\u0648\u06a9\u06cc" } - // ? cmc { "Chamic Languages" } - cop { "\u0642\u0628\u0637\u06cc" } - cs { "\u0686\u06a9\u06cc" } - cu { "\u0627\u0633\u0644\u0627\u0648\u06cc \u06a9\u0644\u06cc\u0633\u0627\u06cc\u06cc" } - // ? cus { "Cushitic (Other)" } - cv { "\u0686\u0648\u0648\u0627\u0634\u06cc" } - cy { "\u0648\u06cc\u0644\u0632\u06cc" } - da { "\u062f\u0627\u0646\u0645\u0627\u0631\u06a9\u06cc" } - dak { "\u062f\u0627\u06a9\u0648\u062a\u0627\u06cc\u06cc" } - // ? day { "Dayak" } - de { "\u0622\u0644\u0645\u0627\u0646\u06cc" } - // ? del { "Delaware" } - // ? den { "Slave" } - // ? dgr { "Dogrib" } - // ? div { "Divehi" } - dra { "\u062f\u0631\u0627\u0648\u06cc\u062f\u06cc (\u063a\u06cc\u0631\u0647)" } - dum { "\u0647\u0644\u0646\u062f\u06cc \u0645\u06cc\u0627\u0646\u0647 (\u062d\u062f\u0648\u062f \u06f1\u06f0\u06f5\u06f0-\u06f1\u06f3\u06f5\u06f0 \u0645.)" } - dz { "\u0628\u0648\u062a\u0627\u0646\u06cc" } - // ? dzo { "Dzongkha" } - egy { "\u0645\u0635\u0631\u06cc (\u0628\u0627\u0633\u062a\u0627\u0646\u06cc)" } - // ? eka { "Ekajuk" } - el { "\u06cc\u0648\u0646\u0627\u0646\u06cc" } - // ? elx { "Elamite" } - en { "\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc" } - enm { "\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc \u0645\u06cc\u0627\u0646\u0647 (\u06f1\u06f1\u06f0\u06f0 -\u06f1\u06f5\u06f0\u06f0 \u0645.)" } - eo { "\u0627\u0633\u067e\u0631\u0627\u0646\u062a\u0648" } - es { "\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc" } - et { "\u0627\u0633\u062a\u0648\u0646\u06cc\u0627\u06cc\u06cc" } - eu { "\u0628\u0627\u0633\u06a9\u06cc" } - // ? ewo { "Ewondo" } - fa { "\u0641\u0627\u0631\u0633\u06cc" } - fi { "\u0641\u0646\u0644\u0627\u0646\u062f\u06cc" } - // ? fiu { "Finno - Ugrian" } - fj { "\u0641\u06cc\u062c\u06cc\u0627\u06cc\u06cc" } - fo { "\u0641\u0627\u0631\u0648\u06cc\u06cc" } - // ? fon { "Fon" } - fr { "\u0641\u0631\u0627\u0646\u0633\u0648\u06cc" } - frm { "\u0641\u0631\u0627\u0646\u0633\u0648\u06cc \u0645\u06cc\u0627\u0646\u0647 (\u062d\u062f\u0648\u062f \u06f1\u06f4\u06f0\u06f0-\u06f1\u06f6\u06f0\u06f0 \u0645.)" } - fro { "\u0641\u0631\u0627\u0646\u0633\u0648\u06cc \u0642\u062f\u06cc\u0645 (\u06f8\u06f4\u06f2-\u062d\u062f\u0648\u062f \u06f1\u06f4\u06f0\u06f0 \u0645.)" } - // ? ful { "Fulah" } - // ? fy { "Frisian" } - ga { "\u0627\u06cc\u0631\u0644\u0646\u062f\u06cc" } - gaa { "\u06af\u0627" } - // ? gay { "Gayo" } - // ? gd { "Scots Gaelic" } - gem { "\u0698\u0631\u0645\u0646\u06cc (\u063a\u06cc\u0631\u0647)" } - // ? gil { "Gilbertese" } - // ? gl { "Gallegan" } - // ? gla { "Gaelic (Scots)" } - gmh { "\u0622\u0644\u0645\u0627\u0646\u06cc \u0639\u0644\u06cc\u0627\u06cc \u0645\u06cc\u0627\u0646\u0647 (\u062d\u062f\u0648\u062f \u06f1\u06f0\u06f5\u06f0-\u06f1\u06f5\u06f0\u06f0)" } - gn { "\u06af\u0648\u0627\u0631\u0627\u0646\u06cc" } - goh { "\u0622\u0644\u0645\u0627\u0646\u06cc \u0639\u0644\u06cc\u0627\u06cc \u0628\u0627\u0633\u062a\u0627\u0646 (\u062d\u062f\u0648\u062f \u06f7\u06f5\u06f0-\u06f1\u06f0\u06f5\u06f0)" } - got { "\u06af\u0648\u062a\u06cc\u06a9" } - // ? gor { "Gorontalo" } - // ? got { "Gothic" } - // ? grb { "Gerbo" } - grc { "\u06cc\u0648\u0646\u0627\u0646\u06cc \u06a9\u0647\u0646 (\u062a\u0627 \u06f1\u06f4\u06f5\u06f3 \u0645.)" } - gu { "\u06af\u062c\u0631\u0627\u062a\u06cc" } - gv { "\u0645\u0627\u0646\u06cc" } - ha { "\u0647\u0648\u0633\u06cc\u0627\u06cc\u06cc" } - haw { "\u0647\u0627\u0648\u0627\u0626\u06cc\u0627\u06cc\u06cc" } - he { "\u0639\u0628\u0631\u06cc" } - hi { "\u0647\u0646\u062f\u06cc" } - hit { "\u0647\u06cc\u062a\u06cc" } - hr { "\u06a9\u0631\u0648\u0627\u062a\u06cc" } - hu { "\u0645\u062c\u0627\u0631\u06cc" } - hy { "\u0627\u0631\u0645\u0646\u06cc" } - hz { "\u0647\u0631\u06cc\u0631\u0648\u06cc\u06cc" } - ia { "\u0645\u06cc\u0627\u0646\u200c\u0632\u0628\u0627\u0646" } - id { "\u0627\u0646\u062f\u0648\u0646\u0632\u06cc\u0627\u06cc\u06cc" } - // ? ie { "Interlingue" } - ik { "\u0627\u06cc\u0646\u0648\u067e\u06cc\u06a9" } - inc { "\u0647\u0646\u062f\u06cc\u06a9 (\u063a\u06cc\u0631\u0647)" } - ine { "\u0647\u0646\u062f\u0648\u0627\u0631\u0648\u062f\u067e\u0627\u06cc\u06cc" } - ira { "\u0627\u06cc\u0631\u0627\u0646\u06cc" } - // ? iro { "Iroguoian Languages" } - is { "\u0627\u06cc\u0633\u0644\u0646\u062f\u06cc" } - it { "\u0627\u06cc\u062a\u0627\u0644\u06cc\u0627\u06cc\u06cc" } - iu { "\u0627\u06cc\u0646\u0648\u06a9\u06cc\u062a\u0648\u062a" } - iw { "\u0639\u0628\u0631\u06cc" } // Use he instead - ja { "\u0698\u0627\u067e\u0646\u06cc" } - jpr { "\u0641\u0627\u0631\u0633\u06cc \u06cc\u0647\u0648\u062f\u06cc" } - jrb { "\u0639\u0631\u0628\u06cc \u06cc\u0647\u0648\u062f\u06cc" } - jv { "\u062c\u0627\u0648\u0647\u200c\u0627\u06cc" } - //jw { "\u062c\u0627\u0648\u0647\u200c\u0627\u06cc" } // Use jv instead - ka { "\u06af\u0631\u062c\u06cc" } - // ? kho { "Khotanese" } - kk { "\u0642\u0632\u0627\u0642\u06cc" } - // ? kl { "Kalaallisut" } - km { "\u062e\u0645\u0631\u06cc" } - kn { "\u06a9\u0627\u0646\u0627\u062f\u0647\u200c\u0627\u06cc" } - kok { "\u06a9\u0646\u06a9\u0627\u0646\u06cc" } - ko { "\u06a9\u0631\u0647\u200c\u0627\u06cc" } - // ? kon { "Kongo" } - ks { "\u06a9\u0634\u0645\u06cc\u0631\u06cc" } - ku { "\u06a9\u0631\u062f\u06cc" } - kv { "\u06a9\u0648\u0645\u06cc\u0627\u06cc\u06cc" } - kw { "\u06a9\u0631\u0646\u0648\u0627\u0644\u06cc" } - ky { "\u0642\u0631\u0642\u06cc\u0632\u06cc" } - la { "\u0644\u0627\u062a\u06cc\u0646\u06cc" } - // ? lad { "Ladino" } - // ? lam { "Lamba" } - lb { "\u0644\u062a\u0633\u0647\u200c\u0628\u0648\u0631\u06af\u06cc\u0634" } - // ? lez { "Lezghian" } - lit { "\u0644\u06cc\u062a\u0648\u0627\u0646\u06cc\u0627\u06cc\u06cc" } - ln { "\u0644\u06cc\u0646\u06af\u0627\u0644\u0627" } - lo { "\u0644\u0627\u0626\u0648\u0633\u06cc" } - lt { "\u0644\u06cc\u062a\u0648\u0627\u0646\u06cc\u0627\u06cc\u06cc" } - // ? lua { "Luba-Lulua" } - // ? lub { "Luba-Katanga" } - // ? lui { "Luiseeno" } - // ? luo { "Lua" } - lv { "\u0644\u062a\u0648\u0646\u06cc\u0627\u06cc\u06cc" } - // ? mak { "Makasar" } - map { "\u0622\u0633\u062a\u0631\u0648\u0646\u06cc\u0632\u06cc\u0627\u06cc\u06cc" } - // ? mdr { "Mandar" } - mg { "\u0645\u0627\u0644\u0627\u06af\u0627\u0633\u06cc\u0627\u06cc\u06cc" } - mga { "\u0627\u06cc\u0631\u0644\u0646\u062f\u06cc \u0645\u06cc\u0627\u0646\u0647 (\u06f9\u06f0\u06f0-\u06f1\u06f2\u06f0\u06f0 \u0645.)" } - mh { "\u0645\u0627\u0631\u0634\u0627\u0644\u06cc" } - mi { "\u0645\u0627\u0626\u0648\u0631\u06cc\u0627\u06cc\u06cc" } - mis { "\u0632\u0628\u0627\u0646\u200c\u0647\u0627\u06cc \u0645\u062a\u0641\u0631\u0642\u0647"} - mk { "\u0645\u0642\u062f\u0648\u0646\u06cc" } - // ? mkh { "Mon-Khmer (Other)" } - ml { "\u0645\u0627\u0644\u0627\u06cc\u0627\u0644\u0627\u0645\u06cc" } - mn { "\u0645\u063a\u0648\u0644\u06cc" } - // ? mno { "Manobo Languages" } - mo { "\u0645\u0648\u0644\u062f\u0627\u0648\u06cc\u0627\u06cc\u06cc" } - moh { "\u0645\u0648\u0647\u0627\u06a9\u06cc" } - mr { "\u0645\u0631\u0627\u062a\u06cc" } - ms { "\u0645\u0627\u0644\u0632\u06cc\u0627\u06cc\u06cc" } - mt { "\u0645\u0627\u0644\u062a\u06cc" } - mul { "\u0686\u0646\u062f\u06cc\u0646 \u0632\u0628\u0627\u0646" } - // ? mun { "Munda Languages" } - // ? mus { "Creek" } - my { "\u0628\u0631\u0645\u0647\u200c\u0627\u06cc" } - myn { "\u0645\u0627\u06cc\u0627\u06cc\u06cc\u06a9" } - na { "\u0646\u0627\u0626\u0648\u0631\u0648\u06cc\u06cc" } - nai { "\u0633\u0631\u062e\u200c\u067e\u0648\u0633\u062a\u06cc \u0627\u0645\u0631\u06cc\u06a9\u0627\u06cc \u0634\u0645\u0627\u0644\u06cc (\u063a\u06cc\u0631\u0647)"} - nb { "\u0628\u0648\u06a9\u0633\u0645\u0627\u0644 \u0646\u0631\u0648\u0698\u06cc" } - nd { "\u0627\u0646\u062f\u0647\u200c\u0628\u0644\u0647\u200c\u0627\u06cc \u0634\u0645\u0627\u0644\u06cc" } - nds { "\u0622\u0644\u0645\u0627\u0646\u06cc \u0633\u0641\u0644\u06cc\u061b \u0633\u0627\u06a9\u0633\u0648\u0646 \u0633\u0641\u0644\u0628" } - ne { "\u0646\u067e\u0627\u0644\u06cc" } - nl { "\u0647\u0644\u0646\u062f\u06cc" } - nn { "\u0646\u06cc\u0646\u0648\u0631\u0633\u06a9 \u0646\u0631\u0648\u0698\u06cc" } - no { "\u0646\u0631\u0648\u0698\u06cc" } - nr { "\u0627\u0646\u062f\u0647\u200c\u0628\u0644\u0647\u200c\u0627\u06cc \u062c\u0646\u0648\u0628\u06cc" } - nv { "\u0646\u0627\u0648\u0627\u0647\u0648\u06cc\u06cc" } - // ? om { "Oromo (Afan)" } - or { "\u0627\u0648\u0631\u06cc\u0647\u200c\u0627\u06cc" } - // ? os { "Ossetic" } - ota { "\u062a\u0631\u06a9\u06cc (\u0627\u0645\u067e\u0631\u0627\u062a\u0648\u0631\u06cc \u0639\u062b\u0645\u0627\u0646\u06cc)" } - pa { "\u067e\u0646\u062c\u0627\u0628\u06cc" } - paa { "\u067e\u0627\u067e\u0648\u0627\u06cc\u06cc (\u063a\u06cc\u0631\u0647)" } - pal { "\u067e\u0647\u0644\u0648\u06cc" } - peo { "\u0641\u0627\u0631\u0633\u06cc \u0642\u062f\u06cc\u0645 (\u062d\u062f\u0648\u062f \u06f6\u06f0\u06f0-\u06f4\u06f0\u06f0 \u0642.\u0645.)" } - phi { "\u0641\u06cc\u0627\u06cc\u067e\u06cc\u0646\u06cc (\u063a\u06cc\u0631\u0647)" } - phn { "\u0641\u0646\u06cc\u0642\u06cc" } - pi { "\u067e\u0627\u0644\u06cc" } - pl { "\u0644\u0647\u0633\u062a\u0627\u0646\u06cc" } - ps { "\u067e\u0634\u062a\u0648" } - pt { "\u067e\u0631\u062a\u063a\u0627\u0644\u06cc" } - qu { "\u06a9\u0686\u0648\u0627\u06cc\u06cc" } - ro { "\u0631\u0648\u0645\u0627\u0646\u06cc\u0627\u06cc\u06cc" } - // ? roa { "Romance (Other)" } - ru { "\u0631\u0648\u0633\u06cc" } - rw { "\u06a9\u06cc\u0646\u06cc\u0627\u0631\u0648\u0627\u0646\u062f\u0627\u06cc\u06cc" } - sa { "\u0633\u0646\u0633\u06a9\u0631\u06cc\u062a" } - sai { "\u0633\u0631\u062e\u200c\u067e\u0648\u0633\u062a\u06cc \u0627\u0645\u0631\u06cc\u06a9\u0627\u06cc \u062c\u0646\u0648\u0628\u06cc (\u063a\u06cc\u0631\u0647)" } - // ? sam { "Samritan" } - // ? sas { "Saska" } - sc { "\u0633\u0627\u0631\u062f\u06cc\u0646\u06cc\u0627\u06cc\u06cc" } - sco { "\u0627\u0633\u06a9\u0627\u062a\u0644\u0646\u062f\u06cc" } - sd { "\u0633\u0646\u062f\u06cc" } - sem { "\u0633\u0627\u0645\u06cc" } - sg { "\u0633\u0627\u0646\u06af\u0648\u06cc\u06cc" } - sga { "\u0627\u06cc\u0631\u0644\u0646\u062f\u06cc \u0628\u0627\u0633\u062a\u0627\u0646 (\u062a\u0627 \u06f9\u06f0\u06f0 \u0645.)" } - sgn { "\u0632\u0628\u0627\u0646\u200c\u0647\u0627\u06cc \u0646\u0634\u0627\u0646\u0647\u200c\u0627\u06cc" } - sh { "\u0635\u0631\u0628 \u0648 \u06a9\u0631\u0648\u0627\u062a\u06cc" } - si { "\u0633\u06cc\u0646\u0647\u0627\u0644\u06cc" } - sit { "\u0686\u06cc\u0646 \u0648 \u062a\u0628\u062a\u06cc (\u063a\u06cc\u0631\u0647)" } - sk { "\u0627\u0633\u0644\u0648\u0627\u06a9\u06cc" } - sl { "\u0627\u0633\u0644\u0648\u0648\u06cc\u0646\u06cc\u0627\u06cc\u06cc" } - sm { "\u0633\u0627\u0645\u0648\u0622\u06cc\u06cc" } - sn { "\u0634\u0648\u0646\u0627\u06cc\u06cc" } - so { "\u0633\u0648\u0645\u0627\u0644\u06cc\u0627\u06cc\u06cc" } - sq { "\u0622\u0644\u0628\u0627\u0646\u06cc\u0627\u06cc\u06cc" } - sr { "\u0635\u0631\u0628\u06cc" } - // ? ss { "Swati" } - // ? ssa { "Nilo-Saharam" } - st { "\u0633\u0648\u062a\u0648\u06cc\u06cc \u062c\u0646\u0648\u0628\u06cc" } - su { "\u0633\u0648\u0646\u062f\u0627\u06cc\u06cc" } - sux { "\u0633\u0648\u0645\u0631\u06cc"} - sv { "\u0633\u0648\u0626\u062f\u06cc" } - sw { "\u0633\u0648\u0627\u062d\u0644\u06cc" } - syr { "\u0633\u0631\u06cc\u0627\u0646\u06cc" } - ta { "\u062a\u0627\u0645\u06cc\u0644\u06cc" } - te { "\u062a\u0644\u0648\u06af\u0648\u06cc\u06cc" } - // ? ter { "Tereno" } - // ? tet { "Tetum" } - tg { "\u062a\u0627\u062c\u06cc\u06a9\u06cc" } - th { "\u062a\u0627\u06cc\u0644\u0646\u062f\u06cc" } - ti { "\u062a\u06cc\u06af\u0631\u06cc\u0646\u06cc\u0627\u06cc\u06cc" } - tk { "\u062a\u0631\u06a9\u0645\u062a\u06cc" } - tl { "\u062a\u0627\u06af\u0627\u0644\u0648\u06af\u06cc" } - tn { "\u062a\u0633\u0648\u0627\u0646\u0627\u06cc\u06cc" } - to { "\u062a\u0648\u0646\u06af\u0627\u06cc\u06cc (\u062c\u0632\u0627\u06cc\u0631 \u062a\u0648\u0646\u06af\u0627)" } - tr { "\u062a\u0631\u06a9\u06cc" } - ts { "\u062a\u0633\u0648\u0646\u06af\u0627\u06cc\u06cc" } - tt { "\u062a\u0627\u062a\u0627\u0631\u06cc" } - tur { "\u062a\u0631\u06a9\u06cc \u0627\u0633\u062a\u0627\u0646\u0628\u0648\u0644\u06cc" } - // ? tvl { "Tuvalu" } - tw { "\u062a\u0648\u06cc\u200c\u06cc\u0627\u06cc\u06cc" } - ty { "\u062a\u0627\u0647\u06cc\u062a\u06cc\u0627\u06cc\u06cc" } - ug { "\u0627\u0648\u06cc\u063a\u0648\u0631\u06cc" } - // ? uga { "Ugaritic" } - uk { "\u0627\u0648\u06a9\u0631\u0627\u06cc\u0646\u06cc" } - und { "\u0646\u0627\u0645\u0634\u062e\u0635" } - ur { "\u0627\u0631\u062f\u0648" } - uz { "\u0627\u0632\u0628\u06a9\u06cc" } - vi { "\u0648\u06cc\u062a\u0646\u0627\u0645\u06cc" } - vo { "\u0648\u0644\u0627\u067e\u0648\u06a9" } - // ? vot { "Votic" } - wo { "\u0648\u0644\u0648\u0641\u06cc" } - xh { "\u062e\u0648\u0633\u0627\u06cc\u06cc" } - yi { "\u06cc\u062f\u06cc" } - yo { "\u06cc\u0648\u0631\u0648\u0628\u0627\u06cc\u06cc" } - // ? za { "Zhuang" } - // ? zen { "Zenaga" } - zh { "\u0686\u06cc\u0646\u06cc" } - zu { "\u0632\u0648\u0644\u0648\u06cc\u06cc" } - } - Scripts { - ARAB { "\u0639\u0631\u0628\u06cc" } - ARMN { "\u0627\u0631\u0645\u0646\u06cc" } - BENG { "\u0628\u0646\u06af\u0627\u0644\u06cc" } - BOPO { "\u0628\u0648\u067e\u0648\u0645\u0648\u0641\u0648" } - // ? CANS { "Unified Canadian Aboriginal Symbols" } - CHER { "\u0686\u0631\u0648\u06a9\u06cc\u0627\u06cc\u06cc" } - CYRL { "\u0633\u06cc\u0631\u06cc\u0644\u06cc" } - DEVA { "\u062f\u0648\u0646\u0627\u06af\u0631\u06cc" } - // ? DSRT { "Deseret" } - ETHI { "\u0627\u062a\u06cc\u0648\u067e\u06cc\u0627\u06cc\u06cc" } - GEOR { "\u06af\u0631\u062c\u06cc" } - GOTH { "\u06af\u0648\u062a\u06cc\u06a9" } - GREK { "\u06cc\u0648\u0646\u0627\u0646\u06cc" } - GUJR { "\u06af\u062c\u0631\u0627\u062a\u06cc" } - // ? GURU { "Gurmukhi" } - HANG { "\u0647\u0627\u0646\u06af\u0648\u0644" } - HANI { "\u0647\u0627\u0646" } - HEBR { "\u0639\u0628\u0631\u06cc" } - HIRA { "\u0647\u06cc\u0631\u0627\u06af\u0627\u0646\u0627" } - // ? ITAL { "Old_italic" } - KANA { "\u06a9\u0627\u062a\u0627\u06a9\u0627\u0646\u0627" } - KHMR { "\u062e\u0645\u0631\u06cc" } - KNDA { "\u06a9\u0627\u0646\u0627\u062f\u0647\u200c\u0627\u06cc" } - LAO { "\u0644\u0627\u0626\u0648\u0633\u06cc" } - LATN { "\u0644\u0627\u062a\u06cc\u0646" } - MLYM { "\u0645\u0627\u0644\u0627\u06cc\u0627\u0644\u0627\u0645\u06cc" } - MONG { "\u0645\u063a\u0648\u0644\u06cc" } - MYMR { "\u0645\u06cc\u0627\u0646\u0645\u0627\u0631" } - // ? OGAM { "Ogham" } - ORYA { "\u0627\u0648\u0631\u06cc\u0647\u200c\u0627\u06cc" } - QAAC { "\u0642\u0628\u0637\u06cc" } - QAAI { "\u0645\u0648\u0631\u0648\u062b\u06cc" } - RUNR { "\u0631\u0648\u0646\u06cc" } - // ? SINH { "Sinhala" } - SYRC { "\u0622\u0633\u0648\u0631\u06cc" } - TAML { "\u062a\u0627\u0645\u06cc\u0644" } - TELU { "\u062a\u0644\u0648\u06af\u0648\u06cc\u06cc" } - // ? THAA { "Thana" } - THAI { "\u062a\u0627\u06cc\u0644\u0646\u062f\u06cc" } - TIBT { "\u062a\u0628\u062a\u06cc" } - YIII { "\u06cc\u06cc" } - ZYYY { "\u0645\u0634\u062a\u0631\u06a9" } - } - - // Currency display names - Currencies { - IRR { "\uFDFC", "IRR" } - } -} +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/fa.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/fa.xml + */ +fa{ + Countries{ + AD{"آندورا"} + AE{"امارات متحده‌ی عربی"} + AF{"افغانستان"} + AG{"آنتیگوا و باربودا"} + AI{"آنگیل"} + AL{"آلبانی"} + AM{"ارمنستان"} + AN{"آنتیل هلند"} + AO{"آنگولا"} + AQ{"جنوبگان"} + AR{"آرژانتین"} + AS{"ساموای امریکا"} + AT{"اتریش"} + AU{"استرالیا"} + AW{"آروبا"} + AZ{"آذربایجان"} + BA{"بوسنی و هرزگوین"} + BB{"باربادوس"} + BD{"بنگلادش"} + BE{"بلژیک"} + BF{"بورکینافاسو"} + BG{"بلغارستان"} + BH{"بحرین"} + BI{"بوروندی"} + BJ{"بنین"} + BM{"برمودا"} + BN{"برونئی"} + BO{"بولیوی"} + BR{"برزیل"} + BS{"باهاما"} + BT{"بوتان"} + BV{"جزیره‌ی بووت"} + BW{"بوتسوانا"} + BY{"بیلوروسی"} + BZ{"بلیز"} + CA{"کانادا"} + CC{"جزایر کوکوس"} + CD{"جمهوری دموکراتیک کنگو"} + CF{"جمهوری افریقای مرکزی"} + CG{"کونگو"} + CH{"سوئیس"} + CI{"ساحل عاج"} + CK{"جزایر کوک"} + CL{"شیلی"} + CM{"کامرون"} + CN{"چین"} + CO{"کلمبیا"} + CR{"کاستاریکا"} + CU{"کوبا"} + CV{"کیپ ورد"} + CX{"جزیره‌ی کریسمس"} + CY{"قبرس"} + CZ{"جمهوری چک"} + DE{"آلمان"} + DJ{"جیبوتی"} + DK{"دانمارک"} + DM{"دومینیکا"} + DO{"جمهوری دومینیکن"} + DZ{"الجزایر"} + EC{"اکوادر"} + EE{"استونی"} + EG{"مصر"} + EH{"صحرای غربی"} + ER{"اریتره"} + ES{"اسپانیا"} + ET{"اتیوپی"} + FI{"فنلاند"} + FJ{"فیجی"} + FK{"جزایر فالکلند"} + FM{"میکرونزی"} + FO{"جزایر فارو"} + FR{"فرانسه"} + GA{"گابون"} + GB{"انگلستان"} + GD{"گرانادا"} + GE{"گرجستان"} + GF{"گویان فرانسه"} + GH{"غنا"} + GI{"گیبرالتار"} + GL{"گروئنلند"} + GM{"گامبیا"} + GN{"گینه"} + GP{"گوادلوپ"} + GQ{"گینه‌ی استوایی"} + GR{"یونان"} + GS{"جورجیای جنوبی و جزایر ساندویچ جنوبی"} + GT{"گواتمالا"} + GU{"گوام"} + GW{"گینه‌ی بیسائو"} + GY{"گویان"} + HM{"جزیره‌ی هرد و جزایر مک‌دونالد"} + HN{"هندوراس"} + HR{"کرواسی"} + HT{"هاییتی"} + HU{"مجارستان"} + ID{"اندونزی"} + IE{"ایرلند"} + IL{"اسرائیل"} + IN{"هند"} + IO{"مستعمره‌های انگلستان در اقیانوس هند"} + IQ{"عراق"} + IR{"ایران"} + IS{"ایسلند"} + IT{"ایتالیا"} + JM{"جامائیکا"} + JO{"اردن"} + JP{"ژاپن"} + KE{"کنیا"} + KG{"قرقیزستان"} + KH{"کامبوج"} + KI{"کیریباتی"} + KM{"کومورو"} + KN{"سنت کیتس و نویس"} + KP{"کره‌ی شمالی"} + KR{"کره‌ی جنوبی"} + KW{"کویت"} + KY{"جزایر کِیمن"} + KZ{"قزاقستان"} + LA{"لائوس"} + LB{"لبنان"} + LC{"سنت لوسیا"} + LI{"لیختن‌اشتاین"} + LK{"سری‌لانکا"} + LR{"لیبریا"} + LS{"لسوتو"} + LT{"لیتوانی"} + LU{"لوکزامبورگ"} + LV{"لتونی"} + LY{"لیبی"} + MA{"مراکش"} + MC{"موناکو"} + MD{"مولدووا"} + MG{"ماداگاسکار"} + MH{"جزایر مارشال"} + MK{"مقدونیه"} + ML{"مالی"} + MM{"میانمار"} + MN{"مغولستان"} + MP{"جزایر ماریانای شمالی"} + MQ{"مارتینیک"} + MR{"موریتانی"} + MS{"مونت‌سرات"} + MT{"مالت"} + MU{"موریتیوس"} + MV{"مالدیو"} + MW{"مالاوی"} + MX{"مکزیک"} + MY{"مالزی"} + MZ{"موزامبیک"} + NA{"نامیبیا"} + NC{"کالدونیای جدید"} + NE{"نیجر"} + NF{"جزیره‌ی نورفولک"} + NG{"نیجریه"} + NI{"نیکاراگوئه"} + NL{"هلند"} + NO{"نروژ"} + NP{"نپال"} + NR{"نائورو"} + NU{"نیوئه"} + NZ{"زلاند نو"} + OM{"عمان"} + PA{"پاناما"} + PE{"پرو"} + PF{"پلی‌نزی فرانسه"} + PG{"پاپوا گینه‌ی نو"} + PH{"فیلیپین"} + PK{"پاکستان"} + PL{"لهستان"} + PM{"سنت پیر و میکلون"} + PN{"پیتکایرن"} + PR{"پورتو ریکو"} + PT{"پرتغال"} + PW{"پالائو"} + PY{"پاراگوئه"} + QA{"قطر"} + RE{"ریونیون"} + RO{"رومانی"} + RU{"روسیه"} + RW{"رواندا"} + SA{"عربستان سعودی"} + SB{"جزایر سلیمان"} + SC{"سیشل"} + SD{"سودان"} + SE{"سوئد"} + SG{"سنگاپور"} + SH{"سنت هلن"} + SI{"اسلوونی"} + SJ{"اسوالبارد و جان ماین"} + SK{"اسلواکی"} + SL{"سیرالئون"} + SM{"سان مارینو"} + SN{"سنگال"} + SO{"سومالی"} + SP{"صربستان"} + SR{"سورینام"} + ST{"سائو تومه و پرینسیپه"} + SV{"السالوادور"} + SY{"سوریه"} + SZ{"سوازیلند"} + TC{"جزایر ترک و کایکوس"} + TD{"چاد"} + TF{"مستعمره‌های جنوبی فرانسه"} + TG{"توگو"} + TH{"تایلند"} + TJ{"تاجیکستان"} + TK{"توکلائو"} + TL{"تیمور شرقی"} + TM{"ترکمنستان"} + TN{"تونس"} + TO{"تونگا"} + TR{"ترکیه"} + TT{"ترینیداد و توباگو"} + TV{"تووالو"} + TW{"تایوان"} + TZ{"تانزانیا"} + UA{"اوکراین"} + UG{"اوگاندا"} + UM{"جزایر کوچک دورافتاده‌ی ایالات متحده"} + US{"ایالات متحده‌ی امریکا"} + UY{"اوروگوئه"} + UZ{"ازبکستان"} + VA{"واتیکان"} + VC{"سنت وینسنت و گرنادین"} + VE{"ونزوئلا"} + VG{"جزایر ویرجین انگلستان"} + VI{"جزایر ویرجین ایالات متحده"} + VN{"ویتنام"} + VU{"وانواتو"} + WF{"والیس و فیوتونا"} + WS{"ساموا"} + YE{"یمن"} + YT{"مایوت"} + YU{"یوگسلاوی"} + ZA{"افریقای جنوبی"} + ZM{"زامبیا"} + ZW{"زیمبابوه"} + } + Currencies{ + AFA{ + "افغانی", + "افغانی", + } + IRR{ + "﷼", + "IRR", + } + } + ExemplarCharacters{"[ء-ؤئ-غفقل-وً-ْٰٔپچژکگی‌‍‏‎]"} + Languages{ + aa{"آفاری"} + ab{"آبخازی"} + ae{"اوستایی"} + af{"آفریکانس"} + afa{"افریقا و آسیایی (غیره)"} + am{"امهری"} + ang{"انگلیسی باستان (حدود ۴۵۰-۱۱۰۰ م.)"} + apa{"زبان‌های آپاچیایی"} + ar{"عربی"} + arc{"آرامی"} + art{"ساخته‌گی (غیره)"} + as{"آسامی"} + aus{"زبان‌های استرالیایی"} + ay{"آیمارایی"} + az{"آذربایجانی"} + ba{"باشکیر"} + bal{"بلوچی"} + bat{"بالتیکی (غیره)"} + be{"بلوروسی"} + bg{"بلغاری"} + bh{"بیهاری"} + bho{"بوجپوری"} + bi{"بیسلاما"} + bn{"بنگالی"} + bo{"تبتی"} + bs{"بوسنیایی"} + ca{"کاتالونیایی"} + cai{"سرخ‌پوستی امریکای مرکزی (غیره)"} + ce{"چچنی"} + cel{"سلتی (غیره)"} + ch{"چامورویی"} + chr{"چروکی"} + cop{"قبطی"} + cs{"چکی"} + cu{"اسلاوی کلیسایی"} + cv{"چوواشی"} + cy{"ویلزی"} + da{"دانمارکی"} + dak{"داکوتایی"} + de{"آلمانی"} + dra{"دراویدی (غیره)"} + dum{"هلندی میانه (حدود ۱۰۵۰-۱۳۵۰ م.)"} + dz{"بوتانی"} + egy{"مصری (باستانی)"} + el{"یونانی"} + en{"انگلیسی"} + enm{"انگلیسی میانه (۱۱۰۰ -۱۵۰۰ م.)"} + eo{"اسپرانتو"} + es{"اسپانیایی"} + et{"استونیایی"} + eu{"باسکی"} + fa{"فارسی"} + fi{"فنلاندی"} + fj{"فیجیایی"} + fo{"فارویی"} + fr{"فرانسوی"} + frm{"فرانسوی میانه (حدود ۱۴۰۰-۱۶۰۰ م.)"} + fro{"فرانسوی قدیم (۸۴۲-حدود ۱۴۰۰ م.)"} + ga{"ایرلندی"} + gaa{"گا"} + gem{"ژرمنی (غیره)"} + gmh{"آلمانی علیای میانه (حدود ۱۰۵۰-۱۵۰۰)"} + gn{"گوارانی"} + goh{"آلمانی علیای باستان (حدود ۷۵۰-۱۰۵۰)"} + got{"گوتیک"} + grc{"یونانی کهن (تا ۱۴۵۳ م.)"} + gu{"گجراتی"} + gv{"مانی"} + ha{"هوسیایی"} + haw{"هاوائیایی"} + he{"عبری"} + hi{"هندی"} + hit{"هیتی"} + hr{"کرواتی"} + hu{"مجاری"} + hy{"ارمنی"} + hz{"هریرویی"} + ia{"میان‌زبان"} + id{"اندونزیایی"} + ik{"اینوپیک"} + inc{"هندیک (غیره)"} + ine{"هندوارودپایی"} + ira{"ایرانی"} + is{"ایسلندی"} + it{"ایتالیایی"} + iu{"اینوکیتوت"} + ja{"ژاپنی"} + jpr{"فارسی یهودی"} + jrb{"عربی یهودی"} + jv{"جاوه‌ای"} + ka{"گرجی"} + kk{"قزاقی"} + km{"خمری"} + kn{"کاناده‌ای"} + ko{"کره‌ای"} + kok{"کنکانی"} + ks{"کشمیری"} + ku{"کردی"} + kv{"کومیایی"} + kw{"کرنوالی"} + ky{"قرقیزی"} + la{"لاتینی"} + lb{"لتسه‌بورگیش"} + ln{"لینگالا"} + lo{"لائوسی"} + lt{"لیتوانیایی"} + lv{"لتونیایی"} + map{"آسترونیزیایی"} + mg{"مالاگاسیایی"} + mga{"ایرلندی میانه (۹۰۰-۱۲۰۰ م.)"} + mh{"مارشالی"} + mi{"مائوریایی"} + mis{"زبان‌های متفرقه"} + mk{"مقدونی"} + ml{"مالایالامی"} + mn{"مغولی"} + mo{"مولداویایی"} + moh{"موهاکی"} + mr{"مراتی"} + ms{"مالزیایی"} + mt{"مالتی"} + mul{"چندین زبان"} + my{"برمه‌ای"} + myn{"مایاییک"} + na{"نائورویی"} + nai{"سرخ‌پوستی امریکای شمالی (غیره)"} + nb{"بوکسمال نروژی"} + nd{"انده‌بله‌ای شمالی"} + nds{"آلمانی سفلی؛ ساکسون سفلب"} + ne{"نپالی"} + nl{"هلندی"} + nn{"نینورسک نروژی"} + no{"نروژی"} + nr{"انده‌بله‌ای جنوبی"} + nv{"ناواهویی"} + or{"اوریه‌ای"} + ota{"ترکی (امپراتوری عثمانی)"} + pa{"پنجابی"} + paa{"پاپوایی (غیره)"} + pal{"پهلوی"} + peo{"فارسی قدیم (حدود ۶۰۰-۴۰۰ ق.م.)"} + phi{"فیایپینی (غیره)"} + phn{"فنیقی"} + pi{"پالی"} + pl{"لهستانی"} + ps{"پشتو"} + pt{"پرتغالی"} + qu{"کچوایی"} + ro{"رومانیایی"} + root{"ریشه"} + ru{"روسی"} + rw{"کینیارواندایی"} + sa{"سنسکریت"} + sai{"سرخ‌پوستی امریکای جنوبی (غیره)"} + sc{"ساردینیایی"} + sco{"اسکاتلندی"} + sd{"سندی"} + sem{"سامی"} + sg{"سانگویی"} + sga{"ایرلندی باستان (تا ۹۰۰ م.)"} + sgn{"زبان‌های نشانه‌ای"} + sh{"صرب و کرواتی"} + si{"سینهالی"} + sit{"چین و تبتی (غیره)"} + sk{"اسلواکی"} + sl{"اسلووینیایی"} + sm{"ساموآیی"} + sn{"شونایی"} + so{"سومالیایی"} + sq{"آلبانیایی"} + sr{"صربی"} + st{"سوتویی جنوبی"} + su{"سوندایی"} + sux{"سومری"} + sv{"سوئدی"} + sw{"سواحلی"} + syr{"سریانی"} + ta{"تامیلی"} + te{"تلوگویی"} + tg{"تاجیکی"} + th{"تایلندی"} + ti{"تیگرینیایی"} + tk{"ترکمتی"} + tl{"تاگالوگی"} + tn{"تسوانایی"} + to{"تونگایی (جزایر تونگا)"} + tr{"ترکی"} + ts{"تسونگایی"} + tt{"تاتاری"} + tw{"توی‌یایی"} + ty{"تاهیتیایی"} + ug{"اویغوری"} + uk{"اوکراینی"} + und{"نامشخص"} + ur{"اردو"} + uz{"ازبکی"} + vi{"ویتنامی"} + vo{"ولاپوک"} + wo{"ولوفی"} + xh{"خوسایی"} + yi{"یدی"} + yo{"یوروبایی"} + zh{"چینی"} + zu{"زولویی"} + } + LocaleScript{ + "Arab", + } + Scripts{ + Arab{"عربی"} + Armn{"ارمنی"} + Beng{"بنگالی"} + Bopo{"بوپوموفو"} + Cher{"چروکیایی"} + Copt{"قبطی"} + Cyrl{"سیریلی"} + Deva{"دوناگری"} + Ethi{"اتیوپیایی"} + Geor{"گرجی"} + Goth{"گوتیک"} + Grek{"یونانی"} + Gujr{"گجراتی"} + Hang{"هانگول"} + Hani{"هان"} + Hebr{"عبری"} + Hira{"هیراگانا"} + Kana{"کاتاکانا"} + Khmr{"خمری"} + Knda{"کاناده‌ای"} + Laoo{"لائوسی"} + Latn{"لاتین"} + Mlym{"مالایالامی"} + Mong{"مغولی"} + Mymr{"میانمار"} + Orya{"اوریه‌ای"} + Qaai{"موروثی"} + Runr{"رونی"} + Syrc{"آسوری"} + Taml{"تامیل"} + Telu{"تلوگویی"} + Thai{"تایلندی"} + Tibt{"تبتی"} + Yiii{"یی"} + Zyyy{"مشترک"} + } + Version{"1.2"} + calendar{ + gregorian{ + AmPmMarkers{ + "ق.ظ.", + "ب.ظ.", + } + DateTimePatterns{ + "HH:mm:ss (z)", + "HH:mm:ss (z)", + "HH:mm:ss", + "HH:mm", + "EEEE، d MMMM yyyy", + "d MMMM yyyy", + "yyyy/MM/d", + "yyyy/MM/d", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "ی.", + "د.", + "س.", + "چ.", + "پ.", + "ج.", + "ش.", + } + wide{ + "یک‌شنبه", + "دوشنبه", + "سه‌شنبه", + "چهارشنبه", + "پنج‌شنبه", + "جمعه", + "شنبه", + } + } + } + eras{ + abbreviated{ + "ق.م.", + "م.", + } + } + monthNames{ + format{ + abbreviated{ + "ژان", + "فور", + "مار", + "آور", + "مـه", + "ژون", + "ژوی", + "اوت", + "سپت", + "اکت", + "نوا", + "دسا", + } + wide{ + "ژانویه", + "فوریه", + "مارس", + "آوریل", + "مه", + "ژوئن", + "ژوئیه", + "اوت", + "سپتامبر", + "اکتبر", + "نوامبر", + "دسامبر", + } + } + } + } + } + zoneStrings{ + { + "Asia/Tehran", + "وقت استاندارد تهران", + "IRST", + "وقت تابستانی تهران", + "IRDT", + "تهران", + } + } +} diff --git a/icuSources/data/locales/fa_AF.txt b/icuSources/data/locales/fa_AF.txt new file mode 100644 index 00000000..6afe05b1 --- /dev/null +++ b/icuSources/data/locales/fa_AF.txt @@ -0,0 +1,201 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/fa_AF.xml +// * +// *************************************************************************** +fa_AF{ + Countries{ + AD{"اندورا"} + AE{"امارات متحدهٔ عربی"} + AG{"انتیگوا و باربودا"} + AL{"البانیا"} + AO{"انگولا"} + AR{"ارجنتاین"} + AU{"آسترالیا"} + BA{"بوسنیا و هرزه‌گوینا"} + BD{"بنگله‌دیش"} + BE{"بلجیم"} + BG{"بلغاریا"} + BN{"برونی"} + BO{"بولیویا"} + BR{"برازیل"} + BS{"بهاماس"} + BY{"روسیهٔ سفید"} + CD{"جمهوری دموکراتیک کانگو"} + CF{"افریقای مرکزی"} + CG{"کانگو"} + CH{"سویس"} + CL{"چلی"} + CO{"کولمبیا"} + CR{"کاستریکا"} + CU{"کیوبا"} + DK{"دنمارک"} + EC{"اکوادور"} + EE{"استونیا"} + ER{"اریتریا"} + ES{"هسپانیه"} + ET{"ایتوپیا"} + FI{"فنلند"} + FM{"میکرونزیا"} + GD{"گرینادا"} + GN{"گینیا"} + GQ{"گینیا استوایی"} + GT{"گواتیمالا"} + GW{"گینیا بیسائو"} + GY{"گیانا"} + HN{"هاندوراس"} + HR{"کروشیا"} + HT{"هایتی"} + ID{"اندونیزیا"} + IE{"آیرلند"} + IS{"آیسلند"} + JP{"جاپان"} + KE{"کینیا"} + KG{"قرغزستان"} + KH{"کمپوچیا"} + KM{"کومور"} + KN{"سنت کیتس و نیویس"} + KP{"کوریای شمالی"} + KR{"کوریای جنوبی"} + LK{"سریلانکا"} + LS{"لیسوتو"} + LT{"لتوانیا"} + LV{"لاتویا"} + LY{"لیبیا"} + MG{"مادغاسکر"} + MN{"منگولیا"} + MR{"موریتانیا"} + MT{"مالتا"} + MX{"مکسیکو"} + MY{"مالیزیا"} + MZ{"موزمبیق"} + NG{"نیجریا"} + NI{"نیکاراگوا"} + NL{"هالند"} + NO{"ناروی"} + NP{"نیپال"} + NZ{"زیلاند جدید"} + PA{"پانامه"} + PE{"پیرو"} + PG{"پاپوا نیو گینیا"} + PL{"پولند"} + PT{"پرتگال"} + PY{"پاراگوای"} + RO{"رومانیا"} + RW{"روآندا"} + SB{"جزایر سلومون"} + SE{"سویدن"} + SG{"سینگاپور"} + SI{"سلونیا"} + SK{"سلواکیا"} + SL{"سیرالیون"} + SN{"سینیگال"} + SO{"سومالیه"} + ST{"سائو تومه و پرینسیپ"} + SV{"السلوادور"} + TJ{"تاجکستان"} + UA{"اکراین"} + US{"ایالات متحدهٔ امریکا"} + UY{"یوروگوای"} + VC{"سنت وینسنت و گرینادین"} + VE{"ونزویلا"} + WS{"ساموآی غربی"} + YU{"یوگوسلاویا"} + ZW{"زیمبابوی"} + } + Languages{ + es{"هسپانوی"} + fa{"دری"} + fi{"فنلندی"} + ga{"آیرلندی"} + hr{"کروشیایی"} + id{"اندونیزیایی"} + is{"آیسلندی"} + it{"ایتالوی"} + ja{"جاپانی"} + ko{"کوریایی"} + ky{"قرغزی"} + mn{"مغلی"} + ne{"نیپالی"} + nl{"هالندی"} + no{"نارویژی"} + pl{"پولندی"} + pt{"پرتگالی"} + sv{"سویدنی"} + tg{"تاجکی"} + } + NumberElements{ + "٫", + "٬", + ";", + "٪", + "۰", + "#", + "−", + "×۱۰^", + "‰", + "∞", + "�", + "+", + } + NumberPatterns{ + "#,##0.###;-#,##0.###", + "#,##0 ¤;-#,##0 ¤", + "#,##0%", + "#E0", + } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 7, + 1, + } + monthNames{ + format{ + abbreviated{ + "جنو", + "فبر", + "مار", + "اپر", + "مـی", + "جون", + "جول", + "اگس", + "سپت", + "اکت", + "نوم", + "دسم", + } + wide{ + "جنوری", + "فبروری", + "مارچ", + "اپریل", + "می", + "جون", + "جولای", + "اگست", + "سپتمبر", + "اکتوبر", + "نومبر", + "دسمبر", + } + } + } + } + } + zoneStrings{ + { + "Asia/Kabul", + "وقت افغانستان", + "AFT", + "وقت افغانستان", + "AFT", + "کابل", + } + } +} diff --git a/icuSources/data/locales/fa_IN.txt b/icuSources/data/locales/fa_IN.txt deleted file mode 100644 index 4550b7e0..00000000 --- a/icuSources/data/locales/fa_IN.txt +++ /dev/null @@ -1,41 +0,0 @@ -// *************************************************************************** -// * -// * Copyright (C) 2001-2002, International Business Machines -// * Corporation and others. All Rights Reserved. -// * Generated from Universal Locales for Linux Project -// *************************************************************************** - -fa_IN { - Version{ "1.2" } - DateTimePatterns { - "h:mm:ss a z", - "h:mm:ss a z", - "h:mm:ss a", - "h:mm a", - "EEEE d MMMM yyyy", - "d MMMM yyyy", - "dd-MM-yyyy", - "d-M-yy", - "{1} {0}", - } -// NumberElements { -// ".", -// ",", -// ";", -// "%", -// "0", -// "#", -// "-", -// "E", -// "\u2030", -// "\u221e", -// "\ufffd", -// } - NumberPatterns { - "##,##,##0.###;-##,##,##0.###", - "\u00A4##,##,##0.00;-\u00A4##,##,##0.00", - "##,##,##0%", - "#E0", - } -// LocaleString{ "fa_IN" } -} diff --git a/icuSources/data/locales/fa_IR.txt b/icuSources/data/locales/fa_IR.txt index 6fbe426b..5452c219 100644 --- a/icuSources/data/locales/fa_IR.txt +++ b/icuSources/data/locales/fa_IR.txt @@ -1,38 +1,39 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/fa_IR.xml // * // *************************************************************************** - -// Created by Roozbeh Pournader - -fa_IR { - Version { "3.0" } - DateTimeElements:intvector { - 7, // Saturday - 1, +fa_IR{ + NumberElements{ + "٫", + "٬", + ";", + "٪", + "۰", + "#", + "-", + "×۱۰^", + "‰", + "∞", + "�", + "+", } - LocaleID:int { 0x0429 } - NumberPatterns { - "#,##0.###;\u2212#,##0.###", - "#,##0 \u00a4;\u2212#,##0 \u00a4", + NumberPatterns{ + "#,##0.###;−#,##0.###", + "#,##0 ¤;−#,##0 ¤", "%#,##0", "#E0", } - NumberElements { - "\u066B", - "\u066C", - ";", - "\u066A", - "\u06F0", - "#", - "-", - "\u00D7\u06F1\u06F0^", - "\u2030", - "\u221E", - "\uFFFD", - "\u066B", + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 7, + 1, + } + } } } - diff --git a/icuSources/data/locales/fi.txt b/icuSources/data/locales/fi.txt index 1066ace7..c4062a4c 100644 --- a/icuSources/data/locales/fi.txt +++ b/icuSources/data/locales/fi.txt @@ -1,268 +1,2601 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2005 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/fi.xml // * // *************************************************************************** - -fi { - Version { "2.0" } - - "%%TRADITIONAL" { "Perinteinen" } - - "%%REVISED" { "Tarkistettu" } - - CollationElements { - Version { "1.0" } - Sequence { "& V << w <<< W & Z < a\u030A <<< A\u030A< a\u0308 <<< A\u0308 " - "< o\u0308 <<< O\u0308< o\u030B <<< O\u030B << \u00F8 <<< \u00D8& Y << u\u030B<<< U\u030B" - " << u\u0308 <<< U\u0308" - } - } - Countries { - AE { "Arabiemiirikunnat" } - AR { "Argentiina" } - AT { "It\u00e4valta" } - BA { "Bosnia ja Hertsegovina" } - BE { "Belgia" } - BR { "Brasilia" } - BY { "Valko-Ven\u00e4j\u00e4" } - CA { "Kanada" } - CH { "Sveitsi" } - CN { "Kiina" } - CO { "Kolumbia" } - CZ { "Tsekin tasavalta" } - DE { "Saksa" } - DK { "Tanska" } - DO { "Dominikaaninen tasavalta" } - EC { "Equador" } - EE { "Viro" } - EG { "Egypti" } - ES { "Espanja" } - ET { "Etiopia" } - FI { "Suomi" } - FO { "F\u00e4rsaaret" } - FR { "Ranska" } - GB { "Iso-Britannia" } - GL { "Gr\u00f6nlanti" } - GR { "Kreikka" } - HK { "Hongkongin erityishallintoalue" } - HR { "Kroatia" } - HU { "Unkari" } - IE { "Irlanti" } - IN { "Intia" } - IQ { "Irak" } - IS { "Islanti" } - IT { "Italia" } - JO { "Jordania" } - JP { "Japani" } - KE { "Kenia" } - KR { "Korean tasavalta" } - LB { "Libanon" } - LT { "Liettua" } - LU { "Luxemburg" } - MA { "Marokko" } - MK { "Makedonia" } - MO { "Macaon erityishallintoalue" } - MX { "Meksiko" } - NL { "Alankomaat" } - NO { "Norja" } - NZ { "Uusi Seelanti" } - PH { "Filippiinit" } - PL { "Puola" } - PT { "Portugali" } - RU { "Ven\u00e4j\u00e4" } - SA { "Saudi-Arabia" } - SE { "Ruotsi" } - SY { "Syyria" } - TH { "Thaimaa" } - TR { "Turkki" } - TZ { "Tansania" } - UA { "Ukraina" } - US { "Yhdysvallat" } - VI { "Yhdysvaltain Neitsytsaaret" } - YE { "Jemen" } - YU { "Jugoslavia" } - ZA { "Etel\u00e4-Afrikka" } - } - DateTimeElements:intvector { - 2, - 4, +/** + * ICU source: ../../../locale/icu/main/fi.xml + */ +fi{ + Countries{ + AD{"Andorra"} + AE{"Arabiemiirikunnat"} + AF{"Afganistan"} + AG{"Antigua ja Barbuda"} + AI{"Anguilla"} + AL{"Albania"} + AM{"Armenia"} + AN{"Alankomaiden Antillit"} + AO{"Angola"} + AQ{"Antarktis"} + AR{"Argentiina"} + AS{"Amerikan Samoa"} + AT{"Itävalta"} + AU{"Australia"} + AW{"Aruba"} + AZ{"Azerbaidzan"} + BA{"Bosnia ja Hertsegovina"} + BB{"Barbados"} + BD{"Bangladesh"} + BE{"Belgia"} + BF{"Burkina Faso"} + BG{"Bulgaria"} + BH{"Bahrain"} + BI{"Burundi"} + BJ{"Benin"} + BM{"Bermuda"} + BN{"Brunei"} + BO{"Bolivia"} + BR{"Brasilia"} + BS{"Bahama"} + BT{"Bhutan"} + BV{"Bouvet’nsaari"} + BW{"Botswana"} + BY{"Valko-Venäjä"} + BZ{"Belize"} + CA{"Kanada"} + CC{"Kookossaaret"} + CD{"Kongon demokraattinen tasavalta"} + CF{"Keski-Afrikan tasavalta"} + CG{"Kongo"} + CH{"Sveitsi"} + CI{"Norsunluurannikko"} + CK{"Cookinsaaret"} + CL{"Chile"} + CM{"Kamerun"} + CN{"Kiina"} + CO{"Kolumbia"} + CR{"Costa Rica"} + CU{"Kuuba"} + CV{"Kap Verde"} + CX{"Joulusaari"} + CY{"Kypros"} + CZ{"Tsekin tasavalta"} + DE{"Saksa"} + DJ{"Djibouti"} + DK{"Tanska"} + DM{"Dominica"} + DO{"Dominikaaninen tasavalta"} + DZ{"Algeria"} + EC{"Ecuador"} + EE{"Viro"} + EG{"Egypti"} + EH{"Länsi-Sahara"} + ER{"Eritrea"} + ES{"Espanja"} + ET{"Etiopia"} + FI{"Suomi"} + FJ{"Fidzi"} + FK{"Falklandinsaaret"} + FM{"Mikronesia"} + FO{"Färsaaret"} + FR{"Ranska"} + GA{"Gabon"} + GB{"Iso-Britannia"} + GD{"Grenada"} + GE{"Georgia"} + GF{"Ranskan Guayana"} + GH{"Ghana"} + GI{"Gibraltar"} + GL{"Grönlanti"} + GM{"Gambia"} + GN{"Guinea"} + GP{"Guadeloupe"} + GQ{"Päiväntasaajan Guinea"} + GR{"Kreikka"} + GS{"Etelä-Georgia ja Eteläiset Sandwichsaaret"} + GT{"Guatemala"} + GU{"Guam"} + GW{"Guinea-Bissau"} + GY{"Guyana"} + HK{"Hongkongin erityishallintoalue"} + HM{"Heard ja McDonaldinsaaret"} + HN{"Honduras"} + HR{"Kroatia"} + HT{"Haiti"} + HU{"Unkari"} + ID{"Indonesia"} + IE{"Irlanti"} + IL{"Israel"} + IN{"Intia"} + IO{"Brittiläinen Intian valtameren alue"} + IQ{"Irak"} + IR{"Iran"} + IS{"Islanti"} + IT{"Italia"} + JM{"Jamaika"} + JO{"Jordania"} + JP{"Japani"} + KE{"Kenia"} + KG{"Kirgisia"} + KH{"Kambodza"} + KI{"Kiribati"} + KM{"Komorit"} + KN{"Saint Kitts ja Nevis"} + KP{"Pohjois-Korea"} + KR{"Korean tasavalta"} + KW{"Kuwait"} + KY{"Caymansaaret"} + KZ{"Kazakstan"} + LA{"Laos"} + LB{"Libanon"} + LC{"Saint Lucia"} + LI{"Liechtenstein"} + LK{"Sri Lanka"} + LR{"Liberia"} + LS{"Lesotho"} + LT{"Liettua"} + LU{"Luxemburg"} + LV{"Latvia"} + LY{"Libya"} + MA{"Marokko"} + MC{"Monaco"} + MD{"Moldova"} + MG{"Madagaskar"} + MH{"Marshallinsaaret"} + MK{"Makedonia"} + ML{"Mali"} + MM{"Myanmar"} + MN{"Mongolia"} + MO{"Macaon erityishallintoalue"} + MP{"Pohjois-Mariaanit"} + MQ{"Martinique"} + MR{"Mauritania"} + MS{"Montserrat"} + MT{"Malta"} + MU{"Mauritius"} + MV{"Malediivit"} + MW{"Malawi"} + MX{"Meksiko"} + MY{"Malesia"} + MZ{"Mosambik"} + NA{"Namibia"} + NC{"Uusi-Kaledonia"} + NE{"Niger"} + NF{"Norfolkinsaari"} + NG{"Nigeria"} + NI{"Nicaragua"} + NL{"Alankomaat"} + NO{"Norja"} + NP{"Nepal"} + NR{"Nauru"} + NU{"Niue"} + NZ{"Uusi-Seelanti"} + OM{"Oman"} + PA{"Panama"} + PE{"Peru"} + PF{"Ranskan Polynesia"} + PG{"Papua-Uusi-Guinea"} + PH{"Filippiinit"} + PK{"Pakistan"} + PL{"Puola"} + PM{"Saint-Pierre ja Miquelon"} + PN{"Pitcairn"} + PR{"Puerto Rico"} + PS{"Palestiina"} + PT{"Portugali"} + PW{"Palau"} + PY{"Paraguay"} + QA{"Qatar"} + RE{"Réunion"} + RO{"Romania"} + RU{"Venäjä"} + RW{"Ruanda"} + SA{"Saudi-Arabia"} + SB{"Salomonsaaret"} + SC{"Seychellit"} + SD{"Sudan"} + SE{"Ruotsi"} + SG{"Singapore"} + SH{"Saint Helena"} + SI{"Slovenia"} + SJ{"Huippuvuoret ja Jan Mayen"} + SK{"Slovakia"} + SL{"Sierra Leone"} + SM{"San Marino"} + SN{"Senegal"} + SO{"Somalia"} + SP{"Serbia"} + SR{"Suriname"} + ST{"Sao Tome ja Principe"} + SV{"El Salvador"} + SY{"Syyria"} + SZ{"Swazimaa"} + TC{"Turks- ja Caicossaaret"} + TD{"Tsad"} + TF{"Ranskan eteläiset alueet"} + TG{"Togo"} + TH{"Thaimaa"} + TJ{"Tadzikistan"} + TK{"Tokelau"} + TL{"Timor-Leste"} + TM{"Turkmenistan"} + TN{"Tunisia"} + TO{"Tonga"} + TR{"Turkki"} + TT{"Trinidad ja Tobago"} + TV{"Tuvalu"} + TW{"Taiwan"} + TZ{"Tansania"} + UA{"Ukraina"} + UG{"Uganda"} + UM{"Yhdysvaltain pienet erillissaaret"} + US{"Yhdysvallat"} + UY{"Uruguay"} + UZ{"Uzbekistan"} + VA{"Vatikaani"} + VC{"Saint Vincent ja Grenadiinit"} + VE{"Venezuela"} + VG{"Brittiläiset Neitsytsaaret"} + VI{"Yhdysvaltain Neitsytsaaret"} + VN{"Vietnam"} + VU{"Vanuatu"} + WF{"Wallis ja Futuna"} + WS{"Samoa"} + YE{"Jemen"} + YT{"Mayotte"} + YU{"Jugoslavia"} + ZA{"Etelä-Afrikka"} + ZM{"Sambia"} + ZW{"Zimbabwe"} } - DateTimePatterns { - "HH:mm:ss z", - "HH:mm:ss z", - "HH:mm:ss", - "HH:mm", - "d. MMMM'ta 'yyyy", - "d. MMMM'ta 'yyyy", - "d.M.yyyy", - "d.M.yyyy", - "{1} {0}", - } - DayAbbreviations { - "su", - "ma", - "ti", - "ke", - "to", - "pe", - "la", - } - DayNames { - "sunnuntai", - "maanantai", - "tiistai", - "keskiviikko", - "torstai", - "perjantai", - "lauantai", + Currencies{ + ADD{ + "ADD", + "Andorran dinaari", + } + ADP{ + "ADP", + "Andorran peseta", + } + AED{ + "AED", + "Arabiemiirikuntien dirhami", + } + AFA{ + "AFA", + "Afgaani (1927-2002)", + } + AFN{ + "Af", + "Afgaani", + } + AIF{ + "AIF", + "Affarsin ja Issasin frangi", + } + ALK{ + "ALK", + "Albanian lek (1946-1961)", + } + ALL{ + "lek", + "Albanian lek", + } + ALV{ + "ALV", + "Albanian lek valute", + } + ALX{ + "ALX", + "Albanian dollarin FEC", + } + AMD{ + "dram", + "Armenian dram", + } + ANG{ + "NA f.", + "Alankomaiden Antillien guldeni", + } + AOA{ + "AOA", + "Angolan kwanza", + } + AOK{ + "AOK", + "Angolan kwanza (1977-1990)", + } + AON{ + "AON", + "Angolan uusi kwanza (1990-2000)", + } + AOR{ + "AOR", + "Angolan kwanza reajustado (1995-1999)", + } + AOS{ + "AOS", + "Angolan escudo", + } + ARA{ + "ARA", + "Argentiinan austral", + } + ARM{ + "ARM", + "Argentiinan peso moneda nacional", + } + ARP{ + "ARP", + "Argentiinan peso (1983-1985)", + } + ARS{ + "Arg$", + "Argentiinan peso", + } + ATS{ + "ATS", + "Itävallan shillinki", + } + AUD{ + "$A", + "Australian dollari", + } + AUP{ + "AUP", + "Australian punta", + } + AWG{ + "AWG", + "Aruban guldeni", + } + AZM{ + "AZM", + "Azerbaidžanin manat", + } + BAD{ + "BAD", + "Bosnia-Hertsegovinan dinaari", + } + BAM{ + "KM", + "Bosnia-Hertsegovinan vaihdettava markka", + } + BAN{ + "BAN", + "Bosnia-Hertsegovinan uusi dinaari", + } + BBD{ + "BDS$", + "Barbadosin dollari", + } + BDT{ + "Tk", + "Bangladeshin taka", + } + BEC{ + "BEC", + "Belgian frangi (vaihdettava)", + } + BEF{ + "BF", + "Belgian frangi", + } + BEL{ + "BEL", + "Belgian frangi (rahoitus)", + } + BGL{ + "lev", + "Bulgarian kova leva", + } + BGM{ + "BGM", + "Bulgarian sosialistinen lev", + } + BGN{ + "BGN", + "Bulgarian uusi lev", + } + BGO{ + "BGO", + "Bulgarian lev (1879-1952)", + } + BGX{ + "BGX", + "Bulgarian lev FEC", + } + BHD{ + "BD", + "Bahrainin dinaari", + } + BIF{ + "Fbu", + "Burundin frangi", + } + BMD{ + "Ber$", + "Bermudan dollari", + } + BMP{ + "BMP", + "Bermudan punta", + } + BND{ + "BND", + "Brunein dollari", + } + BOB{ + "Bs", + "Boliviano", + } + BOL{ + "BOL", + "Boliviano (1863-1962)", + } + BOP{ + "BOP", + "Bolivian peso", + } + BOV{ + "BOV", + "Bolivian mvdol", + } + BRB{ + "BRB", + "Brasilian uusi cruzeiro (1967-1986)", + } + BRC{ + "BRC", + "Brasilian cruzado", + } + BRE{ + "BRE", + "Brasilian cruzeiro (1990-1993)", + } + BRL{ + "R$", + "Brasilian real", + } + BRN{ + "BRN", + "Brasilian uusi cruzado", + } + BRR{ + "BRR", + "Brasilian cruzeiro", + } + BRZ{ + "BRZ", + "Brazilian cruzeiro (1942-1967)", + } + BSD{ + "BSD", + "Bahaman dollari", + } + BSP{ + "BSP", + "Bahaman punta", + } + BTN{ + "Nu", + "Bhutanin ngultrum", + } + BTR{ + "BTR", + "Bhutanin rupia", + } + BUK{ + "BUK", + "Burman kyat", + } + BUR{ + "BUR", + "Burman rupia", + } + BWP{ + "BWP", + "Botswanan pula", + } + BYB{ + "BYB", + "Valko-Venäjän uusi rupla (1994-1999)", + } + BYL{ + "BYL", + "Valko-Venäjän rupla (1992-1994)", + } + BYR{ + "Rbl", + "Valko-Venäjän rupla", + } + BZD{ + "BZ$", + "Belizen dollari", + } + BZH{ + "BZH", + "Brittiläisen Hondurasin dollari", + } + CAD{ + "Can$", + "Kanadan dollari", + } + CDF{ + "CDF", + "Kongon kongolainen frangi", + } + CDG{ + "CDG", + "Kongon tasavallan frangi", + } + CDL{ + "CDL", + "Kongon zaire", + } + CFF{ + "CFF", + "Keski-Afrikan tasavallan CFA-frangi", + } + CHF{ + "SwF", + "Sveitsin frangi", + } + CKD{ + "CKD", + "Cookinsaarten dollari", + } + CLC{ + "CLC", + "Chilen condor", + } + CLE{ + "CLE", + "Chilen escudo", + } + CLF{ + "CLF", + "Chilen unidades de fomento", + } + CLP{ + "Ch$", + "Chilen peso", + } + CMF{ + "CMF", + "Kamerunin CFA-frangi", + } + CNP{ + "CNP", + "Kiinan jen min piao yuan", + } + CNX{ + "CNX", + "Kiinan US-dollarin FEC", + } + CNY{ + "Y", + "Kiinan yuan renminbi", + } + COB{ + "COB", + "Kolumbian paperipeso", + } + COF{ + "COF", + "Kongon CFA-frangi", + } + COP{ + "Col$", + "Kolumbian peso", + } + CRC{ + "C", + "Costa Rican colon", + } + CSC{ + "CSC", + "Tšekkoslovakian koruna", + } + CSK{ + "CSK", + "Tšekkoslovakian kova koruna", + } + CUP{ + "CUP", + "Kuuban peso", + } + CUX{ + "CUX", + "Kuuban FEC", + } + CVE{ + "CVEsc", + "Kap Verden escudo", + } + CWG{ + "CWG", + "Curacaon guldeni", + } + CYP{ + "£C", + "Kyproksen punta", + } + CZK{ + "CZK", + "Tšekin koruna", + } + DDM{ + "DDM", + "Itä-Saksan ostmark", + } + DEM{ + "DEM", + "Saksan markka", + } + DES{ + "DES", + "Saksan sperrmark", + } + DJF{ + "DF", + "Djiboutin frangi", + } + DKK{ + "DKr", + "Tanskan kruunu", + } + DOP{ + "RD$", + "Dominikaanisen tasavallan peso", + } + DZD{ + "DA", + "Algerian dinaari", + } + DZF{ + "DZF", + "Algerian uusi frangi", + } + DZG{ + "DZG", + "Algerian franc germinal", + } + ECS{ + "ECS", + "Ecuadorin sucre", + } + ECV{ + "ECV", + "Ecuadorin UVC", + } + EEK{ + "EEK", + "Viron kruunu", + } + EGP{ + "EGP", + "Egyptin punta", + } + ERN{ + "ERN", + "Eritrean nakfa", + } + ESP{ + "ESP", + "Espanjan peseta", + } + ETB{ + "Br", + "Etiopian birr", + } + ETD{ + "ETD", + "Etiopian dollari", + } + EUR{ + "€", + "euro", + } + FIM{ + "mk", + "Suomen markka", + } + FIN{ + "FIN", + "Suomen markka (1860-1962)", + } + FJD{ + "F$", + "Fidžin dollari", + } + FJP{ + "FJP", + "Fidžin punta", + } + FKP{ + "FKP", + "Falklandinsaarten punta", + } + FOK{ + "FOK", + "Färsaarten kruunu", + } + FRF{ + "FRF", + "Ranskan frangi", + } + FRG{ + "FRG", + "Ranskan franc germinal/franc poincare", + } + GAF{ + "GAF", + "Gabonin CFA-frangi", + } + GBP{ + "£", + "Iso-Britannian sterling-punta", + } + GEK{ + "GEK", + "Georgian kuponkilari", + } + GEL{ + "lari", + "Georgian lari", + } + GHC{ + "GHC", + "Ghanan cedi", + } + GHO{ + "GHO", + "Ghanan vanha cedi", + } + GHP{ + "GHP", + "Ghanan punta", + } + GHR{ + "GHR", + "Ghanan revalvoitu cedi", + } + GIP{ + "GIP", + "Gibraltarin punta", + } + GLK{ + "GLK", + "Grönlannin kruunu", + } + GMD{ + "GMD", + "Gambian dalasi", + } + GMP{ + "GMP", + "Gambian punta", + } + GNF{ + "GF", + "Guinean frangi", + } + GNI{ + "GNI", + "Guinean frangi (1960-1972)", + } + GNS{ + "GNS", + "Guinean syli", + } + GPF{ + "GPF", + "Guadeloupen frangi", + } + GQE{ + "GQE", + "Päiväntasaajan Guinean ekwele guineana", + } + GQF{ + "GQF", + "Päiväntasaajan Guinean frangi", + } + GQP{ + "GQP", + "Päiväntasaajan Guinean peseta guineana", + } + GRD{ + "GRD", + "Kreikan drakhma", + } + GRN{ + "GRN", + "Kreikan uusi drakhma", + } + GTQ{ + "Q", + "Guatemalan quetzal", + } + GUF{ + "GUF", + "Ranskan Guyanan franc guiana", + } + GWE{ + "GWE", + "Portugalin Guinean escudo", + } + GWM{ + "GWM", + "Portugalin Guinean mil reis", + } + GWP{ + "GWP", + "Guinea-Bissaun peso", + } + GYD{ + "G$", + "Guyanan dollari", + } + HKD{ + "HK$", + "Hong Kongin dollari", + } + HNL{ + "L", + "Hondurasin lempira", + } + HRD{ + "HRD", + "Kroatian dinaari", + } + HRK{ + "HRK", + "Kroatian kuna", + } + HTG{ + "HTG", + "Haitin gourde", + } + HUF{ + "Ft", + "Unkarin forintti", + } + IBP{ + "IBP", + "Pohjois-Irlannin punta", + } + IDG{ + "IDG", + "Indonesian nica guldeni", + } + IDJ{ + "IDJ", + "Indonesian java rupia", + } + IDN{ + "IDN", + "Indonesian uusi rupia", + } + IDR{ + "Rp", + "Indonesian rupia", + } + IEP{ + "IR£", + "Irlannin punta", + } + ILL{ + "ILL", + "Israelin sekeli", + } + ILP{ + "ILP", + "Israelin punta", + } + ILS{ + "ILS", + "Israelin uusi sekeli", + } + IMP{ + "IMP", + "Mansaaren sterling-punta", + } + INR{ + "=0#Rs.|1#Re.|1 source: ../../../locale/icu/main/fo.xml + */ +fo{ + Countries{ + AE{"Sameindu Emirríkini"} + AF{"Afganistan"} + AG{"Antigua og Barbuda"} + AQ{"Antarktis"} + AT{"Eysturríki"} + AU{"Avstralia"} + AZ{"Aserbajdsjan"} + BA{"Bosnia-Hersegovina"} + BD{"Bangladesj"} + BE{"Belgia"} + BR{"Brasilia"} + BT{"Butan"} + BW{"Botsvana"} + BY{"Hvítarussland"} + BZ{"Belis"} + CA{"Kanada"} + CF{"Miðafrikalýðveldið"} + CG{"Kongo"} + CH{"Sveis"} + CI{"Fílabeinsstrondin"} + CL{"Kili"} + CM{"Kamerun"} + CN{"Kina"} + CO{"Kolombia"} + CR{"Kosta Rika"} + CU{"Kuba"} + CV{"Grønhøvdaoyggjarnar"} + CY{"Kýpros"} + CZ{"Kekkia"} + DE{"Týskland"} + DK{"Danmørk"} + DM{"Dominika"} + DO{"Domingo lýðveldið"} + EC{"Ekvador"} + EE{"Estland"} + EG{"Egyptaland"} + ES{"Spania"} + ET{"Etiopia"} + FI{"Finnland"} + FM{"Mikronesia"} + FO{"Føroyar"} + FR{"Frakland"} + GQ{"Ekvator Guinea"} + GR{"Grikkaland"} + GW{"Guinea Bissau"} + GY{"Gujana"} + HR{"Kroatia"} + HU{"Ungarn"} + IE{"Írland"} + IL{"Ísrael"} + IQ{"Irak"} + IS{"Ísland"} + IT{"Italia"} + JM{"Jameika"} + KE{"Kenja"} + KG{"Kirgisia"} + KH{"Kambodja"} + KM{"Komorooyggjarnar"} + KN{"Saint Kitts og Nevis"} + KP{"Norður-Korea"} + KR{"Suður-Korea"} + KW{"Kuvait"} + KZ{"Kasakstan"} + LB{"Libanon"} + LC{"Saint Lusia"} + LI{"Liktenstein"} + LS{"Lesoto"} + LT{"Litava"} + LU{"Luksemborg"} + LV{"Lettland"} + MA{"Marokko"} + MC{"Monako"} + MG{"Madagaskar"} + MH{"Marshalloyggjarnar"} + MK{"Makedónia"} + MR{"Móritania"} + MU{"Móritius"} + MV{"Maldivuoyggjarnar"} + MW{"Malavi"} + MX{"Meksiko"} + MY{"Maleisia"} + MZ{"Mosambik"} + NI{"Nikaragua"} + NL{"Niðurlond"} + NO{"Noreg"} + NZ{"Ný Sæland"} + PE{"Perú"} + PG{"Papua Nýguinea"} + PH{"Filipsoyggjar"} + PL{"Pólland"} + PY{"Paraguei"} + QA{"Katar"} + RO{"Rumenia"} + RU{"Russland"} + RW{"Ruanda"} + SA{"Saudi-Arábia"} + SB{"Sálomonoyggjarnar"} + SC{"Seyskelloyggjarnar"} + SE{"Svøríki"} + SG{"Singapor"} + SR{"Surinam"} + ST{"Sao Tome og Prinsipi"} + SZ{"Svasiland"} + TD{"Kjad"} + TJ{"Tadsjikistan"} + TN{"Tunesia"} + TR{"Turkaland"} + TT{"Trinidad og Tobago"} + TW{"Teivan"} + TZ{"Tansania"} + UA{"Ukreina"} + US{"Sambandsríki Amerika"} + UY{"Uruguei"} + UZ{"Usbekistan"} + VA{"Vatikan"} + VC{"Saint Vinsent og Grenadinoyggjar"} + VE{"Venesuela"} + WS{"Sámoa"} + YE{"Jemen"} + ZA{"Suðurafrika"} + ZM{"Sambia"} + ZW{"Simbabvi"} } - Countries { - FO { "Føroyar" } + Currencies{ + DKK{ + "kr", + "DKK", + } } - DayAbbreviations { - "sun", - "mán", - "týs", - "mik", - "hós", - "frí", - "ley", + ExemplarCharacters{"[a-záæíðóøúý]"} + Languages{ + fo{"føroyskt"} } - DayNames { - "sunnudagur", - "mánadagur", - "týsdagur", - "mikudagur", - "hósdagur", - "fríggjadagur", - "leygardagur", + LocaleScript{ + "Latn", } - MonthAbbreviations { - "jan", - "feb", - "mar", - "apr", - "mai", - "jun", - "jul", - "aug", - "sep", - "okt", - "nov", - "des", - } - MonthNames { - "januar", - "februar", - "mars", - "apríl", - "mai", - "juni", - "juli", - "august", - "september", - "oktober", - "november", - "desember", - } - NumberElements { + NumberElements{ ",", ".", ";", @@ -71,16 +159,76 @@ fo { "‰", "∞", "�", - ",", + "+", } - LocaleID:int { 0x38 } -// LocaleScript{ -// "Latn", // ISO 15924 Name -// } - ExemplarCharacters { "[a-z \u00e1 \u00e6 \u00ed \u00f0 \u00f3 \u00f8 \u00fa \u00fd]" } - - // Currency display names - Currencies { - DKK { "kr", "DKK" } + Version{"1.2"} + calendar{ + gregorian{ + DateTimePatterns{ + "HH:mm:ss z", + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm", + "EEEE dd MMMM yyyy", + "d. MMM yyyy", + "dd-MM-yyyy", + "dd-MM-yy", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "sun", + "mán", + "týs", + "mik", + "hós", + "frí", + "ley", + } + wide{ + "sunnudagur", + "mánadagur", + "týsdagur", + "mikudagur", + "hósdagur", + "fríggjadagur", + "leygardagur", + } + } + } + monthNames{ + format{ + abbreviated{ + "jan", + "feb", + "mar", + "apr", + "mai", + "jun", + "jul", + "aug", + "sep", + "okt", + "nov", + "des", + } + wide{ + "januar", + "februar", + "mars", + "apríl", + "mai", + "juni", + "juli", + "august", + "september", + "oktober", + "november", + "desember", + } + } + } + } } } diff --git a/icuSources/data/locales/fo_FO.txt b/icuSources/data/locales/fo_FO.txt index d76c4b1f..4a9de690 100644 --- a/icuSources/data/locales/fo_FO.txt +++ b/icuSources/data/locales/fo_FO.txt @@ -1,30 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/fo_FO.xml // * // *************************************************************************** - -fo_FO { - Version { "2.0" } - - /* Discarding duplicate data for tag: AmPmMarkers */ - DateTimePatterns { - "h:mm:ss a", - "h:mm:ss a", - "h:mm:ss a", - "h:mm a", - "EEEE dd MMMM yyyy", - "dd MMMM yyyy", - "MMM dd,yy", - "dd/MM/yy", - "{1} {0}", - } - NumberPatterns { +fo_FO{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "\u00a4#,##0.00;\u00a4 -#,##0.00", + "¤#,##0.00;¤ -#,##0.00", "#,##0%", "#E0", } - LocaleID:int { 0x0438 } + Version{"1.2"} } diff --git a/icuSources/data/locales/fr.txt b/icuSources/data/locales/fr.txt index 77ac4a64..20241bb8 100644 --- a/icuSources/data/locales/fr.txt +++ b/icuSources/data/locales/fr.txt @@ -1,685 +1,2374 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/fr.xml // * // *************************************************************************** - -fr { - Version{"2.0"} - CollationElements { - Version { "1.0" } - Sequence { "[backwards 2]&A<<\u00e6/e<<<\u00c6/E" } - } - - //"%%PREEURO" { "Pre-Euro" } - //"%%EURO" { "Euro" } - - //"%%POSIX" { "POSIX" } - - "%%TRADITIONAL" { "Traditionnel" } - - "%%REVISED" { "R\u00e9vis\u00e9" } - - Countries { - AD { "Andorre" } - AE { "\u00c9mirats Arabes Unis" } - AL { "Albanie" } - AM { "Arm\u00e9nie" } - AN { "Antilles N\u00e9erlandaises" } - AR { "Argentine" } - AS { "Samoa Am\u00e9ricaines" } - AT { "Autriche" } - AU { "Australie" } - AZ { "Azerba\u00efdjan" } - - BA { "Bosnie-Herz\u00e9govine" } - BB { "Barbade" } - BE { "Belgique" } - BG { "Bulgarie" } - BH { "Bahre\u00efn" } - BM { "Bermudes" } - BO { "Bolivie" } - BR { "Br\u00e9sil" } - BT { "Bhoutan" } - BY { "Bi\u00e9lorussie" } - BZ { "B\u00e9lize" } - - CD { "R\u00e9publique D\u00e9mocratique du Congo" } - CF { "R\u00e9publique Centrafricaine" } - CH { "Suisse" } - CL { "Chili" } - CM { "Cameroun" } - CN { "Chine" } - CO { "Colombie" } - CV { "Cap Vert" } - CY { "Chypre" } - CZ { "R\u00e9publique Tch\u00e8que" } - - DE { "Allemagne" } - DK { "Danemark" } - DM { "Dominique" } - DO { "R\u00e9publique Dominicaine" } - DZ { "Alg\u00e9rie" } - - EC { "\u00C9quateur" } - EE { "Estonie" } - EG { "Egypte" } - EH { "Sahara Occidental" } - ER { "\u00C9rythr\u00e9e" } - ES { "Espagne" } - ET { "Ethiopie" } - - FI { "Finlande" } - FJ { "Fidji" } - FM { "Micron\u00e9sie" } - FO { "\u00celes F\u00e9ro\u00e9" } - - GB { "Royaume-Uni" } - GD { "Grenade" } - GE { "G\u00e9orgie" } - GF { "Guyane Fran\u00e7aise" } - GL { "Groenland" } - GM { "Gambie" } - GN { "Guin\u00e9e" } - GQ { "Guin\u00e9e \u00C9quatoriale" } - GR { "Gr\u00e8ce" } - GW { "Guin\u00e9e-Bissau" } - GY { "Guyane" } - - HK { "Hong-Kong R.A.S." } - HR { "Croatie" } - HT { "Ha\u00efti" } - HU { "Hongrie" } - - ID { "Indon\u00e9sie" } - IE { "Irlande" } - IL { "Isra\u00ebl" } - IN { "Inde" } - IQ { "Irak" } - IS { "Islande" } - IT { "Italie" } - - JM { "Jama\u00efque" } - JO { "Jordanie" } - JP { "Japon" } - - KH { "Cambodge" } - KM { "Comores" } - KP { "Cor\u00e9e du Nord" } - KR { "Cor\u00e9e du Sud" } - KW { "Kowe\u00eft" } - - LB { "Liban" } - LC { "Sainte-Lucie" } - LR { "Lib\u00e9ria" } - LT { "Lithuanie" } - LV { "Lettonie" } - LY { "Libye" } - - MA { "Maroc" } - MD { "Moldavie" } - MK { "Mac\u00e9doine" } - MN { "Mongolie" } - MO { "Macao R.A.S." } - MR { "Mauritanie" } - MT { "Malte" } - MU { "Maurice" } - MX { "Mexique" } - MY { "Malaisie" } - - NA { "Namibie" } - NC { "Nouvelle-Cal\u00e9donie" } - NG { "Nig\u00e9ria" } - NL { "Pays-Bas" } - NP { "N\u00e9pal" } - NO { "Norv\u00e8ge" } - NU { "Niu\u00e9" } - NZ { "Nouvelle-Z\u00e9lande" } - - PE { "P\u00e9rou" } - PF { "Polyn\u00e9sie Fran\u00e7aise" } - PG { "Papouasie-Nouvelle-Guin\u00e9e" } - PL { "Pologne" } - PM { "Saint-Pierre-et-Miquelon" } - PR { "Porto Rico" } - PW { "Palaos" } - - RO { "Roumanie" } - RU { "Russie" } - - SA { "Arabie Saoudite" } - SD { "Soudan" } - SE { "Su\u00e8de" } - SG { "Singapour" } - SH { "Sainte-H\u00e9l\u00e8ne" } - SI { "Slov\u00e9nie" } - SK { "Slovaquie" } - SM { "Saint-Marin" } - SN { "S\u00e9n\u00e9gal" } - SO { "Somalie" } - SP { "Serbie" } - ST { "Sao Tom\u00e9-et-Principe" } - SY { "Syrie" } - - TD { "Tchad" } - TF { "Terres Fran\u00e7aises Australes" } - TH { "Tha\u00eflande" } - TJ { "Tadjikistan" } - TL { "Timor" } - TN { "Tunisie" } - TR { "Turquie" } - TT { "Trinit\u00e9-et-Tobago" } - TW { "Ta\u00efwan, Province de Chine" } - TZ { "Tanzanie" } - - UG { "Ouganda" } - UM { "\u00CEles Mineures \u00C9loign\u00e9es des \u00C9tats-Unis" } - US { "\u00C9tats-Unis" } - UZ { "Ouzb\u00e9kistan" } - - VE { "V\u00e9n\u00e9zuela" } - VG { "\u00celes Vierges Britanniques" } - VI { "\u00celes Vierges Am\u00e9ricaines" } - VN { "Vi\u00eat Nam" } - - WF { "Wallis et Futuna" } - - YE { "Y\u00e9men" } - YU { "Yougoslavie" } - - ZA { "Afrique du Sud" } - //ZR { "Za\u00efre" } // Zaire is now the Democratic Republic of Congo (CD) - ZM { "Zambie" } - } - - Languages { - root { "racine" } - - ab { "abkhaze" } - aa { "afar" } - af { "afrikaans" } - sq { "albanais" } - am { "amharique" } - ar { "arabe" } - hy { "arm\u00e9nien" } - as { "assamais" } - ay { "aymara" } - az { "az\u00e9ri" } - ba { "bachkir" } - eu { "basque" } - bn { "bengali" } - dz { "dzongkha" } - bh { "bihari" } - bi { "bichlamar" } - br { "breton" } - bg { "bulgare" } - my { "birman" } - be { "bi\u00e9lorusse" } - km { "khmer" } - ca { "catalan" } - zh { "chinois" } - kw { "cornique" } - co { "corse" } - hr { "croate" } - cs { "tch\u00e8que" } - da { "danois" } - nl { "n\u00e9erlandais" } - en { "anglais" } - eo { "esp\u00e9ranto" } - et { "estonien" } - fo { "f\u00e9ro\u00efen" } - fj { "fidjien" } - fi { "finnois" } - fr { "fran\u00e7ais" } - fy { "frison" } - gl { "galicien" } - de { "allemand" } - el { "grec" } - gn { "guarani" } - gu { "goudjrati" } - ha { "haoussa" } - haw { "hawa\u00efen" } - he { "h\u00e9breu" } - hi { "hindi" } - hu { "hongrois" } - is { "islandais" } - id { "indon\u00e9sien" } - ia { "interlingua" } - iu { "inuktitut" } - ik { "inupiaq" } - ga { "irlandais" } - it { "italien" } - ja { "japonais" } - jv { "javanais" } - //jw { "javanais" } // Use jv instead - kn { "kannada" } - ks { "kashmiri" } - kk { "kazakh" } - rw { "rwanda" } - ky { "kirghize" } - ko { "cor\u00e9en" } - ku { "kurde" } - lo { "lao" } - la { "latin" } - lv { "letton" } - ln { "lingala" } - lt { "lithuanien" } - mk { "mac\u00e9donien" } - mg { "malgache" } - ms { "malais" } - ml { "malayalam" } - mt { "maltais" } - gv { "mannois" } - mi { "maori" } - mr { "marathe" } - mo { "moldave" } - mn { "mongol" } - na { "nauruan" } - ne { "n\u00e9palais" } - no { "norv\u00e9gien" } - nb { "norv\u00e9gien (bokm\u00e5l)" } - nn { "norv\u00e9gien (nynorsk)" } - oc { "occitan" } - or { "oriya" } - om { "galla" } - ps { "pachto" } - fa { "persan" } - pl { "polonais" } - pt { "portugais" } - pa { "pendjabi" } - rm { "rh\u00e9toroman" } - ro { "roumain" } - ru { "russe" } - sm { "samoan" } - sg { "sango" } - sa { "sanscrit" } - gd { "\u00e9cossais ga\u00e9lique" } - ie { "interlingu\u00eb" } - ka { "g\u00e9orgien" } - kl { "groenlandais" } - qu { "quechua" } - rn { "roundi" } - sr { "serbe" } - sh { "serbo-croate" } - st { "sotho du sud" } - tn { "setswana" } - sn { "shona" } - sd { "sindhi" } - si { "singhalais" } - ss { "swati" } - sk { "slovaque" } - sl { "slov\u00e8ne" } - so { "somali" } - es { "espagnol" } - su { "soundanais" } - sw { "swahili" } - sv { "su\u00e9dois" } - tl { "tagalog" } - tg { "tadjik" } - ta { "tamoul" } - tt { "tatare" } - te { "t\u00e9lougou" } - th { "tha\u00ef" } - bo { "tib\u00e9tain" } - ti { "tigrigna" } - to { "tonga" } - ts { "tsonga" } - tr { "turc" } - tk { "turkm\u00e8ne" } - tw { "twi" } - ug { "ou\u00efgour" } - uk { "ukrainien" } - ur { "ourdou" } - uz { "ouzbek" } - vi { "vietnamien" } - vo { "volap\u00fck" } - cy { "gallois" } - wo { "wolof" } - xh { "xhosa" } - yi { "yiddish" } - yo { "yoruba" } - za { "zhuang" } - zu { "zoulou" } - } - - DateTimePatterns { - "HH' h 'mm z", - "HH:mm:ss z", - "HH:mm:ss", - "HH:mm", - "EEEE d MMMM yyyy", - "d MMMM yyyy", - "d MMM yy", - "dd/MM/yy", - "{1} {0}", +/** + * ICU source: ../../../locale/icu/main/fr.xml + */ +fr{ + Countries{ + AD{"Andorre"} + AE{"Émirats arabes unis"} + AF{"Afghanistan"} + AG{"Antigua-et-Barbuda"} + AI{"Anguilla"} + AL{"Albanie"} + AM{"Arménie"} + AN{"Antilles néerlandaises"} + AO{"Angola"} + AQ{"Antarctique"} + AR{"Argentine"} + AS{"Samoa américaines"} + AT{"Autriche"} + AU{"Australie"} + AW{"Aruba"} + AZ{"Azerbaïdjan"} + BA{"Bosnie-Herzégovine"} + BB{"Barbade"} + BD{"Bangladesh"} + BE{"Belgique"} + BF{"Burkina Faso"} + BG{"Bulgarie"} + BH{"Bahreïn"} + BI{"Burundi"} + BJ{"Benin"} + BM{"Bermudes"} + BN{"Brunei"} + BO{"Bolivie"} + BR{"Brésil"} + BS{"Bahamas"} + BT{"Bhoutan"} + BV{"Île Bouvet"} + BW{"Botswana"} + BY{"Bélarus"} + BZ{"Belize"} + CA{"Canada"} + CC{"Îles Cocos"} + CD{"République démocratique du Congo"} + CF{"République centrafricaine"} + CG{"Congo"} + CH{"Suisse"} + CI{"Côte d’Ivoire"} + CK{"Îles Cook"} + CL{"Chili"} + CM{"Cameroun"} + CN{"Chine"} + CO{"Colombie"} + CR{"Costa Rica"} + CU{"Cuba"} + CV{"Cap Vert"} + CX{"Île Christmas"} + CY{"Chypre"} + CZ{"République tchèque"} + DE{"Allemagne"} + DJ{"Djibouti"} + DK{"Danemark"} + DM{"Dominique"} + DO{"République dominicaine"} + DZ{"Algérie"} + EC{"Équateur"} + EE{"Estonie"} + EG{"Égypte"} + EH{"Sahara occidental"} + ER{"Érythrée"} + ES{"Espagne"} + ET{"Éthiopie"} + FI{"Finlande"} + FJ{"Fidji"} + FK{"Îles Falkland (Malvinas)"} + FM{"Micronésie"} + FO{"Îles Féroé"} + FR{"France"} + GA{"Gabon"} + GB{"Royaume-Uni"} + GD{"Grenade"} + GE{"Géorgie"} + GF{"Guyane française"} + GH{"Ghana"} + GI{"Gibraltar"} + GL{"Groenland"} + GM{"Gambie"} + GN{"Guinée"} + GP{"Guadeloupe"} + GQ{"Guinée équatoriale"} + GR{"Grèce"} + GS{"Géorgie du Sud, Îles Sandwich du Sud"} + GT{"Guatemala"} + GU{"Guam"} + GW{"Guinée-Bissau"} + GY{"Guyana"} + HM{"Îles Heard et MacDonald"} + HN{"Honduras"} + HR{"Croatie"} + HT{"Haïti"} + HU{"Hongrie"} + ID{"Indonésie"} + IE{"Irlande"} + IL{"Israël"} + IN{"Inde"} + IO{"Territoire britannique de l’océan indien"} + IQ{"Iraq"} + IR{"Iran"} + IS{"Islande"} + IT{"Italie"} + JM{"Jamaïque"} + JO{"Jordanie"} + JP{"Japon"} + KE{"Kenya"} + KG{"Kirghizistan"} + KH{"Cambodge"} + KI{"Kiribati"} + KM{"Comores"} + KN{"Saint Kitts et Nevis"} + KP{"Corée du Nord"} + KR{"Corée du Sud"} + KW{"Koweït"} + KY{"Îles Caïmanes"} + KZ{"Kazakhstan"} + LA{"Laos"} + LB{"Liban"} + LC{"Sainte-Lucie"} + LI{"Liechtenstein"} + LK{"Sri Lanka"} + LR{"Libéria"} + LS{"Lesotho"} + LT{"Lithuanie"} + LU{"Luxembourg"} + LV{"Lettonie"} + LY{"Libye"} + MA{"Maroc"} + MC{"Monaco"} + MD{"Moldova"} + MG{"Madagascar"} + MH{"Îles Marshall"} + MK{"Macédoine"} + ML{"Mali"} + MM{"Myanmar"} + MN{"Mongolie"} + MO{"Macao R.A.S. de Chine"} + MP{"Îles Mariannes du Nord"} + MQ{"Martinique"} + MR{"Mauritanie"} + MS{"Montserrat"} + MT{"Malte"} + MU{"Maurice"} + MV{"Maldives"} + MW{"Malawi"} + MX{"Mexique"} + MY{"Malaisie"} + MZ{"Mozambique"} + NA{"Namibie"} + NC{"Nouvelle-Calédonie"} + NE{"Niger"} + NF{"Île Norfolk"} + NG{"Nigéria"} + NI{"Nicaragua"} + NL{"Pays-Bas"} + NO{"Norvège"} + NP{"Népal"} + NR{"Nauru"} + NU{"Niué"} + NZ{"Nouvelle-Zélande"} + OM{"Oman"} + PA{"Panama"} + PE{"Pérou"} + PF{"Polynésie française"} + PG{"Papouasie-Nouvelle-Guinée"} + PH{"Philippines"} + PK{"Pakistan"} + PL{"Pologne"} + PM{"Saint-Pierre-et-Miquelon"} + PN{"Pitcairn"} + PR{"Porto Rico"} + PS{"Territoire palestinien"} + PT{"Portugal"} + PW{"Palaos"} + PY{"Paraguay"} + QA{"Qatar"} + RE{"Réunion"} + RO{"Roumanie"} + RU{"Russie"} + RW{"Rwanda"} + SA{"Arabie saoudite"} + SB{"Îles Salomon"} + SC{"Seychelles"} + SD{"Soudan"} + SE{"Suède"} + SG{"Singapour"} + SH{"Sainte-Hélène"} + SI{"Slovénie"} + SJ{"Svalbard et Île Jan Mayen"} + SK{"Slovaquie"} + SL{"Sierra Leone"} + SM{"Saint-Marin"} + SN{"Sénégal"} + SO{"Somalie"} + SP{"Serbie"} + SR{"Suriname"} + ST{"Sao Tomé-et-Principe"} + SV{"El Salvador"} + SY{"Syrie"} + SZ{"Swaziland"} + TC{"Îles Turks et Caïques"} + TD{"Tchad"} + TF{"Terres australes françaises"} + TG{"Togo"} + TH{"Thaïlande"} + TJ{"Tadjikistan"} + TK{"Tokelau"} + TL{"Timor-Leste"} + TM{"Turkmenistan"} + TN{"Tunisie"} + TO{"Tonga"} + TR{"Turquie"} + TT{"Trinité-et-Tobago"} + TV{"Tuvalu"} + TW{"Taïwan"} + TZ{"Tanzanie"} + UA{"Ukraine"} + UG{"Ouganda"} + UM{"Îles Mineures Éloignées des États-Unis"} + US{"États-Unis"} + UY{"Uruguay"} + UZ{"Ouzbékistan"} + VA{"Saint-Siège (Etat de la Cité du Vatican)"} + VC{"Saint-Vincent-et-les Grenadines"} + VE{"Vénézuela"} + VG{"Îles Vierges Britanniques"} + VI{"Îles Vierges des États-Unis"} + VN{"Viet Nam"} + VU{"Vanuatu"} + WF{"Wallis et Futuna"} + WS{"Samoa"} + YE{"Yémen"} + YT{"Mayotte"} + YU{"Yougoslavie"} + ZA{"Afrique du Sud"} + ZM{"Zambie"} + ZW{"Zimbabwe"} } - DayAbbreviations { - "dim.", - "lun.", - "mar.", - "mer.", - "jeu.", - "ven.", - "sam.", - } - DayNames { - "dimanche", - "lundi", - "mardi", - "mercredi", - "jeudi", - "vendredi", - "samedi", + Currencies{ + ADD{ + "ADD", + "diner andorran", + } + ADP{ + "ADP", + "peseta andorrane", + } + AED{ + "AED", + "dirham des Émirats arabes unis", + } + AFA{ + "AFA", + "afghani", + } + AFN{ + "Af", + "afghani", + } + AIF{ + "AIF", + "franc Affars et Issas", + } + ALK{ + "ALK", + "lek albanais (1946-1961)", + } + ALL{ + "lek", + "lek albanais", + } + ALV{ + "ALV", + "Albanian Lek Valute", + } + ALX{ + "ALX", + "dollar albanais (certificat de devises étrangères)", + } + AMD{ + "dram", + "dram arménien", + } + ANG{ + "ANG", + "florin des Antilles néerl.", + } + AOA{ + "AOA", + "kwanza angolais", + } + AOK{ + "AOK", + "kwanza angolais (1977-1990)", + } + AON{ + "AON", + "nouveau kwanza angolais (1990-2000)", + } + AOR{ + "AOR", + "kwanza angolais réajusté (1995-1999)", + } + AOS{ + "AOS", + "escudo angolais", + } + ARA{ + "ARA", + "austral", + } + ARM{ + "ARM", + "Argentine Peso Moneda Nacional", + } + ARP{ + "ARP", + "peso argentin (1983-1985)", + } + ARS{ + "Arg$", + "peso argentin", + } + ATS{ + "ATS", + "schilling autrichien", + } + AUD{ + "AUD", + "dollar australien", + } + AUP{ + "AUP", + "livre australienne", + } + AWG{ + "AWG", + "florin d’Aruba", + } + AZM{ + "AZM", + "Azerbaijanian Manat", + } + BAD{ + "BAD", + "dinar de Bosnie-Herzegovine", + } + BAM{ + "KM", + "mark convertible de Bosnie-Herzegovine", + } + BAN{ + "BAN", + "nouveau dinar de Bosnie-Herzegovine", + } + BBD{ + "BBD", + "dollar de Barbade", + } + BDT{ + "BDT", + "taka", + } + BEC{ + "BEC", + "franc belge (convertible)", + } + BEF{ + "FB", + "franc belge", + } + BEL{ + "BEL", + "franc belge (financier)", + } + BGL{ + "BGL", + "lev", + } + BGM{ + "BGM", + "lev de Bulgarie socialiste", + } + BGN{ + "BGN", + "nouveau lef", + } + BGO{ + "BGO", + "lev (1879-1952)", + } + BGX{ + "BGX", + "lev (certificat de devises étrangères)", + } + BHD{ + "BHD", + "dinar de Bahrein", + } + BIF{ + "BIF", + "franc du Burundi", + } + BMD{ + "BMD", + "dollar des Bermudes", + } + BMP{ + "BMP", + "livre des Bermudes", + } + BND{ + "BND", + "dollar de Brunei", + } + BOB{ + "Bs", + "boliviano", + } + BOL{ + "BOL", + "boliviano (1863-1962)", + } + BOP{ + "BOP", + "peso bolivien", + } + BOV{ + "BOV", + "Bolivian Mvdol", + } + BRB{ + "BRB", + "nouveau cruzeiro (1967-1986)", + } + BRC{ + "BRC", + "cruzeiro", + } + BRE{ + "BRE", + "cruzeiro (1990-1993)", + } + BRL{ + "R$", + "réal", + } + BRN{ + "BRN", + "nouveau cruzado", + } + BRR{ + "BRR", + "cruzeiro", + } + BRZ{ + "BRZ", + "cruzeiro (1942-1967)", + } + BSD{ + "BSD", + "dollar des Bahamas", + } + BSP{ + "BSP", + "livre des Bahamas", + } + BTN{ + "Nu", + "ngultrum", + } + BTR{ + "BTR", + "roupie de Bhoutan", + } + BUK{ + "BUK", + "kyat", + } + BUR{ + "BUR", + "roupie de Birmanie", + } + BWP{ + "BWP", + "pula", + } + BYB{ + "BYB", + "nouveau rouble biélorusse (1994-1999)", + } + BYL{ + "BYL", + "rouble biélorusse (1992-1994)", + } + BYR{ + "Rbl", + "rouble biélorusse", + } + BZD{ + "BZD", + "dollar de Bélize", + } + BZH{ + "BZH", + "dollar du Honduras britannique", + } + CAD{ + "CAD", + "dollar canadien", + } + CDF{ + "CDF", + "franc congolais", + } + CDG{ + "CDG", + "franc de la République Congolaise", + } + CDL{ + "CDL", + "Congolese Zaire", + } + CFF{ + "CFF", + "franc CFA de la République du Centre Afrique", + } + CHF{ + "sFr.", + "franc suisse", + } + CKD{ + "CKD", + "dollar des îles Cook", + } + CLC{ + "CLC", + "condor chilien", + } + CLE{ + "CLE", + "escudo chilien", + } + CLF{ + "CLF", + "Chilean Unidades de Fomento", + } + CLP{ + "CLP", + "peso chilien", + } + CMF{ + "CMF", + "franc CFA camerounais", + } + CNP{ + "CNP", + "Chinese Jen Min Piao Yuan", + } + CNX{ + "CNX", + "dollar US chinois (certificat de devises étrangères)", + } + CNY{ + "CNY", + "Yuan Ren-min-bi", + } + COB{ + "COB", + "Colombian Paper Peso", + } + COF{ + "COF", + "franc CFA congolais", + } + COP{ + "COP", + "peso colombien", + } + CRC{ + "CRC", + "colon", + } + CSC{ + "CSC", + "couronne tchèque", + } + CSK{ + "CSK", + "couronne tchèque", + } + CUP{ + "CUP", + "peso cubain", + } + CUX{ + "CUX", + "certificat de devises étrangères de Cuba", + } + CVE{ + "CVE", + "escudo du Cap-Vert", + } + CWG{ + "CWG", + "florin de Curacao", + } + CYP{ + "CYP", + "livre cypriote", + } + CZK{ + "CZK", + "couronne tchèque", + } + DDM{ + "DDM", + "mark est-allemand", + } + DEM{ + "DEM", + "deutsche mark", + } + DES{ + "DES", + "sperrmark allemand", + } + DJF{ + "DF", + "franc de Djibouti", + } + DKK{ + "DKK", + "couronne danoise", + } + DOP{ + "DOP", + "peso dominicain", + } + DZD{ + "DZD", + "dinar algérien", + } + DZF{ + "DZF", + "nouveau franc algérien", + } + DZG{ + "DZG", + "franc germinal algérien", + } + ECS{ + "ECS", + "sucre", + } + ECV{ + "ECV", + "unité de valeur constante équatoriale (UVC)", + } + EEK{ + "EEK", + "couronne estonienne", + } + EGP{ + "EGP", + "livre égyptienne", + } + ERN{ + "ERN", + "Eritrean Nakfa", + } + ESP{ + "ESP", + "peseta espagnole", + } + ETB{ + "ETB", + "birr", + } + ETD{ + "ETD", + "dollar éthiopien", + } + EUR{ + "€", + "euro", + } + FIM{ + "FIM", + "mark finlandais", + } + FIN{ + "FIN", + "mark finlandais (1860-1962)", + } + FJD{ + "FJD", + "dollar de Fidji", + } + FJP{ + "FJP", + "livre de Fiji", + } + FKP{ + "FKP", + "livre des Falkland (Malvinas)", + } + FOK{ + "FOK", + "Faeroe Islands Kronur", + } + FRF{ + "F", + "franc français", + } + FRG{ + "FRG", + "franc germinal/franc Poincaré", + } + GAF{ + "GAF", + "franc CFA gabonnais", + } + GBP{ + "£", + "livre sterling", + } + GEK{ + "GEK", + "Georgian Kupon Larit", + } + GEL{ + "lari", + "lari", + } + GHC{ + "GHC", + "cédi", + } + GHO{ + "GHO", + "ancien cedi", + } + GHP{ + "GHP", + "livre ghanéenne", + } + GHR{ + "GHR", + "cedi revalorisé", + } + GIP{ + "GIP", + "livre de Gibraltar", + } + GLK{ + "GLK", + "couronne du Groenland", + } + GMD{ + "GMD", + "dalasie", + } + GMP{ + "GMP", + "livre de Gambie", + } + GNF{ + "GF", + "franc guinéen", + } + GNI{ + "GNI", + "franc guinéen (1960-1972)", + } + GNS{ + "GNS", + "syli", + } + GPF{ + "GPF", + "franc guadeloupéen", + } + GQE{ + "GQE", + "ekwélé", + } + GQF{ + "GQF", + "franco de Guinée Equatoriale", + } + GQP{ + "GQP", + "peseta de Guinée Equatoriale", + } + GRD{ + "GRD", + "drachme", + } + GRN{ + "GRN", + "nouveau drachme", + } + GTQ{ + "GTQ", + "quetzal", + } + GUF{ + "GUF", + "franc guyanais", + } + GWE{ + "GWE", + "Escudo de Guinée Portugaise", + } + GWM{ + "GWM", + "Portuguese Guinea Mil Reis", + } + GWP{ + "GWP", + "peso de Guinée-Bissau", + } + GYD{ + "G$", + "dollar de Guyane", + } + HKD{ + "HKD", + "dollar de Hong Kong", + } + HNL{ + "HNL", + "lempira", + } + HRD{ + "HRD", + "dinar croate", + } + HRK{ + "HRK", + "kuna", + } + HTG{ + "HTG", + "gourde", + } + HUF{ + "HUF", + "forint", + } + IBP{ + "IBP", + "livre d’Irlande du Nord", + } + IDG{ + "IDG", + "florin de Nica", + } + IDJ{ + "IDJ", + "roupie de Java", + } + IDN{ + "IDN", + "nouvelle roupie indonésienne", + } + IDR{ + "IDR", + "rupiah", + } + IEP{ + "IEP", + "livre irlandaise", + } + ILL{ + "ILL", + "shékel", + } + ILP{ + "ILP", + "livre israélienne", + } + ILS{ + "ILS", + "shékel", + } + IMP{ + "IMP", + "livre sterling de l’Ile de Man", + } + INR{ + "=0#Rs.|1#Re.|1>;\n" - " x.x: << virgule >>;\n" - // words for numbers from 0 to 10 - " z\u00e9ro; un; deux; trois; quatre; cinq; six; sept; huit; neuf;\n" - " dix; onze; douze; treize; quatorze; quinze; seize;\n" - " dix-sept; dix-huit; dix-neuf;\n" - // ords for the multiples of 10: %%alt-ones inserts "et" - // when needed - " 20: vingt[->%%alt-ones>];\n" - " 30: trente[->%%alt-ones>];\n" - " 40: quarante[->%%alt-ones>];\n" - " 50: cinquante[->%%alt-ones>];\n" - // rule for 60. The /20 causes this rule's multiplier to be - // 20 rather than 10, allowinhg us to recurse for all values - // from 60 to 79... - " 60/20: soixante[->%%alt-ones>];\n" - // ...except for 71, which must be special-cased - " 71: soixante et onze;\n" - // at 72, we have to repeat the rule for 60 to get us to 79 - " 72/20: soixante->%%alt-ones>;\n" - // at 80, we state a new rule with the phrase for 80. Since - // it changes form when there's a ones digit, we need a second - // rule at 81. This rule also includes "/20," allowing it to - // be used correctly for all values up to 99 - " 80: quatre-vingts; 81/20: quatre-vingt->>;\n" - // "cent" becomes plural when preceded by a multiplier, and - // the multiplier is omitted from the singular form - " 100: cent[ >>];\n" - " 200: << cents[ >>];\n" - " 1000: mille[ >>];\n" - // values from 1,100 to 1,199 are rendered as "onze cents..." - // instead of "mille cent..." The > after "1000" decreases - // the rule's exponent, causing its multiplier to be 100 instead - // of 1,000. This prevents us from getting "onze cents cent - // vingt-deux" ("eleven hundred one hundred twenty-two"). - " 1100>: onze cents[ >>];\n" - // at 1,200, we go back to formating in thousands, so we - // repeat the rule for 1,000 - " 1200: mille >>;\n" - // at 2,000, the multiplier is added - " 2000: << mille[ >>];\n" - " 1,000,000: << million[ >>];\n" - " 1,000,000,000: << milliard[ >>];\n" - " 1,000,000,000,000: << billion[ >>];\n" - " 1,000,000,000,000,000: =#,##0=;\n" - // %%alt-ones is used to insert "et" when the ones digit is 1 - "%%alt-ones:\n" - " ; et-un; =%main=;\n" - "%%lenient-parse:\n" - " &\u0000 << ' ' << ',' << '-';\n" - } - - // Currency display names - Currencies { - AED { "AED", "dirham des E A.U." } // UAE Dirham - AFA { "AFA", "afghani" } // Afghani - ALL { "ALL", "lek" } // Leck - ANG { "ANG", "florin des Antilles n\u00E9erl." } // Netherlands Antillan Guilder - AOK { "AOK", "kwanza" } // Kwanza - ARA { "ARA", "austral" } - ARP { "ARP", "peso argentin" } // Argentine Peso - ATS { "ATS", "schilling autrichien" } // Schilling - AUD { "AUD", "dollar australien" } // Australian Dollar - BBD { "BBD", "dollar de Barbade" } // Barbados Dollar - BDT { "BDT", "taka" } // Taka - BEF { "FB", "franc belge" } // Belgian Franc - BGL { "BGL", "lev" } // Lev - BHD { "BHD", "dinar de Bahrein" } // Bahraini Dinar - BIF { "BIF", "franc du Burundi" } // Burundi Franc - BMD { "BMD", "dollar des Bermudes" } // Bermudian Dollar - BND { "BND", "dollar de Brunei" } // Brunei Dollar - BOP { "BOP", "peso bolivien" } // Bolivian Peso - BRC { "BRC", "cruzeiro" } // Cruzeiro - BSD { "BSD", "dollar des Bahamas" } // Bahamian Dollar - BUK { "BUK", "kyat" } // Kyat - BWP { "BWP", "pula" } // Pula - BZD { "BZD", "dollar de Belize" } // Belize Dollar - CAD { "CAD", "dollar canadien" } // Canadian Dollar - CHF { "sFr.", "franc suisse" } // Swiss Franc - CLP { "CLP", "peso chilien" } // Chilean Peso - CNY { "CNY", "Yuan Ren-min-bi" } // Yuan Renminbi - COP { "COP", "peso colombien" } // Colombian Peso - CRC { "CRC", "colon" } // Costa Rican Colon - CSK { "CSK", "couronne tch\u00E8que" } // Koruna - CUP { "CUP", "peso cubain" } // Cuban Peso - CVE { "CVE", "escudo du Cap-Vert" } // Cape Verde Escudo - CYP { "CYP", "livre cypriote" } // Cyprus Pound - CZK { "CZK", "couronne tch\u00E8que" } // Czech Koruna - DEM { "DEM", "deutsche mark" } // Deutsche Mark - // DIF { "DIF", "franc de Djibouti" } -- unconfirmed - DKK { "DKK", "couronne danoise" } // Danish Krone - DOP { "DOP", "peso dominicain" } // Dominican Peso - DZD { "DZD", "dinar alg\u00E9rien" } // Algerian Dinar - ECS { "ECS", "sucre" } // Sucre - EGP { "EGP", "livre \u00E9gyptienne" } // Egyptian Pound - ESP { "ESP", "peseta espagnole" } // Spanish Peseta - ETB { "ETB", "birr" } // Ethiopian Birr - EUR { "\u20AC", "euro" } // Euro - FIM { "FIM", "mark finlandais" } // Markka - FJD { "FJD", "dollar de Fidji" } // Fiji Dollar - FKP { "FKP", "livre des Falkland" } // Falkland Islands Pound - FRF { "F", "franc fran\u00E7ais" } // French Franc - GBP { "\u00A3", "livre sterling" } // Pound Sterling - GHC { "GHC", "cedi" } // Cedi - GIP { "GIP", "livre de Gibraltar" } // Gibraltar Pound - GMD { "GMD", "dalasie" } // Dalasi - GNS { "GNS", "syli" } // Syli - GQE { "GQE", "ekwele" } // Ekwele - GRD { "GRD", "drachme" } // Drachma - GTQ { "GTQ", "quetzal" } // Quetzal - GWP { "GWP", "peso de Guin\u00E9e-Bissau" } // Guinea-Bissau Peso - GYD { "GYD", "dollar de Guyane" } // Guyana Dollar - HKD { "HKD", "dollar de Hong Kong" } // Hong Kong Dollar - HNL { "HNL", "lempira" } // Lempira - HRD { "HRD", "dinar croate" } - HTG { "HTG", "gourde" } // Gourde - HUF { "HUF", "forint" } // Forint - IDR { "IDR", "rupiah" } // Rupiah - IEP { "IEP", "livre irlandaise" } // Irish Pound - ILS { "ILS", "sh\u00E9kel" } // New Israeli Sheqel - INR { "=0#Rs.|1#Re.|1>;\n" - " x.x: << virgule >>;\n" - " z\u00e9ro; un; deux; trois; quatre; cinq; six; sept; huit; neuf;\n" - " dix; onze; douze; treize; quatorze; quinze; seize;\n" - " dix-sept; dix-huit; dix-neuf;\n" - " 20: vingt[->%%alt-ones>];\n" - " 30: trente[->%%alt-ones>];\n" - " 40: quarante[->%%alt-ones>];\n" - " 50: cinquante[->%%alt-ones>];\n" - " 60: soixante[->%%alt-ones>];\n" - // notice new words for 70, 80, and 90 - " 70: septante[->%%alt-ones>];\n" - " 80: huitante[->%%alt-ones>];\n" - " 90: nonante[->%%alt-ones>];\n" - " 100: cent[ >>];\n" - " 200: << cents[ >>];\n" - " 1000: mille[ >>];\n" - " 1100>: onze cents[ >>];\n" - " 1200: mille >>;\n" - " 2000: << mille[ >>];\n" - " 1,000,000: << million[ >>];\n" - " 1,000,000,000: << milliarde[ >>];\n" - " 1,000,000,000,000: << billion[ >>];\n" - " 1,000,000,000,000,000: =#,##0=;\n" - "%%alt-ones:\n" - " ; et-un; =%main=;" - } } diff --git a/icuSources/data/locales/fr_FR.txt b/icuSources/data/locales/fr_FR.txt index a3119572..4293b893 100644 --- a/icuSources/data/locales/fr_FR.txt +++ b/icuSources/data/locales/fr_FR.txt @@ -1,17 +1,11 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/fr_FR.xml // * // *************************************************************************** - -fr_FR { - Version{ "2.0"} - DateTimeElements:intvector { - 2, - 1, - } -// LocaleString { "fr_FR" } -// ShortCountry { "FRA" } - LocaleID:int { 0x040c } +fr_FR{ + Version{"1.2"} } diff --git a/icuSources/data/locales/fr_FR_PREEURO.txt b/icuSources/data/locales/fr_FR_PREEURO.txt deleted file mode 100644 index d7968e59..00000000 --- a/icuSources/data/locales/fr_FR_PREEURO.txt +++ /dev/null @@ -1,10 +0,0 @@ -// *************************************************************************** -// * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -fr_FR_PREEURO { - Version { "2.0" } -} diff --git a/icuSources/data/locales/fr_LU.txt b/icuSources/data/locales/fr_LU.txt index a76cd29c..e63aaf35 100644 --- a/icuSources/data/locales/fr_LU.txt +++ b/icuSources/data/locales/fr_LU.txt @@ -1,17 +1,23 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/fr_LU.xml // * // *************************************************************************** - -fr_LU { - Version{"2.0"} - DateTimeElements:intvector { - 2, - 1, +fr_LU{ + Currencies{ + FRF{ + "FRF", + "franc français", + } + LUF{ + "F", + "franc luxembourgeois", + } } - NumberElements { + NumberElements{ ",", ".", ";", @@ -20,18 +26,10 @@ fr_LU { "#", "-", "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", - } -// LocaleString { "fr_LU" } -// ShortCountry { "LUX" } - LocaleID:int { 0x140c } - - // Currency display names - Currencies { - FRF { "FRF", "franc fran\u00E7ais" } // French Franc - LUF { "F", "franc luxembourgeois" } + "‰", + "∞", + "�", + "+", } + Version{"1.2"} } diff --git a/icuSources/data/locales/fr_LU_PREEURO.txt b/icuSources/data/locales/fr_LU_PREEURO.txt deleted file mode 100644 index 04b9005a..00000000 --- a/icuSources/data/locales/fr_LU_PREEURO.txt +++ /dev/null @@ -1,10 +0,0 @@ -// *************************************************************************** -// * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -fr_LU_PREEURO { - Version { "2.0" } -} diff --git a/icuSources/data/locales/ga.txt b/icuSources/data/locales/ga.txt index 5100e997..0fde947f 100644 --- a/icuSources/data/locales/ga.txt +++ b/icuSources/data/locales/ga.txt @@ -1,88 +1,1989 @@ // *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ga.xml // * // *************************************************************************** - +/** + * ICU source: ../../../locale/icu/main/ga.xml + */ ga{ - Version { "2.0" } - - AmPmMarkers { - "a.m.", - "p.m.", + Countries{ + AD{"Andóra"} + AE{"Aontas na nÉimíríochtaí Arabacha"} + AF{"An Afganastáin"} + AG{"Antigua agus Barbuda"} + AI{"Anguilla"} + AL{"An Albáin"} + AM{"An Airméin"} + AN{"Antillí na hÍsiltíre"} + AO{"Angóla"} + AQ{"An Antartaice"} + AR{"An Airgintín"} + AS{"Samó Meiriceánach"} + AT{"An Ostair"} + AU{"An Astráil"} + AW{"Aruba"} + AZ{"An Asarbaiseáin"} + BA{"An Bhoisnia-Heirseagaivéin"} + BB{"Barbadós"} + BD{"An Bhanglaidéis"} + BE{"An Bheilg"} + BF{"Buircíne Fasó"} + BG{"An Bhulgáir"} + BH{"Bairéin"} + BI{"An Bhurúin"} + BJ{"Beinin"} + BM{"Beirmiúda"} + BN{"Brúiné"} + BO{"An Bholaiv"} + BR{"An Bhrasaíl"} + BS{"Na Bahámaí"} + BT{"An Bhútáin"} + BV{"Oileáin Bouvet"} + BW{"An Bhotsuáin"} + BY{"An Bhealarúis"} + BZ{"An Bheilís"} + CA{"Ceanada"} + CC{"Oileáin Cocos (Keeling)"} + CD{"Poblacht Dhaonlathach an Chongó"} + CF{"Poblacht na hAfraice Láir"} + CG{"An Congó"} + CH{"An Eilvéis"} + CI{"An Cósta Eabhair"} + CK{"Oileáin Cook"} + CL{"An tSile"} + CM{"Camarún"} + CN{"An tSín"} + CO{"An Cholóim"} + CR{"Cósta Ríce"} + CU{"Cúba"} + CV{"Rinn Verde"} + CX{"Oileán na Nollag"} + CY{"An Chipir"} + CZ{"Poblacht na Seice"} + DE{"An Ghearmáin"} + DJ{"Djibouti"} + DK{"An Danmhairg"} + DM{"Doiminice"} + DO{"An Phoblacht Dhoiminiceach"} + DZ{"An Ailgéir"} + EC{"Eacuadór"} + EE{"An Eastóin"} + EG{"An Éigipt"} + EH{"An Sahára Thiar"} + ER{"Eritrea"} + ES{"An Spáinn"} + ET{"An Aetóip"} + FI{"An Fhionlainn"} + FJ{"Fidsí"} + FK{"Oileáin Fháclainne"} + FM{"An Mhicrinéis"} + FO{"Oileáin Fharó"} + FR{"An Fhrainc"} + GA{"An Ghabúin"} + GB{"An Ríocht Aontaithe"} + GD{"Grenada"} + GE{"An tSeoirsia"} + GF{"An Ghuáin Fhrancach"} + GH{"Gána"} + GI{"Giobráltar"} + GL{"An Ghraonlainn"} + GM{"An Ghaimbia"} + GN{"An Ghuine"} + GP{"Guadalúip"} + GQ{"An Ghuine Mheánchriosach"} + GR{"An Ghréig"} + GS{"An tSeoirsia Theas agus Oileáin Sandwich Theas"} + GT{"Guatamala"} + GU{"Guam"} + GW{"An Ghuine-Bhissau"} + GY{"An Ghuáin"} + HM{"Oileán Heard agus Oileáin McDonald"} + HN{"Hondúras"} + HR{"An Chróit"} + HT{"Háití"} + HU{"An Ungáir"} + ID{"An Indinéis"} + IE{"Éire"} + IL{"Iosrael"} + IN{"An India"} + IO{"Críocha Briotanacha an Aigéin Indiagh"} + IQ{"An Iaráic"} + IR{"An Iaráin"} + IS{"An Íoslainn"} + IT{"An Iodáil"} + JM{"Iamáice"} + JO{"An Iordáin"} + JP{"An tSeapáin"} + KE{"An Chéinia"} + KG{"An Chirgeastáin"} + KH{"An Chambóid"} + KI{"Cireabaití"} + KM{"Oileáin Chomóra"} + KN{"Saint Kitts agus Nevis"} + KP{"An Chóiré Thuaidh"} + KR{"An Chóiré Theas"} + KW{"Cuáit"} + KY{"Oileáin Cayman"} + KZ{"An Chasacstáin"} + LA{"Laos"} + LB{"An Liobáin"} + LC{"Saint Lucia"} + LI{"Lichtinstéin"} + LK{"Srí Lanca"} + LR{"An Libéir"} + LS{"Leosóta"} + LT{"An Liotuáin"} + LU{"Lucsamburg"} + LV{"An Laitvia"} + LY{"An Libia"} + MA{"Maracó"} + MC{"Monacó"} + MD{"An Mholdóiv"} + MG{"Madagascar"} + MH{"Oileáin Marshall"} + MK{"An Mhacadóin"} + ML{"Mailí"} + MM{"Maenmar"} + MN{"An Mhongóil"} + MP{"Oileáin Mariana Thuaidh"} + MQ{"Martinique"} + MR{"An Mharatáin"} + MS{"Montsarat"} + MT{"Málta"} + MU{"Oileán Mhuirís"} + MV{"Mhaildiví"} + MW{"An Mhaláiv"} + MX{"Meicsiceo"} + MY{"An Mhalaeisia"} + MZ{"Mósaimbíc"} + NA{"An Namaib"} + NC{"An Nua-Chaladóin"} + NE{"An Nígir"} + NF{"Oileán Norfolk"} + NG{"An Nigéir"} + NI{"Nicearagua"} + NL{"An Ísiltír"} + NO{"An Iorua"} + NP{"Neipeal"} + NR{"Nárú"} + NU{"Niue"} + NZ{"An Nua-Shéalainn"} + OM{"Oman"} + PA{"Panama"} + PE{"Peiriú"} + PF{"An Pholainéis Fhrancach"} + PG{"Nua-Ghuine Phapua"} + PH{"Na hOileáin Fhilipíneacha"} + PK{"An Phacastáin"} + PL{"An Pholainn"} + PM{"Saint Pierre agus Miquelon"} + PN{"Pitcairn"} + PR{"Portó Ríce"} + PS{"Na Críocha Pailistíneacha"} + PT{"An Phortaingéil"} + PW{"Palau"} + PY{"Paragua"} + QA{"Catar"} + RE{"Réunion"} + RO{"An Rómáin"} + RU{"Cónaidhm na Rúise"} + RW{"Ruanda"} + SA{"An Araib Shádach"} + SB{"Oileáin Solomon"} + SC{"Na Séiséil"} + SD{"An tSúdáin"} + SE{"An tSualainn"} + SG{"Singeapór"} + SH{"San Héilin"} + SI{"An tSlóvéin"} + SJ{"Svalbard agus Jan Mayen"} + SK{"An tSlóvaic"} + SL{"Siarra Leon"} + SM{"San Mairíne"} + SN{"An tSeineagáil"} + SO{"An tSomáil"} + SP{"An tSeirbia"} + SR{"Suranam"} + ST{"Sao Tome agus Principe"} + SV{"An tSalvadóir"} + SY{"An tSiria"} + SZ{"An tSuasalainn"} + TC{"Oileáin Turks agus Caicos"} + TD{"Sead"} + TF{"Críocha Francacha Theas"} + TG{"Tóga"} + TH{"An Téalainn"} + TJ{"An Táidsíceastáin"} + TK{"Tócalá"} + TL{"Tíomór-Leste"} + TM{"An Tuircméanastáin"} + TN{"An Túinéis"} + TO{"Tonga"} + TR{"An Tuirc"} + TT{"Oileáin na Tríonóide agus Tobága"} + TV{"Tuvalú"} + TW{"An Téaváin"} + TZ{"An Tansáin"} + UA{"An Úcráin"} + UG{"Uganda"} + UM{"Mion-Oileáin Imeallacha S.A.M."} + US{"Stáit Aontaithe Mheiriceá"} + UY{"Urugua"} + UZ{"Úisbéiceastáin"} + VA{"An Chathaoir Naofa (Stát Chathair na Vatacáine)"} + VC{"Saint Vincent agus na Grenadines"} + VE{"Veiniséala"} + VG{"Oileáin Bhriotanacha na Maighdean"} + VI{"Oileáin na Maighdean S.A.M."} + VN{"Vítneam"} + VU{"Vanuatú"} + WF{"Oileáin Vailís agus Futúna"} + WS{"Samó"} + YE{"Éimin"} + YT{"Mayotte"} + YU{"An Iúgslaiv"} + ZA{"An Afraic Theas"} + ZM{"An tSaimbia"} + ZW{"An tSiombáib"} } - DayAbbreviations { - "Domh", - "Luan", - "Máirt", - "Céad", - "Déar", - "Aoine", - "Sath", + Currencies{ + ADD{ + "ADD", + "Dínear Andóra", + } + ADP{ + "ADP", + "Peseta Andóra", + } + AED{ + "AED", + "Dirham Aontas na nÉimíríochtaí Arabacha", + } + AFA{ + "AFA", + "Afgainí (1927-2002)", + } + AFN{ + "Af", + "Afgainí", + } + AIF{ + "AIF", + "Franc Affars agus Issas", + } + ALK{ + "ALK", + "Lek Albánach (1946-1961)", + } + ALL{ + "lek", + "Lek Albánach", + } + ALV{ + "ALV", + "Lek Valute Albánach", + } + ALX{ + "ALX", + "Teastais Airgeadraí Dollar na hAlbáine", + } + AMD{ + "dram", + "Dram Airméanach", + } + ANG{ + "AÍ f.", + "Guilder na nAntillí Ísiltíreach", + } + AOA{ + "AOA", + "Kwanza Angólach", + } + AOK{ + "AOK", + "Kwanza Angólach (1977-1990)", + } + AON{ + "AON", + "Kwanza Nua Angólach (1990-2000)", + } + AOR{ + "AOR", + "Kwanza Reajustado Angólach (1995-1999)", + } + AOS{ + "AOS", + "Escudo Angólach", + } + ARA{ + "ARA", + "Austral Airgintíneach", + } + ARM{ + "ARM", + "Peso Moneda Nacional Airgintíneach", + } + ARP{ + "ARP", + "Peso na Airgintíne (1983-1985)", + } + ARS{ + "Arg$", + "Peso na Airgintíne", + } + ATS{ + "ATS", + "Scilling Ostarach", + } + AUD{ + "A$", + "Dollar Astrálach", + } + AUP{ + "AUP", + "Punt Astrálach", + } + AWG{ + "AWG", + "Guilder Aruba", + } + AZM{ + "AZM", + "Manat Asarbaiseánach", + } + BAD{ + "BAD", + "Dínear Bhoisnia-Heirseagaivéin", + } + BAM{ + "KM", + "Marc Inathraithe Bhoisnia-Heirseagaivéin", + } + BAN{ + "BAN", + "Dínear Nua Bhoisnia-Heirseagaivéin", + } + BBD{ + "BDS$", + "Dollar Bharbadóis", + } + BDT{ + "Tk", + "Taka Bhanglaidéiseach", + } + BEC{ + "BEC", + "Franc Beilgeach (inathraithe)", + } + BEF{ + "BF", + "Franc Beilgeach", + } + BEL{ + "BEL", + "Franc Beilgeach (airgeadúil)", + } + BGL{ + "lev", + "Lev Bulgárach Crua", + } + BGM{ + "BGM", + "Lev Bulgárach Sóisialaíoch", + } + BGN{ + "BGN", + "Lev Nua Bulgárach", + } + BGO{ + "BGO", + "Lev Bulgárach (1879-1952)", + } + BGX{ + "BGX", + "Teastais Airgeadraí Lev Bulgárach", + } + BHD{ + "BD", + "Dínear na Bairéine", + } + BIF{ + "Fbu", + "Franc na Burúine", + } + BMD{ + "Ber$", + "Dollar Bheirmiúda", + } + BMP{ + "BMP", + "Punt Bheirmiúda", + } + BND{ + "BND", + "Dollar Bhrúiné", + } + BOB{ + "Bs", + "Boliviano", + } + BOL{ + "BOL", + "Boliviano (1863-1962)", + } + BOP{ + "BOP", + "Peso na Bolaive", + } + BOV{ + "BOV", + "Mvdol Bolavach", + } + BRB{ + "BRB", + "Cruzeiro Novo Brasaíleach (1967-1986)", + } + BRC{ + "BRC", + "Cruzado Brasaíleach", + } + BRE{ + "BRE", + "Cruzeiro Brasaíleach (1990-1993)", + } + BRL{ + "R$", + "Real Brasaíleach", + } + BRN{ + "BRN", + "Cruzado Novo Brasaíleach", + } + BRR{ + "BRR", + "Cruzeiro Brasaíleach", + } + BRZ{ + "BRZ", + "Cruzeiro Brasaíleach (1942-1967)", + } + BSD{ + "BSD", + "Dollar na mBahámaí", + } + BSP{ + "BSP", + "Punt na mBahámaí", + } + BTN{ + "Nu", + "Ngultrum Bútánach", + } + BTR{ + "BTR", + "Rúipí na Bútáine", + } + BUK{ + "BUK", + "Kyat Burmach", + } + BUR{ + "BUR", + "Rúipí Bhurma", + } + BWP{ + "BWP", + "Pula Botsuánach", + } + BYB{ + "BYB", + "Rúbal Nua Béalarúiseach (1994-1999)", + } + BYL{ + "BYL", + "Rúbal Béalarúiseach (1992-1994)", + } + BYR{ + "Rbl", + "Rúbal Béalarúiseach", + } + BZD{ + "BZ$", + "Dollar na Beilíse", + } + BZH{ + "BZH", + "Dollar Hondúrais Bhriotanaigh", + } + CAD{ + "Can$", + "Dollar Ceanada", + } + CDF{ + "CDF", + "Franc Congolais an Chongó", + } + CDG{ + "CDG", + "Franc Phoblacht an Chongó", + } + CDL{ + "CDL", + "Zaire an Chongó", + } + CFF{ + "CFF", + "CFA Franc Phoblacht na hAfraice Láir", + } + CHF{ + "CHF", + "Franc na hEilvéise", + } + CKD{ + "CKD", + "Dollar Oileáin Cook", + } + CLC{ + "CLC", + "Condor na Sile", + } + CLE{ + "CLE", + "Escudo na Sile", + } + CLF{ + "CLF", + "Unidades de Fomento na Sile", + } + CLP{ + "Ch$", + "Peso na Sile", + } + CMF{ + "CMF", + "CFA Franc Chamarúin", + } + CNP{ + "CNP", + "Jen Min Piao Yuan Síneach", + } + CNX{ + "CNX", + "Teastais Airgeadraí Dollar SAM Síneach", + } + CNY{ + "Y", + "Yuan Renminbi Síneach", + } + COB{ + "COB", + "Peso Páipéir na Colóime", + } + COF{ + "COF", + "CFA Franc Chongó", + } + COP{ + "Col$", + "Peso na Colóime", + } + CRC{ + "C", + "Colon Chósta Ríce", + } + CSC{ + "CSC", + "Koruna na Seicslóvaice", + } + CSK{ + "CSK", + "Koruna Crua na Seicslóvaice", + } + CUP{ + "CUP", + "Peso Cúba", + } + CUX{ + "CUX", + "Teastais Airgeadraí Chúba", + } + CVE{ + "CVEsc", + "Escudo na Rinne Verde", + } + CWG{ + "CWG", + "Guilder Curacao", + } + CYP{ + "£C", + "Punt na Cipire", + } + CZK{ + "CZK", + "Koruna Phoblacht na Seice", + } + DDM{ + "DDM", + "Ostmark na hOirGhearmáine", + } + DEM{ + "DEM", + "Deutsche Mark", + } + DES{ + "DES", + "Sperrmark Gearmánach", + } + DJF{ + "DF", + "Franc Djibouti", + } + DKK{ + "DKr", + "Krone Danmhargach", + } + DOP{ + "RD$", + "Peso Doimineacach", + } + DZD{ + "DA", + "Dínear na hAilgéire", + } + DZF{ + "DZF", + "Franc Nua Ailgérach", + } + DZG{ + "DZG", + "Franc Germinal Ailgérach", + } + ECS{ + "ECS", + "Sucre Eacuadóir", + } + ECV{ + "ECV", + "Unidad de Valor Constante (UVC) Eacuadóir", + } + EEK{ + "EEK", + "Kroon na hEastóine", + } + EGP{ + "EGP", + "Punt na hÉigipte", + } + ESP{ + "ESP", + "Peseta Spáinneach", + } + ETB{ + "Br", + "Birr na hAetóipe", + } + ETD{ + "ETD", + "Dollar na hAetóipe", + } + EUR{ + "€", + "Euro", + } + FIM{ + "FIM", + "Markka Fionnlannach", + } + FIN{ + "FIN", + "Markka Fionnlannach (1860-1962)", + } + FJD{ + "F$", + "Dollar Fhidsí", + } + FJP{ + "FJP", + "Punt Fhidsí", + } + FKP{ + "FKP", + "Punt Oileáin Fháclainne", + } + FOK{ + "FOK", + "Kronur Oileáin Fharó", + } + FRF{ + "FRF", + "Franc Francach", + } + FRG{ + "FRG", + "Franc Germinal Francach/Franc Poincare", + } + GAF{ + "GAF", + "CFA Franc na Gabúine", + } + GBP{ + "£", + "Punt Steirling", + } + GEK{ + "GEK", + "Kupon Larit na Grúise", + } + GEL{ + "lari", + "Lari na Grúise", + } + GHC{ + "GHC", + "Cedi Ghána", + } + GHO{ + "GHO", + "Sean-Cedi Ghána", + } + GHP{ + "GHP", + "Punt Ghána", + } + GHR{ + "GHR", + "Cedi Athluachtha Ghána", + } + GIP{ + "GIP", + "Punt Ghiobráltair", + } + GLK{ + "GLK", + "Krone na Graonlainne", + } + GMD{ + "GMD", + "Dalasi Gaimbia", + } + GMP{ + "GMP", + "Punt Gaimbia", + } + GNF{ + "GF", + "Franc Guine", + } + GNI{ + "GNI", + "Franc Guine (1960-1972)", + } + GNS{ + "GNS", + "Syli Guine", + } + GPF{ + "GPF", + "Franc Guadeloupe", + } + GQE{ + "GQE", + "Ekwele Guineana na Guine Meánchriosaí", + } + GQF{ + "GQF", + "Franco na Guine Meánchriosaí", + } + GQP{ + "GQP", + "Peseta Guineana na Guine Meánchriosaí", + } + GRD{ + "GRD", + "Drachma Gréagach", + } + GRN{ + "GRN", + "Drachma Nua Gréagach", + } + GTQ{ + "Q", + "Quetzal Guatamala", + } + GUF{ + "GUF", + "Franc Guiana na Guáine Francaí", + } + GWE{ + "GWE", + "Escudo na Guine Portaingéalaí", + } + GWM{ + "GWM", + "Mil Reis na Guine Portaingéalaí", + } + GWP{ + "GWP", + "Peso Guine-Bhissau", + } + GYD{ + "G$", + "Dollar na Guáine", + } + HKD{ + "HK$", + "Dollar Hong Cong", + } + HNL{ + "L", + "Lempira Hondúrais", + } + HRD{ + "HRD", + "Dínear na Cróite", + } + HRK{ + "HRK", + "Kuna Crótach", + } + HTG{ + "HTG", + "Gourde Háití", + } + HUF{ + "Ft", + "Forint Ungárach", + } + IBP{ + "IBP", + "Punt Thuaisceart Éireann", + } + IDG{ + "IDG", + "Nica Guilder Indinéiseach", + } + IDJ{ + "IDJ", + "Java Rupiah Indinéiseach", + } + IDN{ + "IDN", + "Rupiah Nua Indinéiseach", + } + IDR{ + "Rp", + "Rupiah Indinéiseach", + } + IEP{ + "IR£", + "Punt Éireannach", + } + ILL{ + "ILL", + "Sheqel Iosraelach", + } + ILP{ + "ILP", + "Punt Iosraelach", + } + ILS{ + "ILS", + "Sheqel Nua Iosraelach", + } + IMP{ + "IMP", + "Punt Steirling Oileán Mhanann", + } + INR{ + "=0#Rs.|1#Re.|1 source: ../../../locale/icu/main/gl.xml + */ +gl{ + Countries{ + ES{"España"} } - DayNames { - "Domingo", - "Luns", - "Martes", - "Mércores", - "Xoves", - "Venres", - "Sábado", + Currencies{ + ESP{ + "₧", + "ESP", + { + "¤ #,##0;-¤ #,##0", + ",", + ".", + } + } } - MonthAbbreviations { - "Xan", - "Feb", - "Mar", - "Abr", - "Mai", - "Xuñ", - "Xul", - "Ago", - "Set", - "Out", - "Nov", - "Dec", + ExemplarCharacters{"[a-záéíóúüñ]"} + Languages{ + gl{"galego"} } - MonthNames { - "Xaneiro", - "Febreiro", - "Marzo", - "Abril", - "Maio", - "Xuño", - "Xullo", - "Agosto", - "Setembro", - "Outubro", - "Novembro", - "Decembro", + LocaleScript{ + "Latn", } - NumberElements { + NumberElements{ ",", ".", ";", @@ -65,26 +43,65 @@ gl { "‰", "∞", "�", - ",", + "+", } - LocaleID:int { 0x56 } -// LocaleScript{ -// "Latn", // ISO 15924 Name -// } - ExemplarCharacters { "[a-z \u00e1 \u00e9 \u00ed \u00f3 \u00fa \u00fc \u00f1]" } - - // /**************** Info Below is needed ****************/ - // CollationElements{} - // Countries{} - // Eras{} - // Languages{} - // ShortLanguage { } - // localPatternChars{} - // - - - // Currency display names - Currencies { - ESP { "\u20A7", "ESP" } // Spanish Peseta + Version{"1.2"} + calendar{ + gregorian{ + dayNames{ + format{ + abbreviated{ + "Dom", + "Lun", + "Mar", + "Mér", + "Xov", + "Ven", + "Sáb", + } + wide{ + "Domingo", + "Luns", + "Martes", + "Mércores", + "Xoves", + "Venres", + "Sábado", + } + } + } + monthNames{ + format{ + abbreviated{ + "Xan", + "Feb", + "Mar", + "Abr", + "Mai", + "Xuñ", + "Xul", + "Ago", + "Set", + "Out", + "Nov", + "Dec", + } + wide{ + "Xaneiro", + "Febreiro", + "Marzo", + "Abril", + "Maio", + "Xuño", + "Xullo", + "Agosto", + "Setembro", + "Outubro", + "Novembro", + "Decembro", + } + } + } + } } } diff --git a/icuSources/data/locales/gl_ES.txt b/icuSources/data/locales/gl_ES.txt index fe49213d..aff974f5 100644 --- a/icuSources/data/locales/gl_ES.txt +++ b/icuSources/data/locales/gl_ES.txt @@ -1,32 +1,36 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/gl_ES.xml // * // *************************************************************************** - -gl_ES { - Version { "2.0" } - DateTimeElements:intvector { - 2, - 1, - } - DateTimePatterns { - "HH:mm:ss z", - "HH:mm:ss z", - "HH:mm:ss", - "HH:mm", - "EEEE dd MMMM yyyy", - "dd MMMM yyyy", - "MMM dd,yy", - "dd/MM/yy", - "{1} {0}", - } - NumberPatterns { +gl_ES{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "#,##0.00 \u00A4;-#,##0.00 \u00A4", + "#,##0.00 ¤;-#,##0.00 ¤", "#,##0%", "#E0", } - LocaleID:int { 0x0456 } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "HH:mm:ss z", + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm", + "EEEE dd MMMM yyyy", + "dd MMMM yyyy", + "MMM dd,yy", + "dd/MM/yy", + "{1} {0}", + } + } + } } diff --git a/icuSources/data/locales/gl_ES_PREEURO.txt b/icuSources/data/locales/gl_ES_PREEURO.txt deleted file mode 100644 index 9d7eada1..00000000 --- a/icuSources/data/locales/gl_ES_PREEURO.txt +++ /dev/null @@ -1,16 +0,0 @@ -// *************************************************************************** -// * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -gl_ES_PREEURO { - Version { "2.0" } - NumberPatterns { - "#,#0.##;-#,#0.##", - "\u00a4 #,##0;-\u00a4 #,##0", - "#,#0%", - "#E0", - } -} diff --git a/icuSources/data/locales/gu.txt b/icuSources/data/locales/gu.txt index d9cd7fea..a649e7e0 100644 --- a/icuSources/data/locales/gu.txt +++ b/icuSources/data/locales/gu.txt @@ -1,101 +1,115 @@ -// *************************************************************************** -// * -// * Copyright (C) 2001-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -gu { - Version{ "2.0" } - LocaleID:int { 0x47 } - Languages { - gu { "\u0A97\u0AC1\u0A9C\u0AB0\u0ABE\u0AA4\u0AC0" } - } - Countries { - IN { "\u0AAD\u0ABE\u0AB0\u0AA4" } - } - AmPmMarkers{ - "\u0AAA\u0AC2\u0AB0\u0ACD\u0AB5\u00A0\u0AAE\u0AA7\u0ACD\u0AAF\u0ABE\u0AB9\u0ACD\u0AA8", - "\u0A89\u0AA4\u0ACD\u0AA4\u0AB0\u00A0\u0AAE\u0AA7\u0ACD\u0AAF\u0ABE\u0AB9\u0ACD\u0AA8" - } -// ShortLanguage{ -// "GUJ" -// } - DayNames{ - "\u0AB0\u0AB5\u0ABF\u0AB5\u0ABE\u0AB0", - "\u0AB8\u0ACB\u0AAE\u0AB5\u0ABE\u0AB0", - "\u0AAE\u0A82\u0A97\u0AB3\u0AB5\u0ABE\u0AB0", - "\u0AAC\u0AC1\u0AA7\u0AB5\u0ABE\u0AB0", - "\u0A97\u0AC1\u0AB0\u0AC1\u0AB5\u0ABE\u0AB0", - "\u0AB6\u0AC1\u0A95\u0ACD\u0AB0\u0AB5\u0ABE\u0AB0", - "\u0AB6\u0AA8\u0ABF\u0AB5\u0ABE\u0AB0" - } - - DayAbbreviations{ - "\u0AB0\u0AB5\u0ABF", - "\u0AB8\u0ACB\u0AAE", - "\u0AAE\u0A82\u0A97\u0AB3", - "\u0AAC\u0AC1\u0AA7", - "\u0A97\u0AC1\u0AB0\u0AC1", - "\u0AB6\u0AC1\u0A95\u0ACD\u0AB0", - "\u0AB6\u0AA8\u0ABF" - } - - MonthNames{ - "\u0A9C\u0ABE\u0AA8\u0ACD\u0AAF\u0AC1\u0A86\u0AB0\u0AC0", - "\u0AAB\u0AC7\u0AAC\u0ACD\u0AB0\u0AC1\u0A86\u0AB0\u0AC0", - "\u0AAE\u0ABE\u0AB0\u0ACD\u0A9A", - "\u0A8F\u0AAA\u0ACD\u0AB0\u0ABF\u0AB2", - "\u0AAE\u0AC7", - "\u0A9C\u0AC2\u0AA8", - "\u0A9C\u0AC1\u0AB2\u0ABE\u0A88", - "\u0A91\u0A97\u0AB8\u0ACD\u0A9F", - "\u0AB8\u0AAA\u0ACD\u0A9F\u0AC7\u0AAE\u0ACD\u0AAC\u0AB0", - "\u0A91\u0A95\u0ACD\u0A9F\u0ACD\u0AAC\u0AB0", - "\u0AA8\u0AB5\u0AC7\u0AAE\u0ACD\u0AAC\u0AB0", - "\u0AA1\u0ABF\u0AB8\u0AC7\u0AAE\u0ACD\u0AAC\u0AB0", - } - - MonthAbbreviations { - "\u0A9C\u0ABE\u0AA8\u0ACD\u0AAF\u0AC1", - "\u0AAB\u0AC7\u0AAC\u0ACD\u0AB0\u0AC1", - "\u0AAE\u0ABE\u0AB0\u0ACD\u0A9A", - "\u0A8F\u0AAA\u0ACD\u0AB0\u0ABF\u0AB2", - "\u0AAE\u0AC7", - "\u0A9C\u0AC2\u0AA8", - "\u0A9C\u0AC1\u0AB2\u0ABE\u0A88", - "\u0A91\u0A97\u0AB8\u0ACD\u0A9F", - "\u0AB8\u0AAA\u0ACD\u0A9F\u0AC7", - "\u0A91\u0A95\u0ACD\u0A9F\u0ACB", - "\u0AA8\u0AB5\u0AC7", - "\u0AA1\u0ABF\u0AB8\u0AC7", - } - - NumberElements{ - ".", - ",", - ";", - "%", - "\u0AE6", - "#", - "-", - "E", - "\u2030", - "\u221E", - "\uFFFD", - ".", - } - LocaleScript:array { "Gujr" } - ExemplarCharacters { "[[:Gujr:]\u200c\u200d]" } - CollationElements { - Version { "1.0" } - Sequence { - "[normalization on]" - } - } - - // Currency display names - Currencies { - INR { "\u0AB0\u0AC1", "INR" } - } -} \ No newline at end of file +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/gu.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/gu.xml + */ +gu{ + Countries{ + CN{"ચીન"} + DE{"જમિની"} + EG{"મિસર"} + GE{"જ્યોર્જીયા"} + IN{"ભારત"} + NP{"નેપાળ"} + PK{"કરાંચી"} + TM{"તુર્ક્મનિસ્તાન"} + TR{"તુર્કસ્તાન"} + US{"સંયુકત રાજ્ય અમેરિકા"} + } + Currencies{ + INR{ + "રુ", + "INR", + } + } + ExemplarCharacters{"[[:Gujr:]‌‍]"} + Languages{ + gu{"ગુજરાતી"} + } + LocaleScript{ + "Gujr", + } + NumberElements{ + ".", + ",", + ";", + "%", + "૦", + "#", + "-", + "E", + "‰", + "∞", + "�", + "+", + } + Version{"1.2"} + calendar{ + gregorian{ + AmPmMarkers{ + "પૂર્વ મધ્યાહ્ન", + "ઉત્તર મધ્યાહ્ન", + } + dayNames{ + format{ + abbreviated{ + "રવિ", + "સોમ", + "મંગળ", + "બુધ", + "ગુરુ", + "શુક્ર", + "શનિ", + } + wide{ + "રવિવાર", + "સોમવાર", + "મંગળવાર", + "બુધવાર", + "ગુરુવાર", + "શુક્રવાર", + "શનિવાર", + } + } + } + monthNames{ + format{ + abbreviated{ + "જાન્યુ", + "ફેબ્રુ", + "માર્ચ", + "એપ્રિલ", + "મે", + "જૂન", + "જુલાઈ", + "ઑગસ્ટ", + "સપ્ટે", + "ઑક્ટો", + "નવે", + "ડિસે", + } + wide{ + "જાન્યુઆરી", + "ફેબ્રુઆરી", + "માર્ચ", + "એપ્રિલ", + "મે", + "જૂન", + "જુલાઈ", + "ઑગસ્ટ", + "સપ્ટેમ્બર", + "ઑક્ટ્બર", + "નવેમ્બર", + "ડિસેમ્બર", + } + } + } + } + } +} diff --git a/icuSources/data/locales/gu_IN.txt b/icuSources/data/locales/gu_IN.txt index c2f817a3..868a4476 100644 --- a/icuSources/data/locales/gu_IN.txt +++ b/icuSources/data/locales/gu_IN.txt @@ -1,32 +1,42 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 2001-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/gu_IN.xml // * // *************************************************************************** - -gu_IN { - Version { "2.0" } - LocaleID:int { 0x0447 } - DateTimePatterns { - "hh:mm:ss a z", - "hh:mm:ss a z", - "hh:mm:ss a", - "hh:mm a", - "EEEE d MMMM yyyy", - "d MMMM yyyy", - "dd-MM-yyyy", - "d-MM-yy", - "{1} {0}" - } -// DateTimeElements:intvector { -// 1, -// 1 -// } - NumberPatterns { +gu_IN{ + NumberPatterns{ "##,##,##0.###;-##,##,##0.###", - "\u00A4 ##,##,##0.00;-\u00A4 ##,##,##0.00", + "¤ ##,##,##0.00;-¤ ##,##,##0.00", "##,##,##0%", "#E0", } -} \ No newline at end of file + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "hh:mm:ss a z", + "hh:mm:ss a z", + "hh:mm:ss a", + "hh:mm a", + "EEEE d MMMM yyyy", + "d MMMM yyyy", + "dd-MM-yyyy", + "d-MM-yy", + "{1} {0}", + } + weekend:intvector{ + 1, + 0, + 1, + 86400000, + } + } + } +} diff --git a/icuSources/data/locales/gv.txt b/icuSources/data/locales/gv.txt index fd2df78b..943e77c0 100644 --- a/icuSources/data/locales/gv.txt +++ b/icuSources/data/locales/gv.txt @@ -1,81 +1,92 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/gv.xml // * // *************************************************************************** - -gv { - Version { "2.0" } - DayAbbreviations { - "Jed", - "Jel", - "Jem", - "Jerc", - "Jerd", - "Jeh", - "Jes", +/** + * ICU source: ../../../locale/icu/main/gv.xml + */ +gv{ + Countries{ + GB{"Rywvaneth Unys"} } - DayNames { - "Jedoonee", - "Jelhein", - "Jemayrt", - "Jercean", - "Jerdein", - "Jeheiney", - "Jesarn", + ExemplarCharacters{"[a-zç]"} + Languages{ + gv{"Gaelg"} } - MonthAbbreviations { - "J-guer", - "T-arree", - "Mayrnt", - "Avrril", - "Boaldyn", - "M-souree", - "J-souree", - "Luanistyn", - "M-fouyir", - "J-fouyir", - "M.Houney", - "M.Nollick", + LocaleScript{ + "Latn", } - MonthNames { - "Jerrey-geuree", - "Toshiaght-arree", - "Mayrnt", - "Averil", - "Boaldyn", - "Mean-souree", - "Jerrey-souree", - "Luanistyn", - "Mean-fouyir", - "Jerrey-fouyir", - "Mee Houney", - "Mee ny Nollick", + Version{"1.2"} + calendar{ + gregorian{ + AmPmMarkers{ + "a.m.", + "p.m.", + } + dayNames{ + format{ + abbreviated{ + "Jed", + "Jel", + "Jem", + "Jerc", + "Jerd", + "Jeh", + "Jes", + } + wide{ + "Jedoonee", + "Jelhein", + "Jemayrt", + "Jercean", + "Jerdein", + "Jeheiney", + "Jesarn", + } + } + } + eras{ + abbreviated{ + "RC", + "AD", + } + } + monthNames{ + format{ + abbreviated{ + "J-guer", + "T-arree", + "Mayrnt", + "Avrril", + "Boaldyn", + "M-souree", + "J-souree", + "Luanistyn", + "M-fouyir", + "J-fouyir", + "M.Houney", + "M.Nollick", + } + wide{ + "Jerrey-geuree", + "Toshiaght-arree", + "Mayrnt", + "Averil", + "Boaldyn", + "Mean-souree", + "Jerrey-souree", + "Luanistyn", + "Mean-fouyir", + "Jerrey-fouyir", + "Mee Houney", + "Mee ny Nollick", + } + } + } + } } -// NumberElements { -// ".", -// ",", -// ";", -// "%", -// "0", -// "#", -// "-", -// "E", -// "\u2030", -// "\u221e", -// "\ufffd", -// } -// LocaleScript{ -// "Latn", // ISO 15924 Name -// } - - // /**************** Info Below is needed ****************/ - // CollationElements{} - // Countries{} - // Eras{} - // Languages{} - // ShortLanguage { } - // localPatternChars{} - // } diff --git a/icuSources/data/locales/gv_GB.txt b/icuSources/data/locales/gv_GB.txt index bd9de407..c6148760 100644 --- a/icuSources/data/locales/gv_GB.txt +++ b/icuSources/data/locales/gv_GB.txt @@ -1,31 +1,36 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/gv_GB.xml // * // *************************************************************************** - -gv_GB { - Version { "2.0" } - DateTimeElements:intvector { - 2, - 1, - } - DateTimePatterns { - "HH:mm:ss z", - "HH:mm:ss", - "HH:mm:ss", - "HH:mm", - "EEEE dd MMMM yyyy", - "dd MMMM yyyy", - "MMM dd,yy", - "dd/MM/yy", - "{1} {0}", - } - NumberPatterns { +gv_GB{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "\u00a4#,##0.00;-\u00a4#,##0.00", + "¤#,##0.00;-¤#,##0.00", "#,##0%", "#E0", } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm:ss", + "HH:mm", + "EEEE dd MMMM yyyy", + "dd MMMM yyyy", + "MMM dd,yy", + "dd/MM/yy", + "{1} {0}", + } + } + } } diff --git a/icuSources/data/locales/haw.txt b/icuSources/data/locales/haw.txt index f9450b8e..34c62af6 100644 --- a/icuSources/data/locales/haw.txt +++ b/icuSources/data/locales/haw.txt @@ -1,96 +1,104 @@ -// Hawaiian language -// Based on data from Keola Donaghy, University of Hawaii -// Submitted by Deborah Goldsmith, Apple Computer, Inc. - -haw { - Version { "0.1" } - CollationElements { - // "&a <<< A" is redundant but is included for clarity - Version { "0.1" } - Sequence { - "&u < h < k < l < m < n < p < w < \u02bb < b < c < d < f < g < j < q < r < s < t < v < x < y < z" - "&h <<< H" - "&k <<< K" - "&l <<< L" - "&m <<< M" - "&n <<< N" - "&p <<< P" - "&w <<< W" - "&b <<< B" - "&c <<< C" - "&d <<< D" - "&f <<< F" - "&g <<< G" - "&j <<< J" - "&q <<< Q" - "&r <<< R" - "&s <<< S" - "&t <<< T" - "&v <<< V" - "&x <<< X" - "&y <<< Y" - "&z <<< Z" - } - } - - MonthAbbreviations { - "Ian.", - "Pep.", - "Mal.", - "\u02bbAp.", - "Mei.", - "Iun.", - "Iul.", - "\u02bbAu.", - "Kep.", - "\u02bbOk.", - "Now.", - "Kek.", - } - - MonthNames { - "Ianuali", - "Pepeluali", - "Malaki", - "\u02bbApelila", - "Mei", - "Iune", - "Iulai", - "\u02bbAukake", - "Kepakemapa", - "\u02bbOkakopa", - "Nowemapa", - "Kekemapa", - } - - DayAbbreviations { - "LP", - "P1", - "P2", - "P3", - "P4", - "P5", - "P6", - } - - DayNames { - "L\u0101pule", - "Po\u02bbakahi", - "Po\u02bbalua", - "Po\u02bbakolu", - "Po\u02bbah\u0101", - "Po\u02bbalima", - "Po\u02bbaono", - } - - Languages { - haw { "\u02bb\u014dlelo Hawai\u02bbi" } - } - - Countries { - US { "\u02bbAmelika Hui P\u016b \u02bbIa" } - } - - ExemplarCharacters{"[a-z \u02bb \u0101 \u0113 \u012b \u014d \u016b ]"} - +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: /Users/deglocal/Desktop/Totoro/icucvs/locale/common/main/haw.xml +// * +// *************************************************************************** +/** + * ICU source: /Users/deglocal/Desktop/Totoro/icucvs/locale/icu/main/haw.xml + */ +haw{ + Countries{ + AU{"Nūhōlani"} + CA{"Kanakā"} + CN{"Kina"} + DE{"Kelemānia"} + DK{"Kenemaka"} + ES{"Kepania"} + FR{"Palani"} + GB{"Aupuni Mōʻī Hui Pū ʻIa"} + GR{"Helene"} + IE{"ʻIlelani"} + IL{"ʻIseraʻela"} + IN{"ʻĪnia"} + IT{"ʻĪkālia"} + JP{"Iāpana"} + MX{"Mekiko"} + NL{"Hōlani"} + NZ{"Aotearoa"} + PH{"ʻĀina Pilipino"} + RU{"Lūkia"} + US{"ʻAmelika Hui Pū ʻIa"} + } + ExemplarCharacters{"[āēīōūaeiouhklmnpwʻ]"} + Languages{ + haw{"ʻōlelo Hawaiʻi"} + } + LocaleScript{ + "Latn", + } + /** + * Draft + */ + Version{"x1.2"} + calendar{ + gregorian{ + dayNames{ + format{ + abbreviated{ + "LP", + "P1", + "P2", + "P3", + "P4", + "P5", + "P6", + } + wide{ + "Lāpule", + "Poʻakahi", + "Poʻalua", + "Poʻakolu", + "Poʻahā", + "Poʻalima", + "Poʻaono", + } + } + } + monthNames{ + format{ + abbreviated{ + "Ian.", + "Pep.", + "Mal.", + "ʻAp.", + "Mei", + "Iun.", + "Iul.", + "ʻAu.", + "Kep.", + "ʻOk.", + "Now.", + "Kek.", + } + wide{ + "Ianuali", + "Pepeluali", + "Malaki", + "ʻApelila", + "Mei", + "Iune", + "Iulai", + "ʻAukake", + "Kepakemapa", + "ʻOkakopa", + "Nowemapa", + "Kekemapa", + } + } + } + } + } } diff --git a/icuSources/data/locales/haw_US.txt b/icuSources/data/locales/haw_US.txt index d8423802..eb438a3b 100644 --- a/icuSources/data/locales/haw_US.txt +++ b/icuSources/data/locales/haw_US.txt @@ -1,27 +1,40 @@ -// Hawaiian US locale -// Based on data from Keola Donaghy, University of Hawaii -// Submitted by Deborah Goldsmith, Apple Computer, Inc. - -haw_US { - Version { "0.1" } - - DateTimePatterns { - "h:mm:ss a z", - "h:mm:ss a z", - "h:mm:ss a", - "h:mm a", - "EEEE, d MMMM yyyy", - "d MMMM yyyy", - "d MMM yyyy", - "d/M/yy", - "{1} {0}", - } - - NumberPatterns { +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: /Users/deglocal/Desktop/Totoro/icucvs/locale/common/main/haw_US.xml +// * +// *************************************************************************** +haw_US{ + MeasurementSystem:int{1} + NumberPatterns{ "#,##0.###;-#,##0.###", - "\u00A4#,##0.00;(\u00A4#,##0.00)", + "¤#,##0.00;(¤#,##0.00)", "#,##0%", "#E0", } - + PaperSize:intvector{ + 279, + 216, + } + /** + * Draft + */ + Version{"x1.2"} + calendar{ + gregorian{ + DateTimePatterns{ + "h:mm:ss a z", + "h:mm:ss a z", + "h:mm:ss a", + "h:mm a", + "EEEE, d MMMM yyyy", + "d MMMM yyyy", + "d MMM yyyy", + "d/M/yy", + "{1} {0}", + } + } + } } diff --git a/icuSources/data/locales/he.txt b/icuSources/data/locales/he.txt index a995ac92..3276cd3b 100644 --- a/icuSources/data/locales/he.txt +++ b/icuSources/data/locales/he.txt @@ -1,140 +1,503 @@ -// *************************************************************************** -// * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -he { - Version{"2.0"} - CollationElements { - Version { "2.0" } - Sequence { "[normalization on]& Z < \u05D0 < \u05D1 < \u05D2 < \u05D3 < \u05D4 < \u05D5 < " - "\u05F0 < \u05F1 < \u05D6 < \u05D7 < \u05D8 < \u05D9 < \u05F2 < \u05DA <<< \u05DB " - "< \u05DC < \u05DD <<< \u05DE < \u05DF <<< \u05E0 < \u05E1 < \u05E2 < \u05E3 <<< \u05E4" - " < \u05E5 <<< \u05E6 < \u05E7 < \u05E8 < \u05E9 < \u05EA" } - } - Countries { - IL { "\u05D9\u05E9\u05E8\u05D0\u05DC" } - } - DateTimePatterns { - "HH:mm:ss z", - "HH:mm:ss z", - "HH:mm:ss", - "HH:mm", - "EEEE d MMMM yyyy", - "d MMMM yyyy", - "dd/MM/yyyy", - "dd/MM/yy", - "{0} {1}", - } - DayAbbreviations { - "\u05D0", - "\u05D1", - "\u05D2", - "\u05D3", - "\u05D4", - "\u05D5", - "\u05E9", - } - DayNames { - "\u05D9\u05D5\u05DD \u05E8\u05D0\u05E9\u05D5\u05DF", - "\u05D9\u05D5\u05DD \u05E9\u05E0\u05D9", - "\u05D9\u05D5\u05DD \u05E9\u05DC\u05D9\u05E9\u05D9", - "\u05D9\u05D5\u05DD \u05E8\u05D1\u05D9\u05E2\u05D9", - "\u05D9\u05D5\u05DD \u05D7\u05DE\u05D9\u05E9\u05D9", - "\u05D9\u05D5\u05DD \u05E9\u05D9\u05E9\u05D9", - "\u05E9\u05D1\u05EA", - } - Eras { - "\u05DC\u05E1\u05D4\u0022\u05E0", - "\u05DC\u05E4\u05E1\u05D4\u0022\u05E0", - } - Languages { - he { "\u05E2\u05D1\u05E8\u05D9\u05EA" } - //iw { "\u05E2\u05D1\u05E8\u05D9\u05EA" } //Use he instead - } - LocaleID:int { 0x0d } -// LocaleString { "he" } - MonthAbbreviations { - "\u05D9\u05E0\u05D5", - "\u05E4\u05D1\u05E8", - "\u05DE\u05E8\u05E5", - "\u05D0\u05E4\u05E8", - "\u05DE\u05D0\u05D9", - "\u05D9\u05D5\u05E0", - "\u05D9\u05D5\u05DC", - "\u05D0\u05D5\u05D2", - "\u05E1\u05E4\u05D8", - "\u05D0\u05D5\u05E7", - "\u05E0\u05D5\u05D1", - "\u05D3\u05E6\u05DE", - } - MonthNames { - "\u05D9\u05E0\u05D5\u05D0\u05E8", - "\u05E4\u05D1\u05E8\u05D5\u05D0\u05E8", - "\u05DE\u05E8\u05E5", - "\u05D0\u05E4\u05E8\u05D9\u05DC", - "\u05DE\u05D0\u05D9", - "\u05D9\u05D5\u05E0\u05D9", - "\u05D9\u05D5\u05DC\u05D9", - "\u05D0\u05D5\u05D2\u05D5\u05E1\u05D8", - "\u05E1\u05E4\u05D8\u05DE\u05D1\u05E8", - "\u05D0\u05D5\u05E7\u05D8\u05D5\u05D1\u05E8", - "\u05E0\u05D5\u05D1\u05DE\u05D1\u05E8", - "\u05D3\u05E6\u05DE\u05D1\u05E8", - } -// ShortLanguage { "heb" } - localPatternChars { "GanjkHmsSEDFwWxhKzAe" } - zoneStrings { - { - "Africa/Casablanca", - "GMT", - "GMT", - "GMT", - "GMT", - } - } - LocaleScript:array { - "Hebr" // ISO 15924 Name - } - ExemplarCharacters{"[[:Hebr:]\u200f\u200e]"} - //------------------------------------------------------------ - // Rule Based Number Format Support - //------------------------------------------------------------ - -// * Spellout rules for Hebrew. Hebrew actually has inflected forms for -// * most of the lower-order numbers. The masculine forms are shown -// * here. - - // This data is woefully incomplete. Can someone fill me in on the - // various inflected forms of the numbers, which seem to be necessary - // to do Hebrew correctly? Can somone supply me with data for values - // from 1,000,000 on up? What about the word for zero? What about - // information on negatives and decimals? - - SpelloutRules { - "zero (incomplete data); \u05d0\u05d4\u05d3; \u05e9\u05d2\u05d9\u05d9\u05dd; \u05e9\u05dc\u05d5\u05e9\u05d4;\n" - "4: \u05d0\u05d3\u05d1\u05e6\u05d4; \u05d7\u05d2\u05d5\u05d9\u05e9\u05d4; \u05e9\u05e9\u05d4;\n" - "7: \u05e9\u05d1\u05e6\u05d4; \u05e9\u05de\u05d5\u05d2\u05d4; \u05ea\u05e9\u05e6\u05d4;\n" - "10: \u05e6\u05e9\u05d3\u05d4[ >>];\n" - "20: \u05e6\u05e9\u05d3\u05d9\u05dd[ >>];\n" - "30: \u05e9\u05dc\u05d5\u05e9\u05d9\u05dd[ >>];\n" - "40: \u05d0\u05d3\u05d1\u05e6\u05d9\u05dd[ >>];\n" - "50: \u05d7\u05de\u05d9\u05e9\u05d9\u05dd[ >>];\n" - "60: \u05e9\u05e9\u05d9\u05dd[ >>];\n" - "70: \u05e9\u05d1\u05e6\u05d9\u05dd[ >>];\n" - "80: \u05e9\u05de\u05d5\u05d2\u05d9\u05dd[ >>];\n" - "90: \u05ea\u05e9\u05e6\u05d9\u05dd[ >>];\n" - "100: \u05de\u05d0\u05d4[ >>];\n" - "200: << \u05de\u05d0\u05d4[ >>];\n" - "1000: \u05d0\u05dc\u05e3[ >>];\n" - "2000: << \u05d0\u05dc\u05e3[ >>];\n" - "1,000,000: =#,##0= (incomplete data);" - } - - // Currency display names - Currencies { - ILS { "\u20AA", "\u05E9\u0022\u05D7" } - } -} +// *************************************************************************** +// * +// * Copyright (C) 2005 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/he.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/he.xml + */ +he{ + Countries{ + AD{"אנדורה"} + AE{"איחוד האמירויות הערביות"} + AF{"אפגניסטן"} + AG{"אנטיגואה וברבודה"} + AI{"אנגילה"} + AL{"אלבניה"} + AM{"ארמניה"} + AN{"האינטילים ההולנדיים"} + AO{"אנגולה"} + AQ{"אנטארקטיקה"} + AR{"ארגנטינה"} + AS{"סמואה האמריקנית"} + AT{"אוסטריה"} + AU{"אוסטרליה"} + AW{"ארובה"} + AZ{"אזרבייג׳ן"} + BA{"בוסניה הרצגובינה"} + BB{"ברבדוס"} + BD{"בנגלדש"} + BE{"בלגיה"} + BF{"בורקינה פאסו"} + BG{"בולגריה"} + BH{"בחריין"} + BI{"בורונדי"} + BJ{"בנין"} + BM{"ברמודה"} + BN{"ברוניי דארסלאם"} + BO{"בוליביה"} + BR{"ברזיל"} + BS{"בהאמה"} + BT{"בוטאן"} + BV{"האי בובה"} + BW{"בוטסוואנה"} + BY{"בלרוס"} + BZ{"בליז"} + CA{"קנדה"} + CC{"איי קוקוס (קילינג)"} + CD{"קונגו, הרפובליקה הדמוקרטית של"} + CF{"הרפובליקה של מרכז אפריקה"} + CG{"קונגו"} + CH{"שווייץ"} + CI{"חוף השנהב"} + CK{"איי קוק"} + CL{"צ׳ילה"} + CM{"קמרון"} + CN{"סין"} + CO{"קולומביה"} + CR{"קוסטה ריקה"} + CU{"קובה"} + CV{"קייפ ורדה"} + CX{"איי כריסטמס"} + CY{"קפריסין"} + CZ{"הרפובליקה הצ׳כית"} + DE{"גרמניה"} + DJ{"ג׳יבוטי"} + DK{"דנמרק"} + DM{"דומיניקה"} + DO{"הרפובליקה הדומיניקנית"} + DZ{"אלג׳יריה"} + EC{"אקוואדור"} + EE{"אסטוניה"} + EG{"מצרים"} + EH{"סהרה המערבית"} + ER{"אריתריאה"} + ES{"ספרד"} + ET{"אתיופיה"} + FI{"פינלנד"} + FJ{"פיג׳י"} + FK{"איי פוקלנד"} + FM{"מאוריציוס, המדינות המאוגדות של"} + FO{"איי פארו"} + FR{"צרפת"} + GA{"גבון"} + GB{"בריטניה"} + GD{"גרנדה"} + GE{"גרוזיה"} + GF{"גיאנה הצרפתית"} + GH{"גאנה"} + GI{"גיברלטר"} + GL{"גרינלנד"} + GM{"גמביה"} + GN{"גיניאה"} + GP{"גוואדלופ"} + GQ{"גיניאה המשוונית"} + GR{"יוון"} + GS{"האי ג׳ורג׳יה הדרומית ואיי סנדוויץ׳ הדרומיים"} + GT{"גווטמאלה"} + GU{"גואם"} + GW{"גיניאה-ביסאו"} + GY{"גיאנה"} + HK{"הונג קונג S.A.R. של סין"} + HM{"איי הרד ואיי מקדונלנד"} + HN{"הונדורס"} + HR{"קרואטיה"} + HT{"האיטי"} + HU{"הונגריה"} + ID{"אינדונזיה"} + IE{"אירלנד"} + IL{"ישראל"} + IN{"הודו"} + IO{"הטריטוריה הבריטית באוקינוס ההודי"} + IQ{"עירק"} + IR{"איראן, הרפובליקה האיסלמית"} + IS{"איסלנד"} + IT{"איטליה"} + JM{"ג׳מייקה"} + JO{"ירדן"} + JP{"יפן"} + KE{"קניה"} + KG{"קירגיזסטן"} + KH{"קמבודיה"} + KI{"קיריבאטי"} + KM{"קומורוס"} + KN{"סנט קיטס וניבס"} + KP{"קוריאה, צפון"} + KR{"קוריאה, דרום"} + KW{"כווית"} + KY{"איי קיימאן"} + KZ{"קזחסטן"} + LA{"לאוס, הרפובליקה הדמקורטית העממית"} + LB{"לבנון"} + LC{"סנט לושיה"} + LI{"ליכטנשטיין"} + LK{"סרי לנקה"} + LR{"ליבריה"} + LS{"לסוטו"} + LT{"ליטא"} + LU{"לוקסמבורג"} + LV{"לטביה"} + LY{"לוב"} + MA{"מרוקו"} + MC{"מונקו"} + MD{"מולדובה, הרפובליקה"} + MG{"מדגסקר"} + MH{"איי מרשל"} + MK{"מקדוניה, הרפובליקה של"} + ML{"מאלי"} + MM{"מינמאר"} + MN{"מונגוליה"} + MO{"מקאו S.A.R. של סין"} + MP{"איי מריאנה הצפוניים"} + MQ{"מרטיניק"} + MR{"מאוריטניה"} + MS{"מונטסראט"} + MT{"מלטה"} + MU{"מאוריציוס"} + MV{"מלדיבאס"} + MW{"מלאווי"} + MX{"מכסיקו"} + MY{"מלזיה"} + MZ{"מוזמביק"} + NA{"נמיביה"} + NC{"קלדוניה החדשה"} + NE{"ניז׳ר"} + NF{"איי נורפק"} + NG{"ניגריה"} + NI{"ניקראגווה"} + NL{"הולנד"} + NO{"נורווגיה"} + NP{"נפאל"} + NR{"נאורו"} + NU{"ניווה"} + NZ{"ניו זילנד"} + OM{"עומן"} + PA{"פנמה"} + PE{"פרו"} + PF{"פולינזיה הצרפתית"} + PG{"פפואה גיניאה החדשה"} + PH{"פיליפינים"} + PK{"פקיסטן"} + PL{"פולין"} + PM{"סנט פייר ומיקלון"} + PN{"פיטקיירן"} + PR{"פורטו ריקו"} + PS{"הרשות הפלשתינית"} + PT{"פורטוגל"} + PW{"פלאו"} + PY{"פראגוואי"} + QA{"קטר"} + RE{"ראוניון"} + RO{"רומניה"} + RU{"חבר המדינות הרוסיות"} + RW{"רואנדה"} + SA{"ערב הסעודית"} + SB{"איי שלמה"} + SC{"איי סיישל"} + SD{"סודן"} + SE{"שוודיה"} + SG{"סינגפור"} + SH{"סיינט הלנה"} + SI{"סלובניה"} + SJ{"סוולבארד וז׳אן מאיין"} + SK{"סלובקיה"} + SL{"סיירה לאונה"} + SM{"סן מרינו"} + SN{"סנגל"} + SO{"סומליה"} + SR{"סורינאם"} + ST{"סן תומה ופרינסיפה"} + SV{"אל סלבאדור"} + SY{"הרפובליקה הערבית הסורית"} + SZ{"סווזילנד"} + TC{"איי טורקס וקאיקוס"} + TD{"צ׳אד"} + TF{"טריטוריות דרומיות של צרפת"} + TG{"טוגו"} + TH{"תאילנד"} + TJ{"טג׳יקיסטן"} + TK{"טוקלאו"} + TL{"מזרח טימור"} + TM{"טורקמניסטן"} + TN{"טוניסיה"} + TO{"טונגה"} + TR{"טורקיה"} + TT{"טרינידד וטובגו"} + TV{"טובאלו"} + TW{"טיוואן"} + TZ{"טנזניה"} + UA{"אוקראינה"} + UG{"אוגנדה"} + UM{"איים קטנים שלחוף ארצות הברית"} + US{"ארצות הברית"} + UY{"אורוגוואי"} + UZ{"אוזבקיסטן"} + VA{"הוותיקן"} + VC{"סנט וינסנט והגרנדינים"} + VE{"ונצואלה"} + VG{"איי הבתולה הבריטיים"} + VI{"איי הבתולה האמריקניים"} + VN{"וייטנאם"} + VU{"ואנואטו"} + WF{"ואליס ופוטונה"} + WS{"סמואה"} + YE{"תימן"} + YT{"מיוטה"} + YU{"יוגוסלביה"} + ZA{"דרום אפריקה"} + ZM{"זמביה"} + ZW{"זימבבווה"} + } + Currencies{ + ILS{ + "₪", + "ש\"ח", + } + TRY{ + "TRY", + "לירה טורקית חדשה", + } + } + ExemplarCharacters{"[ְ-ֹֻ-ֽֿׁ-ׂׄא-ת]"} + Keys{ + calendar{"לוח שנה"} + collation{"מיון"} + currency{"מטבע"} + } + Languages{ + aa{"אתיופית"} + af{"אפריקנית"} + ar{"ערבית"} + arc{"ארמית"} + ast{"אוסטרית"} + aus{"שפות אוסטרליות"} + bg{"בולגרית"} + bn{"בנגלית"} + bo{"טיבטית"} + bs{"בוסנית"} + ca{"קטלונית"} + cad{"קאדו"} + cs{"צ׳כית"} + cy{"וולשית"} + da{"דנית"} + de{"גרמנית"} + egy{"מצרית (עתיקה)"} + el{"יוונית"} + en{"אנגלית"} + eo{"אספרנטו"} + es{"ספרדית"} + et{"אסטונית"} + eu{"בסקית"} + fa{"פרסית"} + fi{"פינית"} + fr{"צרפתית"} + ga{"אירית"} + gd{"סקוטית גאלית"} + he{"עברית"} + hi{"הינדית"} + hr{"קרואטית"} + hu{"הונגרית"} + hy{"ארמנית"} + id{"אינדונזית"} + is{"איסלנדית"} + it{"איטלקית"} + ja{"יפנית"} + ka{"גרוזינית"} + ko{"קוריאנית"} + la{"לטינית"} + lad{"לדינו"} + lt{"ליטאית"} + lv{"לטבית"} + mas{"מאסאית"} + mi{"מאורית"} + mk{"מקדונית"} + mn{"מונגולית"} + mo{"מולדבית"} + mt{"מלטזית"} + mul{"מספר שפות"} + myn{"מאיה"} + nap{"נפוליטנית"} + ne{"נפאלית"} + nl{"הולנדית"} + no{"נורווגית"} + pl{"פולנית"} + pt{"פורטוגזית"} + ro{"רומנית"} + ru{"רוסית"} + sa{"סנסקרית"} + sgn{"שפת סימנים"} + sh{"סרבו-קרואטית"} + sk{"סלובקית"} + sl{"סלובנית"} + sr{"סרבית"} + sv{"שוודית"} + sw{"סווהילית"} + th{"תאי"} + tk{"טורקמנית"} + tr{"טורקית"} + uk{"אוקראינית"} + yi{"יידיש"} + zh{"סינית"} + zu{"זולו"} + } + LocaleScript{ + "Hebr", + } + Scripts{ + Hebr{"עברית"} + } + Types{ + calendar{ + hebrew{"לוח שנה עברי"} + } + } + Version{"1.2"} + calendar{ + gregorian{ + DateTimePatterns{ + "HH:mm:ss z", + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm", + "EEEE d MMMM yyyy", + "d MMMM yyyy", + "dd/MM/yyyy", + "dd/MM/yy", + "{0} {1}", + } + dayNames{ + format{ + abbreviated{ + "א", + "ב", + "ג", + "ד", + "ה", + "ו", + "ש", + } + narrow{ + "א", + "ב", + "ג", + "ד", + "ה", + "ו", + "ש", + } + wide{ + "יום ראשון", + "יום שני", + "יום שלישי", + "יום רביעי", + "יום חמישי", + "יום שישי", + "שבת", + } + } + } + eras{ + abbreviated{ + "לפנה״ס", + "לסה״נ", + } + } + monthNames{ + format{ + abbreviated{ + "ינו", + "פבר", + "מרץ", + "אפר", + "מאי", + "יונ", + "יול", + "אוג", + "ספט", + "אוק", + "נוב", + "דצמ", + } + wide{ + "ינואר", + "פברואר", + "מרץ", + "אפריל", + "מאי", + "יוני", + "יולי", + "אוגוסט", + "ספטמבר", + "אוקטובר", + "נובמבר", + "דצמבר", + } + } + } + weekend:intvector{ + 6, + 0, + 7, + 86400000, + } + } + hebrew{ + eras{ + abbreviated{ + "לבה\"ע", + } + } + monthNames{ + format{ + abbreviated:alias{"he/calendar/hebrew/monthNames/format/wide"} + wide{ + "תשרי", + "חשון", + "כסלו", + "טבת", + "שבט", + "אדר ראשון", + "אדר שני", + "ניסן", + "אייר", + "סיון", + "תמוז", + "אב", + "אלול", + } + } + } + } + islamic{ + eras{ + abbreviated{ + "שנת היג׳רה", + } + } + monthNames{ + format{ + abbreviated:alias{"he/calendar/islamic/monthNames/format/wide"} + wide{ + "מוחרם", + "ספר", + "רביע אל-אוואל", + "רביע אל-תני", + "ג׳ומדה אל-אוואל", + "ג׳ומדה אל-תני", + "רג׳אב", + "שעבאן", + "ראמדן", + "שוואל", + "זו אל-QI'DAH", + "זו אל-חיג׳ה", + } + } + } + } + islamic-civil:alias{"he/calendar/islamic"} + } + localPatternChars{"GanjkHmsSEDFwWxhKzAeugXZ"} +} diff --git a/icuSources/data/locales/he_IL.txt b/icuSources/data/locales/he_IL.txt index ea7c562e..947f7cd8 100644 --- a/icuSources/data/locales/he_IL.txt +++ b/icuSources/data/locales/he_IL.txt @@ -1,19 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/he_IL.xml // * // *************************************************************************** - -he_IL { - Version { "2.0" } -// LocaleString { "he_IL" } - NumberPatterns { +he_IL{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "#,##0.00 \u00A4;-#,##0.00 \u00A4", + "#,##0.00 ¤;-#,##0.00 ¤", "#,##0%", "#E0", } -// ShortCountry { "ISR" } - LocaleID:int { 0x040d } + Version{"1.2"} } diff --git a/icuSources/data/locales/hi.txt b/icuSources/data/locales/hi.txt index 184db7c0..35e054e9 100644 --- a/icuSources/data/locales/hi.txt +++ b/icuSources/data/locales/hi.txt @@ -1,345 +1,429 @@ -// *************************************************************************** -// * -// * Copyright (C) 1998-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -// Thanks to: -// - Shehnaz Nagpurwala and Anwar Nagpurwala [first version] -// - IBM NLTC: http://w3.torolab.ibm.com/reference/software/global/documents/India/hi-nlsgg.htm -// - Arundhati Bhowmick [IBM Cupertino] - -hi { - Version { "2.0" } - // This ordering comes from Hyangmi Cho of LOTUS - CollationElements { - Version { "2.0" } - Sequence { "[normalization on]&[top]" - "<\u0950<\u0964<\u0965<\u0970<\u0966<\u0967<\u0968<\u0969" - "<\u096a<\u096b<\u096c<\u096d<\u096e<\u096f<\u0905<\u0906" - "<\u0907<\u0908<\u0909<\u090a<\u090b<\u0960<\u090c<\u0961" - "<\u090d<\u090e<\u090f<\u0910<\u0911<\u0912<\u0913<\u0914" - "<\u0915<\u0915\u093c=\u0958<\u0915\u0901<\u0915\u0902<\u0915\u0903<\u0915\u0951<\u0915\u0952" - "<\u0915\u0953<\u0915\u0954<\u0915\u093d<\u0915\u094d<\u0915\u093e<\u0915\u093f<\u0915\u0940<\u0915\u0941" - "<\u0915\u0942<\u0915\u0943<\u0915\u0944<\u0915\u0962<\u0915\u0963<\u0915\u0945<\u0915\u0946<\u0915\u0947" - "<\u0915\u0948<\u0915\u0949<\u0915\u094a<\u0915\u094b<\u0915\u094c<\u0916<\u0916\u093c =\u0959<\u0916\u0901<\u0916\u0902<\u0916\u0903" - "<\u0916\u0951<\u0916\u0952<\u0916\u0953<\u0916\u0954<\u0916\u093d<\u0916\u094d<\u0916\u093e<\u0916\u093f" - "<\u0916\u0940<\u0916\u0941<\u0916\u0942<\u0916\u0943<\u0916\u0944<\u0916\u0962<\u0916\u0963<\u0916\u0945" - "<\u0916\u0946<\u0916\u0947<\u0916\u0948<\u0916\u0949<\u0916\u094a<\u0916\u094b<\u0916\u094c<\u0917" - "<\u0917\u093c=\u095a<\u0917\u0901<\u0917\u0902<\u0917\u0903<\u0917\u0951<\u0917\u0952<\u0917\u0953<\u0917\u0954" - "<\u0917\u093d<\u0917\u094d<\u0917\u093e<\u0917\u093f<\u0917\u0940<\u0917\u0941<\u0917\u0942<\u0917\u0943" - "<\u0917\u0944<\u0917\u0962<\u0917\u0963<\u0917\u0945<\u0917\u0946<\u0917\u0947<\u0917\u0948<\u0917\u0949" - "<\u0917\u094a<\u0917\u094b<\u0917\u094c<\u0918<\u0919<\u091a<\u091b<\u091c<\u091c\u093c =\u095b<\u091c\u0901<\u091c\u0902<\u091c\u0903" - "<\u091c\u0951<\u091c\u0952<\u091c\u0953<\u091c\u0954<\u091c\u093d<\u091c\u094d<\u091c\u093e<\u091c\u093f" - "<\u091c\u0940<\u091c\u0941<\u091c\u0942<\u091c\u0943<\u091c\u0944<\u091c\u0962<\u091c\u0963<\u091c\u0945" - "<\u091c\u0946<\u091c\u0947<\u091c\u0948<\u091c\u0949<\u091c\u094A<\u091c\u094b<\u091c\u094c<\u091d" - "<\u091e<\u091f<\u0920<\u0921<\u0921\u093c=\u095c<\u0921\u0901<\u0921\u0902<\u0921\u0903<\u0921\u0951<\u0921\u0952<\u0921\u0953<\u0921\u0954" - "<\u0921\u093d<\u0921\u094d<\u0921\u093e<\u0921\u093f<\u0921\u0940<\u0921\u0941<\u0921\u0942<\u0921\u0943" - "<\u0921\u0944<\u0921\u0962<\u0921\u0963<\u0921\u0945<\u0921\u0946<\u0921\u0947<\u0921\u0948<\u0921\u0949" - "<\u0921\u094a<\u0921\u094b<\u0921\u094c<\u0922<\u0922\u093c=\u095d<\u0922\u0901<\u0922\u0902<\u0922\u0903" - "<\u0922\u0951<\u0922\u0952<\u0922\u0953<\u0922\u0954<\u0922\u093d<\u0922\u094d<\u0922\u093e<\u0922\u093f" - "<\u0922\u0940<\u0922\u0941<\u0922\u0942<\u0922\u0943<\u0922\u0944<\u0922\u0962<\u0922\u0963<\u0922\u0945" - "<\u0922\u0946<\u0922\u0947<\u0922\u0948<\u0922\u0949<\u0922\u094a<\u0922\u094b<\u0922\u094c<\u0923" - "<\u0924<\u0925<\u0926<\u0927<\u0928<\u0928\u093c =\u0929< \u0928\u0901<\u0928\u0902< \u0928\u0903" - "<\u0928\u0951<\u0928\u0952<\u0928\u0953<\u0928\u0954<\u0928\u093d<\u0928\u094d<\u0928\u093e<\u0928\u093f" - "<\u0928\u0940<\u0928\u0941<\u0928\u0942<\u0928\u0943<\u0928\u0944<\u0928\u0962<\u0928\u0963<\u0928\u0945" - "<\u0928\u0946<\u0928\u0947<\u0928\u0948<\u0928\u0949<\u0928\u094a<\u0928\u094b<\u0928\u094c" - "<\u092a<\u092b<\u092b\u093c=\u095e<\u092b\u0901<\u092b\u0902<\u092b\u0903<\u092b\u0951<\u092b\u0952" - "<\u092b\u0953<\u092b\u0954<\u092b\u093d<\u092b\u094d<\u092b\u093e<\u092b\u093f<\u092b\u0940<\u092b\u0941<\u092b\u0942<\u092b\u0943" - "<\u092b\u0944<\u092b\u0962<\u092b\u0963<\u092b\u0945<\u092b\u0946<\u092b\u0947<\u092b\u0948<\u092b\u0949" - "<\u092b\u094a<\u092b\u094b<\u092b\u094c<\u092c<\u092d<\u092e<\u092f<\u092f\u093c=\u095f " - "<\u092f\u0901<\u092f\u0902<\u092f\u0903<\u092f\u0951<\u092f\u0952<\u092f\u0953<\u092f\u0954" - "<\u092f\u093d<\u092f\u094d<\u092f\u093e<\u092f\u093f<\u092f\u0940<\u092f\u0941<\u092f\u0942<\u092f\u0943" - "<\u092f\u0944<\u092f\u0962<\u092f\u0963<\u092f\u0945<\u092f\u0946<\u092f\u0947<\u092f\u0948<\u092f\u0949" - "<\u092f\u094a<\u092f\u094b<\u092f\u094c<\u0930<\u0930\u093c=\u0931<\u0930\u0901<\u0930\u0902<\u0930\u0903" - "<\u0930\u0951<\u0930\u0952<\u0930\u0953<\u0930\u0954<\u0930\u093d<\u0930\u094d<\u0930\u093e<\u0930\u093f" - "<\u0930\u0940<\u0930\u0941<\u0930\u0942<\u0930\u0943<\u0930\u0944<\u0930\u0962<\u0930\u0963<\u0930\u0945" - "<\u0930\u0946<\u0930\u0947<\u0930\u0948<\u0930\u0949<\u0930\u094a<\u0930\u094b<\u0930\u094c" - "<\u0932<\u0933<\u0933\u093c=\u0934<\u0933\u0901<\u0933\u0902<\u0933\u0903<\u0933\u0951<\u0933\u0952" - "<\u0933\u0953<\u0933\u0954<\u0933\u093d<\u0933\u094d<\u0933\u093e<\u0933\u093f<\u0933\u0940<\u0933\u0941" - "<\u0933\u0942<\u0933\u0943<\u0933\u0944<\u0933\u0962<\u0933\u0963<\u0933\u0945<\u0933\u0946<\u0933\u0947" - "<\u0933\u0948<\u0933\u0949<\u0933\u094a<\u0933\u094b<\u0933\u094c<\u0935<\u0936<\u0937<\u0938<\u0939" - "<\u093c<\u0901<\u0902<\u0903<\u0951<\u0952<\u0953<\u0954<\u093d<\u094d<\u093e<\u093f<\u0940" - "<\u0941<\u0942<\u0943<\u0944<\u0962<\u0963<\u0945<\u0946" - "<\u0947<\u0948<\u0949<\u094a<\u094b<\u094c" } - } - LocaleID:int { 0x39 } -// ShortLanguage { hin } - - Languages { - -//Haryanvi \u0939\u0930\u093F\u092F\u093E\u0928\u0935\u0940 // ??? - - root { "\u0936\u093F\u0916\u0930" } - - aa { "\u0905\u092B\u093C\u093E\u0930" } - ab { "\u0905\u092C\u094D\u0916\u093E\u095B\u093F\u092F\u0928\u094D" } - af { "\u0905\u092B\u094D\u0930\u0940\u0915\u0940" } - am { "\u0905\u092E\u094D\u0939\u093E\u0930\u093F\u0915\u094D" } - ar { "\u0905\u0930\u092C\u0940" } - as { "\u0905\u0938\u093E\u092E\u0940" } - ay { "\u0906\u092F\u092E\u093E\u0930\u093E" } - az { "\u0905\u095B\u0930\u092C\u0948\u0902\u091C\u093E\u0928\u0940" } - ba { "\u092C\u0936\u0959\u093F\u0930" } - be { "\u092C\u0948\u0932\u094B\u0930\u0942\u0936\u093F\u092F\u0928\u094D" } - bg { "\u092C\u0932\u094D\u0917\u0947\u0930\u093F\u092F\u0928\u094D" } - bh { "\u092C\u093F\u0939\u093E\u0930\u0940" } - bi { "\u092C\u093F\u0938\u094D\u0932\u093E\u092E\u093E" } - bn { "\u092C\u0901\u0917\u093E\u0932\u0940" } - bo { "\u0924\u093F\u092C\u094D\u092C\u0924\u0940" } - br { "\u092C\u094D\u0930\u0947\u091F\u0928" } - ca { "\u0915\u093E\u0924\u093E\u0932\u093E\u0928" } - co { "\u0915\u094B\u0930\u094D\u0938\u0940\u0915\u0928" } - cs { "\u091A\u0947\u0915" } - cy { "\u0935\u0947\u0932\u094D\u0936" } - da { "\u0921\u0948\u0928\u0940\u0936" } - de { "\u095B\u0930\u094D\u092E\u0928" } - dz { "\u092D\u0941\u091F\u093E\u0928\u0940" } - el { "\u0917\u094D\u0930\u0940\u0915" } - en { "\u0905\u0902\u0917\u094D\u0930\u0947\u091C\u0940" } - eo { "\u090F\u0938\u094D\u092A\u0947\u0930\u093E\u0928\u094D\u0924\u094B" } - es { "\u0938\u094D\u092A\u0947\u0928\u093F\u0936" } - et { "\u0910\u0938\u094D\u0924\u094B\u0928\u093F\u092F\u0928\u094D" } - eu { "\u092C\u093E\u0938\u094D\u0915\u094D" } - fa { "\u092A\u0930\u094D\u0936\u093F\u092F\u0928\u094D" } - fi { "\u092B\u093F\u0928\u093F\u0936" } - fj { "\u095E\u0940\u091C\u0940" } - fo { "\u092B\u093F\u0930\u094B\u095B\u0940" } - fr { "\u092B\u094D\u0930\u0947\u0902\u091A" } - fy { "\u092B\u094D\u0930\u0940\u091C\u093C\u0928\u094D" } - ga { "\u0906\u0908\u0930\u093F\u0936" } - gd { "\u0938\u094D\u0915\u093E\u091F\u094D\u0938\u094D \u0917\u093E\u092F\u0947\u0932\u093F\u0915\u094D" } - gl { "\u0917\u0948\u0932\u093F\u0936\u093F\u092F\u0928\u094D" } - gn { "\u0917\u0941\u0906\u0930\u093E\u0928\u0940" } - gu { "\u0917\u0941\u095B\u0930\u093E\u0924\u0940" } - ha { "\u0939\u094B\u0909\u0938\u093E" } - he { "\u0939\u093F\u092C\u094D\u0930\u0940\u090A" } - hi { "\u0939\u093f\u0902\u0926\u0940" } // HINDI - hr { "\u0915\u094D\u0930\u094B\u090F\u0936\u0928\u094D" } - hu { "\u0939\u0902\u0917\u0947\u0930\u0940\u000D" } - hy { "\u0905\u0930\u092E\u0947\u0928\u093F\u092F\u0928\u094D" } - ia { "\u0908\u0928\u094D\u091F\u0930\u0932\u093F\u0902\u0917\u0941\u0906" } - id { "\u0907\u0928\u094D\u0921\u094B\u0928\u0947\u0936\u093F\u092F\u0928\u094D" } - ie { "\u0908\u0928\u094D\u091F\u0930\u0932\u093F\u0902\u0917\u0941\u0907" } - ik { "\u0907\u0928\u0941\u092A\u093F\u092F\u093E\u0915\u094D" } - //in { "\u0907\u0928\u094D\u0921\u094B\u0928\u0947\u0936\u093F\u092F\u0928\u094D" } // Use "id" instead - is { "\u0906\u0908\u0938\u094D\u0932\u0948\u0902\u0921\u093F\u0915\u094D" } - it { "\u0908\u091F\u093E\u0932\u093F\u092F\u0928\u094D" } - iu { "\u0907\u0928\u0942\u0915\u0940\u091F\u0942\u0924\u094D" } - //iw { "\u0939\u093F\u092C\u094D\u0930\u0940\u090A" } //Use he instead - ja { "\u091C\u093E\u092A\u093E\u0928\u0940" } - // ji { "\u092F\u0947\u0939\u0941\u0926\u0940" } // Use "yi" instead - jv { "\u091C\u093E\u0935\u093E\u0928\u0940\u0938" } - // jw { "\u091C\u093E\u0935\u093E\u0928\u0940\u0938" } // Use jv instead - ka { "\u091C\u0949\u0930\u094D\u091C\u0940\u092F\u0928\u094D" } - kk { "\u0915\u095B\u093E\u0916" } - kl { "\u0917\u094D\u0930\u0940\u0928\u0932\u0948\u0902\u0921\u093F\u0915" } - km { "\u0915\u0948\u092E\u094D\u092C\u094B\u0921\u093F\u092F\u0928\u094D" } - kn { "\u0915\u0928\u094D\u0928\u0921\u093C" } - ko { "\u0915\u094B\u0930\u0940\u092F\u0928\u094D" } - kok{ "\u0915\u094B\u0902\u0915\u0923\u0940" } - ks { "\u0915\u093E\u0936\u094D\u092E\u093F\u0930\u0940" } - ku { "\u0915\u0941\u0930\u0926\u0940\u0936" } - ky { "\u0915\u093F\u0930\u0918\u093F\u095B" } - la { "\u0932\u0948\u091F\u0940\u0928" } - ln { "\u0932\u093F\u0902\u0917\u093E\u0932\u093E" } - lo { "\u0932\u093E\u0913\u0925\u0940\u092F\u0928\u094D" } - lt { "\u0932\u093F\u0925\u0941\u0928\u093F\u092F\u0928\u094D" } - lv { "\u0932\u093E\u091F\u0935\u093F\u092F\u0928\u094D (\u0932\u0947\u091F\u094D\u091F\u0940\u0936)" } - mg { "\u092E\u093E\u0932\u093E\u0917\u093E\u0938\u0940" } - mi { "\u092E\u0947\u0913\u0930\u0940" } - mk { "\u092E\u0948\u0938\u0947\u0921\u094B\u0928\u093F\u092F\u0928\u094D" } - ml { "\u092E\u0932\u092F\u093E\u0932\u092E" } - mn { "\u092E\u094B\u0902\u0917\u094B\u0932\u093F\u092F\u0928" } - mo { "\u092E\u094B\u0932\u0921\u093E\u0935\u093F\u092F\u0928\u094D" } - mr { "\u092E\u0930\u093E\u0920\u0940" } - ms { "\u092E\u0932\u092F" } - mt { "\u092E\u093E\u0932\u091F\u093F\u0938\u094D" } - my { "\u092C\u0930\u094D\u0932\u093F\u0938" } - na { "\u0928\u093E\u092F\u0930\u0942" } - ne { "\u0928\u0947\u092A\u093E\u0932\u0940" } - nl { "\u0921\u091A\u094D" } - no { "\u0928\u093E\u0930\u094D\u0935\u0947\u091C\u0940\u092F\u0928\u094D" } - oc { "\u0913\u0938\u0940\u091F\u093E\u0928" } - om { "\u0913\u0930\u094B\u092E\u094B (\u0905\u092B\u093C\u093E\u0928)" } - or { "\u0909\u0921\u093C\u093F\u092F\u093E" } - pa { "\u092A\u0902\u091C\u093E\u092C\u0940" } - pl { "\u092A\u0949\u0932\u093F\u0936" } - ps { "\u092A\u0949\u0936\u0924\u094B (\u092A\u0941\u0936\u0924\u094B)" } - pt { "\u092A\u0941\u0930\u094D\u0924\u0941\u0917\u0940" } - qu { "\u0915\u094D\u0935\u0947\u0936\u0941\u0906" } - raj{ "\u0930\u093E\u091C\u0947\u0938\u094D\u0925\u093E\u0928\u0940" } - rm { "\u0930\u0939\u0947\u092F\u094D\u091F\u094B-\u0930\u094B\u092E\u093E\u0928\u094D\u0938" } - rn { "\u0915\u093F\u0930\u0942\u0928\u094D\u0926\u0940" } - ro { "\u0930\u0942\u092E\u093E\u0928\u0940\u092F\u0928\u094D" } - ru { "\u0930\u0941\u0938\u0940" } - rw { "\u0915\u093F\u0928\u094D\u092F\u093E\u0930\u0935\u093E\u0923\u094D\u0921\u093E" } - sa { "\u0938\u0902\u0938\u094D\u0915\u0943\u0924" } - sd { "\u0938\u093F\u0928\u094D\u0927\u0940" } - sg { "\u0938\u093E\u0901\u0917\u094D\u0930\u094B" } - sh { "\u0938\u0947\u0930\u094D\u092C\u094B-\u0915\u094D\u0930\u094B\u090F\u0936\u0928\u094D" } - si { "\u0936\u093F\u0902\u0918\u093E\u0932\u0940\u0938\u094D" } - sk { "\u0938\u094D\u0932\u094B\u0935\u093E\u0915\u094D" } - sl { "\u0938\u094D\u0932\u094B\u0935\u0947\u0928\u093F\u092F\u0928\u094D" } - sm { "\u0938\u093E\u092E\u094B\u0928" } - sn { "\u0938\u094B\u0923\u093E" } - so { "\u0938\u094B\u092E\u093E\u0932\u0940" } - sq { "\u0905\u0932\u094D\u092C\u0947\u0928\u093F\u092F\u0928\u094D" } - sr { "\u0938\u0930\u094D\u092C\u093F\u092F\u0928\u094D" } - ss { "\u0938\u0940\u0938\u094D\u0935\u093E\u091F\u093F" } - st { "\u0938\u0947\u0938\u094B\u0925\u094B" } - su { "\u0938\u0941\u0928\u094D\u0926\u093E\u0928\u0940\u0938" } - sv { "\u0938\u094D\u0935\u093F\u0921\u093F\u0936" } - sw { "\u0938\u094D\u0935\u093E\u0939\u093F\u0932\u0940" } - ta { "\u0924\u092E\u093F\u0932" } - te { "\u0924\u0947\u0932\u0947\u0917\u0941" } - tg { "\u0924\u093E\u091C\u093F\u0915\u094D" } - th { "\u0925\u093E\u0908" } - ti { "\u0924\u093F\u0917\u094D\u0930\u0940\u0928\u094D\u092F\u093E" } - tk { "\u0924\u0941\u0915\u094D\u0930\u092E\u0947\u0928" } - tl { "\u0924\u093E\u0917\u093E\u0932\u094B\u0917" } - tn { "\u0938\u0947\u0924\u094D\u0938\u094D\u0935\u093E\u0928\u093E" } - to { "\u091F\u094B\u0902\u0917\u093E" } - tr { "\u0924\u0941\u0915\u094D\u0930\u0940\u0936" } - ts { "\u0938\u094B\u0902\u0917\u093E" } - tt { "\u091F\u093E\u091F\u0930" } - tw { "\u091F\u094D\u0935\u0940" } - ug { "\u0909\u0908\u0918\u0941\u0930" } - uk { "\u092F\u0942\u0915\u094D\u0930\u0947\u0928\u093F\u092F\u0928\u094D" } - ur { "\u090A\u0930\u094D\u0926\u0941" } - uz { "\u0909\u095B\u092C\u0947\u0915\u094D" } - vi { "\u0935\u093F\u092F\u0947\u0924\u0928\u093E\u092E\u0940\u000D" } - vo { "\u0935\u094B\u0932\u093E\u092A\u0941\u0915" } - wo { "\u0935\u094B\u0932\u094B\u092B" } - xh { "\u0937\u094B\u0938\u093E" } - yi { "\u092F\u0947\u0939\u0941\u0926\u0940" } - yo { "\u092F\u094B\u0930\u0942\u092C\u093E" } - za { "\u095B\u0941\u0906\u0902\u0917" } - zh { "\u091A\u0940\u0928\u0940" } - zu { "\u095B\u0941\u0932\u0942" } - } - Countries { - IN { "\u092d\u093e\u0930\u0924" } // bharat - GR { "\u0917\u094D\u0930\u0940\u0938" } - GT { "\u0917\u094b\u0924\u0947\u0926\u093e\u0932\u093e" } - UY { "\u0909\u0930\u0942\u0917\u0941\u090F" } - GW { "\u0917\u0940\u0928\u0940-\u092c\u093f\u0938\u093e\u0909" } - GY { "\u0917\u0941\u092f\u093e\u0928\u093e" } - VA { "\u0935\u093e\u0945\u091f\u093f\u0915\u0928" } - TM { "\u0924\u0941\u0915\u094d\u0930\u092e\u0947\u0928\u093f\u0938\u094d\u0924\u093e\u0928" } - VG { "\u092c\u094d\u0930\u093f\u091f\u093f\u0936 " - "\u0935\u0930\u094d\u091c\u0940\u0928 " - "\u090c\u0908\u0932\u0948\u0902\u0921\u0938\u094d" } - VI { "\u0908\u0909, \u090f\u0938 " - "\u0935\u0930\u094d\u091c\u0940\u0928 " - "\u0906\u0908\u0932\u0948\u0902\u0921\u0938\u094d" } - TL { "\u0908\u0938\u094d\u091f \u091f\u093f\u092e\u094b\u0930" } - //HK { "\u0939\u094b\u0902\u0917 \u0915\u094b\u0902\u0917" } - VU { "\u0938\u093e\u0928\u0941\u0905\u0924\u0941" } // CHECK - #12 - HN { "\u0939\u093e\u0945\u0928\u0921\u0941\u0930\u093e\u0938" } - HR { "\u0915\u094d\u0930\u094b\u0936\u0940\u092f\u093e" } - HT { "\u0939\u093e\u0908\u091f\u0940" } - HU { "\u0939\u0902\u0917\u0947\u0930\u0940" } - PE { "\u092a\u0947\u0930\u0942" } - } - MonthNames { - "\u091c\u0928\u0935\u0930\u0940", - "\u092b\u0930\u0935\u0930\u0940", - "\u092e\u093e\u0930\u094d\u091a", - "\u0905\u092a\u094d\u0930\u0948\u0932", - "\u092e\u0908", - "\u091c\u0942\u0928", - "\u091c\u0941\u0932\u093e\u0908", - "\u0905\u0917\u0938\u094d\u0924", - "\u0938\u093F\u0924\u092E\u094D\u092C\u0930", - "\u0905\u0915\u094d\u0924\u0942\u092c\u0930", - "\u0928\u0935\u092E\u094D\u092C\u0930", - "\u0926\u093F\u0938\u092E\u094D\u092C\u0930", - } - MonthAbbreviations { - "\u091c\u0928\u0935\u0930\u0940", - "\u092b\u0930\u0935\u0930\u0940", - "\u092e\u093e\u0930\u094d\u091a", - "\u0905\u092a\u094d\u0930\u0948\u0932", - "\u092e\u0908", - "\u091c\u0942\u0928", - "\u091c\u0941\u0932\u093e\u0908", - "\u0905\u0917\u0938\u094d\u0924", - "\u0938\u093F\u0924\u092E\u094D\u092C\u0930", - "\u0905\u0915\u094d\u0924\u0942\u092c\u0930", - "\u0928\u0935\u092E\u094D\u092C\u0930", - "\u0926\u093F\u0938\u092E\u094D\u092C\u0930", - } - DayNames { - "\u0930\u0935\u093f\u0935\u093e\u0930", - "\u0938\u094b\u092e\u0935\u093e\u0930", - "\u092e\u0902\u0917\u0932\u0935\u093e\u0930", - "\u092c\u0941\u0927\u0935\u093e\u0930", - "\u0917\u0941\u0930\u0941\u0935\u093e\u0930", - "\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930", - "\u0936\u0928\u093f\u0935\u093e\u0930", - } - DayAbbreviations - { - "\u0930\u0935\u093f", - "\u0938\u094b\u092e", - "\u092e\u0902\u0917\u0932", - "\u092c\u0941\u0927", - "\u0917\u0941\u0930\u0941", - "\u0936\u0941\u0915\u094d\u0930", - "\u0936\u0928\u093f", - } - - AmPmMarkers { - "\u092a\u0942\u0930\u094d\u0935\u093e\u0939\u094d\u0928", - "\u0905\u092a\u0930\u093e\u0939\u094d\u0928" - } - Eras { - "\u0908\u0938\u093e\u092a\u0942\u0930\u094d\u0935", - "\u0938\u0928" - } - - NumberElements { - ".", - ",", - ";", - "%", - "\u0966", - "#", - "-", - "E", - "\u2030", - "\u221E", - "\uFFFD", - ".", - } - -// NumberPatterns { -// "#,##0.###;-#,##0.###", -// "\u00A4 #,##0.00;-\u00A4 #,##0.00", -// "#,##0%", -// "#E0", -// } - - zoneStrings { - { - "Asia/Calcutta", - "\u092d\u093e\u0930\u0924\u0940\u092f \u0938\u092e\u092f", - "IST", - "\u092d\u093e\u0930\u0924\u0940\u092f \u0938\u092e\u092f", - "IST" - } - } - - LocaleScript:array { - "Deva" // ISO 15924 Name - } - ExemplarCharacters{"[[:Deva:]\u200c\u200d]"} - - // Currency display names - Currencies { - INR { "\u0930\u0941", "INR" } - } -} - +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/hi.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/hi.xml + */ +hi{ + Countries{ + AD{"अन्डोरा"} + AE{"संयुक्त अरब अमीरात"} + AF{"अफगानिस्तान"} + AG{"एन्टिगुवा और बारबूडा"} + AL{"अल्बानिया"} + AM{"आर्मेनिया"} + AO{"अंगोला"} + AR{"अर्जेन्टीना"} + AT{"ऑस्ट्रिया"} + AU{"ऑस्ट्रेलिया"} + AZ{"अजरबैजान"} + BA{"बोसनिया हर्जिगोविना"} + BB{"बारबाडोस"} + BD{"बंगलादेश"} + BE{"बेल्जियम"} + BF{"बर्किना फासो"} + BG{"बुल्गारिया"} + BH{"बहरैन"} + BI{"बुरुंडी"} + BJ{"बेनिन"} + BN{"ब्रूनइ"} + BO{"बोलीविया"} + BR{"ब्राजील"} + BS{"बहामा"} + BT{"भूटान"} + BW{"बोत्स्वाना"} + BY{"बेलारूस"} + BZ{"बेलिज"} + CA{"कनाडा"} + CC{"किंशासा"} + CF{"सेंट्रल अफ्रीकन रिपब्लिक"} + CG{"कांगो"} + CH{"स्विस"} + CI{"आईवरी कोस्ट"} + CL{"चिली"} + CM{"कामेरान"} + CN{"चीन"} + CO{"कोलम्बिया"} + CR{"कोस्टारीका"} + CU{"क्यूबा"} + CV{"कैप वर्त"} + CY{"साइप्रस"} + CZ{"चेक गणराज्य"} + DE{"जर्मनी"} + DJ{"जिबूती"} + DK{"डेनमार्क"} + DM{"डोमिनिका"} + DO{"डोमिनिकन गणराज्य"} + DZ{"अल्जीरिया"} + EC{"इक्वाडोर"} + EE{"एस्टोनिया"} + EG{"मिस्र"} + EH{"पश्चिमी सहारा"} + ER{"इरिट्रिया"} + ES{"स्पेन"} + ET{"इथियोपिया"} + FI{"फिनलैंड"} + FJ{"फिजी"} + FR{"फ्रांस"} + GR{"ग्रीस"} + GT{"गोतेदाला"} + GW{"गीनी-बिसाउ"} + GY{"गुयाना"} + HN{"हाण्डूरस"} + HR{"क्रोशिया"} + HT{"हाइती"} + HU{"हंगरी"} + ID{"इंडोनेशिया"} + IE{"आयरलैंड"} + IL{"इसराइल"} + IN{"भारत"} + IQ{"इराक"} + IR{"ईरान"} + IS{"आइसलैंड"} + IT{"इटली"} + JM{"जमाइका"} + JO{"जोर्डन"} + JP{"जापान"} + KE{"केन्या"} + KG{"किर्गिज"} + KH{"कम्बोडिया"} + KM{"कोमोरस"} + KN{"सेंट किट्स और नेविस"} + KP{"उत्तर कोरिया"} + KR{"दक्षिण कोरिया"} + KW{"कुवैत"} + KZ{"कजाखस्तान"} + LA{"लाओस"} + LB{"लेबनान"} + LC{"सेंट लूसिया"} + LI{"लिकटेंस्टीन"} + LK{"श्रीलंका"} + LR{"लाइबेरिया"} + LS{"लेसोथो"} + LT{"लिथुआनिया"} + LU{"लक्समबर्ग"} + LV{"लात्विया"} + LY{"लीबिया"} + MA{"मोरक्को"} + MC{"मोनाको"} + MD{"मोल्डाविया"} + MG{"मदागास्कर"} + MK{"मैसेडोनिया"} + ML{"माली"} + MM{"म्यानमार"} + MN{"मंगोलिया"} + MR{"मॉरिटानिया"} + MT{"माल्टा"} + MU{"मौरिस"} + MV{"मालदीव"} + MW{"मलावी"} + MX{"मेक्सिको"} + MY{"मलेशिया"} + MZ{"मोजाम्बिक"} + PA{"पनामा"} + PE{"पेरू"} + PG{"पापुआ न्यू गिनी"} + PH{"फिलीपिंस"} + PK{"पाकिस्तान"} + PL{"पोलैंड"} + PT{"पुर्तगाल"} + PY{"पारागुए"} + QA{"कतर"} + RO{"रोमानिया"} + RU{"रूस"} + RW{"रूआण्डा"} + SA{"सऊदी अरब"} + SD{"सूडान"} + SE{"स्वीडन"} + SG{"सिंगापुर"} + SI{"स्लोवेनिया"} + SK{"स्लोवाकिया"} + SL{"सियरालेओन"} + SM{"सैन मेरीनो"} + SN{"सेनेगल"} + SO{"सोमालिया"} + SR{"सुरिनाम"} + ST{"साउ-तोम-प्रिंसिप"} + SV{"अल साल्वाडोर"} + SY{"सीरिया"} + SZ{"सुआजीलैंड"} + TD{"चाड"} + TG{"टोगो"} + TH{"थाइलैंड"} + TJ{"ताजिकिस्तान"} + TM{"तुर्कमेनिस्तान"} + TN{"तुनिशिया"} + TO{"टोंगा"} + TR{"तुर्की"} + TT{"ट्रिनिडाड और टोबैगो"} + TV{"तुवालु"} + TW{"ताइवान"} + TZ{"तंजानिया"} + UA{"यूक्रेन"} + UG{"युगांडा"} + US{"संयुक्त राज्य अमरिका"} + UY{"युरूगुए"} + UZ{"उजबेकिस्तान"} + VA{"वैटिकन"} + VE{"वेनेजुएला"} + VG{"ब्रिटिश वर्जीन ऌईलैंडस्"} + VI{"ईउ, एस वर्जीन आईलैंडस्"} + VN{"वियतनाम"} + VU{"वानुअतु"} + YE{"यमन"} + ZA{"दक्षिण अफ्रीका"} + ZM{"जाम्बिया"} + ZW{"जिम्बाब्वे"} + } + Currencies{ + INR{ + "रु", + "INR", + } + } + ExemplarCharacters{"[ँ-ह़-्ॐॠ-ॣ]"} + Languages{ + aa{"अफ़ार"} + ab{"अब्खाज़ियन्"} + af{"अफ्रीकी"} + am{"अम्हारिक्"} + ar{"अरबी"} + as{"असामी"} + ay{"आयमारा"} + az{"अज़रबैंजानी"} + ba{"बशख़िर"} + be{"बैलोरूशियन्"} + bg{"बल्गेरियन्"} + bh{"बिहारी"} + bi{"बिस्लामा"} + bn{"बँगाली"} + bo{"तिब्बती"} + br{"ब्रेटन"} + ca{"कातालान"} + co{"कोर्सीकन"} + cs{"चेक"} + cy{"वेल्श"} + da{"डैनीश"} + de{"ज़र्मन"} + dz{"भुटानी"} + el{"ग्रीक"} + en{"अंग्रेजी"} + eo{"एस्पेरान्तो"} + es{"स्पेनिश"} + et{"ऐस्तोनियन्"} + eu{"बास्क्"} + fa{"पर्शियन्"} + fi{"फिनिश"} + fj{"फ़ीजी"} + fo{"फिरोज़ी"} + fr{"फ्रेंच"} + fy{"फ्रीज़न्"} + ga{"आईरिश"} + gd{"स्काट्स् गायेलिक्"} + gl{"गैलिशियन्"} + gn{"गुआरानी"} + gu{"गुज़राती"} + ha{"होउसा"} + he{"हिब्रीऊ"} + hi{"हिंदी"} + hr{"क्रोएशन्"} + hu{"हंगेरी"} + hy{"अरमेनियन्"} + ia{"ईन्टरलिंगुआ"} + id{"इन्डोनेशियन्"} + ie{"ईन्टरलिंगुइ"} + ik{"इनुपियाक्"} + is{"आईस्लैंडिक्"} + it{"ईटालियन्"} + iu{"इनूकीटूत्"} + ja{"जापानी"} + jv{"जावानीस"} + ka{"जॉर्जीयन्"} + kk{"कज़ाख"} + kl{"ग्रीनलैंडिक"} + km{"कैम्बोडियन्"} + kn{"कन्नड़"} + ko{"कोरीयन्"} + kok{"कोंकणी"} + ks{"काश्मिरी"} + ku{"कुरदीश"} + ky{"किरघिज़"} + la{"लैटीन"} + ln{"लिंगाला"} + lo{"लाओथीयन्"} + lt{"लिथुनियन्"} + lv{"लाटवियन् (लेट्टीश)"} + mg{"मालागासी"} + mi{"मेओरी"} + mk{"मैसेडोनियन्"} + ml{"मलयालम"} + mn{"मोंगोलियन"} + mo{"मोलडावियन्"} + mr{"मराठी"} + ms{"मलय"} + mt{"मालटिस्"} + my{"बर्लिस"} + na{"नायरू"} + ne{"नेपाली"} + nl{"डच्"} + no{"नार्वेजीयन्"} + oc{"ओसीटान"} + om{"ओरोमो (अफ़ान)"} + or{"उड़िया"} + pa{"पंजाबी"} + pl{"पॉलिश"} + ps{"पॉशतो (पुशतो)"} + pt{"पुर्तुगी"} + qu{"क्वेशुआ"} + raj{"राजेस्थानी"} + rm{"रहेय्टो-रोमान्स"} + rn{"किरून्दी"} + ro{"रूमानीयन्"} + root{"शिखर"} + ru{"रुसी"} + rw{"किन्यारवाण्डा"} + sa{"संस्कृत"} + sd{"सिन्धी"} + sg{"साँग्रो"} + sh{"सेर्बो-क्रोएशन्"} + si{"शिंघालीस्"} + sk{"स्लोवाक्"} + sl{"स्लोवेनियन्"} + sm{"सामोन"} + sn{"सोणा"} + so{"सोमाली"} + sq{"अल्बेनियन्"} + sr{"सर्बियन्"} + ss{"सीस्वाटि"} + st{"सेसोथो"} + su{"सुन्दानीस"} + sv{"स्विडिश"} + sw{"स्वाहिली"} + ta{"तमिल"} + te{"तेलेगु"} + tg{"ताजिक्"} + th{"थाई"} + ti{"तिग्रीन्या"} + tk{"तुक्रमेन"} + tl{"तागालोग"} + tn{"सेत्स्वाना"} + to{"टोंगा"} + tr{"तुक्रीश"} + ts{"सोंगा"} + tt{"टाटर"} + tw{"ट्वी"} + ug{"उईघुर"} + uk{"यूक्रेनियन्"} + ur{"ऊर्दु"} + uz{"उज़बेक्"} + vi{"वियेतनामी"} + vo{"वोलापुक"} + wo{"वोलोफ"} + xh{"षोसा"} + yi{"येहुदी"} + yo{"योरूबा"} + za{"ज़ुआंग"} + zh{"चीनी"} + zu{"ज़ुलू"} + } + LocaleScript{ + "Deva", + } + NumberElements{ + ".", + ",", + ";", + "%", + "०", + "#", + "-", + "E", + "‰", + "∞", + "�", + "+", + } + Version{"1.2"} + calendar{ + gregorian{ + AmPmMarkers{ + "पूर्वाह्न", + "अपराह्न", + } + dayNames{ + format{ + abbreviated{ + "रवि", + "सोम", + "मंगल", + "बुध", + "गुरु", + "शुक्र", + "शनि", + } + wide{ + "रविवार", + "सोमवार", + "मंगलवार", + "बुधवार", + "गुरुवार", + "शुक्रवार", + "शनिवार", + } + } + } + eras{ + abbreviated{ + "ईसापूर्व", + "सन", + } + } + monthNames{ + format{ + abbreviated{ + "जनवरी", + "फरवरी", + "मार्च", + "अप्रैल", + "मई", + "जून", + "जुलाई", + "अगस्त", + "सितम्बर", + "अक्तूबर", + "नवम्बर", + "दिसम्बर", + } + wide{ + "जनवरी", + "फरवरी", + "मार्च", + "अप्रैल", + "मई", + "जून", + "जुलाई", + "अगस्त", + "सितम्बर", + "अक्तूबर", + "नवम्बर", + "दिसम्बर", + } + } + } + } + } + zoneStrings{ + { + "Asia/Calcutta", + "भारतीय समय", + "IST", + "भारतीय समय", + "IST", + } + } +} diff --git a/icuSources/data/locales/hi_IN.txt b/icuSources/data/locales/hi_IN.txt index 21815ae4..53ae5892 100644 --- a/icuSources/data/locales/hi_IN.txt +++ b/icuSources/data/locales/hi_IN.txt @@ -1,35 +1,42 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/hi_IN.xml // * // *************************************************************************** -// srl@monkey.sbay.org, with help from Shehnaz Nagpurwala and Anwar Nagpurwala -// Hindi locale. Need to work on unicodizing more of the text.. - -hi_IN { - Version { "2.0" } - NumberPatterns { +hi_IN{ + NumberPatterns{ "##,##,##0.###;-##,##,##0.###", - "\u00A4 ##,##,##0.00;-\u00A4 ##,##,##0.00", + "¤ ##,##,##0.00;-¤ ##,##,##0.00", "##,##,##0%", "#E0", } -// ShortCountry { IND } - DateTimePatterns { - "h:mm:ss a z", - "h:mm:ss a z", - "h:mm:ss a", - "h:mm a", - "EEEE d MMMM yyyy", - "d MMMM yyyy", - "dd-MM-yyyy", - "d-M-yy", - "{1} {0}" + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "h:mm:ss a z", + "h:mm:ss a z", + "h:mm:ss a", + "h:mm a", + "EEEE d MMMM yyyy", + "d MMMM yyyy", + "dd-MM-yyyy", + "d-M-yy", + "{1} {0}", + } + weekend:intvector{ + 1, + 0, + 1, + 86400000, + } + } } -// DateTimeElements { -// "1", -// "1" -// } - LocaleID:int { 0x0439 } } diff --git a/icuSources/data/locales/hi__DIRECT.txt b/icuSources/data/locales/hi__DIRECT.txt deleted file mode 100644 index 96a3afed..00000000 --- a/icuSources/data/locales/hi__DIRECT.txt +++ /dev/null @@ -1,30 +0,0 @@ -// *************************************************************************** -// * -// * Copyright (C) 1997-2002, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -hi__DIRECT { - Version { "1.1" } - // This is the order ICU originaly used - CollationElements { - Version { "1.0" } - Sequence { //"[normalization on]" - "&[top]" - "<\u0901 <\u0902 <\u0903 <\u0905 <\u0906 <\u0907 <\u0908 <\u0909" - "<\u090a <\u090b <\u090c <\u090d <\u090e <\u090f <\u0910 <\u0911" - "<\u0912 <\u0913 <\u0914 <\u0915 <\u0916 <\u0917 <\u0918 <\u0919" - "<\u091a <\u091b <\u091c <\u091d <\u091e <\u091f <\u0920 <\u0921" - "<\u0922 <\u0923 <\u0924 <\u0925 <\u0926 <\u0927 <\u0928 <\u0929" - "<\u092a <\u092b <\u092c <\u092d <\u092e <\u092f <\u0930 <\u0931" - "<\u0932 <\u0933 <\u0934 <\u0935 <\u0936 <\u0937 <\u0938 <\u0939" - "<\u093c <\u093d <\u093e <\u093f <\u0940 <\u0941 <\u0942 <\u0943" - "<\u0944 <\u0945 <\u0946 <\u0947 <\u0948 <\u0949 <\u094a <\u094b <\u094c" - "<\u094d <\u0950 <\u0951 <\u0952 <\u0953 <\u0954 <\u0958 <\u0959" - "<\u095a <\u095b <\u095c <\u095d <\u095e <\u095f <\u0960 <\u0961<\u0962 <\u0963" - "<\u0964 <\u0965 <\u0966 <\u0967 <\u0968 <\u0969 <\u096a <\u096b" - "<\u096c <\u096d <\u096e <\u096f <\u0970" - } - } -} diff --git a/icuSources/data/locales/hr.txt b/icuSources/data/locales/hr.txt index e6ded9f9..9cd731b7 100644 --- a/icuSources/data/locales/hr.txt +++ b/icuSources/data/locales/hr.txt @@ -1,88 +1,1262 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2005 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/hr.xml // * // *************************************************************************** - -hr { - Version{"2.0"} - CollationElements { - Version { "2.0" } - Sequence { - "& C < \u010D <<< \u010C < \u0107 <<< \u0106" - "&\u0110 < d\u017E <<< D\u017E <<< D\u017D" - "& L < lj<<< Lj <<< LJ" - "& N < nj<<< Nj <<< NJ " - "& S < \u0161 <<< \u0160" - "& Z < \u017E <<< \u017D" } - } - Countries { - HR { "Hrvatska" } - } - DateTimePatterns { - "HH:mm:ss z", - "HH:mm:ss z", - "HH:mm:ss", - "HH:mm", - "yyyy. MMMM dd", - "yyyy. MMMM dd", - "yyyy.MM.dd", - "yyyy.MM.dd", - "{1} {0}", - } - DayAbbreviations { - "ned", - "pon", - "uto", - "sri", - "\u010Det", - "pet", - "sub", +/** + * ICU source: ../../../locale/icu/main/hr.xml + */ +hr{ + Countries{ + AD{"Andora"} + AE{"Ujedinjeni Arapski Emirati"} + AF{"Afganistan"} + AG{"Antigua i Barbuda"} + AI{"Anguila"} + AL{"Albanija"} + AM{"Armenija"} + AN{"Nizozemski Antili"} + AO{"Angola"} + AQ{"Antarktik"} + AR{"Argentina"} + AS{"Američka Samoa"} + AT{"Austrija"} + AU{"Australija"} + AW{"Aruba"} + AZ{"Azerbajdžan"} + BA{"Bosna i Hercegovina"} + BB{"Barbados"} + BD{"Bangladeš"} + BE{"Belgija"} + BF{"Burkina Faso"} + BG{"Bugarska"} + BH{"Bahrein"} + BI{"Burundi"} + BJ{"Benin"} + BM{"Bermuda"} + BN{"Brunei Darussalam"} + BO{"Bolivija"} + BR{"Brazil"} + BS{"Bahami"} + BT{"Butan"} + BV{"Otok Bouvet"} + BW{"Bocvana"} + BY{"Bjelorusija"} + BZ{"Belize"} + CA{"Kanada"} + CC{"Kokos (Keeling) Otoci"} + CD{"Kongo, Demokratska Republika"} + CF{"Srednjoafrička Republika"} + CG{"Kongo"} + CH{"Švicarska"} + CI{"Obala Bjelokosti"} + CK{"Kukovi Otoci"} + CL{"Čile"} + CM{"Kamerun"} + CN{"Kina"} + CO{"Kolumbija"} + CR{"Kostarika"} + CU{"Kuba"} + CV{"Zeleni Rt"} + CX{"Božićni Otoci"} + CY{"Cipar"} + CZ{"Češka Republika"} + DE{"Njemačka"} + DJ{"Džibuti"} + DK{"Danska"} + DM{"Dominika"} + DO{"Dominikanska Republika"} + DZ{"Alžir"} + EC{"Ekvador"} + EE{"Estonija"} + EG{"Egipat"} + EH{"Zapadna Sahara"} + ER{"Eritreja"} + ES{"Španjolska"} + ET{"Etiopija"} + FI{"Finska"} + FJ{"Fidži"} + FK{"Falklandski Otoci"} + FM{"Mikronezija, Federalne Države"} + FO{"Farski Otoci"} + FR{"Francuska"} + GA{"Gabon"} + GB{"Ujedinjena Kraljevina"} + GD{"Grenada"} + GE{"Gruzija"} + GF{"Francuska Gvajana"} + GH{"Gana"} + GI{"Gibraltar"} + GL{"Greenland"} + GM{"Gambija"} + GN{"Gvineja"} + GP{"Guadeloupe"} + GQ{"Ekvatorska Gvineja"} + GR{"Grčka"} + GS{"Južna Gruzija i Južni Sendvič Otoci"} + GT{"Gvatemala"} + GU{"Guam"} + GW{"Gvineja Bisau"} + GY{"Gvajana"} + HK{"Hong Kong S.A.R. Kine"} + HM{"Heard Otok i McDonald Otoci"} + HN{"Honduras"} + HR{"Hrvatska"} + HT{"Haiti"} + HU{"Mađarska"} + ID{"Indonezija"} + IE{"Irska"} + IL{"Izrael"} + IN{"Indija"} + IO{"Britanski Teritorij Indijskog Oceana"} + IQ{"Irak"} + IR{"Iran, Islamska Republika"} + IS{"Island"} + IT{"Italija"} + JM{"Jamajka"} + JO{"Jordan"} + JP{"Japan"} + KE{"Kenija"} + KG{"Kirgistan"} + KH{"Kambodža"} + KI{"Kiribati"} + KM{"Komori"} + KN{"Sveti Kristofor i Nevis"} + KP{"Koreja, Sjeverna"} + KR{"Koreja, Južna"} + KW{"Kuvajt"} + KY{"Kajmanski Otoci"} + KZ{"Kazakstan"} + LA{"Laoska Narodna Demokratska Republika"} + LB{"Libanon"} + LC{"Sveta Lucija"} + LI{"Lihtenštajn"} + LK{"Šri Lanka"} + LR{"Liberija"} + LS{"Lesoto"} + LT{"Litva"} + LU{"Luksemburg"} + LV{"Latvija"} + LY{"Libijska Arapska Džamahirija"} + MA{"Maroko"} + MC{"Monako"} + MD{"Moldavija, Republika"} + MG{"Madagaskar"} + MH{"Maršalovi Otoci"} + MK{"Makedonija, Republika"} + ML{"Mali"} + MM{"Mijanma"} + MN{"Mongolija"} + MO{"Makao S.A.R. Kine"} + MP{"Sjeverni Marianski Otoci"} + MQ{"Martinik"} + MR{"Mauritanija"} + MS{"Montserat"} + MT{"Malta"} + MU{"Mauricijus"} + MV{"Maldivi"} + MW{"Malavi"} + MX{"Meksiko"} + MY{"Malezija"} + MZ{"Mozambik"} + NA{"Namibija"} + NC{"Nova Kaledonija"} + NE{"Niger"} + NF{"Norfolški Otoci"} + NG{"Nigerija"} + NI{"Nikaragva"} + NL{"Nizozemska"} + NO{"Norveška"} + NP{"Nepal"} + NR{"Nauru"} + NU{"Niue"} + NZ{"Novi Zeland"} + OM{"Oman"} + PA{"Panama"} + PE{"Peru"} + PF{"Francuska Polinezija"} + PG{"Papua Nova Gvineja"} + PH{"Filipini"} + PK{"Pakistan"} + PL{"Poljska"} + PM{"Sveti Petar i Miguel"} + PN{"Pitcairn"} + PR{"Portoriko"} + PS{"Palestinska Teritoija"} + PT{"Portugal"} + PW{"Palau"} + PY{"Paragvaj"} + QA{"Katar"} + RE{"Reunion"} + RO{"Rumunjska"} + RU{"Ruska Federacija"} + RW{"Ruanda"} + SA{"Saudijska Arabija"} + SB{"Salamunovi Otoci"} + SC{"Sejšeli"} + SD{"Sudan"} + SE{"Švedska"} + SG{"Singapur"} + SH{"Sveta Helena"} + SI{"Slovenija"} + SJ{"Svalbard i Jan Mayen"} + SK{"Slovačka"} + SL{"Sijera Leone"} + SM{"San Marino"} + SN{"Senegal"} + SO{"Somalija"} + SP{"Serbia"} + SR{"Surinam"} + ST{"Sveti Toma i Prinsipe"} + SV{"El Salvador"} + SY{"Sirija"} + SZ{"Svazi"} + TC{"Turkski i Kaikos Otoci"} + TD{"Čad"} + TF{"Francuske Južne Teritorije"} + TG{"Togo"} + TH{"Tajland"} + TJ{"Tadžikistan"} + TK{"Tokelau"} + TL{"Istočni Timor"} + TM{"Turkmenistan"} + TN{"Tunis"} + TO{"Tonga"} + TR{"Turska"} + TT{"Trinidad i Tobago"} + TV{"Tuvalu"} + TW{"Tajvan"} + TZ{"Tanzanija"} + UA{"Ukrajina"} + UG{"Uganda"} + UM{"Sjedinjene Države Manji Vanjski Otoci"} + US{"Sjedinjene Države"} + UY{"Urugvaj"} + UZ{"Uzbekistan"} + VA{"Sveta Stolica (Država Vatikanskog Grada)"} + VC{"Sveti Vincent i Grenadini"} + VE{"Venezuela"} + VG{"Britanski Djevičanski Otoci"} + VI{"U.S. Djevičanski Otoci"} + VN{"Vijetnam"} + VU{"Vanuatu"} + WF{"Wallis i Futuna"} + WS{"Samoa"} + YE{"Jemen"} + YT{"Majote"} + YU{"Jugoslavija"} + ZA{"Južna Afrika"} + ZM{"Zambija"} + ZW{"Zimbabve"} } - DayNames { - "nedjelja", - "ponedjeljak", - "utorak", - "srijeda", - "\u010Detvrtak", - "petak", - "subota", + Currencies{ + ALK{ + "ALK", + "Albanski lek (1946-1961)", + } + ALL{ + "lek", + "Albanski lek", + } + ALV{ + "ALV", + "Albanian Lek Valute", + } + AMD{ + "dram", + "Armenian Dram", + } + AOA{ + "AOA", + "Angolska kvanza", + } + AOK{ + "AOK", + "Angolska kvanza (1977-1990)", + } + ARP{ + "ARP", + "Argentinski pezo (1983-1985)", + } + ARS{ + "Arg$", + "Argentinski pezo", + } + ATS{ + "ATS", + "Austrijski šiling", + } + AUD{ + "$A", + "Australski dolar", + } + AZM{ + "AZM", + "Azerbejdžanski manat", + } + BAM{ + "KM", + "Konvertibilna marka", + } + BBD{ + "BDS$", + "Barbadoski dolar", + } + BDT{ + "Tk", + "Taka", + } + BEF{ + "BF", + "Belgijski franak", + } + BMD{ + "Ber$", + "Bermudski dolar", + } + BMP{ + "BMP", + "Bermudska funta", + } + BND{ + "BND", + "Brunejski dolar", + } + CAD{ + "Can$", + "Kanadski dolar", + } + CHF{ + "SwF", + "Švicarski franak", + } + CLF{ + "CLF", + "Chilean Unidades de Fomento", + } + CLP{ + "Ch$", + "Čileanski pezo", + } + CNP{ + "CNP", + "Chinese Jen Min Piao Yuan", + } + COP{ + "Col$", + "Kolumbijski pezo", + } + CRC{ + "C", + "Kostarikanski kolon", + } + CSC{ + "CSC", + "Češka kruna", + } + CSK{ + "CSK", + "Czechoslovak Hard Koruna", + } + CUP{ + "CUP", + "Kubanski pezo", + } + CVE{ + "CVEsc", + "Zelenortski eskudo", + } + CWG{ + "CWG", + "Curacao Guilder", + } + CYP{ + "£C", + "Ciparska funta", + } + CZK{ + "CZK", + "Češka kruna", + } + DDM{ + "DDM", + "East German Ostmark", + } + DEM{ + "DEM", + "Njemačka marka", + } + DES{ + "DES", + "German Sperrmark", + } + DJF{ + "DF", + "Djibouti Franc", + } + DKK{ + "DKr", + "Danska kruna", + } + DOP{ + "RD$", + "Dominikanski pezo", + } + DZD{ + "DA", + "Alžirski dinar", + } + DZF{ + "DZF", + "Algerian New Franc", + } + DZG{ + "DZG", + "Algerian Franc Germinal", + } + ECS{ + "ECS", + "Ecuador Sucre", + } + ECV{ + "ECV", + "Ecuador Unidad de Valor Constante (UVC)", + } + EEK{ + "EEK", + "Estonian Kroon", + } + EGP{ + "EGP", + "Egipatska funta", + } + ERN{ + "ERN", + "Eritrean Nakfa", + } + ESP{ + "ESP", + "Španjolska pezeta", + } + ETB{ + "Br", + "Etiopski bir", + } + ETD{ + "ETD", + "Etiopski dolar", + } + EUR{ + "€", + "Euro", + } + FIM{ + "FIM", + "Finska marka", + } + FIN{ + "FIN", + "Finska marka (1860-1962)", + } + FJD{ + "F$", + "Fidžijski dolar", + } + FJP{ + "FJP", + "Fidžijska funta", + } + FKP{ + "FKP", + "Falklandska funta", + } + FOK{ + "FOK", + "Faeroe Islands Kronur", + } + FRF{ + "FRF", + "Francuski franak", + } + FRG{ + "FRG", + "French Franc Germinal/Franc Poincare", + } + GBP{ + "£", + "Britanska funta", + } + GEK{ + "GEK", + "Georgian Kupon Larit", + } + GEL{ + "lari", + "Gruzijski lari", + } + GIP{ + "GIP", + "Gibraltarska funta", + } + GLK{ + "GLK", + "Grenlandska kruna", + } + GMD{ + "GMD", + "Gambia Dalasi", + } + GMP{ + "GMP", + "Gambijska funta", + } + GNF{ + "GF", + "Gvinejski franak", + } + GNI{ + "GNI", + "Gvinejski franak (1960-1972)", + } + GNS{ + "GNS", + "Guinea Syli", + } + GPF{ + "GPF", + "Guadeloupe Franc", + } + GQE{ + "GQE", + "Equatorial Guinea Ekwele Guineana", + } + GQF{ + "GQF", + "Equatorial Guinea Franco", + } + GQP{ + "GQP", + "Equatorial Guinea Peseta Guineana", + } + GRD{ + "GRD", + "Grčka drahma", + } + GTQ{ + "Q", + "Kvecal", + } + GUF{ + "GUF", + "French Guyana Franc Guiana", + } + GWE{ + "GWE", + "Portuguese Guinea Escudo", + } + GWM{ + "GWM", + "Portuguese Guinea Mil Reis", + } + GWP{ + "GWP", + "Gvinejskobisauski pezo", + } + GYD{ + "G$", + "Guyana Dollar", + } + HKD{ + "HK$", + "Honkonški dolar", + } + HNL{ + "L", + "Hoduraška lempira", + } + HRD{ + "HRD", + "Hrvatski dinar", + } + HRK{ + "HRK", + "Kuna", + } + HTG{ + "HTG", + "Haitian Gourde", + } + HUF{ + "Ft", + "Mađarska forinta", + } + IDR{ + "Rp", + "Indonezijska rupija", + } + IEP{ + "IR£", + "Irska funta", + } + ILL{ + "ILL", + "Israelski šekel", + } + ILP{ + "ILP", + "Israelska funta", + } + ILS{ + "ILS", + "Novi izraelski šekel", + } + INR{ + "INR", + "Indijska rupija", + } + IQD{ + "ID", + "Irački dinar", + } + IRR{ + "RI", + "Iranski rijal", + } + ISK{ + "ISK", + "Islandska kruna", + } + ITL{ + "₤", + "Talijanska lira", + } + JMD{ + "J$", + "Jamaičanski dolar", + } + JMP{ + "JMP", + "Jamaičanska funta", + } + JOD{ + "JD", + "Jordanski dinar", + } + JPY{ + "¥", + "Japanski jen", + } + KES{ + "K Sh", + "Kenijski šiling", + } + KGS{ + "som", + "Kyrgystan Som", + } + KHO{ + "KHO", + "Cambodian Old Riel", + } + KHR{ + "CR", + "Cambodian Riel", + } + KID{ + "KID", + "Kiribati Dollar", + } + KMF{ + "CF", + "Comoro Franc", + } + KWD{ + "KD", + "Kuvajtski dinar", + } + KYD{ + "KYD", + "Kajmanski dolar", + } + KZR{ + "KZR", + "Kazakhstan Ruble", + } + KZT{ + "T", + "Kazakhstan Tenge", + } + LAK{ + "LAK", + "Laotian Kip", + } + LIF{ + "LIF", + "Lihtenštajnski franak", + } + LKR{ + "SL Re", + "Sri Lanka Rupee", + } + LNR{ + "LNR", + "Ceylon Rupee", + } + LRD{ + "LRD", + "Liberijski dolar", + } + LSL{ + "M", + "Lesotho Loti", + } + LTL{ + "LTL", + "Lithuanian Lita", + } + LTT{ + "LTT", + "Lithuanian Talonas", + } + LUF{ + "LUF", + "Luksemburški franak", + } + LVL{ + "LVL", + "Latvian Lats", + } + LVR{ + "LVR", + "Latvian Ruble", + } + LYD{ + "LD", + "Libijski dinar", + } + LYP{ + "LYP", + "Libijska funta", + } + MAD{ + "MAD", + "Morokanski dirham", + } + MAF{ + "MAF", + "Morokanski franak", + } + MCF{ + "MCF", + "Monaco Franc Nouveau", + } + MCG{ + "MCG", + "Monaco Franc Germinal", + } + MDC{ + "MDC", + "Moldovan Leu Cupon", + } + MDL{ + "MDL", + "Moldovski lej", + } + MDR{ + "MDR", + "Moldovan Ruble Cupon", + } + MHD{ + "MHD", + "Marshall Islands Dollar", + } + MKD{ + "MDen", + "Makedonski denar", + } + MKN{ + "MKN", + "Makedonski denar (1992-1993)", + } + MLF{ + "MLF", + "Mali Franc", + } + MMK{ + "MMK", + "Myanmar Kyat", + } + MNT{ + "Tug", + "Mongolski tugrik", + } + MOP{ + "MOP", + "Macao Pataca", + } + MQF{ + "MQF", + "Martinique Franc", + } + MRO{ + "UM", + "Mauritanska ouguja", + } + MTL{ + "Lm", + "Malteška lira", + } + MTP{ + "MTP", + "Malteška funta", + } + MUR{ + "MUR", + "Mauricijska rupija", + } + MWK{ + "MK", + "Malawi Kwacha", + } + MWP{ + "MWP", + "Malawi Pound", + } + MXN{ + "MEX$", + "Meksički pezo", + } + MXP{ + "MXP", + "Meksički srebrni pezo (1861-1992)", + } + MYR{ + "RM", + "Malaysian Ringgit", + } + MZE{ + "MZE", + "Mozambique Escudo", + } + MZM{ + "Mt", + "Mozambique Metical", + } + NAD{ + "N$", + "Namibijski dolar", + } + NGN{ + "NGN", + "Nigerijska naira", + } + NGP{ + "NGP", + "Nigerijska funta", + } + NLG{ + "NLG", + "Nizozemski gulden", + } + NOK{ + "NKr", + "Norveška kruna", + } + NPR{ + "Nrs", + "Nepalska rupija", + } + NZD{ + "$NZ", + "Novozelandski dolar", + } + NZP{ + "NZP", + "Novozelandska funta", + } + OMR{ + "RO", + "Omanski rijal", + } + PAB{ + "PAB", + "Panamska balboa", + } + PDK{ + "PDK", + "Transdniestria Ruble Kupon", + } + PDR{ + "PDR", + "Transdniestria Ruble", + } + PEI{ + "PEI", + "Peruanski inti", + } + PEN{ + "PEN", + "Peruanski novi sol", + } + PES{ + "PES", + "Peruanski sol", + } + PHP{ + "PHP", + "Filipinski pezo", + } + PKR{ + "Pra", + "Pakistanska rupija", + } + PLN{ + "Zl", + "Poljska zlota", + } + PLZ{ + "PLZ", + "Poljska zlota (1950-1995)", + } + PSP{ + "PSP", + "Palestinska funta", + } + PTC{ + "PTC", + "Portugalski konto", + } + PTE{ + "PTE", + "Portugalski eskudo", + } + PYG{ + "PYG", + "Paragvajski gvarani", + } + ROL{ + "leu", + "Rumunjski lej", + } + RON{ + "RON", + "Rumunjski novi lej", + } + RUB{ + "RUB", + "Ruska rublja", + } + RUR{ + "RUR", + "Ruska rublja (1991-1998)", + } + SBD{ + "SI$", + "Solomonskootočni dolar", + } + SCR{ + "SR", + "Sejšelska rupija", + } + SDD{ + "SDD", + "Sudanski dinar", + } + SDP{ + "SDP", + "Sudanska funta", + } + SEK{ + "SKr", + "Švedska kruna", + } + SGD{ + "S$", + "Singapurski dolar", + } + SIB{ + "SIB", + "Slovenia Tolar Bons", + } + SIT{ + "SIT", + "Slovenski tolar", + } + SKK{ + "Sk", + "Slovačka kruna", + } + SOS{ + "So. Sh.", + "Somalijski šiling", + } + SRG{ + "Sf", + "Surinamski gulden", + } + SSP{ + "SSP", + "Škotska funta", + } + SYP{ + "LS", + "Sirijska funta", + } + SZL{ + "E", + "Lilangeni", + } + TJS{ + "TJS", + "Tadžikistanski somoni", + } + TMM{ + "TMM", + "Turkmenistanski manat", + } + TND{ + "TND", + "Tuniski dinar", + } + TPE{ + "TPE", + "Timorski eskudo", + } + TPP{ + "TPP", + "Timor Pataca", + } + TRL{ + "TL", + "Turska lira", + } + TRY{ + "TRY", + "Nova Turska Lira", + } + TTD{ + "TT$", + "Trinidadtobaški dolar", + } + TTO{ + "TTO", + "Trinidadtobaški stari dolar", + } + TWD{ + "NT$", + "Novotajvanski dolar", + } + TZS{ + "T Sh", + "Tanzanijski šiling", + } + UAH{ + "UAH", + "Ukrajinska hrivnja", + } + UGS{ + "UGS", + "Ugandski šiling (1966-1987)", + } + UGX{ + "U Sh", + "Ugandski šiling", + } + USD{ + "US$", + "Američki dolar", + } + USN{ + "USN", + "Američki dolar (sljedeći dan)", + } + USS{ + "USS", + "Američki dolar (isti dan)", + } + UYP{ + "UYP", + "Urugvajski pezo (1975-1993)", + } + VEB{ + "Be", + "Venezuelski bolivar", + } + VND{ + "VND", + "Viejetnamski dong", + } + XAU{ + "XAU", + "Zlato", + } + XBA{ + "XBA", + "Europska složena jedinica", + } + XBB{ + "XBB", + "Europska monetarna jedinica", + } + YDD{ + "YDD", + "jemenski dinar", + } + YEI{ + "YEI", + "Yemeni Imadi Riyal", + } + YER{ + "YRl", + "Jemenski rial", + } + YUD{ + "YUD", + "Jugoslavenski čvrsti dinar", + } + YUF{ + "YUF", + "Jugoslavenski federalni dinar", + } + YUG{ + "YUG", + "Jugoslavenski dinar 1994", + } + YUM{ + "YUM", + "Jugoslavenski novi dinar", + } + YUN{ + "YUN", + "Jugoslavenski konvertibilni dinar", + } + YUO{ + "YUO", + "Jugoslavenski oktobarski dinar", + } + YUR{ + "YUR", + "Jugoslavenski reformirani dinar", + } + ZAL{ + "ZAL", + "Južnoafrički rand (financijski)", + } + ZAP{ + "ZAP", + "Južnoafrička funta", + } + ZAR{ + "R", + "Južnoafrički rand", + } + ZMK{ + "ZMK", + "Zambijska kvača", + } + ZMP{ + "ZMP", + "Zambijska funta", + } + ZRN{ + "ZRN", + "Zairski novi zair", + } + ZRZ{ + "ZRZ", + "Zairski zair", + } + ZWD{ + "Z$", + "Zimbabveanski dolar", + } } - Languages { - hr { "hrvatski" } + ExemplarCharacters{"[a-p r-v z đ ć č ž š {lj} {nj} {dž}]"} + Keys{ + calendar{"Kalendar"} + collation{"Poredavanje"} + currency{"Valuta"} } - LocaleID:int { 0x1a } -// LocaleString { "hr" } - MonthAbbreviations { - "sij", - "vel", - "o\u017Eu", - "tra", - "svi", - "lip", - "srp", - "kol", - "ruj", - "lis", - "stu", - "pro", + Languages{ + ang{"engleski, stari (ca.450-1100)"} + apa{"apaški"} + ar{"arapski"} + art{"umjetni (ostali)"} + av{"avarski"} + bat{"baltički (ostali)"} + be{"bjeloruski"} + bg{"bugarski"} + cel{"keltski (ostali)"} + cs{"češki"} + cu{"crkvenoslavenski"} + cy{"velški"} + da{"danski"} + de{"njemački"} + dum{"nizozemski, srednji (ca. 1050-1350)"} + egy{"egipatski (antički)"} + el{"grčki"} + en{"engleski"} + enm{"engleski, srednji (1100-1500)"} + eo{"esperanto"} + es{"španjolski"} + et{"estonijski"} + fa{"perzijski"} + fi{"finski"} + fr{"francuski"} + frm{"francuski, srednji (ca.1400-1600)"} + fro{"francuski, stari (842-ca.1400)"} + fy{"frizijski"} + ga{"irski"} + gem{"germanski (ostali)"} + gmh{"njemački, srednji visoki (ca.1050-1500)"} + goh{"njemački, stari visoki (ca.750-1050)"} + grc{"grčki, antički (do 1453)"} + haw{"havajski"} + he{"hebrejski"} + hr{"hrvatski"} + hu{"mađarski"} + hy{"armenski"} + inc{"indijski (drugi)"} + ine{"indoevropski (drugi)"} + ira{"iranski"} + is{"islandski"} + it{"talijanski"} + ja{"japanski"} + km{"kmerski"} + ko{"korejski"} + la{"latinski"} + lt{"litvanski"} + lv{"latvijski"} + mga{"irski, srednji (900-1200)"} + mk{"makedonski"} + mn{"mongolski"} + mt{"malteški"} + ne{"nepalski"} + nl{"nizozemski"} + no{"norveški"} + pl{"poljski"} + pt{"portugalski"} + ro{"rumunjski"} + roa{"romanski (ostali)"} + ru{"ruski"} + sk{"slovački"} + sl{"slovenski"} + sla{"slavenski (drugi)"} + sq{"albanski"} + sr{"srpski"} + sv{"švedski"} + tr{"turski"} + uk{"ukrajinski"} + vi{"vijetnamski"} + zh{"kineski"} } - MonthNames { - "sije\u010Danj", - "velja\u010Da", - "o\u017Eujak", - "travanj", - "svibanj", - "lipanj", - "srpanj", - "kolovoz", - "rujan", - "listopad", - "studeni", - "prosinac", + LocaleScript{ + "Latn", } - NumberElements { + NumberElements{ ",", ".", ";", @@ -91,29 +1265,169 @@ hr { "#", "-", "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", + "‰", + "∞", + "�", + "+", } -// ShortLanguage { "hrv" } - localPatternChars { "GanjkHmsSEDFwWxhKzAe" } - zoneStrings { - { - "Africa/Casablanca", - "GMT", - "GMT", - "GMT", - "GMT", + Types{ + calendar{ + buddhist{"Budistički kalendar"} + chinese{"Kineski kalendar"} + gregorian{"Gregorijanski kalendar"} + hebrew{"Hebrejski kalendar"} + islamic{"Islamski kalendar"} + islamic-civil{"Islamski civilni kalendar"} + japanese{"Japanski kalendar"} + } + collation{ + direct{"Direktno poredavanje"} + phonebook{"Poredavanja po abecedi"} + pinyin{"Pinyin poredavanje"} + stroke{"Stroke order poredavanje"} + traditional{"Tradicionano poredavanje"} } } - ExemplarCharacters { "[a-p r-v z \u0111 \u0107 \u010d \u017e \u0161 {lj} {nj} {d\u017e}]" } -// LocaleScript:array { -// "Latn" // ISO 15924 Name -// } - - // Currency display names - Currencies { - HRK { "Kn", "HRK" } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "HH:mm:ss z", + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm", + "yyyy. MMMM dd", + "yyyy. MMMM dd", + "yyyy.MM.dd", + "yyyy.MM.dd", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "ned", + "pon", + "uto", + "sri", + "čet", + "pet", + "sub", + } + narrow{ + "n", + "p", + "u", + "s", + "č", + "p", + "s", + } + wide{ + "nedjelja", + "ponedjeljak", + "utorak", + "srijeda", + "četvrtak", + "petak", + "subota", + } + } + } + monthNames{ + format{ + abbreviated{ + "sij", + "vel", + "ožu", + "tra", + "svi", + "lip", + "srp", + "kol", + "ruj", + "lis", + "stu", + "pro", + } + narrow{ + "s", + "v", + "o", + "t", + "s", + "l", + "s", + "k", + "r", + "l", + "s", + "p", + } + wide{ + "siječnja", + "veljače", + "ožujka", + "travnja", + "svibnja", + "lipnja", + "srpnja", + "kolovoza", + "rujna", + "listopada", + "studenoga", + "prosinca", + } + } + stand-alone{ + abbreviated{ + "sij", + "vel", + "ožu", + "tra", + "svi", + "lip", + "srp", + "kol", + "ruj", + "lis", + "stu", + "pro", + } + narrow{ + "s", + "v", + "o", + "t", + "s", + "l", + "s", + "k", + "r", + "l", + "s", + "p", + } + wide{ + "siječanj", + "veljača", + "ožujak", + "travanj", + "svibanj", + "lipanj", + "srpanj", + "kolovoz", + "rujan", + "listopad", + "studeni", + "prosinac", + } + } + } + } } + localPatternChars{"GanjkHmsSEDFwWxhKzAeugXZ"} } diff --git a/icuSources/data/locales/hr_HR.txt b/icuSources/data/locales/hr_HR.txt index 70eb5660..b064f2a8 100644 --- a/icuSources/data/locales/hr_HR.txt +++ b/icuSources/data/locales/hr_HR.txt @@ -1,18 +1,11 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/hr_HR.xml // * // *************************************************************************** - -hr_HR { - Version{ "2.0" } -// LocaleString { "hr_HR" } -// NumberPatterns { -// "#,##0.###;-#,##0.###", -// "\u00A4 #,##0.00;-\u00A4 #,##0.00", -// "#,##0%", -// } -// ShortCountry { "HRV" } - LocaleID:int { 0x041a } +hr_HR{ + Version{"1.2"} } diff --git a/icuSources/data/locales/hu.txt b/icuSources/data/locales/hu.txt index 6c4a99ea..d6f6fd4a 100644 --- a/icuSources/data/locales/hu.txt +++ b/icuSources/data/locales/hu.txt @@ -1,132 +1,2161 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2005 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/hu.xml // * // *************************************************************************** - -hu { - Version{ "2.0" } - AmPmMarkers { - "DE", - "DU", - } - CollationElements { - Version { "1.0" } - Sequence { "& C < cs <<< cS <<< Cs <<< CS & D < \u0111<<< \u0110 " - "& G < gy<<< gY<<< Gy<<< GY & L < ly<<< lY<<< Ly<<< LY" - "& O < o\u0308 <<< O\u0308 < o\u030B <<< O\u030B" - "& S < sz <<< sZ <<< Sz <<< SZ & U < u\u0308 <<< U\u0308 < u\u030B <<< U\u030B" - "& Z < zs <<< zS <<< Zs <<< ZS" } - } - Countries { - HU { "Magyarorsz\u00E1g" } - } - DateTimePatterns { - "H:mm:ss z", - "H:mm:ss z", - "H:mm:ss", - "H:mm", - "yyyy. MMMM d.", - "yyyy. MMMM d.", - "yyyy.MM.dd.", - "yyyy.MM.dd.", - "{1} {0}", +/** + * ICU source: ../../../locale/icu/main/hu.xml + */ +hu{ + Countries{ + AD{"Andorra"} + AE{"Egyesült Arab Emirátus"} + AF{"Afganisztán"} + AG{"Antigua és Barbuda"} + AI{"Anguilla"} + AL{"Albánia"} + AM{"Örményország"} + AN{"Holland Antillák"} + AO{"Angola"} + AQ{"Antarktisz"} + AR{"Argentína"} + AS{"Amerikai Szamoa"} + AT{"Ausztria"} + AU{"Ausztrália"} + AW{"Aruba"} + AZ{"Azerbajdzsán"} + BA{"Bosznia-Hercegovina"} + BB{"Barbados"} + BD{"Banglades"} + BE{"Belgium"} + BF{"Burkina Faso"} + BG{"Bulgária"} + BH{"Bahrain"} + BI{"Burundi"} + BJ{"Benin"} + BM{"Bermuda"} + BN{"Brunei Darussalam"} + BO{"Bolívia"} + BR{"Brazília"} + BS{"Bahamák"} + BT{"Bhután"} + BV{"Bouvet-sziget"} + BW{"Botswana"} + BY{"Fehéroroszország"} + BZ{"Beliz"} + CA{"Kanada"} + CC{"Kókusz (Keeling)-szigetek"} + CD{"Kongó, Demokratikus köztársaság"} + CF{"Közép-afrikai Köztársaság"} + CG{"Kongó"} + CH{"Svájc"} + CI{"Elefántcsontpart"} + CK{"Cook-szigetek"} + CL{"Chile"} + CM{"Kamerun"} + CN{"Kína"} + CO{"Kolumbia"} + CR{"Costa Rica"} + CU{"Kuba"} + CV{"Zöld-foki Köztársaság"} + CX{"Karácsony-szigetek"} + CY{"Ciprus"} + CZ{"Cseh Köztársaság"} + DE{"Németország"} + DJ{"Dzsibuti"} + DK{"Dánia"} + DM{"Dominika"} + DO{"Dominikai Köztársaság"} + DZ{"Algéria"} + EC{"Ecuador"} + EE{"Észtország"} + EG{"Egyiptom"} + EH{"Nyugat Szahara"} + ER{"Eritrea"} + ES{"Spanyolország"} + ET{"Etiópia"} + FI{"Finnország"} + FJ{"Fidzsi"} + FK{"Falkland-szigetek"} + FM{"Mikronézia, Szövetségi Államok"} + FO{"Feröer-szigetek"} + FR{"Franciaország"} + GA{"Gabon"} + GB{"Egyesült Királyság"} + GD{"Grenada"} + GE{"Grúzia"} + GF{"Francia Guyana"} + GH{"Ghana"} + GI{"Gibraltár"} + GL{"Grönland"} + GM{"Gambia"} + GN{"Guinea"} + GP{"Guadeloupe"} + GQ{"Egyenlítďi Guinea"} + GR{"Görögország"} + GS{"Dél-Georgia és Dél-Sandwich Szigetek"} + GT{"Guatemala"} + GU{"Guam"} + GW{"Guinea-Bissau"} + GY{"Guyana"} + HK{"Hong Kong S.A.R., China"} + HM{"Heard és McDonald Szigetek"} + HN{"Honduras"} + HR{"Horvátország"} + HT{"Haiti"} + HU{"Magyarország"} + ID{"Indonézia"} + IE{"Írország"} + IL{"Izrael"} + IN{"India"} + IO{"Brit Indiai Oceán"} + IQ{"Irak"} + IR{"Irán"} + IS{"Izland"} + IT{"Olaszország"} + JM{"Jamaica"} + JO{"Jordánia"} + JP{"Japán"} + KE{"Kenya"} + KG{"Kirgizisztán"} + KH{"Kambodzsa"} + KI{"Kiribati"} + KM{"Comore-szigetek"} + KN{"Saint Kitts és Nevis"} + KP{"Korea, Észak"} + KR{"Korea, Dél"} + KW{"Kuwait"} + KY{"Kajmán-szigetek"} + KZ{"Kazahsztán"} + LA{"Laoszi Népi Demokratikus Köztársaság"} + LB{"Libanon"} + LC{"Saint Lucia"} + LI{"Liechtenstein"} + LK{"Sri Lanka"} + LR{"Libéria"} + LS{"Lesotho"} + LT{"Litvánia"} + LU{"Luxemburg"} + LV{"Lettország"} + LY{"Líbiai Arab Jamahiriya"} + MA{"Marokkó"} + MC{"Monaco"} + MD{"Moldáv Köztársaság"} + MG{"Madagaszkár"} + MH{"Marshall-szigetek"} + MK{"Macedónia, Köztársaság"} + ML{"Mali"} + MM{"Mianmar"} + MN{"Mongólia"} + MO{"Macao S.A.R., China"} + MP{"Északi Mariana-szigetek"} + MQ{"Martinique (francia)"} + MR{"Mauritánia"} + MS{"Montserrat"} + MT{"Málta"} + MU{"Mauritius"} + MV{"Maldív-szigetek"} + MW{"Malawi"} + MX{"Mexikó"} + MY{"Malajzia"} + MZ{"Mozambik"} + NA{"Namíbia"} + NC{"Új Kaledónia (francia)"} + NE{"Niger"} + NF{"Norfolk-sziget"} + NG{"Nigéria"} + NI{"Nicaragua"} + NL{"Hollandia"} + NO{"Norvégia"} + NP{"Nepál"} + NR{"Nauru"} + NU{"Niue"} + NZ{"Új-Zéland"} + OM{"Omán"} + PA{"Panama"} + PE{"Peru"} + PF{"Polinézia (francia)"} + PG{"Pápua Új-Guinea"} + PH{"Fülöp-szigetek"} + PK{"Pakisztán"} + PL{"Lengyelország"} + PM{"Saint Pierre és Miquelon"} + PN{"Pitcairn-sziget"} + PR{"Puerto Rico"} + PS{"Palesztín Terület"} + PT{"Portugália"} + PW{"Palau"} + PY{"Paraguay"} + QA{"Katar"} + RE{"Reunion (francia)"} + RO{"Románia"} + RU{"Orosz Köztársaság"} + RW{"Ruanda"} + SA{"Szaud-Arábia"} + SB{"Salamon-szigetek"} + SC{"Seychelles"} + SD{"Szudán"} + SE{"Svédország"} + SG{"Szingapúr"} + SH{"Saint Helena"} + SI{"Szlovénia"} + SJ{"Svalbard és Jan Mayen"} + SK{"Szlovákia"} + SL{"Sierra Leone"} + SM{"San Marino"} + SN{"Szenegál"} + SO{"Szomália"} + SP{"Serbia"} + SR{"Suriname"} + ST{"Saint Tome és Principe"} + SV{"El Salvador"} + SY{"Szíriai Arab Köztársaság"} + SZ{"Szváziföld"} + TC{"Török és Caicos Szigetek"} + TD{"Csád"} + TF{"Francia Déli Területek"} + TG{"Togo"} + TH{"Thaiföld"} + TJ{"Tadzsikisztán"} + TK{"Tokelau"} + TL{"Kelet-Timor"} + TM{"Türkmenisztán"} + TN{"Tunézia"} + TO{"Tonga"} + TR{"Törökország"} + TT{"Trinidad és Tobago"} + TV{"Tuvalu"} + TW{"Taiwan"} + TZ{"Tanzánia"} + UA{"Ukrajna"} + UG{"Uganda"} + UM{"United States Minor Outlying Islands"} + US{"Egyesült Államok"} + UY{"Uruguay"} + UZ{"Üzbegisztán"} + VA{"Vatikán"} + VC{"Saint Vincent és Grenadines"} + VE{"Venezuela"} + VG{"Brit Virgin-szigetek"} + VI{"U.S. Virgin-szigetek"} + VN{"Vietnám"} + VU{"Vanuatu"} + WF{"Wallis és Futuna Szigetek"} + WS{"Szamoa"} + YE{"Jemen"} + YT{"Mayotte"} + YU{"Jugoszlávia"} + ZA{"Dél-Afrika"} + ZM{"Zambia"} + ZW{"Zimbabwe"} } - DateTimeElements:intvector { - 2, - 1, // "Minimal Days in First Week" is unknown. Root value used instead - } - DayAbbreviations { - "V", - "H", - "K", - "Sze", - "Cs", - "P", - "Szo", - } - DayNames { - "vas\u00E1rnap", - "h\u00E9tf\u0151", - "kedd", - "szerda", - "cs\u00FCt\u00F6rt\u00F6k", - "p\u00E9ntek", - "szombat", + Currencies{ + ADD{ + "ADD", + "Andorrai dínár", + } + ADP{ + "ADP", + "Andorrai peseta", + } + AED{ + "AED", + "EAE dirham", + } + AFA{ + "AFA", + "Afghani (1927-2002)", + } + AFN{ + "Af", + "Afghani", + } + AIF{ + "AIF", + "Affars and Issas Franc", + } + ALK{ + "ALK", + "Albán lek (1946-1961)", + } + ALL{ + "lek", + "Albán lek", + } + ALV{ + "ALV", + "Albán lek valuta", + } + ALX{ + "ALX", + "Albán dollár konvertibilis valuta", + } + AMD{ + "dram", + "Dram", + } + ANG{ + "NA f.", + "Holland-antilla forint", + } + AOA{ + "AOA", + "Angolai kwanza", + } + AOK{ + "AOK", + "Angolai kwanza (1977-1990)", + } + AON{ + "AON", + "Angolai új kwanza (1990-2000)", + } + AOR{ + "AOR", + "Angolai kwanza reajustado (1995-1999)", + } + AOS{ + "AOS", + "Angolai escudo", + } + ARA{ + "ARA", + "Argentín austral", + } + ARM{ + "ARM", + "Argentín peso moneda nacional", + } + ARP{ + "ARP", + "Argentín peso (1983-1985)", + } + ARS{ + "Arg$", + "Peso", + } + ATS{ + "ATS", + "Osztrák schilling", + } + AUD{ + "$A", + "Ausztrál dollár", + } + AUP{ + "AUP", + "Ausztrál font", + } + AWG{ + "AWG", + "Arubai forint", + } + AZM{ + "AZM", + "Azerbajdzsáni manat", + } + BAD{ + "BAD", + "Bosznia-hercegovinai dínár", + } + BAM{ + "KM", + "Bozsnia-hercegovinai konvertibilis márka", + } + BAN{ + "BAN", + "Bosznia-hercegovinai új dínár", + } + BBD{ + "BDS$", + "Barbadosi dollár", + } + BDT{ + "Tk", + "Bangladesi taka", + } + BEC{ + "BEC", + "Belga frank (konvertibilis)", + } + BEF{ + "BF", + "Belga frank", + } + BEL{ + "BEL", + "Belga frank (pénzügyi)", + } + BGL{ + "lev", + "Bolgár kemény leva", + } + BGM{ + "BGM", + "Bolgár szocialista leva", + } + BGN{ + "BGN", + "Bolgár új leva", + } + BGO{ + "BGO", + "Bolgár leva (1879-1952)", + } + BGX{ + "BGX", + "Bolgár leva konvertibilis valuta", + } + BHD{ + "BD", + "Bahreini dinár", + } + BIF{ + "Fbu", + "Burundi frank", + } + BMD{ + "Ber$", + "Bermudai dollár", + } + BMP{ + "BMP", + "Bermudai font", + } + BND{ + "BND", + "Brunei dollár", + } + BOB{ + "Bs", + "Boliviano", + } + BOL{ + "BOL", + "Boliviano (1863-1962)", + } + BOP{ + "BOP", + "Bolíviai peso", + } + BOV{ + "BOV", + "Bolíviai mvdol", + } + BRB{ + "BRB", + "Brazi cruzeiro novo (1967-1986)", + } + BRC{ + "BRC", + "Brazi cruzado", + } + BRE{ + "BRE", + "Brazil cruzeiro (1990-1993)", + } + BRL{ + "R$", + "Brazil real", + } + BRN{ + "BRN", + "Brazil cruzado novo", + } + BRR{ + "BRR", + "Brazil cruzeiro", + } + BRZ{ + "BRZ", + "Brazil cruzeiro (1942-1967)", + } + BSD{ + "BSD", + "Bahamai dollár", + } + BSP{ + "BSP", + "Bahamai font", + } + BTN{ + "Nu", + "Bhutáni ngultrum", + } + BTR{ + "BTR", + "Bhutáni rúpia", + } + BUK{ + "BUK", + "Burmai kyat", + } + BUR{ + "BUR", + "Burmai rúpia", + } + BWP{ + "BWP", + "Botswanai pula", + } + BYB{ + "BYB", + "Fehérorosz új rubel (1994-1999)", + } + BYL{ + "BYL", + "Fehérorosz rubel (1992-1994)", + } + BYR{ + "Rbl", + "Fehérorosz rubel", + } + BZD{ + "BZ$", + "Belizei dollár", + } + BZH{ + "BZH", + "Brit-hondurasi dollár", + } + CAD{ + "Can$", + "Kanadai dollár", + } + CDF{ + "CDF", + "Kongói frank", + } + CDG{ + "CDG", + "Kongói köztársasági frank", + } + CDL{ + "CDL", + "Kongói zaire", + } + CFF{ + "CFF", + "Közép-afrikai CFA frank", + } + CHF{ + "SwF", + "Svájci frank", + } + CKD{ + "CKD", + "Cook-szigeteki dollár", + } + CLC{ + "CLC", + "Chilei condor", + } + CLE{ + "CLE", + "Chilei escudo", + } + CLF{ + "CLF", + "Chilei unidades de fomento", + } + CLP{ + "Ch$", + "Chilei peso", + } + CMF{ + "CMF", + "Cameruni CFA frank", + } + CNP{ + "CNP", + "Kínai jen min piao jüan", + } + CNX{ + "CNX", + "Kínai USA dollár konvertibilis valuta", + } + CNY{ + "Y", + "Kínai jüan renminbi", + } + COB{ + "COB", + "Kolumbiai papír peso", + } + COF{ + "COF", + "Kongói CFA frank", + } + COP{ + "Col$", + "Kolumbiai peso", + } + CRC{ + "C", + "Costa Ricai colon", + } + CSC{ + "CSC", + "Csehszlovák korona", + } + CSK{ + "CSK", + "Csehszlovák kemény korona", + } + CUP{ + "CUP", + "Kubai peso", + } + CUX{ + "CUX", + "Kubai konvertibilis valuta", + } + CVE{ + "CVEsc", + "Cape Verdei escudo", + } + CWG{ + "CWG", + "Curacaoi forint", + } + CYP{ + "£C", + "Ciprusi font", + } + CZK{ + "CZK", + "Cseh korona", + } + DDM{ + "DDM", + "Kelet-Német márka", + } + DEM{ + "DEM", + "Német márka", + } + DES{ + "DES", + "German Sperrmark", + } + DJF{ + "DF", + "Dzsibuti frank", + } + DKK{ + "DKr", + "Dán korona", + } + DOP{ + "RD$", + "Dominikai peso", + } + DZD{ + "DA", + "Algériai dínár", + } + DZF{ + "DZF", + "Algériai új frank", + } + DZG{ + "DZG", + "Algériai kezdeti frank", + } + ECS{ + "ECS", + "Ecuadori sucre", + } + ECV{ + "ECV", + "Ecuadori Unidad de Valor Constante (UVC)", + } + EEK{ + "EEK", + "Észt korona", + } + EGP{ + "EGP", + "Egyiptomi font", + } + ERN{ + "ERN", + "Eritreai nakfa", + } + ESP{ + "ESP", + "Spanyol peseta", + } + ETB{ + "Br", + "Etiópiai birr", + } + ETD{ + "ETD", + "Etiópiai dollár", + } + EUR{ + "€", + "Euro", + } + FIM{ + "FIM", + "Finn markka", + } + FIN{ + "FIN", + "Finn markka (1860-1962)", + } + FJD{ + "F$", + "Fidzsi dollár", + } + FJP{ + "FJP", + "Fidzsi font", + } + FKP{ + "FKP", + "Falkland-szigeteki font", + } + FOK{ + "FOK", + "Feröer-szigeteki korona", + } + FRF{ + "FRF", + "Francia frank", + } + FRG{ + "FRG", + "Francia frank kezdeti/Frank poincare", + } + GAF{ + "GAF", + "Gaboni CFA frank", + } + GBP{ + "£", + "Brit font sterling", + } + GEK{ + "GEK", + "Grúz kupon larit", + } + GEL{ + "lari", + "Grúz lari", + } + GHC{ + "GHC", + "Ghánai cedi", + } + GHO{ + "GHO", + "Ghánai régi cedi", + } + GHP{ + "GHP", + "Ghánai font", + } + GHR{ + "GHR", + "Ghánai újraértékelt cedi", + } + GIP{ + "GIP", + "Gibraltári font", + } + GLK{ + "GLK", + "Grönlandi korona", + } + GMD{ + "GMD", + "Gambiai dalasi", + } + GMP{ + "GMP", + "Gambiai font", + } + GNF{ + "GF", + "Guineai frank", + } + GNI{ + "GNI", + "Guineai frank (1960-1972)", + } + GNS{ + "GNS", + "Guineai syli", + } + GPF{ + "GPF", + "Guadeloupei frank", + } + GQE{ + "GQE", + "Egyenlítői-guineai ekwele guineana", + } + GQF{ + "GQF", + "Egyenlítői-guineai franco", + } + GQP{ + "GQP", + "Egyenlítői-guineai peseta guineana", + } + GRD{ + "GRD", + "Görög drachma", + } + GRN{ + "GRN", + "Görög új drachma", + } + GTQ{ + "Q", + "Guatemalai quetzal", + } + GUF{ + "GUF", + "Francia Guyanai frank guiana", + } + GWE{ + "GWE", + "Portugál guinea escudo", + } + GWM{ + "GWM", + "Portugál guinea mil reis", + } + GWP{ + "GWP", + "Guinea-Bissaui peso", + } + GYD{ + "G$", + "Guyanai dollár", + } + HKD{ + "HK$", + "Hongkongi dollár", + } + HNL{ + "L", + "Hodurasi lempira", + } + HRD{ + "HRD", + "Horvát dínár", + } + HRK{ + "HRK", + "Horvát kuna", + } + HTG{ + "HTG", + "Haiti gourde", + } + HUF{ + "Ft", + "Magyar forint", + } + IBP{ + "IBP", + "Északír font", + } + IDG{ + "IDG", + "Indonéz nica guilder", + } + IDJ{ + "IDJ", + "Indonéz jáva rúpia", + } + IDN{ + "IDN", + "Indonéz új rúpia", + } + IDR{ + "Rp", + "Indonéz rúpia", + } + IEP{ + "IR£", + "Ír font", + } + ILL{ + "ILL", + "Izraeli sékel", + } + ILP{ + "ILP", + "Izraeli font", + } + ILS{ + "ILS", + "Izraeli új sékel", + } + IMP{ + "IMP", + "Man-szigeti font sterling", + } + IQD{ + "ID", + "Iraki dínár", + } + IRR{ + "RI", + "Iráni rial", + } + ISK{ + "ISK", + "Izlandi korona", + } + ITL{ + "₤", + "Olasz líra", + } + JEP{ + "JEP", + "Jersey font sterling", + } + JMD{ + "J$", + "Jamaikai dollár", + } + JMP{ + "JMP", + "Jamaikai font", + } + JOD{ + "JD", + "Jordániai dínár", + } + JPY{ + "¥", + "Japán jen", + } + KES{ + "K Sh", + "Kenyai shilling", + } + KGS{ + "som", + "Kirgizisztáni szom", + } + KHO{ + "KHO", + "Kambodzsai régi riel", + } + KHR{ + "CR", + "Kambodzsai riel", + } + KID{ + "KID", + "Kiribati dollár", + } + KMF{ + "CF", + "Comorei frank", + } + KPP{ + "KPP", + "Észak-koreai népi won", + } + KPW{ + "KPW", + "Észak-koreai won", + } + KRH{ + "KRH", + "Dél-koreai hwan", + } + KRO{ + "KRO", + "Dél-koreai régi won", + } + KRW{ + "KRW", + "Dél-koreai won", + } + KWD{ + "KD", + "Kuvaiti dínár", + } + KYD{ + "KYD", + "Kajmán-szigeteki dollár", + } + KZR{ + "KZR", + "Kazahsztáni rubel", + } + KZT{ + "T", + "Kazahsztáni tenge", + } + LAK{ + "LAK", + "Laoszi kip", + } + LBP{ + "LL", + "Libanoni font", + } + LIF{ + "LIF", + "Liechtensteini frank", + } + LKR{ + "SL Re", + "Sri Lankai rúpia", + } + LNR{ + "LNR", + "Ceyloni rúpia", + } + LRD{ + "LRD", + "Libériai dollár", + } + LSL{ + "M", + "Lesothoi loti", + } + LTL{ + "LTL", + "Litvániai litas", + } + LTT{ + "LTT", + "Litvániai talonas", + } + LUF{ + "LUF", + "Luxemburgi frank", + } + LVL{ + "LVL", + "Lett lats", + } + LVR{ + "LVR", + "Lett rubel", + } + LYB{ + "LYB", + "Líbiai brit katonai fennhatósági líra", + } + LYD{ + "LD", + "Líbiai dínár", + } + LYP{ + "LYP", + "Líbiai font", + } + MAD{ + "MAD", + "Marokkói dirham", + } + MAF{ + "MAF", + "Marokkói frank", + } + MCF{ + "MCF", + "Monacoi frank új", + } + MCG{ + "MCG", + "Monacoi frank kezdeti", + } + MDC{ + "MDC", + "Moldován lei kupon", + } + MDL{ + "MDL", + "Moldován lei", + } + MDR{ + "MDR", + "Moldován rubel kupon", + } + MGA{ + "MGA", + "Madagaszkári ariary", + } + MGF{ + "MGF", + "Madagaszkári frank", + } + MHD{ + "MHD", + "Marshall-szigeteki dollár", + } + MKD{ + "MDen", + "Macedon dínár", + } + MKN{ + "MKN", + "Macedon dínár (1992-1993)", + } + MLF{ + "MLF", + "Mali frank", + } + MMK{ + "MMK", + "Mianmari kyat", + } + MMX{ + "MMX", + "Mianmari dollár konvertibilis valuta", + } + MNT{ + "Tug", + "Mongóliai tugrik", + } + MOP{ + "MOP", + "Macaoi pataca", + } + MQF{ + "MQF", + "Martiniquei frank", + } + MRO{ + "UM", + "Mauritániai ouguiya", + } + MTL{ + "Lm", + "Máltai líra", + } + MTP{ + "MTP", + "Máltai font", + } + MUR{ + "MUR", + "Mauritiusi rúpia", + } + MVP{ + "MVP", + "Maldív-szigeteki rúpia", + } + MVR{ + "MVR", + "Maldív-szigeteki rufiyaa", + } + MWK{ + "MK", + "Malawi kwacha", + } + MWP{ + "MWP", + "Malawi font", + } + MXN{ + "MEX$", + "Mexikói peso", + } + MXP{ + "MXP", + "Mexikói ezüst peso (1861-1992)", + } + MXV{ + "MXV", + "Mexikói Unidad de Inversion (UDI)", + } + MYR{ + "RM", + "Malajziai ringgit", + } + MZE{ + "MZE", + "Mozambik escudo", + } + MZM{ + "Mt", + "Mozambik metical", + } + NAD{ + "N$", + "Namíbiai dollár", + } + NCF{ + "NCF", + "Új-kaledóniai frank kezdeti", + } + NGN{ + "NGN", + "Nigériai naira", + } + NGP{ + "NGP", + "Nigériai font", + } + NHF{ + "NHF", + "Új-hebridáki CFP frank", + } + NIC{ + "NIC", + "Nikaraguai cordoba", + } + NIG{ + "NIG", + "Nikaraguai arany cordoba", + } + NIO{ + "NIO", + "Nikaraguai cordoba oro", + } + NLG{ + "NLG", + "Holland forint", + } + NOK{ + "NKr", + "Norvég korona", + } + NPR{ + "Nrs", + "Nepáli rúpia", + } + NZD{ + "$NZ", + "Új-zélandi dollár", + } + NZP{ + "NZP", + "Új-zélandi font", + } + OMR{ + "RO", + "Ománi rial", + } + OMS{ + "OMS", + "Ománi rial saidi", + } + PAB{ + "PAB", + "Panamai balboa", + } + PDK{ + "PDK", + "Transzdnyeszteri rubel kupon", + } + PDN{ + "PDN", + "Transzdnyeszteri új rubel", + } + PDR{ + "PDR", + "Transzdnyeszteri rubel", + } + PEI{ + "PEI", + "Perui inti", + } + PEN{ + "PEN", + "Perui sol nuevo", + } + PES{ + "PES", + "Perui sol", + } + PGK{ + "PGK", + "Pápua új-guineai kina", + } + PHP{ + "PHP", + "Fülöp-szigeteki peso", + } + PKR{ + "Pra", + "Pakisztáni rúpia", + } + PLN{ + "Zl", + "Lengyel zloty", + } + PLX{ + "PLX", + "Lengyel USA dollár konvertibilis valuta", + } + PLZ{ + "PLZ", + "Lengyel zloty (1950-1995)", + } + PSP{ + "PSP", + "Palesztin font", + } + PTC{ + "PTC", + "Portugál conto", + } + PTE{ + "PTE", + "Portugál escudo", + } + PYG{ + "PYG", + "Paraguayi guarani", + } + QAR{ + "QR", + "Katari rial", + } + REF{ + "REF", + "Réunioni frank", + } + ROL{ + "leu", + "Román lej", + } + RON{ + "RON", + "Román új lej", + } + RUB{ + "RUB", + "Orosz rubel", + } + RUR{ + "RUR", + "Orosz rubel (1991-1998)", + } + RWF{ + "RWF", + "Ruandai frank", + } + SAR{ + "SRl", + "Szaúdi riyal", + } + SAS{ + "SAS", + "Szaúdi szuverén riyal", + } + SBD{ + "SI$", + "Salamon-szigeteki dollár", + } + SCR{ + "SR", + "Seychelle-szigeteki rúpia", + } + SDD{ + "SDD", + "Szudáni dínár", + } + SDP{ + "SDP", + "Szudáni font", + } + SEK{ + "SKr", + "Svéd korona", + } + SGD{ + "S$", + "Szingapúri dollár", + } + SHP{ + "SHP", + "Saint Helena font", + } + SIB{ + "SIB", + "Szlovén tolar bons", + } + SIT{ + "SIT", + "Szlovén tolar", + } + SKK{ + "Sk", + "Szlovák korona", + } + SLL{ + "SLL", + "Sierra Leonei leone", + } + SML{ + "SML", + "San Marinoi líra", + } + SOS{ + "So. Sh.", + "Szomáli shilling", + } + SQS{ + "SQS", + "Szomálföldi shilling", + } + SRG{ + "Sf", + "Suriname-i gulden", + } + SSP{ + "SSP", + "Skót font", + } + STD{ + "Db", + "Sao tome-i és principe-i dobra", + } + STE{ + "STE", + "Sao tome-i és principe-i escudo", + } + SUN{ + "SUN", + "Szovjet új rubel", + } + SUR{ + "SUR", + "Szovjet rubel", + } + SVC{ + "SVC", + "Salvadori colón", + } + SYP{ + "LS", + "Szíriai font", + } + SZL{ + "E", + "Szváziföldi lilangeni", + } + TCC{ + "TCC", + "Turks és caicosi korona", + } + TDF{ + "TDF", + "Csádi CFA frank", + } + THB{ + "THB", + "Thai baht", + } + TJR{ + "TJR", + "Tádzsikisztáni rubel", + } + TJS{ + "TJS", + "Tádzsikisztáni somoni", + } + TMM{ + "TMM", + "Türkmenisztáni manat", + } + TND{ + "TND", + "Tunéziai dínár", + } + TOS{ + "TOS", + "Tongai font sterling", + } + TPE{ + "TPE", + "Timori escudo", + } + TPP{ + "TPP", + "Timori pataca", + } + TRL{ + "TL", + "Török líra", + } + TRY{ + "TRY", + "Új török líra", + } + TTD{ + "TT$", + "Trinidad és tobagoi dollár", + } + TTO{ + "TTO", + "Trinidad és tobagoi régi dollár", + } + TVD{ + "TVD", + "Tuvalui dollár", + } + TWD{ + "NT$", + "Tajvani új dollár", + } + TZS{ + "T Sh", + "Tanzániai shilling", + } + UAH{ + "UAH", + "Ukrán hrivnya", + } + UAK{ + "UAK", + "Ukrán karbovanec", + } + UGS{ + "UGS", + "Ugandai shilling (1966-1987)", + } + UGX{ + "U Sh", + "Ugandai shilling", + } + USD{ + "US$", + "USA dollár", + } + USN{ + "USN", + "USA dollár (következő napi)", + } + USS{ + "USS", + "USA dollár (aznapi)", + } + UYF{ + "UYF", + "Uruguay-i peso fuerte", + } + UYP{ + "UYP", + "Uruguay-i peso (1975-1993)", + } + UYU{ + "Ur$", + "Uruguay-i peso uruguayo", + } + UZC{ + "UZC", + "Üzbegisztáni kupon som", + } + UZS{ + "UZS", + "Üzbegisztáni szum", + } + VAL{ + "VAL", + "Vatikáni líra", + } + VDD{ + "VDD", + "Észak-vietnámi piastre dong viet", + } + VDN{ + "VDN", + "Észak-vietnámi új dong", + } + VDP{ + "VDP", + "Észak-vietnámi viet minh piastre dong viet", + } + VEB{ + "Be", + "Venezuelai bolívar", + } + VGD{ + "VGD", + "Brit virgin-szigeteki dollár", + } + VND{ + "VND", + "Vietnámi dong", + } + VNN{ + "VNN", + "Vietnámi új dong", + } + VNR{ + "VNR", + "Vietnámi köztársasági dong", + } + VNS{ + "VNS", + "Vietnámi nemzeti dong", + } + VUV{ + "VT", + "Vanuatui vatu", + } + WSP{ + "WSP", + "Nyugat-szamoai font", + } + WST{ + "WST", + "Nyugat-szamoai tala", + } + XAD{ + "XAD", + "Asian Dinar Unit of Account", + } + XAF{ + "XAF", + "CFA frank BEAC", + } + XAM{ + "XAM", + "Asian Monetary Unit", + } + XAU{ + "XAU", + "Arany", + } + XBA{ + "XBA", + "European Composite Unit", + } + XBB{ + "XBB", + "European Monetary Unit", + } + XBC{ + "XBC", + "European Unit of Account (XBC)", + } + XBD{ + "XBD", + "European Unit of Account (XBD)", + } + XCD{ + "EC$", + "Kelet-karibi dollár", + } + XCF{ + "XCF", + "CFA új frank", + } + XDR{ + "XDR", + "Special Drawing Rights", + } + XEF{ + "XEF", + "CFA frank BCEAEC", + } + XEU{ + "XEU", + "European Currency Unit", + } + XFO{ + "XFO", + "Francia arany frank", + } + XFU{ + "XFU", + "Francia UIC-frank", + } + XID{ + "XID", + "Iszlám dínár", + } + XMF{ + "XMF", + "French Metropolitan Nouveau Franc", + } + XNF{ + "XNF", + "French Antilles CFA Franc", + } + XOF{ + "XOF", + "CFA frank BCEAO", + } + XPF{ + "CFPF", + "CFP frank", + } + XTR{ + "XTR", + "COMECON Transferable Ruble", + } + YDD{ + "YDD", + "Jemeni dínár", + } + YEI{ + "YEI", + "Jemeni imadi riyal", + } + YER{ + "YRl", + "Jemeni rial", + } + YUD{ + "YUD", + "Jugoszláv kemény dínár", + } + YUF{ + "YUF", + "Jugoszláv szövetségi dínár", + } + YUG{ + "YUG", + "Jugoszláv 1994-es dínár", + } + YUM{ + "YUM", + "Jugoszláv új dínár", + } + YUN{ + "YUN", + "Jugoszláv konvertibilis dínár", + } + YUO{ + "YUO", + "Jugoszláv októberi dínár", + } + YUR{ + "YUR", + "Jugoszláv reform dínár", + } + ZAL{ + "ZAL", + "Dél-afrikai rand (pénzügyi)", + } + ZAP{ + "ZAP", + "Dél-afrikai font", + } + ZAR{ + "R", + "Dél-afrikai rand", + } + ZMK{ + "ZMK", + "Zambiai kwacha", + } + ZMP{ + "ZMP", + "Zambiai font", + } + ZRN{ + "ZRN", + "Zairei új zaire", + } + ZRZ{ + "ZRZ", + "Zairei zaire", + } + ZWD{ + "Z$", + "Zimbabwei dollár", + } } - Eras { - "i.e.", - "i.u.", + ExemplarCharacters{ + "[a-z á é í ó ú ö ü ő ű {cs} {dz} {dzs} {gy} {ly} {ny} {sz} {ty} {zs} {ccs} {" + "ddz} {ddzs} {ggy} {lly} {nny} {ssz} {tty} {zzs}]" } - Languages { - hu { "magyar" } + Keys{ + calendar{"Naptár"} + collation{"Rendezés"} + currency{"Pénznem"} } - LocaleID:int { 0x0e } -// LocaleString { "hu" } - MonthAbbreviations { - "jan.", - "febr.", - "m\u00E1rc.", - "\u00E1pr.", - "m\u00E1j.", - "j\u00FAn.", - "j\u00FAl.", - "aug.", - "szept.", - "okt.", - "nov.", - "dec.", + Languages{ + aa{"afar"} + ab{"abház"} + af{"afrikai"} + am{"amhara"} + ar{"arab"} + as{"asszámi"} + ay{"ajmara"} + az{"azerbajdzsáni"} + ba{"baskír"} + be{"belorusz"} + bg{"bolgár"} + bh{"bihari"} + bi{"bislama"} + bn{"bengáli"} + bo{"tibeti"} + br{"breton"} + ca{"katalán"} + co{"korzikai"} + cs{"cseh"} + cy{"walesi"} + da{"dán"} + de{"német"} + dz{"butáni"} + el{"görög"} + en{"angol"} + eo{"eszperantó"} + es{"spanyol"} + et{"észt"} + eu{"baszk"} + fa{"perzsa"} + fi{"finn"} + fj{"fidzsi"} + fo{"feröeri"} + fr{"francia"} + fy{"fríz"} + ga{"ír"} + gd{"skót (gael)"} + gl{"galíciai"} + gn{"guarani"} + gu{"gudzsaráti"} + ha{"hausza"} + he{"héber"} + hi{"hindi"} + hr{"horvát"} + hu{"magyar"} + hy{"örmény"} + ia{"interlingua"} + id{"indonéz"} + ie{"interlingue"} + ik{"inupiak"} + is{"izlandi"} + it{"olasz"} + iu{"inuktitut"} + ja{"japán"} + jv{"jávai"} + ka{"grúz"} + kk{"kazah"} + kl{"grönlandi"} + km{"kambodzsai"} + kn{"kannada"} + ko{"koreai"} + ks{"kasmíri"} + ku{"kurd"} + ky{"kirgiz"} + la{"latin"} + ln{"lingala"} + lo{"laoszi"} + lt{"litván"} + lv{"lett"} + mg{"madagaszkári"} + mi{"maori"} + mk{"macedón"} + ml{"malajalam"} + mn{"mongol"} + mo{"moldvai"} + mr{"marati"} + ms{"maláj"} + mt{"máltai"} + my{"burmai"} + na{"naurui"} + ne{"nepáli"} + nl{"holland"} + no{"norvég"} + oc{"okszitán"} + om{"oromói"} + or{"orija"} + pa{"pandzsábi"} + pl{"lengyel"} + ps{"pastu (afgán)"} + pt{"portugál"} + qu{"kecsua"} + rm{"rétoromán"} + rn{"kirundi"} + ro{"román"} + ru{"orosz"} + rw{"kiruanda"} + sa{"szanszkrit"} + sd{"szindi"} + sg{"sango"} + sh{"szerb-horvát"} + si{"szingaléz"} + sk{"szlovák"} + sl{"szlovén"} + sm{"szamoai"} + sn{"sona"} + so{"szomáli"} + sq{"albán"} + sr{"szerb"} + ss{"sziszuati"} + st{"szeszotó"} + su{"szundanéz"} + sv{"svéd"} + sw{"szuahéli"} + ta{"tamil"} + te{"telugu"} + tg{"tadzsik"} + th{"thai"} + ti{"tigrinya"} + tk{"türkmén"} + tl{"tagalog"} + tn{"szecsuáni"} + to{"tonga"} + tr{"török"} + ts{"conga"} + tt{"tatár"} + tw{"tui"} + ug{"ujgur"} + uk{"ukrán"} + ur{"urdu"} + uz{"üzbég"} + vi{"vietnámi"} + vo{"volapük"} + wo{"volof"} + xh{"hosza"} + yi{"zsidó"} + yo{"joruba"} + za{"zsuang"} + zh{"kínai"} + zu{"zulu"} } - MonthNames { - "janu\u00E1r", - "febru\u00E1r", - "m\u00E1rcius", - "\u00E1prilis", - "m\u00E1jus", - "j\u00FAnius", - "j\u00FAlius", - "augusztus", - "szeptember", - "okt\u00F3ber", - "november", - "december", + LocaleScript{ + "Latn", } - NumberElements { + NumberElements{ ",", - "\u00A0", + " ", ";", "%", "0", "#", "-", "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", + "‰", + "∞", + "�", + "+", } -// ShortLanguage { "hun" } - localPatternChars { "GanjkHmsSEDFwWxhKzAe" } - zoneStrings { - { - "Africa/Casablanca", - "GMT", - "GMT", - "GMT", - "GMT", + Scripts{ + Armn{"Örmény"} + Beng{"Bengáli"} + Bopo{"Bopomofo"} + Brai{"Vakírás"} + Cans{"Egyesített kanadai őslakos jelek"} + Cprt{"Ciprusi"} + Cyrl{"Cirill"} + Ethi{"Etióp"} + Geor{"Grúz"} + Goth{"Gótikus"} + Grek{"Görög"} + Hani{"Han"} + Hano{"Hanunoo"} + Hans{"Egyszerűsített Han"} + Hant{"Hagyományos Han"} + Hebr{"Héber"} + Ital{"Régi olasz"} + Knda{"Kannada"} + Laoo{"Lao"} + Limb{"Limbu"} + Mlym{"Malayalam"} + Mymr{"Burmai"} + Ogam{"Ogham"} + Orya{"Oriya"} + Osma{"Oszmán"} + Sinh{"Szingaléz"} + Syrc{"Szíriai"} + Tagb{"Tagbanwa"} + Tale{"Tai Le"} + Telu{"Telugu"} + Thaa{"Thaana"} + Tibt{"Tibeti"} + Ugar{"Ugari"} + Zyyy{"Meghatározatlan"} + } + Types{ + calendar{ + buddhist{"buddhista naptár"} + chinese{"kínai naptár"} + gregorian{"Gergely-naptár"} + hebrew{"héber naptár"} + islamic{"iszlám naptár"} + islamic-civil{"iszlám civil naptár"} + japanese{"japán naptár"} + } + collation{ + direct{"Közvetlen sorrend"} + phonebook{"Telefonkönyv sorrend"} + traditional{"Hagyományos"} } } -// LocaleScript{ -// "Latn", // ISO 15924 Name -// } - ExemplarCharacters { "[a-z \u00e1 \u00e9 \u00ed \u00f3 \u00fa \u00f6 \u00fc \u0151 \u0171]" } - - // Currency display names - Currencies { - HUF { "Ft", "HUF" } + Version{"1.3"} + calendar{ + buddhist{ + eras{ + abbreviated{ + "BK", + } + } + } + gregorian{ + AmPmMarkers{ + "DE", + "DU", + } + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "H:mm:ss z", + "H:mm:ss z", + "H:mm:ss", + "H:mm", + "yyyy. MMMM d.", + "yyyy. MMMM d.", + "yyyy.MM.dd.", + "yyyy.MM.dd.", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "V", + "H", + "K", + "Sze", + "Cs", + "P", + "Szo", + } + narrow{ + "V", + "H", + "K", + "S", + "C", + "P", + "S", + } + wide{ + "vasárnap", + "hétfő", + "kedd", + "szerda", + "csütörtök", + "péntek", + "szombat", + } + } + } + eras{ + abbreviated{ + "i.e.", + "i.u.", + } + } + monthNames{ + format{ + abbreviated{ + "jan.", + "febr.", + "márc.", + "ápr.", + "máj.", + "jún.", + "júl.", + "aug.", + "szept.", + "okt.", + "nov.", + "dec.", + } + narrow{ + "J", + "F", + "M", + "Á", + "M", + "J", + "J", + "A", + "S", + "O", + "N", + "D", + } + wide{ + "január", + "február", + "március", + "április", + "május", + "június", + "július", + "augusztus", + "szeptember", + "október", + "november", + "december", + } + } + } + } + hebrew{ + eras{ + abbreviated{ + "TÉ", + } + } + monthNames{ + format{ + abbreviated:alias{"hu/calendar/hebrew/monthNames/format/wide"} + wide{ + "Tisri", + "Hesván", + "Kiszlév", + "Tévész", + "Svát", + "Ádár risón", + "Ádár séni", + "Niszán", + "Ijár", + "Sziván", + "Tamuz", + "Áv", + "Elul", + } + } + } + } + islamic{ + eras{ + abbreviated{ + "MF", + } + } + monthNames{ + format{ + abbreviated:alias{"hu/calendar/islamic/monthNames/format/wide"} + wide{ + "Moharrem", + "Safar", + "Rébi el avvel", + "Rébi el accher", + "Dsemádi el avvel", + "Dsemádi el accher", + "Redseb", + "Sabán", + "Ramadán", + "Sevvál", + "Dsül kade", + "Dsül hedse", + } + } + } + } + islamic-civil:alias{"hu/calendar/islamic"} } - - // (ICU 2.6) International Calendar Data. Note, THE FORMAT OF THIS DATA WILL CHANGE IN FUTURE RELEASES. - Eras_buddhist:array { "BK" } + localPatternChars{"GanjkHmsSEDFwWxhKzAeugXZ"} } diff --git a/icuSources/data/locales/hu_HU.txt b/icuSources/data/locales/hu_HU.txt index 33940a9f..f2fc3a32 100644 --- a/icuSources/data/locales/hu_HU.txt +++ b/icuSources/data/locales/hu_HU.txt @@ -1,19 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/hu_HU.xml // * // *************************************************************************** - -hu_HU { - Version{ "2.0" } -// LocaleString { "hu_HU" } - NumberPatterns { +hu_HU{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "\u00A4#,##0.00;-\u00A4#,##0.00", + "#,##0.00 ¤;-#,##0.00 ¤", "#,##0%", "#E0", } -// ShortCountry { "HUN" } - LocaleID:int { 0x040e } + Version{"1.2"} } diff --git a/icuSources/data/locales/hy.txt b/icuSources/data/locales/hy.txt index a06e8e31..3cbe4515 100644 --- a/icuSources/data/locales/hy.txt +++ b/icuSources/data/locales/hy.txt @@ -1,129 +1,318 @@ -// *************************************************************************** -// * -// * Copyright (C) 2001-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// * Data by : -// * Bedo Agopian www.agosoft.com -// * Aram Airapetian -// * Arminco Global Telecommunications -// * Jora Manoucherians -// * Richard Youatt -// *************************************************************************** - -hy{ - Version { "2.0" } - - AmPmMarkers { - "\u0531\u057c\u2024", - "\u0535\u0580\u2024", - -// ICU will only use the first two strings. -// "\u0531\u057c\u0561\u0582\u0585\u057f\u0565\u0561\u0576", -// "\u0535\u0580\u0565\u056f\u0578\u0575\u0565\u0561\u0576" - } - DayAbbreviations { - "\u053f\u056b\u0580", - "\u0535\u0580\u056f", - "\u0535\u0580\u0584", - "\u0549\u0578\u0580", - "\u0540\u0576\u0563", - "\u0548\u0582\u0580", - "\u0547\u0561\u0562", - } - DayNames { - "\u053f\u056b\u0580\u0561\u056f\u056b", - "\u0535\u0580\u056f\u0578\u0582\u0577\u0561\u0562\u0569\u056b", - "\u0535\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b", - "\u0549\u0578\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b", - "\u0540\u056b\u0576\u0563\u0577\u0561\u0562\u0569\u056b", - "\u0548\u0582\u0580\u0562\u0561\u0569", - "\u0547\u0561\u0562\u0561\u0569", - } - MonthAbbreviations { - "\u0545\u0576\u0580", - "\u0553\u057f\u0580", - "\u0544\u0580\u057f", - "\u0531\u057a\u0580", - "\u0544\u0575\u057d", - "\u0545\u0576\u057d", - "\u0545\u056c\u057d", - "\u0555\u0563\u057d", - "\u054d\u0565\u057a", - "\u0540\u0578\u056f", - "\u0546\u0578\u0575", - "\u0534\u0565\u056f", - } - MonthNames { - "\u0545\u0578\u0582\u0576\u0578\u0582\u0561\u0580", - "\u0553\u0565\u057f\u0580\u0578\u0582\u0561\u0580", - "\u0544\u0561\u0580\u057f", - "\u0531\u057a\u0580\u056b\u056c", - "\u0544\u0561\u0575\u056b\u057d", - "\u0545\u0578\u0582\u0576\u056b\u057d", - "\u0545\u0578\u0582\u056c\u056b\u057d", - "\u0555\u0563\u0578\u057d\u057f\u0578\u057d", - "\u054d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580", - "\u0540\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580", - "\u0546\u0578\u0575\u0565\u0574\u0562\u0565\u0580", - "\u0534\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580", - } - - Eras { - "\u0545\u2024\u054F\u2024", // 3.D. - "\u0546\u2024\u0554\u2024" // N.K. - } - LocaleScript{ - "Armn", // Script Name - } - ExemplarCharacters{"[:Armn:]"} - Countries{ - AM { "\u0540\u0561\u0575\u0561\u057D\u057F\u0561\u0576\u056B\u0020" - "\u0540\u0561\u0576\u0580\u0561\u057A\u0565\u057F\u0578\u0582\u0569" - "\u056B\u0582\u0576" } - } - Languages{ - hy { "\u0540\u0561\u0575\u0565\u0580\u0567\u0576" } - } -// LocaleString{ "hy" } - LocaleID:int { 0x2b } - - // /**************** Info Below is needed ****************/ - // CollationElements{} // To be supplied from Unicode - // - - DateTimePatterns { - "HH:mm:ss z", - "HH:mm:ss z", - "HH:mm:ss", - "HH:mm", - "EEEE, MMMM d, yyyy", - "MMMM dd, yyyy", - "MMM d, yyyy", - "MM/dd/yy", - "{1} {0}", - } - -// localPatternChars{ "GyMdkHmsSEDFwWahKz" } - - NumberPatterns{ - "#0.###;-#0.###", - "#0.00 \u00A4;-#0.00 \u00A4", - "#0%", - "#E0", - } - NumberElements { - ",", - ".", - ";", - "%", - "0", - "#", - "-", - "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", - } -} +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/hy.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/hy.xml + */ +hy{ + Countries{ + AD{"Անդորա"} + AE{"Միացյալ Արաբական Էմիրաթներ"} + AF{"Աֆղանստան"} + AG{"Անտիգուա-Բարբուդա"} + AL{"Ալբանիա"} + AM{"Հայաստանի Հանրապետութիւն"} + AO{"Անգոլա"} + AR{"Արգենտինա"} + AT{"Ավստրիա"} + AU{"Ավստրալիա"} + AZ{"Ադրբեջան"} + BA{"Բոսնիա-Հերցեգովինա"} + BB{"Բարբադոս"} + BD{"Բանգլադեշ"} + BE{"Բելգիա"} + BF{"Բուրկինա Ֆասո"} + BG{"Բուլղարիա"} + BH{"Բահրեյն"} + BI{"Բուրունդի"} + BJ{"Բենին"} + BN{"Բրունեյ"} + BO{"Բոլիվիա"} + BR{"Բրազիլիա"} + BS{"Բահամներ"} + BT{"Բուտան"} + BW{"Բոտսվանա"} + BY{"Բելոռուս"} + BZ{"Բելիզ"} + CA{"Կանադա"} + CF{"Կենտրոնական Աֆրիկյան Հանրապետություն"} + CG{"Կոնգո"} + CH{"Շվեյցարիա"} + CI{"Փղոսկրի Ափ"} + CL{"Չիլի"} + CM{"Կամերուն"} + CN{"Չինաստան"} + CO{"Կոլումբիա"} + CR{"Կոստա-Ռիկա"} + CU{"Կուբա"} + CV{"Կաբո-Վերդե"} + CY{"Կիպրոս"} + CZ{"Չեխիայի Հանրապետություն"} + DE{"Գերմանիա"} + DJ{"Ջիբուտի"} + DK{"Դանիա"} + DM{"Դոմինիկա"} + DO{"Դոմինիկյան Հանրապետություն"} + DZ{"Ալժիր"} + EC{"Էկվադոր"} + EE{"Էստոնիա"} + EG{"Եգիպտոս"} + EH{"Արեվմտյան Սահարա"} + ER{"Էրիտրեա"} + ES{"Իսպանիա"} + ET{"Եթովպիա"} + FI{"Ֆինլանդիա"} + FJ{"Ֆիջի"} + FM{"Միկրոնեզիա"} + FR{"Ֆրանսիա"} + GA{"Գաբոն"} + GB{"Մեծ Բրիտանիա"} + GD{"Գրենադա"} + GE{"Վրաստան"} + GH{"Գանա"} + GM{"Գամբիա"} + GN{"Գվինեա"} + GQ{"Հասարակածային Գվինեա"} + GR{"Հունաստան"} + GT{"Գվատեմալա"} + GW{"Գվինեա-Բիսաու"} + GY{"Գայանա"} + HN{"Հոնդուրաս"} + HR{"Հորվաթիա"} + HT{"Հաիթի"} + HU{"Հունգարիա"} + ID{"Ինդոնեզիա"} + IE{"Իռլանդիա"} + IL{"Իսրայել"} + IN{"Հնդկաստան"} + IQ{"Իրաք"} + IR{"Իրան"} + IS{"Իսլանդիա"} + IT{"Իտալիա"} + JM{"Ջամայկա"} + JO{"Հորդանան"} + JP{"Ճապոնիա"} + KE{"Քենիա"} + KG{"Կիրգիզստան"} + KH{"Կամբոջա"} + KI{"Կիրիբատի"} + KM{"Կոմորոս"} + KN{"Սենտ Կիտս-Նեվիս"} + KP{"Հյուսիսային Կորեա"} + KR{"Հարավային Կորեա"} + KW{"Քուվեյթ"} + KZ{"Ղազախստան"} + LA{"Լաոս"} + LB{"Լիբանան"} + LC{"Սանտա Լուչիա"} + LI{"Լիխտենշտեյն"} + LK{"Շրի Լանկա"} + LR{"Լիբերիա"} + LS{"Լեսոտո"} + LT{"Լիտվա"} + LU{"Լյուքսեմբուրգ"} + LV{"Լատվիա"} + LY{"Լիբիա"} + MA{"Մարոկո"} + MC{"Մոնակո"} + MD{"Մոլդովա"} + MG{"Մադագասկար"} + MH{"Մարշալյան կղզիներ"} + MK{"Մակեդոնիա"} + ML{"Մալի"} + MM{"Մյանմա"} + MN{"Մոնղոլիա"} + MR{"Մավրիտանիա"} + MT{"Մալթա"} + MU{"Մավրիտոս"} + MV{"Մալդիվներ"} + MW{"Մալավի"} + MX{"Մեքսիկա"} + MY{"Մալայզիա"} + MZ{"Մոզամբիկ"} + NA{"Նամիբիա"} + NE{"Նիգեր"} + NG{"Նիգերիա"} + NI{"Նիկարագուա"} + NL{"Նիդերլանդեր"} + NO{"Նորվեգիա"} + NP{"Նեպալ"} + NR{"Նաուրու"} + NZ{"Նոր Զելանդիա"} + OM{"Օման"} + PA{"Պանամա"} + PE{"Պերու"} + PG{"Պապուա Նոր Գվինեա"} + PH{"Ֆիլիպիններ"} + PK{"Պակիստան"} + PL{"Լեհաստան"} + PT{"Պորտուգալիա"} + PW{"Պալաու"} + PY{"Պարագվայ"} + QA{"Կատար"} + RO{"Ռումինիա"} + RU{"Ռուսաստան"} + RW{"Ռուանդա"} + SA{"Սաուդիան Արաբիա"} + SB{"Սոլոմոնյան կղզիներ"} + SC{"Սեյշելներ"} + SD{"Սուդան"} + SE{"Շվեդիա"} + SG{"Սինգապուր"} + SI{"Սլովենիա"} + SK{"Սլովակիա"} + SL{"Սյերա-Լեոնե"} + SM{"Սան Մարինո"} + SN{"Սենեգալ"} + SO{"Սոմալի"} + SP{"Սերբիա"} + SR{"Սուրինամ"} + ST{"Սան-Թոմե-Փրինսիպի"} + SV{"Սալվադոր"} + SY{"Սիրիա"} + SZ{"Սվազիլենդ"} + TD{"Չադ"} + TG{"Տոգո"} + TH{"Թաիլանդ"} + TJ{"Տաճիկստան"} + TM{"Թուրքմենստան"} + TN{"Թունիս"} + TO{"Տոնգա"} + TR{"Թուրքիա"} + TT{"Տրինիդադ-Տոբագո"} + TV{"Տուվալու"} + TW{"Թայվան"} + TZ{"Տանզանիա"} + UA{"Ուկրաինա"} + UG{"Ուգանդա"} + US{"Ամէրիկայի Միացյալ Նահանգնէր"} + UY{"Ուրուգվայ"} + UZ{"Ուզբեկստան"} + VA{"Վատիկան"} + VC{"Սենտ Վիսենտ-Գրենադիններ"} + VE{"Վենեսուելա"} + VN{"Վիետնամ"} + VU{"Վանուատու"} + WS{"Սամոա"} + YE{"Եմեն"} + ZA{"Հարավային Աֆրիկա"} + ZM{"Զամբիա"} + ZW{"Զիմբաբվե"} + } + ExemplarCharacters{"[:Armn:]"} + Languages{ + hy{"Հայերէն"} + } + LocaleScript{ + "Armn", + } + NumberElements{ + ",", + ".", + ";", + "%", + "0", + "#", + "-", + "E", + "‰", + "∞", + "�", + "+", + } + NumberPatterns{ + "#0.###;-#0.###", + "#0.00 ¤;-#0.00 ¤", + "#0%", + "#E0", + } + Version{"1.2"} + calendar{ + gregorian{ + AmPmMarkers{ + "Առ․", + "Եր․", + } + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "HH:mm:ss z", + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm", + "EEEE, MMMM d, yyyy", + "MMMM dd, yyyy", + "MMM d, yyyy", + "MM/dd/yy", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "Կիր", + "Երկ", + "Երք", + "Չոր", + "Հնգ", + "Ուր", + "Շաբ", + } + wide{ + "Կիրակի", + "Երկուշաբթի", + "Երեքշաբթի", + "Չորեքշաբթի", + "Հինգշաբթի", + "Ուրբաթ", + "Շաբաթ", + } + } + } + eras{ + abbreviated{ + "Յ․Տ․", + "Ն․Ք․", + } + } + monthNames{ + format{ + abbreviated{ + "Յնր", + "Փտր", + "Մրտ", + "Ապր", + "Մյս", + "Յնս", + "Յլս", + "Օգս", + "Սեպ", + "Հոկ", + "Նոյ", + "Դեկ", + } + wide{ + "Յունուար", + "Փետրուար", + "Մարտ", + "Ապրիլ", + "Մայիս", + "Յունիս", + "Յուլիս", + "Օգոստոս", + "Սեպտեմբեր", + "Հոկտեմբեր", + "Նոյեմբեր", + "Դեկտեմբեր", + } + } + } + } + } +} diff --git a/icuSources/data/locales/hy_AM.txt b/icuSources/data/locales/hy_AM.txt index dac8e58c..314c8d25 100644 --- a/icuSources/data/locales/hy_AM.txt +++ b/icuSources/data/locales/hy_AM.txt @@ -1,38 +1,21 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 2001-2002, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/hy_AM.xml // * -// * Data by : -// * Bedo Agopian www.agosoft.com -// * Aram Airapetian -// * Arminco Global Telecommunications -// * Jora Manoucherians -// * Richard Youatt // *************************************************************************** - hy_AM{ - Version { "1.0" } - -// LocaleString { "hy_AM" } - Eras { - "\u0554\u2024\u0531\u2024", // K.A. - "\u0554\u2024\u0535\u2024" // K.E. + Version{"1.2"} + calendar{ + gregorian{ + eras{ + abbreviated{ + "Ք․Ա․", + "Ք․Ե․", + } + } + } } - LocaleID:int { 0x042b } } - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/icuSources/data/locales/hy_AM_REVISED.txt b/icuSources/data/locales/hy_AM_REVISED.txt index 8974b04b..3a5c3c43 100644 --- a/icuSources/data/locales/hy_AM_REVISED.txt +++ b/icuSources/data/locales/hy_AM_REVISED.txt @@ -1,71 +1,57 @@ -// *************************************************************************** -// * -// * Copyright (C) 2001-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// * Data by : -// * Bedo Agopian www.agosoft.com -// * Aram Airapetian -// * Arminco Global Telecommunications -// * Jora Manoucherians -// * Richard Youatt -// *************************************************************************** - -hy_AM_REVISED{ - Version { "2.0" } - - AmPmMarkers { - "\u0531\u057C\u2024", - "\u053F\u0565\u2024", - -// ICU will only use the first two strings. -// "\u0531\u057c\u0561\u057E\u0578\u057f\u0575\u0561\u0576", -// "\u0535\u0580\u0565\u056f\u0578\u0575\u0561\u0576" - } - MonthAbbreviations { - "\u0540\u0576\u057e", - "\u0553\u057f\u057e", - "\u0544\u0580\u057f", - "\u0531\u057a\u0580", - "\u0544\u0575\u057d", - "\u0540\u0576\u057d", - "\u0540\u056c\u057d", - "\u0555\u0563\u057d", - "\u054d\u0565\u057a", - "\u0540\u0578\u056f", - "\u0546\u0578\u0575", - "\u0534\u0565\u056f", - } - MonthNames { - "\u0540\u0578\u0582\u0576\u057e\u0561\u0580", - "\u0553\u0565\u057f\u0580\u057e\u0561\u0580", - "\u0544\u0561\u0580\u057f", - "\u0531\u057a\u0580\u056b\u056c", - "\u0544\u0561\u0575\u056b\u057d", - "\u0540\u0578\u0582\u0576\u056b\u057d", - "\u0540\u0578\u0582\u056c\u056b\u057d", - "\u0555\u0563\u0578\u057d\u057f\u0578\u057d", - "\u054d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580", - "\u0540\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580", - "\u0546\u0578\u0575\u0565\u0574\u0562\u0565\u0580", - "\u0534\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580", - } - Eras { - "\u0544\u2024\u0539\u2024\u0531\u2024", - "\u0544\u2024\u0539\u2024" - } - - // Just use the data from the parent. - // The original data in this locale looked suspicious. -// DateTimePatterns { -// "HH:mm:ss z", -// "H:mm:ss z", -// "H:mm:ss", -// "H:mm", -// "EEEE,d MMMM, yyyy", -// "d MMMM yyyy", -// "d MMM yyyy", -// "dd-MM-yy", -// "{1} {0}", -// } -} +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/hy_AM_REVISED.xml +// * +// *************************************************************************** +hy_AM_REVISED{ + Version{"1.2"} + calendar{ + gregorian{ + AmPmMarkers{ + "Առ․", + "Կե․", + } + eras{ + abbreviated{ + "Մ․Թ․Ա․", + "Մ․Թ․", + } + } + monthNames{ + format{ + abbreviated{ + "Հնվ", + "Փտվ", + "Մրտ", + "Ապր", + "Մյս", + "Հնս", + "Հլս", + "Օգս", + "Սեպ", + "Հոկ", + "Նոյ", + "Դեկ", + } + wide{ + "Հունվար", + "Փետրվար", + "Մարտ", + "Ապրիլ", + "Մայիս", + "Հունիս", + "Հուլիս", + "Օգոստոս", + "Սեպտեմբեր", + "Հոկտեմբեր", + "Նոյեմբեր", + "Դեկտեմբեր", + } + } + } + } + } +} diff --git a/icuSources/data/locales/id.txt b/icuSources/data/locales/id.txt index 6b705a3a..1e61f058 100644 --- a/icuSources/data/locales/id.txt +++ b/icuSources/data/locales/id.txt @@ -1,59 +1,492 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/id.xml // * // *************************************************************************** - -id { - Version { "2.0" } - DayAbbreviations { - "Minggu", - "Sen", - "Sel", - "Rabu", - "Kamis", - "Jumat", - "Sabtu", +/** + * ICU source: ../../../locale/icu/main/id.xml + */ +id{ + Countries{ + AD{"Andora"} + AE{"Uni Emirat Arab"} + AF{"Afghanistan"} + AG{"Antigua dan Barbuda"} + AI{"Anguilla"} + AL{"Albania"} + AM{"Armenia"} + AN{"Antilles Belanda"} + AO{"Angola"} + AQ{"Antarktika"} + AR{"Argentina"} + AS{"Samoa Amerika"} + AT{"Austria"} + AU{"Australia"} + AW{"Aruba"} + AZ{"Azerbaijan"} + BA{"Bosnia dan Herzegovina"} + BB{"Barbados"} + BD{"Bangladesh"} + BE{"Belgia"} + BF{"Burkina Faso"} + BG{"Bulgaria"} + BH{"Bahrain"} + BI{"Burundi"} + BJ{"Benin"} + BM{"Bermuda"} + BN{"Brunei"} + BO{"Bolivia"} + BR{"Brazil"} + BS{"Bahamas"} + BT{"Bhutan"} + BV{"Kepulauan Bouvet"} + BW{"Botswana"} + BY{"Belarusia"} + BZ{"Belize"} + CA{"Kanada"} + CC{"Kepulauan Cocos"} + CD{"Republik Demokratik Kongo"} + CF{"Republik Afrika Tengah"} + CG{"Kongo"} + CH{"Swiss"} + CI{"Pantai Gading"} + CK{"Kepulauan Cook"} + CL{"Chili"} + CM{"Kamerun"} + CN{"Cina"} + CO{"Kolombia"} + CR{"Kosta Rika"} + CU{"Kuba"} + CV{"Tanjung Verde"} + CX{"Pulau Christmas"} + CY{"Siprus"} + CZ{"Republik Ceko"} + DE{"Jerman"} + DJ{"Jibouti"} + DK{"Denmark"} + DM{"Dominika"} + DO{"Republik Dominika"} + DZ{"Algeria"} + EC{"Ekuador"} + EE{"Estonia"} + EG{"Mesir"} + EH{"Sahara Barat"} + ER{"Eritrea"} + ES{"Spanyol"} + ET{"Ethiopia"} + FI{"Finlandia"} + FJ{"Fiji"} + FK{"Kepulauan Falkland"} + FM{"Mikronesia"} + FO{"Kepulauan Faroe"} + FR{"Perancis"} + GA{"Gabon"} + GB{"Inggris Raya"} + GD{"Grenada"} + GE{"Georgia"} + GF{"Guyana Perancis"} + GH{"Ghana"} + GI{"Gibraltar"} + GL{"Greenland"} + GM{"Gambia"} + GN{"Guinea"} + GP{"Guadeloupe"} + GQ{"Guinea Khatulistiwa"} + GR{"Yunani"} + GS{"Georgia Selatan dan Kepulauan Sandwich Selatan"} + GT{"Guatemala"} + GU{"Guam"} + GW{"Guinea-Bissau"} + GY{"Guyana"} + HK{"Hong Kong S.A.R., Cina"} + HM{"Pulau Heard dan Kepulauan McDonald"} + HN{"Honduras"} + HR{"Kroasia"} + HT{"Haiti"} + HU{"Hungaria"} + ID{"Indonesia"} + IE{"Irlandia"} + IL{"Israel"} + IN{"India"} + IQ{"Iraq"} + IR{"Iran"} + IS{"Islandia"} + IT{"Itali"} + JM{"Jamaika"} + JO{"Yordania"} + JP{"Jepang"} + KE{"Kenya"} + KG{"Kyrgyzstan"} + KH{"Kamboja"} + KI{"Kiribati"} + KM{"Komoros"} + KN{"Saint Kitts dan Nevis"} + KP{"Korea Utara"} + KR{"Korea Selatan"} + KW{"Kuwait"} + KY{"Kepulauan Kayman"} + KZ{"Kazakhstan"} + LA{"Laos"} + LB{"Lebanon"} + LC{"Santa Lusia"} + LI{"Liechtenstein"} + LK{"Sri Lanka"} + LR{"Liberia"} + LS{"Lesotho"} + LT{"Lithuania"} + LU{"Luxembourg"} + LV{"Latvia"} + LY{"Libya"} + MA{"Maroko"} + MC{"Monaco"} + MD{"Moldova"} + MG{"Madagaskar"} + MH{"Kepulauan Marshall"} + MK{"Macedonia"} + ML{"Mali"} + MM{"Myanmar"} + MN{"Mongolia"} + MO{"Makao S.A.R. Cina"} + MP{"Kepualuan Mariana Utara"} + MQ{"Martinique"} + MR{"Mauritania"} + MS{"Montserrat"} + MT{"Malta"} + MU{"Mauritius"} + MV{"Maldives"} + MW{"Malawi"} + MX{"Mexico"} + MY{"Malaysia"} + MZ{"Mozambique"} + NA{"Namibia"} + NC{"Kaledonia Baru"} + NE{"Niger"} + NF{"Kepulauan Norfolk"} + NG{"Nigeria"} + NI{"Nicaragua"} + NL{"Netherlands"} + NO{"Norwegia"} + NP{"Nepal"} + NR{"Nauru"} + NU{"Niue"} + NZ{"Selandia Baru"} + OM{"Oman"} + PA{"Panama"} + PE{"Peru"} + PF{"Polynesia Perancis"} + PG{"Papua Nugini"} + PH{"Filipina"} + PK{"Pakistan"} + PL{"Polandia"} + PM{"Saint Pierre dan Miquelon"} + PN{"Pitcairn"} + PR{"Puerto Riko"} + PS{"Otoritas Palestina"} + PT{"Portugis"} + PW{"Palau"} + PY{"Paraguay"} + QA{"Qatar"} + RE{"Réunion"} + RO{"Romania"} + RU{"Rusia"} + RW{"Rwanda"} + SA{"Arab Saudi"} + SB{"Kepulauan Solomon"} + SC{"Seychelles"} + SD{"Sudan"} + SE{"Sweden"} + SG{"Singapura"} + SH{"Saint Helena"} + SI{"Slovenia"} + SJ{"Svalbard dan Jan Mayen"} + SK{"Slovakia"} + SL{"Sierra Leone"} + SM{"San Marino"} + SN{"Senegal"} + SO{"Somalia"} + SP{"Serbia"} + SR{"Suriname"} + ST{"Sao Tome dan Principe"} + SV{"El Salvador"} + SY{"Syria"} + SZ{"Swaziland"} + TD{"Chad"} + TG{"Togo"} + TH{"Thailand"} + TJ{"Tajikistan"} + TK{"Tokelau"} + TM{"Turkmenistan"} + TN{"Tunisia"} + TO{"Tonga"} + TR{"Turkey"} + TT{"Trinidad dan Tobago"} + TV{"Tuvalu"} + TW{"Taiwan"} + TZ{"Tanzania"} + UA{"Ukraina"} + UG{"Uganda"} + US{"Amerika Serikat"} + UY{"Uruguay"} + UZ{"Uzbekistan"} + VA{"Vatikan"} + VC{"Saint Vincent dan Grenadines"} + VE{"Venezuela"} + VG{"Kepulauan British Virgin"} + VI{"Kepulauan U.S. Virgin"} + VN{"Vietnam"} + VU{"Vanuatu"} + WF{"Wallis dan Futuna"} + WS{"Samoa"} + YE{"Yaman"} + YT{"Mayotte"} + YU{"Yugoslavia"} + ZA{"Afrika Selatan"} + ZM{"Zambia"} + ZW{"Zimbabwe"} } - DayNames { - "Minggu", - "Senin", - "Selasa", - "Rabu", - "Kamis", - "Jumat", - "Sabtu", + Currencies{ + IDR{ + "Rp", + "IDR", + } } - MonthAbbreviations { - "Jan", - "Feb", - "Mar", - "Apr", - "Mei", - "Jun", - "Jul", - "August", - "Sep", - "Okt", - "Nov", - "Des", + ExemplarCharacters{"[a-z]"} + Languages{ + aa{"Afar"} + ab{"Abkhaz"} + ace{"Aceh"} + ae{"Avestan"} + af{"Afrikaans"} + afa{"Afro-Asiatik (Lainnya)"} + ak{"Akan"} + akk{"Akkadien"} + alg{"Bahasa Algonquia"} + am{"Amharik"} + ang{"Inggris Kuno (kl.450-1100)"} + apa{"Bahasa-bahasa Apache"} + ar{"Arab"} + arc{"Aram"} + arn{"Araucan"} + art{"Buatan (Lainnya)"} + as{"Assam"} + ast{"Astur"} + ath{"Bahasa-bahasa Athapaska"} + aus{"Bahasa-bahasa Australia"} + av{"Avarik"} + ay{"Aymara"} + az{"Azerbaijan"} + ba{"Bashkir"} + bai{"Bahasa-bahasa Bamileke"} + ban{"Balin"} + bat{"Baltik (Lainnya)"} + be{"Belarusia"} + bg{"Bulgaria"} + bh{"Bihari"} + bi{"Bislama"} + bm{"Bambara"} + bn{"Bengal"} + bo{"Tibet"} + br{"Breton"} + bs{"Bosnia"} + bug{"Bugis"} + ca{"Catalan"} + cai{"India Amerika Tengah (Lainnnya)"} + car{"Karib"} + cau{"Kaukasia (Lainnya)"} + ce{"Chechen"} + cel{"Celtic (Lainnya)"} + ch{"Chamorro"} + chk{"Chuuke"} + co{"Korsika"} + cop{"Koptik"} + cr{"Cree"} + cs{"Ceko"} + cv{"Chuvash"} + cy{"Welsh"} + da{"Denmark"} + de{"Jerman"} + dv{"Divehi"} + dz{"Dzongkha"} + ee{"Ewe"} + egy{"Mesir Kuno"} + el{"Yunani"} + en{"Inggris"} + enm{"Inggris, Abad Pertengahan (1100-1500)"} + eo{"Esperanto"} + es{"Spanyol"} + et{"Estonian"} + eu{"Basque"} + fa{"Persia"} + ff{"Fulah"} + fi{"Finlandia"} + fj{"Fiji"} + fo{"Faro"} + fr{"Perancis"} + frm{"Perancis, Abad Pertengahan (kl.1400-1600)"} + fro{"Perancis Kuno (842-kl.1400)"} + fur{"Friuli"} + fy{"Frisi"} + ga{"Irlandia"} + gd{"Gaelik Skotlandia"} + gem{"Jermanik (Lainnya)"} + gil{"Gilbert"} + gl{"Gallegan"} + gmh{"Jerman, Abad Pertengahan (kl.1050-1500)"} + gn{"Guarani"} + goh{"Jerman Kuno (kl.750-1050)"} + got{"Gothik"} + grc{"Yunani Kuno (sd 1453)"} + gu{"Gujarati"} + gv{"Manx"} + ha{"Hausa"} + haw{"Hawaii"} + he{"Ibrani"} + hi{"Hindi"} + ho{"Hiri Motu"} + hr{"Kroasia"} + hu{"Hungaria"} + hy{"Armenia"} + hz{"Herero"} + ia{"Interlingua"} + id{"Bahasa Indonesia"} + ie{"Interlingue"} + ig{"Igbo"} + ii{"Sichuan Yi"} + ik{"Inupiaq"} + io{"Ido"} + is{"Icelandic"} + it{"Italian"} + ja{"Japanese"} + jpr{"Judeo-Persia"} + jrb{"Judeo-Arab"} + jv{"Jawa"} + ka{"Georgian"} + kg{"Kongo"} + ki{"Kikuyu"} + kj{"Kuanyama"} + kk{"Kazakh"} + kl{"Kalaallisut"} + km{"Khmer"} + kn{"Kannada"} + ko{"Korea"} + kok{"Konkani"} + kos{"Kosrae"} + kr{"Kanuri"} + ks{"Kashmir"} + ku{"Kurdi"} + kv{"Komi"} + kw{"Cornish"} + ky{"Kirghiz"} + la{"Latin"} + lb{"Luxembourg"} + lez{"Lezghia"} + lg{"Ganda"} + li{"Limburg"} + ln{"Lingala"} + lo{"Lao"} + lt{"Lithuania"} + lu{"Luba-Katanga"} + lv{"Latvian"} + mad{"Madura"} + mak{"Makassar"} + map{"Austronesia"} + mg{"Malagasi"} + mga{"Irlandia Abad Pertengahan (900-1200)"} + mh{"Marshall"} + mi{"Maori"} + mis{"Bahasa Lain-lain"} + mk{"Macedonian"} + mkh{"Mon-Khmer (Lainnya)"} + ml{"Malayalam"} + mn{"Mongolian"} + mo{"Moldavian"} + mr{"Marathi"} + ms{"Malay"} + mt{"Maltese"} + my{"Burma"} + na{"Nauru"} + nb{"Norwegian Bokmål"} + ne{"Nepal"} + ng{"Ndonga"} + nl{"Belanda"} + nn{"Norwegian Nynorsk"} + no{"Norwegian"} + nv{"Navajo"} + ny{"Nyanja; Chichewa; Chewa"} + oj{"Ojibwa"} + om{"Oromo"} + or{"Oriya"} + os{"Ossetic"} + pa{"Punjabi"} + paa{"Papuan (Lainnya)"} + peo{"Persia Kuno (kl.600-400 SM.)"} + phi{"Filipina (Lainnya)"} + pi{"Pali"} + pl{"Polish"} + ps{"Pashto (Pushto)"} + pt{"Portugis"} + qu{"Quechua"} + rm{"Rhaeto-Romance"} + rn{"Rundi"} + ro{"Romanian"} + ru{"Russian"} + rw{"Kinyarwanda"} + sa{"Sanskrit"} + sc{"Sardinian"} + sd{"Sindhi"} + se{"Northern Sami"} + sg{"Sango"} + sh{"Serbo-Croatian"} + si{"Sinhalese"} + sk{"Slovak"} + sl{"Slovenian"} + sm{"Samoan"} + sn{"Shona"} + so{"Somali"} + sq{"Albanian"} + sr{"Serbian"} + ss{"Swati"} + su{"Sundan"} + sux{"Sumeria"} + sv{"Swedia"} + sw{"Swahili"} + syr{"Syria"} + ta{"Tamil"} + te{"Telugu"} + tg{"Tajik"} + th{"Thai"} + ti{"Tigrinya"} + tk{"Turkmen"} + tl{"Tagalog"} + tn{"Tswana"} + tr{"Turkish"} + ts{"Tsonga"} + tt{"Tatar"} + tw{"Twi"} + ty{"Tahitian"} + ug{"Uighur"} + uk{"Ukrainian"} + ur{"Urdu"} + uz{"Uzbek"} + ve{"Venda"} + vi{"Vietnamese"} + vo{"Volapük"} + wa{"Walloon"} + wo{"Wolof"} + xh{"Xhosa"} + yi{"Yiddish"} + yo{"Yoruba"} + za{"Zhuang"} + zh{"Cina"} + zu{"Zulu"} } - MonthNames { - "Januari", - "Februari", - "Maret", - "April", - "Mei", - "Juni", - "Juli", - "Agustus", - "September", - "Oktober", - "November", - "Desember", + LocaleScript{ + "Latn", } - NumberElements { + NumberElements{ ",", ".", ";", @@ -62,32 +495,78 @@ id { "#", "-", "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", + "‰", + "∞", + "�", + "+", } - NumberPatterns { + NumberPatterns{ "#,##0.###;-#,##0.###", - "\u00a4#,##0.00;-\u00a4#,##0.00", + "¤#,##0.00;-¤#,##0.00", "#,##0%", "#E0", } - LocaleID:int { 0x21 } -// LocaleScript{ -// "Latn", // ISO 15924 Name -// } - // /**************** Info Below is needed ****************/ - // CollationElements{} - // Countries{} - // Eras{} - // Languages{} - // ShortLanguage { } - // localPatternChars{} - // - - // Currency display names - Currencies { - IDR { "Rp", "IDR" } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + dayNames{ + format{ + abbreviated{ + "Min", + "Sen", + "Sel", + "Rab", + "Kam", + "Jum", + "Sab", + } + wide{ + "Minggu", + "Senin", + "Selasa", + "Rabu", + "Kamis", + "Jumat", + "Sabtu", + } + } + } + monthNames{ + format{ + abbreviated{ + "Jan", + "Feb", + "Mar", + "Apr", + "Mei", + "Jun", + "Jul", + "Agu", + "Sep", + "Okt", + "Nov", + "Des", + } + wide{ + "Januari", + "Februari", + "Maret", + "April", + "Mei", + "Juni", + "Juli", + "Agustus", + "September", + "Oktober", + "November", + "Desember", + } + } + } + } } } diff --git a/icuSources/data/locales/id_ID.txt b/icuSources/data/locales/id_ID.txt index 776e4d7a..68a270f8 100644 --- a/icuSources/data/locales/id_ID.txt +++ b/icuSources/data/locales/id_ID.txt @@ -1,22 +1,26 @@ -// ******************************************************************************* +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/id_ID.xml // * -// ******************************************************************************* - -id_ID { - Version { "2.0" } - DateTimePatterns { - "H:mm:ss", - "H:mm:ss", - "H:mm:ss", - "H:mm", - "EEEE dd MMMM yyyy", - "dd MMMM yyyy", - "dd MMM yy", - "dd/MM/yy", - "{1} {0}", +// *************************************************************************** +id_ID{ + Version{"1.2"} + calendar{ + gregorian{ + DateTimePatterns{ + "H:mm:ss", + "H:mm:ss", + "H:mm:ss", + "H:mm", + "EEEE dd MMMM yyyy", + "dd MMMM yyyy", + "dd MMM yy", + "dd/MM/yy", + "{1} {0}", + } + } } - LocaleID:int { 0x0421 } } diff --git a/icuSources/data/locales/in.txt b/icuSources/data/locales/in.txt new file mode 100644 index 00000000..8a0d1d50 --- /dev/null +++ b/icuSources/data/locales/in.txt @@ -0,0 +1,11 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +in{ + "%%ALIAS"{"id"} +} diff --git a/icuSources/data/locales/in_ID.txt b/icuSources/data/locales/in_ID.txt new file mode 100644 index 00000000..bfa30ab1 --- /dev/null +++ b/icuSources/data/locales/in_ID.txt @@ -0,0 +1,11 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml +// * +// *************************************************************************** +in_ID{ + "%%ALIAS"{"id_ID"} +} diff --git a/icuSources/data/locales/is.txt b/icuSources/data/locales/is.txt index 9928abe8..c5a58bfe 100644 --- a/icuSources/data/locales/is.txt +++ b/icuSources/data/locales/is.txt @@ -1,85 +1,1654 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2005 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/is.xml // * // *************************************************************************** - -is { - Version{ "2.0" } - CollationElements { - Version { "1.0" } - Sequence { "@& A < a\u0301<<< A\u0301 & D < \u00F0<<< \u00D0& E < e\u0301" - "<<< E\u0301 & I < i\u0301<<< I\u0301 & O < o\u0301<<< O\u0301 & U < u\u0301<<< U\u0301 " - "& Y < y\u0301<<< Y\u0301 & Z < \u00fe<<< \u00DE < \u00E6<<< \u00C6< o\u0308<<< O\u0308" - " << \u00F8<<< \u00D8" } - } - Countries { - IS { "\u00CDsland" } - } - DateTimePatterns { - "HH:mm:ss z", - "HH:mm:ss z", - "HH:mm:ss", - "HH:mm", - "EEEE, d. MMMM yyyy", - "d. MMMM yyyy", - "d.M.yyyy", - "d.M.yyyy", - "{1} {0}", - } - DayAbbreviations { - "sun", - "m\u00E1n", - "\u00FEri", - "mi\u00F0", - "fim", - "f\u00F6s", - "lau", +/** + * ICU source: ../../../locale/icu/main/is.xml + */ +is{ + Countries{ + AD{"Andorra"} + AE{"Sameinuðu arabísku furstadæmin"} + AF{"Afganistan"} + AG{"Antígva og Barbúda"} + AI{"Angvilla"} + AL{"Albanía"} + AM{"Armenía"} + AN{"Hollensku Antillur"} + AO{"Angóla"} + AQ{"Suðurskautslandið"} + AR{"Argentína"} + AS{"Bandaríska Samóa"} + AT{"Austurríki"} + AU{"Ástralía"} + AW{"Arúba"} + AZ{"Aserbaídsjan"} + BA{"Bosnía og Hersegóvína"} + BB{"Barbados"} + BD{"Bangladess"} + BE{"Belgía"} + BF{"Búrkína Fasó"} + BG{"Búlgaría"} + BH{"Barein"} + BI{"Búrúndí"} + BJ{"Benín"} + BM{"Bermúdaeyjar"} + BN{"Brúnei"} + BO{"Bólivía"} + BR{"Brasilía"} + BS{"Bahamaeyjar"} + BT{"Bútan"} + BV{"Bouveteyja"} + BW{"Botsvana"} + BY{"Hvíta-Rússland"} + BZ{"Belís"} + CA{"Kanada"} + CC{"Kókoseyjar"} + CD{"Austur-Kongó"} + CF{"Mið-Afríkulýðveldið"} + CG{"Vestur-Kongó"} + CH{"Sviss"} + CI{"Fílabeinsströndin"} + CK{"Cookseyjar"} + CM{"Kamerún"} + CN{"Kína"} + CO{"Kólumbía"} + CR{"Kostaríka"} + CU{"Kúba"} + CV{"Grænhöfðaeyjar"} + CX{"Jólaey"} + CY{"Kýpur"} + CZ{"Tékkland"} + DE{"Þýskaland"} + DJ{"Djíbútí"} + DK{"Danmörk"} + DM{"Dóminíka"} + DO{"Dóminíska lýðveldið"} + DZ{"Alsír"} + EC{"Ekvador"} + EE{"Eistland"} + EG{"Egyptaland"} + EH{"Vestur-Sahara"} + ER{"Erítrea"} + ES{"Spánn"} + ET{"Eþíópía"} + FI{"Finnland"} + FJ{"Fídjieyjar"} + FK{"Falklandseyjar"} + FM{"Mikrónesía"} + FO{"Færeyjar"} + FR{"Frakkland"} + GA{"Gabon"} + GB{"Bretland"} + GD{"Grenada"} + GE{"Georgía"} + GF{"Franska Gvæjana"} + GH{"Gana"} + GI{"Gíbraltar"} + GL{"Grænland"} + GM{"Gambía"} + GN{"Gínea"} + GP{"Gvadelúpeyjar"} + GQ{"Miðbaugs-Gínea"} + GR{"Grikkland"} + GS{"Suður-Georgía og Suður-Sandvíkureyjar"} + GT{"Gvatemala"} + GU{"Gvam"} + GW{"Gínea-Bissá"} + GY{"Gvæjana"} + HK{"Hong Kong"} + HM{"Heard og McDonaldseyjar"} + HN{"Hondúras"} + HR{"Króatía"} + HT{"Haítí"} + HU{"Ungverjaland"} + ID{"Indónesía"} + IE{"Írland"} + IL{"Ísrael"} + IN{"Indland"} + IO{"Bresku Indlandshafseyjar"} + IQ{"Írak"} + IR{"Íran"} + IS{"Ísland"} + IT{"Ítalía"} + JM{"Jamaíka"} + JO{"Jórdanía"} + JP{"Japan"} + KE{"Kenía"} + KG{"Kirgisistan"} + KH{"Kambódía"} + KI{"Kíribatí"} + KM{"Kómoreyjar"} + KN{"Sankti Kristófer og Nevis"} + KP{"Norður-Kórea"} + KR{"Suður-Kórea"} + KW{"Kúveit"} + KY{"Caymaneyjar"} + KZ{"Kasakstan"} + LA{"Laos"} + LB{"Líbanon"} + LC{"Sankti Lúsía"} + LI{"Liechtenstein"} + LK{"Srí Lanka"} + LR{"Líbería"} + LS{"Lesótó"} + LT{"Litháen"} + LU{"Lúxemborg"} + LV{"Lettland"} + LY{"Líbía"} + MA{"Marokkó"} + MC{"Mónakó"} + MD{"Moldóva"} + MG{"Madagaskar"} + MH{"Marshalleyjar"} + MK{"Makedónía"} + ML{"Malí"} + MM{"Mjanmar"} + MN{"Mongólía"} + MO{"Makaó"} + MP{"Norður-Maríanaeyjar"} + MQ{"Martiník"} + MR{"Máritanía"} + MS{"Montserrat"} + MT{"Malta"} + MU{"Máritíus"} + MV{"Maldíveyjar"} + MW{"Malaví"} + MX{"Mexíkó"} + MY{"Malasía"} + MZ{"Mósambík"} + NA{"Namibía"} + NC{"Nýja-Kaledónía"} + NE{"Níger"} + NF{"Norfolkeyja"} + NG{"Nígería"} + NI{"Níkaragva"} + NL{"Niðurlönd"} + NO{"Noregur"} + NP{"Nepal"} + NR{"Nárú"} + NU{"Niue"} + NZ{"Nýja-Sjáland"} + OM{"Óman"} + PE{"Perú"} + PF{"Franska Pólýnesía"} + PG{"Papúa Nýja-Gínea"} + PH{"Filippseyjar"} + PK{"Pakistan"} + PL{"Pólland"} + PM{"Sankti Pierre og Miquelon"} + PN{"Pitcairn"} + PR{"Púertó Ríkó"} + PS{"Palestína"} + PT{"Portúgal"} + PW{"Palá"} + PY{"Paragvæ"} + QA{"Katar"} + RE{"Réunion"} + RO{"Rúmenía"} + RU{"Rússland"} + RW{"Rúanda"} + SA{"Sádi-Arabía"} + SB{"Salómonseyjar"} + SC{"Seychelleseyjar"} + SD{"Súdan"} + SE{"Svíþjóð"} + SG{"Singapúr"} + SH{"Sankti Helena"} + SI{"Slóvenía"} + SJ{"Svalbarði og Jan Mayen"} + SK{"Slóvakía"} + SL{"Síerra Leóne"} + SM{"San Marínó"} + SN{"Senegal"} + SO{"Sómalía"} + SP{"Serbía"} + SR{"Súrínam"} + ST{"Saó Tóme og Prinsípe"} + SV{"El Salvador"} + SY{"Sýrland"} + SZ{"Svasíland"} + TC{"Turks- og Caicoseyjar"} + TD{"Tsjad"} + TF{"Frönsku suðlægu landsvæðin"} + TG{"Tógó"} + TH{"Taíland"} + TJ{"Tadsjikistan"} + TK{"Tókelá"} + TL{"Austur-Tímor"} + TM{"Túrkmenistan"} + TN{"Túnis"} + TO{"Tonga"} + TR{"Tyrkland"} + TT{"Trínidad og Tóbagó"} + TV{"Túvalú"} + TW{"Taívan"} + TZ{"Tansanía"} + UA{"Úkraína"} + UG{"Úganda"} + UM{"Smáeyjar Bandaríkjanna"} + US{"Bandaríkin"} + UY{"Úrúgvæ"} + UZ{"Úsbekistan"} + VA{"Páfagarður"} + VC{"Sankti Vinsent og Grenadíneyjar"} + VE{"Venesúela"} + VG{"Jómfrúaeyjar (bresku)"} + VI{"Jómfrúaeyjar (bandarísku)"} + VN{"Víetnam"} + VU{"Vanúatú"} + WF{"Wallis- og Fútúnaeyjar"} + WS{"Samóa"} + YE{"Jemen"} + YT{"Mayotte"} + YU{"Júgóslavía"} + ZA{"Suður-Afríka"} + ZM{"Sambía"} } - DayNames { - "sunnudagur", - "m\u00E1nudagur", - "\u00FEri\u00F0judagur", - "mi\u00F0vikudagur", - "fimmtudagur", - "f\u00F6studagur", - "laugardagur", + Currencies{ + ADD{ + "ADD", + "Andorrskur denari", + } + ADP{ + "ADP", + "Andorrskur peseti", + } + AED{ + "AED", + "Arabískt dírham", + } + ALK{ + "ALK", + "Lek (1946-1961)", + } + ALL{ + "lek", + "Lek", + } + ALV{ + "ALV", + "Lek Valute (1992-1993)", + } + ALX{ + "ALX", + "Albanskt gjaldeyrisskírteini í Bandaríkjadölum", + } + AMD{ + "dram", + "Dramm", + } + ANG{ + "NA f.", + "Hollenskt Antillugyllini", + } + AOS{ + "AOS", + "Angólskur skúti", + } + ARA{ + "ARA", + "Argentine Austral", + } + ARM{ + "ARM", + "Argentískur pesi (1899-1970)", + } + ARP{ + "ARP", + "Argentískur pesi (1983-1985)", + } + ARS{ + "Arg$", + "Argentískur pesi", + } + ATS{ + "ATS", + "Austurrískur skildingur", + } + AUD{ + "$A", + "Ástralskur dalur", + } + AUP{ + "AUP", + "Ástralskt pund", + } + BBD{ + "BDS$", + "Barbadoskur dalur", + } + BEF{ + "BF", + "Belgískur franki", + } + BGL{ + "lev", + "Lef", + } + BGM{ + "BGM", + "Lef (1952-1962)", + } + BGN{ + "BGN", + "Lef, nýtt", + } + BGO{ + "BGO", + "Lef (1879-1952)", + } + BGX{ + "BGX", + "Búlgarskt gjaldeyrisskírteini í lef", + } + BMD{ + "Ber$", + "Bermúdeyskur dalur", + } + BMP{ + "BMP", + "Bermúdeyskt pund", + } + BND{ + "BND", + "Brúneiskur dalur", + } + BOP{ + "BOP", + "Bólivískur pesi", + } + BOV{ + "BOV", + "Bolivian Mvdol", + } + BRL{ + "R$", + "Brasilískt ríal", + } + BSD{ + "BSD", + "Bahameyskur dalur", + } + BSP{ + "BSP", + "Bahameyskt pund", + } + BUK{ + "BUK", + "Búrmverskt kjat", + } + BZD{ + "BZ$", + "Belískur dalur", + } + BZH{ + "BZH", + "Hondúrskur dalur", + } + CAD{ + "Can$", + "Kanadískur dalur", + } + CFF{ + "CFF", + "Miðafrískur franki", + } + CHF{ + "SwF", + "Svissneskur franki", + } + CKD{ + "CKD", + "Cookseyskur dalur", + } + CLE{ + "CLE", + "Chileskur skúti", + } + CLF{ + "CLF", + "Chilean Unidades de Fomento", + } + CLP{ + "Ch$", + "Chileskur pesi", + } + CMF{ + "CMF", + "Miðafrískur franki, Kamerún", + } + CNX{ + "CNX", + "Kínverskt gjaldeyrisskírteini í Bandaríkjadölum", + } + CNY{ + "Y", + "Júan", + } + COB{ + "COB", + "Kólumbískur pappírspesi", + } + COF{ + "COF", + "Miðafrískur franki, Kongó", + } + COP{ + "Col$", + "Kólumbískur pesi", + } + CSC{ + "CSC", + "Tékknesk króna (1945-1953)", + } + CSK{ + "CSK", + "Tékknesk króna, eldri", + } + CUP{ + "CUP", + "Kúbverskur pesi", + } + CUX{ + "CUX", + "Kúbverskt gjaldeyrisskírteini", + } + CVE{ + "CVEsc", + "Grænhöfðeyskur skúti", + } + CYP{ + "£C", + "Kýpverskt pund", + } + CZK{ + "CZK", + "Tékknesk króna", + } + DDM{ + "DDM", + "Austurþýskt mark", + } + DEM{ + "DEM", + "Þýskt mark", + } + DES{ + "DES", + "German Sperrmark", + } + DJF{ + "DF", + "Djibouti Franc", + } + DKK{ + "DKr", + "Dönsk króna", + } + DOP{ + "RD$", + "Dóminískur pesi", + } + ECS{ + "ECS", + "Ecuador Sucre", + } + EEK{ + "EEK", + "Eistnesk króna", + } + EGP{ + "EGP", + "Egypskt pund", + } + ESP{ + "ESP", + "Spænskur peseti", + } + ETD{ + "ETD", + "Eþíópískur dalur", + } + EUR{ + "€", + "Euro", + } + FIM{ + "FIM", + "Finnskt mark", + } + FJD{ + "F$", + "Fídjeyskur dalur", + } + FJP{ + "FJP", + "Fídjeyskt pund", + } + FKP{ + "FKP", + "Falklenskt pund", + } + FOK{ + "FOK", + "Færeysk króna", + } + FRF{ + "FRF", + "Franskur franki", + } + GAF{ + "GAF", + "Miðafrískur franki, Gabon", + } + GBP{ + "£", + "Sterlingspund", + } + GHP{ + "GHP", + "Ganverskt pund", + } + GIP{ + "GIP", + "Gíbraltarspund", + } + GLK{ + "GLK", + "Grænlensk króna", + } + GMP{ + "GMP", + "Gambískt pund", + } + GNF{ + "GF", + "Gíneufranki", + } + GNI{ + "GNI", + "Gíneufranki (1960-1972)", + } + GRD{ + "GRD", + "Drakma", + } + GRN{ + "GRN", + "Drakma, Ný", + } + GTQ{ + "Q", + "Guatemala Quetzal", + } + GWE{ + "GWE", + "Portúgalskur, gíneskur skúti", + } + GWM{ + "GWM", + "Portuguese Guinea Mil Reis", + } + GYD{ + "G$", + "Gvæjanskur dalur", + } + HKD{ + "HK$", + "Hong Kong-dalur", + } + HNL{ + "L", + "Hoduras Lempira", + } + HRK{ + "HRK", + "Kúna", + } + HUF{ + "Ft", + "Fórinta", + } + IBP{ + "IBP", + "Norðurírskt pund", + } + IDR{ + "Rp", + "Indónesísk rúpía", + } + IEP{ + "IR£", + "Írskt pund", + } + ILL{ + "ILL", + "Israeli Sheqel", + } + ILP{ + "ILP", + "Ísraelskt pund", + } + ILS{ + "ILS", + "Sikill", + } + INR{ + "INR", + "Indversk rúpía", + } + IQD{ + "ID", + "Írakskur denari", + } + IRR{ + "RI", + "Íranskt ríal", + } + ISK{ + "kr.", + "Íslensk króna", + } + ITL{ + "₤", + "Ítölsk líra", + } + JEP{ + "JEP", + "Jerseyskt pund", + } + JMD{ + "J$", + "Jamaískur dalur", + } + JMP{ + "JMP", + "Jamaískt pund", + } + JPY{ + "¥", + "Jen", + } + KID{ + "KID", + "Kíribatískur dalur", + } + KMF{ + "CF", + "Kómoreyskur franki", + } + KPP{ + "KPP", + "Norðurkóreskt vonn (1947-1959)", + } + KPW{ + "KPW", + "Norðurkóreskt vonn", + } + KRH{ + "KRH", + "South Korean Hwan", + } + KRO{ + "KRO", + "Suðurkóreskt vonn (1947-1953)", + } + KRW{ + "KRW", + "Suðurkóreskt vonn", + } + KWD{ + "KD", + "Kúveiskur denari", + } + KYD{ + "KYD", + "Caymaneyskur dalur", + } + KZR{ + "KZR", + "Kazakhstan Ruble", + } + KZT{ + "T", + "Kazakhstan Tenge", + } + LBP{ + "LL", + "Líbanskt pund", + } + LKR{ + "SL Re", + "Srílönsk rúpía", + } + LNR{ + "LNR", + "Ceylon Rupee", + } + LRD{ + "LRD", + "Líberískur dalur", + } + LSL{ + "M", + "Lesotho Loti", + } + LTL{ + "LTL", + "Lít", + } + LTT{ + "LTT", + "Lithuanian Talonas", + } + LUF{ + "LUF", + "Lúxemborgarfranki", + } + LVL{ + "LVL", + "Lat", + } + LVR{ + "LVR", + "Lettnesk rúbla", + } + LYD{ + "LD", + "Líbískur denari", + } + LYP{ + "LYP", + "Líbískt pund", + } + MAD{ + "MAD", + "Marokkóskt dírham", + } + MAF{ + "MAF", + "Marokkóskur franki", + } + MGA{ + "MGA", + "Madagascar Ariary", + } + MGF{ + "MGF", + "Madagaskur franki", + } + MHD{ + "MHD", + "Marshalleyskur dalur", + } + MKD{ + "MDen", + "Makedónskur denari", + } + MKN{ + "MKN", + "Makedónskur denari (1992-1993)", + } + MLF{ + "MLF", + "Malískur franki", + } + MMK{ + "MMK", + "Mjanmarskt kjat", + } + MMX{ + "MMX", + "Mjanmarskt gjaldeyrisskírteini í Bandaríkjadölum", + } + MNT{ + "Tug", + "Túríkur", + } + MOP{ + "MOP", + "Macao Pataca", + } + MRO{ + "UM", + "Mauritania Ouguiya", + } + MTL{ + "Lm", + "Meltnesk líra", + } + MTP{ + "MTP", + "Maltneskt pund", + } + MWP{ + "MWP", + "Malavískt pund", + } + MXN{ + "MEX$", + "Mexíkóskur pesi", + } + MXP{ + "MXP", + "Mexíkóskur silfurpesi (1861-1992)", + } + MXV{ + "MXV", + "Mexíkóskur pesi, UDI", + } + MYR{ + "RM", + "Malaysian Ringgit", + } + MZE{ + "MZE", + "Mósambískur skúti", + } + NAD{ + "N$", + "Namibískur dalur", + } + NGN{ + "NGN", + "Nigerian Naira", + } + NGP{ + "NGP", + "Nígerískt pund", + } + NLG{ + "NLG", + "Hollenskt gyllini", + } + NOK{ + "NKr", + "Norsk króna", + } + NZD{ + "$NZ", + "Nýsjálenskur dalur", + } + NZP{ + "NZP", + "Nýsjálenskt pund", + } + OMR{ + "RO", + "Ómanskt ríal", + } + PAB{ + "PAB", + "Balbói", + } + PKR{ + "Pra", + "Pakistönsk rúpía", + } + PLX{ + "PLX", + "Pólskt gjaldeyrisskírteini í Bandaríkjadölum", + } + PLZ{ + "PLZ", + "Slot", + } + PSP{ + "PSP", + "Palestínskt pund", + } + PTE{ + "PTE", + "Portúgalskur skúti", + } + ROL{ + "leu", + "Rúmenskt lei", + } + RUR{ + "RUR", + "Rússnesk rúbla", + } + RWF{ + "RWF", + "Rwandan Franc", + } + SAR{ + "SRl", + "Sádiarabískt ríal", + } + SBD{ + "SI$", + "Salómonseyskur dalur", + } + SCR{ + "SR", + "Seychelles rúpía", + } + SDD{ + "SDD", + "Súdanskur denari", + } + SDP{ + "SDP", + "Súdanskt pund", + } + SEK{ + "SKr", + "Sænsk króna", + } + SGD{ + "S$", + "Singapúrskur dalur", + } + SHP{ + "SHP", + "Helenskt pund", + } + SIT{ + "SIT", + "Slóvenskur dalur", + } + SKK{ + "Sk", + "Slóvakísk króna", + } + SRG{ + "Sf", + "Suriname Guilder", + } + SSP{ + "SSP", + "Skoskt pund", + } + STD{ + "Db", + "Sao Tome and Principe Dobra", + } + STE{ + "STE", + "Saó Tóme og Prinsípe skúti", + } + SUR{ + "SUR", + "Soviet Rouble", + } + SVC{ + "SVC", + "El Salvador Colon", + } + SYP{ + "LS", + "Sýrlenskt pund", + } + TCC{ + "TCC", + "Turk- og Caicoseysk króna", + } + TDF{ + "TDF", + "Miðafrískur franki, Tsjad", + } + THB{ + "THB", + "Bat", + } + TJR{ + "TJR", + "Tadsjiksk rúbla", + } + TJS{ + "TJS", + "Tajikistan Somoni", + } + TMM{ + "TMM", + "Túrkmenskt manat", + } + TOS{ + "TOS", + "Tongverskt sterlingspund", + } + TPE{ + "TPE", + "Tímorskur skúti", + } + TPP{ + "TPP", + "Timor Pataca", + } + TRL{ + "TL", + "Tyrknesk líra", + } + TRY{ + "TRY", + "Ný, tyrknesk líra", + } + TTD{ + "TT$", + "Trínidad og Tóbagó-dalur", + } + TTO{ + "TTO", + "Trínidad og Tóbagó-dalur, eldri", + } + TVD{ + "TVD", + "Túvalúskur dalur", + } + TWD{ + "NT$", + "Taívanskur dalur", + } + TZS{ + "T Sh", + "Tanzanian Shilling", + } + UAH{ + "UAH", + "Hrinja", + } + UAK{ + "UAK", + "Ukrainian Karbovanetz", + } + USD{ + "US$", + "Bandaríkjadalur", + } + USN{ + "USN", + "Bandaríkjadalur (næsta dag)", + } + USS{ + "USS", + "Bandaríkjadalur (sama dag)", + } + VEB{ + "Be", + "Venezuelan Bolivar", + } + VGD{ + "VGD", + "Jómfrúaeyjadalur", + } + VUV{ + "VT", + "Vanuatu Vatu", + } + WSP{ + "WSP", + "Samóskt pund", + } + XAF{ + "XAF", + "Miðafrískur franki, BEAC", + } + XCD{ + "EC$", + "Austur-Karíbahafsdalur", + } + XCF{ + "XCF", + "Miðafrískur franki, nýr", + } + XDR{ + "XDR", + "Sérstök dráttarréttindi", + } + XEF{ + "XEF", + "Miðafrískur franki, BCEAEC", + } + XFO{ + "XFO", + "Franskur gullfranki", + } + XFU{ + "XFU", + "Franskur franki, UIC", + } + XID{ + "XID", + "Íslamskur denari", + } + XMF{ + "XMF", + "Kómoreyskur franki, CFA", + } + XNF{ + "XNF", + "Miðafrískur franki, Antillur", + } + XOF{ + "XOF", + "Miðafrískur franki, BCEAO", + } + XPF{ + "CFPF", + "Pólinesískur franki", + } + YDD{ + "YDD", + "Jemenskur denari", + } + YEI{ + "YEI", + "Jemenskt ríal (1904-1964)", + } + YER{ + "YRl", + "Jemenskt ríal", + } + YUM{ + "YUM", + "Júgóslavneskur denari", + } + ZAL{ + "ZAL", + "Rand (viðskipta)", + } + ZAP{ + "ZAP", + "Suðurafrískt pund", + } + ZMK{ + "ZMK", + "Zambian Kwacha", + } + ZMP{ + "ZMP", + "Sambískt pund", + } + ZWD{ + "Z$", + "Simbabveskur dalur", + } } - Languages { - is { "\u00EDslenska" } + ExemplarCharacters{"[a-záéíóúýöæðþ]"} + Keys{ + calendar{"Dagatal"} + collation{"Röðun"} + currency{"Gjaldmiðill"} } - LocaleID:int { 0x0f } -// LocaleString { "is" } - MonthAbbreviations { - "jan", - "feb", - "mar", - "apr", - "ma\u00ED", - "j\u00FAn", - "j\u00FAl", - "\u00E1g\u00FA", - "sep", - "okt", - "n\u00F3v", - "des", + Languages{ + ab{"Abkasíska"} + ace{"Akkíska"} + ach{"Akólí"} + ada{"Adangme"} + ady{"Adýge"} + ae{"Avestíska"} + af{"Afríkanska"} + afa{"Afróasísk mál (önnur)"} + afh{"Afríhílí"} + ak{"Akan"} + akk{"Akkadíska"} + ale{"Aleúska"} + alg{"Algonkvínsk mál"} + am{"Amharíska"} + an{"Aragonska"} + ang{"Fornenska (um 450-1100)"} + apa{"Apatsjamál"} + ar{"Arabíska"} + arc{"Arameíska"} + arn{"Arákaníska"} + arp{"Arapahó"} + art{"Alþjóðamál (önnur)"} + arw{"Aravakska"} + as{"Assamska"} + ast{"Astúríska"} + ath{"Atapaskísk mál"} + aus{"Áströlsk mál"} + av{"Avaríska"} + awa{"Avadí"} + ay{"Aímara"} + az{"Aserska"} + ba{"Baskír"} + bad{"Banda"} + bai{"Bamílekemál"} + bal{"Balúkí"} + ban{"Balíska"} + bas{"Basa"} + bat{"Baltnesk mál (önnur)"} + be{"Hvítrússneska"} + bej{"Beja"} + bem{"Bemba"} + ber{"Berbamál"} + bg{"Búlgarska"} + bh{"Bíharí"} + bho{"Bojpúrí"} + bi{"Bíslama"} + bik{"Bíkol"} + bin{"Bíní"} + bla{"Siksika"} + bm{"Bambara"} + bn{"Bengalska"} + bnt{"Bantúmál"} + bo{"Tíbeska"} + br{"Bretónska"} + bra{"Braí"} + bs{"Bosníska"} + btk{"Batak"} + bua{"Búríat"} + bug{"Búgíska"} + byn{"Blín"} + ca{"Katalónska"} + cad{"Kaddó"} + cai{"Indíánamál Mið-Ameríku (önnur)"} + car{"Karíbamál"} + cau{"Kákasusmál (önnur)"} + ce{"Tsjetsjenska"} + ceb{"Kebúanó"} + cel{"Keltnesk (önnur)"} + ch{"Kamorró"} + chb{"Síbsja"} + chg{"Sjagataí"} + chk{"Sjúkíska"} + chm{"Marí"} + chn{"Sínúk"} + cho{"Sjoktá"} + chp{"Sípevíska"} + chr{"Sjerókí"} + chy{"Sjeyen"} + cmc{"Kamísk mál"} + co{"Korsíska"} + cop{"Koptíska"} + cpe{"Kreól- og pidginmál á enskum grunni"} + cpf{"Kreól- og pidginmál á frönskum grunni"} + cpp{"Kreól- og pidginmál á portúgölskum grunni"} + cr{"Krí"} + crh{"Krímtyrkneska"} + crp{"Kreól- og pidginmál (önnur)"} + cs{"Tékkneska"} + csb{"Kasúbíska"} + cu{"Kirkjuslavneska"} + cus{"Kúsitísk mál (önnur)"} + cv{"Sjúvas"} + cy{"Velska"} + da{"Danska"} + dak{"Dakóta"} + dar{"Dargva"} + day{"Dajak"} + de{"Þýska"} + del{"Delaver"} + den{"Slav"} + dgr{"Dogríb"} + din{"Dinka"} + doi{"Dogrí"} + dra{"Dravidísk mál (önnur)"} + dsb{"Lágsorbneska"} + dua{"Dúala"} + dum{"Miðhollenska (um 1050-1350)"} + dv{"Dívehí"} + dyu{"Djúla"} + dz{"Dsongka"} + ee{"Eve"} + efi{"Efík"} + egy{"Fornegypska"} + eka{"Ekajúk"} + el{"Nýgríska (1453-)"} + elx{"Elamít"} + en{"Enska"} + enm{"Miðenska (1100-1500)"} + eo{"Esperantó"} + es{"Spænska"} + et{"Eistneska"} + eu{"Baskneska"} + ewo{"Evondó"} + fa{"Persneska"} + fan{"Fang"} + fat{"Fantí"} + ff{"Fúla"} + fi{"Finnska"} + fiu{"Finnskúgrísk mál (önnur)"} + fj{"Fídjeyska"} + fo{"Færeyska"} + fon{"Fón"} + fr{"Franska"} + frm{"Miðfranska (um 1400-1600)"} + fro{"Fornfranska (842 - um 1400)"} + fur{"Fríúlska"} + fy{"Frísneska"} + ga{"Írska"} + gaa{"Ga"} + gay{"Gajó"} + gba{"Gbaja"} + gd{"Skosk gelíska"} + gem{"Germönsk mál (önnur)"} + gez{"Gís"} + gil{"Gilberska"} + gl{"Gallegska"} + gmh{"Miðháþýska (um 1050-1500"} + gn{"Gvaraní"} + goh{"Fornháþýska (um 750-1050)"} + gon{"Gondí"} + gor{"Gorontaló"} + got{"Gotneska"} + grb{"Gerbó"} + grc{"Forngríska (til 1453)"} + gu{"Gújaratí"} + gv{"Manx"} + gwi{"Gvísín"} + ha{"Hása"} + hai{"Haída"} + haw{"Havaíska"} + he{"Hebreska"} + hi{"Hindí"} + hil{"Híligaínon"} + him{"Hímasjalí"} + hit{"Hettitíska"} + hmn{"Hmong"} + ho{"Hírímótú"} + hr{"Króatíska"} + hsb{"Hásorbneska"} + ht{"Haítíska"} + hu{"Ungverska"} + hup{"Húpa"} + hy{"Armenska"} + hz{"Hereró"} + ia{"Interlingva"} + iba{"Íban"} + id{"Indónesíska"} + ie{"Interlingva"} + ig{"Ígbó"} + ii{"Sísúanjí"} + ijo{"Íjó"} + ik{"Ínúpíak"} + ilo{"Ílokó"} + inc{"Indversk mál (önnur)"} + ine{"Indóevrópsk mál (önnur)"} + inh{"Ingús"} + io{"Ídó"} + ira{"Íranska"} + iro{"Írókesk mál"} + is{"Íslenska"} + it{"Ítalska"} + iu{"Inúktitút"} + ja{"Japanska"} + jbo{"Lojban"} + jpr{"Gyðingapersneska"} + jrb{"Gyðingaarabíska"} + jv{"Javanska"} + ka{"Georgíska"} + kaa{"Karakalpak"} + kab{"Kabíle"} + kac{"Kasín"} + kam{"Kamba"} + kar{"Karen"} + kaw{"Kaví"} + kbd{"Kabardíska"} + kg{"Kongó"} + kha{"Kasí"} + khi{"Koímál (önnur)"} + kho{"Kotaska"} + ki{"Kíkújú"} + kj{"Kúanjama"} + kk{"Kasakska"} + kl{"Grænlenska"} + km{"Kmer"} + kmb{"Kimbúndú"} + kn{"Kannada"} + ko{"Kóreska"} + kok{"Konkaní"} + kos{"Kosraska"} + kpe{"Kpelle"} + kr{"Kanúrí"} + krc{"Karasaíbalkar"} + kro{"Krú"} + kru{"Kúrúk"} + ks{"Kasmírska"} + ku{"Kúrdneska"} + kum{"Kúmík"} + kut{"Kútenaí"} + kv{"Komíska"} + kw{"Korníska"} + ky{"Kirgiska"} + la{"Latína"} + lad{"Ladínska"} + lah{"Landa"} + lam{"Lamba"} + lb{"Lúxemborgíska"} + lez{"Lesgíska"} + lg{"Ganda"} + li{"Limbúrgíska"} + ln{"Lingala"} + lo{"Laó"} + lol{"Mongó"} + loz{"Losí"} + lt{"Litháíska"} + lu{"Lúbakatanga"} + lua{"Lúbalúlúa"} + lui{"Lúisenó"} + lun{"Lúnda"} + luo{"Lúó"} + lus{"Lúsaí"} + lv{"Lettneska"} + mad{"Madúrska"} + mag{"Magahí"} + mai{"Maítílí"} + mak{"Makasar"} + man{"Mandingó"} + map{"Ástrónesíska"} + mas{"Masaí"} + mdf{"Moksa"} + mdr{"Mandar"} + men{"Mende"} + mg{"Malagasíska"} + mga{"Miðírska (900-1200)"} + mh{"Marshallska"} + mi{"Maórí"} + mic{"Mikmak"} + min{"Mínangkabá"} + mis{"Ýmis mál"} + mk{"Makedónska"} + mkh{"Monkmermál (önnur)"} + ml{"Malajalam"} + mn{"Mongólska"} + mnc{"Mansjú"} + mni{"Manípúrí"} + mno{"Manóbómál"} + mo{"Moldóvska"} + moh{"Móhíska"} + mos{"Mossí"} + mr{"Maratí"} + ms{"Malaíska"} + mt{"Maltneska"} + mul{"Margvísleg mál"} + mun{"Múndamál"} + mus{"Krík"} + mwr{"Marvarí"} + my{"Burmneska"} + myn{"Majamál"} + myv{"Ersja"} + na{"Nárúska"} + nah{"Nahúatl"} + nai{"Indíánamál Norður-Ameríku (önnur)"} + nap{"Napólíska"} + nb{"Norskt bókmál"} + nd{"Norðurndebele"} + nds{"Lágþýska; Lágsaxneska"} + ne{"Nepalska"} + new{"Nevarí"} + ng{"Ndonga"} + nia{"Nías"} + nic{"Nígerkordófanmál (önnur)"} + niu{"Níveska"} + nl{"Hollenska"} + nn{"Nýnorska"} + no{"Norska"} + nog{"Nógaí"} + non{"Norræna"} + nr{"Suðurndebele"} + nso{"Norðursótó"} + nub{"Núbísk mál"} + nv{"Navahó"} + ny{"Njanja; Sísjeva; Sjeva"} + nym{"Njamvesí"} + nyn{"Njankóle"} + nyo{"Njóró"} + nzi{"Nsíma"} + oc{"Okkitíska (eftir 1500); Próvensalska"} + oj{"Ojibva"} + om{"Órómó"} + or{"Óría"} + os{"Ossetíska"} + osa{"Ósage"} + ota{"Tyrkneska, ottóman (1500-1928)"} + oto{"Ótommál"} + pa{"Púnjabí"} + paa{"Papúsk mál (önnur)"} + pag{"Pangasínmál"} + pal{"Palaví"} + pam{"Pampanga"} + pap{"Papíamentó"} + pau{"Paláska"} + peo{"Fornpersneska"} + phi{"Filippseysk mál (önnur)"} + phn{"Fönikíska"} + pi{"Palí"} + pl{"Pólska"} + pon{"Ponpeiska"} + pra{"Prakrítmál"} + pro{"Fornpróvensalska (til 1500)"} + ps{"Pastú"} + pt{"Portúgalska"} + qu{"Kvesjúa"} + raj{"Rajastaní"} + rap{"Rapanúí"} + rar{"Rarótongska"} + rm{"Retórómanska"} + rn{"Rúndí"} + ro{"Rúmenska"} + roa{"Rómönsk mál (önnur)"} + rom{"Romaní"} + ru{"Rússneska"} + rw{"Kínjarvanda"} + sa{"Sanskrít"} + sad{"Sandave"} + sah{"Jakút"} + sai{"Indíánamál Suður-Ameríku (önnur)"} + sal{"Salísmál"} + sam{"Samversk arameíska"} + sas{"Sasak"} + sat{"Santalí"} + sc{"Sardínska"} + sco{"Skoska"} + sd{"Sindí"} + se{"Norðursamíska"} + sel{"Selkúp"} + sem{"Semísk mál (önnur)"} + sg{"Sangó"} + sga{"Fornírska (til 900)"} + sgn{"Táknmál"} + sh{"Serbókróatíska"} + shn{"Sjan"} + si{"Singalesíska"} + sid{"Sídamó"} + sio{"Síúmál"} + sit{"Sínótíbesk mál (önnur)"} + sk{"Slóvakíska"} + sl{"Slóvenska"} + sla{"Slavnesk mál (önnur)"} + sm{"Samóska"} + sma{"Suðursamíska"} + smi{"Samísk mál (önnur)"} + smj{"Lúlesamíska"} + smn{"Enaresamíska"} + sms{"Skoltesamíska"} + sn{"Sínótíbesk mál (önnur)"} + snk{"Sóninke"} + so{"Sómalska"} + sog{"Sogdíen"} + son{"Songhaí"} + sq{"Albanska"} + sr{"Serbneska"} + srr{"Serer"} + ss{"Svatí"} + ssa{"Nílósaharamál (önnur)"} + st{"Suðursótó"} + su{"Súndanska"} + suk{"Súkúma"} + sus{"Súsú"} + sux{"Súmerska"} + sv{"Sænska"} + sw{"Svahílí"} + syr{"Sýrlenska"} + ta{"Tamílska"} + tai{"Taímál (önnur)"} + te{"Telúgú"} + tem{"Tímne"} + ter{"Terenó"} + tet{"Tetúm"} + tg{"Tadsjikska"} + th{"Taílenska"} + ti{"Tígrinja"} + tig{"Tígre"} + tiv{"Tív"} + tk{"Túrkmenska"} + tkl{"Tókeláska"} + tl{"Tagalog"} + tli{"Tlingit"} + tmh{"Tamasjek"} + tn{"Tsúana"} + to{"Tongverska"} + tog{"Tongverska"} + tpi{"Tokpisin"} + tr{"Tyrkneska"} + ts{"Tsonga"} + tsi{"Tsimsíska"} + tt{"Tatarska"} + tum{"Túmbúka"} + tup{"Túpímál"} + tut{"Altaísk mál (önnur)"} + tvl{"Túvalúska"} + tw{"Tví"} + ty{"Tahítíska"} + tyv{"Túvínska"} + udm{"Údmúrt"} + ug{"Úígúr"} + uga{"Úgarítíska"} + uk{"Úkraínska"} + umb{"Úmbúndú"} + und{"Óljóst"} + ur{"Úrdú"} + uz{"Úsbekska"} + vai{"Vaí"} + ve{"Venda"} + vi{"Víetnamska"} + vo{"Volapük"} + vot{"Votíska"} + wa{"Vallónska"} + wak{"Vakasmál"} + wal{"Valamó"} + war{"Varaí"} + was{"Vasjó"} + wen{"Sorbnesk mál"} + wo{"Volof"} + xal{"Kalmúkska"} + xh{"Sósa"} + yao{"Jaó"} + yap{"Japíska"} + yi{"Jiddíska"} + yo{"Jórúba"} + ypk{"Júpísk mál"} + za{"Súang"} + zap{"Sapótek"} + zen{"Senaga"} + zh{"Kínverska"} + znd{"Sande"} + zu{"Súlú"} + zun{"Súní"} } - MonthNames { - "jan\u00FAar", - "febr\u00FAar", - "mars", - "apr\u00EDl", - "ma\u00ED", - "j\u00FAn\u00ED", - "j\u00FAl\u00ED", - "\u00E1g\u00FAst", - "september", - "okt\u00F3ber", - "n\u00F3vember", - "desember", + LocaleScript{ + "Latn", } - NumberElements { + NumberElements{ ",", ".", ";", @@ -88,28 +1657,120 @@ is { "#", "-", "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", + "‰", + "∞", + "�", + "+", } -// ShortLanguage { "isl" } - zoneStrings { - { - "Africa/Casablanca", - "GMT", - "GMT", - "GMT", - "GMT", + Types{ + calendar{ + buddhist{"Búddískt dagatal"} + chinese{"Kínverskt dagatal"} + gregorian{"Gregorískt dagatal"} + hebrew{"Hebreskt dagatal"} + islamic{"Íslamskt dagatal"} + islamic-civil{"Íslamskt borgaradagatal"} + japanese{"Japanskt dagatal"} + } + collation{ + direct{"Bein röðun"} + phonebook{"Símaskráarröðun"} + pinyin{"Pinyin-röðun"} + stroke{"Strikaröðun"} + traditional{"Hefðbundin"} } } -// LocaleScript{ -// "Latn", // ISO 15924 Name -// } - ExemplarCharacters { "[a-z \u00e1 \u00e9 \u00ed \u00f3 \u00fa \u00fd \u00f6 \u00e6 \u00f0 \u00fe]" } - - // Currency display names - Currencies { - ISK { "kr.", "ISK" } + Version{"1.2"} + calendar{ + gregorian{ + DateTimePatterns{ + "HH:mm:ss z", + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm", + "EEEE, d. MMMM yyyy", + "d. MMMM yyyy", + "d.M.yyyy", + "d.M.yyyy", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "sun", + "mán", + "þri", + "mið", + "fim", + "fös", + "lau", + } + narrow{ + "s", + "m", + "þ", + "m", + "f", + "f", + "l", + } + wide{ + "sunnudagur", + "mánudagur", + "þriðjudagur", + "miðvikudagur", + "fimmtudagur", + "föstudagur", + "laugardagur", + } + } + } + monthNames{ + format{ + abbreviated{ + "jan", + "feb", + "mar", + "apr", + "maí", + "jún", + "júl", + "ágú", + "sep", + "okt", + "nóv", + "des", + } + narrow{ + "j", + "f", + "m", + "a", + "m", + "j", + "j", + "á", + "s", + "o", + "n", + "d", + } + wide{ + "janúar", + "febrúar", + "mars", + "apríl", + "maí", + "júní", + "júlí", + "ágúst", + "september", + "október", + "nóvember", + "desember", + } + } + } + } } } diff --git a/icuSources/data/locales/is_IS.txt b/icuSources/data/locales/is_IS.txt index 036effa2..696b2dec 100644 --- a/icuSources/data/locales/is_IS.txt +++ b/icuSources/data/locales/is_IS.txt @@ -1,19 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/is_IS.xml // * // *************************************************************************** - -is_IS { - Version{ "2.0" } -// LocaleString { "is_IS" } - NumberPatterns { +is_IS{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "#,##0.00 \u00A4;-#,##0.00 \u00A4", + "#,##0.00 ¤;-#,##0.00 ¤", "#,##0%", "#E0", } -// ShortCountry { "ISL" } - LocaleID:int { 0x040f } + Version{"1.2"} } diff --git a/icuSources/data/locales/it.txt b/icuSources/data/locales/it.txt index dd6dcc8a..67236381 100644 --- a/icuSources/data/locales/it.txt +++ b/icuSources/data/locales/it.txt @@ -1,423 +1,2251 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/it.xml // * // *************************************************************************** - -it { - Version{ "2.0" } - - "%%TRADITIONAL" { "Tradizionale" } - - "%%REVISED" { "Modificato" } - - Countries { - //AD { "Andorra" } - AE { "Emirati Arabi Uniti" } - //AF { "Afghanistan" } - AG { "Antigua e Barbuda" } - //AI { "Anguilla" } - //AL { "Albania" } - //AM { "Armenia" } - AN { "Antille Olandesi" } - //AO { "Angola" } - AQ { "Antartico" } - //AR { "Argentina" } - AS { "Samoa Americane" } - //AT { "Austria" } - //AU { "Australia" } - //AW { "Aruba" } - //AZ { "Azerbaijan" } - - BA { "Bosnia Erzegovina" } - //BB { "Barbados" } - //BD { "Bangladesh" } - BE { "Belgio" } - //BF { "Burkina Faso" } - //BG { "Bulgaria" } - //BH { "Bahrain" } - //BI { "Burundi" } - //BJ { "Benin" } - //BM { "Bermuda" } - //BN { "Brunei" } - //BO { "Bolivia" } - BR { "Brasile" } - //BS { "Bahamas" } - //BT { "Bhutan" } - BV { "Isola Bouvet" } - //BW { "Botswana" } - BY { "Bielorussia" } - //BZ { "Belize" } - - //CA { "Canada" } - CC { "Isole Cocos (Keeling)" } - CD { "Repubblica Democratica del Congo" } - CF { "Repubblica Centrafricana" } - //CG { "Congo" } - CH { "Svizzera" } - CI { "Costa d'Avorio" } - CK { "Isole Cook" } - CL { "Cile" } - CM { "Camerun" } - CN { "Cina" } - //CO { "Colombia" } - //CR { "Costa Rica" } - CV { "Capo Verde" } - CX { "Isola di Natale" } - CY { "Cipro" } - CZ { "Repubblica Ceca" } - - DE { "Germania" } - DJ { "Gibuti" } - DK { "Danimarca" } - DM { "Dominica" } - DO { "Repubblica Dominicana" } - //DZ { "Algeria" } - - //EC { "Ecuador" } - //EE { "Estonia" } - EG { "Egitto" } - EH { "Sahara Occidentale" } - //ER { "Eritrea" } - ES { "Spagna" } - ET { "Etiopia" } - - FI { "Finlandia" } - //FJ { "Fiji" } - FK { "Isole Falkland" } - //FM { "Micronesia" } - FO { "Isole Faroe" } - FR { "Francia" } - - //GA { "Gabon" } - GB { "Regno Unito" } - //GD { "Grenada" } - //GE { "Georgia" } - GF { "Guiana Francese" } - //GH { "Ghana" } - GI { "Gibilterra" } - GL { "Groenlandia" } - //GM { "Gambia" } - //GN { "Guinea" } - GP { "Guadalupa" } - GQ { "Guinea Equatoriale" } - GR { "Grecia" } - GS { "Sud Georgia e Isole Sandwich del Sud" } - //GT { "Guatemala" } - //GU { "Guam" } - //GW { "Guinea-Bissau" } - //GY { "Guyana" } - - HK { "Hong Kong (Cina)" } - HM { "Isole Heard ed Isole McDonald" } - //HN { "Honduras" } - HR { "Croazia" } - //HT { "Haiti" } - HU { "Ungheria" } - - //ID { "Indonesia" } - IE { "Irlanda" } - IL { "Israele" } - //IN { "India" } - //IQ { "Iraq" } - //IR { "Iran" } - IO { "Territori Britannici dell'Oceano Indiano" } - IS { "Islanda" } - IT { "Italia" } - - JM { "Giamaica" } - JO { "Giordania" } - JP { "Giappone" } - - //KE { "Kenya" } - KG { "Kirghizistan" } - KH { "Cambogia" } - //KI { "Kiribati" } - KM { "Comore" } - KN { "Saint Kitts e Nevis" } - KR { "Corea, Repubblica" } - //KW { "Kuwait" } - KY { "Isole Cayman" } - KZ { "Kazakistan" } - - //LA { "Laos" } - LB { "Libano" } - //LC { "Santa Lucia" } - //LI { "Liechtenstein" } - //LK { "Sri Lanka" } - //LR { "Liberia" } - //LS { "Lesotho" } - LT { "Lituania" } - LU { "Lussemburgo" } - LV { "Lettonia" } - - MA { "Marocco" } - //MC { "Monaco" } - MD { "Moldavia" } - //MG { "Madagascar" } - MH { "Isole Marshall" } - MK { "Macedonia, Repubblica" } - //ML { "Mali" } - //MM { "Myanmar" } - //MN { "Mongolia" } - MO { "Macao (Cina)" } - MP { "Marianne Settentrionali" } - MQ { "Martinica" } - //MR { "Mauritania" } - //MS { "Montserrat" } - //MT { "Malta" } - //MU { "Mauritius" } - MV { "Maldive" } - //MW { "Malawi" } - MX { "Messico" } - MY { "Malesia" } - MZ { "Mozambico" } - - //NA { "Namibia" } - NC { "Nuova Caledonia" } - //NE { "Niger" } - NF { "Isola Norfolk" } - //NG { "Nigeria" } - //NI { "Nicaragua" } - NL { "Olanda" } - NO { "Norvegia" } - //NP { "Nepal" } - //NR { "Nauru" } - //NU { "Niue" } - NZ { "Nuova Zelanda" } - - //OM { "Oman" } - - //PA { "Panama" } - //PE { "Peru" } - PF { "Polinesia Francese" } - PG { "Papua Nuova Guinea" } - PH { "Filippine" } - //PK { "Pakistan" } - PL { "Polonia" } - PM { "Saint Pierre e Miquelon" } - //PN { "Pitcairn" } - PR { "Portorico" } - PS { "Palestina" } - PT { "Portogallo" } - //PW { "Palau" } - //PY { "Paraguay" } - - //QA { "Qatar" } - - RE { "Reunion" } - //RO { "Romania" } - RU { "Federazione Russa" } - RW { "Ruanda" } - - SA { "Arabia Saudita" } - SB { "Isole Solomon" } - //SC { "Seychelles" } - //SD { "Sudan" } - SE { "Svezia" } - //SG { "Singapore" } - //SH { "Saint Helena" } - //SI { "Slovenia" } - SJ { "Svalbard e Jan Mayen" } - SK { "Slovacchia" } - //SL { "Sierra Leone" } - //SM { "San Marino" } - //SN { "Senegal" } - //SO { "Somalia" } - //SR { "Suriname" } - ST { "Sao Tome e Principe" } - //SV { "El Salvador" } - SY { "Siria" } - //SZ { "Swaziland" } - - TC { "Isole Turks e Caicos" } - TD { "Ciad" } - TF { "Territori francesi del sud" } - //TG { "Togo" } - TH { "Thailandia" } - //TJ { "Tajikistan" } - //TK { "Tokelau" } - TL { "Timor Est" } - //TM { "Turkmenistan" } - //TN { "Tunisia" } - //TO { "Tonga" } - TR { "Turchia" } - TT { "Trinidad e Tobago" } - //TV { "Tuvalu" } - //TW { "Taiwan" } - //TZ { "Tanzania" } - - UA { "Ucraina" } - //UG { "Uganda" } - UM { "Isole minori Americane" } - US { "Stati Uniti" } - //UY { "Uruguay" } - //UZ { "Uzbekistan" } - - VA { "Vaticano" } - VC { "Saint Vincent e Grenadines" } - //VE { "Venezuela" } - VG { "Isole Vergini Britanniche" } - VI { "Isole Vergini Americane" } - //VN { "Vietnam" } - //VU { "Vanuatu" } - - WF { "Wallis e Futuna" } - //WS { "Samoa" } - - //YE { "Yemen" } - //YT { "Mayotte" } - //YU { "Yugoslavia" } - - ZA { "Sud Africa" } - //ZM { "Zambia" } - //ZW { "Zimbabwe" } - } - DateTimeElements:intvector { - 2, - 4, - } - DateTimePatterns { - "HH:mm:ss z", - "HH:mm:ss z", - "HH:mm:ss", - "HH:mm", - "EEEE d MMMM yyyy", - "dd MMMM yyyy", - "dd/MMM/yy", - "dd/MM/yy", - "{1} {0}", - } - - AmPmMarkers { - "m.", - "p.", +/** + * ICU source: ../../../locale/icu/main/it.xml + */ +it{ + Countries{ + AD{"Andorra"} + AE{"Emirati Arabi Uniti"} + AF{"Afghanistan"} + AG{"Antigua e Barbuda"} + AI{"Anguilla"} + AL{"Albania"} + AM{"Armenia"} + AN{"Antille Olandesi"} + AO{"Angola"} + AQ{"Antartide"} + AR{"Argentina"} + AS{"Samoa Americane"} + AT{"Austria"} + AU{"Australia"} + AW{"Aruba"} + AZ{"Azerbaigian"} + BA{"Bosnia Erzegovina"} + BB{"Barbados"} + BD{"Bangladesh"} + BE{"Belgio"} + BF{"Burkina Faso"} + BG{"Bulgaria"} + BH{"Bahrein"} + BI{"Burundi"} + BJ{"Benin"} + BM{"Bermuda"} + BN{"Brunei"} + BO{"Bolivia"} + BR{"Brasile"} + BS{"Bahamas"} + BT{"Bhutan"} + BV{"Isola Bouvet"} + BW{"Botswana"} + BY{"Bielorussia"} + BZ{"Belize"} + CA{"Canada"} + CC{"Isole Cocos (Keeling)"} + CD{"Repubblica Democratica del Congo"} + CF{"Repubblica Centrafricana"} + CG{"Congo"} + CH{"Svizzera"} + CI{"Costa d’Avorio"} + CK{"Isole Cook"} + CL{"Cile"} + CM{"Camerun"} + CN{"Cina"} + CO{"Colombia"} + CR{"Costa Rica"} + CU{"Cuba"} + CV{"Capo Verde"} + CX{"Isola Christmas"} + CY{"Cipro"} + CZ{"Repubblica Ceca"} + DE{"Germania"} + DJ{"Gibuti"} + DK{"Danimarca"} + DM{"Dominica"} + DO{"Repubblica Dominicana"} + DZ{"Algeria"} + EC{"Ecuador"} + EE{"Estonia"} + EG{"Egitto"} + EH{"Sahara Occidentale"} + ER{"Eritrea"} + ES{"Spagna"} + ET{"Etiopia"} + FI{"Finlandia"} + FJ{"Fiji"} + FK{"Isole Falkland"} + FM{"Micronesia"} + FO{"Isole Faroe"} + FR{"Francia"} + GA{"Gabon"} + GB{"Regno Unito"} + GD{"Grenada"} + GE{"Georgia"} + GF{"Guiana Francese"} + GH{"Ghana"} + GI{"Gibilterra"} + GL{"Groenlandia"} + GM{"Gambia"} + GN{"Guinea"} + GP{"Guadalupa"} + GQ{"Guinea Equatoriale"} + GR{"Grecia"} + GS{"Georgia del Sud e Isole Sandwich del Sud"} + GT{"Guatemala"} + GU{"Guam"} + GW{"Guinea-Bissau"} + GY{"Guyana"} + HK{"Regione Amministrativa Speciale di Hong Kong, Cina"} + HM{"Isole Heard ed Isole McDonald"} + HN{"Honduras"} + HR{"Croazia"} + HT{"Haiti"} + HU{"Ungheria"} + ID{"Indonesia"} + IE{"Irlanda"} + IL{"Israele"} + IN{"India"} + IO{"Territorio Britannico dell’Oceano Indiano"} + IQ{"Iraq"} + IR{"Iran"} + IS{"Islanda"} + IT{"Italia"} + JM{"Giamaica"} + JO{"Giordania"} + JP{"Giappone"} + KE{"Kenya"} + KG{"Kirghizistan"} + KH{"Cambogia"} + KI{"Kiribati"} + KM{"Comore"} + KN{"Saint Kitts e Nevis"} + KP{"Corea del Nord"} + KR{"Corea del Sud"} + KW{"Kuwait"} + KY{"Isole Cayman"} + KZ{"Kazakistan"} + LA{"Laos"} + LB{"Libano"} + LC{"Saint Lucia"} + LI{"Liechtenstein"} + LK{"Sri Lanka"} + LR{"Liberia"} + LS{"Lesotho"} + LT{"Lituania"} + LU{"Lussemburgo"} + LV{"Lettonia"} + LY{"Libia"} + MA{"Marocco"} + MC{"Monaco"} + MD{"Moldavia"} + MG{"Madagascar"} + MH{"Isole Marshall"} + MK{"Macedonia, Repubblica"} + ML{"Mali"} + MM{"Myanmar"} + MN{"Mongolia"} + MO{"Regione Amministrativa Speciale di Macao, Cina"} + MP{"Isole Marianne Settentrionali"} + MQ{"Martinica"} + MR{"Mauritania"} + MS{"Montserrat"} + MT{"Malta"} + MU{"Mauritius"} + MV{"Maldive"} + MW{"Malawi"} + MX{"Messico"} + MY{"Malesia"} + MZ{"Mozambico"} + NA{"Namibia"} + NC{"Nuova Caledonia"} + NE{"Niger"} + NF{"Isola Norfolk"} + NG{"Nigeria"} + NI{"Nicaragua"} + NL{"Paesi Bassi"} + NO{"Norvegia"} + NP{"Nepal"} + NR{"Nauru"} + NU{"Niue"} + NZ{"Nuova Zelanda"} + OM{"Oman"} + PA{"Panama"} + PE{"Perù"} + PF{"Polinesia Francese"} + PG{"Papua Nuova Guinea"} + PH{"Filippine"} + PK{"Pakistan"} + PL{"Polonia"} + PM{"Saint Pierre e Miquelon"} + PN{"Pitcairn"} + PR{"Portorico"} + PS{"Palestina"} + PT{"Portogallo"} + PW{"Palau"} + PY{"Paraguay"} + QA{"Qatar"} + RE{"Réunion"} + RO{"Romania"} + RU{"Federazione Russa"} + RW{"Ruanda"} + SA{"Arabia Saudita"} + SB{"Isole Solomon"} + SC{"Seychelles"} + SD{"Sudan"} + SE{"Svezia"} + SG{"Singapore"} + SH{"Sant’Elena"} + SI{"Slovenia"} + SJ{"Svalbard e Jan Mayen"} + SK{"Slovacchia"} + SL{"Sierra Leone"} + SM{"San Marino"} + SN{"Senegal"} + SO{"Somalia"} + SP{"Serbia"} + SR{"Suriname"} + ST{"São Tomé e Príncipe"} + SV{"El Salvador"} + SY{"Siria"} + SZ{"Swaziland"} + TC{"Isole Turks e Caicos"} + TD{"Ciad"} + TF{"Territori australi francesi"} + TG{"Togo"} + TH{"Tailandia"} + TJ{"Tagikistan"} + TK{"Tokelau"} + TL{"Timor Est"} + TM{"Turkmenistan"} + TN{"Tunisia"} + TO{"Tonga"} + TR{"Turchia"} + TT{"Trinidad e Tobago"} + TV{"Tuvalu"} + TZ{"Tanzania"} + UA{"Ucraina"} + UG{"Uganda"} + UM{"Isole Minori lontane dagli Stati Uniti"} + US{"Stati Uniti"} + UY{"Uruguay"} + UZ{"Uzbekistan"} + VA{"Vaticano"} + VC{"Saint Vincent e Grenadines"} + VE{"Venezuela"} + VG{"Isole Vergini Britanniche"} + VI{"Isole Vergini Americane"} + VN{"Vietnam"} + VU{"Vanuatu"} + WF{"Wallis e Futuna"} + WS{"Samoa"} + YE{"Yemen"} + YT{"Mayotte"} + YU{"Yugoslavia"} + ZA{"Sud Africa"} + ZM{"Zambia"} + ZW{"Zimbabwe"} } - - DayAbbreviations { - "dom", - "lun", - "mar", - "mer", - "gio", - "ven", - "sab", - } - DayNames { - "domenica", - "luned\u00EC", - "marted\u00EC", - "mercoled\u00EC", - "gioved\u00EC", - "venerd\u00EC", - "sabato", - } - Eras { - "aC", - "dC", + Currencies{ + ADD{ + "ADD", + "Diner Andorrano", + } + ADP{ + "ADP", + "Peseta Andorrana", + } + AED{ + "AED", + "Dirham degli Emirati Arabi Uniti", + } + AFA{ + "AFA", + "Afgani (1927-2002)", + } + AFN{ + "Af", + "Afgani", + } + AIF{ + "AIF", + "Franco di Affars e Issas", + } + ALK{ + "ALK", + "Lek Albanese (1946-1961)", + } + ALL{ + "lek", + "Lek Albanese", + } + ALV{ + "ALV", + "Lek Valute Albanese", + } + ALX{ + "ALX", + "Certificati di cambio esteri albanesi in dollari", + } + AMD{ + "dram", + "Dram Armeno", + } + ANG{ + "NA f.", + "Fiorino delle Antille Olandesi", + } + AOA{ + "AOA", + "Kwanza Angolano", + } + AOK{ + "AOK", + "Kwanza Angolano (1977-1990)", + } + AON{ + "AON", + "Nuovo Kwanza Angolano (1990-2000)", + } + AOR{ + "AOR", + "Kwanza Reajustado Angolano (1995-1999)", + } + AOS{ + "AOS", + "Escudo Angolano", + } + ARA{ + "ARA", + "Austral Argentino", + } + ARM{ + "ARM", + "Peso Moneda Nacional argentino", + } + ARP{ + "ARP", + "Peso Argentino (vecchio Cod.)", + } + ARS{ + "ARS", + "Peso Argentino", + } + ATS{ + "ATS", + "Scellino Austriaco", + } + AUD{ + "AUD", + "Dollaro Australiano", + } + AUP{ + "AUP", + "Sterlina Australiana", + } + AWG{ + "AWG", + "Fiorino di Aruba", + } + AZM{ + "AZM", + "Manat Azero", + } + BAD{ + "BAD", + "Dinar Bosnia-Herzegovina", + } + BAM{ + "KM", + "Marco Conv. Bosnia-Erzegovina", + } + BAN{ + "BAN", + "Nuovo Dinar Bosnia-Herzegovina", + } + BBD{ + "BDS$", + "Dollaro di Barbados", + } + BDT{ + "Tk", + "Taka Bangladese", + } + BEC{ + "BEC", + "Franco Belga (convertibile)", + } + BEF{ + "BEF", + "Franco Belga", + } + BEL{ + "BEL", + "Franco Belga (finanziario)", + } + BGL{ + "BGL", + "Lev Bulgaro", + } + BGM{ + "BGM", + "Lev Bulgaro Socialista", + } + BGN{ + "lev", + "Nuovo Lev Bulgaro", + } + BGO{ + "BGO", + "Lev Bulgaro (1879-1952)", + } + BGX{ + "BGX", + "Certificati di cambio esteri in Lev bulgari", + } + BHD{ + "BD", + "Dinaro del Bahraini", + } + BIF{ + "Fbu", + "Franco del Burundi", + } + BMD{ + "Ber$", + "Dollaro delle Bermuda", + } + BMP{ + "BMP", + "Sterlina delle Bermuda", + } + BND{ + "BND", + "Dollaro del Brunei", + } + BOB{ + "BOB", + "Boliviano", + } + BOL{ + "BOL", + "Boliviano (1863-1962)", + } + BOP{ + "BOP", + "Peso Boliviano", + } + BOV{ + "BOV", + "Mvdol Boliviano", + } + BRB{ + "BRB", + "Cruzeiro Novo Brasiliano (1967-1986)", + } + BRC{ + "BRC", + "Cruzado Brasiliano", + } + BRE{ + "BRE", + "Cruzeiro Brasiliano (1990-1993)", + } + BRL{ + "BRL", + "Real Brasiliano", + } + BRN{ + "BRN", + "Cruzado Novo Brasiliano", + } + BRR{ + "BRR", + "Cruzeiro Brasiliano", + } + BRZ{ + "BRZ", + "Cruzeiro Brasiliano (1942-1967)", + } + BSD{ + "BSD", + "Dollaro delle Bahamas", + } + BSP{ + "BSP", + "Libra delle Bahamas", + } + BTN{ + "Nu", + "Ngultrum Butanese", + } + BTR{ + "BTR", + "Rupia Butanese", + } + BUK{ + "BUK", + "Kyat Birmano", + } + BUR{ + "BUR", + "Rupia Birmana", + } + BWP{ + "BWP", + "Pula del Botswana", + } + BYB{ + "BYB", + "Nuovo Rublo Bielorussia (1994-1999)", + } + BYL{ + "BYL", + "Rublo Bielorussia (1992-1994)", + } + BYR{ + "Rbl", + "Rublo Bielorussia", + } + BZD{ + "BZ$", + "Dollaro Belize", + } + BZH{ + "BZH", + "Dollaro Honduras Britannico", + } + CAD{ + "CAD", + "Dollaro Canadese", + } + CDF{ + "CDF", + "Franco Congolese", + } + CDG{ + "CDG", + "Franco della Repubblica Congolese", + } + CDL{ + "CDL", + "Zaire Congolese", + } + CFF{ + "CFF", + "Franco CFA della Repubblica dell’Africa Centrale", + } + CHF{ + "SFr.", + "Franco Svizzero", + } + CKD{ + "CKD", + "Dollaro delle Isole Cook", + } + CLC{ + "CLC", + "Condor Cileno", + } + CLE{ + "CLE", + "Escudo Cileno", + } + CLF{ + "CLF", + "Unidades de Fomento Chilene", + } + CLP{ + "CLP", + "Peso Cileno", + } + CMF{ + "CMF", + "Franco CFA del Camerun", + } + CNP{ + "CNP", + "Jen Min Piao Yuan Cinese", + } + CNX{ + "CNX", + "Certificati di cambio esteri cinesi in dollari statunitensi", + } + CNY{ + "CNY", + "Renmimbi Cinese", + } + COB{ + "COB", + "Peso in banconote colombiano", + } + COF{ + "COF", + "Franco CFA del Congo", + } + COP{ + "Col$", + "Peso Colombiano", + } + CRC{ + "C", + "Colón Costaricano", + } + CSC{ + "CSC", + "Corona Cecoslovacca", + } + CSK{ + "CSK", + "Corona forte cecoslovacca", + } + CUP{ + "CUP", + "Peso Cubano", + } + CUX{ + "CUX", + "Certificati di cambio esteri cubani", + } + CVE{ + "CVEsc", + "Escudo del Capo Verde", + } + CWG{ + "CWG", + "Guilder del Curacao", + } + CYP{ + "CYP", + "Sterlina Cipriota", + } + CZK{ + "CZK", + "Corona Ceca", + } + DDM{ + "DDM", + "Ostmark della Germania Orientale", + } + DEM{ + "DEM", + "Marco Tedesco", + } + DES{ + "DES", + "Sperrmark Tedesco", + } + DJF{ + "DF", + "Franco Gibutiano", + } + DKK{ + "DKK", + "Corona Danese", + } + DOP{ + "RD$", + "Peso Dominicano", + } + DZD{ + "DA", + "Dinaro Algerino", + } + DZF{ + "DZF", + "Nuovo franco algerino", + } + DZG{ + "DZG", + "Franco germinale algerino", + } + ECS{ + "ECS", + "Sucre dell’Ecuador", + } + ECV{ + "ECV", + "Unidad de Valor Constante (UVC) dell’Ecuador", + } + EEK{ + "EEK", + "Corona dell’Estonia", + } + EGP{ + "EGP", + "Sterlina Egiziana", + } + ERN{ + "ERN", + "Nakfa Eritreo", + } + ESP{ + "ESP", + "Peseta Spagnola", + } + ETB{ + "Br", + "Birr Etiopico", + } + ETD{ + "ETD", + "Dollaro Etiopico", + } + EUR{ + "€", + "Euro", + } + FIM{ + "FIM", + "Markka Finlandese", + } + FIN{ + "FIN", + "Markka Finlandese (1860-1962)", + } + FJD{ + "F$", + "Dollaro delle Figi", + } + FJP{ + "FJP", + "Sterlina delle Figi", + } + FKP{ + "FKP", + "Sterlina delle Falkland", + } + FOK{ + "FOK", + "Kronur delle Isole Faeroe", + } + FRF{ + "FRF", + "Franco Francese", + } + FRG{ + "FRG", + "Franco germinale/franco Poincare francese", + } + GAF{ + "GAF", + "Franco CFA Gabon", + } + GBP{ + "£", + "Sterlina Inglese", + } + GEK{ + "GEK", + "Kupon Larit Georgiano", + } + GEL{ + "lari", + "Lari Georgiano", + } + GHC{ + "GHC", + "Cedi del Ghana", + } + GHO{ + "GHO", + "Vecchi cedi del Ghana", + } + GHP{ + "GHP", + "Sterlina del Ghana", + } + GHR{ + "GHR", + "Cedi rivalutato del Ghana", + } + GIP{ + "GIP", + "Sterlina di Gibilterra", + } + GLK{ + "GLK", + "Corona della Groenlandia", + } + GMD{ + "GMD", + "Dalasi del Gambia", + } + GMP{ + "GMP", + "Sterlina del Gambia", + } + GNF{ + "GF", + "Franco della Guinea", + } + GNI{ + "GNI", + "Franco della Guinea (1960-1972)", + } + GNS{ + "GNS", + "Syli della Guinea", + } + GPF{ + "GPF", + "Franco della Guadalupa", + } + GQE{ + "GQE", + "Ekwele della Guinea Equatoriale", + } + GQF{ + "GQF", + "Franco della Guinea Equatoriale", + } + GQP{ + "GQP", + "Peseta Guineana della Guinea Equatoriale", + } + GRD{ + "GRD", + "Dracma Greca", + } + GRN{ + "GRN", + "Nuova dracma greca", + } + GTQ{ + "Q", + "Quetzal Guatemalteco", + } + GUF{ + "GUF", + "Franco Guiana della Guyana francese", + } + GWE{ + "GWE", + "Escudo della Guinea portoghese", + } + GWM{ + "GWM", + "Mil Reis della Guinea portoghese", + } + GWP{ + "GWP", + "Peso della Guinea-Bissau", + } + GYD{ + "G$", + "Dollaro della Guyana", + } + HKD{ + "HKD", + "Dollaro di Hong Kong", + } + HNL{ + "L", + "Lempira Hoduregno", + } + HRD{ + "HRD", + "Dinaro Croato", + } + HRK{ + "HRK", + "Kuna Croata", + } + HTG{ + "HTG", + "Gourde Haitiano", + } + HUF{ + "HUF", + "Fiorino Ungherese", + } + IBP{ + "IBP", + "Sterlina dell’Irlanda del Nord", + } + IDG{ + "IDG", + "Fiorino Nica indonesiano", + } + IDJ{ + "IDJ", + "Rupia indonesiana di Java", + } + IDN{ + "IDN", + "Nuova rupia indonesiana", + } + IDR{ + "Rp", + "Rupia Indiana", + } + IEP{ + "IR£", + "Lira Irlandese", + } + ILL{ + "ILL", + "Sheqel Israeliano", + } + ILP{ + "ILP", + "Sterlina Israeliana", + } + ILS{ + "ILS", + "Nuovo sheqel israeliano", + } + IMP{ + "IMP", + "Lira Sterlina dell’Isola di Man", + } + INR{ + "=0#Rs.|1#Re.|1>;\n" - " x.x: << virgola >>;\n" - " zero; uno; due; tre; quattro; cinque; sei; sette; otto;\n" - " nove;\n" - " dieci; undici; dodici; tredici; quattordici; quindici; sedici;\n" - " diciasette; diciotto; diciannove;\n" - " 20: venti; vent>%%with-i>;\n" - " 30: trenta; trent>%%with-i>;\n" - " 40: quaranta; quarant>%%with-a>;\n" - " 50: cinquanta; cinquant>%%with-a>;\n" - " 60: sessanta; sessant>%%with-a>;\n" - " 70: settanta; settant>%%with-a>;\n" - " 80: ottanta; ottant>%%with-a>;\n" - " 90: novanta; novant>%%with-a>;\n" - " 100: cento; cent[>%%with-o>];\n" - " 200: <%%with-o>];\n" - " 1000: mille; mill[>%%with-i>];\n" - " 2000: <%%with-a>];\n" - " 100,000>>: <>];\n" - " 1,000,000: =#,##0= (incomplete data);\n" - "%%with-a:\n" - " azero; uno; adue; atre; aquattro; acinque; asei; asette; otto;\n" - " anove;\n" - " adieci; undici; adodici; atredici; aquattordici; aquindici; asedici;\n" - " adiciasette; adiciotto; adiciannove;\n" - " 20: aventi; avent>%%with-i>;\n" - " 30: atrenta; atrent>%%with-i>;\n" - " 40: aquaranta; aquarant>%%with-a>;\n" - " 50: acinquanta; acinquant>%%with-a>;\n" - " 60: asessanta; asessant>%%with-a>;\n" - " 70: asettanta; asettant>%%with-a>;\n" - " 80: ottanta; ottant>%%with-a>;\n" - " 90: anovanta; anovant>%%with-a>;\n" - " 100: acento; acent[>%%with-o>];\n" - " 200: <%%with-a%%with-o>];\n" - " 1000: amille; amill[>%%with-i>];\n" - " 2000: <%%with-a%%with-a>];\n" - " 100,000: =%main=;\n" - "%%with-i:\n" - " izero; uno; idue; itre; iquattro; icinque; isei; isette; otto;\n" - " inove;\n" - " idieci; undici; idodici; itredici; iquattordici; iquindici; isedici;\n" - " idiciasette; idiciotto; idiciannove;\n" - " 20: iventi; ivent>%%with-i>;\n" - " 30: itrenta; itrent>%%with-i>;\n" - " 40: iquaranta; iquarant>%%with-a>;\n" - " 50: icinquanta; icinquant>%%with-a>;\n" - " 60: isessanta; isessant>%%with-a>;\n" - " 70: isettanta; isettant>%%with-a>;\n" - " 80: ottanta; ottant>%%with-a>;\n" - " 90: inovanta; inovant>%%with-a>;\n" - " 100: icento; icent[>%%with-o>];\n" - " 200: <%%with-i%%with-o>];\n" - " 1000: imille; imill[>%%with-i>];\n" - " 2000: <%%with-i%%with-a>];\n" - " 100,000: =%main=;\n" - "%%with-o:\n" - " ozero; uno; odue; otre; oquattro; ocinque; osei; osette; otto;\n" - " onove;\n" - " odieci; undici; ododici; otredici; oquattordici; oquindici; osedici;\n" - " odiciasette; odiciotto; odiciannove;\n" - " 20: oventi; ovent>%%with-i>;\n" - " 30: otrenta; otrent>%%with-i>;\n" - " 40: oquaranta; oquarant>%%with-a>;\n" - " 50: ocinquanta; ocinquant>%%with-a>;\n" - " 60: osessanta; osessant>%%with-a>;\n" - " 70: osettanta; osettant>%%with-a>;\n" - " 80: ottanta; ottant>%%with-a>;\n" - " 90: onovanta; onovant>%%with-a>;\n" - " 100: ocento; ocent[>%%with-o>];\n" - " 200: <%%with-o%%with-o>];\n" - " 1000: omille; omill[>%%with-i>];\n" - " 2000: <%%with-o%%with-a>];\n" - " 100,000: =%main=;\n" + Variants{ + REVISED{"Modificato"} + } + Version{"1.2"} + calendar{ + gregorian{ + AmPmMarkers{ + "m.", + "p.", + } + DateTimeElements:intvector{ + 2, + 4, + } + DateTimePatterns{ + "HH:mm:ss z", + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm", + "EEEE d MMMM yyyy", + "dd MMMM yyyy", + "dd/MMM/yy", + "dd/MM/yy", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "dom", + "lun", + "mar", + "mer", + "gio", + "ven", + "sab", + } + narrow{ + "D", + "L", + "M", + "M", + "G", + "V", + "S", + } + wide{ + "domenica", + "lunedì", + "martedì", + "mercoledì", + "giovedì", + "venerdì", + "sabato", + } + } + } + eras{ + abbreviated{ + "aC", + "dC", + } + } + monthNames{ + format{ + abbreviated{ + "gen", + "feb", + "mar", + "apr", + "mag", + "giu", + "lug", + "ago", + "set", + "ott", + "nov", + "dic", + } + narrow{ + "G", + "F", + "M", + "A", + "M", + "G", + "L", + "A", + "S", + "O", + "N", + "D", + } + wide{ + "gennaio", + "febbraio", + "marzo", + "aprile", + "maggio", + "giugno", + "luglio", + "agosto", + "settembre", + "ottobre", + "novembre", + "dicembre", + } + } + } + } } - - // Currency display names - Currencies { - ARP { "ARP", "Peso Argentino (vecchio Cod.)" } // Argentine Peso - ARS { "ARS", "Peso Argentino" } // Argentine Peso - ATS { "ATS", "Scellino Austriaco" } // Schilling - AUD { "AUD", "Dollaro Australiano" } // Australian Dollar - BAM { "KM", "Marco Conv. Bosnia-Erzegovina" } // Convertible Marks - BEF { "BEF", "Franco Belga" } // Belgian Franc - BGL { "BGL", "Lev Bulgaro" } // Lev - BOB { "BOB", "Boliviano" } // Boliviano - BRL { "BRL", "Real Brasiliano" } // Brazilian Real - CAD { "CAD", "Dollaro Canadese" } // Canadian Dollar - CHF { "SFr.", "Franco Svizzero" } // Swiss Franc - CLP { "CLP", "Peso Cileno" } // Chilean Peso - CNY { "CNY", "Renmimbi Cinese" } // Yuan Renminbi - CYP { "CYP", "Sterlina Cipriota" } // Cyprus Pound - CZK { "CZK", "Corona Ceca" } // Czech Koruna - DEM { "DEM", "Marco Tedesco" } // Deutsche Mark - DKK { "DKK", "Corona Danese" } // Danish Krone - EEK { "EEK", "Corona dell'Estonia" } // Kroon - EGP { "EGP", "Sterlina Egiziana" } // Egyptian Pound - ESP { "ESP", "Peseta Spagnola" } // Spanish Peseta - EUR { "\u20AC", "Euro" } // Euro - FIM { "FIM", "Markka Finlandese" } // Markka - FRF { "FRF", "Franco Francese" } // French Franc - GBP { "\u00A3", "Sterlina Inglese" } // Pound Sterling - GRD { "GRD", "Dracma Greca" } // Drachma - HKD { "HKD", "Dollaro di Hong Kong" } // Hong Kong Dollar - HUF { "HUF", "Fiorino Ungherese" } // Forint - IDR { "IDR", "Rupia Indiana" } // Rupiah - IEP { "IEP", "Lira Irlandese" } // Irish Pound - ITL { "\u20A4", "Lira Italiana" } // Lira - JOD { "JOD", "Dinaro Giordano" } // Jordanian Dinar - JPY { "\u00A5", "Yen Giapponese" } // Yen - LTL { "LTL", "Lita Lituana" } // Lithuanian Litas - MAD { "MAD", "Dirham Marocchino" } // Moroccan Dirham - NGN { "NGN", "Naira Nigeriana" } // Naira - NLG { "NLG", "Fiorino Olandese" } // Netherlands Guilder - NOK { "NOK", "Corona Norvegese" } // Norwegian Krone - PHP { "PHP", "Peso delle Filippine" } // Philippine Peso - PLZ { "PLZ", "Zloty Polacco" } // Zloty - PTE { "PTE", "Escudo Portoghese" } // Portugese Escudo - ROL { "ROL", "Leu della Romania" } // Leu - RUR { "RUR", "Rublo della CSI" } // Russian Ruble - SAR { "SAR", "Ryal Saudita" } // Saudi Riyal - SEK { "SEK", "Corona Svedese" } // Swedish Krona - SGD { "SGD", "Dollaro di Singapore" } // Singapore Dollar - SIT { "SIT", "Tallero Sloveno" } // Tolar - THB { "THB", "Baht Tailandese" } // Baht - TRL { "TRL", "Lira Turca" } // Turkish Lira - UAH { "UAH", "Hrivna Ucraina" } // Hryvnia - USD { "$", "Dollaro Statunitense" } // US Dollar - YUD { "YUD", "Yud" } // New Yugoslavian - ZAR { "ZAR", "Rand Sudafricano" } // Rand + zoneStrings{ + { + "America/Los_Angeles", + "Ora Standard Pacifico", + "PST", + "Ora Legale Pacifico", + "PDT", + "Los Angeles", + } + { + "America/Denver", + "Ora Standard Mountain", + "MST", + "Ora Legale Mountain", + "MDT", + "Denver", + } + { + "America/Phoenix", + "Ora Standard Mountain", + "MST", + "Ora Standard Mountain", + "MST", + "Phoenix", + } + { + "America/Chicago", + "Ora Standard Centrale", + "CST", + "Ora Legale Centrale", + "CDT", + "Chicago", + } + { + "America/New_York", + "Ora Standard Orientale", + "EST", + "Ora Legale Orientale", + "EDT", + "New York", + } + { + "America/Indianapolis", + "Ora Standard Orientale", + "EST", + "Ora Standard Orientale", + "EST", + "Indianapolis", + } + { + "Pacific/Honolulu", + "Ora Standard Hawaii", + "HST", + "Ora Standard Hawaii", + "HST", + "Honolulu", + } + { + "America/Anchorage", + "Ora Standard Alaska", + "AST", + "Ora Legale Alaska", + "ADT", + "Anchorage", + } + { + "America/Halifax", + "Ora Standard Atlantico", + "AST", + "Ora Legale Atlantico", + "ADT", + "Halifax", + } + { + "America/St_Johns", + "Ora Standard Newfoundland", + "CNT", + "Ora Legale Newfoundland", + "CDT", + "St. Johns", + } + { + "Europe/Paris", + "Ora Standard Centrale Europeo", + "CET", + "Ora Legale Centrale Europeo", + "CEST", + "Parigi", + } + { + "Etc/GMT", + "Ora Meridiano Greenwich", + "GMT", + "Ora Meridiano Greenwich", + "GMT", + "Londra", + } + { + "Africa/Casablanca", + "Ora Meridiano Greenwich", + "GMT", + "Ora Meridiano Greenwich", + "GMT", + "Casablanca", + } + { + "Asia/Jerusalem", + "Ora Standard Israele", + "IST", + "Ora Legale Israele", + "IDT", + "Gerusalemme", + } + { + "Asia/Tokyo", + "Ora Standard Giappone", + "JST", + "Ora Standard Giappone", + "JST", + "Tokyo", + } + { + "Europe/Bucharest", + "Ora Standard Europa Orientale", + "EET", + "Ora Legale Europa Orientale", + "EEST", + "Bucarest", + } + { + "Asia/Shanghai", + "Ora Standard Cina", + "CTT", + "Ora Standard Cina", + "CDT", + "Shanghai", + } } } diff --git a/icuSources/data/locales/it_CH.txt b/icuSources/data/locales/it_CH.txt index 452bd86e..05c26e0a 100644 --- a/icuSources/data/locales/it_CH.txt +++ b/icuSources/data/locales/it_CH.txt @@ -1,26 +1,13 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/it_CH.xml // * // *************************************************************************** - -it_CH { - Version{ "2.0" } - DateTimePatterns { - "HH.mm' h' z", - "HH:mm:ss z", - "HH:mm:ss", - "HH:mm", - "EEEE, d MMMM yyyy", - "d MMMM yyyy", - "d-MMM-yy", - "dd.MM.yy", - "{1} {0}", - } - LocaleID:int { 0x0810 } -// LocaleString { "it_CH" } - NumberElements { +it_CH{ + NumberElements{ ".", "'", ";", @@ -29,26 +16,31 @@ it_CH { "#", "-", "E", - "\u2030", - "\u221E", - "\uFFFD", - ".", + "‰", + "∞", + "�", + "+", } - NumberPatterns { + NumberPatterns{ "#,##0.###;-#,##0.###", - "\u00A4 #,##0.00;\u00A4-#,##0.00", + "¤ #,##0.00;¤-#,##0.00", "#,##0%", "#E0", } -// ShortCountry { "CHE" } - zoneStrings { - { - "Europe/Zurich", - "CET", - "CET", - "CET", - "CET", - "Zurich", + Version{"1.2"} + calendar{ + gregorian{ + DateTimePatterns{ + "HH.mm:ss' h' z", + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm", + "EEEE, d MMMM yyyy", + "d MMMM yyyy", + "d-MMM-yy", + "dd.MM.yy", + "{1} {0}", + } } } } diff --git a/icuSources/data/locales/it_IT.txt b/icuSources/data/locales/it_IT.txt index 1c4ec971..06a1fc40 100644 --- a/icuSources/data/locales/it_IT.txt +++ b/icuSources/data/locales/it_IT.txt @@ -1,29 +1,37 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/it_IT.xml // * // *************************************************************************** - -it_IT { - Version{ "2.0" } -// LocaleString { "it_IT" } -// NumberPatterns { -// "#,##0.###;-#,##0.###", -// "\u00A4 #,##0.00;-\u00A4 #,##0.00", -// "#,##0%", -// } -// ShortCountry { "ITA" } - LocaleID:int { 0x0410 } - DateTimePatterns { - "HH:mm:ss z", - "H:mm:ss z", - "HH:mm:ss", - "HH:mm", - "EEEE d MMMM yyyy", - "dd MMMM yyyy", - "dd/MMM/yy", - "dd/MM/yy", - "{1} {0}", +it_IT{ + Currencies{ + ITL{ + "₤", + "Lira Italiana", + { + "¤ #,##0;-¤ #,##0", + ",", + ".", + } + } + } + Version{"1.2"} + calendar{ + gregorian{ + DateTimePatterns{ + "HH:mm:ss z", + "H:mm:ss z", + "HH:mm:ss", + "HH:mm", + "EEEE d MMMM yyyy", + "dd MMMM yyyy", + "dd/MMM/yy", + "dd/MM/yy", + "{1} {0}", + } + } } } diff --git a/icuSources/data/locales/it_IT_PREEURO.txt b/icuSources/data/locales/it_IT_PREEURO.txt deleted file mode 100644 index 243a0736..00000000 --- a/icuSources/data/locales/it_IT_PREEURO.txt +++ /dev/null @@ -1,16 +0,0 @@ -// *************************************************************************** -// * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -it_IT_PREEURO { - Version{ "2.0" } - NumberPatterns { - "#,##0.###;-#,##0.###", - "\u00A4 #,##0;-\u00A4 #,##0", - "#,##0%", - "#E0", - } -} diff --git a/icuSources/data/locales/iw.txt b/icuSources/data/locales/iw.txt index e823360e..4ce502c3 100644 --- a/icuSources/data/locales/iw.txt +++ b/icuSources/data/locales/iw.txt @@ -1,10 +1,11 @@ -// ******************************************************************************* +// *************************************************************************** // * -// * Copyright (C) 1997-2001, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml // * -// ******************************************************************************* - -iw { - "%%ALIAS" { "he" } +// *************************************************************************** +iw{ + "%%ALIAS"{"he"} } diff --git a/icuSources/data/locales/iw_IL.txt b/icuSources/data/locales/iw_IL.txt index 4ade9dc7..0539cb40 100644 --- a/icuSources/data/locales/iw_IL.txt +++ b/icuSources/data/locales/iw_IL.txt @@ -1,10 +1,11 @@ -// ******************************************************************************* +// *************************************************************************** // * -// * Copyright (C) 1997-2001, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml // * -// ******************************************************************************* - -iw_IL { - "%%ALIAS" { "he_IL" } +// *************************************************************************** +iw_IL{ + "%%ALIAS"{"he_IL"} } diff --git a/icuSources/data/locales/ja.txt b/icuSources/data/locales/ja.txt index 099a09fe..88c832c2 100644 --- a/icuSources/data/locales/ja.txt +++ b/icuSources/data/locales/ja.txt @@ -1,2813 +1,2553 @@ -// *************************************************************************** -// * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -ja { - Version { "2.0" } - AmPmMarkers { - "\u5348\u524D", - "\u5348\u5F8C", - } - - "%%PREEURO" { "\u65e7\u901a\u8ca8" } - "%%EURO" { "\u30e6\u30fc\u30ed" } - - "%%TRADITIONAL" { "\u5E74\u53F7" } - - "%%REVISED" { "\u6539\u8a02\u7248" } - - CollationElements { - Version { "4.0" } - Sequence { - "[strength 3]" // if you want complete JIS 4061X support use strength I or 4 - "[hiraganaQ on]" - - "&\u30FD = \u30FD = \u309D" // KATAKANA ITERATION MARK - - // Rules for treating length mark - - "&[before 3]\u30A1" //KATAKANA LETTER SMALL A - "<<< \u30A1|\u30FC = \uFF67|\u30FC = \u3041|\u30FC" // A - "= \u30A2|\u30FC = \uFF71|\u30FC = \u3042|\u30FC" // A - "= \u30AB|\u30FC = \uFF76|\u30FC = \u304B|\u30FC" // KA - "= \u30AC|\u30FC = \u304C|\u30FC" // GA - "= \u30B5|\u30FC = \uFF7B|\u30FC = \u3055|\u30FC" // SA - "= \u30B6|\u30FC = \u3056|\u30FC" // ZA - "= \u30BF|\u30FC = \uFF80|\u30FC = \u305F|\u30FC" // TA - "= \u30C0|\u30FC = \u3060|\u30FC" // DA - "= \u30CA|\u30FC = \uFF85|\u30FC = \u306A|\u30FC" // NA - "= \u30CF|\u30FC = \uFF8A|\u30FC = \u306F|\u30FC" // HA - "= \u30D0|\u30FC = \u3070|\u30FC" // BA - "= \u30D1|\u30FC = \u3071|\u30FC" // PA - "= \u30DE|\u30FC = \uFF8F|\u30FC = \u307E|\u30FC" // MA - "= \u30E3|\u30FC = \uFF6C|\u30FC = \u3083|\u30FC" // YA - "= \u30E4|\u30FC = \uFF94|\u30FC = \u3084|\u30FC" // YA - "= \u30E9|\u30FC = \uFF97|\u30FC = \u3089|\u30FC" // RA - "= \u30EE|\u30FC = \u308E|\u30FC" // WA - "= \u30EF|\u30FC = \uFF9C|\u30FC = \u308F|\u30FC" // WA - "= \u30F5|\u30FC" // KA - "= \u30F7|\u30FC" // VA - - "&[before 3]\u30A3" //KATAKANA LETTER SMALL I - "<<< \u30A3|\u30FC = \uFF68|\u30FC = \u3043|\u30FC" // I - "= \u30A4|\u30FC = \uFF72|\u30FC = \u3044|\u30FC" // I - "= \u30AD|\u30FC = \uFF77|\u30FC = \u304D|\u30FC" // KI - "= \u30AE|\u30FC = \u304E|\u30FC" // GI - "= \u30B7|\u30FC = \uFF7C|\u30FC = \u3057|\u30FC" // SI - "= \u30B8|\u30FC = \u3058|\u30FC" // ZI - "= \u30C1|\u30FC = \uFF81|\u30FC = \u3061|\u30FC" // TI - "= \u30C2|\u30FC = \u3062|\u30FC" // DI - "= \u30CB|\u30FC = \uFF86|\u30FC = \u306B|\u30FC" // NI - "= \u30D2|\u30FC = \uFF8B|\u30FC = \u3072|\u30FC" // HI - "= \u30D3|\u30FC = \u3073|\u30FC" // BI - "= \u30D4|\u30FC = \u3074|\u30FC" // PI - "= \u30DF|\u30FC = \uFF90|\u30FC = \u307F|\u30FC" // MI - "= \u30EA|\u30FC = \uFF98|\u30FC = \u308A|\u30FC" // RI - "= \u30F0|\u30FC = \u3090|\u30FC" // WI - "= \u30F8|\u30FC" // VI - - "&[before 3]\u30A5" //KATAKANA LETTER SMALL U - "<<< \u30A5|\u30FC = \uFF69|\u30FC = \u3045|\u30FC" // U - "= \u30A6|\u30FC = \uFF73|\u30FC = \u3046|\u30FC" // U - "= \u30AF|\u30FC = \uFF78|\u30FC = \u304F|\u30FC" // KU - "= \u30B0|\u30FC = \u3050|\u30FC" // GU - "= \u30B9|\u30FC = \uFF7D|\u30FC = \u3059|\u30FC" // SU - "= \u30BA|\u30FC = \u305A|\u30FC" // ZU - "= \u30C3|\u30FC = \uFF6F|\u30FC = \u3063|\u30FC" // TU - "= \u30C4|\u30FC = \uFF82|\u30FC = \u3064|\u30FC" // TU - "= \u30C5|\u30FC = \u3065|\u30FC" // DU - "= \u30CC|\u30FC = \uFF87|\u30FC = \u306C|\u30FC" // NU - "= \u30D5|\u30FC = \uFF8C|\u30FC = \u3075|\u30FC" // HU - "= \u30D6|\u30FC = \u3076|\u30FC" // BU - "= \u30D7|\u30FC = \u3077|\u30FC" // PU - "= \u30E0|\u30FC = \uFF91|\u30FC = \u3080|\u30FC" // MU - "= \u30E5|\u30FC = \uFF6D|\u30FC = \u3085|\u30FC" // YU - "= \u30E6|\u30FC = \uFF95|\u30FC = \u3086|\u30FC" // YU - "= \u30EB|\u30FC = \uFF99|\u30FC = \u308B|\u30FC" // RU - "= \u30F4|\u30FC = \u3094|\u30FC" // VU - - "&[before 3]\u30A7" //KATAKANA LETTER SMALL E - "<<< \u30A7|\u30FC = \uFF6A|\u30FC = \u3047|\u30FC" // E - "= \u30A8|\u30FC = \uFF74|\u30FC = \u3048|\u30FC" // E - "= \u30B1|\u30FC = \uFF79|\u30FC = \u3051|\u30FC" // KE - "= \u30B2|\u30FC = \u3052|\u30FC" // GE - "= \u30BB|\u30FC = \uFF7E|\u30FC = \u305B|\u30FC" // SE - "= \u30BC|\u30FC = \u305C|\u30FC" // ZE - "= \u30C6|\u30FC = \uFF83|\u30FC = \u3066|\u30FC" // TE - "= \u30C7|\u30FC = \u3067|\u30FC" // DE - "= \u30CD|\u30FC = \uFF88|\u30FC = \u306D|\u30FC" // NE - "= \u30D8|\u30FC = \uFF8D|\u30FC = \u3078|\u30FC" // HE - "= \u30D9|\u30FC = \u3079|\u30FC" // BE - "= \u30DA|\u30FC = \u307A|\u30FC" // PE - "= \u30E1|\u30FC = \uFF92|\u30FC = \u3081|\u30FC" // ME - "= \u30EC|\u30FC = \uFF9A|\u30FC = \u308C|\u30FC" // RE - "= \u30F1|\u30FC = \u3091|\u30FC" // WE - "= \u30F6|\u30FC" // KE - "= \u30F9|\u30FC" // VE - - "&[before 3]\u30A9" //KATAKANA LETTER SMALL O - "<<< \u30A9|\u30FC = \uFF6B|\u30FC = \u3049|\u30FC" // O - "= \u30AA|\u30FC = \uFF75|\u30FC = \u304A|\u30FC" // O - "= \u30B3|\u30FC = \uFF7A|\u30FC = \u3053|\u30FC" // KO - "= \u30B4|\u30FC = \u3054|\u30FC" // GO - "= \u30BD|\u30FC = \uFF7F|\u30FC = \u305D|\u30FC" // SO - "= \u30BE|\u30FC = \u305E|\u30FC" // ZO - "= \u30C8|\u30FC = \uFF84|\u30FC = \u3068|\u30FC" // TO - "= \u30C9|\u30FC = \u3069|\u30FC" // DO - "= \u30CE|\u30FC = \uFF89|\u30FC = \u306E|\u30FC" // NO - "= \u30DB|\u30FC = \uFF8E|\u30FC = \u307B|\u30FC" // HO - "= \u30DC|\u30FC = \u307C|\u30FC" // BO - "= \u30DD|\u30FC = \u307D|\u30FC" // PO - "= \u30E2|\u30FC = \uFF93|\u30FC = \u3082|\u30FC" // MO - "= \u30E7|\u30FC = \uFF6E|\u30FC = \u3087|\u30FC" // YO - "= \u30E8|\u30FC = \uFF96|\u30FC = \u3088|\u30FC" // YO - "= \u30ED|\u30FC = \uFF9B|\u30FC = \u308D|\u30FC" // RO - "= \u30F2|\u30FC = \uFF66|\u30FC = \u3092|\u30FC" // WO - "= \u30FA|\u30FC" // VO - - // Rules for treating iteration mark - - "&[before 3]\u30A2" //KATAKANA LETTER A - "<<< \u30A2|\u30FD = \uFF71|\u30FD = \u3042|\u309D" - "= \u30A1|\u30FD = \uFF67|\u30FD = \u3041|\u309D" - - "&[before 3]\u30A4" //KATAKANA LETTER I - "<<< \u30A4|\u30FD = \uFF72|\u30FD = \u3044|\u309D" - "= \u30A3|\u30FD = \uFF68|\u30FD = \u3043|\u309D" - - "&[before 3]\u30A6" //KATAKANA LETTER U - "<<< \u30A6|\u30FD = \uFF73|\u30FD = \u3046|\u309D" - "= \u30A5|\u30FD = \uFF69|\u30FD = \u3045|\u309D" - "= \u30F4|\u30FD = \u3094|\u309D" - "= \u30A6|\u30FE/\u3099 = \uFF73|\u30FE/\u3099 = \u3046|\u309E/\u3099" - "= \u30A5|\u30FE/\u3099 = \uFF69|\u30FE/\u3099 = \u3045|\u309E/\u3099" - "= \u30F4|\u30FE/\u3099 = \u3094|\u309E/\u3099" - - "&[before 3]\u30A8" //KATAKANA LETTER E - "<<< \u30A8|\u30FD = \uFF74|\u30FD = \u3048|\u309D" - "= \u30A7|\u30FD = \uFF6A|\u30FD = \u3047|\u309D" - - "&[before 3]\u30AA" //KATAKANA LETTER O - "<<< \u30AA|\u30FD = \uFF75|\u30FD = \u304A|\u309D" - "= \u30A9|\u30FD = \uFF6B|\u30FD = \u3049|\u309D" - - "&[before 3]\u30AB" //KATAKANA LETTER KA - "<<< \u30AB|\u30FD = \uFF76|\u30FD = \u304B|\u309D" - "= \u30F5|\u30FD" - - "&[before 3]\u30AC" //KATAKANA LETTER GA - "<<< \u30AC|\u30FD = \u304C|\u309D" - - "&[before 3]\u30AD" //KATAKANA LETTER KI - "<<< \u30AD|\u30FD = \uFF77|\u30FD = \u304D|\u309D" - "= \u30AE|\u30FD = \u304E|\u309D" - "= \u30AD|\u30FE/\u3099 = \uFF77|\u30FE/\u3099 = \u304D|\u309E/\u3099" - "= \u30AE|\u30FE/\u3099 = \u304E|\u309E/\u3099" - - "&[before 3]\u30AF" //KATAKANA LETTER KU - "<<< \u30AF|\u30FD = \uFF78|\u30FD = \u304F|\u309D" - "= \u30B0|\u30FD = \u3050|\u309D" - "= \u30AF|\u30FE/\u3099 = \uFF78|\u30FE/\u3099 = \u304F|\u309E/\u3099" - "= \u30B0|\u30FE/\u3099 = \u3050|\u309E/\u3099" - - "&[before 3]\u30B1" //KATAKANA LETTER KE - "<<< \u30B1|\u30FD = \uFF79|\u30FD = \u3051|\u309D" - "= \u30F6|\u30FD" - - "&[before 3]\u30B2" //KATAKANA LETTER GE - "<<< \u30B2|\u30FD = \u3052|\u309D" - - "&[before 3]\u30B3" //KATAKANA LETTER KO - "<<< \u30B3|\u30FD = \uFF7A|\u30FD = \u3053|\u309D" - "= \u30B4|\u30FD = \u3054|\u309D" - "= \u30B3|\u30FE/\u3099 = \uFF7A|\u30FE/\u3099 = \u3053|\u309E/\u3099" - "= \u30B4|\u30FE/\u3099 = \u3054|\u309E/\u3099" - - "&[before 3]\u30B5" //KATAKANA LETTER SA - "<<< \u30B5|\u30FD = \uFF7B|\u30FD = \u3055|\u309D" - "= \u30B6|\u30FD = \u3056|\u309D" - "= \u30B5|\u30FE/\u3099 = \uFF7B|\u30FE/\u3099 = \u3055|\u309E/\u3099" - "= \u30B6|\u30FE/\u3099 = \u3056|\u309E/\u3099" - - "&[before 3]\u30B7" //KATAKANA LETTER SI - "<<< \u30B7|\u30FD = \uFF7C|\u30FD = \u3057|\u309D" - "= \u30B8|\u30FD = \u3058|\u309D" - "= \u30B7|\u30FE/\u3099 = \uFF7C|\u30FE/\u3099 = \u3057|\u309E/\u3099" - "= \u30B8|\u30FE/\u3099 = \u3058|\u309E/\u3099" - - "&[before 3]\u30B9" //KATAKANA LETTER SU - "<<< \u30B9|\u30FD = \uFF7D|\u30FD = \u3059|\u309D" - "= \u30BA|\u30FD = \u305A|\u309D" - "= \u30B9|\u30FE/\u3099 = \uFF7D|\u30FE/\u3099 = \u3059|\u309E/\u3099" - "= \u30BA|\u30FE/\u3099 = \u305A|\u309E/\u3099" - - "&[before 3]\u30BB" //KATAKANA LETTER SE - "<<< \u30BB|\u30FD = \uFF7E|\u30FD = \u305B|\u309D" - "= \u30BC|\u30FD = \u305C|\u309D" - "= \u30BB|\u30FE/\u3099 = \uFF7E|\u30FE/\u3099 = \u305B|\u309E/\u3099" - "= \u30BC|\u30FE/\u3099 = \u305C|\u309E/\u3099" - - "&[before 3]\u30BD" //KATAKANA LETTER SO - "<<< \u30BD|\u30FD = \uFF7F|\u30FD = \u305D|\u309D" - "= \u30BE|\u30FD = \u305E|\u309D" - "= \u30BD|\u30FE/\u3099 = \uFF7F|\u30FE/\u3099 = \u305D|\u309E/\u3099" - "= \u30BE|\u30FE/\u3099 = \u305E|\u309E/\u3099" - - "&[before 3]\u30BF" //KATAKANA LETTER TA - "<<< \u30BF|\u30FD = \uFF80|\u30FD = \u305F|\u309D" - "= \u30C0|\u30FD = \u3060|\u309D" - "= \u30BF|\u30FE/\u3099 = \uFF80|\u30FE/\u3099 = \u305F|\u309E/\u3099" - "= \u30C0|\u30FE/\u3099 = \u3060|\u309E/\u3099" - - "&[before 3]\u30C1" //KATAKANA LETTER TI - "<<< \u30C1|\u30FD = \uFF81|\u30FD = \u3061|\u309D" - "= \u30C2|\u30FD = \u3062|\u309D" - "= \u30C1|\u30FE/\u3099 = \uFF81|\u30FE/\u3099 = \u3061|\u309E/\u3099" - "= \u30C2|\u30FE/\u3099 = \u3062|\u309E/\u3099" - - "&[before 3]\u30C4" //KATAKANA LETTER TU - "<<< \u30C4|\u30FD = \uFF82|\u30FD = \u3064|\u309D" - "= \u30C3|\u30FD = \uFF6F|\u30FD = \u3063|\u309D" - "= \u30C5|\u30FD = \u3065|\u309D" - "= \u30C4|\u30FE/\u3099 = \uFF82|\u30FE/\u3099 = \u3064|\u309E/\u3099" - "= \u30C5|\u30FE/\u3099 = \u3065|\u309E/\u3099" - "= \u30C4|\u30FD = \uFF82|\u30FD = \u3064|\u309D" - "= \u30C3|\u30FE/\u3099 = \uFF6F|\u30FE/\u3099 = \u3063|\u309E/\u3099" - "= \u30C4|\u30FE/\u3099 = \uFF82|\u30FE/\u3099 = \u3064|\u309E/\u3099" - - "&[before 3]\u30C6" //KATAKANA LETTER TE - "<<< \u30C6|\u30FD = \uFF83|\u30FD = \u3066|\u309D" - "= \u30C7|\u30FD = \u3067|\u309D" - "= \u30C6|\u30FE/\u3099 = \uFF83|\u30FE/\u3099 = \u3066|\u309E/\u3099" - "= \u30C7|\u30FE/\u3099 = \u3067|\u309E/\u3099" - - "&[before 3]\u30C8" //KATAKANA LETTER TO - "<<< \u30C8|\u30FD = \uFF84|\u30FD = \u3068|\u309D" - "= \u30C9|\u30FD = \u3069|\u309D" - "= \u30C8|\u30FE/\u3099 = \uFF84|\u30FE/\u3099 = \u3068|\u309E/\u3099" - "= \u30C9|\u30FE/\u3099 = \u3069|\u309E/\u3099" - - "&[before 3]\u30CA" //KATAKANA LETTER NA - "<<< \u30CA|\u30FD = \uFF85|\u30FD = \u306A|\u309D" - - "&[before 3]\u30CB" //KATAKANA LETTER NI - "<<< \u30CB|\u30FD = \uFF86|\u30FD = \u306B|\u309D" - - "&[before 3]\u30CC" //KATAKANA LETTER NU - "<<< \u30CC|\u30FD = \uFF87|\u30FD = \u306C|\u309D" - - "&[before 3]\u30CD" //KATAKANA LETTER NE - "<<< \u30CD|\u30FD = \uFF88|\u30FD = \u306D|\u309D" - - "&[before 3]\u30CE" //KATAKANA LETTER NO - "<<< \u30CE|\u30FD = \uFF89|\u30FD = \u306E|\u309D" - - "&[before 3]\u30CF" //KATAKANA LETTER HA - "<<< \u30CF|\u30FD = \uFF8A|\u30FD = \u306F|\u309D" - "= \u30D0|\u30FD = \u3070|\u309D" - "= \u30CF|\u30FE/\u3099 = \uFF8A|\u30FE/\u3099 = \u306F|\u309E/\u3099" - "= \u30D0|\u30FE/\u3099 = \u3070|\u309E/\u3099" - "= \u30D1|\u30FD = \u3071|\u309D" - "= \u30D1|\u30FE/\u3099 = \u3071|\u309E/\u3099" - - "&[before 3]\u30D2" //KATAKANA LETTER HI - "<<< \u30D2|\u30FD = \uFF8B|\u30FD = \u3072|\u309D" - "= \u30D3|\u30FD = \u3073|\u309D" - "= \u30D2|\u30FE/\u3099 = \uFF8B|\u30FE/\u3099 = \u3072|\u309E/\u3099" - "= \u30D3|\u30FE/\u3099 = \u3073|\u309E/\u3099" - "= \u30D4|\u30FD = \u3074|\u309D" - "= \u30D4|\u30FE/\u3099 = \u3074|\u309E/\u3099" - - "&[before 3]\u30D5" //KATAKANA LETTER HU - "<<< \u30D5|\u30FD = \uFF8C|\u30FD = \u3075|\u309D" - "= \u30D6|\u30FD = \u3076|\u309D" - "= \u30D5|\u30FE/\u3099 = \uFF8C|\u30FE/\u3099 = \u3075|\u309E/\u3099" - "= \u30D6|\u30FE/\u3099 = \u3076|\u309E/\u3099" - "= \u30D7|\u30FD = \u3077|\u309D" - "= \u30D7|\u30FE/\u3099 = \u3077|\u309E/\u3099" - - "&[before 3]\u30D8" //KATAKANA LETTER HE - "<<< \u30D8|\u30FD = \uFF8D|\u30FD = \u3078|\u309D" - "= \u30D9|\u30FD = \u3079|\u309D" - "= \u30D8|\u30FE/\u3099 = \uFF8D|\u30FE/\u3099 = \u3078|\u309E/\u3099" - "= \u30D9|\u30FE/\u3099 = \u3079|\u309E/\u3099" - "= \u30DA|\u30FD = \u307A|\u309D" - "= \u30DA|\u30FE/\u3099 = \u307A|\u309E/\u3099" - - "&[before 3]\u30DB" //KATAKANA LETTER HO - "<<< \u30DB|\u30FD = \uFF8E|\u30FD = \u307B|\u309D" - "= \u30DC|\u30FD = \u307C|\u309D" - "= \u30DB|\u30FE/\u3099 = \uFF8E|\u30FE/\u3099 = \u307B|\u309E/\u3099" - "= \u30DC|\u30FE/\u3099 = \u307C|\u309E/\u3099" - "= \u30DD|\u30FD = \u307D|\u309D" - "= \u30DD|\u30FE/\u3099 = \u307D|\u309E/\u3099" - - "&[before 3]\u30DE" //KATAKANA LETTER MA - "<<< \u30DE|\u30FD = \uFF8F|\u30FD = \u307E|\u309D" - - "&[before 3]\u30DF" //KATAKANA LETTER MI - "<<< \u30DF|\u30FD = \uFF90|\u30FD = \u307F|\u309D" - - "&[before 3]\u30E0" //KATAKANA LETTER MU - "<<< \u30E0|\u30FD = \uFF91|\u30FD = \u3080|\u309D" - - "&[before 3]\u30E1" //KATAKANA LETTER ME - "<<< \u30E1|\u30FD = \uFF92|\u30FD = \u3081|\u309D" - - "&[before 3]\u30E2" //KATAKANA LETTER MO - "<<< \u30E2|\u30FD = \uFF93|\u30FD = \u3082|\u309D" - - "&[before 3]\u30E4" //KATAKANA LETTER YA - "<<< \u30E4|\u30FD = \uFF94|\u30FD = \u3084|\u309D" - "= \u30E3|\u30FD = \uFF6C|\u30FD = \u3083|\u309D" - - "&[before 3]\u30E6" //KATAKANA LETTER YU - "<<< \u30E6|\u30FD = \uFF95|\u30FD = \u3086|\u309D" - "= \u30E5|\u30FD = \uFF6D|\u30FD = \u3085|\u309D" - - "&[before 3]\u30E8" //KATAKANA LETTER YO - "<<< \u30E8|\u30FD = \uFF96|\u30FD = \u3088|\u309D" - "= \u30E7|\u30FD = \uFF6E|\u30FD = \u3087|\u309D" - - "&[before 3]\u30E9" //KATAKANA LETTER RA - "<<< \u30E9|\u30FD = \uFF97|\u30FD = \u3089|\u309D" - - "&[before 3]\u30EA" //KATAKANA LETTER RI - "<<< \u30EA|\u30FD = \uFF98|\u30FD = \u308A|\u309D" - - "&[before 3]\u30EB" //KATAKANA LETTER RU - "<<< \u30EB|\u30FD = \uFF99|\u30FD = \u308B|\u309D" - - "&[before 3]\u30EC" //KATAKANA LETTER RE - "<<< \u30EC|\u30FD = \uFF9A|\u30FD = \u308C|\u309D" - - "&[before 3]\u30ED" //KATAKANA LETTER RO - "<<< \u30ED|\u30FD = \uFF9B|\u30FD = \u308D|\u309D" - - "&[before 3]\u30EF" //KATAKANA LETTER WA - "<<< \u30EF|\u30FD = \uFF9C|\u30FD = \u308F|\u309D" - "= \u30EE|\u30FD = \u308E|\u309D" - "= \u30F7|\u30FD" - "= \u30EF|\u30FE/\u3099 = \uFF9C|\u30FE/\u3099 = \u308F|\u309E/\u3099" - "= \u30F7|\u30FE/\u3099" - "= \u30EE|\u30FE/\u3099 = \u308E|\u309E/\u3099" - - "&[before 3]\u30F0" //KATAKANA LETTER WI - "<<< \u30F0|\u30FD = \u3090|\u309D" - "= \u30F8|\u30FD" - "= \u30F0|\u30FE/\u3099 = \u3090|\u309E/\u3099" - "= \u30F8|\u30FE/\u3099" - - "&[before 3]\u30F1" //KATAKANA LETTER WE - "<<< \u30F1|\u30FD = \u3091|\u309D" - "= \u30F9|\u30FD" - "= \u30F1|\u30FE/\u3099 = \u3091|\u309E/\u3099" - "= \u30F9|\u30FE/\u3099" - - "&[before 3]\u30F2" //KATAKANA LETTER WO - "<<< \u30F2|\u30FD = \uFF66|\u30FD = \u3092|\u309D" - "= \u30FA|\u30FD" - "= \u30F2|\u30FE/\u3099 = \uFF66|\u30FE/\u3099 = \u3092|\u309E/\u3099" - "= \u30FA|\u30FE/\u3099" - - "&[before 3]\u30F3" //KATAKANA LETTER N - "<<< \u30F3|\u30FD = \uFF9D|\u30FD = \u3093|\u309D" - - // Equaling Katakana, Hiragana and compatibility - "&\u30A1 = \u30A1 = \u3041 = \uFF67" // KATAKANA LETTER SMALL A - "&\u30A2 = \u30A2 = \u3042 = \uFF71" // KATAKANA LETTER A - "&\u30A3 = \u30A3 = \u3043 = \uFF68" // KATAKANA LETTER SMALL I - "&\u30A4 = \u30A4 = \u3044 = \uFF72" // KATAKANA LETTER I - "&\u30A5 = \u30A5 = \u3045 = \uFF69" // KATAKANA LETTER SMALL U - "&\u30A6 = \u30A6 = \u3046 = \uFF73" // KATAKANA LETTER U - "&\u30A7 = \u30A7 = \u3047 = \uFF6A" // KATAKANA LETTER SMALL E - "&\u30A8 = \u30A8 = \u3048 = \uFF74" // KATAKANA LETTER E - "&\u30A9 = \u30A9 = \u3049 = \uFF6B" // KATAKANA LETTER SMALL O - "&\u30AA = \u30AA = \u304A = \uFF75" // KATAKANA LETTER O - "&\u30AB = \u30AB = \u304B = \uFF76" // KATAKANA LETTER KA - "&\u30AD = \u30AD = \u304D = \uFF77" // KATAKANA LETTER KI - "&\u30AF = \u30AF = \u304F = \uFF78" // KATAKANA LETTER KU - "&\u30B1 = \u30B1 = \u3051 = \uFF79" // KATAKANA LETTER KE - "&\u30B3 = \u30B3 = \u3053 = \uFF7A" // KATAKANA LETTER KO - "&\u30B5 = \u30B5 = \u3055 = \uFF7B" // KATAKANA LETTER SA - "&\u30B7 = \u30B7 = \u3057 = \uFF7C" // KATAKANA LETTER SI - "&\u30B9 = \u30B9 = \u3059 = \uFF7D" // KATAKANA LETTER SU - "&\u30BB = \u30BB = \u305B = \uFF7E" // KATAKANA LETTER SE - "&\u30BD = \u30BD = \u305D = \uFF7F" // KATAKANA LETTER SO - "&\u30BF = \u30BF = \u305F = \uFF80" // KATAKANA LETTER TA - "&\u30C1 = \u30C1 = \u3061 = \uFF81" // KATAKANA LETTER TI - "&\u30C3 = \u30C3 = \u3063 = \uFF6F" // KATAKANA LETTER SMALL TU - "&\u30C4 = \u30C4 = \u3064 = \uFF82" // KATAKANA LETTER TU - "&\u30C6 = \u30C6 = \u3066 = \uFF83" // KATAKANA LETTER TE - "&\u30C8 = \u30C8 = \u3068 = \uFF84" // KATAKANA LETTER TO - "&\u30CA = \u30CA = \u306A = \uFF85" // KATAKANA LETTER NA - "&\u30CB = \u30CB = \u306B = \uFF86" // KATAKANA LETTER NI - "&\u30CC = \u30CC = \u306C = \uFF87" // KATAKANA LETTER NU - "&\u30CD = \u30CD = \u306D = \uFF88" // KATAKANA LETTER NE - "&\u30CE = \u30CE = \u306E = \uFF89" // KATAKANA LETTER NO - "&\u30CF = \u30CF = \u306F = \uFF8A" // KATAKANA LETTER HA - "&\u30D2 = \u30D2 = \u3072 = \uFF8B" // KATAKANA LETTER HI - "&\u30D5 = \u30D5 = \u3075 = \uFF8C" // KATAKANA LETTER HU - "&\u30D8 = \u30D8 = \u3078 = \uFF8D" // KATAKANA LETTER HE - "&\u30DB = \u30DB = \u307B = \uFF8E" // KATAKANA LETTER HO - "&\u30DE = \u30DE = \u307E = \uFF8F" // KATAKANA LETTER MA - "&\u30DF = \u30DF = \u307F = \uFF90" // KATAKANA LETTER MI - "&\u30E0 = \u30E0 = \u3080 = \uFF91" // KATAKANA LETTER MU - "&\u30E1 = \u30E1 = \u3081 = \uFF92" // KATAKANA LETTER ME - "&\u30E2 = \u30E2 = \u3082 = \uFF93" // KATAKANA LETTER MO - "&\u30E3 = \u30E3 = \u3083 = \uFF6C" // KATAKANA LETTER SMALL YA - "&\u30E4 = \u30E4 = \u3084 = \uFF94" // KATAKANA LETTER YA - "&\u30E5 = \u30E5 = \u3085 = \uFF6D" // KATAKANA LETTER SMALL YU - "&\u30E6 = \u30E6 = \u3086 = \uFF95" // KATAKANA LETTER YU - "&\u30E7 = \u30E7 = \u3087 = \uFF6E" // KATAKANA LETTER SMALL YO - "&\u30E8 = \u30E8 = \u3088 = \uFF96" // KATAKANA LETTER YO - "&\u30E9 = \u30E9 = \u3089 = \uFF97" // KATAKANA LETTER RA - "&\u30EA = \u30EA = \u308A = \uFF98" // KATAKANA LETTER RI - "&\u30EB = \u30EB = \u308B = \uFF99" // KATAKANA LETTER RU - "&\u30EC = \u30EC = \u308C = \uFF9A" // KATAKANA LETTER RE - "&\u30ED = \u30ED = \u308D = \uFF9B" // KATAKANA LETTER RO - "&\u30EE = \u30EE = \u308E" // KATAKANA LETTER SMALL WA - "&\u30EF = \u30EF = \u308F = \uFF9C" // KATAKANA LETTER WA - "&\u30F0 = \u30F0 = \u3090" // KATAKANA LETTER WI - "&\u30F1 = \u30F1 = \u3091" // KATAKANA LETTER WE - "&\u30F2 = \u30F2 = \u3092 = \uFF66" // KATAKANA LETTER WO - "&\u30F3 = \u30F3 = \u3093 = \uFF9D" // KATAKANA LETTER N - "&\u30F5 = \u30F5" // KATAKANA LETTER SMALL KA - "&\u30F6 = \u30F6" // KATAKANA LETTER SMALL KE - "&\u30FC = \u30FC" // KATAKANA - HIRAGANA LENGTH MARK - "&\u3099 = \u3099" - "&\u309A = \u309A" - - // Equaling normal and halfwidth/fullwidth characters - "&' '='\u3000'" // IDEOGRAPHIC SPACE - "&'\u0020' = '\uFFE3'" // SPACE - "&'\u0021' = '\uFF01'" // EXCLAMATION MARK - "&'\u0022' = '\uFF02'" // QUOTATION MARK - "&'\u0023' = '\uFF03'" // NUMBER SIGN - "&'\u0024' = '\uFF04'" // DOLLAR SIGN - "&'\u0025' = '\uFF05'" // PERCENT SIGN - "&'\u0026' = '\uFF06'" // AMPERSAND - "&'' = '\uFF07'" // APOSTROPHE - "&'\u0028' = '\uFF08'" // LEFT PARENTHESIS - "&'\u0029' = '\uFF09'" // RIGHT PARENTHESIS - "&'\u002A' = '\uFF0A'" // ASTERISK - "&'\u002B' = '\uFF0B'" // PLUS SIGN - "&'\u002C' = '\uFF0C'" // COMMA - "&'\u002D' = '\uFF0D'" // HYPHEN-MINUS - "&'\u002E' = '\uFF0E'" // FULL STOP - "&'\u002F' = '\uFF0F'" // SOLIDUS - "&'\u0030' = '\uFF10'" // DIGIT ZERO - "&'\u0031' = '\uFF11'" // DIGIT ONE - "&'\u0032' = '\uFF12'" // DIGIT TWO - "&'\u0033' = '\uFF13'" // DIGIT THREE - "&'\u0034' = '\uFF14'" // DIGIT FOUR - "&'\u0035' = '\uFF15'" // DIGIT FIVE - "&'\u0036' = '\uFF16'" // DIGIT SIX - "&'\u0037' = '\uFF17'" // DIGIT SEVEN - "&'\u0038' = '\uFF18'" // DIGIT EIGHT - "&'\u0039' = '\uFF19'" // DIGIT NINE - "&'\u003A' = '\uFF1A'" // COLON - "&'\u003B' = '\uFF1B'" // SEMICOLON - "&'\u003C' = '\uFF1C'" // LESS-THAN SIGN - "&'\u003D' = '\uFF1D'" // EQUALS SIGN - "&'\u003E' = '\uFF1E'" // GREATER-THAN SIGN - "&'\u003F' = '\uFF1F'" // QUESTION MARK - "&'\u0040' = '\uFF20'" // COMMERCIAL AT - "&'\u0041' = '\uFF21'" // LATIN CAPITAL LETTER A - "&'\u0042' = '\uFF22'" // LATIN CAPITAL LETTER B - "&'\u0043' = '\uFF23'" // LATIN CAPITAL LETTER C - "&'\u0044' = '\uFF24'" // LATIN CAPITAL LETTER D - "&'\u0045' = '\uFF25'" // LATIN CAPITAL LETTER E - "&'\u0046' = '\uFF26'" // LATIN CAPITAL LETTER F - "&'\u0047' = '\uFF27'" // LATIN CAPITAL LETTER G - "&'\u0048' = '\uFF28'" // LATIN CAPITAL LETTER H - "&'\u0049' = '\uFF29'" // LATIN CAPITAL LETTER I - "&'\u004A' = '\uFF2A'" // LATIN CAPITAL LETTER J - "&'\u004B' = '\uFF2B'" // LATIN CAPITAL LETTER K - "&'\u004C' = '\uFF2C'" // LATIN CAPITAL LETTER L - "&'\u004D' = '\uFF2D'" // LATIN CAPITAL LETTER M - "&'\u004E' = '\uFF2E'" // LATIN CAPITAL LETTER N - "&'\u004F' = '\uFF2F'" // LATIN CAPITAL LETTER O - "&'\u0050' = '\uFF30'" // LATIN CAPITAL LETTER P - "&'\u0051' = '\uFF31'" // LATIN CAPITAL LETTER Q - "&'\u0052' = '\uFF32'" // LATIN CAPITAL LETTER R - "&'\u0053' = '\uFF33'" // LATIN CAPITAL LETTER S - "&'\u0054' = '\uFF34'" // LATIN CAPITAL LETTER T - "&'\u0055' = '\uFF35'" // LATIN CAPITAL LETTER U - "&'\u0056' = '\uFF36'" // LATIN CAPITAL LETTER V - "&'\u0057' = '\uFF37'" // LATIN CAPITAL LETTER W - "&'\u0058' = '\uFF38'" // LATIN CAPITAL LETTER X - "&'\u0059' = '\uFF39'" // LATIN CAPITAL LETTER Y - "&'\u005A' = '\uFF3A'" // LATIN CAPITAL LETTER Z - "&'\u005B' = '\uFF3B'" // LEFT SQUARE BRACKET - "&'\u005C' = '\uFF3C'" // REVERSE SOLIDUS - "&'\u005D' = '\uFF3D'" // RIGHT SQUARE BRACKET - "&'\u005E' = '\uFF3E'" // CIRCUMFLEX ACCENT - "&'\u005F' = '\uFF3F'" // LOW LINE - "&'\u0060' = '\uFF40'" // GRAVE ACCENT - "&'\u0061' = '\uFF41'" // LATIN SMALL LETTER A - "&'\u0062' = '\uFF42'" // LATIN SMALL LETTER B - "&'\u0063' = '\uFF43'" // LATIN SMALL LETTER C - "&'\u0064' = '\uFF44'" // LATIN SMALL LETTER D - "&'\u0065' = '\uFF45'" // LATIN SMALL LETTER E - "&'\u0066' = '\uFF46'" // LATIN SMALL LETTER F - "&'\u0067' = '\uFF47'" // LATIN SMALL LETTER G - "&'\u0068' = '\uFF48'" // LATIN SMALL LETTER H - "&'\u0069' = '\uFF49'" // LATIN SMALL LETTER I - "&'\u006A' = '\uFF4A'" // LATIN SMALL LETTER J - "&'\u006B' = '\uFF4B'" // LATIN SMALL LETTER K - "&'\u006C' = '\uFF4C'" // LATIN SMALL LETTER L - "&'\u006D' = '\uFF4D'" // LATIN SMALL LETTER M - "&'\u006E' = '\uFF4E'" // LATIN SMALL LETTER N - "&'\u006F' = '\uFF4F'" // LATIN SMALL LETTER O - "&'\u0070' = '\uFF50'" // LATIN SMALL LETTER P - "&'\u0071' = '\uFF51'" // LATIN SMALL LETTER Q - "&'\u0072' = '\uFF52'" // LATIN SMALL LETTER R - "&'\u0073' = '\uFF53'" // LATIN SMALL LETTER S - "&'\u0074' = '\uFF54'" // LATIN SMALL LETTER T - "&'\u0075' = '\uFF55'" // LATIN SMALL LETTER U - "&'\u0076' = '\uFF56'" // LATIN SMALL LETTER V - "&'\u0077' = '\uFF57'" // LATIN SMALL LETTER W - "&'\u0078' = '\uFF58'" // LATIN SMALL LETTER X - "&'\u0079' = '\uFF59'" // LATIN SMALL LETTER Y - "&'\u007A' = '\uFF5A'" // LATIN SMALL LETTER Z - "&'\u007B' = '\uFF5B'" // LEFT CURLY BRACKET - "&'\u007C' = '\uFF5C'" // VERTICAL LINE - "&'\u007D' = '\uFF5D'" // RIGHT CURLY BRACKET - "&'\u007E' = '\uFF5E'" // TILDE - "&'\u00A2' = '\uFFE0'" // CENT SIGN - "&'\u00A3' = '\uFFE1'" // POUND SIGN - "&'\u00A5' = '\uFFE5'" // YEN SIGN - "&'\u00A6' = '\uFFE4'" // BROKEN BAR - "&'\u00AC' = '\uFFE2'" // NOT SIGN - "&'\u1100' = '\uFFA1'" // HANGUL CHOSEONG KIYEOK - "&'\u1101' = '\uFFA2'" // HANGUL CHOSEONG SSANGKIYEOK - "&'\u1102' = '\uFFA4'" // HANGUL CHOSEONG NIEUN - "&'\u1103' = '\uFFA7'" // HANGUL CHOSEONG TIKEUT - "&'\u1104' = '\uFFA8'" // HANGUL CHOSEONG SSANGTIKEUT - "&'\u1105' = '\uFFA9'" // HANGUL CHOSEONG RIEUL - "&'\u1106' = '\uFFB1'" // HANGUL CHOSEONG MIEUM - "&'\u1107' = '\uFFB2'" // HANGUL CHOSEONG PIEUP - "&'\u1108' = '\uFFB3'" // HANGUL CHOSEONG SSANGPIEUP - "&'\u1109' = '\uFFB5'" // HANGUL CHOSEONG SIOS - "&'\u110A' = '\uFFB6'" // HANGUL CHOSEONG SSANGSIOS - "&'\u110B' = '\uFFB7'" // HANGUL CHOSEONG IEUNG - "&'\u110C' = '\uFFB8'" // HANGUL CHOSEONG CIEUC - "&'\u110D' = '\uFFB9'" // HANGUL CHOSEONG SSANGCIEUC - "&'\u110E' = '\uFFBA'" // HANGUL CHOSEONG CHIEUCH - "&'\u110F' = '\uFFBB'" // HANGUL CHOSEONG KHIEUKH - "&'\u1110' = '\uFFBC'" // HANGUL CHOSEONG THIEUTH - "&'\u1111' = '\uFFBD'" // HANGUL CHOSEONG PHIEUPH - "&'\u1112' = '\uFFBE'" // HANGUL CHOSEONG HIEUH - "&'\u111A' = '\uFFB0'" // HANGUL CHOSEONG RIEUL-HIEUH - "&'\u1121' = '\uFFB4'" // HANGUL CHOSEONG PIEUP-SIOS - "&'\u1160' = '\uFFA0'" // HANGUL JUNGSEONG FILLER - "&'\u1161' = '\uFFC2'" // HANGUL JUNGSEONG A - "&'\u1162' = '\uFFC3'" // HANGUL JUNGSEONG AE - "&'\u1163' = '\uFFC4'" // HANGUL JUNGSEONG YA - "&'\u1164' = '\uFFC5'" // HANGUL JUNGSEONG YAE - "&'\u1165' = '\uFFC6'" // HANGUL JUNGSEONG EO - "&'\u1166' = '\uFFC7'" // HANGUL JUNGSEONG E - "&'\u1167' = '\uFFCA'" // HANGUL JUNGSEONG YEO - "&'\u1168' = '\uFFCB'" // HANGUL JUNGSEONG YE - "&'\u1169' = '\uFFCC'" // HANGUL JUNGSEONG O - "&'\u116A' = '\uFFCD'" // HANGUL JUNGSEONG WA - "&'\u116B' = '\uFFCE'" // HANGUL JUNGSEONG WAE - "&'\u116C' = '\uFFCF'" // HANGUL JUNGSEONG OE - "&'\u116D' = '\uFFD2'" // HANGUL JUNGSEONG YO - "&'\u116E' = '\uFFD3'" // HANGUL JUNGSEONG U - "&'\u116F' = '\uFFD4'" // HANGUL JUNGSEONG WEO - "&'\u1170' = '\uFFD5'" // HANGUL JUNGSEONG WE - "&'\u1171' = '\uFFD6'" // HANGUL JUNGSEONG WI - "&'\u1172' = '\uFFD7'" // HANGUL JUNGSEONG YU - "&'\u1173' = '\uFFDA'" // HANGUL JUNGSEONG EU - "&'\u1174' = '\uFFDB'" // HANGUL JUNGSEONG YI - "&'\u1175' = '\uFFDC'" // HANGUL JUNGSEONG I - "&'\u11AA' = '\uFFA3'" // HANGUL JONGSEONG KIYEOK-SIOS - "&'\u11AC' = '\uFFA5'" // HANGUL JONGSEONG NIEUN-CIEUC - "&'\u11AD' = '\uFFA6'" // HANGUL JONGSEONG NIEUN-HIEUH - "&'\u11B0' = '\uFFAA'" // HANGUL JONGSEONG RIEUL-KIYEOK - "&'\u11B1' = '\uFFAB'" // HANGUL JONGSEONG RIEUL-MIEUM - "&'\u11B2' = '\uFFAC'" // HANGUL JONGSEONG RIEUL-PIEUP - "&'\u11B3' = '\uFFAD'" // HANGUL JONGSEONG RIEUL-SIOS - "&'\u11B4' = '\uFFAE'" // HANGUL JONGSEONG RIEUL-THIEUTH - "&'\u11B5' = '\uFFAF'" // HANGUL JONGSEONG RIEUL-PHIEUPH - "&'\u20A9' = '\uFFE6'" // WON SIGN - "&'\u2190' = '\uFFE9'" // LEFTWARDS ARROW - "&'\u2191' = '\uFFEA'" // UPWARDS ARROW - "&'\u2192' = '\uFFEB'" // RIGHTWARDS ARROW - "&'\u2193' = '\uFFEC'" // DOWNWARDS ARROW - "&'\u2502' = '\uFFE8'" // BOX DRAWINGS LIGHT VERTICAL - "&'\u25A0' = '\uFFED'" // BLACK SQUARE - "&'\u25CB' = '\uFFEE'" // WHITE CIRCLE - "&'\u3001' = '\uFF64'" // IDEOGRAPHIC COMMA - "&'\u3002' = '\uFF61'" // IDEOGRAPHIC FULL STOP - "&'\u300C' = '\uFF62'" // LEFT CORNER BRACKET - "&'\u300D' = '\uFF63'" // RIGHT CORNER BRACKET - - // Kanji, positioned over the top - "& [top] " - "<\u4e9c<\u5516<\u5a03<\u963f<\u54c0<\u611b<\u6328<\u59f6<\u9022" - "<\u8475<\u831c<\u7a50<\u60aa<\u63e1<\u6e25<\u65ed<\u8466<\u82a6" - "<\u9bf5<\u6893<\u5727<\u65a1<\u6271<\u5b9b<\u59d0<\u867b<\u98f4" - "<\u7d62<\u7dbe<\u9b8e<\u6216<\u7c9f<\u88b7<\u5b89<\u5eb5<\u6309" - "<\u6697<\u6848<\u95c7<\u978d<\u674f<\u4ee5<\u4f0a<\u4f4d<\u4f9d" - "<\u5049<\u56f2<\u5937<\u59d4<\u5a01<\u5c09<\u60df<\u610f<\u6170" - "<\u6613<\u6905<\u70ba<\u754f<\u7570<\u79fb<\u7dad<\u7def<\u80c3" - "<\u840e<\u8863<\u8b02<\u9055<\u907a<\u533b<\u4e95<\u4ea5<\u57df" - "<\u80b2<\u90c1<\u78ef<\u4e00<\u58f1<\u6ea2<\u9038<\u7a32<\u8328" - "<\u828b<\u9c2f<\u5141<\u5370<\u54bd<\u54e1<\u56e0<\u59fb<\u5f15" - "<\u98f2<\u6deb<\u80e4<\u852d<\u9662<\u9670<\u96a0<\u97fb<\u540b" - "<\u53f3<\u5b87<\u70cf<\u7fbd<\u8fc2<\u96e8<\u536f<\u9d5c<\u7aba" - "<\u4e11<\u7893<\u81fc<\u6e26<\u5618<\u5504<\u6b1d<\u851a<\u9c3b" - "<\u59e5<\u53a9<\u6d66<\u74dc<\u958f<\u5642<\u4e91<\u904b<\u96f2" - "<\u834f<\u990c<\u53e1<\u55b6<\u5b30<\u5f71<\u6620<\u66f3<\u6804" - "<\u6c38<\u6cf3<\u6d29<\u745b<\u76c8<\u7a4e<\u9834<\u82f1<\u885b" - "<\u8a60<\u92ed<\u6db2<\u75ab<\u76ca<\u99c5<\u60a6<\u8b01<\u8d8a" - "<\u95b2<\u698e<\u53ad<\u5186<\u5712<\u5830<\u5944<\u5bb4<\u5ef6" - "<\u6028<\u63a9<\u63f4<\u6cbf<\u6f14<\u708e<\u7114<\u7159<\u71d5" - "<\u733f<\u7e01<\u8276<\u82d1<\u8597<\u9060<\u925b<\u9d1b<\u5869" - "<\u65bc<\u6c5a<\u7525<\u51f9<\u592e<\u5965<\u5f80<\u5fdc<\u62bc" - "<\u65fa<\u6a2a<\u6b27<\u6bb4<\u738b<\u7fc1<\u8956<\u9d2c<\u9d0e" - "<\u9ec4<\u5ca1<\u6c96<\u837b<\u5104<\u5c4b<\u61b6<\u81c6<\u6876" - "<\u7261<\u4e59<\u4ffa<\u5378<\u6069<\u6e29<\u7a4f<\u97f3<\u4e0b" - "<\u5316<\u4eee<\u4f55<\u4f3d<\u4fa1<\u4f73<\u52a0<\u53ef<\u5609" - "<\u590f<\u5ac1<\u5bb6<\u5be1<\u79d1<\u6687<\u679c<\u67b6<\u6b4c" - "<\u6cb3<\u706b<\u73c2<\u798d<\u79be<\u7a3c<\u7b87<\u82b1<\u82db" - "<\u8304<\u8377<\u83ef<\u83d3<\u8766<\u8ab2<\u5629<\u8ca8<\u8fe6" - "<\u904e<\u971e<\u868a<\u4fc4<\u5ce8<\u6211<\u7259<\u753b<\u81e5" - "<\u82bd<\u86fe<\u8cc0<\u96c5<\u9913<\u99d5<\u4ecb<\u4f1a<\u89e3" - "<\u56de<\u584a<\u58ca<\u5efb<\u5feb<\u602a<\u6094<\u6062<\u61d0" - "<\u6212<\u62d0<\u6539<\u9b41<\u6666<\u68b0<\u6d77<\u7070<\u754c" - "<\u7686<\u7d75<\u82a5<\u87f9<\u958b<\u968e<\u8c9d<\u51f1<\u52be" - "<\u5916<\u54b3<\u5bb3<\u5d16<\u6168<\u6982<\u6daf<\u788d<\u84cb" - "<\u8857<\u8a72<\u93a7<\u9ab8<\u6d6c<\u99a8<\u86d9<\u57a3<\u67ff" - "<\u86ce<\u920e<\u5283<\u5687<\u5404<\u5ed3<\u62e1<\u64b9<\u683c" - "<\u6838<\u6bbb<\u7372<\u78ba<\u7a6b<\u899a<\u89d2<\u8d6b<\u8f03" - "<\u90ed<\u95a3<\u9694<\u9769<\u5b66<\u5cb3<\u697d<\u984d<\u984e" - "<\u639b<\u7b20<\u6a2b<\u6a7f<\u68b6<\u9c0d<\u6f5f<\u5272<\u559d" - "<\u6070<\u62ec<\u6d3b<\u6e07<\u6ed1<\u845b<\u8910<\u8f44<\u4e14" - "<\u9c39<\u53f6<\u691b<\u6a3a<\u9784<\u682a<\u515c<\u7ac3<\u84b2" - "<\u91dc<\u938c<\u565b<\u9d28<\u6822<\u8305<\u8431<\u7ca5<\u5208" - "<\u82c5<\u74e6<\u4e7e<\u4f83<\u51a0<\u5bd2<\u520a<\u52d8<\u52e7" - "<\u5dfb<\u559a<\u582a<\u59e6<\u5b8c<\u5b98<\u5bdb<\u5e72<\u5e79" - "<\u60a3<\u611f<\u6163<\u61be<\u63db<\u6562<\u67d1<\u6853<\u68fa" - "<\u6b3e<\u6b53<\u6c57<\u6f22<\u6f97<\u6f45<\u74b0<\u7518<\u76e3" - "<\u770b<\u7aff<\u7ba1<\u7c21<\u7de9<\u7f36<\u7ff0<\u809d<\u8266" - "<\u839e<\u89b3<\u8acc<\u8cab<\u9084<\u9451<\u9593<\u9591<\u95a2" - "<\u9665<\u97d3<\u9928<\u8218<\u4e38<\u542b<\u5cb8<\u5dcc<\u73a9" - "<\u764c<\u773c<\u5ca9<\u7feb<\u8d0b<\u96c1<\u9811<\u9854<\u9858" - "<\u4f01<\u4f0e<\u5371<\u559c<\u5668<\u57fa<\u5947<\u5b09<\u5bc4" - "<\u5c90<\u5e0c<\u5e7e<\u5fcc<\u63ee<\u673a<\u65d7<\u65e2<\u671f" - "<\u68cb<\u68c4<\u6a5f<\u5e30<\u6bc5<\u6c17<\u6c7d<\u757f<\u7948" - "<\u5b63<\u7a00<\u7d00<\u5fbd<\u898f<\u8a18<\u8cb4<\u8d77<\u8ecc" - "<\u8f1d<\u98e2<\u9a0e<\u9b3c<\u4e80<\u507d<\u5100<\u5993<\u5b9c" - "<\u622f<\u6280<\u64ec<\u6b3a<\u72a0<\u7591<\u7947<\u7fa9<\u87fb" - "<\u8abc<\u8b70<\u63ac<\u83ca<\u97a0<\u5409<\u5403<\u55ab<\u6854" - "<\u6a58<\u8a70<\u7827<\u6775<\u9ecd<\u5374<\u5ba2<\u811a<\u8650" - "<\u9006<\u4e18<\u4e45<\u4ec7<\u4f11<\u53ca<\u5438<\u5bae<\u5f13" - "<\u6025<\u6551<\u673d<\u6c42<\u6c72<\u6ce3<\u7078<\u7403<\u7a76" - "<\u7aae<\u7b08<\u7d1a<\u7cfe<\u7d66<\u65e7<\u725b<\u53bb<\u5c45" - "<\u5de8<\u62d2<\u62e0<\u6319<\u6e20<\u865a<\u8a31<\u8ddd<\u92f8" - "<\u6f01<\u79a6<\u9b5a<\u4ea8<\u4eab<\u4eac<\u4f9b<\u4fa0<\u50d1" - "<\u5147<\u7af6<\u5171<\u51f6<\u5354<\u5321<\u537f<\u53eb<\u55ac" - "<\u5883<\u5ce1<\u5f37<\u5f4a<\u602f<\u6050<\u606d<\u631f<\u6559" - "<\u6a4b<\u6cc1<\u72c2<\u72ed<\u77ef<\u80f8<\u8105<\u8208<\u854e" - "<\u90f7<\u93e1<\u97ff<\u9957<\u9a5a<\u4ef0<\u51dd<\u5c2d<\u6681" - "<\u696d<\u5c40<\u66f2<\u6975<\u7389<\u6850<\u7c81<\u50c5<\u52e4" - "<\u5747<\u5dfe<\u9326<\u65a4<\u6b23<\u6b3d<\u7434<\u7981<\u79bd" - "<\u7b4b<\u7dca<\u82b9<\u83cc<\u887f<\u895f<\u8b39<\u8fd1<\u91d1" - "<\u541f<\u9280<\u4e5d<\u5036<\u53e5<\u533a<\u72d7<\u7396<\u77e9" - "<\u82e6<\u8eaf<\u99c6<\u99c8<\u99d2<\u5177<\u611a<\u865e<\u55b0" - "<\u7a7a<\u5076<\u5bd3<\u9047<\u9685<\u4e32<\u6adb<\u91e7<\u5c51" - "<\u5c48<\u6398<\u7a9f<\u6c93<\u9774<\u8f61<\u7aaa<\u718a<\u9688" - "<\u7c82<\u6817<\u7e70<\u6851<\u936c<\u52f2<\u541b<\u85ab<\u8a13" - "<\u7fa4<\u8ecd<\u90e1<\u5366<\u8888<\u7941<\u4fc2<\u50be<\u5211" - "<\u5144<\u5553<\u572d<\u73ea<\u578b<\u5951<\u5f62<\u5f84<\u6075" - "<\u6176<\u6167<\u61a9<\u63b2<\u643a<\u656c<\u666f<\u6842<\u6e13" - "<\u7566<\u7a3d<\u7cfb<\u7d4c<\u7d99<\u7e4b<\u7f6b<\u830e<\u834a" - "<\u86cd<\u8a08<\u8a63<\u8b66<\u8efd<\u981a<\u9d8f<\u82b8<\u8fce" - "<\u9be8<\u5287<\u621f<\u6483<\u6fc0<\u9699<\u6841<\u5091<\u6b20" - "<\u6c7a<\u6f54<\u7a74<\u7d50<\u8840<\u8a23<\u6708<\u4ef6<\u5039" - "<\u5026<\u5065<\u517c<\u5238<\u5263<\u55a7<\u570f<\u5805<\u5acc" - "<\u5efa<\u61b2<\u61f8<\u62f3<\u6372<\u691c<\u6a29<\u727d<\u72ac" - "<\u732e<\u7814<\u786f<\u7d79<\u770c<\u80a9<\u898b<\u8b19<\u8ce2" - "<\u8ed2<\u9063<\u9375<\u967a<\u9855<\u9a13<\u9e78<\u5143<\u539f" - "<\u53b3<\u5e7b<\u5f26<\u6e1b<\u6e90<\u7384<\u73fe<\u7d43<\u8237" - "<\u8a00<\u8afa<\u9650<\u4e4e<\u500b<\u53e4<\u547c<\u56fa<\u59d1" - "<\u5b64<\u5df1<\u5eab<\u5f27<\u6238<\u6545<\u67af<\u6e56<\u72d0" - "<\u7cca<\u88b4<\u80a1<\u80e1<\u83f0<\u864e<\u8a87<\u8de8<\u9237" - "<\u96c7<\u9867<\u9f13<\u4e94<\u4e92<\u4f0d<\u5348<\u5449<\u543e" - "<\u5a2f<\u5f8c<\u5fa1<\u609f<\u68a7<\u6a8e<\u745a<\u7881<\u8a9e" - "<\u8aa4<\u8b77<\u9190<\u4e5e<\u9bc9<\u4ea4<\u4f7c<\u4faf<\u5019" - "<\u5016<\u5149<\u516c<\u529f<\u52b9<\u52fe<\u539a<\u53e3<\u5411" - "<\u540e<\u5589<\u5751<\u57a2<\u597d<\u5b54<\u5b5d<\u5b8f<\u5de5" - "<\u5de7<\u5df7<\u5e78<\u5e83<\u5e9a<\u5eb7<\u5f18<\u6052<\u614c" - "<\u6297<\u62d8<\u63a7<\u653b<\u6602<\u6643<\u66f4<\u676d<\u6821" - "<\u6897<\u69cb<\u6c5f<\u6d2a<\u6d69<\u6e2f<\u6e9d<\u7532<\u7687" - "<\u786c<\u7a3f<\u7ce0<\u7d05<\u7d18<\u7d5e<\u7db1<\u8015<\u8003" - "<\u80af<\u80b1<\u8154<\u818f<\u822a<\u8352<\u884c<\u8861<\u8b1b" - "<\u8ca2<\u8cfc<\u90ca<\u9175<\u9271<\u783f<\u92fc<\u95a4<\u964d" - "<\u9805<\u9999<\u9ad8<\u9d3b<\u525b<\u52ab<\u53f7<\u5408<\u58d5" - "<\u62f7<\u6fe0<\u8c6a<\u8f5f<\u9eb9<\u514b<\u523b<\u544a<\u56fd" - "<\u7a40<\u9177<\u9d60<\u9ed2<\u7344<\u6f09<\u8170<\u7511<\u5ffd" - "<\u60da<\u9aa8<\u72db<\u8fbc<\u6b64<\u9803<\u4eca<\u56f0<\u5764" - "<\u58be<\u5a5a<\u6068<\u61c7<\u660f<\u6606<\u6839<\u68b1<\u6df7" - "<\u75d5<\u7d3a<\u826e<\u9b42<\u4e9b<\u4f50<\u53c9<\u5506<\u5d6f" - "<\u5de6<\u5dee<\u67fb<\u6c99<\u7473<\u7802<\u8a50<\u9396<\u88df" - "<\u5750<\u5ea7<\u632b<\u50b5<\u50ac<\u518d<\u6700<\u54c9<\u585e" - "<\u59bb<\u5bb0<\u5f69<\u624d<\u63a1<\u683d<\u6b73<\u6e08<\u707d" - "<\u91c7<\u7280<\u7815<\u7826<\u796d<\u658e<\u7d30<\u83dc<\u88c1" - "<\u8f09<\u969b<\u5264<\u5728<\u6750<\u7f6a<\u8ca1<\u51b4<\u5742" - "<\u962a<\u583a<\u698a<\u80b4<\u54b2<\u5d0e<\u57fc<\u7895<\u9dfa" - "<\u4f5c<\u524a<\u548b<\u643e<\u6628<\u6714<\u67f5<\u7a84<\u7b56" - "<\u7d22<\u932f<\u685c<\u9bad<\u7b39<\u5319<\u518a<\u5237<\u5bdf" - "<\u62f6<\u64ae<\u64e6<\u672d<\u6bba<\u85a9<\u96d1<\u7690<\u9bd6" - "<\u634c<\u9306<\u9bab<\u76bf<\u6652<\u4e09<\u5098<\u53c2<\u5c71" - "<\u60e8<\u6492<\u6563<\u685f<\u71e6<\u73ca<\u7523<\u7b97<\u7e82" - "<\u8695<\u8b83<\u8cdb<\u9178<\u9910<\u65ac<\u66ab<\u6b8b<\u4ed5" - "<\u4ed4<\u4f3a<\u4f7f<\u523a<\u53f8<\u53f2<\u55e3<\u56db<\u58eb" - "<\u59cb<\u59c9<\u59ff<\u5b50<\u5c4d<\u5e02<\u5e2b<\u5fd7<\u601d" - "<\u6307<\u652f<\u5b5c<\u65af<\u65bd<\u65e8<\u679d<\u6b62<\u6b7b" - "<\u6c0f<\u7345<\u7949<\u79c1<\u7cf8<\u7d19<\u7d2b<\u80a2<\u8102" - "<\u81f3<\u8996<\u8a5e<\u8a69<\u8a66<\u8a8c<\u8aee<\u8cc7<\u8cdc" - "<\u96cc<\u98fc<\u6b6f<\u4e8b<\u4f3c<\u4f8d<\u5150<\u5b57<\u5bfa" - "<\u6148<\u6301<\u6642<\u6b21<\u6ecb<\u6cbb<\u723e<\u74bd<\u75d4" - "<\u78c1<\u793a<\u800c<\u8033<\u81ea<\u8494<\u8f9e<\u6c50<\u9e7f" - "<\u5f0f<\u8b58<\u9d2b<\u7afa<\u8ef8<\u5b8d<\u96eb<\u4e03<\u53f1" - "<\u57f7<\u5931<\u5ac9<\u5ba4<\u6089<\u6e7f<\u6f06<\u75be<\u8cea" - "<\u5b9f<\u8500<\u7be0<\u5072<\u67f4<\u829d<\u5c61<\u854a<\u7e1e" - "<\u820e<\u5199<\u5c04<\u6368<\u8d66<\u659c<\u716e<\u793e<\u7d17" - "<\u8005<\u8b1d<\u8eca<\u906e<\u86c7<\u90aa<\u501f<\u52fa<\u5c3a" - "<\u6753<\u707c<\u7235<\u914c<\u91c8<\u932b<\u82e5<\u5bc2<\u5f31" - "<\u60f9<\u4e3b<\u53d6<\u5b88<\u624b<\u6731<\u6b8a<\u72e9<\u73e0" - "<\u7a2e<\u816b<\u8da3<\u9152<\u9996<\u5112<\u53d7<\u546a<\u5bff" - "<\u6388<\u6a39<\u7dac<\u9700<\u56da<\u53ce<\u5468<\u5b97<\u5c31" - "<\u5dde<\u4fee<\u6101<\u62fe<\u6d32<\u79c0<\u79cb<\u7d42<\u7e4d" - "<\u7fd2<\u81ed<\u821f<\u8490<\u8846<\u8972<\u8b90<\u8e74<\u8f2f" - "<\u9031<\u914b<\u916c<\u96c6<\u919c<\u4ec0<\u4f4f<\u5145<\u5341" - "<\u5f93<\u620e<\u67d4<\u6c41<\u6e0b<\u7363<\u7e26<\u91cd<\u9283" - "<\u53d4<\u5919<\u5bbf<\u6dd1<\u795d<\u7e2e<\u7c9b<\u587e<\u719f" - "<\u51fa<\u8853<\u8ff0<\u4fca<\u5cfb<\u6625<\u77ac<\u7ae3<\u821c" - "<\u99ff<\u51c6<\u5faa<\u65ec<\u696f<\u6b89<\u6df3<\u6e96<\u6f64" - "<\u76fe<\u7d14<\u5de1<\u9075<\u9187<\u9806<\u51e6<\u521d<\u6240" - "<\u6691<\u66d9<\u6e1a<\u5eb6<\u7dd2<\u7f72<\u66f8<\u85af<\u85f7" - "<\u8af8<\u52a9<\u53d9<\u5973<\u5e8f<\u5f90<\u6055<\u92e4<\u9664" - "<\u50b7<\u511f<\u52dd<\u5320<\u5347<\u53ec<\u54e8<\u5546<\u5531" - "<\u5617<\u5968<\u59be<\u5a3c<\u5bb5<\u5c06<\u5c0f<\u5c11<\u5c1a" - "<\u5e84<\u5e8a<\u5ee0<\u5f70<\u627f<\u6284<\u62db<\u638c<\u6377" - "<\u6607<\u660c<\u662d<\u6676<\u677e<\u68a2<\u6a1f<\u6a35<\u6cbc" - "<\u6d88<\u6e09<\u6e58<\u713c<\u7126<\u7167<\u75c7<\u7701<\u785d" - "<\u7901<\u7965<\u79f0<\u7ae0<\u7b11<\u7ca7<\u7d39<\u8096<\u83d6" - "<\u848b<\u8549<\u885d<\u88f3<\u8a1f<\u8a3c<\u8a54<\u8a73<\u8c61" - "<\u8cde<\u91a4<\u9266<\u937e<\u9418<\u969c<\u9798<\u4e0a<\u4e08" - "<\u4e1e<\u4e57<\u5197<\u5270<\u57ce<\u5834<\u58cc<\u5b22<\u5e38" - "<\u60c5<\u64fe<\u6761<\u6756<\u6d44<\u72b6<\u7573<\u7a63<\u84b8" - "<\u8b72<\u91b8<\u9320<\u5631<\u57f4<\u98fe<\u62ed<\u690d<\u6b96" - "<\u71ed<\u7e54<\u8077<\u8272<\u89e6<\u98df<\u8755<\u8fb1<\u5c3b" - "<\u4f38<\u4fe1<\u4fb5<\u5507<\u5a20<\u5bdd<\u5be9<\u5fc3<\u614e" - "<\u632f<\u65b0<\u664b<\u68ee<\u699b<\u6d78<\u6df1<\u7533<\u75b9" - "<\u771f<\u795e<\u79e6<\u7d33<\u81e3<\u82af<\u85aa<\u89aa<\u8a3a" - "<\u8eab<\u8f9b<\u9032<\u91dd<\u9707<\u4eba<\u4ec1<\u5203<\u5875" - "<\u58ec<\u5c0b<\u751a<\u5c3d<\u814e<\u8a0a<\u8fc5<\u9663<\u976d" - "<\u7b25<\u8acf<\u9808<\u9162<\u56f3<\u53a8<\u9017<\u5439<\u5782" - "<\u5e25<\u63a8<\u6c34<\u708a<\u7761<\u7c8b<\u7fe0<\u8870<\u9042" - "<\u9154<\u9310<\u9318<\u968f<\u745e<\u9ac4<\u5d07<\u5d69<\u6570" - "<\u67a2<\u8da8<\u96db<\u636e<\u6749<\u6919<\u83c5<\u9817<\u96c0" - "<\u88fe<\u6f84<\u647a<\u5bf8<\u4e16<\u702c<\u755d<\u662f<\u51c4" - "<\u5236<\u52e2<\u59d3<\u5f81<\u6027<\u6210<\u653f<\u6574<\u661f" - "<\u6674<\u68f2<\u6816<\u6b63<\u6e05<\u7272<\u751f<\u76db<\u7cbe" - "<\u8056<\u58f0<\u88fd<\u897f<\u8aa0<\u8a93<\u8acb<\u901d<\u9192" - "<\u9752<\u9759<\u6589<\u7a0e<\u8106<\u96bb<\u5e2d<\u60dc<\u621a" - "<\u65a5<\u6614<\u6790<\u77f3<\u7a4d<\u7c4d<\u7e3e<\u810a<\u8cac" - "<\u8d64<\u8de1<\u8e5f<\u78a9<\u5207<\u62d9<\u63a5<\u6442<\u6298" - "<\u8a2d<\u7a83<\u7bc0<\u8aac<\u96ea<\u7d76<\u820c<\u8749<\u4ed9" - "<\u5148<\u5343<\u5360<\u5ba3<\u5c02<\u5c16<\u5ddd<\u6226<\u6247" - "<\u64b0<\u6813<\u6834<\u6cc9<\u6d45<\u6d17<\u67d3<\u6f5c<\u714e" - "<\u717d<\u65cb<\u7a7f<\u7bad<\u7dda<\u7e4a<\u7fa8<\u817a<\u821b" - "<\u8239<\u85a6<\u8a6e<\u8cce<\u8df5<\u9078<\u9077<\u92ad<\u9291" - "<\u9583<\u9bae<\u524d<\u5584<\u6f38<\u7136<\u5168<\u7985<\u7e55" - "<\u81b3<\u7cce<\u564c<\u5851<\u5ca8<\u63aa<\u66fe<\u66fd<\u695a" - "<\u72d9<\u758f<\u758e<\u790e<\u7956<\u79df<\u7c97<\u7d20<\u7d44" - "<\u8607<\u8a34<\u963b<\u9061<\u9f20<\u50e7<\u5275<\u53cc<\u53e2" - "<\u5009<\u55aa<\u58ee<\u594f<\u723d<\u5b8b<\u5c64<\u531d<\u60e3" - "<\u60f3<\u635c<\u6383<\u633f<\u63bb<\u64cd<\u65e9<\u66f9<\u5de3" - "<\u69cd<\u69fd<\u6f15<\u71e5<\u4e89<\u75e9<\u76f8<\u7a93<\u7cdf" - "<\u7dcf<\u7d9c<\u8061<\u8349<\u8358<\u846c<\u84bc<\u85fb<\u88c5" - "<\u8d70<\u9001<\u906d<\u9397<\u971c<\u9a12<\u50cf<\u5897<\u618e" - "<\u81d3<\u8535<\u8d08<\u9020<\u4fc3<\u5074<\u5247<\u5373<\u606f" - "<\u6349<\u675f<\u6e2c<\u8db3<\u901f<\u4fd7<\u5c5e<\u8cca<\u65cf" - "<\u7d9a<\u5352<\u8896<\u5176<\u63c3<\u5b58<\u5b6b<\u5c0a<\u640d" - "<\u6751<\u905c<\u4ed6<\u591a<\u592a<\u6c70<\u8a51<\u553e<\u5815" - "<\u59a5<\u60f0<\u6253<\u67c1<\u8235<\u6955<\u9640<\u99c4<\u9a28" - "<\u4f53<\u5806<\u5bfe<\u8010<\u5cb1<\u5e2f<\u5f85<\u6020<\u614b" - "<\u6234<\u66ff<\u6cf0<\u6ede<\u80ce<\u817f<\u82d4<\u888b<\u8cb8" - "<\u9000<\u902e<\u968a<\u9edb<\u9bdb<\u4ee3<\u53f0<\u5927<\u7b2c" - "<\u918d<\u984c<\u9df9<\u6edd<\u7027<\u5353<\u5544<\u5b85<\u6258" - "<\u629e<\u62d3<\u6ca2<\u6fef<\u7422<\u8a17<\u9438<\u6fc1<\u8afe" - "<\u8338<\u51e7<\u86f8<\u53ea<\u53e9<\u4f46<\u9054<\u8fb0<\u596a" - "<\u8131<\u5dfd<\u7aea<\u8fbf<\u68da<\u8c37<\u72f8<\u9c48<\u6a3d" - "<\u8ab0<\u4e39<\u5358<\u5606<\u5766<\u62c5<\u63a2<\u65e6<\u6b4e" - "<\u6de1<\u6e5b<\u70ad<\u77ed<\u7aef<\u7baa<\u7dbb<\u803d<\u80c6" - "<\u86cb<\u8a95<\u935b<\u56e3<\u58c7<\u5f3e<\u65ad<\u6696<\u6a80" - "<\u6bb5<\u7537<\u8ac7<\u5024<\u77e5<\u5730<\u5f1b<\u6065<\u667a" - "<\u6c60<\u75f4<\u7a1a<\u7f6e<\u81f4<\u8718<\u9045<\u99b3<\u7bc9" - "<\u755c<\u7af9<\u7b51<\u84c4<\u9010<\u79e9<\u7a92<\u8336<\u5ae1" - "<\u7740<\u4e2d<\u4ef2<\u5b99<\u5fe0<\u62bd<\u663c<\u67f1<\u6ce8" - "<\u866b<\u8877<\u8a3b<\u914e<\u92f3<\u99d0<\u6a17<\u7026<\u732a" - "<\u82e7<\u8457<\u8caf<\u4e01<\u5146<\u51cb<\u558b<\u5bf5<\u5e16" - "<\u5e33<\u5e81<\u5f14<\u5f35<\u5f6b<\u5fb4<\u61f2<\u6311<\u66a2" - "<\u671d<\u6f6e<\u7252<\u753a<\u773a<\u8074<\u8139<\u8178<\u8776" - "<\u8abf<\u8adc<\u8d85<\u8df3<\u929a<\u9577<\u9802<\u9ce5<\u52c5" - "<\u6357<\u76f4<\u6715<\u6c88<\u73cd<\u8cc3<\u93ae<\u9673<\u6d25" - "<\u589c<\u690e<\u69cc<\u8ffd<\u939a<\u75db<\u901a<\u585a<\u6802" - "<\u63b4<\u69fb<\u4f43<\u6f2c<\u67d8<\u8fbb<\u8526<\u7db4<\u9354" - "<\u693f<\u6f70<\u576a<\u58f7<\u5b2c<\u7d2c<\u722a<\u540a<\u91e3" - "<\u9db4<\u4ead<\u4f4e<\u505c<\u5075<\u5243<\u8c9e<\u5448<\u5824" - "<\u5b9a<\u5e1d<\u5e95<\u5ead<\u5ef7<\u5f1f<\u608c<\u62b5<\u633a" - "<\u63d0<\u68af<\u6c40<\u7887<\u798e<\u7a0b<\u7de0<\u8247<\u8a02" - "<\u8ae6<\u8e44<\u9013<\u90b8<\u912d<\u91d8<\u9f0e<\u6ce5<\u6458" - "<\u64e2<\u6575<\u6ef4<\u7684<\u7b1b<\u9069<\u93d1<\u6eba<\u54f2" - "<\u5fb9<\u64a4<\u8f4d<\u8fed<\u9244<\u5178<\u586b<\u5929<\u5c55" - "<\u5e97<\u6dfb<\u7e8f<\u751c<\u8cbc<\u8ee2<\u985b<\u70b9<\u4f1d" - "<\u6bbf<\u6fb1<\u7530<\u96fb<\u514e<\u5410<\u5835<\u5857<\u59ac" - "<\u5c60<\u5f92<\u6597<\u675c<\u6e21<\u767b<\u83df<\u8ced<\u9014" - "<\u90fd<\u934d<\u7825<\u783a<\u52aa<\u5ea6<\u571f<\u5974<\u6012" - "<\u5012<\u515a<\u51ac<\u51cd<\u5200<\u5510<\u5854<\u5858<\u5957" - "<\u5b95<\u5cf6<\u5d8b<\u60bc<\u6295<\u642d<\u6771<\u6843<\u68bc" - "<\u68df<\u76d7<\u6dd8<\u6e6f<\u6d9b<\u706f<\u71c8<\u5f53<\u75d8" - "<\u7977<\u7b49<\u7b54<\u7b52<\u7cd6<\u7d71<\u5230<\u8463<\u8569" - "<\u85e4<\u8a0e<\u8b04<\u8c46<\u8e0f<\u9003<\u900f<\u9419<\u9676" - "<\u982d<\u9a30<\u95d8<\u50cd<\u52d5<\u540c<\u5802<\u5c0e<\u61a7" - "<\u649e<\u6d1e<\u77b3<\u7ae5<\u80f4<\u8404<\u9053<\u9285<\u5ce0" - "<\u9d07<\u533f<\u5f97<\u5fb3<\u6d9c<\u7279<\u7763<\u79bf<\u7be4" - "<\u6bd2<\u72ec<\u8aad<\u6803<\u6a61<\u51f8<\u7a81<\u6934<\u5c4a" - "<\u9cf6<\u82eb<\u5bc5<\u9149<\u701e<\u5678<\u5c6f<\u60c7<\u6566" - "<\u6c8c<\u8c5a<\u9041<\u9813<\u5451<\u66c7<\u920d<\u5948<\u90a3" - "<\u5185<\u4e4d<\u51ea<\u8599<\u8b0e<\u7058<\u637a<\u934b<\u6962" - "<\u99b4<\u7e04<\u7577<\u5357<\u6960<\u8edf<\u96e3<\u6c5d<\u4e8c" - "<\u5c3c<\u5f10<\u8fe9<\u5302<\u8cd1<\u8089<\u8679<\u5eff<\u65e5" - "<\u4e73<\u5165<\u5982<\u5c3f<\u97ee<\u4efb<\u598a<\u5fcd<\u8a8d" - "<\u6fe1<\u79b0<\u7962<\u5be7<\u8471<\u732b<\u71b1<\u5e74<\u5ff5" - "<\u637b<\u649a<\u71c3<\u7c98<\u4e43<\u5efc<\u4e4b<\u57dc<\u56a2" - "<\u60a9<\u6fc3<\u7d0d<\u80fd<\u8133<\u81bf<\u8fb2<\u8997<\u86a4" - "<\u5df4<\u628a<\u64ad<\u8987<\u6777<\u6ce2<\u6d3e<\u7436<\u7834" - "<\u5a46<\u7f75<\u82ad<\u99ac<\u4ff3<\u5ec3<\u62dd<\u6392<\u6557" - "<\u676f<\u76c3<\u724c<\u80cc<\u80ba<\u8f29<\u914d<\u500d<\u57f9" - "<\u5a92<\u6885<\u6973<\u7164<\u72fd<\u8cb7<\u58f2<\u8ce0<\u966a" - "<\u9019<\u877f<\u79e4<\u77e7<\u8429<\u4f2f<\u5265<\u535a<\u62cd" - "<\u67cf<\u6cca<\u767d<\u7b94<\u7c95<\u8236<\u8584<\u8feb<\u66dd" - "<\u6f20<\u7206<\u7e1b<\u83ab<\u99c1<\u9ea6<\u51fd<\u7bb1<\u7872" - "<\u7bb8<\u8087<\u7b48<\u6ae8<\u5e61<\u808c<\u7551<\u7560<\u516b" - "<\u9262<\u6e8c<\u767a<\u9197<\u9aea<\u4f10<\u7f70<\u629c<\u7b4f" - "<\u95a5<\u9ce9<\u567a<\u5859<\u86e4<\u96bc<\u4f34<\u5224<\u534a" - "<\u53cd<\u53db<\u5e06<\u642c<\u6591<\u677f<\u6c3e<\u6c4e<\u7248" - "<\u72af<\u73ed<\u7554<\u7e41<\u822c<\u85e9<\u8ca9<\u7bc4<\u91c6" - "<\u7169<\u9812<\u98ef<\u633d<\u6669<\u756a<\u76e4<\u78d0<\u8543" - "<\u86ee<\u532a<\u5351<\u5426<\u5983<\u5e87<\u5f7c<\u60b2<\u6249" - "<\u6279<\u62ab<\u6590<\u6bd4<\u6ccc<\u75b2<\u76ae<\u7891<\u79d8" - "<\u7dcb<\u7f77<\u80a5<\u88ab<\u8ab9<\u8cbb<\u907f<\u975e<\u98db" - "<\u6a0b<\u7c38<\u5099<\u5c3e<\u5fae<\u6787<\u6bd8<\u7435<\u7709" - "<\u7f8e<\u9f3b<\u67ca<\u7a17<\u5339<\u758b<\u9aed<\u5f66<\u819d" - "<\u83f1<\u8098<\u5f3c<\u5fc5<\u7562<\u7b46<\u903c<\u6867<\u59eb" - "<\u5a9b<\u7d10<\u767e<\u8b2c<\u4ff5<\u5f6a<\u6a19<\u6c37<\u6f02" - "<\u74e2<\u7968<\u8868<\u8a55<\u8c79<\u5edf<\u63cf<\u75c5<\u79d2" - "<\u82d7<\u9328<\u92f2<\u849c<\u86ed<\u9c2d<\u54c1<\u5f6c<\u658c" - "<\u6d5c<\u7015<\u8ca7<\u8cd3<\u983b<\u654f<\u74f6<\u4e0d<\u4ed8" - "<\u57e0<\u592b<\u5a66<\u5bcc<\u51a8<\u5e03<\u5e9c<\u6016<\u6276" - "<\u6577<\u65a7<\u666e<\u6d6e<\u7236<\u7b26<\u8150<\u819a<\u8299" - "<\u8b5c<\u8ca0<\u8ce6<\u8d74<\u961c<\u9644<\u4fae<\u64ab<\u6b66" - "<\u821e<\u8461<\u856a<\u90e8<\u5c01<\u6953<\u98a8<\u847a<\u8557" - "<\u4f0f<\u526f<\u5fa9<\u5e45<\u670d<\u798f<\u8179<\u8907<\u8986" - "<\u6df5<\u5f17<\u6255<\u6cb8<\u4ecf<\u7269<\u9b92<\u5206<\u543b" - "<\u5674<\u58b3<\u61a4<\u626e<\u711a<\u596e<\u7c89<\u7cde<\u7d1b" - "<\u96f0<\u6587<\u805e<\u4e19<\u4f75<\u5175<\u5840<\u5e63<\u5e73" - "<\u5f0a<\u67c4<\u4e26<\u853d<\u9589<\u965b<\u7c73<\u9801<\u50fb" - "<\u58c1<\u7656<\u78a7<\u5225<\u77a5<\u8511<\u7b86<\u504f<\u5909" - "<\u7247<\u7bc7<\u7de8<\u8fba<\u8fd4<\u904d<\u4fbf<\u52c9<\u5a29" - "<\u5f01<\u97ad<\u4fdd<\u8217<\u92ea<\u5703<\u6355<\u6b69<\u752b" - "<\u88dc<\u8f14<\u7a42<\u52df<\u5893<\u6155<\u620a<\u66ae<\u6bcd" - "<\u7c3f<\u83e9<\u5023<\u4ff8<\u5305<\u5446<\u5831<\u5949<\u5b9d" - "<\u5cf0<\u5cef<\u5d29<\u5e96<\u62b1<\u6367<\u653e<\u65b9<\u670b" - "<\u6cd5<\u6ce1<\u70f9<\u7832<\u7e2b<\u80de<\u82b3<\u840c<\u84ec" - "<\u8702<\u8912<\u8a2a<\u8c4a<\u90a6<\u92d2<\u98fd<\u9cf3<\u9d6c" - "<\u4e4f<\u4ea1<\u508d<\u5256<\u574a<\u59a8<\u5e3d<\u5fd8<\u5fd9" - "<\u623f<\u66b4<\u671b<\u67d0<\u68d2<\u5192<\u7d21<\u80aa<\u81a8" - "<\u8b00<\u8c8c<\u8cbf<\u927e<\u9632<\u5420<\u982c<\u5317<\u50d5" - "<\u535c<\u58a8<\u64b2<\u6734<\u7267<\u7766<\u7a46<\u91e6<\u52c3" - "<\u6ca1<\u6b86<\u5800<\u5e4c<\u5954<\u672c<\u7ffb<\u51e1<\u76c6" - "<\u6469<\u78e8<\u9b54<\u9ebb<\u57cb<\u59b9<\u6627<\u679a<\u6bce" - "<\u54e9<\u69d9<\u5e55<\u819c<\u6795<\u9baa<\u67fe<\u9c52<\u685d" - "<\u4ea6<\u4fe3<\u53c8<\u62b9<\u672b<\u6cab<\u8fc4<\u4fad<\u7e6d" - "<\u9ebf<\u4e07<\u6162<\u6e80<\u6f2b<\u8513<\u5473<\u672a<\u9b45" - "<\u5df3<\u7b95<\u5cac<\u5bc6<\u871c<\u6e4a<\u84d1<\u7a14<\u8108" - "<\u5999<\u7c8d<\u6c11<\u7720<\u52d9<\u5922<\u7121<\u725f<\u77db" - "<\u9727<\u9d61<\u690b<\u5a7f<\u5a18<\u51a5<\u540d<\u547d<\u660e" - "<\u76df<\u8ff7<\u9298<\u9cf4<\u59ea<\u725d<\u6ec5<\u514d<\u68c9" - "<\u7dbf<\u7dec<\u9762<\u9eba<\u6478<\u6a21<\u8302<\u5984<\u5b5f" - "<\u6bdb<\u731b<\u76f2<\u7db2<\u8017<\u8499<\u5132<\u6728<\u9ed9" - "<\u76ee<\u6762<\u52ff<\u9905<\u5c24<\u623b<\u7c7e<\u8cb0<\u554f" - "<\u60b6<\u7d0b<\u9580<\u5301<\u4e5f<\u51b6<\u591c<\u723a<\u8036" - "<\u91ce<\u5f25<\u77e2<\u5384<\u5f79<\u7d04<\u85ac<\u8a33<\u8e8d" - "<\u9756<\u67f3<\u85ae<\u9453<\u6109<\u6108<\u6cb9<\u7652<\u8aed" - "<\u8f38<\u552f<\u4f51<\u512a<\u52c7<\u53cb<\u5ba5<\u5e7d<\u60a0" - "<\u6182<\u63d6<\u6709<\u67da<\u6e67<\u6d8c<\u7336<\u7337<\u7531" - "<\u7950<\u88d5<\u8a98<\u904a<\u9091<\u90f5<\u96c4<\u878d<\u5915" - "<\u4e88<\u4f59<\u4e0e<\u8a89<\u8f3f<\u9810<\u50ad<\u5e7c<\u5996" - "<\u5bb9<\u5eb8<\u63da<\u63fa<\u64c1<\u66dc<\u694a<\u69d8<\u6d0b" - "<\u6eb6<\u7194<\u7528<\u7aaf<\u7f8a<\u8000<\u8449<\u84c9<\u8981" - "<\u8b21<\u8e0a<\u9065<\u967d<\u990a<\u617e<\u6291<\u6b32<\u6c83" - "<\u6d74<\u7fcc<\u7ffc<\u6dc0<\u7f85<\u87ba<\u88f8<\u6765<\u83b1" - "<\u983c<\u96f7<\u6d1b<\u7d61<\u843d<\u916a<\u4e71<\u5375<\u5d50" - "<\u6b04<\u6feb<\u85cd<\u862d<\u89a7<\u5229<\u540f<\u5c65<\u674e" - "<\u68a8<\u7406<\u7483<\u75e2<\u88cf<\u88e1<\u91cc<\u96e2<\u9678" - "<\u5f8b<\u7387<\u7acb<\u844e<\u63a0<\u7565<\u5289<\u6d41<\u6e9c" - "<\u7409<\u7559<\u786b<\u7c92<\u9686<\u7adc<\u9f8d<\u4fb6<\u616e" - "<\u65c5<\u865c<\u4e86<\u4eae<\u50da<\u4e21<\u51cc<\u5bee<\u6599" - "<\u6881<\u6dbc<\u731f<\u7642<\u77ad<\u7a1c<\u7ce7<\u826f<\u8ad2" - "<\u907c<\u91cf<\u9675<\u9818<\u529b<\u7dd1<\u502b<\u5398<\u6797" - "<\u6dcb<\u71d0<\u7433<\u81e8<\u8f2a<\u96a3<\u9c57<\u9e9f<\u7460" - "<\u5841<\u6d99<\u7d2f<\u985e<\u4ee4<\u4f36<\u4f8b<\u51b7<\u52b1" - "<\u5dba<\u601c<\u73b2<\u793c<\u82d3<\u9234<\u96b7<\u96f6<\u970a" - "<\u9e97<\u9f62<\u66a6<\u6b74<\u5217<\u52a3<\u70c8<\u88c2<\u5ec9" - "<\u604b<\u6190<\u6f23<\u7149<\u7c3e<\u7df4<\u806f<\u84ee<\u9023" - "<\u932c<\u5442<\u9b6f<\u6ad3<\u7089<\u8cc2<\u8def<\u9732<\u52b4" - "<\u5a41<\u5eca<\u5f04<\u6717<\u697c<\u6994<\u6d6a<\u6f0f<\u7262" - "<\u72fc<\u7bed<\u8001<\u807e<\u874b<\u90ce<\u516d<\u9e93<\u7984" - "<\u808b<\u9332<\u8ad6<\u502d<\u548c<\u8a71<\u6b6a<\u8cc4<\u8107" - "<\u60d1<\u67a0<\u9df2<\u4e99<\u4e98<\u9c10<\u8a6b<\u85c1<\u8568" - "<\u6900<\u6e7e<\u7897<\u8155<\u5f0c<\u4e10<\u4e15<\u4e2a<\u4e31" - "<\u4e36<\u4e3c<\u4e3f<\u4e42<\u4e56<\u4e58<\u4e82<\u4e85<\u8c6b" - "<\u4e8a<\u8212<\u5f0d<\u4e8e<\u4e9e<\u4e9f<\u4ea0<\u4ea2<\u4eb0" - "<\u4eb3<\u4eb6<\u4ece<\u4ecd<\u4ec4<\u4ec6<\u4ec2<\u4ed7<\u4ede" - "<\u4eed<\u4edf<\u4ef7<\u4f09<\u4f5a<\u4f30<\u4f5b<\u4f5d<\u4f57" - "<\u4f47<\u4f76<\u4f88<\u4f8f<\u4f98<\u4f7b<\u4f69<\u4f70<\u4f91" - "<\u4f6f<\u4f86<\u4f96<\u5118<\u4fd4<\u4fdf<\u4fce<\u4fd8<\u4fdb" - "<\u4fd1<\u4fda<\u4fd0<\u4fe4<\u4fe5<\u501a<\u5028<\u5014<\u502a" - "<\u5025<\u5005<\u4f1c<\u4ff6<\u5021<\u5029<\u502c<\u4ffe<\u4fef" - "<\u5011<\u5006<\u5043<\u5047<\u6703<\u5055<\u5050<\u5048<\u505a" - "<\u5056<\u506c<\u5078<\u5080<\u509a<\u5085<\u50b4<\u50b2<\u50c9" - "<\u50ca<\u50b3<\u50c2<\u50d6<\u50de<\u50e5<\u50ed<\u50e3<\u50ee" - "<\u50f9<\u50f5<\u5109<\u5101<\u5102<\u5116<\u5115<\u5114<\u511a" - "<\u5121<\u513a<\u5137<\u513c<\u513b<\u513f<\u5140<\u5152<\u514c" - "<\u5154<\u5162<\u7af8<\u5169<\u516a<\u516e<\u5180<\u5182<\u56d8" - "<\u518c<\u5189<\u518f<\u5191<\u5193<\u5195<\u5196<\u51a4<\u51a6" - "<\u51a2<\u51a9<\u51aa<\u51ab<\u51b3<\u51b1<\u51b2<\u51b0<\u51b5" - "<\u51bd<\u51c5<\u51c9<\u51db<\u51e0<\u8655<\u51e9<\u51ed<\u51f0" - "<\u51f5<\u51fe<\u5204<\u520b<\u5214<\u520e<\u5227<\u522a<\u522e" - "<\u5233<\u5239<\u524f<\u5244<\u524b<\u524c<\u525e<\u5254<\u526a" - "<\u5274<\u5269<\u5273<\u527f<\u527d<\u528d<\u5294<\u5292<\u5271" - "<\u5288<\u5291<\u8fa8<\u8fa7<\u52ac<\u52ad<\u52bc<\u52b5<\u52c1" - "<\u52cd<\u52d7<\u52de<\u52e3<\u52e6<\u98ed<\u52e0<\u52f3<\u52f5" - "<\u52f8<\u52f9<\u5306<\u5308<\u7538<\u530d<\u5310<\u530f<\u5315" - "<\u531a<\u5323<\u532f<\u5331<\u5333<\u5338<\u5340<\u5346<\u5345" - "<\u4e17<\u5349<\u534d<\u51d6<\u535e<\u5369<\u536e<\u5918<\u537b" - "<\u5377<\u5382<\u5396<\u53a0<\u53a6<\u53a5<\u53ae<\u53b0<\u53b6" - "<\u53c3<\u7c12<\u96d9<\u53df<\u66fc<\u71ee<\u53ee<\u53e8<\u53ed" - "<\u53fa<\u5401<\u543d<\u5440<\u542c<\u542d<\u543c<\u542e<\u5436" - "<\u5429<\u541d<\u544e<\u548f<\u5475<\u548e<\u545f<\u5471<\u5477" - "<\u5470<\u5492<\u547b<\u5480<\u5476<\u5484<\u5490<\u5486<\u54c7" - "<\u54a2<\u54b8<\u54a5<\u54ac<\u54c4<\u54c8<\u54a8<\u54ab<\u54c2" - "<\u54a4<\u54be<\u54bc<\u54d8<\u54e5<\u54e6<\u550f<\u5514<\u54fd" - "<\u54ee<\u54ed<\u54fa<\u54e2<\u5539<\u5540<\u5563<\u554c<\u552e" - "<\u555c<\u5545<\u5556<\u5557<\u5538<\u5533<\u555d<\u5599<\u5580" - "<\u54af<\u558a<\u559f<\u557b<\u557e<\u5598<\u559e<\u55ae<\u557c" - "<\u5583<\u55a9<\u5587<\u55a8<\u55da<\u55c5<\u55df<\u55c4<\u55dc" - "<\u55e4<\u55d4<\u5614<\u55f7<\u5616<\u55fe<\u55fd<\u561b<\u55f9" - "<\u564e<\u5650<\u71df<\u5634<\u5636<\u5632<\u5638<\u566b<\u5664" - "<\u562f<\u566c<\u566a<\u5686<\u5680<\u568a<\u56a0<\u5694<\u568f" - "<\u56a5<\u56ae<\u56b6<\u56b4<\u56c2<\u56bc<\u56c1<\u56c3<\u56c0" - "<\u56c8<\u56ce<\u56d1<\u56d3<\u56d7<\u56ee<\u56f9<\u5700<\u56ff" - "<\u5704<\u5709<\u5708<\u570b<\u570d<\u5713<\u5718<\u5716<\u55c7" - "<\u571c<\u5726<\u5737<\u5738<\u574e<\u573b<\u5740<\u574f<\u5769" - "<\u57c0<\u5788<\u5761<\u577f<\u5789<\u5793<\u57a0<\u57b3<\u57a4" - "<\u57aa<\u57b0<\u57c3<\u57c6<\u57d4<\u57d2<\u57d3<\u580a<\u57d6" - "<\u57e3<\u580b<\u5819<\u581d<\u5872<\u5821<\u5862<\u584b<\u5870" - "<\u6bc0<\u5852<\u583d<\u5879<\u5885<\u58b9<\u589f<\u58ab<\u58ba" - "<\u58de<\u58bb<\u58b8<\u58ae<\u58c5<\u58d3<\u58d1<\u58d7<\u58d9" - "<\u58d8<\u58e5<\u58dc<\u58e4<\u58df<\u58ef<\u58fa<\u58f9<\u58fb" - "<\u58fc<\u58fd<\u5902<\u590a<\u5910<\u591b<\u68a6<\u5925<\u592c" - "<\u592d<\u5932<\u5938<\u593e<\u7ad2<\u5955<\u5950<\u594e<\u595a" - "<\u5958<\u5962<\u5960<\u5967<\u596c<\u5969<\u5978<\u5981<\u599d" - "<\u4f5e<\u4fab<\u59a3<\u59b2<\u59c6<\u59e8<\u59dc<\u598d<\u59d9" - "<\u59da<\u5a25<\u5a1f<\u5a11<\u5a1c<\u5a09<\u5a1a<\u5a40<\u5a6c" - "<\u5a49<\u5a35<\u5a36<\u5a62<\u5a6a<\u5a9a<\u5abc<\u5abe<\u5acb" - "<\u5ac2<\u5abd<\u5ae3<\u5ad7<\u5ae6<\u5ae9<\u5ad6<\u5afa<\u5afb" - "<\u5b0c<\u5b0b<\u5b16<\u5b32<\u5ad0<\u5b2a<\u5b36<\u5b3e<\u5b43" - "<\u5b45<\u5b40<\u5b51<\u5b55<\u5b5a<\u5b5b<\u5b65<\u5b69<\u5b70" - "<\u5b73<\u5b75<\u5b78<\u6588<\u5b7a<\u5b80<\u5b83<\u5ba6<\u5bb8" - "<\u5bc3<\u5bc7<\u5bc9<\u5bd4<\u5bd0<\u5be4<\u5be6<\u5be2<\u5bde" - "<\u5be5<\u5beb<\u5bf0<\u5bf6<\u5bf3<\u5c05<\u5c07<\u5c08<\u5c0d" - "<\u5c13<\u5c20<\u5c22<\u5c28<\u5c38<\u5c39<\u5c41<\u5c46<\u5c4e" - "<\u5c53<\u5c50<\u5c4f<\u5b71<\u5c6c<\u5c6e<\u4e62<\u5c76<\u5c79" - "<\u5c8c<\u5c91<\u5c94<\u599b<\u5cab<\u5cbb<\u5cb6<\u5cbc<\u5cb7" - "<\u5cc5<\u5cbe<\u5cc7<\u5cd9<\u5ce9<\u5cfd<\u5cfa<\u5ced<\u5d8c" - "<\u5cea<\u5d0b<\u5d15<\u5d17<\u5d5c<\u5d1f<\u5d1b<\u5d11<\u5d14" - "<\u5d22<\u5d1a<\u5d19<\u5d18<\u5d4c<\u5d52<\u5d4e<\u5d4b<\u5d6c" - "<\u5d73<\u5d76<\u5d87<\u5d84<\u5d82<\u5da2<\u5d9d<\u5dac<\u5dae" - "<\u5dbd<\u5d90<\u5db7<\u5dbc<\u5dc9<\u5dcd<\u5dd3<\u5dd2<\u5dd6" - "<\u5ddb<\u5deb<\u5df2<\u5df5<\u5e0b<\u5e1a<\u5e19<\u5e11<\u5e1b" - "<\u5e36<\u5e37<\u5e44<\u5e43<\u5e40<\u5e4e<\u5e57<\u5e54<\u5e5f" - "<\u5e62<\u5e64<\u5e47<\u5e75<\u5e76<\u5e7a<\u9ebc<\u5e7f<\u5ea0" - "<\u5ec1<\u5ec2<\u5ec8<\u5ed0<\u5ecf<\u5ed6<\u5ee3<\u5edd<\u5eda" - "<\u5edb<\u5ee2<\u5ee1<\u5ee8<\u5ee9<\u5eec<\u5ef1<\u5ef3<\u5ef0" - "<\u5ef4<\u5ef8<\u5efe<\u5f03<\u5f09<\u5f5d<\u5f5c<\u5f0b<\u5f11" - "<\u5f16<\u5f29<\u5f2d<\u5f38<\u5f41<\u5f48<\u5f4c<\u5f4e<\u5f2f" - "<\u5f51<\u5f56<\u5f57<\u5f59<\u5f61<\u5f6d<\u5f73<\u5f77<\u5f83" - "<\u5f82<\u5f7f<\u5f8a<\u5f88<\u5f91<\u5f87<\u5f9e<\u5f99<\u5f98" - "<\u5fa0<\u5fa8<\u5fad<\u5fbc<\u5fd6<\u5ffb<\u5fe4<\u5ff8<\u5ff1" - "<\u5fdd<\u60b3<\u5fff<\u6021<\u6060<\u6019<\u6010<\u6029<\u600e" - "<\u6031<\u601b<\u6015<\u602b<\u6026<\u600f<\u603a<\u605a<\u6041" - "<\u606a<\u6077<\u605f<\u604a<\u6046<\u604d<\u6063<\u6043<\u6064" - "<\u6042<\u606c<\u606b<\u6059<\u6081<\u608d<\u60e7<\u6083<\u609a" - "<\u6084<\u609b<\u6096<\u6097<\u6092<\u60a7<\u608b<\u60e1<\u60b8" - "<\u60e0<\u60d3<\u60b4<\u5ff0<\u60bd<\u60c6<\u60b5<\u60d8<\u614d" - "<\u6115<\u6106<\u60f6<\u60f7<\u6100<\u60f4<\u60fa<\u6103<\u6121" - "<\u60fb<\u60f1<\u610d<\u610e<\u6147<\u613e<\u6128<\u6127<\u614a" - "<\u613f<\u613c<\u612c<\u6134<\u613d<\u6142<\u6144<\u6173<\u6177" - "<\u6158<\u6159<\u615a<\u616b<\u6174<\u616f<\u6165<\u6171<\u615f" - "<\u615d<\u6153<\u6175<\u6199<\u6196<\u6187<\u61ac<\u6194<\u619a" - "<\u618a<\u6191<\u61ab<\u61ae<\u61cc<\u61ca<\u61c9<\u61f7<\u61c8" - "<\u61c3<\u61c6<\u61ba<\u61cb<\u7f79<\u61cd<\u61e6<\u61e3<\u61f6" - "<\u61fa<\u61f4<\u61ff<\u61fd<\u61fc<\u61fe<\u6200<\u6208<\u6209" - "<\u620d<\u620c<\u6214<\u621b<\u621e<\u6221<\u622a<\u622e<\u6230" - "<\u6232<\u6233<\u6241<\u624e<\u625e<\u6263<\u625b<\u6260<\u6268" - "<\u627c<\u6282<\u6289<\u627e<\u6292<\u6293<\u6296<\u62d4<\u6283" - "<\u6294<\u62d7<\u62d1<\u62bb<\u62cf<\u62ff<\u62c6<\u64d4<\u62c8" - "<\u62dc<\u62cc<\u62ca<\u62c2<\u62c7<\u629b<\u62c9<\u630c<\u62ee" - "<\u62f1<\u6327<\u6302<\u6308<\u62ef<\u62f5<\u6350<\u633e<\u634d" - "<\u641c<\u634f<\u6396<\u638e<\u6380<\u63ab<\u6376<\u63a3<\u638f" - "<\u6389<\u639f<\u63b5<\u636b<\u6369<\u63be<\u63e9<\u63c0<\u63c6" - "<\u63e3<\u63c9<\u63d2<\u63f6<\u63c4<\u6416<\u6434<\u6406<\u6413" - "<\u6426<\u6436<\u651d<\u6417<\u6428<\u640f<\u6467<\u646f<\u6476" - "<\u644e<\u652a<\u6495<\u6493<\u64a5<\u64a9<\u6488<\u64bc<\u64da" - "<\u64d2<\u64c5<\u64c7<\u64bb<\u64d8<\u64c2<\u64f1<\u64e7<\u8209" - "<\u64e0<\u64e1<\u62ac<\u64e3<\u64ef<\u652c<\u64f6<\u64f4<\u64f2" - "<\u64fa<\u6500<\u64fd<\u6518<\u651c<\u6505<\u6524<\u6523<\u652b" - "<\u6534<\u6535<\u6537<\u6536<\u6538<\u754b<\u6548<\u6556<\u6555" - "<\u654d<\u6558<\u655e<\u655d<\u6572<\u6578<\u6582<\u6583<\u8b8a" - "<\u659b<\u659f<\u65ab<\u65b7<\u65c3<\u65c6<\u65c1<\u65c4<\u65cc" - "<\u65d2<\u65db<\u65d9<\u65e0<\u65e1<\u65f1<\u6772<\u660a<\u6603" - "<\u65fb<\u6773<\u6635<\u6636<\u6634<\u661c<\u664f<\u6644<\u6649" - "<\u6641<\u665e<\u665d<\u6664<\u6667<\u6668<\u665f<\u6662<\u6670" - "<\u6683<\u6688<\u668e<\u6689<\u6684<\u6698<\u669d<\u66c1<\u66b9" - "<\u66c9<\u66be<\u66bc<\u66c4<\u66b8<\u66d6<\u66da<\u66e0<\u663f" - "<\u66e6<\u66e9<\u66f0<\u66f5<\u66f7<\u670f<\u6716<\u671e<\u6726" - "<\u6727<\u9738<\u672e<\u673f<\u6736<\u6741<\u6738<\u6737<\u6746" - "<\u675e<\u6760<\u6759<\u6763<\u6764<\u6789<\u6770<\u67a9<\u677c" - "<\u676a<\u678c<\u678b<\u67a6<\u67a1<\u6785<\u67b7<\u67ef<\u67b4" - "<\u67ec<\u67b3<\u67e9<\u67b8<\u67e4<\u67de<\u67dd<\u67e2<\u67ee" - "<\u67b9<\u67ce<\u67c6<\u67e7<\u6a9c<\u681e<\u6846<\u6829<\u6840" - "<\u684d<\u6832<\u684e<\u68b3<\u682b<\u6859<\u6863<\u6877<\u687f" - "<\u689f<\u688f<\u68ad<\u6894<\u689d<\u689b<\u6883<\u6aae<\u68b9" - "<\u6874<\u68b5<\u68a0<\u68ba<\u690f<\u688d<\u687e<\u6901<\u68ca" - "<\u6908<\u68d8<\u6922<\u6926<\u68e1<\u690c<\u68cd<\u68d4<\u68e7" - "<\u68d5<\u6936<\u6912<\u6904<\u68d7<\u68e3<\u6925<\u68f9<\u68e0" - "<\u68ef<\u6928<\u692a<\u691a<\u6923<\u6921<\u68c6<\u6979<\u6977" - "<\u695c<\u6978<\u696b<\u6954<\u697e<\u696e<\u6939<\u6974<\u693d" - "<\u6959<\u6930<\u6961<\u695e<\u695d<\u6981<\u696a<\u69b2<\u69ae" - "<\u69d0<\u69bf<\u69c1<\u69d3<\u69be<\u69ce<\u5be8<\u69ca<\u69dd" - "<\u69bb<\u69c3<\u69a7<\u6a2e<\u6991<\u69a0<\u699c<\u6995<\u69b4" - "<\u69de<\u69e8<\u6a02<\u6a1b<\u69ff<\u6b0a<\u69f9<\u69f2<\u69e7" - "<\u6a05<\u69b1<\u6a1e<\u69ed<\u6a14<\u69eb<\u6a0a<\u6a12<\u6ac1" - "<\u6a23<\u6a13<\u6a44<\u6a0c<\u6a72<\u6a36<\u6a78<\u6a47<\u6a62" - "<\u6a59<\u6a66<\u6a48<\u6a38<\u6a22<\u6a90<\u6a8d<\u6aa0<\u6a84" - "<\u6aa2<\u6aa3<\u6a97<\u8617<\u6abb<\u6ac3<\u6ac2<\u6ab8<\u6ab3" - "<\u6aac<\u6ade<\u6ad1<\u6adf<\u6aaa<\u6ada<\u6aea<\u6afb<\u6b05" - "<\u8616<\u6afa<\u6b12<\u6b16<\u9b31<\u6b1f<\u6b38<\u6b37<\u76dc" - "<\u6b39<\u98ee<\u6b47<\u6b43<\u6b49<\u6b50<\u6b59<\u6b54<\u6b5b" - "<\u6b5f<\u6b61<\u6b78<\u6b79<\u6b7f<\u6b80<\u6b84<\u6b83<\u6b8d" - "<\u6b98<\u6b95<\u6b9e<\u6ba4<\u6baa<\u6bab<\u6baf<\u6bb2<\u6bb1" - "<\u6bb3<\u6bb7<\u6bbc<\u6bc6<\u6bcb<\u6bd3<\u6bdf<\u6bec<\u6beb" - "<\u6bf3<\u6bef<\u9ebe<\u6c08<\u6c13<\u6c14<\u6c1b<\u6c24<\u6c23" - "<\u6c5e<\u6c55<\u6c62<\u6c6a<\u6c82<\u6c8d<\u6c9a<\u6c81<\u6c9b" - "<\u6c7e<\u6c68<\u6c73<\u6c92<\u6c90<\u6cc4<\u6cf1<\u6cd3<\u6cbd" - "<\u6cd7<\u6cc5<\u6cdd<\u6cae<\u6cb1<\u6cbe<\u6cba<\u6cdb<\u6cef" - "<\u6cd9<\u6cea<\u6d1f<\u884d<\u6d36<\u6d2b<\u6d3d<\u6d38<\u6d19" - "<\u6d35<\u6d33<\u6d12<\u6d0c<\u6d63<\u6d93<\u6d64<\u6d5a<\u6d79" - "<\u6d59<\u6d8e<\u6d95<\u6fe4<\u6d85<\u6df9<\u6e15<\u6e0a<\u6db5" - "<\u6dc7<\u6de6<\u6db8<\u6dc6<\u6dec<\u6dde<\u6dcc<\u6de8<\u6dd2" - "<\u6dc5<\u6dfa<\u6dd9<\u6de4<\u6dd5<\u6dea<\u6dee<\u6e2d<\u6e6e" - "<\u6e2e<\u6e19<\u6e72<\u6e5f<\u6e3e<\u6e23<\u6e6b<\u6e2b<\u6e76" - "<\u6e4d<\u6e1f<\u6e43<\u6e3a<\u6e4e<\u6e24<\u6eff<\u6e1d<\u6e38" - "<\u6e82<\u6eaa<\u6e98<\u6ec9<\u6eb7<\u6ed3<\u6ebd<\u6eaf<\u6ec4" - "<\u6eb2<\u6ed4<\u6ed5<\u6e8f<\u6ea5<\u6ec2<\u6e9f<\u6f41<\u6f11" - "<\u704c<\u6eec<\u6ef8<\u6efe<\u6f3f<\u6ef2<\u6f31<\u6eef<\u6f32" - "<\u6ecc<\u6f3e<\u6f13<\u6ef7<\u6f86<\u6f7a<\u6f78<\u6f81<\u6f80" - "<\u6f6f<\u6f5b<\u6ff3<\u6f6d<\u6f82<\u6f7c<\u6f58<\u6f8e<\u6f91" - "<\u6fc2<\u6f66<\u6fb3<\u6fa3<\u6fa1<\u6fa4<\u6fb9<\u6fc6<\u6faa" - "<\u6fdf<\u6fd5<\u6fec<\u6fd4<\u6fd8<\u6ff1<\u6fee<\u6fdb<\u7009" - "<\u700b<\u6ffa<\u7011<\u7001<\u700f<\u6ffe<\u701b<\u701a<\u6f74" - "<\u701d<\u7018<\u701f<\u7030<\u703e<\u7032<\u7051<\u7063<\u7099" - "<\u7092<\u70af<\u70f1<\u70ac<\u70b8<\u70b3<\u70ae<\u70df<\u70cb" - "<\u70dd<\u70d9<\u7109<\u70fd<\u711c<\u7119<\u7165<\u7155<\u7188" - "<\u7166<\u7162<\u714c<\u7156<\u716c<\u718f<\u71fb<\u7184<\u7195" - "<\u71a8<\u71ac<\u71d7<\u71b9<\u71be<\u71d2<\u71c9<\u71d4<\u71ce" - "<\u71e0<\u71ec<\u71e7<\u71f5<\u71fc<\u71f9<\u71ff<\u720d<\u7210" - "<\u721b<\u7228<\u722d<\u722c<\u7230<\u7232<\u723b<\u723c<\u723f" - "<\u7240<\u7246<\u724b<\u7258<\u7274<\u727e<\u7282<\u7281<\u7287" - "<\u7292<\u7296<\u72a2<\u72a7<\u72b9<\u72b2<\u72c3<\u72c6<\u72c4" - "<\u72ce<\u72d2<\u72e2<\u72e0<\u72e1<\u72f9<\u72f7<\u500f<\u7317" - "<\u730a<\u731c<\u7316<\u731d<\u7334<\u732f<\u7329<\u7325<\u733e" - "<\u734e<\u734f<\u9ed8<\u7357<\u736a<\u7368<\u7370<\u7378<\u7375" - "<\u737b<\u737a<\u73c8<\u73b3<\u73ce<\u73bb<\u73c0<\u73e5<\u73ee" - "<\u73de<\u74a2<\u7405<\u746f<\u7425<\u73f8<\u7432<\u743a<\u7455" - "<\u743f<\u745f<\u7459<\u7441<\u745c<\u7469<\u7470<\u7463<\u746a" - "<\u7476<\u747e<\u748b<\u749e<\u74a7<\u74ca<\u74cf<\u74d4<\u73f1" - "<\u74e0<\u74e3<\u74e7<\u74e9<\u74ee<\u74f2<\u74f0<\u74f1<\u74f8" - "<\u74f7<\u7504<\u7503<\u7505<\u750c<\u750e<\u750d<\u7515<\u7513" - "<\u751e<\u7526<\u752c<\u753c<\u7544<\u754d<\u754a<\u7549<\u755b" - "<\u7546<\u755a<\u7569<\u7564<\u7567<\u756b<\u756d<\u7578<\u7576" - "<\u7586<\u7587<\u7574<\u758a<\u7589<\u7582<\u7594<\u759a<\u759d" - "<\u75a5<\u75a3<\u75c2<\u75b3<\u75c3<\u75b5<\u75bd<\u75b8<\u75bc" - "<\u75b1<\u75cd<\u75ca<\u75d2<\u75d9<\u75e3<\u75de<\u75fe<\u75ff" - "<\u75fc<\u7601<\u75f0<\u75fa<\u75f2<\u75f3<\u760b<\u760d<\u7609" - "<\u761f<\u7627<\u7620<\u7621<\u7622<\u7624<\u7634<\u7630<\u763b" - "<\u7647<\u7648<\u7646<\u765c<\u7658<\u7661<\u7662<\u7668<\u7669" - "<\u766a<\u7667<\u766c<\u7670<\u7672<\u7676<\u7678<\u767c<\u7680" - "<\u7683<\u7688<\u768b<\u768e<\u7696<\u7693<\u7699<\u769a<\u76b0" - "<\u76b4<\u76b8<\u76b9<\u76ba<\u76c2<\u76cd<\u76d6<\u76d2<\u76de" - "<\u76e1<\u76e5<\u76e7<\u76ea<\u862f<\u76fb<\u7708<\u7707<\u7704" - "<\u7729<\u7724<\u771e<\u7725<\u7726<\u771b<\u7737<\u7738<\u7747" - "<\u775a<\u7768<\u776b<\u775b<\u7765<\u777f<\u777e<\u7779<\u778e" - "<\u778b<\u7791<\u77a0<\u779e<\u77b0<\u77b6<\u77b9<\u77bf<\u77bc" - "<\u77bd<\u77bb<\u77c7<\u77cd<\u77d7<\u77da<\u77dc<\u77e3<\u77ee" - "<\u77fc<\u780c<\u7812<\u7926<\u7820<\u792a<\u7845<\u788e<\u7874" - "<\u7886<\u787c<\u789a<\u788c<\u78a3<\u78b5<\u78aa<\u78af<\u78d1" - "<\u78c6<\u78cb<\u78d4<\u78be<\u78bc<\u78c5<\u78ca<\u78ec<\u78e7" - "<\u78da<\u78fd<\u78f4<\u7907<\u7912<\u7911<\u7919<\u792c<\u792b" - "<\u7940<\u7960<\u7957<\u795f<\u795a<\u7955<\u7953<\u797a<\u797f" - "<\u798a<\u799d<\u79a7<\u9f4b<\u79aa<\u79ae<\u79b3<\u79b9<\u79ba" - "<\u79c9<\u79d5<\u79e7<\u79ec<\u79e1<\u79e3<\u7a08<\u7a0d<\u7a18" - "<\u7a19<\u7a20<\u7a1f<\u7980<\u7a31<\u7a3b<\u7a3e<\u7a37<\u7a43" - "<\u7a57<\u7a49<\u7a61<\u7a62<\u7a69<\u9f9d<\u7a70<\u7a79<\u7a7d" - "<\u7a88<\u7a97<\u7a95<\u7a98<\u7a96<\u7aa9<\u7ac8<\u7ab0<\u7ab6" - "<\u7ac5<\u7ac4<\u7abf<\u9083<\u7ac7<\u7aca<\u7acd<\u7acf<\u7ad5" - "<\u7ad3<\u7ad9<\u7ada<\u7add<\u7ae1<\u7ae2<\u7ae6<\u7aed<\u7af0" - "<\u7b02<\u7b0f<\u7b0a<\u7b06<\u7b33<\u7b18<\u7b19<\u7b1e<\u7b35" - "<\u7b28<\u7b36<\u7b50<\u7b7a<\u7b04<\u7b4d<\u7b0b<\u7b4c<\u7b45" - "<\u7b75<\u7b65<\u7b74<\u7b67<\u7b70<\u7b71<\u7b6c<\u7b6e<\u7b9d" - "<\u7b98<\u7b9f<\u7b8d<\u7b9c<\u7b9a<\u7b8b<\u7b92<\u7b8f<\u7b5d" - "<\u7b99<\u7bcb<\u7bc1<\u7bcc<\u7bcf<\u7bb4<\u7bc6<\u7bdd<\u7be9" - "<\u7c11<\u7c14<\u7be6<\u7be5<\u7c60<\u7c00<\u7c07<\u7c13<\u7bf3" - "<\u7bf7<\u7c17<\u7c0d<\u7bf6<\u7c23<\u7c27<\u7c2a<\u7c1f<\u7c37" - "<\u7c2b<\u7c3d<\u7c4c<\u7c43<\u7c54<\u7c4f<\u7c40<\u7c50<\u7c58" - "<\u7c5f<\u7c64<\u7c56<\u7c65<\u7c6c<\u7c75<\u7c83<\u7c90<\u7ca4" - "<\u7cad<\u7ca2<\u7cab<\u7ca1<\u7ca8<\u7cb3<\u7cb2<\u7cb1<\u7cae" - "<\u7cb9<\u7cbd<\u7cc0<\u7cc5<\u7cc2<\u7cd8<\u7cd2<\u7cdc<\u7ce2" - "<\u9b3b<\u7cef<\u7cf2<\u7cf4<\u7cf6<\u7cfa<\u7d06<\u7d02<\u7d1c" - "<\u7d15<\u7d0a<\u7d45<\u7d4b<\u7d2e<\u7d32<\u7d3f<\u7d35<\u7d46" - "<\u7d73<\u7d56<\u7d4e<\u7d72<\u7d68<\u7d6e<\u7d4f<\u7d63<\u7d93" - "<\u7d89<\u7d5b<\u7d8f<\u7d7d<\u7d9b<\u7dba<\u7dae<\u7da3<\u7db5" - "<\u7dc7<\u7dbd<\u7dab<\u7e3d<\u7da2<\u7daf<\u7ddc<\u7db8<\u7d9f" - "<\u7db0<\u7dd8<\u7ddd<\u7de4<\u7dde<\u7dfb<\u7df2<\u7de1<\u7e05" - "<\u7e0a<\u7e23<\u7e21<\u7e12<\u7e31<\u7e1f<\u7e09<\u7e0b<\u7e22" - "<\u7e46<\u7e66<\u7e3b<\u7e35<\u7e39<\u7e43<\u7e37<\u7e32<\u7e3a" - "<\u7e67<\u7e5d<\u7e56<\u7e5e<\u7e59<\u7e5a<\u7e79<\u7e6a<\u7e69" - "<\u7e7c<\u7e7b<\u7e83<\u7dd5<\u7e7d<\u8fae<\u7e7f<\u7e88<\u7e89" - "<\u7e8c<\u7e92<\u7e90<\u7e93<\u7e94<\u7e96<\u7e8e<\u7e9b<\u7e9c" - "<\u7f38<\u7f3a<\u7f45<\u7f4c<\u7f4d<\u7f4e<\u7f50<\u7f51<\u7f55" - "<\u7f54<\u7f58<\u7f5f<\u7f60<\u7f68<\u7f69<\u7f67<\u7f78<\u7f82" - "<\u7f86<\u7f83<\u7f88<\u7f87<\u7f8c<\u7f94<\u7f9e<\u7f9d<\u7f9a" - "<\u7fa3<\u7faf<\u7fb2<\u7fb9<\u7fae<\u7fb6<\u7fb8<\u8b71<\u7fc5" - "<\u7fc6<\u7fca<\u7fd5<\u7fd4<\u7fe1<\u7fe6<\u7fe9<\u7ff3<\u7ff9" - "<\u98dc<\u8006<\u8004<\u800b<\u8012<\u8018<\u8019<\u801c<\u8021" - "<\u8028<\u803f<\u803b<\u804a<\u8046<\u8052<\u8058<\u805a<\u805f" - "<\u8062<\u8068<\u8073<\u8072<\u8070<\u8076<\u8079<\u807d<\u807f" - "<\u8084<\u8086<\u8085<\u809b<\u8093<\u809a<\u80ad<\u5190<\u80ac" - "<\u80db<\u80e5<\u80d9<\u80dd<\u80c4<\u80da<\u80d6<\u8109<\u80ef" - "<\u80f1<\u811b<\u8129<\u8123<\u812f<\u814b<\u968b<\u8146<\u813e" - "<\u8153<\u8151<\u80fc<\u8171<\u816e<\u8165<\u8166<\u8174<\u8183" - "<\u8188<\u818a<\u8180<\u8182<\u81a0<\u8195<\u81a4<\u81a3<\u815f" - "<\u8193<\u81a9<\u81b0<\u81b5<\u81be<\u81b8<\u81bd<\u81c0<\u81c2" - "<\u81ba<\u81c9<\u81cd<\u81d1<\u81d9<\u81d8<\u81c8<\u81da<\u81df" - "<\u81e0<\u81e7<\u81fa<\u81fb<\u81fe<\u8201<\u8202<\u8205<\u8207" - "<\u820a<\u820d<\u8210<\u8216<\u8229<\u822b<\u8238<\u8233<\u8240" - "<\u8259<\u8258<\u825d<\u825a<\u825f<\u8264<\u8262<\u8268<\u826a" - "<\u826b<\u822e<\u8271<\u8277<\u8278<\u827e<\u828d<\u8292<\u82ab" - "<\u829f<\u82bb<\u82ac<\u82e1<\u82e3<\u82df<\u82d2<\u82f4<\u82f3" - "<\u82fa<\u8393<\u8303<\u82fb<\u82f9<\u82de<\u8306<\u82dc<\u8309" - "<\u82d9<\u8335<\u8334<\u8316<\u8332<\u8331<\u8340<\u8339<\u8350" - "<\u8345<\u832f<\u832b<\u8317<\u8318<\u8385<\u839a<\u83aa<\u839f" - "<\u83a2<\u8396<\u8323<\u838e<\u8387<\u838a<\u837c<\u83b5<\u8373" - "<\u8375<\u83a0<\u8389<\u83a8<\u83f4<\u8413<\u83eb<\u83ce<\u83fd" - "<\u8403<\u83d8<\u840b<\u83c1<\u83f7<\u8407<\u83e0<\u83f2<\u840d" - "<\u8422<\u8420<\u83bd<\u8438<\u8506<\u83fb<\u846d<\u842a<\u843c" - "<\u855a<\u8484<\u8477<\u846b<\u84ad<\u846e<\u8482<\u8469<\u8446" - "<\u842c<\u846f<\u8479<\u8435<\u84ca<\u8462<\u84b9<\u84bf<\u849f" - "<\u84d9<\u84cd<\u84bb<\u84da<\u84d0<\u84c1<\u84c6<\u84d6<\u84a1" - "<\u8521<\u84ff<\u84f4<\u8517<\u8518<\u852c<\u851f<\u8515<\u8514" - "<\u84fc<\u8540<\u8563<\u8558<\u8548<\u8541<\u8602<\u854b<\u8555" - "<\u8580<\u85a4<\u8588<\u8591<\u858a<\u85a8<\u856d<\u8594<\u859b" - "<\u85ea<\u8587<\u859c<\u8577<\u857e<\u8590<\u85c9<\u85ba<\u85cf" - "<\u85b9<\u85d0<\u85d5<\u85dd<\u85e5<\u85dc<\u85f9<\u860a<\u8613" - "<\u860b<\u85fe<\u85fa<\u8606<\u8622<\u861a<\u8630<\u863f<\u864d" - "<\u4e55<\u8654<\u865f<\u8667<\u8671<\u8693<\u86a3<\u86a9<\u86aa" - "<\u868b<\u868c<\u86b6<\u86af<\u86c4<\u86c6<\u86b0<\u86c9<\u8823" - "<\u86ab<\u86d4<\u86de<\u86e9<\u86ec<\u86df<\u86db<\u86ef<\u8712" - "<\u8706<\u8708<\u8700<\u8703<\u86fb<\u8711<\u8709<\u870d<\u86f9" - "<\u870a<\u8734<\u873f<\u8737<\u873b<\u8725<\u8729<\u871a<\u8760" - "<\u875f<\u8778<\u874c<\u874e<\u8774<\u8757<\u8768<\u876e<\u8759" - "<\u8753<\u8763<\u876a<\u8805<\u87a2<\u879f<\u8782<\u87af<\u87cb" - "<\u87bd<\u87c0<\u87d0<\u96d6<\u87ab<\u87c4<\u87b3<\u87c7<\u87c6" - "<\u87bb<\u87ef<\u87f2<\u87e0<\u880f<\u880d<\u87fe<\u87f6<\u87f7" - "<\u880e<\u87d2<\u8811<\u8816<\u8815<\u8822<\u8821<\u8831<\u8836" - "<\u8839<\u8827<\u883b<\u8844<\u8842<\u8852<\u8859<\u885e<\u8862" - "<\u886b<\u8881<\u887e<\u889e<\u8875<\u887d<\u88b5<\u8872<\u8882" - "<\u8897<\u8892<\u88ae<\u8899<\u88a2<\u888d<\u88a4<\u88b0<\u88bf" - "<\u88b1<\u88c3<\u88c4<\u88d4<\u88d8<\u88d9<\u88dd<\u88f9<\u8902" - "<\u88fc<\u88f4<\u88e8<\u88f2<\u8904<\u890c<\u890a<\u8913<\u8943" - "<\u891e<\u8925<\u892a<\u892b<\u8941<\u8944<\u893b<\u8936<\u8938" - "<\u894c<\u891d<\u8960<\u895e<\u8966<\u8964<\u896d<\u896a<\u896f" - "<\u8974<\u8977<\u897e<\u8983<\u8988<\u898a<\u8993<\u8998<\u89a1" - "<\u89a9<\u89a6<\u89ac<\u89af<\u89b2<\u89ba<\u89bd<\u89bf<\u89c0" - "<\u89da<\u89dc<\u89dd<\u89e7<\u89f4<\u89f8<\u8a03<\u8a16<\u8a10" - "<\u8a0c<\u8a1b<\u8a1d<\u8a25<\u8a36<\u8a41<\u8a5b<\u8a52<\u8a46" - "<\u8a48<\u8a7c<\u8a6d<\u8a6c<\u8a62<\u8a85<\u8a82<\u8a84<\u8aa8" - "<\u8aa1<\u8a91<\u8aa5<\u8aa6<\u8a9a<\u8aa3<\u8ac4<\u8acd<\u8ac2" - "<\u8ada<\u8aeb<\u8af3<\u8ae7<\u8ae4<\u8af1<\u8b14<\u8ae0<\u8ae2" - "<\u8af7<\u8ade<\u8adb<\u8b0c<\u8b07<\u8b1a<\u8ae1<\u8b16<\u8b10" - "<\u8b17<\u8b20<\u8b33<\u97ab<\u8b26<\u8b2b<\u8b3e<\u8b28<\u8b41" - "<\u8b4c<\u8b4f<\u8b4e<\u8b49<\u8b56<\u8b5b<\u8b5a<\u8b6b<\u8b5f" - "<\u8b6c<\u8b6f<\u8b74<\u8b7d<\u8b80<\u8b8c<\u8b8e<\u8b92<\u8b93" - "<\u8b96<\u8b99<\u8b9a<\u8c3a<\u8c41<\u8c3f<\u8c48<\u8c4c<\u8c4e" - "<\u8c50<\u8c55<\u8c62<\u8c6c<\u8c78<\u8c7a<\u8c82<\u8c89<\u8c85" - "<\u8c8a<\u8c8d<\u8c8e<\u8c94<\u8c7c<\u8c98<\u621d<\u8cad<\u8caa" - "<\u8cbd<\u8cb2<\u8cb3<\u8cae<\u8cb6<\u8cc8<\u8cc1<\u8ce4<\u8ce3" - "<\u8cda<\u8cfd<\u8cfa<\u8cfb<\u8d04<\u8d05<\u8d0a<\u8d07<\u8d0f" - "<\u8d0d<\u8d10<\u9f4e<\u8d13<\u8ccd<\u8d14<\u8d16<\u8d67<\u8d6d" - "<\u8d71<\u8d73<\u8d81<\u8d99<\u8dc2<\u8dbe<\u8dba<\u8dcf<\u8dda" - "<\u8dd6<\u8dcc<\u8ddb<\u8dcb<\u8dea<\u8deb<\u8ddf<\u8de3<\u8dfc" - "<\u8e08<\u8e09<\u8dff<\u8e1d<\u8e1e<\u8e10<\u8e1f<\u8e42<\u8e35" - "<\u8e30<\u8e34<\u8e4a<\u8e47<\u8e49<\u8e4c<\u8e50<\u8e48<\u8e59" - "<\u8e64<\u8e60<\u8e2a<\u8e63<\u8e55<\u8e76<\u8e72<\u8e7c<\u8e81" - "<\u8e87<\u8e85<\u8e84<\u8e8b<\u8e8a<\u8e93<\u8e91<\u8e94<\u8e99" - "<\u8eaa<\u8ea1<\u8eac<\u8eb0<\u8ec6<\u8eb1<\u8ebe<\u8ec5<\u8ec8" - "<\u8ecb<\u8edb<\u8ee3<\u8efc<\u8efb<\u8eeb<\u8efe<\u8f0a<\u8f05" - "<\u8f15<\u8f12<\u8f19<\u8f13<\u8f1c<\u8f1f<\u8f1b<\u8f0c<\u8f26" - "<\u8f33<\u8f3b<\u8f39<\u8f45<\u8f42<\u8f3e<\u8f4c<\u8f49<\u8f46" - "<\u8f4e<\u8f57<\u8f5c<\u8f62<\u8f63<\u8f64<\u8f9c<\u8f9f<\u8fa3" - "<\u8fad<\u8faf<\u8fb7<\u8fda<\u8fe5<\u8fe2<\u8fea<\u8fef<\u9087" - "<\u8ff4<\u9005<\u8ff9<\u8ffa<\u9011<\u9015<\u9021<\u900d<\u901e" - "<\u9016<\u900b<\u9027<\u9036<\u9035<\u9039<\u8ff8<\u904f<\u9050" - "<\u9051<\u9052<\u900e<\u9049<\u903e<\u9056<\u9058<\u905e<\u9068" - "<\u906f<\u9076<\u96a8<\u9072<\u9082<\u907d<\u9081<\u9080<\u908a" - "<\u9089<\u908f<\u90a8<\u90af<\u90b1<\u90b5<\u90e2<\u90e4<\u6248" - "<\u90db<\u9102<\u9112<\u9119<\u9132<\u9130<\u914a<\u9156<\u9158" - "<\u9163<\u9165<\u9169<\u9173<\u9172<\u918b<\u9189<\u9182<\u91a2" - "<\u91ab<\u91af<\u91aa<\u91b5<\u91b4<\u91ba<\u91c0<\u91c1<\u91c9" - "<\u91cb<\u91d0<\u91d6<\u91df<\u91e1<\u91db<\u91fc<\u91f5<\u91f6" - "<\u921e<\u91ff<\u9214<\u922c<\u9215<\u9211<\u925e<\u9257<\u9245" - "<\u9249<\u9264<\u9248<\u9295<\u923f<\u924b<\u9250<\u929c<\u9296" - "<\u9293<\u929b<\u925a<\u92cf<\u92b9<\u92b7<\u92e9<\u930f<\u92fa" - "<\u9344<\u932e<\u9319<\u9322<\u931a<\u9323<\u933a<\u9335<\u933b" - "<\u935c<\u9360<\u937c<\u936e<\u9356<\u93b0<\u93ac<\u93ad<\u9394" - "<\u93b9<\u93d6<\u93d7<\u93e8<\u93e5<\u93d8<\u93c3<\u93dd<\u93d0" - "<\u93c8<\u93e4<\u941a<\u9414<\u9413<\u9403<\u9407<\u9410<\u9436" - "<\u942b<\u9435<\u9421<\u943a<\u9441<\u9452<\u9444<\u945b<\u9460" - "<\u9462<\u945e<\u946a<\u9229<\u9470<\u9475<\u9477<\u947d<\u945a" - "<\u947c<\u947e<\u9481<\u947f<\u9582<\u9587<\u958a<\u9594<\u9596" - "<\u9598<\u9599<\u95a0<\u95a8<\u95a7<\u95ad<\u95bc<\u95bb<\u95b9" - "<\u95be<\u95ca<\u6ff6<\u95c3<\u95cd<\u95cc<\u95d5<\u95d4<\u95d6" - "<\u95dc<\u95e1<\u95e5<\u95e2<\u9621<\u9628<\u962e<\u962f<\u9642" - "<\u964c<\u964f<\u964b<\u9677<\u965c<\u965e<\u965d<\u965f<\u9666" - "<\u9672<\u966c<\u968d<\u9698<\u9695<\u9697<\u96aa<\u96a7<\u96b1" - "<\u96b2<\u96b0<\u96b4<\u96b6<\u96b8<\u96b9<\u96ce<\u96cb<\u96c9" - "<\u96cd<\u894d<\u96dc<\u970d<\u96d5<\u96f9<\u9704<\u9706<\u9708" - "<\u9713<\u970e<\u9711<\u970f<\u9716<\u9719<\u9724<\u972a<\u9730" - "<\u9739<\u973d<\u973e<\u9744<\u9746<\u9748<\u9742<\u9749<\u975c" - "<\u9760<\u9764<\u9766<\u9768<\u52d2<\u976b<\u9771<\u9779<\u9785" - "<\u977c<\u9781<\u977a<\u9786<\u978b<\u978f<\u9790<\u979c<\u97a8" - "<\u97a6<\u97a3<\u97b3<\u97b4<\u97c3<\u97c6<\u97c8<\u97cb<\u97dc" - "<\u97ed<\u9f4f<\u97f2<\u7adf<\u97f6<\u97f5<\u980f<\u980c<\u9838" - "<\u9824<\u9821<\u9837<\u983d<\u9846<\u984f<\u984b<\u986b<\u986f" - "<\u9870<\u9871<\u9874<\u9873<\u98aa<\u98af<\u98b1<\u98b6<\u98c4" - "<\u98c3<\u98c6<\u98e9<\u98eb<\u9903<\u9909<\u9912<\u9914<\u9918" - "<\u9921<\u991d<\u991e<\u9924<\u9920<\u992c<\u992e<\u993d<\u993e" - "<\u9942<\u9949<\u9945<\u9950<\u994b<\u9951<\u9952<\u994c<\u9955" - "<\u9997<\u9998<\u99a5<\u99ad<\u99ae<\u99bc<\u99df<\u99db<\u99dd" - "<\u99d8<\u99d1<\u99ed<\u99ee<\u99f1<\u99f2<\u99fb<\u99f8<\u9a01" - "<\u9a0f<\u9a05<\u99e2<\u9a19<\u9a2b<\u9a37<\u9a45<\u9a42<\u9a40" - "<\u9a43<\u9a3e<\u9a55<\u9a4d<\u9a5b<\u9a57<\u9a5f<\u9a62<\u9a65" - "<\u9a64<\u9a69<\u9a6b<\u9a6a<\u9aad<\u9ab0<\u9abc<\u9ac0<\u9acf" - "<\u9ad1<\u9ad3<\u9ad4<\u9ade<\u9adf<\u9ae2<\u9ae3<\u9ae6<\u9aef" - "<\u9aeb<\u9aee<\u9af4<\u9af1<\u9af7<\u9afb<\u9b06<\u9b18<\u9b1a" - "<\u9b1f<\u9b22<\u9b23<\u9b25<\u9b27<\u9b28<\u9b29<\u9b2a<\u9b2e" - "<\u9b2f<\u9b32<\u9b44<\u9b43<\u9b4f<\u9b4d<\u9b4e<\u9b51<\u9b58" - "<\u9b74<\u9b93<\u9b83<\u9b91<\u9b96<\u9b97<\u9b9f<\u9ba0<\u9ba8" - "<\u9bb4<\u9bc0<\u9bca<\u9bb9<\u9bc6<\u9bcf<\u9bd1<\u9bd2<\u9be3" - "<\u9be2<\u9be4<\u9bd4<\u9be1<\u9c3a<\u9bf2<\u9bf1<\u9bf0<\u9c15" - "<\u9c14<\u9c09<\u9c13<\u9c0c<\u9c06<\u9c08<\u9c12<\u9c0a<\u9c04" - "<\u9c2e<\u9c1b<\u9c25<\u9c24<\u9c21<\u9c30<\u9c47<\u9c32<\u9c46" - "<\u9c3e<\u9c5a<\u9c60<\u9c67<\u9c76<\u9c78<\u9ce7<\u9cec<\u9cf0" - "<\u9d09<\u9d08<\u9ceb<\u9d03<\u9d06<\u9d2a<\u9d26<\u9daf<\u9d23" - "<\u9d1f<\u9d44<\u9d15<\u9d12<\u9d41<\u9d3f<\u9d3e<\u9d46<\u9d48" - "<\u9d5d<\u9d5e<\u9d64<\u9d51<\u9d50<\u9d59<\u9d72<\u9d89<\u9d87" - "<\u9dab<\u9d6f<\u9d7a<\u9d9a<\u9da4<\u9da9<\u9db2<\u9dc4<\u9dc1" - "<\u9dbb<\u9db8<\u9dba<\u9dc6<\u9dcf<\u9dc2<\u9dd9<\u9dd3<\u9df8" - "<\u9de6<\u9ded<\u9def<\u9dfd<\u9e1a<\u9e1b<\u9e1e<\u9e75<\u9e79" - "<\u9e7d<\u9e81<\u9e88<\u9e8b<\u9e8c<\u9e92<\u9e95<\u9e91<\u9e9d" - "<\u9ea5<\u9ea9<\u9eb8<\u9eaa<\u9ead<\u9761<\u9ecc<\u9ece<\u9ecf" - "<\u9ed0<\u9ed4<\u9edc<\u9ede<\u9edd<\u9ee0<\u9ee5<\u9ee8<\u9eef" - "<\u9ef4<\u9ef6<\u9ef7<\u9ef9<\u9efb<\u9efc<\u9efd<\u9f07<\u9f08" - "<\u76b7<\u9f15<\u9f21<\u9f2c<\u9f3e<\u9f4a<\u9f52<\u9f54<\u9f63" - "<\u9f5f<\u9f60<\u9f61<\u9f66<\u9f67<\u9f6c<\u9f6a<\u9f77<\u9f72" - "<\u9f76<\u9f95<\u9f9c<\u9fa0<\u582f<\u69c7<\u9059<\u7464<\u51dc" - "<\u7199" - } - } - - Countries { - AF { "\u30a2\u30d5\u30ac\u30cb\u30b9\u30bf\u30f3" } - AL { "\u30a2\u30eb\u30d0\u30cb\u30a2" } - DZ { "\u30a2\u30eb\u30b8\u30a7\u30ea\u30a2" } - AD { "\u30a2\u30f3\u30c9\u30e9" } - AO { "\u30a2\u30f3\u30b4\u30e9" } - AI { "\u30a2\u30f3\u30ae\u30e9" } - AR { "\u30a2\u30eb\u30bc\u30f3\u30c1\u30f3" } - AM { "\u30a2\u30eb\u30e1\u30cb\u30a2" } - AW { "\u30a2\u30eb\u30d0\u5cf6" } - AU { "\u30aa\u30fc\u30b9\u30c8\u30e9\u30ea\u30a2" } - AT { "\u30aa\u30fc\u30b9\u30c8\u30ea\u30a2" } - AZ { "\u30a2\u30bc\u30eb\u30d0\u30a4\u30b8\u30e3\u30f3" } - BS { "\u30d0\u30cf\u30de" } - BH { "\u30d0\u30fc\u30ec\u30fc\u30f3" } - BD { "\u30d0\u30f3\u30b0\u30e9\u30c7\u30b7\u30e5" } - BB { "\u30d0\u30eb\u30d0\u30c9\u30b9" } - BY { "\u30d9\u30e9\u30eb\u30fc\u30b7" } - BE { "\u30d9\u30eb\u30ae\u30fc" } - BZ { "\u30d9\u30ea\u30fc\u30ba" } - BJ { "\u30d9\u30cb\u30f3" } - BM { "\u30d0\u30fc\u30df\u30e5\u30fc\u30c0\u8af8\u5cf6" } - BT { "\u30d6\u30fc\u30bf\u30f3" } - BO { "\u30dc\u30ea\u30d3\u30a2" } - BA { "\u30dc\u30b9\u30cb\u30a2\u30fb\u30d8\u30eb\u30c4\u30a7\u30b4\u30d3\u30ca" } - BW { "\u30dc\u30c4\u30ef\u30ca" } - BR { "\u30d6\u30e9\u30b8\u30eb" } - BN { "\u30d6\u30eb\u30cd\u30a4" } - BG { "\u30d6\u30eb\u30ac\u30ea\u30a2" } - BF { "\u30d6\u30eb\u30ad\u30ca\u30d5\u30a1\u30bd" } - BI { "\u30d6\u30eb\u30f3\u30b8" } - KH { "\u30ab\u30f3\u30dc\u30b8\u30a2" } - CM { "\u30ab\u30e1\u30eb\u30fc\u30f3" } - CA { "\u30ab\u30ca\u30c0" } - CV { "\u30ab\u30fc\u30dc\u30d9\u30eb\u30c7" } - CF { "\u4e2d\u592e\u30a2\u30d5\u30ea\u30ab\u5171\u548c\u56fd" } - TD { "\u30c1\u30e3\u30c9" } - CL { "\u30c1\u30ea" } - CN { "\u4e2d\u56fd" } // China - CO { "\u30b3\u30ed\u30f3\u30d3\u30a2" } - KM { "\u30b3\u30e2\u30ed" } - CG { "\u30b3\u30f3\u30b4" } - CR { "\u30b3\u30b9\u30bf\u30ea\u30ab" } - CI { "\u30b3\u30fc\u30c8\u30b8\u30dc\u30a2\u30fc\u30eb" } - HR { "\u30af\u30ed\u30a2\u30c1\u30a2" } - CU { "\u30ad\u30e5\u30fc\u30d0" } - CY { "\u30ad\u30d7\u30ed\u30b9" } - CZ { "\u30c1\u30a7\u30b3" } - DK { "\u30c7\u30f3\u30de\u30fc\u30af" } - DJ { "\u30b8\u30d6\u30c1" } - DM { "\u30c9\u30df\u30cb\u30ab\u56fd" } - DO { "\u30c9\u30df\u30cb\u30ab\u5171\u548c\u56fd" } - TL { "\u6771\u30c6\u30a3\u30e2\u30fc\u30eb" } - EC { "\u30a8\u30af\u30a2\u30c9\u30eb" } - EG { "\u30a8\u30b8\u30d7\u30c8" } - SV { "\u30a8\u30eb\u30b5\u30eb\u30d0\u30c9\u30eb" } - GQ { "\u8d64\u9053\u30ae\u30cb\u30a2" } - ER { "\u30a8\u30ea\u30c8\u30ea\u30a2" } - EE { "\u30a8\u30b9\u30c8\u30cb\u30a2" } - ET { "\u30a8\u30c1\u30aa\u30d4\u30a2" } - FJ { "\u30d5\u30a3\u30b8\u30fc" } - FI { "\u30d5\u30a3\u30f3\u30e9\u30f3\u30c9" } - FO { "\u30d5\u30a7\u30ed\u30fc\u8af8\u5cf6" } - FR { "\u30d5\u30e9\u30f3\u30b9" } - GF { "\u4ecf\u9818\u30ae\u30a2\u30ca" } - PF { "\u4ecf\u9818\u30dd\u30ea\u30cd\u30b7\u30a2" } - TF { "\u4ecf\u5357\u65b9\u9818" } - GA { "\u30ac\u30dc\u30f3" } - GM { "\u30ac\u30f3\u30d3\u30a2" } - GE { "\u30b0\u30eb\u30b8\u30a2" } - DE { "\u30c9\u30a4\u30c4" } - GH { "\u30ac\u30fc\u30ca" } - GR { "\u30ae\u30ea\u30b7\u30a2" } - GP { "\u30b0\u30a2\u30c9\u30eb\u30fc\u30d7" } - GT { "\u30b0\u30a2\u30c6\u30de\u30e9" } - GL { "\u30b0\u30ea\u30fc\u30f3\u30e9\u30f3\u30c9" } - GN { "\u30ae\u30cb\u30a2" } - GW { "\u30ae\u30cb\u30a2\u30d3\u30b5\u30a6" } - GY { "\u30ac\u30a4\u30a2\u30ca" } - HT { "\u30cf\u30a4\u30c1" } - HN { "\u30db\u30f3\u30b8\u30e5\u30e9\u30b9" } - HK { "\u4e2d\u83ef\u4eba\u6c11\u5171\u548c\u56fd\u9999\u6e2f\u7279\u5225\u884c\u653f\u533a" } // PRC Hong Kong SAR - HU { "\u30cf\u30f3\u30ac\u30ea\u30fc" } - IS { "\u30a2\u30a4\u30b9\u30e9\u30f3\u30c9" } - IN { "\u30a4\u30f3\u30c9" } - ID { "\u30a4\u30f3\u30c9\u30cd\u30b7\u30a2" } - IR { "\u30a4\u30e9\u30f3" } - IQ { "\u30a4\u30e9\u30af" } - IE { "\u30a2\u30a4\u30eb\u30e9\u30f3\u30c9" } - IL { "\u30a4\u30b9\u30e9\u30a8\u30eb" } - IT { "\u30a4\u30bf\u30ea\u30a2" } - JM { "\u30b8\u30e3\u30de\u30a4\u30ab" } - JP { "\u65e5\u672c" } - JO { "\u30e8\u30eb\u30c0\u30f3" } - KZ { "\u30ab\u30b6\u30d5\u30b9\u30bf\u30f3" } - KE { "\u30b1\u30cb\u30a2" } - KI { "\u30ad\u30ea\u30d0\u30b9" } - KP { "\u671d\u9bae\u6c11\u4e3b\u4e3b\u7fa9\u4eba\u6c11\u5171\u548c\u56fd" } - KR { "\u5927\u97d3\u6c11\u56fd" } - KW { "\u30af\u30a6\u30a7\u30fc\u30c8" } - KG { "\u30ad\u30eb\u30ae\u30b9\u30bf\u30f3" } - LA { "\u30e9\u30aa\u30b9" } - LV { "\u30e9\u30c8\u30d3\u30a2" } - LB { "\u30ec\u30d0\u30ce\u30f3" } - LS { "\u30ec\u30bd\u30c8" } - LR { "\u30ea\u30d9\u30ea\u30a2" } - LY { "\u30ea\u30d3\u30a2" } - LI { "\u30ea\u30d2\u30c6\u30f3\u30b7\u30e5\u30bf\u30a4\u30f3" } - LT { "\u30ea\u30c8\u30a2\u30cb\u30a2" } - LU { "\u30eb\u30af\u30bb\u30f3\u30d6\u30eb\u30b0" } - MK { "\u30de\u30b1\u30c9\u30cb\u30a2" } - MG { "\u30de\u30c0\u30ac\u30b9\u30ab\u30eb" } - MO { "\u4e2d\u83ef\u4eba\u6c11\u5171\u548c\u56fd\u30de\u30ab\u30aa\u7279\u5225\u884c\u653f\u533a" } // PRC Makao SAR - MY { "\u30de\u30ec\u30fc\u30b7\u30a2" } - ML { "\u30de\u30ea" } - MT { "\u30de\u30eb\u30bf" } - MQ { "\u30de\u30eb\u30c6\u30a3\u30cb\u30fc\u30af\u5cf6" } - MR { "\u30e2\u30fc\u30ea\u30bf\u30cb\u30a2" } - MU { "\u30e2\u30fc\u30ea\u30b7\u30e3\u30b9" } - YT { "\u30de\u30e8\u30c3\u30c8\u5cf6" } - MX { "\u30e1\u30ad\u30b7\u30b3" } - FM { "\u30df\u30af\u30ed\u30cd\u30b7\u30a2" } - MD { "\u30e2\u30eb\u30c9\u30d0" } - MC { "\u30e2\u30ca\u30b3" } - MN { "\u30e2\u30f3\u30b4\u30eb" } - MS { "\u30e2\u30f3\u30c8\u30bb\u30e9\u30c8\u5cf6" } - MA { "\u30e2\u30ed\u30c3\u30b3" } - MZ { "\u30e2\u30b6\u30f3\u30d3\u30fc\u30af" } - MM { "\u30df\u30e3\u30f3\u30de\u30fc" } - NA { "\u30ca\u30df\u30d3\u30a2" } - NP { "\u30cd\u30d1\u30fc\u30eb" } - NL { "\u30aa\u30e9\u30f3\u30c0" } - AN { "\u30aa\u30e9\u30f3\u30c0\u9818\u30a2\u30f3\u30c6\u30a3\u30eb\u8af8\u5cf6" } - NC { "\u30cb\u30e5\u30fc\u30ab\u30ec\u30c9\u30cb\u30a2" } - NZ { "\u30cb\u30e5\u30fc\u30b8\u30fc\u30e9\u30f3\u30c9" } - NI { "\u30cb\u30ab\u30e9\u30b0\u30a2" } - NE { "\u30cb\u30b8\u30a7\u30fc\u30eb" } - NG { "\u30ca\u30a4\u30b8\u30a7\u30ea\u30a2" } - NU { "\u30cb\u30a6\u30a8\u5cf6" } - NO { "\u30ce\u30eb\u30a6\u30a7\u30fc" } - OM { "\u30aa\u30de\u30fc\u30f3" } - PK { "\u30d1\u30ad\u30b9\u30bf\u30f3" } - PA { "\u30d1\u30ca\u30de" } - PG { "\u30d1\u30d7\u30a2\u30cb\u30e5\u30fc\u30ae\u30cb\u30a2" } - PY { "\u30d1\u30e9\u30b0\u30a2\u30a4" } - PE { "\u30da\u30eb\u30fc" } - PH { "\u30d5\u30a3\u30ea\u30d4\u30f3" } - PL { "\u30dd\u30fc\u30e9\u30f3\u30c9" } - PT { "\u30dd\u30eb\u30c8\u30ac\u30eb" } - PR { "\u30d7\u30a8\u30eb\u30c8\u30ea\u30b3" } - QA { "\u30ab\u30bf\u30fc\u30eb" } - RO { "\u30eb\u30fc\u30de\u30cb\u30a2" } - RU { "\u30ed\u30b7\u30a2" } - RW { "\u30eb\u30ef\u30f3\u30c0" } - SA { "\u30b5\u30a6\u30b8\u30a2\u30e9\u30d3\u30a2" } - SN { "\u30bb\u30cd\u30ac\u30eb" } - SP { "\u30bb\u30eb\u30d3\u30a2" } - SC { "\u30bb\u30a4\u30b7\u30a7\u30eb" } - SL { "\u30b7\u30a8\u30e9\u30ec\u30aa\u30cd" } - SG { "\u30b7\u30f3\u30ac\u30dd\u30fc\u30eb" } - SK { "\u30b9\u30ed\u30d0\u30ad\u30a2" } - SI { "\u30b9\u30ed\u30d9\u30cb\u30a2" } - SO { "\u30bd\u30de\u30ea\u30a2" } - ZA { "\u5357\u30a2\u30d5\u30ea\u30ab" } - ES { "\u30b9\u30da\u30a4\u30f3" } - LK { "\u30b9\u30ea\u30e9\u30f3\u30ab" } - SD { "\u30b9\u30fc\u30c0\u30f3" } - SR { "\u30b9\u30ea\u30ca\u30e0" } - SZ { "\u30b9\u30ef\u30b8\u30e9\u30f3\u30c9" } - SE { "\u30b9\u30a6\u30a7\u30fc\u30c7\u30f3" } - CH { "\u30b9\u30a4\u30b9" } - SY { "\u30b7\u30ea\u30a2" } - TW { "\u53f0\u6e7e" } - TJ { "\u30bf\u30b8\u30ad\u30b9\u30bf\u30f3" } - TZ { "\u30bf\u30f3\u30b6\u30cb\u30a2" } - TH { "\u30bf\u30a4" } - TG { "\u30c8\u30fc\u30b4" } - TK { "\u30c8\u30b1\u30e9\u30a6\u8af8\u5cf6" } - TO { "\u30c8\u30f3\u30ac" } - TT { "\u30c8\u30ea\u30cb\u30c0\u30fc\u30c9\u30fb\u30c8\u30d0\u30b4" } - TN { "\u30c1\u30e5\u30cb\u30b8\u30a2" } - TR { "\u30c8\u30eb\u30b3" } - TM { "\u30c8\u30eb\u30af\u30e1\u30cb\u30b9\u30bf\u30f3" } - UG { "\u30a6\u30ac\u30f3\u30c0" } - UA { "\u30a6\u30af\u30e9\u30a4\u30ca" } - AE { "\u30a2\u30e9\u30d6\u9996\u9577\u56fd\u9023\u90a6" } - GB { "\u30a4\u30ae\u30ea\u30b9" } - US { "\u30a2\u30e1\u30ea\u30ab\u5408\u8846\u56fd" } - UY { "\u30a6\u30eb\u30b0\u30a2\u30a4" } - UZ { "\u30a6\u30ba\u30d9\u30ad\u30b9\u30bf\u30f3" } - VU { "\u30d0\u30cc\u30a2\u30c4" } - VA { "\u30d0\u30c1\u30ab\u30f3" } - VE { "\u30d9\u30cd\u30ba\u30a8\u30e9" } - VN { "\u30d9\u30c8\u30ca\u30e0" } - VG { "\u82f1\u9818\u30d0\u30fc\u30b8\u30f3\u8af8\u5cf6" } - VI { "\u7c73\u9818\u30d0\u30fc\u30b8\u30f3\u8af8\u5cf6" } - EH { "\u897f\u30b5\u30cf\u30e9" } - YE { "\u30a4\u30a8\u30e1\u30f3" } - YU { "\u30e6\u30fc\u30b4\u30b9\u30e9\u30d3\u30a2" } // Yuugosurabia - //ZR { "\u30b6\u30a4\u30fc\u30eb" } // It's now called CD { "Democratic Republic of the Congo" } - ZM { "\u30b6\u30f3\u30d3\u30a2" } - ZW { "\u30b8\u30f3\u30d0\u30d6\u30a8" } - } - DateTimePatterns { - "H'\u6642'mm'\u5206'ss'\u79D2'z", - "H:mm:ss:z", - "H:mm:ss", - "H:mm", - "yyyy'\u5E74'M'\u6708'd'\u65E5'EEEE", - "yyyy'\u5E74'M'\u6708'd'\u65E5'", - "yyyy/MM/dd", - "yy/MM/dd", - "{1} {0}", - } - DayAbbreviations { - "\u65E5", - "\u6708", - "\u706B", - "\u6C34", - "\u6728", - "\u91D1", - "\u571F", - } - DayNames { - "\u65E5\u66DC\u65E5", - "\u6708\u66DC\u65E5", - "\u706B\u66DC\u65E5", - "\u6C34\u66DC\u65E5", - "\u6728\u66DC\u65E5", - "\u91D1\u66DC\u65E5", - "\u571F\u66DC\u65E5", - } - Eras { - "\u7D00\u5143\u524D", - "\u897F\u66A6", - } - Languages { - ab { "\u30a2\u30d6\u30cf\u30ba\u8a9e" } - aa { "\u30a2\u30d5\u30a1\u30fc\u30eb\u8a9e" } - af { "\u30a2\u30d5\u30ea\u30ab\u30fc\u30f3\u30b9\u8a9e" } - sq { "\u30a2\u30eb\u30d0\u30cb\u30a2\u8a9e" } - am { "\u30a2\u30e0\u30cf\u30e9\u8a9e" } - ar { "\u30a2\u30e9\u30d3\u30a2\u8a9e" } - hy { "\u30a2\u30eb\u30e1\u30cb\u30a2\u8a9e" } - as { "\u30a2\u30c3\u30b5\u30e0\u8a9e" } - ay { "\u30a2\u30a4\u30de\u30e9\u8a9e" } - az { "\u30a2\u30bc\u30eb\u30d0\u30a4\u30b8\u30e3\u30f3\u8a9e" } - ba { "\u30d0\u30b7\u30ad\u30fc\u30eb\u8a9e" } - eu { "\u30d0\u30b9\u30af\u8a9e" } - bn { "\u30d9\u30f3\u30ac\u30eb\u8a9e" } - dz { "\u30d6\u30fc\u30bf\u30f3\u8a9e" } - bh { "\u30d3\u30cf\u2015\u30eb\u8a9e" } - bi { "\u30d3\u30b9\u30e9\u30de\u8a9e" } - br { "\u30d6\u30eb\u30c8\u30f3\u8a9e" } - bg { "\u30d6\u30eb\u30ac\u30ea\u30a2\u8a9e" } - my { "\u30d3\u30eb\u30de\u8a9e" } - be { "\u30d9\u30e9\u30eb\u30fc\u30b7\u8a9e" } - km { "\u30ab\u30f3\u30dc\u30b8\u30a2\u8a9e" } - ca { "\u30ab\u30bf\u30ed\u30cb\u30a2\u8a9e" } - zh { "\u4e2d\u56fd\u8a9e" } - co { "\u30b3\u30eb\u30b7\u30ab\u8a9e" } - hr { "\u30af\u30ed\u30a2\u30c1\u30a2\u8a9e" } - cs { "\u30c1\u30a7\u30b3\u8a9e" } - da { "\u30c7\u30f3\u30de\u30fc\u30af\u8a9e" } - nl { "\u30aa\u30e9\u30f3\u30c0\u8a9e" } - en { "\u82f1\u8a9e" } - eo { "\u30a8\u30b9\u30da\u30e9\u30f3\u30c8\u8a9e" } - et { "\u30a8\u30b9\u30c8\u30cb\u30a2\u8a9e" } - fo { "\u30d5\u30a7\u30ed\u30fc\u8a9e" } - fj { "\u30d5\u30a3\u30b8\u30fc\u8a9e" } - fi { "\u30d5\u30a3\u30f3\u30e9\u30f3\u30c9\u8a9e" } - fr { "\u30d5\u30e9\u30f3\u30b9\u8a9e" } - fy { "\u30d5\u30ea\u30b8\u30a2\u8a9e" } - gl { "\u30ac\u30ea\u30b7\u30a2\u8a9e" } - ka { "\u30b0\u30eb\u30b8\u30a2\u8a9e" } - de { "\u30c9\u30a4\u30c4\u8a9e" } - el { "\u30ae\u30ea\u30b7\u30a2\u8a9e" } - kl { "\u30b0\u30ea\u30fc\u30f3\u30e9\u30f3\u30c9\u8a9e" } - gn { "\u30b0\u30ef\u30e9\u30cb\u8a9e" } - gu { "\u30b0\u30b8\u30e3\u30e9\u30fc\u30c8\u8a9e" } - gv { "\u30de\u30f3\u5cf6\u8a9e" } - ha { "\u30cf\u30a6\u30b5\u8a9e" } - haw { "\u30cf\u30ef\u30a4\u8a9e" } - he { "\u30d8\u30d6\u30e9\u30a4\u8a9e" } - hi { "\u30d2\u30f3\u30c7\u30a3\u30fc\u8a9e" } - hu { "\u30cf\u30f3\u30ac\u30ea\u30fc\u8a9e" } - is { "\u30a2\u30a4\u30b9\u30e9\u30f3\u30c9\u8a9e" } - id { "\u30a4\u30f3\u30c9\u30cd\u30b7\u30a2\u8a9e" } - ia { "\u56fd\u969b\u8a9e" } - ie { "\u56fd\u969b\u8a9e" } - iu { "\u30a4\u30cc\u30af\u30a6\u30c6\u30a3\u30c8\u30c3\u30c8\u8a9e" } - ik { "\u30a4\u30cc\u30d4\u30a2\u30c3\u30af\u8a9e" } - ga { "\u30a2\u30a4\u30eb\u30e9\u30f3\u30c9\u8a9e" } - it { "\u30a4\u30bf\u30ea\u30a2\u8a9e" } - ja { "\u65e5\u672c\u8a9e" } - jv { "\u30b8\u30e3\u30ef\u8a9e" } - //jw { "\u30b8\u30e3\u30ef\u8a9e" } // Use jv instead - kn { "\u30ab\u30f3\u30ca\u30c0\u8a9e" } - ks { "\u30ab\u30b7\u30df\u30fc\u30eb\u8a9e" } - kk { "\u30ab\u30b6\u30d5\u8a9e" } - rw { "\u30eb\u30ef\u30f3\u30c0\u8a9e" } - ky { "\u30ad\u30eb\u30ae\u30b9\u8a9e" } - rn { "\u30eb\u30f3\u30b8\u8a9e" } - ko { "\u97d3\u56fd\u8a9e" } - ku { "\u30af\u30eb\u30c9\u8a9e" } - lo { "\u30e9\u30aa\u8a9e" } - la { "\u30e9\u30c6\u30f3\u8a9e" } - lv { "\u30e9\u30c8\u30d3\u30a2\u8a9e" } - ln { "\u30ea\u30f3\u30ac\u30e9\u8a9e" } - lt { "\u30ea\u30c8\u30a2\u30cb\u30a2\u8a9e" } - mk { "\u30de\u30b1\u30c9\u30cb\u30a2\u8a9e" } - mg { "\u30de\u30e9\u30ac\u30b7\u30fc\u8a9e" } - ms { "\u30de\u30e9\u30a4\u8a9e" } - ml { "\u30de\u30e9\u30e4\u2015\u30e9\u30e0\u8a9e" } - mt { "\u30de\u30eb\u30bf\u8a9e" } - mi { "\u30de\u30aa\u30ea\u8a9e" } - mr { "\u30de\u30e9\u30fc\u30c6\u30a3\u30fc\u8a9e" } - mo { "\u30e2\u30eb\u30c0\u30d3\u30a2\u8a9e" } - mn { "\u30e2\u30f3\u30b4\u30eb\u8a9e" } - na { "\u30ca\u30a6\u30eb\u8a9e" } - ne { "\u30cd\u30d1\u30fc\u30eb\u8a9e" } - no { "\u30ce\u30eb\u30a6\u30a7\u30fc\u8a9e" } - nb { "\u30ce\u30eb\u30a6\u30a7\u30fc\u8a9e (\u30dc\u30af\u30e2\u30fc\u30eb)" } - nn { "\u30ce\u30eb\u30a6\u30a7\u30fc\u8a9e (\u30cb\u30e5\u30fc\u30ce\u30eb\u30b9\u30af)" } - oc { "\u30d7\u30ed\u30d0\u30f3\u30b9\u8a9e" } - or { "\u30aa\u30ea\u30e4\u30fc\u8a9e" } - om { "\u30ac\u30e9\u8a9e" } - ps { "\u30d1\u30b7\u30e5\u30c8\u30fc\u8a9e" } - fa { "\u30da\u30eb\u30b7\u30a2\u8a9e" } - pl { "\u30dd\u30fc\u30e9\u30f3\u30c9\u8a9e" } - pt { "\u30dd\u30eb\u30c8\u30ac\u30eb\u8a9e" } - pa { "\u30d1\u30f3\u30b8\u30e3\u30d6\u8a9e" } - qu { "\u30b1\u30c1\u30e5\u30a2\u8a9e" } - rm { "\u30ec\u30c8\uff1d\u30ed\u30de\u30f3\u8a9e" } - ro { "\u30eb\u30fc\u30de\u30cb\u30a2\u8a9e" } - ru { "\u30ed\u30b7\u30a2\u8a9e" } - sm { "\u30b5\u30e2\u30a2\u8a9e" } - sg { "\u30b5\u30f3\u30b4\u8a9e" } - sa { "\u30b5\u30f3\u30b9\u30af\u30ea\u30c3\u30c8\u8a9e" } - gd { "\u30b9\u30b3\u30c3\u30c8\u30e9\u30f3\u30c9\u30fb\u30b2\u30fc\u30eb\u8a9e" } - sr { "\u30bb\u30eb\u30d3\u30a2\u8a9e" } - sh { "\u30bb\u30eb\u30dc\uff1d\u30af\u30ed\u30a2\u30c1\u30a2\u8a9e" } - st { "\u30bb\u30bd\u30c8\u8a9e" } - tn { "\u30c4\u30ef\u30ca\u8a9e" } - sn { "\u30b7\u30e7\u30ca\u8a9e" } - sd { "\u30b7\u30f3\u30c9\u8a9e" } - si { "\u30b7\u30f3\u30cf\u30e9\u8a9e" } - ss { "\u30b7\u30b9\u30ef\u30c6\u30a3\u8a9e" } - sk { "\u30b9\u30ed\u30d0\u30ad\u30a2\u8a9e" } - sl { "\u30b9\u30ed\u30d9\u30cb\u30a2\u8a9e" } - so { "\u30bd\u30de\u30ea\u8a9e" } - es { "\u30b9\u30da\u30a4\u30f3\u8a9e" } - su { "\u30b9\u30f3\u30c0\u8a9e" } - sw { "\u30b9\u30ef\u30d2\u30ea\u8a9e" } - sv { "\u30b9\u30a6\u30a7\u30fc\u30c7\u30f3\u8a9e" } - tl { "\u30bf\u30ac\u30ed\u30b0\u8a9e" } - tg { "\u30bf\u30b8\u30af\u8a9e" } - ta { "\u30bf\u30df\u30fc\u30eb\u8a9e" } - tt { "\u30bf\u30bf\u30fc\u30eb\u8a9e" } - te { "\u30c6\u30eb\u30b0\u8a9e" } - th { "\u30bf\u30a4\u8a9e" } - bo { "\u30c1\u30d9\u30c3\u30c8\u8a9e" } - ti { "\u30c6\u30a3\u30b0\u30ea\u30cb\u30a2\u8a9e" } - to { "\u30c8\u30f3\u30ac\u8a9e" } - ts { "\u30c4\u30a9\u30f3\u30ac\u8a9e" } - tr { "\u30c8\u30eb\u30b3\u8a9e" } - tk { "\u30c8\u30eb\u30af\u30e1\u30f3\u8a9e" } - tw { "\u30c8\u30a5\u30a4\u8a9e" } - ug { "\u30a6\u30a4\u30b0\u30eb\u8a9e" } - uk { "\u30a6\u30af\u30e9\u30a4\u30ca\u8a9e" } - ur { "\u30a6\u30eb\u30c9\u30a5\u30fc\u8a9e" } - uz { "\u30a6\u30ba\u30d9\u30af\u8a9e" } - vi { "\u30d9\u30c8\u30ca\u30e0\u8a9e" } - vo { "\u30dc\u30e9\u30d4\u30e5\u30af\u8a9e" } - cy { "\u30a6\u30a7\u30fc\u30eb\u30ba\u8a9e" } - wo { "\u30a6\u30a9\u30ed\u30d5\u8a9e" } - xh { "\u30b3\u30b5\u8a9e" } - kw { "\u30b3\u30fc\u30f3\u30a6\u30a9\u30fc\u30eb\u8a9e" } - yi { "\u30a4\u30c7\u30a3\u30c3\u30b7\u30e5\u8a9e" } - yo { "\u30e8\u30eb\u30d0\u8a9e" } - za { "\u30c1\u30ef\u30f3\u8a9e" } - zu { "\u30ba\u30fc\u30eb\u30fc\u8a9e" } - } - LocaleID:int { 0x11 } -// LocaleString { "ja" } - MonthAbbreviations { - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "10", - "11", - "12", - } - MonthNames { - "1\u6708", - "2\u6708", - "3\u6708", - "4\u6708", - "5\u6708", - "6\u6708", - "7\u6708", - "8\u6708", - "9\u6708", - "10\u6708", - "11\u6708", - "12\u6708", - } -// NumberElements { -// ".", -// ",", -// ";", -// "%", -// "0", -// "#", -// "-", -// "E", -// "\u2030", -// "\u221E", -// "\uFFFD", -// } -// ShortLanguage { "jpn" } - localPatternChars { "GanjkHmsSEDFwWxhKzAe" } - zoneStrings { - { - "Asia/Tokyo", - "\u65E5\u672C\u6A19\u6E96\u6642", - "JST", - "\u65E5\u672C\u6A19\u6E96\u6642", - "JST", - } - } - LocaleScript{ "Kana","Hira", "Hani" } - - ExemplarCharacters{ - "[\u3041-\u3093\u309B-\u309E\u30A1-\u30F6\u30FB-\u30FE" - "\u4E00-\u4E01\u4E03\u4E07-\u4E0B\u4E0D-\u4E0E\u4E10-\u4E11" - "\u4E14-\u4E19\u4E1E\u4E21\u4E26\u4E2A\u4E2D\u4E31-\u4E32" - "\u4E36\u4E38-\u4E39\u4E3B-\u4E3C\u4E3F\u4E42-\u4E43" - "\u4E45\u4E4B\u4E4D-\u4E4F\u4E55-\u4E59\u4E5D-\u4E5F" - "\u4E62\u4E71\u4E73\u4E7E\u4E80\u4E82\u4E85-\u4E86" - "\u4E88-\u4E8C\u4E8E\u4E91-\u4E92\u4E94-\u4E95\u4E98-\u4E99" - "\u4E9B-\u4E9C\u4E9E-\u4EA2\u4EA4-\u4EA6\u4EA8\u4EAB-\u4EAE" - "\u4EB0\u4EB3\u4EB6\u4EBA\u4EC0-\u4EC2\u4EC4\u4EC6-\u4EC7" - "\u4ECA-\u4ECB\u4ECD-\u4ECF\u4ED4-\u4ED9\u4EDD-\u4EDF" - "\u4EE3-\u4EE5\u4EED-\u4EEE\u4EF0\u4EF2\u4EF6-\u4EF7" - "\u4EFB\u4F01\u4F09-\u4F0A\u4F0D-\u4F11\u4F1A\u4F1C-\u4F1D" - "\u4F2F-\u4F30\u4F34\u4F36\u4F38\u4F3A\u4F3C-\u4F3D" - "\u4F43\u4F46-\u4F47\u4F4D-\u4F51\u4F53\u4F55\u4F57" - "\u4F59-\u4F5E\u4F69\u4F6F-\u4F70\u4F73\u4F75-\u4F76" - "\u4F7B-\u4F7C\u4F7F\u4F83\u4F86\u4F88\u4F8B\u4F8D" - "\u4F8F\u4F91\u4F96\u4F98\u4F9B\u4F9D\u4FA0-\u4FA1" - "\u4FAB\u4FAD-\u4FAF\u4FB5-\u4FB6\u4FBF\u4FC2-\u4FC4" - "\u4FCA\u4FCE\u4FD0-\u4FD1\u4FD4\u4FD7-\u4FD8\u4FDA-\u4FDB" - "\u4FDD\u4FDF\u4FE1\u4FE3-\u4FE5\u4FEE-\u4FEF\u4FF3" - "\u4FF5-\u4FF6\u4FF8\u4FFA\u4FFE\u5005-\u5006\u5009" - "\u500B\u500D\u500F\u5011-\u5012\u5014\u5016\u5019-\u501A" - "\u501F\u5021\u5023-\u5026\u5028-\u502D\u5036\u5039" - "\u5043\u5047-\u5049\u504F-\u5050\u5055-\u5056\u505A" - "\u505C\u5065\u506C\u5072\u5074-\u5076\u5078\u507D" - "\u5080\u5085\u508D\u5091\u5098-\u509A\u50AC-\u50AD" - "\u50B2-\u50B5\u50B7\u50BE\u50C2\u50C5\u50C9-\u50CA" - "\u50CD\u50CF\u50D1\u50D5-\u50D6\u50DA\u50DE\u50E3" - "\u50E5\u50E7\u50ED-\u50EE\u50F5\u50F9\u50FB\u5100-\u5102" - "\u5104\u5109\u5112\u5114-\u5116\u5118\u511A\u511F" - "\u5121\u512A\u5132\u5137\u513A-\u513C\u513F-\u5141" - "\u5143-\u5149\u514B-\u514E\u5150\u5152\u5154\u515A" - "\u515C\u5162\u5165\u5168-\u516E\u5171\u5175-\u5178" - "\u517C\u5180\u5182\u5185-\u5186\u5189-\u518A\u518C-\u518D" - "\u518F-\u5193\u5195-\u5197\u5199\u51A0\u51A2\u51A4-\u51A6" - "\u51A8-\u51AC\u51B0-\u51B7\u51BD\u51C4-\u51C6\u51C9" - "\u51CB-\u51CD\u51D6\u51DB-\u51DD\u51E0-\u51E1\u51E6-\u51E7" - "\u51E9-\u51EA\u51ED\u51F0-\u51F1\u51F5-\u51F6\u51F8-\u51FA" - "\u51FD-\u51FE\u5200\u5203-\u5204\u5206-\u5208\u520A-\u520B" - "\u520E\u5211\u5214\u5217\u521D\u5224-\u5225\u5227" - "\u5229-\u522A\u522E\u5230\u5233\u5236-\u523B\u5243-\u5244" - "\u5247\u524A-\u524D\u524F\u5254\u5256\u525B\u525E" - "\u5263-\u5265\u5269-\u526A\u526F-\u5275\u527D\u527F" - "\u5283\u5287-\u5289\u528D\u5291-\u5292\u5294\u529B" - "\u529F-\u52A0\u52A3\u52A9-\u52AD\u52B1\u52B4-\u52B5" - "\u52B9\u52BC\u52BE\u52C1\u52C3\u52C5\u52C7\u52C9" - "\u52CD\u52D2\u52D5\u52D7-\u52D9\u52DD-\u52E0\u52E2-\u52E4" - "\u52E6-\u52E7\u52F2-\u52F3\u52F5\u52F8-\u52FA\u52FE-\u52FF" - "\u5301-\u5302\u5305-\u5306\u5308\u530D\u530F-\u5310" - "\u5315-\u5317\u5319-\u531A\u531D\u5320-\u5321\u5323" - "\u532A\u532F\u5331\u5333\u5338-\u533B\u533F-\u5341" - "\u5343\u5345-\u534A\u534D\u5351-\u5354\u5357-\u5358" - "\u535A\u535C\u535E\u5360\u5366\u5369\u536E-\u5371" - "\u5373-\u5375\u5377-\u5378\u537B\u537F\u5382\u5384" - "\u5396\u5398\u539A\u539F-\u53A0\u53A5-\u53A6\u53A8-\u53A9" - "\u53AD-\u53AE\u53B0\u53B3\u53B6\u53BB\u53C2-\u53C3" - "\u53C8-\u53CE\u53D4\u53D6-\u53D7\u53D9\u53DB\u53DF" - "\u53E1-\u53E5\u53E8-\u53F3\u53F6-\u53F8\u53FA\u5401" - "\u5403-\u5404\u5408-\u5411\u541B\u541D\u541F-\u5420" - "\u5426\u5429\u542B-\u542E\u5436\u5438-\u5439\u543B-\u543E" - "\u5440\u5442\u5446\u5448-\u544A\u544E\u5451\u545F" - "\u5468\u546A\u5470-\u5471\u5473\u5475-\u5477\u547B-\u547D" - "\u5480\u5484\u5486\u548B-\u548C\u548E-\u5490\u5492" - "\u54A2\u54A4-\u54A5\u54A8\u54AB-\u54AC\u54AF\u54B2-\u54B3" - "\u54B8\u54BC-\u54BE\u54C0-\u54C2\u54C4\u54C7-\u54C9" - "\u54D8\u54E1-\u54E2\u54E5-\u54E6\u54E8-\u54E9\u54ED-\u54EE" - "\u54F2\u54FA\u54FD\u5504\u5506-\u5507\u550F-\u5510" - "\u5514\u5516\u552E-\u552F\u5531\u5533\u5538-\u5539" - "\u553E\u5540\u5544-\u5546\u554C\u554F\u5553\u5556-\u5557" - "\u555C-\u555D\u5563\u557B-\u557C\u557E\u5580\u5583-\u5584" - "\u5587\u5589-\u558B\u5598-\u559A\u559C-\u559F\u55A7-\u55AC" - "\u55AE\u55B0\u55B6\u55C4-\u55C5\u55C7\u55D4\u55DA" - "\u55DC\u55DF\u55E3-\u55E4\u55F7\u55F9\u55FD-\u55FE" - "\u5606\u5609\u5614\u5616-\u5618\u561B\u5629\u562F" - "\u5631-\u5632\u5634\u5636\u5638\u5642\u564C\u564E" - "\u5650\u565B\u5664\u5668\u566A-\u566C\u5674\u5678" - "\u567A\u5680\u5686-\u5687\u568A\u568F\u5694\u56A0" - "\u56A2\u56A5\u56AE\u56B4\u56B6\u56BC\u56C0-\u56C3" - "\u56C8\u56CE\u56D1\u56D3\u56D7-\u56D8\u56DA-\u56DB" - "\u56DE\u56E0\u56E3\u56EE\u56F0\u56F2-\u56F3\u56F9-\u56FA" - "\u56FD\u56FF-\u5700\u5703-\u5704\u5708-\u5709\u570B" - "\u570D\u570F\u5712-\u5713\u5716\u5718\u571C\u571F" - "\u5726-\u5728\u572D\u5730\u5737-\u5738\u573B\u5740" - "\u5742\u5747\u574A\u574E-\u5751\u5761\u5764\u5766" - "\u5769-\u576A\u577F\u5782\u5788-\u5789\u578B\u5793" - "\u57A0\u57A2-\u57A4\u57AA\u57B0\u57B3\u57C0\u57C3" - "\u57C6\u57CB\u57CE\u57D2-\u57D4\u57D6\u57DC\u57DF-\u57E0" - "\u57E3\u57F4\u57F7\u57F9-\u57FA\u57FC\u5800\u5802" - "\u5805-\u5806\u580A-\u580B\u5815\u5819\u581D\u5821" - "\u5824\u582A\u582F-\u5831\u5834-\u5835\u583A\u583D" - "\u5840-\u5841\u584A-\u584B\u5851-\u5852\u5854\u5857-\u585A" - "\u585E\u5862\u5869\u586B\u5870\u5872\u5875\u5879" - "\u587E\u5883\u5885\u5893\u5897\u589C\u589F\u58A8" - "\u58AB\u58AE\u58B3\u58B8-\u58BB\u58BE\u58C1\u58C5" - "\u58C7\u58CA\u58CC\u58D1\u58D3\u58D5\u58D7-\u58D9" - "\u58DC\u58DE-\u58DF\u58E4-\u58E5\u58EB-\u58EC\u58EE-\u58F2" - "\u58F7\u58F9-\u58FD\u5902\u5909-\u590A\u590F-\u5910" - "\u5915-\u5916\u5918-\u591C\u5922\u5925\u5927\u5929-\u592E" - "\u5931-\u5932\u5937-\u5938\u593E\u5944\u5947-\u5949" - "\u594E-\u5951\u5954-\u5955\u5957-\u5958\u595A\u5960" - "\u5962\u5965\u5967-\u596A\u596C\u596E\u5973-\u5974" - "\u5978\u597D\u5981-\u5984\u598A\u598D\u5993\u5996" - "\u5999\u599B\u599D\u59A3\u59A5\u59A8\u59AC\u59B2" - "\u59B9\u59BB\u59BE\u59C6\u59C9\u59CB\u59D0-\u59D1" - "\u59D3-\u59D4\u59D9-\u59DA\u59DC\u59E5-\u59E6\u59E8" - "\u59EA-\u59EB\u59F6\u59FB\u59FF\u5A01\u5A03\u5A09" - "\u5A11\u5A18\u5A1A\u5A1C\u5A1F-\u5A20\u5A25\u5A29" - "\u5A2F\u5A35-\u5A36\u5A3C\u5A40-\u5A41\u5A46\u5A49" - "\u5A5A\u5A62\u5A66\u5A6A\u5A6C\u5A7F\u5A92\u5A9A-\u5A9B" - "\u5ABC-\u5ABE\u5AC1-\u5AC2\u5AC9\u5ACB-\u5ACC\u5AD0" - "\u5AD6-\u5AD7\u5AE1\u5AE3\u5AE6\u5AE9\u5AFA-\u5AFB" - "\u5B09\u5B0B-\u5B0C\u5B16\u5B22\u5B2A\u5B2C\u5B30" - "\u5B32\u5B36\u5B3E\u5B40\u5B43\u5B45\u5B50-\u5B51" - "\u5B54-\u5B55\u5B57-\u5B58\u5B5A-\u5B5D\u5B5F\u5B63-\u5B66" - "\u5B69\u5B6B\u5B70-\u5B71\u5B73\u5B75\u5B78\u5B7A" - "\u5B80\u5B83\u5B85\u5B87-\u5B89\u5B8B-\u5B8D\u5B8F" - "\u5B95\u5B97-\u5B9D\u5B9F\u5BA2-\u5BA6\u5BAE\u5BB0" - "\u5BB3-\u5BB6\u5BB8-\u5BB9\u5BBF\u5BC2-\u5BC7\u5BC9" - "\u5BCC\u5BD0\u5BD2-\u5BD4\u5BDB\u5BDD-\u5BDF\u5BE1-\u5BE2" - "\u5BE4-\u5BE9\u5BEB\u5BEE\u5BF0\u5BF3\u5BF5-\u5BF6" - "\u5BF8\u5BFA\u5BFE-\u5BFF\u5C01-\u5C02\u5C04-\u5C0B" - "\u5C0D-\u5C0F\u5C11\u5C13\u5C16\u5C1A\u5C20\u5C22" - "\u5C24\u5C28\u5C2D\u5C31\u5C38-\u5C41\u5C45-\u5C46" - "\u5C48\u5C4A-\u5C4B\u5C4D-\u5C51\u5C53\u5C55\u5C5E" - "\u5C60-\u5C61\u5C64-\u5C65\u5C6C\u5C6E-\u5C6F\u5C71" - "\u5C76\u5C79\u5C8C\u5C90-\u5C91\u5C94\u5CA1\u5CA8-\u5CA9" - "\u5CAB-\u5CAC\u5CB1\u5CB3\u5CB6-\u5CB8\u5CBB-\u5CBC" - "\u5CBE\u5CC5\u5CC7\u5CD9\u5CE0-\u5CE1\u5CE8-\u5CEA" - "\u5CED\u5CEF-\u5CF0\u5CF6\u5CFA-\u5CFB\u5CFD\u5D07" - "\u5D0B\u5D0E\u5D11\u5D14-\u5D1B\u5D1F\u5D22\u5D29" - "\u5D4B-\u5D4C\u5D4E\u5D50\u5D52\u5D5C\u5D69\u5D6C" - "\u5D6F\u5D73\u5D76\u5D82\u5D84\u5D87\u5D8B-\u5D8C" - "\u5D90\u5D9D\u5DA2\u5DAC\u5DAE\u5DB7\u5DBA\u5DBC-\u5DBD" - "\u5DC9\u5DCC-\u5DCD\u5DD2-\u5DD3\u5DD6\u5DDB\u5DDD-\u5DDE" - "\u5DE1\u5DE3\u5DE5-\u5DE8\u5DEB\u5DEE\u5DF1-\u5DF5" - "\u5DF7\u5DFB\u5DFD-\u5DFE\u5E02-\u5E03\u5E06\u5E0B-\u5E0C" - "\u5E11\u5E16\u5E19-\u5E1B\u5E1D\u5E25\u5E2B\u5E2D" - "\u5E2F-\u5E30\u5E33\u5E36-\u5E38\u5E3D\u5E40\u5E43-\u5E45" - "\u5E47\u5E4C\u5E4E\u5E54-\u5E55\u5E57\u5E5F\u5E61-\u5E64" - "\u5E72-\u5E76\u5E78-\u5E7F\u5E81\u5E83-\u5E84\u5E87" - "\u5E8A\u5E8F\u5E95-\u5E97\u5E9A\u5E9C\u5EA0\u5EA6-\u5EA7" - "\u5EAB\u5EAD\u5EB5-\u5EB8\u5EC1-\u5EC3\u5EC8-\u5ECA" - "\u5ECF-\u5ED0\u5ED3\u5ED6\u5EDA-\u5EDB\u5EDD\u5EDF-\u5EE3" - "\u5EE8-\u5EE9\u5EEC\u5EF0-\u5EF1\u5EF3-\u5EF4\u5EF6-\u5EF8" - "\u5EFA-\u5EFC\u5EFE-\u5EFF\u5F01\u5F03-\u5F04\u5F09-\u5F0D" - "\u5F0F-\u5F11\u5F13-\u5F18\u5F1B\u5F1F\u5F25-\u5F27" - "\u5F29\u5F2D\u5F2F\u5F31\u5F35\u5F37-\u5F38\u5F3C" - "\u5F3E\u5F41\u5F48\u5F4A\u5F4C\u5F4E\u5F51\u5F53" - "\u5F56-\u5F57\u5F59\u5F5C-\u5F5D\u5F61-\u5F62\u5F66" - "\u5F69-\u5F6D\u5F70-\u5F71\u5F73\u5F77\u5F79\u5F7C" - "\u5F7F-\u5F85\u5F87-\u5F88\u5F8A-\u5F8C\u5F90-\u5F93" - "\u5F97-\u5F99\u5F9E\u5FA0-\u5FA1\u5FA8-\u5FAA\u5FAD-\u5FAE" - "\u5FB3-\u5FB4\u5FB9\u5FBC-\u5FBD\u5FC3\u5FC5\u5FCC-\u5FCD" - "\u5FD6-\u5FD9\u5FDC-\u5FDD\u5FE0\u5FE4\u5FEB\u5FF0-\u5FF1" - "\u5FF5\u5FF8\u5FFB\u5FFD\u5FFF\u600E-\u6010\u6012" - "\u6015-\u6016\u6019\u601B-\u601D\u6020-\u6021\u6025-\u602B" - "\u602F\u6031\u603A\u6041-\u6043\u6046\u604A-\u604B" - "\u604D\u6050\u6052\u6055\u6059-\u605A\u605F-\u6060" - "\u6062-\u6065\u6068-\u606D\u606F-\u6070\u6075\u6077" - "\u6081\u6083-\u6084\u6089\u608B-\u608D\u6092\u6094" - "\u6096-\u6097\u609A-\u609B\u609F-\u60A0\u60A3\u60A6-\u60A7" - "\u60A9-\u60AA\u60B2-\u60B6\u60B8\u60BC-\u60BD\u60C5-\u60C7" - "\u60D1\u60D3\u60D8\u60DA\u60DC\u60DF-\u60E1\u60E3" - "\u60E7-\u60E8\u60F0-\u60F1\u60F3-\u60F4\u60F6-\u60F7" - "\u60F9-\u60FB\u6100-\u6101\u6103\u6106\u6108-\u6109" - "\u610D-\u610F\u6115\u611A-\u611B\u611F\u6121\u6127-\u6128" - "\u612C\u6134\u613C-\u613F\u6142\u6144\u6147-\u6148" - "\u614A-\u614E\u6153\u6155\u6158-\u615A\u615D\u615F" - "\u6162-\u6163\u6165\u6167-\u6168\u616B\u616E-\u6171" - "\u6173-\u6177\u617E\u6182\u6187\u618A\u618E\u6190-\u6191" - "\u6194\u6196\u6199-\u619A\u61A4\u61A7\u61A9\u61AB-\u61AC" - "\u61AE\u61B2\u61B6\u61BA\u61BE\u61C3\u61C6-\u61CD" - "\u61D0\u61E3\u61E6\u61F2\u61F4\u61F6-\u61F8\u61FA" - "\u61FC-\u6200\u6208-\u620A\u620C-\u620E\u6210-\u6212" - "\u6214\u6216\u621A-\u621B\u621D-\u621F\u6221\u6226" - "\u622A\u622E-\u6230\u6232-\u6234\u6238\u623B\u623F-\u6241" - "\u6247-\u6249\u624B\u624D-\u624E\u6253\u6255\u6258" - "\u625B\u625E\u6260\u6263\u6268\u626E\u6271\u6276" - "\u6279\u627C\u627E-\u6280\u6282-\u6284\u6289-\u628A" - "\u6291-\u6298\u629B-\u629C\u629E\u62AB-\u62AC\u62B1" - "\u62B5\u62B9\u62BB-\u62BD\u62C2\u62C5-\u62CA\u62CC-\u62CD" - "\u62CF-\u62D4\u62D7-\u62D9\u62DB-\u62DD\u62E0-\u62E1" - "\u62EC-\u62EF\u62F1\u62F3\u62F5-\u62F7\u62FE-\u62FF" - "\u6301-\u6302\u6307-\u6309\u630C\u6311\u6319\u631F" - "\u6327-\u6328\u632B\u632F\u633A\u633D-\u633F\u6349" - "\u634C-\u634D\u634F-\u6350\u6355\u6357\u635C\u6367-\u6369" - "\u636B\u636E\u6372\u6376-\u6377\u637A-\u637B\u6380" - "\u6383\u6388-\u6389\u638C\u638E-\u638F\u6392\u6396" - "\u6398\u639B\u639F-\u63A3\u63A5\u63A7-\u63AC\u63B2" - "\u63B4-\u63B5\u63BB\u63BE\u63C0\u63C3-\u63C4\u63C6" - "\u63C9\u63CF-\u63D0\u63D2\u63D6\u63DA-\u63DB\u63E1" - "\u63E3\u63E9\u63EE\u63F4\u63F6\u63FA\u6406\u640D" - "\u640F\u6413\u6416-\u6417\u641C\u6426\u6428\u642C-\u642D" - "\u6434\u6436\u643A\u643E\u6442\u644E\u6458\u6467" - "\u6469\u646F\u6476\u6478\u647A\u6483\u6488\u6492-\u6493" - "\u6495\u649A\u649E\u64A4-\u64A5\u64A9\u64AB\u64AD-\u64AE" - "\u64B0\u64B2\u64B9\u64BB-\u64BC\u64C1-\u64C2\u64C5" - "\u64C7\u64CD\u64D2\u64D4\u64D8\u64DA\u64E0-\u64E3" - "\u64E6-\u64E7\u64EC\u64EF\u64F1-\u64F2\u64F4\u64F6" - "\u64FA\u64FD-\u64FE\u6500\u6505\u6518\u651C-\u651D" - "\u6523-\u6524\u652A-\u652C\u652F\u6534-\u6539\u653B" - "\u653E-\u653F\u6545\u6548\u654D\u654F\u6551\u6555-\u6559" - "\u655D-\u655E\u6562-\u6563\u6566\u656C\u6570\u6572" - "\u6574-\u6575\u6577-\u6578\u6582-\u6583\u6587-\u6589" - "\u658C\u658E\u6590-\u6591\u6597\u6599\u659B-\u659C" - "\u659F\u65A1\u65A4-\u65A5\u65A7\u65AB-\u65AD\u65AF-\u65B0" - "\u65B7\u65B9\u65BC-\u65BD\u65C1\u65C3-\u65C6\u65CB-\u65CC" - "\u65CF\u65D2\u65D7\u65D9\u65DB\u65E0-\u65E2\u65E5-\u65E9" - "\u65EC-\u65ED\u65F1\u65FA-\u65FB\u6602-\u6603\u6606-\u6607" - "\u660A\u660C\u660E-\u660F\u6613-\u6614\u661C\u661F-\u6620" - "\u6625\u6627-\u6628\u662D\u662F\u6634-\u6636\u663C" - "\u663F\u6641-\u6644\u6649\u664B\u664F\u6652\u665D-\u665F" - "\u6662\u6664\u6666-\u6669\u666E-\u6670\u6674\u6676" - "\u667A\u6681\u6683-\u6684\u6687-\u6689\u668E\u6691" - "\u6696-\u6698\u669D\u66A2\u66A6\u66AB\u66AE\u66B4" - "\u66B8-\u66B9\u66BC\u66BE\u66C1\u66C4\u66C7\u66C9" - "\u66D6\u66D9-\u66DA\u66DC-\u66DD\u66E0\u66E6\u66E9" - "\u66F0\u66F2-\u66F5\u66F7-\u66F9\u66FC-\u6700\u6703" - "\u6708-\u6709\u670B\u670D\u670F\u6714-\u6717\u671B" - "\u671D-\u671F\u6726-\u6728\u672A-\u672E\u6731\u6734" - "\u6736-\u6738\u673A\u673D\u673F\u6741\u6746\u6749" - "\u674E-\u6751\u6753\u6756\u6759\u675C\u675E-\u6765" - "\u676A\u676D\u676F-\u6773\u6775\u6777\u677C\u677E-\u677F" - "\u6785\u6787\u6789\u678B-\u678C\u6790\u6795\u6797" - "\u679A\u679C-\u679D\u67A0-\u67A2\u67A6\u67A9\u67AF" - "\u67B3-\u67B4\u67B6-\u67B9\u67C1\u67C4\u67C6\u67CA" - "\u67CE-\u67D1\u67D3-\u67D4\u67D8\u67DA\u67DD-\u67DE" - "\u67E2\u67E4\u67E7\u67E9\u67EC\u67EE-\u67EF\u67F1" - "\u67F3-\u67F5\u67FB\u67FE-\u67FF\u6802-\u6804\u6813" - "\u6816-\u6817\u681E\u6821-\u6822\u6829-\u682B\u6832" - "\u6834\u6838-\u6839\u683C-\u683D\u6840-\u6843\u6846" - "\u6848\u684D-\u684E\u6850-\u6851\u6853-\u6854\u6859" - "\u685C-\u685D\u685F\u6863\u6867\u6874\u6876-\u6877" - "\u687E-\u687F\u6881\u6883\u6885\u688D\u688F\u6893-\u6894" - "\u6897\u689B\u689D\u689F-\u68A0\u68A2\u68A6-\u68A8" - "\u68AD\u68AF-\u68B1\u68B3\u68B5-\u68B6\u68B9-\u68BA" - "\u68BC\u68C4\u68C6\u68C9-\u68CB\u68CD\u68D2\u68D4-\u68D5" - "\u68D7-\u68D8\u68DA\u68DF-\u68E1\u68E3\u68E7\u68EE-\u68EF" - "\u68F2\u68F9-\u68FA\u6900-\u6901\u6904-\u6905\u6908" - "\u690B-\u690F\u6912\u6919-\u691C\u6921-\u6923\u6925-\u6926" - "\u6928\u692A\u6930\u6934\u6936\u6939\u693D\u693F" - "\u694A\u6953-\u6955\u6959-\u695A\u695C-\u695E\u6960-\u6962" - "\u696A-\u696B\u696D-\u696F\u6973-\u6975\u6977-\u6979" - "\u697C-\u697E\u6981-\u6982\u698A\u698E\u6991\u6994-\u6995" - "\u699B-\u699C\u69A0\u69A7\u69AE\u69B1-\u69B2\u69B4" - "\u69BB\u69BE-\u69BF\u69C1\u69C3\u69C7\u69CA-\u69CE" - "\u69D0\u69D3\u69D8-\u69D9\u69DD-\u69DE\u69E7-\u69E8" - "\u69EB\u69ED\u69F2\u69F9\u69FB\u69FD\u69FF\u6A02" - "\u6A05\u6A0A-\u6A0C\u6A12-\u6A14\u6A17\u6A19\u6A1B" - "\u6A1E-\u6A1F\u6A21-\u6A23\u6A29-\u6A2B\u6A2E\u6A35-\u6A36" - "\u6A38-\u6A3A\u6A3D\u6A44\u6A47-\u6A48\u6A4B\u6A58-\u6A59" - "\u6A5F\u6A61-\u6A62\u6A66\u6A72\u6A78\u6A7F-\u6A80" - "\u6A84\u6A8D-\u6A8E\u6A90\u6A97\u6A9C\u6AA0\u6AA2-\u6AA3" - "\u6AAA\u6AAC\u6AAE\u6AB3\u6AB8\u6ABB\u6AC1-\u6AC3" - "\u6AD1\u6AD3\u6ADA-\u6ADB\u6ADE-\u6ADF\u6AE8\u6AEA" - "\u6AFA-\u6AFB\u6B04-\u6B05\u6B0A\u6B12\u6B16\u6B1D" - "\u6B1F-\u6B21\u6B23\u6B27\u6B32\u6B37-\u6B3A\u6B3D-\u6B3E" - "\u6B43\u6B47\u6B49\u6B4C\u6B4E\u6B50\u6B53-\u6B54" - "\u6B59\u6B5B\u6B5F\u6B61-\u6B64\u6B66\u6B69-\u6B6A" - "\u6B6F\u6B73-\u6B74\u6B78-\u6B79\u6B7B\u6B7F-\u6B80" - "\u6B83-\u6B84\u6B86\u6B89-\u6B8B\u6B8D\u6B95-\u6B96" - "\u6B98\u6B9E\u6BA4\u6BAA-\u6BAB\u6BAF\u6BB1-\u6BB5" - "\u6BB7\u6BBA-\u6BBC\u6BBF-\u6BC0\u6BC5-\u6BC6\u6BCB" - "\u6BCD-\u6BCE\u6BD2-\u6BD4\u6BD8\u6BDB\u6BDF\u6BEB-\u6BEC" - "\u6BEF\u6BF3\u6C08\u6C0F\u6C11\u6C13-\u6C14\u6C17" - "\u6C1B\u6C23-\u6C24\u6C34\u6C37-\u6C38\u6C3E\u6C40-\u6C42" - "\u6C4E\u6C50\u6C55\u6C57\u6C5A\u6C5D-\u6C60\u6C62" - "\u6C68\u6C6A\u6C70\u6C72-\u6C73\u6C7A\u6C7D-\u6C7E" - "\u6C81-\u6C83\u6C88\u6C8C-\u6C8D\u6C90\u6C92-\u6C93" - "\u6C96\u6C99-\u6C9B\u6CA1-\u6CA2\u6CAB\u6CAE\u6CB1" - "\u6CB3\u6CB8-\u6CBF\u6CC1\u6CC4-\u6CC5\u6CC9-\u6CCA" - "\u6CCC\u6CD3\u6CD5\u6CD7\u6CD9\u6CDB\u6CDD\u6CE1-\u6CE3" - "\u6CE5\u6CE8\u6CEA\u6CEF-\u6CF1\u6CF3\u6D0B-\u6D0C" - "\u6D12\u6D17\u6D19\u6D1B\u6D1E-\u6D1F\u6D25\u6D29-\u6D2B" - "\u6D32-\u6D33\u6D35-\u6D36\u6D38\u6D3B\u6D3D-\u6D3E" - "\u6D41\u6D44-\u6D45\u6D59-\u6D5A\u6D5C\u6D63-\u6D64" - "\u6D66\u6D69-\u6D6A\u6D6C\u6D6E\u6D74\u6D77-\u6D79" - "\u6D85\u6D88\u6D8C\u6D8E\u6D93\u6D95\u6D99\u6D9B-\u6D9C" - "\u6DAF\u6DB2\u6DB5\u6DB8\u6DBC\u6DC0\u6DC5-\u6DC7" - "\u6DCB-\u6DCC\u6DD1-\u6DD2\u6DD5\u6DD8-\u6DD9\u6DDE" - "\u6DE1\u6DE4\u6DE6\u6DE8\u6DEA-\u6DEC\u6DEE\u6DF1" - "\u6DF3\u6DF5\u6DF7\u6DF9-\u6DFB\u6E05\u6E07-\u6E0B" - "\u6E13\u6E15\u6E19-\u6E1B\u6E1D\u6E1F-\u6E21\u6E23-\u6E26" - "\u6E29\u6E2B-\u6E2F\u6E38\u6E3A\u6E3E\u6E43\u6E4A" - "\u6E4D-\u6E4E\u6E56\u6E58\u6E5B\u6E5F\u6E67\u6E6B" - "\u6E6E-\u6E6F\u6E72\u6E76\u6E7E-\u6E80\u6E82\u6E8C" - "\u6E8F-\u6E90\u6E96\u6E98\u6E9C-\u6E9D\u6E9F\u6EA2" - "\u6EA5\u6EAA\u6EAF\u6EB2\u6EB6-\u6EB7\u6EBA\u6EBD" - "\u6EC2\u6EC4-\u6EC5\u6EC9\u6ECB-\u6ECC\u6ED1\u6ED3-\u6ED5" - "\u6EDD-\u6EDE\u6EEC\u6EEF\u6EF2\u6EF4\u6EF7-\u6EF8" - "\u6EFE-\u6EFF\u6F01-\u6F02\u6F06\u6F09\u6F0F\u6F11" - "\u6F13-\u6F15\u6F20\u6F22-\u6F23\u6F2B-\u6F2C\u6F31-\u6F32" - "\u6F38\u6F3E-\u6F3F\u6F41\u6F45\u6F54\u6F58\u6F5B-\u6F5C" - "\u6F5F\u6F64\u6F66\u6F6D-\u6F70\u6F74\u6F78\u6F7A" - "\u6F7C\u6F80-\u6F82\u6F84\u6F86\u6F8E\u6F91\u6F97" - "\u6FA1\u6FA3-\u6FA4\u6FAA\u6FB1\u6FB3\u6FB9\u6FC0-\u6FC3" - "\u6FC6\u6FD4-\u6FD5\u6FD8\u6FDB\u6FDF-\u6FE1\u6FE4" - "\u6FEB-\u6FEC\u6FEE-\u6FEF\u6FF1\u6FF3\u6FF6\u6FFA" - "\u6FFE\u7001\u7009\u700B\u700F\u7011\u7015\u7018" - "\u701A-\u701B\u701D-\u701F\u7026-\u7027\u702C\u7030" - "\u7032\u703E\u704C\u7051\u7058\u7063\u706B\u706F-\u7070" - "\u7078\u707C-\u707D\u7089-\u708A\u708E\u7092\u7099" - "\u70AC-\u70AF\u70B3\u70B8-\u70BA\u70C8\u70CB\u70CF" - "\u70D9\u70DD\u70DF\u70F1\u70F9\u70FD\u7109\u7114" - "\u7119-\u711A\u711C\u7121\u7126\u7136\u713C\u7149" - "\u714C\u714E\u7155-\u7156\u7159\u7162\u7164-\u7167" - "\u7169\u716C\u716E\u717D\u7184\u7188\u718A\u718F" - "\u7194-\u7195\u7199\u719F\u71A8\u71AC\u71B1\u71B9" - "\u71BE\u71C3\u71C8-\u71C9\u71CE\u71D0\u71D2\u71D4-\u71D5" - "\u71D7\u71DF-\u71E0\u71E5-\u71E7\u71EC-\u71EE\u71F5" - "\u71F9\u71FB-\u71FC\u71FF\u7206\u720D\u7210\u721B" - "\u7228\u722A\u722C-\u722D\u7230\u7232\u7235-\u7236" - "\u723A-\u7240\u7246-\u7248\u724B-\u724C\u7252\u7258-\u7259" - "\u725B\u725D\u725F\u7261-\u7262\u7267\u7269\u7272" - "\u7274\u7279\u727D-\u727E\u7280-\u7282\u7287\u7292" - "\u7296\u72A0\u72A2\u72A7\u72AC\u72AF\u72B2\u72B6" - "\u72B9\u72C2-\u72C4\u72C6\u72CE\u72D0\u72D2\u72D7" - "\u72D9\u72DB\u72E0-\u72E2\u72E9\u72EC-\u72ED\u72F7-\u72F9" - "\u72FC-\u72FD\u730A\u7316-\u7317\u731B-\u731D\u731F" - "\u7325\u7329-\u732B\u732E-\u732F\u7334\u7336-\u7337" - "\u733E-\u733F\u7344-\u7345\u734E-\u734F\u7357\u7363" - "\u7368\u736A\u7370\u7372\u7375\u7378\u737A-\u737B" - "\u7384\u7387\u7389\u738B\u7396\u73A9\u73B2-\u73B3" - "\u73BB\u73C0\u73C2\u73C8\u73CA\u73CD-\u73CE\u73DE" - "\u73E0\u73E5\u73EA\u73ED-\u73EE\u73F1\u73F8\u73FE" - "\u7403\u7405-\u7406\u7409\u7422\u7425\u7432-\u7436" - "\u743A\u743F\u7441\u7455\u7459-\u745C\u745E-\u7460" - "\u7463-\u7464\u7469-\u746A\u746F-\u7470\u7473\u7476" - "\u747E\u7483\u748B\u749E\u74A2\u74A7\u74B0\u74BD" - "\u74CA\u74CF\u74D4\u74DC\u74E0\u74E2-\u74E3\u74E6-\u74E7" - "\u74E9\u74EE\u74F0-\u74F2\u74F6-\u74F8\u7503-\u7505" - "\u750C-\u750E\u7511\u7513\u7515\u7518\u751A\u751C" - "\u751E-\u751F\u7523\u7525-\u7526\u7528\u752B-\u752C" - "\u7530-\u7533\u7537-\u7538\u753A-\u753C\u7544\u7546" - "\u7549-\u754D\u754F\u7551\u7554\u7559-\u755D\u7560" - "\u7562\u7564-\u7567\u7569-\u756B\u756D\u7570\u7573-\u7574" - "\u7576-\u7578\u757F\u7582\u7586-\u7587\u7589-\u758B" - "\u758E-\u758F\u7591\u7594\u759A\u759D\u75A3\u75A5" - "\u75AB\u75B1-\u75B3\u75B5\u75B8-\u75B9\u75BC-\u75BE" - "\u75C2-\u75C3\u75C5\u75C7\u75CA\u75CD\u75D2\u75D4-\u75D5" - "\u75D8-\u75D9\u75DB\u75DE\u75E2-\u75E3\u75E9\u75F0" - "\u75F2-\u75F4\u75FA\u75FC\u75FE-\u75FF\u7601\u7609" - "\u760B\u760D\u761F-\u7622\u7624\u7627\u7630\u7634" - "\u763B\u7642\u7646-\u7648\u764C\u7652\u7656\u7658" - "\u765C\u7661-\u7662\u7667-\u766A\u766C\u7670\u7672" - "\u7676\u7678\u767A-\u767E\u7680\u7683-\u7684\u7686-\u7688" - "\u768B\u768E\u7690\u7693\u7696\u7699-\u769A\u76AE" - "\u76B0\u76B4\u76B7-\u76BA\u76BF\u76C2-\u76C3\u76C6" - "\u76C8\u76CA\u76CD\u76D2\u76D6-\u76D7\u76DB-\u76DC" - "\u76DE-\u76DF\u76E1\u76E3-\u76E5\u76E7\u76EA\u76EE" - "\u76F2\u76F4\u76F8\u76FB\u76FE\u7701\u7704\u7707-\u7709" - "\u770B-\u770C\u771B\u771E-\u7720\u7724-\u7726\u7729" - "\u7737-\u7738\u773A\u773C\u7740\u7747\u775A-\u775B" - "\u7761\u7763\u7765-\u7766\u7768\u776B\u7779\u777E-\u777F" - "\u778B\u778E\u7791\u779E\u77A0\u77A5\u77AC-\u77AD" - "\u77B0\u77B3\u77B6\u77B9\u77BB-\u77BD\u77BF\u77C7" - "\u77CD\u77D7\u77DA-\u77DC\u77E2-\u77E3\u77E5\u77E7" - "\u77E9\u77ED-\u77EF\u77F3\u77FC\u7802\u780C\u7812" - "\u7814-\u7815\u7820\u7825-\u7827\u7832\u7834\u783A" - "\u783F\u7845\u785D\u786B-\u786C\u786F\u7872\u7874" - "\u787C\u7881\u7886-\u7887\u788C-\u788E\u7891\u7893" - "\u7895\u7897\u789A\u78A3\u78A7\u78A9-\u78AA\u78AF" - "\u78B5\u78BA\u78BC\u78BE\u78C1\u78C5-\u78C6\u78CA-\u78CB" - "\u78D0-\u78D1\u78D4\u78DA\u78E7-\u78E8\u78EC\u78EF" - "\u78F4\u78FD\u7901\u7907\u790E\u7911-\u7912\u7919" - "\u7926\u792A-\u792C\u793A\u793C\u793E\u7940-\u7941" - "\u7947-\u7949\u7950\u7953\u7955-\u7957\u795A\u795D-\u7960" - "\u7962\u7965\u7968\u796D\u7977\u797A\u797F-\u7981" - "\u7984-\u7985\u798A\u798D-\u798F\u799D\u79A6-\u79A7" - "\u79AA\u79AE\u79B0\u79B3\u79B9-\u79BA\u79BD-\u79C1" - "\u79C9\u79CB\u79D1-\u79D2\u79D5\u79D8\u79DF\u79E1" - "\u79E3-\u79E4\u79E6-\u79E7\u79E9\u79EC\u79F0\u79FB" - "\u7A00\u7A08\u7A0B\u7A0D-\u7A0E\u7A14\u7A17-\u7A1A" - "\u7A1C\u7A1F-\u7A20\u7A2E\u7A31-\u7A32\u7A37\u7A3B-\u7A40" - "\u7A42-\u7A43\u7A46\u7A49\u7A4D-\u7A50\u7A57\u7A61-\u7A63" - "\u7A69\u7A6B\u7A70\u7A74\u7A76\u7A79-\u7A7A\u7A7D" - "\u7A7F\u7A81\u7A83-\u7A84\u7A88\u7A92-\u7A93\u7A95-\u7A98" - "\u7A9F\u7AA9-\u7AAA\u7AAE-\u7AB0\u7AB6\u7ABA\u7ABF" - "\u7AC3-\u7AC5\u7AC7-\u7AC8\u7ACA-\u7ACB\u7ACD\u7ACF" - "\u7AD2-\u7AD3\u7AD5\u7AD9-\u7ADA\u7ADC-\u7ADD\u7ADF-\u7AE3" - "\u7AE5-\u7AE6\u7AEA\u7AED\u7AEF-\u7AF0\u7AF6\u7AF8-\u7AFA" - "\u7AFF\u7B02\u7B04\u7B06\u7B08\u7B0A-\u7B0B\u7B0F" - "\u7B11\u7B18-\u7B19\u7B1B\u7B1E\u7B20\u7B25-\u7B26" - "\u7B28\u7B2C\u7B33\u7B35-\u7B36\u7B39\u7B45-\u7B46" - "\u7B48-\u7B49\u7B4B-\u7B4D\u7B4F-\u7B52\u7B54\u7B56" - "\u7B5D\u7B65\u7B67\u7B6C\u7B6E\u7B70-\u7B71\u7B74-\u7B75" - "\u7B7A\u7B86-\u7B87\u7B8B\u7B8D\u7B8F\u7B92\u7B94-\u7B95" - "\u7B97-\u7B9A\u7B9C-\u7B9D\u7B9F\u7BA1\u7BAA\u7BAD" - "\u7BB1\u7BB4\u7BB8\u7BC0-\u7BC1\u7BC4\u7BC6-\u7BC7" - "\u7BC9\u7BCB-\u7BCC\u7BCF\u7BDD\u7BE0\u7BE4-\u7BE6" - "\u7BE9\u7BED\u7BF3\u7BF6-\u7BF7\u7C00\u7C07\u7C0D" - "\u7C11-\u7C14\u7C17\u7C1F\u7C21\u7C23\u7C27\u7C2A-\u7C2B" - "\u7C37-\u7C38\u7C3D-\u7C40\u7C43\u7C4C-\u7C4D\u7C4F-\u7C50" - "\u7C54\u7C56\u7C58\u7C5F-\u7C60\u7C64-\u7C65\u7C6C" - "\u7C73\u7C75\u7C7E\u7C81-\u7C83\u7C89\u7C8B\u7C8D" - "\u7C90\u7C92\u7C95\u7C97-\u7C98\u7C9B\u7C9F\u7CA1-\u7CA2" - "\u7CA4-\u7CA5\u7CA7-\u7CA8\u7CAB\u7CAD-\u7CAE\u7CB1-\u7CB3" - "\u7CB9\u7CBD-\u7CBE\u7CC0\u7CC2\u7CC5\u7CCA\u7CCE" - "\u7CD2\u7CD6\u7CD8\u7CDC\u7CDE-\u7CE0\u7CE2\u7CE7" - "\u7CEF\u7CF2\u7CF4\u7CF6\u7CF8\u7CFA-\u7CFB\u7CFE" - "\u7D00\u7D02\u7D04-\u7D06\u7D0A-\u7D0B\u7D0D\u7D10" - "\u7D14-\u7D15\u7D17-\u7D1C\u7D20-\u7D22\u7D2B-\u7D2C" - "\u7D2E-\u7D30\u7D32-\u7D33\u7D35\u7D39-\u7D3A\u7D3F" - "\u7D42-\u7D46\u7D4B-\u7D4C\u7D4E-\u7D50\u7D56\u7D5B" - "\u7D5E\u7D61-\u7D63\u7D66\u7D68\u7D6E\u7D71-\u7D73" - "\u7D75-\u7D76\u7D79\u7D7D\u7D89\u7D8F\u7D93\u7D99-\u7D9C" - "\u7D9F\u7DA2-\u7DA3\u7DAB-\u7DB2\u7DB4-\u7DB5\u7DB8" - "\u7DBA-\u7DBB\u7DBD-\u7DBF\u7DC7\u7DCA-\u7DCB\u7DCF" - "\u7DD1-\u7DD2\u7DD5\u7DD8\u7DDA\u7DDC-\u7DDE\u7DE0-\u7DE1" - "\u7DE4\u7DE8-\u7DE9\u7DEC\u7DEF\u7DF2\u7DF4\u7DFB" - "\u7E01\u7E04-\u7E05\u7E09-\u7E0B\u7E12\u7E1B\u7E1E-\u7E1F" - "\u7E21-\u7E23\u7E26\u7E2B\u7E2E\u7E31-\u7E32\u7E35" - "\u7E37\u7E39-\u7E3B\u7E3D-\u7E3E\u7E41\u7E43\u7E46" - "\u7E4A-\u7E4B\u7E4D\u7E54-\u7E56\u7E59-\u7E5A\u7E5D-\u7E5E" - "\u7E66-\u7E67\u7E69-\u7E6A\u7E6D\u7E70\u7E79\u7E7B-\u7E7D" - "\u7E7F\u7E82-\u7E83\u7E88-\u7E89\u7E8C\u7E8E-\u7E90" - "\u7E92-\u7E94\u7E96\u7E9B-\u7E9C\u7F36\u7F38\u7F3A" - "\u7F45\u7F4C-\u7F4E\u7F50-\u7F51\u7F54-\u7F55\u7F58" - "\u7F5F-\u7F60\u7F67-\u7F6B\u7F6E\u7F70\u7F72\u7F75" - "\u7F77-\u7F79\u7F82-\u7F83\u7F85-\u7F88\u7F8A\u7F8C" - "\u7F8E\u7F94\u7F9A\u7F9D-\u7F9E\u7FA3-\u7FA4\u7FA8-\u7FA9" - "\u7FAE-\u7FAF\u7FB2\u7FB6\u7FB8-\u7FB9\u7FBD\u7FC1" - "\u7FC5-\u7FC6\u7FCA\u7FCC\u7FD2\u7FD4-\u7FD5\u7FE0-\u7FE1" - "\u7FE6\u7FE9\u7FEB\u7FF0\u7FF3\u7FF9\u7FFB-\u7FFC" - "\u8000-\u8001\u8003-\u8006\u800B-\u800C\u8010\u8012" - "\u8015\u8017-\u8019\u801C\u8021\u8028\u8033\u8036" - "\u803B\u803D\u803F\u8046\u804A\u8052\u8056\u8058" - "\u805A\u805E-\u805F\u8061-\u8062\u8068\u806F-\u8070" - "\u8072-\u8074\u8076-\u8077\u8079\u807D-\u807F\u8084-\u8087" - "\u8089\u808B-\u808C\u8093\u8096\u8098\u809A-\u809B" - "\u809D\u80A1-\u80A2\u80A5\u80A9-\u80AA\u80AC-\u80AD" - "\u80AF\u80B1-\u80B2\u80B4\u80BA\u80C3-\u80C4\u80C6" - "\u80CC\u80CE\u80D6\u80D9-\u80DB\u80DD-\u80DE\u80E1" - "\u80E4-\u80E5\u80EF\u80F1\u80F4\u80F8\u80FC-\u80FD" - "\u8102\u8105-\u810A\u811A-\u811B\u8123\u8129\u812F" - "\u8131\u8133\u8139\u813E\u8146\u814B\u814E\u8150-\u8151" - "\u8153-\u8155\u815F\u8165-\u8166\u816B\u816E\u8170-\u8171" - "\u8174\u8178-\u817A\u817F-\u8180\u8182-\u8183\u8188" - "\u818A\u818F\u8193\u8195\u819A\u819C-\u819D\u81A0" - "\u81A3-\u81A4\u81A8-\u81A9\u81B0\u81B3\u81B5\u81B8" - "\u81BA\u81BD-\u81C0\u81C2\u81C6\u81C8-\u81C9\u81CD" - "\u81D1\u81D3\u81D8-\u81DA\u81DF-\u81E0\u81E3\u81E5" - "\u81E7-\u81E8\u81EA\u81ED\u81F3-\u81F4\u81FA-\u81FC" - "\u81FE\u8201-\u8202\u8205\u8207-\u820A\u820C-\u820E" - "\u8210\u8212\u8216-\u8218\u821B-\u821C\u821E-\u821F" - "\u8229-\u822C\u822E\u8233\u8235-\u8239\u8240\u8247" - "\u8258-\u825A\u825D\u825F\u8262\u8264\u8266\u8268" - "\u826A-\u826B\u826E-\u826F\u8271-\u8272\u8276-\u8278" - "\u827E\u828B\u828D\u8292\u8299\u829D\u829F\u82A5-\u82A6" - "\u82AB-\u82AD\u82AF\u82B1\u82B3\u82B8-\u82B9\u82BB" - "\u82BD\u82C5\u82D1-\u82D4\u82D7\u82D9\u82DB-\u82DC" - "\u82DE-\u82DF\u82E1\u82E3\u82E5-\u82E7\u82EB\u82F1" - "\u82F3-\u82F4\u82F9-\u82FB\u8302-\u8306\u8309\u830E" - "\u8316-\u8318\u831C\u8323\u8328\u832B\u832F\u8331-\u8332" - "\u8334-\u8336\u8338-\u8339\u8340\u8345\u8349-\u834A" - "\u834F-\u8350\u8352\u8358\u8373\u8375\u8377\u837B-\u837C" - "\u8385\u8387\u8389-\u838A\u838E\u8393\u8396\u839A" - "\u839E-\u83A0\u83A2\u83A8\u83AA-\u83AB\u83B1\u83B5" - "\u83BD\u83C1\u83C5\u83CA\u83CC\u83CE\u83D3\u83D6" - "\u83D8\u83DC\u83DF-\u83E0\u83E9\u83EB\u83EF-\u83F2" - "\u83F4\u83F7\u83FB\u83FD\u8403-\u8404\u8407\u840B-\u840E" - "\u8413\u8420\u8422\u8429-\u842A\u842C\u8431\u8435" - "\u8438\u843C-\u843D\u8446\u8449\u844E\u8457\u845B" - "\u8461-\u8463\u8466\u8469\u846B-\u846F\u8471\u8475" - "\u8477\u8479-\u847A\u8482\u8484\u848B\u8490\u8494" - "\u8499\u849C\u849F\u84A1\u84AD\u84B2\u84B8-\u84B9" - "\u84BB-\u84BC\u84BF\u84C1\u84C4\u84C6\u84C9-\u84CB" - "\u84CD\u84D0-\u84D1\u84D6\u84D9-\u84DA\u84EC\u84EE" - "\u84F4\u84FC\u84FF-\u8500\u8506\u8511\u8513-\u8515" - "\u8517-\u8518\u851A\u851F\u8521\u8526\u852C-\u852D" - "\u8535\u853D\u8540-\u8541\u8543\u8548-\u854B\u854E" - "\u8555\u8557-\u8558\u855A\u8563\u8568-\u856A\u856D" - "\u8577\u857E\u8580\u8584\u8587-\u8588\u858A\u8590-\u8591" - "\u8594\u8597\u8599\u859B-\u859C\u85A4\u85A6\u85A8-\u85AC" - "\u85AE-\u85AF\u85B9-\u85BA\u85C1\u85C9\u85CD\u85CF-\u85D0" - "\u85D5\u85DC-\u85DD\u85E4-\u85E5\u85E9-\u85EA\u85F7" - "\u85F9-\u85FB\u85FE\u8602\u8606-\u8607\u860A-\u860B" - "\u8613\u8616-\u8617\u861A\u8622\u862D\u862F-\u8630" - "\u863F\u864D-\u864E\u8650\u8654-\u8655\u865A\u865C" - "\u865E-\u865F\u8667\u866B\u8671\u8679\u867B\u868A-\u868C" - "\u8693\u8695\u86A3-\u86A4\u86A9-\u86AB\u86AF-\u86B0" - "\u86B6\u86C4\u86C6-\u86C7\u86C9\u86CB\u86CD-\u86CE" - "\u86D4\u86D9\u86DB\u86DE-\u86DF\u86E4\u86E9\u86EC-\u86EF" - "\u86F8-\u86F9\u86FB\u86FE\u8700\u8702-\u8703\u8706" - "\u8708-\u870A\u870D\u8711-\u8712\u8718\u871A\u871C" - "\u8725\u8729\u8734\u8737\u873B\u873F\u8749\u874B-\u874C" - "\u874E\u8753\u8755\u8757\u8759\u875F-\u8760\u8763" - "\u8766\u8768\u876A\u876E\u8774\u8776\u8778\u877F" - "\u8782\u878D\u879F\u87A2\u87AB\u87AF\u87B3\u87BA-\u87BB" - "\u87BD\u87C0\u87C4\u87C6-\u87C7\u87CB\u87D0\u87D2" - "\u87E0\u87EF\u87F2\u87F6-\u87F7\u87F9\u87FB\u87FE" - "\u8805\u880D-\u880F\u8811\u8815-\u8816\u8821-\u8823" - "\u8827\u8831\u8836\u8839\u883B\u8840\u8842\u8844" - "\u8846\u884C-\u884D\u8852-\u8853\u8857\u8859\u885B" - "\u885D-\u885E\u8861-\u8863\u8868\u886B\u8870\u8872" - "\u8875\u8877\u887D-\u887F\u8881-\u8882\u8888\u888B" - "\u888D\u8892\u8896-\u8897\u8899\u889E\u88A2\u88A4" - "\u88AB\u88AE\u88B0-\u88B1\u88B4-\u88B5\u88B7\u88BF" - "\u88C1-\u88C5\u88CF\u88D4-\u88D5\u88D8-\u88D9\u88DC-\u88DD" - "\u88DF\u88E1\u88E8\u88F2-\u88F4\u88F8-\u88F9\u88FC-\u88FE" - "\u8902\u8904\u8907\u890A\u890C\u8910\u8912-\u8913" - "\u891D-\u891E\u8925\u892A-\u892B\u8936\u8938\u893B" - "\u8941\u8943-\u8944\u894C-\u894D\u8956\u895E-\u8960" - "\u8964\u8966\u896A\u896D\u896F\u8972\u8974\u8977" - "\u897E-\u897F\u8981\u8983\u8986-\u8988\u898A-\u898B" - "\u898F\u8993\u8996-\u8998\u899A\u89A1\u89A6-\u89A7" - "\u89A9-\u89AA\u89AC\u89AF\u89B2-\u89B3\u89BA\u89BD" - "\u89BF-\u89C0\u89D2\u89DA\u89DC-\u89DD\u89E3\u89E6-\u89E7" - "\u89F4\u89F8\u8A00\u8A02-\u8A03\u8A08\u8A0A\u8A0C" - "\u8A0E\u8A10\u8A13\u8A16-\u8A18\u8A1B\u8A1D\u8A1F" - "\u8A23\u8A25\u8A2A\u8A2D\u8A31\u8A33-\u8A34\u8A36" - "\u8A3A-\u8A3C\u8A41\u8A46\u8A48\u8A50-\u8A52\u8A54-\u8A55" - "\u8A5B\u8A5E\u8A60\u8A62-\u8A63\u8A66\u8A69\u8A6B-\u8A6E" - "\u8A70-\u8A73\u8A7C\u8A82\u8A84-\u8A85\u8A87\u8A89" - "\u8A8C-\u8A8D\u8A91\u8A93\u8A95\u8A98\u8A9A\u8A9E" - "\u8AA0-\u8AA1\u8AA3-\u8AA6\u8AA8\u8AAC-\u8AAD\u8AB0" - "\u8AB2\u8AB9\u8ABC\u8ABF\u8AC2\u8AC4\u8AC7\u8ACB-\u8ACD" - "\u8ACF\u8AD2\u8AD6\u8ADA-\u8ADC\u8ADE\u8AE0-\u8AE2" - "\u8AE4\u8AE6-\u8AE7\u8AEB\u8AED-\u8AEE\u8AF1\u8AF3" - "\u8AF7-\u8AF8\u8AFA\u8AFE\u8B00-\u8B02\u8B04\u8B07" - "\u8B0C\u8B0E\u8B10\u8B14\u8B16-\u8B17\u8B19-\u8B1B" - "\u8B1D\u8B20-\u8B21\u8B26\u8B28\u8B2B-\u8B2C\u8B33" - "\u8B39\u8B3E\u8B41\u8B49\u8B4C\u8B4E-\u8B4F\u8B56" - "\u8B58\u8B5A-\u8B5C\u8B5F\u8B66\u8B6B-\u8B6C\u8B6F-\u8B72" - "\u8B74\u8B77\u8B7D\u8B80\u8B83\u8B8A\u8B8C\u8B8E" - "\u8B90\u8B92-\u8B93\u8B96\u8B99-\u8B9A\u8C37\u8C3A" - "\u8C3F\u8C41\u8C46\u8C48\u8C4A\u8C4C\u8C4E\u8C50" - "\u8C55\u8C5A\u8C61-\u8C62\u8C6A-\u8C6C\u8C78-\u8C7A" - "\u8C7C\u8C82\u8C85\u8C89-\u8C8A\u8C8C-\u8C8E\u8C94" - "\u8C98\u8C9D-\u8C9E\u8CA0-\u8CA2\u8CA7-\u8CB0\u8CB2-\u8CB4" - "\u8CB6-\u8CB8\u8CBB-\u8CBD\u8CBF-\u8CC4\u8CC7-\u8CC8" - "\u8CCA\u8CCD-\u8CCE\u8CD1\u8CD3\u8CDA-\u8CDC\u8CDE" - "\u8CE0\u8CE2-\u8CE4\u8CE6\u8CEA\u8CED\u8CFA-\u8CFD" - "\u8D04-\u8D05\u8D07-\u8D08\u8D0A-\u8D0B\u8D0D\u8D0F-\u8D10" - "\u8D13-\u8D14\u8D16\u8D64\u8D66-\u8D67\u8D6B\u8D6D" - "\u8D70-\u8D71\u8D73-\u8D74\u8D77\u8D81\u8D85\u8D8A" - "\u8D99\u8DA3\u8DA8\u8DB3\u8DBA\u8DBE\u8DC2\u8DCB-\u8DCC" - "\u8DCF\u8DD6\u8DDA-\u8DDB\u8DDD\u8DDF\u8DE1\u8DE3" - "\u8DE8\u8DEA-\u8DEB\u8DEF\u8DF3\u8DF5\u8DFC\u8DFF" - "\u8E08-\u8E0A\u8E0F-\u8E10\u8E1D-\u8E1F\u8E2A\u8E30" - "\u8E34-\u8E35\u8E42\u8E44\u8E47-\u8E4A\u8E4C\u8E50" - "\u8E55\u8E59\u8E5F-\u8E60\u8E63-\u8E64\u8E72\u8E74" - "\u8E76\u8E7C\u8E81\u8E84-\u8E85\u8E87\u8E8A-\u8E8B" - "\u8E8D\u8E91\u8E93-\u8E94\u8E99\u8EA1\u8EAA-\u8EAC" - "\u8EAF-\u8EB1\u8EBE\u8EC5-\u8EC6\u8EC8\u8ECA-\u8ECD" - "\u8ED2\u8EDB\u8EDF\u8EE2-\u8EE3\u8EEB\u8EF8\u8EFB-\u8EFE" - "\u8F03\u8F05\u8F09-\u8F0A\u8F0C\u8F12-\u8F15\u8F19" - "\u8F1B-\u8F1D\u8F1F\u8F26\u8F29-\u8F2A\u8F2F\u8F33" - "\u8F38-\u8F39\u8F3B\u8F3E-\u8F3F\u8F42\u8F44-\u8F46" - "\u8F49\u8F4C-\u8F4E\u8F57\u8F5C\u8F5F\u8F61-\u8F64" - "\u8F9B-\u8F9C\u8F9E-\u8F9F\u8FA3\u8FA7-\u8FA8\u8FAD-\u8FB2" - "\u8FB7\u8FBA-\u8FBC\u8FBF\u8FC2\u8FC4-\u8FC5\u8FCE" - "\u8FD1\u8FD4\u8FDA\u8FE2\u8FE5-\u8FE6\u8FE9-\u8FEB" - "\u8FED\u8FEF-\u8FF0\u8FF4\u8FF7-\u8FFA\u8FFD\u9000-\u9001" - "\u9003\u9005-\u9006\u900B\u900D-\u9011\u9013-\u9017" - "\u9019-\u901A\u901D-\u9023\u9027\u902E\u9031-\u9032" - "\u9035-\u9036\u9038-\u9039\u903C\u903E\u9041-\u9042" - "\u9045\u9047\u9049-\u904B\u904D-\u9056\u9058-\u9059" - "\u905C\u905E\u9060-\u9061\u9063\u9065\u9068-\u9069" - "\u906D-\u906F\u9072\u9075-\u9078\u907A\u907C-\u907D" - "\u907F-\u9084\u9087\u9089-\u908A\u908F\u9091\u90A3" - "\u90A6\u90A8\u90AA\u90AF\u90B1\u90B5\u90B8\u90C1" - "\u90CA\u90CE\u90DB\u90E1-\u90E2\u90E4\u90E8\u90ED" - "\u90F5\u90F7\u90FD\u9102\u9112\u9119\u912D\u9130" - "\u9132\u9149-\u914E\u9152\u9154\u9156\u9158\u9162-\u9163" - "\u9165\u9169-\u916A\u916C\u9172-\u9173\u9175\u9177-\u9178" - "\u9182\u9187\u9189\u918B\u918D\u9190\u9192\u9197" - "\u919C\u91A2\u91A4\u91AA-\u91AB\u91AF\u91B4-\u91B5" - "\u91B8\u91BA\u91C0-\u91C1\u91C6-\u91C9\u91CB-\u91D1" - "\u91D6\u91D8\u91DB-\u91DD\u91DF\u91E1\u91E3\u91E6-\u91E7" - "\u91F5-\u91F6\u91FC\u91FF\u920D-\u920E\u9211\u9214-\u9215" - "\u921E\u9229\u922C\u9234\u9237\u923F\u9244-\u9245" - "\u9248-\u9249\u924B\u9250\u9257\u925A-\u925B\u925E" - "\u9262\u9264\u9266\u9271\u927E\u9280\u9283\u9285" - "\u9291\u9293\u9295-\u9296\u9298\u929A-\u929C\u92AD" - "\u92B7\u92B9\u92CF\u92D2\u92E4\u92E9-\u92EA\u92ED" - "\u92F2-\u92F3\u92F8\u92FA\u92FC\u9306\u930F-\u9310" - "\u9318-\u931A\u9320\u9322-\u9323\u9326\u9328\u932B-\u932C" - "\u932E-\u932F\u9332\u9335\u933A-\u933B\u9344\u934B" - "\u934D\u9354\u9356\u935B-\u935C\u9360\u936C\u936E" - "\u9375\u937C\u937E\u938C\u9394\u9396-\u9397\u939A" - "\u93A7\u93AC-\u93AE\u93B0\u93B9\u93C3\u93C8\u93D0-\u93D1" - "\u93D6-\u93D8\u93DD\u93E1\u93E4-\u93E5\u93E8\u9403" - "\u9407\u9410\u9413-\u9414\u9418-\u941A\u9421\u942B" - "\u9435-\u9436\u9438\u943A\u9441\u9444\u9451-\u9453" - "\u945A-\u945B\u945E\u9460\u9462\u946A\u9470\u9475" - "\u9477\u947C-\u947F\u9481\u9577\u9580\u9582-\u9583" - "\u9587\u9589-\u958B\u958F\u9591\u9593-\u9594\u9596" - "\u9598-\u9599\u95A0\u95A2-\u95A5\u95A7-\u95A8\u95AD" - "\u95B2\u95B9\u95BB-\u95BC\u95BE\u95C3\u95C7\u95CA" - "\u95CC-\u95CD\u95D4-\u95D6\u95D8\u95DC\u95E1-\u95E2" - "\u95E5\u961C\u9621\u9628\u962A\u962E-\u962F\u9632" - "\u963B\u963F-\u9640\u9642\u9644\u964B-\u964D\u964F-\u9650" - "\u965B-\u965F\u9662-\u9666\u966A\u966C\u9670\u9672-\u9673" - "\u9675-\u9678\u967A\u967D\u9685-\u9686\u9688\u968A-\u968B" - "\u968D-\u968F\u9694-\u9695\u9697-\u9699\u969B-\u969C" - "\u96A0\u96A3\u96A7-\u96A8\u96AA\u96B0-\u96B2\u96B4" - "\u96B6-\u96B9\u96BB-\u96BC\u96C0-\u96C1\u96C4-\u96C7" - "\u96C9\u96CB-\u96CE\u96D1\u96D5-\u96D6\u96D9\u96DB-\u96DC" - "\u96E2-\u96E3\u96E8\u96EA-\u96EB\u96F0\u96F2\u96F6-\u96F7" - "\u96F9\u96FB\u9700\u9704\u9706-\u9708\u970A\u970D-\u970F" - "\u9711\u9713\u9716\u9719\u971C\u971E\u9724\u9727" - "\u972A\u9730\u9732\u9738-\u9739\u973D-\u973E\u9742" - "\u9744\u9746\u9748-\u9749\u9752\u9756\u9759\u975C" - "\u975E\u9760-\u9762\u9764\u9766\u9768-\u9769\u976B" - "\u976D\u9771\u9774\u9779-\u977A\u977C\u9781\u9784-\u9786" - "\u978B\u978D\u978F-\u9790\u9798\u979C\u97A0\u97A3" - "\u97A6\u97A8\u97AB\u97AD\u97B3-\u97B4\u97C3\u97C6" - "\u97C8\u97CB\u97D3\u97DC\u97ED-\u97EE\u97F2-\u97F3" - "\u97F5-\u97F6\u97FB\u97FF\u9801-\u9803\u9805-\u9806" - "\u9808\u980C\u980F-\u9813\u9817-\u9818\u981A\u9821" - "\u9824\u982C-\u982D\u9834\u9837-\u9838\u983B-\u983D" - "\u9846\u984B-\u984F\u9854-\u9855\u9858\u985B\u985E" - "\u9867\u986B\u986F-\u9871\u9873-\u9874\u98A8\u98AA" - "\u98AF\u98B1\u98B6\u98C3-\u98C4\u98C6\u98DB-\u98DC" - "\u98DF\u98E2\u98E9\u98EB\u98ED-\u98EF\u98F2\u98F4" - "\u98FC-\u98FE\u9903\u9905\u9909-\u990A\u990C\u9910" - "\u9912-\u9914\u9918\u991D-\u991E\u9920-\u9921\u9924" - "\u9928\u992C\u992E\u993D-\u993E\u9942\u9945\u9949" - "\u994B-\u994C\u9950-\u9952\u9955\u9957\u9996-\u9999" - "\u99A5\u99A8\u99AC-\u99AE\u99B3-\u99B4\u99BC\u99C1" - "\u99C4-\u99C6\u99C8\u99D0-\u99D2\u99D5\u99D8\u99DB" - "\u99DD\u99DF\u99E2\u99ED-\u99EE\u99F1-\u99F2\u99F8" - "\u99FB\u99FF\u9A01\u9A05\u9A0E-\u9A0F\u9A12-\u9A13" - "\u9A19\u9A28\u9A2B\u9A30\u9A37\u9A3E\u9A40\u9A42-\u9A43" - "\u9A45\u9A4D\u9A55\u9A57\u9A5A-\u9A5B\u9A5F\u9A62" - "\u9A64-\u9A65\u9A69-\u9A6B\u9AA8\u9AAD\u9AB0\u9AB8" - "\u9ABC\u9AC0\u9AC4\u9ACF\u9AD1\u9AD3-\u9AD4\u9AD8" - "\u9ADE-\u9ADF\u9AE2-\u9AE3\u9AE6\u9AEA-\u9AEB\u9AED-\u9AEF" - "\u9AF1\u9AF4\u9AF7\u9AFB\u9B06\u9B18\u9B1A\u9B1F" - "\u9B22-\u9B23\u9B25\u9B27-\u9B2A\u9B2E-\u9B2F\u9B31-\u9B32" - "\u9B3B-\u9B3C\u9B41-\u9B45\u9B4D-\u9B4F\u9B51\u9B54" - "\u9B58\u9B5A\u9B6F\u9B74\u9B83\u9B8E\u9B91-\u9B93" - "\u9B96-\u9B97\u9B9F-\u9BA0\u9BA8\u9BAA-\u9BAB\u9BAD-\u9BAE" - "\u9BB4\u9BB9\u9BC0\u9BC6\u9BC9-\u9BCA\u9BCF\u9BD1-\u9BD2" - "\u9BD4\u9BD6\u9BDB\u9BE1-\u9BE4\u9BE8\u9BF0-\u9BF2" - "\u9BF5\u9C04\u9C06\u9C08-\u9C0A\u9C0C-\u9C0D\u9C10" - "\u9C12-\u9C15\u9C1B\u9C21\u9C24-\u9C25\u9C2D-\u9C30" - "\u9C32\u9C39-\u9C3B\u9C3E\u9C46-\u9C48\u9C52\u9C57" - "\u9C5A\u9C60\u9C67\u9C76\u9C78\u9CE5\u9CE7\u9CE9" - "\u9CEB-\u9CEC\u9CF0\u9CF3-\u9CF4\u9CF6\u9D03\u9D06-\u9D09" - "\u9D0E\u9D12\u9D15\u9D1B\u9D1F\u9D23\u9D26\u9D28" - "\u9D2A-\u9D2C\u9D3B\u9D3E-\u9D3F\u9D41\u9D44\u9D46" - "\u9D48\u9D50-\u9D51\u9D59\u9D5C-\u9D5E\u9D60-\u9D61" - "\u9D64\u9D6C\u9D6F\u9D72\u9D7A\u9D87\u9D89\u9D8F" - "\u9D9A\u9DA4\u9DA9\u9DAB\u9DAF\u9DB2\u9DB4\u9DB8" - "\u9DBA-\u9DBB\u9DC1-\u9DC2\u9DC4\u9DC6\u9DCF\u9DD3" - "\u9DD9\u9DE6\u9DED\u9DEF\u9DF2\u9DF8-\u9DFA\u9DFD" - "\u9E1A-\u9E1B\u9E1E\u9E75\u9E78-\u9E79\u9E7D\u9E7F" - "\u9E81\u9E88\u9E8B-\u9E8C\u9E91-\u9E93\u9E95\u9E97" - "\u9E9D\u9E9F\u9EA5-\u9EA6\u9EA9-\u9EAA\u9EAD\u9EB8-\u9EBC" - "\u9EBE-\u9EBF\u9EC4\u9ECC-\u9ED0\u9ED2\u9ED4\u9ED8-\u9ED9" - "\u9EDB-\u9EDE\u9EE0\u9EE5\u9EE8\u9EEF\u9EF4\u9EF6-\u9EF7" - "\u9EF9\u9EFB-\u9EFD\u9F07-\u9F08\u9F0E\u9F13\u9F15" - "\u9F20-\u9F21\u9F2C\u9F3B\u9F3E\u9F4A-\u9F4B\u9F4E-\u9F4F" - "\u9F52\u9F54\u9F5F-\u9F63\u9F66-\u9F67\u9F6A\u9F6C" - "\u9F72\u9F76-\u9F77\u9F8D\u9F95\u9F9C-\u9F9D\u9FA0]" - } - - //------------------------------------------------------------ - // Rule Based Number Format Support - //------------------------------------------------------------ - -// * Spellout rules for Japanese. In Japanese, there really isn't any -// * distinction between a number written out in digits and a number -// * written out in words: the ideographic characters are both digits -// * and words. This rule set provides two variants: %traditional -// * uses the traditional CJK numerals (which are also used in China -// * and Korea). %financial uses alternate ideographs for many numbers -// * that are harder to alter than the traditional numerals (one could -// * fairly easily change a one to -// * a three just by adding two strokes, for example). This is also done in -// * the other countries using Chinese idographs, but different ideographs -// * are used in those places. - - // Can someone supply me with the right fraud-proof ideographs for - // Simplified and Traditional Chinese, and for Korean? Can someone - // supply me with information on negatives and decimals? - - SpelloutRules { - "%financial:\n" - " \u96f6; \u58f1; \u5f10; \u53c2; \u56db; \u4f0d; \u516d; \u4e03; \u516b; \u4e5d;\n" - " \u62fe[>>];\n" - " 20: <<\u62fe[>>];\n" - " 100: <<\u767e[>>];\n" - " 1000: <<\u5343[>>];\n" - " 10,000: <<\u4e07[>>];\n" - " 100,000,000: <<\u5104[>>];\n" - " 1,000,000,000,000: <<\u5146[>>];\n" - " 10,000,000,000,000,000: =#,##0=;\n" - "%traditional:\n" - " \u96f6; \u4e00; \u4e8c; \u4e09; \u56db; \u4e94; \u516d; \u4e03; \u516b; \u4e5d;\n" - " \u5341[>>];\n" - " 20: <<\u5341[>>];\n" - " 100: <<\u767e[>>];\n" - " 1000: <<\u5343[>>];\n" - " 10,000: <<\u4e07[>>];\n" - " 100,000,000: <<\u5104[>>];\n" - " 1,000,000,000,000: <<\u5146[>>];\n" - " 10,000,000,000,000,000: =#,##0=;" - } - - // Currency display names - Currencies { - AED { "AED", "UAE \u30C7\u30A3\u30EB\u30CF\u30E0" } // UAE Dirham - ALL { "ALL", "\u30EC\u30AF" } // Leck - AMD { "AMD", "\u30A2\u30EB\u30E1\u30CB\u30A2 \u30C9\u30E9\u30E0" } // Armenian Dram - ARS { "ARS", "\u30A2\u30EB\u30BC\u30F3\u30C1\u30F3 \u30DA\u30BD" } // Argentine Peso - AUD { "AUD", "\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2 \u30C9\u30EB" } // Australian Dollar - AZM { "AZM", "\u30A2\u30BC\u30EB\u30D0\u30A4\u30B8\u30E3\u30F3 \u30DE\u30CA\u30C8" } // Azerbaijanian Manat - BGL { "BGL", "\u30EC\u30D5" } // Lev - BHD { "BHD", "\u30D0\u30FC\u30EC\u30FC\u30F3 \u30C7\u30A3\u30FC\u30CA\u30FC\u30EB" } // Bahraini Dinar - BND { "BND", "\u30D6\u30EB\u30CD\u30A4 \u30C9\u30EB" } // Brunei Dollar - BOB { "BOB", "\u30DC\u30EA\u30D3\u30A2\u30CE" } // Boliviano - BRL { "BRL", "\u30D6\u30E9\u30B8\u30EB \u30EC\u30A2\u30FC\u30EB" } // Brazilian Real - BYB { "BYB", "\u30D9\u30E9\u30EB\u30FC\u30B7 \u30EB\u30FC\u30D6\u30EB" } - BZD { "BZD", "\u30D9\u30EA\u30FC\u30BA \u30C9\u30EB" } // Belize Dollar - CAD { "CAD", "\u30AB\u30CA\u30C0 \u30C9\u30EB" } // Canadian Dollar - CHF { "CHF", "\u30B9\u30A4\u30B9 \u30D5\u30E9\u30F3" } // Swiss Franc - CLP { "CLP", "\u30C1\u30EA \u30DA\u30BD" } // Chilean Peso - CNY { "CNY", "\u5143\u4EBA\u6C11\u5E63" } // Yuan Renminbi - COP { "COP", "\u30B3\u30ED\u30F3\u30D3\u30A2 \u30DA\u30BD" } // Colombian Peso - CRC { "CRC", "\u30B3\u30B9\u30BF\u30EA\u30AB \u30B3\u30ED\u30FC\u30F3" } // Costa Rican Colon - CZK { "CZK", "\u30C1\u30A7\u30B3 \u30B3\u30EB\u30CA" } // Czech Koruna - DKK { "DKK", "\u30C7\u30F3\u30DE\u30FC\u30AF \u30AF\u30ED\u30FC\u30CD" } // Danish Krone - DOP { "DOP", "\u30C9\u30DF\u30CB\u30AB \u30DA\u30BD" } // Dominican Peso - DZD { "DZD", "\u30A2\u30EB\u30B8\u30A7\u30EA\u30A2 \u30C7\u30A3\u30FC\u30CA\u30FC\u30EB" } // Algerian Dinar - EEK { "EEK", "\u30AF\u30EB\u30FC\u30F3" } // Kroon - EGP { "EGP", "\u30A8\u30B8\u30D7\u30C8 \u30DD\u30F3\u30C9" } // Egyptian Pound - EUR { "\u20AC", "\u30E6\u30FC\u30ED" } // Euro - GBP { "\u00A3", "\u82F1\u8CA8\u30DD\u30F3\u30C9" } // Pound Sterling - GEL { "GEL", "\u30E9\u30EA" } // Lari - GTQ { "GTQ", "\u30B1\u30C3\u30C4\u30A1\u30EB" } // Quetzal - HKD { "HKD", "\u9999\u6E2F\u30C9\u30EB" } // Hong Kong Dollar - HNL { "HNL", "\u30EC\u30F3\u30D4\u30E9" } // Lempira - HRK { "HRK", "\u30AF\u30ED\u30A2\u30C1\u30A2 \u30AF\u30FC\u30CA" } // Croatian kuna - HUF { "HUF", "\u30D5\u30A9\u30FC\u30EA\u30F3\u30C8" } // Forint - IDR { "IDR", "\u30EB\u30D4\u30A2" } // Rupiah - ILS { "ILS", "\u30A4\u30B9\u30E9\u30A8\u30EB\u65B0\u30B7\u30A7\u30B1\u30EB" } // New Israeli Sheqel - INR { "=0#Rs.|1#Re.|1 source: ../../../locale/icu/main/ja.xml + */ +ja{ + Countries{ + AD{"アンドラ"} + AE{"アラブ首長国連邦"} + AF{"アフガニスタン"} + AG{"アンティグア・バーブーダ"} + AI{"アンギラ"} + AL{"アルバニア"} + AM{"アルメニア"} + AN{"オランダ領アンティル諸島"} + AO{"アンゴラ"} + AQ{"南極大陸"} + AR{"アルゼンチン"} + AS{"米領サモア"} + AT{"オーストリア"} + AU{"オーストラリア"} + AW{"アルバ島"} + AZ{"アゼルバイジャン"} + BA{"ボスニア・ヘルツェゴビナ"} + BB{"バルバドス"} + BD{"バングラデシュ"} + BE{"ベルギー"} + BF{"ブルキナファソ"} + BG{"ブルガリア"} + BH{"バーレーン"} + BI{"ブルンジ"} + BJ{"ベニン"} + BM{"バーミューダ"} + BN{"ブルネイ"} + BO{"ボリビア"} + BR{"ブラジル"} + BS{"バハマ"} + BT{"ブータン"} + BV{"ブーベ島"} + BW{"ボツワナ"} + BY{"ベラルーシ"} + BZ{"ベリーズ"} + CA{"カナダ"} + CC{"ココス (キーリング) 諸島"} + CD{"コンゴ民主共和国"} + CF{"中央アフリカ共和国"} + CG{"コンゴ"} + CH{"スイス"} + CI{"コートジボアール"} + CK{"クック諸島"} + CL{"チリ"} + CM{"カメルーン"} + CN{"中国"} + CO{"コロンビア"} + CR{"コスタリカ"} + CU{"キューバ"} + CV{"カーボベルデ"} + CX{"クリスマス島"} + CY{"キプロス"} + CZ{"チェコ"} + DE{"ドイツ"} + DJ{"ジブチ"} + DK{"デンマーク"} + DM{"ドミニカ国"} + DO{"ドミニカ共和国"} + DZ{"アルジェリア"} + EC{"エクアドル"} + EE{"エストニア"} + EG{"エジプト"} + EH{"西サハラ"} + ER{"エリトリア"} + ES{"スペイン"} + ET{"エチオピア"} + FI{"フィンランド"} + FJ{"フィジー"} + FK{"フォークランド諸島"} + FM{"ミクロネシア"} + FO{"フェロー諸島"} + FR{"フランス"} + GA{"ガボン"} + GB{"イギリス"} + GD{"グレナダ"} + GE{"グルジア"} + GF{"仏領ギアナ"} + GH{"ガーナ"} + GI{"ジブラルタル"} + GL{"グリーンランド"} + GM{"ガンビア"} + GN{"ギニア"} + GP{"グアドループ"} + GQ{"赤道ギニア"} + GR{"ギリシア"} + GS{"南ジョージア島・南サンドイッチ諸島"} + GT{"グアテマラ"} + GU{"グアム島"} + GW{"ギニアビサウ"} + GY{"ガイアナ"} + HK{"中華人民共和国香港特別行政区"} + HM{"ハード・アンド・マクドナルド・アイランズ"} + HN{"ホンジュラス"} + HR{"クロアチア"} + HT{"ハイチ"} + HU{"ハンガリー"} + ID{"インドネシア"} + IE{"アイルランド"} + IL{"イスラエル"} + IN{"インド"} + IO{"英領インド洋植民地"} + IQ{"イラク"} + IR{"イラン"} + IS{"アイスランド"} + IT{"イタリア"} + JM{"ジャマイカ"} + JO{"ヨルダン"} + JP{"日本"} + KE{"ケニア"} + KG{"キルギスタン"} + KH{"カンボジア"} + KI{"キリバス"} + KM{"コモロ"} + KN{"セントクリストファー・ネイビス"} + KP{"朝鮮民主主義人民共和国"} + KR{"大韓民国"} + KW{"クウェート"} + KY{"ケイマン諸島"} + KZ{"カザフスタン"} + LA{"ラオス"} + LB{"レバノン"} + LC{"セントルシア"} + LI{"リヒテンシュタイン"} + LK{"スリランカ"} + LR{"リベリア"} + LS{"レソト"} + LT{"リトアニア"} + LU{"ルクセンブルグ"} + LV{"ラトビア"} + LY{"リビア"} + MA{"モロッコ"} + MC{"モナコ"} + MD{"モルドバ"} + MG{"マダガスカル"} + MH{"マーシャル諸島共和国"} + MK{"マケドニア"} + ML{"マリ"} + MM{"ミャンマー"} + MN{"モンゴル"} + MO{"中華人民共和国マカオ特別行政区"} + MP{"北マリアナ諸島"} + MQ{"マルティニーク島"} + MR{"モーリタニア"} + MS{"モントセラト島"} + MT{"マルタ"} + MU{"モーリシャス"} + MV{"モルジブ"} + MW{"マラウィ"} + MX{"メキシコ"} + MY{"マレーシア"} + MZ{"モザンビーク"} + NA{"ナミビア"} + NC{"ニューカレドニア"} + NE{"ニジェール"} + NF{"ノーフォーク島"} + NG{"ナイジェリア"} + NI{"ニカラグア"} + NL{"オランダ"} + NO{"ノルウェー"} + NP{"ネパール"} + NR{"ナウル"} + NU{"ニウエ島"} + NZ{"ニュージーランド"} + OM{"オマーン"} + PA{"パナマ"} + PE{"ペルー"} + PF{"仏領ポリネシア"} + PG{"パプアニューギニア"} + PH{"フィリピン"} + PK{"パキスタン"} + PL{"ポーランド"} + PM{"サンピエール・エ・ミクロン島"} + PN{"ピトケアン島"} + PR{"プエルトリコ"} + PS{"パレスチナ"} + PT{"ポルトガル"} + PW{"パラオ"} + PY{"パラグアイ"} + QA{"カタール"} + RE{"レユニオン島"} + RO{"ルーマニア"} + RU{"ロシア"} + RW{"ルワンダ"} + SA{"サウジアラビア"} + SB{"ソロモン諸島"} + SC{"セイシェル"} + SD{"スーダン"} + SE{"スウェーデン"} + SG{"シンガポール"} + SH{"セントヘレナ島"} + SI{"スロベニア"} + SJ{"スバールバル諸島・ヤンマイエン島"} + SK{"スロバキア"} + SL{"シエラレオネ"} + SM{"サンマリノ"} + SN{"セネガル"} + SO{"ソマリア"} + SP{"セルビア"} + SR{"スリナム"} + ST{"サントメ・プリンシペ"} + SV{"エルサルバドル"} + SY{"シリア"} + SZ{"スワジランド"} + TC{"タークス諸島・カイコス諸島"} + TD{"チャド"} + TF{"仏南方領"} + TG{"トーゴ"} + TH{"タイ"} + TJ{"タジキスタン"} + TK{"トケラウ諸島"} + TL{"東ティモール"} + TM{"トルクメニスタン"} + TN{"チュニジア"} + TO{"トンガ"} + TR{"トルコ"} + TT{"トリニダード・トバゴ"} + TV{"ツバル"} + TW{"台湾"} + TZ{"タンザニア"} + UA{"ウクライナ"} + UG{"ウガンダ"} + UM{"米領太平洋諸島"} + US{"アメリカ合衆国"} + UY{"ウルグアイ"} + UZ{"ウズベキスタン"} + VA{"ローマ教皇庁 (バチカン市国)"} + VC{"セントビンセント・グレナディーン諸島"} + VE{"ベネズエラ"} + VG{"英領バージン諸島"} + VI{"米領バージン諸島"} + VN{"ベトナム"} + VU{"バヌアツ"} + WF{"ウォリス・フトーナ"} + WS{"西サモア"} + YE{"イエメン"} + YT{"マヨット島"} + YU{"ユーゴスラビア"} + ZA{"南アフリカ"} + ZM{"ザンビア"} + ZW{"ジンバブエ"} + } + Currencies{ + ADD{ + "ADD", + "アンドラ ディナール", + } + ADP{ + "ADP", + "アンドラ ペセタ", + } + AED{ + "AED", + "UAE ディルハム", + } + AFA{ + "AFA", + "アフガニー (1927-2002)", + } + AFN{ + "Af", + "アフガニー", + } + AIF{ + "AIF", + "アファールおよびイサス フラン", + } + ALK{ + "ALK", + "アルバニア レク (1946-1961)", + } + ALL{ + "ALL", + "アルバニア レク", + } + ALV{ + "ALV", + "アルバニア レク (Valute)", + } + ALX{ + "ALX", + "アルバニア レク (f)", + } + AMD{ + "AMD", + "アルメニア ドラム", + } + ANG{ + "ANG", + "オランダ領アンティル ギルダー", + } + AOA{ + "AOA", + "クワンザ (AOA)", + } + AOK{ + "AOK", + "クワンザ (1977-1990)", + } + AON{ + "AON", + "アンゴラ 新クワンザ (1990-2000)", + } + AOR{ + "AOR", + "アンゴラ 旧クワンザ (1995-1999)", + } + AOS{ + "AOS", + "アンゴラ エスクード", + } + ARA{ + "ARA", + "アルゼンチン アゥストラール", + } + ARM{ + "ARM", + "アルゼンチン ペソ (MN)", + } + ARP{ + "ARP", + "アルゼンチン ペソ (1983-1985)", + } + ARS{ + "ARS", + "アルゼンチン ペソ", + } + AUD{ + "AUD", + "オーストラリア ドル", + } + AUP{ + "AUP", + "オーストラリア ポンド", + } + AWG{ + "AWG", + "アルバ ギルダー", + } + AZM{ + "AZM", + "アゼルバイジャン マナト", + } + BAD{ + "BAD", + "ボスニア ディナール", + } + BAM{ + "BAM", + "ボスニア マルク (BAM)", + } + BAN{ + "BAN", + "ボスニア 新ディナール", + } + BBD{ + "BBD", + "バルバドス ドル", + } + BDT{ + "BDT", + "バングラデシュ タカ", + } + BEC{ + "BEC", + "ベルギー フラン (BEC)", + } + BEF{ + "BEF", + "ベルギー フラン", + } + BEL{ + "BEL", + "ベルギー フラン (BEL)", + } + BGL{ + "BGL", + "ブルガリア レフ (BGL)", + } + BGM{ + "BGM", + "ブルガリア レフ (BGM)", + } + BGN{ + "BGN", + "ブルガリア 新レフ", + } + BGO{ + "BGO", + "ブルガリア レフ (1879-1952)", + } + BGX{ + "BGX", + "ブルガリア レフ (FEC)", + } + BHD{ + "BHD", + "バーレーン ディナール", + } + BIF{ + "BIF", + "ブルンジ フラン", + } + BMD{ + "BMD", + "バミューダ ドル", + } + BMP{ + "BMP", + "バミューダ ポンド", + } + BND{ + "BND", + "ブルネイ ドル", + } + BOB{ + "BOB", + "ボリビアノ", + } + BOL{ + "BOL", + "ボリビア ボリビアノ (1863-1962)", + } + BOP{ + "BOP", + "ボリビア ペソ", + } + BOV{ + "BOV", + "ボリビア Mvdol", + } + BRB{ + "BRB", + "ブラジル 新クルゼイロ (BRB、1967-1986)", + } + BRC{ + "BRC", + "ブラジル クルゼイロ (BRC)", + } + BRE{ + "BRE", + "ブラジル クルゼイロ (BRE、1990-1993)", + } + BRL{ + "BRL", + "ブラジル レアル", + } + BRN{ + "BRN", + "ブラジル 新クルゼイロ (BRN)", + } + BRR{ + "BRR", + "ブラジル クルゼイロ レアル", + } + BRZ{ + "BRZ", + "ブラジル クルゼイロ (BRZ、1942-1967)", + } + BSD{ + "BSD", + "バハマ ドル", + } + BSP{ + "BSP", + "バハマ ポンド", + } + BTN{ + "BTN", + "ブータン ニュルタム", + } + BTR{ + "BTR", + "ブータン ルピー", + } + BUK{ + "BUK", + "ビルマ チャット", + } + BUR{ + "BUR", + "ビルマ ルピー", + } + BWP{ + "BWP", + "ボツワナ プラ", + } + BYB{ + "BYB", + "ベラルーシ ルーブル (BYB、1994-1999)", + } + BYL{ + "BYL", + "ベラルーシ ルーブル (BYL、1992-1994)", + } + BYR{ + "BYR", + "ベラルーシ ルーブル", + } + BZD{ + "BZD", + "ベリーズ ドル", + } + BZH{ + "BZH", + "英領ホンジュラス ドル", + } + CAD{ + "CAD", + "カナダ ドル", + } + CDF{ + "CDF", + "コンゴ フラン", + } + CDG{ + "CDG", + "コンゴ共和国 フラン", + } + CDL{ + "CDL", + "コンゴ ザイール", + } + CFF{ + "CFF", + "中央アフリカ共和国 CFA フラン", + } + CHF{ + "CHF", + "スイス フラン", + } + CKD{ + "CKD", + "クック諸島 ドル", + } + CLC{ + "CLC", + "チリ ペソ (CLC)", + } + CLE{ + "CLE", + "チリ エスクード", + } + CLF{ + "CLF", + "チリ ウニダ デ フォメント", + } + CLP{ + "CLP", + "チリ ペソ", + } + CMF{ + "CMF", + "カメルーン CFA フラン", + } + CNP{ + "CNP", + "中国人民元", + } + CNX{ + "CNX", + "中国 米ドル (FEC)", + } + CNY{ + "CNY", + "中国人民元", + } + COB{ + "COB", + "コロンビア ペソ (COB)", + } + COF{ + "COF", + "コンゴ CFA フラン", + } + COP{ + "COP", + "コロンビア ペソ", + } + CRC{ + "CRC", + "コスタリカ コロン", + } + CSC{ + "CSC", + "チェコスロバキア コルナ (CSC)", + } + CSK{ + "CSK", + "チェコスロバキア コルナ (CSK)", + } + CUP{ + "CUP", + "キューバ ペソ", + } + CUX{ + "CUX", + "キューバ (FEC)", + } + CVE{ + "CVE", + "カーボベルデ エスクード", + } + CWG{ + "CWG", + "キュラソー島 ギルダー", + } + CYP{ + "CYP", + "キプロス ポンド", + } + CZK{ + "CZK", + "チェコ コルナ", + } + DDM{ + "DDM", + "東ドイツ マルク", + } + DEM{ + "DEM", + "ドイツ マルク", + } + DES{ + "DES", + "ドイツ マルク (Sperrmark)", + } + DJF{ + "DJF", + "ジブチ フラン", + } + DKK{ + "DKK", + "デンマーク クローネ", + } + DOP{ + "DOP", + "ドミニカ ペソ", + } + DZD{ + "DZD", + "アルジェリア ディナール", + } + DZF{ + "DZF", + "アルジェリア 新フラン", + } + DZG{ + "DZG", + "アルジェリア フラン (DZG)", + } + ECS{ + "ECS", + "エクアドル スクレ", + } + ECV{ + "ECV", + "エクアドル UVC", + } + EEK{ + "EEK", + "エストニア クルーン", + } + EGP{ + "EGP", + "エジプト ポンド", + } + ERN{ + "ERN", + "エリトリア ナクファ", + } + ESP{ + "ESP", + "スペイン ペセタ", + } + ETB{ + "ETB", + "エチオピア ブル", + } + ETD{ + "ETD", + "エチオピア ドル", + } + EUR{ + "€", + "ユーロ", + } + FIM{ + "FIM", + "フィンランド マルカ", + } + FIN{ + "FIN", + "フィンランド マルカ (1860-1962)", + } + FJD{ + "FJD", + "フィジー諸島 ドル", + } + FJP{ + "FJP", + "フィジー諸島 ポンド", + } + FKP{ + "FKP", + "フォークランド(マルビナス)諸島 ポンド", + } + FOK{ + "FOK", + "フェロー諸島 クローナ", + } + FRF{ + "FRF", + "フランス フラン", + } + FRG{ + "FRG", + "フランス フラン (Franc Germinal/Franc Poincare)", + } + GAF{ + "GAF", + "ガボン CFA フラン", + } + GBP{ + "£", + "英国ポンド", + } + GEK{ + "GEK", + "グルジア クーポン ラリ", + } + GEL{ + "GEL", + "グルジア ラリ", + } + GHC{ + "GHC", + "ガーナ セディ", + } + GHO{ + "GHO", + "ガーナ 旧セディ", + } + GHP{ + "GHP", + "ガーナ ポンド", + } + GHR{ + "GHR", + "ガーナ 新セディ", + } + GIP{ + "GIP", + "ジブラルタル ポンド", + } + GLK{ + "GLK", + "グリーンランド クローネ", + } + GMD{ + "GMD", + "ガンビア ダラシ", + } + GMP{ + "GMP", + "ガンビア ポンド", + } + GNF{ + "GNF", + "ギニア フラン", + } + GNI{ + "GNI", + "ギニア フラン (1960-1972)", + } + GNS{ + "GNS", + "ギニア シリー", + } + GPF{ + "GPF", + "グアドループ フラン", + } + GQE{ + "GQE", + "赤道ギニア ギニー", + } + GQF{ + "GQF", + "赤道ギニア フラン", + } + GQP{ + "GQP", + "赤道ギニア ペセタ", + } + GRD{ + "GRD", + "ギリシャ ドラクマ", + } + GRN{ + "GRN", + "ギリシャ 新ドラクマ", + } + GTQ{ + "GTQ", + "グアテマラ ケツァル", + } + GUF{ + "GUF", + "仏領ギアナ フラン", + } + GWE{ + "GWE", + "ポルトガル領ギニア エスクード", + } + GWM{ + "GWM", + "ポルトガル領ギニア ミルレイス", + } + GWP{ + "GWP", + "ギニアビサウ ペソ", + } + GYD{ + "GYD", + "ガイアナ ドル", + } + HKD{ + "HKD", + "香港ドル", + } + HNL{ + "HNL", + "ホンジュラス レンピラ", + } + HRD{ + "HRD", + "クロアチア ディナール", + } + HRK{ + "HRK", + "クロアチア クーナ", + } + HTG{ + "HTG", + "ハイチ グールド", + } + HUF{ + "HUF", + "ハンガリー フォリント", + } + IBP{ + "IBP", + "北アイルランド ポンド", + } + IDG{ + "IDG", + "インドネシア ニカギルダー", + } + IDJ{ + "IDJ", + "インドネシア ジャワ ルピア", + } + IDN{ + "IDN", + "インドネシア 新ルピア", + } + IDR{ + "IDR", + "インドネシア ルピア", + } + IEP{ + "IEP", + "アイリッシュ ポンド", + } + ILL{ + "ILL", + "イスラエル シェケル", + } + ILP{ + "ILP", + "イスラエル ポンド", + } + ILS{ + "ILS", + "イスラエル新シェケル", + } + IMP{ + "IMP", + "マン島 ポンド", + } + INR{ + "=0#Rs.|1#Re.|1 source: ../../../locale/icu/main/kk.xml + */ +kk{ + Countries{ + KZ{"Қазақстан"} + } + Currencies{ + KZT{ + "тңг.", + "KZT", + } + } + ExemplarCharacters{"[а-яыэёіқңүұә]"} + Languages{ + kk{"Қазақ"} + } + LocaleScript{ + "Cyrl", + } + NumberElements{ + ",", + " ", + ";", + "%", + "0", + "#", + "-", + "E", + "‰", + "∞", + "�", + "+", + } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "HH:mm:ss z", + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm", + "EEEE, d MMMM yyyy 'ж.'", + "d MMMM yyyy 'ж.'", + "dd.MM.yyyy", + "dd.MM.yy", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "жс.", + "дс.", + "сс.", + "ср.", + "бс.", + "жм.", + "сһ.", + } + wide{ + "жексені", + "дуйсенбі", + "сейсенбі", + "сәренбі", + "бейсенбі", + "жұма", + "сенбі", + } + } + } + monthNames{ + format{ + abbreviated{ + "қаң.", + "ақп.", + "нау.", + "сәу.", + "мам.", + "мау.", + "шіл.", + "там.", + "қыр.", + "қаз.", + "қар.", + "желт.", + } + wide{ + "қаңтар", + "ақпан", + "наурыз", + "сәуір", + "мамыр", + "маусым", + "шілде", + "тамыз", + "қыркүйек", + "қазан", + "қараша", + "желтоқсан", + } + } + } + } + } +} diff --git a/icuSources/data/locales/kk_KZ.txt b/icuSources/data/locales/kk_KZ.txt new file mode 100644 index 00000000..1b22761b --- /dev/null +++ b/icuSources/data/locales/kk_KZ.txt @@ -0,0 +1,17 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/kk_KZ.xml +// * +// *************************************************************************** +kk_KZ{ + NumberPatterns{ + "#,##0.###;-#,##0.###", + "#,##0.00 ¤;-¤ #,##0.00", + "#,##0%", + "#E0", + } + Version{"1.2"} +} diff --git a/icuSources/data/locales/kl.txt b/icuSources/data/locales/kl.txt index 082bcbf5..f550825d 100644 --- a/icuSources/data/locales/kl.txt +++ b/icuSources/data/locales/kl.txt @@ -1,60 +1,32 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/kl.xml // * // *************************************************************************** - +/** + * ICU source: ../../../locale/icu/main/kl.xml + */ kl{ - Version { "2.0" } - - DayAbbreviations { - "sab", - "ata", - "mar", - "pin", - "sis", - "tal", - "arf", + Countries{ + GL{"Kalaallit Nunaat"} } - DayNames { - "sabaat", - "ataasinngorneq", - "marlunngorneq", - "pingasunngorneq", - "sisamanngorneq", - "tallimanngorneq", - "arfininngorneq", + Currencies{ + DKK{ + "kr", + "DKK", + } } - MonthAbbreviations { - "jan", - "feb", - "mar", - "apr", - "maj", - "jun", - "jul", - "aug", - "sep", - "okt", - "nov", - "dec", + ExemplarCharacters{"[a-záéíúâêîôûæåøãĩũĸ]"} + Languages{ + kl{"kalaallisut"} } - MonthNames { - "januari", - "februari", - "martsi", - "aprili", - "maji", - "juni", - "juli", - "augustusi", - "septemberi", - "oktoberi", - "novemberi", - "decemberi", + LocaleScript{ + "Latn", } - NumberElements { + NumberElements{ ",", ".", ";", @@ -63,29 +35,68 @@ kl{ "#", "-", "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", + "‰", + "∞", + "�", + "+", } - ExemplarCharacters { "[a-z \u00e1 \u00e9 \u00ed \u00fa \u00e2 \u00ea \u00ee \u00f4 \u00fb \u00e6 \u00e5 \u00f8 \u00e3 \u0129 \u0169 \u0138]" } - -// LocaleScript{ -// "Latn", // ISO 15924 Name -// } - - // /**************** Info Below is needed ****************/ - // CollationElements{} - // Countries{} - // Eras{} - // Languages{} - // ShortLanguage { } - // localPatternChars{} - // - - - // Currency display names - Currencies { - DKK { "kr", "DKK" } + Version{"1.2"} + calendar{ + gregorian{ + dayNames{ + format{ + abbreviated{ + "sab", + "ata", + "mar", + "pin", + "sis", + "tal", + "arf", + } + wide{ + "sabaat", + "ataasinngorneq", + "marlunngorneq", + "pingasunngorneq", + "sisamanngorneq", + "tallimanngorneq", + "arfininngorneq", + } + } + } + monthNames{ + format{ + abbreviated{ + "jan", + "feb", + "mar", + "apr", + "maj", + "jun", + "jul", + "aug", + "sep", + "okt", + "nov", + "dec", + } + wide{ + "januari", + "februari", + "martsi", + "aprili", + "maji", + "juni", + "juli", + "augustusi", + "septemberi", + "oktoberi", + "novemberi", + "decemberi", + } + } + } + } } } diff --git a/icuSources/data/locales/kl_GL.txt b/icuSources/data/locales/kl_GL.txt index 193e31bb..3a5baa4f 100644 --- a/icuSources/data/locales/kl_GL.txt +++ b/icuSources/data/locales/kl_GL.txt @@ -1,27 +1,32 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/kl_GL.xml // * // *************************************************************************** - -kl_GL { - Version { "2.0" } - DateTimePatterns { - "h:mm:ss a", - "h:mm:ss a", - "h:mm:ss a", - "h:mm a", - "EEEE dd MMMM yyyy", - "dd MMMM yyyy", - "MMM dd,yy", - "dd/MM/yy", - "{1} {0}", - } - NumberPatterns { +kl_GL{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "\u00a4#,##0.00;\u00a4 -#,##0.00", + "¤#,##0.00;¤ -#,##0.00", "#,##0%", "#E0", } + Version{"1.2"} + calendar{ + gregorian{ + DateTimePatterns{ + "h:mm:ss a", + "h:mm:ss a", + "h:mm:ss a", + "h:mm a", + "EEEE dd MMMM yyyy", + "dd MMMM yyyy", + "MMM dd,yy", + "dd/MM/yy", + "{1} {0}", + } + } + } } diff --git a/icuSources/data/locales/kn.txt b/icuSources/data/locales/kn.txt index a7ff42ef..6d48059d 100644 --- a/icuSources/data/locales/kn.txt +++ b/icuSources/data/locales/kn.txt @@ -1,104 +1,99 @@ -// *************************************************************************** -// * -// * Copyright (C) 2001-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -kn { - Version{ "2.0" } - LocaleID:int { 0x4B } - Countries { - IN { "\u0cad\u0cbe\u0cb0\u0ca4" } - } - Languages { - kn { "\u0c95\u0ca8\u0ccd\u0ca8\u0ca1" } - } - AmPmMarkers{ - "\u0CAA\u0CC2\u0CB0\u0CCD\u0CB5\u0CBE\u0CB9\u0CCD\u0CA8", - "\u0C85\u0CAA\u0CB0\u0CBE\u0CB9\u0CCD\u0CA8" - } -// ShortLanguage{ -// "KAN" -// } -// Language { -// "Kannada" -// } - - DayNames{ - "\u0CB0\u0CB5\u0CBF\u0CB5\u0CBE\u0CB0", - "\u0CB8\u0CCB\u0CAE\u0CB5\u0CBE\u0CB0", - "\u0CAE\u0C82\u0C97\u0CB3\u0CB5\u0CBE\u0CB0", - "\u0CAC\u0CC1\u0CA7\u0CB5\u0CBE\u0CB0", - "\u0C97\u0CC1\u0CB0\u0CC1\u0CB5\u0CBE\u0CB0", - "\u0CB6\u0CC1\u0C95\u0CCD\u0CB0\u0CB5\u0CBE\u0CB0", - "\u0CB6\u0CA8\u0CBF\u0CB5\u0CBE\u0CB0" - } - - DayAbbreviations{ - "\u0CB0.", - "\u0CB8\u0CCB.", - "\u0CAE\u0C82.", - "\u0CAC\u0CC1.", - "\u0C97\u0CC1.", - "\u0CB6\u0CC1.", - "\u0CB6\u0CA8\u0CBF." - } - - MonthNames{ - "\u0C9C\u0CA8\u0CB5\u0CB0\u0CC0", - "\u0CAB\u0CC6\u0CAC\u0CCD\u0CB0\u0CB5\u0CB0\u0CC0", - "\u0CAE\u0CBE\u0CB0\u0CCD\u0C9A\u0CCD", - "\u0C8E\u0CAA\u0CCD\u0CB0\u0CBF\u0CB2\u0CCD", - "\u0CAE\u0CC6", - "\u0C9C\u0CC2\u0CA8\u0CCD", - "\u0C9C\u0CC1\u0CB2\u0CC8", - "\u0C86\u0C97\u0CB8\u0CCD\u0C9F\u0CCD", - "\u0CB8\u0CAA\u0CCD\u0C9F\u0CC6\u0C82\u0CAC\u0CB0\u0CCD", - "\u0C85\u0C95\u0CCD\u0C9F\u0CCB\u0CAC\u0CB0\u0CCD", - "\u0CA8\u0CB5\u0CC6\u0C82\u0CAC\u0CB0\u0CCD", - "\u0CA1\u0CBF\u0CB8\u0CC6\u0C82\u0CAC\u0CB0\u0CCD", - } - - MonthAbbreviations{ - "\u0C9C\u0CA8\u0CB5\u0CB0\u0CC0", - "\u0CAB\u0CC6\u0CAC\u0CCD\u0CB0\u0CB5\u0CB0\u0CC0", - "\u0CAE\u0CBE\u0CB0\u0CCD\u0C9A\u0CCD", - "\u0C8E\u0CAA\u0CCD\u0CB0\u0CBF\u0CB2\u0CCD", - "\u0CAE\u0CC6", - "\u0C9C\u0CC2\u0CA8\u0CCD", - "\u0C9C\u0CC1\u0CB2\u0CC8", - "\u0C86\u0C97\u0CB8\u0CCD\u0C9F\u0CCD", - "\u0CB8\u0CAA\u0CCD\u0C9F\u0CC6\u0C82\u0CAC\u0CB0\u0CCD", - "\u0C85\u0C95\u0CCD\u0C9F\u0CCB\u0CAC\u0CB0\u0CCD", - "\u0CA8\u0CB5\u0CC6\u0C82\u0CAC\u0CB0\u0CCD", - "\u0CA1\u0CBF\u0CB8\u0CC6\u0C82\u0CAC\u0CB0\u0CCD", - } - -// NumberElements { -// ".", -// ",", -// ";", -// "%", -// "0", -// "#", -// "-", -// "E", -// "\u2030", -// "\u221e", -// "\ufffd", -// } - LocaleScript:array { "Knda" } - ExemplarCharacters { "[:Knda:]" } - CollationElements { - Version { "1.0" } - Sequence { - "[normalization on]" - } - } - - // Currency display names - Currencies { - INR { "\u0930\u0941", "INR" } - } -} \ No newline at end of file +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/kn.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/kn.xml + */ +kn{ + Countries{ + AU{"ಆಸ್ಟ್ರೆಲಿಯ"} + CN{"ಚೀನ"} + EE{"ಎಸ್ತೊನಿಯ"} + IN{"ಭಾರತ"} + MV{"ಮಾಲ್ಡಿವ ದ್ವೀಪಗಳು"} + NP{"ನೆಪಾಳ"} + SG{"ಸಿಂಗಪುರ"} + TR{"ತುರ್ಕಿ"} + } + Currencies{ + INR{ + "रु", + "INR", + } + } + ExemplarCharacters{"[:Knda:]"} + Languages{ + kn{"ಕನ್ನಡ"} + } + LocaleScript{ + "Knda", + } + Version{"1.2"} + calendar{ + gregorian{ + AmPmMarkers{ + "ಪೂರ್ವಾಹ್ನ", + "ಅಪರಾಹ್ನ", + } + dayNames{ + format{ + abbreviated{ + "ರ.", + "ಸೋ.", + "ಮಂ.", + "ಬು.", + "ಗು.", + "ಶು.", + "ಶನಿ.", + } + wide{ + "ರವಿವಾರ", + "ಸೋಮವಾರ", + "ಮಂಗಳವಾರ", + "ಬುಧವಾರ", + "ಗುರುವಾರ", + "ಶುಕ್ರವಾರ", + "ಶನಿವಾರ", + } + } + } + monthNames{ + format{ + abbreviated{ + "ಜನವರೀ", + "ಫೆಬ್ರವರೀ", + "ಮಾರ್ಚ್", + "ಎಪ್ರಿಲ್", + "ಮೆ", + "ಜೂನ್", + "ಜುಲೈ", + "ಆಗಸ್ಟ್", + "ಸಪ್ಟೆಂಬರ್", + "ಅಕ್ಟೋಬರ್", + "ನವೆಂಬರ್", + "ಡಿಸೆಂಬರ್", + } + wide{ + "ಜನವರೀ", + "ಫೆಬ್ರವರೀ", + "ಮಾರ್ಚ್", + "ಎಪ್ರಿಲ್", + "ಮೆ", + "ಜೂನ್", + "ಜುಲೈ", + "ಆಗಸ್ಟ್", + "ಸಪ್ಟೆಂಬರ್", + "ಅಕ್ಟೋಬರ್", + "ನವೆಂಬರ್", + "ಡಿಸೆಂಬರ್", + } + } + } + } + } +} diff --git a/icuSources/data/locales/kn_IN.txt b/icuSources/data/locales/kn_IN.txt index 4b2448ab..c66a0356 100644 --- a/icuSources/data/locales/kn_IN.txt +++ b/icuSources/data/locales/kn_IN.txt @@ -1,34 +1,42 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 2001-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/kn_IN.xml // * // *************************************************************************** - -kn_IN { - Version { "2.0" } - LocaleID:int { 0x044B } -// ShortCountry { IND } - - DateTimePatterns { - "hh:mm:ss a z", - "hh:mm:ss a z", - "hh:mm:ss a", - "hh:mm a", - "EEEE d MMMM yyyy", - "d MMMM yyyy", - "dd-MM-yyyy", - "d-M-yy", - "{1} {0}" - } -// DateTimeElements:intvector { -// 1, -// 1 -// } - NumberPatterns { +kn_IN{ + NumberPatterns{ "##,##,##0.###;-##,##,##0.###", - "\u00A4 ##,##,##0.00;-\u00A4 ##,##,##0.00", + "¤ ##,##,##0.00;-¤ ##,##,##0.00", "##,##,##0%", "#E0", } -} \ No newline at end of file + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "hh:mm:ss a z", + "hh:mm:ss a z", + "hh:mm:ss a", + "hh:mm a", + "EEEE d MMMM yyyy", + "d MMMM yyyy", + "dd-MM-yyyy", + "d-M-yy", + "{1} {0}", + } + weekend:intvector{ + 1, + 0, + 1, + 86400000, + } + } + } +} diff --git a/icuSources/data/locales/ko.txt b/icuSources/data/locales/ko.txt index e27648cf..930ea99d 100644 --- a/icuSources/data/locales/ko.txt +++ b/icuSources/data/locales/ko.txt @@ -1,2750 +1,2669 @@ -// *************************************************************************** -// * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -ko { - Version { "2.0" } - - "%%PREEURO" { "\uc720\ub85c \uc774\uc804" } - "%%EURO" { "\uc720\ub85c" } - - //"%%POSIX" { "POSIX" } - - "%%TRADITIONAL" { "\uc804\ud1b5 \uc5ed\ubc95" } - - "%%REVISED" { "\uac1c\uc815" } - - AmPmMarkers { - "\uC624\uC804", - "\uC624\uD6C4", - } - // Collation rules supplied by Hyangmi Cho of LOTUS - // UCA deals properly with Hangul and Jamo. These rules interleave proper CJK (Hanja) - // between corresponding Hanguls. - CollationElements { - Version { "2.1" } - Sequence{ - "[optimize [\uAC00-\uAC01\uAC04\uAC07-\uAC0A\uAC10-\uAC17\uAC19-\uAC1D\uAC20" - "\uAC24\uAC2C-\uAC2D\uAC2F-\uAC31\uAC38-\uAC39\uAC3C\uAC40\uAC4B" - "\uAC4D\uAC54\uAC58\uAC5C\uAC70-\uAC71\uAC74\uAC77-\uAC78\uAC7A" - "\uAC80-\uAC81\uAC83-\uAC86\uAC89-\uAC8C\uAC90\uAC94\uAC9C-\uAC9D" - "\uAC9F-\uACA1\uACA8-\uACAA\uACAC\uACAF-\uACB0\uACB8-\uACB9\uACBB-\uACBD" - "\uACC1\uACC4\uACC8\uACCC\uACD5\uACD7\uACE0-\uACE1\uACE4\uACE7-\uACE8" - "\uACEA\uACEC\uACEF-\uACF1\uACF3\uACF5-\uACF6\uACFC-\uACFD\uAD00" - "\uAD04\uAD06\uAD0C-\uAD0D\uAD0F\uAD11\uAD18\uAD1C\uAD20\uAD29" - "\uAD2C-\uAD2D\uAD34-\uAD35\uAD38\uAD3C\uAD44-\uAD45\uAD47\uAD49" - "\uAD50\uAD54\uAD58\uAD61\uAD63\uAD6C-\uAD6D\uAD70\uAD73-\uAD76" - "\uAD7B-\uAD7D\uAD7F\uAD81-\uAD82\uAD88-\uAD89\uAD8C\uAD90\uAD9C-\uAD9D" - "\uADA4\uADB7\uADC0-\uADC1\uADC4\uADC8\uADD0-\uADD1\uADD3\uADDC" - "\uADE0\uADE4\uADF8-\uADF9\uADFC\uADFF-\uAE01\uAE08-\uAE09\uAE0B" - "\uAE0D\uAE14\uAE30-\uAE31\uAE34\uAE37-\uAE38\uAE3A\uAE40-\uAE41" - "\uAE43\uAE45-\uAE46\uAE4A\uAE4C-\uAE4E\uAE50\uAE54\uAE56\uAE5C-\uAE5D" - "\uAE5F-\uAE61\uAE65\uAE68-\uAE69\uAE6C\uAE70\uAE78-\uAE79\uAE7B-\uAE7D" - "\uAE84-\uAE85\uAE8C\uAEBC-\uAEBE\uAEC0\uAEC4\uAECC-\uAECD\uAECF-\uAED1" - "\uAED8-\uAED9\uAEDC\uAEE8\uAEEB\uAEED\uAEF4\uAEF8\uAEFC\uAF07-\uAF08" - "\uAF0D\uAF10\uAF2C-\uAF2D\uAF30\uAF32\uAF34\uAF3C-\uAF3D\uAF3F" - "\uAF41-\uAF43\uAF48-\uAF49\uAF50\uAF5C-\uAF5D\uAF64-\uAF65\uAF79" - "\uAF80\uAF84\uAF88\uAF90-\uAF91\uAF95\uAF9C\uAFB8-\uAFB9\uAFBC" - "\uAFC0\uAFC7-\uAFC9\uAFCB\uAFCD-\uAFCE\uAFD4\uAFDC\uAFE8-\uAFE9" - "\uAFF0-\uAFF1\uAFF4\uAFF8\uB000-\uB001\uB004\uB00C\uB010\uB014" - "\uB01C-\uB01D\uB028\uB044-\uB045\uB048\uB04A\uB04C\uB04E\uB053-\uB055" - "\uB057\uB059\uB05D\uB07C-\uB07D\uB080\uB084\uB08C-\uB08D\uB08F\uB091" - "\uB098-\uB09A\uB09C\uB09F-\uB0A2\uB0A8-\uB0A9\uB0AB-\uB0AF\uB0B1" - "\uB0B3-\uB0B5\uB0B8\uB0BC\uB0C4-\uB0C5\uB0C7-\uB0C9\uB0D0-\uB0D1" - "\uB0D4\uB0D8\uB0E0\uB0E5\uB108-\uB109\uB10B-\uB10C\uB110\uB112-\uB113" - "\uB118-\uB119\uB11B-\uB11D\uB123-\uB125\uB128\uB12C\uB134-\uB135" - "\uB137-\uB139\uB140-\uB141\uB144\uB148\uB150-\uB151\uB154-\uB155" - "\uB158\uB15C\uB160\uB178-\uB179\uB17C\uB180\uB182\uB188-\uB189" - "\uB18B\uB18D\uB192-\uB194\uB198\uB19C\uB1A8\uB1CC\uB1D0\uB1D4" - "\uB1DC-\uB1DD\uB1DF\uB1E8-\uB1E9\uB1EC\uB1F0\uB1F9\uB1FB\uB1FD" - "\uB204-\uB205\uB208\uB20B-\uB20C\uB214-\uB215\uB217\uB219\uB220" - "\uB234\uB23C\uB258\uB25C\uB260\uB268-\uB269\uB274-\uB275\uB27C" - "\uB284-\uB285\uB289\uB290-\uB291\uB294\uB298-\uB29A\uB2A0-\uB2A1" - "\uB2A3\uB2A5-\uB2A6\uB2AA\uB2AC\uB2B0\uB2B4\uB2C8-\uB2C9\uB2CC" - "\uB2D0\uB2D6\uB2D8-\uB2D9\uB2DB\uB2DD\uB2E2\uB2E4-\uB2E6\uB2E8" - "\uB2EB-\uB2EF\uB2F3-\uB2F5\uB2F7-\uB2FB\uB2FF-\uB301\uB304\uB308" - "\uB310-\uB311\uB313-\uB315\uB31C\uB354-\uB356\uB358\uB35B-\uB35C" - "\uB35E-\uB35F\uB364-\uB365\uB367\uB369\uB36B\uB36E\uB370-\uB371" - "\uB374\uB378\uB380-\uB381\uB383-\uB385\uB38C\uB390\uB394\uB3A0-\uB3A1" - "\uB3A8\uB3AC\uB3C4-\uB3C5\uB3C8\uB3CB-\uB3CC\uB3CE\uB3D0\uB3D4-\uB3D5" - "\uB3D7\uB3D9\uB3DB\uB3DD\uB3E0\uB3E4\uB3E8\uB3FC\uB410\uB418\uB41C" - "\uB420\uB428-\uB429\uB42B\uB434\uB450-\uB451\uB454\uB458\uB460-\uB461" - "\uB463\uB465\uB46C\uB480\uB488\uB49D\uB4A4\uB4A8\uB4AC\uB4B5\uB4B7" - "\uB4B9\uB4C0\uB4C4\uB4C8\uB4D0\uB4D5\uB4DC-\uB4DD\uB4E0\uB4E3-\uB4E4" - "\uB4E6\uB4EC-\uB4ED\uB4EF\uB4F1\uB4F8\uB514-\uB515\uB518\uB51B-\uB51C" - "\uB524-\uB525\uB527-\uB52A\uB530-\uB531\uB534\uB538\uB540-\uB541" - "\uB543-\uB545\uB54B-\uB54D\uB550\uB554\uB55C-\uB55D\uB55F-\uB561" - "\uB5A0-\uB5A1\uB5A4\uB5A8\uB5AA-\uB5AB\uB5B0-\uB5B1\uB5B3-\uB5B5" - "\uB5BB-\uB5BD\uB5C0\uB5C4\uB5CC-\uB5CD\uB5CF-\uB5D1\uB5D8\uB5EC" - "\uB610-\uB611\uB614\uB618\uB625\uB62C\uB634\uB648\uB664\uB668" - "\uB69C-\uB69D\uB6A0\uB6A4\uB6AB-\uB6AC\uB6B1\uB6D4\uB6F0\uB6F4" - "\uB6F8\uB700-\uB701\uB705\uB728-\uB729\uB72C\uB72F-\uB730\uB738-\uB739" - "\uB73B\uB744\uB748\uB74C\uB754-\uB755\uB760\uB764\uB768\uB770-\uB771" - "\uB773\uB775\uB77C-\uB77D\uB780\uB784\uB78C-\uB78D\uB78F-\uB792" - "\uB796-\uB799\uB79C\uB7A0\uB7A8-\uB7A9\uB7AB-\uB7AD\uB7B4-\uB7B5" - "\uB7B8\uB7C7\uB7C9\uB7EC-\uB7ED\uB7F0\uB7F4\uB7FC-\uB7FD\uB7FF-\uB801" - "\uB807-\uB809\uB80C\uB810\uB818-\uB819\uB81B\uB81D\uB824-\uB825" - "\uB828\uB82C\uB834-\uB835\uB837-\uB839\uB840\uB844\uB851\uB853" - "\uB85C-\uB85D\uB860\uB864\uB86C-\uB86D\uB86F\uB871\uB878\uB87C" - "\uB88D\uB8A8\uB8B0\uB8B4\uB8B8\uB8C0-\uB8C1\uB8C3\uB8C5\uB8CC" - "\uB8D0\uB8D4\uB8DD\uB8DF\uB8E1\uB8E8-\uB8E9\uB8EC\uB8F0\uB8F8-\uB8F9" - "\uB8FB\uB8FD\uB904\uB918\uB920\uB93C-\uB93D\uB940\uB944\uB94C" - "\uB94F\uB951\uB958-\uB959\uB95C\uB960\uB968-\uB969\uB96B\uB96D" - "\uB974-\uB975\uB978\uB97C\uB984-\uB985\uB987\uB989-\uB98A\uB98D-\uB98E" - "\uB9AC-\uB9AD\uB9B0\uB9B4\uB9BC-\uB9BD\uB9BF\uB9C1\uB9C8-\uB9C9" - "\uB9CC\uB9CE-\uB9D2\uB9D8-\uB9D9\uB9DB\uB9DD-\uB9DE\uB9E1\uB9E3-\uB9E5" - "\uB9E8\uB9EC\uB9F4-\uB9F5\uB9F7-\uB9FA\uBA00-\uBA01\uBA08\uBA15" - "\uBA38-\uBA39\uBA3C\uBA40\uBA42\uBA48-\uBA49\uBA4B\uBA4D-\uBA4E" - "\uBA53-\uBA55\uBA58\uBA5C\uBA64-\uBA65\uBA67-\uBA69\uBA70-\uBA71" - "\uBA74\uBA78\uBA83-\uBA85\uBA87\uBA8C\uBAA8-\uBAA9\uBAAB-\uBAAC" - "\uBAB0\uBAB2\uBAB8-\uBAB9\uBABB\uBABD\uBAC4\uBAC8\uBAD8-\uBAD9" - "\uBAFC\uBB00\uBB04\uBB0D\uBB0F\uBB11\uBB18\uBB1C\uBB20\uBB29" - "\uBB2B\uBB34-\uBB36\uBB38\uBB3B-\uBB3E\uBB44-\uBB45\uBB47\uBB49" - "\uBB4D\uBB4F-\uBB50\uBB54\uBB58\uBB61\uBB63\uBB6C\uBB88\uBB8C" - "\uBB90\uBBA4\uBBA8\uBBAC\uBBB4\uBBB7\uBBC0\uBBC4\uBBC8\uBBD0" - "\uBBD3\uBBF8-\uBBF9\uBBFC\uBBFF-\uBC00\uBC02\uBC08-\uBC09\uBC0B-\uBC0D" - "\uBC0F\uBC11\uBC14-\uBC18\uBC1B-\uBC1F\uBC24-\uBC25\uBC27\uBC29" - "\uBC2D\uBC30-\uBC31\uBC34\uBC38\uBC40-\uBC41\uBC43-\uBC45\uBC49" - "\uBC4C-\uBC4D\uBC50\uBC5D\uBC84-\uBC85\uBC88\uBC8B-\uBC8C\uBC8E" - "\uBC94-\uBC95\uBC97\uBC99-\uBC9A\uBCA0-\uBCA1\uBCA4\uBCA7-\uBCA8" - "\uBCB0-\uBCB1\uBCB3-\uBCB5\uBCBC-\uBCBD\uBCC0\uBCC4\uBCCD\uBCCF-\uBCD1" - "\uBCD5\uBCD8\uBCDC\uBCF4-\uBCF6\uBCF8\uBCFC\uBD04-\uBD05\uBD07" - "\uBD09\uBD10\uBD14\uBD24\uBD2C\uBD40\uBD48-\uBD49\uBD4C\uBD50" - "\uBD58-\uBD59\uBD64\uBD68\uBD80-\uBD81\uBD84\uBD87-\uBD8A\uBD90-\uBD91" - "\uBD93\uBD95\uBD99-\uBD9A\uBD9C\uBDA4\uBDB0\uBDB8\uBDD4-\uBDD5" - "\uBDD8\uBDDC\uBDE9\uBDF0\uBDF4\uBDF8\uBE00\uBE03\uBE05\uBE0C-\uBE0D" - "\uBE10\uBE14\uBE1C-\uBE1D\uBE1F\uBE44-\uBE45\uBE48\uBE4C\uBE4E" - "\uBE54-\uBE55\uBE57\uBE59-\uBE5B\uBE60-\uBE61\uBE64\uBE68\uBE6A" - "\uBE70-\uBE71\uBE73-\uBE75\uBE7B-\uBE7D\uBE80\uBE84\uBE8C-\uBE8D" - "\uBE8F-\uBE91\uBE98-\uBE99\uBEA8\uBED0-\uBED1\uBED4\uBED7-\uBED8" - "\uBEE0\uBEE3-\uBEE5\uBEEC\uBF01\uBF08-\uBF09\uBF18-\uBF19\uBF1B-\uBF1D" - "\uBF40-\uBF41\uBF44\uBF48\uBF50-\uBF51\uBF55\uBF94\uBFB0\uBFC5" - "\uBFCC-\uBFCD\uBFD0\uBFD4\uBFDC\uBFDF\uBFE1\uC03C\uC051\uC058" - "\uC05C\uC060\uC068-\uC069\uC090-\uC091\uC094\uC098\uC0A0-\uC0A1" - "\uC0A3\uC0A5\uC0AC-\uC0AD\uC0AF-\uC0B0\uC0B3-\uC0B6\uC0BC-\uC0BD" - "\uC0BF-\uC0C1\uC0C5\uC0C8-\uC0C9\uC0CC\uC0D0\uC0D8-\uC0D9\uC0DB-\uC0DD" - "\uC0E4-\uC0E5\uC0E8\uC0EC\uC0F4-\uC0F5\uC0F7\uC0F9\uC100\uC104" - "\uC108\uC110\uC115\uC11C-\uC120\uC123-\uC124\uC126-\uC127\uC12C-\uC12D" - "\uC12F-\uC131\uC136\uC138-\uC139\uC13C\uC140\uC148-\uC149\uC14B-\uC14D" - "\uC154-\uC155\uC158\uC15C\uC164-\uC165\uC167-\uC169\uC170\uC174" - "\uC178\uC185\uC18C-\uC18E\uC190\uC194\uC196\uC19C-\uC19D\uC19F" - "\uC1A1\uC1A5\uC1A8-\uC1A9\uC1AC\uC1B0\uC1BD\uC1C4\uC1C8\uC1CC" - "\uC1D4\uC1D7-\uC1D8\uC1E0\uC1E4\uC1E8\uC1F0-\uC1F1\uC1F3\uC1FC-\uC1FD" - "\uC200\uC204\uC20C-\uC20D\uC20F\uC211\uC218-\uC219\uC21C\uC21F-\uC220" - "\uC228-\uC229\uC22B\uC22D\uC22F\uC231-\uC232\uC234\uC248\uC250-\uC251" - "\uC254\uC258\uC260\uC265\uC26C-\uC26D\uC270\uC274\uC27C-\uC27D" - "\uC27F\uC281\uC288-\uC289\uC290\uC298\uC29B\uC29D\uC2A4-\uC2A5" - "\uC2A8\uC2AC-\uC2AD\uC2B4-\uC2B5\uC2B7\uC2B9\uC2DC-\uC2DD\uC2E0" - "\uC2E3-\uC2E4\uC2EB-\uC2ED\uC2EF\uC2F1\uC2F6\uC2F8-\uC2F9\uC2FB-\uC2FC" - "\uC300\uC308-\uC309\uC30C-\uC30D\uC313-\uC315\uC318\uC31C\uC324-\uC325" - "\uC328-\uC329\uC345\uC368-\uC369\uC36C\uC370\uC372\uC378-\uC379" - "\uC37C-\uC37D\uC384\uC388\uC38C\uC3C0\uC3D8-\uC3D9\uC3DC\uC3DF-\uC3E0" - "\uC3E2\uC3E8-\uC3E9\uC3ED\uC3F4-\uC3F5\uC3F8\uC408\uC410\uC424" - "\uC42C\uC430\uC434\uC43C-\uC43D\uC448\uC464-\uC465\uC468\uC46C" - "\uC474-\uC475\uC479\uC480\uC494\uC49C\uC4B8\uC4BC\uC4E9\uC4F0-\uC4F1" - "\uC4F4\uC4F8\uC4FA\uC4FF-\uC501\uC50C\uC510\uC514\uC51C\uC528-\uC529" - "\uC52C\uC530\uC538-\uC539\uC53B\uC53D\uC544-\uC545\uC548-\uC54A" - "\uC54C-\uC54E\uC553-\uC555\uC557-\uC559\uC55D-\uC55E\uC560-\uC561" - "\uC564\uC568\uC570-\uC571\uC573-\uC575\uC57C-\uC57D\uC580\uC584" - "\uC587\uC58C-\uC58D\uC58F\uC591\uC595\uC597-\uC598\uC59C\uC5A0" - "\uC5A9\uC5B4-\uC5B5\uC5B8-\uC5B9\uC5BB-\uC5BE\uC5C4-\uC5CA\uC5CC" - "\uC5CE\uC5D0-\uC5D1\uC5D4\uC5D8\uC5E0-\uC5E1\uC5E3\uC5E5\uC5EC-\uC5EE" - "\uC5F0\uC5F4\uC5F6-\uC5F7\uC5FC-\uC601\uC605-\uC608\uC60C\uC610" - "\uC618-\uC619\uC61B-\uC61C\uC624-\uC625\uC628\uC62C-\uC62E\uC630" - "\uC633-\uC635\uC637\uC639\uC63B\uC640-\uC641\uC644\uC648\uC650-\uC651" - "\uC653-\uC655\uC65C-\uC65D\uC660\uC66C\uC66F\uC671\uC678-\uC679" - "\uC67C\uC680\uC688-\uC689\uC68B\uC68D\uC694-\uC695\uC698\uC69C" - "\uC6A4-\uC6A5\uC6A7\uC6A9\uC6B0-\uC6B1\uC6B4\uC6B8-\uC6BA\uC6C0-\uC6C1" - "\uC6C3\uC6C5\uC6CC-\uC6CD\uC6D0\uC6D4\uC6DC-\uC6DD\uC6E0-\uC6E1" - "\uC6E8-\uC6E9\uC6EC\uC6F0\uC6F8-\uC6F9\uC6FD\uC704-\uC705\uC708" - "\uC70C\uC714-\uC715\uC717\uC719\uC720-\uC721\uC724\uC728\uC730-\uC731" - "\uC733\uC735\uC737\uC73C-\uC73D\uC740\uC744\uC74A\uC74C-\uC74D" - "\uC74F\uC751-\uC758\uC75C\uC760\uC768\uC76B\uC774-\uC775\uC778" - "\uC77C-\uC77E\uC783-\uC785\uC787-\uC78A\uC78E\uC790-\uC791\uC794" - "\uC796-\uC798\uC79A\uC7A0-\uC7A1\uC7A3-\uC7A6\uC7AC-\uC7AD\uC7B0" - "\uC7B4\uC7BC-\uC7BD\uC7BF-\uC7C1\uC7C8-\uC7C9\uC7CC\uC7CE\uC7D0" - "\uC7D8\uC7DD\uC7E4\uC7E8\uC7EC\uC800-\uC801\uC804\uC808\uC80A" - "\uC810-\uC811\uC813\uC815-\uC816\uC81C-\uC81D\uC820\uC824\uC82C-\uC82D" - "\uC82F\uC831\uC838\uC83C\uC840\uC848-\uC849\uC84C-\uC84D\uC854" - "\uC870-\uC871\uC874\uC878\uC87A\uC880-\uC881\uC883\uC885-\uC887" - "\uC88B-\uC88D\uC894\uC89D\uC89F\uC8A1\uC8A8\uC8BC-\uC8BD\uC8C4" - "\uC8C8\uC8CC\uC8D4-\uC8D5\uC8D7\uC8D9\uC8E0-\uC8E1\uC8E4\uC8F5" - "\uC8FC-\uC8FD\uC900\uC904-\uC906\uC90C-\uC90D\uC90F\uC911\uC918" - "\uC92C\uC934\uC950-\uC951\uC954\uC958\uC960-\uC961\uC963\uC96C" - "\uC970\uC974\uC97C\uC988-\uC989\uC98C\uC990\uC998-\uC999\uC99B" - "\uC99D\uC9C0-\uC9C1\uC9C4\uC9C7-\uC9C8\uC9CA\uC9D0-\uC9D1\uC9D3" - "\uC9D5-\uC9D6\uC9D9-\uC9DA\uC9DC-\uC9DD\uC9E0\uC9E2\uC9E4\uC9E7" - "\uC9EC-\uC9ED\uC9EF-\uC9F1\uC9F8-\uC9F9\uC9FC\uCA00\uCA08-\uCA09" - "\uCA0B-\uCA0D\uCA14\uCA18\uCA29\uCA4C-\uCA4D\uCA50\uCA54\uCA5C-\uCA5D" - "\uCA5F-\uCA61\uCA68\uCA7D\uCA84\uCA98\uCABC-\uCABD\uCAC0\uCAC4" - "\uCACC-\uCACD\uCACF\uCAD1\uCAD3\uCAD8-\uCAD9\uCAE0\uCAEC\uCAF4" - "\uCB08\uCB10\uCB14\uCB18\uCB20-\uCB21\uCB41\uCB48-\uCB49\uCB4C" - "\uCB50\uCB58-\uCB59\uCB5D\uCB64\uCB78-\uCB79\uCB9C\uCBB8\uCBD4" - "\uCBE4\uCBE7\uCBE9\uCC0C-\uCC0D\uCC10\uCC14\uCC1C-\uCC1D\uCC21-\uCC22" - "\uCC27-\uCC29\uCC2C\uCC2E\uCC30\uCC38-\uCC39\uCC3B-\uCC3E\uCC44-\uCC45" - "\uCC48\uCC4C\uCC54-\uCC55\uCC57-\uCC59\uCC60\uCC64\uCC66\uCC68" - "\uCC70\uCC75\uCC98-\uCC99\uCC9C\uCCA0\uCCA8-\uCCA9\uCCAB-\uCCAD" - "\uCCB4-\uCCB5\uCCB8\uCCBC\uCCC4-\uCCC5\uCCC7\uCCC9\uCCD0\uCCD4" - "\uCCE4\uCCEC\uCCF0\uCD01\uCD08-\uCD09\uCD0C\uCD10\uCD18-\uCD19" - "\uCD1B\uCD1D\uCD24\uCD28\uCD2C\uCD39\uCD5C\uCD60\uCD64\uCD6C-\uCD6D" - "\uCD6F\uCD71\uCD78\uCD88\uCD94-\uCD95\uCD98\uCD9C\uCDA4-\uCDA5" - "\uCDA7\uCDA9\uCDB0\uCDC4\uCDCC\uCDD0\uCDE8\uCDEC\uCDF0\uCDF8-\uCDF9" - "\uCDFB\uCDFD\uCE04\uCE08\uCE0C\uCE14\uCE19\uCE20-\uCE21\uCE24" - "\uCE28\uCE30-\uCE31\uCE33\uCE35\uCE58-\uCE59\uCE5C\uCE5F-\uCE61" - "\uCE68-\uCE69\uCE6B\uCE6D\uCE74-\uCE75\uCE78\uCE7C\uCE84-\uCE85" - "\uCE87\uCE89\uCE90-\uCE91\uCE94\uCE98\uCEA0-\uCEA1\uCEA3-\uCEA5" - "\uCEAC-\uCEAD\uCEC1\uCEE4-\uCEE5\uCEE8\uCEEB-\uCEEC\uCEF4-\uCEF5" - "\uCEF7-\uCEF9\uCF00-\uCF01\uCF04\uCF08\uCF10-\uCF11\uCF13\uCF15" - "\uCF1C\uCF20\uCF24\uCF2C-\uCF2D\uCF2F-\uCF31\uCF38\uCF54-\uCF55" - "\uCF58\uCF5C\uCF64-\uCF65\uCF67\uCF69\uCF70-\uCF71\uCF74\uCF78" - "\uCF80\uCF85\uCF8C\uCFA1\uCFA8\uCFB0\uCFC4\uCFE0-\uCFE1\uCFE4" - "\uCFE8\uCFF0-\uCFF1\uCFF3\uCFF5\uCFFC\uD000\uD004\uD011\uD018" - "\uD02D\uD034-\uD035\uD038\uD03C\uD044-\uD045\uD047\uD049\uD050" - "\uD054\uD058\uD060\uD06C-\uD06D\uD070\uD074\uD07C-\uD07D\uD081" - "\uD0A4-\uD0A5\uD0A8\uD0AC\uD0B4-\uD0B5\uD0B7\uD0B9\uD0C0-\uD0C1" - "\uD0C4\uD0C8-\uD0C9\uD0D0-\uD0D1\uD0D3-\uD0D5\uD0DC-\uD0DD\uD0E0" - "\uD0E4\uD0EC-\uD0ED\uD0EF-\uD0F1\uD0F8\uD10D\uD130-\uD131\uD134" - "\uD138\uD13A\uD140-\uD141\uD143-\uD145\uD14C-\uD14D\uD150\uD154" - "\uD15C-\uD15D\uD15F\uD161\uD168\uD16C\uD17C\uD184\uD188\uD1A0-\uD1A1" - "\uD1A4\uD1A8\uD1B0-\uD1B1\uD1B3\uD1B5\uD1BA\uD1BC\uD1C0\uD1D8" - "\uD1F4\uD1F8\uD207\uD209\uD210\uD22C-\uD22D\uD230\uD234\uD23C-\uD23D" - "\uD23F\uD241\uD248\uD25C\uD264\uD280-\uD281\uD284\uD288\uD290-\uD291" - "\uD295\uD29C\uD2A0\uD2A4\uD2AC\uD2B1\uD2B8-\uD2B9\uD2BC\uD2BF-\uD2C0" - "\uD2C2\uD2C8-\uD2C9\uD2CB\uD2D4\uD2D8\uD2DC\uD2E4-\uD2E5\uD2F0-\uD2F1" - "\uD2F4\uD2F8\uD300-\uD301\uD303\uD305\uD30C-\uD30E\uD310\uD314" - "\uD316\uD31C-\uD31D\uD31F-\uD321\uD325\uD328-\uD329\uD32C\uD330" - "\uD338-\uD339\uD33B-\uD33D\uD344-\uD345\uD37C-\uD37D\uD380\uD384" - "\uD38C-\uD38D\uD38F-\uD391\uD398-\uD399\uD39C\uD3A0\uD3A8-\uD3A9" - "\uD3AB\uD3AD\uD3B4\uD3B8\uD3BC\uD3C4-\uD3C5\uD3C8-\uD3C9\uD3D0" - "\uD3D8\uD3E1\uD3E3\uD3EC-\uD3ED\uD3F0\uD3F4\uD3FC-\uD3FD\uD3FF" - "\uD401\uD408\uD41D\uD440\uD444\uD45C\uD460\uD464\uD46D\uD46F" - "\uD478-\uD479\uD47C\uD47F-\uD480\uD482\uD488-\uD489\uD48B\uD48D" - "\uD494\uD4A9\uD4CC\uD4D0\uD4D4\uD4DC\uD4DF\uD4E8\uD4EC\uD4F0" - "\uD4F8\uD4FB\uD4FD\uD504\uD508\uD50C\uD514-\uD515\uD517\uD53C-\uD53D" - "\uD540\uD544\uD54C-\uD54D\uD54F\uD551\uD558-\uD559\uD55C\uD560" - "\uD565\uD568-\uD569\uD56B\uD56D\uD574-\uD575\uD578\uD57C\uD584-\uD585" - "\uD587-\uD589\uD590\uD5A5\uD5C8-\uD5C9\uD5CC\uD5D0\uD5D2\uD5D8-\uD5D9" - "\uD5DB\uD5DD\uD5E4-\uD5E5\uD5E8\uD5EC\uD5F4-\uD5F5\uD5F7\uD5F9" - "\uD600-\uD601\uD604\uD608\uD610-\uD611\uD613-\uD615\uD61C\uD620" - "\uD624\uD62D\uD638-\uD639\uD63C\uD640\uD645\uD648-\uD649\uD64B" - "\uD64D\uD651\uD654-\uD655\uD658\uD65C\uD667\uD669\uD670-\uD671" - "\uD674\uD683\uD685\uD68C-\uD68D\uD690\uD694\uD69D\uD69F\uD6A1" - "\uD6A8\uD6AC\uD6B0\uD6B9\uD6BB\uD6C4-\uD6C5\uD6C8\uD6CC\uD6D1" - "\uD6D4\uD6D7\uD6D9\uD6E0\uD6E4\uD6E8\uD6F0\uD6F5\uD6FC-\uD6FD" - "\uD700\uD704\uD711\uD718-\uD719\uD71C\uD720\uD728-\uD729\uD72B" - "\uD72D\uD734-\uD735\uD738\uD73C\uD744\uD747\uD749\uD750-\uD751" - "\uD754\uD756-\uD759\uD760-\uD761\uD763\uD765\uD769\uD76C\uD770" - "\uD774\uD77C-\uD77D\uD781\uD788-\uD789\uD78C\uD790\uD798-\uD799" - "\uD79B\uD79D]]" - - - - - - "&\uac00<<\u4f3d<<\u4f73<<\u5047<<\u50f9<<\u52a0<<\u53ef<<\u5475" - "<<\u54e5<<\u5609<<\u5ac1<<\u5bb6<<\u6687<<\u67b6<<\u67b7<<\u67ef" - "<<\u6b4c<<\u73c2<<\u75c2<<\u7a3c<<\u82db<<\u8304<<\u8857<<\u8888" - "<<\u8a36<<\u8cc8<<\u8dcf<<\u8efb<<\u8fe6<<\u99d5" - "<<\u4EEE<<\u50A2<<\u5496<<\u54FF<<\u5777<<\u5B8A<<\u659D<<\u698E" - "<<\u6A9F<<\u73C8<<\u7B33<<\u801E<<\u8238<<\u846D<<\u8B0C" - - "&\uac01<<\u523b<<\u5374<<\u5404<<\u606a<<\u6164<<\u6bbc<<\u73cf" - "<<\u811a<<\u89ba<<\u89d2<<\u95a3" - "<<\u537B<<\u54AF<<\u57C6<<\u6409<<\u64F1<<\u6877" - - "&\uac04<<\u4f83<<\u520a<<\u58be<<\u5978<<\u59e6<<\u5e72<<\u5e79" - "<<\u61c7<<\u63c0<<\u6746<<\u67ec<<\u687f<<\u6f97<<\u764e<<\u770b" - "<<\u78f5<<\u7a08<<\u7aff<<\u7c21<<\u809d<<\u826e<<\u8271<<\u8aeb<<\u9593" - "<<\u5058<<\u6173<<\u681E<<\u69A6<<\u7395<<\u79C6<<\u831B<<\u884E<<\u8D76<<\u8FC0<<\u9F66" - - "&\uac08<<\u4e6b<<\u559d<<\u66f7<<\u6e34<<\u78a3<<\u7aed<<\u845b" - "<<\u8910<<\u874e<<\u97a8" - "<<\u5676<<\u696C<<\u79F8<<\u7FAF<<\u880D<<\u9DA1" - - "&\uac10<<\u52d8<<\u574e<<\u582a<<\u5d4c<<\u611f<<\u61be<<\u6221" - "<<\u6562<<\u67d1<<\u6a44<<\u6e1b<<\u7518<<\u75b3<<\u76e3<<\u77b0" - "<<\u7d3a<<\u90af<<\u9451<<\u9452<<\u9f95" - "<<\u5769<<\u57F3<<\u5D41<<\u5F07<<\u61A8<<\u64BC<<\u6B3F<<\u6B5B" - "<<\u6CD4<<\u6DE6<<\u6F89<<\u77D9<<\u8F57<<\u9163<<\u9E7B" - - "&\uac11<<\u5323<<\u5cac<<\u7532<<\u80db<<\u9240<<\u9598" - "<<\u97D0" - - "&\uac15<<\u525b<<\u5808<<\u59dc<<\u5ca1<<\u5d17<<\u5eb7<<\u5f3a" - "<<\u5f4a<<\u6177<<\u6c5f<<\u757a<<\u7586<<\u7ce0<<\u7d73<<\u7db1" - "<<\u7f8c<<\u8154<<\u8221<<\u8591<<\u8941<<\u8b1b<<\u92fc<<\u964d<<\u9c47" - "<<\u508B<<\u50F5<<\u58C3<<\u5FFC<<\u625B<<\u6760<<\u6A7F<<\u6BAD" - "<<\u77FC<<\u7A45<<\u7E48<<\u7F61<<\u7F97<<\u7FAB<<\u8333<<\u8C47<<\u97C1" - - "&\uac1c<<\u4ecb<<\u4ef7<<\u500b<<\u51f1<<\u584f<<\u6137<<\u613e" - "<<\u6168<<\u6539<<\u69ea<<\u6f11<<\u75a5<<\u7686<<\u76d6<<\u7b87" - "<<\u82a5<<\u84cb<<\u93a7<<\u958b" - "<<\u5274<<\u5303<<\u63E9<<\u69E9<<\u73A0<<\u78D5<<\u95D3" - - "&\uac1d<<\u5580<<\u5ba2" - - "&\uac31<<\u5751<<\u7cb3<<\u7fb9" - "<<\u785C<<\u8CE1<<\u93D7" - - "&\uac39<<\u91b5" - "&\uac70<<\u5028<<\u53bb<<\u5c45<<\u5de8<<\u62d2<<\u636e<<\u64da" - "<<\u64e7<<\u6e20<<\u70ac<<\u795b<<\u8ddd<<\u8e1e<<\u907d<<\u9245<<\u92f8" - "<<\u547F<<\u661B<<\u79EC<<\u7B65<<\u7C67<<\u80E0<<\u8152<<\u82E3" - "<<\u8392<<\u8556<<\u8627<<\u88AA<<\u88FE<<\u99CF" - - "&\uac74<<\u4e7e<<\u4ef6<<\u5065<<\u5dfe<<\u5efa<<\u6106<<\u6957" - "<<\u8171<<\u8654<<\u8e47<<\u9375<<\u9a2b" - "<<\u63F5<<\u728D<<\u7777<<\u8930<<\u8B07<<\u97AC" - - "&\uac78<<\u4e5e<<\u5091<<\u6770<<\u6840" - "<<\u4E6C<<\u6705<<\u69A4" - - "&\uac80<<\u5109<<\u528d<<\u5292<<\u6aa2<<\u77bc<<\u9210<<\u9ed4" - "<<\u64BF<<\u82A1" - - "&\uac81<<\u52ab<<\u602f<<\u8ff2" - "<<\u5226<<\u5227" - - "&\uac8c<<\u5048<<\u61a9<<\u63ed" - - "&\uaca9<<\u64ca<<\u683c<<\u6a84<<\u6fc0<<\u8188<<\u89a1<<\u9694" - "<<\u630C<<\u6BC4<<\u95C3<<\u9ABC<<\u9B32<<\u9D03" - - "&\uacac<<\u5805<<\u727d<<\u72ac<<\u7504<<\u7d79<<\u7e6d<<\u80a9" - "<<\u898b<<\u8b74<<\u9063<<\u9d51" - "<<\u6A2B<<\u72F7<<\u754E<<\u7B67<<\u7E33<<\u7E7E<<\u7F82<<\u8832<<\u9C39" - - "&\uacb0<<\u6289<<\u6c7a<<\u6f54<<\u7d50<<\u7f3a<<\u8a23" - "<<\u73A6<<\u89D6<<\u95CB" - - "&\uacb8<<\u517c<<\u614a<<\u7b9d<<\u8b19<<\u9257<<\u938c" - "<<\u5094<<\u55DB<<\u5C92<<\u62D1<<\u6B49<<\u7E11<<\u84B9<<\u9EDA<<\u9F38" - - "&\uacbd<<\u4eac<<\u4fd3<<\u501e<<\u50be<<\u5106<<\u52c1<<\u52cd" - "<<\u537f<<\u5770<<\u5883<<\u5e9a<<\u5f91<<\u6176<<\u61ac<<\u64ce" - "<<\u656c<<\u666f<<\u66bb<<\u66f4<<\u6897<<\u6d87<<\u7085<<\u70f1" - "<<\u749f<<\u74a5<<\u74ca<<\u75d9<<\u786c<<\u78ec<<\u7adf<<\u7af6" - "<<\u7d45<<\u7d93<<\u8015<<\u803f<<\u811b<<\u8396<<\u8b66<<\u8f15" - "<<\u9015<<\u93e1<<\u9803<<\u9838<<\u9a5a<<\u9be8" - "<<\u518F<<\u5244<<\u54FD<<\u60F8<<\u61BC<<\u6243<<\u6AA0<<\u7162<<\u712D<<\u71B2" - "<<\u754A<<\u7AF8<<\u7D86<<\u9848<<\u7F44<<\u8927<<\u8B26<<\u99C9<<\u9BC1<<\u9EE5" - - "&\uacc4<<\u4fc2<<\u5553<<\u583a<<\u5951<<\u5b63<<\u5c46<<\u60b8" - "<<\u6212<<\u6842<<\u68b0<<\u68e8<<\u6eaa<<\u754c<<\u7678<<\u78ce" - "<<\u7a3d<<\u7cfb<<\u7e6b<<\u7e7c<<\u8a08<<\u8aa1<<\u8c3f<<\u968e<<\u9dc4" - "<<\u5826<<\u70D3<<\u7608<<\u798A<<\u7B53<<\u7DAE<<\u7E18<<\u7F7D<<\u846A<<\u858A<<\u96DE<<\u9AFB" - - "&\uace0<<\u53e4<<\u53e9<<\u544a<<\u5471<<\u56fa<<\u59d1<<\u5b64" - "<<\u5c3b<<\u5eab<<\u62f7<<\u6537<<\u6545<<\u6572<<\u66a0<<\u67af" - "<<\u69c1<<\u6cbd<<\u75fc<<\u7690<<\u777e<<\u7a3f<<\u7f94<<\u8003" - "<<\u80a1<<\u818f<<\u82e6<<\u82fd<<\u83f0<<\u85c1<<\u8831<<\u88b4" - "<<\u8aa5<<\u8f9c<<\u932e<<\u96c7<<\u9867<<\u9ad8<<\u9f13" - "<<\u4F30<<\u51C5<<\u5233<<\u5859<<\u6772<<\u6832<<\u69C0<<\u69F9<<\u6ADC<<\u726F<<\u768B" - "<<\u76EC<<\u77BD<<\u7A01<<\u7B8D<<\u7BD9<<\u7CD5<<\u7F5F<<\u7F96<<\u7FFA<<\u80EF<<\u89DA" - "<<\u8A41<<\u90DC<<\u9164<<\u9237<<\u9760<<\u9D23<<\u9DF1" - - "&\uace1<<\u54ed<<\u659b<<\u66f2<<\u688f<<\u7a40<<\u8c37<<\u9d60" - "<<\u56B3<<\u69F2<<\u7E20<<\u89F3<<\u8F42" - - "&\uace4<<\u56f0<<\u5764<<\u5d11<<\u6606<<\u68b1<<\u68cd<<\u6efe" - "<<\u7428<<\u889e<<\u9be4" - "<<\u5803<<\u5D10<<\u6083<<\u6346<<\u7DC4<<\u886E<<\u88CD<<\u890C<<\u9315" - "<<\u95AB<<\u9AE1<<\u9D7E<<\u9DA4<<\u9F6B" - - "&\uace8<<\u6c68<<\u9aa8" - "<<\u6430<<\u69BE<<\u77FB<<\u9DBB" - - "&\uacf5<<\u4f9b<<\u516c<<\u5171<<\u529f<<\u5b54<<\u5de5<<\u6050 " - "<<\u606d<<\u62f1<<\u63a7<<\u653b<<\u73d9<<\u7a7a<<\u86a3<<\u8ca2<<\u978f" - "<<\u5025<<\u5D06<<\u60BE<<\u6831<<\u69D3<<\u7B9C<<\u86E9<<\u86EC<<\u8D1B<<\u8DEB<<\u91ED<<\u9F94" - - "&\uacf6<<\u4e32" - - "&\uacfc<<\u5be1<<\u6208<<\u679c<<\u74dc<<\u79d1<<\u83d3<<\u8a87" - "<<\u8ab2<<\u8de8<<\u904e<<\u934b<<\u9846" - "<<\u4F89<<\u581D<<\u5925<<\u5938<<\u64BE<<\u7313<<\u7A1E<<\u7AA0<<\u874C<<\u88F9<<\u8E1D<<\u9299<<\u9A0D" - - "&\uacfd<<\u5ed3<<\u69e8<<\u85ff<<\u90ed" - "<<\u6901<<\u7668<<\u8EA9<<\u970D<<\u97B9" - - "&\uad00<<\u51a0<<\u5b98<<\u5bec<<\u6163<<\u68fa<<\u6b3e" - "<<\u704c<<\u742f<<\u74d8<<\u7ba1<<\u7f50<<\u83c5<<\u89c0<<\u8cab<<\u95dc<<\u9928" - "<<\u4E31<<\u6DAB<<\u721F<<\u76E5<<\u797C<<\u7ABE<<\u7B66<<\u7DB0<<\u8F28" - "<<\u9327<<\u9475<<\u96DA<<\u9874<<\u9AD6<<\u9E1B" - - "&\uad04<<\u522e<<\u605d<<\u62ec<<\u9002" - "<<\u4F78<<\u681D<<\u7B48<<\u8052<<\u9AFA<<\u9D30" - - "&\uad11<<\u4f8a<<\u5149<<\u5321<<\u58d9<<\u5ee3<<\u66e0<<\u6d38" - "<<\u709a<<\u72c2<<\u73d6<<\u7b50<<\u80f1<<\u945b" - "<<\u6047<<\u6844<<\u6846<<\u720C<<\u7377<<\u78FA<<\u7D56<<\u7E8A<<\u832A<<\u8A86<<\u8A91" - - "&\uad18<<\u5366<<\u639b<<\u7f6b" - "<<\u54BC<<\u6302<<\u7F63<<\u8A7F" - - "&\uad34<<\u4e56<<\u5080<<\u584a<<\u58de<<\u602a<<\u6127<<\u62d0<<\u69d0<<\u9b41" - "<<\u5ABF<<\u5EE5<<\u6060<<\u7470<<\u749D<<\u84AF<<\u8958" - - "&\uad35<<\u9998" - - "&\uad49<<\u5b8f<<\u7d18<<\u80b1<<\u8f5f<<\u6D64<<\u89E5<<\u8A07<<\u958E" - - "&\uad50<<\u4ea4<<\u50d1<<\u54ac<<\u55ac<<\u5b0c<<\u5da0<<\u5de7" - "<<\u652a<<\u654e<<\u6821<<\u6a4b<<\u72e1<<\u768e<<\u77ef<<\u7d5e" - "<<\u7ff9<<\u81a0<<\u854e<<\u86df<<\u8f03<<\u8f4e<<\u90ca<<\u9903<<\u9a55<<\u9bab" - "<<\u4F7C<<\u5604<<\u5610<<\u566D<<\u5699<<\u59E3<<\u618D<<\u649F<<\u6648<<\u669E" - "<<\u69B7<<\u78FD<<\u7A96<<\u8DAB<<\u8E7B<<\u9278<<\u9AB9<<\u9D41<<\u9F69" - - "&\uad6c<<\u4e18<<\u4e45<<\u4e5d<<\u4ec7<<\u4ff1<<\u5177<<\u52fe" - "<<\u5340<<\u53e3<<\u53e5<<\u548e<<\u5614<<\u5775<<\u57a2<<\u5bc7" - "<<\u5d87<<\u5ed0<<\u61fc<<\u62d8<<\u6551<<\u67b8<<\u67e9<<\u69cb" - "<<\u6b50<<\u6bc6<<\u6bec<<\u6c42<<\u6e9d<<\u7078<<\u72d7<<\u7396" - "<<\u7403<<\u77bf<<\u77e9<<\u7a76<<\u7d7f<<\u8009<<\u81fc<<\u8205" - "<<\u820a<<\u82df<<\u8862<<\u8b33<<\u8cfc<<\u8ec0<<\u9011<<\u90b1" - "<<\u9264<<\u92b6<<\u99d2<<\u9a45<<\u9ce9<<\u9dd7<<\u9f9c" - "<<\u4F49<<\u4F5D<<\u4FC5<<\u50B4<<\u5193<<\u52AC<<\u5336<<\u53B9<<\u53F4" - "<<\u5778<<\u59E4<<\u5ABE<<\u5AD7<<\u5C68<<\u5CA3<<\u5F40<<\u6235<<\u6263" - "<<\u6344<<\u6406<<\u6473<<\u662B<<\u6998<<\u6F1A<<\u7486<<\u750C<<\u759A" - "<<\u75C0<<\u766F<<\u7A9B<<\u7AB6<<\u7BDD<<\u7CD7<<\u80CA<<\u849F<<\u86AF" - "<<\u88D8<<\u89AF<<\u8A6C<<\u9058<<\u91E6<<\u97DD<<\u97ED<<\u97EE<<\u98B6<<\u99C8<<\u9B2E<<\u9DC7<<\u9E1C" - - "&\uad6d<<\u570b<<\u5c40<<\u83ca<<\u97a0<<\u97ab<<\u9eb4" - "<<\u530A<<\u63AC<<\u8DFC<<\u9EAF" - - "&\uad70<<\u541b<<\u7a98<<\u7fa4<<\u88d9<<\u8ecd<<\u90e1" - "<<\u6343<<\u687E<<\u76B8" - - "&\uad74<<\u5800<<\u5c48<<\u6398<<\u7a9f" - "<<\u5014<<\u5D1B<<\u6DC8<<\u8A58" - - "&\uad81<<\u5bae<<\u5f13<<\u7a79<<\u7aae<<\u828e<<\u8eac" - "<<\u8EB3" - - "&\uad8c<<\u5026<<\u5238<<\u52f8<<\u5377<<\u5708<<\u62f3<<\u6372" - "<<\u6b0a<<\u6dc3<<\u7737" - "<<\u52CC<<\u60D3<<\u68EC<<\u7760<<\u7DA3<<\u8737" - - "&\uad90<<\u53a5<<\u7357<<\u8568<<\u8e76<<\u95d5" - - "&\uada4<<\u673a<<\u6ac3<<\u6f70<<\u8a6d<<\u8ecc<<\u994b" - "<<\u4F79<<\u51E0<<\u5282<<\u5331<<\u6192<<\u6485<<\u6A3B<<\u6C3F<<\u7C0B<<\u7E62<<\u8DEA<<\u95E0<<\u993D<<\u9E82" - - "&\uadc0<<\u6677<<\u6b78<<\u8cb4<<\u9b3c" - - "&\uaddc<<\u53eb<<\u572d<<\u594e<<\u63c6<<\u69fb<<\u73ea<<\u7845" - "<<\u7aba<<\u7ac5<<\u7cfe<<\u8475<<\u898f<<\u8d73<<\u9035<<\u95a8" - "<<\u5232<<\u5AE2<<\u5B00<<\u5DCB<<\u668C<<\u694F<<\u6A1B<<\u6F59<<\u777D" - "<<\u7CFA<<\u866C<<\u866F<<\u8DEC<<\u90BD<<\u95DA<<\u980D<<\u9997" - - "&\uade0<<\u52fb<<\u5747<<\u7547<<\u7b60<<\u83cc<<\u921e" - "<<\u56F7<<\u9E8F" - - "&\uade4<<\u6a58" - - "&\uadf9<<\u514b<<\u524b<<\u5287<<\u621f<<\u68d8<<\u6975<<\u9699" - "<<\u4E9F<<\u5C05<<\u5C50<<\u90C4" - - "&\uadfc<<\u50c5<<\u52a4<<\u52e4<<\u61c3<<\u65a4<<\u6839<<\u69ff" - "<<\u747e<<\u7b4b<<\u82b9<<\u83eb<<\u89b2<<\u8b39<<\u8fd1<<\u9949" - "<<\u537A<<\u53AA<<\u5890<<\u5DF9<<\u5ED1<<\u6F0C<<\u89D4<<\u8DDF<<\u91FF<<\u9773" - - "&\uae08<<\u4eca<<\u5997<<\u64d2<<\u6611<<\u6a8e<<\u7434<<\u7981" - "<<\u79bd<<\u82a9<<\u887e<<\u887f<<\u895f<<\u9326" - "<<\u552B<<\u5664<<\u5D94<<\u7B12<<\u9EC5" - - "&\uae09<<\u4f0b<<\u53ca<<\u6025<<\u6271<<\u6c72<<\u7d1a<<\u7d66" - "<<\u573E<<\u5C8C<<\u7680<<\u790F<<\u7B08<<\u82A8" - - "&\uae0d<<\u4e98<<\u5162<<\u77dc<<\u80af" - "<<\u4E99<<\u6B91" - - "&\uae30<<\u4f01<<\u4f0e<<\u5176<<\u5180<<\u55dc<<\u5668<<\u573b" - "<<\u57fa<<\u57fc<<\u5914<<\u5947<<\u5993<<\u5bc4<<\u5c90<<\u5d0e" - "<<\u5df1<<\u5e7e<<\u5fcc<<\u6280<<\u65d7<<\u65e3<<\u671e<<\u671f" - "<<\u675e<<\u68cb<<\u68c4<<\u6a5f<<\u6b3a<<\u6c23<<\u6c7d<<\u6c82" - "<<\u6dc7<<\u7398<<\u7426<<\u742a<<\u7482<<\u74a3<<\u7578<<\u757f" - "<<\u7881<<\u78ef<<\u7941<<\u7947<<\u7948<<\u797a<<\u7b95<<\u7d00" - "<<\u7dba<<\u7f88<<\u8006<<\u802d<<\u808c<<\u8a18<<\u8b4f<<\u8c48" - "<<\u8d77<<\u9321<<\u9324<<\u98e2<<\u9951<<\u9a0e<<\u9a0f<<\u9a65<<\u9e92" - "<<\u50DB<<\u525E<<\u588D<<\u5C7A<<\u5E8B<<\u5F03<<\u5FEE<<\u612D<<\u638E" - "<<\u6532<<\u65C2<<\u66A3<<\u66C1<<\u68CA<<\u6B67<<\u7081<<\u7309<<\u79A8" - "<<\u7DA5<<\u7DA6<<\u7F87<<\u80B5<<\u82AA<<\u82B0<<\u8604<<\u8641<<\u871D" - "<<\u87E3<<\u8989<<\u89AC<<\u8DC2<<\u9691<<\u980E<<\u9B10<<\u9C2D<<\u9ED6" - - "&\uae34<<\u7dca" - - "&\uae38<<\u4f76<<\u5409<<\u62ee<<\u6854" - "<<\u59DE<<\u86E3" - - "&\uae40<<\u91d1" - - "&\ub07d<<\u55ab" - - "&\ub098<<\u513a<<\u5a1c<<\u61e6<<\u62cf" - "<<\u62ff<<\u90a3" - "<<\u6310<<\u632A<<\u689B<<\u7CE5<<\u7CEF" - - "&\ub099<<\u8afe" - - "&\ub09c<<\u6696<<\u7156<<\u96e3<<" - "\u5044<<\u7157<<\u8D67<<\u992A" - - "&\ub0a0<<\u634f<<\u637a" - - "&\ub0a8<<\u5357<<\u678f<<\u6960<<\u6e73<<\u7537<<" - "\u5583<<\u67DF" - - "&\ub0a9<<\u7d0d<<\u8872" - - "&\ub0ad<<\u56ca<<\u5a18<<" - "\u66E9" - - "&\ub0b4<<\u4e43<<\u5167<<\u5948<<\u67f0<<\u8010" - "<<\u5302<<\u5976<<\u5B2D<<\u8FFA<<\u9F10" - - "&\ub140<<\u5973" - - "&\ub141<<\u60C4" - - "&\ub144<<\u5e74<<\u649a<<\u79ca" - "<<\u78BE" - - "&\ub150<<\u5ff5<<\u606c<<\u62c8<<\u637b" - - "&\ub155<<\u5be7<<\u5bd7" - "<<\u4F5E<<\u511C<<\u5680<<\u6FD8" - - "&\ub178<<\u52aa<<\u5974<<\u5f29<<\u6012<<" - "\u7459<<" - "\u99d1<<" - "\u5476<<\u5B65<<\u5CF1<<\u7331<<\u7B2F<<\u81D1" - - "&\ub18d<<\u6fc3<<\u81bf<<\u8fb2" - "<<\u5102<<\u5665<<\u7A60<<\u91B2" - - "&\ub1cc<<\u60f1<<\u8166<<" - "\u9912" - - "&\ub1e8<<\u5c3f" - "<<\u5ACB<<\u5B32<<\u6DD6<<\u78E0<<\u88CA<<\u9403" - - "&\ub204<<\u5542<<\u8028" - - "&\ub208<<\u5ae9" - - "&\ub20c<<\u8a25" - "<<\u5436<<\u80AD" - - "&\ub274<<\u677b<<\u7d10" - "<<\u5FF8<<\u9775" - - "&\ub275<<\u8844" - - "&\ub2a5<<\u80fd" - - "&\ub2c8<<\u5c3c<<\u6ce5" - "<<\u5462<<\u6029<<\u67C5<<\u7962<<\u79B0<<\u81A9" - - "&\ub2c9<<\u533f<<\u6eba" - "<<\u6635<<\u66B1" - - "&\ub2e4<<\u591a<<\u8336" - "<<\u7239" - - "&\ub2e8<<\u4e39<<\u4eb6<<\u4f46<<\u55ae<<\u5718<<\u58c7<<\u5f56" - "<<\u65b7<<\u65e6<<\u6a80<<\u6bb5<<\u6e4d<<\u77ed<<\u7aef<<\u7c1e" - "<<\u7dde<<\u86cb<<\u8892<<\u9132<<\u935b" - "<<\u6171<<\u62C5<<\u6934<<\u6F19<<\u7649<<\u8011<<\u80C6<<\u8176<<\u8711" - - "&\ub2ec<<\u64bb<<\u6fbe<<\u737a<<\u75b8<<\u9054" - "<<\u59B2<<\u601B<<\u95E5<<\u977C<<\u97C3" - - "&\ub2f4<<\u5556<<\u574d<<\u61ba<<\u64d4<<\u66c7<<\u6de1<<\u6e5b" - "<<\u6f6d<<\u6fb9<<\u75f0<<\u8043<<\u81bd<<\u8541<<\u8983<<\u8ac7<<\u8b5a<<\u931f" - "<<\u510B<<\u5557<<\u5649<<\u58B0<<\u58DC<<\u6BEF<<\u79AB<<\u7F4E<<\u859D<<\u90EF<<\u9EEE<<\u9EF5" - - "&\ub2f5<<\u6c93<<\u7553<<\u7b54<<\u8e0f<<\u905d" - - "&\ub2f9<<\u5510<<\u5802<<\u5858<<\u5e62<<\u6207<<\u649e<<\u68e0" - "<<\u7576<<\u7cd6<<\u87b3<<\u9ee8" - "<<\u5018<<\u513B<<\u515A<<\u642A<<\u6A94<<\u6E8F<<\u746D<<\u74AB<<\u77A0<<\u7911<<\u87F7<<\u8960" - "<<\u8B9C<<\u93DC<<\u943A<<\u9933<<\u9939" - - "&\ub300<<\u4ee3<<\u5788<<\u576e<<\u5927<<\u5c0d<<\u5cb1<<\u5e36" - "<<\u5f85<<\u6234<<\u64e1<<\u73b3<<\u81fa<<\u888b<<\u8cb8<<\u968a<<\u9edb" - "<<\u5113<<\u61DF<<\u65F2<<\u6C4F<<\u7893<<\u9413" - - "&\ub301<<\u5b85" - - "&\ub355<<\u5fb7<<\u60b3" - - "&\ub3c4<<\u5012<<\u5200<<\u5230<<\u5716<<\u5835<<\u5857<<\u5c0e" - "<<\u5c60<<\u5cf6<<\u5d8b<<\u5ea6<<\u5f92<<\u60bc<<\u6311<<\u6389" - "<<\u6417<<\u6843<<\u68f9<<\u6ac2<<\u6dd8<<\u6e21<<\u6ed4<<\u6fe4" - "<<\u71fe<<\u76dc<<\u7779<<\u79b1<<\u7a3b<<\u8404<<\u89a9<<\u8ced" - "<<\u8df3<<\u8e48<<\u9003<<\u9014<<\u9053<<\u90fd<<\u934d<<\u9676<<\u97dc" - "<<\u53E8<<\u58D4<<\u5F22<<\u5FC9<<\u6146<<\u638F<<\u642F<<\u64E3<<\u6AAE" - "<<\u6D2E<<\u6D82<<\u7A0C<<\u83DF<<\u9174<<\u95CD<<\u9780<<\u97B1<<\u9955<<\u9F17" - - "&\ub3c5<<\u6bd2<<\u7006<<\u7258<<\u72a2<<\u7368<<\u7763<<\u79bf" - "<<\u7be4<<\u7e9b<<\u8b80" - "<<\u6ADD<<\u9EF7" - - "&\ub3c8<<\u58a9<<\u60c7<<\u6566<<\u65fd<<\u66be<<\u6c8c<<\u711e" - "<<\u71c9<<\u8c5a<<\u9813" - "<<\u5F34<<\u6F61<<\u8E89" - - "&\ub3cc<<\u4e6d<<\u7a81" - "<<\u5484<<\u5817" - - "&\ub3d9<<\u4edd<<\u51ac<<\u51cd<<\u52d5<<\u540c<<\u61a7<<\u6771" - "<<\u6850<<\u68df<<\u6d1e<<\u6f7c<<\u75bc<<\u77b3<<\u7ae5<<\u80f4" - "<<\u8463<<\u9285" - "<<\u4F97<<\u50EE<<\u54C3<<\u578C<<\u5CD2<<\u5F64<<\u6723<<\u6A66<<\u6DB7" - "<<\u825F<<\u82F3<<\u833C<<\u856B<<\u8740<<\u932C<<\u9B97" - - "&\ub450<<\u515c<<\u6597<<\u675c<<\u6793<<\u75d8<<\u7ac7<<\u8373" - "<<\u8c46<<\u9017<<\u982d" - "<<\u6296<<\u6581<<\u809A<<\u8130<<\u86AA<<\u8839<<\u9661" - - "&\ub454<<\u5c6f<<\u81c0<<\u829a<<\u9041<<\u906f<<\u920d" - "<<\u7A80<<\u8FCD" - - "&\ub458<<\u4E67" - - "&\ub4dd<<\u5f97" - - "&\ub4f1<<\u5d9d<<\u6a59<<\u71c8<<\u767b<<\u7b49<<\u85e4<<\u8b04" - "<<\u9127<<\u9a30" - "<<\u51F3<<\u58B1<<\u6ED5<<\u78F4<<\u7C50<<\u7E22<<\u87A3<<\u9419" - - "&\ub77c<<\u5587<<\u61f6<<\u7669<<\u7f85<<\u863f<<\u87ba<<\u88f8<<\u908f" - "<<\u502E<<\u56C9<<\u66EA<<\u7630<<\u7822<<\u81DD<<\u947C<<\u9A3E<<\u9A58" - - "&\ub77d<<\u6d1b<<\u70d9<<\u73de<<\u7d61<<\u843d<<\u916a<<\u99f1" - "<<\u55E0<<\u7296" - - "&\ub780<<\u4e82<<\u5375<<\u6b04<<\u6b12<<\u703e<<\u721b<<\u862d<<\u9e1e" - "<<\u5B3E<<\u5E71<<\u6514<<\u7053<<\u8974<<\u947E<<\u95CC" - - "&\ub784<<\u524c<<\u8fa3" - "<<\u57D2<<\u8FA2" - - "&\ub78c<<\u5d50<<\u64e5<<\u652c<<\u6b16<<\u6feb<<\u7c43<<\u7e9c" - "<<\u85cd<<\u8964<<\u89bd" - "<<\u5A6A<<\u60CF" - - "&\ub78d<<\u62c9<<\u81d8<<\u881f" - "<<\u945E" - - "&\ub791<<\u5eca<<\u6717<<\u6d6a<<\u72fc<<\u7405<<\u746f<<\u8782<<\u90de" - "<<\u6994<<\u7860<<\u7A02<<\u83A8<<\u870B<<\u95AC" - - "&\ub798<<\u4f86<<\u5d0d<<\u5fa0<<\u840a" - "<<\u6DF6<<\u9A0B" - - "&\ub7ad<<\u51b7" - - "&\ub7b5<<\u63a0<<\u7565" - "<<\u7567" - - "&\ub7c9<<\u4eae<<\u5006<<\u5169<<\u51c9<<\u6881<<\u6a11<<\u7cae" - "<<\u7cb1<<\u7ce7<<\u826f<<\u8ad2<<\u8f1b<<\u91cf" - "<<\u55A8<<\u60A2<<\u690B<<\u6DBC<<\u8E09<<\u9B4E" - - "&\ub824<<\u4fb6<<\u5137<<\u52f5<<\u5442<<\u5eec<<\u616e<<\u623e" - "<<\u65c5<<\u6ada<<\u6ffe<<\u792a<<\u85dc<<\u8823<<\u95ad<<\u9a62" - "<<\u9a6a<<\u9e97<<\u9ece" - "<<\u5122<<\u53B2<<\u5533<<\u68A0<<\u7658<<\u7CF2<<\u8182<<\u81DA<<\u8821<<\u908C<<\u9462" - - "&\ub825<<\u529b<<\u66c6<<\u6b77<<\u701d<<\u792b<<\u8f62<<\u9742" - "<<\u650A<<\u6ADF<<\u6AEA<<\u7667<<\u8F63<<\u9148" - - "&\ub828<<\u6190<<\u6200<<\u6523<<\u6f23<<\u7149<<\u7489<<\u7df4" - "<<\u806f<<\u84ee<<\u8f26<<\u9023<<\u934a" - "<<\u5B4C<<\u695D<<\u6E45<<\u81E0<<\u93C8<<\u9C0A<<\u9C31" - - "&\ub82c<<\u51bd<<\u5217<<\u52a3<<\u6d0c<<\u70c8<<\u88c2" - "<<\u6312<<\u6369<<\u98B2" - - "&\ub834<<\u5ec9<<\u6582<<\u6bae<<\u6fc2<<\u7c3e" - "<<\u5969<<\u7032<<\u78CF" - - "&\ub835<<\u7375" - "<<\u8E90<<\u9B23" - - "&\ub839<<\u4ee4<<\u4f36<<\u56f9<<\u5cba<<\u5dba<<\u601c" - "<<\u73b2<<\u7b2d<<\u7f9a<<\u7fce<<\u8046<<\u901e<<\u9234<<\u96f6" - "<<\u9748<<\u9818<<\u9f61" - "<<\u53E6<<\u5464<<\u59C8<<\u5CAD<<\u6624<<\u6B1E<<\u6CE0<<\u79E2<<\u82D3<<\u86C9<<\u8EE8<<\u9D12<<\u9E77" - - "&\ub840<<\u4f8b<<\u6fa7<<\u79ae<<\u91b4<<\u96b7" - "<<\u96B8<<\u9C67" - - "&\ub85c<<\u52de<<\u6488<<\u64c4<<\u6ad3<<\u6f5e<<\u7018" - "<<\u7210<<\u76e7<<\u8001<<\u8606<<\u865c<<\u8def<<\u8f05<<\u9732" - "<<\u9b6f<<\u9dfa<<\u9e75" - "<<\u58DA<<\u6EF7<<\u7388<<\u7646<<\u7A82<<\u826A<<\u826B<<\u8F64<<\u942A" - "<<\u946A<<\u9871<<\u9AD7<<\u9C78<<\u9E15" - - "&\ub85d<<\u788c<<\u797f<<\u7da0<<\u83c9<<\u9304<<\u9e7f<<\u9e93" - "<<\u5725<<\u5F54<<\u6DE5<<\u6F09<<\u7C0F<<\u8F46<<\u9A04" - - "&\ub860<<\u8ad6" - - "&\ub871<<\u58df<<\u5f04<<\u6727<<\u7027<<\u74cf<<\u7c60<<\u807e" - "<<\u5131<<\u650F<<\u66E8<<\u7931<<\u8622<<\u96B4<<\u9F8E" - - "&\ub8b0<<\u5121<<\u7028<<\u7262<<\u78ca<<\u8cc2<<\u8cda<<\u8cf4<<\u96f7" - "<<\u6502<<\u790C<<\u7927<<\u7C5F<<\u7E87<<\u7F4D<<\u8012<<\u857E<<\u8A84<<\u9179<<\u9842" - - "&\ub8cc<<\u4e86<<\u50da<<\u5bee<<\u5ed6<<\u6599<<\u71ce<<\u7642" - "<<\u77ad<<\u804a<<\u84fc<<\u907c<<\u9b27" - "<<\u5639<<\u5AFD<<\u64A9<<\u66B8<<\u6F66<<\u7360<<\u7E5A<<\u818B<<\u91AA<<\u9410<<\u98C2<<\u98C9" - - "&\ub8e1<<\u9f8d" - "<<\u9F92" - - "&\ub8e8<<\u58d8<<\u5a41<<\u5c62<<\u6a13<<\u6dda<<\u6f0f<<\u763b" - "<<\u7d2f<<\u7e37<<\u851e<<\u8938<<\u93e4<<\u964b" - "<<\u50C2<<\u560D<<\u5D81<<\u617A<<\u802C<<\u87BB<<\u9ACF" - - "&\ub958<<\u5289<<\u65d2<<\u67f3<<\u69b4<<\u6d41<<\u6e9c<<\u700f" - "<<\u7409<<\u7460<<\u7559<<\u7624<<\u786b<<\u8b2c<<\u985e" - "<<\u6A4A<<\u7E32<<\u7E8D<<\u905B<<\u9DB9" - - "&\ub959<<\u516d<<\u622e<<\u9678" - "<<\u52E0" - - "&\ub95c<<\u4f96<<\u502b<<\u5d19<<\u6dea<<\u7db8<<\u8f2a" - "<<\u6384" - - "&\ub960<<\u5f8b<<\u6144<<\u6817<<" - "\u5D42<<\u6EA7" - - "&\ub96d<<\u9686" - "<<\u7643<<\u7ABF" - - "&\ub975<<\u52d2<<\u808b" - "<<\u6CD0" - - "&\ub984<<\u51dc" - "<<\u51DB<<\u5EE9<<\u6F9F" - - "&\ub989<<\u51cc<<\u695e<<\u7a1c<<\u7dbe<<\u83f1<<\u9675" - "<<\u5030<<\u8506" - - "&\ub9ac<<\u4fda<<\u5229<<\u5398<<\u540f<<\u550e<<\u5c65<<\u60a7" - "<<\u674e<<\u68a8<<\u6d6c<<\u7281<<\u72f8<<\u7406<<\u7483<<" - "\u75e2<<\u7c6c<<\u7f79<<\u7fb8<<\u8389<<\u88cf<<\u88e1<<\u91cc" - "<<\u91d0<<\u96e2<<\u9bc9" - "<<\u4FD0<<\u527A<<\u54E9<<\u5AE0<<\u6D96<<\u6F13<<\u79BB<<\u8385<<\u870A" - "<<\u87AD<<\u8C8D<<\u9090<<\u9B51<<\u9ED0" - - "&\ub9b0<<\u541d<<\u6f7e<<\u71d0<<\u7498<<\u85fa<<\u8eaa<<\u96a3" - "<<\u9c57<<\u9e9f" - "<<\u5D99<<\u608B<<\u735C<<\u78F7<<\u7CA6<<\u7CBC<<\u7E57<<\u8E99<<\u8F54<<\u9130<<\u93FB<<\u9A4E" - - "&\ub9bc<<\u6797<<\u6dcb<<\u7433<<\u81e8<<\u9716" - "<<\u75F3" - - "&\ub9bd<<\u782c<<\u7acb<<\u7b20<<\u7c92" - "<<\u5CA6" - - "&\ub9c8<<\u6469<<\u746a<<\u75f2<<\u78bc<<\u78e8<<\u99ac<<\u9b54<<\u9ebb" - "<<\u5298<<\u5ABD<<\u879E<<\u87C7<<\u9EBD<<\u9EBF" - - "&\ub9c9<<\u5bde<<\u5e55<<\u6f20<<\u819c<<\u83ab<<\u9088" - "<<\u7799<<\u93CC" - - "&\ub9cc<<\u4e07<<\u534d<<\u5a29<<\u5dd2<<\u5f4e<<\u6162<<\u633d" - "<<\u6669<<\u66fc<<\u6eff<<\u6f2b<<\u7063<<\u779e<<\u842c<<\u8513" - "<<\u883b<<\u8f13<<\u9945<<\u9c3b" - "<<\u5881<<\u5ADA<<\u5E54<<\u7E35<<\u8B3E<<\u8E63<<\u93CB<<\u93DD<<\u9B18" - - "&\ub9d0<<\u551c<<\u62b9<<\u672b<<\u6cab<<\u8309<<\u896a<<\u977a" - "<<\u5E15<<\u79E3" - - "&\ub9dd<<\u4ea1<<\u5984<<\u5fd8<<\u5fd9<<\u671b<<\u7db2<<\u7f54" - "<<\u8292<<\u832b<<\u83bd<<\u8f1e<<\u9099" - "<<\u60D8<<\u6C52<<\u6F2D<<\u83BE<<\u87D2<<\u9B4D" - - "&\ub9e4<<\u57cb<<\u59b9<<\u5a92<<\u5bd0<<\u6627<<\u679a<<\u6885" - "<<\u6bcf<<\u7164<<\u7f75<<\u8cb7<<\u8ce3<<\u9081<<\u9b45" - "<<\u5446<<\u6973<<\u6CAC<<\u73AB<<\u771B<<\u82FA<<\u8393<<\u9176<<\u9709" - - "&\ub9e5<<\u8108<<\u8c8a<<\u964c<<\u9a40<<\u9ea5" - "<<\u8109<<\u8C83<<\u8C98" - - "&\ub9f9<<\u5b5f<<\u6c13<<\u731b<<\u76f2<<\u76df<<\u840c" - "<<\u511A<<\u750D<<\u753F<<\u867B" - - "&\uba71<<\u51aa<<\u8993" - "<<\u5E4E<<\u7CF8" - - "&\uba74<<\u514d<<\u5195<<\u52c9<<\u68c9<<\u6c94<<\u7704<<\u7720" - "<<\u7dbf<<\u7dec<<\u9762<<\u9eb5" - "<<\u4FDB<<\u6E4E<<\u7CC6<<\u7DDC<<\u9EAA" - - "&\uba78<<\u6ec5<<\u8511" - "<<\u7BFE<<\u884A" - - "&\uba85<<\u51a5<<\u540d<<\u547d<<\u660e<<\u669d<<\u6927<<\u6e9f" - "<<\u76bf<<\u7791<<\u8317<<\u84c2<<\u879f<<\u9169<<\u9298<<\u9cf4" - "<<\u6D3A" - - "&\uba8c<<\u8882" - - "&\ubaa8<<\u4fae<<\u5192<<\u52df<<\u59c6<<\u5e3d<<\u6155<<\u6478" - "<<\u6479<<\u66ae<<\u67d0<<\u6a21<<\u6bcd<<\u6bdb<<\u725f<<\u7261" - "<<\u7441<<\u7738<<\u77db<<\u8017<<\u82bc<<\u8305<<\u8b00<<\u8b28<<\u8c8c" - "<<\u4F94<<\u59E5<<\u5AA2<<\u5AEB<<\u6048<<\u65C4<<\u7683<<\u770A<<\u7C8D" - "<<\u7CE2<<\u8004<<\u8765<<\u87CA<<\u927E<<\u9AE6" - - "&\ubaa9<<\u6728<<\u6c90<<\u7267<<\u76ee<<\u7766<<\u7a46<<\u9da9" - "<<\u51E9<<\u82DC" - - "&\ubab0<<\u6b7f<<\u6c92" - - "&\ubabd<<\u5922<<\u6726<<\u8499" - "<<\u5E6A<<\u61DE<<\u66DA<<\u6E95<<\u6FDB<<\u77A2<<\u77C7<<\u8268<<\u96FA<<\u9E0F" - - "&\ubb18<<\u536f<<\u5893<<\u5999<<\u5edf<<\u63cf<<\u6634<<\u6773" - "<<\u6e3a<<\u732b<<\u7ad7<<\u82d7<<\u9328" - "<<\u6DFC<<\u7707<<\u85D0<<\u8C93" - - "&\ubb34<<\u52d9<<\u5deb<<\u61ae<<\u61cb<<\u620a<<\u62c7<<\u64ab" - "<<\u65e0<<\u6959<<\u6b66<<\u6bcb<<\u7121<<\u73f7<<\u755d<<\u7e46" - "<<\u821e<<\u8302<<\u856a<<\u8aa3<<\u8cbf<<\u9727<<\u9d61" - "<<\u511B<<\u5638<<\u5EE1<<\u81B4<<\u9A16" - - "&\ubb35<<\u58a8<<\u9ed8" - "<<\u563F" - - "&\ubb38<<\u5011<<\u520e<<\u543b<<\u554f<<\u6587<<\u6c76<<\u7d0a" - "<<\u7d0b<<\u805e<<\u868a<<\u9580<<\u96ef" - "<<\u5301<<\u6097<<\u61E3<<\u6286<<\u636B<<\u7086<<\u748A" - - "&\ubb3c<<\u52ff<<\u6c95<<\u7269" - - "&\ubbf8<<\u5473<<\u5a9a<<\u5c3e<<\u5d4b<<\u5f4c<<\u5fae<<\u672a" - "<<\u68b6<<\u6963<<\u6e3c<<\u6e44<<\u7709<<\u7c73<<\u7f8e<<\u8587" - "<<\u8b0e<<\u8ff7<<\u9761<<\u9ef4" - "<<\u4EB9<<\u5A13<<\u5A84<<\u5ABA<<\u5F25<<\u5F2D<<\u6549<<\u7030<<\u737C" - "<<\u7CDC<<\u7E3B<<\u82FF<<\u863C<<\u9E8B" - - "&\ubbfc<<\u5cb7<<\u60b6<<\u610d<<\u61ab<<\u654f<<\u65fb<<\u65fc" - "<<\u6c11<<\u6cef<<\u739f<<\u73c9<<\u7de1<<\u9594" - "<<\u5FDE<<\u5FDF<<\u668B<<\u6E63<<\u7DCD<<\u7F60<<\u82E0<<\u95A9<<\u9C35<<\u9EFD" - - "&\ubc00<<\u5bc6<<\u871c<<\u8b10" - "<<\u6A12<<\u6EF5" - - "&\ubc15<<\u525d<<\u535a<<\u62cd<<\u640f<<\u64b2<<\u6734<<\u6a38" - "<<\u6cca<<\u73c0<<\u749e<<\u7b94<<\u7c95<<\u7e1b<<\u818a<<\u8236" - "<<\u8584<<\u8feb<<\u96f9<<\u99c1" - "<<\u4EB3<<\u6B02<<\u7254<<\u939B<<\u99EE<<\u9AC6" - - "&\ubc18<<\u4f34<<\u534a<<\u53cd<<\u53db<<\u62cc<<\u642c<<\u6500" - "<<\u6591<<\u69c3<<\u6cee<<\u6f58<<\u73ed<<\u7554<<\u7622<<\u76e4" - "<<\u76fc<<\u78d0<<\u78fb<<\u792c<<\u7d46<<\u822c<<\u87e0<<\u8fd4" - "<<\u9812<<\u98ef" - "<<\u5ABB<<\u6273<<\u642B<<\u653D<<\u670C<<\u80D6<<\u878C<<\u9816" - - "&\ubc1c<<\u52c3<<\u62d4<<\u64a5<<\u6e24<<\u6f51<<\u767c<<\u8dcb" - "<<\u91b1<<\u9262<<\u9aee<<\u9b43" - "<<\u54F1<<\u6D61<<\u8116<<\u9238<<\u9D53" - - "&\ubc29<<\u5023<<\u508d<<\u574a<<\u59a8<<\u5c28<<\u5e47<<\u5f77" - "<<\u623f<<\u653e<<\u65b9<<\u65c1<<\u6609<<\u678b<<\u699c<<\u6ec2" - "<<\u78c5<<\u7d21<<\u80aa<<\u8180<<\u822b<<\u82b3<<\u84a1<<\u868c" - "<<\u8a2a<<\u8b17<<\u90a6<<\u9632<<\u9f90" - "<<\u4EFF<<\u5396<<\u5E6B<<\u5FAC<<\u6412<<\u65CA<<\u6886<<\u7253<<\u823D<<\u8783" - "<<\u938A<<\u9AE3<<\u9B74" - - "&\ubc30<<\u500d<<\u4ff3<<\u57f9<<\u5f98<<\u62dc<<\u6392" - "<<\u676f<<\u6e43<<\u7119<<\u76c3<<\u80cc<<\u80da<<\u88f4<<\u88f5" - "<<\u8919<<\u8ce0<<\u8f29<<\u914d<<\u966a" - "<<\u574F<<\u576F<<\u6252<<\u7432<<\u84D3" - - "&\ubc31<<\u4f2f<<\u4f70<<\u5e1b<<\u67cf<<\u6822<<\u767d<<\u767e<<\u9b44" - "<<\u7CA8" - - "&\ubc88<<\u5e61<<\u6a0a<<\u7169<<\u71d4<<\u756a<<\u7e41" - "<<\u8543<<\u85e9<<\u98dc" - "<<\u7E59<<\u7FFB<<\u81B0<<\u8629<<\u88A2" - - "&\ubc8c<<\u4f10<<\u7b4f<<\u7f70<<\u95a5" - "<<\u6A43<<\u7F78" - - "&\ubc94<<\u51e1<<\u5e06<<\u68b5<<\u6c3e<<\u6c4e<<\u6cdb<<\u72af" - "<<\u7bc4<<\u8303" - "<<\u7B35<<\u8A09<<\u98BF" - - "&\ubc95<<\u6cd5<<\u743a" - - "&\ubcbd<<\u50fb<<\u5288<<\u58c1<<\u64d8<<\u6a97<<\u74a7<<\u7656" - "<<\u78a7<<\u8617<<\u95e2<<\u9739" - "<<\u64D7<<\u7513<<\u7588<<\u895E<<\u9DFF<<\u9F0A" - - "&\ubcc0<<\u535e<<\u5f01<<\u8b8a<<\u8fa8<<\u8faf<<\u908a" - "<<\u5FED<<\u6283<<\u7C69<<\u8FAE<<\u8141<<\u8CC6<<\u99E2<<\u9ABF<<\u9D18" - - "&\ubcc4<<\u5225<<\u77a5<<\u9c49<<\u9f08" - "<<\u5F46<<\u9DE9" - - "&\ubcd1<<\u4e19<<\u5002<<\u5175<<\u5c5b<<\u5e77<<\u661e<<\u663a" - "<<\u67c4<<\u68c5<<\u70b3<<\u7501<<\u75c5<<\u79c9<<\u7add<<\u8f27" - "<<\u9920<<\u9a08" - "<<\u4E26<<\u5840<<\u7D63<<\u7F3E<<\u8FF8<<\u9235<<\u92F2<<\u927C" - - "&\ubcf4<<\u4fdd<<\u5821<<\u5831<<\u5bf6<<\u666e<<\u6b65<<\u6d11" - "<<\u6e7a<<\u6f7d<<\u73e4<<\u752b<<\u83e9<<\u88dc<<\u8913<<\u8b5c<<\u8f14" - "<<\u4FCC<<\u76D9<<\u7C20<<\u8446<<\u974C<<\u9D07<<\u9EFC" - - "&\ubcf5<<\u4f0f<<\u50d5<<\u5310<<\u535c<<\u5b93<<\u5fa9<<\u670d" - "<<\u798f<<\u8179<<\u832f<<\u8514<<\u8907<<\u8986<<\u8f39<<\u8f3b" - "<<\u99a5<<\u9c12" - "<<\u58A3<<\u5E5E<<\u6251<<\u6FEE<<\u7B99<<\u83D4<<\u8760<<\u876E<<\u9D69" - - "&\ubcf8<<\u672c" - "&\ubcfc<<\u4e76" - - "&\ubd09<<\u4ff8<<\u5949<<\u5c01<<\u5cef<<\u5cf0<<\u6367<<\u68d2" - "<<\u70fd<<\u71a2<<\u742b<<\u7e2b<<\u84ec<<\u8702<<\u9022<<\u92d2<<\u9cf3" - "<<\u4E30<<\u5906<<\u7BF7<<\u7D98<<\u83F6<<\u9D0C" - - "&\ubd80<<\u4e0d<<\u4ed8<<\u4fef<<\u5085<<\u5256<<\u526f<<\u5426" - "<<\u5490<<\u57e0<<\u592b<<\u5a66<<\u5b5a<<\u5b75<<\u5bcc<<\u5e9c" - "<<\u6276<<\u6577<<\u65a7<<\u6d6e<<\u6ea5<<\u7236<<\u7b26" - "<<\u7c3f<<\u7f36<<\u8150<<\u8151<<\u819a<<\u8240<<\u8299<<\u83a9" - "<<\u8a03<<\u8ca0<<\u8ce6<<\u8cfb<<\u8d74<<\u8dba<<\u90e8<<\u91dc" - "<<\u961c<<\u9644<<\u99d9<<\u9ce7" - "<<\u4EC6<<\u4FD8<<\u5A8D<<\u6294<<\u62CA<<\u638A<<\u6874<<\u6991<<\u6DAA<<\u739E" - "<<\u7954<<\u7B5F<<\u7F58<<\u7F66<<\u80D5<<\u82A3<<\u82FB<<\u8500<<\u86A8<<\u8709" - "<<\u889D<<\u88D2<<\u8DD7<<\u9207<<\u982B<<\u9B92<<\u9EA9" - - "&\ubd81<<\u5317" - - "&\ubd84<<\u5206<<\u5429<<\u5674<<\u58b3<<\u5954<<\u596e<<\u5fff" - "<<\u61a4<<\u626e<<\u6610<<\u6c7e<<\u711a<<\u76c6<<\u7c89<<\u7cde" - "<<\u7d1b<<\u82ac<<\u8cc1<<\u96f0" - "<<\u4F53<<\u574C<<\u5E09<<\u678C<<\u68FB<<\u68FC<<\u6C1B<<\u6E53<<\u6FC6<<\u7287" - "<<\u755A<<\u780F<<\u7B28<<\u80A6<<\u81B9<<\u8561<<\u8F52<<\u9EFA<<\u9F22" - - "&\ubd88<<\u4f5b<<\u5f17<<\u5f7f<<\u62c2" - "<<\u5CAA<<\u7953<<\u7D31<<\u8274<<\u8300<<\u97CD<<\u9AF4<<\u9EFB" - - "&\ubd95<<\u5d29<<\u670b<<\u68da<<\u787c<<\u7e43<<\u9d6c" - "<<\u580B<<\u6F30<<\u9B05" - - "&\ube44<<\u4e15<<\u5099<<\u5315<<\u532a<<\u5351<<\u5983<<\u5a62" - "<<\u5e87<<\u60b2<<\u618a<<\u6249<<\u6279<<\u6590<<\u6787<<\u69a7" - "<<\u6bd4<<\u6bd6<<\u6bd7<<\u6bd8<<\u6cb8<<\u7435<<\u75fa" - "<<\u7812<<\u7891<<\u79d5<<\u79d8<<\u7c83<<\u7dcb<<\u7fe1<<\u80a5" - "<<\u813e<<\u81c2<<\u83f2<<\u871a<<\u88e8<<\u8ab9<<\u8b6c<<\u8cbb" - "<<\u9119<<\u975e<<\u98db<<\u9f3b" - "<<\u4EF3<<\u4FFE<<\u5255<<\u572E<<\u57E4<<\u59A3<<\u5C41<<\u5EB3<<\u60B1<<\u68D0" - "<<\u6911<<\u6C98<<\u6DDD<<\u6DE0<<\u6FDE<<\u72C9<<\u72D2<<\u75DE<<\u75F9<<\u7765" - "<<\u7955<<\u7BE6<<\u7D15<<\u7F86<<\u8153<<\u8298<<\u82BE<<\u8406<<\u84D6<<\u868D" - "<<\u8C94<<\u8D14<<\u8F61<<\u90B3<<\u90EB<<\u959F<<\u9674<<\u970F<<\u97B4<<\u9A11" - "<<\u9A1B<<\u9AC0<<\u9F19" - - "&\ube48<<\u56ac<<\u5b2a<<\u5f6c<<\u658c<<\u6ab3<<\u6baf<<\u6d5c" - "<<\u6ff1<<\u7015<<\u725d<<\u73ad<<\u8ca7<<\u8cd3<<\u983b" - "<<\u5110<<\u64EF<<\u77C9<<\u7E7D<<\u81CF<<\u860B<<\u8C73<<\u90A0<<\u944C<<\u9726" - "<<\u9870<<\u9B02<<\u9B22" - - "&\ube59<<\u6191<<\u6c37<<\u8058<<\u9a01" - "<<\u51B0<<\u51ED<<\u51F4<<\u5A09" - - "&\uc0ac<<\u4e4d<<\u4e8b<<\u4e9b<<\u4ed5<<\u4f3a<<\u4f3c<<\u4f7f" - "<<\u4fdf<<\u50ff<<\u53f2<<\u53f8<<\u5506<<\u55e3<<\u56db<<\u58eb" - "<<\u5962<<\u5a11<<\u5beb<<\u5bfa<<\u5c04<<\u5df3<<\u5e2b<<\u5f99" - "<<\u601d<<\u6368<<\u659c<<\u65af<<\u67f6<<\u67fb<<\u68ad<<\u6b7b" - "<<\u6c99<<\u6cd7<<\u6e23<<\u7009<<\u7345<<\u7802<<\u793e<<\u7940" - "<<\u7960<<\u79c1<<\u7be9<<\u7d17<<\u7d72<<\u8086<<\u820d<<\u838e" - "<<\u84d1<<\u86c7<<\u88df<<\u8a50<<\u8a5e<<\u8b1d<<\u8cdc<<\u8d66" - "<<\u8fad<<\u90aa<<\u98fc<<\u99df<<\u9e9d" - "<<\u509E<<\u525A<<\u5378<<\u548B<<\u59D2<<\u6942<<\u69AD<<\u6C5C<<\u75E7" - "<<\u76B6<<\u7AE2<<\u7B25<<\u7F37<<\u8721<<\u8997<<\u99DB<<\u9B66<<\u9BCA<<\u9C24" - - "&\uc0ad<<\u524a<<\u6714<<" - "\u69CA<<\u720D<<\u84B4<<\u9460" - - "&\uc0b0<<\u5098<<\u522a<<\u5c71<<\u6563<<\u6c55<<\u73ca<<\u7523" - "<<\u759d<<\u7b97<<\u849c<<\u9178<<\u9730" - "<<\u5277<<\u59CD<<\u5B7F<<\u6A75<<\u6F78<<\u6F98<<\u72FB<<\u7E56<<\u8A15<<\u93DF<<\u958A<<\u6BFF" - - "&\uc0b4<<\u4e77<<\u6492<<\u6bba<<\u715e<<\u85a9" - - "&\uc0bc<<\u4e09<<\u6749<<\u68ee<<\u6e17<<\u829f<<\u8518<<\u886b" - "<<\u7CDD<<\u91E4<<\u9B16" - - "&\uc0bd<<\u63f7<<\u6f81<<\u9212<<\u98af" - "<<\u5345<<\u553C<<\u6B43<<\u7FE3<<\u9364<<\u9705<<\u970E" - - "&\uc0c1<<\u4e0a<<\u50b7<<\u50cf<<\u511f<<\u5546<<\u55aa<<\u5617" - "<<\u5b40<<\u5c19<<\u5ce0<<\u5e38<<\u5e8a<<\u5ea0<<\u5ec2<<\u60f3" - "<<\u6851<<\u6a61<<\u6e58<<\u723d<<\u7240<<\u72c0<<\u76f8<<\u7965" - "<<\u7bb1<<\u7fd4<<\u88f3<<\u89f4<<\u8a73<<\u8c61<<\u8cde<<\u971c" - "<<\u587D<<\u5F9C<<\u664C<<\u6BA4<<\u751E<<\u7DD7<<\u939F<<\u9859<<\u9B3A" - - "&\uc0c8<<\u585e<<\u74bd<<\u8cfd" - "<<\u9C13" - - "&\uc0c9<<\u55c7<<\u7a61<<\u7d22<<\u8272" - "<<\u69ED<<\u6FC7<<\u7012" - - "&\uc0dd<<\u7272<<\u751f<<\u7525<<\u7b19" - "<<\u771A<<\u924E" - - "&\uc11c<<\u5885<<\u58fb<<\u5dbc<<\u5e8f<<\u5eb6<<\u5f90<<\u6055" - "<<\u6292<<\u637f<<\u654d<<\u6691<<\u66d9<<\u66f8<<\u6816<<\u68f2" - "<<\u7280<<\u745e<<\u7b6e<<\u7d6e<<\u7dd6<<\u7f72<<\u80e5<<\u8212" - "<<\u85af<<\u897f<<\u8a93<<\u901d<<\u92e4<<\u9ecd<<\u9f20" - "<<\u566C<<\u5A7F<<\u63DF<<\u6495<<\u6E51<<\u6FA8<<\u7D13<<\u8021<<\u82A7<<\u924F" - - "&\uc11d<<\u5915<<\u596d<<\u5e2d<<\u60dc<<\u6614<<\u6673<<\u6790" - "<<\u6c50<<\u6dc5<<\u6f5f<<\u77f3<<\u78a9<<\u84c6<<\u91cb<<\u932b" - "<<\u6670<<\u77FD<<\u814A<<\u8203<<\u8725<<\u9250<<\u9F2B" - - "&\uc120<<\u4ed9<<\u50ca<<\u5148<<\u5584<<\u5b0b<<\u5ba3<<\u6247" - "<<\u657e<<\u65cb<<\u6e32<<\u717d<<\u7401<<\u7444<<\u7487<<\u74bf" - "<<\u766c<<\u79aa<<\u7dda<<\u7e55<<\u7fa8<<\u817a<<\u81b3<<\u8239" - "<<\u861a<<\u87ec<<\u8a75<<\u8de3<<\u9078<<\u9291<<\u9425<<\u994d<<\u9bae" - "<<\u58A1<<\u5AD9<<\u5C1F<<\u5C20<<\u5C73<<\u6103<<\u6B5A<<\u71AF<<\u7B45<<\u7DAB" - "<<\u8B54<<\u8B71<<\u93C7<<\u9A38<<\u9C53<<\u9C7B" - - "&\uc124<<\u5368<<\u5c51<<\u6954<<\u6cc4<<\u6d29<<\u6e2b<<\u820c" - "<<\u859b<<\u893b<<\u8a2d<<\u8aaa<<\u96ea<<\u9f67" - "<<\u5070<<\u5A9F<<\u63F2<<\u66AC<<\u7207<<\u789F<<\u7A27<<\u7D32" - - "&\uc12c<<\u5261<<\u66b9<<\u6bb2<<\u7e96<<\u87fe<<\u8d0d<<\u9583<<\u965d" - "<<\u5B45<<\u61B8<<\u647B<<\u7752<<\u8B6B<<\u929B<<\u97F1" - - "&\uc12d<<\u651d<<\u6d89<<\u71ee<<" - "\u56C1<<\u61FE<<\u7044<<\u8076<<\u8EA1<<\u9477<<\u9873" - - "&\uc131<<\u57ce<<\u59d3<<\u5bac<<\u6027<<\u60fa<<\u6210<<\u661f" - "<<\u665f<<\u7329<<\u73f9<<\u76db<<\u7701<<\u7b6c<<\u8056<<\u8072" - "<<\u8165<<\u8aa0<<\u9192" - "<<\u7446<<\u9A02" - - "&\uc138<<\u4e16<<\u52e2<<\u6b72<<\u6d17<<\u7a05<<\u7b39<<\u7d30" - "<<\u8cb0" - "<<\u5E28<<\u6D12<<\u7E50<<\u86FB" - - "&\uc18c<<\u53ec<<\u562f<<\u5851<<\u5bb5<<\u5c0f<<\u5c11<<\u5de2" - "<<\u6240<<\u6383<<\u6414<<\u662d<<\u68b3<<\u6cbc<<\u6d88<<\u6eaf" - "<<\u701f<<\u70a4<<\u71d2<<\u7526<<\u758f<<\u758e<<\u7619<<\u7b11" - "<<\u7be0<<\u7c2b<<\u7d20<<\u7d39<<\u852c<<\u856d<<\u8607<<\u8a34" - "<<\u900d<<\u9061<<\u90b5<<\u92b7<<\u97f6<<\u9a37" - "<<\u4F4B<<\u4FCF<<\u5372<<\u55C9<<\u57FD<<\u5850<<\u612C<<\u634E<<\u6A14<<\u6CDD" - "<<\u7B71<<\u7BBE<<\u7E45<<\u7FDB<<\u8186<<\u8258<<\u86F8<<\u8E08<<\u9165<<\u9704" - "<<\u9B48<<\u9BB9<<\u9C3A" - - "&\uc18d<<\u4fd7<<\u5c6c<<\u675f<<\u6d91<<\u7c9f<<\u7e8c<<\u8b16" - "<<\u8d16<<\u901f" - "<<\u6D2C<<\u906C" - - "&\uc190<<\u5b6b<<\u5dfd<<\u640d<<\u84c0<<\u905c<<\u98e1" - "<<\u98E7<<\u98F1" - - "&\uc194<<\u7387" - "<<\u7AA3<<\u87C0" - - "&\uc1a1<<\u5b8b<<\u609a<<\u677e<<\u6dde<<\u8a1f<<\u8aa6<<\u9001<<\u980c" - "<<\u67D7<<\u7AE6<<\u9B06" - - "&\uc1c4<<\u5237<<\u7051<<\u788e<<\u9396" - "<<\u60E2<<\u66EC<<\u7463" - - "&\uc1e0<<\u8870<<\u91d7" - - "&\uc218<<\u4fee<<\u53d7<<\u55fd<<\u56da<<\u5782<<\u58fd<<\u5ac2" - "<<\u5b88<<\u5cab<<\u5cc0<<\u5e25<<\u6101<<\u620d<<\u624b<<\u6388" - "<<\u641c<<\u6536<<\u6578<<\u6a39<<\u6b8a<<\u6c34<<\u6d19<<\u6f31" - "<<\u71e7<<\u72e9<<\u7378<<\u7407<<\u74b2<<\u7626<<\u7761<<\u79c0" - "<<\u7a57<<\u7aea<<\u7cb9<<\u7d8f<<\u7dac<<\u7e61<<\u7f9e<<\u8129" - "<<\u8331<<\u8490<<\u84da<<\u85ea<<\u8896<<\u8ab0<<\u8b90<<\u8f38" - "<<\u9042<<\u9083<<\u916c<<\u9296<<\u92b9<<\u968b<<\u96a7<<\u96a8" - "<<\u96d6<<\u9700<<\u9808<<\u9996<<\u9ad3<<\u9b1a" - "<<\u53DF<<\u552E<<\u5ECB<<\u666C<<\u6BB3<<\u6CC5<<\u6EB2<<\u6FC9<<\u775F<<\u7762" - "<<\u778D<<\u795F<<\u7C54<<\u813A<<\u8184<<\u81B8<<\u8B8E<<\u8C4E<<\u9672<<\u98BC<<\u9948" - - "&\uc219<<\u53d4<<\u587e<<\u5919<<\u5b70<<\u5bbf<<\u6dd1<<\u6f5a" - "<<\u719f<<\u7421<<\u74b9<<\u8085<<\u83fd" - "<<\u4FF6<<\u500F<<\u5135<<\u5A4C<<\u6A5A<<\u9A4C<<\u9DEB" - - "&\uc21c<<\u5de1<<\u5f87<<\u5faa<<\u6042<<\u65ec<<\u6812<<\u696f" - "<<\u6a53<<\u6b89<<\u6d35<<\u6df3<<\u73e3<<\u76fe<<\u77ac<<\u7b4d" - "<<\u7d14<<\u8123<<\u821c<<\u8340<<\u84f4<<\u8563<<\u8a62<<\u8ac4" - "<<\u9187<<\u931e<<\u9806<<\u99b4" - "<<\u4F9A<<\u72E5<<\u76F9<<\u7734<<\u7D03<<\u80AB<<\u99E8<<\u9B0A<<\u9D89" - - "&\uc220<<\u620c<<\u8853<<\u8ff0<<\u9265" - "<<\u7D49" - - "&\uc22d<<\u5d07<<\u5d27<<\u5d69" - "<<\u83D8" - - "&\uc26c<<\u5005<<\u6DEC<<\u7120" - - "&\uc2ac<<\u745f<<\u819d<<\u8768" - "<<\u8671" - - "&\uc2b5<<\u6fd5<<\u62fe<<\u7fd2<<\u8936<<\u8972" - "<<\u6174<<\u71A0<<\u96B0" - - "&\uc2b9<<\u4e1e<<\u4e58<<\u50e7<<\u52dd<<\u5347<<\u627f<<\u6607" - "<<\u7e69<<\u8805<<\u965e" - "<<\u584D<<\u9B19" - - "&\uc2dc<<\u4f8d<<\u5319<<\u5636<<\u59cb<<\u5aa4<<\u5c38<<\u5c4e" - "<<\u5c4d<<\u5e02<<\u5f11<<\u6043<<\u65bd<<\u662f<<\u6642<<\u67be" - "<<\u67f4<<\u731c<<\u77e2<<\u793a<<\u7fc5<<\u8494<<\u84cd<<\u8996" - "<<\u8a66<<\u8a69<<\u8ae1<<\u8c55<<\u8c7a" - "<<\u5072<<\u5155<<\u53AE<<\u557B<<\u5852<<\u5EDD<<\u67B2<<\u67F9<<\u6F8C" - "<<\u7DE6<<\u7FE4<<\u8ADF<<\u8AF0<<\u8C49<<\u91C3<<\u9349<<\u984B" - - "&\uc2dd<<\u57f4<<\u5bd4<<\u5f0f<<\u606f<<\u62ed<<\u690d<<\u6b96" - "<<\u6e5c<<\u7184<<\u7bd2<<\u8755<<\u8b58<<\u8efe<<\u98df<<\u98fe" - "<<\u55B0<<\u5AB3<<\u683B" - - "&\uc2e0<<\u4f38<<\u4f81<<\u4fe1<<\u547b<<\u5a20<<\u5bb8<<\u613c" - "<<\u65b0<<\u6668<<\u71fc<<\u7533<<\u795e<<\u7d33<<\u814e<<\u81e3" - "<<\u8398<<\u85aa<<\u85ce<<\u8703<<\u8a0a<<\u8eab<<\u8f9b<<\u8fc5" - "<<\u54C2<<\u567A<<\u56DF<<\u59FA<<\u6C5B<<\u77E7<<\u8124<<\u8D10<<\u9823<<\u99EA" - - "&\uc2e4<<\u5931<<\u5ba4<<\u5be6<<\u6089" - "<<\u87CB<<\u98CB" - - "&\uc2ec<<\u5be9<<\u5c0b<<\u5fc3<<\u6c81<<\u6df1<<\u700b" - "<<\u751a<<\u82af<<\u8af6" - "<<\u68A3<<\u6F6F<<\u71D6<<\u845A<<\u9414<<\u9C4F" - - "&\uc2ed<<\u4ec0<<\u5341<<" - "\u8FBB" - - "&\uc30d<<\u96d9" - - "&\uc528<<\u6c0f" - - "&\uc544<<\u4e9e<<\u4fc4<<\u5152<<\u555e<<\u5a25<<\u5ce8<<\u6211" - "<<\u7259<<\u82bd<<\u83aa<<\u86fe<<\u8859<<\u8a1d<<\u963f<<\u96c5" - "<<\u9913<<\u9d09<<\u9d5d" - "<<\u4E2B<<\u54E6<<\u5A3F<<\u5A40<<\u5CE9<<\u75B4<<\u7811<<\u7B0C<<\u8FD3<<\u930F<<\u9D5E" - - "&\uc545<<\u580a<<\u5cb3<<\u5dbd<<\u5e44<<\u60e1<<\u6115<<\u63e1" - "<<\u6a02<<\u6e25<<\u9102<<\u9354<<\u984e<<\u9c10<<\u9f77" - "<<\u5053<<\u537E<<\u54A2<<\u5594<<\u5669<<\u816D<<\u843C<<\u89A8<<\u8AE4<<\u9D9A<<\u9F76" - - "&\uc548<<\u5b89<<\u5cb8<<\u6309<<\u664f<<\u6848<<\u773c<<\u96c1" - "<<\u978d<<\u9854<<\u9b9f" - "<<\u6849<<\u72B4<<\u8D0B<<\u9D08" - - "&\uc54c<<\u65a1<<\u8b01<<\u8ecb<<\u95bc" - "<<\u560E<<\u621E<<\u63E0<<\u7A75<<\u8A10<<\u904F<<\u981E<<\u9D36" - - "&\uc554<<\u5535<<\u5ca9<<\u5dd6<<\u5eb5<<\u6697<<\u764c<<\u83f4<<\u95c7" - "<<\u557D<<\u5A95<<\u5D53<<\u667B<<\u8164<<\u844A<<\u84ED<<\u8AF3<<\u9837<<\u99A3<<\u9EEF" - - "&\uc555<<\u58d3<<\u62bc<<\u72ce<<\u9d28" - - "&\uc559<<\u4ef0<<\u592e<<\u600f<<\u663b<<\u6b83<<\u79e7<<\u9d26" - "<<\u536C<<\u5771<<\u6CF1<<\u76CE<<\u9785" - - "&\uc560<<\u5393<<\u54c0<<\u57c3<<\u5d16<<\u611b<<\u66d6<<\u6daf" - "<<\u788d<<\u827e<<\u9698<<\u9744" - "<<\u50FE<<\u5509<<\u5540<<\u566F<<\u5A2D<<\u5D15<<\u6328<<\u6371<<\u6B38<<\u6F04<<\u7343" - "<<\u769A<<\u775A<<\u77B9<<\u78D1<<\u7919<<\u8586<<\u85F9<<\u9749<<\u9A03" - - "&\uc561<<\u5384<<\u627c<<\u6396<<\u6db2<<\u7e0a<<\u814b<<\u984d" - "<<\u545D<<\u6239<<\u6424<<\u9628" - - "&\uc575<<\u6afb<<\u7f4c<<\u9daf<<\u9e1a" - "<<\u56B6<<\u5AC8<<\u7F43<<\u9DEA" - - "&\uc57c<<\u4e5f<<\u503b<<\u51b6<<\u591c<<\u60f9<<\u63f6<<\u6930" - "<<\u723a<<\u8036<<\u91ce" - "<<\u57DC" - - "&\uc57d<<\u5f31<<\u7d04<<\u82e5<<\u846f<<\u84bb" - "<<\u85e5<<\u8e8d" - "<<\u721A<<\u79B4<<\u7BDB<<\u7C65<<\u9470<<\u9C2F<<\u9DB8<<\u9FA0" - - "&\uc591<<\u4f6f<<\u58e4<<\u5b43<<\u6059" - "<<\u63da<<\u6518<<\u656d<<\u6698<<\u694a<<\u6a23<<\u6d0b" - "<<\u7001<<\u716c<<\u75d2<<\u760d<<\u79b3<<\u7a70<<\u7f8a" - "<<\u8944<<\u8b93<<\u91c0<<\u967d<<\u990a" - "<<\u5F89<<\u6F3E<<\u703C<<\u70CA<<\u7662<<\u773B<<\u8618<<\u8F30<<\u9472<<\u98BA<<\u9A64" - - "&\uc5b4<<\u5704<<\u5fa1<<\u65bc<<\u6f01<<\u7600<<\u79a6<<\u8a9e" - "<<\u99ad<<\u9b5a<<\u9f6c" - "<<\u5709<<\u6554<<\u6DE4<<\u98EB" - - "&\uc5b5<<\u5104<<\u61b6<<\u6291<<\u6a8d<<\u81c6" - "<<\u7E76" - - "&\uc5b8<<\u5043<<\u5830<<\u5f66<<\u7109<<\u8a00<<\u8afa" - "<<\u50BF<<\u533D<<\u5AE3<<\u8B9E<<\u9122<<\u9F34<<\u9F39" - - "&\uc5bc<<\u5b7c<<\u8616" - "<<\u81EC" - - "&\uc5c4<<\u4ffa<<\u513c<<\u56b4<<\u5944<<\u63a9<<\u6df9" - "<<\u5D26<<\u5E7F<<\u66EE<<\u7F68<<\u9183<<\u95B9" - - - "&\uc5c5<<\u5daa<<\u696d" - "<<\u5DAB<<\u9134" - - "&\uc5d0<<\u605A<<\u66C0" - - "&\uc5d4<<\u5186" - - "&\uc5ec<<\u4e88<<\u4f59<<\u5982<<" - "\u6b5f<<\u6c5d<<\u74b5<<\u7916<<\u8207" - "<<\u8245<<\u8339<<\u8f3f<<\u8f5d<<\u9918<<" - "\u8201" - - "&\uc5ed<<\u4ea6<<\u57df<<\u5f79<<\u6613<<" - "\u75ab<<\u7e79<<\u8b6f<<\u9006<<\u9a5b" - "<<\u5DA7<<\u61CC<<\u6DE2<<\u95BE" - - "&\uc5f0<<\u56a5<<\u5827<<\u59f8<<\u5a1f<<\u5bb4<<\u5ef6" - "<<\u6350<<\u633b<<\u693d<<\u6c87<<\u6cbf" - "<<\u6d8e<<\u6d93<<\u6df5<<\u6f14<<\u70df<<\u7136<<\u7159" - "<<\u71c3<<\u71d5<<\u784f<<\u786f<<\u7b75" - "<<\u7de3<<\u7e2f<<\u884d<<\u8edf<<" - "\u925b<<\u9cf6" - "<<\u5157<<\u56E6<<\u57CF<<\u5B3F<<\u6081<<\u63BE<<\u66E3<<\u6ADE<<\u6E37" - "<<\u81D9<<\u839A<<\u8735<<\u8815<<\u8B8C<<\u9DF0" - - "&\uc5f4<<\u6085<<\u6d85<<\u71b1" - "<<\u95b1" - "<<\u564E" - - "&\uc5fc<<\u53ad<<\u67d3<<\u708e" - "<<\u7130<<\u7430<<\u8276<<\u82d2<<\u95bb<<\u9ae5<<\u9e7d" - "<<\u5189<<\u5869<<\u61D5<<\u624A<<\u6ABF<<\u6AB6<<\u704E<<\u7069<<\u91C5<<\u995C<<\u9B58<<\u9EF6" - - "&\uc5fd<<\u66c4<<\u71c1<<\u8449" - "<<\u66C5<<\u7180<<\u7217<<\u9768" - - "&\uc601<<\u584b<<\u5db8<<\u5f71" - "<<\u6620<<\u668e<<\u6979<<\u69ae<<\u6c38<<\u6cf3<<\u6e36" - "<<\u6f41<<\u6fda<<\u701b<<\u702f<<\u7150<<\u71df<<\u7370<<" - "\u745b<<\u74d4<<\u76c8<<\u7a4e<<\u7e93<<" - "\u82f1<<\u8a60<<\u8fce<<\u9348<<\u9719<<" - "\u548F<<\u5B34<<\u5B30<<\u6D67<<\u6FF4<<\u766D<<\u78A4<<\u7E08<<\u8811<<\u8D0F<<\u90E2<<\u97FA" - - "&\uc608<<\u4e42<<\u502a<<\u5208<<\u53e1<<\u66f3<<\u6c6d" - "<<\u6fca<<\u730a<<\u777f<<\u7a62<<\u82ae<<\u85dd<<\u8602<<" - "\u88d4<<\u8a63<<\u8b7d<<\u8c6b<<\u92b3<<\u9713<<\u9810" - "<<\u56C8<<\u5ADB<<\u62FD<<\u639C<<\u6798<<\u7369<<\u7768<<\u7796<<\u7E44" - "<<\u7FF3<<\u82C5<<\u854A<<\u854B<<\u8589<<\u868B<<\u873A<<\u9BE2<<\u9DD6<<\u9E91" - - "&\uc624<<\u4e94<<\u4f0d<<\u4fc9<<\u50b2<<\u5348<<\u543e<<\u5433" - "<<\u55da<<\u5862<<\u58ba<<\u5967<<\u5a1b<<\u5be4<<\u609f<<" - "\u61ca<<\u6556<<\u65ff<<\u6664<<\u68a7<<\u6c5a<<\u6fb3<<\u70cf" - "<<\u71ac<<\u7352<<\u7b7d<<\u8708<<\u8aa4<<\u9c32<<\u9f07" - "<<\u4EF5<<\u4FE3<<\u5514<<\u55F7<<\u5641<<\u572C<<\u5AAA<<\u5AEF<<\u5FE4<<\u6160<<\u6342" - "<<\u6C59<<\u7AB9<<\u8071<<\u8323<<\u8956<<\u8B37<<\u8FC3<<\u8FD5<<\u9068<<\u93CA<<\u93D6" - "<<\u96A9<<\u9A41<<\u9F2F" - - "&\uc625<<\u5c4b<<\u6c83<<\u7344<<\u7389<<\u923a" - - "&\uc628<<\u6eab<<\u7465<<\u761f<<\u7a69<<\u7e15<<\u860a" - "<<\u5ABC<<\u614D<<\u6637<<\u6C33<<\u7185<<\u8580<<\u8F40<<\u919E<<\u97DE<<\u9942<<\u9C2E" - - "&\uc62c<<\u5140" - "<<\u55E2<<\u8183" - - "&\uc639<<\u58c5<<\u64c1<<\u74ee<<\u7515<<\u7670<<\u7fc1<<\u9095" - "<<\u96cd<<\u9954" - "<<\u5581<<\u5EF1<<\u6EC3<<\u7655<<\u79BA<<\u7F4B<<\u84CA<<\u96DD<<\u9852" - - "&\uc640<<\u6e26<<\u74e6<<\u7aa9<<\u7aaa<<\u81e5<<\u86d9<<\u8778<<\u8a1b" - "<<\u54C7<<\u56EE<<\u5A50<<\u6799<<\u6D3C<<\u7327<<\u7A8A<<\u8435<<\u8B4C" - - "&\uc644<<\u5a49<<\u5b8c<<\u5b9b<<\u68a1<<\u6900<<\u6d63<<\u73a9" - "<<\u7413<<\u742c<<\u7897<<\u7de9<<\u7feb<<\u8118<<\u8155<<\u839e" - "<<\u8c4c<<\u962e<<\u9811" - "<<\u5213<<\u57B8<<\u59A7<<\u5C8F<<\u5FE8<<\u60CB<<\u6DB4<<\u76CC" - - "&\uc648<<\u66f0" - - "&\uc655<<\u5f80<<\u65fa<<\u6789<<\u6c6a<<\u738b" - "<<\u5C2B<<\u7007<<\u8FEC" - - "&\uc65c<<\u502d<<\u5a03<<\u6b6a<<\u77ee" - "<<\u5AA7" - - "&\uc678<<\u5916<<\u5d6c<<\u5dcd<<\u7325<<\u754f" - "<<\u504E<<\u5D34<<\u5D54<<\u6E28<<\u7168<<\u78A8<<\u78C8<<\u8075<<\u9697" - - "&\uc694<<\u50e5<<\u51f9<<\u582f<<\u592d<<\u5996" - "<<\u59da<<\u5be5<<\u5da2<<\u62d7<<\u6416<<\u6493" - "<<\u64fe<<\u66dc<<\u6a48<<\u71ff<<\u7464" - "<<\u7a88<<\u7aaf<<\u7e47<<\u7e5e<<\u8000<<\u8170<<" - "\u87ef<<\u8981<<\u8b20<<\u9059<<\u9080<<\u9952" - "<<\u5060<<\u5593<<\u5773<<\u589D<<\u5B08<<\u5E7A<<\u5FAD<<\u5FBC<<\u6B80<<\u6F86" - "<<\u7945<<\u7A7E<<\u7A85<<\u8558<<\u9076<<\u9DC2" - - "&\uc695<<\u617e<<\u6b32<<\u6d74<<\u7e1f<<\u8925<<\u8fb1" - "<<\u6EBD<<\u84D0" - - "&\uc6a9<<\u4fd1<<\u50ad<<\u5197<<\u52c7<<\u57c7<<\u5889<<\u5bb9" - "<<\u5eb8<<\u6142<<\u6995<<\u6d8c<<\u6e67<<\u6eb6<<\u7194<<\u7462" - "<<\u7528<<\u752c<<\u8073<<\u8338<<\u84c9<<\u8e0a<<\u9394<<\u93de<<" - "\u509B<<\u5B82<<\u5D71<<\u6175<<\u6183<<\u69E6<<\u7867<<\u8202<<\u86F9<<\u8E34" - - "&\uc6b0<<\u4e8e<<\u4f51<<\u5076<<\u512a<<\u53c8<<\u53cb<<\u53f3" - "<<\u5b87<<\u5bd3<<\u5c24<<\u611a<<\u6182<<\u65f4<<\u725b<<\u7397" - "<<\u7440<<\u76c2<<\u7950<<\u7991<<\u79b9<<\u7d06<<\u7fbd<<\u828b" - "<<\u85d5<<\u865e<<\u8fc2<<\u9047<<\u90f5<<\u91ea<<\u9685<<\u96e8<<\u96e9" - "<<\u4E8F<<\u4EB4<<\u4FC1<<\u504A<<\u5401<<\u5823<<\u5D4E<<\u5EBD<<\u6745<<\u75A3" - "<<\u76F1<<\u7AFD<<\u8026<<\u8030<<\u8B23<<\u8E3D<<\u935D<<\u9E80<<\u9E8C<<\u9F72" - - "&\uc6b1<<\u52d6<<\u5f67<<\u65ed<<\u6631<<\u682f<<\u715c<<\u7a36" - "<<\u90c1<<\u980a" - "<<\u71E0" - - "&\uc6b4<<\u4e91<<\u6a52<<\u6b9e<<\u6f90<<\u7189<<\u8018" - "<<\u82b8<<\u8553<<\u904b<<\u9695<<\u96f2<<\u97fb" - "<<\u60F2<<\u6C84<<\u7BD4<<\u7D1C<<\u9723<<\u97F5" - - "&\uc6b8<<\u851a<<\u9b31<<\u4e90" - - "&\uc6c5<<\u718a<<\u96c4" - - "&\uc6d0<<\u5143<<\u539f<<\u54e1<<\u5713<<\u5712<<\u57a3<<\u5a9b" - "<<\u5ac4<<\u5bc3<<\u6028<<\u613f<<\u63f4<<\u6c85<<\u6d39<<\u6e72" - "<<\u6e90<<\u7230<<\u733f<<\u7457<<\u82d1<<\u8881<<\u8f45<<\u9060" - "<<\u9662<<\u9858<<\u9d1b" - "<<\u51A4<<\u571C<<\u676C<<\u6965<<\u7328<<\u7DA9<<\u82AB<<\u8597<<\u873F<<\u8B1C" - "<<\u92FA<<\u9A35<<\u9D77<<\u9EFF" - - "&\uc6d4<<\u6708<<\u8d8a<<\u925e" - "<<\u5216<<\u7CA4" - - "&\uc704<<\u4f4d<<\u5049<<\u50de<<\u5371<<\u570d<<\u59d4<<\u5a01" - "<<\u5c09<<\u6170<<\u6690<<\u6e2d<<\u7232<<\u744b<<\u7def<<\u80c3" - "<<\u840e<<\u8466<<\u853f<<\u875f<<\u885b<<\u8918<<\u8b02<<\u9055" - "<<\u97cb<<\u9b4f" - "<<\u559F<<\u5E43<<\u7152<<\u71A8<<\u75FF<<\u8473<<\u885E<<\u8AC9<<\u9036<<\u95C8" - "<<\u97D9<<\u97E1<<\u9927<<\u9AAA" - - "&\uc720<<\u4e73<<\u4f91<<\u5112<<\u516a<<\u552f<<\u55a9" - "<<\u5b7a<<\u5ba5<<\u5e7c<<\u5e7d<<\u5ebe<<\u60a0<<\u60df<<\u6108" - "<<\u6109<<\u63c4<<\u6538<<\u6709<<\u67d4<<\u67da<<" - "\u6961<<\u6962<<\u6cb9<<\u6d27<<\u6e38<<\u6fe1" - "<<\u7336<<\u7337<<\u745c<<\u7531<<\u7652<<" - "\u7dad<<\u81fe<<\u8438<<\u88d5<<\u8a98<<\u8adb<<\u8aed" - "<<\u8e30<<\u8e42<<\u904a<<\u903e<<\u907a<<\u9149<<\u91c9<<\u936e<<" - "\u5198<<\u5466<<\u56FF<<\u58DD<<\u5E37<<\u63C9<<\u65BF<<\u6CD1<<\u7256<<\u7609" - "<<\u7610<<\u7AAC<<\u7AB3<<\u7C72<<\u7CC5<<\u7DCC<<\u8174<<\u83A0<<\u8555<<\u8564" - "<<\u86B0<<\u86B4<<\u8764<<\u8915<<\u8B89<<\u900C<<\u97A3<<\u9BAA<<\u9EDD<<\u9F2C<<\u9FA5" - - "&\uc721<<\u5809<<\u6bd3<<\u8089<<\u80b2<<" - "\u5125" - - "&\uc724<<\u5141<<\u596b<<\u5c39<<\u6f64" - "<<\u73a7<<\u80e4<<\u8d07<<\u9217<<\u958f" - "<<\u6600<<\u92C6" - - "&\uc728<<\u807f" - "<<\u6F4F<<\u77DE" - - "&\uc735<<\u620e<<\u701c<<\u7d68<<\u878d<<" - "\u72E8" - - "&\uc740<<\u57a0<<\u6069<<\u6147<<\u6bb7<<\u8abe<<\u9280<<\u96b1" - "<<\u542C<<\u569A<<\u5701<<\u57BD<<\u6196<<\u6ABC<<\u6EB5<<\u72FA<<\u73E2<<\u766E" - "<<\u8A14<<\u911E<<\u9F57" - - "&\uc744<<\u4e59" - "<<\u9CE6" - - "&\uc74c<<\u541f<<\u6deb<<\u852d<<\u9670<<\u97f3<<\u98ee" - "<<\u5591<<\u5D1F<<\u5ED5<<\u6114<<\u972A" - - "&\uc74d<<\u63d6<<\u6ce3<<\u9091" - "<<\u6092<<\u6339<<\u6D65" - - "&\uc751<<\u51dd<<\u61c9<<\u81ba<<\u9df9" - - "&\uc758<<\u4f9d<<\u501a<<\u5100<<\u5b9c<<\u610f<<\u61ff<<\u64ec" - "<<\u6905<<\u6bc5<<\u7591<<\u77e3<<\u7fa9<<\u8264<<\u858f<<\u87fb" - "<<\u8863<<\u8abc<<\u8b70<<\u91ab" - "<<\u5117<<\u51D2<<\u5293<<\u5DB7<<\u6B39<<\u6F2A<<\u7317<<\u7912<<\u8798<<\u9950" - - "&\uc774<<\u4e8c<<\u4ee5<<\u4f0a<<\u5937<<\u59e8" - "<<\u5df2<<\u5f1b<<\u5f5b<<\u6021<<" - "\u723e<<\u73e5<<\u7570<<\u75cd<<\u79fb" - "<<\u800c<<\u8033<<\u8084<<\u82e1<<\u8351<<" - "\u8cbd<<\u8cb3<<\u9087<<\u98f4<<\u990c" - "<<\u54BF<<\u5768<<\u5C14<<\u5F5D<<\u682E<<\u6D1F<<\u73C6<<\u8A11<<\u8A51<<\u8FE4<<\u96B6" - //"<<\uc775" - "&\uc775" - "<<\u7037<<\u76ca<<\u7fca<<\u7fcc<<\u7ffc<<\u8b1a" - "<<\u5F0B<<\u71A4<<\u9DC1" - - "&\uc778<<\u4eba<<\u4ec1<<\u5203<<\u5370<<\u54bd<<\u56e0" - "<<\u59fb<<\u5bc5<<\u5f15<<\u5fcd<<\u6e6e<<\u7d6a" - "<<\u8335<<\u8693<<\u8a8d<<\u976d<<\u9777<<" - "\u4EDE<<\u5819<<\u5924<<\u5A63<<\u6268<<\u6C24<<\u6D07<<\u798B<<\u7C7E<<\u82A2<<\u88C0" - - "&\uc77c<<\u4e00<<\u4f5a<<\u4f7e<<\u58f9<<\u65e5<<\u6ea2<<\u9038" - "<<\u93b0<<\u99b9" - "<<\u6CC6<<\u8EFC" - - "&\uc784<<\u4efb<<\u58ec<<\u598a<<\u59d9<<\u6041<<" - "\u7a14<<\u834f<<\u8cc3" - "<<\u7D4D<<\u887D<<\u928B<<\u98EA" - - "&\uc785<<\u5165<<\u5344<<" - "\u5EFF" - - "&\uc789<<\u4ecd<<\u5269<<\u5b55<<\u82bf" - "<<\u5AB5" - - "&\uc790<<\u4ed4<<\u523a<<\u54a8<<\u59c9<<\u59ff<<\u5b50<<\u5b57" - "<<\u5b5c<<\u6063<<\u6148<<\u6ecb<<\u7099<<\u716e<<\u7386<<\u74f7" - "<<\u75b5<<\u78c1<<\u7d2b<<\u8005<<\u81ea<<\u8328<<\u8517<<\u85c9" - "<<\u8aee<<\u8cc7<<\u96cc" - "<<\u5470<<\u5B28<<\u5B56<<\u5B76<<\u67D8<<\u6CDA<<\u7278<<\u7725<<\u7726<<\u7CA2<<\u8014" - "<<\u80FE<<\u8308<<\u8332<<\u83BF<<\u8678<<\u89DC<<\u8A3E<<\u8CB2<<\u8D6D<<\u93A1<<\u983F" - "<<\u9AED<<\u9B93<<\u9DBF<<\u9DD3" - - "&\uc791<<\u4f5c<<\u52fa<<\u56bc<<\u65ab<<\u6628<<\u707c<<\u70b8" - "<<\u7235<<\u7dbd<<\u828d<<\u914c<<\u96c0<<\u9d72" - "<<\u5C9D<<\u600D<<\u65B1<<\u67DE<<\u6C4B<<\u712F<<\u72B3<<\u788F" - - "&\uc794<<\u5b71<<\u68e7<<\u6b98<<\u6f7a<<\u76de" - "<<\u5257<<\u6214<<\u9A4F" - - "&\uc7a0<<\u5c91<<\u66ab<<\u6f5b<<\u7bb4<<\u7c2a<<\u8836" - "<<\u6D94<<\u6F5C<<\u6FF3" - "&\uc7a1<<\u96dc" - "<<\u5361<<\u56C3<<\u7728<<\u78FC<<\u894D" - - "&\uc7a5<<\u4e08<<\u4ed7<<\u5320<<\u5834<<\u58bb<<\u58ef<<\u596c" - "<<\u5c07<<\u5e33<<\u5e84<<\u5f35<<\u638c<<\u66b2<<\u6756<<\u6a1f" - "<<\u6aa3<<\u6b0c<<\u6f3f<<\u7246<<\u7350<<\u748b<<\u7ae0" - "<<\u7ca7<<\u8178<<\u81df<<\u81e7<<\u838a<<\u846c<<\u8523<<\u8594" - "<<\u85cf<<\u88dd<<\u8d13<<\u91ac<<\u9577<<\u969c" - "<<\u50BD<<\u5958<<\u599D<<\u5B19<<\u5D82<<\u5EE7<<\u6215<<\u6F33<<\u7242<<\u7634<<\u7CDA" - "<<\u7F98<<\u8407<<\u88C5<<\u8CEC<<\u9123<<\u93D8<<\u9926<<\u9E9E" - - "&\uc7ac<<\u518d<<\u54c9<<\u5728<<\u5bb0<<\u624d<<\u6750<<\u683d" - "<<\u6893<<\u6e3d<<\u6ed3<<\u707d<<\u7e21<<\u88c1<<\u8ca1<<\u8f09" - "<<\u9f4b<<\u9f4e" - "<<\u5908<<\u5D3D<<\u6257<<\u699F<<\u707E<<\u7E94" - - "&\uc7c1<<\u722d<<\u7b8f<<\u8acd<<\u931a" - "<<\u5D22<<\u7319<<\u7424<<\u9397" - - "&\uc800<<\u4f47<<\u4f4e<<\u5132<<\u5480<<\u59d0<<\u5e95<<\u62b5" - "<<\u6775<<\u696e<<\u6a17<<\u6cae<<\u6e1a<<\u72d9<<\u732a<<\u75bd" - "<<\u7bb8<<\u7d35<<\u82e7<<\u83f9<<\u8457<<\u85f7<<\u8a5b<<\u8caf" - "<<\u8e87<<\u9019<<\u90b8<<\u96ce<<\u9f5f" - "<<\u5B81<<\u5CA8<<\u677C<<\u67E2<<\u6C10<<\u6F74<<\u7026<<\u7274<<\u7F5D<<\u7F9D<<\u82F4" - "<<\u86C6<<\u889B<<\u891A<<\u89DD<<\u8A46<<\u8C6C<<\u967C" - - "&\uc801<<\u52e3<<\u540a<<\u5ae1<<\u5bc2<<\u6458<<\u6575<<\u6ef4" - "<<\u72c4<<\u7684<<\u7a4d<<\u7b1b<<\u7c4d<<\u7e3e<<\u7fdf" - "<<\u837b<<\u8b2b<<\u8cca<<\u8d64<<\u8de1<<\u8e5f<<\u8fea<<\u8ff9" - "<<\u9069<<\u93d1" - "<<\u6A00<<\u78E7<<\u7CF4<<\u83C2<<\u89BF<<\u9016<<\u99B0" - - "&\uc804<<\u4f43<<\u4f7a<<\u50b3<<\u5168<<\u5178<<\u524d<<\u526a" - "<<\u5861<<\u587c<<\u5960<<\u5c08<<\u5c55<<\u5edb<<\u609b<<\u6230" - "<<\u6813<<\u6bbf<<\u6c08<<\u6fb1<<\u714e<<\u7420<<\u7530<<\u7538" - "<<\u7551<<\u7672<<\u7b4c<<\u7b8b<<\u7bad<<\u7bc6<<\u7e8f<<\u8a6e" - "<<\u8f3e<<\u8f49<<\u923f<<\u9293<<\u9322<<\u942b<<\u96fb<<\u985a" - "<<\u986b<<\u991e" - "<<\u542E<<\u56C0<<\u5AE5<<\u5C47<<\u5DD3<<\u6229<<\u63C3<<\u65C3<<\u6834<<\u69C7<<\u6E54" - "<<\u6FB6<<\u724B<<\u7471<<\u750E<<\u754B<<\u7560<<\u75CA<<\u765C<<\u78DA<<\u7C5B<<\u7FB6" - "<<\u7FE6<<\u8146<<\u819E<<\u8343<<\u8E94<<\u8F07<<\u9085<<\u913D<<\u92D1<<\u932A<<\u975B" - "<<\u9766<<\u9853<<\u98E6<<\u9930<<\u9B0B<<\u9C63<<\u9E07" - - "&\uc808<<\u5207<<\u622a<<\u6298<<\u6d59<<\u7664<<\u7aca<<\u7bc0<<\u7d76" - "<<\u5C8A<<\u6662<<\u7A83" - - "&\uc810<<\u5360<<\u5cbe<<\u5e97<<\u6f38<<\u70b9<<\u7c98<<\u9711" - "<<\u9b8e<<\u9ede" - "<<\u4F54<<\u588A<<\u73B7<<\u7B18<<\u7C1F<<\u82EB<<\u852A<<\u86C5<<\u8998<<\u98AD<<\u9ECF" - - "&\uc811<<\u63a5<<\u647a<<\u8776" - "<<\u6904<<\u696A<<\u8728<<\u8DD5<<\u8E40<<\u9C08" - - "&\uc815<<\u4e01<<\u4e95<<\u4ead<<\u505c<<\u5075<<\u5448<<\u59c3" - "<<\u5b9a<<\u5e40<<\u5ead<<\u5ef7<<\u5f81<<\u60c5<<\u633a<<\u653f" - "<<\u6574<<\u65cc<<\u6676<<\u6678<<\u67fe<<\u6968<<\u6a89<<\u6b63" - "<<\u6c40<<\u6dc0<<\u6de8<<\u6e1f<<\u6e5e<<\u701e<<\u70a1<<\u738e" - "<<\u73fd<<\u753a<<\u775b<<\u7887<<\u798e<<\u7a0b<<\u7a7d<<\u7cbe" - "<<\u7d8e<<\u8247<<\u8a02<<\u8aea<<\u8c9e<<\u912d<<\u914a<<\u91d8" - "<<\u9266<<\u92cc<<\u9320<<\u9706<<\u9756<<\u975c<<\u9802<<\u9f0e" - "<<\u4F42<<\u53EE<<\u5A67<<\u5A77<<\u6014<<\u639F<<\u686F<<\u6883<<\u68D6<<\u706F<<\u73F5" - "<<\u7594<<\u7B73<<\u839B<<\u8A3C<<\u9049<<\u9172<<\u92E5<<\u975A" - - "&\uc81c<<\u5236<<\u5291<<\u557c<<\u5824<<\u5e1d<<\u5f1f<<\u608c" - "<<\u63d0<<\u68af<<\u6fdf<<\u796d<<\u7b2c<<\u81cd<<\u85ba<<\u88fd" - "<<\u8af8<<\u8e44<<\u918d<<\u9664<<\u969b<<\u973d<<\u984c<<\u9f4a" - "<<\u5115<<\u5A23<<\u64E0<<\u7318<<\u7445<<\u7747<<\u7994<<\u7A0A<<\u7DF9<<\u8E36<<\u8E4F" - "<<\u8E8B<<\u9357<<\u9684<<\u97F2<<\u9BA7<<\u9BF7" - - "&\uc870<<\u4fce<<\u5146<<\u51cb<<\u52a9<<\u5632<<\u5f14<<\u5f6b" - "<<\u63aa<<\u64cd<<\u65e9<<\u6641<<\u66fa<<\u66f9<<\u671d<<\u689d" - "<<\u68d7<<\u69fd<<\u6f15<<\u6f6e<<\u7167<<\u71e5<<\u722a<<\u74aa" - "<<\u773a<<\u7956<<\u795a<<\u79df<<\u7a20<<\u7a95<<\u7c97<<\u7cdf" - "<<\u7d44<<\u7e70<<\u8087<<\u85fb<<\u86a4<<\u8a54<<\u8abf<<\u8d99" - "<<\u8e81<<\u9020<<\u906d<<\u91e3<<\u963b<<\u96d5<<\u9ce5" - "<<\u4F7B<<\u50AE<<\u5201<<\u539D<<\u5608<<\u566A<<\u5B25<<\u5F82<<\u61C6<<\u627E<<\u6B82" - "<<\u6FA1<<\u7431<<\u7681<<\u7967<<\u7AC8<<\u7B0A<<\u7CD9<<\u7CF6<<\u7D69<<\u7D5B<<\u80D9" - "<<\u81CA<<\u825A<<\u8526<<\u8729<<\u8A82<<\u8B5F<<\u921F<<\u929A<<\u92FD<<\u9BDB<<\u9D70<<\u9F02" - - "&\uc871<<\u65cf<<\u7c07<<\u8db3<<\u93c3" - "<<\u762F" - - "&\uc874<<\u5b58<<\u5c0a" - "<<\u62F5" - - "&\uc878<<\u5352<<\u62d9<<\u731d" - - "&\uc885<<\u5027<<\u5b97<<\u5f9e<<\u60b0<<\u616b<<\u68d5<<\u6dd9" - "<<\u742e<<\u7a2e<<\u7d42<<\u7d9c<<\u7e31<<\u816b<<\u8e2a<<\u8e35" - "<<\u937e<<\u9418" - "<<\u4F00<<\u6152<<\u67CA<<\u6936<<\u6A05<<\u747D<<\u7607<<\u7CBD<<\u87BD<<\u8E64" - - "&\uc88c<<\u4f50<<\u5750<<\u5de6<<\u5ea7<<\u632b" - "<<\u5249<<\u75E4<<\u839D<<\u9AFD" - - "&\uc8c4<<\u7f6a" - - "&\uc8fc<<\u4e3b<<\u4f4f<<\u4f8f<<\u505a<<\u59dd<<\u80c4<<\u546a" - "<<\u5468<<\u55fe<<\u594f<<\u5b99<<\u5dde<<\u5eda<<\u665d<<\u6731" - "<<\u67f1<<\u682a<<\u6ce8<<\u6d32<<\u6e4a<<\u6f8d<<\u70b7<<\u73e0" - "<<\u7587<<\u7c4c<<\u7d02<<\u7d2c<<\u7da2<<\u821f<<\u86db<<\u8a3b" - "<<\u8a85<<\u8d70<<\u8e8a<<\u8f33<<\u9031<<\u914e<<\u9152<<\u9444<<\u99d0" - "<<\u4E1F<<\u4F9C<<\u5114<<\u5C0C<<\u5E6C<<\u62C4<<\u7843<<\u7C52<<\u8098<<\u8160" - "<<\u851F<<\u86C0<<\u88EF<<\u8A4B<<\u8CD9<<\u8D8E<<\u8F08<<\u9052<<\u9252<<\u970C<<\u9714<<\u9F04" - - "&\uc8fd<<\u7af9<<\u7ca5" - - "&\uc900<<\u4fca<<\u5101<<\u51c6<<\u57c8<<\u5bef<<\u5cfb<<\u6659" - "<<\u6a3d<<\u6d5a<<\u6e96<<\u6fec<<\u710c<<\u756f<<\u7ae3<<\u8822" - "<<\u9021<<\u9075<<\u96cb<<\u99ff" - "<<\u5642<<\u57FB<<\u58AB<<\u60F7<<\u6499<<\u76B4<<\u7DA7<<\u7F47<<\u8E06<<\u8E72<<\u940F<<\u96BC" - "<<\u9915<<\u9C52<<\u9D54" - - "&\uc904<<\u8301" - "<<\u4E7C" - - "&\uc911<<\u4e2d<<\u4ef2<<\u8846<<\u91cd" - "<<\u773E" - - "&\uc989<<\u537d" - "<<\u5373<<\u559E" - - "&\uc990<<\u6adb" - "<<\u9A2D" - - "&\uc999<<\u696b<<\u6c41<<\u847a<<\u6a9d<<\u857a" - - "&\uc99d<<\u589e<<\u618e<<\u66fe<<\u62ef<<\u70dd<<\u7511<<\u75c7" - "<<\u7e52<<\u84b8<<\u8b49<<\u8d08" - "<<\u5D92<<\u77F0<<\u7F7E" - - "&\uc9c0<<\u4e4b<<\u53ea<<\u54ab<<\u5730<<\u5740<<\u5fd7<<\u6301" - "<<\u6307<<\u646f<<\u652f<<\u65e8<<\u667a<<\u679d<<\u67b3<<\u6b62" - "<<\u6c60<<\u6c9a<<\u6f2c<<\u77e5<<\u7825<<\u7949<<\u7957<<\u7d19" - "<<\u80a2<<\u8102<<\u81f3<<\u829d<<\u82b7<<\u8718<<\u8a8c<<" - "\u8d04<<\u8dbe<<\u9072" - "<<\u577B<<\u5880<<\u627A<<\u69B0<<\u6CDC<<\u75E3<<\u79EA<<\u7BEA<<\u8210<<\u8E1F" - "<<\u8E93<<\u8EF9<<\u962F<<\u9BA8<<\u9DD9" - - "&\uc9c1<<\u76f4<<\u7a19<<\u7a37<<\u7e54<<\u8077" - "<<\u799D" - - "&\uc9c4<<\u5507<<\u55d4<<\u5875<<\u632f<<\u6422<<\u6649<<\u664b" - "<<\u686d<<\u699b<<\u6b84<<\u6d25<<\u6eb1<<\u73cd<<\u7468<<\u74a1" - "<<\u755b<<\u75b9<<\u76e1<<\u771e<<\u778b<<\u79e6<<\u7e09<<\u7e1d" - "<<\u81fb<<\u852f<<\u8897<<\u8a3a<<\u8cd1<<\u8eeb<<\u8fb0<<\u9032" - "<<\u93ad<<\u9663<<\u9673<<\u9707" - "<<\u4FB2<<\u5118<<\u73D2<<\u7A39<<\u84C1<<\u87B4<<\u8D81<<\u9241<<\u9B12" - - "&\uc9c8<<\u4f84<<\u53f1<<\u59ea<<\u5ac9<<\u5e19<<\u684e<<\u74c6" - "<<\u75be<<\u79e9<<\u7a92<<\u81a3<<\u86ed<<\u8cea<<\u8dcc<<\u8fed" - "<<\u57A4<<\u7D70<<\u84BA<<\u90C5<<\u9455" - - "&\uc9d0<<\u659f<<\u6715" - "<<\u9D06" - - "&\uc9d1<<\u57f7<<\u6f57<<\u7ddd<<\u8f2f<<\u93f6<<\u96c6" - "<<\u54A0<<\u6222" - - "&\uc9d5<<\u5fb5<<\u61f2<<\u6f84" - "<<\u6F82<<\u7013<<\u7665<<\u77AA" - - "&\ucc28<<\u4e14<<\u4f98<<\u501f<<\u53c9<<\u55df<<\u5d6f<<\u5dee" - "<<\u6b21<<\u6b64<<\u78cb<<\u7b9a<<\u8e49<<\u8eca<<\u906e" - "<<\u4F7D<<\u5056<<\u5953<<\u5C94<<\u5FA3<<\u69CE<<\u7473<<\u7868" - - "&\ucc29<<\u6349<<\u643e<<\u7740<<\u7a84<<\u932f<<\u947f<<\u9f6a" - "<<\u6233<<\u64C9<<\u65B2" - - "&\ucc2c<<\u64b0<<\u6faf<<\u71e6<<\u74a8<<\u74da<<\u7ac4<<\u7c12" - "<<\u7e82<<\u7cb2<<\u7e98<<\u8b9a<<\u8d0a<<\u947d<<\u9910<<\u994c" - "<<\u5127<<\u5139<<\u5297<<\u5DD1<<\u6522<<\u6B11<<\u7228<<\u8DB2" - - "&\ucc30<<\u5239<<\u5bdf<<\u64e6<<\u672d<<\u7d2e" - "<<\u624E<<\u62F6" - - "&\ucc38<<\u50ed<<\u53c3<<\u5879<<\u6158<<\u6159<<\u61fa<<\u65ac" - "<<\u7ad9<<\u8b92<<\u8b96" - "<<\u5133<<\u53C5<<\u5D84<<\u5DC9<<\u615A<<\u61AF<<\u6519<<\u69E7<<\u6B03<<\u6BDA" - "<<\u8B56<<\u93E8<<\u9471<<\u995E<<\u9A42<<\u9EF2" - - "&\ucc3d<<\u5009<<\u5021<<\u5275<<\u5531<<\u5a3c<<\u5ee0<<\u5f70" - "<<\u6134<<\u655e<<\u660c<<\u6636<<\u66a2<<\u69cd<<\u6ec4<<\u6f32" - "<<\u7316<<\u7621<<\u7a93<<\u8139<<\u8259<<\u83d6<<\u84bc" - "<<\u5000<<\u5096<<\u51D4<<\u5231<<\u60B5<<\u60DD<<\u6227<<\u6436<<\u6919<<\u6C05" - "<<\u7472<<\u7A97<<\u7ABB<<\u8E4C<<\u92F9<<\u9306<<\u95B6<<\u9B2F<<\u9DAC" - - "&\ucc44<<\u50b5<<\u57f0<<\u5bc0<<\u5be8<<\u5f69<<\u63a1<<\u7826" - "<<\u7db5<<\u83dc<<\u8521<<\u91c7<<\u91f5" - "<<\u68CC<<\u831D" - - "&\ucc45<<\u518a<<\u67f5<<\u7b56<<\u8cac" - "<<\u5616<<\u5E58<<\u78D4<<\u7B27<<\u7C00<<\u86B1" - - "&\ucc98<<\u51c4<<\u59bb<<\u60bd<<\u8655" - "<<\u6DD2<<\u840B<<\u8904<<\u89B7<<\u90EA" - - "&\ucc99<<\u501c<<\u5254<<\u5c3a<<\u617d<<\u621a<<\u62d3" - "<<\u64f2<<\u65a5<<\u6ecc<<\u7620<<\u810a<<\u8e60<<\u965f<<\u96bb" - "<<\u544E<<\u5767<<\u5849<<\u60D5<<\u6357<<\u646D<<\u8734<<\u8DD6<<\u8E91" - - "&\ucc9c<<\u4edf<<\u5343<<\u5598<<\u5929<<\u5ddd<<\u64c5<<\u6cc9" - "<<\u6dfa<<\u7394<<\u7a7f<<\u821b<<\u85a6<<\u8ce4<<\u8e10<<\u9077" - "<<\u91e7<<\u95e1<<\u9621<<\u97c6" - "<<\u4FF4<<\u5029<<\u50E2<<\u5103<<\u6D0A<<\u6FFA<<\u74E9<<\u7946<<\u7C81<<\u81F6<<\u828A" - "<<\u831C<<\u8350<<\u84A8<<\u8546<<\u8695<<\u8FBF<<\u975D" - - "&\ucca0<<\u51f8<<\u54f2<<\u5586<<\u5fb9<<\u64a4<<\u6f88<<\u7db4" - "<<\u8f1f<<\u8f4d<<\u9435" - "<<\u525F<<\u555C<<\u57D1<<\u60D9<<\u6387<<\u6B60<<\u9295<<\u9323<<\u98FB<<\u992E" - - "&\ucca8<<\u50c9<<\u5c16<<\u6cbe<<\u6dfb<<\u751b<<\u77bb<<\u7c3d" - "<<\u7c64<<\u8a79<<\u8ac2" - "<<\u5E68<<\u5FDD<<\u60C9<<\u6A90<<\u6AFC<<\u7038<<\u7C37<<\u895C" - - "&\ucca9<<\u581e<<\u59be<<\u5e16<<\u6377<<\u7252<<\u758a<<\u776b" - "<<\u8adc<<\u8cbc<<\u8f12" - "<<\u5022<<\u546B<<\u558B<<\u6017<<\u893A" - - "&\uccad<<\u5ef3<<\u6674<<\u6df8<<\u807d<<\u83c1<<\u8acb<<\u9751<<\u9bd6" - "<<\u51CA<<\u570A<<\u873B<<\u9D84" - - "&\uccb4<<\u5243<<\u66ff<<\u6d95<<\u6eef<<\u7de0<<\u8ae6" - "<<\u902e<<\u905e<<\u9ad4" - "<<\u568F<<\u5F58<<\u68E3<<\u6BA2<<\u780C<<\u8482<<\u8515<<\u855E<<\u8EC6<<\u9746<<\u9AF0" - - "&\ucd08<<\u521d<<\u527f<<\u54e8<<\u6194<<\u6284<<\u62db<<\u68a2" - "<<\u6912<<\u695a<<\u6a35<<\u7092<<\u7126<<\u785d<<\u7901<<\u790e" - "<<\u79d2<<\u7a0d<<\u8096<<\u8278<<\u82d5<<\u8349<<\u8549<<\u8c82" - "<<\u8d85<<\u9162<<\u918b<<\u91ae" - "<<\u5062<<\u50EC<<\u52AD<<\u52E6<<\u564D<<\u5AF6<<\u5CA7<<\u5CED<<\u5D95<<\u600A<<\u6084" - "<<\u6100<<\u676A<<\u71CB<<\u7D83<<\u8016<<\u8A9A<<\u8B59<<\u8DA0<<\u8EFA<<\u8FE2<<\u9214" - "<<\u936B<<\u936C<<\u9798<<\u9866<<\u9AEB<<\u9DE6<<\u9F60" - - "&\ucd09<<\u4fc3<<\u56d1<<\u71ed<<\u77d7<<\u8700<<\u89f8" - "<<\u66EF<<\u7225<<\u77DA<<\u85A5<<\u8E85<<\u9AD1" - - "&\ucd0c<<\u5bf8<<\u5fd6<<\u6751<<\u90a8" - "<<\u540B" - - "&\ucd1d<<\u53e2<<\u585a<<\u5bf5<<\u60a4<<\u6181<<\u6460<<\u7e3d" - "<<\u8070<<\u8525<<\u9283" - "<<\u8471<<\u84EF<<\u93E6<<\u9A18<<\u9A44" - - "&\ucd2c<<\u64ae" - - "&\ucd5c<<\u50ac<<\u5d14<<\u6700" - "<<\u562C<<\u6467<<\u69B1<<\u6F3C<<\u7480<<\u78EA<<\u7E17<<\u8127" - - "&\ucd94<<\u589c<<\u62bd<<\u63a8<<\u690e<<\u6978<<\u6a1e<<\u6e6b" - "<<\u76ba<<\u79cb<<\u82bb<<\u8429<<\u8acf<<\u8da8<<\u8ffd<<\u9112" - "<<\u914b<<\u919c<<\u9310<<\u9318<<\u939a<<\u96db<<\u9a36<<\u9c0d" - "<<\u50E6<<\u557E<<\u5A35<<\u5E1A<<\u60C6<<\u6376<<\u63EB<<\u6425<<\u7503<<\u7633" - "<<\u9F9D<<\u7B92<<\u7BA0<<\u7C09<<\u7E0B<<\u7E10<<\u84AD<<\u966C<<\u96B9<<\u97A6" - "<<\u9A05<<\u9B4B<<\u9C0C<<\u9D7B<<\u9D96<<\u9DB5<<\u9E84<<\u9EA4" - - "&\ucd95<<\u4e11<<\u755c<<\u795d<<\u7afa<<\u7b51<<\u7bc9<<\u7e2e" - "<<\u84c4<<\u8e59<<\u8e74<<\u8ef8<<\u9010" - "<<\u59AF<<\u8233<<\u8C56<<\u8E5C<<\u9F00" - - "&\ucd98<<\u6625<<\u693f<<\u7443" - - "&\ucd9c<<\u51fa<<\u672e<<\u9edc" - "<<\u79EB" - - "&\ucda9<<\u5145<<\u5fe0<<\u6c96<<\u87f2<<\u885d<<\u8877" - "<<\u51B2<<\u5FE1<<\u73EB" - - "&\ucdcc<<\u60b4<<\u81b5<<\u8403<<\u8d05" - "<<\u60F4<<\u63E3<<\u75A9<<\u7601<<\u9847" - - "&\ucde8<<\u53d6<<\u5439<<\u5634<<\u5a36<<\u5c31<<\u708a<<\u7fe0" - "<<\u805a<<\u8106<<\u81ed<<\u8da3<<\u9189<<\u9a5f<<\u9df2" - "<<\u51A3<<\u6A47<<\u6BF3" - - "&\uce21<<\u5074<<\u4ec4<<\u53a0<<\u60fb<<\u6e2c" - "<<\u5EC1<<\u6603" - - "&\uce35<<\u5c64" - - "&\uce58<<\u4f88<<\u5024<<\u55e4<<\u5cd9<<\u5e5f<<\u6065<<\u6894" - "<<\u6cbb<<\u6dc4<<\u71be<<\u75d4<<\u75f4<<\u7661<<\u7a1a<<\u7a49" - "<<\u7dc7<<\u7dfb<<\u7f6e<<\u81f4<<\u86a9<<\u8f1c<<\u96c9<<\u99b3" - "<<\u9f52" - "<<\u536E<<\u54C6<<\u5BD8<<\u5DF5<<\u7564<<\u75D3<<\u7D7A<<\u83D1<<\u8599<<\u892B" - "<<\u8C78<<\u8DF1<<\u9319<<\u9624<<\u9BD4<<\u9D19<<\u9D1F<<\u9D44" - - "&\uce59<<\u5247<<\u52c5<<\u98ed" - "<<\u6555" - - "&\uce5c<<\u89aa" - "<<\u6AEC<<\u85FD<<\u896F<<\u9F54" - - "&\uce60<<\u4e03<<\u67d2<<\u6f06" - - "&\uce68<<\u4fb5<<\u5be2<<\u6795<<\u6c88<<\u6d78<<\u741b<<\u7827" - "<<\u91dd<<\u937c" - "<<\u5BD6<<\u5FF1<<\u6939<<\u6C89<<\u90F4<<\u92DF<<\u99F8" - - "&\uce69<<\u87c4" - - "&\uce6d<<\u79e4<<\u7a31" - - "&\ucf8c<<\u5feb" - "<<\u5672<<\u592C" - - "&\ud0c0<<\u4ed6<<\u54a4<<\u553e<<\u58ae<<\u59a5<<\u60f0<<\u6253" - "<<\u62d6<<\u6736<<\u6955<<\u8235<<\u9640<<\u99b1<<\u99dd" - "<<\u4F57<<\u579E<<\u62D5<<\u67C1<<\u6A62<<\u6CB1<<\u8A6B<<\u8DCE<<\u8EB1" - "<<\u99DE<<\u9B80<<\u9D15<<\u9F09" - - "&\ud0c1<<\u502c<<\u5353<<\u5544<<\u577c<<\u6258<<" - "\u64e2<<\u666b<<\u67dd<<\u6fc1<<\u6fef<<\u7422<<\u7438<<\u8a17" - "<<\u9438" - "<<\u62C6<<\u6A50<<\u6CB0<<\u6DBF<<\u77FA<<\u7C5C<<\u8600<<\u8E14<<\u9034" - - "&\ud0c4<<\u5451<<\u5606<<\u5766<<\u5f48<<\u619a<<\u6b4e<<\u7058" - "<<\u70ad<<\u7dbb<<\u8a95" - "<<\u61BB<<\u6524<<\u6BAB<<\u7671<<\u9A52" - - "&\ud0c8<<\u596a<<\u812b" - "<<\u4FBB" - - "&\ud0d0<<\u63a2<<\u7708<<\u803d<<\u8caa" - "<<\u55FF<<\u5FD0<<\u9156" - - "&\ud0d1<<\u5854<<\u642d<<\u69bb" - "<<\u509D<<\u584C<<\u6428" - - "&\ud0d5<<\u5b95<<\u5e11<<\u6e6f<<\u8569" - "<<\u71D9<<\u76EA<<\u78AD<<\u862F" - - "&\ud0dc<<\u514c<<\u53f0<<\u592a<<\u6020<<\u614b<<\u6b86<<\u6c70" - "<<\u6cf0<<\u7b1e<<\u80ce<<\u82d4<<\u8dc6<<\u90b0<<\u98b1" - "<<\u57ED<<\u5A27<<\u5B61<<\u62AC<<\u8FE8<<\u99C4<<\u99D8" - - "&\ud0dd<<\u64c7<<\u6fa4" - - "&\ud0f1<<\u6491" - "<<\u6490<<\u725A" - - "&\ud130<<\u6504" - - "&\ud1a0<<\u514e<<\u5410<<\u571f<<\u8a0e" - - "&\ud1a4<<\u564B<<\u5678<<\u74F2" - - "&\ud1b5<<\u615f<<\u6876<<\u75db<<\u7b52<<\u7d71<<\u901a" - "<<\u606B<<\u6A0B<<\u7B69" - - "&\ud1f4<<\u5806<<\u69cc<<\u817f<<\u892a<<\u9000<<\u9839" - "<<\u96A4" - - "&\ud22c<<\u5078<<\u5957<<\u59ac<<\u6295<<\u900f<<\u9b2a" - "<<\u5992<<\u6E1D<<\u9AB0" - - "&\ud241<<\u4F5F" - - "&\ud2b9<<\u615d<<\u7279" - "<<\u5FD2" - - "&\ud2c8<<\u95d6" - - "&\ud30c<<\u5761<<\u5a46<<\u5df4<<\u628a<<\u64ad<<\u64fa<<\u6777" - "<<\u6ce2<<\u6d3e<<\u722c<<\u7436<<\u7834<<\u7f77<<\u82ad<<\u8ddb" - "<<\u9817" - "<<\u53F5<<\u5991<<\u5CA5<<\u6015<<\u705E<<\u7238<<\u73BB<<\u76A4<<\u7B06<<\u7C38" - "<<\u8019<<\u83E0<<\u8469<<\u9131" - - "&\ud310<<\u5224<<\u5742<<\u677f<<\u7248<<\u74e3<<\u8ca9<<\u8fa6" - "<<\u9211<<\u962a" - "<<\u6C74" - - "&\ud314<<\u516b<<\u53ed<<\u634c" - "<<\u6733<<\u6C43" - - "&\ud328<<\u4f69<<\u5504<<\u6096<<\u6557<<\u6c9b<<\u6d7f<<\u724c" - "<<\u72fd<<\u7a17<<\u8987<<\u8c9d" - "<<\u5B5B<<\u65C6<<\u73EE<<\u9708<<\u9738" - - "&\ud33d<<\u5f6d<<\u6f8e<<\u70f9<<\u81a8" - "<<\u7830<<\u794A<<\u87DA<<\u87DB" - - "&\ud345<<\u610e" - - "&\ud3b8<<\u4fbf<<\u504f<<\u6241<<\u7247<<\u7bc7<<\u7de8<<\u7fe9" - "<<\u904d<<\u97ad<<\u9a19" - "<<\u533E<<\u5FA7<<\u60FC<<\u7DF6<<\u8251<<\u8439<<\u8759<<\u890A<<\u8ADE" - - "&\ud3c4<<\u8cb6" - "<<\u782D<<\u7A86" - - "&\ud3c9<<\u576a<<\u5e73<<\u67b0<<\u840d<<\u8a55" - "<<\u6026<<\u62A8<<\u6CD9<<\u82F9<<\u84F1<<\u9B83" - - "&\ud3d0<<\u5420<<\u5b16<<\u5e63<<\u5ee2<<\u5f0a<<\u6583<<\u80ba" - "<<\u853d<<\u9589<<\u965b" - "<<\u655D<<\u72F4<<\u7358<<\u7648" - - "&\ud3ec<<\u4f48<<\u5305<<\u530d<<\u530f<<\u5486<<\u54fa<<\u5703" - "<<\u5e03<<\u6016<<\u629b<<\u62b1<<\u6355<<\u6ce1<<\u6d66" - "<<\u75b1<<\u7832<<\u80de<<\u812f<<\u82de<<\u8461<<\u84b2<<\u888d" - "<<\u8912<<\u900b<<\u92ea<<\u98fd<<\u9b91" - "<<\u5124<<\u5E96<<\u6661<<\u66D3<<\u70AE<<\u70B0<<\u8216<<\u8AA7<<\u924B<<\u9784<<\u9914<<\u9BC6" - - "&\ud3ed<<\u5e45<<\u66b4<<\u66dd<<\u7011<<\u7206" - - "&\ud45c<<\u4ff5<<\u527d<<\u5f6a<<\u6153<<\u6753<<\u6a19<<\u6f02" - "<<\u74e2<<\u7968<<\u8868<<\u8c79<<\u98c7<<\u98c4<<\u9a43" - "<<\u50C4<<\u52E1<<\u560C<<\u5AD6<<\u647D<<\u6B8D<<\u719B<<\u7E39<<\u88F1<<\u93E2<<\u9463<<\u9ADF<<\u9C3E" - - "&\ud488<<\u54c1<<\u7a1f" - "<<\u7980" - - "&\ud48d<<\u6953<<\u8af7<<\u8c4a<<\u98a8<<\u99ae" - "<<\u760B<<\u8451" - - "&\ud53c<<\u5f7c<<\u62ab<<\u75b2<<\u76ae<<\u88ab<<\u907f<<\u9642" - "<<\u8A56<<\u8F9F<<\u9781<<\u9AF2" - - "&\ud53d<<\u8177" - - "&\ud544<<\u5339<<\u5f3c<<\u5fc5<<\u6ccc<<\u73cc<<\u7562<<\u758b" - "<<\u7b46<<\u82fe<<\u999d" - "<<\u4F56<<\u5487<<\u6EED<<\u7BF3<<\u7F7C<<\u84FD<<\u89F1<<\u8E55<<\u97B8<<\u97E0<<\u99DC<<\u9D6F" - - "&\ud54d<<\u4e4f<<\u903c" - "<<\u506A" - - "&\ud558<<\u4e0b<<\u4f55<<\u53a6<<\u590f<<\u5ec8<<\u6630<<\u6cb3" - "<<\u7455<<\u8377<<\u8766<<\u8cc0<<\u9050<<\u971e<<\u9c15" - "<<\u5440<<\u5687<<\u5C88<<\u61D7<<\u7146<<\u7615<<\u7F45<<\u935C" - - "&\ud559<<\u58d1<<\u5b78<<\u8650<<\u8b14<<\u9db4" - "<<\u72E2<<\u7627<<\u76AC<<\u786E<<\u90DD<<\u9DFD" - - "&\ud55c<<\u5bd2<<\u6068<<\u608d<<\u65f1<<\u6c57<<\u6f22<<\u6fa3" - "<<\u701a<<\u7f55<<\u7ff0<<\u9591<<\u9592<<\u9650<<\u97d3" - "<<\u50E9<<\u5AFA<<\u5AFB<<\u634D<<\u66B5<<\u9588<<\u99FB<<\u9DF3<<\u9F3E" - - "&\ud560<<\u5272<<\u8f44" - "<<\u778E" - - "&\ud568<<\u51fd<<\u542b<<\u54b8<<\u5563<<\u558a<<\u6abb<<\u6db5" - "<<\u7dd8<<\u8266<<\u929c<<\u9677<<\u9e79" - "<<\u839F<<\u83E1<<\u8AF4<<\u8F5E<<\u95DE" - - "&\ud569<<\u5408<<\u54c8<<\u76d2<<\u86e4<<\u95a4<<\u95d4<<\u965c" - "<<\u530C<<\u55D1<<\u67D9<<\u69BC<<\u6E98<<\u76CD<<\u90C3" - - "&\ud56d<<\u4ea2<<\u4f09<<\u59ee<<\u5ae6<<\u5df7<<\u6052<<\u6297" - "<<\u676d<<\u6841<<\u6c86<<\u6e2f<<\u7f38<<\u809b<<\u822a<<" - "\u9805" - "<<\u592F<<\u6046<<\u7095<<\u7F3F<<\u980F" - - "&\ud574<<\u4ea5<<\u5055<<\u54b3<<\u5793<<\u595a<<\u5b69<<\u5bb3" - "<<\u61c8<<\u6977<<\u6d77<<\u7023<<\u87f9<<\u89e3<<\u8a72<<\u8ae7" - "<<\u9082<<\u99ed<<\u9ab8" - "<<\u548D<<\u5DB0<<\u5EE8<<\u6B2C<<\u736C<<\u744E<<\u75CE<<\u85A4<<\u91A2<<\u9826<<\u9BAD" - - "&\ud575<<\u52be<<\u6838" - "<<\u7FEE<<\u8988" - - "&\ud589<<\u5016<<\u5e78<<\u674f<<\u8347<<\u884c" - "<<\u60BB" - - "&\ud5a5<<\u4eab<<\u5411<<\u56ae<<\u73e6<<\u9115<<\u97ff<<\u9909" - "<<\u9957<<\u9999" - "<<\u858C" - - "&\ud5c8<<\u5653<<\u589f<<\u865b<<\u8a31" - "<<\u6B54" - - "&\ud5cc<<\u61b2<<\u6af6<<\u737b<<\u8ed2" - "<<\u5DDA<<\u5E70<<\u6507" - - "&\ud5d0<<\u6b47" - - "&\ud5d8<<\u96aa<<\u9a57" - "<<\u5DAE<<\u736B<<\u7381" - - "&\ud601<<\u5955<<\u7200<<\u8d6b<<\u9769" - "<<\u5F08<<\u6D2B<<\u7131<<\u9B29" - - "&\ud604<<\u4fd4<<\u5cf4<<\u5f26<<\u61f8<<\u665b<<\u6ceb<<\u70ab" - "<<\u7384<<\u73b9<<\u73fe<<\u7729<<\u774d<<\u7d43<<\u7d62<<\u7e23" - "<<\u8237<<\u8852<<\u8ce2<<\u9249<<\u986f" - "<<\u5107<<\u5B1B<<\u6621<<\u7404<<\u75C3<<\u770C<<\u7E6F<<\u7FFE<<\u8706<<\u8AA2<<\u92D7<<\u99FD" - - "&\ud608<<\u5b51<<\u7a74<<\u8840<<\u9801" - "<<\u7D5C<<\u8D90" - - "&\ud610<<\u5acc" - - "&\ud611<<\u4fe0<<\u5354<<\u593e<<\u5cfd<<\u633e<<\u6d79<<\u72f9" - "<<\u8105<<\u8107<<\u83a2<<\u92cf<<\u9830" - "<<\u5327<<\u53F6<<\u57C9<<\u604A<<\u608F<<\u611C<<\u7BCB" - - "&\ud615<<\u4ea8<<\u5144<<\u5211<<\u578b<<\u5f62<<\u6cc2<<\u6ece" - "<<\u7005<<\u7050<<\u70af<<\u7192<<\u73e9<<\u7469<<\u834a<<\u87a2" - "<<\u8861<<\u9008<<\u90a2<<\u93a3<<\u99a8" - "<<\u5910<<\u5A19<<\u8A57<<\u8FE5<<\u9658" - - "&\ud61c<<\u516e<<\u5f57<<\u60e0<<\u6167<<\u66b3<<\u8559<<\u8e4a" - "<<\u91af<<\u978b" - "<<\u5092<<\u5612<<\u5BED<<\u5FAF<<\u69E5<<\u76FB<<\u8B11<<\u8B7F" - - "&\ud638<<\u4e4e<<\u4e92<<\u547c<<\u58d5<<\u58fa<<\u597d<<\u5cb5" - "<<\u5f27<<\u6236<<\u6248<<\u660a<<\u6667<<\u6beb<<\u6d69<<\u6dcf" - "<<\u6e56<<\u6ef8<<\u6f94<<\u6fe0<<\u6fe9<<\u705d<<\u72d0<<\u7425" - "<<\u745a<<\u74e0<<\u7693<<\u795c<<\u7cca<<\u7e1e<<\u80e1<<\u82a6" - "<<\u846b<<\u84bf<<\u864e<<\u865f<<\u8774<<\u8b77<<\u8c6a<<\u93ac" - "<<\u9800<<\u9865" - "<<\u512B<<\u51B1<<\u5637<<\u5AED<<\u5AEE<<\u6019<<\u6C8D<<\u6EC8<<\u6EEC<<\u7292" - "<<\u7322<<\u769C<<\u769E<<\u7B8E<<\u8055<<\u9190<<\u992C<<\u9B0D" - - "&\ud639<<\u60d1<<\u6216<<\u9177" - - "&\ud63c<<\u5a5a<<\u660f<<\u6df7<<\u6e3e<<\u743f<<\u9b42" - "<<\u5702<<\u60DB<<\u6EB7<<\u711C<<\u95BD" - - "&\ud640<<\u5ffd<<\u60da<<\u7b0f" - "<<\u56EB" - - "&\ud64d<<\u54c4<<\u5f18<<\u6c5e<<\u6cd3<<\u6d2a<<\u70d8<<\u7d05" - "<<\u8679<<\u8a0c<<\u9d3b" - "<<\u664E<<\u6F92<<\u7BCA<<\u9277<<\u9B28" - - "&\ud654<<\u5316<<\u548c<<\u5b05<<\u6a3a<<\u706b<<\u7575<<\u798d" - "<<\u79be<<\u82b1<<\u83ef<<\u8a71<<\u8b41<<\u8ca8<<\u9774" - "<<\u4FF0<<\u5629<<\u5A72<<\u64ED<<\u756B<<\u9A4A<<\u9FA2" - //"<<\ud655" - "&\ud655" - "<<\u64f4<<\u652b<<\u78ba<<\u78bb<<\u7a6b" - "<<\u77CD<<\u77E1<<\u792D<<\u944A" - - "&\ud658<<\u4e38<<\u559a<<\u5950<<\u5ba6<<\u5e7b<<\u60a3<<\u63db" - "<<\u6b61<<\u6665<<\u6853<<\u6e19<<\u7165<<\u74b0<<\u7d08<<\u9084" - "<<\u9a69<<\u9c25" - "<<\u5BF0<<\u61FD<<\u64D0<<\u74DB<<\u7696<<\u7746<<\u7D59<<\u8C62<<\u8F58<<\u9370<<\u9436<<\u9B1F" - - "&\ud65c<<\u6d3b<<\u6ed1<<\u733e<<\u8c41<<\u95ca" - "<<\u86DE" - - "&\ud669<<\u51f0<<\u5e4c<<\u5fa8<<\u604d<<\u60f6<<\u6130<<\u614c" - "<<\u6643<<\u6644<<\u69a5<<\u6cc1<<\u6e5f<<\u6ec9<<\u6f62<<\u714c" - "<<\u749c<<\u7687<<\u7bc1<<\u7c27<<\u8352<<\u8757<<\u9051<<\u968d" - "<<\u9ec3" - "<<\u55A4<<\u5A93<<\u6033<<\u745D<<\u8093<<\u8CBA<<\u93A4" - - "&\ud68c<<\u532f<<\u56de<<\u5efb<<\u5f8a<<\u6062<<\u6094<<\u61f7" - "<<\u6666<<\u6703<<\u6a9c<<\u6dee<<\u6fae<<\u7070<<\u736a<<\u7e6a" - "<<\u81be<<\u8334<<\u86d4<<\u8aa8<<\u8cc4" - "<<\u4F6A<<\u6803<<\u6D04<<\u6ED9<<\u76D4<<\u8A7C<<\u8FF4<<\u982E<<\u9C60" - - "&\ud68d<<\u5283<<\u7372" - "<<\u5684" - - "&\ud6a1<<\u5b96<<\u6a6b<<\u9404" - "<<\u6F8B<<\u921C<<\u9ECC" - - "&\ud6a8<<\u54ee<<\u5686<<\u5b5d<<\u6548<<\u6585<<\u66c9<<\u689f" - "<<\u6d8d<<\u6dc6<<\u723b<<\u80b4<<\u9175<<\u9a4d" - "<<\u509A<<\u56C2<<\u5D24<<\u6BBD<<\u7187<<\u769B<<\u8653<<\u991A" - - "&\ud6c4<<\u4faf<<\u5019<<\u539a<<\u540e<<\u543c<<\u5589<<\u55c5" - "<<\u5e3f<<\u5f8c<<\u673d<<\u7166<<\u73dd<<\u9005" - "<<\u543D<<\u55A3<<\u5795<<\u5820<<\u6DB8<<\u7334<<\u7BCC<<\u8A61<<\u8B43<<\u9157<<\u9931" - - "&\ud6c8<<\u52db<<\u52f3<<\u5864<<\u58ce<<\u7104<<\u718f<<\u71fb" - "<<\u85b0<<\u8a13<<\u6688" - "<<\u66DB<<\u720B<<\u736F<<\u7E81<<\u8477<<\u9442" - - "&\ud6cc<<\u6B3B" - - "&\ud6d9<<\u85a8" - - "&\ud6e4<<\u55a7<<\u6684<<\u714a<<\u8431" - "<<\u70DC<<\u8AE0<<\u8AFC" - - "&\ud6fc<<\u5349<<\u5599<<\u6bc1" - "<<\u71EC<<\u8294<<\u866B<<\u867A" - - "&\ud718<<\u5f59<<\u5fbd<<\u63ee<<\u6689<<\u7147<<\u8af1<<\u8f1d<<\u9ebe" - "<<\u649D<<\u7FEC" - - "&\ud734<<\u4f11<<\u643a<<\u70cb<<\u7566<<\u8667" - "<<\u54BB<<\u64D5<<\u96B3<<\u9AF9<<\u9D42" - - "&\ud73c<<\u6064<<\u8b4e<<\u9df8" - "<<\u5379" - - "&\ud749<<\u5147<<\u51f6<<\u5308<<\u6d36<<\u80f8" - "<<\u605F<<\u80F7" - - "&\ud751<<\u9ed1" - - "&\ud754<<\u6615<<\u6b23<<\u7098<<\u75d5" - "<<\u5F88<<\u5FFB<<\u6380<<\u712E<<\u8A22<<\u91C1" - - "&\ud758<<\u5403<<\u5c79<<\u7d07<<\u8a16" - "<<\u4EE1<<\u6C54<<\u7599<<\u8FC4<<\u9F55" - - "&\ud760<<\u6b20<<\u6b3d<<\u6b46" - "<<\u5EDE" - - "&\ud761<<\u5438<<\u6070<<\u6d3d<<\u7fd5" - "<<\u564F<<\u6B59<<\u6F5D<<\u7FD6" - - "&\ud765<<\u8208" - - "&\ud76c<<\u50d6<<\u51de<<\u559c<<\u566b<<\u56cd<<\u59ec<<\u5b09" - "<<\u5e0c<<\u6199<<\u6198<<\u6231<<\u665e<<\u66e6<<\u7199<<\u71b9" - "<<\u71ba<<\u72a7<<\u79a7<<\u7a00<<\u7fb2" - "<<\u54A5<<\u550F<<\u563B<<\u6095<<\u6232<<\u66BF<<\u6B37<<\u71F9<<\u7214<<\u8C68<<\u993C" - - "&\ud790<<\u8a70<<\u72b5<<\u7e88<<\u896d<<\u9821<<\u9ee0" - } - } - Countries { - AD { "\uc548\ub3c4\ub77c" } - AE { "\uc544\ub78d\uc5d0\ubbf8\ub9ac\ud2b8" } - AF { "\uc544\ud504\uac00\ub2c8\uc2a4\ud0c4" } - AG { "\uc564\ud2f0\uac00 \ubc14\ubd80\ub2e4" } - AI { "\uc548\uae38\ub77c" } - AL { "\uc54c\ubc14\ub2c8\uc544" } - AM { "\uc544\ub974\uba54\ub2c8\uc544" } - AN { "\ub124\ub35c\ub780\ub4dc\ub839 \uc548\ud2f8\ub808\uc2a4" } - AO { "\uc559\uace8\ub77c" } - AQ { "\ub0a8\uadf9 \ub300\ub959" } - AR { "\uc544\ub974\ud5e8\ud2f0\ub098" } - AS { "\uc544\uba54\ub9ac\uce78 \uc0ac\ubaa8\uc544" } - AT { "\uc624\uc2a4\ud2b8\ub9ac\uc544" } - AU { "\uc624\uc2a4\ud2b8\ub808\uc77c\ub9ac\uc544" } - AW { "\uc544\ub8e8\ubc14" } - AZ { "\uc544\uc81c\ub974\ubc14\uc774\uc794" } - BA { "\ubcf4\uc2a4\ub2c8\uc544 \ud5e4\ub974\uccb4\uace0\ube44\ub098" } - BB { "\ubc14\ubca0\uc774\ub3c4\uc2a4" } - BD { "\ubc29\uae00\ub77c\ub370\uc2dc" } - BE { "\ubca8\uae30\uc5d0" } - BF { "\ubd80\ub974\ud0a4\ub098\ud30c\uc18c" } - BG { "\ubd88\uac00\ub9ac\uc544" } - BH { "\ubc14\ub808\uc778" } - BI { "\ubd80\ub8ec\ub514" } - BJ { "\ubca0\ub139" } - BM { "\ubc84\ubba4\ub2e4" } - BN { "\ube0c\ub8e8\ub098\uc774" } - BO { "\ubcfc\ub9ac\ube44\uc544" } - BR { "\ube0c\ub77c\uc9c8" } - BS { "\ubc14\ud558\ub9c8" } - BT { "\ubd80\ud0c4" } - BV { "\ubd80\ubca0" } - BW { "\ubcf4\uce20\uc640\ub098" } - BY { "\ubca8\ub77c\ub8e8\uc2a4" } - BZ { "\ubca8\ub9ac\uc988" } - CA { "\uce90\ub098\ub2e4" } - CC { "\ucf54\ucf54\uc2a4\uc81c\ub3c4" } - CD { "\ucf69\uace0\ubbfc\uc8fc\uacf5\ud654\uad6d" } - CF { "\uc911\uc559 \uc544\ud504\ub9ac\uce74" } - CG { "\ucf69\uace0" } - CH { "\uc2a4\uc704\uc2a4" } - CI { "\ucf54\ud2b8\ub514\ubd80\uc640\ub974" } - CK { "\ucfe1\uc81c\ub3c4" } - CL { "\uce60\ub808" } - CM { "\uce74\uba54\ub8ec" } - CN { "\uc911\uad6d" } - CO { "\ucf5c\ub86c\ube44\uc544" } - CR { "\ucf54\uc2a4\ud0c0\ub9ac\uce74" } - CU { "\ucfe0\ubc14" } - CV { "\uae4c\ubf40\ubca0\ub974\ub370" } - CY { "\uc0ac\uc774\ud504\ub7ec\uc2a4" } - CZ { "\uccb4\ucf54" } - DE { "\ub3c5\uc77c" } - DJ { "\uc9c0\ubd80\ud2f0" } - DK { "\ub374\ub9c8\ud06c" } - DM { "\ub3c4\ubbf8\ub2c8\uce74" } - DO { "\ub3c4\ubbf8\ub2c8\uce74 \uacf5\ud654\uad6d" } - DZ { "\uc54c\uc81c\ub9ac" } - EC { "\uc5d0\ucfe0\uc544\ub3c4\ub974" } - EE { "\uc5d0\uc2a4\ud1a0\ub2c8\uc544" } - EG { "\uc774\uc9d1\ud2b8" } - EH { "\uc11c\uc0ac\ud558\ub77c" } - ER { "\uc5d0\ub9ac\ud2b8\ub9ac\uc544" } - ES { "\uc2a4\ud398\uc778" } - ET { "\uc774\ub514\uc624\ud53c\uc544" } - FI { "\ud540\ub780\ub4dc" } - FJ { "\ud53c\uc9c0" } - FK { "\ud3ec\ud074\ub79c\ub4dc\uc81c\ub3c4" } - FM { "\ub9c8\uc774\ud06c\ub85c\ub124\uc2dc\uc544" } - FO { "\ud398\ub85c\uc81c\ub3c4" } - FR { "\ud504\ub791\uc2a4" } - GA { "\uac00\ubd09" } - GB { "\uc601\uad6d" } - GD { "\uadf8\ub808\ub098\ub2e4" } - GE { "\uadf8\ub8e8\uc9c0\uc57c" } - GF { "\ud504\ub791\uc2a4\ub839 \uae30\uc544\ub098" } - GH { "\uac00\ub098" } - GI { "\uc9c0\ube0c\ub864\ud130" } - GL { "\uadf8\ub9b0\ub780\ub4dc" } - GM { "\uac10\ube44\uc544" } - GN { "\uae30\ub2c8" } - GP { "\uacfc\ub2ec\ub85c\ud504" } - GQ { "\uc801\ub3c4 \uae30\ub2c8" } - GR { "\uadf8\ub9ac\uc2a4" } - GS { "\uc0ac\uc6b0\uc2a4\uc870\uc9c0\uc544-\uc0ac\uc6b0\uc2a4\uc0cc\ub4dc\uc704\uce58\uc81c\ub3c4" } - GT { "\uacfc\ud14c\ub9d0\ub77c" } - GU { "\uad0c" } - GW { "\uae30\ub124\ube44\uc3d8" } - GY { "\uac00\uc774\uc544\ub098" } - //HK { "\ud64d\ucf69 S.A.R." } // Old value - HK { "\ud64d\ucf69, \uc911\uad6d \ud2b9\ubcc4\ud589\uc815\uad6c" } - HM { "\ud5c8\ub4dc\uc12c-\ub9e5\ub3c4\ub110\ub4dc\uc81c\ub3c4" } - HN { "\uc628\ub450\ub77c\uc2a4" } - HR { "\ud06c\ub85c\uc544\ud2f0\uc544" } - HT { "\ud558\uc774\ud2f0" } - HU { "\ud5dd\uac00\ub9ac" } - ID { "\uc778\ub3c4\ub124\uc2dc\uc544" } - IE { "\uc544\uc77c\ub79c\ub4dc" } - IL { "\uc774\uc2a4\ub77c\uc5d8" } - IN { "\uc778\ub3c4" } - IO { "\uc601\uad6d\ub839\uc778\ub3c4\uc591\uc2dd\ubbfc\uc9c0" } - IQ { "\uc774\ub77c\ud06c" } - IR { "\uc774\ub780" } - IS { "\uc544\uc774\uc2ac\ub780\ub4dc" } - IT { "\uc774\ud0c8\ub9ac\uc544" } - JM { "\uc790\uba54\uc774\uce74" } - JO { "\uc694\ub974\ub2e8" } - JP { "\uc77c\ubcf8" } - KE { "\ucf00\ub0d0" } - KG { "\ud0a4\ub974\uae30\uc2a4\uc2a4\ud0c4" } - KH { "\uce84\ubcf4\ub514\uc544" } - KI { "\ud0a4\ub9ac\ubc14\uc2dc" } - KM { "\ucf54\ubaa8\ub974" } - KN { "\uc138\uc778\ud2b8\ud06c\ub9ac\uc2a4\ud1a0\ud37c \ub124\ube44\uc2a4" } - KP { "\uC870\uC120 \uBBFC\uC8FC\uC8FC\uC758 \uC778\uBBFC \uACF5\uD654\uAD6D" } - KR { "\ub300\ud55c\ubbfc\uad6d" } - KW { "\ucfe0\uc6e8\uc774\ud2b8" } - KY { "\ucf00\uc774\ub9e8\uc81c\ub3c4" } - KZ { "\uce74\uc790\ud750\uc2a4\ud0c4" } - LA { "\ub77c\uc624\uc2a4" } - LB { "\ub808\ubc14\ub17c" } - LC { "\uc138\uc778\ud2b8\ub8e8\uc2dc\uc544" } - LI { "\ub9ac\ud788\ud150\uc288\ud0c0\uc778" } - LK { "\uc2a4\ub9ac\ub791\uce74" } - LR { "\ub77c\uc774\ubca0\ub9ac\uc544" } - LS { "\ub808\uc18c\ud1a0" } - LT { "\ub9ac\ud22c\uc544\ub2c8\uc544" } - LU { "\ub8e9\uc148\ubd80\ub974\ud06c" } - LV { "\ub77c\ud2b8\ube44\uc544" } - LY { "\ub9ac\ube44\uc544" } - MA { "\ubaa8\ub85c\ucf54" } - MC { "\ubaa8\ub098\ucf54" } - MD { "\ubab0\ub3c4\ubc14" } - MG { "\ub9c8\ub2e4\uac00\uc2a4\uce74\ub974" } - MH { "\ub9c8\uc0ec \uad70\ub3c4" } - MK { "\ub9c8\ucf00\ub3c4\ub2c8\uc544\uc5b4" } - ML { "\ub9d0\ub9ac" } - MM { "\ubbf8\uc580\ub9c8" } - MN { "\ubabd\uace8" } - //MO { "\ub9c8\uce74\uc624 S.A.R." } // Old value - MO { "\ub9c8\uce74\uc624, \uc911\uad6d \ud2b9\ubcc4\ud589\uc815\uad6c" } - MP { "\ubd81\ub9c8\ub9ac\uc544\ub098\uc81c\ub3c4" } - MQ { "\ub9d0\ud2f0\ub2c8\ud06c" } - MR { "\ubaa8\ub9ac\ud0c0\ub2c8" } - MS { "\ubaac\ud2b8\uc138\ub77c\ud2b8" } - MT { "\ubab0\ud0c0" } - MU { "\ubaa8\ub9ac\uc154\uc2a4" } - MV { "\ubab0\ub514\ube0c" } - MW { "\ub9d0\ub77c\uc704" } - MX { "\uba55\uc2dc\ucf54" } - MY { "\ub9d0\ub808\uc774\uc9c0\uc544" } - MZ { "\ubaa8\uc7a0\ube44\ud06c" } - NA { "\ub098\ubbf8\ube44\uc544" } - NC { "\ub274 \uce7c\ub808\ub3c4\ub2c8\uc544" } - NE { "\ub2c8\uc81c\ub974" } - NF { "\ub178\ud37d\uc12c" } - NG { "\ub098\uc774\uc9c0\ub9ac\uc544" } - NI { "\ub2c8\uce74\ub77c\uacfc" } - NL { "\ub124\ub35c\ub780\ub4dc" } - NO { "\ub178\ub974\uc6e8\uc774" } - NP { "\ub124\ud314" } - NR { "\ub098\uc6b0\ub8e8" } - NU { "\ub2c8\uc6b0\uc5d0" } - NZ { "\ub274\uc9c8\ub79c\ub4dc" } - OM { "\uc624\ub9cc" } - PA { "\ud30c\ub098\ub9c8" } - PE { "\ud398\ub8e8" } - PF { "\ud504\ub791\uc2a4\ub839 \ud3f4\ub9ac\ub124\uc2dc\uc544" } - PG { "\ud30c\ud478\uc544\ub274\uae30\ub2c8" } - PH { "\ud544\ub9ac\ud540" } - PK { "\ud30c\ud0a4\uc2a4\ud0c4" } - PL { "\ud3f4\ub780\ub4dc" } - // PM { "\uc138\uc778\ud2b8\ud53c\uc5d0\ub974-\ubbf8\ufffd\ub871" } // It is displayed as garbaged. Need to be fixed. - PM { "\uc138\uc778\ud2b8\ud53c\uc5d0\ub974-\ubbf8\ud074\ub871" } - PN { "\ud54f\ucf00\uc5b8\uc12c" } - PR { "\ud478\uc5d0\ub974\ud1a0\ub9ac\ucf54" } - PS { "\ud314\ub808\uc2a4\ud0c0\uc778 \uc9c0\uad6c" } - PT { "\ud3ec\ub974\ud2b8\uce7c" } - PW { "\ud314\ub77c\uc6b0" } - PY { "\ud30c\ub77c\uacfc\uc774" } - QA { "\uce74\ud0c0\ub974" } - RE { "\ub9ac\uc720\ub2c8\uc628" } - RO { "\ub8e8\ub9c8\ub2c8\uc544" } - RU { "\ub7ec\uc2dc\uc544" } - RW { "\ub974\uc644\ub2e4" } - SA { "\uc0ac\uc6b0\ub514\uc544\ub77c\ube44\uc544" } - SB { "\uc194\ub85c\ubaac" } - SC { "\uc250\uc774\uc258" } - SD { "\uc218\ub2e8" } - SE { "\uc2a4\uc6e8\ub374" } - SG { "\uc2f1\uac00\ud3ec\ub974" } - SH { "\uc138\uc778\ud2b8\ud5ec\ub808\ub098" } - SI { "\uc2ac\ub85c\ubca0\ub2c8\uc544" } - SJ { "\uc2a4\ubc1c\ubc14\ub974\uc81c\ub3c4-\uc580\ub9c8\uc6ec\uc12c" } - SK { "\uc2ac\ub85c\ubc14\ud0a4\uc544" } - SL { "\uc2dc\uc5d0\ub77c\ub9ac\uc628" } - SM { "\uc0b0\ub9c8\ub9ac\ub178" } - SN { "\uc138\ub124\uac08" } - SO { "\uc18c\ub9d0\ub9ac\uc544" } - SP { "\uc138\ub974\ube44\uc544" } - SR { "\uc218\ub9ac\ub0a8" } - ST { "\uc0c1\ud22c\uba54 \ud504\ub9b0\uc2dc\ud398" } - SV { "\uc5d8\uc0b4\ubc14\ub3c4\ub974" } - SY { "\uc2dc\ub9ac\uc544" } - SZ { "\uc2a4\uc640\uc9c8\ub79c\ub4dc" } - TC { "\ud130\ud06c\uc2a4\ucf00\uc774\ucee4\uc2a4\uc81c\ub3c4" } - TD { "\ucc28\ub4dc" } - TF { "\ud504\ub791\uc2a4 \ub0a8\ubd80 \uc9c0\ubc29" } - TG { "\ud1a0\uace0" } - TH { "\ud0dc\uad6d" } - TJ { "\ud0c0\uc9c0\ud0a4\uc2a4\ud0c4" } - TK { "\ud1a0\ucf08\ub77c\uc6b0" } - TL { "\ub3d9\ud2f0\ubaa8\ub974" } - TM { "\ud22c\ub974\ud06c\uba54\ub2c8\uc2a4\ud0c4" } - TN { "\ud280\ub2c8\uc9c0" } - TO { "\ud1b5\uac00" } - TR { "\ud130\ud0a4" } - TT { "\ud2b8\ub9ac\ub2c8\ub2e4\ub4dc \ud1a0\ubc14\uace0" } - TV { "\ud22c\ubc1c\ub8e8" } - TW { "\ub300\ub9cc" } - TZ { "\ud0c4\uc790\ub2c8\uc544" } - UA { "\uc6b0\ud06c\ub77c\uc774\ub098" } - UG { "\uc6b0\uac04\ub2e4" } - UM { "\ubbf8\uad6d\ub839 \ud574\uc678 \uc81c\ub3c4" } - US { "\ubbf8\uad6d" } - UY { "\uc6b0\ub8e8\uacfc\uc774" } - UZ { "\uc6b0\uc988\ubca0\ud0a4\uc2a4\ud0c4" } - VA { "\ubc14\ud2f0\uce78" } - VC { "\uc138\uc778\ud2b8\ube48\uc13c\ud2b8\uadf8\ub808\ub098\ub518" } - VE { "\ubca0\ub124\uc218\uc5d8\ub77c" } - VG { "\uc601\uad6d\ub839 \ubc84\uc9c4 \uc544\uc77c\ub79c\ub4dc" } - VI { "\ubbf8\uad6d\ub839 \ubc84\uc9c4 \uc544\uc77c\ub79c\ub4dc" } - VN { "\ubca0\ud2b8\ub0a8" } - VU { "\ubc14\ub204\uc544\ud22c" } - WF { "\uc648\ub9ac\uc2a4-\ud478\ud22c\ub098 \uc81c\ub3c4" } - WS { "\uc0ac\ubaa8\uc544" } - YE { "\uc608\uba58" } - YT { "\ub9c8\uc694\ud2f0" } - YU { "\uc720\uace0\uc2ac\ub77c\ube44\uc544" } - ZA { "\ub0a8\uc544\ud504\ub9ac\uce74" } - ZM { "\uc7a0\ube44\uc544" } - ZW { "\uc9d0\ubc14\ube0c\uc6e8" } - - } - - Currencies { - KRW { "\uFFE6", "KRW" } // Korean Won - JPY { "\uFFE5", "JPY" } - } - - DateTimePatterns { - "a hh'\uC2DC'mm'\uBD84'ss'\uCD08' z", - "a hh'\uC2DC'mm'\uBD84'ss'\uCD08'", - "a h:mm:ss", - "a h:mm", - "yyyy'\uB144' M'\uC6D4' d'\uC77C' EEEE", - "yyyy'\uB144' M'\uC6D4' d'\uC77C' EE", - "yyyy-MM-dd", - "yy-MM-dd", - "{1} {0}", - } - DayAbbreviations { - "\uC77C", - "\uC6D4", - "\uD654", - "\uC218", - "\uBAA9", - "\uAE08", - "\uD1A0", - } - DayNames { - "\uC77C\uC694\uC77C", - "\uC6D4\uC694\uC77C", - "\uD654\uC694\uC77C", - "\uC218\uC694\uC77C", - "\uBAA9\uC694\uC77C", - "\uAE08\uC694\uC77C", - "\uD1A0\uC694\uC77C", - } - Languages { - aa { "\uc544\ud30c\ub974\uc5b4" } - ab { "\uc555\uce74\uc988\uc5b4" } - af { "\ub0a8\uc544\uacf5 \uacf5\uc6a9\uc5b4" } - am { "\uc554\ud558\ub77c\uc5b4" } - ar { "\uc544\ub78d\uc5b4" } - as { "\uc544\uc0d8\uc5b4" } - ay { "\uc544\uc774\ub9c8\ub77c\uc5b4" } - az { "\uc544\uc81c\ub974\ubc14\uc774\uc794\uc5b4" } - ba { "\ubc14\uc288\ud0a4\ub974\uc5b4" } - be { "\ubca8\ub85c\ub8e8\uc2dc\uc5b4" } - bg { "\ubd88\uac00\ub9ac\uc544\uc5b4" } - bh { "\ube44\ud558\ub974\uc5b4" } - bi { "\ube44\uc2ac\ub77c\ub9c8\uc5b4" } - bn { "\ubcb5\uace8\uc5b4" } - bo { "\ud2f0\ubca0\ud2b8\uc5b4" } - br { "\ube0c\ub974\ud0c0\ub274\uc5b4" } - ca { "\uce74\ud0c8\ub85c\ub2c8\uc544\uc5b4" } - co { "\ucf54\ub974\uc2dc\uce74\uc5b4" } - cs { "\uccb4\ucf54\uc5b4" } - cy { "\uc6e8\uc77c\uc2a4\uc5b4" } - da { "\ub374\ub9c8\ud06c\uc5b4" } - de { "\ub3c5\uc77c\uc5b4" } - dz { "\ubd80\ud0c4\uc5b4" } - el { "\uadf8\ub9ac\uc2a4\uc5b4" } - en { "\uc601\uc5b4" } - eo { "\uc5d0\uc2a4\ud398\ub780\ud1a0\uc5b4" } - es { "\uc2a4\ud398\uc778\uc5b4" } - et { "\uc5d0\uc2a4\ud1a0\ub2c8\uc544\uc5b4" } - eu { "\ubc14\uc2a4\ud06c\uc5b4" } - fa { "\uc774\ub780\uc5b4" } - fi { "\ud540\ub780\ub4dc\uc5b4" } - fj { "\ud53c\uc9c0\uc5b4" } - fo { "\ud398\ub85c\uc2a4\uc5b4" } - fr { "\ud504\ub791\uc2a4\uc5b4" } - fy { "\ud504\ub9ac\uc9c0\uc544\uc5b4" } - ga { "\uc544\uc77c\ub79c\ub4dc\uc5b4" } - gd { "\uc2a4\ucf54\uac24\ub9ad\uc5b4" } - gl { "\uac08\ub9ac\uc2dc\uc544\uc5b4" } - gn { "\uad6c\uc544\ub77c\ub2c8\uc5b4" } - gu { "\uad6c\uc790\ub77c\ud2b8\uc5b4" } - gv { "\ub9f9\ud06c\uc2a4\uc5b4" } // Added from root.txt file. - ha { "\ud558\uc6b0\uc790\uc5b4" } - haw { "\ud558\uc640\uc774\uc5b4" } // Added from root.txt file. - he { "\ud5e4\ube0c\ub77c\uc774\uc5b4" } // Fixed. - //he { "\ud5e4\ube0c\ub77c\uc774\uc5b4" } // From translation center - hi { "\ud78c\ub514\uc5b4" } - hr { "\ud06c\ub85c\uc544\ud2f0\uc544\uc5b4" } - hu { "\ud5dd\uac00\ub9ac\uc5b4" } - hy { "\uc544\ub974\uba54\ub2c8\uc544\uc5b4" } - ia { "\uc778\ud130\ub9c1\uac70" } - id { "\uc778\ub3c4\ub124\uc2dc\uc544\uc5b4" } - ie { "\uc778\ud130\ub9c1\uac8c\uc5b4" } - ik { "\uc774\ub204\ud53c\uc544\ud06c\uc5b4" } - is { "\uc544\uc774\uc2ac\ub780\ub4dc\uc5b4" } - it { "\uc774\ud0c8\ub9ac\uc544\uc5b4" } - iu { "\uc774\ub205\ud2f0\ud22c\ud2b8\uc5b4" } - ja { "\uc77c\ubcf8\uc5b4" } - jv { "\uc790\ubc14\uc5b4" } - ka { "\uadf8\ub8e8\uc9c0\uc57c\uc5b4" } - kk { "\uce74\uc790\ud750\uc5b4" } - kl { "\uadf8\ub9b0\ub79c\ub4dc\uc5b4" } - km { "\uce84\ubcf4\ub514\uc544\uc5b4" } - kn { "\uce74\ub098\ub2e4\uc5b4" } - ko { "\ud55c\uad6d\uc5b4" } - ks { "\uce74\uc288\ubbf8\ub974\uc5b4" } - ku { "\ud06c\ub974\ub4dc\uc5b4" } - kw { "\ucf58\uc6d4\uc5b4" } // Added from root.txt file. - ky { "\ud0a4\ub974\uae30\uc2a4\uc5b4" } - la { "\ub77c\ud2f4\uc5b4" } - ln { "\ub9c1\uac08\ub77c\uc5b4" } - lo { "\ub77c\uc624\uc5b4" } - lt { "\ub9ac\ud22c\uc544\ub2c8\uc544\uc5b4" } - //lv { "\ub77c\ud2b8\ube44\uc544\uc5b4 (\ub808\ud2b8\uc5b4)" } - lv { "\ub77c\ud2b8\ube44\uc544\uc5b4" } - mg { "\ub9c8\ub2e4\uac00\uc2a4\uce74\ub974\uc5b4" } - mi { "\ub9c8\uc624\ub9ac\uc5b4" } - mk { "\ub9c8\ucf00\ub3c4\ub2c8\uc544\uc5b4" } - ml { "\ub9d0\ub77c\uc584\ub78c\uc5b4" } - mn { "\ubabd\uace8\uc5b4" } - mo { "\ubab0\ub2e4\ube44\uc544\uc5b4" } - mr { "\ub9c8\ub77c\ud2f0\uc5b4" } - ms { "\ub9d0\ub808\uc774\uc5b4" } - mt { "\ubab0\ud0c0\uc5b4" } - my { "\ubc84\ub9c8\uc5b4" } - na { "\ub098\uc6b0\ub8e8\uc5b4" } - nb { "\ubcf4\ud06c\ub9d0 \ub178\ub974\uc6e8\uc774\uc5b4" } // Added from root.txt file. - ne { "\ub124\ud314\uc5b4" } - nl { "\ub124\ub35c\ub780\ub4dc\uc5b4" } // Dutch - Correct translation. \ub374\ub9c8\ud06c\uc5b4 : da - Danish - //nl { "\ub374\ub9c8\ud06c\uc5b4" } // From translation center - nn { "\ub258\ub178\ub974\uc2a4\ud06c \ub178\ub974\uc6e8\uc774\uc5b4" } // Added from root.txt file. - no { "\ub178\ub974\uc6e8\uc774\uc5b4" } - oc { "\uc625\uc2dc\ud2b8\uc5b4" } - om { "\uc624\ub85c\ubaa8\uc5b4 (\uc544\ud310)" } - or { "\uc624\ub9ac\uc57c\uc5b4" } - pa { "\ud380\uc7a1\uc5b4" } - pl { "\ud3f4\ub780\ub4dc\uc5b4" } - ps { "\ud30c\uc2dc\ud1a0\uc5b4 (\ud478\uc2dc\ud1a0)" } - pt { "\ud3ec\ub974\ud22c\uac08\uc5b4" } // Fixed. - //pt { "\ud3ec\ub974\ud22c\uac08\uc5b4" } // From translation center - qu { "\ucf00\ucd94\uc544\uc5b4" } - rm { "\ub808\ud1a0\ub85c\ub9cc\uc5b4" } - rn { "\ubc18\ud22c\uc5b4(\ubd80\ub8ec\ub514)" } - ro { "\ub8e8\ub9c8\ub2c8\uc544\uc5b4" } - ru { "\ub7ec\uc2dc\uc544\uc5b4" } - rw { "\ubc18\ud22c\uc5b4(\ub8e8\uc644\ub2e4)" } - sa { "\uc0b0\uc2a4\ud06c\ub9ac\ud2b8\uc5b4" } - sd { "\uc2e0\ub514\uc5b4" } - sg { "\uc0b0\uace0\uc5b4" } - sh { "\uc138\ub974\ubcf4\ud06c\ub85c\uc544\ud2f0\uc544\uc5b4" } - si { "\uc2a4\ub9ac\ub791\uce74\uc5b4" } - sk { "\uc2ac\ub85c\ubc14\ud0a4\uc544\uc5b4" } - sl { "\uc2ac\ub85c\ubca0\ub2c8\uc544\uc5b4" } - sm { "\uc0ac\ubaa8\uc544\uc5b4" } - sn { "\uc1fc\ub098\uc5b4" } - so { "\uc18c\ub9d0\ub9ac\uc544\uc5b4" } - sq { "\uc54c\ubc14\ub2c8\uc544\uc5b4" } - sr { "\uc138\ub974\ube44\uc544\uc5b4" } - ss { "\uc2dc\uc2a4\uc640\ud2f0\uc5b4" } - st { "\uc138\uc18c\ud1a0\uc5b4" } - su { "\uc21c\ub2e8\uc5b4" } - sv { "\uc2a4\uc6e8\ub374\uc5b4" } - sw { "\uc2a4\uc640\ud790\ub9ac\uc5b4" } - ta { "\ud0c0\ubc00\uc5b4" } - te { "\ud154\ub8e8\uad6c\uc5b4" } - tg { "\ud0c0\uc9c0\ud0a4\uc2a4\ud0c4\uc5b4" } - th { "\ud0dc\uad6d\uc5b4" } - ti { "\ud2f0\uadf8\ub9ac\ub0d0\uc5b4" } - tk { "\ud22c\ub974\ud06c\uba58\uc5b4" } - tl { "\ud0c0\uac08\ub85c\uadf8\uc5b4" } - tn { "\uc138\uce20\uc640\ub098\uc5b4" } - to { "\ud1b5\uac00\uc5b4" } - tr { "\ud130\ud0a4\uc5b4" } - ts { "\ud1b5\uac00\uc5b4" } - tt { "\ud0c0\ud0c0\ub974\uc5b4" } - tw { "\ud2b8\uc704\uc5b4" } - ug { "\uc704\uad6c\ub974\uc5b4" } - uk { "\uc6b0\ud06c\ub77c\uc774\ub098\uc5b4" } - ur { "\uc6b0\ub974\ub450\uc5b4" } - uz { "\uc6b0\uc988\ubca0\ud06c\uc5b4" } - vi { "\ubca0\ud2b8\ub0a8\uc5b4" } - vo { "\ubcfc\ub77c\ud4cc\ud06c\uc5b4" } - wo { "\uc62c\ub85c\ud504\uc5b4" } - xh { "\ubc18\ud22c\uc5b4(\ub0a8\uc544\ud504\ub9ac\uce74)" } - yi { "\uc774\ub514\uc2dc\uc5b4" } - yo { "\uc694\ub8e8\ubc14\uc5b4" } - za { "\uc8fc\uc559\uc5b4" } - zh { "\uc911\uad6d\uc5b4" } - zu { "\uc904\ub8e8\uc5b4" } - } - LocaleID:int { 0x12 } -// LocaleString { "ko" } - MonthAbbreviations { - "1\uC6D4", - "2\uC6D4", - "3\uC6D4", - "4\uC6D4", - "5\uC6D4", - "6\uC6D4", - "7\uC6D4", - "8\uC6D4", - "9\uC6D4", - "10\uC6D4", - "11\uC6D4", - "12\uC6D4", - } - MonthNames { - "1\uC6D4", - "2\uC6D4", - "3\uC6D4", - "4\uC6D4", - "5\uC6D4", - "6\uC6D4", - "7\uC6D4", - "8\uC6D4", - "9\uC6D4", - "10\uC6D4", - "11\uC6D4", - "12\uC6D4", - } - Eras { - "\uae30\uC6D0\uC804", - "\uC11C\uAE30", -// "\uB2E8\uAE30" // AD + 2333 but ICU doesn't use it. - } -// ShortLanguage { "kor" } - localPatternChars { "GanjkHmsSEDFwWxhKzAe" } - zoneStrings { - { - "Asia/Seoul", - "\uD55C\uAD6D\uD45C\uC900\uC2DC", - "KST", - "\uD55C\uAD6D\uD45C\uC900\uC2DC", - "KST" - } - } - LocaleScript{ "Hang", "Hani" } - ExemplarCharacters{ - "[\u3041-\u3093 \u30A1-\u30F6 \u3131-\u318E " - "\u4ED4-\u4ED9 \u4F59-\u4F5E \u5143-\u5149 \u5167-\u516E " - "\u5236-\u523B \u540C-\u5411 \u5B95-\u5B9C \u5BC2-\u5BC7 \u5BE4-\u5BE9 " - "\u6664-\u6669 \u67CF-\u67D4 \u6B61-\u6B66 \u701A-\u701F \u795A-\u7960 " - "\u8105-\u810A \u8CA7-\u8CAC \u8CBF-\u8CC4 \u8FAD-\u8FB2 \u901D-\u9023 " - "\u907F-\u9084 \u9149-\u914E \u91CB-\u91D1" - "\uAC00-\uAC01\uAC04\uAC07-\uAC0A\uAC10-\uAC17\uAC19-\uAC1D\uAC20" - "\uAC24\uAC2C-\uAC2D\uAC2F-\uAC31\uAC38-\uAC39\uAC3C\uAC40\uAC4B" - "\uAC4D\uAC54\uAC58\uAC5C\uAC70-\uAC71\uAC74\uAC77-\uAC78\uAC7A" - "\uAC80-\uAC81\uAC83-\uAC86\uAC89-\uAC8C\uAC90\uAC94\uAC9C-\uAC9D" - "\uAC9F-\uACA1\uACA8-\uACAA\uACAC\uACAF-\uACB0\uACB8-\uACB9\uACBB-\uACBD" - "\uACC1\uACC4\uACC8\uACCC\uACD5\uACD7\uACE0-\uACE1\uACE4\uACE7-\uACE8" - "\uACEA\uACEC\uACEF-\uACF1\uACF3\uACF5-\uACF6\uACFC-\uACFD\uAD00" - "\uAD04\uAD06\uAD0C-\uAD0D\uAD0F\uAD11\uAD18\uAD1C\uAD20\uAD29" - "\uAD2C-\uAD2D\uAD34-\uAD35\uAD38\uAD3C\uAD44-\uAD45\uAD47\uAD49" - "\uAD50\uAD54\uAD58\uAD61\uAD63\uAD6C-\uAD6D\uAD70\uAD73-\uAD76" - "\uAD7B-\uAD7D\uAD7F\uAD81-\uAD82\uAD88-\uAD89\uAD8C\uAD90\uAD9C-\uAD9D" - "\uADA4\uADB7\uADC0-\uADC1\uADC4\uADC8\uADD0-\uADD1\uADD3\uADDC" - "\uADE0\uADE4\uADF8-\uADF9\uADFC\uADFF-\uAE01\uAE08-\uAE09\uAE0B" - "\uAE0D\uAE14\uAE30-\uAE31\uAE34\uAE37-\uAE38\uAE3A\uAE40-\uAE41" - "\uAE43\uAE45-\uAE46\uAE4A\uAE4C-\uAE4E\uAE50\uAE54\uAE56\uAE5C-\uAE5D" - "\uAE5F-\uAE61\uAE65\uAE68-\uAE69\uAE6C\uAE70\uAE78-\uAE79\uAE7B-\uAE7D" - "\uAE84-\uAE85\uAE8C\uAEBC-\uAEBE\uAEC0\uAEC4\uAECC-\uAECD\uAECF-\uAED1" - "\uAED8-\uAED9\uAEDC\uAEE8\uAEEB\uAEED\uAEF4\uAEF8\uAEFC\uAF07-\uAF08" - "\uAF0D\uAF10\uAF2C-\uAF2D\uAF30\uAF32\uAF34\uAF3C-\uAF3D\uAF3F" - "\uAF41-\uAF43\uAF48-\uAF49\uAF50\uAF5C-\uAF5D\uAF64-\uAF65\uAF79" - "\uAF80\uAF84\uAF88\uAF90-\uAF91\uAF95\uAF9C\uAFB8-\uAFB9\uAFBC" - "\uAFC0\uAFC7-\uAFC9\uAFCB\uAFCD-\uAFCE\uAFD4\uAFDC\uAFE8-\uAFE9" - "\uAFF0-\uAFF1\uAFF4\uAFF8\uB000-\uB001\uB004\uB00C\uB010\uB014" - "\uB01C-\uB01D\uB028\uB044-\uB045\uB048\uB04A\uB04C\uB04E\uB053-\uB055" - "\uB057\uB059\uB05D\uB07C-\uB07D\uB080\uB084\uB08C-\uB08D\uB08F\uB091" - "\uB098-\uB09A\uB09C\uB09F-\uB0A2\uB0A8-\uB0A9\uB0AB-\uB0AF\uB0B1" - "\uB0B3-\uB0B5\uB0B8\uB0BC\uB0C4-\uB0C5\uB0C7-\uB0C9\uB0D0-\uB0D1" - "\uB0D4\uB0D8\uB0E0\uB0E5\uB108-\uB109\uB10B-\uB10C\uB110\uB112-\uB113" - "\uB118-\uB119\uB11B-\uB11D\uB123-\uB125\uB128\uB12C\uB134-\uB135" - "\uB137-\uB139\uB140-\uB141\uB144\uB148\uB150-\uB151\uB154-\uB155" - "\uB158\uB15C\uB160\uB178-\uB179\uB17C\uB180\uB182\uB188-\uB189" - "\uB18B\uB18D\uB192-\uB194\uB198\uB19C\uB1A8\uB1CC\uB1D0\uB1D4" - "\uB1DC-\uB1DD\uB1DF\uB1E8-\uB1E9\uB1EC\uB1F0\uB1F9\uB1FB\uB1FD" - "\uB204-\uB205\uB208\uB20B-\uB20C\uB214-\uB215\uB217\uB219\uB220" - "\uB234\uB23C\uB258\uB25C\uB260\uB268-\uB269\uB274-\uB275\uB27C" - "\uB284-\uB285\uB289\uB290-\uB291\uB294\uB298-\uB29A\uB2A0-\uB2A1" - "\uB2A3\uB2A5-\uB2A6\uB2AA\uB2AC\uB2B0\uB2B4\uB2C8-\uB2C9\uB2CC" - "\uB2D0\uB2D6\uB2D8-\uB2D9\uB2DB\uB2DD\uB2E2\uB2E4-\uB2E6\uB2E8" - "\uB2EB-\uB2EF\uB2F3-\uB2F5\uB2F7-\uB2FB\uB2FF-\uB301\uB304\uB308" - "\uB310-\uB311\uB313-\uB315\uB31C\uB354-\uB356\uB358\uB35B-\uB35C" - "\uB35E-\uB35F\uB364-\uB365\uB367\uB369\uB36B\uB36E\uB370-\uB371" - "\uB374\uB378\uB380-\uB381\uB383-\uB385\uB38C\uB390\uB394\uB3A0-\uB3A1" - "\uB3A8\uB3AC\uB3C4-\uB3C5\uB3C8\uB3CB-\uB3CC\uB3CE\uB3D0\uB3D4-\uB3D5" - "\uB3D7\uB3D9\uB3DB\uB3DD\uB3E0\uB3E4\uB3E8\uB3FC\uB410\uB418\uB41C" - "\uB420\uB428-\uB429\uB42B\uB434\uB450-\uB451\uB454\uB458\uB460-\uB461" - "\uB463\uB465\uB46C\uB480\uB488\uB49D\uB4A4\uB4A8\uB4AC\uB4B5\uB4B7" - "\uB4B9\uB4C0\uB4C4\uB4C8\uB4D0\uB4D5\uB4DC-\uB4DD\uB4E0\uB4E3-\uB4E4" - "\uB4E6\uB4EC-\uB4ED\uB4EF\uB4F1\uB4F8\uB514-\uB515\uB518\uB51B-\uB51C" - "\uB524-\uB525\uB527-\uB52A\uB530-\uB531\uB534\uB538\uB540-\uB541" - "\uB543-\uB545\uB54B-\uB54D\uB550\uB554\uB55C-\uB55D\uB55F-\uB561" - "\uB5A0-\uB5A1\uB5A4\uB5A8\uB5AA-\uB5AB\uB5B0-\uB5B1\uB5B3-\uB5B5" - "\uB5BB-\uB5BD\uB5C0\uB5C4\uB5CC-\uB5CD\uB5CF-\uB5D1\uB5D8\uB5EC" - "\uB610-\uB611\uB614\uB618\uB625\uB62C\uB634\uB648\uB664\uB668" - "\uB69C-\uB69D\uB6A0\uB6A4\uB6AB-\uB6AC\uB6B1\uB6D4\uB6F0\uB6F4" - "\uB6F8\uB700-\uB701\uB705\uB728-\uB729\uB72C\uB72F-\uB730\uB738-\uB739" - "\uB73B\uB744\uB748\uB74C\uB754-\uB755\uB760\uB764\uB768\uB770-\uB771" - "\uB773\uB775\uB77C-\uB77D\uB780\uB784\uB78C-\uB78D\uB78F-\uB792" - "\uB796-\uB799\uB79C\uB7A0\uB7A8-\uB7A9\uB7AB-\uB7AD\uB7B4-\uB7B5" - "\uB7B8\uB7C7\uB7C9\uB7EC-\uB7ED\uB7F0\uB7F4\uB7FC-\uB7FD\uB7FF-\uB801" - "\uB807-\uB809\uB80C\uB810\uB818-\uB819\uB81B\uB81D\uB824-\uB825" - "\uB828\uB82C\uB834-\uB835\uB837-\uB839\uB840\uB844\uB851\uB853" - "\uB85C-\uB85D\uB860\uB864\uB86C-\uB86D\uB86F\uB871\uB878\uB87C" - "\uB88D\uB8A8\uB8B0\uB8B4\uB8B8\uB8C0-\uB8C1\uB8C3\uB8C5\uB8CC" - "\uB8D0\uB8D4\uB8DD\uB8DF\uB8E1\uB8E8-\uB8E9\uB8EC\uB8F0\uB8F8-\uB8F9" - "\uB8FB\uB8FD\uB904\uB918\uB920\uB93C-\uB93D\uB940\uB944\uB94C" - "\uB94F\uB951\uB958-\uB959\uB95C\uB960\uB968-\uB969\uB96B\uB96D" - "\uB974-\uB975\uB978\uB97C\uB984-\uB985\uB987\uB989-\uB98A\uB98D-\uB98E" - "\uB9AC-\uB9AD\uB9B0\uB9B4\uB9BC-\uB9BD\uB9BF\uB9C1\uB9C8-\uB9C9" - "\uB9CC\uB9CE-\uB9D2\uB9D8-\uB9D9\uB9DB\uB9DD-\uB9DE\uB9E1\uB9E3-\uB9E5" - "\uB9E8\uB9EC\uB9F4-\uB9F5\uB9F7-\uB9FA\uBA00-\uBA01\uBA08\uBA15" - "\uBA38-\uBA39\uBA3C\uBA40\uBA42\uBA48-\uBA49\uBA4B\uBA4D-\uBA4E" - "\uBA53-\uBA55\uBA58\uBA5C\uBA64-\uBA65\uBA67-\uBA69\uBA70-\uBA71" - "\uBA74\uBA78\uBA83-\uBA85\uBA87\uBA8C\uBAA8-\uBAA9\uBAAB-\uBAAC" - "\uBAB0\uBAB2\uBAB8-\uBAB9\uBABB\uBABD\uBAC4\uBAC8\uBAD8-\uBAD9" - "\uBAFC\uBB00\uBB04\uBB0D\uBB0F\uBB11\uBB18\uBB1C\uBB20\uBB29" - "\uBB2B\uBB34-\uBB36\uBB38\uBB3B-\uBB3E\uBB44-\uBB45\uBB47\uBB49" - "\uBB4D\uBB4F-\uBB50\uBB54\uBB58\uBB61\uBB63\uBB6C\uBB88\uBB8C" - "\uBB90\uBBA4\uBBA8\uBBAC\uBBB4\uBBB7\uBBC0\uBBC4\uBBC8\uBBD0" - "\uBBD3\uBBF8-\uBBF9\uBBFC\uBBFF-\uBC00\uBC02\uBC08-\uBC09\uBC0B-\uBC0D" - "\uBC0F\uBC11\uBC14-\uBC18\uBC1B-\uBC1F\uBC24-\uBC25\uBC27\uBC29" - "\uBC2D\uBC30-\uBC31\uBC34\uBC38\uBC40-\uBC41\uBC43-\uBC45\uBC49" - "\uBC4C-\uBC4D\uBC50\uBC5D\uBC84-\uBC85\uBC88\uBC8B-\uBC8C\uBC8E" - "\uBC94-\uBC95\uBC97\uBC99-\uBC9A\uBCA0-\uBCA1\uBCA4\uBCA7-\uBCA8" - "\uBCB0-\uBCB1\uBCB3-\uBCB5\uBCBC-\uBCBD\uBCC0\uBCC4\uBCCD\uBCCF-\uBCD1" - "\uBCD5\uBCD8\uBCDC\uBCF4-\uBCF6\uBCF8\uBCFC\uBD04-\uBD05\uBD07" - "\uBD09\uBD10\uBD14\uBD24\uBD2C\uBD40\uBD48-\uBD49\uBD4C\uBD50" - "\uBD58-\uBD59\uBD64\uBD68\uBD80-\uBD81\uBD84\uBD87-\uBD8A\uBD90-\uBD91" - "\uBD93\uBD95\uBD99-\uBD9A\uBD9C\uBDA4\uBDB0\uBDB8\uBDD4-\uBDD5" - "\uBDD8\uBDDC\uBDE9\uBDF0\uBDF4\uBDF8\uBE00\uBE03\uBE05\uBE0C-\uBE0D" - "\uBE10\uBE14\uBE1C-\uBE1D\uBE1F\uBE44-\uBE45\uBE48\uBE4C\uBE4E" - "\uBE54-\uBE55\uBE57\uBE59-\uBE5B\uBE60-\uBE61\uBE64\uBE68\uBE6A" - "\uBE70-\uBE71\uBE73-\uBE75\uBE7B-\uBE7D\uBE80\uBE84\uBE8C-\uBE8D" - "\uBE8F-\uBE91\uBE98-\uBE99\uBEA8\uBED0-\uBED1\uBED4\uBED7-\uBED8" - "\uBEE0\uBEE3-\uBEE5\uBEEC\uBF01\uBF08-\uBF09\uBF18-\uBF19\uBF1B-\uBF1D" - "\uBF40-\uBF41\uBF44\uBF48\uBF50-\uBF51\uBF55\uBF94\uBFB0\uBFC5" - "\uBFCC-\uBFCD\uBFD0\uBFD4\uBFDC\uBFDF\uBFE1\uC03C\uC051\uC058" - "\uC05C\uC060\uC068-\uC069\uC090-\uC091\uC094\uC098\uC0A0-\uC0A1" - "\uC0A3\uC0A5\uC0AC-\uC0AD\uC0AF-\uC0B0\uC0B3-\uC0B6\uC0BC-\uC0BD" - "\uC0BF-\uC0C1\uC0C5\uC0C8-\uC0C9\uC0CC\uC0D0\uC0D8-\uC0D9\uC0DB-\uC0DD" - "\uC0E4-\uC0E5\uC0E8\uC0EC\uC0F4-\uC0F5\uC0F7\uC0F9\uC100\uC104" - "\uC108\uC110\uC115\uC11C-\uC120\uC123-\uC124\uC126-\uC127\uC12C-\uC12D" - "\uC12F-\uC131\uC136\uC138-\uC139\uC13C\uC140\uC148-\uC149\uC14B-\uC14D" - "\uC154-\uC155\uC158\uC15C\uC164-\uC165\uC167-\uC169\uC170\uC174" - "\uC178\uC185\uC18C-\uC18E\uC190\uC194\uC196\uC19C-\uC19D\uC19F" - "\uC1A1\uC1A5\uC1A8-\uC1A9\uC1AC\uC1B0\uC1BD\uC1C4\uC1C8\uC1CC" - "\uC1D4\uC1D7-\uC1D8\uC1E0\uC1E4\uC1E8\uC1F0-\uC1F1\uC1F3\uC1FC-\uC1FD" - "\uC200\uC204\uC20C-\uC20D\uC20F\uC211\uC218-\uC219\uC21C\uC21F-\uC220" - "\uC228-\uC229\uC22B\uC22D\uC22F\uC231-\uC232\uC234\uC248\uC250-\uC251" - "\uC254\uC258\uC260\uC265\uC26C-\uC26D\uC270\uC274\uC27C-\uC27D" - "\uC27F\uC281\uC288-\uC289\uC290\uC298\uC29B\uC29D\uC2A4-\uC2A5" - "\uC2A8\uC2AC-\uC2AD\uC2B4-\uC2B5\uC2B7\uC2B9\uC2DC-\uC2DD\uC2E0" - "\uC2E3-\uC2E4\uC2EB-\uC2ED\uC2EF\uC2F1\uC2F6\uC2F8-\uC2F9\uC2FB-\uC2FC" - "\uC300\uC308-\uC309\uC30C-\uC30D\uC313-\uC315\uC318\uC31C\uC324-\uC325" - "\uC328-\uC329\uC345\uC368-\uC369\uC36C\uC370\uC372\uC378-\uC379" - "\uC37C-\uC37D\uC384\uC388\uC38C\uC3C0\uC3D8-\uC3D9\uC3DC\uC3DF-\uC3E0" - "\uC3E2\uC3E8-\uC3E9\uC3ED\uC3F4-\uC3F5\uC3F8\uC408\uC410\uC424" - "\uC42C\uC430\uC434\uC43C-\uC43D\uC448\uC464-\uC465\uC468\uC46C" - "\uC474-\uC475\uC479\uC480\uC494\uC49C\uC4B8\uC4BC\uC4E9\uC4F0-\uC4F1" - "\uC4F4\uC4F8\uC4FA\uC4FF-\uC501\uC50C\uC510\uC514\uC51C\uC528-\uC529" - "\uC52C\uC530\uC538-\uC539\uC53B\uC53D\uC544-\uC545\uC548-\uC54A" - "\uC54C-\uC54E\uC553-\uC555\uC557-\uC559\uC55D-\uC55E\uC560-\uC561" - "\uC564\uC568\uC570-\uC571\uC573-\uC575\uC57C-\uC57D\uC580\uC584" - "\uC587\uC58C-\uC58D\uC58F\uC591\uC595\uC597-\uC598\uC59C\uC5A0" - "\uC5A9\uC5B4-\uC5B5\uC5B8-\uC5B9\uC5BB-\uC5BE\uC5C4-\uC5CA\uC5CC" - "\uC5CE\uC5D0-\uC5D1\uC5D4\uC5D8\uC5E0-\uC5E1\uC5E3\uC5E5\uC5EC-\uC5EE" - "\uC5F0\uC5F4\uC5F6-\uC5F7\uC5FC-\uC601\uC605-\uC608\uC60C\uC610" - "\uC618-\uC619\uC61B-\uC61C\uC624-\uC625\uC628\uC62C-\uC62E\uC630" - "\uC633-\uC635\uC637\uC639\uC63B\uC640-\uC641\uC644\uC648\uC650-\uC651" - "\uC653-\uC655\uC65C-\uC65D\uC660\uC66C\uC66F\uC671\uC678-\uC679" - "\uC67C\uC680\uC688-\uC689\uC68B\uC68D\uC694-\uC695\uC698\uC69C" - "\uC6A4-\uC6A5\uC6A7\uC6A9\uC6B0-\uC6B1\uC6B4\uC6B8-\uC6BA\uC6C0-\uC6C1" - "\uC6C3\uC6C5\uC6CC-\uC6CD\uC6D0\uC6D4\uC6DC-\uC6DD\uC6E0-\uC6E1" - "\uC6E8-\uC6E9\uC6EC\uC6F0\uC6F8-\uC6F9\uC6FD\uC704-\uC705\uC708" - "\uC70C\uC714-\uC715\uC717\uC719\uC720-\uC721\uC724\uC728\uC730-\uC731" - "\uC733\uC735\uC737\uC73C-\uC73D\uC740\uC744\uC74A\uC74C-\uC74D" - "\uC74F\uC751-\uC758\uC75C\uC760\uC768\uC76B\uC774-\uC775\uC778" - "\uC77C-\uC77E\uC783-\uC785\uC787-\uC78A\uC78E\uC790-\uC791\uC794" - "\uC796-\uC798\uC79A\uC7A0-\uC7A1\uC7A3-\uC7A6\uC7AC-\uC7AD\uC7B0" - "\uC7B4\uC7BC-\uC7BD\uC7BF-\uC7C1\uC7C8-\uC7C9\uC7CC\uC7CE\uC7D0" - "\uC7D8\uC7DD\uC7E4\uC7E8\uC7EC\uC800-\uC801\uC804\uC808\uC80A" - "\uC810-\uC811\uC813\uC815-\uC816\uC81C-\uC81D\uC820\uC824\uC82C-\uC82D" - "\uC82F\uC831\uC838\uC83C\uC840\uC848-\uC849\uC84C-\uC84D\uC854" - "\uC870-\uC871\uC874\uC878\uC87A\uC880-\uC881\uC883\uC885-\uC887" - "\uC88B-\uC88D\uC894\uC89D\uC89F\uC8A1\uC8A8\uC8BC-\uC8BD\uC8C4" - "\uC8C8\uC8CC\uC8D4-\uC8D5\uC8D7\uC8D9\uC8E0-\uC8E1\uC8E4\uC8F5" - "\uC8FC-\uC8FD\uC900\uC904-\uC906\uC90C-\uC90D\uC90F\uC911\uC918" - "\uC92C\uC934\uC950-\uC951\uC954\uC958\uC960-\uC961\uC963\uC96C" - "\uC970\uC974\uC97C\uC988-\uC989\uC98C\uC990\uC998-\uC999\uC99B" - "\uC99D\uC9C0-\uC9C1\uC9C4\uC9C7-\uC9C8\uC9CA\uC9D0-\uC9D1\uC9D3" - "\uC9D5-\uC9D6\uC9D9-\uC9DA\uC9DC-\uC9DD\uC9E0\uC9E2\uC9E4\uC9E7" - "\uC9EC-\uC9ED\uC9EF-\uC9F1\uC9F8-\uC9F9\uC9FC\uCA00\uCA08-\uCA09" - "\uCA0B-\uCA0D\uCA14\uCA18\uCA29\uCA4C-\uCA4D\uCA50\uCA54\uCA5C-\uCA5D" - "\uCA5F-\uCA61\uCA68\uCA7D\uCA84\uCA98\uCABC-\uCABD\uCAC0\uCAC4" - "\uCACC-\uCACD\uCACF\uCAD1\uCAD3\uCAD8-\uCAD9\uCAE0\uCAEC\uCAF4" - "\uCB08\uCB10\uCB14\uCB18\uCB20-\uCB21\uCB41\uCB48-\uCB49\uCB4C" - "\uCB50\uCB58-\uCB59\uCB5D\uCB64\uCB78-\uCB79\uCB9C\uCBB8\uCBD4" - "\uCBE4\uCBE7\uCBE9\uCC0C-\uCC0D\uCC10\uCC14\uCC1C-\uCC1D\uCC21-\uCC22" - "\uCC27-\uCC29\uCC2C\uCC2E\uCC30\uCC38-\uCC39\uCC3B-\uCC3E\uCC44-\uCC45" - "\uCC48\uCC4C\uCC54-\uCC55\uCC57-\uCC59\uCC60\uCC64\uCC66\uCC68" - "\uCC70\uCC75\uCC98-\uCC99\uCC9C\uCCA0\uCCA8-\uCCA9\uCCAB-\uCCAD" - "\uCCB4-\uCCB5\uCCB8\uCCBC\uCCC4-\uCCC5\uCCC7\uCCC9\uCCD0\uCCD4" - "\uCCE4\uCCEC\uCCF0\uCD01\uCD08-\uCD09\uCD0C\uCD10\uCD18-\uCD19" - "\uCD1B\uCD1D\uCD24\uCD28\uCD2C\uCD39\uCD5C\uCD60\uCD64\uCD6C-\uCD6D" - "\uCD6F\uCD71\uCD78\uCD88\uCD94-\uCD95\uCD98\uCD9C\uCDA4-\uCDA5" - "\uCDA7\uCDA9\uCDB0\uCDC4\uCDCC\uCDD0\uCDE8\uCDEC\uCDF0\uCDF8-\uCDF9" - "\uCDFB\uCDFD\uCE04\uCE08\uCE0C\uCE14\uCE19\uCE20-\uCE21\uCE24" - "\uCE28\uCE30-\uCE31\uCE33\uCE35\uCE58-\uCE59\uCE5C\uCE5F-\uCE61" - "\uCE68-\uCE69\uCE6B\uCE6D\uCE74-\uCE75\uCE78\uCE7C\uCE84-\uCE85" - "\uCE87\uCE89\uCE90-\uCE91\uCE94\uCE98\uCEA0-\uCEA1\uCEA3-\uCEA5" - "\uCEAC-\uCEAD\uCEC1\uCEE4-\uCEE5\uCEE8\uCEEB-\uCEEC\uCEF4-\uCEF5" - "\uCEF7-\uCEF9\uCF00-\uCF01\uCF04\uCF08\uCF10-\uCF11\uCF13\uCF15" - "\uCF1C\uCF20\uCF24\uCF2C-\uCF2D\uCF2F-\uCF31\uCF38\uCF54-\uCF55" - "\uCF58\uCF5C\uCF64-\uCF65\uCF67\uCF69\uCF70-\uCF71\uCF74\uCF78" - "\uCF80\uCF85\uCF8C\uCFA1\uCFA8\uCFB0\uCFC4\uCFE0-\uCFE1\uCFE4" - "\uCFE8\uCFF0-\uCFF1\uCFF3\uCFF5\uCFFC\uD000\uD004\uD011\uD018" - "\uD02D\uD034-\uD035\uD038\uD03C\uD044-\uD045\uD047\uD049\uD050" - "\uD054\uD058\uD060\uD06C-\uD06D\uD070\uD074\uD07C-\uD07D\uD081" - "\uD0A4-\uD0A5\uD0A8\uD0AC\uD0B4-\uD0B5\uD0B7\uD0B9\uD0C0-\uD0C1" - "\uD0C4\uD0C8-\uD0C9\uD0D0-\uD0D1\uD0D3-\uD0D5\uD0DC-\uD0DD\uD0E0" - "\uD0E4\uD0EC-\uD0ED\uD0EF-\uD0F1\uD0F8\uD10D\uD130-\uD131\uD134" - "\uD138\uD13A\uD140-\uD141\uD143-\uD145\uD14C-\uD14D\uD150\uD154" - "\uD15C-\uD15D\uD15F\uD161\uD168\uD16C\uD17C\uD184\uD188\uD1A0-\uD1A1" - "\uD1A4\uD1A8\uD1B0-\uD1B1\uD1B3\uD1B5\uD1BA\uD1BC\uD1C0\uD1D8" - "\uD1F4\uD1F8\uD207\uD209\uD210\uD22C-\uD22D\uD230\uD234\uD23C-\uD23D" - "\uD23F\uD241\uD248\uD25C\uD264\uD280-\uD281\uD284\uD288\uD290-\uD291" - "\uD295\uD29C\uD2A0\uD2A4\uD2AC\uD2B1\uD2B8-\uD2B9\uD2BC\uD2BF-\uD2C0" - "\uD2C2\uD2C8-\uD2C9\uD2CB\uD2D4\uD2D8\uD2DC\uD2E4-\uD2E5\uD2F0-\uD2F1" - "\uD2F4\uD2F8\uD300-\uD301\uD303\uD305\uD30C-\uD30E\uD310\uD314" - "\uD316\uD31C-\uD31D\uD31F-\uD321\uD325\uD328-\uD329\uD32C\uD330" - "\uD338-\uD339\uD33B-\uD33D\uD344-\uD345\uD37C-\uD37D\uD380\uD384" - "\uD38C-\uD38D\uD38F-\uD391\uD398-\uD399\uD39C\uD3A0\uD3A8-\uD3A9" - "\uD3AB\uD3AD\uD3B4\uD3B8\uD3BC\uD3C4-\uD3C5\uD3C8-\uD3C9\uD3D0" - "\uD3D8\uD3E1\uD3E3\uD3EC-\uD3ED\uD3F0\uD3F4\uD3FC-\uD3FD\uD3FF" - "\uD401\uD408\uD41D\uD440\uD444\uD45C\uD460\uD464\uD46D\uD46F" - "\uD478-\uD479\uD47C\uD47F-\uD480\uD482\uD488-\uD489\uD48B\uD48D" - "\uD494\uD4A9\uD4CC\uD4D0\uD4D4\uD4DC\uD4DF\uD4E8\uD4EC\uD4F0" - "\uD4F8\uD4FB\uD4FD\uD504\uD508\uD50C\uD514-\uD515\uD517\uD53C-\uD53D" - "\uD540\uD544\uD54C-\uD54D\uD54F\uD551\uD558-\uD559\uD55C\uD560" - "\uD565\uD568-\uD569\uD56B\uD56D\uD574-\uD575\uD578\uD57C\uD584-\uD585" - "\uD587-\uD589\uD590\uD5A5\uD5C8-\uD5C9\uD5CC\uD5D0\uD5D2\uD5D8-\uD5D9" - "\uD5DB\uD5DD\uD5E4-\uD5E5\uD5E8\uD5EC\uD5F4-\uD5F5\uD5F7\uD5F9" - "\uD600-\uD601\uD604\uD608\uD610-\uD611\uD613-\uD615\uD61C\uD620" - "\uD624\uD62D\uD638-\uD639\uD63C\uD640\uD645\uD648-\uD649\uD64B" - "\uD64D\uD651\uD654-\uD655\uD658\uD65C\uD667\uD669\uD670-\uD671" - "\uD674\uD683\uD685\uD68C-\uD68D\uD690\uD694\uD69D\uD69F\uD6A1" - "\uD6A8\uD6AC\uD6B0\uD6B9\uD6BB\uD6C4-\uD6C5\uD6C8\uD6CC\uD6D1" - "\uD6D4\uD6D7\uD6D9\uD6E0\uD6E4\uD6E8\uD6F0\uD6F5\uD6FC-\uD6FD" - "\uD700\uD704\uD711\uD718-\uD719\uD71C\uD720\uD728-\uD729\uD72B" - "\uD72D\uD734-\uD735\uD738\uD73C\uD744\uD747\uD749\uD750-\uD751" - "\uD754\uD756-\uD759\uD760-\uD761\uD763\uD765\uD769\uD76C\uD770" - "\uD774\uD77C-\uD77D\uD781\uD788-\uD789\uD78C\uD790\uD798-\uD799" - "\uD79B\uD79D]" - } -} +// *************************************************************************** +// * +// * Copyright (C) 2005 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ko.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/ko.xml + */ +ko{ + Countries{ + AD{"안도라"} + AE{"아랍에미리트"} + AF{"아프가니스탄"} + AG{"앤티가 바부다"} + AI{"안길라"} + AL{"알바니아"} + AM{"아르메니아"} + AN{"네덜란드령 안틸레스"} + AO{"앙골라"} + AQ{"남극 대륙"} + AR{"아르헨티나"} + AS{"아메리칸 사모아"} + AT{"오스트리아"} + AU{"오스트레일리아"} + AW{"아루바"} + AZ{"아제르바이잔"} + BA{"보스니아 헤르체고비나"} + BB{"바베이도스"} + BD{"방글라데시"} + BE{"벨기에"} + BF{"부르키나파소"} + BG{"불가리아"} + BH{"바레인"} + BI{"부룬디"} + BJ{"베넹"} + BM{"버뮤다"} + BN{"브루나이"} + BO{"볼리비아"} + BR{"브라질"} + BS{"바하마"} + BT{"부탄"} + BV{"부베"} + BW{"보츠와나"} + BY{"벨라루스"} + BZ{"벨리즈"} + CA{"캐나다"} + CC{"코코스제도"} + CD{"콩고민주공화국"} + CF{"중앙 아프리카"} + CG{"콩고"} + CH{"스위스"} + CI{"코트디부와르"} + CK{"쿡제도"} + CL{"칠레"} + CM{"카메룬"} + CN{"중국"} + CO{"콜롬비아"} + CR{"코스타리카"} + CU{"쿠바"} + CV{"까뽀베르데"} + CX{"크리스마스섬"} + CY{"사이프러스"} + CZ{"체코"} + DE{"독일"} + DJ{"지부티"} + DK{"덴마크"} + DM{"도미니카"} + DO{"도미니카 공화국"} + DZ{"알제리"} + EC{"에쿠아도르"} + EE{"에스토니아"} + EG{"이집트"} + EH{"서사하라"} + ER{"에리트리아"} + ES{"스페인"} + ET{"이디오피아"} + FI{"핀란드"} + FJ{"피지"} + FK{"포클랜드제도"} + FM{"마이크로네시아"} + FO{"페로제도"} + FR{"프랑스"} + GA{"가봉"} + GB{"영국"} + GD{"그레나다"} + GE{"그루지야"} + GF{"프랑스령 기아나"} + GH{"가나"} + GI{"지브롤터"} + GL{"그린란드"} + GM{"감비아"} + GN{"기니"} + GP{"과달로프"} + GQ{"적도 기니"} + GR{"그리스"} + GS{"사우스조지아-사우스샌드위치제도"} + GT{"과테말라"} + GU{"괌"} + GW{"기네비쏘"} + GY{"가이아나"} + HK{"홍콩, 중국 특별행정구"} + HM{"허드섬-맥도널드제도"} + HN{"온두라스"} + HR{"크로아티아"} + HT{"하이티"} + HU{"헝가리"} + ID{"인도네시아"} + IE{"아일랜드"} + IL{"이스라엘"} + IN{"인도"} + IO{"영국령인도양식민지"} + IQ{"이라크"} + IR{"이란"} + IS{"아이슬란드"} + IT{"이탈리아"} + JM{"자메이카"} + JO{"요르단"} + JP{"일본"} + KE{"케냐"} + KG{"키르기스스탄"} + KH{"캄보디아"} + KI{"키리바시"} + KM{"코모르"} + KN{"세인트크리스토퍼 네비스"} + KP{"조선 민주주의 인민 공화국"} + KR{"대한민국"} + KW{"쿠웨이트"} + KY{"케이맨제도"} + KZ{"카자흐스탄"} + LA{"라오스"} + LB{"레바논"} + LC{"세인트루시아"} + LI{"리히텐슈타인"} + LK{"스리랑카"} + LR{"라이베리아"} + LS{"레소토"} + LT{"리투아니아"} + LU{"룩셈부르크"} + LV{"라트비아"} + LY{"리비아"} + MA{"모로코"} + MC{"모나코"} + MD{"몰도바"} + MG{"마다가스카르"} + MH{"마샬 군도"} + MK{"마케도니아어"} + ML{"말리"} + MM{"미얀마"} + MN{"몽골"} + MO{"마카오, 중국 특별행정구"} + MP{"북마리아나제도"} + MQ{"말티니크"} + MR{"모리타니"} + MS{"몬트세라트"} + MT{"몰타"} + MU{"모리셔스"} + MV{"몰디브"} + MW{"말라위"} + MX{"멕시코"} + MY{"말레이지아"} + MZ{"모잠비크"} + NA{"나미비아"} + NC{"뉴 칼레도니아"} + NE{"니제르"} + NF{"노퍽섬"} + NG{"나이지리아"} + NI{"니카라과"} + NL{"네덜란드"} + NO{"노르웨이"} + NP{"네팔"} + NR{"나우루"} + NU{"니우에"} + NZ{"뉴질랜드"} + OM{"오만"} + PA{"파나마"} + PE{"페루"} + PF{"프랑스령 폴리네시아"} + PG{"파푸아뉴기니"} + PH{"필리핀"} + PK{"파키스탄"} + PL{"폴란드"} + PM{"세인트피에르-미케롱"} + PN{"핏케언섬"} + PR{"푸에르토리코"} + PS{"팔레스타인 지구"} + PT{"포르트칼"} + PW{"팔라우"} + PY{"파라과이"} + QA{"카타르"} + RE{"리유니온"} + RO{"루마니아"} + RU{"러시아"} + RW{"르완다"} + SA{"사우디아라비아"} + SB{"솔로몬"} + SC{"쉐이쉘"} + SD{"수단"} + SE{"스웨덴"} + SG{"싱가포르"} + SH{"세인트헬레나"} + SI{"슬로베니아"} + SJ{"스발바르제도-얀마웬섬"} + SK{"슬로바키아"} + SL{"시에라리온"} + SM{"산마리노"} + SN{"세네갈"} + SO{"소말리아"} + SP{"세르비아"} + SR{"수리남"} + ST{"상투메 프린시페"} + SV{"엘살바도르"} + SY{"시리아"} + SZ{"스와질랜드"} + TC{"터크스케이커스제도"} + TD{"차드"} + TF{"프랑스 남부 지방"} + TG{"토고"} + TH{"태국"} + TJ{"타지키스탄"} + TK{"토켈라우"} + TL{"동티모르"} + TM{"투르크메니스탄"} + TN{"튀니지"} + TO{"통가"} + TR{"터키"} + TT{"트리니다드 토바고"} + TV{"투발루"} + TW{"대만"} + TZ{"탄자니아"} + UA{"우크라이나"} + UG{"우간다"} + UM{"미국령 해외 제도"} + US{"미국"} + UY{"우루과이"} + UZ{"우즈베키스탄"} + VA{"바티칸"} + VC{"세인트빈센트그레나딘"} + VE{"베네수엘라"} + VG{"영국령 버진 아일랜드"} + VI{"미국령 버진 아일랜드"} + VN{"베트남"} + VU{"바누아투"} + WF{"왈리스-푸투나 제도"} + WS{"사모아"} + YE{"예멘"} + YT{"마요티"} + YU{"유고슬라비아"} + ZA{"남아프리카"} + ZM{"잠비아"} + ZW{"짐바브웨"} + } + Currencies{ + ADD{ + "ADD", + "안도라 디네르", + } + ADP{ + "ADP", + "안도라 페세타", + } + AED{ + "AED", + "아랍에미레이트 디나르", + } + AFA{ + "AFA", + "아프가니 (1927-2002)", + } + AFN{ + "AFN", + "아프가니", + } + AIF{ + "AIF", + "아파르와 이사스의 프랑", + } + ALK{ + "ALK", + "알바니아 레크 (1946-1961)", + } + ALL{ + "ALL", + "알바니아 레크", + } + ALV{ + "ALV", + "알바니아 레크 발루트", + } + ALX{ + "ALX", + "알바니아 달러 태환권", + } + AMD{ + "AMD", + "아르메니아 드람", + } + ANG{ + "ANG", + "네델란드 안틸레스 굴덴", + } + AOA{ + "AOA", + "앙골라 콴자", + } + AOK{ + "AOK", + "앙골라 콴자 (1977-1990)", + } + AON{ + "AON", + "앙골라 신귄 콴자 (1990-2000)", + } + AOR{ + "AOR", + "앙골라 콴자 Reajustado (1995-1999)", + } + AOS{ + "AOS", + "앙골라 에스쿠도", + } + ARA{ + "ARA", + "아르헨티나 오스트랄", + } + ARM{ + "ARM", + "아르헨티나 페소 모네다 국영", + } + ARP{ + "ARP", + "아르헨티나 페소 (1983-1985)", + } + ARS{ + "ARS", + "아르헨티나 페소", + } + ATS{ + "ATS", + "호주 실링", + } + AUD{ + "AUD", + "호주 달러", + } + AUP{ + "AUP", + "호주 파운드", + } + AWG{ + "AWG", + "아루바 길더", + } + AZM{ + "AZM", + "아제르바이젠 마나트", + } + BAD{ + "BAD", + "보스니아-헤르체고비나 디나르", + } + BAM{ + "BAM", + "보스니아-헤르체고비나 태환 마르크", + } + BAN{ + "BAN", + "보스니아-헤르체고비나 신 디나르", + } + BBD{ + "BBD", + "바베이도스 달러", + } + BDT{ + "BDT", + "방글라데시 타카", + } + BEC{ + "BEC", + "벨기에 프랑 (태환)", + } + BEF{ + "BEF", + "벨기에 프랑", + } + BEL{ + "BEL", + "벨기에 프랑 (금융)", + } + BGL{ + "BGL", + "불가리아 동전 렛", + } + BGM{ + "BGM", + "불가리아 사회주의 렛", + } + BGN{ + "BGN", + "불가리아 신권 렛", + } + BGO{ + "BGO", + "불가리아 렛 (1879-1952)", + } + BGX{ + "BGX", + "불가리아 렛 태환권", + } + BHD{ + "BHD", + "바레인 디나르", + } + BIF{ + "BIF", + "부룬디 프랑", + } + BMD{ + "BMD", + "버뮤다 달러", + } + BMP{ + "BMP", + "버뮤다 파운드", + } + BND{ + "BND", + "부루나이 달러", + } + BOB{ + "BOB", + "볼리비아노", + } + BOL{ + "BOL", + "볼리비아노 (1863-1962)", + } + BOP{ + "BOP", + "볼리비아노 페소", + } + BRB{ + "BRB", + "볼리비아노 크루제이루 노보 (1967-1986)", + } + BRC{ + "BRC", + "브라질 크루자두", + } + BRE{ + "BRE", + "브라질 크루제이루 (1990-1993)", + } + BRL{ + "BRL", + "브라질 레알", + } + BRN{ + "BRN", + "브라질 크루자두 노보", + } + BRR{ + "BRR", + "브라질 크루제이루", + } + BRZ{ + "BRZ", + "브라질 크루제이루 (1942-1967)", + } + BSD{ + "BSD", + "바하마 달러", + } + BSP{ + "BSP", + "바하마 달러 파운드", + } + BTN{ + "BTN", + "부탄 눌투눔", + } + BTR{ + "BTR", + "부탄 루피", + } + BUK{ + "BUK", + "버마 차트", + } + BUR{ + "BUR", + "버마 루피", + } + BWP{ + "BWP", + "보츠와나 폴라", + } + BYB{ + "BYB", + "벨라루스 신권 루블 (1994-1999)", + } + BYL{ + "BYL", + "벨라루스 루블 (1992-1994)", + } + BYR{ + "BYR", + "벨라루스 루블", + } + BZD{ + "BZD", + "벨리즈 달러", + } + BZH{ + "BZH", + "영국령 혼두라스 달러", + } + CAD{ + "CAD", + "캐나다 달러", + } + CDF{ + "CDF", + "콩고 프랑 콩골라스", + } + CDG{ + "CDG", + "콩고 공화국 프랑", + } + CDL{ + "CDL", + "콩고 자이르", + } + CHF{ + "CHF", + "스위스 프랑달러", + } + CKD{ + "CKD", + "쿡 제도 달러", + } + CLC{ + "CLC", + "칠레 콘도르", + } + CLE{ + "CLE", + "칠레 에스쿠도", + } + CLP{ + "CLP", + "칠레 페소", + } + CNY{ + "CNY", + "중국 위안 인민폐", + } + COB{ + "COB", + "콜롬비아 지폐 페소", + } + COF{ + "COF", + "콩고 CFA 프랑", + } + COP{ + "COP", + "콜롬비아 페소", + } + CRC{ + "CRC", + "코스타리카 콜론", + } + CSC{ + "CSC", + "체코슬로바키아 코루나", + } + CSK{ + "CSK", + "체코슬로바키아 동전 코루나", + } + CUP{ + "CUP", + "쿠바 페소", + } + CUX{ + "CUX", + "쿠바 태환권 마르크", + } + CVE{ + "CVE", + "카보베르데 에스쿠도", + } + CWG{ + "CWG", + "쿠라카오 길더", + } + CYP{ + "CYP", + "싸이프러스 파운드", + } + CZK{ + "CZK", + "체코 공화국 코루나", + } + DDM{ + "DDM", + "동독 오스트마르크", + } + DEM{ + "DEM", + "독일 마르크", + } + DES{ + "DES", + "독일 스퍼마르크", + } + DJF{ + "DJF", + "지부티 프랑", + } + DKK{ + "DKK", + "덴마크 크로네", + } + DOP{ + "DOP", + "도미니카 페소", + } + DZD{ + "DZD", + "알제리 디나르", + } + DZF{ + "DZF", + "알제리 신권 프랑", + } + DZG{ + "DZG", + "알제리 프랑 제르미날", + } + ECS{ + "ECS", + "에쿠아도르 수크레", + } + EEK{ + "EEK", + "에스토니아 크룬", + } + EGP{ + "EGP", + "이집트 파운드", + } + ERN{ + "ERN", + "에리트리아 나크파", + } + ESP{ + "ESP", + "스페인 페세타", + } + ETB{ + "ETB", + "이디오피아 비르", + } + ETD{ + "ETD", + "이디오피아 달러", + } + EUR{ + "€", + "유로화", + } + FIM{ + "FIM", + "핀란드 마르카", + } + FIN{ + "FIN", + "핀란드 마르카 (1860-1962)", + } + FJD{ + "FJD", + "피지 달러", + } + FJP{ + "FJP", + "피지 파운드", + } + FKP{ + "FKP", + "포클랜드제도 파운드", + } + FOK{ + "FOK", + "페로제도 크로너", + } + FRF{ + "FRF", + "프랑스 프랑", + } + FRG{ + "FRG", + "프랑스 프랑 제르미날/프랑 포앙카레", + } + GAF{ + "GAF", + "가봉 CFA 프랑", + } + GBP{ + "£", + "영국령 파운드 스털링", + } + GEK{ + "GEK", + "그루지야 지폐 라리트", + } + GEL{ + "GEL", + "그루지야 라리", + } + GHC{ + "GHC", + "가나 시디", + } + GHO{ + "GHO", + "가나 구권 시디", + } + GHP{ + "GHP", + "가나 파운드", + } + GHR{ + "GHR", + "가나 재평가 시디", + } + GIP{ + "GIP", + "지브롤터 파운드", + } + GLK{ + "GLK", + "그린란드 크로네", + } + GMD{ + "GMD", + "감비아 달라시", + } + GMP{ + "GMP", + "감비아 파운드", + } + GNF{ + "GNF", + "기니 프랑", + } + GNI{ + "GNI", + "기니 프랑 (1960-1972)", + } + GNS{ + "GNS", + "기니 시리", + } + GPF{ + "GPF", + "과달로프 프랑", + } + GQF{ + "GQF", + "적도 기니 프랑", + } + GQP{ + "GQP", + "적도 기니 페세타 기니아나", + } + GRD{ + "GRD", + "그리스 드라크마", + } + GRN{ + "GRN", + "그리스 신권 드라크마", + } + GTQ{ + "GTQ", + "과테말라 케트살", + } + GUF{ + "GUF", + "프랑스령 가이아나 프랑 기아나", + } + GWE{ + "GWE", + "포르투갈령 기니 에스쿠도", + } + GWM{ + "GWM", + "포르투갈령 기니 밀 레이스", + } + GWP{ + "GWP", + "기네비쏘 페소", + } + GYD{ + "GYD", + "가이아나 달러", + } + HKD{ + "HKD", + "홍콩 달러", + } + HNL{ + "HNL", + "온두라스 렘피라", + } + HRD{ + "HRD", + "크로아티아 디나르", + } + HRK{ + "HRK", + "크로아티아 쿠나", + } + HTG{ + "HTG", + "하이티 구르드", + } + HUF{ + "HUF", + "헝가리 포린트", + } + IBP{ + "IBP", + "북부 아일랜드 파운드", + } + IDG{ + "IDG", + "인도네시아 니카 길더", + } + IDJ{ + "IDJ", + "인도네시아 자바 루피아", + } + IDN{ + "IDN", + "인도네시아 신권 루피아", + } + IDR{ + "IDR", + "인도네시아 루피아", + } + IEP{ + "IR£", + "아일랜드 파운드", + } + ILL{ + "ILL", + "이스라엘 세켈", + } + ILP{ + "ILP", + "이스라엘 파운드", + } + ILS{ + "ILS", + "이스라엘 신권 세켈", + } + IMP{ + "IMP", + "맨도 파운드 스털링", + } + INR{ + "=0#Rs.|1#Re.|1 source: ../../../locale/icu/main/kok.xml + */ +kok{ + Countries{ + IN{"भारत"} + } + Currencies{ + INR{ + "रु", + "INR", + } + } + ExemplarCharacters{"[[:Deva:]‌‍]"} + Languages{ + aa{"अफार"} + ab{"अबखेज़ियन"} + af{"अफ्रिकान्स"} + am{"अमहारिक्"} + ar{"अरेबिक्"} + as{"असामी"} + ay{"ऐमरा"} + az{"अज़रबैजानी"} + ba{"बष्किर"} + be{"बैलोरुसियन्"} + bg{"बल्गेरियन"} + bh{"बीहारी"} + bi{"बिसलमा"} + bn{"बंगाली"} + bo{"तिबेतियन"} + br{"ब्रेटन"} + ca{"कटलान"} + co{"कोर्शियन"} + cs{"ज़ेक्"} + cy{"वेळ्ष्"} + da{"डानिष"} + de{"जर्मन"} + dz{"भूटानी"} + el{"ग्रीक्"} + en{"आंग्ल"} + eo{"इस्परान्टो"} + es{"स्पानिष"} + et{"इस्टोनियन्"} + eu{"बास्क"} + fa{"पर्षियन्"} + fi{"फिन्निष्"} + fj{"फिजी"} + fo{"फेरोस्"} + fr{"फ्रेन्च"} + fy{"फ्रिशियन्"} + ga{"ऐरिष"} + gd{"स्काटस् गेलिक्"} + gl{"गेलीशियन"} + gn{"गौरानी"} + gu{"गुजराती"} + ha{"हौसा"} + he{"हेब्रु"} + hi{"हिन्दी"} + hr{"क्रोयेषियन्"} + hu{"हंगेरियन्"} + hy{"आर्मीनियन्"} + ia{"इन्टरलिंग्वा"} + id{"इन्डोनेषियन"} + ie{"इन्टरलिंग्"} + ik{"इनूपेयाक्"} + is{"आईस्लान्डिक"} + it{"इटालियन"} + iu{"इन्युकट्ट"} + ja{"जापनीस्"} + jv{"जावनीस्"} + ka{"जार्जियन्"} + kk{"कज़ख्"} + kl{"ग्रीनलान्डिक"} + km{"कंबोडियन"} + kn{"कन्नडा"} + ko{"कोरियन्"} + kok{"कोंकणी"} + ks{"कश्मीरी"} + ku{"कुर्दिष"} + ky{"किर्गिज़"} + la{"लाटिन"} + ln{"लिंगाला"} + lo{"लाओतियन्"} + lt{"लिथुआनियन्"} + lv{"लाट्वियन् (लेट्टिष्)"} + mg{"मलागसी"} + mi{"माओरी"} + mk{"मसीडोनियन्"} + ml{"मळियाळम"} + mn{"मंगोलियन्"} + mo{"मोल्डावियन्"} + mr{"मराठी"} + ms{"मलय"} + mt{"मालतीस्"} + my{"बर्मीज़्"} + na{"नौरो"} + ne{"नेपाळी"} + nl{"डच्"} + no{"नोर्वेजियन"} + oc{"ओसिटान्"} + om{"ओरोमो (अफान)"} + or{"ओरिया"} + pa{"पंजाबी"} + pl{"पोलिष"} + ps{"पाष्टो (पुष्टो)"} + pt{"पोर्चुगीज़्"} + qu{"क्वेच्वा"} + rm{"रहटो-रोमान्स्"} + rn{"किरुन्दी"} + ro{"रोमानियन्"} + ru{"रष्यन्"} + rw{"किन्यार्वान्डा"} + sa{"संस्कृत"} + sd{"सिंधी"} + sg{"सांग्रो"} + sh{"सेर्बो-क्रोयेषियन्"} + si{"सिन्हलीस्"} + sk{"स्लोवाक"} + sl{"स्लोवेनियन्"} + sm{"समोन"} + sn{"शोना"} + so{"सोमाळी"} + sq{"आल्बेनियन्"} + sr{"सेर्बियन्"} + ss{"सिस्वाती"} + st{"सेसोथो"} + su{"सुंदनीस"} + sv{"स्वीदीष"} + sw{"स्वाहिली"} + ta{"तमिळ"} + te{"तेलुगू"} + tg{"तजिक"} + th{"थाई"} + ti{"तिग्रिन्या"} + tk{"तुर्कमन"} + tl{"तगालोग"} + tn{"सेत्स्वाना"} + to{"तोंगा"} + tr{"तुर्किष"} + ts{"त्सोगा"} + tt{"तटार"} + tw{"त्वि"} + ug{"उधूर"} + uk{"युक्रेनियन्"} + ur{"उर्दू"} + uz{"उज़बेक"} + vi{"वियत्नामीज़"} + vo{"ओलापुक"} + wo{"उलोफ़"} + xh{"झ़ौसा"} + yi{"इद्दिष्"} + yo{"यूरुबा"} + za{"झ्हुन्ग"} + zh{"चीनीस्"} + zu{"जुलू"} + } + LocaleScript{ + "Deva", + } + Version{"1.2"} + calendar{ + gregorian{ + AmPmMarkers{ + "म.पू.", + "म.नं.", + } + dayNames{ + format{ + abbreviated{ + "रवि", + "सोम", + "मंगळ", + "बुध", + "गुरु", + "शुक्र", + "शनि", + } + wide{ + "आदित्यवार", + "सोमवार", + "मंगळार", + "बुधवार", + "गुरुवार", + "शुक्रवार", + "शनिवार", + } + } + } + eras{ + abbreviated{ + "क्रिस्तपूर्व", + "क्रिस्तशखा", + } + } + monthNames{ + format{ + abbreviated{ + "जानेवारी", + "फेबृवारी", + "मार्च", + "एप्रिल", + "मे", + "जून", + "जुलै", + "ओगस्ट", + "सेप्टेंबर", + "ओक्टोबर", + "नोव्हेंबर", + "डिसेंबर", + } + wide{ + "जानेवारी", + "फेब्रुवारी", + "मार्च", + "एप्रिल", + "मे", + "जून", + "जुलै", + "ओगस्ट", + "सेप्टेंबर", + "ओक्टोबर", + "नोव्हेंबर", + "डिसेंबर", + } + } + } + } + } + zoneStrings{ + { + "Asia/Calcutta", + "भारतीय समय", + "IST", + "भारतीय समय", + "IST", + } + } +} diff --git a/icuSources/data/locales/kok_IN.txt b/icuSources/data/locales/kok_IN.txt index c0535d5e..6a7d29ac 100644 --- a/icuSources/data/locales/kok_IN.txt +++ b/icuSources/data/locales/kok_IN.txt @@ -1,35 +1,42 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/kok_IN.xml // * // *************************************************************************** -// Konkani locale - -kok_IN { - Version { "2.0" } - LocaleID:int { 0x0457 } -// ShortCountry { IND } - - NumberPatterns { +kok_IN{ + NumberPatterns{ "##,##,##0.###;-##,##,##0.###", - "\u00A4 ##,##,##0.00;-\u00A4 ##,##,##0.00", + "¤ ##,##,##0.00;-¤ ##,##,##0.00", "##,##,##0%", "#E0", } - DateTimePatterns { - "h:mm:ss a z", - "h:mm:ss a z", - "h:mm:ss a", - "h:mm a", - "EEEE d MMMM yyyy", - "d MMMM yyyy", - "dd-MM-yyyy", - "d-M-yy", - "{1} {0}" + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "h:mm:ss a z", + "h:mm:ss a z", + "h:mm:ss a", + "h:mm a", + "EEEE d MMMM yyyy", + "d MMMM yyyy", + "dd-MM-yyyy", + "d-M-yy", + "{1} {0}", + } + weekend:intvector{ + 1, + 0, + 1, + 86400000, + } + } } -// DateTimeElements { -// "1", -// "1" -// } } diff --git a/icuSources/data/locales/kw.txt b/icuSources/data/locales/kw.txt index 63eb2876..1ab3cc94 100644 --- a/icuSources/data/locales/kw.txt +++ b/icuSources/data/locales/kw.txt @@ -1,80 +1,92 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/kw.xml // * // *************************************************************************** - +/** + * ICU source: ../../../locale/icu/main/kw.xml + */ kw{ - Version { "2.0" } - DayAbbreviations { - "Sul", - "Lun", - "Mth", - "Mhr", - "Yow", - "Gwe", - "Sad", + Countries{ + GB{"Rywvaneth Unys"} } - DayNames { - "De Sul", - "De Lun", - "De Merth", - "De Merher", - "De Yow", - "De Gwener", - "De Sadorn", + ExemplarCharacters{"[a-z]"} + Languages{ + kw{"kernewek"} } - MonthAbbreviations { - "Gen", - "Whe", - "Mer", - "Ebr", - "Me", - "Efn", - "Gor", - "Est", - "Gwn", - "Hed", - "Du", - "Kev", + LocaleScript{ + "Latn", } - MonthNames { - "Mys Genver", - "Mys Whevrel", - "Mys Merth", - "Mys Ebrel", - "Mys Me", - "Mys Efan", - "Mys Gortheren", - "Mye Est", - "Mys Gwyngala", - "Mys Hedra", - "Mys Du", - "Mys Kevardhu", + Version{"1.2"} + calendar{ + gregorian{ + AmPmMarkers{ + "a.m.", + "p.m.", + } + dayNames{ + format{ + abbreviated{ + "Sul", + "Lun", + "Mth", + "Mhr", + "Yow", + "Gwe", + "Sad", + } + wide{ + "De Sul", + "De Lun", + "De Merth", + "De Merher", + "De Yow", + "De Gwener", + "De Sadorn", + } + } + } + eras{ + abbreviated{ + "RC", + "AD", + } + } + monthNames{ + format{ + abbreviated{ + "Gen", + "Whe", + "Mer", + "Ebr", + "Me", + "Efn", + "Gor", + "Est", + "Gwn", + "Hed", + "Du", + "Kev", + } + wide{ + "Mys Genver", + "Mys Whevrel", + "Mys Merth", + "Mys Ebrel", + "Mys Me", + "Mys Efan", + "Mys Gortheren", + "Mye Est", + "Mys Gwyngala", + "Mys Hedra", + "Mys Du", + "Mys Kevardhu", + } + } + } + } } -// NumberElements { -// ".", -// ",", -// ";", -// "%", -// "0", -// "#", -// "-", -// "E", -// "\u2030", -// "\u221e", -// "\ufffd", -// } -// LocaleScript{ -// "Latn", // ISO 15924 Name -// } - // /**************** Info Below is needed ****************/ - // CollationElements{} - // Countries{} - // Eras{} - // Languages{} - // ShortLanguage { } - // localPatternChars{} - // } diff --git a/icuSources/data/locales/kw_GB.txt b/icuSources/data/locales/kw_GB.txt index 91e7a322..69eb6d03 100644 --- a/icuSources/data/locales/kw_GB.txt +++ b/icuSources/data/locales/kw_GB.txt @@ -1,31 +1,36 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/kw_GB.xml // * // *************************************************************************** - -kw_GB { - Version { "2.0" } - DateTimeElements:intvector { - 2, - 1, - } - DateTimePatterns { - "HH:mm:ss z", - "HH:mm:ss", - "HH:mm:ss", - "HH:mm", - "EEEE d MMMM yyyy", - "d MMMM yyyy", - "d MMM yyyy", - "dd/MM/yyyy", - "{1} {0}", - } - NumberPatterns { +kw_GB{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "\u00a4#,##0.00;-\u00a4#,##0.00", + "¤#,##0.00;-¤#,##0.00", "#,##0%", "#E0", } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm:ss", + "HH:mm", + "EEEE d MMMM yyyy", + "d MMMM yyyy", + "d MMM yyyy", + "dd/MM/yyyy", + "{1} {0}", + } + } + } } diff --git a/icuSources/data/locales/lt.txt b/icuSources/data/locales/lt.txt index 090a551b..afed6af9 100644 --- a/icuSources/data/locales/lt.txt +++ b/icuSources/data/locales/lt.txt @@ -1,92 +1,299 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/lt.xml // * // *************************************************************************** - -lt { - Version{ "2.0" } - CollationElements { - Version { "1.0" } - Sequence { "[backwards 2]& C < c\u030C <<< C\u030C & I << y = \u0131 <<< Y = \u0130 " - "& S < s\u030C <<< S\u030C & X < y\u0301<<< Y\u0301 < y\u0302 <<< Y\u0302 < y\u0308<<< Y" - "\u0308 & Z < z\u030C <<< Z\u030C" } - } - Countries { - LT { "Lietuva" } - } - DateTimePatterns { - "HH:mm:ss z", - "HH:mm:ss z", - "HH:mm:ss", - "HH:mm", - "yyyy 'm.' MMMM d 'd.',EEEE", - "yyyy 'm.' MMMM d 'd.'", - "yyyy.M.d", - "yyyy.M.d", - "{1} {0}", - } - DateTimeElements:intvector { - 2, - 1, // "Minimal Days in First Week" is unknown. Root value used instead - } - DayAbbreviations { - "sk", - "pr", - "an", - "tr", - "kt", - "pn", - "\u0161t", +/** + * ICU source: ../../../locale/icu/main/lt.xml + */ +lt{ + Countries{ + AD{"Andora"} + AE{"Jungtiniai Arabų Emyratai"} + AF{"Afganistanas"} + AG{"Antigva ir Barbuda"} + AI{"Angvila"} + AL{"Albanija"} + AM{"Armėnija"} + AN{"Nyderlandų Antilai"} + AO{"Angola"} + AQ{"Antarktika"} + AR{"Argentina"} + AS{"Amerikos Samoa"} + AT{"Austrija"} + AU{"Australija"} + AW{"Aruba"} + AZ{"Azerbaidžanas"} + BA{"Bosnija ir Hercegovina"} + BB{"Barbadosas"} + BD{"Bangladešas"} + BE{"Belgija"} + BF{"Burkina Fasas"} + BG{"Bulgarija"} + BH{"Bahreinas"} + BI{"Burundis"} + BJ{"Beninas"} + BM{"Bermudai"} + BN{"Brunėjus"} + BO{"Bolivija"} + BR{"Brazilija"} + BS{"Bahamai"} + BT{"Butanas"} + BV{"Bouvet sala"} + BW{"Botsvana"} + BY{"Baltarusija"} + BZ{"Belizas"} + CA{"Kanada"} + CC{"Kokosų salos"} + CD{"Kongo Demokratinė Respublika"} + CF{"Centrinės Afrikos Respublika"} + CG{"Kongas"} + CH{"Šveicarija"} + CI{"Kot d’Ivuar"} + CK{"Kuko salos"} + CL{"Čilė"} + CM{"Kamerūnas"} + CN{"Kinija"} + CO{"Kolumbija"} + CR{"Kosta Rika"} + CU{"Kuba"} + CV{"Žaliojo Kyšulio salos"} + CX{"Kalėdų sala"} + CY{"Kipras"} + CZ{"Čekijos respublika"} + DE{"Vokietija"} + DJ{"Džibutis"} + DK{"Danija"} + DM{"Dominika"} + DO{"Dominikos Respublika"} + DZ{"Alžyras"} + EC{"Ekvadoras"} + EE{"Estija"} + EG{"Egiptas"} + EH{"Vakarų Sachara"} + ER{"Eritrėja"} + ES{"Ispanija"} + ET{"Etiopija"} + FI{"Suomija"} + FJ{"Fidžis"} + FK{"Folklendo salos (Malvinai)"} + FM{"Mikronezijos Federacinės Valstijos"} + FO{"Farerų salos"} + FR{"Prancūzija"} + GA{"Gabonas"} + GB{"Didžioji Britanija"} + GD{"Grenada"} + GE{"Gruzija"} + GF{"Prancūzijos Gviana"} + GH{"Gana"} + GI{"Gibraltaras"} + GL{"Grenlandija"} + GM{"Gambija"} + GN{"Gvinėja"} + GP{"Gvadelupė"} + GQ{"Ekvatorinė Gvinėja"} + GR{"Graikija"} + GS{"Rytų Džordžija ir Rytų Sandwich salos"} + GT{"Gvatemala"} + GU{"Guamas"} + GW{"Gvinėja-Bisau"} + GY{"Gviana"} + HK{"Kinijos S.A.R.Honkongas"} + HM{"Heard ir McDonald salos"} + HN{"Hondūras"} + HR{"Kroatija"} + HT{"Haitis"} + HU{"Vengrija"} + ID{"Indonezija"} + IE{"Airija"} + IL{"Izraelis"} + IN{"Indija"} + IO{"Britų Indijos vandenyno teritorija"} + IQ{"Irakas"} + IR{"Irano"} + IS{"Islandija"} + IT{"Italija"} + JM{"Jamaika"} + JO{"Jordanija"} + JP{"Japonija"} + KE{"Kenija"} + KG{"Kirgiztanas"} + KH{"Kambodža"} + KI{"Kiribatis"} + KM{"Komorai"} + KN{"Sent Kitsas ir Nevis"} + KP{"Šiaurės Korėja"} + KR{"Pietų Korėja"} + KW{"Kuveitas"} + KY{"Kaimanų salos"} + KZ{"Kazachstanas"} + LA{"Laoso Liaudies Demokratinė Respublika"} + LB{"Libanas"} + LC{"Šventoji Liucija"} + LI{"Lichtenšteinas"} + LK{"Šri Lanka"} + LR{"Liberija"} + LS{"Lesotas"} + LT{"Lietuva"} + LU{"Liuksemburgas"} + LV{"Latvija"} + LY{"Libijos Arabų Džamahirija"} + MA{"Marokas"} + MC{"Monakas"} + MD{"Moldovos Respublika"} + MG{"Madagaskaras"} + MH{"Maršalo salos"} + MK{"Makedonijos Respublika"} + ML{"Malis"} + MM{"Mjanma"} + MN{"Mongolija"} + MO{"Kinijos S.A.R. Makao"} + MP{"Šiaurinės Marianos salos"} + MQ{"Martinika"} + MR{"Mauritanija"} + MS{"Montserat"} + MT{"Malta"} + MU{"Mauricijus"} + MV{"Maldivai"} + MW{"Malavis"} + MX{"Meksika"} + MY{"Malaizija"} + MZ{"Mozambikas"} + NA{"Namibija"} + NC{"Naujoji Kaledonija"} + NE{"Nigeris"} + NF{"Norfolko sala"} + NG{"Nigerija"} + NI{"Nikaragva"} + NL{"Nyderlandai"} + NO{"Norvegija"} + NP{"Nepalas"} + NR{"Nauru"} + NU{"Niujė"} + NZ{"Naujoji Zelandija"} + OM{"Omanas"} + PA{"Panama"} + PE{"Peru"} + PF{"Prancūzų Polinezija"} + PG{"Papua Naujoji Gvinėja"} + PH{"Filipinai"} + PK{"Pakistanas"} + PL{"Lenkija"} + PM{"Sen Pjeras ir Mikelonas"} + PN{"Pitkernas"} + PR{"Puerto Rikas"} + PS{"Palestinos teritorija"} + PT{"Portugalija"} + PW{"Palau"} + PY{"Paragvajus"} + QA{"Kataras"} + RE{"Rejunjonas"} + RO{"Rumunija"} + RU{"Rusijos Federacija"} + RW{"Ruanda"} + SA{"Saudo Arabija"} + SB{"Saliamono salos"} + SC{"Seišeliai"} + SD{"Sudanas"} + SE{"Švedija"} + SG{"Singapūras"} + SH{"Šventoji Elena"} + SI{"Slovėnija"} + SJ{"Svalbardo ir Jan Majen salos"} + SK{"Slovakia"} + SL{"Siera Leonė"} + SM{"San Marinas"} + SN{"Senegalas"} + SO{"Somalis"} + SP{"Serbia"} + SR{"Surinamas"} + ST{"San Tomė ir Principė"} + SV{"El Salvadoras"} + SY{"Sirija"} + SZ{"Svazilendas"} + TC{"Turks ir Kaikos salos"} + TD{"Čadas"} + TF{"Prancūzų pietinės teritorijos"} + TG{"Togas"} + TH{"Tailandas"} + TJ{"Tadžikija"} + TK{"Tokelau"} + TL{"Rytų Timoras"} + TM{"Turkmėnistanas"} + TN{"Tunisas"} + TO{"Tonga"} + TR{"Turkija"} + TT{"Trinidadas ir Tobagas"} + TV{"Tuvalu"} + TZ{"Tanzanija"} + UA{"Ukraina"} + UG{"Uganda"} + UM{"JAV antraeilės teritorijos salos"} + US{"United States"} + UY{"Urugvajus"} + UZ{"Uzbekija"} + VA{"Vatikano Miesto Valstija"} + VC{"Šventasis Vincentas ir Grenadinai"} + VE{"Venesuela"} + VG{"Britų Virginijos salos"} + VI{"JAV Virginijos salos"} + VN{"Vietnamas"} + VU{"Vanuatu"} + WF{"Valiso ir Futuna salos"} + WS{"Samoa"} + YE{"Jemenas"} + YT{"Majotė"} + YU{"Jugoslavija"} + ZA{"Pietų Afrika"} + ZM{"Zambija"} + ZW{"Zimbabvė"} } - DayNames { - "sekmadienis", - "pirmadienis", - "antradienis", - "tre\u010Diadienis", - "ketvirtadienis", - "penktadienis", - "\u0161e\u0161tadienis", - } - Eras { - "pr.Kr.", - "po.Kr.", - } - Languages { - lt { "Lietuvi\u0173" } + Currencies{ + LTL{ + "Lt", + "LTL", + } } - LocaleID:int { 0x27 } -// LocaleString { "lt" } - MonthAbbreviations { - "sau", - "vas", - "kov", - "bal", - "geg", - "bir", - "lie", - "rgp", - "rgs", - "spa", - "lap", - "grd", + ExemplarCharacters{"[a-z ą ę į ų ė ū č š ž]"} + Languages{ + ar{"Arabų"} + bg{"Bulgarų"} + cs{"Čekijos"} + da{"Danų"} + de{"Vokiečių"} + el{"Graikų"} + en{"Anglų"} + es{"Ispanų"} + et{"Estų"} + fi{"Suomių"} + fr{"Prancūzų"} + he{"Hebrajų"} + hr{"Kroatų"} + hu{"Vengrų"} + it{"Italų"} + ja{"Japonų"} + ko{"Korėjiečių"} + lt{"Lietuvių"} + lv{"Latvių"} + nl{"Olandų"} + no{"Norvegų"} + pl{"Lenkų"} + pt{"Portugalų"} + ro{"Rumunų"} + ru{"Rusų"} + sk{"Slovakų"} + sl{"Slovėnų"} + sv{"Švedų"} + tr{"Turkų"} + zh{"Kinų"} } - MonthNames { - "sausio", - "vasario", - "kovo", - "baland\u017Eio", - "gegu\u017E\u0117s", - "bir\u017Eelio", - "liepos", - "rugpj\u016B\u010Dio", - "rugs\u0117jo", - "spalio", - "lapkri\u010Dio", - "gruod\u017Eio", + LocaleScript{ + "Latn", } - NumberElements { + NumberElements{ ",", ".", ";", @@ -95,29 +302,90 @@ lt { "#", "-", "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", + "‰", + "∞", + "�", + "+", } -// ShortLanguage { "lit" } - localPatternChars { "GanjkHmsSEDFwWxhKzAe" } - zoneStrings { - { - "Africa/Casablanca", - "GMT", - "GMT", - "GMT", - "GMT", + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 4, + } + DateTimePatterns{ + "HH:mm:ss z", + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm", + "yyyy 'm.' MMMM d 'd.',EEEE", + "yyyy 'm.' MMMM d 'd.'", + "yyyy.MM.dd", + "yyyy.MM.dd", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "Sk", + "Pr", + "An", + "Tr", + "Kt", + "Pn", + "Št", + } + wide{ + "Sekmadienis", + "Pirmadienis", + "Antradienis", + "Trečiadienis", + "Ketvirtadienis", + "Penktadienis", + "Šeštadienis", + } + } + } + eras{ + abbreviated{ + "pr.Kr.", + "po.Kr.", + } + } + monthNames{ + format{ + abbreviated{ + "Sau", + "Vas", + "Kov", + "Bal", + "Geg", + "Bir", + "Lie", + "Rgp", + "Rgs", + "Spa", + "Lap", + "Grd", + } + wide{ + "Sausio", + "Vasario", + "Kovo", + "Balandžio", + "Gegužės", + "Birželio", + "Liepos", + "Rugpjūčio", + "Rugsėjo", + "Spalio", + "Lapkričio", + "Gruodžio", + } + } + } } } -// LocaleScript{ -// "Latn", // ISO 15924 Name -// } - ExemplarCharacters { "[a-z \u0105 \u0119 \u012f \u0173 \u0117 \u016b \u010d \u0161 \u017e]" } - - // Currency display names - Currencies { - LTL { "Lt", "LTL" } - } + localPatternChars{"GanjkHmsSEDFwWxhKzAeugXZ"} } diff --git a/icuSources/data/locales/lt_LT.txt b/icuSources/data/locales/lt_LT.txt index ef8c5cda..771155ab 100644 --- a/icuSources/data/locales/lt_LT.txt +++ b/icuSources/data/locales/lt_LT.txt @@ -1,19 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/lt_LT.xml // * // *************************************************************************** - -lt_LT { - Version{ "2.0" } -// LocaleString { "lt_LT" } - NumberPatterns { +lt_LT{ + NumberPatterns{ "##,##0.##;-##,##0.##", - "#,##0.00 \u00A4;-#,##0.00 \u00A4", + "#,##0.00 ¤;-#,##0.00 ¤", "#,##%", "#E0", } -// ShortCountry { "LTU" } - LocaleID:int { 0x0427 } + Version{"1.2"} } diff --git a/icuSources/data/locales/lv.txt b/icuSources/data/locales/lv.txt index 1d81ff70..98deaec8 100644 --- a/icuSources/data/locales/lv.txt +++ b/icuSources/data/locales/lv.txt @@ -1,123 +1,391 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/lv.xml // * // *************************************************************************** - -lv { - Version{ "2.0"} - CollationElements { - Version { "1.0" } - Sequence { "[casefirst upper][backwards 2] &C < c\u030C <<< C\u030C & G < g\u0327 <<< G\u0327 & I < " - "y<<< Y& K < k\u0327 <<< K\u0327 & L < l\u0327 <<< L\u0327 & N < n\u0327 <<< N\u0327 & S" - " < s\u030C <<< S\u030C & Z < z\u030C <<< Z\u030C" } - } - Countries { - LV { "Latvija" } - } - DateTimePatterns { - "HH:mm:ss z", - "HH:mm:ss z", - "HH:mm:ss", - "HH:mm", - "EEEE, yyyy'. gada 'd. MMMM", - "yyyy'. gada 'd. MMMM", - "yyyy.d.M", - "yy.d.M", - "{1} {0}", - } - DateTimeElements:intvector { - 2, - 1, // "Minimal Days in First Week" is unknown. Root value used instead - } - DayAbbreviations { - "Sv", - "P", - "O", - "T", - "C", - "Pk", - "S", +/** + * ICU source: ../../../locale/icu/main/lv.xml + */ +lv{ + Countries{ + AD{"Andora"} + AE{"Apvienotie Arābu Emirāti"} + AF{"Afganistāna"} + AG{"Antigva un Barbuda"} + AI{"Angilja"} + AL{"Albānija"} + AM{"Armēnija"} + AN{"Antiļas"} + AO{"Angola"} + AQ{"Antarktika"} + AR{"Argentīna"} + AS{"Amerikāņu Samoa"} + AT{"Austrija"} + AU{"Austrālija"} + AW{"Aruba"} + AZ{"Azerbaidžāna"} + BA{"Bosnija un Hercegovina"} + BB{"Barbadosa"} + BD{"Bangladeša"} + BE{"Beļģija"} + BF{"Burkinafaso"} + BG{"Bulgārija"} + BH{"Bahreina"} + BI{"Burundi"} + BJ{"Benina"} + BM{"Bermudu salas"} + BN{"Bruneja"} + BO{"Bolīvija"} + BR{"Brazīlija"} + BS{"Bahamas"} + BT{"Butāna"} + BV{"Buvē sala"} + BW{"Botsvāna"} + BY{"Baltkrievija"} + BZ{"Beliza"} + CA{"Kanāda"} + CC{"Kokosu (Kīlinga) salas"} + CD{"Kongo Demokrātiskā Republika"} + CF{"Centrālāfrikas Republika"} + CG{"Kongo"} + CH{"Šveice"} + CI{"Kotdivuāra"} + CK{"Kuka salas"} + CL{"Čīle"} + CM{"Kamerūna"} + CN{"Ķīna"} + CO{"Kolumbija"} + CR{"Kostarika"} + CU{"Kuba"} + CV{"Kaboverde"} + CX{"Ziemsvētku sala"} + CY{"Kipra"} + CZ{"Čehija"} + DE{"Vācija"} + DJ{"Džibutija"} + DK{"Dānija"} + DM{"Dominika"} + DO{"Dominikānas Republika"} + DZ{"Alžīrija"} + EC{"Ekvadora"} + EE{"Igaunija"} + EG{"Ēģipte"} + EH{"Rietumsahāra"} + ER{"Eritreja"} + ES{"Spānija"} + ET{"Etiopija"} + FI{"Somija"} + FJ{"Fidži"} + FK{"Folklenda salas"} + FM{"Mikronēzijas Federatīvās Valstis"} + FO{"Farēru salas"} + FR{"Francija"} + GA{"Gabona"} + GB{"Lielbritānija"} + GD{"Grenāda"} + GE{"Gruzija"} + GF{"Franču Gviāna"} + GH{"Gana"} + GI{"Gibraltārs"} + GL{"Grenlande"} + GM{"Gambija"} + GN{"Gvineja"} + GP{"Gvadelupa"} + GQ{"Ekvatoriālā Gvineja"} + GR{"Grieķija"} + GS{"Dienviddžordžija un Dienvidsendviču salas"} + GT{"Gvatemala"} + GU{"Guama"} + GW{"Gvineja-Bisava"} + GY{"Gajāna"} + HK{"Honkonga, Ķīnas īpašās pārvaldes apgabals"} + HM{"Hērda un Makdonalda salas"} + HN{"Hondurasa"} + HR{"Horvātija"} + HT{"Haiti"} + HU{"Ungārija"} + ID{"Indonēzija"} + IE{"Īrija"} + IL{"Izraēla"} + IN{"Indija"} + IO{"Britu Indijas okeāna teritorija"} + IQ{"Irāka"} + IR{"Irāna"} + IS{"Islande"} + IT{"Itālija"} + JM{"Jamaika"} + JO{"Jordānija"} + JP{"Japāna"} + KE{"Kenija"} + KG{"Kirgīzija"} + KH{"Kambodža"} + KI{"Kiribati"} + KM{"Komoru salas"} + KN{"Sentkitsa un Nevisa"} + KP{"Ziemeļkoreja"} + KR{"Dienvidkoreja"} + KW{"Kuveita"} + KY{"Kaimanu salas"} + KZ{"Kazahstāna"} + LA{"Laosa"} + LB{"Libāna"} + LC{"Sentlūsija"} + LI{"Lihtenšteina"} + LK{"Šrilanka"} + LR{"Libērija"} + LS{"Lesoto"} + LT{"Lietuva"} + LU{"Luksemburga"} + LV{"Latvija"} + LY{"Lībija"} + MA{"Maroka"} + MC{"Monako"} + MD{"Moldova"} + MG{"Madagaskara"} + MH{"Māršala salas"} + MK{"Maķedonija"} + ML{"Mali"} + MM{"Mjanma"} + MN{"Mongolija"} + MO{"Makao, Ķīnas īpašās pārvaldes apgabals"} + MP{"Ziemeļu Marianas"} + MQ{"Martinika"} + MR{"Mauritānija"} + MS{"Montserrata"} + MT{"Malta"} + MU{"Maurīcija"} + MV{"Maldīvija"} + MW{"Malāvija"} + MX{"Meksika"} + MY{"Malaizija"} + MZ{"Mozambika"} + NA{"Namībija"} + NC{"Jaunkaledonija"} + NE{"Nigēra"} + NF{"Norfolka"} + NG{"Nigērija"} + NI{"Nikaragva"} + NL{"Nīderlande"} + NO{"Norvēģija"} + NP{"Nepāla"} + NR{"Nauru"} + NU{"Niue"} + NZ{"Jaunzēlande"} + OM{"Omāna"} + PA{"Panama"} + PE{"Peru"} + PF{"Franču Polinēzija"} + PG{"Papua-Jaungvineja"} + PH{"Filipīnas"} + PK{"Pakistāna"} + PL{"Polija"} + PM{"Senpjēra un Mikelona"} + PN{"Pitkērna"} + PR{"Puertoriko"} + PS{"Palestīniešu pašpārvaldes teritorija"} + PT{"Portugāle"} + PW{"Palau"} + PY{"Paragvaja"} + QA{"Katara"} + RE{"Reinjona"} + RO{"Rumānija"} + RU{"Krievija"} + RW{"Ruanda"} + SA{"Saūda Arābija"} + SB{"Zālamana salas"} + SC{"Seišeļu salas"} + SD{"Sudāna"} + SE{"Zviedrija"} + SG{"Singapūra"} + SH{"Sv. Helēnas sala"} + SI{"Slovēnija"} + SJ{"Svalbāra un Jana Majena sala"} + SK{"Slovākija"} + SL{"Sjerraleone"} + SM{"Sanmarīno"} + SN{"Senegāla"} + SO{"Somālija"} + SP{"Serbia"} + SR{"Surinama"} + ST{"Santome un Prinsipi"} + SV{"Salvadora"} + SY{"Sīrija"} + SZ{"Svazilenda"} + TC{"Tērksas un Kaikosas salas"} + TD{"Čada"} + TF{"Franču dienvidu teritorijas"} + TG{"Togo"} + TH{"Taizeme"} + TJ{"Tadžikistāna"} + TK{"Tokelau"} + TL{"Austrumtimora"} + TM{"Turkmenistāna"} + TN{"Tunisija"} + TO{"Tonga"} + TR{"Turcija"} + TT{"Trinidāda un Tobāgo"} + TV{"Tuvalu"} + TZ{"Tanzānija"} + UA{"Ukraina"} + UG{"Uganda"} + UM{"ASV mazās aizjūras teritorijas"} + US{"United States"} + UY{"Urugvaja"} + UZ{"Uzbekistāna"} + VA{"Vatikāns"} + VC{"Sentvinsenta un Grenadīnas"} + VE{"Venecuēla"} + VG{"Britu Virdžīnu salas"} + VI{"Amerikāņu Virdžīnu salas"} + VN{"Vjetnama"} + VU{"Vanuatu"} + WF{"Volisa un Futuna"} + WS{"Samoa"} + YE{"Jemena"} + YT{"Majota"} + YU{"Dienvidslāvija"} + ZA{"Dienvidāfrika"} + ZM{"Zambija"} + ZW{"Zimbabve"} } - DayNames { - "sv\u0113tdiena", - "pirmdiena", - "otrdiena", - "tre\u0161diena", - "ceturtdiena", - "piektdiena", - "sestdiena", - } - Eras { - "pm\u0113", - "m\u0113", - } - Languages { - lv { "Latvie\u0161u" } + Currencies{ + LVL{ + "Ls", + "LVL", + } } - LocaleID:int { 0x26 } -// LocaleString { "lv" } - MonthAbbreviations { - "Jan", - "Feb", - "Mar", - "Apr", - "Maijs", - "J\u016Bn", - "J\u016Bl", - "Aug", - "Sep", - "Okt", - "Nov", - "Dec", + ExemplarCharacters{"[a-z ā ē ī ō ū ģ ķ ļ ņ ŗ č š ž]"} + Languages{ + ar{"arābu"} + bg{"bulgāru"} + cs{"čehu"} + da{"dāņu"} + de{"vācu"} + el{"grieķu"} + en{"angļu"} + es{"spāņu"} + et{"igauņu"} + fi{"somu"} + fr{"franču"} + he{"ivrits"} + hr{"horvātu"} + hu{"ungāru"} + it{"itāliešu"} + ja{"japāņu"} + ko{"korejiešu"} + lt{"lietuviešu"} + lv{"latviešu"} + nl{"holandiešu"} + no{"norvēģu"} + pl{"poļu"} + pt{"portugāļu"} + ro{"rumāņu"} + ru{"krievu"} + sk{"slovāku"} + sl{"slovēņu"} + sv{"zviedru"} + tr{"turku"} + zh{"ķīniešu"} } - MonthNames { - "janv\u0101ris", - "febru\u0101ris", - "marts", - "apr\u012Blis", - "maijs", - "j\u016Bnijs", - "j\u016Blijs", - "augusts", - "septembris", - "oktobris", - "novembris", - "decembris", + LocaleScript{ + "Latn", } - NumberElements { + NumberElements{ ",", - "\u00A0", + " ", ";", "%", "0", "#", "-", "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", + "‰", + "∞", + "�", + "+", } -// ShortLanguage { "lav" } - localPatternChars { "GanjkHmsSEDFwWxhKzAe" } - zoneStrings { - { - "Africa/Casablanca", - "GMT", - "GMT", - "GMT", - "GMT", + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "HH:mm:ss z", + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm", + "EEEE, yyyy'. gada 'd. MMMM", + "yyyy'. gada 'd. MMMM", + "yyyy.d.M", + "yy.d.M", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "Sv", + "P", + "O", + "T", + "C", + "Pk", + "S", + } + wide{ + "svētdiena", + "pirmdiena", + "otrdiena", + "trešdiena", + "ceturtdiena", + "piektdiena", + "sestdiena", + } + } + } + eras{ + abbreviated{ + "pmē", + "mē", + } + } + monthNames{ + format{ + abbreviated{ + "Jan", + "Feb", + "Mar", + "Apr", + "Mai", + "Jūn", + "Jūl", + "Aug", + "Sep", + "Okt", + "Nov", + "Dec", + } + wide{ + "janvāris", + "februāris", + "marts", + "aprīlis", + "maijs", + "jūnijs", + "jūlijs", + "augusts", + "septembris", + "oktobris", + "novembris", + "decembris", + } + } + } } } - ExemplarCharacters { "[a-z \u0101 \u0113 \u012b \u014d \u016b \u0123 \u0137 \u013c \u0146 \u0157 \u010d \u0161 \u017e]" } -// LocaleScript{ -// "Latn", // ISO 15924 Name -// } - - // Currency display names - Currencies { - LVL { "Ls", "LVL" } - } + localPatternChars{"GanjkHmsSEDFwWxhKzAeugXZ"} } diff --git a/icuSources/data/locales/lv_LV.txt b/icuSources/data/locales/lv_LV.txt index 35046e19..3f4ce914 100644 --- a/icuSources/data/locales/lv_LV.txt +++ b/icuSources/data/locales/lv_LV.txt @@ -1,19 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/lv_LV.xml // * // *************************************************************************** - -lv_LV { - Version{ "2.0" } -// LocaleString { "lv_LV" } - NumberPatterns { +lv_LV{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "#,##0.00 \u00A4;-#,##0.00 \u00A4", + "#,##0.00 ¤;-#,##0.00 ¤", "#,##0%", "#E0", } -// ShortCountry { "LVA" } - LocaleID:int { 0x0426 } + Version{"1.2"} } diff --git a/icuSources/data/locales/mk.txt b/icuSources/data/locales/mk.txt index 38a2d171..f9dcae9f 100644 --- a/icuSources/data/locales/mk.txt +++ b/icuSources/data/locales/mk.txt @@ -1,117 +1,1364 @@ -// *************************************************************************** -// * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -mk { - Version { "2.0"} - // We use UCA collation table optimized for Cyrillic - // as defined in the Russian locale - CollationElements:alias { "ru" } - - Countries { - MK { "\u041C\u0430\u043A\u0435\u0434\u043E\u043D\u0438\u0458\u0430" } - } - DateTimePatterns { - "HH:mm:ss z", - "HH:mm:ss z", - "HH:mm:ss", - "HH:mm", - "EEEE, dd MMMM yyyy", - "dd MMMM yyyy", - "dd.M.yyyy", - "dd.M.yy", - "{1} {0}", - } - DayAbbreviations { - "\u043D\u0435\u0434.", - "\u043F\u043E\u043D.", - "\u0432\u0442.", - "\u0441\u0440\u0435.", - "\u0447\u0435\u0442.", - "\u043F\u0435\u0442.", - "\u0441\u0430\u0431.", - } - DayNames { - "\u043D\u0435\u0434\u0435\u043B\u0430", - "\u043F\u043E\u043D\u0435\u0434\u0435\u043B\u043D\u0438\u043A", - "\u0432\u0442\u043E\u0440\u043D\u0438\u043A", - "\u0441\u0440\u0435\u0434\u0430", - "\u0447\u0435\u0442\u0432\u0440\u0442\u043E\u043A", - "\u043F\u0435\u0442\u043E\u043A", - "\u0441\u0430\u0431\u043E\u0442\u0430", - } - Eras { - "\u043F\u0440.\u043D.\u0435.", - "\u0430\u0435.", - } - Languages { - mk { "\u043C\u0430\u043A\u0435\u0434\u043E\u043D\u0441\u043A\u0438" } - } - LocaleID:int { 0x2f } -// LocaleString { "mk" } - MonthAbbreviations { - "\u0458\u0430\u043D.", - "\u0444\u0435\u0432.", - "\u043C\u0430\u0440.", - "\u0430\u043F\u0440.", - "\u043C\u0430\u0458.", - "\u0458\u0443\u043D.", - "\u0458\u0443\u043B.", - "\u0430\u0432\u0433.", - "\u0441\u0435\u043F\u0442.", - "\u043E\u043A\u0442.", - "\u043D\u043E\u0435\u043C.", - "\u0434\u0435\u043A\u0435\u043C.", - } - MonthNames { - "\u0458\u0430\u043D\u0443\u0430\u0440\u0438", - "\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438", - "\u043C\u0430\u0440\u0442", - "\u0430\u043F\u0440\u0438\u043B", - "\u043C\u0430\u0458", - "\u0458\u0443\u043D\u0438", - "\u0458\u0443\u043B\u0438", - "\u0430\u0432\u0433\u0443\u0441\u0442", - "\u0441\u0435\u043F\u0442\u0435\u043C\u0432\u0440\u0438", - "\u043E\u043A\u0442\u043E\u043C\u0432\u0440\u0438", - "\u043D\u043E\u0435\u043C\u0432\u0440\u0438", - "\u0434\u0435\u043A\u0435\u043C\u0432\u0440\u0438", - } - NumberElements { - ",", - ".", - ";", - "%", - "0", - "#", - "-", - "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", - } -// ShortLanguage { "mkd" } - localPatternChars { "GuMtkHmsSEDFwWahKzUe" } - zoneStrings { - { - "Africa/Casablanca", - "GMT", - "GMT", - "GMT", - "GMT", - } - } - LocaleScript{ - "Cyrl", // ISO 15924 Name - } - ExemplarCharacters { "[\u0430-\u0438 \u043a-\u0448 \u0450 \u0453 \u0455 \u0458 \u0459 \u045a \u045c \u045d \u045f]" } - - // Currency display names - Currencies { - MKD { "Den", "MKD" } - } -} +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/mk.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/mk.xml + */ +mk{ + Countries{ + AD{"Андора"} + AE{"Обединети Арапски Емирати"} + AF{"Авганистан"} + AG{"Антигуа и Барбуда"} + AI{"Ангвила"} + AL{"Албанија"} + AM{"Ерменија"} + AN{"Холандски Антили"} + AO{"Ангола"} + AQ{"Антарктик"} + AR{"Аргентина"} + AS{"Американска Самоа"} + AT{"Австрија"} + AU{"Австралија"} + AW{"Аруба"} + AZ{"Азејберџан"} + BA{"Босна и Херцеговина"} + BB{"Барбадос"} + BD{"Бангладеш"} + BE{"Белгија"} + BF{"Буркина Фасо"} + BG{"Бугарија"} + BH{"Бахреин"} + BI{"Бурунди"} + BJ{"Бенин"} + BM{"Бермуди"} + BN{"Брунеи"} + BO{"Боливија"} + BR{"Бразил"} + BS{"Бахами"} + BT{"Бутан"} + BV{"Боувитови острови"} + BW{"Боцвана"} + BY{"Белорусија"} + BZ{"Белизе"} + CA{"Канада"} + CC{"Кокосови острови"} + CD{"Демократска Република Конго"} + CF{"Централан Афричка република"} + CG{"Конго"} + CH{"Швајцарија"} + CI{"Брегот на Слоновата Коска"} + CK{"Кукови Острови"} + CL{"Чиле"} + CM{"Камерун"} + CN{"Кина"} + CO{"Колумбија"} + CR{"Костарика"} + CU{"Куба"} + CV{"Зеленортски Острови"} + CX{"Божиќни Острови"} + CY{"Кипар"} + CZ{"Чешка Република"} + DE{"Германија"} + DJ{"Џибути"} + DK{"Данска"} + DM{"Доминика"} + DO{"Доминиканска Република"} + DZ{"Алжир"} + EC{"Еквадор"} + EE{"Естонија"} + EG{"Египет"} + EH{"Западна Сахара"} + ER{"Еритреја"} + ES{"Шпанија"} + ET{"Етиопија"} + FI{"Финска"} + FJ{"Фиџи"} + FK{"Фокландски Острови"} + FM{"Микронезија"} + FO{"Фарски Острови"} + FR{"Франција"} + GA{"Габон"} + GB{"Велика Британија"} + GD{"Гренада"} + GE{"Џорџија"} + GF{"Француска Гуана"} + GH{"Гана"} + GI{"Гилбартар"} + GL{"Гренланд"} + GM{"Гамбија"} + GN{"Гвинеја"} + GP{"Гвадалупе"} + GQ{"Екваторска Гвинеја"} + GR{"Грција"} + GS{"Јужна Џорџија и Јужни Сендвич Острови"} + GT{"Гватемала"} + GU{"Гвам"} + GW{"Гвинеа-Биса"} + GY{"Гвајана"} + HK{"Хон Конг С.А.Р Кина"} + HM{"Хардови острови и Мекдоналд Острови"} + HN{"Хондурас"} + HR{"Хрватска"} + HT{"Хаити"} + HU{"Унгарија"} + ID{"Индонезија"} + IE{"Ирска"} + IL{"Израел"} + IN{"Индија"} + IO{"Британско Индиско Океанска територија"} + IQ{"Ирак"} + IR{"Иран"} + IS{"Исланд"} + IT{"Италија"} + JM{"Јамајка"} + JO{"Јордан"} + JP{"Јапонија"} + KE{"Кенија"} + KG{"Кургистан"} + KH{"Камбоџа"} + KI{"Кирибати"} + KM{"Коморос"} + KN{"Сент Кристофер и Невис"} + KP{"Северна Кореа"} + KR{"Јужна Кореа"} + KW{"Кувајт"} + KY{"Кајманови Острови"} + KZ{"Казаџстан"} + LA{"Лаос"} + LB{"Либанон"} + LC{"Света Лучија"} + LI{"Лихтенштајн"} + LK{"Шри Ланка"} + LR{"Либериа"} + LS{"Лешото"} + LT{"Литванија"} + LU{"Луксембург"} + LV{"Латвија"} + LY{"Либија"} + MA{"Мароко"} + MC{"Монако"} + MD{"Молдова"} + MG{"Мадагаскар"} + MH{"Маршалови ОСтрови"} + MK{"Македонија"} + ML{"Мали"} + MM{"Муанмар"} + MN{"Монголија"} + MO{"Макао С.А.Р Кина"} + MP{"Северни Маријанини Острови"} + MQ{"Мартиник"} + MR{"Мавританија"} + MS{"Монсерат"} + MT{"Малта"} + MU{"Мауритус"} + MV{"Малдиви"} + MW{"Малави"} + MX{"Мексико"} + MY{"Малезија"} + MZ{"Мозамбе"} + NA{"Намибија"} + NC{"Нова Каледонија"} + NE{"Нигер"} + NF{"Нофролк Остров"} + NG{"Нигерија"} + NI{"Никараква"} + NL{"Холандија"} + NO{"Норвешка"} + NP{"Непал"} + NR{"Науру"} + NU{"Ние"} + NZ{"Нов Зеланд"} + OM{"Оман"} + PA{"Панама"} + PE{"Перу"} + PF{"Француска Полинезија"} + PG{"Папуа Нова Гвинеја"} + PH{"Филипини"} + PK{"Пакистан"} + PL{"Полска"} + PM{"Сент Пјер и Микелан"} + PN{"Питкарн"} + PR{"Порторико"} + PS{"Палестинска Територија"} + PT{"Португалија"} + PW{"Палау"} + PY{"Парагвај"} + QA{"Кватар"} + RE{"Рејунион"} + RO{"Романија"} + RU{"Русија"} + RW{"Руанда"} + SA{"Саудиска Арабија"} + SB{"Соломоновите Острови"} + SC{"Сејшели"} + SD{"Судан"} + SE{"Шведска"} + SG{"Сингапур"} + SH{"Света Елена"} + SI{"Словенија"} + SJ{"Свалбард и Жан Мијен Острови"} + SK{"Словачка"} + SL{"Сиера Леоне"} + SM{"Сан Марино"} + SN{"Сенегал"} + SO{"Сомалија"} + SP{"Србија"} + SR{"Суринам"} + ST{"Сао Томе и Принципе"} + SV{"Ел Салвадор"} + SY{"Сирија"} + SZ{"Свазиленд"} + TC{"Турк и Каикос Острови"} + TD{"Чад"} + TF{"Француски Јужни територии"} + TG{"Того"} + TH{"Тајланд"} + TJ{"Таџикистан"} + TK{"Токелау"} + TL{"Источен Тимор"} + TM{"Туркменистан"} + TN{"Тунис"} + TO{"Тонга"} + TR{"Турција"} + TT{"Тринидад и Тобаго"} + TV{"Тувалу"} + TW{"Тајван"} + TZ{"Танзанија"} + UA{"Украина"} + UG{"Уганда"} + US{"Обединети Држави"} + UY{"Уругвај"} + UZ{"Узбекистан"} + VA{"Ватикан"} + VC{"Сент Винцент и Гренадините"} + VE{"Венецуела"} + VG{"Британски Девствени Острови"} + VI{"Девствени Острови на САД"} + VN{"Виетнам"} + VU{"Ванату"} + WF{"Волис и Футуна острови"} + WS{"Самоа"} + YE{"Јемен"} + YT{"Мајоте"} + YU{"Југославија"} + ZA{"Јужна Африка"} + ZM{"Замбија"} + ZW{"Зимбабве"} + } + Currencies{ + ADD{ + "ADD", + "Андорски Динер", + } + ADP{ + "ADP", + "Андорска Пезета", + } + AED{ + "AED", + "Дирхам", + } + AFA{ + "AFA", + "Авгани (1927-2002)", + } + AFN{ + "Af", + "Авгани", + } + ALK{ + "ALK", + "Албански лек (1946-1961)", + } + ALL{ + "lek", + "Албански Лек", + } + ALV{ + "ALV", + "Албанска Лек Валута", + } + AMD{ + "dram", + "Ермениски Драм", + } + AOA{ + "AOA", + "Анголска Кванза", + } + AOK{ + "AOK", + "Анголска Кванза (1977-1990)", + } + AON{ + "AON", + "Анголска нова Кванза (1990-2000)", + } + AOS{ + "AOS", + "Анголско ескудо", + } + ARP{ + "ARP", + "Аргентински Пезос (1983-1985)", + } + ARS{ + "Arg$", + "Аргентински Пезос", + } + ATS{ + "ATS", + "Австралиски Шилинг", + } + AUD{ + "$A", + "Австралиски Долар", + } + AUP{ + "AUP", + "Австралиска Фунта", + } + BAD{ + "BAD", + "Босанско-Херцеговски Динар", + } + BAM{ + "KM", + "Босанско-Херцеговски Динар конвертабилна марка", + } + BAN{ + "BAN", + "Босанско-Херцеговски нов Динар", + } + BBD{ + "BDS$", + "Барбадоски Долар", + } + BEC{ + "BEC", + "Белгиски Франк (конвертибилен)", + } + BEF{ + "BF", + "Белгиски Франк", + } + BEL{ + "BEL", + "Белгиски Франк (финансиски)", + } + BGL{ + "lev", + "Бугарски цврст лев", + } + BGM{ + "BGM", + "Бугарски социјалистички лев", + } + BGN{ + "BGN", + "Бугарски нов лев", + } + BGO{ + "BGO", + "Бугарски лев(1879-1952)", + } + BHD{ + "BD", + "Бахраински Динар", + } + BIF{ + "Fbu", + "Буриндиски Франк", + } + BMD{ + "Ber$", + "Бермудски Долар", + } + BMP{ + "BMP", + "Бермудски фунта", + } + BND{ + "BND", + "Брунејски долар", + } + BSD{ + "BSD", + "Бахамски Долар", + } + BSP{ + "BSP", + "Бахамска Фунта", + } + BTR{ + "BTR", + "Бутански Рупии", + } + BUR{ + "BUR", + "Бурмезиски рупии", + } + BWP{ + "BWP", + "Боцвантска Пула", + } + BYB{ + "BYB", + "Белоруска нова рубља (1994-1999)", + } + BYL{ + "BYL", + "Белоруска Рубља (1992-1994)", + } + BYR{ + "Rbl", + "Белоруска Рубља", + } + BZD{ + "BZ$", + "Белизиски Долар", + } + BZH{ + "BZH", + "Британско Хондурски Долар", + } + CAD{ + "Can$", + "Канадски Долар", + } + CHF{ + "SwF", + "Швајцарски Франк", + } + COP{ + "Col$", + "Колумбиски Пезос", + } + CRC{ + "C", + "Костарикански Колон", + } + CSC{ + "CSC", + "Чехословачка корона", + } + CSK{ + "CSK", + "Чехословачка цврста корона", + } + CUP{ + "CUP", + "Кубански пезос", + } + CYP{ + "£C", + "Кипарска фунта", + } + CZK{ + "CZK", + "Чешка корона", + } + DEM{ + "DEM", + "Германска Марка", + } + DOP{ + "RD$", + "Доминикански Пезос", + } + DZD{ + "DA", + "Алгериски Динар", + } + DZF{ + "DZF", + "Алгериски нов Франк", + } + EGP{ + "EGP", + "Египетска Фунта", + } + ESP{ + "ESP", + "Шпанска Пезета", + } + ETB{ + "Br", + "Етиописки Бир", + } + ETD{ + "ETD", + "Етиописки Долар", + } + EUR{ + "€", + "Евро", + } + FIM{ + "FIM", + "Финска марка", + } + FIN{ + "FIN", + "Финска Марка (1860-1962)", + } + FJD{ + "F$", + "Фиџи долар", + } + FJP{ + "FJP", + "Фиџи фунта", + } + FKP{ + "FKP", + "Факландска фунта", + } + FRF{ + "FRF", + "Француски франк", + } + GAF{ + "GAF", + "Габон CFA Франк", + } + GBP{ + "£", + "Британска Фунта", + } + GEL{ + "lari", + "Грузиски лари", + } + GHC{ + "GHC", + "Ганајски Седи", + } + GHO{ + "GHO", + "Ганајски стари Седи", + } + GHP{ + "GHP", + "Ганајски фунта", + } + GIP{ + "GIP", + "Гибралтарска фунта", + } + GLK{ + "GLK", + "Гренландск круна", + } + GMD{ + "GMD", + "Гамбиски Даласи", + } + GMP{ + "GMP", + "Гамбиска Фунта", + } + GNF{ + "GF", + "Гвинејски франк", + } + GNI{ + "GNI", + "Гвинејски франк (1960-1972)", + } + GRD{ + "GRD", + "Грчка драхма", + } + GRN{ + "GRN", + "Грчка драхма", + } + GTQ{ + "Q", + "Гватемалски кветцал", + } + GWP{ + "GWP", + "Гвинејски Бисау пезос", + } + GYD{ + "G$", + "Гвијански Долар", + } + HKD{ + "HK$", + "Хонгкошки долар", + } + HNL{ + "L", + "Хондурска лемпира", + } + HRD{ + "HRD", + "Хрватски динар", + } + HRK{ + "HRK", + "Хрватска Куна", + } + HTG{ + "HTG", + "Хаитски гурд", + } + HUF{ + "Ft", + "Унгарска форинта", + } + IBP{ + "IBP", + "Северноирска фунта", + } + IEP{ + "IR£", + "Ирска фунта", + } + ILL{ + "ILL", + "Израелски шекел", + } + ILP{ + "ILP", + "Изрелска фунта", + } + ILS{ + "ILS", + "Израелски нов шекел", + } + INR{ + "INR", + "Индиска рупија", + } + IQD{ + "ID", + "Ирачки динар", + } + IRR{ + "RI", + "Ирански риал", + } + ISK{ + "ISK", + "Исландска крона", + } + ITL{ + "₤", + "Италијанкса лира", + } + JMD{ + "J$", + "Јамајкански долар", + } + JMP{ + "JMP", + "Јамајканска фунта", + } + JOD{ + "JD", + "Јордански динар", + } + JPY{ + "¥", + "Јапонски јен", + } + KES{ + "K Sh", + "Кениски шилинг", + } + KGS{ + "som", + "Киргистански сом", + } + KHO{ + "KHO", + "Камбоџиски стар рел", + } + KHR{ + "CR", + "Камбоџиски рел", + } + KID{ + "KID", + "Кирбатски долар", + } + KMF{ + "CF", + "Коморски долар", + } + KPW{ + "KPW", + "Северно корејски вон", + } + KRH{ + "KRH", + "Јужно корески хван", + } + KRO{ + "KRO", + "Јужно корејски стар вон", + } + KRW{ + "KRW", + "Јужно корејски вон", + } + KWD{ + "KD", + "Кувајтски динар", + } + KZR{ + "KZR", + "Казакстанска рубља", + } + KZT{ + "T", + "Казакстантска тенга", + } + LAK{ + "LAK", + "Лаоски кип", + } + LBP{ + "LL", + "Либиска фунта", + } + LIF{ + "LIF", + "Лихнтенштајнски франк", + } + LKR{ + "SL Re", + "Шриланканска рупија", + } + LNR{ + "LNR", + "Цејлонска рупија", + } + LRD{ + "LRD", + "Либериски долар", + } + LSL{ + "M", + "Лесотско лоти", + } + LTL{ + "LTL", + "Литваниска лита", + } + LTT{ + "LTT", + "Литваниски литаз", + } + LUF{ + "LUF", + "Луксембуршки франк", + } + LVL{ + "LVL", + "Латвијски лат", + } + LVR{ + "LVR", + "Латвијска рубља", + } + LYD{ + "LD", + "Либијски динар", + } + LYP{ + "LYP", + "Либијска фунта", + } + MAD{ + "MAD", + "Марокански Дирхам", + } + MAF{ + "MAF", + "Марконски франк", + } + MDL{ + "MDL", + "Молдавски леу", + } + MKD{ + "MDen", + "Македонски денар", + } + MKN{ + "MKN", + "Македонски денар (1992-1993)", + } + MLF{ + "MLF", + "Малски франк", + } + MNT{ + "Tug", + "Монголиски тугрик", + } + MOP{ + "MOP", + "Макао патака", + } + MTL{ + "Lm", + "Малтиска лира", + } + MTP{ + "MTP", + "Малтиска финта", + } + MWP{ + "MWP", + "Малависка фунта", + } + MXN{ + "MEX$", + "Мексикански пезос", + } + MXP{ + "MXP", + "Мексикански сребрен пезос (1861-1992)", + } + MYR{ + "RM", + "Малазиски рингит", + } + MZE{ + "MZE", + "Мозамбиско ескудо", + } + MZM{ + "Mt", + "Мозамбиски метикал", + } + NAD{ + "N$", + "Намибиски долар", + } + NGN{ + "NGN", + "Нигериска наира", + } + NGP{ + "NGP", + "Нигериска фунта", + } + NIC{ + "NIC", + "Никарагванска кордоба", + } + NIG{ + "NIG", + "Никарагванска златна кордоба", + } + NLG{ + "NLG", + "Холандски гилдер", + } + NOK{ + "NKr", + "Норвешка круна", + } + NPR{ + "Nrs", + "Непалска рупија", + } + NZD{ + "$NZ", + "Новозелански долар", + } + NZP{ + "NZP", + "Новозеландка фунта", + } + OMR{ + "RO", + "Омански Риал", + } + PAB{ + "PAB", + "Панамска балбоа", + } + PEN{ + "PEN", + "Перуански нов сол", + } + PES{ + "PES", + "Перуански сол", + } + PGK{ + "PGK", + "Папуа новогвинејскиа кина", + } + PHP{ + "PHP", + "Филипински пезос", + } + PKR{ + "Pra", + "Пакистанска рупија", + } + PLN{ + "Zl", + "Полска злота", + } + PLZ{ + "PLZ", + "Полска злота (1950-1995)", + } + PSP{ + "PSP", + "Палестинска фунта", + } + PTC{ + "PTC", + "Португалско конто", + } + PTE{ + "PTE", + "Португалско ескудо", + } + PYG{ + "PYG", + "Парагвајска гуарана", + } + QAR{ + "QR", + "Кватарски риал", + } + ROL{ + "leu", + "Романска леа", + } + RON{ + "RON", + "Романска нова леа", + } + RUB{ + "RUB", + "Руска рубља", + } + RUR{ + "RUR", + "Руска рубља (1991-1998)", + } + RWF{ + "RWF", + "Руандски франк", + } + SAR{ + "SRl", + "Саудиски риал", + } + SBD{ + "SI$", + "Соломонски долар", + } + SCR{ + "SR", + "Сејшелска рупија", + } + SDD{ + "SDD", + "Судански динар", + } + SDP{ + "SDP", + "Суданска фунта", + } + SEK{ + "SKr", + "Шведска круна", + } + SGD{ + "S$", + "Сингапурски доалр", + } + SIB{ + "SIB", + "Словенски толар бон", + } + SIT{ + "SIT", + "Словенски толар", + } + SKK{ + "Sk", + "Словачка круна", + } + SLL{ + "SLL", + "Сиералеонско леоне", + } + SML{ + "SML", + "Санмаринска лира", + } + SOS{ + "So. Sh.", + "Сомалијски шилинг", + } + SRG{ + "Sf", + "Суринамски гилдер", + } + SSP{ + "SSP", + "Шкотска фунта", + } + SUN{ + "SUN", + "Советска нова рубља", + } + SUR{ + "SUR", + "Советска рубља", + } + SVC{ + "SVC", + "Елсавадорски колон", + } + SYP{ + "LS", + "Сириска фунта", + } + SZL{ + "E", + "Свазилендски лилаген", + } + TDF{ + "TDF", + "‘адски франк", + } + THB{ + "THB", + "Таи бат", + } + TJR{ + "TJR", + "таџикистанска рубља", + } + TJS{ + "TJS", + "Таџикистантски сомони", + } + TMM{ + "TMM", + "Турментистантски матат", + } + TND{ + "TND", + "Тунезиски динар", + } + TPE{ + "TPE", + "Тиморски ескудо", + } + TPP{ + "TPP", + "Тиморска патака", + } + TRL{ + "TL", + "Турска лира", + } + TVD{ + "TVD", + "Тувалски долар", + } + TWD{ + "NT$", + "Тајвански нов долар", + } + TZS{ + "T Sh", + "Танзаниски шилинг", + } + UAH{ + "UAH", + "Украинска хривнија", + } + UGS{ + "UGS", + "Угандиски шилинг (1966-1987)", + } + UGX{ + "U Sh", + "Угандиски шилинг", + } + USD{ + "US$", + "САД долар", + } + USN{ + "USN", + "САД долар (Next day)", + } + USS{ + "USS", + "САД долар (Same day)", + } + UYP{ + "UYP", + "Уругвајско песо (1975-1993)", + } + UZS{ + "UZS", + "УЗбекистански Сум", + } + VAL{ + "VAL", + "Ватиканска лира", + } + VEB{ + "Be", + "Венецуелски боливар", + } + VND{ + "VND", + "Виетнамски донг", + } + VNN{ + "VNN", + "Виетнамски нов донг", + } + VNR{ + "VNR", + "Виетнамски републички донг", + } + VNS{ + "VNS", + "Виетнамски национален донг", + } + VUV{ + "VT", + "Ванатски вату", + } + WSP{ + "WSP", + "Самоа фунта", + } + WST{ + "WST", + "Самоа тала", + } + XCD{ + "EC$", + "Источно карибиски долар", + } + XID{ + "XID", + "Исламски динар", + } + YDD{ + "YDD", + "Јеменски дианр", + } + YER{ + "YRl", + "Јеменски риал", + } + YUD{ + "YUD", + "Југословенски динар", + } + YUN{ + "YUN", + "Југословенски конвертибилен динар", + } + ZAL{ + "ZAL", + "Јужно афрички ранд(финансиски)", + } + ZAP{ + "ZAP", + "Јужно африча фунта", + } + ZAR{ + "R", + "Јужно афрички ранд", + } + ZMK{ + "ZMK", + "Замбиска кванча", + } + ZMP{ + "ZMP", + "Замбиска фунта", + } + ZRN{ + "ZRN", + "Заирско новозаире", + } + ZRZ{ + "ZRZ", + "Зирско заире", + } + ZWD{ + "Z$", + "Зимбабвиски долар", + } + } + ExemplarCharacters{"[а-и к-ш ѐ ѓ ѕ ј љ њ ќ ѝ џ]"} + Keys{ + calendar{"Календар"} + collation{"Сортирање"} + currency{"Валута"} + } + Languages{ + mk{"македонски"} + } + LocaleScript{ + "Cyrl", + } + NumberElements{ + ",", + ".", + ";", + "%", + "0", + "#", + "-", + "E", + "‰", + "∞", + "�", + "+", + } + Types{ + calendar{ + buddhist{"Будистички календар"} + chinese{"Кинески Календар"} + gregorian{"Грегориански Календар"} + hebrew{"Еврејски Календар"} + islamic{"Исламски Календар"} + islamic-civil{"Исламско граѓански Календар"} + japanese{"Јапонски Календар"} + } + collation{ + direct{"Директно"} + phonebook{"Азбучен редослед"} + pinyin{"Сортирање Pinyin"} + stroke{"Ритмички редослед"} + traditional{"Традиционално"} + } + } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "HH:mm:ss z", + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm", + "EEEE, dd MMMM yyyy", + "dd MMMM yyyy", + "dd.M.yyyy", + "dd.M.yy", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "нед.", + "пон.", + "вт.", + "сре.", + "чет.", + "пет.", + "саб.", + } + narrow{ + "н", + "п", + "в", + "с", + "ч", + "п", + "с", + } + wide{ + "недела", + "понеделник", + "вторник", + "среда", + "четврток", + "петок", + "сабота", + } + } + } + eras{ + abbreviated{ + "пр.н.е.", + "ае.", + } + } + monthNames{ + format{ + abbreviated{ + "јан.", + "фев.", + "мар.", + "апр.", + "мај.", + "јун.", + "јул.", + "авг.", + "септ.", + "окт.", + "ноем.", + "декем.", + } + narrow{ + "ј", + "ф", + "м", + "а", + "м", + "ј", + "ј", + "а", + "се", + "о", + "но", + "д", + } + wide{ + "јануари", + "февруари", + "март", + "април", + "мај", + "јуни", + "јули", + "август", + "септември", + "октомври", + "ноември", + "декември", + } + } + } + } + } + localPatternChars{"GuMtkHmsSEDFwWahKzUeygAZ"} +} diff --git a/icuSources/data/locales/mk_MK.txt b/icuSources/data/locales/mk_MK.txt index 18e45400..39b30c5a 100644 --- a/icuSources/data/locales/mk_MK.txt +++ b/icuSources/data/locales/mk_MK.txt @@ -1,19 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/mk_MK.xml // * // *************************************************************************** - -mk_MK { - Version{ "2.0" } -// LocaleString { "mk_MK" } - NumberPatterns { +mk_MK{ + NumberPatterns{ "#,##0.###;(#,##0.###)", - "\u00A4 #,##0.00;-\u00A4 #,##0.00", + "¤ #,##0.00;-¤ #,##0.00", "#,##0%", "#E0", } -// ShortCountry { "MKD" } - LocaleID:int { 0x042f } + Version{"1.2"} } diff --git a/icuSources/data/locales/ml.txt b/icuSources/data/locales/ml.txt new file mode 100644 index 00000000..ddbf4bd4 --- /dev/null +++ b/icuSources/data/locales/ml.txt @@ -0,0 +1,103 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ml.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/ml.xml + */ +ml{ + Countries{ + IN{"ഇന്ത്യ"} + } + ExemplarCharacters{"[ംഃഅആഇഈഉഊഋഌഎഏഐഒഓഔകഖഗഘങചഛജഝഞടഠഡഢണതഥദധനപഫബഭമയരറലളഴവശഷസഹാിീുൂൃെേൈൊോൌ്ൗൠൡ]"} + Languages{ + ml{"മലയാളം"} + } + LocaleScript{ + "Mlym", + } + NumberElements{ + ".", + ",", + ";", + "%", + "൦", + "#", + "-", + "E", + "‰", + "∞", + "�", + "+", + } + /** + * Draft + */ + Version{"1.0"} + calendar{ + gregorian{ + AmPmMarkers{ + "രാവിലെ", + "വൈകു", + } + dayNames{ + format{ + abbreviated{ + "ഞാ", + "തി", + "ചൊ", + "ബു", + "വ്യ", + "വെ", + "ശ", + } + wide{ + "ഞായറ്അ", + "തിങ്കള്അ", + "ചൊവ്വ", + "ബുനഭ്അ", + "വ്യാഴം", + "വെള്ളി", + "ശനി", + } + } + } + monthNames{ + format{ + abbreviated{ + "ജനു", + "ഫിബ്", + "മാറ്അ", + "ഏപ്റില്അ", + "മെയ്", + "ജൂണ്അ", + "ജൂൈല", + "ആഗ", + "സെപ്തം", + "ഒക്ട", + "നവം", + "ഡിസം", + } + wide{ + "ജനുവരി", + "ഫിബ്റവരി", + "മാറ്അച്അച്", + "ഏപ്റില്അ", + "മെയ്", + "ജൂണ്അ", + "ജൂൈല", + "ആഗസ്ത്അ", + "സെപ്തംബറ്അ", + "ഒക്ടൈബറ്അ", + "നവംബറ്അ", + "ഡിസംബറ്അ", + } + } + } + } + } +} diff --git a/icuSources/data/locales/ml_IN.txt b/icuSources/data/locales/ml_IN.txt new file mode 100644 index 00000000..64d6ccc1 --- /dev/null +++ b/icuSources/data/locales/ml_IN.txt @@ -0,0 +1,45 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ml_IN.xml +// * +// *************************************************************************** +ml_IN{ + NumberPatterns{ + "#,##,##0.###;-#,##,##0.###", + "¤ #,##,##0.00;-¤ #,##,##0.00", + "#,##,##0%", + "#E0", + } + /** + * Draft + */ + Version{"1.0"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "h:mm:ss a z", + "h:mm:ss a z", + "h:mm:ss a", + "h:mm a", + "EEEE d MMMM yyyy", + "d MMMM yyyy", + "dd-MM-yyyy", + "dd-MM-yy", + "{1} {0}", + } + weekend:intvector{ + 1, + 0, + 1, + 86400000, + } + } + } +} diff --git a/icuSources/data/locales/mr.txt b/icuSources/data/locales/mr.txt index 15ec2c83..2e1d8e0f 100644 --- a/icuSources/data/locales/mr.txt +++ b/icuSources/data/locales/mr.txt @@ -1,258 +1,241 @@ -// *************************************************************************** -// * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -mr { - Version { "2.0" } -// ShortLanguage { mar } - Languages { - root { "\u092e\u0930\u093e\u0920\u0940" } - - aa { "\u0905\u092b\u093e\u0930" } - ab { "\u0905\u092c\u0916\u0947\u091c\u093f\u092f\u0928" } - af { "\u0905\u092b\u094d\u0930\u093f\u0915\u093e\u0928\u094d\u0938" } - am { "\u0905\u092e\u0939\u093e\u0930\u093f\u0915" } - ar { "\u0905\u0930\u0947\u092c\u093f\u0915" } - as { "\u0905\u0938\u093e\u092e\u0940" } - ay { "\u0910\u092e\u0930\u093e" } - az { "\u0905\u091c\u093c\u0930\u092c\u093e\u0907\u091c\u093e\u0928\u0940" } - ba { "\u092c\u0937\u094d\u0915\u093f\u0930" } - be { "\u092c\u0948\u0932\u094b\u0930\u0941\u0938\u093f\u092f\u0928" } - bg { "\u092c\u0932\u094d\u0917\u0947\u0930\u093f\u092f\u0928" } - bh { "\u092c\u0940\u0939\u093e\u0930\u0940" } - bi { "\u092c\u093f\u0938\u0932\u092e\u093e" } - bn { "\u092c\u0902\u0917\u093e\u0932\u0940" } - bo { "\u0924\u093f\u092c\u0947\u091f\u093f\u092f\u0928" } - br { "\u092c\u094d\u0930\u0947\u091f\u0928" } - ca { "\u0915\u091f\u0932\u0928" } - co { "\u0915\u094b\u0930\u094d\u0938\u093f\u0915\u0928" } - cs { "\u091c\u093c\u0947\u0915" } - cy { "\u0935\u0947\u0932\u094d\u0937" } - da { "\u0921\u093e\u0928\u093f\u0937" } - de { "\u091c\u0930\u094d\u092e\u0928" } - dz { "\u092d\u0942\u091f\u093e\u0928\u0940" } - el { "\u0917\u094d\u0930\u0940\u0915" } - en { "\u0907\u0902\u0917\u094d\u0930\u0947\u091c\u0940" } - eo { "\u0907\u0938\u094d\u092a\u0930\u093e\u0928\u094d\u091f\u094b" } - es { "\u0938\u094d\u092a\u093e\u0928\u093f\u0937" } - et { "\u0907\u0938\u094d\u091f\u094b\u0928\u093f\u092f\u0928\u094d" } - eu { "\u092c\u093e\u0938\u094d\u0915" } - fa { "\u092a\u0930\u094d\u0937\u093f\u092f\u0928\u094d" } - fi { "\u092b\u093f\u0928\u094d\u0928\u093f\u0937" } - fj { "\u092b\u093f\u091c\u0940" } - fo { "\u092b\u0947\u0930\u094b\u0938\u094d" } - fr { "\u092b\u094d\u0930\u0947\u0928\u094d\u091a" } - fy { "\u092b\u094d\u0930\u093f\u0938\u093f\u092f\u0928\u094d" } - ga { "\u0910\u0930\u093f\u0937" } - gd { "\u0938\u094d\u0915\u093e\u091f\u0938\u094d \u0917\u0947\u0932\u093f\u0915" } - gl { "\u0917\u0947\u0932\u0940\u0936\u093f\u092f\u0928" } - gn { "\u0917\u094c\u0930\u093e\u0928\u0940" } - gu { "\u0917\u0941\u091c\u0930\u093e\u0924\u0940" } - ha { "\u0939\u094c\u0938\u093e" } - he { "\u0939\u0947\u092c\u0943" } - hi { "\u0939\u093f\u0928\u094d\u0926\u0940" } - hr { "\u0915\u094d\u0930\u094b\u092f\u0947\u0937\u093f\u092f\u0928\u094d" } - hu { "\u0939\u0902\u0917\u0947\u0930\u093f\u092f\u0928\u094d" } - hy { "\u0906\u0930\u094d\u092e\u0940\u0928\u093f\u092f\u0928\u094d" } - ia { "\u0907\u0928\u094d\u091f\u0930\u0932\u093f\u0902\u0917\u094d\u0935\u093e" } - id { "\u0907\u0928\u094d\u0921\u094b\u0928\u0947\u0937\u093f\u092f\u0928" } - ie { "\u0907\u0928\u094d\u091f\u0930\u0932\u093f\u0902\u0917" } - ik { "\u0907\u0928\u0942\u092a\u093f\u092f\u093e\u0915" } - is { "\u0906\u0908\u0938\u0932\u093e\u0928\u094d\u0921\u093f\u0915" } - it { "\u0907\u091f\u093e\u0932\u093f\u092f\u0928" } - iu { "\u0907\u0928\u0941\u0915\u093f\u091f\u0941\u091f\u094d" } - ja { "\u091c\u093e\u092a\u0928\u0940\u0938\u094d" } - jv { "\u091c\u093e\u0935\u0928\u0940\u0938\u094d" } - //jw { "\u091c\u093e\u0935\u0928\u0940\u0938\u094d" } // Use jv instead - ka { "\u091c\u093e\u0930\u094d\u091c\u093f\u092f\u0928\u094d" } - kk { "\u0915\u091c\u093c\u0915" } - kl { "\u0917\u094d\u0930\u0940\u0928\u0932\u093e\u0928\u094d\u0921\u093f\u0915" } - km { "\u0915\u0902\u092c\u094b\u0921\u093f\u092f\u0928" } - kn { "\u0915\u0928\u094d\u0928\u0921" } - ko { "\u0915\u094b\u0930\u093f\u092f\u0928\u094d" } - kok { "\u0915\u094b\u0902\u0915\u0923\u0940" } - ks { "\u0915\u0936\u094d\u092e\u0940\u0930\u0940" } - ku { "\u0915\u0941\u0930\u094d\u0926\u093f\u0937" } - ky { "\u0915\u093f\u0930\u094d\u0917\u093f\u091c\u093c" } - la { "\u0932\u093e\u091f\u093f\u0928" } - ln { "\u0932\u093f\u0902\u0917\u093e\u0932\u093e" } - lo { "\u0932\u093e\u0913\u0924\u093f\u092f\u0928\u094d" } - lt { "\u0932\u093f\u0925\u0941\u0906\u0928\u093f\u092f\u0928\u094d" } - lv { "\u0932\u093e\u091f\u094d\u0935\u093f\u092f\u0928\u094d (\u0932\u0947\u091f\u094d\u091f\u093f\u0937)" } - mg { "\u092e\u0932\u093e\u0917\u0938\u0940" } - mi { "\u092e\u093e\u0913\u0930\u0940" } - mk { "\u092e\u0938\u0940\u0921\u094b\u0928\u093f\u092f\u0928\u094d" } - ml { "\u092e\u0932\u093f\u092f\u093e\u0932\u092e" } - mn { "\u092e\u0902\u0917\u094b\u0932\u093f\u092f\u0928\u094d" } - mo { "\u092e\u094b\u0932\u094d\u0921\u093e\u0935\u093f\u092f\u0928\u094d" } - mr { "\u092e\u0930\u093e\u0920\u0940" } - ms { "\u092e\u0932\u092f" } - mt { "\u092e\u093e\u0932\u0924\u0940\u0938\u094d" } - my { "\u092c\u0930\u094d\u092e\u0940\u0938\u094d" } - na { "\u0928\u094c\u0930\u094b" } - ne { "\u0928\u0947\u092a\u093e\u0932\u0940" } - nl { "\u0921\u091a" } - no { "\u0928\u094b\u0930\u094d\u0935\u0947\u091c\u093f\u092f\u0928" } - oc { "\u0913\u0938\u093f\u091f\u093e\u0928\u094d" } - om { "\u0913\u0930\u094b\u092e\u094b (\u0905\u092b\u093e\u0928)" } - or { "\u0913\u0930\u093f\u092f\u093e" } - pa { "\u092a\u0902\u091c\u093e\u092c\u0940" } - pl { "\u092a\u094b\u0932\u093f\u0937" } - ps { "\u092a\u0937\u094d\u091f\u094b (\u092a\u0941\u0937\u094d\u091f\u094b)" } - pt { "\u092a\u094b\u0930\u094d\u091a\u0941\u0917\u0940\u0938\u094d" } - qu { "\u0915\u094d\u0935\u0947\u091a\u0913" } - rm { "\u0930\u0939\u091f\u094b-\u0930\u094b\u092e\u093e\u0928\u094d\u0938\u094d" } - rn { "\u0915\u093f\u0930\u0941\u0928\u094d\u0926\u0940" } - ro { "\u0930\u094b\u092e\u093e\u0928\u093f\u092f\u0928\u094d" } - ru { "\u0930\u0937\u094d\u092f\u0928\u094d" } - rw { "\u0915\u093f\u0928\u094d\u092f\u093e\u0930\u094d\u0935\u093e\u0928\u094d\u0921\u093e" } - sa { "\u0938\u0902\u0938\u094d\u0915\u0943\u0924" } - sd { "\u0938\u093f\u0902\u0927\u0940" } - sg { "\u0938\u093e\u0902\u0917\u094d\u0930\u094b" } - sh { "\u0938\u0947\u0930\u094d\u092c\u094b-\u0915\u094d\u0930\u094b\u092f\u0947\u0937\u093f\u092f\u0928\u094d" } - si { "\u0938\u093f\u0928\u094d\u0939\u0932\u0940\u0938\u094d" } - sk { "\u0938\u094d\u0932\u094b\u0935\u093e\u0915" } - sl { "\u0938\u094d\u0932\u094b\u0935\u0947\u0928\u093f\u092f\u0928\u094d" } - sm { "\u0938\u092e\u094b\u0928" } - sn { "\u0936\u094b\u0928\u093e" } - so { "\u0938\u094b\u092e\u093e\u0932\u0940" } - sq { "\u0906\u0932\u094d\u092c\u0947\u0928\u093f\u092f\u0928\u094d" } - sr { "\u0938\u0947\u0930\u094d\u092c\u093f\u092f\u0928\u094d" } - ss { "\u0938\u093f\u0938\u094d\u0935\u0924\u0940" } - st { "\u0938\u0947\u0938\u094b\u0925\u094b" } - su { "\u0938\u0941\u0902\u0926\u0928\u0940\u0938\u094d" } - sv { "\u0938\u094d\u0935\u0940\u0921\u093f\u0937" } - sw { "\u0938\u094d\u0935\u093e\u0939\u093f\u0932\u0940" } - ta { "\u0924\u092e\u093f\u0933" } - te { "\u0924\u0947\u0932\u0902\u0917\u0942" } - tg { "\u0924\u091c\u093f\u0915" } - th { "\u0925\u093e\u0908" } - ti { "\u0924\u093f\u0917\u094d\u0930\u093f\u0928\u094d\u092f\u093e" } - tk { "\u0924\u0941\u0930\u094d\u0915\u092e\u0947\u0928" } - tl { "\u0924\u0917\u093e\u0932\u094b\u0917" } - tn { "\u0938\u0947\u0924\u094d\u0938\u094d\u0935\u093e\u0928\u093e" } - to { "\u0924\u094b\u0902\u0917\u093e" } - tr { "\u0924\u0941\u0930\u094d\u0915\u093f\u0937" } - ts { "\u0924\u094d\u0938\u094b\u0917\u093e" } - tt { "\u091f\u091f\u093e\u0930" } - tw { "\u0924\u094d\u0935\u093f" } - ug { "\u0909\u0927\u0942\u0930" } - uk { "\u092f\u0941\u0915\u094d\u0930\u0947\u0928\u093f\u092f\u0928\u094d" } - ur { "\u0909\u0930\u094d\u0926\u0942" } - uz { "\u0909\u091c\u093c\u092c\u0947\u0915" } - vi { "\u0935\u093f\u092f\u0924\u094d\u0928\u093e\u092e\u0940\u091c\u093c" } - vo { "\u0913\u0932\u093e\u092a\u0941\u0915" } - wo { "\u0909\u0932\u094b\u092b" } - xh { "\u0915\u094d\u0938\u094d\u0939\u094b\u0938\u093e" } - yi { "\u0907\u0926\u094d\u0926\u093f\u0937" } - yo { "\u092f\u0942\u0930\u0941\u092c\u093e" } - za { "\u091d\u094d\u0939\u0941\u0928\u094d\u0917" } - zh { "\u091a\u093f\u0928\u0940\u0938\u094d" } - zu { "\u091c\u0941\u0932\u0942" } - } - Countries { - IN { "\u092d\u093e\u0930\u0924" } - } - MonthNames { - "\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940", - "\u092b\u0947\u092c\u0943\u0935\u093e\u0930\u0940", - "\u092e\u093e\u0930\u094d\u091a", - "\u090f\u092a\u094d\u0930\u093f\u0932", - "\u092e\u0947", - "\u091c\u0942\u0928", - "\u091c\u0941\u0932\u0948", - "\u0913\u0917\u0938\u094d\u091f", - "\u0938\u0947\u092a\u094d\u091f\u0947\u0902\u092c\u0930", - "\u0913\u0915\u094d\u091f\u094b\u092c\u0930", - "\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930", - "\u0921\u093f\u0938\u0947\u0902\u092c\u0930", - } - MonthAbbreviations { - "\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940", - "\u092b\u0947\u092c\u0943\u0935\u093e\u0930\u0940", - "\u092e\u093e\u0930\u094d\u091a", - "\u090f\u092a\u094d\u0930\u093f\u0932", - "\u092e\u0947", - "\u091c\u0942\u0928", - "\u091c\u0941\u0932\u0948", - "\u0913\u0917\u0938\u094d\u091f", - "\u0938\u0947\u092a\u094d\u091f\u0947\u0902\u092c\u0930", - "\u0913\u0915\u094d\u091f\u094b\u092c\u0930", - "\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930", - "\u0921\u093f\u0938\u0947\u0902\u092c\u0930", - } - DayNames { - "\u0930\u0935\u093f\u0935\u093e\u0930", - "\u0938\u094b\u092e\u0935\u093e\u0930", - "\u092e\u0902\u0917\u0933\u0935\u093e\u0930", - "\u092c\u0941\u0927\u0935\u093e\u0930", - "\u0917\u0941\u0930\u0941\u0935\u093e\u0930", - "\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930", - "\u0936\u0928\u093f\u0935\u093e\u0930" - } - DayAbbreviations{ - "\u0930\u0935\u093f", - "\u0938\u094b\u092e", - "\u092e\u0902\u0917\u0933", - "\u092c\u0941\u0927", - "\u0917\u0941\u0930\u0941", - "\u0936\u0941\u0915\u094d\u0930", - "\u0936\u0928\u093f" - } - - AmPmMarkers { - "\u092e.\u092a\u0942.", - "\u092e.\u0928\u0902." - } - -// Eras { -// "BC", -// "AD", -// } - -// NumberElements { -// ".", -// ",", -// ";", -// "%", -// "0", -// "#", -// "-", -// "E", -// "\u2030", -// "\u221e", -// "\ufffd" -// } - - zoneStrings { - { - "Asia/Calcutta", - "\u092d\u093e\u0930\u0924\u0940\u092f \u0938\u092e\u092f", - "IST", - "\u092d\u093e\u0930\u0924\u0940\u092f \u0938\u092e\u092f", - "IST" - } - } - - LocaleID:int { 0x4e } - CollationElements { - Version { "1.0" } - Sequence { - "[normalization on]" - } - } - LocaleScript:array { - "Deva" // ISO 15924 Name - } - ExemplarCharacters{"[[:Deva:]-[\u0958-\u095f]\u200c\u200d]"} - - // Currency display names - Currencies { - INR { "\u0930\u0941", "INR" } - } -} - - +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/mr.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/mr.xml + */ +mr{ + Countries{ + IN{"भारत"} + } + Currencies{ + INR{ + "रु", + "INR", + } + } + ExemplarCharacters{"[[:Deva:]-[क़-य़]‌‍]"} + Languages{ + aa{"अफार"} + ab{"अबखेजियन"} + af{"अफ्रिकान्स"} + am{"अमहारिक"} + ar{"अरेबिक"} + as{"असामी"} + ay{"ऐमरा"} + az{"अज़रबाइजानी"} + ba{"बष्किर"} + be{"बैलोरुसियन"} + bg{"बल्गेरियन"} + bh{"बीहारी"} + bi{"बिसलमा"} + bn{"बंगाली"} + bo{"तिबेटियन"} + br{"ब्रेटन"} + ca{"कटलन"} + co{"कोर्सिकन"} + cs{"ज़ेक"} + cy{"वेल्ष"} + da{"डानिष"} + de{"जर्मन"} + dz{"भूटानी"} + el{"ग्रीक"} + en{"इंग्रेजी"} + eo{"इस्परान्टो"} + es{"स्पानिष"} + et{"इस्टोनियन्"} + eu{"बास्क"} + fa{"पर्षियन्"} + fi{"फिन्निष"} + fj{"फिजी"} + fo{"फेरोस्"} + fr{"फ्रेन्च"} + fy{"फ्रिसियन्"} + ga{"ऐरिष"} + gd{"स्काटस् गेलिक"} + gl{"गेलीशियन"} + gn{"गौरानी"} + gu{"गुजराती"} + ha{"हौसा"} + he{"हेबृ"} + hi{"हिन्दी"} + hr{"क्रोयेषियन्"} + hu{"हंगेरियन्"} + hy{"आर्मीनियन्"} + ia{"इन्टरलिंग्वा"} + id{"इन्डोनेषियन"} + ie{"इन्टरलिंग"} + ik{"इनूपियाक"} + is{"आईसलान्डिक"} + it{"इटालियन"} + iu{"इनुकिटुट्"} + ja{"जापनीस्"} + jv{"जावनीस्"} + ka{"जार्जियन्"} + kk{"कज़क"} + kl{"ग्रीनलान्डिक"} + km{"कंबोडियन"} + kn{"कन्नड"} + ko{"कोरियन्"} + kok{"कोंकणी"} + ks{"कश्मीरी"} + ku{"कुर्दिष"} + ky{"किर्गिज़"} + la{"लाटिन"} + ln{"लिंगाला"} + lo{"लाओतियन्"} + lt{"लिथुआनियन्"} + lv{"लाट्वियन् (लेट्टिष)"} + mg{"मलागसी"} + mi{"माओरी"} + mk{"मसीडोनियन्"} + ml{"मलियालम"} + mn{"मंगोलियन्"} + mo{"मोल्डावियन्"} + mr{"मराठी"} + ms{"मलय"} + mt{"मालतीस्"} + my{"बर्मीस्"} + na{"नौरो"} + ne{"नेपाली"} + nl{"डच"} + no{"नोर्वेजियन"} + oc{"ओसिटान्"} + om{"ओरोमो (अफान)"} + or{"ओरिया"} + pa{"पंजाबी"} + pl{"पोलिष"} + ps{"पष्टो (पुष्टो)"} + pt{"पोर्चुगीस्"} + qu{"क्वेचओ"} + rm{"रहटो-रोमान्स्"} + rn{"किरुन्दी"} + ro{"रोमानियन्"} + root{"मराठी"} + ru{"रष्यन्"} + rw{"किन्यार्वान्डा"} + sa{"संस्कृत"} + sd{"सिंधी"} + sg{"सांग्रो"} + sh{"सेर्बो-क्रोयेषियन्"} + si{"सिन्हलीस्"} + sk{"स्लोवाक"} + sl{"स्लोवेनियन्"} + sm{"समोन"} + sn{"शोना"} + so{"सोमाली"} + sq{"आल्बेनियन्"} + sr{"सेर्बियन्"} + ss{"सिस्वती"} + st{"सेसोथो"} + su{"सुंदनीस्"} + sv{"स्वीडिष"} + sw{"स्वाहिली"} + ta{"तमिळ"} + te{"तेलंगू"} + tg{"तजिक"} + th{"थाई"} + ti{"तिग्रिन्या"} + tk{"तुर्कमेन"} + tl{"तगालोग"} + tn{"सेत्स्वाना"} + to{"तोंगा"} + tr{"तुर्किष"} + ts{"त्सोगा"} + tt{"टटार"} + tw{"त्वि"} + ug{"उधूर"} + uk{"युक्रेनियन्"} + ur{"उर्दू"} + uz{"उज़बेक"} + vi{"वियत्नामीज़"} + vo{"ओलापुक"} + wo{"उलोफ"} + xh{"क्स्होसा"} + yi{"इद्दिष"} + yo{"यूरुबा"} + za{"झ्हुन्ग"} + zh{"चिनीस्"} + zu{"जुलू"} + } + LocaleScript{ + "Deva", + } + Version{"1.2"} + calendar{ + gregorian{ + AmPmMarkers{ + "म.पू.", + "म.नं.", + } + dayNames{ + format{ + abbreviated{ + "रवि", + "सोम", + "मंगळ", + "बुध", + "गुरु", + "शुक्र", + "शनि", + } + wide{ + "रविवार", + "सोमवार", + "मंगळवार", + "बुधवार", + "गुरुवार", + "शुक्रवार", + "शनिवार", + } + } + } + monthNames{ + format{ + abbreviated{ + "जानेवारी", + "फेबृवारी", + "मार्च", + "एप्रिल", + "मे", + "जून", + "जुलै", + "ओगस्ट", + "सेप्टेंबर", + "ओक्टोबर", + "नोव्हेंबर", + "डिसेंबर", + } + wide{ + "जानेवारी", + "फेबृवारी", + "मार्च", + "एप्रिल", + "मे", + "जून", + "जुलै", + "ओगस्ट", + "सेप्टेंबर", + "ओक्टोबर", + "नोव्हेंबर", + "डिसेंबर", + } + } + } + } + } + zoneStrings{ + { + "Asia/Calcutta", + "भारतीय समय", + "IST", + "भारतीय समय", + "IST", + } + } +} diff --git a/icuSources/data/locales/mr_IN.txt b/icuSources/data/locales/mr_IN.txt index fb474f32..406cdd77 100644 --- a/icuSources/data/locales/mr_IN.txt +++ b/icuSources/data/locales/mr_IN.txt @@ -1,36 +1,42 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 2000-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/mr_IN.xml // * // *************************************************************************** -// Marathi locale. Based on Hindi locale - -mr_IN { - Version { "2.0" } - LocaleID:int { 0x044e } -// ShortCountry { IND } - - NumberPatterns { +mr_IN{ + NumberPatterns{ "##,##,##0.###;-##,##,##0.###", - "\u00A4 ##,##,##0.00;-\u00A4 ##,##,##0.00", + "¤ ##,##,##0.00;-¤ ##,##,##0.00", "##,##,##0%", "#E0", } -// LocaleString { "mr_IN" } - DateTimePatterns { - "h:mm:ss a z", - "h:mm:ss a z", - "h:mm:ss a", - "h:mm a", - "EEEE d MMMM yyyy", - "d MMMM yyyy", - "dd-MM-yyyy", - "d-M-yy", - "{1} {0}" + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "h:mm:ss a z", + "h:mm:ss a z", + "h:mm:ss a", + "h:mm a", + "EEEE d MMMM yyyy", + "d MMMM yyyy", + "dd-MM-yyyy", + "d-M-yy", + "{1} {0}", + } + weekend:intvector{ + 1, + 0, + 1, + 86400000, + } + } } -// DateTimeElements { -// "1", -// "1" -// } } diff --git a/icuSources/data/locales/ms.txt b/icuSources/data/locales/ms.txt new file mode 100644 index 00000000..879910a1 --- /dev/null +++ b/icuSources/data/locales/ms.txt @@ -0,0 +1,331 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ms.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/ms.xml + */ +ms{ + Countries{ + AD{"Andorra"} + AE{"Emiriah Arab Bersatu"} + AF{"Afghanistan"} + AG{"Antigua dan Barbuda"} + AI{"Anguilla"} + AL{"Albania"} + AM{"Armenia"} + AN{"Netherlands Antilles"} + AO{"Angola"} + AQ{"Antarctica"} + AR{"Argentina"} + AS{"American Samoa"} + AT{"Austria"} + AU{"Australia"} + AW{"Aruba"} + AZ{"Azerbaijan"} + BA{"Bosnia dan Herzegovina"} + BB{"Barbados"} + BD{"Bangladesh"} + BE{"Belgium"} + BF{"Burkina Faso"} + BG{"Bulgaria"} + BH{"Bahrain"} + BI{"Burundi"} + BJ{"Benin"} + BM{"Bermuda"} + BN{"Brunei"} + BO{"Bolivia"} + BR{"Brazil"} + BS{"Bahamas"} + BT{"Bhutan"} + BV{"Bouvet Island"} + BW{"Botswana"} + BY{"Belarus"} + BZ{"Belize"} + CA{"Kanada"} + CC{"Cocos (Keeling) Islands"} + CD{"Democratic Republic of the Congo"} + CF{"Republik Afrika Tengah"} + CG{"Congo"} + CH{"Switzerland"} + CI{"Pantai Gading"} + CK{"Cook Islands"} + CL{"Cile"} + CM{"Kamerun"} + CN{"Cina"} + CO{"Colombia"} + CR{"Kosta Rika"} + CU{"Cuba"} + CV{"Cape Verde"} + CX{"Christmas Island"} + CY{"Kibris"} + CZ{"Republik Czech"} + DE{"Jerman"} + DJ{"Jibouti"} + DK{"Denmark"} + DM{"Dominica"} + DO{"Republik Dominican"} + DZ{"Aljazair"} + EC{"Ecuador"} + EE{"Estonia"} + EG{"Mesir"} + EH{"Sahara Barat"} + ER{"Eritrea"} + ES{"Sepanyol"} + ET{"Ethiopia"} + FI{"Finland"} + FJ{"Fiji"} + FK{"Falkland Islands"} + FM{"Micronesia"} + FO{"Faroe Islands"} + FR{"Perancis"} + GA{"Gabon"} + GB{"United Kingdom"} + GD{"Grenada"} + GE{"Georgia"} + GF{"French Guiana"} + GH{"Ghana"} + GI{"Gibraltar"} + GL{"Greenland"} + GM{"Gambia"} + GN{"Guinea"} + GP{"Guadeloupe"} + GQ{"Equatorial Guinea"} + GR{"Yunani"} + GS{"South Georgia and the South Sandwich Islands"} + GT{"Guatemala"} + GU{"Guam"} + GW{"Guinea Bissau"} + GY{"Guyana"} + HK{"Hong Kong S.A.R., China"} + HM{"Heard Island and McDonald Islands"} + HN{"Honduras"} + HR{"Croatia"} + HT{"Haiti"} + HU{"Hungari"} + ID{"Indonesia"} + IE{"Ireland"} + IL{"Israel"} + IN{"Hindia"} + IO{"British Indian Ocean Territory"} + IQ{"Iraq"} + IR{"Iran"} + IS{"Iceland"} + IT{"Itali"} + JM{"Jamaika"} + JO{"Jordan"} + JP{"Jepun"} + KE{"Kenya"} + KG{"Kyrgyzstan"} + KH{"Kemboja"} + KI{"Kiribati"} + KM{"Comoros"} + KN{"Saint Kitts dan Nevis"} + KP{"Utara Korea"} + KR{"Selatan Korea"} + KW{"Kuwait"} + KY{"Cayman Islands"} + KZ{"Kazakhstan"} + LA{"Laos"} + LB{"Lubnan"} + LC{"Saint Lucia"} + LI{"Liechtenstein"} + LK{"Sri Lanka"} + LR{"Liberia"} + LS{"Lesotho"} + LT{"Lithuania"} + LU{"Luksembourg"} + LV{"Latvia"} + LY{"Libya"} + MA{"Maghribi"} + MC{"Monaco"} + MD{"Moldova"} + MG{"Madagaskar"} + MH{"Kepulauan Marshall"} + MK{"Macedonia"} + ML{"Mali"} + MM{"Myanmar"} + MN{"Mongolia"} + MO{"Macao S.A.R., China"} + MP{"Northern Mariana Islands"} + MQ{"Martinique"} + MR{"Mauritania"} + MS{"Montserrat"} + MT{"Malta"} + MU{"Mauritius"} + MV{"Maldiv"} + MW{"Malawi"} + MX{"Meksiko"} + MY{"Malaysia"} + MZ{"Mozambik"} + NA{"Namibia"} + NC{"New Caledonia"} + NE{"Niger"} + NF{"Norfolk Island"} + NG{"Nigeria"} + NI{"Nicaragua"} + NL{"Belanda"} + NO{"Norway"} + NP{"Nepal"} + NR{"Nauru"} + NU{"Niue"} + NZ{"New Zealand"} + OM{"Oman"} + PA{"Panama"} + PE{"Peru"} + PF{"French Polynesia"} + PG{"Papua New Guinea"} + PH{"Filipina"} + PK{"Pakistan"} + PL{"Poland"} + PM{"Saint Pierre and Miquelon"} + PN{"Pitcairn"} + PR{"Puerto Rico"} + PS{"Palestinian Territory"} + PT{"Feringgi"} + PW{"Palau"} + PY{"Paraguay"} + QA{"Qatar"} + RE{"Réunion"} + RO{"Romania"} + RU{"Russia"} + RW{"Rwanda"} + SA{"Arab Saudi"} + SB{"Kepulauan Solomon"} + SC{"Seychelles"} + SD{"Sudan"} + SE{"Sweden"} + SG{"Singapura"} + SH{"Saint Helena"} + SI{"Slovenia"} + SJ{"Svalbard and Jan Mayen"} + SK{"Slovakia"} + SL{"Siera Leon"} + SM{"San Marino"} + SN{"Senegal"} + SO{"Somalia"} + SP{"Serbia"} + SR{"Surinam"} + ST{"Sao Tome dan Principe"} + SV{"El Salvador"} + SY{"Syria"} + SZ{"Swaziland"} + TC{"Turks and Caicos Islands"} + TD{"Cad"} + TF{"French Southern Territories"} + TG{"Togo"} + TH{"Thailand"} + TJ{"Tadjikistan"} + TK{"Tokelau"} + TL{"Timor-Leste"} + TM{"Turkmenistan"} + TN{"Tunisia"} + TO{"Tonga"} + TR{"Turki"} + TT{"Trinidad dan Tobago"} + TV{"Tuvalu"} + TW{"Taiwan"} + TZ{"Tanzania"} + UA{"Ukraine"} + UG{"Uganda"} + UM{"United States Minor Outlying Islands"} + US{"Amerika Syarikat"} + UY{"Uruguay"} + UZ{"Uzbekistan"} + VA{"Vatican"} + VC{"Saint Vincent dan Grenadines"} + VE{"Venezuela"} + VG{"British Virgin Islands"} + VI{"U.S. Virgin Islands"} + VN{"Vietnam"} + VU{"Vanuatu"} + WF{"Wallis and Futuna"} + WS{"Samoa"} + YE{"Yaman"} + YT{"Mayotte"} + YU{"Yugoslavia"} + ZA{"Afrika Selatan"} + ZM{"Zambia"} + ZW{"Zimbabwe"} + } + Currencies{ + MYR{ + "RM", + "Ringgit Malaysia", + } + } + ExemplarCharacters{"[a-z]"} + Languages{ + ms{"Bahasa Melayu"} + } + LocaleScript{ + "Latn", + } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + dayNames{ + format{ + abbreviated{ + "Ahd", + "Isn", + "Sel", + "Rab", + "Kha", + "Jum", + "Sab", + } + wide{ + "Ahad", + "Isnin", + "Selasa", + "Rabu", + "Khamis", + "Jumaat", + "Sabtu", + } + } + } + monthNames{ + format{ + abbreviated{ + "Jan", + "Feb", + "Mac", + "Apr", + "Mei", + "Jun", + "Jul", + "Ogos", + "Sep", + "Okt", + "Nov", + "Dis", + } + wide{ + "Januari", + "Februari", + "Mac", + "April", + "Mei", + "Jun", + "Julai", + "Ogos", + "September", + "Oktober", + "November", + "Disember", + } + } + } + } + } +} diff --git a/icuSources/data/locales/ms_BN.txt b/icuSources/data/locales/ms_BN.txt new file mode 100644 index 00000000..914cc9d2 --- /dev/null +++ b/icuSources/data/locales/ms_BN.txt @@ -0,0 +1,50 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ms_BN.xml +// * +// *************************************************************************** +ms_BN{ + Currencies{ + BND{ + "$", + "BND", + } + USD{ + "US$", + "USD", + } + } + NumberElements{ + ",", + ".", + ";", + "%", + "0", + "#", + "-", + "E", + "‰", + "∞", + "�", + "+", + } + Version{"1.2"} + calendar{ + gregorian{ + DateTimePatterns{ + "h:mm:ss aa", + "H:mm:ss", + "H:mm:ss", + "H:mm:ss", + "dd MMMM yyyy", + "dd MMMM yyyy", + "dd/MM/yyyy", + "dd/MM/yyyy", + "{1} {0}", + } + } + } +} diff --git a/icuSources/data/locales/ms_MY.txt b/icuSources/data/locales/ms_MY.txt new file mode 100644 index 00000000..63bfa6d4 --- /dev/null +++ b/icuSources/data/locales/ms_MY.txt @@ -0,0 +1,32 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ms_MY.xml +// * +// *************************************************************************** +ms_MY{ + NumberPatterns{ + "#,##0.###;-#,##0.###", + "¤#,##0.00;(¤#,##0.00)", + "#,##0%", + "#E0", + } + Version{"1.2"} + calendar{ + gregorian{ + DateTimePatterns{ + "h:mm:ss a z", + "h:mm:ss a z", + "h:mm:ss a", + "h:mm", + "EEEE dd MMM yyyy", + "dd MMMM yyyy", + "dd MMMM yyyy", + "dd/MM/yyyy", + "{1} {0}", + } + } + } +} diff --git a/icuSources/data/locales/mt.txt b/icuSources/data/locales/mt.txt index 51165f37..dda5080c 100644 --- a/icuSources/data/locales/mt.txt +++ b/icuSources/data/locales/mt.txt @@ -1,1041 +1,827 @@ -// Copyright (c) 1998-2003 IBM, Inc. and others. -// -// Maltese locale. -// Maintained by srl@monkey.sbay.org [See below for full credits] -// -// Search for 'Sources' below for source abbreviations - -// Hi. This file is now in utf-8. Thank you very much. -// Quick rundown on Maltese Unicode: -// --------------------------------- -// ċ = U+010B Ċ = U+010A 'ch' -// ġ = U+0121 Ġ = U+0120 soft G -// ħ = U+0127 Ħ = U+0126 voiced H [or 2nd letter of 'silent' għ] -// ż = U+017c Ż = U+017B 'dz' -// -// COMBINING MARKS: -// There is no combining mark for the slash (h/) -// but, U+0307 is the DOT ABOVE needed for ż, ċ, and ġ (in collation rules) - -mt { - Version { "1.0" } // 2002-01-15 -// ShortLanguage { mlt } - -// "%%PHONEBOOK" { "Bħal lista tat-telefon" } -// "%%PINYIN" { "Pinyin Order" } -// "%%TRADITIONAL" { "Traditional" } -// "%%STROKE" { "Stroke Order" } -// "%%DIRECT" { "Dritt Order" } - "%%PREEURO" { "Qabel il-Euro" } - - // Duplicate data has been commented out. - Languages { - root { "Għerq" } // the root locale -//------------------------------------------------ - //aa { "Afar" } // Afar - ab { "Abkażjan" } // Abkhazian - ace { "Aċiniż" } // Achinese - ach { "Akoli" } // Acoli - //ada { "Adangme" } // Adangme - //ae { "Avestan" } // Avestan - af { "Afrikans" } // Afrikaans - afa { "Afro-Asjatiku (Oħra)" } // Afro-Asiatic (Other) - afh { "Afriħili" } // Afrihili - //aka { "Akan" } // Akan - akk { "Akkadjen" } // Akkadien - //ale { "Aleut" } // Aleut - alg { "Lingwi Algonqwinjani" } // Algonquian Languages - am { "Amħariku" } // Amharic - ang { "Ingliż, Antik (ca.450-1100)" } // English, Old (ca.450-1100) - apa { "Lingwi Apaċi" } // Apache Languages - ar { "Għarbi" } // Arabic - arc { "Aramajk" } // Aramaic - arn { "Arawkanjan" }// Araucanian - arp { "Arapaħo" } // Arapaho - art { "Artifiċjali (Oħra)" } // Artificial (Other) - //arw { "Arawak" } // Arawak - //as { "Assamese" } // Assamese - ath { "Lingwi Atabaskani" } // Athapaskan Languages - aus { "Lingwi Awstraljani" }// Australian Languages - av { "Avarik" } // Avaric - awa { "Awadħi" } // Awadhi - ay { "Ajmara" } // Aymara - az { "Ażerbajġani" } // Azerbaijani - ba { "Baxkir" } // Bashkir - //bad { "Banda" } // Banda - bai { "Lingwi Bamileke" } // Bamileke Languages - bal { "Baluċi" } // Baluuchi - //bam { "Bambara" } // Bambara - ban { "Baliniż" } // Balinese - //bas { "Basa" } // Basa - bat { "Baltiku (Oħra)" } // Baltic (Other) - be { "Belarussu" } // Belarusian - //bej { "Beja" } // Beja - //bem { "Bemba" } // Bemba - //ber { "Beber" } // Beber - bg { "Bulgaru" } // Bulgarian - bh { "Biħari" } // Bihari - bho { "Bojpuri" } // Bhojpuri - //bi { "Bislama" } // Bislama - //bik { "Bikol" } // Bikol - //bin { "Bini" } // Bini - //bla { "Siksika" } // Siksika - //bn { "Bengali" } // Bengali - //bnt { "Bantu" } // Bantu - bo { "Tibetjan" } // Tibetan - //br { "Brenton" } // Brenton - //bra { "Braj" } // Braj - bs { "Bosnijan" } // Bosnian - //btk { "Batak" } // Batak - bua { "Burjat" } // Buriat - bug { "Buginiż" } // Buginese - ca { "Katalan" } // Catalan - cad { "Kaddo" } // Caddo - cai { "Amerika Ċentrali (Oħra)" } // Central American Indian (Other) - car { "Karib" } // Carib - cau { "Kawkasu (Oħra)" } // Caucasian (Other) - ce { "Ċeċen" } // Chechen - ceb { "Sibwano" } // Cebuano - cel { "Keltiku (Oħra)" } // Celtic (Other) - ch { "Ċamorro" } // Chamorro - chb { "Ċibċa" } // Chibcha - chg { "Ċagataj" } // Chagatai - chk { "Ċukese" } // Chuukese - //chm { "Mari" } // Mari - chn { "Ġargon taċ-Ċinuk" } // Chinook Jargon - cho { "Ċostaw" } // Choctaw - chp { "Ċipewjan" } // Chipewyan - chr { "Ċerokij" } // Cherokee - chy { "Xajenn" } // Cheyenne - cmc { "Lingwi Ċamiki" } // Chamic Languages - co { "Korsiku" } // Corsican - cop { "Koptiku" } // Coptic - cpe { "Kreoli u Piġini, Bbażat fuq l-Ingliż (Oħra)" } // Creoles and Pidgins, English-based (Other) - cpf { "Kreoli u Piġini, Bbażat fuq il-Franċiż (Oħra)" } // Creoles and Pidgins, French-based (Other) - cr { "Krij" } // Cree - crp { "Kreoli u Piġini (Oħra)" } // Creoles and Pidgins (Other) - cs { "Ċek" } // Czech - cu { "Slaviku tal-Knisja" } // Church Slavic - cus { "Kuxtiku (Oħra)" } // Cushitic (Other) - cv { "Ċuvax" } // Chuvash - cy { "Welx" } // Welsh - da { "Daniż" } // Danish - //dak { "Dakota" } // Dakota - day { "Dajak" } // Dayak - de { "Ġermaniż" } // German - del { "Delawerjan" } // Delaware - den { "Slav" } // Slave - //dgr { "Dogrib" } // Dogrib - //din { "Dinka" } // Dinka - dv { "Diveħi" } // Divehi - //doi { "Dogri" } // Dogri - dra { "Dravidjan (Oħra)" } // Dravidian (Other) - dua { "Dwala" } // Duala - dum { "Olandiż, Medjevali (ca. 1050-1350)" } // Dutch, Middle (ca. 1050-1350) - dyu { "Djula" } // Dyula - //dz { "Vutani" } // Bhutani - dz { "Dżongka" } // Dzongkha - //efi { "Efik" } // Efik - egy { "Eġizzjan (Antik)" } // Egyptian (Ancient) - //eka { "Ekajuk" } // Ekajuk - el { "Grieg" } // Greek - elx { "Elamit" } // Elamite - en { "Ingliż" } // English - enm { "Ingliż, Medjevali (1100-1500)" } // English, Middle( 1100 -1500) - //eo { "Esperanto" } // Esperanto - es { "Spanjol" } // Spanish - et { "Estonjan" } // Estonian - eu { "Bask" } // Basque - //ewe { "Ewe" } // Ewe - //ewo { "Ewondo" } // Ewondo - fa { "Persjan" } // Persian - //fan { "Fang" } // Fang - //fat { "Fanti" } // Fanti - ff { "Fulaħ" } // Fulah - fi { "Finlandiż" } // Finnish - fiu { "Finno - Ugrijan" } // Finno - Ugrian - fj { "Fiġi" } // Fiji - fo { "Fawriż" } // Faeroese - //fon { "Fon" } // Fon - fr { "Franċiż" } // French - frm { "Franċiż, Medjevali (ca. 1400-1600)" } // French, Middle (ca.1400-1600) - fro { "Franċiż, Antik (842-ca. 1400)" } // French, Old (842-ca.1400) - fur { "Frijuljan" } // Friulian - fy { "Friżjan" } // Frisian - ga { "Irlandiż" } // Irish - //gaa { "Ga" } // Ga - gay { "Gajo" } // Gayo - gba { "Gbaja" } // Gbaya - gd { "Galliku Skoċċiż" } // Scots Gaelic - gem { "Ġermaniku (Oħra)" } // Germanic (Other) - gil { "Gilbertjan" } // Gilbertese - gl { "Gallegjan" } // Gallegan - gla { "Galliku (Skoċċiż)" } // Gaelic (Scots) - gmh { "Ġermaniku, Medjevali Pulit (ca. 1050-1500)" } // German, Middle High (ca.1050-1500) - gn { "Gwarani" } // Guarani - goh { "Ġermaniku, Antik Pulit (ca. 750-1050)" } // German, Old High (ca.750-1050) - //gon { "Gondi" } // Gondi - //gor { "Gorontalo" } // Gorontalo - got { "Gotiku" } // Gothic - grb { "Ġerbo" } // Gerbo - grc { "Grieg, Antik (to 1453)" } // Greek, Ancient (to 1453) - gu { "Guġarati" } // Gujarati - gv { "Manks" } // Manx - gwi { "Gwiċin" } // Gwich'in - hai { "Ħajda" } // Haida - ha { "Ħawsa" } // Hausa - haw { "Ħawajjan" } // Hawaiian - he { "Ebrajk" } // Hebrew - hi { "Ħindi" } // Hindi - him { "Ħimaċali" } // Himachali - hit { "Ħittit" } // Hittite - hmn { "Ħmong" } // Hmong - ho { "Ħiri Motu" } // Hiri Motu - hr { "Kroat" } // Croatian - hu { "Ungeriż" } // Hungarian - hup { "Ħupa" } // Hupa - hy { "Armenjan" } // Armenian - hz { "Ħerero" } // Herero - //ia { "Interlingua" } // Interlingua - //iba { "Iban" } // Iban - //ibo { "Igbo" } // Igbo - id { "Indoneżjan" } // Indonesian - //ie { "Interlingue" } // Interlingue - ijo { "Iġo" } // Ijo - ik { "Inupjak" } // Inupiak - //ilo { "Iloko" } // Iloko - inc { "Indjan (Oħra)" } // Indic (Other) - ine { "Indo-Ewropew" } // Indo-European - ira { "Iranjan" } // Iranian - iro { "Lingwi Irogwjani" } // Iroguoian Languages - is { "Iżlandiż" } // Icelandic - it { "Taljan" } // Italian - //iu { "Inukitut" } // Inukitut - ja { "Ġappuniż" } // Japanese - jpr { "Lhudi-Persjan" } // Judeo-Persian - jrb { "Lhudi-Għarbi" } // Judeo-Arabic - jv { "Ġavaniż" } // Javanese - ka { "Ġorġjan" } // Georgian - //kaa { "Kara-Kalpak" } // Kara-Kalpak - kab { "Kabuljan" } // Kabyle - kac { "Kaċin" } // Kachin - //kam { "Kamba" } // Kamba - //kar { "Karen" } // Karen - //kau { "Kanuri" } // Kanuri - //kaw { "Kawi" } // Kawi - kha { "Kasi" } // Khasi - khi { "Kojsan" } // Khoisan - kho { "Kotaniż" } // Khotanese - ki { "Kikuju" } // Kikuyu - kk { "Każak" } // Kazakh - kl { "Kalallisut" } // Kalaallisut - km { "Kmer" } // Khmer - //kmb { "Kimbundu" } // Kimbundu - //kn { "Kannada" } // Kannada - ko { "Korejan" } // Korean - //kok { "Konkani" } // Konkani - //kon { "Kongo" } // Kongo - kos { "Kosrejan" } // Kosrean - //kpe { "Kpelle" } // Kpelle - //kro { "Kru" } // Kru - kru { "Kurusk" } // Kuruckh - ks { "Kaxmiri" } // Kashmiri - ku { "Kurdiż" } // Kurdish - kum { "Kumiku" } // Kumyk - kut { "Kutenaj" } // Kutenai - //kv { "Komi" } // Komi - kw { "Korniku" } // Cornish - ky { "Kirgiż" } // Kirghiz - //la { "Latin" } // Latin - //lad { "Ladino" } // Ladino - lah { "Landa" } // Lahnda - //lam { "Lamba" } // Lamba - lb { "Letżburgiż" } // Letzeburgesch - lez { "Leżgjan" } // Lezghian - lin { "Lingaljan" } // Lingala - lit { "Litwanjan" } // Lithuanian - ln { "Lingaljan" } // Lingala - //lo { "Lao" } // Lao - //lol { "Mongo" } // Mongo - loz { "Lożi" } // Lozi - lt { "Litwanjan" } // Lithuanian - lua { "Luba-Luluwa" } // Luba-Lulua - //lub { "Luba-Katanga" } // Luba-Katanga - //lug { "Ganda" } // Ganda - lui { "Luwisinuż" } // Luiseeno - //lun { "Lunda" } // Lunda - luo { "Luwa" } // Lua - lus { "Luxaj" } // Lushai - lv { "Latvjan (Lettix)" } // Latvian (Lettish) - mad { "Maduriż" } // Madurese - mag { "Magaħi" } // Magahi - mai { "Majtili" } // Maithili - //mak { "Makasar" } // Makasar - man { "Mandingwan" } // Mandingue - map { "Awstronesjan" } // Austronesian - mas { "Masaj" } // Masai - //mdr { "Mandar" } // Mandar - //men { "Mende" } // Mende - mg { "Malagażi" } // Malagasy - mga { "Irlandiż, Medjevali (900-1200)" } // Irish, Middle (900-1200) - mh { "Marxall" } // Marshall - //mi { "Maori" } // Maori - mic { "Mikmek" } // Mic-Mac - min { "Minangkabaw" } // Minangkabau - mis { "Lingwi Oħra" } // Miscellaneous Languages - mk { "Maċedonjan" } // Macedonian - mkh { "Mon-Kmer (Oħra)" } // Mon-Khmer (Other) - ml { "Malajalam" } // Malayalam - mn { "Mongoljan" } // Mongolian - mnc { "Manċurjan" } // Manchu - //mni { "Manipuri" } // Manipuri - mno { "Lingwi Manobo" } // Manobo Languages - mo { "Moldavjan" } // Moldavian - moh { "Moħak" } // Mohawk - //mos { "Mossi" } // Mossi - mr { "Marati" } // Marathi - ms { "Malajan" } // Malay - mt { "Malti" } // Maltese - mul { "Lingwi Diversi" } // Multiple Languages - mun { "Lingwi tal-Munda" } // Munda Languages - mus { "Kriek" } // Creek - //mwr { "Marwari" } // Marwari - my { "Burmiż" } // Burmese - myn { "Majan" } // Mayan - na { "Nawuru" } // Nauru - nah { "Naħwatil" } // Nahuatl - nai { "Indjan tal-Amerika ta' Fuq (Oħra)" } // North American Indian (Other) - nb { "Bokmahal Norveġiż" } // Norwegian Bokmål - nd { "Ndebele, ta' Fuq" } // Ndebele, North - nds { "Ġermaniż Komuni; Sassonu Komuni" } // Low German; Low Saxon - ne { "Nepaliż" } // Nepali - //new { "Newari" } // Newari - //ng { "Ndonga" } // Ndonga - nia { "Nijas" } // Nias - nic { "Niġerjan - Kordofanjan" } // Niger - Kordofanian - niu { "Nijuwejan" } // Niuean - nl { "Olandiż" } // Dutch - nn { "Ninorsk Norveġiż" } // Norwegian Nynorsk - no { "Norveġiż" } // Norwegian - non { "Skandinav, Antik" } // Norse, Old - nr { "Ndebele, t'Isfel" } // Ndebele, South - nso { "Soto, ta' Fuq" } // Sotho, Northern - nub { "Lingwi Nubjani" } // Nubian Languages - nv { "Navaħo" } // Navajo - ny { "Ċiċewa; Njanġa" } // Chichewa; Nyanja - nym { "Njamweżi" } // Nyamwezi - nyo { "Njoro" } // Nyoro - nzi { "Nżima" } // Nzima - oc { "Provenzal (wara 1500)" } // Provençal; Occitan (post 1500) - oj { "Oġibwa" } // Ojibwa - //om { "Oromo (Afan)" } // Oromo (Afan) - or { "Orija" } // Oriya - os { "Ossettiku" } // Ossetic - osa { "Osaġjan" } // Osage - ota { "Tork (Imperu Ottoman)" } // Turkish (Ottoman Empire) - oto { "Lingwi Otomjani" } // Otomian Languages - pa { "Punġabi" } // Punjabi - paa { "Papwan (Oħra)" } // Papuan (Ohter) - pag { "Pangasinjan" } // Pangasinan - pal { "Paħlavi" } // Pahlavi - pam { "Pampamga" } // pampamga? - pap { "Papjamento" } // Papiamento - pau { "Palawjan" } // Palauan - peo { "Persjan Antik (ca. 600-400 Q.K.)" } // Persian Old (ca.600-400 B.C.) - phi { "Filippin (Oħra)" } // Philippine (Other) - phn { "Feniċju" } // Phoenician - //pi { "Pali" } // Pali - pl { "Pollakk" } // Polish - pon { "Ponpejan" } // Pohnpeian - pra { "Lingwi Prakriti" } // Prakrit Languages - pro { "Provenzal, Antik (sa l-1500)" } // Provençal, Old (to 1500) - ps { "Paxtun" } // Pashto (Pushto) - pt { "Portugiż" } // Portuguese - qu { "Keċwa" } // Quechua - raj { "Raġastani" } // Rajastani - rap { "Rapanwi" } // Rapanui - rar { "Rarotongani" } // Rarotongan - rm { "Reto-Romanz" } // Rhaeto-Romance - //rn { "Rundi" } // Rundi - ro { "Rumen" } // Romanian - roa { "Romanz (Oħra)" } // Romance (Other) - rom { "Żingaru" } // Romany - ru { "Russu" } // Russian - rw { "Kinjarwanda" }// Kinyarwanda - //sa { "Sanskrit" } // Sanskrit - //sad { "Sandawe" } // Sandawe - sah { "Jakut" } // Yakut - sai { "Indjan tal-Amerika t'Isfel (Oħra)" } // South American Indian (Other) - sal { "Salixan" } // Salishan - //sam { "Samritan" } // Samritan - //sas { "Saska" } // Saska - //sat { "Santali" } // Santali - sc { "Sardinjan" } // Sardinian - sco { "Skoċċiż" } // Scots - sd { "Sindi" } // Sindhi - se { "Sami ta' Fuq" }// Northern Sami - //sel { "Selkup" } // Selkup - sem { "Semitiku" } // Semitic - //sg { "Sango" } // Sango - sga { "Irlandiż, Antik (sa l-900)" } // Irish, Old (to 900) - sgn { "Lingwa tas-Sinjali" } // Sign Languages - sh { "Serbo-Kroat" } // Serbo-Croatian - shn { "Xan" } // Shan - si { "Sinħaliż" } // Sinhalese - //sid { "Sidamo" } // Sidamo - sio { "Lingwi Suwjani" } // Siouan Languages - sit { "Sino-Tibetjani (Oħra)" } // Sino-Tibetan (Other) - sk { "Slovakk" } // Slovak - sl { "Slav" } // Slovenian - sm { "Samojan" } // Samoan - sn { "Xona" } // Shona - //snk { "Soninke" } // Soninke - //so { "Somali" } // Somali - //sog { "Sogdien" } // Sogdien - son { "Songaj" } // Songhai - sq { "Albaniż" } // Albanian - sr { "Serb" } // Serbian - //srr { "Serer" } // Serer - //ss { "Swati" } // Swati - ssa { "Nilo-Saħaram" } // Nilo-Saharam - st { "Soto, t'Isfel" } // Sotho, Southern - su { "Sundaniż" } // Sundanese - //suk { "Sukuma" } // Sukuma - //sus { "Susu" } // Susu - sux { "Sumerjan" } // Sumerian - sv { "Svediż" } // Swedish - sw { "Swaħili" } // Swahili - syr { "Sirjan" } // Syriac - //ta { "Tamil" } // Tamil - tai { "Tai (Oħra)" } // Tai (Other) - //te { "Telugu" } // Telugu - //tem { "Timne" } // Timne - //ter { "Tereno" } // Tereno - //tet { "Tetum" } // Tetum - tg { "Taġik" } // Tajik - th { "Tajlandiż" } // Thai - //tig { "Tigre" } // Tigre - ti { "Tigrinja" } // Tigrinya - //tiv { "Tiv" } // Tiv - tk { "Turkmeni" } // Turkmen - //tl { "Tagalog" } // Tagalog - //tli { "Tlingit" } // Tlingit - tmh { "Tamaxek" } // Tamashek - tn { "Zwana" } // Tswana - tog { "Tonga (Njasa)" } // Tonga (Nyasa) - to { "Tongan (Gżejjer ta' Tonga)" } // Tongan (Tonga Islands) - tr { "Tork" } // Turkish - //ts { "Tsonga" } // Tsonga - tsi { "Zimxjan" } // Tsimshian - //tt { "Tatar" } // Tatar - //tum { "Tumbuka" } // Tumbuka - tur { "Tork" } // Turkish - tut { "Altajk (Oħra)" } // Altaic (Other) - //tvl { "Tuvalu" } // Tuvalu - //tw { "Twi" } // Twi - ty { "Taħitjan" } // Tahitian - tyv { "Tuvinjan" } // Tuvinian - ug { "Wigur" } // Uighur - uga { "Ugaritiku" } // Ugaritic - uk { "Ukranjan" } // Ukrainian - //umb { "Umbundu" } // Umbundu - und { "Indeterminat" } // Undetermined - //ur { "Urdu" } // Urdu - uz { "Użbek" } // Uzbek - //vai { "Vai" } // Vai - //ven { "Venda" } // Venda - vi { "Vjetnamiż" } // Vietnamese - //vo { "Volapuk" } // Volapuk - vot { "Votik" } // Votic - wak { "Lingwi Wakaxani" } // Wakashan Languages - //wal { "Walamo" } // Walamo - war { "Waraj" } // Waray - was { "Waxo" } // Washo - wen { "Lingwi Sorbjani" } // Sorbian Languages - //wo { "Wolof" } // Wolof - xh { "Ħoża" } // Xhosa - yao { "Jao" } // Yao - yap { "Japese" } // Yapese - yi { "Jiddix" } // Yiddish - yo { "Joruba" } // Yoruba - ypk { "Lingwi Jupiċi" } // Yupik Languages - za { "Żwang" } // Zhuang - zap { "Żapotek" } // Zapotec - zen { "Żenaga" } // Zenaga - zh { "Ċiniż" } // Chinese - znd { "Żande" } // Zande - zu { "Żulu" } // Zulu - zun { "Żuni" } // Zuni +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/mt.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/mt.xml + */ +mt{ + Countries{ + AD{"Andorra"} + AE{"Emirati Għarab Maqgħuda"} + AF{"Afganistan"} + AG{"Antigua and Barbuda"} + AI{"Angwilla"} + AL{"Albanija"} + AM{"Armenja"} + AN{"Antilles Olandiżi"} + AO{"Angola"} + AQ{"Antarctica"} + AR{"Arġentina"} + AS{"Samoa Amerikana"} + AT{"Awstrija"} + AU{"Awstralja"} + AW{"Aruba"} + AZ{"Ażerbajġan"} + BA{"Bożnija Ħerżegovina"} + BB{"Barbados"} + BD{"Bangladexx"} + BE{"Belġju"} + BF{"Burkina Faso"} + BG{"Bulgarija"} + BH{"Baħrajn"} + BI{"Burundi"} + BJ{"Benin"} + BM{"Bermuda"} + BN{"Brunej"} + BO{"Bolivja"} + BR{"Brażil"} + BS{"Baħamas"} + BT{"Butan"} + BV{"Bouvet Island"} + BW{"Botswana"} + BY{"Bjelorussja"} + BZ{"Beliże"} + CA{"Kanada"} + CC{"Cocos (Keeling) Islands"} + CD{"Democratic Republic of the Congo"} + CF{"Repubblika Afrikana Ċentrali"} + CG{"Kongo"} + CH{"Svizzera"} + CI{"Kosta ta' l-Avorju"} + CK{"Cook Islands"} + CL{"Ċili"} + CM{"Kamerun"} + CN{"Ċina"} + CO{"Kolumbja"} + CR{"Kosta Rika"} + CU{"Kuba"} + CV{"Kape Verde"} + CX{"Christmas Island"} + CY{"Ċipru"} + CZ{"Repubblika Ċeka"} + DE{"Ġermanja"} + DJ{"Ġibuti"} + DK{"Danimarka"} + DM{"Dominika"} + DO{"Republikka Domenikana"} + DZ{"Alġerija"} + EC{"Ekwador"} + EE{"Estonja"} + EG{"Eġittu"} + EH{"Sahara tal-Punent"} + ER{"Eritreja"} + ES{"Spanja"} + ET{"Etijopja"} + FI{"Finlandja"} + FJ{"Fiġi"} + FK{"Falkland Islands"} + FM{"Mikronesja"} + FO{"Gżejjer Faroe"} + FR{"Franza"} + GA{"Gabon"} + GB{"Ingilterra"} + GD{"Grenada"} + GE{"Ġorġja"} + GF{"Gujana Franċiża"} + GH{"Gana"} + GI{"Gibraltar"} + GL{"Grinlandja"} + GM{"Gambja"} + GN{"Gineja"} + GP{"Gwadelupe"} + GQ{"Ginea Ekwatorjali"} + GR{"Greċja"} + GS{"South Georgia and the South Sandwich Islands"} + GT{"Gwatemala"} + GU{"Gwam"} + GW{"Ginea-Bissaw"} + GY{"Gujana"} + HK{"Ħong Kong S.A.R., Ċina"} + HM{"Heard Island and McDonald Islands"} + HN{"Ħonduras"} + HR{"Kroazja"} + HT{"Ħaiti"} + HU{"Ungerija"} + ID{"Indoneżja"} + IE{"Irlanda"} + IL{"Iżrael"} + IN{"Indja"} + IO{"British Indian Ocean Territory"} + IQ{"Iraq"} + IR{"Iran"} + IS{"Islanda"} + IT{"Italja"} + JM{"Ġamajka"} + JO{"Ġordan"} + JP{"Ġappun"} + KE{"Kenja"} + KG{"Kirgistan"} + KH{"Kambodja"} + KI{"Kiribati"} + KM{"Komoros"} + KN{"Saint Kitts and Nevis"} + KP{"Koreja ta' Fuq"} + KR{"Koreja t'Isfel"} + KW{"Kuwajt"} + KY{"Cayman Islands"} + KZ{"Każakstan"} + LA{"Laos"} + LB{"Libanu"} + LC{"Saint Lucia"} + LI{"Liechtenstein"} + LK{"Sri Lanka"} + LR{"Liberja"} + LS{"Lesoto"} + LT{"Litwanja"} + LU{"Lussemburgu"} + LV{"Latvja"} + LY{"Libja"} + MA{"Marokk"} + MC{"Monako"} + MD{"Maldova"} + MG{"Madagaskar"} + MH{"Gżejjer ta' Marshall"} + MK{"Maċedonja"} + ML{"Mali"} + MM{"Mjanmar"} + MN{"Mongolja"} + MO{"Macao S.A.R., China"} + MP{"Gżejjer Marjana ta' Fuq"} + MQ{"Martinik"} + MR{"Mawritanja"} + MS{"Montserrat"} + MT{"Malta"} + MU{"Mawrizju"} + MV{"Maldives"} + MW{"Malawi"} + MX{"Messiku"} + MY{"Malasja"} + MZ{"Możambik"} + NA{"Namibja"} + NC{"New Caledonia"} + NE{"Niġer"} + NF{"Norfolk Island"} + NG{"Niġerja"} + NI{"Nikaragwa"} + NL{"Olanda"} + NO{"Norveġja"} + NP{"Nepal"} + NR{"Nauru"} + NU{"Niue"} + NZ{"New Zealand"} + OM{"Oman"} + PA{"Panama"} + PE{"Peru"} + PF{"Polinesja Franċiża"} + PG{"Papwa-Ginea Ġdida"} + PH{"Filippini"} + PK{"Pakistan"} + PL{"Polonja"} + PM{"Saint Pierre and Miquelon"} + PN{"Pitcairn"} + PR{"Puerto Rico"} + PS{"Palestinian Territory"} + PT{"Portugall"} + PW{"Palau"} + PY{"Paragwaj"} + QA{"Qatar"} + RE{"Réunion"} + RO{"Rumanija"} + RU{"Russja"} + RW{"Rwanda"} + SA{"Għarabja Sawdita"} + SB{"Solomon Islands"} + SC{"Seychelles"} + SD{"Sudan"} + SE{"Żvezja"} + SG{"Singapor"} + SH{"Saint Helena"} + SI{"Slovenja"} + SJ{"Svalbard and Jan Mayen"} + SK{"Slovakkja"} + SL{"Sierra Leone"} + SM{"San Marino"} + SN{"Senegal"} + SO{"Somalja"} + SP{"Serbja"} + SR{"Surinam"} + ST{"Sao Tome and Principe"} + SV{"El Salvador"} + SY{"Sirja"} + SZ{"Sważiland"} + TC{"Turks and Caicos Islands"} + TD{"Ċad"} + TF{"Territorji Franċiżi ta' Nofsinhar"} + TG{"Togo"} + TH{"Tajlandja"} + TJ{"Taġikistan"} + TK{"Tokelaw"} + TL{"Timor tal-Lvant"} + TM{"Turkmenistan"} + TN{"Tuneż"} + TO{"Tonga"} + TR{"Turkija"} + TT{"Trinidad u Tobago"} + TV{"Tuvalu"} + TW{"Tajwan"} + TZ{"Tanżanija"} + UA{"Ukraina"} + UG{"Uganda"} + UM{"United States Minor Outlying Islands"} + US{"Stati Uniti"} + UY{"Urugwaj"} + UZ{"Użbekistan"} + VA{"Vatikan"} + VC{"Saint Vincent and the Grenadines"} + VE{"Venezwela"} + VG{"British Virgin Islands"} + VI{"U.S. Virgin Islands"} + VN{"Vjetnam"} + VU{"Vanwatu"} + WF{"Wallis and Futuna"} + WS{"Samoa"} + YE{"Jemen"} + YT{"Majotte"} + YU{"Jugoslavja"} + ZA{"Afrika t'Isfel"} + ZM{"Żambja"} + ZW{"Żimbabwe"} } - - // Duplicate data has been commented out. - Countries { - //AD { "Andorra" } // Andorra - AE { "Emirati Għarab Maqgħuda" } // United Arab Emirates - AF { "Afganistan" } // Afghanistan - AI { "Angwilla" } // Anguilla - AL { "Albanija" } // Albania - AM { "Armenja" } // Armenia - AN { "Antilles Olandiżi" } // Netherlands Antilles - //AO { "Angola" } // Angola - AR { "Arġentina" } // Argentina - AS { "Samoa Amerikana" } // American Samoa - AT { "Awstrija" } // Austria - AU { "Awstralja" } // Australia - //AW { "Aruba" } // Aruba - AZ { "Ażerbajġan" } // Azerbaijan - BA { "Bożnija Ħerżegovina" } // Bosnia and Herzegovina - //BB { "Barbados" } // Barbados - BD { "Bangladexx" } // Bangladesh - BE { "Belġju" } // Belgium - //BF { "Burkina Faso" } // Burkina Faso - BG { "Bulgarija" } // Bulgaria - BH { "Baħrajn" } // Bahrain - //BI { "Burundi" } // Burundi - //BJ { "Benin" } // Benin - //BM { "Bermuda" } // Bermuda - BN { "Brunej" } // Brunei - BO { "Bolivja" } // Bolivia - BR { "Brażil" } // Brazil - BS { "Baħamas" } // Bahamas - BT { "Butan" } // Bhutan - //BW { "Botswana" } // Botswana - BY { "Bjelorussja" } // Belarus - BZ { "Beliże" } // Belize - CA { "Kanada" } // Canada - CF { "Repubblika Afrikana Ċentrali" } // Central African Republic - CG { "Kongo" } // Congo - CH { "Svizzera" } // Switzerland - CI { "Kosta ta' l-Avorju" } // Côte d'Ivoire - CL { "Ċili" } // Chile - CM { "Kamerun" } // Cameroon - CN { "Ċina" } // China - CO { "Kolumbja" } // Colombia - CR { "Kosta Rika" } // Costa Rica - CU { "Kuba" } // Cuba - CV { "Kape Verde" } // Cape Verde - CY { "Ċipru" } // Cyprus - CZ { "Repubblika Ċeka" } // Czech Republic - DE { "Ġermanja" } // Germany - DJ { "Ġibuti" } // Djibouti - DK { "Danimarka" } // Denmark - DM { "Dominika" } // Dominica - DO { "Republikka Domenikana" } // Dominican Republic - DZ { "Alġerija" } // Algeria - EC { "Ekwador" } // Ecuador - EE { "Estonja" } // Estonia - EG { "Eġittu" } // Egypt - EH { "Sahara tal-Punent" } // Western Sahara - ER { "Eritreja" } // Eritrea - ES { "Spanja" } // Spain - ET { "Etijopja" } // Ethiopia - FI { "Finlandja" } // Finland - FJ { "Fiġi" } // Fiji - FM { "Mikronesja" } // Micronesia - FO { "Gżejjer Faroe" } // Faroe Islands - FR { "Franza" } // France - //GA { "Gabon" } // Gabon - GB { "Ingilterra" } // United Kingdom - GE { "Ġorġja" } // Georgia - GF { "Gujana Franċiża" } // French Guiana - GH { "Gana" } // Ghana - GL { "Grinlandja" } // Greenland - GM { "Gambja" } // Gambia - GN { "Gineja" } // Guinea - GP { "Gwadelupe" } // Guadeloupe - GQ { "Ginea Ekwatorjali" } // Equatorial Guinea - GR { "Greċja" } // Greece - GT { "Gwatemala" } // Guatemala - GU { "Gwam" } // Guam - GW { "Ginea-Bissaw" } // Guinea-Bissau - GY { "Gujana" } // Guyana - HK { "Ħong Kong S.A.R., Ċina" } // Hong Kong S.A.R., China - HN { "Ħonduras" } // Honduras - HR { "Kroazja" } // Croatia - HT { "Ħaiti" } // Haiti - HU { "Ungerija" } // Hungary - ID { "Indoneżja" } // Indonesia - IE { "Irlanda" } // Ireland - IL { "Iżrael" } // Israel - IN { "Indja" } // India - //IQ { "Iraq" } // Iraq - //IR { "Iran" } // Iran - IS { "Islanda" } // Iceland - IT { "Italja" } // Italy - JM { "Ġamajka" } // Jamaica - JO { "Ġordan" } // Jordan - JP { "Ġappun" } // Japan - KE { "Kenja" } // Kenya - KG { "Kirgistan" } // Kyrgyzstan - KH { "Kambodja" } // Cambodia - //KI { "Kiribati" } // Kiribati - KM { "Komoros" } // Comoros - KP { "Koreja ta' Fuq" } // North Korea - KR { "Koreja t'Isfel" } // South Korea - KW { "Kuwajt" } // Kuwait - KZ { "Każakstan" } // Kazakhstan - //LA { "Laos" } // Laos - LB { "Libanu" } // Lebanon - //LI { "Liechtenstein" } // Liechtenstein - //LK { "Sri Lanka" } // Sri Lanka - LR { "Liberja" } // Liberia - LS { "Lesoto" } // Lesotho - LT { "Litwanja" } // Lithuania - LU { "Lussemburgu" } // Luxembourg - LV { "Latvja" } // Latvia - LY { "Libja" } // Libya - MA { "Marokk" } // Morocco - MC { "Monako" } // Monaco - MD { "Maldova" } // Moldova - MG { "Madagaskar" } // Madagascar - MH { "Gżejjer ta' Marshall" } // Marshall Islands - MK { "Maċedonja" } // Macedonia - //ML { "Mali" } // Mali - MM { "Mjanmar" } // Myanmar - MN { "Mongolja" } // Mongolia - MP { "Gżejjer Marjana ta' Fuq" } // Northern Mariana Islands - MQ { "Martinik" } // Martinique - MR { "Mawritanja" } // Mauritania - //MS { "Montserrat" } // Montserrat - //MT { "Malta" } // Malta - MU { "Mawrizju" } // Mauritius - MX { "Messiku" } // Mexico - MY { "Malasja" } // Malaysia - MZ { "Możambik" } // Mozambique - NA { "Namibja" } // Namibia - //NC { "New Caledonia" } // New Caledonia - NE { "Niġer" } // Niger - NG { "Niġerja" } // Nigeria - NI { "Nikaragwa" } // Nicaragua - NL { "Olanda" } // Netherlands - NO { "Norveġja" } // Norway - //NP { "Nepal" } // Nepal - //NU { "Niue" } // Niue - //NZ { "New Zealand" } // New Zealand - //OM { "Oman" } // Oman - //PA { "Panama" } // Panama - //PE { "Peru" } // Peru - PF { "Polinesja Franċiża" } // French Polynesia - PG { "Papwa-Ginea Ġdida" } // Papua New Guinea - PH { "Filippini" } // Philippines - //PK { "Pakistan" } // Pakistan - PL { "Polonja" } // Poland - //PR { "Puerto Rico" } // Puerto Rico - PT { "Portugall" } // Portugal - PY { "Paragwaj" } // Paraguay - //QA { "Qatar" } // Qatar - RO { "Rumanija" } // Romania - RU { "Russja" } // Russia - //RW { "Rwanda" } // Rwanda - SA { "Għarabja Sawdita" } // Saudi Arabia - //SC { "Seychelles" } // Seychelles - //SD { "Sudan" } // Sudan - SE { "Żvezja" } // Sweden - SG { "Singapor" } // Singapore - SI { "Slovenja" } // Slovenia - SK { "Slovakkja" } // Slovakia - //SL { "Sierra Leone" } // Sierra Leone - //SN { "Senegal" } // Senegal - SO { "Somalja" } // Somalia - SP { "Serbja" } // Serbia - SR { "Surinam" } // Suriname - //SV { "El Salvador" } // El Salvador - SY { "Sirja" } // Syria - SZ { "Sważiland" } // Swaziland - TD { "Ċad" } // Chad - TF { "Territorji Franċiżi ta' Nofsinhar" } // French Southern Territories - //TG { "Togo" } // Togo - TH { "Tajlandja" } // Thailand - TJ { "Taġikistan" } // Tajikistan - TK { "Tokelaw" } // Tokelau - //TM { "Turkmenistan" } // Turkmenistan - TN { "Tuneż" } // Tunisia - //TO { "Tonga" } // Tonga - TL { "Timor tal-Lvant" } // East Timor - TR { "Turkija" } // Turkey - TT { "Trinidad u Tobago" } // Trinidad and Tobago - TW { "Tajwan" } // Taiwan - TZ { "Tanżanija" } // Tanzania - UA { "Ukraina" } // Ukraine - //UG { "Uganda" } // Uganda - US { "Stati Uniti" } // United States - UY { "Urugwaj" } // Uruguay - UZ { "Użbekistan" } // Uzbekistan - VA { "Vatikan" } // Vatican - VE { "Venezwela" } // Venezuela - //VG { "British Virgin Islands" } // British Virgin Islands - //VI { "U.S. Virgin Islands" } // U.S. Virgin Islands - VN { "Vjetnam" } // Vietnam - VU { "Vanwatu" } // Vanuatu - YE { "Jemen" } // Yemen - YT { "Majotte" } // Mayotte - YU { "Jugoslavja" } // Yugoslavia - ZA { "Afrika t'Isfel" } // South Africa - ZM { "Żambja" } // Zambia - //ZR { "Żaire" } // Zaire // It's now called CD { "Democratic Republic of the Congo" } - ZW { "Żimbabwe" } // Zimbabwe - - } - MonthNames { - Jannar, - Frar, - Marzu, - April, - Mejju, - Ġunju, - Lulju, - Awissu, - Settembru, - Ottubru, - Novembru, - Diċembru - } - - MonthAbbreviations { - "Jan", - "Fra", - "Mar", - "Apr", - "Mej", - "Ġun", - "Lul", - "Awi", - "Set", - "Ott", - "Nov", - "Diċ" - } - DayNames { - "Il-Ħadd", - "It-Tnejn", - "It-Tlieta", - "L-Erbgħa", - "Il-Ħamis", - "Il-Ġimgħa", - "Is-Sibt" + Currencies{ + MTL{ + "Lm", + "Lira Maltija", + } } - - Eras { - "QK", // Quddiem Kristu [from Il-BIBBJA - it-tieni edijoni, - "WK" // Wara Kristu Ghaqda Biblika Maltija] + ExemplarCharacters{"[[a-z à ì ù è ò ċ ġ ħ {għ} ż]-[cy]]"} + Languages{ + aa{"Afar"} + ab{"Abkażjan"} + ace{"Aċiniż"} + ach{"Akoli"} + ada{"Adangme"} + ady{"Adyghe"} + ae{"Avestan"} + af{"Afrikans"} + afa{"Afro-Asjatiku (Oħra)"} + afh{"Afriħili"} + ak{"Akan"} + akk{"Akkadjen"} + ale{"Aleut"} + alg{"Lingwi Algonqwinjani"} + am{"Amħariku"} + an{"Aragonese"} + ang{"Ingliż, Antik (ca.450-1100)"} + apa{"Lingwi Apaċi"} + ar{"Għarbi"} + arc{"Aramajk"} + arn{"Arawkanjan"} + arp{"Arapaħo"} + art{"Artifiċjali (Oħra)"} + arw{"Arawak"} + as{"Assamese"} + ast{"Asturian"} + ath{"Lingwi Atabaskani"} + aus{"Lingwi Awstraljani"} + av{"Avarik"} + awa{"Awadħi"} + ay{"Ajmara"} + az{"Ażerbajġani"} + ba{"Baxkir"} + bad{"Banda"} + bai{"Lingwi Bamileke"} + bal{"Baluċi"} + ban{"Baliniż"} + bas{"Basa"} + bat{"Baltiku (Oħra)"} + be{"Belarussu"} + bej{"Beja"} + bem{"Bemba"} + ber{"Beber"} + bg{"Bulgaru"} + bh{"Biħari"} + bho{"Bojpuri"} + bi{"Bislama"} + bik{"Bikol"} + bin{"Bini"} + bla{"Siksika"} + bm{"Bambara"} + bn{"Bengali"} + bnt{"Bantu"} + bo{"Tibetjan"} + br{"Brenton"} + bra{"Braj"} + bs{"Bosnijan"} + btk{"Batak"} + bua{"Burjat"} + bug{"Buginiż"} + byn{"Blin"} + ca{"Katalan"} + cad{"Kaddo"} + cai{"Amerika Ċentrali (Oħra)"} + car{"Karib"} + cau{"Kawkasu (Oħra)"} + ce{"Ċeċen"} + ceb{"Sibwano"} + cel{"Keltiku (Oħra)"} + ch{"Ċamorro"} + chb{"Ċibċa"} + chg{"Ċagataj"} + chk{"Ċukese"} + chm{"Mari"} + chn{"Ġargon taċ-Ċinuk"} + cho{"Ċostaw"} + chp{"Ċipewjan"} + chr{"Ċerokij"} + chy{"Xajenn"} + cmc{"Lingwi Ċamiki"} + co{"Korsiku"} + cop{"Koptiku"} + cpe{"Kreoli u Piġini, Bbażat fuq l-Ingliż (Oħra)"} + cpf{"Kreoli u Piġini, Bbażat fuq il-Franċiż (Oħra)"} + cpp{"Creoles and pidgins, Portuguese-based (Other)"} + cr{"Krij"} + crh{"Crimean Turkish; Crimean Tatar"} + crp{"Kreoli u Piġini (Oħra)"} + cs{"Ċek"} + csb{"Kashubian"} + cu{"Slaviku tal-Knisja"} + cus{"Kuxtiku (Oħra)"} + cv{"Ċuvax"} + cy{"Welx"} + da{"Daniż"} + dak{"Dakota"} + dar{"Dargwa"} + day{"Dajak"} + de{"Ġermaniż"} + del{"Delawerjan"} + den{"Slav"} + dgr{"Dogrib"} + din{"Dinka"} + doi{"Dogri"} + dra{"Dravidjan (Oħra)"} + dsb{"Lower Sorbian"} + dua{"Dwala"} + dum{"Olandiż, Medjevali (ca. 1050-1350)"} + dv{"Diveħi"} + dyu{"Djula"} + dz{"Dżongka"} + ee{"Ewe"} + efi{"Efik"} + egy{"Eġizzjan (Antik)"} + eka{"Ekajuk"} + el{"Grieg"} + elx{"Elamit"} + en{"Ingliż"} + enm{"Ingliż, Medjevali (1100-1500)"} + eo{"Esperanto"} + es{"Spanjol"} + et{"Estonjan"} + eu{"Bask"} + ewo{"Ewondo"} + fa{"Persjan"} + fan{"Fang"} + fat{"Fanti"} + ff{"Fulaħ"} + fi{"Finlandiż"} + fiu{"Finno - Ugrijan"} + fj{"Fiġi"} + fo{"Fawriż"} + fon{"Fon"} + fr{"Franċiż"} + frm{"Franċiż, Medjevali (ca. 1400-1600)"} + fro{"Franċiż, Antik (842-ca. 1400)"} + fur{"Frijuljan"} + fy{"Friżjan"} + ga{"Irlandiż"} + gaa{"Ga"} + gay{"Gajo"} + gba{"Gbaja"} + gd{"Galliku Skoċċiż"} + gem{"Ġermaniku (Oħra)"} + gez{"Geez"} + gil{"Gilbertjan"} + gl{"Gallegjan"} + gmh{"Ġermaniku, Medjevali Pulit (ca. 1050-1500)"} + gn{"Gwarani"} + goh{"Ġermaniku, Antik Pulit (ca. 750-1050)"} + gon{"Gondi"} + gor{"Gorontalo"} + got{"Gotiku"} + grb{"Ġerbo"} + grc{"Grieg, Antik (to 1453)"} + gu{"Guġarati"} + gv{"Manks"} + gwi{"Gwiċin"} + ha{"Ħawsa"} + hai{"Ħajda"} + haw{"Ħawajjan"} + he{"Ebrajk"} + hi{"Ħindi"} + hil{"Hiligaynon"} + him{"Ħimaċali"} + hit{"Ħittit"} + hmn{"Ħmong"} + ho{"Ħiri Motu"} + hr{"Kroat"} + hsb{"Upper Sorbian"} + ht{"Haitian"} + hu{"Ungeriż"} + hup{"Ħupa"} + hy{"Armenjan"} + hz{"Ħerero"} + ia{"Interlingua"} + iba{"Iban"} + id{"Indoneżjan"} + ie{"Interlingue"} + ig{"Igbo"} + ii{"Sichuan Yi"} + ijo{"Iġo"} + ik{"Inupjak"} + ilo{"Iloko"} + inc{"Indjan (Oħra)"} + ine{"Indo-Ewropew"} + inh{"Ingush"} + io{"Ido"} + ira{"Iranjan"} + iro{"Lingwi Irogwjani"} + is{"Iżlandiż"} + it{"Taljan"} + iu{"Inukitut"} + ja{"Ġappuniż"} + jbo{"Lojban"} + jpr{"Lhudi-Persjan"} + jrb{"Lhudi-Għarbi"} + jv{"Ġavaniż"} + ka{"Ġorġjan"} + kaa{"Kara-Kalpak"} + kab{"Kabuljan"} + kac{"Kaċin"} + kam{"Kamba"} + kar{"Karen"} + kaw{"Kawi"} + kbd{"Kabardian"} + kg{"Kongo"} + kha{"Kasi"} + khi{"Kojsan"} + kho{"Kotaniż"} + ki{"Kikuju"} + kj{"Kuanyama"} + kk{"Każak"} + kl{"Kalallisut"} + km{"Kmer"} + kmb{"Kimbundu"} + kn{"Kannada"} + ko{"Korejan"} + kok{"Konkani"} + kos{"Kosrejan"} + kpe{"Kpelle"} + kr{"Kanuri"} + krc{"Karachay-Balkar"} + kro{"Kru"} + kru{"Kurusk"} + ks{"Kaxmiri"} + ku{"Kurdiż"} + kum{"Kumiku"} + kut{"Kutenaj"} + kv{"Komi"} + kw{"Korniku"} + ky{"Kirgiż"} + la{"Latin"} + lad{"Ladino"} + lah{"Landa"} + lam{"Lamba"} + lb{"Letżburgiż"} + lez{"Leżgjan"} + lg{"Ganda"} + li{"Limburgish"} + ln{"Lingaljan"} + lo{"Lao"} + lol{"Mongo"} + loz{"Lożi"} + lt{"Litwanjan"} + lu{"Luba-Katanga"} + lua{"Luba-Luluwa"} + lui{"Luwisinuż"} + lun{"Lunda"} + luo{"Luwa"} + lus{"Luxaj"} + lv{"Latvjan (Lettix)"} + mad{"Maduriż"} + mag{"Magaħi"} + mai{"Majtili"} + mak{"Makasar"} + man{"Mandingwan"} + map{"Awstronesjan"} + mas{"Masaj"} + mdf{"Moksha"} + mdr{"Mandar"} + men{"Mende"} + mg{"Malagażi"} + mga{"Irlandiż, Medjevali (900-1200)"} + mh{"Marxall"} + mi{"Maori"} + mic{"Mikmek"} + min{"Minangkabaw"} + mis{"Lingwi Oħra"} + mk{"Maċedonjan"} + mkh{"Mon-Kmer (Oħra)"} + ml{"Malajalam"} + mn{"Mongoljan"} + mnc{"Manċurjan"} + mni{"Manipuri"} + mno{"Lingwi Manobo"} + mo{"Moldavjan"} + moh{"Moħak"} + mos{"Mossi"} + mr{"Marati"} + ms{"Malajan"} + mt{"Malti"} + mul{"Lingwi Diversi"} + mun{"Lingwi tal-Munda"} + mus{"Kriek"} + mwr{"Marwari"} + my{"Burmiż"} + myn{"Majan"} + myv{"Erzya"} + na{"Nawuru"} + nah{"Naħwatil"} + nai{"Indjan tal-Amerika ta' Fuq (Oħra)"} + nap{"Neapolitan"} + nb{"Bokmahal Norveġiż"} + nd{"Ndebele, ta' Fuq"} + nds{"Ġermaniż Komuni; Sassonu Komuni"} + ne{"Nepaliż"} + new{"Newari"} + ng{"Ndonga"} + nia{"Nijas"} + nic{"Niġerjan - Kordofanjan"} + niu{"Nijuwejan"} + nl{"Olandiż"} + nn{"Ninorsk Norveġiż"} + no{"Norveġiż"} + nog{"Nogai"} + non{"Skandinav, Antik"} + nr{"Ndebele, t'Isfel"} + nso{"Soto, ta' Fuq"} + nub{"Lingwi Nubjani"} + nv{"Navaħo"} + nwc{"Classical Newari"} + ny{"Ċiċewa; Njanġa"} + nym{"Njamweżi"} + nyn{"Nyankole"} + nyo{"Njoro"} + nzi{"Nżima"} + oc{"Provenzal (wara 1500)"} + oj{"Oġibwa"} + om{"Oromo (Afan)"} + or{"Orija"} + os{"Ossettiku"} + osa{"Osaġjan"} + ota{"Tork (Imperu Ottoman)"} + oto{"Lingwi Otomjani"} + pa{"Punġabi"} + paa{"Papwan (Oħra)"} + pag{"Pangasinjan"} + pal{"Paħlavi"} + pam{"Pampamga"} + pap{"Papjamento"} + pau{"Palawjan"} + peo{"Persjan Antik (ca. 600-400 Q.K.)"} + phi{"Filippin (Oħra)"} + phn{"Feniċju"} + pi{"Pali"} + pl{"Pollakk"} + pon{"Ponpejan"} + pra{"Lingwi Prakriti"} + pro{"Provenzal, Antik (sa l-1500)"} + ps{"Paxtun"} + pt{"Portugiż"} + qu{"Keċwa"} + raj{"Raġastani"} + rap{"Rapanwi"} + rar{"Rarotongani"} + rm{"Reto-Romanz"} + rn{"Rundi"} + ro{"Rumen"} + roa{"Romanz (Oħra)"} + rom{"Żingaru"} + root{"Għerq"} + ru{"Russu"} + rw{"Kinjarwanda"} + sa{"Sanskrit"} + sad{"Sandawe"} + sah{"Jakut"} + sai{"Indjan tal-Amerika t'Isfel (Oħra)"} + sal{"Salixan"} + sam{"Samritan"} + sas{"Saska"} + sat{"Santali"} + sc{"Sardinjan"} + sco{"Skoċċiż"} + sd{"Sindi"} + se{"Sami ta' Fuq"} + sel{"Selkup"} + sem{"Semitiku"} + sg{"Sango"} + sga{"Irlandiż, Antik (sa l-900)"} + sgn{"Lingwa tas-Sinjali"} + sh{"Serbo-Kroat"} + shn{"Xan"} + si{"Sinħaliż"} + sid{"Sidamo"} + sio{"Lingwi Suwjani"} + sit{"Sino-Tibetjani (Oħra)"} + sk{"Slovakk"} + sl{"Slav"} + sla{"Slavic (Other)"} + sm{"Samojan"} + sma{"Southern Sami"} + smi{"Sami languages (Other)"} + smj{"Lule Sami"} + smn{"Inari Sami"} + sms{"Skolt Sami"} + sn{"Xona"} + snk{"Soninke"} + so{"Somali"} + sog{"Sogdien"} + son{"Songaj"} + sq{"Albaniż"} + sr{"Serb"} + srr{"Serer"} + ss{"Swati"} + ssa{"Nilo-Saħaram"} + st{"Soto, t'Isfel"} + su{"Sundaniż"} + suk{"Sukuma"} + sus{"Susu"} + sux{"Sumerjan"} + sv{"Svediż"} + sw{"Swaħili"} + syr{"Sirjan"} + ta{"Tamil"} + tai{"Tai (Oħra)"} + te{"Telugu"} + tem{"Timne"} + ter{"Tereno"} + tet{"Tetum"} + tg{"Taġik"} + th{"Tajlandiż"} + ti{"Tigrinja"} + tig{"Tigre"} + tiv{"Tiv"} + tk{"Turkmeni"} + tkl{"Tokelau"} + tl{"Tagalog"} + tlh{"Klingon"} + tli{"Tlingit"} + tmh{"Tamaxek"} + tn{"Zwana"} + to{"Tongan (Gżejjer ta' Tonga)"} + tog{"Tonga (Njasa)"} + tpi{"Tok Pisin"} + tr{"Tork"} + ts{"Tsonga"} + tsi{"Zimxjan"} + tt{"Tatar"} + tum{"Tumbuka"} + tup{"Tupi languages"} + tut{"Altajk (Oħra)"} + tvl{"Tuvalu"} + tw{"Twi"} + ty{"Taħitjan"} + tyv{"Tuvinjan"} + udm{"Udmurt"} + ug{"Wigur"} + uga{"Ugaritiku"} + uk{"Ukranjan"} + umb{"Umbundu"} + und{"Indeterminat"} + ur{"Urdu"} + uz{"Użbek"} + vai{"Vai"} + ve{"Venda"} + vi{"Vjetnamiż"} + vo{"Volapuk"} + vot{"Votik"} + wa{"Walloon"} + wak{"Lingwi Wakaxani"} + wal{"Walamo"} + war{"Waraj"} + was{"Waxo"} + wen{"Lingwi Sorbjani"} + wo{"Wolof"} + xal{"Kalmyk"} + xh{"Ħoża"} + yao{"Jao"} + yap{"Japese"} + yi{"Jiddix"} + yo{"Joruba"} + ypk{"Lingwi Jupiċi"} + za{"Żwang"} + zap{"Żapotek"} + zen{"Żenaga"} + zh{"Ċiniż"} + znd{"Żande"} + zu{"Żulu"} + zun{"Żuni"} } - - DayAbbreviations { - "Ħad", - "Tne", - "Tli", - "Erb", - "Ħam", - "Ġim", - "Sib" + LocaleScript{ + "Latn", } - - -// NumberElements { -// ".", -// ",", -// ";", -// "%", -// "0", -// "#", -// "-", -// "E", -// "‰", -// "∞", -// "�" -// } - - -// illum is-Sibt, 01 ta'' Awissu, 1998 :) - DateTimePatterns { - "h:mm:ss a z", - "h:mm:ss a z", - "h:mm:ss a", - "h:mm a", - "EEEE, d 'ta''' MMMM, yyyy", - "d 'ta''' MMMM yyyy", - "dd-MMM-yyyy", - "dd/MM/yy", - "{1} {0}" + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 1, + 4, + } + DateTimePatterns{ + "HH:mm:ss z", + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm", + "EEEE, d 'ta''' MMMM yyyy", + "d 'ta''' MMMM yyyy", + "dd MMM yyyy", + "dd/MM/yyyy", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "Ħad", + "Tne", + "Tli", + "Erb", + "Ħam", + "Ġim", + "Sib", + } + wide{ + "Il-Ħadd", + "It-Tnejn", + "It-Tlieta", + "L-Erbgħa", + "Il-Ħamis", + "Il-Ġimgħa", + "Is-Sibt", + } + } + } + eras{ + abbreviated{ + "QK", + "WK", + } + } + monthNames{ + format{ + abbreviated{ + "Jan", + "Fra", + "Mar", + "Apr", + "Mej", + "Ġun", + "Lul", + "Awi", + "Set", + "Ott", + "Nov", + "Diċ", + } + wide{ + "Jannar", + "Frar", + "Marzu", + "April", + "Mejju", + "Ġunju", + "Lulju", + "Awissu", + "Settembru", + "Ottubru", + "Novembru", + "Diċembru", + } + } + } + } } -// Duplicated in parent -// DateTimeElements { -// "1", -// "1" -// } - -// Note, that 'c' doesn't exist in Maltese. But I put it here following ċ -// for compatibility with foreign words. - -// Joseph Felici Pace and "Regolament" says: -// a b ċ [c] d e f ġ g għ h ħ i ie j k l m n o p q r s t u v w x [y] ż z - -// Note that IE is **NOT** sorted as ittra waħda. -// So says the Akkademja tal-Malta - - CollationElements - { - Version { "1.0" } - Sequence { "& B < ċ <<< Ċ" // ċ Ċ - " < c<<> is. - " -x: minus >>;\n" - // faction rule. This rule is used for formatting numbers - // with fractional parts. The result of formatting the - // number's integral part is substituted for the <<, and - // the result of formatting the number's fractional part - // (one digit at a time, e.g., 0.123 is "zero punt one two - // three") replaces the >>. - " x.x: << punt >>;\n" - // the rules for the values from 0 to 19 are simply the - // words for those numbers - " żero; wieħed; tnejn; tlieta; erbgħa; ħamsa; sitta; sebgħa; tmienja; disgħa;\n" - " għaxra; ħdax; tnax; tlettax; erbatax; ħmistax; sittax;\n" - " sbatax; tmintax; dsatax;\n" - // beginning at 20, we use the >> to mark the position where - // the result of formatting the number's ones digit. Thus, - // we only need a new rule at every multiple of 10. Text in - // backets is omitted if the value being formatted is an - // even multiple of 10. - " 20: [>> u ]għoxrin;\n" - " 30: [>> u ]tletin;\n" - " 40: [>> u ]erbgħin;\n" - " 50: [>> u ]ħamsin;\n" - " 60: [>> u ]sittin;\n" - " 70: [>> u ]sebgħin;\n" - " 80: [>> u ]tmenin;\n" - " 90: [>> u ]disgħin;\n" - // beginning at 100, we can use << to mark the position where - // the result of formatting the multiple of 100 is to be - // inserted. Notice also that the meaning of >> has shifted: - // here, it refers to both the ones place and the tens place. - // The meanings of the << and >> tokens depend on the base value - // of the rule. A rule's divisor is (usually) the highest - // power of 10 that is less than or equal to the rule's base - // value. The value being formatted is divided by the rule's - // divisor, and the integral quotient is used to get the text - // for <<, while the remainder is used to produce the text - // for >>. Again, text in brackets is omitted if the value - // being formatted is an even multiple of the rule's divisor - // (in this case, an even multiple of 100) - " 100: mija[ u >>];\n" - " 200: mitejn[ u >>];\n" - // The rules for the higher numbers work the same way as the - // rule for 100: Again, the << and >> tokens depend on the - // rule's divisor, which for all these rules is also the rule's - // base value. To group by thousand, we simply don't have any - // rules between 1,000 and 1,000,000. - " 1000: << elf[ u >>];\n" - " 2000: << elfejn[ u >>];\n" - " 3000: tliet elef [ u >>];\n" - " 1,000,000: << miljun[ u >>];\n" - " 1,000,000,000: << biljun[ >>];\n" - " 1,000,000,000,000: << triljun[ >>];\n" - // overflow rule. This rule specifies that values of a - // quadrillion or more are shown in numerals rather than words. - // The == token means to format (with new rules) the value - // being formatted by this rule and place the result where - // the == is. The #,##0 inside the == signs is a - // DecimalFormat pattern. It specifies that the value should - // be formatted with a DecimalFormat object, and that it - // should be formatted with no decimal places, at least one - // digit, and a thousands separator. - " 1,000,000,000,000,000: =#,##0=;\n" - - // %default is a more elaborate form of %simplified; It is basically - // the same, except that it introduces "and" before the ones digit - // when appropriate (basically, between the tens and ones digits) and - // separates the thousands groups with commas in values over 100,000. - "%default:\n" - // negative-number and fraction rules. These are the same - // as those for %simplified, but have to be stated here too - // because this is an entry point - " -x: minus >>;\n" - " x.x: << punt >>;\n" - // just use %simplified for values below 100 - " =%simplified=;\n" - // for values from 100 to 9,999 use %%and to decide whether or - // not to interpose the "and" - " 100: mija[ >%%and>];\n" - " 200: mitejn[ >%%and>];\n" - " 300: tlett mija[ >%%and>];\n" - " 400: erbgħa mija[ >%%and>];\n" - " 500: ħames mija[ >%%and>];\n" - " 600: sitt mija[ >%%and>];\n" - " 700: sebgħa mija[ >%%and>];\n" - " 800: tmin mija[ >%%and>];\n" - " 900: disgħa mija[ >%%and>];\n" - " 1000: << elf[ >%%and>];\n" - // for values of 100,000 and up, use %%commas to interpose the - // commas in the right places (and also to interpose the "and") - " 100,000>>: << thousand[>%%commas>];\n" - " 1,000,000: << million[>%%commas>];\n" - " 1,000,000,000: << billion[>%%commas>];\n" - " 1,000,000,000,000: << trillion[>%%commas>];\n" - " 1,000,000,000,000,000: =#,##0=;\n" - // if the value passed to this rule set is greater than 100, don't - // add the "and"; if it's less than 100, add "and" before the last - // digits - "%%and:\n" - " u =%default=;\n" - " 100: =%default=;\n" - // this rule set is used to place the commas - "%%commas:\n" - // for values below 100, add "and" (the apostrophe at the - // beginning is ignored, but causes the space that follows it - // to be significant: this is necessary because the rules - // calling %%commas don't put a space before it) - " ' and =%default=;\n" - // put a comma after the thousands (or whatever preceded the - // hundreds) - " 100: , =%default=;\n" - // put a comma after the millions (or whatever precedes the - // thousands) - " 1000: , <%default< thousand, >%default>;\n" - // and so on... - " 1,000,000: , =%default=;" - // %%lenient-parse isn't really a set of number formatting rules; - // it's a set of collation rules. Lenient-parse mode uses a Collator - // object to compare fragments of the text being parsed to the text - // in the rules, allowing more leeway in the matching text. This set - // of rules tells the formatter to ignore commas when parsing (it - // already ignores spaces, which is why we refer to the space; it also - // ignores hyphens, making "twenty one" and "twenty-one" parse - // identically) - "%%lenient-parse:\n" - // " & ' ' , ',' ;\n" - " &\u0000 << ' ' << ',' << '-'; \n" - } - - - DurationRules { - // main rule set for formatting with words - "%with-words:\n" - // take care of singular and plural forms of "second" - " 0 sekondi; 1 sekonda; =0= sekondi;\n" - // use %%min to format values greater than 60 seconds - " 60/60: <%%min<[, >>];\n" - // use %%hr to format values greater than 3,600 seconds - // (the ">>>" below causes us to see the number of minutes - // when when there are zero minutes) - " 3600/60: <%%hr<[, >>>];\n" - // this rule set takes care of the singular and plural forms - // of "minute" - "%%min:\n" - " 0 minuti; 1 minuta; =0= minuti;\n" - // this rule set takes care of the singular and plural forms - // of "hour" - "%%hr:\n" - " 0 siegħat; 1 siegħa; =0= siegħat;\n" - - // main rule set for formatting in numerals - "%in-numerals:\n" - // values below 60 seconds are shown with "sec." - " =0= sek.;\n" - // higher values are shown with colons: %%min-sec is used for - // values below 3,600 seconds... - " 60: =%%min-sec=;\n" - // ...and %%hr-min-sec is used for values of 3,600 seconds - // and above - " 3600: =%%hr-min-sec=;\n" - // this rule causes values of less than 10 minutes to show without - // a leading zero - "%%min-sec:\n" - " 0: :=00=;\n" - " 60/60: <0<>>;\n" - // this rule set is used for values of 3,600 or more. Minutes are always - // shown, and always shown with two digits - "%%hr-min-sec:\n" - " 0: :=00=;\n" - " 60/60: <00<>>;\n" - " 3600/60: <#,##0<:>>>;\n" - // the lenient-parse rules allow several different characters to be used - // as delimiters between hours, minutes, and seconds - "%%lenient-parse:\n" - " & ':' = '.' = ' ' = '-';\n" - } - - - - // Currency display names - Currencies { - MTL { "Lm", "MTL" } - } } - - -// -- BIBLIOGRAPHY -- -// -// Maltese alphabet: grazzi, to Mr. Karmenu Attard -// -// 'colour image's dictionary order (Malta, 1998) -- [CI] -// a b ċ [c] d e f ġ g għ h ħ i ie j k l m n o p q r s t u v w x y z ż -// Only Colour Image's dictionary has 'ie' as a separate letter. -// (that i have seen so far) -// -// Kapt Pawlu Bugeja's dizzunarju -// (Kelmet il-Malti) [Grima: Marsa, Malta, 1990) - the orange one -- [Kelmet] -// -- same order, but lists ż before z -// -// Lydia Sciriha seems to use the order 'g ġ għ' but 'z ż' in -- [BM] -// Beginning Maltese (Uni ta' Malta, 1996) in the lessons, -// but in the word list (at back) it's 'ġ g għ' and 'ż z' [1st ed.] -// -// J. Aquilina in his 'Teach Yourself:Maltese' book -- [Ty] -// (London: Hodder Headline, 1965 and Chicago, NTC Publishing 1995) -// uses the very different 'ġ g h ħ ... n għ o .. x ż z' ordering, -// placing għ between n and o. (I have heard this is to be similar to the -// Arabic ordering) -// -// Casha, Charles: 'Kun Af - aktar dwar ilsienna' -- [KA] -// (Blata l-Bajda, Malta: Merlin Library Ltd., 1987) - -// CREDITS: above sources and also.. -// - Mirka Mifsud Bonnici for much of the initial translation/inspiration -// - Karmenu Attard -// - MaxMan (Manuel) -// - Ramon Casha -// - Angelo Dalli ( Major updates to ISO lang/country codes) -// - in - in-nazzjon -// - lo - l-orrizont - -// Change Log -//2001-11-15 srl 0.9.4 MAJOR updates to ISO lang/cty codes from Angelo, -// Number spellout, etc.. -//2001-01-02 srl 0.9.2 Converted to UTF-8. Added: AE/GM/NI/OM/PH/SA/KW -//2000-10-09 gr 0.9.1 [shipped in ICU 1.7] -//2000-07-20 srl 0.9.0 diff --git a/icuSources/data/locales/mt_MT.txt b/icuSources/data/locales/mt_MT.txt index ca008dd7..89481c6e 100644 --- a/icuSources/data/locales/mt_MT.txt +++ b/icuSources/data/locales/mt_MT.txt @@ -1,26 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1998-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/mt_MT.xml // * // *************************************************************************** -// Maltese, Malta locale -// srl@monkey.sbay.org - -mt_MT { - - Version { "2.0" } - -// ShortCountry { MLT } - - - NumberPatterns { +mt_MT{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "\u00A4#,##0.00;(\u00A4#,##0.00)", + "¤#,##0.00;-¤#,##0.00", "#,##0%", "#E0", } - - LocaleID:int { 0x043A } - + Version{"1.2"} } diff --git a/icuSources/data/locales/nb.txt b/icuSources/data/locales/nb.txt index 193e2f2c..cc49464d 100644 --- a/icuSources/data/locales/nb.txt +++ b/icuSources/data/locales/nb.txt @@ -1,437 +1,2197 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2005 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/nb.xml // * // *************************************************************************** - -nb { - Version{"2.0"} - "%%PREEURO" { "F\u00f8r-eruropeisk" } - "%%EURO" { "Europeisk" } - - //"%%POSIX" { "POSIX" } - - "%%TRADITIONAL" { "Tradisjonell" } - - "%%REVISED" { "Revidert" } - - CollationElements { - Version { "1.0" } - Sequence { "& Z < \u00E6<<< \u00C6 < a\u0308<<< A\u0308< \u00F8<<< \u00D8" - " < o\u0308<<< O\u0308< o\u030B<<< O\u030B < a\u030A<<< A\u030A<<< aa <<< aA <<< Aa <<< AA & " - "V<<< w<<< W" } - } - Countries { - //AD { "Andorra" } - AE { "De forente arabiske emirater" } - //AF { "Afghanistan" } - AG { "Antigua og Barbuda" } - //AI { "Anguilla" } - //AL { "Albania" } - //AM { "Armenia" } - AN { "De nederlandske antiller" } - //AO { "Angola" } - AQ { "Antarktis" } - //AR { "Argentina" } - AS { "Amerikansk Samoa" } - AT { "\u00d8sterrike" } - //AU { "Australia" } - //AW { "Aruba" } - AZ { "Aserbajdsjan" } - BA { "Bosnia og Hercegovina" } - //BB { "Barbados" } - //BD { "Bangladesh" } - BE { "Belgia" } - //BF { "Burkina Faso" } - //BG { "Bulgaria" } - //BH { "Bahrain" } - //BI { "Burundi" } - //BJ { "Benin" } - //BM { "Bermuda" } - BN { "Brunei Darussalam" } - //BO { "Bolivia" } - BR { "Brasil" } - //BS { "Bahamas" } - //BT { "Bhutan" } - BV { "Bouvet\u00f8ya" } - //BW { "Botswana" } - BY { "Hviterussland" } - //BZ { "Belize" } - //CA { "Canada" } - CC { "Kokos\u00f8yene (Keeling\u00f8yene)" } - CD { "Kongo, Den demokratiske republikken" } - CF { "Den sentralafrikanske republikk" } - CG { "Kongo" } - CH { "Sveits" } - CI { "Elfenbenskysten" } - CK { "Cook\u00f8yene" } - //CL { "Chile" } - CM { "Kamerun" } - CN { "Kina" } - //CO { "Colombia" } - //CR { "Costa Rica" } - CV { "Kapp Verde" } - CX { "Christmas\u00f8ya" } - CY { "Kypros" } - CZ { "Tsjekkia" } - DE { "Tyskland" } - //DJ { "Djibouti" } - DK { "Danmark" } - //DM { "Dominica" } - DO { "Den dominikanske republikk" } - DZ { "Algerie" } - //EC { "Ecuador" } - EE { "Estland" } - //EG { "Egypt" } - EH { "Vest-Sahara" } - //ER { "Eritrea" } - ES { "Spania" } - ET { "Etiopia" } - //FI { "Finland" } - //FJ { "Fiji" } - FK { "Falklands\u00f8yene" } - FM { "Mikronesiaf\u00f8derasjonen" } - FO { "F\u00e6r\u00f8yene" } - FR { "Frankrike" } - //GA { "Gabon" } - GB { "Storbritannia" } - //GD { "Grenada" } - //GE { "Georgia" } - GF { "Fransk Guyana" } - //GH { "Ghana" } - //GI { "Gibraltar" } - GL { "Gr\u00f8nland" } - //GM { "Gambia" } - //GN { "Guinea" } - //GP { "Guadeloupe" } - GQ { "Ekvatorial-Guinea" } - GR { "Hellas" } - GS { "S\u00f8r-Georgia og S\u00f8r-Sandwich-\u00f8yene" } - //GT { "Guatemala" } - //GU { "Guam" } - //GW { "Guinea-Bissau" } - //GY { "Guyana" } - HK { "Hong Kong S.A.R. (Kina)" } - HM { "Heard- og McDonalds\u00f8yene" } - //HN { "Honduras" } - HR { "Kroatia" } - //HT { "Haiti" } - HU { "Ungarn" } - //ID { "Indonesia" } - IE { "Irland" } - //IL { "Israel" } - //IN { "India" } - IO { "Britiske omr\u00e5der i det indiske hav" } - IQ { "Irak" } - //IR { "Iran" } - IS { "Island" } - IT { "Italia" } - //JM { "Jamaica" } - //JO { "Jordan" } - //JP { "Japan" } - //KE { "Kenya" } - KG { "Kirgisistan" } - KH { "Kambodsja" } - //KI { "Kiribati" } - KM { "Komorene" } - KN { "St. Christopher og Nevis" } - KR { "Korea, Republikken" } - //KW { "Kuwait" } - KY { "Cayman\u00f8yene" } - KZ { "Kasakhstan" } - LA { "Laos, Den folkedemokratiske republikken" } - LB { "Libanon" } - LC { "St. Lucia" } - //LI { "Liechtenstein" } - //LK { "Sri Lanka" } - //LR { "Liberia" } - //LS { "Lesotho" } - LT { "Litauen" } - //LU { "Luxembourg" } - //LV { "Latvia" } - //LY { "Libya" } - MA { "Marokko" } - //MC { "Monaco" } - //MD { "Moldova" } - MG { "Madagaskar" } - MH { "Marshall\u00f8yene" } - MK { "Makedonia, Republikken" } - //ML { "Mali" } - //MM { "Myanmar" } - //MN { "Mongolia" } - MO { "Macao S.A.R. (Kina)" } - MP { "Nord-Marianene" } - //MQ { "Martinique" } - //MR { "Mauritania" } - //MS { "Montserrat" } - //MT { "Malta" } - //MU { "Mauritius" } - MV { "Maldivene" } - //MW { "Malawi" } - //MX { "Mexico" } - //MY { "Malaysia" } - MZ { "Mosambik" } - //NA { "Namibia" } - NC { "Ny-Caledonia" } - //NE { "Niger" } - NF { "Norfolk\u00f8yene" } - //NG { "Nigeria" } - //NI { "Nicaragua" } - NL { "Nederland" } - NO { "Norge" } - //NP { "Nepal" } - //NR { "Nauru" } - //NU { "Niue" } - //NZ { "New Zealand" } - //OM { "Oman" } - //PA { "Panama" } - //PE { "Peru" } - PF { "Fransk Polynesia" } - PG { "Papua Ny-Guinea" } - PH { "Filippinene" } - //PK { "Pakistan" } - PL { "Polen" } - PM { "St. Pierre og Miquelon" } - //PN { "Pitcairn" } - //PR { "Puerto Rico" } - PS { "Palestinsk territorium" } - //PT { "Portugal" } - //PW { "Palau" } - //PY { "Paraguay" } - //QA { "Qatar" } - RE { "Reunion" } - //RO { "Romania" } - RU { "Den russiske f\u00f8derasjon" } - //RW { "Rwanda" } - SA { "Saudi-Arabia" } - SB { "Salomon\u00f8yene" } - SC { "Seychellene" } - //SD { "Sudan" } - SE { "Sverige" } - //SG { "Singapore" } - //SH { "St. Helena" } - //SI { "Slovenia" } - SJ { "Svalbard og Jan Mayen" } - //SK { "Slovakia" } - //SL { "Sierra Leone" } - //SM { "San Marino" } - //SN { "Senegal" } - //SO { "Somalia" } - SR { "Surinam" } - ST { "Sao Tome og Principe" } - //SV { "El Salvador" } - //SY { "Syria" } - //SZ { "Swaziland" } - TC { "Turks- og Caicos\u00f8yene" } - TD { "Tchad" } - TF { "Franske s\u00f8romr\u00e5der" } - //TG { "Togo" } - //TH { "Thailand" } - TJ { "Tadsjikistan" } - //TK { "Tokelau" } - TL { "\u00d8st-Timor" } - //TM { "Turkmenistan" } - //TN { "Tunisia" } - //TO { "Tonga" } - TR { "Tyrkia" } - TT { "Trinidad og Tobago" } - //TV { "Tuvalu" } - //TW { "Taiwan" } - //TZ { "Tanzania" } - UA { "Ukraina" } - //UG { "Uganda" } - UM { "USAs mindre \u00f8yer" } - US { "USA" } - //UY { "Uruguay" } - UZ { "Usbekistan" } - VA { "Vatikanstaten" } - VC { "St. Vincent og Grenadinene" } - //VE { "Venezuela" } - VG { "Jomfru\u00f8yene (britisk)" } - VI { "Jomfru\u00f8yene (amerikansk)" } - //VN { "Vietnam" } - //VU { "Vanuatu" } - WF { "Wallis og Futuna" } - //WS { "Samoa" } - //YE { "Yemen" } - //YT { "Mayotte" } - YU { "Jugoslavia" } - ZA { "S\u00f8r-Afrika" } - //ZM { "Zambia" } - //ZW { "Zimbabwe" } - } - DateTimeElements:intvector { - 2, - 4, - } - DateTimePatterns { - "'kl. 'HH.mm.ss z", - "HH.mm.ss z", - "HH.mm.ss", - "HH.mm", - "EEEE d. MMMM yyyy", - "d. MMMM yyyy", - "d. MMM. yyyy", - "dd.MM.yy", - "{1} {0}", - } - DayAbbreviations { - "s\u00F8", - "ma", - "ti", - "on", - "to", - "fr", - "l\u00F8", +/** + * ICU source: ../../../locale/icu/main/nb.xml + */ +nb{ + Countries{ + AD{"Andorra"} + AE{"De forente arabiske emiratene"} + AF{"Afghanistan"} + AG{"Antigua og Barbuda"} + AI{"Anguilla"} + AL{"Albania"} + AM{"Armenia"} + AN{"De nederlandske antiller"} + AO{"Angola"} + AQ{"Antarktis"} + AR{"Argentina"} + AS{"Amerikansk Samoa"} + AT{"Østerrike"} + AU{"Australia"} + AW{"Aruba"} + AZ{"Aserbajdsjan"} + BA{"Bosnia og Hercegovina"} + BB{"Barbados"} + BD{"Bangladesh"} + BE{"Belgia"} + BF{"Burkina Faso"} + BG{"Bulgaria"} + BH{"Bahrain"} + BI{"Burundi"} + BJ{"Benin"} + BM{"Bermuda"} + BN{"Brunei Darussalam"} + BO{"Bolivia"} + BR{"Brasil"} + BS{"Bahamas"} + BT{"Bhutan"} + BV{"Bouvetøya"} + BW{"Botswana"} + BY{"Hviterussland"} + BZ{"Belize"} + CA{"Canada"} + CC{"Kokosøyene (Keelingøyene)"} + CD{"Kongo, Den demokratiske republikken"} + CF{"Den sentralafrikanske republikk"} + CG{"Kongo"} + CH{"Sveits"} + CI{"Elfenbenskysten"} + CK{"Cookøyene"} + CL{"Chile"} + CM{"Kamerun"} + CN{"Kina"} + CO{"Colombia"} + CR{"Costa Rica"} + CU{"Cuba"} + CV{"Kapp Verde"} + CX{"Christmasøya"} + CY{"Kypros"} + CZ{"Tsjekkia"} + DE{"Tyskland"} + DJ{"Djibouti"} + DK{"Danmark"} + DM{"Dominica"} + DO{"Den dominikanske republikk"} + DZ{"Algerie"} + EC{"Ecuador"} + EE{"Estland"} + EG{"Egypt"} + EH{"Vest-Sahara"} + ER{"Eritrea"} + ES{"Spania"} + ET{"Etiopia"} + FI{"Finland"} + FJ{"Fiji"} + FK{"Falklandsøyene (Malvinas)"} + FM{"Mikronesiaføderasjonen"} + FO{"Færøyene"} + FR{"Frankrike"} + GA{"Gabon"} + GB{"Storbritannia"} + GD{"Grenada"} + GE{"Georgia"} + GF{"Fransk Guyana"} + GH{"Ghana"} + GI{"Gibraltar"} + GL{"Grønland"} + GM{"Gambia"} + GN{"Guinea"} + GP{"Guadeloupe"} + GQ{"Ekvatorial-Guinea"} + GR{"Hellas"} + GS{"Sør-Georgia og Sør-Sandwich-øyene"} + GT{"Guatemala"} + GU{"Guam"} + GW{"Guinea-Bissau"} + GY{"Guyana"} + HK{"Hong Kong S.A.R. (Kina)"} + HM{"Heard- og McDonaldsøyene"} + HN{"Honduras"} + HR{"Kroatia"} + HT{"Haiti"} + HU{"Ungarn"} + ID{"Indonesia"} + IE{"Irland"} + IL{"Israel"} + IN{"India"} + IO{"Britiske områder i det indiske hav"} + IQ{"Irak"} + IR{"Iran"} + IS{"Island"} + IT{"Italia"} + JM{"Jamaica"} + JO{"Jordan"} + JP{"Japan"} + KE{"Kenya"} + KG{"Kirgisistan"} + KH{"Kambodsja"} + KI{"Kiribati"} + KM{"Komorene"} + KN{"St. Christopher og Nevis"} + KP{"Nord-Korea"} + KR{"Sør-Korea"} + KW{"Kuwait"} + KY{"Caymanøyene"} + KZ{"Kasakhstan"} + LA{"Laos, Den folkedemokratiske republikken"} + LB{"Libanon"} + LC{"St. Lucia"} + LI{"Liechtenstein"} + LK{"Sri Lanka"} + LR{"Liberia"} + LS{"Lesotho"} + LT{"Litauen"} + LU{"Luxembourg"} + LV{"Latvia"} + LY{"Libya"} + MA{"Marokko"} + MC{"Monaco"} + MD{"Moldova"} + MG{"Madagaskar"} + MH{"Marshalløyene"} + MK{"Makedonia, Republikken"} + ML{"Mali"} + MM{"Myanmar"} + MN{"Mongolia"} + MO{"Macao S.A.R. (Kina)"} + MP{"Nord-Marianene"} + MQ{"Martinique"} + MR{"Mauritania"} + MS{"Montserrat"} + MT{"Malta"} + MU{"Mauritius"} + MV{"Maldivene"} + MW{"Malawi"} + MX{"Mexico"} + MY{"Malaysia"} + MZ{"Mosambik"} + NA{"Namibia"} + NC{"Ny-Caledonia"} + NE{"Niger"} + NF{"Norfolkøyene"} + NG{"Nigeria"} + NI{"Nicaragua"} + NL{"Nederland"} + NO{"Norge"} + NP{"Nepal"} + NR{"Nauru"} + NU{"Niue"} + NZ{"New Zealand"} + OM{"Oman"} + PA{"Panama"} + PE{"Peru"} + PF{"Fransk Polynesia"} + PG{"Papua Ny-Guinea"} + PH{"Filippinene"} + PK{"Pakistan"} + PL{"Polen"} + PM{"St. Pierre og Miquelon"} + PN{"Pitcairn"} + PR{"Puerto Rico"} + PS{"Palestinsk territorium"} + PT{"Portugal"} + PW{"Palau"} + PY{"Paraguay"} + QA{"Qatar"} + RE{"Reunion"} + RO{"Romania"} + RU{"Den russiske føderasjon"} + RW{"Rwanda"} + SA{"Saudi Arabia"} + SB{"Salomonøyene"} + SC{"Seychellene"} + SD{"Sudan"} + SE{"Sverige"} + SG{"Singapore"} + SH{"Saint Helena"} + SI{"Slovenia"} + SJ{"Svalbard og Jan Mayen"} + SK{"Slovakia"} + SL{"Sierra Leone"} + SM{"San Marino"} + SN{"Senegal"} + SO{"Somalia"} + SP{"Serbia"} + SR{"Surinam"} + ST{"Sao Tome og Principe"} + SV{"El Salvador"} + SY{"Syria"} + SZ{"Swaziland"} + TC{"Turks- og Caicosøyene"} + TD{"Tchad"} + TF{"Franske sørområder"} + TG{"Togo"} + TH{"Thailand"} + TJ{"Tadsjikistan"} + TK{"Tokelau"} + TL{"Øst-Timor"} + TM{"Turkmenistan"} + TN{"Tunisia"} + TO{"Tonga"} + TR{"Tyrkia"} + TT{"Trinidad og Tobago"} + TV{"Tuvalu"} + TW{"Taiwan"} + TZ{"Tanzania"} + UA{"Ukraina"} + UG{"Uganda"} + UM{"USAs mindre øyer"} + US{"USA"} + UY{"Uruguay"} + UZ{"Usbekistan"} + VA{"Vatikanstaten"} + VC{"St. Vincent og Grenadinene"} + VE{"Venezuela"} + VG{"Jomfruøyene (britisk)"} + VI{"Jomfruøyene (USA)"} + VN{"Vietnam"} + VU{"Vanuatu"} + WF{"Wallis og Futuna"} + WS{"Samoa"} + YE{"Yemen"} + YT{"Mayotte"} + YU{"Jugoslavia"} + ZA{"Sør-Afrika"} + ZM{"Zambia"} + ZW{"Zimbabwe"} } - DayNames { - "s\u00F8ndag", - "mandag", - "tirsdag", - "onsdag", - "torsdag", - "fredag", - "l\u00F8rdag", + Currencies{ + ADD{ + "ADD", + "Andorranske dinarer", + } + ADP{ + "ADP", + "Andorranske pesetas", + } + AED{ + "AED", + "UAE dirham", + } + AFA{ + "AFA", + "Afghani (1927-2002)", + } + AFN{ + "Af", + "Afghani", + } + AIF{ + "AIF", + "Affar og Issa franc", + } + ALK{ + "ALK", + "Albanske lek (1946-1961)", + } + ALL{ + "lek", + "Albanske lek", + } + ALV{ + "ALV", + "Albanske lek valute", + } + ALX{ + "ALX", + "Albanske dollar (FEC)", + } + AMD{ + "dram", + "Armenske dram", + } + ANG{ + "NA f.", + "Nederlandske antillegylden", + } + AOA{ + "AOA", + "Angolanske kwanza", + } + AOK{ + "AOK", + "Angolanske kwanza (1977-1990)", + } + AON{ + "AON", + "Angolanske ny kwanza (1990-2000)", + } + AOR{ + "AOR", + "Angolan Kwanza Reajustado (1995-1999)", + } + AOS{ + "AOS", + "Angolanske escudo", + } + ARA{ + "ARA", + "Argentinske australer", + } + ARM{ + "ARM", + "Argentinske Peso Moneda Nacional", + } + ARP{ + "ARP", + "Argentinske pesos (1983-1985)", + } + ARS{ + "Arg$", + "Argentinske pesos", + } + ATS{ + "ATS", + "Østerrikske shilling", + } + AUD{ + "$A", + "Australske dollar", + } + AUP{ + "AUP", + "Australske pund", + } + AWG{ + "AWG", + "Arubiske gylden", + } + AZM{ + "AZM", + "Aserbajdsjanske Manat", + } + BAD{ + "BAD", + "Bosnia-Hercegovina dinarer", + } + BAM{ + "KM", + "Bosnia-Hercegovina mark (konvertible)", + } + BAN{ + "BAN", + "Bosnia-Hercegovina nye dinarer", + } + BBD{ + "BDS$", + "Barbadisk dollar", + } + BDT{ + "Tk", + "Bangladeshiske taka", + } + BEC{ + "BEC", + "Belgiske franc (konvertible)", + } + BEF{ + "BF", + "Belgiske franc", + } + BEL{ + "BEL", + "Belgiske franc (økonomiske)", + } + BGL{ + "lev", + "Bulgarske lev (hard)", + } + BGM{ + "BGM", + "Bulgarske sosialist-lev", + } + BGN{ + "BGN", + "Bulgarske lev", + } + BGO{ + "BGO", + "Bulgarske lev (1879-1952)", + } + BGX{ + "BGX", + "Bulgarske lev (FEC)", + } + BHD{ + "BD", + "Bahrainske dinarer", + } + BIF{ + "Fbu", + "Burundiske franc", + } + BMD{ + "Ber$", + "Bermudiske dollar", + } + BMP{ + "BMP", + "Bermudiske pund", + } + BND{ + "BND", + "Bruneiske dollar", + } + BOB{ + "Bs", + "Boliviano", + } + BOL{ + "BOL", + "Boliviano (1863-1962)", + } + BOP{ + "BOP", + "Boliviansk pesos", + } + BOV{ + "BOV", + "Boliviansk mvdol", + } + BRB{ + "BRB", + "Brasiliansk cruzeiro novo (1967-1986)", + } + BRC{ + "BRC", + "Brasilianske cruzado", + } + BRE{ + "BRE", + "Brasilianske cruzeiro (1990-1993)", + } + BRL{ + "R$", + "Brasilianske realer", + } + BRN{ + "BRN", + "Brasilianske cruzado novo", + } + BRR{ + "BRR", + "Brasilianske cruzeiro", + } + BRZ{ + "BRZ", + "Brasilianske cruzeiro (1942-1967)", + } + BSD{ + "BSD", + "Bahamske dollar", + } + BSP{ + "BSP", + "Bahamske pund", + } + BTN{ + "Nu", + "Bhutanske ngultrum", + } + BTR{ + "BTR", + "Bhutanske rupier", + } + BUK{ + "BUK", + "Burmesiske kyat", + } + BUR{ + "BUR", + "Burmesiske rupier", + } + BWP{ + "BWP", + "Botswanske pula", + } + BYB{ + "BYB", + "Hviterussiske nye rubler (1994-1999)", + } + BYL{ + "BYL", + "Hviterussiske rubler (1992-1994)", + } + BYR{ + "Rbl", + "Hviterussiske rubler", + } + BZD{ + "BZ$", + "Beliziske dollar", + } + BZH{ + "BZH", + "Britisk Honduras-dollar", + } + CAD{ + "Can$", + "Kanadiske dollar", + } + CDF{ + "CDF", + "Kongolesiske franc (congolais)", + } + CDG{ + "CDG", + "Kongolesiske republikk-franc", + } + CDL{ + "CDL", + "Congolesiske zaire", + } + CFF{ + "CFF", + "Sentralafrikanske franc (CFA)", + } + CHF{ + "SwF", + "Sveitsiske franc", + } + CKD{ + "CKD", + "Cookøyene dollar", + } + CLC{ + "CLC", + "Chilenske condor", + } + CLE{ + "CLE", + "Chilenske escudo", + } + CLF{ + "CLF", + "Chilenske Unidades de Fomento", + } + CLP{ + "Ch$", + "Chilenske pesos", + } + CMF{ + "CMF", + "Kamerunske franc (CFA)", + } + CNP{ + "CNP", + "Kinesiske Jen Min Piao Yuan", + } + CNX{ + "CNX", + "Kinesiske US dollar (FEC)", + } + CNY{ + "Y", + "Kinesiske Yuan Renminbi", + } + COB{ + "COB", + "Colombianske papir-pesos", + } + COF{ + "COF", + "Kongolesiske franc (CFA)", + } + COP{ + "Col$", + "Colombianske pesos", + } + CRC{ + "C", + "Costaricanske colon", + } + CSC{ + "CSC", + "Tsjekkoslovakiske koruna", + } + CSK{ + "CSK", + "Tsjekkoslovakiske koruna (hard)", + } + CUP{ + "CUP", + "Kubanske pesos", + } + CUX{ + "CUX", + "Kubanske Foreign Exchange Certificates", + } + CVE{ + "CVEsc", + "Kappverdiske escudo", + } + CWG{ + "CWG", + "Curacao-gylden", + } + CYP{ + "£C", + "Kypriotiske pund", + } + CZK{ + "CZK", + "Tsjekkiske koruna", + } + DDM{ + "DDM", + "Østtyske ostmark", + } + DEM{ + "DEM", + "Tyske mark", + } + DES{ + "DES", + "Tyske sperrmark", + } + DJF{ + "DF", + "Djiboutiske franc", + } + DKK{ + "DKr", + "Danske kroner", + } + DOP{ + "RD$", + "Dominikanske pesos", + } + DZD{ + "DA", + "Algeriske dinarer", + } + DZF{ + "DZF", + "Algeriske nye franc", + } + DZG{ + "DZG", + "Algeriske franc germinal", + } + ECS{ + "ECS", + "Ecuadorianske sucre", + } + ECV{ + "ECV", + "Ecuadorianske Unidad de Valor Constante (UVC)", + } + EEK{ + "EEK", + "Estiske kroon", + } + EGP{ + "EGP", + "Egyptiske pund", + } + ERN{ + "ERN", + "Eritreiske nakfa", + } + ESP{ + "ESP", + "Spanske peseta", + } + ETB{ + "Br", + "Etiopiske birr", + } + ETD{ + "ETD", + "Etiopiske dollar", + } + EUR{ + "€", + "Euro", + } + FIM{ + "FIM", + "Finske mark", + } + FIN{ + "FIN", + "Finske mark (1860-1962)", + } + FJD{ + "F$", + "Fijianske dollar", + } + FJP{ + "FJP", + "Fijianske pund", + } + FKP{ + "FKP", + "Falklandsøyene-pund", + } + FOK{ + "FOK", + "Færøyske kronur", + } + FRF{ + "FRF", + "Franske franc", + } + FRG{ + "FRG", + "Franske franc (Germinal/Franc Poincare)", + } + GAF{ + "GAF", + "Gabonske franc (CFA)", + } + GBP{ + "£", + "Britiske pund sterling", + } + GEK{ + "GEK", + "Georgiske kupon larit", + } + GEL{ + "lari", + "Georgiske lari", + } + GHC{ + "GHC", + "Ghanesiske cedi", + } + GHO{ + "GHO", + "Ghanesiske gamle cedi", + } + GHP{ + "GHP", + "Ghanesiske pund", + } + GHR{ + "GHR", + "Ghanesiske revaluerte cedi", + } + GIP{ + "GIP", + "Gibraltarske pund", + } + GLK{ + "GLK", + "Grønlandske kroner", + } + GMD{ + "GMD", + "Gambiske dalasi", + } + GMP{ + "GMP", + "Gambiske pund", + } + GNF{ + "GF", + "Guineanske franc", + } + GNI{ + "GNI", + "Guineanske franc (1960-1972)", + } + GNS{ + "GNS", + "Guineanske syli", + } + GPF{ + "GPF", + "Guadeloupe-franc", + } + GQE{ + "GQE", + "Ekvatorialguineanske ekwele guineana", + } + GQF{ + "GQF", + "Ekvatorialguineanske franco", + } + GQP{ + "GQP", + "Ekvatorialguineanske peseta guineana", + } + GRD{ + "GRD", + "Greske drakmer", + } + GRN{ + "GRN", + "Greske nye drakmer", + } + GTQ{ + "Q", + "Guatemalanske quetzal", + } + GUF{ + "GUF", + "Fransk Guyana-franc guiana", + } + GWE{ + "GWE", + "Portugisiske guinea escudo", + } + GWM{ + "GWM", + "Portugisiske Guinea Mil Reis", + } + GWP{ + "GWP", + "Guinea-Bissau-pesos", + } + GYD{ + "G$", + "Guyanske dollar", + } + HKD{ + "HK$", + "Hongkong-dollar", + } + HNL{ + "L", + "Hoduras Lempira", + } + HRD{ + "HRD", + "Kroatiske dinarer", + } + HRK{ + "HRK", + "Kroatiske kuna", + } + HTG{ + "HTG", + "Haitiske gourde", + } + HUF{ + "Ft", + "Ungarske forinter", + } + IBP{ + "IBP", + "Nordirske pund", + } + IDG{ + "IDG", + "Indonesiske nica-gylden", + } + IDJ{ + "IDJ", + "Indonesiske Java-rupier", + } + IDN{ + "IDN", + "Indonesiske nye rupier", + } + IDR{ + "Rp", + "Indonesiske rupier", + } + IEP{ + "IR£", + "Irske pund", + } + ILL{ + "ILL", + "Israelske shekler", + } + ILP{ + "ILP", + "Israelske pund", + } + ILS{ + "ILS", + "Israelske nye shekler", + } + IMP{ + "IMP", + "Manske pund sterling", + } + INR{ + "=0#Rs.|1#Re.|1 source: ../../../locale/icu/main/nl.xml + */ +nl{ + Countries{ + AD{"Andorra"} + AE{"Verenigde Arabische Emiraten"} + AF{"Afghanistan"} + AG{"Antigua en Barbuda"} + AI{"Anguilla"} + AL{"Albanië"} + AM{"Armenië"} + AN{"Nederlandse Antillen"} + AO{"Angola"} + AQ{"Antarctica"} + AR{"Argentinië"} + AS{"Amerikaans Samoa"} + AT{"Oostenrijk"} + AU{"Australië"} + AW{"Aruba"} + AZ{"Azerbeidzjan"} + BA{"Bosnië Herzegovina"} + BB{"Barbados"} + BD{"Bangladesh"} + BE{"België"} + BF{"Burkina Faso"} + BG{"Bulgarije"} + BH{"Bahrein"} + BI{"Burundi"} + BJ{"Benin"} + BM{"Bermuda"} + BN{"Brunei Darussalam"} + BO{"Bolivia"} + BR{"Brazilië"} + BS{"Bahama’s"} + BT{"Bhutan"} + BV{"Bouveteiland"} + BW{"Botswana"} + BY{"Wit-Rusland"} + BZ{"Belize"} + CA{"Canada"} + CC{"Cocoseilanden"} + CD{"Congo, Democratische Republiek"} + CF{"Centraal-Afrikaanse Republiek"} + CG{"Congo"} + CH{"Zwitserland"} + CI{"Ivoorkust"} + CK{"Cookeilanden"} + CL{"Chili"} + CM{"Kameroen"} + CN{"China"} + CO{"Colombia"} + CR{"Costa Rica"} + CU{"Cuba"} + CV{"Kaapverdië"} + CX{"Christmaseiland"} + CY{"Cyprus"} + CZ{"Tsjechië"} + DE{"Duitsland"} + DJ{"Djibouti"} + DK{"Denemarken"} + DM{"Dominica"} + DO{"Dominicaanse Republiek"} + DZ{"Algerije"} + EC{"Ecuador"} + EE{"Estland"} + EG{"Egypte"} + EH{"West-Sahara"} + ER{"Eritrea"} + ES{"Spanje"} + ET{"Ethiopië"} + FI{"Finland"} + FJ{"Fiji"} + FK{"Falklandeilanden"} + FM{"Micronesia, Federale Staten van"} + FO{"Faeröer"} + FR{"Frankrijk"} + GA{"Gabon"} + GB{"Verenigd Koninkrijk"} + GD{"Grenada"} + GE{"Georgië"} + GF{"Frans-Guyana"} + GH{"Ghana"} + GI{"Gibraltar"} + GL{"Groenland"} + GM{"Gambia"} + GN{"Guinea"} + GP{"Guadeloupe"} + GQ{"Equatoriaal-Guinea"} + GR{"Griekenland"} + GS{"Zuid-Georgië en Zuidelijke Sandwicheilanden"} + GT{"Guatemala"} + GU{"Guam"} + GW{"Guinee-Bissau"} + GY{"Guyana"} + HK{"Hongkong S.A.R. van China"} + HM{"Heardeiland en McDonaldeiland"} + HN{"Honduras"} + HR{"Kroatië"} + HT{"Haïti"} + HU{"Hongarije"} + ID{"Indonesië"} + IE{"Ierland"} + IL{"Israël"} + IN{"India"} + IO{"Brits Territorium in de Indische Oceaan"} + IQ{"Irak"} + IR{"Iran"} + IS{"IJsland"} + IT{"Italië"} + JM{"Jamaica"} + JO{"Jordanië"} + JP{"Japan"} + KE{"Kenia"} + KG{"Kirgizstan"} + KH{"Cambodja"} + KI{"Kiribati"} + KM{"Comoren"} + KN{"Saint Kitts en Nevis"} + KP{"Noord-Korea"} + KR{"Zuid-Korea"} + KW{"Koeweit"} + KY{"Caymaneilanden"} + KZ{"Kazachstan"} + LA{"Laos"} + LB{"Libanon"} + LC{"Saint Lucia"} + LI{"Liechtenstein"} + LK{"Sri Lanka"} + LR{"Liberia"} + LS{"Lesotho"} + LT{"Litouwen"} + LU{"Luxemburg"} + LV{"Letland"} + LY{"Libië"} + MA{"Marokko"} + MC{"Monaco"} + MD{"Republiek Moldavië"} + MG{"Madagaskar"} + MH{"Marshalleilanden"} + MK{"Macedonië, Republiek"} + ML{"Mali"} + MM{"Myanmar"} + MN{"Mongolië"} + MO{"Macao S.A.R. van China"} + MP{"Noordelijke Marianeneilanden"} + MQ{"Martinique"} + MR{"Mauritanië"} + MS{"Montserrat"} + MT{"Malta"} + MU{"Mauritius"} + MV{"Maldiven"} + MW{"Malawi"} + MX{"Mexico"} + MY{"Maleisië"} + MZ{"Mozambique"} + NA{"Namibië"} + NC{"Nieuw-Caledonië"} + NE{"Niger"} + NF{"Norfolkeiland"} + NG{"Nigeria"} + NI{"Nicaragua"} + NL{"Nederland"} + NO{"Noorwegen"} + NP{"Nepal"} + NR{"Nauru"} + NU{"Niue"} + NZ{"Nieuw-Zeeland"} + OM{"Oman"} + PA{"Panama"} + PE{"Peru"} + PF{"Frans-Polynesië"} + PG{"Papoea-Nieuw-Guinea"} + PH{"Filipijnen"} + PK{"Pakistan"} + PL{"Polen"} + PM{"Saint Pierre en Miquelon"} + PN{"Pitcairn"} + PR{"Puerto Rico"} + PS{"Palestijns Gebied"} + PT{"Portugal"} + PW{"Palau"} + PY{"Paraguay"} + QA{"Qatar"} + RE{"Réunion"} + RO{"Roemenië"} + RU{"Russische Federatie"} + RW{"Rwanda"} + SA{"Saoedi-Arabië"} + SB{"Salomonseilanden"} + SC{"Seychellen"} + SD{"Soedan"} + SE{"Zweden"} + SG{"Singapore"} + SH{"Saint Helena"} + SI{"Slovenië"} + SJ{"Svalbard en Jan Mayen"} + SK{"Slowakije"} + SL{"Sierra Leone"} + SM{"San Marino"} + SN{"Senegal"} + SO{"Somalië"} + SP{"Servië"} + SR{"Suriname"} + ST{"Sao Tomé en Principe"} + SV{"El Salvador"} + SY{"Syrië"} + SZ{"Swaziland"} + TC{"Turks- en Caicoseilanden"} + TD{"Tsjaad"} + TF{"Franse Gebieden in de zuidelijke Indische Oceaan"} + TG{"Togo"} + TH{"Thailand"} + TJ{"Tadzjikistan"} + TK{"Tokelau"} + TL{"Oost-Timor"} + TM{"Turkmenistan"} + TN{"Tunesië"} + TO{"Tonga"} + TR{"Turkije"} + TT{"Trinidad en Tobago"} + TV{"Tuvalu"} + TW{"Taiwan"} + TZ{"Tanzania"} + UA{"Oekraïne"} + UG{"Oeganda"} + UM{"Amerikaanse ondergeschikte afgelegen eilanden"} + US{"Verenigde Staten"} + UY{"Uruguay"} + UZ{"Oezbekistan"} + VA{"Vaticaanstad"} + VC{"Saint Vincent en de Grenadines"} + VE{"Venezuela"} + VG{"Britse Maagdeneilanden"} + VI{"Amerikaanse Maagdeneilanden"} + VN{"Vietnam"} + VU{"Vanuatu"} + WF{"Wallis en Futuna"} + WS{"Samoa"} + YE{"Jemen"} + YT{"Mayotte"} + YU{"Joegoslavië"} + ZA{"Zuid-Afrika"} + ZM{"Zambia"} + ZW{"Zimbabwe"} } - DayNames { - "zondag", - "maandag", - "dinsdag", - "woensdag", - "donderdag", - "vrijdag", - "zaterdag", + Currencies{ + ADD{ + "ADD", + "Andorrese diner", + } + ADP{ + "ADP", + "Andorrese peseta", + } + AED{ + "AED", + "Verenigde Arabische Emiraten-dirham", + } + AFA{ + "AFA", + "Afghani (1927-2002)", + } + AFN{ + "Af", + "Afghani", + } + AIF{ + "AIF", + "Affars en Issas-franc", + } + ALK{ + "ALK", + "Albanese lek (1946-1961)", + } + ALL{ + "lek", + "Albanese lek", + } + ALV{ + "ALV", + "Albanese lek valute", + } + ALX{ + "ALX", + "Albanese dollarwisselcertificaten", + } + AMD{ + "dram", + "Armeense dram", + } + ANG{ + "NA f.", + "Nederlands-Antilliaanse gulden", + } + AOA{ + "AOA", + "Angolese kwanza", + } + AOK{ + "AOK", + "Angolese kwanza (1977-1990)", + } + AON{ + "AON", + "Angolese nieuwe kwanza (1990-2000)", + } + AOR{ + "AOR", + "Angolese kwanza reajustado (1995-1999)", + } + AOS{ + "AOS", + "Angolese escudo", + } + ARA{ + "ARA", + "Argentijnse austral", + } + ARM{ + "ARM", + "Argentijnse peso moneda nacional", + } + ARP{ + "ARP", + "Argentijnse peso (1983-1985)", + } + ARS{ + "Arg$", + "Argentijnse peso", + } + ATS{ + "ATS", + "Oostenrijkse schilling", + } + AUD{ + "$A", + "Australische dollar", + } + AUP{ + "AUP", + "Australisch pond", + } + AWG{ + "AWG", + "Arubaanse gulden", + } + AZM{ + "AZM", + "Azerbeidzjaanse manat", + } + BAD{ + "BAD", + "Bosnische dinar", + } + BAM{ + "KM", + "Bosnische convertibele mark", + } + BAN{ + "BAN", + "Bosnische nieuwe dinar", + } + BBD{ + "BDS$", + "Barbadaanse dollar", + } + BDT{ + "Tk", + "Bengalese taka", + } + BEC{ + "BEC", + "Belgische frank (convertibel)", + } + BEF{ + "BF", + "Belgische frank", + } + BEL{ + "BEL", + "Belgische frank (financieel)", + } + BGL{ + "lev", + "Bulgaarse harde lev", + } + BGM{ + "BGM", + "Bulgaarse socialistische lev", + } + BGN{ + "BGN", + "Bulgaarse nieuwe lev", + } + BGO{ + "BGO", + "Bulgaarse lev (1879-1952)", + } + BGX{ + "BGX", + "Bulgaarse levwisselcertificaten", + } + BHD{ + "BD", + "Bahreinse dinar", + } + BIF{ + "Fbu", + "Burundese franc", + } + BMD{ + "Ber$", + "Bermuda-dollar", + } + BMP{ + "BMP", + "Bermuda-pond", + } + BND{ + "BND", + "Bruneise dollar", + } + BOB{ + "Bs", + "Boliviano", + } + BOL{ + "BOL", + "Boliviano (1863-1962)", + } + BOP{ + "BOP", + "Boliviaanse peso", + } + BOV{ + "BOV", + "Boliviaanse mvdol", + } + BRB{ + "BRB", + "Braziliaanse cruzeiro novo (1967-1986)", + } + BRC{ + "BRC", + "Braziliaanse cruzado", + } + BRE{ + "BRE", + "Braziliaanse cruzeiro (1990-1993)", + } + BRL{ + "R$", + "Braziliaanse real", + } + BRN{ + "BRN", + "Braziliaanse cruzado novo", + } + BRR{ + "BRR", + "Braziliaanse cruzeiro", + } + BRZ{ + "BRZ", + "Braziliaanse cruzeiro (1942-1967)", + } + BSD{ + "BSD", + "Bahamaanse dollar", + } + BSP{ + "BSP", + "Bahamaans pond", + } + BTN{ + "Nu", + "Bhutaanse ngultrum", + } + BTR{ + "BTR", + "Bhutaanse rupee", + } + BUK{ + "BUK", + "Birmese kyat", + } + BUR{ + "BUR", + "Birmese rupee", + } + BWP{ + "BWP", + "Botswaanse pula", + } + BYB{ + "BYB", + "Wit-Russische nieuwe roebel (1994-1999)", + } + BYL{ + "BYL", + "Wit-Russische roebel (1992-1994)", + } + BYR{ + "Rbl", + "Wit-Russische roebel", + } + BZD{ + "BZ$", + "Belizaanse dollar", + } + BZH{ + "BZH", + "Brits-Hondurese dollar", + } + CAD{ + "Can$", + "Canadese dollar", + } + CDF{ + "CDF", + "Congolese franc congolais", + } + CDG{ + "CDG", + "Congolese franc", + } + CDL{ + "CDL", + "Congolese zaïre", + } + CFF{ + "CFF", + "Centraal-Afrikaanse CFA-franc", + } + CHF{ + "SwF", + "Zwitserse franc", + } + CKD{ + "CKD", + "Cookeilandse dollar", + } + CLC{ + "CLC", + "Chileense condor", + } + CLE{ + "CLE", + "Chileense escudo", + } + CLF{ + "CLF", + "Chileense unidades de fomento", + } + CLP{ + "Ch$", + "Chileense peso", + } + CMF{ + "CMF", + "Kameroense CFA-franc", + } + CNP{ + "CNP", + "Chinese jen min piao yuan", + } + CNX{ + "CNX", + "Chinese Amerikaanse-dollarwisselcertificaten", + } + CNY{ + "Y", + "Chinese yuan renminbi", + } + COB{ + "COB", + "Colombiaanse papieren peso", + } + COF{ + "COF", + "Congolese CFA-franc", + } + COP{ + "Col$", + "Colombiaanse peso", + } + CRC{ + "C", + "Costaricaanse colón", + } + CSC{ + "CSC", + "Tsjechoslowaakse koruna", + } + CSK{ + "CSK", + "Tsjechoslowaakse harde koruna", + } + CUP{ + "CUP", + "Cubaanse peso", + } + CUX{ + "CUX", + "Cubaanse wisselcertificaten", + } + CVE{ + "CVEsc", + "Kaapverdische escudo", + } + CWG{ + "CWG", + "Curaçao-gulden", + } + CYP{ + "£C", + "Cyprisch pond", + } + CZK{ + "CZK", + "Tsjechische koruna", + } + DDM{ + "DDM", + "Oost-Duitse ostmark", + } + DEM{ + "DEM", + "Duitse mark", + } + DES{ + "DES", + "Duitse sperrmark", + } + DJF{ + "DF", + "Djiboutiaanse franc", + } + DKK{ + "DKr", + "Deense kroon", + } + DOP{ + "RD$", + "Dominicaanse peso", + } + DZD{ + "DA", + "Algerijnse dinar", + } + DZF{ + "DZF", + "Algerijnse nieuwe franc", + } + DZG{ + "DZG", + "Algerijnse franc germinal", + } + ECS{ + "ECS", + "Ecuadoraanse sucre", + } + ECV{ + "ECV", + "Ecuadoraanse unidad de valor constante (UVC)", + } + EEK{ + "EEK", + "Estlandse kroon", + } + EGP{ + "EGP", + "Egyptisch pond", + } + ERN{ + "ERN", + "Eritrese nakfa", + } + ESP{ + "ESP", + "Spaanse peseta", + } + ETB{ + "Br", + "Ethiopische birr", + } + ETD{ + "ETD", + "Ethiopische dollar", + } + EUR{ + "€", + "Euro", + } + FIM{ + "FIM", + "Finse markka", + } + FIN{ + "FIN", + "Finse markka (1860-1962)", + } + FJD{ + "F$", + "Fijische dollar", + } + FJP{ + "FJP", + "Fijisch pond", + } + FKP{ + "FKP", + "Falklandeilands pond", + } + FOK{ + "FOK", + "Faeröerse kroon", + } + FRF{ + "FRF", + "Franse franc", + } + FRG{ + "FRG", + "Franse franc germinal/franc poincare", + } + GAF{ + "GAF", + "Gabonese CFA-franc", + } + GBP{ + "£", + "Brits pond sterling", + } + GEK{ + "GEK", + "Georgische kupon larit", + } + GEL{ + "lari", + "Georgische lari", + } + GHC{ + "GHC", + "Ghanese cedi", + } + GHO{ + "GHO", + "Ghanese oude cedi", + } + GHP{ + "GHP", + "Ghanees pond", + } + GHR{ + "GHR", + "Ghanese hergewaardeerde cedi", + } + GIP{ + "GIP", + "Gibraltarees pond", + } + GLK{ + "GLK", + "Groenlandse kroon", + } + GMD{ + "GMD", + "Gambiaanse dalasi", + } + GMP{ + "GMP", + "Gambiaans pond", + } + GNF{ + "GF", + "Guinese franc", + } + GNI{ + "GNI", + "Guinese franc (1960-1972)", + } + GNS{ + "GNS", + "Guinese syli", + } + GPF{ + "GPF", + "Guadeloupse franc", + } + GQE{ + "GQE", + "Equatoriaal-Guinese ekwele guineana", + } + GQF{ + "GQF", + "Equatoriaal-Guinese franco", + } + GQP{ + "GQP", + "Equatoriaal-Guinese peseta puineana", + } + GRD{ + "GRD", + "Griekse drachme", + } + GRN{ + "GRN", + "Griekse nieuwe drachme", + } + GTQ{ + "Q", + "Guatemalteekse quetzal", + } + GUF{ + "GUF", + "Frans-Guyaanse franc guiana", + } + GWE{ + "GWE", + "Portuguees-Guinese escudo", + } + GWM{ + "GWM", + "Portuguees-Guinese mil reis", + } + GWP{ + "GWP", + "Guinee-Bissause peso", + } + GYD{ + "G$", + "Guyaanse dollar", + } + HKD{ + "HK$", + "Hongkongse dollar", + } + HNL{ + "L", + "Hodurese lempira", + } + HRD{ + "HRD", + "Kroatische dinar", + } + HRK{ + "HRK", + "Kroatische kuna", + } + HTG{ + "HTG", + "Haïtiaanse gourde", + } + HUF{ + "Ft", + "Hongaarse forint", + } + IBP{ + "IBP", + "Noord-Iers pond", + } + IDG{ + "IDG", + "Indonesische nica-gulden", + } + IDJ{ + "IDJ", + "Indonesische Java-rupiah", + } + IDN{ + "IDN", + "Indonesische nieuwe rupiah", + } + IDR{ + "Rp", + "Indonesische rupiah", + } + IEP{ + "IR£", + "Iers pond", + } + ILL{ + "ILL", + "Israëlische shekel", + } + ILP{ + "ILP", + "Israëlisch pond", + } + ILS{ + "ILS", + "Israëlische nieuwe shekel", + } + IMP{ + "IMP", + "Isle of Man pond sterling", + } + INR{ + "=0#Rs.|1#Re.|1>;\n" - "x.x: << komma >>;\n" - "(zero?); een; twee; drie; vier; vijf; zes; zeven; acht; negen;\n" - "tien; elf; twaalf; dertien; veertien; vijftien; zestien;\n" - "zeventien; achtien; negentien;\n" - "20: [>> en ]twintig;\n" - "30: [>> en ]dertig;\n" - "40: [>> en ]veertig;\n" - "50: [>> en ]vijftig;\n" - "60: [>> en ]zestig;\n" - "70: [>> en ]zeventig;\n" - "80: [>> en ]tachtig;\n" - "90: [>> en ]negentig;\n" - "100: << honderd[ >>];\n" - "1000: << duizend[ >>];\n" - "1,000,000: << miljoen[ >>];\n" - "1,000,000,000: << biljoen[ >>];\n" - "1,000,000,000,000: =#,##0=" - } - - // Currency display names - Currencies { - BEF { "BF", "BEF" } - NLG { "fl", "NLG" } } } diff --git a/icuSources/data/locales/nl_BE.txt b/icuSources/data/locales/nl_BE.txt index af955431..c0db6098 100644 --- a/icuSources/data/locales/nl_BE.txt +++ b/icuSources/data/locales/nl_BE.txt @@ -1,43 +1,36 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/nl_BE.xml // * // *************************************************************************** - -nl_BE { - Version{ "2.0" } - DateTimeElements:intvector { - 2, - 1, - } - DateTimePatterns { - "HH.mm' u. 'z", - "HH:mm:ss z", - "HH:mm:ss", - "HH:mm", - "EEEE d MMMM yyyy", - "d MMMM yyyy", - "d-MMM-yy", - "d/MM/yy", - "{1} {0}", - } - LocaleID:int { 0x0813 } -// LocaleString { "nl_BE" } - NumberPatterns { +nl_BE{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "#,##0.00 \u00A4;-#,##0.00 \u00A4", + "#,##0.00 ¤;-#,##0.00 ¤", "#,##0%", "#E0", } -// ShortCountry { "BEL" } -// zoneStrings { -// { -// "Africa/Casablanca", -// "GMT", -// "GMT", -// "GMT", -// "GMT", -// } -// } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 4, + } + DateTimePatterns{ + "HH.mm' u. 'z", + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm", + "EEEE d MMMM yyyy", + "d MMMM yyyy", + "d-MMM-yy", + "d/MM/yy", + "{1} {0}", + } + } + } } diff --git a/icuSources/data/locales/nl_BE_PREEURO.txt b/icuSources/data/locales/nl_BE_PREEURO.txt deleted file mode 100644 index 7cce8a13..00000000 --- a/icuSources/data/locales/nl_BE_PREEURO.txt +++ /dev/null @@ -1,10 +0,0 @@ -// *************************************************************************** -// * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -nl_BE_PREEURO { - Version { "2.0" } -} diff --git a/icuSources/data/locales/nl_NL.txt b/icuSources/data/locales/nl_NL.txt index 9194d545..4c30e78f 100644 --- a/icuSources/data/locales/nl_NL.txt +++ b/icuSources/data/locales/nl_NL.txt @@ -1,19 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/nl_NL.xml // * // *************************************************************************** - -nl_NL { - Version{ "2.0" } -// LocaleString { "nl_NL" } - NumberPatterns { +nl_NL{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "\u00A4 #,##0.00;\u00A4 #,##0.00-", + "¤ #,##0.00;¤ #,##0.00-", "#,##0%", "#E0", } -// ShortCountry { "NLD" } - LocaleID:int { 0x0413 } + Version{"1.2"} } diff --git a/icuSources/data/locales/nl_NL_PREEURO.txt b/icuSources/data/locales/nl_NL_PREEURO.txt deleted file mode 100644 index 808ab60f..00000000 --- a/icuSources/data/locales/nl_NL_PREEURO.txt +++ /dev/null @@ -1,10 +0,0 @@ -// *************************************************************************** -// * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -nl_NL_PREEURO { - Version { "2.0" } -} diff --git a/icuSources/data/locales/nn.txt b/icuSources/data/locales/nn.txt index 08146117..2098e420 100644 --- a/icuSources/data/locales/nn.txt +++ b/icuSources/data/locales/nn.txt @@ -1,126 +1,364 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/nn.xml // * // *************************************************************************** - +/** + * ICU source: ../../../locale/icu/main/nn.xml + */ nn{ - Version { "2.0" } - CollationElements { - Version { "1.0" } - Sequence { "& Z < \u00E6<<< \u00C6 < a\u0308<<< A\u0308< \u00F8<<< \u00D8" - " < o\u0308<<< O\u0308< o\u030B<<< O\u030B < a\u030A<<< A\u030A<<< aa <<< aA <<< Aa <<< AA & " - "V<<< w<<< W" } - } - Countries { - NO { "Noreg" } - } - DateTimeElements:intvector { - 2, - 4, + Countries{ + AD{"Andorra"} + AE{"De forente arabiske emiratene"} + AF{"Afghanistan"} + AG{"Antigua og Barbuda"} + AI{"Anguilla"} + AL{"Albania"} + AM{"Armenia"} + AN{"De nederlandske antiller"} + AO{"Angola"} + AQ{"Antarktis"} + AR{"Argentina"} + AS{"Amerikansk Samoa"} + AT{"Østerrike"} + AU{"Australia"} + AW{"Aruba"} + AZ{"Aserbajdsjan"} + BA{"Bosnia og Hercegovina"} + BB{"Barbados"} + BD{"Bangladesh"} + BE{"Belgia"} + BF{"Burkina Faso"} + BG{"Bulgaria"} + BH{"Bahrain"} + BI{"Burundi"} + BJ{"Benin"} + BM{"Bermuda"} + BN{"Brunei Darussalam"} + BO{"Bolivia"} + BR{"Brasil"} + BS{"Bahamas"} + BT{"Bhutan"} + BV{"Bouvetøya"} + BW{"Botswana"} + BY{"Hviterussland"} + BZ{"Belize"} + CA{"Canada"} + CC{"Kokosøyene (Keelingøyene)"} + CD{"Kongo, Den demokratiske republikken"} + CF{"Den sentralafrikanske republikk"} + CG{"Kongo"} + CH{"Sveits"} + CI{"Elfenbenskysten"} + CK{"Cookøyene"} + CL{"Chile"} + CM{"Kamerun"} + CN{"Kina"} + CO{"Colombia"} + CR{"Costa Rica"} + CU{"Cuba"} + CV{"Kapp Verde"} + CX{"Christmasøya"} + CY{"Kypros"} + CZ{"Tsjekkia"} + DE{"Tyskland"} + DJ{"Djibouti"} + DK{"Danmark"} + DM{"Dominica"} + DO{"Den dominikanske republikk"} + DZ{"Algerie"} + EC{"Ecuador"} + EE{"Estland"} + EG{"Egypt"} + EH{"Vest-Sahara"} + ER{"Eritrea"} + ES{"Spania"} + ET{"Etiopia"} + FI{"Finland"} + FJ{"Fiji"} + FK{"Falklandsøyene (Malvinas)"} + FM{"Mikronesiaføderasjonen"} + FO{"Færøyene"} + FR{"Frankrike"} + GA{"Gabon"} + GB{"Storbritannia"} + GD{"Grenada"} + GE{"Georgia"} + GF{"Fransk Guyana"} + GH{"Ghana"} + GI{"Gibraltar"} + GL{"Grønland"} + GM{"Gambia"} + GN{"Guinea"} + GP{"Guadeloupe"} + GQ{"Ekvatorial-Guinea"} + GR{"Hellas"} + GS{"Sør-Georgia og Sør-Sandwich-øyene"} + GT{"Guatemala"} + GU{"Guam"} + GW{"Guinea-Bissau"} + GY{"Guyana"} + HK{"Hong Kong S.A.R. (Kina)"} + HM{"Heard- og McDonaldsøyene"} + HN{"Honduras"} + HR{"Kroatia"} + HT{"Haiti"} + HU{"Ungarn"} + ID{"Indonesia"} + IE{"Irland"} + IL{"Israel"} + IN{"India"} + IO{"Britiske områder i det indiske hav"} + IQ{"Irak"} + IR{"Iran"} + IS{"Island"} + IT{"Italia"} + JM{"Jamaica"} + JO{"Jordan"} + JP{"Japan"} + KE{"Kenya"} + KG{"Kirgisistan"} + KH{"Kambodsja"} + KI{"Kiribati"} + KM{"Komorene"} + KN{"St. Christopher og Nevis"} + KP{"Nord-Korea"} + KR{"Sør-Korea"} + KW{"Kuwait"} + KY{"Caymanøyene"} + KZ{"Kasakhstan"} + LA{"Laos, Den folkedemokratiske republikken"} + LB{"Libanon"} + LC{"St. Lucia"} + LI{"Liechtenstein"} + LK{"Sri Lanka"} + LR{"Liberia"} + LS{"Lesotho"} + LT{"Litauen"} + LU{"Luxembourg"} + LV{"Latvia"} + LY{"Libya"} + MA{"Marokko"} + MC{"Monaco"} + MD{"Moldova"} + MG{"Madagaskar"} + MH{"Marshalløyene"} + MK{"Makedonia, Republikken"} + ML{"Mali"} + MM{"Myanmar"} + MN{"Mongolia"} + MO{"Macao S.A.R. (Kina)"} + MP{"Nord-Marianene"} + MQ{"Martinique"} + MR{"Mauritania"} + MS{"Montserrat"} + MT{"Malta"} + MU{"Mauritius"} + MV{"Maldivene"} + MW{"Malawi"} + MX{"Mexico"} + MY{"Malaysia"} + MZ{"Mosambik"} + NA{"Namibia"} + NC{"Ny-Caledonia"} + NE{"Niger"} + NF{"Norfolkøyene"} + NG{"Nigeria"} + NI{"Nicaragua"} + NL{"Nederland"} + NO{"Noreg"} + NP{"Nepal"} + NR{"Nauru"} + NU{"Niue"} + NZ{"New Zealand"} + OM{"Oman"} + PA{"Panama"} + PE{"Peru"} + PF{"Fransk Polynesia"} + PG{"Papua Ny-Guinea"} + PH{"Filippinene"} + PK{"Pakistan"} + PL{"Polen"} + PM{"St. Pierre og Miquelon"} + PN{"Pitcairn"} + PR{"Puerto Rico"} + PS{"Palestinsk territorium"} + PT{"Portugal"} + PW{"Palau"} + PY{"Paraguay"} + QA{"Qatar"} + RE{"Reunion"} + RO{"Romania"} + RU{"Den russiske føderasjon"} + RW{"Rwanda"} + SA{"Saudi Arabia"} + SB{"Salomonøyene"} + SC{"Seychellene"} + SD{"Sudan"} + SE{"Sverige"} + SG{"Singapore"} + SH{"Saint Helena"} + SI{"Slovenia"} + SJ{"Svalbard og Jan Mayen"} + SK{"Slovakia"} + SL{"Sierra Leone"} + SM{"San Marino"} + SN{"Senegal"} + SO{"Somalia"} + SP{"Serbia"} + SR{"Surinam"} + ST{"Sao Tome og Principe"} + SV{"El Salvador"} + SY{"Syria"} + SZ{"Swaziland"} + TC{"Turks- og Caicosøyene"} + TD{"Tchad"} + TF{"Franske sørområder"} + TG{"Togo"} + TH{"Thailand"} + TJ{"Tadsjikistan"} + TK{"Tokelau"} + TL{"Øst-Timor"} + TM{"Turkmenistan"} + TN{"Tunisia"} + TO{"Tonga"} + TR{"Tyrkia"} + TT{"Trinidad og Tobago"} + TV{"Tuvalu"} + TW{"Taiwan"} + TZ{"Tanzania"} + UA{"Ukraina"} + UG{"Uganda"} + UM{"USAs mindre øyer"} + US{"USA"} + UY{"Uruguay"} + UZ{"Usbekistan"} + VA{"Vatikanstaten"} + VC{"St. Vincent og Grenadinene"} + VE{"Venezuela"} + VG{"Jomfruøyene (britisk)"} + VI{"Jomfruøyene (USA)"} + VN{"Vietnam"} + VU{"Vanuatu"} + WF{"Wallis og Futuna"} + WS{"Samoa"} + YE{"Yemen"} + YT{"Mayotte"} + YU{"Jugoslavia"} + ZA{"Sør-Afrika"} + ZM{"Zambia"} + ZW{"Zimbabwe"} } - DateTimePatterns { - "'kl. 'HH.mm.ss z", - "HH.mm.ss z", - "HH.mm.ss", - "HH.mm", - "EEEE d. MMMM yyyy", - "d. MMMM yyyy", - "d. MMM. yyyy", - "dd.MM.yy", - "{1} {0}", - } - Languages { - nb { "bokm\u00E5l" } - nn { "nynorsk" } - no { "norsk" } + Currencies{ + NOK{ + "kr", + "NOK", + } } -// LocaleString { "nn" } - MonthAbbreviations { - "jan", - "feb", - "mar", - "apr", - "mai", - "jun", - "jul", - "aug", - "sep", - "okt", - "nov", - "des", + ExemplarCharacters{"[a-zæåøéóôàüǎ]"} + Languages{ + nb{"norsk bokmål"} + nn{"norsk nynorsk"} + no{"norsk"} } - MonthNames { - "januar", - "februar", - "mars", - "april", - "mai", - "juni", - "juli", - "august", - "september", - "oktober", - "november", - "desember", + LocaleScript{ + "Latn", } - NumberElements { + NumberElements{ ",", - "\u00A0", + " ", ";", "%", "0", "#", "-", "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", - } -// ShortLanguage { "nor" } - Eras { - "f.Kr.", - "e.Kr.", + "‰", + "∞", + "�", + "+", } - - zoneStrings { - { - "Europe/Oslo", - "Central European Time", - "MET", - "Central European Time (DST)", - "MET", - "Oslo" + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 4, + } + DateTimePatterns{ + "'kl. 'HH.mm.ss z", + "HH.mm.ss z", + "HH.mm.ss", + "HH.mm", + "EEEE d. MMMM yyyy", + "d. MMMM yyyy", + "d. MMM. yyyy", + "dd.MM.yy", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "su", + "må", + "ty", + "on", + "to", + "fr", + "la", + } + wide{ + "sundag", + "måndag", + "tysdag", + "onsdag", + "torsdag", + "fredag", + "laurdag", + } + } + } + eras{ + abbreviated{ + "f.Kr.", + "e.Kr.", + } + } + monthNames{ + format{ + abbreviated{ + "jan", + "feb", + "mar", + "apr", + "mai", + "jun", + "jul", + "aug", + "sep", + "okt", + "nov", + "des", + } + wide{ + "januar", + "februar", + "mars", + "april", + "mai", + "juni", + "juli", + "august", + "september", + "oktober", + "november", + "desember", + } + } + } } } - DayAbbreviations { - "su", - "m\u00E5", - "ty", - "on", - "to", - "fr", - "la", - } - DayNames { - "sundag", - "m\u00E5ndag", - "tysdag", - "onsdag", - "torsdag", - "fredag", - "laurdag", - } - ExemplarCharacters { "[a-z \u00e6 \u00e5 \u00f8 \u00e9 \u00f3 \u00f4 \u00e0 \u00fc \u01ce]" } - LocaleID:int { 0x814 } -// LocaleScript{ -// "Latn", // ISO 15924 Name -// } - - // Currency display names - Currencies { - NOK { "kr", "NOK" } - } } diff --git a/icuSources/data/locales/nn_NO.txt b/icuSources/data/locales/nn_NO.txt index 3d9a37a4..9ecf9a0a 100644 --- a/icuSources/data/locales/nn_NO.txt +++ b/icuSources/data/locales/nn_NO.txt @@ -1,19 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/nn_NO.xml // * // *************************************************************************** - -nn_NO { - Version{ "3.0"} - - NumberPatterns { +nn_NO{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "#,##0.00 \u00A4;-#,##0.00 \u00A4", - "#,##0 %", + "#,##0.00 ¤;-#,##0.00 ¤", + "#,##0%", "#E0", } -// ShortCountry { "NOR" } - LocaleID:int { 0x0814 } + Version{"1.2"} } diff --git a/icuSources/data/locales/no.txt b/icuSources/data/locales/no.txt index 26695c22..a5c9f534 100644 --- a/icuSources/data/locales/no.txt +++ b/icuSources/data/locales/no.txt @@ -1,10 +1,11 @@ -// ******************************************************************************* +// *************************************************************************** // * -// * Copyright (C) 1997-2000, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml // * -// ******************************************************************************* - -no { - "%%ALIAS" { "nb" } +// *************************************************************************** +no{ + "%%ALIAS"{"nb"} } diff --git a/icuSources/data/locales/no_NO.txt b/icuSources/data/locales/no_NO.txt index 69a1ae8d..454d1162 100644 --- a/icuSources/data/locales/no_NO.txt +++ b/icuSources/data/locales/no_NO.txt @@ -1,10 +1,11 @@ -// ******************************************************************************* +// *************************************************************************** // * -// * Copyright (C) 1997-2000, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml // * -// ******************************************************************************* - -no_NO { - "%%ALIAS" { "nb_NO" } +// *************************************************************************** +no_NO{ + "%%ALIAS"{"nb_NO"} } diff --git a/icuSources/data/locales/no_NO_NY.txt b/icuSources/data/locales/no_NO_NY.txt index 36796781..85ef60b0 100644 --- a/icuSources/data/locales/no_NO_NY.txt +++ b/icuSources/data/locales/no_NO_NY.txt @@ -1,10 +1,11 @@ -// ******************************************************************************* +// *************************************************************************** // * -// * Copyright (C) 1997-2000, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml // * -// ******************************************************************************* - -no_NO_NY { - "%%ALIAS" { "nn_NO" } +// *************************************************************************** +no_NO_NY{ + "%%ALIAS"{"nn_NO"} } diff --git a/icuSources/data/locales/om.txt b/icuSources/data/locales/om.txt index 710c08ca..98aba800 100644 --- a/icuSources/data/locales/om.txt +++ b/icuSources/data/locales/om.txt @@ -1,87 +1,99 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 2001-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/om.xml // * // *************************************************************************** -// * Oromo language locale. -// * Contributed by Daniel Yacob -// * -// * Oromo terms are provided by Mahdi Hamid Muudee of Sagalee Oromoo -// * Publishing Co. Inc and formatted in Posix format locale by Daniel Yacob of -// * the Ge'ez Frontier Foundation. The Oromo language terms used here -// * are those considered to be canonical in the Oromo language under -// * contemporary and progressive usage adopted by government bureaus -// * across the Oromo region. Regional synonyms naturally exist for many -// * of the month and day names. - +/** + * ICU source: ../../../locale/icu/main/om.xml + */ om{ - Version{ "2.0" } - DayAbbreviations { - "Dil", - "Wix", - "Qib", - "Rob", - "Kam", - "Jim", - "San", - } - DayNames { - "Dilbata", - "Wiixata", - "Qibxata", - "Roobii", - "Kamiisa", - "Jimaata", - "Sanbata", - } -// LanguageLibraryUse { "orm" } - MonthAbbreviations { - "Ama", - "Gur", - "Bit", - "Elb", - "Cam", - "Wax", - "Ado", - "Hag", - "Ful", - "Onk", - "Sad", - "Mud", - } - MonthNames { - "Amajjii", - "Guraandhala", - "Bitooteessa", - "Elba", - "Caamsa", - "Waxabajjii", - "Adooleessa", - "Hagayya", - "Fuulbana", - "Onkololeessa", - "Sadaasa", - "Muddee", - } - Eras { - "KD", // KD = Kiristoos Dura = Before Christ - "KB", // KB = Kiristoos Booda = After Christ + Countries{ + ET{"Itoophiyaa"} + KE{"Keeniyaa"} } - DateTimeElements:intvector { - 7, - 1, + Currencies{ + KES{ + "Ksh", + "KES", + } } - Languages { - om { "Oromoo" } + ExemplarCharacters{"[a-z]"} + Languages{ + om{"Oromoo"} } - Countries { - ET { "Itoophiyaa" } - KE { "Keeniyaa" } + LocaleScript{ + "Latn", } - - // Currency display names - Currencies { - KES { "Ksh", "KES" } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 7, + 1, + } + dayNames{ + format{ + abbreviated{ + "Dil", + "Wix", + "Qib", + "Rob", + "Kam", + "Jim", + "San", + } + wide{ + "Dilbata", + "Wiixata", + "Qibxata", + "Roobii", + "Kamiisa", + "Jimaata", + "Sanbata", + } + } + } + eras{ + abbreviated{ + "KD", + "KB", + } + } + monthNames{ + format{ + abbreviated{ + "Ama", + "Gur", + "Bit", + "Elb", + "Cam", + "Wax", + "Ado", + "Hag", + "Ful", + "Onk", + "Sad", + "Mud", + } + wide{ + "Amajjii", + "Guraandhala", + "Bitooteessa", + "Elba", + "Caamsa", + "Waxabajjii", + "Adooleessa", + "Hagayya", + "Fuulbana", + "Onkololeessa", + "Sadaasa", + "Muddee", + } + } + } + } } } diff --git a/icuSources/data/locales/om_ET.txt b/icuSources/data/locales/om_ET.txt index 9a38030e..b794da16 100644 --- a/icuSources/data/locales/om_ET.txt +++ b/icuSources/data/locales/om_ET.txt @@ -1,65 +1,46 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 2001-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/om_ET.xml // * // *************************************************************************** -// * Oromo language locale for Ethiopia. -// * Contributed by Daniel Yacob -// * -// * Oromo terms are provided by Mahdi Hamid Muudee of Sagalee Oromoo -// * Publishing Co. Inc and formatted in Posix format locale by Daniel Yacob of -// * the Ge'ez Frontier Foundation. The Oromo language terms used here -// * are those considered to be canonical in the Oromo language under -// * contemporary and progressive usage adopted by government bureaus -// * across the Oromo region. Regional synonyms naturally exist for many -// * of the month and day names. - -om_ET { - Version{ "2.0" } - AmPmMarkers { - "WD", // WD = Waaree Dura - "WB", // WD = Waaree Booda - } - DateTimePatterns { - "h:mm:ss a", - "h:mm:ss a", - "h:mm:ss a", - "h:mm a", - "EEEE, MMMM d, yyyy", - "dd MMMM yyyy", - "dd-MMM-yy", - "dd/MM/yy", - "{1} {0}", +om_ET{ + Currencies{ + ETB{ + "$", + "ETB", + } + USD{ + "US$", + "USD", + } } - // Measurement { "Metric" } -// NumberElements { -// ".", -// ",", -// ";", -// "%", -// "0", -// "#", -// "-", -// "E", -// "\u2030", -// "\u221E", -// "\uFFFD", -// } - NumberPatterns { + NumberPatterns{ "#,##0.###;-#,##0.###", - "\u00A4#,##0.00;-\u00A4#,##0.00", + "¤#,##0.00;-¤#,##0.00", "#,##0%", "#E0", } - // PaperSize { - // Height { "297" } - // Width { "210" } - // Units { "mm" } - // } - - // Currency display names - Currencies { - ETB { "$", "ETB" } + Version{"1.2"} + calendar{ + gregorian{ + AmPmMarkers{ + "WD", + "WB", + } + DateTimePatterns{ + "h:mm:ss a", + "h:mm:ss a", + "h:mm:ss a", + "h:mm a", + "EEEE, MMMM d, yyyy", + "dd MMMM yyyy", + "dd-MMM-yy", + "dd/MM/yy", + "{1} {0}", + } + } } } diff --git a/icuSources/data/locales/om_KE.txt b/icuSources/data/locales/om_KE.txt index 710c4657..3e5425c8 100644 --- a/icuSources/data/locales/om_KE.txt +++ b/icuSources/data/locales/om_KE.txt @@ -1,60 +1,36 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 2001-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/om_KE.xml // * // *************************************************************************** -// * Oromo language locale for Kenya. -// * Contributed by Daniel Yacob -// * -// * Oromo terms are provided by Mahdi Hamid Muudee of Sagalee Oromoo -// * Publishing Co. Inc and formatted in Posix format locale by Daniel Yacob of -// * the Ge'ez Frontier Foundation. The Oromo language terms used here -// * are those considered to be canonical in the Oromo language under -// * contemporary and progressive usage adopted by government bureaus -// * across the Oromo region. Regional synonyms naturally exist for many -// * of the month and day names. - -om_KE { - Version{ "2.0" } - AmPmMarkers { - "WD", // WD = Waaree Dura - "WB", // WD = Waaree Booda - } - DateTimePatterns { - "h:mm:ss a", - "h:mm:ss a", - "h:mm:ss a", - "h:mm a", - "EEEE, MMMM d, yyyy", - "dd MMMM yyyy", - "dd-MMM-yy", - "dd/MM/yy", - "{1} {0}", - } - // Measurement { "Metric" } -// NumberElements { -// ".", -// ",", -// ";", -// "%", -// "0", -// "#", -// "-", -// "E", -// "\u2030", -// "\u221E", -// "\uFFFD", -// } - NumberPatterns { +om_KE{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "\u00A4#,##0.00;-\u00A4#,##0.00", + "¤#,##0.00;-¤#,##0.00", "#,##0%", "#E0", } - // PaperSize { - // Height { "297" } - // Width { "210" } - // Units { "mm" } - // } + Version{"1.2"} + calendar{ + gregorian{ + AmPmMarkers{ + "WD", + "WB", + } + DateTimePatterns{ + "h:mm:ss a", + "h:mm:ss a", + "h:mm:ss a", + "h:mm a", + "EEEE, MMMM d, yyyy", + "dd MMMM yyyy", + "dd-MMM-yy", + "dd/MM/yy", + "{1} {0}", + } + } + } } diff --git a/icuSources/data/locales/or.txt b/icuSources/data/locales/or.txt new file mode 100644 index 00000000..01a5adc9 --- /dev/null +++ b/icuSources/data/locales/or.txt @@ -0,0 +1,85 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/or.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/or.xml + */ +or{ + Countries{ + IN{"ଭାରତ"} + } + ExemplarCharacters{"[ଁଂଃଅଆଇଈଉଊଋଌଏଐଓଔକଖଗଘଙଚଛଜଝଞଟଠଡଢଣତଥଦଧନପଫବଭମଯରଲଳଵଶଷସହ଼ଽାିୀୁୂୃେୈୋୌ୍ୖୗଡ଼ଢ଼ୟୠୡ୰ୱ]"} + Languages{ + or{"ଓଡ଼ିଆ"} + } + LocaleScript{ + "Orya", + } + NumberElements{ + ".", + ",", + ";", + "%", + "୦", + "#", + "-", + "E", + "‰", + "∞", + "�", + "+", + } + /** + * Draft + */ + Version{"1.0"} + calendar{ + gregorian{ + dayNames{ + format{ + abbreviated{ + "ରବି", + "ସୋମ", + "ମଙ୍ଗଳ", + "ବୁଧ", + "ଗୁରୁ", + "ଶୁକ୍ର", + "ଶନି", + } + wide{ + "ରବିବାର", + "ସୋମବାର", + "ମଙ୍ଗଳବାର", + "ବୁଧବାର", + "ଗୁରୁବାର", + "ଶୁକ୍ରବାର", + "ଶନିବାର", + } + } + } + monthNames{ + format{ + wide{ + "ଜାନୁଆରୀ", + "ଫେବ୍ରୁୟାରୀ", + "ମାର୍ଚ୍ଚ", + "ଅପ୍ରେଲ", + "ମେ", + "ଜୁନ", + "ଜୁଲାଇ", + "ଅଗଷ୍ଟ", + "ସେପ୍ଟେମ୍ବର", + "ଅକ୍ଟୋବର", + "ନଭେମ୍ବର", + "ଡିସେମ୍ବର", + } + } + } + } + } +} diff --git a/icuSources/data/locales/or_IN.txt b/icuSources/data/locales/or_IN.txt new file mode 100644 index 00000000..ebd83312 --- /dev/null +++ b/icuSources/data/locales/or_IN.txt @@ -0,0 +1,45 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/or_IN.xml +// * +// *************************************************************************** +or_IN{ + NumberPatterns{ + "##,##,##0.###;-##,##,##0.###", + "¤ ##,##,##0.00;-¤ ##,##,##0.00", + "##,##,##0%", + "#E0", + } + /** + * Draft + */ + Version{"1.0"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "h:mm:ss a z", + "h:mm:ss a z", + "h:mm:ss a", + "h:mm a", + "EEEE d MMMM yyyy", + "d MMMM yyyy", + "dd-MM-yyyy", + "dd-MM-yy", + "{1} {0}", + } + weekend:intvector{ + 1, + 0, + 1, + 86400000, + } + } + } +} diff --git a/icuSources/data/locales/pa.txt b/icuSources/data/locales/pa.txt new file mode 100644 index 00000000..dbe8b756 --- /dev/null +++ b/icuSources/data/locales/pa.txt @@ -0,0 +1,112 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/pa.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/pa.xml + */ +pa{ + Countries{ + IN{"ਭਾਰਤ"} + } + Currencies{ + INR{ + "ਰੁ.", + "ਰੁਪਿਯ", + } + } + ExemplarCharacters{"[ਂ-ਃਅ-ਊਏ-ਐਓ-ਨਪ-ਰਲ-ਲ਼ਵ-ਸ਼ਸ-ਹ਼ਾ-ੂੇ-ੈੋ-੍ਖ਼-ੜਫ਼ੰ-ੴ]"} + Languages{ + pa{"ਪੰਜਾਬੀ"} + } + LocaleScript{ + "Guru", + } + NumberElements{ + ".", + ",", + ";", + "%", + "੦", + "#", + "-", + "E", + "‰", + "∞", + "�", + "+", + } + NumberPatterns{ + "##,##,##0.###;-##,##,##0.###", + "¤ ##,##,##0.00;-¤ ##,##,##0.00", + "##,##,##0%", + "#E0", + } + Version{"1.2"} + calendar{ + gregorian{ + AmPmMarkers{ + "ਸਵੇਰੇ", + "ਸ਼ਾਮ", + } + dayNames{ + format{ + abbreviated{ + "ਐਤ.", + "ਸੋਮ.", + "ਮੰਗਲ.", + "ਬੁਧ.", + "ਵੀਰ.", + "ਸ਼ੁਕਰ.", + "ਸ਼ਨੀ.", + } + wide{ + "ਐਤਵਾਰ", + "ਸੋਮਵਾਰ", + "ਮੰਗਲਵਾਰ", + "ਬੁਧਵਾਰ", + "ਵੀਰਵਾਰ", + "ਸ਼ੁੱਕਰਵਾਰ", + "ਸ਼ਨੀਚਰਵਾਰ", + } + } + } + monthNames{ + format{ + abbreviated{ + "ਜਨਵਰੀ", + "ਫ਼ਰਵਰੀ", + "ਮਾਰਚ", + "ਅਪ੍ਰੈਲ", + "ਮਈ", + "ਜੂਨ", + "ਜੁਲਾਈ", + "ਅਗਸਤ", + "ਸਤੰਬਰ", + "ਅਕਤੂਬਰ", + "ਨਵੰਬਰ", + "ਦਸੰਬਰ", + } + wide{ + "ਜਨਵਰੀ", + "ਫ਼ਰਵਰੀ", + "ਮਾਰਚ", + "ਅਪ੍ਰੈਲ", + "ਮਈ", + "ਜੂਨ", + "ਜੁਲਾਈ", + "ਅਗਸਤ", + "ਸਤੰਬਰ", + "ਅਕਤੂਬਰ", + "ਨਵੰਬਰ", + "ਦਸੰਬਰ", + } + } + } + } + } +} diff --git a/icuSources/data/locales/pa_IN.txt b/icuSources/data/locales/pa_IN.txt new file mode 100644 index 00000000..0bbaa539 --- /dev/null +++ b/icuSources/data/locales/pa_IN.txt @@ -0,0 +1,42 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/pa_IN.xml +// * +// *************************************************************************** +pa_IN{ + NumberPatterns{ + "##,##,##0.###;-##,##,##0.###", + "¤##,##,##0.00;-¤##,##,##0.00", + "##,##,##0%", + "#E0", + } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "hh:mm:ss a z", + "hh:mm:ss a z", + "hh:mm:ss a", + "hh:mm a", + "EEEE d MMMM yyyy", + "d MMMM yyyy", + "dd-MM-yyyy", + "d-M-yy", + "{1} {0}", + } + weekend:intvector{ + 1, + 0, + 1, + 86400000, + } + } + } +} diff --git a/icuSources/data/locales/pl.txt b/icuSources/data/locales/pl.txt index 3fc5f358..c392e0ac 100644 --- a/icuSources/data/locales/pl.txt +++ b/icuSources/data/locales/pl.txt @@ -1,127 +1,1954 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/pl.xml // * // *************************************************************************** - -pl { - Version{ "2.0" } - CollationElements { - Version { "2" } - Sequence { "&A < a\u0328 <<< A\u0328" - "&C < c\u0301 <<< C\u0301" - "&E < e\u0328 <<< E\u0328" - "&L < \u0142 <<< \u0141" - "&N < n\u0301 <<< N\u0301" - "&O < o\u0301 <<< O\u0301" - "&S < s\u0301 <<< S\u0301" - "&Z < z\u0301 <<< Z\u0301 < z\u0307 <<< Z\u0307" } - } - Countries { - PL { "Polska" } - } - DateTimeElements:intvector { - 2, - 1, - } - DateTimePatterns { - "HH:mm:ss z", - "HH:mm:ss z", - "HH:mm:ss", - "HH:mm", - "EEEE, d MMMM yyyy", - "d MMMM yyyy", - "yyyy-MM-dd", - "yy-MM-dd", - "{1} {0}", +/** + * ICU source: ../../../locale/icu/main/pl.xml + */ +pl{ + Countries{ + AD{"Andora"} + AE{"Zjednoczone Emiraty Arabskie"} + AF{"Afganistan"} + AG{"Antigua i Barbuda"} + AI{"Anguilla"} + AL{"Albania"} + AM{"Armenia"} + AN{"Antyle Holenderskie"} + AO{"Angola"} + AQ{"Antarktyka"} + AR{"Argentyna"} + AS{"Samoa Amerykańskie"} + AT{"Austria"} + AU{"Australia"} + AW{"Aruba"} + AZ{"Azerbejdżan"} + BA{"Bośnia i Hercegowina"} + BB{"Barbados"} + BD{"Bangladesz"} + BE{"Belgia"} + BF{"Burkina Faso"} + BG{"Bułgaria"} + BH{"Bahrajn"} + BI{"Burundi"} + BJ{"Benin"} + BM{"Bermudy"} + BN{"Brunei Darussalam"} + BO{"Boliwia"} + BR{"Brazylia"} + BS{"Bahamy"} + BT{"Bhutan"} + BV{"Wyspa Bouveta"} + BW{"Botswana"} + BY{"Białoruś"} + BZ{"Belize"} + CA{"Kanada"} + CC{"Wyspy Kokosowe (Keelinga)"} + CD{"Kongo, Republika Demokratyczna"} + CF{"Republika Środkowej Afryki"} + CG{"Kongo"} + CH{"Szwajcaria"} + CI{"Wybrzeże Kości Słoniowej"} + CK{"Wyspy Cooka"} + CL{"Chile"} + CM{"Kamerun"} + CN{"Chiny"} + CO{"Kolumbia"} + CR{"Kostaryka"} + CU{"Kuba"} + CV{"Wyspy Zielonego Przylądka"} + CX{"Wyspa Bożego Narodzenia"} + CY{"Cypr"} + CZ{"Republika Czeska"} + DE{"Niemcy"} + DJ{"Dżibuti"} + DK{"Dania"} + DM{"Dominika"} + DO{"Republika Dominikańska"} + DZ{"Algieria"} + EC{"Ekwador"} + EE{"Estonia"} + EG{"Egipt"} + EH{"Sahara Zachodnia"} + ER{"Erytrea"} + ES{"Hiszpania"} + ET{"Etiopia"} + FI{"Finlandia"} + FJ{"Fidżi"} + FK{"Falklandy (Malwiny)"} + FM{"Mikronezja, Stany Sfederowane"} + FO{"Wyspy Owcze"} + FR{"Francja"} + GA{"Gabon"} + GB{"Wielka Brytania"} + GD{"Grenada"} + GE{"Gruzja"} + GF{"Gujana Francuska"} + GH{"Ghana"} + GI{"Gibraltar"} + GL{"Grenlandia"} + GM{"Gambia"} + GN{"Gwinea"} + GP{"Gwadelupa"} + GQ{"Gwinea Równikowa"} + GR{"Grecja"} + GS{"Wyspy Georgia Południowa i Sandwich Południowy"} + GT{"Gwatemala"} + GU{"Guam"} + GW{"Gwinea Bissau"} + GY{"Gujana"} + HK{"Hongkong, Specjalny Region Administracyjny Chin"} + HM{"Wyspy Heard i McDonald"} + HN{"Honduras"} + HR{"Chorwacja"} + HT{"Haiti"} + HU{"Węgry"} + ID{"Indonezja"} + IE{"Irlandia"} + IL{"Izrael"} + IN{"Indie"} + IO{"Terytorium Brytyjskie Oceanu Indyjskiego"} + IQ{"Irak"} + IR{"Iran"} + IS{"Islandia"} + IT{"Włochy"} + JM{"Jamajka"} + JO{"Jordania"} + JP{"Japonia"} + KE{"Kenia"} + KG{"Kirgistan"} + KH{"Kambodża"} + KI{"Kiribati"} + KM{"Komory"} + KN{"Saint Kitts i Nevis"} + KP{"Korea Północna"} + KR{"Korea Południowa"} + KW{"Kuwejt"} + KY{"Kajmany"} + KZ{"Kazachstan"} + LA{"Laos (Demokratyczna Republika Ludowa)"} + LB{"Liban"} + LC{"Saint Lucia"} + LI{"Liechtenstein"} + LK{"Sri Lanka"} + LR{"Liberia"} + LS{"Lesotho"} + LT{"Litwa"} + LU{"Luksemburg"} + LV{"Łotwa"} + LY{"Libijska"} + MA{"Maroko"} + MC{"Monako"} + MD{"Mołdawia, Republika"} + MG{"Madagaskar"} + MH{"Wyspy Marshalla"} + MK{"Macedonia, Republika"} + ML{"Mali"} + MM{"Birma"} + MN{"Mongolia"} + MO{"Makau, Specjalny Region Administracyjny Chin"} + MP{"Wspólnota Marianów Północnych"} + MQ{"Martynika"} + MR{"Mauretania"} + MS{"Montserrat"} + MT{"Malta"} + MU{"Mauritius"} + MV{"Malediwy"} + MW{"Malawi"} + MX{"Meksyk"} + MY{"Malezja"} + MZ{"Mozambik"} + NA{"Namibia"} + NC{"Nowa Kaledonia"} + NE{"Niger"} + NF{"Wyspa Norfolk"} + NG{"Nigeria"} + NI{"Nikaragua"} + NL{"Holandia"} + NO{"Norwegia"} + NP{"Nepal"} + NR{"Nauru"} + NU{"Niue"} + NZ{"Nowa Zelandia"} + OM{"Oman"} + PA{"Panama"} + PE{"Peru"} + PF{"Polinezja Francuska"} + PG{"Papua Nowa Gwinea"} + PH{"Filipiny"} + PK{"Pakistan"} + PL{"Polska"} + PM{"St. Pierre i Miquelon"} + PN{"Pitcairn"} + PR{"Puerto Rico"} + PS{"Terytoria Palestyńskie"} + PT{"Portugalia"} + PW{"Palau"} + PY{"Paragwaj"} + QA{"Katar"} + RE{"Reunion"} + RO{"Rumunia"} + RU{"Federacja Rosyjska"} + RW{"Rwanda"} + SA{"Arabia Saudyjska"} + SB{"Wyspy Salomona"} + SC{"Seszele"} + SD{"Sudan"} + SE{"Szwecja"} + SG{"Singapur"} + SH{"Wyspa Świętej Heleny"} + SI{"Słowenia"} + SJ{"Svalbard i Wyspy Jan Mayen"} + SK{"Słowacja"} + SL{"Sierra Leone"} + SM{"San Marino"} + SN{"Senegal"} + SO{"Somalia"} + SP{"Serbia"} + SR{"Surinam"} + ST{"Wyspy Świętego Tomasza i Książęca"} + SV{"Salwador"} + SY{"Syria"} + SZ{"Suazi"} + TC{"Turks i Caicos"} + TD{"Czad"} + TF{"Francuskie Terytoria Południowe"} + TG{"Togo"} + TH{"Tajlandia"} + TJ{"Tadżykistan"} + TK{"Tokelau"} + TL{"Timor Wschodni"} + TM{"Turkmenia"} + TN{"Tunezja"} + TO{"Tonga"} + TR{"Turcja"} + TT{"Trinidad i Tobago"} + TV{"Tuvalu"} + TW{"Tajwan"} + TZ{"Tanzania"} + UA{"Ukraina"} + UG{"Uganda"} + UM{"United States Minor Outlying Islands"} + US{"Stany Zjednoczone"} + UY{"Urugwaj"} + UZ{"Uzbekistan"} + VA{"Stolica Apostolska (Państwo Watykańskie)"} + VC{"Saint Vincent and the Grenadines"} + VE{"Wenezuela"} + VG{"Brytyjskie Wyspy Dziewicze"} + VI{"Wyspy Dziewicze, Stanów Zjednoczonych"} + VN{"Wietnam"} + VU{"Vanuatu"} + WF{"Wallis i Futuna"} + WS{"Samoa"} + YE{"Jemen"} + YT{"Majotta"} + YU{"Jugosławia"} + ZA{"Afryka Południowa"} + ZM{"Zambia"} + ZW{"Zimbabwe"} } - DayAbbreviations { - "N", - "Pn", - "Wt", - "\u015Ar", - "Cz", - "Pt", - "So", - } - DayNames { - "niedziela", - "poniedzia\u0142ek", - "wtorek", - "\u015Broda", - "czwartek", - "pi\u0105tek", - "sobota", - } - Eras { - "p.n.e.", - "n.e.", + Currencies{ + ADD{ + "ADD", + "diner andorski", + } + ADP{ + "ADP", + "peseta andorska", + } + AED{ + "AED", + "dirham ZEA", + } + AFA{ + "AFA", + "afgani (1927-2002)", + } + AFN{ + "Af", + "afgani", + } + AIF{ + "AIF", + "frank Affars and Issas Franc", + } + ALK{ + "ALK", + "lek albański (1946-1961)", + } + ALL{ + "lek", + "lek albański", + } + ALV{ + "ALV", + "lek waluta albańska", + } + ALX{ + "ALX", + "dolar albański dewizowy dla transakcji zagranicznych", + } + AMD{ + "dram", + "dram armeński", + } + ANG{ + "NA f.", + "gulden Antyle Holenderskie", + } + AOA{ + "AOA", + "kwanza angolańska", + } + AOK{ + "AOK", + "kwanza angolańska (1977-1990)", + } + AON{ + "AON", + "nowa kwanza angolańska (1990-2000)", + } + AOR{ + "AOR", + "kwanza angolańska Reajustado (1995-1999)", + } + AOS{ + "AOS", + "escudo angolańskie", + } + ARA{ + "ARA", + "austral argentyński", + } + ARM{ + "ARM", + "peso argentyńskie Moneda Nacional", + } + ARP{ + "ARP", + "peso argentyńskie (1983-1985)", + } + ARS{ + "Arg$", + "peso argentyńskie", + } + ATS{ + "ATS", + "szyling austriacki ", + } + AUD{ + "$A", + "dolar australijski", + } + AUP{ + "AUP", + "funt australijski", + } + AWG{ + "AWG", + "gulden arubski", + } + AZM{ + "AZM", + "manat azerbejdżański", + } + BAD{ + "BAD", + "dinar Bośni i Hercegowiny", + } + BAM{ + "KM", + "marka konwertybilna Bośni i Hercegowiny", + } + BAN{ + "BAN", + "nowy dinar Bośni i Hercegowinyr", + } + BBD{ + "BDS$", + "dolar Barbadosu", + } + BDT{ + "Tk", + "taka bengalska", + } + BEC{ + "BEC", + "frank belgijski (zamienny)", + } + BEF{ + "BF", + "frank belgijski", + } + BEL{ + "BEL", + "frank belgijski (finansowy)", + } + BHD{ + "BD", + "dinar bahrański", + } + BIF{ + "Fbu", + "frank burundyjski", + } + BMD{ + "Ber$", + "dolar bermudzki", + } + BMP{ + "BMP", + "funt bermudzki", + } + BND{ + "BND", + "dolar brunejski", + } + BOB{ + "Bs", + "boliviano", + } + BOL{ + "BOL", + "boliviano (1863-1962)", + } + BOP{ + "BOP", + "peso boliwijskie", + } + BOV{ + "BOV", + "mvdol boliwijski", + } + BRB{ + "BRB", + "cruzeiro novo brazylijskie (1967-1986)", + } + BRC{ + "BRC", + "cruzado brazylijskie", + } + BRE{ + "BRE", + "cruzeiro brazylijskie(1990-1993)", + } + BRL{ + "R$", + "real brazylijski", + } + BRN{ + "BRN", + "cruzado brazylijskie", + } + BRR{ + "BRR", + "cruzeiro brazylijskie", + } + BRZ{ + "BRZ", + "cruzeiro brazylijskie (1942-1967)", + } + BSD{ + "BSD", + "dolar bahamski", + } + BSP{ + "BSP", + "funt bahamski", + } + BTN{ + "Nu", + "ngultrum Bhutan", + } + BTR{ + "BTR", + "rupia Bhutan", + } + BUK{ + "BUK", + "kyat birmański", + } + BUR{ + "BUR", + "rupia birmańska", + } + BWP{ + "BWP", + "pula", + } + BYB{ + "BYB", + "rubel białoruski (1994-1999)", + } + BYL{ + "BYL", + "rubel białoruski (1992-1994)", + } + BYR{ + "Rbl", + "rubel białoruski", + } + BZD{ + "BZ$", + "dolar belizeński", + } + BZH{ + "BZH", + "dolar Hondurasu Brytyjskiego", + } + CAD{ + "Can$", + "dolar kanadyjski", + } + CDF{ + "CDF", + "frank kongijski", + } + CDG{ + "CDG", + "frank Republiki Konga", + } + CDL{ + "CDL", + "zair kongijski", + } + CFF{ + "CFF", + "frank CFA Republiki Środkowoafrykańskiej", + } + CHF{ + "SwF", + "frank szwajcarski", + } + CKD{ + "CKD", + "dolar Wysp Cooka", + } + CLC{ + "CLC", + "condor chilijski", + } + CLE{ + "CLE", + "escudo chilijskie", + } + CLP{ + "Ch$", + "peso chilijskie", + } + CMF{ + "CMF", + "frank CFA Kamerunu", + } + CNP{ + "CNP", + "Jen Min Piao juan Jen Min Piao chiński", + } + CNX{ + "CNX", + "dolar chiński dla transakcji zagranicznych", + } + CNY{ + "Y", + "juan renminbi", + } + COB{ + "COB", + "peso kolumbijskie papierowe", + } + COF{ + "COF", + "frank CFA Konga", + } + COP{ + "Col$", + "peso kolumbijskie", + } + CRC{ + "C", + "colon kostarykański", + } + CSC{ + "CSC", + "korona czechosłowacka", + } + CSK{ + "CSK", + "korona czechosłowacka", + } + CUP{ + "CUP", + "peso kubańskie", + } + CUX{ + "CUX", + "certyfikaty kubańskie dla transakcji zagranicznych", + } + CVE{ + "CVEsc", + "escudo Zielonego Przylądka", + } + CWG{ + "CWG", + "gulden Curacao", + } + CYP{ + "£C", + "funt cypryjski", + } + CZK{ + "CZK", + "korona czeska", + } + DDM{ + "DDM", + "wschodnia marka wschodnioniemiecka", + } + DEM{ + "DEM", + "marka niemiecka", + } + DJF{ + "DF", + "frank Dżibuti", + } + DKK{ + "DKr", + "korona duńska", + } + DOP{ + "RD$", + "peso dominikańskie", + } + DZD{ + "DA", + "dinar algierski", + } + DZF{ + "DZF", + "nowy frank algierski", + } + ECS{ + "ECS", + "sucre ekwadorski", + } + EEK{ + "EEK", + "korona estońska", + } + EGP{ + "EGP", + "funt egipski", + } + ERN{ + "ERN", + "nakfa erytrejska", + } + ESP{ + "ESP", + "peseta hiszpańska", + } + ETB{ + "Br", + "birr etiopski", + } + ETD{ + "ETD", + "dolar etiopski", + } + EUR{ + "€", + "euro", + } + FIM{ + "FIM", + "marka fińska", + } + FIN{ + "FIN", + "marka fińska (1860-1962)", + } + FJD{ + "F$", + "dolar fidżijski", + } + FJP{ + "FJP", + "funt fidżijski", + } + FKP{ + "FKP", + "funt Wysp Falklandzkich", + } + FOK{ + "FOK", + "korona Wysp Owczych", + } + FRF{ + "FRF", + "frank francuski ", + } + GAF{ + "GAF", + "frank CFA Gabonu", + } + GBP{ + "£", + "funt szterling", + } + GEK{ + "GEK", + "Larit gruziński kupon", + } + GEL{ + "lari", + "lari gruzińskie", + } + GHC{ + "GHC", + "cedi ghańskie", + } + GHO{ + "GHO", + "stare cedi ghańskie", + } + GHP{ + "GHP", + "funt ghański", + } + GHR{ + "GHR", + "cedi zrewaloryzowane ghańskie", + } + GIP{ + "GIP", + "funt gibraltarski", + } + GLK{ + "GLK", + "korona grenlandzka", + } + GMD{ + "GMD", + "dalasi gambijskie", + } + GMP{ + "GMP", + "funt gambijski", + } + GNF{ + "GF", + "frank gwinejski", + } + GNI{ + "GNI", + "frank gwinejski (1960-1972)", + } + GNS{ + "GNS", + "syli gwinejskie", + } + GPF{ + "GPF", + "frank Gwadelupy", + } + GQE{ + "GQE", + "ekwele gwinejskie Gwinei Równikowej", + } + GQF{ + "GQF", + "frank Gwinei Równikowej", + } + GQP{ + "GQP", + "peseta gujańska Gwinei Równikowej", + } + GRD{ + "GRD", + "drachma grecka", + } + GRN{ + "GRN", + "nowa drachma grecka", + } + GTQ{ + "Q", + "quetzal gwatemalski", + } + GWE{ + "GWE", + "escudo Gwinea Portugalska", + } + GWP{ + "GWP", + "peso Guinea-Bissau", + } + GYD{ + "G$", + "dolar gujański", + } + HKD{ + "HK$", + "dolar hongkoński", + } + HNL{ + "L", + "lempira Hondurasu", + } + HRD{ + "HRD", + "dinar chorwacki", + } + HRK{ + "HRK", + "kuna chorwacka", + } + HTG{ + "HTG", + "gourde haitańskie", + } + HUF{ + "Ft", + "forint węgierski ", + } + IBP{ + "IBP", + "fund północnoirlandzki", + } + IDG{ + "IDG", + "gulden indonezyjski Nica", + } + IDJ{ + "IDJ", + "rupia indonezyjska Java", + } + IDN{ + "IDN", + "nowa rupia indonezyjska", + } + IDR{ + "Rp", + "rupia indonezyjska", + } + IEP{ + "IR£", + "funt irlandzki", + } + ILL{ + "ILL", + "szekel izraelski", + } + ILP{ + "ILP", + "funt izraelski", + } + ILS{ + "ILS", + "nowy szekel izraelski", + } + IMP{ + "IMP", + "funt szterling Wyspa Man", + } + INR{ + "INR", + "rupia indyjska", + } + IQD{ + "ID", + "dinar iracki", + } + IRR{ + "RI", + "rial irański", + } + ISK{ + "ISK", + "korona islandzka", + } + ITL{ + "₤", + "lir włoski", + } + JEP{ + "JEP", + "funt szterling Jersey", + } + JMD{ + "J$", + "dolar jamajski", + } + JMP{ + "JMP", + "funt jamajski", + } + JOD{ + "JD", + "dinar jordański", + } + JPY{ + "¥", + "jen japoński", + } + KES{ + "K Sh", + "szyling kenijski", + } + KGS{ + "som", + "som kirgiski", + } + KHO{ + "KHO", + "stary riel kambodżański", + } + KHR{ + "CR", + "riel kambodżański", + } + KID{ + "KID", + "dolar Kiribati", + } + KMF{ + "CF", + "frank komoryjski", + } + KPP{ + "KPP", + "won ludowopółnocnokoreański", + } + KPW{ + "KPW", + "won północnokoreański", + } + KRH{ + "KRH", + "hwan południowokoreański", + } + KRO{ + "KRO", + "stary won południowokoreański", + } + KRW{ + "KRW", + "won południowokoreański", + } + KWD{ + "KD", + "dinar kuwejcki", + } + KYD{ + "KYD", + "dolar kajmański", + } + KZR{ + "KZR", + "rubel kazachski", + } + KZT{ + "T", + "Tenge kazachskie", + } + LAK{ + "LAK", + "kip laotański", + } + LBP{ + "LL", + "funt libański", + } + LIF{ + "LIF", + "frank Liechtenstein", + } + LKR{ + "SL Re", + "rupia lankijska", + } + LNR{ + "LNR", + "rupia cejlońska", + } + LRD{ + "LRD", + "dolar liberyjski", + } + LSL{ + "M", + "loti Lesoto", + } + LTL{ + "LTL", + "lit litewski", + } + LTT{ + "LTT", + "talon litewski", + } + LUF{ + "LUF", + "frank luksemburski", + } + LVL{ + "LVL", + "łat łotewski", + } + LVR{ + "LVR", + "rubel łotewski", + } + LYB{ + "LYB", + "lir brytyjskich władz wojskowych w Libii", + } + LYD{ + "LD", + "dinar libijski", + } + LYP{ + "LYP", + "funt libijski", + } + MAD{ + "MAD", + "dirham marokański", + } + MAF{ + "MAF", + "frank marokański", + } + MCF{ + "MCF", + "nowy frank Monaco", + } + MCG{ + "MCG", + "frank Monaco Germinal", + } + MDC{ + "MDC", + "lej kuponowy mołdawski", + } + MDL{ + "MDL", + "lej mołdawski", + } + MDR{ + "MDR", + "rubel kuponowy mołdawski", + } + MGA{ + "MGA", + "ariar malgaski", + } + MGF{ + "MGF", + "frank malgaski", + } + MHD{ + "MHD", + "dolar Wysp Marshalla", + } + MKD{ + "MDen", + "denar macedoński", + } + MKN{ + "MKN", + "denar macedoński (1992-1993)", + } + MLF{ + "MLF", + "frank malijski", + } + MMK{ + "MMK", + "kyat Myanmar", + } + MMX{ + "MMX", + "dolarowy certyfikat Myanmar dla transakcji zagranicznych", + } + MNT{ + "Tug", + "tugrik mongolski", + } + MOP{ + "MOP", + "pataka Macao", + } + MQF{ + "MQF", + "frank Martynika", + } + MRO{ + "UM", + "ouguiya mauterańska", + } + MTL{ + "Lm", + "lira maltańska", + } + MTP{ + "MTP", + "funt maltański", + } + MUR{ + "MUR", + "rupia Mauritius", + } + MVP{ + "MVP", + "rupia malediwska", + } + MVR{ + "MVR", + "rufiyaa malediwska", + } + MWK{ + "MK", + "kwacha malawska", + } + MWP{ + "MWP", + "funt malawski", + } + MXN{ + "MEX$", + "peso meksykańskie", + } + MXP{ + "MXP", + "peso srebrne meksykańskie (1861-1992)", + } + MYR{ + "RM", + "ringgit malezyjski", + } + MZE{ + "MZE", + "escudo mozambickie", + } + MZM{ + "Mt", + "metical Mozambik", + } + NAD{ + "N$", + "dolar namibijski", + } + NCF{ + "NCF", + "franc germinal Nowa Kaledonia", + } + NGN{ + "NGN", + "naira nigeryjska", + } + NGP{ + "NGP", + "funt nigeryjski", + } + NIC{ + "NIC", + "cordoba nikaraguańska", + } + NIG{ + "NIG", + "cordoba Gold nikaraguańska", + } + NIO{ + "NIO", + "cordoba oro nikaraguańska", + } + NLG{ + "NLG", + "gulden holenderski ", + } + NOK{ + "NKr", + "korona norweska", + } + NPR{ + "Nrs", + "rupia nepalska", + } + NZD{ + "$NZ", + "dolar nowozelandzki", + } + NZP{ + "NZP", + "funt nowozelandzki", + } + OMR{ + "RO", + "rial Omanu", + } + OMS{ + "OMS", + "rial saidi omański", + } + PAB{ + "PAB", + "balboa panamski", + } + PDK{ + "PDK", + "rubel kuponowy naddniestrzański", + } + PDN{ + "PDN", + "nowy rubel naddniestrzański", + } + PDR{ + "PDR", + "rubel naddniestrzański", + } + PEI{ + "PEI", + "inti peruwiański", + } + PEN{ + "PEN", + "nowy sol peruwiański", + } + PES{ + "PES", + "sol peruwiański", + } + PGK{ + "PGK", + "kina Papua Nowa Gwinea", + } + PHP{ + "PHP", + "peso filipińskie", + } + PKR{ + "Pra", + "rupia pakistańska", + } + PLN{ + "zł", + "złoty polski", + } + PLX{ + "PLX", + "złoty polski dewizowy dla transakcji zagranicznych", + } + PLZ{ + "PLZ", + "złoty polski (1950-1995)", + } + PSP{ + "PSP", + "funt palestyński", + } + PTC{ + "PTC", + "conto portugalskie", + } + PTE{ + "PTE", + "escudo portugalskie", + } + PYG{ + "PYG", + "guarani paragwajskie", + } + QAR{ + "QR", + "rial katarski", + } + REF{ + "REF", + "frank Reunion", + } + ROL{ + "leu", + "lej rumuński", + } + RON{ + "RON", + "nowy lej rumuński", + } + RUB{ + "RUB", + "rubel rosyjski", + } + RUR{ + "RUR", + "rubel rosyjski (1991-1998)", + } + RWF{ + "RWF", + "frank ruandyjski", + } + SAR{ + "SRl", + "rial saudyjski", + } + SAS{ + "SAS", + "riyal sovereign saudyjski", + } + SBD{ + "SI$", + "dolar Wysp Salomona", + } + SCR{ + "SR", + "rupia seszelska", + } + SDD{ + "SDD", + "dinar sudański", + } + SDP{ + "SDP", + "funt sudański", + } + SEK{ + "SKr", + "korona szwedzka", + } + SGD{ + "S$", + "dolar singapurski", + } + SHP{ + "SHP", + "funt Wyspy Świętej Heleny", + } + SIB{ + "SIB", + "tolar słoweński bonowy", + } + SIT{ + "SIT", + "tolar słoweński", + } + SKK{ + "Sk", + "korona słowacka", + } + SLL{ + "SLL", + "leone Sierra Leone", + } + SML{ + "SML", + "lir San Marino", + } + SOS{ + "So. Sh.", + "szyling somalijski", + } + SQS{ + "SQS", + "szyling somalijski", + } + SRG{ + "Sf", + "gulden surinamski", + } + SSP{ + "SSP", + "funt szkocki", + } + STD{ + "Db", + "dobra Wysp Świętego Tomasza i Książęcej", + } + STE{ + "STE", + "escudo Wysp Świętego Tomasza i Książęcej", + } + SUN{ + "SUN", + "nowy rubel radziecki", + } + SUR{ + "SUR", + "rubel radziecki", + } + SVC{ + "SVC", + "colon salwadorski", + } + SYP{ + "LS", + "funt syryjski", + } + SZL{ + "E", + "lilangeni Suazi", + } + TCC{ + "TCC", + "korona Turks i Caicos", + } + TDF{ + "TDF", + "frank CFA Czadu", + } + THB{ + "THB", + "baht tajski", + } + TJR{ + "TJR", + "rubel tadżycki", + } + TJS{ + "TJS", + "somoni tadżyckie", + } + TMM{ + "TMM", + "manat turkmeński", + } + TND{ + "TND", + "dinar tunezyjski", + } + TOP{ + "T$", + "paʻanga Tonga", + } + TOS{ + "TOS", + "funt szterling Tonga", + } + TPE{ + "TPE", + "escudo timorskie", + } + TPP{ + "TPP", + "pataca timorskie", + } + TRL{ + "TL", + "lir turecki", + } + TTD{ + "TT$", + "dolar Trynidadu i Tobago", + } + TTO{ + "TTO", + "stary dolar Trynidadu i Tobago", + } + TVD{ + "TVD", + "dolar Tuvalu", + } + TWD{ + "NT$", + "nowy dolar tajwański", + } + TZS{ + "T Sh", + "szyling tanzański", + } + UAH{ + "UAH", + "hrywna ukraińska", + } + UAK{ + "UAK", + "karbowaniec ukraiński", + } + UGS{ + "UGS", + "szyling ugandyjski (1966-1987)", + } + UGX{ + "USh", + "szyling ugandyjski", + } + USD{ + "US$", + "dolar amerykański ", + } + UYF{ + "UYF", + "peso urugwajskie Fuerte", + } + UYP{ + "UYP", + "peso urugwajskie (1975-1993)", + } + UYU{ + "Ur$", + "peso urugwajskie", + } + UZC{ + "UZC", + "som kuponowy uzbecki", + } + UZS{ + "UZS", + "som uzbecki", + } + VAL{ + "VAL", + "lir Miasta Watykan", + } + VDD{ + "VDD", + "piastre dong viet północnowietnamski", + } + VDN{ + "VDN", + "nowy dong północnowietnamski", + } + VDP{ + "VDP", + "viet minh piastre dong viet północnowietnamski", + } + VEB{ + "Be", + "boliwar wenezuelski", + } + VGD{ + "VGD", + "dolar Brytyjskich Wysp Dziewiczych", + } + VND{ + "VND", + "dong wietnamski", + } + VNN{ + "VNN", + "nowy dong wietnamski", + } + VNR{ + "VNR", + "dong Republiki Wietnamskiej", + } + VNS{ + "VNS", + "dong narodowy wietnamski", + } + VUV{ + "VT", + "vatu Vanuatu", + } + WSP{ + "WSP", + "funt samoański", + } + WST{ + "WST", + "tala samoańska", + } + XAD{ + "XAD", + "jednostla dinar rozliczeniowy azjatycki", + } + XAF{ + "XAF", + "frank CFA BEAC", + } + XAM{ + "XAM", + "jednostka monetarna azjatycka", + } + XAU{ + "XAU", + "złoto", + } + XCD{ + "EC$", + "dolar wschodniokaraibski", + } + XCF{ + "XCF", + "nowy frank CFA", + } + XDR{ + "XDR", + "specjalne prawa ciągnienia", + } + XEF{ + "XEF", + "frank CFA BCEAEC", + } + XFO{ + "XFO", + "frank złoty francuski", + } + XFU{ + "XFU", + "UIC-frank francuski", + } + XID{ + "XID", + "dinar islamski", + } + XMF{ + "XMF", + "nowy frank Metropolii Francuskiej", + } + XNF{ + "XNF", + "frank CFA Antyli Francuskich", + } + XOF{ + "XOF", + "frank CFA", + } + XPF{ + "CFPF", + "frank CFP", + } + XTR{ + "XTR", + "rubel transferowy COMECON", + } + YDD{ + "YDD", + "dinar jemeński", + } + YEI{ + "YEI", + "riyal Imadi jemeński", + } + YER{ + "YRl", + "rial jemeński", + } + YUD{ + "YUD", + "dinar jugosławiański wymienny", + } + YUF{ + "YUF", + "dinar Federacji jugosławiańskiej", + } + YUG{ + "YUG", + "dinar jugosławiański 1994", + } + YUM{ + "YUM", + "nowy dinar jugosławiański", + } + YUN{ + "YUN", + "dinar jugosławiański wymienny", + } + YUO{ + "YUO", + "dinar październikowy jugosławiański", + } + YUR{ + "YUR", + "dinar reformowany jugosławiański", + } + ZAL{ + "ZAL", + "rand południowoafrykański (finansowy)", + } + ZAP{ + "ZAP", + "funt południowoafrykański", + } + ZAR{ + "R", + "rand południowoafrykański", + } + ZMK{ + "ZMK", + "kwacha zambijska", + } + ZMP{ + "ZMP", + "funt zambijski", + } + ZRN{ + "ZRN", + "nowy zair zairski", + } + ZRZ{ + "ZRZ", + "zair zairski", + } + ZWD{ + "Z$", + "dolar Zimbabwe", + } } - Languages { - pl { "polski" } + ExemplarCharacters{"[a-z ó ą ę ć ń ś ź ł ż]"} + Keys{ + calendar{"Kalendarz"} + collation{"Sortowanie"} + currency{"Waluta"} } - LocaleID:int { 0x15 } -// LocaleString { "pl" } - MonthAbbreviations { - "sty", - "lut", - "mar", - "kwi", - "maj", - "cze", - "lip", - "sie", - "wrz", - "pa\u017A", - "lis", - "gru", + Languages{ + ar{"arabski"} + bg{"bułgarski"} + cs{"czeski"} + da{"duński"} + de{"niemiecki"} + el{"grecki"} + en{"angielski"} + es{"hiszpański"} + et{"estoński"} + fi{"fiński"} + fr{"francuski"} + he{"hebrajski"} + hr{"chorwacki"} + hu{"węgierski"} + it{"włoski"} + ja{"japoński"} + ko{"koreański"} + lt{"litewski"} + lv{"łotewski"} + nl{"holenderski"} + no{"norweski"} + pl{"polski"} + pt{"portugalski"} + ro{"rumuński"} + ru{"rosyjski"} + sk{"słowacki"} + sl{"słoweński"} + sv{"szwedzki"} + tr{"turecki"} + zh{"chiński"} } - MonthNames { - "stycze\u0144", - "luty", - "marzec", - "kwiecie\u0144", - "maj", - "czerwiec", - "lipiec", - "sierpie\u0144", - "wrzesie\u0144", - "pa\u017Adziernik", - "listopad", - "grudzie\u0144", + LocaleScript{ + "Latn", } - NumberElements { + NumberElements{ ",", - ".", + " ", ";", "%", "0", "#", "-", "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", + "‰", + "∞", + "�", + "+", + } + Scripts{ + Arab{"Arabski"} + Armn{"Armeński"} + Beng{"Bengalski"} + Cans{"Zunifikowane symbole kanadyjskich autochtonów"} + Cher{"Czerokezki"} + Copt{"Koptyjski"} + Cyrl{"Cyrylicki"} + Ethi{"Etiopski"} + Geor{"Gruziński"} + Goth{"Gotycki"} + Grek{"Grecki"} + Gujr{"Gudżarati"} + Hano{"Hanunoo"} + Hans{"Uproszczony Han"} + Hant{"Tradycyjny Han"} + Hebr{"Hebrajski"} + Ital{"Starowłoski"} + Khmr{"Khmerski"} + Laoo{"Laotański"} + Latn{"Łaciński"} + Limb{"Limbu"} + Linb{"Linearny B"} + Mlym{"Malayalam"} + Mong{"Mongolski"} + Mymr{"Myanmar"} + Ogam{"Ogham"} + Orya{"Oriya"} + Osma{"Csmanya"} + Qaai{"Dziedziczny"} + Runr{"Runiczny"} + Sinh{"Syngaleski"} + Syrc{"Syryjski"} + Tagb{"Tagbanwa"} + Taml{"Tamilski"} + Telu{"Telugu"} + Tglg{"Tagalog"} + Thaa{"Thaana"} + Thai{"Tajski"} + Tibt{"Tybetański"} + Ugar{"Ugarycki"} + Zyyy{"Wspólny"} } -// ShortLanguage { "pol" } - zoneStrings { - { - "Africa/Casablanca", - "GMT", - "GMT", - "GMT", - "GMT", + Types{ + calendar{ + buddhist{"Kalendarz buddyjski"} + chinese{"Kalendarz chiński"} + gregorian{"Kalendarz gregoriański"} + hebrew{"Kalendarz żydowski"} + japanese{"Kalendarz japoński"} + } + collation{ + direct{"porządek bezpośredni"} + phonebook{"porządek książki telefonicznej"} + pinyin{"porządek Pinyin"} + stroke{"porządek akcentów"} + traditional{"tradycyjny"} } } -// LocaleScript{ -// "Latn", // ISO 15924 Name -// } - ExemplarCharacters { "[a-z \u00f3 \u0105 \u0119 \u0107 \u0144 \u015b \u017a \u0142 \u017c]" } - - // Currency display names - Currencies { - PLN { "z\u0142", "PLN" } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "HH:mm:ss z", + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm", + "EEEE, d MMMM yyyy", + "d MMMM yyyy", + "yyyy-MM-dd", + "yy-MM-dd", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "N", + "Pn", + "Wt", + "Śr", + "Cz", + "Pt", + "So", + } + narrow{ + "N", + "P", + "W", + "Ś", + "C", + "P", + "S", + } + wide{ + "niedziela", + "poniedziałek", + "wtorek", + "środa", + "czwartek", + "piątek", + "sobota", + } + } + } + eras{ + abbreviated{ + "p.n.e.", + "n.e.", + } + } + monthNames{ + format{ + abbreviated{ + "st", + "lut", + "mrz", + "kw", + "maj", + "cz", + "lip", + "sier", + "wrz", + "paź", + "lis", + "gr", + } + narrow{ + "s", + "l", + "m", + "k", + "m", + "c", + "l", + "s", + "w", + "p", + "l", + "g", + } + wide{ + "stycznia", + "lutego", + "marca", + "kwietnia", + "maja", + "czerwca", + "lipca", + "sierpnia", + "września", + "października", + "listopada", + "grudnia", + } + } + stand-alone{ + abbreviated{ + "st", + "lut", + "mrz", + "kw", + "maj", + "cz", + "lip", + "sier", + "wrz", + "paź", + "lis", + "gr", + } + narrow{ + "s", + "l", + "m", + "k", + "m", + "c", + "l", + "s", + "w", + "p", + "l", + "g", + } + wide{ + "Styczeń", + "Luty", + "Marzec", + "Kwiecień", + "Maj", + "Czerwiec", + "Lipiec", + "Sierpień", + "Wrzesień", + "Październik", + "Listopad", + "Grudzień", + } + } + } + } } } diff --git a/icuSources/data/locales/pl_PL.txt b/icuSources/data/locales/pl_PL.txt index e40f956c..9387922a 100644 --- a/icuSources/data/locales/pl_PL.txt +++ b/icuSources/data/locales/pl_PL.txt @@ -1,19 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/pl_PL.xml // * // *************************************************************************** - -pl_PL { - Version { "2.0" } -// LocaleString { "pl_PL" } - NumberPatterns { +pl_PL{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "#,##0.00 \u00A4;-#,##0.00 \u00A4", + "#,##0.00 ¤;-#,##0.00 ¤", "#,##0%", "#E0", } -// ShortCountry { "POL" } - LocaleID:int { 0x0415 } + Version{"1.2"} } diff --git a/icuSources/data/locales/ps.txt b/icuSources/data/locales/ps.txt new file mode 100644 index 00000000..2be4358b --- /dev/null +++ b/icuSources/data/locales/ps.txt @@ -0,0 +1,212 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ps.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/ps.xml + */ +ps{ + Countries{ + AF{"افغانستان"} + AL{"البانیه"} + AO{"انګولا"} + AQ{"انتارکتیکا"} + AT{"اتریش"} + BD{"بنګله‌دیش"} + BG{"بلغاریه"} + CA{"کاناډا"} + CH{"سویس"} + CN{"چین"} + CO{"کولمبیا"} + CU{"کیوبا"} + DE{"المان"} + DK{"ډنمارک"} + DZ{"الجزایر"} + EG{"مصر"} + ES{"هسپانیه"} + ET{"حبشه"} + FI{"فنلینډ"} + FR{"فرانسه"} + GB{"برتانیه"} + GH{"ګانا"} + GN{"ګیانا"} + GR{"یونان"} + GT{"ګواتیمالا"} + HN{"هانډوراس"} + HU{"مجارستان"} + ID{"اندونیزیا"} + IN{"هند"} + IQ{"عراق"} + IS{"آیسلینډ"} + IT{"ایټالیه"} + JM{"جمیکا"} + JP{"جاپان"} + KH{"کمبودیا"} + KW{"کویټ"} + LA{"لاوس"} + LB{"لبنان"} + LR{"لایبریا"} + LY{"لیبیا"} + MA{"مراکش"} + MN{"مغولستان"} + MY{"مالیزیا"} + NG{"نایجیریا"} + NI{"نکاراګوا"} + NL{"هالېنډ"} + NO{"ناروې"} + NP{"نیپال"} + NZ{"نیوزیلنډ"} + PK{"پاکستان"} + PL{"پولنډ"} + PS{"فلسطین"} + PT{"پورتګال"} + RU{"روسیه"} + RW{"روندا"} + SA{"سعودی عربستان"} + SE{"سویډن"} + SV{"سالوېډور"} + SY{"سوریه"} + TJ{"تاجکستان"} + TZ{"تنزانیا"} + UY{"یوروګوای"} + YE{"یمن"} + } + Currencies{ + AFA{ + "افغانۍ", + "افغانۍ", + } + } + ExemplarCharacters{"[ء-ؤئ-غفقل-وي-ْٰٔټپځڅ-چډړږژښکګڼی-ۍې ‌‍‏‎]"} + Languages{ + ar{"عربي"} + bal{"بلوڅي"} + de{"الماني"} + el{"یوناني"} + en{"انګلیسي"} + et{"حبشي"} + fa{"فارسي"} + fi{"فینلنډي"} + fr{"فرانسوي"} + he{"عبري"} + hi{"هندي"} + hy{"ارمني"} + ine{"هند و اروپایي"} + it{"ایټالوي"} + ja{"جاپانی"} + ku{"کردي"} + la{"لاتیني"} + mg{"ملغاسي"} + mk{"مقدوني"} + mn{"مغولي"} + ms{"ملایا"} + pl{"پولنډي"} + ps{"پښتو"} + pt{"پورتګالي"} + ru{"روسي"} + sa{"سنسکریټ"} + sv{"سویډنی"} + tg{"تاجک"} + tk{"ترکمني"} + tt{"تاتار"} + uz{"ازبکي"} + zh{"چیني"} + } + LocaleScript{ + "Arab", + } + Version{"1.2"} + calendar{ + gregorian{ + AmPmMarkers{ + "غ.م.", + "غ.و.", + } + DateTimePatterns{ + "H:mm:ss (z)", + "H:mm:ss (z)", + "H:mm:ss", + "H:mm", + "EEEE د yyyy د MMMM d", + "د yyyy د MMMM d", + "d MMMM yyyy", + "yyyy/M/d", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "ی.", + "د.", + "س.", + "چ.", + "پ.", + "ج.", + "ش.", + } + wide{ + "یکشنبه", + "دوشنبه", + "سه‌شنبه", + "چهارشنبه", + "پنجشنبه", + "جمعه", + "شنبه", + } + } + } + eras{ + abbreviated{ + "ق.م.", + "م.", + } + } + monthNames{ + format{ + abbreviated{ + "جنو", + "فبر", + "مار", + "اپر", + "مـی", + "جون", + "جول", + "اګس", + "سپت", + "اکت", + "نوم", + "دسم", + } + wide{ + "جنوري", + "فبروري", + "مارچ", + "اپریل", + "می", + "جون", + "جولای", + "اګست", + "سپتمبر", + "اکتوبر", + "نومبر", + "دسمبر", + } + } + } + } + } + zoneStrings{ + { + "Asia/Kabul", + "د افغانستان په وخت", + "AFT", + "د افغانستان په وخت", + "AFT", + "کابل", + } + } +} diff --git a/icuSources/data/locales/ps_AF.txt b/icuSources/data/locales/ps_AF.txt new file mode 100644 index 00000000..dd83db2f --- /dev/null +++ b/icuSources/data/locales/ps_AF.txt @@ -0,0 +1,39 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ps_AF.xml +// * +// *************************************************************************** +ps_AF{ + NumberElements{ + "٫", + "٬", + ";", + "٪", + "۰", + "#", + "−", + "×۱۰^", + "‰", + "∞", + "�", + "+", + } + NumberPatterns{ + "#,##0.###;-#,##0.###", + "#,##0 ¤;-#,##0 ¤", + "#,##0%", + "#E0", + } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 7, + 1, + } + } + } +} diff --git a/icuSources/data/locales/pt.txt b/icuSources/data/locales/pt.txt index cfd844cb..19cd2c06 100644 --- a/icuSources/data/locales/pt.txt +++ b/icuSources/data/locales/pt.txt @@ -1,260 +1,2239 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/pt.xml // * // *************************************************************************** - -pt { - Version { "2.0" } - - "%%PREEURO" { "Pr\u00e9-Euro" } - //"%%EURO" { "Euro" } - - //"%%POSIX" { "POSIX" } - - "%%TRADITIONAL" { "Tradicional" } - - "%%REVISED" { "Revisado" } - - Countries { - AE { "Emirados \u00c1rabes Unidos" } - AL { "Alb\u00e2nia" } - AM { "Arm\u00eania" } - AS { "Samoa Americana" } - AT { "\u00c1ustria" } - AU { "Austr\u00e1lia" } - BA { "B\u00f3snia-Herzeg\u00f3vina" } - BE { "B\u00e9lgica" } - BG { "Bulg\u00e1ria" } - BH { "Bareine" } - BO { "Bol\u00edvia" } - BR { "Brasil" } - BW { "Botsuana" } - BY { "Belarus" } - CA { "Canad\u00e1" } - CH { "Su\u00ed\u00e7a" } - CN { "China (RPC)" } - CO { "Col\u00f4mbia" } - CZ { "Rep\u00fablica Checa" } - DE { "Alemanha" } - DJ { "Djibuti" } - DK { "Dinamarca" } - DO { "Rep\u00fablica Dominicana" } - DZ { "Arg\u00e9lia" } - EC { "Equador" } - EE { "Est\u00f4nia" } - EG { "Egito" } - ER { "Eritr\u00e9ia" } - ES { "Espanha" } - ET { "Eti\u00f3pia" } - FI { "Finl\u00e2ndia" } - FO { "Ilhas Faroe" } - FR { "Fran\u00e7a" } - GB { "Reino Unido" } - GL { "Groenl\u00e2ndia" } - GR { "Gr\u00e9cia" } - HK { "Hong Kong, R.A.E. da China" } - HR { "Cro\u00e1cia" } - HU { "Hungria" } - ID { "Indon\u00e9sia" } - IE { "Irlanda" } - IN { "\u00cdndia" } - IQ { "Iraque" } - IR { "Ir\u00e3" } - IS { "Isl\u00e2ndia" } - IT { "It\u00e1lia" } - JO { "Jord\u00e2nia" } - JP { "Jap\u00e3o" } - KE { "Qu\u00eania" } - KR { "Cor\u00e9ia do sul" } - KW { "Coveite" } - LA { "Rep\u00fablica Democr\u00e1tica do Laos" } - LB { "L\u00edbano" } - LT { "Litu\u00e2nia" } - LU { "Luxemburgo" } - LV { "Let\u00f4nia" } - LY { "L\u00edbia" } - MA { "Marrocos" } - MK { "Maced\u00f4nia" } - MO { "Macau, R.A.E. da China" } - MX { "M\u00e9xico" } - NI { "Nicar\u00e1gua" } - NL { "Pa\u00edses Baixos" } - NO { "Noruega" } - NZ { "Nova Zel\u00e2ndia" } - OM { "Om\u00e3" } - PA { "Panam\u00e1" } - PH { "Filipinas" } - PK { "Paquist\u00e3o" } - PL { "Pol\u00f4nia" } - PR { "Porto Rico" } - PY { "Paraguai" } - QA { "Catar" } - RO { "Rom\u00eania" } - RU { "R\u00fassia" } - SA { "Ar\u00e1bia Saudita" } - SD { "Sud\u00e3o" } - SE { "Su\u00e9cia" } - SG { "Cingapura" } - SI { "Eslov\u00eania" } - SK { "Eslov\u00e1quia" } - SO { "Som\u00e1lia" } - SP { "S\u00e9rvia" } - SY { "S\u00edria" } - TH { "Tail\u00e2ndia" } - TN { "Tun\u00edsia" } - TR { "Turquia" } - TZ { "Tanz\u00e2nia" } - UA { "Ucr\u00e2nia" } - US { "Estados Unidos" } - UY { "Uruguai" } - VI { "Ilhas Virgens dos EUA" } - VN { "Vietn\u00e3" } - YE { "I\u00eamen" } - YU { "Iugosl\u00e1via" } - ZA { "\u00c1frica do Sul" } - ZW { "Zimbabu\u00e9" } - } - DateTimePatterns { - "HH'H'mm'm' z", - "HH:mm:ss z", - "HH:mm:ss", - "HH:mm", - "EEEE, d' de 'MMMM' de 'yyyy", - "d' de 'MMMM' de 'yyyy", - "d/MMM/yyyy", - "dd-MM-yyyy", - "{1} {0}", +/** + * ICU source: ../../../locale/icu/main/pt.xml + */ +pt{ + Countries{ + AD{"Andorra"} + AE{"Emirados Árabes Unidos"} + AF{"Afeganistão"} + AG{"Antígua e Barbuda"} + AI{"Anguilla"} + AL{"Albânia"} + AM{"Armênia"} + AN{"Antilhas Holandesas"} + AO{"Angola"} + AQ{"Antártida"} + AR{"Argentina"} + AS{"Samoa Americana"} + AT{"Áustria"} + AU{"Austrália"} + AW{"Aruba"} + AZ{"Azerbaijão"} + BA{"Bósnia-Herzegóvina"} + BB{"Barbados"} + BD{"Bangladesh"} + BE{"Bélgica"} + BF{"Burquina Faso"} + BG{"Bulgária"} + BH{"Bareine"} + BI{"Burundi"} + BJ{"Benin"} + BM{"Bermudas"} + BN{"Brunei"} + BO{"Bolívia"} + BR{"Brasil"} + BS{"Bahamas"} + BT{"Butão"} + BV{"Ilha Bouvet"} + BW{"Botsuana"} + BY{"Belarus"} + BZ{"Belize"} + CA{"Canadá"} + CC{"Ilhas Cocos (Keeling)"} + CD{"Congo, República Democrática do"} + CF{"República Centro-Africana"} + CG{"Congo"} + CH{"Suíça"} + CI{"Costa do Marfim"} + CK{"Ilhas Cook"} + CL{"Chile"} + CM{"República dos Camarões"} + CN{"China"} + CO{"Colômbia"} + CR{"Costa Rica"} + CU{"Cuba"} + CV{"Cabo Verde"} + CX{"Ilhas Natal"} + CY{"Chipre"} + CZ{"República Tcheca"} + DE{"Alemanha"} + DJ{"Djibuti"} + DK{"Dinamarca"} + DM{"Dominica"} + DO{"República Dominicana"} + DZ{"Argélia"} + EC{"Equador"} + EE{"Estônia"} + EG{"Egito"} + EH{"Saara Ocidental"} + ER{"Eritréia"} + ES{"Espanha"} + ET{"Etiópia"} + FI{"Finlândia"} + FJ{"Fiji"} + FK{"Ilhas Malvinas"} + FM{"Micronésia, Estados Federados da"} + FO{"Ilhas Faroe"} + FR{"França"} + GA{"Gabão"} + GB{"Reino Unido"} + GD{"Granada"} + GE{"Geórgia"} + GF{"Guiana Francesa"} + GH{"Gana"} + GI{"Gibraltar"} + GL{"Groênlandia"} + GM{"Gâmbia"} + GN{"Guiné"} + GP{"Guadalupe"} + GQ{"Guiné Equatorial"} + GR{"Grécia"} + GS{"Geórgia do Sul e Ilhas Sandwich do Sul"} + GT{"Guatemala"} + GU{"Guam"} + GW{"Guiné Bissau"} + GY{"Guiana"} + HK{"Hong Kong, Região Admin. Especial da China"} + HM{"Ilha Heard e Ilhas McDonald"} + HN{"Honduras"} + HR{"Croácia"} + HT{"Haiti"} + HU{"Hungria"} + ID{"Indonésia"} + IE{"Irlanda"} + IL{"Israel"} + IN{"Índia"} + IO{"Território Britânico do Oceano Índico"} + IQ{"Iraque"} + IR{"Irã"} + IS{"Islândia"} + IT{"Itália"} + JM{"Jamaica"} + JO{"Jordânia"} + JP{"Japão"} + KE{"Quênia"} + KG{"Quirguistão"} + KH{"Camboja"} + KI{"Quiribati"} + KM{"Comores"} + KN{"São Cristovão e Nevis"} + KP{"Coréia, Norte"} + KR{"Coréia, Sul"} + KW{"Kuwait"} + KY{"Ilhas Caiman"} + KZ{"Casaquistão"} + LA{"República Democrática Popular de Lao"} + LB{"Líbano"} + LC{"Santa Lúcia"} + LI{"Liechtenstein"} + LK{"Sri Lanka"} + LR{"Libéria"} + LS{"Lesoto"} + LT{"Lituânia"} + LU{"Luxemburgo"} + LV{"Letônia"} + LY{"Líbia"} + MA{"Marrocos"} + MC{"Mônaco"} + MD{"Moldova, República de"} + MG{"Madagascar"} + MH{"Ilhas Marshall"} + MK{"Macedônia, República da"} + ML{"Mali"} + MM{"Mianmá"} + MN{"Mongólia"} + MO{"Macau, Região Admin. Especial da China"} + MP{"Ilhas Marianas do Norte"} + MQ{"Martinica"} + MR{"Mauritânia"} + MS{"Montserrat"} + MT{"Malta"} + MU{"Maurício"} + MV{"Maldivas"} + MW{"Malawi"} + MX{"México"} + MY{"Malásia"} + MZ{"Moçambique"} + NA{"Namíbia"} + NC{"Nova Caledônia"} + NE{"Níger"} + NF{"Ilha Norfolk"} + NG{"Nigéria"} + NI{"Nicarágua"} + NL{"Países Baixos"} + NO{"Noruega"} + NP{"Nepal"} + NR{"Nauru"} + NU{"Niue"} + NZ{"Nova Zelândia"} + OM{"Omã"} + PA{"Panamá"} + PE{"Peru"} + PF{"Polinésia Francesa"} + PG{"Papua-Nova Guiné"} + PH{"Filipinas"} + PK{"Paquistão"} + PL{"Polônia"} + PM{"Saint Pierre e Miquelon"} + PN{"Pitcairn"} + PR{"Porto Rico"} + PS{"Território da Palestina"} + PT{"Portugal"} + PW{"Palau"} + PY{"Paraguai"} + QA{"Catar"} + RE{"Reunião"} + RO{"Romênia"} + RU{"Rússia"} + RW{"Ruanda"} + SA{"Arábia Saudita"} + SB{"Ilhas Salomão"} + SC{"Seychelles"} + SD{"Sudão"} + SE{"Suécia"} + SG{"Cingapura"} + SH{"Santa Helena"} + SI{"Eslovênia"} + SJ{"Svalbard e Jan Mayen"} + SK{"Eslováquia"} + SL{"Serra Leoa"} + SM{"San Marino"} + SN{"Senegal"} + SO{"Somália"} + SP{"Sérvia"} + SR{"Suriname"} + ST{"São Tomé e Príncipe"} + SV{"El Salvador"} + SY{"Síria"} + SZ{"Suazilândia"} + TC{"Ilhas Turks e Caicos"} + TD{"Chade"} + TF{"Territórios Franceses do Sul"} + TG{"Togo"} + TH{"Tailândia"} + TJ{"Tadjiquistão"} + TK{"Tokelau"} + TL{"Timor Leste"} + TM{"Turcomenistão"} + TN{"Tunísia"} + TO{"Tonga"} + TR{"Turquia"} + TT{"Trinidad e Tobago"} + TV{"Tuvalu"} + TW{"Taiwan"} + TZ{"Tanzânia"} + UA{"Ucrânia"} + UG{"Uganda"} + UM{"Ilhas Menores Distantes dos Estados Unidos"} + US{"Estados Unidos"} + UY{"Uruguai"} + UZ{"Uzbequistão"} + VA{"Vaticano"} + VC{"São Vicente e Granadinas"} + VE{"Venezuela"} + VG{"Ilhas Virgens Britânicas"} + VI{"Ilhas Virgens dos EUA"} + VN{"Vietnã"} + VU{"Vanuatu"} + WF{"Wallis e Futuna"} + WS{"Samoa"} + YE{"Iêmen"} + YT{"Mayotte"} + YU{"Iugoslávia"} + ZA{"África do Sul"} + ZM{"Zâmbia"} + ZW{"Zimbábwe"} } - DayAbbreviations { - "dom", - "seg", - "ter", - "qua", - "qui", - "sex", - "s\u00E1b", - } - DayNames { - "domingo", - "segunda-feira", - "ter\u00E7a-feira", - "quarta-feira", - "quinta-feira", - "sexta-feira", - "s\u00E1bado", + Currencies{ + ADD{ + "ADD", + "Diner de Andorra", + } + ADP{ + "ADP", + "Peseta de Andorra", + } + AED{ + "AED", + "Dirém dos Emirados Árabes Unidos", + } + AFA{ + "AFA", + "Afegane (1927-2002)", + } + AFN{ + "AFA", + "Afegane", + } + AIF{ + "AIF", + "Franco de Affars e Issas", + } + ALL{ + "ALL", + "Lek Albanês", + } + ALV{ + "ALV", + "Lek Valute Albanês", + } + ALX{ + "ALX", + "Certificados de câmbio albaneses em dólares", + } + AMD{ + "AMD", + "Dram Arménio", + } + ANG{ + "ANG", + "Guilder das Antilhas Holandesas", + } + AOA{ + "AOA", + "Cuanza angolano", + } + AOK{ + "AOK", + "Cuanza angolano (1977-1990)", + } + AON{ + "AON", + "Cuanza novo angolano (1990-2000)", + } + AOR{ + "AOR", + "Cuanza angolano reajustado (1995-1999)", + } + AOS{ + "AOS", + "Escudo angolano", + } + ARA{ + "ARA", + "Austral argentino", + } + ARM{ + "ARM", + "Peso moneda nacional argentino", + } + ARP{ + "ARP", + "Peso argentino (1983-1985)", + } + ARS{ + "ARS", + "Peso argentino", + } + ATS{ + "ATS", + "Xelim austríaco", + } + AUD{ + "AUD", + "Dólar australiano", + } + AUP{ + "AUP", + "Libra australiana", + } + AWG{ + "AWG", + "Guilder de Aruba", + } + AZM{ + "AZM", + "Manat azerbaijano", + } + BAD{ + "BAD", + "Dinar da Bósnia-Herzegóvina", + } + BAM{ + "BAM", + "Marco bósnio-herzegóvino conversível", + } + BAN{ + "BAN", + "Dinar novo da Bósnia-Herzegóvina", + } + BBD{ + "BBD", + "Dólar de Barbados", + } + BDT{ + "BDT", + "Taka de Bangladesh", + } + BEC{ + "BEC", + "Franco belga (conversível)", + } + BEF{ + "BEF", + "Franco belga", + } + BEL{ + "BEL", + "Franco belga (financeiro)", + } + BGL{ + "BGL", + "Lev forte búlgaro", + } + BGM{ + "BGM", + "Lev socialista búlgaro", + } + BGN{ + "BGN", + "Lev novo búlgaro", + } + BGO{ + "BGO", + "Lev búlgaro (1879-1952)", + } + BGX{ + "BGX", + "Certificados de câmbio búlgaros em leva", + } + BHD{ + "BHD", + "Dinar bareinita", + } + BIF{ + "BIF", + "Franco do Burundi", + } + BMD{ + "BMD", + "Dólar das Bermudas", + } + BMP{ + "BMP", + "Libra das Bermudas", + } + BND{ + "BND", + "Dólar do Brunei", + } + BOB{ + "BOB", + "Boliviano", + } + BOL{ + "BOL", + "Boliviano (1863-1962)", + } + BOP{ + "BOP", + "Peso boliviano", + } + BOV{ + "BOV", + "Mvdol boliviano", + } + BRB{ + "BRB", + "Cruzeiro novo brasileiro(1967-1986)", + } + BRC{ + "BRC", + "Cruzado brasileiro", + } + BRE{ + "BRE", + "Cruzeiro brasileiro (1990-1993)", + } + BRL{ + "R$", + "Real brasileiro", + } + BRN{ + "BRN", + "Cruzado novo brasileiro", + } + BRR{ + "BRR", + "Cruzeiro brasileiro", + } + BRZ{ + "BRZ", + "Cruzeiro brasileiro (1942-1967)", + } + BSD{ + "BSD", + "Dólar das Bahamas", + } + BSP{ + "BSP", + "Libra das Bahamas", + } + BTN{ + "BTN", + "Ngultrum do Butão", + } + BTR{ + "BTR", + "Rupia do Butão", + } + BUK{ + "BUK", + "Kyat birmanês", + } + BUR{ + "BUR", + "Rupia birmanesa", + } + BWP{ + "BWP", + "Pula botsuanesa", + } + BYB{ + "BYB", + "Rublo novo bielo-russo (1994-1999)", + } + BYL{ + "BYL", + "Rublo bielo-russo (1992-1994)", + } + BYR{ + "BYR", + "Rublo bielo-russo", + } + BZD{ + "BZD", + "Dólar do Belize", + } + BZH{ + "BZH", + "Dólar de Honduras Britânica", + } + CAD{ + "CAD", + "Dólar canadense", + } + CDF{ + "CDF", + "Franco congolês", + } + CDG{ + "CDG", + "Franco da República do Congo", + } + CDL{ + "CDL", + "Zaire congolês", + } + CFF{ + "CFF", + "Franco da República Centro-Africana CFA", + } + CHF{ + "CHF", + "Franco suíço", + } + CKD{ + "CKD", + "Dólar das Ilhas Cook", + } + CLC{ + "CLC", + "Condor chileno", + } + CLE{ + "CLE", + "Escudo chileno", + } + CLF{ + "CLF", + "Unidades de Fomento chilenas", + } + CLP{ + "CLP", + "Peso chileno", + } + CMF{ + "CMF", + "Franco dos Camarões CFA", + } + CNP{ + "CNP", + "Jen Min Piao Yuan chinês", + } + CNX{ + "CNX", + "Certificados de câmbio chineses em dólares dos EUA", + } + CNY{ + "CNY", + "Yuan Renminbi chinês", + } + COB{ + "COB", + "Peso de Papel colombiano", + } + COF{ + "COF", + "Franco do Congo CFA", + } + COP{ + "COP", + "Peso colombiano", + } + CRC{ + "CRC", + "Colon da Costa Rica", + } + CSC{ + "CSC", + "Coroa checoslovaca", + } + CSK{ + "CSK", + "Coroa Forte checoslovaca", + } + CUP{ + "CUP", + "Peso cubano", + } + CUX{ + "CUX", + "Certificados de câmbio cubanos", + } + CVE{ + "CVE", + "Escudo cabo-verdiano", + } + CWG{ + "CWG", + "Guilder de Curaçau", + } + CYP{ + "CYP", + "Libra de Chipre", + } + CZK{ + "CZK", + "Coroa da República Checa", + } + DDM{ + "DDM", + "Ostmark da Alemanha Oriental", + } + DEM{ + "DEM", + "Marco alemão", + } + DES{ + "DES", + "Sperrmark alemão", + } + DJF{ + "DJF", + "Franco do Djibuti", + } + DKK{ + "DKK", + "Coroa dinamarquesa", + } + DOP{ + "DOP", + "Peso dominicano", + } + DZD{ + "DZD", + "Dinar argelino", + } + DZF{ + "DZF", + "Franco Novo argelino", + } + DZG{ + "DZG", + "Franco Germinal argelino", + } + ECS{ + "ECS", + "Sucre equatoriano", + } + ECV{ + "ECV", + "Unidad de Valor Constante (UVC) do Equador", + } + EEK{ + "EEK", + "Coroa estoniana", + } + EGP{ + "EGP", + "Libra egípcia", + } + ERN{ + "ERN", + "Nakfa da Eritréia", + } + ESP{ + "ESP", + "Peseta espanhola", + } + ETB{ + "ETB", + "Birr etíope", + } + ETD{ + "ETD", + "Dólar etíope", + } + EUR{ + "€", + "Euro", + } + FIM{ + "FIM", + "Marca finlandesa", + } + FIN{ + "FIN", + "Marca finlandesa (1860-1962)", + } + FJD{ + "FJD", + "Dólar de Fiji", + } + FJP{ + "FJP", + "Libra de Fiji", + } + FKP{ + "FKP", + "Libra das Malvinas", + } + FOK{ + "FOK", + "Coroa das Ilhas Feroé", + } + FRF{ + "FRF", + "Franco francês", + } + FRG{ + "FRG", + "Franco Germinal francês/Franco Poincaré", + } + GAF{ + "GAF", + "Franco do Gabão CFA", + } + GBP{ + "£", + "Libra esterlina britânica", + } + GEK{ + "GEK", + "Cupom Lari georgiano", + } + GEL{ + "GEL", + "Lari georgiano", + } + GHC{ + "GHC", + "Cedi de Gana", + } + GHO{ + "GHO", + "Cedi Antigo de Gana", + } + GHP{ + "GHP", + "Libra de Gana", + } + GHR{ + "GHR", + "Cedi reajustado de Gana", + } + GIP{ + "GIP", + "Libra de Gibraltar", + } + GLK{ + "GLK", + "Coroa de Groenlândia", + } + GMD{ + "GMD", + "Dalasi de Gâmbia", + } + GMP{ + "GMP", + "Libra de Gâmbia", + } + GNF{ + "GNF", + "Franco de Guiné", + } + GNI{ + "GNI", + "Franco de Guiné (1960-1972)", + } + GNS{ + "GNS", + "Syli de Guiné", + } + GPF{ + "GPF", + "Franco de Guadalupe", + } + GQE{ + "GQE", + "Ekwele de Guiné Equatorial", + } + GQF{ + "GQF", + "Franco de Guiné Equatorial", + } + GQP{ + "GQP", + "Peseta Guineana de Guiné Equatorial", + } + GRD{ + "GRD", + "Dracma grego", + } + GRN{ + "GRN", + "Dracma Novo grego", + } + GTQ{ + "GTQ", + "Quetçal da Guatemala", + } + GUF{ + "GUF", + "Franco da Guiana Francesa", + } + GWE{ + "GWE", + "Escudo da Guiné Portuguesa", + } + GWM{ + "GWM", + "Mil-réis da Guiné Portuguesa", + } + GWP{ + "GWP", + "Peso da Guiné-Bissau", + } + GYD{ + "GYD", + "Dólar da Guiana", + } + HKD{ + "HKD", + "Dólar de Hong Kong", + } + HNL{ + "HNL", + "Lempira de Honduras", + } + HRD{ + "HRD", + "Dinar croata", + } + HRK{ + "HRK", + "Kuna croata", + } + HTG{ + "HTG", + "Gurde do Haiti", + } + HUF{ + "HUF", + "Forinte húngaro", + } + IBP{ + "IBP", + "Libra da Irlanda do Norte", + } + IDG{ + "IDG", + "Guilder Nica indonésio", + } + IDJ{ + "IDJ", + "Rupia Java indonésia", + } + IDN{ + "IDN", + "Rupia Nova indonésia", + } + IDR{ + "IDR", + "Rupia indonésia", + } + IEP{ + "IEP", + "Libra irlandesa", + } + ILL{ + "ILL", + "Sheqel israelita", + } + ILP{ + "ILP", + "Libra israelita", + } + ILS{ + "ILS", + "Sheqel Novo israelita", + } + IMP{ + "IMP", + "Libra esterlina da Ilha de Man", + } + INR{ + "=0#Rs.|1#Re.|1 source: ../../../locale/icu/main/ro.xml + */ +ro{ + Countries{ + AD{"Andorra"} + AE{"Emiratele Arabe Unite"} + AF{"Afganistan"} + AG{"Antigua şi Barbuda"} + AI{"Anguilla"} + AL{"Albania"} + AM{"Armenia"} + AN{"Antilele Olandeze"} + AO{"Angola"} + AQ{"Antarctica"} + AR{"Argentina"} + AS{"Samoa Americană"} + AT{"Austria"} + AU{"Australia"} + AW{"Aruba"} + AZ{"Azerbaidjan"} + BA{"Bosnia şi Herzegovina"} + BB{"Barbados"} + BD{"Bangladesh"} + BE{"Belgia"} + BF{"Burkina Faso"} + BG{"Bulgaria"} + BH{"Bahrain"} + BI{"Burundi"} + BJ{"Benin"} + BM{"Bermuda"} + BN{"Brunei"} + BO{"Bolivia"} + BR{"Brazilia"} + BS{"Bahamas"} + BT{"Bhutan"} + BV{"Insula Bouvet"} + BW{"Botswana"} + BY{"Bielorusia"} + BZ{"Belize"} + CA{"Canada"} + CC{"Insulele Cocos (Keeling)"} + CD{"Congo, Republica Democratică"} + CF{"Republica Central Africană"} + CG{"Congo"} + CH{"Eleveţia"} + CI{"Coasta de Fildeş"} + CK{"Insulele Cook"} + CL{"Chile"} + CM{"Camerun"} + CN{"China"} + CO{"Columbia"} + CR{"Costa Rica"} + CU{"Cuba"} + CV{"Capul Verde"} + CX{"Insula Christmas"} + CY{"Cipru"} + CZ{"Republica Cehă"} + DE{"Germania"} + DJ{"Djibouti"} + DK{"Danemarca"} + DM{"Dominica"} + DO{"Republica Dominicană"} + DZ{"Algeria"} + EC{"Ecuador"} + EE{"Estonia"} + EG{"Egipt"} + EH{"Sahara de Vest"} + ER{"Eritrea"} + ES{"Spania"} + ET{"Etiopia"} + FI{"Finlanda"} + FJ{"Fiji"} + FK{"Insulele Falkland"} + FM{"Micronezia, Statele Federate"} + FO{"Insulele Feroe"} + FR{"Franţa"} + GA{"Gabon"} + GB{"Regatul Unit"} + GD{"Grenada"} + GE{"Georgia"} + GF{"Guyana Franceză"} + GH{"Ghana"} + GI{"Gibraltar"} + GL{"Groenlanda"} + GM{"Gambia"} + GN{"Guineea"} + GP{"Guadeloupe"} + GQ{"Guineea Ecuatorială"} + GR{"Grecia"} + GS{"Insulele South Georgia şi South Sandwich"} + GT{"Guatemala"} + GU{"Guam"} + GW{"Guineea-Bissau"} + GY{"Guyana"} + HK{"R.A.S. Hong Kong a Chinei"} + HM{"Insula Heard şi Insulele McDonald"} + HN{"Honduras"} + HR{"Croaţia"} + HT{"Haiti"} + HU{"Ungaria"} + ID{"Indonezia"} + IE{"Irlanda"} + IL{"Israel"} + IN{"India"} + IO{"Teritoriile Britanice din Oceanul Indian"} + IQ{"Iraq"} + IR{"Iran"} + IS{"Islanda"} + IT{"Italia"} + JM{"Jamaica"} + JO{"Iordania"} + JP{"Japonia"} + KE{"Kenya"} + KG{"Kirghizia"} + KH{"Cambodgia"} + KI{"Kiribati"} + KM{"Comoros"} + KN{"Saint Kitts şi Nevis"} + KP{"Coreea de Nord"} + KR{"Coreea de Sud"} + KW{"Kuweit"} + KY{"Insulele Cayman"} + KZ{"Kazahstan"} + LA{"Lao, Republica Democratică Populară"} + LB{"Liban"} + LC{"Saint Lucia"} + LI{"Liechtenstein"} + LK{"Sri Lanka"} + LR{"Liberia"} + LS{"Lesotho"} + LT{"Lituania"} + LU{"Luxemburg"} + LV{"Letonia"} + LY{"Libia, Jamahiriya Arabă"} + MA{"Maroc"} + MC{"Monaco"} + MD{"Moldova, Republica"} + MG{"Madagascar"} + MH{"Insulele Marshall"} + MK{"Macedonia"} + ML{"Mali"} + MM{"Myanmar"} + MN{"Mongolia"} + MO{"R.A.S. Macao a Chinei"} + MP{"Insulele Northern Mariana"} + MQ{"Martinica"} + MR{"Mauritania"} + MS{"Montserrat"} + MT{"Malta"} + MU{"Mauritius"} + MV{"Maldive"} + MW{"Malawi"} + MX{"Mexic"} + MY{"Malaezia"} + MZ{"Mozambic"} + NA{"Namibia"} + NC{"Noua Caledonie"} + NE{"Niger"} + NF{"Insulele Norfolk"} + NG{"Nigeria"} + NI{"Nicaragua"} + NL{"Olanda"} + NO{"Norvegia"} + NP{"Nepal"} + NR{"Nauru"} + NU{"Niue"} + NZ{"Noua Zeelandă"} + OM{"Oman"} + PA{"Panama"} + PE{"Peru"} + PF{"Polinezia Franceză"} + PG{"Papua Noua Guinee"} + PH{"Filipine"} + PK{"Pakistan"} + PL{"Polonia"} + PM{"Saint Pierre şi Miquelon"} + PN{"Pitcairn"} + PR{"Porto Rico"} + PS{"Teritoriul Palestinian"} + PT{"Portugalia"} + PW{"Palau"} + PY{"Paraguay"} + QA{"Qatar"} + RE{"Reunion"} + RO{"România"} + RU{"Federaţia Rusă"} + RW{"Rwanda"} + SA{"Arabia Saudită"} + SB{"Insulele Solomon"} + SC{"Seychelles"} + SD{"Sudan"} + SE{"Suedia"} + SG{"Singapore"} + SH{"Saint Helena"} + SI{"Slovenia"} + SJ{"Svalbard şi Jan Mayen"} + SK{"Slovacia"} + SL{"Sierra Leone"} + SM{"San Marino"} + SN{"Senegal"} + SO{"Somalia"} + SP{"Serbia"} + SR{"Surinam"} + ST{"Sao Tome şi Principe"} + SV{"El Salvador"} + SY{"Siria"} + SZ{"Swaziland"} + TC{"Insulele Turks şi Caicos"} + TD{"Ciad"} + TF{"Teritoriile Franceze de Sud"} + TG{"Togo"} + TH{"Tailanda"} + TJ{"Tadjikistan"} + TK{"Tokelau"} + TL{"Timorul de Est"} + TM{"Turkmenistan"} + TN{"Tunisia"} + TO{"Tonga"} + TR{"Turcia"} + TT{"Trinidad şi Tobago"} + TV{"Tuvalu"} + TZ{"Tanzania"} + UA{"Ucraina"} + UG{"Uganda"} + UM{"United States Minor Outlying Islands"} + US{"Statele Unite"} + UY{"Uruguay"} + UZ{"Uzbekistan"} + VA{"Sfântul Scaun (Statul Vatican)"} + VC{"Saint Vincent şi Grenadines"} + VE{"Venezuela"} + VG{"Insulele Virgine Britanice"} + VI{"Insulele Virgine S.U.A."} + VN{"Vietnam"} + VU{"Vanuatu"} + WF{"Wallis şi Futuna"} + WS{"Samoa"} + YE{"Yemen"} + YT{"Mayotte"} + YU{"Iugoslavia"} + ZA{"Africa de Sud"} + ZM{"Zambia"} + ZW{"Zimbabwe"} } - Languages { - ro { "rom\u00E2n\u0103" } + Currencies{ + ROL{ + "lei", + "ROL", + } + TRY{ + "TRY", + "Noua liră turcească", + } } - LocaleID:int { 0x18 } -// LocaleString { "ro" } - MonthAbbreviations { - "Ian", - "Feb", - "Mar", - "Apr", - "Mai", - "Iun", - "Iul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec", + ExemplarCharacters{"[a-z â î ă ş ţ]"} + Languages{ + ar{"Arabă"} + bg{"Bulgară"} + cs{"Cehă"} + da{"Daneză"} + de{"Germană"} + el{"Greacă"} + en{"Engleză"} + es{"Spaniolă"} + et{"Estoniană"} + fi{"Finlandeză"} + fr{"Franceză"} + he{"Ebraică"} + hr{"Croată"} + hu{"Maghiară"} + it{"Italiană"} + ja{"Japoneză"} + ko{"Coreeană"} + lt{"Lituaniană"} + lv{"Letonă"} + nl{"Olandeză"} + no{"Norvegiană"} + pl{"Poloneză"} + pt{"Portugheză"} + ro{"Română"} + ru{"Rusă"} + sk{"Slovacă"} + sl{"Slovenă"} + sv{"Suedeză"} + tr{"Turcă"} + zh{"Chineză"} } - MonthNames { - "ianuarie", - "februarie", - "martie", - "aprilie", - "mai", - "iunie", - "iulie", - "august", - "septembrie", - "octombrie", - "noiembrie", - "decembrie", + LocaleScript{ + "Latn", } - NumberElements { + NumberElements{ ",", ".", ";", @@ -91,29 +306,90 @@ ro { "#", "-", "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", + "‰", + "∞", + "�", + "+", } -// ShortLanguage { "ron" } - localPatternChars { "GanjkHmsSEDFwWxhKzAe" } - zoneStrings { - { - "Africa/Casablanca", - "GMT", - "GMT", - "GMT", - "GMT", + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "HH:mm:ss z", + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm", + "d MMMM yyyy", + "d MMMM yyyy", + "dd.MM.yyyy", + "dd.MM.yyyy", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "D", + "L", + "Ma", + "Mi", + "J", + "V", + "S", + } + wide{ + "duminică", + "luni", + "marţi", + "miercuri", + "joi", + "vineri", + "sîmbătă", + } + } + } + eras{ + abbreviated{ + "d.C.", + "î.d.C.", + } + } + monthNames{ + format{ + abbreviated{ + "Ian", + "Feb", + "Mar", + "Apr", + "Mai", + "Iun", + "Iul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + } + wide{ + "ianuarie", + "februarie", + "martie", + "aprilie", + "mai", + "iunie", + "iulie", + "august", + "septembrie", + "octombrie", + "noiembrie", + "decembrie", + } + } + } } } -// LocaleScript{ -// "Latn", // ISO 15924 Name -// } - ExemplarCharacters { "[a-z \u00e2 \u00ee \u0103 \u015f \u0163]" } - - // Currency display names - Currencies { - ROL { "lei", "ROL" } - } + localPatternChars{"GanjkHmsSEDFwWxhKzAeugXZ"} } diff --git a/icuSources/data/locales/ro_RO.txt b/icuSources/data/locales/ro_RO.txt index cdd5d170..51030c9b 100644 --- a/icuSources/data/locales/ro_RO.txt +++ b/icuSources/data/locales/ro_RO.txt @@ -1,19 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ro_RO.xml // * // *************************************************************************** - -ro_RO { - Version{ "2.0" } -// LocaleString { "ro_RO" } - NumberPatterns { +ro_RO{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "#,##0.00 \u00A4;-#,##0.00 \u00A4", + "#,##0.00 ¤;-#,##0.00 ¤", "#,##0%", "#E0", } -// ShortCountry { "ROM" } - LocaleID:int { 0x0418 } + Version{"1.2"} } diff --git a/icuSources/data/locales/root.txt b/icuSources/data/locales/root.txt index 36c556b4..cffd5547 100644 --- a/icuSources/data/locales/root.txt +++ b/icuSources/data/locales/root.txt @@ -1,951 +1,47 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/root.xml // * // *************************************************************************** -// Date Name Description -// 11/17/99 aliu Added support for transliterators. -// 01/15/2002 grhoten Synchronized the language and contry codes with ISO standards - -// *** Note: do NOT translate or modify (customize) this root locale. -// Instead, put translations in sub locales. - -root { - Version { "4.0" } - - // each variant name that occurs in locales should be listed with %% and a display string - "%%PREEURO" { "Pre-Euro" } // PREEURO variant display name - "%%EURO" { "Euro" } // PREEURO variant display name - "%%B" { "Bokm\u00e5l" } // Norwegian variant display name - "%%NY" { "Nynorsk" } // Norwegian variant display name - "%%AL" { "\u00C5land" } // Aland variant display name - - "%%POSIX" { "POSIX" } - - // variants for collation (traditional may also be used for traditional chinese) - "%%PHONEBOOK" { "Phonebook Order" } - "%%PINYIN" { "Pinyin Order" } - "%%TRADITIONAL" { "Traditional" } - "%%REVISED" { "Revised" } - "%%STROKE" { "Stroke Order" } - "%%DIRECT" { "Direct Order" } - - // this is a special tag that makes genrb include UCARules.txt for collation - "%%UCARULES" { "UCARules.txt"} // UCARules - - // Here are empty collation rules just for the consistency. UCA is used instead... 01/16/2001 by weiv - CollationElements { - Version { "x0.0" } - Sequence { "" } - } - // Formats for the display name of a locale, for a list of - // items, and for composing two items in a list into one item. - // The list patterns are used in the variant name and in the - // full display name. - // - // This is the language-neutral form of this resource. - // -// LocaleNamePatterns { -// { -// "{0,choice,0#|1#{1}|2#{1} ({2})}", // Display name -// "{0,choice,0#|1#{1}|2#{1},{2}|3#{1},{2},{3}}", // List -// "{0},{1}" // List composition -// } -// } - - //------------------------------------------------------------ - // BEGIN Transliterator support - //------------------------------------------------------------ - - // See also icu/source/data/translit/index.txt - - TransliteratorNamePattern { - // Format for the display name of a Transliterator. - // This is the language-neutral form of this resource. - "{0,choice,0#|1#{1}|2#{1}-{2}}" // Display name - } - - // Transliterator display names - // This is the English form of this resource. - "%Translit%Hex" { "Hex Escape" } - "%Translit%UnicodeName" { "Unicode Name" } - "%Translit%UnicodeChar" { "Unicode Character" } - - //------------------------------------------------------------ - // END Transliterator support - //------------------------------------------------------------ - - AmPmMarkers { - "AM", - "PM", - } - // The official list list of ISO-3166 country codes are located at: - // http://www.din.de/gremien/nas/nabd/iso3166ma/codlstp1/en_listp1.html - Countries { - //AA {} // Not in ISO-3166 standard - AD { "Andorra" } - AE { "United Arab Emirates" } - AF { "Afghanistan" } - AG { "Antigua and Barbuda" } - AI { "Anguilla" } - AL { "Albania" } - AM { "Armenia" } - AN { "Netherlands Antilles" } - AO { "Angola" } - AQ { "Antarctica" } - AR { "Argentina" } - AS { "American Samoa" } - AT { "Austria" } - AU { "Australia" } - AW { "Aruba" } - AZ { "Azerbaijan" } - - BA { "Bosnia and Herzegovina" } - BB { "Barbados" } - BD { "Bangladesh" } - BE { "Belgium" } - BF { "Burkina Faso" } - BG { "Bulgaria" } - BH { "Bahrain" } - BI { "Burundi" } - BJ { "Benin" } - BM { "Bermuda" } - BN { "Brunei" } - BO { "Bolivia" } - BR { "Brazil" } - BS { "Bahamas" } - BT { "Bhutan" } - BV { "Bouvet Island" } - BW { "Botswana" } - BY { "Belarus" } - BZ { "Belize" } - - CA { "Canada" } - CC { "Cocos Islands"} - CD { "Democratic Republic of the Congo" } - CF { "Central African Republic" } - CG { "Congo" } - CH { "Switzerland" } - CI { "C\u00F4te d'Ivoire" } - CK { "Cook Islands" } - CL { "Chile" } - CM { "Cameroon" } - CN { "China" } - CO { "Colombia" } - CR { "Costa Rica" } - CU { "Cuba" } - CV { "Cape Verde" } - CX { "Christmas Island" } - CY { "Cyprus" } - CZ { "Czech Republic" } - - DE { "Germany" } - DJ { "Djibouti" } - DK { "Denmark" } - DM { "Dominica" } - DO { "Dominican Republic" } - DZ { "Algeria" } - - EC { "Ecuador" } - EE { "Estonia" } - EG { "Egypt" } - EH { "Western Sahara" } - ER { "Eritrea" } - ES { "Spain" } - ET { "Ethiopia" } - - FI { "Finland" } - FJ { "Fiji" } - FK { "Falkland Islands" } - FM { "Micronesia" } - FO { "Faroe Islands" } - FR { "France" } - - GA { "Gabon" } - GB { "United Kingdom" } - GD { "Grenada" } - GE { "Georgia" } - GF { "French Guiana" } - GH { "Ghana" } - GI { "Gibraltar" } - GL { "Greenland" } - GM { "Gambia" } - GN { "Guinea" } - GP { "Guadeloupe" } - GQ { "Equatorial Guinea" } - GR { "Greece" } - GS { "South Georgia and South Sandwich Islands" } - GT { "Guatemala" } - GU { "Guam" } - GW { "Guinea-Bissau" } - GY { "Guyana" } - - HK { "Hong Kong S.A.R., China" } - HM { "Heard Island and McDonald Islands" } - HN { "Honduras" } - HR { "Croatia" } - HT { "Haiti" } - HU { "Hungary" } - - ID { "Indonesia" } - IE { "Ireland" } - IL { "Israel" } - IN { "India" } - IO { "British Indian Ocean Territory" } - IQ { "Iraq" } - IR { "Iran" } - IS { "Iceland" } - IT { "Italy" } - - JM { "Jamaica" } - JO { "Jordan" } - JP { "Japan" } - - KE { "Kenya" } - KG { "Kyrgyzstan" } - KH { "Cambodia" } - KI { "Kiribati" } - KM { "Comoros" } - KN { "Saint Kitts and Nevis" } - KP { "North Korea" } - KR { "South Korea" } - KW { "Kuwait" } - KY { "Cayman Islands" } - KZ { "Kazakhstan" } - - LA { "Laos" } - LB { "Lebanon" } - LC { "Saint Lucia" } - LI { "Liechtenstein" } - LK { "Sri Lanka" } - LR { "Liberia" } - LS { "Lesotho" } - LT { "Lithuania" } - LU { "Luxembourg" } - LV { "Latvia" } - LY { "Libya" } - - MA { "Morocco" } - MC { "Monaco" } - MD { "Moldova" } - MG { "Madagascar" } - MH { "Marshall Islands"} - MK { "Macedonia" } - ML { "Mali" } - MM { "Myanmar" } - MN { "Mongolia" } - MO { "Macao S.A.R., China" } - MP { "Northern Mariana Islands"} - MQ { "Martinique" } - MR { "Mauritania" } - MS { "Montserrat" } - MT { "Malta" } - MU { "Mauritius" } - MV { "Maldives" } - MW { "Malawi" } - MX { "Mexico" } - MY { "Malaysia" } - MZ { "Mozambique" } - - NA { "Namibia" } - NC { "New Caledonia" } - NE { "Niger" } - NF { "Norfolk Island" } - NG { "Nigeria" } - NI { "Nicaragua" } - NL { "Netherlands" } - NO { "Norway" } - NP { "Nepal" } - NR { "Nauru" } - NU { "Niue" } - NZ { "New Zealand" } - - OM { "Oman" } - - PA { "Panama" } - PE { "Peru" } - PF { "French Polynesia" } - PG { "Papua New Guinea" } - PH { "Philippines" } - PK { "Pakistan" } - PL { "Poland" } - PM { "Saint Pierre and Miquelon" } - PN { "Pitcairn" } - PR { "Puerto Rico" } - PS { "Palestinian Territory" } - PT { "Portugal" } - PW { "Palau" } - PY { "Paraguay" } - - QA { "Qatar" } - - RE { "R\u00E9union" } - RO { "Romania" } - RU { "Russia" } - RW { "Rwanda" } - - SA { "Saudi Arabia" } - SB { "Solomon Islands" } - SC { "Seychelles" } - SD { "Sudan" } - SE { "Sweden" } - SG { "Singapore" } - SH { "Saint Helena" } - SI { "Slovenia" } - SJ { "Svalbard and Jan Mayen" } - SK { "Slovakia" } - SL { "Sierra Leone" } - SM { "San Marino" } - SN { "Senegal" } - SO { "Somalia" } - SP { "Serbia" } - SR { "Suriname" } - ST { "Sao Tome and Principe" } - SV { "El Salvador" } - SY { "Syria" } - SZ { "Swaziland" } - - TC { "Turks and Caicos Islands" } - TD { "Chad" } - TF { "French Southern Territories" } - TG { "Togo" } - TH { "Thailand" } - TJ { "Tajikistan" } - TK { "Tokelau" } - TM { "Turkmenistan" } - TN { "Tunisia" } - TO { "Tonga" } - TL { "Timor-Leste" } // This was called East Timor - TR { "Turkey" } - TT { "Trinidad and Tobago" } - TV { "Tuvalu" } - TW { "Taiwan" } - TZ { "Tanzania" } - - UA { "Ukraine" } - UG { "Uganda" } - UM { "United States Minor Outlying Islands" } - US { "United States" } - UY { "Uruguay" } - UZ { "Uzbekistan" } - - VA { "Vatican" } - VC { "Saint Vincent and the Grenadines" } - VE { "Venezuela" } - VG { "British Virgin Islands" } - VI { "U.S. Virgin Islands" } - VN { "Vietnam" } - VU { "Vanuatu" } - - WF { "Wallis and Futuna" } - WS { "Samoa" } - - YE { "Yemen" } - YT { "Mayotte" } - YU { "Yugoslavia" } - - ZA { "South Africa" } -// ZR { "Zaire" } - ZM { "Zambia" } - ZW { "Zimbabwe" } - } - DateTimeElements:intvector { - 1, - 1, - } - DateTimePatterns { - "h:mm:ss a z", - "h:mm:ss a z", - "h:mm:ss a", - "h:mm a", - "EEEE, MMMM d, yyyy", - "MMMM d, yyyy", - "MMM d, yyyy", - "M/d/yy", // Changing this will break binary compatibility. - "{1} {0}", - } - DayAbbreviations { - "Sun", - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - } - DayNames { - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday", - } - Eras { - "BC", - "AD", - } - // If there is a two letter abbreviation (ISO-639-1) for a three letter - // abbreviation (ISO-639-2), the two letter abbreviation must be used. - // Source: http://lcweb.loc.gov/standards/iso639-2/englangn.html - Languages { - root{"Root"} // The only exception to ISO-639 - - aa { "Afar" } - ab { "Abkhazian" } - ace { "Achinese" } - ach { "Acoli" } - ada { "Adangme" } - ae { "Avestan" } - af { "Afrikaans" } - afa { "Afro-Asiatic (Other)" } - afh { "Afrihili" } - ak { "Akan" } - akk { "Akkadien" } - ale { "Aleut" } - alg { "Algonquian Languages" } - am { "Amharic" } - ang { "English, Old (ca.450-1100)" } - apa { "Apache Languages"} - ar { "Arabic" } - arc { "Aramaic" } - arn { "Araucanian" } - arp { "Arapaho" } - art { "Artificial (Other)" } - arw { "Arawak" } - as { "Assamese" } - ast { "Asturian" } - ath { "Athapascan Languages" } - aus { "Australian Languages" } - av { "Avaric" } - awa { "Awadhi" } - ay { "Aymara" } - az { "Azerbaijani" } - ba { "Bashkir" } - bad { "Banda" } - bai { "Bamileke Languages" } - bal { "Baluchi" } - bam { "Bambara" } - ban { "Balinese" } - bas { "Basa" } - bat { "Baltic (Other)" } - be { "Belarusian" } - bej { "Beja" } - bem { "Bemba" } - ber { "Berber" } - bg { "Bulgarian" } - bh { "Bihari" } - bho { "Bhojpuri" } - bi { "Bislama" } - bik { "Bikol" } - bin { "Bini" } - bla { "Siksika" } // Blackfoot - bm { "Bambara" } - bn { "Bengali" } - bnt { "Bantu" } - bo { "Tibetan" } - br { "Breton" } - bra { "Braj" } - bs { "Bosnian"} - btk { "Batak" } - bua { "Buriat" } - bug { "Buginese" } - ca { "Catalan" } - cad { "Caddo" } - cai { "Central American Indian (Other)" } - car { "Carib" } - cau { "Caucasian (Other)" } - ce { "Chechen" } - ceb { "Cebuano" } - cel { "Celtic (Other)" } - ch { "Chamorro" } - chb { "Chibcha" } - chg { "Chagatai" } - chk { "Chuukese" } - chm { "Mari" } - chn { "Chinook Jargon" } - cho { "Choctaw" } - chp { "Chipewyan" } - chr { "Cherokee" } - chy { "Cheyenne" } - cmc { "Chamic Languages" } - co { "Corsican" } - cop { "Coptic" } - cpe { "Creoles and Pidgins, English-based (Other)" } - cpf { "Creoles and Pidgins, French-based (Other)" } - cpp { "Creoles and pidgins, Portuguese-based (Other)" } - cr { "Cree" } - crp { "Creoles and Pidgins (Other)" } - cs { "Czech" } - cu { "Church Slavic" } - cus { "Cushitic (Other)" } - cv { "Chuvash" } - cy { "Welsh" } - da { "Danish" } - dak { "Dakota" } - dar { "Dargwa" } - day { "Dayak" } - de { "German" } - del { "Delaware" } - den { "Slave" } - dgr { "Dogrib" } - din { "Dinka" } - //div { "Divehi" } // Use dv instead - doi { "Dogri" } - dra { "Dravidian (Other)" } - dua { "Duala" } - dum { "Dutch, Middle (ca. 1050-1350)" } - dv { "Divehi" } - dyu { "Dyula" } - dz { "Dzongkha" } - ee { "Ewe" } - efi { "Efik" } - egy { "Egyptian (Ancient)" } - eka { "Ekajuk" } - el { "Greek" } // Modern (1453-) - elx { "Elamite" } - en { "English" } - enm { "English, Middle (1100-1500)" } - eo { "Esperanto" } - es { "Spanish" } - et { "Estonian" } - eu { "Basque" } - ewo { "Ewondo" } - fa { "Persian" } - fan { "Fang" } - fat { "Fanti" } - ff { "Fulah" } - fi { "Finnish" } - fiu { "Finno - Ugrian (Other)" } - fj { "Fijian" } - fo { "Faroese" } - fon { "Fon" } - fr { "French" } - frm { "French, Middle (ca.1400-1600)" } - fro { "French, Old (842-ca.1400)" } - fur { "Friulian" } - fy { "Frisian" } - ga { "Irish" } - gaa { "Ga" } - gay { "Gayo" } - gba { "Gbaya" } - gd { "Scottish Gaelic" } - gem { "Germanic (Other)" } - gez { "Geez" } - gil { "Gilbertese" } - gl { "Gallegan" } - gla { "Gaelic (Scots)" } - gmh { "German, Middle High (ca.1050-1500)" } - gn { "Guarani" } - goh { "German, Old High (ca.750-1050)" } - gon { "Gondi" } - gor { "Gorontalo" } - got { "Gothic" } - grb { "Gerbo" } - grc { "Greek, Ancient (to 1453)" } - gu { "Gujarati" } - gv { "Manx" } - gwi { "Gwich'in" } - hai { "Haida" } - ha { "Hausa" } - haw { "Hawaiian" } - he { "Hebrew" } - hi { "Hindi" } - hil { "Hiligaynon" } - him { "Himachali" } - hit { "Hittite" } - hmn { "Hmong" } - ho { "Hiri Motu" } - hr { "Croatian" } - hu { "Hungarian" } - hup { "Hupa" } - hy { "Armenian" } - hz { "Herero" } - ia { "Interlingua" } - iba { "Iban" } - id { "Indonesian" } - ie { "Interlingue" } - ig { "Igbo" } - ii { "Sichuan Yi" } - ijo { "Ijo" } - ik { "Inupiaq" } - ilo { "Iloko" } - //in { "Indonesian" } // Use id instead - inc { "Indic (Other)" } - ine { "Indo-European (Other)" } - inh { "Ingush" } - io { "Ido" } - ira { "Iranian" } - iro { "Iroquoian languages" } - is { "Icelandic" } - it { "Italian" } - iu { "Inuktitut" } - iw { "Hebrew" } // Use he instead - ja { "Japanese" } - //ji { "Yiddish" } // Use yi instead - jpr { "Judeo-Persian" } - jrb { "Judeo-Arabic" } - jv { "Javanese" } - //jw { "Javanese" } // Use jv instead - ka { "Georgian" } - kaa { "Kara-Kalpak" } - kab { "Kabyle" } - kac { "Kachin" } - kam { "Kamba" } - kar { "Karen" } - kaw { "Kawi" } - kbd { "Kabardian" } - kg { "Kongo" } - kha { "Khasi" } - khi { "Khoisan (Other)" } - kho { "Khotanese" } - ki { "Kikuyu" } - kj { "Kuanyama" } - kk { "Kazakh" } - kl { "Kalaallisut" } - km { "Khmer" } - kmb { "Kimbundu" } - kn { "Kannada" } - ko { "Korean" } - kok { "Konkani" } - kos { "Kosraean" } - kpe { "Kpelle" } - kr { "Kanuri" } - kro { "Kru" } - kru { "Kurukh" } - ks { "Kashmiri" } - ku { "Kurdish" } - kum { "Kumyk" } - kut { "Kutenai" } - kv { "Komi" } - kw { "Cornish" } - ky { "Kirghiz" } - la { "Latin" } - lad { "Ladino" } - lah { "Lahnda" } - lam { "Lamba" } - lb { "Luxembourgish" } - lez { "Lezghian" } - lg { "Ganda" } - lin { "Lingala" } - li { "Limburgish" } - lit { "Lithuanian" } - ln { "Lingala" } - lo { "Lao" } - lol { "Mongo" } - loz { "Lozi" } - lt { "Lithuanian" } - lu { "Luba-Katanga" } - lua { "Luba-Lulua" } - lui { "Luiseno" } - lun { "Lunda" } - luo { "Luo" } - lus { "Lushai" } - lv { "Latvian" } - mad { "Madurese" } - mag { "Magahi" } - mai { "Maithili" } - mak { "Makasar" } - man { "Mandingo" } - map { "Austronesian" } - mas { "Masai" } - mdr { "Mandar" } - men { "Mende" } - mg { "Malagasy" } - mga { "Irish, Middle (900-1200)" } - mh { "Marshallese"} - mi { "Maori" } - mic { "Micmac" } - min { "Minangkabau" } - mis { "Miscellaneous Languages" } - mk { "Macedonian" } - mkh { "Mon-Khmer (Other)" } - ml { "Malayalam" } - mn { "Mongolian" } - mnc { "Manchu" } - mni { "Manipuri" } - mno { "Manobo Languages" } - mo { "Moldavian" } - moh { "Mohawk" } - mos { "Mossi" } - mr { "Marathi" } - ms { "Malay" } - mt { "Maltese" } - mul { "Multiple Languages" } - mun { "Munda Languages" } - mus { "Creek" } - mwr { "Marwari" } - my { "Burmese" } - myn { "Mayan" } - na { "Nauru" } - nah { "Nahuatl" } - nai { "North American Indian (Other)" } - nap { "Neapolitan" } - nb { "Norwegian Bokm\u00e5l" } - nd { "Ndebele, North" } - nds { "Low German; Low Saxon" } - ne { "Nepali" } - new { "Newari" } - ng { "Ndonga" } - nia { "Nias" } - nic { "Niger - Kordofanian (Other)" } - niu { "Niuean" } - nl { "Dutch" } - nn { "Norwegian Nynorsk" } - no { "Norwegian" } - non { "Norse, Old" } - nr { "Ndebele, South" } - nso { "Sotho, Northern" } - nub { "Nubian Languages" } - nv { "Navajo"} - ny { "Nyanja; Chichewa; Chewa" } - nym { "Nyamwezi" } - nyn { "Nyankole" } - nyo { "Nyoro" } - nzi { "Nzima" } - oc { "Occitan (post 1500); Proven\u00E7al"} - oj { "Ojibwa" } - om { "Oromo" } - or { "Oriya" } - os { "Ossetic" } - osa { "Osage" } - ota { "Turkish, Ottoman (1500-1928)" } - oto { "Otomian Languages" } - pa { "Punjabi" } - paa { "Papuan (Other)" } - pag { "Pangasinan" } - pal { "Pahlavi" } - pam { "Pampanga" } - pap { "Papiamento" } - pau { "Palauan" } - peo { "Persian Old (ca.600-400 B.C.)" } - phi { "Philippine (Other)" } - phn { "Phoenician" } - pi { "Pali" } - pl { "Polish" } - pon { "Pohnpeian" } - pra { "Prakrit Languages" } - pro { "Proven\u00E7al, Old (to 1500)" } - ps { "Pashto (Pushto)" } - pt { "Portuguese" } - qu { "Quechua" } - // The range qaa-qtz is reserved for local use. - raj { "Rajasthani" } - rap { "Rapanui" } - rar { "Rarotongan" } - rm { "Rhaeto-Romance" } - rn { "Rundi" } - ro { "Romanian" } - roa { "Romance (Other)" } - rom { "Romany" } - ru { "Russian" } - rw { "Kinyarwanda" } - sa { "Sanskrit" } - sad { "Sandawe" } - sah { "Yakut" } - sai { "South American Indian (Other)" } - sal { "Salishan languages" } - sam { "Samaritan Aramaic" } - sas { "Sasak" } - sat { "Santali" } - sc { "Sardinian" } - sco { "Scots" } - sd { "Sindhi" } - se { "Northern Sami" } - sel { "Selkup" } - sem { "Semitic (Other)" } - sg { "Sango" } - sga { "Irish, Old (to 900)" } - sgn { "Sign Languages" } - sh { "Serbo-Croatian" } - shn { "Shan" } - si { "Sinhalese" } - sid { "Sidamo" } - sio { "Siouan Languages" } - sit { "Sino-Tibetan (Other)" } - sk { "Slovak" } - sl { "Slovenian" } - sla { "Slavic (Other)" } - sm { "Samoan" } - sma { "Southern Sami" } - smi { "Sami languages (Other)" } - smj { "Lule Sami" } - smn { "Inari Sami" } - sms { "Skolt Sami" } - sn { "Shona" } - snk { "Soninke" } - so { "Somali" } - sog { "Sogdien" } - son { "Songhai" } - sq { "Albanian" } - sr { "Serbian" } - srr { "Serer" } - ss { "Swati" } - ssa { "Nilo-Saharam (Other)" } - st { "Sotho, Southern" } - su { "Sundanese" } - suk { "Sukuma" } - sus { "Susu" } - sux { "Sumerian"} - sv { "Swedish" } - sw { "Swahili" } - syr { "Syriac" } - ta { "Tamil" } - tai { "Tai (Other)" } - te { "Telugu" } - tem { "Timne" } - ter { "Tereno" } - tet { "Tetum" } - tg { "Tajik" } - th { "Thai" } - tig { "Tigre" } - ti { "Tigrinya" } - tiv { "Tiv" } - tk { "Turkmen" } - tkl { "Tokelau" } - tl { "Tagalog" } - tli { "Tlingit" } - tmh { "Tamashek" } - tn { "Tswana" } - tog { "Tonga (Nyasa)" } - to { "Tonga (Tonga Islands)" } - tpi { "Tok Pisin" } - tr { "Turkish" } - ts { "Tsonga" } - tsi { "Tsimshian" } - tt { "Tatar" } - tum { "Tumbuka" } - tup { "Tupi languages" } - tur { "Turkish" } - tut { "Altaic (Other)" } - tvl { "Tuvalu" } - tw { "Twi" } - ty { "Tahitian" } - tyv { "Tuvinian" } - ug { "Uighur" } - uga { "Ugaritic" } - uk { "Ukrainian" } - umb { "Umbundu" } - und { "Undetermined" } - ur { "Urdu" } - uz { "Uzbek" } - vai { "Vai" } - ve { "Venda" } - vi { "Vietnamese" } - vo { "Volap\u00FCk" } // Yes the iso-639 standard uses the umlaut in the English name - vot { "Votic" } - wa { "Walloon" } - wak { "Wakashan Languages" } - wal { "Walamo" } - war { "Waray" } - was { "Washo" } - wen { "Sorbian Languages" } - wo { "Wolof" } - xh { "Xhosa" } - yao { "Yao" } - yap { "Yapese" } - yi { "Yiddish" } - yo { "Yoruba" } - ypk { "Yupik Languages" } - za { "Zhuang" } - zap { "Zapotec" } - zen { "Zenaga" } - zh { "Chinese" } - znd { "Zande" } - zu { "Zulu" } - zun { "Zuni" } - } - - // Localized display names of currencies, analogous to Countries - // and Languages. "Common usage" display names are listed here in - // root. Only a few unique symbols should be listed here. "$", - // for example, is used to indicate not only USD, but also ARS, - // AUD, BND, CAD, CLP, COP, JDF, ETB, MXN, NZD, and SOS. Hoever, - // its default meaning in many locales is USD, so we list it here - // and override it in sublocales that use "$" for something else. - // @since ICU 2.2 - Currencies { - EUR { "\u20AC", "EUR" } // Euro - GBP { "\u00A3", "GBP" } // British Pound Sterling - INR { "=0#Rs.|1#Re.|1 source: ../../../locale/icu/main/root.xml + */ +root{ + Currencies{ + EUR{ + "€", + "EUR", + } + GBP{ + "£", + "GBP", + } + INR{ + "=0#Rs.|1#Re.|1>];\n" - "30: \u0442\u0440\u043b\u0434\u0446\u0430\u0442\u044c[ >>];\n" - "40: \u0441\u043e\u0440\u043e\u043a[ >>];\n" - "50: \u043f\u044f\u0442\u044c\u0434\u0435\u0441\u044f\u0442[ >>];\n" - "60: \u0448\u0435\u0441\u0442\u044c\u0434\u0435\u0441\u044f\u0442[ >>];\n" - "70: \u0441\u0435\u043c\u044c\u0434\u0435\u0441\u044f\u0442[ >>];\n" - "80: \u0432\u043e\u0441\u0435\u043c\u044c\u0434\u0435\u0441\u044f\u0442[ >>];\n" - "90: \u0434\u0435\u0432\u044f\u043d\u043e\u0441\u0442\u043e[ >>];\n" - "100: \u0441\u0442\u043e[ >>];\n" - "200: << \u0441\u0442\u043e[ >>];\n" - "1000: \u0442\u044b\u0441\u044f\u0447\u0430[ >>];\n" - "2000: << \u0442\u044b\u0441\u044f\u0447\u0430[ >>];\n" - "1,000,000: \u043c\u0438\u043b\u043b\u0438\u043e\u043d[ >>];\n" - "2,000,000: << \u043c\u0438\u043b\u043b\u0438\u043e\u043d[ >>];\n" - "1,000,000,000: =#,##0=;" - } - - // Currency display names - Currencies { - RUR { "\u0440.", "RUR" } - UAH { "\u0433\u0440\u043D.", "UAH" } - } -} +// *************************************************************************** +// * +// * Copyright (C) 2005 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ru.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/ru.xml + */ +ru{ + Countries{ + AD{"Андорра"} + AE{"Объединенные Арабские Эмираты"} + AF{"Афганистан"} + AG{"Антигуа и Барбуда"} + AI{"Ангуилла"} + AL{"Албания"} + AM{"Армения"} + AN{"Голландские Антильские Острова"} + AO{"Ангола"} + AQ{"Антарктида"} + AR{"Аргентина"} + AS{"Американское Самоа"} + AT{"Австрия"} + AU{"Австралия"} + AW{"Аруба"} + AZ{"Азербайджан"} + BA{"Босния"} + BB{"Барбадос"} + BD{"Бангладеш"} + BE{"Бельгия"} + BF{"Буркина Фасо"} + BG{"Болгария"} + BH{"Бахрейн"} + BI{"Бурунди"} + BJ{"Бенин"} + BM{"Бермудские Острова"} + BN{"Бруней Даруссалам"} + BO{"Боливия"} + BR{"Бразилия"} + BS{"Багамские острова"} + BT{"Бутан"} + BV{"Остров Буве"} + BW{"Ботсвана"} + BY{"Беларусь"} + BZ{"Белиз"} + CA{"Канада"} + CC{"Кокосовые Острова (Киилинг)"} + CD{"Конго, Демократическая Республика"} + CF{"Центрально-Африканская Республика"} + CG{"Конго"} + CH{"Швейцария"} + CI{"Кот д’Ивуар"} + CK{"Острова Кука"} + CL{"Чили"} + CM{"Камерун"} + CN{"Китай"} + CO{"Колумбия"} + CR{"Коста-Рика"} + CU{"Куба"} + CV{"Острова Зеленого Мыса"} + CX{"Остров Рождества"} + CY{"Кипр"} + CZ{"Чешская Республика"} + DE{"Германия"} + DJ{"Джибути"} + DK{"Дания"} + DM{"Остров Доминика"} + DO{"Доминиканская Республика"} + DZ{"Алжир"} + EC{"Эквадор"} + EE{"Эстония"} + EG{"Египет"} + EH{"Западная Сахара"} + ER{"Эритрея"} + ES{"Испания"} + ET{"Эфиопия"} + FI{"Финляндия"} + FJ{"Фиджи"} + FK{"Фольклендские Острова"} + FM{"Федеративное Государство Микронезия"} + FO{"Фарерские острова"} + FR{"Франция"} + GA{"Габон"} + GB{"Великобритания"} + GD{"Гренада"} + GE{"Грузия"} + GF{"Французская Гвиана"} + GH{"Гана"} + GI{"Гибралтар"} + GL{"Гренландия"} + GM{"Гамбия"} + GN{"Гвинея"} + GP{"Гваделупа"} + GQ{"Экваториальная Гвинея"} + GR{"Греция"} + GS{"Южная Джорджия и Южные Сандвичевы Острова"} + GT{"Гватемала"} + GU{"Гуам"} + GW{"Гвинея-Биссау"} + GY{"Гайана"} + HK{"Гонконг (Область с Особым Административным Управлением, Китай)"} + HM{"Острова Херд и Мак-Дональд"} + HN{"Гондурас"} + HR{"Хорватия"} + HT{"Гаити"} + HU{"Венгрия"} + ID{"Индонезия"} + IE{"Ирландия"} + IL{"Израиль"} + IN{"Индия"} + IO{"Британские Территории в Индийском Океане"} + IQ{"Ирак"} + IR{"Иран"} + IS{"Исландия"} + IT{"Италия"} + JM{"Ямайка"} + JO{"Иордания"} + JP{"Япония"} + KE{"Кения"} + KG{"Кыргызстан"} + KH{"Камбоджа"} + KI{"Кирибати"} + KM{"Коморские Острова"} + KN{"Сент-Киттс и Невис"} + KP{"Северная Корея"} + KR{"Южная Корея"} + KW{"Кувейт"} + KY{"Каймановы Острова"} + KZ{"Казахстан"} + LA{"Лаос"} + LB{"Ливан"} + LC{"Сент-Люсия"} + LI{"Лихтенштейн"} + LK{"Шри-Ланка"} + LR{"Либерия"} + LS{"Лесото"} + LT{"Литва"} + LU{"Люксембург"} + LV{"Латвия"} + LY{"Ливия"} + MA{"Марокко"} + MC{"Монако"} + MD{"Молдова"} + MG{"Мадагаскар"} + MH{"Маршалловы Острова"} + MK{"Македония"} + ML{"Мали"} + MM{"Майанмар"} + MN{"Монголия"} + MO{"Макао (Область с Особым Административным Управлением, Китай)"} + MP{"Северные Марианские Острова"} + MQ{"Мартиник"} + MR{"Мавритания"} + MS{"Монсеррат"} + MT{"Мальта"} + MU{"Маврикий"} + MV{"Мальдивы"} + MW{"Малави"} + MX{"Мексика"} + MY{"Малайзия"} + MZ{"Мозамбик"} + NA{"Намибия"} + NC{"Новая Каледония"} + NE{"Нигер"} + NF{"Остров Норфолк"} + NG{"Нигерия"} + NI{"Никарагуа"} + NL{"Нидерланды"} + NO{"Норвегия"} + NP{"Непал"} + NR{"Науру"} + NU{"Ниуе"} + NZ{"Новая Зеландия"} + OM{"Оман"} + PA{"Панама"} + PE{"Перу"} + PF{"Французская Полинезия"} + PG{"Папуа-Новая Гвинея"} + PH{"Филиппины"} + PK{"Пакистан"} + PL{"Польша"} + PM{"Сен-Пьер и Микелон"} + PN{"Остров Питкэрн"} + PR{"Пуэрто-Рико"} + PS{"Палестинская автономия"} + PT{"Португалия"} + PW{"Палау"} + PY{"Парагвай"} + QA{"Катар"} + RE{"Реюньон"} + RO{"Румыния"} + RU{"Россия"} + RW{"Руанда"} + SA{"Саудовская Аравия"} + SB{"Соломоновы Острова"} + SC{"Сейшельские Острова"} + SD{"Судан"} + SE{"Швеция"} + SG{"Сингапур"} + SH{"Остров Святой Елены"} + SI{"Словения"} + SJ{"Острова Свалбард и Жан Майен"} + SK{"Словакия"} + SL{"Сьерра-Леоне"} + SM{"Сан-Марино"} + SN{"Сенегал"} + SO{"Сомали"} + SP{"Сербия"} + SR{"Суринам"} + ST{"Сан-Томе и Принсипи"} + SV{"Сальвадор"} + SY{"Сирийская Арабская Республика"} + SZ{"Свазиленд"} + TC{"Острова Туркс и Кайкос"} + TD{"Чад"} + TF{"Французские Южные Территории"} + TG{"Того"} + TH{"Таиланд"} + TJ{"Таджикистан"} + TK{"Токелау"} + TL{"Восточный Тимор"} + TM{"Туркменистан"} + TN{"Тунис"} + TO{"Тонга"} + TR{"Турция"} + TT{"Тринидад и Тобаго"} + TV{"Тувалу"} + TW{"Тайвань"} + TZ{"Танзания"} + UA{"Украина"} + UG{"Уганда"} + UM{"Внешние малые острова (США)"} + US{"Соединенные Штаты"} + UY{"Уругвай"} + UZ{"Узбекистан"} + VA{"Государство-город Ватикан"} + VC{"Сент-Винсент и Гренадины"} + VE{"Венесуэла"} + VG{"Британские Виргинские Острова"} + VI{"Американские Виргинские Острова"} + VN{"Вьетнам"} + VU{"Вануату"} + WF{"Эллис и Футуна"} + WS{"Самоа"} + YE{"Йемен"} + YT{"Майотта"} + YU{"Югославия"} + ZA{"Южная Африка"} + ZM{"Замбия"} + ZW{"Зимбабве"} + } + Currencies{ + ADP{ + "ADP", + "Андоррская песета", + } + AED{ + "AED", + "Дирхам (ОАЭ)", + } + AFA{ + "AFA", + "Афгани (1927-2002)", + } + AMD{ + "dram", + "Армянский драм", + } + ANG{ + "NA f.", + "Нидерландский антильский гульден", + } + AON{ + "AON", + "Новая кванза", + } + ARS{ + "Arg$", + "Аргентинское песо", + } + AUD{ + "$A", + "Австралийский доллар", + } + AWG{ + "AWG", + "Арубанский гульден", + } + AZM{ + "AZM", + "Азербайджанский манат", + } + BBD{ + "BDS$", + "Барбадосский доллар", + } + BEF{ + "BF", + "Бельгийский франк", + } + BGL{ + "lev", + "Лев", + } + BGN{ + "BGN", + "Болгарский лев", + } + BHD{ + "BD", + "Бахрейнский динар", + } + BIF{ + "Fbu", + "Бурундийский франк", + } + BMD{ + "Ber$", + "Бермудский доллар", + } + BND{ + "BND", + "Брунейский доллар", + } + BOB{ + "Bs", + "Боливиано", + } + BRL{ + "R$", + "Бразильский реал", + } + BRR{ + "BRR", + "Крузейро реал", + } + BSD{ + "BSD", + "Багамский доллар", + } + BTN{ + "Nu", + "Нгултрум", + } + BYB{ + "BYB", + "Белорусский рубль (1994-1999)", + } + BYL{ + "BYL", + "Белорусский рубль (1992-1994)", + } + BYR{ + "Rbl", + "Белорусский рубль", + } + BZD{ + "BZ$", + "Белизский доллар", + } + CAD{ + "Can$", + "Канадский доллар", + } + CDF{ + "CDF", + "Конголезский франк", + } + CHF{ + "SwF", + "Швейцарский франк", + } + CLP{ + "Ch$", + "Чилийское песо", + } + CNY{ + "Y", + "Китайский юань", + } + COP{ + "Col$", + "Колумбийское песо", + } + CRC{ + "C", + "Костариканский колон", + } + CUP{ + "CUP", + "Кубинское песо", + } + CYP{ + "£C", + "Кипрский фунт", + } + CZK{ + "CZK", + "Чешская крона", + } + DEM{ + "DEM", + "Немецкая марка", + } + DJF{ + "DF", + "Франк Джибути", + } + DKK{ + "DKr", + "Датская крона", + } + DOP{ + "RD$", + "Доминиканское песо", + } + DZD{ + "DA", + "Алжирский динар", + } + EGP{ + "EGP", + "Египетский фунт", + } + ERN{ + "ERN", + "Накфа", + } + ETB{ + "Br", + "Эфиопский быр", + } + EUR{ + "€", + "Евро", + } + FJD{ + "F$", + "Доллар Фиджи", + } + FKP{ + "FKP", + "Фунт Фолклендских островов", + } + FRF{ + "FRF", + "Французский франк", + } + GEK{ + "GEK", + "Грузинский купон", + } + GEL{ + "lari", + "Грузинский лари", + } + GIP{ + "GIP", + "Гибралтарский фунт", + } + GNF{ + "GF", + "Гвинейский франк", + } + GYD{ + "G$", + "Гайанский доллар", + } + HKD{ + "HK$", + "Гонконгский доллар", + } + HRD{ + "HRD", + "Хорватский динар", + } + IEP{ + "IR£", + "Ирландский фунт", + } + IQD{ + "ID", + "Иракский динар", + } + IRR{ + "RI", + "Иранский риал", + } + ISK{ + "ISK", + "Исландская крона", + } + ITL{ + "₤", + "Итальянская лира", + } + JMD{ + "J$", + "Ямайский доллар", + } + JOD{ + "JD", + "Иорданский динар", + } + KES{ + "K Sh", + "Кенийский шиллинг", + } + KMF{ + "CF", + "Франк Коморских островов", + } + KWD{ + "KD", + "Кувейтский динар", + } + KYD{ + "KYD", + "Доллар Каймановых островов", + } + LBP{ + "LL", + "Ливанский фунт", + } + LRD{ + "LRD", + "Либерийский доллар", + } + LSL{ + "M", + "Лоти", + } + LTL{ + "LTL", + "Литовский лит", + } + LUF{ + "LUF", + "Люксембургский франк", + } + LVL{ + "LVL", + "Латвийский лат", + } + LYD{ + "LD", + "Ливийский динар", + } + MAD{ + "MAD", + "Марокканский дирхам", + } + MDL{ + "MDL", + "Молдавский лей", + } + MGF{ + "MGF", + "Малагасийский франк", + } + MTL{ + "Lm", + "Мальтийская лира", + } + MUR{ + "MUR", + "Маврикийская рупия", + } + MWK{ + "MK", + "Квача (малавийская)", + } + MXN{ + "MEX$", + "Мексиканское новое песо", + } + NAD{ + "N$", + "Доллар Намибии", + } + NIO{ + "NIO", + "Золотая кордоба", + } + NLG{ + "NLG", + "Нидерландский гульден", + } + NOK{ + "NKr", + "Норвежская крона", + } + NPR{ + "Nrs", + "Непальская рупия", + } + NZD{ + "$NZ", + "Новозеландский доллар", + } + OMR{ + "RO", + "Оманский риал", + } + PGK{ + "PGK", + "Кина", + } + PHP{ + "PHP", + "Филиппинское песо", + } + PKR{ + "Pra", + "Пакистанская рупия", + } + PLN{ + "Zl", + "Польский злотый", + } + PLZ{ + "PLZ", + "Злотый", + } + PTE{ + "PTE", + "Португальское эскудо", + } + QAR{ + "QR", + "Катарский риал", + } + RUB{ + "RUB", + "Российский рубль", + } + RUR{ + "р.", + "Российский рубль (1991-1998)", + } + RWF{ + "RWF", + "Франк Руанды", + } + SAR{ + "SRl", + "Саудовский риал", + } + SBD{ + "SI$", + "Доллар Соломоновых островов", + } + SCR{ + "SR", + "Сейшельская рупия", + } + SDD{ + "SDD", + "Суданский динар", + } + SEK{ + "SKr", + "Шведская крона", + } + SGD{ + "S$", + "Сингапурский доллар", + } + SHP{ + "SHP", + "Фунт острова Святой Елены", + } + SKK{ + "Sk", + "Словацкая крона", + } + SLL{ + "SLL", + "Леоне", + } + SOS{ + "So. Sh.", + "Сомалийский шиллинг", + } + SRG{ + "Sf", + "Суринамский гульден", + } + STD{ + "Db", + "Добра", + } + SVC{ + "SVC", + "Сальвадорский колон", + } + SYP{ + "LS", + "Сирийский фунт", + } + TJR{ + "TJR", + "Таджикский рубль", + } + TJS{ + "TJS", + "Таджикский сомони", + } + TND{ + "TND", + "Тунисский динар", + } + TOP{ + "T$", + "Паанга", + } + TPE{ + "TPE", + "Тиморское эскудо", + } + TRL{ + "TL", + "Турецкая лира", + } + TRY{ + "TRY", + "Новая турецкая лира", + } + TTD{ + "TT$", + "Доллар Тринидада и Тобаго", + } + TWD{ + "NT$", + "Новый тайваньский доллар", + } + TZS{ + "T Sh", + "Танзанийский шиллинг", + } + UAH{ + "грн.", + "Украинская гривна", + } + UAK{ + "UAK", + "Карбованец (украинский)", + } + UGS{ + "UGS", + "Угандийский шиллинг", + } + USD{ + "US$", + "Доллар США", + } + UYP{ + "UYP", + "Уругвайское песо", + } + UZS{ + "UZS", + "Узбекский сум", + } + VUV{ + "VT", + "Вату", + } + WST{ + "WST", + "Тала", + } + XAF{ + "XAF", + "Франк КФА ВЕАС", + } + XAU{ + "XAU", + "Золото", + } + XDR{ + "XDR", + "СДР (специальные права заимствования)", + } + XEU{ + "XEU", + "ЭКЮ (единица европейской валюты)", + } + XOF{ + "XOF", + "Франк КФА ВСЕАО", + } + XPF{ + "CFPF", + "Франк КФП", + } + YER{ + "YRl", + "Йеменский риал", + } + YUN{ + "YUN", + "Югославский динар", + } + ZAR{ + "R", + "Рэнд", + } + ZMK{ + "ZMK", + "Квача (замбийская)", + } + ZRN{ + "ZRN", + "Новый заир", + } + ZWD{ + "Z$", + "Доллар Зимбабве", + } + } + ExemplarCharacters{"[а-я ё і ѣ ѳ ѵ]"} + Keys{ + calendar{"Календарь"} + collation{"Сортировка"} + currency{"Валюта"} + } + Languages{ + aa{"Афар"} + ab{"Абхазский"} + ace{"Ачехский"} + ach{"Ачоли"} + ada{"Адангме"} + ady{"Адыгейский"} + af{"Африкаанс"} + afa{"Афразийские (другие)"} + afh{"Африхили"} + akk{"Аккадский"} + ale{"Алеутский"} + alg{"Алгонкинские языки"} + am{"Амхарский"} + ang{"Староанглийский"} + ar{"Арабский"} + arc{"Арамейский"} + art{"Искусственные (другие)"} + arw{"Аравакский"} + as{"Ассамский"} + ath{"Атапачские языки"} + awa{"Авадхи"} + ay{"Аямара"} + az{"Азербайджанский"} + ba{"Башкирский"} + bad{"Банда"} + bai{"Бамилеке языки"} + bal{"Белуджский"} + ban{"Балийский"} + bas{"Баса"} + bat{"Балтийские (другие)"} + be{"Белорусский"} + bej{"Беджа"} + bem{"Бемба"} + bg{"Болгарский"} + bh{"Бихарский"} + bho{"Бходжпури"} + bi{"Бислама"} + bik{"Бикольский"} + bin{"Бини"} + bla{"Сиксика"} + bn{"Бенгальский"} + bnt{"Банту (другие)"} + bo{"Тибетский"} + br{"Бретонский"} + bra{"Брауи"} + bua{"Бурятский"} + bug{"Бугийский"} + ca{"Каталанский"} + cad{"Каддо"} + cai{"Центральной Америки индейцев (другие)"} + car{"Кариб"} + cau{"Кавказские (другие)"} + chb{"Чибча"} + chg{"Чагатайский"} + chk{"Чукотский"} + chm{"Марийский (Черемисский)"} + chn{"Чинук жаргон"} + cho{"Чоктав"} + chr{"Чероки"} + chy{"Чейенн"} + co{"Корсиканский"} + cop{"Коптский"} + cpe{"Англо-креольские и пиджины (другие)"} + cpf{"Франко-креольские и пиджины (другие)"} + crp{"Креольские и пиджины (другие)"} + cs{"Чешский"} + cus{"Кушитские (другие)"} + cv{"Чувашский"} + cy{"Валлийский"} + da{"Датский"} + dak{"Дакота"} + de{"Немецкий"} + del{"Делаварский"} + din{"Динка"} + doi{"Догри"} + dra{"Дравидийские (другие)"} + dua{"Дуала"} + dum{"Нидерландский средневековый"} + dyu{"Диула (Дьюла)"} + dz{"Бутанский"} + efi{"Эфик"} + egy{"Древнеегипетский"} + eka{"Экаджук"} + el{"Греческий"} + elx{"Эламский"} + en{"Английский"} + enm{"Среднеанглийский"} + eo{"Эсперанто"} + es{"Испанский"} + et{"Эстонский"} + eu{"Баскский"} + ewo{"Эвондо"} + fa{"Персидский"} + fan{"Фанг"} + fat{"Фанти"} + fi{"Финский"} + fiu{"Финно-угорские (другие)"} + fj{"Фиджи"} + fo{"Фарерский"} + fon{"Фон"} + fr{"Французский"} + frm{"Среднефранцузский"} + fro{"Старофранцузский"} + fy{"Фризский"} + ga{"Ирландский"} + gaa{"Га"} + gay{"Гайо"} + gd{"Гаэльский"} + gem{"Германские (другие)"} + gez{"Геэз"} + gil{"Гильбертский"} + gl{"Галицийский"} + gmh{"Средневерхненемецкий"} + gn{"Гуарани"} + goh{"Староверхненемецкий"} + gon{"Гонди"} + got{"Готский"} + grc{"Древнегреческий"} + gu{"Гуярати"} + ha{"Хоса"} + hai{"Хайда"} + haw{"Гавайский"} + he{"Иврит"} + hi{"Хинди"} + hil{"Хилигайнон"} + him{"Химачали"} + hr{"Хорватский"} + hu{"Венгерский"} + hy{"Армянский"} + ia{"Смешанный язык"} + iba{"Ибанский"} + id{"Индонезийский"} + ie{"Смешанный язык"} + ijo{"Иджо"} + ik{"Инапиак"} + ilo{"Илоко"} + inc{"Индийские (другие)"} + ira{"Иранские (другие)"} + iro{"Ирокезские языки"} + is{"Исландский"} + it{"Итальянский"} + iu{"Инактитут"} + ja{"Японский"} + jpr{"Еврейско-персидский"} + jrb{"Еврейско-арабский"} + jv{"Яванский"} + ka{"Грузинский"} + kaa{"Каракалпакский"} + kab{"Кабильский"} + kam{"Камба"} + kar{"Каренский"} + kaw{"Кави"} + kha{"Кхаси"} + khi{"Койсанские (другие)"} + kho{"Хотанский"} + kk{"Казахский"} + kl{"Гренландский"} + km{"Камбоджийский"} + kn{"Канада"} + ko{"Корейский"} + kok{"Конкани"} + kpe{"Кпелле"} + kro{"Кру"} + ks{"Кашмирский"} + ku{"Курдиш"} + kum{"Кумыкский"} + kut{"Кутенаи"} + ky{"Киргизский"} + la{"Латинский"} + lad{"Ладино"} + lah{"Лахнда"} + lam{"Ламба"} + lez{"Лезгинский"} + ln{"Лингала"} + lo{"Лаосский"} + lol{"Монго"} + loz{"Лози"} + lt{"Литовский"} + lu{"Луба-Катанга"} + lui{"Луисеньо"} + lun{"Лунда"} + luo{"Луо (Кения и Танзания)"} + lv{"Латвийский"} + mad{"Мадурский"} + mag{"Магахи"} + mai{"Майтхили"} + mak{"Макассарский"} + man{"Мандинго"} + map{"Австронезийские (другие)"} + mas{"Масаи"} + men{"Менде"} + mg{"Малагасийский"} + mga{"Среднеирландский"} + mi{"Маори"} + mic{"Микмак"} + min{"Минангкабау"} + mis{"Смешанные (другие)"} + mk{"Македонский"} + mkh{"Монкхмерские (другие)"} + ml{"Малаялам"} + mn{"Монгольский"} + mni{"Манипурский"} + mno{"Манобо языки"} + mo{"Молдавский"} + moh{"Мохаук"} + mos{"Моей"} + mr{"Маратийский"} + ms{"Малайский"} + mt{"Мальтийский"} + mul{"Разных семей языки"} + mun{"Мунда языки"} + mus{"Крик"} + mwr{"Марвари"} + my{"Бирманский"} + myn{"Майя языки"} + na{"Науру"} + nah{"Ацтекский"} + nai{"Северной Америки индейцев (другие)"} + ne{"Непальский"} + new{"Неварский"} + nic{"Нигер-кордофанские (другие)"} + niu{"Ниуэ"} + nl{"Голландский"} + no{"Норвежский"} + nog{"Ногайский"} + non{"Старонорвежский"} + nso{"Сото Северный"} + nub{"Нубийские языки"} + nym{"Ньямвези"} + nyn{"Ньянколе"} + nyo{"Ньоро"} + nzi{"Нзима"} + oc{"Окитан"} + oj{"Оджибва"} + om{"Оромо (Афан)"} + or{"Ория"} + os{"Осетинский"} + osa{"Оседжи"} + ota{"Старотурецкий"} + oto{"Отомангские языки"} + pa{"Панджабский"} + paa{"Папуасско-австралийские (другие)"} + pag{"Пангасинан"} + pal{"Пехлевийский"} + pam{"Пампанга"} + pap{"Папьяменто"} + pau{"Палау"} + peo{"Староперсидский"} + phn{"Финикийский"} + pi{"Пали"} + pl{"Польский"} + pon{"Понапе"} + pra{"Пракриты языки"} + pro{"Старопровансальский"} + ps{"Пашто (Пушто)"} + pt{"Португальский"} + qu{"Кечуа"} + raj{"Раджастхани"} + rm{"Раето-романский"} + rn{"Кирундийский"} + ro{"Румынский"} + roa{"Романские (другие)"} + rom{"Цыганский"} + ru{"Русский"} + rw{"Кинярванда"} + sa{"Санскрит"} + sad{"Сандаве"} + sah{"Якутский"} + sai{"Южной Америки индейцев (другие)"} + sal{"Салишские языки"} + sam{"Самаритянский арамейский"} + sd{"Синди"} + sel{"Селькупский"} + sem{"Семитские (другие)"} + sg{"Санго"} + sga{"Староирландский"} + sh{"Сербско-хорватский"} + shn{"Шанский"} + si{"Сингальский"} + sid{"Сидама"} + sio{"Сиу языки"} + sit{"Синотибетские (другие)"} + sk{"Словацкий"} + sl{"Словенский"} + sla{"Славянские (другие)"} + sm{"Самоа"} + smi{"Саамские языки"} + sn{"Шона"} + so{"Сомали"} + sog{"Согдийский"} + sq{"Албанский"} + sr{"Сербский"} + ss{"Сисвати"} + ssa{"Нило-сахарские (другие)"} + st{"Сесото"} + su{"Санданизский"} + suk{"Сукума"} + sus{"Сусу"} + sux{"Шумерский"} + sv{"Шведский"} + sw{"Суахили"} + ta{"Тамильский"} + tai{"Татский"} + te{"Телугу"} + ter{"Терено"} + tg{"Таджикский"} + th{"Тайский"} + ti{"Тигриниа"} + tig{"Тигре"} + tiv{"Тиви"} + tk{"Туркменский"} + tl{"Тагалог"} + tli{"Тлингит"} + tmh{"Тамашек"} + tn{"Сетсвана"} + to{"Тонга"} + tog{"Тонга (Ньяса)"} + tr{"Турецкий"} + ts{"Тсонга"} + tsi{"Цимшиан"} + tt{"Татарский"} + tut{"Алтайские (другие)"} + tw{"Тви"} + tyv{"Тувинский"} + ug{"Уйгурский"} + uga{"Угаритский"} + uk{"Украинский"} + umb{"Умбунду"} + und{"Неидентифицированный"} + ur{"Урду"} + uz{"Узбекский"} + vai{"Ваи"} + vi{"Вьетнамский"} + vo{"Волапак"} + vot{"Удмуртский (Вотяцкий)"} + wak{"Вакашские языки"} + wal{"Воламо"} + war{"Варай"} + was{"Вашо"} + wen{"Лужицкие языки"} + wo{"Волоф"} + xh{"Хоза"} + yao{"Яо"} + yap{"Яп"} + yi{"Идиш"} + yo{"Йоруба"} + za{"Зуанг"} + zap{"Сапотекский"} + zen{"Зенагский"} + zh{"Китайский"} + zu{"Зулусский"} + zun{"Зуньи"} + } + LocaleScript{ + "Cyrl", + } + Scripts{ + Arab{"Арабская"} + Armn{"Армянская"} + Beng{"Бенгальская"} + Bopo{"Бопомофо"} + Brai{"Брайля"} + Buhd{"Бухид"} + Cans{"Унифицированные Символы Канадских Аборигенов"} + Cher{"Чероки"} + Copt{"Коптская"} + Cprt{"Кипрская"} + Cyrl{"Кириллица"} + Deva{"Деванагари"} + Dsrt{"Дезерет"} + Ethi{"Эфиопская"} + Geor{"Грузинская"} + Goth{"Готская"} + Grek{"Греческая"} + Gujr{"Гуджарати"} + Guru{"Гурмукхи"} + Hang{"Хангул"} + Hano{"Хануну"} + Hebr{"Иврит"} + Hira{"Хирагана"} + Ital{"Староитальянская"} + Kana{"Катакана"} + Khmr{"Кхмерская"} + Knda{"Каннада"} + Laoo{"Лаосская"} + Latn{"Латиница"} + Limb{"Лимбу"} + Linb{"Линейная Б"} + Mlym{"Малаяльская"} + Mong{"Монгольская"} + Mymr{"Майанмарская"} + Ogam{"Огамическая"} + Orya{"Ория"} + Osma{"Османская"} + Qaai{"Унаследованная"} + Runr{"Руническая"} + Shaw{"Алфавит Шоу"} + Sinh{"Сингальская"} + Syrc{"Сирийская"} + Tagb{"Тагбанва"} + Taml{"Тамильская"} + Telu{"Телугу"} + Tglg{"Тагалог"} + Thaa{"Таана"} + Thai{"Тайская"} + Tibt{"Тибетская"} + Ugar{"Угаритская"} + Yiii{"Йи (ицзу)"} + Zyyy{"Неопределенная"} + } + Types{ + calendar{ + buddhist{"Буддистский календарь"} + chinese{"Китайский календарь"} + gregorian{"Григорианский календарь"} + hebrew{"Еврейский календарь"} + islamic{"Исламский календарь"} + islamic-civil{"Исламский гражданский календарь"} + japanese{"Японский календарь"} + } + } + Version{"1.3"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "H:mm:ss z", + "H:mm:ss z", + "H:mm:ss", + "H:mm", + "d MMMM yyyy 'г.'", + "d MMMM yyyy 'г.'", + "dd.MM.yyyy", + "dd.MM.yy", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "Вс", + "Пн", + "Вт", + "Ср", + "Чт", + "Пт", + "Сб", + } + narrow{ + "В", + "П", + "В", + "С", + "Ч", + "П", + "С", + } + wide{ + "воскресенье", + "понедельник", + "вторник", + "среда", + "четверг", + "пятница", + "суббота", + } + } + } + eras{ + abbreviated{ + "до н.э.", + "н.э.", + } + } + monthNames{ + format{ + abbreviated{ + "янв.", + "февр.", + "марта", + "апр.", + "мая", + "июня", + "июля", + "авг.", + "сент.", + "окт.", + "нояб.", + "дек.", + } + narrow{ + "Я", + "Ф", + "М", + "А", + "М", + "И", + "И", + "А", + "С", + "О", + "Н", + "Д", + } + wide{ + "января", + "февраля", + "марта", + "апреля", + "мая", + "июня", + "июля", + "августа", + "сентября", + "октября", + "ноября", + "декабря", + } + } + stand-alone{ + abbreviated{ + "янв.", + "февр.", + "март", + "апр.", + "май", + "июнь", + "июль", + "авг.", + "сент.", + "окт.", + "нояб.", + "дек.", + } + narrow{ + "Я", + "Ф", + "М", + "А", + "М", + "И", + "И", + "А", + "С", + "О", + "Н", + "Д", + } + wide{ + "Январь", + "Февраль", + "Март", + "Апрель", + "Май", + "Июнь", + "Июль", + "Август", + "Сентябрь", + "Октябрь", + "Ноябрь", + "Декабрь", + } + } + } + } + } + localPatternChars{"GanjkHmsSEDFwWxhKzAeugXZ"} +} diff --git a/icuSources/data/locales/ru_RU.txt b/icuSources/data/locales/ru_RU.txt index f308e67f..2a3f451f 100644 --- a/icuSources/data/locales/ru_RU.txt +++ b/icuSources/data/locales/ru_RU.txt @@ -1,33 +1,31 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ru_RU.xml // * // *************************************************************************** - -ru_RU { - Version { "2.0" } - NumberElements { +ru_RU{ + NumberElements{ ",", - "\u00A0", + " ", ";", "%", "0", "#", "-", "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", + "‰", + "∞", + "�", + "+", } -// LocaleString { "ru_RU" } - NumberPatterns { + NumberPatterns{ "#,##0.###;-#,##0.###", - "#,##0.00\u00A4;-#,##0.00\u00A4", + "#,##0.00¤;-#,##0.00¤", "#,##0%", "#E0", } -// ShortCountry { "RUS" } - LocaleID:int { 0x0419 } + Version{"1.2"} } diff --git a/icuSources/data/locales/ru_UA.txt b/icuSources/data/locales/ru_UA.txt index 1f2ee047..1d7d5818 100644 --- a/icuSources/data/locales/ru_UA.txt +++ b/icuSources/data/locales/ru_UA.txt @@ -1,43 +1,46 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ru_UA.xml // * // *************************************************************************** - -ru_UA { - Version { "2.0" } - DateTimePatterns { - "HH:mm:ss z", - "HH:mm:ss z", - "H:mm:ss", - "H:mm", - "EEEE, d MMMM yyyy '\u0433.'", - "d MMMM yyyy", - "d MMM yyyy", - "dd.MM.yy", - "{1} {0}", - } - NumberElements { +ru_UA{ + NumberElements{ ",", - "\u00a0", + " ", ";", "%", "0", "#", "-", "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", + "‰", + "∞", + "�", + "+", } - NumberPatterns { + NumberPatterns{ "#,##0.###;-#,##0.###", - "#,##0.00 \u00a4;-#,##0.00 \u00a4", + "#,##0.00 ¤;-#,##0.00 ¤", "#,##0%", "#E0", } -// LocaleString{ "ru_UA" } -// ShortCountry { "UA" } + Version{"1.2"} + calendar{ + gregorian{ + DateTimePatterns{ + "HH:mm:ss z", + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm", + "EEEE, d MMMM yyyy 'г.'", + "d MMMM yyyy", + "d MMM yyyy", + "dd.MM.yy", + "{1} {0}", + } + } + } } diff --git a/icuSources/data/locales/sh.txt b/icuSources/data/locales/sh.txt index 72ffeff1..2df802c6 100644 --- a/icuSources/data/locales/sh.txt +++ b/icuSources/data/locales/sh.txt @@ -1,371 +1,11 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/sh.xml // * // *************************************************************************** - -sh { - Version { "2.0" } - CollationElements { - Version { "2.0" } - Sequence { - "& C < \u010D <<< \u010C < \u0107 <<< \u0106" - "&\u0110 < d\u017E <<< D\u017E <<< D\u017D" - "& L < lj<<< Lj <<< LJ" - "& N < nj<<< Nj <<< NJ " - "& S < \u0161 <<< \u0160" - "& Z < \u017E <<< \u017D" - } - } - Countries { - AF { "Avganistan" } - AL { "Albanija" } - DZ { "Al\u017Eir" } - AD { "Andora" } - //AO { "Angola" } - //AR { "Argentina" } - AM { "Armenija" } - //AW { "Aruba" } - AU { "Australija" } - AT { "Austrija" } - AZ { "Azerbejd\u017Ean" } - BS { "Bahami" } - BH { "Bahrein" } - BD { "Banglade\u0161" } - //BB { "Barbados" } - BY { "Belorusija" } - BE { "Belgija" } - BZ { "Belise" } - //BJ { "Benin" } - //BM { "Bermuda" } - BT { "Butan" } - BO { "Bolivija" } - BA { "Bosna i Hercegovina" } - BW { "Bocvana" } - //BR { "Brazil" } - BN { "Brunej" } - BG { "Bugarska" } - //BF { "Burkina Faso" } - //BI { "Burundi" } - KH { "Kambod\u017Ea" } - CM { "Kamerun" } - CA { "Kanada" } - CF { "Centralno Afri\u010Dka Republika" } - TD { "\u010Cad" } - CL { "\u010Cile" } - CN { "Kina" } - CO { "Kolumbija" } - CG { "Kongo" } - CR { "Kostarika" } - CI { "Obala Slonova\u010De" } - HR { "Hrvatska" } - CU { "Kuba" } - CY { "Kipar" } - CZ { "\u010Ce\u0161ka" } - DK { "Danska" } - DJ { "D\u017Eibuti" } - DM { "Dominika" } - DO { "Dominikanska Republika" } - EC { "Ekvador" } - EG { "Egipat" } - SV { "Salvador" } - GQ { "Ekvatorijalna Gvineja" } - ER { "Eritreja" } - EE { "Estonija" } - ET { "Etiopija" } - FJ { "Fid\u017Ei" } - FI { "Finska" } - FR { "Francuska" } - GF { "Francuska Gvajana" } - PF { "Francuska Polinezija" } - TF { "Francuske Ju\u017Ene Teritorije" } - //GA { "Gabon" } - GM { "Gambija" } - GE { "Gruzija" } - DE { "Nema\u010Dka" } - GH { "Gana" } - GR { "Gr\u010Dka" } - GP { "Gvadelupe" } - GT { "Gvatemala" } - GN { "Gvineja" } - GW { "Gvineja-Bisao" } - GY { "Gvajana" } - //HT { "Haiti" } - //HN { "Honduras" } - //HK { "Hong Kong S.A.R., China" } - HU { "Ma\u0111arska" } - IS { "Island" } - IN { "Indija" } - ID { "Indonezija" } - //IR { "Iran" } - IQ { "Irak" } - IE { "Irska" } - IL { "Izrael" } - IT { "Italija" } - JM { "Jamajka" } - //JP { "Japan" } - //JO { "Jordan" } - KZ { "Kazahstan" } - KE { "Kenija" } - KP { "Severna Koreja" } - KR { "Ju\u017Ena Koreja" } - KW { "Kuvajt" } - KG { "Kirgistan" } - //LA { "Laos" } - LV { "Letonija" } - LB { "Liban" } - LS { "Lesoto" } - LR { "Liberija" } - LY { "Libija" } - LI { "Lihen\u0161tajn" } - LT { "Litvanija" } - LU { "Luksemburg" } - MK { "Makedonija" } - MG { "Madagaskar" } - MY { "Malezija" } - //ML { "Mali" } - //MT { "Malta" } - MQ { "Martinik" } - MR { "Mauritanija" } - MU { "Mauricius" } - MX { "Meksiko" } - FM { "Mikronezija" } - MD { "Moldavija" } - MC { "Monako" } - MN { "Mongolija" } - MA { "Maroko" } - MZ { "Mozambik" } - MM { "Mijnamar" } - NA { "Namibija" } - //NP { "Nepal" } - NL { "Holandija" } - AN { "Holandski Antili" } - NC { "Nova Kaledonija" } - NZ { "Novi Zeland" } - NI { "Nikaragva" } - //NE { "Niger" } - NG { "Nigerija" } - NO { "Norve\u0161ka" } - //OM { "Oman" } - //PK { "Pakistan" } - //PA { "Panama" } - PG { "Papua Nova Gvineja" } - PY { "Paragvaj" } - //PE { "Peru" } - PH { "Filipini" } - PL { "Poljska" } - //PT { "Portugal" } - PR { "Porto Riko" } - QA { "Katar" } - RO { "Rumunija" } - RU { "Rusija" } - RW { "Ruanda" } - SA { "Saudijska Arabija" } - //SN { "Senegal" } - SP { "Srbija" } - SC { "Sej\u0161eli" } - SL { "Sijera Leone" } - SG { "Singapur" } - SK { "Slova\u010Dka" } - SI { "Slovenija" } - SO { "Somalija" } - ZA { "Ju\u017Ena Afrika" } - ES { "\u0160panija" } - LK { "\u0160rilanka" } - //SD { "Sudan" } - SR { "Surinam" } - SZ { "Svazilend" } - SE { "\u0160vedska" } - CH { "\u0160vajcarska" } - SY { "Sirija" } - TW { "Tajvan" } - TJ { "Tad\u017Eikistan" } - TZ { "Tanzanija" } - TH { "Tajland" } - //TG { "Togo" } - TT { "Trinidad i Tobago" } - TN { "Tunis" } - TR { "Turska" } - //TM { "Turkmenistan" } - //UG { "Uganda" } - UA { "Ukrajina" } - AE { "Ujedinjeni Arapski Emirati" } - GB { "Velika Britanija" } - US { "Sjedinjene Ameri\u010Dke Dr\u017Eave" } - UY { "Urugvaj" } - //UZ { "Uzbekistan" } - VA { "Vatikan" } - VE { "Venecuela" } - VN { "Vijetnam" } - VG { "Britanska Devi\u010Danska Ostrva" } - VI { "S.A.D. Devi\u010Danska Ostrva" } - EH { "Zapadna Sahara" } - YE { "Jemen" } - YU { "Jugoslavija" } - //ZR { "Zair" } // It's now called CD { "Democratic Republic of the Congo" } - ZM { "Zambija" } - ZW { "Zimbabve" } - } - DateTimePatterns { - "HH.mm.ss z", - "HH.mm.ss z", - "HH.mm.ss", - "HH.mm", - "EEEE, dd. MMMM yyyy.", - "EEEE, d.MM.yyyy.", - "dd.MM.yyyy.", - "d.M.yy.", - "{1} {0}", - } - DayAbbreviations { - "ned", - "pon", - "uto", - "sre", - "\u010Det", - "pet", - "sub", - } - DayNames { - "nedelja", - "ponedeljak", - "utorak", - "sreda", - "\u010Detvrtak", - "petak", - "subota", - } - Eras { - "p. n. e.", - "n. e.", - } - Languages { - af { "Afrikanerski" } - sq { "Albanski" } - ar { "Arapski" } - hy { "Armenski" } - eu { "Baskijski" } - br { "Bretonski" } - bg { "Bugarski" } - my { "Burmanski" } - be { "Beloruski" } - km { "Kambod\u017Eanski" } - ca { "Katalonski" } - zh { "Kineski" } - co { "Korzikanski" } - hr { "Hrvatski" } - cs { "\u010Ce\u0161ki" } - da { "Danski" } - nl { "Holandski" } - en { "Engleski" } - //eo { "Esperanto" } - et { "Estonski" } - fi { "Finski" } - fr { "Francuski" } - ka { "Gruzijski" } - de { "Nema\u010Dki" } - el { "Gr\u010Dki" } - he { "Hebrejski" } - hu { "Ma\u0111arski" } - is { "Islandski" } - id { "Indonezijski" } - //in { "Indonezijski" } // Use "id" instead - ga { "Irski" } - it { "Italijanski" } - ja { "Japanski" } - ky { "Kirgiski" } - ko { "Korejski" } - ku { "Kurdski" } - la { "Latinski" } - lv { "Letonski" } - lt { "Litvanski" } - mk { "Makedonski" } - mo { "Moldavski" } - mn { "Mongolski" } - no { "Norve\u0161ki" } - fa { "Persijski" } - pl { "Poljski" } - pt { "Portugalski" } - rm { "Reto-Romanski" } - ro { "Rumunski" } - ru { "Ruski" } - //sa { "Sanskrit" } - sr { "Srpski" } - sh { "Srpsko-Hrvatski" } - sk { "Slova\u010Dki" } - sl { "Slovena\u010Dki" } - es { "\u0160panski" } - sw { "Svahili" } - sv { "\u0160vedski" } - tr { "Turski" } - uk { "Ukrajnski" } - vi { "Vijetnamski" } - //ji { "Jidi\u0161" } // Use "yi" instead - yi { "Jidi\u0161" } - } - LocaleID:int { 0x081a } -// LocaleString { "sh" } - MonthAbbreviations { - "jan", - "feb", - "mar", - "apr", - "maj", - "jun", - "jul", - "avg", - "sep", - "okt", - "nov", - "dec", - } - MonthNames { - "januar", - "februar", - "mart", - "april", - "maj", - "juni", - "juli", - "avgust", - "septembar", - "oktobar", - "novembar", - "decembar", - } - NumberElements { - ",", - ".", - ";", - "%", - "0", - "#", - "-", - "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", - } -// ShortLanguage { "srp" } - localPatternChars { "GanjkHmsSEDFwWxhKzAe" } - zoneStrings { - { - "Europe/Belgrade", - "Centralno Evropsko Vreme", - "CET", - "Centralno Evropsko Letnje Vreme", - "CET", - } - } -// LocaleScript{ -// "Latn", // ISO 15924 Name -// } - ExemplarCharacters { "[a-p r-v z \u0111 \u0107 \u010d \u017e \u0161 {lj} {nj} {d\u017e}]" } - - // Currency display names - Currencies { - YUN { "Din", "YUN" } - } +sh{ + "%%ALIAS"{"sr_Latn"} } diff --git a/icuSources/data/locales/sh_YU.txt b/icuSources/data/locales/sh_YU.txt index edeee73d..71f7b127 100644 --- a/icuSources/data/locales/sh_YU.txt +++ b/icuSources/data/locales/sh_YU.txt @@ -1,13 +1,11 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/sh_YU.xml // * // *************************************************************************** - -sh_YU { - Version { "2.0" } -// LocaleString { "sh_YU" } -// ShortCountry { "YUG" } - LocaleID:int { 0x081a } +sh_YU{ + "%%ALIAS"{"sr_Latn_YU"} } diff --git a/icuSources/data/locales/sk.txt b/icuSources/data/locales/sk.txt index d6fa5e7c..aa2fad49 100644 --- a/icuSources/data/locales/sk.txt +++ b/icuSources/data/locales/sk.txt @@ -1,120 +1,1917 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/sk.xml // * // *************************************************************************** - -sk { - Version{ "2.0" } - CollationElements { - Version { "1.0" } - Sequence { "& A < a\u0308 <<< A\u0308 & C " - "< c\u030C <<< C\u030C & D < \u0111<<< \u0110 & H < ch <<< cH <<< Ch <<< CH & L < \u0142 <<<" - " \u0141 & O < o\u0302 <<< O\u0302 & R < r\u030C <<< R\u030C & S < s\u030C <<< S\u030C" - " & Z < z\u030C <<< Z\u030C < z\u0307 <<< Z\u0307" } - } - Countries { - SK { "Slovensk\u00E1 republika" } - } - DateTimePatterns { - "H:mm:ss z", - "H:mm:ss z", - "H:mm:ss", - "H:mm", - "EEEE, d. MMMM yyyy", - "d. MMMM yyyy", - "d.M.yyyy", - "d.M.yyyy", - "{1} {0}", +/** + * ICU source: ../../../locale/icu/main/sk.xml + */ +sk{ + Countries{ + AD{"Andorra"} + AE{"Spojené arabské emiráty"} + AF{"Afganistan"} + AG{"Antigua a Barbados"} + AI{"Anguilla"} + AL{"Albánsko"} + AM{"Arménsko"} + AN{"Holandské Antily"} + AO{"Angola"} + AQ{"Antarctica"} + AR{"Argentína"} + AS{"Americká Samoa"} + AT{"Rakúsko"} + AU{"Austrália"} + AW{"Aruba"} + AZ{"Azerbajdžan"} + BA{"Bosna a Hercegovina"} + BB{"Barbados"} + BD{"Bangladéš"} + BE{"Belgicko"} + BF{"Burkina Faso"} + BG{"Bulharsko"} + BH{"Bahrajn"} + BI{"Burundi"} + BJ{"Benin"} + BM{"Bermudy"} + BN{"Brunej"} + BO{"Bolívia"} + BR{"Brazília"} + BS{"Bahamy"} + BT{"Bután"} + BV{"Bouvetov ostrov"} + BW{"Botswana"} + BY{"Bielorusko"} + BZ{"Belize"} + CA{"Kanada"} + CC{"Kokosové (Keelingove) ostrovy"} + CD{"Konžská demokratická republika"} + CF{"Stredoafrická republika"} + CG{"Kongo"} + CH{"Švajčiarsko"} + CI{"Pobrežie Slonoviny"} + CK{"Cookove ostrovy"} + CL{"Čile"} + CM{"Kamerun"} + CN{"Čína"} + CO{"Kolumbia"} + CR{"Kostarika"} + CU{"Kuba"} + CV{"Kapverdy"} + CX{"Vianočný ostrov"} + CY{"Cyprus"} + CZ{"Česká republika"} + DE{"Nemecko"} + DJ{"Džibuti"} + DK{"Dánsko"} + DM{"Dominika"} + DO{"Dominikánska republika"} + DZ{"Alžírsko"} + EC{"Ekvádor"} + EE{"Estónsko"} + EG{"Egypt"} + EH{"Západná Sahara"} + ER{"Eritrea"} + ES{"Španielsko"} + ET{"Etiópia"} + FI{"Fínsko"} + FJ{"Fidži"} + FK{"Falklandské ostrovy"} + FM{"Mikronézia, Federatívne štáty"} + FO{"Faerské ostrovy"} + FR{"Francúzsko"} + GA{"Gabon"} + GB{"Spojené kráľovstvo"} + GD{"Grenada"} + GE{"Gruzínsko"} + GF{"Francúzska Guayana"} + GH{"Ghana"} + GI{"Gibraltár"} + GL{"Grónsko"} + GM{"Gambia"} + GN{"Guinea"} + GP{"Guadeloupe"} + GQ{"Rovníková Guinea"} + GR{"Grécko"} + GS{"Južná Georgia a Južné Sandwichove ostrovy"} + GT{"Guatemala"} + GU{"Guam"} + GW{"Guinea-Bissau"} + GY{"Guayana"} + HK{"Hong Kong S.A.R. Číny"} + HM{"Heardove ostrovy a McDonaldove ostrovy"} + HN{"Honduras"} + HR{"Chorvátsko"} + HT{"Haiti"} + HU{"Maďarsko"} + ID{"Indonézia"} + IE{"Írsko"} + IL{"Izrael"} + IN{"India"} + IO{"Britské územie v Indickom oceáne"} + IQ{"Irak"} + IR{"Irán"} + IS{"Island"} + IT{"Taliansko"} + JM{"Jamajka"} + JO{"Jordánsko"} + JP{"Japonsko"} + KE{"Keňa"} + KG{"Kirgizsko"} + KH{"Kambodža"} + KI{"Kiribati"} + KM{"Komory"} + KN{"Saint Kitts a Nevis"} + KP{"Kórea, Severná"} + KR{"Kórea, Južná"} + KW{"Kuvajt"} + KY{"Kajmanské ostrovy"} + KZ{"Kazachstan"} + LA{"Laoská ľudovodemokratická republika"} + LB{"Libanon"} + LC{"Svätá Lucia"} + LI{"Lichtenštajnsko"} + LK{"Srí Lanka"} + LR{"Libéria"} + LS{"Lesotho"} + LT{"Litva"} + LU{"Luxembursko"} + LV{"Lotyšsko"} + LY{"Lýbijská arabská džamahírija"} + MA{"Maroko"} + MC{"Monako"} + MD{"Moldavsko, republika"} + MG{"Madagaskar"} + MH{"Marshallove ostrovy"} + MK{"Macedónsko, republika"} + ML{"Mali"} + MM{"Mjanmarsko"} + MN{"Mongolsko"} + MO{"Makao S.A.R. Číny"} + MP{"Severné Mariány"} + MQ{"Martinik"} + MR{"Mauritánia"} + MS{"Montserrat"} + MT{"Malta"} + MU{"Maurícius"} + MV{"Maldivy"} + MW{"Malawi"} + MX{"Mexiko"} + MY{"Malajzia"} + MZ{"Mozambik"} + NA{"Namíbia"} + NC{"Nová Kaledónia"} + NE{"Niger"} + NF{"Norfolkov ostrov"} + NG{"Nigéria"} + NI{"Nikaragua"} + NL{"Holandsko"} + NO{"Nórsko"} + NP{"Nepál"} + NR{"Nauru"} + NU{"Niue"} + NZ{"Nový Zéland"} + OM{"Omán"} + PA{"Panama"} + PE{"Peru"} + PF{"Francúzska Polynézia"} + PG{"Papua Nová Guinea"} + PH{"Filipíny"} + PK{"Pakistan"} + PL{"Poľsko"} + PM{"Saint Pierre a Miquelon"} + PN{"Pitcairnove ostrovy"} + PR{"Portoriko"} + PS{"Palestínske územie"} + PT{"Portugalsko"} + PW{"Palau"} + PY{"Paraguaj"} + QA{"Katar"} + RE{"Reunion"} + RO{"Rumunsko"} + RU{"Ruská federácia"} + RW{"Rwanda"} + SA{"Saudská Arábia"} + SB{"Šalamúnove ostrovy"} + SC{"Seychelské ostrovy"} + SD{"Sudán"} + SE{"Švédsko"} + SG{"Singapur"} + SH{"Svätá Helena"} + SI{"Slovinsko"} + SJ{"Špicbergy a Jan Mayen"} + SK{"Slovenská republika"} + SL{"Sierra Leone"} + SM{"San Maríno"} + SN{"Senegal"} + SO{"Somálsko"} + SP{"Serbia"} + SR{"Surinam"} + ST{"Svätý Tomáš a Princove ostrovy"} + SV{"Salvador"} + SY{"Sýrska arabská republika"} + SZ{"Svazijsko"} + TC{"Turks a Caicos"} + TD{"Čad"} + TF{"Francúzske južné územia"} + TG{"Togo"} + TH{"Thajsko"} + TJ{"Tadžikistan"} + TK{"Tokelau"} + TL{"Východný Timor"} + TM{"Turkménsko"} + TN{"Tunisko"} + TO{"Tonga"} + TR{"Turecko"} + TT{"Trinidad a Tobago"} + TV{"Tuvalu"} + TW{"Tajwan"} + TZ{"Tanzánia"} + UA{"Ukrajina"} + UG{"Uganda"} + UM{"Menšie odľahlé ostrovy USA"} + US{"Spojené štáty"} + UY{"Uruguaj"} + UZ{"Uzbekistan"} + VA{"Svätá stolica (Vatikánsky mestský štát)"} + VC{"Svätý Vincent a Grenadíny"} + VE{"Venezuela"} + VG{"Britské panenské ostrovy"} + VI{"Panenské ostrovy - USA"} + VN{"Vietnam"} + VU{"Vanuatu"} + WF{"Wallis a Futuna"} + WS{"Samoa"} + YE{"Jemen"} + YT{"Mayotte"} + YU{"Juhoslávia"} + ZA{"Južná Afrika"} + ZM{"Zambia"} + ZW{"Zimbabwe"} } - DayAbbreviations { - "Ne", - "Po", - "Ut", - "St", - "\u0160t", - "Pa", - "So", - } - DayNames { - "Nede\u013Ee", - "Pondelok", - "Utorok", - "Streda", - "\u0160tvrtok", - "Piatok", - "Sobota", - } - Eras { - "pred n.l.", - "n.l.", + Currencies{ + ADD{ + "ADD", + "Andorský diner", + } + ADP{ + "ADP", + "Andorská peseta", + } + AED{ + "AED", + "UAE dirham", + } + AIF{ + "AIF", + "Affars a Issas frank", + } + ALK{ + "ALK", + "Albánsky lek (1946-1961)", + } + ALL{ + "lek", + "Albánsky lek", + } + ALV{ + "ALV", + "Albánsky valutový lek", + } + ALX{ + "ALX", + "Albánske dolárové certifikáty", + } + AMD{ + "dram", + "Armenský dram", + } + ANG{ + "NA f.", + "Nizozemský Antilský guilder", + } + AOA{ + "AOA", + "Angolská kwanza", + } + AOK{ + "AOK", + "Angolská kwanza (1977-1990)", + } + AON{ + "AON", + "Angolská nová kwanza (1990-2000)", + } + AOR{ + "AOR", + "Angolská kwanza Reajustado (1995-1999)", + } + AOS{ + "AOS", + "Angolské eskudo", + } + ARA{ + "ARA", + "Argentinský austral", + } + ARM{ + "ARM", + "Argentinské peso Moneda Nacional", + } + ARP{ + "ARP", + "Argentinské peso (1983-1985)", + } + ARS{ + "Arg$", + "Argentinské peso", + } + ATS{ + "ATS", + "Rakúsky šiling", + } + AUD{ + "$A", + "Austrálsky dolár", + } + AUP{ + "AUP", + "Austrálska libra", + } + AWG{ + "AWG", + "Arubský guilder", + } + AZM{ + "AZM", + "Azerbaidžanský manat", + } + BAD{ + "BAD", + "Bosnianský dinár", + } + BAM{ + "KM", + "Bosnianský konvertibilná marka", + } + BAN{ + "BAN", + "Bosnianský nový dinár", + } + BBD{ + "BDS$", + "Barbadoský dolár", + } + BDT{ + "Tk", + "Bangladéšska taka", + } + BEC{ + "BEC", + "Belgický frank (konvertibilný)", + } + BEF{ + "BF", + "Belgický frank", + } + BEL{ + "BEL", + "Belgický frank (finančný)", + } + BGL{ + "lev", + "Bulharský leva", + } + BGM{ + "BGM", + "Bulharský socialistický leva", + } + BGN{ + "BGN", + "Bulharský leva nový", + } + BGO{ + "BGO", + "Bulharský leva (1879-1952)", + } + BGX{ + "BGX", + "Bulharské certifikáty v leva", + } + BHD{ + "BD", + "Bahraiský dinár", + } + BIF{ + "Fbu", + "Burundský frank", + } + BMD{ + "Ber$", + "Bermudský dolár", + } + BMP{ + "BMP", + "Bermudská libra", + } + BND{ + "BND", + "Bruneiský dolár", + } + BOP{ + "BOP", + "Bolivíjske peso", + } + BOV{ + "BOV", + "Bolivíjske mvdol", + } + BRB{ + "BRB", + "Bolivíjske Cruzeiro Novo (1967-1986)", + } + BRC{ + "BRC", + "Bolivíjske cruzado", + } + BRE{ + "BRE", + "Bolivíjske cruzeiro (1990-1993)", + } + BRL{ + "R$", + "Bolivíjsky real", + } + BRN{ + "BRN", + "Brazílske Cruzado Novo", + } + BRR{ + "BRR", + "Brazílske cruzeiro", + } + BRZ{ + "BRZ", + "Brazílske cruzeiro (1942-1967)", + } + BSD{ + "BSD", + "Bahamský dolár", + } + BSP{ + "BSP", + "Bahamská libra", + } + BTN{ + "Nu", + "Bhutansky ngultrum", + } + BTR{ + "BTR", + "Bhutan rupia", + } + BUK{ + "BUK", + "Burmese Kyat", + } + BUR{ + "BUR", + "Burmese rupia", + } + BWP{ + "BWP", + "Botswanan Pula", + } + BYB{ + "BYB", + "Belarussian nový rubeľ (1994-1999)", + } + BYL{ + "BYL", + "Belarussian rubeľ (1992-1994)", + } + BYR{ + "Rbl", + "Belarussian rubeľ", + } + BZD{ + "BZ$", + "Belize dolár", + } + BZH{ + "BZH", + "Britiský Honduraský dolár", + } + CAD{ + "Can$", + "Kanadský dolár", + } + CDF{ + "CDF", + "Konžský frank Congolais", + } + CDG{ + "CDG", + "Konžský frank", + } + CDL{ + "CDL", + "Konžský zaire", + } + CFF{ + "CFF", + "CAR CFA frank", + } + CHF{ + "SwF", + "Švajčiarský frank", + } + CKD{ + "CKD", + "Cook Islands dolár", + } + CLC{ + "CLC", + "Čílsky condor", + } + CLE{ + "CLE", + "Čílske eskudo", + } + CLF{ + "CLF", + "Čílske Unidades de Fomento", + } + CLP{ + "Ch$", + "Čílske peso", + } + CMF{ + "CMF", + "Camerunský CFA frank", + } + CNP{ + "CNP", + "Čínsky Jen Min Piao Yuan", + } + CNX{ + "CNX", + "Čínsky certifikáty v US dolároch", + } + CNY{ + "Y", + "Čínsky Yuan Renminbi", + } + COB{ + "COB", + "Colombijské papierové peso", + } + COF{ + "COF", + "Konžský CFA frank", + } + COP{ + "Col$", + "Colombijské peso", + } + CRC{ + "C", + "Kostarikský colon", + } + CSC{ + "CSC", + "Československá koruna", + } + CSK{ + "CSK", + "Československá koruna", + } + CUP{ + "CUP", + "Kubánske peso", + } + CUX{ + "CUX", + "Kubánske certifikáty", + } + CVE{ + "CVEsc", + "Cape Verde eskudo", + } + CWG{ + "CWG", + "Curacao guilder", + } + CYP{ + "£C", + "Cypruská libra", + } + CZK{ + "CZK", + "Česká koruna", + } + DDM{ + "DDM", + "Východonemecká marka", + } + DEM{ + "DEM", + "Nemecká marka", + } + DES{ + "DES", + "Nemecká sperrmarka", + } + DJF{ + "DF", + "Džibutský frank", + } + DKK{ + "DKr", + "Dánska krone", + } + DOP{ + "RD$", + "Dominikánske peso", + } + DZD{ + "DA", + "Alžírsky dinár", + } + DZF{ + "DZF", + "Alžírsky nový frank", + } + DZG{ + "DZG", + "Alžírsky frank Germinal", + } + ECS{ + "ECS", + "Ekuadorský sucre", + } + ECV{ + "ECV", + "Ekuadorský Unidad de Valor Constante (UVC)", + } + EEK{ + "EEK", + "Estónska kroon", + } + EGP{ + "EGP", + "Egyptská libra", + } + ERN{ + "ERN", + "Eritrejská nakfa", + } + ESP{ + "ESP", + "Španielská peseta", + } + ETB{ + "Br", + "Ethiopský birr", + } + ETD{ + "ETD", + "Ethiopský dolár", + } + EUR{ + "€", + "Euro", + } + FIM{ + "FIM", + "Finská marka", + } + FIN{ + "FIN", + "Finská marka (1860-1962)", + } + FJD{ + "F$", + "Fiji dolár", + } + FJP{ + "FJP", + "Fiji libra", + } + FKP{ + "FKP", + "Falklandská libra", + } + FOK{ + "FOK", + "Faeroe Islands Kronur", + } + FRF{ + "FRF", + "Francúzsky frank", + } + FRG{ + "FRG", + "Francúzsky frank Germinal/frank Poincare", + } + GAF{ + "GAF", + "Gabúnsky CFA frank", + } + GBP{ + "£", + "Britská libra", + } + GEK{ + "GEK", + "Gruzínsky Kupon Larit", + } + GEL{ + "lari", + "Gruzínsky lari", + } + GHC{ + "GHC", + "Ghanský cedi", + } + GHO{ + "GHO", + "Ghanský starý cedi", + } + GHP{ + "GHP", + "Ghanská libra", + } + GHR{ + "GHR", + "Ghanský prehodnotený cedi", + } + GIP{ + "GIP", + "Gibraltarská libra", + } + GLK{ + "GLK", + "Grónsky krone", + } + GMD{ + "GMD", + "Gambský dalasi", + } + GMP{ + "GMP", + "Gambská libra", + } + GNF{ + "GF", + "Guinejský frank", + } + GNI{ + "GNI", + "Guinejský frank (1960-1972)", + } + GNS{ + "GNS", + "Guinejský syli", + } + GPF{ + "GPF", + "Guadeloupský frank", + } + GQE{ + "GQE", + "Rovníková Guinea Ekwele Guineana", + } + GQF{ + "GQF", + "Rovníková Guinea franko", + } + GQP{ + "GQP", + "Rovníková Guinea Peseta Guineana", + } + GRD{ + "GRD", + "Grécka drachma", + } + GRN{ + "GRN", + "Grécka nová drachma", + } + GTQ{ + "Q", + "Guatemalský quetzal", + } + GUF{ + "GUF", + "Francúzska Guyana frank Guiana", + } + GWE{ + "GWE", + "Portugalská Guinea eskudo", + } + GWM{ + "GWM", + "Portugalské Guinea Mil Reis", + } + GWP{ + "GWP", + "Guinea-Bissau peso", + } + GYD{ + "G$", + "Guyanský dolár", + } + HKD{ + "HK$", + "Hong Kongský dolár", + } + HNL{ + "L", + "Hoduraská lempira", + } + HRD{ + "HRD", + "Chorvátsky dinár", + } + HRK{ + "HRK", + "Chorvátska kuna", + } + HTG{ + "HTG", + "Haitské gourde", + } + HUF{ + "Ft", + "Maďarský forint", + } + IBP{ + "IBP", + "Severoírska libra", + } + IDG{ + "IDG", + "Indonézsky nica guilder", + } + IDJ{ + "IDJ", + "Indonézska Java rupia", + } + IDN{ + "IDN", + "Indonézska nová rupia", + } + IDR{ + "Rp", + "Indonézska rupia", + } + IEP{ + "IR£", + "Írska libra", + } + ILL{ + "ILL", + "Izraelský šekel", + } + ILP{ + "ILP", + "Izraelská libra", + } + ILS{ + "ILS", + "Izraelský šekel", + } + IMP{ + "IMP", + "Libra Isle of Man", + } + INR{ + "INR", + "Indijská rupia", + } + IQD{ + "ID", + "Iracký dinár", + } + IRR{ + "RI", + "Iránsky rial", + } + ISK{ + "ISK", + "Islandská krona", + } + ITL{ + "₤", + "Talianská lira", + } + JEP{ + "JEP", + "Jersey libra", + } + JMD{ + "J$", + "Jamajský dolár", + } + JMP{ + "JMP", + "Jamajská libra", + } + JOD{ + "JD", + "Jordánsky dinár", + } + JPY{ + "¥", + "Japonský yen", + } + KES{ + "K Sh", + "Keňský šiling", + } + KGS{ + "som", + "Kyrgyský som", + } + KHO{ + "KHO", + "Kambodžský starý riel", + } + KHR{ + "CR", + "Kambodžský riel", + } + KID{ + "KID", + "Kiribati dolár", + } + KMF{ + "CF", + "Comoro frank", + } + KPP{ + "KPP", + "Severokórejský won", + } + KPW{ + "KPW", + "Severokórejský won", + } + KRH{ + "KRH", + "Juhokórejský hwan", + } + KRO{ + "KRO", + "Juhokórejský starý won", + } + KRW{ + "KRW", + "Juhokórejský won", + } + KWD{ + "KD", + "Kuvaitský dinár", + } + KYD{ + "KYD", + "Kajmanský dolár", + } + KZR{ + "KZR", + "Kazažský rubeľ", + } + KZT{ + "T", + "Kazažský tenge", + } + LAK{ + "LAK", + "Laoský kip", + } + LBP{ + "LL", + "Libanonská libra", + } + LIF{ + "LIF", + "Lichtenšteinský frank", + } + LKR{ + "SL Re", + "Šrilanská rupia", + } + LNR{ + "LNR", + "Ceylonská rupia", + } + LRD{ + "LRD", + "Libérský dolár", + } + LSL{ + "M", + "Lesothský loti", + } + LTL{ + "LTL", + "Litevská lita", + } + LTT{ + "LTT", + "Litevský talonas", + } + LUF{ + "LUF", + "Luxemburský frank", + } + LVL{ + "LVL", + "Lotyšský lats", + } + LVR{ + "LVR", + "Lotyšský rubeľ", + } + LYB{ + "LYB", + "Libyjská BMA lira", + } + LYD{ + "LD", + "Libyjský dinár", + } + LYP{ + "LYP", + "Libyjská libra", + } + MAD{ + "MAD", + "Marocký dirham", + } + MAF{ + "MAF", + "Marocký frank", + } + MCF{ + "MCF", + "Monacký frank Nouveau", + } + MCG{ + "MCG", + "Monacký frank Germinal", + } + MDC{ + "MDC", + "Moldavský Leu Cupon", + } + MDL{ + "MDL", + "Moldavský leu", + } + MDR{ + "MDR", + "Moldavský rubeľ", + } + MGA{ + "MGA", + "Madagaskarský ariary", + } + MGF{ + "MGF", + "Madagaskarský frank", + } + MHD{ + "MHD", + "Marshall Islands dolár", + } + MKD{ + "MDen", + "Macedónsky denár", + } + MKN{ + "MKN", + "Macedónsky denár (1992-1993)", + } + MLF{ + "MLF", + "Malský frank", + } + MMK{ + "MMK", + "Myanmarský kyat", + } + MMX{ + "MMX", + "Myanmarské dolárové certifikáty", + } + MNT{ + "Tug", + "Mongolský tugrik", + } + MOP{ + "MOP", + "Macao Pataca", + } + MQF{ + "MQF", + "Martinique frank", + } + MRO{ + "UM", + "Mauritania Ouguiya", + } + MTL{ + "Lm", + "Maltská lira", + } + MTP{ + "MTP", + "Maltská libra", + } + MUR{ + "MUR", + "Mauritská rupia", + } + MVP{ + "MVP", + "Maldivská rupia", + } + MVR{ + "MVR", + "Maldivská rufiyaa", + } + MWK{ + "MK", + "Malavská kwacha", + } + MWP{ + "MWP", + "Malavská libra", + } + MXN{ + "MEX$", + "Mexické peso", + } + MXP{ + "MXP", + "Mexické striborné peso (1861-1992)", + } + MXV{ + "MXV", + "Mexické Unidad de Inversion (UDI)", + } + MYR{ + "RM", + "Malajský ringgit", + } + MZE{ + "MZE", + "Mozambijské eskudo", + } + MZM{ + "Mt", + "Mozambijské metical", + } + NAD{ + "N$", + "Namibský dolár", + } + NCF{ + "NCF", + "New Caledonia frank Germinal", + } + NGN{ + "NGN", + "Nigerská naira", + } + NGP{ + "NGP", + "Nigerská libra", + } + NHF{ + "NHF", + "New Hebrides CFP frank", + } + NIC{ + "NIC", + "Nikaragujská cordoba", + } + NIG{ + "NIG", + "Nikaragujská zlatá Cordoba", + } + NIO{ + "NIO", + "Nikaragujská Cordoba Oro", + } + NLG{ + "NLG", + "Nizozemský guilder", + } + NOK{ + "NKr", + "Nórksy krone", + } + NPR{ + "Nrs", + "Nepálska rupia", + } + NZD{ + "$NZ", + "Novozélandský dolár", + } + NZP{ + "NZP", + "Nikaragujská libra", + } + OMR{ + "RO", + "Ománský rial", + } + OMS{ + "OMS", + "Ománský rial Saidi", + } + PAB{ + "PAB", + "Panamská balboa", + } + PDK{ + "PDK", + "Transdniestria rubeľ Kupon", + } + PDN{ + "PDN", + "Transdniestria nový rubeľ", + } + PDR{ + "PDR", + "Transdniestria rubeľ", + } + PEI{ + "PEI", + "Peruvský inti", + } + PEN{ + "PEN", + "Peruvský sol Nuevo", + } + PES{ + "PES", + "Peruvský sol", + } + PGK{ + "PGK", + "Papua Nová Guinea kina", + } + PHP{ + "PHP", + "Filipínske peso", + } + PKR{ + "Pra", + "Pakistanská rupia", + } + PLN{ + "Zl", + "Polský zloty", + } + PLX{ + "PLX", + "Polské certifikáty v US dolároch", + } + PLZ{ + "PLZ", + "Polský zloty (1950-1995)", + } + PSP{ + "PSP", + "Palestínska libra", + } + PTC{ + "PTC", + "Portugalské conto", + } + PTE{ + "PTE", + "Portugalské eskudo", + } + PYG{ + "PYG", + "Paraguayské guarani", + } + QAR{ + "QR", + "Qatarský rial", + } + REF{ + "REF", + "Reunion frank", + } + ROL{ + "leu", + "Rumunský leu", + } + RON{ + "RON", + "Rumunský nový leu", + } + RUB{ + "RUB", + "Ruský rubeľ", + } + RUR{ + "RUR", + "Ruský rubeľ (1991-1998)", + } + RWF{ + "RWF", + "Rwandský frank", + } + SAR{ + "SRl", + "Saudský riyal", + } + SAS{ + "SAS", + "Saudský Riyal", + } + SBD{ + "SI$", + "Solomon Islands dolár", + } + SCR{ + "SR", + "Sejšelská rupia", + } + SDD{ + "SDD", + "Sudánsky dinár", + } + SDP{ + "SDP", + "Sudánska libra", + } + SEK{ + "SKr", + "Švédska krona", + } + SGD{ + "S$", + "Singapúrsky dolár", + } + SHP{ + "SHP", + "Libra", + } + SIB{ + "SIB", + "Slovinský tolar Bons", + } + SIT{ + "SIT", + "Slovinský Tolar", + } + SKK{ + "Sk", + "Slovenská koruna", + } + SLL{ + "SLL", + "Sierra Leone Leone", + } + SML{ + "SML", + "San Marino lira", + } + SOS{ + "So. Sh.", + "Somálsky šiling", + } + SQS{ + "SQS", + "Somálsky šiling", + } + SRG{ + "Sf", + "Surinamský guilder", + } + SSP{ + "SSP", + "Škótska libra", + } + STD{ + "Db", + "Sao Tome a Principe dobra", + } + STE{ + "STE", + "Sao Tome a Principe eskudo", + } + SUN{ + "SUN", + "Sovietský nový rubeľ", + } + SUR{ + "SUR", + "Sovietský rubeľ", + } + SVC{ + "SVC", + "El Salvadorský colon", + } + SYP{ + "LS", + "Syrská libra", + } + SZL{ + "E", + "Swaziland lilangeni", + } + TCC{ + "TCC", + "Turks a Caicos Crown", + } + TDF{ + "TDF", + "Chadský CFA frank", + } + THB{ + "THB", + "Thajský bát", + } + TJR{ + "TJR", + "Tadžikistanský rubeľ", + } + TJS{ + "TJS", + "Tadžikistanský somoni", + } + TMM{ + "TMM", + "Turkménsky manat", + } + TND{ + "TND", + "Tuniský dinár", + } + TOP{ + "T$", + "Tonga Paʻanga", + } + TOS{ + "TOS", + "Tonga libra", + } + TPE{ + "TPE", + "Timorské eskudo", + } + TPP{ + "TPP", + "Timorská pataca", + } + TRL{ + "TL", + "Turecká lira", + } + TTD{ + "TT$", + "Trinidad a Tobago dolár", + } + TTO{ + "TTO", + "Trinidad a Tobago starý dolár", + } + TVD{ + "TVD", + "Tuvalu dolár", + } + TWD{ + "NT$", + "Taiwanský nový dolár", + } + TZS{ + "T Sh", + "Tanzanský šiling", + } + UAH{ + "UAH", + "Ukrainská hrivna", + } + UAK{ + "UAK", + "Ukrainský karbovanetz", + } + UGS{ + "UGS", + "Ugandan šiling (1966-1987)", + } + UGX{ + "U Sh", + "Ugandský šiling", + } + USD{ + "US$", + "US dolár", + } + USN{ + "USN", + "US dolár (Next day)", + } + USS{ + "USS", + "US dolár (Same day)", + } + UYF{ + "UYF", + "Uruguajské peso Fuerte", + } + UYP{ + "UYP", + "Uruguajské peso (1975-1993)", + } + UYU{ + "Ur$", + "Uruguajské peso Uruguayo", + } + UZC{ + "UZC", + "Uzbekistanský Coupon Som", + } + UZS{ + "UZS", + "Uzbekistanský sum", + } + VAL{ + "VAL", + "Vatikánska lira", + } + VDD{ + "VDD", + "Severovietnamský Piastre Dong Viet", + } + VDN{ + "VDN", + "Severovietnamský nový Dong", + } + VDP{ + "VDP", + "Severovietnamský Viet Minh Piastre Dong Viet", + } + VEB{ + "Be", + "Venezuelský bolivar", + } + VGD{ + "VGD", + "British Virgin Islands dolár", + } + VND{ + "VND", + "Vietnamský dong", + } + VNN{ + "VNN", + "Vietnamský nový dong", + } + VNR{ + "VNR", + "Vietnamský dong", + } + VNS{ + "VNS", + "Vietnamský národný dong", + } + VUV{ + "VT", + "Vanuatu vatu", + } + WSP{ + "WSP", + "Západná Samoa libra", + } + WST{ + "WST", + "Západná Samoa tala", + } + XAF{ + "XAF", + "CFA frank BEAC", + } + XAU{ + "XAU", + "Zlato", + } + XCD{ + "EC$", + "East Caribbean dolár", + } + XCF{ + "XCF", + "CFA Nouveau frank", + } + XDR{ + "XDR", + "Špeciálne práva čerpania", + } + XEF{ + "XEF", + "CFA frank BCEAEC", + } + XFO{ + "XFO", + "Francúzsky zlatý frank", + } + XFU{ + "XFU", + "Francúzsky UIC-frank", + } + XID{ + "XID", + "Islamský dinár", + } + XMF{ + "XMF", + "Francúzsky Metropolitan Nouveau frank", + } + XNF{ + "XNF", + "Francúzske Antilly CFA frank", + } + XOF{ + "XOF", + "CFA frank BCEAO", + } + XPF{ + "CFPF", + "CFP frank", + } + XTR{ + "XTR", + "COMECON rubeľ", + } + YDD{ + "YDD", + "Jemenský dinár", + } + YEI{ + "YEI", + "Jemenský Imadi Riyal", + } + YER{ + "YRl", + "Jemenský rial", + } + YUD{ + "YUD", + "Juhoslávsky dinár", + } + YUF{ + "YUF", + "Juhoslávsky dinár", + } + YUG{ + "YUG", + "Juhoslávsky dinár", + } + YUM{ + "YUM", + "Juhoslávsky Noviy dinár", + } + YUN{ + "YUN", + "Juhoslávsky dinár", + } + YUO{ + "YUO", + "Juhoslávsky októbrový dinár", + } + YUR{ + "YUR", + "Juhoslávsky dinár", + } + ZAL{ + "ZAL", + "Juhoafrický rand (financial)", + } + ZAP{ + "ZAP", + "Juhoafrická libra", + } + ZAR{ + "R", + "Juhoafrický rand", + } + ZMK{ + "ZMK", + "Zambská kwacha", + } + ZMP{ + "ZMP", + "Zambská libra", + } + ZRN{ + "ZRN", + "Zairský nový zaire", + } + ZRZ{ + "ZRZ", + "Zairský Zaire", + } + ZWD{ + "Z$", + "Zimbabský dolár", + } } - Languages { - sk { "Sloven\u010Dina" } + ExemplarCharacters{"[a-z ý á é í ó ú ä ô ĺ ŕ č ď ľ ň š ť ž]"} + Keys{ + calendar{"Kalendár"} + collation{"Triedenie"} + currency{"Mena"} } - LocaleID:int { 0x1b } -// LocaleString { "sk" } - MonthAbbreviations { - "jan", - "feb", - "mar", - "apr", - "m\u00E1j", - "j\u00FAn", - "j\u00FAl", - "aug", - "sep", - "okt", - "nov", - "dec", + Languages{ + ar{"arabský"} + bg{"bulharský"} + cs{"český"} + da{"dánsky"} + de{"nemecký"} + el{"grécky"} + en{"anglický"} + es{"španielsky"} + et{"estónsky"} + fi{"fínsky"} + fr{"francúzsky"} + he{"hebrejský"} + hr{"chorvátsky"} + hu{"maďarský"} + it{"taliansky"} + ja{"japonský"} + ko{"kórejský"} + lt{"litovský"} + lv{"lotyšský"} + nl{"holandský"} + no{"nórsky"} + pl{"poľský"} + pt{"portugalský"} + ro{"rumunský"} + ru{"ruský"} + sk{"slovenský"} + sl{"slovinský"} + sv{"švédsky"} + tr{"turecký"} + zh{"čínsky"} } - MonthNames { - "janu\u00E1r", - "febru\u00E1r", - "marec", - "apr\u00EDl", - "m\u00E1j", - "j\u00FAn", - "j\u00FAl", - "august", - "september", - "okt\u00F3ber", - "november", - "december", + LocaleScript{ + "Latn", } - NumberElements { + NumberElements{ ",", - "\u00A0", + " ", ";", "%", "0", "#", "-", "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", + "‰", + "∞", + "�", + "+", + } + Scripts{ + Arab{"Arabský"} + Armn{"Arménsky"} + Cyrl{"Cyrilika"} + Grek{"Grécky"} + Zyyy{"Obecný"} } -// ShortLanguage { "slk" } - localPatternChars { "GanjkHmsSEDFwWxhKzAe" } - zoneStrings { - { - "Africa/Casablanca", - "GMT", - "GMT", - "GMT", - "GMT", + Types{ + calendar{ + buddhist{"Buddhistický kalendár"} + chinese{"Čínsky kalendár"} + gregorian{"Gregoriánsky kalendár"} + hebrew{"Židovský kalendár"} + islamic{"Islamský kalendár"} + islamic-civil{"Islamský občiansky kalendár"} + japanese{"Japonský kalendár"} + } + collation{ + direct{"Priame triedenie"} + phonebook{"Lexikografické triedenie"} + pinyin{"Triedenie pinyin"} + stroke{"Tiedenie podľa ťahov"} + traditional{"Tradičné"} } } -// LocaleScript{ -// "Latn", // ISO 15924 Name -// } - ExemplarCharacters { "[a-z \u00fd \u00e1 \u00e9 \u00ed \u00f3 \u00fa \u00e4 \u00f4 \u013a \u0155 \u010d \u010f \u013e \u0148 \u0161 \u0165 \u017e]" } - - // Currency display names - Currencies { - SKK { "Sk", "SKK" } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 4, + } + DateTimePatterns{ + "H:mm:ss z", + "H:mm:ss z", + "H:mm:ss", + "H:mm", + "EEEE, d. MMMM yyyy", + "d. MMMM yyyy", + "d.M.yyyy", + "d.M.yyyy", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "Ne", + "Po", + "Ut", + "St", + "Št", + "Pi", + "So", + } + narrow{ + "N", + "P", + "U", + "S", + "Š", + "P", + "S", + } + wide{ + "Nedeľa", + "Pondelok", + "Utorok", + "Streda", + "Štvrtok", + "Piatok", + "Sobota", + } + } + } + eras{ + abbreviated{ + "pred n.l.", + "n.l.", + } + } + monthNames{ + format{ + abbreviated{ + "jan", + "feb", + "mar", + "apr", + "máj", + "jún", + "júl", + "aug", + "sep", + "okt", + "nov", + "dec", + } + narrow{ + "j", + "f", + "m", + "a", + "m", + "j", + "j", + "a", + "s", + "o", + "n", + "d", + } + wide{ + "január", + "február", + "marec", + "apríl", + "máj", + "jún", + "júl", + "august", + "september", + "október", + "november", + "december", + } + } + } + } } + localPatternChars{"GanjkHmsSEDFwWxhKzAeugXZ"} } diff --git a/icuSources/data/locales/sk_SK.txt b/icuSources/data/locales/sk_SK.txt index ff53acd0..7ce83f8b 100644 --- a/icuSources/data/locales/sk_SK.txt +++ b/icuSources/data/locales/sk_SK.txt @@ -1,19 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/sk_SK.xml // * // *************************************************************************** - -sk_SK { - Version{ "2.0" } -// LocaleString { "sk_SK" } - NumberPatterns { +sk_SK{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "#,##0.00 \u00A4;-#,##0.00 \u00A4", + "#,##0.00 ¤;-#,##0.00 ¤", "#,##0%", "#E0", } -// ShortCountry { "SVK" } - LocaleID:int { 0x041b } + Version{"1.2"} } diff --git a/icuSources/data/locales/sl.txt b/icuSources/data/locales/sl.txt index e5530202..caff42a1 100644 --- a/icuSources/data/locales/sl.txt +++ b/icuSources/data/locales/sl.txt @@ -1,90 +1,305 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/sl.xml // * // *************************************************************************** - -sl { - Version{"2.0"} - CollationElements { - Version { "1.0" } - Sequence { "& C < c\u030C <<< C\u030C & S < s\u030C <<< S\u030C & Z < z\u030C <<< Z\u030C" } -// Sequence { "& C < c\u030C <<< C\u030C < c\u0301 <<< C\u0301 & D < \u01F3" -// " <<< \u01F2 <<< \u01F1 < \u01C6 <<< \u01C5 <<< \u01C4 < \u0111 <<< \u0110 & L < \u0142 <<< " -// "\u0141 & N < nj <<< nJ <<< Nj <<< NJ & S < s\u030C <<< S\u030C < s\u0301<<< S\u0301 & Z <" -// " z\u030C <<< Z\u030C < z\u0301 <<< Z\u0301 < z\u0307 <<< Z\u0307 " } - } - Countries { - SI { "Slovenija" } - } - DateTimePatterns { - "H:mm:ss z", - "H:mm:ss z", - "H:mm:ss", - "H:mm", - "EEEE, dd. MMMM yyyy", - "dd. MMMM yyyy", - "yyyy.M.d", - "yy.M.d", - "{1} {0}", - } - DayAbbreviations { - "ned", - "pon", - "tor", - "sre", - "\u010det", - "pet", - "sob", - } - DayNames { - "nedelja", - "ponedeljek", - "torek", - "sreda", - "\u010detrtek", - "petek", - "sobota", +/** + * ICU source: ../../../locale/icu/main/sl.xml + */ +sl{ + Countries{ + AD{"Andora"} + AE{"Združeni arabski emirati"} + AF{"Afganistan"} + AG{"Antigva in Barbuda"} + AI{"Angvila"} + AL{"Albanija"} + AM{"Armenija"} + AN{"Nizozemski Antili"} + AO{"Angola"} + AQ{"Antarktika"} + AR{"Argentina"} + AS{"Ameriška Samoa"} + AT{"Avstrija"} + AU{"Avstralija"} + AW{"Aruba"} + AZ{"Azerbajdžan"} + BA{"Bosna in Hercegovina"} + BB{"Barbados"} + BD{"Bangladeš"} + BE{"Belgija"} + BF{"Burkina Faso"} + BG{"Bolgarija"} + BH{"Bahrajn"} + BI{"Burundi"} + BJ{"Benin"} + BM{"Bermuda"} + BN{"Brunej"} + BO{"Bolivija"} + BR{"Brazilija"} + BS{"Bahami"} + BT{"Butan"} + BV{"Otok Bouvet"} + BW{"Bocvana"} + BY{"Belorusija"} + BZ{"Belize"} + CA{"Kanada"} + CC{"Kokosovi otoki"} + CD{"Demokratična republika Kongo"} + CF{"Centralnoafriška republika"} + CG{"Kongo"} + CH{"Švica"} + CI{"Slonokoščena obala"} + CK{"Cookovi otoki"} + CL{"Čile"} + CM{"Kamerun"} + CN{"Kitajska"} + CO{"Kolumbija"} + CR{"Kostarika"} + CU{"Kuba"} + CV{"Kapverdski otoki"} + CX{"Božični otok"} + CY{"Ciper"} + CZ{"Češka"} + DE{"Nemčija"} + DJ{"Džibuti"} + DK{"Danska"} + DM{"Dominika"} + DO{"Dominikanska republika"} + DZ{"Alžirija"} + EC{"Ekvador"} + EE{"Estonija"} + EG{"Egipt"} + EH{"Zahodna Sahara"} + ER{"Eritreja"} + ES{"Španija"} + ET{"Etiopija"} + FI{"Finska"} + FJ{"Fidži"} + FK{"Falklandski (Malvinski) otoki"} + FM{"Mikronezija"} + FO{"Fererski otoki"} + FR{"Francija"} + GA{"Gabon"} + GB{"Velika Britanija"} + GD{"Grenada"} + GE{"Gruzija"} + GF{"Francoska Gvajana"} + GH{"Gana"} + GI{"Gibraltar"} + GL{"Grenlandija"} + GM{"Gambija"} + GN{"Gvineja"} + GP{"Guadeloupe"} + GQ{"Ekvatorialna Gvineja"} + GR{"Grčija"} + GS{"Južna Georgija in Južni Sandwich Islands"} + GT{"Gvatemala"} + GU{"Guam"} + GW{"Gvineja Bissau"} + GY{"Gvajana"} + HK{"Hong Kong S.A.R. Kitajske"} + HM{"Heardov otok in McDonaldovi otoki"} + HN{"Honduras"} + HR{"Hrvaška"} + HT{"Haiti"} + HU{"Madžarska"} + ID{"Indonezija"} + IE{"Irska"} + IL{"Izrael"} + IN{"Indija"} + IO{"Britanska Indija"} + IQ{"Irak"} + IR{"Iran"} + IS{"Islandija"} + IT{"Italija"} + JM{"Jamajka"} + JO{"Jordan"} + JP{"Japonska"} + KE{"Kenija"} + KG{"Kirgizistan"} + KH{"Kambodža"} + KI{"Kiribati"} + KM{"Komori"} + KN{"Saint Kitts in Nevis"} + KP{"Severna Koreja"} + KR{"Južna Koreja"} + KW{"Kuvajt"} + KY{"Kajmanski otoki"} + KZ{"Kazahstan"} + LA{"Ljudska demokratična republika Laos"} + LB{"Libanon"} + LC{"Saint Lucia"} + LI{"Liechtenstein"} + LK{"Šrilanka"} + LR{"Liberija"} + LS{"Lesoto"} + LT{"Litva"} + LU{"Luxemburg"} + LV{"Latvija"} + LY{"Libija"} + MA{"Maroko"} + MC{"Monako"} + MD{"Republika Moldova"} + MG{"Madagaskar"} + MH{"Marshallovi otoki"} + MK{"Republika Makedonija"} + ML{"Mali"} + MM{"Myanmar"} + MN{"Mongolija"} + MO{"Makao S.A.R. Kitajske"} + MP{"Severni Marianski otoki"} + MQ{"Martinik"} + MR{"Mavretanija"} + MS{"Montserrat"} + MT{"Malta"} + MU{"Mauritius"} + MV{"Maldivi"} + MW{"Malavi"} + MX{"Mehika"} + MY{"Malezija"} + MZ{"Mozambik"} + NA{"Namibija"} + NC{"Nova Kaledonija"} + NE{"Niger"} + NF{"Otok Norfolk"} + NG{"Nigerija"} + NI{"Nikaragva"} + NL{"Nizozemska"} + NO{"Norveška"} + NP{"Nepal"} + NR{"Nauru"} + NU{"Niue"} + NZ{"Nova Zelandija"} + OM{"Oman"} + PA{"Panama"} + PE{"Peru"} + PF{"Francoska Polinezija"} + PG{"Papua Nova Gvineja"} + PH{"Filipini"} + PK{"Pakistan"} + PL{"Poljska"} + PM{"Saint Pierre in Miquelon"} + PN{"Pitcairn"} + PR{"Portoriko"} + PS{"Palestinsko ozemlje"} + PT{"Portugalska"} + PW{"Palau"} + PY{"Paragvaj"} + QA{"Katar"} + RE{"Reunion"} + RO{"Romunija"} + RU{"Ruska federacija"} + RW{"Ruanda"} + SA{"Saudova Arabija"} + SB{"Salomonovo otočje"} + SC{"Sejšeli"} + SD{"Sudan"} + SE{"Švedska"} + SG{"Singapur"} + SH{"Sveta Helena"} + SI{"Slovenija"} + SJ{"Svalbard in Jan Mayen"} + SK{"Slovaška"} + SL{"Sierra Leone"} + SM{"San Marino"} + SN{"Senegal"} + SO{"Somalija"} + SP{"Serbia"} + SR{"Surinam"} + ST{"Sao Tome in Principe"} + SV{"Salvador"} + SY{"Sirija"} + SZ{"Svazi"} + TC{"Otočji Turks in Caicos"} + TD{"Čad"} + TF{"Francoski južni teritorij"} + TG{"Togo"} + TH{"Tajska"} + TJ{"Tadžikistan"} + TK{"Tokelau"} + TL{"Vzhodni Timor"} + TM{"Turkmenistan"} + TN{"Tunizija"} + TO{"Tonga"} + TR{"Turčija"} + TT{"Trinidad in Tobago"} + TV{"Tuvalu"} + TW{"Tajvan"} + TZ{"Tanzanija"} + UA{"Ukrajina"} + UG{"Uganda"} + UM{"Ameriški manjši oddaljeni otoki"} + US{"Združene države Amerike"} + UY{"Urugvaj"} + UZ{"Uzbekistan"} + VA{"Vatikan"} + VC{"Saint Vincent in Grenadine"} + VE{"Venezuela"} + VG{"Britanski Deviški otoki"} + VI{"Ameriški Deviški otoki"} + VN{"Vietnam"} + VU{"Vanuatu"} + WF{"Wallis in Futuna"} + WS{"Samoa"} + YE{"Jemen"} + YT{"Mayotte"} + YU{"Jugoslavija"} + ZA{"Južna Afrika"} + ZM{"Zambija"} + ZW{"Zimbabve"} } - Eras { - "pr.n.\u0161.", - "po Kr.", + Currencies{ + SIT{ + "SIT", + "Slovenski tolar", + } } - Languages { - sl { "Sloven\u0161\u010Dina" } + ExemplarCharacters{"[a-pr-vzčšž]"} + Keys{ + calendar{"Kolendar"} + collation{"Zlaganje"} + currency{"Valuta"} } - LocaleID:int { 0x24 } -// LocaleString { "sl" } - MonthAbbreviations { - "jan", - "feb", - "mar", - "apr", - "maj", - "jun", - "jul", - "avg", - "sep", - "okt", - "nov", - "dec", + Languages{ + ar{"Arabščina"} + bg{"Bolgarščina"} + cs{"Češčina"} + da{"Danščina"} + de{"Nemščina"} + el{"Grščina"} + en{"Angleščina"} + es{"Španščina"} + et{"Estonščina"} + fi{"Finščina"} + fr{"Francoščina"} + he{"Hebrejščina"} + hr{"Hrvaščina"} + hu{"Madžarščina"} + it{"Italijanščina"} + ja{"Japonščina"} + ko{"Korejščina"} + lt{"Litovščina"} + lv{"Letonščina"} + nl{"Nizozemščina"} + no{"Norveščina"} + pl{"Poljščina"} + pt{"Portugalščina"} + ro{"Romunščina"} + ru{"Ruščina"} + sk{"Slovaščina"} + sl{"Slovenščina"} + sv{"Švedščina"} + tr{"Turščina"} + zh{"Kitajščina"} } - MonthNames { - "januar", - "februar", - "marec", - "april", - "maj", - "junij", - "julij", - "avgust", - "september", - "oktober", - "november", - "december", + LocaleScript{ + "Latn", } - NumberElements { + NumberElements{ ",", ".", ";", @@ -93,29 +308,131 @@ sl { "#", "-", "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", + "‰", + "∞", + "�", + "+", } -// ShortLanguage { "slv" } - localPatternChars { "GanjkHmsSEDFwWxhKzAe" } - zoneStrings { - { - "Africa/Casablanca", - "GMT", - "GMT", - "GMT", - "GMT", + Types{ + calendar{ + buddhist{"Budistični kolendar"} + chinese{"Kitajski kolendar"} + gregorian{"Gregorijanski kolendar"} + hebrew{"Hebrejski kolendar"} + islamic{"Islamski kolendar"} + islamic-civil{"Islamski civilni kolendar"} + japanese{"Japonski kolendar"} + } + collation{ + direct{"Direktno zlaganje"} + phonebook{"Zlaganje po abecedi"} + pinyin{"Pinyin zlaganje"} + stroke{"Stroke order zlaganje"} + traditional{"Tradicionano zlaganje"} } } -// LocaleScript{ -// "Latn", // ISO 15924 Name -// } - ExemplarCharacters { "[a-p r-v z \u010d \u0161 \u017e]" } - - // Currency display names - Currencies { - SIT { "SIT", "SIT" } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "H:mm:ss z", + "H:mm:ss z", + "H:mm:ss", + "H:mm", + "EEEE, dd. MMMM yyyy", + "dd. MMMM yyyy", + "yyyy.M.d", + "yy.M.d", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "ned", + "pon", + "tor", + "sre", + "čet", + "pet", + "sob", + } + narrow{ + "n", + "p", + "t", + "s", + "č", + "p", + "s", + } + wide{ + "nedelja", + "ponedeljek", + "torek", + "sreda", + "četrtek", + "petek", + "sobota", + } + } + } + eras{ + abbreviated{ + "pr.n.š.", + "po Kr.", + } + } + monthNames{ + format{ + abbreviated{ + "jan", + "feb", + "mar", + "apr", + "maj", + "jun", + "jul", + "avg", + "sep", + "okt", + "nov", + "dec", + } + narrow{ + "j", + "f", + "m", + "a", + "m", + "j", + "j", + "a", + "s", + "o", + "n", + "d", + } + wide{ + "januar", + "februar", + "marec", + "april", + "maj", + "junij", + "julij", + "avgust", + "september", + "oktober", + "november", + "december", + } + } + } + } } + localPatternChars{"GanjkHmsSEDFwWxhKzAeugXZ"} } diff --git a/icuSources/data/locales/sl_SI.txt b/icuSources/data/locales/sl_SI.txt index 358cc6e5..9eae5b84 100644 --- a/icuSources/data/locales/sl_SI.txt +++ b/icuSources/data/locales/sl_SI.txt @@ -1,18 +1,11 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/sl_SI.xml // * // *************************************************************************** - -sl_SI { - Version{ "2.0" } -// LocaleString { "sl_SI" } -// NumberPatterns { -// "#,##0.###;-#,##0.###", -// "\u00A4 #,##0.00;-\u00A4 #,##0.00", -// "#,##0%", -// } -// ShortCountry { "SVN" } - LocaleID:int { 0x0424 } +sl_SI{ + Version{"1.2"} } diff --git a/icuSources/data/locales/so.txt b/icuSources/data/locales/so.txt index 6a458ded..4eb2f7ab 100644 --- a/icuSources/data/locales/so.txt +++ b/icuSources/data/locales/so.txt @@ -1,98 +1,212 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 2001-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/so.xml // * // *************************************************************************** -// * Somali language locale. -// * Contributed by : -// * Daniel Yacob , Ge'ez Frontier Foundation -// * Mohamed Diriye Abdullahi -// * Department of Linguistics and Translation, Universite de Montreal, Montreal - -so{ - Version{ "2.0" } - DayAbbreviations { - "Axa", - "Isn", - "Sal", - "Arb", - "Kha", - "Jim", - "Sab", - } - DayNames { - "Axad", - "Isniin", - "Salaaso", - "Arbaco", - "Khamiis", - "Jimco", - "Sabti", - } - MonthAbbreviations { - "Kob", - "Lab", - "Sad", - "Afr", - "Sha", - "Lix", - "Tod", - "Sid", - "Sag", - "Tob", - "KIT", - "LIT", - } - MonthNames { - "Bisha Koobaad", - "Bisha Labaad", - "Bisha Saddexaad", - "Bisha Afraad", - "Bisha Shanaad", - "Bisha Lixaad", - "Bisha Todobaad", - "Bisha Sideedaad", - "Bisha Sagaalaad", - "Bisha Tobnaad", - "Bisha Kow iyo Tobnaad", - "Bisha Laba iyo Tobnaad", - } - Eras { - "Ciise ka hor", - "Ciise ka dib" - } - Languages { - so { "Soomaali" } - } - Countries { - DJ { "Jabuuti" } - ET { "Itoobiya" } - KE { "Kiiniya" } - SO { "Soomaaliya" } +/** + * ICU source: ../../../locale/icu/main/so.xml + */ +so{ + Countries{ + AE{"Imaaraadka Carabta ee Midoobay"} + AF{"Afgaanistaan"} + AM{"Armeeniya"} + AO{"Angoola"} + AT{"Osteeriya"} + AU{"Awstraaliya"} + BA{"Boosniya Heersigoviina"} + BB{"Baarbadoos"} + BD{"Bangaala-Deesh"} + BE{"Beljiyam"} + BH{"Baxrayn"} + BJ{"Beniin"} + BR{"Braasiil"} + CA{"Kanada"} + CH{"Swiiserlaand"} + CL{"Jili"} + CM{"Kameruun"} + CN{"Shiinaha"} + CU{"Kuuba"} + DE{"Jarmal"} + DJ{"Jabuuti"} + DK{"Danmaark"} + EG{"Masar"} + ES{"Isbeyn"} + ET{"Itoobiya"} + FI{"Fiinlaand"} + FR{"Faransiis"} + GD{"Giriinaada"} + GN{"Gini"} + GR{"Giriigga"} + HR{"Korweeshiya"} + HU{"Hangeri"} + ID{"Indoneesiya"} + IE{"Ayrlaanda"} + IL{"Israa'iil"} + IN{"Hindiya"} + IQ{"Ciraaq"} + IR{"Iiraan"} + IS{"Iislaand"} + IT{"Talyaani"} + JM{"Jameyka"} + JO{"Urdun"} + JP{"Jabbaan"} + KE{"Kiiniya"} + KH{"Kamboodiya"} + KP{"Kuuriyada Waqooyi"} + KR{"Kuuriyada Koonfureed"} + KW{"Kuwayt"} + KZ{"Kasaakhistaan"} + LB{"Lubnaan"} + LK{"Siirilaanka"} + LR{"Laybeeriya"} + LS{"Losooto"} + LU{"Luksemboorg"} + LV{"Laatfiya"} + LY{"Liibiya"} + MA{"Marooko"} + MC{"Moonako"} + MK{"Makadooniya"} + ML{"Maali"} + MR{"Muritaaniya"} + MT{"Maalda"} + MV{"Maaldiqeen"} + MW{"Malaawi"} + MX{"Meksiko"} + MZ{"Musambiig"} + NA{"Namiibiya"} + NG{"Nayjeeriya"} + NI{"Nikaraaguwa"} + NO{"Noorweey"} + NZ{"Neyuusilaand"} + OM{"Cumaan"} + PH{"Filibiin"} + PK{"Bakistaan"} + PL{"Booland"} + PT{"Bortuqaal"} + QA{"Qadar"} + RO{"Rumaaniya"} + RU{"Ruush"} + SA{"Sacuudi Carabiya"} + SD{"Sudaan"} + SE{"Iswidhan"} + SL{"Siraaliyoon"} + SO{"Soomaaliya"} + SY{"Suuriya"} + TD{"Jaad"} + TG{"Toogo"} + TH{"Taylaand"} + TN{"Tuniisiya"} + TR{"Turki"} + TZ{"Tansaaniya"} + UG{"Ugaanda"} + US{"Qaramada Midoobey ee Maraykanka"} + VA{"Faatikaan"} + VE{"Fenisuweela"} + VN{"Fiyetnaam"} + YE{"Yaman"} + ZA{"Koonfur Afrika"} + ZM{"Saambiya"} + ZW{"Simbaabwe"} } - AmPmMarkers { - "sn", - "gn", + Currencies{ + KES{ + "Ksh", + "KES", + } } - DateTimeElements:intvector { - 7, - 1, + ExemplarCharacters{"[a-z]"} + Languages{ + so{"Soomaali"} } - DateTimePatterns { - "h:mm:ss a", - "h:mm:ss a", - "h:mm:ss a", - "h:mm a", - "EEEE, MMMM dd, yyyy", - "dd MMMM yyyy", - "dd-MMM-yy", - "dd/MM/yy", - "{1} {0}", + LocaleScript{ + "Latn", } - - // Currency display names - Currencies { - KES { "Ksh", "KES" } + Version{"1.2"} + calendar{ + gregorian{ + AmPmMarkers{ + "sn", + "gn", + } + DateTimeElements:intvector{ + 7, + 1, + } + DateTimePatterns{ + "h:mm:ss a", + "h:mm:ss a", + "h:mm:ss a", + "h:mm a", + "EEEE, MMMM dd, yyyy", + "dd MMMM yyyy", + "dd-MMM-yyyy", + "dd/MM/yy", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "Axa", + "Isn", + "Sal", + "Arb", + "Kha", + "Jim", + "Sab", + } + wide{ + "Axad", + "Isniin", + "Salaaso", + "Arbaco", + "Khamiis", + "Jimco", + "Sabti", + } + } + } + eras{ + abbreviated{ + "Ciise ka hor", + "Ciise ka dib", + } + } + monthNames{ + format{ + abbreviated{ + "Kob", + "Lab", + "Sad", + "Afr", + "Sha", + "Lix", + "Tod", + "Sid", + "Sag", + "Tob", + "KIT", + "LIT", + } + wide{ + "Bisha Koobaad", + "Bisha Labaad", + "Bisha Saddexaad", + "Bisha Afraad", + "Bisha Shanaad", + "Bisha Lixaad", + "Bisha Todobaad", + "Bisha Sideedaad", + "Bisha Sagaalaad", + "Bisha Tobnaad", + "Bisha Kow iyo Tobnaad", + "Bisha Laba iyo Tobnaad", + } + } + } + } } } diff --git a/icuSources/data/locales/so_DJ.txt b/icuSources/data/locales/so_DJ.txt index 4a135723..6a022dd3 100644 --- a/icuSources/data/locales/so_DJ.txt +++ b/icuSources/data/locales/so_DJ.txt @@ -1,47 +1,27 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 2001-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/so_DJ.xml // * // *************************************************************************** -// * Somali language locale for Djibouti. -// * Contributed by : -// * Daniel Yacob , Ge'ez Frontier Foundation -// * Mohamed Diriye Abdullahi -// * Department of Linguistics and Translation, Universite de Montreal, Montreal - -so_DJ { - Version{ "2.0" } - - - // Measurement { "Metric" } -// NumberElements { -// ".", -// ",", -// ";", -// "%", -// "0", -// "#", -// "-", -// "E", -// "\u2030", -// "\u221E", -// "\uFFFD", -// } - NumberPatterns { +so_DJ{ + Currencies{ + DJF{ + "$", + "DJF", + } + USD{ + "US$", + "USD", + } + } + NumberPatterns{ "#,##0.###;-#,##0.###", - "\u00A4#,##0.00;-\u00A4#,##0.00", + "¤#,##0.00;-¤#,##0.00", "#,##0%", "#E0", } - // PaperSize { - // Height { "297" } - // Width { "210" } - // Units { "mm" } - // } - - // Currency display names - Currencies { - DJF { "$", "DJF" } - } - } + Version{"1.2"} +} diff --git a/icuSources/data/locales/so_ET.txt b/icuSources/data/locales/so_ET.txt index ef53f74e..0867f6b5 100644 --- a/icuSources/data/locales/so_ET.txt +++ b/icuSources/data/locales/so_ET.txt @@ -1,46 +1,27 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 2001-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/so_ET.xml // * // *************************************************************************** -// * Somali language locale for Ethiopia. -// * Contributed by : -// * Daniel Yacob , Ge'ez Frontier Foundation -// * Mohamed Diriye Abdullahi -// * Department of Linguistics and Translation, Universite de Montreal, Montreal - - -so_ET { - Version{ "2.0" } - // Measurement { "Metric" } -// NumberElements { -// ".", -// ",", -// ";", -// "%", -// "0", -// "#", -// "-", -// "E", -// "\u2030", -// "\u221E", -// "\uFFFD", -// } - NumberPatterns { +so_ET{ + Currencies{ + ETB{ + "$", + "ETB", + } + USD{ + "US$", + "USD", + } + } + NumberPatterns{ "#,##0.###;-#,##0.###", - "\u00A4#,##0.00;-\u00A4#,##0.00", + "¤#,##0.00;-¤#,##0.00", "#,##0%", "#E0", } - // PaperSize { - // Height { "297" } - // Width { "210" } - // Units { "mm" } - // } - - // Currency display names - Currencies { - ETB { "$", "ETB" } - } - } + Version{"1.2"} +} diff --git a/icuSources/data/locales/so_KE.txt b/icuSources/data/locales/so_KE.txt index 587931f2..49f9b1bb 100644 --- a/icuSources/data/locales/so_KE.txt +++ b/icuSources/data/locales/so_KE.txt @@ -1,45 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 2001-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/so_KE.xml // * // *************************************************************************** -// * Somali language locale for Kenya. -// * Contributed by : -// * Daniel Yacob , Ge'ez Frontier Foundation -// * Mohamed Diriye Abdullahi -// * Department of Linguistics and Translation, Universite de Montreal, Montreal - - -so_KE { - Version{ "2.0" } - AmPmMarkers { - "sn", - "gn", - } - // Measurement { "Metric" } -// NumberElements { -// ".", -// ",", -// ";", -// "%", -// "0", -// "#", -// "-", -// "E", -// "\u2030", -// "\u221E", -// "\uFFFD", -// } - NumberPatterns { +so_KE{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "\u00A4#,##0.00;-\u00A4#,##0.00", + "¤#,##0.00;-¤#,##0.00", "#,##0%", "#E0", } - // PaperSize { - // Height { "297" } - // Width { "210" } - // Units { "mm" } - // } - } + Version{"1.2"} +} diff --git a/icuSources/data/locales/so_SO.txt b/icuSources/data/locales/so_SO.txt index 165d521a..1bd6ec87 100644 --- a/icuSources/data/locales/so_SO.txt +++ b/icuSources/data/locales/so_SO.txt @@ -1,46 +1,27 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 2001-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/so_SO.xml // * // *************************************************************************** -// * Somali language locale for Somalia. -// * Contributed by : -// * Daniel Yacob , Ge'ez Frontier Foundation -// * Mohamed Diriye Abdullahi -// * Department of Linguistics and Translation, Universite de Montreal, Montreal - - -so_SO { - Version{ "2.0" } - // Measurement { "Metric" } -// NumberElements { -// ".", -// ",", -// ";", -// "%", -// "0", -// "#", -// "-", -// "E", -// "\u2030", -// "\u221E", -// "\uFFFD", -// } - NumberPatterns { +so_SO{ + Currencies{ + SOS{ + "$", + "SOS", + } + USD{ + "US$", + "USD", + } + } + NumberPatterns{ "#,##0.###;-#,##0.###", - "\u00A4#,##0.00;-\u00A4#,##0.00", + "¤#,##0.00;-¤#,##0.00", "#,##0%", "#E0", } - // PaperSize { - // Height { "297" } - // Width { "210" } - // Units { "mm" } - // } - - // Currency display names - Currencies { - SOS { "$", "SOS" } - } - } + Version{"1.2"} +} diff --git a/icuSources/data/locales/sq.txt b/icuSources/data/locales/sq.txt index 2042dfdb..b97b92f6 100644 --- a/icuSources/data/locales/sq.txt +++ b/icuSources/data/locales/sq.txt @@ -1,90 +1,183 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/sq.xml // * // *************************************************************************** - -sq { - Version{ "2.0" } - AmPmMarkers { - "PD", - "MD", - } - CollationElements { - Version { "1.0" } - Sequence { "@" } - } - Countries { - AL { "Shqip\u00EBria" } - } - DateTimePatterns { - "h.mm.ss.a z", - "h.mm.ss.a z", - "h:mm:ss.a", - "h.mm.a", - "EEEE, dd MMMM yyyy", - "dd MMMM yyyy", - "yyyy-MM-dd", - "yy-MM-dd", - "{1} {0}", - } - DayAbbreviations { - "Die", - "H\u00EBn", - "Mar", - "M\u00EBr", - "Enj", - "Pre", - "Sht", +/** + * ICU source: ../../../locale/icu/main/sq.xml + */ +sq{ + Countries{ + AD{"Andorrë"} + AE{"Emiratet Arabe te Bashkuara"} + AF{"Afganistan"} + AG{"Antigua e Barbuda"} + AL{"Shqipëria"} + AM{"Armeni"} + AO{"Angolë"} + AR{"Argjentinë"} + AT{"Austri"} + AU{"Australi"} + AZ{"Azerbajxhan"} + BA{"Bosnja dhe Hercegovina"} + BE{"Belgjikë"} + BG{"Bullgari"} + BH{"Bahrein"} + BN{"Brunej"} + BO{"Bolivi"} + BT{"Butan"} + BW{"Botsvana"} + BY{"Bjellorusi"} + CA{"Kanada"} + CF{"Republika Qendrore e Afrikës"} + CG{"Kongo"} + CH{"Zvicër"} + CI{"Bregu i Fildishtë"} + CL{"Kili"} + CM{"Kamerun"} + CN{"Kinë"} + CO{"Kolumbi"} + CR{"Kosta Rika"} + CU{"Kubë"} + CV{"Kap Verde"} + CY{"Qipro"} + CZ{"Republika e Çekisë"} + DE{"Gjermani"} + DJ{"Xhibuti"} + DK{"Danimarkë"} + DM{"Dominikë"} + DO{"Republika Dominikanë"} + DZ{"Algjeri"} + EC{"Ekuator"} + EE{"Estoni"} + EG{"Egjipt"} + EH{"Saharaja Perëndimore"} + ER{"Eritre"} + ES{"Spanjë"} + ET{"Etiopi"} + FI{"Finlandë"} + FJ{"Fixhi"} + FM{"Mikronezi"} + FR{"Francë"} + GA{"Gjabon"} + GE{"Gjeorgji"} + GH{"Ganë"} + GM{"Gambi"} + GN{"Guine"} + GQ{"Guineja Ekuatoriale"} + GR{"Greqi"} + GT{"Guatemalë"} + GW{"Guine Bisau"} + GY{"Guajana"} + HR{"Kroaci"} + HU{"Hungari"} + ID{"Indonezi"} + IE{"Irlandë"} + IL{"Izrael"} + IN{"Indi"} + IQ{"Irak"} + IS{"Islandë"} + IT{"Itali"} + JM{"Xhamajkë"} + JO{"Jordani"} + JP{"Japoni"} + KE{"Kenia"} + KG{"Kirgistan"} + KH{"Kamboxhi"} + KI{"Qiribati"} + KM{"Komore"} + KN{"Saint Kitts e Nevis"} + KP{"Koreja e Veriut"} + KR{"Koreja e Jugut"} + KW{"Kuvajt"} + KZ{"Kazakistan"} + LB{"Liban"} + LI{"Lihtënshtajn"} + LR{"Liberi"} + LS{"Lesoto"} + LT{"Lituani"} + LU{"Luksemburg"} + LV{"Letoni"} + LY{"Libi"} + MA{"Maroko"} + MC{"Monako"} + MD{"Moldavi"} + MG{"Madagaskar"} + MH{"Ishujt Marshall"} + MK{"Maqedoni"} + MN{"Mongoli"} + MR{"Mauritani"} + MT{"Maltë"} + MV{"Maldivit"} + MW{"Malavi"} + MX{"Meksikë"} + MY{"Malajzi"} + MZ{"Mozambik"} + NA{"Namibi"} + NG{"Nigeri"} + NI{"Nikaragua"} + NL{"Vendet e Ulëta"} + NO{"Norvegji"} + NZ{"Zelanda e Re"} + PG{"Papua Guineja e Re"} + PH{"Filipine"} + PL{"Poloni"} + PT{"Portugali"} + PY{"Paraguaj"} + QA{"Katar"} + RO{"Rumani"} + RU{"Rusi"} + RW{"Ruanda"} + SA{"Arabia Saudite"} + SB{"Ishujt Solomon"} + SC{"Sishel"} + SE{"Suedi"} + SG{"Singapor"} + SI{"Slloveni"} + SK{"Sllovaki"} + SL{"Siera Leone"} + SO{"Somali"} + SP{"Serbië"} + ST{"Sao Tome e Prinsipe"} + SY{"Siri"} + SZ{"Svazilandë"} + TD{"Çad"} + TG{"Togo"} + TH{"Tajlandë"} + TJ{"Taxhikistan"} + TN{"Tunisi"} + TR{"Turqi"} + TT{"Trinidad e Tobago"} + TW{"Tajvan"} + TZ{"Tanzani"} + UA{"Ukrainë"} + US{"Shtetet e Bashkuara të Amerikës"} + UY{"Uruguaj"} + VA{"Vatikan"} + VC{"Saint Vincent e Grenadinet"} + VE{"Venezuelë"} + YE{"Jemen"} + ZA{"Afrika e Jugut"} + ZM{"Zambi"} + ZW{"Zimbabve"} } - DayNames { - "e diel", - "e h\u00EBn\u00EB", - "e mart\u00EB", - "e m\u00EBrkur\u00EB", - "e enjte", - "e premte", - "e shtun\u00EB", - } - Eras { - "p.e.r.", - "n.e.r.", - } - Languages { - sq { "shqipe" } + Currencies{ + ALL{ + "Lek", + "ALL", + } } - LocaleID:int { 0x1c } -// LocaleString { "sq" } - MonthAbbreviations { - "Jan", - "Shk", - "Mar", - "Pri", - "Maj", - "Qer", - "Kor", - "Gsh", - "Sht", - "Tet", - "N\u00EBn", - "Dhj", + ExemplarCharacters{"[a-zçë{dh}{gj}{ll}{nj}{rr}{sh}{th}{xh}{zh}]"} + Languages{ + sq{"shqipe"} } - MonthNames { - "janar", - "shkurt", - "mars", - "prill", - "maj", - "qershor", - "korrik", - "gusht", - "shtator", - "tetor", - "n\u00EBntor", - "dhjetor", + LocaleScript{ + "Latn", } - NumberElements { + NumberElements{ ",", ".", ";", @@ -93,29 +186,94 @@ sq { "#", "-", "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", + "‰", + "∞", + "�", + "+", } -// ShortLanguage { "sqi" } - localPatternChars { "GanjkHmsSEDFwWxhKzAe" } - zoneStrings { - { - "Africa/Casablanca", - "GMT", - "GMT", - "GMT", - "GMT", + Version{"1.2"} + calendar{ + gregorian{ + AmPmMarkers{ + "PD", + "MD", + } + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "h.mm.ss.a z", + "h.mm.ss.a z", + "h:mm:ss.a", + "h.mm.a", + "EEEE, dd MMMM yyyy", + "dd MMMM yyyy", + "yyyy-MM-dd", + "yy-MM-dd", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "Die", + "Hën", + "Mar", + "Mër", + "Enj", + "Pre", + "Sht", + } + wide{ + "e diel", + "e hënë", + "e martë", + "e mërkurë", + "e enjte", + "e premte", + "e shtunë", + } + } + } + eras{ + abbreviated{ + "p.e.r.", + "n.e.r.", + } + } + monthNames{ + format{ + abbreviated{ + "Jan", + "Shk", + "Mar", + "Pri", + "Maj", + "Qer", + "Kor", + "Gsh", + "Sht", + "Tet", + "Nën", + "Dhj", + } + wide{ + "janar", + "shkurt", + "mars", + "prill", + "maj", + "qershor", + "korrik", + "gusht", + "shtator", + "tetor", + "nëntor", + "dhjetor", + } + } + } } } -// LocaleScript{ -// "Latn", // ISO 15924 Name -// } - ExemplarCharacters { "[a-z \u00eb \u00e7]" } - - // Currency display names - Currencies { - ALL { "Lek", "ALL" } - } + localPatternChars{"GanjkHmsSEDFwWxhKzAeugXZ"} } diff --git a/icuSources/data/locales/sq_AL.txt b/icuSources/data/locales/sq_AL.txt index 377efe6a..d2ba9684 100644 --- a/icuSources/data/locales/sq_AL.txt +++ b/icuSources/data/locales/sq_AL.txt @@ -1,28 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/sq_AL.xml // * // *************************************************************************** - -sq_AL { - Version{ "2.0" } -// LocaleString { "sq_AL" } - NumberPatterns { +sq_AL{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "\u00A4#,##0.00;-\u00A4#,##0.00", + "¤#,##0.00;-¤#,##0.00", "#,##0%", "#E0", } - zoneStrings { - { - "Europe/Tirane", - "CET", // TODO: Replace with long Albanian name - "CET", - "CEST", // TODO: Replace with long Albanian name - "CEST", - } - } -// ShortCountry { "ALB" } - LocaleID:int { 0x041c } + Version{"1.2"} } diff --git a/icuSources/data/locales/sr.txt b/icuSources/data/locales/sr.txt index d96d231b..d6be31b2 100644 --- a/icuSources/data/locales/sr.txt +++ b/icuSources/data/locales/sr.txt @@ -1,361 +1,610 @@ -// *************************************************************************** -// * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -sr { - Version{ "2.0"} - // We use UCA collation table optimized for Cyrillic - // as defined in the Russian locale - CollationElements:alias { "ru" } - Countries { - AF { "\u0410\u0432\u0433\u0430\u043D\u0438\u0441\u0442\u0430\u043D" } - AL { "\u0410\u043B\u0431\u0430\u043D\u0438\u0458\u0430" } - DZ { "\u0410\u043B\u0436\u0438\u0440" } - AD { "\u0410\u043D\u0434\u043E\u0440\u0430" } - AO { "\u0410\u043D\u0433\u043E\u043B\u0430" } - AR { "\u0410\u0440\u0433\u0435\u043D\u0442\u0438\u043D\u0430" } - AM { "\u0410\u0440\u043C\u0435\u043D\u0438\u0458\u0430" } - AW { "\u0410\u0440\u0443\u0431\u0430" } - AU { "\u0410\u0443\u0441\u0442\u0440\u0430\u043B\u0438\u0458\u0430" } - AT { "\u0410\u0443\u0441\u0442\u0440\u0438\u0458\u0430" } - AZ { "\u0410\u0437\u0435\u0440\u0431\u0435\u0458\u045F\u0430\u043D" } - BS { "\u0411\u0430\u0445\u0430\u043C\u0438" } - BH { "\u0411\u0430\u0445\u0440\u0435\u0438\u043D" } - BD { "\u0411\u0430\u043D\u0433\u043B\u0430\u0434\u0435\u0448" } - BB { "\u0411\u0430\u0440\u0431\u0430\u0434\u043E\u0441" } - BY { "\u0411\u0435\u043B\u043E\u0440\u0443\u0441\u0438\u0458\u0430" } - BE { "\u0411\u0435\u043B\u0433\u0438\u0458\u0430" } - BZ { "\u0411\u0435\u043B\u0438\u0441\u0435" } - BJ { "\u0411\u0435\u043D\u0438\u043D" } - BM { "\u0411\u0435\u0440\u043C\u0443\u0434\u0430" } - BT { "\u0411\u0443\u0442\u0430\u043D" } - BO { "\u0411\u043E\u043B\u0438\u0432\u0438\u0458\u0430" } - BA { "\u0411\u043E\u0441\u043D\u0430 \u0438 \u0425\u0435\u0440\u0446\u0435\u0433\u043E\u0432\u0438\u043D\u0430" } - BW { "\u0411\u043E\u0446\u0432\u0430\u043D\u0430" } - BR { "\u0411\u0440\u0430\u0455\u0438\u043B" } - BN { "\u0411\u0440\u0443\u043D\u0435\u0458" } - BG { "\u0411\u0443\u0433\u0430\u0440\u0441\u043A\u0430" } - BF { "\u0411\u0443\u0440\u043A\u0438\u043D\u0430 \u0424\u0430\u0441\u043E" } - BI { "\u0411\u0443\u0440\u0443\u043D\u0434\u0438" } - KH { "\u041A\u0430\u043C\u0431\u043E\u045F\u0430" } - CM { "\u041A\u0430\u043C\u0435\u0440\u0443\u043D" } - CA { "\u041A\u0430\u043D\u0430\u0434\u0430" } - CF { "\u0426\u0435\u043D\u0442\u0440\u0430\u043B\u043D\u043E \u0410\u0444\u0440\u0438\u0447\u043A\u0430 \u0420\u0435\u043F\u0443\u0431\u043B\u0438\u043A\u0430" } - TD { "\u0427\u0430\u0434" } - CL { "\u0427\u0438\u043B\u0435" } - CN { "\u041A\u0438\u043D\u0430" } - CO { "\u041A\u043E\u043B\u0443\u043C\u0431\u0438\u0458\u0430" } - CG { "\u041A\u043E\u043D\u0433\u043E" } - CR { "\u041A\u043E\u0441\u0442\u0430\u0440\u0438\u043A\u0430" } - CI { "\u041E\u0431\u0430\u043B\u0430 \u0421\u043B\u043E\u043D\u043E\u0432\u0430\u0447\u0435" } - HR { "\u0425\u0440\u0432\u0430\u0442\u0441\u043A\u0430" } - CU { "\u041A\u0443\u0431\u0430" } - CY { "\u041A\u0438\u043F\u0430\u0440" } - CZ { "\u0427\u0435\u0448\u043A\u0430" } - DK { "\u0414\u0430\u043D\u0441\u043A\u0430" } - DJ { "\u040F\u0438\u0431\u0443\u0442\u0438" } - DM { "\u0414\u043E\u043C\u0438\u043D\u0438\u043A\u0430" } - DO { "\u0414\u043E\u043C\u0438\u043D\u0438\u043A\u0430\u043D\u0441\u043A\u0430 \u0420\u0435\u043F\u0443\u0431\u043B\u0438\u043A\u0430" } - EC { "\u0415\u043A\u0432\u0430\u0434\u043E\u0440" } - EG { "\u0415\u0433\u0438\u043F\u0430\u0442" } - SV { "\u0421\u0430\u043B\u0432\u0430\u0434\u043E\u0440" } - GQ { "\u0415\u043A\u0432\u0430\u0442\u043E\u0440\u0438\u0458\u0430\u043B\u043D\u0430 \u0413\u0432\u0438\u043D\u0435\u0458\u0430" } - ER { "\u0415\u0440\u0438\u0442\u0440\u0435\u0458\u0430" } - EE { "\u0415\u0441\u0442\u043E\u043D\u0438\u0458\u0430" } - ET { "\u0415\u0442\u0438\u043E\u043F\u0438\u0458\u0430" } - FJ { "\u0424\u0438\u045F\u0438" } - FI { "\u0424\u0438\u043D\u0441\u043A\u0430" } - FR { "\u0424\u0440\u0430\u043D\u0446\u0443\u0441\u043A\u0430" } - GF { "\u0424\u0440\u0430\u043D\u0446\u0443\u0441\u043A\u0430 \u0413\u0432\u0430\u0458\u0430\u043D\u0430" } - PF { "\u0424\u0440\u0430\u043D\u0446\u0443\u0441\u043A\u0430 \u041F\u043E\u043B\u0438\u043D\u0435\u0437\u0438\u0458\u0430" } - TF { "\u0424\u0440\u0430\u043D\u0446\u0443\u0441\u043A\u0435 \u0408\u0443\u0436\u043D\u0435 \u0422\u0435\u0440\u0438\u0442\u043E\u0440\u0438\u0458\u0435" } - GA { "\u0413\u0430\u0431\u043E\u043D" } - GM { "\u0413\u0430\u043C\u0431\u0438\u0458\u0430" } - GE { "\u0413\u0440\u0443\u0437\u0438\u0458\u0430" } - DE { "\u041D\u0435\u043C\u0430\u0447\u043A\u0430" } - GH { "\u0413\u0430\u043D\u0430" } - GR { "\u0413\u0440\u0447\u043A\u0430" } - GP { "\u0413\u0432\u0430\u0434\u0435\u043B\u0443\u043F\u0435" } - GT { "\u0413\u0432\u0430\u0442\u0435\u043C\u0430\u043B\u0430" } - GN { "\u0413\u0432\u0438\u043D\u0435\u0458\u0430" } - GW { "\u0413\u0432\u0438\u043D\u0435\u0458\u0430-\u0411\u0438\u0441\u0430\u043E" } - GY { "\u0413\u0432\u0430\u0458\u0430\u043D\u0430" } - HT { "\u0425\u0430\u0438\u0442\u0438" } - HN { "\u0425\u043E\u043D\u0434\u0443\u0440\u0430\u0441" } - //HK { "\u0425\u043E\u043D\u0433 \u041A\u043E\u043D\u0433" } - HU { "\u041C\u0430\u0452\u0430\u0440\u0441\u043A\u0430" } - IS { "\u0418\u0441\u043B\u0430\u043D\u0434" } - IN { "\u0418\u043D\u0434\u0438\u0458\u0430" } - ID { "\u0418\u043D\u0434\u043E\u043D\u0435\u0437\u0438\u0458\u0430" } - IR { "\u0418\u0440\u0430\u043D" } - IQ { "\u0418\u0440\u0430\u043A" } - IE { "\u0418\u0440\u0441\u043A\u0430" } - IL { "\u0418\u0437\u0440\u0430\u0435\u043B" } - IT { "\u0418\u0442\u0430\u043B\u0438\u0458\u0430" } - JM { "\u0408\u0430\u043C\u0430\u0458\u043A\u0430" } - JP { "\u0408\u0430\u043F\u0430\u043D" } - JO { "\u0408\u043E\u0440\u0434\u0430\u043D" } - KZ { "\u041A\u0430\u0437\u0430\u0445\u0441\u0442\u0430\u043D" } - KE { "\u041A\u0435\u043D\u0438\u0458\u0430" } - KP { "\u0421\u0435\u0432\u0435\u0440\u043D\u0430 \u041A\u043E\u0440\u0435\u0458\u0430" } - KR { "\u0408\u0443\u0436\u043D\u0430 \u041A\u043E\u0440\u0435\u0458\u0430" } - KW { "\u041A\u0443\u0432\u0430\u0458\u0442" } - KG { "\u041A\u0438\u0440\u0433\u0438\u0437\u0441\u0442\u0430\u043D" } - LA { "\u041B\u0430\u043E\u0441" } - LV { "\u041B\u0435\u0442\u043E\u043D\u0438\u0458\u0430" } - LB { "\u041B\u0438\u0431\u0430\u043D" } - LS { "\u041B\u0435\u0441\u043E\u0442\u043E" } - LR { "\u041B\u0438\u0431\u0435\u0440\u0438\u0458\u0430" } - LY { "\u041B\u0438\u0431\u0438\u0458\u0430" } - LI { "\u041B\u0438\u0445\u0435\u043D\u0448\u0442\u0430\u0458\u043D" } - LT { "\u041B\u0438\u0442\u0432\u0430\u043D\u0438\u0458\u0430" } - LU { "\u041B\u0443\u043A\u0441\u0435\u043C\u0431\u0443\u0440\u0433" } - MK { "\u041C\u0430\u043A\u0435\u0434\u043E\u043D\u0438\u0458\u0430" } - MG { "\u041C\u0430\u0434\u0430\u0433\u0430\u0441\u043A\u0430\u0440" } - MY { "\u041C\u0430\u043B\u0435\u0437\u0438\u0458\u0430" } - ML { "\u041C\u0430\u043B\u0438" } - MT { "\u041C\u0430\u043B\u0442\u0430" } - MQ { "\u041C\u0430\u0440\u0442\u0438\u043D\u0438\u043A" } - MR { "\u041C\u0430\u0443\u0440\u0438\u0442\u0430\u043D\u0438\u0458\u0430" } - MU { "\u041C\u0430\u0443\u0440\u0438\u0446\u0438\u0458\u0443\u0441" } - MX { "\u041C\u0435\u043A\u0441\u0438\u043A\u043E" } - FM { "\u041C\u0438\u043A\u0440\u043E\u043D\u0435\u0437\u0438\u0458\u0430" } - MD { "\u041C\u043E\u043B\u0434\u0430\u0432\u0438\u0458\u0430" } - MC { "\u041C\u043E\u043D\u0430\u043A\u043E" } - MN { "\u041C\u043E\u043D\u0433\u043E\u043B\u0438\u0458\u0430" } - MA { "\u041C\u0430\u0440\u043E\u043A\u043E" } - MZ { "\u041C\u043E\u0437\u0430\u043C\u0431\u0438\u043A" } - MM { "\u041C\u0438\u0458\u043D\u0430\u043C\u0430\u0440" } - NA { "\u041D\u0430\u043C\u0438\u0431\u0438\u0458\u0430" } - NP { "\u041D\u0435\u043F\u0430\u043B" } - NL { "\u0425\u043E\u043B\u0430\u043D\u0434\u0438\u0458\u0430" } - AN { "\u0425\u043E\u043B\u0430\u043D\u0434\u0441\u043A\u0438 \u0410\u043D\u0442\u0438\u043B\u0438" } - NC { "\u041D\u043E\u0432\u0430 \u041A\u0430\u043B\u0435\u0434\u043E\u043D\u0438\u0458\u0430" } - NZ { "\u041D\u043E\u0432\u0438 \u0417\u0435\u043B\u0430\u043D\u0434" } - NI { "\u041D\u0438\u043A\u0430\u0440\u0430\u0433\u0432\u0430" } - NE { "\u041D\u0438\u0433\u0435\u0440" } - NG { "\u041D\u0438\u0433\u0435\u0440\u0438\u0458\u0430" } - NO { "\u041D\u043E\u0440\u0432\u0435\u0448\u043A\u0430" } - OM { "\u041E\u043C\u0430\u043D" } - PK { "\u041F\u0430\u043A\u0438\u0441\u0442\u0430\u043D" } - PA { "\u041F\u0430\u043D\u0430\u043C\u0430" } - PG { "\u041F\u0430\u043F\u0443\u0430 \u041D\u043E\u0432\u0430 \u0413\u0432\u0438\u043D\u0435\u0458\u0430" } - PY { "\u041F\u0430\u0440\u0430\u0433\u0432\u0430\u0458" } - PE { "\u041F\u0435\u0440\u0443" } - PH { "\u0424\u0438\u043B\u0438\u043F\u0438\u043D\u0438" } - PL { "\u041F\u043E\u0459\u0441\u043A\u0430" } - PT { "\u041F\u043E\u0440\u0442\u0443\u0433\u0430\u043B" } - PR { "\u041F\u043E\u0440\u0442\u043E \u0420\u0438\u043A\u043E" } - QA { "\u041A\u0430\u0442\u0430\u0440" } - RO { "\u0420\u0443\u043C\u0443\u043D\u0438\u0458\u0430" } - RU { "\u0420\u0443\u0441\u0438\u0458\u0430" } - RW { "\u0420\u0443\u0430\u043D\u0434\u0430" } - SA { "\u0421\u0430\u0443\u0434\u0438\u0458\u0441\u043A\u0430 \u0410\u0440\u0430\u0431\u0438\u0458\u0430" } - SN { "\u0421\u0435\u043D\u0435\u0433\u0430\u043B" } - SP { "\u0421\u0440\u0431\u0438\u0458\u0430" } - SC { "\u0421\u0435\u0458\u0448\u0435\u043B\u0438" } - SL { "\u0421\u0438\u0458\u0435\u0440\u0430 \u041B\u0435\u043E\u043D\u0435" } - SG { "\u0421\u0438\u043D\u0433\u0430\u043F\u0443\u0440" } - SK { "\u0421\u043B\u043E\u0432\u0430\u0447\u043A\u0430" } - SI { "\u0421\u043B\u043E\u0432\u0435\u043D\u0438\u0458\u0430" } - SO { "\u0421\u043E\u043C\u0430\u043B\u0438\u0458\u0430" } - ZA { "\u0408\u0443\u0436\u043D\u0430 \u0410\u0444\u0440\u0438\u043A\u0430" } - ES { "\u0428\u043F\u0430\u043D\u0438\u0458\u0430" } - LK { "\u0428\u0440\u0438 \u041B\u0430\u043D\u043A\u0430" } - SD { "\u0421\u0443\u0434\u0430\u043D" } - SR { "\u0421\u0443\u0440\u0438\u043D\u0430\u043C" } - SZ { "\u0421\u0432\u0430\u0437\u0438\u043B\u0435\u043D\u0434" } - SE { "\u0428\u0432\u0435\u0434\u0441\u043A\u0430" } - CH { "\u0428\u0432\u0430\u0458\u0446\u0430\u0440\u0441\u043A\u0430" } - SY { "\u0421\u0438\u0440\u0438\u0458\u0430" } - TW { "\u0422\u0430\u0458\u0432\u0430\u043D" } - TJ { "\u0422\u0430\u045F\u0438\u043A\u0438\u0441\u0442\u0430\u043D" } - TZ { "\u0422\u0430\u043D\u0437\u0430\u043D\u0438\u0458\u0430" } - TH { "\u0422\u0430\u0458\u043B\u0430\u043D\u0434" } - TG { "\u0422\u043E\u0433\u043E" } - TT { "\u0422\u0440\u0438\u043D\u0438\u0434\u0430\u0434 \u0438 \u0422\u043E\u0431\u0430\u0433\u043E" } - TN { "\u0422\u0443\u043D\u0438\u0441" } - TR { "\u0422\u0443\u0440\u0441\u043A\u0430" } - TM { "\u0422\u0443\u0440\u043A\u043C\u0435\u043D\u0438\u0441\u0442\u0430\u043D" } - UG { "\u0423\u0433\u0430\u043D\u0434\u0430" } - UA { "\u0423\u043A\u0440\u0430\u0458\u0438\u043D\u0430" } - AE { "\u0423\u0458\u0435\u0434\u0438\u045A\u0435\u043D\u0438 \u0410\u0440\u0430\u043F\u0441\u043A\u0438 \u0415\u043C\u0438\u0440\u0430\u0442\u0438" } - GB { "\u0412\u0435\u043B\u0438\u043A\u0430 \u0411\u0440\u0438\u0442\u0430\u043D\u0438\u0458\u0430" } - US { "\u0421\u0458\u0435\u0434\u0438\u045A\u0435\u043D\u0435 \u0410\u043C\u0435\u0440\u0438\u0447\u043A\u0435 \u0414\u0440\u0436\u0430\u0432\u0435" } - UY { "\u0423\u0440\u0443\u0433\u0432\u0430\u0458" } - UZ { "\u0423\u0437\u0431\u0435\u043A\u0438\u0441\u0442\u0430\u043D" } - VA { "\u0412\u0430\u0442\u0438\u043A\u0430\u043D" } - VE { "\u0412\u0435\u043D\u0435\u0446\u0443\u0435\u043B\u0430" } - VN { "\u0412\u0438\u0458\u0435\u0442\u043D\u0430\u043C" } - VG { "\u0411\u0440\u0438\u0442\u0430\u043D\u0441\u043A\u0430 \u0414\u0435\u0432\u0438\u0447\u0430\u043D\u0441\u043A\u0430 \u041E\u0441\u0442\u0440\u0432\u0430" } - VI { "\u0421.\u0410.\u0414. \u0414\u0435\u0432\u0438\u0447\u0430\u043D\u0441\u043A\u0430 \u041E\u0441\u0442\u0440\u0432\u0430" } - EH { "\u0417\u0430\u043F\u0430\u0434\u043D\u0430 \u0421\u0430\u0445\u0430\u0440\u0430" } - YE { "\u0408\u0435\u043C\u0435\u043D" } - YU { "\u0408\u0443\u0433\u043E\u0441\u043B\u0430\u0432\u0438\u0458\u0430" } - //ZR { "\u0417\u0430\u0438\u0440" } // It's now called CD { "Democratic Republic of the Congo" } - ZM { "\u0417\u0430\u043C\u0431\u0438\u0458\u0430" } - ZW { "\u0417\u0438\u043C\u0431\u0430\u0431\u0432\u0435" } - } - DateTimePatterns { - "HH.mm.ss z", - "HH.mm.ss z", - "HH.mm.ss", - "HH.mm", - "EEEE, dd.MMMM.yyyy.", - "dd.MM.yyyy.", - "dd.MM.yyyy.", - "d.M.yy.", - "{1} {0}", - } - DayAbbreviations { - "\u043D\u0435\u0434", - "\u043F\u043E\u043D", - "\u0443\u0442\u043E", - "\u0441\u0440\u0435", - "\u0447\u0435\u0442", - "\u043F\u0435\u0442", - "\u0441\u0443\u0431", - } - DayNames { - "\u043D\u0435\u0434\u0435\u0459\u0430", - "\u043F\u043E\u043D\u0435\u0434\u0435\u0459\u0430\u043A", - "\u0443\u0442\u043E\u0440\u0430\u043A", - "\u0441\u0440\u0435\u0434\u0430", - "\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043A", - "\u043F\u0435\u0442\u0430\u043A", - "\u0441\u0443\u0431\u043E\u0442\u0430", - } - Eras { - "\u043F. \u043D. \u0435.", - "\u043D. \u0435", - } - Languages { - af { "\u0410\u0444\u0440\u0438\u043A\u0430\u043D\u0435\u0440\u0441\u043A\u0438" } - sq { "\u0410\u043B\u0431\u0430\u043D\u0441\u043A\u0438" } - ar { "\u0410\u0440\u0430\u043F\u0441\u043A\u0438" } - hy { "\u0410\u0440\u043C\u0435\u043D\u0441\u043A\u0438" } - eu { "\u0411\u0430\u0441\u043A\u0438\u0458\u0441\u043A\u0438" } - br { "\u0411\u0440\u0435\u0442\u043E\u043D\u0441\u043A\u0438" } - bg { "\u0411\u0443\u0433\u0430\u0440\u0441\u043A\u0438" } - my { "\u0411\u0443\u0440\u043C\u0430\u043D\u0441\u043A\u0438" } - be { "\u0411\u0435\u043B\u043E\u0440\u0443\u0441\u043A\u0438" } - km { "\u041A\u0430\u043C\u0431\u043E\u045F\u0430\u043D\u0441\u043A\u0438" } - ca { "\u041A\u0430\u0442\u0430\u043B\u043E\u043D\u0441\u043A\u0438" } - zh { "\u041A\u0438\u043D\u0435\u0441\u043A\u0438" } - co { "\u041A\u043E\u0440\u0437\u0438\u043A\u0430\u043D\u0441\u043A\u0438" } - hr { "\u0425\u0440\u0432\u0430\u0442\u0441\u043A\u0438" } - cs { "\u0427\u0435\u0448\u043A\u0438" } - da { "\u0414\u0430\u043D\u0441\u043A\u0438" } - nl { "\u0425\u043E\u043B\u0430\u043D\u0434\u0441\u043A\u0438" } - en { "\u0415\u043D\u0433\u043B\u0435\u0441\u043A\u0438" } - eo { "\u0415\u0441\u043F\u0435\u0440\u0430\u043D\u0442\u043E" } - et { "\u0415\u0441\u0442\u043E\u043D\u0441\u043A\u0438" } - fi { "\u0424\u0438\u043D\u0441\u043A\u0438" } - fr { "\u0424\u0440\u0430\u043D\u0446\u0443\u0441\u043A\u0438" } - ka { "\u0413\u0440\u0443\u0437\u0438\u0458\u0441\u043A\u0438" } - de { "\u041D\u0435\u043C\u0430\u0447\u043A\u0438" } - el { "\u0413\u0440\u0447\u043A\u0438" } - he { "\u0425\u0435\u0431\u0440\u0435\u0458\u0441\u043A\u0438" } - hu { "\u041C\u0430\u0452\u0430\u0440\u0441\u043A\u0438" } - is { "\u0418\u0441\u043B\u0430\u043D\u0434\u0441\u043A\u0438" } - id { "\u0418\u043D\u0434\u043E\u043D\u0435\u0437\u0438\u0458\u0441\u043A\u0438" } - ga { "\u0418\u0440\u0441\u043A\u0438" } - it { "\u0418\u0442\u0430\u043B\u0438\u0458\u0430\u043D\u0441\u043A\u0438" } - ja { "\u0408\u0430\u043F\u0430\u043D\u0441\u043A\u0438" } - ky { "\u041A\u0438\u0440\u0433\u0438\u0441\u043A\u0438" } - ko { "\u041A\u043E\u0440\u0435\u0458\u0441\u043A\u0438" } - ku { "\u041A\u0443\u0440\u0434\u0441\u043A\u0438" } - la { "\u041B\u0430\u0442\u0438\u043D\u0441\u043A\u0438" } - lv { "\u041B\u0435\u0442\u043E\u043D\u0441\u043A\u0438" } - lt { "\u041B\u0438\u0442\u0432\u0430\u043D\u0441\u043A\u0438" } - mk { "\u041C\u0430\u043A\u0435\u0434\u043E\u043D\u0441\u043A\u0438" } - mo { "\u041C\u043E\u043B\u0434\u0430\u0432\u0441\u043A\u0438" } - mn { "\u041C\u043E\u043D\u0433\u043E\u043B\u0441\u043A\u0438" } - no { "\u041D\u043E\u0440\u0432\u0435\u0448\u043A\u0438" } - fa { "\u041F\u0435\u0440\u0441\u0438\u0458\u0441\u043A\u0438" } - pl { "\u041F\u043E\u0459\u0441\u043A\u0438" } - pt { "\u041F\u043E\u0440\u0442\u0443\u0433\u0430\u043B\u0441\u043A\u0438" } - rm { "\u0420\u0435\u0442\u043E-\u0420\u043E\u043C\u0430\u043D\u0441\u043A\u0438" } - ro { "\u0420\u0443\u043C\u0443\u043D\u0441\u043A\u0438" } - ru { "\u0420\u0443\u0441\u043A\u0438" } - sa { "\u0421\u0430\u043D\u0441\u043A\u0440\u0438\u0442" } - sr { "\u0421\u0440\u043F\u0441\u043A\u0438" } - sh { "\u0421\u0440\u043F\u0441\u043A\u043E-\u0425\u0440\u0432\u0430\u0442\u0441\u043A\u0438" } - sk { "\u0421\u043B\u043E\u0432\u0430\u0447\u043A\u0438" } - sl { "\u0421\u043B\u043E\u0432\u0435\u043D\u0430\u0447\u043A\u0438" } - es { "\u0428\u043F\u0430\u043D\u0441\u043A\u0438" } - sw { "\u0421\u0432\u0430\u0445\u0438\u043B\u0438" } - sv { "\u0428\u0432\u0435\u0434\u0441\u043A\u0438" } - tr { "\u0422\u0443\u0440\u0441\u043A\u0438" } - uk { "\u0423\u043A\u0440\u0430\u0458\u0438\u043D\u0441\u043A\u0438" } - vi { "\u0412\u0438\u0458\u0435\u0442\u043D\u0430\u043C\u0441\u043A\u0438" } - yi { "\u0408\u0438\u0434\u0438\u0448" } - } - LocaleID:int { 0x0c1a } -// LocaleString { "sr" } - MonthAbbreviations { - "\u0458\u0430\u043D", - "\u0444\u0435\u0431", - "\u043C\u0430\u0440", - "\u0430\u043F\u0440", - "\u043C\u0430\u0458", - "\u0458\u0443\u043D", - "\u0458\u0443\u043B", - "\u0430\u0432\u0433", - "\u0441\u0435\u043F", - "\u043E\u043A\u0442", - "\u043D\u043E\u0432", - "\u0434\u0435\u0446", - } - MonthNames { - "\u0458\u0430\u043D\u0443\u0430\u0440", - "\u0444\u0435\u0431\u0440\u0443\u0430\u0440", - "\u043C\u0430\u0440\u0442", - "\u0430\u043F\u0440\u0438\u043B", - "\u043C\u0430\u0458", - "\u0458\u0443\u043D\u0438", - "\u0458\u0443\u043B\u0438", - "\u0430\u0432\u0433\u0443\u0441\u0442", - "\u0441\u0435\u043F\u0442\u0435\u043C\u0431\u0430\u0440", - "\u043E\u043A\u0442\u043E\u0431\u0430\u0440", - "\u043D\u043E\u0432\u0435\u043C\u0431\u0430\u0440", - "\u0434\u0435\u0446\u0435\u043C\u0431\u0430\u0440", - } - NumberElements { - ",", - ".", - ";", - "%", - "0", - "#", - "-", - "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", - } -// ShortLanguage { "srp" } - localPatternChars { "GanjkHmsSEDFwWxhKzAe" } - zoneStrings { - { - "Europe/Belgrade", - "\u0426\u0435\u043D\u0442\u0440\u0430\u043B\u043D\u043E \u0415\u0432\u0440\u043E\u043F\u0441\u043A\u043E \u0412\u0440\u0435\u043C\u0435", - "CET", - "\u0426\u0435\u043D\u0442\u0440\u0430\u043B\u043D\u043E \u0415\u0432\u0440\u043E\u043F\u0441\u043A\u043E \u0412\u0440\u0435\u043C\u0435", - "CET", - } - } - LocaleScript:array { - "Cyrl" // ISO 15924 Name - } - ExemplarCharacters { "[\u0430-\u0438 \u043a-\u0448 \u0452 \u0458 \u0459 \u045a \u045b \u045f]" } - - // Currency display names - Currencies { - YUN { "\u0414\u0438\u043D", "YUN" } - } -} +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/sr.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/sr.xml + */ +sr{ + Countries{ + AD{"Андора"} + AE{"Уједињени Арапски Емирати"} + AF{"Авганистан"} + AL{"Албанија"} + AM{"Арменија"} + AN{"Холандски Антили"} + AO{"Ангола"} + AR{"Аргентина"} + AT{"Аустрија"} + AU{"Аустралија"} + AW{"Аруба"} + AZ{"Азербејџан"} + BA{"Босна и Херцеговина"} + BB{"Барбадос"} + BD{"Бангладеш"} + BE{"Белгија"} + BF{"Буркина Фасо"} + BG{"Бугарска"} + BH{"Бахреин"} + BI{"Бурунди"} + BJ{"Бенин"} + BM{"Бермуда"} + BN{"Брунеј"} + BO{"Боливија"} + BR{"Браѕил"} + BS{"Бахами"} + BT{"Бутан"} + BV{"Буве"} + BW{"Боцвана"} + BY{"Белорусија"} + BZ{"Белисе"} + CA{"Канада"} + CC{"Кокосова Острва"} + CD{"Демократска република Конго"} + CF{"Централно Афричка Република"} + CG{"Конго"} + CH{"Швајцарска"} + CI{"Обала Слоноваче"} + CL{"Чиле"} + CM{"Камерун"} + CN{"Кина"} + CO{"Колумбија"} + CR{"Костарика"} + CU{"Куба"} + CV{"Капе Верде"} + CX{"Божићно Острво"} + CY{"Кипар"} + CZ{"Чешка"} + DE{"Немачка"} + DJ{"Џибути"} + DK{"Данска"} + DM{"Доминика"} + DO{"Доминиканска Република"} + DZ{"Алжир"} + EC{"Еквадор"} + EE{"Естонија"} + EG{"Египат"} + EH{"Западна Сахара"} + ER{"Еритреја"} + ES{"Шпанија"} + ET{"Етиопија"} + FI{"Финска"} + FJ{"Фиџи"} + FK{"Фолкландска Острва"} + FM{"Микронезија"} + FO{"Фарска Острва"} + FR{"Француска"} + GA{"Габон"} + GB{"Велика Британија"} + GD{"Гренада"} + GE{"Грузија"} + GF{"Француска Гвајана"} + GH{"Гана"} + GI{"Гибралтар"} + GL{"Гренланд"} + GM{"Гамбија"} + GN{"Гвинеја"} + GP{"Гваделупе"} + GQ{"Екваторијална Гвинеја"} + GR{"Грчка"} + GS{"Јужна Џорџија и Јужна Сендвич Острва"} + GT{"Гватемала"} + GU{"Гуам"} + GW{"Гвинеја-Бисао"} + GY{"Гвајана"} + HK{"Хонг Конг (С. А. Р. Кина)"} + HM{"Херд и Мекдоналд Острва"} + HN{"Хондурас"} + HR{"Хрватска"} + HT{"Хаити"} + HU{"Мађарска"} + ID{"Индонезија"} + IE{"Ирска"} + IL{"Израел"} + IN{"Индија"} + IQ{"Ирак"} + IR{"Иран"} + IS{"Исланд"} + IT{"Италија"} + JM{"Јамајка"} + JO{"Јордан"} + JP{"Јапан"} + KE{"Кенија"} + KG{"Киргизстан"} + KH{"Камбоџа"} + KI{"Кирибати"} + KM{"Коморска Острва"} + KN{"Сент Китс и Невис"} + KP{"Северна Кореја"} + KR{"Јужна Кореја"} + KW{"Кувајт"} + KY{"Кајманска Острва"} + KZ{"Казахстан"} + LA{"Лаос"} + LB{"Либан"} + LC{"Сент Луција"} + LI{"Лихтенштајн"} + LK{"Шри Ланка"} + LR{"Либерија"} + LS{"Лесото"} + LT{"Литванија"} + LU{"Луксембург"} + LV{"Летонија"} + LY{"Либија"} + MA{"Мароко"} + MC{"Монако"} + MD{"Молдавија"} + MG{"Мадагаскар"} + MH{"Маршалска Острва"} + MK{"Македонија"} + ML{"Мали"} + MM{"Мијанмар"} + MN{"Монголија"} + MO{"Макао (С. А. Р. Кина)"} + MP{"Северна Маријанска Острва"} + MQ{"Мартиник"} + MR{"Мауританија"} + MS{"Монсерат"} + MT{"Малта"} + MU{"Маурицијус"} + MV{"Малдиви"} + MW{"Малави"} + MX{"Мексико"} + MY{"Малезија"} + MZ{"Мозамбик"} + NA{"Намибија"} + NC{"Нова Каледонија"} + NE{"Нигер"} + NF{"Норфолк Острво"} + NG{"Нигерија"} + NI{"Никарагва"} + NL{"Холандија"} + NO{"Норвешка"} + NP{"Непал"} + NR{"Науру"} + NU{"Ниуе"} + NZ{"Нови Зеланд"} + OM{"Оман"} + PA{"Панама"} + PE{"Перу"} + PF{"Француска Полинезија"} + PG{"Папуа Нова Гвинеја"} + PH{"Филипини"} + PK{"Пакистан"} + PL{"Пољска"} + PM{"Сен Пјер и Микелон"} + PN{"Питкерн"} + PR{"Порто Рико"} + PS{"Палестинска територија"} + PT{"Португал"} + PW{"Палау"} + PY{"Парагвај"} + QA{"Катар"} + RE{"Реинион"} + RO{"Румунија"} + RU{"Русија"} + RW{"Руанда"} + SA{"Саудијска Арабија"} + SB{"Соломонска Острва"} + SC{"Сејшели"} + SD{"Судан"} + SE{"Шведска"} + SG{"Сингапур"} + SH{"Света Јелена"} + SI{"Словенија"} + SJ{"Свалбард и Јанмајен Острва"} + SK{"Словачка"} + SL{"Сијера Леоне"} + SM{"Сан Марино"} + SN{"Сенегал"} + SO{"Сомалија"} + SR{"Суринам"} + ST{"Сао Томе и Принципи"} + SV{"Салвадор"} + SY{"Сирија"} + SZ{"Свазиленд"} + TC{"Туркс и Кајкос Острва"} + TD{"Чад"} + TF{"Француске Јужне Територије"} + TG{"Того"} + TH{"Тајланд"} + TJ{"Таџикистан"} + TK{"Токелау"} + TL{"Тимор-Лесте"} + TM{"Туркменистан"} + TN{"Тунис"} + TO{"Тонга"} + TR{"Турска"} + TT{"Тринидад и Тобаго"} + TV{"Тувалу"} + TW{"Тајван"} + TZ{"Танзанија"} + UA{"Украјина"} + UG{"Уганда"} + UM{"Мања удаљена острва САД"} + US{"Сједињене Америчке Државе"} + UY{"Уругвај"} + UZ{"Узбекистан"} + VA{"Ватикан"} + VC{"Сент Винсент и Гренадини"} + VE{"Венецуела"} + VG{"Британска Девичанска Острва"} + VI{"С.А.Д. Девичанска Острва"} + VN{"Вијетнам"} + VU{"Вануату"} + WF{"Валис и Футуна Острва"} + WS{"Самоа"} + YE{"Јемен"} + YT{"Мајоте"} + YU{"Југославија"} + ZA{"Јужна Африка"} + ZM{"Замбија"} + ZW{"Зимбабве"} + } + Currencies{ + ATS{ + "ATS", + "Аустријски шилинг", + } + AUD{ + "$A", + "Аустралијски долар", + } + BAM{ + "KM", + "Конвертибилна марка", + } + BEF{ + "BF", + "Белгијски франак", + } + CAD{ + "Can$", + "Канадски долар", + } + CHF{ + "SwF", + "Швајцарски франак", + } + DEM{ + "DEM", + "Немачка марка", + } + DKK{ + "DKr", + "Данска круна", + } + ESP{ + "ESP", + "Шпанска пезета", + } + EUR{ + "€", + "ЕВРО", + } + FIM{ + "FIM", + "Финска марка", + } + FIN{ + "FIN", + "Финска марка (1860-1962)", + } + FRF{ + "FRF", + "Француски франак", + } + GBP{ + "£", + "Фунта стерлинга", + } + GRD{ + "GRD", + "Драхма", + } + HRD{ + "HRD", + "Хрватски динар", + } + HRK{ + "HRK", + "Куна", + } + IEP{ + "IR£", + "Ирска фунта", + } + ITL{ + "₤", + "Италијанска лира", + } + JPY{ + "¥", + "Јен", + } + KWD{ + "KD", + "Кувајтски динар", + } + LUF{ + "LUF", + "Луксембуршки франак", + } + NLG{ + "NLG", + "Холандски гулден", + } + NOK{ + "NKr", + "Норвешка круна", + } + PTE{ + "PTE", + "Португалски ескудо", + } + RUB{ + "RUB", + "Руска рубља", + } + RUR{ + "RUR", + "Руска рубља (1991-1998)", + } + SEK{ + "SKr", + "Шведска круна", + } + SIT{ + "SIT", + "Толар", + } + USD{ + "US$", + "Амерички долар", + } + YUN{ + "Дин", + "YUN", + } + } + ExemplarCharacters{"[а-и к-ш ђ ј љ њ ћ џ]"} + Keys{ + calendar{"Календар"} + collation{"Сортирање"} + currency{"Валута"} + } + Languages{ + af{"Африканерски"} + ar{"Арапски"} + be{"Белоруски"} + bg{"Бугарски"} + br{"Бретонски"} + ca{"Каталонски"} + co{"Корзикански"} + cs{"Чешки"} + da{"Дански"} + de{"Немачки"} + el{"Грчки"} + en{"Енглески"} + eo{"Есперанто"} + es{"Шпански"} + et{"Естонски"} + eu{"Баскијски"} + fa{"Персијски"} + fi{"Фински"} + fr{"Француски"} + ga{"Ирски"} + he{"Хебрејски"} + hr{"Хрватски"} + hu{"Мађарски"} + hy{"Арменски"} + id{"Индонезијски"} + is{"Исландски"} + it{"Италијански"} + ja{"Јапански"} + ka{"Грузијски"} + km{"Кмерски"} + ko{"Корејски"} + ku{"Курдски"} + ky{"Киргиски"} + la{"Латински"} + lt{"Литвански"} + lv{"Летонски"} + mk{"Македонски"} + mn{"Монголски"} + mo{"Молдавски"} + my{"Бурмански"} + nl{"Холандски"} + no{"Норвешки"} + pl{"Пољски"} + pt{"Португалски"} + rm{"Рето-Романски"} + ro{"Румунски"} + ru{"Руски"} + sa{"Санскрит"} + sh{"Српско-Хрватски"} + sk{"Словачки"} + sl{"Словеначки"} + sq{"Албански"} + sr{"Српски"} + sv{"Шведски"} + sw{"Свахили"} + tr{"Турски"} + uk{"Украјински"} + vi{"Вијетнамски"} + yi{"Јидиш"} + zh{"Кинески"} + } + LocaleScript{ + "Cyrl", + } + NumberElements{ + ",", + ".", + ";", + "%", + "0", + "#", + "-", + "E", + "‰", + "∞", + "�", + "+", + } + Scripts{ + Arab{"арапско писмо"} + Armn{"јерменско писмо"} + Beng{"бенгалско писмо"} + Brai{"Брајево писмо"} + Cher{"Чероки"} + Copt{"коптичко писмо"} + Cyrl{"Ћирилица"} + Deva{"Деванагари"} + Dsrt{"Дезерет"} + Ethi{"етиопско писмо"} + Geor{"грузијско писмо"} + Goth{"Готика"} + Grek{"грчко писмо"} + Hebr{"хебрејско писмо"} + Hira{"Хирагана"} + Hrkt{"Катакана или Хирагана"} + Kana{"Катакана"} + Latn{"Латиница"} + } + Types{ + calendar{ + buddhist{"Будистички календар"} + chinese{"Кинески календар"} + gregorian{"Грегоријански календар"} + hebrew{"Хебрејски календар"} + islamic{"Исламски календар"} + islamic-civil{"Исламски цивилни календар"} + japanese{"Јапански календар"} + } + collation{ + direct{"Директно сортирање"} + phonebook{"Сортирање по азбуци"} + pinyin{"Пињин сортирање"} + stroke{"Сортирање по броју црта"} + traditional{"Традиционално сортирање"} + } + } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "HH.mm.ss z", + "HH.mm.ss z", + "HH.mm.ss", + "HH.mm", + "EEEE, dd.MMMM.yyyy.", + "dd.MM.yyyy.", + "dd.MM.yyyy.", + "d.M.yy.", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "нед", + "пон", + "уто", + "сре", + "чет", + "пет", + "суб", + } + narrow{ + "н", + "п", + "у", + "с", + "ч", + "п", + "с", + } + wide{ + "недеља", + "понедељак", + "уторак", + "среда", + "четвртак", + "петак", + "субота", + } + } + } + eras{ + abbreviated{ + "п. н. е.", + "н. е", + } + } + monthNames{ + format{ + abbreviated{ + "јан", + "феб", + "мар", + "апр", + "мај", + "јун", + "јул", + "авг", + "сеп", + "окт", + "нов", + "дец", + } + narrow{ + "ј", + "ф", + "м", + "а", + "м", + "ј", + "ј", + "а", + "с", + "о", + "н", + "д", + } + wide{ + "јануар", + "фебруар", + "март", + "април", + "мај", + "јун", + "јул", + "август", + "септембар", + "октобар", + "новембар", + "децембар", + } + } + } + } + } + localPatternChars{"GanjkHmsSEDFwWxhKzAeugXZ"} + zoneStrings{ + { + "Europe/Belgrade", + "Централно Европско Време", + "CET", + "Централно Европско Време", + "CET", + } + } +} diff --git a/icuSources/data/locales/sr_Cyrl.txt b/icuSources/data/locales/sr_Cyrl.txt new file mode 100644 index 00000000..0ca879d0 --- /dev/null +++ b/icuSources/data/locales/sr_Cyrl.txt @@ -0,0 +1,11 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/sr_Cyrl.xml +// * +// *************************************************************************** +sr_Cyrl{ + Version{"1.2"} +} diff --git a/icuSources/data/locales/sr_Cyrl_YU.txt b/icuSources/data/locales/sr_Cyrl_YU.txt new file mode 100644 index 00000000..a15c1f80 --- /dev/null +++ b/icuSources/data/locales/sr_Cyrl_YU.txt @@ -0,0 +1,11 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/sr_Cyrl_YU.xml +// * +// *************************************************************************** +sr_Cyrl_YU{ + Version{"1.2"} +} diff --git a/icuSources/data/locales/sr_Latn.txt b/icuSources/data/locales/sr_Latn.txt new file mode 100644 index 00000000..dc2cd4b6 --- /dev/null +++ b/icuSources/data/locales/sr_Latn.txt @@ -0,0 +1,443 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/sr_Latn.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/sr_Latn.xml + */ +sr_Latn{ + Countries{ + AD{"Andora"} + AE{"Ujedinjeni Arapski Emirati"} + AF{"Avganistan"} + AG{"Antigva i Barbuda"} + AI{"Angvila"} + AL{"Albanija"} + AM{"Armenija"} + AN{"Holandski Antili"} + AO{"Angola"} + AQ{"Antarktika"} + AR{"Argentina"} + AS{"Američka Samoa"} + AT{"Austrija"} + AU{"Australija"} + AW{"Aruba"} + AZ{"Azerbejdžan"} + BA{"Bosna i Hercegovina"} + BB{"Barbados"} + BD{"Bangladeš"} + BE{"Belgija"} + BF{"Burkina Faso"} + BG{"Bugarska"} + BH{"Bahrein"} + BI{"Burundi"} + BJ{"Benin"} + BM{"Bermuda"} + BN{"Brunej"} + BO{"Bolivija"} + BR{"Brazil"} + BS{"Bahami"} + BT{"Butan"} + BV{"Buve Ostrva"} + BW{"Bocvana"} + BY{"Belorusija"} + BZ{"Belise"} + CA{"Kanada"} + CC{"Kokos (Keling) Ostrva"} + CD{"Demokratska Republika Kongo"} + CF{"Centralno Afrička Republika"} + CG{"Kongo"} + CH{"Švajcarska"} + CI{"Obala Slonovače"} + CK{"Kukova Ostrva"} + CL{"Čile"} + CM{"Kamerun"} + CN{"Kina"} + CO{"Kolumbija"} + CR{"Kostarika"} + CU{"Kuba"} + CV{"Kape Verde"} + CX{"Uskršnja Ostrva"} + CY{"Kipar"} + CZ{"Češka"} + DE{"Nemačka"} + DJ{"Džibuti"} + DK{"Danska"} + DM{"Dominika"} + DO{"Dominikanska Republika"} + DZ{"Alžir"} + EC{"Ekvador"} + EE{"Estonija"} + EG{"Egipat"} + EH{"Zapadna Sahara"} + ER{"Eritreja"} + ES{"Španija"} + ET{"Etiopija"} + FI{"Finska"} + FJ{"Fidži"} + FK{"Folklendska Ostrva"} + FM{"Mikronezija"} + FO{"Farska Ostrva"} + FR{"Francuska"} + GA{"Gabon"} + GB{"Velika Britanija"} + GD{"Grenada"} + GE{"Gruzija"} + GF{"Francuska Gvajana"} + GH{"Gana"} + GI{"Gibraltar"} + GL{"Grenland"} + GM{"Gambija"} + GN{"Gvineja"} + GP{"Gvadelupe"} + GQ{"Ekvatorijalna Gvineja"} + GR{"Grčka"} + GS{"Južna Džordžija i Južna Sendvič Ostrva"} + GT{"Gvatemala"} + GU{"Guam"} + GW{"Gvineja-Bisao"} + GY{"Gvajana"} + HK{"Hong Kong (S. A. R. Kina)"} + HM{"Herd i Mekdonald Ostrva"} + HN{"Honduras"} + HR{"Hrvatska"} + HT{"Haiti"} + HU{"Mađarska"} + ID{"Indonezija"} + IE{"Irska"} + IL{"Izrael"} + IN{"Indija"} + IO{"British Indian Ocean Territory"} + IQ{"Irak"} + IR{"Iran"} + IS{"Island"} + IT{"Italija"} + JM{"Jamajka"} + JO{"Jordan"} + JP{"Japan"} + KE{"Kenija"} + KG{"Kirgistan"} + KH{"Kambodža"} + KI{"Kiribati"} + KM{"Komorska Ostrva"} + KN{"Sent Kits i Nevis"} + KP{"Severna Koreja"} + KR{"Južna Koreja"} + KW{"Kuvajt"} + KY{"Kajmanska Ostrva"} + KZ{"Kazahstan"} + LA{"Laos"} + LB{"Liban"} + LC{"Sent Lucija"} + LI{"Lihtenštajn"} + LK{"Šrilanka"} + LR{"Liberija"} + LS{"Lesoto"} + LT{"Litvanija"} + LU{"Luksemburg"} + LV{"Letonija"} + LY{"Libija"} + MA{"Maroko"} + MC{"Monako"} + MD{"Moldavija"} + MG{"Madagaskar"} + MH{"Maršalska Ostrva"} + MK{"Makedonija"} + ML{"Mali"} + MM{"Mijanmar"} + MN{"Mongolija"} + MO{"Makao (S. A. R. Kina)"} + MP{"Severna Marijanska Ostrva"} + MQ{"Martinik"} + MR{"Mauritanija"} + MS{"Montserrat"} + MT{"Malta"} + MU{"Mauricius"} + MV{"Maldivi"} + MW{"Malavi"} + MX{"Meksiko"} + MY{"Malezija"} + MZ{"Mozambik"} + NA{"Namibija"} + NC{"Nova Kaledonija"} + NE{"Niger"} + NF{"Norfolk Ostrvo"} + NG{"Nigerija"} + NI{"Nikaragva"} + NL{"Holandija"} + NO{"Norveška"} + NP{"Nepal"} + NR{"Nauru"} + NU{"Niue"} + NZ{"Novi Zeland"} + OM{"Oman"} + PA{"Panama"} + PE{"Peru"} + PF{"Francuska Polinezija"} + PG{"Papua Nova Gvineja"} + PH{"Filipini"} + PK{"Pakistan"} + PL{"Poljska"} + PM{"Sen Pjer i Mikelon"} + PN{"Pitcairn"} + PR{"Porto Riko"} + PS{"Palestinska Teritorija"} + PT{"Portugal"} + PW{"Palau"} + PY{"Paragvaj"} + QA{"Katar"} + RE{"Rejunion"} + RO{"Rumunija"} + RU{"Rusija"} + RW{"Ruanda"} + SA{"Saudijska Arabija"} + SB{"Solomon Islands"} + SC{"Sejšeli"} + SD{"Sudan"} + SE{"Švedska"} + SG{"Singapur"} + SH{"Saint Helena"} + SI{"Slovenija"} + SJ{"Svalbard i Jan Majen"} + SK{"Slovačka"} + SL{"Sijera Leone"} + SM{"San Marino"} + SN{"Senegal"} + SO{"Somalija"} + SR{"Surinam"} + ST{"Sao Tome i Principe"} + SV{"Salvador"} + SY{"Sirija"} + SZ{"Svazilend"} + TC{"Turks i Kajkos Ostrva"} + TD{"Čad"} + TF{"Francuske Južne Teritorije"} + TG{"Togo"} + TH{"Tajland"} + TJ{"Tadžikistan"} + TK{"Tokelau"} + TL{"Timor-Leste"} + TM{"Turkmenistan"} + TN{"Tunis"} + TO{"Tonga"} + TR{"Turska"} + TT{"Trinidad i Tobago"} + TV{"Tuvalu"} + TW{"Tajvan"} + TZ{"Tanzanija"} + UA{"Ukrajina"} + UG{"Uganda"} + UM{"Manja Udaljena Ostrva SAD"} + US{"Sjedinjene Američke Države"} + UY{"Urugvaj"} + UZ{"Uzbekistan"} + VA{"Vatikan"} + VC{"Sent Vinsent i Grenadini"} + VE{"Venecuela"} + VG{"Britanska Devičanska Ostrva"} + VI{"S.A.D. Devičanska Ostrva"} + VN{"Vijetnam"} + VU{"Vanuatu"} + WF{"Valis i Futuna"} + WS{"Samoa"} + YE{"Jemen"} + YT{"Mayotte"} + YU{"Jugoslavija"} + ZA{"Južna Afrika"} + ZM{"Zambija"} + ZW{"Zimbabve"} + } + Currencies{ + YUN{ + "Din", + "YUN", + } + } + ExemplarCharacters{"[a-p r-v z đ ć č ž š {lj} {nj} {dž}]"} + Languages{ + af{"Afrikanerski"} + ar{"Arapski"} + be{"Beloruski"} + bg{"Bugarski"} + br{"Bretonski"} + ca{"Katalonski"} + co{"Korzikanski"} + cs{"Češki"} + da{"Danski"} + de{"Nemački"} + el{"Grčki"} + en{"Engleski"} + es{"Španski"} + et{"Estonski"} + eu{"Baskijski"} + fa{"Persijski"} + fi{"Finski"} + fr{"Francuski"} + ga{"Irski"} + he{"Hebrejski"} + hr{"Hrvatski"} + hu{"Mađarski"} + hy{"Armenski"} + id{"Indonezijski"} + is{"Islandski"} + it{"Italijanski"} + ja{"Japanski"} + ka{"Gruzijski"} + km{"Kmerski"} + ko{"Korejski"} + ku{"Kurdski"} + ky{"Kirgiski"} + la{"Latinski"} + lt{"Litvanski"} + lv{"Letonski"} + mk{"Makedonski"} + mn{"Mongolski"} + mo{"Moldavski"} + my{"Burmanski"} + nl{"Holandski"} + no{"Norveški"} + pl{"Poljski"} + pt{"Portugalski"} + rm{"Reto-Romanski"} + ro{"Rumunski"} + ru{"Ruski"} + sh{"Srpsko-Hrvatski"} + sk{"Slovački"} + sl{"Slovenački"} + sq{"Albanski"} + sr{"Srpski"} + sv{"Švedski"} + sw{"Svahili"} + tr{"Turski"} + uk{"Ukrajnski"} + vi{"Vijetnamski"} + yi{"Jidiš"} + zh{"Kineski"} + } + LocaleScript{ + "Latn", + } + Scripts{ + Arab{"arapsko pismo"} + Armn{"jermensko pismo"} + Beng{"bengalsko pismo"} + Brai{"Brajevo pismo"} + Cher{"Čeroki"} + Copt{"koptičko pismo"} + Cyrl{"Ćirilica"} + Deva{"Devanagari"} + Dsrt{"Dezeret"} + Ethi{"etiopsko pismo"} + Geor{"gruzijsko pismo"} + Goth{"Gotika"} + Grek{"grčko pismo"} + Hebr{"hebrejsko pismo"} + Hira{"Hiragana"} + Hrkt{"Katakana ili Hiragana"} + Kana{"Katakana"} + Latn{"Latinica"} + } + Version{"1.2"} + calendar{ + gregorian{ + DateTimePatterns{ + "HH.mm.ss z", + "HH.mm.ss z", + "HH.mm.ss", + "HH.mm", + "EEEE, dd. MMMM yyyy.", + "EEEE, d.MM.yyyy.", + "dd.MM.yyyy.", + "d.M.yy.", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "ned", + "pon", + "uto", + "sre", + "čet", + "pet", + "sub", + } + narrow{ + "n", + "p", + "u", + "s", + "č", + "p", + "s", + } + wide{ + "nedelja", + "ponedeljak", + "utorak", + "sreda", + "četvrtak", + "petak", + "subota", + } + } + } + eras{ + abbreviated{ + "p. n. e.", + "n. e.", + } + } + monthNames{ + format{ + abbreviated{ + "jan", + "feb", + "mar", + "apr", + "maj", + "jun", + "jul", + "avg", + "sep", + "okt", + "nov", + "dec", + } + narrow{ + "j", + "f", + "m", + "a", + "m", + "j", + "j", + "a", + "s", + "o", + "n", + "d", + } + wide{ + "januar", + "februar", + "mart", + "april", + "maj", + "jun", + "jul", + "avgust", + "septembar", + "oktobar", + "novembar", + "decembar", + } + } + } + } + } +} diff --git a/icuSources/data/locales/sr_Latn_YU.txt b/icuSources/data/locales/sr_Latn_YU.txt new file mode 100644 index 00000000..7a74969c --- /dev/null +++ b/icuSources/data/locales/sr_Latn_YU.txt @@ -0,0 +1,11 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/sr_Latn_YU.xml +// * +// *************************************************************************** +sr_Latn_YU{ + Version{"1.2"} +} diff --git a/icuSources/data/locales/sr_YU.txt b/icuSources/data/locales/sr_YU.txt index abbf4e28..d52b6962 100644 --- a/icuSources/data/locales/sr_YU.txt +++ b/icuSources/data/locales/sr_YU.txt @@ -1,14 +1,11 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/sr_YU.xml // * // *************************************************************************** - -sr_YU { - Version{ "2.0" } -// LocaleString { "sr_YU" } - /* Discarding duplicate data for tag: NumberPatterns */ -// ShortCountry { "YUG" } - LocaleID:int { 0x0c1a } +sr_YU{ + "%%ALIAS"{"sr_Cyrl_YU"} } diff --git a/icuSources/data/locales/sv.txt b/icuSources/data/locales/sv.txt index 4ceb17b3..6fae926a 100644 --- a/icuSources/data/locales/sv.txt +++ b/icuSources/data/locales/sv.txt @@ -1,810 +1,2536 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2005 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/sv.xml // * // *************************************************************************** - -sv { - Version{ "2.0" } - - "%%TRADITIONAL" { "Traditionell" } - - "%%REVISED" { "Reviderad" } - - CollationElements { - Version { "1.0" } - Sequence { "& Z < a\u030A <<< A\u030A < a\u0308 <<< A\u0308 < \u00E6 <<< \u00C6" - "< o\u0308 <<< O\u0308 << u\u030B <<< U\u030B source: ../../../locale/icu/main/sv.xml + */ +sv{ + Countries{ + AD{"Andorra"} + AE{"Förenade Arabemiraten"} + AF{"Afghanistan"} + AG{"Antigua och Barbuda"} + AI{"Anguilla"} + AL{"Albanien"} + AM{"Armenien"} + AN{"Nederländska Antillerna"} + AO{"Angola"} + AQ{"Antarktis"} + AR{"Argentina"} + AS{"Amerikanska Samoa"} + AT{"Österrike"} + AU{"Australien"} + AW{"Aruba"} + AZ{"Azerbajdzjan"} + BA{"Bosnien och Hercegovina"} + BB{"Barbados"} + BD{"Bangladesh"} + BE{"Belgien"} + BF{"Burkina Faso"} + BG{"Bulgarien"} + BH{"Bahrain"} + BI{"Burundi"} + BJ{"Benin"} + BM{"Bermuda"} + BN{"Brunei"} + BO{"Bolivia"} + BR{"Brasilien"} + BS{"Bahamas"} + BT{"Bhutan"} + BV{"Bouvetön"} + BW{"Botswana"} + BY{"Vitryssland"} + BZ{"Belize"} + CA{"Kanada"} + CC{"Kokosöarna (Keelingöarna)"} + CD{"Demokratiska republiken Kongo"} + CF{"Centralafrikanska republiken"} + CG{"Kongo"} + CH{"Schweiz"} + CI{"Elfenbenskusten"} + CK{"Cooköarna"} + CL{"Chile"} + CM{"Kamerun"} + CN{"Kina"} + CO{"Colombia"} + CR{"Costa Rica"} + CU{"Kuba"} + CV{"Kap Verde"} + CX{"Julön"} + CY{"Cypern"} + CZ{"Tjeckien"} + DE{"Tyskland"} + DJ{"Djibouti"} + DK{"Danmark"} + DM{"Dominica"} + DO{"Dominikanska republiken"} + DZ{"Algeriet"} + EC{"Ecuador"} + EE{"Estland"} + EG{"Egypten"} + EH{"Västra Sahara"} + ER{"Eritrea"} + ES{"Spanien"} + ET{"Etiopien"} + FI{"Finland"} + FJ{"Fiji"} + FK{"Falklandsöarna"} + FM{"Mikronesien"} + FO{"Färöarna"} + FR{"Frankrike"} + GA{"Gabon"} + GB{"Storbritannien"} + GD{"Grenada"} + GE{"Georgien"} + GF{"Franska Guyana"} + GH{"Ghana"} + GI{"Gibraltar"} + GL{"Grönland"} + GM{"Gambia"} + GN{"Guinea"} + GP{"Guadeloupe"} + GQ{"Ekvatorialguinea"} + GR{"Grekland"} + GS{"Sydgeorgien och Södra Sandwichöarna"} + GT{"Guatemala"} + GU{"Guam"} + GW{"Guinea-Bissau"} + GY{"Guyana"} + HK{"Hongkong (S.A.R. Kina)"} + HM{"Heard- och McDonaldöarna"} + HN{"Honduras"} + HR{"Kroatien"} + HT{"Haiti"} + HU{"Ungern"} + ID{"Indonesien"} + IE{"Irland"} + IL{"Israel"} + IN{"Indien"} + IO{"Brittiska Indiska oceanöarna"} + IQ{"Irak"} + IR{"Iran"} + IS{"Island"} + IT{"Italien"} + JM{"Jamaica"} + JO{"Jordanien"} + JP{"Japan"} + KE{"Kenya"} + KG{"Kirgizistan"} + KH{"Kambodja"} + KI{"Kiribati"} + KM{"Komorerna"} + KN{"S:t Kitts och Nevis"} + KP{"Nordkorea"} + KR{"Sydkorea"} + KW{"Kuwait"} + KY{"Caymanöarna"} + KZ{"Kazakstan"} + LA{"Laos"} + LB{"Libanon"} + LC{"S:t Lucia"} + LI{"Liechtenstein"} + LK{"Sri Lanka"} + LR{"Liberia"} + LS{"Lesotho"} + LT{"Litauen"} + LU{"Luxemburg"} + LV{"Lettland"} + LY{"Libyen"} + MA{"Marocko"} + MC{"Monaco"} + MD{"Moldavien"} + MG{"Madagaskar"} + MH{"Marshallöarna"} + MK{"Makedonien"} + ML{"Mali"} + MM{"Myanmar"} + MN{"Mongoliet"} + MO{"Macao (S.A.R. Kina)"} + MP{"Nordmarianerna"} + MQ{"Martinique"} + MR{"Mauretanien"} + MS{"Montserrat"} + MT{"Malta"} + MU{"Mauritius"} + MV{"Maldiverna"} + MW{"Malawi"} + MX{"Mexiko"} + MY{"Malaysia"} + MZ{"Moçambique"} + NA{"Namibia"} + NC{"Nya Kaledonien"} + NE{"Niger"} + NF{"Norfolkön"} + NG{"Nigeria"} + NI{"Nicaragua"} + NL{"Nederländerna"} + NO{"Norge"} + NP{"Nepal"} + NR{"Nauru"} + NU{"Niueön"} + NZ{"Nya Zeeland"} + OM{"Oman"} + PA{"Panama"} + PE{"Peru"} + PF{"Franska Polynesien"} + PG{"Papua Nya Guinea"} + PH{"Filippinerna"} + PK{"Pakistan"} + PL{"Polen"} + PM{"S:t Pierre och Miquelon"} + PN{"Pitcairn"} + PR{"Puerto Rico"} + PS{"Palestinska territoriet"} + PT{"Portugal"} + PW{"Palau"} + PY{"Paraguay"} + QA{"Qatar"} + RE{"Réunion"} + RO{"Rumänien"} + RU{"Ryssland"} + RW{"Rwanda"} + SA{"Saudiarabien"} + SB{"Salomonöarna"} + SC{"Seychellerna"} + SD{"Sudan"} + SE{"Sverige"} + SG{"Singapore"} + SH{"S:t Helena"} + SI{"Slovenien"} + SJ{"Svalbard och Jan Mayen"} + SK{"Slovakien"} + SL{"Sierra Leone"} + SM{"San Marino"} + SN{"Senegal"} + SO{"Somalia"} + SP{"Serbien"} + SR{"Surinam"} + ST{"São Tomé och Príncipe"} + SV{"El Salvador"} + SY{"Syrien"} + SZ{"Swaziland"} + TC{"Turks- och Caicosöarna"} + TD{"Tchad"} + TF{"Franska Sydterritorierna"} + TG{"Togo"} + TH{"Thailand"} + TJ{"Tadzjikistan"} + TK{"Tokelauöarna"} + TL{"Östtimor"} + TM{"Turkmenistan"} + TN{"Tunisien"} + TO{"Tonga"} + TR{"Turkiet"} + TT{"Trinidad och Tobago"} + TV{"Tuvalu"} + TW{"Taiwan"} + TZ{"Tanzania"} + UA{"Ukraina"} + UG{"Uganda"} + UM{"USAs yttre öar"} + US{"USA"} + UY{"Uruguay"} + UZ{"Uzbekistan"} + VA{"Vatikanstaten"} + VC{"S:t Vincent och Grenadinerna"} + VE{"Venezuela"} + VG{"Brittiska Jungfruöarna"} + VI{"Amerikanska Jungfruöarna"} + VN{"Vietnam"} + VU{"Vanuatu"} + WF{"Wallis- och Futunaöarna"} + WS{"Samoa"} + YE{"Jemen"} + YT{"Mayotte"} + YU{"Jugoslavien"} + ZA{"Sydafrika"} + ZM{"Zambia"} + ZW{"Zimbabwe"} } - DateTimePatterns { - "'kl. 'HH.mm.ss z", - "HH.mm.ss z", - "HH.mm.ss", - "HH.mm", - "'den 'd MMMM yyyy", - "'den 'd MMMM yyyy", - "yyyy-MM-dd", - "yyyy-MM-dd", - "{1} {0}", - } - DayAbbreviations { - "s\u00F6", - "m\u00E5", - "ti", - "on", - "to", - "fr", - "l\u00F6", - } - DayNames { - "s\u00F6ndag", - "m\u00E5ndag", - "tisdag", - "onsdag", - "torsdag", - "fredag", - "l\u00F6rdag", + Currencies{ + ADD{ + "ADD", + "Andorransk diner", + } + ADP{ + "ADP", + "Andorransk peseta", + } + AED{ + "AED", + "Förenade arabemiratens dirham", + } + AIF{ + "AIF", + "Affars och Issas-franc", + } + ALK{ + "ALK", + "Albansk lek (1946-1961)", + } + ALL{ + "lek", + "Albansk lek", + } + ALV{ + "ALV", + "Albansk lek – Valute)", + } + ALX{ + "ALX", + "Albansk dollar – Foreign Exchange Certificates)", + } + AMD{ + "dram", + "Armenisk dram", + } + ANG{ + "NA f.", + "Nederländsk antillisk gulden", + } + AOA{ + "AOA", + "Angolansk kwanza", + } + AOK{ + "AOK", + "Angolansk kwanza (1977-1990)", + } + AON{ + "AON", + "Angolansk ny kwanza (1990-2000)", + } + AOR{ + "AOR", + "Angolansk kwanza – Reajustado (1995-1999)", + } + AOS{ + "AOS", + "Angolansk escudo", + } + ARA{ + "ARA", + "Argentinsk austral", + } + ARM{ + "ARM", + "Argentinsk peso – Moneda nacional", + } + ARP{ + "ARP", + "Argentinsk peso (1983-1985)", + } + ARS{ + "Arg$", + "Argentinsk peso", + } + ATS{ + "ATS", + "Österrikisk schilling", + } + AUD{ + "$A", + "Australisk dollar", + } + AUP{ + "AUP", + "Australiskt pund", + } + AWG{ + "AWG", + "Aruba-florin", + } + AZM{ + "AZM", + "Azerbajdzjansk manat", + } + BAD{ + "BAD", + "Bosnisk-hercegovinsk dinar", + } + BAM{ + "KM", + "Konvertibel bosnisk-hercegovinsk mark", + } + BAN{ + "BAN", + "Bosnisk-hercegovinsk ny dinar", + } + BBD{ + "BDS$", + "Barbadisk dollar", + } + BDT{ + "Tk", + "Bangladeshisk taka", + } + BEC{ + "BEC", + "Belgisk franc (konvertibel)", + } + BEF{ + "BF", + "Belgisk franc", + } + BEL{ + "BEL", + "Belgisk franc (finansiell)", + } + BGL{ + "lev", + "Bulgarisk hård lev", + } + BGM{ + "BGM", + "Bulgarisk socialistisk lev", + } + BGN{ + "BGN", + "Bulgarisk ny lev", + } + BGO{ + "BGO", + "Bulgarisk lev (1879-1952)", + } + BGX{ + "BGX", + "Bulgarisk lev – Foreign Exchange Certificates", + } + BHD{ + "BD", + "Bahrainsk dinar", + } + BIF{ + "Fbu", + "Burundisk franc", + } + BMD{ + "Ber$", + "Bermuda-dollar", + } + BMP{ + "BMP", + "Bermuda-pund", + } + BND{ + "BND", + "Bruneisk dollar", + } + BOP{ + "BOP", + "Boliviansk peso", + } + BOV{ + "BOV", + "Boliviansk mvdol", + } + BRB{ + "BRB", + "Brasiliansk cruzeiro novo (1967-1986)", + } + BRC{ + "BRC", + "Brasiliansk cruzado", + } + BRE{ + "BRE", + "Brasiliansk cruzeiro (1990-1993)", + } + BRL{ + "R$", + "Brasiliansk real", + } + BRN{ + "BRN", + "Brasiliansk cruzado novo", + } + BRR{ + "BRR", + "Brasiliansk cruzeiro", + } + BRZ{ + "BRZ", + "Brasiliansk cruzeiro (1942-1967)", + } + BSD{ + "BSD", + "Bahamansk dollar", + } + BSP{ + "BSP", + "Bahamanskt pund", + } + BTN{ + "Nu", + "Bhutanesisk ngultrum", + } + BTR{ + "BTR", + "Bhutanesisk rupie", + } + BUK{ + "BUK", + "Burmesisk kyat", + } + BUR{ + "BUR", + "Burmesisk rupee", + } + BWP{ + "BWP", + "Botswansk pula", + } + BYB{ + "BYB", + "Vitrysk ny rubel (1994-1999)", + } + BYL{ + "BYL", + "Vitrysk rubel (1992-1994)", + } + BYR{ + "Rbl", + "Vitrysk rubel", + } + BZD{ + "BZ$", + "Belizisk dollar", + } + BZH{ + "BZH", + "Brittiska Honduras-dollar", + } + CAD{ + "Can$", + "Kanadensisk dollar", + } + CDF{ + "CDF", + "Kongolesisk franc congolais", + } + CDG{ + "CDG", + "Kongolesisk franc", + } + CDL{ + "CDL", + "Kongolesisk zaire", + } + CFF{ + "CFF", + "Centralafrikansk CFA-franc", + } + CHF{ + "SwF", + "Schweizisk franc", + } + CKD{ + "CKD", + "Cook-dollar", + } + CLC{ + "CLC", + "Chilensk condor", + } + CLE{ + "CLE", + "Chilensk escudo", + } + CLF{ + "CLF", + "Chilensk unidad de fomento", + } + CLP{ + "Ch$", + "Chilensk peso", + } + CMF{ + "CMF", + "Kamerunsk CFA-franc", + } + CNP{ + "CNP", + "Kinesisk jen min piao yuan", + } + CNX{ + "CNX", + "Kinesisk USA-dollar Foreign Exchange Certificates", + } + CNY{ + "Y", + "Kinesisk yuan renminbi", + } + COB{ + "COB", + "Colombiansk papperspeso", + } + COF{ + "COF", + "Kongolesisk CFA-franc", + } + COP{ + "Col$", + "Colombiansk peso", + } + CRC{ + "C", + "Costarikansk colón", + } + CSC{ + "CSC", + "Tjeckisk koruna", + } + CSK{ + "CSK", + "Tjeckisk hård koruna", + } + CUP{ + "CUP", + "Kubansk peso", + } + CUX{ + "CUX", + "Kubansk Foreign Exchange Certificates", + } + CVE{ + "CVEsc", + "Kapverdisk escudo", + } + CWG{ + "CWG", + "Curaçao-gulden", + } + CYP{ + "£C", + "Cypriotiskt pund", + } + CZK{ + "CZK", + "Tjeckisk koruna", + } + DDM{ + "DDM", + "Östtysk mark", + } + DEM{ + "DEM", + "Tysk mark", + } + DES{ + "DES", + "Tysk sperrmark", + } + DJF{ + "DF", + "Djiboutisk franc", + } + DKK{ + "DKr", + "Dansk krona", + } + DOP{ + "RD$", + "Dominikansk peso", + } + DZD{ + "DA", + "Algerisk dinar", + } + DZF{ + "DZF", + "Algerisk ny franc", + } + DZG{ + "DZG", + "Algerisk franc germinal", + } + ECS{ + "ECS", + "Ecuadoriansk sucre", + } + ECV{ + "ECV", + "Ecuadoriansk Unidad de Valor Constante (UVC)", + } + EEK{ + "EEK", + "Estnisk krona", + } + EGP{ + "EGP", + "Egyptiskt pund", + } + ERN{ + "ERN", + "Eritreansk nakfa", + } + ESP{ + "ESP", + "Spansk peseta", + } + ETB{ + "Br", + "Etiopisk birr", + } + ETD{ + "ETD", + "Etiopisk dollar", + } + EUR{ + "€", + "Euro", + } + FIM{ + "FIM", + "Finsk mark", + } + FIN{ + "FIN", + "Finsk mark (1860-1962)", + } + FJD{ + "F$", + "Fijiansk dollar", + } + FJP{ + "FJP", + "Fijianskt pund", + } + FKP{ + "FKP", + "Falklandsöarnas pund", + } + FOK{ + "FOK", + "Färöisk krona", + } + FRF{ + "FRF", + "Fransk franc", + } + FRG{ + "FRG", + "Fransk Franc Germinal/Franc Poincare", + } + GAF{ + "GAF", + "Gabonesisk CFA-franc", + } + GBP{ + "£", + "Brittiskt pund sterling", + } + GEK{ + "GEK", + "Georgisk kupon larit", + } + GEL{ + "lari", + "Georgisk lari", + } + GHC{ + "GHC", + "Ghanansk cedi", + } + GHO{ + "GHO", + "Ghanansk gammal cedi", + } + GHP{ + "GHP", + "Ghananskt pund", + } + GHR{ + "GHR", + "Ghanansk omvärderad cedi", + } + GIP{ + "GIP", + "Gibraltiskt pund", + } + GLK{ + "GLK", + "Grönländsk krona", + } + GMD{ + "GMD", + "Gambisk dalasi", + } + GMP{ + "GMP", + "Gambiskt pund", + } + GNF{ + "GF", + "Guineansk franc", + } + GNI{ + "GNI", + "Guineansk franc (1960-1972)", + } + GNS{ + "GNS", + "Guineansk syli", + } + GPF{ + "GPF", + "Guadeloupisk franc", + } + GQE{ + "GQE", + "Ekvatorialguineansk ekwele guineana", + } + GQF{ + "GQF", + "Ekvatorialguineansk franco", + } + GQP{ + "GQP", + "Ekvatorialguineansk peseta guineana", + } + GRD{ + "GRD", + "Grekisk drachma", + } + GRN{ + "GRN", + "Grekisk ny drachma", + } + GTQ{ + "Q", + "Guatemalansk quetzal", + } + GUF{ + "GUF", + "Franska Guyanas Franc Guiana", + } + GWE{ + "GWE", + "Portugisiska Guinea-escudo", + } + GWM{ + "GWM", + "Portugisiska Guinea-mil reis", + } + GWP{ + "GWP", + "Guinea-Bissau-peso", + } + GYD{ + "G$", + "Guyanansk dollar", + } + HKD{ + "HK$", + "Hongkong-dollar", + } + HNL{ + "L", + "Hoduransk lempira", + } + HRD{ + "HRD", + "Kroatisk dinar", + } + HRK{ + "HRK", + "Kroatisk kuna", + } + HTG{ + "HTG", + "Haitisk gourde", + } + HUF{ + "Ft", + "Ungersk forint", + } + IBP{ + "IBP", + "Nordirländskt pund", + } + IDG{ + "IDG", + "Indonesisk nica gulden", + } + IDJ{ + "IDJ", + "Indonesisk java rupiah", + } + IDN{ + "IDN", + "Indonesisk ny rupiah", + } + IDR{ + "Rp", + "Indonesisk rupiah", + } + IEP{ + "IR£", + "Irländskt pund", + } + ILL{ + "ILL", + "Israelisk shekel", + } + ILP{ + "ILP", + "Israeliskt pund", + } + ILS{ + "ILS", + "Israelisk ny shekel", + } + IMP{ + "IMP", + "Isle of Man-pund sterling", + } + INR{ + "=0#Rs.|1#Re.|1: <%neutrum>];\n" - "10,000: =%neutrum=;\n" - // the same as default except we change the one's digit, wish there were a better way - "%neutrum:\n" - "-x: minus >>;\n" - "x.x: << komma >>;\n" - "noll; ett; tv\u00e5; tre; fyra; fem; sex; sju; \u00e5tta; nio;\n" - "tio; elva; tolv; tretton; fjorton; femton; sexton; sjutton; arton; nitton;\n" - "20: tjugo[>>];\n" - "30: trettio[>>];\n" - "40: fyrtio[>>];\n" - "50: femtio[>>];\n" - "60: sextio[>>];\n" - "70: sjuttio[>>];\n" - "80: \u00e5ttio[>>];\n" - "90: nittio[>>];\n" - "100: <>];\n" - "1000: ettusen[ >>];\n" - "2000: <%default<\u00adtusen[ >>];\n" - "1,000,000: en miljon[ >>];\n" - "2,000,000: <%default< miljoner[ >>];\n" - "1,000,000,000: en miljard[ >>];\n" - "2,000,000,000: <%default< miljarder[ >>];\n" - "1,000,000,000,000: en biljon[ >>];\n" - "2,000,000,000,000: <%default< biljoner[ >>];\n" - "1,000,000,000,000,000: en triljon[ >>];\n" - "2,000,000,000,000,000: <%default< triljoner[ >>];\n" - "1,000,000,000,000,000,000: =#,##0=;\n" - "%default:\n" - " -x: minus >>;\n" - "x.x: << komma >>;\n" - "noll; en; tv\u00e5; tre; fyra; fem; sex; sju; \u00e5tta; nio;\n" - "tio; elva; tolv; tretton; fjorton; femton; sexton; sjutton; arton; nitton;\n" - "20: tjugo[>>];\n" - "30: trettio[>>];\n" - "40: fyrtio[>>];\n" - "50: femtio[>>];\n" - "60: sextio[>>];\n" - "70: sjuttio[>>];\n" - "80: \u00e5ttio[>>];\n" - "90: nittio[>>];\n" - "100: etthundra[\u00ad>>];\n" - "200: <>];\n" - "1000: ettusen[ >>];\n" - "2000: <<\u00adtusen[ >>];\n" - "1,000,000: en miljon[ >>];\n" - "2,000,000: << miljoner[ >>];\n" - "1,000,000,000: en miljard[ >>];\n" - "2,000,000,000: << miljarder[ >>];\n" - "1,000,000,000,000: en biljon[ >>];\n" - "2,000,000,000,000: << biljoner[ >>];\n" - "1,000,000,000,000,000: en triljon[ >>];\n" - "2,000,000,000,000,000: << triljoner[ >>];\n" - "1,000,000,000,000,000,000: =#,##0=;\n" -/* - * Current (java) implementation can't handle these magnitudes - "1,000,000,000,000,000,000: en triljard[ >>];\n" - "2,000,000,000,000,000,000: << triljarder[ >>];\n" - * Current (c++) implmenatation can't handle these magnitudes - "1,000,000,000,000,000,000,000: en kvartiljon[ >>];\n" - "2,000,000,000,000,000,000,000: << kvartiljoner[ >>];\n" - "1,000,000,000,000,000,000,000,000: en kvartiljard[ >>];\n" - "2,000,000,000,000,000,000,000,000: << kvartiljarder[ >>];\n" - "1,000,000,000,000,000,000,000,000,000: en kvintiljon[ >>];\n" - "2,000,000,000,000,000,000,000,000,000: << kvintiljoner[ >>];\n" - "1,000,000,000,000,000,000,000,000,000,000: en kvintiljard[ >>];\n" - "2,000,000,000,000,000,000,000,000,000,000: << kvintiljarder[ >>];\n" - "1,000,000,000,000,000,000,000,000,000,000,000: en sextiljon[ >>];\n" - "2,000,000,000,000,000,000,000,000,000,000,000: << sextiljoner[ >>];\n" - "1,000,000,000,000,000,000,000,000,000,000,000,000: en sextiljard[ >>];\n" - "2,000,000,000,000,000,000,000,000,000,000,000,000: << sextiljarder[ >>];\n" - "1,000,000,000,000,000,000,000,000,000,000,000,000,000: =#,##0=" -*/ + Variants{ + REVISED{"Reviderad"} + } + Version{"1.3"} + calendar{ + gregorian{ + AmPmMarkers{ + "f.m.", + "e.m.", + } + DateTimeElements:intvector{ + 2, + 4, + } + DateTimePatterns{ + "'kl. 'HH.mm.ss z", + "HH.mm.ss z", + "HH.mm.ss", + "HH.mm", + "EEEE d MMMM yyyy", + "EEEE d MMM yyyy", + "d MMM yyyy", + "yyyy-MM-dd", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "sön", + "mån", + "tis", + "ons", + "tors", + "fre", + "lör", + } + narrow{ + "S", + "M", + "T", + "O", + "T", + "F", + "L", + } + wide{ + "söndag", + "måndag", + "tisdag", + "onsdag", + "torsdag", + "fredag", + "lördag", + } + } + } + eras{ + abbreviated{ + "f.Kr.", + "e.Kr.", + } + } + monthNames{ + format{ + abbreviated{ + "jan", + "feb", + "mar", + "apr", + "maj", + "jun", + "jul", + "aug", + "sep", + "okt", + "nov", + "dec", + } + narrow{ + "J", + "F", + "M", + "A", + "M", + "J", + "J", + "A", + "S", + "O", + "N", + "D", + } + wide{ + "januari", + "februari", + "mars", + "april", + "maj", + "juni", + "juli", + "augusti", + "september", + "oktober", + "november", + "december", + } + } + } + } } - - // Currency display names - Currencies { - SEK { "kr", "SEK" } + zoneStrings{ + { + "America/Los_Angeles", + "Pacific, normaltid", + "PST", + "Pacific, sommartid", + "PDT", + "Los Angeles", + } + { + "America/Denver", + "Mountain, normaltid", + "MST", + "Mountain, sommartid", + "MDT", + "Denver", + } + { + "America/Phoenix", + "Mountain, normaltid", + "MST", + "Mountain, sommartid", + "MST", + "Phoenix", + } + { + "America/Chicago", + "Central, normaltid", + "CST", + "Central, sommartid", + "CDT", + "Chicago", + } + { + "America/New_York", + "Eastern, normaltid", + "EST", + "Eastern, sommartid", + "EDT", + "New York", + } + { + "America/Indianapolis", + "Eastern, normaltid", + "EST", + "Eastern, normaltid", + "EST", + "Indianapolis", + } + { + "Pacific/Honolulu", + "Hawaii, normaltid", + "HST", + "Hawaii, normaltid", + "HST", + "Honolulu", + } + { + "America/Anchorage", + "Alaska, normaltid", + "AST", + "Alaska, sommartid", + "ADT", + "Anchorage", + } + { + "America/Halifax", + "Atlantic, normaltid", + "AST", + "Atlantic, sommartid", + "ADT", + "Halifax", + } + { + "America/St_Johns", + "Newfoundland, normaltid", + "CNT", + "Newfoundland, sommartid", + "CDT", + "St. Johns", + } + { + "Europe/Paris", + "Centraleuropa, normaltid", + "CET", + "Centraleuropa, sommartid", + "CEST", + "Paris", + } + { + "Etc/GMT", + "Greenwichtid", + "GMT", + "Greenwichtid", + "GMT", + "London", + } + { + "Africa/Casablanca", + "Greenwichtid", + "GMT", + "Greenwichtid", + "GMT", + "Casablanca", + } + { + "Asia/Jerusalem", + "Israel, normaltid", + "IST", + "Israel, sommartid", + "IDT", + "Jerusalem", + } + { + "Asia/Tokyo", + "Japan, normaltid", + "JST", + "Japan, normaltid", + "JST", + "Tokyo", + } + { + "Europe/Bucharest", + "Östeuropa, normaltid", + "EET", + "Östeuropa, sommartid", + "EEST", + "Bukarest", + } + { + "Asia/Shanghai", + "Kina, normaltid", + "CTT", + "Kina, normaltid", + "CDT", + "Shanghai", + } } } diff --git a/icuSources/data/locales/sv_FI.txt b/icuSources/data/locales/sv_FI.txt index cfe81448..d5a6dc18 100644 --- a/icuSources/data/locales/sv_FI.txt +++ b/icuSources/data/locales/sv_FI.txt @@ -1,18 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/sv_FI.xml // * // *************************************************************************** - -sv_FI { - Version { "2.0" } - NumberPatterns { +sv_FI{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "#,##0.00 \u00A4;-#,##0.00 \u00A4", + "#,##0.00 ¤;-#,##0.00 ¤", "#,##0%", "#E0", } -// ShortCountry { "FIN" } - LocaleID:int { 0x081d } -} \ No newline at end of file + Version{"1.2"} +} diff --git a/icuSources/data/locales/sv_SE.txt b/icuSources/data/locales/sv_SE.txt index 274106b1..069a8f1d 100644 --- a/icuSources/data/locales/sv_SE.txt +++ b/icuSources/data/locales/sv_SE.txt @@ -1,19 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/sv_SE.xml // * // *************************************************************************** - -sv_SE { - Version { "2.0" } -// LocaleString { "sv_SE" } - NumberPatterns { +sv_SE{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "#,##0.00 \u00A4;-#,##0.00 \u00A4", + "#,##0.00 ¤;-#,##0.00 ¤", "#,##0 %", "#E0", } -// ShortCountry { "SWE" } - LocaleID:int { 0x041d } + Version{"1.2"} } diff --git a/icuSources/data/locales/sw.txt b/icuSources/data/locales/sw.txt index 9e5c202c..c1a26543 100644 --- a/icuSources/data/locales/sw.txt +++ b/icuSources/data/locales/sw.txt @@ -1,102 +1,189 @@ -// ******************************************************************************* +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/sw.xml // * -// ******************************************************************************* -// Date Name Description -// 10/23/2000 grhoten Initial version (source http://www.yale.edu/swahili/) - - -sw { - Version { "2.0" } - -// Countries { // This does not need to be overridden -// KE { "Kenya" } -// TZ { "Tanzania" } -// } - DateTimeElements:intvector { - 7, - 1, +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/sw.xml + */ +sw{ + Countries{ + AE{"Muugano wa Falme za Nchi za Kiarabu"} + AG{"Antigua na Barbuda"} + AR{"Ajentina"} + BA{"Bosnia na Herzegowina"} + BE{"Ubelgiji"} + BR{"Brazili"} + BS{"Visiwa vya Bahama"} + CA{"Kanada"} + CF{"Jamhuri ya Afrika ya Kati"} + CG{"Kongo"} + CH{"Uswisi"} + CI{"Pwani ya Pembe"} + CM{"Kamerun"} + CN{"Uchina"} + CO{"Kolombia"} + CV{"Rasi Verde"} + CZ{"Jamhuri ya Czech"} + DE{"Udachi"} + DJ{"Jibuti"} + DK{"Udenmarki"} + DM{"Dominika"} + DO{"Jamhuri ya Dominikan"} + EC{"Ekvado"} + EG{"Misri"} + ES{"Uhispania"} + ET{"Uhabeshi"} + FR{"Ufaransa"} + GB{"Uingereza"} + GQ{"Guinea ya Ikweta"} + HR{"Kroatia"} + HU{"Hungaria"} + IL{"Uyahudi"} + IN{"Uhindi"} + IQ{"Iraki"} + IR{"Uajemi"} + IS{"Barafu"} + IT{"Uitaliani"} + JM{"Jamaika"} + JP{"Ujapani"} + KE{"Kenya"} + KH{"Kampuchea"} + KM{"Visiwa vya Komoro"} + KN{"Saint Kitts na Nevis"} + KP{"Korea ya Kaskazini"} + KR{"Korea ya Kusini"} + LU{"Luksemburg"} + MA{"Moroko"} + MC{"Monako"} + MH{"Visiwa vya Marshall"} + MX{"Meksiko"} + MY{"Malasya"} + MZ{"Msumbiji"} + NI{"Nikaragua"} + NL{"Uholanzi"} + NO{"Unorwe"} + NP{"Nepali"} + PG{"Papua Guinea Mpya"} + PH{"Filipino"} + PT{"Ureno"} + PY{"Paragwai"} + RU{"Urusi"} + SA{"Arabuni Saudi"} + SB{"Visiwa vya Solomon"} + SC{"Visiwa vya Shelisheli"} + SE{"Uswidi"} + SO{"Somali"} + ST{"Sao Tome na Principe"} + TD{"Chadi"} + TL{"Timor ya Mashariki"} + TR{"Uturuki"} + TT{"Trinidad na Tobago"} + TZ{"Tanzania"} + US{"Muungano wa Nchi za Amerika"} + UY{"Urugwai"} + VA{"Vatikano"} + VC{"Saint Vincent na Grenadines"} + YE{"Yemeni"} + ZA{"Afrika ya Kusini"} } - DayAbbreviations { // The DayNames are correct, but DayAbbreviations are only guesses. - "Jpi", - "Jtt", - "Jnn", - "Jtn", - "Alh", - "Iju", - "Jmo", - } - DayNames { - "Jumapili", - "Jumatatu", - "Jumanne", - "Jumatano", - "Alhamisi", - "Ijumaa", - "Jumamosi", - } - Eras { - "KK", - "BK", + Currencies{ + KES{ + "KSh", + "KES", + } + TZS{ + "TSh", + "TZS", + } } - Languages { - sw { "Kiswahili" } + ExemplarCharacters{"[a-z]"} + Languages{ + sw{"Kiswahili"} } - LocaleID:int { 0x0041 } -// LocaleString { "sw" } - MonthAbbreviations { - "Jan", - "Feb", - "Mar", - "Apr", - "Mei", - "Jun", - "Jul", - "Ago", - "Sep", - "Okt", - "Nov", - "Des", + LocaleScript{ + "Latn", } - MonthNames { - "Januari", - "Februari", - "Machi", - "Aprili", - "Mei", - "Juni", - "Julai", - "Agosti", - "Septemba", - "Oktoba", - "Novemba", - "Desemba", + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 7, + 1, + } + dayNames{ + format{ + abbreviated{ + "Jpi", + "Jtt", + "Jnn", + "Jtn", + "Alh", + "Iju", + "Jmo", + } + wide{ + "Jumapili", + "Jumatatu", + "Jumanne", + "Jumatano", + "Alhamisi", + "Ijumaa", + "Jumamosi", + } + } + } + eras{ + abbreviated{ + "KK", + "BK", + } + } + monthNames{ + format{ + abbreviated{ + "Jan", + "Feb", + "Mar", + "Apr", + "Mei", + "Jun", + "Jul", + "Ago", + "Sep", + "Okt", + "Nov", + "Des", + } + wide{ + "Januari", + "Februari", + "Machi", + "Aprili", + "Mei", + "Juni", + "Julai", + "Agosti", + "Septemba", + "Oktoba", + "Novemba", + "Desemba", + } + } + } + } } -// ShortLanguage { "swa" } - zoneStrings { + zoneStrings{ { "Africa/Nairobi", - "Saa za Africa Mashariki", // East African Time + "Saa za Africa Mashariki", "EAT", "Saa za Africa Mashariki", "EAT", "Nairobi", } } -// LocaleScript{ -// "Latn", // ISO 15924 Name -// } - -// /**************** Info Below is needed ****************/ -// NumberElements{} -// AmPmMarkers{} -// localPatternChars{} - - // Currency display names - Currencies { - KES { "KSh", "KES" } - TZS { "TSh", "TZS" } - } } diff --git a/icuSources/data/locales/sw_KE.txt b/icuSources/data/locales/sw_KE.txt index d7d0fc86..cd325440 100644 --- a/icuSources/data/locales/sw_KE.txt +++ b/icuSources/data/locales/sw_KE.txt @@ -1,22 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/sw_KE.xml // * // *************************************************************************** -// Date Name Description -// 10/23/2000 grhoten Initial version - - -sw_KE { - Version { "2.0" } -// LocaleString { "sw_KE" } - NumberPatterns { +sw_KE{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "\u00A4#,##0.00;-\u00A4#,##0.00", + "¤#,##0.00;-¤#,##0.00", "#,##0%", "#E0", } -// ShortCountry { "KEN" } - LocaleID:int { 0x0441 } + Version{"1.2"} } diff --git a/icuSources/data/locales/sw_TZ.txt b/icuSources/data/locales/sw_TZ.txt index 1ac4ad7a..594238df 100644 --- a/icuSources/data/locales/sw_TZ.txt +++ b/icuSources/data/locales/sw_TZ.txt @@ -1,23 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/sw_TZ.xml // * // *************************************************************************** -// Date Name Description -// 10/23/2000 grhoten Initial version - - -sw_TZ { - Version { "2.0" } -// LocaleString { "sw_TZ" } - NumberPatterns { +sw_TZ{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "#,##0.00 \u00A4;-#,##0.00 \u00A4", + "#,##0.00 ¤;-#,##0.00 ¤", "#,##0%", "#E0", } -// ShortCountry { "TZA" } -// Microsoft's JDK documentation says that this number is for Kenya only. -// LocaleID { "0441" } + Version{"1.2"} } diff --git a/icuSources/data/locales/ta.txt b/icuSources/data/locales/ta.txt index 67512691..31a585af 100644 --- a/icuSources/data/locales/ta.txt +++ b/icuSources/data/locales/ta.txt @@ -1,265 +1,417 @@ -// *************************************************************************** -// * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -ta { - Version { "2.0" } - -// ShortLanguage { tam } - Languages { - root { "\u0ba4\u0bae\u0bbf\u0bb4\u0bcd" } - - aa { "\u0b85\u0baa\u0bbe\u0bb0\u0bcd" } - ab { "\u0b85\u0baa\u0bcd\u0b95\u0bbe\u0bb8\u0bbf\u0ba9\u0bcd" } - af { "\u0b86\u0baa\u0bcd\u0bb0\u0bbf\u0b95\u0ba9\u0bcd\u0bb8\u0bcd" } - am { "\u0b85\u0bae\u0bcd\u0bb9\u0bbe\u0bb0\u0bbf\u0b95\u0bcd" } - ar { "\u0b85\u0bb0\u0baa\u0bbf\u0b95\u0bcd" } - as { "\u0b85\u0bb8\u0bbe\u0bae\u0bc0\u0bb8\u0bcd" } - ay { "\u0b85\u0baf\u0bae\u0bb0\u0bbe" } - az { "\u0b85\u0b9a\u0bb0\u0bcd\u0baa\u0bbe\u0baf\u0bcd\u0b9c\u0bbe\u0ba9\u0bbf" } - ba { "\u0baa\u0bbe\u0bb7\u0bcd\u0b95\u0bbf\u0bb0\u0bcd0" } - be { "\u0baa\u0bc8\u0bb2\u0bcb\u0bb0\u0bc1\u0bb7\u0bcd\u0ba9\u0bcd" } - bg { "\u0baa\u0bb2\u0bcd\u0b95\u0bc6\u0bb0\u0bbf\u0baf\u0ba9\u0bcd" } - bh { "\u0baa\u0bbf\u0bb9\u0bbe\u0bb0\u0bbf" } - bi { "\u0baa\u0bbf\u0bb8\u0bcd\u0bb2\u0bbe\u0bae\u0bbe" } - bn { "\u0baa\u0bc6\u0b99\u0bcd\u0b95\u0bbe\u0bb2\u0bbf" } - bo { "\u0ba4\u0bbf\u0baa\u0bc6\u0ba4\u0bcd\u0ba4\u0bbf\u0baf\u0ba9\u0bcd" } - br { "\u0baa\u0bbf\u0bb0\u0bbf\u0b9f\u0ba9\u0bcd" } - ca { "\u0b95\u0bbe\u0b9f\u0bb2\u0bbe\u0ba9\u0bcd" } - co { "\u0b95\u0bbe\u0bb0\u0bcd\u0b9a\u0bbf\u0baf\u0ba9\u0bcd" } - cs { "\u0b9a\u0bc6\u0b95\u0bcd" } - cy { "\u0bb5\u0bc6\u0bb2\u0bcd\u0bb7\u0bcd" } - da { "\u0b9f\u0bbe\u0ba9\u0bbf\u0bb7\u0bcd" } - de { "\u0b9c\u0bc6\u0bb0\u0bcd\u0bae\u0ba9\u0bcd" } - dz { "\u0baa\u0bc1\u0b9f\u0bbe\u0ba9\u0bbf" } - el { "\u0b95\u0bbf\u0bb0\u0bbf\u0b95\u0bcd" } - en { "\u0b86\u0b99\u0bcd\u0b95\u0bbf\u0bb2\u0bae\u0bcd" } - eo { "\u0b8e\u0bb8\u0bcd\u0baa\u0bb0\u0bc7\u0ba9\u0bcd\u0b9f\u0bcb" } - es { "\u0bb8\u0bcd\u0baa\u0bc7\u0ba9\u0bbf\u0bb7\u0bcd" } - et { "\u0b8e\u0bb8\u0bcd\u0b9f\u0bcb\u0ba9\u0bbf\u0baf\u0ba9\u0bcd" } - eu { "\u0baa\u0bb8\u0bcd\u0b95\u0bcd" } - fa { "\u0baa\u0bb0\u0bcd\u0bb8\u0bbf\u0baf\u0ba9\u0bcd" } - fi { "\u0baa\u0bbf\u0ba9\u0bcd\u0bb7\u0bcd" } - fj { "\u0baa\u0bbf\u0b9c\u0bbf" } - fo { "\u0baa\u0bc8\u0bb0\u0bcb\u0bb8\u0bbf" } - fr { "\u0baa\u0bbf\u0bb0\u0ba9\u0bcd\u0b9a\u0bcd" } - fy { "\u0baa\u0bbf\u0bb0\u0bbf\u0bb7\u0bbf\u0baf\u0ba9\u0bcd" } - ga { "\u0b90\u0bb0\u0bbf\u0bb7\u0bcd" } - gd { "\u0bb8\u0bcd\u0b95\u0bbe\u0b9f\u0bcd\u0bb8\u0bcd \u0b95\u0bbe\u0bb2\u0bc6\u0b95\u0bcd" } - gl { "\u0b95\u0bc6\u0bb2\u0bbf\u0bb8\u0bbf\u0baf\u0ba9\u0bcd" } - gn { "\u0b95\u0bc1\u0bb0\u0bbe\u0ba9\u0bbf" } - gu { "\u0b95\u0bc1\u0b9c\u0bb0\u0bbe\u0ba4\u0bcd\u0ba4\u0bbf" } - ha { "\u0bb9\u0bca\u0bb8\u0bbe" } - he { "\u0bb9\u0bc1\u0baa\u0bcd\u0bb0\u0bc1" } - hi { "\u0b87\u0ba8\u0bcd\u0ba4\u0bbf" } - hr { "\u0b95\u0bb0\u0bcb\u0bb7\u0bbf\u0baf\u0ba9\u0bcd" } - hu { "\u0bb9\u0b99\u0bcd\u0b95\u0bc7\u0bb0\u0bbf\u0baf\u0ba9\u0bcd" } - hy { "\u0b86\u0bb0\u0bcd\u0bae\u0bc7\u0ba9\u0bbf\u0baf\u0ba9\u0bcd" } - ia { "\u0b87\u0ba9\u0bcd\u0b9f\u0bb0\u0bcd\u0bb2\u0bbf\u0b99\u0bcd\u0b95\u0bc1\u0bb5\u0bbe" } - id { "\u0b87\u0ba8\u0bcd\u0ba4\u0bcb\u0ba9\u0bc7\u0bb7\u0bbf\u0baf\u0ba9\u0bcd" } - ie { "\u0b87\u0ba9\u0bcd\u0b9f\u0bb0\u0bcd\u0bb2\u0bbf\u0b99\u0bcd\u0b95\u0bc1\u0bb5\u0bbe" } - ik { "\u0b87\u0ba9\u0bc1\u0baa\u0bc6\u0b95\u0bcd" } - is { "\u0b90\u0bb8\u0bcd\u0bb2\u0bc6\u0ba9\u0bcd\u0b9f\u0bbf\u0b95\u0bcd" } - it { "\u0b87\u0ba4\u0bcd\u0ba4\u0bbe\u0bb2\u0bbf\u0baf\u0ba9\u0bcd" } - iu { "\u0b87\u0ba9\u0bc1\u0b95\u0bbf\u0b9f\u0b9f\u0bcd" } - ja { "\u0b9c\u0bbe\u0baa\u0ba9\u0bc0\u0bb8\u0bcd" } - jv { "\u0b9c\u0bbe\u0bb5\u0bbe\u0ba9\u0bc0\u0bb8\u0bcd" } - //jw { "\u0b9c\u0bbe\u0bb5\u0bbe\u0ba9\u0bc0\u0bb8\u0bcd" } // Use jv instead - ka { "\u0b9c\u0bbe\u0bb0\u0bcd\u0b9c\u0bbf\u0baf\u0ba9\u0bcd" } - kk { "\u0b95\u0b9a\u0bbe\u0b95\u0bcd" } - kl { "\u0b95\u0bbf\u0bb0\u0bbf\u0ba9\u0bcd\u0bb2\u0bc6\u0ba9\u0bcd\u0b9f\u0bbf\u0b95\u0bcd" } - km { "\u0b95\u0bae\u0bcd\u0baa\u0bcb\u0b9f\u0bbf\u0baf\u0ba9\u0bcd" } - kn { "\u0b95\u0ba9\u0bcd\u0ba9\u0b9f\u0bbe" } - ko { "\u0b95\u0bca\u0bb0\u0bbf\u0baf\u0ba9\u0bcd" } - kok { "\u0b95\u0bcb\u0b99\u0bcd\u0b95\u0bcd\u0b95\u0ba9\u0bbf" } - ks { "\u0b95\u0bbe\u0bb7\u0bcd\u0bae\u0bbf\u0bb0\u0bbf" } - ku { "\u0b95\u0bc1\u0bb0\u0bcd\u0ba4\u0bbf\u0bb7\u0bcd" } - ky { "\u0b95\u0bbf\u0bb0\u0bcd\u0b95\u0bbf\u0bb7\u0bcd" } - la { "\u0bb2\u0bbe\u0ba4\u0bbf\u0ba9\u0bcd" } - ln { "\u0bb2\u0bbf\u0b99\u0bcd\u0b95\u0bbe\u0bb2\u0bbe" } - lo { "\u0bb2\u0bcb\u0ba4\u0bcd\u0ba4\u0bbf\u0baf\u0ba9\u0bcd" } - lt { "\u0bb2\u0bc1\u0ba4\u0bcd\u0ba4\u0bc7\u0ba9\u0bbf\u0baf\u0ba9\u0bcd" } - lv { "\u0bb2\u0bc7\u0b9f\u0bcd\u0bb5\u0bbf\u0baf\u0ba9\u0bcd (\u0bb2\u0bc7\u0b9f\u0bcd\u0b9f\u0bbf\u0bb7\u0bcd)" } - mg { "\u0bae\u0bb2\u0b95\u0bc6\u0bb8\u0bbf" } - mi { "\u0bae\u0bcb\u0bb0\u0bbf" } - mk { "\u0bae\u0bc6\u0b95\u0bcd\u0b95\u0b9f\u0bcb\u0ba9\u0bbf\u0baf\u0ba9\u0bcd" } - ml { "\u0bae\u0bb2\u0baf\u0bbe\u0bb4\u0bae\u0bcd" } - mn { "\u0bae\u0b99\u0bcd\u0b95\u0bcb\u0bb2\u0bbf\u0baf\u0ba9\u0bcd" } - mo { "\u0bae\u0bcb\u0bb2\u0bcd\u0b9f\u0bc7\u0bb5\u0bbf\u0baf\u0ba9\u0bcd" } - mr { "\u0bae\u0bb0\u0bbe\u0ba4\u0bcd\u0ba4\u0bbf" } - ms { "\u0bae\u0bb2\u0bbe\u0baf\u0bcd" } - mt { "\u0bae\u0bbe\u0bb2\u0bcd\u0b9f\u0bbf\u0bb8\u0bcd" } - my { "\u0baa\u0bb0\u0bcd\u0bae\u0bbf\u0bb8\u0bcd" } - na { "\u0ba8\u0bbe\u0bb0\u0bc2" } - ne { "\u0ba8\u0bc7\u0baa\u0bcd\u0baa\u0bbe\u0bb2\u0bbf" } - nl { "\u0b9f\u0b9a\u0bcd" } - no { "\u0ba8\u0bbe\u0bb0\u0bcd\u0bb5\u0bc7\u0b95\u0bbf\u0baf\u0ba9\u0bcd" } - oc { "\u0b86\u0b95\u0bbf\u0b9f\u0bbf\u0baf\u0ba9\u0bcd" } - om { "\u0b92\u0bb0\u0bcb\u0bae (\u0b85\u0baa\u0ba9\u0bcd)" } - or { "\u0b92\u0bb0\u0bbf\u0baf\u0bbe" } - pa { "\u0baa\u0b9e\u0bcd\u0b9a\u0bbe\u0baa\u0bbf" } - pl { "\u0baa\u0bcb\u0bb2\u0bbf\u0bb7\u0bcd" } - ps { "\u0baa\u0bc7\u0bb7\u0bcd\u0b9f\u0bcb (\u0baa\u0bc1\u0bb7\u0bcd\u0b9f\u0bcb)" } - pt { "\u0baa\u0bcb\u0bb0\u0bcd\u0b9a\u0bcd\u0b9a\u0bbf\u0b95\u0bc0\u0bb8\u0bcd" } - qu { "\u0b95\u0bbf\u0baf\u0bc1\u0b9a\u0bbeQuechua" } - rm { "\u0bb0\u0bc8\u0b9f\u0bcd\u0b9f\u0bcb-\u0bb0\u0bcb\u0bae\u0bc6\u0ba9\u0bcd\u0bb8\u0bcd" } - rn { "\u0b95\u0bbf\u0bb0\u0bc1\u0ba8\u0bcd\u0ba4\u0bbf" } - ro { "\u0bb0\u0bcb\u0bae\u0bc7\u0ba9\u0bbf\u0baf\u0ba9\u0bcd" } - ru { "\u0bb0\u0bb7\u0bbf\u0baf\u0ba9\u0bcd" } - rw { "\u0b95\u0bbf\u0ba9\u0bcd\u0baf\u0bb0\u0bcd\u0bb5\u0bc6\u0ba9\u0bcd\u0b9f\u0bbe" } - sa { "\u0b9a\u0bae\u0bb8\u0bcd\u0b95\u0bbf\u0bb0\u0bbf\u0ba4\u0bae\u0bcd" } - sd { "\u0b9a\u0bbf\u0ba8\u0bcd\u0ba4\u0bbf" } - sg { "\u0b9a\u0bc6\u0ba9\u0bcd\u0b95\u0bcd\u0bb0\u0bcb" } - sh { "\u0b9a\u0bc6\u0bb0\u0bcd\u0baa\u0bcb-\u0b95\u0bcd\u0bb0\u0bcb\u0bb7\u0bbf\u0baf\u0ba9\u0bcd" } - si { "\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0bb3\u0bbf\u0bb8\u0bcd" } - sk { "\u0bb8\u0bcd\u0bb2\u0bcb\u0bb5\u0bc6\u0b95\u0bcd" } - sl { "\u0bb8\u0bcd\u0bb2\u0bcb\u0bb5\u0bbf\u0ba9\u0bc7\u0baf\u0bbf\u0ba9\u0bcd" } - sm { "\u0bb8\u0bc6\u0bae\u0bcb\u0ba9\u0bcd" } - sn { "\u0bb7\u0bcb\u0ba9\u0bbe" } - so { "\u0b9a\u0bcb\u0bae\u0bbe\u0bb2\u0bbf" } - sq { "\u0b85\u0bb2\u0bcd\u0baa\u0bc6\u0ba9\u0bbf\u0baf\u0ba9\u0bcd" } - sr { "\u0b9a\u0bb0\u0bcd\u0baa\u0bbf\u0baf\u0ba9\u0bcd" } - ss { "\u0bb7\u0bbf\u0bb8\u0bcd\u0bb5\u0bbe\u0ba4\u0bbf" } - st { "\u0bb7\u0bc6\u0bb8\u0bcd\u0bb8\u0bcb\u0ba4\u0bcb" } - su { "\u0b9a\u0bc1\u0b9f\u0bbe\u0ba9\u0bc0\u0bb8\u0bcd" } - sv { "\u0bb7\u0bc0\u0bb5\u0bbf\u0b9f\u0bbf\u0bb8\u0bcd" } - sw { "\u0bb8\u0bcd\u0bb5\u0bc6\u0bb9\u0bbf\u0bb2\u0bbf" } - ta { "\u0ba4\u0bae\u0bbf\u0bb4\u0bcd" } - te { "\u0ba4\u0bc6\u0bb2\u0bc1\u0b99\u0bcd\u0b95\u0bc1" } - tg { "\u0ba4\u0bbe\u0b9c\u0bbf\u0b95\u0bcd" } - th { "\u0ba4\u0bbe\u0baf\u0bcd" } - ti { "\u0b9f\u0bbf\u0b95\u0bcd\u0bb0\u0bbf\u0ba9\u0bcd\u0baf\u0bbe" } - tk { "\u0b9f\u0bb0\u0bcd\u0b95\u0bcd\u0bae\u0bc6\u0ba9\u0bcd" } - tl { "\u0b9f\u0bbe\u0b95\u0bbe\u0bb2\u0bcb\u0b95\u0bcd" } - tn { "\u0bb8\u0bc6\u0b9f\u0bcd\u0bb8\u0bcd\u0bb5\u0bbe\u0ba9\u0bbe" } - to { "\u0b9f\u0bcb\u0b99\u0bcd\u0b95\u0bbe" } - tr { "\u0b9f\u0bb0\u0bcd\u0b95\u0bbf\u0bb7\u0bcd" } - ts { "\u0bb8\u0bcb\u0b99\u0bcd\u0b95\u0bbe" } - tt { "\u0b9f\u0bbe\u0b9f\u0bb0\u0bcd" } - tw { "\u0ba4\u0bcd\u0ba4\u0bbf\u0bb5\u0bbf" } - ug { "\u0baf\u0bc1\u0b95\u0bc1\u0bb0\u0bcd" } - uk { "\u0b89\u0b95\u0bcd\u0bb0\u0bc7\u0ba9\u0bbf\u0baf\u0ba9\u0bcd" } - ur { "\u0b89\u0bb0\u0bc1\u0ba4\u0bc1" } - uz { "\u0b89\u0bb8\u0bcd\u0baa\u0bc6\u0b95\u0bcd" } - vi { "\u0bb5\u0bbf\u0baf\u0b9f\u0bcd\u0ba8\u0bbe\u0bae\u0bbf\u0bb8\u0bcd" } - vo { "\u0b92\u0bb2\u0baa\u0bc1\u0b95\u0bcdVolapuk" } - wo { "\u0b92\u0bb2\u0bcb\u0baa\u0bcdWolof" } - xh { "\u0bb9\u0bcb\u0bb7\u0bbeXhosa" } - yi { "\u0b88\u0ba4\u0bcd\u0ba4\u0bbf\u0bb7" } - yo { "\u0baf\u0bcb\u0bb0\u0bc1\u0baa\u0bcd\u0baa\u0bbe" } - za { "\u0b9c\u0bc1\u0bb5\u0bbe\u0b99\u0bcd" } - zh { "\u0b9a\u0baf\u0ba9\u0bc0\u0bb8\u0bcd" } - zu { "\u0b9c\u0bc2\u0bb2\u0bc2" } - } - - Countries { - IN { "\u0b87\u0ba8\u0bcd\u0ba4\u0bbf\u0baf\u0bbe" } - } - MonthNames { - "\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf", - "\u0baa\u0bc6\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf", - "\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd", - "\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd", - "\u0bae\u0bc7", - "\u0b9c\u0bc2\u0ba9\u0bcd", - "\u0b9c\u0bc2\u0bb2\u0bc8", - "\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd", - "\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bae\u0bcd\u0baa\u0bb0\u0bcd", - "\u0b85\u0b95\u0bcd\u0b9f\u0bcb\u0baa\u0bb0\u0bcd", - "\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd", - "\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd", - } - MonthAbbreviations { - "\u0b9c\u0ba9.", - "\u0baa\u0bc6\u0baa\u0bcd.", - "\u0bae\u0bbe\u0bb0\u0bcd.", - "\u0b8f\u0baa\u0bcd.", - "\u0bae\u0bc7", - "\u0b9c\u0bc2\u0ba9\u0bcd", - "\u0b9c\u0bc2\u0bb2\u0bc8", - "\u0b86\u0b95.", - "\u0b9a\u0bc6\u0baa\u0bcd.", - "\u0b85\u0b95\u0bcd.", - "\u0ba8\u0bb5.", - "\u0b9f\u0bbf\u0b9a.", - } - DayNames { - "\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bc1", - "\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0bb3\u0bcd", - "\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd", - "\u0baa\u0bc1\u0ba4\u0ba9\u0bcd", - "\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0ba9\u0bcd", - "\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf", - "\u0b9a\u0ba9\u0bbf", - } - DayAbbreviations - { - "\u0b9e\u0bbe", - "\u0ba4\u0bbf", - "\u0b9a\u0bc6", - "\u0baa\u0bc1", - "\u0bb5\u0bbf", - "\u0bb5\u0bc6", - "\u0b9a", - } - - AmPmMarkers { - "\u0b95\u0bbe\u0bb2\u0bc8", - "\u0bae\u0bbe\u0bb2\u0bc8" - } - - Eras { - "\u0b95\u0bbf\u0bae\u0bc1", - "\u0b95\u0bbf\u0baa\u0bbf", - } - -// NumberElements { -// ".", -// ",", -// ";", -// "%", -// "0", -// "#", -// "-", -// "E", -// "\u2030", -// "\u221e", -// "\ufffd" -// } - - NumberPatterns { - "#,##,##0.###;-#,##,##0.###", - "\u00A4 #,##,##0.00;-\u00A4 #,##,##0.00", - "#,##,##0%", - "#E0", - } - - zoneStrings { - { - "Asia/Calcutta", - "\u0b87\u0ba8\u0bcd\u0ba4\u0bbf\u0baf \u0ba8\u0bc7\u0bb0\u0baa\u0bcd\u0baa\u0b9f\u0bbf", - "IST", - "\u0b87\u0ba8\u0bcd\u0ba4\u0bbf\u0baf \u0ba8\u0bc7\u0bb0\u0baa\u0bcd\u0baa\u0b9f\u0bbf", - "IST" - } - } - - CollationElements { - Version { "1.0" } - Sequence { "[normalization on]" } - } - LocaleID:int { 0x49 } - LocaleScript:array { - "Taml" // ISO 15924 Name - } - ExemplarCharacters{"[[:Taml:]\u200c\u200d]"} - - // Currency display names - Currencies { - INR { "\u0BB0\u0BC2", "INR" } - } -} - +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ta.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/ta.xml + */ +ta{ + Countries{ + AD{"அன்டோரா"} + AE{"ஐக்கிய அரபு கூட்டாட்சி"} + AF{"ஆப்கானிஸ்தான்"} + AG{"ஆன்டிகுவா பார்புடா"} + AL{"அல்பேனியா"} + AM{"ஆர்மீனியா"} + AO{"அங்கோலா"} + AR{"அர்ஜெண்டினா"} + AT{"ஆஸ்திரியா"} + AU{"ஆஸ்திரேலியா"} + AZ{"அஜர்பைஜான்"} + BA{"போஸ்னியா ஹெர்ஸிகோவினா"} + BB{"பார்படோஸ்"} + BD{"பங்களாதேஷ்"} + BE{"பெல்ஜியம்"} + BF{"பர்கினோ பாஸோ"} + BG{"பல்கேரியா"} + BH{"பஹ்ரைன்"} + BI{"புருண்டி"} + BJ{"பெனின்"} + BN{"புரூனேய்"} + BO{"பொலிவியா"} + BR{"பிரேஸில்"} + BS{"பஹாமாஸ்"} + BT{"பூடான்"} + BW{"போட்ஸ்வானா"} + BY{"பெலாரூஸ்"} + BZ{"பெலிஸ்"} + CA{"கனடா"} + CF{"மத்திய ஆப்ரிக்கக் குடியரசு"} + CG{"காங்கோ"} + CH{"ஸ்விட்சர்லாந்து"} + CI{"ஐவரி கோஸ்ட்"} + CL{"சிலி"} + CM{"கேமரூன்"} + CN{"சீன"} + CO{"கொலம்பியா"} + CR{"கோஸ்டாரிகா"} + CU{"கியூபா"} + CV{"கேப் வெர்டே"} + CY{"சைப்ரஸ்"} + CZ{"செக் குடியரசு"} + DE{"ஜெர்மன்"} + DJ{"ஜிபௌடி"} + DK{"டென்மார்க்"} + DM{"டொமினிகா"} + DO{"டொமினிகன் குடியரசு"} + DZ{"அல்ஜீரியா"} + EC{"ஈக்வடார்"} + EE{"எஸ்டோனியா"} + EG{"எகிப்து"} + ES{"ஸ்பெயின்"} + ET{"எதியோப்பியா"} + FI{"பின்லாந்து"} + FJ{"பிஜி"} + FR{"பிரான்ஸ்"} + GA{"காபோன்"} + GB{"பிரிடிஷ் கூட்டரசு"} + GD{"கிரனெடா"} + GE{"ஜார்ஜியா"} + GH{"கானா"} + GM{"காம்பியா"} + GN{"கினி"} + GQ{"ஈக்குவிடோரியல் கினி"} + GR{"கிரீஸ்"} + GT{"குவாத்தாமாலா"} + GW{"கினி-பிஸ்ஸாவ்"} + GY{"கயானா"} + HN{"ஹாண்டுராஸ்"} + HR{"குரோசியா"} + HT{"ஹெய்தி"} + HU{"ஹங்கேரி"} + ID{"இந்தோனேஷியா"} + IE{"அயர்லாந்து"} + IL{"இஸ்ரேல்"} + IN{"இந்தியா"} + IQ{"இராக்"} + IR{"ஈரான்"} + IS{"ஐஸ்லாந்து"} + IT{"இத்தாலி"} + JM{"ஜமாய்க்கா"} + JO{"ஜொர்டான்"} + JP{"ஜப்பான்"} + KE{"கென்யா"} + KG{"கிர்கிஸ்தான்"} + KH{"கம்போடியா"} + KI{"கிரிபடி"} + KM{"கோமரோஸ்"} + KP{"வட கொரியா"} + KR{"தென் கொரியா"} + KW{"குவைத்து"} + KZ{"கஜகஸ்தான்"} + LA{"லாவோஸ்"} + LB{"லெபனான்"} + LI{"லிச்டெண்ஸ்டீன்"} + LK{"இலங்கை"} + LR{"லைபீரியா"} + LS{"லெசோதோ"} + LT{"லிதுவேனியா"} + LU{"லக்ஸ்சம்பர்க்"} + LV{"லாட்வியா"} + LY{"லிப்யா"} + MA{"மொரோக்கோ"} + MC{"மொனாக்கோ"} + MD{"மால்டோவா"} + MK{"மசெடோணியா"} + ML{"மாலீ"} + MM{"மியான்மார்"} + MN{"மங்கோலியா"} + MT{"மால்டா"} + MV{"மாலத்தீவு"} + MW{"மலாவீ"} + MX{"மெக்சிகோ"} + MY{"மலேஷியா"} + NA{"னாமீபியா"} + NI{"நிகாராகுவா"} + NL{"நெதர்லாந்து"} + NO{"நார்வே"} + NP{"நேபாளம்"} + NR{"நௌரு"} + NZ{"நியூசிலாந்து"} + OM{"ஓமான்"} + PA{"பணாமா"} + PE{"பெரு"} + PG{"பாப்புவா-நியூகினி"} + PH{"பிலிப்பைன்ஸ்"} + PK{"பாகிஸ்தான்"} + PL{"போலந்து"} + PT{"போர்ச்சுக்கல்"} + PY{"பாரகுவே"} + QA{"காடார்"} + RO{"ருமேனியா"} + RU{"ரஷ்யா"} + SA{"சவூதி அரேபியா"} + SB{"சாலமன் தீவுகள்"} + SE{"ஸ்வீடன்"} + SG{"சிங்கப்பூர்"} + SI{"ஸ்லோவேனியா"} + SK{"ஸ்லோவாகியா"} + SM{"சான்மெரினோ"} + SR{"சூரினாம்"} + SV{"எல் சால்வடார்"} + SY{"சிரியா"} + TD{"சாட்"} + TH{"தாய்லாந்து"} + TJ{"தாஜிகிஸ்தான்"} + TM{"துர்க்மெனிஸ்தான்"} + TN{"துனிசியா"} + TO{"தொங்கா"} + TR{"துருக்கி"} + TT{"திரினிடாட் தொபாகோ"} + TV{"துவாலூ"} + TW{"தைவான்"} + UA{"உக்ரைன்"} + US{"ஐக்கிய அமெரிக்கா குடியரசு"} + UY{"உருகுவே"} + UZ{"உஸ்பெகிஸ்தான்"} + VA{"வாடிகன்"} + VE{"வெனஜுவேலா"} + VN{"வியட்நாம்"} + VU{"வனுவாட்டு"} + WS{"சமோவா"} + YE{"யேமன்"} + ZA{"தென் ஆப்ரிக்கா"} + ZW{"ஜிம்பாப்வே"} + } + Currencies{ + INR{ + "ரூ", + "INR", + } + } + ExemplarCharacters{"[ஂ-ஃஅ-ஊஎ-ஐஒ-கங-சஜஞ-டண-தந-பம-வஷ-ஹா-ூெ-ைொ-்]"} + Languages{ + aa{"அபார்"} + ab{"அப்காஸின்"} + af{"ஆப்ரிகன்ஸ்"} + am{"அம்ஹாரிக்"} + ar{"அரபு"} + as{"அஸ்ஸாமி"} + ay{"அயமரா"} + az{"அசர்பாய்ஜானி"} + ba{"பாஷ்கிர்0"} + be{"பைலோருஷ்ன்"} + bg{"பல்கேரியன்"} + bh{"பிஹாரி"} + bi{"பிஸ்லாமா"} + bn{"வங்காளம்"} + bo{"திபெத்து"} + br{"பிரிடன்"} + ca{"காடலான்"} + co{"கார்சியன்"} + cs{"செக்"} + cy{"வெல்ஷ்"} + da{"டானிஷ்"} + de{"ஜெர்மன்"} + dz{"புடானி"} + el{"கிரேக்கம்"} + en{"ஆங்கிலம்"} + eo{"எஸ்பரேன்டோ"} + es{"ஸ்பேனிஷ்"} + et{"எஸ்டோனியன்"} + eu{"பஸ்க்"} + fa{"பர்ஸியன்"} + fi{"பின்னிஷ்"} + fj{"பிஜி"} + fo{"பைரோஸி"} + fr{"பிரெஞ்சு"} + fy{"பிரிஷியன்"} + ga{"ஐரிஷ்"} + gd{"ஸ்காட்ஸ் காலெக்"} + gl{"கெலிஸியன்"} + gn{"குரானி"} + gu{"குஜராத்தி"} + ha{"ஹொஸா"} + he{"ஹுப்ரு"} + hi{"இந்தி"} + hr{"கரோஷியன்"} + hu{"ஹங்கேரியன்"} + hy{"ஆர்மேனியன்"} + ia{"இன்டர்லிங்குவா"} + id{"இந்தோனேஷியன்"} + ie{"இன்டர்லிங்குவா"} + ik{"இனுபெக்"} + is{"ஐஸ்லென்டிக்"} + it{"இத்தாலியன்"} + iu{"இனுகிடட்"} + ja{"ஜப்பானீஸ்"} + jv{"ஜாவானீஸ்"} + ka{"கன்னடம்"} + kk{"கசாக்"} + kl{"கிரின்லென்டிக்"} + km{"கம்போடியன்"} + kn{"கன்னடா"} + ko{"கொரியன்"} + kok{"கொங்கனி"} + ks{"காஷ்மிரி"} + ku{"குர்திஷ்"} + ky{"கிர்கிஷ்"} + la{"லாதின்"} + ln{"லிங்காலா"} + lo{"லோத்தியன்"} + lt{"லுத்தேனியன்"} + lv{"லேட்வியன் (லேட்டிஷ்)"} + mg{"மலகெஸி"} + mi{"மோரி"} + mk{"மெக்கடோனியன்"} + ml{"மலையாளம்"} + mn{"மங்கோலியன்"} + mo{"மோல்டேவியன்"} + mr{"மராத்தி"} + ms{"மலாய்"} + mt{"மால்டிஸ்"} + my{"பர்மிஸ்"} + na{"நாரூ"} + ne{"நேப்பாலி"} + nl{"டச்சு"} + no{"நார்வேகியன்"} + oc{"ஆகிடியன்"} + om{"ஒரோம (அபன்)"} + or{"ஒரியா"} + pa{"பஞ்சாபி"} + pl{"போலிஷ்"} + ps{"பேஷ்டோ (புஷ்டோ)"} + pt{"போர்த்துகீஸ்"} + qu{"கியுசா"} + rm{"ரைட்டோ-ரோமென்ஸ்"} + rn{"கிருந்தி"} + ro{"ரோமேனியன்"} + root{"தமிழ்"} + ru{"ரஷியன்"} + rw{"கின்யர்வென்டா"} + sa{"சமஸ்கிருதம்"} + sd{"சிந்தி"} + sg{"சென்க்ரோ"} + sh{"செர்போ-க்ரோஷியன்"} + si{"சிங்களம்"} + sk{"ஸ்லோவெக்"} + sl{"ஸ்லோவினேயின்"} + sm{"ஸெமோன்"} + sn{"ஷோனா"} + so{"சோமாலி"} + sq{"அல்பெனியன்"} + sr{"சர்பியன்"} + ss{"ஷிஸ்வாதி"} + st{"ஷெஸ்ஸோதோ"} + su{"சுடானீஸ்"} + sv{"ஷீவிடிஸ்"} + sw{"சுவாஹிலி"} + ta{"தமிழ்"} + te{"தெலுங்கு"} + tg{"தாஜிக்"} + th{"தாய்"} + ti{"டிக்ரின்யா"} + tk{"டர்க்மென்"} + tl{"டாகாலோக்"} + tn{"ஸெட்ஸ்வானா"} + to{"டோங்கா"} + tr{"டர்கிஷ்"} + ts{"ஸோங்கா"} + tt{"டாடர்"} + tw{"த்திவி"} + ug{"யுகுர்"} + uk{"உக்ரேனியன்"} + ur{"உருது"} + uz{"உஸ்பெக்"} + vi{"வியட்நாமிஸ்"} + vo{"ஒலபுக்"} + wo{"ஒலோப்"} + xh{"ஹோஷா"} + yi{"ஈத்திஷ"} + yo{"யோருப்பா"} + za{"ஜுவாங்"} + zh{"சீனம்"} + zu{"ஜூலூ"} + } + LocaleScript{ + "Taml", + } + NumberPatterns{ + "#,##,##0.###;-#,##,##0.###", + "¤ #,##,##0.00;-¤ #,##,##0.00", + "#,##,##0%", + "#E0", + } + Version{"1.2"} + calendar{ + gregorian{ + AmPmMarkers{ + "காலை", + "மாலை", + } + dayNames{ + format{ + abbreviated{ + "ஞா", + "தி", + "செ", + "பு", + "வி", + "வெ", + "ச", + } + wide{ + "ஞாயிறு", + "திங்கள்", + "செவ்வாய்", + "புதன்", + "வியாழன்", + "வெள்ளி", + "சனி", + } + } + } + eras{ + abbreviated{ + "கிமு", + "கிபி", + } + } + monthNames{ + format{ + abbreviated{ + "ஜன.", + "பிப்.", + "மார்.", + "ஏப்.", + "மே", + "ஜூன்", + "ஜூலை", + "ஆக.", + "செப்.", + "அக்.", + "நவ.", + "டிச.", + } + wide{ + "ஜனவரி", + "பிப்ரவரி", + "மார்ச்", + "ஏப்ரல்", + "மே", + "ஜூன்", + "ஜூலை", + "ஆகஸ்ட்", + "செப்டம்பர்", + "அக்டோபர்", + "நவம்பர்", + "டிசம்பர்", + } + } + } + } + } + zoneStrings{ + { + "Asia/Calcutta", + "இந்திய நேரப்படி", + "IST", + "இந்திய நேரப்படி", + "IST", + } + } +} diff --git a/icuSources/data/locales/ta_IN.txt b/icuSources/data/locales/ta_IN.txt index c1cfe109..da8b1433 100644 --- a/icuSources/data/locales/ta_IN.txt +++ b/icuSources/data/locales/ta_IN.txt @@ -1,38 +1,42 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ta_IN.xml // * // *************************************************************************** - -// Tamil locale. Based on Hindi locale - -ta_IN { - Version { "2.0" } - LocaleID:int { 0x449 } -// ShortCountry { IND } - - NumberPatterns { +ta_IN{ + NumberPatterns{ "##,##,##0.###;-##,##,##0.###", - "\u00A4 ##,##,##0.00;-\u00A4 ##,##,##0.00", + "¤ ##,##,##0.00;-¤ ##,##,##0.00", "##,##,##0%", "#E0", } -// LocaleString { "ta_IN" } - DateTimePatterns { - "h:mm:ss a z", - "h:mm:ss a z", - "h:mm:ss a", - "h:mm a", - "EEEE d MMMM yyyy", - "d MMMM yyyy", - "dd-MM-yyyy", - "d-M-yy", - "{1} {0}" + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "h:mm:ss a z", + "h:mm:ss a z", + "h:mm:ss a", + "h:mm a", + "EEEE d MMMM yyyy", + "d MMMM yyyy", + "dd-MM-yyyy", + "d-M-yy", + "{1} {0}", + } + weekend:intvector{ + 1, + 0, + 1, + 86400000, + } + } } -// DateTimeElements { -// "1", -// "1" -// } - -} \ No newline at end of file +} diff --git a/icuSources/data/locales/te.txt b/icuSources/data/locales/te.txt index c68fab93..54dfe1f8 100644 --- a/icuSources/data/locales/te.txt +++ b/icuSources/data/locales/te.txt @@ -1,96 +1,106 @@ -// *************************************************************************** -// * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** -// -// Telugu Locale. Data by Ram [ram@jtcsv.com] - -te { - Version{ "2.0" } - Countries { - IN { "\u0c2d\u0c3e\u0c30\u0c24 \u0c26\u0c46\u0c33\u0c66" } - } - Languages { - te { "\u0c24\u0c46\u0c32\u0c41\u0c17\u0c41" } - } - DayAbbreviations { - "\u0c06\u0c26\u0c3f", - "\u0c38\u0c4b\u0c2e", - "\u0c2e\u0c02\u0c17\u0c33", - "\u0c2c\u0c41\u0c27", - "\u0c17\u0c41\u0c30\u0c41", - "\u0c36\u0c41\u0c15\u0c4d\u0c30", - "\u0c36\u0c28\u0c3f", - } - DayNames { - "\u0c06\u0c26\u0c3f\u0c35\u0c3e\u0c30\u0c02", - "\u0c38\u0c4b\u0c2e\u0c35\u0c3e\u0c30\u0c02", - "\u0c2e\u0c02\u0c17\u0c33\u0c35\u0c3e\u0c30\u0c02", - "\u0c2c\u0c41\u0c27\u0c35\u0c3e\u0c30\u0c02", - "\u0c17\u0c41\u0c30\u0c41\u0c35\u0c3e\u0c30\u0c02", - "\u0c36\u0c41\u0c15\u0c4d\u0c30\u0c35\u0c3e\u0c30\u0c02", - "\u0c36\u0c28\u0c3f\u0c35\u0c3e\u0c30\u0c02", - } - MonthAbbreviations { - "\u0c1c\u0c28\u0c35\u0c30\u0c3f", - "\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f", - "\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f", - "\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d", - "\u0c2e\u0c47", - "\u0c1c\u0c42\u0c28\u0c4d", - "\u0c1c\u0c42\u0c32\u0c48", - "\u0c06\u0c17\u0c38\u0c4d\u0c1f\u0c41", - "\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c4d", - "\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c4d", - "\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c4d", - "\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c4d", - } - MonthNames { - "\u0c1c\u0c28\u0c35\u0c30\u0c3f", - "\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f", - "\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f", - "\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d", - "\u0c2e\u0c47", - "\u0c1c\u0c42\u0c28\u0c4d", - "\u0c1c\u0c42\u0c32\u0c48", - "\u0c06\u0c17\u0c38\u0c4d\u0c1f\u0c41", - "\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c4d", - "\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c4d", - "\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c4d", - "\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c4d", - } - -// NumberElements { -// ".", -// ",", -// ";", -// "%", -// "0", -// "#", -// "-", -// "E", -// "\u2030", -// "\u221e", -// "\ufffd", -// } - LocaleID:int { 0x4a } - CollationElements { - Version { "1.0" } - Sequence { "[normalization on]" } - } - LocaleScript{ - "Telu", // ISO 15924 Name - } - ExemplarCharacters{"[[:Telu:]\u200c\u200d]"} - // /**************** Info Below is needed ****************/ - // Eras{} - // localPatternChars{} - // - - // Currency display names - Currencies { - INR { "\u0C30\u0C42.", "INR" } - } -} \ No newline at end of file +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/te.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/te.xml + */ +te{ + Countries{ + IN{"భారత దేళ౦"} + } + Currencies{ + INR{ + "రూ.", + "INR", + } + } + ExemplarCharacters{"[[:Telu:]‌‍]"} + Languages{ + te{"తెలుగు"} + } + LocaleScript{ + "Telu", + } + NumberElements{ + ".", + ",", + ";", + "%", + "౦", + "#", + "-", + "E", + "‰", + "∞", + "�", + "+", + } + Version{"1.2"} + calendar{ + gregorian{ + AmPmMarkers{ + "పూర్వాహ్న", + "అపరాహ్న", + } + dayNames{ + format{ + abbreviated{ + "ఆది", + "సోమ", + "మంగళ", + "బుధ", + "గురు", + "శుక్ర", + "శని", + } + wide{ + "ఆదివారం", + "సోమవారం", + "మంగళవారం", + "బుధవారం", + "గురువారం", + "శుక్రవారం", + "శనివారం", + } + } + } + monthNames{ + format{ + abbreviated{ + "జనవరి", + "ఫిబ్రవరి", + "మార్చి", + "ఏప్రిల్", + "మే", + "జూన్", + "జూలై", + "ఆగస్టు", + "సెప్టెంబర్", + "అక్టోబర్", + "నవంబర్", + "డిసెంబర్", + } + wide{ + "జనవరి", + "ఫిబ్రవరి", + "మార్చి", + "ఏప్రిల్", + "మే", + "జూన్", + "జూలై", + "ఆగస్టు", + "సెప్టెంబర్", + "అక్టోబర్", + "నవంబర్", + "డిసెంబర్", + } + } + } + } + } +} diff --git a/icuSources/data/locales/te_IN.txt b/icuSources/data/locales/te_IN.txt index 14fa6d06..646c6cfc 100644 --- a/icuSources/data/locales/te_IN.txt +++ b/icuSources/data/locales/te_IN.txt @@ -1,44 +1,42 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/te_IN.xml // * // *************************************************************************** -// -// Telugu Locale. Data by Ram [ram@jtcsv.com] - -te_IN { - Version{ "2.0" } - AmPmMarkers { - "\u0c2a\u0c42\u0c30\u0c4d\u0c35\u0c3e\u0c39\u0c4d\u0c28", - "\u0c05\u0c2a\u0c30\u0c3e\u0c39\u0c4d\u0c28", - } - DateTimePatterns { - "h:mm:ss a z", - "h:mm:ss a z", - "h:mm:ss a", - "h:mm a", - "EEEE d MMMM yyyy", - "d MMMM yyyy", - "dd-MM-yyyy", - "dd-MM-yy", - "{1} {0}", - } - - // LanguageLibraryUse { "Te" } - // Measurement { "Metric" } - NumberPatterns { +te_IN{ + NumberPatterns{ "##,##,##0.###;-##,##,##0.###", - "\u00A4 ##,##,##0.00;-\u00A4 ##,##,##0.00", + "¤ ##,##,##0.00;-¤ ##,##,##0.00", "##,##,##0%", "#E0", } -// ShortLanguage { "tel" } - //PaperSize { - // Height { "297" } - // Width { "210" } - // Units { "mm" } - //} - LocaleID:int { 0x44a } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "h:mm:ss a z", + "h:mm:ss a z", + "h:mm:ss a", + "h:mm a", + "EEEE d MMMM yyyy", + "d MMMM yyyy", + "dd-MM-yyyy", + "dd-MM-yy", + "{1} {0}", + } + weekend:intvector{ + 1, + 0, + 1, + 86400000, + } + } + } } - diff --git a/icuSources/data/locales/th.txt b/icuSources/data/locales/th.txt index b7e0df85..a42ddd2d 100644 --- a/icuSources/data/locales/th.txt +++ b/icuSources/data/locales/th.txt @@ -1,644 +1,600 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1999-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2005 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: /Users/deglocal/Desktop/Totoro/icucvs/locale/common/main//th.xml // * // *************************************************************************** - -th { - BreakDictionaryData:import { "../brkitr/thaidict.brk" } - Version{ "2.0" } - // -------------------- ibm.597 -------------------- - // - // First put in all of the consonants, after Z - // - CollationElements { - Version { "2.0" } - Sequence { "[normalization on]& Z " - "<\u0E01" // KO KAI - "<\u0E02" // KHO KHAI - "<\u0E03" // KHO KHUAT - "<\u0E04" // KHO KHWAI - "<\u0E05" // KHO KHON - "<\u0E06" // KHO RAKHANG - "<\u0E07" // NGO NGU - "<\u0E08" // CHO CHAN - "<\u0E09" // CHO CHING - "<\u0E0A" // CHO CHANG - "<\u0E0B" // SO SO - "<\u0E0C" // CHO CHOE - "<\u0E0D" // YO YING - "<\u0E0E" // DO CHADA - "<\u0E0F" // TO PATAK - "<\u0E10" // THO THAN - "<\u0E11" // THO NANGMONTHO - "<\u0E12" // THO PHUTHAO - "<\u0E13" // NO NEN - "<\u0E14" // DO DEK - "<\u0E15" // TO TAO - "<\u0E16" // THO THUNG - "<\u0E17" // THO THAHAN - "<\u0E18" // THO THONG - "<\u0E19" // NO NU - "<\u0E1A" // BO BAIMAI - "<\u0E1B" // PO PLA - "<\u0E1C" // PHO PHUNG - "<\u0E1D" // FO FA - "<\u0E1E" // PHO PHAN - "<\u0E1F" // FO FAN - "<\u0E20" // PHO SAMPHAO - "<\u0E21" // MO MA - "<\u0E22" // YO YAK - "<\u0E23" // RO RUA - "<\u0E24" // RU - "<\u0E24\u0E45" // See the comment below on LAKKHANGYAO - "<\u0E25" // LO LING - "<\u0E26" // LU - "<\u0E26\u0E45" // See the comment below on LAKKHANGYAO - "<\u0E27" // WO WAEN - "<\u0E28" // SO SALA - "<\u0E29" // SO RUSI - "<\u0E2A" // SO SUA - "<\u0E2B" // HO HIP - "<\u0E2C" // LO CHULA - "<\u0E2D" // O ANG - "<\u0E2E" // HO NOKHUK - - // - // Normal vowels - // - "<\u0E30" // SARA A - "<\u0E31" // MAI HAN-AKAT - "<\u0E32" // SARA AA - - // Normalizer will decompose this character to \u0e4d\u0e32. - // This is a Bad Thing, because we want the separate - // characters to sort differently than this individual one. - // Since there's no public way to set the decomposition to be - // used when creating a collator, there's no way around this - // right now. It's best to go ahead and leave the character - // in, because it occurs this way a lot more often than it - // occurs as separate characters. - "<\u0E33" // SARA AM - - "<\u0E34" // SARA I - - "<\u0E35" // SARA II - "<\u0E36" // SARA UE - "<\u0E37" // SARA UEE - "<\u0E38" // SARA U - "<\u0E39" // SARA UU - - // - // Preceding vowels - // - "<\u0E40" // SARA E - "<\u0E41" // SARA AE - "<\u0E42" // SARA O - "<\u0E43" // SARA AI MAIMUAN - "<\u0E44" // SARA AI MAIMALAI - - // - // Digits - // - "<\u0E50" // DIGIT ZERO - "<\u0E51" // DIGIT ONE - "<\u0E52" // DIGIT TWO - "<\u0E53" // DIGIT THREE - "<\u0E54" // DIGIT FOUR - "<\u0E55" // DIGIT FIVE - "<\u0E56" // DIGIT SIX - "<\u0E57" // DIGIT SEVEN - "<\u0E58" // DIGIT EIGHT - "<\u0E59" // DIGIT NINE - - // Sorta tonal marks, but maybe not really - "<\u0E4D" // NIKHAHIT - - // Thai symbols are supposed to sort "after white space". I'm - // treating this as making them sort just after the normal - // Latin-1 symbols, which are in turn after the white space. - "&'\u007d'" // right-brace - "<\u0E2F" // PAIYANNOI (ellipsis, abbreviation) - "<\u0E46" // MAIYAMOK - "<\u0E4F" // FONGMAN - "<\u0E5A" // ANGKHANKHU - "<\u0E5B" // KHOMUT - "<\u0E3F" // CURRENCY SYMBOL BAHT - - // These symbols are supposed to be "after all characters" - "<\u0E4E" // YAMAKKAN - - // This rare symbol also comes after all characters. But when it is - // used in combination with RU and LU, the combination is treated as - // a separate letter, ala "CH" sorting after "C" in traditional Spanish. - // see above. - "<\u0E45" // LAKKHANGYAO - - // Tonal marks are primary ignorables but are treated as secondary - // differences - "&\u0301" // acute accent - "<<\u0E47" // MAITAIKHU - "<<\u0E48" // MAI EK - "<<\u0E49" // MAI THO - "<<\u0E4A" // MAI TRI - "<<\u0E4B" // MAI CHATTAWA - "<<\u0E4C" // THANTHAKHAT - - - // These are supposed to be ignored, so I'm treating them as controls - "&\u0001 " - "=\u0E3A" // PHINTHU - "='.'" // period - } - } - Countries { - AF { "\u0e2d\u0e31\u0e1f\u0e01\u0e32\u0e19\u0e34\u0e2a\u0e16\u0e32\u0e19" } - AL { "\u0e41\u0e2d\u0e25\u0e40\u0e1a\u0e40\u0e19\u0e35\u0e22" } - DZ { "\u0e41\u0e2d\u0e25\u0e08\u0e35\u0e40\u0e23\u0e35\u0e22" } - AD { "\u0e2d\u0e31\u0e19\u0e14\u0e2d\u0e23\u0e4c\u0e23\u0e32" } - AO { "\u0e2d\u0e31\u0e19\u0e42\u0e01\u0e25\u0e32" } - AI { "\u0e2d\u0e31\u0e19\u0e01\u0e34\u0e25\u0e48\u0e32" } - AR { "\u0e2d\u0e32\u0e23\u0e4c\u0e40\u0e08\u0e19\u0e15\u0e34\u0e19\u0e48\u0e32" } - AM { "\u0e2d\u0e32\u0e23\u0e4c\u0e21\u0e35\u0e40\u0e19\u0e35\u0e22" } - AW { "\u0e2d\u0e32\u0e23\u0e39\u0e1a\u0e32" } - AU { "\u0e2d\u0e2d\u0e2a\u0e40\u0e15\u0e23\u0e40\u0e25\u0e35\u0e22" } - AT { "\u0e2d\u0e2d\u0e2a\u0e40\u0e15\u0e23\u0e35\u0e22" } - AZ { "\u0e2d\u0e32\u0e40\u0e0b\u0e2d\u0e23\u0e4c\u0e44\u0e1a\u0e08\u0e31\u0e19" } - BS { "\u0e1a\u0e32\u0e2e\u0e32\u0e21\u0e32\u0e2a" } - BH { "\u0e1a\u0e32\u0e2b\u0e4c\u0e40\u0e23\u0e19" } - BD { "\u0e1a\u0e31\u0e07\u0e04\u0e25\u0e32\u0e40\u0e17\u0e28" } - BB { "\u0e1a\u0e32\u0e23\u0e4c\u0e1a\u0e32\u0e14\u0e2d\u0e2a" } - BY { "\u0e40\u0e1a\u0e25\u0e25\u0e32\u0e23\u0e31\u0e2a" } - BE { "\u0e40\u0e1a\u0e25\u0e40\u0e22\u0e35\u0e48\u0e22\u0e21" } - BZ { "\u0e40\u0e1a\u0e25\u0e34\u0e0b" } - BJ { "\u0e40\u0e1a\u0e19\u0e34\u0e19" } - BM { "\u0e40\u0e1a\u0e2d\u0e23\u0e4c\u0e21\u0e34\u0e27\u0e14\u0e49\u0e32" } - BT { "\u0e20\u0e39\u0e10\u0e32\u0e19" } - BO { "\u0e42\u0e1a\u0e25\u0e34\u0e40\u0e27\u0e35\u0e22" } - BA { "\u0e1a\u0e2d\u0e2a\u0e40\u0e19\u0e35\u0e22 \u0e41\u0e25\u0e30 \u0e40\u0e2e\u0e34\u0e23\u0e4c\u0e0b\u0e42\u0e01\u0e27\u0e34\u0e40\u0e19\u0e35\u0e22" } - BW { "\u0e1a\u0e2d\u0e15\u0e2a\u0e27\u0e32\u0e19\u0e32" } - BR { "\u0e1a\u0e23\u0e32\u0e0b\u0e34\u0e25" } - BN { "\u0e1a\u0e23\u0e39\u0e44\u0e19" } - BG { "\u0e1a\u0e31\u0e25\u0e41\u0e01\u0e40\u0e23\u0e35\u0e22" } - BF { "\u0e40\u0e1a\u0e2d\u0e23\u0e4c\u0e01\u0e34\u0e19\u0e32\u0e1f\u0e32\u0e42\u0e0b" } - BI { "\u0e1a\u0e39\u0e23\u0e31\u0e19\u0e14\u0e34" } - KH { "\u0e01\u0e31\u0e21\u0e1e\u0e39\u0e0a\u0e32" } - CM { "\u0e04\u0e32\u0e40\u0e21\u0e23\u0e39\u0e19" } - CA { "\u0e41\u0e04\u0e19\u0e32\u0e14\u0e32" } - CV { "\u0e40\u0e04\u0e1e\u0e40\u0e27\u0e2d\u0e23\u0e4c\u0e14" } - CF { "\u0e2a\u0e32\u0e18\u0e32\u0e23\u0e13\u0e23\u0e31\u0e10\u0e41\u0e2d\u0e1f\u0e23\u0e34\u0e01\u0e32\u0e01\u0e25\u0e32\u0e07" } - TD { "\u0e0a\u0e32\u0e14" } - CL { "\u0e0a\u0e34\u0e25\u0e35" } - CN { "\u0e08\u0e35\u0e19" } - CO { "\u0e42\u0e04\u0e25\u0e31\u0e21\u0e40\u0e1a\u0e35\u0e22" } - KM { "\u0e42\u0e04\u0e42\u0e21\u0e23\u0e2d\u0e2a" } - CG { "\u0e04\u0e2d\u0e07\u0e42\u0e01" } - CR { "\u0e04\u0e2d\u0e2a\u0e15\u0e32\u0e23\u0e34\u0e01\u0e49\u0e32" } - CI { "\u0e1d\u0e31\u0e48\u0e07\u0e17\u0e30\u0e40\u0e25\u0e44\u0e2d\u0e27\u0e2d\u0e23\u0e34" } - HR { "\u0e42\u0e04\u0e23\u0e40\u0e2d\u0e40\u0e0a\u0e35\u0e22" } - CU { "\u0e04\u0e34\u0e27\u0e1a\u0e32" } - CY { "\u0e44\u0e0b\u0e1b\u0e23\u0e31\u0e2a" } - CZ { "\u0e2a\u0e32\u0e18\u0e32\u0e23\u0e13\u0e23\u0e31\u0e10\u0e40\u0e0a\u0e47\u0e04" } - DK { "\u0e40\u0e14\u0e19\u0e21\u0e32\u0e23\u0e4c\u0e01" } - DJ { "\u0e14\u0e34\u0e42\u0e1a\u0e15\u0e34" } - DM { "\u0e42\u0e14\u0e21\u0e34\u0e19\u0e34\u0e01\u0e49\u0e32" } - DO { "\u0e2a\u0e32\u0e18\u0e32\u0e23\u0e13\u0e23\u0e31\u0e10\u0e42\u0e14\u0e21\u0e34\u0e19\u0e34\u0e01\u0e31\u0e19" } - TL { "\u0e15\u0e34\u0e21\u0e2d\u0e23\u0e4c\u0e15\u0e30\u0e27\u0e31\u0e19\u0e2d\u0e2d\u0e01" } - EC { "\u0e40\u0e2d\u0e01\u0e27\u0e32\u0e14\u0e2d\u0e23\u0e4c" } - EG { "\u0e2d\u0e35\u0e22\u0e34\u0e1b\u0e15\u0e4c" } - SV { "\u0e40\u0e2d\u0e25\u0e0b\u0e32\u0e27\u0e32\u0e14\u0e2d\u0e23\u0e4c" } - GQ { "\u0e40\u0e2d\u0e04\u0e27\u0e32\u0e42\u0e17\u0e40\u0e23\u0e35\u0e22\u0e25\u0e01\u0e34\u0e19\u0e35" } - ER { "\u0e2d\u0e34\u0e23\u0e34\u0e17\u0e23\u0e35" } - EE { "\u0e40\u0e2d\u0e2a\u0e42\u0e15\u0e40\u0e19\u0e35\u0e22" } - ET { "\u0e40\u0e2d\u0e18\u0e34\u0e42\u0e2d\u0e40\u0e1b\u0e35\u0e22" } - FJ { "\u0e1f\u0e34\u0e08\u0e34" } - FI { "\u0e1f\u0e34\u0e19\u0e41\u0e25\u0e19\u0e14\u0e4c" } - FR { "\u0e1d\u0e23\u0e31\u0e48\u0e07\u0e40\u0e28\u0e2a" } - GF { "\u0e40\u0e1f\u0e23\u0e47\u0e19\u0e0a\u0e01\u0e34\u0e27\u0e19\u0e48\u0e32" } - PF { "\u0e40\u0e1f\u0e23\u0e47\u0e19\u0e0a\u0e42\u0e1e\u0e25\u0e34\u0e19\u0e35\u0e40\u0e0b\u0e35\u0e22" } - TF { "\u0e2d\u0e32\u0e13\u0e32\u0e40\u0e02\u0e15\u0e17\u0e32\u0e07\u0e43\u0e15\u0e49\u0e02\u0e2d\u0e07\u0e1d\u0e23\u0e31\u0e48\u0e07\u0e40\u0e28\u0e2a" } - GA { "\u0e01\u0e32\u0e1a\u0e2d\u0e19" } - GM { "\u0e41\u0e01\u0e21\u0e40\u0e1a\u0e35\u0e22" } - GE { "\u0e08\u0e2d\u0e23\u0e4c\u0e40\u0e08\u0e35\u0e22" } - DE { "\u0e40\u0e22\u0e2d\u0e23\u0e21\u0e19\u0e35" } - GH { "\u0e01\u0e32\u0e19\u0e48\u0e32" } - GR { "\u0e01\u0e23\u0e35\u0e0b" } - GP { "\u0e01\u0e31\u0e27\u0e40\u0e14\u0e2d\u0e25\u0e39\u0e1b" } - GT { "\u0e01\u0e31\u0e27\u0e40\u0e15\u0e21\u0e32\u0e25\u0e32" } - GN { "\u0e01\u0e34\u0e27\u0e19\u0e35" } - GW { "\u0e01\u0e34\u0e27\u0e19\u0e35-\u0e1a\u0e34\u0e2a\u0e42\u0e0b" } - GY { "\u0e01\u0e39\u0e22\u0e32\u0e19\u0e48\u0e32" } - HT { "\u0e44\u0e2e\u0e15\u0e35" } - HN { "\u0e2e\u0e2d\u0e19\u0e14\u0e39\u0e23\u0e31\u0e2a" } - HK { "\u0e2e\u0e48\u0e2d\u0e07\u0e01\u0e07" } - HU { "\u0e2e\u0e31\u0e07\u0e01\u0e32\u0e23\u0e35" } - IS { "\u0e44\u0e2d\u0e0b\u0e41\u0e25\u0e19\u0e14\u0e4c" } - IN { "\u0e2d\u0e34\u0e19\u0e40\u0e14\u0e35\u0e22" } - ID { "\u0e2d\u0e34\u0e19\u0e42\u0e14\u0e19\u0e35\u0e40\u0e0b\u0e35\u0e22" } - IR { "\u0e2d\u0e34\u0e2b\u0e23\u0e48\u0e32\u0e19" } - IQ { "\u0e2d\u0e34\u0e23\u0e31\u0e01" } - IE { "\u0e44\u0e2d\u0e23\u0e4c\u0e41\u0e25\u0e19\u0e14\u0e4c" } - IL { "\u0e2d\u0e34\u0e2a\u0e23\u0e32\u0e40\u0e2d\u0e25" } - IT { "\u0e2d\u0e34\u0e15\u0e32\u0e25\u0e35" } - JM { "\u0e08\u0e32\u0e44\u0e21\u0e01\u0e49\u0e32" } - JP { "\u0e0d\u0e35\u0e48\u0e1b\u0e38\u0e48\u0e19" } - JO { "\u0e08\u0e2d\u0e23\u0e4c\u0e41\u0e14\u0e19" } - KZ { "\u0e04\u0e32\u0e0b\u0e31\u0e04\u0e2a\u0e16\u0e32\u0e19" } - KE { "\u0e40\u0e04\u0e19\u0e22\u0e48\u0e32" } - KI { "\u0e04\u0e34\u0e23\u0e35\u0e1a\u0e32\u0e15\u0e34" } - KP { "\u0e40\u0e01\u0e32\u0e2b\u0e25\u0e35\u0e40\u0e2b\u0e19\u0e37\u0e2d" } - KR { "\u0e40\u0e01\u0e32\u0e2b\u0e25\u0e35\u0e43\u0e15\u0e49" } - KW { "\u0e04\u0e39\u0e40\u0e27\u0e15" } - KG { "\u0e40\u0e04\u0e2d\u0e23\u0e4c\u0e01\u0e34\u0e2a\u0e16\u0e32\u0e19" } - LA { "\u0e25\u0e32\u0e27" } - LV { "\u0e25\u0e32\u0e15\u0e40\u0e27\u0e35\u0e22" } - LB { "\u0e40\u0e25\u0e1a\u0e32\u0e19\u0e2d\u0e19" } - LS { "\u0e40\u0e25\u0e42\u0e0b\u0e42\u0e17" } - LR { "\u0e25\u0e34\u0e40\u0e1a\u0e2d\u0e23\u0e4c\u0e40\u0e25\u0e35\u0e22" } - LY { "\u0e25\u0e34\u0e40\u0e1a\u0e35\u0e22" } - LI { "\u0e44\u0e25\u0e40\u0e17\u0e19\u0e2a\u0e44\u0e15\u0e19\u0e4c" } - LT { "\u0e25\u0e34\u0e40\u0e17\u0e2d\u0e23\u0e4c\u0e40\u0e19\u0e35\u0e22" } - LU { "\u0e25\u0e31\u0e01\u0e0b\u0e4c\u0e40\u0e0b\u0e21\u0e40\u0e1a\u0e2d\u0e23\u0e4c\u0e01" } - MK { "\u0e41\u0e21\u0e0b\u0e35\u0e42\u0e14\u0e40\u0e19\u0e35\u0e22" } - MG { "\u0e21\u0e32\u0e14\u0e32\u0e01\u0e32\u0e2a\u0e01\u0e49\u0e32" } - MO { "\u0e21\u0e32\u0e40\u0e01\u0e4a\u0e32" } - MY { "\u0e21\u0e32\u0e40\u0e25\u0e40\u0e0b\u0e35\u0e22" } - ML { "\u0e21\u0e32\u0e25\u0e35" } - MT { "\u0e21\u0e31\u0e25\u0e15\u0e49\u0e32" } - MQ { "\u0e21\u0e32\u0e23\u0e4c\u0e15\u0e34\u0e19\u0e34\u0e01" } - MR { "\u0e21\u0e2d\u0e23\u0e34\u0e17\u0e32\u0e40\u0e19\u0e35\u0e22" } - MU { "\u0e21\u0e2d\u0e23\u0e34\u0e40\u0e15\u0e35\u0e22\u0e2a" } - YT { "\u0e21\u0e32\u0e22\u0e2d\u0e15" } - MX { "\u0e41\u0e21\u0e47\u0e01\u0e0b\u0e34\u0e42\u0e01" } - FM { "\u0e44\u0e21\u0e42\u0e04\u0e23\u0e19\u0e34\u0e40\u0e0b\u0e35\u0e22" } - MD { "\u0e42\u0e21\u0e25\u0e42\u0e14\u0e27\u0e32" } - MC { "\u0e42\u0e21\u0e19\u0e32\u0e42\u0e04" } - MN { "\u0e21\u0e2d\u0e07\u0e42\u0e01\u0e40\u0e25\u0e35\u0e22" } - MS { "\u0e21\u0e2d\u0e19\u0e15\u0e4c\u0e40\u0e0b\u0e2d\u0e23\u0e32\u0e15" } - MA { "\u0e42\u0e21\u0e23\u0e2d\u0e04\u0e42\u0e04" } - MZ { "\u0e42\u0e21\u0e41\u0e0b\u0e21\u0e1a\u0e34\u0e04" } - MM { "\u0e2a\u0e2b\u0e20\u0e32\u0e1e\u0e1e\u0e21\u0e48\u0e32" } - NA { "\u0e19\u0e32\u0e21\u0e34\u0e40\u0e1a\u0e35\u0e22" } - NP { "\u0e40\u0e19\u0e1b\u0e32\u0e25" } - NL { "\u0e40\u0e19\u0e40\u0e18\u0e2d\u0e23\u0e4c\u0e41\u0e25\u0e19\u0e14\u0e4c" } - AN { "\u0e40\u0e19\u0e40\u0e18\u0e2d\u0e23\u0e4c\u0e41\u0e25\u0e19\u0e14\u0e4c\u0e41\u0e2d\u0e19\u0e17\u0e34\u0e25\u0e25\u0e4c" } - NC { "\u0e19\u0e34\u0e27\u0e04\u0e32\u0e25\u0e34\u0e42\u0e14\u0e40\u0e19\u0e35\u0e22" } - NZ { "\u0e19\u0e34\u0e27\u0e0b\u0e35\u0e41\u0e25\u0e19\u0e14\u0e4c" } - NI { "\u0e19\u0e34\u0e04\u0e32\u0e23\u0e32\u0e01\u0e31\u0e27" } - NE { "\u0e44\u0e19\u0e40\u0e08\u0e2d\u0e23\u0e4c" } - NG { "\u0e44\u0e19\u0e08\u0e35\u0e40\u0e23\u0e35\u0e22" } - NU { "\u0e19\u0e35\u0e22\u0e39" } - NO { "\u0e19\u0e2d\u0e23\u0e4c\u0e40\u0e27\u0e22\u0e4c" } - OM { "\u0e42\u0e2d\u0e21\u0e32\u0e19" } - PK { "\u0e1b\u0e32\u0e01\u0e35\u0e2a\u0e16\u0e32\u0e19" } - PA { "\u0e1b\u0e32\u0e19\u0e32\u0e21\u0e32" } - PG { "\u0e1b\u0e32\u0e1b\u0e31\u0e27\u0e19\u0e34\u0e27\u0e01\u0e35\u0e19\u0e35" } - PY { "\u0e1b\u0e32\u0e23\u0e32\u0e01\u0e27\u0e31\u0e22" } - PE { "\u0e40\u0e1b\u0e23\u0e39" } - PH { "\u0e1f\u0e34\u0e25\u0e34\u0e1b\u0e1b\u0e34\u0e19\u0e2a\u0e4c" } - PL { "\u0e42\u0e1b\u0e41\u0e25\u0e19\u0e14\u0e4c" } - PT { "\u0e42\u0e1b\u0e15\u0e38\u0e01\u0e31\u0e25" } - PR { "\u0e40\u0e1b\u0e2d\u0e23\u0e4c\u0e42\u0e15\u0e23\u0e34\u0e42\u0e01" } - QA { "\u0e01\u0e32\u0e15\u0e32\u0e23\u0e4c" } - RO { "\u0e23\u0e39\u0e40\u0e21\u0e40\u0e19\u0e35\u0e22" } - RU { "\u0e23\u0e31\u0e2a\u0e40\u0e0b\u0e35\u0e22" } - RW { "\u0e23\u0e32\u0e27\u0e31\u0e25\u0e14\u0e32" } - SA { "\u0e0b\u0e32\u0e2d\u0e38\u0e14\u0e34\u0e2d\u0e32\u0e23\u0e30\u0e40\u0e1a\u0e35\u0e22" } - SN { "\u0e0b\u0e34\u0e19\u0e35\u0e01\u0e31\u0e25" } - SP { "\u0e40\u0e0b\u0e2d\u0e23\u0e4c\u0e40\u0e1a\u0e35\u0e22" } - SC { "\u0e40\u0e0b\u0e22\u0e4c\u0e41\u0e0a\u0e25\u0e25\u0e4c" } - SL { "\u0e40\u0e0b\u0e35\u0e22\u0e23\u0e4c\u0e23\u0e48\u0e32\u0e25\u0e35\u0e2d\u0e2d\u0e19" } - SG { "\u0e2a\u0e34\u0e07\u0e04\u0e42\u0e1b\u0e23\u0e4c" } - SK { "\u0e2a\u0e42\u0e25\u0e27\u0e32\u0e40\u0e01\u0e35\u0e22" } - SI { "\u0e2a\u0e42\u0e25\u0e27\u0e34\u0e40\u0e19\u0e35\u0e22" } - SO { "\u0e42\u0e0b\u0e21\u0e32\u0e40\u0e25\u0e35\u0e22" } - ZA { "\u0e41\u0e2d\u0e1f\u0e23\u0e34\u0e01\u0e32\u0e43\u0e15\u0e49" } - ES { "\u0e2a\u0e40\u0e1b\u0e19" } - LK { "\u0e28\u0e23\u0e35\u0e25\u0e31\u0e07\u0e01\u0e32" } - SD { "\u0e0b\u0e39\u0e14\u0e32\u0e19" } - SR { "\u0e0b\u0e39\u0e23\u0e34\u0e19\u0e32\u0e21\u0e34" } - SZ { "\u0e2a\u0e27\u0e32\u0e0b\u0e34\u0e41\u0e25\u0e19\u0e14\u0e4c" } - SE { "\u0e2a\u0e27\u0e35\u0e40\u0e14\u0e19" } - CH { "\u0e2a\u0e27\u0e34\u0e2a\u0e40\u0e0b\u0e2d\u0e23\u0e4c\u0e41\u0e25\u0e19\u0e14\u0e4c" } - SY { "\u0e0b\u0e35\u0e40\u0e23\u0e35\u0e22" } - TW { "\u0e44\u0e15\u0e49\u0e2b\u0e27\u0e31\u0e19" } - TJ { "\u0e17\u0e32\u0e08\u0e34\u0e01\u0e34\u0e2a\u0e16\u0e32\u0e19" } - TZ { "\u0e17\u0e32\u0e19\u0e0b\u0e32\u0e40\u0e19\u0e35\u0e22" } - TH { "\u0e1b\u0e23\u0e30\u0e40\u0e17\u0e28\u0e44\u0e17\u0e22" } - TG { "\u0e42\u0e15\u0e42\u0e01" } - TK { "\u0e42\u0e17\u0e01\u0e34\u0e42\u0e25" } - TO { "\u0e17\u0e2d\u0e07\u0e01\u0e49\u0e32" } - TT { "\u0e17\u0e23\u0e34\u0e19\u0e34\u0e41\u0e14\u0e14 \u0e41\u0e25\u0e30\u0e42\u0e17\u0e1a\u0e32\u0e42\u0e01" } - TN { "\u0e15\u0e39\u0e19\u0e34\u0e40\u0e0b\u0e35\u0e22" } - TR { "\u0e15\u0e38\u0e23\u0e01\u0e35" } - TM { "\u0e40\u0e15\u0e34\u0e23\u0e4c\u0e01\u0e40\u0e21\u0e19\u0e34\u0e2a\u0e16\u0e32\u0e19" } - UG { "\u0e2d\u0e39\u0e01\u0e32\u0e19\u0e14\u0e32" } - UA { "\u0e22\u0e39\u0e40\u0e04\u0e23\u0e19" } - AE { "\u0e2a\u0e2b\u0e23\u0e31\u0e10\u0e2d\u0e32\u0e2b\u0e23\u0e31\u0e1a\u0e40\u0e2d\u0e21\u0e34\u0e40\u0e23\u0e15\u0e2a\u0e4c" } - GB { "\u0e2a\u0e2b\u0e23\u0e32\u0e0a\u0e2d\u0e32\u0e13\u0e32\u0e08\u0e31\u0e01\u0e23" } - US { "\u0e2a\u0e2b\u0e23\u0e31\u0e10\u0e2d\u0e40\u0e21\u0e23\u0e34\u0e01\u0e32" } - UY { "\u0e2d\u0e38\u0e23\u0e39\u0e01\u0e27\u0e31\u0e22" } - UZ { "\u0e2d\u0e38\u0e0b\u0e40\u0e1a\u0e01\u0e34\u0e2a\u0e16\u0e32\u0e19" } - VU { "\u0e27\u0e32\u0e19\u0e31\u0e27\u0e15\u0e39" } - VA { "\u0e27\u0e32\u0e15\u0e34\u0e01\u0e31\u0e19" } - VE { "\u0e40\u0e27\u0e40\u0e19\u0e0b\u0e39\u0e40\u0e2d\u0e25\u0e48\u0e32" } - VN { "\u0e40\u0e27\u0e35\u0e22\u0e14\u0e19\u0e32\u0e21" } - VG { "\u0e1a\u0e23\u0e34\u0e17\u0e34\u0e0a\u0e40\u0e27\u0e2d\u0e23\u0e4c\u0e08\u0e34\u0e19\u0e44\u0e2d\u0e2a\u0e4c\u0e41\u0e25\u0e19\u0e14\u0e4c" } - VI { "\u0e22\u0e39\u0e40\u0e2d\u0e2a\u0e40\u0e27\u0e2d\u0e23\u0e4c\u0e08\u0e34\u0e19\u0e44\u0e2d\u0e2a\u0e4c\u0e41\u0e25\u0e19\u0e14\u0e4c" } - EH { "\u0e0b\u0e32\u0e2e\u0e32\u0e23\u0e48\u0e32\u0e15\u0e30\u0e27\u0e31\u0e19\u0e15\u0e01" } - YE { "\u0e40\u0e22\u0e40\u0e21\u0e19" } - YU { "\u0e22\u0e39\u0e42\u0e01\u0e2a\u0e25\u0e32\u0e40\u0e27\u0e35\u0e22" } - //ZR { "\u0e41\u0e0b\u0e23\u0e4c" } // It's now called CD { "Democratic Republic of the Congo" } - ZM { "\u0e41\u0e0b\u0e21\u0e40\u0e1a\u0e35\u0e22" } - ZW { "\u0e0b\u0e34\u0e21\u0e1a\u0e32\u0e1a\u0e40\u0e27" } - } - DateTimePatterns { - "H' \u0E19\u0E32\u0E2C\u0E34\u0E01\u0E32 'm' \u0E19\u0E32\u0E17\u0E35 'ss' \u0E27" - "\u0E34\u0E19\u0E32\u0E17\u0E35'", - "H' \u0E19\u0E32\u0E2C\u0E34\u0E01\u0E32 'm' \u0E19\u0E32\u0E17\u0E35'", - "H:mm:ss", - "H:mm", - "EEEE'\u0E17\u0E35\u0E48 'd MMMM G yyyy", - "d MMMM yyyy", - "d MMM yyyy", - "d/M/yyyy", - "{1}, {0}", - } - DayAbbreviations { - "\u0E2D\u0E32.", - "\u0E08.", - "\u0E2D.", - "\u0E1E.", - "\u0E1E\u0E24.", - "\u0E28.", - "\u0E2A.", - } - DayNames { - "\u0E27\u0E31\u0E19\u0E2D\u0E32\u0E17\u0E34\u0E15\u0E22\u0E4C", - "\u0E27\u0E31\u0E19\u0E08\u0E31\u0E19\u0E17\u0E23\u0E4C", - "\u0E27\u0E31\u0E19\u0E2D\u0E31\u0E07\u0E04\u0E32\u0E23", - "\u0E27\u0E31\u0E19\u0E1E\u0E38\u0E18", - "\u0E27\u0E31\u0E19\u0E1E\u0E24\u0E2B\u0E31\u0E2A\u0E1A\u0E14\u0E35", - "\u0E27\u0E31\u0E19\u0E28\u0E38\u0E01\u0E23\u0E4C", - "\u0E27\u0E31\u0E19\u0E40\u0E2A\u0E32\u0E23\u0E4C", - } - AmPmMarkers { - "\u0E01\u0E48\u0E2D\u0E19\u0E40\u0E17\u0E35\u0E48\u0E22\u0E07", - "\u0E2B\u0E25\u0E31\u0E07\u0E40\u0E17\u0E35\u0E48\u0E22\u0E07", - } - Eras { - "\u0E1B\u0E35\u0E01\u0E48\u0E2D\u0E19\u0E04\u0E23\u0E34\u0E2A\u0E15\u0E4C\u0E01\u0E32" - "\u0E25\u0E17\u0E35\u0E48", - - "\u0E04.\u0E28.", - } - Languages { - ab { "\u0e41\u0e2d\u0e1a\u0e01\u0e32\u0e40\u0e0b\u0e35\u0e22" } - aa { "\u0e2d\u0e32\u0e1f\u0e32" } - af { "\u0e41\u0e2d\u0e1f\u0e23\u0e34\u0e01\u0e31\u0e19" } - sq { "\u0e41\u0e2d\u0e25\u0e40\u0e1a\u0e40\u0e19\u0e35\u0e22" } - am { "\u0e2d\u0e31\u0e21\u0e2e\u0e32\u0e23\u0e34\u0e04" } - ar { "\u0e2d\u0e32\u0e23\u0e30\u0e1a\u0e34\u0e04" } - hy { "\u0e2d\u0e32\u0e23\u0e4c\u0e21\u0e35\u0e40\u0e19\u0e35\u0e22" } - as { "\u0e2d\u0e31\u0e2a\u0e2a\u0e31\u0e21\u0e21\u0e34\u0e2a" } - ay { "\u0e44\u0e2d\u0e21\u0e32\u0e23\u0e32" } - az { "\u0e2d\u0e32\u0e40\u0e0b\u0e2d\u0e23\u0e4c\u0e44\u0e1a\u0e08\u0e32\u0e19\u0e35" } - ba { "\u0e1a\u0e32\u0e2a\u0e0a\u0e4c\u0e01\u0e35\u0e23\u0e4c" } - eu { "\u0e41\u0e1a\u0e2a\u0e01\u0e4c" } - bn { "\u0e40\u0e1a\u0e19\u0e01\u0e32\u0e23\u0e35" } - dz { "\u0e20\u0e39\u0e10\u0e32\u0e19\u0e35" } - bh { "\u0e1a\u0e34\u0e2e\u0e32\u0e23\u0e35" } - bi { "\u0e1a\u0e34\u0e2a\u0e25\u0e32\u0e21\u0e32" } - br { "\u0e1a\u0e23\u0e35\u0e17\u0e31\u0e19" } - bg { "\u0e1a\u0e31\u0e25\u0e41\u0e01\u0e40\u0e23\u0e35\u0e22" } - my { "\u0e1e\u0e21\u0e48\u0e32" } - be { "\u0e1a\u0e32\u0e22\u0e42\u0e25\u0e23\u0e31\u0e2a\u0e40\u0e0b\u0e35\u0e22" } - km { "\u0e40\u0e02\u0e21\u0e23" } - ca { "\u0e41\u0e04\u0e15\u0e32\u0e41\u0e25\u0e19" } - zh { "\u0e08\u0e35\u0e19" } - co { "\u0e04\u0e2d\u0e23\u0e4c\u0e0b\u0e34\u0e01\u0e32" } - hr { "\u0e42\u0e04\u0e23\u0e40\u0e2d\u0e40\u0e17\u0e35\u0e22" } - cs { "\u0e40\u0e0a\u0e47\u0e04" } - da { "\u0e40\u0e14\u0e19\u0e21\u0e32\u0e23\u0e4c\u0e01" } - nl { "\u0e2e\u0e2d\u0e25\u0e31\u0e19\u0e14\u0e32" } - en { "\u0e2d\u0e31\u0e07\u0e01\u0e24\u0e29" } - eo { "\u0e40\u0e2d\u0e2a\u0e40\u0e1b\u0e2d\u0e23\u0e31\u0e19\u0e42\u0e15" } - et { "\u0e40\u0e2d\u0e2a\u0e42\u0e15\u0e40\u0e19\u0e35\u0e22" } - fo { "\u0e1f\u0e32\u0e42\u0e23\u0e2a" } - fj { "\u0e1f\u0e34\u0e08\u0e34" } - fi { "\u0e1f\u0e34\u0e19" } - fr { "\u0e1d\u0e23\u0e31\u0e48\u0e07\u0e40\u0e28\u0e2a" } - fy { "\u0e1f\u0e23\u0e35\u0e2a\u0e41\u0e25\u0e19\u0e14\u0e4c" } - gl { "\u0e01\u0e30\u0e25\u0e35\u0e40\u0e0a\u0e35\u0e22" } - ka { "\u0e08\u0e2d\u0e23\u0e4c\u0e40\u0e08\u0e35\u0e22\u0e19" } - de { "\u0e40\u0e22\u0e2d\u0e23\u0e21\u0e31\u0e19" } - el { "\u0e01\u0e23\u0e35\u0e01" } - kl { "\u0e01\u0e23\u0e35\u0e19\u0e41\u0e25\u0e19\u0e14\u0e4c\u0e14\u0e34\u0e04" } - gn { "\u0e01\u0e31\u0e27\u0e23\u0e32\u0e19\u0e35" } - gu { "\u0e01\u0e39\u0e08\u0e32\u0e23\u0e32\u0e15\u0e34" } - ha { "\u0e42\u0e2e\u0e0b\u0e32" } - he { "\u0e22\u0e34\u0e27" } - hi { "\u0e2e\u0e35\u0e19\u0e14\u0e34" } - hu { "\u0e2e\u0e31\u0e07\u0e01\u0e32\u0e23\u0e35" } - is { "\u0e44\u0e2d\u0e0b\u0e4c\u0e41\u0e25\u0e19\u0e14\u0e4c\u0e14\u0e34\u0e04" } - id { "\u0e2d\u0e34\u0e19\u0e42\u0e14\u0e19\u0e35\u0e40\u0e0a\u0e35\u0e22" } - ia { "\u0e2d\u0e34\u0e19\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e25\u0e34\u0e07\u0e01\u0e27\u0e32" } - ie { "\u0e2d\u0e34\u0e19\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e25\u0e34\u0e07\u0e04\u0e4c" } - iu { "\u0e44\u0e2d\u0e19\u0e38\u0e01\u0e15\u0e34\u0e15\u0e31\u0e17" } - ik { "\u0e44\u0e2d\u0e19\u0e39\u0e40\u0e1b\u0e35\u0e22\u0e01" } - ga { "\u0e44\u0e2d\u0e23\u0e34\u0e0a" } - it { "\u0e2d\u0e34\u0e15\u0e32\u0e25\u0e35" } - ja { "\u0e0d\u0e35\u0e48\u0e1b\u0e38\u0e48\u0e19" } - jv { "\u0e0a\u0e27\u0e32" } - //jw { "\u0e0a\u0e27\u0e32" } // Use jv instead - kn { "\u0e01\u0e32\u0e19\u0e32\u0e14\u0e32" } - ks { "\u0e04\u0e31\u0e0a\u0e21\u0e35\u0e23\u0e35" } - kk { "\u0e04\u0e32\u0e0b\u0e31\u0e04" } - rw { "\u0e04\u0e34\u0e19\u0e22\u0e32\u0e27\u0e31\u0e19\u0e14\u0e32" } - ky { "\u0e40\u0e04\u0e2d\u0e23\u0e4c\u0e01\u0e34\u0e0b" } - rn { "\u0e04\u0e34\u0e23\u0e31\u0e19\u0e14\u0e35" } - ko { "\u0e40\u0e01\u0e32\u0e2b\u0e25\u0e35" } - ku { "\u0e40\u0e04\u0e34\u0e14" } - lo { "\u0e25\u0e32\u0e27" } - la { "\u0e25\u0e30\u0e15\u0e34\u0e19" } - lv { "\u0e41\u0e25\u0e15\u0e40\u0e27\u0e35\u0e22 (\u0e40\u0e25\u0e17\u0e17\u0e34\u0e2a\u0e0a\u0e4c)" } - ln { "\u0e25\u0e34\u0e07\u0e01\u0e32\u0e25\u0e32" } - lt { "\u0e25\u0e34\u0e18\u0e31\u0e27\u0e40\u0e19\u0e35\u0e22" } - mk { "\u0e41\u0e21\u0e0b\u0e35\u0e42\u0e14\u0e40\u0e19\u0e35\u0e22" } - mg { "\u0e21\u0e32\u0e25\u0e32\u0e01\u0e32\u0e0b\u0e35" } - ms { "\u0e21\u0e25\u0e32\u0e22\u0e39" } - ml { "\u0e41\u0e21\u0e25\u0e30\u0e22\u0e32\u0e25\u0e31\u0e21" } - mt { "\u0e21\u0e2d\u0e25\u0e15\u0e32" } - mi { "\u0e40\u0e21\u0e32\u0e23\u0e35" } - mr { "\u0e21\u0e32\u0e23\u0e32\u0e17\u0e35" } - mo { "\u0e42\u0e21\u0e14\u0e32\u0e40\u0e27\u0e35\u0e22" } - mn { "\u0e21\u0e2d\u0e07\u0e42\u0e01\u0e25" } - na { "\u0e19\u0e2d\u0e23\u0e39" } - ne { "\u0e40\u0e19\u0e1b\u0e32\u0e25" } - no { "\u0e19\u0e2d\u0e23\u0e4c\u0e40\u0e27\u0e22\u0e4c" } - oc { "\u0e2d\u0e2d\u0e01\u0e0b\u0e34\u0e17\u0e31\u0e19" } - or { "\u0e42\u0e2d\u0e23\u0e34\u0e22\u0e32" } - om { "\u0e42\u0e2d\u0e42\u0e23\u0e42\u0e21 (\u0e2d\u0e32\u0e1f\u0e32\u0e19)" } - ps { "\u0e1e\u0e32\u0e2a\u0e0a\u0e4c\u0e42\u0e15 (\u0e1e\u0e38\u0e2a\u0e0a\u0e4c\u0e42\u0e15)" } - fa { "\u0e40\u0e1b\u0e2d\u0e23\u0e4c\u0e40\u0e0b\u0e35\u0e22" } - pl { "\u0e42\u0e1b\u0e41\u0e25\u0e19\u0e14\u0e4c" } - pt { "\u0e42\u0e1b\u0e23\u0e15\u0e38\u0e40\u0e01\u0e2a" } - pa { "\u0e1b\u0e31\u0e0d\u0e08\u0e32\u0e1b" } - qu { "\u0e04\u0e34\u0e27\u0e0a\u0e31\u0e27" } - rm { "\u0e40\u0e23\u0e42\u0e15-\u0e42\u0e23\u0e41\u0e21\u0e19\u0e0b\u0e4c" } - ro { "\u0e42\u0e23\u0e21\u0e31\u0e19" } - ru { "\u0e23\u0e31\u0e2a\u0e40\u0e0b\u0e35\u0e22" } - sm { "\u0e0b\u0e32\u0e21\u0e31\u0e27" } - sg { "\u0e2a\u0e31\u0e19\u0e42\u0e04" } - sa { "\u0e2a\u0e31\u0e19\u0e2a\u0e01\u0e24\u0e15" } - gd { "\u0e2a\u0e01\u0e47\u0e2d\u0e15\u0e2a\u0e4c\u0e40\u0e01\u0e25\u0e34\u0e04" } - sr { "\u0e40\u0e0b\u0e2d\u0e23\u0e4c\u0e40\u0e1a\u0e35\u0e22" } - sh { "\u0e40\u0e0b\u0e2d\u0e23\u0e4c\u0e42\u0e1a-\u0e42\u0e04\u0e23\u0e40\u0e2d\u0e40\u0e17\u0e35\u0e22\u0e19" } - st { "\u0e40\u0e0b\u0e42\u0e2a\u0e42\u0e17" } - tn { "\u0e40\u0e0b\u0e15\u0e2a\u0e27\u0e32\u0e19\u0e32" } - sn { "\u0e42\u0e0b\u0e19\u0e32" } - sd { "\u0e0b\u0e34\u0e19\u0e14\u0e34" } - si { "\u0e2a\u0e34\u0e07\u0e2b\u0e25" } - ss { "\u0e0b\u0e35\u0e2a\u0e27\u0e32\u0e15\u0e34" } - sk { "\u0e2a\u0e42\u0e25\u0e27\u0e31\u0e04" } - sl { "\u0e2a\u0e42\u0e25\u0e40\u0e27\u0e40\u0e19\u0e35\u0e22" } - so { "\u0e42\u0e0b\u0e21\u0e32\u0e25\u0e35" } - es { "\u0e2a\u0e40\u0e1b\u0e19" } - su { "\u0e0b\u0e31\u0e19\u0e14\u0e32\u0e19\u0e35\u0e2a" } - sw { "\u0e0b\u0e27\u0e32\u0e2e\u0e34\u0e23\u0e35" } - sv { "\u0e2a\u0e27\u0e35\u0e40\u0e14\u0e19" } - tl { "\u0e15\u0e32\u0e01\u0e32\u0e25\u0e47\u0e2d\u0e01" } - tg { "\u0e17\u0e32\u0e08\u0e34\u0e04" } - ta { "\u0e17\u0e21\u0e34\u0e2c" } - tt { "\u0e15\u0e32\u0e14" } - te { "\u0e17\u0e34\u0e25\u0e39\u0e01\u0e39" } - th { "\u0e44\u0e17\u0e22" } - bo { "\u0e17\u0e34\u0e40\u0e1a\u0e15" } - ti { "\u0e17\u0e34\u0e01\u0e23\u0e34\u0e19\u0e22\u0e32" } - to { "\u0e17\u0e2d\u0e07\u0e01\u0e49\u0e32" } - ts { "\u0e0b\u0e2d\u0e07\u0e01\u0e32" } - tr { "\u0e15\u0e38\u0e23\u0e01\u0e35" } - tk { "\u0e40\u0e15\u0e34\u0e23\u0e4c\u0e01\u0e40\u0e21\u0e19" } - tw { "\u0e17\u0e27\u0e35" } - ug { "\u0e2d\u0e38\u0e22\u0e01\u0e31\u0e27" } - uk { "\u0e22\u0e39\u0e40\u0e04\u0e23\u0e19" } - ur { "\u0e2d\u0e34\u0e23\u0e14\u0e39" } - uz { "\u0e2d\u0e38\u0e2a\u0e40\u0e1a\u0e04" } - vi { "\u0e40\u0e27\u0e35\u0e22\u0e14\u0e19\u0e32\u0e21" } - vo { "\u0e42\u0e27\u0e25\u0e32\u0e1e\u0e38\u0e01" } - cy { "\u0e40\u0e27\u0e25\u0e2a\u0e4c" } - wo { "\u0e27\u0e39\u0e25\u0e2d\u0e1f" } - xh { "\u0e42\u0e0b\u0e2a\u0e32" } - yi { "\u0e22\u0e35\u0e14\u0e34\u0e0a" } - yo { "\u0e42\u0e22\u0e23\u0e39\u0e1a\u0e32" } - za { "\u0e08\u0e27\u0e07" } - zu { "\u0e0b\u0e39\u0e25\u0e39" } - } - LocaleID:int { 0x1e } -// LocaleString { "th" } - MonthAbbreviations { - "\u0E21.\u0E04.", - "\u0E01.\u0E1E.", - "\u0E21\u0E35.\u0E04.", - "\u0E40\u0E21.\u0E22.", - "\u0E1E.\u0E04.", - "\u0E21\u0E34.\u0E22.", - "\u0E01.\u0E04.", - "\u0E2A.\u0E04.", - "\u0E01.\u0E22.", - "\u0E15.\u0E04.", - "\u0E1E.\u0E22.", - "\u0E18.\u0E04.", - } - MonthNames { - "\u0E21\u0E01\u0E23\u0E32\u0E04\u0E21", - "\u0E01\u0E38\u0E21\u0E20\u0E32\u0E1E\u0E31\u0E19\u0E18\u0E4C", - "\u0E21\u0E35\u0E19\u0E32\u0E04\u0E21", - "\u0E40\u0E21\u0E29\u0E32\u0E22\u0E19", - "\u0E1E\u0E24\u0E29\u0E20\u0E32\u0E04\u0E21", - "\u0E21\u0E34\u0E16\u0E38\u0E19\u0E32\u0E22\u0E19", - "\u0E01\u0E23\u0E01\u0E0E\u0E32\u0E04\u0E21", - "\u0E2A\u0E34\u0E07\u0E2B\u0E32\u0E04\u0E21", - "\u0E01\u0E31\u0E19\u0E22\u0E32\u0E22\u0E19", - "\u0E15\u0E38\u0E25\u0E32\u0E04\u0E21", - "\u0E1E\u0E24\u0E28\u0E08\u0E34\u0E01\u0E32\u0E22\u0E19", - "\u0E18\u0E31\u0E19\u0E27\u0E32\u0E04\u0E21", +/** + * ICU source: /Users/deglocal/Desktop/Totoro/icucvs/locale/icu/main//th.xml + */ +th{ + BreakDictionaryData:import{"../brkitr/thaidict.brk"} + Countries{ + AD{"อันดอร์รา"} + AE{"สหรัฐอาหรับเอมิเรตส์"} + AF{"อัฟกานิสถาน"} + AG{"แอนติกาและบาร์บูดา"} + AI{"อันกิล่า"} + AL{"แอลเบเนีย"} + AM{"อาร์เมเนีย"} + AN{"เนเฮอร์แลนด์แอนทิลลิส"} + AO{"แองโกลา"} + AQ{"แอนตาร์กติกา"} + AR{"อาร์เจนตินา"} + AT{"ออสเตรีย"} + AU{"ออสเตรเลีย"} + AW{"อารูบา"} + AZ{"อาเซอร์ไบจาน"} + BA{"บอสเนียและเฮอร์เซโกวีนา"} + BB{"บาร์เบโดส"} + BD{"บังคลาเทศ"} + BE{"เบลเยียม"} + BF{"บูร์กินาฟาโซ"} + BG{"บัลแกเรีย"} + BH{"บาห์เรน"} + BI{"บุรุนดี"} + BJ{"เบนิน"} + BM{"เบอร์มิวด้า"} + BN{"บรูไน"} + BO{"โบลิเวีย"} + BR{"บราซิล"} + BS{"บาฮามาส"} + BT{"ภูฐาน"} + BW{"บอตสวานา"} + BY{"เบลารุส"} + BZ{"เบลีช"} + CA{"แคนาดา"} + CF{"สาธารณรัฐแอฟริกากลาง"} + CG{"คองโก"} + CH{"สวิตเซอร์แลนด์"} + CI{"โกตดิวัวร์"} + CL{"ชิลี"} + CM{"แคเมอรูน"} + CN{"จีน"} + CO{"โคลัมเบีย"} + CR{"คอสตาริกา"} + CU{"คิวบา"} + CV{"เคปเวิร์ด"} + CY{"ไซปรัส"} + CZ{"สาธารณรัฐเช็ก"} + DE{"เยอรมนี"} + DJ{"จิบูตี"} + DK{"เดนมาร์ก"} + DM{"โดมินิกา"} + DO{"สาธารณรัฐโดมินิกัน"} + DZ{"แอลจีเรีย"} + EC{"เอกวาดอร์"} + EE{"เอสโตเนีย"} + EG{"อียิปต์"} + EH{"ซาฮาราตะวันตก"} + ER{"เอริเทรีย"} + ES{"สเปน"} + ET{"เอธิโอเปีย"} + FI{"ฟินแลนด์"} + FJ{"ฟิจิ"} + FK{"หมู่เกาะฟอล์คแลนด์"} + FM{"ไมโครนีเซีย"} + FR{"ฝรั่งเศส"} + GA{"กาบอง"} + GD{"เกรนาดา"} + GE{"จอร์เจีย"} + GF{"เฟรนช์กีอานา"} + GH{"กาน่า"} + GL{"กรีนแลนด์"} + GM{"แกมเบีย"} + GN{"กินี"} + GP{"กัวเดอลูป"} + GQ{"อิเควทอเรียลกินี"} + GR{"กรีซ"} + GT{"กัวเตมาลา"} + GW{"กินี-บิสเซา"} + GY{"กายานา"} + HK{"ฮ่องกง เขตปกครองพิเศษประเทศจีน"} + HN{"ฮอนดูรัส"} + HR{"โครเอเชีย"} + HT{"เฮติ"} + HU{"ฮังการี"} + ID{"อินโดนีเซีย"} + IE{"ไอร์แลนด์"} + IL{"อิสราเอล"} + IN{"อินเดีย"} + IQ{"อิรัก"} + IR{"อิหร่าน"} + IS{"ไอซ์แลนด์"} + IT{"อิตาลี"} + JM{"จาเมกา"} + JO{"จอร์แดน"} + JP{"ญี่ปุ่น"} + KE{"เคนยา"} + KG{"คีร์กิซสถาน"} + KH{"กัมพูชา"} + KI{"คิริบาส"} + KM{"คอโมโรส"} + KP{"เกาหลีเหนือ"} + KR{"เกาหลีใต้"} + KW{"คูเวต"} + KY{"หมู่เกาะเคย์แมน"} + KZ{"คาซัคสถาน"} + LA{"ลาว"} + LB{"เลบานอน"} + LI{"ลิกเตนสไตน์"} + LK{"ศรีลังกา"} + LR{"ไลบีเรีย"} + LS{"เลโซโท"} + LT{"ลิทัวเนีย"} + LU{"ลักเซมเบิร์ก"} + LV{"ลัตเวีย"} + LY{"ลิเบีย"} + MA{"โมร็อกโก"} + MC{"โมนาโก"} + MD{"มอลโดวา"} + MG{"มาดากัสการ์"} + MK{"มาซิโดเนีย"} + ML{"มาลี"} + MM{"พม่า"} + MN{"มองโกเลีย"} + MO{"มาเก๊า เขตปกครองพิเศษประเทศจีน"} + MQ{"มาร์ตินีก"} + MR{"มอริเตเนีย"} + MS{"มอนต์เซร์แร็ต"} + MT{"มอลตา"} + MU{"มอริเชียส"} + MW{"มาลาวี"} + MX{"เม็กซิโก"} + MY{"มาเลเซีย"} + MZ{"โมแซมบิค"} + NA{"นามิเบีย"} + NC{"นิวแคลีโดเนีย"} + NE{"ไนเจอร์"} + NG{"ไนจีเรีย"} + NI{"นิคารากัว"} + NL{"เนเธอร์แลนด์"} + NO{"นอร์เวย์"} + NP{"เนปาล"} + NU{"นียู"} + NZ{"นิวซีแลนด์"} + OM{"โอมาน"} + PA{"ปานามา"} + PE{"เปรู"} + PF{"เฟรนช์โพลีนีเซีย"} + PG{"ปาปัวนิวกินี"} + PH{"ฟิลิปปินส์"} + PK{"ปากีสถาน"} + PL{"โปแลนด์"} + PR{"เปอร์โตริโก"} + PT{"โปรตุเกส"} + PY{"ปารากวัย"} + QA{"กาตาร์"} + RO{"โรมาเนีย"} + RU{"รัสเซีย"} + RW{"รวันดา"} + SB{"หมู่เกาะโซโลมอน"} + SC{"เซเชลส์"} + SD{"ซูดาน"} + SE{"สวีเดน"} + SG{"สิงคโปร์"} + SI{"สโลวีเนีย"} + SK{"สโลวาเกีย"} + SL{"เซียร์ราลีโอน"} + SM{"ซานมารีโน"} + SN{"เซเนกัล"} + SO{"โซมาเลีย"} + SP{"เซอร์เบีย"} + SR{"สุรินัม"} + SV{"เอลซัลวาดอร์"} + SY{"ซีเรีย"} + SZ{"สวาซิแลนด์"} + TD{"ชาด"} + TF{"อาณาเขตทางใต้ของฝรั่งเศส"} + TG{"โตโก"} + TH{"ประเทศไทย"} + TJ{"ทาจิกิสถาน"} + TK{"โทกิโล"} + TL{"ติมอร์ตะวันออก"} + TM{"เติร์กเมนิสถาน"} + TN{"ตูนิเซีย"} + TO{"ตองกา"} + TR{"ตุรกี"} + TT{"ตรินิแดดและโตเบโก"} + TW{"ไต้หวัน"} + TZ{"ทานซาเนีย"} + UA{"ยูเครน"} + UG{"อูกานดา"} + US{"สหรัฐอเมริกา"} + UY{"อุรุกวัย"} + UZ{"อุซเบกิสถาน"} + VC{"เซนต์วินเซนต์และเกรนาดีนส์"} + VE{"เวเนซุเอลา"} + VG{"บริทิชเวอร์จินไอส์แลนด์"} + VI{"ยูเอสเวอร์จินไอส์แลนด์"} + VN{"เวียดนาม"} + VU{"วานูอาตู"} + WS{"ซามัว"} + YE{"เยเมน"} + YT{"มายอต"} + YU{"ยูโกสลาเวีย"} + ZA{"แอฟริกาใต้"} + ZM{"แซมเบีย"} + ZW{"ซิมบาบเว"} } -// ShortLanguage { "tha" } - localPatternChars { "GanjkHmsSEDFwWxhKzAe" } - zoneStrings { - { - "THA", - "Thailand Time", - "THA", - "Thailand Time", - "THA", - "Bangkok", + Currencies{ + ARP{ + "ARP", + "เปโซอาร์เจนติน่า (1983-1985)", + } + ARS{ + "Arg$", + "เปโซอาร์เจนติน่า", + } + ATS{ + "ATS", + "ชิลลิงออสเตรีย", + } + AUD{ + "$A", + "เหรียญออสเตรเลีย", + } + AUP{ + "AUP", + "ปอนด์ออสเตรเลีย", + } + CAD{ + "Can$", + "เหรียญคานาดา", + } + CLP{ + "Ch$", + "เปโซชิลี", + } + ETD{ + "ETD", + "เหรียญเอธิโอเปีย", + } + EUR{ + "\u20AC", + "ยูโร", + } + FJD{ + "F$", + "เหรียญฟิจิ", + } + FJP{ + "FJP", + "ปอนด์ฟิจิ", + } + FRF{ + "FRF", + "เหรียญฝรั่งเศส", + } + GBP{ + "\u00A3", + "ปอนด์สเตอร์ลิงอังกฤษ", + } + HKD{ + "HK$", + "เหรียญฮ่องกง", + } + IBP{ + "IBP", + "ปอนด์ไอริชเหนือ", + } + IDR{ + "Rp", + "รูเปียอินโดนีเซีย", + } + IEP{ + "IR\u00A3", + "ปอนด์ไอริช", + } + ILP{ + "ILP", + "ปอนด์อิสราเอล", + } + JPY{ + "\u00A5", + "เยน", + } + MXN{ + "MEX$", + "เปโซแม็กซิโก", + } + MYR{ + "RM", + "ริงกิตมาเลเซีย", + } + NZD{ + "$NZ", + "เหรียญนิวซีแลนด์", + } + NZP{ + "NZP", + "ปอนด์นิวซีแลนด์", + } + PHP{ + "PHP", + "เปโซฟิลิปปินส์", + } + PKR{ + "Pra", + "รูปีปากีสถาน", + } + SGD{ + "S$", + "เหรียญสิงคโปร์", + } + THB{ + "฿", + "บาท", + } + TRY{ + "TRY", + "ตุรกี ลีร่า ใหม่", + } + USD{ + "US$", + "เหรียญสหรัฐ", + } + USN{ + "USN", + "เหรียญสหรัฐ (วันถัดไป)", + } + USS{ + "USS", + "เหรียญสหรัฐ (วันเดียวกัน)", + } + XAU{ + "XAU", + "ทอง", } } - LocaleScript{ - "Thai", // Script Name + ExemplarCharacters{"[ก-ฺเ-๎]"} + Languages{ + aa{"อาฟา"} + ab{"แอบกาเซีย"} + af{"แอฟริกัน"} + am{"อัมฮาริค"} + ar{"อาราบิค"} + as{"อัสสัมมิส"} + ay{"ไอมารา"} + az{"อาเซอร์ไบจานี"} + ba{"บาสช์กีร์"} + be{"บายโลรัสเซีย"} + bg{"บัลแกเรีย"} + bh{"บิฮารี"} + bi{"บิสลามา"} + bn{"เบนการี"} + bo{"ทิเบต"} + br{"บรีทัน"} + ca{"แคตาแลน"} + co{"คอร์ซิกา"} + cs{"เช็ค"} + cy{"เวลส์"} + da{"เดนมาร์ก"} + de{"เยอรมัน"} + dz{"ภูฐานี"} + el{"กรีก"} + en{"อังกฤษ"} + eo{"เอสเปอรันโต"} + es{"สเปน"} + et{"เอสโตเนีย"} + eu{"แบสก์"} + fa{"เปอร์เซีย"} + fi{"ฟิน"} + fj{"ฟิจิ"} + fo{"ฟาโรส"} + fr{"ฝรั่งเศส"} + fy{"ฟรีสแลนด์"} + ga{"ไอริช"} + gd{"สก็อตส์เกลิค"} + gl{"กะลีเชีย"} + gn{"กัวรานี"} + gu{"กูจาราติ"} + ha{"โฮซา"} + he{"ฮิบรู"} + hi{"ฮินดี"} + hr{"โครเอเทีย"} + hu{"ฮังการี"} + hy{"อาร์มีเนีย"} + ia{"อินเตอร์ลิงกวา"} + id{"อินโดนีเชีย"} + ie{"อินเตอร์ลิงค์"} + ik{"ไอนูเปียก"} + is{"ไอซ์แลนด์ดิค"} + it{"อิตาลี"} + iu{"ไอนุกติตัท"} + ja{"ญี่ปุ่น"} + jv{"ชวา"} + ka{"จอร์เจียน"} + kk{"คาซัค"} + kl{"กรีนแลนด์ดิค"} + km{"เขมร"} + kn{"กานาดา"} + ko{"เกาหลี"} + ks{"คัชมีรี"} + ku{"เคิด"} + ky{"เคอร์กิซ"} + la{"ละติน"} + ln{"ลิงกาลา"} + lo{"ลาว"} + lt{"ลิธัวเนีย"} + lv{"แลตเวีย (เลททิสช์)"} + mg{"มาลากาซี"} + mi{"เมารี"} + mk{"แมซีโดเนีย"} + ml{"มาลายาลัม"} + mn{"มองโกล"} + mo{"โมดาเวีย"} + mr{"มาราที"} + ms{"มลายู"} + mt{"มอลตา"} + my{"พม่า"} + na{"นอรู"} + ne{"เนปาล"} + nl{"ฮอลันดา"} + no{"นอร์เวย์"} + oc{"ออกซิทัน"} + om{"โอโรโม (อาฟาน)"} + or{"โอริยา"} + pa{"ปัญจาป"} + pl{"โปแลนด์"} + ps{"พาสช์โต (พุสช์โต)"} + pt{"โปรตุเกส"} + qu{"คิวชัว"} + rm{"เรโต-โรแมนซ์"} + rn{"คิรันดี"} + ro{"โรมัน"} + ru{"รัสเซีย"} + rw{"คินยาวันดา"} + sa{"สันสกฤต"} + sd{"ซินดิ"} + sg{"สันโค"} + sh{"เซอร์โบ-โครเอเทียน"} + si{"สิงหล"} + sk{"สโลวัค"} + sl{"สโลเวเนีย"} + sm{"ซามัว"} + sn{"โซนา"} + so{"โซมาลี"} + sq{"แอลเบเนีย"} + sr{"เซอร์เบีย"} + ss{"ซีสวาติ"} + st{"เซโสโท"} + su{"ซันดานีส"} + sv{"สวีเดน"} + sw{"ซวาฮิรี"} + ta{"ทมิฬ"} + te{"ทิลูกู"} + tg{"ทาจิค"} + th{"ไทย"} + ti{"ทิกรินยา"} + tk{"เติร์กเมน"} + tl{"ตากาล็อก"} + tn{"เซตสวานา"} + to{"ทองก้า"} + tr{"ตุรกี"} + ts{"ซองกา"} + tt{"ตาด"} + tw{"ทวี"} + ug{"อุยกัว"} + uk{"ยูเครน"} + ur{"อิรดู"} + uz{"อุสเบค"} + vi{"เวียดนาม"} + vo{"โวลาพุก"} + wo{"วูลอฟ"} + xh{"โซสา"} + yi{"ยีดิช"} + yo{"โยรูบา"} + za{"จวง"} + zh{"จีน"} + zu{"ซูลู"} } - ExemplarCharacters { "[:Thai:]" } - //------------------------------------------------------------ - // Rule Based Number Format Support - //------------------------------------------------------------ - -// Spellout rules for Thai. Data from Suwit Srivilairith, IBM Thailand - - SpelloutRules { - "%default:\n" - " -x: \u0e25\u0e1a>>;\n" - " x.x: <<\u0e08\u0e38\u0e14>>>;\n" - " \u0e28\u0e39\u0e19\u0e22\u0e4c; \u0e2b\u0e19\u0e36\u0e48\u0e07; \u0e2a\u0e2d\u0e07; \u0e2a\u0e32\u0e21;\n" - " \u0e2a\u0e35\u0e48; \u0e2b\u0e49\u0e32; \u0e2b\u0e01; \u0e40\u0e08\u0e47\u0e14; \u0e41\u0e1b\u0e14;\n" - " \u0e40\u0e01\u0e49\u0e32; \u0e2a\u0e34\u0e1a; \u0e2a\u0e34\u0e1a\u0e40\u0e2d\u0e47\u0e14;\n" - " \u0e2a\u0e34\u0e1a\u0e2a\u0e2d\u0e07; \u0e2a\u0e34\u0e1a\u0e2a\u0e32\u0e21;\n" - " \u0e2a\u0e34\u0e1a\u0e2a\u0e35\u0e48; \u0e2a\u0e34\u0e1a\u0e2b\u0e49\u0e32;\n" - " \u0e2a\u0e34\u0e1a\u0e2b\u0e01; \u0e2a\u0e34\u0e1a\u0e40\u0e08\u0e47\u0e14;\n" - " \u0e2a\u0e34\u0e1a\u0e41\u0e1b\u0e14; \u0e2a\u0e34\u0e1a\u0e40\u0e01\u0e49\u0e32;\n" - " 20: \u0e22\u0e35\u0e48\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" - " 30: \u0e2a\u0e32\u0e21\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" - " 40: \u0e2a\u0e35\u0e48\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" - " 50: \u0e2b\u0e49\u0e32\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" - " 60: \u0e2b\u0e01\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" - " 70: \u0e40\u0e08\u0e47\u0e14\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" - " 80: \u0e41\u0e1b\u0e14\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" - " 90: \u0e40\u0e01\u0e49\u0e32\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" - " 100: <<\u0e23\u0e49\u0e2d\u0e22[>>];\n" - " 1000: <<\u0e1e\u0e31\u0e19[>>];\n" - " 10000: <<\u0e2b\u0e21\u0e37\u0e48\u0e19[>>];\n" - " 100000: <<\u0e41\u0e2a\u0e19[>>];\n" - " 1,000,000: <<\u0e25\u0e49\u0e32\u0e19[>>];\n" - " 1,000,000,000: <<\u0e1e\u0e31\u0e19\u0e25\u0e49\u0e32\u0e19[>>];\n" - " 1,000,000,000,000: <<\u0e25\u0e49\u0e32\u0e19\u0e25\u0e49\u0e32\u0e19[>>];\n" - " 1,000,000,000,000,000: =#,##0=;\n" - "%%alt-ones:\n" - " \u0e28\u0e39\u0e19\u0e22\u0e4c;\n" - " \u0e40\u0e2d\u0e47\u0e14;\n" - " =%default=;\n" + LocaleScript{ + "Thai", } - - // Currency display names - Currencies { - THB { "\u0E3F", "\u0E1A\u0E32\u0E17" } + Version{"1.2"} + boundaries{ + line{"line_th"} + word{"word_th"} } - - // (ICU 2.6) International Calendar Data. Note, THE FORMAT OF THIS DATA WILL CHANGE IN FUTURE RELEASES. - Eras_buddhist:array { "\u0e1e.\u0e28." } - - DateTimePatterns_buddhist { - "H' \u0E19\u0E32\u0E2C\u0E34\u0E01\u0E32 'm' \u0E19\u0E32\u0E17\u0E35 'ss' \u0E27" - "\u0E34\u0E19\u0E32\u0E17\u0E35'", - "H' \u0E19\u0E32\u0E2C\u0E34\u0E01\u0E32 'm' \u0E19\u0E32\u0E17\u0E35'", - "H:mm:ss", - "H:mm", - "EEEE'\u0E17\u0E35\u0E48 'd MMMM G yyyy", - "d MMMM yyyy", - "d MMM yyyy", - "d/M/yyyy", - "{1}, {0}", + calendar{ + buddhist{ + DateTimePatterns{ + "H' นาฬิกา 'm' นาที 'ss' วินาที'", + "H' นาฬิกา 'm' นาที'", + "H:mm:ss", + "H:mm", + "EEEE'ที่ 'd MMMM G yyyy", + "d MMMM yyyy", + "d MMM yyyy", + "d/M/yyyy", + "{1}, {0}", + } + eras{ + abbreviated{ + "พ.ศ.", + } + } + } + gregorian{ + AmPmMarkers{ + "ก่อนเที่ยง", + "หลังเที่ยง", + } + DateTimePatterns{ + "H' นาฬิกา 'm' นาที 'ss' วินาที'", + "H' นาฬิกา 'm' นาที'", + "H:mm:ss", + "H:mm", + "EEEE'ที่ 'd MMMM G yyyy", + "d MMMM yyyy", + "d MMM yyyy", + "d/M/yyyy", + "{1}, {0}", + } + dayNames{ + format{ + abbreviated{ + "อา.", + "จ.", + "อ.", + "พ.", + "พฤ.", + "ศ.", + "ส.", + } + wide{ + "วันอาทิตย์", + "วันจันทร์", + "วันอังคาร", + "วันพุธ", + "วันพฤหัสบดี", + "วันศุกร์", + "วันเสาร์", + } + } + } + eras{ + abbreviated{ + "ปีก่อนคริสต์กาลที่", + "ค.ศ.", + } + } + monthNames{ + format{ + abbreviated{ + "ม.ค.", + "ก.พ.", + "มี.ค.", + "เม.ย.", + "พ.ค.", + "มิ.ย.", + "ก.ค.", + "ส.ค.", + "ก.ย.", + "ต.ค.", + "พ.ย.", + "ธ.ค.", + } + wide{ + "มกราคม", + "กุมภาพันธ์", + "มีนาคม", + "เมษายน", + "พฤษภาคม", + "มิถุนายน", + "กรกฎาคม", + "สิงหาคม", + "กันยายน", + "ตุลาคม", + "พฤศจิกายน", + "ธันวาคม", + } + } + } + } } - + localPatternChars{"GanjkHmsSEDFwWxhKzAeugXZ"} } diff --git a/icuSources/data/locales/th_TH.txt b/icuSources/data/locales/th_TH.txt index c2db8b89..b8a82550 100644 --- a/icuSources/data/locales/th_TH.txt +++ b/icuSources/data/locales/th_TH.txt @@ -1,19 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/th_TH.xml // * // *************************************************************************** - -th_TH { - Version { "2.0" } -// LocaleString { "th_TH" } - NumberPatterns { +th_TH{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "\u00A4#,##0.00;\u00A4-#,##0.00", + "¤#,##0.00;¤-#,##0.00", "#,##0%", "#E0", } -// ShortCountry { "THA" } - LocaleID:int { 0x041e } + Version{"1.2"} } diff --git a/icuSources/data/locales/th_TH_TRADITIONAL.txt b/icuSources/data/locales/th_TH_TRADITIONAL.txt index f4cb8fa6..b250d87f 100644 --- a/icuSources/data/locales/th_TH_TRADITIONAL.txt +++ b/icuSources/data/locales/th_TH_TRADITIONAL.txt @@ -1,14 +1,13 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: deprecatedList.xml // * // *************************************************************************** - -th_TH_TRADITIONAL { - Version { "1.0" } - - // International Calendars Data. - // NOTE (ICU 2.6) - the format of this data WILL CHANGE in future releases. - DefaultCalendar { "buddhist" } +th_TH_TRADITIONAL{ + calendar{ + default{"buddhist"} + } } diff --git a/icuSources/data/locales/ti.txt b/icuSources/data/locales/ti.txt index dcf02f15..2201440a 100644 --- a/icuSources/data/locales/ti.txt +++ b/icuSources/data/locales/ti.txt @@ -1,349 +1,92 @@ -// *************************************************************************** -// * -// * Copyright (C) 2001-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** -// * Tigrigna language locale. -// * Contributed by Daniel Yacob , Ge'ez Frontier Foundation - -ti{ - Version{ "2.0" } - DayAbbreviations { - "\u1230\u1295\u1260", - "\u1230\u1291\u12ED", - "\u1220\u1209\u1235", - "\u1228\u1261\u12D5", - "\u1283\u1219\u1235", - "\u12D3\u122D\u1262", - "\u1240\u12F3\u121D", - } - DayNames { - "\u1230\u1295\u1260\u1275", - "\u1230\u1291\u12ED", - "\u1220\u1209\u1235", - "\u1228\u1261\u12D5", - "\u1283\u1219\u1235", - "\u12D3\u122D\u1262", - "\u1240\u12F3\u121D", - } - MonthAbbreviations { - "\u1303\u1295\u12E9", - "\u134C\u1265\u1229", - "\u121B\u122D\u127D", - "\u12A4\u1355\u1228", - "\u121C\u12ED", - "\u1301\u1295", - "\u1301\u120B\u12ED", - "\u12A6\u1308\u1235", - "\u1234\u1355\u1274", - "\u12A6\u12AD\u1270", - "\u1296\u126C\u121D", - "\u12F2\u1234\u121D", - } - MonthNames { - "\u1303\u1295\u12E9\u12C8\u122A", - "\u134C\u1265\u1229\u12C8\u122A", - "\u121B\u122D\u127D", - "\u12A4\u1355\u1228\u120D", - "\u121C\u12ED", - "\u1301\u1295", - "\u1301\u120B\u12ED", - "\u12A6\u1308\u1235\u1275", - "\u1234\u1355\u1274\u121D\u1260\u122D", - "\u12A6\u12AD\u1270\u12CD\u1260\u122D", - "\u1296\u126C\u121D\u1260\u122D", - "\u12F2\u1234\u121D\u1260\u122D", - } - AmPmMarkers { - "\u1295\u1309\u1206 \u1230\u12D3\u1270", - "\u12F5\u1215\u122D \u1230\u12D3\u1275", - } - Eras { - "\u12D3/\u12D3", - "\u12D3/\u121D" - } - DateTimeElements:intvector { - 7, - 1, - } - Languages { - aa { "\u12A0\u134B\u122D\u129B" } - ab { "\u12A0\u1265\u1210\u12DA\u129B" } - af { "\u12A0\u134D\u122A\u1243\u1295\u1235\u129B" } - am { "\u12A0\u121D\u1210\u1228\u129B" } - ar { "\u12D0\u122D\u1262\u129B" } - as { "\u12A0\u1233\u121C\u12DB\u12CA" } - ay { "\u12A0\u12EB\u121B\u122D\u129B" } - az { "\u12A0\u12DC\u122D\u1263\u12ED\u1303\u1295\u129B" } - ba { "\u1263\u1235\u12AA\u122D\u129B" } - be { "\u1264\u120B\u122B\u123B\u129B" } - bg { "\u1261\u120D\u130B\u122A\u129B" } - bh { "\u1262\u1203\u122A" } - bi { "\u1262\u1235\u120B\u121D\u129B" } - bn { "\u1260\u1295\u130B\u120A\u129B" } - bo { "\u1275\u1260\u1275\u1295\u129B" } - br { "\u1265\u122C\u1276\u1295\u129B" } - ca { "\u12AB\u1273\u120B\u1295\u129B" } - co { "\u12AE\u122D\u1232\u12AB\u129B" } - cs { "\u127C\u12AD\u129B" } - cy { "\u12C8\u120D\u123D" } - da { "\u12F4\u1292\u123D" } - de { "\u1300\u122D\u1218\u1295" } - dz { "\u12F5\u12DE\u1295\u130D\u12BB\u129B" } - el { "\u130D\u122A\u12AD\u129B" } - en { "\u12A5\u1295\u130D\u120A\u12DD\u129B" } - eo { "\u12A4\u1235\u1350\u122B\u1295\u1276" } - es { "\u1235\u1353\u1292\u123D" } - et { "\u12A4\u1235\u1276\u1292\u12A0\u1295" } - eu { "\u1263\u1235\u12AD\u129B" } - fa { "\u1350\u122D\u1232\u12EB\u129B" } - fi { "\u134A\u1292\u123D" } - fj { "\u134A\u1302\u129B" } - fo { "\u134B\u122E\u129B" } - fr { "\u1348\u1228\u1295\u1233\u12ED\u129B" } - fy { "\u134D\u122A\u1235\u129B" } - ga { "\u12A0\u12ED\u122A\u123D" } - gd { "\u12A5\u1235\u12AE\u1275\u1235 \u130C\u120D\u12AD\u129B" } - gl { "\u130B\u1208\u130B\u129B" } - gn { "\u1313\u122B\u1292\u129B" } - gu { "\u1309\u1303\u122D\u1272\u129B" } - ha { "\u1203\u12CD\u1233\u129B" } - he { "\u12D5\u1265\u122B\u1235\u1325" } - hi { "\u1210\u1295\u12F5\u129B" } - hr { "\u12AD\u122E\u123D\u12EB\u1295\u129B" } - hu { "\u1200\u1295\u130B\u122A\u129B" } - hy { "\u12A0\u122D\u1218\u1293\u12CA" } - ia { "\u12A2\u1295\u1274\u122D\u120A\u1295\u1313" } - id { "\u12A5\u1295\u12F6\u1292\u1232\u129B" } - ie { "\u12A5\u1295\u1270\u122D\u120A\u1295\u130D\u12C8" } - ik { "\u12A5\u1291\u1352\u12EB\u1245\u129B" } - is { "\u12A0\u12ED\u1235\u120B\u1295\u12F5\u129B" } - it { "\u1323\u120A\u12EB\u1295\u129B" } - iu { "\u12A5\u1291\u12AD\u1272\u1271\u1275\u129B" } - ja { "\u1303\u1353\u1295\u129B" } - jv { "\u1303\u126B\u1295\u129B" } - ka { "\u130A\u12EE\u122D\u130A\u12EB\u1295" } - kk { "\u12AB\u12DB\u12AD\u129B" } - kl { "\u12AB\u120B\u120A\u1231\u1275\u129B" } - km { "\u12AD\u1218\u122D\u129B" } - kn { "\u12AB\u1293\u12F3\u129B" } - ko { "\u12AE\u122A\u12EB\u129B" } - ks { "\u12AB\u123D\u121A\u122D\u129B" } - ku { "\u12A9\u122D\u12F5\u123D\u129B" } - ky { "\u12AA\u122D\u130A\u12DD\u129B" } - la { "\u120B\u1272\u1295\u129B" } - ln { "\u120A\u1295\u130B\u120B\u129B" } - lo { "\u120B\u12CD\u1235\u129B" } - lt { "\u120A\u1271\u12A0\u1292\u12EB\u1295" } - lv { "\u120B\u1275\u126A\u12EB\u1295" } - mg { "\u121B\u120B\u130B\u1235\u129B" } - mi { "\u121B\u12EE\u122A\u129B" } - mk { "\u121B\u12A8\u12F6\u1292\u129B" } - ml { "\u121B\u120B\u12EB\u120B\u121D\u129B" } - mn { "\u121E\u1295\u130E\u120B\u12CA\u129B" } - mo { "\u121E\u120D\u12F3\u126B\u12CA\u1293" } - mr { "\u121B\u122B\u12DA\u129B" } - ms { "\u121B\u120B\u12ED\u129B" } - mt { "\u121B\u120D\u1272\u1235\u129B" } - my { "\u1261\u122D\u121B\u129B" } - na { "\u1293\u12A1\u1229" } - ne { "\u1294\u1353\u120A\u129B" } - nl { "\u12F0\u127D" } - no { "\u1296\u122D\u12CC\u1302\u12EB\u1295" } - oc { "\u12A6\u12AA\u1273\u1295\u129B" } - om { "\u12A6\u122E\u121D\u129B" } - or { "\u12A6\u122A\u12EB\u129B" } - pa { "\u1353\u1295\u1303\u1262\u129B" } - pl { "\u1356\u120A\u123D" } - ps { "\u1351\u123D\u1276\u129B" } - pt { "\u1356\u122D\u1271\u130B\u120A\u129B" } - qu { "\u12B5\u127F\u129B" } - rm { "\u122E\u121B\u1295\u1235"} - rn { "\u1229\u1295\u12F2\u129B" } - ro { "\u122E\u121B\u1292\u12EB\u1295" } - ru { "\u122B\u123D\u129B" } - rw { "\u12AA\u1295\u12EB\u122D\u12CB\u1295\u12F5\u129B" } - sa { "\u1233\u1295\u1235\u12AD\u122A\u1275\u129B" } - sd { "\u1232\u1295\u12F5\u1202\u129B" } - sg { "\u1233\u1295\u130E\u129B" } - sh { "\u0073\u0068"} - si { "\u1235\u1295\u1203\u120D\u129B" } - sk { "\u1235\u120E\u126B\u12AD\u129B" } - sl { "\u1235\u120E\u126A\u129B" } - sm { "\u1233\u121E\u12A0\u129B" } - sn { "\u123E\u1293\u129B" } - so { "\u1231\u121B\u120D\u129B" } - sq { "\u120D\u1264\u1292\u129B" } - sr { "\u1230\u122D\u1262\u129B" } - ss { "\u1235\u12CB\u1272\u129B" } - st { "\u1236\u12DE\u129B" } - su { "\u1231\u12F3\u1295\u129B" } - sv { "\u1235\u12CA\u12F5\u1295\u129B" } - sw { "\u1235\u12CB\u1202\u120A\u129B" } - ta { "\u1273\u121A\u120D\u129B" } - te { "\u1270\u1209\u1309\u129B" } - tg { "\u1273\u1302\u12AA\u129B" } - th { "\u1273\u12ED\u129B" } - ti { "\u1275\u130D\u122D\u129B" } - tk { "\u1271\u122D\u12AD\u1218\u1295\u129B" } - tl { "\u1273\u130B\u120E\u1308\u129B" } - tn { "\u133D\u12CB\u1293\u12CA\u129B" } - to { "\u1276\u1295\u130B" } - tr { "\u1271\u122D\u12AD\u129B" } - ts { "\u133E\u1295\u130B\u129B" } - tt { "\u1273\u1273\u122D\u129B" } - tw { "\u1275\u12CA\u129B" } - ug { "\u12A1\u12CA\u130D\u1201\u122D\u129B" } - uk { "\u12E9\u12AD\u1228\u1292\u129B" } - ur { "\u12A1\u122D\u12F1\u129B" } - uz { "\u12A1\u12DD\u1260\u12AD\u129B" } - vi { "\u126A\u1275\u1293\u121D\u129B" } - vo { "\u126E\u120B\u1351\u12AD\u129B" } - wo { "\u12CE\u120E\u134D\u129B" } - xh { "\u12DE\u1233\u129B" } - yi { "\u12ED\u12F2\u123B\u12CA\u129B" } - yo { "\u12EE\u1229\u1263\u12CA\u129B" } - za { "\u12E1\u12CB\u1295\u130D\u129B" } - zh { "\u127B\u12ED\u1295\u129B" } - zu { "\u12D9\u1209\u129B" } - gez { "\u130D\u12D5\u12DD\u129B" } - tig { "\u1275\u130D\u1228" } - sid { "\u1232\u12F3\u121D\u129B" } - } - Countries { - AD { "\u12A0\u1295\u12F6\u122B" } - AE { "\u12E8\u1270\u1263\u1260\u1229\u1275 \u12A0\u1228\u1265 \u12A4\u121D\u122C\u1275\u1235" } - AL { "\u12A0\u120D\u1263\u1292\u12EB" } - AM { "\u12A0\u122D\u121C\u1292\u12EB" } - AN { "\u1294\u12D8\u122D\u120B\u1295\u12F5\u1235 \u12A0\u1295\u1272\u120D\u1235" } - AR { "\u12A0\u122D\u1300\u1295\u1272\u1293" } - AT { "\u12A6\u1235\u1275\u122A\u12EB" } - AU { "\u12A0\u12CD\u1235\u1275\u122C\u120A\u12EB" } - AZ { "\u12A0\u12D8\u122D\u1263\u1303\u1295" } - BA { "\u1266\u1235\u1292\u12EB \u12A5\u1293 \u1204\u122D\u12DE\u130E\u126A\u1292\u12EB" } - BB { "\u1263\u122D\u1264\u12F6\u1235" } - BE { "\u1264\u120D\u1304\u121D" } - BG { "\u1261\u120D\u130C\u122A\u12EB" } - BH { "\u1263\u1205\u122C\u1295" } - BM { "\u1264\u122D\u1219\u12F3" } - BO { "\u1266\u120A\u126A\u12EB" } - BR { "\u1265\u122B\u12DA\u120D" } - BT { "\u1261\u1205\u1273\u1295" } - BY { "\u1264\u120B\u1229\u1235" } - BZ { "\u1264\u120A\u12D8" } - CD { "\u12AE\u1295\u130E" } - CF { "\u12E8\u1218\u12AB\u12A8\u1208\u129B\u12CD \u12A0\u134D\u122A\u12AB \u122A\u1350\u1265\u120A\u12AD" } - CH { "\u1235\u12CA\u12D8\u122D\u120B\u1295\u12F5" } - CL { "\u127A\u120A" } - CM { "\u12AB\u121C\u1229\u1295" } - CN { "\u127B\u12ED\u1293" } - CO { "\u12AE\u120E\u121D\u1262\u12EB" } - CV { "\u12AC\u1355 \u126C\u122D\u12F4" } - CY { "\u1233\u12ED\u1355\u1228\u1235" } - CZ { "\u127C\u12AD \u122A\u1351\u1265\u120A\u12AD" } - DE { "\u1300\u122D\u1218\u1295" } - DK { "\u12F4\u1295\u121B\u122D\u12AD" } - DM { "\u12F6\u121A\u1292\u12AB" } - DO { "\u12F6\u121A\u1292\u12AD \u122A\u1351\u1265\u120A\u12AD" } - DZ { "\u12A0\u120D\u1304\u122A\u12EB" } - EC { "\u12A2\u12B3\u12F6\u122D" } - EE { "\u12A4\u1235\u1276\u1292\u12EB" } - EG { "\u130D\u1265\u133D" } - EH { "\u121D\u12D5\u122B\u1263\u12CA \u1233\u1205\u122B" } - ER { "\u12A4\u122D\u1275\u122B" } - ES { "\u1235\u1354\u1295" } - ET { "\u12A2\u1275\u12EE\u1335\u12EB" } - FI { "\u134A\u1295\u120B\u1295\u12F5" } - FJ { "\u134A\u1302" } - FM { "\u121A\u12AD\u122E\u1294\u12E2\u12EB" } - GB { "\u12A5\u1295\u130D\u120A\u12DD" } - GE { "\u1306\u122D\u1302\u12EB" } - GF { "\u12E8\u1348\u1228\u1295\u1233\u12ED \u1309\u12CA\u12A0\u1293" } - GM { "\u130B\u121D\u1262\u12EB" } - GN { "\u130A\u1292" } - GQ { "\u12A2\u12B3\u1276\u122A\u12EB\u120D \u130A\u1292" } - GR { "\u130D\u122A\u12AD" } - GW { "\u1262\u1233\u12CE"} - GY { "\u1309\u12EB\u1293" } - HK { "\u1206\u1295\u130D \u12AE\u1295\u130D" } - HR { "\u12AD\u122E\u12A4\u123D\u12EB" } - HT { "\u1200\u12ED\u1272" } - HU { "\u1200\u1295\u130B\u122A" } - ID { "\u12A2\u1295\u12F6\u1294\u12E2\u12EB" } - IE { "\u12A0\u12E8\u122D\u120B\u1295\u12F5" } - IL { "\u12A5\u1235\u122B\u12A4\u120D" } - IN { "\u1205\u1295\u12F5" } - IQ { "\u12A2\u122B\u1245" } - IS { "\u12A0\u12ED\u1235\u120B\u1295\u12F5" } - IT { "\u1323\u120A\u12EB\u1295" } - JM { "\u1303\u121B\u12ED\u12AB" } - JO { "\u1306\u122D\u12F3\u1295" } - JP { "\u1303\u1353\u1295" } - KH { "\u12AB\u121D\u1266\u12F2\u12EB" } - KM { "\u12AE\u121E\u122E\u1235" } - KP { "\u12F0\u1261\u1265 \u12AE\u122A\u12EB" } - KR { "\u1230\u121C\u1295 \u12AE\u122A\u12EB" } - KW { "\u12AD\u12CC\u1275" } - LB { "\u120A\u1263\u1296\u1235" } - LT { "\u120A\u1271\u12CC\u1292\u12EB" } - LV { "\u120B\u1275\u126A\u12EB" } - LY { "\u120A\u1262\u12EB" } - MA { "\u121E\u122E\u12AE" } - MD { "\u121E\u120D\u12F6\u126B" } - MK { "\u121B\u12A8\u12F6\u1292\u12EB" } - MN { "\u121E\u1295\u130E\u120A\u12EB" } - MO { "\u121B\u12AB\u12CE" } - MR { "\u121E\u122A\u1274\u1292\u12EB" } - MT { "\u121B\u120D\u1273" } - MU { "\u121B\u1229\u1238\u1235" } - MX { "\u121C\u12AD\u1232\u12AE" } - MY { "\u121B\u120C\u12E2\u12EB" } - NA { "\u1293\u121A\u1262\u12EB" } - NC { "\u1292\u12CD \u12AB\u120C\u12F6\u1292\u12EB" } - NG { "\u1293\u12ED\u1304\u122A\u12EB" } - NL { "\u1294\u12D8\u122D\u120B\u1295\u12F5" } - NO { "\u1296\u122D\u12CC" } - NP { "\u1294\u1353\u120D" } - NZ { "\u1292\u12CD \u12DA\u120B\u1295\u12F5" } - PE { "\u1354\u1229" } - PF { "\u12E8\u1348\u1228\u1295\u1233\u12ED \u1356\u120A\u1294\u12E2\u12EB" } - PG { "\u1353\u1351\u12CB \u1292\u12CD \u130A\u1292" } - PL { "\u1356\u120B\u1295\u12F5" } - PR { "\u1356\u122D\u1273 \u122A\u12AE" } - RO { "\u122E\u121C\u1292\u12EB" } - RU { "\u122B\u123A\u12EB" } - SA { "\u1233\u12CD\u12F5\u12A0\u1228\u1262\u12EB" } - SD { "\u1231\u12F3\u1295" } - SE { "\u1235\u12CA\u12F5\u1295" } - SG { "\u1232\u1295\u130B\u1356\u122D" } - SI { "\u1235\u120E\u126C\u1292\u12EB" } - SK { "\u1235\u120E\u126B\u12AA\u12EB" } - SN { "\u1234\u1294\u130B\u120D" } - SO { "\u1231\u121B\u120C" } - SP { "\u1230\u122D\u1262\u12EB" } - SY { "\u1232\u122A\u12EB" } - TD { "\u127B\u12F5" } - TF { "\u12E8\u1348\u1228\u1295\u1233\u12ED \u12F0\u1261\u1263\u12CA \u130D\u12DB\u1276\u127D" } - TH { "\u1273\u12ED\u120B\u1295\u12F5" } - TJ { "\u1273\u1303\u12AA\u1235\u1273\u1295" } - TL { "\u121D\u1235\u122B\u1245 \u1272\u121E\u122D" } - TN { "\u1271\u1292\u12DA\u12EB" } - TR { "\u1271\u122D\u12AD" } - TT { "\u1275\u122A\u1292\u12F3\u12F5 \u12A5\u1293 \u1276\u1263\u130E" } - TZ { "\u1273\u1295\u12DB\u1292\u12EB" } - UG { "\u12E9\u130B\u1295\u12F3" } - US { "\u12A0\u121C\u122A\u12AB" } - UZ { "\u12E9\u12DD\u1260\u12AA\u1235\u1273\u1295" } - VE { "\u126C\u1295\u12D9\u12CC\u120B" } - VG { "\u12E8\u12A5\u1295\u130D\u120A\u12DD \u12F5\u1295\u130D\u120D \u12F0\u1234\u1276\u127D" } - VI { "\u12E8\u12A0\u121C\u122A\u12AB \u1268\u122D\u1302\u1295 \u12F0\u1234\u1276\u127D" } - YE { "\u12E8\u1218\u1295" } - YU { "\u12E9\u130E\u12DD\u120B\u126A\u12EB" } - ZA { "\u12F0\u1261\u1265 \u12A0\u134D\u122A\u12AB" } - ZM { "\u12DB\u121D\u1262\u12EB" } - } - LocaleScript{ "Ethi", } - ExemplarCharacters{"[:Ethi:]"} -} - +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ti.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/ti.xml + */ +ti{ + Countries:alias{"am"} + ExemplarCharacters{"[:Ethi:]"} + Languages:alias{"am"} + LocaleScript{ + "Ethi", + } + Version{"1.2"} + calendar{ + gregorian{ + AmPmMarkers{ + "ንጉሆ ሰዓተ", + "ድሕር ሰዓት", + } + DateTimeElements:intvector{ + 7, + 1, + } + dayNames{ + format{ + abbreviated{ + "ሰንበ", + "ሰኑይ", + "ሠሉስ", + "ረቡዕ", + "ኃሙስ", + "ዓርቢ", + "ቀዳም", + } + wide{ + "ሰንበት", + "ሰኑይ", + "ሠሉስ", + "ረቡዕ", + "ኃሙስ", + "ዓርቢ", + "ቀዳም", + } + } + } + eras{ + abbreviated{ + "ዓ/ዓ", + "ዓ/ም", + } + } + monthNames{ + format{ + abbreviated{ + "ጃንዩ", + "ፌብሩ", + "ማርች", + "ኤፕረ", + "ሜይ", + "ጁን", + "ጁላይ", + "ኦገስ", + "ሴፕቴ", + "ኦክተ", + "ኖቬም", + "ዲሴም", + } + wide{ + "ጃንዩወሪ", + "ፌብሩወሪ", + "ማርች", + "ኤፕረል", + "ሜይ", + "ጁን", + "ጁላይ", + "ኦገስት", + "ሴፕቴምበር", + "ኦክተውበር", + "ኖቬምበር", + "ዲሴምበር", + } + } + } + } + } +} diff --git a/icuSources/data/locales/ti_ER.txt b/icuSources/data/locales/ti_ER.txt index b054cbdd..d7a992a9 100644 --- a/icuSources/data/locales/ti_ER.txt +++ b/icuSources/data/locales/ti_ER.txt @@ -1,94 +1,96 @@ -// *************************************************************************** -// * -// * Copyright (C) 2001-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** -// * Tigrigna language locale for Eritrea. -// * Contributed by Daniel Yacob , Ge'ez Frontier Foundation - -ti_ER{ - Version{ "2.0" } - DayAbbreviations { - "\u1230\u1295\u1260", - "\u1230\u1291\u12ED", - "\u1230\u1209\u1235", - "\u1228\u1261\u12D5", - "\u1213\u1219\u1235", - "\u12D3\u122D\u1262", - "\u1240\u12F3\u121D", - } - DayNames { - "\u1230\u1295\u1260\u1275", - "\u1230\u1291\u12ED", - "\u1230\u1209\u1235", - "\u1228\u1261\u12D5", - "\u1213\u1219\u1235", - "\u12D3\u122D\u1262", - "\u1240\u12F3\u121D", - } - MonthAbbreviations { - "\u1325\u122A", - "\u1208\u12AB\u1272", - "\u1218\u130B\u1262", - "\u121A\u12EB\u12DD", - "\u130D\u1295\u1266", - "\u1230\u1290", - "\u1213\u121D\u1208", - "\u1290\u1213\u1230", - "\u1218\u1235\u12A8", - "\u1325\u1245\u121D", - "\u1215\u12F3\u122D", - "\u1273\u1215\u1233", - } - MonthNames { - "\u1325\u122A", - "\u1208\u12AB\u1272\u1275", - "\u1218\u130B\u1262\u1275", - "\u121A\u12EB\u12DD\u12EB", - "\u130D\u1295\u1266\u1275", - "\u1230\u1290", - "\u1213\u121D\u1208", - "\u1290\u1213\u1230", - "\u1218\u1235\u12A8\u1228\u121D", - "\u1325\u1245\u121D\u1272", - "\u1215\u12F3\u122D", - "\u1273\u1215\u1233\u1235", - } - DateTimePatterns { - "h:mm:ss a", - "h:mm:ss a", - "h:mm:ss a", - "h:mm a", - "EEEE\u1361 dd MMMM \u1218\u12D3\u120D\u1272 yyyy G", - "dd MMMM yyyy", - "dd-MMM-yy", - "dd/MM/yy", - "{1} {0}", - } - // Measurement { "Metric" } -// NumberElements { -// ".", -// ",", -// ";", -// "%", -// "0", -// "#", -// "-", -// "E", -// "\u2030", -// "\u221E", -// "\uFFFD", -// } - NumberPatterns { - "#,##0.###;-#,##0.###", - "\u00A4#,##0.00;-\u00A4#,##0.00", - "#,##0%", - "#E0", - } - - // Currency display names - Currencies { - ERN { "$", "ERN" } - } -} +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ti_ER.xml +// * +// *************************************************************************** +ti_ER{ + Currencies{ + ERN{ + "$", + "ERN", + } + USD{ + "US$", + "USD", + } + } + NumberPatterns{ + "#,##0.###;-#,##0.###", + "¤#,##0.00;-¤#,##0.00", + "#,##0%", + "#E0", + } + Version{"1.2"} + calendar{ + gregorian{ + DateTimePatterns{ + "h:mm:ss a", + "h:mm:ss a", + "h:mm:ss a", + "h:mm a", + "EEEE፡ dd MMMM መዓልቲ yyyy G", + "dd MMMM yyyy", + "dd-MMM-yy", + "dd/MM/yy", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "ሰንበ", + "ሰኑይ", + "ሰሉስ", + "ረቡዕ", + "ሓሙስ", + "ዓርቢ", + "ቀዳም", + } + wide{ + "ሰንበት", + "ሰኑይ", + "ሰሉስ", + "ረቡዕ", + "ሓሙስ", + "ዓርቢ", + "ቀዳም", + } + } + } + monthNames{ + format{ + abbreviated{ + "ጥሪ", + "ለካቲ", + "መጋቢ", + "ሚያዝ", + "ግንቦ", + "ሰነ", + "ሓምለ", + "ነሓሰ", + "መስከ", + "ጥቅም", + "ሕዳር", + "ታሕሳ", + } + wide{ + "ጥሪ", + "ለካቲት", + "መጋቢት", + "ሚያዝያ", + "ግንቦት", + "ሰነ", + "ሓምለ", + "ነሓሰ", + "መስከረም", + "ጥቅምቲ", + "ሕዳር", + "ታሕሳስ", + } + } + } + } + } +} diff --git a/icuSources/data/locales/ti_ET.txt b/icuSources/data/locales/ti_ET.txt index a4450a51..c3676107 100644 --- a/icuSources/data/locales/ti_ET.txt +++ b/icuSources/data/locales/ti_ET.txt @@ -1,53 +1,42 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 2001-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/ti_ET.xml // * // *************************************************************************** -// * Tigrigna language locale for Ethiopia. -// * Contributed by Daniel Yacob , Ge'ez Frontier Foundation - -ti_ET { - Version{ "2.0" } - DateTimePatterns { - "h:mm:ss a", - "h:mm:ss a", - "h:mm:ss a", - "h:mm a", - "EEEE\u1363 dd MMMM \u1218\u12D3\u120D\u1272 yyyy G", - "dd MMMM yyyy", - "dd-MMM-yy", - "dd/MM/yy", - "{1} {0}", +ti_ET{ + Currencies{ + ETB{ + "$", + "ETB", + } + USD{ + "US$", + "USD", + } } - // Measurement { "Metric" } -// NumberElements { -// ".", -// ",", -// ";", -// "%", -// "0", -// "#", -// "-", -// "E", -// "\u2030", -// "\u221E", -// "\uFFFD", -// } - NumberPatterns { + NumberPatterns{ "#,##0.###;-#,##0.###", - "\u00A4#,##0.00;-\u00A4#,##0.00", + "¤#,##0.00;-¤#,##0.00", "#,##0%", "#E0", } - // PaperSize { - // Height { "297" } - // Width { "210" } - // Units { "mm" } - // } - - // Currency display names - Currencies { - ETB { "$", "ETB" } + Version{"1.2"} + calendar{ + gregorian{ + DateTimePatterns{ + "h:mm:ss a", + "h:mm:ss a", + "h:mm:ss a", + "h:mm a", + "EEEE፣ dd MMMM መዓልቲ yyyy G", + "dd MMMM yyyy", + "dd-MMM-yy", + "dd/MM/yy", + "{1} {0}", + } + } } } diff --git a/icuSources/data/locales/tr.txt b/icuSources/data/locales/tr.txt index c4c3ab1c..b977cc9f 100644 --- a/icuSources/data/locales/tr.txt +++ b/icuSources/data/locales/tr.txt @@ -1,93 +1,2051 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2005 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: /Users/deglocal/Desktop/Totoro/icucvs/locale/common/main//tr.xml // * // *************************************************************************** - -tr { - Version{ "2.0" } - // According to Nurdan Mete from IBM Turkey, the following would be the correct - // sorting order for Turkish - CollationElements { - Version { "2" } - Sequence { "& C < c\u0327 <<< C\u0327" - "& G < g\u0306 <<< G\u0306" - "& H < \u0131 <<< I < i <<< \u0130" - "& O < o\u0308 <<< O\u0308" - "& S < s\u0327 <<< S\u0327" - "& U < u\u0308 <<< U\u0308" } - } - Countries { - TR { "T\u00FCrkiye" } - } - DateTimeElements:intvector { - 2, - 1, - } - DateTimePatterns { - "HH:mm:ss z", - "HH:mm:ss z", - "HH:mm:ss", - "HH:mm", - "dd MMMM yyyy EEEE", - "dd MMMM yyyy EEEE", - "dd.MMM.yyyy", - "dd.MM.yyyy", - "{1} {0}", +/** + * ICU source: /Users/deglocal/Desktop/Totoro/icucvs/icu/source/data/xml/main/tr.xml + */ +tr{ + Countries{ + AD{"Andora"} + AE{"Birleşik Arap Emirlikleri"} + AF{"Afganistan"} + AG{"Antigua ve Barbuda"} + AI{"Anguilla"} + AL{"Arnavutluk"} + AM{"Ermenistan"} + AN{"Hollanda Antilleri"} + AO{"Angola"} + AQ{"Antarktika"} + AR{"Arjantin"} + AS{"Amerikan Samoası"} + AT{"Avusturya"} + AU{"Avustralya"} + AW{"Aruba"} + AZ{"Azerbaycan"} + BA{"Bosna Hersek"} + BB{"Barbados"} + BD{"Bangladeş"} + BE{"Belçika"} + BF{"Burkina Faso"} + BG{"Bulgaristan"} + BH{"Bahreyn"} + BI{"Burundi"} + BJ{"Benin"} + BM{"Bermuda"} + BN{"Brunei"} + BO{"Bolivya"} + BR{"Brezilya"} + BS{"Bahamalar"} + BT{"Bhutan"} + BV{"Bouvet Adası"} + BW{"Botsvana"} + BY{"Beyaz Rusya"} + BZ{"Belize"} + CA{"Kanada"} + CC{"Cocos (Keeling) Adaları"} + CD{"Kongo Demokratik Cumhuriyeti"} + CF{"Orta Afrika Cumhuriyeti"} + CG{"Kongo"} + CH{"İsviçre"} + CI{"Fildişi Sahilleri"} + CK{"Cook Adaları"} + CL{"Şili"} + CM{"Kamerun"} + CN{"Çin"} + CO{"Kolombiya"} + CR{"Kosta Rika"} + CU{"Küba"} + CV{"Cape Verde"} + CX{"Christmas Adası"} + CY{"Kıbrıs"} + CZ{"Çek Cumhuriyeti"} + DE{"Almanya"} + DJ{"Cibuti"} + DK{"Danimarka"} + DM{"Dominik"} + DO{"Dominik Cumhuriyeti"} + DZ{"Cezayir"} + EC{"Ekvator"} + EE{"Estonya"} + EG{"Mısır"} + EH{"Batı Sahara"} + ER{"Eritre"} + ES{"İspanya"} + ET{"Etiyopya"} + FI{"Finlandiya"} + FJ{"Fiji"} + FK{"Falkland Adaları (Malvinalar)"} + FM{"Mikronezya Federal Eyaletleri"} + FO{"Faroe Adaları"} + FR{"Fransa"} + GA{"Gabon"} + GB{"Birleşik Krallık"} + GD{"Granada"} + GE{"Gürcistan"} + GF{"Fransız Guyanası"} + GH{"Gana"} + GI{"Cebelitarık"} + GL{"Grönland"} + GM{"Gambia"} + GN{"Gine"} + GP{"Guadeloupe"} + GQ{"Ekvator Ginesi"} + GR{"Yunanistan"} + GS{"Güney Georgia ve Güney Sandwich Adaları"} + GT{"Guatemala"} + GU{"Guam"} + GW{"Gine-Bissau"} + GY{"Guyana"} + HK{"Hong Kong SAR - Çin"} + HM{"Heard Adası ve McDonald Adaları"} + HN{"Honduras"} + HR{"Hırvatistan"} + HT{"Haiti"} + HU{"Macaristan"} + ID{"Endonezya"} + IE{"İrlanda"} + IL{"İsrail"} + IN{"Hindistan"} + IO{"Hint Okyanusu İngiliz Bölgesi"} + IQ{"Irak"} + IR{"İran"} + IS{"İzlanda"} + IT{"İtalya"} + JM{"Jamaika"} + JO{"Ürdün"} + JP{"Japonya"} + KE{"Kenya"} + KG{"Kırgızistan"} + KH{"Kamboçya"} + KI{"Kiribati"} + KM{"Komorlar"} + KN{"Saint Kittler ve Neviler"} + KP{"Kuzey Kore"} + KR{"Güney Kore"} + KW{"Kuveyt"} + KY{"Kayman Adaları"} + KZ{"Kazakistan"} + LA{"Laos"} + LB{"Lübnan"} + LC{"Saint Lucia"} + LI{"Liechtenstein"} + LK{"Sri Lanka"} + LR{"Liberya"} + LS{"Lesotho"} + LT{"Litvanya"} + LU{"Lüksemburg"} + LV{"Letonya"} + LY{"Libya"} + MA{"Fas"} + MC{"Monako"} + MD{"Moldovya Cumhuriyeti"} + MG{"Madagaskar"} + MH{"Marshall Adaları"} + MK{"Makedonya Cumhuriyeti"} + ML{"Mali"} + MM{"Myanmar"} + MN{"Moğolistan"} + MO{"Makao S.A.R. Çin"} + MP{"Kuzey Mariana Adaları"} + MQ{"Martinik"} + MR{"Moritanya"} + MS{"Montserrat"} + MT{"Malta"} + MU{"Mauritius"} + MV{"Maldivler"} + MW{"Malavi"} + MX{"Meksika"} + MY{"Malezya"} + MZ{"Mozambik"} + NA{"Namibya"} + NC{"Yeni Kaledonya"} + NE{"Nijer"} + NF{"Norfolk Adası"} + NG{"Nijerya"} + NI{"Nikaragua"} + NL{"Hollanda"} + NO{"Norveç"} + NP{"Nepal"} + NR{"Nauru Adası"} + NU{"Niue Adaları"} + NZ{"Yeni Zelanda"} + OM{"Umman"} + PA{"Panama"} + PE{"Peru"} + PF{"Fransız Polinezyası"} + PG{"Papua Yeni Gine"} + PH{"Filipinler"} + PK{"Pakistan"} + PL{"Polonya"} + PM{"Saint Pierre ve Miquelon"} + PN{"Pitcairn"} + PR{"Porto Riko"} + PS{"Filistin Bölgesi"} + PT{"Portekiz"} + PW{"Palau"} + PY{"Paraguay"} + QA{"Katar"} + RE{"Reunion"} + RO{"Romanya"} + RU{"Rusya Federasyonu"} + RW{"Ruanda"} + SA{"Suudi Arabistan"} + SB{"Solomon Adaları"} + SC{"Seyşeller"} + SD{"Sudan"} + SE{"İsveç"} + SG{"Singapur"} + SH{"Saint Helena"} + SI{"Slovenya"} + SJ{"Svalbard ve Jan Mayen"} + SK{"Slovakya"} + SL{"Sierra Leone"} + SM{"San Marino"} + SN{"Senegal"} + SO{"Somali"} + SP{"Sırbistan"} + SR{"Surinam"} + ST{"Sao Tome ve Principe"} + SV{"El Salvador"} + SY{"Suriye"} + SZ{"Svaziland"} + TC{"Turks ve Caicos Adaları"} + TD{"Çad"} + TF{"Fransız Güney Bölgeleri"} + TG{"Togo"} + TH{"Tayland"} + TJ{"Tacikistan"} + TK{"Tokelau"} + TL{"Doğu Timor"} + TM{"Türkmenistan"} + TN{"Tunus"} + TO{"Tonga"} + TR{"Türkiye"} + TT{"Trinidad ve Tobago"} + TV{"Tuvalu"} + TW{"Tayvan"} + TZ{"Tanzanya"} + UA{"Ukrayna"} + UG{"Uganda"} + UM{"Amerika Birleşik Devletleri Küçük Dış Adaları"} + US{"Amerika Birleşik Devletleri"} + UY{"Uruguay"} + UZ{"Özbekistan"} + VA{"Kutsal Devlet (Vatikan Şehir Devleti)"} + VC{"Saint Vincent ve Grenadinler"} + VE{"Venezuela"} + VG{"İngiliz Virgin Adaları"} + VI{"ABD Virgin Adaları"} + VN{"Vietnam"} + VU{"Vanuatu"} + WF{"Wallis ve Futuna"} + WS{"Samoa"} + YE{"Yemen"} + YT{"Mayotte"} + YU{"Yugoslavya"} + ZA{"Güney Afrika"} + ZM{"Zambiya"} + ZW{"Zimbabwe"} } - DayAbbreviations { - "Paz", - "Pzt", - "Sal", - "\u00C7ar", - "Per", - "Cum", - "Cmt", - } - DayNames { - "Pazar", - "Pazartesi", - "Sal\u0131", - "\u00C7ar\u015Famba", - "Per\u015Fembe", - "Cuma", - "Cumartesi", + Currencies{ + ADD{ + "ADD", + "Andora Dinarı", + } + ADP{ + "ADP", + "Andora Pezetası", + } + AED{ + "AED", + "Birleşik Arap Emirlikleri Dirhemi", + } + AFA{ + "AFA", + "Afganistan Afganisi (1927-2002)", + } + AFN{ + "Af", + "Afganistan Afganisi", + } + AIF{ + "AIF", + "Afarlar ve İssalar Frangı", + } + ALK{ + "ALK", + "Arnavutluk Leki (1946-1961)", + } + ALL{ + "lek", + "Arnavutluk Leki", + } + ALV{ + "ALV", + "Arnavutluk Leki Valute", + } + ALX{ + "ALX", + "Arnavut Doları FEC", + } + AMD{ + "dram", + "Ermenistan Dramı", + } + ANG{ + "NA f.", + "Hollanda Antilleri Guldeni", + } + AOA{ + "AOA", + "Angola Kvanzası", + } + AOK{ + "AOK", + "Angola Kvanzası (1977-1990)", + } + AON{ + "AON", + "Yeni Angola Kvanzası (1990-2000)", + } + AOR{ + "AOR", + "Angola Kvanzası Reajustado (1995-1999)", + } + AOS{ + "AOS", + "Angola Esküdosu", + } + ARA{ + "ARA", + "Arjantin Australi", + } + ARM{ + "ARM", + "Arjantin Pezosu Moneda Nacional", + } + ARP{ + "ARP", + "Arjantin Pezosu (1983-1985)", + } + ARS{ + "Arg$", + "Arjantin Pezosu", + } + ATS{ + "ATS", + "Avusturya Şilini", + } + AUD{ + "$A", + "Avustralya Doları", + } + AUP{ + "AUP", + "Avustralya Lirası", + } + AWG{ + "AWG", + "Aruba Florini", + } + AZM{ + "AZM", + "Azerbaycan Manatı", + } + BAD{ + "BAD", + "Bosna Hersek Dinarı", + } + BAM{ + "KM", + "Konvertibl Bosna Hersek Markı", + } + BAN{ + "BAN", + "Yeni Bosna Hersek Dinarı", + } + BBD{ + "BDS$", + "Barbados Doları", + } + BDT{ + "Tk", + "Bangladeş Takası", + } + BEC{ + "BEC", + "Belçika Frangı (konvertibl)", + } + BEF{ + "BF", + "Belçika Frangı", + } + BEL{ + "BEL", + "Belçika Frangı (finansal)", + } + BGL{ + "lev", + "Bulgar Levası (Hard)", + } + BGM{ + "BGM", + "Sosyalist Bulgar Levası", + } + BGN{ + "BGN", + "Yeni Bulgar Levası", + } + BGO{ + "BGO", + "Bulgar Levası (1879-1952)", + } + BGX{ + "BGX", + "Bulgar Levası FEC", + } + BHD{ + "BD", + "Bahreyn Dinarı", + } + BIF{ + "Fbu", + "Burundi Frangı", + } + BMD{ + "Ber$", + "Bermuda Doları", + } + BMP{ + "BMP", + "Bermuda Lirası", + } + BND{ + "BND", + "Brunei Doları", + } + BOB{ + "Bs", + "Bolivya Bolivyanosu", + } + BOL{ + "BOL", + "Bolivya Bolivyanosu (1863-1962)", + } + BOP{ + "BOP", + "Bolivya Pezosu", + } + BOV{ + "BOV", + "Bolivya Mvdol", + } + BRB{ + "BRB", + "Yeni Brezilya Kruzeirosu (1967-1986)", + } + BRC{ + "BRC", + "Brezilya Kruzadosu", + } + BRE{ + "BRE", + "Brezilya Kruzeirosu (1990-1993)", + } + BRL{ + "R$", + "Brezilya Reali", + } + BRN{ + "BRN", + "Yeni Brezilya Kruzadosu", + } + BRR{ + "BRR", + "Brezilya Kruzeirosu", + } + BRZ{ + "BRZ", + "Brezilya Kruzeirosu (1942-1967)", + } + BSD{ + "BSD", + "Bahama Doları", + } + BSP{ + "BSP", + "Bahama Lirası", + } + BTN{ + "Nu", + "Bhutan Ngultrumu", + } + BTR{ + "BTR", + "Bhutan Rupisi", + } + BUK{ + "BUK", + "Burma Kyatı", + } + BUR{ + "BUR", + "Burma Rupisi", + } + BWP{ + "BWP", + "Botsvana Pulası", + } + BYB{ + "BYB", + "Yeni Beyaz Rusya Rublesi (1994-1999)", + } + BYL{ + "BYL", + "Beyaz Rusya Rublesi (1992-1994)", + } + BYR{ + "Rbl", + "Beyaz Rusya Rublesi", + } + BZD{ + "BZ$", + "Belize Doları", + } + BZH{ + "BZH", + "İngiliz Hondurası Doları", + } + CAD{ + "Can$", + "Kanada Doları", + } + CDF{ + "CDF", + "Kongo Frangı", + } + CDG{ + "CDG", + "Kongo Cumhuriyeti Frangı", + } + CDL{ + "CDL", + "Kongo Zairesi", + } + CFF{ + "CFF", + "Orta Afrika Cumhuriyeti Frangı", + } + CHF{ + "SwF", + "İsviçre Frangı", + } + CKD{ + "CKD", + "Cook Adaları Doları", + } + CLC{ + "CLC", + "Şili Condor", + } + CLE{ + "CLE", + "Şili Esküdosu", + } + CLF{ + "CLF", + "Şili Unidades de Fomento", + } + CLP{ + "Ch$", + "Şili Pezosu", + } + CMF{ + "CMF", + "Kamerun CFA Frangı", + } + CNP{ + "CNP", + "Çin Jen Min Piao Yuanı", + } + CNX{ + "CNX", + "Çin ABD Doları FEC", + } + CNY{ + "Y", + "Çin Yuanı Renminbi", + } + COB{ + "COB", + "Kolombiya Kağıt Pezosu", + } + COF{ + "COF", + "Kongo CFA Frangı", + } + COP{ + "Col$", + "Kolombiya Pezosu", + } + CRC{ + "C", + "Kosta Rika Kolonu", + } + CSC{ + "CSC", + "Çekoslavak Korunası", + } + CSK{ + "CSK", + "Çekoslavak Korunası (Hard)", + } + CUP{ + "CUP", + "Küba Pezosu", + } + CUX{ + "CUX", + "Küba FEC", + } + CVE{ + "CVEsc", + "Cape Verde Esküdosu", + } + CWG{ + "CWG", + "Kurasao Florini", + } + CYP{ + "£C", + "Güney Kıbrıs Lirası", + } + CZK{ + "CZK", + "Çek Cumhuriyeti Korunası", + } + DDM{ + "DDM", + "Doğu Alman Markı", + } + DEM{ + "DEM", + "Alman Markı", + } + DES{ + "DES", + "Alman Sperrmark", + } + DJF{ + "DF", + "Cibuti Frangı", + } + DKK{ + "DKr", + "Danimarka Kronu", + } + DOP{ + "RD$", + "Dominik Pezosu", + } + DZD{ + "DA", + "Cezayir Dinarı", + } + DZF{ + "DZF", + "Yeni Cezayir Frangı", + } + DZG{ + "DZG", + "Cezayir Frangı (Germinal)", + } + ECS{ + "ECS", + "Ekvator Sukresi", + } + ECV{ + "ECV", + "Ekvator Unidad de Valor Constante (UVC)", + } + EEK{ + "EEK", + "Estonya Krunu", + } + EGP{ + "EGP", + "Mısır Lirası", + } + ERN{ + "ERN", + "Eritre Nakfası", + } + ESP{ + "ESP", + "İspanyol Pezetası", + } + ETB{ + "Br", + "Etiyopya Birri", + } + ETD{ + "ETD", + "Etiyopya Doları", + } + EUR{ + "€", + "Euro", + } + FIM{ + "FIM", + "Fin Markkası", + } + FIN{ + "FIN", + "Fin Markkası (1860-1962)", + } + FJD{ + "F$", + "Fiji Doları", + } + FJP{ + "FJP", + "Fiji Lirası", + } + FKP{ + "FKP", + "Falkland Adaları Lirası", + } + FOK{ + "FOK", + "Faroe Adaları Kronu", + } + FRF{ + "FRF", + "Fransız Frangı", + } + FRG{ + "FRG", + "Fransız Frangı (Germinal/Franc Poincare)", + } + GAF{ + "GAF", + "Gabon CFA Frangı", + } + GBP{ + "£", + "İngiliz Sterlini", + } + GEK{ + "GEK", + "Gürcistan Kupon Larisi", + } + GEL{ + "lari", + "Gürcistan Larisi", + } + GHC{ + "GHC", + "Gana Sedisi", + } + GHO{ + "GHO", + "Eski Gana Sedisi", + } + GHP{ + "GHP", + "Gana Lirası", + } + GHR{ + "GHR", + "Yeni Gana Sedisi", + } + GIP{ + "GIP", + "Cebelitarık Lirası", + } + GLK{ + "GLK", + "Grönland Kronu", + } + GMD{ + "GMD", + "Gambiya Dalasisi", + } + GMP{ + "GMP", + "Gambiya Lirası", + } + GNF{ + "GF", + "Gine Frangı", + } + GNI{ + "GNI", + "Gine Frangı (1960-1972)", + } + GNS{ + "GNS", + "Gine Syli", + } + GPF{ + "GPF", + "Guadeloupe Frangı", + } + GQE{ + "GQE", + "Ekvator Ginesi Ekuelesi", + } + GQF{ + "GQF", + "Ekvator Ginesi Frangı", + } + GQP{ + "GQP", + "Ekvator Ginesi Pezetası", + } + GRD{ + "GRD", + "Yunan Drahmisi", + } + GRN{ + "GRN", + "Yeni Yunan Drahmisi", + } + GTQ{ + "Q", + "Guatemala Ketzali", + } + GUF{ + "GUF", + "Fransız Guyanası Frangı", + } + GWE{ + "GWE", + "Portekiz Ginesi Esküdosu", + } + GWM{ + "GWM", + "Portekiz Ginesi Mil Reis", + } + GWP{ + "GWP", + "Gine-Bissau Pezosu", + } + GYD{ + "G$", + "Guyana Doları", + } + HKD{ + "HK$", + "Hong Kong Doları", + } + HNL{ + "L", + "Honduras Lempirası", + } + HRD{ + "HRD", + "Hırvat Dinarı", + } + HRK{ + "HRK", + "Hırvat Kunası", + } + HTG{ + "HTG", + "Haiti Gurdu", + } + HUF{ + "Ft", + "Macar Forinti", + } + IBP{ + "IBP", + "Kuzey İrlanda Lirası", + } + IDG{ + "IDG", + "Endonezya Nica Florini", + } + IDJ{ + "IDJ", + "Endonezya Java Rupiahı", + } + IDN{ + "IDN", + "Yeni Endonezya Rupiahı", + } + IDR{ + "Rp", + "Endonezya Rupiahı", + } + IEP{ + "IR£", + "İrlanda Lirası", + } + ILL{ + "ILL", + "İsrail Şekeli", + } + ILP{ + "ILP", + "İsrail Lirası", + } + ILS{ + "ILS", + "Yeni İsrail Şekeli", + } + IMP{ + "IMP", + "Man Adası Sterlini", + } + INR{ + "INR", + "Hindistan Rupisi", + } + IQD{ + "ID", + "Irak Dinarı", + } + IRR{ + "RI", + "İran Riyali", + } + ISK{ + "ISK", + "İzlanda Kronu", + } + ITL{ + "₤", + "İtalyan Lireti", + } + JEP{ + "JEP", + "Jersey Sterlini", + } + JMD{ + "J$", + "Jamaika Doları", + } + JMP{ + "JMP", + "Jamaika Lirası", + } + JOD{ + "JD", + "Ürdün Dinarı", + } + JPY{ + "¥", + "Japon Yeni", + } + KES{ + "K Sh", + "Kenya Şilini", + } + KGS{ + "som", + "Kırgız Somu", + } + KHO{ + "KHO", + "Eski Kamboçya Rieli", + } + KHR{ + "CR", + "Kamboçya Rieli", + } + KID{ + "KID", + "Kiribati Doları", + } + KMF{ + "CF", + "Komorlar Frangı", + } + KPP{ + "KPP", + "Kuzey Kore Halk Cumhuriyeti Wonu", + } + KPW{ + "KPW", + "Kuzey Kore Wonu", + } + KRH{ + "KRH", + "Güney Kore Hwanı", + } + KRO{ + "KRO", + "Eski Güney Kore Wonu", + } + KRW{ + "KRW", + "Güney Kore Wonu", + } + KWD{ + "KD", + "Kuveyt Dinarı", + } + KYD{ + "KYD", + "Kayman Adaları Doları", + } + KZR{ + "KZR", + "Kazakistan Rublesi", + } + KZT{ + "T", + "Kazakistan Tengesi", + } + LAK{ + "LAK", + "Laos Kipi", + } + LBP{ + "LL", + "Lübnan Lirası", + } + LIF{ + "LIF", + "Liechtenstein Frangı", + } + LKR{ + "SL Re", + "Sri Lanka Rupisi", + } + LNR{ + "LNR", + "Seylan Rupisi", + } + LRD{ + "LRD", + "Liberya Doları", + } + LSL{ + "M", + "Lesotho Lotisi", + } + LTL{ + "LTL", + "Litvanya Litası", + } + LTT{ + "LTT", + "Litvanya Talonu", + } + LUF{ + "LUF", + "Lüksemburg Frangı", + } + LVL{ + "LVL", + "Letonya Latı", + } + LVR{ + "LVR", + "Letonya Rublesi", + } + LYB{ + "LYB", + "Libya İngiliz Askeri Yönetimi Lirası", + } + LYD{ + "LD", + "Libya Dinarı", + } + LYP{ + "LYP", + "Libya Lirası", + } + MAD{ + "MAD", + "Fas Dirhemi", + } + MAF{ + "MAF", + "Fas Frangı", + } + MCF{ + "MCF", + "Yeni Fas Frangı", + } + MCG{ + "MCG", + "Fas Frangı (Germinal)", + } + MDC{ + "MDC", + "Moldova Leyi (Cupon)", + } + MDL{ + "MDL", + "Moldova Leyi", + } + MDR{ + "MDR", + "Moldova Rublesi (Cupon)", + } + MGA{ + "MGA", + "Madagaskar Ariary", + } + MGF{ + "MGF", + "Madagaskar Frangı", + } + MHD{ + "MHD", + "Marshall Adaları Doları", + } + MKD{ + "MDen", + "Makedonya Dinarı", + } + MKN{ + "MKN", + "Makedonya Dinarı (1992-1993)", + } + MLF{ + "MLF", + "Mali Frangı", + } + MMK{ + "MMK", + "Myanmar Kyatı", + } + MMX{ + "MMX", + "Myanmar Doları FEC", + } + MNT{ + "Tug", + "Moğol Tugriki", + } + MOP{ + "MOP", + "Makao Patacası", + } + MQF{ + "MQF", + "Martinik Frangı", + } + MRO{ + "UM", + "Moritanya Ouguiyası", + } + MTL{ + "Lm", + "Malta Lirası", + } + MTP{ + "MTP", + "Malta Lirası", + } + MUR{ + "MUR", + "Mauritius Rupisi", + } + MVP{ + "MVP", + "Maldiv Adaları Rupisi", + } + MVR{ + "MVR", + "Maldiv Adaları Rufiyaa", + } + MWK{ + "MK", + "Malavi Kvaçası", + } + MWP{ + "MWP", + "Malavi Lirası", + } + MXN{ + "MEX$", + "Meksika Pezosu", + } + MXP{ + "MXP", + "Gümüş Meksika Pezosu (1861-1992)", + } + MXV{ + "MXV", + "Meksika Unidad de Inversion (UDI)", + } + MYR{ + "RM", + "Malezya Ringiti", + } + MZE{ + "MZE", + "Mozambik Esküdosu", + } + MZM{ + "Mt", + "Mozambik Meticalı", + } + NAD{ + "N$", + "Namibya Doları", + } + NCF{ + "NCF", + "Yeni Kaledonya Frangı (Germinal)", + } + NGN{ + "NGN", + "Nijerya Nairası", + } + NGP{ + "NGP", + "Nijerya Lirası", + } + NHF{ + "NHF", + "Yeni Hebridler CFP Frangı", + } + NIC{ + "NIC", + "Nikaragua Kordobası", + } + NIG{ + "NIG", + "Altın Nikaragua Kordobası", + } + NIO{ + "NIO", + "Nikaragua Kordobası (Oro)", + } + NLG{ + "NLG", + "Hollanda Florini", + } + NOK{ + "NKr", + "Norveç Kronu", + } + NPR{ + "Nrs", + "Nepal Rupisi", + } + NZD{ + "$NZ", + "Yeni Zelanda Doları", + } + NZP{ + "NZP", + "Yeni Zelanda Lirası", + } + OMR{ + "RO", + "Umman Riyali", + } + OMS{ + "OMS", + "Umman Riyali (Saidi)", + } + PAB{ + "PAB", + "Panama Balboası", + } + PDK{ + "PDK", + "Transdniestria Rublesi (Kupon)", + } + PDN{ + "PDN", + "Yeni Transdniestria Rublesi", + } + PDR{ + "PDR", + "Transdniestria Rublesi", + } + PEI{ + "PEI", + "Peru İnti", + } + PEN{ + "PEN", + "Yeni Peru Solu", + } + PES{ + "PES", + "Peru Solu", + } + PGK{ + "PGK", + "Papua Yeni Gine Kinası", + } + PHP{ + "PHP", + "Filipinler Pezosu", + } + PKR{ + "Pra", + "Pakistan Rupisi", + } + PLN{ + "Zl", + "Polonya Zlotisi", + } + PLX{ + "PLX", + "Polonya ABD Doları FEC", + } + PLZ{ + "PLZ", + "Polonya Zlotisi (1950-1995)", + } + PSP{ + "PSP", + "Filistin Lirası", + } + PTC{ + "PTC", + "Portekiz Conto", + } + PTE{ + "PTE", + "Portekiz Esküdosu", + } + PYG{ + "PYG", + "Paraguay Guaranisi", + } + QAR{ + "QR", + "Katar Riyali", + } + REF{ + "REF", + "Reunion Frangı", + } + ROL{ + "leu", + "Romen Leyi", + } + RON{ + "RON", + "Yeni Romen Leyi", + } + RUB{ + "RUB", + "Rus Rublesi", + } + RUR{ + "RUR", + "Rus Rublesi (1991-1998)", + } + RWF{ + "RWF", + "Ruanda Frangı", + } + SAR{ + "SRl", + "Suudi Arabistan Riyali", + } + SAS{ + "SAS", + "Suudi Arabistan Riyali (Sovereign)", + } + SBD{ + "SI$", + "Solomon Adaları Doları", + } + SCR{ + "SR", + "Seyşeller Rupisi", + } + SDD{ + "SDD", + "Sudan Dinarı", + } + SDP{ + "SDP", + "Sudan Lirası", + } + SEK{ + "SKr", + "İsveç Kronu", + } + SGD{ + "S$", + "Singapur Doları", + } + SHP{ + "SHP", + "Saint Helena Lirası", + } + SIB{ + "SIB", + "Slovenya Toları (Bons)", + } + SIT{ + "SIT", + "Slovenya Toları", + } + SKK{ + "Sk", + "Slovak Korunası", + } + SLL{ + "SLL", + "Sierra Leone Leonesi", + } + SML{ + "SML", + "San Marino Lirası", + } + SOS{ + "So. Sh.", + "Somali Şilini", + } + SQS{ + "SQS", + "Somaliland Şilini", + } + SRG{ + "Sf", + "Surinam Guldeni", + } + SSP{ + "SSP", + "İskoçya Lirası", + } + STD{ + "Db", + "Sao Tome ve Principe Dobrası", + } + STE{ + "STE", + "Sao Tome ve Principe Esküdosu", + } + SUN{ + "SUN", + "Yeni Sovyet Rublesi", + } + SUR{ + "SUR", + "Sovyet Rublesi", + } + SVC{ + "SVC", + "El Salvador Kolonu", + } + SYP{ + "LS", + "Suriye Lirası", + } + SZL{ + "E", + "Swaziland Lilangenisi", + } + TCC{ + "TCC", + "Turks ve Caicos Adaları Crownu", + } + TDF{ + "TDF", + "Çad CFA Frangı", + } + THB{ + "THB", + "Tayland Bahtı", + } + TJR{ + "TJR", + "Tacikistan Rublesi", + } + TJS{ + "TJS", + "Tacikistan Somonisi", + } + TMM{ + "TMM", + "Türkmenistan Manatı", + } + TND{ + "TND", + "Tunus Dinarı", + } + TOP{ + "T$", + "Tonga Paʻangası", + } + TOS{ + "TOS", + "Tonga Sterlini", + } + TPE{ + "TPE", + "Timor Esküdosu", + } + TPP{ + "TPP", + "Timor Patacası", + } + TRL{ + "TL", + "Türk Lirası", + } + TRY{ + "YTL", + "Yeni Türk Lirası", + } + TTD{ + "TT$", + "Trinidad ve Tobago Doları", + } + TTO{ + "TTO", + "Eski Trinidad ve Tobago Doları", + } + TVD{ + "TVD", + "Tuvalu Doları", + } + TWD{ + "NT$", + "Yeni Tayvan Doları", + } + TZS{ + "T Sh", + "Tanzanya Şilini", + } + UAH{ + "UAH", + "Ukrayna Grivnası", + } + UAK{ + "UAK", + "Ukrayna Karbovanetz", + } + UGS{ + "UGS", + "Uganda Şilini (1966-1987)", + } + UGX{ + "U Sh", + "Uganda Şilini", + } + USD{ + "US$", + "ABD Doları", + } + USN{ + "USN", + "ABD Doları (Ertesi gün)", + } + USS{ + "USS", + "ABD Doları (Aynı gün)", + } + UYF{ + "UYF", + "Uruguay Pezosu (Fuerte)", + } + UYP{ + "UYP", + "Uruguay Pezosu (1975-1993)", + } + UYU{ + "Ur$", + "Uruguay Pezosu (Uruguayo)", + } + UZC{ + "UZC", + "Özbekistan Sumu (Coupon)", + } + UZS{ + "UZS", + "Özbekistan Sumu", + } + VAL{ + "VAL", + "Vatikan Şehir Devleti Lirası", + } + VDD{ + "VDD", + "Kuzey Vietnam Piastre Dong Viet", + } + VDN{ + "VDN", + "Yeni Kuzey Vietnam Dongu", + } + VDP{ + "VDP", + "Kuzey Vietnam Viet Minh Piastre Dong Viet", + } + VEB{ + "Be", + "Venezuela Bolivarı", + } + VGD{ + "VGD", + "İngiliz Virgin Adaları Doları", + } + VND{ + "VND", + "Vietnam Dongu", + } + VNN{ + "VNN", + "Yeni Vietnam Dongu", + } + VNR{ + "VNR", + "Vietnam Cumhuriyeti Dongu", + } + VNS{ + "VNS", + "Vietnam Ulusal Dongu", + } + VUV{ + "VT", + "Vanuatu Vatusu", + } + WSP{ + "WSP", + "Batı Samoa Lirası", + } + WST{ + "WST", + "Batı Samoa Talası", + } + XAD{ + "XAD", + "Asya Hesap Birimi Dinarı", + } + XAF{ + "XAF", + "CFA Frangı BEAC", + } + XAM{ + "XAM", + "Asya Para Birimi", + } + XAU{ + "XAU", + "Altın", + } + XBA{ + "XBA", + "Birleşik Avrupa Birimi", + } + XBB{ + "XBB", + "Avrupa Para Birimi", + } + XBC{ + "XBC", + "Avrupa Hesap Birimi (XBC)", + } + XBD{ + "XBD", + "Avrupa Hesap Birimi (XBD)", + } + XCD{ + "EC$", + "Doğu Karayip Doları", + } + XCF{ + "XCF", + "CFA Yeni Frank", + } + XDR{ + "XDR", + "Özel Çekme Hakkı (SDR)", + } + XEF{ + "XEF", + "CFA Frank BCEAEC", + } + XEU{ + "XEU", + "Avrupa Para Birimi", + } + XFO{ + "XFO", + "Fransız Altın Frangı", + } + XFU{ + "XFU", + "Fransız UIC-Frangı", + } + XID{ + "XID", + "İslam Dinarı", + } + XMF{ + "XMF", + "Ana Fransa yeni Frangı", + } + XNF{ + "XNF", + "Fransız Antilleri CFA Frangı", + } + XOF{ + "XOF", + "CFA Frangı BCEAO", + } + XPF{ + "CFPF", + "CFP Frangı", + } + XTR{ + "XTR", + "COMECON Transfer Edilebilir Rublesi", + } + YDD{ + "YDD", + "Yemen Dinarı", + } + YEI{ + "YEI", + "Yemen Riyali (Imadi)", + } + YER{ + "YRl", + "Yemen Riyali", + } + YUD{ + "YUD", + "Yugoslav Dinarı (Hard)", + } + YUF{ + "YUF", + "Yugoslav Federasyonu Dinarı", + } + YUG{ + "YUG", + "Yugoslav 1994 Dinarı", + } + YUM{ + "YUM", + "Yeni Yugoslav Dinarı", + } + YUN{ + "YUN", + "Konvertibl Yugoslav Dinarı", + } + YUO{ + "YUO", + "Yugoslav Ekim Dinarı", + } + YUR{ + "YUR", + "Yugoslav Dinarı (Reformed)", + } + ZAL{ + "ZAL", + "Güney Afrika Randı (finansal)", + } + ZAP{ + "ZAP", + "Güney Afrika Lirası", + } + ZAR{ + "R", + "Güney Afrika Randı", + } + ZMK{ + "ZMK", + "Zambiya Kvaçası", + } + ZMP{ + "ZMP", + "Zambiya Lirası", + } + ZRN{ + "ZRN", + "Yeni Zaire Zairesi", + } + ZRZ{ + "ZRZ", + "Zaire Zairesi", + } + ZWD{ + "Z$", + "Zimbabwe Doları", + } } - Languages { - tr { "T\u00FCrk\u00E7e" } + ExemplarCharacters{"[a-zâûöüıçşğ]"} + Keys{ + calendar{"Takvim"} + collation{"Sıralama"} + currency{"Para Birimi"} } - LocaleID:int { 0x1f } -// LocaleString { "tr" } - MonthAbbreviations { - "Oca", - "\u015Eub", - "Mar", - "Nis", - "May", - "Haz", - "Tem", - "A\u011Fu", - "Eyl", - "Eki", - "Kas", - "Ara", + Languages{ + aa{"Afar"} + ab{"Abazca"} + ady{"Adige"} + af{"Afrikaan Dili"} + afa{"Afro Asya Dilleri (Diğer)"} + akk{"Akad Dili"} + alg{"Algonquian Dilleri"} + am{"Amharik"} + ang{"Eski İngilizce (450-1100)"} + apa{"Apaçi Dilleri"} + ar{"Arapça"} + arc{"Aramice"} + art{"Yapay (Diğer)"} + ath{"Athapascan Dilleri"} + aus{"Avustralya Dilleri"} + av{"Avar Dili"} + ay{"Aymara"} + az{"Azerice"} + ba{"Başkırt Dili"} + bai{"Bamileke Dilleri"} + ban{"Bali Dili"} + bat{"Baltık (Diğer)"} + be{"Beyaz Rusça"} + ber{"Berberi"} + bg{"Bulgarca"} + bh{"Bihari"} + bi{"Bislama"} + bn{"Bengal Dili"} + bo{"Tibetçe"} + br{"Breton Dili"} + bs{"Bosna Dili"} + ca{"Katalan Dili"} + cad{"Caddo"} + cai{"Orta Amerika Yerlileri (Diğer)"} + cau{"Kafkasça (Diğer)"} + ce{"Çeçence"} + cel{"Keltçe (Diğer)"} + chg{"Çağatay Dili"} + chr{"Çeroki"} + chy{"Çeyen"} + cmc{"Chamic Dilleri"} + co{"Korsika Dili"} + cop{"Kiptice"} + cpe{"Creoles ve Pidgins, İngilizce tabanlı (Diğer)"} + cpf{"Creoles ve Pidgins, Fransızca tabanlı (Diğer)"} + cpp{"Creoles ve Pidgins, Portekizce tabanlı (Diğer)"} + crh{"Kırım Türkçesi; Kırım Tatarcası"} + crp{"Creoles ve Pidgins (Diğer)"} + cs{"Çekçe"} + cu{"Slav Kilisesi"} + cus{"Cushitic (Diğer)"} + cv{"Çuvaş"} + cy{"Gal Dili"} + da{"Danca"} + de{"Almanca"} + dra{"Dravidian (Diğer)"} + dsb{"Aşağı Sorbça"} + dum{"Felemenkçe (1050-1350)"} + dz{"Bhutan Dili"} + ee{"Ewe"} + egy{"Mısır Dili (Eski)"} + el{"Yunanca"} + elx{"Elam"} + en{"İngilizce"} + enm{"İngilizce (1100-1500)"} + eo{"Esperanto"} + es{"İspanyolca"} + et{"Estonya Dili"} + eu{"Bask Dili"} + fa{"Farsça"} + fi{"Fince"} + fiu{"Finno - Ugrian (Diğer)"} + fj{"Fiji Dili"} + fo{"Faroe Dili"} + fr{"Fransızca"} + frm{"Fransızca (1400-1600)"} + fro{"Fransızca (842-1400)"} + fy{"Frizye Dili"} + ga{"İrlanda Dili"} + gd{"İskoç Gal Dili"} + gem{"Almanca tabanlı (Diğer)"} + gl{"Galiçya Dili"} + gmh{"Almanca (1050-1500)"} + gn{"Guarani"} + goh{"Almanca (750-1050)"} + grc{"Antik Yunan (1453'e kadar)"} + gu{"Gujarati"} + ha{"Hausa"} + haw{"Hawaii Dili"} + he{"İbranice"} + hi{"Hint Dili"} + hit{"Hititçe"} + hr{"Hırvatça"} + hsb{"Yukarı Sorbça"} + ht{"Haiti Dili"} + hu{"Macarca"} + hy{"Ermenice"} + id{"Endonezya Dili"} + ie{"Interlingue"} + ik{"Inupiak"} + inc{"Hintçe (Diğer)"} + ine{"Hint-Avrupa (Diğer)"} + inh{"İnguş Dili"} + io{"Ido"} + ira{"İran Dili"} + iro{"Iroquoian Dilleri"} + is{"İzlandaca"} + it{"İtalyanca"} + iu{"Inuktitut"} + ja{"Japonca"} + jv{"Java Dili"} + ka{"Gürcüce"} + khi{"Khoisan (Diğer)"} + kk{"Kazak Dili"} + kl{"Grönland Dili"} + km{"Kamboçya Dili"} + kn{"Kannada"} + ko{"Korece"} + krc{"Karaçay-Balkar"} + ks{"Keşmirce"} + ku{"Kürtçe"} + kum{"Kumukça"} + ky{"Kırgızca"} + la{"Latince"} + lb{"Lüksemburg Dili"} + ln{"Lingala"} + lo{"Laos Dili"} + lt{"Litvanya Dili"} + lv{"Letonya Dili"} + mad{"Madura Dili"} + mg{"Malaga Dili"} + mga{"İrlanda Dili (900-1200)"} + mh{"Marshall Adaları Dili"} + mi{"Maori"} + mis{"Çeşitli Diller"} + mk{"Makedonca"} + mkh{"Mon-Khmer (Diğer)"} + ml{"Malayalam"} + mn{"Moğol Dili"} + mnc{"Mançurya Dili"} + mno{"Manobo Dilleri"} + mo{"Moldavya Dili"} + mr{"Marathi"} + ms{"Malay"} + mt{"Malta Dili"} + mul{"Birden Fazla Diller"} + mun{"Munda Dilleri"} + my{"Birmanya Dili"} + na{"Nauru"} + nai{"Kuzey Amerika Yerlileri Dili (Diğer)"} + nb{"Norveç Kitap Dili"} + nd{"Kuzey Ndebele"} + nds{"Alçak Almanca; Alçak Sakson"} + ne{"Nepal Dili"} + nic{"Nijer - Kordofanian (Diğer)"} + nl{"Hollanda Dili"} + nn{"Norveççe Nynorsk"} + no{"Norveççe"} + nr{"Güney Ndebele"} + nub{"Nubian Dilleri"} + oc{"Occitan"} + oj{"Ojibwa"} + om{"Oromo (Afan)"} + or{"Oriya"} + os{"Oset"} + osa{"Osage"} + ota{"Osmanlıca (1500-1928)"} + oto{"Osmanlı Dilleri"} + pa{"Pencap Dili"} + paa{"Papua Dili (Diğer)"} + pau{"Palau Dili"} + peo{"Eski Farsça (600-400 M.Ö.)"} + phi{"Filipinler Dili (Diğer)"} + pl{"Polonya Dili"} + pra{"Prakrit Dilleri"} + pro{"Eski Provençal (1500'e kadar)"} + ps{"Peştun Dili"} + pt{"Portekizce"} + qu{"Quechua"} + rm{"Rhaeto-Roman Dili"} + rn{"Kirundi"} + ro{"Romence"} + roa{"Roman Dili (Diğer)"} + rom{"Romanca"} + ru{"Rusça"} + rw{"Kinyarwanda"} + sa{"Sanskritçe"} + sai{"Güney Amerika Yerlileri Dili (Diğer)"} + sal{"Salishan Dilleri"} + sc{"Sardunya Dili"} + sco{"İskoç"} + sd{"Sindhi"} + se{"Kuzey Sami"} + sem{"Sami (Diğer)"} + sg{"Sangho"} + sga{"Eski İrlandaca (900'e kadar)"} + sgn{"İşaret Dilleri"} + sh{"Sırp-Hırvat Dili"} + si{"Sinhal Dili"} + sio{"Siu Dilleri"} + sit{"Çin-Tibet (Diğer)"} + sk{"Slovakça"} + sl{"Slovence"} + sla{"Slav Dilleri (Diğer)"} + sm{"Samoa Dili"} + sma{"Güney Sami"} + smi{"Sami Dilleri (Diğer)"} + smj{"Lule Sami"} + smn{"Inari Sami"} + sms{"Skolt Sami"} + sn{"Shona"} + so{"Somali Dili"} + sq{"Arnavutça"} + sr{"Sırpça"} + ss{"Siswati"} + ssa{"Nil-Sahara (Diğer)"} + st{"Sesotho"} + su{"Sudan Dili"} + sux{"Sümer"} + sv{"İsveççe"} + sw{"Swahili"} + syr{"Süryanice"} + ta{"Tamil"} + tai{"Tay Dili (Diğer)"} + te{"Telugu"} + tg{"Tacik Dili"} + th{"Tay Dili"} + ti{"Tigrinya"} + tk{"Türkmence"} + tl{"Tagalog"} + tn{"Setswana"} + to{"Tonga"} + tr{"Türkçe"} + ts{"Tsonga"} + tt{"Tatarca"} + tup{"Tupi dilleri"} + tut{"Altay Dilleri (Diğer)"} + tw{"Twi"} + ty{"Tahiti Dili"} + ug{"Uygurca"} + uk{"Ukraynaca"} + ur{"Urduca"} + uz{"Özbekçe"} + vi{"Vietnam Dili"} + vo{"Volapuk"} + wak{"Wakashan Dilleri"} + wen{"Sorb Dilleri"} + wo{"Wolof"} + xal{"Kalmık"} + xh{"Xhosa"} + yi{"Yiddiş"} + yo{"Yoruba"} + ypk{"Yupik Dilleri"} + za{"Zhuang"} + zh{"Çince"} + zu{"Zulu"} } - MonthNames { - "Ocak", - "\u015Eubat", - "Mart", - "Nisan", - "May\u0131s", - "Haziran", - "Temmuz", - "A\u011Fustos", - "Eyl\u00FCl", - "Ekim", - "Kas\u0131m", - "Aral\u0131k", + LocaleScript{ + "Latn", } - NumberElements { + NumberElements{ ",", ".", ";", @@ -96,30 +2054,284 @@ tr { "#", "-", "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", + "‰", + "∞", + "�", + "+", } -// ShortLanguage { "tur" } - localPatternChars { "GanjkHmsSEDFwWxhKzAe" } - zoneStrings { + Scripts{ + Arab{"Arapça"} + Armn{"Ermenice"} + Beng{"Bengal"} + Cher{"Çeroki"} + Cprt{"Kıbrıs"} + Cyrl{"Kiril"} + Ethi{"Etiyopya"} + Geor{"Gürcüce"} + Goth{"Gotik"} + Grek{"Yunan"} + Hani{"Hun"} + Hans{"Basit Han"} + Hant{"Geleneksel Han"} + Hebr{"İbranice"} + Laoo{"Laos"} + Mong{"Moğolca"} + Sinh{"Sinhal"} + Syrc{"Süryanice"} + Thai{"Tayca"} + Tibt{"Tibetçe"} + Zyyy{"Ortak"} + } + Types{ + calendar{ + buddhist{"Budist Takvimi"} + chinese{"Çin Takvimi"} + gregorian{"Miladi Takvim"} + hebrew{"Yahudi Takvimi"} + islamic{"Hicri Takvim"} + islamic-civil{"Arap Takvimi"} + japanese{"Japon Takvimi"} + } + collation{ + direct{"Düz Sıralama"} + phonebook{"Telefon Defteri Sıralaması"} + pinyin{"Pinyin Sıralaması"} + stroke{"Stroke Sıralaması"} + traditional{"Geleneksel"} + } + } + Version{"1.3"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "HH:mm:ss z", + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm", + "dd MMMM yyyy EEEE", + "dd MMMM yyyy EEEE", + "dd.MMM.yyyy", + "dd.MM.yyyy", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "Paz", + "Pzt", + "Sal", + "Çar", + "Per", + "Cum", + "Cmt", + } + narrow{ + "P", + "P", + "S", + "Ç", + "P", + "C", + "C", + } + wide{ + "Pazar", + "Pazartesi", + "Salı", + "Çarşamba", + "Perşembe", + "Cuma", + "Cumartesi", + } + } + } + eras{ + abbreviated{ + "MÖ", + "MS", + } + } + monthNames{ + format{ + abbreviated{ + "Oca", + "Şub", + "Mar", + "Nis", + "May", + "Haz", + "Tem", + "Ağu", + "Eyl", + "Eki", + "Kas", + "Ara", + } + narrow{ + "O", + "Ş", + "M", + "N", + "M", + "H", + "T", + "A", + "E", + "E", + "K", + "A", + } + wide{ + "Ocak", + "Şubat", + "Mart", + "Nisan", + "Mayıs", + "Haziran", + "Temmuz", + "Ağustos", + "Eylül", + "Ekim", + "Kasım", + "Aralık", + } + } + } + } + } + localPatternChars{"GanjkHmsSEDFwWxhKzAeugXZ"} + zoneStrings{ + { + "America/Los_Angeles", + "Pasifik Standart Saati", + "PST", + "Pasifik Yaz Saati", + "PDT", + "Los Angeles", + } + { + "America/Denver", + "ABD Sıradağlar Standart Saati", + "MST", + "ABD Sıradağlar Yaz Saati", + "MDT", + "Denver", + } + { + "America/Phoenix", + "ABD Sıradağlar Standart Saati", + "MST", + "ABD Sıradağlar Standart Saati", + "MST", + "Phoenix", + } + { + "America/Chicago", + "Merkezi Standart Saati", + "CST", + "Merkezi Yaz Saati", + "CDT", + "Şikago", + } + { + "America/New_York", + "Doğu Standart Saati", + "EST", + "Doğu Yaz Saati", + "EDT", + "New York", + } + { + "America/Indianapolis", + "Doğu Standart Saati", + "EST", + "Doğu Standart Saati", + "EST", + "Indianapolis", + } + { + "Pacific/Honolulu", + "Hawaii Standart Saati", + "HST", + "Hawaii Standart Saati", + "HST", + "Honolulu", + } + { + "America/Anchorage", + "Alaska Standart Saati", + "AST", + "Alaska Yaz Saati", + "ADT", + "Anchorage", + } + { + "America/Halifax", + "Atlantik Standart Saati", + "AST", + "Atlantik Yaz Saati", + "ADT", + "Halifax", + } + { + "America/St_Johns", + "Newfoundland Standart Saati", + "CNT", + "Newfoundland Yaz Saati", + "CDT", + "St. Johns", + } + { + "Europe/Paris", + "Orta Avrupa Standart Saati", + "CET", + "Orta Avrupa Yaz Saati", + "CEST", + "Paris", + } { "Africa/Casablanca", + "Greenwich Saati", "GMT", + "Greenwich Saati", "GMT", - "GMT", - "GMT", + "Kasablanka", + } + { + "Asia/Jerusalem", + "İsrail Standart Saati", + "IST", + "İsrail Standart Saati", + "IDT", + "Kudüs", + } + { + "Asia/Tokyo", + "Japonya Standart Saati", + "JST", + "Japonya Standart Saati", + "JST", + "Tokyo", + } + { + "Europe/Bucharest", + "Doğu Avrupa Standart Saati", + "EET", + "Doğu Avrupa Yaz Saati", + "EEST", + "Bükreş", + } + { + "Asia/Shanghai", + "Çin Standart Saati", + "CTT", + "Çin Standart Saati", + "CDT", + "Şangay", } - } -// LocaleScript{ -// "Latn", // ISO 15924 Name -// } - ExemplarCharacters { "[a-z \u00e2 \u00ee \u00fb \u00f6 \u00fc \u0131 \u00e7 \u015f \u011f]" } - - // Currency display names - Currencies { - ITL { "ITL", "ITL" } // Italian Lira - TRL { "TL", "TRL" } // Turkish Lira } } diff --git a/icuSources/data/locales/tr_TR.txt b/icuSources/data/locales/tr_TR.txt index fe0d351b..47725d82 100644 --- a/icuSources/data/locales/tr_TR.txt +++ b/icuSources/data/locales/tr_TR.txt @@ -1,19 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/tr_TR.xml // * // *************************************************************************** - -tr_TR { - Version{ "2.0" } -// LocaleString { "tr_TR" } - NumberPatterns { +tr_TR{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "#,##0 \u00A4;-#,##0 \u00A4", - "%#,##0", + "#,##0.00 ¤;-#,##0.00 ¤", + "#,##0%", "#E0", } -// ShortCountry { "TUR" } - LocaleID:int { 0x041f } + Version{"1.2"} } diff --git a/icuSources/data/locales/uk.txt b/icuSources/data/locales/uk.txt index 04854014..3c4b962a 100644 --- a/icuSources/data/locales/uk.txt +++ b/icuSources/data/locales/uk.txt @@ -1,155 +1,2035 @@ -// *************************************************************************** -// * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -uk { - Version {"2.0" } - CollationElements { - Version { "1.0" } - Sequence { - "[alternate shifted]" - "&\u0413 < \u0491 <<< \u0490" - } -// "& Z" -// "< \u0430 <<< \u0410 < \u0431 <<< \u0411 < \u0432 <<< \u0412 < \u0433 <<< \u0413 < \u0491 <<< \u0490" -// "< \u0434 <<< \u0414 < \u0435 <<< \u0415 < \u0454 <<< \u0404 < \u0436 <<< \u0416" -// "< \u0437 <<< \u0417 < \u0438 <<< \u0418 < \u0456 <<< \u0406 < \u0457 <<< \u0407 < \u0439 <<< \u0419 < \u043A <<< \u041A" -// "< \u043B <<< \u041B < \u043C <<< \u041C < \u043D <<< \u041D < \u043E <<< \u041E" -// "< \u043F <<< \u041F < \u0440 <<< \u0420 < \u0441 <<< \u0421 < \u0442 <<< \u0422" -// "< \u0443 <<< \u0423 < \u0444 <<< \u0424 < \u0445 <<< \u0425 < \u0446 <<< \u0426" -// "< \u0447 <<< \u0427 < \u0448 <<< \u0428 < \u0449 <<< \u0429 < \u044C <<< \u042C" -// "< \u044E <<< \u042E < \u044F <<< \u042F " -// } - -// Sequence { "& 9 < \u0482 & Z< \u0430 <<< \u0410< \u0431 <<< \u0411< \u0432" -// " <<< \u0412< \u0433 <<< \u0413<< \u0491 <<< \u0490<< \u0495 <<< \u0494<< \u0453 <<< \u0403<< " -// "\u0493 <<< \u0492< \u0434 <<< \u0414< \u0452 <<< \u0402< \u0435 <<< \u0415<< \u04BD <<< \u04BC" -// "<< \u0451 <<< \u0401<< \u04BF <<< \u04BE< \u0454 <<< \u0404< \u0436 <<< \u0416<< \u0497 <<< " -// "\u0496<< \u04C2 <<< \u04C1< \u0437 <<< \u0417<< \u0499 <<< \u0498< \u0455 <<< \u0405< \u0438" -// " <<< \u0418< \u0456 <<< \u0406<< \u04C0 < \u0457 <<< \u0407< \u0439 <<< \u0419< \u0458 <<<" -// " \u0408< \u043A <<< \u041A<< \u049F <<< \u049E<< \u04C4 <<< \u04C3<< \u049D <<< \u049C<< \u04A1" -// " <<< \u04A0<< \u045C <<< \u040C<< \u049B <<< \u049A< \u043B <<< \u041B< \u0459 <<< \u0409< " -// "\u043C <<< \u041C< \u043D <<< \u041D<< \u0463 << \u04A3 <<< \u04A2<< \u04A5 <<< \u04A4<< \u04BB" -// " <<< \u04BA<< \u04C8 <<< \u04C7< \u045A <<< \u040A< \u043E <<< \u041E<< \u04A9 <<< \u04A8< " -// "\u043F <<< \u041F<< \u04A7 <<< \u04A6< \u0440 <<< \u0420< \u0441 <<< \u0421<< \u04AB <<< \u04AA" -// "< \u0442 <<< \u0422<< \u04AD <<< \u04AC< \u045B <<< \u040B< \u0443 <<< \u0423<< \u04AF <<< " -// "\u04AE< \u045E <<< \u040E< \u04B1 <<< \u04B0< \u0444 <<< \u0424< \u0445 <<< \u0425<< \u04B3" -// " <<< \u04B2< \u0446 <<< \u0426<< \u04B5 <<< \u04B4< \u0447 <<< \u0427<< \u04B7 << \u04B6<< " -// "\u04B9 <<< \u04B8<< \u04CC <<< \u04CB< \u045F <<< \u040F< \u0448 <<< \u0428< \u0449 <<< \u0429" -// "< \u044A <<< \u042A< \u044B <<< \u042B< \u044D <<< \u042D< \u044E <<< \u042E< \u044F <<< " -// "\u042F< \u044C <<< \u042C< \u0461 <<< \u0460< \u0462 < \u0465 <<< \u0464< \u0467 <<< \u0466" -// "< \u0469 <<< \u0468< \u046B <<< \u046A< \u046D <<< \u046C< \u046F <<< \u046E< \u0471 <<< " -// "\u0470< \u0473 <<< \u0472< \u0475 <<< \u0474<< \u0477 <<< \u0476< \u0479 <<< \u0478< \u047B" -// " <<< \u047A< \u047D <<< \u047C< \u047F <<< \u047E< \u0481 <<< \u0480" } - } - Countries { - UA { "\u0423\u043A\u0440\u0430\u0457\u043D\u0430" } - } - DateTimeElements:intvector { - 2, - 1, - } - DateTimePatterns { - "HH:mm:ss z", - "HH:mm:ss z", - "H:mm:ss", - "H:mm", - "EEEE, d MMMM yyyy '\u0440.'", - "d MMMM yyyy", - "d MMM yyyy", - "dd.MM.yy", - "{1} {0}", - } - DayAbbreviations { - "\u041D\u0434", - "\u041F\u043D", - "\u0412\u0442", - "\u0421\u0440", - "\u0427\u0442", - "\u041F\u0442", - "\u0421\u0431", - } - DayNames { - "\u041D\u0435\u0434\u0456\u043B\u044F", - "\u041F\u043E\u043D\u0435\u0434\u0456\u043B\u043E\u043A", - "\u0412\u0456\u0432\u0442\u043E\u0440\u043E\u043A", - "\u0421\u0435\u0440\u0435\u0434\u0430", - "\u0427\u0435\u0442\u0432\u0435\u0440", - "\u041F'\u044F\u0442\u043D\u0438\u0446\u044F", - "\u0421\u0443\u0431\u043E\u0442\u0430", - } - Eras { - "\u0434\u043E \u043D.\u0435.", - "\u043D.\u0435.", - } - Languages { - uk { "\u0443\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430" } - } - LocaleID:int { 0x22 } -// LocaleString { "uk" } - MonthAbbreviations { - "\u0441\u0456\u0447", - "\u043B\u044E\u0442", - "\u0431\u0435\u0440", - "\u043A\u0432\u0456\u0442", - "\u0442\u0440\u0430\u0432", - "\u0447\u0435\u0440\u0432", - "\u043B\u0438\u043F", - "\u0441\u0435\u0440\u043F", - "\u0432\u0435\u0440", - "\u0436\u043E\u0432\u0442", - "\u043B\u0438\u0441\u0442", - "\u0433\u0440\u0443\u0434", - } - MonthNames { - "\u0441\u0456\u0447\u043D\u044F", - "\u043B\u044E\u0442\u043E\u0433\u043E", - "\u0431\u0435\u0440\u0435\u0437\u043d\u044f", - "\u043A\u0432\u0456\u0442\u043D\u044F", - "\u0442\u0440\u0430\u0432\u043D\u044F", - "\u0447\u0435\u0440\u0432\u043D\u044F", - "\u043B\u0438\u043F\u043D\u044F", - "\u0441\u0435\u0440\u043F\u043D\u044F", - "\u0432\u0435\u0440\u0435\u0441\u043D\u044F", - "\u0436\u043E\u0432\u0442\u043D\u044F", - "\u043B\u0438\u0441\u0442\u043E\u043F\u0430\u0434\u0430", - "\u0433\u0440\u0443\u0434\u043D\u044F", - } - NumberElements { - ",", - "\u00a0", - ";", - "%", - "0", - "#", - "-", - "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", - } -// ShortLanguage { "ukr" } - localPatternChars { "GanjkHmsSEDFwWxhKzAe" } - zoneStrings { - { - "Africa/Casablanca", - "GMT", - "GMT", - "GMT", - "GMT", - } - } - LocaleScript:array { - "Cyrl" // ISO 15924 Name - } - ExemplarCharacters { "[\u0430-\u0449 \u044e \u044c \u044f \u0454 \u0456 \u0457 \u0491]" } - - // Currency display names - Currencies { - UAH { "\u0433\u0440\u043D.", "UAH" } - } -} +// *************************************************************************** +// * +// * Copyright (C) 2005 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/uk.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/uk.xml + */ +uk{ + Countries{ + AD{"Андорра"} + AE{"Обʼєднані Арабські Емірати"} + AF{"Афганістан"} + AG{"Антигуа і Барбуда"} + AI{"Ангілья"} + AL{"Албанія"} + AM{"Вірменія"} + AN{"Нідерландські Антільські Острови"} + AO{"Ангола"} + AQ{"Антарктика"} + AR{"Аргентина"} + AS{"Американське Самоа"} + AT{"Австрія"} + AU{"Австралія"} + AW{"Аруба"} + AZ{"Азербайджан"} + BA{"Боснія і Герцоговина"} + BB{"Барбадос"} + BD{"Бангладеш"} + BE{"Бельгія"} + BF{"Буркіна-Фасо"} + BG{"Болгарія"} + BH{"Бахрейн"} + BI{"Бурунді"} + BJ{"Бенін"} + BM{"Бермуди"} + BN{"Бруней"} + BO{"Болівія"} + BR{"Бразилія"} + BS{"Багами"} + BT{"Бутан"} + BV{"Буве, острів"} + BW{"Ботсвана"} + BY{"Білорусь"} + BZ{"Беліз"} + CA{"Канада"} + CC{"Кокосові острови"} + CD{"Конго, Демократична Республіка"} + CF{"Центрально-Африканська Республіка"} + CG{"Конго"} + CH{"Швейцарія"} + CI{"Кот-д’Івуар"} + CK{"Острови Кука"} + CL{"Чилі"} + CM{"Камерун"} + CN{"Китай"} + CO{"Колумбія"} + CR{"Коста-Рика"} + CU{"Куба"} + CV{"Кабо-Верде"} + CX{"Острів Різдва"} + CY{"Кіпр"} + CZ{"Чеська республіка"} + DE{"Німеччина"} + DJ{"Джібуті"} + DK{"Данія"} + DM{"Домінік"} + DO{"Домініканська Республіка"} + DZ{"Алжир"} + EC{"Еквадор"} + EE{"Естонія"} + EG{"Єгипет"} + EH{"Західна Сахара"} + ER{"Еритрея"} + ES{"Іспанія"} + ET{"Ефіопія"} + FI{"Фінляндія"} + FJ{"Фіджі"} + FK{"Фолклендські Острови (Мальвіни)"} + FM{"Мікронезія"} + FO{"Фарерські острови"} + FR{"Франція"} + GA{"Габон"} + GB{"Великобританія"} + GD{"Гренада"} + GE{"Грузія"} + GF{"Французька Гвіана"} + GH{"Гана"} + GI{"Гібралтар"} + GL{"Гренландія"} + GM{"Гамбія"} + GN{"Гвінея"} + GP{"Гваделупа"} + GQ{"Екваторіальна Гвінея"} + GR{"Греція"} + GS{"Південна Джорджія та Південні Сандвічеві Острови"} + GT{"Гватемала"} + GU{"Гуам"} + GW{"Гвінея-Біссау"} + GY{"Гайана"} + HK{"Гонконг, С.А.Р. Китаю"} + HM{"Острови Херд і Мак-Дональд"} + HN{"Гондурас"} + HR{"Хорватія"} + HT{"Гаїті"} + HU{"Угорщина"} + ID{"Індонезія"} + IE{"Ірландія"} + IL{"Ізраїль"} + IN{"Індія"} + IO{"Британські території Індійського океану"} + IQ{"Ірак"} + IR{"Іран"} + IS{"Ісландія"} + IT{"Італія"} + JM{"Ямайка"} + JO{"Йорданія"} + JP{"Японія"} + KE{"Кенія"} + KG{"Киргизстан"} + KH{"Камбоджа"} + KI{"Кірибаті"} + KM{"Коморські Острови"} + KN{"Сент-Кітс і Невіс"} + KP{"Північна Корея"} + KR{"Південна Корея"} + KW{"Кувейт"} + KY{"Кайманові острови"} + KZ{"Казахстан"} + LA{"Лаос"} + LB{"Ліван"} + LC{"Сент-Люсія"} + LI{"Ліхтенштейн"} + LK{"Шрі-Ланка"} + LR{"Ліберія"} + LS{"Лесото"} + LT{"Литва"} + LU{"Люксембург"} + LV{"Латвія"} + LY{"Лівія"} + MA{"Марокко"} + MC{"Монако"} + MD{"Молдова"} + MG{"Мадагаскар"} + MH{"Маршаллові Острови"} + MK{"Македонія"} + ML{"Малі"} + MM{"Мʼянма"} + MN{"Монголія"} + MO{"Макао, С.А.Р. Китаю"} + MP{"Північні Маріанські Острови"} + MQ{"Мартиніка"} + MR{"Мавританія"} + MS{"Монсеррат"} + MT{"Мальта"} + MU{"Маврикій"} + MV{"Мальдіви"} + MW{"Малаві"} + MX{"Мексика"} + MY{"Малайзія"} + MZ{"Мозамбік"} + NA{"Намібія"} + NC{"Нова Каледонія"} + NE{"Нігер"} + NF{"Острів Норфолк"} + NG{"Нігерія"} + NI{"Нікарагуа"} + NL{"Нідерланди"} + NO{"Норвегія"} + NP{"Непал"} + NR{"Науру"} + NU{"Нія"} + NZ{"Нова Зеландія"} + OM{"Оман"} + PA{"Панама"} + PE{"Перу"} + PF{"Французька Полінезія"} + PG{"Папуа Нова Гвінея"} + PH{"Філіппіни"} + PK{"Пакистан"} + PL{"Польща"} + PM{"Сен-Пʼєр і Мікелон"} + PN{"Піткерн"} + PR{"Пуерто-Ріко"} + PS{"Палестина"} + PT{"Португалія"} + PW{"Палау"} + PY{"Парагвай"} + QA{"Катар"} + RE{"Реюньйон"} + RO{"Румунія"} + RU{"Росія"} + RW{"Руанда"} + SA{"Саудівська Аравія"} + SB{"Соломонові Острови"} + SC{"Сейшели"} + SD{"Судан"} + SE{"Швеція"} + SG{"Сінгапур"} + SH{"Св. Єлена"} + SI{"Словенія"} + SJ{"Свалбард і Ян Майєн, острови"} + SK{"Словакія"} + SL{"Сьєрра-Леоне"} + SM{"Сан-Маріно"} + SN{"Сенегал"} + SO{"Сомалі"} + SR{"Суринам"} + ST{"Сан-Томе і Прінсіпі"} + SV{"Сальвадор"} + SY{"Сирійська Арабська Республіка"} + SZ{"Свазіленд"} + TC{"Теркс і Кайкос"} + TD{"Чад"} + TF{"Французькі Південні Території"} + TG{"Того"} + TH{"Таїланд"} + TJ{"Таджикистан"} + TK{"Токелау"} + TL{"Східний Тимор"} + TM{"Туркменистан"} + TN{"Туніс"} + TO{"Тонга"} + TR{"Туреччина"} + TT{"Тринідад і Тобаго"} + TV{"Тувалу"} + TW{"Тайвань"} + TZ{"Танзанія, Обʼєднана Республіка"} + UA{"Україна"} + UG{"Уганда"} + UM{"Віддалені Острови США"} + US{"США"} + UY{"Уругвай"} + UZ{"Узбекистан"} + VA{"Ватикан"} + VC{"Сент-Вінсент і Гренадини"} + VE{"Венесуела"} + VG{"Віргінські острови (Британія)"} + VI{"Віргінські острови (США)"} + VN{"Вʼєтнам"} + VU{"Вануату"} + WF{"Валліс і Футуна, острови"} + WS{"Самоа"} + YE{"Ємен"} + YT{"Майот"} + YU{"Югославія"} + ZA{"ПАР"} + ZM{"Замбія"} + ZW{"Зімбабве"} + } + Currencies{ + ADD{ + "ADD", + "Андоррський динар", + } + ADP{ + "ADP", + "Андоррська песета", + } + AED{ + "AED", + "Дирхем ОАЕ", + } + AFA{ + "AFA", + "Афгані (1927-2002)", + } + AFN{ + "Af", + "Афгані", + } + AIF{ + "AIF", + "Франк Аффарсу та Ісаасу", + } + ALK{ + "ALK", + "Албанський лек (1946-1961)", + } + ALL{ + "lek", + "Албанський лек", + } + ALV{ + "ALV", + "Албанський лек", + } + AMD{ + "dram", + "Вірменський драм", + } + ANG{ + "NA f.", + "Гульден Нідерландських Антіл", + } + AOA{ + "AOA", + "Ангольська кванза", + } + AOK{ + "AOK", + "Ангольська кванза (1977-1990)", + } + AON{ + "AON", + "Ангольська нова кванза (1990-2000)", + } + AOS{ + "AOS", + "Ангольський ескудо", + } + ARA{ + "ARA", + "Аргентинський австрал", + } + ARP{ + "ARP", + "Аргентинське песо (1983-1985)", + } + ARS{ + "Arg$", + "Аргентинське песо", + } + ATS{ + "ATS", + "Австрійський шилінг", + } + AUD{ + "$A", + "Австралійський долар", + } + AUP{ + "AUP", + "Австралійський фунт", + } + AWG{ + "AWG", + "Арубський гульден", + } + AZM{ + "AZM", + "Азербайджанський манат", + } + BAD{ + "BAD", + "Динар Боснії і Гецоговини", + } + BAM{ + "KM", + "Конвертована марка Боснії і Герцоговини", + } + BAN{ + "BAN", + "Новий динар Боснії і Герцоговини", + } + BBD{ + "BDS$", + "Барбадоський долар", + } + BDT{ + "Tk", + "Бангладеська така", + } + BEC{ + "BEC", + "Бельгійський франк (конвертований)", + } + BEF{ + "BF", + "Бельгійський франк", + } + BEL{ + "BEL", + "Бельгійський франк (фінансовий)", + } + BGL{ + "lev", + "Болгарський твердий лев", + } + BGM{ + "BGM", + "Болгарський соціалістичний лев", + } + BGN{ + "BGN", + "Болгарський новий лев", + } + BGO{ + "BGO", + "Болгарський лев (1879-1952)", + } + BHD{ + "BD", + "Бахрейнський динар", + } + BIF{ + "Fbu", + "Бурундійський франк", + } + BMD{ + "Ber$", + "Бермудський долар", + } + BMP{ + "BMP", + "Бермудський фунт", + } + BND{ + "BND", + "Брунейський доларr", + } + BOB{ + "Bs", + "Болівіано", + } + BOL{ + "BOL", + "Болівіано (1863-1962)", + } + BOP{ + "BOP", + "Болівійське песо", + } + BOV{ + "BOV", + "Болівійський мвдол", + } + BRB{ + "BRB", + "Бразильське нове крузейро (1967-1986)", + } + BRC{ + "BRC", + "Бразильське крузадо", + } + BRE{ + "BRE", + "Бразильське крузейро (1990-1993)", + } + BRL{ + "R$", + "Бразильський реал", + } + BRN{ + "BRN", + "Бразильське нове крузадо", + } + BRR{ + "BRR", + "Бразильське крузейро", + } + BRZ{ + "BRZ", + "Бразильське крузейро (1942-1967)", + } + BSD{ + "BSD", + "Багамський долар", + } + BSP{ + "BSP", + "Багамський фунт", + } + BTN{ + "Nu", + "Бутанський нгултрум", + } + BTR{ + "BTR", + "Бутанська рупія", + } + BUK{ + "BUK", + "Бірманський кіат", + } + BUR{ + "BUR", + "Бірманська рупія", + } + BWP{ + "BWP", + "Ботсванська пула", + } + BYB{ + "BYB", + "Білоруський новий рубль (1994-1999)", + } + BYL{ + "BYL", + "Білоруський рубль (1992-1994)", + } + BYR{ + "Rbl", + "Білоруський рубль", + } + BZD{ + "BZ$", + "Белізький долар", + } + BZH{ + "BZH", + "Долар Британського Гондурасу", + } + CAD{ + "Can$", + "Канадський долар", + } + CDF{ + "CDF", + "Конголезький франк", + } + CDG{ + "CDG", + "Франк Конголезької Республіки", + } + CDL{ + "CDL", + "Конголезький заїр", + } + CFF{ + "CFF", + "Франк Центральноафриканської Республіки", + } + CHF{ + "SwF", + "Швейцарський франк", + } + CKD{ + "CKD", + "Долар Островів Кука", + } + CLC{ + "CLC", + "Чилійський кондор", + } + CLE{ + "CLE", + "Чилійський ескудо", + } + CLF{ + "CLF", + "Чилійський UF", + } + CLP{ + "Ch$", + "Чилійське песо", + } + CMF{ + "CMF", + "Камерунський франк", + } + CNY{ + "Y", + "Китайський юань", + } + COB{ + "COB", + "Колумбійське паперове песо", + } + COF{ + "COF", + "Конголезький франк", + } + COP{ + "Col$", + "Колумбійське песо", + } + CRC{ + "C", + "Коста-риканський колон", + } + CSC{ + "CSC", + "Чехословацька крона", + } + CSK{ + "CSK", + "Чехословацька тверда крона", + } + CUP{ + "CUP", + "Кубинське песо", + } + CUX{ + "CUX", + "Кубинські валютні сертифікати", + } + CVE{ + "CVEsc", + "Ескудо Кабо-Верде", + } + CWG{ + "CWG", + "Гульден Курасю", + } + CYP{ + "£C", + "Кіпрський фунт", + } + CZK{ + "CZK", + "Чеська крона", + } + DEM{ + "DEM", + "Німецька марка", + } + DJF{ + "DF", + "Франк Джібуті", + } + DKK{ + "DKr", + "Датська крона", + } + DOP{ + "RD$", + "Домініканське песо", + } + DZD{ + "DA", + "Алжирський динар", + } + DZF{ + "DZF", + "Алжирський новий франк", + } + ECS{ + "ECS", + "Еквадорське сукре", + } + ECV{ + "ECV", + "Еквадорський UVС", + } + EEK{ + "EEK", + "Естонська крона", + } + EGP{ + "EGP", + "Єгипетський фунт", + } + ERN{ + "ERN", + "Еритрейська накфа", + } + ESP{ + "ESP", + "Іспанська песета", + } + ETB{ + "Br", + "Ефіопський бир", + } + ETD{ + "ETD", + "Ефіопський долар", + } + EUR{ + "€", + "Євро", + } + FIM{ + "FIM", + "Фінляндська марка", + } + FIN{ + "FIN", + "Фінляндська марка (1860-1962)", + } + FJD{ + "F$", + "Фіджійський долар", + } + FJP{ + "FJP", + "Фіджійський фунт", + } + FKP{ + "FKP", + "Фолклендський фунт", + } + FOK{ + "FOK", + "Фарерська крона", + } + FRF{ + "FRF", + "Французький франк", + } + GAF{ + "GAF", + "Габонський франк", + } + GBP{ + "£", + "Англійський фунт стерлінгів", + } + GEL{ + "lari", + "Грузинський ларі", + } + GHC{ + "GHC", + "Ганський седі", + } + GHO{ + "GHO", + "Ганський старий седі", + } + GHP{ + "GHP", + "Ганський фунт", + } + GHR{ + "GHR", + "Ганський переоцінений седі", + } + GIP{ + "GIP", + "Гібралтарський фунт", + } + GLK{ + "GLK", + "Гренландська крона", + } + GMD{ + "GMD", + "Гамбійська даласі", + } + GMP{ + "GMP", + "Гамбійський фунт", + } + GNF{ + "GF", + "Гвійнейський франк", + } + GNI{ + "GNI", + "Гвінейський франк (1960-1972)", + } + GNS{ + "GNS", + "Гвінейське сілі", + } + GPF{ + "GPF", + "Гваделупський франк", + } + GQF{ + "GQF", + "Франк Екваторіальної Гвінеї", + } + GRD{ + "GRD", + "Грецька драхма", + } + GRN{ + "GRN", + "Грецька нова драхма", + } + GTQ{ + "Q", + "Гватемальський кетсаль", + } + GUF{ + "GUF", + "Франк Французької Гвіани", + } + GWE{ + "GWE", + "Ескудо Португальської Гвінеї", + } + GWM{ + "GWM", + "Мільрейс Португальської Гвінеї", + } + GWP{ + "GWP", + "Песо Гвінеї-Бісау", + } + GYD{ + "G$", + "Гайянський долар", + } + HKD{ + "HK$", + "Гонконгівський долар", + } + HNL{ + "L", + "Гондураська лемпіра", + } + HRD{ + "HRD", + "Хорватський динар", + } + HRK{ + "HRK", + "Хорватська куна", + } + HTG{ + "HTG", + "Гаїтянський гурд", + } + HUF{ + "Ft", + "Угорський форинт", + } + IBP{ + "IBP", + "Північноірланський фунт", + } + IDN{ + "IDN", + "Індонезійська нова рупія", + } + IDR{ + "Rp", + "Індонезійська рупія", + } + IEP{ + "IR£", + "Ірландський фунт", + } + ILL{ + "ILL", + "Ізраїльський шекель", + } + ILP{ + "ILP", + "Ізраїльський фунт", + } + ILS{ + "ILS", + "Ізраїльський новий шекель", + } + IMP{ + "IMP", + "Фунт стерлінгів Острова Мен", + } + INR{ + "INR", + "Індійська рупія", + } + IQD{ + "ID", + "Іракський динар", + } + IRR{ + "RI", + "Іранський ріал", + } + ISK{ + "ISK", + "Ісландська крона", + } + ITL{ + "₤", + "Італійська ліра", + } + JEP{ + "JEP", + "Фунт стерлінгів Джерсі", + } + JMD{ + "J$", + "Ямайський долар", + } + JMP{ + "JMP", + "Ямайський фунт", + } + JOD{ + "JD", + "Йорданський динар", + } + JPY{ + "¥", + "Японська єна", + } + KES{ + "K Sh", + "Кенійський шилінг", + } + KGS{ + "som", + "Киргизький сом", + } + KHO{ + "KHO", + "Камбоджійський старий рієль", + } + KHR{ + "CR", + "Камбоджійський рієль", + } + KID{ + "KID", + "Долар Кірибаті", + } + KMF{ + "CF", + "Коморський франк", + } + KPW{ + "KPW", + "Вона Північної Кореї", + } + KRO{ + "KRO", + "Стара вона Південної Кореї", + } + KRW{ + "KRW", + "Вона Південної Кореї", + } + KWD{ + "KD", + "Кувейтський динар", + } + KYD{ + "KYD", + "Долар Кайманових островів", + } + KZR{ + "KZR", + "Казахстанський рубль", + } + KZT{ + "T", + "Казахстанський тенге", + } + LAK{ + "LAK", + "Лаоський кіп", + } + LBP{ + "LL", + "Ліванський фунт", + } + LIF{ + "LIF", + "Ліхтенштейнський франк", + } + LKR{ + "SL Re", + "Шрі-ланкійська рупія", + } + LNR{ + "LNR", + "Цейлонська рупія", + } + LRD{ + "LRD", + "Ліберійський долар", + } + LSL{ + "M", + "Лесотський лоті", + } + LTL{ + "LTL", + "Литовський літ", + } + LTT{ + "LTT", + "Литовський талон", + } + LUF{ + "LUF", + "Люксембурзький франк", + } + LVL{ + "LVL", + "Латвійський лат", + } + LVR{ + "LVR", + "Латвійський рубль", + } + LYD{ + "LD", + "Лівійський динар", + } + LYP{ + "LYP", + "Лівійський фунт", + } + MAD{ + "MAD", + "Марокканський дирхем", + } + MAF{ + "MAF", + "Марокканський франк", + } + MCF{ + "MCF", + "Монакський новий франк", + } + MDL{ + "MDL", + "Молдовський лей", + } + MDR{ + "MDR", + "Молдовський рублевий купон", + } + MGA{ + "MGA", + "Мадагаскарський аріарі", + } + MGF{ + "MGF", + "Мадагаскарський франк", + } + MHD{ + "MHD", + "Долар Маршаллових островівr", + } + MKD{ + "MDen", + "Македонський динар", + } + MKN{ + "MKN", + "Македонський динар (1992-1993)", + } + MLF{ + "MLF", + "Малійський франк", + } + MMK{ + "MMK", + "Кʼят Мʼянми", + } + MNT{ + "Tug", + "Монгольський тугрик", + } + MOP{ + "MOP", + "Макао патака", + } + MQF{ + "MQF", + "Мартинікський франк", + } + MRO{ + "UM", + "Мавританська угія", + } + MTL{ + "Lm", + "Мальтійська ліра", + } + MTP{ + "MTP", + "Мальтійський фунт", + } + MUR{ + "MUR", + "Маврикійська рупія", + } + MVP{ + "MVP", + "Мальдівська рупія", + } + MVR{ + "MVR", + "Мальдівська руфія", + } + MWK{ + "MK", + "Малавійська квача", + } + MWP{ + "MWP", + "Малавійський фунт", + } + MXN{ + "MEX$", + "Мексиканське песо", + } + MXP{ + "MXP", + "Мексиканське срібне песо (1861-1992)", + } + MXV{ + "MXV", + "Мексиканський UDI", + } + MYR{ + "RM", + "Малайзійський рингіт", + } + MZE{ + "MZE", + "Мозамбіцький ескудо", + } + MZM{ + "Mt", + "Мозамбіцький метикал", + } + NAD{ + "N$", + "Намібійський долар", + } + NCF{ + "NCF", + "Франк Нової Каледонії", + } + NGN{ + "NGN", + "Нігерійська найра", + } + NGP{ + "NGP", + "Нігерійський фунт", + } + NHF{ + "NHF", + "Франк Гебрідських островів", + } + NIC{ + "NIC", + "Нікарагуанська кордоба", + } + NIG{ + "NIG", + "Нікарагуанська золота кордоба", + } + NIO{ + "NIO", + "Нікарагуанська кордоба оро", + } + NLG{ + "NLG", + "Нідерландський гульден", + } + NOK{ + "NKr", + "Норвезька крона", + } + NPR{ + "Nrs", + "Непальська рупія", + } + NZD{ + "$NZ", + "Новозеландський доларr", + } + NZP{ + "NZP", + "Новозеландський фунт", + } + OMR{ + "RO", + "Оманський ріал", + } + OMS{ + "OMS", + "Оманський ріал саїді", + } + PAB{ + "PAB", + "Панамська бальбоа", + } + PDK{ + "PDK", + "Придністровський рублевий купон", + } + PDN{ + "PDN", + "Придністровський новий рубль", + } + PDR{ + "PDR", + "Придністровський рубль", + } + PEI{ + "PEI", + "Перуанський інті", + } + PEN{ + "PEN", + "Перуанський новий сол", + } + PES{ + "PES", + "Перуанський сол", + } + PGK{ + "PGK", + "Кіна Папуа Нової Гвінеї", + } + PHP{ + "PHP", + "Філіппінське песо", + } + PKR{ + "Pra", + "Пакистанська рупія", + } + PLN{ + "Zl", + "Польський злотий", + } + PLZ{ + "PLZ", + "Польський злотий (1950-1995)", + } + PSP{ + "PSP", + "Палестинський фунт", + } + PTC{ + "PTC", + "Португальський конто", + } + PTE{ + "PTE", + "Португальський ескудо", + } + PYG{ + "PYG", + "Парагвайський гуарані", + } + QAR{ + "QR", + "Катарський ріал", + } + REF{ + "REF", + "Реюньйонський франк", + } + ROL{ + "leu", + "Румунський лей", + } + RON{ + "RON", + "Румунський новий лей", + } + RUB{ + "RUB", + "Російський рубль", + } + RUR{ + "RUR", + "Російський рубль (1991-1998)", + } + RWF{ + "RWF", + "Руандійський франк", + } + SAR{ + "SRl", + "Саудівський ріал", + } + SBD{ + "SI$", + "Долар Соломонових Островів", + } + SCR{ + "SR", + "Сейшельська рупія", + } + SDD{ + "SDD", + "Суданський динар", + } + SDP{ + "SDP", + "Суданський фунт", + } + SEK{ + "SKr", + "Шведська крона", + } + SGD{ + "S$", + "Сінгапурський долар", + } + SHP{ + "SHP", + "Фунт Святої Єлени", + } + SIT{ + "SIT", + "Словенський толар", + } + SKK{ + "Sk", + "Словацька крона", + } + SLL{ + "SLL", + "Леоне Сьєрра-Леоне", + } + SML{ + "SML", + "Ліра Сан-Марино", + } + SOS{ + "So. Sh.", + "Сомалійський шилінг", + } + SQS{ + "SQS", + "Сомалійський шилінг", + } + SRG{ + "Sf", + "Суринамський гульден", + } + SSP{ + "SSP", + "Шотландський фунт", + } + STD{ + "Db", + "Добра Сан-Томе і Прінсіпі", + } + STE{ + "STE", + "Ескудо Сан-Томе і Прінсіпі", + } + SUN{ + "SUN", + "Радянський новий рубль", + } + SUR{ + "SUR", + "Радянський рубль", + } + SVC{ + "SVC", + "Ель-Сальвадорський колон", + } + SYP{ + "LS", + "Сирійський фунт", + } + SZL{ + "E", + "Свазілендські лілангені", + } + TCC{ + "TCC", + "Крона Теркса і Кайкоса", + } + TDF{ + "TDF", + "Франк Чаду", + } + THB{ + "THB", + "Таїландський бат", + } + TJR{ + "TJR", + "Таджицький рубль", + } + TJS{ + "TJS", + "Таджицький сомоні", + } + TMM{ + "TMM", + "Туркменський манат", + } + TND{ + "TND", + "Туніський динар", + } + TOP{ + "T$", + "Паанга Тонго", + } + TOS{ + "TOS", + "Фунт стерлінгів Тонго", + } + TPE{ + "TPE", + "Тіморський ескудо", + } + TPP{ + "TPP", + "Тіморська патака", + } + TRL{ + "TL", + "Турецька ліра", + } + TRY{ + "TRY", + "Нова турецька ліра", + } + TTD{ + "TT$", + "Долар Тринідаду і Тобаго", + } + TTO{ + "TTO", + "Старий долар Тринідаду і Тобаго", + } + TVD{ + "TVD", + "Долар Тувалу", + } + TWD{ + "NT$", + "Новий тайванський долар", + } + TZS{ + "T Sh", + "Танзанійський шилінг", + } + UAH{ + "грн.", + "UAH", + } + UAK{ + "UAK", + "Український карбованець", + } + UGS{ + "UGS", + "Угандійський шилінг (1966-1987)", + } + UGX{ + "U Sh", + "Угандійський шилінг", + } + USD{ + "$", + "Долар США", + } + UYF{ + "UYF", + "Уругвайське сильне песо", + } + UYP{ + "UYP", + "Уругвайське песо (1975-1993)", + } + UYU{ + "Ur$", + "Уругвайське песо", + } + UZS{ + "UZS", + "Узбецький сум", + } + VAL{ + "VAL", + "Ватиканська ліра", + } + VDN{ + "VDN", + "Новий донг Північного Вʼєтнаму", + } + VEB{ + "Be", + "Венесуельський болівар", + } + VGD{ + "VGD", + "Долар Британських Віргінських Островів", + } + VND{ + "VND", + "Вʼєтнамський донг", + } + VNN{ + "VNN", + "Вʼєтнамський новий донг", + } + VNR{ + "VNR", + "Донг Вʼєтнамської Республіки", + } + VNS{ + "VNS", + "Вʼєтнамський національний донг", + } + VUV{ + "VT", + "Вануатська вату", + } + WSP{ + "WSP", + "Фунт Західного Самоа", + } + WST{ + "WST", + "Тала Західного Самоа", + } + XAF{ + "XAF", + "Франк Центральноафриканського фінансового товариства", + } + XAM{ + "XAM", + "Азіатська валютна одиниця", + } + XAU{ + "XAU", + "Золото", + } + XBB{ + "XBB", + "Європейська грошова одиниця", + } + XBC{ + "XBC", + "Європейська розрахункова одиниця (XBC)", + } + XBD{ + "XBD", + "Європейська розрахункова одиниця (XBD)", + } + XCD{ + "EC$", + "Долар Східних Кирибів", + } + XCF{ + "XCF", + "Новий франк КФА", + } + XDR{ + "XDR", + "Спеціальні права запозичення", + } + XEF{ + "XEF", + "Франк КФА BCEAEC", + } + XEU{ + "XEU", + "Європейська валютна одиниця", + } + XFO{ + "XFO", + "Французький золотий франк", + } + XFU{ + "XFU", + "Французький франк UIC", + } + XID{ + "XID", + "Ісламський динар", + } + XMF{ + "XMF", + "Франк французьких метрополій", + } + XNF{ + "XNF", + "Франк Французьких Антильських Островів", + } + XOF{ + "XOF", + "Франк Західноафриканського фінансового товариства", + } + XPF{ + "CFPF", + "Французький тихоокеанський франк", + } + XTR{ + "XTR", + "Рубль РЕВ", + } + YDD{ + "YDD", + "Єменський динар", + } + YER{ + "YRl", + "Єменський ріал", + } + YUD{ + "YUD", + "Югославський твердий динар", + } + YUF{ + "YUF", + "Динар Югославської Федерації", + } + YUG{ + "YUG", + "Югославський динар 1994", + } + YUM{ + "YUM", + "Югославський новий динар", + } + YUN{ + "YUN", + "Югославський конвертований динар", + } + YUO{ + "YUO", + "Югославський жовтневий динар", + } + YUR{ + "YUR", + "Югославський реформований динар", + } + ZAL{ + "ZAL", + "Південноафриканський ранд", + } + ZAP{ + "ZAP", + "Південноафриканський фунт", + } + ZAR{ + "R", + "Південноафриканський ранд", + } + ZMK{ + "ZMK", + "Замбійська квача", + } + ZMP{ + "ZMP", + "Замбійський фунт", + } + ZRN{ + "ZRN", + "Заїрський новий заїр", + } + ZRZ{ + "ZRZ", + "Заїрський заїр", + } + ZWD{ + "Z$", + "Зімбабвійський долар", + } + } + ExemplarCharacters{"[а-щюьяєіїґ ʼ]"} + Keys{ + calendar{"Календар"} + collation{"Сортування"} + currency{"Валюта"} + } + Languages{ + aa{"Афарська"} + ab{"Абхазька"} + af{"Африканс"} + am{"Амхарік"} + ar{"Арабська"} + as{"Ассамська"} + ay{"Аймара"} + az{"Азербайджанська"} + ba{"Башкирська"} + be{"Білоруська"} + bg{"Болгарська"} + bh{"Біхарійська"} + bi{"Бісламійська"} + bn{"Бенгальська"} + bo{"Тибетська"} + br{"Бретонська"} + ca{"Каталонська"} + co{"Корсиканська"} + cs{"Чеська"} + cy{"Валлійська"} + da{"Датська"} + de{"Німецька"} + dz{"Дзонг-ке"} + el{"Грецька"} + en{"Англійська"} + eo{"Есперанто"} + es{"Іспанська"} + et{"Естонська"} + eu{"Басків"} + fa{"Перська"} + fi{"Фінська"} + fj{"Фіджі"} + fo{"Фарерська"} + fr{"Французька"} + fy{"Фризька"} + ga{"Ірландська"} + gd{"Гаельська"} + gl{"Галісійська"} + gn{"Гуарані"} + gu{"Гуяраті"} + ha{"Хауса"} + he{"Іврит"} + hi{"Гінді"} + hr{"Хорватська"} + hu{"Угорська"} + hy{"Вірменська"} + ia{"Інтерлінгва"} + id{"Індонезійська"} + ie{"Інтерлінгва"} + ik{"Інупіак"} + is{"Ісландська"} + it{"Італійська"} + ja{"Японська"} + jv{"Яванська"} + ka{"Грузинська"} + kk{"Казахська"} + kl{"Калааллісут"} + km{"Кхмерська"} + kn{"Каннада"} + ko{"Корейська"} + ks{"Кашмірська"} + ku{"Курдська"} + ky{"Киргизька"} + la{"Латинська"} + ln{"Лінгала"} + lo{"Лаоська"} + lt{"Литовська"} + lv{"Латвійська"} + mg{"Малагасійська"} + mi{"Маорі"} + mk{"Македонська"} + ml{"Малайялам"} + mn{"Монгольська"} + mo{"Молдавська"} + mr{"Маратхі"} + ms{"Малайська"} + mt{"Мальтійська"} + my{"Бірманська"} + na{"Науру"} + ne{"Непальська"} + nl{"Голландська"} + no{"Норвезька"} + oc{"Окитан"} + om{"Оромо"} + or{"Орія"} + pa{"Панджабі"} + pl{"Польська"} + ps{"Пашто"} + pt{"Португальська"} + qu{"Кечуа"} + rm{"Ретророманські діалекти"} + rn{"Кірундійська"} + ro{"Румунська"} + ru{"Російська"} + rw{"Кінаруанда"} + sa{"Санскрит"} + sd{"Сіндтхі"} + sg{"Сангро"} + sh{"Сербсько-хорватська"} + si{"Сингальська"} + sk{"Словацька"} + sl{"Словенська"} + sm{"Самоанська"} + sn{"Шона"} + so{"Сомалі"} + sq{"Албанська"} + sr{"Сербська"} + ss{"Сісваті"} + st{"Сото, південний діалект"} + su{"Суданська"} + sv{"Шведська"} + sw{"Суахілі"} + ta{"Тамільська"} + te{"Телугу"} + tg{"Таджицька"} + th{"Тайська"} + ti{"Тигріні"} + tk{"Туркменська"} + tl{"Тагальська"} + tn{"Сетсванська"} + to{"Тонга (острови Тонга)"} + tr{"Турецька"} + ts{"Тсонго"} + tt{"Татарська"} + tw{"Тві"} + ug{"Уйгурська"} + uk{"Українська"} + ur{"Урду"} + uz{"Узбецька"} + vi{"Вʼєтнамська"} + vo{"Волапак"} + wo{"Волоф"} + xh{"Кхоса"} + yi{"Ідиш"} + yo{"Йоруба"} + za{"Зуанг"} + zh{"Китайська"} + zu{"Зулуська"} + } + LocaleScript{ + "Cyrl", + } + NumberElements{ + ",", + " ", + ";", + "%", + "0", + "#", + "-", + "E", + "‰", + "∞", + "�", + "+", + } + Scripts{ + Arab{"Арабський"} + Armn{"Вірменський"} + Beng{"Бенгальський"} + Bopo{"Бопомофо"} + Brai{"Брайля"} + Buhd{"Бухід"} + Cans{"Уніфіковані символи канадських туземців"} + Cher{"Черокі"} + Copt{"Коптський"} + Cprt{"Кіпрський"} + Cyrl{"Кириличний"} + Deva{"Деванагарі"} + Dsrt{"Дезерет"} + Ethi{"Ефіопський"} + Geor{"Грузинський"} + Goth{"Готський"} + Grek{"Грецький"} + Gujr{"Гуяраті"} + Guru{"Гурмукхі"} + Hang{"Хангул"} + Hano{"Хануну"} + Hebr{"Єврейський"} + Hira{"Хірагана"} + Ital{"Давньоіталійський"} + Kana{"Катакана"} + Khmr{"Кхмерський"} + Knda{"Каннада"} + Laoo{"Лаоський"} + Latn{"Латинський"} + Limb{"Limbu"} + Linb{"Лінійний В"} + Mlym{"Малайялам"} + Mong{"Монгольський"} + Mymr{"Мʼянмар"} + Ogam{"Давньоірландський"} + Orya{"Орія"} + Osma{"Османський"} + Qaai{"Успадкований"} + Runr{"Руни"} + Shaw{"Шоу"} + Sinh{"Сингальський"} + Syrc{"Сирійський"} + Tagb{"Тагбанва"} + Tale{"Тай-лі"} + Taml{"Тамільський"} + Telu{"Телугу"} + Tglg{"Тагальський"} + Thaa{"Таана"} + Thai{"Тайський"} + Tibt{"Тибетський"} + Yiii{"Йї"} + Zyyy{"Невизначений"} + } + Types{ + calendar{ + buddhist{"Буддійський календар"} + chinese{"Китайський календар"} + gregorian{"Григоріанський календар"} + hebrew{"Єврейський календар"} + islamic{"Мусульманський календар"} + islamic-civil{"Мусульманський друкований календар"} + japanese{"Японський календар"} + } + collation{ + direct{"Прямий порядок"} + phonebook{"Телефонна книга"} + pinyin{"Порядок Pinyin"} + stroke{"Штриховий порядок"} + traditional{"Традиційний"} + } + } + Version{"1.2"} + calendar{ + gregorian{ + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "HH:mm:ss z", + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm", + "EEEE, d MMMM yyyy 'р.'", + "d MMMM yyyy", + "d MMM yyyy", + "dd.MM.yy", + "{1} {0}", + } + dayNames{ + format{ + abbreviated{ + "Нд", + "Пн", + "Вт", + "Ср", + "Чт", + "Пт", + "Сб", + } + narrow{ + "Н", + "П", + "В", + "С", + "Ч", + "П", + "С", + } + wide{ + "Неділя", + "Понеділок", + "Вівторок", + "Середа", + "Четвер", + "Пʼятниця", + "Субота", + } + } + } + eras{ + abbreviated{ + "до н.е.", + "н.е.", + } + } + monthNames{ + format{ + abbreviated{ + "Січ", + "Лют", + "Бер", + "Кві", + "Тра", + "Чер", + "Лип", + "Сер", + "Вер", + "Жов", + "Лис", + "Гру", + } + narrow{ + "С", + "Л", + "Б", + "К", + "Т", + "Ч", + "Л", + "С", + "В", + "Ж", + "Л", + "Г", + } + wide{ + "січня", + "лютого", + "березня", + "квітня", + "травня", + "червня", + "липня", + "серпня", + "вересня", + "жовтня", + "листопада", + "грудня", + } + } + stand-alone{ + abbreviated{ + "Січ", + "Лют", + "Бер", + "Кві", + "Тра", + "Чер", + "Лип", + "Сер", + "Вер", + "Жов", + "Лис", + "Гру", + } + narrow{ + "С", + "Л", + "Б", + "К", + "Т", + "Ч", + "Л", + "С", + "В", + "Ж", + "Л", + "Г", + } + wide{ + "Січень", + "Лютий", + "Березень", + "Квітень", + "Травень", + "Червень", + "Липень", + "Серпень", + "Вересень", + "Жовтень", + "Листопад", + "Грудень", + } + } + } + } + } + localPatternChars{"GanjkHmsSEDFwWxhKzAeugXZ"} +} diff --git a/icuSources/data/locales/uk_UA.txt b/icuSources/data/locales/uk_UA.txt index d9a4282d..3bdd9a86 100644 --- a/icuSources/data/locales/uk_UA.txt +++ b/icuSources/data/locales/uk_UA.txt @@ -1,19 +1,17 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/uk_UA.xml // * // *************************************************************************** - -uk_UA { - Version { "2.0" } -// LocaleString { "uk_UA" } - NumberPatterns { +uk_UA{ + NumberPatterns{ "#,##0.###;-#,##0.###", - "#,##0.00 \u00A4;-#,##0.00 \u00A4", + "#,##0.00 ¤;-#,##0.00 ¤", "#,##0%", "#E0", } -// ShortCountry { "UKR" } - LocaleID:int { 0x0422 } + Version{"1.2"} } diff --git a/icuSources/data/locales/vi.txt b/icuSources/data/locales/vi.txt index 552cc085..771745be 100644 --- a/icuSources/data/locales/vi.txt +++ b/icuSources/data/locales/vi.txt @@ -1,84 +1,277 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/vi.xml // * // *************************************************************************** - -vi { - Version { "2.0" } - CollationElements { - Version { "2.0" } - Sequence { "[normalization on]&\u0300<<\u0309<<\u0303<<\u0301<<" - "\u0323<<\u0306<<\u0302<<\u031B" - "&D<\u0111<<<\u0110" } - } - Countries { - VN { "Vi\u1EC7t Nam" } - } - Languages { - vi { "Ti\u1EBFng Vi\u1EC7t" } - } - DateTimePatterns { - "HH:mm:ss z", - "HH:mm:ss z", - "HH:mm:ss", - "HH:mm", - "EEEE dd MMMM yyyy", - "EEE dd MMM yyyy", - "dd MMM yyyy", - "dd/MM/yy", - "{0} {1}", +/** + * ICU source: ../../../locale/icu/main/vi.xml + */ +vi{ + Countries{ + AE{"Các Tiểu Vương quốc A-rập Thống nhất"} + AF{"Áp-ga-ni-xtan"} + AG{"An-ti-gu-a và Ba-bu-đa"} + AL{"An-ba-ni"} + AM{"Ác-mê-ni-a"} + AO{"Ăng-gô-la"} + AR{"Ác-hen-ti-na"} + AT{"Áo"} + AU{"Úc"} + AZ{"Ai-déc-bai-gian"} + BA{"Bô-xni-a Héc-xê-gô-vi-na"} + BB{"Bác-ba-đốt"} + BD{"Băng-la-đét"} + BE{"Bỉ"} + BF{"Buốc-ki-na Pha-xô"} + BG{"Bun-ga-ri"} + BH{"Ba-ren"} + BI{"Bu-run-đi"} + BJ{"Bê-nanh"} + BN{"Bru-nây"} + BO{"Bô-li-vi-a"} + BR{"Bra-xin"} + BS{"Ba-ha-ma"} + BW{"Bốt-xoa-na"} + BY{"Bê-la-rút"} + BZ{"Bê-li-xê"} + CA{"Ca-na-đa"} + CF{"Cộng hòa Trung Phi"} + CG{"Công-gô"} + CH{"Thụy Sĩ"} + CI{"Bờ Biển Ngà"} + CL{"Chi-lê"} + CM{"Ca-mơ-run"} + CN{"Trung Quốc"} + CO{"Cô-lôm-bi-a"} + CR{"Cốt-xta Ri-ca"} + CU{"Cu Ba"} + CV{"Cáp-ve"} + CY{"Síp"} + CZ{"Cộng hòa Séc"} + DE{"Đức"} + DJ{"Gi-bu-ti"} + DK{"Đan Mạch"} + DZ{"An-giê-ri"} + EC{"Ê-cu-a-đo"} + EE{"E-xtô-ni-a"} + EG{"Ai Cập"} + EH{"Tây Sahara"} + ER{"Ê-ri-tơ-rê-a"} + ES{"Tây Ban Nha"} + ET{"Ê-ti-ô-pi-a"} + FI{"Phần Lan"} + FJ{"Phi-gi"} + FM{"Mi-crô-nê-xi-a"} + FR{"Pháp"} + GA{"Ga-bông"} + GB{"Vương quốc Anh"} + GD{"Grê-na-đa"} + GE{"Gru-di-a"} + GH{"Gha-na"} + GM{"Găm-bi-a"} + GN{"Ghi-nê"} + GQ{"Ghi-nê Xích-đạo"} + GR{"Hy Lạp"} + GT{"Goa-tê-ma-la"} + GW{"Ghi-nê Bít-xao"} + GY{"Guy-a-na"} + HN{"Hôn-đu-rát"} + HR{"Crô-a-ti-a"} + HT{"Ha-i-ti"} + HU{"Hung-ga-ri"} + ID{"Nam Dương"} + IE{"Ai-len"} + IL{"I-xra-en"} + IN{"Ấn Độ"} + IQ{"I-rắc"} + IR{"I-ran"} + IS{"Ai-xơ-len"} + IT{"Ý"} + JM{"Ha-mai-ca"} + JO{"Gióc-đa-ni"} + JP{"Nhật Bản"} + KE{"Kê-ni-a"} + KG{"Cư-rơ-gư-xtan"} + KH{"Campuchia"} + KI{"Ki-ri-ba-ti"} + KM{"Cô-mô"} + KN{"Xan-kít và Nê-vi"} + KP{"Bắc Triều Tiên"} + KR{"Hàn Quốc"} + KW{"Cô-oét"} + KZ{"Ka-dắc-xtan"} + LA{"Lào"} + LB{"Li-băng"} + LC{"Xan Lu-xi"} + LI{"Lich-ten-xtên"} + LK{"Xri Lan-ca"} + LR{"Li-bê-ri-a"} + LS{"Lê-xô-thô"} + LT{"Li-tu-a-ni-a"} + LU{"Lúc-xăm-bua"} + LV{"Lát-vi-a"} + LY{"Li-bi"} + MA{"Ma-rốc"} + MC{"Mô-na-cô"} + MD{"Môn-đô-va"} + MG{"Ma-đa-gát-xca"} + MH{"Quần đảo Mác-san"} + MK{"Ma-xê-đô-ni-a"} + ML{"Ma-li"} + MM{"Mi-an-ma"} + MN{"Mông Cổ"} + MR{"Mô-ri-ta-ni"} + MT{"Man-ta"} + MU{"Mô-ri-xơ"} + MV{"Man-đi-vơ"} + MW{"Ma-la-uy"} + MX{"Mê-hi-cô"} + MY{"Ma-lay-xi-a"} + MZ{"Mô-dăm-bích"} + NA{"Nam-mi-bi-a"} + NE{"Ni-giê"} + NG{"Ni-giê-ri-a"} + NI{"Ni-ca-ra-goa"} + NL{"Hà Lan"} + NO{"Na Uy"} + NP{"Nê-pan"} + NZ{"Niu Di-lân"} + OM{"Ô-man"} + PA{"Pa-na-ma"} + PE{"Pê-ru"} + PG{"Pa-pu-a Niu Ghi-nê"} + PH{"Phi-lip-pin"} + PK{"Pa-ki-xtan"} + PL{"Ba Lan"} + PT{"Bồ Đào Nha"} + PY{"Pa-ra-goay"} + QA{"Ca-ta"} + RO{"Ru-ma-ni"} + RU{"Nga"} + RW{"Ru-an-đa"} + SA{"A-rập Xê-út"} + SB{"Quần đảo Xô-lô-mông"} + SC{"Xây-sen"} + SD{"Xu-đăng"} + SE{"Thụy Điển"} + SG{"Xin-ga-po"} + SI{"Xlô-ven-ni-a"} + SK{"Xlô-va-ki-a"} + SL{"Xi-ê-ra Lê-ôn"} + SM{"Xan Ma-ri-nô"} + SN{"Xê-nê-gan"} + SO{"Xô-ma-li"} + SP{"Séc-bia"} + SR{"Xu-ri-nam"} + ST{"Xao Tô-mê và Prin-xi-pê"} + SV{"En-san-va-đo"} + SY{"Xi-ri"} + SZ{"Xoa-di-len"} + TD{"Sát"} + TG{"Tô-gô"} + TH{"Thái Lan"} + TJ{"Tát-gi-ki-xtan"} + TM{"Tuốc-mê-ni-xtan"} + TN{"Tuy-ni-di"} + TO{"Tông-ga"} + TR{"Thổ Nhĩ Kỳ"} + TT{"Tri-ni-đát và Tô-ba-gô"} + TV{"Tu-va-lu"} + TW{"Đài Loan"} + TZ{"Tan-da-ni-a"} + UA{"U-crai-na"} + UG{"U-gan-đa"} + US{"Hoa Kỳ"} + UY{"U-ru-goay"} + UZ{"U-dơ-bê-ki-xtan"} + VA{"Va-ti-căng"} + VC{"Xan Vin-xen và Grê-na-din"} + VE{"Vê-nê-zu-ê-la"} + VN{"Việt Nam"} + VU{"Va-nu-a-tu"} + WS{"Xa-moa"} + YE{"Y-ê-men"} + YU{"Nam Tư"} + ZA{"Nam Phi"} + ZM{"Dăm-bi-a"} + ZW{"Dim-ba-bu-ê"} } - DayAbbreviations { - "Th 2", - "Th 3", - "Th 4", - "Th 5", - "Th 6", - "Th 7", - "CN", + Currencies{ + VND{ + "đ", + "đồng", + } } - DayNames { - "Th\u1EE9 hai", - "Th\u1EE9 ba", - "Th\u1EE9 t\u01B0", - "Th\u1EE9 n\u0103m", - "Th\u1EE9 s\u00E1u", - "Th\u1EE9 b\u1EA3y", - "Ch\u1EE7 nh\u1EADt", + ExemplarCharacters{"[a-zẠ-ỹđơà-ãè-êìíò-õùúýăĩũư]"} + Languages{ + ar{"Tiếng A-rập"} + az{"Tiếng Ai-déc-bai-gian"} + be{"Tiếng Bê-la-rút"} + bg{"Tiếng Bun-ga-ri"} + bo{"Tiếng Tây Tạng"} + ca{"Tiếng Ca-ta-lăng"} + cs{"Tiếng Séc"} + da{"Tiếng Đan Mạch"} + de{"Tiếng Đức"} + el{"Tiếng Hy Lạp"} + en{"Tiếng Anh"} + eo{"Tiếng Quốc Tế Ngữ"} + es{"Tiếng Tây Ban Nha"} + et{"Tiếng E-xtô-ni-a"} + fa{"Tiếng Ba Tư"} + fi{"Tiếng Phần Lan"} + fr{"Tiếng Pháp"} + ga{"Tiếng Ai-len"} + he{"Tiếng Hê-brơ"} + hi{"Tiếng Hin-đi"} + hr{"Tiếng Crô-a-ti-a"} + hu{"Tiếng Hung-ga-ri"} + hy{"Tiếng Ác-mê-ni"} + ia{"Tiếng Khoa Học Quốc Tế"} + id{"Tiếng In-đô-nê-xia"} + is{"Tiếng Ai-xơ-len"} + it{"Tiếng Ý"} + ja{"Tiếng Nhật"} + jv{"Tiếng Gia-va"} + km{"Tiếng Campuchia"} + kn{"Tiếng Kan-na-đa"} + ko{"Tiếng Hàn Quốc"} + la{"Tiếng La-tinh"} + lo{"Tiếng Lào"} + lt{"Tiếng Lít-va"} + lv{"Tiếng Lát-vi-a"} + mk{"Tiếng Ma-xê-đô-ni-a"} + mn{"Tiếng Mông Cổ"} + ms{"Tiếng Ma-lay-xi-a"} + ne{"Tiếng Nê-pan"} + nl{"Tiếng Hà Lan"} + no{"Tiếng Na Uy"} + pl{"Tiếng Ba Lan"} + pt{"Tiếng Bồ Đào Nha"} + ro{"Tiếng Ru-ma-ni"} + ru{"Tiếng Nga"} + sa{"Tiếng Phạn"} + sk{"Tiếng Xlô-vác"} + sl{"Tiếng Xlô-ven"} + so{"Tiếng Xô-ma-li"} + sq{"Tiếng An-ba-ni"} + sr{"Tiếng Séc-bi"} + sv{"Tiếng Thụy Điển"} + th{"Tiếng Thái"} + tr{"Tiếng Thổ Nhĩ Kỳ"} + uk{"Tiếng U-crai-na"} + uz{"Tiếng U-dơ-bếch"} + vi{"Tiếng Việt"} + yi{"Tiếng Y-đit"} + zh{"Tiếng Trung Quốc"} } - LocaleID:int { 0x002A } -// LocaleString { "vi" } - MonthAbbreviations { - "Thg 1", - "Thg 2", - "Thg 3", - "Thg 4", - "Thg 5", - "Thg 6", - "Thg 7", - "Thg 8", - "Thg 9", - "Thg 10", - "Thg 11", - "Thg 12", + LocaleScript{ + "Latn", } - MonthNames { - "Th\u00E1ng m\u1ED9t", - "Th\u00E1ng hai", - "Th\u00E1ng ba", - "Th\u00E1ng t\u01B0", - "Th\u00E1ng n\u0103m", - "Th\u00E1ng s\u00E1u", - "Th\u00E1ng b\u1EA3y", - "Th\u00E1ng t\u00E1m", - "Th\u00E1ng ch\u00EDn", - "Th\u00E1ng m\u01B0\u1EDDi", - "Th\u00E1ng m\u01B0\u1EDDi m\u1ED9t", - "Th\u00E1ng m\u01B0\u1EDDi hai", - } - NumberElements { + NumberElements{ ",", ".", ";", @@ -87,20 +280,99 @@ vi { "#", "-", "E", - "\u2030", - "\u221E", - "\uFFFD", - ",", + "‰", + "∞", + "�", + "+", } - NumberPatterns { + NumberPatterns{ "#,##0.###;-#,##0.###", - "#,##0.00 \u00A4;-#,##0.00 \u00A4", + "#,##0.00 ¤;-#,##0.00 ¤", "#,##0%", "#E0", } -// ShortLanguage { "vie" } -// LocaleScript{ -// "Latn", // ISO 15924 Name -// } - ExemplarCharacters{ "[a-z \u1EA0-\u1Ef9 \u0111 \u01A1 \u00E0-\u00E3 \u00E8-\u00EA \u00EC \u00ED \u00F2-\u00F5 \u00F9 \u00FA \u00FD \u0103 \u0129 \u0169 \u01B0]" } + Version{"1.2"} + calendar{ + gregorian{ + AmPmMarkers{ + "SA", + "CH", + } + DateTimeElements:intvector{ + 2, + 1, + } + DateTimePatterns{ + "HH:mm:ss z", + "HH:mm:ss z", + "HH:mm:ss", + "HH:mm", + "EEEE, 'ngày' dd MMMM 'năm' yyyy", + "'Ngày' dd 'tháng' M 'năm' yyyy", + "dd-MM-yyyy", + "dd/MM/yyyy", + "{0} {1}", + } + dayNames{ + format{ + abbreviated{ + "CN", + "Th 2", + "Th 3", + "Th 4", + "Th 5", + "Th 6", + "Th 7", + } + wide{ + "Chủ nhật", + "Thứ hai", + "Thứ ba", + "Thứ tư", + "Thứ năm", + "Thứ sáu", + "Thứ bảy", + } + } + } + eras{ + abbreviated{ + "tr. CN", + "sau CN", + } + } + monthNames{ + format{ + abbreviated{ + "thg 1", + "thg 2", + "thg 3", + "thg 4", + "thg 5", + "thg 6", + "thg 7", + "thg 8", + "thg 9", + "thg 10", + "thg 11", + "thg 12", + } + wide{ + "tháng một", + "tháng hai", + "tháng ba", + "tháng tư", + "tháng năm", + "tháng sáu", + "tháng bảy", + "tháng tám", + "tháng chín", + "tháng mười", + "tháng mười một", + "tháng mười hai", + } + } + } + } + } } diff --git a/icuSources/data/locales/vi_VN.txt b/icuSources/data/locales/vi_VN.txt index 39735c89..e6b4715e 100644 --- a/icuSources/data/locales/vi_VN.txt +++ b/icuSources/data/locales/vi_VN.txt @@ -1,17 +1,11 @@ -// *************************************************************************** +// *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/vi_VN.xml // * // *************************************************************************** - -vi_VN { - Version{ "2.0" } - LocaleID:int { 0x042A } -// LocaleString { "vi_VN" } -// ShortCountry { "VNM" } - - Currencies { - VND { "\u20AB", "VND" } // Vietnamese Dong - } +vi_VN{ + Version{"1.2"} } diff --git a/icuSources/data/locales/zh.txt b/icuSources/data/locales/zh.txt index 89df84e1..56b64eeb 100644 --- a/icuSources/data/locales/zh.txt +++ b/icuSources/data/locales/zh.txt @@ -1,1843 +1,2530 @@ -// *************************************************************************** -// * -// * Copyright (C) 1997-2003, International Business Machines -// * Corporation and others. All Rights Reserved. -// * -// *************************************************************************** - -zh { - Version{ "2.0" } - - "%%PREEURO" { "\u65e7\u5e01" } - "%%EURO" { "\u6b27\u5143" } - - //"%%POSIX" { "POSIX" } - - "%%TRADITIONAL" { "\u4f20\u7edf\u5386\u6cd5" } - - "%%REVISED" { "\u5df2\u4fee\u8ba2" } - - AmPmMarkers { - "\u4E0A\u5348", - "\u4E0B\u5348", - } - CollationElements { - Version { "1.0" } - Sequence{"&\u0304<<\u0301<<\u030C<<\u0300<<\u0308" - "&[top]" - "<\u554A<\u963F<\u57C3<\u6328<\u54CE<\u5509<\u54C0<\u7691<\u764C" - "<\u853C<\u77EE<\u827E<\u788D<\u7231<\u9698<\u978D<\u6C28<\u5B89" - "<\u4FFA<\u6309<\u6697<\u5CB8<\u80FA<\u6848<\u80AE<\u6602<\u76CE" - "<\u51F9<\u6556<\u71AC<\u7FF1<\u8884<\u50B2<\u5965<\u61CA<\u6FB3" - "<\u82AD<\u634C<\u6252<\u53ED<\u5427<\u7B06<\u516B<\u75A4<\u5DF4" - "<\u62D4<\u8DCB<\u9776<\u628A<\u8019<\u575D<\u9738<\u7F62<\u7238" - "<\u767D<\u67CF<\u767E<\u6446<\u4F70<\u8D25<\u62DC<\u7A17<\u6591" - "<\u73ED<\u642C<\u6273<\u822C<\u9881<\u677F<\u7248<\u626E<\u62CC" - "<\u4F34<\u74E3<\u534A<\u529E<\u7ECA<\u90A6<\u5E2E<\u6886<\u699C" - "<\u8180<\u7ED1<\u68D2<\u78C5<\u868C<\u9551<\u508D<\u8C24<\u82DE" - "<\u80DE<\u5305<\u8912<\u5265<\u8584<\u96F9<\u4FDD<\u5821<\u9971" - "<\u5B9D<\u62B1<\u62A5<\u66B4<\u8C79<\u9C8D<\u7206<\u676F<\u7891" - "<\u60B2<\u5351<\u5317<\u8F88<\u80CC<\u8D1D<\u94A1<\u500D<\u72C8" - "<\u5907<\u60EB<\u7119<\u88AB<\u5954<\u82EF<\u672C<\u7B28<\u5D29" - "<\u7EF7<\u752D<\u6CF5<\u8E66<\u8FF8<\u903C<\u9F3B<\u6BD4<\u9119" - "<\u7B14<\u5F7C<\u78A7<\u84D6<\u853D<\u6BD5<\u6BD9<\u6BD6<\u5E01" - "<\u5E87<\u75F9<\u95ED<\u655D<\u5F0A<\u5FC5<\u8F9F<\u58C1<\u81C2" - "<\u907F<\u965B<\u97AD<\u8FB9<\u7F16<\u8D2C<\u6241<\u4FBF<\u53D8" - "<\u535E<\u8FA8<\u8FA9<\u8FAB<\u904D<\u6807<\u5F6A<\u8198<\u8868" - "<\u9CD6<\u618B<\u522B<\u762A<\u5F6C<\u658C<\u6FD2<\u6EE8<\u5BBE" - "<\u6448<\u5175<\u51B0<\u67C4<\u4E19<\u79C9<\u997C<\u70B3<\u75C5" - "<\u5E76<\u73BB<\u83E0<\u64AD<\u62E8<\u94B5<\u6CE2<\u535A<\u52C3" - "<\u640F<\u94C2<\u7B94<\u4F2F<\u5E1B<\u8236<\u8116<\u818A<\u6E24" - "<\u6CCA<\u9A73<\u6355<\u535C<\u54FA<\u8865<\u57E0<\u4E0D<\u5E03" - "<\u6B65<\u7C3F<\u90E8<\u6016<\u64E6<\u731C<\u88C1<\u6750<\u624D" - "<\u8D22<\u776C<\u8E29<\u91C7<\u5F69<\u83DC<\u8521<\u9910<\u53C2" - "<\u8695<\u6B8B<\u60ED<\u60E8<\u707F<\u82CD<\u8231<\u4ED3<\u6CA7" - "<\u85CF<\u64CD<\u7CD9<\u69FD<\u66F9<\u8349<\u5395<\u7B56<\u4FA7" - "<\u518C<\u6D4B<\u5C42<\u8E6D<\u63D2<\u53C9<\u832C<\u8336<\u67E5" - "<\u78B4<\u643D<\u5BDF<\u5C94<\u5DEE<\u8BE7<\u62C6<\u67F4<\u8C7A" - "<\u6400<\u63BA<\u8749<\u998B<\u8C17<\u7F20<\u94F2<\u4EA7<\u9610" - "<\u98A4<\u660C<\u7316<\u573A<\u5C1D<\u5E38<\u957F<\u507F<\u80A0" - "<\u5382<\u655E<\u7545<\u5531<\u5021<\u8D85<\u6284<\u949E<\u671D" - "<\u5632<\u6F6E<\u5DE2<\u5435<\u7092<\u8F66<\u626F<\u64A4<\u63A3" - "<\u5F7B<\u6F88<\u90F4<\u81E3<\u8FB0<\u5C18<\u6668<\u5FF1<\u6C89" - "<\u9648<\u8D81<\u886C<\u6491<\u79F0<\u57CE<\u6A59<\u6210<\u5448" - "<\u4E58<\u7A0B<\u60E9<\u6F84<\u8BDA<\u627F<\u901E<\u9A8B<\u79E4" - "<\u5403<\u75F4<\u6301<\u5319<\u6C60<\u8FDF<\u5F1B<\u9A70<\u803B" - "<\u9F7F<\u4F88<\u5C3A<\u8D64<\u7FC5<\u65A5<\u70BD<\u5145<\u51B2" - "<\u866B<\u5D07<\u5BA0<\u62BD<\u916C<\u7574<\u8E0C<\u7A20<\u6101" - "<\u7B79<\u4EC7<\u7EF8<\u7785<\u4E11<\u81ED<\u521D<\u51FA<\u6A71" - "<\u53A8<\u8E87<\u9504<\u96CF<\u6EC1<\u9664<\u695A<\u7840<\u50A8" - "<\u77D7<\u6410<\u89E6<\u5904<\u63E3<\u5DDD<\u7A7F<\u693D<\u4F20" - "<\u8239<\u5598<\u4E32<\u75AE<\u7A97<\u5E62<\u5E8A<\u95EF<\u521B" - "<\u5439<\u708A<\u6376<\u9524<\u5782<\u6625<\u693F<\u9187<\u5507" - "<\u6DF3<\u7EAF<\u8822<\u6233<\u7EF0<\u75B5<\u8328<\u78C1<\u96CC" - "<\u8F9E<\u6148<\u74F7<\u8BCD<\u6B64<\u523A<\u8D50<\u6B21<\u806A" - "<\u8471<\u56F1<\u5306<\u4ECE<\u4E1B<\u51D1<\u7C97<\u918B<\u7C07" - "<\u4FC3<\u8E7F<\u7BE1<\u7A9C<\u6467<\u5D14<\u50AC<\u8106<\u7601" - "<\u7CB9<\u6DEC<\u7FE0<\u6751<\u5B58<\u5BF8<\u78CB<\u64AE<\u6413" - "<\u63AA<\u632B<\u9519<\u642D<\u8FBE<\u7B54<\u7629<\u6253<\u5927" - "<\u5446<\u6B79<\u50A3<\u6234<\u5E26<\u6B86<\u4EE3<\u8D37<\u888B" - "<\u5F85<\u902E<\u6020<\u803D<\u62C5<\u4E39<\u5355<\u90F8<\u63B8" - "<\u80C6<\u65E6<\u6C2E<\u4F46<\u60EE<\u6DE1<\u8BDE<\u5F39<\u86CB" - "<\u5F53<\u6321<\u515A<\u8361<\u6863<\u5200<\u6363<\u8E48<\u5012" - "<\u5C9B<\u7977<\u5BFC<\u5230<\u7A3B<\u60BC<\u9053<\u76D7<\u5FB7" - "<\u5F97<\u7684<\u8E6C<\u706F<\u767B<\u7B49<\u77AA<\u51F3<\u9093" - "<\u5824<\u4F4E<\u6EF4<\u8FEA<\u654C<\u7B1B<\u72C4<\u6DA4<\u7FDF" - "<\u5AE1<\u62B5<\u5E95<\u5730<\u8482<\u7B2C<\u5E1D<\u5F1F<\u9012" - "<\u7F14<\u98A0<\u6382<\u6EC7<\u7898<\u70B9<\u5178<\u975B<\u57AB" - "<\u7535<\u4F43<\u7538<\u5E97<\u60E6<\u5960<\u6DC0<\u6BBF<\u7889" - "<\u53FC<\u96D5<\u51CB<\u5201<\u6389<\u540A<\u9493<\u8C03<\u8DCC" - "<\u7239<\u789F<\u8776<\u8FED<\u8C0D<\u53E0<\u4E01<\u76EF<\u53EE" - "<\u9489<\u9876<\u9F0E<\u952D<\u5B9A<\u8BA2<\u4E22<\u4E1C<\u51AC" - "<\u8463<\u61C2<\u52A8<\u680B<\u4F97<\u606B<\u51BB<\u6D1E<\u515C" - "<\u6296<\u6597<\u9661<\u8C46<\u9017<\u75D8<\u90FD<\u7763<\u6BD2" - "<\u728A<\u72EC<\u8BFB<\u5835<\u7779<\u8D4C<\u675C<\u9540<\u809A" - "<\u5EA6<\u6E21<\u5992<\u7AEF<\u77ED<\u953B<\u6BB5<\u65AD<\u7F0E" - "<\u5806<\u5151<\u961F<\u5BF9<\u58A9<\u5428<\u8E72<\u6566<\u987F" - "<\u56E4<\u949D<\u76FE<\u9041<\u6387<\u54C6<\u591A<\u593A<\u579B" - "<\u8EB2<\u6735<\u8DFA<\u8235<\u5241<\u60F0<\u5815<\u86FE<\u5CE8" - "<\u9E45<\u4FC4<\u989D<\u8BB9<\u5A25<\u6076<\u5384<\u627C<\u904F" - "<\u9102<\u997F<\u6069<\u800C<\u513F<\u8033<\u5C14<\u9975<\u6D31" - "<\u4E8C<\u8D30<\u53D1<\u7F5A<\u7B4F<\u4F10<\u4E4F<\u9600<\u6CD5" - "<\u73D0<\u85E9<\u5E06<\u756A<\u7FFB<\u6A0A<\u77FE<\u9492<\u7E41" - "<\u51E1<\u70E6<\u53CD<\u8FD4<\u8303<\u8D29<\u72AF<\u996D<\u6CDB" - "<\u574A<\u82B3<\u65B9<\u80AA<\u623F<\u9632<\u59A8<\u4EFF<\u8BBF" - "<\u7EBA<\u653E<\u83F2<\u975E<\u5561<\u98DE<\u80A5<\u532A<\u8BFD" - "<\u5420<\u80BA<\u5E9F<\u6CB8<\u8D39<\u82AC<\u915A<\u5429<\u6C1B" - "<\u5206<\u7EB7<\u575F<\u711A<\u6C7E<\u7C89<\u594B<\u4EFD<\u5FFF" - "<\u6124<\u7CAA<\u4E30<\u5C01<\u67AB<\u8702<\u5CF0<\u950B<\u98CE" - "<\u75AF<\u70FD<\u9022<\u51AF<\u7F1D<\u8BBD<\u5949<\u51E4<\u4F5B" - "<\u5426<\u592B<\u6577<\u80A4<\u5B75<\u6276<\u62C2<\u8F90<\u5E45" - "<\u6C1F<\u7B26<\u4F0F<\u4FD8<\u670D<\u6D6E<\u6DAA<\u798F<\u88B1" - "<\u5F17<\u752B<\u629A<\u8F85<\u4FEF<\u91DC<\u65A7<\u812F<\u8151" - "<\u5E9C<\u8150<\u8D74<\u526F<\u8986<\u8D4B<\u590D<\u5085<\u4ED8" - "<\u961C<\u7236<\u8179<\u8D1F<\u5BCC<\u8BA3<\u9644<\u5987<\u7F1A" - "<\u5490<\u5676<\u560E<\u8BE5<\u6539<\u6982<\u9499<\u76D6<\u6E89" - "<\u5E72<\u7518<\u6746<\u67D1<\u7AFF<\u809D<\u8D76<\u611F<\u79C6" - "<\u6562<\u8D63<\u5188<\u521A<\u94A2<\u7F38<\u809B<\u7EB2<\u5C97" - "<\u6E2F<\u6760<\u7BD9<\u768B<\u9AD8<\u818F<\u7F94<\u7CD5<\u641E" - "<\u9550<\u7A3F<\u544A<\u54E5<\u6B4C<\u6401<\u6208<\u9E3D<\u80F3" - "<\u7599<\u5272<\u9769<\u845B<\u683C<\u86E4<\u9601<\u9694<\u94EC" - "<\u4E2A<\u5404<\u7ED9<\u6839<\u8DDF<\u8015<\u66F4<\u5E9A<\u7FB9" - "<\u57C2<\u803F<\u6897<\u5DE5<\u653B<\u529F<\u606D<\u9F9A<\u4F9B" - "<\u8EAC<\u516C<\u5BAB<\u5F13<\u5DE9<\u6C5E<\u62F1<\u8D21<\u5171" - "<\u94A9<\u52FE<\u6C9F<\u82DF<\u72D7<\u57A2<\u6784<\u8D2D<\u591F" - "<\u8F9C<\u83C7<\u5495<\u7B8D<\u4F30<\u6CBD<\u5B64<\u59D1<\u9F13" - "<\u53E4<\u86CA<\u9AA8<\u8C37<\u80A1<\u6545<\u987E<\u56FA<\u96C7" - "<\u522E<\u74DC<\u5250<\u5BE1<\u6302<\u8902<\u4E56<\u62D0<\u602A" - "<\u68FA<\u5173<\u5B98<\u51A0<\u89C2<\u7BA1<\u9986<\u7F50<\u60EF" - "<\u704C<\u8D2F<\u5149<\u5E7F<\u901B<\u7470<\u89C4<\u572D<\u7845" - "<\u5F52<\u9F9F<\u95FA<\u8F68<\u9B3C<\u8BE1<\u7678<\u6842<\u67DC" - "<\u8DEA<\u8D35<\u523D<\u8F8A<\u6EDA<\u68CD<\u9505<\u90ED<\u56FD" - "<\u679C<\u88F9<\u8FC7<\u54C8<\u9AB8<\u5B69<\u6D77<\u6C26<\u4EA5" - "<\u5BB3<\u9A87<\u9163<\u61A8<\u90AF<\u97E9<\u542B<\u6DB5<\u5BD2" - "<\u51FD<\u558A<\u7F55<\u7FF0<\u64BC<\u634D<\u65F1<\u61BE<\u608D" - "<\u710A<\u6C57<\u6C49<\u592F<\u676D<\u822A<\u58D5<\u568E<\u8C6A" - "<\u6BEB<\u90DD<\u597D<\u8017<\u53F7<\u6D69<\u5475<\u559D<\u8377" - "<\u83CF<\u6838<\u79BE<\u548C<\u4F55<\u5408<\u76D2<\u8C89<\u9602" - "<\u6CB3<\u6DB8<\u8D6B<\u8910<\u9E64<\u8D3A<\u563F<\u9ED1<\u75D5" - "<\u5F88<\u72E0<\u6068<\u54FC<\u4EA8<\u6A2A<\u8861<\u6052<\u8F70" - "<\u54C4<\u70D8<\u8679<\u9E3F<\u6D2A<\u5B8F<\u5F18<\u7EA2<\u5589" - "<\u4FAF<\u7334<\u543C<\u539A<\u5019<\u540E<\u547C<\u4E4E<\u5FFD" - "<\u745A<\u58F6<\u846B<\u80E1<\u8774<\u72D0<\u7CCA<\u6E56<\u5F27" - "<\u864E<\u552C<\u62A4<\u4E92<\u6CAA<\u6237<\u82B1<\u54D7<\u534E" - "<\u733E<\u6ED1<\u753B<\u5212<\u5316<\u8BDD<\u69D0<\u5F8A<\u6000" - "<\u6DEE<\u574F<\u6B22<\u73AF<\u6853<\u8FD8<\u7F13<\u6362<\u60A3" - "<\u5524<\u75EA<\u8C62<\u7115<\u6DA3<\u5BA6<\u5E7B<\u8352<\u614C" - "<\u9EC4<\u78FA<\u8757<\u7C27<\u7687<\u51F0<\u60F6<\u714C<\u6643" - "<\u5E4C<\u604D<\u8C0E<\u7070<\u6325<\u8F89<\u5FBD<\u6062<\u86D4" - "<\u56DE<\u6BC1<\u6094<\u6167<\u5349<\u60E0<\u6666<\u8D3F<\u79FD" - "<\u4F1A<\u70E9<\u6C47<\u8BB3<\u8BF2<\u7ED8<\u8364<\u660F<\u5A5A" - "<\u9B42<\u6D51<\u6DF7<\u8C41<\u6D3B<\u4F19<\u706B<\u83B7<\u6216" - "<\u60D1<\u970D<\u8D27<\u7978<\u51FB<\u573E<\u57FA<\u673A<\u7578" - "<\u7A3D<\u79EF<\u7B95<\u808C<\u9965<\u8FF9<\u6FC0<\u8BA5<\u9E21" - "<\u59EC<\u7EE9<\u7F09<\u5409<\u6781<\u68D8<\u8F91<\u7C4D<\u96C6" - "<\u53CA<\u6025<\u75BE<\u6C72<\u5373<\u5AC9<\u7EA7<\u6324<\u51E0" - "<\u810A<\u5DF1<\u84DF<\u6280<\u5180<\u5B63<\u4F0E<\u796D<\u5242" - "<\u60B8<\u6D4E<\u5BC4<\u5BC2<\u8BA1<\u8BB0<\u65E2<\u5FCC<\u9645" - "<\u5993<\u7EE7<\u7EAA<\u5609<\u67B7<\u5939<\u4F73<\u5BB6<\u52A0" - "<\u835A<\u988A<\u8D3E<\u7532<\u94BE<\u5047<\u7A3C<\u4EF7<\u67B6" - "<\u9A7E<\u5AC1<\u6B7C<\u76D1<\u575A<\u5C16<\u7B3A<\u95F4<\u714E" - "<\u517C<\u80A9<\u8270<\u5978<\u7F04<\u8327<\u68C0<\u67EC<\u78B1" - "<\u7877<\u62E3<\u6361<\u7B80<\u4FED<\u526A<\u51CF<\u8350<\u69DB" - "<\u9274<\u8DF5<\u8D31<\u89C1<\u952E<\u7BAD<\u4EF6<\u5065<\u8230" - "<\u5251<\u996F<\u6E10<\u6E85<\u6DA7<\u5EFA<\u50F5<\u59DC<\u5C06" - "<\u6D46<\u6C5F<\u7586<\u848B<\u6868<\u5956<\u8BB2<\u5320<\u9171" - "<\u964D<\u8549<\u6912<\u7901<\u7126<\u80F6<\u4EA4<\u90CA<\u6D47" - "<\u9A84<\u5A07<\u56BC<\u6405<\u94F0<\u77EB<\u4FA5<\u811A<\u72E1" - "<\u89D2<\u997A<\u7F34<\u7EDE<\u527F<\u6559<\u9175<\u8F7F<\u8F83" - "<\u53EB<\u7A96<\u63ED<\u63A5<\u7686<\u79F8<\u8857<\u9636<\u622A" - "<\u52AB<\u8282<\u6854<\u6770<\u6377<\u776B<\u7AED<\u6D01<\u7ED3" - "<\u89E3<\u59D0<\u6212<\u85C9<\u82A5<\u754C<\u501F<\u4ECB<\u75A5" - "<\u8BEB<\u5C4A<\u5DFE<\u7B4B<\u65A4<\u91D1<\u4ECA<\u6D25<\u895F" - "<\u7D27<\u9526<\u4EC5<\u8C28<\u8FDB<\u9773<\u664B<\u7981<\u8FD1" - "<\u70EC<\u6D78<\u5C3D<\u52B2<\u8346<\u5162<\u830E<\u775B<\u6676" - "<\u9CB8<\u4EAC<\u60CA<\u7CBE<\u7CB3<\u7ECF<\u4E95<\u8B66<\u666F" - "<\u9888<\u9759<\u5883<\u656C<\u955C<\u5F84<\u75C9<\u9756<\u7ADF" - "<\u7ADE<\u51C0<\u70AF<\u7A98<\u63EA<\u7A76<\u7EA0<\u7396<\u97ED" - "<\u4E45<\u7078<\u4E5D<\u9152<\u53A9<\u6551<\u65E7<\u81FC<\u8205" - "<\u548E<\u5C31<\u759A<\u97A0<\u62D8<\u72D9<\u75BD<\u5C45<\u9A79" - "<\u83CA<\u5C40<\u5480<\u77E9<\u4E3E<\u6CAE<\u805A<\u62D2<\u636E" - "<\u5DE8<\u5177<\u8DDD<\u8E1E<\u952F<\u4FF1<\u53E5<\u60E7<\u70AC" - "<\u5267<\u6350<\u9E43<\u5A1F<\u5026<\u7737<\u5377<\u7EE2<\u6485" - "<\u652B<\u6289<\u6398<\u5014<\u7235<\u89C9<\u51B3<\u8BC0<\u7EDD" - "<\u5747<\u83CC<\u94A7<\u519B<\u541B<\u5CFB<\u4FCA<\u7AE3<\u6D5A" - "<\u90E1<\u9A8F<\u5580<\u5496<\u5361<\u54AF<\u5F00<\u63E9<\u6977" - "<\u51EF<\u6168<\u520A<\u582A<\u52D8<\u574E<\u780D<\u770B<\u5EB7" - "<\u6177<\u7CE0<\u625B<\u6297<\u4EA2<\u7095<\u8003<\u62F7<\u70E4" - "<\u9760<\u5777<\u82DB<\u67EF<\u68F5<\u78D5<\u9897<\u79D1<\u58F3" - "<\u54B3<\u53EF<\u6E34<\u514B<\u523B<\u5BA2<\u8BFE<\u80AF<\u5543" - "<\u57A6<\u6073<\u5751<\u542D<\u7A7A<\u6050<\u5B54<\u63A7<\u62A0" - "<\u53E3<\u6263<\u5BC7<\u67AF<\u54ED<\u7A9F<\u82E6<\u9177<\u5E93" - "<\u88E4<\u5938<\u57AE<\u630E<\u8DE8<\u80EF<\u5757<\u7B77<\u4FA9" - "<\u5FEB<\u5BBD<\u6B3E<\u5321<\u7B50<\u72C2<\u6846<\u77FF<\u7736" - "<\u65F7<\u51B5<\u4E8F<\u76D4<\u5CBF<\u7AA5<\u8475<\u594E<\u9B41" - "<\u5080<\u9988<\u6127<\u6E83<\u5764<\u6606<\u6346<\u56F0<\u62EC" - "<\u6269<\u5ED3<\u9614<\u5783<\u62C9<\u5587<\u8721<\u814A<\u8FA3" - "<\u5566<\u83B1<\u6765<\u8D56<\u84DD<\u5A6A<\u680F<\u62E6<\u7BEE" - "<\u9611<\u5170<\u6F9C<\u8C30<\u63FD<\u89C8<\u61D2<\u7F06<\u70C2" - "<\u6EE5<\u7405<\u6994<\u72FC<\u5ECA<\u90CE<\u6717<\u6D6A<\u635E" - "<\u52B3<\u7262<\u8001<\u4F6C<\u59E5<\u916A<\u70D9<\u6D9D<\u52D2" - "<\u4E50<\u96F7<\u956D<\u857E<\u78CA<\u7D2F<\u5121<\u5792<\u64C2" - "<\u808B<\u7C7B<\u6CEA<\u68F1<\u695E<\u51B7<\u5398<\u68A8<\u7281" - "<\u9ECE<\u7BF1<\u72F8<\u79BB<\u6F13<\u7406<\u674E<\u91CC<\u9CA4" - "<\u793C<\u8389<\u8354<\u540F<\u6817<\u4E3D<\u5389<\u52B1<\u783E" - "<\u5386<\u5229<\u5088<\u4F8B<\u4FD0<\u75E2<\u7ACB<\u7C92<\u6CA5" - "<\u96B6<\u529B<\u7483<\u54E9<\u4FE9<\u8054<\u83B2<\u8FDE<\u9570" - "<\u5EC9<\u601C<\u6D9F<\u5E18<\u655B<\u8138<\u94FE<\u604B<\u70BC" - "<\u7EC3<\u7CAE<\u51C9<\u6881<\u7CB1<\u826F<\u4E24<\u8F86<\u91CF" - "<\u667E<\u4EAE<\u8C05<\u64A9<\u804A<\u50DA<\u7597<\u71CE<\u5BE5" - "<\u8FBD<\u6F66<\u4E86<\u6482<\u9563<\u5ED6<\u6599<\u5217<\u88C2" - "<\u70C8<\u52A3<\u730E<\u7433<\u6797<\u78F7<\u9716<\u4E34<\u90BB" - "<\u9CDE<\u6DCB<\u51DB<\u8D41<\u541D<\u62CE<\u73B2<\u83F1<\u96F6" - "<\u9F84<\u94C3<\u4F36<\u7F9A<\u51CC<\u7075<\u9675<\u5CAD<\u9886" - "<\u53E6<\u4EE4<\u6E9C<\u7409<\u69B4<\u786B<\u998F<\u7559<\u5218" - "<\u7624<\u6D41<\u67F3<\u516D<\u9F99<\u804B<\u5499<\u7B3C<\u7ABF" - "<\u9686<\u5784<\u62E2<\u9647<\u697C<\u5A04<\u6402<\u7BD3<\u6F0F" - "<\u964B<\u82A6<\u5362<\u9885<\u5E90<\u7089<\u63B3<\u5364<\u864F" - "<\u9C81<\u9E93<\u788C<\u9732<\u8DEF<\u8D42<\u9E7F<\u6F5E<\u7984" - "<\u5F55<\u9646<\u622E<\u9A74<\u5415<\u94DD<\u4FA3<\u65C5<\u5C65" - "<\u5C61<\u7F15<\u8651<\u6C2F<\u5F8B<\u7387<\u6EE4<\u7EFF<\u5CE6" - "<\u631B<\u5B6A<\u6EE6<\u5375<\u4E71<\u63A0<\u7565<\u62A1<\u8F6E" - "<\u4F26<\u4ED1<\u6CA6<\u7EB6<\u8BBA<\u841D<\u87BA<\u7F57<\u903B" - "<\u9523<\u7BA9<\u9AA1<\u88F8<\u843D<\u6D1B<\u9A86<\u7EDC<\u5988" - "<\u9EBB<\u739B<\u7801<\u8682<\u9A6C<\u9A82<\u561B<\u5417<\u57CB" - "<\u4E70<\u9EA6<\u5356<\u8FC8<\u8109<\u7792<\u9992<\u86EE<\u6EE1" - "<\u8513<\u66FC<\u6162<\u6F2B<\u8C29<\u8292<\u832B<\u76F2<\u6C13" - "<\u5FD9<\u83BD<\u732B<\u8305<\u951A<\u6BDB<\u77DB<\u94C6<\u536F" - "<\u8302<\u5192<\u5E3D<\u8C8C<\u8D38<\u4E48<\u73AB<\u679A<\u6885" - "<\u9176<\u9709<\u7164<\u6CA1<\u7709<\u5A92<\u9541<\u6BCF<\u7F8E" - "<\u6627<\u5BD0<\u59B9<\u5A9A<\u95E8<\u95F7<\u4EEC<\u840C<\u8499" - "<\u6AAC<\u76DF<\u9530<\u731B<\u68A6<\u5B5F<\u772F<\u919A<\u9761" - "<\u7CDC<\u8FF7<\u8C1C<\u5F25<\u7C73<\u79D8<\u89C5<\u6CCC<\u871C" - "<\u5BC6<\u5E42<\u68C9<\u7720<\u7EF5<\u5195<\u514D<\u52C9<\u5A29" - "<\u7F05<\u9762<\u82D7<\u63CF<\u7784<\u85D0<\u79D2<\u6E3A<\u5E99" - "<\u5999<\u8511<\u706D<\u6C11<\u62BF<\u76BF<\u654F<\u60AF<\u95FD" - "<\u660E<\u879F<\u9E23<\u94ED<\u540D<\u547D<\u8C2C<\u6478<\u6479" - "<\u8611<\u6A21<\u819C<\u78E8<\u6469<\u9B54<\u62B9<\u672B<\u83AB" - "<\u58A8<\u9ED8<\u6CAB<\u6F20<\u5BDE<\u964C<\u8C0B<\u725F<\u67D0" - "<\u62C7<\u7261<\u4EA9<\u59C6<\u6BCD<\u5893<\u66AE<\u5E55<\u52DF" - "<\u6155<\u6728<\u76EE<\u7766<\u7267<\u7A46<\u62FF<\u54EA<\u5450" - "<\u94A0<\u90A3<\u5A1C<\u7EB3<\u6C16<\u4E43<\u5976<\u8010<\u5948" - "<\u5357<\u7537<\u96BE<\u56CA<\u6320<\u8111<\u607C<\u95F9<\u6DD6" - "<\u5462<\u9981<\u5185<\u5AE9<\u80FD<\u59AE<\u9713<\u502A<\u6CE5" - "<\u5C3C<\u62DF<\u4F60<\u533F<\u817B<\u9006<\u6EBA<\u852B<\u62C8" - "<\u5E74<\u78BE<\u64B5<\u637B<\u5FF5<\u5A18<\u917F<\u9E1F<\u5C3F" - "<\u634F<\u8042<\u5B7D<\u556E<\u954A<\u954D<\u6D85<\u60A8<\u67E0" - "<\u72DE<\u51DD<\u5B81<\u62E7<\u6CDE<\u725B<\u626D<\u94AE<\u7EBD" - "<\u8113<\u6D53<\u519C<\u5F04<\u5974<\u52AA<\u6012<\u5973<\u6696" - "<\u8650<\u759F<\u632A<\u61E6<\u7CEF<\u8BFA<\u54E6<\u6B27<\u9E25" - "<\u6BB4<\u85D5<\u5455<\u5076<\u6CA4<\u556A<\u8DB4<\u722C<\u5E15" - "<\u6015<\u7436<\u62CD<\u6392<\u724C<\u5F98<\u6E43<\u6D3E<\u6500" - "<\u6F58<\u76D8<\u78D0<\u76FC<\u7554<\u5224<\u53DB<\u4E53<\u5E9E" - "<\u65C1<\u802A<\u80D6<\u629B<\u5486<\u5228<\u70AE<\u888D<\u8DD1" - "<\u6CE1<\u5478<\u80DA<\u57F9<\u88F4<\u8D54<\u966A<\u914D<\u4F69" - "<\u6C9B<\u55B7<\u76C6<\u7830<\u62A8<\u70F9<\u6F8E<\u5F6D<\u84EC" - "<\u68DA<\u787C<\u7BF7<\u81A8<\u670B<\u9E4F<\u6367<\u78B0<\u576F" - "<\u7812<\u9739<\u6279<\u62AB<\u5288<\u7435<\u6BD7<\u5564<\u813E" - "<\u75B2<\u76AE<\u5339<\u75DE<\u50FB<\u5C41<\u8B6C<\u7BC7<\u504F" - "<\u7247<\u9A97<\u98D8<\u6F02<\u74E2<\u7968<\u6487<\u77A5<\u62FC" - "<\u9891<\u8D2B<\u54C1<\u8058<\u4E52<\u576A<\u82F9<\u840D<\u5E73" - "<\u51ED<\u74F6<\u8BC4<\u5C4F<\u5761<\u6CFC<\u9887<\u5A46<\u7834" - "<\u9B44<\u8FEB<\u7C95<\u5256<\u6251<\u94FA<\u4EC6<\u8386<\u8461" - "<\u83E9<\u84B2<\u57D4<\u6734<\u5703<\u666E<\u6D66<\u8C31<\u66DD" - "<\u7011<\u671F<\u6B3A<\u6816<\u621A<\u59BB<\u4E03<\u51C4<\u6F06" - "<\u67D2<\u6C8F<\u5176<\u68CB<\u5947<\u6B67<\u7566<\u5D0E<\u8110" - "<\u9F50<\u65D7<\u7948<\u7941<\u9A91<\u8D77<\u5C82<\u4E5E<\u4F01" - "<\u542F<\u5951<\u780C<\u5668<\u6C14<\u8FC4<\u5F03<\u6C7D<\u6CE3" - "<\u8BAB<\u6390<\u6070<\u6D3D<\u7275<\u6266<\u948E<\u94C5<\u5343" - "<\u8FC1<\u7B7E<\u4EDF<\u8C26<\u4E7E<\u9ED4<\u94B1<\u94B3<\u524D" - "<\u6F5C<\u9063<\u6D45<\u8C34<\u5811<\u5D4C<\u6B20<\u6B49<\u67AA" - "<\u545B<\u8154<\u7F8C<\u5899<\u8537<\u5F3A<\u62A2<\u6A47<\u9539" - "<\u6572<\u6084<\u6865<\u77A7<\u4E54<\u4FA8<\u5DE7<\u9798<\u64AC" - "<\u7FD8<\u5CED<\u4FCF<\u7A8D<\u5207<\u8304<\u4E14<\u602F<\u7A83" - "<\u94A6<\u4FB5<\u4EB2<\u79E6<\u7434<\u52E4<\u82B9<\u64D2<\u79BD" - "<\u5BDD<\u6C81<\u9752<\u8F7B<\u6C22<\u503E<\u537F<\u6E05<\u64CE" - "<\u6674<\u6C30<\u60C5<\u9877<\u8BF7<\u5E86<\u743C<\u7A77<\u79CB" - "<\u4E18<\u90B1<\u7403<\u6C42<\u56DA<\u914B<\u6CC5<\u8D8B<\u533A" - "<\u86C6<\u66F2<\u8EAF<\u5C48<\u9A71<\u6E20<\u53D6<\u5A36<\u9F8B" - "<\u8DA3<\u53BB<\u5708<\u98A7<\u6743<\u919B<\u6CC9<\u5168<\u75CA" - "<\u62F3<\u72AC<\u5238<\u529D<\u7F3A<\u7094<\u7638<\u5374<\u9E4A" - "<\u69B7<\u786E<\u96C0<\u88D9<\u7FA4<\u7136<\u71C3<\u5189<\u67D3" - "<\u74E4<\u58E4<\u6518<\u56B7<\u8BA9<\u9976<\u6270<\u7ED5<\u60F9" - "<\u70ED<\u58EC<\u4EC1<\u4EBA<\u5FCD<\u97E7<\u4EFB<\u8BA4<\u5203" - "<\u598A<\u7EAB<\u6254<\u4ECD<\u65E5<\u620E<\u8338<\u84C9<\u8363" - "<\u878D<\u7194<\u6EB6<\u5BB9<\u7ED2<\u5197<\u63C9<\u67D4<\u8089" - "<\u8339<\u8815<\u5112<\u5B7A<\u5982<\u8FB1<\u4E73<\u6C5D<\u5165" - "<\u8925<\u8F6F<\u962E<\u854A<\u745E<\u9510<\u95F0<\u6DA6<\u82E5" - "<\u5F31<\u6492<\u6D12<\u8428<\u816E<\u9CC3<\u585E<\u8D5B<\u4E09" - "<\u53C1<\u4F1E<\u6563<\u6851<\u55D3<\u4E27<\u6414<\u9A9A<\u626B" - "<\u5AC2<\u745F<\u8272<\u6DA9<\u68EE<\u50E7<\u838E<\u7802<\u6740" - "<\u5239<\u6C99<\u7EB1<\u50BB<\u5565<\u715E<\u7B5B<\u6652<\u73CA" - "<\u82EB<\u6749<\u5C71<\u5220<\u717D<\u886B<\u95EA<\u9655<\u64C5" - "<\u8D61<\u81B3<\u5584<\u6C55<\u6247<\u7F2E<\u5892<\u4F24<\u5546" - "<\u8D4F<\u664C<\u4E0A<\u5C1A<\u88F3<\u68A2<\u634E<\u7A0D<\u70E7" - "<\u828D<\u52FA<\u97F6<\u5C11<\u54E8<\u90B5<\u7ECD<\u5962<\u8D4A" - "<\u86C7<\u820C<\u820D<\u8D66<\u6444<\u5C04<\u6151<\u6D89<\u793E" - "<\u8BBE<\u7837<\u7533<\u547B<\u4F38<\u8EAB<\u6DF1<\u5A20<\u7EC5" - "<\u795E<\u6C88<\u5BA1<\u5A76<\u751A<\u80BE<\u614E<\u6E17<\u58F0" - "<\u751F<\u7525<\u7272<\u5347<\u7EF3<\u7701<\u76DB<\u5269<\u80DC" - "<\u5723<\u5E08<\u5931<\u72EE<\u65BD<\u6E7F<\u8BD7<\u5C38<\u8671" - "<\u5341<\u77F3<\u62FE<\u65F6<\u4EC0<\u98DF<\u8680<\u5B9E<\u8BC6" - "<\u53F2<\u77E2<\u4F7F<\u5C4E<\u9A76<\u59CB<\u5F0F<\u793A<\u58EB" - "<\u4E16<\u67FF<\u4E8B<\u62ED<\u8A93<\u901D<\u52BF<\u662F<\u55DC" - "<\u566C<\u9002<\u4ED5<\u4F8D<\u91CA<\u9970<\u6C0F<\u5E02<\u6043" - "<\u5BA4<\u89C6<\u8BD5<\u6536<\u624B<\u9996<\u5B88<\u5BFF<\u6388" - "<\u552E<\u53D7<\u7626<\u517D<\u852C<\u67A2<\u68B3<\u6B8A<\u6292" - "<\u8F93<\u53D4<\u8212<\u6DD1<\u758F<\u4E66<\u8D4E<\u5B70<\u719F" - "<\u85AF<\u6691<\u66D9<\u7F72<\u8700<\u9ECD<\u9F20<\u5C5E<\u672F" - "<\u8FF0<\u6811<\u675F<\u620D<\u7AD6<\u5885<\u5EB6<\u6570<\u6F31" - "<\u6055<\u5237<\u800D<\u6454<\u8870<\u7529<\u5E05<\u6813<\u62F4" - "<\u971C<\u53CC<\u723D<\u8C01<\u6C34<\u7761<\u7A0E<\u542E<\u77AC" - "<\u987A<\u821C<\u8BF4<\u7855<\u6714<\u70C1<\u65AF<\u6495<\u5636" - "<\u601D<\u79C1<\u53F8<\u4E1D<\u6B7B<\u8086<\u5BFA<\u55E3<\u56DB" - "<\u4F3A<\u4F3C<\u9972<\u5DF3<\u677E<\u8038<\u6002<\u9882<\u9001" - "<\u5B8B<\u8BBC<\u8BF5<\u641C<\u8258<\u64DE<\u55FD<\u82CF<\u9165" - "<\u4FD7<\u7D20<\u901F<\u7C9F<\u50F3<\u5851<\u6EAF<\u5BBF<\u8BC9" - "<\u8083<\u9178<\u849C<\u7B97<\u867D<\u968B<\u968F<\u7EE5<\u9AD3" - "<\u788E<\u5C81<\u7A57<\u9042<\u96A7<\u795F<\u5B59<\u635F<\u7B0B" - "<\u84D1<\u68AD<\u5506<\u7F29<\u7410<\u7D22<\u9501<\u6240<\u584C" - "<\u4ED6<\u5B83<\u5979<\u5854<\u736D<\u631E<\u8E4B<\u8E0F<\u80CE" - "<\u82D4<\u62AC<\u53F0<\u6CF0<\u915E<\u592A<\u6001<\u6C70<\u574D" - "<\u644A<\u8D2A<\u762B<\u6EE9<\u575B<\u6A80<\u75F0<\u6F6D<\u8C2D" - "<\u8C08<\u5766<\u6BEF<\u8892<\u78B3<\u63A2<\u53F9<\u70AD<\u6C64" - "<\u5858<\u642A<\u5802<\u68E0<\u819B<\u5510<\u7CD6<\u5018<\u8EBA" - "<\u6DCC<\u8D9F<\u70EB<\u638F<\u6D9B<\u6ED4<\u7EE6<\u8404<\u6843" - "<\u9003<\u6DD8<\u9676<\u8BA8<\u5957<\u7279<\u85E4<\u817E<\u75BC" - "<\u8A8A<\u68AF<\u5254<\u8E22<\u9511<\u63D0<\u9898<\u8E44<\u557C" - "<\u4F53<\u66FF<\u568F<\u60D5<\u6D95<\u5243<\u5C49<\u5929<\u6DFB" - "<\u586B<\u7530<\u751C<\u606C<\u8214<\u8146<\u6311<\u6761<\u8FE2" - "<\u773A<\u8DF3<\u8D34<\u94C1<\u5E16<\u5385<\u542C<\u70C3<\u6C40" - "<\u5EF7<\u505C<\u4EAD<\u5EAD<\u633A<\u8247<\u901A<\u6850<\u916E" - "<\u77B3<\u540C<\u94DC<\u5F64<\u7AE5<\u6876<\u6345<\u7B52<\u7EDF" - "<\u75DB<\u5077<\u6295<\u5934<\u900F<\u51F8<\u79C3<\u7A81<\u56FE" - "<\u5F92<\u9014<\u6D82<\u5C60<\u571F<\u5410<\u5154<\u6E4D<\u56E2" - "<\u63A8<\u9893<\u817F<\u8715<\u892A<\u9000<\u541E<\u5C6F<\u81C0" - "<\u62D6<\u6258<\u8131<\u9E35<\u9640<\u9A6E<\u9A7C<\u692D<\u59A5" - "<\u62D3<\u553E<\u6316<\u54C7<\u86D9<\u6D3C<\u5A03<\u74E6<\u889C" - "<\u6B6A<\u5916<\u8C4C<\u5F2F<\u6E7E<\u73A9<\u987D<\u4E38<\u70F7" - "<\u5B8C<\u7897<\u633D<\u665A<\u7696<\u60CB<\u5B9B<\u5A49<\u4E07" - "<\u8155<\u6C6A<\u738B<\u4EA1<\u6789<\u7F51<\u5F80<\u65FA<\u671B" - "<\u5FD8<\u5984<\u5A01<\u5DCD<\u5FAE<\u5371<\u97E6<\u8FDD<\u6845" - "<\u56F4<\u552F<\u60DF<\u4E3A<\u6F4D<\u7EF4<\u82C7<\u840E<\u59D4" - "<\u4F1F<\u4F2A<\u5C3E<\u7EAC<\u672A<\u851A<\u5473<\u754F<\u80C3" - "<\u5582<\u9B4F<\u4F4D<\u6E2D<\u8C13<\u5C09<\u6170<\u536B<\u761F" - "<\u6E29<\u868A<\u6587<\u95FB<\u7EB9<\u543B<\u7A33<\u7D0A<\u95EE" - "<\u55E1<\u7FC1<\u74EE<\u631D<\u8717<\u6DA1<\u7A9D<\u6211<\u65A1" - "<\u5367<\u63E1<\u6C83<\u5DEB<\u545C<\u94A8<\u4E4C<\u6C61<\u8BEC" - "<\u5C4B<\u65E0<\u829C<\u68A7<\u543E<\u5434<\u6BCB<\u6B66<\u4E94" - "<\u6342<\u5348<\u821E<\u4F0D<\u4FAE<\u575E<\u620A<\u96FE<\u6664" - "<\u7269<\u52FF<\u52A1<\u609F<\u8BEF<\u6614<\u7199<\u6790<\u897F" - "<\u7852<\u77FD<\u6670<\u563B<\u5438<\u9521<\u727A<\u7A00<\u606F" - "<\u5E0C<\u6089<\u819D<\u5915<\u60DC<\u7184<\u70EF<\u6EAA<\u6C50" - "<\u7280<\u6A84<\u88AD<\u5E2D<\u4E60<\u5AB3<\u559C<\u94E3<\u6D17" - "<\u7CFB<\u9699<\u620F<\u7EC6<\u778E<\u867E<\u5323<\u971E<\u8F96" - "<\u6687<\u5CE1<\u4FA0<\u72ED<\u4E0B<\u53A6<\u590F<\u5413<\u6380" - "<\u9528<\u5148<\u4ED9<\u9C9C<\u7EA4<\u54B8<\u8D24<\u8854<\u8237" - "<\u95F2<\u6D8E<\u5F26<\u5ACC<\u663E<\u9669<\u73B0<\u732E<\u53BF" - "<\u817A<\u9985<\u7FA1<\u5BAA<\u9677<\u9650<\u7EBF<\u76F8<\u53A2" - "<\u9576<\u9999<\u7BB1<\u8944<\u6E58<\u4E61<\u7FD4<\u7965<\u8BE6" - "<\u60F3<\u54CD<\u4EAB<\u9879<\u5DF7<\u6A61<\u50CF<\u5411<\u8C61" - "<\u8427<\u785D<\u9704<\u524A<\u54EE<\u56A3<\u9500<\u6D88<\u5BB5" - "<\u6DC6<\u6653<\u5C0F<\u5B5D<\u6821<\u8096<\u5578<\u7B11<\u6548" - "<\u6954<\u4E9B<\u6B47<\u874E<\u978B<\u534F<\u631F<\u643A<\u90AA" - "<\u659C<\u80C1<\u8C10<\u5199<\u68B0<\u5378<\u87F9<\u61C8<\u6CC4" - "<\u6CFB<\u8C22<\u5C51<\u85AA<\u82AF<\u950C<\u6B23<\u8F9B<\u65B0" - "<\u5FFB<\u5FC3<\u4FE1<\u8845<\u661F<\u8165<\u7329<\u60FA<\u5174" - "<\u5211<\u578B<\u5F62<\u90A2<\u884C<\u9192<\u5E78<\u674F<\u6027" - "<\u59D3<\u5144<\u51F6<\u80F8<\u5308<\u6C79<\u96C4<\u718A<\u4F11" - "<\u4FEE<\u7F9E<\u673D<\u55C5<\u9508<\u79C0<\u8896<\u7EE3<\u589F" - "<\u620C<\u9700<\u865A<\u5618<\u987B<\u5F90<\u8BB8<\u84C4<\u9157" - "<\u53D9<\u65ED<\u5E8F<\u755C<\u6064<\u7D6E<\u5A7F<\u7EEA<\u7EED" - "<\u8F69<\u55A7<\u5BA3<\u60AC<\u65CB<\u7384<\u9009<\u7663<\u7729" - "<\u7EDA<\u9774<\u859B<\u5B66<\u7A74<\u96EA<\u8840<\u52CB<\u718F" - "<\u5FAA<\u65EC<\u8BE2<\u5BFB<\u9A6F<\u5DE1<\u6B89<\u6C5B<\u8BAD" - "<\u8BAF<\u900A<\u8FC5<\u538B<\u62BC<\u9E26<\u9E2D<\u5440<\u4E2B" - "<\u82BD<\u7259<\u869C<\u5D16<\u8859<\u6DAF<\u96C5<\u54D1<\u4E9A" - "<\u8BB6<\u7109<\u54BD<\u9609<\u70DF<\u6DF9<\u76D0<\u4E25<\u7814" - "<\u8712<\u5CA9<\u5EF6<\u8A00<\u989C<\u960E<\u708E<\u6CBF<\u5944" - "<\u63A9<\u773C<\u884D<\u6F14<\u8273<\u5830<\u71D5<\u538C<\u781A" - "<\u96C1<\u5501<\u5F66<\u7130<\u5BB4<\u8C1A<\u9A8C<\u6B83<\u592E" - "<\u9E2F<\u79E7<\u6768<\u626C<\u4F6F<\u75A1<\u7F8A<\u6D0B<\u9633" - "<\u6C27<\u4EF0<\u75D2<\u517B<\u6837<\u6F3E<\u9080<\u8170<\u5996" - "<\u7476<\u6447<\u5C27<\u9065<\u7A91<\u8C23<\u59DA<\u54AC<\u8200" - "<\u836F<\u8981<\u8000<\u6930<\u564E<\u8036<\u7237<\u91CE<\u51B6" - "<\u4E5F<\u9875<\u6396<\u4E1A<\u53F6<\u66F3<\u814B<\u591C<\u6DB2" - "<\u4E00<\u58F9<\u533B<\u63D6<\u94F1<\u4F9D<\u4F0A<\u8863<\u9890" - "<\u5937<\u9057<\u79FB<\u4EEA<\u80F0<\u7591<\u6C82<\u5B9C<\u59E8" - "<\u5F5D<\u6905<\u8681<\u501A<\u5DF2<\u4E59<\u77E3<\u4EE5<\u827A" - "<\u6291<\u6613<\u9091<\u5C79<\u4EBF<\u5F79<\u81C6<\u9038<\u8084" - "<\u75AB<\u4EA6<\u88D4<\u610F<\u6BC5<\u5FC6<\u4E49<\u76CA<\u6EA2" - "<\u8BE3<\u8BAE<\u8C0A<\u8BD1<\u5F02<\u7FFC<\u7FCC<\u7ECE<\u8335" - "<\u836B<\u56E0<\u6BB7<\u97F3<\u9634<\u59FB<\u541F<\u94F6<\u6DEB" - "<\u5BC5<\u996E<\u5C39<\u5F15<\u9690<\u5370<\u82F1<\u6A31<\u5A74" - "<\u9E70<\u5E94<\u7F28<\u83B9<\u8424<\u8425<\u8367<\u8747<\u8FCE" - "<\u8D62<\u76C8<\u5F71<\u9896<\u786C<\u6620<\u54DF<\u62E5<\u4F63" - "<\u81C3<\u75C8<\u5EB8<\u96CD<\u8E0A<\u86F9<\u548F<\u6CF3<\u6D8C" - "<\u6C38<\u607F<\u52C7<\u7528<\u5E7D<\u4F18<\u60A0<\u5FE7<\u5C24" - "<\u7531<\u90AE<\u94C0<\u72B9<\u6CB9<\u6E38<\u9149<\u6709<\u53CB" - "<\u53F3<\u4F51<\u91C9<\u8BF1<\u53C8<\u5E7C<\u8FC2<\u6DE4<\u4E8E" - "<\u76C2<\u6986<\u865E<\u611A<\u8206<\u4F59<\u4FDE<\u903E<\u9C7C" - "<\u6109<\u6E1D<\u6E14<\u9685<\u4E88<\u5A31<\u96E8<\u4E0E<\u5C7F" - "<\u79B9<\u5B87<\u8BED<\u7FBD<\u7389<\u57DF<\u828B<\u90C1<\u5401" - "<\u9047<\u55BB<\u5CEA<\u5FA1<\u6108<\u6B32<\u72F1<\u80B2<\u8A89" - "<\u6D74<\u5BD3<\u88D5<\u9884<\u8C6B<\u9A6D<\u9E33<\u6E0A<\u51A4" - "<\u5143<\u57A3<\u8881<\u539F<\u63F4<\u8F95<\u56ED<\u5458<\u5706" - "<\u733F<\u6E90<\u7F18<\u8FDC<\u82D1<\u613F<\u6028<\u9662<\u66F0" - "<\u7EA6<\u8D8A<\u8DC3<\u94A5<\u5CB3<\u7CA4<\u6708<\u60A6<\u9605" - "<\u8018<\u4E91<\u90E7<\u5300<\u9668<\u5141<\u8FD0<\u8574<\u915D" - "<\u6655<\u97F5<\u5B55<\u531D<\u7838<\u6742<\u683D<\u54C9<\u707E" - "<\u5BB0<\u8F7D<\u518D<\u5728<\u54B1<\u6512<\u6682<\u8D5E<\u8D43" - "<\u810F<\u846C<\u906D<\u7CDF<\u51FF<\u85FB<\u67A3<\u65E9<\u6FA1" - "<\u86A4<\u8E81<\u566A<\u9020<\u7682<\u7076<\u71E5<\u8D23<\u62E9" - "<\u5219<\u6CFD<\u8D3C<\u600E<\u589E<\u618E<\u66FE<\u8D60<\u624E" - "<\u55B3<\u6E23<\u672D<\u8F67<\u94E1<\u95F8<\u7728<\u6805<\u69A8" - "<\u548B<\u4E4D<\u70B8<\u8BC8<\u6458<\u658B<\u5B85<\u7A84<\u503A" - "<\u5BE8<\u77BB<\u6BE1<\u8A79<\u7C98<\u6CBE<\u76CF<\u65A9<\u8F97" - "<\u5D2D<\u5C55<\u8638<\u6808<\u5360<\u6218<\u7AD9<\u6E5B<\u7EFD" - "<\u6A1F<\u7AE0<\u5F70<\u6F33<\u5F20<\u638C<\u6DA8<\u6756<\u4E08" - "<\u5E10<\u8D26<\u4ED7<\u80C0<\u7634<\u969C<\u62DB<\u662D<\u627E" - "<\u6CBC<\u8D75<\u7167<\u7F69<\u5146<\u8087<\u53EC<\u906E<\u6298" - "<\u54F2<\u86F0<\u8F99<\u8005<\u9517<\u8517<\u8FD9<\u6D59<\u73CD" - "<\u659F<\u771F<\u7504<\u7827<\u81FB<\u8D1E<\u9488<\u4FA6<\u6795" - "<\u75B9<\u8BCA<\u9707<\u632F<\u9547<\u9635<\u84B8<\u6323<\u7741" - "<\u5F81<\u72F0<\u4E89<\u6014<\u6574<\u62EF<\u6B63<\u653F<\u5E27" - "<\u75C7<\u90D1<\u8BC1<\u829D<\u679D<\u652F<\u5431<\u8718<\u77E5" - "<\u80A2<\u8102<\u6C41<\u4E4B<\u7EC7<\u804C<\u76F4<\u690D<\u6B96" - "<\u6267<\u503C<\u4F84<\u5740<\u6307<\u6B62<\u8DBE<\u53EA<\u65E8" - "<\u7EB8<\u5FD7<\u631A<\u63B7<\u81F3<\u81F4<\u7F6E<\u5E1C<\u5CD9" - "<\u5236<\u667A<\u79E9<\u7A1A<\u8D28<\u7099<\u75D4<\u6EDE<\u6CBB" - "<\u7A92<\u4E2D<\u76C5<\u5FE0<\u949F<\u8877<\u7EC8<\u79CD<\u80BF" - "<\u91CD<\u4EF2<\u4F17<\u821F<\u5468<\u5DDE<\u6D32<\u8BCC<\u7CA5" - "<\u8F74<\u8098<\u5E1A<\u5492<\u76B1<\u5B99<\u663C<\u9AA4<\u73E0" - "<\u682A<\u86DB<\u6731<\u732A<\u8BF8<\u8BDB<\u9010<\u7AF9<\u70DB" - "<\u716E<\u62C4<\u77A9<\u5631<\u4E3B<\u8457<\u67F1<\u52A9<\u86C0" - "<\u8D2E<\u94F8<\u7B51<\u4F4F<\u6CE8<\u795D<\u9A7B<\u6293<\u722A" - "<\u62FD<\u4E13<\u7816<\u8F6C<\u64B0<\u8D5A<\u7BC6<\u6869<\u5E84" - "<\u88C5<\u5986<\u649E<\u58EE<\u72B6<\u690E<\u9525<\u8FFD<\u8D58" - "<\u5760<\u7F00<\u8C06<\u51C6<\u6349<\u62D9<\u5353<\u684C<\u7422" - "<\u8301<\u914C<\u5544<\u7740<\u707C<\u6D4A<\u5179<\u54A8<\u8D44" - "<\u59FF<\u6ECB<\u6DC4<\u5B5C<\u7D2B<\u4ED4<\u7C7D<\u6ED3<\u5B50" - "<\u81EA<\u6E0D<\u5B57<\u9B03<\u68D5<\u8E2A<\u5B97<\u7EFC<\u603B" - "<\u7EB5<\u90B9<\u8D70<\u594F<\u63CD<\u79DF<\u8DB3<\u5352<\u65CF" - "<\u7956<\u8BC5<\u963B<\u7EC4<\u94BB<\u7E82<\u5634<\u9189<\u6700" - "<\u7F6A<\u5C0A<\u9075<\u6628<\u5DE6<\u4F50<\u67DE<\u505A<\u4F5C" - "<\u5750<\u5EA7<\uE2D8<\uE2D9<\uE2DA<\uE2DB<\uE2DC<\u4E8D<\u4E0C" - "<\u5140<\u4E10<\u5EFF<\u5345<\u4E15<\u4E98<\u4E1E<\u9B32<\u5B6C" - "<\u5669<\u4E28<\u79BA<\u4E3F<\u5315<\u4E47<\u592D<\u723B<\u536E" - "<\u6C10<\u56DF<\u80E4<\u9997<\u6BD3<\u777E<\u9F17<\u4E36<\u4E9F" - "<\u9F10<\u4E5C<\u4E69<\u4E93<\u8288<\u5B5B<\u556C<\u560F<\u4EC4" - "<\u538D<\u539D<\u53A3<\u53A5<\u53AE<\u9765<\u8D5D<\u531A<\u53F5" - "<\u5326<\u532E<\u533E<\u8D5C<\u5366<\u5363<\u5202<\u5208<\u520E" - "<\u522D<\u5233<\u523F<\u5240<\u524C<\u525E<\u5261<\u525C<\u84AF" - "<\u527D<\u5282<\u5281<\u5290<\u5293<\u5182<\u7F54<\u4EBB<\u4EC3" - "<\u4EC9<\u4EC2<\u4EE8<\u4EE1<\u4EEB<\u4EDE<\u4F1B<\u4EF3<\u4F22" - "<\u4F64<\u4EF5<\u4F25<\u4F27<\u4F09<\u4F2B<\u4F5E<\u4F67<\u6538" - "<\u4F5A<\u4F5D<\u4F5F<\u4F57<\u4F32<\u4F3D<\u4F76<\u4F74<\u4F91" - "<\u4F89<\u4F83<\u4F8F<\u4F7E<\u4F7B<\u4FAA<\u4F7C<\u4FAC<\u4F94" - "<\u4FE6<\u4FE8<\u4FEA<\u4FC5<\u4FDA<\u4FE3<\u4FDC<\u4FD1<\u4FDF" - "<\u4FF8<\u5029<\u504C<\u4FF3<\u502C<\u500F<\u502E<\u502D<\u4FFE" - "<\u501C<\u500C<\u5025<\u5028<\u507E<\u5043<\u5055<\u5048<\u504E" - "<\u506C<\u507B<\u50A5<\u50A7<\u50A9<\u50BA<\u50D6<\u5106<\u50ED" - "<\u50EC<\u50E6<\u50EE<\u5107<\u510B<\u4EDD<\u6C3D<\u4F58<\u4F65" - "<\u4FCE<\u9FA0<\u6C46<\u7C74<\u516E<\u5DFD<\u9EC9<\u9998<\u5181" - "<\u5914<\u52F9<\u530D<\u8A07<\u5310<\u51EB<\u5919<\u5155<\u4EA0" - "<\u5156<\u4EB3<\u886E<\u88A4<\u4EB5<\u8114<\u88D2<\u7980<\u5B34" - "<\u8803<\u7FB8<\u51AB<\u51B1<\u51BD<\u51BC<\u51C7<\u5196<\u51A2" - "<\u51A5<\u8BA0<\u8BA6<\u8BA7<\u8BAA<\u8BB4<\u8BB5<\u8BB7<\u8BC2" - "<\u8BC3<\u8BCB<\u8BCF<\u8BCE<\u8BD2<\u8BD3<\u8BD4<\u8BD6<\u8BD8" - "<\u8BD9<\u8BDC<\u8BDF<\u8BE0<\u8BE4<\u8BE8<\u8BE9<\u8BEE<\u8BF0" - "<\u8BF3<\u8BF6<\u8BF9<\u8BFC<\u8BFF<\u8C00<\u8C02<\u8C04<\u8C07" - "<\u8C0C<\u8C0F<\u8C11<\u8C12<\u8C14<\u8C15<\u8C16<\u8C19<\u8C1B" - "<\u8C18<\u8C1D<\u8C1F<\u8C20<\u8C21<\u8C25<\u8C27<\u8C2A<\u8C2B" - "<\u8C2E<\u8C2F<\u8C32<\u8C33<\u8C35<\u8C36<\u5369<\u537A<\u961D" - "<\u9622<\u9621<\u9631<\u962A<\u963D<\u963C<\u9642<\u9649<\u9654" - "<\u965F<\u9667<\u966C<\u9672<\u9674<\u9688<\u968D<\u9697<\u96B0" - "<\u9097<\u909B<\u909D<\u9099<\u90AC<\u90A1<\u90B4<\u90B3<\u90B6" - "<\u90BA<\u90B8<\u90B0<\u90CF<\u90C5<\u90BE<\u90D0<\u90C4<\u90C7" - "<\u90D3<\u90E6<\u90E2<\u90DC<\u90D7<\u90DB<\u90EB<\u90EF<\u90FE" - "<\u9104<\u9122<\u911E<\u9123<\u9131<\u912F<\u9139<\u9143<\u9146" - "<\u520D<\u5942<\u52A2<\u52AC<\u52AD<\u52BE<\u54FF<\u52D0<\u52D6" - "<\u52F0<\u53DF<\u71EE<\u77CD<\u5EF4<\u51F5<\u51FC<\u9B2F<\u53B6" - "<\u5F01<\u755A<\u5DEF<\u574C<\u57A9<\u57A1<\u587E<\u58BC<\u58C5" - "<\u58D1<\u5729<\u572C<\u572A<\u5733<\u5739<\u572E<\u572F<\u575C" - "<\u573B<\u5742<\u5769<\u5785<\u576B<\u5786<\u577C<\u577B<\u5768" - "<\u576D<\u5776<\u5773<\u57AD<\u57A4<\u578C<\u57B2<\u57CF<\u57A7" - "<\u57B4<\u5793<\u57A0<\u57D5<\u57D8<\u57DA<\u57D9<\u57D2<\u57B8" - "<\u57F4<\u57EF<\u57F8<\u57E4<\u57DD<\u580B<\u580D<\u57FD<\u57ED" - "<\u5800<\u581E<\u5819<\u5844<\u5820<\u5865<\u586C<\u5881<\u5889" - "<\u589A<\u5880<\u99A8<\u9F19<\u61FF<\u8279<\u827D<\u827F<\u828F" - "<\u828A<\u82A8<\u8284<\u828E<\u8291<\u8297<\u8299<\u82AB<\u82B8" - "<\u82BE<\u82B0<\u82C8<\u82CA<\u82E3<\u8298<\u82B7<\u82AE<\u82CB" - "<\u82CC<\u82C1<\u82A9<\u82B4<\u82A1<\u82AA<\u829F<\u82C4<\u82CE" - "<\u82A4<\u82E1<\u8309<\u82F7<\u82E4<\u830F<\u8307<\u82DC<\u82F4" - "<\u82D2<\u82D8<\u830C<\u82FB<\u82D3<\u8311<\u831A<\u8306<\u8314" - "<\u8315<\u82E0<\u82D5<\u831C<\u8351<\u835B<\u835C<\u8308<\u8392" - "<\u833C<\u8334<\u8331<\u839B<\u835E<\u832F<\u834F<\u8347<\u8343" - "<\u835F<\u8340<\u8317<\u8360<\u832D<\u833A<\u8333<\u8366<\u8365" - "<\u8368<\u831B<\u8369<\u836C<\u836A<\u836D<\u836E<\u83B0<\u8378" - "<\u83B3<\u83B4<\u83A0<\u83AA<\u8393<\u839C<\u8385<\u837C<\u83B6" - "<\u83A9<\u837D<\u83B8<\u837B<\u8398<\u839E<\u83A8<\u83BA<\u83BC" - "<\u83C1<\u8401<\u83E5<\u83D8<\u5807<\u8418<\u840B<\u83DD<\u83FD" - "<\u83D6<\u841C<\u8438<\u8411<\u8406<\u83D4<\u83DF<\u840F<\u8403" - "<\u83F8<\u83F9<\u83EA<\u83C5<\u83C0<\u8426<\u83F0<\u83E1<\u845C" - "<\u8451<\u845A<\u8459<\u8473<\u8487<\u8488<\u847A<\u8489<\u8478" - "<\u843C<\u8446<\u8469<\u8476<\u848C<\u848E<\u8431<\u846D<\u84C1" - "<\u84CD<\u84D0<\u84E6<\u84BD<\u84D3<\u84CA<\u84BF<\u84BA<\u84E0" - "<\u84A1<\u84B9<\u84B4<\u8497<\u84E5<\u84E3<\u850C<\u750D<\u8538" - "<\u84F0<\u8539<\u851F<\u853A<\u8556<\u853B<\u84FF<\u84FC<\u8559" - "<\u8548<\u8568<\u8564<\u855E<\u857A<\u77A2<\u8543<\u8572<\u857B" - "<\u85A4<\u85A8<\u8587<\u858F<\u8579<\u85AE<\u859C<\u8585<\u85B9" - "<\u85B7<\u85B0<\u85D3<\u85C1<\u85DC<\u85FF<\u8627<\u8605<\u8629" - "<\u8616<\u863C<\u5EFE<\u5F08<\u593C<\u5941<\u8037<\u5955<\u595A" - "<\u5958<\u530F<\u5C22<\u5C25<\u5C2C<\u5C34<\u624C<\u626A<\u629F" - "<\u62BB<\u62CA<\u62DA<\u62D7<\u62EE<\u6322<\u62F6<\u6339<\u634B" - "<\u6343<\u63AD<\u63F6<\u6371<\u637A<\u638E<\u63B4<\u636D<\u63AC" - "<\u638A<\u6369<\u63AE<\u63BC<\u63F2<\u63F8<\u63E0<\u63FF<\u63C4" - "<\u63DE<\u63CE<\u6452<\u63C6<\u63BE<\u6445<\u6441<\u640B<\u641B" - "<\u6420<\u640C<\u6426<\u6421<\u645E<\u6484<\u646D<\u6496<\u647A" - "<\u64B7<\u64B8<\u6499<\u64BA<\u64C0<\u64D0<\u64D7<\u64E4<\u64E2" - "<\u6509<\u6525<\u652E<\u5F0B<\u5FD2<\u7519<\u5F11<\u535F<\u53F1" - "<\u53FD<\u53E9<\u53E8<\u53FB<\u5412<\u5416<\u5406<\u544B<\u5452" - "<\u5453<\u5454<\u5456<\u5443<\u5421<\u5457<\u5459<\u5423<\u5432" - "<\u5482<\u5494<\u5477<\u5471<\u5464<\u549A<\u549B<\u5484<\u5476" - "<\u5466<\u549D<\u54D0<\u54AD<\u54C2<\u54B4<\u54D2<\u54A7<\u54A6" - "<\u54D3<\u54D4<\u5472<\u54A3<\u54D5<\u54BB<\u54BF<\u54CC<\u54D9" - "<\u54DA<\u54DC<\u54A9<\u54AA<\u54A4<\u54DD<\u54CF<\u54DE<\u551B" - "<\u54E7<\u5520<\u54FD<\u5514<\u54F3<\u5522<\u5523<\u550F<\u5511" - "<\u5527<\u552A<\u5567<\u558F<\u55B5<\u5549<\u556D<\u5541<\u5555" - "<\u553F<\u5550<\u553C<\u5537<\u5556<\u5575<\u5576<\u5577<\u5533" - "<\u5530<\u555C<\u558B<\u55D2<\u5583<\u55B1<\u55B9<\u5588<\u5581" - "<\u559F<\u557E<\u55D6<\u5591<\u557B<\u55DF<\u55BD<\u55BE<\u5594" - "<\u5599<\u55EA<\u55F7<\u55C9<\u561F<\u55D1<\u55EB<\u55EC<\u55D4" - "<\u55E6<\u55DD<\u55C4<\u55EF<\u55E5<\u55F2<\u55F3<\u55CC<\u55CD" - "<\u55E8<\u55F5<\u55E4<\u8F94<\u561E<\u5608<\u560C<\u5601<\u5624" - "<\u5623<\u55FE<\u5600<\u5627<\u562D<\u5658<\u5639<\u5657<\u562C" - "<\u564D<\u5662<\u5659<\u565C<\u564C<\u5654<\u5686<\u5664<\u5671" - "<\u566B<\u567B<\u567C<\u5685<\u5693<\u56AF<\u56D4<\u56D7<\u56DD" - "<\u56E1<\u56F5<\u56EB<\u56F9<\u56FF<\u5704<\u570A<\u5709<\u571C" - "<\u5E0F<\u5E19<\u5E14<\u5E11<\u5E31<\u5E3B<\u5E3C<\u5E37<\u5E44" - "<\u5E54<\u5E5B<\u5E5E<\u5E61<\u5C8C<\u5C7A<\u5C8D<\u5C90<\u5C96" - "<\u5C88<\u5C98<\u5C99<\u5C91<\u5C9A<\u5C9C<\u5CB5<\u5CA2<\u5CBD" - "<\u5CAC<\u5CAB<\u5CB1<\u5CA3<\u5CC1<\u5CB7<\u5CC4<\u5CD2<\u5CE4" - "<\u5CCB<\u5CE5<\u5D02<\u5D03<\u5D27<\u5D26<\u5D2E<\u5D24<\u5D1E" - "<\u5D06<\u5D1B<\u5D58<\u5D3E<\u5D34<\u5D3D<\u5D6C<\u5D5B<\u5D6F" - "<\u5D5D<\u5D6B<\u5D4B<\u5D4A<\u5D69<\u5D74<\u5D82<\u5D99<\u5D9D" - "<\u8C73<\u5DB7<\u5DC5<\u5F73<\u5F77<\u5F82<\u5F87<\u5F89<\u5F8C" - "<\u5F95<\u5F99<\u5F9C<\u5FA8<\u5FAD<\u5FB5<\u5FBC<\u8862<\u5F61" - "<\u72AD<\u72B0<\u72B4<\u72B7<\u72B8<\u72C3<\u72C1<\u72CE<\u72CD" - "<\u72D2<\u72E8<\u72EF<\u72E9<\u72F2<\u72F4<\u72F7<\u7301<\u72F3" - "<\u7303<\u72FA<\u72FB<\u7317<\u7313<\u7321<\u730A<\u731E<\u731D" - "<\u7315<\u7322<\u7339<\u7325<\u732C<\u7338<\u7331<\u7350<\u734D" - "<\u7357<\u7360<\u736C<\u736F<\u737E<\u821B<\u5925<\u98E7<\u5924" - "<\u5902<\u9963<\u9967<\u9968<\u9969<\u996A<\u996B<\u996C<\u9974" - "<\u9977<\u997D<\u9980<\u9984<\u9987<\u998A<\u998D<\u9990<\u9991" - "<\u9993<\u9994<\u9995<\u5E80<\u5E91<\u5E8B<\u5E96<\u5EA5<\u5EA0" - "<\u5EB9<\u5EB5<\u5EBE<\u5EB3<\u8D53<\u5ED2<\u5ED1<\u5EDB<\u5EE8" - "<\u5EEA<\u81BA<\u5FC4<\u5FC9<\u5FD6<\u5FCF<\u6003<\u5FEE<\u6004" - "<\u5FE1<\u5FE4<\u5FFE<\u6005<\u6006<\u5FEA<\u5FED<\u5FF8<\u6019" - "<\u6035<\u6026<\u601B<\u600F<\u600D<\u6029<\u602B<\u600A<\u603F" - "<\u6021<\u6078<\u6079<\u607B<\u607A<\u6042<\u606A<\u607D<\u6096" - "<\u609A<\u60AD<\u609D<\u6083<\u6092<\u608C<\u609B<\u60EC<\u60BB" - "<\u60B1<\u60DD<\u60D8<\u60C6<\u60DA<\u60B4<\u6120<\u6126<\u6115" - "<\u6123<\u60F4<\u6100<\u610E<\u612B<\u614A<\u6175<\u61AC<\u6194" - "<\u61A7<\u61B7<\u61D4<\u61F5<\u5FDD<\u96B3<\u95E9<\u95EB<\u95F1" - "<\u95F3<\u95F5<\u95F6<\u95FC<\u95FE<\u9603<\u9604<\u9606<\u9608" - "<\u960A<\u960B<\u960C<\u960D<\u960F<\u9612<\u9615<\u9616<\u9617" - "<\u9619<\u961A<\u4E2C<\u723F<\u6215<\u6C35<\u6C54<\u6C5C<\u6C4A" - "<\u6CA3<\u6C85<\u6C90<\u6C94<\u6C8C<\u6C68<\u6C69<\u6C74<\u6C76" - "<\u6C86<\u6CA9<\u6CD0<\u6CD4<\u6CAD<\u6CF7<\u6CF8<\u6CF1<\u6CD7" - "<\u6CB2<\u6CE0<\u6CD6<\u6CFA<\u6CEB<\u6CEE<\u6CB1<\u6CD3<\u6CEF" - "<\u6CFE<\u6D39<\u6D27<\u6D0C<\u6D43<\u6D48<\u6D07<\u6D04<\u6D19" - "<\u6D0E<\u6D2B<\u6D4D<\u6D2E<\u6D35<\u6D1A<\u6D4F<\u6D52<\u6D54" - "<\u6D33<\u6D91<\u6D6F<\u6D9E<\u6DA0<\u6D5E<\u6D93<\u6D94<\u6D5C" - "<\u6D60<\u6D7C<\u6D63<\u6E1A<\u6DC7<\u6DC5<\u6DDE<\u6E0E<\u6DBF" - "<\u6DE0<\u6E11<\u6DE6<\u6DDD<\u6DD9<\u6E16<\u6DAB<\u6E0C<\u6DAE" - "<\u6E2B<\u6E6E<\u6E4E<\u6E6B<\u6EB2<\u6E5F<\u6E86<\u6E53<\u6E54" - "<\u6E32<\u6E25<\u6E44<\u6EDF<\u6EB1<\u6E98<\u6EE0<\u6F2D<\u6EE2" - "<\u6EA5<\u6EA7<\u6EBD<\u6EBB<\u6EB7<\u6ED7<\u6EB4<\u6ECF<\u6E8F" - "<\u6EC2<\u6E9F<\u6F62<\u6F46<\u6F47<\u6F24<\u6F15<\u6EF9<\u6F2F" - "<\u6F36<\u6F4B<\u6F74<\u6F2A<\u6F09<\u6F29<\u6F89<\u6F8D<\u6F8C" - "<\u6F78<\u6F72<\u6F7C<\u6F7A<\u6FD1<\u6FC9<\u6FA7<\u6FB9<\u6FB6" - "<\u6FC2<\u6FE1<\u6FEE<\u6FDE<\u6FE0<\u6FEF<\u701A<\u7023<\u701B" - "<\u7039<\u7035<\u704F<\u705E<\u5B80<\u5B84<\u5B95<\u5B93<\u5BA5" - "<\u5BB8<\u752F<\u9A9E<\u6434<\u5BE4<\u5BEE<\u8930<\u5BF0<\u8E47" - "<\u8B07<\u8FB6<\u8FD3<\u8FD5<\u8FE5<\u8FEE<\u8FE4<\u8FE9<\u8FE6" - "<\u8FF3<\u8FE8<\u9005<\u9004<\u900B<\u9026<\u9011<\u900D<\u9016" - "<\u9021<\u9035<\u9036<\u902D<\u902F<\u9044<\u9051<\u9052<\u9050" - "<\u9068<\u9058<\u9062<\u905B<\u66B9<\u9074<\u907D<\u9082<\u9088" - "<\u9083<\u908B<\u5F50<\u5F57<\u5F56<\u5F58<\u5C3B<\u54AB<\u5C50" - "<\u5C59<\u5B71<\u5C63<\u5C66<\u7FBC<\u5F2A<\u5F29<\u5F2D<\u8274" - "<\u5F3C<\u9B3B<\u5C6E<\u5981<\u5983<\u598D<\u59A9<\u59AA<\u59A3" - "<\u5997<\u59CA<\u59AB<\u599E<\u59A4<\u59D2<\u59B2<\u59AF<\u59D7" - "<\u59BE<\u5A05<\u5A06<\u59DD<\u5A08<\u59E3<\u59D8<\u59F9<\u5A0C" - "<\u5A09<\u5A32<\u5A34<\u5A11<\u5A23<\u5A13<\u5A40<\u5A67<\u5A4A" - "<\u5A55<\u5A3C<\u5A62<\u5A75<\u80EC<\u5AAA<\u5A9B<\u5A77<\u5A7A" - "<\u5ABE<\u5AEB<\u5AB2<\u5AD2<\u5AD4<\u5AB8<\u5AE0<\u5AE3<\u5AF1" - "<\u5AD6<\u5AE6<\u5AD8<\u5ADC<\u5B09<\u5B17<\u5B16<\u5B32<\u5B37" - "<\u5B40<\u5C15<\u5C1C<\u5B5A<\u5B65<\u5B73<\u5B51<\u5B53<\u5B62" - "<\u9A75<\u9A77<\u9A78<\u9A7A<\u9A7F<\u9A7D<\u9A80<\u9A81<\u9A85" - "<\u9A88<\u9A8A<\u9A90<\u9A92<\u9A93<\u9A96<\u9A98<\u9A9B<\u9A9C" - "<\u9A9D<\u9A9F<\u9AA0<\u9AA2<\u9AA3<\u9AA5<\u9AA7<\u7E9F<\u7EA1" - "<\u7EA3<\u7EA5<\u7EA8<\u7EA9<\u7EAD<\u7EB0<\u7EBE<\u7EC0<\u7EC1" - "<\u7EC2<\u7EC9<\u7ECB<\u7ECC<\u7ED0<\u7ED4<\u7ED7<\u7EDB<\u7EE0" - "<\u7EE1<\u7EE8<\u7EEB<\u7EEE<\u7EEF<\u7EF1<\u7EF2<\u7F0D<\u7EF6" - "<\u7EFA<\u7EFB<\u7EFE<\u7F01<\u7F02<\u7F03<\u7F07<\u7F08<\u7F0B" - "<\u7F0C<\u7F0F<\u7F11<\u7F12<\u7F17<\u7F19<\u7F1C<\u7F1B<\u7F1F" - "<\u7F21<\u7F22<\u7F23<\u7F24<\u7F25<\u7F26<\u7F27<\u7F2A<\u7F2B" - "<\u7F2C<\u7F2D<\u7F2F<\u7F30<\u7F31<\u7F32<\u7F33<\u7F35<\u5E7A" - "<\u757F<\u5DDB<\u753E<\u9095<\u738E<\u7391<\u73AE<\u73A2<\u739F" - "<\u73CF<\u73C2<\u73D1<\u73B7<\u73B3<\u73C0<\u73C9<\u73C8<\u73E5" - "<\u73D9<\u987C<\u740A<\u73E9<\u73E7<\u73DE<\u73BA<\u73F2<\u740F" - "<\u742A<\u745B<\u7426<\u7425<\u7428<\u7430<\u742E<\u742C<\u741B" - "<\u741A<\u7441<\u745C<\u7457<\u7455<\u7459<\u7477<\u746D<\u747E" - "<\u749C<\u748E<\u7480<\u7481<\u7487<\u748B<\u749E<\u74A8<\u74A9" - "<\u7490<\u74A7<\u74D2<\u74BA<\u97EA<\u97EB<\u97EC<\u674C<\u6753" - "<\u675E<\u6748<\u6769<\u67A5<\u6787<\u676A<\u6773<\u6798<\u67A7" - "<\u6775<\u67A8<\u679E<\u67AD<\u678B<\u6777<\u677C<\u67F0<\u6809" - "<\u67D8<\u680A<\u67E9<\u67B0<\u680C<\u67D9<\u67B5<\u67DA<\u67B3" - "<\u67DD<\u6800<\u67C3<\u67B8<\u67E2<\u680E<\u67C1<\u67FD<\u6832" - "<\u6833<\u6860<\u6861<\u684E<\u6862<\u6844<\u6864<\u6883<\u681D" - "<\u6855<\u6866<\u6841<\u6867<\u6840<\u683E<\u684A<\u6849<\u6829" - "<\u68B5<\u688F<\u6874<\u6877<\u6893<\u686B<\u68C2<\u696E<\u68FC" - "<\u691F<\u6920<\u68F9<\u6924<\u68F0<\u690B<\u6901<\u6957<\u68E3" - "<\u6910<\u6971<\u6939<\u6960<\u6942<\u695D<\u6984<\u696B<\u6980" - "<\u6998<\u6978<\u6934<\u69CC<\u6987<\u6988<\u69CE<\u6989<\u6966" - "<\u6963<\u6979<\u699B<\u69A7<\u69BB<\u69AB<\u69AD<\u69D4<\u69B1" - "<\u69C1<\u69CA<\u69DF<\u6995<\u69E0<\u698D<\u69FF<\u6A2F<\u69ED" - "<\u6A17<\u6A18<\u6A65<\u69F2<\u6A44<\u6A3E<\u6AA0<\u6A50<\u6A5B" - "<\u6A35<\u6A8E<\u6A79<\u6A3D<\u6A28<\u6A58<\u6A7C<\u6A91<\u6A90" - "<\u6AA9<\u6A97<\u6AAB<\u7337<\u7352<\u6B81<\u6B82<\u6B87<\u6B84" - "<\u6B92<\u6B93<\u6B8D<\u6B9A<\u6B9B<\u6BA1<\u6BAA<\u8F6B<\u8F6D" - "<\u8F71<\u8F72<\u8F73<\u8F75<\u8F76<\u8F78<\u8F77<\u8F79<\u8F7A" - "<\u8F7C<\u8F7E<\u8F81<\u8F82<\u8F84<\u8F87<\u8F8B<\u8F8D<\u8F8E" - "<\u8F8F<\u8F98<\u8F9A<\u8ECE<\u620B<\u6217<\u621B<\u621F<\u6222" - "<\u6221<\u6225<\u6224<\u622C<\u81E7<\u74EF<\u74F4<\u74FF<\u750F" - "<\u7511<\u7513<\u6534<\u65EE<\u65EF<\u65F0<\u660A<\u6619<\u6772" - "<\u6603<\u6615<\u6600<\u7085<\u66F7<\u661D<\u6634<\u6631<\u6636" - "<\u6635<\u8006<\u665F<\u6654<\u6641<\u664F<\u6656<\u6661<\u6657" - "<\u6677<\u6684<\u668C<\u66A7<\u669D<\u66BE<\u66DB<\u66DC<\u66E6" - "<\u66E9<\u8D32<\u8D33<\u8D36<\u8D3B<\u8D3D<\u8D40<\u8D45<\u8D46" - "<\u8D48<\u8D49<\u8D47<\u8D4D<\u8D55<\u8D59<\u89C7<\u89CA<\u89CB" - "<\u89CC<\u89CE<\u89CF<\u89D0<\u89D1<\u726E<\u729F<\u725D<\u7266" - "<\u726F<\u727E<\u727F<\u7284<\u728B<\u728D<\u728F<\u7292<\u6308" - "<\u6332<\u63B0<\u643F<\u64D8<\u8004<\u6BEA<\u6BF3<\u6BFD<\u6BF5" - "<\u6BF9<\u6C05<\u6C07<\u6C06<\u6C0D<\u6C15<\u6C18<\u6C19<\u6C1A" - "<\u6C21<\u6C29<\u6C24<\u6C2A<\u6C32<\u6535<\u6555<\u656B<\u724D" - "<\u7252<\u7256<\u7230<\u8662<\u5216<\u809F<\u809C<\u8093<\u80BC" - "<\u670A<\u80BD<\u80B1<\u80AB<\u80AD<\u80B4<\u80B7<\u80E7<\u80E8" - "<\u80E9<\u80EA<\u80DB<\u80C2<\u80C4<\u80D9<\u80CD<\u80D7<\u6710" - "<\u80DD<\u80EB<\u80F1<\u80F4<\u80ED<\u810D<\u810E<\u80F2<\u80FC" - "<\u6715<\u8112<\u8C5A<\u8136<\u811E<\u812C<\u8118<\u8132<\u8148" - "<\u814C<\u8153<\u8174<\u8159<\u815A<\u8171<\u8160<\u8169<\u817C" - "<\u817D<\u816D<\u8167<\u584D<\u5AB5<\u8188<\u8182<\u8191<\u6ED5" - "<\u81A3<\u81AA<\u81CC<\u6726<\u81CA<\u81BB<\u81C1<\u81A6<\u6B24" - "<\u6B37<\u6B39<\u6B43<\u6B46<\u6B59<\u98D1<\u98D2<\u98D3<\u98D5" - "<\u98D9<\u98DA<\u6BB3<\u5F40<\u6BC2<\u89F3<\u6590<\u9F51<\u6593" - "<\u65BC<\u65C6<\u65C4<\u65C3<\u65CC<\u65CE<\u65D2<\u65D6<\u7080" - "<\u709C<\u7096<\u709D<\u70BB<\u70C0<\u70B7<\u70AB<\u70B1<\u70E8" - "<\u70CA<\u7110<\u7113<\u7116<\u712F<\u7131<\u7173<\u715C<\u7168" - "<\u7145<\u7172<\u714A<\u7178<\u717A<\u7198<\u71B3<\u71B5<\u71A8" - "<\u71A0<\u71E0<\u71D4<\u71E7<\u71F9<\u721D<\u7228<\u706C<\u7118" - "<\u7166<\u71B9<\u623E<\u623D<\u6243<\u6248<\u6249<\u793B<\u7940" - "<\u7946<\u7949<\u795B<\u795C<\u7953<\u795A<\u7962<\u7957<\u7960" - "<\u796F<\u7967<\u797A<\u7985<\u798A<\u799A<\u79A7<\u79B3<\u5FD1" - "<\u5FD0<\u603C<\u605D<\u605A<\u6067<\u6041<\u6059<\u6063<\u60AB" - "<\u6106<\u610D<\u615D<\u61A9<\u619D<\u61CB<\u61D1<\u6206<\u8080" - "<\u807F<\u6C93<\u6CF6<\u6DFC<\u77F6<\u77F8<\u7800<\u7809<\u7817" - "<\u7818<\u7811<\u65AB<\u782D<\u781C<\u781D<\u7839<\u783A<\u783B" - "<\u781F<\u783C<\u7825<\u782C<\u7823<\u7829<\u784E<\u786D<\u7856" - "<\u7857<\u7826<\u7850<\u7847<\u784C<\u786A<\u789B<\u7893<\u789A" - "<\u7887<\u789C<\u78A1<\u78A3<\u78B2<\u78B9<\u78A5<\u78D4<\u78D9" - "<\u78C9<\u78EC<\u78F2<\u7905<\u78F4<\u7913<\u7924<\u791E<\u7934" - "<\u9F9B<\u9EF9<\u9EFB<\u9EFC<\u76F1<\u7704<\u770D<\u76F9<\u7707" - "<\u7708<\u771A<\u7722<\u7719<\u772D<\u7726<\u7735<\u7738<\u7750" - "<\u7751<\u7747<\u7743<\u775A<\u7768<\u7762<\u7765<\u777F<\u778D" - "<\u777D<\u7780<\u778C<\u7791<\u779F<\u77A0<\u77B0<\u77B5<\u77BD" - "<\u753A<\u7540<\u754E<\u754B<\u7548<\u755B<\u7572<\u7579<\u7583" - "<\u7F58<\u7F61<\u7F5F<\u8A48<\u7F68<\u7F74<\u7F71<\u7F79<\u7F81" - "<\u7F7E<\u76CD<\u76E5<\u8832<\u9485<\u9486<\u9487<\u948B<\u948A" - "<\u948C<\u948D<\u948F<\u9490<\u9494<\u9497<\u9495<\u949A<\u949B" - "<\u949C<\u94A3<\u94A4<\u94AB<\u94AA<\u94AD<\u94AC<\u94AF<\u94B0" - "<\u94B2<\u94B4<\u94B6<\u94B7<\u94B8<\u94B9<\u94BA<\u94BC<\u94BD" - "<\u94BF<\u94C4<\u94C8<\u94C9<\u94CA<\u94CB<\u94CC<\u94CD<\u94CE" - "<\u94D0<\u94D1<\u94D2<\u94D5<\u94D6<\u94D7<\u94D9<\u94D8<\u94DB" - "<\u94DE<\u94DF<\u94E0<\u94E2<\u94E4<\u94E5<\u94E7<\u94E8<\u94EA" - "<\u94E9<\u94EB<\u94EE<\u94EF<\u94F3<\u94F4<\u94F5<\u94F7<\u94F9" - "<\u94FC<\u94FD<\u94FF<\u9503<\u9502<\u9506<\u9507<\u9509<\u950A" - "<\u950D<\u950E<\u950F<\u9512<\u9513<\u9514<\u9515<\u9516<\u9518" - "<\u951B<\u951D<\u951E<\u951F<\u9522<\u952A<\u952B<\u9529<\u952C" - "<\u9531<\u9532<\u9534<\u9536<\u9537<\u9538<\u953C<\u953E<\u953F" - "<\u9542<\u9535<\u9544<\u9545<\u9546<\u9549<\u954C<\u954E<\u954F" - "<\u9552<\u9553<\u9554<\u9556<\u9557<\u9558<\u9559<\u955B<\u955E" - "<\u955F<\u955D<\u9561<\u9562<\u9564<\u9565<\u9566<\u9567<\u9568" - "<\u9569<\u956A<\u956B<\u956C<\u956F<\u9571<\u9572<\u9573<\u953A" - "<\u77E7<\u77EC<\u96C9<\u79D5<\u79ED<\u79E3<\u79EB<\u7A06<\u5D47" - "<\u7A03<\u7A02<\u7A1E<\u7A14<\u7A39<\u7A37<\u7A51<\u9ECF<\u99A5" - "<\u7A70<\u7688<\u768E<\u7693<\u7699<\u76A4<\u74DE<\u74E0<\u752C" - "<\u9E20<\u9E22<\u9E28<\u9E29<\u9E2A<\u9E2B<\u9E2C<\u9E32<\u9E31" - "<\u9E36<\u9E38<\u9E37<\u9E39<\u9E3A<\u9E3E<\u9E41<\u9E42<\u9E44" - "<\u9E46<\u9E47<\u9E48<\u9E49<\u9E4B<\u9E4C<\u9E4E<\u9E51<\u9E55" - "<\u9E57<\u9E5A<\u9E5B<\u9E5C<\u9E5E<\u9E63<\u9E66<\u9E67<\u9E68" - "<\u9E69<\u9E6A<\u9E6B<\u9E6C<\u9E71<\u9E6D<\u9E73<\u7592<\u7594" - "<\u7596<\u75A0<\u759D<\u75AC<\u75A3<\u75B3<\u75B4<\u75B8<\u75C4" - "<\u75B1<\u75B0<\u75C3<\u75C2<\u75D6<\u75CD<\u75E3<\u75E8<\u75E6" - "<\u75E4<\u75EB<\u75E7<\u7603<\u75F1<\u75FC<\u75FF<\u7610<\u7600" - "<\u7605<\u760C<\u7617<\u760A<\u7625<\u7618<\u7615<\u7619<\u761B" - "<\u763C<\u7622<\u7620<\u7640<\u762D<\u7630<\u763F<\u7635<\u7643" - "<\u763E<\u7633<\u764D<\u765E<\u7654<\u765C<\u7656<\u766B<\u766F" - "<\u7FCA<\u7AE6<\u7A78<\u7A79<\u7A80<\u7A86<\u7A88<\u7A95<\u7AA6" - "<\u7AA0<\u7AAC<\u7AA8<\u7AAD<\u7AB3<\u8864<\u8869<\u8872<\u887D" - "<\u887F<\u8882<\u88A2<\u88C6<\u88B7<\u88BC<\u88C9<\u88E2<\u88CE" - "<\u88E3<\u88E5<\u88F1<\u891A<\u88FC<\u88E8<\u88FE<\u88F0<\u8921" - "<\u8919<\u8913<\u891B<\u890A<\u8934<\u892B<\u8936<\u8941<\u8966" - "<\u897B<\u758B<\u80E5<\u76B2<\u76B4<\u77DC<\u8012<\u8014<\u8016" - "<\u801C<\u8020<\u8022<\u8025<\u8026<\u8027<\u8029<\u8028<\u8031" - "<\u800B<\u8035<\u8043<\u8046<\u804D<\u8052<\u8069<\u8071<\u8983" - "<\u9878<\u9880<\u9883<\u9889<\u988C<\u988D<\u988F<\u9894<\u989A" - "<\u989B<\u989E<\u989F<\u98A1<\u98A2<\u98A5<\u98A6<\u864D<\u8654" - "<\u866C<\u866E<\u867F<\u867A<\u867C<\u867B<\u86A8<\u868D<\u868B" - "<\u86AC<\u869D<\u86A7<\u86A3<\u86AA<\u8693<\u86A9<\u86B6<\u86C4" - "<\u86B5<\u86CE<\u86B0<\u86BA<\u86B1<\u86AF<\u86C9<\u86CF<\u86B4" - "<\u86E9<\u86F1<\u86F2<\u86ED<\u86F3<\u86D0<\u8713<\u86DE<\u86F4" - "<\u86DF<\u86D8<\u86D1<\u8703<\u8707<\u86F8<\u8708<\u870A<\u870D" - "<\u8709<\u8723<\u873B<\u871E<\u8725<\u872E<\u871A<\u873E<\u8748" - "<\u8734<\u8731<\u8729<\u8737<\u873F<\u8782<\u8722<\u877D<\u877E" - "<\u877B<\u8760<\u8770<\u874C<\u876E<\u878B<\u8753<\u8763<\u877C" - "<\u8764<\u8759<\u8765<\u8793<\u87AF<\u87A8<\u87D2<\u87C6<\u8788" - "<\u8785<\u87AD<\u8797<\u8783<\u87AB<\u87E5<\u87AC<\u87B5<\u87B3" - "<\u87CB<\u87D3<\u87BD<\u87D1<\u87C0<\u87CA<\u87DB<\u87EA<\u87E0" - "<\u87EE<\u8816<\u8813<\u87FE<\u880A<\u881B<\u8821<\u8839<\u883C" - "<\u7F36<\u7F42<\u7F44<\u7F45<\u8210<\u7AFA<\u7AFD<\u7B08<\u7B03" - "<\u7B04<\u7B15<\u7B0A<\u7B2B<\u7B0F<\u7B47<\u7B38<\u7B2A<\u7B19" - "<\u7B2E<\u7B31<\u7B20<\u7B25<\u7B24<\u7B33<\u7B3E<\u7B1E<\u7B58" - "<\u7B5A<\u7B45<\u7B75<\u7B4C<\u7B5D<\u7B60<\u7B6E<\u7B7B<\u7B62" - "<\u7B72<\u7B71<\u7B90<\u7BA6<\u7BA7<\u7BB8<\u7BAC<\u7B9D<\u7BA8" - "<\u7B85<\u7BAA<\u7B9C<\u7BA2<\u7BAB<\u7BB4<\u7BD1<\u7BC1<\u7BCC" - "<\u7BDD<\u7BDA<\u7BE5<\u7BE6<\u7BEA<\u7C0C<\u7BFE<\u7BFC<\u7C0F" - "<\u7C16<\u7C0B<\u7C1F<\u7C2A<\u7C26<\u7C38<\u7C41<\u7C40<\u81FE" - "<\u8201<\u8202<\u8204<\u81EC<\u8844<\u8221<\u8222<\u8223<\u822D" - "<\u822F<\u8228<\u822B<\u8238<\u823B<\u8233<\u8234<\u823E<\u8244" - "<\u8249<\u824B<\u824F<\u825A<\u825F<\u8268<\u887E<\u8885<\u8888" - "<\u88D8<\u88DF<\u895E<\u7F9D<\u7F9F<\u7FA7<\u7FAF<\u7FB0<\u7FB2" - "<\u7C7C<\u6549<\u7C91<\u7C9D<\u7C9C<\u7C9E<\u7CA2<\u7CB2<\u7CBC" - "<\u7CBD<\u7CC1<\u7CC7<\u7CCC<\u7CCD<\u7CC8<\u7CC5<\u7CD7<\u7CE8" - "<\u826E<\u66A8<\u7FBF<\u7FCE<\u7FD5<\u7FE5<\u7FE1<\u7FE6<\u7FE9" - "<\u7FEE<\u7FF3<\u7CF8<\u7D77<\u7DA6<\u7DAE<\u7E47<\u7E9B<\u9EB8" - "<\u9EB4<\u8D73<\u8D84<\u8D94<\u8D91<\u8DB1<\u8D67<\u8D6D<\u8C47" - "<\u8C49<\u914A<\u9150<\u914E<\u914F<\u9164<\u9162<\u9161<\u9170" - "<\u9169<\u916F<\u917D<\u917E<\u9172<\u9174<\u9179<\u918C<\u9185" - "<\u9190<\u918D<\u9191<\u91A2<\u91A3<\u91AA<\u91AD<\u91AE<\u91AF" - "<\u91B5<\u91B4<\u91BA<\u8C55<\u9E7E<\u8DB8<\u8DEB<\u8E05<\u8E59" - "<\u8E69<\u8DB5<\u8DBF<\u8DBC<\u8DBA<\u8DC4<\u8DD6<\u8DD7<\u8DDA" - "<\u8DDE<\u8DCE<\u8DCF<\u8DDB<\u8DC6<\u8DEC<\u8DF7<\u8DF8<\u8DE3" - "<\u8DF9<\u8DFB<\u8DE4<\u8E09<\u8DFD<\u8E14<\u8E1D<\u8E1F<\u8E2C" - "<\u8E2E<\u8E23<\u8E2F<\u8E3A<\u8E40<\u8E39<\u8E35<\u8E3D<\u8E31" - "<\u8E49<\u8E41<\u8E42<\u8E51<\u8E52<\u8E4A<\u8E70<\u8E76<\u8E7C" - "<\u8E6F<\u8E74<\u8E85<\u8E8F<\u8E94<\u8E90<\u8E9C<\u8E9E<\u8C78" - "<\u8C82<\u8C8A<\u8C85<\u8C98<\u8C94<\u659B<\u89D6<\u89DE<\u89DA" - "<\u89DC<\u89E5<\u89EB<\u89EF<\u8A3E<\u8B26<\u9753<\u96E9<\u96F3" - "<\u96EF<\u9706<\u9701<\u9708<\u970F<\u970E<\u972A<\u972D<\u9730" - "<\u973E<\u9F80<\u9F83<\u9F85<\u9F86<\u9F87<\u9F88<\u9F89<\u9F8A" - "<\u9F8C<\u9EFE<\u9F0B<\u9F0D<\u96B9<\u96BC<\u96BD<\u96CE<\u96D2" - "<\u77BF<\u96E0<\u928E<\u92AE<\u92C8<\u933E<\u936A<\u93CA<\u938F" - "<\u943E<\u946B<\u9C7F<\u9C82<\u9C85<\u9C86<\u9C87<\u9C88<\u7A23" - "<\u9C8B<\u9C8E<\u9C90<\u9C91<\u9C92<\u9C94<\u9C95<\u9C9A<\u9C9B" - "<\u9C9E<\u9C9F<\u9CA0<\u9CA1<\u9CA2<\u9CA3<\u9CA5<\u9CA6<\u9CA7" - "<\u9CA8<\u9CA9<\u9CAB<\u9CAD<\u9CAE<\u9CB0<\u9CB1<\u9CB2<\u9CB3" - "<\u9CB4<\u9CB5<\u9CB6<\u9CB7<\u9CBA<\u9CBB<\u9CBC<\u9CBD<\u9CC4" - "<\u9CC5<\u9CC6<\u9CC7<\u9CCA<\u9CCB<\u9CCC<\u9CCD<\u9CCE<\u9CCF" - "<\u9CD0<\u9CD3<\u9CD4<\u9CD5<\u9CD7<\u9CD8<\u9CD9<\u9CDC<\u9CDD" - "<\u9CDF<\u9CE2<\u977C<\u9785<\u9791<\u9792<\u9794<\u97AF<\u97AB" - "<\u97A3<\u97B2<\u97B4<\u9AB1<\u9AB0<\u9AB7<\u9E58<\u9AB6<\u9ABA" - "<\u9ABC<\u9AC1<\u9AC0<\u9AC5<\u9AC2<\u9ACB<\u9ACC<\u9AD1<\u9B45" - "<\u9B43<\u9B47<\u9B49<\u9B48<\u9B4D<\u9B51<\u98E8<\u990D<\u992E" - "<\u9955<\u9954<\u9ADF<\u9AE1<\u9AE6<\u9AEF<\u9AEB<\u9AFB<\u9AED" - "<\u9AF9<\u9B08<\u9B0F<\u9B13<\u9B1F<\u9B23<\u9EBD<\u9EBE<\u7E3B" - "<\u9E82<\u9E87<\u9E88<\u9E8B<\u9E92<\u93D6<\u9E9D<\u9E9F<\u9EDB" - "<\u9EDC<\u9EDD<\u9EE0<\u9EDF<\u9EE2<\u9EE9<\u9EE7<\u9EE5<\u9EEA" - "<\u9EEF<\u9F22<\u9F2C<\u9F2F<\u9F39<\u9F37<\u9F3D<\u9F3E<\u9F44"} - } - Countries { - AD { "\u5b89\u9053\u5c14" } - AE { "\u963f\u62c9\u4f2f\u8054\u5408\u914b\u957f\u56fd" } - AF { "\u963f\u5bcc\u6c57" } - AG { "\u5b89\u63d0\u74dc\u548c\u5df4\u5e03\u8fbe" } - AI { "\u5b89\u572d\u62c9" } - AL { "\u963f\u5c14\u5df4\u5c3c\u4e9a" } - AM { "\u4e9a\u7f8e\u5c3c\u4e9a" } - AN { "\u8377\u5c5e\u5b89\u7684\u5217\u65af\u7fa4\u5c9b" } - AO { "\u5b89\u54e5\u62c9" } - AQ { "\u5357\u6781\u6d32" } - AR { "\u963f\u6839\u5ef7" } - AS { "\u7f8e\u5c5e\u8428\u6469\u4e9a" } - AT { "\u5965\u5730\u5229" } - AU { "\u6fb3\u5927\u5229\u4e9a" } - AW { "\u963f\u9c81\u5df4" } - AZ { "\u963f\u585e\u62dc\u7586" } - BA { "\u6ce2\u65af\u5c3c\u4e9a\u548c\u9ed1\u5c71\u5171\u548c\u56fd" } - BB { "\u5df4\u5df4\u591a\u65af" } - BD { "\u5b5f\u52a0\u62c9\u56fd" } - BE { "\u6bd4\u5229\u65f6" } - BF { "\u5e03\u57fa\u7eb3\u6cd5\u7d22" } - BG { "\u4fdd\u52a0\u5229\u4e9a" } - BH { "\u5df4\u6797" } - BI { "\u5e03\u9686\u8fea" } - BJ { "\u8d1d\u5b81" } - BM { "\u767e\u6155\u5927" } - BN { "\u6587\u83b1" } - BO { "\u73bb\u5229\u7ef4\u4e9a" } - BR { "\u5df4\u897f" } - BS { "\u5df4\u54c8\u9a6c" } - BT { "\u4e0d\u4e39" } - BV { "\u5e03\u7ef4\u7279\u5c9b" } - BW { "\u535a\u8328\u74e6\u7eb3" } - BY { "\u767d\u4fc4\u7f57\u65af" } - BZ { "\u4f2f\u5229\u5179" } - CA { "\u52a0\u62ff\u5927" } - CC { "\u79d1\u79d1\u65af\u7fa4\u5c9b" } - CD { "\u521a\u679c\u6c11\u4e3b\u5171\u548c\u56fd" } - CF { "\u4e2d\u975e\u5171\u548c\u56fd" } - CG { "\u521a\u679c" } - CH { "\u745e\u58eb" } - CI { "\u8c61\u7259\u6d77\u5cb8" } - CK { "\u5e93\u514b\u7fa4\u5c9b" } - CL { "\u667a\u5229" } - CM { "\u5580\u9ea6\u9686" } - CN { "\u4e2d\u56fd" } // From the JDK and translation center - //CN { "\u4e2d\u534e\u4eba\u6c11\u5171\u548c\u56fd" } // Old value - CO { "\u54e5\u4f26\u6bd4\u4e9a" } - CR { "\u54e5\u65af\u8fbe\u9ece\u52a0" } - CU { "\u53e4\u5df4" } - CV { "\u4f5b\u5f97\u89d2" } - CX { "\u5723\u8bde\u5c9b" } - CY { "\u585e\u6d66\u8def\u65af" } - CZ { "\u6377\u514b\u5171\u548c\u56fd" } - DE { "\u5fb7\u56fd" } - DJ { "\u5409\u5e03\u63d0" } - DK { "\u4e39\u9ea6" } - DM { "\u591a\u7c73\u5c3c\u52a0\u5c98" } - DO { "\u591a\u7c73\u5c3c\u52a0\u5171\u548c\u56fd" } - DZ { "\u963f\u5c14\u53ca\u5229\u4e9a" } - EC { "\u5384\u74dc\u591a\u5c14" } - EE { "\u7231\u6c99\u5c3c\u4e9a" } - EG { "\u57c3\u53ca" } - EH { "\u897f\u6492\u54c8\u62c9" } - ER { "\u5384\u7acb\u7279\u91cc\u4e9a" } - ES { "\u897f\u73ed\u7259" } - ET { "\u57c3\u585e\u4fc4\u6bd4\u4e9a" } - FI { "\u82ac\u5170" } - FJ { "\u6590\u6d4e" } - FK { "\u798f\u514b\u5170\u7fa4\u5c9b" } - FM { "\u5bc6\u514b\u7f57\u5c3c\u897f\u4e9a\u8054\u90a6" } - FO { "\u6cd5\u7f57\u7fa4\u5c9b" } - FR { "\u6cd5\u56fd" } - GA { "\u52a0\u84ec" } - GB { "\u82f1\u56fd" } - GD { "\u683c\u6797\u7eb3\u8fbe" } - GE { "\u683c\u9c81\u5409\u4e9a" } - GF { "\u6cd5\u5c5e\u572d\u4e9a\u90a3" } - GH { "\u52a0\u7eb3" } - GI { "\u76f4\u5e03\u7f57\u9640" } - GL { "\u683c\u9675\u5170" } - GM { "\u5188\u6bd4\u4e9a" } - GN { "\u51e0\u5185\u4e9a" } - GP { "\u74dc\u5fb7\u7f57\u666e\u5c9b" } - GQ { "\u8d64\u9053\u51e0\u5185\u4e9a" } - GR { "\u5e0c\u814a" } - GS { "\u5357\u4f50\u6cbb\u4e9a\u548c\u5357\u4e09\u660e\u6cbb\u7fa4\u5c9b" } - GT { "\u5371\u5730\u9a6c\u62c9" } - GU { "\u5173\u5c9b" } - GW { "\u51e0\u5185\u4e9a\u6bd4\u7ecd" } - GY { "\u572d\u4e9a\u90a3" } - HK { "\u4e2d\u56fd\u9999\u6e2f\u7279\u522b\u884c\u653f\u533a" } - HM { "\u8d6b\u5fb7\u4e0e\u9ea6\u514b\u5510\u7eb3\u7fa4\u5c9b" } - HN { "\u6d2a\u90fd\u62c9\u65af" } - HR { "\u514b\u7f57\u5730\u4e9a" } - HT { "\u6d77\u5730" } - HU { "\u5308\u7259\u5229" } - ID { "\u5370\u5ea6\u5c3c\u897f\u4e9a" } - IE { "\u7231\u5c14\u5170" } - IL { "\u4ee5\u8272\u5217" } - IN { "\u5370\u5ea6" } - IO { "\u82f1\u5c5e\u5370\u5ea6\u6d0b\u9886\u5730" } - IQ { "\u4f0a\u62c9\u514b" } - IR { "\u4f0a\u6717" } - IS { "\u51b0\u5c9b" } - IT { "\u610f\u5927\u5229" } - JM { "\u7259\u4e70\u52a0" } - JO { "\u7ea6\u65e6" } - JP { "\u65e5\u672c" } - KE { "\u80af\u5c3c\u4e9a" } - KG { "\u5409\u5c14\u5409\u514b\u65af\u5766" } - KH { "\u67ec\u57d4\u5be8" } - KI { "\u57fa\u91cc\u5df4\u65af" } - KM { "\u79d1\u6469\u7f57" } - KN { "\u5723\u57fa\u8328\u548c\u5c3c\u7ef4\u65af" } - KP { "\u5317\u671d\u9c9c" } - //KR { "\u5357\u671d\u9c9c" } // Old value - KR { "\u97e9\u56fd" } - KW { "\u79d1\u5a01\u7279" } - KY { "\u5f00\u66fc\u7fa4\u5c9b" } - KZ { "\u54c8\u8428\u514b\u65af\u5766" } - LA { "\u8001\u631d\u4eba\u6c11\u6c11\u4e3b\u5171\u548c\u56fd" } - LB { "\u9ece\u5df4\u5ae9" } - LC { "\u5723\u5362\u897f\u4e9a" } - LI { "\u5217\u652f\u6566\u58eb\u767b" } - LK { "\u65af\u91cc\u5170\u5361" } - LR { "\u5229\u6bd4\u91cc\u4e9a" } - LS { "\u83b1\u7d22\u6258" } - LT { "\u7acb\u9676\u5b9b" } - LU { "\u5362\u68ee\u5821" } - LV { "\u62c9\u8131\u7ef4\u4e9a" } - LY { "\u5229\u6bd4\u4e9a" } - MA { "\u6469\u6d1b\u54e5" } - MC { "\u6469\u7eb3\u54e5" } - MD { "\u6469\u5c14\u591a\u74e6\u5171\u548c\u56fd" } - MG { "\u9a6c\u8fbe\u52a0\u65af\u52a0" } - MH { "\u9a6c\u7ecd\u5c14\u7fa4\u5c9b" } - MK { "\u9a6c\u5176\u987f\u738b\u56fd" } - ML { "\u9a6c\u91cc" } - MM { "\u7f05\u7538" } - MN { "\u8499\u53e4" } - MO { "\u4e2d\u56fd\u6fb3\u95e8\u7279\u522b\u884c\u653f\u533a" } - MP { "\u5317\u9a6c\u91cc\u4e9a\u7eb3\u7fa4\u5c9b" } - MQ { "\u9a6c\u63d0\u5c3c\u514b\u5c9b" } - MR { "\u6bdb\u91cc\u5854\u5c3c\u4e9a" } - MS { "\u8499\u7279\u585e\u62c9\u7fa4\u5c9b" } - MT { "\u9a6c\u8033\u4ed6" } - MU { "\u6bdb\u91cc\u6c42\u65af" } - MV { "\u9a6c\u5c14\u4ee3\u592b" } - MW { "\u9a6c\u62c9\u7ef4" } - MX { "\u58a8\u897f\u54e5" } - MY { "\u9a6c\u6765\u897f\u4e9a" } - MZ { "\u83ab\u6851\u6bd4\u514b" } - NA { "\u7eb3\u7c73\u6bd4\u4e9a" } - NC { "\u65b0\u5580\u91cc\u591a\u5c3c\u4e9a" } - NE { "\u5c3c\u65e5\u5c14" } - NF { "\u8bfa\u798f\u514b\u5c9b" } - NG { "\u5c3c\u65e5\u5229\u4e9a" } - NI { "\u5c3c\u52a0\u62c9\u74dc" } - NL { "\u8377\u5170" } - NO { "\u632a\u5a01" } - NP { "\u5c3c\u6cca\u5c14" } - NR { "\u7459\u9c81" } - NU { "\u7ebd\u57c3" } - NZ { "\u65b0\u897f\u5170" } - OM { "\u963f\u66fc" } - PA { "\u5df4\u62ff\u9a6c" } - PE { "\u79d8\u9c81" } - PF { "\u6cd5\u5c5e\u6ce2\u5229\u5c3c\u897f\u4e9a" } - PG { "\u5df4\u5e03\u4e9a\u65b0\u51e0\u5185\u4e9a" } - PH { "\u83f2\u5f8b\u5bbe" } - PK { "\u5df4\u57fa\u65af\u5766" } - PL { "\u6ce2\u5170" } - PM { "\u5723\u76ae\u57c3\u5c14\u548c\u5bc6\u514b\u9686" } - PN { "\u76ae\u7279\u51ef\u6069" } - PR { "\u6ce2\u591a\u9ece\u5404" } - PS { "\u5df4\u52d2\u65af\u5766\u9886\u571f" } - PT { "\u8461\u8404\u7259" } - PW { "\u5e15\u52b3" } - PY { "\u5df4\u62c9\u572d" } - QA { "\u5361\u5854\u5c14" } - RE { "\u7559\u5c3c\u6c6a" } - RO { "\u7f57\u9a6c\u5c3c\u4e9a" } - RU { "\u4fc4\u7f57\u65af\u8054\u90a6" } - RW { "\u5362\u65fa\u8fbe" } - SA { "\u6c99\u7279\u963f\u62c9\u4f2f" } - SB { "\u6240\u7f57\u95e8\u7fa4\u5c9b" } - SC { "\u585e\u820c\u5c14" } - SD { "\u82cf\u4e39" } - SE { "\u745e\u5178" } - SG { "\u65b0\u52a0\u5761" } - SH { "\u5723\u8d6b\u52d2\u62ff" } - SI { "\u65af\u6d1b\u6587\u5c3c\u4e9a" } - SJ { "\u65af\u74e6\u5c14\u5df4\u7279\u548c\u626c\u9a6c\u5ef6" } - SK { "\u65af\u6d1b\u4f10\u514b" } - SL { "\u585e\u62c9\u5229\u6602" } - SM { "\u5723\u9a6c\u529b\u8bfa" } - SN { "\u585e\u5185\u52a0\u5c14" } - SO { "\u7d22\u9a6c\u91cc" } - SP { "\u585e\u5c14\u7ef4\u4e9a" } - SR { "\u82cf\u91cc\u5357" } - ST { "\u5723\u591a\u7f8e\u548c\u666e\u6797\u897f\u6bd4" } - SV { "\u8428\u5c14\u74e6\u591a" } - SY { "\u53d9\u5229\u4e9a" } - SZ { "\u65af\u5a01\u58eb\u5170" } - TC { "\u7279\u514b\u65af\u548c\u51ef\u79d1\u65af\u7fa4\u5c9b" } - TD { "\u4e4d\u5f97" } - TF { "\u6cd5\u5c5e\u5357\u534a\u7403\u9886\u5730" } - TG { "\u591a\u54e5" } - TH { "\u6cf0\u56fd" } - TJ { "\u5854\u5409\u514b\u65af\u5766" } - TK { "\u6258\u514b\u52b3" } - TL { "\u4e1c\u5e1d\u6c76" } - TM { "\u571f\u5e93\u66fc\u65af\u5766" } - TN { "\u7a81\u5c3c\u65af" } - TO { "\u6c64\u52a0" } - TR { "\u571f\u8033\u5176" } - TT { "\u7279\u7acb\u5c3c\u8fbe\u548c\u591a\u5df4\u54e5" } - TV { "\u56fe\u74e6\u5362" } - TW { "\u53f0\u6e7e" } - TZ { "\u5766\u6851\u5c3c\u4e9a" } - UA { "\u4e4c\u514b\u5170" } - UG { "\u4e4c\u5e72\u8fbe" } - UM { "\u7f8e\u56fd\u8fb9\u8fdc\u5c0f\u5c9b" } - US { "\u7f8e\u56fd" } - UY { "\u4e4c\u62c9\u572d" } - UZ { "\u4e4c\u5179\u522b\u514b\u65af\u5766" } - VA { "\u68b5\u8482\u5188" } - VC { "\u5723\u6587\u68ee\u7279\u548c\u683c\u6797\u7eb3\u4e01\u65af" } - VE { "\u59d4\u5185\u745e\u62c9" } - VG { "\u82f1\u5c5e\u7ef4\u4eac\u7fa4\u5c9b" } - VI { "\u7f8e\u5c5e\u7ef4\u4eac\u7fa4\u5c9b" } - VN { "\u8d8a\u5357" } - VU { "\u74e6\u52aa\u963f\u56fe" } - WF { "\u74e6\u5229\u65af\u548c\u5bcc\u56fe\u7eb3" } - WS { "\u8428\u6469\u4e9a" } - YE { "\u4e5f\u95e8" } - YT { "\u9a6c\u7ea6\u7279" } - YU { "\u5357\u65af\u62c9\u592b" } - ZA { "\u5357\u975e" } - ZM { "\u8d5e\u6bd4\u4e9a" } - ZW { "\u6d25\u5df4\u5e03\u97e6" } - } - DayAbbreviations { - "\u5468\u65E5", - "\u5468\u4E00", - "\u5468\u4E8C", - "\u5468\u4E09", - "\u5468\u56DB", - "\u5468\u4E94", - "\u5468\u516D", - } - DayNames { - "\u661F\u671F\u65E5", - "\u661F\u671F\u4E00", - "\u661F\u671F\u4E8C", - "\u661F\u671F\u4E09", - "\u661F\u671F\u56DB", - "\u661F\u671F\u4E94", - "\u661F\u671F\u516D", - } - Eras { - "\u516C\u5143\u524D", - "\u516C\u5143", - } - Languages { - aa { "\u963f\u6cd5\u6587" } - ab { "\u963f\u5e03\u54c8\u897f\u4e9a\u6587" } - af { "\u5357\u975e\u8377\u5170\u6587" } - am { "\u963f\u59c6\u54c8\u62c9\u6587" } - ar { "\u963f\u62c9\u4f2f\u6587" } - as { "\u963f\u8428\u59c6\u6587" } - ay { "\u827e\u9a6c\u62c9\u6587" } - az { "\u963f\u585e\u62dc\u7586\u6587" } - ba { "\u5df4\u4ec0\u5ba2\u5c14\u6587" } - be { "\u767d\u4fc4\u7f57\u65af\u6587" } - bg { "\u4fdd\u52a0\u5229\u4e9a\u6587" } - bh { "\u6bd4\u54c8\u5c14\u6587" } - bi { "\u6bd4\u65af\u62c9\u9a6c\u6587" } - bn { "\u5b5f\u52a0\u62c9\u6587" } - bo { "\u897f\u85cf\u6587" } - br { "\u5e03\u91cc\u591a\u5c3c\u6587" } - ca { "\u52a0\u6cf0\u7f57\u5c3c\u4e9a\u6587" } - co { "\u79d1\u897f\u5609\u6587" } - cs { "\u6377\u514b\u6587" } - cy { "\u5a01\u5c14\u58eb\u6587" } - da { "\u4e39\u9ea6\u6587" } - de { "\u5fb7\u6587" } - dz { "\u4e0d\u4e39\u6587" } - el { "\u5e0c\u814a\u6587" } - en { "\u82f1\u6587" } - eo { "\u4e16\u754c\u6587" } - es { "\u897f\u73ed\u7259\u6587" } - et { "\u7231\u6c99\u5c3c\u4e9a\u6587" } - eu { "\u5df4\u65af\u514b\u6587" } - fa { "\u6ce2\u65af\u6587" } - fi { "\u82ac\u5170\u6587" } - fj { "\u6590\u6d4e\u6587" } - fo { "\u6cd5\u7f57\u6587" } - fr { "\u6cd5\u6587" } - fy { "\u5f17\u91cc\u65af\u5170\u6587" } - ga { "\u7231\u5c14\u5170\u6587" } - gd { "\u82cf\u683c\u5170- \u76d6\u5c14\u6587" } - gl { "\u52a0\u5229\u897f\u4e9a\u6587" } - gn { "\u74dc\u62c9\u5c3c\u6587" } - gu { "\u53e4\u52a0\u62c9\u63d0\u6587" } - gv { "\u9a6c\u6069\u5c9b\u6587" } //Added according to the root.txt - ha { "\u8c6a\u6492\u6587" } - haw { "\u590f\u5a01\u5937\u6587" } //Added according to the root.txt - he { "\u5e0c\u4f2f\u6765\u6587" } - hi { "\u5370\u5730\u6587" } - hr { "\u514b\u7f57\u5730\u4e9a\u6587" } - hu { "\u5308\u7259\u5229\u6587" } - hy { "\u4e9a\u7f8e\u5c3c\u4e9a\u6587" } - ia { "\u62c9\u4e01\u56fd\u9645\u6587" } - id { "\u5370\u5ea6\u5c3c\u897f\u4e9a\u6587" } - ie { "\u62c9\u4e01\u56fd\u9645\u6587" } - ik { "\u4f9d\u5974\u76ae\u7ef4\u514b\u6587" } - is { "\u51b0\u5c9b\u6587" } - it { "\u610f\u5927\u5229\u6587" } - iu { "\u7231\u65af\u57fa\u6469\u6587" } - ja { "\u65e5\u6587" } - jv { "\u722a\u54c7\u6587" } - ka { "\u683c\u9c81\u5409\u4e9a\u6587" } - kk { "\u54c8\u8428\u514b\u6587" } - kl { "\u683c\u9675\u5170\u6587" } - km { "\u67ec\u57d4\u5be8\u6587" } - kn { "\u57c3\u7eb3\u5fb7\u6587" } - ko { "\u97e9\u6587" } - ks { "\u514b\u4ec0\u7c73\u5c14\u6587" } - ku { "\u5e93\u5c14\u5fb7\u6587" } - kw { "\u51ef\u5c14\u7279\u6587" } //Added according to the root.txt - ky { "\u5409\u5c14\u5409\u65af\u6587" } - la { "\u62c9\u4e01\u6587" } - ln { "\u6797\u52a0\u62c9\u6587" } - lo { "\u8001\u631d\u6587" } - lt { "\u7acb\u9676\u5b9b\u6587" } - lv { "\u62c9\u8131\u7ef4\u4e9a\u6587" } - //lv { "\u62c9\u812b\u7dad\u4e9e\u6587" } // From Loc center. - mg { "\u9a6c\u5c14\u52a0\u4ec0\u6587" } - mi { "\u6bdb\u5229\u6587" } - mk { "\u9a6c\u5176\u987f\u6587" } - ml { "\u9a6c\u6765\u4e9a\u62c9\u59c6\u6587" } - mn { "\u8499\u53e4\u6587" } - mo { "\u6469\u5c14\u591a\u74e6\u6587" } - mr { "\u9a6c\u62c9\u5730\u6587" } - ms { "\u9a6c\u6765\u6587" } - mt { "\u9a6c\u8033\u4ed6\u6587" } - my { "\u7f05\u7538\u6587" } - na { "\u7459\u9c81\u6587" } - nb { "\u632a\u5a01\u535a\u514b\u9a6c\u5c14\u6587" } //Added according to the root.txt - ne { "\u5c3c\u6cca\u5c14\u6587" } - nl { "\u8377\u5170\u6587" } - no { "\u632a\u5a01\u6587" } - nn { "\u632a\u5a01\u5c3c\u8bfa\u65af\u514b\u6587" } //Added according to the root.txt - oc { "\u5965\u897f\u5766\u6587" } - om { "\u963f\u66fc\u6587" } - or { "\u6b27\u91cc\u4e9a\u6587" } - pa { "\u65c1\u906e\u666e\u6587" } - pl { "\u6ce2\u5170\u6587" } - ps { "\u666e\u4ec0\u56fe\u6587" } - pt { "\u8461\u8404\u7259\u6587" } - qu { "\u76d6\u4e18\u4e9a\u6587" } - rm { "\u91cc\u6258\u7f57\u66fc\u65af\u6587" } - rn { "\u57fa\u9686\u8fea\u6587" } - ro { "\u7f57\u9a6c\u5c3c\u4e9a\u6587" } - ru { "\u4fc4\u6587" } - rw { "\u5362\u65fa\u8fbe\u6587" } - sa { "\u68b5\u6587" } - sd { "\u82cf\u4e39\u6587" } - sg { "\u6851\u6208\u6587" } - sh { "\u585e\u6ce2\u5c3c\u65af-\u514b\u7f57\u5730\u4e9a\u6587" } - si { "\u50e7\u4f3d\u7f57\u6587" } - sk { "\u65af\u6d1b\u4f10\u514b\u6587" } - sl { "\u65af\u6d1b\u6587\u5c3c\u4e9a\u6587" } - sm { "\u8428\u6469\u4e9a\u6587" } - sn { "\u585e\u5185\u52a0\u5c14\u6587" } - so { "\u7d22\u9a6c\u91cc\u6587" } - sq { "\u963f\u5c14\u5df4\u5c3c\u4e9a\u6587" } - sr { "\u585e\u5c14\u7ef4\u4e9a\u6587" } - ss { "\u8f9b\u8f9b\u90a3\u63d0\u6587" } - st { "\u585e\u7d22\u6258\u6587" } - su { "\u82cf\u4e39\u6587" } - sv { "\u745e\u5178\u6587" } - sw { "\u65af\u74e6\u5e0c\u91cc\u6587" } - ta { "\u6cf0\u7c73\u5c14\u6587" } - te { "\u6cf0\u5362\u56fa\u6587" } - tg { "\u5854\u5409\u514b\u6587" } - th { "\u6cf0\u6587" } - ti { "\u63d0\u683c\u91cc\u5c3c\u4e9a\u6587" } - tk { "\u571f\u5e93\u66fc\u6587" } - tl { "\u5854\u52a0\u8def\u65cf\u6587" } - tn { "\u7a81\u5c3c\u65af\u6587" } - to { "\u6c64\u52a0\u6587" } - tr { "\u571f\u8033\u5176\u6587" } - ts { "\u7279\u677e\u52a0\u6587" } - tt { "\u9791\u977c\u6587" } - tw { "\u53f0\u6e7e\u6587" } - ug { "\u7ef4\u543e\u5c14\u6587" } - uk { "\u4e4c\u514b\u5170\u6587" } - ur { "\u4e4c\u5c14\u90fd\u6587" } - uz { "\u4e4c\u5179\u522b\u514b\u6587" } - vi { "\u8d8a\u5357\u6587" } - vo { "\u6c83\u62c9\u666e\u514b\u6587" } - wo { "\u6c83\u5c14\u592b\u6587" } - xh { "\u73ed\u56fe\u6587" } - yi { "\u4f9d\u5730\u6587" } - yo { "\u7ea6\u9c81\u5df4\u6587" } - za { "\u85cf\u6587" } - zh { "\u4e2d\u6587" } - zu { "\u7956\u9c81\u6587" } - } - LocaleID:int { 0x04 } -// LocaleString { "zh" } - MonthAbbreviations { - "\u4E00\u6708", - "\u4E8C\u6708", - "\u4E09\u6708", - "\u56DB\u6708", - "\u4E94\u6708", - "\u516D\u6708", - "\u4E03\u6708", - "\u516B\u6708", - "\u4E5D\u6708", - "\u5341\u6708", - "\u5341\u4E00\u6708", - "\u5341\u4E8C\u6708", - } - MonthNames { - "\u4E00\u6708", - "\u4E8C\u6708", - "\u4E09\u6708", - "\u56DB\u6708", - "\u4E94\u6708", - "\u516D\u6708", - "\u4E03\u6708", - "\u516B\u6708", - "\u4E5D\u6708", - "\u5341\u6708", - "\u5341\u4E00\u6708", - "\u5341\u4E8C\u6708", - } -// ShortLanguage { "zho" } - localPatternChars { "GanjkHmsSEDFwWxhKzAe" } - zoneStrings { - { - "Africa/Casablanca", - "GMT", - "GMT", - "GMT", - "GMT", - } - } - LocaleScript:array { "Hani" } - ExemplarCharacters{ - "[\u4E00-\u4E01\u4E03\u4E07-\u4E0E\u4E10-\u4E11\u4E13-\u4E16" - "\u4E18-\u4E1E\u4E22\u4E24-\u4E25\u4E27-\u4E28\u4E2A-\u4E2D" - "\u4E30\u4E32\u4E34\u4E36\u4E38-\u4E3B\u4E3D-\u4E3F" - "\u4E43\u4E45\u4E47-\u4E49\u4E4B-\u4E50\u4E52-\u4E54" - "\u4E56\u4E58-\u4E59\u4E5C-\u4E61\u4E66\u4E69\u4E70-\u4E71" - "\u4E73\u4E7E\u4E86\u4E88-\u4E89\u4E8B-\u4E8F\u4E91-\u4E95" - "\u4E98\u4E9A-\u4E9B\u4E9F-\u4EA2\u4EA4-\u4EA9\u4EAB-\u4EAE" - "\u4EB2-\u4EB3\u4EB5\u4EBA-\u4EBB\u4EBF-\u4EC7\u4EC9-\u4ECB" - "\u4ECD-\u4ECE\u4ED1\u4ED3-\u4ED9\u4EDD-\u4EDF\u4EE1" - "\u4EE3-\u4EE5\u4EE8\u4EEA-\u4EEC\u4EF0\u4EF2-\u4EF3" - "\u4EF5-\u4EF7\u4EFB\u4EFD\u4EFF\u4F01\u4F09-\u4F0A" - "\u4F0D-\u4F11\u4F17-\u4F1B\u4F1E-\u4F20\u4F22\u4F24-\u4F27" - "\u4F2A-\u4F2B\u4F2F-\u4F30\u4F32\u4F34\u4F36\u4F38" - "\u4F3A\u4F3C-\u4F3D\u4F43\u4F46\u4F4D-\u4F51\u4F53" - "\u4F55\u4F57-\u4F60\u4F63-\u4F65\u4F67\u4F69\u4F6C" - "\u4F6F-\u4F70\u4F73-\u4F74\u4F76\u4F7B-\u4F7C\u4F7E-\u4F7F" - "\u4F83-\u4F84\u4F88-\u4F89\u4F8B\u4F8D\u4F8F\u4F91" - "\u4F94\u4F97\u4F9B\u4F9D\u4FA0\u4FA3\u4FA5-\u4FAA" - "\u4FAC\u4FAE-\u4FAF\u4FB5\u4FBF\u4FC3-\u4FC5\u4FCA" - "\u4FCE-\u4FD1\u4FD7-\u4FD8\u4FDA\u4FDC-\u4FDF\u4FE1" - "\u4FE3\u4FE6\u4FE8-\u4FEA\u4FED-\u4FEF\u4FF1\u4FF3" - "\u4FF8\u4FFA\u4FFE\u500C-\u500D\u500F\u5012\u5014" - "\u5018-\u501A\u501C\u501F\u5021\u5025-\u5026\u5028-\u502A" - "\u502C-\u502E\u503A\u503C\u503E\u5043\u5047-\u5048" - "\u504C\u504E-\u504F\u5055\u505A\u505C\u5065\u506C" - "\u5076-\u5077\u507B\u507E-\u5080\u5085\u5088\u508D" - "\u50A3\u50A5\u50A7-\u50A9\u50AC\u50B2\u50BA-\u50BB" - "\u50CF\u50D6\u50DA\u50E6-\u50E7\u50EC-\u50EE\u50F3" - "\u50F5\u50FB\u5106-\u5107\u510B\u5112\u5121\u513F-\u5141" - "\u5143-\u5146\u5148-\u5149\u514B\u514D\u5151\u5154-\u5156" - "\u515A\u515C\u5162\u5165\u5168\u516B-\u516E\u5170-\u5171" - "\u5173-\u5179\u517B-\u517D\u5180-\u5182\u5185\u5188-\u5189" - "\u518C-\u518D\u5192\u5195-\u5197\u5199\u519B-\u519C" - "\u51A0\u51A2\u51A4-\u51A5\u51AB-\u51AC\u51AF-\u51B3" - "\u51B5-\u51B7\u51BB-\u51BD\u51C0\u51C4\u51C6-\u51C7" - "\u51C9\u51CB-\u51CC\u51CF\u51D1\u51DB\u51DD\u51E0-\u51E1" - "\u51E4\u51EB\u51ED\u51EF-\u51F0\u51F3\u51F5-\u51F6" - "\u51F8-\u51FD\u51FF-\u5203\u5206-\u5208\u520A\u520D-\u520E" - "\u5211-\u5212\u5216-\u521B\u521D\u5220\u5224\u5228-\u5229" - "\u522B\u522D-\u522E\u5230\u5233\u5236-\u523B\u523D" - "\u523F-\u5243\u524A\u524C-\u524D\u5250-\u5251\u5254" - "\u5256\u525C\u525E\u5261\u5265\u5267\u5269-\u526A" - "\u526F\u5272\u527D\u527F\u5281-\u5282\u5288\u5290" - "\u5293\u529B\u529D-\u52A3\u52A8-\u52AD\u52B1-\u52B3" - "\u52BE-\u52BF\u52C3\u52C7\u52C9\u52CB\u52D0\u52D2" - "\u52D6\u52D8\u52DF\u52E4\u52F0\u52F9-\u52FA\u52FE-\u5300" - "\u5305-\u5306\u5308\u530D\u530F-\u5310\u5315-\u5317" - "\u5319-\u531A\u531D\u5320-\u5321\u5323\u5326\u532A" - "\u532E\u5339-\u533B\u533E-\u533F\u5341\u5343\u5345" - "\u5347-\u534A\u534E-\u534F\u5351-\u5353\u5355-\u5357" - "\u535A\u535C\u535E-\u5364\u5366-\u5367\u5369\u536B" - "\u536E-\u5371\u5373-\u5375\u5377-\u5378\u537A\u537F" - "\u5382\u5384-\u5386\u5389\u538B-\u538D\u5395\u5398" - "\u539A\u539D\u539F\u53A2-\u53A3\u53A5-\u53A6\u53A8-\u53A9" - "\u53AE\u53B6\u53BB\u53BF\u53C1-\u53C2\u53C8-\u53CD" - "\u53D1\u53D4\u53D6-\u53D9\u53DB\u53DF-\u53E0\u53E3-\u53E6" - "\u53E8-\u53F3\u53F5-\u53F9\u53FB-\u53FD\u5401\u5403-\u5404" - "\u5406\u5408-\u540A\u540C-\u5413\u5415-\u5417\u541B" - "\u541D-\u5421\u5423\u5426-\u5429\u542B-\u542F\u5431-\u5432" - "\u5434-\u5435\u5438-\u5439\u543B-\u543C\u543E\u5440" - "\u5443\u5446\u5448\u544A-\u544B\u5450\u5452-\u5459" - "\u545B-\u545C\u5462\u5464\u5466\u5468\u5471-\u5473" - "\u5475-\u5478\u547B-\u547D\u5480\u5482\u5484\u5486" - "\u548B-\u548C\u548E-\u5490\u5492\u5494-\u5496\u5499-\u549B" - "\u549D\u54A3-\u54A4\u54A6-\u54AD\u54AF\u54B1\u54B3-\u54B4" - "\u54B8\u54BB\u54BD\u54BF-\u54C2\u54C4\u54C6-\u54C9" - "\u54CC-\u54D5\u54D7\u54D9-\u54DA\u54DC-\u54DF\u54E5-\u54EA" - "\u54ED-\u54EE\u54F2-\u54F3\u54FA\u54FC-\u54FD\u54FF" - "\u5501\u5506-\u5507\u5509\u550F-\u5511\u5514\u551B" - "\u5520\u5522-\u5524\u5527\u552A\u552C\u552E-\u5531" - "\u5533\u5537\u553C\u553E-\u553F\u5541\u5543-\u5544" - "\u5546\u5549-\u554A\u5550\u5555-\u5556\u555C\u5561" - "\u5564-\u5567\u556A\u556C-\u556E\u5575-\u5578\u557B-\u557C" - "\u557E\u5580-\u5584\u5587-\u558B\u558F\u5591\u5594" - "\u5598-\u5599\u559C-\u559D\u559F\u55A7\u55B1\u55B3" - "\u55B5\u55B7\u55B9\u55BB\u55BD-\u55BE\u55C4-\u55C5" - "\u55C9\u55CC-\u55CD\u55D1-\u55D4\u55D6\u55DC-\u55DD" - "\u55DF\u55E1\u55E3-\u55E6\u55E8\u55EA-\u55EC\u55EF" - "\u55F2-\u55F3\u55F5\u55F7\u55FD-\u55FE\u5600-\u5601" - "\u5608-\u5609\u560C\u560E-\u560F\u5618\u561B\u561E-\u561F" - "\u5623-\u5624\u5627\u562C-\u562D\u5631-\u5632\u5634" - "\u5636\u5639\u563B\u563F\u564C-\u564E\u5654\u5657-\u5659" - "\u565C\u5662\u5664\u5668-\u566C\u5671\u5676\u567B-\u567C" - "\u5685-\u5686\u568E-\u568F\u5693\u56A3\u56AF\u56B7" - "\u56BC\u56CA\u56D4\u56D7\u56DA-\u56DB\u56DD-\u56E2" - "\u56E4\u56EB\u56ED\u56F0-\u56F1\u56F4-\u56F5\u56F9-\u56FA" - "\u56FD-\u56FF\u5703-\u5704\u5706\u5708-\u570A\u571C" - "\u571F\u5723\u5728-\u572A\u572C-\u5730\u5733\u5739-\u573B" - "\u573E\u5740\u5742\u5747\u574A\u574C-\u5751\u5757" - "\u575A-\u5761\u5764\u5766\u5768-\u576B\u576D\u576F" - "\u5773\u5776-\u5777\u577B-\u577C\u5782-\u5786\u578B-\u578C" - "\u5792-\u5793\u579B\u57A0-\u57A4\u57A6-\u57A7\u57A9" - "\u57AB\u57AD-\u57AE\u57B2\u57B4\u57B8\u57C2-\u57C3" - "\u57CB\u57CE-\u57CF\u57D2\u57D4-\u57D5\u57D8-\u57DA" - "\u57DD\u57DF-\u57E0\u57E4\u57ED\u57EF\u57F4\u57F8-\u57FA" - "\u57FD\u5800\u5802\u5806-\u5807\u580B\u580D\u5811" - "\u5815\u5819\u581E\u5820-\u5821\u5824\u582A\u5830" - "\u5835\u5844\u584C-\u584D\u5851\u5854\u5858\u585E" - "\u5865\u586B-\u586C\u587E\u5880-\u5881\u5883\u5885" - "\u5889\u5892-\u5893\u5899-\u589A\u589E-\u589F\u58A8-\u58A9" - "\u58BC\u58C1\u58C5\u58D1\u58D5\u58E4\u58EB-\u58EC" - "\u58EE\u58F0\u58F3\u58F6\u58F9\u5902\u5904\u5907" - "\u590D\u590F\u5914-\u5916\u5919-\u591A\u591C\u591F" - "\u5924-\u5925\u5927\u5929-\u592B\u592D-\u592F\u5931" - "\u5934\u5937-\u593A\u593C\u5941-\u5942\u5944\u5947-\u5949" - "\u594B\u594E-\u594F\u5951\u5954-\u5958\u595A\u5960" - "\u5962\u5965\u5973-\u5974\u5976\u5978-\u5979\u597D" - "\u5981-\u5984\u5986-\u5988\u598A\u598D\u5992-\u5993" - "\u5996-\u5997\u5999\u599E\u59A3-\u59A5\u59A8-\u59AB" - "\u59AE-\u59AF\u59B2\u59B9\u59BB\u59BE\u59C6\u59CA-\u59CB" - "\u59D0-\u59D4\u59D7-\u59D8\u59DA\u59DC-\u59DD\u59E3" - "\u59E5\u59E8\u59EC\u59F9\u59FB\u59FF\u5A01\u5A03-\u5A09" - "\u5A0C\u5A11\u5A13\u5A18\u5A1C\u5A1F-\u5A20\u5A23" - "\u5A25\u5A29\u5A31-\u5A32\u5A34\u5A36\u5A3C\u5A40" - "\u5A46\u5A49-\u5A4A\u5A55\u5A5A\u5A62\u5A67\u5A6A" - "\u5A74-\u5A77\u5A7A\u5A7F\u5A92\u5A9A-\u5A9B\u5AAA" - "\u5AB2-\u5AB3\u5AB5\u5AB8\u5ABE\u5AC1-\u5AC2\u5AC9" - "\u5ACC\u5AD2\u5AD4\u5AD6\u5AD8\u5ADC\u5AE0-\u5AE1" - "\u5AE3\u5AE6\u5AE9\u5AEB\u5AF1\u5B09\u5B16-\u5B17" - "\u5B32\u5B34\u5B37\u5B40\u5B50-\u5B51\u5B53-\u5B55" - "\u5B57-\u5B5D\u5B5F\u5B62-\u5B66\u5B69-\u5B6A\u5B6C" - "\u5B70-\u5B71\u5B73\u5B75\u5B7A\u5B7D\u5B80-\u5B81" - "\u5B83-\u5B85\u5B87-\u5B89\u5B8B-\u5B8C\u5B8F\u5B93" - "\u5B95\u5B97-\u5B9E\u5BA0-\u5BA6\u5BAA-\u5BAB\u5BB0" - "\u5BB3-\u5BB6\u5BB8-\u5BB9\u5BBD-\u5BBF\u5BC2\u5BC4-\u5BC7" - "\u5BCC\u5BD0\u5BD2-\u5BD3\u5BDD-\u5BDF\u5BE1\u5BE4-\u5BE5" - "\u5BE8\u5BEE\u5BF0\u5BF8-\u5BFC\u5BFF\u5C01\u5C04" - "\u5C06\u5C09-\u5C0A\u5C0F\u5C11\u5C14-\u5C16\u5C18" - "\u5C1A\u5C1C-\u5C1D\u5C22\u5C24-\u5C25\u5C27\u5C2C" - "\u5C31\u5C34\u5C38-\u5C42\u5C45\u5C48-\u5C4B\u5C4E-\u5C51" - "\u5C55\u5C59\u5C5E\u5C60-\u5C61\u5C63\u5C65-\u5C66" - "\u5C6E-\u5C6F\u5C71\u5C79-\u5C7A\u5C7F\u5C81-\u5C82" - "\u5C88\u5C8C-\u5C8D\u5C90-\u5C91\u5C94\u5C96-\u5C9C" - "\u5CA2-\u5CA3\u5CA9\u5CAB-\u5CAD\u5CB1\u5CB3\u5CB5" - "\u5CB7-\u5CB8\u5CBD\u5CBF\u5CC1\u5CC4\u5CCB\u5CD2" - "\u5CD9\u5CE1\u5CE4-\u5CE6\u5CE8\u5CEA\u5CED\u5CF0" - "\u5CFB\u5D02-\u5D03\u5D06-\u5D07\u5D0E\u5D14\u5D16" - "\u5D1B\u5D1E\u5D24\u5D26-\u5D27\u5D29\u5D2D-\u5D2E" - "\u5D34\u5D3D-\u5D3E\u5D47\u5D4A-\u5D4C\u5D58\u5D5B" - "\u5D5D\u5D69\u5D6B-\u5D6C\u5D6F\u5D74\u5D82\u5D99" - "\u5D9D\u5DB7\u5DC5\u5DCD\u5DDB\u5DDD-\u5DDE\u5DE1-\u5DE2" - "\u5DE5-\u5DE9\u5DEB\u5DEE-\u5DEF\u5DF1-\u5DF4\u5DF7" - "\u5DFD-\u5DFE\u5E01-\u5E03\u5E05-\u5E06\u5E08\u5E0C" - "\u5E0F-\u5E11\u5E14-\u5E16\u5E18-\u5E1D\u5E26-\u5E27" - "\u5E2D-\u5E2E\u5E31\u5E37-\u5E38\u5E3B-\u5E3D\u5E42" - "\u5E44-\u5E45\u5E4C\u5E54-\u5E55\u5E5B\u5E5E\u5E61-\u5E62" - "\u5E72-\u5E74\u5E76\u5E78\u5E7A-\u5E7D\u5E7F-\u5E80" - "\u5E84\u5E86-\u5E87\u5E8A-\u5E8B\u5E8F-\u5E91\u5E93-\u5E97" - "\u5E99-\u5E9A\u5E9C\u5E9E-\u5EA0\u5EA5-\u5EA7\u5EAD" - "\u5EB3\u5EB5-\u5EB9\u5EBE\u5EC9-\u5ECA\u5ED1-\u5ED3" - "\u5ED6\u5EDB\u5EE8\u5EEA\u5EF4\u5EF6-\u5EF7\u5EFA" - "\u5EFE-\u5F04\u5F08\u5F0A-\u5F0B\u5F0F\u5F11\u5F13" - "\u5F15\u5F17-\u5F18\u5F1B\u5F1F-\u5F20\u5F25-\u5F27" - "\u5F29-\u5F2A\u5F2D\u5F2F\u5F31\u5F39-\u5F3A\u5F3C" - "\u5F40\u5F50\u5F52-\u5F53\u5F55-\u5F58\u5F5D\u5F61-\u5F62" - "\u5F64\u5F66\u5F69-\u5F6A\u5F6C-\u5F6D\u5F70-\u5F71" - "\u5F73\u5F77\u5F79\u5F7B-\u5F7C\u5F80-\u5F82\u5F84-\u5F85" - "\u5F87-\u5F8C\u5F90\u5F92\u5F95\u5F97-\u5F99\u5F9C" - "\u5FA1\u5FA8\u5FAA\u5FAD-\u5FAE\u5FB5\u5FB7\u5FBC-\u5FBD" - "\u5FC3-\u5FC6\u5FC9\u5FCC-\u5FCD\u5FCF-\u5FD2\u5FD6-\u5FD9" - "\u5FDD\u5FE0-\u5FE1\u5FE4\u5FE7\u5FEA-\u5FEB\u5FED-\u5FEE" - "\u5FF1\u5FF5\u5FF8\u5FFB\u5FFD-\u6006\u600A\u600D-\u600F" - "\u6012\u6014-\u6016\u6019\u601B-\u601D\u6020-\u6021" - "\u6025-\u602B\u602F\u6035\u603B-\u603C\u603F\u6041-\u6043" - "\u604B\u604D\u6050\u6052\u6055\u6059-\u605A\u605D" - "\u6062-\u6064\u6067-\u606D\u606F-\u6070\u6073\u6076" - "\u6078-\u607D\u607F\u6083-\u6084\u6089\u608C-\u608D" - "\u6092\u6094\u6096\u609A-\u609B\u609D\u609F-\u60A0" - "\u60A3\u60A6\u60A8\u60AB-\u60AD\u60AF\u60B1-\u60B2" - "\u60B4\u60B8\u60BB-\u60BC\u60C5-\u60C6\u60CA-\u60CB" - "\u60D1\u60D5\u60D8\u60DA\u60DC-\u60DD\u60DF-\u60E0" - "\u60E6-\u60E9\u60EB-\u60F0\u60F3-\u60F4\u60F6\u60F9-\u60FA" - "\u6100-\u6101\u6106\u6108-\u6109\u610D-\u610F\u6115" - "\u611A\u611F-\u6120\u6123-\u6124\u6126-\u6127\u612B" - "\u613F\u6148\u614A\u614C\u614E\u6151\u6155\u615D" - "\u6162\u6167-\u6168\u6170\u6175\u6177\u618B\u618E" - "\u6194\u619D\u61A7-\u61A9\u61AC\u61B7\u61BE\u61C2" - "\u61C8\u61CA-\u61CB\u61D1-\u61D2\u61D4\u61E6\u61F5" - "\u61FF\u6206\u6208\u620A-\u6212\u6215-\u6218\u621A-\u621B" - "\u621F\u6221-\u6222\u6224-\u6225\u622A\u622C\u622E" - "\u6233-\u6234\u6237\u623D-\u6241\u6243\u6247-\u6249" - "\u624B-\u624E\u6251-\u6254\u6258\u625B\u6263\u6266-\u6267" - "\u6269-\u6270\u6273\u6276\u6279\u627C\u627E-\u6280" - "\u6284\u6289-\u628A\u6291-\u6293\u6295-\u6298\u629A-\u629B" - "\u629F-\u62A2\u62A4-\u62A5\u62A8\u62AB-\u62AC\u62B1" - "\u62B5\u62B9\u62BB-\u62BD\u62BF\u62C2\u62C4-\u62CA" - "\u62CC-\u62CE\u62D0\u62D2-\u62D4\u62D6-\u62DC\u62DF" - "\u62E2-\u62E3\u62E5-\u62E9\u62EC-\u62EF\u62F1\u62F3-\u62F4" - "\u62F6-\u62F7\u62FC-\u62FF\u6301-\u6302\u6307-\u6309" - "\u630E\u6311\u6316\u631A-\u631B\u631D-\u6325\u6328" - "\u632A-\u632B\u632F\u6332\u6339-\u633A\u633D\u6342-\u6343" - "\u6345-\u6346\u6349\u634B-\u6350\u6355\u635E-\u635F" - "\u6361-\u6363\u6367\u6369\u636D-\u636E\u6371\u6376-\u6377" - "\u637A-\u637B\u6380\u6382\u6387-\u638A\u638C\u638E-\u6390" - "\u6392\u6396\u6398\u63A0\u63A2-\u63A3\u63A5\u63A7-\u63AA" - "\u63AC-\u63AE\u63B0\u63B3-\u63B4\u63B7-\u63B8\u63BA" - "\u63BC\u63BE\u63C4\u63C6\u63C9\u63CD-\u63D0\u63D2" - "\u63D6\u63DE\u63E0-\u63E1\u63E3\u63E9-\u63EA\u63ED" - "\u63F2\u63F4\u63F6\u63F8\u63FD\u63FF-\u6402\u6405" - "\u640B-\u640C\u640F-\u6410\u6413-\u6414\u641B-\u641C" - "\u641E\u6420-\u6421\u6426\u642A\u642C-\u642D\u6434" - "\u643A\u643D\u643F\u6441\u6444-\u6448\u644A\u6452" - "\u6454\u6458\u645E\u6467\u6469\u646D\u6478-\u647A" - "\u6482\u6484-\u6485\u6487\u6491-\u6492\u6495-\u6496" - "\u6499\u649E\u64A4\u64A9\u64AC-\u64AE\u64B0\u64B5" - "\u64B7-\u64B8\u64BA\u64BC\u64C0\u64C2\u64C5\u64CD-\u64CE" - "\u64D0\u64D2\u64D7-\u64D8\u64DE\u64E2\u64E4\u64E6" - "\u6500\u6509\u6512\u6518\u6525\u652B\u652E-\u652F" - "\u6534-\u6536\u6538-\u6539\u653B\u653E-\u653F\u6545" - "\u6548-\u6549\u654C\u654F\u6551\u6555-\u6556\u6559" - "\u655B\u655D-\u655E\u6562-\u6563\u6566\u656B-\u656C" - "\u6570\u6572\u6574\u6577\u6587\u658B-\u658C\u6590-\u6591" - "\u6593\u6597\u6599\u659B-\u659C\u659F\u65A1\u65A4-\u65A5" - "\u65A7\u65A9\u65AB\u65AD\u65AF-\u65B0\u65B9\u65BC-\u65BD" - "\u65C1\u65C3-\u65C6\u65CB-\u65CC\u65CE-\u65CF\u65D2" - "\u65D6-\u65D7\u65E0\u65E2\u65E5-\u65E9\u65EC-\u65F1" - "\u65F6-\u65F7\u65FA\u6600\u6602-\u6603\u6606\u660A" - "\u660C\u660E-\u660F\u6613-\u6615\u6619\u661D\u661F-\u6620" - "\u6625\u6627-\u6628\u662D\u662F\u6631\u6634-\u6636" - "\u663C\u663E\u6641\u6643\u664B-\u664C\u664F\u6652-\u6657" - "\u665A\u665F\u6661\u6664\u6666\u6668\u666E-\u6670" - "\u6674\u6676-\u6677\u667A\u667E\u6682\u6684\u6687" - "\u668C\u6691\u6696-\u6697\u669D\u66A7-\u66A8\u66AE" - "\u66B4\u66B9\u66BE\u66D9\u66DB-\u66DD\u66E6\u66E9" - "\u66F0\u66F2-\u66F4\u66F7\u66F9\u66FC\u66FE-\u6700" - "\u6708-\u670B\u670D\u6710\u6714-\u6715\u6717\u671B" - "\u671D\u671F\u6726\u6728\u672A-\u672D\u672F\u6731" - "\u6734-\u6735\u673A\u673D\u6740\u6742-\u6743\u6746" - "\u6748-\u6749\u674C\u674E-\u6751\u6753\u6756\u675C" - "\u675E-\u6761\u6765\u6768-\u676A\u676D\u676F-\u6770" - "\u6772-\u6773\u6775\u6777\u677C\u677E-\u677F\u6781" - "\u6784\u6787\u6789\u678B\u6790\u6795\u6797-\u6798" - "\u679A\u679C-\u679E\u67A2-\u67A3\u67A5\u67A7-\u67A8" - "\u67AA-\u67AB\u67AD\u67AF-\u67B0\u67B3\u67B5-\u67B8" - "\u67C1\u67C3-\u67C4\u67CF-\u67D4\u67D8-\u67DA\u67DC-\u67DE" - "\u67E0\u67E2\u67E5\u67E9\u67EC\u67EF-\u67F1\u67F3-\u67F4" - "\u67FD\u67FF-\u6800\u6805\u6807-\u680C\u680E-\u680F" - "\u6811\u6813\u6816-\u6817\u681D\u6821\u6829-\u682A" - "\u6832-\u6833\u6837-\u6839\u683C-\u683E\u6840-\u6846" - "\u6848-\u684A\u684C\u684E\u6850-\u6851\u6853-\u6855" - "\u6860-\u6869\u686B\u6874\u6876-\u6877\u6881\u6883" - "\u6885-\u6886\u688F\u6893\u6897\u68A2\u68A6-\u68A8" - "\u68AD\u68AF-\u68B0\u68B3\u68B5\u68C0\u68C2\u68C9" - "\u68CB\u68CD\u68D2\u68D5\u68D8\u68DA\u68E0\u68E3" - "\u68EE\u68F0-\u68F1\u68F5\u68F9-\u68FA\u68FC\u6901" - "\u6905\u690B\u690D-\u690E\u6910\u6912\u691F-\u6920" - "\u6924\u692D\u6930\u6934\u6939\u693D\u693F\u6942" - "\u6954\u6957\u695A\u695D-\u695E\u6960\u6963\u6966" - "\u696B\u696E\u6971\u6977-\u6979\u697C\u6980\u6982" - "\u6984\u6986-\u6989\u698D\u6994-\u6995\u6998\u699B-\u699C" - "\u69A7-\u69A8\u69AB\u69AD\u69B1\u69B4\u69B7\u69BB" - "\u69C1\u69CA\u69CC\u69CE\u69D0\u69D4\u69DB\u69DF-\u69E0" - "\u69ED\u69F2\u69FD\u69FF\u6A0A\u6A17-\u6A18\u6A1F" - "\u6A21\u6A28\u6A2A\u6A2F\u6A31\u6A35\u6A3D-\u6A3E" - "\u6A44\u6A47\u6A50\u6A58-\u6A59\u6A5B\u6A61\u6A65" - "\u6A71\u6A79\u6A7C\u6A80\u6A84\u6A8E\u6A90-\u6A91" - "\u6A97\u6AA0\u6AA9\u6AAB-\u6AAC\u6B20-\u6B24\u6B27" - "\u6B32\u6B37\u6B39-\u6B3A\u6B3E\u6B43\u6B46-\u6B47" - "\u6B49\u6B4C\u6B59\u6B62-\u6B67\u6B6A\u6B79\u6B7B-\u6B7C" - "\u6B81-\u6B84\u6B86-\u6B87\u6B89-\u6B8B\u6B8D\u6B92-\u6B93" - "\u6B96\u6B9A-\u6B9B\u6BA1\u6BAA\u6BB3-\u6BB5\u6BB7" - "\u6BBF\u6BC1-\u6BC2\u6BC5\u6BCB\u6BCD\u6BCF\u6BD2-\u6BD7" - "\u6BD9\u6BDB\u6BE1\u6BEA-\u6BEB\u6BEF\u6BF3\u6BF5" - "\u6BF9\u6BFD\u6C05-\u6C07\u6C0D\u6C0F-\u6C11\u6C13-\u6C16" - "\u6C18-\u6C1B\u6C1F\u6C21-\u6C22\u6C24\u6C26-\u6C2A" - "\u6C2E-\u6C30\u6C32\u6C34-\u6C35\u6C38\u6C3D\u6C40-\u6C42" - "\u6C46-\u6C47\u6C49-\u6C4A\u6C50\u6C54-\u6C55\u6C57" - "\u6C5B-\u6C61\u6C64\u6C68-\u6C6A\u6C70\u6C72\u6C74" - "\u6C76\u6C79\u6C7D-\u6C7E\u6C81-\u6C83\u6C85-\u6C86" - "\u6C88-\u6C89\u6C8C\u6C8F-\u6C90\u6C93-\u6C94\u6C99" - "\u6C9B\u6C9F\u6CA1\u6CA3-\u6CA7\u6CA9-\u6CAB\u6CAD-\u6CAE" - "\u6CB1-\u6CB3\u6CB8-\u6CB9\u6CBB-\u6CBF\u6CC4-\u6CC5" - "\u6CC9-\u6CCA\u6CCC\u6CD0\u6CD3-\u6CD7\u6CDB\u6CDE" - "\u6CE0-\u6CE3\u6CE5\u6CE8\u6CEA-\u6CEB\u6CEE-\u6CF1" - "\u6CF3\u6CF5-\u6CF8\u6CFA-\u6CFE\u6D01\u6D04\u6D07" - "\u6D0B-\u6D0C\u6D0E\u6D12\u6D17\u6D19-\u6D1B\u6D1E" - "\u6D25\u6D27\u6D2A-\u6D2B\u6D2E\u6D31-\u6D33\u6D35" - "\u6D39\u6D3B-\u6D3E\u6D41\u6D43\u6D45-\u6D48\u6D4A-\u6D4B" - "\u6D4D-\u6D4F\u6D51-\u6D54\u6D59-\u6D5A\u6D5C\u6D5E" - "\u6D60\u6D63\u6D66\u6D69-\u6D6A\u6D6E-\u6D6F\u6D74" - "\u6D77-\u6D78\u6D7C\u6D82\u6D85\u6D88-\u6D89\u6D8C" - "\u6D8E\u6D91\u6D93-\u6D95\u6D9B\u6D9D-\u6DA1\u6DA3-\u6DA4" - "\u6DA6-\u6DAB\u6DAE-\u6DAF\u6DB2\u6DB5\u6DB8\u6DBF-\u6DC0" - "\u6DC4-\u6DC7\u6DCB-\u6DCC\u6DD1\u6DD6\u6DD8-\u6DD9" - "\u6DDD-\u6DDE\u6DE0-\u6DE1\u6DE4\u6DE6\u6DEB-\u6DEC" - "\u6DEE\u6DF1\u6DF3\u6DF7\u6DF9\u6DFB-\u6DFC\u6E05" - "\u6E0A\u6E0C-\u6E0E\u6E10-\u6E11\u6E14\u6E16-\u6E17" - "\u6E1A\u6E1D\u6E20-\u6E21\u6E23-\u6E25\u6E29\u6E2B" - "\u6E2D\u6E2F\u6E32\u6E34\u6E38\u6E3A\u6E43-\u6E44" - "\u6E4D-\u6E4E\u6E53-\u6E54\u6E56\u6E58\u6E5B\u6E5F" - "\u6E6B\u6E6E\u6E7E-\u6E7F\u6E83\u6E85-\u6E86\u6E89" - "\u6E8F-\u6E90\u6E98\u6E9C\u6E9F\u6EA2\u6EA5\u6EA7" - "\u6EAA\u6EAF\u6EB1-\u6EB2\u6EB4\u6EB6-\u6EB7\u6EBA-\u6EBB" - "\u6EBD\u6EC1-\u6EC2\u6EC7\u6ECB\u6ECF\u6ED1\u6ED3-\u6ED5" - "\u6ED7\u6EDA\u6EDE-\u6EE2\u6EE4-\u6EE6\u6EE8-\u6EE9" - "\u6EF4\u6EF9\u6F02\u6F06\u6F09\u6F0F\u6F13-\u6F15" - "\u6F20\u6F24\u6F29-\u6F2B\u6F2D\u6F2F\u6F31\u6F33" - "\u6F36\u6F3E\u6F46-\u6F47\u6F4B\u6F4D\u6F58\u6F5C" - "\u6F5E\u6F62\u6F66\u6F6D-\u6F6E\u6F72\u6F74\u6F78" - "\u6F7A\u6F7C\u6F84\u6F88-\u6F89\u6F8C-\u6F8E\u6F9C" - "\u6FA1\u6FA7\u6FB3\u6FB6\u6FB9\u6FC0\u6FC2\u6FC9" - "\u6FD1-\u6FD2\u6FDE\u6FE0-\u6FE1\u6FEE-\u6FEF\u7011" - "\u701A-\u701B\u7023\u7035\u7039\u704C\u704F\u705E" - "\u706B-\u706D\u706F-\u7070\u7075-\u7076\u7078\u707C" - "\u707E-\u7080\u7085\u7089-\u708A\u708E\u7092\u7094-\u7096" - "\u7099\u709C-\u709D\u70AB-\u70AF\u70B1\u70B3\u70B7-\u70B9" - "\u70BB-\u70BD\u70C0-\u70C3\u70C8\u70CA\u70D8-\u70D9" - "\u70DB\u70DF\u70E4\u70E6-\u70E9\u70EB-\u70ED\u70EF" - "\u70F7\u70F9\u70FD\u7109-\u710A\u7110\u7113\u7115-\u7116" - "\u7118-\u711A\u7126\u712F-\u7131\u7136\u7145\u714A" - "\u714C\u714E\u715C\u715E\u7164\u7166-\u7168\u716E" - "\u7172-\u7173\u7178\u717A\u717D\u7184\u718A\u718F" - "\u7194\u7198-\u7199\u719F-\u71A0\u71A8\u71AC\u71B3" - "\u71B5\u71B9\u71C3\u71CE\u71D4-\u71D5\u71E0\u71E5" - "\u71E7\u71EE\u71F9\u7206\u721D\u7228\u722A\u722C" - "\u7230-\u7231\u7235-\u7239\u723B\u723D\u723F\u7247-\u7248" - "\u724C-\u724D\u7252\u7256\u7259\u725B\u725D\u725F" - "\u7261-\u7262\u7266-\u7267\u7269\u726E-\u726F\u7272" - "\u7275\u7279-\u727A\u727E-\u7281\u7284\u728A-\u728B" - "\u728D\u728F\u7292\u729F\u72AC-\u72AD\u72AF-\u72B0" - "\u72B4\u72B6-\u72B9\u72C1-\u72C4\u72C8\u72CD-\u72CE" - "\u72D0\u72D2\u72D7\u72D9\u72DE\u72E0-\u72E1\u72E8-\u72E9" - "\u72EC-\u72F4\u72F7-\u72F8\u72FA-\u72FC\u7301\u7303" - "\u730A\u730E\u7313\u7315-\u7317\u731B-\u731E\u7321-\u7322" - "\u7325\u7329-\u732C\u732E\u7331\u7334\u7337-\u7339" - "\u733E-\u733F\u734D\u7350\u7352\u7357\u7360\u736C-\u736D" - "\u736F\u737E\u7384\u7387\u7389\u738B\u738E\u7391" - "\u7396\u739B\u739F\u73A2\u73A9\u73AB\u73AE-\u73B0" - "\u73B2-\u73B3\u73B7\u73BA-\u73BB\u73C0\u73C2\u73C8-\u73CA" - "\u73CD\u73CF-\u73D1\u73D9\u73DE\u73E0\u73E5\u73E7" - "\u73E9\u73ED\u73F2\u7403\u7405-\u7406\u7409-\u740A" - "\u740F-\u7410\u741A-\u741B\u7422\u7425-\u7426\u7428" - "\u742A\u742C\u742E\u7430\u7433-\u7436\u743C\u7441" - "\u7455\u7457\u7459-\u745C\u745E-\u745F\u746D\u7470" - "\u7476-\u7477\u747E\u7480-\u7481\u7483\u7487\u748B" - "\u748E\u7490\u749C\u749E\u74A7-\u74A9\u74BA\u74D2" - "\u74DC\u74DE\u74E0\u74E2-\u74E4\u74E6\u74EE-\u74EF" - "\u74F4\u74F6-\u74F7\u74FF\u7504\u750D\u750F\u7511" - "\u7513\u7518-\u751A\u751C\u751F\u7525\u7528-\u7529" - "\u752B-\u752D\u752F-\u7533\u7535\u7537-\u7538\u753A-\u753B" - "\u753E\u7540\u7545\u7548\u754B-\u754C\u754E-\u754F" - "\u7554\u7559-\u755C\u7565-\u7566\u756A\u7572\u7574" - "\u7578-\u7579\u757F\u7583\u7586\u758B\u758F\u7591-\u7592" - "\u7594\u7596-\u7597\u7599-\u759A\u759D\u759F-\u75A1" - "\u75A3-\u75A5\u75AB-\u75AC\u75AE-\u75B5\u75B8-\u75B9" - "\u75BC-\u75BE\u75C2-\u75C5\u75C7-\u75CA\u75CD\u75D2" - "\u75D4-\u75D6\u75D8\u75DB\u75DE\u75E2-\u75E4\u75E6-\u75E8" - "\u75EA-\u75EB\u75F0-\u75F1\u75F4\u75F9\u75FC\u75FF-\u7601" - "\u7603\u7605\u760A\u760C\u7610\u7615\u7617-\u7619" - "\u761B\u761F-\u7620\u7622\u7624-\u7626\u7629-\u762B" - "\u762D\u7630\u7633-\u7635\u7638\u763C\u763E-\u7640" - "\u7643\u764C-\u764D\u7654\u7656\u765C\u765E\u7663" - "\u766B\u766F\u7678\u767B\u767D-\u767E\u7682\u7684" - "\u7686-\u7688\u768B\u768E\u7691\u7693\u7696\u7699" - "\u76A4\u76AE\u76B1-\u76B2\u76B4\u76BF\u76C2\u76C5-\u76C6" - "\u76C8\u76CA\u76CD-\u76D2\u76D4\u76D6-\u76D8\u76DB" - "\u76DF\u76E5\u76EE-\u76EF\u76F1-\u76F2\u76F4\u76F8-\u76F9" - "\u76FC\u76FE\u7701\u7704\u7707-\u7709\u770B\u770D" - "\u7719-\u771A\u771F-\u7720\u7722\u7726\u7728-\u7729" - "\u772D\u772F\u7735-\u7738\u773A\u773C\u7740-\u7741" - "\u7743\u7747\u7750-\u7751\u775A-\u775B\u7761-\u7763" - "\u7765-\u7766\u7768\u776B-\u776C\u7779\u777D-\u7780" - "\u7784-\u7785\u778C-\u778E\u7791-\u7792\u779F-\u77A0" - "\u77A2\u77A5\u77A7\u77A9-\u77AA\u77AC\u77B0\u77B3" - "\u77B5\u77BB\u77BD\u77BF\u77CD\u77D7\u77DB-\u77DC" - "\u77E2-\u77E3\u77E5\u77E7\u77E9\u77EB-\u77EE\u77F3" - "\u77F6\u77F8\u77FD-\u7802\u7809\u780C-\u780D\u7811-\u7812" - "\u7814\u7816-\u7818\u781A\u781C-\u781D\u781F\u7823" - "\u7825-\u7827\u7829\u782C-\u782D\u7830\u7834\u7837-\u783C" - "\u783E\u7840\u7845\u7847\u784C\u784E\u7850\u7852" - "\u7855-\u7857\u785D\u786A-\u786E\u7877\u787C\u7887" - "\u7889\u788C-\u788E\u7891\u7893\u7897-\u7898\u789A-\u789C" - "\u789F\u78A1\u78A3\u78A5\u78A7\u78B0-\u78B4\u78B9" - "\u78BE\u78C1\u78C5\u78C9-\u78CB\u78D0\u78D4-\u78D5" - "\u78D9\u78E8\u78EC\u78F2\u78F4\u78F7\u78FA\u7901" - "\u7905\u7913\u791E\u7924\u7934\u793A-\u793C\u793E" - "\u7940-\u7941\u7946\u7948-\u7949\u7953\u7956-\u7957" - "\u795A-\u7960\u7962\u7965\u7967-\u7968\u796D\u796F" - "\u7977-\u7978\u797A\u7980-\u7981\u7984-\u7985\u798A" - "\u798F\u799A\u79A7\u79B3\u79B9-\u79BB\u79BD-\u79BE" - "\u79C0-\u79C1\u79C3\u79C6\u79C9\u79CB\u79CD\u79D1-\u79D2" - "\u79D5\u79D8\u79DF\u79E3-\u79E4\u79E6-\u79E7\u79E9" - "\u79EB\u79ED\u79EF-\u79F0\u79F8\u79FB\u79FD\u7A00" - "\u7A02-\u7A03\u7A06\u7A0B\u7A0D-\u7A0E\u7A14\u7A17" - "\u7A1A\u7A1E\u7A20\u7A23\u7A33\u7A37\u7A39\u7A3B-\u7A3D" - "\u7A3F\u7A46\u7A51\u7A57\u7A70\u7A74\u7A76-\u7A7A" - "\u7A7F-\u7A81\u7A83-\u7A84\u7A86\u7A88\u7A8D\u7A91-\u7A92" - "\u7A95-\u7A98\u7A9C-\u7A9D\u7A9F-\u7AA0\u7AA5-\u7AA6" - "\u7AA8\u7AAC-\u7AAD\u7AB3\u7ABF\u7ACB\u7AD6\u7AD9" - "\u7ADE-\u7AE0\u7AE3\u7AE5-\u7AE6\u7AED\u7AEF\u7AF9-\u7AFA" - "\u7AFD\u7AFF\u7B03-\u7B04\u7B06\u7B08\u7B0A-\u7B0B" - "\u7B0F\u7B11\u7B14-\u7B15\u7B19\u7B1B\u7B1E\u7B20" - "\u7B24-\u7B26\u7B28\u7B2A-\u7B2C\u7B2E\u7B31\u7B33" - "\u7B38\u7B3A\u7B3C\u7B3E\u7B45\u7B47\u7B49\u7B4B-\u7B4C" - "\u7B4F-\u7B52\u7B54\u7B56\u7B58\u7B5A-\u7B5B\u7B5D" - "\u7B60\u7B62\u7B6E\u7B71-\u7B72\u7B75\u7B77\u7B79" - "\u7B7B\u7B7E\u7B80\u7B85\u7B8D\u7B90\u7B94-\u7B95" - "\u7B97\u7B9C-\u7B9D\u7BA1-\u7BA2\u7BA6-\u7BAD\u7BB1" - "\u7BB4\u7BB8\u7BC1\u7BC6-\u7BC7\u7BCC\u7BD1\u7BD3" - "\u7BD9-\u7BDA\u7BDD\u7BE1\u7BE5-\u7BE6\u7BEA\u7BEE" - "\u7BF1\u7BF7\u7BFC\u7BFE\u7C07\u7C0B-\u7C0C\u7C0F" - "\u7C16\u7C1F\u7C26-\u7C27\u7C2A\u7C38\u7C3F-\u7C41" - "\u7C4D\u7C73-\u7C74\u7C7B-\u7C7D\u7C89\u7C91-\u7C92" - "\u7C95\u7C97-\u7C98\u7C9C-\u7C9F\u7CA2\u7CA4-\u7CA5" - "\u7CAA\u7CAE\u7CB1-\u7CB3\u7CB9\u7CBC-\u7CBE\u7CC1" - "\u7CC5\u7CC7-\u7CC8\u7CCA\u7CCC-\u7CCD\u7CD5-\u7CD7" - "\u7CD9\u7CDC\u7CDF-\u7CE0\u7CE8\u7CEF\u7CF8\u7CFB" - "\u7D0A\u7D20\u7D22\u7D27\u7D2B\u7D2F\u7D6E\u7D77" - "\u7DA6\u7DAE\u7E3B\u7E41\u7E47\u7E82\u7E9B\u7E9F-\u7EAD" - "\u7EAF-\u7EB3\u7EB5-\u7EBA\u7EBD-\u7ED5\u7ED7-\u7EE3" - "\u7EE5-\u7EEB\u7EED-\u7EF8\u7EFA-\u7F09\u7F0B-\u7F0F" - "\u7F11-\u7F1D\u7F1F-\u7F36\u7F38\u7F3A\u7F42\u7F44-\u7F45" - "\u7F50-\u7F51\u7F54-\u7F55\u7F57-\u7F58\u7F5A\u7F5F" - "\u7F61-\u7F62\u7F68-\u7F6A\u7F6E\u7F71-\u7F72\u7F74" - "\u7F79\u7F7E\u7F81\u7F8A\u7F8C\u7F8E\u7F94\u7F9A" - "\u7F9D-\u7F9F\u7FA1\u7FA4\u7FA7\u7FAF-\u7FB0\u7FB2" - "\u7FB8-\u7FB9\u7FBC-\u7FBD\u7FBF\u7FC1\u7FC5\u7FCA" - "\u7FCC\u7FCE\u7FD4-\u7FD5\u7FD8\u7FDF-\u7FE1\u7FE5-\u7FE6" - "\u7FE9\u7FEE\u7FF0-\u7FF1\u7FF3\u7FFB-\u7FFC\u8000-\u8001" - "\u8003-\u8006\u800B-\u800D\u8010\u8012\u8014-\u8019" - "\u801C\u8020\u8022\u8025-\u802A\u8031\u8033\u8035-\u8038" - "\u803B\u803D\u803F\u8042-\u8043\u8046\u804A-\u804D" - "\u8052\u8054\u8058\u805A\u8069-\u806A\u8071\u807F-\u8080" - "\u8083-\u8084\u8086-\u8087\u8089\u808B-\u808C\u8093" - "\u8096\u8098\u809A-\u809D\u809F-\u80A2\u80A4-\u80A5" - "\u80A9-\u80AB\u80AD-\u80AF\u80B1-\u80B2\u80B4\u80B7" - "\u80BA\u80BC-\u80C4\u80C6\u80CC-\u80CE\u80D6-\u80D7" - "\u80D9-\u80DE\u80E1\u80E4-\u80E5\u80E7-\u80ED\u80EF-\u80F4" - "\u80F6\u80F8\u80FA\u80FC-\u80FD\u8102\u8106\u8109-\u810A" - "\u810D-\u8114\u8116\u8118\u811A\u811E\u812C\u812F" - "\u8131-\u8132\u8136\u8138\u813E\u8146\u8148\u814A-\u814C" - "\u8150-\u8151\u8153-\u8155\u8159-\u815A\u8160\u8165" - "\u8167\u8169\u816D-\u816E\u8170-\u8171\u8174\u8179-\u8180" - "\u8182\u8188\u818A\u818F\u8191\u8198\u819B-\u819D" - "\u81A3\u81A6\u81A8\u81AA\u81B3\u81BA-\u81BB\u81C0-\u81C3" - "\u81C6\u81CA\u81CC\u81E3\u81E7\u81EA\u81EC-\u81ED" - "\u81F3-\u81F4\u81FB-\u81FC\u81FE\u8200-\u8202\u8204-\u8206" - "\u820C-\u820D\u8210\u8212\u8214\u821B-\u821C\u821E-\u821F" - "\u8221-\u8223\u8228\u822A-\u822D\u822F-\u8231\u8233-\u8239" - "\u823B\u823E\u8244\u8247\u8249\u824B\u824F\u8258" - "\u825A\u825F\u8268\u826E-\u8270\u8272-\u8274\u8279-\u827A" - "\u827D-\u827F\u8282\u8284\u8288\u828A-\u828B\u828D-\u828F" - "\u8291-\u8292\u8297-\u8299\u829C-\u829D\u829F\u82A1" - "\u82A4-\u82A6\u82A8-\u82B1\u82B3-\u82B4\u82B7-\u82B9" - "\u82BD-\u82BE\u82C1\u82C4\u82C7-\u82C8\u82CA-\u82CF" - "\u82D1-\u82D5\u82D7-\u82D8\u82DB-\u82DC\u82DE-\u82E1" - "\u82E3-\u82E6\u82EB\u82EF\u82F1\u82F4\u82F7\u82F9" - "\u82FB\u8301-\u8309\u830C\u830E-\u830F\u8311\u8314-\u8315" - "\u8317\u831A-\u831C\u8327-\u8328\u832B-\u832D\u832F" - "\u8331\u8333-\u8336\u8338-\u833A\u833C\u8340\u8343" - "\u8346-\u8347\u8349\u834F-\u8352\u8354\u835A-\u835C" - "\u835E-\u8361\u8363-\u836F\u8377-\u8378\u837B-\u837D" - "\u8385-\u8386\u8389\u838E\u8392-\u8393\u8398\u839B-\u839C" - "\u839E\u83A0\u83A8-\u83AB\u83B0-\u83B4\u83B6-\u83BA" - "\u83BC-\u83BD\u83C0-\u83C1\u83C5\u83C7\u83CA\u83CC" - "\u83CF\u83D4\u83D6\u83D8\u83DC-\u83DD\u83DF-\u83E1" - "\u83E5\u83E9-\u83EA\u83F0-\u83F2\u83F8-\u83F9\u83FD" - "\u8401\u8403-\u8404\u8406\u840B-\u840F\u8411\u8418" - "\u841C-\u841D\u8424-\u8428\u8431\u8438\u843C-\u843D" - "\u8446\u8451\u8457\u8459-\u845C\u8461\u8463\u8469" - "\u846B-\u846D\u8471\u8473\u8475-\u8476\u8478\u847A" - "\u8482\u8487-\u8489\u848B-\u848C\u848E\u8497\u8499" - "\u849C\u84A1\u84AF\u84B2\u84B4\u84B8-\u84BA\u84BD" - "\u84BF\u84C1\u84C4\u84C9-\u84CA\u84CD\u84D0-\u84D1" - "\u84D3\u84D6\u84DD\u84DF-\u84E0\u84E3\u84E5-\u84E6" - "\u84EC\u84F0\u84FC\u84FF\u850C\u8511\u8513\u8517" - "\u851A\u851F\u8521\u852B-\u852C\u8537-\u853D\u8543" - "\u8548-\u854A\u8556\u8559\u855E\u8564\u8568\u8572" - "\u8574\u8579-\u857B\u857E\u8584-\u8585\u8587\u858F" - "\u859B-\u859C\u85A4\u85A8\u85AA\u85AE-\u85B0\u85B7" - "\u85B9\u85C1\u85C9\u85CF-\u85D0\u85D3\u85D5\u85DC" - "\u85E4\u85E9\u85FB\u85FF\u8605\u8611\u8616\u8627" - "\u8629\u8638\u863C\u864D-\u8651\u8654\u865A\u865E" - "\u8662\u866B-\u866C\u866E\u8671\u8679-\u8682\u868A-\u868D" - "\u8693\u8695\u869C-\u869D\u86A3-\u86A4\u86A7-\u86AA" - "\u86AC\u86AF-\u86B1\u86B4-\u86B6\u86BA\u86C0\u86C4" - "\u86C6-\u86C7\u86C9-\u86CB\u86CE-\u86D1\u86D4\u86D8-\u86D9" - "\u86DB\u86DE-\u86DF\u86E4\u86E9\u86ED-\u86EE\u86F0-\u86F4" - "\u86F8-\u86F9\u86FE\u8700\u8702-\u8703\u8707-\u870A" - "\u870D\u8712-\u8713\u8715\u8717-\u8718\u871A\u871C" - "\u871E\u8721-\u8723\u8725\u8729\u872E\u8731\u8734" - "\u8737\u873B\u873E-\u873F\u8747-\u8749\u874C\u874E" - "\u8753\u8757\u8759\u8760\u8763-\u8765\u876E\u8770" - "\u8774\u8776\u877B-\u877E\u8782-\u8783\u8785\u8788" - "\u878B\u878D\u8793\u8797\u879F\u87A8\u87AB-\u87AD" - "\u87AF\u87B3\u87B5\u87BA\u87BD\u87C0\u87C6\u87CA-\u87CB" - "\u87D1-\u87D3\u87DB\u87E0\u87E5\u87EA\u87EE\u87F9" - "\u87FE\u8803\u880A\u8813\u8815-\u8816\u881B\u8821-\u8822" - "\u8832\u8839\u883C\u8840\u8844-\u8845\u884C-\u884D" - "\u8854\u8857\u8859\u8861-\u8865\u8868-\u8869\u886B-\u886C" - "\u886E\u8870\u8872\u8877\u887D-\u887F\u8881-\u8882" - "\u8884-\u8885\u8888\u888B\u888D\u8892\u8896\u889C" - "\u88A2\u88A4\u88AB\u88AD\u88B1\u88B7\u88BC\u88C1-\u88C2" - "\u88C5-\u88C6\u88C9\u88CE\u88D2\u88D4-\u88D5\u88D8-\u88D9" - "\u88DF\u88E2-\u88E5\u88E8\u88F0-\u88F1\u88F3-\u88F4" - "\u88F8-\u88F9\u88FC\u88FE\u8902\u890A\u8910\u8912-\u8913" - "\u8919-\u891B\u8921\u8925\u892A-\u892B\u8930\u8934" - "\u8936\u8941\u8944\u895E-\u895F\u8966\u897B\u897F" - "\u8981\u8983\u8986\u89C1-\u89C2\u89C4-\u89CC\u89CE-\u89D2" - "\u89D6\u89DA\u89DC\u89DE\u89E3\u89E5-\u89E6\u89EB" - "\u89EF\u89F3\u8A00\u8A07\u8A3E\u8A48\u8A79\u8A89-\u8A8A" - "\u8A93\u8B07\u8B26\u8B66\u8B6C\u8BA0-\u8BAB\u8BAD-\u8BB0" - "\u8BB2-\u8BBA\u8BBC-\u8BC6\u8BC8-\u8BCF\u8BD1-\u8BE9" - "\u8BEB-\u8C08\u8C0A-\u8C1D\u8C1F-\u8C37\u8C41\u8C46-\u8C47" - "\u8C49\u8C4C\u8C55\u8C5A\u8C61-\u8C62\u8C6A-\u8C6B" - "\u8C73\u8C78-\u8C7A\u8C82\u8C85\u8C89-\u8C8A\u8C8C" - "\u8C94\u8C98\u8D1D-\u8D1F\u8D21-\u8D50\u8D53-\u8D56" - "\u8D58-\u8D5E\u8D60-\u8D64\u8D66-\u8D67\u8D6B\u8D6D" - "\u8D70\u8D73-\u8D77\u8D81\u8D84-\u8D85\u8D8A-\u8D8B" - "\u8D91\u8D94\u8D9F\u8DA3\u8DB1\u8DB3-\u8DB5\u8DB8" - "\u8DBA\u8DBC\u8DBE-\u8DBF\u8DC3-\u8DC4\u8DC6\u8DCB-\u8DCC" - "\u8DCE-\u8DCF\u8DD1\u8DD6-\u8DD7\u8DDA-\u8DDB\u8DDD-\u8DDF" - "\u8DE3-\u8DE4\u8DE8\u8DEA-\u8DEC\u8DEF\u8DF3\u8DF5" - "\u8DF7-\u8DFB\u8DFD\u8E05\u8E09-\u8E0A\u8E0C\u8E0F" - "\u8E14\u8E1D-\u8E1F\u8E22-\u8E23\u8E29-\u8E2A\u8E2C" - "\u8E2E-\u8E2F\u8E31\u8E35\u8E39-\u8E3A\u8E3D\u8E40-\u8E42" - "\u8E44\u8E47-\u8E4B\u8E51-\u8E52\u8E59\u8E66\u8E69" - "\u8E6C-\u8E6D\u8E6F-\u8E70\u8E72\u8E74\u8E76\u8E7C" - "\u8E7F\u8E81\u8E85\u8E87\u8E8F-\u8E90\u8E94\u8E9C" - "\u8E9E\u8EAB-\u8EAC\u8EAF\u8EB2\u8EBA\u8ECE\u8F66-\u8F69" - "\u8F6B-\u8F7F\u8F81-\u8F8B\u8F8D-\u8F91\u8F93-\u8F9C" - "\u8F9E-\u8F9F\u8FA3\u8FA8-\u8FA9\u8FAB\u8FB0-\u8FB1" - "\u8FB6\u8FB9\u8FBD-\u8FBE\u8FC1-\u8FC2\u8FC4-\u8FC5" - "\u8FC7-\u8FC8\u8FCE\u8FD0-\u8FD1\u8FD3-\u8FD5\u8FD8-\u8FD9" - "\u8FDB-\u8FDF\u8FE2\u8FE4-\u8FE6\u8FE8-\u8FEB\u8FED-\u8FEE" - "\u8FF0\u8FF3\u8FF7-\u8FF9\u8FFD\u9000-\u9006\u9009-\u900B" - "\u900D\u900F-\u9012\u9014\u9016-\u9017\u901A-\u901B" - "\u901D-\u9022\u9026\u902D-\u902F\u9035-\u9036\u9038" - "\u903B-\u903C\u903E\u9041-\u9042\u9044\u9047\u904D" - "\u904F-\u9053\u9057-\u9058\u905B\u9062-\u9063\u9065" - "\u9068\u906D-\u906E\u9074-\u9075\u907D\u907F-\u9080" - "\u9082-\u9083\u9088\u908B\u9091\u9093\u9095\u9097" - "\u9099\u909B\u909D\u90A1-\u90A3\u90A6\u90AA\u90AC" - "\u90AE-\u90B1\u90B3-\u90B6\u90B8-\u90BB\u90BE\u90C1" - "\u90C4-\u90C5\u90C7\u90CA\u90CE-\u90D1\u90D3\u90D7" - "\u90DB-\u90DD\u90E1-\u90E2\u90E6-\u90E8\u90EB\u90ED" - "\u90EF\u90F4\u90F8\u90FD-\u90FE\u9102\u9104\u9119" - "\u911E\u9122-\u9123\u912F\u9131\u9139\u9143\u9146" - "\u9149-\u9150\u9152\u9157\u915A\u915D-\u915E\u9161-\u9165" - "\u9169-\u916A\u916C\u916E-\u9172\u9174-\u9179\u917D-\u917F" - "\u9185\u9187\u9189\u918B-\u918D\u9190-\u9192\u919A-\u919B" - "\u91A2-\u91A3\u91AA\u91AD-\u91AF\u91B4-\u91B5\u91BA" - "\u91C7\u91C9-\u91CA\u91CC-\u91CF\u91D1\u91DC\u9274" - "\u928E\u92AE\u92C8\u933E\u936A\u938F\u93CA\u93D6" - "\u943E\u946B\u9485-\u9490\u9492-\u9495\u9497\u9499-\u94C6" - "\u94C8-\u94CE\u94D0-\u94D2\u94D5-\u94D9\u94DB-\u94E5" - "\u94E7-\u94FA\u94FC-\u951B\u951D-\u951F\u9521-\u9526" - "\u9528-\u9532\u9534-\u953C\u953E-\u9542\u9544-\u9547" - "\u9549-\u954A\u954C-\u9554\u9556-\u9559\u955B-\u955F" - "\u9561-\u956D\u956F-\u9573\u9576\u957F\u95E8-\u95EB" - "\u95ED-\u95FE\u9600-\u9606\u9608-\u9612\u9614-\u9617" - "\u9619-\u961A\u961C-\u961D\u961F\u9621-\u9622\u962A" - "\u962E\u9631-\u9636\u963B-\u963D\u963F-\u9640\u9642" - "\u9644-\u9649\u964B-\u964D\u9650\u9654-\u9655\u965B" - "\u965F\u9661-\u9662\u9664\u9667-\u966A\u966C\u9672" - "\u9674-\u9677\u9685-\u9686\u9688\u968B\u968D\u968F-\u9690" - "\u9694\u9697-\u9699\u969C\u96A7\u96B0\u96B3\u96B6" - "\u96B9\u96BC-\u96BE\u96C0-\u96C1\u96C4-\u96C7\u96C9" - "\u96CC-\u96CF\u96D2\u96D5\u96E0\u96E8-\u96EA\u96EF" - "\u96F3\u96F6-\u96F7\u96F9\u96FE\u9700-\u9701\u9704" - "\u9706-\u9709\u970D-\u970F\u9713\u9716\u971C\u971E" - "\u972A\u972D\u9730\u9732\u9738-\u9739\u973E\u9752-\u9753" - "\u9756\u9759\u975B\u975E\u9760-\u9762\u9765\u9769" - "\u9773-\u9774\u9776\u977C\u9785\u978B\u978D\u9791-\u9792" - "\u9794\u9798\u97A0\u97A3\u97AB\u97AD\u97AF\u97B2" - "\u97B4\u97E6-\u97E7\u97E9-\u97ED\u97F3\u97F5-\u97F6" - "\u9875-\u988A\u988C-\u988D\u988F-\u9891\u9893-\u9894" - "\u9896-\u9898\u989A-\u98A2\u98A4-\u98A7\u98CE\u98D1-\u98D3" - "\u98D5\u98D8-\u98DA\u98DE-\u98DF\u98E7-\u98E8\u990D" - "\u9910\u992E\u9954-\u9955\u9963\u9965\u9967-\u9972" - "\u9974-\u9977\u997A\u997C-\u997D\u997F-\u9981\u9984-\u9988" - "\u998A-\u998B\u998D\u998F-\u9999\u99A5\u99A8\u9A6C-\u9A71" - "\u9A73-\u9A82\u9A84-\u9A88\u9A8A-\u9A8C\u9A8F-\u9A93" - "\u9A96-\u9A98\u9A9A-\u9AA5\u9AA7-\u9AA8\u9AB0-\u9AB1" - "\u9AB6-\u9AB8\u9ABA\u9ABC\u9AC0-\u9AC2\u9AC5\u9ACB-\u9ACC" - "\u9AD1\u9AD3\u9AD8\u9ADF\u9AE1\u9AE6\u9AEB\u9AED" - "\u9AEF\u9AF9\u9AFB\u9B03\u9B08\u9B0F\u9B13\u9B1F" - "\u9B23\u9B2F\u9B32\u9B3B-\u9B3C\u9B41-\u9B45\u9B47-\u9B49" - "\u9B4D\u9B4F\u9B51\u9B54\u9C7C\u9C7F\u9C81-\u9C82" - "\u9C85-\u9C88\u9C8B\u9C8D-\u9C8E\u9C90-\u9C92\u9C94-\u9C95" - "\u9C9A-\u9C9C\u9C9E-\u9CA9\u9CAB\u9CAD-\u9CAE\u9CB0-\u9CB8" - "\u9CBA-\u9CBD\u9CC3-\u9CC7\u9CCA-\u9CD0\u9CD3-\u9CD9" - "\u9CDC-\u9CDF\u9CE2\u9E1F-\u9E23\u9E25-\u9E26\u9E28-\u9E2D" - "\u9E2F\u9E31-\u9E33\u9E35-\u9E3A\u9E3D-\u9E3F\u9E41-\u9E4C" - "\u9E4E-\u9E4F\u9E51\u9E55\u9E57-\u9E58\u9E5A-\u9E5C" - "\u9E5E\u9E63-\u9E64\u9E66-\u9E6D\u9E70-\u9E71\u9E73" - "\u9E7E-\u9E7F\u9E82\u9E87-\u9E88\u9E8B\u9E92-\u9E93" - "\u9E9D\u9E9F\u9EA6\u9EB4\u9EB8\u9EBB\u9EBD-\u9EBE" - "\u9EC4\u9EC9\u9ECD-\u9ECF\u9ED1\u9ED4\u9ED8\u9EDB-\u9EDD" - "\u9EDF-\u9EE0\u9EE2\u9EE5\u9EE7\u9EE9-\u9EEA\u9EEF" - "\u9EF9\u9EFB-\u9EFC\u9EFE\u9F0B\u9F0D-\u9F0E\u9F10" - "\u9F13\u9F17\u9F19\u9F20\u9F22\u9F2C\u9F2F\u9F37" - "\u9F39\u9F3B\u9F3D-\u9F3E\u9F44\u9F50-\u9F51\u9F7F-\u9F80" - "\u9F83-\u9F8C\u9F99-\u9F9B\u9F9F-\u9FA0]" - } - - // Currency display names - Currencies { - CNY { "\uFFE5", "CNY" } - HKD { "HK$", "HKD" } - JPY { "JPY", "JPY" } - KRW { "\uFFE6", "KRW" } - MOP { "P", "MOP" } - SGD { "S$", "SGD" } - TWD { "NT$", "TWD" } - } -} +// *************************************************************************** +// * +// * Copyright (C) 2005 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/zh.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/zh.xml + */ +zh{ + Countries{ + AD{"安道尔"} + AE{"阿拉伯联合酋长国"} + AF{"阿富汗"} + AG{"安提瓜和巴布达"} + AI{"安圭拉"} + AL{"阿尔巴尼亚"} + AM{"亚美尼亚"} + AN{"荷属安的列斯群岛"} + AO{"安哥拉"} + AQ{"南极洲"} + AR{"阿根廷"} + AS{"美属萨摩亚"} + AT{"奥地利"} + AU{"澳大利亚"} + AW{"阿鲁巴"} + AZ{"阿塞拜疆"} + BA{"波斯尼亚和黑山共和国"} + BB{"巴巴多斯"} + BD{"孟加拉国"} + BE{"比利时"} + BF{"布基纳法索"} + BG{"保加利亚"} + BH{"巴林"} + BI{"布隆迪"} + BJ{"贝宁"} + BM{"百慕大"} + BN{"文莱"} + BO{"玻利维亚"} + BR{"巴西"} + BS{"巴哈马"} + BT{"不丹"} + BV{"布维特岛"} + BW{"博茨瓦纳"} + BY{"白俄罗斯"} + BZ{"伯利兹"} + CA{"加拿大"} + CC{"科科斯群岛"} + CD{"刚果民主共和国"} + CF{"中非共和国"} + CG{"刚果"} + CH{"瑞士"} + CI{"象牙海岸"} + CK{"库克群岛"} + CL{"智利"} + CM{"喀麦隆"} + CN{"中国"} + CO{"哥伦比亚"} + CR{"哥斯达黎加"} + CU{"古巴"} + CV{"佛得角"} + CX{"圣诞岛"} + CY{"塞浦路斯"} + CZ{"捷克共和国"} + DE{"德国"} + DJ{"吉布提"} + DK{"丹麦"} + DM{"多米尼加岘"} + DO{"多米尼加共和国"} + DZ{"阿尔及利亚"} + EC{"厄瓜多尔"} + EE{"爱沙尼亚"} + EG{"埃及"} + EH{"西撒哈拉"} + ER{"厄立特里亚"} + ES{"西班牙"} + ET{"埃塞俄比亚"} + FI{"芬兰"} + FJ{"斐济"} + FK{"福克兰群岛"} + FM{"密克罗尼西亚联邦"} + FO{"法罗群岛"} + FR{"法国"} + GA{"加蓬"} + GB{"英国"} + GD{"格林纳达"} + GE{"格鲁吉亚"} + GF{"法属圭亚那"} + GH{"加纳"} + GI{"直布罗陀"} + GL{"格陵兰"} + GM{"冈比亚"} + GN{"几内亚"} + GP{"瓜德罗普岛"} + GQ{"赤道几内亚"} + GR{"希腊"} + GS{"南佐治亚和南三明治群岛"} + GT{"危地马拉"} + GU{"关岛"} + GW{"几内亚比绍"} + GY{"圭亚那"} + HK{"中国香港特别行政区"} + HM{"赫德与麦克唐纳群岛"} + HN{"洪都拉斯"} + HR{"克罗地亚"} + HT{"海地"} + HU{"匈牙利"} + ID{"印度尼西亚"} + IE{"爱尔兰"} + IL{"以色列"} + IN{"印度"} + IO{"英属印度洋领地"} + IQ{"伊拉克"} + IR{"伊朗"} + IS{"冰岛"} + IT{"意大利"} + JM{"牙买加"} + JO{"约旦"} + JP{"日本"} + KE{"肯尼亚"} + KG{"吉尔吉克斯坦"} + KH{"柬埔寨"} + KI{"基里巴斯"} + KM{"科摩罗"} + KN{"圣基茨和尼维斯"} + KP{"北朝鲜"} + KR{"韩国"} + KW{"科威特"} + KY{"开曼群岛"} + KZ{"哈萨克斯坦"} + LA{"老挝人民民主共和国"} + LB{"黎巴嫩"} + LC{"圣卢西亚"} + LI{"列支敦士登"} + LK{"斯里兰卡"} + LR{"利比里亚"} + LS{"莱索托"} + LT{"立陶宛"} + LU{"卢森堡"} + LV{"拉脱维亚"} + LY{"利比亚"} + MA{"摩洛哥"} + MC{"摩纳哥"} + MD{"摩尔多瓦共和国"} + MG{"马达加斯加"} + MH{"马绍尔群岛"} + MK{"马其顿王国"} + ML{"马里"} + MM{"缅甸"} + MN{"蒙古"} + MO{"中国澳门特别行政区"} + MP{"北马里亚纳群岛"} + MQ{"马提尼克岛"} + MR{"毛里塔尼亚"} + MS{"蒙特塞拉群岛"} + MT{"马耳他"} + MU{"毛里求斯"} + MV{"马尔代夫"} + MW{"马拉维"} + MX{"墨西哥"} + MY{"马来西亚"} + MZ{"莫桑比克"} + NA{"纳米比亚"} + NC{"新喀里多尼亚"} + NE{"尼日尔"} + NF{"诺福克岛"} + NG{"尼日利亚"} + NI{"尼加拉瓜"} + NL{"荷兰"} + NO{"挪威"} + NP{"尼泊尔"} + NR{"瑙鲁"} + NU{"纽埃"} + NZ{"新西兰"} + OM{"阿曼"} + PA{"巴拿马"} + PE{"秘鲁"} + PF{"法属波利尼西亚"} + PG{"巴布亚新几内亚"} + PH{"菲律宾"} + PK{"巴基斯坦"} + PL{"波兰"} + PM{"圣皮埃尔和密克隆"} + PN{"皮特凯恩"} + PR{"波多黎各"} + PS{"巴勒斯坦领土"} + PT{"葡萄牙"} + PW{"帕劳"} + PY{"巴拉圭"} + QA{"卡塔尔"} + RE{"留尼汪"} + RO{"罗马尼亚"} + RU{"俄罗斯联邦"} + RW{"卢旺达"} + SA{"沙特阿拉伯"} + SB{"所罗门群岛"} + SC{"塞舌尔"} + SD{"苏丹"} + SE{"瑞典"} + SG{"新加坡"} + SH{"圣赫勒拿"} + SI{"斯洛文尼亚"} + SJ{"斯瓦尔巴特和扬马延"} + SK{"斯洛伐克"} + SL{"塞拉利昂"} + SM{"圣马力诺"} + SN{"塞内加尔"} + SO{"索马里"} + SP{"塞尔维亚"} + SR{"苏里南"} + ST{"圣多美和普林西比"} + SV{"萨尔瓦多"} + SY{"叙利亚"} + SZ{"斯威士兰"} + TC{"特克斯和凯科斯群岛"} + TD{"乍得"} + TF{"法属南半球领地"} + TG{"多哥"} + TH{"泰国"} + TJ{"塔吉克斯坦"} + TK{"托克劳"} + TL{"东帝汶"} + TM{"土库曼斯坦"} + TN{"突尼斯"} + TO{"汤加"} + TR{"土耳其"} + TT{"特立尼达和多巴哥"} + TV{"图瓦卢"} + TW{"台湾"} + TZ{"坦桑尼亚"} + UA{"乌克兰"} + UG{"乌干达"} + UM{"美国边远小岛"} + US{"美国"} + UY{"乌拉圭"} + UZ{"乌兹别克斯坦"} + VA{"梵蒂冈"} + VC{"圣文森特和格林纳丁斯"} + VE{"委内瑞拉"} + VG{"英属维京群岛"} + VI{"美属维京群岛"} + VN{"越南"} + VU{"瓦努阿图"} + WF{"瓦利斯和富图纳"} + WS{"萨摩亚"} + YE{"也门"} + YT{"马约特"} + YU{"南斯拉夫"} + ZA{"南非"} + ZM{"赞比亚"} + ZW{"津巴布韦"} + } + Currencies{ + ADD{ + "ADD", + "安道尔第纳尔元", + } + ADP{ + "ADP", + "安道尔比塞塔元", + } + AED{ + "AED", + "阿联酋迪拉姆", + } + AFA{ + "AFA", + "阿富汗尼 (1927-2002)", + } + AFN{ + "AFN", + "阿富汗尼", + } + AIF{ + "AIF", + "阿发和伊萨法郎", + } + ALK{ + "ALK", + "阿尔巴尼亚列克 (1946-1961)", + } + ALL{ + "ALL", + "阿尔巴尼亚列克", + } + ALV{ + "ALV", + "阿尔巴尼亚列克币", + } + ALX{ + "ALX", + "阿尔巴尼亚元外汇券", + } + AMD{ + "AMD", + "亚美尼亚德拉姆", + } + ANG{ + "ANG", + "荷兰安替兰盾", + } + AOA{ + "AOA", + "安戈拉宽扎", + } + AOK{ + "AOK", + "安戈拉宽扎 (1977-1990)", + } + AON{ + "AON", + "安戈拉新宽扎 (1990-2000)", + } + AOR{ + "AOR", + "安戈拉宽扎 Reajustado (1995-1999)", + } + AOS{ + "AOS", + "安哥拉埃斯库多", + } + ARA{ + "ARA", + "阿根廷奥斯特", + } + ARM{ + "ARM", + "阿根廷比索标准局", + } + ARP{ + "ARP", + "阿根廷比索 (1983-1985)", + } + ARS{ + "ARS", + "阿根廷比索", + } + ATS{ + "ATS", + "奥地利西令", + } + AUD{ + "AUD", + "澳大利亚元", + } + AUP{ + "AUP", + "澳大利亚磅", + } + AWG{ + "AWG", + "阿鲁巴基尔德元", + } + BAD{ + "BAD", + "波士尼亚-赫塞哥维纳第纳尔元", + } + BAM{ + "BAM", + "波士尼亚-赫塞哥维纳兑换券", + } + BAN{ + "BAN", + "波士尼亚-赫塞哥维纳新第纳尔元", + } + BBD{ + "BBD", + "巴巴多斯元", + } + BDT{ + "BDT", + "孟加拉达卡", + } + BEC{ + "BEC", + "比利时法郎兑换券", + } + BEF{ + "BEF", + "比利时法郎", + } + BEL{ + "BEL", + "比利时法郎(金融)", + } + BGL{ + "BGL", + "保加利亚硬列克", + } + BGM{ + "BGM", + "保加利亚社会主义列克", + } + BGN{ + "BGN", + "保加利亚新列克", + } + BGO{ + "BGO", + "保加利亚列克 (1879-1952)", + } + BGX{ + "BGX", + "保加利亚列克外汇券", + } + BHD{ + "BHD", + "巴林第纳尔元", + } + BIF{ + "BIF", + "布隆迪法郎", + } + BMD{ + "BMD", + "百慕大元", + } + BMP{ + "BMP", + "百慕大磅", + } + BND{ + "BND", + "汶莱元", + } + BOB{ + "BOB", + "玻利维亚", + } + BOL{ + "BOL", + "玻利维亚 (1863-1962)", + } + BOP{ + "BOP", + "玻利维亚比索", + } + BRB{ + "BRB", + "巴西克鲁赛罗 (1967-1986)", + } + BRC{ + "BRC", + "巴西克鲁塞罗", + } + BRE{ + "BRE", + "巴西克鲁塞罗 (1990-1993)", + } + BRL{ + "BRL", + "巴西里尔", + } + BRN{ + "BRN", + "巴西克鲁塞罗 Cruzado Novo", + } + BRR{ + "BRR", + "巴西克鲁塞罗", + } + BRZ{ + "BRZ", + "巴西克鲁塞罗 (1942-1967)", + } + BSD{ + "BSD", + "巴哈马元", + } + BSP{ + "BSP", + "巴哈马磅", + } + BTN{ + "BTN", + "不丹努扎姆", + } + BTR{ + "BTR", + "不丹卢比", + } + BUK{ + "BUK", + "缅元", + } + BUR{ + "BUR", + "缅甸卢比", + } + BWP{ + "BWP", + "波渣那扑拉", + } + BYB{ + "BYB", + "白俄罗斯新卢布 (1994-1999)", + } + BYL{ + "BYL", + "白俄罗斯卢布 (1992-1994)", + } + BYR{ + "BYR", + "白俄罗斯卢布", + } + BZD{ + "BZD", + "伯利兹元", + } + BZH{ + "BZH", + "属洪都拉斯元", + } + CAD{ + "CAD", + "加拿大元", + } + CDF{ + "CDF", + "刚果法郎", + } + CDG{ + "CDG", + "刚果共和国法郎", + } + CDL{ + "CDL", + "刚果扎伊尔", + } + CFF{ + "CFF", + "中非共和国 CFA 法郎", + } + CHF{ + "CHF", + "瑞士法郎", + } + CKD{ + "CKD", + "库克群岛元", + } + CLC{ + "CLC", + "智利肯杜", + } + CLE{ + "CLE", + "智利埃斯库多", + } + CLF{ + "CLF", + "智利 Unidades de Fomento", + } + CLP{ + "CLP", + "智利 比索", + } + CMF{ + "CMF", + "喀麦隆 CFA 法郎", + } + CNP{ + "CNP", + "中国人民票元", + } + CNX{ + "CNX", + "中国美元外汇券", + } + CNY{ + "¥", + "人民币", + } + COB{ + "COB", + "哥伦比亚纸比索", + } + COF{ + "COF", + "刚果 CFA 法郎", + } + COP{ + "COP", + "哥伦比亚比索", + } + CRC{ + "CRC", + "哥斯达黎加科隆", + } + CSC{ + "CSC", + "捷克克郎", + } + CSK{ + "CSK", + "捷克硬克郎", + } + CUP{ + "CUP", + "古巴比索", + } + CUX{ + "CUX", + "古巴外汇券", + } + CVE{ + "CVE", + "佛得角埃斯库多", + } + CWG{ + "CWG", + "库拉盾", + } + CYP{ + "CYP", + "塞浦路斯磅", + } + CZK{ + "CZK", + "捷克克郎", + } + DDM{ + "DDM", + "东德奥斯特马克", + } + DEM{ + "DEM", + "德国马克", + } + DES{ + "DES", + "德国司萡马克", + } + DJF{ + "DJF", + "吉布提法郎", + } + DKK{ + "DKK", + "丹麦克朗", + } + DOP{ + "DOP", + "多米尼加比索", + } + DZD{ + "DZD", + "阿尔及利亚第纳尔元", + } + DZF{ + "DZF", + "阿尔及利亚新法郎", + } + DZG{ + "DZG", + "阿尔及利亚法郎比斯查", + } + ECS{ + "ECS", + "厄瓜多尔苏克雷", + } + EEK{ + "EEK", + "爱沙尼亚克朗", + } + EGP{ + "EGP", + "埃及磅", + } + ERN{ + "ERN", + "厄立特里亚纳福卡", + } + ESP{ + "ESP", + "西班牙马赛塔", + } + ETB{ + "ETB", + "埃塞俄比亚比尔", + } + ETD{ + "ETD", + "埃塞俄比亚元", + } + EUR{ + "€", + "欧元", + } + FIM{ + "FIM", + "芬兰玛卡", + } + FIN{ + "FIN", + "芬兰玛卡 (1860-1962)", + } + FJD{ + "FJD", + "斐济元", + } + FJP{ + "FJP", + "斐济磅", + } + FKP{ + "FKP", + "福克兰群岛磅", + } + FOK{ + "FOK", + "法罗群岛克朗", + } + FRF{ + "FRF", + "法国法郎", + } + FRG{ + "FRG", + "法国法郎比斯查/法郎庞加莱", + } + GBP{ + "£", + "英磅", + } + GEK{ + "GEK", + "乔治亚库蓬拉瑞特", + } + GEL{ + "GEL", + "乔治亚库蓬拉瑞", + } + GHC{ + "GHC", + "加纳塞第", + } + GHO{ + "GHO", + "加纳旧塞第", + } + GHP{ + "GHP", + "加纳磅", + } + GHR{ + "GHR", + "加纳重评估塞第", + } + GIP{ + "GIP", + "直布罗陀磅", + } + GLK{ + "GLK", + "格陵兰克朗", + } + GMD{ + "GMD", + "冈比亚达拉西", + } + GMP{ + "GMP", + "冈比亚磅", + } + GNF{ + "GNF", + "几内亚法郎", + } + GNI{ + "GNI", + "几内亚法郎 (1960-1972)", + } + GNS{ + "GNS", + "几内亚Syli", + } + GPF{ + "GPF", + "瓜德罗普岛法郎", + } + GQE{ + "GQE", + "赤道几内亚爱克威乐", + } + GQF{ + "GQF", + "赤道几内亚法郎", + } + GQP{ + "GQP", + "赤道几内亚匹塞塔", + } + GRD{ + "GRD", + "希腊德拉克马", + } + GRN{ + "GRN", + "希腊新德拉克马", + } + GTQ{ + "GTQ", + "危地马拉", + } + GUF{ + "GUF", + "法国属圭亚那法郎", + } + GWE{ + "GWE", + "葡萄牙几内亚埃斯库多", + } + GWM{ + "GWM", + "葡萄牙几内亚迷洱瑞", + } + GWP{ + "GWP", + "几内亚比索", + } + GYD{ + "GYD", + "圭亚那元", + } + HKD{ + "HK$", + "港元", + } + HNL{ + "HNL", + "洪都拉斯勒皮拉", + } + HRD{ + "HRD", + "克罗地亚第纳尔元", + } + HRK{ + "HRK", + "克罗地亚库娜元", + } + HTG{ + "HTG", + "海地古德", + } + HUF{ + "HUF", + "匈牙利缶瑞特", + } + IBP{ + "IBP", + "北爱尔兰磅", + } + IDG{ + "IDG", + "印度尼西亚尼卡盾", + } + IDJ{ + "IDJ", + "印度尼西亚爪哇盾", + } + IDN{ + "IDN", + "印度尼西亚新盾", + } + IDR{ + "IDR", + "印度尼西亚盾", + } + IEP{ + "IEP", + "爱尔兰磅", + } + ILL{ + "ILL", + "以色列谢客尔", + } + ILP{ + "ILP", + "以色列磅", + } + ILS{ + "ILS", + "以色列新谢客尔", + } + IMP{ + "IMP", + "曼岛磅", + } + INR{ + "=0#Rs.|1#Re.|1 source: ../../../locale/icu/main/zh_Hans.xml + */ +zh_Hans{ + Version{"1.2"} +} diff --git a/icuSources/data/locales/zh_Hans_CN.txt b/icuSources/data/locales/zh_Hans_CN.txt new file mode 100644 index 00000000..8045609a --- /dev/null +++ b/icuSources/data/locales/zh_Hans_CN.txt @@ -0,0 +1,32 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/zh_Hans_CN.xml +// * +// *************************************************************************** +zh_Hans_CN{ + NumberPatterns{ + "#,##0.###;-#,##0.###", + "¤#,##0.00;-¤#,##0.00", + "#,##0%", + "#E0", + } + Version{"1.2"} + calendar{ + gregorian{ + DateTimePatterns{ + "ahh'时'mm'分'ss'秒' z", + "ahh'时'mm'分'ss'秒'", + "ahh:mm:ss", + "ah:mm", + "yyyy'年'M'月'd'日'EEEE", + "yyyy'年'M'月'd'日'", + "yyyy-M-d", + "yy-M-d", + "{1} {0}", + } + } + } +} diff --git a/icuSources/data/locales/zh_Hans_SG.txt b/icuSources/data/locales/zh_Hans_SG.txt new file mode 100644 index 00000000..89a46c25 --- /dev/null +++ b/icuSources/data/locales/zh_Hans_SG.txt @@ -0,0 +1,45 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/zh_Hans_SG.xml +// * +// *************************************************************************** +zh_Hans_SG{ + Countries{ + AU{"澳洲"} + CZ{"捷克"} + ID{"印尼"} + KR{"南韩"} + MK{"马其顿"} + NZ{"纽西兰"} + SA{"沙地阿拉伯"} + } + Languages{ + root{"根 源"} + sh{"塞尔维亚克罗地亚文"} + } + NumberPatterns{ + "#,##0.###;-#,##0.###", + "¤#,##0.00;-¤#,##0.00", + "#,##0%", + "#E0", + } + Version{"1.2"} + calendar{ + gregorian{ + DateTimePatterns{ + "a hh:mm:ss", + "a hh:mm:ss", + "a hh:mm", + "a hh:mm", + "dd MMMM yyyy", + "dd MMM yyyy", + "dd-MMM-yy", + "dd/MM/yy", + "{1} {0}", + } + } + } +} diff --git a/icuSources/data/locales/zh_Hant.txt b/icuSources/data/locales/zh_Hant.txt new file mode 100644 index 00000000..39072a1c --- /dev/null +++ b/icuSources/data/locales/zh_Hant.txt @@ -0,0 +1,2186 @@ +// *************************************************************************** +// * +// * Copyright (C) 2005 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java +// * Source File: ../../../locale/common/main/zh_Hant.xml +// * +// *************************************************************************** +/** + * ICU source: ../../../locale/icu/main/zh_Hant.xml + */ +zh_Hant{ + Countries{ + AD{"安道爾"} + AE{"阿拉伯聯合大公國"} + AG{"安地卡及巴布達"} + AI{"安圭拉島"} + AL{"阿爾巴尼亞"} + AM{"亞美尼亞"} + AN{"荷屬安地列斯"} + AQ{"南極洲"} + AS{"美屬薩摩亞群島"} + AT{"奧地利"} + AU{"澳洲"} + AW{"阿路巴"} + AZ{"亞塞拜然"} + BA{"波士尼亞與赫塞格維納"} + BB{"巴貝多"} + BD{"孟加拉"} + BE{"比利時"} + BF{"布基納法索"} + BG{"保加利亞"} + BI{"浦隆地"} + BJ{"貝南"} + BM{"百慕達"} + BN{"汶萊"} + BO{"玻利維亞"} + BS{"巴哈馬"} + BV{"布威島"} + BW{"波札那"} + BY{"白俄羅斯"} + BZ{"貝里斯"} + CC{"可可斯群島"} + CD{"剛果民主共和國"} + CF{"中非共和國"} + CG{"剛果"} + CI{"科特迪瓦"} + CK{"庫克群島"} + CM{"喀麥隆"} + CN{"中華人民共和國"} + CO{"哥倫比亞"} + CR{"哥斯大黎加"} + CV{"維德角"} + CX{"聖誕島"} + CY{"賽普勒斯"} + CZ{"捷克共和國"} + DE{"德國"} + DJ{"吉布地"} + DK{"丹麥"} + DM{"多明尼加"} + DO{"多明尼加共和國"} + DZ{"阿爾及利亞"} + EC{"厄瓜多爾"} + EE{"愛沙尼亞"} + ER{"厄利垂亞"} + ET{"衣索比亞"} + FI{"芬蘭"} + FJ{"斐濟"} + FK{"福克蘭群島"} + FM{"密克羅尼西亞群島"} + FO{"法羅群島"} + FR{"法國"} + GA{"加彭"} + GB{"英國"} + GD{"格瑞納達"} + GE{"喬治亞共和國"} + GF{"法屬圭亞那"} + GH{"迦納"} + GI{"直布羅陀"} + GL{"格陵蘭"} + GM{"甘比亞"} + GN{"幾內亞"} + GP{"哥德普洛"} + GQ{"赤道幾內亞"} + GR{"希臘"} + GS{"南喬治亞與南三明治群島"} + GT{"瓜地馬拉"} + GU{"關島"} + GW{"幾內亞比索"} + GY{"蓋亞納"} + HK{"中華人民共和國香港特別行政區"} + HM{"赫德與麥克當諾群島"} + HN{"宏都拉斯"} + HR{"克羅埃西亞"} + ID{"印尼"} + IE{"愛爾蘭"} + IO{"英屬印度洋領土"} + IS{"冰島"} + IT{"義大利"} + JM{"牙買加"} + JO{"約旦"} + KE{"肯亞"} + KG{"吉爾吉斯"} + KH{"高棉"} + KI{"吉里巴斯"} + KM{"科摩羅群島"} + KN{"聖克里斯多福及尼維斯"} + KP{"北韓"} + KR{"南韓"} + KY{"開曼群島"} + KZ{"哈薩克"} + LA{"寮國"} + LC{"聖露西亞"} + LI{"列支敦斯登"} + LK{"斯里蘭卡"} + LR{"賴比瑞亞"} + LS{"賴索扥"} + LU{"盧森堡"} + LV{"拉脫維亞"} + LY{"利比亞"} + MC{"摩納哥"} + MD{"摩爾多瓦"} + MG{"馬達加斯加"} + MH{"馬紹爾群島"} + MK{"馬其頓"} + ML{"馬利"} + MM{"緬甸"} + MO{"中華人民共和國澳門特別行政區"} + MP{"北馬里安納"} + MQ{"馬丁尼克島"} + MR{"茅利塔尼亞"} + MS{"蒙特色拉特島"} + MT{"馬爾他"} + MU{"模里西斯"} + MV{"馬爾地夫"} + MW{"馬拉威"} + MY{"馬來西亞"} + MZ{"莫三比克"} + NA{"納米比亞"} + NC{"新喀里多尼亞群島"} + NE{"尼日"} + NF{"諾福克島"} + NG{"奈及利亞"} + NL{"荷蘭"} + NP{"尼泊爾"} + NR{"諾魯"} + NU{"紐威島"} + NZ{"紐西蘭"} + OM{"阿曼王國"} + PA{"巴拿馬"} + PE{"秘魯"} + PF{"法屬玻里尼西亞"} + PG{"巴布亞紐幾內亞"} + PH{"菲律賓"} + PL{"波蘭"} + PM{"聖彼德與密啟崙"} + PN{"皮特康"} + PR{"玻多黎克"} + PS{"巴勒斯坦"} + PW{"帛琉"} + QA{"卡達"} + RE{"留尼旺"} + RO{"羅馬尼亞"} + RU{"俄羅斯"} + RW{"盧安達"} + SA{"沙烏地阿拉伯"} + SB{"索羅門群島"} + SC{"塞席爾"} + SD{"蘇丹"} + SH{"聖赫勒拿島"} + SI{"斯洛維尼亞"} + SJ{"冷岸及央麥恩群島"} + SL{"獅子山"} + SM{"聖馬利諾"} + SN{"塞內加爾"} + SO{"索馬利亞"} + SP{"塞爾維亞"} + SR{"蘇利南"} + ST{"聖多美及普林西比"} + SV{"薩爾瓦多"} + SY{"敘利亞"} + SZ{"史瓦濟蘭"} + TC{"土克斯及開科斯群島"} + TD{"查德"} + TF{"法國南屬地"} + TG{"多哥共和國"} + TH{"泰國"} + TJ{"塔吉克"} + TK{"托克勞群島"} + TL{"東帝文"} + TM{"土庫曼"} + TN{"突尼西亞"} + TO{"東加"} + TT{"千里達及托巴哥"} + TV{"吐瓦魯"} + TW{"臺灣"} + TZ{"坦尚尼亞"} + UA{"烏克蘭"} + UG{"烏干達"} + UM{"美屬邊疆群島"} + US{"美國"} + UY{"烏拉圭"} + UZ{"烏茲別克"} + VA{"梵帝岡"} + VC{"聖文森及格瑞那丁"} + VE{"委內瑞拉"} + VG{"英屬維爾京群島"} + VI{"美屬維爾京群島"} + VU{"萬那杜"} + WF{"瓦利斯和福杜納群島"} + WS{"薩摩亞群島"} + YE{"葉門"} + YT{"馬約特"} + ZM{"尚比亞"} + ZW{"辛巴威"} + } + Currencies{ + ADD{ + "ADD", + "安道爾第納爾", + } + ADP{ + "ADP", + "安道爾陪士特", + } + AED{ + "AED", + "阿拉伯聯合大公國迪爾汗", + } + AIF{ + "AIF", + "阿法爾和伊薩法郎", + } + ALK{ + "ALK", + "阿爾巴尼亞列克 (1946-1961)", + } + ALL{ + "ALL", + "阿爾巴尼亞列克", + } + ALV{ + "ALV", + "阿爾巴尼亞列克幣", + } + ALX{ + "ALX", + "阿爾巴尼亞元外匯券", + } + AMD{ + "AMD", + "亞美尼亞德拉姆", + } + ANG{ + "ANG", + "荷蘭 安梯蘭 盾", + } + AOA{ + "AOA", + "安哥拉寬扎", + } + AOK{ + "AOK", + "安哥拉寬扎(1977-1990)", + } + AON{ + "AON", + "安哥拉新寬扎 (1990-2000)", + } + AOR{ + "AOR", + "安哥拉新寬扎 Reajustado (1995-1999)", + } + AOS{ + "AOS", + "安哥拉埃斯庫多", + } + ARA{ + "ARA", + "阿根廷奧斯特納爾", + } + ARM{ + "ARM", + "阿根廷披索 Moneda Nacional", + } + ARP{ + "ARP", + "阿根廷披索(1983-1985)", + } + ARS{ + "ARS", + "阿根廷披索", + } + ATS{ + "ATS", + "奧地利先令", + } + AUD{ + "AUD", + "澳幣", + } + AUP{ + "AUP", + "澳大利亞鎊", + } + AWG{ + "AWG", + "阿魯巴盾", + } + AZM{ + "AZM", + "阿塞拜彊馬特納", + } + BAD{ + "BAD", + "波士尼亞-黑塞哥維那第納爾", + } + BAM{ + "BAM", + "波士尼亞-黑塞哥維那可轉換馬克", + } + BAN{ + "BAN", + "波士尼亞-黑塞哥維那新第納爾", + } + BBD{ + "BBD", + "巴貝多元", + } + BDT{ + "BDT", + "孟加拉塔卡", + } + BEC{ + "BEC", + "比利時法郎 (可轉換)", + } + BEF{ + "BEF", + "比利時法郎", + } + BEL{ + "BEL", + "比利時法郎 (金融)", + } + BGL{ + "BGL", + "保加利亞硬列弗", + } + BGM{ + "BGM", + "保加利亞 社會主義列弗", + } + BGN{ + "BGN", + "保加利亞新列弗", + } + BGO{ + "BGO", + "保加利亞列弗 (1879-1952)", + } + BGX{ + "BGX", + "保加利亞列弗外匯券", + } + BHD{ + "BHD", + "巴林第納爾", + } + BIF{ + "BIF", + "蒲隆地法郎", + } + BMD{ + "BMD", + "百慕達幣", + } + BMP{ + "BMP", + "百慕達鎊", + } + BND{ + "BND", + "汶萊元", + } + BOB{ + "BOB", + "玻利維亞貨幣單位", + } + BOL{ + "BOL", + "玻利維亞舊貨幣單位 (1863-1962)", + } + BOP{ + "BOP", + "玻利維亞披索", + } + BOV{ + "BOV", + "玻利維亞 幕多", + } + BRB{ + "BRB", + "巴西克魯薩多 農瓦 (1967-1986)", + } + BRC{ + "BRC", + "巴西克魯賽羅 (1986-1989)", + } + BRE{ + "BRE", + "巴西克魯賽羅 (1990-1993)", + } + BRL{ + "BRL", + "巴西里拉", + } + BRN{ + "BRN", + "巴西 克如爾達 農瓦", + } + BRR{ + "BRR", + "巴西克魯賽羅", + } + BRZ{ + "BRZ", + "巴西克魯賽羅 (1942-1967)", + } + BSD{ + "BSD", + "巴哈馬元", + } + BSP{ + "BSP", + "巴哈馬鎊", + } + BTR{ + "BTR", + "不丹盧布", + } + BUK{ + "BUK", + "緬甸元", + } + BUR{ + "BUR", + "緬甸盧布", + } + BWP{ + "BWP", + "波札那 - 普拉", + } + BYB{ + "BYB", + "白俄羅斯新盧布 (1994-1999)", + } + BYL{ + "BYL", + "白俄羅斯盧布 (1992-1994)", + } + BYR{ + "BYR", + "白俄羅斯盧布", + } + BZD{ + "BZD", + "伯利茲元", + } + BZH{ + "BZH", + "英國的洪都拉斯元r", + } + CAD{ + "CAD", + "加幣", + } + CDF{ + "CDF", + "剛果法郎", + } + CDG{ + "CDG", + "剛果共和國法郎", + } + CDL{ + "CDL", + "剛果扎伊爾", + } + CFF{ + "CFF", + "中非共和國西非法郎", + } + CKD{ + "CKD", + "庫克群島元", + } + CLC{ + "CLC", + "智利 康導", + } + CLE{ + "CLE", + "智利埃斯庫多", + } + CLF{ + "CLF", + "卡林油達佛曼跎", + } + CLP{ + "CLP", + "智利披索", + } + CMF{ + "CMF", + "卡麥隆西非法郎", + } + CNP{ + "CNP", + "中國人民幣元", + } + CNX{ + "CNX", + "中國美元外匯券", + } + CNY{ + "CNY", + "人民幣", + } + COB{ + "COB", + "哥倫比亞披索鈔", + } + COF{ + "COF", + "剛果西非法郎", + } + COP{ + "COP", + "哥倫比亞披索", + } + CRC{ + "CRC", + "哥斯大黎加科郎", + } + CSC{ + "CSC", + "捷克克朗", + } + CSK{ + "CSK", + "捷克斯洛伐克硬克朗", + } + CUP{ + "CUP", + "古巴披索", + } + CUX{ + "CUX", + "古巴人外匯券", + } + CVE{ + "CVE", + "維德角埃斯庫多", + } + CWG{ + "CWG", + "庫拉克 盾", + } + CYP{ + "CYP", + "賽浦路斯鎊", + } + CZK{ + "CZK", + "捷克克朗", + } + DDM{ + "DDM", + "東德東德馬克", + } + DEM{ + "DEM", + "德國馬克", + } + DES{ + "DES", + "德國 蘇馬克Sperrmark", + } + DJF{ + "DJF", + "吉布地法郎", + } + DKK{ + "DKK", + "丹麥克羅納", + } + DOP{ + "DOP", + "多明尼加披索", + } + DZD{ + "DZD", + "阿爾及利亞第納爾", + } + DZF{ + "DZF", + "阿爾及利亞新法郎", + } + DZG{ + "DZG", + "阿爾及利亞法郎 Germinal", + } + ECS{ + "ECS", + "厄瓜多蘇克雷", + } + ECV{ + "ECV", + "厄瓜多爾由里達瓦康斯坦 (UVC)", + } + EEK{ + "EEK", + "愛沙尼亞克朗", + } + EGP{ + "EGP", + "埃及鎊", + } + ERN{ + "ERN", + "厄立特里亞納克法", + } + ESP{ + "ESP", + "西班牙陪士特", + } + ETB{ + "ETB", + "衣索比亞比爾", + } + ETD{ + "ETD", + "埃賽俄比亞元", + } + EUR{ + "EUR", + "歐元", + } + FIM{ + "FIM", + "芬蘭馬克", + } + FIN{ + "FIN", + "芬蘭馬克 (1860-1962)", + } + FJD{ + "FJD", + "斐濟元", + } + FJP{ + "FJP", + "斐濟鎊", + } + FKP{ + "FKP", + "福克蘭群島鎊", + } + FOK{ + "FOK", + "法羅島克朗", + } + FRF{ + "FRF", + "法國法郎", + } + FRG{ + "FRG", + "法國法郎 捷米那/龐加萊法郎", + } + GAF{ + "GAF", + "加蓬西非法郎", + } + GBP{ + "GBP", + "英鎊", + } + GEK{ + "GEK", + "喬治 庫旁 拉里", + } + GEL{ + "GEL", + "喬治拉里", + } + GHC{ + "GHC", + "迦納仙蔕", + } + GHO{ + "GHO", + "迦納舊仙蔕", + } + GHP{ + "GHP", + "迦納鎊", + } + GHR{ + "GHR", + "迦納重新估价後的仙蔕", + } + GIP{ + "GIP", + "直布羅陀鎊", + } + GLK{ + "GLK", + "格陵蘭克羅鈉", + } + GMD{ + "GMD", + "甘比亞達拉西", + } + GMP{ + "GMP", + "岡比亞鎊", + } + GNF{ + "GNF", + "幾內亞法郎", + } + GNI{ + "GNI", + "幾內亞法郎 (1960-1972)", + } + GNS{ + "GNS", + "幾內亞西里", + } + GPF{ + "GPF", + "瓜德羅普島法郎", + } + GQE{ + "GQE", + "赤道幾內亞埃奎勒", + } + GQF{ + "GQF", + "赤道幾內亞佛朗哥", + } + GQP{ + "GQP", + "赤道幾內亞比塞塔", + } + GRD{ + "GRD", + "希臘德拉克馬", + } + GRN{ + "GRN", + "希臘新德拉克馬", + } + GTQ{ + "GTQ", + "瓜地馬拉格查爾", + } + GUF{ + "GUF", + "法屬圭亞那法郎圭亞那", + } + GWE{ + "GWE", + "葡屬幾內亞埃斯庫多", + } + GWM{ + "GWM", + "葡屬幾內亞米爾里斯", + } + GWP{ + "GWP", + "幾內亞披索披索", + } + GYD{ + "GYD", + "圭亞那元", + } + HNL{ + "HNL", + "洪都拉斯倫皮拉", + } + HRD{ + "HRD", + "克羅地亞第納爾", + } + HRK{ + "HRK", + "克羅地亞庫納", + } + HUF{ + "HUF", + "匈牙利 - 福林", + } + IBP{ + "IBP", + "北愛爾蘭鎊", + } + IDG{ + "IDG", + "印度尼西亞尼可盾", + } + IDJ{ + "IDJ", + "印度尼西亞爪哇盧布", + } + IDN{ + "IDN", + "印度尼西亞新盧布", + } + IDR{ + "IDR", + "印尼 - 盧布", + } + IEP{ + "IEP", + "愛爾蘭鎊", + } + ILL{ + "ILL", + "以色列謝客爾", + } + ILP{ + "ILP", + "以色列鎊", + } + ILS{ + "ILS", + "以色列新謝克爾", + } + IMP{ + "IMP", + "曼城島英鎊", + } + INR{ + "=0#Rs.|1#Re.|1> Depends on the Unicode data as well as uchar.h and uscript.h << -"$(ICUBLD)\$(ICUDT)pnames.icu": "$(ICUUNIDATA)\*.txt" "$(ICUTOOLS)\genpname\$(CFG)\genpname.exe" "$(ICUP)\source\common\unicode\uchar.h" "$(ICUP)\source\common\unicode\uscript.h" +"$(ICUBLD)\pnames.icu": "$(ICUUNIDATA)\*.txt" "$(ICUTOOLS)\genpname\$(CFG)\genpname.exe" "$(ICUP)\source\common\unicode\uchar.h" "$(ICUP)\source\common\unicode\uscript.h" @echo Creating data file for Unicode Property Names - @set ICU_DATA=$(ICUBLD) @"$(ICUTOOLS)\genpname\$(CFG)\genpname" -d "$(ICUBLD)" # Targets for uprops.icu -"$(ICUBLD)\$(ICUDT)uprops.icu": "$(ICUUNIDATA)\*.txt" "$(ICUTOOLS)\genprops\$(CFG)\genprops.exe" "$(ICUBLD)\$(ICUDT)pnames.icu" +"$(ICUBLD)\uprops.icu": "$(ICUUNIDATA)\*.txt" "$(ICUTOOLS)\genprops\$(CFG)\genprops.exe" "$(ICUBLD)\pnames.icu" @echo Creating data file for Unicode Character Properties - @set ICU_DATA=$(ICUBLD) - @"$(ICUTOOLS)\genprops\$(CFG)\genprops" -u $(UNICODE_VERSION) -s "$(ICUUNIDATA)" + @"$(ICUTOOLS)\genprops\$(CFG)\genprops" -u $(UNICODE_VERSION) -i "$(ICUBLD)" -s "$(ICUUNIDATA)" -d "$(ICUBLD)" + +# Targets for ucase.icu +"$(ICUBLD)\ucase.icu": "$(ICUUNIDATA)\*.txt" "$(ICUTOOLS)\gencase\$(CFG)\gencase.exe" + @echo Creating data file for Unicode Case Mapping Properties + @"$(ICUTOOLS)\gencase\$(CFG)\gencase" -u $(UNICODE_VERSION) -i "$(ICUBLD)" -s "$(ICUUNIDATA)" -d "$(ICUBLD)" # Targets for unorm.icu -"$(ICUBLD)\$(ICUDT)unorm.icu": "$(ICUUNIDATA)\*.txt" "$(ICUTOOLS)\gennorm\$(CFG)\gennorm.exe" +"$(ICUBLD)\unorm.icu": "$(ICUUNIDATA)\*.txt" "$(ICUTOOLS)\gennorm\$(CFG)\gennorm.exe" "$(ICUBLD)\pnames.icu" "$(ICUBLD)\uprops.icu" "$(ICUBLD)\ucase.icu" @echo Creating data file for Unicode Normalization - @set ICU_DATA=$(ICUBLD) - @"$(ICUTOOLS)\gennorm\$(CFG)\gennorm" -u $(UNICODE_VERSION) -s "$(ICUUNIDATA)" + @"$(ICUTOOLS)\gennorm\$(CFG)\gennorm" -u $(UNICODE_VERSION) -d "$(ICUBLD)" -i "$(ICUBLD)" -s "$(ICUUNIDATA)" # Targets for converters -"$(ICUBLD)\$(ICUDT)cnvalias.icu" : {"$(ICUSRCDATA)\$(ICUUCM)"}\convrtrs.txt "$(ICUTOOLS)\gencnval\$(CFG)\gencnval.exe" +"$(ICUBLD)\cnvalias.icu" : {"$(ICUSRCDATA)\$(ICUUCM)"}\convrtrs.txt "$(ICUTOOLS)\gencnval\$(CFG)\gencnval.exe" @echo Creating data file for Converter Aliases - @set ICU_DATA=$(ICUBLD) - @"$(ICUTOOLS)\gencnval\$(CFG)\gencnval" "$(ICUSRCDATA)\$(ICUUCM)\convrtrs.txt" - -# Targets for tz -"$(ICUBLD)\$(ICUDT)tz.icu" : {"$(ICUMISC)"}timezone.txt {"$(ICUTOOLS)\gentz\$(CFG)"}gentz.exe - @echo Creating data file for Timezones - @set ICU_DATA=$(ICUBLD) - @"$(ICUTOOLS)\gentz\$(CFG)\gentz" "$(ICUMISC)\timezone.txt" + @"$(ICUTOOLS)\gencnval\$(CFG)\gencnval" -d "$(ICUBLD)" "$(ICUSRCDATA)\$(ICUUCM)\convrtrs.txt" # Targets for ucadata.icu & invuca.icu -"$(ICUBLD)\$(ICUDT)invuca.icu" "$(ICUBLD)\$(ICUDT)ucadata.icu": "$(ICUUNIDATA)\FractionalUCA.txt" "$(ICUTOOLS)\genuca\$(CFG)\genuca.exe" $(ICUDT)uprops.icu $(ICUDT)unorm.icu +"$(ICUBLD)\invuca.icu" "$(ICUBLD)\ucadata.icu": "$(ICUUNIDATA)\FractionalUCA.txt" "$(ICUTOOLS)\genuca\$(CFG)\genuca.exe" "$(ICUBLD)\uprops.icu" "$(ICUBLD)\ucase.icu" "$(ICUBLD)\unorm.icu" @echo Creating UCA data files - @set ICU_DATA=$(ICUBLD) - @"$(ICUTOOLS)\genuca\$(CFG)\genuca" -s "$(ICUUNIDATA)" + @"$(ICUTOOLS)\genuca\$(CFG)\genuca" -d "$(ICUBLD)" -i "$(ICUBLD)" -s "$(ICUUNIDATA)" -# Targets for uidna.icu -"$(ICUBLD)\$(ICUDT)uidna.icu" : "$(ICUUNIDATA)\*.txt" "$(ICUMISC)\*.txt" - genidna -s "$(ICUDATA)" -d "$(ICUBLD)\\" +# Targets for uidna.spp +"$(ICUBLD)\uidna.spp" : "$(ICUUNIDATA)\*.txt" "$(ICUMISC)\NamePrepProfile.txt" + gensprep -s "$(ICUMISC)" -d "$(ICUBLD)\\" -b uidna -n "$(ICUUNIDATA)" -k -u 3.2.0 NamePrepProfile.txt # Dependencies on the tools for the batch inference rules $(UCM_SOURCE) : {"$(ICUTOOLS)\makeconv\$(CFG)"}makeconv.exe -$(TRANSLIT_SOURCE) $(GENRB_SOURCE) "$(ICUBLD)\$(ICUDT)root.res" : {"$(ICUTOOLS)\genrb\$(CFG)"}genrb.exe "$(ICUBLD)\$(ICUDT)ucadata.icu" "$(ICUBLD)\$(ICUDT)uprops.icu" "$(ICUBLD)\$(ICUDT)unorm.icu" +$(MISC_SOURCE) $(RB_FILES) $(COL_COL_FILES) $(RBNF_RES_FILES) $(TRANSLIT_RES_FILES): {"$(ICUTOOLS)\genrb\$(CFG)"}genrb.exe "$(ICUBLD)\ucadata.icu" "$(ICUBLD)\uprops.icu" "$(ICUBLD)\ucase.icu" "$(ICUBLD)\unorm.icu" +$(BRK_SOURCE) : "$(ICUBLD)\uprops.icu" "$(ICUBLD)\ucase.icu" "$(ICUBLD)\unames.icu" "$(ICUBLD)\pnames.icu" "$(ICUBLD)\unorm.icu" diff --git a/icuSources/data/makedata.vcproj b/icuSources/data/makedata.vcproj index 0b3f1ff9..4dbb697c 100644 --- a/icuSources/data/makedata.vcproj +++ b/icuSources/data/makedata.vcproj @@ -1,7 +1,7 @@ - + + BuildCommandLine="NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=release" + ReBuildCommandLine="NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=release clean all" + CleanCommandLine="NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=release clean"/> + BuildCommandLine="NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=debug" + ReBuildCommandLine="NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=debug clean all" + CleanCommandLine="NMAKE /f makedata.mak ICUMAKE="$(ProjectDir)\" CFG=debug clean"/> + + + + + + + + + + + + + RelativePath="..\test\testdata\testdata.mak"> @@ -64,14 +82,6 @@ RelativePath=".\mappings\ucmfiles.mk"> - - - - diff --git a/icuSources/data/mappings/cns-11643-1992.ucm b/icuSources/data/mappings/cns-11643-1992.ucm index 8c41c922..f7049534 100644 --- a/icuSources/data/mappings/cns-11643-1992.ucm +++ b/icuSources/data/mappings/cns-11643-1992.ucm @@ -1,6 +1,6 @@ # ******************************************************************************* # * -# * Copyright (C) 1997-2001, International Business Machines +# * Copyright (C) 1997-2003, International Business Machines # * Corporation and others. All Rights Reserved. # * # ******************************************************************************* @@ -8,7 +8,7 @@ # File created on Wed 30 Aug,2000 # # File created from : i) CNS-11643-1992 mapping table by Koichi Yasuoka -# ii) Unihan3.txt from Unicode.org +# ii) Unihan3.txt from Unicode.org # # Author : Raghuram Viswanadha, IBM # @@ -21,41 +21,39 @@ # Christian Wittern , and Jack Halpern # . # +# Markus Scherer 2003-dec-01: +# I removed the mappings for CNS plane 9 because this table is used only for the +# ISO-2022-CN[-EXT] converter, which only uses CNS planes 1..7. # # -# - "CNS-11643-1992" - "AXXXX" - 3 - 1 - "MBCS" - \x81\x7e\x7e + "CNS-11643-1992" + "AXXXX" + 3 + 3 + "MBCS" + \x81\x7e\x7e # (state 0) lead byte, selects the CNS plane (0x80 + plane number) - 81-82:1, 83:7, 84-89:3, 88:5, 8a-90:5 + 81-82:1, 83:7, 84-87:3, 88-90:5 # (1..2) regular middle and trail bytes, result in BMP code points - 21-7e:2 - 21-7e + 21-7e:2 + 21-7e # (3..4) middle and trail bytes resulting in supplementary code points - 21-7e:4 - 21-7e.p + 21-7e:4 + 21-7e.p # (5..6) middle and trail bytes for valid but unassigned sequences - 21-7e:6 - 21-7e.u + 21-7e:6 + 21-7e.u # (7) middle byte for plane 3 # most results in BMP, some in supplementary, some in unassigned - 21-7e:2, 21:4, 23-27:4, 2a:4, 2e:4, 30:4, 34:4, 39-3a:4, 3f:4, 47-48:4, 50:4, 55:4, 57-58:4, 63:6, 68-7e:6 + 21-7e:2, 21:4, 23-27:4, 2a:4, 2e:4, 30:4, 34:4, 39-3a:4, 3f:4, 47-48:4, 50:4, 55:4, 57-58:4, 63:6, 68-7e:6 # CHARMAP -# -# -#10646 CNS-11643-1992 -#______ ______________ \x81\x21\x21 |0 \x81\x21\x2A |0 \x81\x21\x6C |0 @@ -456,11 +454,9 @@ CHARMAP \x81\x22\x4C |0 \x81\x22\x4B |0 \x81\x22\x6F |0 -########### \x86\x22\x2C |0 \x84\x22\x24 |0 \x86\x21\x23 |0 - \x89\x21\x6C |0 \x84\x21\x57 |0 \x84\x23\x36 |0 \x84\x28\x35 |0 @@ -477,7 +473,6 @@ CHARMAP \x83\x21\x6E |0 \x83\x21\x71 |0 \x83\x21\x73 |0 - \x89\x21\x44 |0 \x86\x23\x4E |0 \x83\x22\x71 |0 \x84\x22\x31 |0 @@ -497,7 +492,6 @@ CHARMAP \x84\x25\x3B |0 \x84\x25\x38 |0 \x83\x27\x50 |0 - \x89\x25\x4A |0 \x83\x2B\x31 |0 \x86\x2E\x5A |0 \x84\x28\x39 |0 @@ -567,7 +561,6 @@ CHARMAP \x84\x6A\x41 |0 \x83\x61\x3C |0 \x84\x22\x33 |0 - \x89\x26\x5A |0 \x84\x2B\x69 |0 \x83\x57\x54 |0 \x83\x21\x76 |0 @@ -743,7 +736,6 @@ CHARMAP \x83\x24\x6F |0 \x83\x24\x6E |0 \x83\x24\x7A |0 - \x89\x23\x49 |0 \x83\x25\x25 |0 \x83\x27\x7A |0 \x83\x27\x6D |0 @@ -759,7 +751,6 @@ CHARMAP \x84\x28\x59 |0 \x84\x28\x5C |0 \x83\x2B\x56 |0 - \x89\x29\x5C |0 \x84\x2C\x25 |0 \x83\x2F\x7D |0 \x84\x2B\x7E |0 @@ -782,7 +773,6 @@ CHARMAP \x84\x30\x71 |0 \x84\x30\x6D |0 \x84\x30\x6C |0 - \x89\x33\x43 |0 \x83\x38\x53 |0 \x84\x30\x6F |0 \x85\x36\x76 |0 @@ -906,7 +896,6 @@ CHARMAP \x83\x34\x6D |0 \x83\x34\x73 |0 \x83\x34\x6A |0 - \x89\x33\x57 |0 \x84\x31\x21 |0 \x84\x36\x6B |0 \x83\x3A\x46 |0 @@ -933,8 +922,6 @@ CHARMAP \x84\x49\x33 |0 \x83\x4B\x4A |0 \x83\x4B\x4E |0 - \x89\x4E\x25 |0 - \x89\x4E\x2E |0 \x84\x49\x2A |0 \x83\x50\x44 |0 \x84\x4F\x78 |0 @@ -1013,7 +1000,6 @@ CHARMAP \x84\x28\x69 |0 \x83\x2B\x7E |0 \x83\x2C\x22 |0 - \x89\x2A\x2A |0 \x84\x28\x67 |0 \x83\x30\x3F |0 \x83\x30\x42 |0 @@ -1033,8 +1019,6 @@ CHARMAP \x83\x30\x46 |0 \x83\x30\x41 |0 \x83\x30\x3A |0 - \x89\x2E\x6B |0 - \x89\x2E\x78 |0 \x84\x31\x29 |0 \x83\x35\x26 |0 \x83\x35\x2D |0 @@ -1061,7 +1045,6 @@ CHARMAP \x84\x36\x7D |0 \x83\x3A\x70 |0 \x83\x3A\x5D |0 - \x89\x3A\x3C |0 \x83\x3A\x6D |0 \x83\x3A\x69 |0 \x83\x3A\x68 |0 @@ -1102,7 +1085,6 @@ CHARMAP \x83\x50\x52 |0 \x83\x50\x55 |0 \x84\x50\x21 |0 - \x89\x54\x2A |0 \x84\x56\x22 |0 \x84\x56\x24 |0 \x83\x57\x5F |0 @@ -1265,7 +1247,6 @@ CHARMAP \x84\x31\x39 |0 \x86\x3E\x78 |0 \x83\x35\x50 |0 - \x89\x34\x3F |0 \x83\x35\x53 |0 \x83\x3B\x2F |0 \x83\x3B\x32 |0 @@ -1342,7 +1323,6 @@ CHARMAP \x83\x25\x69 |0 \x84\x24\x21 |0 \x83\x25\x6A |0 - \x89\x24\x25 |0 \x84\x26\x36 |0 \x84\x26\x37 |0 \x84\x29\x25 |0 @@ -1402,7 +1382,6 @@ CHARMAP \x83\x28\x64 |0 \x84\x26\x3A |0 \x83\x28\x66 |0 - \x89\x2F\x38 |0 \x83\x2C\x49 |0 \x83\x2C\x4A |0 \x84\x29\x2A |0 @@ -1491,7 +1470,6 @@ CHARMAP \x83\x2C\x53 |0 \x86\x31\x25 |0 \x85\x2D\x47 |0 - \x89\x2F\x3E |0 \x84\x31\x54 |0 \x83\x35\x66 |0 \x83\x35\x67 |0 @@ -1533,7 +1511,6 @@ CHARMAP \x84\x26\x4E |0 \x84\x26\x4C |0 \x84\x26\x46 |0 - \x89\x2A\x3E |0 \x83\x2C\x58 |0 \x84\x29\x41 |0 \x83\x2C\x62 |0 @@ -1658,7 +1635,6 @@ CHARMAP \x84\x5B\x25 |0 \x83\x57\x67 |0 \x84\x5B\x24 |0 - \x89\x5A\x29 |0 \x83\x57\x66 |0 \x84\x50\x3A |0 \x85\x67\x78 |0 @@ -1841,7 +1817,6 @@ CHARMAP \x83\x57\x68 |0 \x84\x5B\x2F |0 \x83\x57\x72 |0 - \x89\x5E\x73 |0 \x83\x5A\x3D |0 \x83\x5A\x3E |0 \x84\x63\x47 |0 @@ -1937,7 +1912,6 @@ CHARMAP \x83\x31\x47 |0 \x86\x38\x37 |0 \x83\x31\x4A |0 - \x89\x2F\x6E |0 \x84\x2D\x4D |0 \x86\x40\x51 |0 \x84\x32\x36 |0 @@ -2014,7 +1988,6 @@ CHARMAP \x83\x26\x46 |0 \x83\x29\x4B |0 \x83\x29\x46 |0 - \x89\x27\x4C |0 \x83\x29\x50 |0 \x83\x29\x4D |0 \x85\x26\x51 |0 @@ -2085,7 +2058,6 @@ CHARMAP \x83\x41\x60 |0 \x83\x42\x5A |0 \x83\x41\x67 |0 - \x89\x48\x55 |0 \x84\x44\x24 |0 \x84\x43\x75 |0 \x84\x44\x21 |0 @@ -2108,7 +2080,6 @@ CHARMAP \x83\x47\x49 |0 \x84\x3D\x72 |0 \x83\x47\x50 |0 - \x89\x48\x52 |0 \x83\x4C\x4E |0 \x85\x4D\x6D |0 \x84\x4A\x3A |0 @@ -2173,7 +2144,6 @@ CHARMAP \x84\x5F\x75 |0 \x83\x5A\x4C |0 \x83\x5A\x4B |0 - \x89\x62\x53 |0 \x83\x5A\x4A |0 \x83\x5C\x4C |0 \x83\x5C\x46 |0 @@ -2184,7 +2154,6 @@ CHARMAP \x84\x63\x54 |0 \x83\x5C\x4B |0 \x83\x5C\x45 |0 - \x89\x65\x3E |0 \x85\x70\x27 |0 \x83\x5E\x36 |0 \x83\x5C\x4A |0 @@ -2300,7 +2269,6 @@ CHARMAP \x84\x26\x79 |0 \x83\x29\x5B |0 \x84\x26\x7A |0 - \x89\x27\x5B |0 \x83\x2D\x43 |0 \x84\x2D\x66 |0 \x84\x32\x52 |0 @@ -2362,7 +2330,6 @@ CHARMAP \x84\x26\x7E |0 \x83\x29\x68 |0 \x83\x29\x66 |0 - \x89\x27\x66 |0 \x83\x2D\x44 |0 \x85\x2A\x24 |0 \x84\x27\x22 |0 @@ -2423,8 +2390,6 @@ CHARMAP \x83\x3C\x61 |0 \x83\x42\x2B |0 \x86\x4A\x6D |0 - \x89\x3C\x43 |0 - \x89\x3C\x5A |0 \x84\x3E\x37 |0 \x83\x42\x2C |0 \x83\x42\x37 |0 @@ -2556,7 +2521,6 @@ CHARMAP \x84\x32\x76 |0 \x84\x32\x70 |0 \x84\x32\x77 |0 - \x89\x36\x48 |0 \x83\x3C\x76 |0 \x84\x38\x65 |0 \x84\x38\x61 |0 @@ -2580,8 +2544,6 @@ CHARMAP \x86\x54\x54 |0 \x83\x42\x4B |0 \x83\x42\x50 |0 - \x89\x42\x78 |0 - \x89\x43\x3C |0 \x84\x44\x59 |0 \x83\x47\x73 |0 \x83\x47\x69 |0 @@ -2589,7 +2551,6 @@ CHARMAP \x84\x44\x5A |0 \x84\x44\x5C |0 \x83\x47\x71 |0 - \x89\x49\x58 |0 \x83\x4D\x26 |0 \x83\x4D\x23 |0 \x83\x4D\x2B |0 @@ -2779,7 +2740,6 @@ CHARMAP \x83\x32\x3A |0 \x84\x2A\x37 |0 \x84\x2A\x38 |0 - \x89\x2C\x32 |0 \x84\x33\x2F |0 \x83\x32\x43 |0 \x83\x32\x44 |0 @@ -2800,14 +2760,11 @@ CHARMAP \x83\x3D\x31 |0 \x83\x3D\x30 |0 \x83\x42\x6C |0 - \x89\x3D\x3B |0 \x84\x3E\x59 |0 \x83\x42\x65 |0 \x83\x42\x69 |0 \x85\x40\x4E |0 \x83\x42\x72 |0 - \x89\x43\x49 |0 - \x89\x43\x56 |0 \x83\x48\x24 |0 \x87\x25\x37 |0 \x84\x4B\x22 |0 @@ -2824,15 +2781,11 @@ CHARMAP \x83\x51\x69 |0 \x83\x55\x4A |0 \x84\x56\x6F |0 - \x89\x55\x7A |0 - \x89\x56\x22 |0 \x83\x55\x4E |0 \x84\x5B\x69 |0 \x83\x55\x4C |0 - \x89\x5B\x2D |0 \x83\x58\x31 |0 \x84\x60\x2A |0 - \x89\x62\x78 |0 \x83\x5C\x61 |0 \x84\x2A\x39 |0 \x84\x2A\x3A |0 @@ -2906,7 +2859,6 @@ CHARMAP \x83\x4D\x3F |0 \x84\x56\x78 |0 \x83\x3D\x40 |0 - \x89\x50\x4E |0 \x85\x24\x63 |0 \x86\x28\x62 |0 \x83\x26\x72 |0 @@ -3347,7 +3299,6 @@ CHARMAP \x84\x2A\x6B |0 \x84\x2A\x69 |0 \x84\x2A\x6C |0 - \x89\x2C\x6D |0 \x84\x2E\x65 |0 \x83\x32\x75 |0 \x83\x32\x7A |0 @@ -3973,7 +3924,6 @@ CHARMAP \x83\x2A\x55 |0 \x83\x2A\x50 |0 \x84\x27\x66 |0 - \x89\x28\x52 |0 \x84\x27\x62 |0 \x84\x27\x67 |0 \x84\x27\x63 |0 @@ -4225,7 +4175,6 @@ CHARMAP \x83\x3E\x55 |0 \x86\x4E\x27 |0 \x83\x3E\x4C |0 - \x89\x3E\x6B |0 \x84\x40\x30 |0 \x84\x40\x32 |0 \x84\x3A\x65 |0 @@ -4282,9 +4231,6 @@ CHARMAP \x83\x4E\x49 |0 \x85\x50\x46 |0 \x83\x4E\x50 |0 - \x89\x51\x65 |0 - \x89\x51\x73 |0 - \x89\x51\x76 |0 \x84\x4D\x21 |0 \x84\x4C\x6F |0 \x83\x4E\x51 |0 @@ -4334,7 +4280,6 @@ CHARMAP \x84\x5D\x23 |0 \x87\x42\x38 |0 \x84\x5D\x21 |0 - \x89\x60\x4E |0 \x87\x3B\x32 |0 \x84\x60\x77 |0 \x83\x5C\x73 |0 @@ -4371,7 +4316,6 @@ CHARMAP \x83\x61\x6A |0 \x84\x6D\x79 |0 \x84\x6D\x7B |0 - \x89\x6C\x6C |0 \x84\x6E\x37 |0 \x84\x6E\x36 |0 \x85\x7C\x3E |0 @@ -4483,7 +4427,6 @@ CHARMAP \x83\x5B\x2A |0 \x84\x61\x21 |0 \x84\x61\x25 |0 - \x89\x63\x6E |0 \x85\x6D\x4B |0 \x84\x64\x3B |0 \x84\x64\x3C |0 @@ -4526,7 +4469,6 @@ CHARMAP \x84\x35\x2D |0 \x84\x35\x2E |0 \x84\x35\x2C |0 - \x89\x32\x51 |0 \x84\x3A\x79 |0 \x83\x3E\x71 |0 \x84\x35\x30 |0 @@ -4854,7 +4796,6 @@ CHARMAP \x83\x52\x76 |0 \x87\x3C\x33 |0 \x84\x58\x7A |0 - \x89\x60\x7A |0 \x84\x53\x7E |0 \x83\x5D\x35 |0 \x83\x5E\x64 |0 @@ -4954,7 +4895,6 @@ CHARMAP \x85\x43\x4B |0 \x83\x44\x6C |0 \x83\x44\x6E |0 - \x89\x45\x58 |0 \x85\x4A\x3E |0 \x84\x47\x5E |0 \x84\x47\x61 |0 @@ -4991,7 +4931,6 @@ CHARMAP \x84\x59\x2B |0 \x84\x59\x2C |0 \x84\x59\x26 |0 - \x89\x5C\x78 |0 \x84\x59\x2A |0 \x84\x59\x28 |0 \x83\x56\x53 |0 @@ -5032,7 +4971,6 @@ CHARMAP \x83\x60\x4C |0 \x84\x2B\x4D |0 \x84\x2B\x4E |0 - \x89\x2D\x53 |0 \x83\x34\x22 |0 \x83\x39\x43 |0 \x83\x39\x44 |0 @@ -5083,7 +5021,6 @@ CHARMAP \x84\x64\x60 |0 \x84\x64\x61 |0 \x84\x67\x52 |0 - \x89\x68\x53 |0 \x83\x5F\x68 |0 \x83\x5F\x67 |0 \x83\x60\x7D |0 @@ -5093,13 +5030,11 @@ CHARMAP \x84\x4E\x2E |0 \x83\x5D\x39 |0 \x84\x47\x6B |0 - \x89\x4C\x67 |0 \x83\x4F\x38 |0 \x84\x64\x63 |0 \x87\x50\x56 |0 \x83\x27\x32 |0 \x84\x25\x22 |0 - \x89\x28\x72 |0 \x83\x2A\x6F |0 \x85\x27\x69 |0 \x84\x2B\x53 |0 @@ -5262,7 +5197,6 @@ CHARMAP \x87\x3C\x77 |0 \x84\x59\x45 |0 \x84\x59\x44 |0 - \x89\x5D\x4C |0 \x83\x59\x3F |0 \x83\x59\x41 |0 \x84\x5E\x2F |0 @@ -5284,7 +5218,6 @@ CHARMAP \x83\x5B\x51 |0 \x83\x5B\x4C |0 \x83\x5B\x49 |0 - \x89\x64\x34 |0 \x83\x5D\x3B |0 \x84\x61\x6C |0 \x83\x5D\x40 |0 @@ -5323,7 +5256,6 @@ CHARMAP \x83\x61\x6E |0 \x86\x3C\x65 |0 \x84\x3B\x67 |0 - \x89\x3F\x76 |0 \x84\x41\x49 |0 \x84\x5E\x32 |0 \x83\x39\x5B |0 @@ -5512,7 +5444,6 @@ CHARMAP \x84\x41\x5D |0 \x84\x41\x5F |0 \x83\x45\x4C |0 - \x89\x46\x32 |0 \x86\x5A\x28 |0 \x84\x48\x3A |0 \x84\x48\x40 |0 @@ -5601,7 +5532,6 @@ CHARMAP \x84\x62\x23 |0 \x83\x5F\x75 |0 \x84\x3B\x7B |0 - \x89\x40\x2D |0 \x84\x41\x65 |0 \x84\x41\x64 |0 \x85\x44\x34 |0 @@ -6028,7 +5958,6 @@ CHARMAP \x83\x5B\x78 |0 \x83\x5B\x7B |0 \x83\x5B\x7C |0 - \x89\x64\x72 |0 \x83\x5D\x77 |0 \x84\x65\x55 |0 \x87\x52\x31 |0 @@ -6056,7 +5985,6 @@ CHARMAP \x83\x60\x24 |0 \x84\x69\x7B |0 \x83\x60\x21 |0 - \x89\x6A\x3F |0 \x84\x6B\x3C |0 \x84\x6B\x3D |0 \x84\x6B\x40 |0 @@ -6566,7 +6494,6 @@ CHARMAP \x82\x21\x73 |0 \x82\x21\x76 |0 \x83\x22\x72 |0 - \x89\x21\x71 |0 \x82\x21\x6C |0 \x82\x23\x28 |0 \x84\x23\x39 |0 @@ -6686,7 +6613,6 @@ CHARMAP \x83\x27\x4B |0 \x83\x27\x4A |0 \x83\x27\x4D |0 - \x89\x25\x44 |0 \x81\x4F\x78 |0 \x81\x4F\x6C |0 \x83\x2B\x2D |0 @@ -6741,7 +6667,6 @@ CHARMAP \x81\x4F\x6A |0 \x84\x28\x3F |0 \x83\x2B\x35 |0 - \x89\x29\x2D |0 \x83\x2B\x34 |0 \x83\x64\x4A |0 \x84\x28\x3D |0 @@ -7166,7 +7091,6 @@ CHARMAP \x81\x54\x42 |0 \x83\x2F\x5A |0 \x83\x34\x4D |0 - \x89\x46\x5C |0 \x81\x70\x36 |0 \x81\x27\x2F |0 \x81\x45\x76 |0 @@ -7225,7 +7149,6 @@ CHARMAP \x83\x21\x51 |0 \x83\x21\x7B |0 \x83\x23\x22 |0 - \x89\x22\x59 |0 \x83\x24\x5B |0 \x83\x27\x59 |0 \x84\x25\x45 |0 @@ -7333,7 +7256,6 @@ CHARMAP \x83\x2F\x66 |0 \x83\x2F\x61 |0 \x83\x2F\x63 |0 - \x89\x2E\x2D |0 \x83\x2F\x64 |0 \x83\x34\x50 |0 \x81\x5E\x37 |0 @@ -7481,7 +7403,6 @@ CHARMAP \x81\x45\x25 |0 \x81\x45\x26 |0 \x83\x21\x56 |0 - \x89\x21\x30 |0 \x83\x22\x23 |0 \x83\x22\x22 |0 \x81\x45\x7D |0 @@ -7555,7 +7476,6 @@ CHARMAP \x83\x23\x2A |0 \x82\x21\x4E |0 \x82\x22\x23 |0 - \x89\x22\x2C |0 \x83\x23\x2B |0 \x83\x23\x2D |0 \x81\x4C\x38 |0 @@ -7646,7 +7566,6 @@ CHARMAP \x81\x6C\x30 |0 \x83\x54\x45 |0 \x82\x65\x3B |0 - \x89\x6D\x2E |0 \x83\x21\x2B |0 \x83\x21\x5C |0 \x84\x21\x45 |0 @@ -7709,7 +7628,6 @@ CHARMAP \x83\x22\x2E |0 \x81\x46\x33 |0 \x83\x22\x2F |0 - \x89\x21\x50 |0 \x81\x46\x3D |0 \x81\x46\x32 |0 \x84\x21\x6A |0 @@ -7856,7 +7774,6 @@ CHARMAP \x81\x4C\x42 |0 \x82\x25\x6C |0 \x81\x4C\x50 |0 - \x89\x25\x71 |0 \x83\x2B\x5C |0 \x83\x2B\x5D |0 \x82\x29\x49 |0 @@ -7970,9 +7887,6 @@ CHARMAP \x83\x2F\x7E |0 \x83\x30\x25 |0 \x82\x2E\x3A |0 - \x89\x29\x54 |0 - \x89\x2E\x42 |0 - \x89\x2E\x4A |0 \x82\x2E\x33 |0 \x81\x54\x63 |0 \x83\x67\x21 |0 @@ -8101,7 +8015,6 @@ CHARMAP \x82\x3A\x4D |0 \x81\x5E\x4C |0 \x83\x3A\x3B |0 - \x89\x39\x71 |0 \x81\x5E\x53 |0 \x81\x5E\x4F |0 \x81\x5E\x4B |0 @@ -8157,7 +8070,6 @@ CHARMAP \x83\x67\x25 |0 \x81\x63\x49 |0 \x83\x67\x24 |0 - \x89\x40\x62 |0 \x82\x42\x24 |0 \x83\x64\x58 |0 \x81\x68\x35 |0 @@ -8284,7 +8196,6 @@ CHARMAP \x82\x56\x50 |0 \x81\x70\x40 |0 \x81\x70\x3D |0 - \x89\x53\x5D |0 \x83\x50\x3D |0 \x83\x54\x48 |0 \x82\x5C\x52 |0 @@ -8385,7 +8296,6 @@ CHARMAP \x82\x23\x49 |0 \x83\x25\x2C |0 \x82\x23\x48 |0 - \x89\x23\x50 |0 \x83\x25\x26 |0 \x81\x49\x59 |0 \x81\x49\x5C |0 @@ -8489,7 +8399,6 @@ CHARMAP \x83\x25\x38 |0 \x83\x25\x37 |0 \x83\x64\x5F |0 - \x89\x23\x52 |0 \x83\x25\x35 |0 \x81\x4C\x5B |0 \x82\x25\x7E |0 @@ -8527,7 +8436,6 @@ CHARMAP \x81\x50\x4D |0 \x81\x4C\x57 |0 \x84\x25\x6E |0 - \x89\x26\x33 |0 \x83\x64\x60 |0 \x81\x50\x4E |0 \x82\x29\x55 |0 @@ -8560,8 +8468,6 @@ CHARMAP \x83\x2B\x72 |0 \x83\x2B\x6E |0 \x84\x28\x60 |0 - \x89\x29\x6A |0 - \x89\x29\x71 |0 \x83\x2B\x66 |0 \x81\x50\x53 |0 \x84\x28\x5E |0 @@ -8598,7 +8504,6 @@ CHARMAP \x84\x2C\x33 |0 \x81\x54\x6A |0 \x82\x2E\x4E |0 - \x89\x2E\x5C |0 \x83\x30\x32 |0 \x82\x34\x34 |0 \x83\x34\x6E |0 @@ -8697,8 +8602,6 @@ CHARMAP \x82\x42\x36 |0 \x83\x3A\x4B |0 \x82\x3A\x6E |0 - \x89\x39\x7D |0 - \x89\x39\x7E |0 \x84\x3C\x57 |0 \x84\x36\x6D |0 \x84\x36\x71 |0 @@ -9224,7 +9127,6 @@ CHARMAP \x83\x35\x34 |0 \x82\x34\x6B |0 \x83\x35\x32 |0 - \x89\x33\x73 |0 \x83\x35\x37 |0 \x83\x35\x35 |0 \x81\x5E\x65 |0 @@ -9521,7 +9423,6 @@ CHARMAP \x81\x50\x68 |0 \x82\x2E\x68 |0 \x82\x29\x78 |0 - \x89\x2A\x39 |0 \x83\x2C\x32 |0 \x82\x2E\x6A |0 \x82\x2E\x69 |0 @@ -9540,7 +9441,6 @@ CHARMAP \x84\x2C\x48 |0 \x83\x30\x56 |0 \x83\x30\x55 |0 - \x89\x2E\x7E |0 \x81\x59\x6E |0 \x82\x34\x75 |0 \x82\x34\x74 |0 @@ -9643,7 +9543,6 @@ CHARMAP \x82\x23\x5F |0 \x83\x25\x5F |0 \x81\x49\x7C |0 - \x89\x25\x54 |0 \x83\x2C\x35 |0 \x82\x3B\x3C |0 \x81\x5E\x73 |0 @@ -9718,7 +9617,6 @@ CHARMAP \x84\x22\x60 |0 \x82\x22\x39 |0 \x83\x23\x5A |0 - \x89\x22\x47 |0 \x83\x25\x61 |0 \x83\x25\x66 |0 \x82\x23\x67 |0 @@ -9737,7 +9635,6 @@ CHARMAP \x82\x23\x68 |0 \x81\x4A\x25 |0 \x82\x23\x69 |0 - \x89\x23\x7C |0 \x83\x25\x63 |0 \x82\x26\x49 |0 \x83\x28\x5D |0 @@ -10155,7 +10052,6 @@ CHARMAP \x81\x6C\x58 |0 \x81\x6C\x56 |0 \x81\x68\x5C |0 - \x89\x4E\x5E |0 \x83\x64\x73 |0 \x82\x56\x77 |0 \x82\x56\x75 |0 @@ -10318,7 +10214,6 @@ CHARMAP \x83\x22\x49 |0 \x83\x23\x62 |0 \x81\x48\x22 |0 - \x89\x22\x4E |0 \x83\x3B\x42 |0 \x81\x63\x6F |0 \x81\x44\x5E |0 @@ -10364,7 +10259,6 @@ CHARMAP \x83\x3B\x44 |0 \x84\x3D\x30 |0 \x82\x42\x68 |0 - \x89\x41\x3F |0 \x83\x41\x22 |0 \x82\x4A\x26 |0 \x82\x4A\x25 |0 @@ -10390,7 +10284,6 @@ CHARMAP \x81\x63\x70 |0 \x83\x41\x23 |0 \x83\x50\x5E |0 - \x89\x54\x43 |0 \x83\x57\x64 |0 \x81\x76\x41 |0 \x83\x61\x64 |0 @@ -11125,7 +11018,6 @@ CHARMAP \x82\x22\x4C |0 \x82\x22\x47 |0 \x83\x23\x6E |0 - \x89\x22\x51 |0 \x81\x4A\x43 |0 \x81\x4A\x4C |0 \x81\x4A\x4A |0 @@ -11177,7 +11069,6 @@ CHARMAP \x83\x26\x38 |0 \x83\x26\x31 |0 \x83\x64\x7B |0 - \x89\x24\x39 |0 \x83\x26\x32 |0 \x83\x29\x31 |0 \x83\x29\x2A |0 @@ -11208,7 +11099,6 @@ CHARMAP \x83\x29\x34 |0 \x83\x29\x32 |0 \x81\x4D\x5A |0 - \x89\x27\x30 |0 \x81\x4D\x58 |0 \x83\x29\x33 |0 \x81\x4D\x70 |0 @@ -11935,7 +11825,6 @@ CHARMAP \x81\x69\x22 |0 \x81\x69\x21 |0 \x84\x50\x4F |0 - \x89\x54\x64 |0 \x82\x5C\x7C |0 \x82\x61\x65 |0 \x83\x5A\x3F |0 @@ -11997,7 +11886,6 @@ CHARMAP \x84\x26\x61 |0 \x83\x29\x40 |0 \x83\x29\x41 |0 - \x89\x27\x3E |0 \x83\x2C\x7E |0 \x83\x2C\x7A |0 \x82\x2A\x70 |0 @@ -12212,7 +12100,6 @@ CHARMAP \x81\x51\x57 |0 \x81\x55\x73 |0 \x81\x5B\x2A |0 - \x89\x32\x73 |0 \x81\x59\x37 |0 \x81\x5F\x64 |0 \x81\x5F\x65 |0 @@ -12279,8 +12166,6 @@ CHARMAP \x81\x48\x35 |0 \x82\x22\x50 |0 \x82\x22\x55 |0 - \x89\x22\x58 |0 - \x89\x22\x57 |0 \x83\x26\x48 |0 \x82\x24\x3E |0 \x81\x4A\x5F |0 @@ -12311,9 +12196,7 @@ CHARMAP \x81\x4A\x56 |0 \x81\x4A\x60 |0 \x83\x26\x4A |0 - \x89\x24\x22 |0 \x84\x24\x46 |0 - \x89\x24\x53 |0 \x81\x4E\x3A |0 \x83\x29\x47 |0 \x82\x27\x35 |0 @@ -12368,11 +12251,9 @@ CHARMAP \x81\x4E\x2E |0 \x84\x26\x6A |0 \x82\x27\x41 |0 - \x89\x27\x4E |0 \x83\x29\x4E |0 \x83\x29\x4C |0 \x83\x65\x28 |0 - \x89\x27\x50 |0 \x83\x65\x29 |0 \x82\x2B\x3D |0 \x81\x51\x5F |0 @@ -12461,7 +12342,6 @@ CHARMAP \x83\x2D\x38 |0 \x83\x65\x2B |0 \x83\x65\x2A |0 - \x89\x2B\x48 |0 \x82\x2F\x6E |0 \x81\x56\x2E |0 \x82\x2F\x6F |0 @@ -12531,7 +12411,6 @@ CHARMAP \x81\x55\x7E |0 \x83\x31\x62 |0 \x83\x31\x58 |0 - \x89\x30\x24 |0 \x83\x31\x61 |0 \x83\x31\x60 |0 \x83\x65\x2D |0 @@ -12614,7 +12493,6 @@ CHARMAP \x83\x36\x52 |0 \x83\x36\x5E |0 \x83\x36\x5F |0 - \x89\x35\x57 |0 \x83\x36\x56 |0 \x83\x3C\x45 |0 \x81\x5B\x39 |0 @@ -12699,17 +12577,13 @@ CHARMAP \x82\x3C\x5B |0 \x82\x3C\x67 |0 \x82\x3C\x7A |0 - \x89\x3B\x70 |0 \x82\x3C\x6F |0 \x83\x3C\x3C |0 - \x89\x3C\x21 |0 \x83\x3C\x44 |0 \x83\x3C\x33 |0 \x82\x3C\x7B |0 - \x89\x3C\x29 |0 \x83\x65\x2F |0 \x82\x3C\x51 |0 - \x89\x3B\x6E |0 \x83\x65\x2E |0 \x83\x3C\x40 |0 \x82\x43\x78 |0 @@ -12791,14 +12665,10 @@ CHARMAP \x82\x43\x79 |0 \x83\x41\x6A |0 \x83\x41\x7B |0 - \x89\x42\x49 |0 - \x89\x42\x47 |0 \x81\x64\x4D |0 \x82\x45\x2C |0 \x83\x41\x72 |0 \x81\x64\x54 |0 - \x89\x42\x28 |0 - \x89\x42\x3C |0 \x82\x4A\x70 |0 \x82\x4A\x6E |0 \x83\x47\x3A |0 @@ -12950,7 +12820,6 @@ CHARMAP \x82\x57\x55 |0 \x83\x4C\x5E |0 \x83\x4C\x59 |0 - \x89\x4F\x42 |0 \x83\x4C\x61 |0 \x83\x65\x30 |0 \x82\x57\x4D |0 @@ -13017,10 +12886,8 @@ CHARMAP \x82\x57\x5F |0 \x83\x51\x41 |0 \x83\x51\x3A |0 - \x89\x54\x7B |0 \x82\x57\x52 |0 \x83\x65\x31 |0 - \x89\x55\x29 |0 \x83\x65\x32 |0 \x83\x54\x75 |0 \x81\x73\x78 |0 @@ -13160,7 +13027,6 @@ CHARMAP \x82\x6D\x54 |0 \x81\x7B\x62 |0 \x82\x6D\x52 |0 - \x89\x69\x4C |0 \x83\x65\x36 |0 \x83\x65\x37 |0 \x82\x6F\x31 |0 @@ -13169,7 +13035,6 @@ CHARMAP \x82\x6F\x30 |0 \x82\x70\x3A |0 \x83\x60\x74 |0 - \x89\x6B\x51 |0 \x81\x7D\x23 |0 \x82\x71\x23 |0 \x82\x71\x21 |0 @@ -13237,7 +13102,6 @@ CHARMAP \x83\x51\x46 |0 \x83\x51\x45 |0 \x81\x71\x24 |0 - \x89\x55\x39 |0 \x82\x5D\x37 |0 \x81\x73\x7C |0 \x83\x55\x2B |0 @@ -13380,7 +13244,6 @@ CHARMAP \x82\x3D\x29 |0 \x82\x3D\x2A |0 \x83\x3C\x4D |0 - \x89\x3C\x3C |0 \x83\x65\x3A |0 \x82\x44\x27 |0 \x82\x44\x28 |0 @@ -13454,7 +13317,6 @@ CHARMAP \x83\x22\x58 |0 \x83\x22\x59 |0 \x82\x22\x59 |0 - \x89\x21\x66 |0 \x82\x22\x5D |0 \x82\x22\x5F |0 \x82\x22\x60 |0 @@ -13479,7 +13341,6 @@ CHARMAP \x81\x48\x40 |0 \x81\x48\x41 |0 \x81\x48\x44 |0 - \x89\x22\x5D |0 \x83\x65\x3C |0 \x82\x24\x5B |0 \x82\x24\x59 |0 @@ -13543,7 +13404,6 @@ CHARMAP \x83\x26\x5C |0 \x83\x26\x59 |0 \x83\x26\x56 |0 - \x89\x24\x68 |0 \x83\x26\x5B |0 \x81\x4E\x4D |0 \x81\x4E\x5D |0 @@ -13864,7 +13724,6 @@ CHARMAP \x83\x36\x7D |0 \x83\x65\x3E |0 \x83\x37\x29 |0 - \x89\x36\x29 |0 \x83\x37\x27 |0 \x83\x3C\x54 |0 \x81\x60\x47 |0 @@ -13964,13 +13823,11 @@ CHARMAP \x82\x3D\x54 |0 \x82\x3D\x52 |0 \x82\x3D\x56 |0 - \x89\x3C\x5D |0 \x83\x3C\x62 |0 \x83\x65\x42 |0 \x84\x38\x5E |0 \x83\x3C\x63 |0 \x83\x3C\x68 |0 - \x89\x3C\x47 |0 \x83\x65\x40 |0 \x84\x38\x5F |0 \x82\x3D\x31 |0 @@ -14153,7 +14010,6 @@ CHARMAP \x82\x4B\x53 |0 \x83\x47\x61 |0 \x84\x44\x52 |0 - \x89\x4F\x79 |0 \x83\x65\x44 |0 \x83\x65\x45 |0 \x83\x47\x66 |0 @@ -14234,7 +14090,6 @@ CHARMAP \x81\x6D\x58 |0 \x84\x4A\x64 |0 \x83\x65\x47 |0 - \x89\x4F\x7D |0 \x83\x65\x46 |0 \x82\x57\x7E |0 \x83\x51\x56 |0 @@ -14454,7 +14309,6 @@ CHARMAP \x81\x4B\x23 |0 \x81\x4B\x24 |0 \x83\x26\x60 |0 - \x89\x24\x71 |0 \x83\x29\x77 |0 \x82\x27\x78 |0 \x82\x27\x7A |0 @@ -14604,7 +14458,6 @@ CHARMAP \x81\x60\x50 |0 \x83\x3C\x7C |0 \x82\x3D\x67 |0 - \x89\x3C\x7E |0 \x83\x3C\x6F |0 \x83\x3C\x7A |0 \x83\x3C\x72 |0 @@ -14707,10 +14560,8 @@ CHARMAP \x81\x69\x5E |0 \x83\x65\x5B |0 \x81\x69\x59 |0 - \x89\x49\x4B |0 \x83\x65\x5A |0 \x82\x4B\x6A |0 - \x89\x49\x5F |0 \x81\x69\x5A |0 \x82\x51\x6F |0 \x82\x51\x6C |0 @@ -14803,7 +14654,6 @@ CHARMAP \x82\x5D\x4B |0 \x83\x55\x42 |0 \x81\x74\x38 |0 - \x89\x5A\x73 |0 \x81\x76\x63 |0 \x82\x62\x29 |0 \x83\x58\x2D |0 @@ -15188,7 +15038,6 @@ CHARMAP \x82\x22\x65 |0 \x83\x24\x2F |0 \x84\x23\x2A |0 - \x89\x22\x66 |0 \x82\x24\x6C |0 \x82\x24\x6A |0 \x82\x24\x6B |0 @@ -15304,7 +15153,6 @@ CHARMAP \x82\x37\x3B |0 \x81\x5C\x23 |0 \x83\x65\x65 |0 - \x89\x36\x57 |0 \x83\x3D\x36 |0 \x83\x3D\x3A |0 \x82\x3E\x24 |0 @@ -15403,7 +15251,6 @@ CHARMAP \x83\x48\x27 |0 \x82\x4B\x77 |0 \x83\x48\x23 |0 - \x89\x49\x76 |0 \x82\x52\x33 |0 \x83\x4D\x31 |0 \x83\x4D\x3B |0 @@ -15523,7 +15370,6 @@ CHARMAP \x82\x31\x22 |0 \x81\x5C\x25 |0 \x81\x5C\x26 |0 - \x89\x36\x67 |0 \x83\x3D\x3D |0 \x84\x39\x25 |0 \x82\x3E\x2F |0 @@ -15605,8 +15451,6 @@ CHARMAP \x81\x52\x4D |0 \x81\x52\x4B |0 \x83\x2E\x26 |0 - \x89\x2B\x7A |0 - \x89\x2C\x4A |0 \x81\x56\x63 |0 \x83\x32\x4E |0 \x83\x32\x4D |0 @@ -15951,7 +15795,6 @@ CHARMAP \x83\x37\x50 |0 \x83\x37\x52 |0 \x83\x37\x51 |0 - \x89\x37\x23 |0 \x83\x3D\x4F |0 \x82\x3E\x3D |0 \x81\x5C\x36 |0 @@ -16226,7 +16069,6 @@ CHARMAP \x81\x46\x7B |0 \x83\x26\x7B |0 \x83\x26\x7C |0 - \x89\x25\x23 |0 \x82\x28\x41 |0 \x82\x28\x3C |0 \x82\x28\x3E |0 @@ -16234,7 +16076,6 @@ CHARMAP \x82\x28\x3F |0 \x82\x28\x3D |0 \x81\x4F\x22 |0 - \x89\x28\x34 |0 \x81\x52\x65 |0 \x82\x2C\x54 |0 \x83\x2E\x39 |0 @@ -16255,7 +16096,6 @@ CHARMAP \x82\x2C\x55 |0 \x81\x52\x66 |0 \x83\x2E\x3D |0 - \x89\x2C\x5C |0 \x83\x65\x6D |0 \x83\x65\x6E |0 \x81\x57\x21 |0 @@ -16365,7 +16205,6 @@ CHARMAP \x81\x65\x52 |0 \x82\x45\x55 |0 \x82\x45\x4B |0 - \x89\x44\x25 |0 \x84\x45\x53 |0 \x82\x4C\x3A |0 \x81\x69\x77 |0 @@ -16392,7 +16231,6 @@ CHARMAP \x82\x4C\x35 |0 \x83\x65\x73 |0 \x83\x48\x40 |0 - \x89\x4A\x3F |0 \x81\x6D\x7D |0 \x82\x52\x49 |0 \x81\x6E\x23 |0 @@ -16510,7 +16348,6 @@ CHARMAP \x82\x6B\x70 |0 \x83\x5E\x44 |0 \x82\x6D\x64 |0 - \x89\x6A\x66 |0 \x83\x60\x3C |0 \x82\x70\x43 |0 \x82\x71\x2A |0 @@ -16700,7 +16537,6 @@ CHARMAP \x83\x37\x6C |0 \x82\x37\x67 |0 \x81\x5C\x43 |0 - \x89\x37\x3F |0 \x83\x3D\x65 |0 \x81\x61\x25 |0 \x86\x4C\x48 |0 @@ -16750,7 +16586,6 @@ CHARMAP \x82\x4C\x4D |0 \x81\x6A\x22 |0 \x83\x48\x52 |0 - \x89\x4A\x64 |0 \x84\x4B\x63 |0 \x84\x45\x5E |0 \x84\x4B\x6B |0 @@ -16778,7 +16613,6 @@ CHARMAP \x81\x71\x58 |0 \x81\x71\x59 |0 \x83\x52\x2C |0 - \x89\x5B\x59 |0 \x83\x52\x29 |0 \x82\x5E\x22 |0 \x84\x57\x49 |0 @@ -16898,7 +16732,6 @@ CHARMAP \x83\x2E\x4D |0 \x83\x2E\x4B |0 \x83\x2E\x4C |0 - \x89\x2C\x76 |0 \x82\x31\x60 |0 \x81\x57\x3B |0 \x83\x33\x23 |0 @@ -16991,9 +16824,7 @@ CHARMAP \x83\x37\x7A |0 \x83\x65\x7D |0 \x82\x37\x7E |0 - \x89\x37\x4D |0 \x82\x37\x6F |0 - \x89\x36\x7E |0 \x85\x3B\x24 |0 \x82\x3E\x68 |0 \x83\x3D\x7B |0 @@ -17049,7 +16880,6 @@ CHARMAP \x81\x65\x66 |0 \x82\x45\x76 |0 \x83\x43\x51 |0 - \x89\x44\x45 |0 \x83\x48\x56 |0 \x82\x4C\x64 |0 \x83\x48\x58 |0 @@ -17237,7 +17067,6 @@ CHARMAP \x81\x7A\x24 |0 \x81\x7A\x26 |0 \x83\x66\x25 |0 - \x89\x65\x67 |0 \x81\x7A\x7B |0 \x83\x5E\x4C |0 \x84\x66\x6F |0 @@ -17283,7 +17112,6 @@ CHARMAP \x83\x2E\x54 |0 \x83\x2E\x53 |0 \x81\x52\x76 |0 - \x89\x2D\x21 |0 \x82\x2C\x68 |0 \x82\x2C\x69 |0 \x82\x2C\x6A |0 @@ -17324,8 +17152,6 @@ CHARMAP \x83\x3D\x7E |0 \x82\x3E\x6D |0 \x83\x66\x27 |0 - \x89\x3E\x21 |0 - \x89\x3E\x23 |0 \x83\x43\x58 |0 \x82\x45\x7B |0 \x83\x43\x5C |0 @@ -17344,8 +17170,6 @@ CHARMAP \x81\x6A\x33 |0 \x81\x6A\x34 |0 \x82\x4C\x66 |0 - \x89\x4B\x27 |0 - \x89\x4B\x2B |0 \x83\x4D\x6F |0 \x83\x4D\x71 |0 \x83\x4D\x6D |0 @@ -17479,7 +17303,6 @@ CHARMAP \x83\x38\x2E |0 \x83\x38\x24 |0 \x82\x38\x33 |0 - \x89\x37\x54 |0 \x83\x38\x2B |0 \x83\x3E\x34 |0 \x82\x3F\x21 |0 @@ -17812,7 +17635,6 @@ CHARMAP \x82\x30\x52 |0 \x81\x57\x4D |0 \x83\x38\x31 |0 - \x89\x31\x78 |0 \x81\x5C\x5F |0 \x82\x3F\x22 |0 \x82\x3F\x23 |0 @@ -17835,7 +17657,6 @@ CHARMAP \x84\x22\x21 |0 \x81\x4F\x2C |0 \x81\x4B\x38 |0 - \x89\x28\x4A |0 \x82\x2C\x6E |0 \x83\x2A\x4E |0 \x82\x32\x24 |0 @@ -18558,7 +18379,6 @@ CHARMAP \x81\x4B\x40 |0 \x81\x75\x29 |0 \x81\x48\x63 |0 - \x89\x32\x32 |0 \x82\x38\x5C |0 \x82\x3F\x40 |0 \x83\x5A\x7C |0 @@ -18636,7 +18456,6 @@ CHARMAP \x82\x28\x62 |0 \x82\x28\x64 |0 \x83\x2A\x5E |0 - \x89\x28\x63 |0 \x83\x2A\x68 |0 \x84\x27\x7B |0 \x83\x2E\x76 |0 @@ -18839,7 +18658,6 @@ CHARMAP \x82\x38\x75 |0 \x82\x38\x78 |0 \x83\x38\x5F |0 - \x89\x37\x78 |0 \x81\x5C\x7A |0 \x84\x3A\x68 |0 \x82\x3F\x51 |0 @@ -18898,7 +18716,6 @@ CHARMAP \x81\x61\x60 |0 \x82\x3F\x5B |0 \x82\x3F\x4B |0 - \x89\x3E\x66 |0 \x81\x61\x58 |0 \x82\x3F\x43 |0 \x82\x3F\x65 |0 @@ -19505,7 +19322,6 @@ CHARMAP \x81\x53\x4D |0 \x82\x2D\x49 |0 \x83\x2F\x24 |0 - \x89\x2D\x3E |0 \x83\x33\x69 |0 \x82\x32\x66 |0 \x82\x32\x63 |0 @@ -19577,7 +19393,6 @@ CHARMAP \x84\x35\x26 |0 \x81\x5D\x30 |0 \x82\x39\x2D |0 - \x89\x38\x3A |0 \x81\x61\x77 |0 \x82\x40\x25 |0 \x84\x3A\x71 |0 @@ -19687,7 +19502,6 @@ CHARMAP \x82\x4D\x68 |0 \x82\x4D\x74 |0 \x82\x4D\x66 |0 - \x89\x4C\x33 |0 \x83\x49\x4E |0 \x82\x4D\x6A |0 \x83\x49\x4B |0 @@ -20274,7 +20088,6 @@ CHARMAP \x83\x5B\x31 |0 \x82\x67\x21 |0 \x82\x66\x7E |0 - \x89\x63\x77 |0 \x82\x69\x78 |0 \x81\x7A\x3C |0 \x83\x5D\x2A |0 @@ -21262,7 +21075,6 @@ CHARMAP \x81\x4B\x4E |0 \x81\x58\x45 |0 \x83\x39\x3F |0 - \x89\x38\x6C |0 \x83\x39\x40 |0 \x83\x3F\x40 |0 \x83\x44\x73 |0 @@ -21276,7 +21088,6 @@ CHARMAP \x81\x6F\x41 |0 \x83\x66\x52 |0 \x82\x5A\x74 |0 - \x89\x58\x33 |0 \x83\x59\x35 |0 \x81\x77\x4A |0 \x83\x59\x36 |0 @@ -21463,11 +21274,8 @@ CHARMAP \x82\x67\x47 |0 \x83\x27\x2F |0 \x84\x21\x54 |0 - \x89\x21\x6A |0 \x84\x23\x30 |0 \x83\x24\x3B |0 - \x89\x22\x71 |0 - \x89\x22\x72 |0 \x83\x27\x30 |0 \x82\x25\x26 |0 \x84\x25\x21 |0 @@ -21478,7 +21286,6 @@ CHARMAP \x81\x4B\x54 |0 \x81\x4B\x53 |0 \x83\x27\x31 |0 - \x89\x25\x32 |0 \x82\x25\x25 |0 \x83\x2A\x72 |0 \x82\x28\x6D |0 @@ -21496,8 +21303,6 @@ CHARMAP \x82\x28\x72 |0 \x83\x2A\x73 |0 \x83\x2A\x71 |0 - \x89\x28\x71 |0 - \x89\x28\x6E |0 \x82\x2D\x57 |0 \x82\x2D\x55 |0 \x81\x53\x5F |0 @@ -21622,7 +21427,6 @@ CHARMAP \x83\x4A\x26 |0 \x81\x6B\x45 |0 \x81\x6B\x42 |0 - \x89\x4C\x6B |0 \x84\x4E\x32 |0 \x82\x54\x7A |0 \x81\x6F\x4D |0 @@ -21724,7 +21528,6 @@ CHARMAP \x84\x41\x39 |0 \x83\x2F\x3B |0 \x81\x53\x67 |0 - \x89\x45\x6D |0 \x82\x39\x71 |0 \x82\x2D\x5B |0 \x82\x33\x36 |0 @@ -22116,7 +21919,6 @@ CHARMAP \x83\x66\x5A |0 \x84\x47\x75 |0 \x82\x4E\x60 |0 - \x89\x4D\x22 |0 \x81\x6B\x4F |0 \x82\x4E\x6A |0 \x82\x4E\x62 |0 @@ -22172,7 +21974,6 @@ CHARMAP \x81\x6B\x50 |0 \x83\x4A\x32 |0 \x83\x4A\x37 |0 - \x89\x4D\x27 |0 \x83\x67\x2A |0 \x83\x4A\x31 |0 \x81\x6F\x63 |0 @@ -22239,7 +22040,6 @@ CHARMAP \x82\x55\x3A |0 \x81\x6F\x62 |0 \x82\x55\x33 |0 - \x89\x52\x6B |0 \x83\x4F\x4D |0 \x83\x66\x5B |0 \x83\x66\x5C |0 @@ -22311,12 +22111,9 @@ CHARMAP \x84\x54\x45 |0 \x82\x5B\x32 |0 \x82\x5B\x47 |0 - \x89\x58\x59 |0 - \x89\x58\x48 |0 \x82\x5B\x33 |0 \x87\x34\x63 |0 \x83\x66\x5D |0 - \x89\x58\x55 |0 \x83\x66\x5E |0 \x84\x54\x49 |0 \x83\x53\x31 |0 @@ -22383,9 +22180,7 @@ CHARMAP \x81\x75\x6D |0 \x82\x5F\x7A |0 \x84\x59\x46 |0 - \x89\x5D\x41 |0 \x83\x66\x5F |0 - \x89\x5D\x39 |0 \x82\x64\x2C |0 \x82\x64\x25 |0 \x81\x77\x54 |0 @@ -22435,12 +22230,10 @@ CHARMAP \x84\x5E\x29 |0 \x82\x64\x22 |0 \x83\x59\x46 |0 - \x89\x61\x33 |0 \x83\x59\x45 |0 \x83\x66\x61 |0 \x83\x66\x62 |0 \x83\x66\x60 |0 - \x89\x61\x43 |0 \x82\x67\x5F |0 \x83\x5B\x50 |0 \x82\x67\x4F |0 @@ -22540,7 +22333,6 @@ CHARMAP \x83\x66\x66 |0 \x83\x66\x67 |0 \x83\x66\x68 |0 - \x89\x66\x57 |0 \x83\x5D\x46 |0 \x82\x6A\x3E |0 \x82\x6C\x50 |0 @@ -22662,7 +22454,6 @@ CHARMAP \x81\x62\x66 |0 \x81\x62\x62 |0 \x83\x3F\x6C |0 - \x89\x3F\x7E |0 \x83\x66\x6B |0 \x81\x67\x50 |0 \x83\x45\x3C |0 @@ -22672,7 +22463,6 @@ CHARMAP \x84\x41\x53 |0 \x82\x48\x55 |0 \x82\x48\x53 |0 - \x89\x45\x7B |0 \x81\x6B\x5B |0 \x83\x4A\x3D |0 \x81\x6B\x5E |0 @@ -22740,7 +22530,6 @@ CHARMAP \x82\x6C\x5B |0 \x82\x6C\x5A |0 \x82\x6C\x59 |0 - \x89\x68\x72 |0 \x83\x66\x6D |0 \x81\x4F\x5D |0 \x83\x21\x43 |0 @@ -22889,7 +22678,6 @@ CHARMAP \x81\x58\x69 |0 \x82\x33\x4A |0 \x83\x34\x39 |0 - \x89\x32\x6F |0 \x82\x3A\x30 |0 \x81\x5D\x7A |0 \x81\x62\x72 |0 @@ -22933,7 +22721,6 @@ CHARMAP \x81\x4F\x64 |0 \x81\x5D\x7C |0 \x81\x5D\x7B |0 - \x89\x39\x2A |0 \x83\x3F\x7E |0 \x83\x3F\x7C |0 \x83\x3F\x7B |0 @@ -23877,7 +23664,6 @@ CHARMAP \x82\x56\x2A |0 \x82\x56\x29 |0 \x81\x70\x26 |0 - \x89\x53\x3E |0 \x82\x5C\x2B |0 \x82\x5C\x26 |0 \x82\x5C\x24 |0 @@ -23906,7 +23692,6 @@ CHARMAP \x82\x5C\x28 |0 \x83\x53\x79 |0 \x82\x5C\x2C |0 - \x89\x59\x38 |0 \x83\x66\x73 |0 \x83\x57\x44 |0 \x82\x60\x76 |0 @@ -23932,7 +23717,6 @@ CHARMAP \x81\x76\x2D |0 \x82\x61\x23 |0 \x84\x5A\x45 |0 - \x89\x5D\x76 |0 \x84\x5A\x43 |0 \x82\x64\x72 |0 \x82\x64\x75 |0 @@ -23959,7 +23743,6 @@ CHARMAP \x83\x59\x76 |0 \x83\x59\x75 |0 \x83\x57\x43 |0 - \x89\x61\x72 |0 \x83\x59\x71 |0 \x82\x64\x74 |0 \x82\x68\x3C |0 @@ -23991,7 +23774,6 @@ CHARMAP \x83\x5B\x7A |0 \x84\x62\x68 |0 \x82\x68\x3B |0 - \x89\x64\x6B |0 \x84\x62\x55 |0 \x83\x5D\x6F |0 \x82\x6A\x7A |0 @@ -24047,7 +23829,6 @@ CHARMAP \x82\x6C\x78 |0 \x81\x7B\x4B |0 \x83\x5F\x2A |0 - \x89\x69\x2A |0 \x81\x7C\x2B |0 \x82\x6E\x61 |0 \x82\x6E\x5C |0 @@ -24070,7 +23851,6 @@ CHARMAP \x82\x6E\x5A |0 \x83\x60\x22 |0 \x82\x6E\x57 |0 - \x89\x6A\x3E |0 \x82\x6E\x58 |0 \x81\x7C\x2A |0 \x82\x6F\x68 |0 @@ -24209,7 +23989,6 @@ CHARMAP \x82\x61\x2F |0 \x83\x57\x4A |0 \x82\x61\x2D |0 - \x89\x5E\x24 |0 \x83\x66\x75 |0 \x82\x64\x7C |0 \x82\x64\x7E |0 @@ -24237,7 +24016,6 @@ CHARMAP \x81\x79\x59 |0 \x84\x5F\x34 |0 \x83\x59\x7A |0 - \x89\x61\x77 |0 \x83\x5B\x7D |0 \x82\x61\x26 |0 \x82\x68\x5E |0 @@ -24488,7 +24266,6 @@ CHARMAP \x81\x6B\x7B |0 \x83\x4B\x22 |0 \x81\x70\x2C |0 - \x89\x61\x7C |0 \x82\x68\x61 |0 \x83\x5E\x22 |0 \x82\x70\x24 |0 @@ -24682,7 +24459,6 @@ CHARMAP \x84\x6E\x55 |0 \x83\x62\x42 |0 \x82\x72\x44 |0 - \x89\x21\x59 |0 \x81\x73\x3F |0 \x83\x5E\x47 |0 \x84\x6E\x33 |0 @@ -24740,7 +24516,6 @@ CHARMAP \x81\x22\x6D |0 \x81\x22\x6E |0 \x85\x21\x25 |0 - \x89\x21\x21 |0 \x86\x21\x2F |0 \x86\x21\x2D |0 \x86\x21\x2E |0 @@ -24748,8 +24523,6 @@ CHARMAP \x86\x21\x43 |0 \x85\x21\x33 |0 \x83\x21\x44 |0 - \x89\x21\x3E |0 - \x89\x21\x3F |0 \x86\x22\x2B |0 \x85\x21\x4D |0 \x86\x23\x40 |0 @@ -24758,29 +24531,17 @@ CHARMAP \x86\x24\x67 |0 \x86\x25\x5F |0 \x85\x23\x2F |0 - \x89\x22\x74 |0 \x86\x25\x67 |0 \x86\x25\x63 |0 \x86\x29\x37 |0 \x86\x29\x3A |0 \x86\x29\x38 |0 - \x89\x29\x22 |0 - \x89\x29\x23 |0 \x86\x2E\x66 |0 \x85\x30\x72 |0 \x85\x33\x23 |0 - \x89\x39\x32 |0 - \x89\x39\x33 |0 \x86\x47\x2D |0 - \x89\x3B\x73 |0 - \x89\x40\x35 |0 - \x89\x40\x75 |0 - \x89\x47\x42 |0 - \x89\x4D\x56 |0 \x87\x21\x21 |0 - \x89\x59\x47 |0 \x84\x4F\x7C |0 - \x89\x5A\x3F |0 \x86\x21\x2C |0 \x86\x21\x22 |0 \x86\x22\x5F |0 @@ -24791,35 +24552,25 @@ CHARMAP \x85\x25\x21 |0 \x85\x27\x7A |0 \x86\x2E\x4A |0 - \x89\x29\x50 |0 \x86\x35\x25 |0 \x86\x35\x26 |0 \x86\x45\x7D |0 \x86\x46\x3F |0 - \x89\x46\x40 |0 \x85\x44\x7E |0 \x86\x21\x32 |0 \x85\x21\x2D |0 \x86\x22\x2D |0 \x86\x23\x42 |0 - \x89\x2D\x61 |0 \x86\x50\x50 |0 - \x89\x53\x44 |0 \x84\x21\x21 |0 \x85\x21\x26 |0 \x86\x21\x24 |0 - \x89\x21\x22 |0 \x86\x21\x33 |0 \x86\x21\x44 |0 - \x89\x21\x25 |0 - \x89\x21\x26 |0 \x85\x21\x4E |0 \x86\x22\x30 |0 - \x89\x21\x45 |0 \x86\x22\x4E |0 \x86\x22\x2F |0 - \x89\x21\x40 |0 - \x89\x21\x41 |0 \x86\x21\x45 |0 \x86\x22\x31 |0 \x86\x22\x2E |0 @@ -24836,7 +24587,6 @@ CHARMAP \x86\x2C\x43 |0 \x86\x29\x3C |0 \x86\x3A\x65 |0 - \x89\x29\x25 |0 \x86\x2D\x2D |0 \x86\x29\x3D |0 \x86\x2E\x4B |0 @@ -24856,36 +24606,27 @@ CHARMAP \x86\x21\x25 |0 \x85\x21\x21 |0 \x85\x21\x2B |0 - \x89\x21\x23 |0 \x86\x21\x46 |0 \x85\x21\x34 |0 - \x89\x21\x27 |0 - \x89\x21\x28 |0 \x86\x22\x33 |0 \x86\x22\x32 |0 \x86\x22\x2A |0 \x85\x21\x4F |0 \x86\x23\x46 |0 \x86\x23\x44 |0 - \x89\x21\x6E |0 \x86\x23\x45 |0 - \x89\x22\x75 |0 \x86\x29\x3F |0 \x86\x2D\x2C |0 \x84\x26\x24 |0 \x86\x2E\x4D |0 \x86\x2E\x4E |0 - \x89\x25\x40 |0 \x86\x2E\x4C |0 \x86\x35\x2B |0 - \x89\x2D\x60 |0 \x86\x3C\x7E |0 \x85\x30\x73 |0 \x86\x3C\x7D |0 - \x89\x39\x34 |0 \x86\x50\x51 |0 \x85\x44\x55 |0 - \x89\x46\x41 |0 \x86\x5A\x63 |0 \x86\x5A\x62 |0 \x87\x36\x73 |0 @@ -24914,65 +24655,39 @@ CHARMAP \x86\x23\x48 |0 \x86\x23\x49 |0 \x86\x25\x68 |0 - \x89\x22\x76 |0 \x84\x25\x33 |0 \x85\x25\x22 |0 \x84\x25\x32 |0 \x86\x2E\x50 |0 \x85\x27\x7B |0 - \x89\x29\x27 |0 \x86\x30\x7C |0 \x86\x35\x2D |0 \x86\x35\x2C |0 - \x89\x2D\x62 |0 \x86\x3D\x21 |0 - \x89\x4D\x6E |0 \x86\x23\x4A |0 - \x89\x21\x6F |0 - \x89\x21\x70 |0 - \x89\x22\x2B |0 \x85\x23\x31 |0 - \x89\x22\x77 |0 - \x89\x22\x78 |0 - \x89\x22\x79 |0 \x85\x25\x23 |0 \x86\x29\x41 |0 - \x89\x25\x43 |0 \x86\x2E\x52 |0 \x86\x2E\x51 |0 - \x89\x29\x28 |0 \x86\x35\x2F |0 \x85\x2C\x66 |0 \x84\x2B\x5F |0 \x86\x35\x30 |0 - \x89\x2D\x63 |0 \x86\x35\x31 |0 \x86\x46\x43 |0 \x86\x3D\x23 |0 \x86\x3D\x22 |0 \x84\x30\x44 |0 \x85\x30\x75 |0 - \x89\x32\x74 |0 - \x89\x32\x75 |0 - \x89\x32\x72 |0 \x86\x46\x45 |0 \x86\x46\x44 |0 \x86\x46\x46 |0 \x84\x36\x2F |0 - \x89\x39\x35 |0 - \x89\x39\x36 |0 - \x89\x39\x37 |0 \x86\x4C\x2D |0 - \x89\x40\x36 |0 - \x89\x40\x37 |0 - \x89\x40\x38 |0 - \x89\x46\x42 |0 \x86\x50\x52 |0 \x85\x4B\x71 |0 \x87\x21\x22 |0 - \x89\x4D\x57 |0 - \x89\x4D\x58 |0 - \x89\x4D\x59 |0 \x87\x26\x79 |0 \x87\x21\x24 |0 \x87\x21\x23 |0 @@ -24985,12 +24700,9 @@ CHARMAP \x87\x46\x28 |0 \x86\x21\x34 |0 \x86\x21\x35 |0 - \x89\x21\x24 |0 \x86\x21\x4C |0 - \x89\x21\x29 |0 \x86\x21\x4B |0 \x83\x21\x6F |0 - \x89\x21\x43 |0 \x86\x22\x35 |0 \x86\x22\x34 |0 \x86\x22\x36 |0 @@ -25006,17 +24718,9 @@ CHARMAP \x86\x23\x4C |0 \x84\x22\x2F |0 \x86\x23\x4B |0 - \x89\x21\x73 |0 - \x89\x21\x74 |0 - \x89\x21\x75 |0 - \x89\x21\x76 |0 - \x89\x21\x77 |0 - \x89\x21\x78 |0 - \x89\x21\x79 |0 \x85\x22\x28 |0 \x86\x23\x51 |0 \x85\x22\x26 |0 - \x89\x21\x7A |0 \x85\x23\x32 |0 \x86\x25\x6A |0 \x84\x23\x3A |0 @@ -25024,23 +24728,9 @@ CHARMAP \x86\x25\x74 |0 \x86\x25\x70 |0 \x86\x25\x6C |0 - \x89\x22\x7A |0 - \x89\x22\x7B |0 - \x89\x22\x7C |0 - \x89\x22\x7D |0 - \x89\x23\x21 |0 - \x89\x23\x22 |0 - \x89\x23\x23 |0 - \x89\x23\x25 |0 - \x89\x23\x28 |0 - \x89\x23\x29 |0 - \x89\x23\x2A |0 - \x89\x23\x2B |0 - \x89\x23\x2C |0 \x84\x23\x38 |0 \x86\x25\x6D |0 \x86\x25\x6F |0 - \x89\x23\x26 |0 \x86\x25\x6E |0 \x86\x25\x69 |0 \x85\x23\x33 |0 @@ -25062,17 +24752,6 @@ CHARMAP \x86\x29\x4E |0 \x85\x25\x26 |0 \x86\x29\x42 |0 - \x89\x25\x45 |0 - \x89\x25\x46 |0 - \x89\x25\x48 |0 - \x89\x25\x49 |0 - \x89\x25\x4B |0 - \x89\x25\x4C |0 - \x89\x25\x4D |0 - \x89\x25\x4E |0 - \x89\x25\x4F |0 - \x89\x25\x50 |0 - \x89\x25\x51 |0 \x86\x29\x4D |0 \x86\x29\x48 |0 \x86\x29\x49 |0 @@ -25098,26 +24777,11 @@ CHARMAP \x86\x2E\x54 |0 \x86\x2E\x65 |0 \x86\x2E\x5C |0 - \x89\x29\x29 |0 - \x89\x29\x2A |0 - \x89\x29\x2B |0 - \x89\x29\x2C |0 - \x89\x29\x2E |0 - \x89\x29\x2F |0 - \x89\x29\x31 |0 - \x89\x29\x32 |0 - \x89\x29\x33 |0 - \x89\x29\x34 |0 - \x89\x29\x35 |0 - \x89\x29\x36 |0 - \x89\x29\x37 |0 - \x89\x29\x38 |0 \x86\x2E\x53 |0 \x86\x2E\x58 |0 \x86\x2E\x5B |0 \x86\x2E\x5E |0 \x86\x2E\x60 |0 - \x89\x25\x47 |0 \x86\x2E\x5F |0 \x85\x28\x24 |0 \x84\x2B\x63 |0 @@ -25132,28 +24796,8 @@ CHARMAP \x85\x2B\x6F |0 \x86\x35\x32 |0 \x85\x2B\x69 |0 - \x89\x2D\x64 |0 - \x89\x2D\x6E |0 \x86\x35\x37 |0 \x85\x2B\x6E |0 - \x89\x2D\x66 |0 - \x89\x2D\x67 |0 - \x89\x2D\x6A |0 - \x89\x2D\x6B |0 - \x89\x2D\x6C |0 - \x89\x2D\x6D |0 - \x89\x2D\x6F |0 - \x89\x2D\x71 |0 - \x89\x2D\x72 |0 - \x89\x2D\x73 |0 - \x89\x2D\x74 |0 - \x89\x2D\x75 |0 - \x89\x2D\x76 |0 - \x89\x2D\x78 |0 - \x89\x2D\x79 |0 - \x89\x2D\x7A |0 - \x89\x2D\x7B |0 - \x89\x2D\x7C |0 \x86\x35\x21 |0 \x86\x35\x3A |0 \x86\x35\x3B |0 @@ -25161,8 +24805,6 @@ CHARMAP \x86\x35\x34 |0 \x85\x2B\x68 |0 \x86\x35\x39 |0 - \x89\x2D\x77 |0 - \x89\x2D\x70 |0 \x85\x2B\x6A |0 \x85\x2B\x6D |0 \x85\x2B\x75 |0 @@ -25191,20 +24833,6 @@ CHARMAP \x86\x3D\x29 |0 \x84\x30\x4B |0 \x86\x3D\x34 |0 - \x89\x2D\x69 |0 - \x89\x32\x77 |0 - \x89\x32\x78 |0 - \x89\x32\x79 |0 - \x89\x32\x7A |0 - \x89\x32\x7B |0 - \x89\x32\x7C |0 - \x89\x32\x7E |0 - \x89\x33\x21 |0 - \x89\x33\x23 |0 - \x89\x33\x24 |0 - \x89\x33\x25 |0 - \x89\x33\x26 |0 - \x89\x33\x27 |0 \x86\x46\x37 |0 \x86\x3D\x38 |0 \x86\x3E\x65 |0 @@ -25216,7 +24844,6 @@ CHARMAP \x85\x31\x23 |0 \x86\x3D\x24 |0 \x86\x3D\x26 |0 - \x89\x32\x7D |0 \x85\x30\x79 |0 \x85\x30\x7E |0 \x85\x30\x78 |0 @@ -25243,19 +24870,10 @@ CHARMAP \x86\x46\x4B |0 \x86\x46\x4E |0 \x86\x46\x53 |0 - \x89\x32\x76 |0 \x86\x46\x58 |0 \x85\x36\x4F |0 \x85\x36\x57 |0 \x86\x46\x47 |0 - \x89\x39\x38 |0 - \x89\x39\x39 |0 - \x89\x39\x3A |0 - \x89\x39\x3B |0 - \x89\x39\x3C |0 - \x89\x39\x3D |0 - \x89\x39\x3E |0 - \x89\x39\x3F |0 \x86\x46\x4D |0 \x84\x36\x3B |0 \x86\x46\x51 |0 @@ -25285,20 +24903,6 @@ CHARMAP \x85\x3D\x57 |0 \x86\x50\x57 |0 \x86\x50\x5E |0 - \x89\x40\x39 |0 - \x89\x40\x3A |0 - \x89\x40\x3B |0 - \x89\x40\x3C |0 - \x89\x40\x3D |0 - \x89\x40\x3E |0 - \x89\x40\x3F |0 - \x89\x40\x40 |0 - \x89\x40\x41 |0 - \x89\x40\x42 |0 - \x89\x40\x43 |0 - \x89\x40\x44 |0 - \x89\x40\x45 |0 - \x89\x40\x46 |0 \x86\x50\x61 |0 \x86\x56\x4E |0 \x86\x50\x59 |0 @@ -25325,26 +24929,6 @@ CHARMAP \x86\x5A\x68 |0 \x86\x5A\x67 |0 \x86\x5A\x76 |0 - \x89\x46\x43 |0 - \x89\x46\x44 |0 - \x89\x46\x45 |0 - \x89\x46\x46 |0 - \x89\x46\x47 |0 - \x89\x46\x49 |0 - \x89\x46\x4A |0 - \x89\x46\x4B |0 - \x89\x46\x4C |0 - \x89\x46\x4D |0 - \x89\x46\x4E |0 - \x89\x46\x4F |0 - \x89\x46\x51 |0 - \x89\x46\x52 |0 - \x89\x46\x53 |0 - \x89\x46\x54 |0 - \x89\x46\x56 |0 - \x89\x46\x57 |0 - \x89\x46\x58 |0 - \x89\x53\x45 |0 \x87\x26\x2D |0 \x85\x44\x58 |0 \x86\x5A\x77 |0 @@ -25352,9 +24936,6 @@ CHARMAP \x86\x5A\x6D |0 \x86\x5A\x6F |0 \x86\x5A\x65 |0 - \x89\x46\x50 |0 - \x89\x46\x48 |0 - \x89\x46\x55 |0 \x84\x42\x30 |0 \x86\x5A\x66 |0 \x86\x5A\x6A |0 @@ -25379,17 +24960,9 @@ CHARMAP \x85\x4B\x79 |0 \x85\x4B\x78 |0 \x87\x21\x27 |0 - \x89\x4D\x5A |0 - \x89\x4D\x5B |0 - \x89\x4D\x5C |0 - \x89\x4D\x5D |0 - \x89\x4D\x5E |0 - \x89\x4D\x60 |0 - \x89\x4D\x61 |0 \x87\x21\x28 |0 \x85\x4B\x72 |0 \x87\x21\x2D |0 - \x89\x4D\x62 |0 \x84\x49\x21 |0 \x85\x4B\x75 |0 \x87\x21\x30 |0 @@ -25405,11 +24978,6 @@ CHARMAP \x84\x4F\x5E |0 \x85\x53\x55 |0 \x85\x53\x56 |0 - \x89\x53\x46 |0 - \x89\x53\x47 |0 - \x89\x53\x48 |0 - \x89\x53\x49 |0 - \x89\x53\x4A |0 \x85\x53\x5B |0 \x85\x53\x57 |0 \x87\x36\x78 |0 @@ -25419,14 +24987,8 @@ CHARMAP \x84\x55\x67 |0 \x84\x55\x66 |0 \x87\x36\x76 |0 - \x89\x59\x48 |0 - \x89\x59\x4A |0 - \x89\x59\x4B |0 - \x89\x59\x4C |0 - \x89\x59\x4E |0 \x87\x36\x75 |0 \x87\x36\x77 |0 - \x89\x59\x49 |0 \x84\x55\x68 |0 \x87\x36\x74 |0 \x87\x3E\x76 |0 @@ -25435,11 +24997,6 @@ CHARMAP \x84\x5A\x6A |0 \x87\x3E\x78 |0 \x87\x3E\x77 |0 - \x89\x5E\x30 |0 - \x89\x5E\x31 |0 - \x89\x5E\x2C |0 - \x89\x5E\x2E |0 - \x89\x5E\x2F |0 \x87\x3E\x75 |0 \x85\x61\x31 |0 \x84\x5A\x6C |0 @@ -25451,15 +25008,12 @@ CHARMAP \x84\x63\x2E |0 \x85\x67\x4D |0 \x85\x67\x4F |0 - \x89\x61\x7E |0 - \x89\x62\x21 |0 \x87\x47\x6F |0 \x85\x67\x4C |0 \x85\x67\x4B |0 \x85\x69\x7C |0 \x87\x52\x75 |0 \x87\x4D\x3C |0 - \x89\x64\x7A |0 \x85\x6B\x6B |0 \x87\x4D\x3B |0 \x87\x4D\x68 |0 @@ -25468,21 +25022,13 @@ CHARMAP \x85\x6F\x68 |0 \x87\x57\x4E |0 \x85\x6B\x6C |0 - \x89\x67\x3F |0 - \x89\x67\x7E |0 \x84\x66\x2D |0 \x87\x57\x4D |0 - \x89\x69\x38 |0 - \x89\x69\x3A |0 - \x89\x69\x39 |0 \x85\x73\x31 |0 \x84\x6A\x40 |0 \x87\x5B\x45 |0 - \x89\x6A\x4B |0 - \x89\x6B\x41 |0 \x85\x75\x62 |0 \x84\x6D\x52 |0 - \x89\x6C\x49 |0 \x86\x21\x4D |0 \x84\x21\x5C |0 \x84\x22\x32 |0 @@ -25497,63 +25043,32 @@ CHARMAP \x86\x29\x50 |0 \x86\x29\x4F |0 \x86\x29\x53 |0 - \x89\x25\x53 |0 \x86\x29\x52 |0 - \x89\x25\x52 |0 \x86\x2E\x67 |0 \x86\x2E\x68 |0 \x85\x2B\x76 |0 - \x89\x2D\x7D |0 - \x89\x2D\x7E |0 - \x89\x2E\x21 |0 \x86\x35\x3C |0 - \x89\x33\x28 |0 \x85\x31\x24 |0 \x85\x31\x25 |0 - \x89\x33\x29 |0 - \x89\x33\x2A |0 \x86\x46\x59 |0 - \x89\x39\x40 |0 - \x89\x39\x41 |0 - \x89\x39\x42 |0 \x85\x36\x58 |0 - \x89\x39\x43 |0 - \x89\x40\x47 |0 \x86\x50\x63 |0 - \x89\x40\x48 |0 - \x89\x46\x59 |0 - \x89\x46\x5A |0 \x85\x44\x59 |0 \x87\x21\x34 |0 \x87\x21\x32 |0 \x85\x4B\x7B |0 - \x89\x4D\x63 |0 - \x89\x4D\x64 |0 \x85\x4B\x7A |0 \x87\x21\x33 |0 \x85\x53\x5C |0 \x87\x2C\x41 |0 - \x89\x53\x4B |0 - \x89\x53\x4C |0 - \x89\x53\x4D |0 - \x89\x53\x4E |0 \x85\x5A\x71 |0 - \x89\x59\x4F |0 - \x89\x59\x50 |0 - \x89\x59\x51 |0 \x87\x3E\x79 |0 \x85\x61\x33 |0 - \x89\x5E\x32 |0 \x87\x46\x29 |0 \x85\x67\x50 |0 - \x89\x64\x7B |0 \x85\x67\x51 |0 \x85\x6B\x6D |0 - \x89\x67\x41 |0 - \x89\x69\x3B |0 - \x89\x6A\x4C |0 \x85\x77\x53 |0 - \x89\x6B\x42 |0 \x86\x21\x36 |0 \x85\x21\x36 |0 \x85\x21\x35 |0 @@ -25567,8 +25082,6 @@ CHARMAP \x85\x28\x26 |0 \x84\x2B\x6A |0 \x86\x35\x3D |0 - \x89\x2E\x22 |0 - \x89\x2E\x23 |0 \x86\x3D\x3A |0 \x86\x46\x5A |0 \x86\x50\x64 |0 @@ -25588,7 +25101,6 @@ CHARMAP \x86\x25\x7C |0 \x86\x25\x7E |0 \x85\x23\x39 |0 - \x89\x23\x2D |0 \x86\x25\x7A |0 \x86\x29\x54 |0 \x86\x2E\x6B |0 @@ -25604,21 +25116,13 @@ CHARMAP \x86\x3D\x3B |0 \x86\x46\x5D |0 \x85\x3D\x64 |0 - \x89\x39\x44 |0 - \x89\x39\x45 |0 \x86\x46\x5B |0 \x86\x46\x5C |0 \x85\x3D\x65 |0 \x86\x50\x65 |0 - \x89\x40\x49 |0 - \x89\x40\x4A |0 \x84\x42\x3A |0 \x86\x5A\x79 |0 - \x89\x54\x46 |0 - \x89\x53\x4F |0 - \x89\x53\x50 |0 \x85\x61\x34 |0 - \x89\x5E\x33 |0 \x87\x46\x2A |0 \x87\x46\x2B |0 \x84\x21\x2D |0 @@ -25628,7 +25132,6 @@ CHARMAP \x84\x21\x5D |0 \x86\x22\x38 |0 \x85\x21\x52 |0 - \x89\x21\x46 |0 \x86\x22\x3A |0 \x85\x21\x51 |0 \x86\x23\x5A |0 @@ -25658,67 +25161,38 @@ CHARMAP \x87\x21\x35 |0 \x85\x53\x5D |0 \x87\x2C\x42 |0 - \x89\x55\x76 |0 \x84\x5A\x6D |0 - \x89\x67\x42 |0 \x87\x57\x4F |0 \x85\x21\x38 |0 \x86\x22\x3B |0 - \x89\x21\x48 |0 - \x89\x21\x49 |0 \x86\x23\x5B |0 \x84\x22\x37 |0 \x85\x22\x29 |0 - \x89\x21\x7B |0 - \x89\x23\x2E |0 - \x89\x23\x2F |0 \x85\x25\x2D |0 - \x89\x25\x55 |0 \x86\x2E\x6D |0 \x86\x3D\x3E |0 - \x89\x2E\x25 |0 - \x89\x2E\x26 |0 - \x89\x2E\x27 |0 - \x89\x2E\x28 |0 - \x89\x2E\x29 |0 \x85\x31\x27 |0 \x86\x46\x60 |0 - \x89\x39\x47 |0 - \x89\x39\x48 |0 \x86\x46\x61 |0 - \x89\x3A\x5D |0 \x86\x50\x66 |0 \x86\x5A\x7C |0 - \x89\x46\x5B |0 \x85\x4E\x77 |0 \x87\x2C\x43 |0 - \x89\x59\x52 |0 - \x89\x53\x51 |0 \x87\x3E\x7A |0 \x87\x46\x2C |0 \x87\x4D\x3F |0 \x85\x6F\x69 |0 \x85\x75\x63 |0 - \x89\x21\x4A |0 \x86\x23\x5C |0 - \x89\x21\x7D |0 - \x89\x21\x7E |0 \x84\x22\x38 |0 \x85\x23\x3B |0 \x86\x26\x24 |0 \x84\x23\x3C |0 - \x89\x23\x30 |0 - \x89\x23\x31 |0 - \x89\x23\x32 |0 - \x89\x23\x33 |0 - \x89\x23\x24 |0 - \x89\x22\x7E |0 \x84\x25\x41 |0 \x84\x25\x42 |0 \x86\x29\x58 |0 \x86\x29\x59 |0 \x85\x25\x2F |0 - \x89\x25\x57 |0 \x85\x28\x29 |0 \x84\x28\x41 |0 \x84\x28\x42 |0 @@ -25726,11 +25200,6 @@ CHARMAP \x85\x28\x28 |0 \x85\x28\x2A |0 \x86\x2E\x6F |0 - \x89\x29\x3A |0 - \x89\x29\x3C |0 - \x89\x29\x3D |0 - \x89\x29\x3E |0 - \x89\x29\x3F |0 \x86\x2E\x6E |0 \x85\x2B\x7A |0 \x84\x2B\x6B |0 @@ -25738,25 +25207,17 @@ CHARMAP \x85\x28\x2B |0 \x86\x35\x45 |0 \x85\x2B\x7B |0 - \x89\x2E\x2A |0 - \x89\x2E\x2B |0 \x86\x35\x46 |0 \x85\x31\x28 |0 \x86\x3D\x3F |0 \x86\x3D\x40 |0 \x84\x30\x4E |0 - \x89\x33\x2B |0 - \x89\x33\x2C |0 - \x89\x33\x2D |0 - \x89\x33\x2F |0 - \x89\x33\x30 |0 \x86\x46\x62 |0 \x85\x36\x5C |0 \x85\x36\x5A |0 \x85\x36\x5B |0 \x85\x36\x59 |0 \x84\x36\x3E |0 - \x89\x33\x2E |0 \x85\x3D\x6C |0 \x85\x3D\x67 |0 \x85\x3D\x69 |0 @@ -25768,26 +25229,17 @@ CHARMAP \x85\x4C\x21 |0 \x85\x44\x5A |0 \x87\x21\x37 |0 - \x89\x46\x5D |0 - \x89\x46\x5E |0 \x85\x4B\x7E |0 \x85\x4B\x7D |0 \x85\x4B\x7C |0 \x87\x21\x36 |0 - \x89\x4D\x67 |0 - \x89\x53\x53 |0 \x87\x2C\x45 |0 - \x89\x4D\x66 |0 - \x89\x53\x52 |0 \x84\x55\x6A |0 \x87\x2C\x46 |0 \x85\x5A\x73 |0 - \x89\x59\x53 |0 - \x89\x59\x54 |0 \x85\x61\x36 |0 \x85\x61\x35 |0 \x85\x61\x37 |0 - \x89\x5E\x34 |0 \x87\x3E\x7B |0 \x85\x67\x52 |0 \x85\x67\x53 |0 @@ -25795,12 +25247,7 @@ CHARMAP \x85\x73\x32 |0 \x84\x21\x29 |0 \x86\x21\x52 |0 - \x89\x21\x2A |0 - \x89\x21\x2B |0 - \x89\x21\x2C |0 - \x89\x21\x2E |0 \x86\x21\x5C |0 - \x89\x21\x2D |0 \x85\x21\x53 |0 \x86\x22\x3D |0 \x84\x21\x5F |0 @@ -25808,48 +25255,27 @@ CHARMAP \x86\x23\x5D |0 \x86\x23\x5F |0 \x86\x23\x60 |0 - \x89\x21\x4B |0 \x86\x26\x27 |0 \x86\x26\x25 |0 \x86\x26\x26 |0 - \x89\x23\x34 |0 - \x89\x23\x35 |0 \x84\x25\x46 |0 \x86\x29\x5A |0 \x84\x25\x44 |0 \x86\x29\x5B |0 \x86\x29\x5C |0 \x86\x29\x5D |0 - \x89\x25\x58 |0 - \x89\x25\x59 |0 \x86\x2E\x72 |0 \x86\x2E\x70 |0 \x86\x2E\x71 |0 \x86\x35\x47 |0 - \x89\x2E\x2C |0 \x86\x37\x27 |0 \x86\x3D\x42 |0 \x86\x3D\x43 |0 \x86\x3D\x41 |0 - \x89\x33\x31 |0 - \x89\x33\x32 |0 - \x89\x33\x33 |0 \x86\x46\x63 |0 \x86\x46\x66 |0 - \x89\x39\x49 |0 \x86\x46\x64 |0 - \x89\x39\x4A |0 - \x89\x46\x5F |0 - \x89\x46\x60 |0 - \x89\x46\x61 |0 - \x89\x4D\x68 |0 \x87\x2C\x47 |0 - \x89\x53\x54 |0 - \x89\x53\x55 |0 - \x89\x53\x43 |0 - \x89\x59\x55 |0 - \x89\x5E\x35 |0 - \x89\x67\x43 |0 \x84\x21\x2E |0 \x85\x21\x39 |0 \x86\x21\x53 |0 @@ -25857,15 +25283,12 @@ CHARMAP \x86\x22\x3F |0 \x85\x21\x54 |0 \x86\x22\x3E |0 - \x89\x21\x4C |0 \x86\x23\x65 |0 \x86\x23\x61 |0 \x86\x23\x62 |0 \x86\x23\x63 |0 - \x89\x22\x21 |0 \x85\x22\x2A |0 \x86\x26\x28 |0 - \x89\x23\x36 |0 \x86\x29\x60 |0 \x86\x29\x5F |0 \x86\x2E\x73 |0 @@ -25876,7 +25299,6 @@ CHARMAP \x86\x3D\x45 |0 \x85\x36\x5D |0 \x86\x5A\x7E |0 - \x89\x46\x62 |0 \x87\x21\x70 |0 \x87\x36\x7B |0 \x85\x5A\x76 |0 @@ -25889,7 +25311,6 @@ CHARMAP \x85\x21\x3B |0 \x86\x21\x56 |0 \x84\x21\x41 |0 - \x89\x21\x2F |0 \x86\x21\x57 |0 \x85\x21\x55 |0 \x85\x21\x56 |0 @@ -25913,8 +25334,6 @@ CHARMAP \x86\x23\x69 |0 \x85\x22\x2D |0 \x84\x22\x3D |0 - \x89\x22\x22 |0 - \x89\x22\x23 |0 \x84\x22\x3E |0 \x86\x23\x66 |0 \x84\x23\x41 |0 @@ -25953,10 +25372,6 @@ CHARMAP \x85\x25\x32 |0 \x86\x29\x67 |0 \x85\x25\x34 |0 - \x89\x25\x5A |0 - \x89\x25\x5B |0 - \x89\x25\x5C |0 - \x89\x25\x5D |0 \x86\x29\x68 |0 \x86\x29\x62 |0 \x86\x29\x61 |0 @@ -25978,9 +25393,6 @@ CHARMAP \x86\x2E\x7A |0 \x86\x2E\x7D |0 \x86\x2E\x7C |0 - \x89\x29\x40 |0 - \x89\x29\x41 |0 - \x89\x29\x42 |0 \x86\x2E\x79 |0 \x85\x28\x2E |0 \x86\x2E\x77 |0 @@ -26006,13 +25418,7 @@ CHARMAP \x84\x2B\x72 |0 \x85\x2C\x24 |0 \x86\x35\x4D |0 - \x89\x2E\x33 |0 \x86\x35\x54 |0 - \x89\x2E\x2E |0 - \x89\x2E\x2F |0 - \x89\x2E\x30 |0 - \x89\x2E\x32 |0 - \x89\x2E\x31 |0 \x86\x35\x4A |0 \x85\x2C\x27 |0 \x85\x2B\x7D |0 @@ -26031,9 +25437,6 @@ CHARMAP \x85\x36\x5E |0 \x84\x30\x4F |0 \x85\x2C\x28 |0 - \x89\x33\x34 |0 - \x89\x33\x35 |0 - \x89\x33\x37 |0 \x86\x3D\x48 |0 \x86\x3D\x4A |0 \x86\x3D\x4B |0 @@ -26055,10 +25458,6 @@ CHARMAP \x85\x36\x61 |0 \x85\x36\x62 |0 \x86\x46\x6A |0 - \x89\x39\x4B |0 - \x89\x39\x4C |0 - \x89\x39\x4D |0 - \x89\x39\x4E |0 \x84\x36\x48 |0 \x86\x4C\x46 |0 \x86\x46\x6E |0 @@ -26077,14 +25476,12 @@ CHARMAP \x84\x3C\x3A |0 \x85\x3D\x6F |0 \x86\x50\x6B |0 - \x89\x40\x4B |0 \x86\x50\x6A |0 \x86\x50\x68 |0 \x86\x50\x70 |0 \x86\x50\x69 |0 \x85\x3D\x72 |0 \x85\x3D\x71 |0 - \x89\x40\x4C |0 \x85\x44\x5B |0 \x84\x42\x3B |0 \x86\x5B\x24 |0 @@ -26108,9 +25505,6 @@ CHARMAP \x86\x5B\x2A |0 \x85\x44\x60 |0 \x86\x5B\x25 |0 - \x89\x46\x63 |0 - \x89\x46\x64 |0 - \x89\x46\x65 |0 \x86\x5B\x23 |0 \x86\x5B\x27 |0 \x85\x4C\x23 |0 @@ -26141,20 +25535,17 @@ CHARMAP \x87\x2C\x48 |0 \x87\x2C\x4B |0 \x87\x21\x3F |0 - \x89\x53\x56 |0 \x85\x58\x51 |0 \x85\x5A\x7A |0 \x84\x55\x6B |0 \x85\x5A\x79 |0 \x85\x5A\x78 |0 \x87\x36\x7C |0 - \x89\x59\x56 |0 \x84\x55\x6E |0 \x87\x3E\x7C |0 \x85\x61\x38 |0 \x85\x61\x39 |0 \x87\x36\x7D |0 - \x89\x5E\x36 |0 \x85\x61\x3A |0 \x87\x46\x2F |0 \x87\x46\x2E |0 @@ -26163,7 +25554,6 @@ CHARMAP \x87\x4D\x41 |0 \x85\x6F\x6A |0 \x87\x52\x77 |0 - \x89\x67\x44 |0 \x85\x75\x64 |0 \x84\x6B\x65 |0 \x87\x62\x2D |0 @@ -26176,17 +25566,10 @@ CHARMAP \x85\x21\x58 |0 \x85\x22\x31 |0 \x85\x22\x32 |0 - \x89\x22\x25 |0 - \x89\x22\x26 |0 - \x89\x22\x27 |0 - \x89\x22\x28 |0 \x85\x22\x33 |0 \x86\x26\x2E |0 \x84\x23\x45 |0 \x85\x23\x47 |0 - \x89\x23\x38 |0 - \x89\x23\x3A |0 - \x89\x23\x3B |0 \x86\x26\x2D |0 \x84\x23\x49 |0 \x85\x25\x3D |0 @@ -26194,19 +25577,12 @@ CHARMAP \x86\x29\x6D |0 \x85\x25\x3C |0 \x86\x29\x6E |0 - \x89\x25\x60 |0 - \x89\x25\x61 |0 - \x89\x25\x62 |0 - \x89\x25\x63 |0 \x85\x28\x30 |0 \x84\x28\x4A |0 \x86\x2F\x26 |0 \x85\x28\x31 |0 \x85\x28\x2F |0 \x86\x2F\x28 |0 - \x89\x29\x43 |0 - \x89\x29\x44 |0 - \x89\x29\x45 |0 \x86\x35\x55 |0 \x86\x35\x59 |0 \x84\x2B\x74 |0 @@ -26215,8 +25591,6 @@ CHARMAP \x85\x2C\x2B |0 \x85\x2C\x2C |0 \x85\x2C\x2A |0 - \x89\x2E\x34 |0 - \x89\x2E\x35 |0 \x86\x35\x56 |0 \x86\x35\x57 |0 \x85\x31\x2D |0 @@ -26225,16 +25599,12 @@ CHARMAP \x86\x3D\x4F |0 \x86\x3D\x50 |0 \x86\x3D\x51 |0 - \x89\x33\x38 |0 - \x89\x33\x39 |0 \x86\x3D\x4D |0 \x85\x36\x69 |0 \x85\x36\x66 |0 \x85\x36\x68 |0 \x85\x36\x6B |0 \x85\x36\x67 |0 - \x89\x39\x4F |0 - \x89\x39\x50 |0 \x86\x46\x6F |0 \x86\x46\x70 |0 \x86\x46\x71 |0 @@ -26243,7 +25613,6 @@ CHARMAP \x84\x3C\x3B |0 \x86\x50\x72 |0 \x86\x50\x71 |0 - \x89\x40\x4D |0 \x85\x3D\x77 |0 \x84\x42\x46 |0 \x85\x44\x66 |0 @@ -26253,7 +25622,6 @@ CHARMAP \x84\x42\x45 |0 \x85\x44\x68 |0 \x86\x5B\x2E |0 - \x89\x46\x66 |0 \x86\x5B\x2C |0 \x86\x5B\x2D |0 \x85\x4C\x2B |0 @@ -26263,7 +25631,6 @@ CHARMAP \x85\x4C\x2A |0 \x87\x2C\x4F |0 \x85\x5A\x7C |0 - \x89\x53\x57 |0 \x85\x5A\x7B |0 \x85\x5A\x7D |0 \x87\x36\x7E |0 @@ -26286,20 +25653,16 @@ CHARMAP \x85\x22\x35 |0 \x85\x22\x34 |0 \x85\x22\x36 |0 - \x89\x22\x2A |0 \x86\x26\x2F |0 \x85\x23\x48 |0 \x85\x23\x49 |0 \x84\x25\x52 |0 \x86\x29\x71 |0 \x86\x29\x70 |0 - \x89\x25\x64 |0 - \x89\x25\x65 |0 \x86\x2F\x2A |0 \x84\x28\x4C |0 \x86\x2F\x2B |0 \x86\x2F\x2C |0 - \x89\x29\x46 |0 \x86\x2F\x29 |0 \x84\x2B\x76 |0 \x86\x35\x5C |0 @@ -26316,18 +25679,13 @@ CHARMAP \x85\x31\x2F |0 \x86\x3D\x53 |0 \x84\x36\x4E |0 - \x89\x39\x51 |0 \x86\x50\x73 |0 \x84\x30\x5B |0 \x85\x3D\x79 |0 - \x89\x40\x4E |0 - \x89\x40\x4F |0 \x86\x5B\x2F |0 \x84\x42\x47 |0 \x85\x44\x6A |0 \x85\x44\x6B |0 - \x89\x46\x67 |0 - \x89\x4D\x69 |0 \x84\x4F\x65 |0 \x87\x2C\x50 |0 \x87\x2C\x51 |0 @@ -26351,17 +25709,12 @@ CHARMAP \x86\x2F\x30 |0 \x86\x3D\x54 |0 \x86\x35\x60 |0 - \x89\x2E\x36 |0 - \x89\x2E\x37 |0 \x86\x35\x24 |0 \x86\x46\x72 |0 - \x89\x39\x52 |0 \x84\x3C\x3D |0 - \x89\x46\x68 |0 \x87\x3F\x22 |0 \x85\x6D\x32 |0 \x86\x21\x2B |0 - \x89\x21\x31 |0 \x85\x22\x37 |0 \x86\x23\x6E |0 \x84\x22\x43 |0 @@ -26369,7 +25722,6 @@ CHARMAP \x86\x26\x34 |0 \x84\x23\x4A |0 \x86\x26\x35 |0 - \x89\x23\x3C |0 \x86\x29\x73 |0 \x85\x25\x3E |0 \x85\x25\x3F |0 @@ -26381,13 +25733,11 @@ CHARMAP \x86\x2F\x32 |0 \x86\x2F\x37 |0 \x86\x2F\x35 |0 - \x89\x29\x47 |0 \x85\x2C\x30 |0 \x86\x35\x62 |0 \x86\x35\x61 |0 \x85\x2C\x31 |0 \x86\x3D\x55 |0 - \x89\x33\x3A |0 \x84\x36\x4F |0 \x86\x50\x75 |0 \x86\x46\x73 |0 @@ -26399,26 +25749,20 @@ CHARMAP \x85\x4C\x2C |0 \x85\x4C\x2D |0 \x85\x4C\x2E |0 - \x89\x4D\x6A |0 \x85\x53\x64 |0 \x87\x37\x25 |0 - \x89\x5E\x37 |0 \x84\x5F\x4B |0 \x87\x3F\x23 |0 \x87\x4D\x44 |0 \x87\x60\x69 |0 \x87\x64\x43 |0 - \x89\x21\x32 |0 \x85\x22\x38 |0 \x86\x23\x6F |0 \x85\x23\x4C |0 \x86\x26\x37 |0 - \x89\x23\x3D |0 - \x89\x25\x66 |0 \x86\x2F\x36 |0 \x85\x28\x34 |0 \x86\x35\x64 |0 - \x89\x46\x69 |0 \x87\x4D\x45 |0 \x87\x57\x50 |0 \x86\x21\x5A |0 @@ -26438,41 +25782,24 @@ CHARMAP \x86\x26\x3A |0 \x86\x23\x75 |0 \x86\x26\x3B |0 - \x89\x23\x3E |0 \x85\x25\x40 |0 \x86\x29\x74 |0 \x86\x29\x77 |0 \x86\x29\x78 |0 \x86\x29\x76 |0 - \x89\x25\x67 |0 - \x89\x25\x69 |0 - \x89\x25\x6A |0 - \x89\x25\x6B |0 - \x89\x25\x68 |0 \x86\x29\x75 |0 \x86\x35\x65 |0 \x86\x35\x66 |0 - \x89\x2E\x38 |0 - \x89\x2E\x39 |0 \x84\x30\x63 |0 \x84\x30\x61 |0 \x84\x30\x62 |0 - \x89\x33\x3B |0 - \x89\x39\x53 |0 - \x89\x39\x54 |0 \x86\x50\x78 |0 \x86\x50\x77 |0 \x86\x50\x79 |0 \x86\x50\x7B |0 - \x89\x40\x50 |0 - \x89\x46\x6A |0 - \x89\x46\x6B |0 \x85\x4C\x2F |0 - \x89\x4D\x6B |0 - \x89\x4D\x6C |0 \x87\x21\x40 |0 \x87\x37\x26 |0 - \x89\x5E\x38 |0 \x87\x46\x30 |0 \x87\x52\x78 |0 \x87\x60\x6A |0 @@ -26493,15 +25820,10 @@ CHARMAP \x86\x29\x7A |0 \x86\x29\x7E |0 \x86\x29\x79 |0 - \x89\x25\x6C |0 \x86\x2A\x22 |0 \x84\x28\x52 |0 \x84\x28\x51 |0 \x85\x28\x37 |0 - \x89\x29\x48 |0 - \x89\x29\x49 |0 - \x89\x29\x4A |0 - \x89\x29\x4B |0 \x86\x2F\x39 |0 \x86\x35\x68 |0 \x84\x2B\x79 |0 @@ -26522,11 +25844,9 @@ CHARMAP \x85\x44\x6D |0 \x86\x5B\x32 |0 \x87\x21\x41 |0 - \x89\x53\x58 |0 \x87\x63\x4B |0 \x85\x21\x3E |0 \x84\x21\x43 |0 - \x89\x21\x34 |0 \x86\x21\x5B |0 \x84\x22\x46 |0 \x86\x2A\x24 |0 @@ -26560,21 +25880,17 @@ CHARMAP \x85\x22\x40 |0 \x85\x22\x3D |0 \x85\x22\x3E |0 - \x89\x22\x2D |0 \x86\x26\x3E |0 \x85\x23\x50 |0 \x86\x26\x3D |0 \x85\x23\x51 |0 \x86\x25\x5E |0 - \x89\x23\x3F |0 \x86\x2A\x27 |0 \x86\x2A\x26 |0 \x86\x2A\x29 |0 \x86\x2A\x28 |0 \x85\x25\x41 |0 \x84\x25\x58 |0 - \x89\x25\x6D |0 - \x89\x25\x6E |0 \x86\x2A\x25 |0 \x85\x28\x39 |0 \x84\x28\x54 |0 @@ -26586,8 +25902,6 @@ CHARMAP \x86\x2F\x3E |0 \x86\x2F\x42 |0 \x86\x2F\x43 |0 - \x89\x29\x4D |0 - \x89\x29\x4E |0 \x84\x28\x55 |0 \x86\x2F\x3F |0 \x86\x35\x73 |0 @@ -26602,15 +25916,12 @@ CHARMAP \x86\x35\x71 |0 \x86\x35\x6E |0 \x85\x2C\x35 |0 - \x89\x2E\x3A |0 - \x89\x2E\x3B |0 \x86\x3D\x60 |0 \x86\x3D\x5B |0 \x84\x30\x67 |0 \x86\x3D\x5F |0 \x86\x3D\x5C |0 \x86\x3D\x5D |0 - \x89\x33\x3D |0 \x85\x31\x30 |0 \x86\x3D\x5E |0 \x84\x30\x66 |0 @@ -26621,14 +25932,12 @@ CHARMAP \x86\x46\x7B |0 \x86\x46\x79 |0 \x86\x46\x7D |0 - \x89\x39\x55 |0 \x86\x46\x7E |0 \x85\x3D\x7C |0 \x85\x3D\x7D |0 \x86\x51\x24 |0 \x86\x51\x23 |0 \x86\x50\x7E |0 - \x89\x40\x51 |0 \x86\x51\x21 |0 \x84\x3C\x3F |0 \x84\x42\x49 |0 @@ -26637,8 +25946,6 @@ CHARMAP \x86\x5B\x33 |0 \x86\x5B\x38 |0 \x85\x44\x6F |0 - \x89\x46\x6D |0 - \x89\x46\x6E |0 \x86\x5B\x36 |0 \x86\x5B\x39 |0 \x86\x5B\x3B |0 @@ -26649,18 +25956,11 @@ CHARMAP \x85\x4C\x30 |0 \x87\x21\x44 |0 \x87\x21\x42 |0 - \x89\x4D\x6D |0 \x87\x25\x48 |0 \x85\x53\x65 |0 \x87\x2C\x53 |0 \x87\x2C\x52 |0 - \x89\x53\x59 |0 - \x89\x53\x5A |0 \x87\x3B\x4D |0 - \x89\x5E\x39 |0 - \x89\x5E\x3A |0 - \x89\x5E\x3B |0 - \x89\x64\x7C |0 \x87\x4E\x27 |0 \x87\x52\x79 |0 \x85\x77\x54 |0 @@ -26676,11 +25976,9 @@ CHARMAP \x84\x22\x4A |0 \x86\x24\x23 |0 \x86\x24\x21 |0 - \x89\x22\x2E |0 \x84\x22\x49 |0 \x86\x24\x22 |0 \x86\x26\x40 |0 - \x89\x23\x40 |0 \x85\x23\x3C |0 \x86\x2A\x2C |0 \x86\x2A\x2B |0 @@ -26689,7 +25987,6 @@ CHARMAP \x86\x2F\x47 |0 \x86\x2F\x48 |0 \x84\x28\x56 |0 - \x89\x29\x4F |0 \x86\x35\x76 |0 \x86\x35\x75 |0 \x86\x36\x49 |0 @@ -26698,18 +25995,14 @@ CHARMAP \x86\x47\x22 |0 \x86\x47\x24 |0 \x86\x4D\x62 |0 - \x89\x39\x56 |0 \x86\x47\x23 |0 \x85\x3E\x21 |0 \x86\x51\x25 |0 \x85\x3D\x7E |0 - \x89\x40\x52 |0 \x86\x5B\x3C |0 - \x89\x46\x6F |0 \x86\x60\x72 |0 \x87\x21\x45 |0 \x85\x53\x66 |0 - \x89\x59\x57 |0 \x87\x4B\x6A |0 \x86\x21\x60 |0 \x85\x21\x40 |0 @@ -26734,23 +26027,16 @@ CHARMAP \x86\x26\x44 |0 \x86\x26\x42 |0 \x85\x23\x52 |0 - \x89\x23\x41 |0 - \x89\x23\x42 |0 - \x89\x23\x43 |0 - \x89\x23\x44 |0 \x84\x23\x50 |0 \x86\x2A\x31 |0 \x86\x2A\x2F |0 \x86\x2A\x32 |0 \x86\x2A\x30 |0 - \x89\x25\x6F |0 \x86\x2F\x4D |0 \x86\x2F\x4A |0 \x86\x2F\x4C |0 \x86\x2F\x4B |0 \x86\x2F\x49 |0 - \x89\x29\x51 |0 - \x89\x29\x52 |0 \x86\x32\x72 |0 \x85\x28\x36 |0 \x86\x35\x7B |0 @@ -26759,10 +26045,6 @@ CHARMAP \x86\x35\x79 |0 \x86\x35\x77 |0 \x86\x35\x7A |0 - \x89\x2E\x3C |0 - \x89\x2E\x3D |0 - \x89\x2E\x3E |0 - \x89\x2E\x3F |0 \x86\x3C\x67 |0 \x86\x3D\x66 |0 \x86\x3D\x68 |0 @@ -26782,11 +26064,6 @@ CHARMAP \x85\x36\x6D |0 \x86\x47\x27 |0 \x86\x47\x25 |0 - \x89\x33\x3E |0 - \x89\x39\x57 |0 - \x89\x39\x58 |0 - \x89\x39\x59 |0 - \x89\x39\x5A |0 \x86\x47\x26 |0 \x84\x3C\x43 |0 \x84\x3C\x42 |0 @@ -26802,24 +26079,19 @@ CHARMAP \x86\x5B\x3D |0 \x85\x44\x70 |0 \x86\x53\x7B |0 - \x89\x4D\x55 |0 \x85\x4C\x33 |0 \x85\x4C\x34 |0 - \x89\x46\x70 |0 \x85\x4C\x32 |0 \x87\x2C\x55 |0 - \x89\x53\x5B |0 \x83\x50\x39 |0 \x85\x54\x2E |0 \x87\x2C\x54 |0 \x87\x37\x29 |0 \x87\x37\x28 |0 - \x89\x59\x58 |0 \x84\x5A\x6F |0 \x87\x46\x32 |0 \x87\x46\x31 |0 \x84\x66\x31 |0 - \x89\x67\x45 |0 \x87\x57\x51 |0 \x85\x75\x66 |0 \x87\x5E\x51 |0 @@ -26828,7 +26100,6 @@ CHARMAP \x86\x21\x64 |0 \x84\x21\x47 |0 \x84\x21\x46 |0 - \x89\x21\x36 |0 \x86\x21\x63 |0 \x85\x21\x61 |0 \x86\x22\x59 |0 @@ -26838,7 +26109,6 @@ CHARMAP \x86\x22\x5D |0 \x86\x22\x57 |0 \x86\x22\x42 |0 - \x89\x21\x4E |0 \x86\x22\x5C |0 \x85\x22\x47 |0 \x86\x24\x2D |0 @@ -26852,13 +26122,7 @@ CHARMAP \x84\x22\x4E |0 \x85\x22\x44 |0 \x86\x24\x28 |0 - \x89\x22\x2F |0 - \x89\x22\x30 |0 - \x89\x22\x32 |0 - \x89\x22\x34 |0 \x86\x24\x2A |0 - \x89\x22\x31 |0 - \x89\x22\x33 |0 \x85\x22\x43 |0 \x86\x24\x29 |0 \x86\x24\x2B |0 @@ -26883,13 +26147,6 @@ CHARMAP \x85\x23\x55 |0 \x86\x26\x47 |0 \x85\x23\x5C |0 - \x89\x23\x45 |0 - \x89\x23\x46 |0 - \x89\x23\x47 |0 - \x89\x23\x4A |0 - \x89\x23\x4B |0 - \x89\x23\x4C |0 - \x89\x23\x48 |0 \x86\x26\x4B |0 \x86\x26\x4A |0 \x86\x26\x50 |0 @@ -26921,27 +26178,11 @@ CHARMAP \x85\x25\x4E |0 \x86\x2A\x3D |0 \x85\x25\x4F |0 - \x89\x25\x70 |0 - \x89\x25\x72 |0 - \x89\x25\x73 |0 - \x89\x25\x74 |0 - \x89\x25\x75 |0 - \x89\x25\x76 |0 - \x89\x25\x77 |0 - \x89\x25\x78 |0 - \x89\x25\x79 |0 - \x89\x25\x7A |0 - \x89\x25\x7D |0 - \x89\x25\x7E |0 - \x89\x26\x21 |0 - \x89\x26\x22 |0 - \x89\x26\x23 |0 \x85\x25\x46 |0 \x86\x2A\x35 |0 \x85\x25\x43 |0 \x86\x2A\x38 |0 \x86\x2A\x37 |0 - \x89\x25\x7C |0 \x86\x2A\x3A |0 \x85\x2C\x38 |0 \x85\x28\x46 |0 @@ -26978,28 +26219,9 @@ CHARMAP \x86\x2F\x52 |0 \x85\x28\x40 |0 \x85\x28\x42 |0 - \x89\x2B\x33 |0 - \x89\x29\x53 |0 - \x89\x29\x55 |0 - \x89\x29\x56 |0 - \x89\x29\x57 |0 - \x89\x29\x58 |0 - \x89\x29\x59 |0 - \x89\x29\x5A |0 - \x89\x29\x5B |0 - \x89\x29\x5E |0 - \x89\x29\x5F |0 - \x89\x29\x60 |0 - \x89\x29\x61 |0 - \x89\x29\x62 |0 - \x89\x29\x63 |0 - \x89\x29\x64 |0 - \x89\x29\x66 |0 - \x89\x29\x67 |0 \x85\x28\x43 |0 \x85\x28\x44 |0 \x84\x28\x5D |0 - \x89\x29\x65 |0 \x86\x2F\x55 |0 \x86\x2F\x53 |0 \x84\x28\x58 |0 @@ -27040,22 +26262,6 @@ CHARMAP \x85\x2C\x59 |0 \x85\x2C\x44 |0 \x85\x2C\x55 |0 - \x89\x2E\x40 |0 - \x89\x2E\x41 |0 - \x89\x2E\x43 |0 - \x89\x2E\x44 |0 - \x89\x2E\x48 |0 - \x89\x2E\x49 |0 - \x89\x2E\x4B |0 - \x89\x2E\x4C |0 - \x89\x2E\x4D |0 - \x89\x2E\x4E |0 - \x89\x2E\x4F |0 - \x89\x2E\x50 |0 - \x89\x2E\x51 |0 - \x89\x2E\x52 |0 - \x89\x2E\x53 |0 - \x89\x2E\x54 |0 \x86\x39\x5E |0 \x86\x36\x21 |0 \x85\x2C\x42 |0 @@ -27067,7 +26273,6 @@ CHARMAP \x85\x2C\x39 |0 \x85\x2C\x3A |0 \x85\x2C\x3B |0 - \x89\x2E\x45 |0 \x85\x2C\x4A |0 \x85\x2C\x4F |0 \x85\x2C\x3E |0 @@ -27106,18 +26311,6 @@ CHARMAP \x85\x31\x38 |0 \x86\x3D\x72 |0 \x86\x3D\x7B |0 - \x89\x33\x3F |0 - \x89\x33\x40 |0 - \x89\x33\x41 |0 - \x89\x33\x42 |0 - \x89\x33\x44 |0 - \x89\x33\x45 |0 - \x89\x33\x46 |0 - \x89\x33\x47 |0 - \x89\x33\x48 |0 - \x89\x33\x49 |0 - \x89\x33\x4C |0 - \x89\x33\x4D |0 \x85\x31\x37 |0 \x86\x3D\x73 |0 \x85\x31\x39 |0 @@ -27182,33 +26375,12 @@ CHARMAP \x84\x36\x64 |0 \x85\x37\x26 |0 \x85\x36\x73 |0 - \x89\x39\x5B |0 - \x89\x39\x5D |0 - \x89\x39\x5E |0 - \x89\x39\x61 |0 - \x89\x39\x62 |0 - \x89\x39\x63 |0 - \x89\x39\x64 |0 - \x89\x39\x65 |0 - \x89\x39\x66 |0 - \x89\x39\x67 |0 - \x89\x39\x68 |0 - \x89\x39\x6A |0 - \x89\x39\x6D |0 - \x89\x39\x6E |0 - \x89\x39\x6F |0 - \x89\x39\x70 |0 \x85\x36\x74 |0 \x85\x36\x75 |0 \x85\x36\x7B |0 \x85\x37\x25 |0 \x85\x37\x21 |0 \x86\x47\x3B |0 - \x89\x39\x6B |0 - \x89\x39\x5C |0 - \x89\x39\x5F |0 - \x89\x39\x69 |0 - \x89\x39\x6C |0 \x85\x37\x2B |0 \x85\x37\x2F |0 \x86\x47\x3D |0 @@ -27266,33 +26438,17 @@ CHARMAP \x86\x51\x2E |0 \x86\x51\x2B |0 \x86\x51\x2D |0 - \x89\x47\x26 |0 \x85\x3E\x3E |0 \x86\x51\x31 |0 - \x89\x40\x56 |0 - \x89\x40\x57 |0 - \x89\x40\x58 |0 - \x89\x40\x59 |0 - \x89\x40\x5A |0 - \x89\x40\x5B |0 - \x89\x40\x5C |0 - \x89\x40\x5D |0 - \x89\x40\x5E |0 - \x89\x40\x5F |0 - \x89\x40\x60 |0 - \x89\x40\x61 |0 - \x89\x40\x63 |0 \x86\x51\x2F |0 \x86\x51\x34 |0 \x86\x51\x3C |0 - \x89\x40\x54 |0 \x86\x51\x42 |0 \x85\x3E\x3C |0 \x85\x3E\x36 |0 \x85\x3E\x25 |0 \x85\x3E\x29 |0 \x85\x3E\x26 |0 - \x89\x40\x64 |0 \x86\x5B\x46 |0 \x86\x5B\x40 |0 \x86\x5B\x4B |0 @@ -27324,41 +26480,14 @@ CHARMAP \x86\x5B\x4A |0 \x85\x44\x78 |0 \x86\x5B\x4D |0 - \x89\x46\x71 |0 - \x89\x46\x72 |0 - \x89\x46\x73 |0 - \x89\x46\x74 |0 - \x89\x46\x76 |0 - \x89\x46\x77 |0 - \x89\x46\x78 |0 - \x89\x46\x79 |0 - \x89\x46\x7A |0 - \x89\x46\x7B |0 - \x89\x46\x7C |0 - \x89\x46\x7E |0 - \x89\x47\x21 |0 - \x89\x47\x22 |0 - \x89\x47\x23 |0 - \x89\x47\x27 |0 - \x89\x47\x28 |0 - \x89\x47\x29 |0 - \x89\x47\x2A |0 - \x89\x47\x2B |0 - \x89\x47\x2C |0 - \x89\x47\x2D |0 - \x89\x47\x24 |0 \x86\x5B\x48 |0 - \x89\x46\x75 |0 \x85\x44\x74 |0 \x85\x44\x7A |0 \x86\x5B\x4E |0 \x85\x45\x21 |0 - \x89\x46\x7D |0 \x86\x5B\x44 |0 - \x89\x47\x25 |0 \x85\x4C\x35 |0 \x85\x44\x7D |0 - \x89\x46\x6C |0 \x87\x21\x51 |0 \x85\x4C\x3B |0 \x87\x21\x55 |0 @@ -27394,7 +26523,6 @@ CHARMAP \x87\x21\x47 |0 \x87\x21\x62 |0 \x87\x21\x5C |0 - \x89\x4D\x7A |0 \x87\x21\x5E |0 \x85\x4C\x42 |0 \x87\x21\x61 |0 @@ -27402,16 +26530,6 @@ CHARMAP \x85\x4C\x37 |0 \x84\x49\x32 |0 \x85\x4C\x47 |0 - \x89\x4D\x6F |0 - \x89\x4D\x70 |0 - \x89\x4D\x71 |0 - \x89\x4D\x72 |0 - \x89\x4D\x73 |0 - \x89\x4D\x74 |0 - \x89\x4D\x75 |0 - \x89\x4D\x76 |0 - \x89\x4D\x78 |0 - \x89\x4D\x79 |0 \x85\x4C\x44 |0 \x87\x21\x5F |0 \x87\x26\x2B |0 @@ -27453,35 +26571,15 @@ CHARMAP \x87\x2C\x67 |0 \x87\x2C\x58 |0 \x87\x2C\x57 |0 - \x89\x4D\x77 |0 \x84\x4F\x69 |0 \x84\x4F\x74 |0 \x85\x53\x77 |0 \x87\x2C\x66 |0 - \x89\x53\x5C |0 - \x89\x53\x5E |0 - \x89\x53\x5F |0 - \x89\x53\x60 |0 - \x89\x53\x61 |0 - \x89\x53\x62 |0 - \x89\x53\x63 |0 - \x89\x53\x64 |0 - \x89\x53\x65 |0 - \x89\x53\x67 |0 - \x89\x53\x68 |0 - \x89\x53\x69 |0 - \x89\x53\x6A |0 - \x89\x53\x6B |0 - \x89\x53\x6C |0 - \x89\x53\x6D |0 - \x89\x53\x6E |0 - \x89\x53\x6F |0 \x87\x2C\x5E |0 \x87\x2C\x5D |0 \x87\x2C\x62 |0 \x87\x2C\x69 |0 \x85\x53\x6D |0 - \x89\x55\x74 |0 \x85\x53\x76 |0 \x84\x55\x7A |0 \x85\x5B\x26 |0 @@ -27506,13 +26604,6 @@ CHARMAP \x84\x55\x75 |0 \x87\x37\x32 |0 \x87\x37\x39 |0 - \x89\x59\x59 |0 - \x89\x59\x5A |0 - \x89\x59\x5E |0 - \x89\x59\x5F |0 - \x89\x59\x60 |0 - \x89\x59\x61 |0 - \x89\x59\x62 |0 \x87\x37\x38 |0 \x87\x37\x30 |0 \x87\x37\x36 |0 @@ -27547,18 +26638,8 @@ CHARMAP \x87\x3F\x26 |0 \x87\x3F\x2C |0 \x85\x61\x42 |0 - \x89\x59\x5B |0 \x87\x3F\x25 |0 - \x89\x5E\x3C |0 - \x89\x5E\x3D |0 - \x89\x5E\x3E |0 - \x89\x5E\x3F |0 - \x89\x5E\x40 |0 - \x89\x5E\x43 |0 - \x89\x5E\x44 |0 - \x89\x5E\x45 |0 \x85\x61\x3F |0 - \x89\x5E\x4A |0 \x87\x46\x34 |0 \x84\x5F\x4E |0 \x85\x5B\x25 |0 @@ -27575,13 +26656,7 @@ CHARMAP \x87\x46\x35 |0 \x87\x46\x38 |0 \x84\x5F\x4F |0 - \x89\x5E\x46 |0 \x85\x67\x5C |0 - \x89\x62\x22 |0 - \x89\x62\x23 |0 - \x89\x62\x24 |0 - \x89\x62\x25 |0 - \x89\x62\x26 |0 \x87\x46\x36 |0 \x87\x47\x6E |0 \x87\x46\x3D |0 @@ -27596,9 +26671,6 @@ CHARMAP \x87\x4D\x48 |0 \x87\x4D\x46 |0 \x87\x4D\x4A |0 - \x89\x64\x7D |0 - \x89\x64\x7E |0 - \x89\x65\x21 |0 \x87\x4D\x4C |0 \x85\x6B\x72 |0 \x87\x52\x7B |0 @@ -27612,8 +26684,6 @@ CHARMAP \x85\x6F\x70 |0 \x87\x52\x7D |0 \x84\x66\x33 |0 - \x89\x67\x47 |0 - \x89\x67\x48 |0 \x85\x6F\x6C |0 \x87\x52\x7C |0 \x87\x57\x59 |0 @@ -27625,12 +26695,10 @@ CHARMAP \x87\x57\x54 |0 \x87\x57\x52 |0 \x87\x57\x53 |0 - \x89\x69\x3C |0 \x84\x68\x64 |0 \x87\x57\x58 |0 \x87\x5B\x49 |0 \x87\x5B\x4A |0 - \x89\x6A\x4D |0 \x87\x5B\x48 |0 \x87\x5B\x47 |0 \x85\x77\x55 |0 @@ -27640,28 +26708,21 @@ CHARMAP \x87\x5E\x55 |0 \x87\x5E\x54 |0 \x87\x5E\x56 |0 - \x89\x6B\x43 |0 \x85\x75\x67 |0 \x85\x79\x23 |0 \x84\x6C\x6D |0 - \x89\x6C\x22 |0 - \x89\x6C\x23 |0 \x87\x60\x6B |0 \x87\x62\x32 |0 \x87\x62\x31 |0 \x87\x62\x34 |0 \x87\x62\x30 |0 \x87\x62\x33 |0 - \x89\x6C\x79 |0 - \x89\x6C\x7A |0 \x86\x21\x65 |0 \x86\x21\x66 |0 - \x89\x21\x37 |0 \x84\x21\x6E |0 \x86\x24\x32 |0 \x86\x24\x30 |0 \x85\x22\x49 |0 - \x89\x22\x35 |0 \x86\x24\x31 |0 \x86\x24\x2F |0 \x85\x22\x48 |0 @@ -27670,8 +26731,6 @@ CHARMAP \x86\x2A\x3E |0 \x86\x26\x58 |0 \x86\x26\x56 |0 - \x89\x23\x4F |0 - \x89\x23\x51 |0 \x86\x26\x57 |0 \x86\x26\x59 |0 \x86\x26\x5C |0 @@ -27688,7 +26747,6 @@ CHARMAP \x86\x2A\x42 |0 \x86\x2D\x34 |0 \x86\x2A\x3F |0 - \x89\x26\x24 |0 \x85\x25\x54 |0 \x85\x28\x54 |0 \x85\x28\x56 |0 @@ -27718,9 +26776,6 @@ CHARMAP \x86\x47\x41 |0 \x85\x37\x31 |0 \x85\x31\x55 |0 - \x89\x39\x72 |0 - \x89\x39\x73 |0 - \x89\x39\x74 |0 \x86\x47\x42 |0 \x85\x37\x32 |0 \x85\x3E\x40 |0 @@ -27730,23 +26785,17 @@ CHARMAP \x86\x51\x48 |0 \x85\x3E\x42 |0 \x86\x51\x46 |0 - \x89\x40\x65 |0 \x86\x5B\x54 |0 \x86\x5B\x58 |0 \x85\x45\x24 |0 \x86\x5B\x55 |0 \x86\x5B\x5A |0 \x86\x5B\x56 |0 - \x89\x47\x2E |0 - \x89\x47\x2F |0 - \x89\x47\x30 |0 \x86\x5B\x57 |0 \x87\x21\x65 |0 \x87\x21\x66 |0 \x87\x21\x64 |0 - \x89\x4D\x7B |0 \x84\x4F\x75 |0 - \x89\x53\x73 |0 \x87\x37\x3C |0 \x87\x37\x3A |0 \x87\x37\x3B |0 @@ -27757,12 +26806,8 @@ CHARMAP \x84\x21\x48 |0 \x85\x21\x44 |0 \x86\x22\x60 |0 - \x89\x21\x51 |0 - \x89\x21\x52 |0 \x86\x22\x61 |0 \x86\x24\x35 |0 - \x89\x22\x36 |0 - \x89\x22\x37 |0 \x86\x24\x34 |0 \x86\x26\x6A |0 \x84\x23\x60 |0 @@ -27773,11 +26818,6 @@ CHARMAP \x86\x26\x5D |0 \x86\x26\x65 |0 \x86\x26\x67 |0 - \x89\x23\x53 |0 - \x89\x23\x54 |0 - \x89\x23\x56 |0 - \x89\x23\x58 |0 - \x89\x23\x5A |0 \x86\x26\x60 |0 \x86\x26\x63 |0 \x86\x26\x68 |0 @@ -27785,7 +26825,6 @@ CHARMAP \x86\x26\x61 |0 \x86\x26\x5F |0 \x85\x23\x5E |0 - \x89\x23\x59 |0 \x85\x23\x5D |0 \x85\x23\x5F |0 \x85\x23\x60 |0 @@ -27803,24 +26842,11 @@ CHARMAP \x86\x2A\x51 |0 \x86\x26\x41 |0 \x86\x2A\x49 |0 - \x89\x26\x26 |0 - \x89\x26\x27 |0 - \x89\x26\x28 |0 - \x89\x26\x29 |0 - \x89\x26\x2A |0 - \x89\x26\x30 |0 - \x89\x26\x31 |0 - \x89\x26\x2C |0 - \x89\x26\x2B |0 \x84\x25\x6B |0 - \x89\x26\x2F |0 - \x89\x26\x2E |0 \x86\x2A\x50 |0 \x86\x2A\x4B |0 \x86\x2A\x4D |0 \x86\x2A\x4E |0 - \x89\x26\x32 |0 - \x89\x26\x25 |0 \x86\x2A\x45 |0 \x86\x2A\x44 |0 \x85\x25\x57 |0 @@ -27833,32 +26859,12 @@ CHARMAP \x84\x28\x5F |0 \x86\x2F\x6B |0 \x86\x2F\x63 |0 - \x89\x29\x7A |0 - \x89\x29\x68 |0 - \x89\x29\x69 |0 - \x89\x29\x6B |0 - \x89\x29\x6C |0 - \x89\x29\x6D |0 - \x89\x29\x6E |0 - \x89\x29\x6F |0 - \x89\x29\x70 |0 - \x89\x29\x72 |0 - \x89\x29\x73 |0 - \x89\x29\x75 |0 - \x89\x29\x76 |0 - \x89\x29\x77 |0 - \x89\x29\x78 |0 - \x89\x29\x79 |0 - \x89\x29\x7B |0 - \x89\x29\x7C |0 - \x89\x29\x7D |0 \x86\x2F\x6A |0 \x86\x2F\x6C |0 \x86\x34\x31 |0 \x86\x2F\x67 |0 \x86\x2F\x68 |0 \x86\x2F\x66 |0 - \x89\x29\x74 |0 \x85\x28\x5D |0 \x85\x28\x5A |0 \x85\x28\x5E |0 @@ -27879,16 +26885,6 @@ CHARMAP \x86\x36\x3A |0 \x86\x36\x2F |0 \x86\x36\x40 |0 - \x89\x2E\x55 |0 - \x89\x2E\x56 |0 - \x89\x2E\x57 |0 - \x89\x2E\x58 |0 - \x89\x2E\x59 |0 - \x89\x2E\x5A |0 - \x89\x2E\x5B |0 - \x89\x2E\x5E |0 - \x89\x2E\x5F |0 - \x89\x2E\x60 |0 \x86\x36\x30 |0 \x86\x36\x3F |0 \x86\x36\x37 |0 @@ -27896,8 +26892,6 @@ CHARMAP \x86\x36\x39 |0 \x85\x2C\x60 |0 \x86\x36\x3B |0 - \x89\x2E\x5D |0 - \x89\x2E\x61 |0 \x86\x36\x33 |0 \x85\x2C\x5F |0 \x85\x2C\x62 |0 @@ -27915,25 +26909,8 @@ CHARMAP \x85\x31\x5A |0 \x84\x31\x22 |0 \x84\x31\x23 |0 - \x89\x33\x4F |0 - \x89\x33\x5B |0 \x86\x3E\x2E |0 \x86\x3E\x2F |0 - \x89\x33\x4E |0 - \x89\x33\x50 |0 - \x89\x33\x51 |0 - \x89\x33\x52 |0 - \x89\x33\x53 |0 - \x89\x33\x54 |0 - \x89\x33\x55 |0 - \x89\x33\x56 |0 - \x89\x33\x58 |0 - \x89\x33\x59 |0 - \x89\x33\x5A |0 - \x89\x33\x5E |0 - \x89\x33\x5F |0 - \x89\x33\x60 |0 - \x89\x33\x61 |0 \x85\x31\x5C |0 \x86\x3E\x31 |0 \x86\x3E\x35 |0 @@ -27964,24 +26941,11 @@ CHARMAP \x84\x36\x73 |0 \x86\x4F\x6D |0 \x85\x37\x38 |0 - \x89\x39\x76 |0 - \x89\x39\x78 |0 - \x89\x39\x79 |0 - \x89\x39\x7A |0 - \x89\x39\x7B |0 - \x89\x39\x7C |0 - \x89\x3A\x21 |0 - \x89\x3A\x22 |0 - \x89\x3A\x23 |0 - \x89\x3A\x24 |0 - \x89\x3A\x25 |0 - \x89\x3A\x26 |0 \x86\x47\x51 |0 \x86\x47\x4A |0 \x86\x47\x49 |0 \x84\x36\x74 |0 \x86\x47\x4C |0 - \x89\x39\x75 |0 \x85\x37\x37 |0 \x85\x37\x3A |0 \x86\x47\x48 |0 @@ -28009,22 +26973,8 @@ CHARMAP \x85\x3E\x47 |0 \x86\x51\x49 |0 \x86\x51\x4C |0 - \x89\x39\x77 |0 \x86\x51\x53 |0 \x86\x51\x4D |0 - \x89\x40\x66 |0 - \x89\x40\x67 |0 - \x89\x40\x68 |0 - \x89\x40\x6A |0 - \x89\x40\x6B |0 - \x89\x40\x6C |0 - \x89\x40\x6D |0 - \x89\x40\x6E |0 - \x89\x40\x6F |0 - \x89\x40\x70 |0 - \x89\x40\x71 |0 - \x89\x40\x72 |0 - \x89\x40\x73 |0 \x86\x51\x4F |0 \x85\x3E\x4E |0 \x85\x3E\x48 |0 @@ -28041,22 +26991,10 @@ CHARMAP \x86\x5B\x60 |0 \x85\x45\x26 |0 \x86\x5B\x67 |0 - \x89\x47\x32 |0 - \x89\x47\x33 |0 - \x89\x47\x34 |0 - \x89\x47\x35 |0 - \x89\x47\x36 |0 - \x89\x47\x37 |0 - \x89\x47\x39 |0 - \x89\x47\x3A |0 - \x89\x47\x3B |0 - \x89\x47\x3C |0 \x86\x5B\x5D |0 - \x89\x47\x38 |0 \x86\x5B\x6B |0 \x86\x5B\x63 |0 \x86\x5B\x53 |0 - \x89\x47\x31 |0 \x84\x42\x5A |0 \x86\x5B\x65 |0 \x86\x5B\x5E |0 @@ -28074,20 +27012,10 @@ CHARMAP \x84\x49\x37 |0 \x87\x21\x77 |0 \x87\x21\x74 |0 - \x89\x4E\x21 |0 \x85\x4C\x4D |0 \x85\x4C\x4F |0 \x87\x21\x67 |0 \x87\x21\x75 |0 - \x89\x4D\x7C |0 - \x89\x4D\x7D |0 - \x89\x4E\x26 |0 - \x89\x4E\x27 |0 - \x89\x4E\x28 |0 - \x89\x4E\x29 |0 - \x89\x4E\x2A |0 - \x89\x4E\x2B |0 - \x89\x4E\x2D |0 \x87\x21\x6C |0 \x87\x21\x6D |0 \x87\x21\x6E |0 @@ -28095,9 +27023,6 @@ CHARMAP \x87\x21\x73 |0 \x87\x21\x71 |0 \x87\x21\x69 |0 - \x89\x4D\x7E |0 - \x89\x4E\x24 |0 - \x89\x4E\x23 |0 \x85\x4C\x4E |0 \x85\x4C\x4A |0 \x85\x4C\x48 |0 @@ -28111,10 +27036,6 @@ CHARMAP \x84\x4F\x79 |0 \x87\x2C\x6D |0 \x87\x2C\x70 |0 - \x89\x4E\x2C |0 - \x89\x53\x74 |0 - \x89\x53\x76 |0 - \x89\x53\x78 |0 \x85\x53\x7A |0 \x87\x2C\x72 |0 \x85\x53\x7B |0 @@ -28122,7 +27043,6 @@ CHARMAP \x87\x34\x6F |0 \x87\x2C\x73 |0 \x87\x2C\x6E |0 - \x89\x53\x77 |0 \x84\x4F\x76 |0 \x87\x37\x43 |0 \x84\x55\x7D |0 @@ -28134,14 +27054,6 @@ CHARMAP \x87\x37\x45 |0 \x85\x5B\x2C |0 \x87\x2C\x74 |0 - \x89\x59\x64 |0 - \x89\x59\x65 |0 - \x89\x59\x66 |0 - \x89\x59\x67 |0 - \x89\x59\x68 |0 - \x89\x59\x69 |0 - \x89\x59\x6A |0 - \x89\x59\x6B |0 \x87\x3E\x6C |0 \x87\x37\x40 |0 \x87\x37\x41 |0 @@ -28152,35 +27064,22 @@ CHARMAP \x87\x37\x3E |0 \x85\x61\x49 |0 \x87\x3F\x33 |0 - \x89\x5E\x47 |0 - \x89\x5E\x48 |0 - \x89\x5E\x49 |0 - \x89\x5E\x4B |0 - \x89\x5E\x4D |0 - \x89\x5E\x4E |0 \x87\x3F\x31 |0 \x87\x3F\x32 |0 \x85\x5B\x30 |0 \x85\x61\x48 |0 - \x89\x62\x28 |0 \x85\x61\x4A |0 \x87\x46\x42 |0 \x87\x46\x3F |0 \x85\x67\x5D |0 \x87\x46\x47 |0 \x87\x46\x41 |0 - \x89\x5E\x4C |0 - \x89\x62\x27 |0 \x87\x46\x43 |0 \x87\x46\x46 |0 \x87\x4A\x3B |0 \x87\x46\x40 |0 \x87\x3F\x35 |0 \x84\x63\x33 |0 - \x89\x65\x22 |0 - \x89\x65\x23 |0 - \x89\x65\x24 |0 - \x89\x65\x25 |0 \x87\x4D\x4E |0 \x85\x6B\x77 |0 \x87\x53\x28 |0 @@ -28190,15 +27089,10 @@ CHARMAP \x87\x53\x27 |0 \x87\x53\x25 |0 \x85\x6F\x74 |0 - \x89\x67\x49 |0 - \x89\x67\x4A |0 - \x89\x67\x4C |0 \x87\x53\x26 |0 - \x89\x67\x4B |0 \x85\x6F\x72 |0 \x85\x6F\x73 |0 \x87\x57\x5B |0 - \x89\x69\x3D |0 \x85\x73\x34 |0 \x87\x57\x5D |0 \x85\x73\x35 |0 @@ -28214,30 +27108,24 @@ CHARMAP \x86\x2F\x6D |0 \x86\x26\x6B |0 \x86\x2A\x52 |0 - \x89\x29\x7E |0 - \x89\x2A\x21 |0 \x85\x2C\x64 |0 \x86\x36\x42 |0 \x86\x2F\x6E |0 \x86\x36\x41 |0 - \x89\x2E\x62 |0 \x85\x2C\x63 |0 \x86\x3E\x36 |0 - \x89\x33\x62 |0 \x86\x47\x52 |0 \x86\x51\x59 |0 \x86\x51\x58 |0 \x86\x5B\x6A |0 \x86\x64\x7A |0 \x86\x5B\x68 |0 - \x89\x47\x3D |0 \x86\x5B\x69 |0 \x87\x21\x7A |0 \x87\x21\x79 |0 \x87\x2C\x75 |0 \x87\x3F\x36 |0 \x87\x43\x3F |0 - \x89\x5E\x4F |0 \x87\x3F\x37 |0 \x87\x46\x48 |0 \x87\x46\x49 |0 @@ -28248,7 +27136,6 @@ CHARMAP \x86\x24\x37 |0 \x86\x24\x36 |0 \x86\x26\x6C |0 - \x89\x23\x5C |0 \x86\x36\x43 |0 \x86\x3E\x37 |0 \x86\x3E\x38 |0 @@ -28259,8 +27146,6 @@ CHARMAP \x85\x23\x63 |0 \x84\x25\x6F |0 \x86\x2A\x53 |0 - \x89\x26\x34 |0 - \x89\x2E\x63 |0 \x85\x31\x5E |0 \x86\x3E\x39 |0 \x86\x3E\x3C |0 @@ -28269,13 +27154,9 @@ CHARMAP \x86\x3E\x3A |0 \x85\x3E\x4F |0 \x86\x51\x5C |0 - \x89\x40\x74 |0 \x86\x5B\x6C |0 - \x89\x47\x3E |0 \x86\x5B\x6D |0 \x85\x4C\x50 |0 - \x89\x4E\x2F |0 - \x89\x53\x79 |0 \x87\x2C\x76 |0 \x87\x2C\x77 |0 \x87\x37\x46 |0 @@ -28291,15 +27172,12 @@ CHARMAP \x86\x26\x6E |0 \x86\x26\x6D |0 \x86\x2A\x54 |0 - \x89\x25\x42 |0 \x85\x28\x5F |0 \x85\x2C\x68 |0 \x84\x2C\x35 |0 \x85\x2C\x67 |0 \x86\x36\x46 |0 \x86\x36\x45 |0 - \x89\x2E\x64 |0 - \x89\x2E\x65 |0 \x86\x36\x47 |0 \x85\x2C\x69 |0 \x84\x31\x24 |0 @@ -28308,13 +27186,11 @@ CHARMAP \x85\x31\x5F |0 \x85\x31\x60 |0 \x85\x31\x62 |0 - \x89\x33\x63 |0 \x86\x47\x54 |0 \x85\x37\x3E |0 \x85\x37\x42 |0 \x85\x37\x40 |0 \x85\x37\x41 |0 - \x89\x3A\x27 |0 \x85\x3E\x50 |0 \x86\x51\x5D |0 \x85\x3E\x52 |0 @@ -28334,10 +27210,7 @@ CHARMAP \x87\x46\x4C |0 \x86\x21\x67 |0 \x86\x21\x68 |0 - \x89\x21\x38 |0 \x86\x22\x66 |0 - \x89\x21\x53 |0 - \x89\x21\x54 |0 \x85\x21\x76 |0 \x86\x24\x3C |0 \x84\x22\x54 |0 @@ -28345,17 +27218,9 @@ CHARMAP \x86\x24\x40 |0 \x86\x24\x3E |0 \x86\x24\x3D |0 - \x89\x21\x6B |0 \x84\x23\x63 |0 \x84\x23\x64 |0 \x84\x23\x66 |0 - \x89\x23\x5D |0 - \x89\x23\x5E |0 - \x89\x23\x5F |0 - \x89\x23\x60 |0 - \x89\x23\x61 |0 - \x89\x23\x62 |0 - \x89\x23\x63 |0 \x86\x26\x70 |0 \x86\x26\x6F |0 \x84\x25\x76 |0 @@ -28367,8 +27232,6 @@ CHARMAP \x86\x2A\x5C |0 \x86\x2A\x58 |0 \x86\x2A\x59 |0 - \x89\x26\x36 |0 - \x89\x26\x37 |0 \x86\x2A\x5A |0 \x86\x2A\x5B |0 \x86\x2A\x5D |0 @@ -28380,27 +27243,15 @@ CHARMAP \x85\x28\x61 |0 \x85\x28\x62 |0 \x85\x28\x60 |0 - \x89\x2A\x23 |0 - \x89\x2A\x24 |0 - \x89\x2A\x25 |0 - \x89\x2A\x26 |0 - \x89\x2A\x28 |0 - \x89\x2A\x29 |0 - \x89\x2A\x27 |0 - \x89\x2A\x22 |0 \x85\x2C\x6C |0 \x86\x36\x48 |0 \x86\x36\x4B |0 \x85\x2C\x6A |0 \x85\x2C\x6D |0 - \x89\x2E\x67 |0 - \x89\x2E\x68 |0 - \x89\x2E\x69 |0 \x86\x36\x4A |0 \x84\x2C\x37 |0 \x85\x2C\x6B |0 \x85\x31\x64 |0 - \x89\x2E\x66 |0 \x84\x2C\x36 |0 \x86\x3E\x41 |0 \x86\x3E\x44 |0 @@ -28410,8 +27261,6 @@ CHARMAP \x86\x3E\x40 |0 \x86\x3E\x45 |0 \x86\x3E\x3F |0 - \x89\x33\x64 |0 - \x89\x33\x65 |0 \x84\x31\x27 |0 \x85\x31\x63 |0 \x84\x3C\x5E |0 @@ -28419,7 +27268,6 @@ CHARMAP \x86\x47\x5B |0 \x86\x47\x5D |0 \x86\x47\x5A |0 - \x89\x3A\x28 |0 \x86\x47\x55 |0 \x86\x47\x5C |0 \x85\x37\x43 |0 @@ -28431,7 +27279,6 @@ CHARMAP \x86\x51\x60 |0 \x86\x51\x61 |0 \x84\x3C\x5D |0 - \x89\x40\x76 |0 \x85\x3E\x53 |0 \x85\x3E\x54 |0 \x85\x3E\x55 |0 @@ -28439,9 +27286,6 @@ CHARMAP \x84\x42\x63 |0 \x85\x45\x2F |0 \x84\x42\x62 |0 - \x89\x47\x3F |0 - \x89\x47\x40 |0 - \x89\x47\x41 |0 \x86\x5B\x71 |0 \x85\x45\x30 |0 \x84\x49\x38 |0 @@ -28451,8 +27295,6 @@ CHARMAP \x87\x2C\x7C |0 \x87\x21\x7E |0 \x85\x4C\x53 |0 - \x89\x4E\x31 |0 - \x89\x4E\x32 |0 \x87\x21\x7D |0 \x84\x42\x64 |0 \x85\x4C\x52 |0 @@ -28461,31 +27303,20 @@ CHARMAP \x87\x2C\x78 |0 \x87\x2C\x79 |0 \x84\x56\x21 |0 - \x89\x53\x7A |0 \x87\x2C\x7A |0 \x87\x37\x48 |0 \x87\x37\x47 |0 \x85\x5B\x33 |0 \x84\x56\x2E |0 \x84\x5A\x7B |0 - \x89\x62\x29 |0 \x85\x6B\x78 |0 \x87\x53\x29 |0 - \x89\x69\x3E |0 \x85\x75\x68 |0 - \x89\x6B\x44 |0 \x87\x5E\x58 |0 - \x89\x6C\x5F |0 \x85\x21\x62 |0 - \x89\x21\x55 |0 - \x89\x21\x56 |0 \x86\x24\x41 |0 \x84\x22\x58 |0 \x86\x24\x42 |0 - \x89\x22\x39 |0 - \x89\x22\x3A |0 - \x89\x22\x3B |0 - \x89\x22\x3C |0 \x84\x22\x57 |0 \x85\x22\x4B |0 \x86\x24\x43 |0 @@ -28493,22 +27324,10 @@ CHARMAP \x86\x26\x74 |0 \x84\x23\x68 |0 \x84\x23\x6B |0 - \x89\x23\x64 |0 - \x89\x23\x66 |0 - \x89\x23\x68 |0 - \x89\x23\x69 |0 - \x89\x23\x6B |0 - \x89\x23\x6C |0 - \x89\x23\x6D |0 - \x89\x23\x6E |0 - \x89\x23\x6F |0 - \x89\x23\x65 |0 \x86\x26\x72 |0 \x86\x26\x73 |0 \x86\x26\x75 |0 \x86\x26\x71 |0 - \x89\x23\x6A |0 - \x89\x23\x67 |0 \x85\x23\x66 |0 \x85\x23\x67 |0 \x85\x23\x65 |0 @@ -28522,24 +27341,8 @@ CHARMAP \x85\x25\x5B |0 \x85\x25\x5C |0 \x84\x25\x7E |0 - \x89\x26\x3A |0 - \x89\x26\x3B |0 - \x89\x26\x3E |0 - \x89\x26\x3F |0 - \x89\x26\x40 |0 - \x89\x26\x41 |0 - \x89\x26\x42 |0 - \x89\x26\x43 |0 - \x89\x26\x45 |0 - \x89\x26\x46 |0 - \x89\x26\x47 |0 - \x89\x26\x48 |0 - \x89\x26\x49 |0 \x86\x2A\x5F |0 \x86\x2A\x5E |0 - \x89\x26\x44 |0 - \x89\x26\x3C |0 - \x89\x26\x3D |0 \x85\x25\x62 |0 \x85\x25\x5F |0 \x85\x25\x63 |0 @@ -28559,14 +27362,6 @@ CHARMAP \x86\x2F\x74 |0 \x85\x28\x6B |0 \x86\x2F\x7E |0 - \x89\x2A\x2D |0 - \x89\x2A\x2E |0 - \x89\x2A\x2F |0 - \x89\x2A\x30 |0 - \x89\x2A\x31 |0 - \x89\x2A\x32 |0 - \x89\x2A\x33 |0 - \x89\x2A\x34 |0 \x86\x2F\x73 |0 \x86\x2F\x77 |0 \x84\x28\x6C |0 @@ -28594,23 +27389,11 @@ CHARMAP \x86\x36\x56 |0 \x86\x36\x50 |0 \x86\x36\x51 |0 - \x89\x2E\x6C |0 - \x89\x2E\x6E |0 - \x89\x2E\x70 |0 - \x89\x2E\x71 |0 - \x89\x2E\x73 |0 - \x89\x2E\x74 |0 - \x89\x2E\x75 |0 - \x89\x2E\x76 |0 - \x89\x2E\x77 |0 - \x89\x2E\x79 |0 \x86\x36\x54 |0 \x86\x36\x4E |0 \x85\x2C\x71 |0 \x86\x36\x53 |0 \x86\x36\x52 |0 - \x89\x2E\x6F |0 - \x89\x2E\x72 |0 \x85\x2C\x77 |0 \x85\x2C\x74 |0 \x85\x2C\x73 |0 @@ -28631,31 +27414,6 @@ CHARMAP \x86\x3E\x4E |0 \x85\x31\x6B |0 \x86\x3E\x53 |0 - \x89\x33\x68 |0 - \x89\x33\x69 |0 - \x89\x33\x6A |0 - \x89\x33\x6B |0 - \x89\x33\x6C |0 - \x89\x33\x6D |0 - \x89\x33\x6E |0 - \x89\x33\x6F |0 - \x89\x33\x71 |0 - \x89\x33\x72 |0 - \x89\x33\x74 |0 - \x89\x33\x75 |0 - \x89\x33\x76 |0 - \x89\x33\x77 |0 - \x89\x33\x78 |0 - \x89\x33\x79 |0 - \x89\x33\x7A |0 - \x89\x33\x7B |0 - \x89\x33\x7C |0 - \x89\x33\x7D |0 - \x89\x33\x7E |0 - \x89\x34\x21 |0 - \x89\x34\x22 |0 - \x89\x34\x23 |0 - \x89\x33\x70 |0 \x86\x3E\x51 |0 \x84\x31\x2A |0 \x86\x3E\x4B |0 @@ -28683,37 +27441,10 @@ CHARMAP \x85\x37\x54 |0 \x85\x37\x47 |0 \x85\x37\x4B |0 - \x89\x3A\x29 |0 - \x89\x3A\x2B |0 - \x89\x3A\x2C |0 - \x89\x3A\x2D |0 - \x89\x3A\x2E |0 - \x89\x3A\x2F |0 - \x89\x3A\x30 |0 - \x89\x3A\x32 |0 - \x89\x3A\x33 |0 - \x89\x3A\x34 |0 - \x89\x3A\x36 |0 - \x89\x3A\x37 |0 - \x89\x3A\x38 |0 - \x89\x3A\x39 |0 - \x89\x3A\x3A |0 - \x89\x3A\x3E |0 - \x89\x3A\x3F |0 - \x89\x3A\x41 |0 - \x89\x3A\x42 |0 - \x89\x3A\x43 |0 - \x89\x3A\x44 |0 - \x89\x3A\x45 |0 - \x89\x3A\x3B |0 \x85\x37\x56 |0 \x86\x47\x63 |0 \x85\x37\x58 |0 \x86\x47\x5E |0 - \x89\x3A\x3D |0 - \x89\x3A\x40 |0 - \x89\x3A\x31 |0 - \x89\x3A\x2A |0 \x85\x37\x45 |0 \x85\x3E\x56 |0 \x85\x37\x53 |0 @@ -28724,7 +27455,6 @@ CHARMAP \x85\x37\x4D |0 \x85\x37\x55 |0 \x86\x47\x67 |0 - \x89\x33\x67 |0 \x85\x3E\x5F |0 \x85\x3E\x5A |0 \x85\x3E\x5D |0 @@ -28740,23 +27470,13 @@ CHARMAP \x85\x3E\x5C |0 \x85\x3E\x5B |0 \x86\x51\x66 |0 - \x89\x40\x78 |0 - \x89\x40\x79 |0 - \x89\x40\x7A |0 - \x89\x40\x7C |0 - \x89\x40\x7D |0 - \x89\x40\x7E |0 - \x89\x41\x22 |0 - \x89\x41\x23 |0 \x86\x51\x62 |0 \x86\x51\x64 |0 - \x89\x40\x77 |0 \x86\x51\x68 |0 \x85\x3E\x58 |0 \x85\x3E\x5E |0 \x85\x3E\x60 |0 \x86\x51\x6A |0 - \x89\x41\x21 |0 \x84\x42\x70 |0 \x85\x45\x32 |0 \x84\x42\x6A |0 @@ -28767,28 +27487,14 @@ CHARMAP \x87\x22\x29 |0 \x84\x42\x73 |0 \x86\x5B\x75 |0 - \x89\x47\x48 |0 \x84\x42\x6F |0 \x85\x45\x37 |0 \x84\x42\x6E |0 - \x89\x47\x47 |0 - \x89\x47\x49 |0 - \x89\x47\x4A |0 - \x89\x47\x4B |0 - \x89\x47\x4C |0 - \x89\x47\x4D |0 - \x89\x47\x4E |0 - \x89\x47\x4F |0 - \x89\x47\x50 |0 - \x89\x47\x51 |0 - \x89\x47\x52 |0 - \x89\x47\x54 |0 \x86\x5B\x74 |0 \x86\x5B\x78 |0 \x84\x42\x72 |0 \x84\x42\x65 |0 \x86\x5B\x76 |0 - \x89\x47\x53 |0 \x85\x45\x33 |0 \x85\x45\x36 |0 \x85\x45\x35 |0 @@ -28808,42 +27514,21 @@ CHARMAP \x87\x22\x25 |0 \x86\x5B\x79 |0 \x87\x22\x24 |0 - \x89\x4E\x3A |0 \x87\x37\x51 |0 - \x89\x47\x45 |0 \x85\x4C\x54 |0 \x85\x4C\x5C |0 - \x89\x4E\x33 |0 - \x89\x4E\x34 |0 - \x89\x4E\x35 |0 - \x89\x4E\x36 |0 - \x89\x4E\x37 |0 - \x89\x4E\x38 |0 - \x89\x4E\x39 |0 - \x89\x4E\x3B |0 - \x89\x4E\x3D |0 - \x89\x4E\x3E |0 - \x89\x4E\x3F |0 - \x89\x4E\x40 |0 - \x89\x4E\x41 |0 - \x89\x4E\x42 |0 - \x89\x4E\x44 |0 \x86\x5B\x7A |0 \x87\x22\x27 |0 \x87\x22\x2E |0 \x87\x22\x2D |0 \x87\x22\x28 |0 \x87\x22\x23 |0 - \x89\x4E\x45 |0 - \x89\x4E\x43 |0 - \x89\x4E\x3C |0 \x85\x4C\x5A |0 \x85\x4C\x55 |0 \x84\x49\x3D |0 \x87\x22\x2A |0 \x85\x4C\x58 |0 \x87\x22\x2B |0 - \x89\x54\x25 |0 \x85\x54\x28 |0 \x85\x54\x23 |0 \x87\x2D\x25 |0 @@ -28858,25 +27543,12 @@ CHARMAP \x85\x53\x7D |0 \x87\x2D\x2A |0 \x87\x2D\x2C |0 - \x89\x53\x7B |0 - \x89\x53\x7C |0 - \x89\x53\x7D |0 - \x89\x53\x7E |0 - \x89\x54\x22 |0 - \x89\x54\x23 |0 - \x89\x54\x24 |0 - \x89\x54\x26 |0 - \x89\x54\x27 |0 - \x89\x54\x2B |0 - \x89\x54\x2C |0 \x85\x53\x7E |0 \x87\x2D\x26 |0 \x87\x2D\x27 |0 \x87\x2D\x23 |0 \x87\x2D\x22 |0 \x87\x2D\x24 |0 - \x89\x54\x21 |0 - \x89\x54\x28 |0 \x85\x54\x27 |0 \x85\x54\x21 |0 \x85\x54\x25 |0 @@ -28896,12 +27568,6 @@ CHARMAP \x87\x37\x50 |0 \x85\x5B\x35 |0 \x84\x56\x25 |0 - \x89\x59\x6C |0 - \x89\x59\x6D |0 - \x89\x59\x6E |0 - \x89\x59\x6F |0 - \x89\x59\x70 |0 - \x89\x59\x71 |0 \x87\x37\x52 |0 \x87\x37\x55 |0 \x87\x37\x49 |0 @@ -28912,126 +27578,83 @@ CHARMAP \x85\x61\x4D |0 \x87\x3F\x3E |0 \x87\x3F\x40 |0 - \x89\x5E\x50 |0 - \x89\x5E\x51 |0 - \x89\x5E\x52 |0 - \x89\x5E\x54 |0 \x87\x3F\x3D |0 \x87\x3F\x41 |0 - \x89\x5E\x53 |0 \x87\x3F\x3C |0 \x85\x67\x5F |0 \x84\x5F\x53 |0 \x87\x46\x4D |0 \x87\x46\x52 |0 \x87\x46\x50 |0 - \x89\x5E\x55 |0 - \x89\x62\x2A |0 - \x89\x62\x2B |0 \x87\x46\x4E |0 \x85\x67\x61 |0 \x85\x67\x60 |0 - \x89\x5F\x73 |0 \x87\x4D\x51 |0 \x85\x6B\x79 |0 - \x89\x65\x26 |0 \x85\x6B\x7A |0 \x85\x6B\x7B |0 \x87\x53\x2A |0 \x85\x6F\x76 |0 \x87\x53\x2B |0 \x85\x6F\x75 |0 - \x89\x67\x4D |0 - \x89\x67\x4E |0 \x87\x57\x62 |0 \x85\x73\x36 |0 \x87\x57\x61 |0 \x87\x57\x63 |0 \x87\x57\x5F |0 - \x89\x69\x3F |0 \x87\x57\x60 |0 \x87\x57\x64 |0 - \x89\x69\x40 |0 \x85\x75\x69 |0 \x87\x5B\x4C |0 \x87\x5E\x5A |0 \x87\x5E\x5B |0 - \x89\x6B\x45 |0 \x87\x5E\x59 |0 \x87\x5E\x5C |0 - \x89\x6C\x24 |0 \x85\x79\x24 |0 - \x89\x6C\x4A |0 \x87\x63\x4D |0 \x85\x7A\x65 |0 \x84\x21\x33 |0 \x86\x22\x68 |0 \x85\x21\x63 |0 \x86\x22\x69 |0 - \x89\x21\x58 |0 - \x89\x21\x57 |0 \x86\x24\x45 |0 \x86\x24\x44 |0 \x86\x26\x76 |0 \x86\x26\x77 |0 \x85\x23\x6A |0 \x84\x23\x6C |0 - \x89\x23\x70 |0 \x85\x23\x69 |0 \x84\x28\x6F |0 \x86\x30\x24 |0 \x86\x2A\x63 |0 \x86\x2A\x62 |0 - \x89\x26\x4A |0 - \x89\x26\x4B |0 - \x89\x26\x4C |0 - \x89\x26\x4D |0 - \x89\x26\x4F |0 \x86\x2A\x64 |0 - \x89\x26\x4E |0 \x86\x30\x23 |0 \x86\x30\x21 |0 \x86\x30\x26 |0 \x86\x30\x25 |0 - \x89\x2A\x35 |0 - \x89\x2A\x36 |0 - \x89\x2A\x37 |0 \x86\x30\x22 |0 \x86\x36\x59 |0 \x85\x2C\x79 |0 \x86\x36\x58 |0 - \x89\x2E\x7A |0 - \x89\x2E\x7B |0 \x85\x2C\x7A |0 - \x89\x33\x66 |0 - \x89\x34\x24 |0 - \x89\x34\x25 |0 - \x89\x34\x26 |0 - \x89\x34\x27 |0 \x85\x37\x5C |0 \x86\x47\x69 |0 \x85\x37\x5B |0 \x86\x47\x6A |0 - \x89\x3A\x47 |0 \x86\x47\x68 |0 - \x89\x3A\x46 |0 \x84\x3C\x66 |0 \x84\x3C\x68 |0 \x86\x51\x6D |0 \x85\x3E\x62 |0 - \x89\x41\x25 |0 - \x89\x41\x26 |0 \x86\x51\x6B |0 \x86\x51\x6C |0 \x85\x3E\x61 |0 \x84\x3C\x69 |0 \x86\x5B\x7D |0 - \x89\x47\x55 |0 - \x89\x47\x56 |0 \x85\x45\x38 |0 \x84\x49\x41 |0 \x84\x49\x42 |0 - \x89\x4E\x46 |0 \x85\x4C\x5D |0 \x87\x2D\x2F |0 \x87\x2D\x2E |0 @@ -29039,44 +27662,28 @@ CHARMAP \x87\x2D\x32 |0 \x85\x54\x2A |0 \x87\x2D\x30 |0 - \x89\x54\x2D |0 - \x89\x54\x2E |0 \x87\x37\x56 |0 \x87\x4D\x52 |0 - \x89\x62\x2C |0 - \x89\x62\x2D |0 \x85\x6B\x7C |0 - \x89\x6C\x60 |0 \x86\x21\x69 |0 \x85\x21\x64 |0 \x86\x24\x46 |0 \x86\x24\x49 |0 \x86\x24\x4A |0 \x84\x22\x5A |0 - \x89\x22\x3D |0 - \x89\x22\x3E |0 - \x89\x22\x3F |0 - \x89\x22\x40 |0 - \x89\x22\x41 |0 \x86\x24\x47 |0 \x86\x26\x7E |0 \x86\x26\x7D |0 \x84\x23\x6E |0 \x86\x26\x7B |0 \x86\x26\x7C |0 - \x89\x23\x72 |0 \x85\x25\x65 |0 \x85\x25\x64 |0 \x86\x2A\x66 |0 \x85\x25\x66 |0 \x86\x2A\x67 |0 \x86\x2A\x68 |0 - \x89\x26\x51 |0 - \x89\x26\x52 |0 - \x89\x26\x54 |0 - \x89\x26\x55 |0 \x86\x2A\x65 |0 - \x89\x26\x53 |0 \x85\x28\x6C |0 \x86\x30\x28 |0 \x86\x30\x2A |0 @@ -29087,10 +27694,6 @@ CHARMAP \x86\x30\x2B |0 \x86\x30\x27 |0 \x86\x30\x29 |0 - \x89\x2A\x38 |0 - \x89\x2A\x3A |0 - \x89\x2A\x3B |0 - \x89\x2A\x3C |0 \x86\x30\x2C |0 \x86\x30\x2D |0 \x84\x2C\x4A |0 @@ -29107,8 +27710,6 @@ CHARMAP \x85\x2D\x22 |0 \x86\x36\x5B |0 \x86\x36\x62 |0 - \x89\x2E\x7C |0 - \x89\x2E\x7D |0 \x86\x36\x60 |0 \x86\x36\x63 |0 \x86\x36\x5A |0 @@ -29123,14 +27724,6 @@ CHARMAP \x86\x3E\x56 |0 \x86\x3E\x5B |0 \x85\x31\x70 |0 - \x89\x34\x28 |0 - \x89\x34\x29 |0 - \x89\x34\x2A |0 - \x89\x34\x2B |0 - \x89\x34\x2C |0 - \x89\x34\x2D |0 - \x89\x34\x2E |0 - \x89\x34\x2F |0 \x84\x31\x2F |0 \x86\x3E\x5C |0 \x85\x31\x6E |0 @@ -29148,17 +27741,8 @@ CHARMAP \x85\x37\x5F |0 \x86\x47\x6F |0 \x86\x47\x6C |0 - \x89\x3A\x48 |0 - \x89\x3A\x49 |0 - \x89\x3A\x4A |0 - \x89\x3A\x4B |0 - \x89\x3A\x4C |0 - \x89\x3A\x4D |0 - \x89\x3A\x4E |0 - \x89\x3A\x4F |0 \x86\x47\x6D |0 \x85\x37\x62 |0 - \x89\x3D\x6C |0 \x86\x51\x74 |0 \x86\x51\x70 |0 \x84\x3C\x6B |0 @@ -29173,13 +27757,6 @@ CHARMAP \x86\x51\x73 |0 \x86\x51\x6F |0 \x86\x51\x75 |0 - \x89\x41\x27 |0 - \x89\x41\x28 |0 - \x89\x41\x29 |0 - \x89\x41\x2A |0 - \x89\x41\x2C |0 - \x89\x41\x2D |0 - \x89\x41\x2E |0 \x86\x51\x6E |0 \x86\x5B\x7E |0 \x86\x5C\x27 |0 @@ -29193,10 +27770,6 @@ CHARMAP \x86\x5C\x26 |0 \x85\x45\x39 |0 \x87\x22\x33 |0 - \x89\x47\x57 |0 - \x89\x47\x58 |0 - \x89\x47\x59 |0 - \x89\x47\x5A |0 \x86\x5C\x28 |0 \x86\x5C\x25 |0 \x86\x5C\x29 |0 @@ -29205,7 +27778,6 @@ CHARMAP \x86\x5C\x23 |0 \x85\x45\x3B |0 \x86\x5C\x2A |0 - \x89\x47\x44 |0 \x86\x62\x67 |0 \x87\x22\x30 |0 \x85\x4C\x5E |0 @@ -29214,17 +27786,8 @@ CHARMAP \x84\x49\x48 |0 \x87\x22\x35 |0 \x87\x22\x32 |0 - \x89\x4E\x47 |0 - \x89\x4E\x48 |0 - \x89\x4E\x49 |0 - \x89\x4E\x4A |0 - \x89\x4E\x4B |0 - \x89\x4E\x4C |0 - \x89\x4E\x4E |0 - \x89\x4E\x4F |0 \x87\x22\x38 |0 \x87\x22\x36 |0 - \x89\x4E\x4D |0 \x85\x4C\x61 |0 \x85\x4C\x5F |0 \x87\x22\x31 |0 @@ -29238,47 +27801,28 @@ CHARMAP \x87\x2D\x36 |0 \x87\x2D\x33 |0 \x87\x2D\x34 |0 - \x89\x54\x2F |0 - \x89\x54\x30 |0 - \x89\x54\x31 |0 - \x89\x54\x33 |0 - \x89\x54\x34 |0 - \x89\x54\x35 |0 - \x89\x54\x36 |0 - \x89\x54\x37 |0 \x87\x37\x59 |0 \x87\x37\x57 |0 \x85\x5B\x38 |0 - \x89\x59\x72 |0 - \x89\x59\x73 |0 - \x89\x59\x74 |0 - \x89\x59\x75 |0 \x87\x37\x58 |0 \x87\x37\x5A |0 \x87\x22\x34 |0 \x85\x5B\x37 |0 \x87\x46\x58 |0 \x85\x61\x4E |0 - \x89\x59\x76 |0 - \x89\x5E\x56 |0 - \x89\x5E\x57 |0 \x87\x3F\x42 |0 - \x89\x62\x2E |0 \x84\x5F\x57 |0 \x87\x46\x53 |0 \x87\x46\x55 |0 \x84\x5F\x56 |0 \x87\x46\x57 |0 \x87\x46\x56 |0 - \x89\x62\x2F |0 \x87\x46\x54 |0 \x84\x63\x36 |0 \x87\x4D\x53 |0 \x87\x53\x2C |0 \x84\x66\x38 |0 \x87\x53\x2D |0 - \x89\x67\x4F |0 - \x89\x67\x50 |0 \x87\x53\x2E |0 \x85\x73\x38 |0 \x84\x68\x66 |0 @@ -29287,11 +27831,9 @@ CHARMAP \x87\x57\x66 |0 \x84\x6A\x45 |0 \x84\x6B\x67 |0 - \x89\x6B\x46 |0 \x87\x60\x6C |0 \x87\x64\x45 |0 \x85\x79\x25 |0 - \x89\x6C\x25 |0 \x84\x6D\x54 |0 \x85\x7A\x27 |0 \x84\x6D\x71 |0 @@ -29300,11 +27842,8 @@ CHARMAP \x86\x21\x6A |0 \x86\x2A\x6A |0 \x86\x2A\x69 |0 - \x89\x26\x56 |0 - \x89\x26\x57 |0 \x85\x28\x6F |0 \x86\x30\x2E |0 - \x89\x2A\x3D |0 \x86\x30\x31 |0 \x86\x30\x2F |0 \x84\x31\x31 |0 @@ -29318,10 +27857,8 @@ CHARMAP \x86\x51\x79 |0 \x86\x5C\x30 |0 \x84\x44\x26 |0 - \x89\x47\x5B |0 \x86\x5C\x31 |0 \x85\x45\x3D |0 - \x89\x4E\x51 |0 \x87\x22\x3A |0 \x87\x22\x39 |0 \x87\x2D\x39 |0 @@ -29334,23 +27871,19 @@ CHARMAP \x87\x4D\x54 |0 \x87\x53\x2F |0 \x86\x21\x6B |0 - \x89\x21\x39 |0 \x86\x24\x4C |0 \x85\x22\x4C |0 \x86\x27\x24 |0 \x84\x23\x72 |0 \x86\x27\x23 |0 \x86\x27\x22 |0 - \x89\x23\x73 |0 \x85\x25\x67 |0 - \x89\x26\x58 |0 \x86\x2A\x6B |0 \x86\x30\x32 |0 \x86\x30\x30 |0 \x86\x30\x33 |0 \x85\x28\x70 |0 \x84\x2C\x4B |0 - \x89\x2F\x21 |0 \x86\x36\x69 |0 \x86\x3E\x61 |0 \x85\x31\x71 |0 @@ -29358,13 +27891,10 @@ CHARMAP \x86\x3E\x63 |0 \x86\x3E\x60 |0 \x86\x3E\x62 |0 - \x89\x34\x30 |0 \x86\x47\x71 |0 - \x89\x3A\x50 |0 \x86\x47\x73 |0 \x86\x47\x72 |0 \x85\x3E\x65 |0 - \x89\x41\x2F |0 \x85\x45\x3E |0 \x86\x5C\x33 |0 \x86\x5C\x32 |0 @@ -29372,18 +27902,13 @@ CHARMAP \x87\x22\x3B |0 \x85\x54\x2F |0 \x87\x2D\x3A |0 - \x89\x59\x77 |0 \x85\x61\x50 |0 \x85\x6F\x77 |0 \x84\x21\x4A |0 - \x89\x21\x3A |0 \x85\x21\x65 |0 - \x89\x21\x4D |0 - \x89\x21\x5A |0 \x86\x22\x6B |0 \x86\x22\x6A |0 \x85\x22\x4D |0 - \x89\x22\x43 |0 \x85\x23\x6C |0 \x84\x23\x73 |0 \x85\x25\x68 |0 @@ -29395,7 +27920,6 @@ CHARMAP \x85\x25\x69 |0 \x86\x2A\x6C |0 \x85\x25\x6B |0 - \x89\x26\x59 |0 \x86\x30\x35 |0 \x85\x25\x6A |0 \x85\x28\x71 |0 @@ -29409,7 +27933,6 @@ CHARMAP \x85\x2D\x24 |0 \x86\x36\x6B |0 \x86\x36\x6D |0 - \x89\x2F\x22 |0 \x86\x3E\x66 |0 \x85\x31\x72 |0 \x84\x31\x34 |0 @@ -29419,7 +27942,6 @@ CHARMAP \x86\x47\x75 |0 \x84\x37\x2A |0 \x86\x47\x77 |0 - \x89\x3A\x51 |0 \x86\x51\x7B |0 \x86\x51\x7D |0 \x86\x51\x7C |0 @@ -29438,7 +27960,6 @@ CHARMAP \x85\x54\x30 |0 \x87\x2D\x3C |0 \x87\x2D\x3E |0 - \x89\x54\x38 |0 \x87\x37\x5D |0 \x84\x66\x39 |0 \x84\x68\x67 |0 @@ -29454,9 +27975,7 @@ CHARMAP \x86\x24\x50 |0 \x86\x24\x51 |0 \x86\x24\x4F |0 - \x89\x22\x44 |0 \x86\x27\x29 |0 - \x89\x23\x74 |0 \x86\x27\x27 |0 \x86\x27\x26 |0 \x86\x27\x28 |0 @@ -29467,7 +27986,6 @@ CHARMAP \x86\x2A\x6E |0 \x85\x25\x6C |0 \x86\x2A\x6F |0 - \x89\x26\x5B |0 \x85\x25\x6D |0 \x84\x28\x77 |0 \x86\x30\x3A |0 @@ -29479,12 +27997,6 @@ CHARMAP \x86\x30\x3D |0 \x86\x30\x3C |0 \x86\x30\x3B |0 - \x89\x2A\x40 |0 - \x89\x2A\x41 |0 - \x89\x2A\x42 |0 - \x89\x2A\x43 |0 - \x89\x2A\x44 |0 - \x89\x2A\x3F |0 \x86\x30\x40 |0 \x85\x28\x74 |0 \x86\x36\x72 |0 @@ -29494,11 +28006,6 @@ CHARMAP \x86\x3E\x67 |0 \x86\x36\x70 |0 \x86\x36\x6E |0 - \x89\x2F\x23 |0 - \x89\x2F\x24 |0 - \x89\x2F\x26 |0 - \x89\x2F\x27 |0 - \x89\x2F\x28 |0 \x85\x2D\x26 |0 \x85\x2D\x27 |0 \x86\x36\x71 |0 @@ -29515,19 +28022,10 @@ CHARMAP \x85\x31\x7B |0 \x86\x3E\x70 |0 \x86\x3E\x6A |0 - \x89\x34\x31 |0 - \x89\x34\x32 |0 - \x89\x34\x35 |0 - \x89\x34\x36 |0 - \x89\x34\x37 |0 - \x89\x34\x38 |0 - \x89\x34\x39 |0 - \x89\x34\x3A |0 \x86\x3E\x68 |0 \x86\x3E\x6C |0 \x86\x3E\x6F |0 \x86\x3E\x6E |0 - \x89\x34\x33 |0 \x86\x48\x23 |0 \x86\x48\x24 |0 \x86\x48\x22 |0 @@ -29543,9 +28041,6 @@ CHARMAP \x86\x48\x21 |0 \x86\x48\x26 |0 \x86\x47\x7C |0 - \x89\x3A\x52 |0 - \x89\x3A\x53 |0 - \x89\x3A\x54 |0 \x86\x47\x7D |0 \x84\x37\x2E |0 \x86\x52\x23 |0 @@ -29559,9 +28054,6 @@ CHARMAP \x86\x51\x7E |0 \x86\x52\x27 |0 \x86\x52\x24 |0 - \x89\x41\x30 |0 - \x89\x41\x31 |0 - \x89\x41\x32 |0 \x86\x52\x22 |0 \x86\x52\x28 |0 \x85\x3E\x66 |0 @@ -29571,31 +28063,21 @@ CHARMAP \x86\x5C\x38 |0 \x86\x5C\x36 |0 \x86\x5C\x37 |0 - \x89\x47\x5D |0 \x86\x5C\x39 |0 \x85\x45\x42 |0 \x87\x22\x40 |0 \x85\x4C\x66 |0 - \x89\x4E\x52 |0 - \x89\x4E\x53 |0 - \x89\x4E\x54 |0 - \x89\x4E\x55 |0 - \x89\x4E\x56 |0 \x85\x4C\x65 |0 \x85\x4C\x64 |0 \x87\x2D\x40 |0 \x87\x2D\x3F |0 \x87\x22\x3F |0 - \x89\x54\x39 |0 \x87\x30\x2D |0 \x87\x37\x5E |0 \x87\x3F\x43 |0 \x84\x5F\x58 |0 \x85\x67\x62 |0 - \x89\x65\x27 |0 - \x89\x65\x28 |0 \x85\x6B\x7D |0 - \x89\x67\x51 |0 \x85\x73\x3A |0 \x85\x21\x30 |0 \x86\x21\x6C |0 @@ -29625,7 +28107,6 @@ CHARMAP \x85\x37\x67 |0 \x86\x48\x29 |0 \x86\x48\x27 |0 - \x89\x3A\x55 |0 \x86\x52\x2A |0 \x86\x5C\x3A |0 \x87\x22\x41 |0 @@ -29640,9 +28121,6 @@ CHARMAP \x86\x22\x6E |0 \x86\x22\x72 |0 \x86\x22\x71 |0 - \x89\x21\x5C |0 - \x89\x21\x5D |0 - \x89\x21\x5E |0 \x86\x22\x73 |0 \x85\x21\x66 |0 \x86\x22\x6F |0 @@ -29650,8 +28128,6 @@ CHARMAP \x86\x24\x55 |0 \x86\x24\x59 |0 \x83\x23\x59 |0 - \x89\x22\x45 |0 - \x89\x22\x46 |0 \x86\x24\x56 |0 \x85\x22\x53 |0 \x86\x24\x5A |0 @@ -29670,17 +28146,9 @@ CHARMAP \x86\x27\x31 |0 \x86\x27\x2C |0 \x86\x27\x32 |0 - \x89\x23\x76 |0 - \x89\x23\x77 |0 - \x89\x23\x79 |0 - \x89\x23\x7A |0 - \x89\x23\x7B |0 - \x89\x23\x7E |0 - \x89\x24\x21 |0 \x86\x27\x2D |0 \x86\x27\x2F |0 \x84\x23\x7D |0 - \x89\x23\x7D |0 \x86\x27\x34 |0 \x86\x27\x33 |0 \x84\x23\x7C |0 @@ -29703,18 +28171,6 @@ CHARMAP \x85\x25\x70 |0 \x86\x2A\x74 |0 \x86\x27\x35 |0 - \x89\x26\x5C |0 - \x89\x26\x5D |0 - \x89\x26\x5E |0 - \x89\x26\x5F |0 - \x89\x26\x60 |0 - \x89\x26\x61 |0 - \x89\x26\x63 |0 - \x89\x26\x64 |0 - \x89\x26\x65 |0 - \x89\x26\x66 |0 - \x89\x26\x67 |0 - \x89\x26\x68 |0 \x86\x2A\x78 |0 \x86\x2D\x2B |0 \x86\x2A\x73 |0 @@ -29729,24 +28185,12 @@ CHARMAP \x86\x30\x46 |0 \x86\x30\x49 |0 \x86\x30\x52 |0 - \x89\x2A\x45 |0 - \x89\x2A\x47 |0 - \x89\x2A\x48 |0 - \x89\x2A\x4B |0 - \x89\x2A\x4C |0 - \x89\x2A\x4D |0 - \x89\x2A\x4E |0 - \x89\x2A\x4F |0 - \x89\x2A\x50 |0 - \x89\x2A\x51 |0 \x86\x30\x4D |0 \x86\x30\x45 |0 \x86\x30\x47 |0 \x86\x30\x51 |0 \x86\x30\x4F |0 \x86\x30\x4C |0 - \x89\x2A\x4A |0 - \x89\x2A\x46 |0 \x86\x30\x48 |0 \x85\x28\x7B |0 \x84\x28\x7C |0 @@ -29774,18 +28218,7 @@ CHARMAP \x86\x37\x22 |0 \x86\x37\x23 |0 \x86\x36\x7B |0 - \x89\x2F\x29 |0 - \x89\x2F\x2A |0 - \x89\x2F\x2B |0 - \x89\x2F\x2C |0 - \x89\x2F\x2D |0 - \x89\x2F\x2E |0 - \x89\x2F\x2F |0 - \x89\x2F\x31 |0 - \x89\x2F\x33 |0 \x85\x2D\x28 |0 - \x89\x2F\x30 |0 - \x89\x2F\x32 |0 \x85\x2D\x33 |0 \x84\x2C\x5D |0 \x85\x2D\x35 |0 @@ -29819,18 +28252,6 @@ CHARMAP \x85\x32\x24 |0 \x86\x3F\x28 |0 \x86\x3F\x23 |0 - \x89\x34\x3B |0 - \x89\x34\x3C |0 - \x89\x34\x3D |0 - \x89\x34\x3E |0 - \x89\x34\x40 |0 - \x89\x34\x41 |0 - \x89\x34\x42 |0 - \x89\x34\x43 |0 - \x89\x34\x44 |0 - \x89\x34\x46 |0 - \x89\x34\x47 |0 - \x89\x34\x48 |0 \x86\x3E\x77 |0 \x86\x32\x2A |0 \x86\x3E\x7D |0 @@ -29868,18 +28289,12 @@ CHARMAP \x84\x37\x33 |0 \x85\x37\x68 |0 \x85\x37\x73 |0 - \x89\x3A\x56 |0 - \x89\x3A\x58 |0 - \x89\x3A\x59 |0 - \x89\x3A\x5A |0 - \x89\x3A\x5B |0 \x86\x48\x2D |0 \x85\x37\x75 |0 \x86\x48\x32 |0 \x86\x48\x2C |0 \x86\x48\x31 |0 \x86\x48\x30 |0 - \x89\x3A\x5C |0 \x85\x3E\x70 |0 \x86\x52\x2D |0 \x85\x3E\x6C |0 @@ -29900,18 +28315,11 @@ CHARMAP \x85\x3E\x6E |0 \x86\x52\x36 |0 \x86\x5C\x40 |0 - \x89\x41\x37 |0 \x85\x3E\x72 |0 - \x89\x41\x33 |0 - \x89\x41\x34 |0 - \x89\x41\x36 |0 - \x89\x41\x38 |0 - \x89\x41\x39 |0 \x86\x52\x3A |0 \x86\x52\x32 |0 \x86\x52\x37 |0 \x85\x3E\x6B |0 - \x89\x41\x35 |0 \x86\x52\x2F |0 \x85\x45\x43 |0 \x85\x45\x4B |0 @@ -29941,10 +28349,6 @@ CHARMAP \x86\x5C\x43 |0 \x86\x5C\x3F |0 \x84\x43\x28 |0 - \x89\x47\x5E |0 - \x89\x47\x5F |0 - \x89\x47\x60 |0 - \x89\x47\x61 |0 \x86\x52\x31 |0 \x84\x49\x4E |0 \x87\x22\x49 |0 @@ -29966,11 +28370,6 @@ CHARMAP \x85\x4C\x6D |0 \x87\x2D\x44 |0 \x87\x22\x46 |0 - \x89\x4E\x57 |0 - \x89\x4E\x58 |0 - \x89\x4E\x59 |0 - \x89\x4E\x5B |0 - \x89\x4E\x5C |0 \x87\x22\x44 |0 \x87\x22\x4B |0 \x87\x22\x4E |0 @@ -29990,9 +28389,6 @@ CHARMAP \x87\x2D\x43 |0 \x85\x5B\x39 |0 \x85\x54\x32 |0 - \x89\x54\x3A |0 - \x89\x54\x3B |0 - \x89\x54\x3C |0 \x87\x2D\x45 |0 \x87\x2D\x49 |0 \x87\x2D\x48 |0 @@ -30013,9 +28409,6 @@ CHARMAP \x85\x5B\x3D |0 \x87\x37\x5F |0 \x87\x37\x65 |0 - \x89\x59\x79 |0 - \x89\x59\x7A |0 - \x89\x59\x7B |0 \x84\x56\x2A |0 \x87\x37\x63 |0 \x87\x37\x67 |0 @@ -30028,10 +28421,8 @@ CHARMAP \x85\x61\x51 |0 \x85\x61\x52 |0 \x87\x3F\x49 |0 - \x89\x5E\x59 |0 \x85\x61\x53 |0 \x87\x3F\x46 |0 - \x89\x5E\x58 |0 \x87\x3F\x45 |0 \x87\x3F\x48 |0 \x85\x61\x56 |0 @@ -30044,9 +28435,6 @@ CHARMAP \x87\x46\x5D |0 \x87\x46\x5F |0 \x87\x46\x60 |0 - \x89\x62\x30 |0 - \x89\x62\x31 |0 - \x89\x62\x32 |0 \x87\x46\x61 |0 \x87\x46\x62 |0 \x87\x46\x5B |0 @@ -30055,7 +28443,6 @@ CHARMAP \x84\x63\x37 |0 \x85\x6B\x7E |0 \x87\x4D\x57 |0 - \x89\x65\x29 |0 \x87\x4D\x56 |0 \x85\x5B\x3E |0 \x85\x6F\x78 |0 @@ -30078,7 +28465,6 @@ CHARMAP \x85\x77\x58 |0 \x87\x5E\x5F |0 \x85\x79\x27 |0 - \x89\x6C\x26 |0 \x85\x7A\x28 |0 \x85\x7A\x66 |0 \x85\x7B\x3C |0 @@ -30095,8 +28481,6 @@ CHARMAP \x84\x23\x7E |0 \x85\x23\x7B |0 \x86\x2A\x7D |0 - \x89\x26\x6A |0 - \x89\x26\x69 |0 \x86\x30\x55 |0 \x86\x30\x54 |0 \x86\x30\x56 |0 @@ -30109,8 +28493,6 @@ CHARMAP \x86\x5C\x48 |0 \x87\x22\x52 |0 \x85\x54\x39 |0 - \x89\x4E\x5D |0 - \x89\x54\x3D |0 \x87\x37\x68 |0 \x87\x3F\x4A |0 \x87\x46\x63 |0 @@ -30120,17 +28502,13 @@ CHARMAP \x86\x21\x6F |0 \x86\x21\x71 |0 \x86\x21\x70 |0 - \x89\x21\x3B |0 \x85\x21\x68 |0 \x85\x21\x67 |0 \x85\x23\x7C |0 \x86\x27\x37 |0 - \x89\x26\x6B |0 \x86\x30\x57 |0 \x86\x37\x28 |0 - \x89\x2F\x34 |0 \x86\x3F\x2E |0 - \x89\x3A\x5E |0 \x87\x22\x53 |0 \x87\x46\x64 |0 \x86\x22\x74 |0 @@ -30145,9 +28523,6 @@ CHARMAP \x86\x3F\x30 |0 \x85\x32\x2C |0 \x86\x48\x36 |0 - \x89\x3A\x5F |0 - \x89\x3A\x60 |0 - \x89\x3A\x61 |0 \x87\x22\x54 |0 \x87\x3F\x4B |0 \x84\x21\x77 |0 @@ -30160,8 +28535,6 @@ CHARMAP \x86\x24\x61 |0 \x86\x24\x60 |0 \x86\x24\x5E |0 - \x89\x22\x48 |0 - \x89\x22\x4A |0 \x85\x22\x57 |0 \x86\x24\x5F |0 \x85\x22\x5A |0 @@ -30177,7 +28550,6 @@ CHARMAP \x86\x27\x3C |0 \x86\x27\x3F |0 \x85\x24\x21 |0 - \x89\x24\x24 |0 \x86\x27\x39 |0 \x86\x27\x3A |0 \x86\x27\x3D |0 @@ -30194,7 +28566,6 @@ CHARMAP \x85\x25\x7E |0 \x85\x26\x22 |0 \x86\x2B\x22 |0 - \x89\x26\x6C |0 \x85\x26\x23 |0 \x86\x2B\x21 |0 \x85\x25\x77 |0 @@ -30213,9 +28584,6 @@ CHARMAP \x86\x30\x5A |0 \x86\x30\x65 |0 \x86\x30\x67 |0 - \x89\x2A\x53 |0 - \x89\x2A\x54 |0 - \x89\x2A\x55 |0 \x84\x29\x26 |0 \x86\x30\x61 |0 \x86\x30\x60 |0 @@ -30241,8 +28609,6 @@ CHARMAP \x84\x2C\x67 |0 \x86\x37\x33 |0 \x86\x37\x34 |0 - \x89\x2F\x36 |0 - \x89\x2F\x35 |0 \x86\x37\x29 |0 \x86\x37\x2B |0 \x86\x3F\x35 |0 @@ -30263,10 +28629,6 @@ CHARMAP \x86\x3F\x32 |0 \x85\x32\x32 |0 \x86\x3F\x34 |0 - \x89\x34\x49 |0 - \x89\x34\x4A |0 - \x89\x34\x4B |0 - \x89\x34\x4C |0 \x86\x3F\x39 |0 \x86\x3F\x31 |0 \x86\x3F\x3D |0 @@ -30289,14 +28651,11 @@ CHARMAP \x86\x48\x3B |0 \x85\x37\x7D |0 \x86\x48\x38 |0 - \x89\x3A\x62 |0 - \x89\x3A\x63 |0 \x86\x48\x3F |0 \x85\x37\x7B |0 \x85\x37\x77 |0 \x86\x48\x41 |0 \x85\x37\x7E |0 - \x89\x40\x2B |0 \x85\x3E\x78 |0 \x84\x3D\x22 |0 \x85\x45\x52 |0 @@ -30323,7 +28682,6 @@ CHARMAP \x86\x5C\x4A |0 \x85\x45\x54 |0 \x85\x45\x57 |0 - \x89\x47\x62 |0 \x85\x45\x59 |0 \x85\x45\x50 |0 \x85\x45\x56 |0 @@ -30362,7 +28720,6 @@ CHARMAP \x85\x5B\x42 |0 \x84\x56\x2C |0 \x87\x37\x6B |0 - \x89\x59\x7C |0 \x87\x37\x69 |0 \x87\x37\x6A |0 \x85\x61\x5A |0 @@ -30375,7 +28732,6 @@ CHARMAP \x87\x46\x65 |0 \x87\x46\x67 |0 \x85\x67\x68 |0 - \x89\x62\x33 |0 \x87\x4D\x58 |0 \x85\x6C\x21 |0 \x87\x53\x33 |0 @@ -30393,30 +28749,23 @@ CHARMAP \x85\x24\x26 |0 \x84\x24\x26 |0 \x86\x2B\x24 |0 - \x89\x26\x6D |0 - \x89\x26\x6E |0 \x86\x30\x69 |0 \x86\x30\x68 |0 - \x89\x2A\x56 |0 \x86\x37\x35 |0 \x85\x32\x37 |0 \x86\x48\x42 |0 \x85\x38\x23 |0 \x86\x52\x3F |0 \x85\x45\x5A |0 - \x89\x47\x64 |0 \x87\x4D\x59 |0 - \x89\x6A\x4E |0 \x86\x21\x72 |0 \x86\x21\x73 |0 \x86\x22\x78 |0 \x85\x21\x69 |0 \x86\x22\x77 |0 - \x89\x21\x62 |0 \x84\x22\x67 |0 \x84\x24\x27 |0 \x85\x24\x27 |0 - \x89\x24\x26 |0 \x86\x29\x5E |0 \x86\x2B\x25 |0 \x85\x26\x24 |0 @@ -30430,9 +28779,7 @@ CHARMAP \x85\x3E\x7C |0 \x85\x45\x5B |0 \x87\x22\x5B |0 - \x89\x47\x65 |0 \x86\x5C\x4E |0 - \x89\x4E\x5F |0 \x87\x22\x5C |0 \x87\x22\x5D |0 \x84\x56\x26 |0 @@ -30469,11 +28816,6 @@ CHARMAP \x86\x2B\x27 |0 \x84\x26\x3E |0 \x86\x2B\x2A |0 - \x89\x26\x70 |0 - \x89\x26\x71 |0 - \x89\x26\x72 |0 - \x89\x26\x73 |0 - \x89\x26\x74 |0 \x85\x26\x29 |0 \x85\x26\x2D |0 \x86\x2B\x2B |0 @@ -30483,12 +28825,6 @@ CHARMAP \x86\x30\x6C |0 \x85\x29\x29 |0 \x86\x30\x6D |0 - \x89\x2A\x57 |0 - \x89\x2A\x59 |0 - \x89\x2A\x58 |0 - \x89\x2A\x5A |0 - \x89\x2A\x5B |0 - \x89\x2A\x5C |0 \x86\x30\x6B |0 \x85\x2D\x3D |0 \x85\x2D\x40 |0 @@ -30503,7 +28839,6 @@ CHARMAP \x86\x37\x3C |0 \x85\x2D\x3C |0 \x86\x37\x39 |0 - \x89\x2F\x37 |0 \x86\x37\x37 |0 \x86\x37\x38 |0 \x85\x2C\x7B |0 @@ -30528,13 +28863,6 @@ CHARMAP \x85\x32\x43 |0 \x85\x38\x28 |0 \x86\x3F\x41 |0 - \x89\x34\x4D |0 - \x89\x34\x4E |0 - \x89\x34\x4F |0 - \x89\x34\x50 |0 - \x89\x34\x51 |0 - \x89\x34\x52 |0 - \x89\x34\x53 |0 \x86\x3F\x47 |0 \x86\x46\x3D |0 \x85\x32\x3A |0 @@ -30559,14 +28887,8 @@ CHARMAP \x86\x48\x46 |0 \x86\x48\x47 |0 \x85\x38\x24 |0 - \x89\x3A\x65 |0 - \x89\x3A\x67 |0 - \x89\x3A\x68 |0 - \x89\x3A\x69 |0 - \x89\x3A\x6A |0 \x86\x48\x48 |0 \x86\x48\x4C |0 - \x89\x3A\x66 |0 \x84\x3D\x2B |0 \x85\x3F\x25 |0 \x84\x3D\x2C |0 @@ -30577,9 +28899,6 @@ CHARMAP \x86\x52\x47 |0 \x85\x3E\x7D |0 \x86\x52\x45 |0 - \x89\x41\x3A |0 - \x89\x41\x3B |0 - \x89\x41\x3C |0 \x86\x52\x43 |0 \x86\x52\x48 |0 \x85\x3F\x24 |0 @@ -30593,18 +28912,8 @@ CHARMAP \x85\x45\x60 |0 \x85\x45\x5F |0 \x86\x5C\x4F |0 - \x89\x47\x67 |0 - \x89\x47\x68 |0 - \x89\x47\x69 |0 - \x89\x47\x6A |0 - \x89\x47\x6B |0 - \x89\x47\x6C |0 - \x89\x47\x6D |0 - \x89\x47\x6E |0 - \x89\x47\x6F |0 \x86\x5C\x51 |0 \x86\x60\x31 |0 - \x89\x4A\x54 |0 \x87\x22\x5E |0 \x84\x49\x5A |0 \x84\x37\x3F |0 @@ -30615,9 +28924,6 @@ CHARMAP \x87\x22\x62 |0 \x85\x4C\x7C |0 \x85\x4C\x7E |0 - \x89\x4E\x60 |0 - \x89\x4E\x62 |0 - \x89\x4E\x63 |0 \x87\x22\x5F |0 \x87\x22\x61 |0 \x87\x22\x63 |0 @@ -30629,38 +28935,24 @@ CHARMAP \x85\x54\x40 |0 \x84\x50\x2D |0 \x85\x54\x44 |0 - \x89\x54\x3F |0 - \x89\x54\x40 |0 - \x89\x54\x41 |0 - \x89\x54\x42 |0 \x87\x37\x6E |0 \x85\x5B\x44 |0 \x87\x37\x6C |0 \x87\x37\x6D |0 - \x89\x59\x7E |0 - \x89\x5A\x21 |0 - \x89\x5A\x22 |0 - \x89\x5A\x23 |0 \x85\x5B\x43 |0 \x87\x37\x6F |0 \x85\x5B\x45 |0 \x87\x3F\x51 |0 \x87\x3F\x4E |0 \x85\x61\x5B |0 - \x89\x5E\x5A |0 - \x89\x5E\x5C |0 \x87\x3F\x4D |0 \x87\x3F\x4F |0 \x87\x3F\x4C |0 - \x89\x5E\x5B |0 \x87\x3F\x50 |0 \x87\x46\x68 |0 \x87\x46\x69 |0 \x85\x61\x5C |0 \x85\x67\x69 |0 - \x89\x62\x34 |0 - \x89\x62\x35 |0 - \x89\x62\x36 |0 \x85\x67\x6A |0 \x85\x6C\x24 |0 \x85\x6C\x23 |0 @@ -30677,29 +28969,16 @@ CHARMAP \x87\x57\x6E |0 \x87\x57\x6F |0 \x85\x75\x6A |0 - \x89\x6A\x4F |0 \x87\x5B\x4D |0 \x87\x5E\x64 |0 \x87\x62\x36 |0 \x85\x7A\x68 |0 \x85\x7A\x67 |0 - \x89\x6C\x7B |0 - \x89\x21\x63 |0 - \x89\x22\x4B |0 - \x89\x22\x4C |0 \x86\x2B\x2C |0 - \x89\x24\x27 |0 \x86\x2B\x2D |0 \x86\x2B\x2E |0 - \x89\x2F\x39 |0 - \x89\x2F\x3B |0 - \x89\x2F\x3C |0 - \x89\x2F\x3A |0 \x85\x32\x45 |0 - \x89\x34\x54 |0 \x86\x48\x4F |0 - \x89\x3A\x6B |0 - \x89\x3A\x6C |0 \x85\x3F\x26 |0 \x86\x21\x3F |0 \x86\x21\x75 |0 @@ -30708,7 +28987,6 @@ CHARMAP \x84\x24\x2A |0 \x86\x30\x70 |0 \x86\x27\x4D |0 - \x89\x24\x28 |0 \x86\x27\x4B |0 \x86\x27\x4E |0 \x84\x26\x3F |0 @@ -30739,11 +29017,9 @@ CHARMAP \x86\x48\x54 |0 \x86\x48\x53 |0 \x86\x48\x51 |0 - \x89\x3A\x6D |0 \x86\x48\x52 |0 \x86\x52\x49 |0 \x85\x3F\x27 |0 - \x89\x41\x3D |0 \x86\x5C\x53 |0 \x86\x5C\x54 |0 \x86\x5C\x52 |0 @@ -30761,7 +29037,6 @@ CHARMAP \x87\x65\x36 |0 \x86\x21\x40 |0 \x86\x21\x76 |0 - \x89\x22\x4D |0 \x84\x24\x2B |0 \x86\x27\x50 |0 \x86\x27\x4F |0 @@ -30804,10 +29079,6 @@ CHARMAP \x85\x24\x31 |0 \x86\x27\x53 |0 \x85\x24\x30 |0 - \x89\x24\x29 |0 - \x89\x24\x2A |0 - \x89\x24\x2B |0 - \x89\x24\x2C |0 \x86\x27\x52 |0 \x85\x24\x32 |0 \x85\x26\x2F |0 @@ -30829,7 +29100,6 @@ CHARMAP \x86\x37\x43 |0 \x86\x37\x41 |0 \x85\x2D\x46 |0 - \x89\x2F\x3D |0 \x86\x37\x42 |0 \x85\x32\x4A |0 \x85\x32\x48 |0 @@ -30842,9 +29112,6 @@ CHARMAP \x86\x3F\x53 |0 \x85\x32\x47 |0 \x86\x3F\x51 |0 - \x89\x34\x55 |0 - \x89\x34\x56 |0 - \x89\x34\x57 |0 \x86\x3F\x54 |0 \x86\x3F\x57 |0 \x86\x3F\x55 |0 @@ -30860,22 +29127,18 @@ CHARMAP \x85\x3F\x28 |0 \x84\x3D\x31 |0 \x86\x52\x4B |0 - \x89\x41\x40 |0 \x86\x52\x4C |0 \x85\x45\x62 |0 \x86\x5C\x56 |0 \x85\x45\x63 |0 \x86\x5C\x57 |0 \x86\x5C\x59 |0 - \x89\x47\x70 |0 \x86\x5C\x5A |0 \x86\x5C\x58 |0 \x85\x4D\x21 |0 \x85\x4D\x22 |0 \x84\x49\x60 |0 \x87\x22\x66 |0 - \x89\x4E\x64 |0 - \x89\x4E\x65 |0 \x87\x22\x67 |0 \x87\x2D\x5F |0 \x85\x54\x46 |0 @@ -30885,11 +29148,9 @@ CHARMAP \x87\x37\x73 |0 \x87\x37\x72 |0 \x87\x37\x74 |0 - \x89\x5A\x24 |0 \x84\x5B\x22 |0 \x85\x61\x5E |0 \x87\x3F\x52 |0 - \x89\x5E\x5D |0 \x85\x61\x5D |0 \x87\x46\x6D |0 \x87\x46\x6B |0 @@ -30950,10 +29211,8 @@ CHARMAP \x87\x62\x37 |0 \x86\x23\x25 |0 \x86\x23\x24 |0 - \x89\x21\x64 |0 \x86\x24\x71 |0 \x86\x24\x6F |0 - \x89\x24\x2D |0 \x86\x27\x54 |0 \x85\x26\x30 |0 \x86\x2B\x3B |0 @@ -30965,9 +29224,6 @@ CHARMAP \x86\x3F\x5D |0 \x86\x3F\x59 |0 \x86\x3F\x5A |0 - \x89\x34\x58 |0 - \x89\x34\x59 |0 - \x89\x34\x5A |0 \x86\x3F\x5C |0 \x86\x3F\x5B |0 \x85\x32\x4B |0 @@ -30975,12 +29231,10 @@ CHARMAP \x86\x48\x60 |0 \x86\x48\x5E |0 \x86\x48\x5F |0 - \x89\x3A\x6E |0 \x86\x52\x51 |0 \x86\x52\x4E |0 \x86\x52\x50 |0 \x86\x52\x4F |0 - \x89\x41\x41 |0 \x84\x43\x3C |0 \x86\x5C\x60 |0 \x87\x22\x6B |0 @@ -30993,11 +29247,9 @@ CHARMAP \x87\x2D\x64 |0 \x87\x37\x76 |0 \x87\x3F\x56 |0 - \x89\x67\x54 |0 \x87\x4D\x62 |0 \x87\x53\x36 |0 \x85\x73\x41 |0 - \x89\x6C\x27 |0 \x86\x21\x7D |0 \x85\x21\x6B |0 \x84\x21\x79 |0 @@ -31028,7 +29280,6 @@ CHARMAP \x86\x31\x28 |0 \x85\x29\x32 |0 \x85\x29\x31 |0 - \x89\x2A\x5E |0 \x86\x31\x27 |0 \x86\x37\x4D |0 \x84\x2C\x79 |0 @@ -31045,8 +29296,6 @@ CHARMAP \x86\x37\x49 |0 \x86\x37\x4F |0 \x86\x37\x4C |0 - \x89\x2F\x3F |0 - \x89\x2F\x40 |0 \x86\x37\x4B |0 \x86\x37\x50 |0 \x86\x37\x4E |0 @@ -31071,7 +29320,6 @@ CHARMAP \x86\x3F\x5F |0 \x86\x3F\x63 |0 \x86\x48\x64 |0 - \x89\x34\x5C |0 \x84\x37\x46 |0 \x85\x38\x36 |0 \x85\x38\x35 |0 @@ -31084,9 +29332,7 @@ CHARMAP \x86\x48\x63 |0 \x85\x38\x38 |0 \x84\x31\x55 |0 - \x89\x3A\x70 |0 \x86\x48\x62 |0 - \x89\x3A\x6F |0 \x85\x38\x39 |0 \x85\x3F\x2C |0 \x85\x3F\x2B |0 @@ -31094,12 +29340,6 @@ CHARMAP \x86\x52\x54 |0 \x86\x52\x57 |0 \x86\x52\x53 |0 - \x89\x41\x42 |0 - \x89\x41\x43 |0 - \x89\x41\x44 |0 - \x89\x41\x45 |0 - \x89\x41\x46 |0 - \x89\x41\x47 |0 \x86\x52\x55 |0 \x86\x52\x56 |0 \x86\x56\x6C |0 @@ -31122,11 +29362,6 @@ CHARMAP \x86\x5C\x6A |0 \x85\x45\x67 |0 \x86\x5C\x64 |0 - \x89\x47\x71 |0 - \x89\x47\x72 |0 - \x89\x47\x73 |0 - \x89\x47\x74 |0 - \x89\x47\x75 |0 \x86\x5C\x65 |0 \x84\x49\x64 |0 \x85\x4D\x24 |0 @@ -31136,8 +29371,6 @@ CHARMAP \x85\x4D\x25 |0 \x87\x22\x6D |0 \x87\x22\x6F |0 - \x89\x4E\x66 |0 - \x89\x4E\x67 |0 \x87\x22\x6E |0 \x87\x22\x70 |0 \x87\x2D\x65 |0 @@ -31145,20 +29378,16 @@ CHARMAP \x85\x54\x4A |0 \x87\x2D\x67 |0 \x87\x2D\x66 |0 - \x89\x54\x44 |0 - \x89\x54\x45 |0 \x87\x2D\x68 |0 \x85\x54\x49 |0 \x85\x5B\x47 |0 \x87\x37\x77 |0 \x84\x56\x30 |0 - \x89\x5C\x5F |0 \x85\x5B\x46 |0 \x85\x61\x60 |0 \x87\x3F\x57 |0 \x85\x61\x5F |0 \x87\x3F\x58 |0 - \x89\x5E\x5E |0 \x85\x61\x61 |0 \x87\x46\x73 |0 \x87\x46\x75 |0 @@ -31168,7 +29397,6 @@ CHARMAP \x85\x6C\x27 |0 \x84\x63\x3E |0 \x84\x63\x3D |0 - \x89\x65\x2A |0 \x87\x4D\x63 |0 \x87\x53\x37 |0 \x85\x6F\x7E |0 @@ -31180,7 +29408,6 @@ CHARMAP \x84\x22\x6F |0 \x85\x21\x6C |0 \x86\x23\x26 |0 - \x89\x22\x4F |0 \x86\x24\x75 |0 \x85\x22\x63 |0 \x86\x27\x60 |0 @@ -31211,27 +29438,10 @@ CHARMAP \x83\x25\x7E |0 \x86\x27\x69 |0 \x85\x24\x3A |0 - \x89\x24\x2E |0 - \x89\x24\x2F |0 - \x89\x24\x31 |0 - \x89\x24\x32 |0 - \x89\x24\x34 |0 - \x89\x24\x35 |0 - \x89\x24\x36 |0 - \x89\x26\x77 |0 - \x89\x26\x78 |0 - \x89\x26\x79 |0 - \x89\x26\x7A |0 - \x89\x26\x7B |0 - \x89\x26\x7D |0 - \x89\x26\x7E |0 - \x89\x27\x21 |0 - \x89\x26\x7C |0 \x86\x2B\x45 |0 \x86\x2B\x41 |0 \x86\x2B\x42 |0 \x84\x24\x2D |0 - \x89\x24\x30 |0 \x84\x26\x44 |0 \x85\x26\x34 |0 \x86\x2B\x43 |0 @@ -31259,21 +29469,12 @@ CHARMAP \x86\x2B\x50 |0 \x86\x2B\x47 |0 \x86\x31\x2D |0 - \x89\x26\x75 |0 - \x89\x27\x22 |0 - \x89\x2A\x70 |0 \x84\x29\x46 |0 \x86\x31\x2E |0 \x86\x2B\x48 |0 \x86\x2B\x4A |0 \x86\x2B\x4E |0 \x86\x2B\x4B |0 - \x89\x2A\x64 |0 - \x89\x2A\x5F |0 - \x89\x2A\x62 |0 - \x89\x2A\x65 |0 - \x89\x2A\x68 |0 - \x89\x2A\x6C |0 \x86\x37\x5B |0 \x86\x37\x59 |0 \x86\x31\x32 |0 @@ -31301,21 +29502,8 @@ CHARMAP \x86\x37\x55 |0 \x84\x2D\x2A |0 \x86\x31\x34 |0 - \x89\x2A\x61 |0 - \x89\x2A\x66 |0 - \x89\x2A\x69 |0 - \x89\x2A\x6B |0 - \x89\x2A\x6D |0 - \x89\x2A\x6E |0 - \x89\x2A\x6F |0 - \x89\x2F\x46 |0 - \x89\x2F\x47 |0 - \x89\x2F\x48 |0 - \x89\x2F\x4A |0 \x86\x37\x52 |0 - \x89\x2F\x44 |0 \x86\x37\x58 |0 - \x89\x2A\x63 |0 \x85\x2D\x4D |0 \x86\x37\x51 |0 \x85\x2D\x52 |0 @@ -31352,19 +29540,6 @@ CHARMAP \x86\x3F\x74 |0 \x85\x32\x52 |0 \x85\x2D\x4F |0 - \x89\x2F\x41 |0 - \x89\x2F\x42 |0 - \x89\x2F\x43 |0 - \x89\x2F\x49 |0 - \x89\x2F\x4B |0 - \x89\x34\x5D |0 - \x89\x34\x5F |0 - \x89\x34\x60 |0 - \x89\x34\x64 |0 - \x89\x34\x65 |0 - \x89\x34\x66 |0 - \x89\x34\x67 |0 - \x89\x34\x68 |0 \x86\x3F\x6A |0 \x86\x37\x65 |0 \x86\x37\x66 |0 @@ -31416,45 +29591,12 @@ CHARMAP \x86\x48\x65 |0 \x86\x3F\x75 |0 \x85\x38\x40 |0 - \x89\x34\x61 |0 - \x89\x34\x5E |0 - \x89\x34\x62 |0 - \x89\x34\x63 |0 - \x89\x34\x69 |0 - \x89\x34\x6A |0 - \x89\x34\x6B |0 - \x89\x34\x6C |0 - \x89\x34\x6D |0 - \x89\x34\x6F |0 - \x89\x34\x70 |0 - \x89\x34\x72 |0 - \x89\x3A\x72 |0 - \x89\x3A\x73 |0 - \x89\x3A\x74 |0 - \x89\x3A\x75 |0 - \x89\x3A\x76 |0 - \x89\x3A\x77 |0 - \x89\x3A\x79 |0 - \x89\x3A\x7A |0 - \x89\x3A\x7C |0 - \x89\x3A\x7D |0 - \x89\x3A\x7E |0 - \x89\x3B\x21 |0 - \x89\x3B\x22 |0 - \x89\x3B\x25 |0 - \x89\x3B\x29 |0 - \x89\x3B\x2A |0 - \x89\x3B\x2C |0 - \x89\x3B\x2E |0 \x86\x48\x68 |0 \x85\x32\x56 |0 \x86\x3F\x78 |0 - \x89\x3B\x27 |0 - \x89\x34\x6E |0 \x86\x49\x24 |0 \x86\x48\x6D |0 \x86\x40\x21 |0 - \x89\x3B\x24 |0 \x84\x3D\x3F |0 \x85\x38\x4A |0 \x85\x38\x4D |0 @@ -31506,26 +29648,13 @@ CHARMAP \x84\x37\x52 |0 \x85\x38\x49 |0 \x86\x48\x79 |0 - \x89\x3A\x71 |0 - \x89\x3A\x7B |0 - \x89\x3B\x23 |0 - \x89\x3B\x28 |0 - \x89\x3B\x2D |0 - \x89\x41\x48 |0 - \x89\x41\x4E |0 - \x89\x41\x50 |0 - \x89\x41\x51 |0 - \x89\x41\x52 |0 \x86\x52\x5C |0 \x86\x52\x5F |0 \x86\x52\x5B |0 \x86\x48\x7A |0 - \x89\x3B\x2B |0 \x85\x38\x4E |0 \x85\x3F\x2E |0 \x85\x38\x4C |0 - \x89\x34\x71 |0 - \x89\x47\x7D |0 \x85\x3F\x3C |0 \x85\x3F\x36 |0 \x85\x3F\x35 |0 @@ -31564,22 +29693,9 @@ CHARMAP \x85\x3F\x37 |0 \x86\x52\x67 |0 \x86\x52\x6D |0 - \x89\x41\x4A |0 - \x89\x41\x4B |0 - \x89\x41\x4C |0 - \x89\x41\x4D |0 - \x89\x41\x4F |0 - \x89\x41\x53 |0 - \x89\x47\x76 |0 - \x89\x47\x77 |0 - \x89\x47\x79 |0 - \x89\x47\x7A |0 - \x89\x48\x25 |0 - \x89\x48\x28 |0 \x86\x5C\x70 |0 \x86\x5C\x75 |0 \x85\x3F\x40 |0 - \x89\x41\x49 |0 \x86\x5C\x73 |0 \x86\x52\x6E |0 \x86\x5D\x23 |0 @@ -31614,22 +29730,6 @@ CHARMAP \x85\x45\x78 |0 \x87\x2D\x6A |0 \x84\x43\x53 |0 - \x89\x47\x78 |0 - \x89\x47\x7C |0 - \x89\x47\x7E |0 - \x89\x48\x21 |0 - \x89\x48\x23 |0 - \x89\x48\x24 |0 - \x89\x48\x26 |0 - \x89\x4E\x69 |0 - \x89\x4E\x6A |0 - \x89\x4E\x6B |0 - \x89\x4E\x6C |0 - \x89\x4E\x6D |0 - \x89\x4E\x6E |0 - \x89\x4E\x6F |0 - \x89\x4E\x73 |0 - \x89\x4E\x75 |0 \x87\x22\x73 |0 \x87\x22\x78 |0 \x86\x5C\x6B |0 @@ -31676,21 +29776,9 @@ CHARMAP \x84\x50\x3C |0 \x87\x2D\x70 |0 \x87\x2D\x6F |0 - \x89\x48\x22 |0 - \x89\x4E\x70 |0 \x87\x2D\x72 |0 \x85\x4D\x31 |0 \x87\x2D\x6C |0 - \x89\x4E\x71 |0 - \x89\x4E\x72 |0 - \x89\x4E\x74 |0 - \x89\x4E\x76 |0 - \x89\x54\x47 |0 - \x89\x54\x48 |0 - \x89\x54\x4A |0 - \x89\x54\x4B |0 - \x89\x54\x51 |0 - \x89\x54\x53 |0 \x87\x2D\x74 |0 \x85\x54\x4B |0 \x87\x30\x50 |0 @@ -31699,8 +29787,6 @@ CHARMAP \x84\x49\x70 |0 \x85\x54\x4C |0 \x85\x54\x4F |0 - \x89\x4E\x68 |0 - \x89\x54\x4F |0 \x85\x54\x50 |0 \x85\x54\x52 |0 \x87\x2D\x7B |0 @@ -31723,20 +29809,10 @@ CHARMAP \x87\x2D\x7A |0 \x87\x37\x79 |0 \x87\x2D\x6E |0 - \x89\x54\x4D |0 \x85\x54\x53 |0 \x87\x38\x22 |0 - \x89\x54\x49 |0 - \x89\x54\x4E |0 - \x89\x54\x52 |0 - \x89\x5A\x25 |0 - \x89\x5A\x26 |0 - \x89\x5A\x2E |0 - \x89\x5A\x27 |0 \x85\x5B\x4A |0 \x85\x54\x58 |0 - \x89\x5A\x2A |0 - \x89\x54\x4C |0 \x87\x37\x78 |0 \x85\x5B\x51 |0 \x84\x56\x35 |0 @@ -31758,18 +29834,8 @@ CHARMAP \x85\x61\x65 |0 \x87\x3F\x59 |0 \x87\x22\x76 |0 - \x89\x5A\x2B |0 - \x89\x5A\x2D |0 - \x89\x5E\x5F |0 - \x89\x5E\x60 |0 - \x89\x5E\x62 |0 - \x89\x5E\x63 |0 - \x89\x5E\x65 |0 - \x89\x5E\x66 |0 - \x89\x5E\x67 |0 \x87\x3F\x5C |0 \x87\x38\x24 |0 - \x89\x5A\x28 |0 \x84\x5B\x27 |0 \x85\x5B\x52 |0 \x87\x46\x79 |0 @@ -31796,11 +29862,9 @@ CHARMAP \x87\x3F\x5E |0 \x87\x46\x7D |0 \x85\x67\x6E |0 - \x89\x5E\x64 |0 \x85\x67\x6F |0 \x87\x46\x7B |0 \x85\x67\x6C |0 - \x89\x62\x39 |0 \x87\x47\x2A |0 \x84\x63\x44 |0 \x87\x47\x27 |0 @@ -31818,15 +29882,9 @@ CHARMAP \x87\x47\x23 |0 \x87\x4D\x65 |0 \x85\x67\x77 |0 - \x89\x62\x3A |0 - \x89\x62\x38 |0 - \x89\x62\x3B |0 - \x89\x62\x3C |0 - \x89\x62\x3D |0 \x87\x4D\x66 |0 \x85\x61\x66 |0 \x85\x67\x72 |0 - \x89\x65\x2B |0 \x85\x67\x76 |0 \x85\x6C\x29 |0 \x87\x53\x39 |0 @@ -31836,7 +29894,6 @@ CHARMAP \x84\x63\x45 |0 \x87\x53\x38 |0 \x87\x4D\x6B |0 - \x89\x67\x55 |0 \x87\x5B\x4F |0 \x84\x66\x3E |0 \x85\x6C\x2B |0 @@ -31846,35 +29903,22 @@ CHARMAP \x87\x53\x3B |0 \x87\x53\x3A |0 \x87\x53\x3C |0 - \x89\x69\x42 |0 \x87\x57\x76 |0 \x87\x5B\x50 |0 \x87\x5B\x52 |0 \x87\x5B\x53 |0 \x87\x5B\x51 |0 - \x89\x6A\x50 |0 - \x89\x69\x41 |0 - \x89\x6A\x51 |0 - \x89\x6A\x52 |0 \x87\x5B\x55 |0 \x85\x77\x5A |0 \x87\x5B\x54 |0 \x87\x5E\x65 |0 - \x89\x6A\x53 |0 - \x89\x6B\x47 |0 - \x89\x6B\x48 |0 \x85\x77\x5B |0 \x87\x5E\x66 |0 \x85\x79\x29 |0 \x87\x5E\x67 |0 - \x89\x6C\x28 |0 - \x89\x6C\x29 |0 \x84\x6D\x72 |0 - \x89\x6C\x7C |0 - \x89\x6C\x7D |0 \x85\x7B\x3E |0 \x85\x7B\x60 |0 - \x89\x6D\x34 |0 \x85\x22\x6A |0 \x84\x22\x72 |0 \x86\x24\x76 |0 @@ -31892,8 +29936,6 @@ CHARMAP \x86\x2B\x55 |0 \x86\x2B\x53 |0 \x86\x2B\x57 |0 - \x89\x27\x24 |0 - \x89\x27\x23 |0 \x86\x31\x3D |0 \x86\x31\x3B |0 \x86\x31\x3E |0 @@ -31901,8 +29943,6 @@ CHARMAP \x84\x29\x4C |0 \x86\x31\x41 |0 \x86\x31\x3F |0 - \x89\x2A\x71 |0 - \x89\x2A\x72 |0 \x86\x31\x3C |0 \x86\x37\x67 |0 \x85\x2D\x5F |0 @@ -31912,8 +29952,6 @@ CHARMAP \x85\x32\x61 |0 \x84\x31\x6F |0 \x86\x40\x25 |0 - \x89\x34\x73 |0 - \x89\x34\x74 |0 \x86\x40\x24 |0 \x85\x32\x60 |0 \x86\x49\x28 |0 @@ -31922,15 +29960,12 @@ CHARMAP \x86\x49\x26 |0 \x84\x37\x5C |0 \x86\x49\x29 |0 - \x89\x3B\x2F |0 \x85\x38\x5B |0 \x85\x38\x5C |0 - \x89\x34\x76 |0 \x84\x3D\x44 |0 \x86\x52\x71 |0 \x85\x3F\x47 |0 \x85\x3F\x49 |0 - \x89\x41\x55 |0 \x84\x3D\x41 |0 \x86\x52\x70 |0 \x85\x3F\x48 |0 @@ -31941,8 +29976,6 @@ CHARMAP \x85\x45\x7B |0 \x87\x23\x24 |0 \x85\x45\x7D |0 - \x89\x48\x29 |0 - \x89\x48\x2A |0 \x86\x5D\x28 |0 \x85\x4D\x36 |0 \x84\x49\x73 |0 @@ -31952,12 +29985,8 @@ CHARMAP \x87\x23\x25 |0 \x86\x5D\x2B |0 \x87\x23\x23 |0 - \x89\x4E\x7B |0 \x87\x23\x29 |0 \x87\x23\x26 |0 - \x89\x4E\x77 |0 - \x89\x4E\x78 |0 - \x89\x4E\x7A |0 \x87\x23\x2A |0 \x87\x2E\x2A |0 \x87\x2E\x25 |0 @@ -31971,13 +30000,11 @@ CHARMAP \x87\x2E\x23 |0 \x87\x38\x27 |0 \x85\x5B\x53 |0 - \x89\x5A\x2F |0 \x87\x3F\x60 |0 \x87\x47\x2D |0 \x84\x5F\x65 |0 \x87\x47\x2E |0 \x85\x6C\x2C |0 - \x89\x65\x2C |0 \x85\x70\x21 |0 \x87\x53\x3D |0 \x86\x23\x27 |0 @@ -31985,8 +30012,6 @@ CHARMAP \x86\x24\x77 |0 \x86\x24\x78 |0 \x84\x24\x34 |0 - \x89\x24\x37 |0 - \x89\x24\x38 |0 \x85\x26\x39 |0 \x86\x2B\x59 |0 \x86\x2B\x5A |0 @@ -31994,9 +30019,6 @@ CHARMAP \x86\x31\x42 |0 \x86\x31\x44 |0 \x85\x29\x39 |0 - \x89\x2A\x73 |0 - \x89\x2A\x74 |0 - \x89\x2A\x75 |0 \x86\x31\x46 |0 \x86\x31\x45 |0 \x85\x29\x38 |0 @@ -32006,7 +30028,6 @@ CHARMAP \x85\x2D\x61 |0 \x85\x2D\x60 |0 \x86\x40\x26 |0 - \x89\x34\x77 |0 \x85\x38\x5D |0 \x85\x38\x5F |0 \x85\x38\x60 |0 @@ -32030,8 +30051,6 @@ CHARMAP \x85\x22\x6F |0 \x85\x22\x6B |0 \x85\x22\x6D |0 - \x89\x22\x50 |0 - \x89\x22\x52 |0 \x85\x22\x71 |0 \x84\x24\x37 |0 \x86\x27\x73 |0 @@ -32054,17 +30073,6 @@ CHARMAP \x85\x24\x3C |0 \x86\x2B\x5C |0 \x86\x27\x74 |0 - \x89\x24\x3B |0 - \x89\x24\x3C |0 - \x89\x24\x3D |0 - \x89\x24\x3E |0 - \x89\x24\x3F |0 - \x89\x24\x40 |0 - \x89\x24\x41 |0 - \x89\x24\x43 |0 - \x89\x24\x44 |0 - \x89\x24\x45 |0 - \x89\x24\x3A |0 \x86\x2B\x5E |0 \x86\x2B\x5F |0 \x86\x2B\x61 |0 @@ -32078,16 +30086,6 @@ CHARMAP \x86\x31\x49 |0 \x86\x31\x47 |0 \x86\x2B\x62 |0 - \x89\x27\x26 |0 - \x89\x27\x27 |0 - \x89\x27\x28 |0 - \x89\x27\x29 |0 - \x89\x27\x2A |0 - \x89\x27\x2B |0 - \x89\x27\x2C |0 - \x89\x27\x2D |0 - \x89\x27\x2F |0 - \x89\x27\x25 |0 \x85\x26\x3E |0 \x86\x31\x52 |0 \x86\x31\x54 |0 @@ -32120,29 +30118,7 @@ CHARMAP \x85\x29\x3C |0 \x86\x31\x55 |0 \x86\x31\x51 |0 - \x89\x2A\x76 |0 - \x89\x2A\x77 |0 - \x89\x2A\x78 |0 - \x89\x2A\x79 |0 - \x89\x2A\x7A |0 - \x89\x2A\x7B |0 - \x89\x2A\x7C |0 - \x89\x2A\x7D |0 - \x89\x2A\x7E |0 - \x89\x2B\x21 |0 - \x89\x2B\x23 |0 - \x89\x2B\x24 |0 - \x89\x2B\x25 |0 - \x89\x2B\x26 |0 - \x89\x2B\x27 |0 - \x89\x2B\x28 |0 - \x89\x2B\x29 |0 - \x89\x2B\x2A |0 - \x89\x2F\x53 |0 - \x89\x2F\x5C |0 - \x89\x2F\x61 |0 \x86\x31\x4C |0 - \x89\x2B\x22 |0 \x85\x29\x3B |0 \x85\x2D\x62 |0 \x85\x2D\x64 |0 @@ -32180,26 +30156,8 @@ CHARMAP \x85\x29\x46 |0 \x86\x37\x7C |0 \x86\x37\x7E |0 - \x89\x2F\x4C |0 - \x89\x2F\x4D |0 - \x89\x2F\x4E |0 - \x89\x2F\x4F |0 - \x89\x2F\x50 |0 - \x89\x2F\x51 |0 - \x89\x2F\x52 |0 - \x89\x2F\x55 |0 - \x89\x2F\x56 |0 - \x89\x2F\x57 |0 - \x89\x2F\x5A |0 - \x89\x2F\x5B |0 - \x89\x2F\x5D |0 - \x89\x2F\x5E |0 - \x89\x2F\x60 |0 - \x89\x2F\x62 |0 \x86\x40\x28 |0 - \x89\x2F\x58 |0 \x86\x37\x6F |0 - \x89\x2F\x54 |0 \x84\x31\x72 |0 \x84\x31\x73 |0 \x84\x37\x5E |0 @@ -32237,32 +30195,8 @@ CHARMAP \x86\x40\x30 |0 \x84\x31\x75 |0 \x86\x40\x2E |0 - \x89\x34\x78 |0 - \x89\x34\x79 |0 - \x89\x34\x7A |0 - \x89\x34\x7B |0 - \x89\x34\x7C |0 - \x89\x34\x7E |0 - \x89\x35\x22 |0 - \x89\x35\x23 |0 - \x89\x35\x24 |0 - \x89\x35\x25 |0 - \x89\x35\x26 |0 - \x89\x35\x27 |0 - \x89\x35\x28 |0 - \x89\x35\x29 |0 - \x89\x35\x2A |0 - \x89\x35\x2B |0 - \x89\x35\x2C |0 - \x89\x35\x2E |0 - \x89\x35\x2D |0 - \x89\x35\x2F |0 - \x89\x35\x30 |0 - \x89\x3B\x31 |0 - \x89\x34\x7D |0 \x85\x32\x66 |0 \x84\x32\x26 |0 - \x89\x3B\x41 |0 \x85\x38\x6B |0 \x86\x49\x34 |0 \x84\x37\x69 |0 @@ -32316,34 +30250,11 @@ CHARMAP \x86\x49\x4B |0 \x85\x38\x65 |0 \x86\x52\x73 |0 - \x89\x3B\x30 |0 - \x89\x3B\x32 |0 - \x89\x3B\x34 |0 - \x89\x3B\x35 |0 - \x89\x3B\x36 |0 - \x89\x3B\x37 |0 - \x89\x3B\x38 |0 - \x89\x3B\x39 |0 - \x89\x3B\x3A |0 - \x89\x3B\x3B |0 - \x89\x3B\x3C |0 - \x89\x3B\x3D |0 - \x89\x3B\x3F |0 - \x89\x3B\x40 |0 - \x89\x3B\x42 |0 - \x89\x3B\x43 |0 - \x89\x3B\x44 |0 - \x89\x3B\x45 |0 - \x89\x3B\x46 |0 - \x89\x3B\x48 |0 - \x89\x3B\x49 |0 - \x89\x3B\x4A |0 \x86\x52\x74 |0 \x86\x49\x3E |0 \x86\x49\x49 |0 \x86\x49\x35 |0 \x85\x38\x63 |0 - \x89\x3B\x47 |0 \x85\x3F\x52 |0 \x86\x52\x7B |0 \x84\x3D\x4B |0 @@ -32375,28 +30286,9 @@ CHARMAP \x85\x3F\x4C |0 \x86\x52\x7A |0 \x85\x3F\x4F |0 - \x89\x41\x56 |0 - \x89\x41\x57 |0 - \x89\x41\x58 |0 - \x89\x41\x59 |0 - \x89\x41\x5A |0 - \x89\x41\x5B |0 - \x89\x41\x5C |0 - \x89\x41\x5D |0 - \x89\x41\x5E |0 - \x89\x41\x60 |0 - \x89\x41\x61 |0 - \x89\x41\x63 |0 - \x89\x41\x64 |0 - \x89\x41\x65 |0 - \x89\x41\x66 |0 - \x89\x41\x67 |0 - \x89\x41\x69 |0 - \x89\x48\x30 |0 \x86\x52\x77 |0 \x86\x52\x7D |0 \x86\x52\x76 |0 - \x89\x41\x68 |0 \x85\x3F\x54 |0 \x86\x5D\x36 |0 \x85\x4D\x39 |0 @@ -32436,35 +30328,7 @@ CHARMAP \x84\x43\x60 |0 \x86\x5D\x2F |0 \x86\x5D\x34 |0 - \x89\x48\x2B |0 - \x89\x48\x2C |0 - \x89\x48\x2D |0 - \x89\x48\x2E |0 - \x89\x48\x2F |0 - \x89\x48\x33 |0 - \x89\x48\x34 |0 - \x89\x48\x35 |0 - \x89\x48\x37 |0 - \x89\x48\x38 |0 - \x89\x48\x3A |0 - \x89\x48\x3B |0 - \x89\x48\x39 |0 - \x89\x48\x3C |0 - \x89\x48\x3D |0 - \x89\x48\x3E |0 - \x89\x48\x3F |0 - \x89\x48\x40 |0 - \x89\x48\x41 |0 - \x89\x48\x42 |0 - \x89\x48\x43 |0 - \x89\x48\x44 |0 - \x89\x48\x45 |0 - \x89\x48\x47 |0 - \x89\x48\x48 |0 - \x89\x48\x49 |0 - \x89\x48\x46 |0 \x86\x5D\x30 |0 - \x89\x48\x36 |0 \x87\x23\x33 |0 \x87\x23\x38 |0 \x85\x4D\x3C |0 @@ -32501,28 +30365,9 @@ CHARMAP \x87\x23\x3E |0 \x87\x23\x41 |0 \x84\x49\x77 |0 - \x89\x48\x31 |0 \x87\x23\x32 |0 \x87\x23\x3F |0 \x87\x23\x40 |0 - \x89\x4E\x7C |0 - \x89\x4E\x7D |0 - \x89\x4E\x7E |0 - \x89\x4F\x21 |0 - \x89\x4F\x22 |0 - \x89\x4F\x23 |0 - \x89\x4F\x26 |0 - \x89\x4F\x27 |0 - \x89\x4F\x28 |0 - \x89\x4F\x29 |0 - \x89\x4F\x2A |0 - \x89\x4F\x2B |0 - \x89\x4F\x2D |0 - \x89\x4F\x2E |0 - \x89\x4F\x2F |0 - \x89\x4F\x30 |0 - \x89\x54\x5F |0 - \x89\x4F\x24 |0 \x84\x56\x38 |0 \x84\x50\x41 |0 \x87\x2E\x35 |0 @@ -32555,21 +30400,9 @@ CHARMAP \x87\x38\x28 |0 \x87\x2E\x33 |0 \x87\x2E\x3F |0 - \x89\x54\x55 |0 - \x89\x54\x56 |0 - \x89\x54\x57 |0 - \x89\x54\x58 |0 - \x89\x54\x59 |0 - \x89\x54\x5A |0 - \x89\x54\x5B |0 - \x89\x54\x5C |0 - \x89\x54\x5D |0 - \x89\x54\x5E |0 - \x89\x54\x60 |0 \x87\x2E\x34 |0 \x87\x2E\x36 |0 \x84\x50\x44 |0 - \x89\x54\x54 |0 \x85\x5B\x56 |0 \x87\x38\x31 |0 \x85\x5B\x57 |0 @@ -32591,12 +30424,6 @@ CHARMAP \x87\x38\x38 |0 \x87\x38\x2B |0 \x87\x38\x2D |0 - \x89\x5A\x30 |0 - \x89\x5A\x31 |0 - \x89\x5A\x32 |0 - \x89\x5A\x33 |0 - \x89\x5A\x34 |0 - \x89\x5A\x35 |0 \x87\x38\x33 |0 \x84\x5B\x33 |0 \x84\x5B\x38 |0 @@ -32618,17 +30445,6 @@ CHARMAP \x87\x47\x2F |0 \x87\x3F\x61 |0 \x87\x3F\x64 |0 - \x89\x5E\x68 |0 - \x89\x5E\x69 |0 - \x89\x5E\x6A |0 - \x89\x5E\x6D |0 - \x89\x5E\x6E |0 - \x89\x5E\x6F |0 - \x89\x5E\x71 |0 - \x89\x5E\x72 |0 - \x89\x5E\x74 |0 - \x89\x5E\x6C |0 - \x89\x5E\x6B |0 \x84\x5F\x66 |0 \x84\x5F\x68 |0 \x84\x5F\x67 |0 @@ -32647,20 +30463,8 @@ CHARMAP \x87\x47\x31 |0 \x84\x5F\x6A |0 \x85\x67\x79 |0 - \x89\x62\x3E |0 - \x89\x62\x3F |0 - \x89\x62\x40 |0 - \x89\x62\x41 |0 - \x89\x62\x42 |0 - \x89\x62\x43 |0 - \x89\x62\x44 |0 - \x89\x62\x45 |0 - \x89\x62\x46 |0 - \x89\x62\x49 |0 - \x89\x65\x2F |0 \x87\x3F\x6A |0 \x87\x47\x37 |0 - \x89\x62\x47 |0 \x85\x6C\x32 |0 \x84\x66\x3F |0 \x87\x4D\x6D |0 @@ -32674,9 +30478,6 @@ CHARMAP \x85\x6C\x30 |0 \x85\x6C\x31 |0 \x87\x4D\x6F |0 - \x89\x65\x2D |0 - \x89\x65\x2E |0 - \x89\x65\x30 |0 \x87\x53\x44 |0 \x87\x57\x77 |0 \x84\x66\x41 |0 @@ -32687,10 +30488,6 @@ CHARMAP \x85\x73\x45 |0 \x87\x53\x41 |0 \x87\x53\x40 |0 - \x89\x67\x56 |0 - \x89\x67\x57 |0 - \x89\x67\x58 |0 - \x89\x67\x59 |0 \x87\x57\x78 |0 \x87\x57\x79 |0 \x85\x73\x44 |0 @@ -32702,14 +30499,9 @@ CHARMAP \x87\x57\x7C |0 \x87\x5B\x57 |0 \x87\x53\x3E |0 - \x89\x69\x43 |0 - \x89\x69\x44 |0 \x85\x73\x43 |0 \x87\x57\x7B |0 \x87\x5B\x58 |0 - \x89\x6A\x54 |0 - \x89\x6A\x55 |0 - \x89\x6A\x56 |0 \x87\x5E\x6A |0 \x85\x77\x5D |0 \x87\x5E\x69 |0 @@ -32717,23 +30509,13 @@ CHARMAP \x87\x5E\x6B |0 \x85\x77\x5C |0 \x87\x5E\x68 |0 - \x89\x6B\x49 |0 - \x89\x6B\x4A |0 - \x89\x6B\x4B |0 - \x89\x6B\x4C |0 \x87\x62\x38 |0 - \x89\x6C\x2A |0 - \x89\x6C\x2B |0 \x84\x6D\x73 |0 \x87\x63\x53 |0 - \x89\x6C\x61 |0 \x87\x66\x26 |0 \x84\x22\x77 |0 \x84\x24\x3D |0 \x84\x26\x5A |0 - \x89\x27\x31 |0 - \x89\x27\x32 |0 - \x89\x27\x33 |0 \x86\x31\x58 |0 \x86\x38\x22 |0 \x85\x2F\x5C |0 @@ -32744,18 +30526,14 @@ CHARMAP \x86\x40\x38 |0 \x86\x49\x4F |0 \x86\x49\x4E |0 - \x89\x3B\x4C |0 - \x89\x3B\x4D |0 \x85\x38\x75 |0 \x86\x53\x26 |0 - \x89\x41\x6A |0 \x86\x53\x27 |0 \x85\x46\x2D |0 \x86\x5D\x40 |0 \x87\x23\x46 |0 \x87\x23\x47 |0 \x85\x54\x60 |0 - \x89\x54\x61 |0 \x87\x38\x3B |0 \x87\x38\x3A |0 \x85\x5B\x59 |0 @@ -32827,11 +30605,6 @@ CHARMAP \x84\x32\x2D |0 \x84\x32\x29 |0 \x85\x32\x6E |0 - \x89\x35\x31 |0 - \x89\x35\x32 |0 - \x89\x35\x33 |0 - \x89\x35\x34 |0 - \x89\x35\x35 |0 \x85\x32\x6A |0 \x86\x40\x3F |0 \x86\x49\x58 |0 @@ -32883,7 +30656,6 @@ CHARMAP \x84\x3D\x58 |0 \x85\x3F\x58 |0 \x86\x53\x2A |0 - \x89\x41\x6B |0 \x86\x53\x2C |0 \x85\x32\x71 |0 \x84\x3D\x5A |0 @@ -32924,7 +30696,6 @@ CHARMAP \x87\x23\x50 |0 \x85\x4D\x43 |0 \x85\x4D\x44 |0 - \x89\x4F\x31 |0 \x87\x23\x4B |0 \x87\x23\x4C |0 \x87\x23\x4A |0 @@ -32932,7 +30703,6 @@ CHARMAP \x87\x2E\x42 |0 \x87\x2E\x46 |0 \x87\x2E\x48 |0 - \x89\x54\x62 |0 \x85\x54\x61 |0 \x87\x2E\x4B |0 \x87\x2E\x47 |0 @@ -32946,7 +30716,6 @@ CHARMAP \x85\x54\x64 |0 \x85\x54\x65 |0 \x85\x54\x66 |0 - \x89\x54\x63 |0 \x87\x2E\x44 |0 \x85\x54\x62 |0 \x87\x23\x51 |0 @@ -32959,8 +30728,6 @@ CHARMAP \x84\x56\x3C |0 \x84\x56\x3D |0 \x85\x5B\x5B |0 - \x89\x5A\x37 |0 - \x89\x5A\x38 |0 \x87\x38\x3F |0 \x85\x5B\x5C |0 \x85\x61\x70 |0 @@ -32975,7 +30742,6 @@ CHARMAP \x85\x67\x7E |0 \x85\x67\x7C |0 \x85\x67\x7D |0 - \x89\x62\x4A |0 \x85\x6C\x34 |0 \x84\x63\x4D |0 \x85\x6C\x35 |0 @@ -32990,75 +30756,50 @@ CHARMAP \x85\x70\x25 |0 \x85\x70\x26 |0 \x85\x73\x48 |0 - \x89\x69\x45 |0 \x87\x5B\x59 |0 \x85\x75\x6B |0 \x84\x6A\x4A |0 \x87\x5B\x5A |0 \x84\x6C\x6F |0 - \x89\x6C\x62 |0 - \x89\x22\x53 |0 - \x89\x24\x46 |0 \x86\x2B\x6D |0 - \x89\x2B\x2D |0 - \x89\x2B\x2E |0 - \x89\x2B\x2F |0 \x86\x38\x2D |0 \x86\x38\x2E |0 - \x89\x2F\x65 |0 \x86\x40\x42 |0 \x86\x40\x44 |0 - \x89\x35\x37 |0 - \x89\x35\x38 |0 \x86\x40\x43 |0 - \x89\x3B\x4E |0 \x85\x3F\x5D |0 - \x89\x41\x6C |0 \x86\x53\x32 |0 - \x89\x35\x36 |0 \x85\x4D\x48 |0 \x87\x23\x54 |0 \x87\x23\x53 |0 \x85\x4D\x49 |0 - \x89\x4F\x33 |0 - \x89\x4F\x34 |0 \x85\x4D\x4A |0 \x87\x2E\x4D |0 - \x89\x5A\x39 |0 - \x89\x5E\x75 |0 - \x89\x62\x4B |0 - \x89\x67\x5A |0 \x87\x5B\x5B |0 \x86\x22\x22 |0 - \x89\x27\x34 |0 \x86\x31\x60 |0 \x84\x2D\x48 |0 \x85\x2D\x76 |0 \x85\x2D\x75 |0 \x86\x38\x2F |0 \x85\x32\x72 |0 - \x89\x35\x39 |0 \x86\x40\x46 |0 \x86\x40\x45 |0 \x86\x49\x5D |0 - \x89\x40\x32 |0 \x86\x49\x5B |0 \x86\x49\x5C |0 \x84\x3D\x61 |0 \x86\x5D\x4C |0 \x85\x3F\x5E |0 - \x89\x41\x6D |0 \x84\x43\x6A |0 \x84\x4A\x2D |0 \x87\x23\x55 |0 \x87\x38\x40 |0 \x84\x5F\x6C |0 \x86\x22\x23 |0 - \x89\x24\x47 |0 \x86\x2B\x6F |0 \x86\x2B\x6E |0 \x86\x31\x61 |0 - \x89\x2F\x66 |0 \x84\x32\x32 |0 \x86\x40\x48 |0 \x86\x40\x47 |0 @@ -33099,33 +30840,23 @@ CHARMAP \x87\x3F\x70 |0 \x87\x3F\x71 |0 \x87\x47\x39 |0 - \x89\x62\x4C |0 \x87\x4D\x78 |0 \x87\x57\x7D |0 \x84\x24\x42 |0 \x86\x27\x7B |0 - \x89\x27\x35 |0 - \x89\x27\x36 |0 \x85\x29\x4D |0 \x86\x31\x64 |0 \x86\x31\x63 |0 - \x89\x2B\x30 |0 \x86\x31\x62 |0 \x84\x2D\x4A |0 \x85\x2D\x77 |0 \x86\x38\x31 |0 \x86\x38\x33 |0 \x86\x38\x35 |0 - \x89\x2F\x67 |0 - \x89\x2F\x68 |0 - \x89\x2F\x69 |0 - \x89\x2F\x6A |0 \x86\x38\x32 |0 \x84\x32\x33 |0 \x84\x32\x35 |0 \x86\x40\x4A |0 - \x89\x35\x3A |0 - \x89\x35\x3B |0 \x86\x40\x49 |0 \x86\x49\x69 |0 \x85\x39\x25 |0 @@ -33133,19 +30864,14 @@ CHARMAP \x86\x49\x68 |0 \x86\x49\x6A |0 \x86\x49\x67 |0 - \x89\x3B\x4F |0 - \x89\x3B\x50 |0 \x86\x53\x38 |0 \x85\x3F\x60 |0 \x86\x53\x39 |0 - \x89\x41\x6E |0 - \x89\x41\x6F |0 \x85\x46\x38 |0 \x85\x46\x3A |0 \x86\x5D\x52 |0 \x85\x46\x39 |0 \x87\x23\x56 |0 - \x89\x4F\x35 |0 \x87\x2E\x53 |0 \x85\x54\x68 |0 \x87\x38\x43 |0 @@ -33170,15 +30896,12 @@ CHARMAP \x86\x53\x3A |0 \x86\x53\x3B |0 \x84\x3D\x66 |0 - \x89\x4F\x36 |0 \x86\x23\x2C |0 \x86\x23\x2B |0 \x86\x24\x7B |0 \x85\x22\x73 |0 \x86\x24\x7A |0 \x86\x24\x7C |0 - \x89\x22\x54 |0 - \x89\x24\x4B |0 \x86\x27\x7C |0 \x86\x27\x7D |0 \x86\x28\x25 |0 @@ -33188,9 +30911,6 @@ CHARMAP \x86\x28\x24 |0 \x86\x28\x23 |0 \x86\x28\x21 |0 - \x89\x24\x48 |0 - \x89\x24\x4A |0 - \x89\x24\x4C |0 \x84\x24\x44 |0 \x85\x26\x48 |0 \x86\x2B\x74 |0 @@ -33206,13 +30926,6 @@ CHARMAP \x85\x26\x45 |0 \x86\x2B\x75 |0 \x86\x2B\x78 |0 - \x89\x27\x37 |0 - \x89\x27\x38 |0 - \x89\x27\x39 |0 - \x89\x27\x3A |0 - \x89\x27\x3B |0 - \x89\x27\x3C |0 - \x89\x27\x3D |0 \x86\x2B\x71 |0 \x86\x2B\x7B |0 \x86\x2B\x7C |0 @@ -33226,11 +30939,7 @@ CHARMAP \x86\x31\x68 |0 \x86\x31\x69 |0 \x84\x29\x68 |0 - \x89\x2B\x31 |0 - \x89\x2B\x32 |0 \x86\x31\x6A |0 - \x89\x2B\x35 |0 - \x89\x2B\x36 |0 \x86\x31\x6E |0 \x86\x31\x6C |0 \x86\x31\x6B |0 @@ -33248,10 +30957,7 @@ CHARMAP \x85\x2D\x7D |0 \x86\x38\x39 |0 \x86\x38\x3D |0 - \x89\x2F\x6B |0 - \x89\x2F\x6D |0 \x86\x38\x3B |0 - \x89\x2F\x6C |0 \x86\x38\x41 |0 \x86\x38\x3F |0 \x85\x32\x73 |0 @@ -33269,18 +30975,6 @@ CHARMAP \x86\x38\x40 |0 \x86\x40\x54 |0 \x86\x40\x56 |0 - \x89\x35\x3C |0 - \x89\x35\x3D |0 - \x89\x35\x3E |0 - \x89\x35\x3F |0 - \x89\x35\x40 |0 - \x89\x35\x41 |0 - \x89\x35\x42 |0 - \x89\x35\x43 |0 - \x89\x35\x44 |0 - \x89\x35\x45 |0 - \x89\x35\x46 |0 - \x89\x35\x47 |0 \x86\x40\x52 |0 \x85\x32\x74 |0 \x86\x49\x71 |0 @@ -33302,17 +30996,6 @@ CHARMAP \x86\x49\x6E |0 \x86\x49\x75 |0 \x86\x49\x77 |0 - \x89\x3B\x51 |0 - \x89\x3B\x53 |0 - \x89\x3B\x54 |0 - \x89\x3B\x56 |0 - \x89\x3B\x57 |0 - \x89\x3B\x59 |0 - \x89\x3B\x5A |0 - \x89\x3B\x5C |0 - \x89\x3B\x5D |0 - \x89\x3B\x52 |0 - \x89\x3B\x58 |0 \x84\x38\x26 |0 \x84\x38\x28 |0 \x86\x49\x72 |0 @@ -33325,21 +31008,7 @@ CHARMAP \x86\x53\x42 |0 \x86\x53\x3F |0 \x86\x53\x44 |0 - \x89\x46\x39 |0 - \x89\x3B\x5B |0 \x86\x53\x3E |0 - \x89\x41\x70 |0 - \x89\x41\x71 |0 - \x89\x41\x73 |0 - \x89\x41\x74 |0 - \x89\x41\x75 |0 - \x89\x41\x76 |0 - \x89\x41\x77 |0 - \x89\x41\x78 |0 - \x89\x41\x79 |0 - \x89\x41\x7A |0 - \x89\x41\x7B |0 - \x89\x41\x7D |0 \x85\x3D\x55 |0 \x86\x53\x45 |0 \x86\x53\x40 |0 @@ -33355,12 +31024,6 @@ CHARMAP \x84\x43\x6C |0 \x85\x46\x42 |0 \x85\x4D\x4E |0 - \x89\x48\x4A |0 - \x89\x48\x4B |0 - \x89\x48\x4C |0 - \x89\x48\x4D |0 - \x89\x48\x4E |0 - \x89\x48\x4F |0 \x86\x5D\x54 |0 \x85\x46\x3C |0 \x86\x5D\x57 |0 @@ -33378,12 +31041,8 @@ CHARMAP \x87\x23\x57 |0 \x87\x23\x58 |0 \x87\x23\x62 |0 - \x89\x4F\x37 |0 - \x89\x4F\x39 |0 - \x89\x4F\x3A |0 \x85\x4D\x54 |0 \x87\x23\x60 |0 - \x89\x4E\x30 |0 \x87\x23\x5D |0 \x87\x23\x5F |0 \x87\x23\x59 |0 @@ -33399,19 +31058,12 @@ CHARMAP \x84\x50\x54 |0 \x87\x2E\x5C |0 \x87\x2E\x54 |0 - \x89\x54\x65 |0 - \x89\x54\x66 |0 - \x89\x54\x67 |0 - \x89\x54\x69 |0 - \x89\x54\x6A |0 \x87\x2E\x58 |0 \x85\x4D\x4F |0 \x87\x2D\x62 |0 - \x89\x54\x68 |0 \x87\x2E\x43 |0 \x85\x54\x6A |0 \x87\x2E\x56 |0 - \x89\x4F\x38 |0 \x87\x38\x47 |0 \x85\x5B\x60 |0 \x85\x5B\x61 |0 @@ -33420,20 +31072,11 @@ CHARMAP \x87\x38\x45 |0 \x87\x38\x46 |0 \x87\x38\x49 |0 - \x89\x5A\x3A |0 - \x89\x5A\x3B |0 - \x89\x5A\x3C |0 \x87\x38\x44 |0 - \x89\x5A\x3D |0 \x84\x5B\x3E |0 \x85\x61\x72 |0 \x85\x61\x73 |0 \x87\x3F\x75 |0 - \x89\x5E\x76 |0 - \x89\x5E\x77 |0 - \x89\x5E\x78 |0 - \x89\x5E\x79 |0 - \x89\x5E\x7B |0 \x87\x3F\x78 |0 \x85\x68\x23 |0 \x87\x47\x3D |0 @@ -33442,43 +31085,25 @@ CHARMAP \x85\x68\x24 |0 \x87\x47\x3B |0 \x87\x47\x3E |0 - \x89\x62\x4D |0 \x85\x6C\x37 |0 - \x89\x65\x31 |0 - \x89\x65\x32 |0 \x85\x6B\x6E |0 \x87\x4D\x79 |0 \x87\x53\x46 |0 \x87\x58\x21 |0 - \x89\x69\x46 |0 \x85\x73\x39 |0 \x85\x73\x49 |0 \x87\x5B\x5C |0 \x85\x77\x5E |0 \x87\x5E\x6D |0 - \x89\x6B\x4D |0 \x85\x79\x2B |0 \x87\x64\x47 |0 - \x89\x24\x4D |0 \x86\x2B\x7E |0 - \x89\x27\x3F |0 - \x89\x27\x40 |0 \x86\x2C\x21 |0 \x85\x29\x53 |0 \x85\x29\x52 |0 \x86\x31\x70 |0 - \x89\x2B\x37 |0 - \x89\x2B\x39 |0 \x86\x31\x6F |0 \x86\x38\x42 |0 - \x89\x2F\x6F |0 - \x89\x2F\x70 |0 - \x89\x2F\x71 |0 - \x89\x2F\x72 |0 - \x89\x2F\x73 |0 - \x89\x35\x49 |0 - \x89\x35\x4A |0 - \x89\x3B\x5F |0 \x86\x49\x7A |0 \x86\x49\x79 |0 \x85\x3F\x65 |0 @@ -33487,7 +31112,6 @@ CHARMAP \x85\x4D\x57 |0 \x85\x4D\x56 |0 \x87\x23\x63 |0 - \x89\x54\x6B |0 \x85\x5B\x63 |0 \x87\x3F\x7A |0 \x85\x61\x74 |0 @@ -33509,10 +31133,8 @@ CHARMAP \x85\x29\x54 |0 \x84\x29\x69 |0 \x84\x29\x6A |0 - \x89\x2B\x3A |0 \x86\x31\x71 |0 \x86\x38\x43 |0 - \x89\x35\x4B |0 \x85\x32\x76 |0 \x86\x40\x59 |0 \x86\x40\x5B |0 @@ -33520,14 +31142,8 @@ CHARMAP \x86\x49\x7C |0 \x86\x40\x5A |0 \x85\x39\x2D |0 - \x89\x39\x46 |0 - \x89\x3B\x61 |0 - \x89\x3B\x62 |0 \x86\x53\x47 |0 \x85\x3F\x67 |0 - \x89\x3B\x60 |0 - \x89\x41\x7E |0 - \x89\x42\x21 |0 \x86\x53\x48 |0 \x86\x5D\x5D |0 \x86\x5D\x5E |0 @@ -33535,19 +31151,13 @@ CHARMAP \x84\x4A\x34 |0 \x85\x4D\x59 |0 \x84\x4A\x33 |0 - \x89\x4F\x3B |0 - \x89\x4F\x3C |0 \x85\x54\x6E |0 \x85\x54\x6C |0 \x85\x5B\x64 |0 \x85\x54\x6D |0 - \x89\x54\x6D |0 - \x89\x54\x6E |0 \x87\x38\x4B |0 \x87\x38\x4A |0 - \x89\x5A\x3E |0 \x85\x61\x75 |0 - \x89\x5E\x7C |0 \x87\x3F\x7B |0 \x85\x6C\x38 |0 \x85\x75\x6F |0 @@ -33555,24 +31165,17 @@ CHARMAP \x85\x21\x48 |0 \x84\x21\x4E |0 \x84\x21\x7D |0 - \x89\x21\x65 |0 \x85\x22\x75 |0 \x86\x25\x22 |0 \x85\x22\x74 |0 \x86\x24\x7E |0 \x86\x25\x21 |0 - \x89\x22\x56 |0 \x84\x22\x7B |0 \x84\x22\x7A |0 \x86\x28\x2C |0 \x84\x24\x49 |0 \x86\x28\x2A |0 \x86\x28\x2B |0 - \x89\x24\x4E |0 - \x89\x24\x4F |0 - \x89\x24\x54 |0 - \x89\x24\x50 |0 - \x89\x24\x52 |0 \x85\x24\x46 |0 \x86\x28\x2D |0 \x85\x24\x45 |0 @@ -33591,27 +31194,12 @@ CHARMAP \x85\x26\x53 |0 \x85\x26\x4F |0 \x85\x26\x4E |0 - \x89\x27\x43 |0 - \x89\x27\x45 |0 - \x89\x27\x46 |0 - \x89\x27\x47 |0 - \x89\x27\x49 |0 - \x89\x27\x4A |0 - \x89\x27\x4B |0 - \x89\x27\x4D |0 - \x89\x27\x4F |0 - \x89\x27\x51 |0 - \x89\x27\x54 |0 - \x89\x27\x55 |0 \x86\x2C\x24 |0 \x86\x2C\x29 |0 \x85\x26\x54 |0 \x86\x2C\x2C |0 - \x89\x27\x44 |0 \x86\x2C\x2D |0 \x86\x2C\x2A |0 - \x89\x27\x48 |0 - \x89\x27\x42 |0 \x86\x2C\x25 |0 \x85\x26\x55 |0 \x86\x2D\x5C |0 @@ -33627,26 +31215,6 @@ CHARMAP \x85\x2E\x26 |0 \x85\x29\x5A |0 \x85\x29\x58 |0 - \x89\x27\x53 |0 - \x89\x2B\x3B |0 - \x89\x2B\x3C |0 - \x89\x2B\x3D |0 - \x89\x2B\x3F |0 - \x89\x2B\x40 |0 - \x89\x2B\x41 |0 - \x89\x2B\x42 |0 - \x89\x2B\x43 |0 - \x89\x2B\x44 |0 - \x89\x2B\x45 |0 - \x89\x2B\x46 |0 - \x89\x2B\x47 |0 - \x89\x2B\x49 |0 - \x89\x2B\x4A |0 - \x89\x2B\x4B |0 - \x89\x2B\x4C |0 - \x89\x2B\x4D |0 - \x89\x2B\x4E |0 - \x89\x2B\x4F |0 \x85\x29\x5B |0 \x86\x40\x5C |0 \x86\x38\x4F |0 @@ -33664,39 +31232,14 @@ CHARMAP \x85\x2E\x29 |0 \x85\x2E\x2A |0 \x86\x38\x44 |0 - \x89\x2F\x74 |0 - \x89\x2F\x75 |0 - \x89\x2F\x76 |0 - \x89\x2F\x78 |0 - \x89\x2F\x79 |0 - \x89\x2F\x7A |0 - \x89\x2F\x7B |0 - \x89\x2F\x7C |0 - \x89\x2F\x7D |0 - \x89\x2F\x7E |0 - \x89\x30\x21 |0 - \x89\x30\x22 |0 - \x89\x30\x23 |0 - \x89\x30\x25 |0 - \x89\x30\x26 |0 - \x89\x30\x27 |0 - \x89\x30\x29 |0 - \x89\x30\x2A |0 - \x89\x30\x2B |0 - \x89\x30\x2C |0 - \x89\x30\x2E |0 \x86\x38\x4C |0 \x86\x38\x47 |0 \x86\x38\x49 |0 \x84\x2D\x53 |0 \x86\x38\x4E |0 - \x89\x30\x30 |0 - \x89\x30\x28 |0 \x84\x2D\x5A |0 - \x89\x30\x2D |0 \x85\x2E\x2C |0 \x85\x2E\x28 |0 - \x89\x2F\x77 |0 \x86\x38\x52 |0 \x86\x40\x68 |0 \x86\x40\x69 |0 @@ -33710,30 +31253,6 @@ CHARMAP \x86\x40\x67 |0 \x86\x4A\x2E |0 \x86\x40\x63 |0 - \x89\x35\x4C |0 - \x89\x35\x4D |0 - \x89\x35\x4F |0 - \x89\x35\x50 |0 - \x89\x35\x51 |0 - \x89\x35\x52 |0 - \x89\x35\x53 |0 - \x89\x35\x54 |0 - \x89\x35\x55 |0 - \x89\x35\x56 |0 - \x89\x35\x58 |0 - \x89\x35\x59 |0 - \x89\x35\x5A |0 - \x89\x35\x5B |0 - \x89\x35\x5C |0 - \x89\x35\x5D |0 - \x89\x35\x5E |0 - \x89\x35\x5F |0 - \x89\x35\x60 |0 - \x89\x35\x61 |0 - \x89\x35\x62 |0 - \x89\x35\x63 |0 - \x89\x35\x65 |0 - \x89\x35\x66 |0 \x86\x40\x64 |0 \x86\x40\x66 |0 \x86\x40\x65 |0 @@ -33748,7 +31267,6 @@ CHARMAP \x85\x32\x7A |0 \x85\x32\x7C |0 \x86\x40\x6A |0 - \x89\x35\x4E |0 \x86\x40\x5E |0 \x84\x38\x36 |0 \x86\x4A\x34 |0 @@ -33787,41 +31305,6 @@ CHARMAP \x84\x38\x38 |0 \x86\x4A\x36 |0 \x86\x4A\x37 |0 - \x89\x3B\x64 |0 - \x89\x3B\x65 |0 - \x89\x3B\x67 |0 - \x89\x3B\x68 |0 - \x89\x3B\x69 |0 - \x89\x3B\x6B |0 - \x89\x3B\x6C |0 - \x89\x3B\x6D |0 - \x89\x3B\x6F |0 - \x89\x3B\x71 |0 - \x89\x3B\x72 |0 - \x89\x3B\x74 |0 - \x89\x3B\x75 |0 - \x89\x3B\x76 |0 - \x89\x3B\x77 |0 - \x89\x3B\x78 |0 - \x89\x3B\x79 |0 - \x89\x3B\x7A |0 - \x89\x3B\x7B |0 - \x89\x3B\x7C |0 - \x89\x3B\x7D |0 - \x89\x3B\x7E |0 - \x89\x3C\x22 |0 - \x89\x3C\x23 |0 - \x89\x3C\x24 |0 - \x89\x3C\x25 |0 - \x89\x3C\x26 |0 - \x89\x3C\x27 |0 - \x89\x3C\x28 |0 - \x89\x3C\x2A |0 - \x89\x3C\x2B |0 - \x89\x3C\x2C |0 - \x89\x3C\x2D |0 - \x89\x3C\x2E |0 - \x89\x3C\x2F |0 \x86\x4A\x29 |0 \x86\x4A\x2B |0 \x86\x4A\x2C |0 @@ -33869,41 +31352,6 @@ CHARMAP \x86\x53\x4F |0 \x86\x53\x51 |0 \x86\x53\x4C |0 - \x89\x42\x23 |0 - \x89\x42\x24 |0 - \x89\x42\x25 |0 - \x89\x42\x26 |0 - \x89\x42\x27 |0 - \x89\x42\x29 |0 - \x89\x42\x2A |0 - \x89\x42\x2B |0 - \x89\x42\x2C |0 - \x89\x42\x2D |0 - \x89\x42\x2E |0 - \x89\x42\x30 |0 - \x89\x42\x31 |0 - \x89\x42\x32 |0 - \x89\x42\x33 |0 - \x89\x42\x34 |0 - \x89\x42\x35 |0 - \x89\x42\x36 |0 - \x89\x42\x38 |0 - \x89\x42\x39 |0 - \x89\x42\x3A |0 - \x89\x42\x3B |0 - \x89\x42\x3D |0 - \x89\x42\x3E |0 - \x89\x42\x3F |0 - \x89\x42\x40 |0 - \x89\x42\x41 |0 - \x89\x42\x42 |0 - \x89\x42\x43 |0 - \x89\x42\x44 |0 - \x89\x42\x45 |0 - \x89\x42\x46 |0 - \x89\x42\x48 |0 - \x89\x42\x4A |0 - \x89\x42\x4C |0 \x86\x53\x4D |0 \x86\x53\x52 |0 \x86\x53\x54 |0 @@ -33911,15 +31359,10 @@ CHARMAP \x86\x53\x62 |0 \x86\x53\x4B |0 \x86\x53\x5F |0 - \x89\x42\x22 |0 - \x89\x42\x2F |0 - \x89\x42\x37 |0 \x85\x39\x3F |0 \x85\x3F\x72 |0 \x86\x53\x53 |0 - \x89\x43\x74 |0 \x85\x46\x4E |0 - \x89\x42\x4B |0 \x85\x46\x50 |0 \x84\x43\x7B |0 \x84\x43\x72 |0 @@ -33945,35 +31388,6 @@ CHARMAP \x86\x5D\x65 |0 \x85\x46\x4C |0 \x85\x46\x51 |0 - \x89\x48\x57 |0 - \x89\x48\x58 |0 - \x89\x48\x59 |0 - \x89\x48\x5A |0 - \x89\x48\x5B |0 - \x89\x48\x5C |0 - \x89\x48\x5D |0 - \x89\x48\x5E |0 - \x89\x48\x5F |0 - \x89\x48\x60 |0 - \x89\x48\x61 |0 - \x89\x48\x62 |0 - \x89\x48\x63 |0 - \x89\x48\x64 |0 - \x89\x48\x65 |0 - \x89\x48\x66 |0 - \x89\x48\x67 |0 - \x89\x48\x68 |0 - \x89\x48\x69 |0 - \x89\x48\x6A |0 - \x89\x48\x6B |0 - \x89\x48\x6C |0 - \x89\x48\x6D |0 - \x89\x48\x6E |0 - \x89\x48\x6F |0 - \x89\x48\x71 |0 - \x89\x48\x72 |0 - \x89\x48\x73 |0 - \x89\x48\x75 |0 \x83\x47\x4B |0 \x86\x5D\x6A |0 \x86\x5D\x67 |0 @@ -33981,17 +31395,11 @@ CHARMAP \x86\x5D\x6C |0 \x85\x46\x56 |0 \x85\x46\x57 |0 - \x89\x48\x74 |0 \x86\x5D\x64 |0 \x86\x5D\x66 |0 - \x89\x48\x50 |0 - \x89\x48\x51 |0 - \x89\x48\x53 |0 - \x89\x48\x54 |0 \x86\x5D\x60 |0 \x86\x5D\x6D |0 \x86\x5D\x61 |0 - \x89\x48\x56 |0 \x87\x23\x68 |0 \x85\x4D\x67 |0 \x85\x4D\x5E |0 @@ -34028,26 +31436,6 @@ CHARMAP \x84\x4A\x49 |0 \x87\x23\x66 |0 \x87\x23\x6A |0 - \x89\x4F\x3D |0 - \x89\x4F\x3E |0 - \x89\x4F\x3F |0 - \x89\x4F\x43 |0 - \x89\x4F\x44 |0 - \x89\x4F\x46 |0 - \x89\x4F\x47 |0 - \x89\x4F\x48 |0 - \x89\x4F\x49 |0 - \x89\x4F\x4A |0 - \x89\x4F\x4B |0 - \x89\x4F\x4C |0 - \x89\x4F\x4D |0 - \x89\x4F\x4E |0 - \x89\x4F\x4F |0 - \x89\x4F\x50 |0 - \x89\x4F\x51 |0 - \x89\x4F\x52 |0 - \x89\x4F\x53 |0 - \x89\x4F\x40 |0 \x87\x23\x6B |0 \x85\x4D\x6C |0 \x85\x4D\x68 |0 @@ -34104,47 +31492,10 @@ CHARMAP \x85\x54\x7C |0 \x85\x54\x6F |0 \x85\x54\x73 |0 - \x89\x54\x6F |0 - \x89\x54\x70 |0 - \x89\x54\x71 |0 - \x89\x54\x72 |0 - \x89\x54\x73 |0 - \x89\x54\x75 |0 - \x89\x54\x76 |0 - \x89\x54\x77 |0 - \x89\x54\x78 |0 - \x89\x54\x79 |0 - \x89\x54\x7A |0 - \x89\x54\x7C |0 - \x89\x54\x7D |0 - \x89\x54\x7E |0 - \x89\x55\x21 |0 - \x89\x55\x22 |0 - \x89\x55\x24 |0 - \x89\x55\x25 |0 - \x89\x55\x26 |0 - \x89\x55\x27 |0 - \x89\x55\x28 |0 - \x89\x55\x2B |0 - \x89\x55\x2C |0 - \x89\x55\x2D |0 - \x89\x55\x2E |0 - \x89\x55\x2F |0 - \x89\x55\x30 |0 - \x89\x55\x32 |0 - \x89\x55\x33 |0 - \x89\x55\x34 |0 - \x89\x55\x35 |0 - \x89\x55\x36 |0 - \x89\x55\x37 |0 - \x89\x55\x38 |0 \x87\x2E\x70 |0 \x87\x2E\x71 |0 \x84\x50\x61 |0 - \x89\x55\x23 |0 \x85\x54\x74 |0 - \x89\x48\x70 |0 - \x89\x4F\x41 |0 \x87\x2E\x6D |0 \x84\x56\x43 |0 \x87\x38\x50 |0 @@ -34171,35 +31522,14 @@ CHARMAP \x87\x38\x5B |0 \x85\x5B\x66 |0 \x87\x38\x54 |0 - \x89\x5A\x40 |0 - \x89\x5A\x41 |0 - \x89\x5A\x43 |0 - \x89\x5A\x44 |0 - \x89\x5A\x45 |0 - \x89\x5A\x46 |0 - \x89\x5A\x47 |0 - \x89\x5A\x48 |0 - \x89\x5A\x49 |0 - \x89\x5A\x4A |0 - \x89\x5A\x4B |0 - \x89\x5A\x4C |0 - \x89\x5A\x4E |0 - \x89\x5A\x4F |0 - \x89\x5A\x51 |0 - \x89\x5A\x52 |0 - \x89\x5A\x54 |0 \x87\x38\x58 |0 \x85\x5B\x6D |0 \x87\x38\x5A |0 \x87\x38\x4D |0 \x87\x38\x4F |0 \x87\x37\x27 |0 - \x89\x5A\x53 |0 - \x89\x5A\x4D |0 \x85\x5B\x6F |0 \x85\x5B\x70 |0 - \x89\x55\x31 |0 - \x89\x5A\x50 |0 \x84\x5B\x47 |0 \x85\x61\x78 |0 \x87\x40\x27 |0 @@ -34233,31 +31563,15 @@ CHARMAP \x85\x61\x76 |0 \x87\x3F\x7C |0 \x87\x3F\x7D |0 - \x89\x5E\x7E |0 - \x89\x5F\x22 |0 - \x89\x5F\x23 |0 - \x89\x5F\x24 |0 - \x89\x5F\x25 |0 - \x89\x5F\x26 |0 - \x89\x5F\x27 |0 - \x89\x5F\x28 |0 - \x89\x5F\x2A |0 - \x89\x5F\x2B |0 - \x89\x5F\x2C |0 - \x89\x5F\x2E |0 - \x89\x5F\x2F |0 - \x89\x5F\x30 |0 \x87\x40\x21 |0 \x87\x40\x25 |0 \x87\x40\x2C |0 \x87\x40\x2A |0 \x85\x62\x21 |0 - \x89\x5F\x21 |0 \x85\x62\x2A |0 \x85\x61\x77 |0 \x87\x40\x22 |0 \x87\x40\x24 |0 - \x89\x5F\x2D |0 \x85\x68\x25 |0 \x87\x47\x43 |0 \x85\x68\x28 |0 @@ -34276,26 +31590,10 @@ CHARMAP \x85\x68\x2F |0 \x87\x47\x47 |0 \x87\x3F\x7E |0 - \x89\x62\x52 |0 - \x89\x62\x56 |0 - \x89\x62\x58 |0 - \x89\x62\x59 |0 - \x89\x62\x5A |0 - \x89\x62\x5B |0 - \x89\x62\x5C |0 - \x89\x62\x5D |0 - \x89\x62\x5F |0 - \x89\x62\x60 |0 - \x89\x62\x61 |0 \x85\x68\x2E |0 \x87\x47\x44 |0 \x87\x47\x3F |0 - \x89\x62\x54 |0 \x85\x68\x2C |0 - \x89\x62\x57 |0 - \x89\x62\x4F |0 - \x89\x62\x5E |0 - \x89\x5E\x7D |0 \x84\x63\x53 |0 \x87\x4D\x7C |0 \x85\x6C\x3F |0 @@ -34312,17 +31610,6 @@ CHARMAP \x85\x68\x2A |0 \x85\x6C\x40 |0 \x85\x6C\x3E |0 - \x89\x65\x33 |0 - \x89\x65\x34 |0 - \x89\x65\x35 |0 - \x89\x65\x36 |0 - \x89\x65\x37 |0 - \x89\x65\x39 |0 - \x89\x65\x3A |0 - \x89\x65\x3B |0 - \x89\x65\x3C |0 - \x89\x65\x3D |0 - \x89\x65\x3F |0 \x87\x4E\x21 |0 \x84\x63\x52 |0 \x87\x53\x49 |0 @@ -34340,16 +31627,6 @@ CHARMAP \x85\x70\x2F |0 \x87\x53\x4E |0 \x85\x70\x32 |0 - \x89\x67\x5B |0 - \x89\x67\x5C |0 - \x89\x67\x5D |0 - \x89\x67\x5E |0 - \x89\x67\x5F |0 - \x89\x67\x60 |0 - \x89\x67\x61 |0 - \x89\x67\x62 |0 - \x89\x67\x63 |0 - \x89\x67\x64 |0 \x87\x53\x4C |0 \x85\x70\x31 |0 \x85\x70\x30 |0 @@ -34364,17 +31641,8 @@ CHARMAP \x85\x73\x4B |0 \x85\x73\x4D |0 \x87\x58\x25 |0 - \x89\x69\x47 |0 - \x89\x69\x48 |0 - \x89\x69\x49 |0 - \x89\x69\x4B |0 - \x89\x69\x4E |0 - \x89\x69\x4F |0 - \x89\x69\x50 |0 - \x89\x69\x51 |0 \x87\x58\x24 |0 \x87\x58\x22 |0 - \x89\x67\x65 |0 \x85\x75\x71 |0 \x85\x75\x73 |0 \x85\x77\x60 |0 @@ -34386,8 +31654,6 @@ CHARMAP \x87\x5B\x5F |0 \x85\x77\x61 |0 \x87\x5B\x5D |0 - \x89\x6A\x57 |0 - \x89\x6A\x59 |0 \x87\x5B\x5E |0 \x85\x75\x76 |0 \x85\x75\x70 |0 @@ -34395,35 +31661,23 @@ CHARMAP \x87\x5E\x6E |0 \x85\x77\x62 |0 \x87\x60\x71 |0 - \x89\x6B\x4E |0 - \x89\x6B\x4F |0 - \x89\x6B\x50 |0 - \x89\x6B\x53 |0 - \x89\x6B\x54 |0 \x87\x5E\x6F |0 \x87\x5E\x70 |0 - \x89\x6A\x58 |0 \x87\x60\x72 |0 \x85\x79\x2D |0 - \x89\x6C\x2C |0 \x87\x60\x73 |0 \x85\x79\x2C |0 \x85\x79\x2E |0 - \x89\x6B\x52 |0 \x85\x7A\x29 |0 \x87\x63\x54 |0 \x87\x60\x74 |0 \x84\x6D\x55 |0 - \x89\x6C\x2D |0 - \x89\x6C\x4C |0 - \x89\x6C\x63 |0 \x87\x63\x4C |0 \x87\x63\x55 |0 \x85\x7B\x40 |0 \x87\x64\x48 |0 \x87\x64\x49 |0 \x87\x65\x5B |0 - \x89\x6D\x2F |0 \x87\x65\x74 |0 \x86\x25\x24 |0 \x84\x24\x4B |0 @@ -34444,7 +31698,6 @@ CHARMAP \x85\x26\x59 |0 \x85\x26\x5A |0 \x85\x26\x57 |0 - \x89\x27\x56 |0 \x85\x29\x5F |0 \x86\x31\x7A |0 \x86\x38\x54 |0 @@ -34458,7 +31711,6 @@ CHARMAP \x85\x29\x60 |0 \x86\x31\x7B |0 \x85\x29\x5D |0 - \x89\x2C\x77 |0 \x86\x38\x57 |0 \x86\x38\x58 |0 \x86\x38\x55 |0 @@ -34472,18 +31724,9 @@ CHARMAP \x85\x2E\x34 |0 \x85\x2E\x31 |0 \x85\x2E\x30 |0 - \x89\x30\x31 |0 \x85\x33\x25 |0 \x86\x40\x6C |0 \x86\x40\x6D |0 - \x89\x35\x67 |0 - \x89\x35\x68 |0 - \x89\x35\x69 |0 - \x89\x35\x6A |0 - \x89\x35\x6B |0 - \x89\x35\x6C |0 - \x89\x35\x6D |0 - \x89\x35\x6E |0 \x84\x38\x3D |0 \x85\x39\x47 |0 \x85\x3F\x77 |0 @@ -34498,8 +31741,6 @@ CHARMAP \x86\x4A\x3E |0 \x85\x39\x46 |0 \x86\x4A\x3B |0 - \x89\x3C\x30 |0 - \x89\x3C\x31 |0 \x86\x4A\x3A |0 \x86\x53\x6E |0 \x85\x3F\x76 |0 @@ -34514,11 +31755,9 @@ CHARMAP \x86\x53\x6A |0 \x86\x53\x6D |0 \x85\x3F\x78 |0 - \x89\x42\x4E |0 \x86\x58\x5A |0 \x86\x53\x6C |0 \x86\x53\x65 |0 - \x89\x42\x4D |0 \x85\x46\x5C |0 \x84\x44\x2B |0 \x85\x46\x5E |0 @@ -34537,8 +31776,6 @@ CHARMAP \x86\x5D\x71 |0 \x86\x5D\x73 |0 \x86\x53\x6F |0 - \x89\x48\x76 |0 - \x89\x48\x78 |0 \x85\x46\x59 |0 \x85\x4D\x6E |0 \x87\x23\x7D |0 @@ -34552,24 +31789,19 @@ CHARMAP \x87\x23\x7A |0 \x87\x23\x7B |0 \x85\x4D\x6F |0 - \x89\x4F\x54 |0 \x87\x23\x7C |0 \x85\x54\x7E |0 \x87\x2E\x76 |0 \x84\x50\x68 |0 \x87\x2E\x75 |0 - \x89\x55\x3A |0 - \x89\x55\x3B |0 \x87\x38\x5E |0 \x87\x38\x60 |0 \x85\x5B\x71 |0 \x87\x38\x5F |0 - \x89\x5A\x55 |0 \x87\x38\x5D |0 \x85\x62\x2C |0 \x85\x68\x32 |0 \x85\x68\x31 |0 - \x89\x62\x62 |0 \x85\x70\x36 |0 \x87\x4E\x23 |0 \x85\x70\x35 |0 @@ -34607,9 +31839,6 @@ CHARMAP \x86\x2C\x39 |0 \x86\x2C\x35 |0 \x85\x26\x5F |0 - \x89\x27\x57 |0 - \x89\x27\x58 |0 - \x89\x27\x59 |0 \x84\x26\x72 |0 \x84\x29\x76 |0 \x85\x29\x63 |0 @@ -34624,7 +31853,6 @@ CHARMAP \x86\x37\x48 |0 \x85\x33\x26 |0 \x86\x40\x70 |0 - \x89\x35\x6F |0 \x86\x40\x6F |0 \x84\x38\x40 |0 \x84\x38\x3E |0 @@ -34641,7 +31869,6 @@ CHARMAP \x85\x3F\x7C |0 \x86\x53\x70 |0 \x85\x3F\x7B |0 - \x89\x42\x4F |0 \x86\x5A\x61 |0 \x87\x24\x22 |0 \x87\x24\x25 |0 @@ -34649,15 +31876,12 @@ CHARMAP \x87\x24\x26 |0 \x87\x24\x21 |0 \x87\x24\x24 |0 - \x89\x4F\x55 |0 \x87\x2E\x7A |0 \x87\x2E\x79 |0 \x87\x2E\x77 |0 \x87\x2E\x78 |0 \x87\x38\x61 |0 \x84\x56\x50 |0 - \x89\x5A\x56 |0 - \x89\x5A\x57 |0 \x85\x62\x2D |0 \x85\x62\x2E |0 \x87\x40\x2E |0 @@ -34714,7 +31938,6 @@ CHARMAP \x85\x29\x6A |0 \x86\x32\x24 |0 \x86\x38\x5F |0 - \x89\x2B\x50 |0 \x86\x32\x21 |0 \x85\x29\x6C |0 \x85\x2E\x36 |0 @@ -34746,7 +31969,6 @@ CHARMAP \x86\x4A\x49 |0 \x86\x40\x75 |0 \x86\x40\x72 |0 - \x89\x35\x71 |0 \x86\x53\x72 |0 \x86\x4A\x4A |0 \x85\x39\x53 |0 @@ -34765,7 +31987,6 @@ CHARMAP \x86\x4A\x4C |0 \x86\x53\x71 |0 \x86\x4A\x48 |0 - \x89\x3C\x32 |0 \x86\x53\x74 |0 \x86\x53\x79 |0 \x85\x3F\x7D |0 @@ -34777,8 +31998,6 @@ CHARMAP \x86\x53\x7A |0 \x86\x53\x75 |0 \x86\x53\x73 |0 - \x89\x42\x50 |0 - \x89\x35\x70 |0 \x84\x44\x34 |0 \x84\x44\x2E |0 \x86\x5D\x7B |0 @@ -34798,7 +32017,6 @@ CHARMAP \x84\x50\x69 |0 \x87\x24\x2C |0 \x87\x24\x2A |0 - \x89\x4F\x56 |0 \x85\x4D\x73 |0 \x87\x2E\x7B |0 \x87\x2E\x7C |0 @@ -34807,8 +32025,6 @@ CHARMAP \x85\x55\x23 |0 \x85\x55\x22 |0 \x87\x2E\x7E |0 - \x89\x55\x3C |0 - \x89\x55\x3D |0 \x87\x38\x64 |0 \x87\x38\x62 |0 \x85\x5B\x73 |0 @@ -34840,24 +32056,16 @@ CHARMAP \x86\x40\x79 |0 \x86\x40\x76 |0 \x86\x40\x77 |0 - \x89\x35\x73 |0 - \x89\x35\x75 |0 - \x89\x35\x76 |0 - \x89\x35\x77 |0 \x86\x40\x7B |0 \x86\x40\x7A |0 \x85\x33\x2D |0 \x86\x4A\x4F |0 \x86\x4A\x4E |0 - \x89\x3C\x33 |0 - \x89\x35\x72 |0 \x86\x54\x21 |0 \x86\x54\x22 |0 \x86\x53\x7D |0 \x86\x53\x7E |0 \x86\x54\x24 |0 - \x89\x42\x51 |0 - \x89\x42\x52 |0 \x86\x54\x23 |0 \x86\x53\x7C |0 \x85\x40\x21 |0 @@ -34868,7 +32076,6 @@ CHARMAP \x84\x44\x37 |0 \x86\x5D\x7E |0 \x86\x5D\x7D |0 - \x89\x48\x7A |0 \x85\x4D\x76 |0 \x86\x5E\x22 |0 \x87\x24\x2D |0 @@ -34880,9 +32087,6 @@ CHARMAP \x87\x2F\x24 |0 \x85\x55\x24 |0 \x87\x2F\x22 |0 - \x89\x55\x3E |0 - \x89\x55\x3F |0 - \x89\x55\x40 |0 \x87\x38\x66 |0 \x87\x38\x67 |0 \x84\x5B\x4E |0 @@ -34910,15 +32114,8 @@ CHARMAP \x86\x2C\x41 |0 \x86\x32\x29 |0 \x86\x38\x67 |0 - \x89\x3C\x34 |0 \x85\x40\x22 |0 \x84\x4A\x53 |0 - \x89\x4F\x57 |0 - \x89\x4F\x58 |0 - \x89\x5A\x59 |0 - \x89\x55\x41 |0 - \x89\x62\x63 |0 - \x89\x6A\x5A |0 \x85\x24\x4F |0 \x86\x28\x3E |0 \x86\x2C\x45 |0 @@ -34943,27 +32140,15 @@ CHARMAP \x85\x79\x30 |0 \x85\x21\x4A |0 \x84\x22\x7E |0 - \x89\x22\x5A |0 - \x89\x22\x5B |0 \x86\x28\x40 |0 \x86\x28\x3F |0 \x84\x24\x4E |0 - \x89\x24\x55 |0 - \x89\x24\x56 |0 - \x89\x24\x57 |0 - \x89\x24\x59 |0 - \x89\x24\x5A |0 \x85\x26\x6D |0 \x85\x26\x6A |0 \x85\x26\x6C |0 \x85\x26\x6B |0 \x86\x2C\x47 |0 \x86\x2C\x46 |0 - \x89\x27\x5A |0 - \x89\x27\x5C |0 - \x89\x27\x5D |0 - \x89\x27\x5E |0 - \x89\x27\x5F |0 \x85\x26\x43 |0 \x86\x32\x2C |0 \x85\x29\x6E |0 @@ -34979,20 +32164,6 @@ CHARMAP \x85\x29\x74 |0 \x86\x32\x2B |0 \x85\x29\x72 |0 - \x89\x2B\x51 |0 - \x89\x2B\x52 |0 - \x89\x2B\x53 |0 - \x89\x2B\x54 |0 - \x89\x2B\x55 |0 - \x89\x2B\x56 |0 - \x89\x2B\x57 |0 - \x89\x2B\x58 |0 - \x89\x2B\x59 |0 - \x89\x2B\x5A |0 - \x89\x2B\x5B |0 - \x89\x2B\x5C |0 - \x89\x2B\x5E |0 - \x89\x2B\x5D |0 \x86\x38\x6F |0 \x85\x2E\x41 |0 \x86\x38\x6E |0 @@ -35001,14 +32172,6 @@ CHARMAP \x84\x2D\x68 |0 \x86\x38\x6C |0 \x85\x2E\x42 |0 - \x89\x30\x32 |0 - \x89\x30\x33 |0 - \x89\x30\x34 |0 - \x89\x30\x35 |0 - \x89\x30\x36 |0 - \x89\x30\x37 |0 - \x89\x30\x38 |0 - \x89\x30\x39 |0 \x86\x38\x6B |0 \x85\x2E\x40 |0 \x86\x41\x26 |0 @@ -35024,11 +32187,6 @@ CHARMAP \x85\x33\x2F |0 \x86\x40\x7E |0 \x86\x41\x24 |0 - \x89\x35\x78 |0 - \x89\x35\x79 |0 - \x89\x35\x7A |0 - \x89\x35\x7B |0 - \x89\x35\x7C |0 \x85\x39\x55 |0 \x84\x38\x4D |0 \x85\x39\x56 |0 @@ -35043,17 +32201,7 @@ CHARMAP \x86\x4A\x55 |0 \x85\x39\x57 |0 \x86\x4A\x52 |0 - \x89\x3C\x3A |0 - \x89\x3C\x35 |0 - \x89\x3C\x37 |0 - \x89\x3C\x38 |0 - \x89\x3C\x39 |0 - \x89\x3C\x3B |0 - \x89\x3C\x3D |0 - \x89\x3C\x3F |0 - \x89\x3C\x40 |0 \x86\x4A\x54 |0 - \x89\x3C\x36 |0 \x85\x39\x5C |0 \x86\x54\x2E |0 \x86\x54\x2C |0 @@ -35069,10 +32217,6 @@ CHARMAP \x86\x54\x2A |0 \x86\x54\x2F |0 \x85\x40\x24 |0 - \x89\x42\x53 |0 - \x89\x42\x55 |0 - \x89\x42\x56 |0 - \x89\x42\x57 |0 \x86\x54\x30 |0 \x86\x5E\x29 |0 \x85\x46\x66 |0 @@ -35089,10 +32233,6 @@ CHARMAP \x86\x5E\x2F |0 \x86\x5E\x26 |0 \x86\x5E\x27 |0 - \x89\x48\x7C |0 - \x89\x48\x7D |0 - \x89\x48\x7E |0 - \x89\x49\x21 |0 \x86\x5E\x28 |0 \x85\x46\x69 |0 \x86\x5E\x30 |0 @@ -35121,10 +32261,6 @@ CHARMAP \x85\x55\x26 |0 \x84\x50\x73 |0 \x87\x2F\x2C |0 - \x89\x55\x42 |0 - \x89\x55\x43 |0 - \x89\x55\x44 |0 - \x89\x55\x45 |0 \x87\x2F\x2B |0 \x87\x24\x39 |0 \x87\x38\x6A |0 @@ -35133,9 +32269,6 @@ CHARMAP \x87\x38\x69 |0 \x85\x5B\x76 |0 \x87\x38\x68 |0 - \x89\x5A\x5A |0 - \x89\x5A\x5B |0 - \x89\x5A\x5C |0 \x87\x38\x6C |0 \x87\x38\x6B |0 \x85\x62\x35 |0 @@ -35147,22 +32280,17 @@ CHARMAP \x85\x62\x37 |0 \x87\x40\x34 |0 \x87\x40\x36 |0 - \x89\x5F\x31 |0 \x85\x62\x33 |0 - \x89\x5F\x32 |0 \x87\x47\x52 |0 \x85\x68\x34 |0 \x87\x47\x50 |0 \x87\x47\x51 |0 - \x89\x65\x41 |0 \x87\x4E\x26 |0 \x84\x66\x47 |0 \x85\x70\x39 |0 \x87\x53\x51 |0 - \x89\x67\x67 |0 \x87\x58\x2B |0 \x85\x73\x53 |0 - \x89\x69\x52 |0 \x85\x75\x7C |0 \x87\x5B\x65 |0 \x87\x64\x4A |0 @@ -35172,49 +32300,37 @@ CHARMAP \x85\x29\x76 |0 \x86\x33\x4C |0 \x86\x41\x27 |0 - \x89\x35\x7D |0 \x86\x41\x28 |0 \x86\x54\x31 |0 \x84\x44\x40 |0 \x87\x2F\x2D |0 \x87\x38\x6D |0 \x84\x5B\x51 |0 - \x89\x5A\x5D |0 \x86\x25\x2A |0 \x86\x25\x29 |0 - \x89\x24\x5C |0 \x86\x2C\x4B |0 \x86\x2C\x4A |0 \x86\x2C\x49 |0 \x86\x32\x31 |0 \x86\x32\x32 |0 - \x89\x2B\x5F |0 \x85\x29\x77 |0 \x85\x2E\x44 |0 - \x89\x35\x7E |0 \x85\x39\x5D |0 - \x89\x3C\x41 |0 \x86\x54\x32 |0 \x87\x24\x3B |0 \x87\x24\x3A |0 \x87\x40\x38 |0 \x87\x53\x52 |0 - \x89\x21\x67 |0 \x86\x22\x24 |0 \x86\x25\x2B |0 \x85\x21\x73 |0 \x86\x25\x2C |0 - \x89\x22\x5E |0 - \x89\x24\x69 |0 \x84\x23\x23 |0 \x86\x25\x2D |0 \x85\x24\x50 |0 \x86\x25\x2F |0 \x86\x25\x31 |0 \x83\x24\x24 |0 - \x89\x22\x5C |0 - \x89\x24\x5F |0 - \x89\x24\x60 |0 \x86\x25\x30 |0 \x86\x2C\x4D |0 \x85\x24\x52 |0 @@ -35229,17 +32345,6 @@ CHARMAP \x86\x28\x41 |0 \x86\x28\x45 |0 \x86\x28\x48 |0 - \x89\x24\x61 |0 - \x89\x24\x5E |0 - \x89\x24\x62 |0 - \x89\x24\x63 |0 - \x89\x24\x64 |0 - \x89\x24\x65 |0 - \x89\x24\x66 |0 - \x89\x24\x67 |0 - \x89\x27\x63 |0 - \x89\x27\x64 |0 - \x89\x27\x65 |0 \x84\x27\x23 |0 \x85\x26\x6F |0 \x86\x32\x33 |0 @@ -35261,18 +32366,6 @@ CHARMAP \x86\x2C\x5C |0 \x84\x26\x7C |0 \x86\x2C\x53 |0 - \x89\x27\x60 |0 - \x89\x27\x61 |0 - \x89\x27\x62 |0 - \x89\x27\x67 |0 - \x89\x27\x68 |0 - \x89\x27\x69 |0 - \x89\x27\x6A |0 - \x89\x27\x6B |0 - \x89\x27\x6D |0 - \x89\x2B\x64 |0 - \x89\x2B\x67 |0 - \x89\x2B\x6C |0 \x86\x2C\x52 |0 \x86\x2C\x54 |0 \x86\x2C\x55 |0 @@ -35300,27 +32393,11 @@ CHARMAP \x84\x2A\x23 |0 \x84\x29\x7D |0 \x86\x32\x3F |0 - \x89\x2B\x60 |0 - \x89\x2B\x61 |0 - \x89\x2B\x62 |0 - \x89\x2B\x63 |0 - \x89\x2B\x65 |0 - \x89\x2B\x66 |0 - \x89\x2B\x68 |0 - \x89\x2B\x69 |0 - \x89\x2B\x6A |0 - \x89\x2B\x6B |0 - \x89\x2B\x6D |0 - \x89\x2B\x6E |0 - \x89\x30\x3A |0 - \x89\x30\x3D |0 - \x89\x30\x44 |0 \x86\x32\x38 |0 \x84\x2A\x24 |0 \x86\x32\x35 |0 \x86\x32\x37 |0 \x85\x2A\x23 |0 - \x89\x30\x57 |0 \x84\x2D\x6E |0 \x85\x2E\x49 |0 \x86\x39\x30 |0 @@ -35354,33 +32431,6 @@ CHARMAP \x86\x39\x2F |0 \x86\x39\x32 |0 \x86\x41\x46 |0 - \x89\x30\x3B |0 - \x89\x30\x3E |0 - \x89\x30\x3F |0 - \x89\x30\x40 |0 - \x89\x30\x41 |0 - \x89\x30\x42 |0 - \x89\x30\x43 |0 - \x89\x30\x45 |0 - \x89\x30\x46 |0 - \x89\x30\x47 |0 - \x89\x30\x48 |0 - \x89\x30\x4A |0 - \x89\x30\x4B |0 - \x89\x30\x4C |0 - \x89\x30\x4D |0 - \x89\x30\x4E |0 - \x89\x30\x4F |0 - \x89\x30\x50 |0 - \x89\x30\x51 |0 - \x89\x30\x52 |0 - \x89\x30\x53 |0 - \x89\x30\x54 |0 - \x89\x30\x55 |0 - \x89\x30\x56 |0 - \x89\x30\x58 |0 - \x89\x30\x59 |0 - \x89\x30\x5A |0 \x86\x38\x79 |0 \x86\x39\x22 |0 \x86\x39\x31 |0 @@ -35389,7 +32439,6 @@ CHARMAP \x86\x38\x7D |0 \x86\x38\x75 |0 \x85\x2E\x46 |0 - \x89\x36\x2D |0 \x84\x32\x5D |0 \x85\x33\x40 |0 \x84\x32\x5B |0 @@ -35439,33 +32488,6 @@ CHARMAP \x84\x32\x6E |0 \x85\x33\x37 |0 \x86\x41\x3D |0 - \x89\x36\x21 |0 - \x89\x36\x22 |0 - \x89\x36\x23 |0 - \x89\x36\x25 |0 - \x89\x36\x26 |0 - \x89\x36\x27 |0 - \x89\x36\x28 |0 - \x89\x36\x2A |0 - \x89\x36\x2C |0 - \x89\x36\x2E |0 - \x89\x36\x2F |0 - \x89\x36\x30 |0 - \x89\x36\x31 |0 - \x89\x36\x32 |0 - \x89\x36\x36 |0 - \x89\x36\x37 |0 - \x89\x36\x38 |0 - \x89\x36\x39 |0 - \x89\x36\x3A |0 - \x89\x36\x3B |0 - \x89\x36\x3C |0 - \x89\x36\x3D |0 - \x89\x3C\x42 |0 - \x89\x3C\x4B |0 - \x89\x3C\x4D |0 - \x89\x3C\x57 |0 - \x89\x42\x5F |0 \x86\x4A\x57 |0 \x86\x41\x33 |0 \x86\x41\x37 |0 @@ -35516,25 +32538,6 @@ CHARMAP \x86\x4A\x72 |0 \x85\x39\x6D |0 \x86\x4A\x61 |0 - \x89\x3C\x44 |0 - \x89\x3C\x45 |0 - \x89\x3C\x46 |0 - \x89\x3C\x48 |0 - \x89\x3C\x49 |0 - \x89\x3C\x4A |0 - \x89\x3C\x4E |0 - \x89\x3C\x4F |0 - \x89\x3C\x50 |0 - \x89\x3C\x51 |0 - \x89\x3C\x52 |0 - \x89\x3C\x53 |0 - \x89\x3C\x54 |0 - \x89\x3C\x55 |0 - \x89\x3C\x56 |0 - \x89\x3C\x58 |0 - \x89\x3C\x59 |0 - \x89\x3C\x5B |0 - \x89\x3C\x5C |0 \x86\x4A\x69 |0 \x85\x39\x69 |0 \x86\x4A\x6B |0 @@ -35543,7 +32546,6 @@ CHARMAP \x86\x4A\x60 |0 \x86\x4A\x5E |0 \x85\x39\x6B |0 - \x89\x42\x73 |0 \x86\x54\x41 |0 \x85\x40\x25 |0 \x84\x3E\x41 |0 @@ -35585,41 +32587,12 @@ CHARMAP \x86\x54\x3D |0 \x86\x54\x40 |0 \x86\x54\x45 |0 - \x89\x42\x58 |0 - \x89\x42\x59 |0 - \x89\x42\x5A |0 - \x89\x42\x5B |0 - \x89\x42\x5C |0 - \x89\x42\x5D |0 - \x89\x42\x5E |0 - \x89\x42\x60 |0 - \x89\x42\x61 |0 - \x89\x42\x62 |0 - \x89\x42\x65 |0 - \x89\x42\x66 |0 - \x89\x42\x67 |0 - \x89\x42\x68 |0 - \x89\x42\x69 |0 - \x89\x42\x6A |0 - \x89\x42\x6C |0 - \x89\x42\x6D |0 - \x89\x42\x6E |0 - \x89\x42\x6F |0 - \x89\x42\x70 |0 - \x89\x42\x71 |0 - \x89\x42\x72 |0 - \x89\x42\x75 |0 - \x89\x49\x22 |0 - \x89\x49\x3E |0 \x85\x40\x2A |0 \x86\x54\x44 |0 \x84\x3E\x35 |0 \x86\x54\x4D |0 \x86\x54\x3A |0 \x86\x54\x4B |0 - \x89\x49\x2F |0 - \x89\x42\x6B |0 - \x89\x4F\x6C |0 \x86\x54\x39 |0 \x87\x24\x3D |0 \x84\x44\x54 |0 @@ -35659,31 +32632,6 @@ CHARMAP \x85\x46\x6E |0 \x86\x5E\x3F |0 \x85\x46\x73 |0 - \x89\x49\x23 |0 - \x89\x49\x24 |0 - \x89\x49\x25 |0 - \x89\x49\x26 |0 - \x89\x49\x27 |0 - \x89\x49\x28 |0 - \x89\x49\x29 |0 - \x89\x49\x2B |0 - \x89\x49\x2C |0 - \x89\x49\x2D |0 - \x89\x49\x2E |0 - \x89\x49\x30 |0 - \x89\x49\x31 |0 - \x89\x49\x34 |0 - \x89\x49\x36 |0 - \x89\x49\x37 |0 - \x89\x49\x38 |0 - \x89\x49\x39 |0 - \x89\x49\x3A |0 - \x89\x49\x3C |0 - \x89\x49\x3D |0 - \x89\x49\x41 |0 - \x89\x49\x42 |0 - \x89\x49\x43 |0 - \x89\x4F\x6D |0 \x87\x22\x68 |0 \x84\x44\x42 |0 \x86\x5E\x3C |0 @@ -35693,9 +32641,7 @@ CHARMAP \x86\x5E\x33 |0 \x86\x5E\x37 |0 \x86\x5E\x38 |0 - \x89\x49\x3B |0 \x86\x5E\x36 |0 - \x89\x49\x2A |0 \x87\x24\x62 |0 \x87\x24\x52 |0 \x87\x24\x4D |0 @@ -35748,35 +32694,6 @@ CHARMAP \x87\x24\x51 |0 \x85\x4E\x27 |0 \x87\x24\x5C |0 - \x89\x4F\x59 |0 - \x89\x4F\x5A |0 - \x89\x4F\x5B |0 - \x89\x4F\x5C |0 - \x89\x4F\x5D |0 - \x89\x4F\x5E |0 - \x89\x4F\x5F |0 - \x89\x4F\x62 |0 - \x89\x4F\x63 |0 - \x89\x4F\x64 |0 - \x89\x4F\x65 |0 - \x89\x4F\x66 |0 - \x89\x4F\x67 |0 - \x89\x4F\x68 |0 - \x89\x4F\x6A |0 - \x89\x4F\x6B |0 - \x89\x4F\x6F |0 - \x89\x4F\x70 |0 - \x89\x4F\x71 |0 - \x89\x4F\x72 |0 - \x89\x4F\x73 |0 - \x89\x4F\x74 |0 - \x89\x4F\x75 |0 - \x89\x4F\x76 |0 - \x89\x4F\x77 |0 - \x89\x4F\x78 |0 - \x89\x4F\x7B |0 - \x89\x4F\x7C |0 - \x89\x55\x51 |0 \x87\x24\x55 |0 \x87\x24\x60 |0 \x87\x2F\x30 |0 @@ -35785,9 +32702,6 @@ CHARMAP \x87\x24\x5D |0 \x87\x24\x48 |0 \x87\x24\x4A |0 - \x89\x55\x4A |0 - \x89\x4F\x7E |0 - \x89\x49\x40 |0 \x84\x50\x7C |0 \x85\x55\x35 |0 \x85\x55\x34 |0 @@ -35824,19 +32738,6 @@ CHARMAP \x87\x2F\x34 |0 \x87\x2F\x3E |0 \x87\x2F\x41 |0 - \x89\x55\x46 |0 - \x89\x55\x48 |0 - \x89\x55\x49 |0 - \x89\x55\x4B |0 - \x89\x55\x4C |0 - \x89\x55\x4F |0 - \x89\x55\x50 |0 - \x89\x55\x52 |0 - \x89\x55\x53 |0 - \x89\x55\x54 |0 - \x89\x55\x55 |0 - \x89\x55\x57 |0 - \x89\x5A\x6D |0 \x85\x55\x2F |0 \x87\x2F\x3F |0 \x87\x2F\x45 |0 @@ -35845,9 +32746,6 @@ CHARMAP \x87\x2F\x2E |0 \x87\x2F\x44 |0 \x84\x51\x21 |0 - \x89\x4F\x61 |0 - \x89\x5A\x66 |0 - \x89\x5A\x5F |0 \x85\x54\x3A |0 \x85\x5B\x7C |0 \x84\x56\x5A |0 @@ -35872,26 +32770,10 @@ CHARMAP \x85\x55\x37 |0 \x83\x55\x3A |0 \x87\x38\x78 |0 - \x89\x5A\x60 |0 - \x89\x5A\x61 |0 - \x89\x5A\x62 |0 - \x89\x5A\x63 |0 - \x89\x5A\x64 |0 - \x89\x5A\x65 |0 - \x89\x5A\x67 |0 - \x89\x5A\x69 |0 - \x89\x5A\x6B |0 - \x89\x5A\x70 |0 \x87\x38\x72 |0 \x85\x5B\x7E |0 \x87\x38\x7C |0 \x87\x38\x71 |0 - \x89\x55\x4E |0 - \x89\x5A\x6C |0 - \x89\x5A\x6F |0 - \x89\x55\x47 |0 - \x89\x55\x4D |0 - \x89\x5A\x5E |0 \x87\x2F\x35 |0 \x85\x62\x3F |0 \x85\x62\x46 |0 @@ -35933,32 +32815,11 @@ CHARMAP \x87\x40\x42 |0 \x87\x47\x5F |0 \x85\x62\x4D |0 - \x89\x5F\x33 |0 - \x89\x5F\x35 |0 - \x89\x5F\x36 |0 - \x89\x5F\x37 |0 - \x89\x5F\x39 |0 - \x89\x5F\x3A |0 - \x89\x5F\x3B |0 - \x89\x5F\x3C |0 - \x89\x5F\x3D |0 - \x89\x5F\x3E |0 - \x89\x5F\x3F |0 - \x89\x5F\x40 |0 - \x89\x5F\x41 |0 - \x89\x5F\x42 |0 - \x89\x5F\x43 |0 - \x89\x62\x64 |0 - \x89\x62\x65 |0 - \x89\x62\x6C |0 \x87\x47\x5E |0 \x87\x40\x3D |0 \x87\x40\x39 |0 \x87\x40\x43 |0 \x87\x40\x3B |0 - \x89\x5F\x34 |0 - \x89\x5A\x6A |0 - \x89\x5A\x6E |0 \x85\x62\x48 |0 \x87\x47\x65 |0 \x87\x47\x5C |0 @@ -35977,16 +32838,6 @@ CHARMAP \x87\x47\x5D |0 \x85\x6C\x45 |0 \x87\x47\x61 |0 - \x89\x62\x66 |0 - \x89\x62\x67 |0 - \x89\x62\x68 |0 - \x89\x62\x69 |0 - \x89\x62\x6A |0 - \x89\x62\x6D |0 - \x89\x62\x6E |0 - \x89\x62\x6F |0 - \x89\x62\x70 |0 - \x89\x62\x71 |0 \x87\x47\x57 |0 \x87\x47\x60 |0 \x87\x47\x66 |0 @@ -36012,9 +32863,6 @@ CHARMAP \x85\x6C\x49 |0 \x85\x6C\x4C |0 \x87\x4E\x2F |0 - \x89\x65\x42 |0 - \x89\x65\x43 |0 - \x89\x65\x44 |0 \x87\x4E\x2C |0 \x84\x66\x48 |0 \x85\x70\x40 |0 @@ -36031,20 +32879,11 @@ CHARMAP \x85\x70\x41 |0 \x87\x53\x55 |0 \x87\x53\x5A |0 - \x89\x67\x68 |0 - \x89\x67\x69 |0 - \x89\x67\x6A |0 - \x89\x67\x6B |0 - \x89\x67\x6D |0 - \x89\x67\x6E |0 - \x89\x67\x6F |0 \x87\x53\x5B |0 \x87\x53\x5C |0 \x87\x53\x5D |0 \x87\x53\x5E |0 \x85\x70\x3A |0 - \x89\x67\x70 |0 - \x89\x69\x55 |0 \x87\x58\x2E |0 \x87\x53\x57 |0 \x87\x58\x2F |0 @@ -36055,8 +32894,6 @@ CHARMAP \x87\x58\x31 |0 \x84\x68\x72 |0 \x87\x58\x32 |0 - \x89\x69\x53 |0 - \x89\x69\x54 |0 \x87\x58\x33 |0 \x87\x58\x30 |0 \x87\x58\x2C |0 @@ -36067,9 +32904,6 @@ CHARMAP \x85\x75\x7E |0 \x87\x5B\x67 |0 \x85\x75\x7D |0 - \x89\x6A\x5B |0 - \x89\x6A\x5C |0 - \x89\x6A\x5D |0 \x87\x5B\x6A |0 \x87\x5B\x66 |0 \x87\x5E\x76 |0 @@ -36083,7 +32917,6 @@ CHARMAP \x87\x60\x79 |0 \x87\x60\x78 |0 \x87\x60\x77 |0 - \x89\x6C\x2F |0 \x87\x62\x39 |0 \x84\x6D\x58 |0 \x85\x7A\x2B |0 @@ -36095,7 +32928,6 @@ CHARMAP \x87\x63\x57 |0 \x87\x64\x4B |0 \x85\x7B\x41 |0 - \x89\x6D\x26 |0 \x87\x65\x5C |0 \x85\x7C\x3C |0 \x86\x23\x2F |0 @@ -36103,9 +32935,6 @@ CHARMAP \x84\x23\x24 |0 \x84\x23\x25 |0 \x86\x25\x32 |0 - \x89\x22\x5F |0 - \x89\x22\x60 |0 - \x89\x22\x61 |0 \x86\x25\x34 |0 \x84\x24\x53 |0 \x84\x24\x54 |0 @@ -36113,25 +32942,11 @@ CHARMAP \x86\x28\x4C |0 \x85\x24\x55 |0 \x85\x24\x57 |0 - \x89\x24\x6B |0 - \x89\x24\x6C |0 - \x89\x24\x6D |0 - \x89\x24\x70 |0 - \x89\x24\x72 |0 \x86\x28\x4B |0 \x85\x26\x74 |0 \x84\x27\x28 |0 \x85\x26\x75 |0 - \x89\x27\x6F |0 - \x89\x27\x70 |0 - \x89\x27\x71 |0 - \x89\x27\x73 |0 - \x89\x27\x74 |0 - \x89\x27\x75 |0 - \x89\x27\x76 |0 - \x89\x27\x77 |0 \x86\x2C\x5F |0 - \x89\x27\x72 |0 \x86\x2C\x5E |0 \x84\x27\x2A |0 \x85\x24\x56 |0 @@ -36142,23 +32957,6 @@ CHARMAP \x85\x2A\x27 |0 \x86\x32\x4B |0 \x86\x32\x46 |0 - \x89\x2B\x6F |0 - \x89\x2B\x70 |0 - \x89\x2B\x71 |0 - \x89\x2B\x72 |0 - \x89\x2B\x73 |0 - \x89\x2B\x74 |0 - \x89\x2B\x75 |0 - \x89\x2B\x76 |0 - \x89\x2B\x77 |0 - \x89\x2B\x78 |0 - \x89\x2B\x79 |0 - \x89\x2B\x7B |0 - \x89\x2B\x7C |0 - \x89\x2B\x7D |0 - \x89\x2B\x7E |0 - \x89\x2C\x21 |0 - \x89\x2C\x23 |0 \x84\x2A\x29 |0 \x86\x32\x45 |0 \x86\x32\x43 |0 @@ -36166,43 +32964,20 @@ CHARMAP \x86\x39\x3A |0 \x85\x2A\x28 |0 \x86\x32\x4A |0 - \x89\x2C\x22 |0 \x86\x32\x49 |0 \x85\x2E\x4F |0 \x85\x2E\x4E |0 \x86\x39\x36 |0 \x86\x39\x39 |0 - \x89\x30\x6A |0 \x84\x32\x6F |0 \x86\x39\x37 |0 \x84\x2D\x74 |0 \x86\x39\x34 |0 \x85\x2E\x4B |0 - \x89\x30\x5D |0 - \x89\x30\x5E |0 - \x89\x30\x5F |0 - \x89\x30\x60 |0 - \x89\x30\x61 |0 - \x89\x30\x62 |0 - \x89\x30\x63 |0 - \x89\x30\x64 |0 - \x89\x30\x65 |0 - \x89\x30\x66 |0 - \x89\x30\x68 |0 - \x89\x30\x69 |0 - \x89\x30\x6B |0 - \x89\x30\x6C |0 - \x89\x30\x6E |0 - \x89\x30\x6F |0 - \x89\x30\x70 |0 - \x89\x30\x71 |0 - \x89\x30\x72 |0 \x85\x2E\x4C |0 \x86\x39\x35 |0 \x86\x39\x3B |0 \x86\x39\x3C |0 - \x89\x30\x67 |0 - \x89\x30\x6D |0 \x86\x39\x38 |0 \x85\x2E\x4D |0 \x86\x41\x4B |0 @@ -36220,25 +32995,8 @@ CHARMAP \x86\x41\x52 |0 \x86\x41\x50 |0 \x86\x41\x53 |0 - \x89\x36\x24 |0 - \x89\x36\x3E |0 - \x89\x36\x3F |0 - \x89\x36\x40 |0 - \x89\x36\x41 |0 - \x89\x36\x43 |0 - \x89\x36\x44 |0 - \x89\x36\x45 |0 - \x89\x36\x46 |0 - \x89\x36\x47 |0 - \x89\x36\x49 |0 - \x89\x36\x4A |0 - \x89\x36\x4C |0 - \x89\x36\x4D |0 - \x89\x36\x4E |0 - \x89\x36\x50 |0 \x86\x41\x49 |0 \x86\x41\x48 |0 - \x89\x36\x4B |0 \x85\x33\x43 |0 \x85\x33\x45 |0 \x86\x41\x55 |0 @@ -36258,39 +33016,11 @@ CHARMAP \x84\x38\x63 |0 \x85\x39\x70 |0 \x86\x4A\x77 |0 - \x89\x3C\x5E |0 - \x89\x3C\x5F |0 - \x89\x3C\x60 |0 - \x89\x3C\x61 |0 - \x89\x3C\x62 |0 - \x89\x3C\x63 |0 - \x89\x3C\x64 |0 - \x89\x3C\x66 |0 - \x89\x3C\x67 |0 - \x89\x3C\x68 |0 - \x89\x3C\x69 |0 - \x89\x3C\x6B |0 - \x89\x3C\x6C |0 - \x89\x3C\x6D |0 - \x89\x3C\x6E |0 - \x89\x3C\x6F |0 - \x89\x3C\x70 |0 - \x89\x3C\x71 |0 - \x89\x3C\x72 |0 - \x89\x3C\x75 |0 - \x89\x3C\x77 |0 - \x89\x3C\x78 |0 - \x89\x3C\x79 |0 - \x89\x3C\x7A |0 - \x89\x3C\x7B |0 - \x89\x3C\x7C |0 - \x89\x3D\x21 |0 \x86\x4A\x79 |0 \x86\x4A\x7C |0 \x84\x38\x67 |0 \x86\x4A\x76 |0 \x86\x4A\x7B |0 - \x89\x3C\x6A |0 \x85\x39\x72 |0 \x85\x40\x34 |0 \x86\x54\x5A |0 @@ -36312,35 +33042,6 @@ CHARMAP \x85\x40\x35 |0 \x86\x54\x5C |0 \x86\x54\x62 |0 - \x89\x42\x76 |0 - \x89\x42\x79 |0 - \x89\x42\x7B |0 - \x89\x42\x7C |0 - \x89\x42\x7D |0 - \x89\x43\x21 |0 - \x89\x43\x22 |0 - \x89\x43\x23 |0 - \x89\x43\x25 |0 - \x89\x43\x26 |0 - \x89\x43\x27 |0 - \x89\x43\x28 |0 - \x89\x43\x29 |0 - \x89\x43\x2A |0 - \x89\x43\x2B |0 - \x89\x43\x2D |0 - \x89\x43\x2E |0 - \x89\x43\x30 |0 - \x89\x43\x33 |0 - \x89\x43\x34 |0 - \x89\x43\x35 |0 - \x89\x43\x36 |0 - \x89\x43\x37 |0 - \x89\x43\x38 |0 - \x89\x43\x39 |0 - \x89\x43\x3A |0 - \x89\x43\x3B |0 - \x89\x43\x3D |0 - \x89\x43\x3E |0 \x86\x54\x51 |0 \x86\x54\x52 |0 \x86\x54\x55 |0 @@ -36349,10 +33050,8 @@ CHARMAP \x86\x54\x61 |0 \x86\x54\x65 |0 \x86\x5A\x54 |0 - \x89\x43\x2C |0 \x85\x40\x33 |0 \x85\x40\x31 |0 - \x89\x49\x54 |0 \x86\x5E\x51 |0 \x86\x5E\x50 |0 \x85\x46\x7E |0 @@ -36371,41 +33070,13 @@ CHARMAP \x85\x46\x79 |0 \x86\x5E\x4B |0 \x86\x5E\x4F |0 - \x89\x49\x44 |0 - \x89\x49\x45 |0 - \x89\x49\x46 |0 - \x89\x49\x47 |0 - \x89\x49\x49 |0 - \x89\x49\x4A |0 - \x89\x49\x4C |0 - \x89\x49\x4D |0 - \x89\x49\x4E |0 - \x89\x49\x4F |0 - \x89\x49\x50 |0 - \x89\x49\x51 |0 - \x89\x49\x52 |0 - \x89\x49\x53 |0 - \x89\x49\x55 |0 - \x89\x49\x56 |0 - \x89\x49\x57 |0 - \x89\x49\x5A |0 - \x89\x49\x5B |0 - \x89\x49\x5D |0 - \x89\x49\x5E |0 - \x89\x49\x60 |0 - \x89\x49\x62 |0 - \x89\x49\x63 |0 - \x89\x49\x64 |0 \x84\x44\x5D |0 \x85\x46\x7D |0 \x86\x5E\x4C |0 \x86\x5E\x52 |0 \x86\x5E\x49 |0 \x86\x5E\x4D |0 - \x89\x49\x5C |0 \x86\x54\x60 |0 - \x89\x42\x7E |0 - \x89\x42\x7A |0 \x84\x4A\x6B |0 \x85\x4E\x2C |0 \x87\x24\x74 |0 @@ -36418,37 +33089,10 @@ CHARMAP \x87\x24\x75 |0 \x87\x24\x6B |0 \x85\x4E\x29 |0 - \x89\x4E\x22 |0 \x85\x4E\x2B |0 \x87\x24\x73 |0 - \x89\x50\x23 |0 - \x89\x50\x24 |0 - \x89\x50\x26 |0 - \x89\x50\x27 |0 - \x89\x50\x28 |0 - \x89\x50\x29 |0 - \x89\x50\x2A |0 - \x89\x50\x2B |0 - \x89\x50\x2E |0 - \x89\x50\x2F |0 - \x89\x50\x31 |0 - \x89\x50\x32 |0 - \x89\x50\x33 |0 - \x89\x50\x34 |0 - \x89\x50\x35 |0 - \x89\x50\x37 |0 - \x89\x50\x38 |0 - \x89\x50\x39 |0 - \x89\x50\x3A |0 - \x89\x50\x3B |0 - \x89\x50\x3C |0 \x87\x24\x6E |0 - \x89\x50\x2C |0 \x87\x2A\x71 |0 - \x89\x50\x2D |0 - \x89\x50\x30 |0 - \x89\x50\x25 |0 - \x89\x50\x22 |0 \x85\x4E\x2E |0 \x85\x4E\x2D |0 \x86\x5E\x4E |0 @@ -36482,28 +33126,6 @@ CHARMAP \x87\x2F\x4B |0 \x87\x2F\x53 |0 \x87\x2F\x5C |0 - \x89\x55\x59 |0 - \x89\x55\x5A |0 - \x89\x55\x5B |0 - \x89\x55\x5C |0 - \x89\x55\x5D |0 - \x89\x55\x5E |0 - \x89\x55\x5F |0 - \x89\x55\x60 |0 - \x89\x55\x61 |0 - \x89\x55\x62 |0 - \x89\x55\x63 |0 - \x89\x55\x66 |0 - \x89\x55\x67 |0 - \x89\x55\x68 |0 - \x89\x55\x6A |0 - \x89\x55\x6B |0 - \x89\x55\x6D |0 - \x89\x55\x6E |0 - \x89\x55\x70 |0 - \x89\x55\x71 |0 - \x89\x55\x72 |0 - \x89\x55\x65 |0 \x85\x55\x38 |0 \x87\x2F\x4D |0 \x87\x2F\x4E |0 @@ -36512,7 +33134,6 @@ CHARMAP \x87\x31\x7A |0 \x87\x2F\x51 |0 \x87\x2C\x7B |0 - \x89\x55\x6F |0 \x85\x55\x3D |0 \x85\x55\x39 |0 \x87\x2F\x4C |0 @@ -36530,26 +33151,11 @@ CHARMAP \x87\x38\x7D |0 \x85\x5C\x24 |0 \x85\x5C\x22 |0 - \x89\x5A\x71 |0 - \x89\x5A\x72 |0 - \x89\x5A\x76 |0 - \x89\x5A\x77 |0 - \x89\x5A\x78 |0 - \x89\x5A\x79 |0 - \x89\x5A\x7A |0 - \x89\x5A\x7B |0 - \x89\x5A\x7C |0 - \x89\x5A\x7D |0 - \x89\x5A\x7E |0 - \x89\x5B\x21 |0 - \x89\x5B\x22 |0 - \x89\x5B\x23 |0 \x87\x38\x7E |0 \x87\x39\x24 |0 \x87\x39\x22 |0 \x85\x5C\x23 |0 \x87\x39\x21 |0 - \x89\x55\x69 |0 \x87\x40\x4F |0 \x84\x5B\x62 |0 \x87\x40\x4E |0 @@ -36565,40 +33171,22 @@ CHARMAP \x87\x40\x54 |0 \x87\x40\x4A |0 \x87\x40\x52 |0 - \x89\x5F\x44 |0 - \x89\x5F\x46 |0 - \x89\x5F\x45 |0 - \x89\x5F\x47 |0 - \x89\x5F\x48 |0 - \x89\x5F\x49 |0 - \x89\x5F\x4A |0 - \x89\x5F\x4C |0 - \x89\x5F\x4D |0 \x87\x40\x50 |0 \x87\x42\x22 |0 \x87\x40\x55 |0 \x87\x40\x4D |0 \x87\x40\x49 |0 \x87\x39\x2A |0 - \x89\x61\x76 |0 - \x89\x5A\x74 |0 - \x89\x5A\x75 |0 \x87\x47\x6C |0 \x85\x68\x37 |0 \x84\x60\x21 |0 \x87\x47\x6D |0 \x84\x60\x22 |0 \x87\x47\x6A |0 - \x89\x62\x74 |0 - \x89\x62\x75 |0 - \x89\x62\x76 |0 - \x89\x62\x77 |0 \x87\x47\x69 |0 \x87\x47\x67 |0 \x87\x47\x6B |0 - \x89\x5F\x4B |0 \x87\x47\x68 |0 - \x89\x65\x45 |0 \x85\x6C\x4F |0 \x87\x4E\x30 |0 \x87\x4E\x33 |0 @@ -36615,15 +33203,7 @@ CHARMAP \x87\x4E\x31 |0 \x87\x4E\x35 |0 \x87\x4E\x37 |0 - \x89\x65\x48 |0 \x87\x4E\x34 |0 - \x89\x65\x46 |0 - \x89\x65\x47 |0 - \x89\x65\x4A |0 - \x89\x65\x4B |0 - \x89\x65\x4C |0 - \x89\x65\x4D |0 - \x89\x65\x4E |0 \x87\x4E\x39 |0 \x87\x4E\x36 |0 \x87\x4E\x3A |0 @@ -36637,20 +33217,12 @@ CHARMAP \x87\x53\x62 |0 \x87\x53\x63 |0 \x87\x53\x65 |0 - \x89\x67\x71 |0 - \x89\x67\x72 |0 - \x89\x67\x73 |0 - \x89\x67\x74 |0 - \x89\x67\x75 |0 \x87\x58\x36 |0 \x85\x73\x56 |0 \x84\x6A\x4F |0 \x87\x58\x37 |0 \x87\x58\x38 |0 \x87\x58\x34 |0 - \x89\x69\x56 |0 - \x89\x69\x57 |0 - \x89\x69\x58 |0 \x87\x58\x35 |0 \x87\x5B\x24 |0 \x87\x5B\x6E |0 @@ -36661,9 +33233,7 @@ CHARMAP \x87\x5B\x6C |0 \x87\x5B\x6B |0 \x85\x76\x23 |0 - \x89\x6A\x60 |0 \x87\x5E\x78 |0 - \x89\x6A\x5F |0 \x85\x77\x68 |0 \x87\x61\x21 |0 \x87\x60\x7C |0 @@ -36673,8 +33243,6 @@ CHARMAP \x87\x60\x7D |0 \x87\x62\x3A |0 \x85\x7A\x6B |0 - \x89\x6C\x64 |0 - \x89\x6C\x65 |0 \x87\x64\x4D |0 \x87\x64\x4C |0 \x87\x64\x4E |0 @@ -36688,26 +33256,19 @@ CHARMAP \x86\x2C\x62 |0 \x86\x2C\x61 |0 \x86\x2C\x63 |0 - \x89\x27\x78 |0 - \x89\x27\x79 |0 \x86\x32\x4E |0 \x85\x2A\x2B |0 \x85\x2A\x29 |0 \x86\x32\x4F |0 \x85\x2A\x2A |0 \x86\x32\x51 |0 - \x89\x2C\x24 |0 - \x89\x2C\x25 |0 - \x89\x2C\x26 |0 \x86\x32\x4D |0 \x86\x32\x50 |0 \x85\x2E\x51 |0 \x85\x2E\x50 |0 - \x89\x30\x73 |0 \x86\x41\x57 |0 \x86\x41\x56 |0 \x86\x41\x58 |0 - \x89\x36\x51 |0 \x84\x38\x6A |0 \x86\x4B\x22 |0 \x86\x47\x43 |0 @@ -36728,37 +33289,24 @@ CHARMAP \x87\x2F\x6A |0 \x85\x55\x3F |0 \x84\x56\x65 |0 - \x89\x5B\x24 |0 - \x89\x5B\x25 |0 - \x89\x5B\x26 |0 - \x89\x55\x73 |0 \x87\x40\x56 |0 \x85\x68\x38 |0 - \x89\x65\x4F |0 - \x89\x65\x50 |0 \x87\x4E\x3D |0 \x87\x53\x68 |0 \x87\x5B\x71 |0 \x87\x5E\x79 |0 \x87\x61\x22 |0 - \x89\x24\x73 |0 - \x89\x24\x74 |0 \x86\x2C\x64 |0 \x86\x2C\x65 |0 \x86\x41\x59 |0 \x86\x41\x5A |0 - \x89\x3D\x22 |0 - \x89\x3D\x23 |0 \x86\x54\x6A |0 - \x89\x49\x65 |0 \x85\x47\x24 |0 \x85\x55\x40 |0 - \x89\x21\x68 |0 \x86\x2B\x6B |0 \x85\x2A\x2C |0 \x84\x2A\x2B |0 \x84\x2D\x77 |0 - \x89\x30\x74 |0 \x85\x31\x6C |0 \x86\x4B\x23 |0 \x86\x54\x6C |0 @@ -36780,15 +33328,12 @@ CHARMAP \x86\x32\x54 |0 \x86\x39\x3E |0 \x84\x2D\x78 |0 - \x89\x30\x75 |0 \x86\x39\x3D |0 \x86\x41\x5B |0 \x86\x41\x5E |0 \x86\x41\x5D |0 \x84\x32\x78 |0 \x86\x41\x5C |0 - \x89\x36\x52 |0 - \x89\x36\x53 |0 \x86\x4B\x28 |0 \x86\x4B\x24 |0 \x86\x4B\x26 |0 @@ -36798,12 +33343,9 @@ CHARMAP \x86\x4D\x58 |0 \x86\x54\x6D |0 \x86\x54\x6E |0 - \x89\x43\x3F |0 \x86\x5E\x58 |0 \x86\x5E\x59 |0 - \x89\x49\x66 |0 \x87\x24\x7D |0 - \x89\x50\x3E |0 \x87\x24\x7E |0 \x85\x55\x43 |0 \x85\x62\x51 |0 @@ -36821,7 +33363,6 @@ CHARMAP \x87\x63\x58 |0 \x85\x7B\x42 |0 \x87\x64\x4F |0 - \x89\x21\x69 |0 \x86\x28\x51 |0 \x85\x24\x59 |0 \x86\x28\x50 |0 @@ -36862,12 +33403,10 @@ CHARMAP \x85\x40\x36 |0 \x85\x40\x37 |0 \x86\x54\x70 |0 - \x89\x3D\x24 |0 \x85\x47\x25 |0 \x86\x5E\x5B |0 \x86\x5E\x5C |0 \x86\x5E\x5A |0 - \x89\x49\x67 |0 \x85\x4E\x32 |0 \x87\x25\x25 |0 \x85\x4E\x31 |0 @@ -36885,8 +33424,6 @@ CHARMAP \x87\x2F\x6C |0 \x85\x5C\x26 |0 \x84\x56\x66 |0 - \x89\x5B\x27 |0 - \x89\x5B\x28 |0 \x85\x62\x53 |0 \x85\x62\x52 |0 \x85\x6C\x53 |0 @@ -36896,16 +33433,11 @@ CHARMAP \x86\x39\x42 |0 \x84\x38\x6F |0 \x86\x4B\x2F |0 - \x89\x3D\x25 |0 - \x89\x3D\x26 |0 \x86\x54\x71 |0 \x86\x5E\x5D |0 \x85\x21\x75 |0 - \x89\x22\x63 |0 \x86\x25\x36 |0 - \x89\x22\x62 |0 \x86\x28\x53 |0 - \x89\x24\x75 |0 \x86\x28\x52 |0 \x86\x28\x54 |0 \x85\x26\x79 |0 @@ -36922,10 +33454,6 @@ CHARMAP \x85\x27\x23 |0 \x85\x26\x7C |0 \x86\x2C\x6D |0 - \x89\x27\x7B |0 - \x89\x27\x7C |0 - \x89\x27\x7E |0 - \x89\x28\x21 |0 \x85\x26\x7A |0 \x86\x2C\x6F |0 \x86\x2C\x70 |0 @@ -36939,14 +33467,11 @@ CHARMAP \x84\x2A\x30 |0 \x86\x32\x5A |0 \x86\x32\x59 |0 - \x89\x2C\x28 |0 - \x89\x2C\x29 |0 \x86\x32\x5B |0 \x86\x32\x5E |0 \x86\x32\x58 |0 \x86\x32\x5D |0 \x85\x2A\x34 |0 - \x89\x27\x7D |0 \x85\x2E\x58 |0 \x85\x2E\x54 |0 \x85\x2E\x56 |0 @@ -36963,8 +33488,6 @@ CHARMAP \x84\x32\x7C |0 \x85\x33\x4B |0 \x85\x33\x4C |0 - \x89\x36\x54 |0 - \x89\x36\x55 |0 \x86\x41\x65 |0 \x86\x41\x69 |0 \x86\x41\x64 |0 @@ -36978,15 +33501,12 @@ CHARMAP \x85\x39\x78 |0 \x86\x4B\x32 |0 \x86\x4B\x35 |0 - \x89\x3D\x27 |0 - \x89\x3D\x28 |0 \x86\x4B\x33 |0 \x86\x4B\x30 |0 \x86\x4B\x31 |0 \x85\x39\x7A |0 \x85\x39\x7C |0 \x85\x33\x4A |0 - \x89\x3D\x29 |0 \x86\x4B\x36 |0 \x85\x47\x2B |0 \x85\x40\x3E |0 @@ -36998,8 +33518,6 @@ CHARMAP \x86\x54\x72 |0 \x86\x54\x75 |0 \x86\x54\x74 |0 - \x89\x43\x40 |0 - \x89\x43\x41 |0 \x85\x40\x3D |0 \x86\x54\x77 |0 \x85\x40\x3B |0 @@ -37017,16 +33535,11 @@ CHARMAP \x86\x5E\x61 |0 \x85\x40\x3A |0 \x86\x5E\x66 |0 - \x89\x49\x68 |0 - \x89\x49\x69 |0 - \x89\x49\x6A |0 - \x89\x49\x6B |0 \x85\x47\x2F |0 \x85\x47\x29 |0 \x86\x5E\x60 |0 \x86\x54\x76 |0 \x86\x5E\x65 |0 - \x89\x49\x6C |0 \x85\x47\x30 |0 \x85\x4E\x36 |0 \x87\x25\x26 |0 @@ -37036,7 +33549,6 @@ CHARMAP \x85\x4E\x38 |0 \x84\x4A\x70 |0 \x85\x4E\x35 |0 - \x89\x50\x3F |0 \x87\x25\x28 |0 \x87\x25\x27 |0 \x87\x2F\x70 |0 @@ -37078,9 +33590,7 @@ CHARMAP \x87\x5B\x73 |0 \x85\x77\x69 |0 \x87\x61\x23 |0 - \x89\x6C\x31 |0 \x87\x64\x50 |0 - \x89\x21\x3D |0 \x86\x23\x32 |0 \x85\x21\x77 |0 \x85\x21\x78 |0 @@ -37109,7 +33619,6 @@ CHARMAP \x86\x28\x5A |0 \x86\x28\x59 |0 \x86\x2C\x73 |0 - \x89\x24\x77 |0 \x86\x28\x57 |0 \x86\x28\x5C |0 \x86\x28\x5D |0 @@ -37135,7 +33644,6 @@ CHARMAP \x86\x32\x60 |0 \x85\x27\x2B |0 \x86\x2C\x76 |0 - \x89\x28\x22 |0 \x86\x2C\x7D |0 \x86\x2C\x74 |0 \x84\x27\x35 |0 @@ -37160,11 +33668,7 @@ CHARMAP \x85\x27\x26 |0 \x85\x2A\x37 |0 \x85\x2A\x38 |0 - \x89\x2C\x2A |0 - \x89\x2C\x2C |0 - \x89\x2C\x2D |0 \x86\x32\x65 |0 - \x89\x2C\x2B |0 \x85\x2A\x3F |0 \x86\x39\x4E |0 \x85\x2E\x5E |0 @@ -37178,8 +33682,6 @@ CHARMAP \x84\x2E\x23 |0 \x86\x39\x45 |0 \x86\x39\x4A |0 - \x89\x30\x77 |0 - \x89\x30\x78 |0 \x86\x39\x48 |0 \x85\x2E\x5A |0 \x84\x2E\x24 |0 @@ -37188,7 +33690,6 @@ CHARMAP \x85\x2E\x5F |0 \x86\x39\x46 |0 \x85\x33\x4E |0 - \x89\x30\x76 |0 \x84\x33\x24 |0 \x86\x41\x6E |0 \x85\x33\x55 |0 @@ -37228,8 +33729,6 @@ CHARMAP \x86\x4B\x3C |0 \x86\x4B\x3E |0 \x84\x3E\x57 |0 - \x89\x3D\x2A |0 - \x89\x3D\x2B |0 \x86\x54\x79 |0 \x86\x52\x72 |0 \x86\x54\x7A |0 @@ -37238,7 +33737,6 @@ CHARMAP \x86\x4B\x45 |0 \x86\x4B\x3D |0 \x85\x3A\x23 |0 - \x89\x43\x43 |0 \x84\x3E\x56 |0 \x85\x40\x48 |0 \x86\x55\x22 |0 @@ -37261,10 +33759,6 @@ CHARMAP \x84\x3E\x58 |0 \x85\x40\x49 |0 \x86\x55\x25 |0 - \x89\x43\x45 |0 - \x89\x43\x46 |0 - \x89\x49\x70 |0 - \x89\x50\x40 |0 \x85\x40\x45 |0 \x86\x55\x23 |0 \x85\x40\x4C |0 @@ -37283,9 +33777,7 @@ CHARMAP \x86\x5E\x70 |0 \x84\x44\x6C |0 \x85\x47\x31 |0 - \x89\x49\x6D |0 \x87\x25\x2A |0 - \x89\x49\x6F |0 \x86\x5E\x6B |0 \x86\x5E\x68 |0 \x86\x5E\x6A |0 @@ -37320,11 +33812,9 @@ CHARMAP \x85\x4E\x46 |0 \x87\x25\x2C |0 \x87\x25\x2D |0 - \x89\x55\x75 |0 \x85\x55\x50 |0 \x87\x25\x2E |0 \x87\x25\x33 |0 - \x89\x49\x6E |0 \x84\x51\x33 |0 \x85\x4E\x42 |0 \x85\x55\x57 |0 @@ -37346,7 +33836,6 @@ CHARMAP \x87\x39\x31 |0 \x87\x2F\x76 |0 \x87\x25\x32 |0 - \x89\x55\x77 |0 \x87\x25\x35 |0 \x85\x55\x54 |0 \x85\x5C\x2A |0 @@ -37355,10 +33844,6 @@ CHARMAP \x87\x47\x77 |0 \x87\x39\x35 |0 \x87\x39\x34 |0 - \x89\x5B\x29 |0 - \x89\x5B\x2A |0 - \x89\x5B\x2B |0 - \x89\x5B\x2C |0 \x87\x40\x5D |0 \x85\x62\x55 |0 \x85\x62\x54 |0 @@ -37367,8 +33852,6 @@ CHARMAP \x87\x40\x5C |0 \x84\x5B\x68 |0 \x87\x40\x5B |0 - \x89\x5F\x4E |0 - \x89\x5F\x4F |0 \x85\x62\x56 |0 \x84\x63\x64 |0 \x87\x47\x78 |0 @@ -37389,10 +33872,8 @@ CHARMAP \x87\x5B\x77 |0 \x85\x77\x6A |0 \x87\x5E\x7A |0 - \x89\x6B\x55 |0 \x87\x61\x24 |0 \x87\x63\x59 |0 - \x89\x28\x23 |0 \x86\x4B\x46 |0 \x86\x5E\x72 |0 \x85\x21\x4C |0 @@ -37404,45 +33885,21 @@ CHARMAP \x84\x24\x5C |0 \x86\x28\x61 |0 \x86\x28\x60 |0 - \x89\x24\x79 |0 \x85\x24\x60 |0 \x85\x27\x30 |0 \x86\x2D\x25 |0 \x84\x27\x3C |0 \x85\x2A\x41 |0 - \x89\x28\x25 |0 - \x89\x28\x26 |0 - \x89\x28\x27 |0 - \x89\x28\x28 |0 - \x89\x28\x29 |0 \x86\x2D\x23 |0 - \x89\x2C\x40 |0 - \x89\x28\x24 |0 \x86\x2D\x22 |0 - \x89\x2C\x3C |0 \x86\x32\x69 |0 \x85\x2A\x45 |0 \x85\x2A\x42 |0 \x84\x2A\x36 |0 \x86\x32\x6B |0 \x86\x2F\x69 |0 - \x89\x2C\x2F |0 - \x89\x2C\x30 |0 - \x89\x2C\x31 |0 - \x89\x2C\x33 |0 - \x89\x2C\x34 |0 - \x89\x2C\x35 |0 - \x89\x2C\x36 |0 - \x89\x2C\x37 |0 - \x89\x2C\x38 |0 - \x89\x2C\x3A |0 - \x89\x2C\x3B |0 - \x89\x2C\x3D |0 \x86\x32\x6A |0 \x86\x32\x6C |0 - \x89\x2C\x3E |0 - \x89\x2C\x3F |0 - \x89\x2C\x2E |0 \x85\x2A\x44 |0 \x85\x2A\x43 |0 \x86\x39\x53 |0 @@ -37453,19 +33910,7 @@ CHARMAP \x84\x2E\x28 |0 \x86\x39\x52 |0 \x86\x39\x54 |0 - \x89\x30\x79 |0 - \x89\x30\x7A |0 - \x89\x30\x7B |0 - \x89\x30\x7C |0 - \x89\x30\x7D |0 - \x89\x30\x7E |0 - \x89\x31\x21 |0 - \x89\x31\x23 |0 - \x89\x31\x24 |0 - \x89\x31\x25 |0 - \x89\x31\x26 |0 \x86\x39\x50 |0 - \x89\x36\x63 |0 \x84\x33\x31 |0 \x86\x39\x55 |0 \x86\x41\x7A |0 @@ -37475,24 +33920,9 @@ CHARMAP \x86\x41\x77 |0 \x86\x41\x78 |0 \x86\x41\x79 |0 - \x89\x31\x22 |0 - \x89\x36\x56 |0 - \x89\x36\x58 |0 - \x89\x36\x5C |0 - \x89\x36\x5F |0 - \x89\x36\x60 |0 - \x89\x36\x61 |0 - \x89\x36\x62 |0 - \x89\x36\x64 |0 - \x89\x36\x5D |0 \x86\x41\x7C |0 - \x89\x36\x5B |0 - \x89\x36\x5A |0 - \x89\x36\x5E |0 \x85\x33\x58 |0 \x86\x41\x76 |0 - \x89\x3D\x3E |0 - \x89\x3D\x34 |0 \x86\x4B\x4B |0 \x85\x3A\x2B |0 \x85\x3A\x2A |0 @@ -37500,33 +33930,15 @@ CHARMAP \x86\x55\x29 |0 \x84\x3E\x5A |0 \x85\x40\x4D |0 - \x89\x3D\x38 |0 \x84\x38\x7C |0 \x86\x4B\x49 |0 \x86\x4B\x4C |0 - \x89\x3D\x2C |0 - \x89\x3D\x2D |0 - \x89\x3D\x2E |0 - \x89\x3D\x2F |0 - \x89\x3D\x30 |0 - \x89\x3D\x32 |0 - \x89\x3D\x35 |0 - \x89\x3D\x36 |0 - \x89\x3D\x37 |0 - \x89\x3D\x39 |0 - \x89\x3D\x3A |0 - \x89\x3D\x3F |0 - \x89\x43\x50 |0 \x86\x4B\x4E |0 \x86\x55\x32 |0 \x86\x4B\x4D |0 - \x89\x3D\x40 |0 \x86\x4B\x48 |0 \x86\x4B\x4A |0 \x86\x55\x2A |0 - \x89\x3D\x33 |0 - \x89\x3D\x3D |0 - \x89\x3D\x31 |0 \x85\x3A\x29 |0 \x86\x55\x2B |0 \x86\x55\x30 |0 @@ -37535,41 +33947,11 @@ CHARMAP \x86\x55\x2F |0 \x86\x55\x2E |0 \x85\x47\x3E |0 - \x89\x43\x47 |0 - \x89\x43\x4A |0 - \x89\x43\x4C |0 - \x89\x43\x4D |0 - \x89\x43\x4E |0 - \x89\x43\x4F |0 - \x89\x43\x51 |0 - \x89\x43\x52 |0 - \x89\x43\x53 |0 - \x89\x43\x54 |0 - \x89\x43\x55 |0 - \x89\x43\x57 |0 - \x89\x43\x58 |0 - \x89\x43\x5A |0 - \x89\x43\x5B |0 - \x89\x43\x5C |0 - \x89\x43\x5D |0 - \x89\x43\x5E |0 - \x89\x43\x5F |0 - \x89\x43\x60 |0 - \x89\x43\x61 |0 - \x89\x43\x62 |0 - \x89\x43\x63 |0 - \x89\x43\x65 |0 \x86\x55\x2C |0 \x85\x40\x4F |0 \x85\x3A\x2E |0 - \x89\x43\x4B |0 - \x89\x43\x48 |0 \x85\x47\x3F |0 \x86\x55\x2D |0 - \x89\x43\x59 |0 - \x89\x49\x7A |0 - \x89\x49\x7B |0 - \x89\x4A\x26 |0 \x87\x25\x38 |0 \x86\x5E\x74 |0 \x85\x47\x41 |0 @@ -37580,28 +33962,9 @@ CHARMAP \x86\x5E\x77 |0 \x86\x5E\x76 |0 \x86\x5E\x73 |0 - \x89\x49\x71 |0 - \x89\x49\x72 |0 - \x89\x49\x73 |0 - \x89\x49\x74 |0 - \x89\x49\x75 |0 - \x89\x49\x77 |0 - \x89\x49\x78 |0 - \x89\x49\x79 |0 - \x89\x49\x7C |0 - \x89\x49\x7D |0 - \x89\x49\x7E |0 - \x89\x4A\x21 |0 - \x89\x4A\x22 |0 - \x89\x4A\x24 |0 - \x89\x4A\x25 |0 - \x89\x4A\x27 |0 - \x89\x4A\x28 |0 - \x89\x4A\x29 |0 \x85\x47\x42 |0 \x83\x48\x26 |0 \x87\x25\x39 |0 - \x89\x4A\x23 |0 \x87\x25\x40 |0 \x84\x4A\x7E |0 \x85\x4E\x47 |0 @@ -37612,24 +33975,10 @@ CHARMAP \x87\x25\x3F |0 \x87\x25\x41 |0 \x87\x25\x42 |0 - \x89\x50\x41 |0 - \x89\x50\x42 |0 - \x89\x50\x43 |0 - \x89\x50\x44 |0 - \x89\x50\x45 |0 - \x89\x50\x46 |0 - \x89\x50\x48 |0 - \x89\x50\x49 |0 - \x89\x50\x4A |0 - \x89\x50\x4B |0 - \x89\x50\x4C |0 \x87\x25\x3D |0 \x85\x4E\x48 |0 \x87\x25\x3B |0 \x85\x4E\x49 |0 - \x89\x55\x7C |0 - \x89\x56\x2E |0 - \x89\x50\x47 |0 \x87\x30\x22 |0 \x87\x25\x3E |0 \x85\x55\x58 |0 @@ -37642,27 +33991,11 @@ CHARMAP \x87\x2F\x7C |0 \x84\x51\x3C |0 \x87\x30\x21 |0 - \x89\x55\x78 |0 - \x89\x55\x79 |0 - \x89\x55\x7B |0 - \x89\x55\x7D |0 - \x89\x56\x23 |0 - \x89\x56\x24 |0 - \x89\x56\x25 |0 - \x89\x56\x26 |0 - \x89\x56\x27 |0 - \x89\x56\x29 |0 - \x89\x56\x2D |0 - \x89\x56\x2F |0 \x87\x30\x25 |0 \x87\x30\x23 |0 \x87\x39\x36 |0 - \x89\x56\x30 |0 - \x89\x56\x21 |0 - \x89\x56\x28 |0 \x85\x55\x5C |0 \x85\x55\x5A |0 - \x89\x56\x2C |0 \x87\x39\x3B |0 \x87\x39\x3D |0 \x85\x5C\x2D |0 @@ -37673,14 +34006,6 @@ CHARMAP \x84\x56\x6E |0 \x84\x56\x70 |0 \x87\x39\x38 |0 - \x89\x5B\x2E |0 - \x89\x5B\x2F |0 - \x89\x5B\x30 |0 - \x89\x5B\x31 |0 - \x89\x5B\x32 |0 - \x89\x5B\x33 |0 - \x89\x5B\x34 |0 - \x89\x5B\x35 |0 \x85\x5C\x2C |0 \x87\x39\x3A |0 \x87\x39\x3C |0 @@ -37692,22 +34017,8 @@ CHARMAP \x84\x60\x26 |0 \x87\x40\x60 |0 \x84\x60\x28 |0 - \x89\x5F\x51 |0 - \x89\x5F\x53 |0 - \x89\x5F\x54 |0 - \x89\x5F\x55 |0 - \x89\x5F\x57 |0 - \x89\x5F\x59 |0 - \x89\x5F\x5A |0 - \x89\x5F\x5B |0 - \x89\x5F\x5C |0 - \x89\x5F\x5F |0 \x87\x40\x61 |0 \x87\x40\x62 |0 - \x89\x5F\x50 |0 - \x89\x5F\x52 |0 - \x89\x5F\x58 |0 - \x89\x63\x23 |0 \x87\x47\x7C |0 \x87\x47\x7B |0 \x85\x68\x3E |0 @@ -37715,49 +34026,28 @@ CHARMAP \x87\x4E\x43 |0 \x85\x68\x3D |0 \x87\x47\x79 |0 - \x89\x62\x7C |0 - \x89\x62\x7E |0 - \x89\x63\x21 |0 - \x89\x63\x22 |0 \x84\x60\x29 |0 - \x89\x62\x79 |0 - \x89\x62\x7A |0 - \x89\x62\x7D |0 \x87\x53\x6F |0 \x85\x6C\x57 |0 \x84\x66\x52 |0 - \x89\x65\x52 |0 - \x89\x65\x53 |0 - \x89\x65\x54 |0 - \x89\x65\x55 |0 \x87\x4E\x44 |0 \x87\x53\x6E |0 - \x89\x5F\x5E |0 \x84\x66\x51 |0 \x87\x55\x7C |0 \x84\x66\x53 |0 \x87\x58\x3C |0 - \x89\x67\x76 |0 \x87\x5B\x79 |0 \x84\x6A\x52 |0 - \x89\x69\x59 |0 - \x89\x69\x5A |0 \x85\x76\x24 |0 - \x89\x6A\x61 |0 - \x89\x6A\x63 |0 - \x89\x6B\x56 |0 - \x89\x6A\x62 |0 \x85\x79\x31 |0 \x87\x61\x26 |0 \x87\x61\x25 |0 - \x89\x6C\x32 |0 \x85\x7A\x2C |0 \x84\x6E\x34 |0 \x86\x2D\x26 |0 \x85\x2A\x47 |0 \x85\x2A\x46 |0 \x86\x32\x6D |0 - \x89\x2C\x41 |0 \x86\x32\x6E |0 \x86\x39\x56 |0 \x85\x2E\x63 |0 @@ -37767,31 +34057,25 @@ CHARMAP \x84\x33\x36 |0 \x85\x33\x59 |0 \x85\x33\x5A |0 - \x89\x36\x65 |0 \x85\x3A\x2F |0 \x85\x3A\x30 |0 \x86\x4B\x4F |0 - \x89\x3D\x41 |0 \x86\x4B\x50 |0 \x84\x3E\x5C |0 \x85\x40\x50 |0 \x85\x40\x51 |0 - \x89\x43\x66 |0 \x87\x25\x45 |0 \x86\x5E\x78 |0 \x85\x47\x43 |0 - \x89\x4A\x2A |0 \x85\x47\x44 |0 \x87\x25\x44 |0 \x87\x30\x26 |0 \x84\x51\x3D |0 \x85\x4E\x4A |0 - \x89\x50\x4D |0 \x87\x25\x43 |0 \x84\x51\x3E |0 \x87\x39\x3E |0 \x85\x62\x58 |0 - \x89\x5F\x60 |0 \x84\x5B\x6D |0 \x84\x66\x54 |0 \x87\x53\x70 |0 @@ -37814,7 +34098,6 @@ CHARMAP \x85\x2E\x67 |0 \x86\x39\x5C |0 \x85\x2E\x66 |0 - \x89\x31\x29 |0 \x86\x39\x5B |0 \x86\x39\x59 |0 \x86\x39\x5A |0 @@ -37825,8 +34108,6 @@ CHARMAP \x85\x33\x5E |0 \x86\x42\x23 |0 \x85\x33\x5C |0 - \x89\x36\x66 |0 - \x89\x36\x68 |0 \x84\x39\x22 |0 \x85\x3A\x31 |0 \x86\x55\x36 |0 @@ -37848,7 +34129,6 @@ CHARMAP \x86\x55\x35 |0 \x84\x3E\x5F |0 \x86\x55\x38 |0 - \x89\x43\x67 |0 \x86\x55\x34 |0 \x85\x47\x47 |0 \x86\x5E\x7C |0 @@ -37908,9 +34188,7 @@ CHARMAP \x86\x2D\x28 |0 \x85\x27\x33 |0 \x84\x27\x3E |0 - \x89\x28\x2B |0 \x86\x32\x70 |0 - \x89\x2C\x43 |0 \x85\x40\x54 |0 \x86\x5E\x7D |0 \x87\x30\x2B |0 @@ -37924,8 +34202,6 @@ CHARMAP \x86\x2D\x29 |0 \x85\x27\x34 |0 \x86\x2D\x2A |0 - \x89\x2C\x44 |0 - \x89\x2C\x45 |0 \x85\x2A\x4A |0 \x84\x2A\x3F |0 \x86\x32\x71 |0 @@ -37935,37 +34211,23 @@ CHARMAP \x85\x33\x60 |0 \x86\x42\x25 |0 \x86\x42\x27 |0 - \x89\x36\x69 |0 \x86\x55\x39 |0 \x86\x4B\x54 |0 - \x89\x3D\x43 |0 - \x89\x3D\x42 |0 \x86\x55\x3B |0 - \x89\x43\x68 |0 \x86\x55\x3A |0 \x86\x5E\x7E |0 \x87\x25\x4B |0 - \x89\x4A\x2B |0 \x84\x56\x7A |0 - \x89\x5B\x36 |0 - \x89\x63\x26 |0 \x87\x46\x6E |0 - \x89\x63\x25 |0 \x87\x53\x74 |0 \x86\x25\x3A |0 - \x89\x24\x7A |0 \x85\x27\x35 |0 \x86\x2D\x2E |0 \x86\x39\x5D |0 \x85\x33\x61 |0 - \x89\x4A\x2C |0 - \x89\x5F\x61 |0 \x87\x47\x7D |0 - \x89\x6C\x33 |0 \x85\x73\x5B |0 \x84\x24\x5F |0 - \x89\x24\x7C |0 - \x89\x24\x7B |0 \x86\x28\x63 |0 \x84\x27\x42 |0 \x84\x25\x53 |0 @@ -37974,8 +34236,6 @@ CHARMAP \x86\x2D\x31 |0 \x86\x2D\x30 |0 \x86\x2D\x33 |0 - \x89\x28\x2C |0 - \x89\x28\x2D |0 \x86\x2D\x2F |0 \x84\x2A\x42 |0 \x85\x2A\x4D |0 @@ -37991,15 +34251,6 @@ CHARMAP \x86\x32\x78 |0 \x86\x32\x75 |0 \x85\x2E\x6E |0 - \x89\x2C\x46 |0 - \x89\x2C\x47 |0 - \x89\x2C\x48 |0 - \x89\x2C\x49 |0 - \x89\x2C\x4B |0 - \x89\x2C\x4C |0 - \x89\x2C\x4D |0 - \x89\x2C\x4E |0 - \x89\x2C\x4F |0 \x85\x2A\x4F |0 \x85\x2E\x6A |0 \x84\x2E\x2E |0 @@ -38009,12 +34260,7 @@ CHARMAP \x86\x39\x62 |0 \x86\x39\x5F |0 \x86\x39\x63 |0 - \x89\x31\x2A |0 - \x89\x31\x2B |0 - \x89\x31\x2C |0 - \x89\x31\x2E |0 \x84\x2E\x30 |0 - \x89\x31\x2D |0 \x85\x2E\x6D |0 \x85\x2E\x6C |0 \x84\x33\x3E |0 @@ -38027,8 +34273,6 @@ CHARMAP \x86\x42\x2A |0 \x86\x42\x2D |0 \x86\x42\x2E |0 - \x89\x36\x6B |0 - \x89\x36\x6C |0 \x86\x42\x2B |0 \x86\x42\x29 |0 \x86\x41\x6B |0 @@ -38037,15 +34281,9 @@ CHARMAP \x84\x39\x2A |0 \x86\x4B\x57 |0 \x86\x4B\x59 |0 - \x89\x36\x6A |0 - \x89\x3D\x46 |0 - \x89\x3D\x47 |0 - \x89\x3D\x48 |0 \x86\x4B\x58 |0 \x84\x39\x2D |0 \x86\x4B\x55 |0 - \x89\x3D\x44 |0 - \x89\x3D\x45 |0 \x86\x55\x40 |0 \x84\x3E\x6A |0 \x84\x3E\x67 |0 @@ -38059,8 +34297,6 @@ CHARMAP \x86\x55\x43 |0 \x86\x55\x44 |0 \x86\x55\x41 |0 - \x89\x43\x69 |0 - \x89\x43\x6A |0 \x85\x40\x57 |0 \x86\x55\x3D |0 \x86\x5F\x23 |0 @@ -38069,7 +34305,6 @@ CHARMAP \x86\x5F\x22 |0 \x86\x5F\x25 |0 \x86\x5F\x28 |0 - \x89\x4A\x2D |0 \x86\x5F\x26 |0 \x86\x5F\x24 |0 \x86\x5F\x27 |0 @@ -38081,14 +34316,12 @@ CHARMAP \x87\x25\x4F |0 \x85\x4E\x4F |0 \x87\x25\x51 |0 - \x89\x50\x4F |0 \x84\x4B\x2B |0 \x84\x51\x45 |0 \x84\x51\x43 |0 \x84\x51\x46 |0 \x87\x30\x2C |0 \x85\x55\x62 |0 - \x89\x56\x32 |0 \x87\x2C\x3B |0 \x87\x39\x41 |0 \x85\x5C\x33 |0 @@ -38097,11 +34330,9 @@ CHARMAP \x84\x56\x7B |0 \x87\x39\x42 |0 \x85\x5C\x34 |0 - \x89\x5B\x37 |0 \x87\x3C\x76 |0 \x85\x5C\x30 |0 \x85\x5C\x32 |0 - \x89\x56\x31 |0 \x84\x5B\x71 |0 \x87\x47\x7E |0 \x85\x68\x41 |0 @@ -38114,15 +34345,12 @@ CHARMAP \x87\x4E\x48 |0 \x87\x4E\x47 |0 \x87\x53\x77 |0 - \x89\x67\x77 |0 \x87\x53\x75 |0 \x87\x53\x76 |0 - \x89\x67\x52 |0 \x87\x58\x3E |0 \x84\x68\x77 |0 \x87\x53\x78 |0 \x87\x5B\x7D |0 - \x89\x6A\x64 |0 \x87\x5B\x7C |0 \x87\x5E\x7C |0 \x87\x62\x3E |0 @@ -38135,7 +34363,6 @@ CHARMAP \x87\x66\x46 |0 \x86\x23\x36 |0 \x86\x25\x3B |0 - \x89\x28\x2E |0 \x84\x2E\x32 |0 \x85\x2A\x50 |0 \x84\x39\x2E |0 @@ -38157,7 +34384,6 @@ CHARMAP \x84\x27\x45 |0 \x86\x2D\x35 |0 \x84\x27\x44 |0 - \x89\x28\x2F |0 \x85\x27\x38 |0 \x86\x2D\x36 |0 \x86\x32\x7D |0 @@ -38174,9 +34400,7 @@ CHARMAP \x85\x2A\x51 |0 \x85\x2A\x55 |0 \x86\x33\x24 |0 - \x89\x2C\x50 |0 \x86\x32\x7E |0 - \x89\x2C\x51 |0 \x86\x33\x22 |0 \x86\x33\x23 |0 \x86\x33\x21 |0 @@ -38199,7 +34423,6 @@ CHARMAP \x84\x2E\x3E |0 \x85\x2E\x70 |0 \x86\x39\x6E |0 - \x89\x31\x2F |0 \x86\x39\x67 |0 \x86\x39\x6C |0 \x86\x42\x31 |0 @@ -38213,14 +34436,10 @@ CHARMAP \x86\x42\x33 |0 \x84\x33\x44 |0 \x85\x33\x69 |0 - \x89\x36\x6D |0 - \x89\x36\x6E |0 - \x89\x36\x6F |0 \x86\x42\x36 |0 \x86\x42\x39 |0 \x86\x42\x34 |0 \x86\x42\x38 |0 - \x89\x36\x70 |0 \x86\x42\x30 |0 \x85\x33\x67 |0 \x85\x33\x6C |0 @@ -38245,8 +34464,6 @@ CHARMAP \x86\x4B\x5D |0 \x86\x4B\x60 |0 \x86\x4B\x64 |0 - \x89\x3D\x49 |0 - \x89\x3D\x4A |0 \x84\x39\x37 |0 \x86\x4B\x5C |0 \x84\x39\x31 |0 @@ -38277,8 +34494,6 @@ CHARMAP \x86\x55\x4B |0 \x86\x55\x4A |0 \x84\x3E\x7D |0 - \x89\x43\x6B |0 - \x89\x43\x6C |0 \x86\x55\x48 |0 \x86\x55\x4E |0 \x85\x40\x58 |0 @@ -38314,7 +34529,6 @@ CHARMAP \x85\x47\x56 |0 \x86\x5F\x31 |0 \x86\x5F\x30 |0 - \x89\x4A\x2E |0 \x86\x5F\x38 |0 \x86\x5F\x2C |0 \x84\x45\x2D |0 @@ -38343,11 +34557,6 @@ CHARMAP \x87\x25\x54 |0 \x87\x25\x5B |0 \x87\x25\x59 |0 - \x89\x50\x50 |0 - \x89\x50\x51 |0 - \x89\x50\x52 |0 - \x89\x50\x53 |0 - \x89\x50\x54 |0 \x87\x25\x56 |0 \x87\x25\x5A |0 \x87\x25\x5E |0 @@ -38369,8 +34578,6 @@ CHARMAP \x87\x30\x31 |0 \x87\x30\x37 |0 \x85\x55\x6E |0 - \x89\x56\x34 |0 - \x89\x56\x35 |0 \x87\x30\x34 |0 \x87\x30\x33 |0 \x85\x55\x6A |0 @@ -38405,7 +34612,6 @@ CHARMAP \x87\x39\x4B |0 \x87\x39\x46 |0 \x87\x39\x4C |0 - \x89\x5B\x38 |0 \x87\x39\x44 |0 \x87\x39\x45 |0 \x87\x39\x4E |0 @@ -38440,7 +34646,6 @@ CHARMAP \x85\x68\x43 |0 \x85\x68\x42 |0 \x84\x60\x36 |0 - \x89\x63\x27 |0 \x84\x60\x31 |0 \x87\x48\x28 |0 \x87\x48\x29 |0 @@ -38464,7 +34669,6 @@ CHARMAP \x87\x53\x7A |0 \x85\x70\x4F |0 \x87\x53\x79 |0 - \x89\x67\x78 |0 \x85\x73\x5F |0 \x85\x73\x5E |0 \x85\x73\x5D |0 @@ -38486,12 +34690,9 @@ CHARMAP \x87\x65\x39 |0 \x84\x24\x63 |0 \x86\x33\x25 |0 - \x89\x2C\x52 |0 \x86\x39\x73 |0 \x86\x39\x72 |0 - \x89\x31\x30 |0 \x86\x42\x3A |0 - \x89\x36\x71 |0 \x86\x4B\x69 |0 \x86\x4B\x67 |0 \x85\x3A\x41 |0 @@ -38514,45 +34715,27 @@ CHARMAP \x86\x33\x27 |0 \x86\x33\x28 |0 \x86\x33\x26 |0 - \x89\x2C\x53 |0 - \x89\x2C\x54 |0 \x86\x33\x29 |0 \x85\x2A\x5A |0 \x86\x39\x74 |0 \x84\x2E\x42 |0 \x86\x39\x75 |0 \x86\x42\x3C |0 - \x89\x31\x31 |0 - \x89\x31\x32 |0 - \x89\x31\x33 |0 - \x89\x31\x35 |0 - \x89\x31\x36 |0 - \x89\x36\x75 |0 \x84\x33\x46 |0 \x85\x33\x6E |0 \x86\x42\x3B |0 - \x89\x36\x72 |0 - \x89\x36\x73 |0 - \x89\x36\x76 |0 \x86\x4B\x6B |0 \x86\x4B\x6C |0 \x86\x4B\x6A |0 - \x89\x36\x74 |0 \x85\x40\x68 |0 \x85\x40\x67 |0 \x86\x55\x50 |0 \x84\x3E\x7E |0 \x86\x55\x4F |0 \x85\x40\x69 |0 - \x89\x43\x6D |0 \x84\x45\x2F |0 \x86\x5F\x39 |0 \x86\x5F\x3A |0 - \x89\x4A\x30 |0 - \x89\x4A\x31 |0 - \x89\x4A\x33 |0 - \x89\x4A\x34 |0 - \x89\x4A\x32 |0 \x84\x4B\x3C |0 \x87\x25\x60 |0 \x87\x25\x61 |0 @@ -38580,7 +34763,6 @@ CHARMAP \x85\x62\x67 |0 \x87\x58\x40 |0 \x87\x58\x41 |0 - \x89\x67\x79 |0 \x87\x5C\x23 |0 \x84\x6B\x73 |0 \x87\x5F\x21 |0 @@ -38608,29 +34790,24 @@ CHARMAP \x84\x33\x49 |0 \x85\x33\x70 |0 \x86\x42\x3E |0 - \x89\x36\x79 |0 \x86\x42\x3D |0 \x84\x39\x3C |0 \x86\x4B\x6D |0 \x85\x3A\x42 |0 \x86\x4B\x6F |0 \x84\x39\x3B |0 - \x89\x3D\x4B |0 \x86\x4B\x6E |0 - \x89\x36\x78 |0 \x85\x40\x6A |0 \x85\x40\x6D |0 \x85\x40\x6B |0 \x85\x40\x6C |0 \x85\x40\x6E |0 \x86\x55\x53 |0 - \x89\x43\x6E |0 \x86\x55\x51 |0 \x84\x3F\x21 |0 \x84\x45\x31 |0 \x84\x45\x33 |0 \x86\x5F\x3E |0 - \x89\x4A\x35 |0 \x86\x5F\x3D |0 \x85\x47\x5C |0 \x86\x5F\x3F |0 @@ -38647,7 +34824,6 @@ CHARMAP \x84\x51\x58 |0 \x85\x55\x77 |0 \x85\x55\x75 |0 - \x89\x56\x36 |0 \x85\x55\x73 |0 \x87\x30\x3D |0 \x87\x30\x3E |0 @@ -38674,7 +34850,6 @@ CHARMAP \x87\x63\x44 |0 \x87\x65\x58 |0 \x86\x28\x69 |0 - \x89\x24\x7D |0 \x84\x27\x49 |0 \x85\x27\x3E |0 \x84\x27\x47 |0 @@ -38685,7 +34860,6 @@ CHARMAP \x85\x2A\x5D |0 \x86\x33\x2D |0 \x86\x33\x2C |0 - \x89\x2C\x55 |0 \x85\x2E\x79 |0 \x86\x3A\x21 |0 \x86\x3A\x23 |0 @@ -38695,8 +34869,6 @@ CHARMAP \x86\x39\x7B |0 \x84\x2E\x4A |0 \x86\x3A\x22 |0 - \x89\x31\x37 |0 - \x89\x31\x38 |0 \x86\x3A\x24 |0 \x86\x39\x7C |0 \x86\x39\x7D |0 @@ -38704,12 +34876,6 @@ CHARMAP \x85\x33\x72 |0 \x84\x33\x4A |0 \x86\x42\x3F |0 - \x89\x36\x7A |0 - \x89\x36\x7B |0 - \x89\x36\x7C |0 - \x89\x36\x7D |0 - \x89\x37\x21 |0 - \x89\x37\x22 |0 \x86\x42\x40 |0 \x86\x42\x41 |0 \x86\x3A\x25 |0 @@ -38719,8 +34885,6 @@ CHARMAP \x84\x39\x3D |0 \x86\x4B\x72 |0 \x86\x4B\x73 |0 - \x89\x3D\x4C |0 - \x89\x3D\x4D |0 \x86\x4B\x71 |0 \x86\x55\x54 |0 \x86\x55\x56 |0 @@ -38728,21 +34892,12 @@ CHARMAP \x86\x55\x58 |0 \x86\x55\x57 |0 \x86\x55\x55 |0 - \x89\x43\x6F |0 - \x89\x43\x70 |0 \x86\x5F\x41 |0 \x86\x5F\x40 |0 \x86\x5F\x4B |0 - \x89\x4A\x36 |0 \x85\x4E\x5D |0 \x87\x25\x64 |0 \x87\x25\x65 |0 - \x89\x50\x55 |0 - \x89\x50\x56 |0 - \x89\x50\x57 |0 - \x89\x50\x58 |0 - \x89\x50\x59 |0 - \x89\x50\x5A |0 \x84\x51\x59 |0 \x87\x30\x44 |0 \x84\x51\x5B |0 @@ -38750,11 +34905,6 @@ CHARMAP \x87\x30\x45 |0 \x85\x55\x7A |0 \x85\x55\x79 |0 - \x89\x56\x37 |0 - \x89\x56\x38 |0 - \x89\x56\x39 |0 - \x89\x56\x3A |0 - \x89\x56\x3B |0 \x87\x30\x43 |0 \x87\x30\x41 |0 \x84\x57\x2B |0 @@ -38764,8 +34914,6 @@ CHARMAP \x85\x5C\x47 |0 \x87\x40\x75 |0 \x85\x5C\x46 |0 - \x89\x5B\x3B |0 - \x89\x5B\x3C |0 \x87\x39\x55 |0 \x87\x39\x56 |0 \x87\x36\x79 |0 @@ -38777,39 +34925,31 @@ CHARMAP \x87\x40\x76 |0 \x87\x40\x78 |0 \x87\x40\x77 |0 - \x89\x5F\x62 |0 \x87\x40\x79 |0 \x87\x48\x2E |0 \x85\x68\x4B |0 \x87\x48\x2F |0 - \x89\x63\x28 |0 - \x89\x63\x29 |0 \x85\x6C\x5D |0 \x87\x4E\x53 |0 \x85\x6C\x5C |0 \x87\x4E\x55 |0 - \x89\x65\x56 |0 \x87\x4E\x52 |0 \x87\x4E\x54 |0 - \x89\x67\x7B |0 \x87\x58\x44 |0 \x85\x73\x60 |0 \x87\x58\x43 |0 \x87\x58\x45 |0 - \x89\x67\x7A |0 \x87\x5F\x22 |0 \x85\x76\x2A |0 \x87\x5F\x23 |0 \x87\x62\x42 |0 \x85\x22\x7D |0 - \x89\x22\x67 |0 \x86\x28\x6A |0 \x84\x24\x64 |0 \x85\x24\x6A |0 \x84\x24\x66 |0 \x85\x24\x6B |0 \x85\x24\x69 |0 - \x89\x24\x7E |0 \x84\x27\x50 |0 \x86\x2D\x3C |0 \x85\x27\x41 |0 @@ -38851,8 +34991,6 @@ CHARMAP \x85\x2A\x66 |0 \x85\x2A\x62 |0 \x85\x2A\x64 |0 - \x89\x2C\x56 |0 - \x89\x2C\x58 |0 \x86\x33\x37 |0 \x86\x33\x3A |0 \x86\x33\x34 |0 @@ -38875,11 +35013,6 @@ CHARMAP \x85\x2E\x7E |0 \x85\x2F\x25 |0 \x86\x3A\x2B |0 - \x89\x31\x39 |0 - \x89\x31\x3A |0 - \x89\x31\x3B |0 - \x89\x31\x3C |0 - \x89\x31\x3D |0 \x86\x3A\x27 |0 \x85\x2F\x21 |0 \x85\x2E\x7D |0 @@ -38906,12 +35039,10 @@ CHARMAP \x86\x42\x4F |0 \x86\x42\x4B |0 \x86\x42\x50 |0 - \x89\x37\x25 |0 \x86\x42\x52 |0 \x86\x42\x4C |0 \x86\x42\x49 |0 \x86\x42\x51 |0 - \x89\x37\x26 |0 \x85\x33\x7E |0 \x86\x42\x45 |0 \x86\x42\x4E |0 @@ -38945,9 +35076,6 @@ CHARMAP \x86\x4C\x28 |0 \x85\x3A\x45 |0 \x85\x3A\x47 |0 - \x89\x3D\x4F |0 - \x89\x3D\x50 |0 - \x89\x3D\x51 |0 \x86\x4B\x7C |0 \x86\x4C\x27 |0 \x86\x4B\x76 |0 @@ -38982,9 +35110,6 @@ CHARMAP \x85\x40\x7C |0 \x86\x55\x66 |0 \x86\x55\x5D |0 - \x89\x43\x71 |0 - \x89\x43\x72 |0 - \x89\x43\x73 |0 \x86\x4B\x75 |0 \x86\x55\x63 |0 \x86\x53\x35 |0 @@ -39018,13 +35143,6 @@ CHARMAP \x85\x47\x5E |0 \x85\x47\x5D |0 \x87\x25\x66 |0 - \x89\x4A\x37 |0 - \x89\x4A\x38 |0 - \x89\x4A\x39 |0 - \x89\x4A\x3A |0 - \x89\x4A\x3B |0 - \x89\x4A\x3C |0 - \x89\x4A\x3D |0 \x84\x45\x3A |0 \x86\x5F\x4D |0 \x86\x5F\x4C |0 @@ -39067,9 +35185,6 @@ CHARMAP \x85\x4E\x69 |0 \x85\x4E\x68 |0 \x87\x25\x69 |0 - \x89\x50\x5B |0 - \x89\x50\x5C |0 - \x89\x50\x5D |0 \x87\x25\x6F |0 \x84\x4B\x48 |0 \x85\x56\x2A |0 @@ -39094,7 +35209,6 @@ CHARMAP \x84\x51\x67 |0 \x85\x55\x7C |0 \x87\x30\x49 |0 - \x89\x56\x3D |0 \x87\x30\x51 |0 \x87\x30\x4C |0 \x85\x56\x2C |0 @@ -39126,9 +35240,6 @@ CHARMAP \x87\x39\x61 |0 \x87\x39\x5C |0 \x87\x39\x5B |0 - \x89\x5B\x3E |0 - \x89\x5B\x3F |0 - \x89\x5B\x40 |0 \x87\x39\x62 |0 \x87\x39\x58 |0 \x84\x5C\x28 |0 @@ -39145,8 +35256,6 @@ CHARMAP \x85\x62\x6F |0 \x85\x62\x71 |0 \x85\x62\x6A |0 - \x89\x5F\x63 |0 - \x89\x5F\x64 |0 \x87\x41\x24 |0 \x87\x41\x25 |0 \x87\x40\x7D |0 @@ -39171,7 +35280,6 @@ CHARMAP \x87\x48\x31 |0 \x85\x68\x53 |0 \x85\x68\x52 |0 - \x89\x63\x2A |0 \x87\x4B\x5D |0 \x87\x48\x35 |0 \x87\x48\x33 |0 @@ -39182,7 +35290,6 @@ CHARMAP \x85\x6C\x61 |0 \x85\x6C\x63 |0 \x87\x4E\x57 |0 - \x89\x65\x57 |0 \x84\x63\x72 |0 \x85\x6C\x5F |0 \x84\x63\x73 |0 @@ -39216,7 +35323,6 @@ CHARMAP \x87\x62\x43 |0 \x87\x62\x45 |0 \x87\x62\x44 |0 - \x89\x6C\x66 |0 \x85\x7B\x43 |0 \x85\x27\x44 |0 \x84\x2A\x60 |0 @@ -39228,7 +35334,6 @@ CHARMAP \x86\x3A\x30 |0 \x84\x33\x58 |0 \x85\x34\x22 |0 - \x89\x37\x27 |0 \x85\x3A\x52 |0 \x84\x39\x51 |0 \x85\x3A\x53 |0 @@ -39250,7 +35355,6 @@ CHARMAP \x84\x45\x49 |0 \x86\x5F\x50 |0 \x84\x45\x4B |0 - \x89\x4D\x3F |0 \x85\x4E\x6E |0 \x84\x4B\x52 |0 \x87\x25\x75 |0 @@ -39288,8 +35392,6 @@ CHARMAP \x85\x2F\x2A |0 \x85\x2F\x2B |0 \x86\x3A\x33 |0 - \x89\x31\x3F |0 - \x89\x31\x40 |0 \x86\x3A\x31 |0 \x86\x3A\x32 |0 \x85\x2F\x29 |0 @@ -39306,9 +35408,7 @@ CHARMAP \x86\x42\x58 |0 \x84\x39\x52 |0 \x86\x4C\x2C |0 - \x89\x3D\x52 |0 \x86\x4C\x2A |0 - \x89\x3D\x53 |0 \x85\x41\x24 |0 \x84\x3F\x32 |0 \x86\x55\x69 |0 @@ -39317,23 +35417,19 @@ CHARMAP \x86\x55\x67 |0 \x85\x3A\x56 |0 \x84\x3F\x36 |0 - \x89\x43\x75 |0 \x86\x55\x68 |0 \x85\x47\x6D |0 \x85\x47\x6E |0 \x86\x5F\x53 |0 \x85\x47\x6F |0 \x85\x47\x70 |0 - \x89\x4A\x3E |0 \x87\x25\x78 |0 \x84\x4B\x54 |0 \x87\x25\x76 |0 \x87\x25\x77 |0 - \x89\x50\x61 |0 \x87\x25\x79 |0 \x87\x30\x54 |0 \x84\x51\x6B |0 - \x89\x56\x3F |0 \x87\x30\x53 |0 \x85\x5C\x51 |0 \x85\x5C\x52 |0 @@ -39347,32 +35443,15 @@ CHARMAP \x86\x28\x6D |0 \x85\x24\x6D |0 \x85\x24\x6C |0 - \x89\x25\x21 |0 - \x89\x25\x22 |0 \x85\x27\x45 |0 \x84\x27\x54 |0 - \x89\x28\x30 |0 - \x89\x28\x31 |0 - \x89\x28\x32 |0 - \x89\x28\x33 |0 \x86\x2D\x47 |0 - \x89\x28\x35 |0 \x84\x2A\x65 |0 \x84\x2A\x63 |0 \x86\x33\x45 |0 \x85\x2A\x70 |0 - \x89\x2C\x59 |0 - \x89\x2C\x5A |0 - \x89\x2C\x5B |0 - \x89\x2C\x5D |0 - \x89\x2C\x5E |0 - \x89\x2C\x5F |0 - \x89\x2C\x61 |0 - \x89\x2C\x63 |0 \x86\x33\x43 |0 \x86\x33\x44 |0 - \x89\x2C\x64 |0 - \x89\x2C\x60 |0 \x86\x33\x42 |0 \x85\x2A\x6F |0 \x85\x2A\x71 |0 @@ -39391,19 +35470,12 @@ CHARMAP \x85\x2F\x36 |0 \x85\x2F\x32 |0 \x85\x2F\x35 |0 - \x89\x31\x3E |0 \x84\x2E\x59 |0 \x85\x2F\x37 |0 \x86\x3A\x38 |0 - \x89\x31\x42 |0 - \x89\x31\x43 |0 - \x89\x31\x45 |0 - \x89\x31\x46 |0 \x84\x2E\x5A |0 \x85\x2F\x2D |0 \x86\x3A\x37 |0 - \x89\x31\x48 |0 - \x89\x31\x41 |0 \x85\x34\x26 |0 \x85\x2F\x2E |0 \x86\x3A\x36 |0 @@ -39422,21 +35494,10 @@ CHARMAP \x85\x34\x27 |0 \x85\x34\x29 |0 \x85\x34\x2D |0 - \x89\x37\x28 |0 - \x89\x37\x29 |0 - \x89\x37\x2A |0 - \x89\x37\x2B |0 - \x89\x37\x2E |0 - \x89\x37\x2F |0 - \x89\x37\x31 |0 - \x89\x37\x32 |0 - \x89\x37\x33 |0 \x86\x42\x5E |0 \x86\x42\x5C |0 \x86\x4C\x2E |0 - \x89\x37\x30 |0 \x85\x34\x2B |0 - \x89\x37\x2C |0 \x86\x42\x62 |0 \x85\x34\x2F |0 \x85\x34\x33 |0 @@ -39454,10 +35515,6 @@ CHARMAP \x86\x4C\x31 |0 \x85\x3A\x5A |0 \x85\x3A\x5F |0 - \x89\x3D\x54 |0 - \x89\x3D\x55 |0 - \x89\x3D\x56 |0 - \x89\x3D\x57 |0 \x86\x4C\x34 |0 \x86\x4C\x30 |0 \x86\x4C\x32 |0 @@ -39478,19 +35535,6 @@ CHARMAP \x85\x41\x26 |0 \x85\x41\x27 |0 \x86\x55\x6D |0 - \x89\x43\x77 |0 - \x89\x43\x78 |0 - \x89\x43\x79 |0 - \x89\x43\x7A |0 - \x89\x43\x7B |0 - \x89\x43\x7C |0 - \x89\x43\x7D |0 - \x89\x43\x7E |0 - \x89\x44\x21 |0 - \x89\x44\x22 |0 - \x89\x44\x23 |0 - \x89\x44\x24 |0 - \x89\x44\x26 |0 \x86\x55\x70 |0 \x86\x55\x73 |0 \x86\x5F\x5B |0 @@ -39511,28 +35555,11 @@ CHARMAP \x85\x47\x71 |0 \x85\x47\x7D |0 \x86\x5F\x58 |0 - \x89\x4A\x41 |0 - \x89\x4A\x43 |0 - \x89\x4A\x44 |0 - \x89\x4A\x45 |0 - \x89\x4A\x46 |0 - \x89\x4A\x47 |0 - \x89\x4A\x48 |0 - \x89\x4A\x49 |0 - \x89\x4A\x4B |0 - \x89\x4A\x4C |0 - \x89\x4A\x4D |0 - \x89\x4A\x4F |0 - \x89\x4A\x50 |0 - \x89\x4A\x51 |0 - \x89\x4A\x52 |0 \x84\x45\x54 |0 - \x89\x4A\x40 |0 \x85\x47\x77 |0 \x85\x47\x7C |0 \x85\x47\x79 |0 \x85\x47\x74 |0 - \x89\x50\x64 |0 \x84\x4B\x5A |0 \x85\x4E\x72 |0 \x85\x4E\x73 |0 @@ -39542,18 +35569,12 @@ CHARMAP \x87\x26\x25 |0 \x85\x4E\x75 |0 \x87\x25\x7D |0 - \x89\x50\x62 |0 - \x89\x50\x63 |0 - \x89\x50\x65 |0 - \x89\x50\x66 |0 - \x89\x50\x68 |0 \x87\x26\x22 |0 \x87\x25\x7A |0 \x87\x26\x23 |0 \x85\x4E\x71 |0 \x85\x4E\x74 |0 \x87\x25\x7C |0 - \x89\x4A\x4A |0 \x87\x30\x58 |0 \x85\x56\x31 |0 \x85\x56\x2E |0 @@ -39567,19 +35588,8 @@ CHARMAP \x87\x30\x5A |0 \x84\x51\x6F |0 \x87\x30\x57 |0 - \x89\x56\x41 |0 - \x89\x56\x42 |0 - \x89\x56\x43 |0 \x85\x56\x30 |0 - \x89\x56\x44 |0 \x85\x56\x2F |0 - \x89\x56\x45 |0 - \x89\x56\x46 |0 - \x89\x56\x47 |0 - \x89\x56\x49 |0 - \x89\x56\x4B |0 - \x89\x56\x4C |0 - \x89\x56\x4D |0 \x85\x5C\x56 |0 \x87\x39\x68 |0 \x85\x5C\x54 |0 @@ -39596,18 +35606,8 @@ CHARMAP \x85\x5C\x58 |0 \x85\x5C\x57 |0 \x85\x5C\x59 |0 - \x89\x5B\x41 |0 - \x89\x5B\x42 |0 - \x89\x5B\x43 |0 - \x89\x5B\x44 |0 - \x89\x5B\x45 |0 - \x89\x5B\x46 |0 - \x89\x5B\x47 |0 - \x89\x5B\x48 |0 - \x89\x5B\x49 |0 \x87\x39\x6B |0 \x87\x39\x6E |0 - \x89\x56\x4A |0 \x87\x41\x29 |0 \x85\x62\x76 |0 \x85\x62\x78 |0 @@ -39619,22 +35619,12 @@ CHARMAP \x87\x41\x27 |0 \x85\x62\x79 |0 \x87\x41\x2A |0 - \x89\x5F\x65 |0 - \x89\x5F\x66 |0 - \x89\x5F\x67 |0 - \x89\x5F\x68 |0 - \x89\x5F\x69 |0 \x84\x60\x40 |0 \x85\x68\x5A |0 \x85\x68\x59 |0 - \x89\x63\x2B |0 - \x89\x63\x2C |0 - \x89\x63\x2D |0 - \x89\x63\x2E |0 \x87\x48\x3A |0 \x87\x48\x38 |0 \x87\x48\x39 |0 - \x89\x63\x2F |0 \x85\x6C\x65 |0 \x85\x6C\x66 |0 \x87\x4E\x59 |0 @@ -39643,29 +35633,20 @@ CHARMAP \x85\x6C\x67 |0 \x84\x60\x41 |0 \x87\x4E\x5B |0 - \x89\x65\x5A |0 - \x89\x65\x5B |0 - \x89\x65\x5C |0 - \x89\x65\x5D |0 \x87\x4E\x5D |0 \x85\x70\x56 |0 \x85\x70\x57 |0 - \x89\x67\x7D |0 \x87\x54\x24 |0 \x84\x66\x62 |0 - \x89\x67\x7C |0 \x85\x73\x68 |0 \x87\x58\x48 |0 \x85\x73\x69 |0 - \x89\x69\x5B |0 - \x89\x69\x5C |0 \x87\x58\x49 |0 \x85\x73\x6A |0 \x85\x76\x2E |0 \x84\x6A\x5B |0 \x85\x76\x2D |0 \x85\x76\x2F |0 - \x89\x6A\x65 |0 \x87\x5C\x28 |0 \x87\x5C\x27 |0 \x87\x5F\x26 |0 @@ -39681,18 +35662,9 @@ CHARMAP \x86\x22\x27 |0 \x86\x25\x40 |0 \x86\x28\x6E |0 - \x89\x22\x68 |0 \x86\x2D\x48 |0 - \x89\x25\x24 |0 \x86\x33\x47 |0 \x86\x33\x49 |0 - \x89\x28\x36 |0 - \x89\x28\x38 |0 - \x89\x28\x39 |0 - \x89\x28\x3A |0 - \x89\x28\x3B |0 - \x89\x28\x3D |0 - \x89\x28\x37 |0 \x86\x31\x5A |0 \x85\x2F\x39 |0 \x86\x3A\x3A |0 @@ -39700,33 +35672,14 @@ CHARMAP \x85\x2F\x3A |0 \x86\x3A\x3B |0 \x86\x33\x4B |0 - \x89\x2C\x65 |0 - \x89\x2C\x66 |0 - \x89\x2C\x67 |0 - \x89\x2C\x68 |0 - \x89\x2C\x69 |0 - \x89\x31\x49 |0 - \x89\x31\x4B |0 - \x89\x31\x4E |0 \x86\x3A\x3E |0 \x86\x3A\x3F |0 \x86\x3A\x3D |0 \x86\x3A\x40 |0 \x86\x3A\x3C |0 - \x89\x2C\x6A |0 \x84\x2A\x68 |0 \x85\x34\x36 |0 \x86\x3A\x41 |0 - \x89\x31\x4A |0 - \x89\x31\x4C |0 - \x89\x31\x4D |0 - \x89\x31\x4F |0 - \x89\x31\x50 |0 - \x89\x31\x51 |0 - \x89\x31\x52 |0 - \x89\x31\x53 |0 - \x89\x31\x54 |0 - \x89\x37\x37 |0 \x86\x42\x63 |0 \x85\x34\x35 |0 \x86\x4C\x38 |0 @@ -39739,30 +35692,12 @@ CHARMAP \x86\x4C\x3B |0 \x86\x4C\x36 |0 \x86\x4C\x37 |0 - \x89\x37\x34 |0 - \x89\x37\x36 |0 - \x89\x37\x38 |0 - \x89\x3D\x5B |0 - \x89\x37\x35 |0 \x86\x55\x75 |0 \x85\x41\x2B |0 \x85\x41\x2A |0 \x85\x41\x2C |0 \x86\x4C\x3F |0 \x84\x3F\x48 |0 - \x89\x3D\x58 |0 - \x89\x3D\x59 |0 - \x89\x3D\x5A |0 - \x89\x3D\x5C |0 - \x89\x3D\x5D |0 - \x89\x3D\x5E |0 - \x89\x3D\x5F |0 - \x89\x3D\x62 |0 - \x89\x3D\x63 |0 - \x89\x3D\x64 |0 - \x89\x44\x28 |0 - \x89\x44\x2A |0 - \x89\x3D\x61 |0 \x86\x55\x74 |0 \x85\x48\x23 |0 \x86\x5F\x5F |0 @@ -39770,16 +35705,6 @@ CHARMAP \x84\x45\x56 |0 \x86\x5F\x63 |0 \x86\x5F\x61 |0 - \x89\x44\x27 |0 - \x89\x44\x29 |0 - \x89\x44\x2B |0 - \x89\x44\x2C |0 - \x89\x44\x2D |0 - \x89\x44\x2E |0 - \x89\x44\x2F |0 - \x89\x44\x30 |0 - \x89\x44\x31 |0 - \x89\x44\x32 |0 \x86\x5F\x5D |0 \x86\x5F\x62 |0 \x85\x48\x21 |0 @@ -39788,12 +35713,6 @@ CHARMAP \x87\x26\x26 |0 \x86\x5F\x5C |0 \x86\x5F\x64 |0 - \x89\x4A\x53 |0 - \x89\x4A\x55 |0 - \x89\x4A\x56 |0 - \x89\x4A\x57 |0 - \x89\x4A\x58 |0 - \x89\x4A\x5A |0 \x87\x26\x28 |0 \x85\x56\x38 |0 \x87\x30\x5C |0 @@ -39805,9 +35724,6 @@ CHARMAP \x85\x56\x3A |0 \x87\x26\x2A |0 \x87\x30\x5B |0 - \x89\x50\x6A |0 - \x89\x50\x69 |0 - \x89\x56\x51 |0 \x84\x57\x43 |0 \x85\x5C\x5A |0 \x87\x39\x73 |0 @@ -39815,57 +35731,36 @@ CHARMAP \x87\x39\x76 |0 \x87\x39\x74 |0 \x87\x30\x5E |0 - \x89\x50\x6B |0 - \x89\x56\x4E |0 - \x89\x56\x4F |0 - \x89\x56\x50 |0 - \x89\x56\x52 |0 \x87\x39\x71 |0 \x87\x39\x75 |0 \x87\x39\x72 |0 \x87\x39\x70 |0 - \x89\x5B\x4D |0 - \x89\x5B\x4F |0 \x84\x5C\x34 |0 \x85\x62\x7B |0 \x87\x41\x2C |0 - \x89\x5B\x4B |0 - \x89\x5B\x4C |0 - \x89\x5B\x4E |0 - \x89\x5B\x50 |0 - \x89\x5B\x51 |0 - \x89\x5B\x52 |0 \x87\x41\x2B |0 \x84\x5C\x33 |0 \x85\x68\x5B |0 \x87\x48\x3C |0 \x87\x48\x3D |0 - \x89\x5F\x6A |0 - \x89\x5F\x6B |0 \x85\x6C\x68 |0 \x84\x63\x77 |0 - \x89\x65\x5E |0 \x87\x4E\x5E |0 \x87\x54\x26 |0 \x87\x54\x25 |0 - \x89\x65\x5F |0 \x84\x68\x7D |0 \x87\x58\x4A |0 \x87\x58\x4B |0 \x87\x5C\x29 |0 - \x89\x69\x5D |0 \x87\x5C\x2A |0 \x87\x5C\x2B |0 \x85\x77\x6E |0 \x87\x5C\x2C |0 \x85\x77\x6F |0 - \x89\x6A\x67 |0 \x85\x79\x32 |0 \x87\x62\x49 |0 \x87\x62\x47 |0 \x87\x63\x5D |0 - \x89\x6C\x67 |0 - \x89\x22\x69 |0 \x86\x33\x4D |0 \x86\x42\x64 |0 \x84\x39\x5B |0 @@ -39880,19 +35775,12 @@ CHARMAP \x87\x61\x28 |0 \x84\x21\x7E |0 \x86\x25\x41 |0 - \x89\x22\x6A |0 \x86\x28\x6F |0 - \x89\x25\x25 |0 \x86\x28\x70 |0 \x84\x27\x55 |0 \x85\x27\x48 |0 \x84\x27\x57 |0 \x85\x27\x47 |0 - \x89\x28\x3E |0 - \x89\x28\x3F |0 - \x89\x28\x40 |0 - \x89\x28\x41 |0 - \x89\x28\x42 |0 \x86\x2D\x4A |0 \x86\x33\x51 |0 \x86\x33\x54 |0 @@ -39907,11 +35795,6 @@ CHARMAP \x86\x33\x4F |0 \x85\x2A\x73 |0 \x86\x33\x57 |0 - \x89\x2C\x6B |0 - \x89\x2C\x6C |0 - \x89\x2C\x6E |0 - \x89\x2C\x6F |0 - \x89\x2C\x70 |0 \x86\x33\x55 |0 \x86\x33\x53 |0 \x86\x33\x4E |0 @@ -39924,8 +35807,6 @@ CHARMAP \x85\x2A\x76 |0 \x85\x34\x3C |0 \x86\x3A\x47 |0 - \x89\x31\x55 |0 - \x89\x31\x56 |0 \x86\x3A\x42 |0 \x86\x3A\x44 |0 \x85\x34\x3A |0 @@ -39935,10 +35816,6 @@ CHARMAP \x85\x34\x3D |0 \x86\x42\x68 |0 \x85\x34\x37 |0 - \x89\x37\x3A |0 - \x89\x37\x3C |0 - \x89\x37\x3D |0 - \x89\x37\x3E |0 \x84\x33\x6C |0 \x86\x42\x65 |0 \x86\x42\x6A |0 @@ -39953,11 +35830,7 @@ CHARMAP \x84\x39\x5D |0 \x86\x4C\x44 |0 \x84\x3F\x51 |0 - \x89\x3D\x65 |0 - \x89\x3D\x67 |0 - \x89\x3D\x69 |0 \x85\x34\x3E |0 - \x89\x3D\x66 |0 \x85\x41\x36 |0 \x85\x41\x2F |0 \x86\x55\x79 |0 @@ -39975,14 +35848,6 @@ CHARMAP \x86\x55\x7B |0 \x86\x55\x7E |0 \x86\x55\x7C |0 - \x89\x44\x33 |0 - \x89\x44\x34 |0 - \x89\x44\x35 |0 - \x89\x44\x36 |0 - \x89\x44\x37 |0 - \x89\x44\x38 |0 - \x89\x44\x39 |0 - \x89\x44\x3A |0 \x86\x55\x78 |0 \x86\x55\x7D |0 \x85\x41\x37 |0 @@ -40005,16 +35870,6 @@ CHARMAP \x86\x5F\x70 |0 \x85\x48\x2A |0 \x86\x5F\x67 |0 - \x89\x4A\x60 |0 - \x89\x4A\x5B |0 - \x89\x4A\x5C |0 - \x89\x4A\x5D |0 - \x89\x4A\x5E |0 - \x89\x4A\x5F |0 - \x89\x4A\x61 |0 - \x89\x4A\x62 |0 - \x89\x4A\x63 |0 - \x89\x4A\x65 |0 \x86\x5F\x6D |0 \x86\x5F\x6C |0 \x85\x4E\x7B |0 @@ -40035,12 +35890,6 @@ CHARMAP \x84\x4B\x67 |0 \x84\x4B\x6A |0 \x87\x26\x35 |0 - \x89\x50\x6C |0 - \x89\x50\x6E |0 - \x89\x50\x6F |0 - \x89\x50\x70 |0 - \x89\x50\x71 |0 - \x89\x50\x72 |0 \x87\x26\x2E |0 \x87\x26\x36 |0 \x87\x26\x37 |0 @@ -40066,8 +35915,6 @@ CHARMAP \x87\x30\x6A |0 \x87\x30\x6C |0 \x87\x30\x61 |0 - \x89\x56\x54 |0 - \x89\x56\x55 |0 \x87\x30\x65 |0 \x87\x30\x67 |0 \x87\x30\x68 |0 @@ -40085,18 +35932,10 @@ CHARMAP \x84\x57\x46 |0 \x85\x5C\x60 |0 \x87\x39\x7A |0 - \x89\x5B\x54 |0 - \x89\x5B\x55 |0 - \x89\x5B\x56 |0 - \x89\x5B\x57 |0 - \x89\x5B\x58 |0 - \x89\x5B\x5A |0 \x87\x39\x78 |0 - \x89\x5B\x53 |0 \x85\x56\x48 |0 \x87\x39\x79 |0 \x85\x5C\x63 |0 - \x89\x56\x53 |0 \x85\x62\x7D |0 \x85\x63\x26 |0 \x85\x63\x24 |0 @@ -40107,13 +35946,6 @@ CHARMAP \x85\x62\x7E |0 \x87\x41\x2F |0 \x85\x63\x23 |0 - \x89\x5F\x6C |0 - \x89\x5F\x6D |0 - \x89\x5F\x6E |0 - \x89\x5F\x6F |0 - \x89\x5F\x70 |0 - \x89\x5F\x71 |0 - \x89\x5F\x72 |0 \x85\x62\x7C |0 \x85\x68\x5E |0 \x84\x60\x43 |0 @@ -40126,7 +35958,6 @@ CHARMAP \x87\x4E\x62 |0 \x87\x48\x41 |0 \x87\x48\x3E |0 - \x89\x63\x30 |0 \x87\x48\x40 |0 \x85\x6C\x6B |0 \x84\x63\x7A |0 @@ -40138,9 +35969,6 @@ CHARMAP \x85\x6C\x6C |0 \x87\x4E\x5F |0 \x87\x4E\x61 |0 - \x89\x65\x60 |0 - \x89\x65\x61 |0 - \x89\x65\x63 |0 \x87\x4E\x63 |0 \x85\x6C\x6D |0 \x87\x54\x28 |0 @@ -40158,11 +35986,8 @@ CHARMAP \x87\x5C\x2E |0 \x87\x5F\x28 |0 \x87\x5E\x71 |0 - \x89\x6B\x57 |0 - \x89\x6B\x58 |0 \x84\x6C\x77 |0 \x85\x79\x33 |0 - \x89\x6C\x34 |0 \x84\x6C\x78 |0 \x85\x7A\x2E |0 \x85\x7B\x61 |0 @@ -40178,7 +36003,6 @@ CHARMAP \x86\x2D\x4F |0 \x83\x2A\x45 |0 \x86\x2D\x4B |0 - \x89\x28\x43 |0 \x84\x2A\x74 |0 \x86\x33\x59 |0 \x86\x33\x5B |0 @@ -40191,9 +36015,6 @@ CHARMAP \x86\x33\x5C |0 \x86\x33\x5D |0 \x85\x2A\x7A |0 - \x89\x2C\x71 |0 - \x89\x2C\x72 |0 - \x89\x2C\x73 |0 \x85\x2F\x3F |0 \x84\x2E\x66 |0 \x84\x2E\x6B |0 @@ -40209,9 +36030,6 @@ CHARMAP \x86\x3A\x48 |0 \x85\x2F\x40 |0 \x85\x2F\x44 |0 - \x89\x31\x58 |0 - \x89\x31\x59 |0 - \x89\x31\x5A |0 \x86\x3A\x4B |0 \x86\x3A\x49 |0 \x85\x34\x44 |0 @@ -40224,11 +36042,6 @@ CHARMAP \x85\x34\x42 |0 \x85\x34\x40 |0 \x86\x42\x6E |0 - \x89\x37\x40 |0 - \x89\x37\x41 |0 - \x89\x37\x42 |0 - \x89\x37\x43 |0 - \x89\x37\x44 |0 \x85\x3A\x72 |0 \x84\x39\x66 |0 \x85\x3A\x74 |0 @@ -40256,7 +36069,6 @@ CHARMAP \x85\x3A\x6E |0 \x85\x3A\x6B |0 \x86\x4C\x4D |0 - \x89\x3D\x6B |0 \x85\x41\x3A |0 \x86\x56\x29 |0 \x85\x41\x3C |0 @@ -40272,11 +36084,6 @@ CHARMAP \x85\x41\x40 |0 \x86\x56\x26 |0 \x86\x56\x25 |0 - \x89\x44\x3B |0 - \x89\x44\x3D |0 - \x89\x44\x3E |0 - \x89\x44\x3F |0 - \x89\x44\x40 |0 \x86\x56\x23 |0 \x86\x56\x2A |0 \x86\x57\x26 |0 @@ -40289,10 +36096,8 @@ CHARMAP \x86\x5F\x73 |0 \x85\x48\x31 |0 \x86\x5F\x79 |0 - \x89\x4A\x66 |0 \x85\x48\x33 |0 \x86\x5F\x71 |0 - \x89\x44\x3C |0 \x87\x26\x3B |0 \x85\x4F\x21 |0 \x85\x4F\x27 |0 @@ -40329,11 +36134,6 @@ CHARMAP \x85\x56\x4E |0 \x85\x5C\x65 |0 \x85\x56\x55 |0 - \x89\x56\x56 |0 - \x89\x56\x57 |0 - \x89\x56\x58 |0 - \x89\x56\x59 |0 - \x89\x56\x5A |0 \x87\x30\x71 |0 \x85\x5C\x6A |0 \x85\x5C\x67 |0 @@ -40347,10 +36147,8 @@ CHARMAP \x87\x39\x7E |0 \x87\x30\x72 |0 \x85\x5C\x68 |0 - \x89\x5B\x5B |0 \x85\x63\x28 |0 \x85\x63\x27 |0 - \x89\x5F\x74 |0 \x84\x60\x4A |0 \x87\x48\x44 |0 \x87\x48\x43 |0 @@ -40364,7 +36162,6 @@ CHARMAP \x87\x54\x2D |0 \x87\x4E\x67 |0 \x87\x4E\x65 |0 - \x89\x65\x64 |0 \x85\x70\x5B |0 \x87\x54\x2B |0 \x84\x66\x67 |0 @@ -40372,13 +36169,10 @@ CHARMAP \x85\x70\x59 |0 \x87\x54\x2C |0 \x85\x70\x5A |0 - \x89\x68\x21 |0 - \x89\x65\x65 |0 \x85\x76\x32 |0 \x87\x5C\x2F |0 \x85\x77\x71 |0 \x87\x61\x2A |0 - \x89\x6B\x59 |0 \x87\x5F\x29 |0 \x85\x79\x34 |0 \x87\x62\x4A |0 @@ -40388,8 +36182,6 @@ CHARMAP \x85\x27\x49 |0 \x85\x27\x4A |0 \x84\x2A\x75 |0 - \x89\x2C\x74 |0 - \x89\x2C\x78 |0 \x84\x2E\x6F |0 \x85\x2F\x47 |0 \x85\x2F\x48 |0 @@ -40397,12 +36189,6 @@ CHARMAP \x85\x2F\x46 |0 \x85\x2F\x45 |0 \x84\x2E\x6E |0 - \x89\x31\x5C |0 - \x89\x31\x5D |0 - \x89\x31\x5E |0 - \x89\x31\x5F |0 - \x89\x31\x61 |0 - \x89\x31\x62 |0 \x86\x3A\x4D |0 \x86\x3A\x4E |0 \x86\x42\x72 |0 @@ -40411,10 +36197,7 @@ CHARMAP \x86\x42\x73 |0 \x86\x42\x70 |0 \x84\x33\x74 |0 - \x89\x37\x45 |0 - \x89\x37\x47 |0 \x85\x34\x47 |0 - \x89\x37\x48 |0 \x84\x39\x6B |0 \x86\x4C\x55 |0 \x85\x3A\x75 |0 @@ -40422,10 +36205,6 @@ CHARMAP \x85\x3A\x76 |0 \x85\x3A\x78 |0 \x86\x4C\x54 |0 - \x89\x3D\x6D |0 - \x89\x3D\x6E |0 - \x89\x3D\x6F |0 - \x89\x3D\x70 |0 \x84\x3F\x56 |0 \x84\x3F\x58 |0 \x85\x41\x42 |0 @@ -40434,51 +36213,32 @@ CHARMAP \x85\x41\x41 |0 \x86\x56\x2D |0 \x86\x56\x2E |0 - \x89\x44\x41 |0 - \x89\x44\x42 |0 - \x89\x44\x43 |0 \x85\x41\x43 |0 \x85\x48\x34 |0 \x86\x5F\x7A |0 \x85\x48\x35 |0 \x84\x45\x62 |0 - \x89\x4A\x67 |0 - \x89\x4A\x68 |0 - \x89\x4A\x6A |0 - \x89\x4A\x69 |0 \x87\x26\x3F |0 \x84\x4B\x6E |0 \x85\x4F\x2D |0 - \x89\x50\x73 |0 - \x89\x50\x74 |0 - \x89\x50\x75 |0 \x87\x26\x3D |0 - \x89\x56\x5C |0 - \x89\x56\x5B |0 \x84\x57\x51 |0 \x87\x30\x74 |0 \x85\x56\x56 |0 - \x89\x5B\x5C |0 \x85\x5C\x6C |0 \x85\x5D\x63 |0 \x87\x3A\x22 |0 \x85\x5C\x6B |0 \x85\x63\x2A |0 \x87\x3A\x23 |0 - \x89\x5F\x75 |0 \x87\x41\x31 |0 \x85\x63\x29 |0 \x87\x4E\x68 |0 \x87\x54\x2E |0 - \x89\x65\x66 |0 \x87\x48\x45 |0 \x85\x70\x5C |0 - \x89\x68\x22 |0 \x87\x58\x50 |0 - \x89\x69\x5E |0 - \x89\x6A\x68 |0 \x87\x61\x2B |0 - \x89\x25\x26 |0 \x85\x27\x4B |0 \x86\x2D\x50 |0 \x85\x27\x4D |0 @@ -40489,12 +36249,6 @@ CHARMAP \x86\x33\x5F |0 \x86\x33\x5E |0 \x85\x2A\x7E |0 - \x89\x2C\x79 |0 - \x89\x2C\x7A |0 - \x89\x2C\x7B |0 - \x89\x2C\x7C |0 - \x89\x2C\x7D |0 - \x89\x29\x24 |0 \x85\x2F\x4E |0 \x85\x2F\x49 |0 \x84\x2E\x74 |0 @@ -40509,14 +36263,6 @@ CHARMAP \x86\x3A\x51 |0 \x85\x2F\x50 |0 \x85\x2F\x52 |0 - \x89\x31\x63 |0 - \x89\x31\x64 |0 - \x89\x31\x65 |0 - \x89\x31\x66 |0 - \x89\x31\x67 |0 - \x89\x31\x68 |0 - \x89\x31\x69 |0 - \x89\x31\x6A |0 \x84\x2E\x76 |0 \x86\x42\x74 |0 \x86\x42\x7A |0 @@ -40536,12 +36282,6 @@ CHARMAP \x85\x34\x50 |0 \x85\x34\x51 |0 \x86\x42\x78 |0 - \x89\x37\x49 |0 - \x89\x37\x4A |0 - \x89\x37\x4B |0 - \x89\x37\x4C |0 - \x89\x37\x4E |0 - \x89\x37\x4F |0 \x85\x3A\x7C |0 \x85\x3B\x22 |0 \x85\x3A\x7B |0 @@ -40564,16 +36304,6 @@ CHARMAP \x86\x4C\x5C |0 \x85\x34\x4F |0 \x85\x3A\x7D |0 - \x89\x3D\x71 |0 - \x89\x3D\x72 |0 - \x89\x3D\x73 |0 - \x89\x3D\x74 |0 - \x89\x3D\x75 |0 - \x89\x3D\x76 |0 - \x89\x3D\x78 |0 - \x89\x3D\x79 |0 - \x89\x3D\x7A |0 - \x89\x3D\x77 |0 \x85\x3B\x23 |0 \x85\x41\x54 |0 \x85\x41\x48 |0 @@ -40610,20 +36340,7 @@ CHARMAP \x86\x4C\x58 |0 \x86\x56\x35 |0 \x86\x56\x39 |0 - \x89\x44\x44 |0 - \x89\x44\x46 |0 - \x89\x44\x47 |0 - \x89\x44\x48 |0 - \x89\x44\x49 |0 - \x89\x44\x4A |0 - \x89\x44\x4B |0 - \x89\x44\x4C |0 - \x89\x44\x4D |0 - \x89\x44\x4E |0 - \x89\x44\x4F |0 - \x89\x44\x50 |0 \x86\x56\x2F |0 - \x89\x41\x3E |0 \x85\x48\x45 |0 \x85\x41\x56 |0 \x84\x45\x6C |0 @@ -40656,22 +36373,6 @@ CHARMAP \x85\x48\x3F |0 \x84\x45\x71 |0 \x85\x48\x44 |0 - \x89\x4A\x6B |0 - \x89\x4A\x6C |0 - \x89\x4A\x6D |0 - \x89\x4A\x6E |0 - \x89\x4A\x6F |0 - \x89\x4A\x70 |0 - \x89\x4A\x73 |0 - \x89\x4A\x74 |0 - \x89\x4A\x75 |0 - \x89\x4A\x76 |0 - \x89\x4A\x77 |0 - \x89\x4A\x78 |0 - \x89\x4A\x79 |0 - \x89\x4A\x7A |0 - \x89\x4A\x72 |0 - \x89\x4A\x71 |0 \x85\x4F\x3A |0 \x87\x26\x49 |0 \x87\x26\x4B |0 @@ -40720,21 +36421,7 @@ CHARMAP \x87\x26\x48 |0 \x87\x26\x46 |0 \x85\x4F\x46 |0 - \x89\x50\x78 |0 \x87\x26\x52 |0 - \x89\x50\x77 |0 - \x89\x50\x7A |0 - \x89\x50\x7B |0 - \x89\x50\x7C |0 - \x89\x50\x7D |0 - \x89\x50\x7E |0 - \x89\x51\x22 |0 - \x89\x51\x24 |0 - \x89\x51\x29 |0 - \x89\x51\x25 |0 - \x89\x51\x26 |0 - \x89\x51\x27 |0 - \x89\x51\x2A |0 \x85\x56\x64 |0 \x84\x52\x41 |0 \x84\x52\x3E |0 @@ -40782,34 +36469,11 @@ CHARMAP \x87\x31\x23 |0 \x87\x30\x76 |0 \x85\x56\x61 |0 - \x89\x56\x72 |0 \x85\x56\x5B |0 \x87\x30\x7C |0 \x87\x30\x77 |0 \x87\x31\x22 |0 - \x89\x56\x5D |0 - \x89\x56\x5E |0 - \x89\x56\x60 |0 - \x89\x56\x61 |0 - \x89\x56\x62 |0 - \x89\x56\x63 |0 - \x89\x56\x64 |0 - \x89\x56\x65 |0 - \x89\x56\x66 |0 - \x89\x56\x67 |0 - \x89\x56\x68 |0 - \x89\x56\x69 |0 - \x89\x56\x6A |0 - \x89\x56\x6B |0 - \x89\x56\x6C |0 - \x89\x56\x6D |0 - \x89\x56\x6E |0 - \x89\x56\x6F |0 - \x89\x56\x70 |0 - \x89\x56\x71 |0 - \x89\x56\x73 |0 \x87\x30\x79 |0 - \x89\x50\x79 |0 \x85\x5D\x24 |0 \x85\x5D\x21 |0 \x84\x57\x5D |0 @@ -40864,21 +36528,9 @@ CHARMAP \x87\x3A\x26 |0 \x87\x3A\x25 |0 \x87\x3A\x2D |0 - \x89\x5B\x5D |0 - \x89\x5B\x5E |0 - \x89\x5B\x60 |0 - \x89\x5B\x61 |0 - \x89\x5B\x62 |0 - \x89\x5B\x63 |0 - \x89\x5B\x64 |0 - \x89\x5B\x66 |0 - \x89\x5B\x67 |0 - \x89\x5B\x68 |0 - \x89\x5B\x69 |0 \x87\x3A\x2A |0 \x87\x3A\x2E |0 \x84\x57\x68 |0 - \x89\x5B\x65 |0 \x84\x57\x61 |0 \x85\x63\x4B |0 \x85\x63\x47 |0 @@ -40936,25 +36588,8 @@ CHARMAP \x85\x63\x2F |0 \x87\x41\x32 |0 \x87\x41\x37 |0 - \x89\x5F\x76 |0 - \x89\x5F\x77 |0 - \x89\x5F\x78 |0 - \x89\x5F\x79 |0 - \x89\x5F\x7A |0 - \x89\x5F\x7B |0 - \x89\x5F\x7C |0 - \x89\x5F\x7D |0 - \x89\x5F\x7E |0 - \x89\x60\x21 |0 - \x89\x60\x23 |0 - \x89\x60\x24 |0 - \x89\x60\x25 |0 \x87\x41\x40 |0 \x87\x41\x3D |0 - \x89\x5B\x6A |0 - \x89\x63\x36 |0 - \x89\x63\x37 |0 - \x89\x60\x22 |0 \x85\x68\x6A |0 \x85\x68\x6F |0 \x87\x48\x4E |0 @@ -40986,15 +36621,6 @@ CHARMAP \x85\x68\x61 |0 \x85\x68\x71 |0 \x87\x48\x49 |0 - \x89\x63\x31 |0 - \x89\x63\x33 |0 - \x89\x63\x34 |0 - \x89\x63\x35 |0 - \x89\x63\x38 |0 - \x89\x63\x39 |0 - \x89\x63\x3A |0 - \x89\x63\x3B |0 - \x89\x63\x3C |0 \x87\x48\x4B |0 \x87\x48\x4D |0 \x85\x6C\x7C |0 @@ -41026,8 +36652,6 @@ CHARMAP \x87\x4E\x70 |0 \x87\x4E\x72 |0 \x87\x4E\x73 |0 - \x89\x65\x68 |0 - \x89\x65\x69 |0 \x87\x4E\x6B |0 \x85\x70\x64 |0 \x85\x70\x68 |0 @@ -41054,13 +36678,6 @@ CHARMAP \x87\x54\x36 |0 \x87\x54\x30 |0 \x87\x54\x34 |0 - \x89\x68\x23 |0 - \x89\x68\x24 |0 - \x89\x68\x25 |0 - \x89\x68\x26 |0 - \x89\x68\x27 |0 - \x89\x68\x28 |0 - \x89\x68\x29 |0 \x87\x54\x33 |0 \x87\x54\x39 |0 \x87\x54\x32 |0 @@ -41085,10 +36702,6 @@ CHARMAP \x85\x73\x75 |0 \x85\x73\x72 |0 \x87\x58\x56 |0 - \x89\x69\x5F |0 - \x89\x69\x60 |0 - \x89\x69\x61 |0 - \x89\x69\x62 |0 \x87\x58\x53 |0 \x87\x59\x34 |0 \x84\x6A\x5E |0 @@ -41104,7 +36717,6 @@ CHARMAP \x85\x76\x35 |0 \x87\x5C\x36 |0 \x87\x5C\x35 |0 - \x89\x6A\x69 |0 \x87\x5C\x33 |0 \x87\x5C\x37 |0 \x87\x5C\x34 |0 @@ -41120,9 +36732,6 @@ CHARMAP \x85\x77\x73 |0 \x87\x5F\x31 |0 \x84\x6B\x77 |0 - \x89\x6B\x5A |0 - \x89\x6B\x5B |0 - \x89\x6B\x5C |0 \x87\x5F\x2F |0 \x85\x79\x35 |0 \x87\x61\x2C |0 @@ -41136,40 +36745,28 @@ CHARMAP \x85\x7A\x2F |0 \x85\x7A\x30 |0 \x87\x61\x30 |0 - \x89\x6C\x4F |0 - \x89\x6C\x4D |0 \x87\x63\x5E |0 \x87\x63\x5F |0 - \x89\x6C\x68 |0 \x87\x63\x60 |0 \x85\x7B\x44 |0 \x85\x7B\x64 |0 - \x89\x6D\x27 |0 \x87\x64\x54 |0 \x84\x6E\x4E |0 \x85\x7B\x7C |0 \x85\x7C\x2B |0 \x85\x24\x71 |0 - \x89\x25\x27 |0 \x85\x27\x4E |0 \x86\x2D\x51 |0 - \x89\x28\x45 |0 \x86\x33\x61 |0 \x85\x2B\x22 |0 \x86\x33\x60 |0 \x85\x2B\x23 |0 - \x89\x2C\x7E |0 - \x89\x2D\x22 |0 \x86\x3A\x52 |0 \x85\x2F\x54 |0 \x86\x3A\x56 |0 \x85\x2F\x55 |0 \x86\x3A\x54 |0 \x85\x2F\x56 |0 - \x89\x31\x6B |0 - \x89\x31\x6C |0 - \x89\x31\x6D |0 - \x89\x31\x6E |0 \x86\x3A\x53 |0 \x86\x3A\x55 |0 \x84\x33\x7E |0 @@ -41187,10 +36784,7 @@ CHARMAP \x86\x42\x7D |0 \x86\x4C\x63 |0 \x86\x43\x21 |0 - \x89\x37\x50 |0 - \x89\x37\x51 |0 \x86\x42\x7E |0 - \x89\x37\x52 |0 \x85\x3B\x26 |0 \x84\x39\x7A |0 \x86\x4C\x61 |0 @@ -41200,10 +36794,6 @@ CHARMAP \x84\x3A\x21 |0 \x86\x4C\x64 |0 \x86\x4C\x5F |0 - \x89\x3D\x7C |0 - \x89\x3D\x7E |0 - \x89\x3E\x22 |0 - \x89\x3D\x7B |0 \x86\x4C\x62 |0 \x85\x41\x57 |0 \x84\x3F\x68 |0 @@ -41219,14 +36809,8 @@ CHARMAP \x85\x41\x5D |0 \x85\x41\x5C |0 \x86\x56\x41 |0 - \x89\x44\x52 |0 - \x89\x44\x53 |0 - \x89\x44\x55 |0 - \x89\x44\x56 |0 \x86\x56\x3B |0 - \x89\x44\x54 |0 \x86\x56\x40 |0 - \x89\x44\x51 |0 \x86\x60\x2D |0 \x85\x48\x4A |0 \x86\x60\x2B |0 @@ -41240,23 +36824,9 @@ CHARMAP \x86\x60\x30 |0 \x85\x48\x49 |0 \x85\x48\x4D |0 - \x89\x4A\x7C |0 - \x89\x4A\x7D |0 - \x89\x4A\x7E |0 - \x89\x4B\x21 |0 - \x89\x4B\x22 |0 - \x89\x4B\x23 |0 - \x89\x4B\x25 |0 - \x89\x4B\x26 |0 - \x89\x4B\x28 |0 - \x89\x4B\x29 |0 - \x89\x4B\x2A |0 - \x89\x4B\x2D |0 \x86\x60\x2F |0 - \x89\x4B\x2C |0 \x86\x60\x29 |0 \x86\x60\x2A |0 - \x89\x4B\x24 |0 \x87\x26\x58 |0 \x87\x26\x54 |0 \x84\x4C\x36 |0 @@ -41279,10 +36849,6 @@ CHARMAP \x87\x26\x5A |0 \x85\x4F\x48 |0 \x85\x4F\x47 |0 - \x89\x51\x2B |0 - \x89\x51\x2C |0 - \x89\x51\x2D |0 - \x89\x51\x2F |0 \x85\x56\x6E |0 \x85\x56\x6C |0 \x85\x5D\x3C |0 @@ -41296,8 +36862,6 @@ CHARMAP \x85\x56\x6A |0 \x85\x56\x6D |0 \x85\x56\x70 |0 - \x89\x56\x74 |0 - \x89\x56\x75 |0 \x87\x31\x2E |0 \x85\x5D\x36 |0 \x85\x5D\x38 |0 @@ -41310,13 +36874,6 @@ CHARMAP \x87\x3A\x34 |0 \x87\x3A\x35 |0 \x87\x3A\x31 |0 - \x89\x5B\x6B |0 - \x89\x5B\x6C |0 - \x89\x5B\x6D |0 - \x89\x5B\x6F |0 - \x89\x5B\x70 |0 - \x89\x5B\x71 |0 - \x89\x5B\x72 |0 \x84\x57\x6C |0 \x85\x63\x52 |0 \x87\x41\x45 |0 @@ -41331,10 +36888,6 @@ CHARMAP \x87\x4E\x78 |0 \x85\x63\x4D |0 \x87\x41\x43 |0 - \x89\x60\x27 |0 - \x89\x60\x28 |0 - \x89\x60\x29 |0 - \x89\x5B\x6E |0 \x85\x68\x74 |0 \x87\x48\x4F |0 \x87\x48\x50 |0 @@ -41350,23 +36903,17 @@ CHARMAP \x85\x68\x75 |0 \x87\x41\x47 |0 \x85\x68\x72 |0 - \x89\x63\x3E |0 \x87\x48\x51 |0 \x87\x48\x54 |0 \x87\x48\x55 |0 - \x89\x63\x3F |0 \x87\x4E\x77 |0 \x85\x6C\x7E |0 \x87\x4E\x76 |0 - \x89\x65\x6A |0 - \x89\x65\x6B |0 \x84\x66\x73 |0 \x84\x66\x72 |0 \x85\x70\x6F |0 \x87\x54\x3D |0 \x87\x54\x3C |0 - \x89\x68\x2A |0 - \x89\x68\x2B |0 \x87\x54\x3B |0 \x85\x73\x77 |0 \x87\x58\x57 |0 @@ -41374,7 +36921,6 @@ CHARMAP \x84\x6A\x63 |0 \x84\x6A\x64 |0 \x87\x5C\x38 |0 - \x89\x6A\x6A |0 \x85\x76\x38 |0 \x87\x5C\x39 |0 \x87\x5F\x32 |0 @@ -41397,8 +36943,6 @@ CHARMAP \x85\x27\x4F |0 \x86\x2D\x52 |0 \x85\x27\x50 |0 - \x89\x28\x47 |0 - \x89\x28\x48 |0 \x85\x27\x51 |0 \x85\x2B\x26 |0 \x86\x33\x62 |0 @@ -41408,7 +36952,6 @@ CHARMAP \x86\x33\x67 |0 \x86\x33\x63 |0 \x85\x2B\x27 |0 - \x89\x2D\x23 |0 \x86\x33\x68 |0 \x86\x3A\x5B |0 \x86\x3A\x57 |0 @@ -41433,13 +36976,6 @@ CHARMAP \x85\x2F\x58 |0 \x85\x2F\x57 |0 \x86\x3A\x5A |0 - \x89\x31\x71 |0 - \x89\x31\x72 |0 - \x89\x31\x73 |0 - \x89\x31\x74 |0 - \x89\x31\x75 |0 - \x89\x31\x76 |0 - \x89\x31\x77 |0 \x84\x2F\x26 |0 \x86\x3A\x62 |0 \x85\x34\x5F |0 @@ -41460,13 +36996,8 @@ CHARMAP \x86\x43\x23 |0 \x86\x43\x24 |0 \x85\x34\x5C |0 - \x89\x37\x58 |0 - \x89\x37\x59 |0 - \x89\x37\x5A |0 - \x89\x37\x5B |0 \x86\x43\x27 |0 \x86\x43\x2C |0 - \x89\x37\x55 |0 \x85\x3B\x31 |0 \x85\x3B\x30 |0 \x85\x3B\x2E |0 @@ -41489,16 +37020,6 @@ CHARMAP \x85\x3B\x2A |0 \x85\x3B\x29 |0 \x85\x3B\x2B |0 - \x89\x3E\x25 |0 - \x89\x3E\x26 |0 - \x89\x3E\x27 |0 - \x89\x3E\x28 |0 - \x89\x3E\x29 |0 - \x89\x3E\x2A |0 - \x89\x3E\x2B |0 - \x89\x3E\x2C |0 - \x89\x3E\x2D |0 - \x89\x3E\x2E |0 \x86\x4C\x6B |0 \x85\x3B\x2F |0 \x86\x56\x4B |0 @@ -41523,18 +37044,6 @@ CHARMAP \x86\x56\x4D |0 \x84\x3F\x72 |0 \x86\x56\x4A |0 - \x89\x44\x57 |0 - \x89\x44\x58 |0 - \x89\x44\x59 |0 - \x89\x44\x5A |0 - \x89\x44\x5B |0 - \x89\x44\x5C |0 - \x89\x44\x5D |0 - \x89\x44\x5E |0 - \x89\x44\x5F |0 - \x89\x44\x60 |0 - \x89\x44\x61 |0 - \x89\x44\x62 |0 \x86\x56\x47 |0 \x84\x3F\x70 |0 \x84\x45\x78 |0 @@ -41564,16 +37073,6 @@ CHARMAP \x86\x60\x3B |0 \x84\x46\x22 |0 \x86\x60\x38 |0 - \x89\x4B\x2E |0 - \x89\x4B\x2F |0 - \x89\x4B\x30 |0 - \x89\x4B\x31 |0 - \x89\x4B\x32 |0 - \x89\x4B\x33 |0 - \x89\x4B\x34 |0 - \x89\x4B\x35 |0 - \x89\x4B\x36 |0 - \x89\x4B\x37 |0 \x86\x60\x35 |0 \x86\x60\x37 |0 \x86\x60\x3D |0 @@ -41610,18 +37109,6 @@ CHARMAP \x85\x4F\x51 |0 \x85\x4F\x56 |0 \x85\x4F\x5E |0 - \x89\x51\x30 |0 - \x89\x51\x31 |0 - \x89\x51\x32 |0 - \x89\x51\x33 |0 - \x89\x51\x34 |0 - \x89\x51\x35 |0 - \x89\x51\x38 |0 - \x89\x51\x39 |0 - \x89\x51\x3A |0 - \x89\x51\x3D |0 - \x89\x51\x3E |0 - \x89\x51\x3F |0 \x87\x26\x62 |0 \x87\x26\x68 |0 \x87\x26\x5F |0 @@ -41664,15 +37151,6 @@ CHARMAP \x87\x31\x3E |0 \x87\x31\x39 |0 \x87\x31\x3C |0 - \x89\x56\x76 |0 - \x89\x56\x77 |0 - \x89\x56\x78 |0 - \x89\x56\x79 |0 - \x89\x56\x7A |0 - \x89\x56\x7B |0 - \x89\x56\x7C |0 - \x89\x56\x7D |0 - \x89\x56\x7E |0 \x87\x3A\x44 |0 \x87\x3A\x43 |0 \x85\x5D\x43 |0 @@ -41693,19 +37171,6 @@ CHARMAP \x87\x3A\x41 |0 \x87\x3A\x3D |0 \x85\x5D\x47 |0 - \x89\x5B\x73 |0 - \x89\x5B\x74 |0 - \x89\x5B\x75 |0 - \x89\x5B\x77 |0 - \x89\x5B\x78 |0 - \x89\x5B\x79 |0 - \x89\x5B\x7A |0 - \x89\x5B\x7B |0 - \x89\x5B\x7C |0 - \x89\x5B\x7D |0 - \x89\x5B\x7E |0 - \x89\x5C\x21 |0 - \x89\x5C\x22 |0 \x87\x3A\x3F |0 \x87\x3A\x38 |0 \x84\x5C\x64 |0 @@ -41734,15 +37199,6 @@ CHARMAP \x87\x41\x5B |0 \x85\x63\x5A |0 \x87\x41\x56 |0 - \x89\x60\x2A |0 - \x89\x60\x2B |0 - \x89\x60\x2C |0 - \x89\x60\x2D |0 - \x89\x60\x2E |0 - \x89\x60\x2F |0 - \x89\x60\x30 |0 - \x89\x60\x31 |0 - \x89\x60\x32 |0 \x85\x63\x59 |0 \x87\x41\x5C |0 \x87\x41\x5A |0 @@ -41774,11 +37230,6 @@ CHARMAP \x87\x48\x5A |0 \x87\x48\x60 |0 \x87\x48\x5E |0 - \x89\x63\x40 |0 - \x89\x63\x41 |0 - \x89\x63\x43 |0 - \x89\x63\x44 |0 - \x89\x63\x45 |0 \x87\x4A\x73 |0 \x87\x48\x5C |0 \x87\x48\x65 |0 @@ -41801,11 +37252,6 @@ CHARMAP \x87\x4F\x22 |0 \x87\x4E\x79 |0 \x87\x4F\x25 |0 - \x89\x65\x6C |0 - \x89\x65\x6D |0 - \x89\x65\x6E |0 - \x89\x65\x70 |0 - \x89\x65\x71 |0 \x87\x4F\x21 |0 \x85\x70\x72 |0 \x84\x66\x75 |0 @@ -41819,10 +37265,6 @@ CHARMAP \x87\x54\x3F |0 \x87\x54\x3E |0 \x87\x54\x41 |0 - \x89\x68\x2C |0 - \x89\x68\x2D |0 - \x89\x68\x2E |0 - \x89\x68\x2F |0 \x84\x66\x74 |0 \x87\x54\x40 |0 \x85\x70\x71 |0 @@ -41836,10 +37278,6 @@ CHARMAP \x87\x58\x5D |0 \x85\x73\x7A |0 \x87\x58\x5B |0 - \x89\x69\x63 |0 - \x89\x69\x64 |0 - \x89\x69\x65 |0 - \x89\x69\x66 |0 \x87\x58\x5A |0 \x87\x58\x5C |0 \x84\x69\x4B |0 @@ -41853,7 +37291,6 @@ CHARMAP \x85\x77\x78 |0 \x87\x5F\x37 |0 \x87\x5F\x35 |0 - \x89\x6B\x5D |0 \x87\x5F\x36 |0 \x87\x5F\x38 |0 \x85\x79\x3A |0 @@ -41863,12 +37300,10 @@ CHARMAP \x87\x62\x4F |0 \x87\x62\x4E |0 \x87\x63\x63 |0 - \x89\x6C\x69 |0 \x87\x63\x65 |0 \x87\x63\x64 |0 \x87\x64\x55 |0 \x85\x7B\x65 |0 - \x89\x6D\x30 |0 \x87\x65\x75 |0 \x86\x25\x42 |0 \x84\x2A\x78 |0 @@ -41885,7 +37320,6 @@ CHARMAP \x84\x3A\x29 |0 \x86\x4C\x73 |0 \x85\x3B\x33 |0 - \x89\x3E\x2F |0 \x86\x56\x50 |0 \x86\x56\x4F |0 \x84\x3F\x74 |0 @@ -41894,37 +37328,24 @@ CHARMAP \x85\x48\x58 |0 \x86\x60\x44 |0 \x87\x26\x6E |0 - \x89\x4B\x39 |0 - \x89\x4B\x3A |0 - \x89\x4B\x3B |0 \x87\x26\x70 |0 \x84\x4C\x47 |0 - \x89\x51\x40 |0 - \x89\x51\x41 |0 \x87\x26\x6F |0 \x85\x56\x7B |0 \x85\x56\x7A |0 - \x89\x57\x22 |0 - \x89\x57\x21 |0 \x85\x5D\x49 |0 \x87\x3A\x45 |0 \x85\x5D\x48 |0 - \x89\x5A\x58 |0 - \x89\x5C\x23 |0 - \x89\x5C\x24 |0 \x87\x41\x5D |0 \x87\x41\x5E |0 - \x89\x60\x33 |0 \x87\x48\x68 |0 \x84\x60\x6C |0 - \x89\x63\x46 |0 \x85\x70\x74 |0 \x84\x64\x27 |0 \x84\x66\x7A |0 \x87\x54\x45 |0 \x84\x6A\x6A |0 \x87\x5C\x3C |0 - \x89\x6A\x6B |0 \x87\x5F\x3A |0 \x87\x5F\x39 |0 \x85\x7A\x34 |0 @@ -41935,10 +37356,7 @@ CHARMAP \x86\x25\x44 |0 \x86\x25\x45 |0 \x86\x28\x73 |0 - \x89\x21\x7C |0 \x86\x25\x43 |0 - \x89\x25\x28 |0 - \x89\x25\x2A |0 \x86\x2D\x53 |0 \x86\x33\x6A |0 \x84\x27\x5D |0 @@ -41950,9 +37368,7 @@ CHARMAP \x86\x33\x6B |0 \x84\x2A\x7A |0 \x84\x2A\x7C |0 - \x89\x25\x56 |0 \x85\x2B\x29 |0 - \x89\x28\x49 |0 \x85\x27\x52 |0 \x86\x3A\x67 |0 \x86\x3A\x68 |0 @@ -41966,14 +37382,12 @@ CHARMAP \x86\x33\x6C |0 \x86\x33\x6F |0 \x86\x43\x35 |0 - \x89\x29\x39 |0 \x85\x2F\x5D |0 \x86\x43\x30 |0 \x86\x43\x31 |0 \x86\x43\x32 |0 \x86\x43\x34 |0 \x86\x43\x36 |0 - \x89\x31\x79 |0 \x86\x33\x6D |0 \x86\x36\x7A |0 \x85\x2B\x2A |0 @@ -41986,13 +37400,11 @@ CHARMAP \x86\x43\x38 |0 \x85\x2F\x5E |0 \x85\x34\x62 |0 - \x89\x37\x5C |0 \x86\x4C\x75 |0 \x85\x3B\x36 |0 \x85\x3B\x35 |0 \x84\x3A\x2C |0 \x86\x4C\x78 |0 - \x89\x3E\x30 |0 \x86\x56\x52 |0 \x85\x41\x67 |0 \x86\x56\x54 |0 @@ -42003,9 +37415,7 @@ CHARMAP \x86\x56\x55 |0 \x86\x4C\x79 |0 \x86\x56\x56 |0 - \x89\x3E\x31 |0 \x86\x56\x51 |0 - \x89\x44\x63 |0 \x86\x60\x46 |0 \x86\x60\x48 |0 \x86\x60\x49 |0 @@ -42022,7 +37432,6 @@ CHARMAP \x85\x48\x59 |0 \x86\x60\x4F |0 \x86\x60\x47 |0 - \x89\x4B\x3C |0 \x87\x26\x71 |0 \x87\x26\x72 |0 \x87\x26\x73 |0 @@ -42034,8 +37443,6 @@ CHARMAP \x85\x4F\x60 |0 \x85\x4F\x61 |0 \x86\x60\x51 |0 - \x89\x51\x42 |0 - \x89\x51\x43 |0 \x87\x25\x73 |0 \x87\x31\x47 |0 \x87\x31\x48 |0 @@ -42061,8 +37468,6 @@ CHARMAP \x85\x63\x5B |0 \x87\x3A\x4C |0 \x87\x3A\x4D |0 - \x89\x5C\x25 |0 - \x89\x57\x23 |0 \x87\x41\x5F |0 \x87\x41\x60 |0 \x87\x41\x62 |0 @@ -42102,15 +37507,12 @@ CHARMAP \x87\x65\x3C |0 \x84\x24\x6C |0 \x84\x23\x2C |0 - \x89\x21\x60 |0 \x86\x2D\x56 |0 \x85\x27\x53 |0 \x86\x2D\x55 |0 - \x89\x2D\x24 |0 \x86\x33\x71 |0 \x86\x33\x70 |0 \x84\x2A\x7E |0 - \x89\x28\x4B |0 \x86\x3A\x6E |0 \x86\x3A\x6F |0 \x86\x43\x3B |0 @@ -42119,19 +37521,14 @@ CHARMAP \x86\x3A\x71 |0 \x86\x3A\x70 |0 \x86\x43\x3A |0 - \x89\x31\x7A |0 - \x89\x31\x7B |0 \x86\x43\x3D |0 \x85\x34\x64 |0 \x84\x3A\x2E |0 \x86\x43\x3E |0 \x84\x34\x39 |0 \x85\x34\x65 |0 - \x89\x37\x5D |0 \x85\x34\x63 |0 \x86\x43\x39 |0 - \x89\x37\x5E |0 - \x89\x37\x5F |0 \x86\x43\x3F |0 \x85\x3B\x39 |0 \x85\x3B\x37 |0 @@ -42151,8 +37548,6 @@ CHARMAP \x86\x56\x59 |0 \x86\x56\x5C |0 \x85\x41\x6A |0 - \x89\x3E\x33 |0 - \x89\x3E\x34 |0 \x85\x48\x5C |0 \x86\x60\x53 |0 \x86\x60\x55 |0 @@ -42169,7 +37564,6 @@ CHARMAP \x85\x57\x21 |0 \x85\x56\x7E |0 \x84\x52\x52 |0 - \x89\x57\x25 |0 \x87\x31\x50 |0 \x84\x57\x78 |0 \x84\x57\x76 |0 @@ -42177,7 +37571,6 @@ CHARMAP \x87\x3A\x50 |0 \x87\x3A\x4F |0 \x87\x3A\x52 |0 - \x89\x5C\x26 |0 \x84\x52\x54 |0 \x87\x3A\x51 |0 \x85\x63\x5D |0 @@ -42189,9 +37582,6 @@ CHARMAP \x87\x41\x67 |0 \x87\x41\x68 |0 \x87\x41\x66 |0 - \x89\x57\x24 |0 - \x89\x60\x34 |0 - \x89\x60\x35 |0 \x84\x5C\x6C |0 \x85\x68\x7C |0 \x87\x48\x70 |0 @@ -42225,8 +37615,6 @@ CHARMAP \x84\x2B\x24 |0 \x86\x33\x74 |0 \x84\x2B\x23 |0 - \x89\x2D\x25 |0 - \x89\x2D\x26 |0 \x86\x33\x73 |0 \x84\x2F\x33 |0 \x86\x3A\x76 |0 @@ -42241,10 +37629,7 @@ CHARMAP \x84\x2F\x34 |0 \x84\x2F\x32 |0 \x86\x3A\x77 |0 - \x89\x2F\x63 |0 - \x89\x2F\x64 |0 \x84\x2F\x37 |0 - \x89\x31\x7C |0 \x85\x34\x66 |0 \x86\x43\x41 |0 \x86\x43\x40 |0 @@ -42271,8 +37656,6 @@ CHARMAP \x86\x4D\x2A |0 \x86\x4D\x2C |0 \x86\x4D\x2B |0 - \x89\x3E\x35 |0 - \x89\x3E\x36 |0 \x86\x4D\x29 |0 \x85\x41\x6E |0 \x85\x41\x6B |0 @@ -42282,7 +37665,6 @@ CHARMAP \x86\x56\x5F |0 \x85\x41\x6D |0 \x85\x41\x6C |0 - \x89\x44\x64 |0 \x86\x4D\x24 |0 \x85\x48\x65 |0 \x85\x48\x5E |0 @@ -42295,10 +37677,6 @@ CHARMAP \x85\x48\x62 |0 \x86\x60\x56 |0 \x85\x48\x66 |0 - \x89\x4B\x3D |0 - \x89\x4B\x3E |0 - \x89\x4B\x3F |0 - \x89\x4B\x40 |0 \x85\x4F\x6A |0 \x85\x4F\x6B |0 \x87\x26\x7E |0 @@ -42308,7 +37686,6 @@ CHARMAP \x85\x4F\x65 |0 \x87\x26\x7D |0 \x85\x4F\x67 |0 - \x89\x51\x46 |0 \x86\x60\x59 |0 \x85\x4F\x66 |0 \x87\x27\x24 |0 @@ -42318,8 +37695,6 @@ CHARMAP \x87\x27\x22 |0 \x84\x4C\x4D |0 \x87\x27\x23 |0 - \x89\x51\x44 |0 - \x89\x51\x45 |0 \x87\x31\x51 |0 \x87\x31\x53 |0 \x85\x57\x25 |0 @@ -42334,7 +37709,6 @@ CHARMAP \x85\x57\x22 |0 \x87\x31\x55 |0 \x85\x57\x27 |0 - \x89\x57\x26 |0 \x84\x57\x79 |0 \x87\x3A\x54 |0 \x85\x5D\x4C |0 @@ -42342,8 +37716,6 @@ CHARMAP \x87\x48\x71 |0 \x85\x5D\x4D |0 \x87\x3A\x53 |0 - \x89\x5C\x27 |0 - \x89\x5C\x28 |0 \x85\x63\x60 |0 \x84\x5C\x6E |0 \x87\x41\x71 |0 @@ -42354,8 +37726,6 @@ CHARMAP \x87\x41\x6C |0 \x87\x41\x70 |0 \x87\x41\x6E |0 - \x89\x60\x36 |0 - \x89\x60\x37 |0 \x87\x41\x6B |0 \x84\x60\x70 |0 \x85\x68\x7E |0 @@ -42363,7 +37733,6 @@ CHARMAP \x87\x48\x72 |0 \x87\x4F\x35 |0 \x87\x4F\x36 |0 - \x89\x65\x72 |0 \x87\x4F\x33 |0 \x84\x66\x7C |0 \x87\x54\x49 |0 @@ -42381,18 +37750,14 @@ CHARMAP \x86\x3A\x78 |0 \x84\x34\x40 |0 \x85\x2B\x2C |0 - \x89\x37\x60 |0 - \x89\x37\x61 |0 \x86\x43\x48 |0 \x86\x4D\x31 |0 \x87\x27\x26 |0 \x87\x31\x58 |0 \x87\x31\x57 |0 - \x89\x6B\x5E |0 \x86\x2D\x59 |0 \x86\x2D\x5A |0 \x85\x21\x79 |0 - \x89\x28\x4C |0 \x84\x2F\x39 |0 \x85\x34\x67 |0 \x85\x3B\x3E |0 @@ -42406,13 +37771,9 @@ CHARMAP \x87\x3A\x56 |0 \x85\x23\x21 |0 \x86\x2D\x5B |0 - \x89\x28\x4D |0 \x86\x33\x77 |0 - \x89\x2D\x27 |0 \x86\x33\x78 |0 - \x89\x31\x7E |0 \x85\x34\x68 |0 - \x89\x37\x62 |0 \x86\x43\x49 |0 \x84\x3A\x37 |0 \x85\x3B\x41 |0 @@ -42427,7 +37788,6 @@ CHARMAP \x85\x48\x69 |0 \x85\x48\x6B |0 \x84\x46\x31 |0 - \x89\x44\x65 |0 \x86\x60\x5B |0 \x85\x4F\x6F |0 \x85\x4F\x70 |0 @@ -42442,13 +37802,11 @@ CHARMAP \x87\x31\x5C |0 \x87\x31\x5D |0 \x87\x31\x5B |0 - \x89\x51\x47 |0 \x85\x5D\x4F |0 \x84\x57\x7C |0 \x87\x3A\x5A |0 \x87\x3A\x57 |0 \x87\x3A\x58 |0 - \x89\x57\x29 |0 \x85\x63\x61 |0 \x84\x57\x7E |0 \x87\x41\x72 |0 @@ -42457,8 +37815,6 @@ CHARMAP \x85\x63\x62 |0 \x87\x41\x74 |0 \x87\x41\x73 |0 - \x89\x5C\x29 |0 - \x89\x5C\x2A |0 \x87\x48\x74 |0 \x85\x69\x21 |0 \x87\x48\x73 |0 @@ -42470,8 +37826,6 @@ CHARMAP \x85\x27\x55 |0 \x85\x27\x54 |0 \x86\x2D\x5E |0 - \x89\x28\x4E |0 - \x89\x28\x4F |0 \x86\x2D\x5D |0 \x85\x2B\x2F |0 \x85\x2B\x2D |0 @@ -42482,17 +37836,11 @@ CHARMAP \x86\x3A\x7A |0 \x85\x2F\x64 |0 \x86\x3B\x22 |0 - \x89\x32\x21 |0 - \x89\x32\x24 |0 - \x89\x32\x26 |0 - \x89\x32\x27 |0 \x86\x3A\x7B |0 - \x89\x32\x22 |0 \x86\x3A\x7D |0 \x86\x3A\x7C |0 \x86\x3B\x23 |0 \x86\x3A\x79 |0 - \x89\x32\x25 |0 \x85\x2F\x65 |0 \x86\x43\x4B |0 \x84\x34\x43 |0 @@ -42504,26 +37852,12 @@ CHARMAP \x86\x43\x4E |0 \x86\x43\x4C |0 \x86\x43\x4A |0 - \x89\x37\x63 |0 - \x89\x37\x64 |0 - \x89\x37\x65 |0 - \x89\x37\x66 |0 \x85\x3B\x42 |0 \x86\x4D\x33 |0 \x86\x4D\x34 |0 \x85\x3B\x43 |0 \x86\x4D\x35 |0 - \x89\x3E\x37 |0 - \x89\x3E\x38 |0 - \x89\x3E\x39 |0 - \x89\x3E\x3A |0 - \x89\x3E\x3C |0 - \x89\x3E\x3D |0 - \x89\x3E\x3E |0 - \x89\x3E\x3F |0 - \x89\x3E\x40 |0 \x86\x4D\x32 |0 - \x89\x3E\x3B |0 \x86\x56\x62 |0 \x86\x56\x66 |0 \x85\x41\x71 |0 @@ -42537,8 +37871,6 @@ CHARMAP \x86\x56\x64 |0 \x86\x56\x6A |0 \x86\x56\x63 |0 - \x89\x44\x66 |0 - \x89\x44\x67 |0 \x86\x56\x65 |0 \x85\x48\x70 |0 \x85\x48\x71 |0 @@ -42548,17 +37880,6 @@ CHARMAP \x85\x48\x72 |0 \x85\x48\x6F |0 \x85\x48\x73 |0 - \x89\x4B\x41 |0 - \x89\x4B\x42 |0 - \x89\x4B\x43 |0 - \x89\x4B\x44 |0 - \x89\x4B\x45 |0 - \x89\x4B\x46 |0 - \x89\x4B\x47 |0 - \x89\x4B\x48 |0 - \x89\x4B\x4A |0 - \x89\x4B\x4B |0 - \x89\x4B\x4C |0 \x86\x60\x5F |0 \x85\x4F\x72 |0 \x87\x27\x2C |0 @@ -42571,14 +37892,6 @@ CHARMAP \x87\x27\x2B |0 \x87\x27\x30 |0 \x85\x4F\x76 |0 - \x89\x51\x48 |0 - \x89\x51\x49 |0 - \x89\x51\x4A |0 - \x89\x51\x4B |0 - \x89\x51\x4C |0 - \x89\x51\x4D |0 - \x89\x51\x4E |0 - \x89\x51\x4F |0 \x87\x27\x2D |0 \x85\x57\x2C |0 \x85\x57\x2F |0 @@ -42588,12 +37901,6 @@ CHARMAP \x87\x31\x61 |0 \x87\x31\x5F |0 \x87\x31\x5E |0 - \x89\x57\x2A |0 - \x89\x57\x2B |0 - \x89\x57\x2C |0 - \x89\x57\x2D |0 - \x89\x57\x2E |0 - \x89\x57\x2F |0 \x87\x31\x60 |0 \x85\x57\x2A |0 \x85\x5D\x50 |0 @@ -42604,7 +37911,6 @@ CHARMAP \x84\x58\x26 |0 \x85\x5D\x54 |0 \x85\x5D\x53 |0 - \x89\x5C\x2C |0 \x87\x3A\x5D |0 \x87\x3A\x5C |0 \x83\x58\x63 |0 @@ -42618,37 +37924,21 @@ CHARMAP \x85\x63\x64 |0 \x85\x63\x65 |0 \x87\x41\x75 |0 - \x89\x60\x38 |0 - \x89\x60\x39 |0 - \x89\x60\x3A |0 \x87\x41\x76 |0 - \x89\x5C\x2B |0 - \x89\x63\x47 |0 \x87\x48\x76 |0 \x85\x69\x22 |0 \x85\x69\x23 |0 \x87\x48\x78 |0 \x87\x48\x77 |0 - \x89\x63\x48 |0 - \x89\x63\x49 |0 \x87\x4F\x39 |0 - \x89\x65\x73 |0 - \x89\x65\x74 |0 - \x89\x65\x75 |0 \x87\x4F\x38 |0 \x87\x4F\x37 |0 \x85\x70\x76 |0 - \x89\x68\x30 |0 - \x89\x68\x31 |0 \x87\x54\x4D |0 \x87\x54\x4E |0 \x85\x73\x7E |0 \x87\x58\x64 |0 \x84\x6A\x6D |0 - \x89\x6A\x6C |0 - \x89\x6B\x5F |0 - \x89\x6C\x36 |0 - \x89\x6C\x50 |0 \x85\x21\x7A |0 \x86\x2D\x5F |0 \x85\x2B\x30 |0 @@ -42659,7 +37949,6 @@ CHARMAP \x86\x60\x62 |0 \x86\x60\x61 |0 \x87\x27\x31 |0 - \x89\x51\x50 |0 \x87\x31\x62 |0 \x87\x4F\x3A |0 \x85\x23\x25 |0 @@ -42667,8 +37956,6 @@ CHARMAP \x86\x2D\x60 |0 \x86\x2D\x61 |0 \x86\x25\x48 |0 - \x89\x22\x6C |0 - \x89\x22\x6D |0 \x85\x23\x24 |0 \x85\x23\x22 |0 \x85\x24\x73 |0 @@ -42696,10 +37983,6 @@ CHARMAP \x84\x27\x6B |0 \x86\x2D\x68 |0 \x86\x2D\x6F |0 - \x89\x28\x50 |0 - \x89\x28\x51 |0 - \x89\x28\x53 |0 - \x89\x28\x54 |0 \x86\x2D\x6C |0 \x84\x26\x64 |0 \x86\x2D\x65 |0 @@ -42736,10 +38019,6 @@ CHARMAP \x86\x34\x21 |0 \x86\x34\x22 |0 \x86\x34\x24 |0 - \x89\x2D\x2A |0 - \x89\x2D\x2F |0 - \x89\x37\x67 |0 - \x89\x37\x68 |0 \x86\x33\x7E |0 \x86\x34\x2F |0 \x86\x34\x2C |0 @@ -42748,12 +38027,10 @@ CHARMAP \x86\x34\x2E |0 \x86\x43\x53 |0 \x86\x43\x52 |0 - \x89\x2D\x2B |0 \x86\x43\x55 |0 \x86\x43\x56 |0 \x86\x3B\x30 |0 \x86\x43\x51 |0 - \x89\x2D\x2D |0 \x85\x2F\x67 |0 \x84\x2F\x3E |0 \x84\x34\x45 |0 @@ -42773,11 +38050,6 @@ CHARMAP \x84\x2F\x40 |0 \x86\x4D\x3B |0 \x85\x2F\x69 |0 - \x89\x2D\x29 |0 - \x89\x32\x28 |0 - \x89\x32\x29 |0 - \x89\x32\x2D |0 - \x89\x3E\x4C |0 \x85\x2F\x68 |0 \x85\x2E\x24 |0 \x86\x3B\x2F |0 @@ -42816,8 +38088,6 @@ CHARMAP \x85\x34\x72 |0 \x86\x43\x61 |0 \x86\x43\x62 |0 - \x89\x37\x69 |0 - \x89\x37\x6B |0 \x86\x43\x5C |0 \x86\x43\x5D |0 \x86\x56\x6F |0 @@ -42851,17 +38121,8 @@ CHARMAP \x86\x4D\x3E |0 \x86\x4D\x47 |0 \x86\x4D\x4A |0 - \x89\x3E\x41 |0 - \x89\x3E\x44 |0 - \x89\x3E\x46 |0 - \x89\x3E\x47 |0 - \x89\x3E\x48 |0 - \x89\x3E\x49 |0 - \x89\x3E\x4A |0 - \x89\x3E\x4B |0 \x86\x4D\x44 |0 \x86\x4D\x49 |0 - \x89\x3B\x63 |0 \x86\x4D\x4D |0 \x86\x4D\x41 |0 \x86\x4D\x52 |0 @@ -42870,7 +38131,6 @@ CHARMAP \x86\x60\x63 |0 \x86\x60\x67 |0 \x86\x60\x64 |0 - \x89\x3E\x45 |0 \x85\x3B\x49 |0 \x86\x4D\x46 |0 \x85\x34\x6D |0 @@ -42913,17 +38173,9 @@ CHARMAP \x86\x56\x7A |0 \x85\x41\x76 |0 \x86\x56\x7E |0 - \x89\x44\x69 |0 - \x89\x44\x6A |0 - \x89\x44\x6B |0 - \x89\x44\x6C |0 - \x89\x44\x6D |0 - \x89\x44\x6F |0 - \x89\x44\x71 |0 \x84\x40\x2B |0 \x86\x57\x23 |0 \x86\x57\x22 |0 - \x89\x44\x70 |0 \x87\x27\x32 |0 \x87\x27\x33 |0 \x86\x56\x7B |0 @@ -42956,13 +38208,6 @@ CHARMAP \x85\x49\x22 |0 \x84\x46\x48 |0 \x86\x60\x6B |0 - \x89\x4B\x4D |0 - \x89\x4B\x4E |0 - \x89\x4B\x4F |0 - \x89\x4B\x51 |0 - \x89\x4B\x52 |0 - \x89\x4B\x55 |0 - \x89\x4B\x53 |0 \x86\x60\x70 |0 \x86\x5D\x5C |0 \x85\x41\x77 |0 @@ -42982,17 +38227,12 @@ CHARMAP \x87\x3A\x5E |0 \x85\x4F\x78 |0 \x87\x27\x38 |0 - \x89\x51\x51 |0 - \x89\x51\x52 |0 - \x89\x51\x53 |0 - \x89\x51\x54 |0 \x87\x27\x36 |0 \x87\x27\x39 |0 \x87\x27\x3A |0 \x87\x3A\x5F |0 \x86\x60\x69 |0 \x85\x4F\x79 |0 - \x89\x5C\x35 |0 \x87\x31\x6C |0 \x85\x57\x37 |0 \x85\x57\x32 |0 @@ -43014,9 +38254,6 @@ CHARMAP \x85\x69\x24 |0 \x84\x52\x60 |0 \x87\x31\x6F |0 - \x89\x57\x31 |0 - \x89\x57\x33 |0 - \x89\x57\x32 |0 \x87\x27\x3C |0 \x87\x31\x68 |0 \x87\x31\x69 |0 @@ -43044,14 +38281,6 @@ CHARMAP \x87\x48\x7B |0 \x85\x5D\x5E |0 \x87\x3A\x65 |0 - \x89\x5C\x2E |0 - \x89\x5C\x2F |0 - \x89\x5C\x31 |0 - \x89\x5C\x32 |0 - \x89\x5C\x33 |0 - \x89\x5C\x34 |0 - \x89\x5C\x36 |0 - \x89\x5C\x30 |0 \x87\x37\x7E |0 \x87\x3A\x63 |0 \x87\x48\x7A |0 @@ -43075,11 +38304,6 @@ CHARMAP \x85\x63\x68 |0 \x85\x6D\x2A |0 \x85\x63\x6F |0 - \x89\x60\x3B |0 - \x89\x60\x3C |0 - \x89\x60\x3D |0 - \x89\x60\x40 |0 - \x89\x60\x41 |0 \x87\x41\x7D |0 \x87\x42\x6D |0 \x84\x5C\x73 |0 @@ -43090,17 +38314,13 @@ CHARMAP \x85\x69\x26 |0 \x85\x63\x6D |0 \x87\x49\x24 |0 - \x89\x63\x4A |0 \x87\x49\x28 |0 \x87\x49\x2A |0 - \x89\x63\x4C |0 - \x89\x63\x4D |0 \x87\x49\x22 |0 \x87\x49\x26 |0 \x87\x49\x25 |0 \x87\x49\x27 |0 \x87\x49\x21 |0 - \x89\x63\x4B |0 \x87\x49\x2B |0 \x87\x4F\x3D |0 \x85\x6D\x2E |0 @@ -43108,7 +38328,6 @@ CHARMAP \x84\x64\x2B |0 \x84\x64\x29 |0 \x85\x6D\x2B |0 - \x89\x65\x76 |0 \x87\x4F\x3C |0 \x87\x4F\x3B |0 \x84\x67\x26 |0 @@ -43120,7 +38339,6 @@ CHARMAP \x84\x69\x31 |0 \x84\x69\x2F |0 \x87\x58\x65 |0 - \x89\x68\x33 |0 \x87\x5C\x41 |0 \x85\x76\x3D |0 \x87\x5C\x43 |0 @@ -43140,21 +38358,12 @@ CHARMAP \x85\x7B\x45 |0 \x86\x28\x7C |0 \x84\x24\x71 |0 - \x89\x2A\x49 |0 \x86\x3B\x34 |0 - \x89\x32\x2F |0 \x86\x4D\x56 |0 \x86\x4D\x57 |0 - \x89\x4B\x58 |0 - \x89\x4B\x59 |0 - \x89\x51\x56 |0 \x86\x60\x73 |0 - \x89\x5C\x37 |0 \x87\x42\x25 |0 - \x89\x60\x42 |0 \x85\x70\x79 |0 - \x89\x68\x34 |0 - \x89\x69\x67 |0 \x87\x65\x3D |0 \x85\x7C\x2C |0 \x86\x25\x4A |0 @@ -43164,38 +38373,29 @@ CHARMAP \x86\x2D\x70 |0 \x85\x2B\x3A |0 \x86\x34\x32 |0 - \x89\x2D\x30 |0 \x85\x2F\x72 |0 \x86\x3B\x36 |0 \x84\x2F\x49 |0 - \x89\x32\x30 |0 \x86\x3B\x37 |0 \x86\x3B\x35 |0 \x86\x43\x66 |0 \x86\x43\x65 |0 - \x89\x37\x6D |0 - \x89\x37\x6E |0 \x86\x4D\x59 |0 \x86\x4D\x5A |0 \x86\x57\x24 |0 \x85\x49\x25 |0 - \x89\x4B\x5A |0 \x84\x4C\x60 |0 \x84\x4C\x61 |0 \x85\x4F\x7E |0 - \x89\x51\x57 |0 \x87\x27\x3D |0 \x84\x52\x69 |0 \x85\x57\x3C |0 \x87\x3A\x66 |0 \x85\x5D\x60 |0 \x85\x5D\x5F |0 - \x89\x5C\x38 |0 - \x89\x60\x43 |0 \x85\x69\x27 |0 \x84\x60\x75 |0 \x85\x6D\x31 |0 - \x89\x63\x4E |0 \x87\x49\x2C |0 \x85\x6D\x2F |0 \x85\x6D\x30 |0 @@ -43204,7 +38404,6 @@ CHARMAP \x86\x2D\x71 |0 \x86\x2D\x72 |0 \x86\x3B\x3A |0 - \x89\x2D\x31 |0 \x86\x3B\x38 |0 \x86\x3B\x39 |0 \x85\x34\x77 |0 @@ -43212,15 +38411,12 @@ CHARMAP \x86\x4D\x5B |0 \x85\x42\x2A |0 \x85\x49\x26 |0 - \x89\x4B\x5B |0 \x85\x50\x21 |0 \x87\x27\x3E |0 - \x89\x51\x58 |0 \x85\x50\x22 |0 \x87\x31\x71 |0 \x84\x52\x6A |0 \x85\x57\x3D |0 - \x89\x57\x34 |0 \x84\x58\x2F |0 \x85\x63\x70 |0 \x85\x63\x71 |0 @@ -43229,7 +38425,6 @@ CHARMAP \x86\x23\x64 |0 \x86\x2D\x73 |0 \x86\x2D\x74 |0 - \x89\x2D\x32 |0 \x84\x2F\x4B |0 \x86\x34\x33 |0 \x86\x3B\x3B |0 @@ -43273,7 +38468,6 @@ CHARMAP \x87\x31\x72 |0 \x87\x27\x45 |0 \x87\x27\x46 |0 - \x89\x57\x35 |0 \x87\x31\x74 |0 \x87\x31\x73 |0 \x85\x5D\x62 |0 @@ -43288,8 +38482,6 @@ CHARMAP \x85\x5D\x65 |0 \x84\x5C\x77 |0 \x87\x42\x26 |0 - \x89\x60\x44 |0 - \x89\x60\x45 |0 \x87\x49\x2D |0 \x85\x63\x73 |0 \x85\x63\x72 |0 @@ -43301,16 +38493,11 @@ CHARMAP \x85\x6D\x35 |0 \x87\x4F\x3E |0 \x87\x49\x2F |0 - \x89\x63\x4F |0 \x85\x69\x29 |0 \x87\x4F\x40 |0 \x87\x4F\x41 |0 \x85\x70\x7A |0 - \x89\x65\x78 |0 - \x89\x68\x35 |0 - \x89\x68\x37 |0 \x87\x58\x66 |0 - \x89\x68\x36 |0 \x87\x58\x67 |0 \x87\x5C\x49 |0 \x85\x77\x7E |0 @@ -43318,12 +38505,10 @@ CHARMAP \x85\x79\x3D |0 \x85\x79\x3F |0 \x85\x79\x3E |0 - \x89\x6C\x6A |0 \x87\x65\x3E |0 \x87\x65\x3F |0 \x87\x66\x53 |0 \x85\x7C\x50 |0 - \x89\x25\x2B |0 \x86\x34\x34 |0 \x84\x2F\x4E |0 \x84\x2F\x4D |0 @@ -43338,25 +38523,21 @@ CHARMAP \x86\x4D\x60 |0 \x86\x4D\x5F |0 \x86\x4D\x61 |0 - \x89\x3E\x50 |0 \x85\x49\x29 |0 \x84\x46\x4D |0 \x85\x45\x53 |0 \x84\x46\x4E |0 \x86\x57\x29 |0 - \x89\x4B\x5C |0 \x86\x60\x7C |0 \x86\x60\x7E |0 \x86\x60\x7D |0 \x87\x27\x47 |0 - \x89\x51\x59 |0 \x87\x27\x49 |0 \x87\x27\x48 |0 \x87\x31\x78 |0 \x85\x57\x3E |0 \x87\x31\x79 |0 \x87\x3A\x68 |0 - \x89\x60\x46 |0 \x85\x63\x74 |0 \x87\x42\x2A |0 \x87\x42\x29 |0 @@ -43366,7 +38547,6 @@ CHARMAP \x85\x76\x3E |0 \x85\x50\x26 |0 \x85\x50\x27 |0 - \x89\x60\x47 |0 \x87\x4F\x42 |0 \x87\x5C\x4B |0 \x87\x5F\x3F |0 @@ -43402,10 +38582,7 @@ CHARMAP \x85\x34\x7B |0 \x86\x43\x6E |0 \x86\x43\x6F |0 - \x89\x37\x71 |0 \x85\x34\x79 |0 - \x89\x37\x70 |0 - \x89\x37\x72 |0 \x85\x3B\x54 |0 \x86\x4D\x65 |0 \x86\x4D\x64 |0 @@ -43419,7 +38596,6 @@ CHARMAP \x86\x57\x2C |0 \x85\x42\x2C |0 \x86\x57\x2A |0 - \x89\x44\x72 |0 \x86\x57\x2B |0 \x86\x57\x2D |0 \x86\x57\x2E |0 @@ -43430,9 +38606,6 @@ CHARMAP \x84\x46\x52 |0 \x86\x61\x22 |0 \x86\x61\x26 |0 - \x89\x4B\x5E |0 - \x89\x4B\x5F |0 - \x89\x4B\x5D |0 \x86\x61\x23 |0 \x85\x49\x2A |0 \x85\x50\x2F |0 @@ -43463,7 +38636,6 @@ CHARMAP \x87\x32\x23 |0 \x85\x57\x41 |0 \x87\x32\x22 |0 - \x89\x57\x36 |0 \x87\x31\x7E |0 \x87\x31\x7B |0 \x87\x3A\x6A |0 @@ -43496,7 +38668,6 @@ CHARMAP \x85\x69\x2B |0 \x85\x69\x2A |0 \x87\x49\x31 |0 - \x89\x63\x50 |0 \x87\x49\x32 |0 \x85\x6D\x37 |0 \x87\x4F\x43 |0 @@ -43517,30 +38688,21 @@ CHARMAP \x85\x7A\x71 |0 \x84\x6E\x4F |0 \x86\x34\x38 |0 - \x89\x37\x73 |0 \x85\x3B\x3F |0 - \x89\x3E\x51 |0 - \x89\x51\x5A |0 - \x89\x5C\x39 |0 \x87\x4F\x44 |0 \x85\x34\x7C |0 \x85\x34\x7D |0 \x86\x43\x73 |0 \x85\x34\x7E |0 - \x89\x3E\x52 |0 \x86\x57\x2F |0 \x86\x57\x30 |0 \x86\x57\x31 |0 \x86\x61\x29 |0 - \x89\x4B\x60 |0 \x86\x61\x2A |0 \x86\x61\x28 |0 \x87\x27\x51 |0 \x87\x27\x50 |0 \x87\x27\x52 |0 - \x89\x51\x5B |0 - \x89\x51\x5C |0 - \x89\x51\x5D |0 \x85\x57\x44 |0 \x85\x57\x45 |0 \x87\x32\x25 |0 @@ -43548,7 +38710,6 @@ CHARMAP \x85\x6D\x39 |0 \x85\x6D\x38 |0 \x87\x4F\x45 |0 - \x89\x6C\x37 |0 \x85\x21\x7B |0 \x86\x23\x38 |0 \x84\x23\x2E |0 @@ -43558,9 +38719,6 @@ CHARMAP \x86\x25\x4E |0 \x85\x23\x26 |0 \x86\x25\x4D |0 - \x89\x22\x6F |0 - \x89\x22\x70 |0 - \x89\x22\x6E |0 \x86\x25\x4C |0 \x84\x24\x77 |0 \x84\x24\x78 |0 @@ -43571,12 +38729,6 @@ CHARMAP \x86\x29\x23 |0 \x86\x29\x24 |0 \x86\x29\x26 |0 - \x89\x25\x2C |0 - \x89\x25\x2D |0 - \x89\x25\x2E |0 - \x89\x25\x2F |0 - \x89\x25\x30 |0 - \x89\x25\x31 |0 \x86\x2D\x7B |0 \x84\x27\x7C |0 \x84\x27\x77 |0 @@ -43598,18 +38750,6 @@ CHARMAP \x86\x2D\x7E |0 \x86\x3B\x4D |0 \x86\x3B\x4C |0 - \x89\x28\x57 |0 - \x89\x28\x58 |0 - \x89\x28\x59 |0 - \x89\x28\x5A |0 - \x89\x28\x5B |0 - \x89\x28\x5D |0 - \x89\x28\x5E |0 - \x89\x28\x5F |0 - \x89\x28\x60 |0 - \x89\x28\x61 |0 - \x89\x28\x62 |0 - \x89\x28\x64 |0 \x86\x2D\x79 |0 \x84\x2B\x3B |0 \x84\x2B\x37 |0 @@ -43631,21 +38771,10 @@ CHARMAP \x85\x2B\x3B |0 \x85\x2B\x3E |0 \x85\x2B\x3C |0 - \x89\x2D\x33 |0 - \x89\x2D\x35 |0 - \x89\x2D\x37 |0 - \x89\x2D\x38 |0 - \x89\x2D\x39 |0 - \x89\x2D\x3A |0 - \x89\x2D\x3B |0 - \x89\x2D\x3C |0 - \x89\x2D\x36 |0 \x86\x33\x3E |0 \x86\x34\x3F |0 - \x89\x2D\x34 |0 \x86\x2D\x7D |0 \x86\x4D\x68 |0 - \x89\x2A\x52 |0 \x85\x2F\x7C |0 \x84\x2F\x56 |0 \x84\x2F\x57 |0 @@ -43687,30 +38816,7 @@ CHARMAP \x86\x3B\x5B |0 \x86\x3B\x5D |0 \x86\x3B\x62 |0 - \x89\x32\x33 |0 - \x89\x32\x35 |0 - \x89\x32\x36 |0 - \x89\x32\x37 |0 - \x89\x32\x38 |0 - \x89\x32\x39 |0 - \x89\x32\x3B |0 - \x89\x32\x3C |0 - \x89\x32\x3D |0 - \x89\x32\x3F |0 - \x89\x32\x40 |0 - \x89\x32\x42 |0 - \x89\x32\x43 |0 - \x89\x32\x44 |0 - \x89\x32\x45 |0 - \x89\x32\x47 |0 - \x89\x32\x48 |0 - \x89\x32\x49 |0 - \x89\x32\x4A |0 - \x89\x32\x4B |0 \x86\x3B\x50 |0 - \x89\x32\x46 |0 - \x89\x32\x4C |0 - \x89\x32\x3E |0 \x85\x35\x2B |0 \x85\x35\x2E |0 \x85\x35\x27 |0 @@ -43771,43 +38877,12 @@ CHARMAP \x86\x44\x3A |0 \x86\x43\x7C |0 \x86\x43\x7A |0 - \x89\x37\x74 |0 - \x89\x37\x75 |0 - \x89\x37\x76 |0 - \x89\x37\x77 |0 - \x89\x37\x79 |0 - \x89\x37\x7B |0 - \x89\x37\x7C |0 - \x89\x37\x7D |0 - \x89\x37\x7E |0 - \x89\x38\x21 |0 - \x89\x38\x22 |0 - \x89\x38\x24 |0 - \x89\x38\x25 |0 - \x89\x38\x26 |0 - \x89\x38\x27 |0 - \x89\x38\x28 |0 - \x89\x38\x29 |0 - \x89\x38\x2A |0 - \x89\x38\x2B |0 - \x89\x38\x2C |0 - \x89\x38\x2D |0 - \x89\x38\x2E |0 - \x89\x38\x2F |0 - \x89\x38\x30 |0 - \x89\x38\x31 |0 - \x89\x38\x32 |0 - \x89\x38\x33 |0 - \x89\x38\x34 |0 - \x89\x38\x35 |0 \x85\x3B\x5D |0 \x86\x43\x7D |0 \x85\x35\x28 |0 \x86\x44\x25 |0 - \x89\x37\x7A |0 \x86\x44\x2D |0 \x86\x44\x37 |0 - \x89\x38\x23 |0 \x85\x35\x25 |0 \x85\x3B\x55 |0 \x84\x3A\x55 |0 @@ -43895,47 +38970,9 @@ CHARMAP \x86\x4D\x71 |0 \x86\x4E\x33 |0 \x86\x4E\x39 |0 - \x89\x3E\x53 |0 - \x89\x3E\x55 |0 - \x89\x3E\x56 |0 - \x89\x3E\x58 |0 - \x89\x3E\x5A |0 - \x89\x3E\x5B |0 - \x89\x3E\x5C |0 - \x89\x3E\x5D |0 - \x89\x3E\x5E |0 - \x89\x3E\x5F |0 - \x89\x3E\x60 |0 - \x89\x3E\x61 |0 - \x89\x3E\x63 |0 - \x89\x3E\x64 |0 - \x89\x3E\x65 |0 - \x89\x3E\x68 |0 - \x89\x3E\x69 |0 - \x89\x3E\x6A |0 - \x89\x3E\x6D |0 - \x89\x3E\x6F |0 - \x89\x3E\x70 |0 - \x89\x3E\x71 |0 - \x89\x3E\x72 |0 - \x89\x3E\x74 |0 - \x89\x3E\x75 |0 - \x89\x3E\x76 |0 - \x89\x3E\x77 |0 - \x89\x3E\x78 |0 - \x89\x3E\x79 |0 - \x89\x3E\x7A |0 - \x89\x3E\x7B |0 - \x89\x3E\x7C |0 - \x89\x3E\x7D |0 - \x89\x3E\x7E |0 \x86\x61\x2C |0 \x85\x3B\x59 |0 \x86\x4E\x21 |0 - \x89\x3E\x62 |0 - \x89\x3E\x54 |0 - \x89\x3E\x6E |0 - \x89\x3E\x73 |0 \x84\x40\x43 |0 \x86\x57\x34 |0 \x86\x57\x46 |0 @@ -44037,38 +39074,10 @@ CHARMAP \x86\x57\x4D |0 \x86\x57\x5B |0 \x86\x57\x5F |0 - \x89\x44\x73 |0 - \x89\x44\x75 |0 - \x89\x44\x76 |0 - \x89\x44\x77 |0 - \x89\x44\x78 |0 - \x89\x44\x79 |0 - \x89\x44\x7A |0 - \x89\x44\x7B |0 - \x89\x44\x7C |0 - \x89\x44\x7D |0 - \x89\x44\x7E |0 - \x89\x45\x21 |0 - \x89\x45\x22 |0 - \x89\x45\x23 |0 - \x89\x45\x24 |0 - \x89\x45\x25 |0 - \x89\x45\x26 |0 - \x89\x45\x27 |0 - \x89\x45\x28 |0 - \x89\x45\x29 |0 - \x89\x45\x2A |0 - \x89\x45\x2B |0 - \x89\x45\x2C |0 - \x89\x45\x2E |0 - \x89\x45\x2F |0 - \x89\x45\x30 |0 - \x89\x45\x31 |0 \x85\x42\x4C |0 \x84\x40\x4A |0 \x86\x57\x3D |0 \x86\x4E\x32 |0 - \x89\x3E\x57 |0 \x85\x42\x37 |0 \x84\x46\x66 |0 \x86\x61\x60 |0 @@ -44137,40 +39146,6 @@ CHARMAP \x86\x61\x5A |0 \x86\x61\x5D |0 \x86\x61\x5E |0 - \x89\x4B\x61 |0 - \x89\x4B\x62 |0 - \x89\x4B\x63 |0 - \x89\x4B\x66 |0 - \x89\x4B\x68 |0 - \x89\x4B\x69 |0 - \x89\x4B\x6A |0 - \x89\x4B\x6B |0 - \x89\x4B\x6C |0 - \x89\x4B\x6D |0 - \x89\x4B\x6E |0 - \x89\x4B\x6F |0 - \x89\x4B\x70 |0 - \x89\x4B\x71 |0 - \x89\x4B\x72 |0 - \x89\x4B\x73 |0 - \x89\x4B\x74 |0 - \x89\x4B\x75 |0 - \x89\x4B\x76 |0 - \x89\x4B\x78 |0 - \x89\x4B\x79 |0 - \x89\x4B\x7A |0 - \x89\x4B\x7C |0 - \x89\x4B\x7D |0 - \x89\x4B\x7E |0 - \x89\x4C\x21 |0 - \x89\x4C\x22 |0 - \x89\x4C\x23 |0 - \x89\x4C\x25 |0 - \x89\x4C\x26 |0 - \x89\x4C\x27 |0 - \x89\x4C\x28 |0 - \x89\x4C\x29 |0 - \x89\x4C\x2A |0 \x86\x61\x48 |0 \x85\x49\x42 |0 \x86\x61\x53 |0 @@ -44185,8 +39160,6 @@ CHARMAP \x86\x61\x42 |0 \x86\x61\x3D |0 \x86\x57\x50 |0 - \x89\x4B\x64 |0 - \x89\x4B\x67 |0 \x86\x61\x54 |0 \x84\x46\x6A |0 \x84\x46\x54 |0 @@ -44198,7 +39171,6 @@ CHARMAP \x85\x49\x47 |0 \x85\x49\x4C |0 \x85\x57\x46 |0 - \x89\x4B\x7B |0 \x85\x49\x3E |0 \x87\x27\x6C |0 \x84\x4C\x7E |0 @@ -44266,40 +39238,18 @@ CHARMAP \x87\x27\x70 |0 \x87\x27\x71 |0 \x87\x28\x23 |0 - \x89\x51\x5E |0 - \x89\x51\x5F |0 - \x89\x51\x60 |0 - \x89\x51\x62 |0 - \x89\x51\x63 |0 - \x89\x51\x66 |0 - \x89\x51\x67 |0 - \x89\x51\x68 |0 - \x89\x51\x69 |0 - \x89\x51\x6A |0 - \x89\x51\x6C |0 - \x89\x51\x6D |0 - \x89\x51\x6E |0 - \x89\x51\x6F |0 - \x89\x51\x70 |0 - \x89\x51\x72 |0 - \x89\x51\x75 |0 - \x89\x51\x77 |0 \x84\x4D\x23 |0 \x87\x27\x7A |0 \x85\x50\x44 |0 \x87\x27\x7E |0 \x87\x27\x75 |0 \x87\x27\x68 |0 - \x89\x51\x71 |0 - \x89\x51\x61 |0 - \x89\x51\x6B |0 \x85\x50\x36 |0 \x87\x27\x57 |0 \x85\x50\x47 |0 \x85\x50\x3C |0 \x86\x61\x34 |0 \x87\x42\x2E |0 - \x89\x4C\x24 |0 \x87\x32\x51 |0 \x84\x53\x2D |0 \x87\x32\x32 |0 @@ -44372,10 +39322,6 @@ CHARMAP \x87\x32\x42 |0 \x87\x32\x35 |0 \x87\x32\x3F |0 - \x89\x57\x3E |0 - \x89\x57\x3F |0 - \x89\x57\x40 |0 - \x89\x57\x41 |0 \x85\x57\x4A |0 \x85\x57\x50 |0 \x85\x57\x57 |0 @@ -44391,35 +39337,7 @@ CHARMAP \x87\x32\x54 |0 \x87\x32\x59 |0 \x87\x32\x5A |0 - \x89\x57\x37 |0 - \x89\x57\x38 |0 - \x89\x57\x39 |0 - \x89\x57\x3A |0 - \x89\x57\x3B |0 - \x89\x57\x3C |0 - \x89\x57\x3D |0 - \x89\x57\x42 |0 - \x89\x57\x43 |0 - \x89\x57\x44 |0 - \x89\x57\x49 |0 - \x89\x57\x4C |0 - \x89\x57\x4D |0 - \x89\x57\x4E |0 - \x89\x57\x4F |0 - \x89\x57\x50 |0 - \x89\x57\x51 |0 - \x89\x57\x52 |0 - \x89\x57\x53 |0 - \x89\x57\x54 |0 - \x89\x57\x56 |0 - \x89\x57\x57 |0 - \x89\x57\x58 |0 - \x89\x57\x59 |0 - \x89\x57\x5A |0 - \x89\x57\x5B |0 - \x89\x57\x5C |0 \x87\x32\x31 |0 - \x89\x57\x45 |0 \x84\x52\x7D |0 \x87\x32\x3A |0 \x87\x32\x58 |0 @@ -44429,7 +39347,6 @@ CHARMAP \x87\x32\x30 |0 \x87\x32\x29 |0 \x87\x32\x48 |0 - \x89\x57\x4A |0 \x87\x32\x56 |0 \x85\x57\x63 |0 \x85\x57\x59 |0 @@ -44510,35 +39427,11 @@ CHARMAP \x87\x3B\x28 |0 \x87\x3B\x2C |0 \x87\x3B\x34 |0 - \x89\x5C\x3A |0 - \x89\x5C\x3B |0 - \x89\x5C\x3C |0 - \x89\x5C\x3D |0 - \x89\x5C\x3E |0 - \x89\x5C\x40 |0 - \x89\x5C\x41 |0 - \x89\x5C\x42 |0 - \x89\x5C\x43 |0 - \x89\x5C\x44 |0 - \x89\x5C\x45 |0 - \x89\x5C\x46 |0 - \x89\x5C\x47 |0 - \x89\x5C\x49 |0 - \x89\x5C\x4A |0 - \x89\x5C\x4B |0 - \x89\x5C\x4C |0 - \x89\x5C\x4F |0 - \x89\x5C\x50 |0 \x84\x58\x39 |0 \x87\x3A\x7A |0 \x87\x3B\x2D |0 \x87\x3B\x36 |0 \x87\x3A\x74 |0 - \x89\x5C\x48 |0 - \x89\x5C\x3F |0 - \x89\x5C\x4E |0 - \x89\x57\x55 |0 - \x89\x63\x5B |0 \x85\x64\x2C |0 \x87\x42\x4B |0 \x84\x5D\x24 |0 @@ -44595,27 +39488,6 @@ CHARMAP \x87\x42\x4A |0 \x87\x42\x4E |0 \x87\x42\x4F |0 - \x89\x60\x48 |0 - \x89\x60\x49 |0 - \x89\x60\x4A |0 - \x89\x60\x4B |0 - \x89\x60\x4C |0 - \x89\x60\x4F |0 - \x89\x60\x50 |0 - \x89\x60\x51 |0 - \x89\x60\x52 |0 - \x89\x60\x53 |0 - \x89\x60\x54 |0 - \x89\x60\x55 |0 - \x89\x60\x56 |0 - \x89\x60\x57 |0 - \x89\x60\x58 |0 - \x89\x60\x59 |0 - \x89\x60\x5A |0 - \x89\x60\x5B |0 - \x89\x60\x5C |0 - \x89\x60\x5E |0 - \x89\x60\x5F |0 \x84\x5D\x27 |0 \x87\x42\x40 |0 \x85\x64\x27 |0 @@ -44682,29 +39554,6 @@ CHARMAP \x87\x49\x48 |0 \x87\x49\x50 |0 \x87\x49\x52 |0 - \x89\x63\x51 |0 - \x89\x63\x52 |0 - \x89\x63\x54 |0 - \x89\x63\x55 |0 - \x89\x63\x56 |0 - \x89\x63\x57 |0 - \x89\x63\x58 |0 - \x89\x63\x59 |0 - \x89\x63\x5A |0 - \x89\x63\x5C |0 - \x89\x63\x5D |0 - \x89\x63\x5E |0 - \x89\x63\x5F |0 - \x89\x63\x60 |0 - \x89\x63\x61 |0 - \x89\x63\x62 |0 - \x89\x63\x63 |0 - \x89\x63\x64 |0 - \x89\x63\x65 |0 - \x89\x63\x66 |0 - \x89\x63\x67 |0 - \x89\x63\x68 |0 - \x89\x63\x69 |0 \x87\x49\x4F |0 \x87\x4F\x5E |0 \x87\x4F\x55 |0 @@ -44755,24 +39604,6 @@ CHARMAP \x87\x4F\x5C |0 \x87\x4F\x63 |0 \x87\x4F\x64 |0 - \x89\x65\x79 |0 - \x89\x65\x7A |0 - \x89\x65\x7B |0 - \x89\x65\x7C |0 - \x89\x65\x7D |0 - \x89\x65\x7E |0 - \x89\x66\x21 |0 - \x89\x66\x22 |0 - \x89\x66\x23 |0 - \x89\x66\x24 |0 - \x89\x66\x25 |0 - \x89\x66\x26 |0 - \x89\x66\x27 |0 - \x89\x66\x28 |0 - \x89\x66\x29 |0 - \x89\x66\x2A |0 - \x89\x66\x2B |0 - \x89\x66\x2C |0 \x87\x4F\x4A |0 \x87\x4F\x48 |0 \x87\x4F\x60 |0 @@ -44813,18 +39644,6 @@ CHARMAP \x87\x54\x56 |0 \x87\x54\x5D |0 \x87\x54\x61 |0 - \x89\x68\x38 |0 - \x89\x68\x3A |0 - \x89\x68\x3B |0 - \x89\x68\x3C |0 - \x89\x68\x3D |0 - \x89\x68\x3E |0 - \x89\x68\x3F |0 - \x89\x68\x41 |0 - \x89\x68\x42 |0 - \x89\x68\x43 |0 - \x89\x68\x44 |0 - \x89\x68\x40 |0 \x87\x54\x58 |0 \x85\x74\x24 |0 \x84\x69\x36 |0 @@ -44853,9 +39672,6 @@ CHARMAP \x87\x58\x6C |0 \x87\x58\x71 |0 \x87\x58\x74 |0 - \x89\x69\x68 |0 - \x89\x69\x6B |0 - \x89\x69\x6C |0 \x87\x5C\x4F |0 \x87\x5C\x5A |0 \x84\x6A\x75 |0 @@ -44882,11 +39698,7 @@ CHARMAP \x87\x5C\x54 |0 \x87\x5C\x52 |0 \x87\x5C\x59 |0 - \x89\x6A\x6D |0 - \x89\x6A\x6E |0 - \x89\x6A\x6F |0 \x87\x5C\x4E |0 - \x89\x69\x6A |0 \x85\x78\x23 |0 \x85\x78\x22 |0 \x85\x78\x21 |0 @@ -44900,9 +39712,6 @@ CHARMAP \x87\x5F\x41 |0 \x87\x5F\x47 |0 \x85\x79\x42 |0 - \x89\x6B\x60 |0 - \x89\x6B\x61 |0 - \x89\x6B\x63 |0 \x87\x5F\x45 |0 \x87\x5F\x48 |0 \x85\x79\x43 |0 @@ -44912,8 +39721,6 @@ CHARMAP \x87\x61\x3E |0 \x87\x61\x3D |0 \x87\x61\x3C |0 - \x89\x6C\x38 |0 - \x89\x6C\x39 |0 \x87\x61\x3F |0 \x85\x7A\x35 |0 \x85\x7A\x36 |0 @@ -44922,15 +39729,12 @@ CHARMAP \x87\x62\x56 |0 \x87\x62\x58 |0 \x87\x62\x54 |0 - \x89\x6C\x51 |0 \x87\x62\x48 |0 \x84\x6D\x7A |0 \x87\x63\x68 |0 \x85\x7A\x72 |0 \x84\x6D\x5F |0 \x84\x6D\x7C |0 - \x89\x6C\x6B |0 - \x89\x6C\x6D |0 \x85\x7B\x46 |0 \x84\x6E\x35 |0 \x87\x64\x58 |0 @@ -44943,11 +39747,9 @@ CHARMAP \x85\x7C\x4F |0 \x85\x7C\x3D |0 \x87\x65\x5F |0 - \x89\x28\x65 |0 \x84\x2B\x3F |0 \x86\x34\x49 |0 \x86\x34\x48 |0 - \x89\x32\x4E |0 \x85\x35\x36 |0 \x85\x35\x34 |0 \x84\x34\x77 |0 @@ -44961,9 +39763,6 @@ CHARMAP \x86\x4E\x3C |0 \x85\x3B\x71 |0 \x86\x4E\x3D |0 - \x89\x3F\x22 |0 - \x89\x3F\x23 |0 - \x89\x3F\x24 |0 \x85\x42\x55 |0 \x85\x42\x51 |0 \x85\x42\x52 |0 @@ -44979,8 +39778,6 @@ CHARMAP \x86\x61\x63 |0 \x86\x61\x64 |0 \x85\x49\x50 |0 - \x89\x4C\x2B |0 - \x89\x4C\x2C |0 \x84\x46\x6E |0 \x87\x28\x29 |0 \x87\x28\x27 |0 @@ -44988,7 +39785,6 @@ CHARMAP \x85\x50\x4E |0 \x87\x28\x26 |0 \x87\x28\x28 |0 - \x89\x51\x79 |0 \x87\x26\x29 |0 \x85\x57\x6A |0 \x85\x57\x6B |0 @@ -45003,16 +39799,10 @@ CHARMAP \x84\x53\x37 |0 \x85\x57\x6D |0 \x87\x32\x5E |0 - \x89\x57\x5D |0 - \x89\x57\x5E |0 - \x89\x57\x5F |0 \x85\x57\x6C |0 \x87\x32\x5B |0 \x84\x58\x4C |0 \x87\x3B\x39 |0 - \x89\x5C\x51 |0 - \x89\x5C\x52 |0 - \x89\x5C\x53 |0 \x87\x42\x51 |0 \x85\x64\x3D |0 \x84\x5D\x33 |0 @@ -45020,7 +39810,6 @@ CHARMAP \x84\x5D\x31 |0 \x87\x42\x52 |0 \x85\x64\x3C |0 - \x89\x60\x60 |0 \x87\x49\x56 |0 \x87\x49\x55 |0 \x84\x60\x7E |0 @@ -45042,10 +39831,6 @@ CHARMAP \x86\x29\x29 |0 \x84\x28\x22 |0 \x86\x2E\x25 |0 - \x89\x28\x66 |0 - \x89\x28\x67 |0 - \x89\x28\x69 |0 - \x89\x28\x6A |0 \x84\x2B\x43 |0 \x86\x34\x4B |0 \x84\x2B\x40 |0 @@ -45055,12 +39840,6 @@ CHARMAP \x86\x34\x4D |0 \x86\x34\x4C |0 \x86\x34\x4E |0 - \x89\x2D\x3D |0 - \x89\x2D\x3F |0 - \x89\x2D\x42 |0 - \x89\x2D\x43 |0 - \x89\x2D\x44 |0 - \x89\x2D\x41 |0 \x84\x2B\x41 |0 \x85\x30\x30 |0 \x86\x3B\x68 |0 @@ -45086,7 +39865,6 @@ CHARMAP \x86\x3B\x64 |0 \x85\x30\x2B |0 \x86\x3B\x65 |0 - \x89\x32\x4F |0 \x86\x3B\x6C |0 \x86\x3B\x6D |0 \x85\x30\x2A |0 @@ -45099,7 +39877,6 @@ CHARMAP \x85\x35\x3A |0 \x85\x35\x40 |0 \x84\x35\x22 |0 - \x89\x38\x3D |0 \x84\x35\x23 |0 \x86\x44\x4C |0 \x85\x35\x3C |0 @@ -45115,15 +39892,6 @@ CHARMAP \x86\x44\x44 |0 \x86\x44\x4B |0 \x86\x44\x4D |0 - \x89\x38\x36 |0 - \x89\x38\x37 |0 - \x89\x38\x38 |0 - \x89\x38\x39 |0 - \x89\x38\x3B |0 - \x89\x38\x3C |0 - \x89\x38\x3E |0 - \x89\x38\x3F |0 - \x89\x38\x40 |0 \x85\x35\x3E |0 \x86\x44\x4E |0 \x84\x35\x25 |0 @@ -45132,7 +39900,6 @@ CHARMAP \x85\x35\x3B |0 \x85\x3B\x73 |0 \x86\x4E\x40 |0 - \x89\x3F\x28 |0 \x84\x3A\x73 |0 \x86\x4E\x48 |0 \x85\x3C\x28 |0 @@ -45167,10 +39934,6 @@ CHARMAP \x85\x3C\x22 |0 \x85\x3B\x72 |0 \x86\x4E\x41 |0 - \x89\x3F\x25 |0 - \x89\x3F\x26 |0 - \x89\x3F\x27 |0 - \x89\x3F\x29 |0 \x84\x3A\x77 |0 \x86\x57\x70 |0 \x86\x57\x6F |0 @@ -45197,14 +39960,6 @@ CHARMAP \x86\x57\x71 |0 \x86\x57\x75 |0 \x85\x42\x59 |0 - \x89\x45\x32 |0 - \x89\x45\x33 |0 - \x89\x45\x34 |0 - \x89\x45\x35 |0 - \x89\x45\x36 |0 - \x89\x45\x37 |0 - \x89\x45\x38 |0 - \x89\x45\x39 |0 \x86\x57\x76 |0 \x87\x49\x6B |0 \x86\x57\x77 |0 @@ -45252,11 +40007,6 @@ CHARMAP \x86\x61\x6E |0 \x85\x49\x53 |0 \x86\x61\x73 |0 - \x89\x4C\x2D |0 - \x89\x4C\x2E |0 - \x89\x4C\x30 |0 - \x89\x4C\x31 |0 - \x89\x4C\x32 |0 \x86\x61\x78 |0 \x84\x40\x58 |0 \x86\x61\x7E |0 @@ -45313,23 +40063,10 @@ CHARMAP \x85\x50\x54 |0 \x84\x4D\x27 |0 \x85\x50\x4F |0 - \x89\x51\x7A |0 - \x89\x51\x7B |0 - \x89\x51\x7E |0 - \x89\x52\x21 |0 - \x89\x52\x22 |0 - \x89\x52\x23 |0 - \x89\x52\x25 |0 - \x89\x52\x28 |0 - \x89\x52\x29 |0 - \x89\x52\x2A |0 - \x89\x52\x2B |0 \x87\x28\x33 |0 \x87\x28\x41 |0 \x87\x28\x3A |0 - \x89\x52\x27 |0 \x87\x28\x32 |0 - \x89\x4C\x2F |0 \x85\x57\x70 |0 \x84\x53\x45 |0 \x85\x57\x76 |0 @@ -45384,12 +40121,6 @@ CHARMAP \x87\x32\x72 |0 \x87\x32\x68 |0 \x87\x33\x23 |0 - \x89\x57\x60 |0 - \x89\x57\x61 |0 - \x89\x57\x63 |0 - \x89\x57\x64 |0 - \x89\x57\x65 |0 - \x89\x57\x66 |0 \x87\x32\x79 |0 \x87\x32\x6A |0 \x87\x32\x7A |0 @@ -45436,14 +40167,6 @@ CHARMAP \x85\x5E\x2D |0 \x85\x5E\x2E |0 \x87\x3B\x45 |0 - \x89\x5C\x54 |0 - \x89\x5C\x55 |0 - \x89\x5C\x56 |0 - \x89\x5C\x57 |0 - \x89\x5C\x58 |0 - \x89\x5C\x59 |0 - \x89\x5C\x5A |0 - \x89\x5C\x5C |0 \x87\x3B\x43 |0 \x87\x3B\x4B |0 \x87\x3B\x4E |0 @@ -45502,18 +40225,9 @@ CHARMAP \x87\x42\x5E |0 \x87\x42\x6A |0 \x87\x42\x66 |0 - \x89\x60\x62 |0 - \x89\x60\x64 |0 - \x89\x60\x65 |0 - \x89\x60\x66 |0 - \x89\x60\x68 |0 - \x89\x60\x69 |0 - \x89\x60\x6A |0 \x87\x42\x64 |0 \x84\x5D\x3C |0 \x87\x42\x67 |0 - \x89\x60\x67 |0 - \x89\x60\x61 |0 \x85\x64\x4E |0 \x84\x61\x28 |0 \x87\x49\x6A |0 @@ -45543,16 +40257,6 @@ CHARMAP \x87\x49\x5C |0 \x87\x49\x5F |0 \x87\x49\x58 |0 - \x89\x63\x6B |0 - \x89\x63\x6C |0 - \x89\x63\x6D |0 - \x89\x63\x6F |0 - \x89\x63\x70 |0 - \x89\x63\x71 |0 - \x89\x63\x72 |0 - \x89\x63\x73 |0 - \x89\x63\x74 |0 - \x89\x63\x75 |0 \x87\x49\x5B |0 \x84\x61\x22 |0 \x84\x61\x27 |0 @@ -45582,11 +40286,6 @@ CHARMAP \x87\x54\x77 |0 \x87\x4F\x6E |0 \x87\x4F\x7B |0 - \x89\x66\x2D |0 - \x89\x66\x2E |0 - \x89\x66\x2F |0 - \x89\x66\x30 |0 - \x89\x66\x31 |0 \x87\x4F\x76 |0 \x84\x67\x2F |0 \x84\x67\x34 |0 @@ -45615,11 +40314,6 @@ CHARMAP \x85\x71\x31 |0 \x85\x71\x33 |0 \x87\x54\x76 |0 - \x89\x68\x45 |0 - \x89\x68\x46 |0 - \x89\x68\x47 |0 - \x89\x68\x48 |0 - \x89\x68\x49 |0 \x87\x54\x6D |0 \x85\x74\x2E |0 \x84\x69\x3C |0 @@ -45648,8 +40342,6 @@ CHARMAP \x85\x74\x2F |0 \x87\x58\x7D |0 \x87\x58\x7B |0 - \x89\x69\x6D |0 - \x89\x69\x6E |0 \x85\x76\x46 |0 \x84\x6A\x76 |0 \x84\x6A\x77 |0 @@ -45668,9 +40360,6 @@ CHARMAP \x85\x76\x4A |0 \x87\x59\x22 |0 \x85\x76\x49 |0 - \x89\x6A\x70 |0 - \x89\x6A\x71 |0 - \x89\x6A\x72 |0 \x85\x78\x2C |0 \x87\x5F\x4B |0 \x84\x6B\x7E |0 @@ -45729,7 +40418,6 @@ CHARMAP \x84\x6E\x50 |0 \x87\x65\x62 |0 \x87\x65\x61 |0 - \x89\x6D\x31 |0 \x87\x66\x2B |0 \x85\x27\x65 |0 \x86\x2E\x27 |0 @@ -45739,7 +40427,6 @@ CHARMAP \x85\x30\x35 |0 \x86\x3B\x75 |0 \x86\x3B\x74 |0 - \x89\x38\x41 |0 \x86\x4E\x4E |0 \x86\x4E\x50 |0 \x85\x42\x5F |0 @@ -45764,7 +40451,6 @@ CHARMAP \x87\x33\x26 |0 \x85\x5E\x37 |0 \x85\x5E\x36 |0 - \x89\x5C\x5D |0 \x84\x5D\x3E |0 \x84\x5D\x3F |0 \x87\x42\x71 |0 @@ -45785,7 +40471,6 @@ CHARMAP \x86\x34\x4F |0 \x86\x34\x50 |0 \x85\x2B\x41 |0 - \x89\x2D\x45 |0 \x85\x30\x36 |0 \x86\x3B\x77 |0 \x86\x3B\x76 |0 @@ -45794,22 +40479,18 @@ CHARMAP \x85\x3C\x29 |0 \x86\x4E\x53 |0 \x86\x4E\x52 |0 - \x89\x3F\x2A |0 - \x89\x3F\x2B |0 \x86\x4E\x51 |0 \x86\x58\x23 |0 \x86\x58\x21 |0 \x84\x40\x5F |0 \x86\x58\x22 |0 \x86\x57\x7E |0 - \x89\x45\x3A |0 \x84\x47\x24 |0 \x85\x50\x62 |0 \x86\x62\x27 |0 \x86\x62\x28 |0 \x84\x58\x61 |0 \x87\x3B\x56 |0 - \x89\x5C\x5E |0 \x84\x5D\x41 |0 \x87\x42\x74 |0 \x87\x49\x70 |0 @@ -45826,7 +40507,6 @@ CHARMAP \x85\x2B\x45 |0 \x86\x34\x53 |0 \x85\x2B\x44 |0 - \x89\x28\x6B |0 \x86\x34\x52 |0 \x85\x2B\x42 |0 \x85\x2B\x46 |0 @@ -45851,13 +40531,9 @@ CHARMAP \x86\x3B\x7A |0 \x86\x3B\x78 |0 \x85\x30\x3A |0 - \x89\x32\x50 |0 \x86\x3C\x24 |0 \x86\x3C\x28 |0 \x86\x3C\x29 |0 - \x89\x2D\x48 |0 - \x89\x2D\x49 |0 - \x89\x32\x52 |0 \x84\x35\x28 |0 \x85\x3C\x32 |0 \x84\x35\x2B |0 @@ -45880,8 +40556,6 @@ CHARMAP \x86\x44\x50 |0 \x86\x44\x57 |0 \x86\x44\x52 |0 - \x89\x2D\x46 |0 - \x89\x38\x45 |0 \x85\x35\x48 |0 \x86\x44\x56 |0 \x85\x35\x49 |0 @@ -45902,13 +40576,10 @@ CHARMAP \x85\x3C\x2B |0 \x85\x42\x64 |0 \x85\x3C\x2A |0 - \x89\x38\x44 |0 - \x89\x3F\x2E |0 \x86\x4E\x55 |0 \x86\x4E\x5A |0 \x86\x4E\x5C |0 \x85\x3C\x2C |0 - \x89\x38\x43 |0 \x85\x42\x6A |0 \x85\x42\x62 |0 \x85\x42\x66 |0 @@ -45929,17 +40600,11 @@ CHARMAP \x86\x58\x24 |0 \x86\x58\x27 |0 \x86\x58\x2D |0 - \x89\x3F\x2C |0 - \x89\x3F\x2D |0 - \x89\x3F\x2F |0 - \x89\x3F\x30 |0 - \x89\x45\x3B |0 \x86\x58\x26 |0 \x86\x58\x31 |0 \x86\x58\x25 |0 \x86\x58\x29 |0 \x85\x42\x61 |0 - \x89\x45\x3E |0 \x84\x47\x30 |0 \x84\x47\x2C |0 \x86\x62\x2D |0 @@ -45965,12 +40630,7 @@ CHARMAP \x84\x47\x33 |0 \x86\x62\x35 |0 \x86\x62\x2E |0 - \x89\x4C\x34 |0 - \x89\x4C\x36 |0 - \x89\x4C\x37 |0 \x84\x47\x2F |0 - \x89\x45\x3C |0 - \x89\x45\x3F |0 \x85\x50\x66 |0 \x87\x28\x54 |0 \x84\x4D\x41 |0 @@ -46001,8 +40661,6 @@ CHARMAP \x87\x28\x51 |0 \x87\x28\x50 |0 \x87\x28\x4D |0 - \x89\x4C\x35 |0 - \x89\x52\x2D |0 \x87\x28\x4E |0 \x87\x28\x59 |0 \x85\x58\x2C |0 @@ -46026,7 +40684,6 @@ CHARMAP \x87\x33\x30 |0 \x85\x58\x26 |0 \x87\x33\x2E |0 - \x89\x52\x2C |0 \x87\x33\x2D |0 \x85\x5E\x3E |0 \x85\x5E\x3F |0 @@ -46051,10 +40708,6 @@ CHARMAP \x87\x3B\x58 |0 \x87\x3B\x5A |0 \x85\x5E\x3A |0 - \x89\x57\x67 |0 - \x89\x57\x68 |0 - \x89\x57\x69 |0 - \x89\x57\x6A |0 \x87\x42\x75 |0 \x84\x5D\x45 |0 \x87\x42\x7C |0 @@ -46088,7 +40741,6 @@ CHARMAP \x85\x64\x5C |0 \x85\x64\x5E |0 \x85\x64\x58 |0 - \x89\x5C\x60 |0 \x87\x49\x76 |0 \x85\x69\x49 |0 \x85\x69\x4A |0 @@ -46107,9 +40759,6 @@ CHARMAP \x84\x61\x2B |0 \x87\x49\x77 |0 \x87\x43\x21 |0 - \x89\x60\x6B |0 - \x89\x60\x6C |0 - \x89\x63\x76 |0 \x87\x4F\x7D |0 \x85\x6D\x58 |0 \x87\x50\x26 |0 @@ -46127,7 +40776,6 @@ CHARMAP \x85\x6D\x5A |0 \x85\x6D\x5C |0 \x87\x50\x24 |0 - \x89\x66\x34 |0 \x87\x50\x21 |0 \x85\x6D\x5D |0 \x87\x55\x22 |0 @@ -46143,7 +40791,6 @@ CHARMAP \x87\x55\x23 |0 \x87\x59\x31 |0 \x87\x54\x7D |0 - \x89\x66\x33 |0 \x84\x69\x41 |0 \x87\x59\x2E |0 \x84\x69\x40 |0 @@ -46154,7 +40801,6 @@ CHARMAP \x87\x59\x30 |0 \x87\x59\x2F |0 \x85\x78\x2E |0 - \x89\x69\x6F |0 \x87\x5F\x51 |0 \x87\x5F\x50 |0 \x87\x5F\x4F |0 @@ -46182,25 +40828,15 @@ CHARMAP \x84\x2F\x74 |0 \x86\x3C\x2A |0 \x86\x44\x5B |0 - \x89\x38\x46 |0 - \x89\x3F\x31 |0 - \x89\x3F\x32 |0 \x86\x58\x32 |0 \x84\x47\x34 |0 \x86\x62\x36 |0 \x86\x62\x37 |0 \x86\x62\x38 |0 - \x89\x4C\x38 |0 - \x89\x4C\x39 |0 \x87\x28\x5C |0 - \x89\x4C\x3A |0 - \x89\x52\x30 |0 \x87\x33\x31 |0 \x87\x33\x32 |0 - \x89\x52\x2F |0 \x87\x3B\x65 |0 - \x89\x60\x6D |0 - \x89\x60\x6E |0 \x85\x69\x4B |0 \x87\x50\x27 |0 \x87\x55\x27 |0 @@ -46208,16 +40844,12 @@ CHARMAP \x86\x2E\x2D |0 \x84\x2F\x77 |0 \x85\x30\x42 |0 - \x89\x32\x53 |0 \x85\x35\x4D |0 \x85\x35\x4E |0 \x86\x44\x5C |0 \x86\x44\x5D |0 \x85\x35\x50 |0 \x85\x35\x4B |0 - \x89\x38\x47 |0 - \x89\x38\x49 |0 - \x89\x38\x4B |0 \x84\x35\x32 |0 \x84\x35\x36 |0 \x85\x35\x4C |0 @@ -46237,9 +40869,6 @@ CHARMAP \x86\x58\x33 |0 \x86\x58\x37 |0 \x85\x42\x70 |0 - \x89\x45\x40 |0 - \x89\x45\x41 |0 - \x89\x45\x42 |0 \x86\x58\x35 |0 \x86\x62\x39 |0 \x85\x49\x71 |0 @@ -46247,8 +40876,6 @@ CHARMAP \x85\x49\x72 |0 \x84\x47\x37 |0 \x86\x62\x3A |0 - \x89\x4C\x3B |0 - \x89\x4C\x3C |0 \x85\x49\x6F |0 \x86\x62\x3B |0 \x85\x49\x70 |0 @@ -46263,7 +40890,6 @@ CHARMAP \x87\x28\x62 |0 \x85\x50\x6A |0 \x85\x50\x6E |0 - \x89\x52\x31 |0 \x87\x28\x60 |0 \x87\x28\x5E |0 \x87\x28\x5D |0 @@ -46283,9 +40909,6 @@ CHARMAP \x87\x33\x33 |0 \x85\x58\x2D |0 \x85\x58\x33 |0 - \x89\x57\x6B |0 - \x89\x57\x6C |0 - \x89\x57\x6D |0 \x87\x3B\x66 |0 \x85\x64\x60 |0 \x85\x5E\x45 |0 @@ -46294,35 +40917,24 @@ CHARMAP \x87\x3B\x69 |0 \x87\x3B\x6B |0 \x87\x3B\x68 |0 - \x89\x5C\x61 |0 - \x89\x5C\x62 |0 \x85\x64\x62 |0 \x84\x5D\x51 |0 \x84\x5D\x4F |0 \x87\x43\x24 |0 \x85\x64\x61 |0 - \x89\x60\x6F |0 - \x89\x60\x70 |0 - \x89\x60\x71 |0 \x87\x43\x25 |0 \x87\x49\x7D |0 \x87\x49\x7E |0 \x85\x6D\x5F |0 \x87\x50\x29 |0 \x87\x50\x28 |0 - \x89\x66\x35 |0 \x85\x6D\x5E |0 - \x89\x68\x4B |0 - \x89\x68\x4C |0 \x87\x55\x28 |0 \x84\x69\x43 |0 \x85\x74\x39 |0 \x84\x69\x42 |0 - \x89\x69\x70 |0 - \x89\x69\x71 |0 \x85\x78\x2F |0 \x87\x5F\x53 |0 - \x89\x6B\x64 |0 \x87\x5F\x52 |0 \x85\x79\x4D |0 \x85\x79\x4C |0 @@ -46350,9 +40962,6 @@ CHARMAP \x86\x44\x64 |0 \x85\x35\x51 |0 \x86\x44\x60 |0 - \x89\x38\x4D |0 - \x89\x38\x4E |0 - \x89\x38\x4F |0 \x84\x35\x3C |0 \x86\x44\x66 |0 \x86\x44\x5E |0 @@ -46371,7 +40980,6 @@ CHARMAP \x84\x3B\x27 |0 \x84\x3B\x28 |0 \x86\x4E\x68 |0 - \x89\x3F\x33 |0 \x85\x42\x73 |0 \x85\x42\x71 |0 \x85\x42\x72 |0 @@ -46496,12 +41104,6 @@ CHARMAP \x86\x44\x75 |0 \x86\x44\x6E |0 \x86\x44\x7A |0 - \x89\x38\x50 |0 - \x89\x38\x51 |0 - \x89\x38\x53 |0 - \x89\x38\x54 |0 - \x89\x38\x55 |0 - \x89\x38\x56 |0 \x86\x44\x72 |0 \x86\x44\x69 |0 \x86\x44\x68 |0 @@ -46528,14 +41130,6 @@ CHARMAP \x84\x3B\x37 |0 \x85\x3C\x39 |0 \x85\x3C\x3A |0 - \x89\x3F\x34 |0 - \x89\x3F\x35 |0 - \x89\x3F\x36 |0 - \x89\x3F\x37 |0 - \x89\x3F\x38 |0 - \x89\x3F\x39 |0 - \x89\x3F\x3A |0 - \x89\x3F\x3C |0 \x86\x4E\x72 |0 \x86\x4E\x75 |0 \x86\x4E\x6C |0 @@ -46570,9 +41164,6 @@ CHARMAP \x85\x42\x78 |0 \x85\x42\x77 |0 \x86\x58\x44 |0 - \x89\x45\x43 |0 - \x89\x45\x45 |0 - \x89\x45\x46 |0 \x86\x58\x4A |0 \x85\x42\x7B |0 \x86\x58\x39 |0 @@ -46605,14 +41196,6 @@ CHARMAP \x86\x62\x44 |0 \x85\x49\x76 |0 \x85\x49\x77 |0 - \x89\x4C\x3D |0 - \x89\x4C\x3E |0 - \x89\x4C\x3F |0 - \x89\x4C\x40 |0 - \x89\x4C\x42 |0 - \x89\x4C\x43 |0 - \x89\x4C\x44 |0 - \x89\x4C\x45 |0 \x86\x62\x48 |0 \x84\x47\x4B |0 \x86\x62\x4A |0 @@ -46655,18 +41238,10 @@ CHARMAP \x85\x50\x77 |0 \x85\x50\x79 |0 \x85\x50\x76 |0 - \x89\x52\x32 |0 - \x89\x52\x33 |0 - \x89\x52\x34 |0 - \x89\x52\x35 |0 - \x89\x52\x37 |0 - \x89\x52\x39 |0 - \x89\x52\x3A |0 \x87\x28\x76 |0 \x87\x28\x75 |0 \x87\x28\x6C |0 \x87\x28\x72 |0 - \x89\x52\x38 |0 \x85\x51\x21 |0 \x87\x28\x7B |0 \x87\x28\x6E |0 @@ -46712,17 +41287,6 @@ CHARMAP \x84\x53\x6D |0 \x87\x33\x44 |0 \x85\x58\x3E |0 - \x89\x57\x6E |0 - \x89\x57\x6F |0 - \x89\x57\x70 |0 - \x89\x57\x71 |0 - \x89\x57\x72 |0 - \x89\x57\x73 |0 - \x89\x57\x74 |0 - \x89\x57\x75 |0 - \x89\x57\x76 |0 - \x89\x57\x77 |0 - \x89\x57\x78 |0 \x87\x33\x54 |0 \x87\x33\x41 |0 \x87\x33\x4B |0 @@ -46761,15 +41325,6 @@ CHARMAP \x85\x5E\x4C |0 \x87\x3C\x24 |0 \x87\x3B\x75 |0 - \x89\x5C\x63 |0 - \x89\x5C\x64 |0 - \x89\x5C\x65 |0 - \x89\x5C\x66 |0 - \x89\x5C\x67 |0 - \x89\x5C\x68 |0 - \x89\x5C\x69 |0 - \x89\x5C\x6A |0 - \x89\x5C\x6B |0 \x87\x3C\x28 |0 \x87\x3C\x29 |0 \x87\x3B\x7A |0 @@ -46805,8 +41360,6 @@ CHARMAP \x87\x43\x3C |0 \x87\x43\x2C |0 \x87\x43\x2D |0 - \x89\x60\x72 |0 - \x89\x60\x75 |0 \x87\x43\x36 |0 \x84\x5D\x5F |0 \x87\x43\x2E |0 @@ -46834,9 +41387,6 @@ CHARMAP \x84\x61\x3C |0 \x85\x6D\x60 |0 \x87\x4A\x27 |0 - \x89\x63\x78 |0 - \x89\x63\x79 |0 - \x89\x63\x7A |0 \x84\x61\x44 |0 \x87\x4A\x2B |0 \x87\x50\x35 |0 @@ -46845,7 +41395,6 @@ CHARMAP \x87\x4A\x2D |0 \x87\x4A\x32 |0 \x84\x61\x38 |0 - \x89\x60\x74 |0 \x84\x64\x4A |0 \x84\x64\x4B |0 \x85\x6D\x62 |0 @@ -46862,10 +41411,6 @@ CHARMAP \x87\x50\x36 |0 \x87\x50\x2C |0 \x87\x50\x30 |0 - \x89\x66\x36 |0 - \x89\x66\x37 |0 - \x89\x66\x38 |0 - \x89\x66\x39 |0 \x87\x50\x38 |0 \x87\x50\x37 |0 \x87\x50\x39 |0 @@ -46912,9 +41457,6 @@ CHARMAP \x87\x59\x3F |0 \x84\x69\x46 |0 \x87\x59\x3E |0 - \x89\x69\x72 |0 - \x89\x69\x73 |0 - \x89\x69\x74 |0 \x87\x59\x3C |0 \x87\x59\x3D |0 \x84\x6A\x7D |0 @@ -46926,8 +41468,6 @@ CHARMAP \x87\x5C\x68 |0 \x87\x5C\x69 |0 \x87\x5C\x6A |0 - \x89\x6A\x74 |0 - \x89\x6A\x75 |0 \x87\x5C\x67 |0 \x87\x59\x42 |0 \x87\x5F\x57 |0 @@ -46936,8 +41476,6 @@ CHARMAP \x84\x6C\x27 |0 \x87\x5F\x56 |0 \x87\x5F\x5A |0 - \x89\x6B\x65 |0 - \x89\x6B\x66 |0 \x87\x5F\x54 |0 \x87\x5F\x59 |0 \x87\x5F\x5B |0 @@ -46945,8 +41483,6 @@ CHARMAP \x87\x61\x4B |0 \x85\x79\x4E |0 \x87\x61\x4C |0 - \x89\x6C\x3A |0 - \x89\x6C\x3B |0 \x87\x61\x4A |0 \x85\x7A\x75 |0 \x87\x62\x65 |0 @@ -46996,11 +41532,9 @@ CHARMAP \x86\x34\x55 |0 \x86\x3C\x35 |0 \x86\x3C\x34 |0 - \x89\x38\x57 |0 \x84\x3B\x3B |0 \x85\x3C\x3E |0 \x86\x4E\x7B |0 - \x89\x3F\x3D |0 \x85\x43\x22 |0 \x84\x40\x75 |0 \x86\x5B\x5F |0 @@ -47013,7 +41547,6 @@ CHARMAP \x85\x51\x2F |0 \x85\x51\x2E |0 \x87\x29\x26 |0 - \x89\x52\x3B |0 \x85\x58\x43 |0 \x84\x53\x74 |0 \x87\x33\x57 |0 @@ -47039,13 +41572,9 @@ CHARMAP \x85\x6D\x66 |0 \x85\x6D\x65 |0 \x85\x6D\x67 |0 - \x89\x66\x3A |0 \x85\x6D\x64 |0 - \x89\x63\x7B |0 \x85\x71\x3F |0 \x85\x74\x41 |0 - \x89\x6A\x76 |0 - \x89\x6A\x77 |0 \x85\x78\x32 |0 \x85\x79\x4F |0 \x85\x7A\x77 |0 @@ -47071,7 +41600,6 @@ CHARMAP \x85\x3C\x41 |0 \x86\x4F\x23 |0 \x86\x4E\x7D |0 - \x89\x32\x55 |0 \x84\x40\x77 |0 \x85\x43\x25 |0 \x84\x40\x76 |0 @@ -47108,7 +41636,6 @@ CHARMAP \x87\x29\x2A |0 \x85\x4A\x21 |0 \x87\x29\x2E |0 - \x89\x52\x3C |0 \x85\x58\x47 |0 \x85\x58\x48 |0 \x85\x58\x46 |0 @@ -47160,10 +41687,8 @@ CHARMAP \x85\x7A\x3A |0 \x87\x65\x46 |0 \x87\x66\x43 |0 - \x89\x28\x6C |0 \x85\x2B\x4B |0 \x86\x3C\x38 |0 - \x89\x32\x56 |0 \x85\x35\x64 |0 \x85\x35\x63 |0 \x84\x35\x4F |0 @@ -47183,7 +41708,6 @@ CHARMAP \x85\x3C\x43 |0 \x86\x4F\x27 |0 \x86\x4F\x24 |0 - \x89\x3F\x3E |0 \x84\x40\x7C |0 \x84\x40\x7D |0 \x84\x40\x7A |0 @@ -47194,7 +41718,6 @@ CHARMAP \x84\x40\x79 |0 \x84\x40\x7B |0 \x86\x58\x53 |0 - \x89\x45\x47 |0 \x85\x43\x29 |0 \x86\x62\x61 |0 \x86\x62\x5C |0 @@ -47205,10 +41728,8 @@ CHARMAP \x85\x4A\x24 |0 \x86\x62\x5E |0 \x86\x62\x60 |0 - \x89\x4C\x48 |0 \x86\x62\x5D |0 \x86\x62\x62 |0 - \x89\x4C\x49 |0 \x85\x51\x35 |0 \x85\x51\x34 |0 \x84\x4D\x69 |0 @@ -47230,7 +41751,6 @@ CHARMAP \x87\x33\x62 |0 \x85\x58\x4C |0 \x87\x33\x5F |0 - \x89\x57\x7A |0 \x87\x33\x5D |0 \x87\x33\x63 |0 \x84\x58\x79 |0 @@ -47241,7 +41761,6 @@ CHARMAP \x85\x5E\x60 |0 \x85\x5E\x64 |0 \x85\x5E\x61 |0 - \x89\x5C\x6C |0 \x87\x43\x46 |0 \x84\x5D\x67 |0 \x87\x43\x47 |0 @@ -47270,13 +41789,10 @@ CHARMAP \x85\x2B\x4C |0 \x84\x2B\x4A |0 \x86\x34\x56 |0 - \x89\x2D\x4A |0 \x84\x30\x26 |0 \x86\x3C\x39 |0 \x85\x30\x49 |0 \x85\x30\x4A |0 - \x89\x32\x57 |0 - \x89\x32\x58 |0 \x86\x3C\x3A |0 \x86\x45\x2A |0 \x86\x45\x2C |0 @@ -47285,14 +41801,6 @@ CHARMAP \x86\x45\x26 |0 \x86\x45\x2B |0 \x85\x35\x65 |0 - \x89\x38\x59 |0 - \x89\x38\x5A |0 - \x89\x38\x5B |0 - \x89\x38\x5C |0 - \x89\x38\x5D |0 - \x89\x38\x5E |0 - \x89\x38\x5F |0 - \x89\x38\x60 |0 \x86\x45\x2D |0 \x84\x35\x53 |0 \x86\x45\x29 |0 @@ -47306,12 +41814,6 @@ CHARMAP \x86\x4F\x2D |0 \x86\x58\x57 |0 \x85\x3C\x4A |0 - \x89\x3F\x3F |0 - \x89\x3F\x41 |0 - \x89\x3F\x42 |0 - \x89\x3F\x43 |0 - \x89\x3F\x44 |0 - \x89\x3F\x45 |0 \x86\x4F\x2F |0 \x86\x4F\x2A |0 \x85\x3C\x4D |0 @@ -47331,18 +41833,9 @@ CHARMAP \x86\x58\x62 |0 \x85\x43\x33 |0 \x86\x58\x5F |0 - \x89\x45\x48 |0 - \x89\x45\x49 |0 - \x89\x45\x4A |0 - \x89\x45\x4B |0 - \x89\x45\x4C |0 - \x89\x45\x4D |0 - \x89\x45\x4E |0 \x86\x58\x61 |0 - \x89\x3F\x40 |0 \x86\x58\x5B |0 \x85\x43\x2E |0 - \x89\x46\x34 |0 \x86\x62\x65 |0 \x84\x47\x55 |0 \x85\x4A\x26 |0 @@ -47353,12 +41846,6 @@ CHARMAP \x86\x62\x69 |0 \x85\x4A\x27 |0 \x84\x47\x57 |0 - \x89\x4C\x4D |0 - \x89\x4C\x4E |0 - \x89\x4C\x4F |0 - \x89\x4C\x51 |0 - \x89\x4C\x50 |0 - \x89\x4C\x4C |0 \x86\x62\x6B |0 \x86\x58\x5D |0 \x87\x29\x33 |0 @@ -47372,11 +41859,7 @@ CHARMAP \x87\x29\x39 |0 \x87\x29\x38 |0 \x87\x29\x32 |0 - \x89\x52\x3D |0 - \x89\x52\x3E |0 - \x89\x52\x3F |0 \x87\x29\x37 |0 - \x89\x4C\x4B |0 \x87\x33\x6A |0 \x85\x58\x4E |0 \x87\x33\x67 |0 @@ -47388,13 +41871,6 @@ CHARMAP \x87\x33\x68 |0 \x85\x58\x4D |0 \x86\x62\x68 |0 - \x89\x54\x32 |0 - \x89\x57\x7B |0 - \x89\x57\x7C |0 - \x89\x57\x7D |0 - \x89\x57\x7E |0 - \x89\x58\x21 |0 - \x89\x58\x22 |0 \x87\x33\x6D |0 \x87\x33\x6C |0 \x87\x33\x65 |0 @@ -47412,9 +41888,6 @@ CHARMAP \x87\x3C\x36 |0 \x87\x3C\x37 |0 \x87\x3C\x35 |0 - \x89\x5C\x6E |0 - \x89\x5C\x70 |0 - \x89\x5C\x6F |0 \x87\x43\x4B |0 \x85\x64\x73 |0 \x87\x43\x4E |0 @@ -47427,12 +41900,6 @@ CHARMAP \x85\x64\x72 |0 \x87\x43\x4D |0 \x87\x43\x4C |0 - \x89\x60\x76 |0 - \x89\x60\x77 |0 - \x89\x60\x78 |0 - \x89\x60\x79 |0 - \x89\x60\x7B |0 - \x89\x60\x7C |0 \x87\x43\x48 |0 \x87\x43\x50 |0 \x85\x64\x70 |0 @@ -47452,10 +41919,6 @@ CHARMAP \x87\x4A\x44 |0 \x87\x4A\x49 |0 \x87\x4A\x46 |0 - \x89\x63\x7C |0 - \x89\x63\x7D |0 - \x89\x63\x7E |0 - \x89\x64\x21 |0 \x87\x4A\x4E |0 \x87\x4A\x45 |0 \x85\x69\x5F |0 @@ -47465,34 +41928,22 @@ CHARMAP \x85\x6D\x6F |0 \x87\x50\x3E |0 \x87\x50\x40 |0 - \x89\x66\x3B |0 - \x89\x66\x3C |0 - \x89\x66\x3D |0 - \x89\x66\x3E |0 - \x89\x66\x3F |0 \x87\x50\x3F |0 \x85\x71\x43 |0 \x84\x67\x47 |0 \x85\x71\x44 |0 \x85\x71\x45 |0 - \x89\x68\x4E |0 - \x89\x68\x4F |0 \x87\x55\x3B |0 \x87\x59\x47 |0 \x85\x74\x45 |0 \x85\x74\x44 |0 - \x89\x69\x76 |0 - \x89\x69\x77 |0 - \x89\x69\x78 |0 \x87\x59\x4A |0 \x87\x59\x48 |0 \x87\x59\x49 |0 - \x89\x68\x4D |0 \x87\x5C\x71 |0 \x84\x6B\x22 |0 \x85\x74\x43 |0 \x87\x5C\x72 |0 - \x89\x6A\x78 |0 \x87\x5C\x73 |0 \x87\x5F\x5E |0 \x87\x5F\x60 |0 @@ -47502,22 +41953,17 @@ CHARMAP \x86\x34\x57 |0 \x86\x34\x58 |0 \x85\x35\x66 |0 - \x89\x38\x61 |0 \x86\x4F\x30 |0 \x84\x3B\x44 |0 \x86\x58\x63 |0 - \x89\x45\x4F |0 \x85\x4A\x2A |0 - \x89\x4C\x52 |0 \x87\x29\x3A |0 \x85\x58\x54 |0 \x85\x58\x53 |0 - \x89\x58\x23 |0 \x87\x33\x6F |0 \x85\x5E\x69 |0 \x85\x5E\x6A |0 \x85\x5E\x68 |0 - \x89\x5C\x71 |0 \x85\x64\x75 |0 \x87\x43\x53 |0 \x87\x4A\x50 |0 @@ -47527,11 +41973,6 @@ CHARMAP \x86\x2E\x32 |0 \x86\x2E\x33 |0 \x86\x34\x59 |0 - \x89\x2D\x4B |0 - \x89\x2D\x4D |0 - \x89\x2D\x4E |0 - \x89\x2D\x4F |0 - \x89\x2D\x50 |0 \x84\x2B\x4B |0 \x85\x30\x4D |0 \x86\x3C\x3E |0 @@ -47539,11 +41980,6 @@ CHARMAP \x85\x30\x4E |0 \x86\x3C\x3C |0 \x84\x30\x29 |0 - \x89\x32\x59 |0 - \x89\x32\x5A |0 - \x89\x32\x5B |0 - \x89\x32\x5C |0 - \x89\x32\x5D |0 \x85\x35\x6D |0 \x86\x45\x30 |0 \x85\x35\x67 |0 @@ -47556,16 +41992,8 @@ CHARMAP \x86\x45\x2F |0 \x85\x35\x6B |0 \x85\x35\x68 |0 - \x89\x38\x63 |0 - \x89\x38\x64 |0 - \x89\x38\x65 |0 - \x89\x38\x66 |0 - \x89\x38\x68 |0 - \x89\x38\x69 |0 - \x89\x38\x62 |0 \x85\x35\x6C |0 \x85\x35\x69 |0 - \x89\x38\x67 |0 \x85\x3C\x51 |0 \x85\x3C\x50 |0 \x85\x3C\x54 |0 @@ -47580,17 +42008,7 @@ CHARMAP \x85\x3C\x55 |0 \x86\x58\x64 |0 \x86\x4F\x35 |0 - \x89\x3F\x47 |0 - \x89\x3F\x48 |0 - \x89\x3F\x49 |0 - \x89\x3F\x4A |0 - \x89\x3F\x4B |0 - \x89\x3F\x4C |0 - \x89\x3F\x4F |0 - \x89\x3F\x50 |0 - \x89\x3F\x51 |0 \x86\x4F\x32 |0 - \x89\x3F\x4E |0 \x86\x58\x66 |0 \x85\x43\x36 |0 \x84\x41\x23 |0 @@ -47604,18 +42022,9 @@ CHARMAP \x86\x58\x6A |0 \x86\x58\x69 |0 \x85\x43\x3A |0 - \x89\x45\x50 |0 - \x89\x45\x51 |0 - \x89\x45\x52 |0 - \x89\x45\x53 |0 - \x89\x45\x54 |0 - \x89\x45\x55 |0 - \x89\x45\x56 |0 - \x89\x45\x57 |0 \x86\x58\x65 |0 \x86\x58\x67 |0 \x86\x62\x6D |0 - \x89\x3F\x4D |0 \x86\x62\x6E |0 \x84\x47\x5C |0 \x85\x4A\x2C |0 @@ -47632,13 +42041,6 @@ CHARMAP \x86\x62\x76 |0 \x85\x4A\x2D |0 \x86\x62\x73 |0 - \x89\x4C\x53 |0 - \x89\x4C\x54 |0 - \x89\x4C\x55 |0 - \x89\x4C\x56 |0 - \x89\x4C\x57 |0 - \x89\x4C\x58 |0 - \x89\x4C\x59 |0 \x86\x62\x70 |0 \x85\x51\x42 |0 \x85\x51\x3C |0 @@ -47660,11 +42062,8 @@ CHARMAP \x87\x33\x72 |0 \x85\x51\x45 |0 \x85\x51\x44 |0 - \x89\x52\x40 |0 - \x89\x52\x41 |0 \x87\x29\x43 |0 \x87\x29\x3B |0 - \x89\x58\x2D |0 \x84\x54\x23 |0 \x84\x54\x24 |0 \x84\x54\x28 |0 @@ -47680,15 +42079,6 @@ CHARMAP \x85\x58\x58 |0 \x85\x58\x5A |0 \x87\x33\x76 |0 - \x89\x58\x24 |0 - \x89\x58\x26 |0 - \x89\x58\x27 |0 - \x89\x58\x28 |0 - \x89\x58\x29 |0 - \x89\x58\x2A |0 - \x89\x58\x2B |0 - \x89\x58\x2C |0 - \x89\x58\x2E |0 \x87\x33\x78 |0 \x87\x33\x77 |0 \x85\x58\x5B |0 @@ -47708,12 +42098,6 @@ CHARMAP \x85\x5E\x6B |0 \x87\x3C\x3A |0 \x85\x5E\x73 |0 - \x89\x58\x25 |0 - \x89\x5C\x72 |0 - \x89\x5C\x73 |0 - \x89\x5C\x74 |0 - \x89\x5C\x75 |0 - \x89\x5C\x76 |0 \x87\x3C\x39 |0 \x85\x64\x79 |0 \x85\x64\x7C |0 @@ -47729,7 +42113,6 @@ CHARMAP \x87\x43\x5B |0 \x87\x43\x5A |0 \x85\x64\x7B |0 - \x89\x60\x7D |0 \x87\x43\x58 |0 \x87\x43\x55 |0 \x87\x43\x59 |0 @@ -47747,9 +42130,6 @@ CHARMAP \x87\x4A\x52 |0 \x85\x69\x69 |0 \x85\x69\x64 |0 - \x89\x64\x23 |0 - \x89\x64\x24 |0 - \x89\x64\x25 |0 \x87\x4A\x51 |0 \x87\x4A\x53 |0 \x84\x64\x52 |0 @@ -47761,9 +42141,6 @@ CHARMAP \x87\x50\x43 |0 \x85\x6D\x72 |0 \x87\x50\x42 |0 - \x89\x66\x40 |0 - \x89\x66\x41 |0 - \x89\x66\x42 |0 \x84\x67\x49 |0 \x85\x71\x48 |0 \x85\x71\x49 |0 @@ -47777,10 +42154,8 @@ CHARMAP \x84\x69\x4D |0 \x85\x74\x48 |0 \x85\x74\x47 |0 - \x89\x69\x79 |0 \x85\x76\x4F |0 \x85\x76\x50 |0 - \x89\x6A\x79 |0 \x87\x59\x4B |0 \x87\x5C\x75 |0 \x87\x5C\x76 |0 @@ -47795,7 +42170,6 @@ CHARMAP \x86\x2E\x34 |0 \x86\x34\x5B |0 \x85\x2B\x4D |0 - \x89\x2D\x51 |0 \x86\x34\x5A |0 \x86\x3C\x41 |0 \x84\x30\x2B |0 @@ -47820,7 +42194,6 @@ CHARMAP \x86\x45\x3B |0 \x86\x45\x32 |0 \x86\x45\x36 |0 - \x89\x38\x6A |0 \x86\x45\x31 |0 \x86\x45\x35 |0 \x86\x45\x39 |0 @@ -47842,9 +42215,7 @@ CHARMAP \x86\x4F\x39 |0 \x86\x58\x79 |0 \x85\x3C\x62 |0 - \x89\x3F\x54 |0 \x86\x4F\x37 |0 - \x89\x3F\x52 |0 \x86\x4F\x3A |0 \x85\x3C\x5E |0 \x85\x43\x41 |0 @@ -47873,7 +42244,6 @@ CHARMAP \x85\x43\x46 |0 \x86\x58\x75 |0 \x85\x4A\x35 |0 - \x89\x45\x59 |0 \x86\x58\x78 |0 \x86\x58\x6B |0 \x86\x63\x22 |0 @@ -47899,8 +42269,6 @@ CHARMAP \x85\x4A\x46 |0 \x86\x62\x79 |0 \x85\x4A\x47 |0 - \x89\x4C\x5A |0 - \x89\x4C\x5B |0 \x86\x62\x78 |0 \x86\x62\x7A |0 \x86\x62\x7D |0 @@ -47927,10 +42295,6 @@ CHARMAP \x87\x29\x4F |0 \x85\x51\x49 |0 \x87\x29\x4B |0 - \x89\x52\x42 |0 - \x89\x52\x43 |0 - \x89\x52\x44 |0 - \x89\x52\x45 |0 \x87\x29\x48 |0 \x87\x29\x4C |0 \x87\x29\x47 |0 @@ -47965,8 +42329,6 @@ CHARMAP \x84\x54\x2B |0 \x85\x58\x66 |0 \x84\x54\x2C |0 - \x89\x58\x31 |0 - \x89\x58\x32 |0 \x87\x34\x22 |0 \x85\x5E\x7A |0 \x85\x5E\x7D |0 @@ -47990,9 +42352,7 @@ CHARMAP \x87\x34\x27 |0 \x87\x3C\x3F |0 \x84\x59\x2F |0 - \x89\x5C\x77 |0 \x87\x3C\x3D |0 - \x89\x5C\x79 |0 \x85\x5E\x77 |0 \x85\x5E\x74 |0 \x87\x43\x62 |0 @@ -48019,12 +42379,6 @@ CHARMAP \x84\x5F\x33 |0 \x84\x5D\x76 |0 \x85\x65\x25 |0 - \x89\x60\x7E |0 - \x89\x61\x21 |0 - \x89\x61\x22 |0 - \x89\x61\x23 |0 - \x89\x61\x24 |0 - \x89\x61\x25 |0 \x87\x43\x6B |0 \x85\x65\x27 |0 \x87\x43\x60 |0 @@ -48090,11 +42444,6 @@ CHARMAP \x85\x6D\x75 |0 \x85\x6D\x74 |0 \x87\x50\x49 |0 - \x89\x66\x43 |0 - \x89\x66\x44 |0 - \x89\x66\x45 |0 - \x89\x66\x46 |0 - \x89\x66\x47 |0 \x87\x50\x45 |0 \x87\x50\x4A |0 \x87\x50\x4B |0 @@ -48113,8 +42462,6 @@ CHARMAP \x87\x55\x43 |0 \x87\x55\x40 |0 \x85\x71\x4A |0 - \x89\x68\x51 |0 - \x89\x68\x52 |0 \x85\x74\x4A |0 \x87\x55\x45 |0 \x87\x59\x4C |0 @@ -48125,7 +42472,6 @@ CHARMAP \x87\x59\x4D |0 \x85\x74\x51 |0 \x87\x59\x4E |0 - \x89\x69\x7A |0 \x87\x59\x4F |0 \x85\x74\x50 |0 \x85\x76\x54 |0 @@ -48151,7 +42497,6 @@ CHARMAP \x87\x61\x53 |0 \x87\x61\x51 |0 \x87\x61\x50 |0 - \x89\x6B\x67 |0 \x85\x7A\x3C |0 \x85\x7A\x3B |0 \x85\x7A\x3D |0 @@ -48159,9 +42504,7 @@ CHARMAP \x85\x7B\x4A |0 \x87\x64\x63 |0 \x85\x7B\x6A |0 - \x89\x6D\x28 |0 \x87\x65\x65 |0 - \x89\x6D\x33 |0 \x86\x23\x39 |0 \x86\x23\x3A |0 \x86\x25\x55 |0 @@ -48179,17 +42522,12 @@ CHARMAP \x86\x45\x43 |0 \x86\x45\x44 |0 \x84\x35\x60 |0 - \x89\x38\x6B |0 \x85\x3C\x65 |0 \x86\x4F\x3F |0 \x85\x3C\x64 |0 \x86\x4F\x41 |0 \x86\x4F\x3E |0 \x85\x3C\x66 |0 - \x89\x3F\x55 |0 - \x89\x3F\x56 |0 - \x89\x3F\x57 |0 - \x89\x3F\x58 |0 \x86\x4F\x3D |0 \x86\x4F\x40 |0 \x86\x58\x7D |0 @@ -48197,9 +42535,6 @@ CHARMAP \x86\x58\x7A |0 \x86\x58\x7E |0 \x86\x59\x21 |0 - \x89\x45\x5A |0 - \x89\x45\x5B |0 - \x89\x45\x5C |0 \x86\x58\x7B |0 \x86\x58\x7C |0 \x86\x59\x22 |0 @@ -48209,43 +42544,28 @@ CHARMAP \x85\x4A\x49 |0 \x86\x63\x25 |0 \x86\x63\x26 |0 - \x89\x4C\x5C |0 - \x89\x4C\x5D |0 - \x89\x4C\x5E |0 \x87\x29\x51 |0 \x85\x51\x56 |0 \x84\x4E\x25 |0 - \x89\x52\x46 |0 - \x89\x52\x48 |0 \x87\x29\x50 |0 \x85\x58\x6A |0 \x84\x54\x31 |0 \x85\x58\x6B |0 \x87\x34\x28 |0 \x87\x3C\x46 |0 - \x89\x58\x34 |0 - \x89\x58\x36 |0 \x87\x3C\x48 |0 \x87\x3C\x47 |0 \x87\x3C\x45 |0 \x85\x5F\x21 |0 - \x89\x5C\x7A |0 - \x89\x5C\x7B |0 \x85\x65\x30 |0 \x87\x43\x6C |0 - \x89\x61\x26 |0 - \x89\x61\x27 |0 \x87\x4A\x6C |0 \x87\x4A\x6D |0 \x87\x4A\x6A |0 - \x89\x64\x26 |0 - \x89\x64\x27 |0 \x87\x4A\x6B |0 \x87\x4A\x69 |0 \x84\x64\x5E |0 \x87\x50\x4D |0 - \x89\x66\x48 |0 - \x89\x66\x49 |0 \x87\x50\x4E |0 \x87\x55\x46 |0 \x85\x71\x4D |0 @@ -48253,22 +42573,16 @@ CHARMAP \x87\x55\x48 |0 \x87\x55\x49 |0 \x87\x59\x50 |0 - \x89\x69\x7C |0 \x85\x76\x56 |0 \x85\x79\x51 |0 \x86\x34\x5C |0 \x85\x2B\x4E |0 \x86\x34\x5E |0 - \x89\x2D\x52 |0 - \x89\x2D\x54 |0 \x86\x3C\x45 |0 \x85\x30\x54 |0 \x86\x3C\x47 |0 - \x89\x32\x5F |0 - \x89\x32\x60 |0 \x86\x3C\x46 |0 \x85\x30\x53 |0 - \x89\x32\x5E |0 \x85\x35\x7B |0 \x86\x45\x4E |0 \x86\x45\x4D |0 @@ -48283,7 +42597,6 @@ CHARMAP \x86\x45\x4B |0 \x85\x35\x7C |0 \x85\x35\x7E |0 - \x89\x38\x6D |0 \x86\x45\x48 |0 \x86\x45\x49 |0 \x84\x35\x65 |0 @@ -48315,9 +42628,6 @@ CHARMAP \x85\x43\x4F |0 \x86\x59\x27 |0 \x85\x43\x4E |0 - \x89\x45\x5D |0 - \x89\x45\x5E |0 - \x89\x45\x5F |0 \x86\x59\x25 |0 \x84\x41\x2D |0 \x85\x43\x54 |0 @@ -48335,10 +42645,6 @@ CHARMAP \x85\x4A\x4E |0 \x86\x63\x31 |0 \x86\x63\x2E |0 - \x89\x4C\x5F |0 - \x89\x4C\x60 |0 - \x89\x4C\x61 |0 - \x89\x4C\x63 |0 \x85\x4A\x4F |0 \x85\x4A\x4C |0 \x87\x29\x59 |0 @@ -48366,10 +42672,6 @@ CHARMAP \x85\x51\x57 |0 \x87\x29\x54 |0 \x87\x29\x63 |0 - \x89\x52\x49 |0 - \x89\x52\x4A |0 - \x89\x52\x4B |0 - \x89\x52\x4C |0 \x87\x29\x53 |0 \x87\x29\x5F |0 \x87\x29\x60 |0 @@ -48392,13 +42694,9 @@ CHARMAP \x87\x34\x36 |0 \x85\x58\x6C |0 \x87\x34\x33 |0 - \x89\x58\x37 |0 - \x89\x58\x39 |0 - \x89\x58\x3A |0 \x87\x34\x2C |0 \x87\x34\x2E |0 \x87\x34\x2A |0 - \x89\x58\x38 |0 \x84\x54\x35 |0 \x85\x58\x6F |0 \x87\x3C\x4A |0 @@ -48421,8 +42719,6 @@ CHARMAP \x85\x5F\x24 |0 \x85\x5F\x2A |0 \x87\x3C\x49 |0 - \x89\x5C\x7C |0 - \x89\x5C\x7D |0 \x87\x3C\x4E |0 \x87\x3C\x4F |0 \x85\x5F\x26 |0 @@ -48433,9 +42729,6 @@ CHARMAP \x84\x5E\x21 |0 \x85\x65\x32 |0 \x85\x65\x34 |0 - \x89\x61\x28 |0 - \x89\x61\x29 |0 - \x89\x61\x2A |0 \x87\x43\x6F |0 \x87\x43\x72 |0 \x87\x43\x71 |0 @@ -48455,7 +42748,6 @@ CHARMAP \x85\x69\x77 |0 \x85\x69\x7B |0 \x87\x4A\x72 |0 - \x89\x64\x28 |0 \x87\x4A\x74 |0 \x84\x64\x62 |0 \x85\x6E\x25 |0 @@ -48465,7 +42757,6 @@ CHARMAP \x85\x6E\x22 |0 \x87\x50\x51 |0 \x85\x6E\x21 |0 - \x89\x66\x4A |0 \x87\x50\x52 |0 \x87\x50\x50 |0 \x87\x50\x4F |0 @@ -48522,10 +42813,7 @@ CHARMAP \x85\x36\x24 |0 \x84\x41\x2E |0 \x86\x59\x2A |0 - \x89\x45\x61 |0 \x85\x4A\x51 |0 - \x89\x4C\x65 |0 - \x89\x4C\x66 |0 \x85\x4A\x52 |0 \x87\x29\x64 |0 \x87\x29\x65 |0 @@ -48534,13 +42822,8 @@ CHARMAP \x87\x34\x37 |0 \x85\x58\x75 |0 \x87\x34\x38 |0 - \x89\x58\x3B |0 \x85\x5F\x2D |0 \x85\x5F\x2C |0 - \x89\x5C\x7E |0 - \x89\x5D\x21 |0 - \x89\x5D\x22 |0 - \x89\x5D\x23 |0 \x85\x5F\x2E |0 \x85\x65\x37 |0 \x85\x65\x36 |0 @@ -48548,9 +42831,7 @@ CHARMAP \x87\x4A\x75 |0 \x84\x61\x5C |0 \x87\x4A\x76 |0 - \x89\x66\x4B |0 \x87\x50\x55 |0 - \x89\x68\x54 |0 \x87\x59\x58 |0 \x87\x5F\x68 |0 \x87\x65\x47 |0 @@ -48560,7 +42841,6 @@ CHARMAP \x86\x59\x2D |0 \x86\x59\x2C |0 \x86\x59\x2B |0 - \x89\x52\x4D |0 \x87\x33\x21 |0 \x84\x61\x5D |0 \x87\x55\x4D |0 @@ -48572,8 +42852,6 @@ CHARMAP \x84\x25\x24 |0 \x86\x3C\x49 |0 \x86\x29\x2E |0 - \x89\x25\x33 |0 - \x89\x25\x34 |0 \x86\x3C\x4A |0 \x86\x29\x2F |0 \x85\x24\x78 |0 @@ -48590,12 +42868,6 @@ CHARMAP \x85\x27\x6D |0 \x84\x28\x28 |0 \x86\x2E\x3B |0 - \x89\x28\x6D |0 - \x89\x28\x6F |0 - \x89\x28\x70 |0 - \x89\x28\x73 |0 - \x89\x28\x74 |0 - \x89\x28\x75 |0 \x86\x2E\x3A |0 \x86\x2E\x3F |0 \x85\x27\x6E |0 @@ -48617,11 +42889,6 @@ CHARMAP \x85\x2B\x50 |0 \x86\x34\x64 |0 \x86\x34\x63 |0 - \x89\x2D\x55 |0 - \x89\x2D\x56 |0 - \x89\x2D\x57 |0 - \x89\x2D\x58 |0 - \x89\x2D\x59 |0 \x84\x2B\x52 |0 \x86\x34\x65 |0 \x86\x34\x61 |0 @@ -48661,9 +42928,6 @@ CHARMAP \x85\x36\x29 |0 \x86\x45\x57 |0 \x86\x45\x5A |0 - \x89\x38\x70 |0 - \x89\x38\x71 |0 - \x89\x38\x72 |0 \x86\x45\x56 |0 \x86\x45\x54 |0 \x86\x45\x55 |0 @@ -48676,7 +42940,6 @@ CHARMAP \x86\x45\x59 |0 \x85\x36\x2D |0 \x85\x36\x28 |0 - \x89\x38\x6F |0 \x86\x45\x51 |0 \x85\x3C\x76 |0 \x85\x3C\x72 |0 @@ -48696,19 +42959,10 @@ CHARMAP \x84\x3B\x5B |0 \x86\x4F\x49 |0 \x86\x4F\x4B |0 - \x89\x3F\x62 |0 \x86\x4F\x51 |0 \x86\x4F\x54 |0 \x86\x4F\x55 |0 \x86\x4F\x4A |0 - \x89\x3F\x59 |0 - \x89\x3F\x5A |0 - \x89\x3F\x5B |0 - \x89\x3F\x5C |0 - \x89\x3F\x5D |0 - \x89\x3F\x5F |0 - \x89\x3F\x60 |0 - \x89\x3F\x61 |0 \x85\x3C\x75 |0 \x86\x4F\x4E |0 \x85\x3C\x74 |0 @@ -48735,17 +42989,6 @@ CHARMAP \x84\x41\x32 |0 \x86\x59\x33 |0 \x86\x59\x3E |0 - \x89\x45\x62 |0 - \x89\x45\x63 |0 - \x89\x45\x64 |0 - \x89\x45\x65 |0 - \x89\x45\x66 |0 - \x89\x45\x67 |0 - \x89\x45\x68 |0 - \x89\x45\x69 |0 - \x89\x45\x6A |0 - \x89\x45\x6B |0 - \x89\x45\x6C |0 \x86\x59\x32 |0 \x86\x59\x36 |0 \x86\x59\x3C |0 @@ -48770,15 +43013,6 @@ CHARMAP \x86\x63\x33 |0 \x86\x63\x3B |0 \x87\x3C\x55 |0 - \x89\x4C\x69 |0 - \x89\x4C\x6A |0 - \x89\x4C\x6C |0 - \x89\x4C\x6D |0 - \x89\x4C\x6E |0 - \x89\x4C\x6F |0 - \x89\x4C\x70 |0 - \x89\x4C\x71 |0 - \x89\x4C\x72 |0 \x86\x63\x39 |0 \x87\x3C\x56 |0 \x87\x3C\x57 |0 @@ -48796,11 +43030,6 @@ CHARMAP \x85\x51\x65 |0 \x84\x4E\x34 |0 \x87\x29\x70 |0 - \x89\x52\x4E |0 - \x89\x52\x4F |0 - \x89\x52\x50 |0 - \x89\x52\x51 |0 - \x89\x52\x52 |0 \x85\x51\x6D |0 \x87\x29\x6A |0 \x87\x29\x6F |0 @@ -48837,11 +43066,7 @@ CHARMAP \x87\x34\x3C |0 \x87\x34\x40 |0 \x87\x34\x4C |0 - \x89\x58\x3C |0 - \x89\x58\x3D |0 - \x89\x58\x3E |0 \x87\x34\x3D |0 - \x89\x58\x3F |0 \x87\x2C\x5A |0 \x87\x34\x48 |0 \x87\x34\x3B |0 @@ -48866,15 +43091,10 @@ CHARMAP \x87\x3C\x5E |0 \x85\x5F\x32 |0 \x85\x5F\x35 |0 - \x89\x5D\x24 |0 - \x89\x5D\x26 |0 - \x89\x5D\x27 |0 - \x89\x5D\x28 |0 \x87\x3C\x59 |0 \x87\x3C\x5C |0 \x87\x3C\x5F |0 \x87\x3C\x63 |0 - \x89\x5D\x25 |0 \x85\x5F\x36 |0 \x85\x5F\x37 |0 \x85\x5F\x31 |0 @@ -48886,9 +43106,6 @@ CHARMAP \x87\x43\x7A |0 \x85\x65\x3A |0 \x87\x43\x78 |0 - \x89\x61\x2B |0 - \x89\x61\x2C |0 - \x89\x61\x2D |0 \x87\x44\x21 |0 \x87\x43\x7E |0 \x85\x65\x39 |0 @@ -48902,10 +43119,6 @@ CHARMAP \x87\x4B\x21 |0 \x87\x4B\x22 |0 \x87\x4A\x7E |0 - \x89\x64\x2A |0 - \x89\x64\x2B |0 - \x89\x64\x2D |0 - \x89\x64\x2E |0 \x87\x4A\x79 |0 \x87\x4A\x7A |0 \x87\x4A\x7D |0 @@ -48914,12 +43127,10 @@ CHARMAP \x87\x4A\x78 |0 \x85\x6A\x21 |0 \x85\x69\x7E |0 - \x89\x64\x2C |0 \x87\x50\x5A |0 \x85\x6E\x29 |0 \x87\x50\x59 |0 \x85\x6E\x27 |0 - \x89\x66\x4C |0 \x87\x50\x58 |0 \x85\x6E\x28 |0 \x87\x5D\x22 |0 @@ -48928,10 +43139,6 @@ CHARMAP \x85\x71\x51 |0 \x87\x55\x50 |0 \x87\x55\x4E |0 - \x89\x68\x55 |0 - \x89\x68\x56 |0 - \x89\x68\x57 |0 - \x89\x68\x58 |0 \x85\x71\x4F |0 \x85\x71\x50 |0 \x85\x69\x7D |0 @@ -48972,11 +43179,6 @@ CHARMAP \x85\x24\x7A |0 \x84\x35\x71 |0 \x86\x29\x32 |0 - \x89\x25\x35 |0 - \x89\x25\x36 |0 - \x89\x25\x37 |0 - \x89\x38\x73 |0 - \x89\x38\x75 |0 \x86\x45\x61 |0 \x86\x45\x5F |0 \x86\x45\x60 |0 @@ -48993,16 +43195,10 @@ CHARMAP \x85\x27\x73 |0 \x86\x4F\x58 |0 \x86\x2E\x43 |0 - \x89\x28\x76 |0 - \x89\x28\x78 |0 - \x89\x28\x79 |0 - \x89\x28\x7C |0 \x86\x4F\x5A |0 \x86\x2E\x41 |0 \x86\x2E\x42 |0 \x86\x2E\x40 |0 - \x89\x28\x77 |0 - \x89\x28\x7B |0 \x86\x4F\x57 |0 \x86\x4F\x59 |0 \x85\x27\x74 |0 @@ -49014,8 +43210,6 @@ CHARMAP \x85\x2B\x5F |0 \x84\x41\x33 |0 \x85\x2B\x5B |0 - \x89\x2D\x5A |0 - \x89\x45\x6E |0 \x86\x59\x45 |0 \x86\x59\x44 |0 \x86\x59\x46 |0 @@ -49053,9 +43247,6 @@ CHARMAP \x85\x30\x67 |0 \x86\x63\x3E |0 \x86\x3C\x59 |0 - \x89\x32\x62 |0 - \x89\x32\x63 |0 - \x89\x32\x64 |0 \x85\x51\x6E |0 \x84\x4E\x36 |0 \x84\x35\x6F |0 @@ -49070,9 +43261,6 @@ CHARMAP \x87\x29\x7A |0 \x87\x29\x79 |0 \x86\x45\x68 |0 - \x89\x32\x61 |0 - \x89\x38\x76 |0 - \x89\x52\x54 |0 \x87\x29\x76 |0 \x87\x29\x77 |0 \x87\x29\x7B |0 @@ -49081,7 +43269,6 @@ CHARMAP \x86\x45\x65 |0 \x86\x45\x64 |0 \x86\x45\x62 |0 - \x89\x33\x3C |0 \x86\x45\x67 |0 \x85\x36\x2F |0 \x85\x36\x33 |0 @@ -49100,10 +43287,6 @@ CHARMAP \x86\x4F\x62 |0 \x86\x4F\x5B |0 \x84\x3B\x5C |0 - \x89\x3F\x63 |0 - \x89\x3F\x64 |0 - \x89\x3F\x65 |0 - \x89\x58\x41 |0 \x87\x34\x4E |0 \x86\x4F\x5D |0 \x86\x4F\x5C |0 @@ -49111,7 +43294,6 @@ CHARMAP \x86\x4F\x5F |0 \x86\x4F\x60 |0 \x86\x4F\x61 |0 - \x89\x3F\x66 |0 \x86\x4F\x63 |0 \x87\x34\x4D |0 \x85\x3C\x7B |0 @@ -49132,7 +43314,6 @@ CHARMAP \x85\x43\x65 |0 \x86\x59\x49 |0 \x85\x43\x5A |0 - \x89\x45\x6F |0 \x86\x59\x48 |0 \x86\x59\x4B |0 \x85\x43\x61 |0 @@ -49174,9 +43355,6 @@ CHARMAP \x87\x29\x7E |0 \x87\x2A\x22 |0 \x84\x4E\x3A |0 - \x89\x52\x53 |0 - \x89\x52\x55 |0 - \x89\x52\x56 |0 \x87\x4B\x26 |0 \x87\x4B\x24 |0 \x87\x2A\x23 |0 @@ -49202,7 +43380,6 @@ CHARMAP \x85\x59\x23 |0 \x84\x54\x39 |0 \x87\x34\x51 |0 - \x89\x58\x40 |0 \x87\x50\x5D |0 \x87\x50\x5B |0 \x85\x6E\x2B |0 @@ -49251,19 +43428,16 @@ CHARMAP \x87\x50\x5E |0 \x87\x50\x60 |0 \x84\x67\x56 |0 - \x89\x68\x59 |0 \x87\x55\x56 |0 \x87\x55\x57 |0 \x87\x59\x5D |0 \x87\x55\x58 |0 - \x89\x68\x5A |0 \x87\x5D\x26 |0 \x87\x5F\x6B |0 \x87\x5F\x6C |0 \x85\x7B\x4B |0 \x87\x63\x78 |0 \x84\x30\x39 |0 - \x89\x32\x65 |0 \x86\x3C\x60 |0 \x85\x36\x38 |0 \x85\x36\x37 |0 @@ -49280,7 +43454,6 @@ CHARMAP \x86\x45\x6F |0 \x86\x45\x6A |0 \x86\x45\x6B |0 - \x89\x38\x77 |0 \x86\x45\x71 |0 \x84\x35\x79 |0 \x86\x45\x6D |0 @@ -49299,10 +43472,6 @@ CHARMAP \x84\x3B\x61 |0 \x86\x4F\x67 |0 \x86\x4F\x68 |0 - \x89\x3F\x68 |0 - \x89\x3F\x69 |0 - \x89\x3F\x6A |0 - \x89\x3F\x6B |0 \x86\x4F\x6C |0 \x85\x43\x69 |0 \x85\x43\x6C |0 @@ -49313,13 +43482,8 @@ CHARMAP \x86\x63\x4A |0 \x85\x4A\x66 |0 \x85\x4A\x65 |0 - \x89\x4C\x73 |0 - \x89\x4C\x74 |0 - \x89\x4C\x75 |0 - \x89\x4C\x77 |0 \x86\x63\x49 |0 \x86\x63\x48 |0 - \x89\x4C\x78 |0 \x86\x63\x47 |0 \x87\x2A\x28 |0 \x85\x51\x78 |0 @@ -49334,9 +43498,6 @@ CHARMAP \x87\x2A\x29 |0 \x87\x2A\x27 |0 \x85\x51\x77 |0 - \x89\x4C\x76 |0 - \x89\x52\x58 |0 - \x89\x52\x59 |0 \x87\x2A\x2A |0 \x87\x2A\x2B |0 \x87\x2A\x32 |0 @@ -49357,8 +43518,6 @@ CHARMAP \x87\x34\x5D |0 \x87\x34\x5C |0 \x85\x59\x2B |0 - \x89\x58\x42 |0 - \x89\x58\x43 |0 \x87\x34\x59 |0 \x87\x34\x5B |0 \x87\x34\x53 |0 @@ -49377,9 +43536,6 @@ CHARMAP \x85\x5F\x44 |0 \x87\x3C\x6D |0 \x87\x3C\x73 |0 - \x89\x5D\x2A |0 - \x89\x5D\x2B |0 - \x89\x5D\x2C |0 \x87\x3C\x6F |0 \x87\x3C\x71 |0 \x87\x3C\x72 |0 @@ -49401,7 +43557,6 @@ CHARMAP \x87\x44\x35 |0 \x87\x44\x36 |0 \x87\x44\x2D |0 - \x89\x61\x2E |0 \x87\x44\x31 |0 \x87\x44\x2E |0 \x85\x65\x4C |0 @@ -49432,7 +43587,6 @@ CHARMAP \x85\x6E\x30 |0 \x87\x50\x63 |0 \x87\x50\x64 |0 - \x89\x66\x4E |0 \x87\x50\x65 |0 \x87\x50\x67 |0 \x87\x50\x66 |0 @@ -49441,7 +43595,6 @@ CHARMAP \x84\x67\x58 |0 \x85\x71\x53 |0 \x87\x55\x5A |0 - \x89\x68\x5B |0 \x87\x55\x59 |0 \x87\x59\x5E |0 \x87\x59\x5F |0 @@ -49449,7 +43602,6 @@ CHARMAP \x85\x74\x53 |0 \x87\x59\x61 |0 \x87\x59\x60 |0 - \x89\x69\x7D |0 \x87\x5D\x27 |0 \x87\x5D\x29 |0 \x85\x76\x5A |0 @@ -49457,7 +43609,6 @@ CHARMAP \x87\x5D\x2A |0 \x85\x76\x5B |0 \x87\x5D\x28 |0 - \x89\x6A\x7A |0 \x85\x78\x3F |0 \x84\x6C\x2F |0 \x87\x5F\x6D |0 @@ -49482,10 +43633,7 @@ CHARMAP \x85\x59\x2D |0 \x87\x34\x61 |0 \x85\x5F\x45 |0 - \x89\x5D\x2D |0 \x87\x44\x37 |0 - \x89\x66\x4F |0 - \x89\x68\x5C |0 \x85\x74\x54 |0 \x85\x36\x3C |0 \x86\x3C\x61 |0 @@ -49493,22 +43641,17 @@ CHARMAP \x86\x4F\x6E |0 \x85\x3D\x29 |0 \x85\x3D\x28 |0 - \x89\x45\x70 |0 \x86\x63\x4D |0 \x87\x2A\x35 |0 \x85\x5F\x46 |0 - \x89\x61\x2F |0 \x85\x65\x4D |0 - \x89\x68\x5D |0 \x85\x71\x54 |0 \x87\x55\x5B |0 \x86\x3C\x64 |0 - \x89\x32\x66 |0 \x86\x3C\x62 |0 \x85\x36\x3D |0 \x86\x45\x76 |0 \x86\x45\x77 |0 - \x89\x38\x78 |0 \x86\x4F\x73 |0 \x86\x4F\x74 |0 \x86\x4F\x75 |0 @@ -49518,59 +43661,28 @@ CHARMAP \x86\x4F\x76 |0 \x86\x4F\x70 |0 \x86\x4F\x79 |0 - \x89\x3F\x6C |0 - \x89\x3F\x6D |0 - \x89\x3F\x6E |0 - \x89\x3F\x6F |0 - \x89\x3F\x72 |0 - \x89\x3F\x74 |0 - \x89\x3F\x71 |0 \x86\x4F\x77 |0 - \x89\x3F\x70 |0 \x84\x41\x47 |0 \x85\x43\x6E |0 \x84\x41\x45 |0 \x84\x41\x44 |0 \x86\x59\x53 |0 \x86\x59\x4F |0 - \x89\x45\x71 |0 - \x89\x45\x75 |0 - \x89\x45\x76 |0 - \x89\x45\x77 |0 - \x89\x45\x78 |0 \x86\x59\x55 |0 \x86\x59\x51 |0 \x86\x59\x52 |0 - \x89\x45\x79 |0 \x86\x59\x54 |0 \x86\x59\x50 |0 - \x89\x45\x74 |0 \x85\x4A\x67 |0 \x85\x4A\x68 |0 \x86\x63\x52 |0 \x85\x4A\x69 |0 - \x89\x4C\x68 |0 - \x89\x4C\x79 |0 - \x89\x4C\x7B |0 - \x89\x4C\x7C |0 - \x89\x4C\x7D |0 - \x89\x4D\x21 |0 - \x89\x4D\x23 |0 - \x89\x4D\x24 |0 - \x89\x4D\x25 |0 - \x89\x4D\x28 |0 - \x89\x4D\x29 |0 \x86\x63\x4E |0 \x84\x47\x7A |0 \x86\x63\x50 |0 \x86\x63\x51 |0 - \x89\x4D\x2A |0 \x86\x63\x54 |0 - \x89\x4C\x7A |0 \x86\x63\x55 |0 - \x89\x4D\x2B |0 - \x89\x4D\x26 |0 - \x89\x4C\x7E |0 \x87\x2A\x3A |0 \x84\x4E\x42 |0 \x85\x51\x7E |0 @@ -49584,29 +43696,12 @@ CHARMAP \x87\x2A\x3D |0 \x85\x51\x7B |0 \x87\x2A\x37 |0 - \x89\x52\x5B |0 - \x89\x52\x5D |0 - \x89\x52\x5F |0 - \x89\x52\x60 |0 - \x89\x52\x63 |0 - \x89\x52\x64 |0 - \x89\x52\x65 |0 - \x89\x52\x67 |0 - \x89\x52\x68 |0 - \x89\x52\x69 |0 - \x89\x52\x6A |0 - \x89\x52\x6C |0 - \x89\x52\x6D |0 \x87\x2A\x42 |0 \x87\x2A\x3C |0 \x87\x2A\x3F |0 \x87\x2A\x45 |0 - \x89\x52\x5E |0 \x87\x2A\x36 |0 \x85\x51\x7C |0 - \x89\x52\x62 |0 - \x89\x52\x66 |0 - \x89\x52\x5A |0 \x85\x59\x34 |0 \x85\x59\x37 |0 \x85\x59\x32 |0 @@ -49625,35 +43720,7 @@ CHARMAP \x87\x34\x68 |0 \x85\x59\x2F |0 \x87\x34\x66 |0 - \x89\x52\x5C |0 \x85\x59\x33 |0 - \x89\x58\x44 |0 - \x89\x58\x46 |0 - \x89\x58\x47 |0 - \x89\x58\x49 |0 - \x89\x58\x4A |0 - \x89\x58\x4B |0 - \x89\x58\x4D |0 - \x89\x58\x4E |0 - \x89\x58\x4F |0 - \x89\x58\x51 |0 - \x89\x58\x53 |0 - \x89\x58\x54 |0 - \x89\x58\x56 |0 - \x89\x58\x57 |0 - \x89\x58\x5A |0 - \x89\x58\x5C |0 - \x89\x58\x5D |0 - \x89\x58\x5E |0 - \x89\x58\x60 |0 - \x89\x58\x61 |0 - \x89\x58\x63 |0 - \x89\x58\x64 |0 - \x89\x58\x50 |0 - \x89\x58\x52 |0 - \x89\x58\x5F |0 - \x89\x58\x45 |0 - \x89\x58\x58 |0 \x85\x59\x38 |0 \x85\x59\x31 |0 \x85\x5F\x48 |0 @@ -49672,41 +43739,13 @@ CHARMAP \x87\x3D\x24 |0 \x87\x3D\x21 |0 \x87\x3D\x25 |0 - \x89\x5D\x2F |0 - \x89\x5D\x30 |0 - \x89\x5D\x34 |0 - \x89\x5D\x35 |0 - \x89\x5D\x36 |0 - \x89\x5D\x37 |0 - \x89\x5D\x3A |0 - \x89\x5D\x3B |0 - \x89\x5D\x3C |0 - \x89\x5D\x3D |0 - \x89\x5D\x3F |0 - \x89\x5D\x40 |0 - \x89\x5D\x42 |0 - \x89\x5D\x43 |0 - \x89\x5D\x44 |0 - \x89\x5D\x45 |0 - \x89\x5D\x46 |0 - \x89\x5D\x47 |0 - \x89\x5D\x48 |0 - \x89\x5D\x49 |0 - \x89\x5D\x4B |0 - \x89\x5D\x4E |0 - \x89\x5D\x4F |0 \x87\x3C\x7D |0 \x87\x3D\x22 |0 \x87\x3C\x78 |0 \x87\x3D\x23 |0 \x84\x59\x48 |0 - \x89\x5D\x4A |0 - \x89\x5D\x38 |0 - \x89\x5D\x33 |0 - \x89\x5D\x31 |0 \x85\x5F\x4E |0 \x85\x5F\x4D |0 - \x89\x5D\x2E |0 \x85\x65\x51 |0 \x84\x5E\x2D |0 \x84\x5E\x2E |0 @@ -49725,30 +43764,10 @@ CHARMAP \x85\x65\x54 |0 \x85\x65\x55 |0 \x87\x44\x41 |0 - \x89\x61\x31 |0 - \x89\x61\x32 |0 - \x89\x61\x34 |0 - \x89\x61\x36 |0 - \x89\x61\x37 |0 - \x89\x61\x38 |0 - \x89\x61\x3A |0 - \x89\x61\x3C |0 - \x89\x61\x3D |0 - \x89\x61\x3E |0 - \x89\x61\x40 |0 - \x89\x61\x41 |0 - \x89\x61\x42 |0 - \x89\x61\x44 |0 - \x89\x61\x45 |0 - \x89\x61\x46 |0 \x87\x44\x3B |0 \x87\x44\x3C |0 \x87\x44\x3E |0 \x87\x44\x3D |0 - \x89\x61\x30 |0 - \x89\x61\x39 |0 - \x89\x61\x35 |0 - \x89\x5F\x5D |0 \x84\x61\x6B |0 \x87\x4B\x33 |0 \x87\x4B\x37 |0 @@ -49760,31 +43779,12 @@ CHARMAP \x87\x4B\x36 |0 \x87\x4B\x39 |0 \x87\x4B\x3B |0 - \x89\x64\x31 |0 - \x89\x64\x32 |0 - \x89\x64\x33 |0 - \x89\x64\x35 |0 - \x89\x64\x36 |0 - \x89\x64\x38 |0 - \x89\x64\x39 |0 - \x89\x64\x3A |0 - \x89\x64\x3B |0 - \x89\x64\x3C |0 - \x89\x64\x3D |0 - \x89\x64\x3F |0 - \x89\x64\x40 |0 - \x89\x64\x41 |0 - \x89\x64\x42 |0 - \x89\x64\x43 |0 - \x89\x64\x44 |0 - \x89\x64\x45 |0 \x87\x4B\x3C |0 \x87\x4B\x35 |0 \x87\x4B\x38 |0 \x84\x61\x6A |0 \x87\x4B\x31 |0 \x85\x65\x56 |0 - \x89\x64\x3E |0 \x84\x64\x68 |0 \x87\x50\x6D |0 \x87\x50\x6E |0 @@ -49801,36 +43801,8 @@ CHARMAP \x84\x64\x6E |0 \x87\x50\x71 |0 \x85\x6E\x34 |0 - \x89\x66\x50 |0 - \x89\x66\x51 |0 - \x89\x66\x53 |0 - \x89\x66\x54 |0 - \x89\x66\x55 |0 - \x89\x66\x56 |0 - \x89\x66\x58 |0 - \x89\x66\x59 |0 - \x89\x66\x5A |0 - \x89\x66\x5B |0 - \x89\x66\x5D |0 - \x89\x66\x5F |0 - \x89\x66\x60 |0 - \x89\x66\x61 |0 - \x89\x66\x62 |0 - \x89\x66\x63 |0 - \x89\x66\x64 |0 - \x89\x66\x66 |0 - \x89\x66\x68 |0 - \x89\x66\x6A |0 - \x89\x66\x6B |0 - \x89\x66\x6C |0 - \x89\x66\x6D |0 - \x89\x66\x6E |0 - \x89\x66\x6F |0 \x87\x50\x6C |0 \x87\x50\x6F |0 - \x89\x66\x52 |0 - \x89\x66\x5C |0 - \x89\x66\x67 |0 \x87\x50\x6A |0 \x87\x55\x62 |0 \x84\x67\x5E |0 @@ -49843,92 +43815,38 @@ CHARMAP \x87\x55\x63 |0 \x87\x55\x69 |0 \x87\x55\x5E |0 - \x89\x68\x5E |0 - \x89\x68\x5F |0 - \x89\x68\x60 |0 - \x89\x68\x61 |0 - \x89\x68\x62 |0 - \x89\x68\x63 |0 - \x89\x68\x64 |0 - \x89\x68\x65 |0 - \x89\x68\x66 |0 - \x89\x68\x67 |0 - \x89\x68\x68 |0 - \x89\x68\x69 |0 - \x89\x68\x6B |0 - \x89\x68\x6C |0 - \x89\x68\x6D |0 - \x89\x68\x6E |0 - \x89\x68\x6F |0 \x87\x55\x5F |0 \x87\x55\x64 |0 \x87\x55\x65 |0 \x87\x55\x66 |0 \x87\x55\x5D |0 - \x89\x68\x6A |0 \x85\x74\x57 |0 \x87\x59\x6B |0 \x87\x59\x6A |0 \x87\x5D\x30 |0 \x87\x59\x66 |0 \x87\x59\x64 |0 - \x89\x69\x7E |0 - \x89\x6A\x21 |0 - \x89\x6A\x22 |0 - \x89\x6A\x23 |0 - \x89\x6A\x24 |0 - \x89\x6A\x25 |0 - \x89\x6A\x26 |0 - \x89\x6A\x27 |0 - \x89\x6A\x28 |0 - \x89\x6A\x29 |0 - \x89\x6A\x2A |0 - \x89\x6A\x2B |0 \x87\x59\x63 |0 \x87\x59\x65 |0 \x85\x74\x56 |0 \x85\x76\x5E |0 \x84\x6B\x28 |0 \x85\x76\x5C |0 - \x89\x6B\x2F |0 \x87\x5D\x2F |0 \x87\x5D\x2D |0 \x87\x59\x69 |0 \x87\x5D\x2C |0 - \x89\x6A\x7C |0 - \x89\x6A\x7D |0 - \x89\x6B\x23 |0 - \x89\x6B\x24 |0 - \x89\x6B\x25 |0 - \x89\x6B\x26 |0 - \x89\x6B\x29 |0 - \x89\x6B\x2A |0 - \x89\x6B\x2B |0 - \x89\x6B\x2C |0 - \x89\x6B\x2D |0 - \x89\x6B\x2E |0 \x87\x5D\x2E |0 \x87\x5D\x31 |0 - \x89\x6B\x21 |0 - \x89\x6A\x7E |0 - \x89\x6B\x27 |0 \x85\x78\x40 |0 \x87\x5F\x70 |0 \x87\x5F\x71 |0 \x87\x5F\x72 |0 \x87\x5F\x6F |0 \x87\x5F\x73 |0 - \x89\x6B\x68 |0 - \x89\x6B\x69 |0 - \x89\x6B\x6A |0 - \x89\x6B\x6B |0 - \x89\x6B\x6C |0 \x84\x6D\x63 |0 \x87\x61\x57 |0 \x87\x61\x58 |0 - \x89\x6B\x6D |0 - \x89\x6C\x3C |0 - \x89\x6C\x3D |0 \x87\x61\x56 |0 \x87\x62\x72 |0 \x87\x62\x6D |0 @@ -49940,34 +43858,17 @@ CHARMAP \x87\x62\x73 |0 \x87\x62\x71 |0 \x87\x62\x75 |0 - \x89\x6C\x52 |0 - \x89\x6C\x53 |0 - \x89\x6C\x54 |0 - \x89\x6C\x55 |0 - \x89\x6C\x56 |0 - \x89\x6C\x57 |0 - \x89\x6C\x58 |0 - \x89\x6C\x40 |0 \x85\x7A\x41 |0 \x85\x7A\x7C |0 \x87\x63\x7D |0 \x87\x63\x7B |0 - \x89\x6C\x6F |0 \x87\x63\x7C |0 - \x89\x6D\x23 |0 \x87\x64\x68 |0 - \x89\x6D\x21 |0 \x87\x64\x67 |0 \x87\x64\x69 |0 - \x89\x6D\x22 |0 - \x89\x6C\x3E |0 \x87\x65\x48 |0 \x87\x65\x49 |0 - \x89\x6D\x29 |0 \x85\x7C\x21 |0 - \x89\x6D\x35 |0 - \x89\x6D\x38 |0 - \x89\x6D\x39 |0 \x86\x2E\x44 |0 \x86\x29\x34 |0 \x85\x2B\x60 |0 @@ -49976,7 +43877,6 @@ CHARMAP \x85\x36\x3E |0 \x85\x36\x40 |0 \x86\x45\x7A |0 - \x89\x38\x79 |0 \x86\x45\x79 |0 \x86\x45\x78 |0 \x85\x3D\x2A |0 @@ -49984,13 +43884,11 @@ CHARMAP \x84\x3B\x68 |0 \x86\x4F\x7A |0 \x86\x4F\x7B |0 - \x89\x3F\x75 |0 \x86\x59\x59 |0 \x86\x59\x58 |0 \x84\x41\x4A |0 \x86\x59\x56 |0 \x86\x59\x57 |0 - \x89\x45\x7A |0 \x85\x43\x70 |0 \x85\x43\x6F |0 \x85\x4A\x6A |0 @@ -50004,7 +43902,6 @@ CHARMAP \x85\x52\x22 |0 \x85\x52\x24 |0 \x85\x52\x25 |0 - \x89\x58\x65 |0 \x85\x59\x3B |0 \x87\x34\x6E |0 \x85\x59\x3A |0 @@ -50045,12 +43942,9 @@ CHARMAP \x85\x30\x6A |0 \x85\x30\x6B |0 \x85\x30\x69 |0 - \x89\x32\x67 |0 \x86\x3C\x66 |0 \x85\x36\x42 |0 \x85\x36\x41 |0 - \x89\x38\x7A |0 - \x89\x38\x7B |0 \x86\x45\x7C |0 \x85\x3D\x33 |0 \x85\x3D\x31 |0 @@ -50066,13 +43960,6 @@ CHARMAP \x86\x50\x21 |0 \x85\x3D\x32 |0 \x86\x4F\x7C |0 - \x89\x3F\x78 |0 - \x89\x3F\x79 |0 - \x89\x3F\x7A |0 - \x89\x3F\x7B |0 - \x89\x3F\x7C |0 - \x89\x3F\x7D |0 - \x89\x40\x21 |0 \x86\x4F\x7D |0 \x84\x3B\x69 |0 \x84\x41\x4C |0 @@ -50080,7 +43967,6 @@ CHARMAP \x84\x41\x52 |0 \x84\x41\x4D |0 \x84\x41\x4B |0 - \x89\x45\x7E |0 \x86\x59\x5D |0 \x85\x43\x74 |0 \x85\x43\x71 |0 @@ -50091,8 +43977,6 @@ CHARMAP \x84\x41\x4F |0 \x86\x59\x5C |0 \x86\x59\x5A |0 - \x89\x45\x7D |0 - \x89\x46\x21 |0 \x85\x4A\x73 |0 \x85\x4A\x6F |0 \x85\x4A\x71 |0 @@ -50121,9 +44005,6 @@ CHARMAP \x85\x52\x2C |0 \x85\x52\x29 |0 \x87\x2A\x4C |0 - \x89\x52\x6E |0 - \x89\x52\x6F |0 - \x89\x52\x71 |0 \x87\x2A\x47 |0 \x87\x2A\x49 |0 \x87\x2A\x4A |0 @@ -50131,7 +44012,6 @@ CHARMAP \x85\x52\x26 |0 \x85\x52\x2B |0 \x85\x52\x2E |0 - \x89\x52\x70 |0 \x84\x54\x50 |0 \x84\x54\x4D |0 \x85\x59\x3D |0 @@ -50143,9 +44023,6 @@ CHARMAP \x87\x34\x75 |0 \x87\x34\x77 |0 \x87\x34\x79 |0 - \x89\x58\x66 |0 - \x89\x58\x67 |0 - \x89\x58\x68 |0 \x87\x34\x74 |0 \x87\x34\x78 |0 \x87\x34\x76 |0 @@ -50163,7 +44040,6 @@ CHARMAP \x87\x3D\x2C |0 \x84\x59\x4C |0 \x87\x3D\x2E |0 - \x89\x5D\x50 |0 \x87\x3D\x2F |0 \x87\x3D\x30 |0 \x87\x3D\x31 |0 @@ -50179,11 +44055,6 @@ CHARMAP \x85\x65\x5D |0 \x85\x65\x59 |0 \x85\x65\x5C |0 - \x89\x61\x47 |0 - \x89\x61\x48 |0 - \x89\x61\x49 |0 - \x89\x61\x4C |0 - \x89\x61\x4B |0 \x87\x44\x45 |0 \x87\x44\x47 |0 \x85\x6A\x39 |0 @@ -50193,11 +44064,6 @@ CHARMAP \x85\x6A\x3A |0 \x87\x4B\x3D |0 \x84\x61\x6E |0 - \x89\x64\x46 |0 - \x89\x64\x47 |0 - \x89\x64\x48 |0 - \x89\x64\x49 |0 - \x89\x64\x4A |0 \x84\x64\x70 |0 \x85\x6E\x3F |0 \x85\x6E\x3A |0 @@ -50209,8 +44075,6 @@ CHARMAP \x87\x50\x78 |0 \x85\x6A\x3B |0 \x87\x50\x75 |0 - \x89\x66\x70 |0 - \x89\x66\x71 |0 \x87\x50\x76 |0 \x85\x6E\x3B |0 \x87\x50\x77 |0 @@ -50219,29 +44083,13 @@ CHARMAP \x84\x67\x65 |0 \x85\x71\x59 |0 \x85\x71\x57 |0 - \x89\x68\x70 |0 - \x89\x68\x71 |0 - \x89\x68\x73 |0 - \x89\x68\x74 |0 - \x89\x68\x75 |0 \x85\x71\x5C |0 \x85\x71\x58 |0 \x85\x74\x58 |0 \x87\x55\x6B |0 - \x89\x6A\x2F |0 \x87\x59\x6F |0 - \x89\x6A\x2C |0 - \x89\x6A\x2D |0 - \x89\x6A\x2E |0 - \x89\x6A\x30 |0 - \x89\x6A\x31 |0 - \x89\x6B\x30 |0 - \x89\x6B\x31 |0 - \x89\x6B\x32 |0 \x87\x5D\x32 |0 \x85\x78\x42 |0 - \x89\x6B\x6E |0 - \x89\x6B\x6F |0 \x87\x5F\x76 |0 \x87\x5F\x75 |0 \x85\x79\x54 |0 @@ -50251,7 +44099,6 @@ CHARMAP \x87\x62\x77 |0 \x87\x62\x78 |0 \x85\x7A\x7D |0 - \x89\x6D\x2A |0 \x86\x2E\x45 |0 \x85\x22\x22 |0 \x85\x21\x7E |0 @@ -50267,12 +44114,6 @@ CHARMAP \x84\x25\x2D |0 \x85\x24\x7E |0 \x85\x24\x7C |0 - \x89\x25\x3A |0 - \x89\x25\x3B |0 - \x89\x25\x3C |0 - \x89\x25\x3D |0 - \x89\x25\x3E |0 - \x89\x25\x3F |0 \x85\x27\x75 |0 \x86\x2E\x47 |0 \x85\x27\x76 |0 @@ -50282,8 +44123,6 @@ CHARMAP \x85\x27\x77 |0 \x86\x2E\x46 |0 \x86\x2E\x48 |0 - \x89\x28\x7D |0 - \x89\x28\x7E |0 \x85\x2B\x62 |0 \x86\x34\x70 |0 \x86\x34\x73 |0 @@ -50297,9 +44136,6 @@ CHARMAP \x86\x34\x72 |0 \x85\x2B\x63 |0 \x86\x34\x78 |0 - \x89\x2D\x5B |0 - \x89\x2D\x5C |0 - \x89\x2D\x5D |0 \x86\x34\x74 |0 \x86\x34\x6F |0 \x86\x3C\x69 |0 @@ -50315,13 +44151,6 @@ CHARMAP \x86\x3C\x6A |0 \x86\x3C\x6D |0 \x86\x3C\x6C |0 - \x89\x32\x68 |0 - \x89\x32\x69 |0 - \x89\x32\x6A |0 - \x89\x32\x6B |0 - \x89\x32\x6C |0 - \x89\x32\x6D |0 - \x89\x32\x6E |0 \x85\x36\x43 |0 \x86\x46\x28 |0 \x86\x46\x21 |0 @@ -50340,16 +44169,6 @@ CHARMAP \x86\x46\x27 |0 \x87\x34\x7B |0 \x86\x46\x25 |0 - \x89\x38\x7C |0 - \x89\x38\x7D |0 - \x89\x38\x7E |0 - \x89\x39\x21 |0 - \x89\x39\x22 |0 - \x89\x39\x23 |0 - \x89\x39\x24 |0 - \x89\x39\x25 |0 - \x89\x39\x26 |0 - \x89\x39\x27 |0 \x85\x3D\x38 |0 \x85\x3D\x3D |0 \x85\x3D\x39 |0 @@ -50367,8 +44186,6 @@ CHARMAP \x85\x3D\x3B |0 \x86\x50\x28 |0 \x86\x50\x26 |0 - \x89\x40\x22 |0 - \x89\x40\x23 |0 \x87\x3D\x32 |0 \x85\x3D\x36 |0 \x86\x59\x6A |0 @@ -50395,14 +44212,6 @@ CHARMAP \x86\x59\x60 |0 \x85\x43\x75 |0 \x86\x59\x61 |0 - \x89\x46\x22 |0 - \x89\x46\x23 |0 - \x89\x46\x24 |0 - \x89\x46\x25 |0 - \x89\x46\x26 |0 - \x89\x46\x27 |0 - \x89\x46\x28 |0 - \x89\x46\x29 |0 \x86\x59\x68 |0 \x86\x59\x6C |0 \x87\x3D\x33 |0 @@ -50423,12 +44232,6 @@ CHARMAP \x86\x63\x65 |0 \x86\x63\x67 |0 \x87\x4B\x41 |0 - \x89\x4D\x2E |0 - \x89\x4D\x2F |0 - \x89\x4D\x30 |0 - \x89\x4D\x31 |0 - \x89\x4D\x32 |0 - \x89\x4D\x33 |0 \x86\x63\x61 |0 \x85\x4A\x77 |0 \x85\x52\x36 |0 @@ -50447,12 +44250,6 @@ CHARMAP \x87\x2A\x51 |0 \x87\x2A\x50 |0 \x87\x2A\x52 |0 - \x89\x52\x72 |0 - \x89\x52\x73 |0 - \x89\x52\x74 |0 - \x89\x52\x75 |0 - \x89\x52\x76 |0 - \x89\x52\x77 |0 \x87\x2A\x56 |0 \x85\x59\x41 |0 \x85\x59\x42 |0 @@ -50462,10 +44259,6 @@ CHARMAP \x85\x59\x43 |0 \x87\x34\x7E |0 \x87\x50\x79 |0 - \x89\x58\x69 |0 - \x89\x58\x6A |0 - \x89\x58\x6B |0 - \x89\x58\x6C |0 \x85\x6A\x3C |0 \x87\x34\x7D |0 \x85\x5F\x56 |0 @@ -50474,30 +44267,19 @@ CHARMAP \x87\x3D\x37 |0 \x87\x3D\x35 |0 \x85\x74\x59 |0 - \x89\x5D\x51 |0 - \x89\x5D\x52 |0 - \x89\x5D\x53 |0 - \x89\x5D\x54 |0 \x85\x65\x62 |0 \x87\x44\x4C |0 \x84\x5E\x34 |0 \x87\x44\x4A |0 \x87\x44\x4B |0 - \x89\x61\x4D |0 - \x89\x61\x4E |0 - \x89\x61\x4F |0 - \x89\x61\x50 |0 \x85\x6A\x3D |0 \x87\x4B\x43 |0 \x87\x55\x6C |0 \x87\x4B\x45 |0 - \x89\x64\x4C |0 \x85\x78\x43 |0 \x87\x4B\x42 |0 \x87\x4B\x44 |0 \x87\x5F\x77 |0 - \x89\x66\x72 |0 - \x89\x66\x73 |0 \x87\x51\x72 |0 \x85\x71\x5D |0 \x87\x55\x6E |0 @@ -50514,8 +44296,6 @@ CHARMAP \x86\x59\x6D |0 \x84\x4E\x4B |0 \x87\x2A\x57 |0 - \x89\x52\x79 |0 - \x89\x52\x78 |0 \x85\x59\x45 |0 \x87\x35\x21 |0 \x84\x59\x56 |0 @@ -50577,8 +44357,6 @@ CHARMAP \x85\x4A\x7D |0 \x84\x48\x2B |0 \x86\x63\x6A |0 - \x89\x4D\x34 |0 - \x89\x4D\x35 |0 \x86\x63\x73 |0 \x86\x63\x78 |0 \x86\x63\x6D |0 @@ -50623,9 +44401,7 @@ CHARMAP \x87\x35\x31 |0 \x87\x35\x23 |0 \x87\x35\x32 |0 - \x89\x58\x6D |0 \x87\x35\x2E |0 - \x89\x52\x7A |0 \x84\x59\x59 |0 \x87\x3D\x3D |0 \x87\x3D\x3B |0 @@ -50645,8 +44421,6 @@ CHARMAP \x87\x3D\x43 |0 \x87\x3D\x48 |0 \x87\x35\x36 |0 - \x89\x5D\x55 |0 - \x89\x5D\x57 |0 \x87\x3D\x44 |0 \x87\x3D\x46 |0 \x87\x44\x50 |0 @@ -50687,7 +44461,6 @@ CHARMAP \x87\x51\x26 |0 \x85\x6E\x43 |0 \x87\x51\x22 |0 - \x89\x66\x74 |0 \x87\x50\x7E |0 \x87\x51\x2C |0 \x87\x51\x29 |0 @@ -50701,7 +44474,6 @@ CHARMAP \x87\x55\x73 |0 \x87\x55\x77 |0 \x87\x51\x21 |0 - \x89\x68\x76 |0 \x87\x55\x71 |0 \x87\x59\x71 |0 \x87\x59\x72 |0 @@ -50709,7 +44481,6 @@ CHARMAP \x87\x59\x75 |0 \x87\x59\x76 |0 \x87\x59\x74 |0 - \x89\x6A\x32 |0 \x87\x59\x73 |0 \x87\x5D\x38 |0 \x87\x5D\x39 |0 @@ -50725,19 +44496,14 @@ CHARMAP \x87\x5F\x7B |0 \x87\x5F\x79 |0 \x87\x61\x5A |0 - \x89\x6C\x41 |0 \x87\x63\x7E |0 \x87\x64\x6B |0 \x87\x66\x40 |0 - \x89\x2D\x5E |0 \x85\x30\x70 |0 - \x89\x32\x70 |0 \x86\x46\x32 |0 \x86\x46\x33 |0 \x84\x36\x25 |0 \x86\x46\x31 |0 - \x89\x39\x28 |0 - \x89\x39\x29 |0 \x85\x3D\x40 |0 \x85\x3D\x3E |0 \x85\x3D\x41 |0 @@ -50746,9 +44512,6 @@ CHARMAP \x86\x50\x33 |0 \x84\x3B\x72 |0 \x86\x50\x32 |0 - \x89\x40\x25 |0 - \x89\x40\x27 |0 - \x89\x40\x26 |0 \x84\x41\x58 |0 \x85\x44\x25 |0 \x85\x44\x22 |0 @@ -50756,9 +44519,6 @@ CHARMAP \x85\x44\x24 |0 \x85\x44\x23 |0 \x86\x59\x7C |0 - \x89\x46\x2B |0 - \x89\x46\x2C |0 - \x89\x46\x2D |0 \x85\x44\x26 |0 \x85\x4B\x22 |0 \x84\x48\x30 |0 @@ -50771,8 +44531,6 @@ CHARMAP \x84\x48\x32 |0 \x86\x63\x7C |0 \x86\x63\x7E |0 - \x89\x4D\x37 |0 - \x89\x4D\x38 |0 \x86\x63\x7A |0 \x86\x63\x79 |0 \x87\x2A\x6A |0 @@ -50788,12 +44546,6 @@ CHARMAP \x85\x52\x3C |0 \x87\x2A\x6B |0 \x87\x2A\x6C |0 - \x89\x46\x2A |0 - \x89\x52\x7B |0 - \x89\x52\x7C |0 - \x89\x52\x7D |0 - \x89\x52\x7E |0 - \x89\x53\x21 |0 \x87\x2A\x68 |0 \x85\x52\x44 |0 \x85\x52\x42 |0 @@ -50812,15 +44564,6 @@ CHARMAP \x87\x35\x37 |0 \x85\x59\x48 |0 \x87\x35\x3C |0 - \x89\x58\x6E |0 - \x89\x58\x6F |0 - \x89\x58\x71 |0 - \x89\x58\x72 |0 - \x89\x58\x73 |0 - \x89\x58\x74 |0 - \x89\x58\x75 |0 - \x89\x58\x70 |0 - \x89\x55\x64 |0 \x85\x59\x4C |0 \x84\x59\x5C |0 \x84\x59\x5A |0 @@ -50834,10 +44577,8 @@ CHARMAP \x87\x3D\x4B |0 \x87\x3D\x4D |0 \x85\x5F\x5B |0 - \x89\x5D\x59 |0 \x87\x3D\x4C |0 \x87\x3D\x4E |0 - \x89\x5D\x5A |0 \x85\x5F\x5D |0 \x85\x65\x6C |0 \x85\x65\x6F |0 @@ -50856,13 +44597,11 @@ CHARMAP \x87\x44\x5D |0 \x85\x65\x6E |0 \x87\x44\x5B |0 - \x89\x61\x51 |0 \x87\x44\x64 |0 \x87\x44\x59 |0 \x87\x44\x5C |0 \x85\x65\x6B |0 \x85\x65\x6D |0 - \x89\x5D\x58 |0 \x85\x65\x6A |0 \x85\x6A\x47 |0 \x85\x6A\x41 |0 @@ -50879,7 +44618,6 @@ CHARMAP \x87\x4B\x51 |0 \x85\x6A\x48 |0 \x87\x4B\x53 |0 - \x89\x64\x4E |0 \x87\x4B\x57 |0 \x87\x4B\x56 |0 \x87\x4B\x54 |0 @@ -50901,7 +44639,6 @@ CHARMAP \x87\x51\x2F |0 \x87\x51\x31 |0 \x87\x51\x32 |0 - \x89\x66\x75 |0 \x87\x51\x35 |0 \x87\x51\x37 |0 \x87\x51\x30 |0 @@ -50934,7 +44671,6 @@ CHARMAP \x85\x76\x62 |0 \x87\x5D\x3B |0 \x87\x5D\x3C |0 - \x89\x6B\x33 |0 \x85\x76\x63 |0 \x85\x78\x44 |0 \x84\x6C\x32 |0 @@ -50942,7 +44678,6 @@ CHARMAP \x87\x5F\x7D |0 \x87\x5F\x7E |0 \x87\x60\x21 |0 - \x89\x6B\x70 |0 \x84\x6D\x2C |0 \x85\x79\x56 |0 \x84\x6D\x2B |0 @@ -50953,7 +44688,6 @@ CHARMAP \x87\x62\x7B |0 \x85\x7A\x43 |0 \x87\x62\x7C |0 - \x89\x6C\x59 |0 \x87\x63\x23 |0 \x85\x7A\x42 |0 \x87\x64\x6C |0 @@ -50968,35 +44702,26 @@ CHARMAP \x84\x6E\x5C |0 \x84\x36\x26 |0 \x86\x50\x34 |0 - \x89\x46\x2E |0 - \x89\x46\x2F |0 - \x89\x46\x30 |0 \x86\x59\x7D |0 \x84\x48\x36 |0 \x87\x2C\x44 |0 \x87\x35\x3D |0 \x85\x5A\x74 |0 \x87\x44\x66 |0 - \x89\x64\x4F |0 \x85\x71\x62 |0 - \x89\x6B\x71 |0 \x86\x3C\x74 |0 \x86\x2E\x49 |0 \x86\x3C\x73 |0 \x84\x36\x27 |0 \x86\x46\x34 |0 \x84\x36\x29 |0 - \x89\x39\x2D |0 \x86\x50\x35 |0 \x85\x3D\x42 |0 \x84\x3B\x75 |0 \x86\x50\x37 |0 \x86\x50\x36 |0 - \x89\x40\x28 |0 - \x89\x40\x29 |0 \x86\x5A\x21 |0 \x86\x59\x7E |0 - \x89\x4D\x3B |0 \x84\x4E\x4D |0 \x87\x2A\x6E |0 \x87\x2A\x6D |0 @@ -51017,7 +44742,6 @@ CHARMAP \x84\x48\x39 |0 \x86\x64\x21 |0 \x85\x4B\x24 |0 - \x89\x4D\x3C |0 \x86\x64\x23 |0 \x84\x4E\x4E |0 \x85\x52\x46 |0 @@ -51025,21 +44749,18 @@ CHARMAP \x85\x52\x47 |0 \x87\x2A\x70 |0 \x87\x2A\x6F |0 - \x89\x58\x77 |0 \x85\x59\x50 |0 \x85\x59\x4F |0 \x85\x59\x54 |0 \x85\x59\x51 |0 \x85\x59\x52 |0 \x85\x59\x53 |0 - \x89\x58\x76 |0 \x87\x35\x3F |0 \x87\x3D\x4F |0 \x85\x5F\x5F |0 \x85\x5F\x60 |0 \x85\x5F\x62 |0 \x85\x5F\x61 |0 - \x89\x5D\x5B |0 \x87\x3D\x51 |0 \x85\x65\x72 |0 \x87\x44\x67 |0 @@ -51057,7 +44778,6 @@ CHARMAP \x87\x56\x22 |0 \x85\x71\x66 |0 \x85\x71\x65 |0 - \x89\x68\x79 |0 \x87\x56\x21 |0 \x87\x56\x24 |0 \x87\x56\x23 |0 @@ -51065,13 +44785,11 @@ CHARMAP \x87\x59\x7C |0 \x87\x5D\x3D |0 \x85\x76\x64 |0 - \x89\x6B\x34 |0 \x87\x60\x22 |0 \x85\x7A\x45 |0 \x87\x64\x21 |0 \x87\x64\x6E |0 \x87\x64\x6D |0 - \x89\x39\x2E |0 \x85\x3D\x43 |0 \x84\x3B\x78 |0 \x86\x50\x3B |0 @@ -51087,7 +44805,6 @@ CHARMAP \x86\x5A\x2A |0 \x84\x41\x5C |0 \x84\x41\x5E |0 - \x89\x46\x31 |0 \x85\x4B\x27 |0 \x84\x48\x3C |0 \x85\x4B\x26 |0 @@ -51159,7 +44876,6 @@ CHARMAP \x85\x5F\x68 |0 \x87\x3D\x54 |0 \x87\x3D\x5C |0 - \x89\x5D\x5C |0 \x87\x3D\x52 |0 \x85\x5F\x6C |0 \x85\x5F\x66 |0 @@ -51183,8 +44899,6 @@ CHARMAP \x87\x44\x71 |0 \x87\x44\x72 |0 \x87\x44\x6E |0 - \x89\x61\x53 |0 - \x89\x61\x54 |0 \x85\x5F\x64 |0 \x87\x44\x6C |0 \x87\x44\x6B |0 @@ -51213,9 +44927,6 @@ CHARMAP \x87\x4B\x62 |0 \x85\x6A\x50 |0 \x87\x4B\x60 |0 - \x89\x64\x50 |0 - \x89\x64\x52 |0 - \x89\x64\x53 |0 \x87\x4B\x5B |0 \x87\x4B\x5C |0 \x85\x6A\x53 |0 @@ -51237,7 +44948,6 @@ CHARMAP \x85\x6E\x4D |0 \x87\x51\x41 |0 \x87\x51\x3C |0 - \x89\x66\x78 |0 \x87\x51\x3E |0 \x87\x51\x43 |0 \x87\x51\x40 |0 @@ -51257,7 +44967,6 @@ CHARMAP \x85\x71\x67 |0 \x85\x71\x68 |0 \x87\x56\x29 |0 - \x89\x66\x77 |0 \x85\x74\x60 |0 \x87\x5A\x26 |0 \x87\x59\x7D |0 @@ -51317,7 +45026,6 @@ CHARMAP \x85\x4B\x2E |0 \x85\x4B\x30 |0 \x86\x64\x2A |0 - \x89\x4D\x3D |0 \x85\x4B\x32 |0 \x84\x4E\x55 |0 \x85\x52\x50 |0 @@ -51346,7 +45054,6 @@ CHARMAP \x84\x59\x6A |0 \x85\x5F\x6F |0 \x85\x5F\x70 |0 - \x89\x5D\x5D |0 \x87\x3D\x5D |0 \x87\x3D\x60 |0 \x87\x44\x76 |0 @@ -51369,7 +45076,6 @@ CHARMAP \x87\x51\x45 |0 \x87\x51\x46 |0 \x84\x65\x28 |0 - \x89\x66\x79 |0 \x85\x6E\x52 |0 \x85\x6E\x51 |0 \x85\x71\x6E |0 @@ -51414,7 +45120,6 @@ CHARMAP \x87\x5D\x48 |0 \x87\x5D\x47 |0 \x87\x61\x60 |0 - \x89\x40\x2C |0 \x85\x44\x30 |0 \x85\x44\x2F |0 \x85\x4B\x33 |0 @@ -51431,7 +45136,6 @@ CHARMAP \x85\x52\x53 |0 \x84\x54\x6B |0 \x85\x52\x58 |0 - \x89\x58\x79 |0 \x85\x59\x5E |0 \x87\x35\x4D |0 \x87\x3D\x63 |0 @@ -51454,7 +45158,6 @@ CHARMAP \x85\x74\x68 |0 \x85\x74\x69 |0 \x84\x69\x61 |0 - \x89\x6A\x33 |0 \x87\x5D\x4A |0 \x84\x6C\x36 |0 \x85\x7B\x23 |0 @@ -51489,7 +45192,6 @@ CHARMAP \x86\x5A\x30 |0 \x86\x5A\x31 |0 \x86\x5A\x2E |0 - \x89\x46\x33 |0 \x85\x44\x33 |0 \x85\x44\x38 |0 \x85\x4B\x3D |0 @@ -51512,7 +45214,6 @@ CHARMAP \x86\x64\x2E |0 \x85\x4B\x3C |0 \x85\x4B\x41 |0 - \x89\x4D\x3E |0 \x86\x64\x2D |0 \x85\x4B\x40 |0 \x86\x64\x2C |0 @@ -51537,8 +45238,6 @@ CHARMAP \x87\x2B\x29 |0 \x87\x35\x4F |0 \x87\x2B\x2C |0 - \x89\x53\x23 |0 - \x89\x53\x24 |0 \x87\x2B\x27 |0 \x87\x2B\x28 |0 \x87\x2B\x2F |0 @@ -51571,20 +45270,12 @@ CHARMAP \x84\x54\x72 |0 \x87\x35\x56 |0 \x87\x35\x5C |0 - \x89\x4D\x40 |0 - \x89\x58\x7A |0 - \x89\x58\x7C |0 - \x89\x58\x7D |0 - \x89\x59\x21 |0 - \x89\x59\x22 |0 - \x89\x59\x23 |0 \x87\x35\x52 |0 \x87\x35\x53 |0 \x87\x35\x54 |0 \x87\x35\x55 |0 \x85\x59\x6C |0 \x85\x59\x5F |0 - \x89\x58\x7E |0 \x85\x59\x6D |0 \x84\x59\x75 |0 \x84\x59\x71 |0 @@ -51606,12 +45297,6 @@ CHARMAP \x87\x3D\x67 |0 \x84\x59\x78 |0 \x87\x3D\x6B |0 - \x89\x5D\x5E |0 - \x89\x5D\x5F |0 - \x89\x5D\x60 |0 - \x89\x5D\x61 |0 - \x89\x5D\x62 |0 - \x89\x5D\x63 |0 \x87\x3D\x64 |0 \x87\x3D\x66 |0 \x85\x5F\x79 |0 @@ -51631,10 +45316,6 @@ CHARMAP \x85\x66\x31 |0 \x85\x66\x2F |0 \x87\x44\x7C |0 - \x89\x61\x55 |0 - \x89\x61\x56 |0 - \x89\x61\x57 |0 - \x89\x61\x58 |0 \x87\x44\x79 |0 \x87\x44\x7A |0 \x87\x4B\x76 |0 @@ -51654,8 +45335,6 @@ CHARMAP \x87\x4B\x6E |0 \x87\x4B\x75 |0 \x87\x4B\x71 |0 - \x89\x64\x54 |0 - \x89\x64\x55 |0 \x87\x4B\x77 |0 \x87\x4B\x73 |0 \x84\x65\x2E |0 @@ -51670,7 +45349,6 @@ CHARMAP \x85\x6E\x58 |0 \x87\x51\x4B |0 \x87\x51\x4F |0 - \x89\x66\x7A |0 \x84\x65\x34 |0 \x87\x51\x50 |0 \x87\x51\x4C |0 @@ -51692,9 +45370,6 @@ CHARMAP \x85\x71\x7A |0 \x87\x56\x30 |0 \x87\x56\x34 |0 - \x89\x68\x7A |0 - \x89\x68\x7B |0 - \x89\x68\x7C |0 \x87\x56\x37 |0 \x87\x56\x35 |0 \x87\x5A\x30 |0 @@ -51703,7 +45378,6 @@ CHARMAP \x87\x5A\x2D |0 \x87\x5A\x2F |0 \x85\x74\x6A |0 - \x89\x6A\x34 |0 \x87\x5A\x2B |0 \x87\x5A\x2E |0 \x87\x5A\x2C |0 @@ -51717,7 +45391,6 @@ CHARMAP \x87\x5D\x4D |0 \x84\x6B\x2F |0 \x87\x5D\x4E |0 - \x89\x6B\x35 |0 \x87\x5D\x50 |0 \x87\x5D\x4C |0 \x87\x5D\x4B |0 @@ -51725,7 +45398,6 @@ CHARMAP \x87\x60\x24 |0 \x85\x76\x6B |0 \x84\x6C\x37 |0 - \x89\x6B\x72 |0 \x87\x60\x25 |0 \x84\x6D\x2E |0 \x85\x79\x5A |0 @@ -51742,7 +45414,6 @@ CHARMAP \x84\x3C\x21 |0 \x86\x50\x3D |0 \x85\x3D\x4B |0 - \x89\x40\x2E |0 \x86\x50\x3E |0 \x85\x44\x3B |0 \x85\x44\x40 |0 @@ -51777,8 +45448,6 @@ CHARMAP \x87\x2B\x32 |0 \x85\x52\x61 |0 \x87\x2B\x35 |0 - \x89\x53\x25 |0 - \x89\x53\x26 |0 \x85\x59\x6F |0 \x85\x59\x77 |0 \x85\x59\x70 |0 @@ -51792,7 +45461,6 @@ CHARMAP \x85\x59\x74 |0 \x85\x59\x75 |0 \x87\x35\x5E |0 - \x89\x59\x25 |0 \x85\x59\x72 |0 \x85\x59\x71 |0 \x87\x3D\x71 |0 @@ -51812,8 +45480,6 @@ CHARMAP \x85\x5F\x7D |0 \x85\x60\x23 |0 \x87\x3D\x6E |0 - \x89\x5D\x64 |0 - \x89\x5D\x65 |0 \x87\x3D\x72 |0 \x87\x3D\x6F |0 \x84\x5E\x53 |0 @@ -51831,7 +45497,6 @@ CHARMAP \x85\x66\x36 |0 \x85\x66\x39 |0 \x85\x66\x33 |0 - \x89\x61\x59 |0 \x87\x45\x28 |0 \x87\x45\x23 |0 \x87\x45\x21 |0 @@ -51843,8 +45508,6 @@ CHARMAP \x84\x62\x35 |0 \x85\x6A\x60 |0 \x87\x4B\x79 |0 - \x89\x64\x56 |0 - \x89\x64\x57 |0 \x87\x4B\x78 |0 \x87\x4B\x7A |0 \x87\x4B\x7B |0 @@ -51856,7 +45519,6 @@ CHARMAP \x85\x6E\x5C |0 \x84\x65\x37 |0 \x85\x6E\x5F |0 - \x89\x66\x7B |0 \x85\x6E\x62 |0 \x85\x6E\x5D |0 \x84\x65\x38 |0 @@ -51868,7 +45530,6 @@ CHARMAP \x85\x71\x7C |0 \x87\x56\x3C |0 \x87\x56\x3A |0 - \x89\x68\x7D |0 \x87\x56\x3F |0 \x87\x56\x41 |0 \x87\x56\x42 |0 @@ -51876,7 +45537,6 @@ CHARMAP \x87\x56\x3E |0 \x87\x56\x3B |0 \x87\x5A\x32 |0 - \x89\x6A\x35 |0 \x87\x5A\x33 |0 \x87\x5D\x53 |0 \x85\x78\x49 |0 @@ -51891,7 +45551,6 @@ CHARMAP \x85\x7A\x4A |0 \x85\x7B\x24 |0 \x87\x64\x26 |0 - \x89\x6D\x24 |0 \x85\x7C\x47 |0 \x87\x66\x55 |0 \x86\x3C\x75 |0 @@ -51930,7 +45589,6 @@ CHARMAP \x86\x5A\x38 |0 \x85\x3D\x4F |0 \x86\x50\x42 |0 - \x89\x40\x2F |0 \x86\x50\x43 |0 \x84\x3C\x23 |0 \x86\x5A\x42 |0 @@ -51953,7 +45611,6 @@ CHARMAP \x85\x44\x48 |0 \x86\x5A\x41 |0 \x85\x52\x63 |0 - \x89\x46\x37 |0 \x86\x5A\x40 |0 \x86\x5A\x3F |0 \x86\x64\x3C |0 @@ -51971,8 +45628,6 @@ CHARMAP \x85\x4B\x4B |0 \x87\x2B\x39 |0 \x86\x64\x41 |0 - \x89\x46\x36 |0 - \x89\x53\x28 |0 \x87\x2B\x3A |0 \x84\x4E\x6B |0 \x87\x2B\x40 |0 @@ -51993,7 +45648,6 @@ CHARMAP \x85\x52\x67 |0 \x87\x2B\x3E |0 \x87\x2B\x3D |0 - \x89\x53\x27 |0 \x85\x59\x78 |0 \x87\x2B\x3F |0 \x85\x5A\x23 |0 @@ -52026,10 +45680,6 @@ CHARMAP \x85\x5A\x22 |0 \x87\x35\x6D |0 \x85\x59\x7D |0 - \x89\x59\x26 |0 - \x89\x59\x27 |0 - \x89\x59\x28 |0 - \x89\x59\x29 |0 \x85\x5A\x21 |0 \x87\x3D\x74 |0 \x85\x60\x28 |0 @@ -52054,8 +45704,6 @@ CHARMAP \x85\x60\x2E |0 \x87\x3D\x79 |0 \x87\x3D\x7E |0 - \x89\x5D\x66 |0 - \x89\x5D\x67 |0 \x87\x3D\x7B |0 \x85\x60\x30 |0 \x87\x3D\x7C |0 @@ -52079,8 +45727,6 @@ CHARMAP \x87\x45\x2C |0 \x87\x45\x29 |0 \x87\x45\x31 |0 - \x89\x61\x5A |0 - \x89\x61\x5B |0 \x87\x4C\x25 |0 \x87\x4C\x21 |0 \x84\x5E\x55 |0 @@ -52107,8 +45753,6 @@ CHARMAP \x87\x4C\x24 |0 \x87\x51\x57 |0 \x84\x62\x3A |0 - \x89\x64\x58 |0 - \x89\x64\x59 |0 \x85\x6A\x65 |0 \x87\x51\x56 |0 \x85\x6A\x6B |0 @@ -52150,7 +45794,6 @@ CHARMAP \x87\x56\x49 |0 \x85\x72\x26 |0 \x85\x72\x29 |0 - \x89\x68\x7E |0 \x84\x69\x66 |0 \x85\x74\x6E |0 \x85\x74\x6F |0 @@ -52159,7 +45802,6 @@ CHARMAP \x87\x5A\x36 |0 \x85\x74\x70 |0 \x87\x5A\x35 |0 - \x89\x6A\x37 |0 \x87\x5A\x34 |0 \x85\x76\x6E |0 \x87\x5D\x56 |0 @@ -52197,20 +45839,14 @@ CHARMAP \x87\x51\x64 |0 \x87\x60\x2B |0 \x84\x6E\x26 |0 - \x89\x32\x71 |0 \x84\x41\x7C |0 \x86\x5A\x43 |0 \x85\x47\x54 |0 \x86\x64\x49 |0 \x86\x64\x4A |0 - \x89\x4D\x41 |0 - \x89\x53\x29 |0 \x86\x64\x4B |0 \x87\x2B\x42 |0 - \x89\x53\x2A |0 - \x89\x59\x2A |0 \x87\x35\x74 |0 - \x89\x5D\x68 |0 \x87\x3E\x24 |0 \x87\x45\x36 |0 \x85\x66\x41 |0 @@ -52223,9 +45859,7 @@ CHARMAP \x84\x62\x3E |0 \x87\x4C\x2A |0 \x87\x51\x65 |0 - \x89\x66\x7C |0 \x85\x72\x2C |0 - \x89\x69\x21 |0 \x87\x56\x4A |0 \x87\x5D\x57 |0 \x85\x7A\x4B |0 @@ -52233,7 +45867,6 @@ CHARMAP \x85\x36\x4C |0 \x85\x3D\x50 |0 \x86\x50\x48 |0 - \x89\x40\x31 |0 \x86\x50\x47 |0 \x85\x44\x49 |0 \x86\x5A\x45 |0 @@ -52249,10 +45882,6 @@ CHARMAP \x86\x64\x52 |0 \x85\x4B\x4F |0 \x87\x2B\x43 |0 - \x89\x4D\x42 |0 - \x89\x4D\x43 |0 - \x89\x4D\x44 |0 - \x89\x4D\x45 |0 \x87\x2B\x46 |0 \x86\x64\x4F |0 \x86\x64\x51 |0 @@ -52278,9 +45907,6 @@ CHARMAP \x87\x2B\x45 |0 \x87\x2B\x4C |0 \x85\x52\x71 |0 - \x89\x53\x2B |0 - \x89\x53\x2C |0 - \x89\x53\x2D |0 \x87\x2B\x4D |0 \x87\x35\x7A |0 \x84\x55\x2C |0 @@ -52309,13 +45935,11 @@ CHARMAP \x87\x36\x23 |0 \x85\x5A\x2A |0 \x87\x36\x22 |0 - \x89\x59\x2C |0 \x85\x5A\x28 |0 \x87\x35\x7D |0 \x87\x35\x7E |0 \x87\x36\x27 |0 \x87\x36\x25 |0 - \x89\x59\x2B |0 \x87\x35\x76 |0 \x87\x35\x77 |0 \x85\x60\x3A |0 @@ -52333,8 +45957,6 @@ CHARMAP \x87\x3E\x28 |0 \x85\x60\x3E |0 \x85\x60\x3D |0 - \x89\x5D\x69 |0 - \x89\x5D\x6A |0 \x87\x45\x3C |0 \x85\x66\x4C |0 \x85\x66\x4B |0 @@ -52356,11 +45978,7 @@ CHARMAP \x87\x45\x3A |0 \x87\x45\x37 |0 \x85\x66\x4A |0 - \x89\x61\x5D |0 - \x89\x61\x5E |0 - \x89\x61\x60 |0 \x84\x5E\x6B |0 - \x89\x61\x5C |0 \x87\x45\x38 |0 \x85\x66\x44 |0 \x87\x45\x39 |0 @@ -52388,9 +46006,6 @@ CHARMAP \x87\x4C\x2D |0 \x87\x4C\x2E |0 \x87\x4C\x2F |0 - \x89\x64\x5B |0 - \x89\x64\x5C |0 - \x89\x64\x5D |0 \x87\x4C\x30 |0 \x83\x57\x36 |0 \x87\x4C\x35 |0 @@ -52403,7 +46018,6 @@ CHARMAP \x85\x6E\x68 |0 \x84\x65\x42 |0 \x85\x6E\x70 |0 - \x89\x66\x7D |0 \x84\x65\x43 |0 \x84\x65\x44 |0 \x84\x65\x48 |0 @@ -52421,8 +46035,6 @@ CHARMAP \x87\x51\x71 |0 \x87\x51\x6D |0 \x87\x51\x6C |0 - \x89\x66\x7E |0 - \x89\x67\x21 |0 \x87\x51\x67 |0 \x87\x51\x6E |0 \x87\x52\x27 |0 @@ -52438,7 +46050,6 @@ CHARMAP \x87\x56\x4C |0 \x87\x56\x4E |0 \x87\x56\x4B |0 - \x89\x69\x22 |0 \x87\x56\x4F |0 \x87\x56\x50 |0 \x85\x74\x78 |0 @@ -52458,9 +46069,6 @@ CHARMAP \x87\x5A\x39 |0 \x87\x5A\x3A |0 \x87\x5A\x3C |0 - \x89\x6A\x38 |0 - \x89\x6A\x39 |0 - \x89\x6A\x3A |0 \x85\x74\x72 |0 \x85\x74\x79 |0 \x87\x5A\x3F |0 @@ -52475,8 +46083,6 @@ CHARMAP \x87\x5D\x5E |0 \x87\x5D\x5B |0 \x87\x5D\x60 |0 - \x89\x6B\x38 |0 - \x89\x6B\x39 |0 \x87\x5D\x58 |0 \x85\x78\x4F |0 \x87\x60\x31 |0 @@ -52608,7 +46214,6 @@ CHARMAP \x87\x56\x54 |0 \x85\x72\x38 |0 \x87\x56\x55 |0 - \x89\x69\x23 |0 \x87\x56\x56 |0 \x87\x56\x52 |0 \x84\x69\x6D |0 @@ -52633,7 +46238,6 @@ CHARMAP \x85\x78\x50 |0 \x84\x6D\x34 |0 \x87\x61\x65 |0 - \x89\x6B\x3A |0 \x87\x63\x27 |0 \x85\x7A\x4E |0 \x87\x63\x28 |0 @@ -52645,31 +46249,15 @@ CHARMAP \x85\x46\x64 |0 \x85\x4B\x56 |0 \x86\x64\x5A |0 - \x89\x4D\x46 |0 - \x89\x4D\x47 |0 - \x89\x4D\x48 |0 \x86\x64\x59 |0 \x87\x2B\x56 |0 - \x89\x53\x2E |0 - \x89\x53\x2F |0 \x87\x36\x2E |0 \x87\x36\x2D |0 - \x89\x59\x2D |0 - \x89\x59\x2E |0 \x84\x5A\x36 |0 \x85\x60\x40 |0 - \x89\x5D\x6B |0 - \x89\x5D\x6C |0 \x87\x45\x40 |0 - \x89\x61\x61 |0 - \x89\x61\x62 |0 \x87\x4C\x3F |0 - \x89\x64\x5F |0 \x85\x6E\x76 |0 - \x89\x67\x22 |0 - \x89\x67\x23 |0 - \x89\x67\x24 |0 - \x89\x67\x25 |0 \x84\x68\x31 |0 \x87\x56\x58 |0 \x87\x5A\x45 |0 @@ -52677,7 +46265,6 @@ CHARMAP \x87\x5D\x69 |0 \x87\x5D\x6A |0 \x87\x60\x37 |0 - \x89\x6B\x73 |0 \x87\x61\x66 |0 \x87\x61\x67 |0 \x87\x63\x29 |0 @@ -52688,8 +46275,6 @@ CHARMAP \x86\x50\x4A |0 \x86\x5A\x4D |0 \x86\x5A\x4C |0 - \x89\x46\x3A |0 - \x89\x40\x69 |0 \x84\x48\x68 |0 \x85\x4B\x58 |0 \x86\x64\x60 |0 @@ -52718,10 +46303,6 @@ CHARMAP \x85\x53\x21 |0 \x87\x2B\x5C |0 \x87\x2B\x59 |0 - \x89\x53\x30 |0 - \x89\x53\x31 |0 - \x89\x53\x32 |0 - \x89\x53\x33 |0 \x87\x36\x2F |0 \x84\x55\x37 |0 \x87\x36\x31 |0 @@ -52736,10 +46317,6 @@ CHARMAP \x84\x55\x38 |0 \x87\x36\x33 |0 \x85\x5A\x38 |0 - \x89\x59\x2F |0 - \x89\x59\x30 |0 - \x89\x59\x31 |0 - \x89\x59\x33 |0 \x87\x36\x32 |0 \x84\x5A\x3A |0 \x84\x5A\x3C |0 @@ -52754,9 +46331,6 @@ CHARMAP \x87\x3E\x35 |0 \x84\x5A\x39 |0 \x87\x3E\x36 |0 - \x89\x5D\x6D |0 - \x89\x5D\x6E |0 - \x89\x5D\x6F |0 \x87\x3E\x37 |0 \x87\x3E\x39 |0 \x87\x3E\x3B |0 @@ -52774,11 +46348,8 @@ CHARMAP \x85\x66\x5A |0 \x84\x5E\x78 |0 \x85\x66\x5B |0 - \x89\x61\x63 |0 - \x89\x61\x65 |0 \x85\x66\x5D |0 \x87\x45\x41 |0 - \x89\x61\x64 |0 \x84\x62\x4D |0 \x87\x4C\x43 |0 \x87\x4C\x47 |0 @@ -52795,9 +46366,6 @@ CHARMAP \x87\x4C\x42 |0 \x84\x62\x4B |0 \x87\x4C\x44 |0 - \x89\x64\x60 |0 - \x89\x64\x61 |0 - \x89\x64\x63 |0 \x85\x6E\x7C |0 \x87\x51\x76 |0 \x85\x6E\x77 |0 @@ -52813,9 +46381,6 @@ CHARMAP \x87\x51\x78 |0 \x87\x51\x7B |0 \x87\x51\x7C |0 - \x89\x67\x26 |0 - \x89\x67\x27 |0 - \x89\x67\x28 |0 \x85\x6E\x7D |0 \x85\x72\x3B |0 \x85\x72\x3E |0 @@ -52829,7 +46394,6 @@ CHARMAP \x87\x56\x5A |0 \x85\x72\x3C |0 \x87\x56\x5E |0 - \x89\x69\x24 |0 \x87\x56\x5B |0 \x87\x56\x5C |0 \x85\x75\x21 |0 @@ -52847,8 +46411,6 @@ CHARMAP \x84\x69\x73 |0 \x87\x5A\x47 |0 \x87\x5A\x48 |0 - \x89\x6A\x3B |0 - \x89\x6A\x3C |0 \x85\x76\x77 |0 \x84\x6B\x38 |0 \x84\x6B\x39 |0 @@ -52856,7 +46418,6 @@ CHARMAP \x87\x5D\x6C |0 \x87\x5D\x6D |0 \x87\x5D\x6B |0 - \x89\x6B\x3B |0 \x84\x6C\x40 |0 \x87\x60\x38 |0 \x85\x78\x51 |0 @@ -52866,8 +46427,6 @@ CHARMAP \x87\x61\x68 |0 \x85\x79\x64 |0 \x84\x6D\x36 |0 - \x89\x6C\x42 |0 - \x89\x6C\x43 |0 \x87\x61\x69 |0 \x85\x7A\x4F |0 \x87\x63\x2A |0 @@ -52875,7 +46434,6 @@ CHARMAP \x87\x64\x2C |0 \x84\x6E\x29 |0 \x85\x7B\x26 |0 - \x89\x6C\x72 |0 \x87\x64\x77 |0 \x87\x64\x76 |0 \x85\x7B\x4E |0 @@ -52908,7 +46466,6 @@ CHARMAP \x87\x56\x60 |0 \x87\x5A\x4A |0 \x87\x5D\x6E |0 - \x89\x6C\x73 |0 \x85\x7B\x50 |0 \x84\x42\x24 |0 \x86\x5A\x4E |0 @@ -52987,8 +46544,6 @@ CHARMAP \x85\x44\x4D |0 \x84\x42\x25 |0 \x86\x5A\x4F |0 - \x89\x39\x30 |0 - \x89\x39\x2F |0 \x86\x5A\x53 |0 \x85\x4B\x5F |0 \x85\x4B\x60 |0 @@ -52999,9 +46554,6 @@ CHARMAP \x86\x64\x68 |0 \x86\x64\x65 |0 \x86\x64\x69 |0 - \x89\x4D\x49 |0 - \x89\x4D\x4A |0 - \x89\x4D\x4B |0 \x86\x64\x6B |0 \x86\x64\x66 |0 \x86\x64\x6E |0 @@ -53020,9 +46572,6 @@ CHARMAP \x84\x4F\x26 |0 \x87\x2B\x63 |0 \x85\x53\x25 |0 - \x89\x53\x34 |0 - \x89\x53\x35 |0 - \x89\x53\x36 |0 \x85\x53\x27 |0 \x87\x2B\x62 |0 \x85\x53\x26 |0 @@ -53034,7 +46583,6 @@ CHARMAP \x84\x55\x40 |0 \x85\x5A\x44 |0 \x87\x36\x3B |0 - \x89\x59\x34 |0 \x85\x5A\x3E |0 \x85\x5A\x3D |0 \x85\x5A\x3F |0 @@ -53054,9 +46602,6 @@ CHARMAP \x87\x3E\x40 |0 \x87\x3E\x41 |0 \x87\x3E\x43 |0 - \x89\x5D\x70 |0 - \x89\x5D\x71 |0 - \x89\x5D\x72 |0 \x85\x60\x4E |0 \x87\x3E\x3F |0 \x87\x3E\x42 |0 @@ -53070,7 +46615,6 @@ CHARMAP \x85\x66\x65 |0 \x87\x45\x4F |0 \x87\x45\x4C |0 - \x89\x61\x67 |0 \x87\x45\x4A |0 \x87\x45\x51 |0 \x85\x66\x62 |0 @@ -53083,10 +46627,6 @@ CHARMAP \x85\x6B\x27 |0 \x87\x4C\x4C |0 \x87\x4C\x4D |0 - \x89\x64\x64 |0 - \x89\x64\x65 |0 - \x89\x64\x66 |0 - \x89\x64\x67 |0 \x85\x66\x64 |0 \x85\x6B\x28 |0 \x87\x52\x2B |0 @@ -53097,14 +46637,12 @@ CHARMAP \x87\x52\x28 |0 \x85\x6F\x22 |0 \x87\x52\x26 |0 - \x89\x67\x29 |0 \x85\x72\x44 |0 \x85\x72\x46 |0 \x85\x72\x48 |0 \x84\x68\x37 |0 \x87\x56\x67 |0 \x87\x56\x68 |0 - \x89\x69\x25 |0 \x85\x72\x45 |0 \x85\x72\x43 |0 \x87\x56\x69 |0 @@ -53117,15 +46655,12 @@ CHARMAP \x87\x5A\x4E |0 \x84\x69\x79 |0 \x85\x75\x2B |0 - \x89\x6A\x3D |0 \x85\x75\x2C |0 \x85\x75\x29 |0 \x84\x69\x7A |0 - \x89\x67\x2A |0 \x87\x5A\x4D |0 \x85\x76\x7B |0 \x85\x76\x7A |0 - \x89\x69\x26 |0 \x85\x78\x54 |0 \x85\x78\x55 |0 \x84\x6C\x47 |0 @@ -53135,7 +46670,6 @@ CHARMAP \x87\x60\x3D |0 \x85\x79\x67 |0 \x85\x79\x66 |0 - \x89\x6C\x44 |0 \x87\x63\x2F |0 \x84\x6E\x2B |0 \x87\x64\x2E |0 @@ -53152,13 +46686,10 @@ CHARMAP \x84\x42\x28 |0 \x86\x5A\x56 |0 \x85\x44\x4F |0 - \x89\x46\x3B |0 \x86\x64\x6F |0 \x85\x4B\x65 |0 \x84\x48\x6C |0 \x85\x4B\x63 |0 - \x89\x4D\x4C |0 - \x89\x4D\x4D |0 \x85\x4B\x66 |0 \x84\x4F\x2F |0 \x84\x4F\x33 |0 @@ -53178,14 +46709,10 @@ CHARMAP \x87\x2B\x66 |0 \x84\x4F\x36 |0 \x85\x53\x32 |0 - \x89\x53\x37 |0 - \x89\x53\x3A |0 - \x89\x53\x3D |0 \x87\x2B\x6B |0 \x87\x2B\x67 |0 \x87\x2B\x69 |0 \x84\x4F\x2E |0 - \x89\x53\x39 |0 \x85\x53\x2F |0 \x85\x5A\x48 |0 \x85\x5A\x46 |0 @@ -53202,13 +46729,8 @@ CHARMAP \x87\x36\x40 |0 \x85\x5A\x4C |0 \x87\x36\x44 |0 - \x89\x59\x36 |0 - \x89\x59\x37 |0 - \x89\x59\x39 |0 - \x89\x59\x3A |0 \x85\x5A\x4B |0 \x87\x36\x42 |0 - \x89\x59\x35 |0 \x85\x5A\x47 |0 \x87\x36\x3F |0 \x85\x60\x56 |0 @@ -53228,12 +46750,6 @@ CHARMAP \x85\x60\x58 |0 \x87\x3E\x44 |0 \x84\x5A\x4A |0 - \x89\x46\x3C |0 - \x89\x5D\x73 |0 - \x89\x5D\x74 |0 - \x89\x5D\x75 |0 - \x89\x5D\x77 |0 - \x89\x5D\x79 |0 \x87\x3E\x48 |0 \x85\x60\x5B |0 \x85\x60\x53 |0 @@ -53255,16 +46771,6 @@ CHARMAP \x85\x66\x6F |0 \x85\x66\x6C |0 \x87\x45\x54 |0 - \x89\x61\x68 |0 - \x89\x61\x69 |0 - \x89\x61\x6A |0 - \x89\x61\x6B |0 - \x89\x61\x6C |0 - \x89\x61\x6D |0 - \x89\x61\x6E |0 - \x89\x61\x6F |0 - \x89\x61\x71 |0 - \x89\x61\x73 |0 \x87\x45\x55 |0 \x87\x3E\x47 |0 \x85\x66\x76 |0 @@ -53295,22 +46801,13 @@ CHARMAP \x85\x6B\x2E |0 \x87\x4C\x50 |0 \x85\x6B\x34 |0 - \x89\x64\x6E |0 - \x89\x64\x68 |0 - \x89\x64\x6A |0 - \x89\x64\x6C |0 - \x89\x64\x6F |0 - \x89\x64\x70 |0 - \x89\x64\x71 |0 \x85\x6B\x30 |0 \x87\x4C\x54 |0 \x87\x4C\x57 |0 \x84\x62\x53 |0 \x85\x6B\x37 |0 \x85\x6B\x2A |0 - \x89\x64\x69 |0 \x85\x6B\x2C |0 - \x89\x61\x70 |0 \x87\x4C\x56 |0 \x85\x6F\x27 |0 \x87\x52\x2E |0 @@ -53333,16 +46830,7 @@ CHARMAP \x87\x52\x30 |0 \x85\x6F\x2C |0 \x87\x52\x34 |0 - \x89\x67\x2B |0 - \x89\x67\x2C |0 - \x89\x67\x2D |0 - \x89\x67\x2F |0 - \x89\x67\x30 |0 - \x89\x67\x31 |0 - \x89\x67\x32 |0 - \x89\x67\x2E |0 \x85\x6F\x2A |0 - \x89\x67\x34 |0 \x85\x72\x4A |0 \x84\x68\x3F |0 \x85\x72\x4F |0 @@ -53365,16 +46853,6 @@ CHARMAP \x85\x72\x56 |0 \x87\x56\x6E |0 \x87\x56\x6F |0 - \x89\x69\x28 |0 - \x89\x69\x29 |0 - \x89\x69\x2B |0 - \x89\x69\x2C |0 - \x89\x69\x2D |0 - \x89\x69\x2E |0 - \x89\x69\x2F |0 - \x89\x69\x30 |0 - \x89\x69\x31 |0 - \x89\x69\x32 |0 \x87\x56\x6B |0 \x87\x56\x6C |0 \x85\x72\x55 |0 @@ -53398,10 +46876,6 @@ CHARMAP \x87\x5A\x55 |0 \x87\x5A\x51 |0 \x87\x5A\x5E |0 - \x89\x6A\x41 |0 - \x89\x6A\x42 |0 - \x89\x6A\x43 |0 - \x89\x6A\x40 |0 \x87\x5A\x5F |0 \x85\x75\x33 |0 \x87\x5A\x58 |0 @@ -53424,13 +46898,10 @@ CHARMAP \x87\x5D\x7C |0 \x85\x77\x21 |0 \x87\x5D\x79 |0 - \x89\x6B\x3D |0 - \x89\x6B\x3F |0 \x87\x5D\x7A |0 \x87\x5D\x7D |0 \x87\x5D\x7E |0 \x87\x5D\x7B |0 - \x89\x6B\x3C |0 \x87\x60\x43 |0 \x85\x78\x5C |0 \x85\x78\x60 |0 @@ -53447,8 +46918,6 @@ CHARMAP \x87\x60\x4B |0 \x87\x60\x47 |0 \x85\x78\x58 |0 - \x89\x6B\x75 |0 - \x89\x6B\x78 |0 \x87\x60\x48 |0 \x87\x60\x42 |0 \x87\x60\x44 |0 @@ -53467,8 +46936,6 @@ CHARMAP \x85\x79\x6B |0 \x87\x61\x72 |0 \x87\x61\x70 |0 - \x89\x6C\x45 |0 - \x89\x6C\x46 |0 \x85\x79\x6A |0 \x87\x61\x6D |0 \x87\x63\x35 |0 @@ -53478,16 +46945,11 @@ CHARMAP \x87\x63\x34 |0 \x85\x7A\x51 |0 \x85\x7A\x52 |0 - \x89\x6C\x5A |0 - \x89\x6C\x5B |0 - \x89\x6C\x5C |0 - \x89\x6C\x5D |0 \x87\x63\x31 |0 \x85\x7B\x28 |0 \x85\x7B\x27 |0 \x87\x64\x30 |0 \x85\x7B\x29 |0 - \x89\x6C\x74 |0 \x87\x64\x31 |0 \x85\x7B\x2A |0 \x87\x64\x32 |0 @@ -53500,26 +46962,19 @@ CHARMAP \x87\x64\x7B |0 \x85\x7B\x54 |0 \x87\x64\x7D |0 - \x89\x6C\x75 |0 \x85\x7B\x73 |0 \x85\x7B\x72 |0 \x85\x7B\x71 |0 \x85\x7B\x70 |0 \x87\x65\x50 |0 \x85\x7C\x26 |0 - \x89\x6D\x2B |0 - \x89\x6D\x2C |0 \x85\x7C\x27 |0 \x87\x65\x6B |0 \x85\x7C\x2E |0 \x85\x7C\x37 |0 \x87\x66\x2F |0 \x85\x7C\x36 |0 - \x89\x53\x3C |0 - \x89\x5D\x78 |0 - \x89\x6B\x3E |0 \x86\x50\x4C |0 - \x89\x40\x33 |0 \x86\x50\x4D |0 \x84\x42\x2B |0 \x86\x5A\x57 |0 @@ -53542,9 +46997,6 @@ CHARMAP \x86\x64\x74 |0 \x84\x48\x70 |0 \x85\x4B\x68 |0 - \x89\x4D\x4F |0 - \x89\x4D\x50 |0 - \x89\x4D\x51 |0 \x85\x4B\x67 |0 \x84\x4F\x45 |0 \x87\x2B\x72 |0 @@ -53575,7 +47027,6 @@ CHARMAP \x84\x4F\x46 |0 \x87\x2B\x70 |0 \x87\x2B\x7B |0 - \x89\x53\x40 |0 \x87\x2B\x6E |0 \x87\x2B\x77 |0 \x87\x2B\x78 |0 @@ -53606,10 +47057,6 @@ CHARMAP \x87\x36\x4C |0 \x87\x36\x45 |0 \x87\x36\x4E |0 - \x89\x59\x3D |0 - \x89\x59\x3E |0 - \x89\x59\x3F |0 - \x89\x59\x40 |0 \x87\x36\x4D |0 \x87\x36\x4F |0 \x87\x36\x58 |0 @@ -53623,7 +47070,6 @@ CHARMAP \x87\x36\x49 |0 \x85\x5A\x50 |0 \x87\x36\x46 |0 - \x89\x56\x33 |0 \x87\x3E\x51 |0 \x84\x5A\x4C |0 \x85\x60\x5E |0 @@ -53651,14 +47097,6 @@ CHARMAP \x87\x3E\x53 |0 \x85\x60\x68 |0 \x85\x60\x6A |0 - \x89\x5D\x7A |0 - \x89\x5D\x7B |0 - \x89\x5D\x7C |0 - \x89\x5D\x7D |0 - \x89\x5E\x21 |0 - \x89\x5E\x22 |0 - \x89\x5E\x23 |0 - \x89\x5E\x25 |0 \x87\x3E\x50 |0 \x85\x60\x5F |0 \x84\x5A\x5A |0 @@ -53700,8 +47138,6 @@ CHARMAP \x87\x45\x68 |0 \x87\x45\x56 |0 \x87\x45\x60 |0 - \x89\x61\x74 |0 - \x89\x61\x75 |0 \x87\x45\x57 |0 \x85\x67\x29 |0 \x87\x45\x63 |0 @@ -53735,9 +47171,6 @@ CHARMAP \x84\x62\x6D |0 \x87\x4C\x69 |0 \x85\x6B\x46 |0 - \x89\x64\x74 |0 - \x89\x64\x76 |0 - \x89\x64\x77 |0 \x87\x4C\x61 |0 \x85\x6B\x47 |0 \x87\x4C\x6F |0 @@ -53790,14 +47223,12 @@ CHARMAP \x85\x6F\x34 |0 \x85\x6F\x43 |0 \x87\x52\x38 |0 - \x89\x67\x37 |0 \x87\x52\x3E |0 \x87\x52\x3D |0 \x87\x52\x39 |0 \x87\x52\x44 |0 \x87\x52\x41 |0 \x87\x52\x3C |0 - \x89\x67\x38 |0 \x85\x6F\x41 |0 \x87\x45\x5A |0 \x85\x72\x5E |0 @@ -53825,18 +47256,15 @@ CHARMAP \x87\x56\x7C |0 \x85\x72\x69 |0 \x85\x72\x6A |0 - \x89\x69\x34 |0 \x85\x72\x5F |0 \x87\x57\x23 |0 \x87\x56\x77 |0 \x87\x57\x28 |0 \x87\x56\x76 |0 \x87\x56\x7B |0 - \x89\x69\x33 |0 \x85\x72\x58 |0 \x87\x56\x78 |0 \x85\x72\x59 |0 - \x89\x67\x36 |0 \x85\x75\x42 |0 \x85\x75\x3D |0 \x84\x6A\x24 |0 @@ -53870,11 +47298,6 @@ CHARMAP \x87\x5A\x6F |0 \x87\x5A\x67 |0 \x87\x57\x25 |0 - \x89\x6A\x44 |0 - \x89\x6A\x45 |0 - \x89\x6A\x46 |0 - \x89\x6A\x47 |0 - \x89\x6A\x48 |0 \x85\x75\x3E |0 \x87\x5A\x66 |0 \x87\x5A\x64 |0 @@ -53914,7 +47337,6 @@ CHARMAP \x87\x5E\x34 |0 \x85\x77\x36 |0 \x87\x5E\x2D |0 - \x89\x6B\x40 |0 \x87\x5E\x24 |0 \x87\x5E\x26 |0 \x87\x5E\x2E |0 @@ -53924,7 +47346,6 @@ CHARMAP \x87\x5E\x2A |0 \x87\x5E\x25 |0 \x84\x6B\x41 |0 - \x89\x6B\x7A |0 \x87\x5E\x37 |0 \x87\x60\x4D |0 \x85\x78\x67 |0 @@ -53946,7 +47367,6 @@ CHARMAP \x85\x78\x63 |0 \x85\x78\x66 |0 \x85\x78\x62 |0 - \x89\x6B\x79 |0 \x87\x60\x52 |0 \x84\x6C\x55 |0 \x85\x78\x64 |0 @@ -53979,7 +47399,6 @@ CHARMAP \x87\x63\x3B |0 \x85\x7A\x5B |0 \x87\x63\x3D |0 - \x89\x6C\x5E |0 \x87\x63\x3A |0 \x87\x63\x36 |0 \x87\x63\x3C |0 @@ -53993,7 +47412,6 @@ CHARMAP \x85\x7B\x30 |0 \x85\x7B\x2D |0 \x87\x64\x37 |0 - \x89\x6C\x76 |0 \x84\x6E\x2E |0 \x87\x64\x33 |0 \x87\x64\x35 |0 @@ -54018,7 +47436,6 @@ CHARMAP \x87\x65\x6C |0 \x85\x7C\x29 |0 \x85\x7C\x28 |0 - \x89\x6D\x32 |0 \x85\x7C\x2F |0 \x87\x66\x21 |0 \x87\x65\x7E |0 @@ -54027,7 +47444,6 @@ CHARMAP \x85\x7C\x39 |0 \x87\x66\x3A |0 \x85\x7C\x41 |0 - \x89\x6D\x37 |0 \x85\x7C\x48 |0 \x87\x66\x45 |0 \x84\x48\x71 |0 @@ -54040,7 +47456,6 @@ CHARMAP \x85\x5A\x5C |0 \x87\x36\x5A |0 \x87\x36\x5B |0 - \x89\x59\x41 |0 \x87\x36\x59 |0 \x85\x67\x2C |0 \x87\x3E\x59 |0 @@ -54072,9 +47487,7 @@ CHARMAP \x87\x63\x3E |0 \x85\x7B\x32 |0 \x86\x5A\x5D |0 - \x89\x46\x3D |0 \x85\x4B\x6C |0 - \x89\x4D\x52 |0 \x87\x2C\x28 |0 \x85\x53\x45 |0 \x87\x2C\x27 |0 @@ -54087,9 +47500,6 @@ CHARMAP \x87\x2C\x23 |0 \x87\x36\x5D |0 \x85\x5A\x5D |0 - \x89\x59\x42 |0 - \x89\x59\x43 |0 - \x89\x59\x44 |0 \x85\x60\x6F |0 \x85\x60\x72 |0 \x85\x60\x70 |0 @@ -54100,7 +47510,6 @@ CHARMAP \x87\x3E\x5A |0 \x87\x3E\x5E |0 \x87\x3E\x5D |0 - \x89\x5E\x26 |0 \x85\x60\x6E |0 \x87\x45\x6E |0 \x85\x67\x31 |0 @@ -54111,9 +47520,6 @@ CHARMAP \x87\x45\x6A |0 \x85\x67\x30 |0 \x87\x45\x6C |0 - \x89\x61\x78 |0 - \x89\x61\x79 |0 - \x89\x61\x7A |0 \x85\x67\x2F |0 \x85\x6B\x4F |0 \x85\x6B\x4E |0 @@ -54127,7 +47533,6 @@ CHARMAP \x84\x62\x74 |0 \x84\x65\x6F |0 \x87\x4C\x74 |0 - \x89\x67\x39 |0 \x87\x52\x4A |0 \x87\x52\x4C |0 \x85\x6F\x4A |0 @@ -54135,10 +47540,8 @@ CHARMAP \x87\x57\x2C |0 \x87\x57\x2D |0 \x84\x68\x46 |0 - \x89\x69\x35 |0 \x85\x75\x47 |0 \x84\x6A\x2E |0 - \x89\x6A\x49 |0 \x85\x77\x3A |0 \x85\x77\x3C |0 \x85\x77\x3B |0 @@ -54147,13 +47550,11 @@ CHARMAP \x87\x60\x56 |0 \x84\x6C\x58 |0 \x87\x60\x57 |0 - \x89\x6B\x7B |0 \x85\x79\x75 |0 \x85\x79\x74 |0 \x85\x78\x6E |0 \x84\x6D\x40 |0 \x84\x6D\x6C |0 - \x89\x6C\x47 |0 \x87\x65\x28 |0 \x87\x65\x57 |0 \x85\x7C\x46 |0 @@ -54161,10 +47562,8 @@ CHARMAP \x86\x5A\x5F |0 \x86\x5A\x5E |0 \x85\x44\x53 |0 - \x89\x46\x3F |0 \x84\x48\x75 |0 \x86\x64\x75 |0 - \x89\x4D\x53 |0 \x85\x53\x4B |0 \x85\x53\x4A |0 \x84\x4F\x4F |0 @@ -54185,14 +47584,12 @@ CHARMAP \x84\x55\x5B |0 \x87\x36\x62 |0 \x86\x47\x53 |0 - \x89\x59\x45 |0 \x85\x5A\x5E |0 \x87\x36\x60 |0 \x85\x60\x74 |0 \x85\x60\x75 |0 \x87\x3E\x60 |0 \x87\x3E\x61 |0 - \x89\x5E\x28 |0 \x87\x3E\x62 |0 \x87\x3E\x5F |0 \x87\x45\x70 |0 @@ -54202,7 +47599,6 @@ CHARMAP \x85\x67\x35 |0 \x87\x45\x73 |0 \x85\x67\x34 |0 - \x89\x61\x7B |0 \x87\x45\x71 |0 \x87\x45\x6F |0 \x84\x62\x7A |0 @@ -54229,7 +47625,6 @@ CHARMAP \x85\x6F\x4E |0 \x85\x6F\x4D |0 \x87\x52\x51 |0 - \x89\x67\x3A |0 \x87\x52\x4E |0 \x87\x52\x4D |0 \x85\x72\x6C |0 @@ -54274,10 +47669,6 @@ CHARMAP \x87\x65\x29 |0 \x84\x6E\x52 |0 \x85\x7C\x30 |0 - \x89\x29\x21 |0 - \x89\x46\x3E |0 - \x89\x53\x42 |0 - \x89\x5E\x27 |0 \x85\x4B\x70 |0 \x85\x4B\x6E |0 \x85\x4B\x6F |0 @@ -54289,10 +47680,8 @@ CHARMAP \x87\x36\x64 |0 \x85\x5A\x5F |0 \x85\x5A\x60 |0 - \x89\x59\x46 |0 \x85\x60\x78 |0 \x85\x60\x76 |0 - \x89\x5E\x29 |0 \x85\x60\x77 |0 \x85\x67\x36 |0 \x87\x4C\x7C |0 @@ -54307,7 +47696,6 @@ CHARMAP \x87\x5E\x3D |0 \x84\x6B\x51 |0 \x85\x7C\x31 |0 - \x89\x4D\x54 |0 \x87\x2C\x32 |0 \x85\x5A\x62 |0 \x85\x5A\x64 |0 @@ -54319,7 +47707,6 @@ CHARMAP \x85\x67\x37 |0 \x85\x6B\x57 |0 \x84\x63\x22 |0 - \x89\x64\x79 |0 \x84\x65\x75 |0 \x84\x65\x74 |0 \x85\x6F\x50 |0 @@ -54328,7 +47715,6 @@ CHARMAP \x87\x52\x54 |0 \x87\x52\x55 |0 \x87\x52\x56 |0 - \x89\x67\x3B |0 \x87\x52\x57 |0 \x85\x72\x73 |0 \x85\x72\x72 |0 @@ -54373,7 +47759,6 @@ CHARMAP \x85\x72\x74 |0 \x87\x57\x36 |0 \x87\x57\x35 |0 - \x89\x69\x36 |0 \x85\x75\x50 |0 \x84\x6B\x54 |0 \x85\x77\x42 |0 @@ -54405,7 +47790,6 @@ CHARMAP \x84\x5A\x60 |0 \x87\x3E\x68 |0 \x85\x61\x21 |0 - \x89\x5E\x2A |0 \x87\x3E\x67 |0 \x85\x67\x3E |0 \x85\x67\x3C |0 @@ -54433,7 +47817,6 @@ CHARMAP \x85\x6F\x5A |0 \x84\x65\x7A |0 \x87\x52\x5A |0 - \x89\x67\x3C |0 \x87\x52\x59 |0 \x87\x57\x38 |0 \x84\x68\x53 |0 @@ -54566,7 +47949,6 @@ CHARMAP \x85\x67\x43 |0 \x87\x45\x7A |0 \x85\x67\x44 |0 - \x89\x61\x7D |0 \x87\x4D\x27 |0 \x85\x6B\x60 |0 \x87\x4D\x26 |0 @@ -54688,7 +48070,6 @@ CHARMAP \x85\x77\x4C |0 \x87\x5E\x49 |0 \x85\x78\x7C |0 - \x89\x6B\x7E |0 \x87\x60\x61 |0 \x85\x79\x7E |0 \x85\x7A\x21 |0 @@ -54698,7 +48079,6 @@ CHARMAP \x87\x64\x3C |0 \x84\x6E\x53 |0 \x85\x7C\x32 |0 - \x89\x40\x34 |0 \x84\x55\x64 |0 \x84\x5A\x65 |0 \x87\x46\x22 |0 @@ -54707,7 +48087,6 @@ CHARMAP \x85\x6D\x57 |0 \x84\x66\x24 |0 \x84\x6A\x3B |0 - \x89\x69\x37 |0 \x85\x7A\x23 |0 \x85\x7A\x22 |0 \x87\x62\x21 |0 @@ -54866,7 +48245,6 @@ CHARMAP \x87\x4E\x24 |0 \x85\x6F\x64 |0 \x87\x57\x48 |0 - \x89\x67\x3D |0 \x87\x5B\x42 |0 \x87\x5B\x41 |0 \x87\x5B\x43 |0 @@ -54884,7 +48262,6 @@ CHARMAP \x84\x66\x2C |0 \x87\x52\x73 |0 \x87\x52\x71 |0 - \x89\x67\x3E |0 \x87\x52\x72 |0 \x85\x73\x2C |0 \x85\x73\x2E |0 @@ -54901,9 +48278,7 @@ CHARMAP \x85\x7B\x3A |0 \x85\x77\x52 |0 \x87\x64\x42 |0 - \x89\x6D\x2D |0 \x85\x7C\x42 |0 - \x89\x29\x26 |0 \x85\x73\x30 |0 \x87\x62\x2B |0 \x87\x62\x2A |0 @@ -54916,7 +48291,4 @@ CHARMAP \x87\x66\x25 |0 \x84\x6E\x56 |0 \x87\x66\x4C |0 -# END CHARMAP -# -#________________________________________________________________________ diff --git a/icuSources/data/mappings/convrtrs.txt b/icuSources/data/mappings/convrtrs.txt index 04632716..f56fd359 100644 --- a/icuSources/data/mappings/convrtrs.txt +++ b/icuSources/data/mappings/convrtrs.txt @@ -1,27 +1,48 @@ -# ******************************************************************************* +# ****************************************************************************** # * -# * Copyright (C) 1995-2003, International Business Machines +# * Copyright (C) 1995-2004, International Business Machines # * Corporation and others. All Rights Reserved. # * -# ******************************************************************************* +# ****************************************************************************** + +# If this converter alias table looks very confusing, a much easier to +# understand view can be found at this demo: +# http://oss.software.ibm.com/cgi-bin/icu/convexp # IMPORTANT NOTE # # This file is not read directly by ICU. If you change it, you need to -# run gencnval, and eventually pkgdata to update the representation that -# ICU uses for aliases. +# run gencnval, and eventually run pkgdata to update the representation that +# ICU uses for aliases. The gencnval tool will normally compile this file into +# cnvalias.icu. The gencnval -v verbose option will help you when you edit +# this file. -# Please be friendly to the rest of use that edit this table by +# Please be friendly to the rest of us that edit this table by # keeping this table free of tabs. # This is an alias file used by the character set converter. +# A lot of converter information can be found in unicode/ucnv.h, but here +# is more information about this file. +# +# Here is the file format using BNF-like syntax: # -# Format: +# converterTable ::= tags { converterLine* } +# converterLine ::= converterName [ tags ] { taggedAlias* }'\n' +# taggedAlias ::= alias [ tags ] +# tags ::= '{' { tag+ } '}' +# tag ::= standard['*'] +# converterName ::= [0-9a-zA-Z:_'-']+ +# alias ::= converterName # -# Actual file name || Algorithm name alias1 alias2 ... +# Except for the converter name, aliases are case insensitive. +# Names are separated by whitespace. +# Line continuation and comment sytax are similar to the GNU make syntax. +# Any lines beginning with whitespace (e.g. U+0020 SPACE or U+0009 HORIZONTAL +# TABULATION) are presumed to be a continuation of the previous line. +# The # symbol starts a comment and the comment continues till the end of +# the line. # -# except for column 1 (file names) case insensitive. Names are separated -# by whitespace. +# The converter # # All names can be tagged by including a space-separated list of tags in # curly braces, as in ISO_8859-1:1987{IANA*} iso-8859-1 { MIME* } or @@ -30,55 +51,67 @@ # # The tags can be used to get standard names using ucnv_getStandardName(). # -# Here is a list of tags used in this file: -# -# IANA The IANA charset name, as documented in RFC 1700. -# MIME The MIME charset name, used for content type tagging. +# The complete list of recognized tags used in this file is defined in +# the affinity list near the beginning of the file. # # The * after the standard tag denotes that the previous alias is the # preferred (default) charset name for that standard. There can only # be one of these default charset names per converter. + + # The world is getting more complicated... # Supporting XML parsers, HTML, MIME, and similar applications -# that mark encodings with unique charset names, we are forced to -# make this table much more static than before. +# that mark encodings with a charset name can be difficult. +# Many of these applications and operating systems will update +# their codepages over time. -# It means that a new encoding, one that differs from an +# It means that a new codepage, one that differs from an # old one by changing a code point, e.g., to the Euro sign, # must not get an old alias, because it would mean that # old files with this alias would be interpreted differently. -# If an encoding gets updated by assigning characters to previously +# If an codepage gets updated by assigning characters to previously # unassigned code points, then a new name is not necessary. # Also, some codepages map unassigned codepage byte values # to the same numbers in Unicode for roundtripping. It may be # industry practice to keep the encoding name in such a case, too # (example: Windows codepages). -# Especially, the aliases listed in the list of character sets +# The aliases listed in the list of character sets # that is maintained by the IANA (http://www.iana.org/) must # not be changed to mean encodings different from what this -# list shows. -# Currently, the IANA list is at +# list shows. Currently, the IANA list is at # http://www.iana.org/assignments/character-sets +# It should also be mentioned that the exact mapping table used for each +# IANA names usually isn't specified. This means that some other applications +# and operating systems are left to interpret the exact mappings for the +# underspecified aliases. For instance, Shift-JIS on a Solaris platform +# may be different from Shift-JIS on a Windows platform. This is why +# some of the aliases can be tagged to differentiate different mapping +# tables with the same alias. If an alias is given to more than one converter, +# it is considered to be an ambiguous alias, and the affinity list will +# choose the converter to use when a standard isn't specified with the alias. # Name matching is case-insensitive. Also, dashes '-', underscores '_' -# and spaces ' ' are ignored in names (thus cs-iso-latin-1 and csisolatin1 -# are the same). +# and spaces ' ' are ignored in names (thus cs-iso_latin-1, csisolatin1 +# and "cs iso latin 1" are the same). # However, the names in the left column are directly file names # or names of algorithmic converters, and their case must not # be changed - or else code and/or file names must also be changed. +# For example, the converter ibm-921 is expected to be the file ibm-921.cnv. -# This is the list of supported standard tags. +# The immediately following list is the affinity list of supported standard tags. # When multiple converters have the same alias under different standards, # the standard nearest to the top of this list with that alias will -# be the first converter that will be opened. +# be the first converter that will be opened. The ordering of the aliases +# after this affinity list does not affect the preferred alias, but it may +# affect the order of the returned list of aliases for a given converter. # # The general ordering is from specific and frequently used to more general -# or rarely used. +# or rarely used at the bottom. { UTR22 # Name format specified by http://www.unicode.org/unicode/reports/tr22/ # ICU # Can also use ICU_FEATURE IBM # The IBM CCSID number is specified by ibm-* @@ -86,7 +119,7 @@ JAVA # Source: Sun JDK. Alias name case is ignored, but dashes are not ignored. # GLIBC # AIX - # DB2 + # DB2 # SOLARIS # APPLE # HPUX @@ -142,8 +175,8 @@ UTF32_OppositeEndian # On UTF-7: # RFC 2152 (http://www.imc.org/rfc2152) allows to encode some US-ASCII # characters directly or in base64. Especially, the characters in set O -# as defined in the RFC (!"#$%&*;<=>@[]^_`{|}) may be encoded directly but are not -# allowed in, e.g., email headers. +# as defined in the RFC (!"#$%&*;<=>@[]^_`{|}) may be encoded directly +# but are not allowed in, e.g., email headers. # By default, the ICU UTF-7 converter encodes set O directly. # By choosing the option "version=1", set O will be escaped instead. # For example: @@ -200,47 +233,9 @@ US-ASCII { MIME* IANA JAVA WINDOWS } windows-20127 { WINDOWS* } # IBM367 { IANA WINDOWS } # This isn't the default ibm-367. -# Partially algorithmic converters - -ISO_2022 ISO-2022 { MIME* } 2022 cp2022 -ISO_2022,locale=ja,version=0 ISO-2022-JP { IANA* MIME* JAVA* } csISO2022JP { JAVA } -ISO_2022,locale=ja,version=1 ISO-2022-JP-1 JIS JIS_Encoding { IANA* } -ISO_2022,locale=ja,version=2 ISO-2022-JP-2 { IANA* MIME* } csISO2022JP2 -ISO_2022,locale=ja,version=3 JIS7 csJISEncoding -ISO_2022,locale=ja,version=4 JIS8 -ISO_2022,locale=ko,version=0 ISO-2022-KR { IANA* MIME* } csISO2022KR # This uses ibm-949 -ISO_2022,locale=ko,version=1 ibm-25546 -ISO_2022,locale=zh,version=0 ISO-2022-CN { IANA* MIME* } # csISO2022CN -ISO_2022,locale=zh,version=1 ISO-2022-CN-EXT { IANA* MIME* } -HZ HZ-GB-2312 { IANA* MIME* } -ISCII,version=0 x-iscii-de { WINDOWS } windows-57002 { WINDOWS* } iscii-dev -ISCII,version=1 x-iscii-be { WINDOWS } windows-57003 { WINDOWS* } iscii-bng windows-57006 { WINDOWS } x-iscii-as { WINDOWS } # be is different from as on Windows. -ISCII,version=2 x-iscii-pa { WINDOWS } windows-57011 { WINDOWS* } iscii-gur -ISCII,version=3 x-iscii-gu { WINDOWS } windows-57010 { WINDOWS* } iscii-guj -ISCII,version=4 x-iscii-or { WINDOWS } windows-57007 { WINDOWS* } iscii-ori -ISCII,version=5 x-iscii-ta { WINDOWS } windows-57004 { WINDOWS* } iscii-tml -ISCII,version=6 x-iscii-te { WINDOWS } windows-57005 { WINDOWS* } iscii-tlg -ISCII,version=7 x-iscii-ka { WINDOWS } windows-57008 { WINDOWS* } iscii-knd -ISCII,version=8 x-iscii-ma { WINDOWS } windows-57009 { WINDOWS* } iscii-mlm - # GB 18030 is partly algorithmic, using the MBCS converter gb18030 { IANA* } ibm-1392 { IBM* } windows-54936 { WINDOWS* } -# Lotus specific -LMBCS-1 lmbcs -LMBCS-2 -LMBCS-3 -LMBCS-4 -LMBCS-5 -LMBCS-6 -LMBCS-8 -LMBCS-11 -LMBCS-16 -LMBCS-17 -LMBCS-18 -LMBCS-19 - - # Table-based interchange codepages ibm-367_P100-1995 { UTR22* } ibm-367 { IBM* } IBM367 { IANA* } # This is ASCII, but it has fallbacks @@ -406,7 +401,10 @@ ibm-942_P12A-1999 { UTR22* } # ibm-942_P120 is a rarely used alternate mappin ibm-932_VSUB_VPUA # Is this "JIS_C6226-1978"? -ibm-943_P14A-1999 { UTR22* } +# ibm-943_P15A-2003 differs from windows-932-2000 only in a few roundtrip mappings: +# - the usual IBM PC control code rotation (1A-1C-7F) +# - the Windows table has roundtrips for bytes 80, A0, and FD-FF to U+0080 and PUA +ibm-943_P15A-2003 { UTR22* } ibm-943 # Leave untagged because this isn't the default Shift_JIS { IANA* MIME* WINDOWS JAVA } MS_Kanji { IANA WINDOWS JAVA } @@ -418,6 +416,7 @@ ibm-943_P14A-1999 { UTR22* } cp932 { WINDOWS } windows-932 { WINDOWS* } cp943c { JAVA* } # This is slightly different, but the backslash mapping is the same. + IBM-943C #{ AIX* } # Add this tag once AIX aliases becomes available ms932 pck # Probably SOLARIS sjis # This might be for ibm-1351 @@ -448,9 +447,16 @@ ibm-33722_P120-1999 { UTR22* } # Japan EUC with \ <-> Yen mapping cp33722 { JAVA* } 33722 { JAVA } ibm-33722_VASCII_VPUA - # ibm-954 seems to be a superset of ibm-33722 +# ibm-954 seems to be almost a superset of ibm-33722 +ibm-954_P101-2000 { UTR22* } + ibm-954 { IBM* } + EUC-JP # This is Solaris EUC-JP. + # eucJP # A closer Solaris alias + ibm-1373_P100-2002 { UTR22* } # Taiwan Big-5 (w/ euro update) ibm-1373 { IBM* } + windows-950 # Alternate mapping. Leave untagged. This is the IBM interpretation of a Windows codepage. +windows-950-2000 { UTR22* } Big5 { IANA* MIME* JAVA* WINDOWS } csBig5 { IANA WINDOWS } windows-950 { WINDOWS* } @@ -459,22 +465,30 @@ ibm-950_P110-1999 { UTR22* } # Taiwan Big-5 (w/o euro update) ibm-950 { IBM* JAVA } cp950 { JAVA* } 950 { JAVA } -macos-2566-10_2 { UTR22* } +macos-2566-10.2 { UTR22* } # This uses supplementary characters. Big5-HKSCS { IANA* JAVA* } big5hk { JAVA } HKSCS-BIG5 # From http://www.openi18n.org/localenameguide/ # big5-hkscs:unicode3.0 # This is actually post 3.0 data, which has different mappings +ibm-1375_P100-2003 { UTR22* } # IBM's interpretation of Windows' Taiwan Big-5 w/ HKSCS extensions + ibm-1375 { IBM* } + Big5-HKSCS + # windows-950 # Windows-950 can be w/ or w/o HKSCS extensions. By default it's not. + # windows-950_hkscs ibm-1386_P100-2002 { UTR22* } ibm-1386 { IBM* JAVA } - GBK { IANA* WINDOWS } - CP936 { IANA } - windows-936 { IANA WINDOWS* } - MS936 { IANA } cp1386 { JAVA* } + windows-936 # Alternate mapping. Leave untagged. This is the IBM interpretation of a Windows codepage. ibm-1386_VSUB_VPUA # zh_cn +windows-936-2000 { UTR22* } + GBK { IANA* WINDOWS } + CP936 { IANA } + MS936 { IANA } + windows-936 { IANA WINDOWS* } + ibm-1383_P110-1999 { UTR22* } # China EUC. ibm-1383 { IBM* } GB2312 { IANA* MIME* } @@ -515,52 +529,93 @@ ibm-949_P11A-1999 { UTR22* } cp949c { JAVA* } ibm-949_VSUB_VPUA -# ibm-970 is a almost a subset of ibm-1363. +# Korean EUC. +# +# +# EUC-KR = KS X 1003/ISO 646-KR or ISO 646-IRV/US-ASCII in GL and KS X 1001:1998 (formerly KS C 5601-1987) in GR. +# +# Although widely spread on MS Windows, using +# KS C 5601 or related names to denote EUC-KR or +# windows-949 is very much misleading. KS C 5601-1987 +# is NOT suitable as a designation for MIME charset +# and MBCS. It's just the name of a 94 x 94 Korean +# coded character set standard which can be invoked +# on either GL (with MSB reset) or GR (with MSB set). +# Note that JOHAB (windows-1361) specified in +# KS X 1001:1998 annex 3 (KS C 5601-1992 annex 3) +# is a _seprate_ MBCS with a _completely different_ +# mapping. +# +# +# The following aliases tries to mirror the poor state of alias recognition +# on these platforms. +# +# ibm-970 is almost a subset of ibm-1363. # Java, Solaris and AIX use euc-kr to also mean ksc5601. ibm-970_P110-1995 { UTR22* } - ibm-970 { IBM* } + ibm-970 { IBM* JAVA } EUC-KR { IANA* MIME* WINDOWS JAVA* } + KS_C_5601-1987 { JAVA } windows-51949 { WINDOWS* } + csEUCKR { IANA WINDOWS } # x-euc-kr is also a MIME name ibm-eucKR { JAVA } - csEUCKR { IANA WINDOWS } # Korean EUC. x-euc-kr is a MIME name + KSC_5601 { JAVA } # Needed by iso-2022 + 5601 { JAVA } ibm-970_VPUA + +# ibm-971 is almost the set of DBCS mappings of ibm-970 +ibm-971_P100-1995 ibm-971 { IBM* } ibm-971_VPUA + # Java, Solaris and AIX use euc-kr to also mean ksc5601, and _sometimes_ for Windows too. # ibm-1363 is almost a superset of ibm-970. -# Johab seems to be ksc5601-1992 and windows-1361, which is not this. ibm-1363_P11B-1998 { UTR22* } ibm-1363 # Leave untagged because this isn't the default - KS_C_5601-1987 { IANA* WINDOWS JAVA } - KS_C_5601-1989 { IANA WINDOWS } - KSC_5601 { MIME* IANA WINDOWS } - csKSC56011987 { IANA WINDOWS } - korean { IANA WINDOWS } - iso-ir-149 { IANA WINDOWS } - 5601 { JAVA } - windows-949 { JAVA* WINDOWS* } + KS_C_5601-1987 { IANA* } + KS_C_5601-1989 { IANA } + KSC_5601 { MIME* IANA } # Needed by iso-2022 + csKSC56011987 { IANA } + korean { IANA } + iso-ir-149 { IANA } + 5601 cp1363 ksc + windows-949 # Alternate mapping. Leave untagged. This is the IBM interpretation of a Windows codepage. ibm-1363_VSUB_VPUA - # ks_x_1001:1992 # This seems to mean johab - # ksc5601-1992 # This seems to mean johab + # ks_x_1001:1992 + # ksc5601-1992 + ibm-1363_P110-1997 { UTR22* } # Korean KSC MBCS with \ <-> Won mapping ibm-1363 { IBM* } ibm-1363_VASCII_VSUB_VPUA +windows-949-2000 { UTR22* } + windows-949 { JAVA* WINDOWS* } + KS_C_5601-1987 { WINDOWS } + KS_C_5601-1989 { WINDOWS } + KSC_5601 { WINDOWS } # Needed by iso-2022 + csKSC56011987 { WINDOWS } + korean { WINDOWS } + iso-ir-149 { WINDOWS } + ms949 { JAVA } + ibm-1162_P100-1999 { UTR22* } # Thai (w/ euro update) ibm-1162 { IBM* } - TIS-620 { IANA* WINDOWS } - windows-874 { JAVA* WINDOWS* } - tis620.2533 { JAVA } - eucTH # eucTH is an unusual alias from Solaris. eucTH has fewer mappings than TIS620 - # iso-8859-11 { WINDOWS } # iso-8859-11 is similar to TIS-620. ibm-13162 is a closer match. ibm-874_P100-1995 { UTR22* } # Thai PC (w/o euro update). - ibm-874 { IBM* } + ibm-874 { IBM* JAVA } ibm-9066 { IBM } # Yes ibm-874 == ibm-9066. ibm-1161 has the euro update. - 874 { JAVA } cp874 { JAVA* } + TIS-620 { IANA* JAVA } # This actually separate from ibm-874, which is similar to this table + tis620.2533 { JAVA } # This actually separate from ibm-874, which is similar to this table + eucTH # eucTH is an unusual alias from Solaris. eucTH has fewer mappings than TIS620 cp9066 +windows-874-2000 { UTR22* } # Thai (w/ euro update) + TIS-620 { WINDOWS } + windows-874 { JAVA* WINDOWS* } + MS874 { JAVA } + # iso-8859-11 { WINDOWS } # iso-8859-11 is similar to TIS-620. ibm-13162 is a closer match. + # Platform codepages ibm-437_P100-1995 { UTR22* } ibm-437 { IBM* } IBM437 { IANA* WINDOWS JAVA } cp437 { IANA WINDOWS JAVA* } 437 { IANA WINDOWS JAVA } csPC8CodePage437 { IANA JAVA } windows-437 { WINDOWS* } # PC US ibm-850_P100-1995 { UTR22* } ibm-850 { IBM* } IBM850 { IANA* WINDOWS JAVA } cp850 { IANA MIME* WINDOWS JAVA* } 850 { IANA JAVA } csPC850Multilingual { IANA JAVA } windows-850 { WINDOWS* } # PC latin1 @@ -586,33 +641,39 @@ ibm-902_P100-1999 { UTR22* } ibm-902 { IBM* } # PC Estonian (w/ euro update), ibm-922_P100-1999 { UTR22* } ibm-922 { IBM* JAVA } cp922 { MIME* JAVA* } 922 { JAVA } # PC Estonian (w/o euro update) ibm-4909_P100-1999 { UTR22* } ibm-4909 { IBM* } # ISO Greek (w/ euro update), update of ibm-813 -# The cp aliases in this section aren't really windows aliases, but it's used by ICU for Windows. +# The cp aliases in this section aren't really windows aliases, but it was used by ICU for Windows. +# cp is used to denote IBM in Java, and that is why we don't do that anymore. +# The windows-* aliases mean windows codepages. ibm-5346_P100-1998 { UTR22* } ibm-5346 { IBM* } windows-1250 { IANA* JAVA* WINDOWS* } cp1250 { WINDOWS } # Windows Latin2 (w/ euro update) ibm-5347_P100-1998 { UTR22* } ibm-5347 { IBM* } windows-1251 { IANA* JAVA* WINDOWS* } cp1251 { WINDOWS } # Windows Cyrillic (w/ euro update) ibm-5348_P100-1997 { UTR22* } ibm-5348 { IBM* } windows-1252 { IANA* JAVA* WINDOWS* } cp1252 { WINDOWS } # Windows Latin1 (w/ euro update) ibm-5349_P100-1998 { UTR22* } ibm-5349 { IBM* } windows-1253 { IANA* JAVA* WINDOWS* } cp1253 { WINDOWS } # Windows Greek (w/ euro update) ibm-5350_P100-1998 { UTR22* } ibm-5350 { IBM* } windows-1254 { IANA* JAVA* WINDOWS* } cp1254 { WINDOWS } # Windows Turkish (w/ euro update) -ibm-5351_P100-1998 { UTR22* } ibm-5351 { IBM* } windows-1255 { IANA* JAVA* WINDOWS* } cp1255 { WINDOWS } # Windows Hebrew (w/ euro update) -ibm-5352_P100-1998 { UTR22* } ibm-5352 { IBM* } windows-1256 { IANA* JAVA* WINDOWS* } cp1256 { WINDOWS } # Windows Arabic (w/ euro update) -ibm-5353_P100-1998 { UTR22* } ibm-5353 { IBM* } windows-1257 { IANA* JAVA* WINDOWS* } cp1257 { WINDOWS } # Windows Baltic (w/ euro update) +ibm-9447_P100-2002 { UTR22* } ibm-9447 { IBM* } windows-1255 { IANA* JAVA* WINDOWS* } cp1255 { WINDOWS } # Windows Hebrew (w/ euro update) +windows-1256-2000 { UTR22* } windows-1256 { IANA* JAVA* WINDOWS* } cp1256 { WINDOWS } # Windows Arabic (w/ euro update) +ibm-9449_P100-2002 { UTR22* } ibm-9449 { IBM* } windows-1257 { IANA* JAVA* WINDOWS* } cp1257 { WINDOWS } # Windows Baltic (w/ euro update) ibm-5354_P100-1998 { UTR22* } ibm-5354 { IBM* } windows-1258 { IANA* JAVA* WINDOWS* } cp1258 { WINDOWS } # Windows Vietnamese (w/ euro update) -# These tables are out of date, and don't have the Euro -ibm-1250_P100-1995 { UTR22* } ibm-1250 { IBM* } # Windows Latin2 (w/o euro update) -ibm-1251_P100-1995 { UTR22* } ibm-1251 { IBM* } # Windows Cyrillic (w/o euro update) -ibm-1252_P100-2000 { UTR22* } ibm-1252 { IBM* } # Windows Latin 1 without Euro -ibm-1253_P100-1995 { UTR22* } ibm-1253 { IBM* } # Windows Greek (w/o euro update) -ibm-1254_P100-1995 { UTR22* } ibm-1254 { IBM* } # Windows Turkish (w/o euro update) -ibm-1255_P100-1995 { UTR22* } ibm-1255 { IBM* } # Windows Hebrew (w/o euro update) -ibm-1256_P110-1997 { UTR22* } ibm-1256 { IBM* } # Windows Arabic (w/o euro update) -ibm-1257_P100-1995 { UTR22* } ibm-1257 { IBM* } # Windows Baltic (w/o euro update) -ibm-1258_P100-1997 { UTR22* } ibm-1258 { IBM* } # Windows Vietnamese (w/o euro update) - -ibm-1275_P100-1995 { UTR22* } ibm-1275 { IBM* } macintosh { IANA* MIME* WINDOWS } mac { IANA } csMacintosh { IANA } windows-10000 { WINDOWS* } # Apple latin 1 -ibm-1280_P100-1996 { UTR22* } ibm-1280 { IBM* } x-mac-greek { MIME* WINDOWS } windows-10006 { WINDOWS* } macgr # Apple Greek -ibm-1281_P100-1996 { UTR22* } ibm-1281 { IBM* } x-mac-turkish { MIME* WINDOWS } windows-10081 { WINDOWS* } mactr # Apple Turkish -ibm-1282_P100-1996 { UTR22* } ibm-1282 { IBM* } x-mac-centraleurroman { MIME* } windows-10029 { WINDOWS* } x-mac-ce { WINDOWS } macce # Apple Central Europe -ibm-1283_P100-1996 { UTR22* } ibm-1283 { IBM* } x-mac-cyrillic { MIME* WINDOWS } windows-10007 { WINDOWS* } maccy # Apple Cyrillic +# These tables are out of date, and most don't have the Euro +# Leave the windows- variants untagged. They are alternate tables of the newer ones above. +ibm-1250_P100-1995 { UTR22* } ibm-1250 { IBM* } windows-1250 # Old Windows Latin2 (w/o euro update) +ibm-1251_P100-1995 { UTR22* } ibm-1251 { IBM* } windows-1251 # Old Windows Cyrillic (w/o euro update) +ibm-1252_P100-2000 { UTR22* } ibm-1252 { IBM* } windows-1252 # Old Windows Latin 1 without Euro +ibm-1253_P100-1995 { UTR22* } ibm-1253 { IBM* } windows-1253 # Old Windows Greek (w/o euro update) +ibm-1254_P100-1995 { UTR22* } ibm-1254 { IBM* } windows-1254 # Old Windows Turkish (w/o euro update) +ibm-1255_P100-1995 { UTR22* } ibm-1255 { IBM* } # Very old Windows Hebrew (w/o euro update) +ibm-5351_P100-1998 { UTR22* } ibm-5351 { IBM* } windows-1255 # Old Windows Hebrew (w/ euro update) +ibm-1256_P110-1997 { UTR22* } ibm-1256 { IBM* } # Old Windows Arabic (w/o euro update) +ibm-5352_P100-1998 { UTR22* } ibm-5352 { IBM* } windows-1256 # Somewhat old Windows Arabic (w/ euro update) +ibm-1257_P100-1995 { UTR22* } ibm-1257 { IBM* } # Old Windows Baltic (w/o euro update) +ibm-5353_P100-1998 { UTR22* } ibm-5353 { IBM* } windows-1257 # Somewhat old Windows Baltic (w/ euro update) +ibm-1258_P100-1997 { UTR22* } ibm-1258 { IBM* } windows-1258 # Old Windows Vietnamese (w/o euro update) + +macos-0_2-10.2 { UTR22* } macintosh { IANA* MIME* WINDOWS } mac { IANA } csMacintosh { IANA } windows-10000 { WINDOWS* } # Apple latin 1 +macos-6-10.2 { UTR22* } x-mac-greek { MIME* WINDOWS } windows-10006 { WINDOWS* } macgr # Apple Greek +macos-7_3-10.2 { UTR22* } x-mac-cyrillic { MIME* WINDOWS } windows-10007 { WINDOWS* } maccy # Apple Cyrillic +macos-29-10.2 { UTR22* } x-mac-centraleurroman { MIME* } windows-10029 { WINDOWS* } x-mac-ce { WINDOWS } macce # Apple Central Europe +macos-35-10.2 { UTR22* } x-mac-turkish { MIME* WINDOWS } windows-10081 { WINDOWS* } mactr # Apple Turkish ibm-1051_P100-1995 { UTR22* } ibm-1051 { IBM* } hp-roman8 { IANA* } roman8 { IANA } r8 { IANA } csHPRoman8 { IANA } # HP Latin1 ibm-1276_P100-1995 { UTR22* } ibm-1276 { IBM* } Adobe-Standard-Encoding { IANA* } csAdobeStandardEncoding { IANA } # Different from ISO-Unicode-IBM-1276 (GCSGID: 1276) @@ -628,6 +689,53 @@ ibm-1133_P100-1997 { UTR22* } ibm-1133 { IBM* } ibm-1381_P110-1999 { UTR22* } ibm-1381 { IBM* JAVA } cp1381 { JAVA* } 1381 { JAVA } # S-Ch PC Data mixed (IBM GB) +# Partially algorithmic converters + +# [U_ENABLE_GENERIC_ISO_2022] +# The _generic_ ISO-2022 converter is disabled starting 2003-dec-03 (ICU 2.8). +# For details see the icu mailing list from 2003-dec-01 and the ucnv2022.c file. +# Language-specific variants of ISO-2022 continue to be available as listed below. +# ISO_2022 ISO-2022 { MIME* } 2022 cp2022 + +ISO_2022,locale=ja,version=0 ISO-2022-JP { IANA* MIME* JAVA* } csISO2022JP { JAVA } +ISO_2022,locale=ja,version=1 ISO-2022-JP-1 JIS JIS_Encoding { IANA* } +ISO_2022,locale=ja,version=2 ISO-2022-JP-2 { IANA* MIME* } csISO2022JP2 +ISO_2022,locale=ja,version=3 JIS7 csJISEncoding +ISO_2022,locale=ja,version=4 JIS8 +ISO_2022,locale=ko,version=0 ISO-2022-KR { IANA* MIME* } csISO2022KR # This uses ibm-949 +ISO_2022,locale=ko,version=1 ibm-25546 +ISO_2022,locale=zh,version=0 ISO-2022-CN { IANA* MIME* } # csISO2022CN +ISO_2022,locale=zh,version=1 ISO-2022-CN-EXT { IANA* MIME* } +HZ HZ-GB-2312 { IANA* MIME* } + +# Part of iso-2022 +ibm-897_P100-1995 { UTR22* } ibm-897 { IBM* } JIS_X0201 { IANA* } X0201 { IANA } csHalfWidthKatakana { IANA } + + +ISCII,version=0 x-iscii-de { WINDOWS } windows-57002 { WINDOWS* } iscii-dev +ISCII,version=1 x-iscii-be { WINDOWS } windows-57003 { WINDOWS* } iscii-bng windows-57006 { WINDOWS } x-iscii-as { WINDOWS } # be is different from as on Windows. +ISCII,version=2 x-iscii-pa { WINDOWS } windows-57011 { WINDOWS* } iscii-gur +ISCII,version=3 x-iscii-gu { WINDOWS } windows-57010 { WINDOWS* } iscii-guj +ISCII,version=4 x-iscii-or { WINDOWS } windows-57007 { WINDOWS* } iscii-ori +ISCII,version=5 x-iscii-ta { WINDOWS } windows-57004 { WINDOWS* } iscii-tml +ISCII,version=6 x-iscii-te { WINDOWS } windows-57005 { WINDOWS* } iscii-tlg +ISCII,version=7 x-iscii-ka { WINDOWS } windows-57008 { WINDOWS* } iscii-knd +ISCII,version=8 x-iscii-ma { WINDOWS } windows-57009 { WINDOWS* } iscii-mlm + +# Lotus specific +LMBCS-1 lmbcs +LMBCS-2 +LMBCS-3 +LMBCS-4 +LMBCS-5 +LMBCS-6 +LMBCS-8 +LMBCS-11 +LMBCS-16 +LMBCS-17 +LMBCS-18 +LMBCS-19 + # EBCDIC codepages according to the CDRA # without Euro @@ -680,7 +788,7 @@ ibm-939_P120-1999 { UTR22* } # EBCDIC_STATEFUL Latin-Kanji Host Mixed. ibm-1025_P100-1995 { UTR22* } ibm-1025 { IBM* JAVA } cp1025 { JAVA* } 1025 { JAVA } # EBCDIC Cyrillic ibm-1026_P100-1995 { UTR22* } ibm-1026 { IBM* JAVA } IBM1026 { IANA* } CP1026 { IANA JAVA* } csIBM1026 { IANA } 1026 { JAVA } # EBCDIC Turkey ibm-1047_P100-1995 { UTR22* } ibm-1047 { IBM* } IBM1047 { IANA* } cpibm1047 # EBCDIC Open systems Latin1 -ibm-1097_P100-1995 { UTR22* } ibm-1097 { IBM* JAVA } cp1097 { JAVA* } 1097 { JAVA } ibm-1097_VPUA # EBCDIC Farsi +ibm-1097_P100-1995 { UTR22* } ibm-1097 { IBM* JAVA } cp1097 { JAVA* } 1097 { JAVA } # EBCDIC Farsi ibm-1112_P100-1995 { UTR22* } ibm-1112 { IBM* JAVA } cp1112 { JAVA* } 1112 { JAVA } # EBCDIC Baltic ibm-1122_P100-1999 { UTR22* } ibm-1122 { IBM* JAVA } cp1122 { JAVA* } 1122 { JAVA } # EBCDIC Estonia ibm-1123_P100-1995 { UTR22* } ibm-1123 { IBM* JAVA } cp1123 { JAVA* } 1123 { JAVA } cpibm1123 # EBCDIC Cyrillic Ukraine @@ -709,8 +817,9 @@ ibm-1164_P100-1999 { UTR22* } ibm-1164 { IBM* } cpibm1164 # EBCDIC ibm-1364_P110-1997 { UTR22* } ibm-1364 { IBM* } cp1364 # Korean Host Mixed ibm-1371_P100-1999 { UTR22* } ibm-1371 { IBM* } cpibm1371 # Taiwan EBCDIC MIXED ibm-1388_P103-2001 { UTR22* } ibm-1388 { IBM* } ibm-9580 { IBM } # S-Ch DBCS-Host Data GBK EBCDIC_STATEFUL. Yes ibm-9580 is an alias. -ibm-1390_P100-1999 { UTR22* } ibm-1390 { IBM* } cpibm1390 # Japan EBCDIC MIXED -ibm-1399_P100-1999 { UTR22* } ibm-1399 { IBM* } # Host MBCS (Latin-Kanji) +ibm-1390_P110-2003 { UTR22* } ibm-1390 { IBM* } cpibm1390 # Japan EBCDIC MIXED (JIS X 0213) +ibm-1399_P110-2003 { UTR22* } ibm-1399 { IBM* } # Host MBCS (Latin-Kanji) (JIS X 0213) +ibm-16684_P110-2003 { UTR22* } ibm-16684 { IBM* } # DBCS Jis + Roman Jis Host. This is the DBCS portion of ibm-1390 and ibm-1399 (JIS X 0213) ibm-4899_P100-1998 { UTR22* } ibm-4899 { IBM* } cpibm4899 # Old EBCDIC Hebrew ibm-4971_P100-1999 { UTR22* } ibm-4971 { IBM* } cpibm4971 # EBCDIC Greek ibm-12712_P100-1998 { UTR22* } ibm-12712 { IBM* } cpibm12712 ebcdic-he # EBCDIC Hebrew (new sheqel, control charaters update) @@ -720,8 +829,7 @@ ibm-16804_X110-1999 { UTR22* } ibm-16804 { IBM* } cpibm16804 ebcdic-ar # EBCDIC # TODO: Consider removing the mappings in this section ibm-1137_P100-1999 { UTR22* } ibm-1137 { IBM* } # Devanagari EBCDIC (based on Unicode character set) ibm-5123_P100-1999 { UTR22* } ibm-5123 { IBM* } # Host Roman Jis. Euro update of ibm-1027 -ibm-8482 { IBM* } # host SBCS (Katakana). Euro update of ibm-290 -ibm-16684_P100-1999 { UTR22* } ibm-16684 { IBM* } # DBCS Jis + Roman Jis Host. This is the DBCS portion of ibm-1390 and ibm-1399 +ibm-8482_P100-1999 { UTR22* } ibm-8482 { IBM* } # host SBCS (Katakana). Euro update of ibm-290 # EBCDIC codepages for S/390, with LF and NL codes swapped @@ -734,7 +842,24 @@ ibm-16684_P100-1999 { UTR22* } ibm-16684 { IBM* } # DBCS Jis + Roman Jis Host. # This avoids the duplication of all EBCDIC SBCS and mixed-SBCS/DBCS # mapping files. -# Some examples +# Some examples below for declaring old-style, obsolete aliases with the "-s390" +# suffix to map to the new-style, recommended names with the option added. +# These are listed here for backward compatibility. +# Do not use these; instead use the normal converter name with the option +# added as recommended above. + +# Note: It is not possible to define an alias (non-initial name in a line here) +# that itself contains a converter option like this one for swapping LF<->NL. +# Such names would never be found because ucnv_open() will first parse and strip +# options before looking up a name in this table. +# ucnv_open() then parses the lookup result (the canonical name on the left +# in lines here) as well. + +# This also means that it is not necessary to add anything to convrtrs.txt +# for converter names like "ibm-1026,swaplfnl" to work - +# they are already covered by the normal option parsing together with the +# regular, option-less alias elsewhere in this file. + ibm-37_P100-1995,swaplfnl ibm-37-s390 ibm037-s390 ibm-1047_P100-1995,swaplfnl ibm-1047-s390 ibm-1140_P100-1997,swaplfnl ibm-1140-s390 @@ -779,3 +904,4 @@ ebcdic-xml-us #ibm-1159_P100-1999 { UTR22* } ibm-1159 { IBM* } # SBCS T-Ch Host. Euro update of ibm-28709. This is used in combination with another CCSID mapping. #ibm-9027_P100-1999 { UTR22* } ibm-9027 { IBM* } # DBCS T-Ch Host. Euro update of ibm-835. DBCS portion of ibm-1371. + diff --git a/icuSources/data/mappings/ibm-1168_P100-2002.ucm b/icuSources/data/mappings/ibm-1168_P100-2002.ucm new file mode 100644 index 00000000..9ed27763 --- /dev/null +++ b/icuSources/data/mappings/ibm-1168_P100-2002.ucm @@ -0,0 +1,372 @@ +# *************************************************************************** +# * +# * Copyright (C) 1995-2003, International Business Machines +# * Corporation and others. All Rights Reserved. +# * +# *************************************************************************** +# +# File created by rptp2ucm (compiled on Jan 14 2004) +# from source files 44B00490.RPMAP100 and 049044B0.TPMAP100 +# + "ibm-1168_P100-2002" + "AXXXX" + 1 + 1 + "SBCS" + "ASCII" + "ibm-1168_STD" + +CHARMAP + \x00 |0 + \x01 |0 + \x02 |0 + \x03 |0 + \x04 |0 + \x05 |0 + \x06 |0 + \x07 |0 + \x08 |0 + \x09 |0 + \x0A |0 + \x0B |0 + \x0C |0 + \x0D |0 + \x0E |0 + \x0F |0 + \x10 |0 + \x11 |0 + \x12 |0 + \x13 |0 + \x14 |0 + \x15 |0 + \x16 |0 + \x17 |0 + \x18 |0 + \x19 |0 + \x1A |0 + \x1B |0 + \x1C |0 + \x1D |0 + \x1E |0 + \x1F |0 + \x20 |0 + \x21 |0 + \x22 |0 + \x23 |0 + \x24 |0 + \x25 |0 + \x26 |0 + \x27 |0 + \x28 |0 + \x29 |0 + \x2A |0 + \x2B |0 + \x2C |0 + \x2D |0 + \x2E |0 + \x2F |0 + \x30 |0 + \x31 |0 + \x32 |0 + \x33 |0 + \x34 |0 + \x35 |0 + \x36 |0 + \x37 |0 + \x38 |0 + \x39 |0 + \x3A |0 + \x3B |0 + \x3C |0 + \x3D |0 + \x3E |0 + \x3F |0 + \x40 |0 + \x41 |0 + \x42 |0 + \x43 |0 + \x44 |0 + \x45 |0 + \x46 |0 + \x47 |0 + \x48 |0 + \x49 |0 + \x4A |0 + \x4B |0 + \x4C |0 + \x4D |0 + \x4E |0 + \x4F |0 + \x50 |0 + \x51 |0 + \x52 |0 + \x53 |0 + \x54 |0 + \x55 |0 + \x56 |0 + \x57 |0 + \x58 |0 + \x59 |0 + \x5A |0 + \x5B |0 + \x5C |0 + \x5D |0 + \x5E |0 + \x5F |0 + \x60 |0 + \x61 |0 + \x62 |0 + \x63 |0 + \x64 |0 + \x65 |0 + \x66 |0 + \x67 |0 + \x68 |0 + \x69 |0 + \x6A |0 + \x6B |0 + \x6C |0 + \x6D |0 + \x6E |0 + \x6F |0 + \x70 |0 + \x71 |0 + \x72 |0 + \x73 |0 + \x74 |0 + \x75 |0 + \x76 |0 + \x77 |0 + \x78 |0 + \x79 |0 + \x7A |0 + \x7B |0 + \x7C |0 + \x7D |0 + \x7E |0 + \x7F |0 + \x9A |0 + \xBF |0 + \x9C |0 + \x9D |0 + \x9E |0 + \x9F |0 + \xB3 |0 + \xB4 |0 + \xB6 |0 + \xB7 |0 + \xE1 |0 + \xE2 |0 + \xF7 |0 + \xE7 |0 + \xE4 |0 + \xE5 |0 + \xF6 |0 + \xFA |0 + \xE9 |0 + \xEA |0 + \xEB |0 + \xEC |0 + \xED |0 + \xEE |0 + \xEF |0 + \xF0 |0 + \xF2 |0 + \xF3 |0 + \xF4 |0 + \xF5 |0 + \xE6 |0 + \xE8 |0 + \xE3 |0 + \xFE |0 + \xFB |0 + \xFD |0 + \xFF |0 + \xF9 |0 + \xF8 |0 + \xFC |0 + \xE0 |0 + \xF1 |0 + \xC1 |0 + \xC2 |0 + \xD7 |0 + \xC7 |0 + \xC4 |0 + \xC5 |0 + \xD6 |0 + \xDA |0 + \xC9 |0 + \xCA |0 + \xCB |0 + \xCC |0 + \xCD |0 + \xCE |0 + \xCF |0 + \xD0 |0 + \xD2 |0 + \xD3 |0 + \xD4 |0 + \xD5 |0 + \xC6 |0 + \xC8 |0 + \xC3 |0 + \xDE |0 + \xDB |0 + \xDD |0 + \xDF |0 + \xD9 |0 + \xD8 |0 + \xDC |0 + \xC0 |0 + \xD1 |0 + \xA3 |0 + \xA4 |0 + \xA6 |0 + \xA7 |0 + \xBD |0 + \xAD |0 + \x95 |0 + \x96 |0 + \x97 |0 + \x98 |0 + \x99 |0 + \x93 |0 + \x9B |0 + \x80 |0 + \x81 |0 + \x82 |0 + \x83 |0 + \x84 |0 + \x85 |0 + \x86 |0 + \x87 |0 + \x88 |0 + \x89 |0 + \x8A |0 + \xA0 |0 + \xA1 |0 + \xA2 |0 + \xA5 |0 + \xA8 |0 + \xA9 |0 + \xAA |0 + \xAB |0 + \xAC |0 + \xAE |0 + \xAF |0 + \xB0 |0 + \xB1 |0 + \xB2 |0 + \xB5 |0 + \xB8 |0 + \xB9 |0 + \xBA |0 + \xBB |0 + \xBC |0 + \xBE |0 + \x8B |0 + \x8C |0 + \x8D |0 + \x8E |0 + \x8F |0 + \x90 |0 + \x91 |0 + \x92 |0 + \x94 |0 + \x21 |1 + \x22 |1 + \x23 |1 + \x24 |1 + \x25 |1 + \x26 |1 + \x27 |1 + \x28 |1 + \x29 |1 + \x2A |1 + \x2B |1 + \x2C |1 + \x2D |1 + \x2E |1 + \x2F |1 + \x30 |1 + \x31 |1 + \x32 |1 + \x33 |1 + \x34 |1 + \x35 |1 + \x36 |1 + \x37 |1 + \x38 |1 + \x39 |1 + \x3A |1 + \x3B |1 + \x3C |1 + \x3D |1 + \x3E |1 + \x3F |1 + \x40 |1 + \x41 |1 + \x42 |1 + \x43 |1 + \x44 |1 + \x45 |1 + \x46 |1 + \x47 |1 + \x48 |1 + \x49 |1 + \x4A |1 + \x4B |1 + \x4C |1 + \x4D |1 + \x4E |1 + \x4F |1 + \x50 |1 + \x51 |1 + \x52 |1 + \x53 |1 + \x54 |1 + \x55 |1 + \x56 |1 + \x57 |1 + \x58 |1 + \x59 |1 + \x5A |1 + \x5B |1 + \x5C |1 + \x5D |1 + \x5E |1 + \x5F |1 + \x60 |1 + \x61 |1 + \x62 |1 + \x63 |1 + \x64 |1 + \x65 |1 + \x66 |1 + \x67 |1 + \x68 |1 + \x69 |1 + \x6A |1 + \x6B |1 + \x6C |1 + \x6D |1 + \x6E |1 + \x6F |1 + \x70 |1 + \x71 |1 + \x72 |1 + \x73 |1 + \x74 |1 + \x75 |1 + \x76 |1 + \x77 |1 + \x78 |1 + \x79 |1 + \x7A |1 + \x7B |1 + \x7C |1 + \x7D |1 + \x7E |1 + \x81 |1 + \x94 |1 +END CHARMAP diff --git a/icuSources/data/mappings/ibm-1363_P110-1997.ucm b/icuSources/data/mappings/ibm-1363_P110-1997.ucm index f9f34e40..0f55a2b3 100644 --- a/icuSources/data/mappings/ibm-1363_P110-1997.ucm +++ b/icuSources/data/mappings/ibm-1363_P110-1997.ucm @@ -21,6 +21,10 @@ 0-7f, 81-fe:1 40-7e, 80-fe +# build an extension-only (delta) .cnv file +# requires the base .cnv file at runtime + "ibm-1363_P11B-1998" + CHARMAP \x00 |0 \x01 |0 diff --git a/icuSources/data/mappings/ibm-1363_P11B-1998.ucm b/icuSources/data/mappings/ibm-1363_P11B-1998.ucm index 7a602918..b70c466e 100644 --- a/icuSources/data/mappings/ibm-1363_P11B-1998.ucm +++ b/icuSources/data/mappings/ibm-1363_P11B-1998.ucm @@ -18,7 +18,8 @@ "ASCII" "ibm-1363_VSUB_VPUA" - 0-7f, 81-fe:1 +# declare 80 and ff legal because of windows-949 + 0-80, 81-fe:1, ff 40-7e, 80-fe CHARMAP @@ -48,9 +49,7 @@ CHARMAP \x17 |0 \x18 |0 \x19 |0 - \x7F |0 \x1B |0 - \x1A |0 \x1D |0 \x1E |0 \x1F |0 @@ -114,7 +113,6 @@ CHARMAP \x59 |0 \x5A |0 \x5B |0 - \x5C |0 \x5D |0 \x5E |0 \x5F |0 @@ -149,135 +147,36 @@ CHARMAP \x7C |0 \x7D |0 \x7E |0 - \x1C |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \xA2\xAE |0 - \x7F |2 - \x7F |2 \xA2\xB4 |0 - \x7F |2 - \x7F |2 \xA1\xD7 |0 \xA1\xA7 |0 - \x7F |2 \xA8\xA3 |0 - \x7F |2 - \x7F |2 - \xA1\xA9 |1 \xA2\xE7 |0 - \x7F |2 \xA1\xC6 |0 \xA1\xBE |0 \xA9\xF7 |0 \xA9\xF8 |0 \xA2\xA5 |0 - \x7F |2 \xA2\xD2 |0 - \xA1\xA4 |1 \xA2\xAC |0 \xA9\xF6 |0 \xA8\xAC |0 - \x7F |2 \xA8\xF9 |0 \xA8\xF6 |0 \xA8\xFA |0 \xA2\xAF |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \xA8\xA1 |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \xA8\xA2 |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \xA1\xBF |0 \xA8\xAA |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \xA8\xAD |0 \xA9\xAC |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \xA9\xA1 |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \xA9\xA3 |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \xA1\xC0 |0 \xA9\xAA |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \xA9\xAD |0 - \x7F |2 \xA9\xA2 |0 \xA8\xA4 |0 \xA9\xA4 |0 @@ -302,7 +201,6 @@ CHARMAP \xA2\xAB |0 \xA2\xAA |0 \xA2\xAD |0 - \xA2\xA6 |0 \xA2\xA9 |0 \xA5\xC1 |0 \xA5\xC2 |0 @@ -418,9 +316,6 @@ CHARMAP \xAC\xF0 |0 \xAC\xF1 |0 \xAC\xD7 |0 - \xA1\xA9 |0 - \xA1\xAA |0 - \xA1\xAA |1 \xA1\xAE |0 \xA1\xAF |0 \xA1\xB0 |0 @@ -433,14 +328,12 @@ CHARMAP \xA1\xC7 |0 \xA1\xC8 |0 \xA1\xD8 |0 - \x7F |2 \xA9\xF9 |0 \xA9\xFA |0 \xA9\xFB |0 \xA9\xFC |0 \xA9\xFD |0 \xA9\xFE |0 - \x5C |1 \xA2\xE6 |0 \xA1\xC9 |0 \xA2\xB5 |0 @@ -510,7 +403,6 @@ CHARMAP \xA2\xB1 |0 \xA1\xC5 |0 \xA1\xF1 |0 - \xA1\xAD |1 \xA1\xEF |0 \xA1\xD6 |0 \xA1\xC1 |0 @@ -523,7 +415,6 @@ CHARMAP \xA1\xF9 |0 \xA1\xF6 |0 \xA1\xF7 |0 - \xA2\xC1 |1 \xA1\xD1 |0 \xA1\xD2 |0 \xA8\xE7 |0 @@ -697,7 +588,6 @@ CHARMAP \xA1\xDF |0 \xA1\xDE |0 \xA2\xC2 |0 - \xA2\xC1 |0 \xA1\xDB |0 \xA1\xDD |0 \xA1\xDC |0 @@ -739,7 +629,6 @@ CHARMAP \xA1\xEB |0 \xA1\xB2 |0 \xA1\xB3 |0 - \xA1\xAD |0 \xAA\xA1 |0 \xAA\xA2 |0 \xAA\xA3 |0 @@ -909,7 +798,6 @@ CHARMAP \xAB\xF4 |0 \xAB\xF5 |0 \xAB\xF6 |0 - \xA1\xA4 |0 \xA4\xA1 |0 \xA4\xA2 |0 \xA4\xA3 |0 @@ -17483,6 +17371,128 @@ CHARMAP \xA3\xFB |0 \xA3\xFC |0 \xA3\xFD |0 + \xA1\xCB |0 + \xA1\xCC |0 + \xA1\xFE |0 + \xA3\xFE |0 + \xA1\xCD |0 + \xA3\xDC |0 +END CHARMAP + +CHARMAP + \x7F |0 + \x1A |0 + \x5C |0 + \x1C |0 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \xA1\xA9 |1 + \x7F |2 + \x7F |2 + \xA1\xA4 |1 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \xA2\xA6 |0 + \xA1\xA9 |0 + \xA1\xAA |0 + \xA1\xAA |1 + \x7F |2 + \x5C |1 + \xA1\xAD |1 + \xA2\xC1 |1 + \xA2\xC1 |0 + \xA1\xAD |0 + \xA1\xA4 |0 \xA2\xA6 |1 \x7F |2 \x7F |2 @@ -17536,10 +17546,4 @@ CHARMAP \x7F |2 \x7F |2 \x7F |2 - \xA1\xCB |0 - \xA1\xCC |0 - \xA1\xFE |0 - \xA3\xFE |0 - \xA1\xCD |0 - \xA3\xDC |0 END CHARMAP diff --git a/icuSources/data/mappings/ibm-1371_P100-1999.ucm b/icuSources/data/mappings/ibm-1371_P100-1999.ucm index 638df0d2..e2479941 100644 --- a/icuSources/data/mappings/ibm-1371_P100-1999.ucm +++ b/icuSources/data/mappings/ibm-1371_P100-1999.ucm @@ -1,6 +1,6 @@ # *************************************************************************** # * -# * Copyright (C) 1995-2002, International Business Machines +# * Copyright (C) 1995-2003, International Business Machines # * Corporation and others. All Rights Reserved. # * # *************************************************************************** @@ -33,8 +33,6 @@ CHARMAP \x0B |0 \x0C |0 \x0D |0 - \x3F |2 - \x3F |2 \x10 |0 \x11 |0 \x12 |0 @@ -179,102 +177,19 @@ CHARMAP \x14 |0 \x3E |0 \xFF |0 - \x3F |2 - \x3F |2 \x4A |0 - \x3F |2 - \x3F |2 - \x3F |2 \x6A |0 \x44\x6A |0 \x44\x60 |0 - \x3F |2 - \x3F |2 - \x3F |2 \x5F |0 - \x3F |2 - \x3F |2 \x42\xA1 |1 \x44\xED |0 \x44\x4B |0 - \x3F |2 - \x3F |2 \x44\xEE |0 - \x3F |2 \x43\x79 |0 \x46\xE5 |0 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 \x44\x7A |0 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 \x44\x7B |0 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 \x44\x5B |0 \x45\x53 |0 \x45\x51 |0 @@ -414,8 +329,6 @@ CHARMAP \x42\x79 |0 \x44\x6B |0 \x42\xA1 |0 - \x9F |0 - \x47\xA2 |3 \x44\x4E |0 \x46\xBB |0 \x46\xDB |0 @@ -20537,3 +20450,93 @@ CHARMAP \x42\x6A |0 \x42\x5B |0 END CHARMAP + +CHARMAP + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x9F |0 + \x47\xA2 |3 +END CHARMAP diff --git a/icuSources/data/mappings/ibm-1373_P100-2002.ucm b/icuSources/data/mappings/ibm-1373_P100-2002.ucm index 00ea1c31..250fc215 100644 --- a/icuSources/data/mappings/ibm-1373_P100-2002.ucm +++ b/icuSources/data/mappings/ibm-1373_P100-2002.ucm @@ -18,7 +18,8 @@ "ASCII" "ibm-1373_VSUB_VPUA" - 0-7f, 81-fe:1 +# declare 80 and ff legal because of windows-950 + 0-80, 81-fe:1, ff 40-7e, 80-fe CHARMAP @@ -48,9 +49,7 @@ CHARMAP \x17 |0 \x18 |0 \x19 |0 - \x7F |0 \x1B |0 - \x1A |0 \x1D |0 \x1E |0 \x1F |0 @@ -149,9 +148,7 @@ CHARMAP \x7C |0 \x7D |0 \x7E |0 - \x1C |0 \xA1\xB1 |0 - \xA1\xC2 |0 \xA2\x58 |0 \xA1\xD3 |0 \xA1\x50 |0 @@ -211,8 +208,6 @@ CHARMAP \xA3\x71 |0 \xA3\x72 |0 \xA3\x73 |0 - \xA1\x56 |0 - \xA1\x58 |0 \xA1\xA5 |0 \xA1\xA6 |0 \xA1\xA7 |0 @@ -223,7 +218,6 @@ CHARMAP \xA1\xAC |0 \xA1\xAB |0 \xA1\xB0 |0 - \xA3\xE1 |0 \xA2\x4A |0 \xA1\xC1 |0 \xA2\x4B |0 @@ -250,7 +244,6 @@ CHARMAP \xA1\xDB |0 \xA1\xE8 |0 \xA1\xE7 |0 - \xA1\xFD |0 \xA1\xFC |0 \xA1\xE4 |0 \xA1\xE5 |0 @@ -278,47 +271,10 @@ CHARMAP \xA2\x73 |0 \xA2\x72 |0 \xA2\x71 |0 - \xA2\xA4 |0 - \xF9\xF9 |3 - \xF9\xF8 |0 - \xF9\xE6 |0 - \xF9\xEF |0 - \xF9\xDD |0 - \xF9\xE8 |0 - \xF9\xF1 |0 - \xF9\xDF |0 - \xF9\xEC |0 - \xF9\xF5 |0 - \xF9\xE3 |0 - \xF9\xEE |0 - \xF9\xF7 |0 - \xF9\xE5 |0 - \xA2\xA5 |0 - \xF9\xE9 |3 - \xF9\xF2 |0 - \xF9\xE0 |0 - \xA2\xA7 |0 - \xF9\xEB |3 - \xF9\xF4 |0 - \xF9\xE2 |0 - \xF9\xE7 |0 - \xF9\xF0 |0 - \xF9\xDE |0 - \xF9\xED |0 - \xF9\xF6 |0 - \xF9\xE4 |0 - \xA2\xA6 |0 - \xF9\xEA |3 - \xF9\xF3 |0 - \xF9\xE1 |0 \xA2\x7E |0 - \xF9\xFA |3 \xA2\xA1 |0 - \xF9\xFB |3 \xA2\xA3 |0 - \xF9\xFD |3 \xA2\xA2 |0 - \xF9\xFC |3 \xA2\xAC |0 \xA2\xAD |0 \xA2\xAE |0 @@ -338,7 +294,6 @@ CHARMAP \xA2\x6C |0 \xA2\x6B |0 \xA2\x6A |0 - \xF9\xFE |0 \xA2\x76 |0 \xA2\x79 |0 \xA1\xBD |0 @@ -2078,7 +2033,6 @@ CHARMAP \xE5\x4C |0 \xBC\x58 |0 \xE9\x4D |0 - \xF9\xD9 |0 \xE9\x4F |0 \xE9\x4A |0 \xBE\xC1 |0 @@ -2447,7 +2401,6 @@ CHARMAP \xE5\x57 |0 \xE5\x5A |0 \xE5\x5C |0 - \xF9\xDC |0 \xBC\x5F |0 \xE5\x56 |0 \xE5\x54 |0 @@ -3148,7 +3101,6 @@ CHARMAP \xB1\x6B |0 \xD8\xF4 |0 \xB7\x4A |0 - \xC2\x55 |0 \xA7\xCE |0 \xA7\xCD |0 \xAB\xDB |0 @@ -3310,7 +3262,6 @@ CHARMAP \xCE\xC9 |0 \xAB\xE9 |0 \xAE\xA3 |0 - \xF9\xDA |0 \xCE\xC5 |0 \xCE\xC1 |0 \xAE\xA4 |0 @@ -7423,7 +7374,6 @@ CHARMAP \xE2\xF0 |0 \xB8\x51 |0 \xDE\xF0 |0 - \xF9\xD6 |0 \xDE\xED |0 \xDE\xE8 |0 \xDE\xEA |0 @@ -8084,7 +8034,6 @@ CHARMAP \xDA\xE7 |0 \xD6\xE1 |0 \xB5\xB0 |0 - \xF9\xDB |0 \xDA\xE9 |0 \xDF\x56 |0 \xB8\x64 |0 @@ -10151,7 +10100,6 @@ CHARMAP \xDF\xF8 |0 \xDF\xF3 |0 \xDF\xF4 |0 - \xF9\xD8 |0 \xDF\xF9 |0 \xB8\xCF |0 \xB8\xC7 |0 @@ -11750,7 +11698,6 @@ CHARMAP \xE8\xA1 |0 \xE8\x67 |0 \xBE\x50 |0 - \xF9\xD7 |0 \xBE\x4F |0 \xBE\x56 |0 \xE8\x65 |0 @@ -19316,6 +19263,206 @@ CHARMAP \x8D\xFC |0 \x8D\xFD |0 \x8D\xFE |0 + \xC9\x4A |0 + \xDD\xFC |0 + \xA1\x4A |0 + \xA1\x59 |0 + \xA1\x5B |0 + \xA1\x5F |0 + \xA1\x60 |0 + \xA1\x63 |0 + \xA1\x64 |0 + \xA1\x67 |0 + \xA1\x68 |0 + \xA1\x6B |0 + \xA1\x6C |0 + \xA1\x6F |0 + \xA1\x70 |0 + \xA1\x73 |0 + \xA1\x74 |0 + \xA1\x77 |0 + \xA1\x78 |0 + \xA1\x7B |0 + \xA1\x7C |0 + \xA1\xC6 |0 + \xA1\xC7 |0 + \xA1\xCA |0 + \xA1\xCB |0 + \xA1\xC8 |0 + \xA1\xC9 |0 + \xA1\x5C |0 + \xA1\x4D |0 + \xA1\x4E |0 + \xA1\x4F |0 + \xA1\x51 |0 + \xA1\x52 |0 + \xA1\x53 |0 + \xA1\x54 |0 + \xA1\x7D |0 + \xA1\x7E |0 + \xA1\xA1 |0 + \xA1\xA2 |0 + \xA1\xA3 |0 + \xA1\xA4 |0 + \xA1\xCC |0 + \xA1\xCD |0 + \xA1\xCE |0 + \xA1\xDE |0 + \xA1\xDF |0 + \xA1\xE0 |0 + \xA1\xE1 |0 + \xA1\xE2 |0 + \xA2\x42 |0 + \xA2\x4C |0 + \xA2\x4D |0 + \xA2\x4E |0 + \xA1\x49 |0 + \xA1\xAD |0 + \xA2\x43 |0 + \xA2\x48 |0 + \xA1\xAE |0 + \xA1\x5D |0 + \xA1\x5E |0 + \xA1\xAF |0 + \xA1\xCF |0 + \xA1\x41 |0 + \xA1\xD0 |0 + \xA1\x44 |0 + \xA1\xFE |0 + \xA2\xAF |0 + \xA2\xB0 |0 + \xA2\xB1 |0 + \xA2\xB2 |0 + \xA2\xB3 |0 + \xA2\xB4 |0 + \xA2\xB5 |0 + \xA2\xB6 |0 + \xA2\xB7 |0 + \xA2\xB8 |0 + \xA1\x47 |0 + \xA1\x46 |0 + \xA1\xD5 |0 + \xA1\xD7 |0 + \xA1\xD6 |0 + \xA1\x48 |0 + \xA2\x49 |0 + \xA2\xCF |0 + \xA2\xD0 |0 + \xA2\xD1 |0 + \xA2\xD2 |0 + \xA2\xD3 |0 + \xA2\xD4 |0 + \xA2\xD5 |0 + \xA2\xD6 |0 + \xA2\xD7 |0 + \xA2\xD8 |0 + \xA2\xD9 |0 + \xA2\xDA |0 + \xA2\xDB |0 + \xA2\xDC |0 + \xA2\xDD |0 + \xA2\xDE |0 + \xA2\xDF |0 + \xA2\xE0 |0 + \xA2\xE1 |0 + \xA2\xE2 |0 + \xA2\xE3 |0 + \xA2\xE4 |0 + \xA2\xE5 |0 + \xA2\xE6 |0 + \xA2\xE7 |0 + \xA2\xE8 |0 + \xA2\x40 |0 + \xA1\xC4 |0 + \xA2\xE9 |0 + \xA2\xEA |0 + \xA2\xEB |0 + \xA2\xEC |0 + \xA2\xED |0 + \xA2\xEE |0 + \xA2\xEF |0 + \xA2\xF0 |0 + \xA2\xF1 |0 + \xA2\xF2 |0 + \xA2\xF3 |0 + \xA2\xF4 |0 + \xA2\xF5 |0 + \xA2\xF6 |0 + \xA2\xF7 |0 + \xA2\xF8 |0 + \xA2\xF9 |0 + \xA2\xFA |0 + \xA2\xFB |0 + \xA2\xFC |0 + \xA2\xFD |0 + \xA2\xFE |0 + \xA3\x40 |0 + \xA3\x41 |0 + \xA3\x42 |0 + \xA3\x43 |0 + \xA1\x61 |0 + \xA1\x62 |0 + \xA2\x46 |0 + \xA2\x47 |0 + \xA1\xC3 |0 + \xA2\x44 |0 +END CHARMAP + +CHARMAP + \x7F |0 + \x1A |0 + \x1C |0 + \xA1\xC2 |0 + \xA1\x56 |0 + \xA1\x58 |0 + \xA3\xE1 |0 + \xA1\xFD |0 + \xA2\xA4 |0 + \xF9\xF9 |3 + \xF9\xF8 |0 + \xF9\xE6 |0 + \xF9\xEF |0 + \xF9\xDD |0 + \xF9\xE8 |0 + \xF9\xF1 |0 + \xF9\xDF |0 + \xF9\xEC |0 + \xF9\xF5 |0 + \xF9\xE3 |0 + \xF9\xEE |0 + \xF9\xF7 |0 + \xF9\xE5 |0 + \xA2\xA5 |0 + \xF9\xE9 |3 + \xF9\xF2 |0 + \xF9\xE0 |0 + \xA2\xA7 |0 + \xF9\xEB |3 + \xF9\xF4 |0 + \xF9\xE2 |0 + \xF9\xE7 |0 + \xF9\xF0 |0 + \xF9\xDE |0 + \xF9\xED |0 + \xF9\xF6 |0 + \xF9\xE4 |0 + \xA2\xA6 |0 + \xF9\xEA |3 + \xF9\xF3 |0 + \xF9\xE1 |0 + \xF9\xFA |3 + \xF9\xFB |3 + \xF9\xFD |3 + \xF9\xFC |3 + \xF9\xFE |0 + \xF9\xD9 |0 + \xF9\xDC |0 + \xC2\x55 |0 + \xF9\xDA |0 + \xF9\xD6 |0 + \xF9\xDB |0 + \xF9\xD8 |0 + \xF9\xD7 |0 \xC6\xA1 |0 \xC6\xA2 |0 \xC6\xA3 |0 @@ -19724,150 +19871,7 @@ CHARMAP \xC8\xFC |0 \xC8\xFD |0 \xC8\xFE |0 - \xC9\x4A |0 - \xDD\xFC |0 - \xA1\x4A |0 \xA1\x57 |0 - \xA1\x59 |0 - \xA1\x5B |0 - \xA1\x5F |0 - \xA1\x60 |0 - \xA1\x63 |0 - \xA1\x64 |0 - \xA1\x67 |0 - \xA1\x68 |0 - \xA1\x6B |0 - \xA1\x6C |0 - \xA1\x6F |0 - \xA1\x70 |0 - \xA1\x73 |0 - \xA1\x74 |0 - \xA1\x77 |0 - \xA1\x78 |0 - \xA1\x7B |0 - \xA1\x7C |0 - \xA1\xC6 |0 - \xA1\xC7 |0 - \xA1\xCA |0 - \xA1\xCB |0 - \xA1\xC8 |0 - \xA1\xC9 |0 - \xA1\x5C |0 - \xA1\x4D |0 - \xA1\x4E |0 - \xA1\x4F |0 - \xA1\x51 |0 - \xA1\x52 |0 - \xA1\x53 |0 - \xA1\x54 |0 - \xA1\x7D |0 - \xA1\x7E |0 - \xA1\xA1 |0 - \xA1\xA2 |0 - \xA1\xA3 |0 - \xA1\xA4 |0 - \xA1\xCC |0 - \xA1\xCD |0 - \xA1\xCE |0 - \xA1\xDE |0 - \xA1\xDF |0 - \xA1\xE0 |0 - \xA1\xE1 |0 - \xA1\xE2 |0 - \xA2\x42 |0 - \xA2\x4C |0 - \xA2\x4D |0 - \xA2\x4E |0 - \xA1\x49 |0 - \xA1\xAD |0 - \xA2\x43 |0 - \xA2\x48 |0 - \xA1\xAE |0 - \xA1\x5D |0 - \xA1\x5E |0 - \xA1\xAF |0 - \xA1\xCF |0 - \xA1\x41 |0 - \xA1\xD0 |0 - \xA1\x44 |0 - \xA1\xFE |0 - \xA2\xAF |0 - \xA2\xB0 |0 - \xA2\xB1 |0 - \xA2\xB2 |0 - \xA2\xB3 |0 - \xA2\xB4 |0 - \xA2\xB5 |0 - \xA2\xB6 |0 - \xA2\xB7 |0 - \xA2\xB8 |0 - \xA1\x47 |0 - \xA1\x46 |0 - \xA1\xD5 |0 - \xA1\xD7 |0 - \xA1\xD6 |0 - \xA1\x48 |0 - \xA2\x49 |0 - \xA2\xCF |0 - \xA2\xD0 |0 - \xA2\xD1 |0 - \xA2\xD2 |0 - \xA2\xD3 |0 - \xA2\xD4 |0 - \xA2\xD5 |0 - \xA2\xD6 |0 - \xA2\xD7 |0 - \xA2\xD8 |0 - \xA2\xD9 |0 - \xA2\xDA |0 - \xA2\xDB |0 - \xA2\xDC |0 - \xA2\xDD |0 - \xA2\xDE |0 - \xA2\xDF |0 - \xA2\xE0 |0 - \xA2\xE1 |0 - \xA2\xE2 |0 - \xA2\xE3 |0 - \xA2\xE4 |0 - \xA2\xE5 |0 - \xA2\xE6 |0 - \xA2\xE7 |0 - \xA2\xE8 |0 - \xA2\x40 |0 - \xA1\xC4 |0 - \xA2\xE9 |0 - \xA2\xEA |0 - \xA2\xEB |0 - \xA2\xEC |0 - \xA2\xED |0 - \xA2\xEE |0 - \xA2\xEF |0 - \xA2\xF0 |0 - \xA2\xF1 |0 - \xA2\xF2 |0 - \xA2\xF3 |0 - \xA2\xF4 |0 - \xA2\xF5 |0 - \xA2\xF6 |0 - \xA2\xF7 |0 - \xA2\xF8 |0 - \xA2\xF9 |0 - \xA2\xFA |0 - \xA2\xFB |0 - \xA2\xFC |0 - \xA2\xFD |0 - \xA2\xFE |0 - \xA3\x40 |0 - \xA3\x41 |0 - \xA3\x42 |0 - \xA3\x43 |0 - \xA1\x61 |0 \xA1\x55 |0 - \xA1\x62 |0 \xA1\xE3 |0 - \xA2\x46 |0 - \xA2\x47 |0 - \xA1\xC3 |0 - \xA2\x44 |0 END CHARMAP diff --git a/icuSources/data/mappings/ibm-1375_P100-2003.ucm b/icuSources/data/mappings/ibm-1375_P100-2003.ucm new file mode 100644 index 00000000..1be44837 --- /dev/null +++ b/icuSources/data/mappings/ibm-1375_P100-2003.ucm @@ -0,0 +1,18673 @@ +# *************************************************************************** +# * +# * Copyright (C) 1995-2004, International Business Machines +# * Corporation and others. All Rights Reserved. +# * +# *************************************************************************** +# +# File created by rptp2ucm (compiled on Apr 13 2004) +# from source files F204055F.RPMAP100 and 055FF204.TPMAP100 +# + "ibm-1375_P100-2003" + "AXXXX" + 2 + 1 + "MBCS" + \xA1\x48 + \x1A + "ASCII" + "ibm-1375_VPUA" + + 0-7f, 81-fe:1 + 40-7e, 80-fe + +CHARMAP + \x00 |0 + \x01 |0 + \x02 |0 + \x03 |0 + \x04 |0 + \x05 |0 + \x06 |0 + \x07 |0 + \x08 |0 + \x09 |0 + \x0A |0 + \x0B |0 + \x0C |0 + \x0D |0 + \x0E |0 + \x0F |0 + \x10 |0 + \x11 |0 + \x12 |0 + \x13 |0 + \x14 |0 + \x15 |0 + \x16 |0 + \x17 |0 + \x18 |0 + \x19 |0 + \x1A |0 + \x1B |0 + \x1C |0 + \x1D |0 + \x1E |0 + \x1F |0 + \x20 |0 + \x21 |0 + \x22 |0 + \x23 |0 + \x24 |0 + \x25 |0 + \x26 |0 + \x27 |0 + \x28 |0 + \x29 |0 + \x2A |0 + \x2B |0 + \x2C |0 + \x2D |0 + \x2E |0 + \x2F |0 + \x30 |0 + \x31 |0 + \x32 |0 + \x33 |0 + \x34 |0 + \x35 |0 + \x36 |0 + \x37 |0 + \x38 |0 + \x39 |0 + \x3A |0 + \x3B |0 + \x3C |0 + \x3D |0 + \x3E |0 + \x3F |0 + \x40 |0 + \x41 |0 + \x42 |0 + \x43 |0 + \x44 |0 + \x45 |0 + \x46 |0 + \x47 |0 + \x48 |0 + \x49 |0 + \x4A |0 + \x4B |0 + \x4C |0 + \x4D |0 + \x4E |0 + \x4F |0 + \x50 |0 + \x51 |0 + \x52 |0 + \x53 |0 + \x54 |0 + \x55 |0 + \x56 |0 + \x57 |0 + \x58 |0 + \x59 |0 + \x5A |0 + \x5B |0 + \x5C |0 + \x5D |0 + \x5E |0 + \x5F |0 + \x60 |0 + \x61 |0 + \x62 |0 + \x63 |0 + \x64 |0 + \x65 |0 + \x66 |0 + \x67 |0 + \x68 |0 + \x69 |0 + \x6A |0 + \x6B |0 + \x6C |0 + \x6D |0 + \x6E |0 + \x6F |0 + \x70 |0 + \x71 |0 + \x72 |0 + \x73 |0 + \x74 |0 + \x75 |0 + \x76 |0 + \x77 |0 + \x78 |0 + \x79 |0 + \x7A |0 + \x7B |0 + \x7C |0 + \x7D |0 + \x7E |0 + \x7F |0 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \xA1\xB1 |0 + \xC6\xD8 |0 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \xA1\xC2 |0 + \xA2\x58 |0 + \xA1\xD3 |0 + \x1A |2 + \x1A |2 + \x1A |2 + \xA1\x50 |0 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x88\x59 |0 + \x88\x57 |0 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x88\x5D |0 + \x88\x5B |0 + \x88\x66 |0 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x88\x61 |0 + \x88\x5F |0 + \x1A |2 + \x1A |2 + \x1A |2 + \xA1\xD1 |0 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x88\x6A |0 + \x88\x68 |0 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x88\x6F |0 + \x88\x6D |0 + \x88\xA7 |0 + \x1A |2 + \x88\x73 |0 + \x88\x71 |0 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x88\x77 |0 + \x88\x75 |0 + \x1A |2 + \x1A |2 + \x1A |2 + \xA1\xD2 |0 + \xC8\xFB |0 + \x88\x7B |0 + \x88\x79 |0 + \x1A |2 + \x88\xA2 |0 + \x1A |2 + \x1A |2 + \x1A |2 + \x88\x56 |0 + \x88\x67 |0 + \x88\x5A |0 + \x88\x6C |0 + \x88\x5C |0 + \x88\x6E |0 + \x88\x70 |0 + \xC8\xFC |0 + \x88\x5E |0 + \x88\x74 |0 + \xC8\xFA |0 + \x88\x78 |0 + \x88\x58 |0 + \x88\x69 |0 + \x88\x72 |0 + \x88\x60 |0 + \x88\x76 |0 + \x88\x7A |0 + \x88\x7C |0 + \x88\x7D |0 + \x88\x7E |0 + \x88\xA1 |0 + \xC8\xF6 |0 + \x88\x6B |0 + \xC8\xF8 |0 + \xC8\xF7 |0 + \x88\xA8 |0 + \xA1\x48 |2 + \xC8\xFE |3 + \xC8\xF9 |0 + \xC8\xF5 |0 + \xC8\xFD |0 + \xC6\xD9 |0 + \xA3\xBE |0 + \xA3\xBC |0 + \xA3\xBD |0 + \xA3\xBF |0 + \xA1\xC5 |0 + \xA3\xBB |0 + \xA3\x44 |0 + \xA3\x45 |0 + \xA3\x46 |0 + \xA3\x47 |0 + \xA3\x48 |0 + \xA3\x49 |0 + \xA3\x4A |0 + \xA3\x4B |0 + \xA3\x4C |0 + \xA3\x4D |0 + \xA3\x4E |0 + \xA3\x4F |0 + \xA3\x50 |0 + \xA3\x51 |0 + \xA3\x52 |0 + \xA3\x53 |0 + \xA3\x54 |0 + \xA3\x55 |0 + \xA3\x56 |0 + \xA3\x57 |0 + \xA3\x58 |0 + \xA3\x59 |0 + \xA3\x5A |0 + \xA3\x5B |0 + \xA3\x5C |0 + \xA3\x5D |0 + \xA3\x5E |0 + \xA3\x5F |0 + \xA3\x60 |0 + \xA3\x61 |0 + \xA3\x62 |0 + \xA3\x63 |0 + \xA3\x64 |0 + \xA3\x65 |0 + \xA3\x66 |0 + \xA3\x67 |0 + \xA3\x68 |0 + \xA3\x69 |0 + \xA3\x6A |0 + \xA3\x6B |0 + \xA3\x6C |0 + \xA3\x6D |0 + \xA3\x6E |0 + \xA3\x6F |0 + \xA3\x70 |0 + \xA3\x71 |0 + \xA3\x72 |0 + \xA3\x73 |0 + \xC7\xF9 |0 + \xC7\xF3 |0 + \xC7\xF4 |0 + \xC7\xF5 |0 + \xC7\xF6 |0 + \xC7\xF7 |0 + \xC7\xF8 |0 + \xC7\xFA |0 + \xC7\xFB |0 + \xC7\xFC |0 + \xC7\xFD |0 + \xC7\xFE |0 + \xC8\x40 |0 + \xC8\x41 |0 + \xC8\x42 |0 + \xC8\x43 |0 + \xC8\x44 |0 + \xC8\x45 |0 + \xC8\x46 |0 + \xC8\x47 |0 + \xC8\x48 |0 + \xC8\x49 |0 + \xC8\x4A |0 + \xC8\x4B |0 + \xC8\x4C |0 + \xC8\x4D |0 + \xC8\x4E |0 + \xC8\x4F |0 + \xC8\x50 |0 + \xC8\x51 |0 + \xC8\x52 |0 + \xC8\x53 |0 + \xC8\x54 |0 + \xC8\x55 |0 + \xC8\x56 |0 + \xC8\x57 |0 + \xC8\x58 |0 + \xC8\x59 |0 + \xC8\x5A |0 + \xC8\x5C |0 + \xC8\x5D |0 + \xC8\x5E |0 + \xC8\x5F |0 + \xC8\x60 |0 + \xC8\x61 |0 + \xC8\x62 |0 + \xC8\x63 |0 + \xC8\x64 |0 + \xC8\x65 |0 + \xC8\x66 |0 + \xC8\x67 |0 + \xC8\x68 |0 + \xC8\x69 |0 + \xC8\x6A |0 + \xC8\x6B |0 + \xC8\x6C |0 + \xC8\x6D |0 + \xC8\x6E |0 + \xC8\x6F |0 + \xC8\x70 |0 + \xC8\x71 |0 + \xC8\x72 |0 + \xC8\x73 |0 + \xC8\x74 |0 + \xC8\x75 |0 + \xC8\x5B |0 + \x88\x63 |0 + \x88\xA4 |0 + \x88\x65 |0 + \x88\xA6 |0 + \xA1\x56 |0 + \xA1\x58 |0 + \xA1\xA5 |0 + \xA1\xA6 |0 + \xA1\xA7 |0 + \xA1\xA8 |0 + \x07 |1 + \xA1\x4C |0 + \xA1\x4B |0 + \xA1\x45 |0 + \xA1\xAC |0 + \xA1\xAB |0 + \xA1\xB0 |0 + \x13 |1 + \xA3\xE1 |0 + \xA2\x4A |0 + \xA1\xC1 |0 + \xA2\x4B |0 + \xC8\xD2 |0 + \xC8\xD3 |0 + \xA2\xB9 |0 + \xA2\xBA |0 + \xA2\xBB |0 + \xA2\xBC |0 + \xA2\xBD |0 + \xA2\xBE |0 + \xA2\xBF |0 + \xA2\xC0 |0 + \xA2\xC1 |0 + \xA2\xC2 |0 + \xC6\xB5 |0 + \xC6\xB6 |0 + \xC6\xB7 |0 + \xC6\xB8 |0 + \xC6\xB9 |0 + \xC6\xBA |0 + \xC6\xBB |0 + \xC6\xBC |0 + \xC6\xBD |0 + \xC6\xBE |0 + \xA1\xF6 |0 + \xA1\xF4 |0 + \xA1\xF7 |0 + \xA1\xF5 |0 + \x1D |1 + \x12 |1 + \xA1\xF8 |0 + \xA1\xF9 |0 + \xA1\xFB |0 + \xA1\xFA |0 + \x17 |1 + \xC8\x77 |0 + \xC8\x78 |0 + \xC8\x76 |0 + \xA2\x41 |0 + \xA1\xD4 |0 + \xA1\xDB |0 + \xA1\xE8 |0 + \xA1\xE7 |0 + \xA1\xFD |0 + \xA1\xFC |0 + \xA1\xE4 |0 + \xA1\xE5 |0 + \xA1\xEC |0 + \xA1\xED |0 + \xA1\xEF |0 + \xA1\xEE |0 + \xA1\xDC |0 + \xA1\xDA |0 + \xA1\xDD |0 + \xA1\xD8 |0 + \xA1\xD9 |0 + \xA1\xF2 |0 + \xA1\xF3 |0 + \xA1\xE6 |0 + \xA1\xE9 |0 + \xC6\xA1 |0 + \xC6\xA2 |0 + \xC6\xA3 |0 + \xC6\xA4 |0 + \xC6\xA5 |0 + \xC6\xA6 |0 + \xC6\xA7 |0 + \xC6\xA8 |0 + \xC6\xA9 |0 + \xC6\xAA |0 + \xC6\xAB |0 + \xC6\xAC |0 + \xC6\xAD |0 + \xC6\xAE |0 + \xC6\xAF |0 + \xC6\xB0 |0 + \xC6\xB1 |0 + \xC6\xB2 |0 + \xC6\xB3 |0 + \xC6\xB4 |0 + \xA2\x77 |0 + \xA2\x78 |0 + \xA2\x7A |0 + \xA2\x7B |0 + \xA2\x7C |0 + \xA2\x7D |0 + \xA2\x75 |0 + \xA2\x74 |0 + \xA2\x73 |0 + \xA2\x72 |0 + \xA2\x71 |0 + \xA2\xA4 |3 + \xF9\xF9 |0 + \xF9\xF8 |0 + \xF9\xE6 |0 + \xF9\xEF |0 + \xF9\xDD |0 + \xF9\xE8 |0 + \xF9\xF1 |0 + \xF9\xDF |0 + \xF9\xEC |0 + \xF9\xF5 |0 + \xF9\xE3 |0 + \xF9\xEE |0 + \xF9\xF7 |0 + \xF9\xE5 |0 + \xA2\xA5 |3 + \xF9\xE9 |0 + \xF9\xF2 |0 + \xF9\xE0 |0 + \xA2\xA7 |3 + \xF9\xEB |0 + \xF9\xF4 |0 + \xF9\xE2 |0 + \xF9\xE7 |0 + \xF9\xF0 |0 + \xF9\xDE |0 + \xF9\xED |0 + \xF9\xF6 |0 + \xF9\xE4 |0 + \xA2\xA6 |3 + \xF9\xEA |0 + \xF9\xF3 |0 + \xF9\xE1 |0 + \xA2\x7E |0 + \xF9\xFA |3 + \xA2\xA1 |0 + \xF9\xFB |3 + \xA2\xA3 |0 + \xF9\xFD |3 + \xA2\xA2 |0 + \xF9\xFC |3 + \xA2\xAC |0 + \xA2\xAD |0 + \xA2\xAE |0 + \xA1\x5A |0 + \xA2\x62 |0 + \xA2\x63 |0 + \xA2\x64 |0 + \xA2\x65 |0 + \xA2\x66 |0 + \xA2\x67 |0 + \xA2\x68 |0 + \xA2\x69 |0 + \xA2\x70 |0 + \xA2\x6F |0 + \xA2\x6E |0 + \xA2\x6D |0 + \xA2\x6C |0 + \xA2\x6B |0 + \xA2\x6A |0 + \xF9\xFE |0 + \xA2\x76 |0 + \xA2\x79 |0 + \xA1\xBD |0 + \xA1\xBC |0 + \x16 |1 + \xA1\xB6 |0 + \xA1\xB5 |0 + \x10 |1 + \xA1\xBF |0 + \xA1\xBE |0 + \x11 |1 + \xA1\xBB |0 + \xA1\xBA |0 + \xA1\xB3 |0 + \xA1\xB7 |0 + \xA1\xB4 |0 + \x08 |1 + \x0A |1 + \xA2\xA8 |0 + \xA2\xA9 |0 + \xA2\xAB |0 + \xA2\xAA |0 + \xA1\xB9 |0 + \xA1\xB8 |0 + \x01 |1 + \x02 |1 + \x0F |1 + \xA1\xF0 |0 + \xA1\xF1 |0 + \x06 |1 + \x05 |1 + \x03 |1 + \x04 |1 + \x0E |1 + \xC6\xE6 |0 + \xC8\xD6 |0 + \xC8\xD7 |0 + \xC8\xD8 |0 + \xC8\xD9 |0 + \xC8\xDA |0 + \xC8\xDB |0 + \xC8\xDC |0 + \xC8\xDD |0 + \xC8\xDE |0 + \xC8\xDF |0 + \xC8\xE0 |0 + \xC8\xE1 |0 + \xC8\xE2 |0 + \xC8\xE3 |0 + \xC8\xE4 |0 + \xC8\xE5 |0 + \xC8\xE6 |0 + \xC8\xE7 |0 + \xC8\xE8 |0 + \xC8\xE9 |0 + \xC8\xEA |0 + \xC8\xEB |0 + \xC8\xEC |0 + \xC8\xED |0 + \xC8\xEE |0 + \xC8\xEF |0 + \xC8\xF0 |0 + \xC8\xF1 |0 + \xC6\xCD |0 + \xA1\x40 |0 + \xA1\x42 |0 + \xA1\x43 |0 + \xA1\xB2 |0 + \xC6\xE0 |0 + \xC6\xE1 |0 + \xC6\xE2 |0 + \xA1\x71 |0 + \xA1\x72 |0 + \xA1\x6D |0 + \xA1\x6E |0 + \xA1\x75 |0 + \xA1\x76 |0 + \xA1\x79 |0 + \xA1\x7A |0 + \xA1\x69 |0 + \xA1\x6A |0 + \xA2\x45 |0 + \xA1\x65 |0 + \xA1\x66 |0 + \xA1\xA9 |0 + \xA1\xAA |0 + \xA2\xC3 |0 + \xA2\xC4 |0 + \xA2\xC5 |0 + \xA2\xC6 |0 + \xA2\xC7 |0 + \xA2\xC8 |0 + \xA2\xC9 |0 + \xA2\xCA |0 + \xA2\xCB |0 + \xC6\xE7 |0 + \xC6\xE8 |0 + \xC6\xE9 |0 + \xC6\xEA |0 + \xC6\xEB |0 + \xC6\xEC |0 + \xC6\xED |0 + \xC6\xEE |0 + \xC6\xEF |0 + \xC6\xF0 |0 + \xC6\xF1 |0 + \xC6\xF2 |0 + \xC6\xF3 |0 + \xC6\xF4 |0 + \xC6\xF5 |0 + \xC6\xF6 |0 + \xC6\xF7 |0 + \xC6\xF8 |0 + \xC6\xF9 |0 + \xC6\xFA |0 + \xC6\xFB |0 + \xC6\xFC |0 + \xC6\xFD |0 + \xC6\xFE |0 + \xC7\x40 |0 + \xC7\x41 |0 + \xC7\x42 |0 + \xC7\x43 |0 + \xC7\x44 |0 + \xC7\x45 |0 + \xC7\x46 |0 + \xC7\x47 |0 + \xC7\x48 |0 + \xC7\x49 |0 + \xC7\x4A |0 + \xC7\x4B |0 + \xC7\x4C |0 + \xC7\x4D |0 + \xC7\x4E |0 + \xC7\x4F |0 + \xC7\x50 |0 + \xC7\x51 |0 + \xC7\x52 |0 + \xC7\x53 |0 + \xC7\x54 |0 + \xC7\x55 |0 + \xC7\x56 |0 + \xC7\x57 |0 + \xC7\x58 |0 + \xC7\x59 |0 + \xC7\x5A |0 + \xC7\x5B |0 + \xC7\x5C |0 + \xC7\x5D |0 + \xC7\x5E |0 + \xC7\x5F |0 + \xC7\x60 |0 + \xC7\x61 |0 + \xC7\x62 |0 + \xC7\x63 |0 + \xC7\x64 |0 + \xC7\x65 |0 + \xC7\x66 |0 + \xC7\x67 |0 + \xC7\x68 |0 + \xC7\x69 |0 + \xC7\x6A |0 + \xC7\x6B |0 + \xC7\x6C |0 + \xC7\x6D |0 + \xC7\x6E |0 + \xC7\x6F |0 + \xC7\x70 |0 + \xC7\x71 |0 + \xC7\x72 |0 + \xC7\x73 |0 + \xC7\x74 |0 + \xC7\x75 |0 + \xC7\x76 |0 + \xC7\x77 |0 + \xC7\x78 |0 + \xC7\x79 |0 + \xC7\x7A |0 + \xC8\xD4 |0 + \xC8\xD5 |0 + \xC6\xDC |0 + \xC6\xDD |0 + \xC7\x7B |0 + \xC7\x7C |0 + \xC7\x7D |0 + \xC7\x7E |0 + \xC7\xA1 |0 + \xC7\xA2 |0 + \xC7\xA3 |0 + \xC7\xA4 |0 + \xC7\xA5 |0 + \xC7\xA6 |0 + \xC7\xA7 |0 + \xC7\xA8 |0 + \xC7\xA9 |0 + \xC7\xAA |0 + \xC7\xAB |0 + \xC7\xAC |0 + \xC7\xAD |0 + \xC7\xAE |0 + \xC7\xAF |0 + \xC7\xB0 |0 + \xC7\xB1 |0 + \xC7\xB2 |0 + \xC7\xB3 |0 + \xC7\xB4 |0 + \xC7\xB5 |0 + \xC7\xB6 |0 + \xC7\xB7 |0 + \xC7\xB8 |0 + \xC7\xB9 |0 + \xC7\xBA |0 + \xC7\xBB |0 + \xC7\xBC |0 + \xC7\xBD |0 + \xC7\xBE |0 + \xC7\xBF |0 + \xC7\xC0 |0 + \xC7\xC1 |0 + \xC7\xC2 |0 + \xC7\xC3 |0 + \xC7\xC4 |0 + \xC7\xC5 |0 + \xC7\xC6 |0 + \xC7\xC7 |0 + \xC7\xC8 |0 + \xC7\xC9 |0 + \xC7\xCA |0 + \xC7\xCB |0 + \xC7\xCC |0 + \xC7\xCD |0 + \xC7\xCE |0 + \xC7\xCF |0 + \xC7\xD0 |0 + \xC7\xD1 |0 + \xC7\xD2 |0 + \xC7\xD3 |0 + \xC7\xD4 |0 + \xC7\xD5 |0 + \xC7\xD6 |0 + \xC7\xD7 |0 + \xC7\xD8 |0 + \xC7\xD9 |0 + \xC7\xDA |0 + \xC7\xDB |0 + \xC7\xDC |0 + \xC7\xDD |0 + \xC7\xDE |0 + \xC7\xDF |0 + \xC7\xE0 |0 + \xC7\xE1 |0 + \xC7\xE2 |0 + \xC7\xE3 |0 + \xC7\xE4 |0 + \xC7\xE5 |0 + \xC7\xE6 |0 + \xC7\xE7 |0 + \xC7\xE8 |0 + \xC7\xE9 |0 + \xC7\xEA |0 + \xC7\xEB |0 + \xC7\xEC |0 + \xC7\xED |0 + \xC7\xEE |0 + \xC7\xEF |0 + \xC7\xF0 |0 + \xC7\xF1 |0 + \xC7\xF2 |0 + \xC6\xE3 |0 + \xC6\xDA |0 + \xC6\xDB |0 + \xA3\x74 |0 + \xA3\x75 |0 + \xA3\x76 |0 + \xA3\x77 |0 + \xA3\x78 |0 + \xA3\x79 |0 + \xA3\x7A |0 + \xA3\x7B |0 + \xA3\x7C |0 + \xA3\x7D |0 + \xA3\x7E |0 + \xA3\xA1 |0 + \xA3\xA2 |0 + \xA3\xA3 |0 + \xA3\xA4 |0 + \xA3\xA5 |0 + \xA3\xA6 |0 + \xA3\xA7 |0 + \xA3\xA8 |0 + \xA3\xA9 |0 + \xA3\xAA |0 + \xA3\xAB |0 + \xA3\xAC |0 + \xA3\xAD |0 + \xA3\xAE |0 + \xA3\xAF |0 + \xA3\xB0 |0 + \xA3\xB1 |0 + \xA3\xB2 |0 + \xA3\xB3 |0 + \xA3\xB4 |0 + \xA3\xB5 |0 + \xA3\xB6 |0 + \xA3\xB7 |0 + \xA3\xB8 |0 + \xA3\xB9 |0 + \xA3\xBA |0 + \xC8\xD1 |0 + \xA1\xC0 |0 + \xA2\x55 |0 + \xA2\x56 |0 + \xA2\x50 |0 + \xA2\x51 |0 + \xA2\x52 |0 + \xA2\x54 |0 + \xA2\x57 |0 + \xA2\x53 |0 + \xA1\xEB |0 + \xA1\xEA |0 + \xA2\x4F |0 + \x92\x77 |0 + \x96\xDF |0 + \x89\xD5 |0 + \x93\xCD |0 + \x9B\xDF |0 + \xFA\x68 |0 + \x89\xDA |0 + \x8F\x59 |0 + \x89\xDB |0 + \x8F\x5D |0 + \x89\xDC |0 + \x96\xF7 |0 + \x8A\xDA |0 + \x8B\xDC |0 + \x97\xDB |0 + \x9E\x53 |0 + \x9D\xAA |0 + \x9B\xEA |0 + \x8A\x6E |0 + \x8B\xC8 |0 + \x89\xE8 |0 + \x89\xEA |0 + \x8C\x4B |0 + \xFB\x70 |0 + \x89\xED |0 + \x94\xDD |0 + \x89\xEE |0 + \x9E\xB4 |0 + \x8A\xD3 |0 + \x92\xDB |0 + \x94\xDB |0 + \x89\xF9 |0 + \xFB\x7A |0 + \x89\xFB |0 + \x9E\xFC |0 + \x89\xFC |0 + \x89\xBF |0 + \x89\xFE |0 + \x89\xE6 |0 + \x9D\x46 |0 + \x9D\xEE |0 + \xA0\x7E |0 + \xA0\x68 |0 + \x98\xE9 |0 + \x8B\x68 |0 + \x8D\xFD |0 + \x8B\xBE |0 + \x9F\xD9 |0 + \x8A\xEB |0 + \x9F\xD7 |0 + \x8B\x6A |0 + \x9C\x5C |0 + \x8B\xB1 |0 + \xFB\x5E |0 + \x9D\xF3 |0 + \xA0\xD0 |0 + \xFC\x66 |0 + \x92\xE9 |0 + \x9A\xEC |0 + \x8F\xAB |0 + \xFA\x48 |0 + \x8E\x45 |0 + \x9C\x6F |0 + \x9E\xDE |0 + \x89\xEF |0 + \x96\xE9 |0 + \x9E\xBB |0 + \x94\xDE |0 + \x9E\xB8 |0 + \x97\xBA |0 + \xFB\x65 |0 + \x95\xD6 |0 + \x9C\xBB |0 + \x97\xDA |0 + \x8F\x45 |0 + \xFB\x7D |0 + \x91\x58 |0 + \xFE\x64 |0 + \x98\x56 |0 + \x9B\x4D |0 + \x93\x5B |0 + \x95\xC7 |0 + \x97\xE7 |0 + \x93\x59 |0 + \x91\xF5 |0 + \x97\xB8 |0 + \xFD\xA2 |0 + \xFB\xB6 |0 + \x92\xFA |0 + \x93\x57 |0 + \x8B\xA6 |0 + \xFB\xB9 |0 + \x97\xB0 |0 + \xFD\xC4 |0 + \x9C\xA1 |0 + \x91\xF2 |0 + \x91\xF9 |0 + \x8F\xF1 |0 + \x97\x45 |0 + \x98\x53 |0 + \xFE\x78 |0 + \xFB\xC1 |0 + \x92\x51 |0 + \x9D\xAD |0 + \xFD\x6C |0 + \xFA\x6B |0 + \x9B\xC2 |0 + \x9A\x7B |0 + \x8B\x60 |0 + \x93\x4B |0 + \x9A\xBD |0 + \x91\xB7 |0 + \x95\xB4 |0 + \xFE\xC5 |0 + \x9E\xF0 |0 + \x8D\x64 |0 + \x92\x69 |0 + \x8D\x67 |0 + \xFB\xEA |0 + \xFB\xEF |0 + \x8D\x68 |0 + \x93\xEB |0 + \xFC\x42 |0 + \x91\x66 |0 + \xFA\xCD |0 + \x93\xDD |0 + \x8B\xCC |0 + \x8D\x6D |0 + \x8D\x6E |0 + \x96\xA8 |0 + \xFC\xA6 |0 + \x8D\x6F |0 + \x8D\x70 |0 + \xFC\x64 |0 + \x90\x60 |0 + \x8D\x74 |0 + \x97\xC3 |0 + \x8A\xD0 |0 + \x92\x74 |0 + \x9B\xBE |0 + \x9C\xC8 |0 + \x9C\xBA |0 + \x8D\x78 |0 + \x9E\xB9 |0 + \x95\x5A |0 + \x91\xB4 |0 + \x8A\x48 |0 + \x8D\x7D |0 + \x8A\x7D |0 + \x8A\xC2 |0 + \xFD\x4A |0 + \x8D\xA1 |0 + \x8A\xD1 |0 + \xFC\xB4 |0 + \x8B\x47 |0 + \x93\xA4 |0 + \x9E\xDA |0 + \x8A\x51 |0 + \x8D\xA6 |0 + \x9E\xC5 |0 + \xFC\xC4 |0 + \xA0\x78 |0 + \x94\xB5 |0 + \xFC\xC2 |0 + \x8A\x6B |0 + \x8D\xAB |0 + \xFA\xE8 |0 + \x8D\xAD |0 + \xFC\x49 |0 + \x93\xC1 |0 + \x90\x6F |0 + \x8D\xB0 |0 + \x94\x7E |0 + \x90\xFA |0 + \x94\x79 |0 + \x8D\xB2 |0 + \xFC\xEE |0 + \x99\x7B |0 + \x8D\xB4 |0 + \x8D\xB7 |0 + \x91\xB3 |0 + \x8D\xBB |0 + \x8D\xBA |0 + \x8D\xBC |0 + \x90\x44 |0 + \xFD\x4C |0 + \x93\xE4 |0 + \x93\xE0 |0 + \xFD\x53 |0 + \x8D\xC3 |0 + \x9B\xB8 |0 + \xFB\xF0 |0 + \x93\xE9 |0 + \x93\xF6 |0 + \x8D\xC5 |0 + \x8D\xCA |0 + \x8D\xCC |0 + \xFD\x5D |0 + \x93\xB5 |0 + \xFD\x61 |0 + \x9C\xF8 |0 + \x92\x52 |0 + \x9C\xA5 |0 + \x8C\x56 |0 + \x8D\xD6 |0 + \x97\xC0 |0 + \xA0\xDE |0 + \x97\xD2 |0 + \xFA\xA5 |0 + \xFD\xA3 |0 + \x8D\xDB |0 + \x8E\xAF |0 + \x91\xB5 |0 + \xFD\x49 |0 + \xFD\xD1 |0 + \x8D\xEB |0 + \x97\xC6 |0 + \xFD\xCE |0 + \x90\xFC |0 + \xFC\x59 |0 + \x96\xD6 |0 + \x97\xC5 |0 + \x8D\xEF |0 + \x97\xD7 |0 + \x8D\xF0 |0 + \x96\xA6 |0 + \xFB\xBF |0 + \x8D\xF3 |0 + \x94\x49 |0 + \x8D\xF5 |0 + \x98\x72 |0 + \x8E\x6B |0 + \xFA\xFD |0 + \x8F\x50 |0 + \x9D\xCC |0 + \xFC\x65 |0 + \x8C\x44 |0 + \x99\x6E |0 + \x94\xA1 |0 + \x8F\x63 |0 + \xA0\xDA |0 + \x92\x53 |0 + \xFD\xE9 |0 + \x9D\xB5 |0 + \x98\x79 |0 + \x9D\x5D |0 + \x8D\x63 |0 + \x96\x69 |0 + \x9F\x70 |0 + \xFC\x6A |0 + \x8A\xC7 |0 + \x89\xD7 |0 + \xFE\x4D |0 + \x9E\xDD |0 + \xFE\xFB |0 + \x98\xBC |0 + \xFA\xCC |0 + \x95\xB0 |0 + \x94\x64 |0 + \x93\x6F |0 + \x94\xB9 |0 + \x95\xEC |0 + \x91\xEE |0 + \x98\xC3 |0 + \x95\xF6 |0 + \x8F\xFD |0 + \x98\xC5 |0 + \x97\x66 |0 + \xFE\x6E |0 + \x97\xDD |0 + \x8C\xAA |0 + \x92\xD2 |0 + \x97\x61 |0 + \x98\xCB |0 + \x95\xF0 |0 + \x97\x5D |0 + \x91\xE3 |0 + \x98\xCC |0 + \x94\x69 |0 + \x98\xCD |0 + \x98\xCE |0 + \x95\xFC |0 + \x94\xA3 |0 + \x96\x62 |0 + \xFE\xB6 |0 + \x94\x63 |0 + \x98\xD0 |0 + \x98\xD1 |0 + \x94\x75 |0 + \xFA\xE0 |0 + \x94\x72 |0 + \x98\xD6 |0 + \x8A\xF0 |0 + \x98\xD9 |0 + \x98\xDB |0 + \x98\xDD |0 + \x98\xA8 |0 + \x8A\x6D |0 + \x8A\xFB |0 + \x8A\xAE |0 + \xFB\xC9 |0 + \x8C\x5D |0 + \x98\xE4 |0 + \x98\xE6 |0 + \x98\xE8 |0 + \x8A\x4D |0 + \x92\x57 |0 + \x95\xDF |0 + \xA0\xAC |0 + \x98\xEB |0 + \x98\xEC |0 + \x8C\xC3 |0 + \x98\xF4 |0 + \x8A\xB8 |0 + \x9E\xE7 |0 + \x94\xBC |0 + \xFC\xD1 |0 + \x9C\xC6 |0 + \x9E\x7E |0 + \x98\xFE |0 + \xFD\xE8 |0 + \x99\x40 |0 + \x94\xC9 |0 + \x94\xD3 |0 + \x99\x46 |0 + \x90\xC0 |0 + \x94\xD1 |0 + \x95\x73 |0 + \x93\xC2 |0 + \x99\x48 |0 + \x99\x4B |0 + \x8E\x55 |0 + \x99\x4E |0 + \x8E\xFE |0 + \x8E\x59 |0 + \x94\xEC |0 + \x94\xEF |0 + \x8C\x60 |0 + \x8F\x74 |0 + \x99\x55 |0 + \x95\x44 |0 + \x8C\xCB |0 + \x99\x56 |0 + \x99\x59 |0 + \x99\x5B |0 + \x8C\xC4 |0 + \xFA\x45 |0 + \x90\xB7 |0 + \x97\x43 |0 + \x95\xCD |0 + \x97\xC9 |0 + \xFD\x50 |0 + \x8E\xB9 |0 + \x95\xC6 |0 + \x99\x67 |0 + \x8A\xB9 |0 + \x8D\xFC |0 + \x8A\x76 |0 + \x9D\x51 |0 + \x99\x73 |0 + \x9D\x4F |0 + \x99\x7A |0 + \x95\x64 |0 + \x99\xA1 |0 + \x99\xA5 |0 + \x99\xA7 |0 + \x8E\xED |0 + \x99\xAD |0 + \x94\x6E |0 + \x8F\x70 |0 + \xFA\xD0 |0 + \x99\xB3 |0 + \xA0\x53 |0 + \x96\x5C |0 + \xFD\x7A |0 + \x97\xFE |0 + \x92\xBD |0 + \x97\xFD |0 + \x8F\x64 |0 + \xFC\xF7 |0 + \x95\x62 |0 + \x97\xCD |0 + \x9E\x64 |0 + \x92\x4C |0 + \x8E\xC9 |0 + \x99\xBC |0 + \x9D\xA5 |0 + \x8F\x54 |0 + \x8F\x7C |0 + \x8E\xA2 |0 + \x8F\x7A |0 + \x97\xAE |0 + \x96\xC8 |0 + \x99\xC3 |0 + \x90\xD6 |0 + \x9C\xBE |0 + \x8F\x76 |0 + \x94\x70 |0 + \xFB\x4B |0 + \xFD\xCA |0 + \x8E\xC7 |0 + \xA0\xF9 |0 + \x8F\xA9 |0 + \x99\xC7 |0 + \x90\xD7 |0 + \x9E\xDF |0 + \x99\xCE |0 + \x8F\xBA |0 + \x8F\xEB |0 + \x99\xCF |0 + \x8F\xC2 |0 + \x92\xC9 |0 + \x97\xDC |0 + \x95\xB3 |0 + \x9C\x79 |0 + \x95\xB2 |0 + \x8F\xDB |0 + \x9B\xE3 |0 + \x9E\x7A |0 + \x9B\xEE |0 + \x99\xDE |0 + \xFA\xFA |0 + \x9E\xE5 |0 + \x8A\x52 |0 + \x99\xE1 |0 + \x8A\x67 |0 + \x8B\xB5 |0 + \x8A\xAC |0 + \x99\xE9 |0 + \xFB\xCA |0 + \x97\xDE |0 + \x95\xD1 |0 + \x99\xF5 |0 + \xFC\x4A |0 + \x9B\xA9 |0 + \xFB\xDC |0 + \xFE\x56 |0 + \x9E\xA4 |0 + \x9D\x49 |0 + \x95\xDB |0 + \x89\xC5 |0 + \x99\xF8 |0 + \x96\x64 |0 + \x90\x55 |0 + \x96\xD4 |0 + \x97\x7C |0 + \x96\x4D |0 + \x97\xE1 |0 + \x9A\x48 |0 + \x9A\x49 |0 + \xFE\x7D |0 + \x90\xAA |0 + \x9A\x50 |0 + \x93\x47 |0 + \x8E\xD8 |0 + \x90\xC9 |0 + \x9A\x55 |0 + \x90\xBC |0 + \x9A\x58 |0 + \x8B\xB8 |0 + \x90\xD5 |0 + \x96\x41 |0 + \x9A\x5A |0 + \x9A\x5C |0 + \x97\xC2 |0 + \x8A\xBB |0 + \x9B\xAA |0 + \x90\xF5 |0 + \x9A\x60 |0 + \x91\x45 |0 + \x8C\x58 |0 + \x9A\x63 |0 + \x8C\x49 |0 + \x8B\xB6 |0 + \xFC\xCF |0 + \x96\x6B |0 + \x9A\x6E |0 + \x91\x4F |0 + \x97\x46 |0 + \xA0\xE6 |0 + \x92\xD7 |0 + \x96\x75 |0 + \x93\xD4 |0 + \x91\xBB |0 + \x96\x79 |0 + \x9A\x70 |0 + \x96\x78 |0 + \x91\xCD |0 + \x9C\x4A |0 + \xA0\x6F |0 + \xA0\x6A |0 + \x91\x5F |0 + \x9F\xA5 |0 + \x89\xBA |0 + \x9E\xCD |0 + \x9A\x79 |0 + \x9D\xCE |0 + \x8C\xD2 |0 + \x9D\x73 |0 + \x96\xB9 |0 + \x96\xBC |0 + \x9C\xD1 |0 + \x89\xB7 |0 + \x9E\xEE |0 + \xFB\x43 |0 + \x9E\xC9 |0 + \xFB\xD3 |0 + \x91\xAE |0 + \x9D\x78 |0 + \x9D\x7B |0 + \xA4\x40 |0 + \xA4\x42 |0 + \xA4\x43 |0 + \x9E\xB3 |0 + \xC9\x45 |0 + \xA4\x56 |0 + \xA4\x54 |0 + \xA4\x57 |0 + \xA4\x55 |0 + \xC9\x46 |0 + \xA4\xA3 |0 + \xC9\x4F |0 + \xC9\x4D |0 + \xA4\xA2 |0 + \xA4\xA1 |0 + \xA5\x42 |0 + \xA5\x41 |0 + \xA5\x40 |0 + \xA5\x43 |0 + \xA4\xFE |0 + \x9E\xB2 |0 + \x9D\xD6 |0 + \xA5\xE0 |0 + \xA5\xE1 |0 + \x99\x4F |0 + \x89\xCE |0 + \xA8\xC3 |0 + \x8B\xC0 |0 + \x9F\xC4 |0 + \xA4\x58 |0 + \x8B\xD4 |0 + \xA4\xA4 |0 + \xC9\x50 |0 + \x8C\x72 |0 + \xA4\xA5 |0 + \xC9\x63 |0 + \xA6\xEA |0 + \xCB\xB1 |0 + \xC6\xBF |0 + \x8B\xF9 |0 + \xA4\x59 |0 + \xA4\xA6 |0 + \xA5\x44 |0 + \xC9\x64 |0 + \x89\x46 |0 + \xC6\xC0 |0 + \xC9\x40 |0 + \xA4\x44 |0 + \xA4\x5B |0 + \xC9\x47 |0 + \xA4\x5C |0 + \xFA\xE5 |0 + \xA4\xA7 |0 + \xA5\x45 |0 + \xA5\x47 |0 + \xA5\x46 |0 + \xA5\xE2 |0 + \xA5\xE3 |0 + \xA8\xC4 |0 + \xAD\xBC |0 + \xA4\x41 |0 + \xC8\x7B |0 + \x8B\xC6 |0 + \xC9\x41 |0 + \xA4\x45 |0 + \xA4\x5E |0 + \xA4\x5D |0 + \xA5\xE4 |0 + \x9C\x57 |0 + \xA8\xC5 |0 + \x9A\xFB |0 + \xB0\xAE |0 + \xD4\x4B |0 + \x89\xD0 |0 + \x89\xCF |0 + \xB6\xC3 |0 + \xDC\xB1 |0 + \xDC\xB2 |0 + \xC6\xC1 |0 + \xA4\x46 |0 + \x89\xD1 |0 + \xA4\xA9 |0 + \x89\xE2 |0 + \xA8\xC6 |0 + \xA4\x47 |0 + \xC9\x48 |0 + \xA4\x5F |0 + \xA4\xAA |0 + \xA4\xAC |0 + \xC9\x51 |0 + \xA4\xAD |0 + \xA4\xAB |0 + \x92\x7E |0 + \xA5\xE5 |0 + \x9D\xBA |0 + \xA8\xC7 |0 + \xA8\xC8 |0 + \xAB\x45 |0 + \xC6\xC2 |0 + \xA4\x60 |0 + \xA4\xAE |0 + \x8C\x6F |0 + \xA5\xE6 |0 + \xA5\xE8 |0 + \xA5\xE7 |0 + \xA6\xEB |0 + \xA8\xC9 |0 + \xA8\xCA |0 + \xAB\x46 |0 + \xAB\x47 |0 + \xAD\xBD |0 + \xDC\xB3 |0 + \xFB\xF8 |0 + \xF6\xD6 |0 + \xA4\x48 |0 + \x8B\xC7 |0 + \x92\x6B |0 + \x89\xD2 |0 + \xA4\xB0 |0 + \xA4\xAF |0 + \xC9\x52 |0 + \xA4\xB1 |0 + \xA4\xB7 |0 + \xA4\xB2 |0 + \xA4\xB3 |0 + \xC9\x54 |0 + \xC9\x53 |0 + \xA4\xB5 |0 + \xA4\xB6 |0 + \xA4\xB4 |0 + \x9F\xCF |0 + \xA5\x4A |0 + \xA5\x4B |0 + \xA5\x4C |0 + \xA5\x4D |0 + \xA5\x49 |0 + \xA5\x50 |0 + \xC9\x6A |0 + \xC9\x66 |0 + \xC9\x69 |0 + \xA5\x51 |0 + \xA5\x61 |0 + \xC9\x68 |0 + \xA5\x4E |0 + \xA5\x4F |0 + \xA5\x48 |0 + \xC9\x65 |0 + \xC9\x67 |0 + \x9D\xA9 |0 + \x89\xD3 |0 + \x99\xE2 |0 + \xA5\xF5 |0 + \xC9\xB0 |0 + \xA5\xF2 |0 + \xA5\xF6 |0 + \xC9\xBA |0 + \xC9\xAE |0 + \xA5\xF3 |0 + \xC9\xB2 |0 + \x92\x67 |0 + \xA5\xF4 |0 + \xA5\xF7 |0 + \xA5\xE9 |0 + \xC9\xB1 |0 + \xA5\xF8 |0 + \xC9\xB5 |0 + \x92\xA4 |0 + \xC9\xB9 |0 + \xC9\xB6 |0 + \xC9\xB3 |0 + \xA5\xEA |0 + \xA5\xEC |0 + \xA5\xF9 |0 + \xA5\xEE |0 + \xC9\xAB |0 + \xA5\xF1 |0 + \xA5\xEF |0 + \xA5\xF0 |0 + \xC9\xBB |0 + \xC9\xB8 |0 + \xC9\xAF |0 + \xA5\xED |0 + \x8C\x73 |0 + \xC9\xAC |0 + \xA5\xEB |0 + \x89\x4E |0 + \xC9\xB4 |0 + \xC9\xB7 |0 + \x89\x4F |0 + \x92\x78 |0 + \xC9\xAD |0 + \xCA\x66 |0 + \xA7\x42 |0 + \xA6\xF4 |0 + \x91\xB6 |0 + \xCA\x67 |0 + \xA6\xF1 |0 + \xA7\x44 |0 + \x89\xD4 |0 + \xA6\xF9 |0 + \x9F\xD2 |0 + \xA6\xF8 |0 + \xCA\x5B |0 + \xA6\xFC |0 + \xA6\xF7 |0 + \xCA\x60 |0 + \xCA\x68 |0 + \xCA\x64 |0 + \x92\xA7 |0 + \xA6\xFA |0 + \x95\xA2 |0 + \xA6\xFD |0 + \xA6\xEE |0 + \xA7\x47 |0 + \xCA\x5D |0 + \x92\x6E |0 + \xCB\xBD |0 + \xA6\xEC |0 + \xA7\x43 |0 + \xA6\xED |0 + \xA6\xF5 |0 + \xA6\xF6 |0 + \xCA\x62 |0 + \xCA\x5E |0 + \xA6\xFB |0 + \xA6\xF3 |0 + \xCA\x5A |0 + \xA6\xEF |0 + \xCA\x65 |0 + \xA7\x45 |0 + \xA7\x48 |0 + \xA6\xF2 |0 + \xA7\x40 |0 + \xA7\x46 |0 + \xA6\xF0 |0 + \xCA\x63 |0 + \xA7\x41 |0 + \xCA\x69 |0 + \xCA\x5C |0 + \xA6\xFE |0 + \xCA\x5F |0 + \xCA\x61 |0 + \xA8\xD8 |0 + \xCB\xBF |0 + \xCB\xCB |0 + \xA8\xD0 |0 + \xCB\xCC |0 + \xA8\xCB |0 + \xA8\xD5 |0 + \x96\xEA |0 + \xA8\xCE |0 + \xCB\xB9 |0 + \xA8\xD6 |0 + \xCB\xB8 |0 + \xCB\xBC |0 + \xCB\xC3 |0 + \xCB\xC1 |0 + \xA8\xDE |0 + \xA8\xD9 |0 + \xCB\xB3 |0 + \xCB\xB5 |0 + \xA8\xDB |0 + \xA8\xCF |0 + \xCB\xB6 |0 + \xCB\xC2 |0 + \xCB\xC9 |0 + \xA8\xD4 |0 + \xCB\xBB |0 + \xCB\xB4 |0 + \xA8\xD3 |0 + \xCB\xB7 |0 + \xA8\xD7 |0 + \xCB\xBA |0 + \x92\x6F |0 + \xA8\xD2 |0 + \xA8\xCD |0 + \xA8\xDC |0 + \xCB\xC4 |0 + \xA8\xDD |0 + \xCB\xC8 |0 + \xCB\xC6 |0 + \xCB\xCA |0 + \xA8\xDA |0 + \xCB\xBE |0 + \xCB\xB2 |0 + \xCB\xC0 |0 + \xA8\xD1 |0 + \xCB\xC5 |0 + \xA8\xCC |0 + \xCB\xC7 |0 + \x92\xA3 |0 + \x89\x50 |0 + \xFA\x57 |0 + \xAB\x56 |0 + \xAB\x4A |0 + \x98\x66 |0 + \xCD\xE0 |0 + \xCD\xE8 |0 + \xAB\x49 |0 + \xAB\x51 |0 + \xAB\x5D |0 + \xCD\xEE |0 + \xCD\xEC |0 + \xCD\xE7 |0 + \x89\xD6 |0 + \xAB\x4B |0 + \xCD\xED |0 + \xCD\xE3 |0 + \xAB\x59 |0 + \xAB\x50 |0 + \xAB\x58 |0 + \xCD\xDE |0 + \xCD\xEA |0 + \x98\xB2 |0 + \xCD\xE1 |0 + \xAB\x54 |0 + \xCD\xE2 |0 + \x92\xAB |0 + \xCD\xDD |0 + \xAB\x5B |0 + \xAB\x4E |0 + \xAB\x57 |0 + \xAB\x4D |0 + \xCD\xDF |0 + \xCD\xE4 |0 + \xCD\xEB |0 + \xAB\x55 |0 + \xAB\x52 |0 + \xCD\xE6 |0 + \xAB\x5A |0 + \xCD\xE9 |0 + \xCD\xE5 |0 + \xAB\x4F |0 + \xAB\x5C |0 + \xAB\x53 |0 + \xAB\x4C |0 + \xAB\x48 |0 + \x96\xDE |0 + \x92\xAC |0 + \xCD\xEF |0 + \xAD\xD7 |0 + \xAD\xC1 |0 + \x8C\x70 |0 + \xAD\xD1 |0 + \x9F\x6E |0 + \xAD\xD6 |0 + \xD0\xD0 |0 + \xD0\xCF |0 + \xD0\xD4 |0 + \xD0\xD5 |0 + \xAD\xC4 |0 + \x8E\xF2 |0 + \xAD\xCD |0 + \x9F\x6C |0 + \xAD\xDA |0 + \xAD\xCE |0 + \x89\xD8 |0 + \xD0\xC9 |0 + \xAD\xC7 |0 + \xD0\xCA |0 + \xFA\x59 |0 + \xAD\xDC |0 + \xAD\xD3 |0 + \xAD\xBE |0 + \xAD\xBF |0 + \xD0\xDD |0 + \xB0\xBF |0 + \xAD\xCC |0 + \xAD\xCB |0 + \xD0\xCB |0 + \xAD\xCF |0 + \xD4\x5B |0 + \xAD\xC6 |0 + \xD0\xD6 |0 + \xAD\xD5 |0 + \xAD\xD4 |0 + \xAD\xCA |0 + \xD0\xCE |0 + \xD0\xD7 |0 + \xD0\xC8 |0 + \xAD\xC9 |0 + \xD0\xD8 |0 + \xAD\xD2 |0 + \xD0\xCC |0 + \xAD\xC0 |0 + \xAD\xC3 |0 + \xAD\xC2 |0 + \xD0\xD9 |0 + \xAD\xD0 |0 + \xAD\xC5 |0 + \xAD\xD9 |0 + \xAD\xDB |0 + \xD0\xD3 |0 + \xAD\xD8 |0 + \x92\xA8 |0 + \xD0\xDB |0 + \xD0\xCD |0 + \xD0\xDC |0 + \xD0\xD1 |0 + \x91\x63 |0 + \xD0\xDA |0 + \xD0\xD2 |0 + \x8C\x40 |0 + \xAD\xC8 |0 + \xD4\x63 |0 + \xD4\x57 |0 + \xB0\xB3 |0 + \xD4\x5C |0 + \xD4\x62 |0 + \xB0\xB2 |0 + \xD4\x55 |0 + \xB0\xB6 |0 + \xD4\x59 |0 + \xD4\x52 |0 + \xB0\xB4 |0 + \xD4\x56 |0 + \xB0\xB9 |0 + \xB0\xBE |0 + \xD4\x67 |0 + \xD4\x51 |0 + \xB0\xBA |0 + \x9F\x73 |0 + \xD4\x66 |0 + \x92\xAD |0 + \xB0\xB5 |0 + \xD4\x58 |0 + \xB0\xB1 |0 + \xD4\x53 |0 + \xD4\x4F |0 + \xD4\x5D |0 + \xD4\x50 |0 + \xD4\x4E |0 + \xD4\x5A |0 + \xD4\x60 |0 + \xD4\x61 |0 + \xB0\xB7 |0 + \x9B\xE9 |0 + \xD8\x5B |0 + \xD4\x5E |0 + \xD4\x4D |0 + \xD4\x5F |0 + \x92\xA9 |0 + \xB0\xC1 |0 + \xD4\x64 |0 + \xB0\xC0 |0 + \xD4\x4C |0 + \xD4\x54 |0 + \xD4\x65 |0 + \xB0\xBC |0 + \xB0\xBB |0 + \xB0\xB8 |0 + \xB0\xBD |0 + \xB0\xAF |0 + \xB0\xB0 |0 + \xB3\xC8 |0 + \x92\xAA |0 + \xD8\x5E |0 + \xD8\x57 |0 + \xB3\xC5 |0 + \xD8\x5F |0 + \x89\xD9 |0 + \xD8\x55 |0 + \xD8\x58 |0 + \xB3\xC4 |0 + \xD8\x59 |0 + \xFD\x56 |0 + \xB3\xC7 |0 + \xD8\x5D |0 + \xD8\x53 |0 + \xD8\x52 |0 + \xB3\xC9 |0 + \xB3\xCA |0 + \xB3\xC6 |0 + \xB3\xCB |0 + \xD8\x51 |0 + \xD8\x5C |0 + \xD8\x5A |0 + \xD8\x54 |0 + \xB3\xC3 |0 + \xD8\x56 |0 + \x9F\xA8 |0 + \xB6\xCA |0 + \xB6\xC4 |0 + \xDC\xB7 |0 + \xB6\xCD |0 + \xDC\xBD |0 + \xDC\xC0 |0 + \xB6\xC6 |0 + \xB6\xC7 |0 + \xDC\xBA |0 + \xB6\xC5 |0 + \xDC\xC3 |0 + \xB6\xCB |0 + \xDC\xC4 |0 + \xDC\xBF |0 + \xB6\xCC |0 + \x8C\x71 |0 + \xDC\xB4 |0 + \xB6\xC9 |0 + \xDC\xB5 |0 + \xDC\xBE |0 + \xDC\xBC |0 + \xDC\xB8 |0 + \xB6\xC8 |0 + \xDC\xB6 |0 + \xB6\xCE |0 + \xDC\xBB |0 + \xDC\xC2 |0 + \xDC\xB9 |0 + \xDC\xC1 |0 + \x92\xA1 |0 + \xB9\xB6 |0 + \xB9\xB3 |0 + \x90\xE3 |0 + \xB9\xB4 |0 + \xE0\xF9 |0 + \xE0\xF1 |0 + \xB9\xB2 |0 + \xB9\xAF |0 + \xE0\xF2 |0 + \xA0\xA6 |0 + \xB9\xB1 |0 + \xE0\xF5 |0 + \xE0\xF7 |0 + \x94\xAB |0 + \xE0\xFE |0 + \xFC\x72 |0 + \xE0\xFD |0 + \xE0\xF8 |0 + \xB9\xAE |0 + \xE0\xF0 |0 + \xB9\xAC |0 + \xE0\xF3 |0 + \xB9\xB7 |0 + \xE0\xF6 |0 + \xE0\xFA |0 + \xB9\xB0 |0 + \xB9\xAD |0 + \xE0\xFC |0 + \xE0\xFB |0 + \xB9\xB5 |0 + \xE0\xF4 |0 + \x97\xC4 |0 + \xBB\xF8 |0 + \xE4\xEC |0 + \xE4\xE9 |0 + \xBB\xF9 |0 + \xBB\xF7 |0 + \x92\xAE |0 + \xE4\xF0 |0 + \xE4\xED |0 + \xE4\xE6 |0 + \xBB\xF6 |0 + \xFA\x67 |0 + \xBB\xFA |0 + \xE4\xE7 |0 + \xBB\xF5 |0 + \xBB\xFD |0 + \xE4\xEA |0 + \xE4\xEB |0 + \xBB\xFB |0 + \xBB\xFC |0 + \xE4\xF1 |0 + \xE4\xEE |0 + \xE4\xEF |0 + \x92\xA2 |0 + \xFA\x69 |0 + \xBE\xAA |0 + \xE8\xF8 |0 + \xBE\xA7 |0 + \xE8\xF5 |0 + \xBE\xA9 |0 + \xBE\xAB |0 + \xE8\xF6 |0 + \xBE\xA8 |0 + \xE8\xF7 |0 + \xE8\xF4 |0 + \xC0\x76 |0 + \xEC\xBD |0 + \xC0\x77 |0 + \xEC\xBB |0 + \xEC\xBC |0 + \xEC\xBA |0 + \xEC\xB9 |0 + \xEC\xBE |0 + \xC0\x75 |0 + \x92\x68 |0 + \xEF\xB8 |0 + \xEF\xB9 |0 + \xE4\xE8 |0 + \xEF\xB7 |0 + \xC0\x78 |0 + \xC3\x5F |0 + \xF1\xEB |0 + \xF1\xEC |0 + \xC4\xD7 |0 + \xC4\xD8 |0 + \xF5\xC1 |0 + \xF5\xC0 |0 + \xC5\x6C |0 + \xC5\x6B |0 + \xF7\xD0 |0 + \xA4\x49 |0 + \xA4\x61 |0 + \xA4\xB9 |0 + \xA4\xB8 |0 + \xA5\x53 |0 + \xA5\x52 |0 + \xA5\xFC |0 + \xA5\xFB |0 + \xA5\xFD |0 + \xA5\xFA |0 + \xA7\x4A |0 + \xA7\x49 |0 + \xA7\x4B |0 + \xA8\xE0 |0 + \xA8\xDF |0 + \xA8\xE1 |0 + \x89\x51 |0 + \xAB\x5E |0 + \xA2\x59 |0 + \xD0\xDE |0 + \xA2\x5A |0 + \xB0\xC2 |0 + \xA2\x5C |0 + \xA2\x5B |0 + \xD8\x60 |0 + \xFA\x6F |0 + \xA2\x5D |0 + \xB9\xB8 |0 + \xA2\x5E |0 + \xA4\x4A |0 + \xA4\xBA |0 + \xA5\xFE |0 + \xA8\xE2 |0 + \xFA\x71 |0 + \xA4\x4B |0 + \xA4\xBD |0 + \xA4\xBB |0 + \xA4\xBC |0 + \xA6\x40 |0 + \x89\x52 |0 + \xA7\x4C |0 + \xA8\xE4 |0 + \xA8\xE3 |0 + \xA8\xE5 |0 + \x94\x5A |0 + \xAD\xDD |0 + \xBE\xAC |0 + \xC6\xC3 |0 + \x89\xDD |0 + \xC9\x4E |0 + \xC8\xA2 |0 + \xA5\x54 |0 + \xA5\x55 |0 + \xA6\x41 |0 + \xCA\x6A |0 + \xAB\x60 |0 + \xAB\x5F |0 + \xD0\xE0 |0 + \xD0\xDF |0 + \xB0\xC3 |0 + \xC6\xC4 |0 + \xA4\xBE |0 + \xC9\x55 |0 + \x9E\x52 |0 + \x89\x53 |0 + \xCB\xCD |0 + \xAB\x61 |0 + \xAD\xE0 |0 + \xAD\xDE |0 + \xAD\xDF |0 + \x9E\x55 |0 + \x92\xBA |0 + \xBE\xAD |0 + \xC6\xC5 |0 + \xA5\x56 |0 + \x8C\x5B |0 + \xA6\x42 |0 + \xC9\xBC |0 + \xFA\x7D |0 + \xFA\xA8 |0 + \x9A\x68 |0 + \xFA\x47 |0 + \xA7\x4D |0 + \xA7\x4E |0 + \xFA\x7E |0 + \xCA\x6B |0 + \xCB\xCE |0 + \xA8\xE6 |0 + \xCB\xCF |0 + \x92\xBB |0 + \xD0\xE2 |0 + \xD0\xE3 |0 + \xAD\xE3 |0 + \xFD\xB6 |0 + \xD0\xE4 |0 + \xFA\xA2 |0 + \xD0\xE1 |0 + \xAD\xE4 |0 + \xAD\xE2 |0 + \xAD\xE1 |0 + \xD0\xE5 |0 + \xFA\xA3 |0 + \xD4\x68 |0 + \xFA\xA4 |0 + \x9B\xB4 |0 + \xFA\xA6 |0 + \xD8\x61 |0 + \xDC\xC5 |0 + \xE1\x40 |0 + \x89\xDF |0 + \xBB\xFE |0 + \xBE\xAE |0 + \xE8\xF9 |0 + \xFD\xDB |0 + \xA4\x4C |0 + \xA4\x5A |0 + \xFA\xA9 |0 + \x89\x54 |0 + \xFA\xAB |0 + \xB0\xC4 |0 + \xB3\xCD |0 + \xB9\xB9 |0 + \xFC\x7A |0 + \xC9\x42 |0 + \xA4\xBF |0 + \xA5\x59 |0 + \xA5\x57 |0 + \xA5\x58 |0 + \x89\xE0 |0 + \xA8\xE7 |0 + \x9F\x4F |0 + \xA4\x4D |0 + \xA4\x4E |0 + \xC8\x7D |0 + \xA4\x62 |0 + \x89\xE1 |0 + \xA4\xC0 |0 + \xA4\xC1 |0 + \xA4\xC2 |0 + \xC9\xBE |0 + \xA5\x5A |0 + \xFA\xB0 |0 + \xC9\x6B |0 + \xA6\x46 |0 + \xC9\xBF |0 + \xA6\x44 |0 + \xA6\x45 |0 + \xC9\xBD |0 + \xA6\x47 |0 + \xA6\x43 |0 + \xCA\x6C |0 + \xAA\xEC |0 + \xCA\x6D |0 + \x9F\xCD |0 + \xA0\xE7 |0 + \xCA\x6E |0 + \xA7\x50 |0 + \xA7\x4F |0 + \xFA\xB1 |0 + \x89\xA6 |0 + \xA7\x53 |0 + \xA7\x51 |0 + \xA7\x52 |0 + \xA8\xED |0 + \xA8\xEC |0 + \xCB\xD4 |0 + \xCB\xD1 |0 + \xCB\xD2 |0 + \x9E\xFA |0 + \xCB\xD0 |0 + \xA8\xEE |0 + \xA8\xEA |0 + \xA8\xE9 |0 + \xA8\xEB |0 + \xA8\xE8 |0 + \xFA\xB2 |0 + \xA8\xEF |0 + \xAB\x63 |0 + \xCD\xF0 |0 + \xCB\xD3 |0 + \xAB\x68 |0 + \xCD\xF1 |0 + \xAB\x64 |0 + \xAB\x67 |0 + \xAB\x66 |0 + \xAB\x65 |0 + \xAB\x62 |0 + \xD0\xE8 |0 + \xAD\xE7 |0 + \xD0\xEB |0 + \xAD\xE5 |0 + \xFA\xB4 |0 + \x92\xC4 |0 + \xD0\xE7 |0 + \xAD\xE8 |0 + \xAD\xE6 |0 + \xAD\xE9 |0 + \xD0\xE9 |0 + \xD0\xEA |0 + \x9F\x6F |0 + \xD0\xE6 |0 + \xD0\xEC |0 + \x8B\xB0 |0 + \xB3\xD1 |0 + \xB0\xC5 |0 + \xD4\x69 |0 + \xD4\x6B |0 + \xD4\x6A |0 + \xD4\x6C |0 + \xB0\xC6 |0 + \xB3\xCE |0 + \x9F\xAC |0 + \xB3\xCF |0 + \xB3\xD0 |0 + \xB6\xD0 |0 + \xDC\xC7 |0 + \x89\xE3 |0 + \xDC\xC6 |0 + \xDC\xC8 |0 + \xDC\xC9 |0 + \xB6\xD1 |0 + \xB6\xCF |0 + \xE1\x41 |0 + \xE1\x42 |0 + \xB9\xBB |0 + \xB9\xBA |0 + \xE3\x5A |0 + \xBC\x40 |0 + \xBC\x41 |0 + \xBC\x42 |0 + \xBC\x44 |0 + \xE4\xF2 |0 + \xE4\xF3 |0 + \xBC\x43 |0 + \x9B\xD3 |0 + \x89\xE4 |0 + \xBE\xAF |0 + \xBE\xB0 |0 + \xFA\xB5 |0 + \xF1\xED |0 + \xF5\xC3 |0 + \xF5\xC2 |0 + \xF7\xD1 |0 + \x9F\xD5 |0 + \xA4\x4F |0 + \xA5\x5C |0 + \xA5\x5B |0 + \x89\x55 |0 + \xA6\x48 |0 + \x92\xC5 |0 + \xC9\xC0 |0 + \x89\x56 |0 + \xA7\x55 |0 + \xA7\x56 |0 + \xA7\x54 |0 + \xA7\x57 |0 + \xCA\x6F |0 + \xCA\x70 |0 + \xFA\xB3 |0 + \xFA\xB6 |0 + \xA8\xF1 |0 + \xCB\xD5 |0 + \xA8\xF0 |0 + \xCD\xF2 |0 + \xAB\x6C |0 + \xCD\xF3 |0 + \xAB\x6B |0 + \xFA\xB7 |0 + \xAB\x69 |0 + \xAB\x6A |0 + \x9E\xDC |0 + \xD0\xED |0 + \xFB\xC4 |0 + \x9F\x71 |0 + \xB0\xC7 |0 + \xD4\x6E |0 + \xB0\xCA |0 + \xD4\x6D |0 + \xB1\xE5 |0 + \xB0\xC9 |0 + \xB0\xC8 |0 + \xB3\xD4 |0 + \xB3\xD3 |0 + \xB3\xD2 |0 + \xB6\xD2 |0 + \xFA\xBA |0 + \x92\xC7 |0 + \xB6\xD5 |0 + \xB6\xD6 |0 + \xB6\xD4 |0 + \xB6\xD3 |0 + \xE1\x43 |0 + \xE1\x44 |0 + \xE4\xF5 |0 + \xBC\x45 |0 + \xE4\xF4 |0 + \xBE\xB1 |0 + \xEC\xBF |0 + \xC0\x79 |0 + \xF1\xEE |0 + \xC4\x55 |0 + \xC6\xC6 |0 + \xA4\x63 |0 + \xA4\xC3 |0 + \xC9\x56 |0 + \xA4\xC4 |0 + \xA4\xC5 |0 + \x9A\x4C |0 + \xA5\x5D |0 + \xA5\x5E |0 + \xA6\x49 |0 + \xCA\x71 |0 + \xCB\xD6 |0 + \xCB\xD7 |0 + \xAB\x6D |0 + \xD0\xEE |0 + \xB0\xCC |0 + \xB0\xCB |0 + \xD8\x63 |0 + \xD8\x62 |0 + \xA4\x50 |0 + \xA4\xC6 |0 + \xA5\x5F |0 + \xB0\xCD |0 + \xC9\x43 |0 + \xC9\x6C |0 + \xA5\x60 |0 + \xC9\xC2 |0 + \xA6\x4B |0 + \xA6\x4A |0 + \xC9\xC1 |0 + \xA7\x58 |0 + \x8C\x68 |0 + \x89\xE5 |0 + \xAD\xEA |0 + \x9F\x7D |0 + \xD4\x6F |0 + \xB6\xD7 |0 + \xE1\x45 |0 + \xB9\xBC |0 + \xA0\xA9 |0 + \xFA\xC4 |0 + \xE8\xFA |0 + \xF3\xFD |0 + \xC6\xC7 |0 + \xA4\xC7 |0 + \x89\x57 |0 + \xCB\xD8 |0 + \xCD\xF4 |0 + \xB0\xD0 |0 + \xB0\xCE |0 + \xB0\xCF |0 + \xA2\xCC |3 + \xA4\x51 |0 + \xFA\xAA |0 + \xA4\x64 |0 + \xA2\xCD |0 + \xA2\xCE |3 + \xA4\xCA |0 + \xA4\xC9 |0 + \xA4\xC8 |0 + \xA5\x63 |0 + \xA5\x62 |0 + \xC9\x6D |0 + \xC9\xC3 |0 + \x89\x58 |0 + \xA8\xF5 |0 + \xA8\xF2 |0 + \xA8\xF4 |0 + \xA8\xF3 |0 + \xAB\x6E |0 + \xB3\xD5 |0 + \xA4\x52 |0 + \x8B\xE3 |0 + \xA4\xCB |0 + \x8B\x61 |0 + \xA5\x65 |0 + \xA5\x64 |0 + \xCA\x72 |0 + \x9A\xF1 |0 + \xA8\xF6 |0 + \x9E\xB7 |0 + \xC6\xC8 |0 + \xC9\x57 |0 + \xFA\xD1 |0 + \xA5\x67 |0 + \xA5\x66 |0 + \xA6\x4C |0 + \xA6\x4D |0 + \xCA\x73 |0 + \xA7\x59 |0 + \xFA\xD2 |0 + \xA7\x5A |0 + \xA8\xF7 |0 + \xA8\xF8 |0 + \xA8\xF9 |0 + \xAB\x6F |0 + \xCD\xF5 |0 + \x9E\xBA |0 + \xFA\xD4 |0 + \xAD\xEB |0 + \xC9\x44 |0 + \xA4\xCC |0 + \xC9\xC4 |0 + \xCA\x74 |0 + \xCA\x75 |0 + \xCB\xD9 |0 + \xFA\xD9 |0 + \xCB\xDA |0 + \xCD\xF7 |0 + \xCD\xF6 |0 + \xCD\xF9 |0 + \xCD\xF8 |0 + \xAB\x70 |0 + \xD4\x70 |0 + \xAD\xED |0 + \xD0\xEF |0 + \xAD\xEC |0 + \xFA\xDB |0 + \x9C\xE0 |0 + \xD8\x64 |0 + \xB3\xD6 |0 + \xFB\xF7 |0 + \xD8\x65 |0 + \xFB\xFA |0 + \x89\xE7 |0 + \xA0\x7A |0 + \xFA\xDC |0 + \xE1\x46 |0 + \xB9\xBD |0 + \xFA\xDD |0 + \x89\xE9 |0 + \xBC\x46 |0 + \xF1\xEF |0 + \xC6\xC9 |0 + \xC9\x58 |0 + \xA5\x68 |0 + \xFA\xE2 |0 + \x89\xEB |0 + \xB0\xD1 |0 + \xFA\xE3 |0 + \xA4\x53 |0 + \xA4\x65 |0 + \xA4\xCE |0 + \xA4\xCD |0 + \x90\xC8 |0 + \xA4\xCF |0 + \x92\xDA |0 + \x89\x59 |0 + \x9C\xF5 |0 + \xA8\xFB |0 + \xA8\xFA |0 + \xA8\xFC |0 + \x89\x5A |0 + \xFA\xE7 |0 + \x9F\xA2 |0 + \xAB\x71 |0 + \xAD\xEE |0 + \xFA\xEA |0 + \xE8\xFB |0 + \xC2\x4F |0 + \xA4\x66 |0 + \xA5\x6A |0 + \xA5\x79 |0 + \xA5\x74 |0 + \xA5\x6F |0 + \xA5\x6E |0 + \xA5\x75 |0 + \xA5\x73 |0 + \xA5\x6C |0 + \xA5\x7A |0 + \xA5\x6D |0 + \xA5\x69 |0 + \xA5\x78 |0 + \xA5\x77 |0 + \xA5\x76 |0 + \xA5\x6B |0 + \xA5\x72 |0 + \xFA\xED |0 + \x8F\xAD |0 + \xA5\x71 |0 + \xA5\x7B |0 + \xA5\x70 |0 + \xFB\x59 |0 + \xA6\x53 |0 + \xA6\x59 |0 + \xA6\x55 |0 + \xA6\x5B |0 + \xC9\xC5 |0 + \xA6\x58 |0 + \xA6\x4E |0 + \xA6\x51 |0 + \xA6\x54 |0 + \xA6\x50 |0 + \xA6\x57 |0 + \xA6\x5A |0 + \xA6\x4F |0 + \xA6\x52 |0 + \xA6\x56 |0 + \xA6\x5C |0 + \xFA\xEF |0 + \x96\xEF |0 + \x9D\xEC |0 + \xCA\x7E |0 + \xCA\x7B |0 + \x9D\xCA |0 + \xA7\x67 |0 + \xCA\x7C |0 + \xA7\x5B |0 + \xA7\x5D |0 + \xA7\x75 |0 + \xA7\x70 |0 + \xFD\x6D |0 + \x89\xEC |0 + \xCA\xA5 |0 + \xCA\x7D |0 + \xA7\x5F |0 + \xA7\x61 |0 + \xCA\xA4 |0 + \xA7\x68 |0 + \xCA\x78 |0 + \xA7\x74 |0 + \xA7\x76 |0 + \xA7\x5C |0 + \xA7\x6D |0 + \xFB\x44 |0 + \xCA\x76 |0 + \xA7\x73 |0 + \x9D\xE2 |0 + \xA7\x64 |0 + \x8C\x75 |0 + \xA7\x6E |0 + \xA7\x6F |0 + \xCA\x77 |0 + \xA7\x6C |0 + \xA7\x6A |0 + \xA7\x6B |0 + \xA7\x71 |0 + \xCA\xA1 |0 + \xA7\x5E |0 + \xA7\x72 |0 + \xCA\xA3 |0 + \xA7\x66 |0 + \xA7\x63 |0 + \xCA\x7A |0 + \xA7\x62 |0 + \xCA\xA6 |0 + \xA7\x65 |0 + \xA7\x69 |0 + \x9E\xC0 |0 + \x9E\x56 |0 + \xA7\x60 |0 + \xCA\xA2 |0 + \xCA\x79 |0 + \xCB\xEB |0 + \xCB\xEA |0 + \xA9\x4F |0 + \xCB\xED |0 + \xCB\xEF |0 + \xCB\xE4 |0 + \xCB\xE7 |0 + \xCB\xEE |0 + \xA9\x50 |0 + \x9F\x79 |0 + \x9A\xC7 |0 + \xCB\xE1 |0 + \xCB\xE5 |0 + \xFA\xF4 |0 + \xCB\xE9 |0 + \xCE\x49 |0 + \xA9\x4B |0 + \xCE\x4D |0 + \xA8\xFD |0 + \xCB\xE6 |0 + \xA8\xFE |0 + \xA9\x4C |0 + \xA9\x45 |0 + \xA9\x41 |0 + \xCB\xE2 |0 + \xA9\x44 |0 + \xA9\x49 |0 + \xA9\x52 |0 + \xCB\xE3 |0 + \xCB\xDC |0 + \xA9\x43 |0 + \xCB\xDD |0 + \xCB\xDF |0 + \xA9\x46 |0 + \x98\xA1 |0 + \xA9\x48 |0 + \xCB\xDB |0 + \xCB\xE0 |0 + \xA9\x51 |0 + \xA9\x4D |0 + \xCB\xE8 |0 + \xA9\x53 |0 + \xFA\xF8 |0 + \xA9\x4A |0 + \xCB\xDE |0 + \xA9\x47 |0 + \x89\xF0 |0 + \x9E\x47 |0 + \xA9\x42 |0 + \xA9\x40 |0 + \x9D\xF7 |0 + \xCB\xEC |0 + \xA9\x4E |0 + \x9F\xD3 |0 + \x9A\xCA |0 + \xCE\x48 |0 + \xCD\xFB |0 + \xCE\x4B |0 + \x89\xF1 |0 + \xFA\xF9 |0 + \xCD\xFD |0 + \xAB\x78 |0 + \xAB\xA8 |0 + \xAB\x74 |0 + \xAB\xA7 |0 + \xAB\x7D |0 + \xAB\xA4 |0 + \xAB\x72 |0 + \xCD\xFC |0 + \xCE\x43 |0 + \xAB\xA3 |0 + \xCE\x4F |0 + \xAB\xA5 |0 + \x8E\x5A |0 + \xAB\x79 |0 + \x89\xF2 |0 + \xCE\x45 |0 + \xCE\x42 |0 + \xAB\x77 |0 + \x89\xF3 |0 + \xCD\xFA |0 + \xAB\xA6 |0 + \xCE\x4A |0 + \xAB\x7C |0 + \xCE\x4C |0 + \xAB\xA9 |0 + \xAB\x73 |0 + \xAB\x7E |0 + \xAB\x7B |0 + \xCE\x40 |0 + \xAB\xA1 |0 + \xCE\x46 |0 + \xCE\x47 |0 + \xAB\x7A |0 + \xAB\xA2 |0 + \xAB\x76 |0 + \x92\x5D |0 + \x8B\x51 |0 + \x92\xE0 |0 + \xAB\x75 |0 + \xCD\xFE |0 + \x89\xF4 |0 + \xCE\x44 |0 + \x9F\xD4 |0 + \xCE\x4E |0 + \xD1\x44 |0 + \xAD\xFB |0 + \xD0\xF1 |0 + \x8A\x79 |0 + \xD0\xF6 |0 + \xAD\xF4 |0 + \xAE\x40 |0 + \xD0\xF4 |0 + \xAD\xEF |0 + \xAD\xF9 |0 + \xAD\xFE |0 + \xD0\xFB |0 + \xAD\xFA |0 + \xAD\xFD |0 + \x89\xF5 |0 + \xD0\xFE |0 + \xAD\xF5 |0 + \xD0\xF5 |0 + \xD1\x42 |0 + \xD1\x43 |0 + \xAD\xF7 |0 + \xD1\x41 |0 + \xAD\xF3 |0 + \xAE\x43 |0 + \xD0\xF8 |0 + \xAD\xF1 |0 + \x97\xA7 |0 + \xD1\x46 |0 + \xD0\xF9 |0 + \xD0\xFD |0 + \xAD\xF6 |0 + \xAE\x42 |0 + \xD0\xFA |0 + \xAD\xFC |0 + \xD1\x40 |0 + \xD1\x47 |0 + \xD4\xA1 |0 + \x93\xBA |0 + \xD1\x45 |0 + \xAE\x44 |0 + \xAD\xF0 |0 + \xD0\xFC |0 + \xD0\xF3 |0 + \x9E\x58 |0 + \xAD\xF8 |0 + \xD0\xF2 |0 + \x89\xF6 |0 + \xD0\xF7 |0 + \x9E\x57 |0 + \x89\xF7 |0 + \x8A\x41 |0 + \xD0\xF0 |0 + \xAE\x41 |0 + \x89\xF8 |0 + \xD4\x77 |0 + \xFA\xF1 |0 + \xB0\xE4 |0 + \xD4\xA7 |0 + \xB0\xE2 |0 + \xB0\xDF |0 + \xD4\x7C |0 + \xB0\xDB |0 + \xD4\xA2 |0 + \xB0\xE6 |0 + \xD4\x76 |0 + \xD4\x7B |0 + \xD4\x7A |0 + \xAD\xF2 |0 + \xB0\xE1 |0 + \xD4\xA5 |0 + \xD4\xA8 |0 + \xD4\x73 |0 + \xB3\xE8 |0 + \x89\xFA |0 + \xD4\xA9 |0 + \xB0\xE7 |0 + \xB0\xD9 |0 + \xB0\xD6 |0 + \xD4\x7E |0 + \xB0\xD3 |0 + \xFB\x42 |0 + \xD4\xA6 |0 + \xFA\xBF |0 + \xB0\xDA |0 + \xD4\xAA |0 + \xD4\x74 |0 + \xD4\xA4 |0 + \xB0\xDD |0 + \xD4\x75 |0 + \xD4\x78 |0 + \xD4\x7D |0 + \xFB\xA3 |0 + \xB0\xDE |0 + \xB0\xDC |0 + \xB0\xE8 |0 + \xB0\xE3 |0 + \xFA\xF7 |0 + \xB0\xD7 |0 + \xB1\xD2 |0 + \xB0\xD8 |0 + \xD4\x79 |0 + \xB0\xE5 |0 + \xB0\xE0 |0 + \xD4\xA3 |0 + \xB0\xD5 |0 + \x9E\x4E |0 + \xB0\xD4 |0 + \x94\xDC |0 + \x95\xDA |0 + \x9D\xF8 |0 + \x9F\x6A |0 + \xD4\x71 |0 + \xD4\x72 |0 + \xD8\x6A |0 + \x8A\xB7 |0 + \xB3\xD7 |0 + \xB3\xDA |0 + \xD8\x75 |0 + \xB3\xEE |0 + \xD8\x78 |0 + \xB3\xD8 |0 + \xD8\x71 |0 + \xB3\xDE |0 + \xB3\xE4 |0 + \xB5\xBD |0 + \xFB\x46 |0 + \xB3\xE2 |0 + \xD8\x6E |0 + \xB3\xEF |0 + \xB3\xDB |0 + \xB3\xE3 |0 + \xD8\x76 |0 + \xDC\xD7 |0 + \xD8\x7B |0 + \xD8\x6F |0 + \x8A\x46 |0 + \xD8\x66 |0 + \xD8\x73 |0 + \xD8\x6D |0 + \xB3\xE1 |0 + \xD8\x79 |0 + \xB3\xDD |0 + \xB3\xF1 |0 + \xB3\xEA |0 + \xB3\xDF |0 + \xB3\xDC |0 + \xB3\xE7 |0 + \xD8\x7A |0 + \xD8\x6C |0 + \xD8\x72 |0 + \xD8\x74 |0 + \xD8\x68 |0 + \xD8\x77 |0 + \xB3\xD9 |0 + \xD8\x67 |0 + \xFB\x47 |0 + \xB3\xE0 |0 + \xB3\xF0 |0 + \xB3\xEC |0 + \xD8\x69 |0 + \xB3\xE6 |0 + \x91\x48 |0 + \xB3\xED |0 + \xB3\xE9 |0 + \xB3\xE5 |0 + \x92\xDE |0 + \xD8\x70 |0 + \x8B\x53 |0 + \x9D\xF6 |0 + \xB3\xEB |0 + \x9B\xDA |0 + \xDC\xD5 |0 + \xDC\xD1 |0 + \x9D\x7E |0 + \xDC\xE0 |0 + \xDC\xCA |0 + \xDC\xD3 |0 + \xB6\xE5 |0 + \xB6\xE6 |0 + \xB6\xDE |0 + \xDC\xDC |0 + \xB6\xE8 |0 + \xDC\xCF |0 + \xDC\xCE |0 + \xDC\xCC |0 + \xDC\xDE |0 + \xB6\xDC |0 + \xDC\xD8 |0 + \xDC\xCD |0 + \xB6\xDF |0 + \xDC\xD6 |0 + \xB6\xDA |0 + \xDC\xD2 |0 + \xDC\xD9 |0 + \xDC\xDB |0 + \x89\xFD |0 + \x99\xE4 |0 + \xDC\xDF |0 + \xB6\xE3 |0 + \xDC\xCB |0 + \xB6\xDD |0 + \xDC\xD0 |0 + \x9E\x43 |0 + \xB6\xD8 |0 + \xB6\xE4 |0 + \xDC\xDA |0 + \xB6\xE0 |0 + \xB6\xE1 |0 + \xB6\xE7 |0 + \xB6\xDB |0 + \xA2\x5F |0 + \xB6\xD9 |0 + \xDC\xD4 |0 + \x9D\xE9 |0 + \x8F\x52 |0 + \xB6\xE2 |0 + \x9D\xF5 |0 + \x9D\xF0 |0 + \xDC\xDD |0 + \x99\xE7 |0 + \xB9\xCD |0 + \xB9\xC8 |0 + \xE1\x55 |0 + \xE1\x51 |0 + \x8B\xBD |0 + \xE1\x4B |0 + \xB9\xC2 |0 + \xB9\xBE |0 + \xE1\x54 |0 + \xB9\xBF |0 + \xE1\x4E |0 + \xE1\x50 |0 + \xE1\x53 |0 + \x9D\xEF |0 + \xB9\xC4 |0 + \xB9\xCB |0 + \xB9\xC5 |0 + \xE1\x49 |0 + \xB9\xC6 |0 + \xB9\xC7 |0 + \xE1\x4C |0 + \xB9\xCC |0 + \x9F\xB7 |0 + \xE1\x4A |0 + \xE1\x4F |0 + \xB9\xC3 |0 + \xE1\x48 |0 + \xB9\xC9 |0 + \xB9\xC1 |0 + \xB9\xC0 |0 + \xE1\x4D |0 + \xE1\x52 |0 + \x9D\xD0 |0 + \xB9\xCA |0 + \x9F\xEB |0 + \x8D\xA9 |0 + \x9D\xCF |0 + \x98\xE1 |0 + \x9D\xE5 |0 + \xE1\x47 |0 + \xBC\x4D |0 + \xE5\x47 |0 + \xE5\x44 |0 + \x9D\xC8 |0 + \xBC\x47 |0 + \xBC\x53 |0 + \xBC\x54 |0 + \xBC\x4A |0 + \xE5\x42 |0 + \xBC\x4C |0 + \xE4\xF9 |0 + \xBC\x52 |0 + \xFB\x4F |0 + \xE5\x46 |0 + \xBC\x49 |0 + \xE5\x48 |0 + \xBC\x48 |0 + \xE5\x43 |0 + \xE5\x45 |0 + \xBC\x4B |0 + \xE5\x41 |0 + \xE4\xFA |0 + \xE4\xF7 |0 + \x9D\xEB |0 + \xD8\x6B |0 + \xE4\xFD |0 + \xE4\xF6 |0 + \xE4\xFC |0 + \xE4\xFB |0 + \xE4\xF8 |0 + \xFB\x54 |0 + \xBC\x4F |0 + \xFB\x55 |0 + \x9A\xA2 |0 + \x8A\xD6 |0 + \xBC\x4E |0 + \x9A\x5F |0 + \xBC\x50 |0 + \xE4\xFE |0 + \xBE\xB2 |0 + \xE5\x40 |0 + \x9E\xF5 |0 + \xE9\x45 |0 + \xE8\xFD |0 + \x8F\xB7 |0 + \xBE\xBE |0 + \xE9\x42 |0 + \xBE\xB6 |0 + \xBE\xBA |0 + \xE9\x41 |0 + \xBE\xB9 |0 + \xBE\xB5 |0 + \xBE\xB8 |0 + \xBE\xB3 |0 + \xBE\xBD |0 + \xE9\x43 |0 + \xE8\xFE |0 + \xBE\xBC |0 + \xE8\xFC |0 + \xBE\xBB |0 + \xE9\x44 |0 + \xE9\x40 |0 + \xBC\x51 |0 + \xBE\xBF |0 + \xE9\x46 |0 + \xBE\xB7 |0 + \xBE\xB4 |0 + \x9A\xD2 |0 + \x9E\x6A |0 + \x9E\xE8 |0 + \xEC\xC6 |0 + \xEC\xC8 |0 + \xC0\x7B |0 + \xEC\xC9 |0 + \xEC\xC7 |0 + \xEC\xC5 |0 + \xEC\xC4 |0 + \xC0\x7D |0 + \xEC\xC3 |0 + \xC0\x7E |0 + \x8B\xBF |0 + \x91\xC2 |0 + \x9D\x62 |0 + \xEC\xC1 |0 + \xEC\xC2 |0 + \xC0\x7A |0 + \xC0\xA1 |0 + \xC0\x7C |0 + \x92\x60 |0 + \xEC\xC0 |0 + \xC2\x50 |0 + \xEF\xBC |0 + \xEF\xBA |0 + \xEF\xBF |0 + \xEF\xBD |0 + \xEF\xBB |0 + \xEF\xBE |0 + \x92\x5E |0 + \x91\xC1 |0 + \x8A\xC5 |0 + \x97\xA3 |0 + \xC3\x60 |0 + \xF1\xF2 |0 + \xF1\xF3 |0 + \xC4\x56 |0 + \xF1\xF4 |0 + \xF1\xF0 |0 + \xF1\xF5 |0 + \xF1\xF1 |0 + \xC2\x51 |0 + \x8B\x6C |0 + \x8D\x7E |0 + \xF3\xFE |0 + \xF4\x41 |0 + \xC4\x59 |0 + \xF4\x40 |0 + \xC4\x58 |0 + \xC4\x57 |0 + \x9C\x54 |0 + \xC4\x5A |0 + \xF5\xC5 |0 + \xF5\xC6 |0 + \x9D\xBD |0 + \xC4\xDA |0 + \xC4\xD9 |0 + \xC4\xDB |0 + \xF5\xC4 |0 + \xF6\xD8 |0 + \xF6\xD7 |0 + \xC5\x6D |0 + \xC5\x6F |0 + \xC5\x6E |0 + \xF6\xD9 |0 + \xC5\xC8 |0 + \xF8\xA6 |0 + \xC5\xF1 |0 + \xF8\xA5 |0 + \xF8\xEE |0 + \x9C\xC5 |0 + \xC9\x49 |0 + \xA5\x7D |0 + \xA5\x7C |0 + \xA6\x5F |0 + \xA6\x5E |0 + \xC9\xC7 |0 + \xA6\x5D |0 + \xC9\xC6 |0 + \x89\x5B |0 + \xA7\x79 |0 + \xCA\xA9 |0 + \xCA\xA8 |0 + \xA7\x77 |0 + \xA7\x7A |0 + \xFB\x5C |0 + \xCA\xA7 |0 + \xFB\x5B |0 + \xA7\x78 |0 + \xFB\x57 |0 + \xCB\xF0 |0 + \xCB\xF1 |0 + \xA9\x54 |0 + \x98\xC7 |0 + \xAB\xAA |0 + \xFB\x5A |0 + \xD1\x48 |0 + \xD1\x49 |0 + \xAE\x45 |0 + \xAE\x46 |0 + \xD4\xAC |0 + \xB0\xE9 |0 + \xB0\xEB |0 + \xD4\xAB |0 + \xB0\xEA |0 + \xD8\x7C |0 + \xB3\xF2 |0 + \xB6\xE9 |0 + \xB6\xEA |0 + \xDC\xE1 |0 + \x9C\xEE |0 + \xB9\xCF |0 + \xB9\xCE |0 + \xE5\x49 |0 + \xE9\x48 |0 + \xE9\x47 |0 + \x92\xE2 |0 + \xF9\x6B |0 + \xA4\x67 |0 + \xC9\x59 |0 + \xC9\x6E |0 + \xC9\x6F |0 + \xA6\x62 |0 + \xA6\x66 |0 + \xC9\xC9 |0 + \xA6\x64 |0 + \xA6\x63 |0 + \xC9\xC8 |0 + \xA6\x65 |0 + \xA6\x61 |0 + \x94\xA7 |0 + \xA6\x60 |0 + \xC9\xCA |0 + \xA7\xA6 |0 + \x8C\xCC |0 + \xA7\xA3 |0 + \x9B\xD4 |0 + \xA7\x7D |0 + \xCA\xAA |0 + \xFB\x64 |0 + \xFB\x76 |0 + \xCA\xAB |0 + \xFB\x60 |0 + \xA7\xA1 |0 + \xCA\xAD |0 + \xA7\x7B |0 + \xCA\xAE |0 + \xCA\xAC |0 + \xA7\x7E |0 + \xA7\xA2 |0 + \xA7\xA5 |0 + \xA7\xA4 |0 + \xA7\x7C |0 + \xCA\xAF |0 + \x99\xE5 |0 + \x9A\xC2 |0 + \x91\xFB |0 + \xA0\x73 |0 + \xA9\x59 |0 + \xCB\xFE |0 + \xA9\x5B |0 + \xA9\x5A |0 + \x9F\x72 |0 + \xCC\x40 |0 + \xA9\x58 |0 + \xA9\x57 |0 + \xCB\xF5 |0 + \xCB\xF4 |0 + \xCB\xF2 |0 + \xCB\xF7 |0 + \xCB\xF6 |0 + \xCB\xF3 |0 + \xCB\xFC |0 + \xCB\xFD |0 + \xCB\xFA |0 + \xCB\xF8 |0 + \xA9\x56 |0 + \x9F\xCC |0 + \xCB\xFB |0 + \xA9\x5C |0 + \xCC\x41 |0 + \x98\xA5 |0 + \x92\xE8 |0 + \xCB\xF9 |0 + \xAB\xAB |0 + \xA9\x55 |0 + \x9B\xBC |0 + \x96\xF3 |0 + \xAB\xAC |0 + \xCE\x54 |0 + \x92\xE7 |0 + \xCE\x5A |0 + \xFC\x67 |0 + \xAB\xB2 |0 + \xCE\x58 |0 + \xCE\x5E |0 + \xCE\x55 |0 + \xCE\x59 |0 + \xCE\x5B |0 + \xCE\x5D |0 + \xCE\x57 |0 + \x8B\x7D |0 + \xCE\x56 |0 + \xCE\x51 |0 + \xCE\x52 |0 + \xAB\xAD |0 + \x9B\xF4 |0 + \xAB\xAF |0 + \xAB\xAE |0 + \xCE\x53 |0 + \xCE\x5C |0 + \x9E\xF7 |0 + \x9E\xC1 |0 + \xAB\xB1 |0 + \x99\x6F |0 + \xCE\x50 |0 + \xD1\x53 |0 + \xD1\x52 |0 + \xD1\x57 |0 + \xD1\x4E |0 + \x96\xF1 |0 + \xD1\x51 |0 + \xD1\x50 |0 + \x8E\x41 |0 + \xD1\x54 |0 + \xD1\x58 |0 + \xAE\x47 |0 + \xAE\x4A |0 + \x95\x4A |0 + \xD1\x4F |0 + \xD1\x55 |0 + \x97\xE6 |0 + \xAE\x49 |0 + \xD1\x4A |0 + \xAB\xB0 |0 + \xD4\xBA |0 + \xD1\x56 |0 + \xD1\x4D |0 + \xAE\x48 |0 + \xD1\x4C |0 + \x96\xF5 |0 + \xD4\xB1 |0 + \x92\xE6 |0 + \x9F\x42 |0 + \xB0\xEC |0 + \xB0\xF0 |0 + \xD4\xC1 |0 + \xD4\xAF |0 + \xD4\xBD |0 + \xB0\xF1 |0 + \xD4\xBF |0 + \xFB\x67 |0 + \xD4\xC5 |0 + \xD4\xC9 |0 + \xD4\xC0 |0 + \xD4\xB4 |0 + \xD4\xBC |0 + \x99\xA9 |0 + \xD4\xCA |0 + \xD4\xC8 |0 + \xD4\xBE |0 + \xD4\xB9 |0 + \xD4\xB2 |0 + \xD8\xA6 |0 + \xD4\xB0 |0 + \xB0\xF5 |0 + \xD4\xB7 |0 + \xB0\xF6 |0 + \xB0\xF2 |0 + \xD4\xAD |0 + \xD4\xC3 |0 + \xD4\xB5 |0 + \xFA\xE6 |0 + \xD4\xB3 |0 + \xD4\xC6 |0 + \xB0\xF3 |0 + \xFB\x69 |0 + \xD4\xCC |0 + \xB0\xED |0 + \xB0\xEF |0 + \xD4\xBB |0 + \xD4\xB6 |0 + \xAE\x4B |0 + \xB0\xEE |0 + \xD4\xB8 |0 + \xD4\xC7 |0 + \xD4\xCB |0 + \xD4\xC2 |0 + \xD4\xC4 |0 + \x97\xE5 |0 + \xD4\xAE |0 + \xD8\xA1 |0 + \xD8\xAA |0 + \xD8\xA9 |0 + \xB3\xFA |0 + \xD8\xA2 |0 + \xB3\xFB |0 + \xB3\xF9 |0 + \x96\x7D |0 + \xD8\xA4 |0 + \xB3\xF6 |0 + \xD8\xA8 |0 + \xFB\x6C |0 + \xD8\xA3 |0 + \xD8\xA5 |0 + \xD8\x7D |0 + \xB3\xF4 |0 + \xD8\xB2 |0 + \xD8\xB1 |0 + \xD8\xAE |0 + \xB3\xF3 |0 + \xB3\xF7 |0 + \xB3\xF8 |0 + \xD1\x4B |0 + \xD8\xAB |0 + \xB3\xF5 |0 + \xB0\xF4 |0 + \xD8\xAD |0 + \xD8\x7E |0 + \xD8\xB0 |0 + \xD8\xAF |0 + \x99\xA2 |0 + \xD8\xB3 |0 + \xDC\xEF |0 + \xD8\xAC |0 + \x9A\xBB |0 + \x9A\x65 |0 + \x94\x4E |0 + \xD8\xA7 |0 + \xDC\xE7 |0 + \xB6\xF4 |0 + \xB6\xF7 |0 + \xB6\xF2 |0 + \xDC\xE6 |0 + \xDC\xEA |0 + \xDC\xE5 |0 + \xB6\xEC |0 + \xB6\xF6 |0 + \xDC\xE2 |0 + \xB6\xF0 |0 + \xDC\xE9 |0 + \xB6\xEE |0 + \xB6\xED |0 + \xDC\xEC |0 + \xB6\xEF |0 + \xDC\xEE |0 + \xFB\x6E |0 + \xDC\xEB |0 + \xB6\xEB |0 + \x99\xDF |0 + \xB6\xF5 |0 + \xDC\xF0 |0 + \xDC\xE4 |0 + \xDC\xED |0 + \xDC\xE3 |0 + \x98\xE3 |0 + \xB6\xF1 |0 + \x92\x54 |0 + \xB6\xF3 |0 + \xDC\xE8 |0 + \xDC\xF1 |0 + \x96\x7B |0 + \x8A\xAF |0 + \xE1\x5D |0 + \xB9\xD0 |0 + \xE1\x63 |0 + \xB9\xD5 |0 + \xE1\x5F |0 + \xE1\x66 |0 + \xE1\x57 |0 + \xB9\xD7 |0 + \xB9\xD1 |0 + \xE1\x5C |0 + \xBC\x55 |0 + \xE1\x5B |0 + \xE1\x64 |0 + \xB9\xD2 |0 + \xB9\xD6 |0 + \xE1\x5A |0 + \xE1\x60 |0 + \xE1\x65 |0 + \xE1\x56 |0 + \xB9\xD4 |0 + \xE1\x5E |0 + \xE1\x62 |0 + \xE1\x68 |0 + \xE1\x58 |0 + \xE1\x61 |0 + \x8C\x77 |0 + \xB9\xD3 |0 + \xE1\x67 |0 + \xE1\x59 |0 + \x8B\xAF |0 + \x9E\xBD |0 + \xBC\x59 |0 + \xE5\x4B |0 + \xBC\x57 |0 + \xBC\x56 |0 + \xE5\x4D |0 + \xE5\x52 |0 + \xE5\x4E |0 + \xE5\x51 |0 + \xBC\x5C |0 + \x9E\xE6 |0 + \xBE\xA5 |0 + \xBC\x5B |0 + \xFB\x6F |0 + \xE5\x4A |0 + \xE5\x50 |0 + \xBC\x5A |0 + \xE5\x4F |0 + \x8E\xE1 |0 + \xE5\x4C |0 + \xBC\x58 |0 + \x9B\x7D |0 + \x9C\x7E |0 + \xE9\x4D |0 + \xF9\xD9 |0 + \xE9\x4F |0 + \xE9\x4A |0 + \xBE\xC1 |0 + \xE9\x4C |0 + \xBE\xC0 |0 + \xE9\x4E |0 + \xBE\xC3 |0 + \xE9\x50 |0 + \xBE\xC2 |0 + \xE9\x49 |0 + \xE9\x4B |0 + \x92\xEA |0 + \xC0\xA5 |0 + \xEC\xCC |0 + \x8C\x78 |0 + \xC0\xA4 |0 + \xEC\xCD |0 + \xC0\xA3 |0 + \xEC\xCB |0 + \xC0\xA2 |0 + \xEC\xCA |0 + \xC2\x53 |0 + \xC2\x52 |0 + \xF1\xF6 |0 + \xF1\xF8 |0 + \xFB\x72 |0 + \xF1\xF7 |0 + \xC3\x61 |0 + \xC3\x62 |0 + \xFB\x71 |0 + \xC3\x63 |0 + \xF4\x42 |0 + \xC4\x5B |0 + \xF7\xD3 |0 + \xF7\xD2 |0 + \xC5\xF2 |0 + \xA4\x68 |0 + \xA4\xD0 |0 + \xA7\xA7 |0 + \x89\x5C |0 + \x98\xF0 |0 + \x96\xF2 |0 + \xCE\x5F |0 + \xB3\xFC |0 + \xB3\xFD |0 + \xFB\x74 |0 + \xDC\xF2 |0 + \xB9\xD8 |0 + \xE1\x69 |0 + \xE5\x53 |0 + \x8B\xC1 |0 + \xC9\x5A |0 + \x89\x5D |0 + \x89\xDE |0 + \xCA\xB0 |0 + \x89\x5E |0 + \xC6\xCA |0 + \xCC\x42 |0 + \xCE\x60 |0 + \xD1\x59 |0 + \xAE\x4C |0 + \xFE\x42 |0 + \xF1\xF9 |0 + \xC4\xDC |0 + \xA4\x69 |0 + \xA5\x7E |0 + \xC9\x70 |0 + \xA6\x67 |0 + \xA6\x68 |0 + \xA9\x5D |0 + \xFB\x7B |0 + \xB0\xF7 |0 + \xB9\xDA |0 + \xB9\xDB |0 + \xB9\xD9 |0 + \xA4\x6A |0 + \xA4\xD1 |0 + \xA4\xD3 |0 + \xA4\xD2 |0 + \xC9\x5B |0 + \xA4\xD4 |0 + \xA5\xA1 |0 + \xC9\x71 |0 + \xA5\xA2 |0 + \x89\x5F |0 + \x89\x60 |0 + \xA6\x69 |0 + \xA6\x6A |0 + \xC9\xCB |0 + \xA7\xA8 |0 + \xCA\xB1 |0 + \xA9\x61 |0 + \xCC\x43 |0 + \xA9\x5F |0 + \xA9\x60 |0 + \xA9\x5E |0 + \xD1\x5A |0 + \xAB\xB6 |0 + \xAB\xB5 |0 + \xAB\xB7 |0 + \xAB\xB4 |0 + \xCE\x61 |0 + \xA9\x62 |0 + \xAB\xB3 |0 + \xAE\x4D |0 + \xAE\x4E |0 + \xAE\x4F |0 + \xD4\xCD |0 + \xB3\xFE |0 + \xD8\xB4 |0 + \xB0\xF8 |0 + \x9B\xCD |0 + \xB6\xF8 |0 + \xB9\xDD |0 + \xB9\xDC |0 + \xE1\x6A |0 + \xBC\x5D |0 + \xBE\xC4 |0 + \xEF\xC0 |0 + \xF6\xDA |0 + \xF7\xD4 |0 + \xA4\x6B |0 + \xA5\xA3 |0 + \x9D\xD3 |0 + \xA5\xA4 |0 + \xC9\xD1 |0 + \xA6\x6C |0 + \xA6\x6F |0 + \xC9\xCF |0 + \xC9\xCD |0 + \xA6\x6E |0 + \xC9\xD0 |0 + \xC9\xD2 |0 + \xC9\xCC |0 + \xA6\x71 |0 + \xA6\x70 |0 + \xA6\x6D |0 + \xA6\x6B |0 + \xC9\xCE |0 + \x98\x4C |0 + \xA7\xB3 |0 + \xA7\xB0 |0 + \xCA\xB6 |0 + \xCA\xB9 |0 + \xCA\xB8 |0 + \xA7\xAA |0 + \xA7\xB2 |0 + \x97\x52 |0 + \xA7\xAF |0 + \xCA\xB5 |0 + \xCA\xB3 |0 + \xA7\xAE |0 + \x95\xC3 |0 + \xA7\xA9 |0 + \xA7\xAC |0 + \x9B\xB6 |0 + \xCA\xB4 |0 + \xCA\xBB |0 + \xCA\xB7 |0 + \xA7\xAD |0 + \xA7\xB1 |0 + \xA7\xB4 |0 + \xCA\xB2 |0 + \xCA\xBA |0 + \xA7\xAB |0 + \x9A\xB9 |0 + \xA9\x67 |0 + \xA9\x6F |0 + \x97\xB3 |0 + \xCC\x4F |0 + \xCC\x48 |0 + \xA9\x70 |0 + \xCC\x53 |0 + \xCC\x44 |0 + \xCC\x4B |0 + \x9F\x74 |0 + \x92\xF1 |0 + \xA9\x66 |0 + \xCC\x45 |0 + \xA9\x64 |0 + \xCC\x4C |0 + \xCC\x50 |0 + \xA9\x63 |0 + \xCC\x51 |0 + \xCC\x4A |0 + \xCC\x4D |0 + \x97\xDF |0 + \xA9\x72 |0 + \xA9\x69 |0 + \xCC\x54 |0 + \xCC\x52 |0 + \xFB\xA6 |0 + \xA9\x6E |0 + \xA9\x6C |0 + \xCC\x49 |0 + \xA9\x6B |0 + \xCC\x47 |0 + \xCC\x46 |0 + \xA9\x6A |0 + \xA9\x68 |0 + \xA9\x71 |0 + \xA9\x6D |0 + \xA9\x65 |0 + \xCC\x4E |0 + \xAB\xB9 |0 + \xFB\xAB |0 + \xAB\xC0 |0 + \xCE\x6F |0 + \xAB\xB8 |0 + \xCE\x67 |0 + \xCE\x63 |0 + \xCE\x73 |0 + \xCE\x62 |0 + \xAB\xBB |0 + \xCE\x6C |0 + \xAB\xBE |0 + \xAB\xC1 |0 + \xAB\xBC |0 + \xCE\x70 |0 + \xAB\xBF |0 + \x98\x77 |0 + \xAE\x56 |0 + \xCE\x76 |0 + \xCE\x64 |0 + \x98\x54 |0 + \x95\xC5 |0 + \xCE\x66 |0 + \xCE\x6D |0 + \xCE\x71 |0 + \xCE\x75 |0 + \xCE\x72 |0 + \xCE\x6B |0 + \xCE\x6E |0 + \x9D\x55 |0 + \xFB\xB2 |0 + \xCE\x68 |0 + \xAB\xC3 |0 + \xCE\x6A |0 + \xCE\x69 |0 + \xCE\x74 |0 + \xAB\xBA |0 + \xCE\x65 |0 + \xAB\xC2 |0 + \x95\x7E |0 + \xAB\xBD |0 + \xAE\x5C |0 + \xD1\x62 |0 + \x97\x42 |0 + \xAE\x5B |0 + \x94\xE6 |0 + \xD1\x60 |0 + \xAE\x50 |0 + \x92\xF5 |0 + \xAE\x55 |0 + \xD1\x5F |0 + \xD1\x5C |0 + \xD1\x61 |0 + \xAE\x51 |0 + \xD1\x5B |0 + \x8C\xC5 |0 + \xAE\x54 |0 + \xAE\x52 |0 + \xD1\x63 |0 + \xAE\x53 |0 + \xAE\x57 |0 + \x92\xFD |0 + \xAE\x58 |0 + \xFB\xA2 |0 + \xAE\x5A |0 + \x9C\x51 |0 + \xAE\x59 |0 + \x94\xE9 |0 + \x98\x5C |0 + \x92\xF0 |0 + \xD1\x5D |0 + \xD1\x5E |0 + \xD1\x64 |0 + \xD4\xD4 |0 + \xB0\xF9 |0 + \xD8\xC2 |0 + \xD4\xD3 |0 + \xD4\xE6 |0 + \xB1\x40 |0 + \x94\x4C |0 + \xD4\xE4 |0 + \xB0\xFE |0 + \xB0\xFA |0 + \xD4\xED |0 + \xD4\xDD |0 + \xD4\xE0 |0 + \x91\x6B |0 + \xB1\x43 |0 + \xD4\xEA |0 + \xD4\xE2 |0 + \xB0\xFB |0 + \xB1\x44 |0 + \xD4\xE7 |0 + \xD4\xE5 |0 + \xD4\xD6 |0 + \xD4\xEB |0 + \xD4\xDF |0 + \xD4\xDA |0 + \x8B\x78 |0 + \xD4\xD0 |0 + \xD4\xEC |0 + \xD4\xDC |0 + \xD4\xCF |0 + \x94\xE2 |0 + \xB1\x42 |0 + \xD4\xE1 |0 + \xD4\xEE |0 + \xD4\xDE |0 + \xD4\xD2 |0 + \xD4\xD7 |0 + \xD4\xCE |0 + \x98\x4F |0 + \xB1\x41 |0 + \xFB\xB5 |0 + \xD4\xDB |0 + \xD4\xD8 |0 + \xB0\xFC |0 + \xD4\xD1 |0 + \x92\x71 |0 + \xD4\xE9 |0 + \xB0\xFD |0 + \x93\x65 |0 + \xD4\xD9 |0 + \xD4\xD5 |0 + \x98\x5B |0 + \xD4\xE8 |0 + \x98\x50 |0 + \xB4\x40 |0 + \xD8\xBB |0 + \x97\xBC |0 + \xD8\xB8 |0 + \xD8\xC9 |0 + \xD8\xBD |0 + \xD8\xCA |0 + \x92\xF3 |0 + \xB4\x42 |0 + \x93\x40 |0 + \x98\x4D |0 + \xD8\xC6 |0 + \xD8\xC3 |0 + \x95\x72 |0 + \xFD\xEF |0 + \xD8\xC4 |0 + \xD8\xC7 |0 + \xD8\xCB |0 + \xD4\xE3 |0 + \xD8\xCD |0 + \xDD\x47 |0 + \xFD\xC1 |0 + \xB4\x43 |0 + \xD8\xCE |0 + \xD8\xB6 |0 + \xD8\xC0 |0 + \xFB\xBA |0 + \xD8\xC5 |0 + \x92\xEB |0 + \xB4\x41 |0 + \xB4\x44 |0 + \xD8\xCC |0 + \xD8\xCF |0 + \xD8\xBA |0 + \xD8\xB7 |0 + \xFC\x73 |0 + \x97\xB7 |0 + \xD8\xB9 |0 + \xD8\xBE |0 + \xD8\xBC |0 + \xB4\x45 |0 + \xD8\xC8 |0 + \xFB\xB4 |0 + \xD8\xBF |0 + \xD8\xC1 |0 + \xD8\xB5 |0 + \xDC\xFA |0 + \xDC\xF8 |0 + \xB7\x42 |0 + \xB7\x40 |0 + \xDD\x43 |0 + \xDC\xF9 |0 + \xDD\x44 |0 + \xDD\x40 |0 + \xDC\xF7 |0 + \xDD\x46 |0 + \xDC\xF6 |0 + \xDC\xFD |0 + \xB6\xFE |0 + \xB6\xFD |0 + \xB6\xFC |0 + \xDC\xFB |0 + \xDD\x41 |0 + \xB6\xF9 |0 + \xB7\x41 |0 + \x90\xA7 |0 + \xDC\xF4 |0 + \xDC\xFE |0 + \xDC\xF3 |0 + \xDC\xFC |0 + \xB6\xFA |0 + \xDD\x42 |0 + \xDC\xF5 |0 + \xB6\xFB |0 + \xDD\x45 |0 + \x97\x41 |0 + \x92\xF4 |0 + \xFB\xBC |0 + \xE1\x6E |0 + \xB9\xE2 |0 + \xB9\xE1 |0 + \xB9\xE3 |0 + \xE1\x7A |0 + \xE1\x70 |0 + \xE1\x76 |0 + \xE1\x6B |0 + \xE1\x79 |0 + \xE1\x78 |0 + \xE1\x7C |0 + \xE1\x75 |0 + \xB9\xDE |0 + \xE1\x74 |0 + \xB9\xE4 |0 + \x95\x77 |0 + \xE1\x6D |0 + \xB9\xDF |0 + \xE1\x7B |0 + \xB9\xE0 |0 + \xE1\x6F |0 + \xE1\x72 |0 + \xE1\x77 |0 + \xE1\x71 |0 + \xE1\x6C |0 + \x9E\xE2 |0 + \x8F\x78 |0 + \xE1\x73 |0 + \xE5\x55 |0 + \xBC\x61 |0 + \xE5\x58 |0 + \xE5\x57 |0 + \xE5\x5A |0 + \xE5\x5C |0 + \xF9\xDC |0 + \xBC\x5F |0 + \xE5\x56 |0 + \x96\x72 |0 + \xE5\x54 |0 + \xE5\x5D |0 + \xE5\x5B |0 + \xE5\x59 |0 + \xE5\x5F |0 + \xE5\x5E |0 + \xBC\x63 |0 + \xBC\x5E |0 + \xBC\x60 |0 + \xBC\x62 |0 + \x9E\xB5 |0 + \xE5\x60 |0 + \xE9\x57 |0 + \x96\x4B |0 + \xE9\x56 |0 + \xE9\x55 |0 + \x8C\xAC |0 + \xE9\x58 |0 + \xE9\x51 |0 + \xE9\x52 |0 + \xE9\x5A |0 + \xE9\x53 |0 + \xBE\xC5 |0 + \xE9\x5C |0 + \xA0\xFA |0 + \xE9\x5B |0 + \xE9\x54 |0 + \xEC\xD1 |0 + \xC0\xA8 |0 + \xEC\xCF |0 + \xEC\xD4 |0 + \xEC\xD3 |0 + \xE9\x59 |0 + \xC0\xA7 |0 + \x95\x75 |0 + \xEC\xD2 |0 + \xEC\xCE |0 + \xEC\xD6 |0 + \xEC\xD5 |0 + \xC0\xA6 |0 + \xEC\xD0 |0 + \xBE\xC6 |0 + \xC2\x54 |0 + \xEF\xC1 |0 + \xF1\xFA |0 + \xF1\xFB |0 + \xF1\xFC |0 + \xC4\x5C |0 + \x90\xDA |0 + \xC4\x5D |0 + \x93\x67 |0 + \xF4\x43 |0 + \xFE\xA4 |0 + \xF5\xC8 |0 + \xF5\xC7 |0 + \x90\xDF |0 + \xF6\xDB |0 + \xF6\xDC |0 + \xF7\xD5 |0 + \xF8\xA7 |0 + \x93\x54 |0 + \xA4\x6C |0 + \xA4\x6D |0 + \xA4\x6E |0 + \xA4\xD5 |0 + \xA5\xA5 |0 + \xC9\xD3 |0 + \xA6\x72 |0 + \xA6\x73 |0 + \xA7\xB7 |0 + \xA7\xB8 |0 + \xA7\xB6 |0 + \xA7\xB5 |0 + \xA9\x73 |0 + \xCC\x55 |0 + \xA9\x75 |0 + \xA9\x74 |0 + \xCC\x56 |0 + \x89\x61 |0 + \x8B\xB4 |0 + \xAB\xC4 |0 + \xAE\x5D |0 + \xD1\x65 |0 + \x9D\xC0 |0 + \xD4\xF0 |0 + \xB1\x45 |0 + \xB4\x47 |0 + \xD4\xEF |0 + \xB4\x46 |0 + \x8E\x48 |0 + \xB9\xE5 |0 + \xFB\xC5 |0 + \xE1\x7D |0 + \xBE\xC7 |0 + \xC0\xA9 |0 + \xEC\xD7 |0 + \xFB\xC7 |0 + \xC4\x5E |0 + \xC5\x70 |0 + \xC6\xCB |0 + \xC9\x72 |0 + \xFA\x79 |0 + \xA5\xA6 |0 + \xC9\x73 |0 + \xA6\x76 |0 + \xA6\x74 |0 + \xA6\x75 |0 + \xA6\x77 |0 + \xA7\xBA |0 + \xA7\xB9 |0 + \xCA\xBC |0 + \xA7\xBB |0 + \x9E\x67 |0 + \xCA\xBD |0 + \xCC\x57 |0 + \xCC\x58 |0 + \x8C\xD9 |0 + \xA9\x76 |0 + \xA9\x78 |0 + \xA9\x7A |0 + \xA9\x77 |0 + \xA9\x7B |0 + \xA9\x79 |0 + \xFB\xD2 |0 + \x89\x62 |0 + \x89\x63 |0 + \xAB\xC8 |0 + \xAB\xC5 |0 + \xAB\xC7 |0 + \xAB\xC9 |0 + \xAB\xC6 |0 + \xD1\x66 |0 + \xCE\x77 |0 + \xFC\x7D |0 + \xD1\x68 |0 + \xD1\x67 |0 + \xAE\x63 |0 + \xAE\x5F |0 + \xAE\x60 |0 + \xAE\x62 |0 + \xAE\x64 |0 + \xAE\x61 |0 + \xAE\x66 |0 + \xAE\x65 |0 + \xB1\x4A |0 + \xD4\xF2 |0 + \xD4\xF1 |0 + \xB1\x49 |0 + \x9F\x6B |0 + \xB1\x48 |0 + \xB1\x47 |0 + \xB1\x4B |0 + \xB1\x46 |0 + \xD8\xD5 |0 + \xD8\xD2 |0 + \xB4\x49 |0 + \xD8\xD1 |0 + \xD8\xD6 |0 + \xB4\x4B |0 + \xD8\xD4 |0 + \xB4\x48 |0 + \xB4\x4A |0 + \xD8\xD3 |0 + \xFB\xCC |0 + \xDD\x48 |0 + \xFE\xAE |0 + \xDD\x49 |0 + \xDD\x4A |0 + \xB9\xE6 |0 + \xB9\xEE |0 + \xE1\x7E |0 + \xB9\xE8 |0 + \xB9\xEC |0 + \xE1\xA1 |0 + \xB9\xED |0 + \xB9\xE9 |0 + \xB9\xEA |0 + \xB9\xE7 |0 + \xB9\xEB |0 + \xBC\x66 |0 + \xD8\xD0 |0 + \xBC\x67 |0 + \xBC\x65 |0 + \xBC\x64 |0 + \xE9\x5D |0 + \xBE\xC8 |0 + \xEC\xD8 |0 + \xEC\xD9 |0 + \xFB\xD1 |0 + \xC3\x64 |0 + \xC4\x5F |0 + \xA4\x6F |0 + \xA6\x78 |0 + \xFB\x75 |0 + \xAB\xCA |0 + \xD1\x69 |0 + \xAE\x67 |0 + \xFB\xD4 |0 + \xB1\x4E |0 + \xB1\x4D |0 + \xB1\x4C |0 + \xB4\x4C |0 + \xB4\x4D |0 + \xD8\xD7 |0 + \xB9\xEF |0 + \xBE\xC9 |0 + \xA4\x70 |0 + \xC9\x5C |0 + \xA4\xD6 |0 + \xC9\x74 |0 + \xFB\xD6 |0 + \xFB\xD8 |0 + \xC9\xD4 |0 + \xA6\x79 |0 + \xA9\x7C |0 + \x8B\x5D |0 + \x93\x4C |0 + \xDD\x4B |0 + \x9A\xE2 |0 + \x8B\xC2 |3 + \xA4\x71 |0 + \x8B\xC9 |0 + \xA4\xD7 |0 + \xC9\xD5 |0 + \xCA\xBE |0 + \xCA\xBF |0 + \xA7\xBC |0 + \xD8\xD8 |0 + \xB4\x4E |0 + \xDD\x4C |0 + \xC0\xAA |0 + \xA4\x72 |0 + \xA4\xA8 |0 + \xA4\xD8 |0 + \xC9\x75 |0 + \xA5\xA7 |0 + \xA7\xC0 |0 + \xA7\xBF |0 + \xA7\xBD |0 + \xA7\xBE |0 + \xCC\x59 |0 + \xA9\x7E |0 + \xA9\xA1 |0 + \xCC\x5A |0 + \xA9\x7D |0 + \xFB\xDB |0 + \x9F\xC9 |0 + \xAB\xCE |0 + \xCE\x78 |0 + \xAB\xCD |0 + \xAB\xCB |0 + \xAB\xCC |0 + \xAE\x6A |0 + \xAE\x68 |0 + \x9F\x44 |0 + \xD1\x6B |0 + \xAE\x69 |0 + \xD1\x6A |0 + \xAE\x5E |0 + \xD4\xF3 |0 + \xB1\x50 |0 + \xB1\x51 |0 + \x98\xED |0 + \xB1\x4F |0 + \xB9\xF0 |0 + \xE1\xA2 |0 + \xBC\x68 |0 + \xBC\x69 |0 + \xE5\x61 |0 + \xC0\xAB |0 + \xEF\xC2 |0 + \xEF\xC3 |0 + \xC4\xDD |0 + \xF8\xA8 |0 + \xC9\x4B |0 + \xA4\xD9 |0 + \xA4\x73 |0 + \xC9\x77 |0 + \xC9\x76 |0 + \xA6\x7A |0 + \xC9\xD7 |0 + \xC9\xD8 |0 + \xC9\xD6 |0 + \xC9\xD9 |0 + \xFB\xDD |0 + \xCA\xC7 |0 + \xCA\xC2 |0 + \xCA\xC4 |0 + \xCA\xC6 |0 + \xCA\xC3 |0 + \xA7\xC4 |0 + \xCA\xC0 |0 + \xCA\xC1 |0 + \xA7\xC1 |0 + \xA7\xC2 |0 + \xCA\xC5 |0 + \xCA\xC8 |0 + \xA7\xC3 |0 + \xCA\xC9 |0 + \x8D\xF2 |0 + \x89\x64 |0 + \xFD\xF2 |0 + \xCC\x68 |0 + \x93\x4D |0 + \xCC\x62 |0 + \xCC\x5D |0 + \xA9\xA3 |0 + \xCC\x65 |0 + \xCC\x63 |0 + \xCC\x5C |0 + \xCC\x69 |0 + \xCC\x6C |0 + \xCC\x67 |0 + \xCC\x60 |0 + \xA9\xA5 |0 + \xCC\x66 |0 + \xA9\xA6 |0 + \xCC\x61 |0 + \xCC\x64 |0 + \xCC\x5B |0 + \xCC\x5F |0 + \xCC\x6B |0 + \xA9\xA7 |0 + \xA9\xA8 |0 + \xCC\x5E |0 + \xCC\x6A |0 + \xA9\xA2 |0 + \xA9\xA4 |0 + \xFB\xE7 |0 + \xA0\xF2 |0 + \x98\x68 |0 + \xCE\xAB |0 + \xCE\xA4 |0 + \xCE\xAA |0 + \xCE\xA3 |0 + \xCE\xA5 |0 + \xCE\x7D |0 + \xCE\x7B |0 + \xCE\xAC |0 + \xCE\xA9 |0 + \xCE\x79 |0 + \x9F\x58 |0 + \xAB\xD0 |0 + \xCE\xA7 |0 + \xCE\xA8 |0 + \xCE\xA6 |0 + \xCE\x7C |0 + \xCE\x7A |0 + \xAB\xCF |0 + \xCE\xA2 |0 + \xCE\x7E |0 + \xCE\xA1 |0 + \xCE\xAD |0 + \x8D\x73 |0 + \xAE\x6F |0 + \xFB\xDE |0 + \xAE\x6E |0 + \xD1\x6C |0 + \xAE\x6B |0 + \xD1\x6E |0 + \xFB\xDF |0 + \xAE\x70 |0 + \xD1\x6F |0 + \xAE\x73 |0 + \x8C\x48 |0 + \xAE\x71 |0 + \xD1\x70 |0 + \xCE\xAE |0 + \xD1\x72 |0 + \xAE\x6D |0 + \xAE\x6C |0 + \xD1\x6D |0 + \xD1\x71 |0 + \xAE\x72 |0 + \xB1\x53 |0 + \xB1\x52 |0 + \xD4\xF5 |0 + \xD4\xF9 |0 + \xD4\xFB |0 + \xB1\x54 |0 + \xD4\xFE |0 + \xFB\xE3 |0 + \xB1\x58 |0 + \xD5\x41 |0 + \xB1\x5A |0 + \x8D\xA8 |0 + \xB1\x56 |0 + \xB1\x5E |0 + \xFB\xE4 |0 + \xB1\x5B |0 + \xD4\xF7 |0 + \xB1\x55 |0 + \xD4\xF6 |0 + \xD4\xF4 |0 + \xD5\x43 |0 + \xD4\xF8 |0 + \xB1\x57 |0 + \xD5\x42 |0 + \xB1\x5C |0 + \xD4\xFD |0 + \xD4\xFC |0 + \xB1\x5D |0 + \xD4\xFA |0 + \xB1\x59 |0 + \x9C\x75 |0 + \xD5\x44 |0 + \x98\x78 |0 + \xD5\x40 |0 + \xD8\xE7 |0 + \xD8\xEE |0 + \xD8\xE3 |0 + \xB4\x51 |0 + \xD8\xDF |0 + \xD8\xEF |0 + \xD8\xD9 |0 + \xD8\xEC |0 + \xD8\xEA |0 + \xD8\xE4 |0 + \xD8\xED |0 + \xD8\xE6 |0 + \x8D\x60 |0 + \xD8\xDE |0 + \xD8\xF0 |0 + \xD8\xDC |0 + \xD8\xE9 |0 + \xD8\xDA |0 + \xD8\xF1 |0 + \xFB\xE5 |0 + \xB4\x52 |0 + \x8D\x61 |0 + \xD8\xEB |0 + \xDD\x4F |0 + \xD8\xDD |0 + \xB4\x4F |0 + \xD8\xE1 |0 + \xB4\x50 |0 + \xD8\xE0 |0 + \xD8\xE5 |0 + \xD8\xE2 |0 + \x8D\x62 |0 + \xA0\xA1 |0 + \xD8\xE8 |0 + \x9C\x40 |0 + \xDD\x53 |0 + \xDD\x56 |0 + \xDD\x4E |0 + \xDD\x50 |0 + \xDD\x55 |0 + \xDD\x54 |0 + \xB7\x43 |0 + \xD8\xDB |0 + \xDD\x52 |0 + \xB7\x44 |0 + \x98\xAD |0 + \xDD\x4D |0 + \xDD\x51 |0 + \x9E\xEA |0 + \xE1\xA9 |0 + \xE1\xB0 |0 + \xE1\xA7 |0 + \x8C\xD4 |0 + \xE1\xAE |0 + \xE1\xA5 |0 + \xE1\xAD |0 + \xE1\xB1 |0 + \xE1\xA4 |0 + \xE1\xA8 |0 + \xE1\xA3 |0 + \xB9\xF1 |0 + \x9C\xEB |0 + \xE1\xA6 |0 + \xB9\xF2 |0 + \xE1\xAC |0 + \xE1\xAB |0 + \xE1\xAA |0 + \xFB\xE0 |0 + \xE1\xAF |0 + \x9F\x51 |0 + \xE5\x65 |0 + \xE5\x67 |0 + \xBC\x6B |0 + \xE5\x68 |0 + \xE5\x63 |0 + \xE5\x62 |0 + \xE5\x6C |0 + \xE5\x6A |0 + \xBC\x6A |0 + \xE5\x6D |0 + \xE5\x64 |0 + \xE5\x69 |0 + \xE5\x6B |0 + \xE5\x66 |0 + \x8D\x65 |0 + \xE9\x61 |0 + \xE9\x66 |0 + \xE9\x60 |0 + \xE9\x65 |0 + \x9C\xF1 |0 + \xE9\x5E |0 + \xE9\x68 |0 + \xE9\x64 |0 + \xE9\x69 |0 + \xE9\x63 |0 + \xE9\x5F |0 + \xE9\x67 |0 + \xE9\x6A |0 + \xE9\x62 |0 + \xFC\x58 |0 + \xEC\xDA |0 + \xC0\xAF |0 + \x8D\x66 |0 + \xC0\xAD |0 + \xC0\xAC |0 + \xC0\xAE |0 + \xEF\xC4 |0 + \x96\x54 |0 + \xF1\x72 |0 + \xF1\xFD |0 + \xF4\x44 |0 + \xF4\x45 |0 + \xC4\x60 |0 + \xF5\xC9 |0 + \xC4\xDE |0 + \xF5\xCA |0 + \xF6\xDE |0 + \xC5\x72 |0 + \xC5\x71 |0 + \xF6\xDD |0 + \xC5\xC9 |0 + \xFB\xE8 |0 + \xF7\xD6 |0 + \xC6\xCC |0 + \xA4\x74 |0 + \xA6\x7B |0 + \xC9\xDA |0 + \xCA\xCA |0 + \xA8\xB5 |0 + \xB1\x5F |0 + \xA4\x75 |0 + \xA5\xAA |0 + \xA5\xA9 |0 + \xA5\xA8 |0 + \xA7\xC5 |0 + \xAE\x74 |0 + \xDD\x57 |0 + \xA4\x76 |0 + \xA4\x77 |0 + \xA4\x78 |0 + \xA4\xDA |0 + \x9F\xCE |0 + \xAB\xD1 |0 + \xCE\xAF |0 + \xB4\x53 |0 + \xA4\x79 |0 + \xC9\x5D |0 + \xA5\xAB |0 + \xA5\xAC |0 + \xC9\x78 |0 + \xA6\x7C |0 + \xFB\xFC |0 + \xCA\xCB |0 + \x9A\xE4 |0 + \xA7\xC6 |0 + \xCA\xCC |0 + \xA9\xAE |0 + \x9F\x75 |0 + \xCC\x6E |0 + \xA9\xAC |0 + \xA9\xAB |0 + \xCC\x6D |0 + \xA9\xA9 |0 + \xCC\x6F |0 + \xA9\xAA |0 + \xA9\xAD |0 + \xAB\xD2 |0 + \xAB\xD4 |0 + \xCE\xB3 |0 + \xCE\xB0 |0 + \xCE\xB1 |0 + \xCE\xB2 |0 + \xCE\xB4 |0 + \xAB\xD3 |0 + \xD1\x74 |0 + \xD1\x73 |0 + \xAE\x76 |0 + \xAE\x75 |0 + \xFB\xF1 |0 + \xB1\x62 |0 + \xD5\x46 |0 + \xB1\x61 |0 + \xB1\x63 |0 + \xB1\x60 |0 + \xB4\x55 |0 + \xD5\x45 |0 + \xB4\x56 |0 + \xD8\xF3 |0 + \x8D\x69 |0 + \xB4\x57 |0 + \xD8\xF2 |0 + \xB4\x54 |0 + \x93\x4F |0 + \xDD\x5A |0 + \xDD\x5C |0 + \xB7\x45 |0 + \xDD\x5B |0 + \xDD\x59 |0 + \xDD\x58 |0 + \xE1\xB4 |0 + \xB9\xF7 |0 + \xB9\xF5 |0 + \xB9\xF6 |0 + \xE1\xB2 |0 + \xE1\xB3 |0 + \xB9\xF3 |0 + \xE5\x71 |0 + \xE5\x6F |0 + \x93\x4E |0 + \xBC\x6D |0 + \xE5\x70 |0 + \xBC\x6E |0 + \xBC\x6C |0 + \xB9\xF4 |0 + \xE9\x6D |0 + \xE9\x6B |0 + \xE9\x6C |0 + \xE5\x6E |0 + \xEC\xDC |0 + \xC0\xB0 |0 + \xEC\xDB |0 + \xEF\xC5 |0 + \xEF\xC6 |0 + \xE9\x6E |0 + \xF1\xFE |0 + \xA4\x7A |0 + \xA5\xAD |0 + \xA6\x7E |0 + \xC9\xDB |0 + \xA6\x7D |0 + \xA9\xAF |0 + \xB7\x46 |0 + \xFB\xF4 |0 + \xA4\xDB |0 + \xA5\xAE |0 + \xAB\xD5 |0 + \xB4\x58 |0 + \xC6\xCE |0 + \xC9\x79 |0 + \xC9\x7A |0 + \xFB\xC3 |0 + \xC9\xDC |0 + \x89\x65 |0 + \xA7\xC8 |0 + \xCA\xD0 |0 + \xCA\xCE |0 + \xA7\xC9 |0 + \xCA\xCD |0 + \xCA\xCF |0 + \xCA\xD1 |0 + \xA7\xC7 |0 + \x8C\x7A |0 + \xA9\xB3 |0 + \xA9\xB4 |0 + \xA9\xB1 |0 + \x8C\x7B |0 + \xA9\xB0 |0 + \xCE\xB8 |0 + \xA9\xB2 |0 + \xAB\xD6 |0 + \xCE\xB7 |0 + \xCE\xB9 |0 + \xCE\xB6 |0 + \xCE\xBA |0 + \xAB\xD7 |0 + \xAE\x79 |0 + \xD1\x75 |0 + \xD1\x77 |0 + \xAE\x77 |0 + \xD1\x78 |0 + \xAE\x78 |0 + \xD1\x76 |0 + \xCE\xB5 |0 + \xD5\x47 |0 + \xD5\x4A |0 + \xD5\x4B |0 + \xD5\x48 |0 + \xB1\x67 |0 + \xB1\x66 |0 + \xB1\x64 |0 + \xB1\x65 |0 + \xD5\x49 |0 + \x8D\x6A |0 + \xB1\x68 |0 + \xB4\x5A |0 + \xB4\x5B |0 + \xB4\x5C |0 + \xDD\x5D |0 + \xDD\x5F |0 + \xDD\x61 |0 + \xB7\x48 |0 + \xB7\x47 |0 + \xB4\x59 |0 + \xDD\x60 |0 + \xDD\x5E |0 + \x93\x53 |0 + \xE1\xB8 |0 + \x9D\xFB |0 + \xE1\xB6 |0 + \xE1\xBC |0 + \xB9\xF8 |0 + \xE1\xBD |0 + \xE1\xBA |0 + \xB9\xF9 |0 + \xE1\xB7 |0 + \xE1\xB5 |0 + \xE1\xBB |0 + \xBC\x70 |0 + \xE5\x73 |0 + \xE1\xB9 |0 + \xBC\x72 |0 + \xE5\x74 |0 + \xBC\x71 |0 + \xBC\x74 |0 + \xE5\x75 |0 + \xBC\x6F |0 + \xBC\x73 |0 + \xE9\x73 |0 + \xE9\x71 |0 + \xE9\x70 |0 + \xE9\x72 |0 + \xE9\x6F |0 + \xC3\x66 |0 + \xF4\x46 |0 + \xF4\x47 |0 + \xF5\xCB |0 + \xF6\xDF |0 + \xC6\x55 |0 + \xFB\xFD |0 + \xA9\xB5 |0 + \xA7\xCA |0 + \x90\x59 |0 + \xFC\x40 |0 + \xAB\xD8 |0 + \xFC\x41 |0 + \xFC\x43 |0 + \xA4\x7B |0 + \xA4\xDC |0 + \xA5\xAF |0 + \xC9\xDD |0 + \xA7\xCB |0 + \xCA\xD2 |0 + \xCE\xBB |0 + \xAB\xD9 |0 + \xB9\xFA |0 + \xA4\x7C |0 + \x93\x61 |0 + \xFC\x46 |0 + \x93\x62 |0 + \xA6\xA1 |0 + \xB7\x49 |0 + \xA4\x7D |0 + \xA4\xDD |0 + \xA4\xDE |0 + \xA5\xB1 |0 + \xA5\xB0 |0 + \xC9\xDE |0 + \xA6\xA2 |0 + \xCA\xD3 |0 + \xA7\xCC |0 + \xCC\x71 |0 + \xCC\x72 |0 + \xCC\x73 |0 + \x8D\x6B |0 + \xA9\xB6 |0 + \xA9\xB7 |0 + \xCC\x70 |0 + \xA9\xB8 |0 + \xAB\xDA |0 + \xCE\xBC |0 + \xD1\x7A |0 + \xAE\x7A |0 + \xD1\x79 |0 + \xB1\x69 |0 + \xD5\x4C |0 + \xB1\x6A |0 + \xD5\x4D |0 + \xFC\x4C |0 + \xB4\x5D |0 + \xDD\x62 |0 + \xE1\xBF |0 + \xE1\xBE |0 + \xB9\xFB |0 + \xBC\x75 |0 + \xE5\x76 |0 + \xBE\xCA |0 + \xE9\x74 |0 + \xC0\xB1 |0 + \x95\xB8 |0 + \xC5\x73 |0 + \xF7\xD8 |0 + \xC6\xD0 |0 + \x8B\xCA |0 + \xCC\x74 |0 + \xCE\xBD |0 + \xB1\x6B |0 + \xD8\xF4 |0 + \xB7\x4A |0 + \x98\x7A |0 + \xC2\x55 |0 + \xC6\xD1 |0 + \xA7\xCE |0 + \xFC\x51 |0 + \xA7\xCD |0 + \xAB\xDB |0 + \xD1\x7B |0 + \xB1\x6D |0 + \xB3\x43 |0 + \xB1\x6E |0 + \xB1\x6C |0 + \xB4\x5E |0 + \xE1\xC0 |0 + \xB9\xFC |0 + \xBC\x76 |0 + \xFC\x54 |0 + \xC9\x4C |0 + \xC9\xDF |0 + \xCA\xD5 |0 + \xA7\xCF |0 + \xCA\xD4 |0 + \xA7\xD0 |0 + \xFA\xAF |0 + \xA9\xBC |0 + \xCC\x77 |0 + \xCC\x76 |0 + \xA9\xBB |0 + \xA9\xB9 |0 + \xA9\xBA |0 + \xCC\x75 |0 + \x8D\x6C |0 + \xAB\xDD |0 + \xCE\xBE |0 + \xAB\xE0 |0 + \xAB\xDC |0 + \xAB\xE2 |0 + \xAB\xDE |0 + \xAB\xDF |0 + \xAB\xE1 |0 + \xAE\x7D |0 + \xAE\x7C |0 + \xAE\x7B |0 + \xD5\x4F |0 + \xB1\x6F |0 + \xB1\x72 |0 + \xB1\x70 |0 + \xD5\x4E |0 + \xB1\x75 |0 + \xB1\x71 |0 + \xD5\x50 |0 + \xB1\x74 |0 + \xB1\x73 |0 + \xFA\x61 |0 + \xD8\xF6 |0 + \xD8\xF5 |0 + \xFC\x57 |0 + \xB4\x61 |0 + \xB4\x5F |0 + \xB4\x60 |0 + \xD8\xF7 |0 + \xB7\x4B |0 + \xDD\x64 |0 + \xB7\x4C |0 + \xDD\x63 |0 + \x9B\x70 |0 + \xE5\x77 |0 + \xBC\x78 |0 + \xE1\xC1 |0 + \xBC\x77 |0 + \xB9\xFD |0 + \xA0\x51 |0 + \xEC\xDE |0 + \xE9\x75 |0 + \xC0\xB2 |0 + \xEC\xDD |0 + \xF2\x40 |0 + \xF4\x48 |0 + \xF4\x49 |0 + \x8C\x7C |0 + \xA4\xDF |0 + \x8B\xCB |0 + \xA5\xB2 |0 + \xC9\x7B |0 + \xA7\xD2 |0 + \xA7\xD4 |0 + \xC9\xE2 |0 + \xCA\xD8 |0 + \xCA\xD7 |0 + \xCA\xD6 |0 + \xC9\xE1 |0 + \xC9\xE0 |0 + \xA6\xA4 |0 + \xA7\xD3 |0 + \xA7\xD1 |0 + \xA6\xA3 |0 + \x93\x6E |0 + \xA9\xBD |0 + \xCC\x78 |0 + \xFC\xD5 |0 + \xA9\xBE |0 + \xCA\xDD |0 + \xCA\xDF |0 + \xCA\xDE |0 + \xCC\x79 |0 + \xCA\xDA |0 + \xA7\xD8 |0 + \xA7\xD6 |0 + \xCA\xD9 |0 + \xCA\xDB |0 + \xCA\xE1 |0 + \xA7\xD5 |0 + \xCA\xDC |0 + \xCA\xE5 |0 + \xA9\xC0 |0 + \xCA\xE2 |0 + \xA7\xD7 |0 + \xCA\xE0 |0 + \xCA\xE3 |0 + \xA9\xBF |0 + \xA9\xC1 |0 + \xCA\xE4 |0 + \xCC\xAF |0 + \xCC\xA2 |0 + \xCC\x7E |0 + \xCC\xAE |0 + \xCC\xA9 |0 + \xAB\xE7 |0 + \xA9\xC2 |0 + \xCC\xAA |0 + \xCC\xAD |0 + \xAB\xE3 |0 + \xCC\xAC |0 + \xA9\xC3 |0 + \xA9\xC8 |0 + \xA9\xC6 |0 + \xCC\xA3 |0 + \xCC\x7C |0 + \xCC\xA5 |0 + \xA9\xCD |0 + \xCC\xB0 |0 + \xAB\xE4 |0 + \xCC\xA6 |0 + \xAB\xE5 |0 + \xA9\xC9 |0 + \xCC\xA8 |0 + \xFC\xA9 |0 + \xCE\xCD |0 + \xAB\xE6 |0 + \xCC\x7B |0 + \xA9\xCA |0 + \xAB\xE8 |0 + \xA9\xCB |0 + \xA9\xC7 |0 + \xA9\xCC |0 + \xCC\xA7 |0 + \xCC\x7A |0 + \xCC\xAB |0 + \xA9\xC4 |0 + \xFC\x61 |0 + \xCC\x7D |0 + \xCC\xA4 |0 + \xCC\xA1 |0 + \xA9\xC5 |0 + \xCE\xBF |0 + \xCE\xC0 |0 + \x89\x66 |0 + \xCE\xCA |0 + \xD1\xA1 |0 + \xCE\xCB |0 + \xAB\xEE |0 + \xCE\xCE |0 + \xCE\xC4 |0 + \xAB\xED |0 + \xCE\xC6 |0 + \xCE\xC7 |0 + \xFA\xCB |0 + \xCE\xC9 |0 + \xAB\xE9 |0 + \xAE\xA3 |0 + \xF9\xDA |0 + \xCE\xC5 |0 + \xCE\xC1 |0 + \xAE\xA4 |0 + \xCE\xCF |0 + \xAE\x7E |0 + \xD1\x7D |0 + \xCE\xC8 |0 + \xD1\x7C |0 + \xCE\xC3 |0 + \xCE\xCC |0 + \xAB\xEC |0 + \xAE\xA1 |0 + \xAB\xF2 |0 + \xAE\xA2 |0 + \xCE\xD0 |0 + \xD1\x7E |0 + \xAB\xEB |0 + \xAE\xA6 |0 + \xAB\xF1 |0 + \xAB\xF0 |0 + \xAB\xEF |0 + \xAE\xA5 |0 + \xCE\xD1 |0 + \xAE\xA7 |0 + \xAB\xEA |0 + \xCE\xC2 |0 + \x93\x7A |0 + \xA0\xE0 |0 + \x93\x6B |0 + \xB1\x76 |0 + \xD1\xA4 |0 + \xD1\xA6 |0 + \xD1\xA8 |0 + \xAE\xA8 |0 + \xAE\xAE |0 + \xD5\x53 |0 + \xD1\xAC |0 + \xD1\xA3 |0 + \xB1\x78 |0 + \xD5\x51 |0 + \xAE\xAD |0 + \xAE\xAB |0 + \xD1\xAE |0 + \xD5\x52 |0 + \xD1\xA5 |0 + \xAE\xAC |0 + \xD1\xA9 |0 + \xAE\xAF |0 + \xD1\xAB |0 + \xAE\xAA |0 + \xD1\xAA |0 + \xD1\xAD |0 + \xD1\xA7 |0 + \xFC\x6B |0 + \xAE\xA9 |0 + \xB1\x79 |0 + \xD1\xA2 |0 + \xB1\x77 |0 + \xA0\xDC |0 + \x94\x68 |0 + \xB1\x7A |0 + \xD5\x55 |0 + \xD5\x5E |0 + \xB4\x64 |0 + \xFC\x6D |0 + \xB1\x7C |0 + \xB1\xA3 |0 + \xB4\x65 |0 + \xD5\x60 |0 + \xB1\xAA |0 + \xD8\xF9 |0 + \xD5\x56 |0 + \xB1\xA2 |0 + \xB1\xA5 |0 + \xB1\x7E |0 + \xD5\x54 |0 + \xD5\x62 |0 + \xD5\x65 |0 + \xD9\x49 |0 + \xD5\x63 |0 + \xD8\xFD |0 + \xB1\xA1 |0 + \xB1\xA8 |0 + \xB1\xAC |0 + \xD5\x5D |0 + \xD8\xF8 |0 + \xD5\x61 |0 + \xB1\x7B |0 + \xD8\xFA |0 + \xD5\x64 |0 + \xD8\xFC |0 + \xD5\x59 |0 + \xB4\x62 |0 + \xD5\x57 |0 + \xD5\x58 |0 + \xB1\xA7 |0 + \x8D\x71 |0 + \xB1\xA6 |0 + \xD5\x5B |0 + \xB1\xAB |0 + \xD5\x5F |0 + \xB1\xA4 |0 + \xD5\x5C |0 + \xFD\x64 |0 + \xB1\xA9 |0 + \xB4\x66 |0 + \xB4\x63 |0 + \xD8\xFB |0 + \x99\xBA |0 + \xD5\x5A |0 + \xB1\x7D |0 + \x9A\xD0 |0 + \x9A\x61 |0 + \xA0\xE5 |0 + \xB4\x6B |0 + \xB4\x6F |0 + \xD9\x40 |0 + \xB7\x51 |0 + \xB4\x6D |0 + \xD9\x44 |0 + \xB4\x71 |0 + \xDD\x65 |0 + \xD9\x46 |0 + \xB7\x53 |0 + \xB4\x69 |0 + \xB4\x6C |0 + \xD9\x47 |0 + \xA0\x5B |0 + \xD9\x48 |0 + \xD9\x4E |0 + \xB4\x73 |0 + \xB7\x54 |0 + \xD9\x4A |0 + \xD9\x4F |0 + \xD9\x43 |0 + \xB7\x5E |0 + \x96\xAC |0 + \xB7\x55 |0 + \xB4\x72 |0 + \xD9\x41 |0 + \xD9\x50 |0 + \x97\x40 |0 + \xB7\x5D |0 + \xB4\x70 |0 + \xB7\x4E |0 + \xD9\x4D |0 + \xB4\x74 |0 + \xD9\x45 |0 + \xD8\xFE |0 + \xB4\x6A |0 + \xD9\x42 |0 + \xD9\x4B |0 + \x9E\xF1 |0 + \xB7\x4D |0 + \xB7\x52 |0 + \xB4\x67 |0 + \xD9\x4C |0 + \xB7\x50 |0 + \x8C\x4D |0 + \xB4\x68 |0 + \xB7\x5C |0 + \xE1\xC3 |0 + \xDD\x70 |0 + \xDD\x68 |0 + \xE1\xC2 |0 + \xDD\x6C |0 + \xDD\x6E |0 + \x9F\x7E |0 + \xDD\x6B |0 + \xB7\x5B |0 + \xDD\x6A |0 + \xB7\x5F |0 + \xE1\xD2 |0 + \x8D\x72 |0 + \xB7\x5A |0 + \xBA\x40 |0 + \xDD\x71 |0 + \xE1\xC4 |0 + \xFC\x76 |0 + \xB7\x58 |0 + \xDD\x69 |0 + \xDD\x6D |0 + \xB9\xFE |0 + \xB7\x4F |0 + \xDD\x66 |0 + \xDD\x67 |0 + \xBA\x41 |0 + \xB7\x57 |0 + \xB7\x59 |0 + \xB7\x56 |0 + \xDD\x6F |0 + \x96\xA9 |0 + \xE1\xC8 |0 + \xE1\xC9 |0 + \xE1\xCE |0 + \xBC\x7D |0 + \xE1\xD5 |0 + \xBA\x47 |0 + \xA0\x6E |0 + \xBA\x46 |0 + \xE1\xD0 |0 + \xFC\xAA |0 + \xBC\x7C |0 + \xE1\xC5 |0 + \xBA\x45 |0 + \xFB\xCD |0 + \xE1\xD4 |0 + \xBA\x43 |0 + \xBA\x44 |0 + \xFC\x74 |0 + \xE1\xD1 |0 + \xE5\xAA |0 + \xBC\x7A |0 + \xB4\x6E |0 + \xE1\xD3 |0 + \xBC\xA3 |0 + \xE1\xCB |0 + \xBC\x7B |0 + \xA0\x74 |0 + \xBC\xA2 |0 + \xE1\xC6 |0 + \xE1\xCA |0 + \xE1\xC7 |0 + \xE1\xCD |0 + \xBA\x48 |0 + \xBC\x79 |0 + \xBA\x42 |0 + \xE5\x7A |0 + \xE1\xCF |0 + \xBC\xA1 |0 + \xA0\x71 |0 + \xBC\xA4 |0 + \xE1\xCC |0 + \xFC\x79 |0 + \xBC\x7E |0 + \xE5\x79 |0 + \xFC\x7C |0 + \xE5\x7E |0 + \xBE\xCE |0 + \xE5\x78 |0 + \xE9\xA3 |0 + \xE5\xA9 |0 + \xBC\xA8 |0 + \xBC\xA6 |0 + \xBE\xCC |0 + \xE5\xA6 |0 + \xE5\xA2 |0 + \xBC\xAC |0 + \x9C\x50 |0 + \xE9\x78 |0 + \x93\x79 |0 + \x93\x78 |0 + \xBC\xAA |0 + \xE5\xA1 |0 + \xA0\xDD |0 + \xE9\x76 |0 + \xE5\xA5 |0 + \xE5\xA8 |0 + \xE5\x7D |0 + \xBC\xAB |0 + \xBC\xA5 |0 + \xE9\x77 |0 + \xBE\xCD |0 + \xE5\xA7 |0 + \xBC\xA7 |0 + \xBC\xA9 |0 + \xE5\xA4 |0 + \xBC\xAD |0 + \xE5\xA3 |0 + \xE5\x7C |0 + \xE5\x7B |0 + \xBE\xCB |0 + \xE5\xAB |0 + \xE9\x7A |0 + \xEC\xE0 |0 + \xBE\xD0 |0 + \x8D\x75 |0 + \xE9\xA2 |0 + \x8D\x76 |0 + \xE9\x7E |0 + \xEC\xE1 |0 + \xBE\xD1 |0 + \xE9\xA1 |0 + \x93\x74 |0 + \xE9\x7C |0 + \xC0\xB4 |0 + \xEC\xDF |0 + \xE9\x79 |0 + \xE9\x7B |0 + \xC0\xB5 |0 + \xBE\xD3 |0 + \xC0\xB3 |0 + \xBE\xD2 |0 + \xC0\xB7 |0 + \xE9\x7D |0 + \xBE\xCF |0 + \x8D\x77 |0 + \xFC\xA5 |0 + \xFC\xA2 |0 + \xEF\xCF |0 + \xEF\xC7 |0 + \x90\xC3 |0 + \xEC\xE7 |0 + \xEF\xC8 |0 + \xEC\xE3 |0 + \xA0\x79 |0 + \xC2\x56 |0 + \xEC\xE5 |0 + \xEC\xE4 |0 + \xC0\xB6 |0 + \xEC\xE2 |0 + \xEC\xE6 |0 + \xEF\xD0 |0 + \xEF\xCC |0 + \xEF\xCE |0 + \xEF\xC9 |0 + \xEF\xCA |0 + \xEF\xCD |0 + \xEF\xCB |0 + \xC3\x67 |0 + \xC3\x6A |0 + \xC3\x69 |0 + \xC3\x68 |0 + \xC4\x61 |0 + \xF4\x4A |0 + \xC4\x62 |0 + \xF2\x41 |0 + \xC4\xDF |0 + \xF5\xCC |0 + \xC4\xE0 |0 + \xC5\x74 |0 + \xC5\xCA |0 + \xF7\xD9 |0 + \xF7\xDA |0 + \xF7\xDB |0 + \xF9\xBA |0 + \xA4\xE0 |0 + \xC9\x7C |0 + \xA5\xB3 |0 + \xA6\xA6 |0 + \xA6\xA7 |0 + \xA6\xA5 |0 + \xA6\xA8 |0 + \xA7\xDA |0 + \xA7\xD9 |0 + \xCC\xB1 |0 + \xA9\xCF |0 + \xA9\xCE |0 + \xD1\xAF |0 + \xB1\xAD |0 + \xB1\xAE |0 + \xB4\x75 |0 + \xDD\x72 |0 + \xB7\x60 |0 + \xB7\x61 |0 + \xDD\x74 |0 + \xDD\x76 |0 + \xDD\x75 |0 + \xE1\xD7 |0 + \xE1\xD6 |0 + \xBA\x49 |0 + \xE1\xD8 |0 + \x8D\x79 |0 + \xE5\xAC |0 + \xBC\xAE |0 + \xBE\xD4 |0 + \xC0\xB8 |0 + \xC2\x57 |0 + \xC0\xB9 |0 + \xA4\xE1 |0 + \x8B\xFC |0 + \xA0\x76 |0 + \xCA\xE6 |0 + \xCC\xB2 |0 + \xA9\xD1 |0 + \xA9\xD0 |0 + \xA9\xD2 |0 + \xAB\xF3 |0 + \xCE\xD2 |0 + \xCE\xD3 |0 + \xD1\xB0 |0 + \xAE\xB0 |0 + \xB1\xAF |0 + \xB4\x76 |0 + \xD9\x51 |0 + \xA4\xE2 |0 + \x8B\xCD |0 + \xA4\x7E |0 + \xA4\xE3 |0 + \xC9\x7D |0 + \xA5\xB7 |0 + \xA5\xB6 |0 + \xA5\xB4 |0 + \xA5\xB5 |0 + \xA6\xAB |0 + \xC9\xE9 |0 + \xC9\xEB |0 + \xA6\xAA |0 + \xC9\xE3 |0 + \xC9\xE4 |0 + \xC9\xEA |0 + \xC9\xE6 |0 + \xC9\xE8 |0 + \xA6\xA9 |0 + \xC9\xE5 |0 + \xC9\xEC |0 + \xC9\xE7 |0 + \x9F\x5A |0 + \xA7\xE1 |0 + \xA7\xEA |0 + \xA7\xE8 |0 + \xCA\xF0 |0 + \xCA\xED |0 + \xCA\xF5 |0 + \xA7\xE6 |0 + \xCA\xF6 |0 + \xA7\xDF |0 + \xCA\xF3 |0 + \xA7\xE5 |0 + \xCA\xEF |0 + \xCA\xEE |0 + \xA7\xE3 |0 + \xCA\xF4 |0 + \xA7\xE4 |0 + \xA9\xD3 |0 + \xA7\xDE |0 + \xCA\xF1 |0 + \x9F\xF4 |0 + \xCA\xE7 |0 + \xA7\xDB |0 + \x9F\xBA |0 + \xA7\xEE |0 + \xCA\xEC |0 + \xCA\xF2 |0 + \xA7\xE0 |0 + \xA7\xE2 |0 + \xCA\xE8 |0 + \xCA\xE9 |0 + \xCA\xEA |0 + \x8D\x7A |0 + \xA7\xED |0 + \xA7\xE7 |0 + \xA7\xEC |0 + \xCA\xEB |0 + \xA7\xEB |0 + \xA7\xDD |0 + \xA7\xDC |0 + \xA7\xE9 |0 + \x9E\x45 |0 + \x93\xB0 |0 + \xA0\x75 |0 + \xA9\xE1 |0 + \xCC\xBE |0 + \xCC\xB7 |0 + \xA9\xDC |0 + \xA9\xEF |0 + \xCC\xB3 |0 + \xCC\xBA |0 + \xCC\xBC |0 + \xCC\xBF |0 + \xA9\xEA |0 + \xCC\xBB |0 + \xCC\xB4 |0 + \xA9\xE8 |0 + \xCC\xB8 |0 + \xCC\xC0 |0 + \xA9\xD9 |0 + \xCC\xBD |0 + \xA9\xE3 |0 + \xA9\xE2 |0 + \xCC\xB6 |0 + \xA9\xD7 |0 + \xA9\xD8 |0 + \x9B\x46 |0 + \xA9\xD6 |0 + \xFC\xAE |0 + \xA9\xEE |0 + \xA9\xE6 |0 + \xA9\xE0 |0 + \xA9\xD4 |0 + \xCC\xB9 |0 + \xA9\xDF |0 + \xA9\xD5 |0 + \xA9\xE7 |0 + \xA9\xF0 |0 + \xCE\xD4 |0 + \xA9\xE4 |0 + \xCC\xB5 |0 + \xA9\xDA |0 + \xA9\xDD |0 + \xA9\xDE |0 + \xFC\xB0 |0 + \xA9\xEC |0 + \xA9\xED |0 + \xA9\xEB |0 + \xA9\xE5 |0 + \xA9\xE9 |0 + \xA9\xDB |0 + \xAB\xF4 |0 + \xFA\x51 |0 + \x8D\x7B |0 + \xCE\xDA |0 + \xAC\x41 |0 + \xAB\xF8 |0 + \xAB\xFA |0 + \xAC\x40 |0 + \xCE\xE6 |0 + \xAB\xFD |0 + \xD1\xB1 |0 + \xAE\xB1 |0 + \xAC\x43 |0 + \xCE\xD7 |0 + \xCE\xDF |0 + \xAB\xFE |0 + \xCE\xDE |0 + \xCE\xDB |0 + \xCE\xE3 |0 + \xCE\xE5 |0 + \xAB\xF7 |0 + \xAB\xFB |0 + \xAC\x42 |0 + \xAE\xB3 |0 + \xCE\xE0 |0 + \xAB\xF9 |0 + \xAC\x45 |0 + \xCE\xD9 |0 + \xAB\xFC |0 + \xAE\xB2 |0 + \xAB\xF6 |0 + \xCE\xD6 |0 + \xCE\xDD |0 + \xCE\xD5 |0 + \xCE\xD8 |0 + \xCE\xDC |0 + \xD1\xB2 |0 + \xAC\x44 |0 + \xCE\xE1 |0 + \xCE\xE2 |0 + \xCE\xE4 |0 + \xAB\xF5 |0 + \x8D\x7C |0 + \xAE\xC1 |0 + \xD1\xBE |0 + \xAE\xBF |0 + \xAE\xC0 |0 + \xD1\xB4 |0 + \xD1\xC4 |0 + \x9E\xD6 |0 + \xAE\xB6 |0 + \x93\xAC |0 + \xD5\x66 |0 + \xD1\xC6 |0 + \xD1\xC0 |0 + \x9F\x5B |0 + \xD1\xB7 |0 + \x93\xA9 |0 + \xD1\xC9 |0 + \xD1\xBA |0 + \xAE\xBC |0 + \xD5\x7D |0 + \xD1\xBD |0 + \xAE\xBE |0 + \xAE\xB5 |0 + \xD1\xCB |0 + \xD1\xBF |0 + \xAE\xB8 |0 + \xD1\xB8 |0 + \xD1\xB5 |0 + \xD1\xB6 |0 + \xAE\xB9 |0 + \xD1\xC5 |0 + \xD1\xCC |0 + \xAE\xBB |0 + \xD1\xBC |0 + \xD1\xBB |0 + \xAE\xC3 |0 + \xAE\xC2 |0 + \xAE\xB4 |0 + \xAE\xBA |0 + \xAE\xBD |0 + \xD1\xC8 |0 + \xD1\xC2 |0 + \xAE\xB7 |0 + \xD1\xB3 |0 + \xD1\xCA |0 + \xD1\xC1 |0 + \xD1\xC3 |0 + \xD1\xC7 |0 + \xA0\x7C |0 + \xD5\x67 |0 + \xB1\xB7 |0 + \xB1\xCB |0 + \xB1\xCA |0 + \xB1\xBF |0 + \xFC\xB2 |0 + \xD5\x79 |0 + \xD5\x75 |0 + \xD5\x72 |0 + \xD5\xA6 |0 + \xB1\xBA |0 + \xB1\xB2 |0 + \xD5\x77 |0 + \xB4\xA8 |0 + \xB1\xB6 |0 + \xD5\xA1 |0 + \x8A\xC1 |0 + \xB1\xCC |0 + \xB1\xC9 |0 + \xD5\x7B |0 + \xD5\x6A |0 + \x9F\xB4 |0 + \xB1\xC8 |0 + \xD5\xA3 |0 + \xD5\x69 |0 + \xB1\xBD |0 + \xB1\xC1 |0 + \xD5\xA2 |0 + \xD5\x73 |0 + \xB1\xC2 |0 + \xB1\xBC |0 + \xD5\x68 |0 + \xFC\xAC |0 + \xB4\x78 |0 + \xD5\xA5 |0 + \xD5\x71 |0 + \xB1\xC7 |0 + \xD5\x74 |0 + \xD5\xA4 |0 + \xB1\xC6 |0 + \xD9\x52 |0 + \xB1\xB3 |0 + \xD5\x6F |0 + \xB1\xB8 |0 + \xB1\xC3 |0 + \xB1\xBE |0 + \xD5\x78 |0 + \xD5\x6E |0 + \xD5\x6C |0 + \xD5\x7E |0 + \xB1\xB0 |0 + \xB1\xC4 |0 + \xB1\xB4 |0 + \xB4\x77 |0 + \xD5\x7C |0 + \xB1\xB5 |0 + \xB1\xB1 |0 + \xB1\xC0 |0 + \xB1\xBB |0 + \xB1\xB9 |0 + \xD5\x70 |0 + \xB1\xC5 |0 + \xD5\x6D |0 + \xD5\x7A |0 + \xD5\x76 |0 + \xD9\x54 |0 + \xD9\x53 |0 + \x9E\x4C |0 + \xD5\x6B |0 + \xD9\x64 |0 + \xB4\x7A |0 + \x8F\xC5 |0 + \xD9\x6A |0 + \xD9\x59 |0 + \xD9\x67 |0 + \xDD\x77 |0 + \xB4\x7D |0 + \xD9\x6B |0 + \xD9\x6E |0 + \xB4\x7C |0 + \xD9\x5C |0 + \xD9\x6D |0 + \xD9\x6C |0 + \xB4\x7E |0 + \xD9\x55 |0 + \xB4\x79 |0 + \xB4\xA3 |0 + \x93\xAD |0 + \xB4\xA1 |0 + \xD9\x69 |0 + \xD9\x5F |0 + \xB4\xA5 |0 + \xD9\x70 |0 + \xD9\x68 |0 + \xD9\x71 |0 + \xB4\xAD |0 + \xB4\xAB |0 + \xD9\x66 |0 + \xD9\x65 |0 + \x9D\xC3 |0 + \xD9\x63 |0 + \xD9\x5D |0 + \xB4\xA4 |0 + \x8D\xA2 |0 + \xB4\xA2 |0 + \xD1\xB9 |0 + \xD9\x56 |0 + \x9D\x4A |0 + \xDD\xB7 |0 + \xD9\x57 |0 + \xB4\x7B |0 + \xB4\xAA |0 + \xDD\x79 |0 + \xB4\xA6 |0 + \xB4\xA7 |0 + \xD9\x58 |0 + \xD9\x6F |0 + \xDD\x78 |0 + \xD9\x60 |0 + \xD9\x5B |0 + \xB4\xA9 |0 + \xD9\x61 |0 + \xD9\x5E |0 + \xFC\xB6 |0 + \xB4\xAE |0 + \x8D\xA3 |0 + \x9E\x4B |0 + \x9E\x4D |0 + \xB7\x70 |0 + \x8D\xA4 |0 + \xDD\x7C |0 + \xDD\xB1 |0 + \xDD\xB6 |0 + \xDD\xAA |0 + \xB7\x6C |0 + \xDD\xBB |0 + \xB7\x69 |0 + \xDD\x7A |0 + \xDD\x7B |0 + \xB7\x62 |0 + \xB7\x6B |0 + \xDD\xA4 |0 + \xB7\x6E |0 + \xB7\x6F |0 + \xDD\xA5 |0 + \xDD\xB2 |0 + \xDD\xB8 |0 + \xB7\x6A |0 + \xB7\x64 |0 + \xDD\xA3 |0 + \xDD\x7D |0 + \xDD\xBA |0 + \xDD\xA8 |0 + \xDD\xA9 |0 + \xDD\x7E |0 + \xDD\xB4 |0 + \xDD\xAB |0 + \xDD\xB5 |0 + \xDD\xAD |0 + \xB7\x65 |0 + \xE1\xD9 |0 + \xB7\x68 |0 + \xB7\x66 |0 + \xDD\xB9 |0 + \xDD\xB0 |0 + \xDD\xAC |0 + \x8A\xFD |0 + \xDD\xA1 |0 + \xBA\x53 |0 + \xDD\xAF |0 + \xB7\x6D |0 + \xDD\xA7 |0 + \xFC\xB5 |0 + \xDD\xA6 |0 + \xFC\xC3 |0 + \x93\xB2 |0 + \xB7\x67 |0 + \xB7\x63 |0 + \xE1\xEE |0 + \xDD\xB3 |0 + \xDD\xAE |0 + \xDD\xA2 |0 + \xE1\xE9 |0 + \xE1\xDA |0 + \xE1\xE5 |0 + \xE1\xEC |0 + \xBA\x51 |0 + \xB4\xAC |0 + \xE1\xEA |0 + \xBA\x4C |0 + \xBA\x4B |0 + \xE1\xF1 |0 + \x8D\xA5 |0 + \xE1\xDB |0 + \xE1\xE8 |0 + \xE1\xDC |0 + \xE1\xE7 |0 + \xBA\x4F |0 + \xE1\xEB |0 + \xD9\x62 |0 + \xE1\xF2 |0 + \xE1\xE3 |0 + \xBA\x52 |0 + \xE5\xBA |0 + \xBC\xAF |0 + \xE1\xF0 |0 + \xE1\xEF |0 + \xBA\x54 |0 + \xE5\xAD |0 + \xBC\xB0 |0 + \xE5\xAE |0 + \x93\xA1 |0 + \xE1\xDF |0 + \xE1\xE0 |0 + \xE1\xDD |0 + \xE1\xE2 |0 + \xE1\xDE |0 + \xE1\xF3 |0 + \xBA\x4E |0 + \xBC\xB1 |0 + \xBA\x50 |0 + \xBA\x55 |0 + \x8A\xC6 |0 + \xE1\xE1 |0 + \xE1\xED |0 + \xE1\xE6 |0 + \xE5\xB1 |0 + \xBA\x4A |0 + \xBC\xB4 |0 + \xE9\xAA |0 + \xE5\xB6 |0 + \xE5\xB5 |0 + \xE5\xB7 |0 + \x8A\x5B |0 + \xE5\xB4 |0 + \xBC\xB5 |0 + \x89\x4D |0 + \xBC\xBB |0 + \xBC\xB8 |0 + \xBC\xB9 |0 + \xE5\xAF |0 + \xE5\xB2 |0 + \xE5\xBC |0 + \xBC\xC1 |0 + \xBC\xBF |0 + \xE5\xB3 |0 + \xD9\x5A |0 + \xBC\xB2 |0 + \xE5\xB9 |0 + \xE5\xB0 |0 + \xBC\xC2 |0 + \xE5\xB8 |0 + \xBA\x4D |0 + \xBC\xB7 |0 + \xE1\xE4 |0 + \xBC\xBA |0 + \xBC\xBE |0 + \xBC\xC0 |0 + \xBC\xBD |0 + \xBC\xBC |0 + \xFE\xD4 |0 + \xBC\xB6 |0 + \xE5\xBB |0 + \xBC\xB3 |0 + \xBC\xC3 |0 + \x8A\x78 |0 + \x93\xAB |0 + \xBE\xD8 |0 + \xBE\xD9 |0 + \xE9\xA9 |0 + \xBE\xE2 |0 + \xBE\xDF |0 + \x8D\xA7 |0 + \xBE\xD6 |0 + \xBE\xDD |0 + \xE9\xAB |0 + \xBE\xDB |0 + \xBE\xD5 |0 + \xBE\xDC |0 + \xE9\xA8 |0 + \xC0\xBB |0 + \xBE\xD7 |0 + \xBE\xDE |0 + \xC0\xBA |0 + \xE9\xA7 |0 + \xE9\xA6 |0 + \xBE\xE0 |0 + \x9F\x45 |0 + \xBE\xE1 |0 + \xE9\xA5 |0 + \xE9\xA4 |0 + \xC0\xBC |0 + \xE9\xAE |0 + \xBE\xDA |0 + \xE9\xAC |0 + \x8A\x56 |0 + \xC0\xBD |0 + \xFC\xBF |0 + \xC0\xC2 |0 + \xEC\xEA |0 + \xEC\xEC |0 + \xFC\xC0 |0 + \xC0\xBF |0 + \x8E\xE6 |0 + \xEC\xED |0 + \xEC\xE9 |0 + \x8A\xA4 |0 + \xEC\xEB |0 + \xC0\xC0 |0 + \xC0\xC3 |0 + \xEC\xE8 |0 + \xC0\xBE |0 + \xC0\xC1 |0 + \xC2\x59 |0 + \xE9\xAD |0 + \xC2\x58 |0 + \xC2\x5E |0 + \xEF\xD4 |0 + \xC2\x5C |0 + \xC2\x5D |0 + \xEF\xD7 |0 + \xEF\xD3 |0 + \xC2\x5A |0 + \xEF\xD1 |0 + \xC3\x6B |0 + \xEF\xD5 |0 + \xEF\xD6 |0 + \xEF\xD2 |0 + \xC2\x5B |0 + \xF2\x42 |0 + \xF2\x45 |0 + \x89\x43 |0 + \xF2\x46 |0 + \xF2\x44 |0 + \xF2\x47 |0 + \xC3\x6C |0 + \xF2\x43 |0 + \x93\xF3 |0 + \xF4\x4E |0 + \xC4\x64 |0 + \xF4\x4D |0 + \xF4\x4C |0 + \xF4\x4B |0 + \xC4\x63 |0 + \xC4\x65 |0 + \xF5\xCD |0 + \xC4\xE2 |0 + \xC4\xE1 |0 + \xFC\xAB |0 + \x9E\xA2 |0 + \xF6\xE1 |0 + \xF6\xE0 |0 + \xF6\xE3 |0 + \xC5\xCB |0 + \xC5\x75 |0 + \xF7\xDD |0 + \xF6\xE2 |0 + \xF7\xDC |0 + \xC5\xCD |0 + \xC5\xCC |0 + \xC5\xF3 |0 + \xF8\xA9 |0 + \xF8\xEF |0 + \xA4\xE4 |0 + \x9D\xC7 |0 + \xD9\x72 |0 + \xE9\xAF |0 + \xC6\xD2 |0 + \x8B\xCE |0 + \xA6\xAC |0 + \xCA\xF7 |0 + \xA7\xF1 |0 + \xA7\xEF |0 + \xA7\xF0 |0 + \xCC\xC1 |0 + \xA9\xF1 |0 + \xAC\x46 |0 + \xCE\xE7 |0 + \xCE\xE8 |0 + \xAC\x47 |0 + \xD1\xCE |0 + \xAE\xC4 |0 + \xAE\xC5 |0 + \xD1\xCD |0 + \xFC\xC5 |0 + \xB1\xD3 |0 + \xB1\xCF |0 + \xD5\xA7 |0 + \xB1\xD6 |0 + \xB1\xD5 |0 + \xB1\xCE |0 + \xB1\xD1 |0 + \xB1\xD4 |0 + \xB1\xD0 |0 + \xD9\x76 |0 + \xB1\xCD |0 + \xB4\xAF |0 + \xFC\xCB |0 + \xB4\xB1 |0 + \xB4\xB2 |0 + \xD9\x75 |0 + \xD9\x78 |0 + \xB4\xB0 |0 + \xD9\x73 |0 + \xD9\x77 |0 + \xD9\x74 |0 + \x93\xB3 |0 + \xB7\x71 |0 + \xFC\xCA |0 + \xDD\xBC |0 + \xBA\x56 |0 + \xE1\xF4 |0 + \xBE\xE3 |0 + \xBC\xC4 |0 + \xE5\xBD |0 + \xBC\xC5 |0 + \xBC\xC6 |0 + \xE5\xBF |0 + \xE5\xBE |0 + \xE5\xC0 |0 + \xE9\xB1 |0 + \xE9\xB0 |0 + \xEC\xEF |0 + \xEC\xEE |0 + \xC0\xC4 |0 + \xC0\xC5 |0 + \xF2\x48 |0 + \xFC\xC9 |0 + \x8D\xAC |0 + \xA4\xE5 |0 + \xFB\xC6 |0 + \x89\x67 |0 + \x8C\x7E |0 + \xD9\x79 |0 + \xB4\xB4 |0 + \xB4\xB3 |0 + \xDD\xBD |0 + \xEF\xD8 |0 + \xC4\xE3 |0 + \xF7\xDE |0 + \xA4\xE6 |0 + \xAE\xC6 |0 + \xB1\xD8 |0 + \xB1\xD7 |0 + \xD9\x7A |0 + \xD9\x7B |0 + \xB7\x72 |0 + \xE1\xF5 |0 + \xBA\x57 |0 + \xE9\xB2 |0 + \xA4\xE7 |0 + \xA5\xB8 |0 + \xA9\xF2 |0 + \xCC\xC2 |0 + \xCE\xE9 |0 + \xAC\x48 |0 + \xB1\xD9 |0 + \xD9\x7C |0 + \xB4\xB5 |0 + \xB7\x73 |0 + \xE5\xC1 |0 + \xE5\xC2 |0 + \xFC\xCD |0 + \xEC\xF0 |0 + \xC2\x5F |0 + \xF8\xF0 |0 + \xA4\xE8 |0 + \xCC\xC3 |0 + \xA9\xF3 |0 + \xAC\x49 |0 + \x9C\xF3 |0 + \xCE\xEA |0 + \xAE\xC7 |0 + \xD1\xD2 |0 + \xD1\xD0 |0 + \xD1\xD1 |0 + \xAE\xC8 |0 + \xD1\xCF |0 + \xB1\xDB |0 + \xB1\xDC |0 + \xD5\xA8 |0 + \xB1\xDD |0 + \xB1\xDA |0 + \xD9\x7D |0 + \xFC\xD0 |0 + \xD9\x7E |0 + \xDD\xBE |0 + \x95\xBB |0 + \xBA\x59 |0 + \xBA\x58 |0 + \xEC\xF1 |0 + \xEF\xD9 |0 + \xF2\x4A |0 + \xF2\x49 |0 + \xF4\x4F |0 + \xFC\xD3 |0 + \xC9\x5E |0 + \xAC\x4A |0 + \xFC\xD4 |0 + \xA4\xE9 |0 + \xA5\xB9 |0 + \xA6\xAE |0 + \xA6\xAD |0 + \xA6\xAF |0 + \xA6\xB0 |0 + \xC9\xEE |0 + \xC9\xED |0 + \xCA\xF8 |0 + \xA7\xF2 |0 + \xCA\xFB |0 + \xCA\xFA |0 + \xCA\xF9 |0 + \xCA\xFC |0 + \xA9\xF4 |0 + \xCC\xC9 |0 + \xCC\xC5 |0 + \xCC\xCE |0 + \x8D\xAE |0 + \xA9\xFB |0 + \xA9\xF9 |0 + \xCC\xCA |0 + \xCC\xC6 |0 + \xCC\xCD |0 + \xA9\xF8 |0 + \xAA\x40 |0 + \xCC\xC8 |0 + \xCC\xC4 |0 + \xA9\xFE |0 + \xCC\xCB |0 + \xA9\xF7 |0 + \xCC\xCC |0 + \xA9\xFA |0 + \xA9\xFC |0 + \xCC\xD0 |0 + \xCC\xCF |0 + \xCC\xC7 |0 + \xA9\xF6 |0 + \xA9\xF5 |0 + \xA9\xFD |0 + \xFC\xD7 |0 + \xCE\xEF |0 + \xCE\xF5 |0 + \x93\xDB |0 + \xAC\x50 |0 + \xAC\x4D |0 + \xCE\xEC |0 + \xCE\xF1 |0 + \xFE\x63 |0 + \xAC\x53 |0 + \xAC\x4B |0 + \xCE\xF0 |0 + \xAC\x4E |0 + \xAC\x51 |0 + \xCE\xF3 |0 + \xAC\x4C |0 + \xCE\xF8 |0 + \xAC\x4F |0 + \x93\xD5 |0 + \xAC\x52 |0 + \xCE\xED |0 + \xCE\xF2 |0 + \xCE\xF6 |0 + \xCE\xEE |0 + \xCE\xEB |0 + \xCE\xF7 |0 + \xCE\xF4 |0 + \xAE\xD0 |0 + \xAE\xC9 |0 + \xAE\xCC |0 + \xFC\xDA |0 + \xAE\xCF |0 + \xD1\xD5 |0 + \x9B\x71 |0 + \xAE\xCA |0 + \xD1\xD3 |0 + \xFC\xDD |0 + \xAE\xCE |0 + \xAE\xCB |0 + \xD1\xD6 |0 + \xAE\xCD |0 + \x8D\xAF |0 + \xFA\xF2 |0 + \xD5\xAC |0 + \xB1\xDF |0 + \xD5\xAB |0 + \xD5\xAD |0 + \xB1\xDE |0 + \xB1\xE3 |0 + \xD1\xD4 |0 + \xD5\xAA |0 + \xD5\xAE |0 + \x93\xD8 |0 + \xB1\xE0 |0 + \xD5\xA9 |0 + \xB1\xE2 |0 + \xFC\xDF |0 + \xB1\xE1 |0 + \xD9\xA7 |0 + \x93\xD3 |0 + \xD9\xA2 |0 + \xB4\xB6 |0 + \xB4\xBA |0 + \xB4\xB7 |0 + \xD9\xA5 |0 + \xD9\xA8 |0 + \xFC\xE1 |0 + \xB4\xB8 |0 + \xB4\xB9 |0 + \xB4\xBE |0 + \xDD\xC7 |0 + \xD9\xA6 |0 + \xB4\xBC |0 + \xD9\xA3 |0 + \xD9\xA1 |0 + \x8E\x76 |0 + \xB4\xBD |0 + \xD9\xA4 |0 + \xB7\x79 |0 + \xFC\x62 |0 + \xDD\xBF |0 + \xB7\x76 |0 + \xB7\x77 |0 + \xB7\x75 |0 + \xDD\xC4 |0 + \xDD\xC3 |0 + \xDD\xC0 |0 + \xB7\x7B |0 + \x93\xD1 |0 + \xDD\xC2 |0 + \xB4\xBB |0 + \x8D\xB1 |0 + \xDD\xC6 |0 + \xDD\xC1 |0 + \xB7\x78 |0 + \xB7\x74 |0 + \xB7\x7A |0 + \xDD\xC5 |0 + \x98\x59 |0 + \xBA\x5C |0 + \xE1\xF8 |0 + \xE1\xF7 |0 + \xE1\xF6 |0 + \xBA\x5A |0 + \xFB\x52 |0 + \xBA\x5B |0 + \xE5\xC5 |0 + \xE5\xC8 |0 + \xBC\xC8 |0 + \xFB\x53 |0 + \xBC\xC7 |0 + \xE5\xC9 |0 + \xE5\xC4 |0 + \xBC\xCA |0 + \xE5\xC6 |0 + \xFB\x4D |0 + \xBC\xC9 |0 + \xE5\xC3 |0 + \x9C\xBF |0 + \xE5\xC7 |0 + \xBE\xE9 |0 + \xBE\xE6 |0 + \xE9\xBB |0 + \xE9\xBA |0 + \xE9\xB9 |0 + \xE9\xB4 |0 + \x9B\x72 |0 + \xE9\xB5 |0 + \xBE\xE7 |0 + \xBE\xE4 |0 + \xBE\xE8 |0 + \xE9\xB3 |0 + \xBE\xE5 |0 + \xE9\xB6 |0 + \xE9\xB7 |0 + \xE9\xBC |0 + \xFB\x50 |0 + \x93\xBE |0 + \xE9\xB8 |0 + \xEC\xF2 |0 + \xC0\xC7 |0 + \xEF\xDC |0 + \xC0\xC6 |0 + \xEF\xDA |0 + \xEF\xDB |0 + \xC2\x60 |0 + \xC3\x6E |0 + \xF2\x4B |0 + \xC3\x6D |0 + \xF4\x51 |0 + \xF4\x52 |0 + \xC4\x66 |0 + \xF4\x50 |0 + \xC4\xE4 |0 + \xF7\xDF |0 + \xC5\xCE |0 + \xF8\xAA |0 + \xF8\xAB |0 + \xA4\xEA |0 + \x9D\xF1 |0 + \xA6\xB1 |0 + \xA6\xB2 |0 + \xA7\xF3 |0 + \xCC\xD1 |0 + \xAC\x54 |0 + \xAE\xD1 |0 + \xB1\xE4 |0 + \xB0\xD2 |0 + \xB4\xBF |0 + \xB4\xC0 |0 + \xB3\xCC |0 + \xD9\xA9 |0 + \xFC\xEB |0 + \xB7\x7C |0 + \xE1\xFA |0 + \xE1\xF9 |0 + \xA4\xEB |0 + \xA6\xB3 |0 + \xCC\xD2 |0 + \xAA\x42 |0 + \xA0\xBB |0 + \xAA\x41 |0 + \x9B\x7E |0 + \xCE\xF9 |0 + \xCE\xFA |0 + \xD1\xD7 |0 + \xD1\xD8 |0 + \xAE\xD2 |0 + \xAE\xD3 |0 + \x8D\xB3 |0 + \xAE\xD4 |0 + \xD5\xAF |0 + \x8C\x52 |0 + \xB1\xE6 |0 + \xB4\xC2 |0 + \x9A\xE8 |0 + \xB4\xC1 |0 + \xDD\xC8 |0 + \xDF\x7A |0 + \xE1\xFB |0 + \xE9\xBD |0 + \x8E\xDC |0 + \xC2\x61 |0 + \xC4\x67 |0 + \xA4\xEC |0 + \xA5\xBC |0 + \xA5\xBD |0 + \xA5\xBB |0 + \xA5\xBE |0 + \xA5\xBA |0 + \xA6\xB6 |0 + \xC9\xF6 |0 + \xA6\xB5 |0 + \xA6\xB7 |0 + \x9C\xF9 |0 + \xC9\xF1 |0 + \xC9\xF0 |0 + \xC9\xF3 |0 + \xC9\xF2 |0 + \xC9\xF5 |0 + \xA6\xB4 |0 + \xC9\xEF |0 + \xC9\xF4 |0 + \xFA\x50 |0 + \xCA\xFD |0 + \xA7\xFD |0 + \xCA\xFE |0 + \xCB\x43 |0 + \xA7\xFC |0 + \xCB\x47 |0 + \xCB\x42 |0 + \xCB\x45 |0 + \xA7\xF5 |0 + \xA7\xF6 |0 + \xA7\xF7 |0 + \xA7\xF8 |0 + \xA8\x40 |0 + \xCB\x41 |0 + \xA7\xFA |0 + \xA8\x41 |0 + \xCB\x40 |0 + \xCB\x46 |0 + \xA7\xF9 |0 + \xCB\x44 |0 + \xA7\xFB |0 + \xA7\xF4 |0 + \xA7\xFE |0 + \x98\xE7 |0 + \xFC\xF3 |0 + \xFC\xF2 |0 + \xAA\x57 |0 + \x8C\xCA |0 + \xCC\xD4 |0 + \xAA\x43 |0 + \xAA\x4D |0 + \xAA\x4E |0 + \xAA\x46 |0 + \xAA\x58 |0 + \xAA\x48 |0 + \xCC\xDC |0 + \xAA\x53 |0 + \xCC\xD7 |0 + \xAA\x49 |0 + \xCC\xE6 |0 + \xCC\xE7 |0 + \xCC\xDF |0 + \xCC\xD8 |0 + \xAA\x56 |0 + \xCC\xE4 |0 + \xAA\x51 |0 + \xAA\x4F |0 + \xCC\xE5 |0 + \xCC\xE3 |0 + \xCC\xDB |0 + \xCC\xD3 |0 + \xCC\xDA |0 + \xAA\x4A |0 + \xAA\x50 |0 + \xAA\x44 |0 + \xCC\xDE |0 + \xCC\xDD |0 + \xCC\xD5 |0 + \x93\xE5 |0 + \xAA\x52 |0 + \xCC\xE1 |0 + \xCC\xD6 |0 + \xAA\x55 |0 + \xCC\xE8 |0 + \xAA\x45 |0 + \xAA\x4C |0 + \xCC\xD9 |0 + \xCC\xE2 |0 + \xAA\x54 |0 + \xAA\x47 |0 + \xAA\x4B |0 + \xCC\xE0 |0 + \x9A\x59 |0 + \x8D\xB5 |0 + \xFD\x4D |0 + \xCF\x5B |0 + \xAC\x5C |0 + \xAC\x69 |0 + \xFD\x5E |0 + \xCF\x56 |0 + \xCF\x4C |0 + \xAC\x62 |0 + \xCF\x4A |0 + \xAC\x5B |0 + \xCF\x45 |0 + \xAC\x65 |0 + \xCF\x52 |0 + \xCE\xFE |0 + \xCF\x41 |0 + \x8F\x7D |0 + \xCF\x44 |0 + \xCE\xFB |0 + \xCF\x51 |0 + \xCF\x61 |0 + \xAC\x60 |0 + \xCF\x46 |0 + \xCF\x58 |0 + \xCE\xFD |0 + \xCF\x5F |0 + \xCF\x60 |0 + \xCF\x63 |0 + \xCF\x5A |0 + \xCF\x4B |0 + \xCF\x53 |0 + \xAC\x66 |0 + \xAC\x59 |0 + \xAC\x61 |0 + \xAC\x6D |0 + \xAC\x56 |0 + \xAC\x58 |0 + \x95\x47 |0 + \xFC\xF6 |0 + \xCF\x43 |0 + \xAC\x6A |0 + \xAC\x63 |0 + \xCF\x5D |0 + \xCF\x40 |0 + \xAC\x6C |0 + \xAC\x67 |0 + \xCF\x49 |0 + \xAC\x6B |0 + \xCF\x50 |0 + \xCF\x48 |0 + \xAC\x64 |0 + \xCF\x5C |0 + \xCF\x54 |0 + \xAC\x5E |0 + \xCF\x62 |0 + \xCF\x47 |0 + \xAC\x5A |0 + \xCF\x59 |0 + \xCF\x4F |0 + \xAC\x5F |0 + \xCF\x55 |0 + \xAC\x57 |0 + \xCE\xFC |0 + \xAC\x68 |0 + \xAE\xE3 |0 + \xAC\x5D |0 + \xCF\x4E |0 + \xCF\x4D |0 + \xCF\x42 |0 + \x92\x50 |0 + \xCF\x5E |0 + \xCF\x57 |0 + \x89\x68 |0 + \xAC\x55 |0 + \x8D\xB6 |0 + \xFC\xFB |0 + \xA0\x7D |0 + \x98\xFC |0 + \x89\x69 |0 + \xFE\x4F |0 + \x92\x56 |0 + \xD1\xEC |0 + \xAE\xEA |0 + \xD1\xED |0 + \xD1\xE1 |0 + \xAE\xDF |0 + \xAE\xEB |0 + \xD1\xDA |0 + \xFA\xC9 |0 + \xD1\xE3 |0 + \xD1\xEB |0 + \x93\xE8 |0 + \xD1\xD9 |0 + \xD1\xF4 |0 + \xAE\xD5 |0 + \xFC\xF8 |0 + \xD1\xF3 |0 + \xD1\xEE |0 + \xD1\xEF |0 + \xAE\xDD |0 + \xAE\xE8 |0 + \xD1\xE5 |0 + \xD1\xE6 |0 + \xD1\xF0 |0 + \xD1\xE7 |0 + \xD1\xE2 |0 + \xD1\xDC |0 + \xD1\xDD |0 + \xD1\xEA |0 + \xD1\xE4 |0 + \x9C\xE3 |0 + \xFD\xA9 |0 + \xAE\xD6 |0 + \xAE\xDA |0 + \xD1\xF2 |0 + \xD1\xDE |0 + \xAE\xE6 |0 + \xAE\xE2 |0 + \xFC\x44 |0 + \xAE\xE5 |0 + \xAE\xEC |0 + \xAE\xDB |0 + \xAE\xE7 |0 + \xD1\xE9 |0 + \xAE\xE9 |0 + \xAE\xD8 |0 + \x96\x40 |0 + \xAE\xD7 |0 + \xD1\xDB |0 + \x8D\xB8 |0 + \xD1\xDF |0 + \xAE\xE0 |0 + \xD1\xF1 |0 + \xD1\xE8 |0 + \xD1\xE0 |0 + \xAE\xE4 |0 + \xAE\xE1 |0 + \xAE\xD9 |0 + \xAE\xDC |0 + \x9B\x4A |0 + \x8F\xB9 |0 + \xFC\xFE |0 + \x89\x6A |0 + \xD5\xC4 |0 + \xD5\xB4 |0 + \xD5\xB5 |0 + \xD5\xB9 |0 + \xD5\xC8 |0 + \xD5\xC5 |0 + \xD5\xBE |0 + \xD5\xBD |0 + \xB1\xED |0 + \xD5\xC1 |0 + \xD5\xD0 |0 + \xD5\xB0 |0 + \xD5\xD1 |0 + \xD5\xC3 |0 + \xD5\xD5 |0 + \xD5\xC9 |0 + \xB1\xEC |0 + \xD5\xC7 |0 + \xB1\xE7 |0 + \xB1\xFC |0 + \xB1\xF2 |0 + \x8D\xB9 |0 + \xB1\xF6 |0 + \xB1\xF5 |0 + \xD5\xB1 |0 + \x91\x7E |0 + \xD5\xCE |0 + \xD5\xD4 |0 + \xD5\xCC |0 + \xD5\xD3 |0 + \xD5\xC0 |0 + \xD5\xB2 |0 + \xD5\xD2 |0 + \xD5\xC2 |0 + \xB1\xEA |0 + \xB1\xF7 |0 + \xD5\xCB |0 + \xB1\xF0 |0 + \x93\xF4 |0 + \xD5\xCA |0 + \xD5\xB3 |0 + \xB1\xF8 |0 + \xB1\xFA |0 + \xD5\xCD |0 + \xB1\xFB |0 + \xB1\xE9 |0 + \xD5\xBA |0 + \xD5\xCF |0 + \xFB\x7C |0 + \xB1\xEF |0 + \xB1\xF9 |0 + \xD5\xBC |0 + \xD5\xC6 |0 + \xD5\xB7 |0 + \xD5\xBB |0 + \xB1\xF4 |0 + \xD5\xB6 |0 + \xB1\xE8 |0 + \xB1\xF1 |0 + \xB1\xEE |0 + \xD5\xBF |0 + \xAE\xDE |0 + \xD9\xC0 |0 + \xB1\xEB |0 + \x93\xE7 |0 + \x97\xEF |0 + \xFE\x4A |0 + \xFD\x45 |0 + \xB1\xF3 |0 + \x96\xA5 |0 + \xD9\xC3 |0 + \xD9\xD9 |0 + \xD9\xCE |0 + \xB4\xD6 |0 + \xFE\xE0 |0 + \xB4\xD1 |0 + \xD9\xBD |0 + \xB4\xD2 |0 + \xD9\xCD |0 + \xD9\xC6 |0 + \xD9\xD3 |0 + \xB4\xCE |0 + \xD9\xAB |0 + \xD9\xD5 |0 + \xB4\xC4 |0 + \xD9\xB3 |0 + \xB4\xC7 |0 + \xB4\xC6 |0 + \xB4\xD7 |0 + \xD9\xAD |0 + \xD9\xCF |0 + \xD9\xD0 |0 + \xB4\xC9 |0 + \xB4\xC5 |0 + \xD9\xBB |0 + \xB4\xD0 |0 + \xD9\xB6 |0 + \xD9\xD1 |0 + \xB4\xCC |0 + \xD9\xC9 |0 + \xD9\xD6 |0 + \xD9\xB0 |0 + \xD9\xB5 |0 + \xD9\xAF |0 + \xB4\xCB |0 + \xD9\xC2 |0 + \xDD\xDE |0 + \xD9\xB1 |0 + \xB4\xCF |0 + \xD9\xBA |0 + \xD9\xD2 |0 + \xB4\xCA |0 + \xD9\xB7 |0 + \xD9\xB4 |0 + \xD9\xC5 |0 + \xB4\xCD |0 + \xB4\xC3 |0 + \xB4\xD9 |0 + \xD9\xC8 |0 + \xD9\xC7 |0 + \xFD\x48 |0 + \xFD\x47 |0 + \xFE\xF2 |0 + \xFE\x6A |0 + \xD9\xAC |0 + \xB4\xC8 |0 + \xD9\xD4 |0 + \xD9\xBC |0 + \xD9\xBE |0 + \x8D\xBD |0 + \xD9\xCB |0 + \xD9\xCA |0 + \xD9\xAA |0 + \xB4\xD3 |0 + \xB4\xD5 |0 + \xD9\xB2 |0 + \xD9\xB9 |0 + \xD9\xC1 |0 + \xB4\xD4 |0 + \xD9\xB8 |0 + \xD9\xC4 |0 + \xD9\xD7 |0 + \xD9\xCC |0 + \x9B\xA1 |0 + \x8C\xA2 |0 + \x9A\xB7 |0 + \x8E\xFC |0 + \xD9\xD8 |0 + \xD9\xAE |0 + \x9F\xA1 |0 + \xDD\xF2 |0 + \xB7\xA6 |0 + \xDD\xF0 |0 + \xDD\xDB |0 + \xDD\xE0 |0 + \xDD\xD9 |0 + \xFD\x51 |0 + \xDD\xEC |0 + \xDD\xCB |0 + \xDD\xD2 |0 + \xDD\xEA |0 + \xDD\xF4 |0 + \xDD\xDC |0 + \xFA\xAD |0 + \xDD\xCF |0 + \xDD\xE2 |0 + \xDD\xE7 |0 + \xDD\xD3 |0 + \x8D\xBE |0 + \xDD\xE4 |0 + \xDD\xD0 |0 + \x89\xA4 |0 + \xDD\xD7 |0 + \xDD\xD8 |0 + \xB7\xA8 |0 + \xDD\xEB |0 + \xDD\xE9 |0 + \xDD\xCC |0 + \xDD\xEE |0 + \xDD\xEF |0 + \xDD\xF1 |0 + \xB7\xAC |0 + \xB7\xA4 |0 + \x9A\xD9 |0 + \xD5\xB8 |0 + \xDD\xD4 |0 + \xDD\xE6 |0 + \xDD\xD5 |0 + \xB7\xA1 |0 + \xB7\xB1 |0 + \xDD\xED |0 + \xB7\xAF |0 + \xB7\xAB |0 + \xDD\xCA |0 + \xB7\xA3 |0 + \xFD\x4E |0 + \xDD\xCD |0 + \xB7\xB0 |0 + \x8D\xC0 |0 + \xDD\xDD |0 + \xDD\xC9 |0 + \x97\xF0 |0 + \xB7\xA9 |0 + \xDD\xE1 |0 + \xDD\xD1 |0 + \xB7\xAA |0 + \xDD\xDA |0 + \xB7\x7E |0 + \xB4\xD8 |0 + \xDD\xE3 |0 + \xD9\xBF |0 + \xDD\xCE |0 + \x93\xB4 |0 + \xFD\x44 |0 + \xDD\xE8 |0 + \xB7\xA5 |0 + \xDD\xE5 |0 + \xB7\xA2 |0 + \xDD\xDF |0 + \xB7\xAD |0 + \xDD\xD6 |0 + \xDD\xF3 |0 + \x9F\xA7 |0 + \xB7\xA7 |0 + \xDE\xC6 |0 + \x8D\xC2 |0 + \xB7\xAE |0 + \x99\xB6 |0 + \xE2\x4A |0 + \xE2\x48 |0 + \xE2\x5E |0 + \xE2\x46 |0 + \xE2\x58 |0 + \xB7\x7D |0 + \xBA\x5F |0 + \xE2\x42 |0 + \xE2\x5D |0 + \xFD\x52 |0 + \xE2\x47 |0 + \xE2\x55 |0 + \xBA\x64 |0 + \xBA\x5D |0 + \xE2\x5B |0 + \x8D\xC1 |0 + \xE2\x40 |0 + \xE2\x5A |0 + \x8E\x46 |0 + \xBA\x6F |0 + \xE2\x51 |0 + \xE2\x61 |0 + \xBA\x6D |0 + \xE2\x49 |0 + \xBA\x5E |0 + \xE2\x4B |0 + \xE2\x59 |0 + \xBA\x67 |0 + \xE2\x44 |0 + \xBA\x6B |0 + \xBA\x61 |0 + \xE2\x4D |0 + \xE2\x43 |0 + \xE1\xFC |0 + \xA0\xD1 |0 + \xE2\x57 |0 + \xBA\x68 |0 + \xE2\x60 |0 + \xE1\xFD |0 + \xBA\x65 |0 + \xE2\x53 |0 + \xBA\x66 |0 + \xE2\x45 |0 + \xE2\x50 |0 + \xE2\x4C |0 + \xE2\x4E |0 + \x9F\xCA |0 + \xBA\x60 |0 + \xE2\x5F |0 + \xBA\x6E |0 + \xE2\x4F |0 + \xE2\x62 |0 + \xE1\xFE |0 + \xE2\x54 |0 + \xBA\x63 |0 + \xBA\x6C |0 + \xBA\x6A |0 + \xE2\x41 |0 + \xE2\x56 |0 + \xBA\x69 |0 + \x92\xCF |0 + \xBA\x62 |0 + \xE2\x52 |0 + \x9C\xF4 |0 + \x8D\xC4 |0 + \xE2\x5C |0 + \xFD\x41 |0 + \xE5\xD5 |0 + \xE5\xD1 |0 + \xE5\xCD |0 + \xE5\xE1 |0 + \xE5\xDE |0 + \xBC\xCD |0 + \x9B\x4C |0 + \xE5\xE5 |0 + \xE5\xD4 |0 + \xBC\xD8 |0 + \xE5\xDB |0 + \xE5\xD0 |0 + \xE5\xDA |0 + \xBC\xD5 |0 + \xE5\xEE |0 + \xE5\xEB |0 + \xE5\xDD |0 + \xE5\xCE |0 + \xFD\x57 |0 + \xFC\xEF |0 + \xE5\xE2 |0 + \xE5\xE4 |0 + \xBC\xD1 |0 + \xE5\xD8 |0 + \xE5\xD3 |0 + \xE5\xCA |0 + \xBC\xCE |0 + \xBC\xD6 |0 + \x9C\xDE |0 + \xE5\xE7 |0 + \xBC\xD7 |0 + \xE5\xCB |0 + \xE5\xED |0 + \xE5\xE0 |0 + \xE5\xE6 |0 + \xBC\xD4 |0 + \xFD\x42 |0 + \x98\x6C |0 + \xE5\xE3 |0 + \xE5\xEA |0 + \xBC\xD9 |0 + \xBC\xD3 |0 + \xE5\xDC |0 + \xE5\xCF |0 + \xE5\xEF |0 + \xE5\xCC |0 + \xE5\xE8 |0 + \xBC\xD0 |0 + \x97\xF9 |0 + \xE5\xD6 |0 + \x95\x58 |0 + \xE5\xD7 |0 + \xBC\xCF |0 + \xBC\xCC |0 + \xE5\xD2 |0 + \xBC\xD2 |0 + \xBC\xCB |0 + \xE5\xE9 |0 + \xE5\xEC |0 + \xE5\xD9 |0 + \xE9\xCA |0 + \x98\x5E |0 + \xFE\x7B |0 + \x94\xCD |0 + \xE9\xC2 |0 + \x93\xEE |0 + \xE9\xBE |0 + \xBE\xF6 |0 + \xBE\xEB |0 + \xBE\xF0 |0 + \xBE\xEC |0 + \xE9\xCC |0 + \xE9\xD7 |0 + \xBE\xEA |0 + \xE9\xC4 |0 + \xE9\xCD |0 + \xE5\xDF |0 + \xE9\xCE |0 + \x8C\xA3 |0 + \xBE\xF1 |0 + \xFD\x5A |0 + \xE9\xDD |0 + \xBE\xF5 |0 + \xBE\xF8 |0 + \xE9\xC0 |0 + \xBE\xF4 |0 + \x93\xF5 |0 + \xE9\xDB |0 + \xE9\xDC |0 + \xE9\xD2 |0 + \xE9\xD1 |0 + \xE9\xC9 |0 + \x93\xEF |0 + \x8E\xEA |0 + \xE9\xD3 |0 + \xE9\xDA |0 + \xE9\xD9 |0 + \x8F\x5B |0 + \xBE\xEF |0 + \xBE\xED |0 + \xE9\xCB |0 + \xE9\xC8 |0 + \xE9\xC5 |0 + \xE9\xD8 |0 + \xBE\xF7 |0 + \xE9\xD6 |0 + \xBE\xF3 |0 + \xBE\xF2 |0 + \x8C\x5E |0 + \xE9\xD0 |0 + \x8D\xC6 |0 + \xE9\xBF |0 + \xE9\xC1 |0 + \xE9\xC3 |0 + \xE9\xD5 |0 + \xE9\xCF |0 + \xBE\xEE |0 + \xE9\xC6 |0 + \xE9\xD4 |0 + \x8D\xC8 |0 + \x8D\xC7 |0 + \xE9\xC7 |0 + \x93\xF7 |0 + \xC0\xCF |0 + \xED\x45 |0 + \xC0\xC8 |0 + \xEC\xF5 |0 + \x8D\xC9 |0 + \xED\x41 |0 + \xC0\xCA |0 + \xED\x48 |0 + \xEC\xFC |0 + \xEC\xF7 |0 + \xFB\xF2 |0 + \xED\x49 |0 + \xEC\xF3 |0 + \xEC\xFE |0 + \x96\x70 |0 + \xC0\xD1 |0 + \xED\x44 |0 + \xED\x4A |0 + \xEC\xFD |0 + \xC0\xC9 |0 + \xED\x40 |0 + \xEC\xF4 |0 + \xC0\xD0 |0 + \x8D\xCB |0 + \xED\x47 |0 + \xEC\xF9 |0 + \xC0\xCC |0 + \xFD\x5C |0 + \xEC\xFB |0 + \xEC\xF8 |0 + \xC0\xD2 |0 + \xEC\xFA |0 + \xC0\xCB |0 + \xC0\xCE |0 + \xED\x43 |0 + \xEC\xF6 |0 + \xED\x46 |0 + \x8F\x65 |0 + \xED\x42 |0 + \x8D\xCD |0 + \xC2\x63 |0 + \xEF\xE7 |0 + \xC2\x68 |0 + \xC2\x69 |0 + \x9D\xA8 |0 + \x94\xF9 |0 + \xC2\x62 |0 + \xEF\xE6 |0 + \x8D\xCE |0 + \xEF\xE3 |0 + \xEF\xE4 |0 + \xC2\x66 |0 + \xEF\xDE |0 + \xEF\xE2 |0 + \xC2\x65 |0 + \xEF\xDF |0 + \x93\xEA |0 + \xC2\x67 |0 + \xC2\x64 |0 + \xEF\xDD |0 + \xEF\xE1 |0 + \xEF\xE5 |0 + \xFD\x5F |0 + \x93\xF0 |0 + \x9F\xB6 |0 + \xF2\x51 |0 + \xF2\x4E |0 + \xF2\x57 |0 + \xF2\x56 |0 + \xF2\x54 |0 + \xF2\x4F |0 + \xC3\x72 |0 + \x8D\xCF |0 + \x97\x63 |0 + \xF2\x50 |0 + \xC3\x71 |0 + \xC0\xCD |0 + \xF2\x53 |0 + \xC3\x70 |0 + \xF2\x58 |0 + \xF2\x52 |0 + \xF2\x4D |0 + \xEF\xE0 |0 + \xC3\x6F |0 + \xF2\x4C |0 + \xF4\x56 |0 + \xF4\x55 |0 + \xF2\x55 |0 + \xC4\x68 |0 + \xF4\x59 |0 + \xF4\x5A |0 + \xF4\x54 |0 + \xF4\x58 |0 + \xF4\x53 |0 + \x8D\xD0 |0 + \xF5\xD1 |0 + \xF4\x57 |0 + \xC4\xE7 |0 + \xC4\xE5 |0 + \xF5\xCF |0 + \xF5\xD2 |0 + \xF5\xCE |0 + \xF5\xD0 |0 + \xC4\xE6 |0 + \x93\xF1 |0 + \xF6\xE5 |0 + \xF6\xE6 |0 + \xC5\x76 |0 + \xF6\xE4 |0 + \xF7\xE2 |0 + \xC5\xCF |0 + \xF7\xE0 |0 + \xF7\xE1 |0 + \xF8\xAC |0 + \xC6\x56 |0 + \xF8\xF3 |0 + \xF8\xF1 |0 + \xF8\xF2 |0 + \xF8\xF4 |0 + \xFD\x62 |0 + \xF9\xBB |0 + \xA4\xED |0 + \xA6\xB8 |0 + \xAA\x59 |0 + \xCC\xE9 |0 + \xCF\x64 |0 + \xD1\xF5 |0 + \xD1\xF7 |0 + \xD1\xF6 |0 + \xD1\xF8 |0 + \xB1\xFD |0 + \xD5\xD7 |0 + \xD1\xF9 |0 + \xFD\x65 |0 + \xD5\xD6 |0 + \xD5\xD8 |0 + \xD5\xD9 |0 + \xD9\xDA |0 + \xB4\xDB |0 + \xD9\xDB |0 + \xD9\xDD |0 + \xB4\xDC |0 + \xB4\xDA |0 + \xD9\xDC |0 + \xDD\xFA |0 + \xDD\xF8 |0 + \xDD\xF7 |0 + \xDD\xF6 |0 + \xDD\xF5 |0 + \xB7\xB2 |0 + \xDD\xF9 |0 + \xBA\x70 |0 + \xE2\x63 |0 + \xE2\x65 |0 + \xBA\x71 |0 + \xE2\x64 |0 + \xBC\xDB |0 + \xBC\xDA |0 + \xE5\xF0 |0 + \x9F\xDB |0 + \xE9\xDF |0 + \xE9\xDE |0 + \xE9\xE0 |0 + \x93\xF8 |0 + \xBE\xF9 |0 + \xED\x4B |0 + \xC0\xD3 |0 + \xEF\xE8 |0 + \xC2\x6A |0 + \xF2\x59 |0 + \xC5\x77 |0 + \xA4\xEE |0 + \xA5\xBF |0 + \xA6\xB9 |0 + \xA8\x42 |0 + \xAA\x5A |0 + \xAA\x5B |0 + \xAC\x6E |0 + \xD1\xFA |0 + \x8B\xF7 |0 + \xB7\xB3 |0 + \xFD\x66 |0 + \xE6\xD1 |0 + \xBE\xFA |0 + \xC2\x6B |0 + \xA4\xEF |0 + \x8B\xCF |0 + \xA6\xBA |0 + \xCC\xEB |0 + \xAA\x5C |0 + \xCC\xEA |0 + \x8D\xD1 |0 + \xCF\x65 |0 + \xAC\x6F |0 + \xCF\x66 |0 + \xAC\x70 |0 + \xD1\xFC |0 + \xAE\xEE |0 + \xAE\xED |0 + \xD5\xDE |0 + \xD5\xDC |0 + \xD5\xDD |0 + \xD5\xDB |0 + \xD5\xDA |0 + \xD9\xDE |0 + \xD9\xE1 |0 + \xB4\xDE |0 + \xD9\xDF |0 + \xB4\xDD |0 + \xD9\xE0 |0 + \xDD\xFB |0 + \xE2\x66 |0 + \xE2\x67 |0 + \xE2\x68 |0 + \xE5\xF3 |0 + \xE5\xF2 |0 + \xBC\xDC |0 + \xE5\xF1 |0 + \xE5\xF4 |0 + \xE9\xE1 |0 + \xE9\xE2 |0 + \xE9\xE3 |0 + \xED\x4C |0 + \xC0\xD4 |0 + \xC2\x6C |0 + \xF2\x5A |0 + \xC4\xE8 |0 + \xC9\x5F |0 + \xAC\x71 |0 + \xCF\x67 |0 + \xAE\xEF |0 + \xB1\xFE |0 + \xB4\xDF |0 + \xD9\xE2 |0 + \xB7\xB5 |0 + \xB7\xB4 |0 + \x8D\xD2 |0 + \xE2\x69 |0 + \xE2\x6A |0 + \xBC\xDD |0 + \xBC\xDE |0 + \xE9\xE5 |0 + \xE9\xE4 |0 + \xEF\xE9 |0 + \xF7\xE3 |0 + \xA4\xF0 |0 + \xC9\x60 |0 + \xA5\xC0 |0 + \xA8\x43 |0 + \xCB\x48 |0 + \xAC\x72 |0 + \xB7\xB6 |0 + \xA4\xF1 |0 + \xCF\x68 |0 + \xAC\x73 |0 + \xCF\x69 |0 + \xC0\xD5 |0 + \xA4\xF2 |0 + \xFD\x71 |0 + \xCC\xEC |0 + \xCF\x6A |0 + \xFD\x6F |0 + \xD2\x42 |0 + \xD2\x41 |0 + \xD1\xFE |0 + \xD1\xFD |0 + \xD2\x43 |0 + \xD2\x40 |0 + \x8D\xD3 |0 + \xB2\x40 |0 + \xB2\x41 |0 + \xB4\xE0 |0 + \xD9\xE3 |0 + \xD9\xE4 |0 + \xD9\xE5 |0 + \xDE\x41 |0 + \xDE\x42 |0 + \xDE\x40 |0 + \x9F\xE7 |0 + \xDD\xFD |0 + \xDD\xFE |0 + \xB7\xB7 |0 + \xE2\x6B |0 + \xE5\xF7 |0 + \xE5\xF6 |0 + \xE5\xF5 |0 + \xE5\xF8 |0 + \xE9\xE7 |0 + \xE9\xE6 |0 + \xBE\xFB |0 + \xE9\xE8 |0 + \xC0\xD6 |0 + \xED\x4D |0 + \xEF\xEA |0 + \xF2\x5B |0 + \xF6\xE7 |0 + \xA4\xF3 |0 + \xA5\xC2 |0 + \xA5\xC1 |0 + \xAA\x5D |0 + \xC9\x61 |0 + \xC9\x7E |0 + \xA6\xBB |0 + \xC9\xF7 |0 + \xCB\x49 |0 + \xCB\x4A |0 + \xAA\x5E |0 + \x90\xBD |0 + \xCC\xED |0 + \xAC\x74 |0 + \xCF\x6B |0 + \xCF\x6C |0 + \xAE\xF0 |0 + \xAE\xF4 |0 + \xD2\x44 |0 + \xAE\xF3 |0 + \xAE\xF1 |0 + \xAE\xF2 |0 + \xD5\xDF |0 + \xB2\x42 |0 + \xB4\xE3 |0 + \xB4\xE1 |0 + \xB4\xE2 |0 + \xD9\xE6 |0 + \x9F\xD0 |0 + \xBA\x72 |0 + \xA4\xF4 |0 + \x8B\xD0 |0 + \xC9\xA1 |0 + \xFD\x72 |0 + \xA5\xC3 |0 + \x9C\xAE |0 + \x8B\xD1 |0 + \xC9\xA4 |0 + \x8A\xDB |0 + \xA5\xC6 |0 + \xC9\xA3 |0 + \xA5\xC5 |0 + \xA5\xC4 |0 + \xA8\x44 |0 + \xC9\xA2 |0 + \xC9\xF8 |0 + \xFA\xE4 |0 + \xC9\xFC |0 + \xC9\xFE |0 + \xCA\x40 |0 + \xA6\xC5 |0 + \xA6\xC6 |0 + \xC9\xFB |0 + \xA6\xC1 |0 + \xC9\xF9 |0 + \xC9\xFD |0 + \xA6\xC2 |0 + \xA6\xBD |0 + \x95\xCE |0 + \xA6\xBE |0 + \xFD\x76 |0 + \xA6\xC4 |0 + \xC9\xFA |0 + \xA6\xBC |0 + \xA8\x45 |0 + \xA6\xBF |0 + \xA6\xC0 |0 + \xA6\xC3 |0 + \xCB\x5B |0 + \xCB\x59 |0 + \xCB\x4C |0 + \xA8\x51 |0 + \xCB\x53 |0 + \xA8\x4C |0 + \xCB\x4D |0 + \xCB\x55 |0 + \xFB\x62 |0 + \xCB\x52 |0 + \xA8\x4F |0 + \xCB\x51 |0 + \xA8\x56 |0 + \xCB\x5A |0 + \xA8\x58 |0 + \x8D\xD4 |0 + \xA8\x5A |0 + \xCB\x4B |0 + \xFD\x78 |0 + \xA8\x4D |0 + \xCB\x5C |0 + \xA8\x54 |0 + \xA8\x57 |0 + \x8E\xE3 |0 + \xCD\x45 |0 + \xA8\x47 |0 + \xA8\x5E |0 + \xA8\x55 |0 + \xCB\x4E |0 + \xA8\x4A |0 + \xA8\x59 |0 + \xCB\x56 |0 + \xA8\x48 |0 + \xA8\x49 |0 + \xCD\x43 |0 + \xCB\x4F |0 + \xA8\x50 |0 + \xA8\x5B |0 + \xCB\x5D |0 + \xCB\x50 |0 + \xA8\x4E |0 + \xA8\x53 |0 + \xCC\xEE |0 + \xA8\x5C |0 + \xCB\x57 |0 + \xA8\x52 |0 + \xA8\x5D |0 + \xA8\x46 |0 + \xCB\x54 |0 + \xA8\x4B |0 + \xCB\x58 |0 + \xCD\x44 |0 + \x90\x76 |0 + \x98\xC6 |0 + \x8D\xD5 |0 + \xAA\x6A |0 + \xAA\x7A |0 + \xCC\xF5 |0 + \xAA\x71 |0 + \x97\xD1 |0 + \xCD\x4B |0 + \xAA\x62 |0 + \x9E\xB6 |0 + \xAA\x65 |0 + \xCD\x42 |0 + \xCC\xF3 |0 + \xCC\xF7 |0 + \xAA\x6D |0 + \xAA\x6F |0 + \xCC\xFA |0 + \xAA\x76 |0 + \xAA\x68 |0 + \xAA\x66 |0 + \xAA\x67 |0 + \xAA\x75 |0 + \xCD\x47 |0 + \xAA\x70 |0 + \xCC\xF9 |0 + \xCC\xFB |0 + \xAA\x6E |0 + \xAA\x73 |0 + \xCC\xFC |0 + \xCD\x4A |0 + \xAC\x75 |0 + \xAA\x79 |0 + \xFA\xC7 |0 + \xAA\x63 |0 + \xCD\x49 |0 + \xA0\x42 |0 + \xCD\x4D |0 + \xCC\xF8 |0 + \xCD\x4F |0 + \xCD\x40 |0 + \xAA\x6C |0 + \xCC\xF4 |0 + \xAA\x6B |0 + \xAA\x7D |0 + \xAA\x72 |0 + \xCC\xF2 |0 + \xCF\x75 |0 + \xAA\x78 |0 + \xAA\x7C |0 + \xCD\x41 |0 + \xCD\x46 |0 + \x98\x73 |0 + \xAA\x7E |0 + \xAA\x77 |0 + \xAA\x69 |0 + \xAA\x5F |0 + \xAA\x64 |0 + \xCC\xF6 |0 + \xAA\x60 |0 + \xCD\x4E |0 + \x9F\xFC |0 + \xCC\xF0 |0 + \xCC\xEF |0 + \xCC\xFD |0 + \xCC\xF1 |0 + \xAA\x7B |0 + \xAE\xF5 |0 + \xAA\x74 |0 + \xCC\xFE |0 + \xAA\x61 |0 + \xAC\xA6 |0 + \xCD\x4C |0 + \x8C\xA5 |0 + \xCF\x7C |0 + \xCF\xA1 |0 + \x8D\xD7 |0 + \xCF\xA4 |0 + \xCF\x77 |0 + \x92\xFB |0 + \x8D\xD8 |0 + \xCF\xA7 |0 + \xCF\xAA |0 + \xCF\xAC |0 + \xCF\x74 |0 + \xAC\x76 |0 + \xAC\x7B |0 + \xD2\x49 |0 + \xAC\xAD |0 + \xCF\xA5 |0 + \xCF\xAD |0 + \xCF\x7B |0 + \xCF\x73 |0 + \xD2\x64 |0 + \xAC\x7E |0 + \xCF\xA2 |0 + \xCF\x78 |0 + \xCF\x7A |0 + \xAC\xA5 |0 + \xCF\x7D |0 + \xAC\x7D |0 + \xCF\x70 |0 + \xCF\xA8 |0 + \xCF\xAB |0 + \x94\x4F |0 + \xAC\x7A |0 + \x8D\xD9 |0 + \xAC\xA8 |0 + \xCF\x6D |0 + \xAC\xAA |0 + \xAC\x78 |0 + \xAC\xAE |0 + \xCF\xA9 |0 + \xCF\x6F |0 + \xAC\xAB |0 + \xD2\x5E |0 + \xCD\x48 |0 + \xAC\x7C |0 + \xAC\x77 |0 + \xCF\x76 |0 + \xCF\x6E |0 + \xAC\xAC |0 + \xAC\xA4 |0 + \xCF\xA3 |0 + \xAC\xA9 |0 + \xAC\xA7 |0 + \xCF\x79 |0 + \xAC\xA1 |0 + \xCF\x71 |0 + \xAC\xA2 |0 + \xAC\xA3 |0 + \xCF\x72 |0 + \xCF\xA6 |0 + \xAC\x79 |0 + \xCF\x7E |0 + \x89\x6B |0 + \x97\xCE |0 + \xD2\x4C |0 + \xAE\xFD |0 + \xAF\x43 |0 + \xFA\xF3 |0 + \xFD\xAE |0 + \xD2\x55 |0 + \xD2\x5B |0 + \xD2\x57 |0 + \xD2\x4A |0 + \xD2\x4D |0 + \xD2\x46 |0 + \xD2\x47 |0 + \xAF\x4A |0 + \xAE\xFA |0 + \xD2\x56 |0 + \xD2\x5F |0 + \xAF\x45 |0 + \xAE\xF6 |0 + \xAF\x40 |0 + \xD2\x4E |0 + \xAF\x42 |0 + \xD2\x4F |0 + \xD2\x59 |0 + \xFB\xAF |0 + \x92\xB7 |0 + \xAF\x44 |0 + \xD2\x68 |0 + \xD2\x48 |0 + \xAE\xFC |0 + \xAE\xFB |0 + \xAF\x48 |0 + \xD2\x45 |0 + \xD2\x66 |0 + \xD2\x5A |0 + \xD2\x67 |0 + \xD2\x61 |0 + \xD2\x53 |0 + \xD2\x62 |0 + \x8D\xDA |0 + \xD2\x5C |0 + \xD2\x65 |0 + \xD2\x63 |0 + \xAF\x49 |0 + \xD2\x54 |0 + \xAE\xF9 |0 + \xAE\xF8 |0 + \xAF\x41 |0 + \xAF\x47 |0 + \xD2\x60 |0 + \xAF\x46 |0 + \xD2\x51 |0 + \xB2\x43 |0 + \x9C\x5A |0 + \xD2\x69 |0 + \xD2\x50 |0 + \xD2\x4B |0 + \xAE\xFE |0 + \xAF\x4B |0 + \xAE\xF7 |0 + \xFD\xAD |0 + \xD2\x58 |0 + \xD2\x5D |0 + \x8D\xDC |0 + \x94\x44 |0 + \xB2\x65 |0 + \xD5\xE1 |0 + \xD5\xE5 |0 + \xB2\x52 |0 + \xB2\x50 |0 + \x8D\xDD |0 + \xB2\x47 |0 + \xD5\xE3 |0 + \xD5\xE2 |0 + \xB2\x5B |0 + \xD5\xE8 |0 + \xB2\x55 |0 + \xA0\xD6 |0 + \xD5\xFA |0 + \xD6\x47 |0 + \xB2\x44 |0 + \xD5\xF7 |0 + \xD5\xF0 |0 + \xB2\x67 |0 + \xD5\xE0 |0 + \xD5\xFC |0 + \xB2\x64 |0 + \xB2\x58 |0 + \xB2\x63 |0 + \xB2\x4E |0 + \xD5\xEC |0 + \xD5\xFE |0 + \xD5\xF6 |0 + \xB2\x4F |0 + \xB2\x49 |0 + \xD6\x45 |0 + \xD5\xFD |0 + \xD6\x40 |0 + \xB2\x51 |0 + \xB2\x59 |0 + \xD6\x42 |0 + \xD5\xEA |0 + \xD5\xFB |0 + \xD5\xEF |0 + \xD6\x44 |0 + \xB2\x5E |0 + \xB2\x46 |0 + \xB2\x5C |0 + \xD5\xF4 |0 + \xD5\xF2 |0 + \xD5\xF3 |0 + \xB2\x53 |0 + \xD5\xEE |0 + \xD5\xED |0 + \xB2\x48 |0 + \xD5\xE7 |0 + \xD6\x46 |0 + \xB2\x4A |0 + \xD5\xF1 |0 + \xB2\x68 |0 + \xB2\x62 |0 + \xD5\xE6 |0 + \xB2\x5F |0 + \xB2\x5D |0 + \xB2\x66 |0 + \xD5\xF8 |0 + \xB2\x61 |0 + \xD2\x52 |0 + \xD5\xF9 |0 + \xB2\x60 |0 + \xD6\x41 |0 + \xB2\x45 |0 + \xD5\xF5 |0 + \xB2\x57 |0 + \xD5\xE9 |0 + \xB2\x56 |0 + \xB2\x54 |0 + \xB2\x4C |0 + \xB2\x4B |0 + \xD9\xE7 |0 + \xD6\x43 |0 + \x8C\x41 |0 + \xD5\xEB |0 + \x97\xD5 |0 + \xD9\xFC |0 + \x94\x4A |0 + \xB2\x4D |0 + \x94\x4D |0 + \x97\xCB |0 + \x8D\xDE |0 + \x8D\xDF |0 + \xB5\x41 |0 + \xB2\x5A |0 + \xB4\xEE |0 + \xD9\xF6 |0 + \xB4\xFC |0 + \xD9\xEA |0 + \xB4\xEB |0 + \xB4\xE7 |0 + \xDA\x49 |0 + \xB4\xED |0 + \xB4\xF1 |0 + \xB4\xEC |0 + \xB4\xF5 |0 + \xDA\x4D |0 + \xDA\x44 |0 + \x8D\xE0 |0 + \xFE\xF9 |0 + \xD9\xF1 |0 + \xB4\xFA |0 + \xB4\xF4 |0 + \xD9\xFD |0 + \xB4\xE4 |0 + \xDA\x4A |0 + \xDA\x43 |0 + \xB4\xE8 |0 + \xD9\xF7 |0 + \xB4\xF7 |0 + \xDA\x55 |0 + \xDA\x56 |0 + \xB4\xE5 |0 + \xDA\x48 |0 + \xB4\xF9 |0 + \xD9\xFB |0 + \xD9\xED |0 + \xD9\xEE |0 + \xB4\xFD |0 + \xD9\xF2 |0 + \xD9\xF9 |0 + \xD9\xF3 |0 + \xB4\xFB |0 + \xB5\x44 |0 + \xD9\xEF |0 + \xD9\xE8 |0 + \xD9\xE9 |0 + \xD9\xEB |0 + \xB4\xEA |0 + \xD9\xF8 |0 + \xB4\xF8 |0 + \xB5\x42 |0 + \xFD\xC0 |0 + \xFC\xF9 |0 + \xD9\xFA |0 + \xDA\x53 |0 + \xDA\x4B |0 + \xB4\xE6 |0 + \xDA\x51 |0 + \xB4\xF2 |0 + \xB4\xF0 |0 + \xFB\x7E |0 + \xDA\x57 |0 + \xB4\xEF |0 + \xDA\x41 |0 + \xD9\xF4 |0 + \xD9\xFE |0 + \xB5\x47 |0 + \xDA\x45 |0 + \xDA\x42 |0 + \xD9\xF0 |0 + \xB5\x43 |0 + \xDA\x4F |0 + \xDA\x4C |0 + \xDA\x54 |0 + \xB4\xE9 |0 + \xDA\x40 |0 + \xB5\x46 |0 + \xDA\x47 |0 + \xB4\xF3 |0 + \xB4\xF6 |0 + \xDA\x46 |0 + \xB5\x45 |0 + \xD9\xF5 |0 + \xD5\xE4 |0 + \x92\xB3 |0 + \xDA\x50 |0 + \xDA\x4E |0 + \xDA\x52 |0 + \xFD\xAF |0 + \x8D\xE1 |0 + \xD9\xEC |0 + \xB5\x40 |0 + \x95\xD3 |0 + \xDE\x61 |0 + \xDE\x60 |0 + \xDE\x46 |0 + \xB7\xBD |0 + \xDE\x5F |0 + \xDE\x49 |0 + \xDE\x4A |0 + \xB7\xC7 |0 + \xDE\x68 |0 + \xB7\xC2 |0 + \xDE\x5E |0 + \x89\xC1 |0 + \xDE\x43 |0 + \xB7\xC8 |0 + \xB7\xBE |0 + \xDE\x52 |0 + \xDE\x48 |0 + \xDE\x4B |0 + \xDE\x63 |0 + \xB7\xB8 |0 + \xDE\x6A |0 + \xDE\x62 |0 + \xB7\xC1 |0 + \xDE\x57 |0 + \xB7\xCC |0 + \xB7\xCB |0 + \xB7\xC5 |0 + \xDE\x69 |0 + \xB7\xB9 |0 + \xDE\x55 |0 + \xDE\x4C |0 + \xDE\x59 |0 + \xDE\x65 |0 + \xB7\xCD |0 + \xFD\x68 |0 + \xB7\xBB |0 + \xDE\x54 |0 + \x9C\xB7 |0 + \xDE\x4D |0 + \xB7\xC4 |0 + \x8D\xE3 |0 + \xB7\xC3 |0 + \xDE\x50 |0 + \xDE\x5A |0 + \xDE\x64 |0 + \xDE\x47 |0 + \xDE\x51 |0 + \xB7\xBC |0 + \xDE\x5B |0 + \xB7\xC9 |0 + \xB7\xC0 |0 + \xDE\x4E |0 + \xB7\xBF |0 + \xDE\x45 |0 + \xDE\x53 |0 + \xDE\x67 |0 + \xB4\xFE |0 + \xBA\xB0 |0 + \xDE\x56 |0 + \xE2\x6C |0 + \xDE\x58 |0 + \xDE\x66 |0 + \xB7\xC6 |0 + \xDE\x4F |0 + \xB7\xBA |0 + \xB7\xCA |0 + \xBC\xF0 |0 + \xDE\x44 |0 + \xDE\x5D |0 + \xFA\xC0 |0 + \x8D\xE5 |0 + \xFA\x64 |0 + \xDE\x5C |0 + \x89\x47 |0 + \x8D\xE4 |0 + \x8D\xE7 |0 + \x8D\xE8 |0 + \xE2\xAA |0 + \xBA\xAD |0 + \xE2\x7D |0 + \xE2\xA4 |0 + \xBA\xA2 |0 + \xE2\x6E |0 + \xBA\xAF |0 + \xBA\x77 |0 + \xE2\x6D |0 + \xE2\xB0 |0 + \xBA\xB1 |0 + \xE2\x71 |0 + \xE2\xA3 |0 + \xFD\xC7 |0 + \xE2\x73 |0 + \xE2\xB3 |0 + \xE2\xAF |0 + \xBA\x75 |0 + \xBA\xA1 |0 + \xE6\x53 |0 + \xBA\xAE |0 + \xBA\x7D |0 + \xE2\x6F |0 + \xFD\xB0 |0 + \xE2\xAE |0 + \xBA\xA3 |0 + \xE2\xAB |0 + \xE2\xB8 |0 + \xE2\x75 |0 + \xE2\x7E |0 + \x94\x45 |0 + \x97\xD6 |0 + \xE2\xB6 |0 + \xE2\xAC |0 + \xBA\x7C |0 + \xE2\x7C |0 + \xBA\x76 |0 + \xBA\x74 |0 + \xBA\xA8 |0 + \xFC\xC6 |0 + \x98\x44 |0 + \xE2\x7A |0 + \xE2\x77 |0 + \xE2\x78 |0 + \xE2\xB2 |0 + \xE2\xB7 |0 + \xE2\xB5 |0 + \xBA\x7A |0 + \xE2\xB9 |0 + \xBA\x7E |0 + \xBA\xA7 |0 + \x8D\xE9 |0 + \xE2\x70 |0 + \xE5\xFA |0 + \xE2\x79 |0 + \xBA\x78 |0 + \xBA\xAC |0 + \xBA\xA9 |0 + \xBA\x7B |0 + \xE2\xA5 |0 + \xE2\x74 |0 + \xBA\xAA |0 + \xE2\xA7 |0 + \xBA\xA4 |0 + \xBA\xA6 |0 + \xBA\x73 |0 + \x8D\xEA |0 + \xE2\xA9 |0 + \xE2\xA1 |0 + \xE2\x72 |0 + \xBA\xA5 |0 + \xE2\xB1 |0 + \xE2\xB4 |0 + \xE2\x7B |0 + \xE2\xA8 |0 + \xFE\x50 |0 + \xBA\x79 |0 + \xBC\xDF |0 + \xE2\xA6 |0 + \xE5\xF9 |0 + \xE2\xAD |0 + \xFD\xCC |0 + \xE2\x76 |0 + \xE6\x44 |0 + \xE6\x4E |0 + \xBC\xE2 |0 + \xE6\x4D |0 + \xE6\x59 |0 + \xBC\xE4 |0 + \xE6\x4B |0 + \x9D\xA7 |0 + \xE6\x4F |0 + \xBC\xEF |0 + \xE6\x46 |0 + \xBC\xE7 |0 + \xFD\xCD |0 + \xE6\x52 |0 + \xE9\xF0 |0 + \xBC\xF3 |0 + \xBC\xF2 |0 + \xE6\x54 |0 + \xE6\x43 |0 + \xE6\x5E |0 + \xBC\xED |0 + \xBC\xE3 |0 + \xE6\x57 |0 + \xE6\x5B |0 + \xE6\x60 |0 + \xE6\x55 |0 + \xE6\x49 |0 + \xBC\xE6 |0 + \xBC\xE9 |0 + \xBC\xF1 |0 + \xBC\xEC |0 + \xE6\x4C |0 + \xE2\xA2 |0 + \xFD\xCF |0 + \xE6\x48 |0 + \xE6\x5F |0 + \xBC\xE8 |0 + \x95\xD2 |0 + \xBC\xEB |0 + \xE6\x61 |0 + \xBC\xE0 |0 + \xE6\x56 |0 + \xE5\xFB |0 + \xE6\x5C |0 + \xC0\xDF |0 + \x8D\xED |0 + \xE6\x4A |0 + \xBC\xE1 |0 + \xE6\x45 |0 + \xBC\xE5 |0 + \xE5\xFC |0 + \xBA\xAB |0 + \xE6\x41 |0 + \xFC\xBA |0 + \xE6\x5A |0 + \xE6\x42 |0 + \xE6\x40 |0 + \xBC\xEA |0 + \xE6\x58 |0 + \xE5\xFE |0 + \xE6\x51 |0 + \xE6\x50 |0 + \xE6\x5D |0 + \xE6\x47 |0 + \xBC\xEE |0 + \xFD\xC5 |0 + \xE9\xF3 |0 + \xFD\xD2 |0 + \xBF\x49 |0 + \xBE\xFE |0 + \xEA\x40 |0 + \xE9\xEB |0 + \xBF\x41 |0 + \xE9\xF7 |0 + \xBF\x48 |0 + \xBF\x43 |0 + \xE9\xF5 |0 + \xED\x4F |0 + \xE9\xFB |0 + \xEA\x42 |0 + \xE9\xFA |0 + \xE9\xE9 |0 + \xE9\xF8 |0 + \xEA\x44 |0 + \xEA\x46 |0 + \xBE\xFD |0 + \xEA\x45 |0 + \xBF\x44 |0 + \xBF\x4A |0 + \x9C\xDC |0 + \xBF\x47 |0 + \xE9\xFE |0 + \xBF\x46 |0 + \xE9\xF9 |0 + \x95\xCF |0 + \xE9\xED |0 + \xE9\xF2 |0 + \x8D\xEE |0 + \xE9\xFD |0 + \xBF\x45 |0 + \xBF\x42 |0 + \xBE\xFC |0 + \xBF\x40 |0 + \xE9\xF1 |0 + \xE5\xFD |0 + \xE9\xEC |0 + \xE9\xEF |0 + \xEA\x41 |0 + \xE9\xF4 |0 + \xE9\xEA |0 + \xED\x4E |0 + \xEA\x43 |0 + \xE9\xEE |0 + \xE9\xFC |0 + \xFD\xD4 |0 + \xED\x51 |0 + \xC0\xE3 |0 + \xC0\xD7 |0 + \x96\xEC |0 + \x96\xEB |0 + \xC0\xDB |0 + \xED\x53 |0 + \xED\x59 |0 + \xED\x57 |0 + \xC0\xD9 |0 + \xC0\xDA |0 + \xC0\xE1 |0 + \xED\x5A |0 + \xED\x52 |0 + \xC0\xDC |0 + \xED\x56 |0 + \xED\x55 |0 + \xED\x5B |0 + \xC0\xE2 |0 + \xC0\xDD |0 + \xC0\xE0 |0 + \xED\x54 |0 + \xC0\xE4 |0 + \xC0\xDE |0 + \xC0\xE5 |0 + \xC0\xD8 |0 + \xED\x58 |0 + \xED\x50 |0 + \x90\xB6 |0 + \xEF\xF7 |0 + \xFD\xC3 |0 + \xC2\x71 |0 + \xEF\xF4 |0 + \xEF\xF6 |0 + \xC2\x6F |0 + \xEF\xF2 |0 + \xEF\xF3 |0 + \xEF\xEE |0 + \x98\xAB |0 + \xE9\xF6 |0 + \xEF\xEF |0 + \xC2\x70 |0 + \xEF\xEB |0 + \xC2\x6D |0 + \xEF\xF8 |0 + \xC2\x6E |0 + \xEF\xEC |0 + \xEF\xED |0 + \xEF\xF1 |0 + \xC2\x73 |0 + \xC2\x72 |0 + \xEF\xF0 |0 + \xC3\x78 |0 + \xF2\x5F |0 + \xF2\x65 |0 + \xC3\x79 |0 + \xF2\x5C |0 + \xC3\x76 |0 + \xC3\x73 |0 + \xF2\x67 |0 + \xC3\x77 |0 + \x96\xEE |0 + \xC3\x74 |0 + \xF2\x5E |0 + \xF2\x61 |0 + \xF2\x62 |0 + \xF2\x63 |0 + \xF2\x66 |0 + \xEF\xF5 |0 + \xF2\x5D |0 + \xC3\x75 |0 + \xF2\x64 |0 + \xF2\x68 |0 + \xF2\x60 |0 + \x8D\xF4 |0 + \xF4\x5D |0 + \xC4\x6A |0 + \xF4\x60 |0 + \xC4\x6B |0 + \xF4\x68 |0 + \xF4\x5F |0 + \xF4\x5C |0 + \xF4\x5E |0 + \xF4\x62 |0 + \xF4\x65 |0 + \xF4\x64 |0 + \xF4\x67 |0 + \xF4\x5B |0 + \xC4\x69 |0 + \xF4\x63 |0 + \xF4\x66 |0 + \xF4\x69 |0 + \xF4\x61 |0 + \xF5\xD3 |0 + \xF5\xD4 |0 + \xF5\xD8 |0 + \xF5\xD9 |0 + \xF5\xD6 |0 + \xF5\xD7 |0 + \xF5\xD5 |0 + \xFD\xE0 |0 + \xC4\xE9 |0 + \x8C\x67 |0 + \x8D\xF6 |0 + \xC5\x78 |0 + \xF6\xEB |0 + \x8D\xF7 |0 + \xF6\xE8 |0 + \xF6\xE9 |0 + \xF6\xEA |0 + \xC5\x79 |0 + \xF7\xE5 |0 + \xF7\xE4 |0 + \x8F\xFA |0 + \xF8\xAF |0 + \xC5\xF4 |0 + \xF8\xAD |0 + \xF8\xB0 |0 + \xF8\xAE |0 + \xF8\xF5 |0 + \xC6\x57 |0 + \xC6\x65 |0 + \xF9\xA3 |0 + \xF9\x6C |0 + \x97\xD0 |0 + \xF9\xA2 |0 + \xF9\xD0 |0 + \xF9\xD1 |0 + \xA4\xF5 |0 + \x8B\xD2 |0 + \x8D\xF8 |0 + \xA6\xC7 |0 + \xCA\x41 |0 + \xCB\x5E |0 + \x90\xD9 |0 + \xA8\x5F |0 + \x8C\x47 |0 + \xA8\x62 |0 + \xFA\xF0 |0 + \xCB\x5F |0 + \xA8\x60 |0 + \xA8\x61 |0 + \xFD\xE1 |0 + \x8D\xF9 |0 + \xFD\xE3 |0 + \xCD\x58 |0 + \xCD\x5A |0 + \xCD\x55 |0 + \xCD\x52 |0 + \xCD\x54 |0 + \x8D\xFA |0 + \xAA\xA4 |0 + \xFB\x63 |0 + \xAA\xA2 |0 + \x90\xA6 |0 + \xCD\x56 |0 + \xAA\xA3 |0 + \xCD\x53 |0 + \xCD\x50 |0 + \xAA\xA1 |0 + \xCD\x57 |0 + \xCD\x51 |0 + \xAA\xA5 |0 + \xCD\x59 |0 + \xCF\xAF |0 + \x99\x70 |0 + \xCF\xB3 |0 + \x91\xEB |0 + \xAC\xB7 |0 + \x97\x70 |0 + \x98\x6F |0 + \xFD\xE2 |0 + \xCF\xB6 |0 + \xAC\xAF |0 + \xAC\xB2 |0 + \xAC\xB4 |0 + \xAC\xB6 |0 + \xAC\xB3 |0 + \xCF\xB2 |0 + \xCF\xB1 |0 + \xAC\xB1 |0 + \xCF\xB4 |0 + \xCF\xB5 |0 + \xCF\xAE |0 + \xAC\xB5 |0 + \x98\xF2 |0 + \xAC\xB0 |0 + \x9A\xFC |0 + \x89\x6C |0 + \xFD\xFD |0 + \xCF\xB0 |0 + \x99\x5E |0 + \x95\xBD |0 + \xD2\x77 |0 + \xD2\x78 |0 + \xD2\x79 |0 + \xAF\x50 |0 + \xAF\x4C |0 + \xD2\x6E |0 + \xFD\xE4 |0 + \xD2\x76 |0 + \xD2\x7B |0 + \xAF\x51 |0 + \x91\xE6 |0 + \xD2\x6C |0 + \xD2\x72 |0 + \xD2\x6B |0 + \xD2\x75 |0 + \xFD\xE5 |0 + \xFD\xE6 |0 + \xD2\x71 |0 + \xAF\x4D |0 + \xAF\x4F |0 + \xD2\x7A |0 + \xD2\x6A |0 + \xD2\x6D |0 + \xD2\x73 |0 + \xFD\xE7 |0 + \xD2\x74 |0 + \xD2\x7C |0 + \xD2\x70 |0 + \xAF\x4E |0 + \xB2\x6D |0 + \xD6\x4E |0 + \x94\x54 |0 + \xD6\x50 |0 + \xD6\x4C |0 + \x99\xB8 |0 + \xD6\x58 |0 + \xD6\x4A |0 + \xD6\x57 |0 + \xB2\x69 |0 + \xD6\x48 |0 + \xDA\x5B |0 + \xD6\x52 |0 + \xB2\x6C |0 + \x97\xE9 |0 + \xD6\x53 |0 + \xD6\x56 |0 + \xD6\x5A |0 + \xD6\x4F |0 + \x93\x46 |0 + \xD6\x54 |0 + \xB2\x6A |0 + \xB2\x6B |0 + \xD6\x59 |0 + \xD6\x4D |0 + \xD6\x49 |0 + \xD6\x5B |0 + \xD6\x51 |0 + \xD6\x55 |0 + \xD6\x4B |0 + \xB5\x48 |0 + \xB5\x49 |0 + \xDA\x65 |0 + \xB5\x4F |0 + \x98\x63 |0 + \xDA\x59 |0 + \xDA\x62 |0 + \xDA\x58 |0 + \xB5\x4C |0 + \xDA\x60 |0 + \xDA\x5E |0 + \xDA\x5F |0 + \xB5\x4A |0 + \xDA\x63 |0 + \x95\xBC |0 + \xFD\xED |0 + \xFD\xF7 |0 + \xDA\x5C |0 + \xDA\x5A |0 + \xB5\x4B |0 + \xDA\x5D |0 + \xDA\x61 |0 + \x98\x70 |0 + \x96\xF6 |0 + \x8E\xA9 |0 + \xB5\x4D |0 + \xDA\x64 |0 + \x94\x51 |0 + \x8E\x43 |0 + \x8B\x5A |0 + \xDE\x70 |0 + \xDE\x77 |0 + \xDE\x79 |0 + \xDE\xA1 |0 + \xFD\xEE |0 + \xB7\xDA |0 + \xDE\x6B |0 + \xB7\xD2 |0 + \xFD\xF0 |0 + \xDE\x7A |0 + \xB7\xD7 |0 + \xDE\xA2 |0 + \xB7\xCE |0 + \xFD\xF4 |0 + \xDE\x7D |0 + \x9B\xF5 |0 + \xDE\x6D |0 + \xDE\x7E |0 + \xDE\x6C |0 + \xB7\xDC |0 + \xDE\x78 |0 + \xB7\xCF |0 + \xDE\xA3 |0 + \xB7\xD4 |0 + \xDE\x71 |0 + \xB7\xD9 |0 + \xDE\x7C |0 + \xDE\x6F |0 + \xDE\x76 |0 + \xDE\x72 |0 + \xDE\x6E |0 + \xB7\xD1 |0 + \xB7\xD8 |0 + \xB7\xD6 |0 + \xB7\xD3 |0 + \xB7\xDB |0 + \xB7\xD0 |0 + \xDE\x75 |0 + \x97\x7E |0 + \xB7\xD5 |0 + \xB5\x4E |0 + \xDE\x7B |0 + \x9B\xD5 |0 + \xDE\x73 |0 + \x9A\xC3 |0 + \x97\xC8 |0 + \xA0\xDB |0 + \x91\xD0 |0 + \xDE\x74 |0 + \x9F\xE4 |0 + \xE2\xC1 |0 + \x8F\xDD |0 + \xBA\xB4 |0 + \x91\xE9 |0 + \xE2\xBD |0 + \xE2\xC3 |0 + \xE2\xBF |0 + \xBA\xB6 |0 + \xE2\xBE |0 + \xE2\xC2 |0 + \xE2\xBA |0 + \x98\xE0 |0 + \xE2\xBC |0 + \xBA\xB5 |0 + \x92\xCA |0 + \x98\x57 |0 + \xE2\xC0 |0 + \xE2\xBB |0 + \x8C\x51 |0 + \xBA\xB7 |0 + \xBA\xB2 |0 + \xFD\xEB |0 + \xE2\xC4 |0 + \x9B\x49 |0 + \xBA\xB3 |0 + \xE6\x67 |0 + \xE6\x64 |0 + \xE6\x70 |0 + \xE6\x6A |0 + \xE6\x6C |0 + \xBC\xF4 |0 + \xE6\x66 |0 + \xE6\x6E |0 + \x9D\x76 |0 + \x9E\xAF |0 + \xE6\x6D |0 + \xE6\x6B |0 + \xE6\x71 |0 + \xBC\xF7 |0 + \xE6\x68 |0 + \xE6\x6F |0 + \xBC\xF5 |0 + \x9C\xCC |0 + \xE6\x63 |0 + \xE6\x65 |0 + \xBC\xF6 |0 + \xE6\x62 |0 + \xE6\x72 |0 + \xFD\xEA |0 + \xE6\x69 |0 + \x8D\xF1 |0 + \xEA\x4A |0 + \xBF\x51 |0 + \xFD\xFB |0 + \xEA\x55 |0 + \xEA\x53 |0 + \xBF\x4B |0 + \xEA\x49 |0 + \xEA\x4C |0 + \xEA\x4D |0 + \xEA\x48 |0 + \xBF\x55 |0 + \xBF\x56 |0 + \xEA\x47 |0 + \xEA\x56 |0 + \xEA\x51 |0 + \xBF\x4F |0 + \xBF\x4C |0 + \xEA\x50 |0 + \xEA\x4E |0 + \xBF\x52 |0 + \xEA\x52 |0 + \xBF\x4D |0 + \x8E\x53 |0 + \xBF\x4E |0 + \xEA\x4F |0 + \xBF\x50 |0 + \xEA\x4B |0 + \xEA\x54 |0 + \xBF\x53 |0 + \xEA\x57 |0 + \xEA\x58 |0 + \xBF\x54 |0 + \xFA\xCF |0 + \xC0\xE7 |0 + \xC0\xEE |0 + \xED\x5C |0 + \xED\x62 |0 + \xED\x60 |0 + \xC0\xEA |0 + \xC0\xE9 |0 + \xC0\xE6 |0 + \xED\x5E |0 + \x96\xF9 |0 + \xC0\xEC |0 + \xC0\xEB |0 + \xC0\xE8 |0 + \xED\x61 |0 + \xED\x5D |0 + \xED\x5F |0 + \xC0\xED |0 + \x98\xBF |0 + \x9E\x49 |0 + \xC2\x77 |0 + \xEF\xFB |0 + \xC2\x74 |0 + \xC2\x75 |0 + \xEF\xFD |0 + \xC2\x76 |0 + \xEF\xFA |0 + \x8C\xA7 |0 + \xEF\xF9 |0 + \xF2\x6C |0 + \xEF\xFC |0 + \xF2\x6D |0 + \xC3\x7A |0 + \xF2\x6B |0 + \x9B\xCA |0 + \xF2\x6A |0 + \xF2\x69 |0 + \xC3\x7B |0 + \xFD\xFE |0 + \x92\xDC |0 + \xC4\x6C |0 + \xF4\x6A |0 + \xF4\x6B |0 + \xFE\x41 |0 + \x91\xCC |0 + \x91\xE2 |0 + \xF5\xDC |0 + \xF5\xDB |0 + \xC4\xEA |0 + \xF5\xDA |0 + \xF6\xEC |0 + \xF6\xED |0 + \xF7\xE6 |0 + \xF8\xB1 |0 + \xFE\x44 |0 + \xF8\xF6 |0 + \xF9\xBC |0 + \xC6\x79 |0 + \xF9\xC6 |0 + \xA4\xF6 |0 + \x8B\xD3 |0 + \xAA\xA6 |0 + \xAA\xA7 |0 + \xFE\x47 |0 + \xAC\xB8 |0 + \xC0\xEF |0 + \xA4\xF7 |0 + \xAA\xA8 |0 + \xAF\x52 |0 + \xB7\xDD |0 + \xA4\xF8 |0 + \xB2\x6E |0 + \xBA\xB8 |0 + \xC9\x62 |0 + \xFE\x48 |0 + \xCF\xB7 |0 + \xD2\x7D |0 + \xE2\xC5 |0 + \xC0\xF0 |0 + \xA4\xF9 |0 + \xAA\xA9 |0 + \xCF\xB8 |0 + \xCF\xB9 |0 + \xDA\x66 |0 + \xB5\x50 |0 + \xDE\xA4 |0 + \x94\x55 |0 + \xB7\xDE |0 + \xE2\xC6 |0 + \xFE\x4B |0 + \xBC\xF8 |0 + \xFE\x4C |0 + \xC3\x7C |0 + \xA4\xFA |0 + \xDA\x67 |0 + \xA4\xFB |0 + \x8D\xBF |0 + \xA6\xC9 |0 + \xCA\x42 |0 + \xA6\xC8 |0 + \xA8\x65 |0 + \xA8\x64 |0 + \xA8\x63 |0 + \xCB\x60 |0 + \x9E\x78 |0 + \xAA\xAA |0 + \xAA\xAB |0 + \xCD\x5B |0 + \xCF\xBA |0 + \xCF\xBD |0 + \xAC\xBA |0 + \xCF\xBB |0 + \xAC\xB9 |0 + \xCF\xBC |0 + \xAC\xBB |0 + \xD2\xA2 |0 + \xD2\xA1 |0 + \xD2\x7E |0 + \xAF\x53 |0 + \xD6\x5D |0 + \xD6\x5E |0 + \xB2\x6F |0 + \xD6\x5C |0 + \xD6\x5F |0 + \xB5\x52 |0 + \xB2\x70 |0 + \xFE\x51 |0 + \xB5\x51 |0 + \xDA\x6B |0 + \xDA\x6A |0 + \x94\x56 |0 + \xDA\x68 |0 + \xDA\x69 |0 + \xDA\x6C |0 + \xDE\xA6 |0 + \xDE\xA5 |0 + \xDE\xA9 |0 + \x9D\x61 |0 + \xDE\xA8 |0 + \xDE\xA7 |0 + \xBA\xB9 |0 + \xE2\xC9 |0 + \x94\x57 |0 + \xE2\xC8 |0 + \xBA\xBA |0 + \xE2\xC7 |0 + \xE6\x73 |0 + \xE6\x74 |0 + \xBC\xF9 |0 + \xEA\x59 |0 + \xEA\x5A |0 + \x99\x66 |0 + \xF2\x72 |0 + \xC3\x7D |0 + \xF2\x71 |0 + \xF2\x70 |0 + \xF2\x6E |0 + \xF2\x6F |0 + \xC4\xEB |0 + \xF4\x6C |0 + \xF6\xEE |0 + \xF8\xF7 |0 + \xA4\xFC |0 + \x8B\xD5 |0 + \xC9\xA5 |0 + \xA5\xC7 |0 + \xC9\xA6 |0 + \xA0\x69 |0 + \xCA\x43 |0 + \xCA\x44 |0 + \xCB\x66 |0 + \xCB\x62 |0 + \xCB\x61 |0 + \xAA\xAC |0 + \xCB\x65 |0 + \xA8\x67 |0 + \xCB\x63 |0 + \xA8\x66 |0 + \xCB\x67 |0 + \xCB\x64 |0 + \xCD\x5F |0 + \xCF\xBE |0 + \xCD\x5D |0 + \xCD\x64 |0 + \x98\xB4 |0 + \xAA\xAD |0 + \xAA\xB0 |0 + \xCD\x65 |0 + \xCD\x61 |0 + \xCD\x62 |0 + \xCD\x5C |0 + \xAA\xAF |0 + \xCD\x5E |0 + \xAA\xAE |0 + \xCD\x63 |0 + \xCD\x60 |0 + \xCF\xC2 |0 + \xAC\xBD |0 + \xAC\xBE |0 + \xA0\x49 |0 + \xCF\xC5 |0 + \xCF\xBF |0 + \xCF\xC4 |0 + \xCF\xC0 |0 + \xAC\xBC |0 + \xCF\xC3 |0 + \xCF\xC1 |0 + \xD2\xA8 |0 + \xD2\xA5 |0 + \xD2\xA7 |0 + \xAF\x58 |0 + \xAF\x57 |0 + \xAF\x55 |0 + \xD2\xA4 |0 + \xD2\xA9 |0 + \xAF\x54 |0 + \xAF\x56 |0 + \xD2\xA6 |0 + \xD6\x67 |0 + \xD2\xA3 |0 + \xD2\xAA |0 + \xA0\x4C |0 + \x9E\x65 |0 + \xD6\x62 |0 + \xD6\x66 |0 + \xD6\x65 |0 + \xDA\x6E |0 + \xDA\x79 |0 + \xD6\x68 |0 + \x98\xB5 |0 + \xD6\x63 |0 + \xDA\x6D |0 + \xB2\x74 |0 + \xB2\x73 |0 + \xD6\x61 |0 + \xD6\x64 |0 + \xB2\x75 |0 + \xB2\x72 |0 + \xB2\x71 |0 + \xD6\x60 |0 + \xD6\x69 |0 + \xDA\x70 |0 + \xDA\x77 |0 + \xB5\x54 |0 + \xDA\x76 |0 + \xDA\x73 |0 + \xFE\x58 |0 + \xB5\x56 |0 + \x99\x75 |0 + \xFE\x53 |0 + \xA0\x65 |0 + \xDA\x75 |0 + \xFE\x59 |0 + \xDA\x6F |0 + \xDA\x71 |0 + \xDA\x74 |0 + \xDA\x72 |0 + \xB5\x55 |0 + \xDA\x78 |0 + \xB5\x53 |0 + \xB7\xDF |0 + \x98\xB7 |0 + \x98\xB8 |0 + \xDE\xAD |0 + \xDE\xAC |0 + \xDE\xAA |0 + \xB7\xE2 |0 + \xB7\xE1 |0 + \xDE\xAE |0 + \x98\xBA |0 + \xDE\xAB |0 + \xE2\xCA |0 + \xBA\xBB |0 + \xB7\xE0 |0 + \x98\xBB |0 + \xDE\xB0 |0 + \xDE\xAF |0 + \xE2\xCD |0 + \xE2\xCB |0 + \xBC\xFA |0 + \x9F\xBC |0 + \xBA\xBC |0 + \xE2\xCC |0 + \xE6\x76 |0 + \xBC\xFB |0 + \xE6\x75 |0 + \xE6\x7E |0 + \xE6\x7D |0 + \xE6\x7B |0 + \xE6\x7A |0 + \xE6\x77 |0 + \xE6\x78 |0 + \xE6\x79 |0 + \xE6\x7C |0 + \xE6\xA1 |0 + \xEA\x5F |0 + \xEA\x5C |0 + \xEA\x5D |0 + \xBF\x57 |0 + \xEA\x5B |0 + \xEA\x61 |0 + \xEA\x60 |0 + \xEA\x5E |0 + \xED\x64 |0 + \xED\x65 |0 + \xC0\xF1 |0 + \xA0\x4A |0 + \xC0\xF2 |0 + \xED\x63 |0 + \x9E\xC7 |0 + \xC2\x79 |0 + \xEF\xFE |0 + \xC2\x78 |0 + \xC3\x7E |0 + \xC3\xA1 |0 + \xC4\x6D |0 + \xF4\x6E |0 + \xF4\x6D |0 + \xF5\xDD |0 + \xF6\xEF |0 + \xC5\x7A |0 + \xF7\xE8 |0 + \xF7\xE7 |0 + \xF7\xE9 |0 + \xA5\xC8 |0 + \xCF\xC6 |0 + \xAF\x59 |0 + \xB2\x76 |0 + \xD6\x6A |0 + \xA5\xC9 |0 + \xC9\xA7 |0 + \xA4\xFD |0 + \x8C\xA9 |0 + \xCA\x45 |0 + \x98\xAE |0 + \xCB\x6C |0 + \xCB\x6A |0 + \xCB\x6B |0 + \xCB\x68 |0 + \xA8\x68 |0 + \xCB\x69 |0 + \x92\xD6 |0 + \xFA\xE1 |0 + \xCD\x6D |0 + \x91\xD4 |0 + \xAA\xB3 |0 + \xCD\x6B |0 + \xCD\x67 |0 + \xCD\x6A |0 + \xCD\x66 |0 + \xAA\xB5 |0 + \xCD\x69 |0 + \xFA\xDE |0 + \xAA\xB2 |0 + \xAA\xB1 |0 + \xFE\x5B |0 + \xAA\xB4 |0 + \xCD\x6C |0 + \xCD\x68 |0 + \xAC\xC2 |0 + \xAC\xC5 |0 + \xCF\xCE |0 + \xCF\xCD |0 + \xCF\xCC |0 + \xAC\xBF |0 + \xCF\xD5 |0 + \xCF\xCB |0 + \x8C\x53 |0 + \xAC\xC1 |0 + \xD2\xAF |0 + \xCF\xD2 |0 + \xCF\xD0 |0 + \xAC\xC4 |0 + \xCF\xC8 |0 + \xCF\xD3 |0 + \xCF\xCA |0 + \xCF\xD4 |0 + \xCF\xD1 |0 + \xCF\xC9 |0 + \xFE\x5E |0 + \xAC\xC0 |0 + \xCF\xD6 |0 + \xCF\xC7 |0 + \xAC\xC3 |0 + \xFB\xD7 |0 + \xFE\x5A |0 + \x94\xC5 |0 + \xD2\xB4 |0 + \xD2\xAB |0 + \xD2\xB6 |0 + \xFA\xCA |0 + \xD2\xAE |0 + \xD2\xB9 |0 + \xD2\xBA |0 + \xD2\xAC |0 + \xD2\xB8 |0 + \xD2\xB5 |0 + \xD2\xB3 |0 + \xD2\xB7 |0 + \xAF\x5F |0 + \xAF\x5D |0 + \x98\xC1 |0 + \x97\x5C |0 + \xD2\xB1 |0 + \xFE\x74 |0 + \xD2\xAD |0 + \x97\x73 |0 + \xD2\xB0 |0 + \xD2\xBB |0 + \xD2\xB2 |0 + \xAF\x5E |0 + \xCF\xCF |0 + \xAF\x5A |0 + \xAF\x5C |0 + \xFA\x46 |0 + \x97\x64 |0 + \xD6\x78 |0 + \xD6\x6D |0 + \xD6\x6B |0 + \xFE\x68 |0 + \xD6\x6C |0 + \x96\x4E |0 + \xD6\x73 |0 + \x97\x65 |0 + \xD6\x74 |0 + \xD6\x70 |0 + \xB2\x7B |0 + \xD6\x75 |0 + \xD6\x72 |0 + \xD6\x6F |0 + \x8C\x5A |0 + \xB2\x79 |0 + \xD6\x6E |0 + \xB2\x77 |0 + \xB2\x7A |0 + \xD6\x71 |0 + \xD6\x79 |0 + \xAF\x5B |0 + \xB2\x78 |0 + \xD6\x77 |0 + \xD6\x76 |0 + \xB2\x7C |0 + \x89\xA1 |0 + \x95\xFA |0 + \x92\xD4 |0 + \xFE\x69 |0 + \xDA\x7E |0 + \xFB\x45 |0 + \x98\xC8 |0 + \xDA\xA1 |0 + \xB5\x60 |0 + \x90\xEF |0 + \xDA\xA7 |0 + \x98\xC9 |0 + \x98\xCA |0 + \xDA\xA9 |0 + \xDA\xA2 |0 + \xB5\x5A |0 + \xDA\xA6 |0 + \xDA\xA5 |0 + \xB5\x5B |0 + \xB5\x61 |0 + \xB5\x62 |0 + \xDA\xA8 |0 + \xB5\x58 |0 + \xDA\x7D |0 + \xDA\x7B |0 + \xDA\xA3 |0 + \xDA\x7A |0 + \xB5\x5F |0 + \xDA\x7C |0 + \xDA\xA4 |0 + \xDA\xAA |0 + \xB5\x59 |0 + \xB5\x5E |0 + \xB5\x5C |0 + \xB5\x5D |0 + \x94\x6D |0 + \x94\xB7 |0 + \xFE\x6C |0 + \xB5\x57 |0 + \x94\x6B |0 + \xB7\xE9 |0 + \xDE\xB7 |0 + \xB7\xE8 |0 + \xDE\xBB |0 + \x92\xFC |0 + \xDE\xB1 |0 + \x95\xEB |0 + \xDE\xBC |0 + \xFE\x73 |0 + \x97\x6E |0 + \xFE\x5F |0 + \xDE\xB2 |0 + \xDE\xB3 |0 + \xDE\xBD |0 + \xDE\xBA |0 + \xDE\xB8 |0 + \xDE\xB9 |0 + \xDE\xB5 |0 + \xDE\xB4 |0 + \xFD\xBD |0 + \xDE\xBE |0 + \xB7\xE5 |0 + \x92\xD5 |0 + \xDE\xB6 |0 + \xB7\xEA |0 + \xB7\xE4 |0 + \xB7\xEB |0 + \xB7\xEC |0 + \xFE\xB9 |0 + \xB7\xE7 |0 + \xB7\xE6 |0 + \xFE\x71 |0 + \xE2\xCE |0 + \xBA\xBE |0 + \xBA\xBD |0 + \xFB\xBB |0 + \xE2\xD3 |0 + \x94\x7A |0 + \xBC\xFC |0 + \xBA\xBF |0 + \x95\xFB |0 + \xFE\x77 |0 + \xBA\xC1 |0 + \xE2\xD4 |0 + \xB7\xE3 |0 + \xBA\xC0 |0 + \xE2\xD0 |0 + \xE2\xD2 |0 + \xE2\xCF |0 + \xFE\x79 |0 + \xE2\xD1 |0 + \xFE\x75 |0 + \xE6\xAB |0 + \x94\x5D |0 + \xE6\xAA |0 + \xE6\xA7 |0 + \xBD\x40 |0 + \xEA\x62 |0 + \xBD\x41 |0 + \xE6\xA6 |0 + \xFE\x7C |0 + \xBC\xFE |0 + \xE6\xA8 |0 + \xE6\xA5 |0 + \xE6\xA2 |0 + \xE6\xA9 |0 + \xE6\xA3 |0 + \xE6\xA4 |0 + \xBC\xFD |0 + \x93\x44 |0 + \x8E\xA6 |0 + \xED\x69 |0 + \xEA\x66 |0 + \xEA\x65 |0 + \xEA\x67 |0 + \xED\x66 |0 + \xBF\x5A |0 + \x92\xD3 |0 + \xEA\x63 |0 + \x94\xB8 |0 + \xBF\x58 |0 + \xBF\x5C |0 + \xBF\x5B |0 + \xEA\x64 |0 + \xEA\x68 |0 + \xBF\x59 |0 + \xFC\x71 |0 + \xED\x6D |0 + \xC0\xF5 |0 + \xC2\x7A |0 + \xC0\xF6 |0 + \xC0\xF3 |0 + \xED\x6A |0 + \xED\x68 |0 + \xED\x6B |0 + \xED\x6E |0 + \xC0\xF4 |0 + \xED\x6C |0 + \xED\x67 |0 + \x97\x5E |0 + \xF0\x42 |0 + \xF0\x45 |0 + \xF2\x75 |0 + \xF0\x40 |0 + \x8C\xAD |0 + \xF4\x6F |0 + \xF0\x46 |0 + \xC3\xA2 |0 + \xF0\x44 |0 + \xC2\x7B |0 + \xF0\x41 |0 + \xF0\x43 |0 + \xF0\x47 |0 + \xF2\x76 |0 + \xF2\x74 |0 + \xFE\xA7 |0 + \xC3\xA3 |0 + \xF2\x73 |0 + \x94\x6A |0 + \xC4\x6E |0 + \x93\xE3 |0 + \x98\xCF |0 + \xC4\xED |0 + \xF6\xF1 |0 + \xC4\xEC |0 + \xF6\xF3 |0 + \xF6\xF0 |0 + \xF6\xF2 |0 + \xC5\xD0 |0 + \xF8\xB2 |0 + \xA5\xCA |0 + \xCD\x6E |0 + \xD2\xBC |0 + \xD2\xBD |0 + \xB2\x7D |0 + \xDE\xBF |0 + \xBF\x5D |0 + \xC3\xA4 |0 + \xC5\x7B |0 + \xF8\xB3 |0 + \xA5\xCB |0 + \xA0\xD9 |0 + \xCD\x6F |0 + \xA2\x60 |0 + \xCF\xD7 |0 + \xCF\xD8 |0 + \xA0\xBF |0 + \xA0\x4D |0 + \xA0\xB8 |0 + \xD2\xBE |0 + \xD2\xBF |0 + \xB2\x7E |0 + \xB2\xA1 |0 + \xA0\xCE |0 + \xDA\xAB |0 + \xDE\xC2 |0 + \xDE\xC1 |0 + \xDE\xC0 |0 + \xE2\xD5 |0 + \xE2\xD6 |0 + \xE2\xD7 |0 + \xBA\xC2 |0 + \xA0\xB7 |0 + \xE6\xAD |0 + \xE6\xAC |0 + \xEA\x69 |0 + \xBF\x5E |0 + \xBF\x5F |0 + \xFE\xA9 |0 + \xED\x72 |0 + \xED\x6F |0 + \xED\x70 |0 + \xED\x71 |0 + \xF0\x49 |0 + \xF0\x48 |0 + \xC2\x7C |0 + \xF2\x77 |0 + \xF5\xDE |0 + \xA5\xCC |0 + \x89\xC3 |0 + \xAC\xC6 |0 + \xB2\xA2 |0 + \xDE\xC3 |0 + \xFE\xAB |0 + \xA5\xCD |0 + \xD2\xC0 |0 + \xB2\xA3 |0 + \xB5\x63 |0 + \xB5\x64 |0 + \xA5\xCE |0 + \xA5\xCF |0 + \xCA\x46 |0 + \xA8\x6A |0 + \xA8\x69 |0 + \xAC\xC7 |0 + \xCF\xD9 |0 + \xDA\xAC |0 + \xA5\xD0 |0 + \xA5\xD1 |0 + \xA5\xD2 |0 + \xA5\xD3 |0 + \x9D\xF4 |0 + \x89\x6D |0 + \xA8\x6B |0 + \xA8\x6C |0 + \xCB\x6E |0 + \xCB\x6D |0 + \x9C\x7B |0 + \xAA\xB6 |0 + \xCD\x72 |0 + \xCD\x70 |0 + \xCD\x71 |0 + \x98\xD2 |0 + \x9F\xA9 |0 + \xCF\xDA |0 + \xCF\xDB |0 + \xFE\xB2 |0 + \xAC\xCB |0 + \xAC\xC9 |0 + \xFE\xB1 |0 + \xAC\xCA |0 + \xAC\xC8 |0 + \x97\xD9 |0 + \xA0\xC4 |0 + \xAF\x60 |0 + \x94\x76 |0 + \xAF\x64 |0 + \xAF\x63 |0 + \xD2\xC1 |0 + \xAF\x62 |0 + \xAF\x61 |0 + \xD2\xC2 |0 + \x99\x78 |0 + \xB2\xA6 |0 + \xD6\x7B |0 + \xD6\x7A |0 + \xB2\xA4 |0 + \xB2\xA5 |0 + \xFE\xB3 |0 + \xB5\x66 |0 + \xB5\x65 |0 + \xDA\xAE |0 + \x98\xD3 |0 + \xFE\xB4 |0 + \xDA\xAD |0 + \xB2\xA7 |0 + \x98\xD4 |0 + \xB7\xED |0 + \xDE\xC5 |0 + \xB7\xEE |0 + \xDE\xC4 |0 + \x9F\xB9 |0 + \xE2\xD8 |0 + \xE6\xAE |0 + \xBD\x42 |0 + \xEA\x6A |0 + \x94\x71 |0 + \xED\x73 |0 + \xC3\xA6 |0 + \xC3\xA5 |0 + \xC5\x7C |0 + \xA5\xD4 |0 + \xCD\x73 |0 + \x98\xD5 |0 + \xFE\xB8 |0 + \xB2\xA8 |0 + \xE2\xD9 |0 + \xBA\xC3 |0 + \xC6\xD4 |0 + \xCB\x6F |0 + \xCB\x70 |0 + \xCD\x74 |0 + \xAA\xB8 |0 + \xAA\xB9 |0 + \xAA\xB7 |0 + \xFE\xBA |0 + \xAC\xCF |0 + \xAC\xD0 |0 + \xAC\xCD |0 + \xAC\xCE |0 + \xCF\xDC |0 + \xCF\xDD |0 + \xAC\xCC |0 + \xD2\xC3 |0 + \x9E\x5C |0 + \xAF\x68 |0 + \xAF\x69 |0 + \xFE\xBB |0 + \xB2\xAB |0 + \xD2\xC9 |0 + \xAF\x6E |0 + \xAF\x6C |0 + \xD2\xCA |0 + \xD2\xC5 |0 + \xAF\x6B |0 + \xAF\x6A |0 + \xAF\x65 |0 + \xD2\xC8 |0 + \xD2\xC7 |0 + \xD2\xC4 |0 + \xAF\x6D |0 + \xA0\x44 |0 + \xD2\xC6 |0 + \xAF\x66 |0 + \xAF\x67 |0 + \x98\xD7 |0 + \xB2\xAC |0 + \xD6\xA1 |0 + \xD6\xA2 |0 + \xB2\xAD |0 + \xD6\x7C |0 + \xD6\x7E |0 + \xD6\xA4 |0 + \xD6\xA3 |0 + \xD6\x7D |0 + \xB2\xA9 |0 + \xB2\xAA |0 + \xDA\xB6 |0 + \xB5\x6B |0 + \xB5\x6A |0 + \xDA\xB0 |0 + \xB5\x68 |0 + \x98\xD8 |0 + \xDA\xB3 |0 + \xB5\x6C |0 + \xDA\xB4 |0 + \xB5\x6D |0 + \xDA\xB1 |0 + \xB5\x67 |0 + \xB5\x69 |0 + \xDA\xB5 |0 + \xDA\xB2 |0 + \xDA\xAF |0 + \xDE\xD2 |0 + \xDE\xC7 |0 + \xB7\xF0 |0 + \xB7\xF3 |0 + \xB7\xF2 |0 + \xB7\xF7 |0 + \xB7\xF6 |0 + \xDE\xD3 |0 + \xDE\xD1 |0 + \xDE\xCA |0 + \xDE\xCE |0 + \xDE\xCD |0 + \xB7\xF4 |0 + \xDE\xD0 |0 + \xDE\xCC |0 + \xDE\xD4 |0 + \xDE\xCB |0 + \xB7\xF5 |0 + \xB7\xEF |0 + \xB7\xF1 |0 + \xFE\xBC |0 + \xDE\xC9 |0 + \x9F\xFE |0 + \xE2\xDB |0 + \xBA\xC7 |0 + \xE2\xDF |0 + \xBA\xC6 |0 + \xE2\xDC |0 + \xBA\xC5 |0 + \xDE\xC8 |0 + \xDE\xCF |0 + \xE2\xDE |0 + \xBA\xC8 |0 + \xE2\xE0 |0 + \xE2\xDD |0 + \xE2\xDA |0 + \xE6\xB1 |0 + \xE6\xB5 |0 + \xE6\xB7 |0 + \xE6\xB3 |0 + \xE6\xB2 |0 + \xE6\xB0 |0 + \xBD\x45 |0 + \xBD\x43 |0 + \xBD\x48 |0 + \xBD\x49 |0 + \xE6\xB4 |0 + \xBD\x46 |0 + \xE6\xAF |0 + \xBD\x47 |0 + \xBA\xC4 |0 + \xE6\xB6 |0 + \xBD\x44 |0 + \xFE\xBD |0 + \xEA\x6C |0 + \xEA\x6B |0 + \xEA\x73 |0 + \xEA\x6D |0 + \xEA\x72 |0 + \xEA\x6F |0 + \xBF\x60 |0 + \xEA\x71 |0 + \xBF\x61 |0 + \xBF\x62 |0 + \x9D\xDD |0 + \xEA\x70 |0 + \xEA\x6E |0 + \x9E\xE1 |0 + \xC0\xF8 |0 + \xED\x74 |0 + \xC0\xF7 |0 + \xED\x77 |0 + \xED\x75 |0 + \xED\x76 |0 + \xC0\xF9 |0 + \x98\xDA |0 + \x9D\xDF |0 + \xFE\xBF |0 + \xF0\x4D |0 + \xFE\xBE |0 + \xC2\xA1 |0 + \xF0\x4E |0 + \x9E\xEB |0 + \xC2\x7D |0 + \xF0\x4F |0 + \xC2\x7E |0 + \xF0\x4C |0 + \xF0\x50 |0 + \xF0\x4A |0 + \xC3\xA7 |0 + \xF2\x78 |0 + \xC3\xA8 |0 + \xC4\x6F |0 + \xF0\x4B |0 + \xC4\x70 |0 + \x9E\x59 |0 + \xA0\x5C |0 + \xC4\xEE |0 + \xF5\xDF |0 + \xC5\x7E |0 + \xF6\xF4 |0 + \xC5\x7D |0 + \xFE\xC0 |0 + \xF7\xEA |0 + \xC5\xF5 |0 + \xC5\xF6 |0 + \x94\x77 |0 + \x98\xDC |0 + \xF9\xCC |0 + \xFE\xC1 |0 + \xAC\xD1 |0 + \xCF\xDE |0 + \x98\xDE |0 + \xB5\x6E |0 + \xB5\x6F |0 + \xA5\xD5 |0 + \xA6\xCA |0 + \xCA\x47 |0 + \xCB\x71 |0 + \xA8\x6D |0 + \xAA\xBA |0 + \xAC\xD2 |0 + \xAC\xD3 |0 + \xAC\xD4 |0 + \xD6\xA6 |0 + \xD2\xCB |0 + \xAF\x6F |0 + \xB2\xAE |0 + \xD6\xA5 |0 + \xFE\xC3 |0 + \xDA\xB8 |0 + \xB5\x71 |0 + \xDA\xB7 |0 + \xB5\x70 |0 + \xDE\xD5 |0 + \xBD\x4A |0 + \xE6\xBB |0 + \xE6\xB8 |0 + \xE6\xB9 |0 + \xE6\xBA |0 + \xFE\xC8 |0 + \xED\x78 |0 + \xFE\xC9 |0 + \xF0\x51 |0 + \xF4\x71 |0 + \xF4\x70 |0 + \xF6\xF5 |0 + \xA5\xD6 |0 + \xCD\x75 |0 + \xAF\x70 |0 + \xB5\x72 |0 + \xDE\xD6 |0 + \xFE\xCA |0 + \xE2\xE1 |0 + \xBD\x4B |0 + \xEA\x74 |0 + \xF0\x52 |0 + \xF4\x72 |0 + \xA5\xD7 |0 + \xAA\xBB |0 + \xAC\xD7 |0 + \xCF\xDF |0 + \xAC\xD8 |0 + \xAC\xD6 |0 + \xAC\xD5 |0 + \xD2\xCC |0 + \xAF\x71 |0 + \xFE\xCB |0 + \xAF\x72 |0 + \xAF\x73 |0 + \xB2\xB0 |0 + \xD6\xA7 |0 + \xB2\xAF |0 + \x9F\xC2 |0 + \x8C\x6B |0 + \xDA\xB9 |0 + \xB2\xB1 |0 + \xB5\x73 |0 + \xDE\xD7 |0 + \xB7\xF8 |0 + \xB7\xF9 |0 + \xBA\xC9 |0 + \xBA\xCA |0 + \xBD\x4C |0 + \xBF\x64 |0 + \xEA\x75 |0 + \xBF\x63 |0 + \xED\x79 |0 + \xC0\xFA |0 + \xF0\x53 |0 + \xF4\x73 |0 + \xA5\xD8 |0 + \xA8\x6E |0 + \xCD\x78 |0 + \xCD\x77 |0 + \xAA\xBC |0 + \xCD\x76 |0 + \xAA\xBD |0 + \xCD\x79 |0 + \xCF\xE5 |0 + \xAC\xDB |0 + \xAC\xDA |0 + \xCF\xE7 |0 + \xCF\xE6 |0 + \xAC\xDF |0 + \xAC\xDE |0 + \xAC\xD9 |0 + \xCF\xE1 |0 + \xCF\xE2 |0 + \xCF\xE3 |0 + \xAC\xE0 |0 + \xCF\xE0 |0 + \xAC\xDC |0 + \xCF\xE4 |0 + \xAC\xDD |0 + \x98\xC4 |0 + \x94\xB0 |0 + \x94\xB1 |0 + \xD2\xCF |0 + \xD2\xD3 |0 + \xD2\xD1 |0 + \xD2\xD0 |0 + \xD2\xD4 |0 + \xD2\xD5 |0 + \xD2\xD6 |0 + \xD2\xCE |0 + \xD2\xCD |0 + \xFE\xD1 |0 + \xAF\x75 |0 + \xAF\x76 |0 + \xD2\xD7 |0 + \xD2\xD2 |0 + \xA0\xC1 |0 + \xD6\xB0 |0 + \xFE\xD2 |0 + \xD2\xD8 |0 + \xAF\x77 |0 + \xAF\x74 |0 + \xA0\xCD |0 + \xD6\xAA |0 + \xD6\xA9 |0 + \xD6\xAB |0 + \xD6\xAC |0 + \xD6\xAE |0 + \xD6\xAD |0 + \xD6\xB2 |0 + \xB2\xB5 |0 + \xB2\xB2 |0 + \xB2\xB6 |0 + \xD6\xA8 |0 + \xB2\xB7 |0 + \xD6\xB1 |0 + \xB2\xB4 |0 + \xD6\xAF |0 + \xB2\xB3 |0 + \xFE\xD3 |0 + \x98\xE5 |0 + \xDA\xBC |0 + \xDA\xBE |0 + \xDA\xBA |0 + \xDA\xBB |0 + \xDA\xBF |0 + \xDA\xC1 |0 + \xDA\xC2 |0 + \xDA\xBD |0 + \xDA\xC0 |0 + \xB5\x74 |0 + \xDE\xDB |0 + \xDE\xE0 |0 + \xDE\xD8 |0 + \xDE\xDC |0 + \xFE\xD6 |0 + \xDE\xE1 |0 + \xDE\xDD |0 + \xB7\xFA |0 + \xB8\x43 |0 + \xB7\xFD |0 + \xDE\xD9 |0 + \xDE\xDA |0 + \xBA\xCE |0 + \xB8\x46 |0 + \xB7\xFE |0 + \xB8\x44 |0 + \xB7\xFC |0 + \xDE\xDF |0 + \xB8\x45 |0 + \xDE\xDE |0 + \xB8\x41 |0 + \xB7\xFB |0 + \xB8\x42 |0 + \xDE\xE2 |0 + \xE2\xE6 |0 + \xE2\xE8 |0 + \x91\xE4 |0 + \x8F\xC7 |0 + \x94\xAE |0 + \xB8\x40 |0 + \x8A\x4F |0 + \x94\xB2 |0 + \xE2\xE3 |0 + \xBA\xCC |0 + \xE2\xE9 |0 + \xBA\xCD |0 + \xE2\xE7 |0 + \xE2\xE2 |0 + \xE2\xE5 |0 + \xE2\xEA |0 + \xBA\xCB |0 + \xE2\xE4 |0 + \xBD\x4E |0 + \xE6\xBF |0 + \xE6\xBE |0 + \xBD\x51 |0 + \xBD\x4F |0 + \xE6\xBC |0 + \xBD\x4D |0 + \xE6\xBD |0 + \xBD\x50 |0 + \x8F\xD4 |0 + \xEA\x7D |0 + \xEA\xA1 |0 + \x98\xEA |0 + \xEA\x7E |0 + \xEA\x76 |0 + \xEA\x7A |0 + \xEA\x79 |0 + \xEA\x77 |0 + \xBF\x66 |0 + \xBF\x67 |0 + \xBF\x65 |0 + \xEA\x78 |0 + \xEA\x7B |0 + \xEA\x7C |0 + \xBF\x68 |0 + \xC1\x40 |0 + \xED\xA3 |0 + \xC0\xFC |0 + \xED\x7B |0 + \xC0\xFE |0 + \xC1\x41 |0 + \xFE\xD8 |0 + \xC0\xFD |0 + \xED\xA2 |0 + \xED\x7C |0 + \xC0\xFB |0 + \xED\xA1 |0 + \xED\x7A |0 + \xED\x7E |0 + \xED\x7D |0 + \x9D\xE0 |0 + \xF0\x55 |0 + \xC2\xA4 |0 + \xC2\xA5 |0 + \xC2\xA2 |0 + \x98\xEE |0 + \xC2\xA3 |0 + \xF0\x54 |0 + \x95\xC4 |0 + \xF2\x7B |0 + \xFC\xE8 |0 + \xC3\xA9 |0 + \xF2\x79 |0 + \xF2\x7A |0 + \x98\xEF |0 + \xF4\x74 |0 + \xF4\x77 |0 + \xF4\x75 |0 + \xF4\x76 |0 + \xF5\xE0 |0 + \xC4\xEF |0 + \xF7\xEB |0 + \xF8\xB4 |0 + \xC5\xF7 |0 + \xF8\xF8 |0 + \xF8\xF9 |0 + \xC6\x66 |0 + \xA5\xD9 |0 + \xAC\xE1 |0 + \x8C\x6E |0 + \xDA\xC3 |0 + \xDE\xE3 |0 + \xA5\xDA |0 + \xA8\x6F |0 + \xAA\xBE |0 + \xFA\xD8 |0 + \xCF\xE8 |0 + \xCF\xE9 |0 + \xAF\x78 |0 + \xDA\xC4 |0 + \xB5\x75 |0 + \xB8\x47 |0 + \xC1\x42 |0 + \xED\xA4 |0 + \xF2\x7C |0 + \xF4\x78 |0 + \xA5\xDB |0 + \xFE\xDC |0 + \xCD\xA1 |0 + \xCD\x7A |0 + \xCD\x7C |0 + \xCD\x7E |0 + \xCD\x7D |0 + \xCD\x7B |0 + \xAA\xBF |0 + \xA0\xAE |0 + \xAC\xE2 |0 + \xCF\xF2 |0 + \xCF\xED |0 + \xCF\xEA |0 + \x9D\x4C |0 + \xCF\xF1 |0 + \xAC\xE4 |0 + \xAC\xE5 |0 + \xCF\xF0 |0 + \xCF\xEF |0 + \xCF\xEE |0 + \xCF\xEB |0 + \xCF\xEC |0 + \xCF\xF3 |0 + \xAC\xE3 |0 + \x98\xF1 |0 + \x98\xF3 |0 + \xAF\x7C |0 + \x94\xC1 |0 + \xAF\xA4 |0 + \xAF\xA3 |0 + \xD2\xE1 |0 + \xD2\xDB |0 + \xD2\xD9 |0 + \xAF\xA1 |0 + \xD6\xB9 |0 + \xAF\x7A |0 + \xD2\xDE |0 + \xD2\xE2 |0 + \xD2\xE4 |0 + \xD2\xE0 |0 + \xD2\xDA |0 + \xAF\xA2 |0 + \xD2\xDF |0 + \xD2\xDD |0 + \xAF\x79 |0 + \xD2\xE5 |0 + \xAF\xA5 |0 + \xD2\xE3 |0 + \xAF\x7D |0 + \xD2\xDC |0 + \xAF\x7E |0 + \xAF\x7B |0 + \x98\xF5 |0 + \xFA\x4F |0 + \x96\xE2 |0 + \x94\x50 |0 + \xB2\xB9 |0 + \x96\xA2 |0 + \xD6\xBA |0 + \x98\xF6 |0 + \xD6\xB3 |0 + \xD6\xB5 |0 + \xD6\xB7 |0 + \x96\xE5 |0 + \xD6\xB8 |0 + \xD6\xB6 |0 + \xB2\xBA |0 + \xD6\xBB |0 + \x98\xF7 |0 + \xD6\xB4 |0 + \xA0\x46 |0 + \x96\xE3 |0 + \xDA\xC8 |0 + \xB5\x76 |0 + \xDA\xD0 |0 + \xDA\xC5 |0 + \xDA\xD1 |0 + \xDA\xC6 |0 + \xDA\xC7 |0 + \x98\xF8 |0 + \xDA\xCF |0 + \xDA\xCE |0 + \xDA\xCB |0 + \xB2\xB8 |0 + \xB5\x77 |0 + \xDA\xC9 |0 + \xDA\xCC |0 + \xB5\x78 |0 + \xDA\xCD |0 + \xDA\xCA |0 + \xDE\xEE |0 + \x9E\xE4 |0 + \xDE\xF2 |0 + \xB8\x4E |0 + \xE2\xF0 |0 + \xB8\x51 |0 + \xDE\xF0 |0 + \xF9\xD6 |0 + \xDE\xED |0 + \xDE\xE8 |0 + \xDE\xEA |0 + \xDE\xEB |0 + \xDE\xE4 |0 + \x94\xC3 |0 + \xB8\x4D |0 + \xB8\x4C |0 + \x94\xC2 |0 + \xB8\x48 |0 + \xDE\xE7 |0 + \xB8\x4F |0 + \xB8\x50 |0 + \xDE\xE6 |0 + \xDE\xE9 |0 + \xDE\xF1 |0 + \xB8\x4A |0 + \xB8\x4B |0 + \xDE\xEF |0 + \xDE\xE5 |0 + \xE2\xF2 |0 + \xBA\xD0 |0 + \xE2\xF4 |0 + \xDE\xEC |0 + \xE2\xF6 |0 + \xBA\xD4 |0 + \xE2\xF7 |0 + \xE2\xF3 |0 + \xBA\xD1 |0 + \xE2\xEF |0 + \xBA\xD3 |0 + \xE2\xEC |0 + \xE2\xF1 |0 + \xE2\xF5 |0 + \xE2\xEE |0 + \xFE\xE1 |0 + \xB8\x49 |0 + \xFE\xE9 |0 + \xE2\xEB |0 + \xBA\xD2 |0 + \xE2\xED |0 + \x96\xE4 |0 + \x89\xAC |0 + \x96\xDB |0 + \xBD\x54 |0 + \xE6\xC1 |0 + \xBD\x58 |0 + \xBD\x56 |0 + \xBA\xCF |0 + \xE6\xC8 |0 + \xE6\xC9 |0 + \xBD\x53 |0 + \xFE\xE2 |0 + \xE6\xC7 |0 + \xE6\xCA |0 + \xBD\x55 |0 + \xBD\x52 |0 + \xE6\xC3 |0 + \xE6\xC0 |0 + \xE6\xC5 |0 + \xE6\xC2 |0 + \xBD\x59 |0 + \xE6\xC4 |0 + \x94\xC4 |0 + \xFE\xE3 |0 + \xE6\xC6 |0 + \xBD\x57 |0 + \xFE\xE7 |0 + \x9F\xFB |0 + \xBF\x6A |0 + \xEA\xA8 |0 + \xEA\xA2 |0 + \xEA\xA6 |0 + \xEA\xAC |0 + \xEA\xAD |0 + \xEA\xA9 |0 + \xEA\xAA |0 + \xEA\xA7 |0 + \x8C\x59 |0 + \xEA\xA4 |0 + \xBF\x6C |0 + \xBF\x69 |0 + \xEA\xA3 |0 + \xEA\xA5 |0 + \xBF\x6B |0 + \xEA\xAB |0 + \x93\xC9 |0 + \xC1\x46 |0 + \x94\xE8 |0 + \xFB\x56 |0 + \xED\xAA |0 + \xED\xA5 |0 + \xC1\x45 |0 + \x90\xC5 |0 + \xC1\x43 |0 + \xED\xAC |0 + \xC1\x44 |0 + \xED\xA8 |0 + \xED\xA9 |0 + \xED\xA6 |0 + \xED\xAD |0 + \xF0\x56 |0 + \xC1\x47 |0 + \xED\xA7 |0 + \xED\xAE |0 + \xED\xAB |0 + \xA0\xA8 |0 + \xF0\x5A |0 + \xF0\x57 |0 + \xC2\xA6 |0 + \xF0\x5B |0 + \xF0\x5D |0 + \xF0\x5C |0 + \xF0\x58 |0 + \xF0\x59 |0 + \xF2\xA3 |0 + \xC3\xAA |0 + \xF2\x7E |0 + \xF2\xA2 |0 + \xF2\x7D |0 + \xF2\xA4 |0 + \xF2\xA1 |0 + \xF4\x7A |0 + \xF4\x7D |0 + \xF4\x79 |0 + \xC4\x71 |0 + \xF4\x7B |0 + \xF4\x7C |0 + \xF4\x7E |0 + \xC4\x72 |0 + \xC4\x74 |0 + \xC4\x73 |0 + \xF5\xE1 |0 + \xFE\xE5 |0 + \xF5\xE3 |0 + \xF5\xE2 |0 + \x98\xFD |0 + \x98\xFB |0 + \xFE\xE8 |0 + \xF6\xF6 |0 + \x8E\xBF |0 + \xF8\xB5 |0 + \xF8\xFA |0 + \xA5\xDC |0 + \x8B\xD8 |0 + \xFE\xF7 |0 + \xCB\x72 |0 + \xAA\xC0 |0 + \xCD\xA3 |0 + \xAA\xC1 |0 + \xAA\xC2 |0 + \xCD\xA2 |0 + \xCF\xF8 |0 + \xCF\xF7 |0 + \xAC\xE6 |0 + \xAC\xE9 |0 + \xAC\xE8 |0 + \xAC\xE7 |0 + \xCF\xF4 |0 + \xCF\xF6 |0 + \xCF\xF5 |0 + \xD2\xE8 |0 + \xAF\xA7 |0 + \xD2\xEC |0 + \xD2\xEB |0 + \xD2\xEA |0 + \xD2\xE6 |0 + \xAF\xA6 |0 + \xAF\xAA |0 + \xAF\xAD |0 + \x8F\x68 |0 + \x94\xC6 |0 + \xAF\xAE |0 + \xD2\xE7 |0 + \xD2\xE9 |0 + \xAF\xAC |0 + \xAF\xAB |0 + \xAF\xA9 |0 + \xAF\xA8 |0 + \xD6\xC2 |0 + \x9D\xEA |0 + \xD6\xC0 |0 + \xD6\xBC |0 + \xB2\xBB |0 + \xD6\xBD |0 + \xB2\xBC |0 + \xD6\xBE |0 + \xD6\xBF |0 + \xD6\xC1 |0 + \xB2\xBD |0 + \xDA\xD5 |0 + \xFC\x69 |0 + \xDA\xD4 |0 + \xDA\xD3 |0 + \xDA\xD2 |0 + \xDE\xF6 |0 + \xB8\x52 |0 + \xDE\xF3 |0 + \xDE\xF5 |0 + \x9C\xDA |0 + \xB8\x53 |0 + \xFE\xF3 |0 + \xB8\x54 |0 + \xDE\xF4 |0 + \x9C\x72 |0 + \xFE\xF0 |0 + \x89\xC9 |0 + \xE3\x41 |0 + \xE2\xF9 |0 + \xE2\xFA |0 + \xBA\xD7 |0 + \xBA\xD5 |0 + \xBA\xD6 |0 + \xE3\x43 |0 + \x99\x41 |0 + \xE3\x42 |0 + \xE2\xFE |0 + \xE2\xFD |0 + \xE2\xFC |0 + \xE2\xFB |0 + \xE3\x40 |0 + \xE2\xF8 |0 + \x99\x42 |0 + \xE6\xCB |0 + \xE6\xD0 |0 + \xE6\xCE |0 + \xFE\xF5 |0 + \x91\xD7 |0 + \xE6\xCD |0 + \xE6\xCC |0 + \xE6\xCF |0 + \xEA\xAE |0 + \x94\xCC |0 + \xBF\x6D |0 + \xC1\x48 |0 + \xED\xB0 |0 + \xFE\xF8 |0 + \xC1\x49 |0 + \xED\xAF |0 + \xF0\x5F |0 + \xF0\x5E |0 + \xC2\xA7 |0 + \xF2\xA5 |0 + \xC3\xAB |0 + \xF4\xA1 |0 + \xC5\xA1 |0 + \xF6\xF7 |0 + \xF8\xB7 |0 + \xF8\xB6 |0 + \xC9\xA8 |0 + \xAC\xEA |0 + \xAC\xEB |0 + \xD6\xC3 |0 + \xB8\x56 |0 + \xA5\xDD |0 + \xA8\x72 |0 + \xA8\x71 |0 + \xA8\x70 |0 + \x97\xA8 |0 + \xCD\xA4 |0 + \xFE\xFC |0 + \xAA\xC4 |0 + \xAA\xC3 |0 + \xAC\xEE |0 + \xFD\xBF |0 + \xCF\xFA |0 + \xCF\xFD |0 + \xCF\xFB |0 + \xAC\xEC |0 + \xAC\xED |0 + \xFE\xFE |0 + \xCF\xF9 |0 + \xCF\xFC |0 + \xAF\xB5 |0 + \xD2\xF3 |0 + \xD2\xF5 |0 + \xD2\xF4 |0 + \xAF\xB2 |0 + \xD2\xEF |0 + \x96\xD1 |0 + \xAF\xB0 |0 + \xAF\xAF |0 + \xAF\xB3 |0 + \xAF\xB1 |0 + \xAF\xB4 |0 + \xD2\xF2 |0 + \xD2\xED |0 + \xD2\xEE |0 + \xD2\xF1 |0 + \xD2\xF0 |0 + \x94\xD5 |0 + \x94\xD0 |0 + \xD6\xC6 |0 + \xD6\xC7 |0 + \xD6\xC5 |0 + \xD6\xC4 |0 + \xB2\xBE |0 + \xB5\x7D |0 + \xDA\xD6 |0 + \xDA\xD8 |0 + \xDA\xDA |0 + \xB5\x7C |0 + \x99\x44 |0 + \xB5\x7A |0 + \xDA\xD7 |0 + \xB5\x7B |0 + \xDA\xD9 |0 + \xB5\x79 |0 + \xDF\x41 |0 + \xDE\xF7 |0 + \xDE\xFA |0 + \xDE\xFE |0 + \xB8\x5A |0 + \xDE\xFC |0 + \xDE\xFB |0 + \xDE\xF8 |0 + \xDE\xF9 |0 + \xB8\x58 |0 + \xDF\x40 |0 + \xB8\x57 |0 + \xB8\x5C |0 + \xB8\x5B |0 + \xB8\x59 |0 + \xDE\xFD |0 + \xE3\x49 |0 + \xE3\x48 |0 + \x8C\x63 |0 + \xE3\x44 |0 + \xA0\xB3 |0 + \xBA\xD8 |0 + \xE3\x47 |0 + \xE3\x46 |0 + \xBA\xD9 |0 + \xBD\x5E |0 + \xE6\xD2 |0 + \x94\xCF |0 + \xBD\x5F |0 + \xBD\x5B |0 + \xBD\x5D |0 + \x9F\xFA |0 + \xBD\x5A |0 + \xBD\x5C |0 + \x91\xE5 |0 + \xEA\xAF |0 + \x9C\x6A |0 + \xBF\x70 |0 + \xEA\xB1 |0 + \xEA\xB0 |0 + \x8E\x49 |0 + \xE3\x45 |0 + \xBF\x72 |0 + \xBF\x71 |0 + \xBF\x6E |0 + \xBF\x6F |0 + \xED\xB5 |0 + \xED\xB3 |0 + \xC1\x4A |0 + \xED\xB4 |0 + \xED\xB6 |0 + \xED\xB2 |0 + \xED\xB1 |0 + \xF0\x60 |0 + \xC2\xAA |0 + \xC2\xA8 |0 + \xC2\xA9 |0 + \x8E\x4C |0 + \xF2\xA6 |0 + \xF2\xA7 |0 + \xC3\xAD |0 + \xC3\xAC |0 + \xF4\xA3 |0 + \xF4\xA4 |0 + \xF4\xA2 |0 + \xF6\xF8 |0 + \xF6\xF9 |0 + \xA5\xDE |0 + \xCA\x48 |0 + \xA8\x73 |0 + \xCD\xA5 |0 + \xAA\xC6 |0 + \xAA\xC5 |0 + \xCD\xA6 |0 + \x8E\x4D |0 + \xD0\x40 |0 + \xAC\xEF |0 + \xCF\xFE |0 + \xAC\xF0 |0 + \x9A\x73 |0 + \xAF\xB6 |0 + \xD2\xF8 |0 + \xD2\xF6 |0 + \xD2\xFC |0 + \xAF\xB7 |0 + \xD2\xF7 |0 + \xD2\xFB |0 + \xD2\xF9 |0 + \xD2\xFA |0 + \xD6\xC8 |0 + \xD6\xCA |0 + \x99\x47 |0 + \xB2\xBF |0 + \x8C\xB1 |0 + \xD6\xC9 |0 + \xB2\xC0 |0 + \xB5\xA2 |0 + \xB5\xA1 |0 + \xB5\x7E |0 + \xDA\xDB |0 + \xDF\x44 |0 + \xB8\x5D |0 + \xB8\x5E |0 + \xDF\x43 |0 + \xDF\x42 |0 + \xE3\x4A |0 + \xBA\xDB |0 + \xBA\xDA |0 + \xE3\x4B |0 + \xE3\x4C |0 + \xBD\x61 |0 + \xBD\x60 |0 + \x8E\x50 |0 + \xEA\xB5 |0 + \xE6\xD3 |0 + \xE6\xD5 |0 + \xE6\xD4 |0 + \xEA\xB4 |0 + \xEA\xB2 |0 + \xEA\xB6 |0 + \xEA\xB3 |0 + \xBF\x73 |0 + \x8E\x4F |0 + \x99\x49 |0 + \xED\xB7 |0 + \xC1\x4B |0 + \xED\xB8 |0 + \xED\xB9 |0 + \x8E\x51 |0 + \x8E\x52 |0 + \xC2\xAB |0 + \xC2\xAC |0 + \xC4\x75 |0 + \x9A\xB2 |0 + \x89\xA5 |0 + \xC5\xD1 |0 + \xA5\xDF |0 + \x99\x4C |0 + \xD0\x41 |0 + \x9F\xF8 |0 + \xD2\xFD |0 + \xAF\xB8 |0 + \x8E\x56 |0 + \x99\x4D |0 + \x91\xCA |0 + \x8E\x57 |0 + \xB3\xBA |0 + \xB3\xB9 |0 + \x94\xE1 |0 + \xB5\xA4 |0 + \xDA\xDD |0 + \xB5\xA3 |0 + \xDA\xDC |0 + \x90\x47 |0 + \x8F\xD8 |0 + \x8E\x58 |0 + \xDF\x45 |0 + \xBA\xDC |0 + \xE3\x4D |0 + \xBA\xDD |0 + \xC4\x76 |0 + \xF4\xA5 |0 + \xA6\xCB |0 + \xAA\xC7 |0 + \xCD\xA7 |0 + \xAC\xF2 |0 + \x94\xEB |0 + \xAC\xF1 |0 + \xD0\x42 |0 + \xD0\x43 |0 + \xD3\x40 |0 + \xD3\x42 |0 + \xAF\xB9 |0 + \xD3\x44 |0 + \xD3\x47 |0 + \xD3\x45 |0 + \x8E\x5C |0 + \x95\x53 |0 + \xD3\x46 |0 + \xD3\x43 |0 + \xD2\xFE |0 + \xAF\xBA |0 + \xD3\x48 |0 + \xD3\x41 |0 + \x9F\xE5 |0 + \xD6\xD3 |0 + \xB2\xC6 |0 + \xD6\xDC |0 + \xB2\xC3 |0 + \xD6\xD5 |0 + \xB2\xC7 |0 + \x9F\x56 |0 + \xB2\xC1 |0 + \xD6\xD0 |0 + \xD6\xDD |0 + \xD6\xD1 |0 + \xD6\xCE |0 + \xB2\xC5 |0 + \x95\x4F |0 + \xB2\xC2 |0 + \x8E\x5E |0 + \xD6\xD4 |0 + \xD6\xD7 |0 + \xB2\xC4 |0 + \xD6\xD8 |0 + \xB2\xC8 |0 + \xD6\xD9 |0 + \xD6\xCF |0 + \xD6\xD6 |0 + \xD6\xDA |0 + \xD6\xD2 |0 + \xD6\xCD |0 + \xD6\xCB |0 + \xD6\xDB |0 + \x99\x6A |0 + \xDA\xDF |0 + \xDA\xE4 |0 + \x9C\x64 |0 + \x9C\xD9 |0 + \xDA\xE0 |0 + \xDA\xE6 |0 + \xB5\xA7 |0 + \xD6\xCC |0 + \xDA\xE1 |0 + \xB5\xA5 |0 + \xDA\xDE |0 + \xB5\xAC |0 + \xDA\xE2 |0 + \xB5\xAB |0 + \xDA\xE3 |0 + \xB5\xAD |0 + \xB5\xA8 |0 + \xB5\xAE |0 + \xB5\xA9 |0 + \xB5\xAA |0 + \x8E\x5D |0 + \xB5\xA6 |0 + \xDA\xE5 |0 + \xB8\x61 |0 + \xDF\x50 |0 + \x99\x50 |0 + \xDF\x53 |0 + \xDF\x47 |0 + \xDF\x4C |0 + \xDF\x46 |0 + \xB8\x63 |0 + \xDF\x4A |0 + \x99\x51 |0 + \xDF\x48 |0 + \xB8\x62 |0 + \x8E\x62 |0 + \xDF\x4F |0 + \xDF\x4E |0 + \xDF\x4B |0 + \xDF\x4D |0 + \xDF\x49 |0 + \xBA\xE1 |0 + \xDF\x52 |0 + \xB8\x5F |0 + \xDF\x51 |0 + \x99\x52 |0 + \xE3\x5D |0 + \xBA\xE8 |0 + \xE3\x58 |0 + \xBA\xE7 |0 + \xE3\x4E |0 + \xE3\x50 |0 + \xBA\xE0 |0 + \xE3\x55 |0 + \xE3\x54 |0 + \xE3\x57 |0 + \xBA\xE5 |0 + \xE3\x52 |0 + \xE3\x51 |0 + \x8E\x68 |0 + \xBA\xE4 |0 + \xBA\xDF |0 + \xE3\x53 |0 + \xBA\xE2 |0 + \xE3\x59 |0 + \xE3\x5B |0 + \xE3\x56 |0 + \xE3\x4F |0 + \xBA\xE3 |0 + \xBD\x69 |0 + \xBA\xDE |0 + \x8E\x61 |0 + \x9F\x59 |0 + \xE3\x5C |0 + \xE6\xD9 |0 + \xBD\x62 |0 + \xE6\xDB |0 + \xBD\x63 |0 + \x8B\xB3 |0 + \xBD\x65 |0 + \xE6\xDE |0 + \xE6\xD6 |0 + \xBA\xE6 |0 + \xE6\xDC |0 + \xE6\xD8 |0 + \xB8\x60 |0 + \xBD\x68 |0 + \xBD\x64 |0 + \xBD\x66 |0 + \xBD\x67 |0 + \xBF\x76 |0 + \xE6\xDD |0 + \xE6\xD7 |0 + \xBD\x6A |0 + \xE6\xDA |0 + \x9F\x5D |0 + \x8E\x66 |0 + \xEA\xC0 |0 + \xEA\xBB |0 + \xEA\xC5 |0 + \xBF\x74 |0 + \xEA\xBD |0 + \xBF\x78 |0 + \xEA\xC3 |0 + \xEA\xBA |0 + \xEA\xB7 |0 + \xEA\xC6 |0 + \xC1\x51 |0 + \xBF\x79 |0 + \xEA\xC2 |0 + \xEA\xB8 |0 + \xBF\x77 |0 + \xEA\xBC |0 + \xBF\x7B |0 + \xEA\xB9 |0 + \xEA\xBE |0 + \xBF\x7A |0 + \xEA\xC1 |0 + \xEA\xC4 |0 + \x8C\xB2 |0 + \xED\xCB |0 + \xED\xCC |0 + \xED\xBC |0 + \xED\xC3 |0 + \xED\xC1 |0 + \xC1\x4F |0 + \xED\xC8 |0 + \xEA\xBF |0 + \x8E\x6E |0 + \xED\xBF |0 + \x9F\x64 |0 + \xED\xC9 |0 + \xC1\x4E |0 + \xED\xBE |0 + \xED\xBD |0 + \xED\xC7 |0 + \xED\xC4 |0 + \xED\xC6 |0 + \xED\xBA |0 + \xED\xCA |0 + \xC1\x4C |0 + \xED\xC5 |0 + \xED\xCE |0 + \xED\xC2 |0 + \xC1\x50 |0 + \xC1\x4D |0 + \xED\xC0 |0 + \xED\xBB |0 + \xED\xCD |0 + \xBF\x75 |0 + \x99\x53 |0 + \xFA\xB8 |0 + \xF0\x63 |0 + \x99\x54 |0 + \xF0\x61 |0 + \xF0\x67 |0 + \xC2\xB0 |0 + \xF0\x65 |0 + \xF0\x64 |0 + \xC2\xB2 |0 + \xF0\x6A |0 + \xC2\xB1 |0 + \xF0\x6B |0 + \xF0\x68 |0 + \xC2\xAE |0 + \xF0\x69 |0 + \xF0\x62 |0 + \xC2\xAF |0 + \xC2\xAD |0 + \xF2\xAB |0 + \xF0\x66 |0 + \xF0\x6C |0 + \xF2\xA8 |0 + \x8E\x70 |0 + \xC3\xB2 |0 + \xC3\xB0 |0 + \xF2\xAA |0 + \xF2\xAC |0 + \xF2\xA9 |0 + \xC3\xB1 |0 + \xC3\xAE |0 + \xC3\xAF |0 + \xC3\xB3 |0 + \x9F\x61 |0 + \xC4\x78 |0 + \x8E\x72 |0 + \xF4\xAA |0 + \xF4\xA9 |0 + \xF4\xA7 |0 + \xF4\xA6 |0 + \xF4\xA8 |0 + \xC4\x77 |0 + \xC4\x79 |0 + \xC4\xF0 |0 + \xA0\x6B |0 + \xF5\xE5 |0 + \xF5\xE4 |0 + \x9F\x40 |0 + \xF6\xFA |0 + \xF6\xFC |0 + \xF6\xFE |0 + \xF6\xFD |0 + \xF6\xFB |0 + \x94\xED |0 + \xC5\xA3 |0 + \xC5\xA2 |0 + \xC5\xD3 |0 + \xC5\xD2 |0 + \xC5\xD4 |0 + \xF7\xED |0 + \xF7\xEC |0 + \xF8\xFB |0 + \xF8\xB8 |0 + \xF8\xFC |0 + \xC6\x58 |0 + \x94\xEE |0 + \xC6\x59 |0 + \xF9\x6D |0 + \x9F\xBD |0 + \xC6\x7E |0 + \xA6\xCC |0 + \x8E\x7B |0 + \xCD\xA8 |0 + \xD0\x45 |0 + \xD0\x46 |0 + \xD0\x44 |0 + \x99\x57 |0 + \x94\xF7 |0 + \xAC\xF3 |0 + \x9F\x5F |0 + \xD0\x47 |0 + \xD0\x48 |0 + \xD0\x49 |0 + \x8E\x73 |0 + \xD3\x49 |0 + \xD3\x4F |0 + \x9F\x62 |0 + \xD3\x4D |0 + \xAF\xBB |0 + \xD3\x4B |0 + \xD3\x4C |0 + \xD3\x4E |0 + \x94\xF6 |0 + \xD3\x4A |0 + \xB2\xC9 |0 + \xD6\xDE |0 + \xB2\xCB |0 + \xD6\xE0 |0 + \xB2\xCA |0 + \xD6\xDF |0 + \x99\x58 |0 + \xDA\xE8 |0 + \xB5\xAF |0 + \xDA\xEA |0 + \xDA\xE7 |0 + \xD6\xE1 |0 + \xB5\xB0 |0 + \x8E\x75 |0 + \xF9\xDB |0 + \xDA\xE9 |0 + \x90\x72 |0 + \x94\xF8 |0 + \xDF\x56 |0 + \xB8\x64 |0 + \xDF\x54 |0 + \xB8\x65 |0 + \xDF\x55 |0 + \xB8\x66 |0 + \x99\x5A |0 + \xBA\xE9 |0 + \xE3\x61 |0 + \xE3\x5E |0 + \xE3\x60 |0 + \xBA\xEA |0 + \xBA\xEB |0 + \xE3\x5F |0 + \xA0\xB0 |0 + \x8C\xB3 |0 + \xE6\xDF |0 + \x8E\x79 |0 + \xE6\xE0 |0 + \x8E\x78 |0 + \xBD\x6B |0 + \xE6\xE2 |0 + \xE6\xE1 |0 + \x94\xF3 |0 + \xA2\x61 |0 + \xEA\xCA |0 + \xEA\xCB |0 + \xEA\xC7 |0 + \x98\xAF |0 + \xEA\xC8 |0 + \xBF\x7C |0 + \xBF\x7D |0 + \xEA\xC9 |0 + \xC1\x57 |0 + \xA0\xB2 |0 + \xC1\x53 |0 + \xC1\x58 |0 + \xC1\x54 |0 + \xC1\x56 |0 + \xC1\x52 |0 + \xC1\x55 |0 + \x8E\x7A |0 + \xC2\xB3 |0 + \xED\xCF |0 + \xF2\xAE |0 + \xF2\xAD |0 + \x99\x5C |0 + \xF4\xAB |0 + \xC4\x7A |0 + \xC4\x7B |0 + \xF7\x41 |0 + \xF5\xE6 |0 + \x8E\x7C |0 + \xF7\x40 |0 + \x8E\x7D |0 + \xF8\xFD |0 + \xF9\xA4 |0 + \xA6\xCD |0 + \x8B\xD9 |0 + \xA8\x74 |0 + \x89\xA2 |0 + \xCD\xA9 |0 + \xAA\xC8 |0 + \xAC\xF6 |0 + \xD0\x4C |0 + \xAC\xF4 |0 + \xD0\x4A |0 + \xAC\xF9 |0 + \xAC\xF5 |0 + \xAC\xFA |0 + \xAC\xF8 |0 + \xD0\x4B |0 + \xAC\xF7 |0 + \xAF\xBF |0 + \xAF\xBE |0 + \xD3\x5A |0 + \xAF\xC7 |0 + \xD3\x53 |0 + \xD3\x59 |0 + \xAF\xC3 |0 + \xD3\x52 |0 + \xD3\x58 |0 + \xD3\x56 |0 + \xAF\xC2 |0 + \xAF\xC4 |0 + \xD3\x55 |0 + \xAF\xBD |0 + \xD3\x54 |0 + \xAF\xC8 |0 + \xAF\xC5 |0 + \xAF\xC9 |0 + \xAF\xC6 |0 + \xD3\x51 |0 + \xD3\x50 |0 + \xD3\x57 |0 + \xAF\xC0 |0 + \xAF\xBC |0 + \xAF\xC1 |0 + \x9E\xD7 |0 + \xD6\xF0 |0 + \xD6\xE9 |0 + \xB5\xB5 |0 + \xD6\xE8 |0 + \xB2\xCF |0 + \xB2\xD6 |0 + \xB2\xD3 |0 + \xB2\xD9 |0 + \xB2\xD8 |0 + \xB2\xD4 |0 + \xD6\xE2 |0 + \xD6\xE5 |0 + \xD6\xE4 |0 + \xB2\xD0 |0 + \xD6\xE6 |0 + \xD6\xEF |0 + \xB2\xD1 |0 + \xD6\xE3 |0 + \xD6\xEC |0 + \xD6\xED |0 + \xB2\xD2 |0 + \xD6\xEA |0 + \xB2\xD7 |0 + \xB2\xCD |0 + \xB2\xD5 |0 + \xD6\xE7 |0 + \xB2\xCC |0 + \xD6\xEB |0 + \xD6\xEE |0 + \xA0\xB6 |0 + \xDA\xFB |0 + \xDA\xF2 |0 + \xB5\xB2 |0 + \xDA\xF9 |0 + \xDA\xF6 |0 + \xDA\xEE |0 + \xDA\xF7 |0 + \xB5\xB4 |0 + \xDA\xEF |0 + \xDA\xEB |0 + \x9E\x42 |0 + \xB8\x6C |0 + \xDA\xF4 |0 + \x8E\xA4 |0 + \xB5\xB1 |0 + \xDA\xFA |0 + \xB5\xB8 |0 + \xB5\xBA |0 + \xDA\xED |0 + \xB5\xB9 |0 + \xDA\xF0 |0 + \xB5\xB3 |0 + \xDA\xF8 |0 + \xDA\xF1 |0 + \xDA\xF5 |0 + \xDA\xF3 |0 + \xB5\xB6 |0 + \xDA\xEC |0 + \xB5\xBB |0 + \xB2\xCE |0 + \xB5\xB7 |0 + \xB5\xBC |0 + \xB8\x68 |0 + \xDF\x5D |0 + \xDF\x5F |0 + \xDF\x61 |0 + \xDF\x65 |0 + \xDF\x5B |0 + \xDF\x59 |0 + \xB8\x6A |0 + \xDF\x60 |0 + \xDF\x64 |0 + \xDF\x5C |0 + \xDF\x58 |0 + \xDF\x57 |0 + \x8E\xA7 |0 + \x8C\x76 |0 + \xDF\x62 |0 + \xDF\x5A |0 + \xDF\x5E |0 + \xB8\x6B |0 + \xB8\x69 |0 + \xDF\x66 |0 + \xB8\x67 |0 + \xDF\x63 |0 + \xE3\x72 |0 + \x95\x42 |0 + \xBA\xEE |0 + \xE3\x6A |0 + \xBD\x78 |0 + \xE3\x74 |0 + \xBA\xF1 |0 + \xE3\x78 |0 + \xBA\xF7 |0 + \xE3\x65 |0 + \x98\x7D |0 + \xE3\x75 |0 + \xE3\x62 |0 + \x97\x55 |0 + \xE3\x77 |0 + \xE3\x66 |0 + \x8E\xA8 |0 + \xBA\xFE |0 + \xBA\xFB |0 + \xE3\x76 |0 + \xE3\x70 |0 + \xBA\xED |0 + \xBA\xF5 |0 + \xBA\xF4 |0 + \x8E\xAA |0 + \xBA\xF3 |0 + \xBA\xF9 |0 + \xE3\x63 |0 + \xBA\xFA |0 + \xE3\x71 |0 + \xBA\xF6 |0 + \xBA\xEC |0 + \xE3\x73 |0 + \xBA\xEF |0 + \xBA\xF0 |0 + \xBA\xF8 |0 + \xE3\x68 |0 + \xE3\x67 |0 + \xE3\x64 |0 + \xE3\x6C |0 + \xE3\x69 |0 + \xE3\x6D |0 + \xBA\xFD |0 + \xE3\x79 |0 + \xBA\xF2 |0 + \xE3\x6E |0 + \xE3\x6F |0 + \x89\xA3 |0 + \xE3\x6B |0 + \x99\x60 |0 + \x99\x62 |0 + \xBA\xFC |0 + \x94\xFC |0 + \x99\x61 |0 + \xE6\xE7 |0 + \xBD\x70 |0 + \xBD\x79 |0 + \xBD\x75 |0 + \xE6\xE4 |0 + \x94\xFA |0 + \xBD\x72 |0 + \xBD\x76 |0 + \xE6\xF0 |0 + \xBD\x6C |0 + \xE6\xE8 |0 + \xBD\x74 |0 + \x8E\xAE |0 + \x8E\xB2 |0 + \xE6\xEB |0 + \xE6\xE6 |0 + \xBD\x73 |0 + \xBD\x77 |0 + \xE6\xE5 |0 + \xBD\x71 |0 + \xE6\xEF |0 + \xBD\x6E |0 + \xE6\xEE |0 + \xE6\xED |0 + \xBD\x7A |0 + \xE5\x72 |0 + \xBD\x6D |0 + \x8E\xB0 |0 + \xE6\xEC |0 + \xE6\xE3 |0 + \xBD\x7B |0 + \xE6\xEA |0 + \xBD\x6F |0 + \x99\x63 |0 + \x97\xAA |0 + \xE6\xE9 |0 + \x94\xFB |0 + \xBF\xA2 |0 + \xBF\xA7 |0 + \xBF\x7E |0 + \xEA\xD8 |0 + \xEA\xCF |0 + \xEA\xDB |0 + \xEA\xD3 |0 + \xEA\xD9 |0 + \xBF\xA8 |0 + \xBF\xA1 |0 + \xEA\xCC |0 + \xEA\xD2 |0 + \xEA\xDC |0 + \xEA\xD5 |0 + \xEA\xDA |0 + \xEA\xCE |0 + \xEA\xD6 |0 + \xBF\xA3 |0 + \xEA\xD4 |0 + \xBF\xA6 |0 + \xBF\xA5 |0 + \xEA\xD0 |0 + \xEA\xD1 |0 + \xEA\xCD |0 + \xEA\xD7 |0 + \xBF\xA4 |0 + \xEA\xDE |0 + \xEA\xDD |0 + \x8E\xBB |0 + \xED\xDA |0 + \xED\xD6 |0 + \xC1\x5F |0 + \xED\xD0 |0 + \xC1\x59 |0 + \xC1\x69 |0 + \xED\xDC |0 + \xC1\x61 |0 + \xC1\x5D |0 + \xED\xD3 |0 + \xC1\x64 |0 + \xC1\x67 |0 + \xED\xDE |0 + \xC1\x5C |0 + \xED\xD5 |0 + \xC1\x65 |0 + \xED\xE0 |0 + \xED\xDD |0 + \xED\xD1 |0 + \xC1\x60 |0 + \xC1\x5A |0 + \xC1\x68 |0 + \xED\xD8 |0 + \xC1\x63 |0 + \xED\xD2 |0 + \xC1\x5E |0 + \xED\xDF |0 + \xC1\x62 |0 + \xC1\x5B |0 + \xED\xD9 |0 + \xC1\x66 |0 + \xED\xD7 |0 + \xED\xDB |0 + \xF0\x6E |0 + \xF0\x74 |0 + \xC2\xB9 |0 + \xF0\x77 |0 + \xC2\xB4 |0 + \xC2\xB5 |0 + \xF0\x6F |0 + \xF0\x76 |0 + \xF0\x71 |0 + \xC2\xBA |0 + \xC2\xB7 |0 + \x8C\xDC |0 + \xF0\x6D |0 + \xC2\xB6 |0 + \xF0\x73 |0 + \xF0\x75 |0 + \xC2\xB8 |0 + \xF0\x72 |0 + \xF0\x70 |0 + \x98\x76 |0 + \x8E\xA1 |0 + \xF2\xB8 |0 + \xC3\xB7 |0 + \xC3\xB8 |0 + \xC3\xB4 |0 + \x8C\xB4 |0 + \xC3\xB5 |0 + \x8E\xB7 |0 + \xF2\xB4 |0 + \xF2\xB2 |0 + \xF2\xB6 |0 + \xC3\xBA |0 + \xF2\xB7 |0 + \xF2\xB0 |0 + \xF2\xAF |0 + \xF2\xB3 |0 + \xF2\xB1 |0 + \xC3\xB6 |0 + \xF2\xB5 |0 + \xF4\xAC |0 + \xC4\x7E |0 + \xC4\x7D |0 + \xF4\xAD |0 + \x9D\xA6 |0 + \xF4\xAF |0 + \xF4\xAE |0 + \xC4\xA1 |0 + \xF5\xEB |0 + \xF5\xE8 |0 + \xF5\xE9 |0 + \xF5\xE7 |0 + \xF5\xEA |0 + \xC4\xF2 |0 + \xF5\xEC |0 + \x9E\xB0 |0 + \xC4\xF1 |0 + \xF7\x42 |0 + \x8E\xB8 |0 + \xC5\xD5 |0 + \xC5\xD7 |0 + \xF7\xEE |0 + \xC5\xD6 |0 + \xF8\xB9 |0 + \xF9\x40 |0 + \xF9\x42 |0 + \xF8\xFE |0 + \xF9\x41 |0 + \xC6\x6C |0 + \x9D\x70 |0 + \x89\x6E |0 + \x89\x6F |0 + \x89\x70 |0 + \x89\x71 |0 + \x89\x72 |0 + \x89\x73 |0 + \x89\x74 |0 + \xA6\xCE |0 + \x89\x75 |0 + \xAC\xFB |0 + \xD2\x6F |0 + \xAF\xCA |0 + \xB2\xDA |0 + \xDA\xFC |0 + \xDA\xFD |0 + \x8E\xBC |0 + \x8E\xBD |0 + \xEA\xDF |0 + \xC1\x6A |0 + \xED\xE1 |0 + \x8E\xBE |0 + \xC2\xBB |0 + \x9D\xD1 |0 + \xF2\xBA |0 + \xF2\xB9 |0 + \xC4\xA2 |0 + \xF5\xED |0 + \x94\xFD |0 + \xF7\x43 |0 + \xC5\xF8 |0 + \xCA\x49 |0 + \x8B\xD7 |0 + \x8B\xDA |0 + \xAA\xC9 |0 + \xA8\x75 |0 + \xD0\x4D |0 + \xD3\x60 |0 + \xD3\x5B |0 + \xD3\x5F |0 + \xD3\x5D |0 + \xAF\xCB |0 + \xD3\x5E |0 + \xD3\x5C |0 + \xD6\xF1 |0 + \xDA\xFE |0 + \xDB\x40 |0 + \xDF\x69 |0 + \xDF\x6A |0 + \xB8\x6E |0 + \xB8\x6F |0 + \xDF\x68 |0 + \xDF\x6B |0 + \xDF\x67 |0 + \xB8\x6D |0 + \xBB\x40 |0 + \xA0\xE2 |0 + \xB8\x70 |0 + \xE3\x7A |0 + \xBD\x7C |0 + \xE6\xF1 |0 + \xBD\x7D |0 + \x9F\xE9 |0 + \xBF\xA9 |0 + \xEA\xE2 |0 + \xEA\xE0 |0 + \xEA\xE1 |0 + \xED\xE4 |0 + \xED\xE3 |0 + \xED\xE2 |0 + \xF2\xBB |0 + \xC3\xB9 |0 + \xF2\xBC |0 + \xF7\x44 |0 + \xC5\xF9 |0 + \xF8\xBA |0 + \xA6\xCF |0 + \xAA\xCB |0 + \xAA\xCA |0 + \xD0\x4F |0 + \xAC\xFC |0 + \xFD\xA8 |0 + \xD0\x4E |0 + \xD3\x62 |0 + \x8A\xE7 |0 + \xAF\xCC |0 + \xD6\xF2 |0 + \xD3\x61 |0 + \x8E\xC2 |0 + \xB2\xDC |0 + \xD6\xF5 |0 + \xD6\xF3 |0 + \xD6\xF4 |0 + \xB2\xDB |0 + \xDB\x42 |0 + \xDB\x43 |0 + \xDB\x41 |0 + \x8E\xC4 |0 + \xB8\x73 |0 + \xDF\x6D |0 + \xDF\x6C |0 + \xDF\x6E |0 + \xB8\x72 |0 + \xB8\x71 |0 + \xE6\xF2 |0 + \xE6\xF4 |0 + \x99\x64 |0 + \xBD\x7E |0 + \xE6\xF3 |0 + \xEA\xE3 |0 + \xBF\xAA |0 + \xF0\x79 |0 + \x99\x65 |0 + \xF0\x78 |0 + \xC3\xBB |0 + \xF2\xBD |0 + \xC3\xBD |0 + \xC3\xBC |0 + \xF4\xB0 |0 + \xF5\xEE |0 + \xC4\xF3 |0 + \xA6\xD0 |0 + \xD0\x50 |0 + \xAC\xFD |0 + \xD3\x65 |0 + \xAF\xCE |0 + \xD3\x64 |0 + \xD3\x63 |0 + \xAF\xCD |0 + \xD6\xFB |0 + \xD6\xFD |0 + \xD6\xF6 |0 + \xD6\xF7 |0 + \xB2\xDD |0 + \xD6\xF8 |0 + \xB2\xDE |0 + \xD6\xFC |0 + \xD6\xF9 |0 + \xD6\xFA |0 + \xB2\xDF |0 + \xB5\xBE |0 + \xB5\xBF |0 + \xDB\x44 |0 + \xDF\x6F |0 + \xDF\x70 |0 + \x95\x4E |0 + \xE3\x7E |0 + \xBB\x43 |0 + \xBB\x41 |0 + \xBB\x42 |0 + \xE3\x7B |0 + \xE3\x7C |0 + \xE3\x7D |0 + \xE6\xF9 |0 + \x98\xB3 |0 + \xE6\xFA |0 + \xBD\xA1 |0 + \xE6\xF7 |0 + \xE6\xF6 |0 + \xE6\xF8 |0 + \xE6\xF5 |0 + \xBF\xAD |0 + \xEA\xE4 |0 + \xBF\xAB |0 + \xBF\xAC |0 + \xED\xE6 |0 + \xC1\x6B |0 + \xED\xE5 |0 + \xEF\xA8 |0 + \xF0\x7A |0 + \xF0\x7B |0 + \xC2\xBC |0 + \x8E\xCB |0 + \xC2\xBD |0 + \xC1\x6C |0 + \xF2\xBE |0 + \xF2\xBF |0 + \xF4\xB1 |0 + \xC4\xA3 |0 + \xA6\xD1 |0 + \x8B\xDF |0 + \xA6\xD2 |0 + \xAC\xFE |0 + \xAA\xCC |0 + \xAF\xCF |0 + \xD0\x51 |0 + \x8E\xCE |0 + \xB5\xC0 |0 + \xA6\xD3 |0 + \xAD\x41 |0 + \xD0\x52 |0 + \xD0\x53 |0 + \xAD\x40 |0 + \xAD\x42 |0 + \xA6\xD4 |0 + \xD0\x54 |0 + \xAF\xD1 |0 + \xD3\x66 |0 + \xAF\xD3 |0 + \xAF\xD0 |0 + \xAF\xD2 |0 + \xD7\x41 |0 + \xB2\xE0 |0 + \x8E\xCF |0 + \xD7\x40 |0 + \xD6\xFE |0 + \x99\x68 |0 + \xDF\x71 |0 + \xE3\xA1 |0 + \x99\x69 |0 + \xBD\xA2 |0 + \xBF\xAE |0 + \xEA\xE6 |0 + \xEA\xE5 |0 + \xED\xE7 |0 + \x99\x6B |0 + \x8E\xD1 |0 + \xF5\xEF |0 + \x99\x6C |0 + \xA6\xD5 |0 + \xCB\x73 |0 + \xCD\xAA |0 + \xAD\x43 |0 + \xD0\x55 |0 + \xD3\x68 |0 + \x8E\xD4 |0 + \x8E\xD5 |0 + \xAF\xD4 |0 + \xD3\x67 |0 + \xAF\xD5 |0 + \xD7\x43 |0 + \xB2\xE2 |0 + \xD7\x42 |0 + \xD7\x44 |0 + \xB2\xE1 |0 + \xDB\x46 |0 + \xDB\x47 |0 + \xDB\x45 |0 + \xB5\xC1 |0 + \x99\x6D |0 + \xB8\x74 |0 + \xB8\x75 |0 + \xBB\x45 |0 + \xA0\xBE |0 + \xE3\xA3 |0 + \xE3\xA2 |0 + \xBB\x44 |0 + \x8E\xD6 |0 + \xA0\xBC |0 + \xA0\xB5 |0 + \xE6\xFB |0 + \xA0\xB4 |0 + \xE6\xFC |0 + \xEA\xE7 |0 + \xC1\x70 |0 + \xC1\x6F |0 + \xC1\x6D |0 + \xC1\x6E |0 + \xC1\x71 |0 + \xF0\x7C |0 + \xC2\xBF |0 + \xC2\xBE |0 + \xF2\xC0 |0 + \xF4\xB2 |0 + \xC5\xA5 |0 + \xC5\xA4 |0 + \xA6\xD6 |0 + \x8B\xE0 |0 + \xD1\xFB |0 + \xB8\x77 |0 + \xB5\xC2 |0 + \xB8\x76 |0 + \xBB\x46 |0 + \xA6\xD7 |0 + \xC9\xA9 |0 + \xA6\xD8 |0 + \xA6\xD9 |0 + \xCD\xAB |0 + \xCB\x76 |0 + \xCB\x77 |0 + \xA8\x77 |0 + \xCB\x74 |0 + \xA8\x76 |0 + \xA8\x79 |0 + \xCB\x75 |0 + \xA8\x7B |0 + \xA8\x7A |0 + \xCB\x78 |0 + \xA8\x78 |0 + \x89\xB5 |0 + \xAA\xD1 |0 + \xAA\xCF |0 + \xCD\xAD |0 + \xAA\xCE |0 + \x8E\xDD |0 + \xAA\xD3 |0 + \xAA\xD5 |0 + \xAA\xD2 |0 + \xCD\xB0 |0 + \xCD\xAC |0 + \xAA\xD6 |0 + \xAA\xD0 |0 + \xA8\x7C |0 + \xAA\xD4 |0 + \xCD\xAF |0 + \x9E\x5D |0 + \x99\x71 |0 + \xCD\xAE |0 + \xAA\xCD |0 + \x89\xAE |0 + \x9D\xE8 |0 + \xD0\x5B |0 + \xAD\x47 |0 + \xAD\x48 |0 + \xD0\x5D |0 + \x95\x65 |0 + \xD0\x57 |0 + \xD0\x5A |0 + \xD0\x63 |0 + \xD0\x61 |0 + \xAD\x49 |0 + \xD0\x67 |0 + \xAD\x4C |0 + \xD0\x64 |0 + \xD0\x5C |0 + \xD0\x59 |0 + \xDB\x49 |0 + \xD0\x62 |0 + \xAD\x44 |0 + \xD0\x65 |0 + \xD0\x56 |0 + \xD0\x5F |0 + \xAD\x46 |0 + \xAD\x4B |0 + \xD0\x60 |0 + \xAD\x4F |0 + \xAD\x4D |0 + \xD0\x58 |0 + \xAD\x4A |0 + \xD0\x5E |0 + \xAD\x4E |0 + \xAD\x45 |0 + \xD0\x66 |0 + \x99\x72 |0 + \x8B\x5C |0 + \xAF\xDA |0 + \xAF\xE3 |0 + \xAF\xD8 |0 + \xAF\xD6 |0 + \xD3\x6A |0 + \xAF\xDE |0 + \xAF\xDB |0 + \xD3\x6C |0 + \x89\xB1 |0 + \xAF\xDD |0 + \xD3\x6B |0 + \xD3\x69 |0 + \xD3\x6E |0 + \xAF\xE2 |0 + \xAF\xE0 |0 + \xDB\x48 |0 + \xD3\x6F |0 + \xD3\x6D |0 + \xAF\xD7 |0 + \xA0\xC0 |0 + \xAF\xD9 |0 + \xAF\xDC |0 + \x8E\xDF |0 + \xAF\xDF |0 + \x95\x66 |0 + \xAF\xE1 |0 + \x99\x74 |0 + \x99\x76 |0 + \x99\x77 |0 + \x99\x79 |0 + \xD7\x4E |0 + \xB2\xE4 |0 + \x9D\xDA |0 + \xD7\x45 |0 + \xD7\x47 |0 + \x8E\xE0 |0 + \xD7\x48 |0 + \xD7\x50 |0 + \xD7\x4C |0 + \xD7\x4A |0 + \xD7\x4D |0 + \xD7\x51 |0 + \xB2\xE5 |0 + \xB2\xE9 |0 + \xD7\x46 |0 + \xD7\x4F |0 + \xB2\xE7 |0 + \x93\x5C |0 + \xB2\xE6 |0 + \xD7\x4B |0 + \xD7\x49 |0 + \xB2\xE3 |0 + \xB2\xE8 |0 + \x9D\xE6 |0 + \x8B\x5F |0 + \x95\x63 |0 + \xB5\xC8 |0 + \xDB\x51 |0 + \xDB\x4F |0 + \xB5\xCA |0 + \x95\x67 |0 + \xDB\x4A |0 + \xDF\xA1 |0 + \xB5\xC9 |0 + \xDB\x4E |0 + \x9D\xE3 |0 + \xDB\x4B |0 + \xB5\xC5 |0 + \xB5\xCB |0 + \xDB\x50 |0 + \xB5\xC7 |0 + \xDB\x4D |0 + \xBB\x47 |0 + \xB5\xC6 |0 + \xDB\x4C |0 + \xB5\xCC |0 + \xB5\xC4 |0 + \xB5\xC3 |0 + \x99\x7C |0 + \x99\x7D |0 + \x99\x7E |0 + \xDF\x77 |0 + \xDF\x75 |0 + \xDF\x7B |0 + \xDF\x73 |0 + \xDF\xA2 |0 + \xDF\x78 |0 + \xDF\x72 |0 + \xB8\x7B |0 + \xB8\xA3 |0 + \xDF\x7D |0 + \xDF\x76 |0 + \xB8\x7E |0 + \x8B\x5B |0 + \xB8\x7C |0 + \xDF\x7E |0 + \xB8\x79 |0 + \xB8\x78 |0 + \xDF\x79 |0 + \xB8\x7D |0 + \xB5\xCD |0 + \xDF\x7C |0 + \xDF\x74 |0 + \xB8\x7A |0 + \xB8\xA1 |0 + \xB8\xA2 |0 + \x99\xA3 |0 + \xBB\x4C |0 + \xBB\x48 |0 + \xBB\x4D |0 + \xE3\xA6 |0 + \x99\xA4 |0 + \xE3\xA5 |0 + \xE3\xA7 |0 + \xBB\x4A |0 + \xE3\xA4 |0 + \xBB\x4B |0 + \xE3\xAA |0 + \xE3\xA9 |0 + \xE3\xA8 |0 + \xBB\x49 |0 + \x99\xA6 |0 + \xE7\x41 |0 + \xE7\x44 |0 + \xBD\xA8 |0 + \xE7\x43 |0 + \xBD\xA7 |0 + \xBD\xA3 |0 + \xBD\xA4 |0 + \xBD\xA5 |0 + \xE7\x40 |0 + \xE6\xFE |0 + \xBD\xA6 |0 + \xE7\x42 |0 + \xE6\xFD |0 + \x99\xA8 |0 + \xEA\xE9 |0 + \xEA\xF3 |0 + \xBF\xB1 |0 + \xBF\xB0 |0 + \x8A\xBE |0 + \xEA\xED |0 + \xEA\xEF |0 + \xEA\xEA |0 + \xEA\xEE |0 + \xEA\xE8 |0 + \xEA\xF1 |0 + \xBF\xAF |0 + \xEA\xF0 |0 + \xEA\xEC |0 + \x9E\x61 |0 + \xEA\xF2 |0 + \xEA\xEB |0 + \xC1\x74 |0 + \xED\xE8 |0 + \xED\xEE |0 + \xC1\x78 |0 + \xC1\x7A |0 + \xC1\x77 |0 + \xC1\x76 |0 + \x99\xAA |0 + \xC1\x75 |0 + \xC1\x73 |0 + \xED\xE9 |0 + \xED\xEC |0 + \xC1\x72 |0 + \xED\xED |0 + \xA0\xC8 |0 + \xC1\x79 |0 + \xED\xEB |0 + \xED\xEA |0 + \xC2\xC0 |0 + \xC2\xC1 |0 + \xF0\xA1 |0 + \xF0\x7D |0 + \xF0\x7E |0 + \xF2\xC2 |0 + \xF2\xC1 |0 + \xC3\xBE |0 + \xF4\xB4 |0 + \xC4\xA4 |0 + \xF4\xB3 |0 + \xF5\xF0 |0 + \xF7\x45 |0 + \xC5\xA6 |0 + \xF9\x43 |0 + \xF9\x44 |0 + \xC5\xD8 |0 + \xA6\xDA |0 + \x99\xAB |0 + \xAA\xD7 |0 + \xDB\x52 |0 + \xBB\x4E |0 + \xC1\x7B |0 + \xED\xEF |0 + \xA6\xDB |0 + \xAF\xE5 |0 + \xAF\xE4 |0 + \xDB\x53 |0 + \xFE\xC4 |0 + \xEA\xF4 |0 + \xA6\xDC |0 + \xAD\x50 |0 + \x98\xC2 |0 + \xDB\x54 |0 + \xDB\x55 |0 + \xDB\x56 |0 + \xBB\x4F |0 + \xBF\xB2 |0 + \xA6\xDD |0 + \xAA\xD8 |0 + \xD0\x68 |0 + \xAF\xE6 |0 + \xD3\x70 |0 + \xB2\xEA |0 + \xDB\x57 |0 + \xB8\xA4 |0 + \xBB\x50 |0 + \xBF\xB3 |0 + \xC1\x7C |0 + \xC2\xC2 |0 + \xF4\xB5 |0 + \xA6\xDE |0 + \xAA\xD9 |0 + \xAF\xE7 |0 + \xD7\x52 |0 + \xB5\xCE |0 + \xBB\x51 |0 + \xE3\xAB |0 + \xE7\x45 |0 + \x8E\xE8 |0 + \xA0\xBA |0 + \xA6\xDF |0 + \xB5\xCF |0 + \xDF\xA3 |0 + \xBB\x52 |0 + \xA6\xE0 |0 + \xCD\xB1 |0 + \xD0\x69 |0 + \xAD\x51 |0 + \xD3\x72 |0 + \xFD\x77 |0 + \xAF\xEA |0 + \x8E\xEE |0 + \xAF\xE8 |0 + \xAF\xE9 |0 + \xAF\xEB |0 + \x9E\xBF |0 + \xD3\x71 |0 + \xD7\x57 |0 + \xD7\x54 |0 + \xD7\x56 |0 + \xB2\xEB |0 + \xB2\xED |0 + \xB2\xEC |0 + \xD7\x53 |0 + \xB2\xEE |0 + \xD7\x55 |0 + \xDB\x58 |0 + \xDB\x59 |0 + \x89\xC2 |0 + \xDB\x5A |0 + \xDF\xA6 |0 + \xDF\xA7 |0 + \xDF\xA5 |0 + \xDF\xA8 |0 + \xB8\xA5 |0 + \xDF\xA4 |0 + \xBB\x53 |0 + \xE7\x4A |0 + \xE7\x46 |0 + \xE7\x49 |0 + \xE7\x4B |0 + \xE7\x48 |0 + \xE7\x47 |0 + \x99\xAC |0 + \xEA\xF5 |0 + \xEA\xF6 |0 + \xEA\xF7 |0 + \xBF\xB4 |0 + \xBF\xB5 |0 + \xED\xF1 |0 + \xED\xF0 |0 + \xED\xF2 |0 + \xF0\xA3 |0 + \xF0\xA2 |0 + \xF2\xC4 |0 + \x95\x6B |0 + \xF2\xC5 |0 + \xF2\xC3 |0 + \x95\x6C |0 + \xC4\xA5 |0 + \xF4\xB6 |0 + \xF4\xB7 |0 + \xF7\x46 |0 + \xF7\xEF |0 + \xF8\xBB |0 + \xA6\xE1 |0 + \xA8\x7D |0 + \xC1\x7D |0 + \xA6\xE2 |0 + \xD7\x58 |0 + \xDB\x5B |0 + \x99\xAF |0 + \xC6\x41 |0 + \xCA\x4A |0 + \x99\x4A |0 + \x89\x76 |0 + \x8F\x48 |0 + \xCA\x4B |0 + \xCA\x4D |0 + \xA6\xE3 |0 + \xCA\x4E |0 + \xCA\x4C |0 + \xCB\xA2 |0 + \xCB\xA3 |0 + \xCB\x7B |0 + \xFB\xEE |0 + \xCB\xA1 |0 + \xA8\xA1 |0 + \xA8\xA2 |0 + \xCB\x7C |0 + \xCB\x7A |0 + \xCB\x79 |0 + \xCB\x7D |0 + \xA8\x7E |0 + \xCB\x7E |0 + \xD0\x6A |0 + \xCD\xB6 |0 + \xAA\xDC |0 + \xCD\xB5 |0 + \xCD\xB7 |0 + \xAA\xDB |0 + \xCD\xBC |0 + \xAA\xDF |0 + \xCD\xB2 |0 + \xCD\xC0 |0 + \xCD\xC6 |0 + \xAA\xE6 |0 + \xCD\xC3 |0 + \xAA\xE3 |0 + \x99\xAE |0 + \xCD\xB9 |0 + \xCD\xBF |0 + \xCD\xC1 |0 + \x8E\xFB |0 + \xCD\xB4 |0 + \xAA\xE2 |0 + \xAA\xDD |0 + \xCD\xBA |0 + \xAA\xE4 |0 + \xAA\xE7 |0 + \xAA\xE1 |0 + \xAA\xDA |0 + \xCD\xBE |0 + \xCD\xB8 |0 + \xCD\xC5 |0 + \xAA\xE9 |0 + \xAA\xE5 |0 + \xAA\xE0 |0 + \xCD\xBD |0 + \xAF\xEC |0 + \xCD\xBB |0 + \xAA\xDE |0 + \xAA\xE8 |0 + \x8C\xD0 |0 + \xCD\xB3 |0 + \xCD\xC2 |0 + \xCD\xC4 |0 + \x8B\x52 |0 + \x99\xB0 |0 + \x89\x77 |0 + \x8F\x41 |0 + \xAD\x62 |0 + \xAD\x5C |0 + \xAD\x64 |0 + \xAD\x61 |0 + \xD0\x71 |0 + \xD0\x74 |0 + \xAD\x5D |0 + \x99\xB1 |0 + \xD0\x6B |0 + \xAD\x56 |0 + \xAD\x60 |0 + \xAD\x63 |0 + \xAD\x65 |0 + \xD0\xA2 |0 + \xD0\x77 |0 + \x8F\x49 |0 + \xAD\x55 |0 + \xD0\xA1 |0 + \xAD\x59 |0 + \xAD\x57 |0 + \xAD\x52 |0 + \xD0\x6F |0 + \xD0\x7E |0 + \xD0\x73 |0 + \xD0\x76 |0 + \xD0\xA5 |0 + \xFA\x4D |0 + \xAD\x66 |0 + \xD0\x7D |0 + \xAD\x5E |0 + \xD0\x78 |0 + \xD0\xA4 |0 + \xD0\x75 |0 + \xD0\x79 |0 + \xD0\x7C |0 + \x9D\xE4 |0 + \x8C\xB5 |0 + \xD0\x6D |0 + \xD0\xA3 |0 + \xD0\x7B |0 + \xFB\xE9 |0 + \x9B\x54 |0 + \xD0\x6C |0 + \x99\xB2 |0 + \xD0\x70 |0 + \xAD\x5F |0 + \xAD\x5A |0 + \xAD\x53 |0 + \xAD\x58 |0 + \xAD\x54 |0 + \xAD\x67 |0 + \xD0\x6E |0 + \xD3\xA5 |0 + \xAD\x5B |0 + \x9E\x68 |0 + \xD0\x7A |0 + \xCE\x41 |0 + \xD3\xA8 |0 + \xAF\xFA |0 + \x8F\x4A |0 + \xD3\x76 |0 + \x8F\x42 |0 + \xD3\xA3 |0 + \xD3\x7D |0 + \x8F\x51 |0 + \xD3\xB2 |0 + \xD3\xAA |0 + \xD3\x7E |0 + \xD3\xA9 |0 + \xD3\x78 |0 + \xD3\x7C |0 + \xD3\xB5 |0 + \xAF\xFD |0 + \xD3\xAD |0 + \xD3\xA4 |0 + \xAF\xED |0 + \xD3\xB3 |0 + \xD3\x74 |0 + \xD3\xAC |0 + \xAF\xFC |0 + \xAF\xF7 |0 + \xD3\x73 |0 + \xAF\xF5 |0 + \xAF\xF4 |0 + \xAF\xF9 |0 + \xD3\xAB |0 + \xAF\xF1 |0 + \xAF\xF8 |0 + \xD0\x72 |0 + \xDB\x5C |0 + \xD3\xA6 |0 + \x98\x46 |0 + \xD3\x7A |0 + \xAF\xFB |0 + \xD3\x7B |0 + \xD3\xA1 |0 + \xAF\xFE |0 + \xD3\x75 |0 + \xD3\xAF |0 + \xD3\xAE |0 + \xD3\xB6 |0 + \xAF\xF3 |0 + \xAF\xF0 |0 + \xD3\xB4 |0 + \xD3\xB0 |0 + \xD3\xA7 |0 + \xD3\xA2 |0 + \xAF\xF6 |0 + \xAF\xF2 |0 + \xD3\x77 |0 + \xAF\xEE |0 + \xD3\xB1 |0 + \xAF\xEF |0 + \xD3\x79 |0 + \x99\xB4 |0 + \x8E\xF5 |0 + \xFD\x55 |0 + \x9C\xCD |0 + \x89\x78 |0 + \xD7\x5E |0 + \xD7\x60 |0 + \xD7\x65 |0 + \xD7\x79 |0 + \xB2\xFC |0 + \xB2\xF2 |0 + \xD7\x5D |0 + \xB2\xFD |0 + \xB2\xFE |0 + \xD7\x68 |0 + \xD7\x6F |0 + \xD7\x75 |0 + \xD7\x62 |0 + \xD7\x69 |0 + \x8F\x53 |0 + \xB3\x40 |0 + \xD7\x77 |0 + \xD7\x72 |0 + \xB2\xFA |0 + \xB2\xF8 |0 + \xD7\x6E |0 + \xD7\x6A |0 + \xD7\x5C |0 + \xB2\xEF |0 + \xD7\x61 |0 + \xD7\x59 |0 + \x8F\x6F |0 + \xB2\xF7 |0 + \xB2\xF9 |0 + \xD7\x66 |0 + \xD7\x63 |0 + \xB2\xF4 |0 + \xD7\x73 |0 + \xB2\xF1 |0 + \xD7\x64 |0 + \xD7\x7A |0 + \xD7\x6C |0 + \x8E\x63 |0 + \xD7\x6B |0 + \xB2\xF0 |0 + \xB2\xFB |0 + \xB2\xF3 |0 + \xD7\x5A |0 + \xD7\x5F |0 + \xD7\x70 |0 + \xD7\x76 |0 + \xB3\x41 |0 + \xD7\x5B |0 + \xD7\x67 |0 + \xD7\x6D |0 + \xB2\xF6 |0 + \x8F\x56 |0 + \xD7\x78 |0 + \xD7\x71 |0 + \xD7\x74 |0 + \xFE\x76 |0 + \xB2\xF5 |0 + \x9F\xC6 |0 + \xDB\x6C |0 + \xDB\x60 |0 + \xB5\xD7 |0 + \xDB\x7D |0 + \xDB\xA7 |0 + \xDB\xAA |0 + \xB5\xD5 |0 + \xDB\x68 |0 + \xDB\xA3 |0 + \xDB\x69 |0 + \xDB\x77 |0 + \xB5\xE2 |0 + \xDB\x73 |0 + \xB5\xDF |0 + \xFA\xAC |0 + \xDB\x74 |0 + \xDB\x5D |0 + \xDB\xA4 |0 + \x8F\x58 |0 + \xB5\xE8 |0 + \xDB\xA1 |0 + \xDB\x75 |0 + \xDB\xAC |0 + \xDB\x70 |0 + \xDF\xC8 |0 + \xDB\xAF |0 + \xB5\xE6 |0 + \xDB\x6E |0 + \xDB\x7A |0 + \xB5\xE9 |0 + \xB5\xD4 |0 + \xDB\x72 |0 + \xDB\xAD |0 + \xDB\x6B |0 + \xDB\x64 |0 + \xDB\x6F |0 + \xDB\x63 |0 + \xDB\x61 |0 + \xB5\xD0 |0 + \xDB\xA5 |0 + \xDB\x6A |0 + \xDB\xA8 |0 + \x98\x48 |0 + \xDB\xA9 |0 + \xB5\xD8 |0 + \xB5\xDD |0 + \xB5\xD9 |0 + \xB5\xE1 |0 + \xDB\x7E |0 + \xB5\xDA |0 + \xDB\x76 |0 + \xDB\x66 |0 + \xB5\xD2 |0 + \xDB\x5E |0 + \xDB\xA2 |0 + \xDB\xAB |0 + \xDB\x65 |0 + \xB5\xE0 |0 + \xDB\xB0 |0 + \xDB\x71 |0 + \xDB\x6D |0 + \xB5\xD1 |0 + \xB5\xE5 |0 + \x99\xB7 |0 + \xDB\x7C |0 + \xB5\xE7 |0 + \xDB\x78 |0 + \xB5\xDC |0 + \xB5\xD6 |0 + \xB5\xDE |0 + \xB5\xD3 |0 + \xB5\xE4 |0 + \xDB\x79 |0 + \xDB\x67 |0 + \xDB\x7B |0 + \xDB\x62 |0 + \xDB\xA6 |0 + \x96\x65 |0 + \xFA\x6C |0 + \x9D\xE7 |0 + \xDB\xAE |0 + \x9E\x62 |0 + \x96\xCC |0 + \x8E\x67 |0 + \xDB\x5F |0 + \xFC\x75 |0 + \x98\x7E |0 + \xDF\xC7 |0 + \xDF\xDD |0 + \xB8\x55 |0 + \xDF\xCC |0 + \xFD\xB9 |0 + \xDF\xCA |0 + \xDF\xB5 |0 + \xB8\xA9 |0 + \xDF\xC5 |0 + \xDF\xD9 |0 + \xDF\xC1 |0 + \xB8\xB1 |0 + \xDF\xD8 |0 + \xDF\xBF |0 + \xB5\xE3 |0 + \xDF\xCF |0 + \xDF\xC0 |0 + \xDF\xD6 |0 + \xB8\xB0 |0 + \xB8\xA8 |0 + \x97\xFC |0 + \xDF\xAA |0 + \xDF\xB2 |0 + \xDF\xCB |0 + \xDF\xC3 |0 + \xDF\xDC |0 + \xDF\xC6 |0 + \xB8\xB6 |0 + \xDF\xD7 |0 + \x98\xF9 |0 + \xB8\xAD |0 + \x8F\x66 |0 + \xDF\xC9 |0 + \xDF\xD1 |0 + \xDF\xB6 |0 + \xDF\xD0 |0 + \xDF\xE1 |0 + \xDF\xB1 |0 + \xDF\xD2 |0 + \x95\x6E |0 + \xDF\xDF |0 + \x92\x45 |0 + \xDF\xAB |0 + \xB5\xDB |0 + \x8F\x60 |0 + \xDF\xB9 |0 + \xDF\xB8 |0 + \xB8\xAF |0 + \x9E\xD1 |0 + \xDF\xBC |0 + \xDF\xBE |0 + \xDF\xCD |0 + \xDF\xDE |0 + \xB8\xB2 |0 + \xFE\xCD |0 + \xB8\xB3 |0 + \x99\xB9 |0 + \xDF\xB0 |0 + \xB8\xAB |0 + \xDF\xB4 |0 + \xDF\xDA |0 + \xB8\xB4 |0 + \xB8\xAC |0 + \xB8\xAE |0 + \xB8\xB5 |0 + \xDF\xE0 |0 + \xDF\xD3 |0 + \xDF\xCE |0 + \x8F\x62 |0 + \x97\x4C |0 + \xDF\xBB |0 + \xDF\xBA |0 + \xB8\xAA |0 + \xDF\xAC |0 + \xB8\xA7 |0 + \xDF\xC4 |0 + \xDF\xAD |0 + \xDF\xC2 |0 + \xDF\xB7 |0 + \xDF\xDB |0 + \x91\xC7 |0 + \x95\x5F |0 + \xB8\xA6 |0 + \xDF\xB3 |0 + \x99\xBB |0 + \xDF\xAF |0 + \xDF\xD5 |0 + \xDF\xAE |0 + \xBB\x60 |0 + \xE3\xD3 |0 + \x8E\x6D |0 + \x8F\x71 |0 + \xE3\xC2 |0 + \x94\xCB |0 + \xE3\xAC |0 + \xE3\xCA |0 + \xBB\x58 |0 + \xE3\xBB |0 + \xE3\xC5 |0 + \xBB\x5B |0 + \xE3\xBE |0 + \xBB\x59 |0 + \xE3\xAF |0 + \xE3\xCD |0 + \xE3\xAE |0 + \xE3\xC1 |0 + \x95\xB1 |0 + \xE3\xAD |0 + \xE3\xBF |0 + \xE3\xC8 |0 + \xE3\xC6 |0 + \xE3\xBA |0 + \xE3\xB5 |0 + \xE3\xB3 |0 + \x9A\xF2 |0 + \xE3\xB4 |0 + \xE3\xC7 |0 + \xE3\xD2 |0 + \xE3\xBC |0 + \xBB\x5A |0 + \xE3\xB7 |0 + \xE3\xCB |0 + \xBB\x5D |0 + \xE3\xB6 |0 + \xE3\xB0 |0 + \xE3\xC0 |0 + \xBB\x61 |0 + \x96\xC3 |0 + \x99\xBD |0 + \xBB\x55 |0 + \xBB\x5E |0 + \xE3\xB8 |0 + \xE3\xB2 |0 + \xBB\x57 |0 + \xDF\xD4 |0 + \xBB\x56 |0 + \xE3\xC3 |0 + \xBB\x54 |0 + \xBB\x63 |0 + \xBB\x5C |0 + \xE3\xC4 |0 + \xE3\xB9 |0 + \xE3\xB1 |0 + \xE3\xCC |0 + \xE3\xBD |0 + \xBB\x62 |0 + \xE3\xD0 |0 + \xBB\x5F |0 + \xE3\xCF |0 + \xE3\xC9 |0 + \xE3\xCE |0 + \xA0\xCF |0 + \xE3\xD1 |0 + \x8F\x6D |0 + \x99\xBE |0 + \x8E\xF4 |0 + \x8F\x72 |0 + \x95\xE4 |0 + \xE7\x73 |0 + \xE7\x74 |0 + \xE7\x67 |0 + \xE7\x66 |0 + \xE7\x62 |0 + \xBD\xB4 |0 + \xBD\xAC |0 + \xE7\x76 |0 + \xE7\x75 |0 + \xDF\xA9 |0 + \xE7\x5F |0 + \xE7\x63 |0 + \xE7\x5D |0 + \xE7\x70 |0 + \xE7\x61 |0 + \x99\xBF |0 + \xE7\x77 |0 + \xE7\x5A |0 + \xE7\x58 |0 + \xE7\x64 |0 + \xE7\x6E |0 + \xE7\x69 |0 + \xBD\xB6 |0 + \xE7\x4F |0 + \xE7\x6D |0 + \x92\x42 |0 + \xFB\xA5 |0 + \xBD\xB7 |0 + \xDF\xBD |0 + \xE7\x5B |0 + \xE7\x52 |0 + \xE7\x55 |0 + \xE7\x7B |0 + \xE7\x5C |0 + \xE7\x53 |0 + \xE7\x51 |0 + \xE7\x4E |0 + \x99\xC0 |0 + \xBD\xB0 |0 + \xE7\x65 |0 + \xBD\xAF |0 + \xBD\xB3 |0 + \xE7\x60 |0 + \xE7\x68 |0 + \xBD\xA9 |0 + \xE7\x78 |0 + \xE7\x7C |0 + \xBD\xAB |0 + \xE7\x57 |0 + \xE7\x6B |0 + \xE7\x6F |0 + \xE7\x54 |0 + \xE7\x79 |0 + \xBD\xB2 |0 + \xBD\xB1 |0 + \xE7\x4C |0 + \xBD\xB5 |0 + \xE7\x72 |0 + \xE7\x56 |0 + \xE7\x6A |0 + \xE7\x50 |0 + \xE7\x5E |0 + \xE7\x59 |0 + \xBD\xAD |0 + \xBD\xAE |0 + \xE7\x6C |0 + \xE7\x7D |0 + \xE7\x7A |0 + \xE7\x71 |0 + \xFD\xB4 |0 + \x8F\x77 |0 + \x99\xC1 |0 + \xE7\x4D |0 + \xBD\xAA |0 + \xEB\x49 |0 + \xEB\x40 |0 + \xEB\x43 |0 + \xFA\xB9 |0 + \xBF\xBB |0 + \xEB\x45 |0 + \xEA\xF9 |0 + \xEB\x41 |0 + \xEB\x47 |0 + \xBF\xB8 |0 + \xBF\xBC |0 + \xBF\xB6 |0 + \x8F\x40 |0 + \xFA\x44 |0 + \xEA\xFB |0 + \xEB\x4C |0 + \xEB\x46 |0 + \x99\xC2 |0 + \xEA\xFC |0 + \xEB\x55 |0 + \xEB\x4F |0 + \xEA\xF8 |0 + \xEE\x46 |0 + \xEA\xFE |0 + \xBF\xB7 |0 + \x8F\x5C |0 + \xEB\x4A |0 + \xEB\x54 |0 + \xBF\xBF |0 + \x8C\xBD |0 + \xEB\x51 |0 + \xEA\xFD |0 + \xEB\x44 |0 + \xEB\x48 |0 + \xEB\x42 |0 + \xEB\x56 |0 + \xEB\x53 |0 + \xEB\x50 |0 + \xBF\xB9 |0 + \xBF\xBA |0 + \xBF\xBE |0 + \xEA\xFA |0 + \xEB\x57 |0 + \xBF\xBD |0 + \xEB\x4D |0 + \x99\xC4 |0 + \x99\xC5 |0 + \xEB\x4B |0 + \x8F\x7B |0 + \xEB\x4E |0 + \xEE\x53 |0 + \xEE\x40 |0 + \xEE\x45 |0 + \xEE\x52 |0 + \xEE\x44 |0 + \xED\xFB |0 + \xEE\x41 |0 + \xC1\xA2 |0 + \xED\xF4 |0 + \xEE\x4D |0 + \xEE\x4F |0 + \xED\xF3 |0 + \xC1\xA1 |0 + \xEE\x51 |0 + \xEE\x49 |0 + \xC1\xA8 |0 + \xEE\x50 |0 + \xEE\x42 |0 + \xC1\xAA |0 + \xED\xF9 |0 + \xEB\x52 |0 + \xEE\x4A |0 + \xEE\x47 |0 + \xED\xF5 |0 + \xEE\x55 |0 + \xC1\xA4 |0 + \xC1\xA5 |0 + \xED\xF7 |0 + \xEE\x48 |0 + \x8C\xB6 |0 + \xEE\x54 |0 + \xEE\x4B |0 + \xED\xFD |0 + \xC1\xA7 |0 + \xC1\xA3 |0 + \xEE\x4C |0 + \xED\xFE |0 + \xEE\x56 |0 + \xED\xF8 |0 + \xEE\x43 |0 + \xEE\x4E |0 + \xED\xFA |0 + \xED\xFC |0 + \xC2\xCB |0 + \xED\xF6 |0 + \xC1\xA9 |0 + \xC2\xC4 |0 + \xC1\x7E |0 + \xC1\xA6 |0 + \xC2\xC8 |0 + \xF0\xB3 |0 + \xF0\xA9 |0 + \xF0\xA4 |0 + \xF0\xAA |0 + \xF0\xB4 |0 + \xF0\xB8 |0 + \xF0\xB7 |0 + \xC2\xCA |0 + \xC2\xC9 |0 + \xF0\xAB |0 + \xF0\xB9 |0 + \xF0\xAE |0 + \xF0\xA6 |0 + \x8F\xA3 |0 + \xF0\xA8 |0 + \xF0\xA7 |0 + \xF0\xAD |0 + \xF0\xB2 |0 + \xF0\xA5 |0 + \xF0\xAC |0 + \xF0\xB1 |0 + \xC2\xC7 |0 + \xF0\xAF |0 + \xC2\xC5 |0 + \xF0\xB0 |0 + \xC2\xC3 |0 + \xC2\xC6 |0 + \xF2\xD5 |0 + \xF0\xB5 |0 + \xC3\xC2 |0 + \x8C\xCE |0 + \xF2\xCD |0 + \xF2\xD1 |0 + \xF2\xC9 |0 + \xF2\xCC |0 + \xF2\xD4 |0 + \xC3\xC0 |0 + \xF2\xD9 |0 + \xF2\xD2 |0 + \x99\xC6 |0 + \xF2\xCA |0 + \xF2\xDA |0 + \xF2\xD3 |0 + \xC3\xC3 |0 + \xC3\xC4 |0 + \xF2\xD7 |0 + \xF2\xCB |0 + \xC3\xBF |0 + \xC3\xC1 |0 + \xF2\xC6 |0 + \xF2\xCE |0 + \xF2\xC8 |0 + \x96\xCD |0 + \xF2\xD8 |0 + \xF2\xD6 |0 + \xF2\xC7 |0 + \xF2\xCF |0 + \xF4\xBE |0 + \xC3\xC5 |0 + \xF2\xD0 |0 + \xC4\xA7 |0 + \xC4\xA9 |0 + \xC4\xA6 |0 + \x96\xC7 |0 + \xF4\xC3 |0 + \xF4\xBB |0 + \xF4\xB9 |0 + \xF4\xBD |0 + \xF4\xBA |0 + \x8F\xA5 |0 + \xF4\xBF |0 + \xF4\xC1 |0 + \xC4\xAA |0 + \xC4\xAC |0 + \xF4\xC0 |0 + \xC4\xAD |0 + \xC4\xAB |0 + \xF4\xC2 |0 + \xFA\xBB |0 + \x8C\x61 |0 + \x95\x70 |0 + \xC4\xA8 |0 + \x93\x68 |0 + \x8F\x7E |0 + \xC4\xF4 |0 + \xF5\xF1 |0 + \xF5\xF7 |0 + \xC4\xF6 |0 + \xF4\xBC |0 + \xF5\xF6 |0 + \xF5\xFD |0 + \xF5\xF4 |0 + \xF5\xFB |0 + \xF5\xFA |0 + \xF4\xB8 |0 + \xF5\xF5 |0 + \xF0\xB6 |0 + \xF5\xFE |0 + \xF5\xF3 |0 + \xF5\xF8 |0 + \x8F\xAA |0 + \xF5\xFC |0 + \xF5\xF2 |0 + \xF7\x4A |0 + \xC4\xF5 |0 + \xF5\xF9 |0 + \xA0\x50 |0 + \xF7\xF4 |0 + \xF7\x4B |0 + \xF7\x49 |0 + \xF7\x47 |0 + \xF7\x48 |0 + \xF7\x4C |0 + \xC5\xD9 |0 + \xF7\xF2 |0 + \xF7\xF0 |0 + \xF7\xF5 |0 + \xF7\xF3 |0 + \xF7\xF6 |0 + \xC5\xDA |0 + \xF7\xF1 |0 + \x90\xD3 |0 + \xF8\xBC |0 + \x95\x56 |0 + \xF9\x45 |0 + \xF9\x46 |0 + \xF9\x47 |0 + \xF9\xC7 |0 + \xF9\xBD |0 + \xCA\x4F |0 + \xAA\xEA |0 + \xAD\x68 |0 + \xD3\xB8 |0 + \xD3\xB7 |0 + \xB0\x40 |0 + \xB3\x42 |0 + \xD7\x7C |0 + \xD7\x7B |0 + \xB5\xEA |0 + \xB8\xB8 |0 + \xB8\xB7 |0 + \xB8\xB9 |0 + \xE3\xD4 |0 + \xE7\x7E |0 + \xEB\x58 |0 + \xEB\x5A |0 + \xEB\x59 |0 + \xC1\xAB |0 + \xEE\x57 |0 + \xF0\xBA |0 + \xF9\xA5 |0 + \xA6\xE4 |0 + \x8F\xB8 |0 + \xCD\xC9 |0 + \xCD\xCA |0 + \xCD\xC8 |0 + \xCD\xC7 |0 + \xAA\xEB |0 + \x99\xC8 |0 + \xD0\xA9 |0 + \xD0\xA7 |0 + \xD0\xA6 |0 + \xAD\x69 |0 + \xAD\x6B |0 + \xAD\x6A |0 + \xD0\xA8 |0 + \x8F\xAF |0 + \xD3\xC4 |0 + \xD3\xC1 |0 + \xD3\xBF |0 + \xB0\x41 |0 + \xD3\xC2 |0 + \xB0\x46 |0 + \xD3\xBC |0 + \xD3\xCB |0 + \xD3\xCD |0 + \xD3\xBD |0 + \x99\xC9 |0 + \xB0\x43 |0 + \xD3\xCE |0 + \xD3\xC9 |0 + \xD3\xBB |0 + \xD3\xC0 |0 + \xD3\xCA |0 + \xD3\xC6 |0 + \xD3\xC3 |0 + \xB0\x48 |0 + \xD3\xCC |0 + \xD3\xBE |0 + \x95\x79 |0 + \xD3\xC7 |0 + \xD3\xB9 |0 + \xB0\x47 |0 + \xB0\x44 |0 + \xD3\xC5 |0 + \xD3\xC8 |0 + \xD3\xBA |0 + \xB0\x45 |0 + \xB0\x42 |0 + \x9F\x49 |0 + \xB3\x4C |0 + \xD7\xA5 |0 + \xB3\x4B |0 + \x99\xCA |0 + \xD7\xA8 |0 + \xD7\xAB |0 + \xB3\x48 |0 + \xB3\x46 |0 + \xD7\x7E |0 + \xD7\xA9 |0 + \xD7\xA7 |0 + \xD7\xA4 |0 + \xD7\xAC |0 + \xD7\xAD |0 + \xD7\xAF |0 + \xD7\xB0 |0 + \xD7\x7D |0 + \xB3\x45 |0 + \xD7\xA2 |0 + \xD7\xA1 |0 + \xD7\xAE |0 + \xB3\x47 |0 + \xD7\xA3 |0 + \xB3\x49 |0 + \xB3\x44 |0 + \xD7\xA6 |0 + \xB3\x4D |0 + \xB3\x4A |0 + \xD7\xAA |0 + \xB5\xF1 |0 + \xDB\xBF |0 + \xDB\xB4 |0 + \xB5\xEE |0 + \xDF\xE7 |0 + \xDB\xBD |0 + \xDB\xB1 |0 + \xB5\xEC |0 + \xDB\xB6 |0 + \xB5\xEF |0 + \xDB\xBA |0 + \xDB\xB8 |0 + \xB5\xF2 |0 + \xB5\xEB |0 + \xDB\xB2 |0 + \xDB\xB5 |0 + \xB5\xF0 |0 + \xDB\xB3 |0 + \xDB\xBE |0 + \xDB\xBC |0 + \xDB\xB7 |0 + \xDB\xB9 |0 + \xDB\xBB |0 + \xB5\xED |0 + \x99\xCB |0 + \xDF\xE8 |0 + \xDF\xEE |0 + \xDF\xE4 |0 + \xDF\xEA |0 + \xB8\xBA |0 + \xDF\xE6 |0 + \xB8\xC0 |0 + \xB8\xBF |0 + \xB8\xBE |0 + \xDF\xED |0 + \xB8\xC1 |0 + \xB8\xC2 |0 + \xDF\xE3 |0 + \xDF\xF0 |0 + \xB8\xC3 |0 + \xB8\xBD |0 + \xB8\xBC |0 + \xDF\xEC |0 + \xB8\xC4 |0 + \xDF\xE2 |0 + \xDF\xE5 |0 + \xDF\xEF |0 + \xDF\xEB |0 + \xE3\xF4 |0 + \xE3\xE9 |0 + \xB8\xBB |0 + \xBB\x6A |0 + \xE3\xDD |0 + \xE3\xF2 |0 + \xE3\xDE |0 + \xBB\x65 |0 + \xE3\xDB |0 + \xE3\xE4 |0 + \xE3\xDC |0 + \xBB\x67 |0 + \xE3\xD6 |0 + \xE3\xF1 |0 + \xBB\x68 |0 + \xE3\xEE |0 + \xE3\xEF |0 + \xE3\xD7 |0 + \xBB\x6D |0 + \xE3\xE6 |0 + \xE3\xE0 |0 + \xE3\xE7 |0 + \xE3\xDA |0 + \xE3\xF3 |0 + \xE3\xEB |0 + \xE3\xE5 |0 + \xE3\xD5 |0 + \xBB\x69 |0 + \xE3\xEC |0 + \xBB\x6C |0 + \xE3\xF0 |0 + \xE3\xEA |0 + \xBB\x66 |0 + \xE3\xE8 |0 + \xE3\xE2 |0 + \xBB\x64 |0 + \xE3\xD9 |0 + \xE3\xE1 |0 + \xE3\xED |0 + \xE3\xDF |0 + \xE3\xE3 |0 + \xBD\xC1 |0 + \xDF\xE9 |0 + \xE7\xB2 |0 + \xE7\xBB |0 + \xE7\xB1 |0 + \xE7\xAD |0 + \xE7\xAA |0 + \xBD\xC2 |0 + \xE7\xA8 |0 + \xBB\x6B |0 + \xE7\xA1 |0 + \xBD\xC0 |0 + \xE7\xA7 |0 + \xBD\xBF |0 + \xE7\xAC |0 + \xE7\xA9 |0 + \xE7\xB9 |0 + \xE7\xB4 |0 + \xE7\xAE |0 + \xE7\xB3 |0 + \xBD\xBB |0 + \xE7\xAB |0 + \xE7\xBE |0 + \xE7\xA2 |0 + \xE7\xA3 |0 + \xE7\xBA |0 + \xBD\xBC |0 + \xE7\xBF |0 + \xBD\xBE |0 + \xE7\xC0 |0 + \xE7\xB0 |0 + \xE3\xD8 |0 + \xE7\xB6 |0 + \xE7\xAF |0 + \xE7\xB8 |0 + \xE7\xB5 |0 + \x9D\xD5 |0 + \x8F\xB0 |0 + \xE7\xA6 |0 + \xBD\xB9 |0 + \xE7\xBD |0 + \xBD\xBA |0 + \xE7\xA4 |0 + \xBD\xBD |0 + \xEB\x64 |0 + \xE7\xB7 |0 + \xE7\xBC |0 + \xFA\x7A |0 + \xEB\x61 |0 + \xBD\xB8 |0 + \xBF\xC0 |0 + \xEB\x6B |0 + \xEB\x67 |0 + \x9E\x5F |0 + \xEB\x65 |0 + \xEB\x60 |0 + \xEB\x6F |0 + \x99\xCD |0 + \xA0\xC9 |0 + \xBF\xC4 |0 + \xEB\x5C |0 + \xEB\x68 |0 + \xEB\x69 |0 + \xEB\x5F |0 + \xEB\x5E |0 + \xEB\x6C |0 + \xEB\x62 |0 + \xEB\x5D |0 + \xEB\x63 |0 + \xEB\x6E |0 + \xEB\x5B |0 + \xEB\x6D |0 + \xEB\x6A |0 + \xBF\xC2 |0 + \xBF\xC1 |0 + \xBF\xC3 |0 + \xEB\x66 |0 + \xF0\xCB |0 + \x9A\xDB |0 + \xA0\xC6 |0 + \xEE\x59 |0 + \xC1\xB1 |0 + \xEE\x5D |0 + \xEE\x5A |0 + \xEE\x61 |0 + \xEE\x67 |0 + \xEE\x5C |0 + \x8F\xB4 |0 + \xEE\x70 |0 + \xC1\xAE |0 + \xEE\x6A |0 + \xEE\x5F |0 + \xEE\x6B |0 + \xEE\x66 |0 + \xEE\x6D |0 + \xEE\x5E |0 + \xC1\xB3 |0 + \xC1\xB2 |0 + \xEE\x60 |0 + \xEE\x6E |0 + \xEE\x58 |0 + \xEE\x6C |0 + \xC1\xAC |0 + \xA0\xD7 |0 + \xEE\x64 |0 + \xEE\x63 |0 + \xEE\x68 |0 + \xEE\x5B |0 + \xC1\xB0 |0 + \xC1\xB4 |0 + \xEE\x62 |0 + \xEE\x69 |0 + \xC1\xB5 |0 + \xEE\x65 |0 + \xA0\xC7 |0 + \xC1\xAD |0 + \xC1\xAF |0 + \xF0\xC7 |0 + \xF0\xC5 |0 + \xA0\x43 |0 + \xF0\xCC |0 + \xF0\xC9 |0 + \xF0\xCD |0 + \x8F\xB5 |0 + \xF0\xBE |0 + \xF0\xC6 |0 + \xF0\xD1 |0 + \xEE\x6F |0 + \xF0\xC2 |0 + \xC2\xCF |0 + \xE7\xA5 |0 + \xF0\xBD |0 + \xF0\xCA |0 + \xF0\xC4 |0 + \xF0\xC1 |0 + \xF0\xBC |0 + \xF0\xBB |0 + \xF0\xD0 |0 + \xF0\xC0 |0 + \xF0\xBF |0 + \xC2\xCD |0 + \xF0\xC8 |0 + \x8F\xB2 |0 + \xC2\xCC |0 + \xC2\xCE |0 + \xF0\xC3 |0 + \xF0\xCF |0 + \xA0\x61 |0 + \xF2\xDE |0 + \xF2\xDF |0 + \xC3\xC9 |0 + \xF2\xDC |0 + \xC3\xC6 |0 + \xF2\xE4 |0 + \xC3\xCA |0 + \xF2\xE6 |0 + \xF2\xDB |0 + \xF0\xCE |0 + \xF2\xE8 |0 + \xF2\xDD |0 + \x9E\x5E |0 + \xC3\xC7 |0 + \xF2\xE3 |0 + \xF2\xE5 |0 + \xF2\xE0 |0 + \xF2\xE7 |0 + \xF2\xE2 |0 + \xF2\xE1 |0 + \xC3\xC8 |0 + \x8F\xB6 |0 + \xF4\xC5 |0 + \xF4\xC6 |0 + \xF4\xC8 |0 + \xC4\xAE |0 + \xC4\xAF |0 + \xF4\xC9 |0 + \xF4\xC7 |0 + \x9F\xE8 |0 + \xF4\xC4 |0 + \xF6\x42 |0 + \xF6\x45 |0 + \xF6\x41 |0 + \xC4\xFA |0 + \xF6\x43 |0 + \xC4\xF9 |0 + \xC4\xF8 |0 + \xC4\xF7 |0 + \xF6\x44 |0 + \xF7\x51 |0 + \xF7\x4F |0 + \x9C\xB2 |0 + \xF7\x4E |0 + \xF6\x40 |0 + \xF7\x50 |0 + \xF6\x46 |0 + \xF7\x4D |0 + \x95\x7C |0 + \xF7\xF9 |0 + \xF7\xD7 |0 + \xF7\xF7 |0 + \xC5\xDB |0 + \xF7\xF8 |0 + \xF7\xFA |0 + \xF8\xBF |0 + \xC5\xFA |0 + \xF8\xBE |0 + \xF8\xBD |0 + \xC5\xFB |0 + \xC6\x5A |0 + \xF9\x6E |0 + \xF9\xA7 |0 + \xF9\xA6 |0 + \xF9\xA8 |0 + \xA6\xE5 |0 + \xD0\xAA |0 + \x9F\xC7 |0 + \xD3\xCF |0 + \xD3\xD0 |0 + \x8F\xBB |0 + \x8F\xBC |0 + \xDB\xC0 |0 + \xF6\x47 |0 + \xF8\xC0 |0 + \xA6\xE6 |0 + \xAD\x6C |0 + \xD0\xAB |0 + \x8F\xEC |0 + \xD7\xB1 |0 + \xB3\x4E |0 + \xDB\xC2 |0 + \xDB\xC1 |0 + \xB5\xF3 |0 + \xB8\xC5 |0 + \xE7\xC1 |0 + \xBD\xC3 |0 + \xBD\xC4 |0 + \x8F\xC0 |0 + \x93\x6A |0 + \xBF\xC5 |0 + \xC5\xFC |0 + \xA6\xE7 |0 + \x8B\xE4 |0 + \x9C\x7C |0 + \xD0\xAC |0 + \xAA\xED |0 + \xD0\xAE |0 + \xD0\xAD |0 + \xAD\x6D |0 + \xD3\xD1 |0 + \x95\xA1 |0 + \xD3\xD8 |0 + \xB0\x49 |0 + \xD3\xD6 |0 + \xD3\xD4 |0 + \xD3\xDB |0 + \xD3\xD2 |0 + \xD3\xD3 |0 + \xB0\x4A |0 + \xB0\x4E |0 + \xD3\xDC |0 + \xB0\x4D |0 + \xD3\xDA |0 + \xD3\xD7 |0 + \xD3\xD5 |0 + \xB0\x4B |0 + \xB0\x4C |0 + \xD3\xD9 |0 + \xFE\xEC |0 + \x95\xA3 |0 + \xB3\x50 |0 + \xD7\xB2 |0 + \xB3\x55 |0 + \xD7\xC2 |0 + \xB3\x54 |0 + \xD7\xC4 |0 + \x8C\x45 |0 + \x8C\xB8 |0 + \xD7\xB8 |0 + \xB3\x52 |0 + \xD7\xC3 |0 + \xD7\xB3 |0 + \xB3\x53 |0 + \xD7\xBF |0 + \xD7\xBB |0 + \xD7\xBD |0 + \xD7\xB7 |0 + \xD7\xBE |0 + \x8F\xC1 |0 + \xB3\x4F |0 + \xD7\xBA |0 + \xA0\x52 |0 + \xD7\xB9 |0 + \xD7\xB5 |0 + \xD7\xC0 |0 + \xD7\xBC |0 + \xD7\xB4 |0 + \xD7\xB6 |0 + \xB3\x51 |0 + \xD7\xC1 |0 + \x99\xD0 |0 + \xB5\xF6 |0 + \xDB\xCD |0 + \x8F\xC3 |0 + \x8F\xC4 |0 + \xDB\xC9 |0 + \xDB\xCB |0 + \xDB\xC6 |0 + \xDB\xC5 |0 + \xDB\xC3 |0 + \xDB\xCA |0 + \xDB\xCC |0 + \xDB\xC8 |0 + \x95\xA4 |0 + \xDB\xC7 |0 + \xB5\xF4 |0 + \xB5\xF5 |0 + \x8F\xC6 |0 + \x9E\x60 |0 + \xDB\xCF |0 + \xB8\xCD |0 + \xDF\xF2 |0 + \xDF\xF8 |0 + \xDF\xF3 |0 + \xDF\xF4 |0 + \xF9\xD8 |0 + \xDF\xF9 |0 + \xB8\xCF |0 + \xB8\xC7 |0 + \xB8\xCE |0 + \xDF\xF1 |0 + \xDB\xC4 |0 + \xB8\xCA |0 + \xB8\xC8 |0 + \xDF\xF7 |0 + \xDF\xF6 |0 + \xB8\xC9 |0 + \xB8\xCB |0 + \xDF\xF5 |0 + \xB8\xC6 |0 + \xB8\xCC |0 + \x95\xA5 |0 + \xE3\xF6 |0 + \xBB\x74 |0 + \xE4\x42 |0 + \xE4\x41 |0 + \xE3\xFB |0 + \xBB\x76 |0 + \xE4\x40 |0 + \xE3\xF7 |0 + \xE3\xF8 |0 + \xBB\x6E |0 + \xBB\x70 |0 + \x9C\xB3 |0 + \xE3\xFD |0 + \xE3\xF5 |0 + \xBB\x72 |0 + \xBB\x71 |0 + \xE3\xF9 |0 + \xE3\xFE |0 + \xE3\xFC |0 + \xBB\x73 |0 + \xE3\xFA |0 + \x99\xD1 |0 + \xFE\xF1 |0 + \xDB\xCE |0 + \xBB\x6F |0 + \xE7\xC2 |0 + \xE7\xC9 |0 + \xBD\xC6 |0 + \xE7\xCD |0 + \xBD\xCA |0 + \xE7\xC5 |0 + \xE7\xC3 |0 + \xE7\xCC |0 + \xBD\xC5 |0 + \xE7\xCB |0 + \xBD\xC7 |0 + \xBD\xC8 |0 + \xE7\xC4 |0 + \xBD\xC9 |0 + \xE7\xCA |0 + \xE7\xC6 |0 + \xE7\xC7 |0 + \xE7\xC8 |0 + \xBB\x75 |0 + \xEB\x70 |0 + \xEB\x7C |0 + \xBF\xCA |0 + \xEB\x77 |0 + \xEB\x79 |0 + \x99\xD2 |0 + \xBF\xC8 |0 + \xEB\x71 |0 + \xEB\x75 |0 + \xEB\x78 |0 + \xBF\xC6 |0 + \xBF\xC9 |0 + \xEB\x7B |0 + \xEB\x73 |0 + \xEB\x74 |0 + \xEB\x7A |0 + \xEB\x72 |0 + \xEB\x76 |0 + \xBF\xC7 |0 + \xEE\x72 |0 + \xEE\x71 |0 + \xC1\xB7 |0 + \xEE\x77 |0 + \xC1\xB9 |0 + \xC1\xB6 |0 + \xEE\x73 |0 + \xC1\xBA |0 + \xEE\x74 |0 + \xEE\x75 |0 + \xEE\x78 |0 + \x9C\xC2 |0 + \xC1\xB8 |0 + \xF0\xD6 |0 + \x99\xD3 |0 + \xF0\xD9 |0 + \xF0\xD3 |0 + \xF0\xD5 |0 + \x95\xA7 |0 + \xF0\xD4 |0 + \xF0\xD7 |0 + \xF0\xD8 |0 + \xEE\x76 |0 + \xF0\xD2 |0 + \x95\xA9 |0 + \xC3\xCD |0 + \xF2\xEC |0 + \xF2\xEF |0 + \xF2\xF1 |0 + \xF2\xEA |0 + \xF2\xEB |0 + \xF2\xEE |0 + \xF2\xF0 |0 + \xC3\xCE |0 + \xC3\xCC |0 + \xC3\xCB |0 + \xF2\xED |0 + \xF2\xE9 |0 + \xF4\xCA |0 + \xC4\xB0 |0 + \x95\xA6 |0 + \xF4\xCB |0 + \xF6\x49 |0 + \xC4\xFB |0 + \xF6\x4B |0 + \xC4\xFC |0 + \xF6\x48 |0 + \xF6\x4A |0 + \xC5\xA8 |0 + \xF7\x52 |0 + \xC5\xA7 |0 + \xF7\xFD |0 + \xF7\xFC |0 + \xF7\xFB |0 + \x9C\x5D |0 + \xF9\x48 |0 + \xF9\x49 |0 + \xF9\x4B |0 + \xF9\x4A |0 + \xCA\x50 |0 + \xA6\xE8 |0 + \x98\xE2 |0 + \xAD\x6E |0 + \xD7\xC5 |0 + \xB5\xF7 |0 + \xDF\xFA |0 + \xC2\xD0 |0 + \x8F\xC9 |0 + \xF2\xF2 |0 + \xA0\xC2 |0 + \x8F\xCA |0 + \xA8\xA3 |0 + \xB3\x57 |0 + \x99\xD4 |0 + \xB3\x56 |0 + \xA0\xB9 |0 + \xDB\xD0 |0 + \xB5\xF8 |0 + \xDB\xD2 |0 + \xDB\xD1 |0 + \xDF\xFB |0 + \xB8\xD0 |0 + \xE4\x43 |0 + \xE4\x46 |0 + \xE4\x45 |0 + \xE4\x44 |0 + \xE7\xCE |0 + \xE7\xD0 |0 + \xE7\xCF |0 + \x9B\x58 |0 + \xBF\xCC |0 + \x8F\xCD |0 + \xA0\xD4 |0 + \xBF\xCB |0 + \xC1\xBB |0 + \xEE\x79 |0 + \xEE\x7B |0 + \xEE\x7A |0 + \xC2\xD1 |0 + \xF2\xF4 |0 + \xF2\xF3 |0 + \xF4\xCC |0 + \xC4\xB1 |0 + \x8F\xCE |0 + \xC4\xFD |0 + \xF7\x54 |0 + \xF7\x53 |0 + \xC6\x5B |0 + \x8B\xE5 |0 + \x89\x79 |0 + \xA8\xA4 |0 + \xD0\xAF |0 + \xAD\x6F |0 + \xD7\xC8 |0 + \xD7\xC6 |0 + \xD7\xC7 |0 + \xDB\xD4 |0 + \xDB\xD5 |0 + \xE0\x43 |0 + \xDB\xD3 |0 + \xDF\xFC |0 + \xE0\x41 |0 + \xE0\x40 |0 + \xE0\x42 |0 + \xB8\xD1 |0 + \xDF\xFE |0 + \xDF\xFD |0 + \xE0\x44 |0 + \x8F\xD0 |0 + \xE4\x49 |0 + \xE4\x47 |0 + \xE4\x48 |0 + \xE7\xD3 |0 + \xE7\xD1 |0 + \xE7\xD2 |0 + \xEB\x7D |0 + \xEE\x7C |0 + \xEE\x7D |0 + \xC2\xD2 |0 + \xF2\xF5 |0 + \xF4\xCD |0 + \xC4\xB2 |0 + \xF6\x4C |0 + \xF7\x55 |0 + \xC5\xA9 |0 + \xF7\xFE |0 + \xF9\x4C |0 + \xA8\xA5 |0 + \xAD\x71 |0 + \xAD\x72 |0 + \xD0\xB0 |0 + \xD0\xB1 |0 + \xAD\x70 |0 + \xB0\x54 |0 + \xB0\x52 |0 + \xB0\x51 |0 + \xB0\x58 |0 + \xB0\x50 |0 + \xB0\x59 |0 + \xD3\xDD |0 + \xB0\x56 |0 + \xB0\x53 |0 + \xB0\x57 |0 + \xB0\x55 |0 + \xB0\x4F |0 + \xB3\x5F |0 + \x95\xB6 |0 + \xB3\x59 |0 + \xD7\xCC |0 + \xB3\x5E |0 + \xB3\x60 |0 + \xB3\x5A |0 + \xB3\x5B |0 + \xD7\xCA |0 + \x99\xD6 |0 + \xB3\x58 |0 + \x95\xE5 |0 + \xD7\xCB |0 + \xB3\x5D |0 + \xD7\xC9 |0 + \xB3\x5C |0 + \xB6\x44 |0 + \xB6\x46 |0 + \x99\xD7 |0 + \xDB\xD8 |0 + \xB6\x45 |0 + \xB5\xF9 |0 + \xB5\xFD |0 + \x95\xB5 |0 + \xB8\xE4 |0 + \xE0\x49 |0 + \xDB\xDA |0 + \xB5\xFE |0 + \xDB\xDD |0 + \xDB\xDE |0 + \xB6\x43 |0 + \xDB\xE0 |0 + \xA0\xCA |0 + \xDB\xE2 |0 + \xDB\xE3 |0 + \xDB\xD7 |0 + \xDB\xD6 |0 + \xDB\xE4 |0 + \xB6\x42 |0 + \xDB\xE1 |0 + \xDB\xDF |0 + \xB6\x40 |0 + \xB5\xFB |0 + \xB6\x47 |0 + \xDB\xDB |0 + \xDB\xDC |0 + \xDB\xD9 |0 + \xB6\x41 |0 + \xB5\xFC |0 + \xB5\xFA |0 + \xE0\x48 |0 + \xB8\xDF |0 + \xB8\xDA |0 + \xB8\xD5 |0 + \x9F\xFD |0 + \xB8\xE5 |0 + \xB8\xD6 |0 + \xB8\xD2 |0 + \xB8\xE1 |0 + \xB8\xDE |0 + \xB8\xE0 |0 + \xB8\xD7 |0 + \xB8\xDC |0 + \xB8\xD3 |0 + \xB8\xD4 |0 + \xE0\x50 |0 + \xE0\x4D |0 + \xE0\x45 |0 + \xE0\x4A |0 + \xB8\xE2 |0 + \xE0\x51 |0 + \xB8\xE3 |0 + \xB8\xD9 |0 + \xA0\x58 |0 + \xE0\x47 |0 + \xE0\x4F |0 + \xE0\x4B |0 + \xE0\x4E |0 + \xE0\x4C |0 + \xB8\xDD |0 + \xE0\x46 |0 + \xB8\xD8 |0 + \xE4\x4C |0 + \xBB\x78 |0 + \xBB\x7B |0 + \xE4\x4E |0 + \x8F\xD6 |0 + \xBB\xA5 |0 + \xE4\x4D |0 + \xBB\x7D |0 + \x99\xD8 |0 + \xBD\xCF |0 + \xE4\x4F |0 + \xBB\xA4 |0 + \xE4\x4B |0 + \xBB\xA6 |0 + \x8F\xD3 |0 + \xBB\x79 |0 + \xB8\xDB |0 + \xBB\x7C |0 + \xBB\x7A |0 + \xBB\x7E |0 + \xBB\xA2 |0 + \xBB\x77 |0 + \xBB\xA7 |0 + \xBB\xA3 |0 + \x8F\xE5 |0 + \xBB\xA1 |0 + \xE4\x4A |0 + \x8F\xE9 |0 + \xBD\xD6 |0 + \xBD\xD2 |0 + \x99\xD9 |0 + \xBD\xD9 |0 + \xE7\xD6 |0 + \xBD\xDA |0 + \xE7\xE2 |0 + \xE7\xDB |0 + \xBD\xCB |0 + \xE7\xE3 |0 + \xE7\xDD |0 + \xBD\xD5 |0 + \xE7\xDE |0 + \xBD\xD4 |0 + \xE7\xE1 |0 + \xBD\xCE |0 + \xE7\xDF |0 + \xE7\xD5 |0 + \xBD\xCD |0 + \xEB\xAA |0 + \xBD\xD3 |0 + \xBD\xD0 |0 + \xBD\xD8 |0 + \xE7\xD4 |0 + \xE7\xD8 |0 + \xBD\xCC |0 + \xE7\xD7 |0 + \xE7\xD9 |0 + \xE7\xDA |0 + \xBD\xD7 |0 + \xE7\xDC |0 + \xE7\xE0 |0 + \xE7\xE4 |0 + \x92\x7C |0 + \xBD\xDB |0 + \xBF\xD2 |0 + \xEB\xA5 |0 + \xEB\xAB |0 + \xEB\xA8 |0 + \xEB\x7E |0 + \xEB\xAC |0 + \xEB\xA1 |0 + \xEB\xA7 |0 + \xBF\xCD |0 + \xBF\xD3 |0 + \xEB\xAD |0 + \x9C\x45 |0 + \xBF\xCF |0 + \xBF\xD9 |0 + \xBF\xD4 |0 + \xEB\xAF |0 + \xEB\xA9 |0 + \xBF\xD0 |0 + \xEB\xA2 |0 + \xBF\xDA |0 + \xEB\xA3 |0 + \xEB\xA4 |0 + \xBF\xDB |0 + \xBF\xD8 |0 + \xBD\xD1 |0 + \xBF\xCE |0 + \xEB\xB0 |0 + \xBF\xDC |0 + \xBF\xD5 |0 + \xEB\xAE |0 + \xBF\xD1 |0 + \xBF\xD6 |0 + \xBF\xD7 |0 + \xC1\xC3 |0 + \xEE\xA4 |0 + \xEE\xAD |0 + \xEE\xAA |0 + \xEE\xAC |0 + \xC1\xC0 |0 + \xEE\xA5 |0 + \x8F\xDE |0 + \xEE\xAB |0 + \xC1\xBC |0 + \xEE\xA7 |0 + \xC1\xC4 |0 + \xEE\xA3 |0 + \xEE\xA8 |0 + \xEE\xAF |0 + \xEB\xA6 |0 + \xEE\xA9 |0 + \xEE\xA2 |0 + \xC1\xBD |0 + \xEE\xA1 |0 + \xC1\xBE |0 + \xEE\xB0 |0 + \xC1\xBF |0 + \xEE\xAE |0 + \xC1\xC2 |0 + \xEE\x7E |0 + \x8F\xDF |0 + \xC1\xC1 |0 + \xEE\xA6 |0 + \xF0\xDC |0 + \xF0\xEA |0 + \xF0\xE5 |0 + \xF0\xE7 |0 + \xF0\xDB |0 + \xC2\xD3 |0 + \xF0\xDA |0 + \xC2\xD6 |0 + \xC2\xD5 |0 + \xA0\x4B |0 + \xF0\xE9 |0 + \xF0\xE1 |0 + \xF0\xDE |0 + \xF0\xE4 |0 + \xF0\xDD |0 + \xF0\xDF |0 + \xF0\xE8 |0 + \xF0\xE6 |0 + \xC2\xD4 |0 + \xF0\xED |0 + \xF0\xEB |0 + \xF0\xE2 |0 + \xF0\xEC |0 + \xF0\xE3 |0 + \x8F\xE2 |0 + \xF2\xF9 |0 + \xC3\xCF |0 + \xF3\x41 |0 + \xA0\xCC |0 + \xF6\x4F |0 + \xC3\xD6 |0 + \xF0\xE0 |0 + \xF2\xF7 |0 + \xC3\xD2 |0 + \xF2\xF8 |0 + \xF2\xFD |0 + \x8F\xE3 |0 + \x8F\xE4 |0 + \xC3\xD4 |0 + \xC3\xD5 |0 + \xF2\xF6 |0 + \xF3\x40 |0 + \xF3\x42 |0 + \xF2\xFA |0 + \xF2\xFC |0 + \xF2\xFE |0 + \xF2\xFB |0 + \xF3\x43 |0 + \xC3\xD1 |0 + \xC3\xD7 |0 + \xC3\xD3 |0 + \xC3\xD0 |0 + \xF4\xD0 |0 + \x9B\xC4 |0 + \xC4\xB7 |0 + \xF4\xCE |0 + \x9B\xFC |0 + \xF4\xD2 |0 + \xF4\xD3 |0 + \xC4\xB5 |0 + \xF4\xD4 |0 + \xF4\xD1 |0 + \x96\x4C |0 + \xF4\xCF |0 + \xC4\xB8 |0 + \xC4\xB4 |0 + \xF4\xD5 |0 + \xC4\xB6 |0 + \xC4\xB3 |0 + \xC4\xFE |0 + \xC5\x40 |0 + \xF6\x4E |0 + \xF6\x4D |0 + \xF6\x50 |0 + \xF6\x51 |0 + \xC5\x41 |0 + \xF7\x56 |0 + \xF7\x5B |0 + \xC5\xAA |0 + \x9A\xF6 |0 + \xF7\x58 |0 + \x8C\xAE |0 + \xF7\x57 |0 + \xF7\x5A |0 + \xF7\x59 |0 + \xF8\x43 |0 + \xC5\xDC |0 + \xF8\x42 |0 + \xF8\x40 |0 + \xF8\x41 |0 + \x8F\xE7 |0 + \xC5\xFE |0 + \xC5\xFD |0 + \xF8\xC1 |0 + \xF8\xC2 |0 + \xC6\x40 |0 + \xF9\x4D |0 + \xF9\x4E |0 + \xC6\x67 |0 + \x8F\xE8 |0 + \xC6\x6D |0 + \xF9\xA9 |0 + \xF9\xC8 |0 + \x8B\xE7 |0 + \x89\x7A |0 + \x89\x7B |0 + \xA8\xA6 |0 + \xD7\xCD |0 + \xD7\xCE |0 + \xE0\x52 |0 + \xE4\x50 |0 + \xE7\xE5 |0 + \xC1\xC6 |0 + \xC1\xC5 |0 + \xF0\xEE |0 + \xF3\x44 |0 + \xF8\x44 |0 + \xA8\xA7 |0 + \xD3\xDE |0 + \xB0\x5A |0 + \xB3\x61 |0 + \xE0\x54 |0 + \xE0\x53 |0 + \xBD\xDC |0 + \xE7\xE6 |0 + \xBD\xDD |0 + \xEE\xB1 |0 + \xC2\xD7 |0 + \x99\xDA |0 + \xC6\x76 |0 + \xA8\xA8 |0 + \xCD\xCB |0 + \xD3\xDF |0 + \xB3\x62 |0 + \xD7\xCF |0 + \xD7\xD0 |0 + \xDB\xE5 |0 + \xB6\x48 |0 + \xB8\xE6 |0 + \xE0\x56 |0 + \xE0\x55 |0 + \xE0\x57 |0 + \xE4\x51 |0 + \xE4\x52 |0 + \xBB\xA8 |0 + \xBF\xDD |0 + \xBD\xDE |0 + \xBF\xDE |0 + \xEE\xB5 |0 + \xEE\xB2 |0 + \xEE\xB4 |0 + \xEE\xB3 |0 + \xC1\xC7 |0 + \xF0\xEF |0 + \xF3\x46 |0 + \xF3\x45 |0 + \xCB\xA4 |0 + \xB0\x5C |0 + \xB0\x5B |0 + \xD3\xE0 |0 + \xD7\xD1 |0 + \xDB\xE7 |0 + \xDB\xE6 |0 + \xB6\x49 |0 + \xE0\x59 |0 + \xE0\x5A |0 + \xE0\x58 |0 + \xB8\xE8 |0 + \xB8\xE7 |0 + \xBB\xAA |0 + \xBB\xA9 |0 + \xE7\xE7 |0 + \xEB\xB3 |0 + \xEB\xB1 |0 + \xEB\xB2 |0 + \xBF\xDF |0 + \xEE\xB7 |0 + \xEE\xB6 |0 + \xF0\xF2 |0 + \xF0\xF1 |0 + \xF0\xF0 |0 + \xF3\x47 |0 + \x8F\xED |0 + \xF9\xAA |0 + \xA8\xA9 |0 + \xAD\x73 |0 + \x95\xC0 |0 + \xAD\x74 |0 + \xB0\x5D |0 + \xB0\x5E |0 + \xD3\xE2 |0 + \xD3\xE1 |0 + \xD7\xD2 |0 + \xB3\x68 |0 + \xB3\x66 |0 + \xB3\x63 |0 + \xB3\x67 |0 + \xB3\x65 |0 + \xB3\x64 |0 + \xA0\xCB |0 + \xB6\x4A |0 + \xDB\xEA |0 + \xB8\xED |0 + \xB6\x4C |0 + \xB6\x51 |0 + \xDB\xEC |0 + \xB6\x53 |0 + \xB6\x52 |0 + \xB6\x55 |0 + \xDB\xEB |0 + \xDB\xE8 |0 + \xB6\x4F |0 + \xB6\x4B |0 + \xB6\x4D |0 + \xDB\xE9 |0 + \xB6\x54 |0 + \xB6\x50 |0 + \xB6\x4E |0 + \xB8\xEF |0 + \xB8\xEE |0 + \xB8\xEC |0 + \xB8\xF0 |0 + \xB8\xEA |0 + \xB8\xEB |0 + \xB8\xE9 |0 + \xE0\x5B |0 + \x9E\x48 |0 + \xE4\x54 |0 + \xBB\xAC |0 + \xBB\xAD |0 + \xBB\xAB |0 + \x99\xDB |0 + \xE4\x53 |0 + \x8F\xF3 |0 + \xE4\x55 |0 + \xE7\xEA |0 + \xE7\xEC |0 + \x8F\xF9 |0 + \xBD\xE7 |0 + \xE7\xED |0 + \xBD\xE0 |0 + \xE7\xE9 |0 + \xBD\xDF |0 + \xBD\xE9 |0 + \xBD\xE5 |0 + \xBD\xE6 |0 + \xBD\xE2 |0 + \xE7\xE8 |0 + \xBD\xE1 |0 + \xE7\xEE |0 + \xE7\xEB |0 + \x95\xC1 |0 + \xBD\xE8 |0 + \xA0\x4E |0 + \xBD\xE3 |0 + \xBD\xE4 |0 + \xEB\xB5 |0 + \xEB\xB7 |0 + \xEB\xB6 |0 + \x99\xDC |0 + \xEB\xB8 |0 + \xBF\xE0 |0 + \xEB\xB4 |0 + \xA0\x64 |0 + \xC1\xCB |0 + \xEE\xB8 |0 + \xC1\xC8 |0 + \xC1\xCC |0 + \xC1\xCA |0 + \xC1\xC9 |0 + \xF0\xF3 |0 + \xF0\xF6 |0 + \xF0\xF5 |0 + \x8F\xF7 |0 + \xF0\xF4 |0 + \xC2\xD8 |0 + \xF3\x48 |0 + \xF3\x49 |0 + \xC3\xD8 |0 + \xF3\x4A |0 + \xC3\xD9 |0 + \x89\xB0 |0 + \xA0\x48 |0 + \xC4\xBA |0 + \xC4\xB9 |0 + \xF6\x52 |0 + \x8F\xFB |0 + \x8F\xF6 |0 + \xC5\x42 |0 + \xF6\x53 |0 + \xF7\x5C |0 + \xC5\xAB |0 + \xC5\xAC |0 + \x9D\xDC |0 + \xF8\x45 |0 + \xC6\x42 |0 + \x99\xDD |0 + \x8B\xE8 |0 + \xA8\xAA |0 + \xB3\x6A |0 + \xB3\x69 |0 + \xE0\x5C |0 + \xE0\x5D |0 + \xBB\xAE |0 + \xEB\xB9 |0 + \xBD\xEA |0 + \xEB\xBA |0 + \xEE\xB9 |0 + \xA8\xAB |0 + \xD0\xB2 |0 + \xAD\x76 |0 + \xAD\x75 |0 + \xD3\xE3 |0 + \xB0\x5F |0 + \xD3\xE4 |0 + \xD7\xD5 |0 + \x92\xC1 |0 + \xD7\xD4 |0 + \xD7\xD3 |0 + \xDB\xEE |0 + \xB6\x58 |0 + \x9F\xD6 |0 + \xDB\xED |0 + \xB6\x57 |0 + \xDB\xEF |0 + \xB6\x56 |0 + \xE0\x5F |0 + \xE0\x62 |0 + \xE0\x60 |0 + \xE0\x61 |0 + \xE0\x65 |0 + \xE0\x5E |0 + \xE0\x66 |0 + \xE0\x63 |0 + \xE0\x64 |0 + \xBB\xB0 |0 + \xE4\x56 |0 + \xBB\xAF |0 + \xE7\xF2 |0 + \xE7\xF0 |0 + \xBD\xEB |0 + \xE7\xEF |0 + \xE7\xF1 |0 + \xBD\xEC |0 + \xEB\xBB |0 + \xA0\xD2 |0 + \xEB\xBC |0 + \xC1\xCD |0 + \x90\x40 |0 + \xF3\x4C |0 + \xF3\x4E |0 + \xF3\x4B |0 + \xF3\x4D |0 + \xF4\xD6 |0 + \xF6\x54 |0 + \xF9\x6F |0 + \xA8\xAC |0 + \xAD\x77 |0 + \xD3\xE5 |0 + \xD3\xE7 |0 + \xD3\xE6 |0 + \xD7\xD8 |0 + \xB3\x6C |0 + \xD7\xD6 |0 + \xB3\x6B |0 + \xD7\xD9 |0 + \x8A\xC4 |0 + \xD7\xDA |0 + \xD7\xD7 |0 + \x99\xE0 |0 + \xDB\xFB |0 + \xB6\x60 |0 + \xDB\xF3 |0 + \xDB\xF9 |0 + \xB6\x5B |0 + \xB6\x5E |0 + \xDB\xF2 |0 + \xB6\x59 |0 + \xDB\xF6 |0 + \xE0\x6C |0 + \xB6\x5D |0 + \xDB\xF1 |0 + \x9F\xF0 |0 + \xDB\xF7 |0 + \xDB\xF4 |0 + \xDB\xFA |0 + \xDB\xF0 |0 + \xDB\xF8 |0 + \xB6\x5C |0 + \xB6\x5F |0 + \xDB\xF5 |0 + \xB6\x5A |0 + \xB8\xF2 |0 + \xE0\x68 |0 + \xB8\xF1 |0 + \xE0\x6F |0 + \xE0\x6E |0 + \xB8\xF8 |0 + \xB8\xF9 |0 + \xE0\x70 |0 + \xB8\xF3 |0 + \xE0\x6D |0 + \xB8\xF7 |0 + \xE0\x72 |0 + \xE0\x69 |0 + \xE0\x6B |0 + \xB8\xF4 |0 + \xE0\x67 |0 + \xE0\x6A |0 + \xE0\x71 |0 + \xB8\xF5 |0 + \xE0\x73 |0 + \xB8\xF6 |0 + \xBB\xB1 |0 + \xE4\x5B |0 + \xE4\x61 |0 + \xE4\x59 |0 + \xE4\x62 |0 + \x9F\xF3 |0 + \xE4\x58 |0 + \xE4\x5D |0 + \xE4\x63 |0 + \xE4\x60 |0 + \xE4\x5F |0 + \xE4\x5E |0 + \xE4\x57 |0 + \xE4\x5C |0 + \xE4\x5A |0 + \x9D\xBF |0 + \xBD\xF1 |0 + \xBD\xEE |0 + \xE7\xFB |0 + \xE8\x41 |0 + \xE8\x43 |0 + \xE8\x40 |0 + \xE7\xF8 |0 + \xE7\xFA |0 + \xE8\x45 |0 + \xE8\x42 |0 + \xE7\xFC |0 + \xE8\x46 |0 + \xE7\xF9 |0 + \xE8\x44 |0 + \xBD\xEF |0 + \xBD\xF5 |0 + \xBD\xF3 |0 + \xE7\xF3 |0 + \xBD\xF4 |0 + \xBD\xF0 |0 + \xE7\xF4 |0 + \xE7\xF6 |0 + \xE7\xF5 |0 + \xE7\xFD |0 + \xE7\xFE |0 + \x9F\xF6 |0 + \xBD\xF2 |0 + \x95\xC8 |0 + \xBD\xED |0 + \x9E\x5A |0 + \xE7\xF7 |0 + \xEB\xC6 |0 + \xBF\xE2 |0 + \xEB\xBD |0 + \xBF\xE3 |0 + \xBF\xE6 |0 + \xEB\xC2 |0 + \xEB\xBF |0 + \xBF\xE5 |0 + \x99\xE3 |0 + \xEB\xC3 |0 + \xEB\xC4 |0 + \xEB\xBE |0 + \xEB\xC7 |0 + \xEB\xC0 |0 + \xEB\xC5 |0 + \xBF\xE4 |0 + \xBF\xE1 |0 + \xEB\xC1 |0 + \x8A\x4A |0 + \xEE\xBF |0 + \xC1\xD0 |0 + \xC1\xCE |0 + \xC1\xD1 |0 + \xC1\xCF |0 + \xEE\xBE |0 + \xEE\xBB |0 + \xEE\xBA |0 + \x9F\xF1 |0 + \xEE\xBD |0 + \xEE\xBC |0 + \xF1\x45 |0 + \xC2\xDE |0 + \xF0\xFB |0 + \xF0\xFA |0 + \xC2\xD9 |0 + \xF1\x41 |0 + \xF1\x40 |0 + \xF0\xF7 |0 + \xF1\x43 |0 + \xF0\xFC |0 + \xC2\xDD |0 + \xF0\xF9 |0 + \xF1\x42 |0 + \xF0\xF8 |0 + \xC2\xDA |0 + \xC2\xDC |0 + \xF0\xFD |0 + \xC2\xDB |0 + \xF0\xFE |0 + \x8A\xA7 |0 + \xF1\x44 |0 + \xF3\x52 |0 + \xC3\xDE |0 + \xF3\x4F |0 + \xF3\x53 |0 + \x99\xE6 |0 + \xC3\xDB |0 + \xF3\x51 |0 + \xC3\xE0 |0 + \x9F\xF7 |0 + \xC3\xDD |0 + \x9F\xED |0 + \xF3\x50 |0 + \xC3\xDF |0 + \xF3\x54 |0 + \xC3\xDA |0 + \x8A\x5C |0 + \x9D\xAE |0 + \xC4\xBC |0 + \xC4\xBE |0 + \xF4\xD9 |0 + \xC4\xBD |0 + \xF4\xD7 |0 + \xC3\xDC |0 + \xF4\xD8 |0 + \xC4\xBB |0 + \xC5\x43 |0 + \xC5\x45 |0 + \xF6\x56 |0 + \xC5\x44 |0 + \xF6\x55 |0 + \xF7\x61 |0 + \xC5\xAD |0 + \xF7\x60 |0 + \xC5\xAE |0 + \xF7\x5E |0 + \xF7\x5D |0 + \xF7\x62 |0 + \xF7\x63 |0 + \xF8\x46 |0 + \xF7\x5F |0 + \xF8\xC6 |0 + \xF8\xC3 |0 + \xF8\xC4 |0 + \xF8\xC5 |0 + \xC6\x5C |0 + \xF9\x51 |0 + \xF9\x50 |0 + \xF9\x4F |0 + \xF9\x70 |0 + \x95\xC9 |0 + \xF9\xBE |0 + \xF9\xAB |0 + \xC6\x6E |0 + \xA8\xAD |0 + \xB0\x60 |0 + \x90\x48 |0 + \x99\xE8 |0 + \xB8\xFA |0 + \x90\x49 |0 + \x8C\xBA |0 + \xBD\xF6 |0 + \x90\xB1 |0 + \xEB\xC8 |0 + \xC2\xDF |0 + \xF3\x55 |0 + \x90\x4A |0 + \xF9\xAC |0 + \xA8\xAE |0 + \xAA\xEE |0 + \xAD\x79 |0 + \xAD\x78 |0 + \x99\xEA |0 + \xB0\x63 |0 + \xD3\xE8 |0 + \xB0\x61 |0 + \xD3\xE9 |0 + \xB0\x62 |0 + \xD7\xDF |0 + \xD7\xDB |0 + \x9B\xD1 |0 + \xB3\x6D |0 + \xD7\xDE |0 + \xD7\xDD |0 + \xD7\xDC |0 + \xB3\x6E |0 + \xD7\xE0 |0 + \xD7\xE1 |0 + \x99\xEB |0 + \x99\xEC |0 + \xDC\x43 |0 + \xDC\x41 |0 + \xDC\x45 |0 + \xDC\x46 |0 + \xDC\x4C |0 + \xDC\x48 |0 + \xDC\x4A |0 + \x99\xED |0 + \xDC\x42 |0 + \xDB\xFC |0 + \xDC\x49 |0 + \x99\xEE |0 + \xDC\x4B |0 + \xDC\x44 |0 + \xDC\x47 |0 + \xDB\xFD |0 + \xB6\x62 |0 + \xDC\x40 |0 + \xDB\xFE |0 + \xB6\x61 |0 + \xB6\x63 |0 + \xB8\xFD |0 + \xE0\x75 |0 + \xE0\x77 |0 + \xE0\x76 |0 + \xE0\x7B |0 + \xB8\xFB |0 + \xE0\x78 |0 + \xE0\x74 |0 + \xE0\x79 |0 + \xE0\x7A |0 + \xB8\xFC |0 + \xB8\xFE |0 + \xE0\x7C |0 + \xE4\x67 |0 + \xE4\x66 |0 + \xE4\x64 |0 + \xE4\x65 |0 + \xBB\xB3 |0 + \xBB\xB5 |0 + \xBB\xB2 |0 + \xBB\xB4 |0 + \xE8\x4D |0 + \xE8\x4E |0 + \xE8\x49 |0 + \x90\x4C |0 + \xE8\x4A |0 + \xBD\xF8 |0 + \xBD\xFD |0 + \xBD\xF7 |0 + \xBD\xFE |0 + \xBD\xF9 |0 + \xE8\x4B |0 + \xE8\x4C |0 + \xE8\x48 |0 + \xBE\x40 |0 + \xBD\xFB |0 + \xBD\xFA |0 + \xBD\xFC |0 + \xE8\x47 |0 + \x90\x4D |0 + \xEB\xCA |0 + \xBF\xE8 |0 + \x95\xCB |0 + \xEB\xCC |0 + \xBF\xEA |0 + \xEB\xCF |0 + \xEB\xCB |0 + \xEB\xC9 |0 + \xEB\xCE |0 + \xBF\xE9 |0 + \xEB\xCD |0 + \xBF\xE7 |0 + \xC1\xD3 |0 + \xC1\xD6 |0 + \xEE\xC1 |0 + \x97\xE2 |0 + \xC1\xD4 |0 + \xEE\xC0 |0 + \xC1\xD2 |0 + \xC1\xD5 |0 + \xF1\x46 |0 + \xF1\x47 |0 + \xF1\x48 |0 + \xC2\xE0 |0 + \x95\xCC |0 + \xF1\x49 |0 + \xC2\xE1 |0 + \xC3\xE2 |0 + \xF3\x58 |0 + \xF3\x59 |0 + \xF3\x57 |0 + \xF3\x56 |0 + \xF3\x5A |0 + \xC3\xE1 |0 + \xF4\xDD |0 + \xF4\xDB |0 + \xF4\xDC |0 + \xF4\xDE |0 + \xF4\xDA |0 + \xF4\xDF |0 + \xF6\x58 |0 + \x9F\x78 |0 + \xF6\x59 |0 + \xF6\x57 |0 + \xC5\x46 |0 + \xF7\x64 |0 + \xC5\xAF |0 + \xF7\x65 |0 + \xF8\x48 |0 + \xF8\x47 |0 + \x89\x7C |0 + \x89\x7D |0 + \x89\x7E |0 + \x99\x5D |0 + \xA8\xAF |0 + \xB6\x64 |0 + \xB9\x40 |0 + \x9B\x5A |0 + \xBB\xB6 |0 + \x90\x50 |0 + \xBF\xEC |0 + \x8C\x4F |0 + \xBF\xEB |0 + \xC3\xE3 |0 + \xC4\x7C |0 + \xC5\x47 |0 + \xA8\xB0 |0 + \xB0\x64 |0 + \xB9\x41 |0 + \x90\x54 |0 + \xF3\x5B |0 + \xC6\xD6 |0 + \x9A\xA8 |0 + \x99\xEF |0 + \xFE\xEB |0 + \x9D\xA3 |0 + \x9D\xA1 |0 + \x99\x43 |0 + \x99\x45 |0 + \x9D\x7D |0 + \xCB\xA6 |0 + \x99\xF0 |0 + \xA8\xB1 |0 + \xA8\xB4 |0 + \xA8\xB3 |0 + \xA8\xB2 |0 + \xCB\xA5 |0 + \x99\xF1 |0 + \xCD\xCD |0 + \x99\xF2 |0 + \xCD\xCF |0 + \xAA\xEF |0 + \x8C\xBC |0 + \x9D\x60 |0 + \xAA\xF1 |0 + \xCD\xCC |0 + \xCD\xCE |0 + \xAA\xF0 |0 + \xCD\xD1 |0 + \xCD\xD0 |0 + \xCD\xD2 |0 + \xA0\xA3 |0 + \xD0\xB6 |0 + \xD0\xB4 |0 + \xAD\x7C |0 + \xD0\xB3 |0 + \xAD\xA3 |0 + \xAD\x7E |0 + \xAD\x7B |0 + \xAD\xA4 |0 + \xAD\x7D |0 + \xAD\xA2 |0 + \xAD\xA1 |0 + \xD0\xB5 |0 + \xAD\x7A |0 + \xB0\x6A |0 + \xD3\xEB |0 + \xD3\xF1 |0 + \xB0\x67 |0 + \xB0\x6E |0 + \x90\x5B |0 + \xB0\x69 |0 + \xD3\xEE |0 + \xD3\xF0 |0 + \xB0\x6C |0 + \xD3\xEA |0 + \xD3\xED |0 + \xB0\x68 |0 + \xB0\x65 |0 + \xD3\xEC |0 + \xB0\x6B |0 + \xD3\xEF |0 + \xB0\x6D |0 + \xB0\x66 |0 + \x9E\xDB |0 + \xD7\xE3 |0 + \xD7\xE6 |0 + \xB3\x70 |0 + \xB3\x7A |0 + \xB3\x76 |0 + \xD7\xE4 |0 + \x9D\x79 |0 + \xB3\x7E |0 + \xB3\x77 |0 + \xB3\x7C |0 + \xB3\x72 |0 + \xB3\x6F |0 + \xB3\x71 |0 + \xB3\x7D |0 + \xD7\xE5 |0 + \xB3\x75 |0 + \xB3\x78 |0 + \xB3\x74 |0 + \xB3\x79 |0 + \xD7\xE7 |0 + \xB3\x7B |0 + \xB3\x73 |0 + \xD7\xE2 |0 + \xDC\x4D |0 + \xB6\x65 |0 + \xDC\x4F |0 + \xB6\x67 |0 + \xB6\x69 |0 + \x99\xF3 |0 + \xDC\x4E |0 + \xB6\x66 |0 + \xB6\x6A |0 + \x90\x62 |0 + \xB6\x68 |0 + \xB9\x47 |0 + \xE0\xA3 |0 + \xB9\x4F |0 + \xE0\x7E |0 + \xB9\x50 |0 + \xB9\x45 |0 + \xE0\xA1 |0 + \xB9\x4A |0 + \xE0\xA2 |0 + \xB9\x43 |0 + \xB9\x42 |0 + \x9F\x55 |0 + \xB9\x4D |0 + \xB9\x4C |0 + \xB9\x4B |0 + \xB9\x49 |0 + \xB9\x4E |0 + \xE0\x7D |0 + \xB9\x44 |0 + \xB9\x46 |0 + \xB9\x48 |0 + \x9B\xF9 |0 + \xBB\xB8 |0 + \xBB\xBB |0 + \xBB\xBF |0 + \xBB\xB9 |0 + \xBB\xBE |0 + \xBB\xBC |0 + \xBB\xB7 |0 + \x90\x65 |0 + \xBB\xBD |0 + \xBB\xBA |0 + \x96\xE0 |0 + \xE8\x52 |0 + \xBE\x43 |0 + \xBE\x41 |0 + \xE8\x53 |0 + \x98\xBE |0 + \xBE\x44 |0 + \xBE\x42 |0 + \xE8\x51 |0 + \xE8\x50 |0 + \xBF\xF0 |0 + \xE8\x4F |0 + \xBF\xEE |0 + \xBF\xED |0 + \xEB\xD0 |0 + \xBE\x45 |0 + \xBF\xEF |0 + \xEB\xD1 |0 + \xBF\xF2 |0 + \xEB\xD2 |0 + \xBF\xF1 |0 + \xC1\xD8 |0 + \xEE\xC3 |0 + \xC1\xD7 |0 + \xC1\xDC |0 + \xC1\xDA |0 + \xC1\xDB |0 + \xC2\xE3 |0 + \xC1\xD9 |0 + \xEE\xC2 |0 + \xEB\xD3 |0 + \xC2\xE2 |0 + \xC2\xE4 |0 + \xC3\xE4 |0 + \xC3\xE5 |0 + \xF4\xE0 |0 + \xC5\xDE |0 + \xC5\xDD |0 + \xA8\xB6 |0 + \xCA\x55 |0 + \xB0\x6F |0 + \xCA\x52 |0 + \xCA\x53 |0 + \xCA\x51 |0 + \xCA\x54 |0 + \xCB\xAA |0 + \xCB\xA7 |0 + \xCB\xAC |0 + \xCB\xA8 |0 + \xA8\xB7 |0 + \xA8\xBA |0 + \xCB\xA9 |0 + \xA8\xB9 |0 + \xCB\xAB |0 + \x90\x68 |0 + \xA8\xB8 |0 + \x90\x6C |0 + \xCD\xD5 |0 + \xCD\xD7 |0 + \xAA\xF4 |0 + \xCD\xD3 |0 + \xCD\xD6 |0 + \xCD\xD4 |0 + \xAA\xF2 |0 + \xAA\xF5 |0 + \xAA\xF3 |0 + \x95\xD8 |0 + \xD0\xB8 |0 + \xD0\xBC |0 + \xD0\xB9 |0 + \xAD\xA7 |0 + \xAD\xA8 |0 + \x90\x6A |0 + \xD0\xBB |0 + \xD0\xBD |0 + \xD0\xBF |0 + \xAD\xA5 |0 + \xD0\xBE |0 + \xAD\xA6 |0 + \xD7\xEE |0 + \xD0\xBA |0 + \xD3\xF2 |0 + \xD3\xFB |0 + \xD3\xF9 |0 + \xD3\xF4 |0 + \xD3\xF5 |0 + \xD3\xFA |0 + \xD3\xFC |0 + \xB0\x71 |0 + \xD3\xF7 |0 + \xD3\xF3 |0 + \xB0\x70 |0 + \xB0\x72 |0 + \xD3\xF6 |0 + \xD3\xFD |0 + \xD3\xF8 |0 + \xB3\xA1 |0 + \xD7\xF1 |0 + \xD7\xE9 |0 + \xD7\xEF |0 + \xD7\xF0 |0 + \xB3\xA2 |0 + \xD7\xE8 |0 + \xD7\xEA |0 + \xD0\xB7 |0 + \xD7\xEC |0 + \xD7\xED |0 + \xD7\xEB |0 + \xB6\x6C |0 + \xDC\x56 |0 + \xEB\xD4 |0 + \xDC\x57 |0 + \xDC\x54 |0 + \xB3\xA3 |0 + \xB6\x6E |0 + \xDC\x53 |0 + \xDC\x59 |0 + \xDC\x58 |0 + \xB6\x6B |0 + \xDC\x5C |0 + \xDC\x52 |0 + \xDC\x5B |0 + \xDC\x50 |0 + \xDC\x5A |0 + \xDC\x55 |0 + \xB6\x6D |0 + \xE0\xAA |0 + \xE0\xA5 |0 + \xE0\xAB |0 + \xE0\xA6 |0 + \xE0\xA4 |0 + \xE0\xA7 |0 + \xB9\x51 |0 + \xE0\xA9 |0 + \xE0\xA8 |0 + \xB9\x52 |0 + \xBB\xC1 |0 + \xBB\xC0 |0 + \xE4\x6E |0 + \xE4\x71 |0 + \xE4\x69 |0 + \xE4\x6D |0 + \xBB\xC2 |0 + \xE4\x6C |0 + \xE4\x6A |0 + \xE4\x70 |0 + \xE4\x6B |0 + \xE4\x68 |0 + \xE4\x6F |0 + \xE8\x59 |0 + \xBE\x48 |0 + \xF1\x4A |0 + \xE8\x56 |0 + \xE8\x57 |0 + \xE8\x55 |0 + \xDC\x51 |0 + \xBE\x47 |0 + \xE8\x5A |0 + \xE8\x54 |0 + \xBE\x46 |0 + \xBE\x49 |0 + \xE8\x58 |0 + \xEB\xD5 |0 + \xBF\xF3 |0 + \xEB\xD6 |0 + \xEB\xD7 |0 + \xEE\xC4 |0 + \xC1\xDD |0 + \xF1\x4B |0 + \xF1\x4C |0 + \xF1\x4D |0 + \xF3\x5D |0 + \xF3\x5C |0 + \xF4\xE2 |0 + \xF4\xE1 |0 + \xF6\x5B |0 + \xF6\x5C |0 + \xF6\x5A |0 + \xF7\x66 |0 + \xC5\xB0 |0 + \xA8\xBB |0 + \xAD\xAA |0 + \xAD\xA9 |0 + \xB0\x75 |0 + \xB0\x74 |0 + \xD4\x40 |0 + \xD4\x41 |0 + \xD3\xFE |0 + \x9F\xB2 |0 + \xB0\x73 |0 + \xD7\xF5 |0 + \xD7\xF6 |0 + \xD7\xF2 |0 + \xB3\xA4 |0 + \xD7\xF3 |0 + \x9F\xAE |0 + \xD7\xF4 |0 + \x9F\xB0 |0 + \x89\xAD |0 + \xDC\x5F |0 + \xDC\x61 |0 + \xDC\x5D |0 + \xDC\x60 |0 + \xB6\x6F |0 + \xDC\x5E |0 + \xB6\x70 |0 + \x90\x6E |0 + \xDD\x73 |0 + \xB9\x55 |0 + \xB9\x54 |0 + \xB9\x53 |0 + \xE0\xAC |0 + \xE0\xAD |0 + \x9E\x71 |0 + \xE4\x73 |0 + \xE4\x75 |0 + \xBB\xC6 |0 + \xBB\xC3 |0 + \x9E\x4A |0 + \xBB\xC5 |0 + \xBB\xC4 |0 + \xE4\x74 |0 + \xE4\x72 |0 + \x9F\xDC |0 + \xE8\x61 |0 + \xE8\x5E |0 + \xE8\x5F |0 + \xBE\x4D |0 + \xE8\x60 |0 + \xE8\x5B |0 + \xE8\x5C |0 + \xBE\x4A |0 + \xBE\x4B |0 + \xE8\x5D |0 + \xBE\x4C |0 + \x89\xAB |0 + \xEB\xDB |0 + \x9F\xB8 |0 + \xEB\xDC |0 + \xEB\xD9 |0 + \xEB\xDA |0 + \xBF\xF4 |0 + \xEB\xD8 |0 + \xEE\xC8 |0 + \xEE\xC5 |0 + \xEE\xC7 |0 + \xC1\xE0 |0 + \xEE\xCB |0 + \xC1\xDF |0 + \xEE\xC9 |0 + \xEE\xCC |0 + \xEE\xCA |0 + \xEE\xC6 |0 + \xC1\xDE |0 + \xF1\x4F |0 + \xF1\x50 |0 + \xF1\x4E |0 + \x90\x70 |0 + \xF1\x52 |0 + \xC2\xE5 |0 + \xC2\xE6 |0 + \xF3\x5F |0 + \xC3\xE7 |0 + \xF1\x51 |0 + \xF3\x5E |0 + \xC3\xE6 |0 + \xF4\xE5 |0 + \xF4\xE6 |0 + \xC4\xBF |0 + \xF4\xE4 |0 + \x8B\x63 |0 + \xF4\xE3 |0 + \xF6\x5D |0 + \xC5\x48 |0 + \x95\xDC |0 + \xF8\x49 |0 + \xF8\xC8 |0 + \xF8\xC7 |0 + \xC6\x43 |0 + \xC6\x5D |0 + \xF8\xC9 |0 + \xF9\x71 |0 + \x90\x71 |0 + \xC6\x6F |0 + \xA8\xBC |0 + \xAA\xF6 |0 + \xB9\x56 |0 + \xC4\xC0 |0 + \xA8\xBD |0 + \xAD\xAB |0 + \xB3\xA5 |0 + \xB6\x71 |0 + \xC2\xE7 |0 + \xAA\xF7 |0 + \xD0\xC1 |0 + \xD0\xC0 |0 + \xD4\x42 |0 + \xFC\x5E |0 + \xB0\x78 |0 + \xB0\x76 |0 + \xB0\x7A |0 + \xD4\x44 |0 + \xB0\x79 |0 + \xB0\x77 |0 + \x89\x49 |0 + \xD4\x43 |0 + \xB3\xA8 |0 + \xD7\xFC |0 + \x96\x5B |0 + \xB3\xA7 |0 + \xB3\xA9 |0 + \xD8\x42 |0 + \xB3\xAB |0 + \xD7\xFE |0 + \xD8\x40 |0 + \xD7\xF7 |0 + \xB3\xAA |0 + \xD8\x43 |0 + \xD7\xF9 |0 + \xD7\xFA |0 + \xD7\xF8 |0 + \xB3\xA6 |0 + \x8C\x50 |0 + \xD8\x41 |0 + \xD7\xFB |0 + \xD7\xFD |0 + \x94\xA6 |0 + \xDC\x6D |0 + \x8F\xD5 |0 + \xDC\x6C |0 + \xDC\x6A |0 + \xDC\x62 |0 + \xDC\x71 |0 + \xDC\x65 |0 + \xDC\x6F |0 + \xDC\x76 |0 + \xDC\x6E |0 + \xB6\x79 |0 + \x9E\x73 |0 + \xB6\x75 |0 + \xDC\x63 |0 + \xDC\x69 |0 + \xB6\x77 |0 + \x90\x75 |0 + \xDC\x68 |0 + \xB6\x78 |0 + \xB6\x7A |0 + \xDC\x6B |0 + \x99\xF7 |0 + \xB6\x72 |0 + \xB6\x73 |0 + \xDC\x77 |0 + \xDC\x75 |0 + \xDC\x74 |0 + \xDC\x66 |0 + \xDC\x72 |0 + \xB6\x76 |0 + \x8C\xBF |0 + \xB6\x74 |0 + \xDC\x73 |0 + \xDC\x64 |0 + \xDC\x67 |0 + \xDC\x70 |0 + \x99\xF9 |0 + \x96\x63 |0 + \x95\xB9 |0 + \xE4\xBA |0 + \xE0\xB7 |0 + \xE0\xB0 |0 + \xE0\xC3 |0 + \xE0\xCC |0 + \xE0\xB3 |0 + \xB9\x61 |0 + \x94\xD4 |0 + \xE0\xC0 |0 + \xB9\x57 |0 + \xB9\x59 |0 + \xB9\x65 |0 + \xE0\xB1 |0 + \xFC\xFA |0 + \xB9\x5A |0 + \xB9\x5C |0 + \xB9\x66 |0 + \xB9\x5B |0 + \x90\x77 |0 + \x90\xAB |0 + \xB9\x64 |0 + \xE0\xB9 |0 + \xE0\xAE |0 + \xB9\x62 |0 + \xE0\xB8 |0 + \xB9\x5E |0 + \xE0\xCA |0 + \xB9\x63 |0 + \xE0\xC8 |0 + \xE0\xBC |0 + \xE0\xC6 |0 + \xB9\x60 |0 + \xE0\xAF |0 + \xE0\xC9 |0 + \xE0\xC4 |0 + \x9D\x4D |0 + \xE0\xCB |0 + \xB9\x58 |0 + \x99\xFA |0 + \xB9\x67 |0 + \xB9\x5D |0 + \x92\xE3 |0 + \xE0\xB5 |0 + \x97\xBB |0 + \xE0\xBD |0 + \xE0\xC1 |0 + \x90\x78 |0 + \xE0\xC5 |0 + \xB9\x5F |0 + \xE0\xB4 |0 + \xE0\xB2 |0 + \xE0\xBE |0 + \x99\xFB |0 + \xE0\xBB |0 + \xE0\xBA |0 + \x97\xE0 |0 + \xE0\xBF |0 + \xE0\xC2 |0 + \xE0\xC7 |0 + \xE4\x78 |0 + \x96\xDC |0 + \xBB\xC7 |0 + \xE4\xA4 |0 + \xE4\x7A |0 + \xBB\xCC |0 + \xBB\xD0 |0 + \xE4\xAD |0 + \xE4\xB5 |0 + \xE4\xA6 |0 + \xBB\xC8 |0 + \x9C\xA8 |0 + \xE4\xAA |0 + \xE0\xB6 |0 + \x97\x72 |0 + \xBB\xC9 |0 + \xE4\xB1 |0 + \xE4\xB6 |0 + \xE4\xAE |0 + \x94\x40 |0 + \xE4\xB0 |0 + \xE4\xB9 |0 + \xE4\xB2 |0 + \xE4\x7E |0 + \xE4\xA9 |0 + \x92\xF2 |0 + \xBB\xD1 |0 + \xBB\xCD |0 + \xE4\x7C |0 + \xE4\xAB |0 + \xBB\xCB |0 + \xE4\xA5 |0 + \xBB\xCA |0 + \xE4\xB3 |0 + \xE4\xA2 |0 + \xE4\x79 |0 + \xBB\xCE |0 + \xE4\xB8 |0 + \xE4\x7B |0 + \xE4\xAF |0 + \xE4\xAC |0 + \xE4\xA7 |0 + \xE4\x77 |0 + \xE4\x76 |0 + \xE4\xA1 |0 + \xE4\xB4 |0 + \xBB\xCF |0 + \xE4\xB7 |0 + \xE4\x7D |0 + \xE4\xA3 |0 + \xBE\x52 |0 + \x99\xFD |0 + \x99\xFC |0 + \xBE\x5A |0 + \xBE\x55 |0 + \xE8\xA4 |0 + \xE8\xA1 |0 + \xE8\x67 |0 + \xBE\x50 |0 + \xF9\xD7 |0 + \x96\x4A |0 + \xBE\x4F |0 + \xBE\x56 |0 + \x96\xD8 |0 + \x99\xFE |0 + \xE8\x65 |0 + \xBE\x54 |0 + \xE8\x71 |0 + \xE8\x63 |0 + \xE8\x64 |0 + \xBE\x4E |0 + \xE8\xA3 |0 + \xBE\x58 |0 + \xE8\x74 |0 + \xE8\x79 |0 + \xE8\x73 |0 + \xEB\xEE |0 + \xE8\x6F |0 + \xE8\x77 |0 + \xE8\x75 |0 + \xE8\x68 |0 + \xE8\x62 |0 + \xE8\x7D |0 + \xBE\x57 |0 + \xE8\x7E |0 + \x90\x4B |0 + \xE8\x78 |0 + \xE8\x6D |0 + \xE8\x6B |0 + \xE8\x66 |0 + \xFA\x41 |0 + \xE8\x6E |0 + \xE8\x7B |0 + \xE8\x6A |0 + \xE8\x7A |0 + \xE8\xA2 |0 + \x9A\x40 |0 + \xBE\x53 |0 + \x97\x5B |0 + \xE8\x76 |0 + \xE8\x7C |0 + \xE8\x72 |0 + \xE8\x6C |0 + \xBE\x51 |0 + \x9A\x41 |0 + \x91\xDD |0 + \xE4\xA8 |0 + \xE8\x70 |0 + \xBE\x59 |0 + \xE8\x69 |0 + \x93\xFC |0 + \x9A\x42 |0 + \x9A\x43 |0 + \x96\x59 |0 + \xEB\xF4 |0 + \xBF\xF7 |0 + \xEB\xF3 |0 + \xEB\xF0 |0 + \xEC\x44 |0 + \xBF\xFB |0 + \x9A\x44 |0 + \xEC\x41 |0 + \xEB\xF8 |0 + \xEC\x43 |0 + \xEB\xE9 |0 + \xEB\xF6 |0 + \x90\x51 |0 + \xBF\xFD |0 + \xEB\xE1 |0 + \x94\xBF |0 + \xEB\xDF |0 + \xEC\x42 |0 + \xEC\x40 |0 + \xEB\xFE |0 + \xEB\xED |0 + \xEB\xEC |0 + \xEB\xE2 |0 + \xC0\x40 |0 + \xEB\xE8 |0 + \xEB\xF2 |0 + \xEB\xFD |0 + \xC0\x43 |0 + \xEC\x45 |0 + \xC1\xE8 |0 + \xC0\x45 |0 + \xBF\xFE |0 + \xEB\xE6 |0 + \xEB\xEF |0 + \xEB\xDE |0 + \xEB\xE0 |0 + \xBF\xF5 |0 + \xC0\x42 |0 + \xBF\xFA |0 + \xEB\xE7 |0 + \xEB\xF7 |0 + \xEB\xF1 |0 + \xC0\x41 |0 + \xEB\xDD |0 + \xC1\xE3 |0 + \xEB\xF9 |0 + \xEB\xFC |0 + \xBF\xFC |0 + \x90\xA2 |0 + \xEB\xEB |0 + \xC0\x44 |0 + \xBF\xF9 |0 + \x9C\xAB |0 + \x97\x76 |0 + \xBF\xF8 |0 + \xEB\xF5 |0 + \xEB\xFB |0 + \xBF\xF6 |0 + \xEB\xE4 |0 + \xEB\xFA |0 + \xEB\xE5 |0 + \xFC\x55 |0 + \xFE\x45 |0 + \x94\xA8 |0 + \x9A\x45 |0 + \xFA\x4B |0 + \x9D\xE1 |0 + \xEB\xEA |0 + \xEE\xD2 |0 + \x96\xD9 |0 + \xEE\xD7 |0 + \xC1\xE5 |0 + \xC1\xE7 |0 + \xEE\xDD |0 + \xC1\xE1 |0 + \xEE\xEC |0 + \xEE\xE3 |0 + \xEE\xD8 |0 + \xEE\xD9 |0 + \xEE\xE2 |0 + \xC1\xEE |0 + \xEE\xE1 |0 + \xEE\xD1 |0 + \xEE\xE0 |0 + \xEE\xD4 |0 + \xEE\xED |0 + \xC1\xED |0 + \xC1\xEB |0 + \xEE\xD5 |0 + \xEE\xE8 |0 + \x97\x74 |0 + \xEE\xDA |0 + \xEE\xE7 |0 + \xFD\xF5 |0 + \xEE\xE9 |0 + \xEE\xD0 |0 + \xC1\xE6 |0 + \x92\xE5 |0 + \xEE\xEA |0 + \x96\x45 |0 + \x91\xDA |0 + \xEE\xDE |0 + \x90\xA3 |0 + \xC1\xEA |0 + \xEE\xDB |0 + \xA0\x5F |0 + \xC1\xEC |0 + \xEE\xE4 |0 + \x90\xAF |0 + \x97\xBF |0 + \xC1\xE4 |0 + \xEE\xD6 |0 + \xEE\xE5 |0 + \x91\x4C |0 + \xEE\xDF |0 + \xEB\xE3 |0 + \xEE\xE6 |0 + \xEE\xD3 |0 + \x96\x7A |0 + \xC1\xE9 |0 + \xEE\xEB |0 + \x91\xDE |0 + \xC1\xE2 |0 + \xEE\xCE |0 + \x9A\x46 |0 + \xFE\xB0 |0 + \x97\x79 |0 + \x94\x6C |0 + \xF1\x60 |0 + \xF1\x59 |0 + \xC2\xE9 |0 + \xF1\x54 |0 + \xF1\x63 |0 + \xF1\x5B |0 + \xEE\xDC |0 + \x98\x58 |0 + \xF1\x65 |0 + \xF1\x55 |0 + \xC2\xE8 |0 + \xF1\x5F |0 + \xC2\xEA |0 + \xC2\xF2 |0 + \xC2\xF0 |0 + \xF1\x61 |0 + \xC2\xF1 |0 + \xF1\x57 |0 + \x92\x66 |0 + \xF1\x58 |0 + \xF1\x5D |0 + \xF1\x62 |0 + \x93\xFB |0 + \xEE\xCD |0 + \xC2\xEB |0 + \xF1\x6A |0 + \xF1\x67 |0 + \xF1\x6B |0 + \xF1\x5E |0 + \xF1\x5A |0 + \xF1\x68 |0 + \xF3\x6A |0 + \xF1\x5C |0 + \xC2\xEE |0 + \x9A\x47 |0 + \xC2\xED |0 + \xEE\xCF |0 + \xC2\xEF |0 + \xF1\x64 |0 + \xF1\x66 |0 + \xC2\xEC |0 + \xF1\x69 |0 + \xF1\x53 |0 + \xF1\x56 |0 + \x97\x49 |0 + \x97\x48 |0 + \x93\x4A |0 + \x9C\xE2 |0 + \xF3\x73 |0 + \xF3\x63 |0 + \xC3\xEB |0 + \xF3\x71 |0 + \x92\x64 |0 + \xF3\x61 |0 + \xC3\xEC |0 + \xF3\x6C |0 + \x91\xDF |0 + \xF3\x68 |0 + \xC3\xF1 |0 + \xF3\x72 |0 + \xF3\x62 |0 + \xF3\x65 |0 + \xC3\xE9 |0 + \xF3\x74 |0 + \xFB\x79 |0 + \xF3\x6D |0 + \xF3\x70 |0 + \xC3\xEF |0 + \xC3\xF4 |0 + \xC3\xF2 |0 + \xF3\x69 |0 + \xF3\x64 |0 + \x96\xD7 |0 + \xC3\xED |0 + \xC3\xEE |0 + \xF3\x60 |0 + \xC3\xEA |0 + \x93\x43 |0 + \xC3\xE8 |0 + \xC3\xF0 |0 + \xF3\x6F |0 + \xC3\xF3 |0 + \xF3\x6B |0 + \xF3\x75 |0 + \xC3\xF5 |0 + \xF3\x67 |0 + \xF3\x6E |0 + \xFD\xCB |0 + \xFE\x7A |0 + \x91\xDB |0 + \x8C\x6A |0 + \xF4\xF3 |0 + \xF5\x42 |0 + \xF4\xF5 |0 + \xF4\xFC |0 + \xF3\x66 |0 + \xF4\xFA |0 + \xF4\xE9 |0 + \xF5\x40 |0 + \xC4\xC3 |0 + \xF4\xED |0 + \xF4\xFE |0 + \xF4\xF4 |0 + \x97\xAF |0 + \xC4\xC2 |0 + \x95\xDD |0 + \xF5\x44 |0 + \xF4\xF6 |0 + \x93\x48 |0 + \xF4\xFB |0 + \xF4\xFD |0 + \xF4\xE7 |0 + \xF5\x41 |0 + \xF4\xF2 |0 + \xF4\xF7 |0 + \xF4\xEB |0 + \xF4\xEF |0 + \xF5\x43 |0 + \xF4\xF9 |0 + \xF4\xE8 |0 + \xF4\xEC |0 + \xF4\xEE |0 + \xF4\xF8 |0 + \x9A\x4B |0 + \xC4\xC1 |0 + \xF4\xF1 |0 + \xFC\x45 |0 + \x9A\x4D |0 + \xF4\xEA |0 + \x91\xBC |0 + \x90\xE2 |0 + \x90\xB4 |0 + \x95\xE1 |0 + \xF4\xF0 |0 + \xF6\x61 |0 + \xF6\x66 |0 + \xC5\x4F |0 + \xF6\x68 |0 + \x9A\x4E |0 + \xC5\x49 |0 + \xF6\x64 |0 + \xF6\x6A |0 + \xC5\x4E |0 + \xC5\x4A |0 + \xC5\x4B |0 + \xF6\x60 |0 + \xF6\x67 |0 + \xC5\x4D |0 + \xF6\x65 |0 + \xC5\x4C |0 + \xF6\x5F |0 + \xF6\x63 |0 + \xF6\x62 |0 + \x9A\x4F |0 + \xF6\x5E |0 + \xF6\x69 |0 + \xFE\x40 |0 + \xFE\x43 |0 + \xC5\xB1 |0 + \xF7\x6D |0 + \xF7\x70 |0 + \xF7\x6C |0 + \xF7\x6E |0 + \xF7\x6F |0 + \xF7\x69 |0 + \xF7\x6A |0 + \xF7\x67 |0 + \x96\xDD |0 + \xF7\x6B |0 + \xF7\x68 |0 + \xC5\xB2 |0 + \xC5\xB3 |0 + \x9A\x51 |0 + \xF8\x4B |0 + \xF8\x4D |0 + \x96\xA7 |0 + \x90\xB0 |0 + \xF8\x4C |0 + \xF8\x4E |0 + \xC5\xE0 |0 + \xF8\x4A |0 + \xC5\xDF |0 + \xC5\xE1 |0 + \x9C\x4E |0 + \x94\x43 |0 + \xF8\xCB |0 + \xF8\xCC |0 + \xC6\x44 |0 + \xF8\xCA |0 + \x8E\xBA |0 + \xF9\x53 |0 + \xF9\x52 |0 + \xF9\x54 |0 + \xC6\x5F |0 + \xF9\x55 |0 + \xC6\x5E |0 + \xF9\x56 |0 + \xF9\x72 |0 + \xF9\x75 |0 + \xF9\x74 |0 + \xC6\x68 |0 + \xF9\x73 |0 + \x9A\x52 |0 + \xFC\xC1 |0 + \xC6\x72 |0 + \xC6\x70 |0 + \xC6\x71 |0 + \xC6\x77 |0 + \xF9\xC0 |0 + \xF9\xC1 |0 + \xF9\xBF |0 + \xF9\xC9 |0 + \x8B\xE9 |0 + \x9C\xAF |0 + \x8B\xFD |0 + \x9A\xBC |0 + \x9A\xB8 |0 + \x9A\xAE |0 + \x9A\xA7 |0 + \x9A\x53 |0 + \x9D\x74 |0 + \xAA\xF8 |0 + \x8B\xEA |0 + \xD8\x44 |0 + \xDC\x78 |0 + \xE8\xA5 |0 + \xF3\x76 |0 + \x8B\xEB |0 + \xAA\xF9 |0 + \xAD\xAC |0 + \xB0\x7B |0 + \x90\xB2 |0 + \xD8\x45 |0 + \xD8\x46 |0 + \xB3\xAC |0 + \xB6\x7D |0 + \xDC\x7A |0 + \xDC\x79 |0 + \xB6\xA3 |0 + \xB6\x7C |0 + \xDC\x7B |0 + \xB6\x7E |0 + \xB6\xA2 |0 + \xB6\xA1 |0 + \xB6\x7B |0 + \x95\xE9 |0 + \x95\xE8 |0 + \xB9\x68 |0 + \x95\xE6 |0 + \xE0\xD0 |0 + \xE0\xCE |0 + \xE0\xCF |0 + \xE0\xCD |0 + \x90\xB5 |0 + \xBB\xD2 |0 + \x9A\x54 |0 + \xBB\xD5 |0 + \xBB\xD7 |0 + \xBB\xD6 |0 + \x90\xB3 |0 + \x95\xE7 |0 + \xBB\xD3 |0 + \xBB\xD4 |0 + \x8B\x50 |0 + \xE8\xA7 |0 + \xE8\xA6 |0 + \xBE\x5B |0 + \xE8\xA8 |0 + \xE8\xA9 |0 + \xBE\x5C |0 + \xEC\x4D |0 + \xEC\x4B |0 + \xEE\xF3 |0 + \xEC\x49 |0 + \xEC\x4A |0 + \xC0\x46 |0 + \xEC\x46 |0 + \xEC\x4E |0 + \xEC\x48 |0 + \xEC\x4C |0 + \xEE\xEF |0 + \xEE\xF1 |0 + \xEE\xF2 |0 + \xC1\xF3 |0 + \xEE\xEE |0 + \xC1\xF2 |0 + \xEE\xF0 |0 + \xC1\xEF |0 + \xC1\xF0 |0 + \xC1\xF1 |0 + \xEC\x47 |0 + \xC2\xF5 |0 + \xF1\x6E |0 + \xF1\x6C |0 + \xF1\x6D |0 + \xC2\xF3 |0 + \xC2\xF6 |0 + \xC2\xF4 |0 + \xF3\x77 |0 + \xF3\x78 |0 + \xC3\xF6 |0 + \xF5\x45 |0 + \xF5\x47 |0 + \xF5\x46 |0 + \xC4\xC4 |0 + \xC5\x50 |0 + \xF6\x6D |0 + \xF6\x6C |0 + \xF6\x6B |0 + \x8B\xEC |0 + \x9A\x56 |0 + \xAA\xFA |0 + \x8B\xFB |0 + \xC9\xAA |0 + \xCA\x58 |0 + \xA6\xE9 |0 + \xCA\x56 |0 + \xCA\x59 |0 + \xCA\x57 |0 + \xCB\xAE |0 + \xA8\xC1 |0 + \xA8\xC2 |0 + \xCB\xB0 |0 + \xA8\xBF |0 + \xCB\xAF |0 + \xCB\xAD |0 + \xA8\xC0 |0 + \xA8\xBE |0 + \x9A\x57 |0 + \xA0\xAA |0 + \xCD\xD8 |0 + \xCD\xDB |0 + \xAA\xFD |0 + \xCD\xDA |0 + \xCD\xD9 |0 + \xAA\xFC |0 + \xAA\xFB |0 + \x9F\xA6 |0 + \xAB\x40 |0 + \xCD\xDC |0 + \xAA\xFE |0 + \x99\xCC |0 + \xD0\xC6 |0 + \xAD\xAE |0 + \xAD\xAF |0 + \xAD\xB0 |0 + \xD0\xC7 |0 + \xD0\xC3 |0 + \xAD\xAD |0 + \xD0\xC4 |0 + \xD0\xC5 |0 + \xD0\xC2 |0 + \x9C\x59 |0 + \xB0\xA4 |0 + \xB0\xA1 |0 + \xD4\x45 |0 + \xB0\xA2 |0 + \xB0\xA5 |0 + \xD4\x46 |0 + \xB0\x7E |0 + \xB0\x7C |0 + \xB0\x7D |0 + \xB0\xA3 |0 + \x99\xB5 |0 + \xB3\xAD |0 + \xD8\x49 |0 + \xB3\xB5 |0 + \xD8\x48 |0 + \xD8\x4B |0 + \xB3\xB1 |0 + \xD8\x4A |0 + \xB6\xAB |0 + \xB3\xAF |0 + \xB3\xB2 |0 + \xB3\xAE |0 + \xB3\xB3 |0 + \xB3\xB4 |0 + \xB3\xB0 |0 + \x90\xBE |0 + \xD8\x47 |0 + \xB6\xA7 |0 + \xDC\x7D |0 + \xDC\xA3 |0 + \x9F\xAF |0 + \xDC\xA2 |0 + \xB6\xAC |0 + \xB6\xA8 |0 + \xB6\xA9 |0 + \xDC\x7C |0 + \xDC\x7E |0 + \xDC\xA1 |0 + \xB6\xA4 |0 + \xB6\xA6 |0 + \xB6\xAA |0 + \xB6\xA5 |0 + \x95\xF2 |0 + \xE0\xD3 |0 + \xE0\xD1 |0 + \xE0\xD2 |0 + \xB9\x6A |0 + \xB9\x6B |0 + \x90\xBF |0 + \xE0\xD4 |0 + \xB9\x69 |0 + \xBB\xD8 |0 + \xBB\xDA |0 + \xBB\xD9 |0 + \xE4\xBB |0 + \xE4\xBC |0 + \xE8\xAB |0 + \x90\xC1 |0 + \xE8\xAA |0 + \xFE\xE4 |0 + \xC0\x47 |0 + \xC0\x48 |0 + \xEC\x4F |0 + \xC0\x49 |0 + \xEE\xF6 |0 + \xEE\xF4 |0 + \xEE\xF5 |0 + \xC1\xF4 |0 + \xF1\x6F |0 + \xC3\xF7 |0 + \x90\xC4 |0 + \xC1\xF5 |0 + \xAB\x41 |0 + \xB0\xA6 |0 + \xD4\x47 |0 + \x90\xC7 |0 + \xD8\x4C |0 + \xB3\xB6 |0 + \xB6\xAD |0 + \xDC\xA4 |0 + \xDC\xA6 |0 + \xB6\xAF |0 + \xB6\xAE |0 + \xB6\xB0 |0 + \xB6\xB1 |0 + \xDC\xA5 |0 + \xB9\x6E |0 + \xB9\x6F |0 + \xB9\x6D |0 + \xBB\xDB |0 + \xB9\x6C |0 + \xE0\xD5 |0 + \xBB\xDC |0 + \xE8\xAC |0 + \xEC\x50 |0 + \xC0\x4A |0 + \xC1\xF6 |0 + \xF1\x70 |0 + \xF1\x74 |0 + \xC2\xF9 |0 + \xF1\x71 |0 + \xC2\xFA |0 + \xC2\xF8 |0 + \xF1\x75 |0 + \xC2\xFB |0 + \xF1\x73 |0 + \xF3\x79 |0 + \xC2\xF7 |0 + \xC3\xF8 |0 + \xF8\xCD |0 + \xAB\x42 |0 + \xB3\xB8 |0 + \xB3\xB7 |0 + \xB6\xB2 |0 + \xDC\xA8 |0 + \xDC\xA7 |0 + \xB6\xB3 |0 + \x92\xE4 |0 + \xE0\xD9 |0 + \xB9\x73 |0 + \xB9\x70 |0 + \xE0\xD8 |0 + \xB9\x72 |0 + \xE0\xD6 |0 + \xB9\x71 |0 + \xE0\xD7 |0 + \xE4\xBD |0 + \xBB\xDD |0 + \xE8\xAF |0 + \x9F\x52 |0 + \xBE\x5D |0 + \xE8\xAD |0 + \xBE\x5E |0 + \xBE\x5F |0 + \xE8\xAE |0 + \xBE\x60 |0 + \xEC\x51 |0 + \xC0\x4E |0 + \xC0\x4B |0 + \xC0\x50 |0 + \xEC\x53 |0 + \xC0\x4C |0 + \xEC\x52 |0 + \xC0\x4F |0 + \xC0\x4D |0 + \xEE\xF9 |0 + \xEE\xFB |0 + \x90\xDB |0 + \xC1\xF7 |0 + \xEE\xFA |0 + \xC1\xF8 |0 + \xEE\xF8 |0 + \xEE\xF7 |0 + \xA0\x66 |0 + \xF1\x77 |0 + \xF1\x76 |0 + \xC2\xFC |0 + \xF1\x78 |0 + \xF3\x7E |0 + \xC3\xFA |0 + \xF3\x7D |0 + \xF3\x7A |0 + \xC3\xF9 |0 + \xF3\x7B |0 + \xF3\x7C |0 + \xF5\x48 |0 + \xF5\x49 |0 + \xC4\xC5 |0 + \x90\xD2 |0 + \xC5\x53 |0 + \xF6\x6E |0 + \x90\xD4 |0 + \xC5\x51 |0 + \xC5\x52 |0 + \xF6\x6F |0 + \xC5\xB4 |0 + \xC5\xB5 |0 + \xF7\x71 |0 + \x9A\x5B |0 + \x95\xFD |0 + \xC6\x45 |0 + \xF8\xCF |0 + \xC6\x47 |0 + \xF8\xCE |0 + \xF8\xD0 |0 + \xC6\x46 |0 + \xF9\x57 |0 + \xF9\xAD |0 + \x8B\xC4 |0 + \xAB\x43 |0 + \x8C\x66 |0 + \xB9\x74 |0 + \x90\xDE |0 + \xE4\xBE |0 + \xE8\xB0 |0 + \xC0\x51 |0 + \xC0\x52 |0 + \x9C\xE4 |0 + \xAB\x44 |0 + \x90\xE1 |0 + \xBE\x61 |0 + \xC3\xFB |0 + \xAD\xB1 |0 + \xC0\x53 |0 + \xC5\xE2 |0 + \xAD\xB2 |0 + \xD8\x4D |0 + \xDC\xA9 |0 + \x9E\x46 |0 + \xDC\xAB |0 + \xDC\xAA |0 + \x96\x51 |0 + \xE0\xDD |0 + \xE0\xDA |0 + \xB9\x75 |0 + \xB9\x76 |0 + \xE0\xDB |0 + \xE0\xDC |0 + \xE4\xC0 |0 + \xE4\xC5 |0 + \xBB\xDE |0 + \xE4\xBF |0 + \xE4\xC1 |0 + \xE4\xC8 |0 + \xE4\xC3 |0 + \xE4\xC7 |0 + \xE4\xC4 |0 + \xE4\xC2 |0 + \xE4\xC6 |0 + \xBB\xDF |0 + \xFB\x58 |0 + \xE8\xB3 |0 + \x90\xE6 |0 + \xE8\xB1 |0 + \xBE\x63 |0 + \xBE\x62 |0 + \xE8\xB2 |0 + \xBE\x64 |0 + \xEC\x56 |0 + \xEC\x55 |0 + \xC0\x54 |0 + \xEC\x54 |0 + \xEE\xFC |0 + \x96\x50 |0 + \xEE\xFE |0 + \xEF\x41 |0 + \xEF\x40 |0 + \x90\xE7 |0 + \xC1\xF9 |0 + \xEE\xFD |0 + \xF1\xA1 |0 + \xC2\xFD |0 + \xF1\x7D |0 + \xF1\xA2 |0 + \xC2\xFE |0 + \xF1\x7B |0 + \xF1\x7E |0 + \xF1\x7C |0 + \xF1\x79 |0 + \xC3\x40 |0 + \xF1\x7A |0 + \x90\xE8 |0 + \x9A\x5D |0 + \xF3\xA1 |0 + \x9F\x7A |0 + \xF3\xA3 |0 + \xF3\xA2 |0 + \x9B\x5C |0 + \xF5\x4A |0 + \x9F\x7C |0 + \xF5\x4B |0 + \xFC\x52 |0 + \x90\xE9 |0 + \xF6\x70 |0 + \x90\xEA |0 + \xC5\xB7 |0 + \x9A\x5E |0 + \xC5\xB6 |0 + \xF8\x4F |0 + \xF8\x50 |0 + \xC6\x48 |0 + \xF8\xD1 |0 + \x9F\x76 |0 + \xC6\x69 |0 + \xAD\xB3 |0 + \xB6\xB4 |0 + \xE4\xCA |0 + \xE4\xC9 |0 + \xE8\xB5 |0 + \xE8\xB4 |0 + \x90\xEB |0 + \xC1\xFA |0 + \xEF\x43 |0 + \xEF\x42 |0 + \xF1\xA5 |0 + \xF1\xA3 |0 + \xF1\xA6 |0 + \xF1\xA4 |0 + \xC3\xFC |0 + \xF3\xA4 |0 + \xF3\xA5 |0 + \xF3\xA6 |0 + \x90\xEC |0 + \xF6\x71 |0 + \xF7\x72 |0 + \xF8\xD2 |0 + \x8B\xEE |0 + \xAD\xB4 |0 + \x90\xEE |0 + \xEC\x57 |0 + \xEF\x44 |0 + \x91\xC6 |0 + \xAD\xB5 |0 + \x90\xF2 |0 + \xBB\xE0 |0 + \xEC\x58 |0 + \xC3\x41 |0 + \xF1\xA7 |0 + \xC3\xFD |0 + \xF5\x4C |0 + \xF5\x4D |0 + \xC5\x54 |0 + \xF8\x51 |0 + \xAD\xB6 |0 + \xB3\xBB |0 + \xB3\xBC |0 + \xD8\x4E |0 + \xB6\xB5 |0 + \xB6\xB6 |0 + \xDC\xAC |0 + \xB6\xB7 |0 + \xB9\x7A |0 + \xB9\x7C |0 + \xE0\xDF |0 + \xE0\xE0 |0 + \xE0\xDE |0 + \xB9\x77 |0 + \xB9\x78 |0 + \xB9\x7B |0 + \xB9\x79 |0 + \xFC\xBC |0 + \x8A\x74 |0 + \xE4\xCB |0 + \xBB\xE1 |0 + \xBB\xE2 |0 + \xE8\xBC |0 + \xBE\x67 |0 + \xE8\xB7 |0 + \xE8\xB6 |0 + \x96\x57 |0 + \xE8\xBB |0 + \xBE\x65 |0 + \x9C\xEF |0 + \xC0\x5B |0 + \xE8\xB8 |0 + \xE8\xBD |0 + \xE8\xBA |0 + \xE8\xB9 |0 + \xBE\x66 |0 + \xC0\x59 |0 + \x9F\xDF |0 + \xEC\x5A |0 + \xC0\x55 |0 + \xEC\x5B |0 + \x90\xF7 |0 + \x90\xF6 |0 + \xEC\x59 |0 + \xC0\x58 |0 + \xC0\x56 |0 + \xC0\x5A |0 + \xC0\x57 |0 + \xEF\x45 |0 + \xEF\x4A |0 + \xEF\x46 |0 + \xEF\x49 |0 + \xC1\xFB |0 + \x9B\x5E |0 + \xED\xD4 |0 + \xEF\x48 |0 + \xEF\x47 |0 + \x90\xF8 |0 + \xC3\x44 |0 + \xC3\x42 |0 + \xC3\x45 |0 + \xC3\x43 |0 + \xF1\xA8 |0 + \xF1\xA9 |0 + \xF1\xAA |0 + \xC3\x46 |0 + \xF3\xAA |0 + \xC4\x40 |0 + \xF3\xA8 |0 + \xC4\x41 |0 + \xF3\xA7 |0 + \xF3\xA9 |0 + \xC3\xFE |0 + \xF5\x51 |0 + \xF5\x4E |0 + \xF5\x4F |0 + \xF5\x50 |0 + \xF6\x72 |0 + \xC5\x56 |0 + \x90\xF9 |0 + \xC5\x55 |0 + \x8C\xC9 |0 + \xF7\x74 |0 + \xF7\x73 |0 + \xC5\xB8 |0 + \xFA\x6A |0 + \xC5\xE3 |0 + \xC6\x49 |0 + \xC6\x60 |0 + \xF9\x58 |0 + \xF9\xAE |0 + \xF9\xAF |0 + \x8B\xEF |0 + \xAD\xB7 |0 + \xDC\xAD |0 + \xE0\xE1 |0 + \xE4\xCC |0 + \xE4\xCD |0 + \xBB\xE3 |0 + \xBB\xE4 |0 + \xE8\xBE |0 + \xBE\x68 |0 + \x9F\xE0 |0 + \xC1\xFC |0 + \x91\x42 |0 + \xF1\xAB |0 + \x9A\x62 |0 + \xC3\x47 |0 + \xF3\xAD |0 + \xC4\x42 |0 + \xF3\xAC |0 + \xF3\xAE |0 + \xF3\xAB |0 + \xF6\x75 |0 + \xF5\x52 |0 + \xF5\x53 |0 + \x95\x69 |0 + \xC4\xC6 |0 + \xF6\x74 |0 + \x91\x44 |0 + \x91\x43 |0 + \xF6\x73 |0 + \x91\x41 |0 + \xF7\x75 |0 + \xF9\xB0 |0 + \x8B\xF0 |0 + \xAD\xB8 |0 + \x96\x60 |0 + \x8B\xF1 |0 + \xAD\xB9 |0 + \x99\xF6 |0 + \x91\x49 |0 + \xB0\xA7 |0 + \xD4\x48 |0 + \xD8\x4F |0 + \x91\x4A |0 + \xB6\xB8 |0 + \xB6\xBB |0 + \xB6\xB9 |0 + \xDC\xAE |0 + \x91\x4B |0 + \xB6\xBD |0 + \xB6\xBA |0 + \x9A\x64 |0 + \xB6\xBC |0 + \xB9\x7E |0 + \x8A\xBF |0 + \xE0\xE2 |0 + \xE0\xE3 |0 + \xE8\xC0 |0 + \xB9\x7D |0 + \xB9\xA1 |0 + \xB9\xA2 |0 + \xE4\xCF |0 + \xE4\xCE |0 + \xBB\xE5 |0 + \xBB\xE6 |0 + \xE4\xD0 |0 + \xE8\xBF |0 + \xBB\xE8 |0 + \xBE\x69 |0 + \xBB\xE7 |0 + \x9A\x66 |0 + \xC0\x5C |0 + \xE8\xC1 |0 + \xBE\x6B |0 + \xBE\x6A |0 + \xE8\xC2 |0 + \xE8\xC5 |0 + \xE8\xC3 |0 + \xE8\xC4 |0 + \xBE\x6C |0 + \x9A\x67 |0 + \xC0\x61 |0 + \xC0\x5F |0 + \x9A\x69 |0 + \xC0\x5E |0 + \xEC\x5D |0 + \xC0\x60 |0 + \xEC\x5C |0 + \xEF\x4B |0 + \xEC\x5E |0 + \xC0\x5D |0 + \xEC\x5F |0 + \xEF\x4E |0 + \xEF\x4C |0 + \xEF\x4D |0 + \xEF\x52 |0 + \xC3\x4B |0 + \xEF\x51 |0 + \xEF\x54 |0 + \xEF\x53 |0 + \xEF\x50 |0 + \xEF\x4F |0 + \xC1\xFD |0 + \x9A\x6A |0 + \x96\x52 |0 + \x91\x4D |0 + \xF1\xAE |0 + \x96\x66 |0 + \xF1\xAD |0 + \xC3\x4A |0 + \xC3\x48 |0 + \xC3\x49 |0 + \x9F\x7B |0 + \xF1\xAC |0 + \x9A\x6B |0 + \xF3\xB1 |0 + \xC4\x43 |0 + \xF3\xB0 |0 + \xF3\xAF |0 + \xC4\x44 |0 + \xA0\x6C |0 + \xF5\x58 |0 + \xF5\x57 |0 + \x96\x67 |0 + \xF5\x55 |0 + \xF5\x54 |0 + \xC4\xC8 |0 + \xC4\xC7 |0 + \xF5\x59 |0 + \xF7\x76 |0 + \xC5\xB9 |0 + \xF6\x77 |0 + \xC5\x57 |0 + \xF6\x76 |0 + \xF5\x56 |0 + \xF7\x77 |0 + \xC5\xE4 |0 + \x9A\x6C |0 + \xC6\x61 |0 + \xF9\x59 |0 + \xF9\xB1 |0 + \x9A\x6D |0 + \x8B\xF2 |0 + \xAD\xBA |0 + \xD8\x50 |0 + \xEF\x55 |0 + \xAD\xBB |0 + \x96\x6A |0 + \xE4\xD2 |0 + \xE4\xD1 |0 + \xEC\x60 |0 + \xEF\x57 |0 + \xEF\x56 |0 + \xFC\xEA |0 + \xC3\x4C |0 + \xF3\xB2 |0 + \xF3\xB3 |0 + \xC4\xC9 |0 + \x96\x6C |0 + \xF9\xB2 |0 + \xB0\xA8 |0 + \xB6\xBF |0 + \xB6\xBE |0 + \xE0\xE4 |0 + \xE0\xE6 |0 + \xB9\xA4 |0 + \xE0\xE5 |0 + \xB9\xA3 |0 + \xB9\xA5 |0 + \xE0\xE7 |0 + \x91\xC4 |0 + \xE4\xD4 |0 + \xE4\xD6 |0 + \xE4\xD5 |0 + \x96\x77 |0 + \xE4\xD8 |0 + \xBB\xE9 |0 + \xE4\xD7 |0 + \xE4\xD3 |0 + \x99\xF4 |0 + \x9A\x6F |0 + \xE4\xD9 |0 + \xE8\xCC |0 + \xE8\xCF |0 + \xE8\xD1 |0 + \xE8\xC7 |0 + \xE8\xCB |0 + \xE8\xC8 |0 + \xBE\x6E |0 + \xBE\x71 |0 + \xBE\x73 |0 + \xE8\xC9 |0 + \xE8\xCA |0 + \xBE\x72 |0 + \xE8\xCD |0 + \xE8\xD0 |0 + \xE8\xCE |0 + \xBE\x74 |0 + \x9F\xAB |0 + \xBE\x70 |0 + \xE8\xC6 |0 + \xBE\x6D |0 + \xBE\x6F |0 + \x8C\xBE |0 + \x8E\xC1 |0 + \xC0\x63 |0 + \xEC\x66 |0 + \xEC\x64 |0 + \xEC\x63 |0 + \x95\x55 |0 + \xEC\x69 |0 + \xEC\x68 |0 + \xEC\x67 |0 + \xEC\x62 |0 + \xC0\x62 |0 + \xEC\x61 |0 + \xEC\x65 |0 + \xC0\x64 |0 + \xEF\x5A |0 + \x91\x52 |0 + \xEF\x5E |0 + \xEF\x5B |0 + \xEF\x5D |0 + \xEF\x5C |0 + \xEF\x59 |0 + \xEF\x5F |0 + \xEF\x62 |0 + \xEF\x60 |0 + \xEF\x61 |0 + \xC2\x40 |0 + \xC1\xFE |0 + \xEF\x58 |0 + \xEF\x63 |0 + \xF1\xB3 |0 + \xF1\xB6 |0 + \xF1\xB8 |0 + \xF1\xB7 |0 + \xF1\xB1 |0 + \xF1\xB5 |0 + \xF1\xB0 |0 + \x91\x53 |0 + \xF1\xB2 |0 + \xC3\x4D |0 + \xF1\xAF |0 + \x91\x55 |0 + \xF1\xB4 |0 + \xF3\xC0 |0 + \xF3\xB5 |0 + \xC4\x45 |0 + \xC4\x46 |0 + \xF3\xB4 |0 + \xF3\xB9 |0 + \xF3\xBF |0 + \xF3\xB7 |0 + \xF3\xBE |0 + \x95\x5D |0 + \xF3\xBB |0 + \x96\x71 |0 + \xF3\xBA |0 + \xF3\xBD |0 + \xF3\xB8 |0 + \xF3\xB6 |0 + \x9C\x6D |0 + \xF3\xBC |0 + \xF5\x60 |0 + \xF5\x5E |0 + \xC4\xCA |0 + \xF5\x5D |0 + \xF5\x63 |0 + \xF5\x61 |0 + \x96\x73 |0 + \xC4\xCB |0 + \xF5\x5C |0 + \xF5\x5A |0 + \xF5\x5B |0 + \xC4\xCD |0 + \xF5\x5F |0 + \xC4\xCC |0 + \xF5\x62 |0 + \xF6\x78 |0 + \xF6\x7E |0 + \x91\x54 |0 + \x9A\x71 |0 + \xF6\x79 |0 + \xC5\x5B |0 + \xF6\xA1 |0 + \xC5\x5A |0 + \xF6\x7D |0 + \xF6\x7C |0 + \xC5\x59 |0 + \xF6\x7B |0 + \xC5\x58 |0 + \xF6\x7A |0 + \xF7\x7D |0 + \xF7\xA1 |0 + \xF7\x7E |0 + \xF7\x7B |0 + \xC5\xBB |0 + \xF7\x78 |0 + \xF7\x7C |0 + \xF7\xA3 |0 + \xF7\xA2 |0 + \xF7\x79 |0 + \xF7\x7A |0 + \xC5\xBA |0 + \xF8\x52 |0 + \xC5\xE7 |0 + \x91\x56 |0 + \xF8\x53 |0 + \xC5\xE5 |0 + \xC5\xE6 |0 + \x96\x6D |0 + \xF8\xD3 |0 + \xC6\x4A |0 + \xF9\x76 |0 + \xC6\x6A |0 + \x95\x57 |0 + \xF9\xB3 |0 + \xC6\x6B |0 + \xF9\xB4 |0 + \xF9\xB5 |0 + \xF9\xC3 |0 + \xF9\xC2 |0 + \xC6\x7A |0 + \xF9\xCD |0 + \x89\xC6 |0 + \x89\xC7 |0 + \xB0\xA9 |0 + \xE0\xE9 |0 + \xE0\xE8 |0 + \xBB\xEA |0 + \xBB\xEB |0 + \xE4\xDA |0 + \x8A\x6A |0 + \xE8\xD2 |0 + \xEC\x6C |0 + \x8B\x57 |0 + \xBE\x75 |0 + \xC0\x65 |0 + \xEC\x6A |0 + \x9F\xE1 |0 + \xEC\x6D |0 + \xC0\x66 |0 + \x9B\x5F |0 + \xEF\x64 |0 + \xEC\x6B |0 + \xF1\xB9 |0 + \xC3\x4E |0 + \xF3\xC1 |0 + \xF5\x66 |0 + \xF5\x64 |0 + \xF5\x65 |0 + \xF6\xA2 |0 + \xC5\x5C |0 + \xF7\xA4 |0 + \xC5\xEA |0 + \xC5\xBC |0 + \xC5\xE8 |0 + \xC5\xE9 |0 + \xF8\xD4 |0 + \xC6\x62 |0 + \xA0\x5D |0 + \xB0\xAA |0 + \xF1\xBA |0 + \xD4\x49 |0 + \x91\x5B |0 + \xB9\xA6 |0 + \x91\x5C |0 + \xE4\xDB |0 + \xBB\xEC |0 + \xE4\xDC |0 + \xE8\xD4 |0 + \xE8\xD3 |0 + \xC0\x68 |0 + \xBE\x76 |0 + \xBE\x77 |0 + \xE8\xD7 |0 + \xE8\xD6 |0 + \xE8\xD5 |0 + \x91\x5E |0 + \xEC\x6E |0 + \xEC\x71 |0 + \xEC\x70 |0 + \xEC\x6F |0 + \xC0\x67 |0 + \xEF\x68 |0 + \xEF\x66 |0 + \xEF\x65 |0 + \x9F\x5C |0 + \xEF\x67 |0 + \x9F\x57 |0 + \xC3\x4F |0 + \xF1\xBC |0 + \xF1\xBD |0 + \xC3\x50 |0 + \xF1\xBB |0 + \x9F\x65 |0 + \xF3\xC3 |0 + \xF3\xC2 |0 + \xF3\xC5 |0 + \xC4\x47 |0 + \xF3\xC4 |0 + \x9A\x72 |0 + \xF5\x67 |0 + \xF5\x69 |0 + \xF5\x68 |0 + \x91\x60 |0 + \xF6\xA3 |0 + \xF6\xA6 |0 + \xF6\xA4 |0 + \xF6\xA5 |0 + \xF7\xA5 |0 + \xC5\xBD |0 + \xF8\x54 |0 + \xF8\x55 |0 + \xF8\x56 |0 + \xC6\x4B |0 + \xC6\x63 |0 + \xF9\xB6 |0 + \xB0\xAB |0 + \xBE\x78 |0 + \xC0\x69 |0 + \xF1\xBE |0 + \x9F\x5E |0 + \xF7\xA6 |0 + \x91\x61 |0 + \xF9\xC4 |0 + \xD4\x4A |0 + \xC6\x7B |0 + \xB0\xAC |0 + \xEC\x72 |0 + \x91\x64 |0 + \xF1\xBF |0 + \xF3\xC6 |0 + \x9F\x41 |0 + \xF6\xA7 |0 + \xF7\xA7 |0 + \xB0\xAD |0 + \xE4\xDD |0 + \xE4\xDE |0 + \x91\x69 |0 + \xBB\xED |0 + \xBB\xEE |0 + \xE8\xD9 |0 + \xBE\x7A |0 + \xBE\x79 |0 + \xE8\xD8 |0 + \xEF\x69 |0 + \xF1\xC0 |0 + \xF1\xC2 |0 + \xF1\xC1 |0 + \xC3\x53 |0 + \xC3\x52 |0 + \xC3\x51 |0 + \x91\x68 |0 + \xC5\x5E |0 + \xF6\xA8 |0 + \xC5\x5D |0 + \xF7\xA9 |0 + \xF7\xA8 |0 + \xC6\x4C |0 + \xF8\xD5 |0 + \xB3\xBD |0 + \xE0\xEA |0 + \xE4\xE1 |0 + \xE4\xDF |0 + \xE4\xE0 |0 + \xE8\xE2 |0 + \xE8\xDD |0 + \xE8\xDA |0 + \xE8\xE1 |0 + \x9A\x74 |0 + \xE8\xE3 |0 + \xBE\x7C |0 + \xE8\xE0 |0 + \xE8\xDC |0 + \xE8\xDB |0 + \xE8\xDF |0 + \xE8\xDE |0 + \xBE\x7B |0 + \xEC\x7D |0 + \xEC\x78 |0 + \xEC\x76 |0 + \xEC\xA1 |0 + \xEC\x77 |0 + \x96\xB2 |0 + \xEC\x73 |0 + \x9A\x75 |0 + \xEC\x79 |0 + \xFD\xA5 |0 + \xEC\x74 |0 + \xEF\x72 |0 + \xEC\x75 |0 + \xEC\xA2 |0 + \x9E\xE9 |0 + \x8B\xBA |0 + \x91\x6D |0 + \xA0\x60 |0 + \xEC\x7C |0 + \xC0\x6A |0 + \xEC\x7B |0 + \xEC\x7A |0 + \xEC\x7E |0 + \x9F\xDE |0 + \xEF\x6A |0 + \xEF\x6D |0 + \x9F\xC3 |0 + \xEF\x6C |0 + \x96\xB5 |0 + \xEF\x74 |0 + \xEF\x6F |0 + \xEF\x73 |0 + \xEF\x71 |0 + \xEF\x70 |0 + \xEF\x6E |0 + \xEF\x6B |0 + \xC2\x43 |0 + \xC2\x42 |0 + \xC2\x44 |0 + \xC2\x41 |0 + \xEF\x75 |0 + \xA0\x67 |0 + \xF1\xC8 |0 + \xF1\xCB |0 + \xF1\xC9 |0 + \xF1\xCD |0 + \xF1\xCE |0 + \xF1\xC6 |0 + \xC3\x58 |0 + \xF1\xC7 |0 + \xF1\xC5 |0 + \xF1\xCC |0 + \xF1\xC4 |0 + \xF1\xC3 |0 + \xC3\x57 |0 + \xC3\x55 |0 + \xC3\x54 |0 + \x96\xB3 |0 + \xF1\xCA |0 + \xF3\xCF |0 + \xF3\xD5 |0 + \xC4\x4A |0 + \xF3\xD0 |0 + \xF3\xD3 |0 + \xF3\xD7 |0 + \xC4\x4B |0 + \xF3\xD2 |0 + \x9A\x76 |0 + \xF3\xCA |0 + \xF3\xC9 |0 + \xF3\xD6 |0 + \xF3\xCD |0 + \xF3\xCB |0 + \xF3\xD4 |0 + \xF3\xCC |0 + \xC4\x49 |0 + \xC4\x48 |0 + \x95\xD5 |0 + \xF3\xC7 |0 + \xF3\xC8 |0 + \xF3\xD1 |0 + \x9E\xCA |0 + \xF3\xCE |0 + \x9A\x77 |0 + \x9A\x78 |0 + \xF5\x6C |0 + \xF5\x6F |0 + \xC3\x56 |0 + \x91\x70 |0 + \x91\x6F |0 + \xF5\x6D |0 + \xF5\x73 |0 + \xF5\x71 |0 + \xF5\x6B |0 + \xF5\x76 |0 + \x9F\xA3 |0 + \xF5\x6A |0 + \x91\x71 |0 + \xC4\xCF |0 + \xF5\x72 |0 + \x96\xB1 |0 + \xF5\x6E |0 + \xC4\xCE |0 + \xF5\x75 |0 + \x9F\x63 |0 + \xF5\x74 |0 + \x9F\x67 |0 + \xF6\xAB |0 + \xF6\xAA |0 + \x8B\xB9 |0 + \x9A\x7A |0 + \xF6\xB1 |0 + \xF6\xAD |0 + \xF6\xB0 |0 + \xC5\x60 |0 + \x8B\x56 |0 + \xF6\xAE |0 + \xF6\xAF |0 + \xF6\xA9 |0 + \xF6\xAC |0 + \xC5\x5F |0 + \x9A\xDA |0 + \xC5\xBF |0 + \xF7\xB4 |0 + \xF7\xAF |0 + \xF7\xB3 |0 + \x96\xB0 |0 + \xF7\xB6 |0 + \xF7\xB2 |0 + \xF7\xAE |0 + \x9A\x7E |0 + \xC5\xC1 |0 + \xF7\xB1 |0 + \xF7\xB5 |0 + \xC5\xC0 |0 + \xF7\xAC |0 + \xF5\x70 |0 + \xF7\xB0 |0 + \xF7\xAD |0 + \x9D\xDE |0 + \xF7\xAA |0 + \xF7\xAB |0 + \xC5\xBE |0 + \xF8\x5A |0 + \xF8\x5C |0 + \xF8\x5F |0 + \xF8\x5B |0 + \xF8\x60 |0 + \x96\xAD |0 + \xF8\x59 |0 + \xF8\x57 |0 + \x96\xAE |0 + \xC5\xEB |0 + \xF8\x5D |0 + \xC5\xED |0 + \xC5\xEC |0 + \xF8\x58 |0 + \xF8\x5E |0 + \x9E\xA1 |0 + \xF8\xDA |0 + \xC6\x4D |0 + \xF8\xDB |0 + \xF8\xD9 |0 + \xF8\xD6 |0 + \xF8\xD8 |0 + \xF8\xD7 |0 + \xF9\x5A |0 + \xF9\x5C |0 + \xF9\x5B |0 + \xF9\x79 |0 + \x9E\x50 |0 + \xF9\x78 |0 + \xF9\x77 |0 + \xF9\x7A |0 + \xC6\x73 |0 + \xC6\x74 |0 + \xF9\xCA |0 + \xF9\xCE |0 + \x96\xAF |0 + \x8B\xF4 |0 + \xB3\xBE |0 + \xDC\xAF |0 + \xE0\xED |0 + \xB9\xA7 |0 + \xE0\xEB |0 + \xE0\xEC |0 + \xE4\xE2 |0 + \xE4\xE3 |0 + \xBB\xF1 |0 + \xBB\xEF |0 + \xE4\xE4 |0 + \xBB\xF0 |0 + \xE8\xE8 |0 + \xE8\xEB |0 + \xE8\xE5 |0 + \xE8\xEC |0 + \xE8\xE4 |0 + \xE8\xE6 |0 + \xE8\xE7 |0 + \xE8\xEA |0 + \x9F\xA4 |0 + \xBE\xA1 |0 + \xE8\xEF |0 + \xE8\xEE |0 + \xBE\x7D |0 + \xE8\xE9 |0 + \xE8\xED |0 + \xBE\x7E |0 + \x96\xBD |0 + \xEC\xAC |0 + \xC0\x6F |0 + \xEC\xA7 |0 + \xC0\x6B |0 + \x96\xF4 |0 + \xEC\xA4 |0 + \xEC\xAA |0 + \xEC\xAD |0 + \xC0\x70 |0 + \xEC\xA9 |0 + \xEC\xA6 |0 + \xEC\xAE |0 + \xEC\xA5 |0 + \x96\xB8 |0 + \xEC\xAB |0 + \xC0\x6C |0 + \xEC\xA3 |0 + \xC0\x6D |0 + \xC0\x6E |0 + \xEC\xA8 |0 + \xEF\xA9 |0 + \xEF\x7A |0 + \xEF\x7B |0 + \xEF\x7E |0 + \xEF\x7C |0 + \xEF\x76 |0 + \xFA\xA1 |0 + \xEF\x79 |0 + \xEF\xA5 |0 + \xEF\x7D |0 + \x91\xA7 |0 + \xC2\x45 |0 + \xEF\xA7 |0 + \xEF\xA4 |0 + \xC2\x46 |0 + \xEF\xA6 |0 + \xEF\x77 |0 + \xEF\xA2 |0 + \xEF\xA3 |0 + \xA0\x5E |0 + \xEF\xA1 |0 + \x9A\x7D |0 + \xF1\xD2 |0 + \xF1\xD4 |0 + \xF1\xD7 |0 + \x89\x48 |0 + \xF1\xD1 |0 + \x9E\xB1 |0 + \xC3\x59 |0 + \xF1\xD9 |0 + \xF1\xD0 |0 + \xF1\xDA |0 + \xF1\xD6 |0 + \xF1\xD8 |0 + \xF1\xDC |0 + \xF1\xD5 |0 + \xF1\xDD |0 + \xF1\xD3 |0 + \xF1\xCF |0 + \xC3\x5A |0 + \x9D\xDB |0 + \xF1\xDB |0 + \xC3\x5B |0 + \xC4\x4D |0 + \xEF\x78 |0 + \xF3\xF1 |0 + \xF3\xE8 |0 + \xC4\x4F |0 + \xF3\xE4 |0 + \xC4\x50 |0 + \x95\xBF |0 + \x8A\x73 |0 + \xF3\xED |0 + \xF3\xE7 |0 + \xF3\xDD |0 + \xC4\x4E |0 + \xF3\xEA |0 + \xF3\xE5 |0 + \xF3\xE6 |0 + \xF3\xD8 |0 + \xF3\xDF |0 + \xF3\xEE |0 + \xF3\xEB |0 + \x9E\xFE |0 + \xF3\xE3 |0 + \x91\x7A |0 + \xF3\xEF |0 + \xF3\xDE |0 + \xF3\xD9 |0 + \xF3\xEC |0 + \x91\x7B |0 + \xF3\xDB |0 + \xF3\xE9 |0 + \xF3\xE0 |0 + \xF3\xF0 |0 + \xF3\xDC |0 + \xC4\x4C |0 + \xF3\xDA |0 + \xF3\xE1 |0 + \xF3\xE2 |0 + \xF5\x7D |0 + \xF5\x7B |0 + \x9A\xA3 |0 + \xF5\xA2 |0 + \xF5\xAE |0 + \xF5\xA5 |0 + \xF5\x7C |0 + \xF5\x78 |0 + \xF5\xA7 |0 + \xF5\x7E |0 + \xF5\xA3 |0 + \xF5\x7A |0 + \xF5\xAA |0 + \xF5\x77 |0 + \xF5\xA1 |0 + \xF5\xA6 |0 + \xF5\xA8 |0 + \xF5\xAB |0 + \xF5\x79 |0 + \x96\xC2 |0 + \xF5\xAF |0 + \xF5\xB0 |0 + \xF5\xA9 |0 + \xF5\xAD |0 + \xF5\xA4 |0 + \x9F\x77 |0 + \xF6\xC1 |0 + \xF6\xC4 |0 + \xC5\x61 |0 + \xF6\xC3 |0 + \xF6\xC8 |0 + \xF6\xC6 |0 + \xC5\x62 |0 + \xF6\xBD |0 + \xF6\xB3 |0 + \xF6\xB2 |0 + \xC5\x64 |0 + \xF6\xBF |0 + \xF6\xC0 |0 + \xF6\xBC |0 + \xF6\xB4 |0 + \x9A\xA4 |0 + \xF6\xB9 |0 + \xF5\xAC |0 + \x9A\xA5 |0 + \xF6\xB5 |0 + \xC5\x63 |0 + \xF6\xBB |0 + \x91\xA1 |0 + \xF6\xBA |0 + \xF6\xB6 |0 + \xF6\xC2 |0 + \x89\xB8 |0 + \xF6\xB7 |0 + \xF7\xBB |0 + \xF6\xC5 |0 + \xF6\xC7 |0 + \xF6\xBE |0 + \xF6\xB8 |0 + \xF7\xBC |0 + \xF7\xBE |0 + \xF7\xB8 |0 + \xC5\xC2 |0 + \x91\x73 |0 + \xF7\xC5 |0 + \xF7\xC3 |0 + \xC5\xC3 |0 + \xF7\xC2 |0 + \xF7\xC1 |0 + \xF7\xBA |0 + \xF7\xB7 |0 + \xF7\xBD |0 + \xF7\xC6 |0 + \xF7\xB9 |0 + \xF7\xBF |0 + \xF8\x69 |0 + \xF8\x6E |0 + \xF8\x64 |0 + \xF8\x67 |0 + \xC5\xEE |0 + \xF8\x6B |0 + \xF8\x72 |0 + \xF7\xC0 |0 + \xF8\x65 |0 + \xF8\x6F |0 + \xF8\x73 |0 + \xF8\x6A |0 + \xF8\x63 |0 + \xF8\x6D |0 + \xF8\x6C |0 + \xF8\x71 |0 + \xF8\x70 |0 + \xF7\xC4 |0 + \xF8\x68 |0 + \xF8\x62 |0 + \xF8\x66 |0 + \xC6\x4E |0 + \xC6\x4F |0 + \xF8\x61 |0 + \x9A\xA6 |0 + \xF8\xE6 |0 + \xF8\xDD |0 + \xF8\xE5 |0 + \xF8\xE2 |0 + \xF8\xE3 |0 + \xF8\xDC |0 + \xF8\xDF |0 + \xF8\xE7 |0 + \xF8\xE1 |0 + \xF8\xE0 |0 + \xF8\xDE |0 + \xF8\xE4 |0 + \x89\xBD |0 + \xF9\x5D |0 + \x89\xB9 |0 + \xF9\x5E |0 + \x91\x7D |0 + \xF9\x60 |0 + \xF9\x5F |0 + \xF9\x62 |0 + \xF9\x61 |0 + \xF9\x7C |0 + \xF9\x7B |0 + \xF9\xB7 |0 + \xF9\xB8 |0 + \x96\xBB |0 + \xF9\xC5 |0 + \xC6\x78 |0 + \xC6\x7C |0 + \x9F\xF2 |0 + \xF9\xCF |0 + \xC6\x7D |0 + \x8B\xF5 |0 + \xB3\xBF |0 + \xC4\xD0 |0 + \xF6\xC9 |0 + \x9A\xA9 |0 + \xC6\x50 |0 + \xC6\x51 |0 + \xB3\xC0 |0 + \xE0\xEE |0 + \x9F\x54 |0 + \xB9\xA8 |0 + \xE8\xF0 |0 + \x9F\xE3 |0 + \x9E\xED |0 + \xEC\xB0 |0 + \xEC\xB1 |0 + \xEC\xAF |0 + \xEF\xAB |0 + \xEF\xAA |0 + \xC2\x47 |0 + \xF1\xDF |0 + \xEF\xAC |0 + \xF1\xDE |0 + \x91\xAA |0 + \xF3\xF3 |0 + \xC4\x51 |0 + \xC4\x53 |0 + \xF3\xF2 |0 + \x91\xAB |0 + \xA0\x70 |0 + \xC4\x52 |0 + \x9F\x6D |0 + \xF5\xB1 |0 + \xF5\xB3 |0 + \xF5\xB2 |0 + \xF6\xCA |0 + \xC5\x65 |0 + \x91\xAC |0 + \xC5\xEF |0 + \xF8\xE8 |0 + \xF9\x63 |0 + \x91\xAD |0 + \xF9\xD2 |0 + \xB3\xC1 |0 + \xA0\xFD |0 + \xE4\xE5 |0 + \x9F\xE2 |0 + \xBE\xA2 |0 + \x91\xAF |0 + \x9E\x41 |0 + \x9A\xAA |0 + \xEC\xB3 |0 + \xEC\xB2 |0 + \x91\xB0 |0 + \xEF\xAD |0 + \x9A\xAB |0 + \xC4\x54 |0 + \xC4\xD1 |0 + \xF7\xC7 |0 + \xF9\xCB |0 + \xB3\xC2 |0 + \xBB\xF2 |0 + \x9A\xAC |0 + \xBE\xA3 |0 + \x9A\x4A |0 + \xF3\xF4 |0 + \x91\xB2 |0 + \xF8\x74 |0 + \xB6\xC0 |0 + \x8B\xF6 |0 + \x9A\xAD |0 + \x89\xB6 |0 + \xEF\xAE |0 + \xC6\x64 |0 + \xB6\xC1 |0 + \xBE\xA4 |0 + \xC2\x48 |0 + \xF8\x75 |0 + \xB6\xC2 |0 + \xE8\xF1 |0 + \xC0\x72 |0 + \xEC\xB4 |0 + \xEC\xB5 |0 + \xC0\x71 |0 + \xEF\xAF |0 + \xC2\x4C |0 + \xC2\x4A |0 + \xC2\x4B |0 + \xC2\x49 |0 + \xF1\xE0 |0 + \xC3\x5C |0 + \x9A\xAF |0 + \xF5\xB5 |0 + \xF5\xB4 |0 + \xF5\xB7 |0 + \xF5\xB6 |0 + \xC4\xD2 |0 + \xF6\xCB |0 + \xF6\xCD |0 + \xF6\xCC |0 + \xC5\x66 |0 + \xF7\xC8 |0 + \x9A\xB0 |0 + \xF8\x76 |0 + \xF8\x77 |0 + \xC5\xF0 |0 + \xF9\x64 |0 + \xF9\x7D |0 + \xC6\x75 |0 + \x9A\xB1 |0 + \xDC\xB0 |0 + \xEC\xB6 |0 + \xEF\xB0 |0 + \xF3\xF5 |0 + \xE0\xEF |0 + \x9A\xA1 |0 + \xEF\xB1 |0 + \xF1\xE2 |0 + \xF1\xE1 |0 + \x91\xB9 |0 + \xF8\x78 |0 + \xC6\x52 |0 + \x91\xBA |0 + \xF9\x65 |0 + \xF9\x7E |0 + \xB9\xA9 |0 + \xE8\xF2 |0 + \xE8\xF3 |0 + \xEC\xB7 |0 + \xB9\xAA |0 + \xC3\x5D |0 + \xF1\xE3 |0 + \x91\xBE |0 + \xF6\xCF |0 + \xC5\x67 |0 + \xF6\xD0 |0 + \xF6\xCE |0 + \xF8\x79 |0 + \xF8\xE9 |0 + \xB9\xAB |0 + \xEF\xB4 |0 + \xEF\xB3 |0 + \xEF\xB2 |0 + \xF1\xE4 |0 + \xA0\x41 |0 + \x8B\xB7 |0 + \xF1\xE8 |0 + \xF1\xE7 |0 + \xF1\xE6 |0 + \xF1\xE5 |0 + \xC3\x5E |0 + \xF3\xF6 |0 + \xF5\xB9 |0 + \xC4\xD3 |0 + \xF5\xB8 |0 + \xF6\xD1 |0 + \xF7\xCB |0 + \xF7\xCA |0 + \xC5\xC4 |0 + \xF7\xC9 |0 + \xF8\x7C |0 + \xF8\x7B |0 + \xF8\x7A |0 + \x91\xC0 |0 + \xBB\xF3 |0 + \xEC\xB8 |0 + \xC2\x4D |0 + \xF3\xF7 |0 + \xF3\xF8 |0 + \xF7\xCC |0 + \xF8\x7D |0 + \x9A\xB3 |0 + \x91\xC3 |0 + \xF8\xEA |0 + \xF9\x66 |0 + \xF9\xB9 |0 + \xF9\xD4 |0 + \xBB\xF4 |0 + \xC2\x4E |0 + \xF1\xE9 |0 + \xF3\xF9 |0 + \xF6\xD2 |0 + \xF8\x7E |0 + \xA0\xFC |0 + \xBE\xA6 |0 + \x9F\xEE |0 + \xEF\xB5 |0 + \xF1\xEA |0 + \xF3\xFA |0 + \xF3\xFB |0 + \xF3\xFC |0 + \xF5\xBE |0 + \x9F\x69 |0 + \xF5\xBA |0 + \xC5\x68 |0 + \xF5\xBD |0 + \xF5\xBC |0 + \xC4\xD4 |0 + \xF5\xBB |0 + \xC4\xD6 |0 + \x91\xC8 |0 + \xC4\xD5 |0 + \xF6\xD4 |0 + \xF6\xD3 |0 + \xC5\x69 |0 + \xC5\x6A |0 + \x91\xC9 |0 + \xC5\xC6 |0 + \xF7\xCD |0 + \xC5\xC5 |0 + \xF8\xA3 |0 + \xF8\xA4 |0 + \xF8\xA2 |0 + \xF8\xA1 |0 + \xC6\x54 |0 + \xF8\xEB |0 + \xF8\xEC |0 + \xF8\xED |0 + \xC6\x53 |0 + \xF9\x67 |0 + \xF9\x6A |0 + \xF9\x69 |0 + \xF9\x68 |0 + \xF9\xD3 |0 + \x8D\xE6 |0 + \xC0\x73 |0 + \x91\xCB |0 + \xC3\x65 |0 + \xF5\xBF |0 + \xF6\xD5 |0 + \xC5\xC7 |0 + \xF7\xCE |0 + \xF9\xD5 |0 + \x89\xC8 |0 + \x8B\xF8 |3 + \xC0\x74 |0 + \x8D\xAA |0 + \xEF\xB6 |0 + \xF7\xCF |0 + \xF9\xA1 |0 + \x9F\xDD |0 + \xFA\x40 |0 + \xFA\x42 |0 + \xFA\x43 |0 + \xFA\x49 |0 + \xFA\x4A |0 + \xFA\x4C |0 + \xFA\x4E |0 + \xFA\x52 |0 + \xFA\x53 |0 + \xFA\x54 |0 + \xFA\x55 |0 + \xFA\x56 |0 + \xFA\x58 |0 + \xFA\x5A |0 + \xFA\x5B |0 + \xFA\x5C |0 + \xFA\x5D |0 + \xFA\x5E |0 + \xFA\x60 |0 + \xFA\x62 |0 + \xFA\x63 |0 + \xFA\x65 |0 + \xFA\x6D |0 + \xFA\x6E |0 + \xFA\x70 |0 + \xFA\x72 |0 + \xFA\x73 |0 + \xFA\x74 |0 + \xFA\x75 |0 + \xFA\x76 |0 + \xFA\x77 |0 + \xFA\x78 |0 + \xFA\x7B |0 + \xFA\x7C |0 + \xFA\xA7 |0 + \xFA\xAE |0 + \xFA\xBC |0 + \xFA\xBE |0 + \xFA\xC1 |0 + \xFA\xC2 |0 + \xFA\xC3 |0 + \xFA\xC6 |0 + \xFA\xC8 |0 + \xFA\xCE |0 + \xFA\xD3 |0 + \xFA\xD6 |0 + \xFA\xD7 |0 + \xFA\xDA |0 + \xFA\xDF |0 + \xFA\xE9 |0 + \xFA\xEB |0 + \xFA\xEC |0 + \xFA\xEE |0 + \xFA\xF5 |0 + \xFA\xF6 |0 + \xFA\xFB |0 + \xFA\xFC |0 + \xFA\xFE |0 + \xFB\x40 |0 + \xFB\x41 |0 + \xFB\x49 |0 + \xFB\x4A |0 + \xFB\x4C |0 + \xFB\x4E |0 + \xFB\x51 |0 + \xFB\x5D |0 + \xFB\x5F |0 + \xFB\x61 |0 + \xFB\x66 |0 + \xFB\x68 |0 + \xFB\x6A |0 + \xFB\x6B |0 + \xFB\x6D |0 + \xFB\x73 |0 + \xFB\x77 |0 + \xFB\x78 |0 + \xFB\xA1 |0 + \xFB\xA4 |0 + \xFB\xA7 |0 + \xFB\xA8 |0 + \xFB\xA9 |0 + \xFB\xAA |0 + \xFB\xAC |0 + \xFB\xAD |0 + \xFB\xAE |0 + \xFB\xB0 |0 + \xFB\xB1 |0 + \xFB\xB3 |0 + \xFB\xB7 |0 + \xFB\xBD |0 + \xFB\xBE |0 + \xFB\xC0 |0 + \xFB\xC2 |0 + \xFB\xC8 |0 + \xFB\xCB |0 + \xFB\xCE |0 + \xFB\xCF |0 + \xFB\xD0 |0 + \xFB\xD5 |0 + \xFB\xD9 |0 + \xFB\xDA |0 + \xFB\xE1 |0 + \xFB\xE2 |0 + \xFB\xE6 |0 + \xFB\xEB |0 + \xFB\xEC |0 + \xFB\xED |0 + \xFB\xF5 |0 + \xFB\xF6 |0 + \xFB\xFB |0 + \xFB\xFE |0 + \xFC\x47 |0 + \xFC\x48 |0 + \xFC\x4B |0 + \xFC\x4D |0 + \xFC\x4E |0 + \xFC\x50 |0 + \xFC\x53 |0 + \xFC\x56 |0 + \xFC\x5A |0 + \xFC\x5B |0 + \xFC\x5C |0 + \xFC\x5D |0 + \xFC\x5F |0 + \xFC\x60 |0 + \xFC\x63 |0 + \xFC\x68 |0 + \xFC\x6E |0 + \xFC\x6F |0 + \xFC\x70 |0 + \xFC\x77 |0 + \xFC\x78 |0 + \xFC\x7B |0 + \xFC\x7E |0 + \xFC\xA1 |0 + \xFC\xA3 |0 + \xFC\xA4 |0 + \xFC\xA7 |0 + \xFC\xA8 |0 + \xFC\xAD |0 + \xFC\xAF |0 + \xFC\xB1 |0 + \xFC\xB3 |0 + \xFC\xB7 |0 + \xFC\xB8 |0 + \xFC\xBB |0 + \xFC\xBD |0 + \xFC\xBE |0 + \xFC\xC7 |0 + \xFC\xC8 |0 + \xFC\xCC |0 + \xFC\xCE |0 + \xFC\xD2 |0 + \xFC\xD6 |0 + \xFC\xD8 |0 + \xFC\xD9 |0 + \xFC\xDB |0 + \xFC\xDC |0 + \xFC\xDE |0 + \xFC\xE0 |0 + \xFC\xE3 |0 + \xFC\xE4 |0 + \xFC\xE5 |0 + \xFC\xE6 |0 + \xFC\xE7 |0 + \xFC\xE9 |0 + \xFC\xEC |0 + \xFC\xED |0 + \xFC\xF0 |0 + \xFC\xF4 |0 + \xFC\xF5 |0 + \xFC\xFC |0 + \xFC\xFD |0 + \xFD\x40 |0 + \xFD\x43 |0 + \xFD\x46 |0 + \xFD\x4B |0 + \xFD\x4F |0 + \xFD\x54 |0 + \xFD\x58 |0 + \xFD\x59 |0 + \xFD\x5B |0 + \xFD\x60 |0 + \xFD\x63 |0 + \xFD\x67 |0 + \xFD\x69 |0 + \xFD\x6A |0 + \xFD\x6B |0 + \xFD\x6E |0 + \xFD\x70 |0 + \xFD\x73 |0 + \xFD\x74 |0 + \xFD\x75 |0 + \xFD\x79 |0 + \xFD\x7B |0 + \xFD\x7C |0 + \xFD\x7D |0 + \xFD\x7E |0 + \xFD\xA1 |0 + \xFD\xA4 |0 + \xFD\xA6 |0 + \xFD\xA7 |0 + \xFD\xAA |0 + \xFD\xAB |0 + \xFD\xAC |0 + \xFD\xB1 |0 + \xFD\xB2 |0 + \xFD\xB3 |0 + \xFD\xB5 |0 + \xFD\xBA |0 + \xFD\xBC |0 + \xFD\xBE |0 + \xFD\xC2 |0 + \xFD\xC6 |0 + \xFD\xC8 |0 + \xFD\xC9 |0 + \xFD\xD0 |0 + \xFD\xD3 |0 + \xFD\xD5 |0 + \xFD\xD6 |0 + \xFD\xD7 |0 + \xFD\xD8 |0 + \xFD\xD9 |0 + \xFD\xDA |0 + \xFD\xDC |0 + \xFD\xDD |0 + \xFD\xDE |0 + \xFD\xDF |0 + \xFD\xEC |0 + \xFD\xF3 |0 + \xFD\xF6 |0 + \xFD\xF8 |0 + \xFD\xF9 |0 + \xFD\xFA |0 + \xFD\xFC |0 + \xFE\x46 |0 + \xFE\x49 |0 + \xFE\x4E |0 + \xFE\x54 |0 + \xFE\x55 |0 + \xFE\x57 |0 + \xFE\x5C |0 + \xFE\x5D |0 + \xFE\x60 |0 + \xFE\x61 |0 + \xFE\x62 |0 + \xFE\x65 |0 + \xFE\x66 |0 + \xFE\x67 |0 + \xFE\x6B |0 + \xFE\x6D |0 + \xFE\x70 |0 + \xFE\x72 |0 + \xFE\x7E |0 + \xFE\xA1 |0 + \xFE\xA2 |0 + \xFE\xA3 |0 + \xFE\xA5 |0 + \xFE\xA6 |0 + \xFE\xA8 |0 + \xFE\xAC |0 + \xFE\xAD |0 + \xFE\xAF |0 + \xFE\xB5 |0 + \xFE\xB7 |0 + \xFE\xC2 |0 + \xFE\xC6 |0 + \xFE\xC7 |0 + \xFE\xCC |0 + \xFE\xCE |0 + \xFE\xCF |0 + \xFE\xD0 |0 + \xFE\xD5 |0 + \xFE\xD7 |0 + \xFE\xD9 |0 + \xFE\xDA |0 + \xFE\xDB |0 + \xFE\xDE |0 + \xFE\xDF |0 + \xFE\xE6 |0 + \xFE\xEA |0 + \xFE\xED |0 + \xFE\xEE |0 + \xFE\xEF |0 + \xFE\xF4 |0 + \xFE\xF6 |0 + \xFE\xFA |0 + \xFE\xFD |0 + \x8E\x40 |0 + \x8E\x42 |0 + \x8E\x44 |0 + \x8E\x47 |0 + \x8E\x4A |0 + \x8E\x4B |0 + \x8E\x4E |0 + \x8E\x54 |0 + \x8E\x5B |0 + \x8E\x5F |0 + \x8E\x60 |0 + \x8E\x64 |0 + \x8E\x65 |0 + \x8E\x6A |0 + \x8E\x6C |0 + \x8E\x71 |0 + \x8E\x74 |0 + \x8E\x77 |0 + \x8E\xA3 |0 + \x8E\xA5 |0 + \x8E\xAC |0 + \x8E\xAD |0 + \x8E\xB1 |0 + \x8E\xB3 |0 + \x8E\xB5 |0 + \x8E\xB6 |0 + \x8E\xC0 |0 + \x8E\xC3 |0 + \x8E\xC5 |0 + \x8E\xC6 |0 + \x8E\xC8 |0 + \x8E\xCA |0 + \x8E\xCC |0 + \x8E\xD2 |0 + \x8E\xD3 |0 + \x8E\xD7 |0 + \x8E\xD9 |0 + \x8E\xDA |0 + \x8E\xDB |0 + \x8E\xDE |0 + \x8E\xE2 |0 + \x8E\xE4 |0 + \x8E\xE5 |0 + \x8E\xE7 |0 + \x8E\xE9 |0 + \x8E\xEB |0 + \x8E\xEC |0 + \x8E\xEF |0 + \x8E\xF0 |0 + \x8E\xF1 |0 + \x8E\xF3 |0 + \x8E\xF6 |0 + \x8E\xF7 |0 + \x8E\xF8 |0 + \x8E\xF9 |0 + \x8E\xFA |0 + \x8E\xFD |0 + \x8F\x43 |0 + \x8F\x44 |0 + \x8F\x46 |0 + \x8F\x47 |0 + \x8F\x4B |0 + \x8F\x4C |0 + \x8F\x4D |0 + \x8F\x4E |0 + \x8F\x4F |0 + \x8F\x55 |0 + \x8F\x5A |0 + \x8F\x5E |0 + \x8F\x5F |0 + \x8F\x61 |0 + \x8F\x67 |0 + \x8F\x6A |0 + \x8F\x6B |0 + \x8F\x6C |0 + \x8F\x73 |0 + \x8F\x75 |0 + \x8F\x79 |0 + \x8F\xA1 |0 + \x8F\xA2 |0 + \x8F\xA4 |0 + \x8F\xA6 |0 + \x8F\xA7 |0 + \x8F\xA8 |0 + \x8F\xAC |0 + \x8F\xAE |0 + \x8F\xB1 |0 + \x8F\xB3 |0 + \x8F\xBD |0 + \x8F\xBE |0 + \x8F\xBF |0 + \x8F\xC8 |0 + \x8F\xCF |0 + \x8F\xD1 |0 + \x8F\xD2 |0 + \x8F\xD7 |0 + \x8F\xD9 |0 + \x8F\xDA |0 + \x8F\xDC |0 + \x8F\xE0 |0 + \x8F\xE1 |0 + \x8F\xE6 |0 + \x8F\xEA |0 + \x8F\xEE |0 + \x8F\xEF |0 + \x8F\xF0 |0 + \x8F\xF2 |0 + \x8F\xF4 |0 + \x8F\xF5 |0 + \x8F\xF8 |0 + \x8F\xFC |0 + \x90\x41 |0 + \x90\x42 |0 + \x90\x43 |0 + \x90\x45 |0 + \x90\x46 |0 + \x90\x4E |0 + \x90\x4F |0 + \x90\x52 |0 + \x90\x53 |0 + \x90\x56 |0 + \x90\x57 |0 + \x90\x58 |0 + \x90\x5A |0 + \x90\x5C |0 + \x90\x5D |0 + \x90\x5E |0 + \x90\x5F |0 + \x90\x61 |0 + \x90\x63 |0 + \x90\x64 |0 + \x90\x66 |0 + \x90\x67 |0 + \x90\x69 |0 + \x90\x6B |0 + \x90\x73 |0 + \x90\x74 |0 + \x90\x79 |0 + \x90\x7B |0 + \x90\x7C |0 + \x90\x7D |0 + \x90\x7E |0 + \x90\xA1 |0 + \x90\xA4 |0 + \x90\xA5 |0 + \x90\xA8 |0 + \x90\xA9 |0 + \x90\xAC |0 + \x90\xAD |0 + \x90\xAE |0 + \x90\xB8 |0 + \x90\xB9 |0 + \x90\xBA |0 + \x90\xBB |0 + \x90\xC2 |0 + \x90\xC6 |0 + \x90\xCA |0 + \x90\xCB |0 + \x90\xCC |0 + \x90\xCD |0 + \x90\xCE |0 + \x90\xCF |0 + \x90\xD0 |0 + \x90\xD1 |0 + \x90\xD8 |0 + \x90\xDD |0 + \x90\xE0 |0 + \x90\xE4 |0 + \x90\xE5 |0 + \x90\xED |0 + \x90\xF0 |0 + \x90\xF3 |0 + \x90\xF4 |0 + \x90\xFB |0 + \x90\xFD |0 + \x90\xFE |0 + \x91\x40 |0 + \x91\x46 |0 + \x91\x47 |0 + \x91\x4E |0 + \x91\x50 |0 + \x91\x51 |0 + \x91\x57 |0 + \x91\x59 |0 + \x91\x5A |0 + \x91\x5D |0 + \x91\x62 |0 + \x91\x65 |0 + \x91\x67 |0 + \x91\x6A |0 + \x91\x6C |0 + \x91\x6E |0 + \x91\x72 |0 + \x91\x74 |0 + \x91\x75 |0 + \x91\x76 |0 + \x91\x77 |0 + \x91\x78 |0 + \x91\x79 |0 + \x91\x7C |0 + \x91\xA2 |0 + \x91\xA3 |0 + \x91\xA4 |0 + \x91\xA5 |0 + \x91\xA6 |0 + \x91\xA8 |0 + \x91\xA9 |0 + \x91\xB1 |0 + \x91\xB8 |0 + \x91\xBD |0 + \x91\xC5 |0 + \x91\xCE |0 + \x91\xCF |0 + \x91\xD1 |0 + \x91\xD2 |0 + \x91\xD3 |0 + \x91\xD5 |0 + \x91\xD6 |0 + \x91\xD8 |0 + \x91\xD9 |0 + \x91\xDC |0 + \x91\xE0 |0 + \x91\xE1 |0 + \x91\xE7 |0 + \x91\xE8 |0 + \x91\xEA |0 + \x91\xEC |0 + \x91\xED |0 + \x91\xEF |0 + \x91\xF0 |0 + \x91\xF1 |0 + \x91\xF3 |0 + \x91\xF4 |0 + \x91\xF6 |0 + \x91\xF7 |0 + \x91\xF8 |0 + \x91\xFA |0 + \x91\xFC |0 + \x91\xFD |0 + \x91\xFE |0 + \x92\x40 |0 + \x92\x41 |0 + \x92\x43 |0 + \x92\x46 |0 + \x92\x47 |0 + \x92\x48 |0 + \x92\x49 |0 + \x92\x4A |0 + \x92\x4B |0 + \x92\x4D |0 + \x92\x4E |0 + \x92\x4F |0 + \x92\x55 |0 + \x92\x58 |0 + \x92\x59 |0 + \x92\x5A |0 + \x92\x5B |0 + \x92\x5C |0 + \x92\x5F |0 + \x92\x61 |0 + \x92\x62 |0 + \x92\x63 |0 + \x92\x65 |0 + \x92\x6A |0 + \x92\x6C |0 + \x92\x6D |0 + \x92\x70 |0 + \x92\x72 |0 + \x92\x73 |0 + \x92\x75 |0 + \x92\x76 |0 + \x92\x79 |0 + \x92\x7A |0 + \x92\x7B |0 + \x92\x7D |0 + \x92\xA5 |0 + \x92\xA6 |0 + \x92\xB4 |0 + \x92\xB5 |0 + \x92\xB6 |0 + \x92\xB8 |0 + \x92\xB9 |0 + \x92\xBC |0 + \x92\xBE |0 + \x92\xBF |0 + \x92\xC0 |0 + \x92\xC2 |0 + \x92\xC3 |0 + \x92\xC6 |0 + \x92\xCB |0 + \x92\xCC |0 + \x92\xCD |0 + \x92\xCE |0 + \x92\xD0 |0 + \x92\xD8 |0 + \x92\xD9 |0 + \x92\xDD |0 + \x92\xDF |0 + \x92\xE1 |0 + \x92\xEC |0 + \x92\xED |0 + \x92\xEE |0 + \x92\xEF |0 + \x92\xF6 |0 + \x92\xF7 |0 + \x92\xF8 |0 + \x92\xF9 |0 + \x92\xFE |0 + \x93\x41 |0 + \x93\x42 |0 + \x93\x45 |0 + \x93\x49 |0 + \x93\x50 |0 + \x93\x51 |0 + \x93\x52 |0 + \x93\x55 |0 + \x93\x56 |0 + \x93\x58 |0 + \x93\x5A |0 + \x93\x5D |0 + \x93\x5E |0 + \x93\x5F |0 + \x93\x60 |0 + \x93\x63 |0 + \x93\x64 |0 + \x93\x66 |0 + \x93\x69 |0 + \x93\x6C |0 + \x93\x6D |0 + \x93\x70 |0 + \x93\x71 |0 + \x93\x72 |0 + \x93\x73 |0 + \x93\x75 |0 + \x93\x76 |0 + \x93\x77 |0 + \x93\x7B |0 + \x93\x7C |0 + \x93\x7D |0 + \x93\x7E |0 + \x93\xA2 |0 + \x93\xA3 |0 + \x93\xA5 |0 + \x93\xA6 |0 + \x93\xA7 |0 + \x93\xA8 |0 + \x93\xAA |0 + \x93\xAE |0 + \x93\xAF |0 + \x93\xB1 |0 + \x93\xB6 |0 + \x93\xB7 |0 + \x93\xB8 |0 + \x93\xB9 |0 + \x93\xBB |0 + \x93\xBC |0 + \x93\xBD |0 + \x93\xBF |0 + \x93\xC0 |0 + \x93\xC3 |0 + \x93\xC4 |0 + \x93\xC5 |0 + \x93\xC6 |0 + \x93\xC7 |0 + \x93\xC8 |0 + \x93\xCA |0 + \x93\xCB |0 + \x93\xCC |0 + \x93\xCE |0 + \x93\xCF |0 + \x93\xD0 |0 + \x93\xD2 |0 + \x93\xD6 |0 + \x93\xD7 |0 + \x93\xD9 |0 + \x93\xDA |0 + \x93\xDC |0 + \x93\xDE |0 + \x93\xDF |0 + \x93\xE1 |0 + \x93\xE2 |0 + \x93\xE6 |0 + \x93\xEC |0 + \x93\xED |0 + \x93\xF2 |0 + \x93\xF9 |0 + \x93\xFA |0 + \x93\xFD |0 + \x93\xFE |0 + \x94\x41 |0 + \x94\x42 |0 + \x94\x46 |0 + \x94\x48 |0 + \x94\x4B |0 + \x94\x52 |0 + \x94\x53 |0 + \x94\x58 |0 + \x94\x59 |0 + \x94\x5B |0 + \x94\x5C |0 + \x94\x5E |0 + \x94\x5F |0 + \x94\x60 |0 + \x94\x61 |0 + \x94\x62 |0 + \x94\x65 |0 + \x94\x66 |0 + \x94\x67 |0 + \x94\x6F |0 + \x94\x73 |0 + \x94\x74 |0 + \x94\x78 |0 + \x94\x7B |0 + \x94\x7C |0 + \x94\x7D |0 + \x94\xA2 |0 + \x94\xA4 |0 + \x94\xA5 |0 + \x94\xA9 |0 + \x94\xAA |0 + \x94\xAC |0 + \x94\xAD |0 + \x94\xAF |0 + \x94\xB3 |0 + \x94\xB4 |0 + \x94\xB6 |0 + \x94\xBA |0 + \x94\xBB |0 + \x94\xBD |0 + \x94\xBE |0 + \x94\xC0 |0 + \x94\xC7 |0 + \x94\xC8 |0 + \x94\xCE |0 + \x94\xD2 |0 + \x94\xD6 |0 + \x94\xD7 |0 + \x94\xD8 |0 + \x94\xD9 |0 + \x94\xDA |0 + \x94\xDF |0 + \x94\xE0 |0 + \x94\xE3 |0 + \x94\xE4 |0 + \x94\xE5 |0 + \x94\xE7 |0 + \x94\xEA |0 + \x94\xF0 |0 + \x94\xF1 |0 + \x94\xF2 |0 + \x94\xF4 |0 + \x94\xF5 |0 + \x94\xFE |0 + \x95\x40 |0 + \x95\x41 |0 + \x95\x43 |0 + \x95\x45 |0 + \x95\x46 |0 + \x95\x48 |0 + \x95\x49 |0 + \x95\x4B |0 + \x95\x4C |0 + \x95\x4D |0 + \x95\x50 |0 + \x95\x51 |0 + \x95\x52 |0 + \x95\x54 |0 + \x95\x59 |0 + \x95\x5B |0 + \x95\x5C |0 + \x95\x5E |0 + \x95\x60 |0 + \x95\x61 |0 + \x95\x68 |0 + \x95\x6A |0 + \x95\x6D |0 + \x95\x6F |0 + \x95\x71 |0 + \x95\x74 |0 + \x95\x76 |0 + \x95\x78 |0 + \x95\x7A |0 + \x95\x7B |0 + \x95\x7D |0 + \x95\xA8 |0 + \x95\xAA |0 + \x95\xAB |0 + \x95\xAC |0 + \x95\xAD |0 + \x95\xAE |0 + \x95\xAF |0 + \x95\xB7 |0 + \x95\xBA |0 + \x95\xBE |0 + \x95\xC2 |0 + \x95\xCA |0 + \x95\xD0 |0 + \x95\xD4 |0 + \x95\xD7 |0 + \x95\xDE |0 + \x95\xE0 |0 + \x95\xE2 |0 + \x95\xE3 |0 + \x95\xEA |0 + \x95\xED |0 + \x95\xEE |0 + \x95\xEF |0 + \x95\xF1 |0 + \x95\xF3 |0 + \x95\xF4 |0 + \x95\xF5 |0 + \x95\xF7 |0 + \x95\xF8 |0 + \x95\xF9 |0 + \x95\xFE |0 + \x96\x42 |0 + \x96\x43 |0 + \x96\x46 |0 + \x96\x47 |0 + \x96\x48 |0 + \x96\x49 |0 + \x96\x4F |0 + \x96\x53 |0 + \x96\x55 |0 + \x96\x56 |0 + \x96\x58 |0 + \x96\x5A |0 + \x96\x5D |0 + \x96\x5E |0 + \x96\x5F |0 + \x96\x61 |0 + \x96\x68 |0 + \x96\x6E |0 + \x96\x6F |0 + \x96\x74 |0 + \x96\x76 |0 + \x96\x7C |0 + \x96\x7E |0 + \x96\xA1 |0 + \x96\xA3 |0 + \x96\xA4 |0 + \x96\xAA |0 + \x96\xAB |0 + \x96\xB4 |0 + \x96\xB6 |0 + \x96\xB7 |0 + \x96\xBA |0 + \x96\xBE |0 + \x96\xBF |0 + \x96\xC0 |0 + \x96\xC1 |0 + \x96\xC4 |0 + \x96\xC5 |0 + \x96\xC6 |0 + \x96\xC9 |0 + \x96\xCA |0 + \x96\xCB |0 + \x96\xCE |0 + \x96\xCF |0 + \x96\xD0 |0 + \x96\xD2 |0 + \x96\xD3 |0 + \x96\xD5 |0 + \x96\xDA |0 + \x96\xE1 |0 + \x96\xE6 |0 + \x96\xE7 |0 + \x96\xE8 |0 + \x96\xF0 |0 + \x96\xF8 |0 + \x96\xFA |0 + \x96\xFB |0 + \x96\xFD |0 + \x96\xFE |0 + \x97\x44 |0 + \x97\x47 |0 + \x97\x4A |0 + \x97\x4B |0 + \x97\x4D |0 + \x97\x4E |0 + \x97\x4F |0 + \x97\x50 |0 + \x97\x51 |0 + \x97\x53 |0 + \x97\x54 |0 + \x97\x56 |0 + \x97\x57 |0 + \x97\x58 |0 + \x97\x59 |0 + \x97\x5A |0 + \x97\x5F |0 + \x97\x60 |0 + \x97\x62 |0 + \x97\x67 |0 + \x97\x68 |0 + \x97\x69 |0 + \x97\x6A |0 + \x97\x6B |0 + \x97\x6C |0 + \x97\x6D |0 + \x97\x6F |0 + \x97\x71 |0 + \x97\x75 |0 + \x97\x77 |0 + \x97\x78 |0 + \x97\x7A |0 + \x97\x7B |0 + \x97\x7D |0 + \x97\xA1 |0 + \x97\xA2 |0 + \x97\xA4 |0 + \x97\xA5 |0 + \x97\xA6 |0 + \x97\xA9 |0 + \x97\xAB |0 + \x97\xAC |0 + \x97\xAD |0 + \x97\xB1 |0 + \x97\xB2 |0 + \x97\xB4 |0 + \x97\xB5 |0 + \x97\xB6 |0 + \x97\xB9 |0 + \x97\xBD |0 + \x97\xBE |0 + \x97\xC1 |0 + \x97\xC7 |0 + \x97\xCA |0 + \x97\xCC |0 + \x97\xCF |0 + \x97\xD3 |0 + \x97\xD4 |0 + \x97\xD8 |0 + \x97\xE3 |0 + \x97\xE4 |0 + \x97\xE8 |0 + \x97\xEA |0 + \x97\xEB |0 + \x97\xEC |0 + \x97\xED |0 + \x97\xEE |0 + \x97\xF1 |0 + \x97\xF2 |0 + \x97\xF3 |0 + \x97\xF4 |0 + \x97\xF5 |0 + \x97\xF6 |0 + \x97\xF7 |0 + \x97\xF8 |0 + \x97\xFA |0 + \x97\xFB |0 + \x98\x40 |0 + \x98\x41 |0 + \x98\x42 |0 + \x98\x43 |0 + \x98\x45 |0 + \x98\x47 |0 + \x98\x49 |0 + \x98\x4A |0 + \x98\x4B |0 + \x98\x4E |0 + \x98\x51 |0 + \x98\x52 |0 + \x98\x55 |0 + \x98\x5A |0 + \x98\x5D |0 + \x98\x5F |0 + \x98\x60 |0 + \x98\x61 |0 + \x98\x62 |0 + \x98\x64 |0 + \x98\x65 |0 + \x98\x67 |0 + \x98\x69 |0 + \x98\x6A |0 + \x98\x6B |0 + \x98\x6D |0 + \x98\x6E |0 + \x98\x71 |0 + \x98\x74 |0 + \x98\x75 |0 + \x98\x7B |0 + \x98\x7C |0 + \x98\xA2 |0 + \x98\xA3 |0 + \x98\xA4 |0 + \x98\xA6 |0 + \x98\xA7 |0 + \x98\xA9 |0 + \x98\xAA |0 + \x98\xAC |0 + \x98\xB0 |0 + \x98\xB1 |0 + \x98\xB6 |0 + \x98\xB9 |0 + \x98\xBD |0 + \x98\xC0 |0 + \x98\xDF |0 + \x98\xFA |0 + \x99\x5F |0 + \x99\xD5 |0 + \x9A\x7C |0 + \x9A\xB4 |0 + \x9A\xB5 |0 + \x9A\xB6 |0 + \x9A\xBA |0 + \x9A\xBE |0 + \x9A\xBF |0 + \x9A\xC0 |0 + \x9A\xC1 |0 + \x9A\xC4 |0 + \x9A\xC5 |0 + \x9A\xC6 |0 + \x9A\xC8 |0 + \x9A\xC9 |0 + \x9A\xCB |0 + \x9A\xCC |0 + \x9A\xCD |0 + \x9A\xCE |0 + \x9A\xCF |0 + \x9A\xD1 |0 + \x9A\xD3 |0 + \x9A\xD4 |0 + \x9A\xD5 |0 + \x9A\xD6 |0 + \x9A\xD7 |0 + \x9A\xD8 |0 + \x9A\xDC |0 + \x9A\xDD |0 + \x9A\xDE |0 + \x9A\xDF |0 + \x9A\xE0 |0 + \x9A\xE1 |0 + \x9A\xE3 |0 + \x9A\xE5 |0 + \x9A\xE6 |0 + \x9A\xE7 |0 + \x9A\xE9 |0 + \x9A\xEA |0 + \x9A\xEB |0 + \x9A\xED |0 + \x9A\xEE |0 + \x9A\xEF |0 + \x9A\xF0 |0 + \x9A\xF3 |0 + \x9A\xF4 |0 + \x9A\xF5 |0 + \x9A\xF7 |0 + \x9A\xF8 |0 + \x9A\xF9 |0 + \x9A\xFA |0 + \x9A\xFD |0 + \x9A\xFE |0 + \x9B\x40 |0 + \x9B\x41 |0 + \x9B\x42 |0 + \x9B\x43 |0 + \x9B\x44 |0 + \x9B\x45 |0 + \x9B\x47 |0 + \x9B\x48 |0 + \x9B\x4B |0 + \x9B\x4E |0 + \x9B\x4F |0 + \x9B\x50 |0 + \x9B\x51 |0 + \x9B\x52 |0 + \x9B\x53 |0 + \x9B\x55 |0 + \x9B\x56 |0 + \x9B\x57 |0 + \x9B\x59 |0 + \x9B\x5B |0 + \x9B\x5D |0 + \x9B\x60 |0 + \x9B\x62 |0 + \x9B\x63 |0 + \x9B\x64 |0 + \x9B\x65 |0 + \x9B\x66 |0 + \x9B\x67 |0 + \x9B\x68 |0 + \x9B\x69 |0 + \x9B\x6A |0 + \x9B\x6B |0 + \x9B\x6C |0 + \x9B\x6D |0 + \x9B\x6E |0 + \x9B\x6F |0 + \x9B\x73 |0 + \x9B\x74 |0 + \x9B\x75 |0 + \x9B\x77 |0 + \x9B\x79 |0 + \x9B\x7A |0 + \x9B\x7C |0 + \x9B\xA2 |0 + \x9B\xA3 |0 + \x9B\xA4 |0 + \x9B\xA5 |0 + \x9B\xA6 |0 + \x9B\xA7 |0 + \x9B\xA8 |0 + \x9B\xAB |0 + \x9B\xAC |0 + \x9B\xAD |0 + \x9B\xAE |0 + \x9B\xAF |0 + \x9B\xB0 |0 + \x9B\xB1 |0 + \x9B\xB2 |0 + \x9B\xB3 |0 + \x9B\xB5 |0 + \x9B\xB7 |0 + \x9B\xB9 |0 + \x9B\xBA |0 + \x9B\xBB |0 + \x9B\xBD |0 + \x9B\xBF |0 + \x9B\xC0 |0 + \x9B\xC1 |0 + \x9B\xC3 |0 + \x9B\xC5 |0 + \x9B\xC7 |0 + \x9B\xC8 |0 + \x9B\xC9 |0 + \x9B\xCB |0 + \x9B\xCC |0 + \x9B\xCE |0 + \x9B\xCF |0 + \x9B\xD0 |0 + \x9B\xD2 |0 + \x9B\xD6 |0 + \x9B\xD7 |0 + \x9B\xD8 |0 + \x9B\xD9 |0 + \x9B\xDB |0 + \x9B\xDC |0 + \x9B\xDD |0 + \x9B\xE0 |0 + \x9B\xE1 |0 + \x9B\xE2 |0 + \x9B\xE4 |0 + \x9B\xE5 |0 + \x9B\xE6 |0 + \x9B\xE7 |0 + \x9B\xE8 |0 + \x9B\xEB |0 + \x9B\xED |0 + \x9B\xEF |0 + \x9B\xF0 |0 + \x9B\xF1 |0 + \x9B\xF2 |0 + \x9B\xF3 |0 + \x9B\xF7 |0 + \x9B\xF8 |0 + \x9B\xFA |0 + \x9B\xFB |0 + \x9B\xFD |0 + \x9B\xFE |0 + \x9C\x41 |0 + \x9C\x43 |0 + \x9C\x44 |0 + \x9C\x46 |0 + \x9C\x47 |0 + \x9C\x48 |0 + \x9C\x49 |0 + \x9C\x4B |0 + \x9C\x4C |0 + \x9C\x4D |0 + \x9C\x4F |0 + \x9C\x52 |0 + \x9C\x55 |0 + \x9C\x56 |0 + \x9C\x58 |0 + \x9C\x5B |0 + \x9C\x5E |0 + \x9C\x5F |0 + \x9C\x60 |0 + \x9C\x61 |0 + \x9C\x63 |0 + \x9C\x65 |0 + \x9C\x66 |0 + \x9C\x67 |0 + \x9C\x69 |0 + \x9C\x6C |0 + \x9C\x6E |0 + \x9C\x70 |0 + \x9C\x71 |0 + \x9C\x73 |0 + \x9C\x74 |0 + \x9C\x76 |0 + \x9C\x78 |0 + \x9C\x7A |0 + \x9C\x7D |0 + \x9C\xA2 |0 + \x9C\xA3 |0 + \x9C\xA4 |0 + \x9C\xA6 |0 + \x9C\xA7 |0 + \x9C\xA9 |0 + \x9C\xAA |0 + \x9C\xAC |0 + \x9C\xAD |0 + \x9C\xB0 |0 + \x9C\xB1 |0 + \x9C\xB4 |0 + \x9C\xB5 |0 + \x9C\xB6 |0 + \x9C\xB8 |0 + \x9C\xB9 |0 + \x9C\xC0 |0 + \x9C\xC1 |0 + \x9C\xC3 |0 + \x9C\xC4 |0 + \x9C\xC7 |0 + \x9C\xC9 |0 + \x9C\xCA |0 + \x9C\xCB |0 + \x9C\xCE |0 + \x9C\xCF |0 + \x9C\xD2 |0 + \x9C\xD3 |0 + \x9C\xD4 |0 + \x9C\xD5 |0 + \x9C\xD6 |0 + \x9C\xD7 |0 + \x9C\xD8 |0 + \x9C\xDB |0 + \x9C\xDD |0 + \x9C\xDF |0 + \x9C\xE1 |0 + \x9C\xE5 |0 + \x9C\xE6 |0 + \x9C\xE7 |0 + \x9C\xE8 |0 + \x9C\xE9 |0 + \x9C\xEA |0 + \x9C\xEC |0 + \x9C\xED |0 + \x9C\xF0 |0 + \x9C\xF2 |0 + \x9C\xF6 |0 + \x9C\xF7 |0 + \x9C\xFA |0 + \x9C\xFB |0 + \x9C\xFC |0 + \x9C\xFD |0 + \x9C\xFE |0 + \x9D\x40 |0 + \x9D\x41 |0 + \x9D\x42 |0 + \x9D\x43 |0 + \x9D\x44 |0 + \x9D\x45 |0 + \x9D\x47 |0 + \x9D\x48 |0 + \x9D\x4B |0 + \x9D\x4E |0 + \x9D\x50 |0 + \x9D\x52 |0 + \x9D\x53 |0 + \x9D\x54 |0 + \x9D\x56 |0 + \x9D\x58 |0 + \x9D\x59 |0 + \x9D\x5B |0 + \x9D\x5C |0 + \x9D\x5E |0 + \x9D\x5F |0 + \x9D\x63 |0 + \x9D\x64 |0 + \x9D\x65 |0 + \x9D\x66 |0 + \x9D\x67 |0 + \x9D\x68 |0 + \x9D\x69 |0 + \x9D\x6A |0 + \x9D\x6B |0 + \x9D\x6C |0 + \x9D\x6D |0 + \x9D\x6E |0 + \x9D\x6F |0 + \x9D\x71 |0 + \x9D\x72 |0 + \x9D\x75 |0 + \x9D\x77 |0 + \x9D\x7A |0 + \x9D\x7C |0 + \x9D\xA2 |0 + \x9D\xA4 |0 + \x9D\xAB |0 + \x9D\xAC |0 + \x9D\xAF |0 + \x9D\xB0 |0 + \x9D\xB1 |0 + \x9D\xB2 |0 + \x9D\xB3 |0 + \x9D\xB4 |0 + \x9D\xB6 |0 + \x9D\xB7 |0 + \x9D\xB8 |0 + \x9D\xB9 |0 + \x9D\xBB |0 + \x9D\xBC |0 + \x9D\xBE |0 + \x9D\xC1 |0 + \x9D\xC2 |0 + \x9D\xC5 |0 + \x9D\xC6 |0 + \x9D\xC9 |0 + \x9D\xCB |0 + \x9D\xCD |0 + \x9D\xD2 |0 + \x9D\xD4 |0 + \x9D\xD7 |0 + \x9D\xD8 |0 + \x9D\xD9 |0 + \x9D\xED |0 + \x9D\xF2 |0 + \x9D\xF9 |0 + \x9D\xFA |0 + \x9D\xFC |0 + \x9D\xFD |0 + \x9D\xFE |0 + \x9E\x40 |0 + \x9E\x44 |0 + \x9E\x4F |0 + \x9E\x51 |0 + \x9E\x54 |0 + \x9E\x5B |0 + \x9E\x63 |0 + \x9E\x66 |0 + \x9E\x69 |0 + \x9E\x6B |0 + \x9E\x6C |0 + \x9E\x6D |0 + \x9E\x6E |0 + \x9E\x6F |0 + \x9E\x70 |0 + \x9E\x72 |0 + \x9E\x74 |0 + \x9E\x75 |0 + \x9E\x76 |0 + \x9E\x77 |0 + \x9E\x79 |0 + \x9E\x7B |0 + \x9E\x7C |0 + \x9E\x7D |0 + \x9E\xA3 |0 + \x9E\xA5 |0 + \x9E\xA6 |0 + \x9E\xA7 |0 + \x9E\xA8 |0 + \x9E\xAA |0 + \x9E\xAB |0 + \x9E\xAD |0 + \x9E\xAE |0 + \x9E\xBC |0 + \x9E\xBE |0 + \x9E\xC2 |0 + \x9E\xC3 |0 + \x9E\xC6 |0 + \x9E\xC8 |0 + \x9E\xCB |0 + \x9E\xCC |0 + \x9E\xCE |0 + \x9E\xCF |0 + \x9E\xD0 |0 + \x9E\xD2 |0 + \x9E\xD3 |0 + \x9E\xD4 |0 + \x9E\xD5 |0 + \x9E\xD8 |0 + \x9E\xD9 |0 + \x9E\xE0 |0 + \x9E\xE3 |0 + \x9E\xEC |0 + \x9E\xF2 |0 + \x9E\xF3 |0 + \x9E\xF6 |0 + \x9E\xF8 |0 + \x9E\xF9 |0 + \x9E\xFB |0 + \x9F\x43 |0 + \x9F\x46 |0 + \x9F\x47 |0 + \x9F\x48 |0 + \x9F\x4A |0 + \x9F\x4B |0 + \x9F\x4C |0 + \x9F\x4D |0 + \x9F\x50 |0 + \x9F\x53 |0 + \x9F\x68 |0 + \x9F\xAA |0 + \x9F\xB3 |0 + \x9F\xB5 |0 + \x9F\xBB |0 + \x9F\xBE |0 + \x9F\xBF |0 + \x9F\xC1 |0 + \x9F\xC5 |0 + \x9F\xD1 |0 + \x9F\xEC |0 + \x9F\xF5 |0 + \x9F\xF9 |0 + \xA0\x40 |0 + \xA0\x45 |0 + \xA0\x47 |0 + \xA0\x4F |0 + \xA0\x55 |0 + \xA0\x56 |0 + \xA0\x59 |0 + \xA0\x6D |0 + \xA0\x7B |0 + \xA0\xA2 |0 + \xA0\xA4 |0 + \xA0\xA7 |0 + \xA0\xAB |0 + \xA0\xB1 |0 + \xA0\xBD |0 + \xA0\xC3 |0 + \xA0\xC5 |0 + \xA0\xD8 |0 + \xA0\xE3 |0 + \xA0\xE8 |0 + \xA0\xE9 |0 + \xA0\xEA |0 + \xA0\xEB |0 + \xA0\xEC |0 + \xA0\xED |0 + \xA0\xEE |0 + \xA0\xEF |0 + \xA0\xF0 |0 + \xA0\xF1 |0 + \xA0\xF3 |0 + \xA0\xF4 |0 + \xA0\xF5 |0 + \xA0\xF6 |0 + \xA0\xF7 |0 + \xA0\xF8 |0 + \xA0\xFB |0 + \xA0\xFE |0 + \x88\x40 |0 + \x88\x41 |0 + \x88\x42 |0 + \x88\x43 |0 + \x88\x44 |0 + \x88\x45 |0 + \x88\x46 |0 + \x88\x47 |0 + \x88\x48 |0 + \x88\x49 |0 + \x88\x4A |0 + \x88\x4B |0 + \x88\x4C |0 + \x88\x4D |0 + \x88\x4E |0 + \x88\x4F |0 + \x88\x50 |0 + \x88\x51 |0 + \x88\x52 |0 + \x88\x53 |0 + \x88\x54 |0 + \x88\x55 |0 + \x88\x62 |0 + \x88\x64 |0 + \x88\xA3 |0 + \x88\xA5 |0 + \x88\xA9 |0 + \x88\xAA |0 + \x89\x40 |0 + \x89\x41 |0 + \x89\x4C |0 + \x89\xB2 |0 + \x89\xBB |0 + \x89\xBC |0 + \x89\xBE |0 + \x89\xCA |0 + \x89\xCB |0 + \x89\xCC |0 + \x89\xCD |0 + \x8A\x40 |0 + \x8A\x43 |0 + \x8A\x44 |0 + \x8A\x45 |0 + \x8A\x47 |0 + \x8A\x49 |0 + \x8A\x4B |0 + \x8A\x4C |0 + \x8A\x4E |0 + \x8A\x50 |0 + \x8A\x53 |0 + \x8A\x54 |0 + \x8A\x55 |0 + \x8A\x57 |0 + \x8A\x58 |0 + \x8A\x59 |0 + \x8A\x5A |0 + \x8A\x5D |0 + \x8A\x5E |0 + \x8A\x5F |0 + \x8A\x60 |0 + \x8A\x61 |0 + \x8A\x62 |0 + \x8A\x64 |0 + \x8A\x65 |0 + \x8A\x66 |0 + \x8A\x68 |0 + \x8A\x69 |0 + \x8A\x6C |0 + \x8A\x6F |0 + \x8A\x70 |0 + \x8A\x71 |0 + \x8A\x72 |0 + \x8A\x77 |0 + \x8A\x7A |0 + \x8A\x7B |0 + \x8A\x7C |0 + \x8A\x7E |0 + \x8A\xA1 |0 + \x8A\xA2 |0 + \x8A\xA3 |0 + \x8A\xA5 |0 + \x8A\xA6 |0 + \x8A\xA8 |0 + \x8A\xA9 |0 + \x8A\xAA |0 + \x8A\xAD |0 + \x8A\xB0 |0 + \x8A\xB2 |0 + \x8A\xB3 |0 + \x8A\xB4 |0 + \x8A\xB5 |0 + \x8A\xB6 |0 + \x8A\xBC |0 + \x8A\xBD |0 + \x8A\xC0 |0 + \x8A\xC3 |0 + \x8A\xC9 |0 + \x8A\xCA |0 + \x8A\xCB |0 + \x8A\xCC |0 + \x8A\xCE |0 + \x8A\xCF |0 + \x8A\xD2 |0 + \x8A\xD4 |0 + \x8A\xD5 |0 + \x8A\xD7 |0 + \x8A\xD8 |0 + \x8A\xD9 |0 + \x8A\xDC |0 + \x8A\xDF |0 + \x8A\xE0 |0 + \x8A\xE1 |0 + \x8A\xE2 |0 + \x8A\xE3 |0 + \x8A\xE4 |0 + \x8A\xE5 |0 + \x8A\xE6 |0 + \x8A\xE8 |0 + \x8A\xE9 |0 + \x8A\xEA |0 + \x8A\xEC |0 + \x8A\xED |0 + \x8A\xEE |0 + \x8A\xEF |0 + \x8A\xF1 |0 + \x8A\xF2 |0 + \x8A\xF3 |0 + \x8A\xF4 |0 + \x8A\xF6 |0 + \x8A\xF7 |0 + \x8A\xF8 |0 + \x8A\xF9 |0 + \x8A\xFA |0 + \x8A\xFC |0 + \x8A\xFE |0 + \x8B\x40 |0 + \x8B\x41 |0 + \x8B\x42 |0 + \x8B\x43 |0 + \x8B\x44 |0 + \x8B\x45 |0 + \x8B\x46 |0 + \x8B\x48 |0 + \x8B\x49 |0 + \x8B\x4A |0 + \x8B\x4B |0 + \x8B\x4C |0 + \x8B\x4D |0 + \x8B\x4E |0 + \x8B\x4F |0 + \x8B\x55 |0 + \x8B\x58 |0 + \x8B\x59 |0 + \x8B\x5E |0 + \x8B\x62 |0 + \x8B\x64 |0 + \x8B\x65 |0 + \x8B\x66 |0 + \x8B\x67 |0 + \x8B\x69 |0 + \x8B\x6B |0 + \x8B\x6D |0 + \x8B\x6E |0 + \x8B\x6F |0 + \x8B\x70 |0 + \x8B\x71 |0 + \x8B\x72 |0 + \x8B\x73 |0 + \x8B\x74 |0 + \x8B\x75 |0 + \x8B\x76 |0 + \x8B\x77 |0 + \x8B\x79 |0 + \x8B\x7A |0 + \x8B\x7B |0 + \x8B\x7C |0 + \x8B\x7E |0 + \x8B\xA1 |0 + \x8B\xA2 |0 + \x8B\xA3 |0 + \x8B\xA4 |0 + \x8B\xA5 |0 + \x8B\xA7 |0 + \x8B\xA8 |0 + \x8B\xA9 |0 + \x8B\xAA |0 + \x8B\xAB |0 + \x8B\xAC |0 + \x8B\xAD |0 + \x8B\xAE |0 + \x8B\xB2 |0 + \x8B\xBB |0 + \x8B\xBC |0 + \x8B\xC3 |0 + \x8B\xC5 |0 + \x8B\xD6 |0 + \x8B\xDB |0 + \x8B\xDE |0 + \x8B\xE1 |0 + \x8B\xE2 |0 + \x8B\xE6 |0 + \x8B\xED |0 + \x8B\xF3 |0 + \x8B\xFA |0 + \x8C\x40 |1 + \x8C\x41 |1 + \x8C\x42 |0 + \x8C\x43 |0 + \x8C\x44 |1 + \x8C\x45 |1 + \x8C\x46 |0 + \x8C\x47 |1 + \x8C\x48 |1 + \x8C\x49 |1 + \x8C\x4A |0 + \x8C\x4B |1 + \x8C\x4C |0 + \x8C\x4D |1 + \x8C\x4E |0 + \x8C\x4F |1 + \x8C\x50 |1 + \x8C\x51 |1 + \x8C\x52 |1 + \x8C\x53 |1 + \x8C\x54 |0 + \x8C\x55 |0 + \x8C\x56 |1 + \x8C\x57 |0 + \x8C\x58 |1 + \x8C\x59 |1 + \x8C\x5A |1 + \x8C\x5B |1 + \x8C\x5C |0 + \x8C\x5D |1 + \x8C\x5E |1 + \x8C\x5F |0 + \x8C\x60 |1 + \x8C\x61 |1 + \x8C\x62 |0 + \x8C\x63 |1 + \x8C\x64 |0 + \x8C\x65 |0 + \x8C\x66 |1 + \x8C\x67 |1 + \x8C\x68 |1 + \x8C\x69 |0 + \x8C\x6A |1 + \x8C\x6B |1 + \x8C\x6C |0 + \x8C\x6D |0 + \x8C\x6E |1 + \x8C\x6F |1 + \x8C\x70 |1 + \x8C\x71 |1 + \x8C\x72 |1 + \x8C\x73 |1 + \x8C\x74 |0 + \x8C\x75 |1 + \x8C\x76 |1 + \x8C\x77 |1 + \x8C\x78 |1 + \x8C\x79 |0 + \x8C\x7A |1 + \x8C\x7B |1 + \x8C\x7C |1 + \x8C\x7D |0 + \x8C\x7E |1 + \x8C\xA1 |0 + \x8C\xA2 |1 + \x8C\xA3 |1 + \x8C\xA4 |0 + \x8C\xA5 |1 + \x8C\xA6 |0 + \x8C\xA7 |1 + \x8C\xA8 |0 + \x8C\xA9 |1 + \x8C\xAA |1 + \x8C\xAB |0 + \x8C\xAC |1 + \x8C\xAD |1 + \x8C\xAE |1 + \x8C\xAF |0 + \x8C\xB0 |0 + \x8C\xB1 |1 + \x8C\xB2 |1 + \x8C\xB3 |1 + \x8C\xB4 |1 + \x8C\xB5 |1 + \x8C\xB6 |1 + \x8C\xB7 |0 + \x8C\xB8 |1 + \x8C\xB9 |0 + \x8C\xBA |1 + \x8C\xBB |0 + \x8C\xBC |1 + \x8C\xBD |1 + \x8C\xBE |1 + \x8C\xBF |1 + \x8C\xC0 |0 + \x8C\xC1 |0 + \x8C\xC2 |0 + \x8C\xC3 |1 + \x8C\xC4 |1 + \x8C\xC5 |1 + \x8C\xC6 |0 + \x8C\xC7 |0 + \x8C\xC8 |0 + \x8C\xC9 |1 + \x8C\xCA |1 + \x8C\xCB |1 + \x8C\xCC |1 + \x8C\xCD |0 + \x8C\xCE |1 + \x8C\xCF |0 + \x8C\xD0 |1 + \x8C\xD1 |0 + \x8C\xD2 |1 + \x8C\xD3 |0 + \x8C\xD4 |1 + \x8C\xD5 |0 + \x8C\xD6 |0 + \x8C\xD7 |0 + \x8C\xD8 |0 + \x8C\xD9 |1 + \x8C\xDA |0 + \x8C\xDB |0 + \x8C\xDC |1 + \x8C\xDD |0 + \x8C\xDE |0 + \x8C\xDF |0 + \x8C\xE0 |0 + \x8C\xE1 |0 + \x8C\xE2 |0 + \x8C\xE3 |0 + \x8C\xE4 |0 + \x8C\xE5 |0 + \x8C\xE6 |0 + \x8C\xE7 |0 + \x8C\xE8 |0 + \x8C\xE9 |0 + \x8C\xEA |0 + \x8C\xEB |0 + \x8C\xEC |0 + \x8C\xED |0 + \x8C\xEE |0 + \x8C\xEF |0 + \x8C\xF0 |0 + \x8C\xF1 |0 + \x8C\xF2 |0 + \x8C\xF3 |0 + \x8C\xF4 |0 + \x8C\xF5 |0 + \x8C\xF6 |0 + \x8C\xF7 |0 + \x8C\xF8 |0 + \x8C\xF9 |0 + \x8C\xFA |0 + \x8C\xFB |0 + \x8C\xFC |0 + \x8C\xFD |0 + \x8C\xFE |0 + \x8D\xE2 |0 + \x8D\xEC |0 + \x8D\xFB |0 + \x8D\xFE |0 + \xC8\x79 |0 + \xC8\x7A |0 + \xC8\x7C |0 + \xC8\x7E |0 + \xC8\xA1 |0 + \xC8\xA3 |0 + \xC8\xA4 |0 + \xC9\x4A |0 + \xDD\xFC |0 + \xA1\x4A |0 + \xA1\x57 |0 + \xA1\x59 |0 + \xA1\x5B |0 + \xA1\x5F |0 + \xA1\x60 |0 + \xA1\x63 |0 + \xA1\x64 |0 + \xA1\x67 |0 + \xA1\x68 |0 + \xA1\x6B |0 + \xA1\x6C |0 + \xA1\x6F |0 + \xA1\x70 |0 + \xA1\x73 |0 + \xA1\x74 |0 + \xA1\x77 |0 + \xA1\x78 |0 + \xA1\x7B |0 + \xA1\x7C |0 + \xA1\xC6 |0 + \xA1\xC7 |0 + \xA1\xCA |0 + \xA1\xCB |0 + \xA1\xC8 |0 + \xA1\xC9 |0 + \xA1\x5C |0 + \xA1\x4D |0 + \xA1\x4E |0 + \xA1\x4F |0 + \xA1\x51 |0 + \xA1\x52 |0 + \xA1\x53 |0 + \xA1\x54 |0 + \xA1\x7D |0 + \xA1\x7E |0 + \xA1\xA1 |0 + \xA1\xA2 |0 + \xA1\xA3 |0 + \xA1\xA4 |0 + \xA1\xCC |0 + \xA1\xCD |0 + \xA1\xCE |0 + \xA1\xDE |0 + \xA1\xDF |0 + \xA1\xE0 |0 + \xA1\xE1 |0 + \xA1\xE2 |0 + \xA2\x42 |0 + \xA2\x4C |0 + \xA2\x4D |0 + \xA2\x4E |0 + \xA1\x49 |0 + \xC8\xD0 |0 + \xA1\xAD |0 + \xA2\x43 |0 + \xA2\x48 |0 + \xA1\xAE |0 + \xC8\xCF |0 + \xA1\x5D |0 + \xA1\x5E |0 + \xA1\xAF |0 + \xA1\xCF |0 + \xA1\x41 |0 + \xA1\xD0 |0 + \xA1\x44 |0 + \xA1\xFE |0 + \xA2\xAF |0 + \xA2\xB0 |0 + \xA2\xB1 |0 + \xA2\xB2 |0 + \xA2\xB3 |0 + \xA2\xB4 |0 + \xA2\xB5 |0 + \xA2\xB6 |0 + \xA2\xB7 |0 + \xA2\xB8 |0 + \xA1\x47 |0 + \xA1\x46 |0 + \xA1\xD5 |0 + \xA1\xD7 |0 + \xA1\xD6 |0 + \xA1\x48 |0 + \xA2\x49 |0 + \xA2\xCF |0 + \xA2\xD0 |0 + \xA2\xD1 |0 + \xA2\xD2 |0 + \xA2\xD3 |0 + \xA2\xD4 |0 + \xA2\xD5 |0 + \xA2\xD6 |0 + \xA2\xD7 |0 + \xA2\xD8 |0 + \xA2\xD9 |0 + \xA2\xDA |0 + \xA2\xDB |0 + \xA2\xDC |0 + \xA2\xDD |0 + \xA2\xDE |0 + \xA2\xDF |0 + \xA2\xE0 |0 + \xA2\xE1 |0 + \xA2\xE2 |0 + \xA2\xE3 |0 + \xA2\xE4 |0 + \xA2\xE5 |0 + \xA2\xE6 |0 + \xA2\xE7 |0 + \xA2\xE8 |0 + \xC6\xE4 |0 + \xA2\x40 |0 + \xC6\xE5 |0 + \xA1\xC4 |0 + \xA2\xE9 |0 + \xA2\xEA |0 + \xA2\xEB |0 + \xA2\xEC |0 + \xA2\xED |0 + \xA2\xEE |0 + \xA2\xEF |0 + \xA2\xF0 |0 + \xA2\xF1 |0 + \xA2\xF2 |0 + \xA2\xF3 |0 + \xA2\xF4 |0 + \xA2\xF5 |0 + \xA2\xF6 |0 + \xA2\xF7 |0 + \xA2\xF8 |0 + \xA2\xF9 |0 + \xA2\xFA |0 + \xA2\xFB |0 + \xA2\xFC |0 + \xA2\xFD |0 + \xA2\xFE |0 + \xA3\x40 |0 + \xA3\x41 |0 + \xA3\x42 |0 + \xA3\x43 |0 + \xA1\x61 |0 + \xA1\x55 |0 + \xA1\x62 |0 + \xA1\xE3 |0 + \xA2\x46 |0 + \xA2\x47 |0 + \xC8\xCD |0 + \xA1\xC3 |0 + \xC8\xCE |0 + \xA2\x44 |0 + \x1B |1 + \x18 |1 + \x1A |2 + \x19 |1 + \x09 |1 +END CHARMAP diff --git a/icuSources/data/mappings/ibm-1386_P100-2002.ucm b/icuSources/data/mappings/ibm-1386_P100-2002.ucm index abb32bcc..cd47db11 100644 --- a/icuSources/data/mappings/ibm-1386_P100-2002.ucm +++ b/icuSources/data/mappings/ibm-1386_P100-2002.ucm @@ -1,6 +1,6 @@ # ******************************************************************************* # * -# * Copyright (C) 1995-2001, International Business Machines +# * Copyright (C) 1995-2003, International Business Machines # * Corporation and others. All Rights Reserved. # * # ******************************************************************************* @@ -18,7 +18,8 @@ "ASCII" "ibm-1386_VSUB_VPUA" - 0-80, 81-fe:1 +# declare ff legal because of windows-936 + 0-80, 81-fe:1, ff 40-7e, 80-fe CHARMAP @@ -48,9 +49,7 @@ CHARMAP \x17 |0 \x18 |0 \x19 |0 - \x7F |0 \x1B |0 - \x1A |0 \x1D |0 \x1E |0 \x1F |0 @@ -149,135 +148,26 @@ CHARMAP \x7C |0 \x7D |0 \x7E |0 - \x1C |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \xA1\xE8 |0 - \x7F |2 - \x7F |2 \xA1\xEC |0 \xA1\xA7 |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \xA1\xE3 |0 \xA1\xC0 |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x14 |1 \xA1\xA4 |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \xA1\xC1 |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \xA8\xA4 |0 \xA8\xA2 |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \xA8\xA8 |0 \xA8\xA6 |0 \xA8\xBA |0 - \x7F |2 \xA8\xAC |0 \xA8\xAA |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \xA8\xB0 |0 \xA8\xAE |0 - \x7F |2 - \x7F |2 - \x7F |2 \xA1\xC2 |0 - \x7F |2 \xA8\xB4 |0 \xA8\xB2 |0 - \x7F |2 \xA8\xB9 |0 - \x7F |2 - \x7F |2 - \x7F |2 \xA8\xA1 |0 \xA8\xA5 |0 \xA8\xA7 |0 @@ -294,7 +184,6 @@ CHARMAP \xA8\xB6 |0 \xA8\xB7 |0 \xA8\xB8 |0 - \xA8\xBF |0 \xA8\xBB |0 \xA8\xC0 |0 \xA1\xA6 |0 @@ -425,7 +314,6 @@ CHARMAP \xA1\xAF |0 \xA1\xB0 |0 \xA1\xB1 |0 - \x07 |1 \xA8\x45 |0 \xA1\xAD |0 \xA1\xEB |0 @@ -433,9 +321,6 @@ CHARMAP \xA1\xE5 |0 \xA8\x46 |0 \xA1\xF9 |0 - \x13 |1 - \x80 |3 - \xA2\xE3 |0 \xA1\xE6 |0 \xA8\x47 |0 \xA8\x48 |0 @@ -467,13 +352,10 @@ CHARMAP \xA1\xFC |0 \xA1\xFA |0 \xA1\xFD |0 - \x1D |1 - \x12 |1 \xA8\x49 |0 \xA8\x4A |0 \xA8\x4B |0 \xA8\x4C |0 - \x17 |1 \xA1\xCA |0 \xA1\xC7 |0 \xA1\xC6 |0 @@ -511,7 +393,6 @@ CHARMAP \xA1\xD1 |0 \xA1\xCD |0 \xA8\x53 |0 - \x7F |2 \xA1\xD0 |0 \xA2\xD9 |0 \xA2\xDA |0 @@ -695,20 +576,15 @@ CHARMAP \xA8\x8A |0 \xA1\xF6 |0 \xA1\xF5 |0 - \x16 |1 \xA1\xF8 |0 \xA1\xF7 |0 - \x10 |1 \xA8\x8B |0 \xA8\x8C |0 - \x11 |1 \xA1\xF4 |0 \xA1\xF3 |0 \xA1\xF0 |0 \xA1\xF2 |0 \xA1\xF1 |0 - \x08 |1 - \x0A |1 \xA8\x8D |0 \xA8\x8E |0 \xA8\x8F |0 @@ -716,43 +592,8 @@ CHARMAP \xA1\xEF |0 \xA1\xEE |0 \xA8\x91 |0 - \x01 |1 - \x02 |1 - \x0F |1 \xA1\xE2 |0 \xA1\xE1 |0 - \x06 |1 - \x05 |1 - \x03 |1 - \x04 |1 - \x0D |1 - \x0E |1 - \xFE\x50 |0 - \xFE\x54 |0 - \xFE\x57 |0 - \xFE\x58 |0 - \xFE\x5D |0 - \xFE\x5E |0 - \xFE\x6B |0 - \xFE\x6E |0 - \xFE\x71 |0 - \xFE\x73 |0 - \xFE\x74 |0 - \xFE\x75 |0 - \xFE\x79 |0 - \xFE\x84 |0 - \xA9\x8A |0 - \xA9\x8B |0 - \xA9\x8C |0 - \xA9\x8D |0 - \xA9\x8E |0 - \xA9\x8F |0 - \xA9\x90 |0 - \xA9\x91 |0 - \xA9\x92 |0 - \xA9\x93 |0 - \xA9\x94 |0 - \xA9\x95 |0 \xA1\xA1 |0 \xA1\xA2 |0 \xA1\xA3 |0 @@ -787,7 +628,6 @@ CHARMAP \xA9\x46 |0 \xA9\x47 |0 \xA9\x48 |0 - \xA9\x89 |0 \xA4\xA1 |0 \xA4\xA2 |0 \xA4\xA3 |0 @@ -1024,58 +864,6 @@ CHARMAP \xA9\x52 |0 \xA9\x53 |0 \xA9\x54 |0 - \xFE\x56 |0 - \xFE\x55 |0 - \xFE\x5A |0 - \xFE\x5C |0 - \xFE\x5B |0 - \xFE\x60 |0 - \xFE\x5F |0 - \xFE\x62 |0 - \xFE\x65 |0 - \xFE\x63 |0 - \xFE\x64 |0 - \xFE\x68 |0 - \xFE\x69 |0 - \xFE\x6A |0 - \xFE\x6F |0 - \xFE\x70 |0 - \xFE\x72 |0 - \xFE\x78 |0 - \xFE\x77 |0 - \xFE\x7A |0 - \xFE\x7B |0 - \xFE\x7D |0 - \xFE\x7C |0 - \xFE\x80 |0 - \xFE\x81 |0 - \xFE\x82 |0 - \xFE\x83 |0 - \xFE\x85 |0 - \xFE\x86 |0 - \xFE\x87 |0 - \xFE\x88 |0 - \xFE\x89 |0 - \xFE\x8A |0 - \xFE\x8B |0 - \xFE\x8D |0 - \xFE\x8C |0 - \xFE\x8F |0 - \xFE\x8E |0 - \xFE\x96 |0 - \xFE\x93 |0 - \xFE\x94 |0 - \xFE\x95 |0 - \xFE\x97 |0 - \xFE\x92 |0 - \xFE\x98 |0 - \xFE\x99 |0 - \xFE\x9A |0 - \xFE\x9B |0 - \xFE\x9C |0 - \xFE\x9D |0 - \xFE\x9E |0 - \xFE\x9F |0 \xD2\xBB |0 \xB6\xA1 |0 \x81\x40 |0 @@ -24225,3 +24013,219 @@ CHARMAP \x19 |1 \x09 |1 END CHARMAP + +CHARMAP + \x7F |0 + \x1A |0 + \x1C |0 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x14 |1 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \xA8\xBF |0 + \x07 |1 + \x13 |1 + \x80 |3 + \xA2\xE3 |0 + \x1D |1 + \x12 |1 + \x17 |1 + \x7F |2 + \x16 |1 + \x10 |1 + \x11 |1 + \x08 |1 + \x0A |1 + \x01 |1 + \x02 |1 + \x0F |1 + \x06 |1 + \x05 |1 + \x03 |1 + \x04 |1 + \x0D |1 + \x0E |1 + \xFE\x50 |0 + \xFE\x54 |0 + \xFE\x57 |0 + \xFE\x58 |0 + \xFE\x5D |0 + \xFE\x5E |0 + \xFE\x6B |0 + \xFE\x6E |0 + \xFE\x71 |0 + \xFE\x73 |0 + \xFE\x74 |0 + \xFE\x75 |0 + \xFE\x79 |0 + \xFE\x84 |0 + \xA9\x8A |0 + \xA9\x8B |0 + \xA9\x8C |0 + \xA9\x8D |0 + \xA9\x8E |0 + \xA9\x8F |0 + \xA9\x90 |0 + \xA9\x91 |0 + \xA9\x92 |0 + \xA9\x93 |0 + \xA9\x94 |0 + \xA9\x95 |0 + \xA9\x89 |0 + \xFE\x56 |0 + \xFE\x55 |0 + \xFE\x5A |0 + \xFE\x5C |0 + \xFE\x5B |0 + \xFE\x60 |0 + \xFE\x5F |0 + \xFE\x62 |0 + \xFE\x65 |0 + \xFE\x63 |0 + \xFE\x64 |0 + \xFE\x68 |0 + \xFE\x69 |0 + \xFE\x6A |0 + \xFE\x6F |0 + \xFE\x70 |0 + \xFE\x72 |0 + \xFE\x78 |0 + \xFE\x77 |0 + \xFE\x7A |0 + \xFE\x7B |0 + \xFE\x7D |0 + \xFE\x7C |0 + \xFE\x80 |0 + \xFE\x81 |0 + \xFE\x82 |0 + \xFE\x83 |0 + \xFE\x85 |0 + \xFE\x86 |0 + \xFE\x87 |0 + \xFE\x88 |0 + \xFE\x89 |0 + \xFE\x8A |0 + \xFE\x8B |0 + \xFE\x8D |0 + \xFE\x8C |0 + \xFE\x8F |0 + \xFE\x8E |0 + \xFE\x96 |0 + \xFE\x93 |0 + \xFE\x94 |0 + \xFE\x95 |0 + \xFE\x97 |0 + \xFE\x92 |0 + \xFE\x98 |0 + \xFE\x99 |0 + \xFE\x9A |0 + \xFE\x9B |0 + \xFE\x9C |0 + \xFE\x9D |0 + \xFE\x9E |0 + \xFE\x9F |0 +END CHARMAP diff --git a/icuSources/data/mappings/ibm-1390_P100-1999.ucm b/icuSources/data/mappings/ibm-1390_P110-2003.ucm similarity index 94% rename from icuSources/data/mappings/ibm-1390_P100-1999.ucm rename to icuSources/data/mappings/ibm-1390_P110-2003.ucm index 5d976671..533f4ee3 100644 --- a/icuSources/data/mappings/ibm-1390_P100-1999.ucm +++ b/icuSources/data/mappings/ibm-1390_P110-2003.ucm @@ -1,14 +1,14 @@ # *************************************************************************** # * -# * Copyright (C) 1995-2002, International Business Machines +# * Copyright (C) 1995-2003, International Business Machines # * Corporation and others. All Rights Reserved. # * # *************************************************************************** # -# File created by rptp2ucm (compiled on Dec 3 2002) -# from source files 44B0056E.RPMAP100 and 056E44B0.TPMAP100 +# File created by rptp2ucm (compiled on Oct 27 2003) +# from source files 44B0056E.RPMAP110 and 056E44B0.TPMAP110 # - "ibm-1390_P100-1999" + "ibm-1390_P110-2003" "AXXXX" 2 1 @@ -18,6 +18,14 @@ "EBCDIC" "ibm-1390_VPUA" +# includes mappings for surrogate pairs + 0-ff, e:1.s, f:0.s + initial, 0-3f:4, e:1.s, f:0.s, 40:3, 41-fe:2, ff:4, b3-b7:5 + 0-40:1.i, 41-fe:1., ff:1.i + 0-ff:1.i, 40:1. + 0-ff:1.i + 0-40:1.i, 41-fe:1.p, ff:1.i + CHARMAP \x00 |0 \x01 |0 @@ -33,8 +41,6 @@ CHARMAP \x0B |0 \x0C |0 \x0D |0 - \x3F |2 - \x3F |2 \x10 |0 \x11 |0 \x12 |0 @@ -55,7 +61,6 @@ CHARMAP \x5A |0 \x7F |0 \x7B |0 - \xE0 |0 \x6C |0 \x50 |0 \x7D |0 @@ -110,42 +115,12 @@ CHARMAP \xE7 |0 \xE8 |0 \xE9 |0 - \x70 |0 - \xB2 |0 - \x80 |0 \xB0 |0 \x6D |0 \x79 |0 - \x62 |0 - \x63 |0 - \x64 |0 - \x65 |0 - \x66 |0 - \x67 |0 - \x68 |0 - \x69 |0 - \x71 |0 - \x72 |0 - \x73 |0 - \x74 |0 - \x75 |0 - \x76 |0 - \x77 |0 - \x78 |0 - \x8B |0 - \x9B |0 - \xAB |0 - \xB3 |0 - \xB4 |0 - \xB5 |0 - \xB6 |0 - \xB7 |0 - \xB8 |0 - \xB9 |0 \xC0 |0 \x4F |0 \xD0 |0 - \xA0 |0 \x07 |0 \x20 |0 \x21 |0 @@ -181,10 +156,7 @@ CHARMAP \xFF |0 \xD6\x41 |0 \xD6\x42 |0 - \xB1 |0 - \x4A |0 \xD6\x43 |0 - \x5B |0 \x42\x6A |0 \x44\x6A |0 \x44\x60 |0 @@ -249,7 +221,6 @@ CHARMAP \xD6\x78 |0 \xD6\x79 |0 \xD6\x7A |0 - \xD6\x7B |0 \xD6\x7C |0 \xD6\x7D |0 \xD6\x7E |0 @@ -404,6 +375,7 @@ CHARMAP \xD7\x78 |0 \xD7\x79 |0 \xD7\x7A |0 + \xD7\x93 |0 \xD7\x7B |0 \xD7\x7C |0 \xD7\x7D |0 @@ -422,6 +394,8 @@ CHARMAP \xD7\x8A |0 \xD7\x8B |0 \xD7\x8C |0 + \xD7\x94 |0 + \xD7\x95 |0 \xD7\x8D |0 \xD7\x8E |0 \xD7\x8F |0 @@ -432,13 +406,10 @@ CHARMAP \xD8\x8D |0 \xD8\x8E |0 \xD8\x8F |0 - \xD8\x90 |0 \xD8\x91 |0 \xD8\x92 |0 \xD8\x93 |0 \xD8\x94 |0 - \xD8\x95 |0 - \xD8\x96 |0 \xD8\x97 |0 \xD8\x98 |0 \xD8\x99 |0 @@ -488,7 +459,6 @@ CHARMAP \xD8\xC5 |0 \xD8\xC6 |0 \xD8\xC7 |0 - \xD8\xC8 |0 \xD8\xC9 |0 \xD8\xCA |0 \xD8\xCB |0 @@ -537,11 +507,41 @@ CHARMAP \xD8\xFD |0 \xD8\xFE |0 \xD9\x41 |0 - \xD9\x42 |0 \xD9\x43 |0 \xD9\x44 |0 \xD9\x45 |0 - \xD9\x46 |0 + \xEA\x51 |0 + \xEA\x52 |0 + \xEA\x53 |0 + \xEA\x54 |0 + \xEA\x55 |0 + \xEA\x57 |0 + \xEA\x59 |0 + \xEA\x5C |0 + \xEA\x5D |0 + \xEA\x60 |0 + \xEA\x69 |0 + \xEA\x6A |0 + \xEA\x6B |0 + \xEA\x6D |0 + \xEA\x6E |0 + \xEA\x6F |0 + \xEA\x70 |0 + \xEA\x71 |0 + \xEA\x75 |0 + \xEA\x76 |0 + \xEA\x7A |0 + \xEA\x7B |0 + \xEA\x7D |0 + \xEA\x80 |0 + \xEA\x81 |0 + \xEA\x85 |0 + \xEA\x8A |0 + \xEA\x8B |0 + \xEA\x8C |0 + \xEA\x8D |0 + \xEA\x8E |0 + \xEA\xB2 |0 \xD9\x7E |0 \xD9\x7F |0 \xD9\x80 |0 @@ -858,7 +858,10 @@ CHARMAP \xDA\xE9 |0 \xDA\xEA |0 \xDA\xEB |0 + \xDC\x63 |0 + \xDC\x64 |0 \xDC\x62 |0 + \xDC\x65 |0 \xDD\xA4 |0 \xDD\xA5 |0 \xDD\xA6 |0 @@ -920,7 +923,6 @@ CHARMAP \x44\x6B |0 \xDD\xD0 |0 \xDD\xD1 |0 - \xA1 |0 \xDD\xD2 |0 \xDD\xD3 |0 \xDD\xD4 |0 @@ -929,6 +931,10 @@ CHARMAP \xDD\xD7 |0 \xDD\xD8 |0 \xDD\xD9 |0 + \xDD\xDA |0 + \xDD\xDB |0 + \xDD\xDC |0 + \xDD\xDD |0 \xDE\x47 |0 \xDE\x48 |0 \xDE\x49 |0 @@ -968,8 +974,6 @@ CHARMAP \xDE\x7F |0 \xDE\x80 |0 \xDE\x81 |0 - \xE1 |0 - \x42\xE1 |3 \xDE\xA7 |0 \xDE\xA8 |0 \xDE\xA9 |0 @@ -1417,6 +1421,23 @@ CHARMAP \xE0\xF2 |0 \xE0\xF3 |0 \xE0\xF4 |0 + \xE0\xF5 |0 + \xE0\xF6 |0 + \xE0\xF7 |0 + \xE0\xF8 |0 + \xE0\xF9 |0 + \xE0\xFA |0 + \xE0\xFB |0 + \xE0\xFC |0 + \xE0\xFD |0 + \xE0\xFE |0 + \xE1\x41 |0 + \xE1\x42 |0 + \xE1\x43 |0 + \xE1\x44 |0 + \xE1\x45 |0 + \xE1\x46 |0 + \xEA\xE4 |0 \xE2\x70 |0 \xE2\x71 |0 \xE2\x72 |0 @@ -1556,6 +1577,26 @@ CHARMAP \xE2\xF8 |0 \xE2\xF9 |0 \xE2\xFA |0 + \xE2\xFB |0 + \xE2\xFC |0 + \xE2\xFD |0 + \xE2\xFE |0 + \xE3\x41 |0 + \xE3\x42 |0 + \xE3\x43 |0 + \xE3\x44 |0 + \xE3\x45 |0 + \xE3\x46 |0 + \xE3\x47 |0 + \xE3\x48 |0 + \xE3\x49 |0 + \xE3\x4A |0 + \xE3\x4B |0 + \xE3\x4C |0 + \xE3\x4D |0 + \xE3\x4E |0 + \xE3\x4F |0 + \xE3\x50 |0 \x43\x7C |0 \x43\xB7 |0 \x43\x7D |0 @@ -1806,6 +1847,8 @@ CHARMAP \xE4\x77 |0 \xE4\x78 |0 \xE4\x79 |0 + \xE4\xCB |0 + \xE4\xCC |0 \xE4\x7A |0 \xE4\x7B |0 \xE4\x7C |0 @@ -2052,6 +2095,11 @@ CHARMAP \xE6\x82 |0 \xE6\x83 |0 \xE6\x84 |0 + \xEB\x77 |0 + \xEB\x78 |0 + \xEC\x44 |0 + \xEC\x7F |0 + \xEC\x80 |0 \x40\x40 |0 \x43\x44 |0 \x43\x41 |0 @@ -2093,7 +2141,9 @@ CHARMAP \xE6\xB5 |0 \xE6\xB6 |0 \xE6\xB7 |0 - \x3F |2 + \xE6\xB8 |0 + \xE6\xB9 |0 + \xE6\xBA |0 \x44\x47 |0 \x44\x81 |0 \x44\x48 |0 @@ -2104,15 +2154,10 @@ CHARMAP \x44\x84 |0 \x44\x52 |0 \x44\x85 |0 - \x44\x86 |0 \x44\xC0 |0 - \x44\x87 |0 \x44\xC1 |0 - \x44\x88 |0 \x44\xC2 |0 - \x44\x89 |0 \x44\xC3 |0 - \x44\x8A |0 \x44\xC4 |0 \x44\x8C |0 \x44\xC5 |0 @@ -2178,10 +2223,14 @@ CHARMAP \x44\x46 |0 \x44\xBD |0 \xE6\xCF |0 + \xE6\xD0 |0 + \xE6\xD1 |0 \x43\xBE |0 \x43\xBF |0 \x44\xDC |0 \x44\xDD |0 + \xE6\xD2 |0 + \xE6\xDC |0 \x43\x47 |0 \x43\x81 |0 \x43\x48 |0 @@ -2192,15 +2241,10 @@ CHARMAP \x43\x84 |0 \x43\x52 |0 \x43\x85 |0 - \x43\x86 |0 \x43\xC0 |0 - \x43\x87 |0 \x43\xC1 |0 - \x43\x88 |0 \x43\xC2 |0 - \x43\x89 |0 \x43\xC3 |0 - \x43\x8A |0 \x43\xC4 |0 \x43\x8C |0 \x43\xC5 |0 @@ -2208,7 +2252,6 @@ CHARMAP \x43\xC6 |0 \x43\x8E |0 \x43\xC7 |0 - \x43\x8F |0 \x43\xC8 |0 \x43\x90 |0 \x43\xC9 |0 @@ -2217,11 +2260,9 @@ CHARMAP \x43\x92 |0 \x43\xCB |0 \x43\x56 |0 - \x43\x93 |0 \x43\xCC |0 \x43\x94 |0 \x43\xCD |0 - \x43\x95 |0 \x43\xCE |0 \x43\x96 |0 \x43\x97 |0 @@ -2276,6 +2317,22 @@ CHARMAP \x43\x58 |0 \x43\xDC |0 \x43\xDD |0 + \xE6\xDD |0 + \xEC\x85 |0 + \xEC\x86 |0 + \xEC\x87 |0 + \xEC\x88 |0 + \xEC\x89 |0 + \xEC\x8A |0 + \xEC\x8B |0 + \xEC\x8D |0 + \xEC\x8E |0 + \xEC\x8F |0 + \xEC\x90 |0 + \xEC\x91 |0 + \xEC\x92 |0 + \xEC\x93 |0 + \xEC\x94 |0 \xE6\xDE |0 \xE6\xDF |0 \xE6\xE0 |0 @@ -2312,6 +2369,21 @@ CHARMAP \xE6\xFE |0 \xE7\x41 |0 \xE7\x42 |0 + \xE7\xAF |0 + \xE7\xB0 |0 + \xE7\xB1 |0 + \xE7\xB2 |0 + \xE7\xB3 |0 + \xE7\xB4 |0 + \xE7\xB5 |0 + \xE7\xB6 |0 + \xE7\xB7 |0 + \xE7\xB8 |0 + \xE7\xB9 |0 + \xE7\xBA |0 + \xE7\xBB |0 + \xE7\xBC |0 + \xE7\xBD |0 \xE7\x43 |0 \xE7\x44 |0 \xE7\x45 |0 @@ -2361,6 +2433,21 @@ CHARMAP \xE7\x71 |0 \xE7\x72 |0 \xE7\x73 |0 + \xE7\xBE |0 + \xE7\xBF |0 + \xE7\xC0 |0 + \xE7\xC1 |0 + \xE7\xC2 |0 + \xE7\xC3 |0 + \xE7\xC4 |0 + \xE7\xC5 |0 + \xE7\xC6 |0 + \xE7\xC7 |0 + \xE7\xC8 |0 + \xE7\xC9 |0 + \xE7\xCA |0 + \xE7\xCB |0 + \xE7\xCC |0 \xE7\x74 |0 \xE7\x75 |0 \xE7\x76 |0 @@ -2669,6 +2756,170 @@ CHARMAP \xE9\x99 |0 \xE9\x9A |0 \xE9\x9B |0 + \xB3\x43 |0 + \xB3\x4A |0 + \xB3\x4B |0 + \xB3\x4C |0 + \xB3\x58 |0 + \xB3\x59 |0 + \xB3\x66 |0 + \xB3\x6C |0 + \xB3\x6D |0 + \xB3\x6E |0 + \xB3\x6F |0 + \xB3\x74 |0 + \xB3\x7D |0 + \xB3\x8A |0 + \xB3\x8B |0 + \xB3\x8C |0 + \xB3\x92 |0 + \xB3\x99 |0 + \xB3\x9A |0 + \xB3\x9D |0 + \xB3\xA1 |0 + \xB3\xA9 |0 + \xB3\xAE |0 + \xB3\xBB |0 + \xB3\xCB |0 + \xB3\xCE |0 + \xB3\xCF |0 + \xB3\xD4 |0 + \xB3\xDB |0 + \xB3\xDD |0 + \xB3\xDE |0 + \xB3\xDF |0 + \xB3\xE0 |0 + \xB3\xE3 |0 + \xB3\xF1 |0 + \xB3\xFB |0 + \xB3\xFD |0 + \xB3\xFE |0 + \xB4\x41 |0 + \xB4\x42 |0 + \xB4\x4B |0 + \xB4\x4C |0 + \xB4\x4D |0 + \xB4\x4E |0 + \xB4\x4F |0 + \xB4\x5D |0 + \xB4\x5F |0 + \xB4\x60 |0 + \xB4\x64 |0 + \xB4\x81 |0 + \xB4\x82 |0 + \xB4\x8A |0 + \xB4\x8B |0 + \xB4\x8F |0 + \xB4\x98 |0 + \xB4\x99 |0 + \xB4\x9A |0 + \xB4\x9C |0 + \xB4\xB5 |0 + \xB4\xB9 |0 + \xB4\xC1 |0 + \xB4\xC0 |0 + \xB4\xC2 |0 + \xB4\xC6 |0 + \xB4\xCA |0 + \xB4\xD1 |0 + \xB4\xD6 |0 + \xB4\xD9 |0 + \xB4\xE2 |0 + \xB4\xE9 |0 + \xB4\xF8 |0 + \xB4\xFC |0 + \xB5\x5A |0 + \xB5\x5D |0 + \xB5\x68 |0 + \xB5\x70 |0 + \xB5\x77 |0 + \xB5\x7B |0 + \xB5\x80 |0 + \xB5\x85 |0 + \xB5\x89 |0 + \xB5\x8A |0 + \xB5\x8B |0 + \xB5\x8C |0 + \xB5\x90 |0 + \xB5\xA1 |0 + \xB5\xA6 |0 + \xB5\xA7 |0 + \xB5\xA8 |0 + \xB5\xAD |0 + \xB5\xB3 |0 + \xB5\xB5 |0 + \xB5\xBC |0 + \xB5\xC3 |0 + \xB5\xC7 |0 + \xB5\xDC |0 + \xB5\xE2 |0 + \xB5\xE5 |0 + \xB5\xE6 |0 + \xB5\xEB |0 + \xB5\xED |0 + \xB5\xF2 |0 + \xB5\xF4 |0 + \xB5\xF5 |0 + \xB5\xF8 |0 + \xB5\xFA |0 + \xB6\x42 |0 + \xB6\x50 |0 + \xB6\x53 |0 + \xB6\x55 |0 + \xB6\x5C |0 + \xB6\x61 |0 + \xB6\x62 |0 + \xB6\x76 |0 + \xB6\x78 |0 + \xB6\x7A |0 + \xB6\x7C |0 + \xB6\x7D |0 + \xB6\x7E |0 + \xB6\x84 |0 + \xB6\x88 |0 + \xB6\x8D |0 + \xB6\x8F |0 + \xB6\x93 |0 + \xB6\x9A |0 + \xB6\x9B |0 + \xB6\x9D |0 + \xB6\xA7 |0 + \xB6\xA9 |0 + \xB6\xAD |0 + \xB6\xAF |0 + \xB6\xBD |0 + \xB6\xC2 |0 + \xB6\xC8 |0 + \xB6\xCA |0 + \xB6\xD0 |0 + \xB6\xD8 |0 + \xB6\xDE |0 + \xB6\xE1 |0 + \xB6\xE2 |0 + \xB6\xEA |0 + \xB6\xF2 |0 + \xB6\xFB |0 + \xB6\xFE |0 + \xB7\x45 |0 + \xB7\x46 |0 + \xB7\x53 |0 + \xB7\x75 |0 + \xB7\x7C |0 + \xB7\x7F |0 + \xB7\x81 |0 + \xB7\x84 |0 + \xB7\x8B |0 + \xB7\x97 |0 + \xB7\xA3 |0 + \xB7\xA4 |0 + \xB7\xA6 |0 + \xB7\xA8 |0 + \xB7\xA9 |0 + \xB7\xAA |0 + \xB7\xBA |0 + \xB7\xBC |0 + \xB7\xC7 |0 + \xB7\xCD |0 \x45\x41 |0 \x4B\xCE |0 \xB8\x41 |0 @@ -2683,6 +2934,7 @@ CHARMAP \xB8\x44 |0 \x46\xAF |0 \x47\x89 |0 + \xB3\x41 |0 \x56\x42 |0 \x4D\xEC |0 \xB8\x45 |0 @@ -2699,8 +2951,10 @@ CHARMAP \xB8\x48 |0 \x48\x7C |0 \x56\x44 |0 + \xB3\x44 |0 \x56\x45 |0 \xB8\x49 |0 + \xB3\x45 |0 \x45\x5C |0 \xB8\x4A |0 \xB8\x4B |0 @@ -2721,6 +2975,7 @@ CHARMAP \xB8\x50 |0 \x45\x8A |0 \xB8\x51 |0 + \xB3\x47 |0 \x45\xD8 |0 \x55\xA9 |0 \x54\xA5 |0 @@ -2788,6 +3043,8 @@ CHARMAP \x56\x57 |0 \xB8\x61 |0 \x45\x93 |0 + \xB3\x4D |0 + \xB3\x4F |0 \x53\xD9 |0 \x47\x76 |0 \x56\x5C |0 @@ -2795,6 +3052,7 @@ CHARMAP \x56\x5A |0 \x56\x5B |0 \x50\x85 |0 + \xB3\x50 |0 \x45\xE0 |0 \x48\x4B |0 \x56\x59 |0 @@ -2819,6 +3077,7 @@ CHARMAP \x49\xC3 |0 \x46\xF6 |0 \xB8\x68 |0 + \xB3\x51 |0 \x56\x60 |0 \x4D\x71 |0 \xB8\x69 |0 @@ -2902,6 +3161,7 @@ CHARMAP \xB8\x89 |0 \xB8\x8A |0 \xB8\x8B |0 + \xB3\x52 |0 \x56\x79 |0 \xB8\x8C |0 \xB8\x8D |0 @@ -2997,9 +3257,11 @@ CHARMAP \x4B\x4A |0 \x56\x87 |0 \x56\x88 |0 + \xB3\x55 |0 \x46\xDE |0 \x56\x96 |0 \xB8\xB6 |0 + \xB3\x56 |0 \xB8\xB7 |0 \x4C\xE1 |0 \x4D\xB1 |0 @@ -3012,6 +3274,7 @@ CHARMAP \x56\x94 |0 \xB8\xBA |0 \xB8\xBB |0 + \xB3\x57 |0 \xB8\xBC |0 \x56\x8F |0 \x56\x99 |0 @@ -3106,6 +3369,7 @@ CHARMAP \xB8\xE4 |0 \x56\xAA |0 \xB8\xE5 |0 + \xB3\x5A |0 \xB8\xE6 |0 \x4E\xE7 |0 \xB8\xE7 |0 @@ -3115,6 +3379,7 @@ CHARMAP \xB8\xEA |0 \xB8\xEB |0 \x56\xA8 |0 + \xB3\x5B |0 \xB8\xEC |0 \x50\x9C |0 \x46\xAC |0 @@ -3126,11 +3391,13 @@ CHARMAP \xB8\xF1 |0 \xB8\xF2 |0 \xB8\xF3 |0 + \xB3\x5C |0 \xB8\xF4 |0 \x4C\x43 |0 \x54\xDA |0 \xB8\xF5 |0 \xB8\xF6 |0 + \xB3\x5E |0 \x56\xAD |0 \x56\xB0 |0 \x56\xAB |0 @@ -3138,6 +3405,7 @@ CHARMAP \x4C\x5B |0 \xB8\xF7 |0 \xB8\xF8 |0 + \xB3\x5F |0 \xB8\xF9 |0 \x4A\x43 |0 \xB8\xFA |0 @@ -3159,11 +3427,13 @@ CHARMAP \x4A\xBB |0 \x52\xD4 |0 \x56\xB5 |0 + \xB3\x61 |0 \x4D\x82 |0 \xB9\x45 |0 \xB9\x46 |0 \x56\xB3 |0 \xB9\x47 |0 + \xB3\x62 |0 \xB9\x48 |0 \x56\xB7 |0 \xB9\x49 |0 @@ -3177,6 +3447,7 @@ CHARMAP \xB9\x4D |0 \xB9\x4E |0 \xB9\x4F |0 + \xB3\x65 |0 \x56\xB2 |0 \x56\xBA |0 \xB9\x50 |0 @@ -3257,6 +3528,7 @@ CHARMAP \x49\x4B |0 \x51\xBE |0 \xB9\x74 |0 + \xB3\x6A |0 \x56\xCD |0 \x56\xCE |0 \x46\x65 |0 @@ -3269,10 +3541,12 @@ CHARMAP \x45\x46 |0 \x56\xD1 |0 \x47\xB3 |0 + \xB3\xCC |0 \x46\x49 |0 \x4F\x67 |0 \x47\xAF |0 \x47\xC9 |0 + \xB6\x67 |0 \x48\xF4 |0 \xB9\x76 |0 \x56\xD2 |0 @@ -3326,11 +3600,13 @@ CHARMAP \x56\xE8 |0 \xB9\x82 |0 \xB9\x83 |0 + \xB3\x71 |0 \x52\xDC |0 \x56\xEA |0 \x4F\x80 |0 \xB9\x84 |0 \x56\xEB |0 + \xB3\x72 |0 \x55\xF9 |0 \x53\x44 |0 \x4B\xE6 |0 @@ -3428,7 +3704,7 @@ CHARMAP \xB9\xA5 |0 \x49\xC7 |0 \xB9\xA6 |0 - \x54\x81 |1 + \xB3\x75 |0 \x57\x42 |0 \xB9\xA7 |0 \xB9\xA8 |0 @@ -3439,6 +3715,7 @@ CHARMAP \xB9\xAA |0 \x57\x48 |0 \x57\x45 |0 + \xB3\x77 |0 \xB9\xAB |0 \x4B\x4E |0 \x4D\x85 |0 @@ -3455,6 +3732,7 @@ CHARMAP \xB9\xAF |0 \xB9\xB0 |0 \x55\xD6 |0 + \xB3\x78 |0 \xB9\xB1 |0 \x49\xF0 |0 \x57\x4C |0 @@ -3508,9 +3786,11 @@ CHARMAP \x46\x9C |0 \xB9\xC6 |0 \x48\xCE |0 + \xB3\x7C |0 \xB9\xC7 |0 \x57\x57 |0 \xB9\xC8 |0 + \xB3\x7E |0 \xB9\xC9 |0 \x53\xD6 |0 \xB9\xCA |0 @@ -3547,6 +3827,7 @@ CHARMAP \x57\x5F |0 \x57\x60 |0 \x54\x70 |0 + \xB3\x81 |0 \x51\xE9 |0 \x52\x97 |0 \x57\x61 |0 @@ -3631,6 +3912,7 @@ CHARMAP \xB9\xF6 |0 \xB9\xF7 |0 \x53\xDB |0 + \xB3\x85 |0 \x57\x7A |0 \xB9\xF8 |0 \xB9\xF9 |0 @@ -3645,7 +3927,9 @@ CHARMAP \x57\x7D |0 \x4E\x79 |0 \xB9\xFA |0 + \xB3\x86 |0 \x57\x7E |0 + \xB3\x87 |0 \xB9\xFB |0 \x53\xE2 |0 \x57\x7F |0 @@ -3729,6 +4013,7 @@ CHARMAP \x50\x42 |0 \x47\xD9 |0 \x48\x5A |0 + \xB3\x8E |0 \xBA\x5B |0 \x4F\x59 |0 \x48\xE2 |0 @@ -3748,13 +4033,16 @@ CHARMAP \x50\xC6 |0 \x4E\xB2 |0 \x46\xA5 |0 + \xB3\x8F |0 \xBA\x5D |0 \xBA\x5E |0 \x47\xCF |0 \x57\x9D |0 + \xB3\x90 |0 \x50\x7A |0 \x53\xE1 |0 \xBA\x5F |0 + \xB3\x91 |0 \x4C\x4F |0 \xBA\x60 |0 \xBA\x61 |0 @@ -3788,6 +4076,7 @@ CHARMAP \x57\x9E |0 \xBA\x6B |0 \x50\xB0 |0 + \xB3\x93 |0 \xBA\x6C |0 \x57\xA2 |0 \xBA\x6D |0 @@ -3798,6 +4087,7 @@ CHARMAP \xBA\x71 |0 \x54\x8D |0 \xBA\x72 |0 + \xB3\x94 |0 \xBA\x73 |0 \xBA\x74 |0 \x57\xA5 |0 @@ -3832,6 +4122,7 @@ CHARMAP \xBA\x7F |0 \x57\xA9 |0 \xBA\x80 |0 + \xB3\x95 |0 \xBA\x81 |0 \x57\xB2 |0 \x57\xBC |0 @@ -3861,6 +4152,7 @@ CHARMAP \x4E\xF9 |0 \x45\xD0 |0 \x57\xBB |0 + \xB3\x96 |0 \x57\xB6 |0 \xBA\x8D |0 \x57\xAF |0 @@ -3882,7 +4174,9 @@ CHARMAP \x57\xC6 |0 \x57\xC5 |0 \xBA\x94 |0 + \xB3\x97 |0 \x47\x47 |0 + \xB3\x98 |0 \xBA\x95 |0 \x54\x7C |0 \xBA\x96 |0 @@ -3949,6 +4243,7 @@ CHARMAP \xBA\xB7 |0 \x57\xD8 |0 \x57\xDD |0 + \xB3\x9C |0 \x57\xD9 |0 \xBA\xB8 |0 \x57\xD5 |0 @@ -4009,6 +4304,7 @@ CHARMAP \x52\xA2 |0 \xBA\xD4 |0 \x57\xE6 |0 + \xB3\xA0 |0 \xBA\xD5 |0 \x57\xE4 |0 \xBA\xD6 |0 @@ -4023,6 +4319,7 @@ CHARMAP \xBA\xD9 |0 \xBA\xDA |0 \x50\x63 |0 + \xB3\xA6 |0 \xBA\xDB |0 \x47\x7E |0 \xBA\xDC |0 @@ -4038,6 +4335,7 @@ CHARMAP \x50\xF3 |0 \xBA\xE3 |0 \x57\xEF |0 + \xB3\xA7 |0 \x52\xCA |0 \xBA\xE4 |0 \x57\xF8 |0 @@ -4061,6 +4359,7 @@ CHARMAP \xBA\xF0 |0 \xBA\xF1 |0 \xBA\xF2 |0 + \xB3\xAA |0 \xBA\xF3 |0 \xBA\xF4 |0 \x50\x62 |0 @@ -4068,6 +4367,7 @@ CHARMAP \x57\xF0 |0 \xBA\xF6 |0 \x57\xF1 |0 + \xB3\xAB |0 \xBA\xF7 |0 \x54\x7D |0 \xBA\xF8 |0 @@ -4088,6 +4388,7 @@ CHARMAP \xBB\x44 |0 \x4E\x6D |0 \xBB\x45 |0 + \xB3\xAD |0 \x55\xF1 |0 \x55\x82 |0 \x57\xFE |0 @@ -4119,6 +4420,7 @@ CHARMAP \xBB\x57 |0 \x58\x44 |0 \xBB\x58 |0 + \xB3\xAF |0 \xBB\x59 |0 \x58\x46 |0 \x58\x45 |0 @@ -4196,6 +4498,7 @@ CHARMAP \xBB\x7C |0 \x46\x84 |0 \xBB\x7D |0 + \xB3\xB2 |0 \xBB\x7E |0 \xBB\x7F |0 \xBB\x80 |0 @@ -4302,6 +4605,7 @@ CHARMAP \x58\x72 |0 \xBB\xB7 |0 \x58\x76 |0 + \xB3\xB9 |0 \x4D\xF4 |0 \xBB\xB8 |0 \xBB\xB9 |0 @@ -4322,6 +4626,7 @@ CHARMAP \xBB\xC3 |0 \x4D\xAC |0 \x46\xF1 |0 + \xB3\xBC |0 \x46\xA3 |0 \xBB\xC4 |0 \xBB\xC5 |0 @@ -4403,6 +4708,7 @@ CHARMAP \xBB\xE8 |0 \xBB\xE9 |0 \xBB\xEA |0 + \xB3\xC1 |0 \xBB\xEB |0 \xBB\xEC |0 \xBB\xED |0 @@ -4421,6 +4727,7 @@ CHARMAP \xBB\xF5 |0 \x4A\xFC |0 \xBB\xF6 |0 + \xB3\xC3 |0 \x58\x88 |0 \x58\x8B |0 \xBB\xF7 |0 @@ -4434,6 +4741,7 @@ CHARMAP \x54\x88 |0 \x4B\x95 |0 \xBB\xF9 |0 + \xB3\xC4 |0 \xBB\xFA |0 \x58\x8F |0 \x4E\x8E |0 @@ -4457,6 +4765,7 @@ CHARMAP \xBC\x45 |0 \x58\x95 |0 \x58\x97 |0 + \xB3\xC7 |0 \xBC\x46 |0 \xBC\x47 |0 \x58\x98 |0 @@ -4470,6 +4779,7 @@ CHARMAP \x4E\xB0 |0 \x47\x75 |0 \xBC\x49 |0 + \xB3\xC8 |0 \x58\x9B |0 \x58\x9C |0 \x50\x77 |0 @@ -4483,6 +4793,7 @@ CHARMAP \x58\xA0 |0 \x58\xA1 |0 \xBC\x4C |0 + \xB3\xC9 |0 \x49\x7E |0 \x58\xA2 |0 \xBC\x4D |0 @@ -4518,6 +4829,7 @@ CHARMAP \xBC\x59 |0 \x51\x47 |0 \x58\xA9 |0 + \xB3\xCD |0 \x58\xAA |0 \xBC\x5A |0 \xBC\x5B |0 @@ -4637,6 +4949,7 @@ CHARMAP \xBC\x8B |0 \x51\x79 |0 \xBC\x8C |0 + \xB3\xD3 |0 \x52\xB9 |0 \x4B\x42 |0 \xBC\x8D |0 @@ -4650,6 +4963,7 @@ CHARMAP \x58\xC7 |0 \xBC\x92 |0 \xBC\x93 |0 + \xB3\xD5 |0 \x4B\x54 |0 \x58\xC9 |0 \x58\xC8 |0 @@ -4695,6 +5009,7 @@ CHARMAP \xBC\xAA |0 \xBC\xAB |0 \x54\x54 |0 + \xB3\xD7 |0 \xBC\xAC |0 \xBC\xAD |0 \x4D\x80 |0 @@ -4743,6 +5058,7 @@ CHARMAP \x58\xDC |0 \xBC\xC8 |0 \xBC\xC9 |0 + \xB3\xD8 |0 \xBC\xCA |0 \xBC\xCB |0 \x58\xDE |0 @@ -4874,6 +5190,7 @@ CHARMAP \x58\xFD |0 \x45\xAC |0 \xBC\xFA |0 + \xB3\xDC |0 \xBC\xFB |0 \x59\x41 |0 \x4B\x81 |0 @@ -4914,6 +5231,7 @@ CHARMAP \x46\xB2 |0 \x4D\x76 |0 \x49\xFB |0 + \xB3\xE1 |0 \x49\x8A |0 \x59\x4C |0 \x49\x59 |0 @@ -4927,6 +5245,7 @@ CHARMAP \x48\xAE |0 \x45\x5D |0 \x48\x4A |0 + \xB3\xE2 |0 \x59\x50 |0 \x53\xC0 |0 \xBD\x48 |0 @@ -4973,9 +5292,10 @@ CHARMAP \x48\xDD |0 \xBD\x54 |0 \xBD\x55 |0 - \x54\x43 |1 + \xB3\xE5 |0 \xBD\x56 |0 \x47\x6D |0 + \xB3\xE6 |0 \x53\xFB |0 \x55\xC0 |0 \xBD\x57 |0 @@ -5015,11 +5335,13 @@ CHARMAP \xBD\x6C |0 \xBD\x6D |0 \x59\x67 |0 + \xB3\xED |0 \x54\xB9 |0 \x45\xBF |0 \xBD\x6E |0 \x59\x63 |0 \x50\xD5 |0 + \xB3\xEE |0 \x52\x62 |0 \xBD\x6F |0 \x4D\x46 |0 @@ -5036,6 +5358,7 @@ CHARMAP \x59\x6B |0 \xBD\x72 |0 \xBD\x73 |0 + \xB3\xF3 |0 \xBD\x74 |0 \xBD\x75 |0 \x59\x6C |0 @@ -5063,6 +5386,7 @@ CHARMAP \x59\x73 |0 \xBD\x7D |0 \x45\x7F |0 + \xB3\xF6 |0 \x59\x77 |0 \xBD\x7E |0 \x51\x4D |0 @@ -5073,7 +5397,9 @@ CHARMAP \x59\x7B |0 \x59\x7A |0 \x59\x76 |0 + \xB3\xF7 |0 \x59\x75 |0 + \xB3\xF8 |0 \x59\x79 |0 \xBD\x7F |0 \xBD\x80 |0 @@ -5089,6 +5415,7 @@ CHARMAP \x59\x84 |0 \xBD\x88 |0 \xBD\x89 |0 + \xB3\xFC |0 \xBD\x8A |0 \xBD\x8B |0 \x59\x83 |0 @@ -5132,12 +5459,14 @@ CHARMAP \xBD\x9F |0 \xBD\xA0 |0 \xBD\xA1 |0 + \xB4\x43 |0 \xBD\xA2 |0 \xBD\xA3 |0 \x59\x8E |0 \xBD\xA4 |0 \xBD\xA5 |0 \x59\x8D |0 + \xB4\x45 |0 \xBD\xA6 |0 \xBD\xA7 |0 \x59\x90 |0 @@ -5159,9 +5488,11 @@ CHARMAP \x52\x81 |0 \xBD\xAE |0 \x59\x97 |0 + \xB4\x47 |0 \x59\x99 |0 \x59\x98 |0 \x51\xDF |0 + \xB4\x48 |0 \xBD\xAF |0 \xBD\xB0 |0 \x59\x9A |0 @@ -5169,6 +5500,7 @@ CHARMAP \x47\x41 |0 \xBD\xB1 |0 \x4D\x47 |0 + \xB4\x4A |0 \x4C\x67 |0 \xBD\xB2 |0 \x45\x6A |0 @@ -5260,6 +5592,7 @@ CHARMAP \x45\x60 |0 \x59\xAC |0 \x59\xAD |0 + \xB4\x51 |0 \x45\xA9 |0 \x48\xDA |0 \x59\xAE |0 @@ -5299,6 +5632,7 @@ CHARMAP \x50\xC1 |0 \x46\x9A |0 \x4C\x5D |0 + \xB4\x53 |0 \xBD\xDF |0 \xBD\xE0 |0 \xBD\xE1 |0 @@ -5320,6 +5654,7 @@ CHARMAP \xBD\xE8 |0 \xBD\xE9 |0 \x53\x6C |0 + \xB4\x55 |0 \x59\xB7 |0 \x59\xB8 |0 \xBD\xEA |0 @@ -5342,11 +5677,14 @@ CHARMAP \x47\xD0 |0 \x50\x5B |0 \x52\xD6 |0 + \xB4\x57 |0 \x46\x66 |0 \x4B\xAF |0 \x55\x64 |0 + \xB4\x58 |0 \x54\x4B |0 \x51\xD9 |0 + \xB4\x59 |0 \x4B\x47 |0 \xBD\xEE |0 \x59\xC2 |0 @@ -5373,6 +5711,7 @@ CHARMAP \x55\x97 |0 \xBD\xF4 |0 \xBD\xF5 |0 + \xB4\x5B |0 \x4C\x9B |0 \x59\xC7 |0 \xBD\xF6 |0 @@ -5490,6 +5829,7 @@ CHARMAP \xBE\x64 |0 \x46\x54 |0 \x4C\x74 |0 + \xB4\x5C |0 \x59\xE8 |0 \xBE\x65 |0 \x48\xF8 |0 @@ -5561,6 +5901,7 @@ CHARMAP \xBE\x86 |0 \x50\x81 |0 \x59\xF3 |0 + \xB4\x5E |0 \xBE\x87 |0 \x47\xCC |0 \x59\xFC |0 @@ -5697,6 +6038,7 @@ CHARMAP \xBE\xB9 |0 \x55\x4A |0 \x50\x6E |0 + \xB4\x63 |0 \x54\xB8 |0 \x5A\x73 |0 \x5A\x68 |0 @@ -5753,6 +6095,7 @@ CHARMAP \xBE\xD0 |0 \x5A\x79 |0 \xBE\xD1 |0 + \xB4\x65 |0 \x5A\x7F |0 \x5A\x84 |0 \x5A\x7C |0 @@ -5874,6 +6217,7 @@ CHARMAP \xBF\x45 |0 \x51\x53 |0 \x5A\xA9 |0 + \xB4\x6B |0 \x5A\xAB |0 \x5A\xAA |0 \x4D\xC6 |0 @@ -5925,6 +6269,7 @@ CHARMAP \xBF\x52 |0 \x4C\x44 |0 \xBF\x53 |0 + \xB4\x6D |0 \x47\xDC |0 \x45\x8C |0 \x5A\xBF |0 @@ -5952,6 +6297,7 @@ CHARMAP \xBF\x5F |0 \x5A\xC1 |0 \x5A\xC4 |0 + \xB4\x6E |0 \x5A\xC2 |0 \xBF\x60 |0 \x5A\xC5 |0 @@ -5963,6 +6309,7 @@ CHARMAP \x4D\x7A |0 \x4C\x76 |0 \xBF\x64 |0 + \xB4\x6F |0 \x5A\xC6 |0 \xBF\x65 |0 \x5A\xCA |0 @@ -5971,6 +6318,7 @@ CHARMAP \x5A\xC7 |0 \x5A\xCD |0 \x4E\xC0 |0 + \xB4\x70 |0 \x5A\xC8 |0 \x4E\xE3 |0 \xBF\x66 |0 @@ -5985,6 +6333,7 @@ CHARMAP \x5A\xCC |0 \x4A\x67 |0 \x49\x8D |0 + \xB4\x71 |0 \x5A\xDC |0 \x4A\x85 |0 \x4E\x7E |0 @@ -6073,10 +6422,12 @@ CHARMAP \x54\x8F |0 \xBF\x86 |0 \x48\xF6 |0 + \xB4\x73 |0 \xBF\x87 |0 \xBF\x88 |0 \xBF\x89 |0 \x53\x87 |0 + \xB4\x74 |0 \xBF\x8A |0 \x52\xA8 |0 \x5A\xE9 |0 @@ -6100,6 +6451,7 @@ CHARMAP \x4C\x41 |0 \x55\x46 |0 \xBF\x96 |0 + \xB4\x76 |0 \xBF\x97 |0 \x4D\xDD |0 \xBF\x98 |0 @@ -6193,13 +6545,16 @@ CHARMAP \xBF\xBD |0 \x5A\xF8 |0 \xBF\xBE |0 + \xB4\x7A |0 \xBF\xBF |0 + \xB4\x7B |0 \x4B\xF2 |0 \xBF\xC0 |0 \xBF\xC1 |0 \x4A\xD5 |0 \x5A\xFB |0 \x5B\x41 |0 + \xB4\x7E |0 \xBF\xC2 |0 \xBF\xC3 |0 \x4F\x7E |0 @@ -6261,6 +6616,7 @@ CHARMAP \xBF\xE5 |0 \x5B\x51 |0 \x55\xF5 |0 + \xB4\x7F |0 \x51\xEF |0 \xBF\xE6 |0 \xBF\xE7 |0 @@ -6374,6 +6730,7 @@ CHARMAP \xC0\x5F |0 \x47\x7B |0 \xC0\x60 |0 + \xB4\x83 |0 \x5B\x77 |0 \x5B\x78 |0 \x5B\x7A |0 @@ -6387,6 +6744,7 @@ CHARMAP \x48\xAF |0 \x45\xC7 |0 \xC0\x64 |0 + \xB4\x84 |0 \x4A\xF7 |0 \xC0\x65 |0 \x5B\x7D |0 @@ -6424,6 +6782,7 @@ CHARMAP \xC0\x70 |0 \x5B\x86 |0 \x5B\x87 |0 + \xB4\x86 |0 \xC0\x71 |0 \x45\xCA |0 \x58\xED |0 @@ -6458,7 +6817,9 @@ CHARMAP \xC0\x7B |0 \xC0\x7C |0 \xC0\x7D |0 + \xB4\x87 |0 \x5B\x8C |0 + \xB4\x88 |0 \x45\xCD |0 \x4D\xA4 |0 \x48\x88 |0 @@ -6502,6 +6863,7 @@ CHARMAP \xC0\x8C |0 \x4F\xA3 |0 \x5B\x9C |0 + \xB4\x8C |0 \xC0\x8D |0 \xC0\x8E |0 \x5B\x97 |0 @@ -6551,6 +6913,7 @@ CHARMAP \x51\x93 |0 \xC0\xA0 |0 \xC0\xA1 |0 + \xB4\x8D |0 \x4F\x9F |0 \x4C\x98 |0 \x5B\x9E |0 @@ -6561,6 +6924,7 @@ CHARMAP \x5B\xA5 |0 \xC0\xA3 |0 \xC0\xA4 |0 + \xB4\x8E |0 \x5B\xA6 |0 \xC0\xA5 |0 \x4B\xB2 |0 @@ -6572,6 +6936,7 @@ CHARMAP \x5B\xA8 |0 \xC0\xA9 |0 \x5B\xAB |0 + \xB4\x90 |0 \xC0\xAA |0 \xC0\xAB |0 \x5B\xAD |0 @@ -6580,6 +6945,7 @@ CHARMAP \xC0\xAC |0 \xC0\xAD |0 \x5B\xAC |0 + \xB4\x92 |0 \x5B\xAA |0 \x5B\xA7 |0 \x55\x6D |0 @@ -6589,6 +6955,7 @@ CHARMAP \xC0\xAE |0 \xC0\xAF |0 \xC0\xB0 |0 + \xB4\x95 |0 \x49\xF8 |0 \x49\x93 |0 \x5B\xB0 |0 @@ -6649,6 +7016,7 @@ CHARMAP \xC0\xC9 |0 \xC0\xCA |0 \x5B\xB9 |0 + \xB4\x9B |0 \x4C\x56 |0 \xC0\xCB |0 \x5B\xBC |0 @@ -6685,6 +7053,7 @@ CHARMAP \x51\x66 |0 \x4B\xC3 |0 \x46\xF5 |0 + \xB4\x9D |0 \x56\xAC |0 \xC0\xD6 |0 \xC0\xD7 |0 @@ -6694,6 +7063,7 @@ CHARMAP \x47\xD4 |0 \x5B\xC8 |0 \x54\xFD |0 + \xB4\x9E |0 \xC0\xD8 |0 \x4F\xA4 |0 \x55\xF3 |0 @@ -6732,6 +7102,7 @@ CHARMAP \xC0\xE1 |0 \x46\x68 |0 \xC0\xE2 |0 + \xB4\xA0 |0 \x4E\x51 |0 \x50\xD0 |0 \x46\xBC |0 @@ -6780,6 +7151,7 @@ CHARMAP \xC0\xEE |0 \x4A\xE2 |0 \xC0\xEF |0 + \xB4\xA6 |0 \xC0\xF0 |0 \x4F\x78 |0 \xC0\xF1 |0 @@ -6830,6 +7202,7 @@ CHARMAP \x4F\xD8 |0 \xC1\x44 |0 \x4E\xE1 |0 + \xB4\xA9 |0 \xC1\x45 |0 \x5B\xED |0 \x54\xF3 |0 @@ -6852,6 +7225,7 @@ CHARMAP \xC1\x4B |0 \xC1\x4C |0 \x47\x73 |0 + \xB4\xAB |0 \x50\x54 |0 \x4A\xC1 |0 \x5B\xF3 |0 @@ -6859,10 +7233,12 @@ CHARMAP \x47\xD3 |0 \x45\xFA |0 \x51\xF1 |1 + \xB4\xAA |0 \x50\xE3 |0 \xC1\x4D |0 \x4D\xCC |0 \x47\x9B |0 + \xB4\xAC |0 \xC1\x4E |0 \xC1\x4F |0 \x5B\xF5 |0 @@ -6887,6 +7263,7 @@ CHARMAP \xC1\x59 |0 \x47\xDE |0 \x4D\xE0 |0 + \xB4\xAD |0 \xC1\x5A |0 \x5B\xF8 |0 \x50\xD6 |0 @@ -6896,6 +7273,7 @@ CHARMAP \xC1\x5B |0 \x5B\xF6 |0 \x48\xF1 |0 + \xB4\xAE |0 \xC1\x5C |0 \xC1\x5D |0 \x5B\xF7 |0 @@ -6941,11 +7319,13 @@ CHARMAP \x5B\xFE |0 \x5B\xFE |1 \x5C\x45 |0 + \xB4\xB4 |0 \x50\xDA |0 \x5C\x47 |0 \xC1\x71 |0 \x52\xCC |0 \xC1\x72 |0 + \xB4\xB6 |0 \xC1\x73 |0 \x53\xBC |0 \xC1\x74 |0 @@ -6961,6 +7341,7 @@ CHARMAP \x48\x58 |0 \xC1\x78 |0 \xC1\x79 |0 + \xB4\xB7 |0 \x5C\x46 |0 \xC1\x7A |0 \x51\xE4 |0 @@ -6968,12 +7349,14 @@ CHARMAP \x53\x59 |0 \xC1\x7B |0 \x53\x61 |0 + \xB4\xB8 |0 \x5C\x4C |0 \x49\xAD |0 \x5C\x4A |0 \x5C\x4D |0 \xC1\x7C |0 \x5C\x49 |0 + \xB4\xBA |0 \x4E\xB1 |0 \xC1\x7D |0 \x5C\x60 |0 @@ -7001,6 +7384,7 @@ CHARMAP \x5C\x5E |0 \x5C\x54 |0 \x5C\x5D |0 + \xB4\xBB |0 \xC1\x86 |0 \x5C\x58 |0 \xC1\x87 |0 @@ -7015,6 +7399,7 @@ CHARMAP \x53\x75 |0 \xC1\x8E |0 \xC1\x8F |0 + \xB4\xBC |0 \x54\x94 |0 \x55\xB6 |0 \xC1\x90 |0 @@ -7022,9 +7407,11 @@ CHARMAP \xC1\x92 |0 \x54\x68 |0 \x5C\x4F |0 + \xB4\xBD |0 \x5C\x5C |0 \x4F\xF7 |0 \xC1\x93 |0 + \xB4\xBE |0 \x5C\x51 |0 \xC1\x94 |0 \xC1\x95 |0 @@ -7063,6 +7450,7 @@ CHARMAP \x4C\xBA |0 \xC1\xA0 |0 \xC1\xA1 |0 + \xB4\xC3 |0 \xC1\xA2 |0 \x51\xD7 |0 \xC1\xA3 |0 @@ -7130,6 +7518,7 @@ CHARMAP \xC1\xBB |0 \x51\x4A |0 \xC1\xBC |0 + \xB4\xC7 |0 \x5C\x80 |0 \x5C\x76 |0 \x53\xB2 |0 @@ -7140,6 +7529,7 @@ CHARMAP \xC1\xC0 |0 \x5C\x7C |0 \x5C\x77 |0 + \xB4\xC8 |0 \x5C\x7A |0 \x5C\x83 |0 \xC1\xC1 |0 @@ -7150,6 +7540,7 @@ CHARMAP \x4E\xFA |0 \x52\xDB |0 \x5C\x7D |0 + \xB4\xC9 |0 \x54\x8C |0 \xC1\xC3 |0 \x5C\x7B |0 @@ -7160,9 +7551,12 @@ CHARMAP \x5C\x81 |0 \x5C\x87 |0 \x5C\x90 |0 + \xB4\xCC |0 \xC1\xC6 |0 \x5C\x8F |0 \x5C\x89 |0 + \xB4\xCD |0 + \xB4\xCE |0 \x5C\x94 |0 \x5C\x92 |0 \xC1\xC7 |0 @@ -7170,7 +7564,9 @@ CHARMAP \xC1\xC9 |0 \x5C\x8E |0 \xC1\xCA |0 + \xB4\xCF |0 \xC1\xCB |0 + \xB4\xD0 |0 \x5C\x8D |0 \x4B\x5C |0 \x4D\xB7 |0 @@ -7209,6 +7605,7 @@ CHARMAP \x5C\x88 |0 \x5C\x9A |0 \xC1\xD8 |0 + \xB4\xD7 |0 \xC1\xD9 |0 \x55\x85 |0 \x5C\x9F |0 @@ -7249,6 +7646,7 @@ CHARMAP \x5C\xA8 |0 \x5C\xA9 |0 \x5C\xA0 |0 + \xB4\xD8 |0 \x5C\xAF |0 \x4F\xB2 |0 \x4F\xF5 |0 @@ -7263,6 +7661,7 @@ CHARMAP \x55\xEE |0 \x5C\xAA |0 \xC1\xF2 |0 + \xB4\xDA |0 \x5C\xB0 |0 \xC1\xF3 |0 \x4D\x55 |0 @@ -7270,6 +7669,7 @@ CHARMAP \xC1\xF5 |0 \xC1\xF6 |0 \x5C\x9E |0 + \xB4\xDB |0 \x5C\xAD |0 \x5C\xAE |0 \xC1\xF7 |0 @@ -7315,6 +7715,7 @@ CHARMAP \xC2\x4E |0 \xC2\x4F |0 \xC2\x50 |0 + \xB4\xE1 |0 \x5C\xC2 |0 \x52\xEE |0 \xC2\x51 |0 @@ -7327,6 +7728,7 @@ CHARMAP \xC2\x56 |0 \xC2\x57 |0 \x5C\xC1 |0 + \xB4\xE6 |0 \xC2\x58 |0 \xC2\x59 |0 \xC2\x5A |0 @@ -7380,24 +7782,29 @@ CHARMAP \x48\xD8 |0 \x45\x77 |0 \x4D\x4C |0 + \xB4\xEA |0 \x45\xB1 |0 \xC2\x6F |0 \x47\xD8 |0 \x55\x8E |0 \xC2\x70 |0 + \xB4\xEB |0 \xC2\x71 |0 \x4A\x9F |0 \xC2\x72 |0 \x48\xE4 |0 \x49\x55 |0 \xC2\x73 |0 + \xB4\xEC |0 \x5C\xD4 |0 \x5C\xD5 |0 + \xB4\xED |0 \x49\x99 |0 \xC2\x74 |0 \xC2\x75 |0 \x5C\xD6 |0 \x5C\xD7 |0 + \xB4\xEE |0 \xC2\x76 |0 \x5C\xD9 |0 \x5C\xD8 |0 @@ -7446,15 +7853,19 @@ CHARMAP \xC2\x89 |0 \x4A\x5B |0 \x5C\xE7 |0 + \xB4\xF1 |0 + \xB4\xF2 |0 \xC2\x8A |0 \x5C\xE8 |0 \xC2\x8B |0 \x49\x69 |0 \x49\xF5 |0 + \xB4\xF3 |0 \x4C\x97 |0 \x5C\xE9 |0 \x47\x4E |0 \x5C\xEA |0 + \xB4\xF4 |0 \x53\xD7 |0 \xC2\x8C |0 \x46\xE2 |0 @@ -7477,6 +7888,7 @@ CHARMAP \xC2\x98 |0 \x5C\xF0 |0 \xC2\x99 |0 + \xB4\xF5 |0 \xC2\x9A |0 \xC2\x9B |0 \x48\x8E |0 @@ -7548,6 +7960,7 @@ CHARMAP \x5D\x42 |0 \x5C\xFB |0 \x55\xD9 |0 + \xB4\xF7 |0 \xC2\xBA |0 \x5C\xFD |0 \xC2\xBB |0 @@ -7570,7 +7983,9 @@ CHARMAP \xC2\xC2 |0 \x50\x75 |0 \x45\x85 |0 + \xB4\xF9 |0 \x53\xEC |0 + \xB4\xFA |0 \x5D\x4D |0 \xC2\xC3 |0 \x5D\x50 |0 @@ -7619,6 +8034,7 @@ CHARMAP \x5D\x56 |0 \xC2\xD3 |0 \xC2\xD4 |0 + \xB4\xFB |0 \xC2\xD5 |0 \x5D\x54 |0 \x46\xF3 |0 @@ -7626,6 +8042,8 @@ CHARMAP \xC2\xD6 |0 \x4F\x57 |0 \xC2\xD7 |0 + \xB4\xFD |0 + \xB4\xFE |0 \x5D\x58 |0 \xC2\xD8 |0 \xC2\xD9 |0 @@ -7642,6 +8060,7 @@ CHARMAP \x54\x50 |0 \x4D\x98 |0 \x5D\x57 |0 + \xB5\x41 |0 \x45\xDC |0 \xC2\xDF |0 \xC2\xE0 |0 @@ -7654,6 +8073,7 @@ CHARMAP \xC2\xE4 |0 \x4B\x72 |0 \x5D\x5C |0 + \xB5\x42 |0 \x52\xAC |0 \x5D\x59 |0 \x50\xBC |0 @@ -7667,11 +8087,14 @@ CHARMAP \x4C\xC9 |0 \x46\x8D |0 \xC2\xE8 |0 + \xB5\x46 |0 \x5D\x66 |0 \x5D\x64 |0 + \xB5\x47 |0 \x45\xEA |0 \xC2\xE9 |0 \xC2\xEA |0 + \xB5\x48 |0 \xC2\xEB |0 \x5D\x5F |0 \x5D\x63 |0 @@ -7689,11 +8112,16 @@ CHARMAP \x4D\x41 |0 \x5D\x65 |0 \xC2\xEF |0 + \xB5\x4A |0 + \xB5\x4B |0 \xC2\xF0 |0 \x5D\x6A |0 \x5D\x60 |0 \x48\x6B |0 + \xB5\x4C |0 + \xB5\x4D |0 \x4F\x7D |0 + \xB5\x4E |0 \x5D\x67 |0 \xC2\xF1 |0 \xC2\xF2 |0 @@ -7707,7 +8135,9 @@ CHARMAP \x5D\x69 |0 \x55\x50 |0 \xC2\xF6 |0 + \xB5\x50 |0 \x5D\x72 |0 + \xB5\x51 |0 \x4F\x91 |0 \x4A\x45 |0 \xC2\xF7 |0 @@ -7719,6 +8149,7 @@ CHARMAP \xC2\xFA |0 \xC2\xFB |0 \x4A\x88 |0 + \xB5\x52 |0 \xC2\xFC |0 \x5D\x7C |0 \x5D\x75 |0 @@ -7729,12 +8160,14 @@ CHARMAP \x5D\x78 |0 \xC3\x41 |0 \x5D\x74 |0 + \xB5\x53 |0 \x4A\xBF |0 \x5D\x7B |0 \x5D\x82 |0 \xC3\x42 |0 \x55\xE1 |0 \x5D\x7E |0 + \xB5\x54 |0 \xC3\x43 |0 \xC3\x44 |0 \x5D\x77 |0 @@ -7775,6 +8208,7 @@ CHARMAP \x48\x92 |0 \x51\x98 |0 \x51\x64 |0 + \xB5\x56 |0 \x5D\x87 |0 \x50\xE4 |0 \x47\x8A |0 @@ -7796,6 +8230,7 @@ CHARMAP \x5D\x6E |0 \x48\xC6 |0 \xC3\x52 |0 + \xB5\x5B |0 \xC3\x53 |0 \x5D\x9A |0 \x5D\x8A |0 @@ -7810,6 +8245,7 @@ CHARMAP \xC3\x58 |0 \x4C\x88 |0 \xC3\x59 |0 + \xB5\x5C |0 \x5D\x91 |0 \x5D\x97 |0 \xC3\x5A |0 @@ -7857,12 +8293,14 @@ CHARMAP \x53\x76 |0 \xC3\x6C |0 \x5D\x9C |0 + \xB5\x5E |0 \xC3\x6D |0 \xC3\x6E |0 \x5D\xA0 |0 \xC3\x6F |0 \x5D\xA2 |0 \xC3\x70 |0 + \xB5\x5F |0 \x48\xBE |0 \x5D\x9E |0 \x54\x97 |0 @@ -7888,6 +8326,7 @@ CHARMAP \x52\x4A |0 \x5D\xA3 |0 \x5D\xA4 |0 + \xB5\x60 |0 \x47\xA3 |0 \x4D\xA1 |0 \xC3\x7B |0 @@ -7914,6 +8353,7 @@ CHARMAP \xC3\x84 |0 \xC3\x85 |0 \x50\xC4 |0 + \xB5\x61 |0 \x55\x75 |0 \x5D\xB6 |0 \x49\xED |0 @@ -7925,6 +8365,7 @@ CHARMAP \x50\x8E |0 \x4F\x58 |0 \x54\xE0 |0 + \xB5\x63 |0 \xC3\x8A |0 \xC3\x8B |0 \xC3\x8C |0 @@ -7936,6 +8377,7 @@ CHARMAP \x5D\xB0 |0 \x5D\xB2 |0 \xC3\x90 |0 + \xB5\x64 |0 \xC3\x91 |0 \x4D\x73 |0 \xC3\x92 |0 @@ -7958,6 +8400,7 @@ CHARMAP \xC3\x9B |0 \xC3\x9C |0 \x46\xC2 |0 + \xB5\x65 |0 \xC3\x9D |0 \xC3\x9E |0 \x4A\xD2 |0 @@ -7993,6 +8436,7 @@ CHARMAP \xC3\xAB |0 \xC3\xAC |0 \x54\xBA |0 + \xB5\x67 |0 \xC3\xAD |0 \xC3\xAE |0 \xC3\xAF |0 @@ -8013,6 +8457,7 @@ CHARMAP \xC3\xB7 |0 \x5D\xCC |0 \xC3\xB8 |0 + \xB5\x69 |0 \x4B\xD0 |0 \x50\xBE |0 \x5D\xCF |0 @@ -8021,6 +8466,7 @@ CHARMAP \x5D\xC4 |0 \xC3\xBA |0 \xC3\xBB |0 + \xB5\x6A |0 \xC3\xBC |0 \x5D\xD4 |0 \x5D\xD1 |0 @@ -8054,6 +8500,7 @@ CHARMAP \xC3\xC6 |0 \x5D\xD8 |0 \x5D\xD9 |0 + \xB5\x6B |0 \x5D\xDA |0 \xC3\xC7 |0 \x5D\xDE |0 @@ -8078,10 +8525,12 @@ CHARMAP \xC3\xCC |0 \xC3\xCD |0 \xC3\xCE |0 + \xB5\x6D |0 \xC3\xCF |0 \x5D\xE6 |0 \xC3\xD0 |0 \xC3\xD1 |0 + \xB5\x6F |0 \xC3\xD2 |0 \xC3\xD3 |0 \xC3\xD4 |0 @@ -8097,6 +8546,7 @@ CHARMAP \x5D\xE9 |0 \xC3\xDB |0 \xC3\xDC |0 + \xB5\x71 |0 \x47\x85 |0 \xC3\xDD |0 \xC3\xDE |0 @@ -8122,6 +8572,7 @@ CHARMAP \xC3\xE8 |0 \x5D\xEB |0 \xC3\xE9 |0 + \xB5\x72 |0 \xC3\xEA |0 \x5D\xED |0 \x5D\xEE |0 @@ -8152,6 +8603,7 @@ CHARMAP \x53\x8C |0 \x5D\xF1 |0 \xC3\xF7 |0 + \xB5\x75 |0 \x5D\xF7 |0 \x55\x87 |0 \xC3\xF8 |0 @@ -8161,6 +8613,7 @@ CHARMAP \xC3\xFA |0 \xC3\xFB |0 \xC3\xFC |0 + \xB5\x76 |0 \x5D\xF4 |0 \xC3\xFD |0 \xC3\xFE |0 @@ -8175,6 +8628,7 @@ CHARMAP \x4D\xE6 |0 \xC4\x43 |0 \xC4\x44 |0 + \xB5\x78 |0 \xC4\x45 |0 \xC4\x46 |0 \xC4\x47 |0 @@ -8191,7 +8645,9 @@ CHARMAP \x5E\x42 |0 \x54\x90 |0 \xC4\x4D |0 + \xB5\x79 |0 \xC4\x4E |0 + \xB5\x7A |0 \x68\x85 |0 \x5E\x43 |0 \xC4\x4F |0 @@ -8222,6 +8678,7 @@ CHARMAP \xC4\x59 |0 \x52\x9D |0 \x5E\x48 |0 + \xB5\x7D |0 \x4F\x68 |0 \xC4\x5A |0 \xC4\x5B |0 @@ -8230,6 +8687,7 @@ CHARMAP \xC4\x5D |0 \x54\xBB |0 \x5E\x4A |0 + \xB5\x7E |0 \xC4\x5E |0 \xC4\x5F |0 \x47\xD5 |0 @@ -8281,6 +8739,7 @@ CHARMAP \x5E\x5C |0 \x5E\x5D |0 \xC4\x72 |0 + \xB5\x81 |0 \xC4\x73 |0 \xC4\x74 |0 \x53\x7C |0 @@ -8323,6 +8782,7 @@ CHARMAP \xC4\x84 |0 \xC4\x85 |0 \xC4\x86 |0 + \xB5\x83 |0 \x5E\x69 |0 \x53\xFC |0 \xC4\x87 |0 @@ -8372,12 +8832,14 @@ CHARMAP \xC4\x9D |0 \xC4\x9E |0 \x4C\xA7 |0 + \xB5\x87 |0 \x5E\x73 |0 \x5E\x74 |0 \xC4\x9F |0 \x48\x52 |0 \x5E\x79 |0 \x5E\x75 |0 + \xB5\x88 |0 \xC4\xA0 |0 \x4E\x5A |0 \x5E\x76 |0 @@ -8444,10 +8906,12 @@ CHARMAP \x5E\x89 |0 \xC4\xBD |0 \xC4\xBE |0 + \xB5\x8D |0 \x5E\x87 |0 \xC4\xBF |0 \x50\x4F |0 \x53\xDD |0 + \xB5\x8F |0 \xC4\xC0 |0 \xC4\xC1 |0 \xC4\xC2 |0 @@ -8496,10 +8960,12 @@ CHARMAP \xC4\xDB |0 \x47\x83 |0 \x45\xFD |0 + \xB5\x92 |0 \x49\xB1 |0 \xC4\xDC |0 \xC4\xDD |0 \xC4\xDE |0 + \xB5\x93 |0 \xC4\xDF |0 \x4D\xE9 |0 \xC4\xE0 |0 @@ -8511,6 +8977,7 @@ CHARMAP \xC4\xE6 |0 \xC4\xE7 |0 \xC4\xE8 |0 + \xB5\x94 |0 \x4E\x4C |0 \xC4\xE9 |0 \xC4\xEA |0 @@ -8573,6 +9040,7 @@ CHARMAP \x50\xF7 |0 \xC5\x49 |0 \xC5\x4A |0 + \xB5\x95 |0 \xC5\x4B |0 \xC5\x4C |0 \x4E\x5C |0 @@ -8607,6 +9075,7 @@ CHARMAP \xC5\x5C |0 \xC5\x5D |0 \xC5\x5E |0 + \xB5\x97 |0 \x5E\xB1 |0 \xC5\x5F |0 \x5E\xB4 |0 @@ -8641,12 +9110,14 @@ CHARMAP \xC5\x6B |0 \xC5\x6C |0 \xC5\x6D |0 + \xB5\x98 |0 \x5E\xBD |0 \x50\x4D |0 \xC5\x6E |0 \xC5\x6F |0 \xC5\x70 |0 \xC5\x71 |0 + \xB5\x99 |0 \xC5\x72 |0 \xC5\x73 |0 \xC5\x74 |0 @@ -8657,6 +9128,7 @@ CHARMAP \xC5\x77 |0 \x5E\xC2 |0 \xC5\x78 |0 + \xB5\x9B |0 \xC5\x79 |0 \x5E\xC3 |0 \xC5\x7A |0 @@ -8670,6 +9142,7 @@ CHARMAP \xC5\x81 |0 \xC5\x82 |0 \xC5\x83 |0 + \xB5\x9C |0 \xC5\x84 |0 \x52\x49 |0 \xC5\x85 |0 @@ -8681,6 +9154,7 @@ CHARMAP \xC5\x89 |0 \xC5\x8A |0 \x5E\xC6 |0 + \xB5\x9D |0 \xC5\x8B |0 \xC5\x8C |0 \xC5\x8D |0 @@ -8791,10 +9265,12 @@ CHARMAP \x52\xFD |0 \x48\xB9 |0 \x5E\xE6 |0 + \xB5\xA2 |0 \x5E\xE9 |0 \x5E\xE7 |0 \x4A\xA9 |0 \xC5\xB4 |0 + \xB5\xA3 |0 \x4E\x54 |0 \x5E\xE8 |0 \x5E\xEB |0 @@ -8815,6 +9291,7 @@ CHARMAP \x5E\xF0 |0 \x5E\xEF |0 \x4E\xA0 |0 + \xB5\xA5 |0 \x51\x71 |0 \x55\xB0 |0 \xC5\xBD |0 @@ -8832,11 +9309,13 @@ CHARMAP \xC5\xC4 |0 \x5E\xF4 |0 \x50\xCE |0 + \xB5\xA9 |0 \x5E\xFD |0 \x4D\x97 |0 \x5E\xF7 |0 \xC5\xC5 |0 \x5E\xF9 |0 + \xB5\xAA |0 \x5E\xFB |0 \x54\xE1 |0 \xC5\xC6 |0 @@ -8858,6 +9337,7 @@ CHARMAP \xC5\xCD |0 \xC5\xCE |0 \x5F\x42 |0 + \xB5\xAB |0 \x51\x82 |0 \x53\xFD |0 \xC5\xCF |0 @@ -8865,6 +9345,7 @@ CHARMAP \x5F\x43 |0 \x4C\x47 |0 \xC5\xD0 |0 + \xB5\xAC |0 \x5F\x45 |0 \xC5\xD1 |0 \xC5\xD2 |0 @@ -8904,6 +9385,7 @@ CHARMAP \xC5\xE5 |0 \xC5\xE6 |0 \xC5\xE7 |0 + \xB5\xAF |0 \xC5\xE8 |0 \xC5\xE9 |0 \xC5\xEA |0 @@ -8918,6 +9400,7 @@ CHARMAP \xC5\xEE |0 \xC5\xEF |0 \x5F\x51 |0 + \xB5\xB1 |0 \xC5\xF0 |0 \xC5\xF1 |0 \x5F\x57 |0 @@ -8998,6 +9481,7 @@ CHARMAP \x5F\x71 |0 \xC6\x53 |0 \xC6\x54 |0 + \xB5\xB6 |0 \xC6\x55 |0 \xC6\x56 |0 \xC6\x57 |0 @@ -9008,8 +9492,10 @@ CHARMAP \xC6\x5B |0 \xC6\x5C |0 \x49\xDA |0 + \xB5\xB7 |0 \x5F\x74 |0 \x5F\x75 |0 + \xB5\xB8 |0 \x68\x68 |0 \x5F\x76 |0 \x5F\x77 |0 @@ -9111,6 +9597,7 @@ CHARMAP \xC6\x8B |0 \xC6\x8C |0 \xC6\x8D |0 + \xB5\xBF |0 \x5F\x90 |0 \x5F\x93 |0 \xC6\x8E |0 @@ -9134,6 +9621,7 @@ CHARMAP \xC6\x9A |0 \x5F\x97 |0 \xC6\x9B |0 + \xB5\xC1 |0 \xC6\x9C |0 \x5F\x96 |0 \x5F\x95 |0 @@ -9152,8 +9640,10 @@ CHARMAP \xC6\xA5 |0 \x5F\x9B |0 \xC6\xA6 |0 + \xB5\xC5 |0 \x55\x72 |0 \xC6\xA7 |0 + \xB5\xC6 |0 \xC6\xA8 |0 \x4D\xB0 |0 \x52\x7D |0 @@ -9215,6 +9705,7 @@ CHARMAP \x5F\xAD |0 \x46\xD3 |0 \x4C\xC3 |0 + \xB5\xCA |0 \xC6\xC6 |0 \x5F\xB0 |0 \x5F\xAE |0 @@ -9223,6 +9714,7 @@ CHARMAP \x4D\x45 |0 \x54\xB4 |0 \x52\x48 |0 + \xB5\xC9 |0 \xC6\xC9 |0 \xC6\xCA |0 \xC6\xCB |0 @@ -9239,6 +9731,8 @@ CHARMAP \xC6\xD1 |0 \xC6\xD2 |0 \x5F\xB2 |0 + \xB5\xCB |0 + \xB5\xCC |0 \xC6\xD3 |0 \xC6\xD4 |0 \x49\x76 |0 @@ -9331,9 +9825,11 @@ CHARMAP \x5F\xCB |0 \xC7\x44 |0 \xC7\x45 |0 + \xB5\xD1 |0 \xC7\x46 |0 \xC7\x47 |0 \x5F\xCA |0 + \xB5\xD2 |0 \xC7\x48 |0 \xC7\x49 |0 \x51\xB0 |0 @@ -9346,6 +9842,7 @@ CHARMAP \x4D\xF0 |0 \x5F\xCE |0 \xC7\x4D |0 + \xB5\xD4 |0 \xC7\x4E |0 \xC7\x4F |0 \xC7\x50 |0 @@ -9358,6 +9855,7 @@ CHARMAP \x5F\xD0 |0 \x5F\xCF |0 \xC7\x55 |0 + \xB5\xD5 |0 \x5F\xD1 |0 \xC7\x56 |0 \xC7\x57 |0 @@ -9457,6 +9955,8 @@ CHARMAP \x5F\xE3 |0 \xC7\x84 |0 \x46\x58 |0 + \xB5\xDF |0 + \xB5\xE0 |0 \xC7\x85 |0 \x48\xED |0 \x4D\xBA |0 @@ -9606,6 +10106,7 @@ CHARMAP \x55\x9E |0 \xC7\xCC |0 \xC7\xCD |0 + \xB5\xEC |0 \x60\x47 |0 \x60\x46 |0 \x60\x49 |0 @@ -9664,6 +10165,7 @@ CHARMAP \x60\x60 |0 \x60\x5F |0 \x49\xB5 |0 + \xB5\xF1 |0 \xC7\xDC |0 \x53\xE7 |0 \x60\x65 |0 @@ -9690,6 +10192,7 @@ CHARMAP \x60\x67 |0 \x60\x64 |0 \x49\x6E |0 + \xB5\xF3 |0 \xC7\xE9 |0 \xC7\xEA |0 \xC7\xEB |0 @@ -9729,7 +10232,9 @@ CHARMAP \x60\x70 |0 \x60\x6E |0 \xC7\xF9 |0 + \xB5\xF6 |0 \x60\x6F |0 + \xB5\xF7 |0 \xC7\xFA |0 \x55\x9B |0 \x4F\x51 |0 @@ -9799,6 +10304,7 @@ CHARMAP \x60\x84 |0 \xC8\x5A |0 \x54\x44 |0 + \xB5\xFE |0 \xC8\x5B |0 \x60\x8C |0 \xC8\x5C |0 @@ -9830,7 +10336,7 @@ CHARMAP \x51\x7C |0 \xC8\x6D |0 \xC8\x6E |0 - \x54\xCA |1 + \xB6\x41 |0 \x60\x92 |0 \xC8\x6F |0 \x4B\xEC |0 @@ -9855,6 +10361,7 @@ CHARMAP \x4F\x4C |0 \x60\x96 |0 \x60\x98 |0 + \xB6\x43 |0 \xC8\x7A |0 \xC8\x7B |0 \x60\x97 |0 @@ -9867,6 +10374,7 @@ CHARMAP \x4F\x99 |0 \xC8\x7F |0 \x60\x99 |0 + \xB6\x45 |0 \x60\x9B |0 \xC8\x80 |0 \xC8\x81 |0 @@ -9885,6 +10393,7 @@ CHARMAP \x60\x9E |0 \xC8\x8A |0 \xC8\x8B |0 + \xB6\x46 |0 \xC8\x8C |0 \xC8\x8D |0 \x46\x6F |0 @@ -10118,6 +10627,7 @@ CHARMAP \x60\xD6 |0 \x49\xDC |0 \x48\x9D |0 + \xB6\x58 |0 \xC8\xE9 |0 \xC8\xEA |0 \xC8\xEB |0 @@ -10144,6 +10654,7 @@ CHARMAP \x4A\x80 |0 \x60\xE7 |0 \xC8\xF3 |0 + \xB6\x5A |0 \x60\xE2 |0 \xC8\xF4 |0 \xC8\xF5 |0 @@ -10239,6 +10750,7 @@ CHARMAP \xC9\x5D |0 \x4B\x69 |0 \xC9\x5E |0 + \xB6\x60 |0 \xC9\x5F |0 \x61\x43 |0 \x61\x47 |0 @@ -10400,6 +10912,7 @@ CHARMAP \xC9\xA3 |0 \x52\xA0 |0 \x49\x85 |0 + \xB6\x69 |0 \x47\x60 |0 \x61\x81 |0 \x46\x70 |0 @@ -10447,6 +10960,7 @@ CHARMAP \xC9\xBD |0 \x61\x88 |0 \xC9\xBE |0 + \xB6\x6B |0 \xC9\xBF |0 \x61\x8B |0 \x61\x8A |0 @@ -10473,6 +10987,7 @@ CHARMAP \x61\x94 |0 \x48\xD7 |0 \x61\x95 |0 + \xB6\x6C |0 \x61\x96 |0 \x53\xE4 |0 \x61\x97 |0 @@ -10489,6 +11004,7 @@ CHARMAP \x61\x9A |0 \x52\x67 |0 \x52\x6A |0 + \xB6\x6D |0 \x61\x9B |0 \x52\x92 |0 \xC9\xC9 |0 @@ -10496,6 +11012,7 @@ CHARMAP \xC9\xCA |0 \x4C\xC5 |0 \x53\x82 |0 + \xB6\x6E |0 \x49\x7B |0 \xC9\xCB |0 \xC9\xCC |0 @@ -10513,8 +11030,10 @@ CHARMAP \x50\x4E |0 \x4D\xF6 |0 \x61\xA3 |0 + \xB6\x6F |0 \x4E\x9B |0 \xC9\xD0 |0 + \xB6\x70 |0 \x4A\xB2 |0 \xC9\xD1 |0 \x52\x63 |0 @@ -10534,6 +11053,7 @@ CHARMAP \x4D\x63 |0 \x4E\xE9 |0 \x61\xA0 |0 + \xB6\x71 |0 \xC9\xD9 |0 \xC9\xDA |0 \x61\xA6 |0 @@ -10542,10 +11062,12 @@ CHARMAP \xC9\xDC |0 \xC9\xDD |0 \x4E\xAB |0 + \xB6\x73 |0 \xC9\xDE |0 \x4B\xE3 |0 \xC9\xDF |0 \xC9\xE0 |0 + \xB6\x74 |0 \x61\xB0 |0 \x47\x4F |0 \xC9\xE1 |0 @@ -10558,6 +11080,7 @@ CHARMAP \x61\xA5 |0 \x53\x5E |0 \xC9\xE3 |0 + \xB6\x77 |0 \xC9\xE4 |0 \xC9\xE5 |0 \xC9\xE6 |0 @@ -10579,6 +11102,7 @@ CHARMAP \x55\xE9 |0 \xC9\xEF |0 \xC9\xF0 |0 + \xB6\x79 |0 \x61\xAD |0 \x61\xB0 |1 \xC9\xF1 |0 @@ -10656,6 +11180,7 @@ CHARMAP \x61\xC6 |0 \x53\x5F |0 \x61\xC8 |0 + \xB6\x7F |0 \x61\xC9 |0 \xCA\x51 |0 \xCA\x52 |0 @@ -10670,6 +11195,7 @@ CHARMAP \x61\xCD |0 \x4D\xBD |0 \xCA\x57 |0 + \xB6\x80 |0 \xCA\x58 |0 \x61\xCE |0 \x61\xCF |0 @@ -10708,6 +11234,7 @@ CHARMAP \x61\xD6 |0 \x61\xD7 |0 \xCA\x6A |0 + \xB6\x87 |0 \x61\xD8 |0 \x53\x58 |0 \x46\x6A |0 @@ -10748,17 +11275,20 @@ CHARMAP \x61\xE0 |0 \x46\x7B |0 \xCA\x76 |0 + \xB6\x8B |0 \x61\xE2 |0 \xCA\x77 |0 \xCA\x78 |0 \xCA\x79 |0 \xCA\x7A |0 \x4D\xFC |0 + \xB6\x8C |0 \xCA\x7B |0 \xCA\x7C |0 \xCA\x7D |0 \xCA\x7E |0 \xCA\x7F |0 + \xB6\x90 |0 \x54\xAE |0 \x61\xE3 |0 \x61\xE4 |0 @@ -10783,6 +11313,7 @@ CHARMAP \x4D\x54 |0 \x61\xED |0 \x53\xC5 |0 + \xB6\x96 |0 \xCA\x86 |0 \xCA\x87 |0 \x61\xEE |0 @@ -10799,6 +11330,7 @@ CHARMAP \xCA\x90 |0 \xCA\x91 |0 \x61\xF0 |0 + \xB6\x98 |0 \xCA\x92 |0 \xCA\x93 |0 \xCA\x94 |0 @@ -10886,6 +11418,7 @@ CHARMAP \x62\x45 |0 \xCA\xBA |0 \xCA\xBB |0 + \xB6\x99 |0 \x4E\xC9 |0 \x62\x4A |0 \x53\xF6 |0 @@ -10939,6 +11472,7 @@ CHARMAP \xCA\xD6 |0 \x4B\x62 |0 \x62\x48 |0 + \xB6\x9C |0 \xCA\xD7 |0 \x62\x5F |0 \x62\x5A |0 @@ -11005,6 +11539,8 @@ CHARMAP \xCA\xF4 |0 \x53\xD4 |0 \x62\x70 |0 + \xB6\x9F |0 + \xB6\xA0 |0 \xCA\xF5 |0 \x51\x6A |0 \xCA\xF6 |0 @@ -11035,6 +11571,7 @@ CHARMAP \xCA\xFE |0 \x62\x66 |0 \xCB\x41 |0 + \xB6\xA2 |0 \xCB\x42 |0 \x62\x73 |0 \x54\xD8 |0 @@ -11066,6 +11603,7 @@ CHARMAP \xCB\x4F |0 \x48\xDF |0 \xCB\x50 |0 + \xB6\xA5 |0 \xCB\x51 |0 \x55\x47 |0 \x62\x78 |0 @@ -11103,6 +11641,7 @@ CHARMAP \xCB\x60 |0 \x4F\xE3 |0 \xCB\x61 |0 + \xB6\xA6 |0 \x50\x95 |0 \x52\x59 |0 \xCB\x62 |0 @@ -11137,6 +11676,7 @@ CHARMAP \x4F\x6D |0 \xCB\x70 |0 \x62\x8B |0 + \xB6\xA8 |0 \xCB\x71 |0 \x62\x8E |0 \x4F\x9A |0 @@ -11175,6 +11715,7 @@ CHARMAP \x62\x97 |0 \x62\x98 |0 \x54\x9A |0 + \xB6\xAA |0 \xCB\x83 |0 \xCB\x84 |0 \x62\x9A |0 @@ -11196,6 +11737,7 @@ CHARMAP \x46\x5E |0 \xCB\x90 |0 \x54\xD1 |0 + \xB6\xAE |0 \xCB\x91 |0 \x62\xA0 |0 \x62\xA5 |0 @@ -11299,11 +11841,13 @@ CHARMAP \x62\xC0 |0 \x62\xC1 |0 \xCB\xC3 |0 + \xB6\xB4 |0 \xCB\xC4 |0 \x62\xC4 |0 \x62\xC2 |0 \xCB\xC5 |0 \xCB\xC6 |0 + \xB6\xB5 |0 \x45\x68 |0 \x62\xC3 |0 \xCB\xC7 |0 @@ -11343,6 +11887,7 @@ CHARMAP \xCB\xD9 |0 \xCB\xDA |0 \x62\xCA |0 + \xB6\xB6 |0 \xCB\xDB |0 \xCB\xDC |0 \x4C\xA6 |0 @@ -11350,6 +11895,7 @@ CHARMAP \x62\xCC |0 \xCB\xDD |0 \xCB\xDE |0 + \xB6\xB9 |0 \xCB\xDF |0 \xCB\xE0 |0 \xCB\xE1 |0 @@ -11370,6 +11916,7 @@ CHARMAP \xCB\xEA |0 \xCB\xEB |0 \x4F\x72 |0 + \xB6\xBB |0 \x52\x50 |0 \xCB\xEC |0 \x55\x88 |0 @@ -11391,7 +11938,9 @@ CHARMAP \x51\xB6 |0 \xCB\xF8 |0 \x51\x44 |0 + \xB6\xBE |0 \xCB\xF9 |0 + \xB6\xBF |0 \x4F\xAA |0 \x62\xD8 |0 \x62\xDA |0 @@ -11403,6 +11952,7 @@ CHARMAP \xCB\xFD |0 \xCB\xFE |0 \xCC\x41 |0 + \xB6\xC0 |0 \xCC\x42 |0 \x62\xD6 |0 \x55\xA2 |0 @@ -11450,6 +12000,7 @@ CHARMAP \xCC\x5A |0 \x55\xC2 |0 \xCC\x5B |0 + \xB6\xC1 |0 \xCC\x5C |0 \x62\xE6 |0 \x62\xE7 |0 @@ -11514,6 +12065,7 @@ CHARMAP \x62\xFD |0 \xCC\x7B |0 \x62\xFE |0 + \xB6\xC3 |0 \x63\x49 |0 \x53\x47 |0 \x63\x42 |0 @@ -11537,6 +12089,7 @@ CHARMAP \x4E\x6E |0 \x62\xFC |0 \xCC\x84 |0 + \xB6\xC4 |0 \x63\x4B |0 \x63\x44 |0 \xCC\x85 |0 @@ -11596,14 +12149,17 @@ CHARMAP \xCC\xAA |0 \xCC\xAB |0 \xCC\xAC |0 + \xB6\xCC |0 + \xB6\xCD |0 \xCC\xAD |0 \xCC\xAE |0 - \x53\xE8 |1 + \xB6\xCE |0 \xCC\xAF |0 \x63\x5A |0 \xCC\xB0 |0 \x63\x5B |0 \xCC\xB1 |0 + \xB6\xCF |0 \x63\x63 |0 \x63\x64 |0 \xCC\xB2 |0 @@ -11689,6 +12245,7 @@ CHARMAP \x46\xC0 |0 \xCC\xDF |0 \x63\x75 |0 + \xB6\xD3 |0 \x4F\x54 |0 \xCC\xE0 |0 \x63\x7A |0 @@ -11728,6 +12285,7 @@ CHARMAP \x63\x85 |0 \x54\x48 |0 \xCC\xEC |0 + \xB6\xD5 |0 \xCC\xED |0 \xCC\xEE |0 \x63\x84 |0 @@ -11804,6 +12362,7 @@ CHARMAP \xCD\x51 |0 \xCD\x52 |0 \x63\x9E |0 + \xB6\xDB |0 \x63\xA0 |0 \xCD\x53 |0 \xCD\x54 |0 @@ -11851,6 +12410,7 @@ CHARMAP \xCD\x6C |0 \x63\xAC |0 \x45\x58 |0 + \xB6\xDF |0 \x46\x55 |0 \x63\xAD |0 \x4D\xF2 |0 @@ -11942,6 +12502,7 @@ CHARMAP \xCD\x93 |0 \x50\xEF |0 \xCD\x94 |0 + \xB6\xE3 |0 \xCD\x95 |0 \x54\xCC |0 \xCD\x96 |0 @@ -12070,6 +12631,7 @@ CHARMAP \x63\xE0 |0 \x63\xE2 |0 \x4B\xC1 |0 + \xB6\xE5 |0 \xCD\xCC |0 \x51\x81 |0 \xCD\xCD |0 @@ -12115,6 +12677,7 @@ CHARMAP \xCD\xDA |0 \xCD\xDB |0 \x63\xF3 |0 + \xB6\xE8 |0 \x52\xF9 |0 \x63\xF7 |0 \xCD\xDC |0 @@ -12153,6 +12716,7 @@ CHARMAP \xCD\xEA |0 \x64\x44 |0 \x64\x43 |0 + \xB6\xEB |0 \xCD\xEB |0 \x64\x45 |0 \xCD\xEC |0 @@ -12166,6 +12730,7 @@ CHARMAP \x64\x4C |0 \xCD\xEF |0 \x4A\xD7 |0 + \xB6\xEC |0 \x64\x4B |0 \x64\x4D |0 \xCD\xF0 |0 @@ -12202,6 +12767,7 @@ CHARMAP \x64\x54 |0 \x64\x58 |0 \xCD\xFE |0 + \xB6\xED |0 \xCE\x41 |0 \xCE\x42 |0 \x45\x81 |0 @@ -12336,6 +12902,7 @@ CHARMAP \x52\xC1 |0 \xCE\x77 |0 \x64\x7C |0 + \xB6\xF5 |0 \xCE\x78 |0 \x64\x7D |0 \xCE\x79 |0 @@ -12357,6 +12924,7 @@ CHARMAP \x64\x82 |0 \x55\x84 |0 \x64\x84 |0 + \xB6\xF8 |0 \x64\x83 |0 \x64\x86 |0 \x64\x85 |0 @@ -12458,6 +13026,7 @@ CHARMAP \x64\xA0 |0 \x4C\xA8 |0 \xCE\xB5 |0 + \xB6\xFA |0 \x4D\x7C |0 \x64\xA3 |0 \xCE\xB6 |0 @@ -12539,6 +13108,7 @@ CHARMAP \x64\xBD |0 \x64\xBF |0 \xCE\xE1 |0 + \xB7\x41 |0 \x64\xC0 |0 \xCE\xE2 |0 \xCE\xE3 |0 @@ -12558,6 +13128,7 @@ CHARMAP \x64\xC3 |0 \xCE\xEB |0 \xCE\xEC |0 + \xB7\x42 |0 \xCE\xED |0 \xCE\xEE |0 \x64\xC4 |0 @@ -12629,6 +13200,7 @@ CHARMAP \xCF\x50 |0 \x4E\xF4 |0 \x48\xB7 |0 + \xB7\x48 |0 \xCF\x51 |0 \xCF\x52 |0 \xCF\x53 |0 @@ -12653,6 +13225,7 @@ CHARMAP \x64\xE1 |0 \xCF\x5C |0 \x64\xE0 |0 + \xB7\x49 |0 \x64\xE2 |0 \x54\xEE |0 \x64\xE3 |0 @@ -12692,6 +13265,7 @@ CHARMAP \x47\xDF |0 \x52\xE5 |0 \x48\x45 |0 + \xB7\x4C |0 \xCF\x6D |0 \xCF\x6E |0 \x64\xF0 |0 @@ -12913,6 +13487,7 @@ CHARMAP \x51\x62 |0 \xCF\xC6 |0 \xCF\xC7 |0 + \xB7\x55 |0 \xCF\xC8 |0 \x4C\xB7 |0 \xCF\xC9 |0 @@ -12958,6 +13533,7 @@ CHARMAP \xCF\xE7 |0 \xCF\xE8 |0 \xCF\xE9 |0 + \xB7\x57 |0 \xCF\xEA |0 \xCF\xEB |0 \x4F\x73 |0 @@ -13044,6 +13620,7 @@ CHARMAP \x65\x80 |0 \xD0\x57 |0 \xD0\x58 |0 + \xB7\x58 |0 \xD0\x59 |0 \x53\x46 |0 \x53\xBF |0 @@ -13108,6 +13685,7 @@ CHARMAP \x65\x94 |0 \x65\x97 |0 \xD0\x70 |0 + \xB7\x5B |0 \xD0\x71 |0 \xD0\x72 |0 \xD0\x73 |0 @@ -13149,6 +13727,7 @@ CHARMAP \xD0\x87 |0 \x65\xA2 |0 \x65\xA5 |0 + \xB7\x5C |0 \x65\x99 |0 \xD0\x88 |0 \x65\xA3 |0 @@ -13256,6 +13835,7 @@ CHARMAP \xD0\xC6 |0 \x55\xBE |0 \x48\xC1 |0 + \xB7\x62 |0 \x51\xE7 |0 \x53\x94 |0 \x65\xC2 |0 @@ -13264,6 +13844,7 @@ CHARMAP \x65\xC9 |0 \xD0\xC7 |0 \x65\xCE |0 + \xB7\x63 |0 \x55\xD2 |0 \xD0\xC8 |0 \xD0\xC9 |0 @@ -13306,6 +13887,7 @@ CHARMAP \xD0\xD7 |0 \x51\xF7 |0 \xD0\xD8 |0 + \xB7\x66 |0 \x4B\x48 |0 \x55\xD3 |0 \xD0\xD9 |0 @@ -13326,6 +13908,7 @@ CHARMAP \xD0\xE2 |0 \xD0\xE3 |0 \xD0\xE4 |0 + \xB7\x67 |0 \x4F\x70 |0 \xD0\xE5 |0 \x65\xD3 |0 @@ -13406,6 +13989,8 @@ CHARMAP \xD1\x55 |0 \xD1\x56 |0 \x65\xDF |0 + \xB7\x6E |0 + \xB7\x6F |0 \xD1\x57 |0 \x65\xE8 |0 \xD1\x58 |0 @@ -13494,6 +14079,7 @@ CHARMAP \x66\x47 |0 \x51\x9C |0 \xD1\x85 |0 + \xB7\x72 |0 \x66\x48 |0 \xD1\x86 |0 \x4B\x7D |0 @@ -13581,6 +14167,7 @@ CHARMAP \xD1\xAE |0 \x47\xBC |0 \xD1\xAF |0 + \xB7\x77 |0 \xD1\xB0 |0 \xD1\xB1 |0 \xD1\xB2 |0 @@ -13679,6 +14266,7 @@ CHARMAP \xD1\xD2 |0 \x4F\xDA |0 \x4E\xD5 |0 + \xB7\x7E |0 \x4F\x64 |0 \x51\xA4 |0 \x45\x70 |0 @@ -13733,6 +14321,7 @@ CHARMAP \x66\x92 |0 \x66\x91 |0 \x66\x8F |0 + \xB7\x83 |0 \x66\x93 |0 \x66\x8D |0 \xD1\xE2 |0 @@ -13751,6 +14340,7 @@ CHARMAP \xD1\xE9 |0 \x4B\xC6 |0 \x66\x97 |0 + \xB7\x85 |0 \x5B\xCF |0 \x66\x98 |0 \x66\x99 |0 @@ -13761,6 +14351,7 @@ CHARMAP \x66\x9E |0 \x66\x9D |0 \x66\x9C |0 + \xB7\x86 |0 \x66\x9F |0 \x66\xA1 |0 \xD1\xEB |0 @@ -13887,6 +14478,7 @@ CHARMAP \x4C\xD9 |0 \x4D\x5B |0 \x49\x46 |0 + \xB7\x8A |0 \x4A\x97 |0 \x47\xB2 |0 \xD2\x6F |0 @@ -13979,17 +14571,21 @@ CHARMAP \xD2\x98 |0 \xD2\x99 |0 \xD2\x9A |0 + \xB7\x90 |0 \xD2\x9B |0 \xD2\x9C |0 \x66\xD8 |0 \x66\xD7 |0 \xD2\x9D |0 \x66\xD9 |0 + \xB7\x91 |0 \xD2\x9E |0 + \xB7\x92 |0 \xD2\x9F |0 \x48\x8A |0 \x66\xDA |0 \x46\xB8 |0 + \xB7\x94 |0 \xD2\xA0 |0 \x53\xCE |0 \xD2\xA1 |0 @@ -14002,6 +14598,8 @@ CHARMAP \x66\xDB |0 \x5C\xCA |0 \x46\xB5 |0 + \xB7\x95 |0 + \xB7\x96 |0 \x4B\xA3 |0 \xD2\xA6 |0 \x52\x45 |0 @@ -14086,6 +14684,7 @@ CHARMAP \xD2\xCF |0 \x66\xF9 |0 \xD2\xD0 |0 + \xB7\x9B |0 \x66\xFA |0 \xD2\xD1 |0 \x4B\x85 |0 @@ -14139,6 +14738,7 @@ CHARMAP \x67\x4B |0 \xD2\xE9 |0 \x67\x4A |0 + \xB7\x9D |0 \xD2\xEA |0 \xD2\xEB |0 \x4C\xC0 |0 @@ -14147,6 +14747,7 @@ CHARMAP \xD2\xED |0 \xD2\xEE |0 \x67\x4E |0 + \xB7\x9E |0 \xD2\xEF |0 \xD2\xF0 |0 \x50\x58 |0 @@ -14157,6 +14758,7 @@ CHARMAP \x48\xB4 |0 \xD2\xF3 |0 \x67\x4F |0 + \xB7\x9F |0 \xD2\xF4 |0 \xD2\xF5 |0 \xD2\xF6 |0 @@ -14168,6 +14770,7 @@ CHARMAP \xD2\xFA |0 \xD2\xFB |0 \x4E\x5E |0 + \xB7\xA0 |0 \xD2\xFC |0 \xD2\xFD |0 \xD2\xFE |0 @@ -14187,11 +14790,12 @@ CHARMAP \x67\x58 |0 \x67\x59 |0 \xD3\x48 |0 - \x53\xDA |1 + \xB7\xA1 |0 \xD3\x49 |0 \x67\x57 |0 \xD3\x4A |0 \x67\x5B |0 + \xB7\xA2 |0 \x4C\xD5 |0 \x67\x5A |0 \xD3\x4B |0 @@ -14213,6 +14817,7 @@ CHARMAP \xD3\x51 |0 \xD3\x52 |0 \xD3\x53 |0 + \xB7\xA5 |0 \x55\x9C |0 \xD3\x54 |0 \xD3\x55 |0 @@ -14347,6 +14952,7 @@ CHARMAP \xD3\x9F |0 \x67\x90 |0 \x67\x8F |0 + \xB7\xAB |0 \xD3\xA0 |0 \xD3\xA1 |0 \xD3\xA2 |0 @@ -14423,6 +15029,7 @@ CHARMAP \x4D\x78 |0 \xD3\xC8 |0 \xD3\xC9 |0 + \xB7\xAD |0 \xD3\xCA |0 \x55\x51 |0 \x67\xAB |0 @@ -14458,6 +15065,7 @@ CHARMAP \xD3\xD9 |0 \x67\xAE |0 \xD3\xDA |0 + \xB7\xB1 |0 \xD3\xDB |0 \x67\xBC |0 \xD3\xDC |0 @@ -14509,11 +15117,13 @@ CHARMAP \xD3\xF9 |0 \x67\xC3 |0 \xD3\xFA |0 + \xB7\xB6 |0 \x67\xC4 |0 \xD3\xFB |0 \xD3\xFC |0 \xD3\xFD |0 \xD3\xFE |0 + \xB7\xB7 |0 \xD4\x41 |0 \xD4\x42 |0 \xD4\x43 |0 @@ -14521,6 +15131,7 @@ CHARMAP \x67\xC5 |0 \xD4\x45 |0 \x67\xC6 |0 + \xB7\xB8 |0 \xD4\x46 |0 \x47\x79 |0 \xD4\x47 |0 @@ -14581,6 +15192,7 @@ CHARMAP \xD4\x5F |0 \x67\xDF |0 \x67\xDE |0 + \xB7\xBE |0 \xD4\x60 |0 \xD4\x61 |0 \x67\xDD |0 @@ -14601,6 +15213,7 @@ CHARMAP \x67\xE5 |0 \x67\xE2 |0 \x67\xE1 |0 + \xB7\xC0 |0 \xD4\x68 |0 \xD4\x69 |0 \x67\xE6 |0 @@ -14622,6 +15235,7 @@ CHARMAP \xD4\x76 |0 \xD4\x77 |0 \xD4\x78 |0 + \xB7\xC1 |0 \x67\xE7 |0 \xD4\x79 |0 \x67\xE8 |0 @@ -14640,7 +15254,9 @@ CHARMAP \x67\xF0 |0 \x67\xEE |0 \xD4\x80 |0 + \xB7\xC3 |0 \xD4\x81 |0 + \xB7\xC4 |0 \x67\xED |0 \x67\xF3 |0 \xD4\x82 |0 @@ -14660,6 +15276,7 @@ CHARMAP \xD4\x8B |0 \xD4\x8C |0 \xD4\x8D |0 + \xB7\xC5 |0 \xD4\x8E |0 \x67\xF8 |0 \xD4\x8F |0 @@ -14680,6 +15297,7 @@ CHARMAP \xD4\x97 |0 \xD4\x98 |0 \xD4\x99 |0 + \xB7\xC8 |0 \xD4\x9A |0 \xD4\x9B |0 \xD4\x9C |0 @@ -14742,8 +15360,10 @@ CHARMAP \x55\x5F |0 \x48\xA7 |0 \x68\x50 |0 + \xB7\xCA |0 \x68\x51 |0 \x4E\xEA |0 + \xB7\xCB |0 \x4A\xC6 |0 \xD4\xBA |0 \xD4\xBB |0 @@ -21090,7 +21710,12 @@ CHARMAP \x89\xBC |0 \x89\xBD |0 \x44\x6E |1 + \xB4\xE4 |0 + \xB4\x54 |0 \x5B\xC9 |0 + \xB6\xBC |0 + \xB4\xEF |0 + \xB7\x8E |0 \x66\x74 |0 \x57\x8E |0 \x58\x77 |0 @@ -21124,8 +21749,69 @@ CHARMAP \x66\xDF |0 \x66\xE6 |0 \x67\xF4 |0 + \xB3\x54 |0 + \xB3\x63 |0 + \xB3\x69 |0 + \xB3\x7B |0 + \xB3\x7F |0 + \xB3\x83 |0 + \xB3\x9E |0 + \xB3\xA5 |0 + \xB3\xAC |0 + \xB3\xBF |0 + \xB3\xC2 |0 + \xB3\xE7 |0 + \xB3\xE8 |0 + \xB4\x61 |0 + \xB4\x66 |0 + \xB4\x67 |0 + \xB4\x6A |0 + \xB4\x85 |0 + \xB4\x89 |0 + \xB4\x97 |0 + \xB4\xB3 |0 + \xB5\x49 |0 + \xB5\x59 |0 + \xB5\x62 |0 + \xB5\x7C |0 + \xB5\x82 |0 + \xB5\x96 |0 + \xB5\xCE |0 + \xB5\xD6 |0 + \xB5\xD8 |0 + \xB5\xD7 |0 + \xB5\xD9 |0 + \xB5\xDA |0 + \xB5\xDB |0 + \xB5\xDD |0 + \xB5\xDE |0 + \xB5\xE7 |0 + \xB5\xE8 |0 + \xB5\xFB |0 + \xB6\x5B |0 + \xB6\x5D |0 + \xB6\x5F |0 + \xB6\x65 |0 + \xB6\x6A |0 + \xB6\x83 |0 + \xB6\x94 |0 + \xB6\x95 |0 + \xB6\xA3 |0 + \xB6\xD9 |0 + \xB6\xE0 |0 + \xB6\xE6 |0 + \xB6\xE9 |0 + \xB6\xF3 |0 + \xB6\xF6 |0 + \xB7\x4D |0 + \xB7\x4F |0 + \xB7\x82 |0 + \xB7\x89 |0 + \xB7\x8D |0 \xE9\xA3 |0 \xE9\xA4 |0 + \xEC\xAA |0 + \xEC\xAB |0 \x42\x5A |0 \x42\x7F |0 \x42\x7B |0 @@ -21220,6 +21906,410 @@ CHARMAP \x42\x4F |0 \x42\xD0 |0 \xE9\xF4 |0 + \xE9\xF7 |0 + \xE9\xF8 |0 + \x58 |0 + \x9A |0 + \xBE |0 + \xBF |0 + \x43\x4A |0 + \x42\x4A |0 + \x42\x5F |0 + \x42\xA1 |0 + \xE9\xF5 |0 + \x42\x5B |0 + \xB3\x42 |0 + \xB3\x46 |0 + \xB3\x48 |0 + \xB3\x49 |0 + \xB3\x4E |0 + \xB3\x53 |0 + \xB3\x5D |0 + \xB3\x60 |0 + \xB3\x64 |0 + \xB3\x67 |0 + \xB3\x68 |0 + \xB3\x6B |0 + \xB3\x70 |0 + \xB3\x73 |0 + \xB3\x76 |0 + \xB3\x79 |0 + \xB3\x7A |0 + \xB3\x80 |0 + \xB3\x82 |0 + \xB3\x84 |0 + \xB3\x88 |0 + \xB3\x89 |0 + \xB3\x8D |0 + \xB3\x9B |0 + \xB3\x9F |0 + \xB3\xA2 |0 + \xB3\xA3 |0 + \xB3\xA4 |0 + \xB3\xA8 |0 + \xB3\xB0 |0 + \xB3\xB1 |0 + \xB3\xB3 |0 + \xB3\xB4 |0 + \xB3\xB5 |0 + \xB3\xB6 |0 + \xB3\xB7 |0 + \xB3\xB8 |0 + \xB3\xBA |0 + \xB3\xBD |0 + \xB3\xBE |0 + \xB3\xC0 |0 + \xB3\xC5 |0 + \xB3\xC6 |0 + \xB3\xCA |0 + \xB3\xD0 |0 + \xB3\xD1 |0 + \xB3\xD2 |0 + \xB3\xD6 |0 + \xB3\xD9 |0 + \xB3\xDA |0 + \xB3\xE4 |0 + \xB3\xE9 |0 + \xB3\xEA |0 + \xB3\xEB |0 + \xB3\xEC |0 + \xB3\xEF |0 + \xB3\xF0 |0 + \xB3\xF2 |0 + \xB3\xF4 |0 + \xB3\xF5 |0 + \xB3\xF9 |0 + \xB3\xFA |0 + \xB4\x44 |0 + \xB4\x46 |0 + \xB4\x49 |0 + \xB4\x50 |0 + \xB4\x52 |0 + \xB4\x56 |0 + \xB4\x5A |0 + \xB4\x62 |0 + \xB4\x68 |0 + \xB4\x69 |0 + \xB4\x6C |0 + \xB4\x72 |0 + \xB4\x75 |0 + \xB4\x77 |0 + \xB4\x78 |0 + \xB4\x79 |0 + \xB4\x7C |0 + \xB4\x7D |0 + \xB4\x80 |0 + \xB4\x91 |0 + \xB4\x93 |0 + \xB4\x94 |0 + \xB4\x96 |0 + \xB4\x9F |0 + \xB4\xA1 |0 + \xB4\xA2 |0 + \xB4\xA3 |0 + \xB4\xA4 |0 + \xB4\xA5 |0 + \xB4\xA7 |0 + \xB4\xA8 |0 + \xB4\xAF |0 + \xB4\xB0 |0 + \xB4\xB1 |0 + \xB4\xB2 |0 + \xB4\xBF |0 + \xB4\xC4 |0 + \xB4\xC5 |0 + \xB4\xCB |0 + \xB4\xD2 |0 + \xB4\xD3 |0 + \xB4\xD4 |0 + \xB4\xD5 |0 + \xB4\xDC |0 + \xB4\xDD |0 + \xB4\xDE |0 + \xB4\xDF |0 + \xB4\xE0 |0 + \xB4\xE3 |0 + \xB4\xE5 |0 + \xB4\xE7 |0 + \xB4\xE8 |0 + \xB4\xF0 |0 + \xB4\xF6 |0 + \xB5\x43 |0 + \xB5\x44 |0 + \xB5\x45 |0 + \xB5\x4F |0 + \xB5\x55 |0 + \xB5\x57 |0 + \xB5\x58 |0 + \xB5\x66 |0 + \xB5\x6C |0 + \xB5\x6E |0 + \xB5\x73 |0 + \xB5\x74 |0 + \xB5\x7F |0 + \xB5\x84 |0 + \xB5\x86 |0 + \xB5\x8E |0 + \xB5\x91 |0 + \xB5\x9A |0 + \xB5\x9E |0 + \xB5\x9F |0 + \xB5\xA0 |0 + \xB5\xA4 |0 + \xB5\xAE |0 + \xB5\xB0 |0 + \xB5\xB2 |0 + \xB5\xB4 |0 + \xB5\xB9 |0 + \xB5\xBA |0 + \xB5\xBB |0 + \xB5\xBD |0 + \xB5\xBE |0 + \xB5\xC0 |0 + \xB5\xC2 |0 + \xB5\xC4 |0 + \xB5\xC8 |0 + \xB5\xCD |0 + \xB5\xCF |0 + \xB5\xD0 |0 + \xB5\xD3 |0 + \xB5\xE1 |0 + \xB5\xE3 |0 + \xB5\xE4 |0 + \xB5\xE9 |0 + \xB5\xEA |0 + \xB5\xEE |0 + \xB5\xEF |0 + \xB5\xF0 |0 + \xB5\xF9 |0 + \xB5\xFC |0 + \xB5\xFD |0 + \xB6\x44 |0 + \xB6\x47 |0 + \xB6\x48 |0 + \xB6\x49 |0 + \xB6\x4A |0 + \xB6\x4B |0 + \xB6\x4C |0 + \xB6\x4D |0 + \xB6\x4E |0 + \xB6\x4F |0 + \xB6\x51 |0 + \xB6\x52 |0 + \xB6\x54 |0 + \xB6\x56 |0 + \xB6\x57 |0 + \xB6\x59 |0 + \xB6\x5E |0 + \xB6\x63 |0 + \xB6\x64 |0 + \xB6\x66 |0 + \xB6\x68 |0 + \xB6\x72 |0 + \xB6\x75 |0 + \xB6\x7B |0 + \xB6\x81 |0 + \xB6\x82 |0 + \xB6\x85 |0 + \xB6\x86 |0 + \xB6\x89 |0 + \xB6\x8A |0 + \xB6\x8E |0 + \xB6\x91 |0 + \xB6\x92 |0 + \xB6\x97 |0 + \xB6\x9E |0 + \xB6\xA1 |0 + \xB6\xA4 |0 + \xB6\xAB |0 + \xB6\xAC |0 + \xB6\xB0 |0 + \xB6\xB1 |0 + \xB6\xB2 |0 + \xB6\xB3 |0 + \xB6\xB7 |0 + \xB6\xB8 |0 + \xB6\xBA |0 + \xB6\xC5 |0 + \xB6\xC6 |0 + \xB6\xC7 |0 + \xB6\xC9 |0 + \xB6\xCB |0 + \xB6\xD1 |0 + \xB6\xD2 |0 + \xB6\xD4 |0 + \xB6\xD6 |0 + \xB6\xD7 |0 + \xB6\xDA |0 + \xB6\xDC |0 + \xB6\xDD |0 + \xB6\xE4 |0 + \xB6\xE7 |0 + \xB6\xEE |0 + \xB6\xEF |0 + \xB6\xF0 |0 + \xB6\xF1 |0 + \xB6\xF4 |0 + \xB6\xF7 |0 + \xB6\xF9 |0 + \xB6\xFC |0 + \xB6\xFD |0 + \xB7\x43 |0 + \xB7\x44 |0 + \xB7\x47 |0 + \xB7\x4A |0 + \xB7\x4B |0 + \xB7\x4E |0 + \xB7\x50 |0 + \xB7\x51 |0 + \xB7\x52 |0 + \xB7\x54 |0 + \xB7\x56 |0 + \xB7\x59 |0 + \xB7\x5A |0 + \xB7\x5D |0 + \xB7\x5E |0 + \xB7\x5F |0 + \xB7\x60 |0 + \xB7\x61 |0 + \xB7\x64 |0 + \xB7\x65 |0 + \xB7\x68 |0 + \xB7\x69 |0 + \xB7\x6A |0 + \xB7\x6B |0 + \xB7\x6C |0 + \xB7\x6D |0 + \xB7\x70 |0 + \xB7\x71 |0 + \xB7\x73 |0 + \xB7\x74 |0 + \xB7\x76 |0 + \xB7\x78 |0 + \xB7\x79 |0 + \xB7\x7A |0 + \xB7\x7B |0 + \xB7\x7D |0 + \xB7\x80 |0 + \xB7\x87 |0 + \xB7\x88 |0 + \xB7\x8C |0 + \xB7\x8F |0 + \xB7\x93 |0 + \xB7\x98 |0 + \xB7\x99 |0 + \xB7\x9A |0 + \xB7\x9C |0 + \xB7\xA7 |0 + \xB7\xAC |0 + \xB7\xAE |0 + \xB7\xAF |0 + \xB7\xB0 |0 + \xB7\xB2 |0 + \xB7\xB3 |0 + \xB7\xB4 |0 + \xB7\xB5 |0 + \xB7\xB9 |0 + \xB7\xBB |0 + \xB7\xBD |0 + \xB7\xBF |0 + \xB7\xC2 |0 + \xB7\xC6 |0 + \xB7\xC9 |0 + \xB7\xCC |0 + \xB7\xCE |0 + \xB7\xCF |0 + \xB7\xD0 |0 + \xB7\xD1 |0 +END CHARMAP + +CHARMAP + \x3F |2 + \x3F |2 + \xE0 |0 + \x70 |0 + \xB2 |0 + \x80 |0 + \x62 |0 + \x63 |0 + \x64 |0 + \x65 |0 + \x66 |0 + \x67 |0 + \x68 |0 + \x69 |0 + \x71 |0 + \x72 |0 + \x73 |0 + \x74 |0 + \x75 |0 + \x76 |0 + \x77 |0 + \x78 |0 + \x8B |0 + \x9B |0 + \xAB |0 + \xB3 |0 + \xB4 |0 + \xB5 |0 + \xB6 |0 + \xB7 |0 + \xB8 |0 + \xB9 |0 + \xA0 |0 + \xB1 |0 + \x4A |0 + \x5B |0 + \xD6\x7B |0 + \xEC\xC3 |0 + \xD8\x90 |0 + \xEC\xC4 |0 + \xEC\xC5 |0 + \xD8\x95 |0 + \xEC\xC8 |0 + \xEC\xC9 |0 + \xD8\x96 |0 + \xEC\xCA |0 + \xEC\xCB |0 + \xD8\xC8 |0 + \xEC\xC6 |0 + \xEC\xC7 |0 + \xD9\x42 |0 + \xEC\xCD |0 + \xD9\x46 |0 + \xEC\xCC |0 + \xA1 |0 + \xE1 |0 + \x42\xE1 |3 + \x3F |2 + \x44\x86 |0 + \xEC\xB5 |0 + \x44\x87 |0 + \xEC\xB6 |0 + \x44\x88 |0 + \xEC\xB7 |0 + \x44\x89 |0 + \xEC\xB8 |0 + \x44\x8A |0 + \xEC\xB9 |0 + \x43\x86 |0 + \xEC\xBA |0 + \x43\x87 |0 + \xEC\xBB |0 + \x43\x88 |0 + \xEC\xBC |0 + \x43\x89 |0 + \xEC\xBD |0 + \x43\x8A |0 + \xEC\xBE |0 + \x43\x8F |0 + \xEC\xBF |0 + \x43\x93 |0 + \xEC\xC0 |0 + \x43\x95 |0 + \xEC\xC1 |0 + \xEC\x8C |0 + \xEC\xC2 |0 \x41 |0 \x42 |0 \x43 |0 @@ -21235,7 +22325,6 @@ CHARMAP \x54 |0 \x55 |0 \x56 |0 - \x58 |0 \x81 |0 \x82 |0 \x83 |0 @@ -21260,7 +22349,6 @@ CHARMAP \x97 |0 \x98 |0 \x99 |0 - \x9A |0 \x9D |0 \x9E |0 \x9F |0 @@ -21281,14 +22369,6 @@ CHARMAP \xBB |0 \xBC |0 \xBD |0 - \xBE |0 - \xBF |0 - \x43\x4A |0 - \x42\x4A |0 - \x42\x5F |0 - \x42\xA1 |0 - \xE9\xF5 |0 - \x42\x5B |0 \x3F |2 \x3F |2 \x3F |2 diff --git a/icuSources/data/mappings/ibm-1399_P100-1999.ucm b/icuSources/data/mappings/ibm-1399_P110-2003.ucm similarity index 94% rename from icuSources/data/mappings/ibm-1399_P100-1999.ucm rename to icuSources/data/mappings/ibm-1399_P110-2003.ucm index c338e995..43ea0c0a 100644 --- a/icuSources/data/mappings/ibm-1399_P100-1999.ucm +++ b/icuSources/data/mappings/ibm-1399_P110-2003.ucm @@ -1,14 +1,14 @@ # *************************************************************************** # * -# * Copyright (C) 1995-2002, International Business Machines +# * Copyright (C) 1995-2003, International Business Machines # * Corporation and others. All Rights Reserved. # * # *************************************************************************** # -# File created by rptp2ucm (compiled on Dec 3 2002) -# from source files 44B00577.RPMAP100 and 057744B0.TPMAP100 +# File created by rptp2ucm (compiled on Oct 27 2003) +# from source files 44B00577.RPMAP110 and 057744B0.TPMAP110 # - "ibm-1399_P100-1999" + "ibm-1399_P110-2003" "AXXXX" 2 1 @@ -18,6 +18,18 @@ "EBCDIC" "ibm-1399_VPUA" +# includes mappings for surrogate pairs + 0-ff, e:1.s, f:0.s + initial, 0-3f:4, e:1.s, f:0.s, 40:3, 41-fe:2, ff:4, b3-b7:5 + 0-40:1.i, 41-fe:1., ff:1.i + 0-ff:1.i, 40:1. + 0-ff:1.i + 0-40:1.i, 41-fe:1.p, ff:1.i + +# build an extension-only (delta) .cnv file +# requires the base .cnv file at runtime + "ibm-1390_P110-2003" + CHARMAP \x00 |0 \x01 |0 @@ -33,8 +45,6 @@ CHARMAP \x0B |0 \x0C |0 \x0D |0 - \x3F |2 - \x3F |2 \x10 |0 \x11 |0 \x12 |0 @@ -249,7 +259,6 @@ CHARMAP \xD6\x78 |0 \xD6\x79 |0 \xD6\x7A |0 - \xD6\x7B |0 \xD6\x7C |0 \xD6\x7D |0 \xD6\x7E |0 @@ -404,6 +413,7 @@ CHARMAP \xD7\x78 |0 \xD7\x79 |0 \xD7\x7A |0 + \xD7\x93 |0 \xD7\x7B |0 \xD7\x7C |0 \xD7\x7D |0 @@ -422,6 +432,8 @@ CHARMAP \xD7\x8A |0 \xD7\x8B |0 \xD7\x8C |0 + \xD7\x94 |0 + \xD7\x95 |0 \xD7\x8D |0 \xD7\x8E |0 \xD7\x8F |0 @@ -432,13 +444,10 @@ CHARMAP \xD8\x8D |0 \xD8\x8E |0 \xD8\x8F |0 - \xD8\x90 |0 \xD8\x91 |0 \xD8\x92 |0 \xD8\x93 |0 \xD8\x94 |0 - \xD8\x95 |0 - \xD8\x96 |0 \xD8\x97 |0 \xD8\x98 |0 \xD8\x99 |0 @@ -488,7 +497,6 @@ CHARMAP \xD8\xC5 |0 \xD8\xC6 |0 \xD8\xC7 |0 - \xD8\xC8 |0 \xD8\xC9 |0 \xD8\xCA |0 \xD8\xCB |0 @@ -537,11 +545,41 @@ CHARMAP \xD8\xFD |0 \xD8\xFE |0 \xD9\x41 |0 - \xD9\x42 |0 \xD9\x43 |0 \xD9\x44 |0 \xD9\x45 |0 - \xD9\x46 |0 + \xEA\x51 |0 + \xEA\x52 |0 + \xEA\x53 |0 + \xEA\x54 |0 + \xEA\x55 |0 + \xEA\x57 |0 + \xEA\x59 |0 + \xEA\x5C |0 + \xEA\x5D |0 + \xEA\x60 |0 + \xEA\x69 |0 + \xEA\x6A |0 + \xEA\x6B |0 + \xEA\x6D |0 + \xEA\x6E |0 + \xEA\x6F |0 + \xEA\x70 |0 + \xEA\x71 |0 + \xEA\x75 |0 + \xEA\x76 |0 + \xEA\x7A |0 + \xEA\x7B |0 + \xEA\x7D |0 + \xEA\x80 |0 + \xEA\x81 |0 + \xEA\x85 |0 + \xEA\x8A |0 + \xEA\x8B |0 + \xEA\x8C |0 + \xEA\x8D |0 + \xEA\x8E |0 + \xEA\xB2 |0 \xD9\x7E |0 \xD9\x7F |0 \xD9\x80 |0 @@ -858,7 +896,10 @@ CHARMAP \xDA\xE9 |0 \xDA\xEA |0 \xDA\xEB |0 + \xDC\x63 |0 + \xDC\x64 |0 \xDC\x62 |0 + \xDC\x65 |0 \xDD\xA4 |0 \xDD\xA5 |0 \xDD\xA6 |0 @@ -929,6 +970,10 @@ CHARMAP \xDD\xD7 |0 \xDD\xD8 |0 \xDD\xD9 |0 + \xDD\xDA |0 + \xDD\xDB |0 + \xDD\xDC |0 + \xDD\xDD |0 \xDE\x47 |0 \xDE\x48 |0 \xDE\x49 |0 @@ -1417,6 +1462,23 @@ CHARMAP \xE0\xF2 |0 \xE0\xF3 |0 \xE0\xF4 |0 + \xE0\xF5 |0 + \xE0\xF6 |0 + \xE0\xF7 |0 + \xE0\xF8 |0 + \xE0\xF9 |0 + \xE0\xFA |0 + \xE0\xFB |0 + \xE0\xFC |0 + \xE0\xFD |0 + \xE0\xFE |0 + \xE1\x41 |0 + \xE1\x42 |0 + \xE1\x43 |0 + \xE1\x44 |0 + \xE1\x45 |0 + \xE1\x46 |0 + \xEA\xE4 |0 \xE2\x70 |0 \xE2\x71 |0 \xE2\x72 |0 @@ -1556,6 +1618,26 @@ CHARMAP \xE2\xF8 |0 \xE2\xF9 |0 \xE2\xFA |0 + \xE2\xFB |0 + \xE2\xFC |0 + \xE2\xFD |0 + \xE2\xFE |0 + \xE3\x41 |0 + \xE3\x42 |0 + \xE3\x43 |0 + \xE3\x44 |0 + \xE3\x45 |0 + \xE3\x46 |0 + \xE3\x47 |0 + \xE3\x48 |0 + \xE3\x49 |0 + \xE3\x4A |0 + \xE3\x4B |0 + \xE3\x4C |0 + \xE3\x4D |0 + \xE3\x4E |0 + \xE3\x4F |0 + \xE3\x50 |0 \x43\x7C |0 \x43\xB7 |0 \x43\x7D |0 @@ -1806,6 +1888,8 @@ CHARMAP \xE4\x77 |0 \xE4\x78 |0 \xE4\x79 |0 + \xE4\xCB |0 + \xE4\xCC |0 \xE4\x7A |0 \xE4\x7B |0 \xE4\x7C |0 @@ -2052,6 +2136,11 @@ CHARMAP \xE6\x82 |0 \xE6\x83 |0 \xE6\x84 |0 + \xEB\x77 |0 + \xEB\x78 |0 + \xEC\x44 |0 + \xEC\x7F |0 + \xEC\x80 |0 \x40\x40 |0 \x43\x44 |0 \x43\x41 |0 @@ -2093,7 +2182,9 @@ CHARMAP \xE6\xB5 |0 \xE6\xB6 |0 \xE6\xB7 |0 - \x3F |2 + \xE6\xB8 |0 + \xE6\xB9 |0 + \xE6\xBA |0 \x44\x47 |0 \x44\x81 |0 \x44\x48 |0 @@ -2104,15 +2195,10 @@ CHARMAP \x44\x84 |0 \x44\x52 |0 \x44\x85 |0 - \x44\x86 |0 \x44\xC0 |0 - \x44\x87 |0 \x44\xC1 |0 - \x44\x88 |0 \x44\xC2 |0 - \x44\x89 |0 \x44\xC3 |0 - \x44\x8A |0 \x44\xC4 |0 \x44\x8C |0 \x44\xC5 |0 @@ -2178,10 +2264,14 @@ CHARMAP \x44\x46 |0 \x44\xBD |0 \xE6\xCF |0 + \xE6\xD0 |0 + \xE6\xD1 |0 \x43\xBE |0 \x43\xBF |0 \x44\xDC |0 \x44\xDD |0 + \xE6\xD2 |0 + \xE6\xDC |0 \x43\x47 |0 \x43\x81 |0 \x43\x48 |0 @@ -2192,15 +2282,10 @@ CHARMAP \x43\x84 |0 \x43\x52 |0 \x43\x85 |0 - \x43\x86 |0 \x43\xC0 |0 - \x43\x87 |0 \x43\xC1 |0 - \x43\x88 |0 \x43\xC2 |0 - \x43\x89 |0 \x43\xC3 |0 - \x43\x8A |0 \x43\xC4 |0 \x43\x8C |0 \x43\xC5 |0 @@ -2208,7 +2293,6 @@ CHARMAP \x43\xC6 |0 \x43\x8E |0 \x43\xC7 |0 - \x43\x8F |0 \x43\xC8 |0 \x43\x90 |0 \x43\xC9 |0 @@ -2217,11 +2301,9 @@ CHARMAP \x43\x92 |0 \x43\xCB |0 \x43\x56 |0 - \x43\x93 |0 \x43\xCC |0 \x43\x94 |0 \x43\xCD |0 - \x43\x95 |0 \x43\xCE |0 \x43\x96 |0 \x43\x97 |0 @@ -2276,6 +2358,22 @@ CHARMAP \x43\x58 |0 \x43\xDC |0 \x43\xDD |0 + \xE6\xDD |0 + \xEC\x85 |0 + \xEC\x86 |0 + \xEC\x87 |0 + \xEC\x88 |0 + \xEC\x89 |0 + \xEC\x8A |0 + \xEC\x8B |0 + \xEC\x8D |0 + \xEC\x8E |0 + \xEC\x8F |0 + \xEC\x90 |0 + \xEC\x91 |0 + \xEC\x92 |0 + \xEC\x93 |0 + \xEC\x94 |0 \xE6\xDE |0 \xE6\xDF |0 \xE6\xE0 |0 @@ -2312,6 +2410,21 @@ CHARMAP \xE6\xFE |0 \xE7\x41 |0 \xE7\x42 |0 + \xE7\xAF |0 + \xE7\xB0 |0 + \xE7\xB1 |0 + \xE7\xB2 |0 + \xE7\xB3 |0 + \xE7\xB4 |0 + \xE7\xB5 |0 + \xE7\xB6 |0 + \xE7\xB7 |0 + \xE7\xB8 |0 + \xE7\xB9 |0 + \xE7\xBA |0 + \xE7\xBB |0 + \xE7\xBC |0 + \xE7\xBD |0 \xE7\x43 |0 \xE7\x44 |0 \xE7\x45 |0 @@ -2361,6 +2474,21 @@ CHARMAP \xE7\x71 |0 \xE7\x72 |0 \xE7\x73 |0 + \xE7\xBE |0 + \xE7\xBF |0 + \xE7\xC0 |0 + \xE7\xC1 |0 + \xE7\xC2 |0 + \xE7\xC3 |0 + \xE7\xC4 |0 + \xE7\xC5 |0 + \xE7\xC6 |0 + \xE7\xC7 |0 + \xE7\xC8 |0 + \xE7\xC9 |0 + \xE7\xCA |0 + \xE7\xCB |0 + \xE7\xCC |0 \xE7\x74 |0 \xE7\x75 |0 \xE7\x76 |0 @@ -2669,6 +2797,170 @@ CHARMAP \xE9\x99 |0 \xE9\x9A |0 \xE9\x9B |0 + \xB3\x43 |0 + \xB3\x4A |0 + \xB3\x4B |0 + \xB3\x4C |0 + \xB3\x58 |0 + \xB3\x59 |0 + \xB3\x66 |0 + \xB3\x6C |0 + \xB3\x6D |0 + \xB3\x6E |0 + \xB3\x6F |0 + \xB3\x74 |0 + \xB3\x7D |0 + \xB3\x8A |0 + \xB3\x8B |0 + \xB3\x8C |0 + \xB3\x92 |0 + \xB3\x99 |0 + \xB3\x9A |0 + \xB3\x9D |0 + \xB3\xA1 |0 + \xB3\xA9 |0 + \xB3\xAE |0 + \xB3\xBB |0 + \xB3\xCB |0 + \xB3\xCE |0 + \xB3\xCF |0 + \xB3\xD4 |0 + \xB3\xDB |0 + \xB3\xDD |0 + \xB3\xDE |0 + \xB3\xDF |0 + \xB3\xE0 |0 + \xB3\xE3 |0 + \xB3\xF1 |0 + \xB3\xFB |0 + \xB3\xFD |0 + \xB3\xFE |0 + \xB4\x41 |0 + \xB4\x42 |0 + \xB4\x4B |0 + \xB4\x4C |0 + \xB4\x4D |0 + \xB4\x4E |0 + \xB4\x4F |0 + \xB4\x5D |0 + \xB4\x5F |0 + \xB4\x60 |0 + \xB4\x64 |0 + \xB4\x81 |0 + \xB4\x82 |0 + \xB4\x8A |0 + \xB4\x8B |0 + \xB4\x8F |0 + \xB4\x98 |0 + \xB4\x99 |0 + \xB4\x9A |0 + \xB4\x9C |0 + \xB4\xB5 |0 + \xB4\xB9 |0 + \xB4\xC1 |0 + \xB4\xC0 |0 + \xB4\xC2 |0 + \xB4\xC6 |0 + \xB4\xCA |0 + \xB4\xD1 |0 + \xB4\xD6 |0 + \xB4\xD9 |0 + \xB4\xE2 |0 + \xB4\xE9 |0 + \xB4\xF8 |0 + \xB4\xFC |0 + \xB5\x5A |0 + \xB5\x5D |0 + \xB5\x68 |0 + \xB5\x70 |0 + \xB5\x77 |0 + \xB5\x7B |0 + \xB5\x80 |0 + \xB5\x85 |0 + \xB5\x89 |0 + \xB5\x8A |0 + \xB5\x8B |0 + \xB5\x8C |0 + \xB5\x90 |0 + \xB5\xA1 |0 + \xB5\xA6 |0 + \xB5\xA7 |0 + \xB5\xA8 |0 + \xB5\xAD |0 + \xB5\xB3 |0 + \xB5\xB5 |0 + \xB5\xBC |0 + \xB5\xC3 |0 + \xB5\xC7 |0 + \xB5\xDC |0 + \xB5\xE2 |0 + \xB5\xE5 |0 + \xB5\xE6 |0 + \xB5\xEB |0 + \xB5\xED |0 + \xB5\xF2 |0 + \xB5\xF4 |0 + \xB5\xF5 |0 + \xB5\xF8 |0 + \xB5\xFA |0 + \xB6\x42 |0 + \xB6\x50 |0 + \xB6\x53 |0 + \xB6\x55 |0 + \xB6\x5C |0 + \xB6\x61 |0 + \xB6\x62 |0 + \xB6\x76 |0 + \xB6\x78 |0 + \xB6\x7A |0 + \xB6\x7C |0 + \xB6\x7D |0 + \xB6\x7E |0 + \xB6\x84 |0 + \xB6\x88 |0 + \xB6\x8D |0 + \xB6\x8F |0 + \xB6\x93 |0 + \xB6\x9A |0 + \xB6\x9B |0 + \xB6\x9D |0 + \xB6\xA7 |0 + \xB6\xA9 |0 + \xB6\xAD |0 + \xB6\xAF |0 + \xB6\xBD |0 + \xB6\xC2 |0 + \xB6\xC8 |0 + \xB6\xCA |0 + \xB6\xD0 |0 + \xB6\xD8 |0 + \xB6\xDE |0 + \xB6\xE1 |0 + \xB6\xE2 |0 + \xB6\xEA |0 + \xB6\xF2 |0 + \xB6\xFB |0 + \xB6\xFE |0 + \xB7\x45 |0 + \xB7\x46 |0 + \xB7\x53 |0 + \xB7\x75 |0 + \xB7\x7C |0 + \xB7\x7F |0 + \xB7\x81 |0 + \xB7\x84 |0 + \xB7\x8B |0 + \xB7\x97 |0 + \xB7\xA3 |0 + \xB7\xA4 |0 + \xB7\xA6 |0 + \xB7\xA8 |0 + \xB7\xA9 |0 + \xB7\xAA |0 + \xB7\xBA |0 + \xB7\xBC |0 + \xB7\xC7 |0 + \xB7\xCD |0 \x45\x41 |0 \x4B\xCE |0 \xB8\x41 |0 @@ -2683,6 +2975,7 @@ CHARMAP \xB8\x44 |0 \x46\xAF |0 \x47\x89 |0 + \xB3\x41 |0 \x56\x42 |0 \x4D\xEC |0 \xB8\x45 |0 @@ -2699,8 +2992,10 @@ CHARMAP \xB8\x48 |0 \x48\x7C |0 \x56\x44 |0 + \xB3\x44 |0 \x56\x45 |0 \xB8\x49 |0 + \xB3\x45 |0 \x45\x5C |0 \xB8\x4A |0 \xB8\x4B |0 @@ -2721,6 +3016,7 @@ CHARMAP \xB8\x50 |0 \x45\x8A |0 \xB8\x51 |0 + \xB3\x47 |0 \x45\xD8 |0 \x55\xA9 |0 \x54\xA5 |0 @@ -2788,6 +3084,8 @@ CHARMAP \x56\x57 |0 \xB8\x61 |0 \x45\x93 |0 + \xB3\x4D |0 + \xB3\x4F |0 \x53\xD9 |0 \x47\x76 |0 \x56\x5C |0 @@ -2795,6 +3093,7 @@ CHARMAP \x56\x5A |0 \x56\x5B |0 \x50\x85 |0 + \xB3\x50 |0 \x45\xE0 |0 \x48\x4B |0 \x56\x59 |0 @@ -2819,6 +3118,7 @@ CHARMAP \x49\xC3 |0 \x46\xF6 |0 \xB8\x68 |0 + \xB3\x51 |0 \x56\x60 |0 \x4D\x71 |0 \xB8\x69 |0 @@ -2902,6 +3202,7 @@ CHARMAP \xB8\x89 |0 \xB8\x8A |0 \xB8\x8B |0 + \xB3\x52 |0 \x56\x79 |0 \xB8\x8C |0 \xB8\x8D |0 @@ -2997,9 +3298,11 @@ CHARMAP \x4B\x4A |0 \x56\x87 |0 \x56\x88 |0 + \xB3\x55 |0 \x46\xDE |0 \x56\x96 |0 \xB8\xB6 |0 + \xB3\x56 |0 \xB8\xB7 |0 \x4C\xE1 |0 \x4D\xB1 |0 @@ -3012,6 +3315,7 @@ CHARMAP \x56\x94 |0 \xB8\xBA |0 \xB8\xBB |0 + \xB3\x57 |0 \xB8\xBC |0 \x56\x8F |0 \x56\x99 |0 @@ -3106,6 +3410,7 @@ CHARMAP \xB8\xE4 |0 \x56\xAA |0 \xB8\xE5 |0 + \xB3\x5A |0 \xB8\xE6 |0 \x4E\xE7 |0 \xB8\xE7 |0 @@ -3115,6 +3420,7 @@ CHARMAP \xB8\xEA |0 \xB8\xEB |0 \x56\xA8 |0 + \xB3\x5B |0 \xB8\xEC |0 \x50\x9C |0 \x46\xAC |0 @@ -3126,11 +3432,13 @@ CHARMAP \xB8\xF1 |0 \xB8\xF2 |0 \xB8\xF3 |0 + \xB3\x5C |0 \xB8\xF4 |0 \x4C\x43 |0 \x54\xDA |0 \xB8\xF5 |0 \xB8\xF6 |0 + \xB3\x5E |0 \x56\xAD |0 \x56\xB0 |0 \x56\xAB |0 @@ -3138,6 +3446,7 @@ CHARMAP \x4C\x5B |0 \xB8\xF7 |0 \xB8\xF8 |0 + \xB3\x5F |0 \xB8\xF9 |0 \x4A\x43 |0 \xB8\xFA |0 @@ -3159,11 +3468,13 @@ CHARMAP \x4A\xBB |0 \x52\xD4 |0 \x56\xB5 |0 + \xB3\x61 |0 \x4D\x82 |0 \xB9\x45 |0 \xB9\x46 |0 \x56\xB3 |0 \xB9\x47 |0 + \xB3\x62 |0 \xB9\x48 |0 \x56\xB7 |0 \xB9\x49 |0 @@ -3177,6 +3488,7 @@ CHARMAP \xB9\x4D |0 \xB9\x4E |0 \xB9\x4F |0 + \xB3\x65 |0 \x56\xB2 |0 \x56\xBA |0 \xB9\x50 |0 @@ -3257,6 +3569,7 @@ CHARMAP \x49\x4B |0 \x51\xBE |0 \xB9\x74 |0 + \xB3\x6A |0 \x56\xCD |0 \x56\xCE |0 \x46\x65 |0 @@ -3269,10 +3582,12 @@ CHARMAP \x45\x46 |0 \x56\xD1 |0 \x47\xB3 |0 + \xB3\xCC |0 \x46\x49 |0 \x4F\x67 |0 \x47\xAF |0 \x47\xC9 |0 + \xB6\x67 |0 \x48\xF4 |0 \xB9\x76 |0 \x56\xD2 |0 @@ -3326,11 +3641,13 @@ CHARMAP \x56\xE8 |0 \xB9\x82 |0 \xB9\x83 |0 + \xB3\x71 |0 \x52\xDC |0 \x56\xEA |0 \x4F\x80 |0 \xB9\x84 |0 \x56\xEB |0 + \xB3\x72 |0 \x55\xF9 |0 \x53\x44 |0 \x4B\xE6 |0 @@ -3428,7 +3745,7 @@ CHARMAP \xB9\xA5 |0 \x49\xC7 |0 \xB9\xA6 |0 - \x54\x81 |1 + \xB3\x75 |0 \x57\x42 |0 \xB9\xA7 |0 \xB9\xA8 |0 @@ -3439,6 +3756,7 @@ CHARMAP \xB9\xAA |0 \x57\x48 |0 \x57\x45 |0 + \xB3\x77 |0 \xB9\xAB |0 \x4B\x4E |0 \x4D\x85 |0 @@ -3455,6 +3773,7 @@ CHARMAP \xB9\xAF |0 \xB9\xB0 |0 \x55\xD6 |0 + \xB3\x78 |0 \xB9\xB1 |0 \x49\xF0 |0 \x57\x4C |0 @@ -3508,9 +3827,11 @@ CHARMAP \x46\x9C |0 \xB9\xC6 |0 \x48\xCE |0 + \xB3\x7C |0 \xB9\xC7 |0 \x57\x57 |0 \xB9\xC8 |0 + \xB3\x7E |0 \xB9\xC9 |0 \x53\xD6 |0 \xB9\xCA |0 @@ -3547,6 +3868,7 @@ CHARMAP \x57\x5F |0 \x57\x60 |0 \x54\x70 |0 + \xB3\x81 |0 \x51\xE9 |0 \x52\x97 |0 \x57\x61 |0 @@ -3631,6 +3953,7 @@ CHARMAP \xB9\xF6 |0 \xB9\xF7 |0 \x53\xDB |0 + \xB3\x85 |0 \x57\x7A |0 \xB9\xF8 |0 \xB9\xF9 |0 @@ -3645,7 +3968,9 @@ CHARMAP \x57\x7D |0 \x4E\x79 |0 \xB9\xFA |0 + \xB3\x86 |0 \x57\x7E |0 + \xB3\x87 |0 \xB9\xFB |0 \x53\xE2 |0 \x57\x7F |0 @@ -3729,6 +4054,7 @@ CHARMAP \x50\x42 |0 \x47\xD9 |0 \x48\x5A |0 + \xB3\x8E |0 \xBA\x5B |0 \x4F\x59 |0 \x48\xE2 |0 @@ -3748,13 +4074,16 @@ CHARMAP \x50\xC6 |0 \x4E\xB2 |0 \x46\xA5 |0 + \xB3\x8F |0 \xBA\x5D |0 \xBA\x5E |0 \x47\xCF |0 \x57\x9D |0 + \xB3\x90 |0 \x50\x7A |0 \x53\xE1 |0 \xBA\x5F |0 + \xB3\x91 |0 \x4C\x4F |0 \xBA\x60 |0 \xBA\x61 |0 @@ -3788,6 +4117,7 @@ CHARMAP \x57\x9E |0 \xBA\x6B |0 \x50\xB0 |0 + \xB3\x93 |0 \xBA\x6C |0 \x57\xA2 |0 \xBA\x6D |0 @@ -3798,6 +4128,7 @@ CHARMAP \xBA\x71 |0 \x54\x8D |0 \xBA\x72 |0 + \xB3\x94 |0 \xBA\x73 |0 \xBA\x74 |0 \x57\xA5 |0 @@ -3832,6 +4163,7 @@ CHARMAP \xBA\x7F |0 \x57\xA9 |0 \xBA\x80 |0 + \xB3\x95 |0 \xBA\x81 |0 \x57\xB2 |0 \x57\xBC |0 @@ -3861,6 +4193,7 @@ CHARMAP \x4E\xF9 |0 \x45\xD0 |0 \x57\xBB |0 + \xB3\x96 |0 \x57\xB6 |0 \xBA\x8D |0 \x57\xAF |0 @@ -3882,7 +4215,9 @@ CHARMAP \x57\xC6 |0 \x57\xC5 |0 \xBA\x94 |0 + \xB3\x97 |0 \x47\x47 |0 + \xB3\x98 |0 \xBA\x95 |0 \x54\x7C |0 \xBA\x96 |0 @@ -3949,6 +4284,7 @@ CHARMAP \xBA\xB7 |0 \x57\xD8 |0 \x57\xDD |0 + \xB3\x9C |0 \x57\xD9 |0 \xBA\xB8 |0 \x57\xD5 |0 @@ -4009,6 +4345,7 @@ CHARMAP \x52\xA2 |0 \xBA\xD4 |0 \x57\xE6 |0 + \xB3\xA0 |0 \xBA\xD5 |0 \x57\xE4 |0 \xBA\xD6 |0 @@ -4023,6 +4360,7 @@ CHARMAP \xBA\xD9 |0 \xBA\xDA |0 \x50\x63 |0 + \xB3\xA6 |0 \xBA\xDB |0 \x47\x7E |0 \xBA\xDC |0 @@ -4038,6 +4376,7 @@ CHARMAP \x50\xF3 |0 \xBA\xE3 |0 \x57\xEF |0 + \xB3\xA7 |0 \x52\xCA |0 \xBA\xE4 |0 \x57\xF8 |0 @@ -4061,6 +4400,7 @@ CHARMAP \xBA\xF0 |0 \xBA\xF1 |0 \xBA\xF2 |0 + \xB3\xAA |0 \xBA\xF3 |0 \xBA\xF4 |0 \x50\x62 |0 @@ -4068,6 +4408,7 @@ CHARMAP \x57\xF0 |0 \xBA\xF6 |0 \x57\xF1 |0 + \xB3\xAB |0 \xBA\xF7 |0 \x54\x7D |0 \xBA\xF8 |0 @@ -4088,6 +4429,7 @@ CHARMAP \xBB\x44 |0 \x4E\x6D |0 \xBB\x45 |0 + \xB3\xAD |0 \x55\xF1 |0 \x55\x82 |0 \x57\xFE |0 @@ -4119,6 +4461,7 @@ CHARMAP \xBB\x57 |0 \x58\x44 |0 \xBB\x58 |0 + \xB3\xAF |0 \xBB\x59 |0 \x58\x46 |0 \x58\x45 |0 @@ -4196,6 +4539,7 @@ CHARMAP \xBB\x7C |0 \x46\x84 |0 \xBB\x7D |0 + \xB3\xB2 |0 \xBB\x7E |0 \xBB\x7F |0 \xBB\x80 |0 @@ -4302,6 +4646,7 @@ CHARMAP \x58\x72 |0 \xBB\xB7 |0 \x58\x76 |0 + \xB3\xB9 |0 \x4D\xF4 |0 \xBB\xB8 |0 \xBB\xB9 |0 @@ -4322,6 +4667,7 @@ CHARMAP \xBB\xC3 |0 \x4D\xAC |0 \x46\xF1 |0 + \xB3\xBC |0 \x46\xA3 |0 \xBB\xC4 |0 \xBB\xC5 |0 @@ -4403,6 +4749,7 @@ CHARMAP \xBB\xE8 |0 \xBB\xE9 |0 \xBB\xEA |0 + \xB3\xC1 |0 \xBB\xEB |0 \xBB\xEC |0 \xBB\xED |0 @@ -4421,6 +4768,7 @@ CHARMAP \xBB\xF5 |0 \x4A\xFC |0 \xBB\xF6 |0 + \xB3\xC3 |0 \x58\x88 |0 \x58\x8B |0 \xBB\xF7 |0 @@ -4434,6 +4782,7 @@ CHARMAP \x54\x88 |0 \x4B\x95 |0 \xBB\xF9 |0 + \xB3\xC4 |0 \xBB\xFA |0 \x58\x8F |0 \x4E\x8E |0 @@ -4457,6 +4806,7 @@ CHARMAP \xBC\x45 |0 \x58\x95 |0 \x58\x97 |0 + \xB3\xC7 |0 \xBC\x46 |0 \xBC\x47 |0 \x58\x98 |0 @@ -4470,6 +4820,7 @@ CHARMAP \x4E\xB0 |0 \x47\x75 |0 \xBC\x49 |0 + \xB3\xC8 |0 \x58\x9B |0 \x58\x9C |0 \x50\x77 |0 @@ -4483,6 +4834,7 @@ CHARMAP \x58\xA0 |0 \x58\xA1 |0 \xBC\x4C |0 + \xB3\xC9 |0 \x49\x7E |0 \x58\xA2 |0 \xBC\x4D |0 @@ -4518,6 +4870,7 @@ CHARMAP \xBC\x59 |0 \x51\x47 |0 \x58\xA9 |0 + \xB3\xCD |0 \x58\xAA |0 \xBC\x5A |0 \xBC\x5B |0 @@ -4637,6 +4990,7 @@ CHARMAP \xBC\x8B |0 \x51\x79 |0 \xBC\x8C |0 + \xB3\xD3 |0 \x52\xB9 |0 \x4B\x42 |0 \xBC\x8D |0 @@ -4650,6 +5004,7 @@ CHARMAP \x58\xC7 |0 \xBC\x92 |0 \xBC\x93 |0 + \xB3\xD5 |0 \x4B\x54 |0 \x58\xC9 |0 \x58\xC8 |0 @@ -4695,6 +5050,7 @@ CHARMAP \xBC\xAA |0 \xBC\xAB |0 \x54\x54 |0 + \xB3\xD7 |0 \xBC\xAC |0 \xBC\xAD |0 \x4D\x80 |0 @@ -4743,6 +5099,7 @@ CHARMAP \x58\xDC |0 \xBC\xC8 |0 \xBC\xC9 |0 + \xB3\xD8 |0 \xBC\xCA |0 \xBC\xCB |0 \x58\xDE |0 @@ -4874,6 +5231,7 @@ CHARMAP \x58\xFD |0 \x45\xAC |0 \xBC\xFA |0 + \xB3\xDC |0 \xBC\xFB |0 \x59\x41 |0 \x4B\x81 |0 @@ -4914,6 +5272,7 @@ CHARMAP \x46\xB2 |0 \x4D\x76 |0 \x49\xFB |0 + \xB3\xE1 |0 \x49\x8A |0 \x59\x4C |0 \x49\x59 |0 @@ -4927,6 +5286,7 @@ CHARMAP \x48\xAE |0 \x45\x5D |0 \x48\x4A |0 + \xB3\xE2 |0 \x59\x50 |0 \x53\xC0 |0 \xBD\x48 |0 @@ -4973,9 +5333,10 @@ CHARMAP \x48\xDD |0 \xBD\x54 |0 \xBD\x55 |0 - \x54\x43 |1 + \xB3\xE5 |0 \xBD\x56 |0 \x47\x6D |0 + \xB3\xE6 |0 \x53\xFB |0 \x55\xC0 |0 \xBD\x57 |0 @@ -5015,11 +5376,13 @@ CHARMAP \xBD\x6C |0 \xBD\x6D |0 \x59\x67 |0 + \xB3\xED |0 \x54\xB9 |0 \x45\xBF |0 \xBD\x6E |0 \x59\x63 |0 \x50\xD5 |0 + \xB3\xEE |0 \x52\x62 |0 \xBD\x6F |0 \x4D\x46 |0 @@ -5036,6 +5399,7 @@ CHARMAP \x59\x6B |0 \xBD\x72 |0 \xBD\x73 |0 + \xB3\xF3 |0 \xBD\x74 |0 \xBD\x75 |0 \x59\x6C |0 @@ -5063,6 +5427,7 @@ CHARMAP \x59\x73 |0 \xBD\x7D |0 \x45\x7F |0 + \xB3\xF6 |0 \x59\x77 |0 \xBD\x7E |0 \x51\x4D |0 @@ -5073,7 +5438,9 @@ CHARMAP \x59\x7B |0 \x59\x7A |0 \x59\x76 |0 + \xB3\xF7 |0 \x59\x75 |0 + \xB3\xF8 |0 \x59\x79 |0 \xBD\x7F |0 \xBD\x80 |0 @@ -5089,6 +5456,7 @@ CHARMAP \x59\x84 |0 \xBD\x88 |0 \xBD\x89 |0 + \xB3\xFC |0 \xBD\x8A |0 \xBD\x8B |0 \x59\x83 |0 @@ -5132,12 +5500,14 @@ CHARMAP \xBD\x9F |0 \xBD\xA0 |0 \xBD\xA1 |0 + \xB4\x43 |0 \xBD\xA2 |0 \xBD\xA3 |0 \x59\x8E |0 \xBD\xA4 |0 \xBD\xA5 |0 \x59\x8D |0 + \xB4\x45 |0 \xBD\xA6 |0 \xBD\xA7 |0 \x59\x90 |0 @@ -5159,9 +5529,11 @@ CHARMAP \x52\x81 |0 \xBD\xAE |0 \x59\x97 |0 + \xB4\x47 |0 \x59\x99 |0 \x59\x98 |0 \x51\xDF |0 + \xB4\x48 |0 \xBD\xAF |0 \xBD\xB0 |0 \x59\x9A |0 @@ -5169,6 +5541,7 @@ CHARMAP \x47\x41 |0 \xBD\xB1 |0 \x4D\x47 |0 + \xB4\x4A |0 \x4C\x67 |0 \xBD\xB2 |0 \x45\x6A |0 @@ -5260,6 +5633,7 @@ CHARMAP \x45\x60 |0 \x59\xAC |0 \x59\xAD |0 + \xB4\x51 |0 \x45\xA9 |0 \x48\xDA |0 \x59\xAE |0 @@ -5299,6 +5673,7 @@ CHARMAP \x50\xC1 |0 \x46\x9A |0 \x4C\x5D |0 + \xB4\x53 |0 \xBD\xDF |0 \xBD\xE0 |0 \xBD\xE1 |0 @@ -5320,6 +5695,7 @@ CHARMAP \xBD\xE8 |0 \xBD\xE9 |0 \x53\x6C |0 + \xB4\x55 |0 \x59\xB7 |0 \x59\xB8 |0 \xBD\xEA |0 @@ -5342,11 +5718,14 @@ CHARMAP \x47\xD0 |0 \x50\x5B |0 \x52\xD6 |0 + \xB4\x57 |0 \x46\x66 |0 \x4B\xAF |0 \x55\x64 |0 + \xB4\x58 |0 \x54\x4B |0 \x51\xD9 |0 + \xB4\x59 |0 \x4B\x47 |0 \xBD\xEE |0 \x59\xC2 |0 @@ -5373,6 +5752,7 @@ CHARMAP \x55\x97 |0 \xBD\xF4 |0 \xBD\xF5 |0 + \xB4\x5B |0 \x4C\x9B |0 \x59\xC7 |0 \xBD\xF6 |0 @@ -5490,6 +5870,7 @@ CHARMAP \xBE\x64 |0 \x46\x54 |0 \x4C\x74 |0 + \xB4\x5C |0 \x59\xE8 |0 \xBE\x65 |0 \x48\xF8 |0 @@ -5561,6 +5942,7 @@ CHARMAP \xBE\x86 |0 \x50\x81 |0 \x59\xF3 |0 + \xB4\x5E |0 \xBE\x87 |0 \x47\xCC |0 \x59\xFC |0 @@ -5697,6 +6079,7 @@ CHARMAP \xBE\xB9 |0 \x55\x4A |0 \x50\x6E |0 + \xB4\x63 |0 \x54\xB8 |0 \x5A\x73 |0 \x5A\x68 |0 @@ -5753,6 +6136,7 @@ CHARMAP \xBE\xD0 |0 \x5A\x79 |0 \xBE\xD1 |0 + \xB4\x65 |0 \x5A\x7F |0 \x5A\x84 |0 \x5A\x7C |0 @@ -5874,6 +6258,7 @@ CHARMAP \xBF\x45 |0 \x51\x53 |0 \x5A\xA9 |0 + \xB4\x6B |0 \x5A\xAB |0 \x5A\xAA |0 \x4D\xC6 |0 @@ -5925,6 +6310,7 @@ CHARMAP \xBF\x52 |0 \x4C\x44 |0 \xBF\x53 |0 + \xB4\x6D |0 \x47\xDC |0 \x45\x8C |0 \x5A\xBF |0 @@ -5952,6 +6338,7 @@ CHARMAP \xBF\x5F |0 \x5A\xC1 |0 \x5A\xC4 |0 + \xB4\x6E |0 \x5A\xC2 |0 \xBF\x60 |0 \x5A\xC5 |0 @@ -5963,6 +6350,7 @@ CHARMAP \x4D\x7A |0 \x4C\x76 |0 \xBF\x64 |0 + \xB4\x6F |0 \x5A\xC6 |0 \xBF\x65 |0 \x5A\xCA |0 @@ -5971,6 +6359,7 @@ CHARMAP \x5A\xC7 |0 \x5A\xCD |0 \x4E\xC0 |0 + \xB4\x70 |0 \x5A\xC8 |0 \x4E\xE3 |0 \xBF\x66 |0 @@ -5985,6 +6374,7 @@ CHARMAP \x5A\xCC |0 \x4A\x67 |0 \x49\x8D |0 + \xB4\x71 |0 \x5A\xDC |0 \x4A\x85 |0 \x4E\x7E |0 @@ -6073,10 +6463,12 @@ CHARMAP \x54\x8F |0 \xBF\x86 |0 \x48\xF6 |0 + \xB4\x73 |0 \xBF\x87 |0 \xBF\x88 |0 \xBF\x89 |0 \x53\x87 |0 + \xB4\x74 |0 \xBF\x8A |0 \x52\xA8 |0 \x5A\xE9 |0 @@ -6100,6 +6492,7 @@ CHARMAP \x4C\x41 |0 \x55\x46 |0 \xBF\x96 |0 + \xB4\x76 |0 \xBF\x97 |0 \x4D\xDD |0 \xBF\x98 |0 @@ -6193,13 +6586,16 @@ CHARMAP \xBF\xBD |0 \x5A\xF8 |0 \xBF\xBE |0 + \xB4\x7A |0 \xBF\xBF |0 + \xB4\x7B |0 \x4B\xF2 |0 \xBF\xC0 |0 \xBF\xC1 |0 \x4A\xD5 |0 \x5A\xFB |0 \x5B\x41 |0 + \xB4\x7E |0 \xBF\xC2 |0 \xBF\xC3 |0 \x4F\x7E |0 @@ -6261,6 +6657,7 @@ CHARMAP \xBF\xE5 |0 \x5B\x51 |0 \x55\xF5 |0 + \xB4\x7F |0 \x51\xEF |0 \xBF\xE6 |0 \xBF\xE7 |0 @@ -6374,6 +6771,7 @@ CHARMAP \xC0\x5F |0 \x47\x7B |0 \xC0\x60 |0 + \xB4\x83 |0 \x5B\x77 |0 \x5B\x78 |0 \x5B\x7A |0 @@ -6387,6 +6785,7 @@ CHARMAP \x48\xAF |0 \x45\xC7 |0 \xC0\x64 |0 + \xB4\x84 |0 \x4A\xF7 |0 \xC0\x65 |0 \x5B\x7D |0 @@ -6424,6 +6823,7 @@ CHARMAP \xC0\x70 |0 \x5B\x86 |0 \x5B\x87 |0 + \xB4\x86 |0 \xC0\x71 |0 \x45\xCA |0 \x58\xED |0 @@ -6458,7 +6858,9 @@ CHARMAP \xC0\x7B |0 \xC0\x7C |0 \xC0\x7D |0 + \xB4\x87 |0 \x5B\x8C |0 + \xB4\x88 |0 \x45\xCD |0 \x4D\xA4 |0 \x48\x88 |0 @@ -6502,6 +6904,7 @@ CHARMAP \xC0\x8C |0 \x4F\xA3 |0 \x5B\x9C |0 + \xB4\x8C |0 \xC0\x8D |0 \xC0\x8E |0 \x5B\x97 |0 @@ -6551,6 +6954,7 @@ CHARMAP \x51\x93 |0 \xC0\xA0 |0 \xC0\xA1 |0 + \xB4\x8D |0 \x4F\x9F |0 \x4C\x98 |0 \x5B\x9E |0 @@ -6561,6 +6965,7 @@ CHARMAP \x5B\xA5 |0 \xC0\xA3 |0 \xC0\xA4 |0 + \xB4\x8E |0 \x5B\xA6 |0 \xC0\xA5 |0 \x4B\xB2 |0 @@ -6572,6 +6977,7 @@ CHARMAP \x5B\xA8 |0 \xC0\xA9 |0 \x5B\xAB |0 + \xB4\x90 |0 \xC0\xAA |0 \xC0\xAB |0 \x5B\xAD |0 @@ -6580,6 +6986,7 @@ CHARMAP \xC0\xAC |0 \xC0\xAD |0 \x5B\xAC |0 + \xB4\x92 |0 \x5B\xAA |0 \x5B\xA7 |0 \x55\x6D |0 @@ -6589,6 +6996,7 @@ CHARMAP \xC0\xAE |0 \xC0\xAF |0 \xC0\xB0 |0 + \xB4\x95 |0 \x49\xF8 |0 \x49\x93 |0 \x5B\xB0 |0 @@ -6649,6 +7057,7 @@ CHARMAP \xC0\xC9 |0 \xC0\xCA |0 \x5B\xB9 |0 + \xB4\x9B |0 \x4C\x56 |0 \xC0\xCB |0 \x5B\xBC |0 @@ -6685,6 +7094,7 @@ CHARMAP \x51\x66 |0 \x4B\xC3 |0 \x46\xF5 |0 + \xB4\x9D |0 \x56\xAC |0 \xC0\xD6 |0 \xC0\xD7 |0 @@ -6694,6 +7104,7 @@ CHARMAP \x47\xD4 |0 \x5B\xC8 |0 \x54\xFD |0 + \xB4\x9E |0 \xC0\xD8 |0 \x4F\xA4 |0 \x55\xF3 |0 @@ -6732,6 +7143,7 @@ CHARMAP \xC0\xE1 |0 \x46\x68 |0 \xC0\xE2 |0 + \xB4\xA0 |0 \x4E\x51 |0 \x50\xD0 |0 \x46\xBC |0 @@ -6780,6 +7192,7 @@ CHARMAP \xC0\xEE |0 \x4A\xE2 |0 \xC0\xEF |0 + \xB4\xA6 |0 \xC0\xF0 |0 \x4F\x78 |0 \xC0\xF1 |0 @@ -6830,6 +7243,7 @@ CHARMAP \x4F\xD8 |0 \xC1\x44 |0 \x4E\xE1 |0 + \xB4\xA9 |0 \xC1\x45 |0 \x5B\xED |0 \x54\xF3 |0 @@ -6852,6 +7266,7 @@ CHARMAP \xC1\x4B |0 \xC1\x4C |0 \x47\x73 |0 + \xB4\xAB |0 \x50\x54 |0 \x4A\xC1 |0 \x5B\xF3 |0 @@ -6859,10 +7274,12 @@ CHARMAP \x47\xD3 |0 \x45\xFA |0 \x51\xF1 |1 + \xB4\xAA |0 \x50\xE3 |0 \xC1\x4D |0 \x4D\xCC |0 \x47\x9B |0 + \xB4\xAC |0 \xC1\x4E |0 \xC1\x4F |0 \x5B\xF5 |0 @@ -6887,6 +7304,7 @@ CHARMAP \xC1\x59 |0 \x47\xDE |0 \x4D\xE0 |0 + \xB4\xAD |0 \xC1\x5A |0 \x5B\xF8 |0 \x50\xD6 |0 @@ -6896,6 +7314,7 @@ CHARMAP \xC1\x5B |0 \x5B\xF6 |0 \x48\xF1 |0 + \xB4\xAE |0 \xC1\x5C |0 \xC1\x5D |0 \x5B\xF7 |0 @@ -6941,11 +7360,13 @@ CHARMAP \x5B\xFE |0 \x5B\xFE |1 \x5C\x45 |0 + \xB4\xB4 |0 \x50\xDA |0 \x5C\x47 |0 \xC1\x71 |0 \x52\xCC |0 \xC1\x72 |0 + \xB4\xB6 |0 \xC1\x73 |0 \x53\xBC |0 \xC1\x74 |0 @@ -6961,6 +7382,7 @@ CHARMAP \x48\x58 |0 \xC1\x78 |0 \xC1\x79 |0 + \xB4\xB7 |0 \x5C\x46 |0 \xC1\x7A |0 \x51\xE4 |0 @@ -6968,12 +7390,14 @@ CHARMAP \x53\x59 |0 \xC1\x7B |0 \x53\x61 |0 + \xB4\xB8 |0 \x5C\x4C |0 \x49\xAD |0 \x5C\x4A |0 \x5C\x4D |0 \xC1\x7C |0 \x5C\x49 |0 + \xB4\xBA |0 \x4E\xB1 |0 \xC1\x7D |0 \x5C\x60 |0 @@ -7001,6 +7425,7 @@ CHARMAP \x5C\x5E |0 \x5C\x54 |0 \x5C\x5D |0 + \xB4\xBB |0 \xC1\x86 |0 \x5C\x58 |0 \xC1\x87 |0 @@ -7015,6 +7440,7 @@ CHARMAP \x53\x75 |0 \xC1\x8E |0 \xC1\x8F |0 + \xB4\xBC |0 \x54\x94 |0 \x55\xB6 |0 \xC1\x90 |0 @@ -7022,9 +7448,11 @@ CHARMAP \xC1\x92 |0 \x54\x68 |0 \x5C\x4F |0 + \xB4\xBD |0 \x5C\x5C |0 \x4F\xF7 |0 \xC1\x93 |0 + \xB4\xBE |0 \x5C\x51 |0 \xC1\x94 |0 \xC1\x95 |0 @@ -7063,6 +7491,7 @@ CHARMAP \x4C\xBA |0 \xC1\xA0 |0 \xC1\xA1 |0 + \xB4\xC3 |0 \xC1\xA2 |0 \x51\xD7 |0 \xC1\xA3 |0 @@ -7130,6 +7559,7 @@ CHARMAP \xC1\xBB |0 \x51\x4A |0 \xC1\xBC |0 + \xB4\xC7 |0 \x5C\x80 |0 \x5C\x76 |0 \x53\xB2 |0 @@ -7140,6 +7570,7 @@ CHARMAP \xC1\xC0 |0 \x5C\x7C |0 \x5C\x77 |0 + \xB4\xC8 |0 \x5C\x7A |0 \x5C\x83 |0 \xC1\xC1 |0 @@ -7150,6 +7581,7 @@ CHARMAP \x4E\xFA |0 \x52\xDB |0 \x5C\x7D |0 + \xB4\xC9 |0 \x54\x8C |0 \xC1\xC3 |0 \x5C\x7B |0 @@ -7160,9 +7592,12 @@ CHARMAP \x5C\x81 |0 \x5C\x87 |0 \x5C\x90 |0 + \xB4\xCC |0 \xC1\xC6 |0 \x5C\x8F |0 \x5C\x89 |0 + \xB4\xCD |0 + \xB4\xCE |0 \x5C\x94 |0 \x5C\x92 |0 \xC1\xC7 |0 @@ -7170,7 +7605,9 @@ CHARMAP \xC1\xC9 |0 \x5C\x8E |0 \xC1\xCA |0 + \xB4\xCF |0 \xC1\xCB |0 + \xB4\xD0 |0 \x5C\x8D |0 \x4B\x5C |0 \x4D\xB7 |0 @@ -7209,6 +7646,7 @@ CHARMAP \x5C\x88 |0 \x5C\x9A |0 \xC1\xD8 |0 + \xB4\xD7 |0 \xC1\xD9 |0 \x55\x85 |0 \x5C\x9F |0 @@ -7249,6 +7687,7 @@ CHARMAP \x5C\xA8 |0 \x5C\xA9 |0 \x5C\xA0 |0 + \xB4\xD8 |0 \x5C\xAF |0 \x4F\xB2 |0 \x4F\xF5 |0 @@ -7263,6 +7702,7 @@ CHARMAP \x55\xEE |0 \x5C\xAA |0 \xC1\xF2 |0 + \xB4\xDA |0 \x5C\xB0 |0 \xC1\xF3 |0 \x4D\x55 |0 @@ -7270,6 +7710,7 @@ CHARMAP \xC1\xF5 |0 \xC1\xF6 |0 \x5C\x9E |0 + \xB4\xDB |0 \x5C\xAD |0 \x5C\xAE |0 \xC1\xF7 |0 @@ -7315,6 +7756,7 @@ CHARMAP \xC2\x4E |0 \xC2\x4F |0 \xC2\x50 |0 + \xB4\xE1 |0 \x5C\xC2 |0 \x52\xEE |0 \xC2\x51 |0 @@ -7327,6 +7769,7 @@ CHARMAP \xC2\x56 |0 \xC2\x57 |0 \x5C\xC1 |0 + \xB4\xE6 |0 \xC2\x58 |0 \xC2\x59 |0 \xC2\x5A |0 @@ -7380,24 +7823,29 @@ CHARMAP \x48\xD8 |0 \x45\x77 |0 \x4D\x4C |0 + \xB4\xEA |0 \x45\xB1 |0 \xC2\x6F |0 \x47\xD8 |0 \x55\x8E |0 \xC2\x70 |0 + \xB4\xEB |0 \xC2\x71 |0 \x4A\x9F |0 \xC2\x72 |0 \x48\xE4 |0 \x49\x55 |0 \xC2\x73 |0 + \xB4\xEC |0 \x5C\xD4 |0 \x5C\xD5 |0 + \xB4\xED |0 \x49\x99 |0 \xC2\x74 |0 \xC2\x75 |0 \x5C\xD6 |0 \x5C\xD7 |0 + \xB4\xEE |0 \xC2\x76 |0 \x5C\xD9 |0 \x5C\xD8 |0 @@ -7446,15 +7894,19 @@ CHARMAP \xC2\x89 |0 \x4A\x5B |0 \x5C\xE7 |0 + \xB4\xF1 |0 + \xB4\xF2 |0 \xC2\x8A |0 \x5C\xE8 |0 \xC2\x8B |0 \x49\x69 |0 \x49\xF5 |0 + \xB4\xF3 |0 \x4C\x97 |0 \x5C\xE9 |0 \x47\x4E |0 \x5C\xEA |0 + \xB4\xF4 |0 \x53\xD7 |0 \xC2\x8C |0 \x46\xE2 |0 @@ -7477,6 +7929,7 @@ CHARMAP \xC2\x98 |0 \x5C\xF0 |0 \xC2\x99 |0 + \xB4\xF5 |0 \xC2\x9A |0 \xC2\x9B |0 \x48\x8E |0 @@ -7548,6 +8001,7 @@ CHARMAP \x5D\x42 |0 \x5C\xFB |0 \x55\xD9 |0 + \xB4\xF7 |0 \xC2\xBA |0 \x5C\xFD |0 \xC2\xBB |0 @@ -7570,7 +8024,9 @@ CHARMAP \xC2\xC2 |0 \x50\x75 |0 \x45\x85 |0 + \xB4\xF9 |0 \x53\xEC |0 + \xB4\xFA |0 \x5D\x4D |0 \xC2\xC3 |0 \x5D\x50 |0 @@ -7619,6 +8075,7 @@ CHARMAP \x5D\x56 |0 \xC2\xD3 |0 \xC2\xD4 |0 + \xB4\xFB |0 \xC2\xD5 |0 \x5D\x54 |0 \x46\xF3 |0 @@ -7626,6 +8083,8 @@ CHARMAP \xC2\xD6 |0 \x4F\x57 |0 \xC2\xD7 |0 + \xB4\xFD |0 + \xB4\xFE |0 \x5D\x58 |0 \xC2\xD8 |0 \xC2\xD9 |0 @@ -7642,6 +8101,7 @@ CHARMAP \x54\x50 |0 \x4D\x98 |0 \x5D\x57 |0 + \xB5\x41 |0 \x45\xDC |0 \xC2\xDF |0 \xC2\xE0 |0 @@ -7654,6 +8114,7 @@ CHARMAP \xC2\xE4 |0 \x4B\x72 |0 \x5D\x5C |0 + \xB5\x42 |0 \x52\xAC |0 \x5D\x59 |0 \x50\xBC |0 @@ -7667,11 +8128,14 @@ CHARMAP \x4C\xC9 |0 \x46\x8D |0 \xC2\xE8 |0 + \xB5\x46 |0 \x5D\x66 |0 \x5D\x64 |0 + \xB5\x47 |0 \x45\xEA |0 \xC2\xE9 |0 \xC2\xEA |0 + \xB5\x48 |0 \xC2\xEB |0 \x5D\x5F |0 \x5D\x63 |0 @@ -7689,11 +8153,16 @@ CHARMAP \x4D\x41 |0 \x5D\x65 |0 \xC2\xEF |0 + \xB5\x4A |0 + \xB5\x4B |0 \xC2\xF0 |0 \x5D\x6A |0 \x5D\x60 |0 \x48\x6B |0 + \xB5\x4C |0 + \xB5\x4D |0 \x4F\x7D |0 + \xB5\x4E |0 \x5D\x67 |0 \xC2\xF1 |0 \xC2\xF2 |0 @@ -7707,7 +8176,9 @@ CHARMAP \x5D\x69 |0 \x55\x50 |0 \xC2\xF6 |0 + \xB5\x50 |0 \x5D\x72 |0 + \xB5\x51 |0 \x4F\x91 |0 \x4A\x45 |0 \xC2\xF7 |0 @@ -7719,6 +8190,7 @@ CHARMAP \xC2\xFA |0 \xC2\xFB |0 \x4A\x88 |0 + \xB5\x52 |0 \xC2\xFC |0 \x5D\x7C |0 \x5D\x75 |0 @@ -7729,12 +8201,14 @@ CHARMAP \x5D\x78 |0 \xC3\x41 |0 \x5D\x74 |0 + \xB5\x53 |0 \x4A\xBF |0 \x5D\x7B |0 \x5D\x82 |0 \xC3\x42 |0 \x55\xE1 |0 \x5D\x7E |0 + \xB5\x54 |0 \xC3\x43 |0 \xC3\x44 |0 \x5D\x77 |0 @@ -7775,6 +8249,7 @@ CHARMAP \x48\x92 |0 \x51\x98 |0 \x51\x64 |0 + \xB5\x56 |0 \x5D\x87 |0 \x50\xE4 |0 \x47\x8A |0 @@ -7796,6 +8271,7 @@ CHARMAP \x5D\x6E |0 \x48\xC6 |0 \xC3\x52 |0 + \xB5\x5B |0 \xC3\x53 |0 \x5D\x9A |0 \x5D\x8A |0 @@ -7810,6 +8286,7 @@ CHARMAP \xC3\x58 |0 \x4C\x88 |0 \xC3\x59 |0 + \xB5\x5C |0 \x5D\x91 |0 \x5D\x97 |0 \xC3\x5A |0 @@ -7857,12 +8334,14 @@ CHARMAP \x53\x76 |0 \xC3\x6C |0 \x5D\x9C |0 + \xB5\x5E |0 \xC3\x6D |0 \xC3\x6E |0 \x5D\xA0 |0 \xC3\x6F |0 \x5D\xA2 |0 \xC3\x70 |0 + \xB5\x5F |0 \x48\xBE |0 \x5D\x9E |0 \x54\x97 |0 @@ -7888,6 +8367,7 @@ CHARMAP \x52\x4A |0 \x5D\xA3 |0 \x5D\xA4 |0 + \xB5\x60 |0 \x47\xA3 |0 \x4D\xA1 |0 \xC3\x7B |0 @@ -7914,6 +8394,7 @@ CHARMAP \xC3\x84 |0 \xC3\x85 |0 \x50\xC4 |0 + \xB5\x61 |0 \x55\x75 |0 \x5D\xB6 |0 \x49\xED |0 @@ -7925,6 +8406,7 @@ CHARMAP \x50\x8E |0 \x4F\x58 |0 \x54\xE0 |0 + \xB5\x63 |0 \xC3\x8A |0 \xC3\x8B |0 \xC3\x8C |0 @@ -7936,6 +8418,7 @@ CHARMAP \x5D\xB0 |0 \x5D\xB2 |0 \xC3\x90 |0 + \xB5\x64 |0 \xC3\x91 |0 \x4D\x73 |0 \xC3\x92 |0 @@ -7958,6 +8441,7 @@ CHARMAP \xC3\x9B |0 \xC3\x9C |0 \x46\xC2 |0 + \xB5\x65 |0 \xC3\x9D |0 \xC3\x9E |0 \x4A\xD2 |0 @@ -7993,6 +8477,7 @@ CHARMAP \xC3\xAB |0 \xC3\xAC |0 \x54\xBA |0 + \xB5\x67 |0 \xC3\xAD |0 \xC3\xAE |0 \xC3\xAF |0 @@ -8013,6 +8498,7 @@ CHARMAP \xC3\xB7 |0 \x5D\xCC |0 \xC3\xB8 |0 + \xB5\x69 |0 \x4B\xD0 |0 \x50\xBE |0 \x5D\xCF |0 @@ -8021,6 +8507,7 @@ CHARMAP \x5D\xC4 |0 \xC3\xBA |0 \xC3\xBB |0 + \xB5\x6A |0 \xC3\xBC |0 \x5D\xD4 |0 \x5D\xD1 |0 @@ -8054,6 +8541,7 @@ CHARMAP \xC3\xC6 |0 \x5D\xD8 |0 \x5D\xD9 |0 + \xB5\x6B |0 \x5D\xDA |0 \xC3\xC7 |0 \x5D\xDE |0 @@ -8078,10 +8566,12 @@ CHARMAP \xC3\xCC |0 \xC3\xCD |0 \xC3\xCE |0 + \xB5\x6D |0 \xC3\xCF |0 \x5D\xE6 |0 \xC3\xD0 |0 \xC3\xD1 |0 + \xB5\x6F |0 \xC3\xD2 |0 \xC3\xD3 |0 \xC3\xD4 |0 @@ -8097,6 +8587,7 @@ CHARMAP \x5D\xE9 |0 \xC3\xDB |0 \xC3\xDC |0 + \xB5\x71 |0 \x47\x85 |0 \xC3\xDD |0 \xC3\xDE |0 @@ -8122,6 +8613,7 @@ CHARMAP \xC3\xE8 |0 \x5D\xEB |0 \xC3\xE9 |0 + \xB5\x72 |0 \xC3\xEA |0 \x5D\xED |0 \x5D\xEE |0 @@ -8152,6 +8644,7 @@ CHARMAP \x53\x8C |0 \x5D\xF1 |0 \xC3\xF7 |0 + \xB5\x75 |0 \x5D\xF7 |0 \x55\x87 |0 \xC3\xF8 |0 @@ -8161,6 +8654,7 @@ CHARMAP \xC3\xFA |0 \xC3\xFB |0 \xC3\xFC |0 + \xB5\x76 |0 \x5D\xF4 |0 \xC3\xFD |0 \xC3\xFE |0 @@ -8175,6 +8669,7 @@ CHARMAP \x4D\xE6 |0 \xC4\x43 |0 \xC4\x44 |0 + \xB5\x78 |0 \xC4\x45 |0 \xC4\x46 |0 \xC4\x47 |0 @@ -8191,7 +8686,9 @@ CHARMAP \x5E\x42 |0 \x54\x90 |0 \xC4\x4D |0 + \xB5\x79 |0 \xC4\x4E |0 + \xB5\x7A |0 \x68\x85 |0 \x5E\x43 |0 \xC4\x4F |0 @@ -8222,6 +8719,7 @@ CHARMAP \xC4\x59 |0 \x52\x9D |0 \x5E\x48 |0 + \xB5\x7D |0 \x4F\x68 |0 \xC4\x5A |0 \xC4\x5B |0 @@ -8230,6 +8728,7 @@ CHARMAP \xC4\x5D |0 \x54\xBB |0 \x5E\x4A |0 + \xB5\x7E |0 \xC4\x5E |0 \xC4\x5F |0 \x47\xD5 |0 @@ -8281,6 +8780,7 @@ CHARMAP \x5E\x5C |0 \x5E\x5D |0 \xC4\x72 |0 + \xB5\x81 |0 \xC4\x73 |0 \xC4\x74 |0 \x53\x7C |0 @@ -8323,6 +8823,7 @@ CHARMAP \xC4\x84 |0 \xC4\x85 |0 \xC4\x86 |0 + \xB5\x83 |0 \x5E\x69 |0 \x53\xFC |0 \xC4\x87 |0 @@ -8372,12 +8873,14 @@ CHARMAP \xC4\x9D |0 \xC4\x9E |0 \x4C\xA7 |0 + \xB5\x87 |0 \x5E\x73 |0 \x5E\x74 |0 \xC4\x9F |0 \x48\x52 |0 \x5E\x79 |0 \x5E\x75 |0 + \xB5\x88 |0 \xC4\xA0 |0 \x4E\x5A |0 \x5E\x76 |0 @@ -8444,10 +8947,12 @@ CHARMAP \x5E\x89 |0 \xC4\xBD |0 \xC4\xBE |0 + \xB5\x8D |0 \x5E\x87 |0 \xC4\xBF |0 \x50\x4F |0 \x53\xDD |0 + \xB5\x8F |0 \xC4\xC0 |0 \xC4\xC1 |0 \xC4\xC2 |0 @@ -8496,10 +9001,12 @@ CHARMAP \xC4\xDB |0 \x47\x83 |0 \x45\xFD |0 + \xB5\x92 |0 \x49\xB1 |0 \xC4\xDC |0 \xC4\xDD |0 \xC4\xDE |0 + \xB5\x93 |0 \xC4\xDF |0 \x4D\xE9 |0 \xC4\xE0 |0 @@ -8511,6 +9018,7 @@ CHARMAP \xC4\xE6 |0 \xC4\xE7 |0 \xC4\xE8 |0 + \xB5\x94 |0 \x4E\x4C |0 \xC4\xE9 |0 \xC4\xEA |0 @@ -8573,6 +9081,7 @@ CHARMAP \x50\xF7 |0 \xC5\x49 |0 \xC5\x4A |0 + \xB5\x95 |0 \xC5\x4B |0 \xC5\x4C |0 \x4E\x5C |0 @@ -8607,6 +9116,7 @@ CHARMAP \xC5\x5C |0 \xC5\x5D |0 \xC5\x5E |0 + \xB5\x97 |0 \x5E\xB1 |0 \xC5\x5F |0 \x5E\xB4 |0 @@ -8641,12 +9151,14 @@ CHARMAP \xC5\x6B |0 \xC5\x6C |0 \xC5\x6D |0 + \xB5\x98 |0 \x5E\xBD |0 \x50\x4D |0 \xC5\x6E |0 \xC5\x6F |0 \xC5\x70 |0 \xC5\x71 |0 + \xB5\x99 |0 \xC5\x72 |0 \xC5\x73 |0 \xC5\x74 |0 @@ -8657,6 +9169,7 @@ CHARMAP \xC5\x77 |0 \x5E\xC2 |0 \xC5\x78 |0 + \xB5\x9B |0 \xC5\x79 |0 \x5E\xC3 |0 \xC5\x7A |0 @@ -8670,6 +9183,7 @@ CHARMAP \xC5\x81 |0 \xC5\x82 |0 \xC5\x83 |0 + \xB5\x9C |0 \xC5\x84 |0 \x52\x49 |0 \xC5\x85 |0 @@ -8681,6 +9195,7 @@ CHARMAP \xC5\x89 |0 \xC5\x8A |0 \x5E\xC6 |0 + \xB5\x9D |0 \xC5\x8B |0 \xC5\x8C |0 \xC5\x8D |0 @@ -8791,10 +9306,12 @@ CHARMAP \x52\xFD |0 \x48\xB9 |0 \x5E\xE6 |0 + \xB5\xA2 |0 \x5E\xE9 |0 \x5E\xE7 |0 \x4A\xA9 |0 \xC5\xB4 |0 + \xB5\xA3 |0 \x4E\x54 |0 \x5E\xE8 |0 \x5E\xEB |0 @@ -8815,6 +9332,7 @@ CHARMAP \x5E\xF0 |0 \x5E\xEF |0 \x4E\xA0 |0 + \xB5\xA5 |0 \x51\x71 |0 \x55\xB0 |0 \xC5\xBD |0 @@ -8832,11 +9350,13 @@ CHARMAP \xC5\xC4 |0 \x5E\xF4 |0 \x50\xCE |0 + \xB5\xA9 |0 \x5E\xFD |0 \x4D\x97 |0 \x5E\xF7 |0 \xC5\xC5 |0 \x5E\xF9 |0 + \xB5\xAA |0 \x5E\xFB |0 \x54\xE1 |0 \xC5\xC6 |0 @@ -8858,6 +9378,7 @@ CHARMAP \xC5\xCD |0 \xC5\xCE |0 \x5F\x42 |0 + \xB5\xAB |0 \x51\x82 |0 \x53\xFD |0 \xC5\xCF |0 @@ -8865,6 +9386,7 @@ CHARMAP \x5F\x43 |0 \x4C\x47 |0 \xC5\xD0 |0 + \xB5\xAC |0 \x5F\x45 |0 \xC5\xD1 |0 \xC5\xD2 |0 @@ -8904,6 +9426,7 @@ CHARMAP \xC5\xE5 |0 \xC5\xE6 |0 \xC5\xE7 |0 + \xB5\xAF |0 \xC5\xE8 |0 \xC5\xE9 |0 \xC5\xEA |0 @@ -8918,6 +9441,7 @@ CHARMAP \xC5\xEE |0 \xC5\xEF |0 \x5F\x51 |0 + \xB5\xB1 |0 \xC5\xF0 |0 \xC5\xF1 |0 \x5F\x57 |0 @@ -8998,6 +9522,7 @@ CHARMAP \x5F\x71 |0 \xC6\x53 |0 \xC6\x54 |0 + \xB5\xB6 |0 \xC6\x55 |0 \xC6\x56 |0 \xC6\x57 |0 @@ -9008,8 +9533,10 @@ CHARMAP \xC6\x5B |0 \xC6\x5C |0 \x49\xDA |0 + \xB5\xB7 |0 \x5F\x74 |0 \x5F\x75 |0 + \xB5\xB8 |0 \x68\x68 |0 \x5F\x76 |0 \x5F\x77 |0 @@ -9111,6 +9638,7 @@ CHARMAP \xC6\x8B |0 \xC6\x8C |0 \xC6\x8D |0 + \xB5\xBF |0 \x5F\x90 |0 \x5F\x93 |0 \xC6\x8E |0 @@ -9134,6 +9662,7 @@ CHARMAP \xC6\x9A |0 \x5F\x97 |0 \xC6\x9B |0 + \xB5\xC1 |0 \xC6\x9C |0 \x5F\x96 |0 \x5F\x95 |0 @@ -9152,8 +9681,10 @@ CHARMAP \xC6\xA5 |0 \x5F\x9B |0 \xC6\xA6 |0 + \xB5\xC5 |0 \x55\x72 |0 \xC6\xA7 |0 + \xB5\xC6 |0 \xC6\xA8 |0 \x4D\xB0 |0 \x52\x7D |0 @@ -9215,6 +9746,7 @@ CHARMAP \x5F\xAD |0 \x46\xD3 |0 \x4C\xC3 |0 + \xB5\xCA |0 \xC6\xC6 |0 \x5F\xB0 |0 \x5F\xAE |0 @@ -9223,6 +9755,7 @@ CHARMAP \x4D\x45 |0 \x54\xB4 |0 \x52\x48 |0 + \xB5\xC9 |0 \xC6\xC9 |0 \xC6\xCA |0 \xC6\xCB |0 @@ -9239,6 +9772,8 @@ CHARMAP \xC6\xD1 |0 \xC6\xD2 |0 \x5F\xB2 |0 + \xB5\xCB |0 + \xB5\xCC |0 \xC6\xD3 |0 \xC6\xD4 |0 \x49\x76 |0 @@ -9331,9 +9866,11 @@ CHARMAP \x5F\xCB |0 \xC7\x44 |0 \xC7\x45 |0 + \xB5\xD1 |0 \xC7\x46 |0 \xC7\x47 |0 \x5F\xCA |0 + \xB5\xD2 |0 \xC7\x48 |0 \xC7\x49 |0 \x51\xB0 |0 @@ -9346,6 +9883,7 @@ CHARMAP \x4D\xF0 |0 \x5F\xCE |0 \xC7\x4D |0 + \xB5\xD4 |0 \xC7\x4E |0 \xC7\x4F |0 \xC7\x50 |0 @@ -9358,6 +9896,7 @@ CHARMAP \x5F\xD0 |0 \x5F\xCF |0 \xC7\x55 |0 + \xB5\xD5 |0 \x5F\xD1 |0 \xC7\x56 |0 \xC7\x57 |0 @@ -9457,6 +9996,8 @@ CHARMAP \x5F\xE3 |0 \xC7\x84 |0 \x46\x58 |0 + \xB5\xDF |0 + \xB5\xE0 |0 \xC7\x85 |0 \x48\xED |0 \x4D\xBA |0 @@ -9606,6 +10147,7 @@ CHARMAP \x55\x9E |0 \xC7\xCC |0 \xC7\xCD |0 + \xB5\xEC |0 \x60\x47 |0 \x60\x46 |0 \x60\x49 |0 @@ -9664,6 +10206,7 @@ CHARMAP \x60\x60 |0 \x60\x5F |0 \x49\xB5 |0 + \xB5\xF1 |0 \xC7\xDC |0 \x53\xE7 |0 \x60\x65 |0 @@ -9690,6 +10233,7 @@ CHARMAP \x60\x67 |0 \x60\x64 |0 \x49\x6E |0 + \xB5\xF3 |0 \xC7\xE9 |0 \xC7\xEA |0 \xC7\xEB |0 @@ -9729,7 +10273,9 @@ CHARMAP \x60\x70 |0 \x60\x6E |0 \xC7\xF9 |0 + \xB5\xF6 |0 \x60\x6F |0 + \xB5\xF7 |0 \xC7\xFA |0 \x55\x9B |0 \x4F\x51 |0 @@ -9799,6 +10345,7 @@ CHARMAP \x60\x84 |0 \xC8\x5A |0 \x54\x44 |0 + \xB5\xFE |0 \xC8\x5B |0 \x60\x8C |0 \xC8\x5C |0 @@ -9830,7 +10377,7 @@ CHARMAP \x51\x7C |0 \xC8\x6D |0 \xC8\x6E |0 - \x54\xCA |1 + \xB6\x41 |0 \x60\x92 |0 \xC8\x6F |0 \x4B\xEC |0 @@ -9855,6 +10402,7 @@ CHARMAP \x4F\x4C |0 \x60\x96 |0 \x60\x98 |0 + \xB6\x43 |0 \xC8\x7A |0 \xC8\x7B |0 \x60\x97 |0 @@ -9867,6 +10415,7 @@ CHARMAP \x4F\x99 |0 \xC8\x7F |0 \x60\x99 |0 + \xB6\x45 |0 \x60\x9B |0 \xC8\x80 |0 \xC8\x81 |0 @@ -9885,6 +10434,7 @@ CHARMAP \x60\x9E |0 \xC8\x8A |0 \xC8\x8B |0 + \xB6\x46 |0 \xC8\x8C |0 \xC8\x8D |0 \x46\x6F |0 @@ -10118,6 +10668,7 @@ CHARMAP \x60\xD6 |0 \x49\xDC |0 \x48\x9D |0 + \xB6\x58 |0 \xC8\xE9 |0 \xC8\xEA |0 \xC8\xEB |0 @@ -10144,6 +10695,7 @@ CHARMAP \x4A\x80 |0 \x60\xE7 |0 \xC8\xF3 |0 + \xB6\x5A |0 \x60\xE2 |0 \xC8\xF4 |0 \xC8\xF5 |0 @@ -10239,6 +10791,7 @@ CHARMAP \xC9\x5D |0 \x4B\x69 |0 \xC9\x5E |0 + \xB6\x60 |0 \xC9\x5F |0 \x61\x43 |0 \x61\x47 |0 @@ -10400,6 +10953,7 @@ CHARMAP \xC9\xA3 |0 \x52\xA0 |0 \x49\x85 |0 + \xB6\x69 |0 \x47\x60 |0 \x61\x81 |0 \x46\x70 |0 @@ -10447,6 +11001,7 @@ CHARMAP \xC9\xBD |0 \x61\x88 |0 \xC9\xBE |0 + \xB6\x6B |0 \xC9\xBF |0 \x61\x8B |0 \x61\x8A |0 @@ -10473,6 +11028,7 @@ CHARMAP \x61\x94 |0 \x48\xD7 |0 \x61\x95 |0 + \xB6\x6C |0 \x61\x96 |0 \x53\xE4 |0 \x61\x97 |0 @@ -10489,6 +11045,7 @@ CHARMAP \x61\x9A |0 \x52\x67 |0 \x52\x6A |0 + \xB6\x6D |0 \x61\x9B |0 \x52\x92 |0 \xC9\xC9 |0 @@ -10496,6 +11053,7 @@ CHARMAP \xC9\xCA |0 \x4C\xC5 |0 \x53\x82 |0 + \xB6\x6E |0 \x49\x7B |0 \xC9\xCB |0 \xC9\xCC |0 @@ -10513,8 +11071,10 @@ CHARMAP \x50\x4E |0 \x4D\xF6 |0 \x61\xA3 |0 + \xB6\x6F |0 \x4E\x9B |0 \xC9\xD0 |0 + \xB6\x70 |0 \x4A\xB2 |0 \xC9\xD1 |0 \x52\x63 |0 @@ -10534,6 +11094,7 @@ CHARMAP \x4D\x63 |0 \x4E\xE9 |0 \x61\xA0 |0 + \xB6\x71 |0 \xC9\xD9 |0 \xC9\xDA |0 \x61\xA6 |0 @@ -10542,10 +11103,12 @@ CHARMAP \xC9\xDC |0 \xC9\xDD |0 \x4E\xAB |0 + \xB6\x73 |0 \xC9\xDE |0 \x4B\xE3 |0 \xC9\xDF |0 \xC9\xE0 |0 + \xB6\x74 |0 \x61\xB0 |0 \x47\x4F |0 \xC9\xE1 |0 @@ -10558,6 +11121,7 @@ CHARMAP \x61\xA5 |0 \x53\x5E |0 \xC9\xE3 |0 + \xB6\x77 |0 \xC9\xE4 |0 \xC9\xE5 |0 \xC9\xE6 |0 @@ -10579,6 +11143,7 @@ CHARMAP \x55\xE9 |0 \xC9\xEF |0 \xC9\xF0 |0 + \xB6\x79 |0 \x61\xAD |0 \x61\xB0 |1 \xC9\xF1 |0 @@ -10656,6 +11221,7 @@ CHARMAP \x61\xC6 |0 \x53\x5F |0 \x61\xC8 |0 + \xB6\x7F |0 \x61\xC9 |0 \xCA\x51 |0 \xCA\x52 |0 @@ -10670,6 +11236,7 @@ CHARMAP \x61\xCD |0 \x4D\xBD |0 \xCA\x57 |0 + \xB6\x80 |0 \xCA\x58 |0 \x61\xCE |0 \x61\xCF |0 @@ -10708,6 +11275,7 @@ CHARMAP \x61\xD6 |0 \x61\xD7 |0 \xCA\x6A |0 + \xB6\x87 |0 \x61\xD8 |0 \x53\x58 |0 \x46\x6A |0 @@ -10748,17 +11316,20 @@ CHARMAP \x61\xE0 |0 \x46\x7B |0 \xCA\x76 |0 + \xB6\x8B |0 \x61\xE2 |0 \xCA\x77 |0 \xCA\x78 |0 \xCA\x79 |0 \xCA\x7A |0 \x4D\xFC |0 + \xB6\x8C |0 \xCA\x7B |0 \xCA\x7C |0 \xCA\x7D |0 \xCA\x7E |0 \xCA\x7F |0 + \xB6\x90 |0 \x54\xAE |0 \x61\xE3 |0 \x61\xE4 |0 @@ -10783,6 +11354,7 @@ CHARMAP \x4D\x54 |0 \x61\xED |0 \x53\xC5 |0 + \xB6\x96 |0 \xCA\x86 |0 \xCA\x87 |0 \x61\xEE |0 @@ -10799,6 +11371,7 @@ CHARMAP \xCA\x90 |0 \xCA\x91 |0 \x61\xF0 |0 + \xB6\x98 |0 \xCA\x92 |0 \xCA\x93 |0 \xCA\x94 |0 @@ -10886,6 +11459,7 @@ CHARMAP \x62\x45 |0 \xCA\xBA |0 \xCA\xBB |0 + \xB6\x99 |0 \x4E\xC9 |0 \x62\x4A |0 \x53\xF6 |0 @@ -10939,6 +11513,7 @@ CHARMAP \xCA\xD6 |0 \x4B\x62 |0 \x62\x48 |0 + \xB6\x9C |0 \xCA\xD7 |0 \x62\x5F |0 \x62\x5A |0 @@ -11005,6 +11580,8 @@ CHARMAP \xCA\xF4 |0 \x53\xD4 |0 \x62\x70 |0 + \xB6\x9F |0 + \xB6\xA0 |0 \xCA\xF5 |0 \x51\x6A |0 \xCA\xF6 |0 @@ -11035,6 +11612,7 @@ CHARMAP \xCA\xFE |0 \x62\x66 |0 \xCB\x41 |0 + \xB6\xA2 |0 \xCB\x42 |0 \x62\x73 |0 \x54\xD8 |0 @@ -11066,6 +11644,7 @@ CHARMAP \xCB\x4F |0 \x48\xDF |0 \xCB\x50 |0 + \xB6\xA5 |0 \xCB\x51 |0 \x55\x47 |0 \x62\x78 |0 @@ -11103,6 +11682,7 @@ CHARMAP \xCB\x60 |0 \x4F\xE3 |0 \xCB\x61 |0 + \xB6\xA6 |0 \x50\x95 |0 \x52\x59 |0 \xCB\x62 |0 @@ -11137,6 +11717,7 @@ CHARMAP \x4F\x6D |0 \xCB\x70 |0 \x62\x8B |0 + \xB6\xA8 |0 \xCB\x71 |0 \x62\x8E |0 \x4F\x9A |0 @@ -11175,6 +11756,7 @@ CHARMAP \x62\x97 |0 \x62\x98 |0 \x54\x9A |0 + \xB6\xAA |0 \xCB\x83 |0 \xCB\x84 |0 \x62\x9A |0 @@ -11196,6 +11778,7 @@ CHARMAP \x46\x5E |0 \xCB\x90 |0 \x54\xD1 |0 + \xB6\xAE |0 \xCB\x91 |0 \x62\xA0 |0 \x62\xA5 |0 @@ -11299,11 +11882,13 @@ CHARMAP \x62\xC0 |0 \x62\xC1 |0 \xCB\xC3 |0 + \xB6\xB4 |0 \xCB\xC4 |0 \x62\xC4 |0 \x62\xC2 |0 \xCB\xC5 |0 \xCB\xC6 |0 + \xB6\xB5 |0 \x45\x68 |0 \x62\xC3 |0 \xCB\xC7 |0 @@ -11343,6 +11928,7 @@ CHARMAP \xCB\xD9 |0 \xCB\xDA |0 \x62\xCA |0 + \xB6\xB6 |0 \xCB\xDB |0 \xCB\xDC |0 \x4C\xA6 |0 @@ -11350,6 +11936,7 @@ CHARMAP \x62\xCC |0 \xCB\xDD |0 \xCB\xDE |0 + \xB6\xB9 |0 \xCB\xDF |0 \xCB\xE0 |0 \xCB\xE1 |0 @@ -11370,6 +11957,7 @@ CHARMAP \xCB\xEA |0 \xCB\xEB |0 \x4F\x72 |0 + \xB6\xBB |0 \x52\x50 |0 \xCB\xEC |0 \x55\x88 |0 @@ -11391,7 +11979,9 @@ CHARMAP \x51\xB6 |0 \xCB\xF8 |0 \x51\x44 |0 + \xB6\xBE |0 \xCB\xF9 |0 + \xB6\xBF |0 \x4F\xAA |0 \x62\xD8 |0 \x62\xDA |0 @@ -11403,6 +11993,7 @@ CHARMAP \xCB\xFD |0 \xCB\xFE |0 \xCC\x41 |0 + \xB6\xC0 |0 \xCC\x42 |0 \x62\xD6 |0 \x55\xA2 |0 @@ -11450,6 +12041,7 @@ CHARMAP \xCC\x5A |0 \x55\xC2 |0 \xCC\x5B |0 + \xB6\xC1 |0 \xCC\x5C |0 \x62\xE6 |0 \x62\xE7 |0 @@ -11514,6 +12106,7 @@ CHARMAP \x62\xFD |0 \xCC\x7B |0 \x62\xFE |0 + \xB6\xC3 |0 \x63\x49 |0 \x53\x47 |0 \x63\x42 |0 @@ -11537,6 +12130,7 @@ CHARMAP \x4E\x6E |0 \x62\xFC |0 \xCC\x84 |0 + \xB6\xC4 |0 \x63\x4B |0 \x63\x44 |0 \xCC\x85 |0 @@ -11596,14 +12190,17 @@ CHARMAP \xCC\xAA |0 \xCC\xAB |0 \xCC\xAC |0 + \xB6\xCC |0 + \xB6\xCD |0 \xCC\xAD |0 \xCC\xAE |0 - \x53\xE8 |1 + \xB6\xCE |0 \xCC\xAF |0 \x63\x5A |0 \xCC\xB0 |0 \x63\x5B |0 \xCC\xB1 |0 + \xB6\xCF |0 \x63\x63 |0 \x63\x64 |0 \xCC\xB2 |0 @@ -11689,6 +12286,7 @@ CHARMAP \x46\xC0 |0 \xCC\xDF |0 \x63\x75 |0 + \xB6\xD3 |0 \x4F\x54 |0 \xCC\xE0 |0 \x63\x7A |0 @@ -11728,6 +12326,7 @@ CHARMAP \x63\x85 |0 \x54\x48 |0 \xCC\xEC |0 + \xB6\xD5 |0 \xCC\xED |0 \xCC\xEE |0 \x63\x84 |0 @@ -11804,6 +12403,7 @@ CHARMAP \xCD\x51 |0 \xCD\x52 |0 \x63\x9E |0 + \xB6\xDB |0 \x63\xA0 |0 \xCD\x53 |0 \xCD\x54 |0 @@ -11851,6 +12451,7 @@ CHARMAP \xCD\x6C |0 \x63\xAC |0 \x45\x58 |0 + \xB6\xDF |0 \x46\x55 |0 \x63\xAD |0 \x4D\xF2 |0 @@ -11942,6 +12543,7 @@ CHARMAP \xCD\x93 |0 \x50\xEF |0 \xCD\x94 |0 + \xB6\xE3 |0 \xCD\x95 |0 \x54\xCC |0 \xCD\x96 |0 @@ -12070,6 +12672,7 @@ CHARMAP \x63\xE0 |0 \x63\xE2 |0 \x4B\xC1 |0 + \xB6\xE5 |0 \xCD\xCC |0 \x51\x81 |0 \xCD\xCD |0 @@ -12115,6 +12718,7 @@ CHARMAP \xCD\xDA |0 \xCD\xDB |0 \x63\xF3 |0 + \xB6\xE8 |0 \x52\xF9 |0 \x63\xF7 |0 \xCD\xDC |0 @@ -12153,6 +12757,7 @@ CHARMAP \xCD\xEA |0 \x64\x44 |0 \x64\x43 |0 + \xB6\xEB |0 \xCD\xEB |0 \x64\x45 |0 \xCD\xEC |0 @@ -12166,6 +12771,7 @@ CHARMAP \x64\x4C |0 \xCD\xEF |0 \x4A\xD7 |0 + \xB6\xEC |0 \x64\x4B |0 \x64\x4D |0 \xCD\xF0 |0 @@ -12202,6 +12808,7 @@ CHARMAP \x64\x54 |0 \x64\x58 |0 \xCD\xFE |0 + \xB6\xED |0 \xCE\x41 |0 \xCE\x42 |0 \x45\x81 |0 @@ -12336,6 +12943,7 @@ CHARMAP \x52\xC1 |0 \xCE\x77 |0 \x64\x7C |0 + \xB6\xF5 |0 \xCE\x78 |0 \x64\x7D |0 \xCE\x79 |0 @@ -12357,6 +12965,7 @@ CHARMAP \x64\x82 |0 \x55\x84 |0 \x64\x84 |0 + \xB6\xF8 |0 \x64\x83 |0 \x64\x86 |0 \x64\x85 |0 @@ -12458,6 +13067,7 @@ CHARMAP \x64\xA0 |0 \x4C\xA8 |0 \xCE\xB5 |0 + \xB6\xFA |0 \x4D\x7C |0 \x64\xA3 |0 \xCE\xB6 |0 @@ -12539,6 +13149,7 @@ CHARMAP \x64\xBD |0 \x64\xBF |0 \xCE\xE1 |0 + \xB7\x41 |0 \x64\xC0 |0 \xCE\xE2 |0 \xCE\xE3 |0 @@ -12558,6 +13169,7 @@ CHARMAP \x64\xC3 |0 \xCE\xEB |0 \xCE\xEC |0 + \xB7\x42 |0 \xCE\xED |0 \xCE\xEE |0 \x64\xC4 |0 @@ -12629,6 +13241,7 @@ CHARMAP \xCF\x50 |0 \x4E\xF4 |0 \x48\xB7 |0 + \xB7\x48 |0 \xCF\x51 |0 \xCF\x52 |0 \xCF\x53 |0 @@ -12653,6 +13266,7 @@ CHARMAP \x64\xE1 |0 \xCF\x5C |0 \x64\xE0 |0 + \xB7\x49 |0 \x64\xE2 |0 \x54\xEE |0 \x64\xE3 |0 @@ -12692,6 +13306,7 @@ CHARMAP \x47\xDF |0 \x52\xE5 |0 \x48\x45 |0 + \xB7\x4C |0 \xCF\x6D |0 \xCF\x6E |0 \x64\xF0 |0 @@ -12913,6 +13528,7 @@ CHARMAP \x51\x62 |0 \xCF\xC6 |0 \xCF\xC7 |0 + \xB7\x55 |0 \xCF\xC8 |0 \x4C\xB7 |0 \xCF\xC9 |0 @@ -12958,6 +13574,7 @@ CHARMAP \xCF\xE7 |0 \xCF\xE8 |0 \xCF\xE9 |0 + \xB7\x57 |0 \xCF\xEA |0 \xCF\xEB |0 \x4F\x73 |0 @@ -13044,6 +13661,7 @@ CHARMAP \x65\x80 |0 \xD0\x57 |0 \xD0\x58 |0 + \xB7\x58 |0 \xD0\x59 |0 \x53\x46 |0 \x53\xBF |0 @@ -13108,6 +13726,7 @@ CHARMAP \x65\x94 |0 \x65\x97 |0 \xD0\x70 |0 + \xB7\x5B |0 \xD0\x71 |0 \xD0\x72 |0 \xD0\x73 |0 @@ -13149,6 +13768,7 @@ CHARMAP \xD0\x87 |0 \x65\xA2 |0 \x65\xA5 |0 + \xB7\x5C |0 \x65\x99 |0 \xD0\x88 |0 \x65\xA3 |0 @@ -13256,6 +13876,7 @@ CHARMAP \xD0\xC6 |0 \x55\xBE |0 \x48\xC1 |0 + \xB7\x62 |0 \x51\xE7 |0 \x53\x94 |0 \x65\xC2 |0 @@ -13264,6 +13885,7 @@ CHARMAP \x65\xC9 |0 \xD0\xC7 |0 \x65\xCE |0 + \xB7\x63 |0 \x55\xD2 |0 \xD0\xC8 |0 \xD0\xC9 |0 @@ -13306,6 +13928,7 @@ CHARMAP \xD0\xD7 |0 \x51\xF7 |0 \xD0\xD8 |0 + \xB7\x66 |0 \x4B\x48 |0 \x55\xD3 |0 \xD0\xD9 |0 @@ -13326,6 +13949,7 @@ CHARMAP \xD0\xE2 |0 \xD0\xE3 |0 \xD0\xE4 |0 + \xB7\x67 |0 \x4F\x70 |0 \xD0\xE5 |0 \x65\xD3 |0 @@ -13406,6 +14030,8 @@ CHARMAP \xD1\x55 |0 \xD1\x56 |0 \x65\xDF |0 + \xB7\x6E |0 + \xB7\x6F |0 \xD1\x57 |0 \x65\xE8 |0 \xD1\x58 |0 @@ -13494,6 +14120,7 @@ CHARMAP \x66\x47 |0 \x51\x9C |0 \xD1\x85 |0 + \xB7\x72 |0 \x66\x48 |0 \xD1\x86 |0 \x4B\x7D |0 @@ -13581,6 +14208,7 @@ CHARMAP \xD1\xAE |0 \x47\xBC |0 \xD1\xAF |0 + \xB7\x77 |0 \xD1\xB0 |0 \xD1\xB1 |0 \xD1\xB2 |0 @@ -13679,6 +14307,7 @@ CHARMAP \xD1\xD2 |0 \x4F\xDA |0 \x4E\xD5 |0 + \xB7\x7E |0 \x4F\x64 |0 \x51\xA4 |0 \x45\x70 |0 @@ -13733,6 +14362,7 @@ CHARMAP \x66\x92 |0 \x66\x91 |0 \x66\x8F |0 + \xB7\x83 |0 \x66\x93 |0 \x66\x8D |0 \xD1\xE2 |0 @@ -13751,6 +14381,7 @@ CHARMAP \xD1\xE9 |0 \x4B\xC6 |0 \x66\x97 |0 + \xB7\x85 |0 \x5B\xCF |0 \x66\x98 |0 \x66\x99 |0 @@ -13761,6 +14392,7 @@ CHARMAP \x66\x9E |0 \x66\x9D |0 \x66\x9C |0 + \xB7\x86 |0 \x66\x9F |0 \x66\xA1 |0 \xD1\xEB |0 @@ -13887,6 +14519,7 @@ CHARMAP \x4C\xD9 |0 \x4D\x5B |0 \x49\x46 |0 + \xB7\x8A |0 \x4A\x97 |0 \x47\xB2 |0 \xD2\x6F |0 @@ -13979,17 +14612,21 @@ CHARMAP \xD2\x98 |0 \xD2\x99 |0 \xD2\x9A |0 + \xB7\x90 |0 \xD2\x9B |0 \xD2\x9C |0 \x66\xD8 |0 \x66\xD7 |0 \xD2\x9D |0 \x66\xD9 |0 + \xB7\x91 |0 \xD2\x9E |0 + \xB7\x92 |0 \xD2\x9F |0 \x48\x8A |0 \x66\xDA |0 \x46\xB8 |0 + \xB7\x94 |0 \xD2\xA0 |0 \x53\xCE |0 \xD2\xA1 |0 @@ -14002,6 +14639,8 @@ CHARMAP \x66\xDB |0 \x5C\xCA |0 \x46\xB5 |0 + \xB7\x95 |0 + \xB7\x96 |0 \x4B\xA3 |0 \xD2\xA6 |0 \x52\x45 |0 @@ -14086,6 +14725,7 @@ CHARMAP \xD2\xCF |0 \x66\xF9 |0 \xD2\xD0 |0 + \xB7\x9B |0 \x66\xFA |0 \xD2\xD1 |0 \x4B\x85 |0 @@ -14139,6 +14779,7 @@ CHARMAP \x67\x4B |0 \xD2\xE9 |0 \x67\x4A |0 + \xB7\x9D |0 \xD2\xEA |0 \xD2\xEB |0 \x4C\xC0 |0 @@ -14147,6 +14788,7 @@ CHARMAP \xD2\xED |0 \xD2\xEE |0 \x67\x4E |0 + \xB7\x9E |0 \xD2\xEF |0 \xD2\xF0 |0 \x50\x58 |0 @@ -14157,6 +14799,7 @@ CHARMAP \x48\xB4 |0 \xD2\xF3 |0 \x67\x4F |0 + \xB7\x9F |0 \xD2\xF4 |0 \xD2\xF5 |0 \xD2\xF6 |0 @@ -14168,6 +14811,7 @@ CHARMAP \xD2\xFA |0 \xD2\xFB |0 \x4E\x5E |0 + \xB7\xA0 |0 \xD2\xFC |0 \xD2\xFD |0 \xD2\xFE |0 @@ -14187,11 +14831,12 @@ CHARMAP \x67\x58 |0 \x67\x59 |0 \xD3\x48 |0 - \x53\xDA |1 + \xB7\xA1 |0 \xD3\x49 |0 \x67\x57 |0 \xD3\x4A |0 \x67\x5B |0 + \xB7\xA2 |0 \x4C\xD5 |0 \x67\x5A |0 \xD3\x4B |0 @@ -14213,6 +14858,7 @@ CHARMAP \xD3\x51 |0 \xD3\x52 |0 \xD3\x53 |0 + \xB7\xA5 |0 \x55\x9C |0 \xD3\x54 |0 \xD3\x55 |0 @@ -14347,6 +14993,7 @@ CHARMAP \xD3\x9F |0 \x67\x90 |0 \x67\x8F |0 + \xB7\xAB |0 \xD3\xA0 |0 \xD3\xA1 |0 \xD3\xA2 |0 @@ -14423,6 +15070,7 @@ CHARMAP \x4D\x78 |0 \xD3\xC8 |0 \xD3\xC9 |0 + \xB7\xAD |0 \xD3\xCA |0 \x55\x51 |0 \x67\xAB |0 @@ -14458,6 +15106,7 @@ CHARMAP \xD3\xD9 |0 \x67\xAE |0 \xD3\xDA |0 + \xB7\xB1 |0 \xD3\xDB |0 \x67\xBC |0 \xD3\xDC |0 @@ -14509,11 +15158,13 @@ CHARMAP \xD3\xF9 |0 \x67\xC3 |0 \xD3\xFA |0 + \xB7\xB6 |0 \x67\xC4 |0 \xD3\xFB |0 \xD3\xFC |0 \xD3\xFD |0 \xD3\xFE |0 + \xB7\xB7 |0 \xD4\x41 |0 \xD4\x42 |0 \xD4\x43 |0 @@ -14521,6 +15172,7 @@ CHARMAP \x67\xC5 |0 \xD4\x45 |0 \x67\xC6 |0 + \xB7\xB8 |0 \xD4\x46 |0 \x47\x79 |0 \xD4\x47 |0 @@ -14581,6 +15233,7 @@ CHARMAP \xD4\x5F |0 \x67\xDF |0 \x67\xDE |0 + \xB7\xBE |0 \xD4\x60 |0 \xD4\x61 |0 \x67\xDD |0 @@ -14601,6 +15254,7 @@ CHARMAP \x67\xE5 |0 \x67\xE2 |0 \x67\xE1 |0 + \xB7\xC0 |0 \xD4\x68 |0 \xD4\x69 |0 \x67\xE6 |0 @@ -14622,6 +15276,7 @@ CHARMAP \xD4\x76 |0 \xD4\x77 |0 \xD4\x78 |0 + \xB7\xC1 |0 \x67\xE7 |0 \xD4\x79 |0 \x67\xE8 |0 @@ -14640,7 +15295,9 @@ CHARMAP \x67\xF0 |0 \x67\xEE |0 \xD4\x80 |0 + \xB7\xC3 |0 \xD4\x81 |0 + \xB7\xC4 |0 \x67\xED |0 \x67\xF3 |0 \xD4\x82 |0 @@ -14660,6 +15317,7 @@ CHARMAP \xD4\x8B |0 \xD4\x8C |0 \xD4\x8D |0 + \xB7\xC5 |0 \xD4\x8E |0 \x67\xF8 |0 \xD4\x8F |0 @@ -14680,6 +15338,7 @@ CHARMAP \xD4\x97 |0 \xD4\x98 |0 \xD4\x99 |0 + \xB7\xC8 |0 \xD4\x9A |0 \xD4\x9B |0 \xD4\x9C |0 @@ -14742,8 +15401,10 @@ CHARMAP \x55\x5F |0 \x48\xA7 |0 \x68\x50 |0 + \xB7\xCA |0 \x68\x51 |0 \x4E\xEA |0 + \xB7\xCB |0 \x4A\xC6 |0 \xD4\xBA |0 \xD4\xBB |0 @@ -21090,7 +21751,12 @@ CHARMAP \x89\xBC |0 \x89\xBD |0 \x44\x6E |1 + \xB4\xE4 |0 + \xB4\x54 |0 \x5B\xC9 |0 + \xB6\xBC |0 + \xB4\xEF |0 + \xB7\x8E |0 \x66\x74 |0 \x57\x8E |0 \x58\x77 |0 @@ -21124,8 +21790,69 @@ CHARMAP \x66\xDF |0 \x66\xE6 |0 \x67\xF4 |0 + \xB3\x54 |0 + \xB3\x63 |0 + \xB3\x69 |0 + \xB3\x7B |0 + \xB3\x7F |0 + \xB3\x83 |0 + \xB3\x9E |0 + \xB3\xA5 |0 + \xB3\xAC |0 + \xB3\xBF |0 + \xB3\xC2 |0 + \xB3\xE7 |0 + \xB3\xE8 |0 + \xB4\x61 |0 + \xB4\x66 |0 + \xB4\x67 |0 + \xB4\x6A |0 + \xB4\x85 |0 + \xB4\x89 |0 + \xB4\x97 |0 + \xB4\xB3 |0 + \xB5\x49 |0 + \xB5\x59 |0 + \xB5\x62 |0 + \xB5\x7C |0 + \xB5\x82 |0 + \xB5\x96 |0 + \xB5\xCE |0 + \xB5\xD6 |0 + \xB5\xD8 |0 + \xB5\xD7 |0 + \xB5\xD9 |0 + \xB5\xDA |0 + \xB5\xDB |0 + \xB5\xDD |0 + \xB5\xDE |0 + \xB5\xE7 |0 + \xB5\xE8 |0 + \xB5\xFB |0 + \xB6\x5B |0 + \xB6\x5D |0 + \xB6\x5F |0 + \xB6\x65 |0 + \xB6\x6A |0 + \xB6\x83 |0 + \xB6\x94 |0 + \xB6\x95 |0 + \xB6\xA3 |0 + \xB6\xD9 |0 + \xB6\xE0 |0 + \xB6\xE6 |0 + \xB6\xE9 |0 + \xB6\xF3 |0 + \xB6\xF6 |0 + \xB7\x4D |0 + \xB7\x4F |0 + \xB7\x82 |0 + \xB7\x89 |0 + \xB7\x8D |0 \xE9\xA3 |0 \xE9\xA4 |0 + \xEC\xAA |0 + \xEC\xAB |0 \x42\x5A |0 \x42\x7F |0 \x42\x7B |0 @@ -21220,6 +21947,8 @@ CHARMAP \x42\x4F |0 \x42\xD0 |0 \xE9\xF4 |0 + \xE9\xF7 |0 + \xE9\xF8 |0 \x42 |0 \x43 |0 \x44 |0 @@ -21289,6 +22018,361 @@ CHARMAP \x42\xA1 |0 \xE9\xF5 |0 \x42\x5B |0 + \xB3\x42 |0 + \xB3\x46 |0 + \xB3\x48 |0 + \xB3\x49 |0 + \xB3\x4E |0 + \xB3\x53 |0 + \xB3\x5D |0 + \xB3\x60 |0 + \xB3\x64 |0 + \xB3\x67 |0 + \xB3\x68 |0 + \xB3\x6B |0 + \xB3\x70 |0 + \xB3\x73 |0 + \xB3\x76 |0 + \xB3\x79 |0 + \xB3\x7A |0 + \xB3\x80 |0 + \xB3\x82 |0 + \xB3\x84 |0 + \xB3\x88 |0 + \xB3\x89 |0 + \xB3\x8D |0 + \xB3\x9B |0 + \xB3\x9F |0 + \xB3\xA2 |0 + \xB3\xA3 |0 + \xB3\xA4 |0 + \xB3\xA8 |0 + \xB3\xB0 |0 + \xB3\xB1 |0 + \xB3\xB3 |0 + \xB3\xB4 |0 + \xB3\xB5 |0 + \xB3\xB6 |0 + \xB3\xB7 |0 + \xB3\xB8 |0 + \xB3\xBA |0 + \xB3\xBD |0 + \xB3\xBE |0 + \xB3\xC0 |0 + \xB3\xC5 |0 + \xB3\xC6 |0 + \xB3\xCA |0 + \xB3\xD0 |0 + \xB3\xD1 |0 + \xB3\xD2 |0 + \xB3\xD6 |0 + \xB3\xD9 |0 + \xB3\xDA |0 + \xB3\xE4 |0 + \xB3\xE9 |0 + \xB3\xEA |0 + \xB3\xEB |0 + \xB3\xEC |0 + \xB3\xEF |0 + \xB3\xF0 |0 + \xB3\xF2 |0 + \xB3\xF4 |0 + \xB3\xF5 |0 + \xB3\xF9 |0 + \xB3\xFA |0 + \xB4\x44 |0 + \xB4\x46 |0 + \xB4\x49 |0 + \xB4\x50 |0 + \xB4\x52 |0 + \xB4\x56 |0 + \xB4\x5A |0 + \xB4\x62 |0 + \xB4\x68 |0 + \xB4\x69 |0 + \xB4\x6C |0 + \xB4\x72 |0 + \xB4\x75 |0 + \xB4\x77 |0 + \xB4\x78 |0 + \xB4\x79 |0 + \xB4\x7C |0 + \xB4\x7D |0 + \xB4\x80 |0 + \xB4\x91 |0 + \xB4\x93 |0 + \xB4\x94 |0 + \xB4\x96 |0 + \xB4\x9F |0 + \xB4\xA1 |0 + \xB4\xA2 |0 + \xB4\xA3 |0 + \xB4\xA4 |0 + \xB4\xA5 |0 + \xB4\xA7 |0 + \xB4\xA8 |0 + \xB4\xAF |0 + \xB4\xB0 |0 + \xB4\xB1 |0 + \xB4\xB2 |0 + \xB4\xBF |0 + \xB4\xC4 |0 + \xB4\xC5 |0 + \xB4\xCB |0 + \xB4\xD2 |0 + \xB4\xD3 |0 + \xB4\xD4 |0 + \xB4\xD5 |0 + \xB4\xDC |0 + \xB4\xDD |0 + \xB4\xDE |0 + \xB4\xDF |0 + \xB4\xE0 |0 + \xB4\xE3 |0 + \xB4\xE5 |0 + \xB4\xE7 |0 + \xB4\xE8 |0 + \xB4\xF0 |0 + \xB4\xF6 |0 + \xB5\x43 |0 + \xB5\x44 |0 + \xB5\x45 |0 + \xB5\x4F |0 + \xB5\x55 |0 + \xB5\x57 |0 + \xB5\x58 |0 + \xB5\x66 |0 + \xB5\x6C |0 + \xB5\x6E |0 + \xB5\x73 |0 + \xB5\x74 |0 + \xB5\x7F |0 + \xB5\x84 |0 + \xB5\x86 |0 + \xB5\x8E |0 + \xB5\x91 |0 + \xB5\x9A |0 + \xB5\x9E |0 + \xB5\x9F |0 + \xB5\xA0 |0 + \xB5\xA4 |0 + \xB5\xAE |0 + \xB5\xB0 |0 + \xB5\xB2 |0 + \xB5\xB4 |0 + \xB5\xB9 |0 + \xB5\xBA |0 + \xB5\xBB |0 + \xB5\xBD |0 + \xB5\xBE |0 + \xB5\xC0 |0 + \xB5\xC2 |0 + \xB5\xC4 |0 + \xB5\xC8 |0 + \xB5\xCD |0 + \xB5\xCF |0 + \xB5\xD0 |0 + \xB5\xD3 |0 + \xB5\xE1 |0 + \xB5\xE3 |0 + \xB5\xE4 |0 + \xB5\xE9 |0 + \xB5\xEA |0 + \xB5\xEE |0 + \xB5\xEF |0 + \xB5\xF0 |0 + \xB5\xF9 |0 + \xB5\xFC |0 + \xB5\xFD |0 + \xB6\x44 |0 + \xB6\x47 |0 + \xB6\x48 |0 + \xB6\x49 |0 + \xB6\x4A |0 + \xB6\x4B |0 + \xB6\x4C |0 + \xB6\x4D |0 + \xB6\x4E |0 + \xB6\x4F |0 + \xB6\x51 |0 + \xB6\x52 |0 + \xB6\x54 |0 + \xB6\x56 |0 + \xB6\x57 |0 + \xB6\x59 |0 + \xB6\x5E |0 + \xB6\x63 |0 + \xB6\x64 |0 + \xB6\x66 |0 + \xB6\x68 |0 + \xB6\x72 |0 + \xB6\x75 |0 + \xB6\x7B |0 + \xB6\x81 |0 + \xB6\x82 |0 + \xB6\x85 |0 + \xB6\x86 |0 + \xB6\x89 |0 + \xB6\x8A |0 + \xB6\x8E |0 + \xB6\x91 |0 + \xB6\x92 |0 + \xB6\x97 |0 + \xB6\x9E |0 + \xB6\xA1 |0 + \xB6\xA4 |0 + \xB6\xAB |0 + \xB6\xAC |0 + \xB6\xB0 |0 + \xB6\xB1 |0 + \xB6\xB2 |0 + \xB6\xB3 |0 + \xB6\xB7 |0 + \xB6\xB8 |0 + \xB6\xBA |0 + \xB6\xC5 |0 + \xB6\xC6 |0 + \xB6\xC7 |0 + \xB6\xC9 |0 + \xB6\xCB |0 + \xB6\xD1 |0 + \xB6\xD2 |0 + \xB6\xD4 |0 + \xB6\xD6 |0 + \xB6\xD7 |0 + \xB6\xDA |0 + \xB6\xDC |0 + \xB6\xDD |0 + \xB6\xE4 |0 + \xB6\xE7 |0 + \xB6\xEE |0 + \xB6\xEF |0 + \xB6\xF0 |0 + \xB6\xF1 |0 + \xB6\xF4 |0 + \xB6\xF7 |0 + \xB6\xF9 |0 + \xB6\xFC |0 + \xB6\xFD |0 + \xB7\x43 |0 + \xB7\x44 |0 + \xB7\x47 |0 + \xB7\x4A |0 + \xB7\x4B |0 + \xB7\x4E |0 + \xB7\x50 |0 + \xB7\x51 |0 + \xB7\x52 |0 + \xB7\x54 |0 + \xB7\x56 |0 + \xB7\x59 |0 + \xB7\x5A |0 + \xB7\x5D |0 + \xB7\x5E |0 + \xB7\x5F |0 + \xB7\x60 |0 + \xB7\x61 |0 + \xB7\x64 |0 + \xB7\x65 |0 + \xB7\x68 |0 + \xB7\x69 |0 + \xB7\x6A |0 + \xB7\x6B |0 + \xB7\x6C |0 + \xB7\x6D |0 + \xB7\x70 |0 + \xB7\x71 |0 + \xB7\x73 |0 + \xB7\x74 |0 + \xB7\x76 |0 + \xB7\x78 |0 + \xB7\x79 |0 + \xB7\x7A |0 + \xB7\x7B |0 + \xB7\x7D |0 + \xB7\x80 |0 + \xB7\x87 |0 + \xB7\x88 |0 + \xB7\x8C |0 + \xB7\x8F |0 + \xB7\x93 |0 + \xB7\x98 |0 + \xB7\x99 |0 + \xB7\x9A |0 + \xB7\x9C |0 + \xB7\xA7 |0 + \xB7\xAC |0 + \xB7\xAE |0 + \xB7\xAF |0 + \xB7\xB0 |0 + \xB7\xB2 |0 + \xB7\xB3 |0 + \xB7\xB4 |0 + \xB7\xB5 |0 + \xB7\xB9 |0 + \xB7\xBB |0 + \xB7\xBD |0 + \xB7\xBF |0 + \xB7\xC2 |0 + \xB7\xC6 |0 + \xB7\xC9 |0 + \xB7\xCC |0 + \xB7\xCE |0 + \xB7\xCF |0 + \xB7\xD0 |0 + \xB7\xD1 |0 +END CHARMAP + +CHARMAP + \x3F |2 + \x3F |2 + \xD6\x7B |0 + \xEC\xC3 |0 + \xD8\x90 |0 + \xEC\xC4 |0 + \xEC\xC5 |0 + \xD8\x95 |0 + \xEC\xC8 |0 + \xEC\xC9 |0 + \xD8\x96 |0 + \xEC\xCA |0 + \xEC\xCB |0 + \xD8\xC8 |0 + \xEC\xC6 |0 + \xEC\xC7 |0 + \xD9\x42 |0 + \xEC\xCD |0 + \xD9\x46 |0 + \xEC\xCC |0 + \x3F |2 + \x44\x86 |0 + \xEC\xB5 |0 + \x44\x87 |0 + \xEC\xB6 |0 + \x44\x88 |0 + \xEC\xB7 |0 + \x44\x89 |0 + \xEC\xB8 |0 + \x44\x8A |0 + \xEC\xB9 |0 + \x43\x86 |0 + \xEC\xBA |0 + \x43\x87 |0 + \xEC\xBB |0 + \x43\x88 |0 + \xEC\xBC |0 + \x43\x89 |0 + \xEC\xBD |0 + \x43\x8A |0 + \xEC\xBE |0 + \x43\x8F |0 + \xEC\xBF |0 + \x43\x93 |0 + \xEC\xC0 |0 + \x43\x95 |0 + \xEC\xC1 |0 + \xEC\x8C |0 + \xEC\xC2 |0 \x3F |2 \x3F |2 \x3F |2 diff --git a/icuSources/data/mappings/ibm-16684_P100-1999.ucm b/icuSources/data/mappings/ibm-16684_P110-2003.ucm similarity index 94% rename from icuSources/data/mappings/ibm-16684_P100-1999.ucm rename to icuSources/data/mappings/ibm-16684_P110-2003.ucm index a25dbe12..8b94cc6a 100644 --- a/icuSources/data/mappings/ibm-16684_P100-1999.ucm +++ b/icuSources/data/mappings/ibm-16684_P110-2003.ucm @@ -1,23 +1,33 @@ # *************************************************************************** # * -# * Copyright (C) 1995-2002, International Business Machines +# * Copyright (C) 1995-2003, International Business Machines # * Corporation and others. All Rights Reserved. # * # *************************************************************************** # -# File created by rptp2ucm (compiled on Dec 3 2002) -# from source files 44B0412C.RPMAP100 and 412C44B0.TPMAP100 +# File created by rptp2ucm (compiled on Oct 28 2003) +# from source files 44B0412C.RPMAP110 and 412C44B0.TPMAP110 # - "ibm-16684_P100-1999" + "ibm-16684_P110-2003" "AXXXX" 2 2 "DBCS" \xFE\xFE - \x3F "ASCII" "ibm-16684_VPUA" +# includes mappings for surrogate pairs + 0-3f:3, 40:2, 41-fe:1, ff:3, b3-b7:4 + 41-fe + 40 + + 41-fe.p + +# build an extension-only (delta) .cnv file +# requires the base .cnv file at runtime + "ibm-1390_P110-2003" + CHARMAP \xD6\x41 |0 \xD6\x42 |0 @@ -85,7 +95,6 @@ CHARMAP \xD6\x78 |0 \xD6\x79 |0 \xD6\x7A |0 - \xD6\x7B |0 \xD6\x7C |0 \xD6\x7D |0 \xD6\x7E |0 @@ -240,6 +249,7 @@ CHARMAP \xD7\x78 |0 \xD7\x79 |0 \xD7\x7A |0 + \xD7\x93 |0 \xD7\x7B |0 \xD7\x7C |0 \xD7\x7D |0 @@ -258,6 +268,8 @@ CHARMAP \xD7\x8A |0 \xD7\x8B |0 \xD7\x8C |0 + \xD7\x94 |0 + \xD7\x95 |0 \xD7\x8D |0 \xD7\x8E |0 \xD7\x8F |0 @@ -268,13 +280,10 @@ CHARMAP \xD8\x8D |0 \xD8\x8E |0 \xD8\x8F |0 - \xD8\x90 |0 \xD8\x91 |0 \xD8\x92 |0 \xD8\x93 |0 \xD8\x94 |0 - \xD8\x95 |0 - \xD8\x96 |0 \xD8\x97 |0 \xD8\x98 |0 \xD8\x99 |0 @@ -324,7 +333,6 @@ CHARMAP \xD8\xC5 |0 \xD8\xC6 |0 \xD8\xC7 |0 - \xD8\xC8 |0 \xD8\xC9 |0 \xD8\xCA |0 \xD8\xCB |0 @@ -373,11 +381,41 @@ CHARMAP \xD8\xFD |0 \xD8\xFE |0 \xD9\x41 |0 - \xD9\x42 |0 \xD9\x43 |0 \xD9\x44 |0 \xD9\x45 |0 - \xD9\x46 |0 + \xEA\x51 |0 + \xEA\x52 |0 + \xEA\x53 |0 + \xEA\x54 |0 + \xEA\x55 |0 + \xEA\x57 |0 + \xEA\x59 |0 + \xEA\x5C |0 + \xEA\x5D |0 + \xEA\x60 |0 + \xEA\x69 |0 + \xEA\x6A |0 + \xEA\x6B |0 + \xEA\x6D |0 + \xEA\x6E |0 + \xEA\x6F |0 + \xEA\x70 |0 + \xEA\x71 |0 + \xEA\x75 |0 + \xEA\x76 |0 + \xEA\x7A |0 + \xEA\x7B |0 + \xEA\x7D |0 + \xEA\x80 |0 + \xEA\x81 |0 + \xEA\x85 |0 + \xEA\x8A |0 + \xEA\x8B |0 + \xEA\x8C |0 + \xEA\x8D |0 + \xEA\x8E |0 + \xEA\xB2 |0 \xD9\x7E |0 \xD9\x7F |0 \xD9\x80 |0 @@ -694,7 +732,10 @@ CHARMAP \xDA\xE9 |0 \xDA\xEA |0 \xDA\xEB |0 + \xDC\x63 |0 + \xDC\x64 |0 \xDC\x62 |0 + \xDC\x65 |0 \xDD\xA4 |0 \xDD\xA5 |0 \xDD\xA6 |0 @@ -764,6 +805,10 @@ CHARMAP \xDD\xD7 |0 \xDD\xD8 |0 \xDD\xD9 |0 + \xDD\xDA |0 + \xDD\xDB |0 + \xDD\xDC |0 + \xDD\xDD |0 \xDE\x47 |0 \xDE\x48 |0 \xDE\x49 |0 @@ -1251,6 +1296,23 @@ CHARMAP \xE0\xF2 |0 \xE0\xF3 |0 \xE0\xF4 |0 + \xE0\xF5 |0 + \xE0\xF6 |0 + \xE0\xF7 |0 + \xE0\xF8 |0 + \xE0\xF9 |0 + \xE0\xFA |0 + \xE0\xFB |0 + \xE0\xFC |0 + \xE0\xFD |0 + \xE0\xFE |0 + \xE1\x41 |0 + \xE1\x42 |0 + \xE1\x43 |0 + \xE1\x44 |0 + \xE1\x45 |0 + \xE1\x46 |0 + \xEA\xE4 |0 \xE2\x70 |0 \xE2\x71 |0 \xE2\x72 |0 @@ -1390,6 +1452,26 @@ CHARMAP \xE2\xF8 |0 \xE2\xF9 |0 \xE2\xFA |0 + \xE2\xFB |0 + \xE2\xFC |0 + \xE2\xFD |0 + \xE2\xFE |0 + \xE3\x41 |0 + \xE3\x42 |0 + \xE3\x43 |0 + \xE3\x44 |0 + \xE3\x45 |0 + \xE3\x46 |0 + \xE3\x47 |0 + \xE3\x48 |0 + \xE3\x49 |0 + \xE3\x4A |0 + \xE3\x4B |0 + \xE3\x4C |0 + \xE3\x4D |0 + \xE3\x4E |0 + \xE3\x4F |0 + \xE3\x50 |0 \x43\x7C |0 \x43\xB7 |0 \x43\x7D |0 @@ -1640,6 +1722,8 @@ CHARMAP \xE4\x77 |0 \xE4\x78 |0 \xE4\x79 |0 + \xE4\xCB |0 + \xE4\xCC |0 \xE4\x7A |0 \xE4\x7B |0 \xE4\x7C |0 @@ -1886,6 +1970,11 @@ CHARMAP \xE6\x82 |0 \xE6\x83 |0 \xE6\x84 |0 + \xEB\x77 |0 + \xEB\x78 |0 + \xEC\x44 |0 + \xEC\x7F |0 + \xEC\x80 |0 \x40\x40 |0 \x43\x44 |0 \x43\x41 |0 @@ -1927,6 +2016,9 @@ CHARMAP \xE6\xB5 |0 \xE6\xB6 |0 \xE6\xB7 |0 + \xE6\xB8 |0 + \xE6\xB9 |0 + \xE6\xBA |0 \x44\x47 |0 \x44\x81 |0 \x44\x48 |0 @@ -1937,15 +2029,10 @@ CHARMAP \x44\x84 |0 \x44\x52 |0 \x44\x85 |0 - \x44\x86 |0 \x44\xC0 |0 - \x44\x87 |0 \x44\xC1 |0 - \x44\x88 |0 \x44\xC2 |0 - \x44\x89 |0 \x44\xC3 |0 - \x44\x8A |0 \x44\xC4 |0 \x44\x8C |0 \x44\xC5 |0 @@ -2011,10 +2098,14 @@ CHARMAP \x44\x46 |0 \x44\xBD |0 \xE6\xCF |0 + \xE6\xD0 |0 + \xE6\xD1 |0 \x43\xBE |0 \x43\xBF |0 \x44\xDC |0 \x44\xDD |0 + \xE6\xD2 |0 + \xE6\xDC |0 \x43\x47 |0 \x43\x81 |0 \x43\x48 |0 @@ -2025,15 +2116,10 @@ CHARMAP \x43\x84 |0 \x43\x52 |0 \x43\x85 |0 - \x43\x86 |0 \x43\xC0 |0 - \x43\x87 |0 \x43\xC1 |0 - \x43\x88 |0 \x43\xC2 |0 - \x43\x89 |0 \x43\xC3 |0 - \x43\x8A |0 \x43\xC4 |0 \x43\x8C |0 \x43\xC5 |0 @@ -2041,7 +2127,6 @@ CHARMAP \x43\xC6 |0 \x43\x8E |0 \x43\xC7 |0 - \x43\x8F |0 \x43\xC8 |0 \x43\x90 |0 \x43\xC9 |0 @@ -2050,11 +2135,9 @@ CHARMAP \x43\x92 |0 \x43\xCB |0 \x43\x56 |0 - \x43\x93 |0 \x43\xCC |0 \x43\x94 |0 \x43\xCD |0 - \x43\x95 |0 \x43\xCE |0 \x43\x96 |0 \x43\x97 |0 @@ -2109,6 +2192,22 @@ CHARMAP \x43\x58 |0 \x43\xDC |0 \x43\xDD |0 + \xE6\xDD |0 + \xEC\x85 |0 + \xEC\x86 |0 + \xEC\x87 |0 + \xEC\x88 |0 + \xEC\x89 |0 + \xEC\x8A |0 + \xEC\x8B |0 + \xEC\x8D |0 + \xEC\x8E |0 + \xEC\x8F |0 + \xEC\x90 |0 + \xEC\x91 |0 + \xEC\x92 |0 + \xEC\x93 |0 + \xEC\x94 |0 \xE6\xDE |0 \xE6\xDF |0 \xE6\xE0 |0 @@ -2145,6 +2244,21 @@ CHARMAP \xE6\xFE |0 \xE7\x41 |0 \xE7\x42 |0 + \xE7\xAF |0 + \xE7\xB0 |0 + \xE7\xB1 |0 + \xE7\xB2 |0 + \xE7\xB3 |0 + \xE7\xB4 |0 + \xE7\xB5 |0 + \xE7\xB6 |0 + \xE7\xB7 |0 + \xE7\xB8 |0 + \xE7\xB9 |0 + \xE7\xBA |0 + \xE7\xBB |0 + \xE7\xBC |0 + \xE7\xBD |0 \xE7\x43 |0 \xE7\x44 |0 \xE7\x45 |0 @@ -2194,6 +2308,21 @@ CHARMAP \xE7\x71 |0 \xE7\x72 |0 \xE7\x73 |0 + \xE7\xBE |0 + \xE7\xBF |0 + \xE7\xC0 |0 + \xE7\xC1 |0 + \xE7\xC2 |0 + \xE7\xC3 |0 + \xE7\xC4 |0 + \xE7\xC5 |0 + \xE7\xC6 |0 + \xE7\xC7 |0 + \xE7\xC8 |0 + \xE7\xC9 |0 + \xE7\xCA |0 + \xE7\xCB |0 + \xE7\xCC |0 \xE7\x74 |0 \xE7\x75 |0 \xE7\x76 |0 @@ -2502,6 +2631,170 @@ CHARMAP \xE9\x99 |0 \xE9\x9A |0 \xE9\x9B |0 + \xB3\x43 |0 + \xB3\x4A |0 + \xB3\x4B |0 + \xB3\x4C |0 + \xB3\x58 |0 + \xB3\x59 |0 + \xB3\x66 |0 + \xB3\x6C |0 + \xB3\x6D |0 + \xB3\x6E |0 + \xB3\x6F |0 + \xB3\x74 |0 + \xB3\x7D |0 + \xB3\x8A |0 + \xB3\x8B |0 + \xB3\x8C |0 + \xB3\x92 |0 + \xB3\x99 |0 + \xB3\x9A |0 + \xB3\x9D |0 + \xB3\xA1 |0 + \xB3\xA9 |0 + \xB3\xAE |0 + \xB3\xBB |0 + \xB3\xCB |0 + \xB3\xCE |0 + \xB3\xCF |0 + \xB3\xD4 |0 + \xB3\xDB |0 + \xB3\xDD |0 + \xB3\xDE |0 + \xB3\xDF |0 + \xB3\xE0 |0 + \xB3\xE3 |0 + \xB3\xF1 |0 + \xB3\xFB |0 + \xB3\xFD |0 + \xB3\xFE |0 + \xB4\x41 |0 + \xB4\x42 |0 + \xB4\x4B |0 + \xB4\x4C |0 + \xB4\x4D |0 + \xB4\x4E |0 + \xB4\x4F |0 + \xB4\x5D |0 + \xB4\x5F |0 + \xB4\x60 |0 + \xB4\x64 |0 + \xB4\x81 |0 + \xB4\x82 |0 + \xB4\x8A |0 + \xB4\x8B |0 + \xB4\x8F |0 + \xB4\x98 |0 + \xB4\x99 |0 + \xB4\x9A |0 + \xB4\x9C |0 + \xB4\xB5 |0 + \xB4\xB9 |0 + \xB4\xC1 |0 + \xB4\xC0 |0 + \xB4\xC2 |0 + \xB4\xC6 |0 + \xB4\xCA |0 + \xB4\xD1 |0 + \xB4\xD6 |0 + \xB4\xD9 |0 + \xB4\xE2 |0 + \xB4\xE9 |0 + \xB4\xF8 |0 + \xB4\xFC |0 + \xB5\x5A |0 + \xB5\x5D |0 + \xB5\x68 |0 + \xB5\x70 |0 + \xB5\x77 |0 + \xB5\x7B |0 + \xB5\x80 |0 + \xB5\x85 |0 + \xB5\x89 |0 + \xB5\x8A |0 + \xB5\x8B |0 + \xB5\x8C |0 + \xB5\x90 |0 + \xB5\xA1 |0 + \xB5\xA6 |0 + \xB5\xA7 |0 + \xB5\xA8 |0 + \xB5\xAD |0 + \xB5\xB3 |0 + \xB5\xB5 |0 + \xB5\xBC |0 + \xB5\xC3 |0 + \xB5\xC7 |0 + \xB5\xDC |0 + \xB5\xE2 |0 + \xB5\xE5 |0 + \xB5\xE6 |0 + \xB5\xEB |0 + \xB5\xED |0 + \xB5\xF2 |0 + \xB5\xF4 |0 + \xB5\xF5 |0 + \xB5\xF8 |0 + \xB5\xFA |0 + \xB6\x42 |0 + \xB6\x50 |0 + \xB6\x53 |0 + \xB6\x55 |0 + \xB6\x5C |0 + \xB6\x61 |0 + \xB6\x62 |0 + \xB6\x76 |0 + \xB6\x78 |0 + \xB6\x7A |0 + \xB6\x7C |0 + \xB6\x7D |0 + \xB6\x7E |0 + \xB6\x84 |0 + \xB6\x88 |0 + \xB6\x8D |0 + \xB6\x8F |0 + \xB6\x93 |0 + \xB6\x9A |0 + \xB6\x9B |0 + \xB6\x9D |0 + \xB6\xA7 |0 + \xB6\xA9 |0 + \xB6\xAD |0 + \xB6\xAF |0 + \xB6\xBD |0 + \xB6\xC2 |0 + \xB6\xC8 |0 + \xB6\xCA |0 + \xB6\xD0 |0 + \xB6\xD8 |0 + \xB6\xDE |0 + \xB6\xE1 |0 + \xB6\xE2 |0 + \xB6\xEA |0 + \xB6\xF2 |0 + \xB6\xFB |0 + \xB6\xFE |0 + \xB7\x45 |0 + \xB7\x46 |0 + \xB7\x53 |0 + \xB7\x75 |0 + \xB7\x7C |0 + \xB7\x7F |0 + \xB7\x81 |0 + \xB7\x84 |0 + \xB7\x8B |0 + \xB7\x97 |0 + \xB7\xA3 |0 + \xB7\xA4 |0 + \xB7\xA6 |0 + \xB7\xA8 |0 + \xB7\xA9 |0 + \xB7\xAA |0 + \xB7\xBA |0 + \xB7\xBC |0 + \xB7\xC7 |0 + \xB7\xCD |0 \x45\x41 |0 \x4B\xCE |0 \xB8\x41 |0 @@ -2516,6 +2809,7 @@ CHARMAP \xB8\x44 |0 \x46\xAF |0 \x47\x89 |0 + \xB3\x41 |0 \x56\x42 |0 \x4D\xEC |0 \xB8\x45 |0 @@ -2532,8 +2826,10 @@ CHARMAP \xB8\x48 |0 \x48\x7C |0 \x56\x44 |0 + \xB3\x44 |0 \x56\x45 |0 \xB8\x49 |0 + \xB3\x45 |0 \x45\x5C |0 \xB8\x4A |0 \xB8\x4B |0 @@ -2554,6 +2850,7 @@ CHARMAP \xB8\x50 |0 \x45\x8A |0 \xB8\x51 |0 + \xB3\x47 |0 \x45\xD8 |0 \x55\xA9 |0 \x54\xA5 |0 @@ -2621,6 +2918,8 @@ CHARMAP \x56\x57 |0 \xB8\x61 |0 \x45\x93 |0 + \xB3\x4D |0 + \xB3\x4F |0 \x53\xD9 |0 \x47\x76 |0 \x56\x5C |0 @@ -2628,6 +2927,7 @@ CHARMAP \x56\x5A |0 \x56\x5B |0 \x50\x85 |0 + \xB3\x50 |0 \x45\xE0 |0 \x48\x4B |0 \x56\x59 |0 @@ -2652,6 +2952,7 @@ CHARMAP \x49\xC3 |0 \x46\xF6 |0 \xB8\x68 |0 + \xB3\x51 |0 \x56\x60 |0 \x4D\x71 |0 \xB8\x69 |0 @@ -2735,6 +3036,7 @@ CHARMAP \xB8\x89 |0 \xB8\x8A |0 \xB8\x8B |0 + \xB3\x52 |0 \x56\x79 |0 \xB8\x8C |0 \xB8\x8D |0 @@ -2830,9 +3132,11 @@ CHARMAP \x4B\x4A |0 \x56\x87 |0 \x56\x88 |0 + \xB3\x55 |0 \x46\xDE |0 \x56\x96 |0 \xB8\xB6 |0 + \xB3\x56 |0 \xB8\xB7 |0 \x4C\xE1 |0 \x4D\xB1 |0 @@ -2845,6 +3149,7 @@ CHARMAP \x56\x94 |0 \xB8\xBA |0 \xB8\xBB |0 + \xB3\x57 |0 \xB8\xBC |0 \x56\x8F |0 \x56\x99 |0 @@ -2939,6 +3244,7 @@ CHARMAP \xB8\xE4 |0 \x56\xAA |0 \xB8\xE5 |0 + \xB3\x5A |0 \xB8\xE6 |0 \x4E\xE7 |0 \xB8\xE7 |0 @@ -2948,6 +3254,7 @@ CHARMAP \xB8\xEA |0 \xB8\xEB |0 \x56\xA8 |0 + \xB3\x5B |0 \xB8\xEC |0 \x50\x9C |0 \x46\xAC |0 @@ -2959,11 +3266,13 @@ CHARMAP \xB8\xF1 |0 \xB8\xF2 |0 \xB8\xF3 |0 + \xB3\x5C |0 \xB8\xF4 |0 \x4C\x43 |0 \x54\xDA |0 \xB8\xF5 |0 \xB8\xF6 |0 + \xB3\x5E |0 \x56\xAD |0 \x56\xB0 |0 \x56\xAB |0 @@ -2971,6 +3280,7 @@ CHARMAP \x4C\x5B |0 \xB8\xF7 |0 \xB8\xF8 |0 + \xB3\x5F |0 \xB8\xF9 |0 \x4A\x43 |0 \xB8\xFA |0 @@ -2992,11 +3302,13 @@ CHARMAP \x4A\xBB |0 \x52\xD4 |0 \x56\xB5 |0 + \xB3\x61 |0 \x4D\x82 |0 \xB9\x45 |0 \xB9\x46 |0 \x56\xB3 |0 \xB9\x47 |0 + \xB3\x62 |0 \xB9\x48 |0 \x56\xB7 |0 \xB9\x49 |0 @@ -3010,6 +3322,7 @@ CHARMAP \xB9\x4D |0 \xB9\x4E |0 \xB9\x4F |0 + \xB3\x65 |0 \x56\xB2 |0 \x56\xBA |0 \xB9\x50 |0 @@ -3090,6 +3403,7 @@ CHARMAP \x49\x4B |0 \x51\xBE |0 \xB9\x74 |0 + \xB3\x6A |0 \x56\xCD |0 \x56\xCE |0 \x46\x65 |0 @@ -3102,10 +3416,12 @@ CHARMAP \x45\x46 |0 \x56\xD1 |0 \x47\xB3 |0 + \xB3\xCC |0 \x46\x49 |0 \x4F\x67 |0 \x47\xAF |0 \x47\xC9 |0 + \xB6\x67 |0 \x48\xF4 |0 \xB9\x76 |0 \x56\xD2 |0 @@ -3159,11 +3475,13 @@ CHARMAP \x56\xE8 |0 \xB9\x82 |0 \xB9\x83 |0 + \xB3\x71 |0 \x52\xDC |0 \x56\xEA |0 \x4F\x80 |0 \xB9\x84 |0 \x56\xEB |0 + \xB3\x72 |0 \x55\xF9 |0 \x53\x44 |0 \x4B\xE6 |0 @@ -3261,7 +3579,7 @@ CHARMAP \xB9\xA5 |0 \x49\xC7 |0 \xB9\xA6 |0 - \x54\x81 |1 + \xB3\x75 |0 \x57\x42 |0 \xB9\xA7 |0 \xB9\xA8 |0 @@ -3272,6 +3590,7 @@ CHARMAP \xB9\xAA |0 \x57\x48 |0 \x57\x45 |0 + \xB3\x77 |0 \xB9\xAB |0 \x4B\x4E |0 \x4D\x85 |0 @@ -3288,6 +3607,7 @@ CHARMAP \xB9\xAF |0 \xB9\xB0 |0 \x55\xD6 |0 + \xB3\x78 |0 \xB9\xB1 |0 \x49\xF0 |0 \x57\x4C |0 @@ -3341,9 +3661,11 @@ CHARMAP \x46\x9C |0 \xB9\xC6 |0 \x48\xCE |0 + \xB3\x7C |0 \xB9\xC7 |0 \x57\x57 |0 \xB9\xC8 |0 + \xB3\x7E |0 \xB9\xC9 |0 \x53\xD6 |0 \xB9\xCA |0 @@ -3380,6 +3702,7 @@ CHARMAP \x57\x5F |0 \x57\x60 |0 \x54\x70 |0 + \xB3\x81 |0 \x51\xE9 |0 \x52\x97 |0 \x57\x61 |0 @@ -3464,6 +3787,7 @@ CHARMAP \xB9\xF6 |0 \xB9\xF7 |0 \x53\xDB |0 + \xB3\x85 |0 \x57\x7A |0 \xB9\xF8 |0 \xB9\xF9 |0 @@ -3478,7 +3802,9 @@ CHARMAP \x57\x7D |0 \x4E\x79 |0 \xB9\xFA |0 + \xB3\x86 |0 \x57\x7E |0 + \xB3\x87 |0 \xB9\xFB |0 \x53\xE2 |0 \x57\x7F |0 @@ -3562,6 +3888,7 @@ CHARMAP \x50\x42 |0 \x47\xD9 |0 \x48\x5A |0 + \xB3\x8E |0 \xBA\x5B |0 \x4F\x59 |0 \x48\xE2 |0 @@ -3581,13 +3908,16 @@ CHARMAP \x50\xC6 |0 \x4E\xB2 |0 \x46\xA5 |0 + \xB3\x8F |0 \xBA\x5D |0 \xBA\x5E |0 \x47\xCF |0 \x57\x9D |0 + \xB3\x90 |0 \x50\x7A |0 \x53\xE1 |0 \xBA\x5F |0 + \xB3\x91 |0 \x4C\x4F |0 \xBA\x60 |0 \xBA\x61 |0 @@ -3621,6 +3951,7 @@ CHARMAP \x57\x9E |0 \xBA\x6B |0 \x50\xB0 |0 + \xB3\x93 |0 \xBA\x6C |0 \x57\xA2 |0 \xBA\x6D |0 @@ -3631,6 +3962,7 @@ CHARMAP \xBA\x71 |0 \x54\x8D |0 \xBA\x72 |0 + \xB3\x94 |0 \xBA\x73 |0 \xBA\x74 |0 \x57\xA5 |0 @@ -3665,6 +3997,7 @@ CHARMAP \xBA\x7F |0 \x57\xA9 |0 \xBA\x80 |0 + \xB3\x95 |0 \xBA\x81 |0 \x57\xB2 |0 \x57\xBC |0 @@ -3694,6 +4027,7 @@ CHARMAP \x4E\xF9 |0 \x45\xD0 |0 \x57\xBB |0 + \xB3\x96 |0 \x57\xB6 |0 \xBA\x8D |0 \x57\xAF |0 @@ -3715,7 +4049,9 @@ CHARMAP \x57\xC6 |0 \x57\xC5 |0 \xBA\x94 |0 + \xB3\x97 |0 \x47\x47 |0 + \xB3\x98 |0 \xBA\x95 |0 \x54\x7C |0 \xBA\x96 |0 @@ -3782,6 +4118,7 @@ CHARMAP \xBA\xB7 |0 \x57\xD8 |0 \x57\xDD |0 + \xB3\x9C |0 \x57\xD9 |0 \xBA\xB8 |0 \x57\xD5 |0 @@ -3842,6 +4179,7 @@ CHARMAP \x52\xA2 |0 \xBA\xD4 |0 \x57\xE6 |0 + \xB3\xA0 |0 \xBA\xD5 |0 \x57\xE4 |0 \xBA\xD6 |0 @@ -3856,6 +4194,7 @@ CHARMAP \xBA\xD9 |0 \xBA\xDA |0 \x50\x63 |0 + \xB3\xA6 |0 \xBA\xDB |0 \x47\x7E |0 \xBA\xDC |0 @@ -3871,6 +4210,7 @@ CHARMAP \x50\xF3 |0 \xBA\xE3 |0 \x57\xEF |0 + \xB3\xA7 |0 \x52\xCA |0 \xBA\xE4 |0 \x57\xF8 |0 @@ -3894,6 +4234,7 @@ CHARMAP \xBA\xF0 |0 \xBA\xF1 |0 \xBA\xF2 |0 + \xB3\xAA |0 \xBA\xF3 |0 \xBA\xF4 |0 \x50\x62 |0 @@ -3901,6 +4242,7 @@ CHARMAP \x57\xF0 |0 \xBA\xF6 |0 \x57\xF1 |0 + \xB3\xAB |0 \xBA\xF7 |0 \x54\x7D |0 \xBA\xF8 |0 @@ -3921,6 +4263,7 @@ CHARMAP \xBB\x44 |0 \x4E\x6D |0 \xBB\x45 |0 + \xB3\xAD |0 \x55\xF1 |0 \x55\x82 |0 \x57\xFE |0 @@ -3952,6 +4295,7 @@ CHARMAP \xBB\x57 |0 \x58\x44 |0 \xBB\x58 |0 + \xB3\xAF |0 \xBB\x59 |0 \x58\x46 |0 \x58\x45 |0 @@ -4029,6 +4373,7 @@ CHARMAP \xBB\x7C |0 \x46\x84 |0 \xBB\x7D |0 + \xB3\xB2 |0 \xBB\x7E |0 \xBB\x7F |0 \xBB\x80 |0 @@ -4135,6 +4480,7 @@ CHARMAP \x58\x72 |0 \xBB\xB7 |0 \x58\x76 |0 + \xB3\xB9 |0 \x4D\xF4 |0 \xBB\xB8 |0 \xBB\xB9 |0 @@ -4155,6 +4501,7 @@ CHARMAP \xBB\xC3 |0 \x4D\xAC |0 \x46\xF1 |0 + \xB3\xBC |0 \x46\xA3 |0 \xBB\xC4 |0 \xBB\xC5 |0 @@ -4236,6 +4583,7 @@ CHARMAP \xBB\xE8 |0 \xBB\xE9 |0 \xBB\xEA |0 + \xB3\xC1 |0 \xBB\xEB |0 \xBB\xEC |0 \xBB\xED |0 @@ -4254,6 +4602,7 @@ CHARMAP \xBB\xF5 |0 \x4A\xFC |0 \xBB\xF6 |0 + \xB3\xC3 |0 \x58\x88 |0 \x58\x8B |0 \xBB\xF7 |0 @@ -4267,6 +4616,7 @@ CHARMAP \x54\x88 |0 \x4B\x95 |0 \xBB\xF9 |0 + \xB3\xC4 |0 \xBB\xFA |0 \x58\x8F |0 \x4E\x8E |0 @@ -4290,6 +4640,7 @@ CHARMAP \xBC\x45 |0 \x58\x95 |0 \x58\x97 |0 + \xB3\xC7 |0 \xBC\x46 |0 \xBC\x47 |0 \x58\x98 |0 @@ -4303,6 +4654,7 @@ CHARMAP \x4E\xB0 |0 \x47\x75 |0 \xBC\x49 |0 + \xB3\xC8 |0 \x58\x9B |0 \x58\x9C |0 \x50\x77 |0 @@ -4316,6 +4668,7 @@ CHARMAP \x58\xA0 |0 \x58\xA1 |0 \xBC\x4C |0 + \xB3\xC9 |0 \x49\x7E |0 \x58\xA2 |0 \xBC\x4D |0 @@ -4351,6 +4704,7 @@ CHARMAP \xBC\x59 |0 \x51\x47 |0 \x58\xA9 |0 + \xB3\xCD |0 \x58\xAA |0 \xBC\x5A |0 \xBC\x5B |0 @@ -4470,6 +4824,7 @@ CHARMAP \xBC\x8B |0 \x51\x79 |0 \xBC\x8C |0 + \xB3\xD3 |0 \x52\xB9 |0 \x4B\x42 |0 \xBC\x8D |0 @@ -4483,6 +4838,7 @@ CHARMAP \x58\xC7 |0 \xBC\x92 |0 \xBC\x93 |0 + \xB3\xD5 |0 \x4B\x54 |0 \x58\xC9 |0 \x58\xC8 |0 @@ -4528,6 +4884,7 @@ CHARMAP \xBC\xAA |0 \xBC\xAB |0 \x54\x54 |0 + \xB3\xD7 |0 \xBC\xAC |0 \xBC\xAD |0 \x4D\x80 |0 @@ -4576,6 +4933,7 @@ CHARMAP \x58\xDC |0 \xBC\xC8 |0 \xBC\xC9 |0 + \xB3\xD8 |0 \xBC\xCA |0 \xBC\xCB |0 \x58\xDE |0 @@ -4707,6 +5065,7 @@ CHARMAP \x58\xFD |0 \x45\xAC |0 \xBC\xFA |0 + \xB3\xDC |0 \xBC\xFB |0 \x59\x41 |0 \x4B\x81 |0 @@ -4747,6 +5106,7 @@ CHARMAP \x46\xB2 |0 \x4D\x76 |0 \x49\xFB |0 + \xB3\xE1 |0 \x49\x8A |0 \x59\x4C |0 \x49\x59 |0 @@ -4760,6 +5120,7 @@ CHARMAP \x48\xAE |0 \x45\x5D |0 \x48\x4A |0 + \xB3\xE2 |0 \x59\x50 |0 \x53\xC0 |0 \xBD\x48 |0 @@ -4806,9 +5167,10 @@ CHARMAP \x48\xDD |0 \xBD\x54 |0 \xBD\x55 |0 - \x54\x43 |1 + \xB3\xE5 |0 \xBD\x56 |0 \x47\x6D |0 + \xB3\xE6 |0 \x53\xFB |0 \x55\xC0 |0 \xBD\x57 |0 @@ -4848,11 +5210,13 @@ CHARMAP \xBD\x6C |0 \xBD\x6D |0 \x59\x67 |0 + \xB3\xED |0 \x54\xB9 |0 \x45\xBF |0 \xBD\x6E |0 \x59\x63 |0 \x50\xD5 |0 + \xB3\xEE |0 \x52\x62 |0 \xBD\x6F |0 \x4D\x46 |0 @@ -4869,6 +5233,7 @@ CHARMAP \x59\x6B |0 \xBD\x72 |0 \xBD\x73 |0 + \xB3\xF3 |0 \xBD\x74 |0 \xBD\x75 |0 \x59\x6C |0 @@ -4896,6 +5261,7 @@ CHARMAP \x59\x73 |0 \xBD\x7D |0 \x45\x7F |0 + \xB3\xF6 |0 \x59\x77 |0 \xBD\x7E |0 \x51\x4D |0 @@ -4906,7 +5272,9 @@ CHARMAP \x59\x7B |0 \x59\x7A |0 \x59\x76 |0 + \xB3\xF7 |0 \x59\x75 |0 + \xB3\xF8 |0 \x59\x79 |0 \xBD\x7F |0 \xBD\x80 |0 @@ -4922,6 +5290,7 @@ CHARMAP \x59\x84 |0 \xBD\x88 |0 \xBD\x89 |0 + \xB3\xFC |0 \xBD\x8A |0 \xBD\x8B |0 \x59\x83 |0 @@ -4965,12 +5334,14 @@ CHARMAP \xBD\x9F |0 \xBD\xA0 |0 \xBD\xA1 |0 + \xB4\x43 |0 \xBD\xA2 |0 \xBD\xA3 |0 \x59\x8E |0 \xBD\xA4 |0 \xBD\xA5 |0 \x59\x8D |0 + \xB4\x45 |0 \xBD\xA6 |0 \xBD\xA7 |0 \x59\x90 |0 @@ -4992,9 +5363,11 @@ CHARMAP \x52\x81 |0 \xBD\xAE |0 \x59\x97 |0 + \xB4\x47 |0 \x59\x99 |0 \x59\x98 |0 \x51\xDF |0 + \xB4\x48 |0 \xBD\xAF |0 \xBD\xB0 |0 \x59\x9A |0 @@ -5002,6 +5375,7 @@ CHARMAP \x47\x41 |0 \xBD\xB1 |0 \x4D\x47 |0 + \xB4\x4A |0 \x4C\x67 |0 \xBD\xB2 |0 \x45\x6A |0 @@ -5093,6 +5467,7 @@ CHARMAP \x45\x60 |0 \x59\xAC |0 \x59\xAD |0 + \xB4\x51 |0 \x45\xA9 |0 \x48\xDA |0 \x59\xAE |0 @@ -5132,6 +5507,7 @@ CHARMAP \x50\xC1 |0 \x46\x9A |0 \x4C\x5D |0 + \xB4\x53 |0 \xBD\xDF |0 \xBD\xE0 |0 \xBD\xE1 |0 @@ -5153,6 +5529,7 @@ CHARMAP \xBD\xE8 |0 \xBD\xE9 |0 \x53\x6C |0 + \xB4\x55 |0 \x59\xB7 |0 \x59\xB8 |0 \xBD\xEA |0 @@ -5175,11 +5552,14 @@ CHARMAP \x47\xD0 |0 \x50\x5B |0 \x52\xD6 |0 + \xB4\x57 |0 \x46\x66 |0 \x4B\xAF |0 \x55\x64 |0 + \xB4\x58 |0 \x54\x4B |0 \x51\xD9 |0 + \xB4\x59 |0 \x4B\x47 |0 \xBD\xEE |0 \x59\xC2 |0 @@ -5206,6 +5586,7 @@ CHARMAP \x55\x97 |0 \xBD\xF4 |0 \xBD\xF5 |0 + \xB4\x5B |0 \x4C\x9B |0 \x59\xC7 |0 \xBD\xF6 |0 @@ -5323,6 +5704,7 @@ CHARMAP \xBE\x64 |0 \x46\x54 |0 \x4C\x74 |0 + \xB4\x5C |0 \x59\xE8 |0 \xBE\x65 |0 \x48\xF8 |0 @@ -5394,6 +5776,7 @@ CHARMAP \xBE\x86 |0 \x50\x81 |0 \x59\xF3 |0 + \xB4\x5E |0 \xBE\x87 |0 \x47\xCC |0 \x59\xFC |0 @@ -5530,6 +5913,7 @@ CHARMAP \xBE\xB9 |0 \x55\x4A |0 \x50\x6E |0 + \xB4\x63 |0 \x54\xB8 |0 \x5A\x73 |0 \x5A\x68 |0 @@ -5586,6 +5970,7 @@ CHARMAP \xBE\xD0 |0 \x5A\x79 |0 \xBE\xD1 |0 + \xB4\x65 |0 \x5A\x7F |0 \x5A\x84 |0 \x5A\x7C |0 @@ -5707,6 +6092,7 @@ CHARMAP \xBF\x45 |0 \x51\x53 |0 \x5A\xA9 |0 + \xB4\x6B |0 \x5A\xAB |0 \x5A\xAA |0 \x4D\xC6 |0 @@ -5758,6 +6144,7 @@ CHARMAP \xBF\x52 |0 \x4C\x44 |0 \xBF\x53 |0 + \xB4\x6D |0 \x47\xDC |0 \x45\x8C |0 \x5A\xBF |0 @@ -5785,6 +6172,7 @@ CHARMAP \xBF\x5F |0 \x5A\xC1 |0 \x5A\xC4 |0 + \xB4\x6E |0 \x5A\xC2 |0 \xBF\x60 |0 \x5A\xC5 |0 @@ -5796,6 +6184,7 @@ CHARMAP \x4D\x7A |0 \x4C\x76 |0 \xBF\x64 |0 + \xB4\x6F |0 \x5A\xC6 |0 \xBF\x65 |0 \x5A\xCA |0 @@ -5804,6 +6193,7 @@ CHARMAP \x5A\xC7 |0 \x5A\xCD |0 \x4E\xC0 |0 + \xB4\x70 |0 \x5A\xC8 |0 \x4E\xE3 |0 \xBF\x66 |0 @@ -5818,6 +6208,7 @@ CHARMAP \x5A\xCC |0 \x4A\x67 |0 \x49\x8D |0 + \xB4\x71 |0 \x5A\xDC |0 \x4A\x85 |0 \x4E\x7E |0 @@ -5906,10 +6297,12 @@ CHARMAP \x54\x8F |0 \xBF\x86 |0 \x48\xF6 |0 + \xB4\x73 |0 \xBF\x87 |0 \xBF\x88 |0 \xBF\x89 |0 \x53\x87 |0 + \xB4\x74 |0 \xBF\x8A |0 \x52\xA8 |0 \x5A\xE9 |0 @@ -5933,6 +6326,7 @@ CHARMAP \x4C\x41 |0 \x55\x46 |0 \xBF\x96 |0 + \xB4\x76 |0 \xBF\x97 |0 \x4D\xDD |0 \xBF\x98 |0 @@ -6026,13 +6420,16 @@ CHARMAP \xBF\xBD |0 \x5A\xF8 |0 \xBF\xBE |0 + \xB4\x7A |0 \xBF\xBF |0 + \xB4\x7B |0 \x4B\xF2 |0 \xBF\xC0 |0 \xBF\xC1 |0 \x4A\xD5 |0 \x5A\xFB |0 \x5B\x41 |0 + \xB4\x7E |0 \xBF\xC2 |0 \xBF\xC3 |0 \x4F\x7E |0 @@ -6094,6 +6491,7 @@ CHARMAP \xBF\xE5 |0 \x5B\x51 |0 \x55\xF5 |0 + \xB4\x7F |0 \x51\xEF |0 \xBF\xE6 |0 \xBF\xE7 |0 @@ -6207,6 +6605,7 @@ CHARMAP \xC0\x5F |0 \x47\x7B |0 \xC0\x60 |0 + \xB4\x83 |0 \x5B\x77 |0 \x5B\x78 |0 \x5B\x7A |0 @@ -6220,6 +6619,7 @@ CHARMAP \x48\xAF |0 \x45\xC7 |0 \xC0\x64 |0 + \xB4\x84 |0 \x4A\xF7 |0 \xC0\x65 |0 \x5B\x7D |0 @@ -6257,6 +6657,7 @@ CHARMAP \xC0\x70 |0 \x5B\x86 |0 \x5B\x87 |0 + \xB4\x86 |0 \xC0\x71 |0 \x45\xCA |0 \x58\xED |0 @@ -6291,7 +6692,9 @@ CHARMAP \xC0\x7B |0 \xC0\x7C |0 \xC0\x7D |0 + \xB4\x87 |0 \x5B\x8C |0 + \xB4\x88 |0 \x45\xCD |0 \x4D\xA4 |0 \x48\x88 |0 @@ -6335,6 +6738,7 @@ CHARMAP \xC0\x8C |0 \x4F\xA3 |0 \x5B\x9C |0 + \xB4\x8C |0 \xC0\x8D |0 \xC0\x8E |0 \x5B\x97 |0 @@ -6384,6 +6788,7 @@ CHARMAP \x51\x93 |0 \xC0\xA0 |0 \xC0\xA1 |0 + \xB4\x8D |0 \x4F\x9F |0 \x4C\x98 |0 \x5B\x9E |0 @@ -6394,6 +6799,7 @@ CHARMAP \x5B\xA5 |0 \xC0\xA3 |0 \xC0\xA4 |0 + \xB4\x8E |0 \x5B\xA6 |0 \xC0\xA5 |0 \x4B\xB2 |0 @@ -6405,6 +6811,7 @@ CHARMAP \x5B\xA8 |0 \xC0\xA9 |0 \x5B\xAB |0 + \xB4\x90 |0 \xC0\xAA |0 \xC0\xAB |0 \x5B\xAD |0 @@ -6413,6 +6820,7 @@ CHARMAP \xC0\xAC |0 \xC0\xAD |0 \x5B\xAC |0 + \xB4\x92 |0 \x5B\xAA |0 \x5B\xA7 |0 \x55\x6D |0 @@ -6422,6 +6830,7 @@ CHARMAP \xC0\xAE |0 \xC0\xAF |0 \xC0\xB0 |0 + \xB4\x95 |0 \x49\xF8 |0 \x49\x93 |0 \x5B\xB0 |0 @@ -6482,6 +6891,7 @@ CHARMAP \xC0\xC9 |0 \xC0\xCA |0 \x5B\xB9 |0 + \xB4\x9B |0 \x4C\x56 |0 \xC0\xCB |0 \x5B\xBC |0 @@ -6518,6 +6928,7 @@ CHARMAP \x51\x66 |0 \x4B\xC3 |0 \x46\xF5 |0 + \xB4\x9D |0 \x56\xAC |0 \xC0\xD6 |0 \xC0\xD7 |0 @@ -6527,6 +6938,7 @@ CHARMAP \x47\xD4 |0 \x5B\xC8 |0 \x54\xFD |0 + \xB4\x9E |0 \xC0\xD8 |0 \x4F\xA4 |0 \x55\xF3 |0 @@ -6565,6 +6977,7 @@ CHARMAP \xC0\xE1 |0 \x46\x68 |0 \xC0\xE2 |0 + \xB4\xA0 |0 \x4E\x51 |0 \x50\xD0 |0 \x46\xBC |0 @@ -6613,6 +7026,7 @@ CHARMAP \xC0\xEE |0 \x4A\xE2 |0 \xC0\xEF |0 + \xB4\xA6 |0 \xC0\xF0 |0 \x4F\x78 |0 \xC0\xF1 |0 @@ -6663,6 +7077,7 @@ CHARMAP \x4F\xD8 |0 \xC1\x44 |0 \x4E\xE1 |0 + \xB4\xA9 |0 \xC1\x45 |0 \x5B\xED |0 \x54\xF3 |0 @@ -6685,6 +7100,7 @@ CHARMAP \xC1\x4B |0 \xC1\x4C |0 \x47\x73 |0 + \xB4\xAB |0 \x50\x54 |0 \x4A\xC1 |0 \x5B\xF3 |0 @@ -6692,10 +7108,12 @@ CHARMAP \x47\xD3 |0 \x45\xFA |0 \x51\xF1 |1 + \xB4\xAA |0 \x50\xE3 |0 \xC1\x4D |0 \x4D\xCC |0 \x47\x9B |0 + \xB4\xAC |0 \xC1\x4E |0 \xC1\x4F |0 \x5B\xF5 |0 @@ -6720,6 +7138,7 @@ CHARMAP \xC1\x59 |0 \x47\xDE |0 \x4D\xE0 |0 + \xB4\xAD |0 \xC1\x5A |0 \x5B\xF8 |0 \x50\xD6 |0 @@ -6729,6 +7148,7 @@ CHARMAP \xC1\x5B |0 \x5B\xF6 |0 \x48\xF1 |0 + \xB4\xAE |0 \xC1\x5C |0 \xC1\x5D |0 \x5B\xF7 |0 @@ -6774,11 +7194,13 @@ CHARMAP \x5B\xFE |0 \x5B\xFE |1 \x5C\x45 |0 + \xB4\xB4 |0 \x50\xDA |0 \x5C\x47 |0 \xC1\x71 |0 \x52\xCC |0 \xC1\x72 |0 + \xB4\xB6 |0 \xC1\x73 |0 \x53\xBC |0 \xC1\x74 |0 @@ -6794,6 +7216,7 @@ CHARMAP \x48\x58 |0 \xC1\x78 |0 \xC1\x79 |0 + \xB4\xB7 |0 \x5C\x46 |0 \xC1\x7A |0 \x51\xE4 |0 @@ -6801,12 +7224,14 @@ CHARMAP \x53\x59 |0 \xC1\x7B |0 \x53\x61 |0 + \xB4\xB8 |0 \x5C\x4C |0 \x49\xAD |0 \x5C\x4A |0 \x5C\x4D |0 \xC1\x7C |0 \x5C\x49 |0 + \xB4\xBA |0 \x4E\xB1 |0 \xC1\x7D |0 \x5C\x60 |0 @@ -6834,6 +7259,7 @@ CHARMAP \x5C\x5E |0 \x5C\x54 |0 \x5C\x5D |0 + \xB4\xBB |0 \xC1\x86 |0 \x5C\x58 |0 \xC1\x87 |0 @@ -6848,6 +7274,7 @@ CHARMAP \x53\x75 |0 \xC1\x8E |0 \xC1\x8F |0 + \xB4\xBC |0 \x54\x94 |0 \x55\xB6 |0 \xC1\x90 |0 @@ -6855,9 +7282,11 @@ CHARMAP \xC1\x92 |0 \x54\x68 |0 \x5C\x4F |0 + \xB4\xBD |0 \x5C\x5C |0 \x4F\xF7 |0 \xC1\x93 |0 + \xB4\xBE |0 \x5C\x51 |0 \xC1\x94 |0 \xC1\x95 |0 @@ -6896,6 +7325,7 @@ CHARMAP \x4C\xBA |0 \xC1\xA0 |0 \xC1\xA1 |0 + \xB4\xC3 |0 \xC1\xA2 |0 \x51\xD7 |0 \xC1\xA3 |0 @@ -6963,6 +7393,7 @@ CHARMAP \xC1\xBB |0 \x51\x4A |0 \xC1\xBC |0 + \xB4\xC7 |0 \x5C\x80 |0 \x5C\x76 |0 \x53\xB2 |0 @@ -6973,6 +7404,7 @@ CHARMAP \xC1\xC0 |0 \x5C\x7C |0 \x5C\x77 |0 + \xB4\xC8 |0 \x5C\x7A |0 \x5C\x83 |0 \xC1\xC1 |0 @@ -6983,6 +7415,7 @@ CHARMAP \x4E\xFA |0 \x52\xDB |0 \x5C\x7D |0 + \xB4\xC9 |0 \x54\x8C |0 \xC1\xC3 |0 \x5C\x7B |0 @@ -6993,9 +7426,12 @@ CHARMAP \x5C\x81 |0 \x5C\x87 |0 \x5C\x90 |0 + \xB4\xCC |0 \xC1\xC6 |0 \x5C\x8F |0 \x5C\x89 |0 + \xB4\xCD |0 + \xB4\xCE |0 \x5C\x94 |0 \x5C\x92 |0 \xC1\xC7 |0 @@ -7003,7 +7439,9 @@ CHARMAP \xC1\xC9 |0 \x5C\x8E |0 \xC1\xCA |0 + \xB4\xCF |0 \xC1\xCB |0 + \xB4\xD0 |0 \x5C\x8D |0 \x4B\x5C |0 \x4D\xB7 |0 @@ -7042,6 +7480,7 @@ CHARMAP \x5C\x88 |0 \x5C\x9A |0 \xC1\xD8 |0 + \xB4\xD7 |0 \xC1\xD9 |0 \x55\x85 |0 \x5C\x9F |0 @@ -7082,6 +7521,7 @@ CHARMAP \x5C\xA8 |0 \x5C\xA9 |0 \x5C\xA0 |0 + \xB4\xD8 |0 \x5C\xAF |0 \x4F\xB2 |0 \x4F\xF5 |0 @@ -7096,6 +7536,7 @@ CHARMAP \x55\xEE |0 \x5C\xAA |0 \xC1\xF2 |0 + \xB4\xDA |0 \x5C\xB0 |0 \xC1\xF3 |0 \x4D\x55 |0 @@ -7103,6 +7544,7 @@ CHARMAP \xC1\xF5 |0 \xC1\xF6 |0 \x5C\x9E |0 + \xB4\xDB |0 \x5C\xAD |0 \x5C\xAE |0 \xC1\xF7 |0 @@ -7148,6 +7590,7 @@ CHARMAP \xC2\x4E |0 \xC2\x4F |0 \xC2\x50 |0 + \xB4\xE1 |0 \x5C\xC2 |0 \x52\xEE |0 \xC2\x51 |0 @@ -7160,6 +7603,7 @@ CHARMAP \xC2\x56 |0 \xC2\x57 |0 \x5C\xC1 |0 + \xB4\xE6 |0 \xC2\x58 |0 \xC2\x59 |0 \xC2\x5A |0 @@ -7213,24 +7657,29 @@ CHARMAP \x48\xD8 |0 \x45\x77 |0 \x4D\x4C |0 + \xB4\xEA |0 \x45\xB1 |0 \xC2\x6F |0 \x47\xD8 |0 \x55\x8E |0 \xC2\x70 |0 + \xB4\xEB |0 \xC2\x71 |0 \x4A\x9F |0 \xC2\x72 |0 \x48\xE4 |0 \x49\x55 |0 \xC2\x73 |0 + \xB4\xEC |0 \x5C\xD4 |0 \x5C\xD5 |0 + \xB4\xED |0 \x49\x99 |0 \xC2\x74 |0 \xC2\x75 |0 \x5C\xD6 |0 \x5C\xD7 |0 + \xB4\xEE |0 \xC2\x76 |0 \x5C\xD9 |0 \x5C\xD8 |0 @@ -7279,15 +7728,19 @@ CHARMAP \xC2\x89 |0 \x4A\x5B |0 \x5C\xE7 |0 + \xB4\xF1 |0 + \xB4\xF2 |0 \xC2\x8A |0 \x5C\xE8 |0 \xC2\x8B |0 \x49\x69 |0 \x49\xF5 |0 + \xB4\xF3 |0 \x4C\x97 |0 \x5C\xE9 |0 \x47\x4E |0 \x5C\xEA |0 + \xB4\xF4 |0 \x53\xD7 |0 \xC2\x8C |0 \x46\xE2 |0 @@ -7310,6 +7763,7 @@ CHARMAP \xC2\x98 |0 \x5C\xF0 |0 \xC2\x99 |0 + \xB4\xF5 |0 \xC2\x9A |0 \xC2\x9B |0 \x48\x8E |0 @@ -7381,6 +7835,7 @@ CHARMAP \x5D\x42 |0 \x5C\xFB |0 \x55\xD9 |0 + \xB4\xF7 |0 \xC2\xBA |0 \x5C\xFD |0 \xC2\xBB |0 @@ -7403,7 +7858,9 @@ CHARMAP \xC2\xC2 |0 \x50\x75 |0 \x45\x85 |0 + \xB4\xF9 |0 \x53\xEC |0 + \xB4\xFA |0 \x5D\x4D |0 \xC2\xC3 |0 \x5D\x50 |0 @@ -7452,6 +7909,7 @@ CHARMAP \x5D\x56 |0 \xC2\xD3 |0 \xC2\xD4 |0 + \xB4\xFB |0 \xC2\xD5 |0 \x5D\x54 |0 \x46\xF3 |0 @@ -7459,6 +7917,8 @@ CHARMAP \xC2\xD6 |0 \x4F\x57 |0 \xC2\xD7 |0 + \xB4\xFD |0 + \xB4\xFE |0 \x5D\x58 |0 \xC2\xD8 |0 \xC2\xD9 |0 @@ -7475,6 +7935,7 @@ CHARMAP \x54\x50 |0 \x4D\x98 |0 \x5D\x57 |0 + \xB5\x41 |0 \x45\xDC |0 \xC2\xDF |0 \xC2\xE0 |0 @@ -7487,6 +7948,7 @@ CHARMAP \xC2\xE4 |0 \x4B\x72 |0 \x5D\x5C |0 + \xB5\x42 |0 \x52\xAC |0 \x5D\x59 |0 \x50\xBC |0 @@ -7500,11 +7962,14 @@ CHARMAP \x4C\xC9 |0 \x46\x8D |0 \xC2\xE8 |0 + \xB5\x46 |0 \x5D\x66 |0 \x5D\x64 |0 + \xB5\x47 |0 \x45\xEA |0 \xC2\xE9 |0 \xC2\xEA |0 + \xB5\x48 |0 \xC2\xEB |0 \x5D\x5F |0 \x5D\x63 |0 @@ -7522,11 +7987,16 @@ CHARMAP \x4D\x41 |0 \x5D\x65 |0 \xC2\xEF |0 + \xB5\x4A |0 + \xB5\x4B |0 \xC2\xF0 |0 \x5D\x6A |0 \x5D\x60 |0 \x48\x6B |0 + \xB5\x4C |0 + \xB5\x4D |0 \x4F\x7D |0 + \xB5\x4E |0 \x5D\x67 |0 \xC2\xF1 |0 \xC2\xF2 |0 @@ -7540,7 +8010,9 @@ CHARMAP \x5D\x69 |0 \x55\x50 |0 \xC2\xF6 |0 + \xB5\x50 |0 \x5D\x72 |0 + \xB5\x51 |0 \x4F\x91 |0 \x4A\x45 |0 \xC2\xF7 |0 @@ -7552,6 +8024,7 @@ CHARMAP \xC2\xFA |0 \xC2\xFB |0 \x4A\x88 |0 + \xB5\x52 |0 \xC2\xFC |0 \x5D\x7C |0 \x5D\x75 |0 @@ -7562,12 +8035,14 @@ CHARMAP \x5D\x78 |0 \xC3\x41 |0 \x5D\x74 |0 + \xB5\x53 |0 \x4A\xBF |0 \x5D\x7B |0 \x5D\x82 |0 \xC3\x42 |0 \x55\xE1 |0 \x5D\x7E |0 + \xB5\x54 |0 \xC3\x43 |0 \xC3\x44 |0 \x5D\x77 |0 @@ -7608,6 +8083,7 @@ CHARMAP \x48\x92 |0 \x51\x98 |0 \x51\x64 |0 + \xB5\x56 |0 \x5D\x87 |0 \x50\xE4 |0 \x47\x8A |0 @@ -7629,6 +8105,7 @@ CHARMAP \x5D\x6E |0 \x48\xC6 |0 \xC3\x52 |0 + \xB5\x5B |0 \xC3\x53 |0 \x5D\x9A |0 \x5D\x8A |0 @@ -7643,6 +8120,7 @@ CHARMAP \xC3\x58 |0 \x4C\x88 |0 \xC3\x59 |0 + \xB5\x5C |0 \x5D\x91 |0 \x5D\x97 |0 \xC3\x5A |0 @@ -7690,12 +8168,14 @@ CHARMAP \x53\x76 |0 \xC3\x6C |0 \x5D\x9C |0 + \xB5\x5E |0 \xC3\x6D |0 \xC3\x6E |0 \x5D\xA0 |0 \xC3\x6F |0 \x5D\xA2 |0 \xC3\x70 |0 + \xB5\x5F |0 \x48\xBE |0 \x5D\x9E |0 \x54\x97 |0 @@ -7721,6 +8201,7 @@ CHARMAP \x52\x4A |0 \x5D\xA3 |0 \x5D\xA4 |0 + \xB5\x60 |0 \x47\xA3 |0 \x4D\xA1 |0 \xC3\x7B |0 @@ -7747,6 +8228,7 @@ CHARMAP \xC3\x84 |0 \xC3\x85 |0 \x50\xC4 |0 + \xB5\x61 |0 \x55\x75 |0 \x5D\xB6 |0 \x49\xED |0 @@ -7758,6 +8240,7 @@ CHARMAP \x50\x8E |0 \x4F\x58 |0 \x54\xE0 |0 + \xB5\x63 |0 \xC3\x8A |0 \xC3\x8B |0 \xC3\x8C |0 @@ -7769,6 +8252,7 @@ CHARMAP \x5D\xB0 |0 \x5D\xB2 |0 \xC3\x90 |0 + \xB5\x64 |0 \xC3\x91 |0 \x4D\x73 |0 \xC3\x92 |0 @@ -7791,6 +8275,7 @@ CHARMAP \xC3\x9B |0 \xC3\x9C |0 \x46\xC2 |0 + \xB5\x65 |0 \xC3\x9D |0 \xC3\x9E |0 \x4A\xD2 |0 @@ -7826,6 +8311,7 @@ CHARMAP \xC3\xAB |0 \xC3\xAC |0 \x54\xBA |0 + \xB5\x67 |0 \xC3\xAD |0 \xC3\xAE |0 \xC3\xAF |0 @@ -7846,6 +8332,7 @@ CHARMAP \xC3\xB7 |0 \x5D\xCC |0 \xC3\xB8 |0 + \xB5\x69 |0 \x4B\xD0 |0 \x50\xBE |0 \x5D\xCF |0 @@ -7854,6 +8341,7 @@ CHARMAP \x5D\xC4 |0 \xC3\xBA |0 \xC3\xBB |0 + \xB5\x6A |0 \xC3\xBC |0 \x5D\xD4 |0 \x5D\xD1 |0 @@ -7887,6 +8375,7 @@ CHARMAP \xC3\xC6 |0 \x5D\xD8 |0 \x5D\xD9 |0 + \xB5\x6B |0 \x5D\xDA |0 \xC3\xC7 |0 \x5D\xDE |0 @@ -7911,10 +8400,12 @@ CHARMAP \xC3\xCC |0 \xC3\xCD |0 \xC3\xCE |0 + \xB5\x6D |0 \xC3\xCF |0 \x5D\xE6 |0 \xC3\xD0 |0 \xC3\xD1 |0 + \xB5\x6F |0 \xC3\xD2 |0 \xC3\xD3 |0 \xC3\xD4 |0 @@ -7930,6 +8421,7 @@ CHARMAP \x5D\xE9 |0 \xC3\xDB |0 \xC3\xDC |0 + \xB5\x71 |0 \x47\x85 |0 \xC3\xDD |0 \xC3\xDE |0 @@ -7955,6 +8447,7 @@ CHARMAP \xC3\xE8 |0 \x5D\xEB |0 \xC3\xE9 |0 + \xB5\x72 |0 \xC3\xEA |0 \x5D\xED |0 \x5D\xEE |0 @@ -7985,6 +8478,7 @@ CHARMAP \x53\x8C |0 \x5D\xF1 |0 \xC3\xF7 |0 + \xB5\x75 |0 \x5D\xF7 |0 \x55\x87 |0 \xC3\xF8 |0 @@ -7994,6 +8488,7 @@ CHARMAP \xC3\xFA |0 \xC3\xFB |0 \xC3\xFC |0 + \xB5\x76 |0 \x5D\xF4 |0 \xC3\xFD |0 \xC3\xFE |0 @@ -8008,6 +8503,7 @@ CHARMAP \x4D\xE6 |0 \xC4\x43 |0 \xC4\x44 |0 + \xB5\x78 |0 \xC4\x45 |0 \xC4\x46 |0 \xC4\x47 |0 @@ -8024,7 +8520,9 @@ CHARMAP \x5E\x42 |0 \x54\x90 |0 \xC4\x4D |0 + \xB5\x79 |0 \xC4\x4E |0 + \xB5\x7A |0 \x68\x85 |0 \x5E\x43 |0 \xC4\x4F |0 @@ -8055,6 +8553,7 @@ CHARMAP \xC4\x59 |0 \x52\x9D |0 \x5E\x48 |0 + \xB5\x7D |0 \x4F\x68 |0 \xC4\x5A |0 \xC4\x5B |0 @@ -8063,6 +8562,7 @@ CHARMAP \xC4\x5D |0 \x54\xBB |0 \x5E\x4A |0 + \xB5\x7E |0 \xC4\x5E |0 \xC4\x5F |0 \x47\xD5 |0 @@ -8114,6 +8614,7 @@ CHARMAP \x5E\x5C |0 \x5E\x5D |0 \xC4\x72 |0 + \xB5\x81 |0 \xC4\x73 |0 \xC4\x74 |0 \x53\x7C |0 @@ -8156,6 +8657,7 @@ CHARMAP \xC4\x84 |0 \xC4\x85 |0 \xC4\x86 |0 + \xB5\x83 |0 \x5E\x69 |0 \x53\xFC |0 \xC4\x87 |0 @@ -8205,12 +8707,14 @@ CHARMAP \xC4\x9D |0 \xC4\x9E |0 \x4C\xA7 |0 + \xB5\x87 |0 \x5E\x73 |0 \x5E\x74 |0 \xC4\x9F |0 \x48\x52 |0 \x5E\x79 |0 \x5E\x75 |0 + \xB5\x88 |0 \xC4\xA0 |0 \x4E\x5A |0 \x5E\x76 |0 @@ -8277,10 +8781,12 @@ CHARMAP \x5E\x89 |0 \xC4\xBD |0 \xC4\xBE |0 + \xB5\x8D |0 \x5E\x87 |0 \xC4\xBF |0 \x50\x4F |0 \x53\xDD |0 + \xB5\x8F |0 \xC4\xC0 |0 \xC4\xC1 |0 \xC4\xC2 |0 @@ -8329,10 +8835,12 @@ CHARMAP \xC4\xDB |0 \x47\x83 |0 \x45\xFD |0 + \xB5\x92 |0 \x49\xB1 |0 \xC4\xDC |0 \xC4\xDD |0 \xC4\xDE |0 + \xB5\x93 |0 \xC4\xDF |0 \x4D\xE9 |0 \xC4\xE0 |0 @@ -8344,6 +8852,7 @@ CHARMAP \xC4\xE6 |0 \xC4\xE7 |0 \xC4\xE8 |0 + \xB5\x94 |0 \x4E\x4C |0 \xC4\xE9 |0 \xC4\xEA |0 @@ -8406,6 +8915,7 @@ CHARMAP \x50\xF7 |0 \xC5\x49 |0 \xC5\x4A |0 + \xB5\x95 |0 \xC5\x4B |0 \xC5\x4C |0 \x4E\x5C |0 @@ -8440,6 +8950,7 @@ CHARMAP \xC5\x5C |0 \xC5\x5D |0 \xC5\x5E |0 + \xB5\x97 |0 \x5E\xB1 |0 \xC5\x5F |0 \x5E\xB4 |0 @@ -8474,12 +8985,14 @@ CHARMAP \xC5\x6B |0 \xC5\x6C |0 \xC5\x6D |0 + \xB5\x98 |0 \x5E\xBD |0 \x50\x4D |0 \xC5\x6E |0 \xC5\x6F |0 \xC5\x70 |0 \xC5\x71 |0 + \xB5\x99 |0 \xC5\x72 |0 \xC5\x73 |0 \xC5\x74 |0 @@ -8490,6 +9003,7 @@ CHARMAP \xC5\x77 |0 \x5E\xC2 |0 \xC5\x78 |0 + \xB5\x9B |0 \xC5\x79 |0 \x5E\xC3 |0 \xC5\x7A |0 @@ -8503,6 +9017,7 @@ CHARMAP \xC5\x81 |0 \xC5\x82 |0 \xC5\x83 |0 + \xB5\x9C |0 \xC5\x84 |0 \x52\x49 |0 \xC5\x85 |0 @@ -8514,6 +9029,7 @@ CHARMAP \xC5\x89 |0 \xC5\x8A |0 \x5E\xC6 |0 + \xB5\x9D |0 \xC5\x8B |0 \xC5\x8C |0 \xC5\x8D |0 @@ -8624,10 +9140,12 @@ CHARMAP \x52\xFD |0 \x48\xB9 |0 \x5E\xE6 |0 + \xB5\xA2 |0 \x5E\xE9 |0 \x5E\xE7 |0 \x4A\xA9 |0 \xC5\xB4 |0 + \xB5\xA3 |0 \x4E\x54 |0 \x5E\xE8 |0 \x5E\xEB |0 @@ -8648,6 +9166,7 @@ CHARMAP \x5E\xF0 |0 \x5E\xEF |0 \x4E\xA0 |0 + \xB5\xA5 |0 \x51\x71 |0 \x55\xB0 |0 \xC5\xBD |0 @@ -8665,11 +9184,13 @@ CHARMAP \xC5\xC4 |0 \x5E\xF4 |0 \x50\xCE |0 + \xB5\xA9 |0 \x5E\xFD |0 \x4D\x97 |0 \x5E\xF7 |0 \xC5\xC5 |0 \x5E\xF9 |0 + \xB5\xAA |0 \x5E\xFB |0 \x54\xE1 |0 \xC5\xC6 |0 @@ -8691,6 +9212,7 @@ CHARMAP \xC5\xCD |0 \xC5\xCE |0 \x5F\x42 |0 + \xB5\xAB |0 \x51\x82 |0 \x53\xFD |0 \xC5\xCF |0 @@ -8698,6 +9220,7 @@ CHARMAP \x5F\x43 |0 \x4C\x47 |0 \xC5\xD0 |0 + \xB5\xAC |0 \x5F\x45 |0 \xC5\xD1 |0 \xC5\xD2 |0 @@ -8737,6 +9260,7 @@ CHARMAP \xC5\xE5 |0 \xC5\xE6 |0 \xC5\xE7 |0 + \xB5\xAF |0 \xC5\xE8 |0 \xC5\xE9 |0 \xC5\xEA |0 @@ -8751,6 +9275,7 @@ CHARMAP \xC5\xEE |0 \xC5\xEF |0 \x5F\x51 |0 + \xB5\xB1 |0 \xC5\xF0 |0 \xC5\xF1 |0 \x5F\x57 |0 @@ -8831,6 +9356,7 @@ CHARMAP \x5F\x71 |0 \xC6\x53 |0 \xC6\x54 |0 + \xB5\xB6 |0 \xC6\x55 |0 \xC6\x56 |0 \xC6\x57 |0 @@ -8841,8 +9367,10 @@ CHARMAP \xC6\x5B |0 \xC6\x5C |0 \x49\xDA |0 + \xB5\xB7 |0 \x5F\x74 |0 \x5F\x75 |0 + \xB5\xB8 |0 \x68\x68 |0 \x5F\x76 |0 \x5F\x77 |0 @@ -8944,6 +9472,7 @@ CHARMAP \xC6\x8B |0 \xC6\x8C |0 \xC6\x8D |0 + \xB5\xBF |0 \x5F\x90 |0 \x5F\x93 |0 \xC6\x8E |0 @@ -8967,6 +9496,7 @@ CHARMAP \xC6\x9A |0 \x5F\x97 |0 \xC6\x9B |0 + \xB5\xC1 |0 \xC6\x9C |0 \x5F\x96 |0 \x5F\x95 |0 @@ -8985,8 +9515,10 @@ CHARMAP \xC6\xA5 |0 \x5F\x9B |0 \xC6\xA6 |0 + \xB5\xC5 |0 \x55\x72 |0 \xC6\xA7 |0 + \xB5\xC6 |0 \xC6\xA8 |0 \x4D\xB0 |0 \x52\x7D |0 @@ -9048,6 +9580,7 @@ CHARMAP \x5F\xAD |0 \x46\xD3 |0 \x4C\xC3 |0 + \xB5\xCA |0 \xC6\xC6 |0 \x5F\xB0 |0 \x5F\xAE |0 @@ -9056,6 +9589,7 @@ CHARMAP \x4D\x45 |0 \x54\xB4 |0 \x52\x48 |0 + \xB5\xC9 |0 \xC6\xC9 |0 \xC6\xCA |0 \xC6\xCB |0 @@ -9072,6 +9606,8 @@ CHARMAP \xC6\xD1 |0 \xC6\xD2 |0 \x5F\xB2 |0 + \xB5\xCB |0 + \xB5\xCC |0 \xC6\xD3 |0 \xC6\xD4 |0 \x49\x76 |0 @@ -9164,9 +9700,11 @@ CHARMAP \x5F\xCB |0 \xC7\x44 |0 \xC7\x45 |0 + \xB5\xD1 |0 \xC7\x46 |0 \xC7\x47 |0 \x5F\xCA |0 + \xB5\xD2 |0 \xC7\x48 |0 \xC7\x49 |0 \x51\xB0 |0 @@ -9179,6 +9717,7 @@ CHARMAP \x4D\xF0 |0 \x5F\xCE |0 \xC7\x4D |0 + \xB5\xD4 |0 \xC7\x4E |0 \xC7\x4F |0 \xC7\x50 |0 @@ -9191,6 +9730,7 @@ CHARMAP \x5F\xD0 |0 \x5F\xCF |0 \xC7\x55 |0 + \xB5\xD5 |0 \x5F\xD1 |0 \xC7\x56 |0 \xC7\x57 |0 @@ -9290,6 +9830,8 @@ CHARMAP \x5F\xE3 |0 \xC7\x84 |0 \x46\x58 |0 + \xB5\xDF |0 + \xB5\xE0 |0 \xC7\x85 |0 \x48\xED |0 \x4D\xBA |0 @@ -9439,6 +9981,7 @@ CHARMAP \x55\x9E |0 \xC7\xCC |0 \xC7\xCD |0 + \xB5\xEC |0 \x60\x47 |0 \x60\x46 |0 \x60\x49 |0 @@ -9497,6 +10040,7 @@ CHARMAP \x60\x60 |0 \x60\x5F |0 \x49\xB5 |0 + \xB5\xF1 |0 \xC7\xDC |0 \x53\xE7 |0 \x60\x65 |0 @@ -9523,6 +10067,7 @@ CHARMAP \x60\x67 |0 \x60\x64 |0 \x49\x6E |0 + \xB5\xF3 |0 \xC7\xE9 |0 \xC7\xEA |0 \xC7\xEB |0 @@ -9562,7 +10107,9 @@ CHARMAP \x60\x70 |0 \x60\x6E |0 \xC7\xF9 |0 + \xB5\xF6 |0 \x60\x6F |0 + \xB5\xF7 |0 \xC7\xFA |0 \x55\x9B |0 \x4F\x51 |0 @@ -9632,6 +10179,7 @@ CHARMAP \x60\x84 |0 \xC8\x5A |0 \x54\x44 |0 + \xB5\xFE |0 \xC8\x5B |0 \x60\x8C |0 \xC8\x5C |0 @@ -9663,7 +10211,7 @@ CHARMAP \x51\x7C |0 \xC8\x6D |0 \xC8\x6E |0 - \x54\xCA |1 + \xB6\x41 |0 \x60\x92 |0 \xC8\x6F |0 \x4B\xEC |0 @@ -9688,6 +10236,7 @@ CHARMAP \x4F\x4C |0 \x60\x96 |0 \x60\x98 |0 + \xB6\x43 |0 \xC8\x7A |0 \xC8\x7B |0 \x60\x97 |0 @@ -9700,6 +10249,7 @@ CHARMAP \x4F\x99 |0 \xC8\x7F |0 \x60\x99 |0 + \xB6\x45 |0 \x60\x9B |0 \xC8\x80 |0 \xC8\x81 |0 @@ -9718,6 +10268,7 @@ CHARMAP \x60\x9E |0 \xC8\x8A |0 \xC8\x8B |0 + \xB6\x46 |0 \xC8\x8C |0 \xC8\x8D |0 \x46\x6F |0 @@ -9951,6 +10502,7 @@ CHARMAP \x60\xD6 |0 \x49\xDC |0 \x48\x9D |0 + \xB6\x58 |0 \xC8\xE9 |0 \xC8\xEA |0 \xC8\xEB |0 @@ -9977,6 +10529,7 @@ CHARMAP \x4A\x80 |0 \x60\xE7 |0 \xC8\xF3 |0 + \xB6\x5A |0 \x60\xE2 |0 \xC8\xF4 |0 \xC8\xF5 |0 @@ -10072,6 +10625,7 @@ CHARMAP \xC9\x5D |0 \x4B\x69 |0 \xC9\x5E |0 + \xB6\x60 |0 \xC9\x5F |0 \x61\x43 |0 \x61\x47 |0 @@ -10233,6 +10787,7 @@ CHARMAP \xC9\xA3 |0 \x52\xA0 |0 \x49\x85 |0 + \xB6\x69 |0 \x47\x60 |0 \x61\x81 |0 \x46\x70 |0 @@ -10280,6 +10835,7 @@ CHARMAP \xC9\xBD |0 \x61\x88 |0 \xC9\xBE |0 + \xB6\x6B |0 \xC9\xBF |0 \x61\x8B |0 \x61\x8A |0 @@ -10306,6 +10862,7 @@ CHARMAP \x61\x94 |0 \x48\xD7 |0 \x61\x95 |0 + \xB6\x6C |0 \x61\x96 |0 \x53\xE4 |0 \x61\x97 |0 @@ -10322,6 +10879,7 @@ CHARMAP \x61\x9A |0 \x52\x67 |0 \x52\x6A |0 + \xB6\x6D |0 \x61\x9B |0 \x52\x92 |0 \xC9\xC9 |0 @@ -10329,6 +10887,7 @@ CHARMAP \xC9\xCA |0 \x4C\xC5 |0 \x53\x82 |0 + \xB6\x6E |0 \x49\x7B |0 \xC9\xCB |0 \xC9\xCC |0 @@ -10346,8 +10905,10 @@ CHARMAP \x50\x4E |0 \x4D\xF6 |0 \x61\xA3 |0 + \xB6\x6F |0 \x4E\x9B |0 \xC9\xD0 |0 + \xB6\x70 |0 \x4A\xB2 |0 \xC9\xD1 |0 \x52\x63 |0 @@ -10367,6 +10928,7 @@ CHARMAP \x4D\x63 |0 \x4E\xE9 |0 \x61\xA0 |0 + \xB6\x71 |0 \xC9\xD9 |0 \xC9\xDA |0 \x61\xA6 |0 @@ -10375,10 +10937,12 @@ CHARMAP \xC9\xDC |0 \xC9\xDD |0 \x4E\xAB |0 + \xB6\x73 |0 \xC9\xDE |0 \x4B\xE3 |0 \xC9\xDF |0 \xC9\xE0 |0 + \xB6\x74 |0 \x61\xB0 |0 \x47\x4F |0 \xC9\xE1 |0 @@ -10391,6 +10955,7 @@ CHARMAP \x61\xA5 |0 \x53\x5E |0 \xC9\xE3 |0 + \xB6\x77 |0 \xC9\xE4 |0 \xC9\xE5 |0 \xC9\xE6 |0 @@ -10412,6 +10977,7 @@ CHARMAP \x55\xE9 |0 \xC9\xEF |0 \xC9\xF0 |0 + \xB6\x79 |0 \x61\xAD |0 \x61\xB0 |1 \xC9\xF1 |0 @@ -10489,6 +11055,7 @@ CHARMAP \x61\xC6 |0 \x53\x5F |0 \x61\xC8 |0 + \xB6\x7F |0 \x61\xC9 |0 \xCA\x51 |0 \xCA\x52 |0 @@ -10503,6 +11070,7 @@ CHARMAP \x61\xCD |0 \x4D\xBD |0 \xCA\x57 |0 + \xB6\x80 |0 \xCA\x58 |0 \x61\xCE |0 \x61\xCF |0 @@ -10541,6 +11109,7 @@ CHARMAP \x61\xD6 |0 \x61\xD7 |0 \xCA\x6A |0 + \xB6\x87 |0 \x61\xD8 |0 \x53\x58 |0 \x46\x6A |0 @@ -10581,17 +11150,20 @@ CHARMAP \x61\xE0 |0 \x46\x7B |0 \xCA\x76 |0 + \xB6\x8B |0 \x61\xE2 |0 \xCA\x77 |0 \xCA\x78 |0 \xCA\x79 |0 \xCA\x7A |0 \x4D\xFC |0 + \xB6\x8C |0 \xCA\x7B |0 \xCA\x7C |0 \xCA\x7D |0 \xCA\x7E |0 \xCA\x7F |0 + \xB6\x90 |0 \x54\xAE |0 \x61\xE3 |0 \x61\xE4 |0 @@ -10616,6 +11188,7 @@ CHARMAP \x4D\x54 |0 \x61\xED |0 \x53\xC5 |0 + \xB6\x96 |0 \xCA\x86 |0 \xCA\x87 |0 \x61\xEE |0 @@ -10632,6 +11205,7 @@ CHARMAP \xCA\x90 |0 \xCA\x91 |0 \x61\xF0 |0 + \xB6\x98 |0 \xCA\x92 |0 \xCA\x93 |0 \xCA\x94 |0 @@ -10719,6 +11293,7 @@ CHARMAP \x62\x45 |0 \xCA\xBA |0 \xCA\xBB |0 + \xB6\x99 |0 \x4E\xC9 |0 \x62\x4A |0 \x53\xF6 |0 @@ -10772,6 +11347,7 @@ CHARMAP \xCA\xD6 |0 \x4B\x62 |0 \x62\x48 |0 + \xB6\x9C |0 \xCA\xD7 |0 \x62\x5F |0 \x62\x5A |0 @@ -10838,6 +11414,8 @@ CHARMAP \xCA\xF4 |0 \x53\xD4 |0 \x62\x70 |0 + \xB6\x9F |0 + \xB6\xA0 |0 \xCA\xF5 |0 \x51\x6A |0 \xCA\xF6 |0 @@ -10868,6 +11446,7 @@ CHARMAP \xCA\xFE |0 \x62\x66 |0 \xCB\x41 |0 + \xB6\xA2 |0 \xCB\x42 |0 \x62\x73 |0 \x54\xD8 |0 @@ -10899,6 +11478,7 @@ CHARMAP \xCB\x4F |0 \x48\xDF |0 \xCB\x50 |0 + \xB6\xA5 |0 \xCB\x51 |0 \x55\x47 |0 \x62\x78 |0 @@ -10936,6 +11516,7 @@ CHARMAP \xCB\x60 |0 \x4F\xE3 |0 \xCB\x61 |0 + \xB6\xA6 |0 \x50\x95 |0 \x52\x59 |0 \xCB\x62 |0 @@ -10970,6 +11551,7 @@ CHARMAP \x4F\x6D |0 \xCB\x70 |0 \x62\x8B |0 + \xB6\xA8 |0 \xCB\x71 |0 \x62\x8E |0 \x4F\x9A |0 @@ -11008,6 +11590,7 @@ CHARMAP \x62\x97 |0 \x62\x98 |0 \x54\x9A |0 + \xB6\xAA |0 \xCB\x83 |0 \xCB\x84 |0 \x62\x9A |0 @@ -11029,6 +11612,7 @@ CHARMAP \x46\x5E |0 \xCB\x90 |0 \x54\xD1 |0 + \xB6\xAE |0 \xCB\x91 |0 \x62\xA0 |0 \x62\xA5 |0 @@ -11132,11 +11716,13 @@ CHARMAP \x62\xC0 |0 \x62\xC1 |0 \xCB\xC3 |0 + \xB6\xB4 |0 \xCB\xC4 |0 \x62\xC4 |0 \x62\xC2 |0 \xCB\xC5 |0 \xCB\xC6 |0 + \xB6\xB5 |0 \x45\x68 |0 \x62\xC3 |0 \xCB\xC7 |0 @@ -11176,6 +11762,7 @@ CHARMAP \xCB\xD9 |0 \xCB\xDA |0 \x62\xCA |0 + \xB6\xB6 |0 \xCB\xDB |0 \xCB\xDC |0 \x4C\xA6 |0 @@ -11183,6 +11770,7 @@ CHARMAP \x62\xCC |0 \xCB\xDD |0 \xCB\xDE |0 + \xB6\xB9 |0 \xCB\xDF |0 \xCB\xE0 |0 \xCB\xE1 |0 @@ -11203,6 +11791,7 @@ CHARMAP \xCB\xEA |0 \xCB\xEB |0 \x4F\x72 |0 + \xB6\xBB |0 \x52\x50 |0 \xCB\xEC |0 \x55\x88 |0 @@ -11224,7 +11813,9 @@ CHARMAP \x51\xB6 |0 \xCB\xF8 |0 \x51\x44 |0 + \xB6\xBE |0 \xCB\xF9 |0 + \xB6\xBF |0 \x4F\xAA |0 \x62\xD8 |0 \x62\xDA |0 @@ -11236,6 +11827,7 @@ CHARMAP \xCB\xFD |0 \xCB\xFE |0 \xCC\x41 |0 + \xB6\xC0 |0 \xCC\x42 |0 \x62\xD6 |0 \x55\xA2 |0 @@ -11283,6 +11875,7 @@ CHARMAP \xCC\x5A |0 \x55\xC2 |0 \xCC\x5B |0 + \xB6\xC1 |0 \xCC\x5C |0 \x62\xE6 |0 \x62\xE7 |0 @@ -11347,6 +11940,7 @@ CHARMAP \x62\xFD |0 \xCC\x7B |0 \x62\xFE |0 + \xB6\xC3 |0 \x63\x49 |0 \x53\x47 |0 \x63\x42 |0 @@ -11370,6 +11964,7 @@ CHARMAP \x4E\x6E |0 \x62\xFC |0 \xCC\x84 |0 + \xB6\xC4 |0 \x63\x4B |0 \x63\x44 |0 \xCC\x85 |0 @@ -11429,14 +12024,17 @@ CHARMAP \xCC\xAA |0 \xCC\xAB |0 \xCC\xAC |0 + \xB6\xCC |0 + \xB6\xCD |0 \xCC\xAD |0 \xCC\xAE |0 - \x53\xE8 |1 + \xB6\xCE |0 \xCC\xAF |0 \x63\x5A |0 \xCC\xB0 |0 \x63\x5B |0 \xCC\xB1 |0 + \xB6\xCF |0 \x63\x63 |0 \x63\x64 |0 \xCC\xB2 |0 @@ -11522,6 +12120,7 @@ CHARMAP \x46\xC0 |0 \xCC\xDF |0 \x63\x75 |0 + \xB6\xD3 |0 \x4F\x54 |0 \xCC\xE0 |0 \x63\x7A |0 @@ -11561,6 +12160,7 @@ CHARMAP \x63\x85 |0 \x54\x48 |0 \xCC\xEC |0 + \xB6\xD5 |0 \xCC\xED |0 \xCC\xEE |0 \x63\x84 |0 @@ -11637,6 +12237,7 @@ CHARMAP \xCD\x51 |0 \xCD\x52 |0 \x63\x9E |0 + \xB6\xDB |0 \x63\xA0 |0 \xCD\x53 |0 \xCD\x54 |0 @@ -11684,6 +12285,7 @@ CHARMAP \xCD\x6C |0 \x63\xAC |0 \x45\x58 |0 + \xB6\xDF |0 \x46\x55 |0 \x63\xAD |0 \x4D\xF2 |0 @@ -11775,6 +12377,7 @@ CHARMAP \xCD\x93 |0 \x50\xEF |0 \xCD\x94 |0 + \xB6\xE3 |0 \xCD\x95 |0 \x54\xCC |0 \xCD\x96 |0 @@ -11903,6 +12506,7 @@ CHARMAP \x63\xE0 |0 \x63\xE2 |0 \x4B\xC1 |0 + \xB6\xE5 |0 \xCD\xCC |0 \x51\x81 |0 \xCD\xCD |0 @@ -11948,6 +12552,7 @@ CHARMAP \xCD\xDA |0 \xCD\xDB |0 \x63\xF3 |0 + \xB6\xE8 |0 \x52\xF9 |0 \x63\xF7 |0 \xCD\xDC |0 @@ -11986,6 +12591,7 @@ CHARMAP \xCD\xEA |0 \x64\x44 |0 \x64\x43 |0 + \xB6\xEB |0 \xCD\xEB |0 \x64\x45 |0 \xCD\xEC |0 @@ -11999,6 +12605,7 @@ CHARMAP \x64\x4C |0 \xCD\xEF |0 \x4A\xD7 |0 + \xB6\xEC |0 \x64\x4B |0 \x64\x4D |0 \xCD\xF0 |0 @@ -12035,6 +12642,7 @@ CHARMAP \x64\x54 |0 \x64\x58 |0 \xCD\xFE |0 + \xB6\xED |0 \xCE\x41 |0 \xCE\x42 |0 \x45\x81 |0 @@ -12169,6 +12777,7 @@ CHARMAP \x52\xC1 |0 \xCE\x77 |0 \x64\x7C |0 + \xB6\xF5 |0 \xCE\x78 |0 \x64\x7D |0 \xCE\x79 |0 @@ -12190,6 +12799,7 @@ CHARMAP \x64\x82 |0 \x55\x84 |0 \x64\x84 |0 + \xB6\xF8 |0 \x64\x83 |0 \x64\x86 |0 \x64\x85 |0 @@ -12291,6 +12901,7 @@ CHARMAP \x64\xA0 |0 \x4C\xA8 |0 \xCE\xB5 |0 + \xB6\xFA |0 \x4D\x7C |0 \x64\xA3 |0 \xCE\xB6 |0 @@ -12372,6 +12983,7 @@ CHARMAP \x64\xBD |0 \x64\xBF |0 \xCE\xE1 |0 + \xB7\x41 |0 \x64\xC0 |0 \xCE\xE2 |0 \xCE\xE3 |0 @@ -12391,6 +13003,7 @@ CHARMAP \x64\xC3 |0 \xCE\xEB |0 \xCE\xEC |0 + \xB7\x42 |0 \xCE\xED |0 \xCE\xEE |0 \x64\xC4 |0 @@ -12462,6 +13075,7 @@ CHARMAP \xCF\x50 |0 \x4E\xF4 |0 \x48\xB7 |0 + \xB7\x48 |0 \xCF\x51 |0 \xCF\x52 |0 \xCF\x53 |0 @@ -12486,6 +13100,7 @@ CHARMAP \x64\xE1 |0 \xCF\x5C |0 \x64\xE0 |0 + \xB7\x49 |0 \x64\xE2 |0 \x54\xEE |0 \x64\xE3 |0 @@ -12525,6 +13140,7 @@ CHARMAP \x47\xDF |0 \x52\xE5 |0 \x48\x45 |0 + \xB7\x4C |0 \xCF\x6D |0 \xCF\x6E |0 \x64\xF0 |0 @@ -12746,6 +13362,7 @@ CHARMAP \x51\x62 |0 \xCF\xC6 |0 \xCF\xC7 |0 + \xB7\x55 |0 \xCF\xC8 |0 \x4C\xB7 |0 \xCF\xC9 |0 @@ -12791,6 +13408,7 @@ CHARMAP \xCF\xE7 |0 \xCF\xE8 |0 \xCF\xE9 |0 + \xB7\x57 |0 \xCF\xEA |0 \xCF\xEB |0 \x4F\x73 |0 @@ -12877,6 +13495,7 @@ CHARMAP \x65\x80 |0 \xD0\x57 |0 \xD0\x58 |0 + \xB7\x58 |0 \xD0\x59 |0 \x53\x46 |0 \x53\xBF |0 @@ -12941,6 +13560,7 @@ CHARMAP \x65\x94 |0 \x65\x97 |0 \xD0\x70 |0 + \xB7\x5B |0 \xD0\x71 |0 \xD0\x72 |0 \xD0\x73 |0 @@ -12982,6 +13602,7 @@ CHARMAP \xD0\x87 |0 \x65\xA2 |0 \x65\xA5 |0 + \xB7\x5C |0 \x65\x99 |0 \xD0\x88 |0 \x65\xA3 |0 @@ -13089,6 +13710,7 @@ CHARMAP \xD0\xC6 |0 \x55\xBE |0 \x48\xC1 |0 + \xB7\x62 |0 \x51\xE7 |0 \x53\x94 |0 \x65\xC2 |0 @@ -13097,6 +13719,7 @@ CHARMAP \x65\xC9 |0 \xD0\xC7 |0 \x65\xCE |0 + \xB7\x63 |0 \x55\xD2 |0 \xD0\xC8 |0 \xD0\xC9 |0 @@ -13139,6 +13762,7 @@ CHARMAP \xD0\xD7 |0 \x51\xF7 |0 \xD0\xD8 |0 + \xB7\x66 |0 \x4B\x48 |0 \x55\xD3 |0 \xD0\xD9 |0 @@ -13159,6 +13783,7 @@ CHARMAP \xD0\xE2 |0 \xD0\xE3 |0 \xD0\xE4 |0 + \xB7\x67 |0 \x4F\x70 |0 \xD0\xE5 |0 \x65\xD3 |0 @@ -13239,6 +13864,8 @@ CHARMAP \xD1\x55 |0 \xD1\x56 |0 \x65\xDF |0 + \xB7\x6E |0 + \xB7\x6F |0 \xD1\x57 |0 \x65\xE8 |0 \xD1\x58 |0 @@ -13327,6 +13954,7 @@ CHARMAP \x66\x47 |0 \x51\x9C |0 \xD1\x85 |0 + \xB7\x72 |0 \x66\x48 |0 \xD1\x86 |0 \x4B\x7D |0 @@ -13414,6 +14042,7 @@ CHARMAP \xD1\xAE |0 \x47\xBC |0 \xD1\xAF |0 + \xB7\x77 |0 \xD1\xB0 |0 \xD1\xB1 |0 \xD1\xB2 |0 @@ -13512,6 +14141,7 @@ CHARMAP \xD1\xD2 |0 \x4F\xDA |0 \x4E\xD5 |0 + \xB7\x7E |0 \x4F\x64 |0 \x51\xA4 |0 \x45\x70 |0 @@ -13566,6 +14196,7 @@ CHARMAP \x66\x92 |0 \x66\x91 |0 \x66\x8F |0 + \xB7\x83 |0 \x66\x93 |0 \x66\x8D |0 \xD1\xE2 |0 @@ -13584,6 +14215,7 @@ CHARMAP \xD1\xE9 |0 \x4B\xC6 |0 \x66\x97 |0 + \xB7\x85 |0 \x5B\xCF |0 \x66\x98 |0 \x66\x99 |0 @@ -13594,6 +14226,7 @@ CHARMAP \x66\x9E |0 \x66\x9D |0 \x66\x9C |0 + \xB7\x86 |0 \x66\x9F |0 \x66\xA1 |0 \xD1\xEB |0 @@ -13720,6 +14353,7 @@ CHARMAP \x4C\xD9 |0 \x4D\x5B |0 \x49\x46 |0 + \xB7\x8A |0 \x4A\x97 |0 \x47\xB2 |0 \xD2\x6F |0 @@ -13812,17 +14446,21 @@ CHARMAP \xD2\x98 |0 \xD2\x99 |0 \xD2\x9A |0 + \xB7\x90 |0 \xD2\x9B |0 \xD2\x9C |0 \x66\xD8 |0 \x66\xD7 |0 \xD2\x9D |0 \x66\xD9 |0 + \xB7\x91 |0 \xD2\x9E |0 + \xB7\x92 |0 \xD2\x9F |0 \x48\x8A |0 \x66\xDA |0 \x46\xB8 |0 + \xB7\x94 |0 \xD2\xA0 |0 \x53\xCE |0 \xD2\xA1 |0 @@ -13835,6 +14473,8 @@ CHARMAP \x66\xDB |0 \x5C\xCA |0 \x46\xB5 |0 + \xB7\x95 |0 + \xB7\x96 |0 \x4B\xA3 |0 \xD2\xA6 |0 \x52\x45 |0 @@ -13919,6 +14559,7 @@ CHARMAP \xD2\xCF |0 \x66\xF9 |0 \xD2\xD0 |0 + \xB7\x9B |0 \x66\xFA |0 \xD2\xD1 |0 \x4B\x85 |0 @@ -13972,6 +14613,7 @@ CHARMAP \x67\x4B |0 \xD2\xE9 |0 \x67\x4A |0 + \xB7\x9D |0 \xD2\xEA |0 \xD2\xEB |0 \x4C\xC0 |0 @@ -13980,6 +14622,7 @@ CHARMAP \xD2\xED |0 \xD2\xEE |0 \x67\x4E |0 + \xB7\x9E |0 \xD2\xEF |0 \xD2\xF0 |0 \x50\x58 |0 @@ -13990,6 +14633,7 @@ CHARMAP \x48\xB4 |0 \xD2\xF3 |0 \x67\x4F |0 + \xB7\x9F |0 \xD2\xF4 |0 \xD2\xF5 |0 \xD2\xF6 |0 @@ -14001,6 +14645,7 @@ CHARMAP \xD2\xFA |0 \xD2\xFB |0 \x4E\x5E |0 + \xB7\xA0 |0 \xD2\xFC |0 \xD2\xFD |0 \xD2\xFE |0 @@ -14020,11 +14665,12 @@ CHARMAP \x67\x58 |0 \x67\x59 |0 \xD3\x48 |0 - \x53\xDA |1 + \xB7\xA1 |0 \xD3\x49 |0 \x67\x57 |0 \xD3\x4A |0 \x67\x5B |0 + \xB7\xA2 |0 \x4C\xD5 |0 \x67\x5A |0 \xD3\x4B |0 @@ -14046,6 +14692,7 @@ CHARMAP \xD3\x51 |0 \xD3\x52 |0 \xD3\x53 |0 + \xB7\xA5 |0 \x55\x9C |0 \xD3\x54 |0 \xD3\x55 |0 @@ -14180,6 +14827,7 @@ CHARMAP \xD3\x9F |0 \x67\x90 |0 \x67\x8F |0 + \xB7\xAB |0 \xD3\xA0 |0 \xD3\xA1 |0 \xD3\xA2 |0 @@ -14256,6 +14904,7 @@ CHARMAP \x4D\x78 |0 \xD3\xC8 |0 \xD3\xC9 |0 + \xB7\xAD |0 \xD3\xCA |0 \x55\x51 |0 \x67\xAB |0 @@ -14291,6 +14940,7 @@ CHARMAP \xD3\xD9 |0 \x67\xAE |0 \xD3\xDA |0 + \xB7\xB1 |0 \xD3\xDB |0 \x67\xBC |0 \xD3\xDC |0 @@ -14342,11 +14992,13 @@ CHARMAP \xD3\xF9 |0 \x67\xC3 |0 \xD3\xFA |0 + \xB7\xB6 |0 \x67\xC4 |0 \xD3\xFB |0 \xD3\xFC |0 \xD3\xFD |0 \xD3\xFE |0 + \xB7\xB7 |0 \xD4\x41 |0 \xD4\x42 |0 \xD4\x43 |0 @@ -14354,6 +15006,7 @@ CHARMAP \x67\xC5 |0 \xD4\x45 |0 \x67\xC6 |0 + \xB7\xB8 |0 \xD4\x46 |0 \x47\x79 |0 \xD4\x47 |0 @@ -14414,6 +15067,7 @@ CHARMAP \xD4\x5F |0 \x67\xDF |0 \x67\xDE |0 + \xB7\xBE |0 \xD4\x60 |0 \xD4\x61 |0 \x67\xDD |0 @@ -14434,6 +15088,7 @@ CHARMAP \x67\xE5 |0 \x67\xE2 |0 \x67\xE1 |0 + \xB7\xC0 |0 \xD4\x68 |0 \xD4\x69 |0 \x67\xE6 |0 @@ -14455,6 +15110,7 @@ CHARMAP \xD4\x76 |0 \xD4\x77 |0 \xD4\x78 |0 + \xB7\xC1 |0 \x67\xE7 |0 \xD4\x79 |0 \x67\xE8 |0 @@ -14473,7 +15129,9 @@ CHARMAP \x67\xF0 |0 \x67\xEE |0 \xD4\x80 |0 + \xB7\xC3 |0 \xD4\x81 |0 + \xB7\xC4 |0 \x67\xED |0 \x67\xF3 |0 \xD4\x82 |0 @@ -14493,6 +15151,7 @@ CHARMAP \xD4\x8B |0 \xD4\x8C |0 \xD4\x8D |0 + \xB7\xC5 |0 \xD4\x8E |0 \x67\xF8 |0 \xD4\x8F |0 @@ -14513,6 +15172,7 @@ CHARMAP \xD4\x97 |0 \xD4\x98 |0 \xD4\x99 |0 + \xB7\xC8 |0 \xD4\x9A |0 \xD4\x9B |0 \xD4\x9C |0 @@ -14575,8 +15235,10 @@ CHARMAP \x55\x5F |0 \x48\xA7 |0 \x68\x50 |0 + \xB7\xCA |0 \x68\x51 |0 \x4E\xEA |0 + \xB7\xCB |0 \x4A\xC6 |0 \xD4\xBA |0 \xD4\xBB |0 @@ -20923,7 +21585,12 @@ CHARMAP \x89\xBC |0 \x89\xBD |0 \x44\x6E |1 + \xB4\xE4 |0 + \xB4\x54 |0 \x5B\xC9 |0 + \xB6\xBC |0 + \xB4\xEF |0 + \xB7\x8E |0 \x66\x74 |0 \x57\x8E |0 \x58\x77 |0 @@ -20957,8 +21624,69 @@ CHARMAP \x66\xDF |0 \x66\xE6 |0 \x67\xF4 |0 + \xB3\x54 |0 + \xB3\x63 |0 + \xB3\x69 |0 + \xB3\x7B |0 + \xB3\x7F |0 + \xB3\x83 |0 + \xB3\x9E |0 + \xB3\xA5 |0 + \xB3\xAC |0 + \xB3\xBF |0 + \xB3\xC2 |0 + \xB3\xE7 |0 + \xB3\xE8 |0 + \xB4\x61 |0 + \xB4\x66 |0 + \xB4\x67 |0 + \xB4\x6A |0 + \xB4\x85 |0 + \xB4\x89 |0 + \xB4\x97 |0 + \xB4\xB3 |0 + \xB5\x49 |0 + \xB5\x59 |0 + \xB5\x62 |0 + \xB5\x7C |0 + \xB5\x82 |0 + \xB5\x96 |0 + \xB5\xCE |0 + \xB5\xD6 |0 + \xB5\xD8 |0 + \xB5\xD7 |0 + \xB5\xD9 |0 + \xB5\xDA |0 + \xB5\xDB |0 + \xB5\xDD |0 + \xB5\xDE |0 + \xB5\xE7 |0 + \xB5\xE8 |0 + \xB5\xFB |0 + \xB6\x5B |0 + \xB6\x5D |0 + \xB6\x5F |0 + \xB6\x65 |0 + \xB6\x6A |0 + \xB6\x83 |0 + \xB6\x94 |0 + \xB6\x95 |0 + \xB6\xA3 |0 + \xB6\xD9 |0 + \xB6\xE0 |0 + \xB6\xE6 |0 + \xB6\xE9 |0 + \xB6\xF3 |0 + \xB6\xF6 |0 + \xB7\x4D |0 + \xB7\x4F |0 + \xB7\x82 |0 + \xB7\x89 |0 + \xB7\x8D |0 \xE9\xA3 |0 \xE9\xA4 |0 + \xEC\xAA |0 + \xEC\xAB |0 \x42\x5A |0 \x42\x7F |0 \x42\x7B |0 @@ -21053,10 +21781,364 @@ CHARMAP \x42\x4F |0 \x42\xD0 |0 \xE9\xF4 |0 + \xE9\xF7 |0 + \xE9\xF8 |0 \x43\x4A |0 \x42\x4A |0 \x42\x5F |0 \x42\xA1 |0 \xE9\xF5 |0 \x42\x5B |0 + \xB3\x42 |0 + \xB3\x46 |0 + \xB3\x48 |0 + \xB3\x49 |0 + \xB3\x4E |0 + \xB3\x53 |0 + \xB3\x5D |0 + \xB3\x60 |0 + \xB3\x64 |0 + \xB3\x67 |0 + \xB3\x68 |0 + \xB3\x6B |0 + \xB3\x70 |0 + \xB3\x73 |0 + \xB3\x76 |0 + \xB3\x79 |0 + \xB3\x7A |0 + \xB3\x80 |0 + \xB3\x82 |0 + \xB3\x84 |0 + \xB3\x88 |0 + \xB3\x89 |0 + \xB3\x8D |0 + \xB3\x9B |0 + \xB3\x9F |0 + \xB3\xA2 |0 + \xB3\xA3 |0 + \xB3\xA4 |0 + \xB3\xA8 |0 + \xB3\xB0 |0 + \xB3\xB1 |0 + \xB3\xB3 |0 + \xB3\xB4 |0 + \xB3\xB5 |0 + \xB3\xB6 |0 + \xB3\xB7 |0 + \xB3\xB8 |0 + \xB3\xBA |0 + \xB3\xBD |0 + \xB3\xBE |0 + \xB3\xC0 |0 + \xB3\xC5 |0 + \xB3\xC6 |0 + \xB3\xCA |0 + \xB3\xD0 |0 + \xB3\xD1 |0 + \xB3\xD2 |0 + \xB3\xD6 |0 + \xB3\xD9 |0 + \xB3\xDA |0 + \xB3\xE4 |0 + \xB3\xE9 |0 + \xB3\xEA |0 + \xB3\xEB |0 + \xB3\xEC |0 + \xB3\xEF |0 + \xB3\xF0 |0 + \xB3\xF2 |0 + \xB3\xF4 |0 + \xB3\xF5 |0 + \xB3\xF9 |0 + \xB3\xFA |0 + \xB4\x44 |0 + \xB4\x46 |0 + \xB4\x49 |0 + \xB4\x50 |0 + \xB4\x52 |0 + \xB4\x56 |0 + \xB4\x5A |0 + \xB4\x62 |0 + \xB4\x68 |0 + \xB4\x69 |0 + \xB4\x6C |0 + \xB4\x72 |0 + \xB4\x75 |0 + \xB4\x77 |0 + \xB4\x78 |0 + \xB4\x79 |0 + \xB4\x7C |0 + \xB4\x7D |0 + \xB4\x80 |0 + \xB4\x91 |0 + \xB4\x93 |0 + \xB4\x94 |0 + \xB4\x96 |0 + \xB4\x9F |0 + \xB4\xA1 |0 + \xB4\xA2 |0 + \xB4\xA3 |0 + \xB4\xA4 |0 + \xB4\xA5 |0 + \xB4\xA7 |0 + \xB4\xA8 |0 + \xB4\xAF |0 + \xB4\xB0 |0 + \xB4\xB1 |0 + \xB4\xB2 |0 + \xB4\xBF |0 + \xB4\xC4 |0 + \xB4\xC5 |0 + \xB4\xCB |0 + \xB4\xD2 |0 + \xB4\xD3 |0 + \xB4\xD4 |0 + \xB4\xD5 |0 + \xB4\xDC |0 + \xB4\xDD |0 + \xB4\xDE |0 + \xB4\xDF |0 + \xB4\xE0 |0 + \xB4\xE3 |0 + \xB4\xE5 |0 + \xB4\xE7 |0 + \xB4\xE8 |0 + \xB4\xF0 |0 + \xB4\xF6 |0 + \xB5\x43 |0 + \xB5\x44 |0 + \xB5\x45 |0 + \xB5\x4F |0 + \xB5\x55 |0 + \xB5\x57 |0 + \xB5\x58 |0 + \xB5\x66 |0 + \xB5\x6C |0 + \xB5\x6E |0 + \xB5\x73 |0 + \xB5\x74 |0 + \xB5\x7F |0 + \xB5\x84 |0 + \xB5\x86 |0 + \xB5\x8E |0 + \xB5\x91 |0 + \xB5\x9A |0 + \xB5\x9E |0 + \xB5\x9F |0 + \xB5\xA0 |0 + \xB5\xA4 |0 + \xB5\xAE |0 + \xB5\xB0 |0 + \xB5\xB2 |0 + \xB5\xB4 |0 + \xB5\xB9 |0 + \xB5\xBA |0 + \xB5\xBB |0 + \xB5\xBD |0 + \xB5\xBE |0 + \xB5\xC0 |0 + \xB5\xC2 |0 + \xB5\xC4 |0 + \xB5\xC8 |0 + \xB5\xCD |0 + \xB5\xCF |0 + \xB5\xD0 |0 + \xB5\xD3 |0 + \xB5\xE1 |0 + \xB5\xE3 |0 + \xB5\xE4 |0 + \xB5\xE9 |0 + \xB5\xEA |0 + \xB5\xEE |0 + \xB5\xEF |0 + \xB5\xF0 |0 + \xB5\xF9 |0 + \xB5\xFC |0 + \xB5\xFD |0 + \xB6\x44 |0 + \xB6\x47 |0 + \xB6\x48 |0 + \xB6\x49 |0 + \xB6\x4A |0 + \xB6\x4B |0 + \xB6\x4C |0 + \xB6\x4D |0 + \xB6\x4E |0 + \xB6\x4F |0 + \xB6\x51 |0 + \xB6\x52 |0 + \xB6\x54 |0 + \xB6\x56 |0 + \xB6\x57 |0 + \xB6\x59 |0 + \xB6\x5E |0 + \xB6\x63 |0 + \xB6\x64 |0 + \xB6\x66 |0 + \xB6\x68 |0 + \xB6\x72 |0 + \xB6\x75 |0 + \xB6\x7B |0 + \xB6\x81 |0 + \xB6\x82 |0 + \xB6\x85 |0 + \xB6\x86 |0 + \xB6\x89 |0 + \xB6\x8A |0 + \xB6\x8E |0 + \xB6\x91 |0 + \xB6\x92 |0 + \xB6\x97 |0 + \xB6\x9E |0 + \xB6\xA1 |0 + \xB6\xA4 |0 + \xB6\xAB |0 + \xB6\xAC |0 + \xB6\xB0 |0 + \xB6\xB1 |0 + \xB6\xB2 |0 + \xB6\xB3 |0 + \xB6\xB7 |0 + \xB6\xB8 |0 + \xB6\xBA |0 + \xB6\xC5 |0 + \xB6\xC6 |0 + \xB6\xC7 |0 + \xB6\xC9 |0 + \xB6\xCB |0 + \xB6\xD1 |0 + \xB6\xD2 |0 + \xB6\xD4 |0 + \xB6\xD6 |0 + \xB6\xD7 |0 + \xB6\xDA |0 + \xB6\xDC |0 + \xB6\xDD |0 + \xB6\xE4 |0 + \xB6\xE7 |0 + \xB6\xEE |0 + \xB6\xEF |0 + \xB6\xF0 |0 + \xB6\xF1 |0 + \xB6\xF4 |0 + \xB6\xF7 |0 + \xB6\xF9 |0 + \xB6\xFC |0 + \xB6\xFD |0 + \xB7\x43 |0 + \xB7\x44 |0 + \xB7\x47 |0 + \xB7\x4A |0 + \xB7\x4B |0 + \xB7\x4E |0 + \xB7\x50 |0 + \xB7\x51 |0 + \xB7\x52 |0 + \xB7\x54 |0 + \xB7\x56 |0 + \xB7\x59 |0 + \xB7\x5A |0 + \xB7\x5D |0 + \xB7\x5E |0 + \xB7\x5F |0 + \xB7\x60 |0 + \xB7\x61 |0 + \xB7\x64 |0 + \xB7\x65 |0 + \xB7\x68 |0 + \xB7\x69 |0 + \xB7\x6A |0 + \xB7\x6B |0 + \xB7\x6C |0 + \xB7\x6D |0 + \xB7\x70 |0 + \xB7\x71 |0 + \xB7\x73 |0 + \xB7\x74 |0 + \xB7\x76 |0 + \xB7\x78 |0 + \xB7\x79 |0 + \xB7\x7A |0 + \xB7\x7B |0 + \xB7\x7D |0 + \xB7\x80 |0 + \xB7\x87 |0 + \xB7\x88 |0 + \xB7\x8C |0 + \xB7\x8F |0 + \xB7\x93 |0 + \xB7\x98 |0 + \xB7\x99 |0 + \xB7\x9A |0 + \xB7\x9C |0 + \xB7\xA7 |0 + \xB7\xAC |0 + \xB7\xAE |0 + \xB7\xAF |0 + \xB7\xB0 |0 + \xB7\xB2 |0 + \xB7\xB3 |0 + \xB7\xB4 |0 + \xB7\xB5 |0 + \xB7\xB9 |0 + \xB7\xBB |0 + \xB7\xBD |0 + \xB7\xBF |0 + \xB7\xC2 |0 + \xB7\xC6 |0 + \xB7\xC9 |0 + \xB7\xCC |0 + \xB7\xCE |0 + \xB7\xCF |0 + \xB7\xD0 |0 + \xB7\xD1 |0 +END CHARMAP + +CHARMAP + \xD6\x7B |0 + \xEC\xC3 |0 + \xD8\x90 |0 + \xEC\xC4 |0 + \xEC\xC5 |0 + \xD8\x95 |0 + \xEC\xC8 |0 + \xEC\xC9 |0 + \xD8\x96 |0 + \xEC\xCA |0 + \xEC\xCB |0 + \xD8\xC8 |0 + \xEC\xC6 |0 + \xEC\xC7 |0 + \xD9\x42 |0 + \xEC\xCD |0 + \xD9\x46 |0 + \xEC\xCC |0 + \x44\x86 |0 + \xEC\xB5 |0 + \x44\x87 |0 + \xEC\xB6 |0 + \x44\x88 |0 + \xEC\xB7 |0 + \x44\x89 |0 + \xEC\xB8 |0 + \x44\x8A |0 + \xEC\xB9 |0 + \x43\x86 |0 + \xEC\xBA |0 + \x43\x87 |0 + \xEC\xBB |0 + \x43\x88 |0 + \xEC\xBC |0 + \x43\x89 |0 + \xEC\xBD |0 + \x43\x8A |0 + \xEC\xBE |0 + \x43\x8F |0 + \xEC\xBF |0 + \x43\x93 |0 + \xEC\xC0 |0 + \x43\x95 |0 + \xEC\xC1 |0 + \xEC\x8C |0 + \xEC\xC2 |0 END CHARMAP diff --git a/icuSources/data/mappings/ibm-33722_P120-1999.ucm b/icuSources/data/mappings/ibm-33722_P120-1999.ucm index ab3bdfbd..b3928401 100644 --- a/icuSources/data/mappings/ibm-33722_P120-1999.ucm +++ b/icuSources/data/mappings/ibm-33722_P120-1999.ucm @@ -24,6 +24,10 @@ a1-fe:1, a1:4, a3-af:4, b6:4, d6:4, da-db:4, ed-f2:4 a1-fe.u +# build an extension-only (delta) .cnv file +# requires the base .cnv file at runtime + "ibm-33722_P12A-1999" + CHARMAP \x00 |0 \x01 |0 diff --git a/icuSources/data/mappings/ibm-33722_P12A-1999.ucm b/icuSources/data/mappings/ibm-33722_P12A-1999.ucm index ae250740..711acdc6 100644 --- a/icuSources/data/mappings/ibm-33722_P12A-1999.ucm +++ b/icuSources/data/mappings/ibm-33722_P12A-1999.ucm @@ -117,8 +117,6 @@ CHARMAP \x59 |0 \x5A |0 \x5B |0 - \x5C |0 - \x8E\xE3 |3 \x5D |0 \x5E |0 \x5F |0 @@ -152,8 +150,6 @@ CHARMAP \x7B |0 \x7C |0 \x7D |0 - \x7E |0 - \x8E\xE4 |3 \x7F |0 \x80 |0 \x81 |0 @@ -169,8 +165,6 @@ CHARMAP \x8B |0 \x8C |0 \x8D |0 - \x1A |2 - \x1A |2 \x90 |0 \x91 |0 \x92 |0 @@ -187,102 +181,18 @@ CHARMAP \x9D |0 \x9E |0 \x9F |0 - \x1A |2 - \x1A |2 \x8E\xE0 |0 \x8E\xE1 |0 - \x1A |2 - \x5C |1 \x8F\xA2\xC3 |0 \xA1\xF8 |0 \xA1\xAF |0 - \x1A |2 - \x1A |2 - \x1A |2 \x8E\xE2 |0 - \x1A |2 - \x1A |2 - \x1A |2 \xA1\xEB |0 \xA1\xDE |0 - \x1A |2 - \x1A |2 \xA1\xAD |0 - \x1A |2 \xA2\xF9 |0 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 \xA1\xDF |0 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 \xA1\xE0 |0 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 \xA6\xA1 |0 \xA6\xA2 |0 \xA6\xA3 |0 @@ -413,7 +323,6 @@ CHARMAP \xA1\xEC |0 \xA1\xED |0 \xA2\xA8 |0 - \x7E |1 \xA1\xEE |0 \x8F\xF3\xB8 |0 \x8F\xF3\xB9 |0 @@ -442,8 +351,6 @@ CHARMAP \xA2\xAC |0 \xA2\xAA |0 \xA2\xAD |0 - \x1A |2 - \x1A |2 \xA2\xCD |0 \xA2\xCE |0 \xA2\xCF |0 @@ -512,19 +419,6 @@ CHARMAP \xA8\xBB |0 \xA8\xC0 |0 \xA8\xB6 |0 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 \xA2\xA3 |0 \xA2\xA2 |0 \xA2\xA5 |0 @@ -539,7 +433,6 @@ CHARMAP \xA2\xFE |0 \xA1\xFA |0 \xA1\xF9 |0 - \x1A |2 \xA1\xEA |0 \xA1\xE9 |0 \xA2\xF6 |0 @@ -567,7 +460,6 @@ CHARMAP \xA1\xCC |0 \xA1\xCD |0 \xA1\xC1 |0 - \x1A |2 \xA4\xA1 |0 \xA4\xA2 |0 \xA4\xA3 |0 @@ -9545,6 +9437,117 @@ CHARMAP \xA1\xB1 |0 \x8F\xA2\xC3 |1 \xA1\xEF |0 +END CHARMAP + +CHARMAP + \x5C |0 + \x8E\xE3 |3 + \x7E |0 + \x8E\xE4 |3 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x5C |1 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x7E |1 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 \x1A |2 \x1A |2 \x1A |2 diff --git a/icuSources/data/mappings/ibm-737_P100-1997.ucm b/icuSources/data/mappings/ibm-737_P100-1997.ucm new file mode 100644 index 00000000..40ef5b94 --- /dev/null +++ b/icuSources/data/mappings/ibm-737_P100-1997.ucm @@ -0,0 +1,411 @@ +# *************************************************************************** +# * +# * Copyright (C) 1995-2002, International Business Machines +# * Corporation and others. All Rights Reserved. +# * +# *************************************************************************** +# +# File created by rptp2ucm (compiled on Dec 3 2002) +# from source files 34B002E1.RPMAP100 and 02E134B0.TPMAP100 +# + "ibm-737_P100-1997" + "AXXXX" + 1 + 1 + "SBCS" + \x7F + "ASCII" + "ibm-737_VSUB" + +CHARMAP + \x00 |0 + \x01 |0 + \x02 |0 + \x03 |0 + \x04 |0 + \x05 |0 + \x06 |0 + \x07 |0 + \x08 |0 + \x09 |0 + \x0A |0 + \x0B |0 + \x0C |0 + \x0D |0 + \x0E |0 + \x0F |0 + \x10 |0 + \x11 |0 + \x12 |0 + \x13 |0 + \x14 |0 + \x15 |0 + \x16 |0 + \x17 |0 + \x18 |0 + \x19 |0 + \x7F |0 + \x1B |0 + \x1A |0 + \x1D |0 + \x1E |0 + \x1F |0 + \x20 |0 + \x21 |0 + \x22 |0 + \x23 |0 + \x24 |0 + \x25 |0 + \x26 |0 + \x27 |0 + \x28 |0 + \x29 |0 + \x2A |0 + \x2B |0 + \x2C |0 + \x2D |0 + \x2E |0 + \x2F |0 + \x30 |0 + \x31 |0 + \x32 |0 + \x33 |0 + \x34 |0 + \x35 |0 + \x36 |0 + \x37 |0 + \x38 |0 + \x39 |0 + \x3A |0 + \x3B |0 + \x3C |0 + \x3D |0 + \x3E |0 + \x3F |0 + \x40 |0 + \x41 |0 + \x42 |0 + \x43 |0 + \x44 |0 + \x45 |0 + \x46 |0 + \x47 |0 + \x48 |0 + \x49 |0 + \x4A |0 + \x4B |0 + \x4C |0 + \x4D |0 + \x4E |0 + \x4F |0 + \x50 |0 + \x51 |0 + \x52 |0 + \x53 |0 + \x54 |0 + \x55 |0 + \x56 |0 + \x57 |0 + \x58 |0 + \x59 |0 + \x5A |0 + \x5B |0 + \x5C |0 + \x5D |0 + \x5E |0 + \x5F |0 + \x60 |0 + \x61 |0 + \x62 |0 + \x63 |0 + \x64 |0 + \x65 |0 + \x66 |0 + \x67 |0 + \x68 |0 + \x69 |0 + \x6A |0 + \x6B |0 + \x6C |0 + \x6D |0 + \x6E |0 + \x6F |0 + \x70 |0 + \x71 |0 + \x72 |0 + \x73 |0 + \x74 |0 + \x75 |0 + \x76 |0 + \x77 |0 + \x78 |0 + \x79 |0 + \x7A |0 + \x7B |0 + \x7C |0 + \x7D |0 + \x7E |0 + \x1C |0 + \xFF |0 + \x15 |1 + \xF8 |0 + \xF1 |0 + \xFD |0 + \x14 |1 + \xFA |0 + \xF6 |0 + \xEA |0 + \xEB |0 + \xEC |0 + \xED |0 + \xEE |0 + \xEF |0 + \xF0 |0 + \x80 |0 + \x81 |0 + \x82 |0 + \x83 |0 + \x84 |0 + \x85 |0 + \x86 |0 + \x87 |0 + \x88 |0 + \x89 |0 + \x8A |0 + \x8B |0 + \x8C |0 + \x8D |0 + \x8E |0 + \x8F |0 + \x90 |0 + \x91 |0 + \x92 |0 + \x93 |0 + \x94 |0 + \x95 |0 + \x96 |0 + \x97 |0 + \xF4 |0 + \xF5 |0 + \xE1 |0 + \xE2 |0 + \xE3 |0 + \xE5 |0 + \x98 |0 + \x99 |0 + \x9A |0 + \x9B |0 + \x9C |0 + \x9D |0 + \x9E |0 + \x9F |0 + \xA0 |0 + \xA1 |0 + \xA2 |0 + \xA3 |0 + \xA4 |0 + \xA5 |0 + \xA6 |0 + \xA7 |0 + \xA8 |0 + \xAA |0 + \xA9 |0 + \xAB |0 + \xAC |0 + \xAD |0 + \xAE |0 + \xAF |0 + \xE0 |0 + \xE4 |0 + \xE8 |0 + \xE6 |0 + \xE7 |0 + \xE9 |0 + \xAD |1 + \x07 |1 + \x13 |1 + \xFC |0 + \x1B |1 + \x18 |1 + \x1A |1 + \x19 |1 + \x1D |1 + \x12 |1 + \x17 |1 + \xF9 |0 + \xFB |0 + \x1C |1 + \xF7 |0 + \xF3 |0 + \xF2 |0 + \x7F |2 + \xC4 |0 + \xB3 |0 + \xDA |0 + \xBF |0 + \xC0 |0 + \xD9 |0 + \xC3 |0 + \xB4 |0 + \xC2 |0 + \xC1 |0 + \xC5 |0 + \xCD |0 + \xBA |0 + \xD5 |0 + \xD6 |0 + \xC9 |0 + \xB8 |0 + \xB7 |0 + \xBB |0 + \xD4 |0 + \xD3 |0 + \xC8 |0 + \xBE |0 + \xBD |0 + \xBC |0 + \xC6 |0 + \xC7 |0 + \xCC |0 + \xB5 |0 + \xB6 |0 + \xB9 |0 + \xD1 |0 + \xD2 |0 + \xCB |0 + \xCF |0 + \xD0 |0 + \xCA |0 + \xD8 |0 + \xD7 |0 + \xCE |0 + \xDF |0 + \xDC |0 + \xDB |0 + \xDD |0 + \xDE |0 + \xB0 |0 + \xB1 |0 + \xB2 |0 + \xFE |0 + \x16 |1 + \x1E |1 + \x10 |1 + \x1F |1 + \x11 |1 + \x09 |1 + \x08 |1 + \x0A |1 + \x01 |1 + \x02 |1 + \x0F |1 + \x0C |1 + \x0B |1 + \x06 |1 + \x05 |1 + \x03 |1 + \x04 |1 + \x0D |1 + \x0E |1 + \x21 |1 + \x22 |1 + \x23 |1 + \x24 |1 + \x25 |1 + \x26 |1 + \x27 |1 + \x28 |1 + \x29 |1 + \x2A |1 + \x2B |1 + \x2C |1 + \x2D |1 + \x2E |1 + \x2F |1 + \x30 |1 + \x31 |1 + \x32 |1 + \x33 |1 + \x34 |1 + \x35 |1 + \x36 |1 + \x37 |1 + \x38 |1 + \x39 |1 + \x3A |1 + \x3B |1 + \x3C |1 + \x3D |1 + \x3E |1 + \x3F |1 + \x40 |1 + \x41 |1 + \x42 |1 + \x43 |1 + \x44 |1 + \x45 |1 + \x46 |1 + \x47 |1 + \x48 |1 + \x49 |1 + \x4A |1 + \x4B |1 + \x4C |1 + \x4D |1 + \x4E |1 + \x4F |1 + \x50 |1 + \x51 |1 + \x52 |1 + \x53 |1 + \x54 |1 + \x55 |1 + \x56 |1 + \x57 |1 + \x58 |1 + \x59 |1 + \x5A |1 + \x5B |1 + \x5C |1 + \x5D |1 + \x5E |1 + \x5F |1 + \x60 |1 + \x61 |1 + \x62 |1 + \x63 |1 + \x64 |1 + \x65 |1 + \x66 |1 + \x67 |1 + \x68 |1 + \x69 |1 + \x6A |1 + \x6B |1 + \x6C |1 + \x6D |1 + \x6E |1 + \x6F |1 + \x70 |1 + \x71 |1 + \x72 |1 + \x73 |1 + \x74 |1 + \x75 |1 + \x76 |1 + \x77 |1 + \x78 |1 + \x79 |1 + \x7A |1 + \x7B |1 + \x7C |1 + \x7D |1 + \x7E |1 + \xB3 |1 + \x1B |1 + \x18 |1 + \x1A |1 + \x19 |1 + \xFE |1 + \x09 |1 +END CHARMAP diff --git a/icuSources/data/mappings/ibm-775_P100-1996.ucm b/icuSources/data/mappings/ibm-775_P100-1996.ucm new file mode 100644 index 00000000..3124e9b8 --- /dev/null +++ b/icuSources/data/mappings/ibm-775_P100-1996.ucm @@ -0,0 +1,408 @@ +# *************************************************************************** +# * +# * Copyright (C) 1995-2004, International Business Machines +# * Corporation and others. All Rights Reserved. +# * +# *************************************************************************** +# +# File created by rptp2ucm (compiled on Jan 14 2004) +# from source files 34B00307.RPMAP100 and 030734B0.TPMAP100 +# + "ibm-775_P100-1996" + "AXXXX" + 1 + 1 + "SBCS" + \x7F + "ASCII" + "ibm-775_VSUB" + +CHARMAP + \x00 |0 + \x01 |0 + \x02 |0 + \x03 |0 + \x04 |0 + \x05 |0 + \x06 |0 + \x07 |0 + \x08 |0 + \x09 |0 + \x0A |0 + \x0B |0 + \x0C |0 + \x0D |0 + \x0E |0 + \x0F |0 + \x10 |0 + \x11 |0 + \x12 |0 + \x13 |0 + \x14 |0 + \x15 |0 + \x16 |0 + \x17 |0 + \x18 |0 + \x19 |0 + \x7F |0 + \x1B |0 + \x1A |0 + \x1D |0 + \x1E |0 + \x1F |0 + \x20 |0 + \x21 |0 + \x22 |0 + \x23 |0 + \x24 |0 + \x25 |0 + \x26 |0 + \x27 |0 + \x28 |0 + \x29 |0 + \x2A |0 + \x2B |0 + \x2C |0 + \x2D |0 + \x2E |0 + \x2F |0 + \x30 |0 + \x31 |0 + \x32 |0 + \x33 |0 + \x34 |0 + \x35 |0 + \x36 |0 + \x37 |0 + \x38 |0 + \x39 |0 + \x3A |0 + \x3B |0 + \x3C |0 + \x3D |0 + \x3E |0 + \x3F |0 + \x40 |0 + \x41 |0 + \x42 |0 + \x43 |0 + \x44 |0 + \x45 |0 + \x46 |0 + \x47 |0 + \x48 |0 + \x49 |0 + \x4A |0 + \x4B |0 + \x4C |0 + \x4D |0 + \x4E |0 + \x4F |0 + \x50 |0 + \x51 |0 + \x52 |0 + \x53 |0 + \x54 |0 + \x55 |0 + \x56 |0 + \x57 |0 + \x58 |0 + \x59 |0 + \x5A |0 + \x5B |0 + \x5C |0 + \x5D |0 + \x5E |0 + \x5F |0 + \x60 |0 + \x61 |0 + \x62 |0 + \x63 |0 + \x64 |0 + \x65 |0 + \x66 |0 + \x67 |0 + \x68 |0 + \x69 |0 + \x6A |0 + \x6B |0 + \x6C |0 + \x6D |0 + \x6E |0 + \x6F |0 + \x70 |0 + \x71 |0 + \x72 |0 + \x73 |0 + \x74 |0 + \x75 |0 + \x76 |0 + \x77 |0 + \x78 |0 + \x79 |0 + \x7A |0 + \x7B |0 + \x7C |0 + \x7D |0 + \x7E |0 + \x1C |0 + \xFF |0 + \x96 |0 + \x9C |0 + \x9F |0 + \xA7 |0 + \xF5 |0 + \xA8 |0 + \xAE |0 + \xAA |0 + \xF0 |0 + \xA9 |0 + \xF8 |0 + \xF1 |0 + \xFD |0 + \xFC |0 + \xE6 |0 + \xF4 |0 + \xFA |0 + \xFB |0 + \xAF |0 + \xAC |0 + \xAB |0 + \xF3 |0 + \x8E |0 + \x8F |0 + \x92 |0 + \x90 |0 + \xE0 |0 + \xE5 |0 + \x99 |0 + \x9E |0 + \x9D |0 + \x9A |0 + \xE1 |0 + \x84 |0 + \x86 |0 + \x91 |0 + \x82 |0 + \xA2 |0 + \xE4 |0 + \x94 |0 + \xF6 |0 + \x9B |0 + \x81 |0 + \xA0 |0 + \x83 |0 + \xB5 |0 + \xD0 |0 + \x80 |0 + \x87 |0 + \xB6 |0 + \xD1 |0 + \xED |0 + \x89 |0 + \xB8 |0 + \xD3 |0 + \xB7 |0 + \xD2 |0 + \x95 |0 + \x85 |0 + \xA1 |0 + \x8C |0 + \xBD |0 + \xD4 |0 + \xE8 |0 + \xE9 |0 + \xEA |0 + \xEB |0 + \xAD |0 + \x88 |0 + \xE3 |0 + \xE7 |0 + \xEE |0 + \xEC |0 + \xE2 |0 + \x93 |0 + \x8A |0 + \x8B |0 + \x97 |0 + \x98 |0 + \xBE |0 + \xD5 |0 + \xC7 |0 + \xD7 |0 + \xC6 |0 + \xD6 |0 + \x8D |0 + \xA5 |0 + \xA3 |0 + \xA4 |0 + \xCF |0 + \xD8 |0 + \xEF |0 + \xF2 |0 + \xA6 |0 + \xF7 |0 + \x07 |1 + \x13 |1 + \x1B |1 + \x18 |1 + \x1A |1 + \x19 |1 + \x1D |1 + \x12 |1 + \x17 |1 + \xF9 |0 + \x1C |1 + \x7F |2 + \xC4 |0 + \xB3 |0 + \xDA |0 + \xBF |0 + \xC0 |0 + \xD9 |0 + \xC3 |0 + \xB4 |0 + \xC2 |0 + \xC1 |0 + \xC5 |0 + \xCD |0 + \xBA |0 + \xC9 |0 + \xBB |0 + \xC8 |0 + \xBC |0 + \xCC |0 + \xB9 |0 + \xCB |0 + \xCA |0 + \xCE |0 + \xDF |0 + \xDC |0 + \xDB |0 + \xDD |0 + \xDE |0 + \xB0 |0 + \xB1 |0 + \xB2 |0 + \xFE |0 + \x16 |1 + \x1E |1 + \x10 |1 + \x1F |1 + \x11 |1 + \x09 |1 + \x08 |1 + \x0A |1 + \x01 |1 + \x02 |1 + \x0F |1 + \x0C |1 + \x0B |1 + \x06 |1 + \x05 |1 + \x03 |1 + \x04 |1 + \x0D |1 + \x0E |1 + \x21 |1 + \x22 |1 + \x23 |1 + \x24 |1 + \x25 |1 + \x26 |1 + \x27 |1 + \x28 |1 + \x29 |1 + \x2A |1 + \x2B |1 + \x2C |1 + \x2D |1 + \x2E |1 + \x2F |1 + \x30 |1 + \x31 |1 + \x32 |1 + \x33 |1 + \x34 |1 + \x35 |1 + \x36 |1 + \x37 |1 + \x38 |1 + \x39 |1 + \x3A |1 + \x3B |1 + \x3C |1 + \x3D |1 + \x3E |1 + \x3F |1 + \x40 |1 + \x41 |1 + \x42 |1 + \x43 |1 + \x44 |1 + \x45 |1 + \x46 |1 + \x47 |1 + \x48 |1 + \x49 |1 + \x4A |1 + \x4B |1 + \x4C |1 + \x4D |1 + \x4E |1 + \x4F |1 + \x50 |1 + \x51 |1 + \x52 |1 + \x53 |1 + \x54 |1 + \x55 |1 + \x56 |1 + \x57 |1 + \x58 |1 + \x59 |1 + \x5A |1 + \x5B |1 + \x5C |1 + \x5D |1 + \x5E |1 + \x5F |1 + \x60 |1 + \x61 |1 + \x62 |1 + \x63 |1 + \x64 |1 + \x65 |1 + \x66 |1 + \x67 |1 + \x68 |1 + \x69 |1 + \x6A |1 + \x6B |1 + \x6C |1 + \x6D |1 + \x6E |1 + \x6F |1 + \x70 |1 + \x71 |1 + \x72 |1 + \x73 |1 + \x74 |1 + \x75 |1 + \x76 |1 + \x77 |1 + \x78 |1 + \x79 |1 + \x7A |1 + \x7B |1 + \x7C |1 + \x7D |1 + \x7E |1 + \xB3 |1 + \x1B |1 + \x18 |1 + \x1A |1 + \x19 |1 + \xFE |1 + \x09 |1 +END CHARMAP diff --git a/icuSources/data/mappings/ibm-8482.ucm b/icuSources/data/mappings/ibm-8482_P100-1999.ucm similarity index 94% rename from icuSources/data/mappings/ibm-8482.ucm rename to icuSources/data/mappings/ibm-8482_P100-1999.ucm index b5f78869..1678f2cf 100644 --- a/icuSources/data/mappings/ibm-8482.ucm +++ b/icuSources/data/mappings/ibm-8482_P100-1999.ucm @@ -1,29 +1,23 @@ -# ******************************************************************************* +# *************************************************************************** # * -# * Copyright (C) 1999-2000, International Business Machines +# * Copyright (C) 1995-2003, International Business Machines # * Corporation and others. All Rights Reserved. # * -# ******************************************************************************* +# *************************************************************************** # -# File created on Mon Nov 13 08:50:45 2000 -# -# File created by dtcocm version 3.00 +# File created by rptp2ucm (compiled on Dec 3 2002) # from source files 44B02122.RPMAP100 and 212244B0.TPMAP100 # -# Table Version : 1.01 -# - "IBM-8482" + "ibm-8482_P100-1999" "AXXXX" 1 1 "SBCS" \x3F -# + "EBCDIC" + "ibm-8482_STD" + CHARMAP -# -# -#ISO 10646 IBM-8482 -#_________ _________ \x00 |0 \x01 |0 \x02 |0 diff --git a/icuSources/data/mappings/ibm-897_P100-1995.ucm b/icuSources/data/mappings/ibm-897_P100-1995.ucm new file mode 100644 index 00000000..fd1ac6d7 --- /dev/null +++ b/icuSources/data/mappings/ibm-897_P100-1995.ucm @@ -0,0 +1,328 @@ +# *************************************************************************** +# * +# * Copyright (C) 1995-2004, International Business Machines +# * Corporation and others. All Rights Reserved. +# * +# *************************************************************************** +# +# File created by rptp2ucm (compiled on Dec 3 2002) +# from source files 34B00381.RPMAP100 and 038134B0.TPMAP100 +# + "ibm-897_P100-1995" + "AXXXX" + 1 + 1 + "SBCS" + \x7F + "ASCII" + "ibm-897_VASCII_VSUB" + +CHARMAP + \x00 |0 + \x01 |0 + \x02 |0 + \x03 |0 + \x04 |0 + \x05 |0 + \x06 |0 + \x07 |0 + \x08 |0 + \x09 |0 + \x0A |0 + \x0B |0 + \x0C |0 + \x0D |0 + \x0E |0 + \x0F |0 + \x10 |0 + \x11 |0 + \x12 |0 + \x13 |0 + \x14 |0 + \x15 |0 + \x16 |0 + \x17 |0 + \x18 |0 + \x19 |0 + \x7F |0 + \x1B |0 + \x1A |0 + \x1D |0 + \x1E |0 + \x1F |0 + \x20 |0 + \x21 |0 + \x22 |0 + \x23 |0 + \x24 |0 + \x25 |0 + \x26 |0 + \x27 |0 + \x28 |0 + \x29 |0 + \x2A |0 + \x2B |0 + \x2C |0 + \x2D |0 + \x2E |0 + \x2F |0 + \x30 |0 + \x31 |0 + \x32 |0 + \x33 |0 + \x34 |0 + \x35 |0 + \x36 |0 + \x37 |0 + \x38 |0 + \x39 |0 + \x3A |0 + \x3B |0 + \x3C |0 + \x3D |0 + \x3E |0 + \x3F |0 + \x40 |0 + \x41 |0 + \x42 |0 + \x43 |0 + \x44 |0 + \x45 |0 + \x46 |0 + \x47 |0 + \x48 |0 + \x49 |0 + \x4A |0 + \x4B |0 + \x4C |0 + \x4D |0 + \x4E |0 + \x4F |0 + \x50 |0 + \x51 |0 + \x52 |0 + \x53 |0 + \x54 |0 + \x55 |0 + \x56 |0 + \x57 |0 + \x58 |0 + \x59 |0 + \x5A |0 + \x5B |0 + \x5D |0 + \x5E |0 + \x5F |0 + \x60 |0 + \x61 |0 + \x62 |0 + \x63 |0 + \x64 |0 + \x65 |0 + \x66 |0 + \x67 |0 + \x68 |0 + \x69 |0 + \x6A |0 + \x6B |0 + \x6C |0 + \x6D |0 + \x6E |0 + \x6F |0 + \x70 |0 + \x71 |0 + \x72 |0 + \x73 |0 + \x74 |0 + \x75 |0 + \x76 |0 + \x77 |0 + \x78 |0 + \x79 |0 + \x7A |0 + \x7B |0 + \x7C |0 + \x7D |0 + \x1C |0 + \x5C |0 + \x7E |0 + \x12 |1 + \x1B |1 + \x06 |1 + \x05 |1 + \x01 |1 + \x02 |1 + \x03 |1 + \x04 |1 + \x19 |1 + \x17 |1 + \x16 |1 + \x15 |1 + \x10 |1 + \x1A |1 + \x14 |1 + \x0F |1 + \x0B |1 + \x21 |1 + \x22 |1 + \x23 |1 + \x24 |1 + \x25 |1 + \x26 |1 + \x27 |1 + \x28 |1 + \x29 |1 + \x2A |1 + \x2B |1 + \x2C |1 + \x2D |1 + \x2E |1 + \x2F |1 + \x30 |1 + \x31 |1 + \x32 |1 + \x33 |1 + \x34 |1 + \x35 |1 + \x36 |1 + \x37 |1 + \x38 |1 + \x39 |1 + \x3A |1 + \x3B |1 + \x3C |1 + \x3D |1 + \x3E |1 + \x3F |1 + \x40 |1 + \x41 |1 + \x42 |1 + \x43 |1 + \x44 |1 + \x45 |1 + \x46 |1 + \x47 |1 + \x48 |1 + \x49 |1 + \x4A |1 + \x4B |1 + \x4C |1 + \x4D |1 + \x4E |1 + \x4F |1 + \x50 |1 + \x51 |1 + \x52 |1 + \x53 |1 + \x54 |1 + \x55 |1 + \x56 |1 + \x57 |1 + \x58 |1 + \x59 |1 + \x5A |1 + \x5B |1 + \x5D |1 + \x5E |1 + \x5F |1 + \x60 |1 + \x61 |1 + \x62 |1 + \x63 |1 + \x64 |1 + \x65 |1 + \x66 |1 + \x67 |1 + \x68 |1 + \x69 |1 + \x6A |1 + \x6B |1 + \x6C |1 + \x6D |1 + \x6E |1 + \x6F |1 + \x70 |1 + \x71 |1 + \x72 |1 + \x73 |1 + \x74 |1 + \x75 |1 + \x76 |1 + \x77 |1 + \x78 |1 + \x79 |1 + \x7A |1 + \x7B |1 + \x7C |1 + \x7D |1 + \xA1 |0 + \xA2 |0 + \xA3 |0 + \xA4 |0 + \xA5 |0 + \xA6 |0 + \xA7 |0 + \xA8 |0 + \xA9 |0 + \xAA |0 + \xAB |0 + \xAC |0 + \xAD |0 + \xAE |0 + \xAF |0 + \xB0 |0 + \xB1 |0 + \xB2 |0 + \xB3 |0 + \xB4 |0 + \xB5 |0 + \xB6 |0 + \xB7 |0 + \xB8 |0 + \xB9 |0 + \xBA |0 + \xBB |0 + \xBC |0 + \xBD |0 + \xBE |0 + \xBF |0 + \xC0 |0 + \xC1 |0 + \xC2 |0 + \xC3 |0 + \xC4 |0 + \xC5 |0 + \xC6 |0 + \xC7 |0 + \xC8 |0 + \xC9 |0 + \xCA |0 + \xCB |0 + \xCC |0 + \xCD |0 + \xCE |0 + \xCF |0 + \xD0 |0 + \xD1 |0 + \xD2 |0 + \xD3 |0 + \xD4 |0 + \xD5 |0 + \xD6 |0 + \xD7 |0 + \xD8 |0 + \xD9 |0 + \xDA |0 + \xDB |0 + \xDC |0 + \xDD |0 + \xDE |0 + \xDF |0 + \x1D |1 + \x1F |1 + \x1C |1 + \x1E |1 + \x07 |1 + \x0E |1 + \x09 |1 +END CHARMAP diff --git a/icuSources/data/mappings/ibm-930_P120-1999.ucm b/icuSources/data/mappings/ibm-930_P120-1999.ucm index 590709ab..152c9634 100644 --- a/icuSources/data/mappings/ibm-930_P120-1999.ucm +++ b/icuSources/data/mappings/ibm-930_P120-1999.ucm @@ -1,6 +1,6 @@ # *************************************************************************** # * -# * Copyright (C) 1995-2002, International Business Machines +# * Copyright (C) 1995-2003, International Business Machines # * Corporation and others. All Rights Reserved. # * # *************************************************************************** @@ -33,8 +33,6 @@ CHARMAP \x0B |0 \x0C |0 \x0D |0 - \x3F |2 - \x3F |2 \x10 |0 \x11 |0 \x12 |0 @@ -55,7 +53,6 @@ CHARMAP \x5A |0 \x7F |0 \x7B |0 - \xE0 |0 \x6C |0 \x50 |0 \x7D |0 @@ -110,42 +107,12 @@ CHARMAP \xE7 |0 \xE8 |0 \xE9 |0 - \x70 |0 - \xB2 |0 - \x80 |0 \xB0 |0 \x6D |0 \x79 |0 - \x62 |0 - \x63 |0 - \x64 |0 - \x65 |0 - \x66 |0 - \x67 |0 - \x68 |0 - \x69 |0 - \x71 |0 - \x72 |0 - \x73 |0 - \x74 |0 - \x75 |0 - \x76 |0 - \x77 |0 - \x78 |0 - \x8B |0 - \x9B |0 - \xAB |0 - \xB3 |0 - \xB4 |0 - \xB5 |0 - \xB6 |0 - \xB7 |0 - \xB8 |0 - \xB9 |0 \xC0 |0 \x4F |0 \xD0 |0 - \xA0 |0 \x07 |0 \x20 |0 \x21 |0 @@ -179,102 +146,16 @@ CHARMAP \x14 |0 \x3E |0 \xFF |0 - \x3F |2 - \x3F |2 - \xB1 |0 - \x4A |0 - \x3F |2 - \x5B |0 \x42\x6A |0 \x44\x6A |0 \x44\x60 |0 - \x3F |2 - \x3F |2 - \x3F |2 \x5F |0 - \x3F |2 - \x3F |2 - \x3F |2 \x44\xED |0 \x44\x4B |0 - \x3F |2 - \x3F |2 \x44\x50 |0 - \x3F |2 \x43\x79 |0 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 \x44\x7A |0 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 \x44\x7B |0 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 \x41\x61 |0 \x41\x62 |0 \x41\x63 |0 @@ -405,7 +286,6 @@ CHARMAP \x44\xEE |0 \x44\xEF |0 \x44\x6B |0 - \xA1 |0 \x44\x4E |0 \x44\x6E |0 \x44\x6F |0 @@ -434,8 +314,6 @@ CHARMAP \x44\xF2 |0 \x44\xF0 |0 \x44\xF3 |0 - \x3F |2 - \x3F |2 \x43\x6E |0 \x43\x6F |0 \x43\x70 |0 @@ -504,19 +382,6 @@ CHARMAP \x43\xED |0 \x43\xF2 |0 \x43\xE8 |0 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 - \x3F |2 \x44\xEA |0 \x44\xE9 |0 \x44\xE3 |0 @@ -531,7 +396,6 @@ CHARMAP \x43\x7A |0 \x44\xE6 |0 \x44\xE5 |0 - \x3F |2 \x44\x79 |0 \x44\x69 |0 \x43\x76 |0 @@ -559,7 +423,6 @@ CHARMAP \x44\x63 |0 \x44\x73 |0 \x43\xA1 |0 - \x3F |2 \x44\x47 |0 \x44\x81 |0 \x44\x48 |0 @@ -11958,6 +11821,156 @@ CHARMAP \x42\x4F |0 \x42\xD0 |0 \x43\xA1 |1 + \x58 |0 + \x9A |0 + \xBE |0 + \xBF |0 + \x43\x4A |0 + \x42\x4A |0 + \x42\x5F |0 + \x42\xA1 |0 + \x42\x6A |1 + \x42\x5B |0 +END CHARMAP + +CHARMAP + \x3F |2 + \x3F |2 + \xE0 |0 + \x70 |0 + \xB2 |0 + \x80 |0 + \x62 |0 + \x63 |0 + \x64 |0 + \x65 |0 + \x66 |0 + \x67 |0 + \x68 |0 + \x69 |0 + \x71 |0 + \x72 |0 + \x73 |0 + \x74 |0 + \x75 |0 + \x76 |0 + \x77 |0 + \x78 |0 + \x8B |0 + \x9B |0 + \xAB |0 + \xB3 |0 + \xB4 |0 + \xB5 |0 + \xB6 |0 + \xB7 |0 + \xB8 |0 + \xB9 |0 + \xA0 |0 + \x3F |2 + \x3F |2 + \xB1 |0 + \x4A |0 + \x3F |2 + \x5B |0 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \xA1 |0 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 + \x3F |2 \x41 |0 \x42 |0 \x43 |0 @@ -11973,7 +11986,6 @@ CHARMAP \x54 |0 \x55 |0 \x56 |0 - \x58 |0 \x81 |0 \x82 |0 \x83 |0 @@ -11998,7 +12010,6 @@ CHARMAP \x97 |0 \x98 |0 \x99 |0 - \x9A |0 \x9D |0 \x9E |0 \x9F |0 @@ -12019,14 +12030,6 @@ CHARMAP \xBB |0 \xBC |0 \xBD |0 - \xBE |0 - \xBF |0 - \x43\x4A |0 - \x42\x4A |0 - \x42\x5F |0 - \x42\xA1 |0 - \x42\x6A |1 - \x42\x5B |0 \x3F |2 \x3F |2 \x3F |2 diff --git a/icuSources/data/mappings/ibm-937_P110-1999.ucm b/icuSources/data/mappings/ibm-937_P110-1999.ucm index 3d558bbc..a8f46f19 100644 --- a/icuSources/data/mappings/ibm-937_P110-1999.ucm +++ b/icuSources/data/mappings/ibm-937_P110-1999.ucm @@ -1,6 +1,6 @@ # *************************************************************************** # * -# * Copyright (C) 1995-2002, International Business Machines +# * Copyright (C) 1995-2003, International Business Machines # * Corporation and others. All Rights Reserved. # * # *************************************************************************** @@ -18,6 +18,10 @@ "EBCDIC" "ibm-937_VPUA" +# build an extension-only (delta) .cnv file +# requires the base .cnv file at runtime + "ibm-1371_P100-1999" + CHARMAP \x00 |0 \x01 |0 diff --git a/icuSources/data/mappings/ibm-939_P120-1999.ucm b/icuSources/data/mappings/ibm-939_P120-1999.ucm index c8ce5cf8..7f0ffd3c 100644 --- a/icuSources/data/mappings/ibm-939_P120-1999.ucm +++ b/icuSources/data/mappings/ibm-939_P120-1999.ucm @@ -1,6 +1,6 @@ # *************************************************************************** # * -# * Copyright (C) 1995-2002, International Business Machines +# * Copyright (C) 1995-2003, International Business Machines # * Corporation and others. All Rights Reserved. # * # *************************************************************************** @@ -18,6 +18,10 @@ "EBCDIC" "ibm-939_VPUA" +# build an extension-only (delta) .cnv file +# requires the base .cnv file at runtime + "ibm-930_P120-1999" + CHARMAP \x00 |0 \x01 |0 diff --git a/icuSources/data/mappings/ibm-942_P12A-1999.ucm b/icuSources/data/mappings/ibm-942_P12A-1999.ucm index c27f20d1..89aa7a21 100644 --- a/icuSources/data/mappings/ibm-942_P12A-1999.ucm +++ b/icuSources/data/mappings/ibm-942_P12A-1999.ucm @@ -21,6 +21,10 @@ 0-80, 81-9f:1, a0-df, e0-fc:1, fd-ff 40-7e, 80-fc +# build an extension-only (delta) .cnv file +# requires the base .cnv file at runtime + "ibm-943_P15A-2003" + CHARMAP \x00 |0 \x01 |0 diff --git a/icuSources/data/mappings/ibm-943_P130-1999.ucm b/icuSources/data/mappings/ibm-943_P130-1999.ucm index 101cdfdd..d45455c9 100644 --- a/icuSources/data/mappings/ibm-943_P130-1999.ucm +++ b/icuSources/data/mappings/ibm-943_P130-1999.ucm @@ -21,6 +21,10 @@ 0-7f, 81-9f:1, a0-df, e0-fc:1 40-7e, 80-fc +# build an extension-only (delta) .cnv file +# requires the base .cnv file at runtime + "ibm-943_P15A-2003" + CHARMAP \x00 |0 \x01 |0 diff --git a/icuSources/data/mappings/ibm-943_P14A-1999.ucm b/icuSources/data/mappings/ibm-943_P15A-2003.ucm similarity index 98% rename from icuSources/data/mappings/ibm-943_P14A-1999.ucm rename to icuSources/data/mappings/ibm-943_P15A-2003.ucm index 1076e138..20a0348d 100644 --- a/icuSources/data/mappings/ibm-943_P14A-1999.ucm +++ b/icuSources/data/mappings/ibm-943_P15A-2003.ucm @@ -5,20 +5,21 @@ # * # *************************************************************************** # -# File created by rptp2ucm (compiled on Dec 3 2002) -# from source files 34B003AF.RPMAP14A and 03AF34B0.TPMAP14A +# File created by rptp2ucm (compiled on Dec 27 2002) +# from source files 34B003AF.RPMAP15A and 03AF34B0.TPMAP14A # - "ibm-943_P14A-1999" + "ibm-943_P15A-2003" "AXXXX" 2 1 "MBCS" - \x81\xA1 + \xFC\xFC \x7F "ASCII" "ibm-943_VSUB_VPUA" - 0-7f, 81-9f:1, a0-df, e0-fc:1 +# declare 80, fd-ff legal because they are used in other Shift-JIS variants + 0-80, 81-9f:1, a0-df, e0-fc:1, fd-ff 40-7e, 80-fc CHARMAP @@ -114,7 +115,6 @@ CHARMAP \x59 |0 \x5A |0 \x5B |0 - \x5C |0 \x5D |0 \x5E |0 \x5F |0 @@ -148,136 +148,15 @@ CHARMAP \x7B |0 \x7C |0 \x7D |0 - \x7E |0 \x1C |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x5C |1 - \xFA\x55 |1 \x81\x98 |0 \x81\x4E |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \x81\x8B |0 \x81\x7D |0 - \x7F |2 - \x7F |2 \x81\x4C |0 - \x7F |2 \x81\xF7 |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \x81\x7E |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \x81\x80 |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \x83\x9F |0 \x83\xA0 |0 \x83\xA1 |0 @@ -393,9 +272,6 @@ CHARMAP \x84\x91 |0 \x84\x76 |0 \x81\x5D |0 - \x81\x5C |1 - \x81\x5C |0 - \x81\x61 |1 \x81\x65 |0 \x81\x66 |0 \x81\x67 |0 @@ -408,52 +284,17 @@ CHARMAP \x81\x8C |0 \x81\x8D |0 \x81\xA6 |0 - \x7E |1 \x81\x8E |0 - \x87\x82 |3 - \xFA\x59 |0 - \x87\x84 |3 - \xFA\x5A |0 \x81\xF0 |0 - \x87\x54 |3 - \xFA\x4A |0 - \x87\x55 |3 - \xFA\x4B |0 - \x87\x56 |3 - \xFA\x4C |0 - \x87\x57 |3 - \xFA\x4D |0 - \x87\x58 |3 - \xFA\x4E |0 - \x87\x59 |3 - \xFA\x4F |0 - \x87\x5A |3 - \xFA\x50 |0 - \x87\x5B |3 - \xFA\x51 |0 - \x87\x5C |3 - \xFA\x52 |0 - \x87\x5D |3 - \xFA\x53 |0 - \xEE\xEF |3 \xFA\x40 |0 - \xEE\xF0 |3 \xFA\x41 |0 - \xEE\xF1 |3 \xFA\x42 |0 - \xEE\xF2 |3 \xFA\x43 |0 - \xEE\xF3 |3 \xFA\x44 |0 - \xEE\xF4 |3 \xFA\x45 |0 - \xEE\xF5 |3 \xFA\x46 |0 - \xEE\xF6 |3 \xFA\x47 |0 - \xEE\xF7 |3 \xFA\x48 |0 - \xEE\xF8 |3 \xFA\x49 |0 \x81\xA9 |0 \x81\xAA |0 @@ -467,36 +308,21 @@ CHARMAP \x81\xDE |0 \x81\xB8 |0 \x81\xB9 |0 - \x87\x94 |0 - \x81\x7C |1 \x81\xE3 |0 - \x87\x95 |3 \x81\xE5 |0 \x81\x87 |0 - \x87\x98 |0 \x81\xDA |0 - \x87\x97 |3 - \x81\x61 |0 \x81\xC8 |0 \x81\xC9 |0 \x81\xBF |0 - \x87\x9B |3 \x81\xBE |0 - \x87\x9C |3 \x81\xE7 |0 - \x87\x92 |3 \x81\xE8 |0 - \x87\x93 |0 \x81\x88 |0 - \x81\xE6 |0 - \x87\x9A |3 - \xFA\x5B |3 \x81\xE4 |0 \x81\xE0 |0 - \x87\x90 |3 \x81\x82 |0 \x81\xDF |0 - \x87\x91 |3 \x81\x85 |0 \x81\x86 |0 \x81\xE1 |0 @@ -506,29 +332,7 @@ CHARMAP \x81\xBA |0 \x81\xBB |0 \x81\xDB |0 - \x87\x96 |3 - \x87\x99 |0 \x81\xDC |0 - \x87\x40 |0 - \x87\x41 |0 - \x87\x42 |0 - \x87\x43 |0 - \x87\x44 |0 - \x87\x45 |0 - \x87\x46 |0 - \x87\x47 |0 - \x87\x48 |0 - \x87\x49 |0 - \x87\x4A |0 - \x87\x4B |0 - \x87\x4C |0 - \x87\x4D |0 - \x87\x4E |0 - \x87\x4F |0 - \x87\x50 |0 - \x87\x51 |0 - \x87\x52 |0 - \x87\x53 |0 \x84\x9F |0 \x84\xAA |0 \x84\xA0 |0 @@ -601,9 +405,6 @@ CHARMAP \x81\xAC |0 \x81\x6B |0 \x81\x6C |0 - \x81\x60 |1 - \x87\x80 |0 - \x87\x81 |0 \x82\x9F |0 \x82\xA0 |0 \x82\xA1 |0 @@ -781,43 +582,6 @@ CHARMAP \x81\x5B |0 \x81\x52 |0 \x81\x53 |0 - \x87\x8A |3 - \xFA\x58 |0 - \x87\x8B |0 - \x87\x8C |0 - \x87\x85 |0 - \x87\x86 |0 - \x87\x87 |0 - \x87\x88 |0 - \x87\x89 |0 - \x87\x65 |0 - \x87\x69 |0 - \x87\x60 |0 - \x87\x63 |0 - \x87\x61 |0 - \x87\x6B |0 - \x87\x6A |0 - \x87\x64 |0 - \x87\x6C |0 - \x87\x66 |0 - \x87\x6E |0 - \x87\x5F |0 - \x87\x6D |0 - \x87\x62 |0 - \x87\x67 |0 - \x87\x68 |0 - \x87\x7E |0 - \x87\x8F |0 - \x87\x8E |0 - \x87\x8D |0 - \x87\x72 |0 - \x87\x73 |0 - \x87\x6F |0 - \x87\x70 |0 - \x87\x71 |0 - \x87\x75 |0 - \x87\x74 |0 - \x87\x83 |0 \x88\xEA |0 \x92\x9A |0 \x8E\xB5 |0 @@ -839,7 +603,6 @@ CHARMAP \x8F\xE5 |0 \x97\xBC |0 \x95\xC0 |0 - \xED\x4C |3 \xFA\x68 |0 \x98\xA2 |0 \x92\x86 |0 @@ -925,7 +688,6 @@ CHARMAP \x81\x57 |0 \x98\xBE |0 \x98\xC0 |0 - \xED\x4D |3 \xFA\x69 |0 \x91\xE3 |0 \x97\xDF |0 @@ -937,12 +699,9 @@ CHARMAP \x8C\x8F |0 \x98\xC1 |0 \x94\x43 |0 - \xED\x4E |3 \xFA\x6A |0 - \xED\x4F |3 \xFA\x6B |0 \x8A\xE9 |0 - \xED\x50 |3 \xFA\x6C |0 \x98\xC2 |0 \x88\xC9 |0 @@ -959,7 +718,6 @@ CHARMAP \x94\xBA |0 \x97\xE0 |0 \x90\x4C |0 - \xED\x51 |3 \xFA\x6D |0 \x8E\x66 |0 \x8E\x97 |0 @@ -974,7 +732,6 @@ CHARMAP \x97\x43 |0 \x91\xCC |0 \x89\xBD |0 - \xED\x52 |3 \xFA\x6E |0 \x98\xC7 |0 \x97\x5D |0 @@ -995,26 +752,21 @@ CHARMAP \x8A\xA4 |0 \x98\xD2 |0 \x98\xCA |0 - \xED\x54 |3 \xFA\x70 |0 \x97\xE1 |0 \x8E\x98 |0 \x98\xCB |0 \x98\xD0 |0 - \xED\x53 |3 \xFA\x6F |0 - \xED\x56 |3 \xFA\x72 |0 \x98\xD3 |0 \x98\xCC |0 - \xED\x55 |3 \xFA\x71 |0 \x8B\x9F |0 \x88\xCB |0 \x8B\xA0 |0 \x89\xBF |0 \x9B\x44 |0 - \x96\x99 |0 \x95\x8E |0 \x8C\xF2 |0 \x90\x4E |0 @@ -1023,10 +775,8 @@ CHARMAP \x8C\x57 |0 \x91\xA3 |0 \x89\xE2 |0 - \xED\x45 |3 \xFA\x61 |0 \x8F\x72 |0 - \xED\x57 |3 \xFA\x73 |0 \x98\xD7 |0 \x98\xDC |0 @@ -1051,7 +801,6 @@ CHARMAP \x95\xEE |0 \x89\xB4 |0 \x98\xEA |0 - \xED\x5A |3 \xFA\x76 |0 \x98\xE4 |0 \x98\xED |0 @@ -1065,11 +814,9 @@ CHARMAP \x8C\xF4 |0 \x8C\xF3 |0 \x98\xDF |0 - \xED\x5B |3 \xFA\x77 |0 \x8E\xD8 |0 \x98\xE7 |0 - \xED\x59 |3 \xFA\x75 |0 \x95\xED |0 \x92\x6C |0 @@ -1083,12 +830,9 @@ CHARMAP \x98\x60 |0 \x8B\xE4 |0 \x8C\x90 |0 - \xED\x58 |3 \xFA\x74 |0 - \xED\x5E |3 \xFA\x7A |0 \x98\xEE |0 - \xED\x5C |3 \xFA\x78 |0 \x98\xEF |0 \x98\xF3 |0 @@ -1101,7 +845,6 @@ CHARMAP \x92\xE2 |0 \x8C\x92 |0 \x98\xF6 |0 - \xED\x5D |3 \xFA\x79 |0 \x8E\xC3 |0 \x91\xA4 |0 @@ -1113,7 +856,6 @@ CHARMAP \x98\xFA |0 \x96\x54 |0 \x8C\x86 |0 - \xED\x5F |3 \xFA\x7B |0 \x8E\x50 |0 \x94\xF5 |0 @@ -1135,7 +877,6 @@ CHARMAP \x8B\xA1 |0 \x96\x6C |0 \x99\x44 |0 - \xED\x61 |3 \xFA\x7D |0 \x97\xBB |0 \x99\x45 |0 @@ -1144,7 +885,6 @@ CHARMAP \x91\x6D |0 \x99\x47 |0 \x99\x49 |0 - \xED\x60 |3 \xFA\x7C |0 \x99\x4B |0 \x99\x4A |0 @@ -1158,7 +898,6 @@ CHARMAP \x99\x51 |0 \x99\x50 |0 \x99\x4F |0 - \x98\xD4 |0 \x99\x52 |0 \x8F\x9E |0 \x99\x53 |0 @@ -1178,7 +917,6 @@ CHARMAP \x8B\xA2 |0 \x90\xE6 |0 \x8C\xF5 |0 - \xED\x62 |3 \xFA\x7E |0 \x8D\x8E |0 \x99\x5B |0 @@ -1190,7 +928,6 @@ CHARMAP \x93\x7D |0 \x8A\x95 |0 \x99\x5D |0 - \xED\x63 |3 \xFA\x80 |0 \x93\xFC |0 \x91\x53 |0 @@ -1223,7 +960,6 @@ CHARMAP \x99\x6B |0 \x8F\xE7 |0 \x8E\xCA |0 - \xED\x64 |3 \xFA\x81 |0 \x8A\xA5 |0 \x99\x6E |0 @@ -1244,7 +980,6 @@ CHARMAP \x96\xE8 |0 \x97\xE2 |0 \x99\x77 |0 - \xED\x65 |3 \xFA\x82 |0 \x90\xA6 |0 \x99\x78 |0 @@ -1263,7 +998,6 @@ CHARMAP \x91\xFA |0 \x99\x7D |0 \x93\xE2 |0 - \xED\x66 |3 \xFA\x83 |0 \x99\x7E |0 \x99\x80 |0 @@ -1286,7 +1020,6 @@ CHARMAP \x99\x86 |0 \x8C\x59 |0 \x99\x85 |0 - \xED\x67 |3 \xFA\x84 |0 \x97\xF1 |0 \x8F\x89 |0 @@ -1340,19 +1073,16 @@ CHARMAP \x99\x9A |0 \x99\x99 |0 \x97\xCD |0 - \xED\x68 |3 \xFA\x85 |0 \x8C\xF7 |0 \x89\xC1 |0 \x97\xF2 |0 - \xED\x69 |3 \xFA\x86 |0 \x8F\x95 |0 \x93\x77 |0 \x8D\x85 |0 \x99\xA0 |0 \x99\xA1 |0 - \xEE\x5B |3 \xFB\x77 |0 \x97\xE3 |0 \x98\x4A |0 @@ -1360,7 +1090,6 @@ CHARMAP \x8C\xF8 |0 \x99\xA2 |0 \x8A\x4E |0 - \xED\x6A |3 \xFA\x87 |0 \x99\xA4 |0 \x96\x75 |0 @@ -1373,7 +1102,6 @@ CHARMAP \x99\xA6 |0 \x8A\xA8 |0 \x96\xB1 |0 - \xED\x6B |3 \xFA\x88 |0 \x8F\x9F |0 \x99\xA7 |0 @@ -1392,13 +1120,11 @@ CHARMAP \x8E\xD9 |0 \x8C\xF9 |0 \x96\xDC |0 - \xED\x6C |3 \xFA\x89 |0 \x96\xE6 |0 \x93\xF5 |0 \x95\xEF |0 \x99\xB0 |0 - \xED\x6D |3 \xFA\x8A |0 \x99\xB1 |0 \x99\xB3 |0 @@ -1413,7 +1139,6 @@ CHARMAP \x8F\xA0 |0 \x8B\xA7 |0 \x99\xB8 |0 - \xED\x6E |3 \xFA\x8B |0 \x94\xD9 |0 \x99\xB9 |0 @@ -1450,7 +1175,6 @@ CHARMAP \x89\x4B |0 \x88\xF3 |0 \x8A\xEB |0 - \xED\x6F |3 \xFA\x8C |0 \x91\xA6 |0 \x8B\x70 |0 @@ -1461,7 +1185,6 @@ CHARMAP \x8B\xA8 |0 \x99\xCA |0 \x96\xEF |0 - \xED\x70 |3 \xFA\x8D |0 \x99\xCB |0 \x97\xD0 |0 @@ -1475,7 +1198,6 @@ CHARMAP \x89\x7D |0 \x99\xCF |0 \x99\xD0 |0 - \xED\x71 |3 \xFA\x8E |0 \x8C\xB5 |0 \x99\xD1 |0 @@ -1494,7 +1216,6 @@ CHARMAP \x8E\xF3 |0 \x8F\x96 |0 \x94\xBE |0 - \xED\x72 |3 \xFA\x8F |0 \x99\xD5 |0 \x89\x62 |0 @@ -1571,7 +1292,6 @@ CHARMAP \x99\xF0 |0 \x99\xF2 |0 \x99\xF4 |0 - \xED\x75 |3 \xFA\x92 |0 \x8D\xEE |0 \x98\x61 |0 @@ -1579,13 +1299,11 @@ CHARMAP \x99\xE7 |0 \x99\xF3 |0 \x99\xEE |0 - \xED\x74 |3 \xFA\x91 |0 \x99\xF6 |0 \x9A\x42 |0 \x99\xF8 |0 \x99\xFC |0 - \xED\x76 |3 \xFA\x93 |0 \x9A\x40 |0 \x99\xF9 |0 @@ -1615,7 +1333,6 @@ CHARMAP \x93\x4E |0 \x9A\x4D |0 \x9A\x4A |0 - \xED\x77 |3 \xFA\x94 |0 \x89\x53 |0 \x8D\xB4 |0 @@ -1650,7 +1367,6 @@ CHARMAP \x9A\x5C |0 \x9A\x66 |0 \x91\x50 |0 - \xED\x78 |3 \xFA\x95 |0 \x9A\x68 |0 \x8D\x41 |0 @@ -1780,11 +1496,9 @@ CHARMAP \x9A\xAD |0 \x8D\xBF |0 \x8D\x42 |0 - \xED\x79 |3 \xFA\x96 |0 \x9A\xB1 |0 \x8D\xA3 |0 - \xED\x7A |3 \xFA\x97 |0 \x92\x52 |0 \x9A\xAE |0 @@ -1800,16 +1514,13 @@ CHARMAP \x8A\x5F |0 \x9A\xB7 |0 \x9A\xB8 |0 - \xED\x7B |3 \xFA\x98 |0 \x9A\xB9 |0 \x9A\xB6 |0 \x9A\xAF |0 \x9A\xBA |0 \x9A\xBB |0 - \xED\x7D |3 \xFA\x9A |0 - \xED\x7C |3 \xFA\x99 |0 \x96\x84 |0 \x8F\xE9 |0 @@ -1838,7 +1549,6 @@ CHARMAP \x9A\xC6 |0 \x92\xE7 |0 \x8A\xAC |0 - \xEA\x9F |0 \x89\x81 |0 \x95\xF1 |0 \x8F\xEA |0 @@ -1871,13 +1581,11 @@ CHARMAP \x95\xE6 |0 \x91\x9D |0 \x92\xC4 |0 - \xED\x81 |3 \xFA\x9D |0 \x9A\xD0 |0 \x96\x6E |0 \x9A\xD1 |0 \x9A\xD6 |0 - \xED\x82 |3 \xFA\x9E |0 \x95\xAD |0 \x9A\xD5 |0 @@ -1908,16 +1616,13 @@ CHARMAP \x90\xBA |0 \x88\xEB |0 \x94\x84 |0 - \x92\xD9 |0 \x9A\xE3 |0 - \x9A\xE2 |0 \x9A\xE4 |0 \x9A\xE5 |0 \x9A\xE6 |0 \x9A\xE7 |0 \x95\xCF |0 \x9A\xE8 |0 - \xED\x83 |3 \xFA\x9F |0 \x89\xC4 |0 \x9A\xE9 |0 @@ -1950,20 +1655,16 @@ CHARMAP \x91\x74 |0 \x9A\xF4 |0 \x8C\x5F |0 - \xED\x84 |3 \xFA\xA0 |0 \x96\x7A |0 \x9A\xF3 |0 \x93\x85 |0 \x9A\xF7 |0 \x9A\xF6 |0 - \xED\x85 |3 \xFA\xA1 |0 - \xED\x86 |3 \xFA\xA2 |0 \x9A\xF9 |0 \x9A\xF8 |0 - \xED\x87 |3 \xFA\xA3 |0 \x89\x9C |0 \x9A\xFA |0 @@ -1988,14 +1689,12 @@ CHARMAP \x9B\xAA |0 \x9B\x42 |0 \x9B\x45 |0 - \xED\x88 |3 \xFA\xA4 |0 \x91\xC3 |0 \x96\x57 |0 \x93\x69 |0 \x9B\x46 |0 \x96\x85 |0 - \xED\x89 |3 \xFA\xA5 |0 \x8D\xC8 |0 \x8F\xA8 |0 @@ -2080,7 +1779,6 @@ CHARMAP \x9B\x72 |0 \x8D\x45 |0 \x9B\x73 |0 - \xED\x8A |3 \xFA\xA6 |0 \x8E\x9A |0 \x91\xB6 |0 @@ -2134,7 +1832,6 @@ CHARMAP \x9B\x82 |0 \x97\x65 |0 \x8F\x68 |0 - \xED\x8B |3 \xFA\xA7 |0 \x8E\xE2 |0 \x9B\x83 |0 @@ -2148,7 +1845,6 @@ CHARMAP \x8A\xA6 |0 \x8B\xF5 |0 \x9B\x86 |0 - \xED\x8D |3 \xFA\xA9 |0 \x8A\xB0 |0 \x90\x51 |0 @@ -2163,7 +1859,6 @@ CHARMAP \x9E\xCB |0 \x90\x52 |0 \x9B\x8D |0 - \xED\x8E |3 \xFA\xAA |0 \x97\xBE |0 \x9B\x8E |0 @@ -2191,13 +1886,11 @@ CHARMAP \x9B\x95 |0 \x90\xEB |0 \x8F\xAE |0 - \xED\x8F |3 \xFA\xAB |0 \x9B\x96 |0 \x9B\x97 |0 \x96\xDE |0 \x9B\x98 |0 - \x8B\xC4 |0 \x8F\x41 |0 \x9B\x99 |0 \x9B\x9A |0 @@ -2239,7 +1932,6 @@ CHARMAP \x9B\xA8 |0 \x9B\xA9 |0 \x89\xAA |0 - \xED\x90 |3 \xFA\xAC |0 \x91\x5A |0 \x8A\xE2 |0 @@ -2250,7 +1942,6 @@ CHARMAP \x9B\xAD |0 \x9B\xAF |0 \x8A\xDD |0 - \xED\x91 |3 \xFA\xAD |0 \x9B\xAC |0 \x9B\xAE |0 @@ -2266,7 +1957,6 @@ CHARMAP \x9B\xB7 |0 \x95\xF5 |0 \x95\xF4 |0 - \xED\x92 |3 \xFA\xAE |0 \x93\x87 |0 \x9B\xB6 |0 @@ -2286,22 +1976,18 @@ CHARMAP \x9B\xBF |0 \x9B\xBE |0 \x9B\xC2 |0 - \xED\x93 |3 \xFA\xAF |0 \x95\xF6 |0 - \xED\x96 |3 \xFA\xB2 |0 \x9B\xC9 |0 \x9B\xC6 |0 \x9B\xC8 |0 \x97\x92 |0 \x9B\xC7 |0 - \xED\x94 |3 \xFA\xB0 |0 \x9B\xBD |0 \x90\x93 |0 \x9B\xCA |0 - \xED\x97 |3 \xFA\xB3 |0 \x8D\xB5 |0 \x9B\xCB |0 @@ -2317,9 +2003,7 @@ CHARMAP \x9B\xD2 |0 \x9B\xD3 |0 \x9B\xD6 |0 - \xED\x98 |3 \xFA\xB4 |0 - \xED\x99 |3 \xFA\xB5 |0 \x97\xE4 |0 \x9B\xD7 |0 @@ -2327,7 +2011,6 @@ CHARMAP \x9B\xD8 |0 \x8A\xDE |0 \x9B\xD9 |0 - \xED\x9A |3 \xFA\xB6 |0 \x9B\xDB |0 \x9B\xDA |0 @@ -2473,7 +2156,6 @@ CHARMAP \x8D\x4F |0 \x92\x6F |0 \x92\xED |0 - \xED\x9B |3 \xFA\xB7 |0 \x96\xED |0 \x8C\xB7 |0 @@ -2482,7 +2164,6 @@ CHARMAP \x9C\x58 |0 \x9C\x5E |0 \x8E\xE3 |0 - \xED\x9C |3 \xFA\xB8 |0 \x92\xA3 |0 \x8B\xAD |0 @@ -2490,7 +2171,6 @@ CHARMAP \x95\x4A |0 \x92\x65 |0 \x9C\x5A |0 - \xED\x4B |3 \xFA\x67 |0 \x9C\x5B |0 \x8B\xAE |0 @@ -2506,7 +2186,6 @@ CHARMAP \x9C\x63 |0 \x8C\x60 |0 \x95\x46 |0 - \xED\x9D |3 \xFA\xB9 |0 \x8D\xCA |0 \x95\x56 |0 @@ -2548,7 +2227,6 @@ CHARMAP \x94\xF7 |0 \x93\xBF |0 \x92\xA5 |0 - \xED\x9E |3 \xFA\xBA |0 \x93\x4F |0 \x9C\x74 |0 @@ -2563,7 +2241,6 @@ CHARMAP \x96\x5A |0 \x89\x9E |0 \x9C\x7A |0 - \xED\x9F |3 \xFA\xBB |0 \x92\x89 |0 \x9C\x77 |0 @@ -2609,7 +2286,6 @@ CHARMAP \x8F\x9A |0 \x9C\x99 |0 \x9C\x8B |0 - \xED\xA0 |3 \xFA\xBC |0 \x9C\x8F |0 \x9C\x7E |0 @@ -2630,10 +2306,8 @@ CHARMAP \x9C\x9A |0 \x9C\x9D |0 \x9C\x9F |0 - \xED\xA1 |3 \xFA\xBD |0 \x8E\xBB |0 - \xED\xA2 |3 \xFA\xBE |0 \x9C\xA5 |0 \x92\xEE |0 @@ -2664,12 +2338,10 @@ CHARMAP \x93\xD5 |0 \x98\x66 |0 \x9C\xA9 |0 - \xED\xA4 |3 \xFA\xC0 |0 \x9C\xAF |0 \x8D\x9B |0 \x90\xC9 |0 - \xED\xA3 |3 \xFA\xBF |0 \x88\xD2 |0 \x9C\xA8 |0 @@ -2679,7 +2351,6 @@ CHARMAP \x8E\x53 |0 \x91\xC4 |0 \x9C\xBB |0 - \xED\xA6 |3 \xFA\xC2 |0 \x91\x7A |0 \x9C\xB6 |0 @@ -2697,22 +2368,18 @@ CHARMAP \x9C\xBC |0 \x9C\xBD |0 \x88\xD3 |0 - \xED\xA7 |3 \xFA\xC3 |0 \x9C\xB1 |0 \x8B\xF0 |0 \x88\xA4 |0 \x8A\xB4 |0 - \xED\xA5 |3 \xFA\xC1 |0 \x9C\xB9 |0 \x9C\xC1 |0 \x9C\xC0 |0 \x9C\xC5 |0 - \xED\xA9 |3 \xFA\xC5 |0 \x9C\xC6 |0 - \xED\xA8 |3 \xFA\xC4 |0 \x9C\xC4 |0 \x9C\xC7 |0 @@ -2758,7 +2425,6 @@ CHARMAP \x9C\xDF |0 \x9C\xDC |0 \x9C\xD9 |0 - \xED\xAA |3 \xFA\xC6 |0 \x9C\xD8 |0 \x9C\xDD |0 @@ -2804,7 +2470,6 @@ CHARMAP \x90\xAC |0 \x89\xE4 |0 \x89\xFA |0 - \xED\xAB |3 \xFA\xC7 |0 \x9C\xFB |0 \x88\xBD |0 @@ -2865,7 +2530,6 @@ CHARMAP \x9D\x65 |0 \x94\xB2 |0 \x91\xF0 |0 - \xED\xAC |3 \xFA\xC8 |0 \x94\xE2 |0 \x9D\xAB |0 @@ -2988,7 +2652,6 @@ CHARMAP \x9D\x82 |0 \x8A\xF6 |0 \x89\x87 |0 - \xED\xAD |3 \xFA\xC9 |0 \x9D\x88 |0 \x97\x68 |0 @@ -3012,7 +2675,6 @@ CHARMAP \x9D\x97 |0 \x92\xCD |1 \x93\x45 |0 - \xED\xAE |3 \xFA\xCA |0 \x9D\x94 |0 \x96\x80 |0 @@ -3026,7 +2688,6 @@ CHARMAP \x9D\x9A |0 \x9D\x99 |0 \x94\x51 |0 - \xED\xAF |3 \xFA\xCB |0 \x93\xB3 |0 \x93\x50 |0 @@ -3037,7 +2698,6 @@ CHARMAP \x8E\x42 |0 \x90\xEF |0 \x96\x6F |0 - \x8A\x68 |0 \x9D\xA3 |0 \x9D\x9E |0 \x97\x69 |0 @@ -3045,7 +2705,6 @@ CHARMAP \x9D\xA1 |0 \x9D\xA2 |0 \x91\x80 |0 - \xED\xB0 |3 \xFA\xCC |0 \x9D\xA0 |0 \x9D\x5E |0 @@ -3074,7 +2733,6 @@ CHARMAP \x9D\xB7 |1 \x9D\xB9 |0 \x9D\xB8 |0 - \x9D\x98 |0 \x9D\xBA |0 \x9D\xAE |0 \x8E\x78 |0 @@ -3090,7 +2748,6 @@ CHARMAP \x8C\xCC |0 \x9D\xC1 |0 \x9D\xC4 |0 - \xED\xB1 |3 \xFA\xCD |0 \x95\x71 |0 \x8B\x7E |0 @@ -3163,13 +2820,10 @@ CHARMAP \x9D\xDB |0 \x89\xA0 |0 \x9D\xDF |0 - \xED\xB2 |3 \xFA\xCE |0 - \x8D\x56 |0 \x9D\xDE |0 \x8D\xA9 |0 \x8F\xB8 |0 - \xED\xB5 |3 \xFA\xD1 |0 \x9D\xDD |0 \x8F\xB9 |0 @@ -3177,29 +2831,22 @@ CHARMAP \x8D\xA8 |0 \x88\xD5 |0 \x90\xCC |0 - \xED\xB3 |3 \xFA\xCF |0 \x9D\xE4 |0 - \xED\xB7 |3 \xFA\xD3 |0 \x90\xAF |0 \x89\x66 |0 - \xED\xB8 |3 \xFA\xD4 |0 \x8F\x74 |0 \x96\x86 |0 \x8D\xF0 |0 \x8F\xBA |0 - \xED\xB6 |3 \xFA\xD2 |0 \x90\xA5 |0 - \xED\x47 |3 \xFA\x63 |0 \x9D\xE3 |0 \x9D\xE1 |0 \x9D\xE2 |0 - \xED\xB4 |3 - \xFA\xD0 |0 \x92\x8B |0 \x9E\x45 |0 \x9D\xE8 |0 @@ -3210,16 +2857,13 @@ CHARMAP \x90\x57 |0 \x9D\xE5 |0 \x8E\x4E |0 - \xED\xBA |3 \xFA\xD6 |0 - \xED\xBB |3 \xFA\xD7 |0 \x9D\xEA |0 \x9D\xE9 |0 \x9D\xEE |0 \x9D\xEF |0 \x9D\xEB |0 - \xED\xB9 |3 \xFA\xD5 |0 \x8A\x41 |0 \x9D\xEC |0 @@ -3228,7 +2872,6 @@ CHARMAP \x95\x81 |0 \x8C\x69 |0 \x9D\xF0 |0 - \xED\xBD |3 \xFA\xD9 |0 \x90\xB0 |0 \x8F\xBB |0 @@ -3244,23 +2887,19 @@ CHARMAP \x92\x67 |0 \x88\xC3 |0 \x9D\xF6 |0 - \xED\xBE |3 \xFA\xDA |0 \x9D\xF7 |0 - \xED\xBF |3 \xFA\xDB |0 \x92\xA8 |0 \x97\xEF |0 \x8E\x62 |0 \x95\xE9 |0 - \xED\xC0 |3 \xFA\xDC |0 \x96\x5C |0 \x9E\x41 |0 \x9D\xF9 |0 \x9D\xFC |0 \x9D\xFB |0 - \xED\xC1 |3 \xFA\xDD |0 \x9D\xF8 |0 \x9E\x40 |0 @@ -3282,9 +2921,7 @@ CHARMAP \x9E\x4A |0 \x8F\x91 |0 \x91\x82 |0 - \xED\xC2 |3 \xFA\xDE |0 - \xED\x4A |3 \xFA\x66 |0 \x99\xD6 |0 \x91\x5D |0 @@ -3296,7 +2933,6 @@ CHARMAP \x97\x4C |0 \x95\xFC |0 \x95\x9E |0 - \xED\xC3 |3 \xFA\xDF |0 \x9E\x4B |0 \x8D\xF1 |0 @@ -3342,7 +2978,6 @@ CHARMAP \x9E\x5B |0 \x9E\x5C |0 \x97\x88 |0 - \xED\xC5 |3 \xFA\xE1 |0 \x9E\x61 |0 \x8D\x59 |0 @@ -3379,9 +3014,7 @@ CHARMAP \x9E\x67 |0 \x9E\x6D |0 \x9E\x73 |0 - \xED\xC6 |3 \xFA\xE2 |0 - \xED\xC8 |3 \xFA\xE4 |0 \x91\xC6 |0 \x95\xBF |0 @@ -3411,7 +3044,6 @@ CHARMAP \x8D\xB8 |0 \x96\x8F |0 \x8A\x60 |0 - \xED\xC9 |3 \xFA\xE5 |0 \x92\xCC |0 \x93\xC8 |0 @@ -3436,7 +3068,6 @@ CHARMAP \x8C\x85 |0 \x8C\x6A |0 \x93\x8D |0 - \xED\xCA |3 \xFA\xE6 |0 \x9E\x79 |0 \x88\xC4 |0 @@ -3444,7 +3075,6 @@ CHARMAP \x9E\x7E |0 \x8B\xCB |0 \x8C\x4B |0 - \xED\xC7 |3 \xFA\xE3 |0 \x8A\xBA |0 \x8B\x6A |0 @@ -3453,7 +3083,6 @@ CHARMAP \x96\x91 |0 \x8E\x56 |0 \x9E\x83 |0 - \x95\x4F |0 \x9E\x8F |0 \x89\xB1 |0 \x9E\x84 |0 @@ -3485,16 +3114,13 @@ CHARMAP \x8A\x81 |0 \x9E\x8E |0 \x9E\x92 |0 - \x93\x8E |0 \x8A\xFC |0 \x9E\xB0 |0 - \xED\x48 |3 \xFA\x64 |0 \x96\xC7 |0 \x9E\x97 |0 \x8A\xFB |0 \x9E\x9E |0 - \xED\xCB |3 \xFA\xE7 |0 \x96\x5F |0 \x9E\x9F |0 @@ -3552,7 +3178,6 @@ CHARMAP \x93\xED |0 \x9E\xBE |0 \x93\xE8 |0 - \xED\xCD |3 \xFA\xE9 |0 \x9E\xC2 |0 \x9E\xB5 |0 @@ -3575,7 +3200,6 @@ CHARMAP \x9E\xD2 |0 \x98\x50 |0 \x9E\xD5 |0 - \xED\xCF |3 \xFA\xEB |0 \x90\x59 |0 \x9E\xD4 |0 @@ -3590,7 +3214,6 @@ CHARMAP \x9E\xC6 |0 \x9E\xC7 |0 \x9E\xCF |0 - \xEA\xA0 |0 \x9E\xCC |0 \x8D\x5C |0 \x92\xC6 |0 @@ -3599,10 +3222,8 @@ CHARMAP \x9E\xC5 |0 \x9E\xC8 |0 \x97\x6C |0 - \x96\x8A |0 \x9E\xCD |0 \x9E\xD7 |0 - \xED\xD0 |3 \xFA\xEC |0 \x9E\xDF |0 \x9E\xD8 |0 @@ -3633,7 +3254,6 @@ CHARMAP \x89\xA1 |0 \x8A\x7E |0 \x9E\xD1 |0 - \xED\xD1 |3 \xFA\xED |0 \x8F\xBF |0 \x9E\xEE |0 @@ -3642,7 +3262,6 @@ CHARMAP \x8A\x92 |0 \x92\x4D |0 \x9E\xEB |0 - \xED\xD3 |3 \xFA\xEF |0 \x9E\xF0 |0 \x9E\xF4 |0 @@ -3653,13 +3272,10 @@ CHARMAP \x93\xC9 |0 \x9E\xF1 |0 \x9E\xF3 |0 - \xED\xD2 |3 \xFA\xEE |0 \x9E\xED |0 - \xED\xD4 |3 \xFA\xF0 |0 \x9E\xEF |0 - \xED\xD5 |3 \xFA\xF1 |0 \x8A\x80 |0 \x92\x68 |0 @@ -3668,13 +3284,11 @@ CHARMAP \x8C\xE7 |0 \x9E\xF7 |0 \x9F\x40 |0 - \x9E\x77 |0 \x9E\xF9 |0 \x9E\xFB |0 \x9E\xFC |0 \x9F\x4B |0 \x9F\x47 |0 - \x9E\x8D |0 \x9F\x46 |0 \x9F\x45 |0 \x9F\x42 |0 @@ -3687,9 +3301,7 @@ CHARMAP \x8B\xF9 |0 \x9F\x48 |0 \x9F\x4A |0 - \xED\xD6 |3 \xFA\xF2 |0 - \xED\xD7 |3 \xFA\xF3 |0 \x94\xA5 |0 \x9F\x4D |0 @@ -3773,7 +3385,6 @@ CHARMAP \x93\xC5 |0 \x9F\x79 |0 \x94\xE4 |0 - \xED\xD8 |3 \xFA\xF4 |0 \x94\xF9 |0 \x96\xD1 |0 @@ -3795,7 +3406,6 @@ CHARMAP \x95\x58 |0 \x89\x69 |0 \x94\xC3 |0 - \xED\xD9 |3 \xFA\xF5 |0 \x92\xF3 |0 \x8F\x60 |0 @@ -3805,7 +3415,6 @@ CHARMAP \x9F\x88 |0 \x8A\xBE |0 \x89\x98 |0 - \xED\xDA |3 \xFA\xF6 |0 \x93\xF0 |0 \x9F\x87 |0 @@ -3814,7 +3423,6 @@ CHARMAP \x9F\x89 |0 \x9F\x91 |0 \x9F\x8A |0 - \xED\xDC |3 \xFA\xF8 |0 \x91\xBF |0 \x8B\x82 |0 @@ -3825,7 +3433,6 @@ CHARMAP \x9F\x8E |0 \x9F\x8B |0 \x97\x80 |0 - \xED\xDB |3 \xFA\xF7 |0 \x92\xBE |0 \x93\xD7 |0 @@ -3861,7 +3468,6 @@ CHARMAP \x96\x40 |0 \x9F\x99 |0 \x9F\xA2 |0 - \xED\xDD |3 \xFA\xF9 |0 \x9F\xA0 |0 \x9F\x9B |0 @@ -3875,7 +3481,6 @@ CHARMAP \x91\xD7 |0 \x9F\x96 |0 \x89\x6A |0 - \xED\xDE |3 \xFA\xFA |0 \x97\x6D |0 \x9F\xAE |0 @@ -3910,26 +3515,21 @@ CHARMAP \x98\x51 |0 \x8A\x5C |0 \x95\x82 |0 - \xED\xE0 |3 \xFA\xFC |0 \x97\x81 |0 \x8A\x43 |0 \x90\x5A |0 \x9F\xB3 |0 \x9F\xB8 |0 - \xED\xDF |3 \xFA\xFB |0 \x8F\xC1 |0 \x97\x4F |0 \x9F\xB5 |0 \x9F\xB0 |0 \x9F\xB6 |0 - \xED\xE1 |3 \xFB\x40 |0 \x97\xDC |0 - \x93\x93 |0 \x93\xC0 |0 - \xED\xE2 |3 \xFB\x41 |0 \x8A\x55 |0 \x89\x74 |0 @@ -3942,7 +3542,6 @@ CHARMAP \x9F\xBD |0 \x97\xD2 |0 \x9F\xC3 |0 - \xED\xE3 |3 \xFB\x42 |0 \x8F\x69 |0 \x9F\xC5 |0 @@ -3959,17 +3558,14 @@ CHARMAP \x9F\xC1 |0 \x9F\xCC |0 \x90\x5B |0 - \xED\xE5 |3 \xFB\x44 |0 \x8F\x7E |0 \x95\xA3 |0 \x8D\xAC |0 - \xED\xE4 |3 \xFB\x43 |0 \x9F\xB9 |0 \x9F\xC7 |0 \x93\x59 |0 - \xED\xE6 |3 \xFB\x45 |0 \x90\xB4 |0 \x8A\x89 |0 @@ -3990,7 +3586,6 @@ CHARMAP \x9F\xDD |0 \x88\xAD |0 \x89\x51 |0 - \xED\xE9 |3 \xFB\x48 |0 \x89\xB7 |0 \x9F\xD6 |0 @@ -3999,10 +3594,8 @@ CHARMAP \x9F\xCF |0 \x8D\x60 |0 \x9F\xE0 |0 - \xED\xE7 |3 \xFB\x46 |0 \x9F\xDB |0 - \xED\xEA |3 \xFB\x49 |0 \x9F\xD3 |0 \x9F\xDA |0 @@ -4012,7 +3605,6 @@ CHARMAP \x8C\xCE |0 \x8F\xC3 |0 \x92\x58 |0 - \xED\xE8 |3 \xFB\x47 |0 \x9F\xD2 |0 \x97\x4E |0 @@ -4042,7 +3634,6 @@ CHARMAP \x9F\xE5 |0 \x93\x4D |0 \x9F\xE7 |0 - \xED\xEB |3 \xFB\x4A |0 \x9F\xEF |0 \x9F\xE9 |0 @@ -4084,7 +3675,6 @@ CHARMAP \xE0\x40 |0 \x9F\xF7 |0 \x9F\xF1 |0 - \x8A\xC1 |0 \x94\xAC |1 \x8C\x89 |0 \xE0\x4E |0 @@ -4106,7 +3696,6 @@ CHARMAP \xE0\x4C |0 \x90\x9F |0 \xE0\x43 |0 - \xED\xEC |3 \xFB\x4B |0 \xE0\x4F |0 \xE0\x50 |0 @@ -4117,7 +3706,6 @@ CHARMAP \xE0\x59 |0 \x93\x62 |0 \xE0\x53 |0 - \xED\xED |3 \xFB\x4C |0 \xE0\x57 |0 \x8C\x83 |0 @@ -4132,23 +3720,19 @@ CHARMAP \xE0\x5A |0 \x8D\x8A |0 \x94\x47 |0 - \x9F\xB7 |0 \x97\x94 |0 \xE0\x5C |0 \xE0\x60 |0 \x91\xF3 |0 \xE0\x5F |0 \xE0\x4A |0 - \xED\xEE |3 \xFB\x4D |0 \xE8\x89 |0 \xE0\x64 |0 \xE0\x68 |0 \xE0\x66 |0 - \xED\xEF |3 \xFB\x4E |0 \x93\xC0 |1 - \xED\xF0 |3 \xFB\x4F |0 \xE0\x62 |0 \xE0\x63 |0 @@ -4163,13 +3747,11 @@ CHARMAP \xE0\x6E |0 \x92\x95 |0 \x91\xEB |0 - \xED\xF1 |3 \xFB\x50 |0 \x90\xA3 |0 \xE0\x6F |0 \xE0\x71 |0 \xE0\x70 |0 - \x9F\xF3 |0 \xE0\x72 |0 \x93\xE5 |0 \xE0\x73 |0 @@ -4179,14 +3761,12 @@ CHARMAP \x8B\x84 |0 \x8E\xDC |0 \x8D\xD0 |0 - \xED\xF2 |3 \xFB\x51 |0 \x98\x46 |0 \x90\x86 |0 \x89\x8A |0 \xE0\x75 |0 \xE0\x74 |0 - \xED\xF3 |3 \xFB\x52 |0 \xE0\x78 |0 \x92\x59 |0 @@ -4196,7 +3776,6 @@ CHARMAP \xE0\x79 |0 \x93\x5F |0 \x88\xD7 |0 - \xED\x46 |3 \xFA\x62 |0 \x97\xF3 |0 \xE0\x7D |0 @@ -4207,10 +3786,8 @@ CHARMAP \xE0\x77 |0 \x96\x42 |0 \xE0\x82 |0 - \xED\xF5 |3 \xFB\x54 |0 \xE0\x81 |0 - \xED\xF4 |3 \xFB\x53 |0 \x89\x8B |0 \xE0\x84 |0 @@ -4221,17 +3798,13 @@ CHARMAP \x89\x8B |1 \x91\x52 |0 \x8F\xC4 |0 - \xED\xF7 |3 \xFB\x56 |0 - \xED\xF8 |3 \xFB\x57 |0 \x97\xF9 |0 \xE0\x8A |0 \x90\xF7 |0 - \xE0\x86 |0 \xE0\x8B |0 \x89\x8C |0 - \xED\xF6 |3 \xFB\x55 |0 \xE0\x89 |0 \x94\x81 |0 @@ -4248,14 +3821,12 @@ CHARMAP \xE0\x8D |0 \x97\x6F |0 \xE0\x90 |0 - \xEA\xA4 |0 \x8F\x6E |0 \xE0\x91 |0 \xE0\x92 |0 \x94\x4D |0 \xE0\x94 |0 \xE0\x95 |0 - \xED\xFA |3 \xFB\x59 |0 \x94\x52 |0 \x93\x95 |0 @@ -4278,7 +3849,6 @@ CHARMAP \xE0\x9F |0 \xE0\x8E |0 \xE0\x9E |0 - \xED\xFB |3 \xFB\x5A |0 \xE0\xA0 |0 \x94\x9A |0 @@ -4331,12 +3901,10 @@ CHARMAP \xE0\xB8 |0 \x8C\xA2 |0 \x94\xC6 |0 - \xED\xFC |3 \xFB\x5B |0 \xE0\xBA |0 \x8F\xF3 |0 \xE0\xB9 |0 - \xEE\x40 |3 \xFB\x5C |0 \x8B\xB6 |0 \xE0\xBB |0 @@ -4366,7 +3934,6 @@ CHARMAP \xE0\xC8 |0 \xE0\xCA |0 \x97\xC2 |0 - \xEE\x41 |3 \xFB\x5D |0 \xE0\xCE |0 \xE0\xCD |0 @@ -4390,7 +3957,6 @@ CHARMAP \xE0\xD6 |0 \x8A\x6C |0 \xE0\xD8 |0 - \xEE\x43 |3 \xFB\x5F |0 \xE0\xD7 |0 \xE0\xDA |0 @@ -4404,48 +3970,37 @@ CHARMAP \x97\xE6 |0 \xE0\xDC |0 \xE0\xDE |0 - \xEE\x44 |3 \xFB\x60 |0 \xE0\xDF |0 \x89\xCF |0 \xE0\xDB |0 - \xEE\x45 |3 \xFB\x61 |0 \x8E\x58 |0 \x92\xBF |0 \xE0\xDD |0 - \xEE\x48 |3 \xFB\x64 |0 - \xEE\x46 |3 \xFB\x62 |0 \xE0\xE2 |0 \x8E\xEC |0 - \xEE\x47 |3 \xFB\x63 |0 \xE0\xE0 |0 \x8C\x5D |0 \x94\xC7 |0 \xE0\xE1 |0 \xE0\xFC |0 - \xEE\x4A |3 \xFB\x66 |0 \xE0\xE7 |0 \x8C\xBB |0 \x8B\x85 |0 \xE0\xE4 |0 \x97\x9D |0 - \xEE\x49 |3 \xFB\x65 |0 \x97\xAE |0 \x91\xF4 |0 \xE0\xE6 |0 - \xEE\x4B |3 \xFB\x67 |0 - \xEE\x4D |3 \xFB\x69 |0 - \xEE\x4C |3 \xFB\x68 |0 - \xEE\x4E |3 \xFB\x6A |0 \xE0\xE8 |0 \x97\xD4 |0 @@ -4463,23 +4018,18 @@ CHARMAP \x90\x90 |0 \xE0\xEC |0 \x97\xDA |0 - \xEE\x4F |3 \xFB\x6B |0 \xE0\xF2 |0 - \xEA\xA2 |0 \xE0\xF0 |0 \xE0\xF3 |0 \xE0\xE5 |0 \xE0\xF1 |0 \x8D\xBA |0 - \xE0\xF4 |0 \xE0\xF5 |0 \x97\x9E |0 - \xEE\x50 |3 \xFB\x6C |0 \xE0\xF6 |0 \xE0\xF7 |0 - \xEE\x51 |3 \xFB\x6D |0 \xE0\xE3 |0 \xE0\xF8 |0 @@ -4502,7 +4052,6 @@ CHARMAP \x95\x72 |0 \xE1\x49 |0 \xE1\x48 |0 - \xEE\x52 |3 \xFB\x6E |0 \xE1\x4B |0 \xE1\x4A |0 @@ -4524,7 +4073,6 @@ CHARMAP \x97\x70 |0 \x95\xE1 |0 \xE1\x54 |0 - \xED\x8C |3 \xFA\xA8 |0 \x93\x63 |0 \x97\x52 |0 @@ -4560,7 +4108,6 @@ CHARMAP \x94\xD4 |0 \xE1\x60 |0 \xE1\x61 |0 - \xEE\x53 |3 \xFB\x6F |0 \x88\xD9 |0 \x8F\xF4 |0 @@ -4657,7 +4204,6 @@ CHARMAP \x94\x92 |0 \x95\x53 |0 \xE1\xA3 |0 - \xEE\x54 |3 \xFB\x70 |0 \xE1\xA4 |0 \x93\x49 |0 @@ -4671,13 +4217,9 @@ CHARMAP \xE1\xA8 |0 \xE1\xAA |0 \xE1\xAB |0 - \xEE\x57 |3 \xFB\x73 |0 - \xEE\x55 |3 \xFB\x71 |0 - \xEE\x56 |3 \xFB\x72 |0 - \xEE\x58 |3 \xFB\x74 |0 \x94\xE7 |0 \xE1\xAC |0 @@ -4732,7 +4274,6 @@ CHARMAP \x92\xAD |0 \x8A\xE1 |0 \x92\x85 |0 - \xEE\x5A |3 \xFB\x76 |0 \xE1\xC7 |0 \xE1\xC8 |0 @@ -4784,27 +4325,21 @@ CHARMAP \x8C\xA4 |0 \x8D\xD3 |0 \xE1\xE7 |0 - \xEE\x5C |3 \xFB\x78 |0 \x93\x75 |0 \x8D\xD4 |0 \x8B\x6D |0 \x96\x43 |0 \x94\x6A |0 - \x93\x76 |0 - \x8D\x7B |0 \xE1\xE9 |0 - \xEE\x5D |3 \xFB\x79 |0 \x8F\xC9 |0 - \xEE\x5E |3 \xFB\x7A |0 \x97\xB0 |0 \x8D\x64 |0 \x8C\xA5 |0 \x94\xA1 |0 \xE1\xEB |0 - \xEE\x5F |3 \xFB\x7B |0 \xE1\xED |0 \x8C\xE9 |0 @@ -4848,11 +4383,8 @@ CHARMAP \xE2\x46 |0 \xE2\x45 |0 \xE2\x47 |0 - \xE1\xE6 |0 - \xE1\xE8 |0 \xE2\x49 |0 \xE2\x48 |0 - \xEE\x60 |3 \xFB\x7C |0 \x8E\xA6 |0 \x97\xE7 |0 @@ -4887,9 +4419,7 @@ CHARMAP \x89\xD0 |0 \x92\xF5 |0 \x95\x9F |0 - \xEE\x64 |3 \xFB\x81 |0 - \xEE\x66 |3 \xFB\x83 |0 \xE2\x54 |0 \x8B\x9A |0 @@ -4985,16 +4515,13 @@ CHARMAP \xE2\x80 |0 \x89\x4D |0 \xE2\x83 |0 - \x8A\x96 |0 \xE2\x82 |0 \xE2\x81 |0 \xE2\x85 |0 - \xE2\x7D |0 \xE2\x86 |0 \x97\xA7 |0 \xE2\x87 |0 \xE2\x88 |0 - \xEE\x67 |3 \xFB\x84 |0 \x9A\xF2 |0 \xE2\x8A |0 @@ -5010,10 +4537,8 @@ CHARMAP \x8F\x76 |0 \x93\xB6 |0 \xE2\x90 |0 - \xEE\x68 |3 \xFB\x85 |0 \x92\x47 |0 - \xEE\x6A |3 \xFB\x87 |0 \xE2\x91 |0 \x92\x5B |0 @@ -5081,7 +4606,6 @@ CHARMAP \xE2\xB2 |0 \xE2\xB1 |0 \xE2\xAD |0 - \xEE\x6B |3 \xFB\x88 |0 \xE2\xAF |0 \x8A\xC7 |0 @@ -5105,7 +4629,6 @@ CHARMAP \xE2\xC3 |0 \xE2\xC2 |0 \xE2\xBF |0 - \x98\x55 |0 \xE2\xC8 |0 \xE2\xCC |0 \xE2\xC9 |0 @@ -5139,7 +4662,6 @@ CHARMAP \xE2\xDD |0 \xE2\xDA |0 \xE2\xDB |0 - \xE2\xC4 |0 \xE2\xDC |0 \xE2\xDE |0 \xE2\xDF |0 @@ -5232,7 +4754,6 @@ CHARMAP \x91\x67 |0 \xE3\x44 |0 \xE3\x4A |0 - \xEE\x6D |3 \xFB\x8A |0 \xE3\x45 |0 \x8C\x6F |0 @@ -5241,7 +4762,6 @@ CHARMAP \x8C\x8B |0 \xE3\x4C |0 \xE3\x55 |0 - \xEE\x6E |3 \xFB\x8B |0 \x8D\x69 |0 \x97\x8D |0 @@ -5265,7 +4785,6 @@ CHARMAP \xE3\x58 |0 \x91\x8E |0 \xE3\x65 |0 - \xEE\x70 |3 \xFB\x8D |0 \xE3\x61 |0 \xE3\x5B |0 @@ -5279,7 +4798,6 @@ CHARMAP \x96\xD4 |0 \x92\xD4 |0 \xE3\x5C |0 - \xEE\x6F |3 \xFB\x8C |0 \xE3\x64 |0 \xE3\x59 |0 @@ -5294,7 +4812,6 @@ CHARMAP \x97\xCE |0 \x8F\x8F |0 \xE3\x8E |0 - \xEE\x71 |3 \xFB\x8E |0 \xE3\x67 |0 \x90\xFC |0 @@ -5343,7 +4860,6 @@ CHARMAP \x91\x40 |0 \x8C\x71 |0 \x8F\x4A |0 - \xEE\x72 |3 \xFB\x8F |0 \x90\x44 |0 \x91\x55 |0 @@ -5369,7 +4885,6 @@ CHARMAP \xE3\x8D |0 \xE3\x92 |0 \xE3\x93 |0 - \xED\x40 |3 \xFA\x5C |0 \xE3\x94 |0 \xE3\x9A |0 @@ -5385,7 +4900,6 @@ CHARMAP \xE3\x9D |0 \xE3\x9E |0 \xE3\x9F |0 - \xEE\x73 |3 \xFB\x90 |0 \xE3\xA0 |0 \xE3\xA1 |0 @@ -5422,7 +4936,6 @@ CHARMAP \xE3\xB7 |0 \xE3\xB6 |0 \xE3\xB5 |0 - \xEE\x74 |3 \xFB\x91 |0 \xE3\xB8 |0 \x8C\x51 |0 @@ -5720,7 +5233,6 @@ CHARMAP \xE4\x99 |0 \xE4\x95 |0 \xE4\x98 |0 - \xEE\x76 |3 \xFB\x93 |0 \x96\xCE |0 \xE4\x97 |0 @@ -5753,14 +5265,12 @@ CHARMAP \xE4\xA6 |0 \x8D\x72 |0 \x91\x91 |0 - \xEE\x77 |3 \xFB\x94 |0 \xE4\xB8 |0 \xE4\xB9 |0 \x89\xD7 |0 \x89\xAC |0 \xE4\xB6 |0 - \xEE\x78 |3 \xFB\x95 |0 \xE4\xAC |0 \xE4\xB4 |0 @@ -5782,7 +5292,6 @@ CHARMAP \xE4\xCD |0 \xE4\xC5 |0 \x90\x9B |0 - \xEE\x79 |3 \xFB\x96 |0 \x8B\x65 |0 \x8B\xDB |0 @@ -5800,7 +5309,6 @@ CHARMAP \x95\x48 |0 \xE4\xC9 |0 \xE4\xBD |0 - \xEE\x7A |3 \xFB\x97 |0 \xE4\xC6 |0 \xE4\xD0 |0 @@ -5825,7 +5333,6 @@ CHARMAP \xE4\xD3 |0 \x97\x8E |0 \xE4\xDC |0 - \xEE\x7B |3 \xFB\x98 |0 \x97\x74 |0 \x97\xA8 |0 @@ -5857,7 +5364,6 @@ CHARMAP \xE4\xEE |0 \xE4\xD8 |0 \x8A\x97 |0 - \xEE\x7C |3 \xFB\x99 |0 \x8F\xF6 |0 \xE4\xE3 |0 @@ -5876,7 +5382,6 @@ CHARMAP \xE4\xED |0 \xE4\xE6 |0 \xE4\xE9 |0 - \xED\x44 |3 \xFA\x60 |0 \x96\x48 |0 \x98\x40 |0 @@ -5905,22 +5410,18 @@ CHARMAP \x94\xD7 |0 \xE4\xFC |0 \x8F\xD4 |0 - \x8E\xC7 |0 \xE5\x42 |0 \x8B\xBC |0 - \xEE\x7D |3 \xFB\x9A |0 \xE5\x43 |0 \x95\x99 |0 \xE4\xFB |0 - \xEE\x7E |3 \xFB\x9B |0 \xE4\xD4 |0 \xE4\xFA |0 \x98\x6E |0 \x93\xA0 |0 \x95\x93 |0 - \xEE\x80 |3 \xFB\x9C |0 \xE5\x4A |0 \xE5\x50 |0 @@ -5944,9 +5445,7 @@ CHARMAP \x90\x64 |0 \x8C\x4F |0 \x96\xF2 |0 - \x96\xF7 |0 \x8F\x92 |0 - \xEE\x82 |3 \xFB\x9E |0 \xE5\x56 |0 \xE5\x54 |0 @@ -5961,13 +5460,11 @@ CHARMAP \x93\xA1 |0 \xE5\x5A |0 \x94\xCB |0 - \xE5\x4D |0 \x8F\x93 |0 \xE5\x5C |0 \xE5\x61 |0 \x91\x94 |0 \xE5\x60 |0 - \xE5\x41 |0 \xE5\x62 |0 \x91\x68 |0 \xE5\x5D |0 @@ -6014,7 +5511,6 @@ CHARMAP \xE5\x78 |0 \x92\x60 |0 \x8C\x75 |0 - \x8A\x61 |0 \xE5\x7B |0 \x8A\x5E |0 \xE5\x81 |0 @@ -6067,7 +5563,6 @@ CHARMAP \xE5\x9A |0 \x92\xB1 |0 \xE5\x97 |0 - \x94\x88 |0 \xE5\xA5 |0 \x97\x5A |0 \xE5\xA4 |0 @@ -6094,8 +5589,6 @@ CHARMAP \x8A\x49 |0 \x8B\x61 |0 \xE5\xB7 |0 - \xE5\xA2 |0 - \xEE\x85 |3 \xFB\xA1 |0 \xE5\xB6 |0 \xE5\xBA |0 @@ -6106,7 +5599,6 @@ CHARMAP \x98\x58 |1 \xE5\xC0 |0 \xE5\xBF |0 - \xE5\x79 |0 \xE5\xC4 |0 \xE5\xC1 |0 \xE5\xC2 |0 @@ -6175,7 +5667,6 @@ CHARMAP \xE5\xEA |0 \x8F\xD6 |0 \xE5\xE8 |0 - \xEE\x86 |3 \xFB\xA2 |0 \x97\x87 |0 \xE5\xE5 |0 @@ -6190,7 +5681,6 @@ CHARMAP \x8A\x8C |0 \x96\x4A |0 \xE5\xEE |0 - \xED\x41 |3 \xFA\x5D |0 \xE5\xFA |0 \xE5\xF0 |0 @@ -6262,7 +5752,6 @@ CHARMAP \xE6\x60 |0 \x93\xA2 |0 \xE6\x5F |0 - \xEE\x87 |3 \xFB\xA3 |0 \x8C\x50 |0 \xE6\x5E |0 @@ -6279,7 +5768,6 @@ CHARMAP \x96\xF3 |0 \x91\x69 |0 \xE6\x64 |0 - \xEE\x88 |3 \xFB\xA4 |0 \x90\x66 |0 \x92\x90 |0 @@ -6307,7 +5795,6 @@ CHARMAP \x98\x62 |0 \x8A\x59 |0 \x8F\xDA |0 - \xEE\x89 |3 \xFB\xA5 |0 \xE6\x6A |0 \xE6\x6F |0 @@ -6329,7 +5816,6 @@ CHARMAP \x8C\xEB |0 \xE6\x74 |0 \xE6\x75 |0 - \xEE\x8A |3 \xFB\xA6 |0 \xE6\x71 |0 \x90\xE0 |0 @@ -6338,14 +5824,12 @@ CHARMAP \x89\xDB |0 \x94\xEE |0 \x8B\x62 |0 - \xEE\x8B |3 \xFB\xA7 |0 \x92\xB2 |0 \xE6\x7A |0 \xE6\x78 |0 \x92\x6B |0 \x90\xBF |0 - \x8A\xD0 |0 \xE6\x79 |0 \x90\x7A |0 \x97\xC8 |0 @@ -6354,7 +5838,6 @@ CHARMAP \xE6\x87 |0 \x92\xB3 |0 \xE6\x86 |0 - \xEE\x8C |3 \xFB\xA8 |0 \xE6\x83 |0 \xE6\x8B |0 @@ -6362,12 +5845,10 @@ CHARMAP \xE6\x80 |0 \x92\xFA |0 \xE6\x7E |0 - \xE6\x7C |0 \x97\x40 |0 \x8E\x90 |0 \xE6\x81 |0 \xE6\x7D |0 - \xEE\x8E |3 \xFB\xAA |0 \xE6\x85 |0 \x8F\x94 |0 @@ -6402,7 +5883,6 @@ CHARMAP \xE6\x97 |0 \xE6\x99 |0 \xE6\x98 |0 - \xEE\x8F |3 \xFB\xAB |0 \xE6\x9B |0 \x8E\xAF |0 @@ -6420,7 +5900,6 @@ CHARMAP \xE6\xA2 |0 \x8C\xEC |0 \xE6\xA3 |0 - \xEE\x90 |3 \xFB\xAC |0 \xE6\xA4 |0 \x8E\x5D |0 @@ -6497,7 +5976,6 @@ CHARMAP \xE6\xC9 |0 \x91\xAF |0 \xE6\xDA |0 - \x91\x47 |0 \x93\xF6 |0 \x95\x6F |0 \xE6\xCD |0 @@ -6507,13 +5985,10 @@ CHARMAP \x94\x85 |0 \x8C\xAB |0 \xE6\xCC |0 - \xE6\xCB |0 \x95\x8A |0 \x8E\xBF |0 \x93\x71 |0 - \xEE\x91 |3 \xFB\xAD |0 - \xEE\x92 |3 \xFB\xAE |0 \xE6\xCF |0 \xE6\xD0 |0 @@ -6528,7 +6003,6 @@ CHARMAP \xE6\xD6 |0 \xE6\xD5 |0 \xE6\xD7 |0 - \xEE\x93 |3 \xFB\xAF |0 \xE6\xD9 |0 \xE6\xDB |0 @@ -6542,7 +6016,6 @@ CHARMAP \xE6\xDF |0 \xE6\xE0 |0 \x95\x8B |0 - \xEE\x94 |3 \xFB\xB0 |0 \x8B\x4E |0 \xE6\xE1 |0 @@ -6630,7 +6103,6 @@ CHARMAP \xE7\x61 |0 \x8B\x4F |0 \x8C\x52 |0 - \xEE\x96 |3 \xFB\xB2 |0 \x8C\xAC |0 \xE7\x62 |0 @@ -6710,7 +6182,6 @@ CHARMAP \xE7\x8B |0 \xE7\x8A |0 \x89\xDE |0 - \x93\xF4 |0 \xE7\x8C |0 \x94\x97 |0 \x93\x52 |0 @@ -6775,14 +6246,11 @@ CHARMAP \x88\xE1 |0 \xE7\xA6 |0 \xE7\xA7 |0 - \xEA\xA1 |0 \x91\xBB |0 \xE7\xA8 |0 \x89\x93 |0 \x91\x6B |0 \x8C\xAD |0 - \x97\x79 |0 - \xEE\x99 |3 \xFB\xB5 |0 \xE7\xA9 |0 \x93\x4B |0 @@ -6803,7 +6271,6 @@ CHARMAP \xE7\xAE |0 \xE2\x84 |0 \x8A\xD2 |0 - \xE7\x8E |0 \xE7\xB3 |0 \xE7\xB2 |0 \xE7\xB4 |0 @@ -6820,7 +6287,6 @@ CHARMAP \x8D\x78 |0 \x98\x59 |0 \xE7\xBC |0 - \xEE\x9A |3 \xFB\xB6 |0 \x8C\x53 |0 \xE7\xB9 |0 @@ -6832,10 +6298,8 @@ CHARMAP \x93\x73 |0 \xE7\xBD |0 \xE7\xBE |0 - \xEE\x9C |3 \xFB\xB8 |0 \xE7\xBF |0 - \xEE\x9D |3 \xFB\xB9 |0 \x93\x41 |0 \xE7\xC1 |0 @@ -6895,40 +6359,30 @@ CHARMAP \xE7\xD8 |0 \x8B\xE0 |0 \xE7\xD9 |0 - \xEE\x9F |3 \xFB\xBB |0 \x93\x42 |0 - \xEE\x9E |3 \xFB\xBA |0 \xE7\xDC |0 \x8A\x98 |0 \x90\x6A |0 - \xEE\xA0 |3 \xFB\xBC |0 \xE7\xDA |0 \xE7\xDB |0 \x92\xDE |0 - \xEE\xA3 |3 \xFB\xBF |0 - \xEE\xA4 |3 \xFB\xC0 |0 \x96\x74 |0 \x8B\xFA |0 - \xEE\xA1 |3 \xFB\xBD |0 - \xEE\xA2 |3 \xFB\xBE |0 \xE7\xDE |0 \xE7\xDF |0 \xE7\xDD |0 \xE7\xE1 |0 - \xEE\xA5 |3 \xFB\xC1 |0 - \xEE\xA7 |3 \xFB\xC3 |0 \x93\xDD |0 \x8A\x62 |0 - \xEE\xA6 |3 \xFB\xC2 |0 \xE7\xE5 |0 \xE7\xE2 |0 @@ -6938,27 +6392,20 @@ CHARMAP \xE7\xE3 |0 \x97\xE9 |0 \x8C\xD8 |0 - \xEE\xAE |3 \xFB\xCA |0 - \xEE\xA8 |3 \xFB\xC4 |0 - \xEE\xAA |3 \xFB\xC6 |0 \xE7\xED |0 - \xEE\xA9 |3 \xFB\xC5 |0 \x93\x53 |0 \xE7\xE8 |0 \xE7\xEB |0 \xE7\xE9 |0 \xE7\xEE |0 - \xEE\xAB |3 \xFB\xC7 |0 \xE7\xEF |0 - \xEE\xAD |3 \xFB\xC9 |0 \xE7\xE7 |0 - \xEE\xAC |3 \xFB\xC8 |0 \xE7\xF4 |0 \x89\x94 |0 @@ -6966,18 +6413,14 @@ CHARMAP \x94\xAB |0 \xE7\xEA |0 \x8F\xDE |0 - \xEE\xAF |3 \xFB\xCB |0 \x8D\x7A |0 - \xEE\xB1 |3 \xFB\xCD |0 - \xEE\xB2 |3 \xFB\xCE |0 \x96\x67 |0 \x8B\xE2 |0 \x8F\x65 |0 \x93\xBA |0 - \xED\x43 |3 \xFA\x5F |0 \x91\x4C |0 \xE7\xF2 |0 @@ -6987,27 +6430,19 @@ CHARMAP \x92\xB6 |0 \xE7\xF3 |0 \xE7\xF0 |0 - \xEE\xB0 |3 \xFB\xCC |0 \x91\x4B |0 \xE7\xF7 |0 \xE7\xF6 |0 \xE7\xF5 |0 - \xEE\xB6 |3 \xFB\xD2 |0 \x96\x4E |0 - \xEE\xBA |3 \xFB\xD6 |0 - \xEE\xB8 |3 \xFB\xD4 |0 - \xEE\xB4 |3 \xFB\xD0 |0 - \xEE\xB5 |3 \xFB\xD1 |0 - \xEE\xB9 |3 \xFB\xD5 |0 \x8F\x9B |0 - \xEE\xB3 |3 \xFB\xCF |0 \xE7\xF8 |0 \x95\xDD |0 @@ -7015,15 +6450,11 @@ CHARMAP \x95\x65 |0 \x92\x92 |0 \x8B\x98 |0 - \xED\x49 |3 \xFA\x65 |0 \xE7\xFA |0 - \xEE\xBD |3 \xFB\xD9 |0 \x8D\x7C |0 - \xEE\xC0 |3 \xFB\xDC |0 - \xEE\xC2 |3 \xFB\xDE |0 \x8E\x4B |0 \xE7\xF9 |0 @@ -7031,16 +6462,12 @@ CHARMAP \x90\x8E |0 \xE8\x40 |0 \xE8\x42 |0 - \xEE\xC1 |3 \xFB\xDD |0 - \xEE\xBF |3 \xFB\xDB |0 \x8F\xF9 |0 - \xEE\xBC |3 \xFB\xD8 |0 \xE8\x41 |0 \xE8\x43 |0 - \xEE\xBB |3 \xFB\xD7 |0 \x8B\xD1 |0 \x95\x64 |0 @@ -7053,20 +6480,17 @@ CHARMAP \xE8\x44 |0 \xE8\x46 |0 \xE7\xFB |0 - \xED\x42 |3 \xFA\x5E |0 \x93\xE7 |0 \x93\x74 |0 \x92\xD5 |0 \xE8\x4B |0 - \xEE\xC4 |3 \xFB\xE0 |0 \x92\x62 |0 \xE8\x47 |0 \xE8\x48 |0 \x8C\x4C |0 \xE8\x4A |0 - \xEE\xC3 |3 \xFB\xDF |0 \x8C\xAE |0 \xE8\x49 |0 @@ -7076,7 +6500,6 @@ CHARMAP \x8D\xBD |0 \x91\x99 |0 \x92\xC8 |0 - \xEE\xC5 |3 \xFB\xE1 |0 \x8A\x5A |0 \xE8\x4D |0 @@ -7085,7 +6508,6 @@ CHARMAP \xE8\x4C |0 \xE8\x50 |0 \xE8\x56 |0 - \xEE\xC6 |3 \xFB\xE2 |0 \xE8\x59 |0 \xE8\x58 |0 @@ -7094,13 +6516,11 @@ CHARMAP \xE8\x52 |0 \xE8\x55 |0 \xE8\x57 |0 - \xEE\xC7 |3 \xFB\xE3 |0 \x8B\xBE |0 \xE8\x5A |0 \xE8\x54 |0 \xE8\x53 |0 - \xEE\xC8 |3 \xFB\xE4 |0 \xE8\x5E |0 \xE8\x5F |0 @@ -7112,7 +6532,6 @@ CHARMAP \xE8\x5B |0 \xE8\x64 |0 \xE8\x62 |0 - \xEE\xC9 |3 \xFB\xE5 |0 \xE8\x63 |0 \xE8\x61 |0 @@ -7120,9 +6539,7 @@ CHARMAP \xE8\x65 |0 \xE8\x66 |0 \xE8\x68 |0 - \xEE\xCA |3 \xFB\xE6 |0 - \xEE\xCB |3 \xFB\xE7 |0 \x8A\xD3 |0 \xE8\x67 |0 @@ -7151,7 +6568,6 @@ CHARMAP \x8A\x4A |0 \x89\x5B |0 \x8A\xD5 |0 - \xEE\xCC |3 \xFB\xE8 |0 \x8A\xD4 |0 \xE8\x7B |0 @@ -7237,14 +6653,12 @@ CHARMAP \x8C\x84 |0 \x8D\xDB |0 \x8F\xE1 |0 - \xEE\xCF |3 \xFB\xEB |0 \x89\x42 |0 \x97\xD7 |0 \xE8\xA9 |0 \xE7\xAC |0 \xE8\xA8 |0 - \xEE\xD0 |3 \xFB\xEC |0 \xE8\xAC |0 \xE8\xAA |0 @@ -7304,29 +6718,22 @@ CHARMAP \xE8\xC4 |0 \xE8\xC5 |0 \x98\x49 |0 - \xEE\xD1 |3 \xFB\xED |0 \x9E\x50 |0 \xE8\xC6 |0 - \xEE\xD2 |3 \xFB\xEE |0 \xE8\xC7 |0 \xE8\xC8 |0 \xE8\xCC |0 - \xEE\xD3 |3 \xFB\xEF |0 \xE8\xC9 |0 \xE8\xCA |0 \xE8\xCB |0 \xE8\xCD |0 - \xEE\xD4 |3 \xFB\xF0 |0 - \xEE\xD5 |3 \xFB\xF1 |0 - \xEE\xD6 |3 \xFB\xF2 |0 \x90\xC2 |0 - \xEE\xD7 |3 \xFB\xF3 |0 \x96\xF5 |0 \x90\xC3 |0 @@ -7340,8 +6747,6 @@ CHARMAP \xE8\xD2 |0 \x8A\x76 |0 \xE8\xD4 |0 - \x90\x78 |0 - \xE8\xD5 |0 \x8C\x43 |0 \xE8\xD6 |0 \xE8\xDA |0 @@ -7392,7 +6797,6 @@ CHARMAP \x93\xDA |0 \x90\x9C |0 \x97\xCC |0 - \x8C\x7A |0 \xE8\xF4 |0 \xE8\xF3 |0 \x96\x6A |0 @@ -7400,7 +6804,6 @@ CHARMAP \x96\x6A |1 \x89\x6F |0 \xE8\xF5 |0 - \xE8\xF2 |0 \xE8\xF6 |1 \x95\x70 |0 \x97\x8A |0 @@ -7413,13 +6816,11 @@ CHARMAP \xE8\xF8 |0 \x8A\xE7 |0 \x8C\xB0 |0 - \xEE\xD8 |3 \xFB\xF4 |0 \x8A\xE8 |0 \x93\x5E |1 \x93\x5E |0 \x97\xDE |0 - \xEE\xD9 |3 \xFB\xF5 |0 \x8C\xDA |0 \xE8\xFA |0 @@ -7465,7 +6866,6 @@ CHARMAP \xE9\x55 |0 \xE9\x51 |0 \xE9\x54 |0 - \xEE\xDC |3 \xFB\xF8 |0 \x8A\xD9 |0 \xE9\x56 |0 @@ -7486,7 +6886,6 @@ CHARMAP \xE9\x63 |0 \xE9\x64 |0 \x8D\x81 |0 - \xEE\xDE |3 \xFB\xFA |0 \xE9\x65 |0 \x8A\x5D |0 @@ -7534,7 +6933,6 @@ CHARMAP \xE9\x7E |0 \xE9\x7B |0 \xE9\x82 |0 - \xEE\xDF |3 \xFB\xFB |0 \x91\xCB |1 \xE9\x81 |0 @@ -7560,9 +6958,7 @@ CHARMAP \xE9\x92 |0 \xE9\x93 |0 \x8D\x82 |0 - \xEE\xE0 |3 \xFB\xFC |0 - \xEE\xE1 |3 \xFC\x40 |0 \xE9\x94 |0 \xE9\x95 |0 @@ -7608,14 +7004,11 @@ CHARMAP \xE9\xB4 |0 \x8B\x9B |0 \x98\x44 |0 - \xEE\xE3 |3 \xFC\x42 |0 \xE9\xB5 |0 - \xEE\xE2 |3 \xFC\x41 |0 \xE9\xB7 |0 \x88\xBC |0 - \xEE\xE4 |3 \xFC\x43 |0 \xE9\xB8 |0 \x95\xA9 |0 @@ -7629,11 +7022,9 @@ CHARMAP \x8E\x4C |0 \x8D\xF8 |0 \x91\x4E |0 - \xEE\xE5 |3 \xFC\x44 |0 \xE9\xBE |0 \xE9\xC1 |0 - \xEE\xE6 |3 \xFC\x45 |0 \xE9\xBF |0 \xE9\xC2 |0 @@ -7653,8 +7044,6 @@ CHARMAP \xE9\xCE |0 \xE9\xCD |0 \xE9\xCC |0 - \x88\xB1 |0 - \xEE\xE7 |3 \xFC\x46 |0 \xE9\xD8 |0 \xE9\xD4 |0 @@ -7678,7 +7067,6 @@ CHARMAP \xE9\xDE |0 \xE9\xE0 |0 \x8A\x8F |0 - \xE9\xCB |0 \x89\x56 |0 \xE9\xE2 |0 \xE9\xE1 |0 @@ -7715,7 +7103,6 @@ CHARMAP \x8A\x9B |0 \xE9\xF0 |0 \x8E\xB0 |0 - \x89\xA7 |0 \x8D\x83 |0 \xE9\xFA |0 \xE9\xF9 |0 @@ -7732,11 +7119,9 @@ CHARMAP \x8D\x94 |0 \x96\xB7 |0 \xEA\x42 |0 - \xEE\xE9 |3 \xFC\x48 |0 \x96\x51 |0 \xEA\x4A |0 - \xEE\xE8 |3 \xFC\x47 |0 \xEA\x46 |0 \xEA\x4B |0 @@ -7747,7 +7132,6 @@ CHARMAP \xEA\x4D |0 \xEA\x4E |0 \xEA\x49 |0 - \xE9\xF2 |0 \xEA\x4F |0 \x92\xDF |0 \xEA\x53 |0 @@ -7769,7 +7153,6 @@ CHARMAP \x91\xE9 |0 \x8D\xEB |0 \xEA\x5E |0 - \xEE\xEB |3 \xFC\x4A |0 \xEA\x5F |0 \xEA\x60 |0 @@ -7811,7 +7194,6 @@ CHARMAP \xEA\x74 |0 \xEA\x75 |0 \xEA\x76 |0 - \xEE\xEC |3 \xFC\x4B |0 \x8D\x95 |0 \xEA\x77 |0 @@ -9745,90 +9127,52 @@ CHARMAP \xF9\xFA |0 \xF9\xFB |0 \xF9\xFC |0 - \xFA\x59 |1 - \xED\xC4 |3 \xFA\xE0 |0 - \xEE\xCD |3 \xFB\xE9 |0 - \xED\x73 |3 \xFA\x90 |0 - \xED\x7E |3 \xFA\x9B |0 - \xED\x80 |3 \xFA\x9C |0 - \xED\x95 |3 \xFA\xB1 |0 - \xED\xBC |3 \xFA\xD8 |0 - \xED\xCC |3 \xFA\xE8 |0 - \xED\xCE |3 \xFA\xEA |0 - \xED\xF9 |3 \xFB\x58 |0 - \xEE\x42 |3 \xFB\x5E |0 - \xEE\x59 |3 \xFB\x75 |0 - \xEE\x61 |3 \xFB\x7D |0 - \xEE\x62 |3 \xFB\x7E |0 - \xEE\x63 |3 \xFB\x80 |0 - \xEE\x65 |3 \xFB\x82 |0 - \xEE\x69 |3 \xFB\x86 |0 - \xEE\x6C |3 \xFB\x89 |0 - \xEE\x75 |3 \xFB\x92 |0 - \xEE\x81 |3 \xFB\x9D |0 - \xEE\x83 |3 \xFB\x9F |0 - \xEE\x84 |3 \xFB\xA0 |0 - \xEE\x8D |3 \xFB\xA9 |0 - \xEE\x95 |3 \xFB\xB1 |0 - \xEE\x97 |3 \xFB\xB3 |0 - \xEE\x98 |3 \xFB\xB4 |0 - \xEE\x9B |3 \xFB\xB7 |0 - \xEE\xB7 |3 \xFB\xD3 |0 - \xEE\xBE |3 \xFB\xDA |0 - \xEE\xCE |3 \xFB\xEA |0 - \xEE\xDA |3 \xFB\xF6 |0 - \xEE\xDB |3 \xFB\xF7 |0 - \xEE\xDD |3 \xFB\xF9 |0 - \xEE\xEA |3 \xFC\x49 |0 \x81\x49 |0 - \xEE\xFC |3 \xFA\x57 |0 \x81\x94 |0 \x81\x90 |0 \x81\x93 |0 \x81\x95 |0 - \xEE\xFB |3 \xFA\x56 |0 \x81\x69 |0 \x81\x6A |0 \x81\x96 |0 \x81\x7B |0 \x81\x43 |0 - \x81\x7C |0 \x81\x44 |0 \x81\x5E |0 \x82\x4F |0 @@ -9909,7 +9253,6 @@ CHARMAP \x81\x6F |0 \x81\x62 |0 \x81\x70 |0 - \x81\x60 |0 \xA1 |0 \xA2 |0 \xA3 |0 @@ -9975,11 +9318,554 @@ CHARMAP \xDF |0 \x81\x91 |0 \x81\x92 |0 - \x81\xCA |0 - \xEE\xF9 |3 - \xFA\x54 |3 \x81\x50 |0 - \xEE\xFA |3 - \xFA\x55 |0 \x81\x8F |0 END CHARMAP + +CHARMAP + \x5C |0 + \x7E |0 + \x5C |1 + \xFA\x55 |1 + \x81\x5C |1 + \x81\x5C |0 + \x81\x61 |1 + \x7E |1 + \x87\x82 |0 + \xFA\x59 |3 + \x87\x84 |0 + \xFA\x5A |3 + \x87\x54 |0 + \xFA\x4A |3 + \x87\x55 |0 + \xFA\x4B |3 + \x87\x56 |0 + \xFA\x4C |3 + \x87\x57 |0 + \xFA\x4D |3 + \x87\x58 |0 + \xFA\x4E |3 + \x87\x59 |0 + \xFA\x4F |3 + \x87\x5A |0 + \xFA\x50 |3 + \x87\x5B |0 + \xFA\x51 |3 + \x87\x5C |0 + \xFA\x52 |3 + \x87\x5D |0 + \xFA\x53 |3 + \xEE\xEF |3 + \xEE\xF0 |3 + \xEE\xF1 |3 + \xEE\xF2 |3 + \xEE\xF3 |3 + \xEE\xF4 |3 + \xEE\xF5 |3 + \xEE\xF6 |3 + \xEE\xF7 |3 + \xEE\xF8 |3 + \x87\x94 |0 + \x81\x7C |1 + \x87\x95 |3 + \x87\x98 |0 + \x87\x97 |3 + \x81\x61 |0 + \x87\x9B |3 + \x87\x9C |3 + \x87\x92 |3 + \x87\x93 |0 + \x81\xE6 |0 + \x87\x9A |3 + \xFA\x5B |3 + \x87\x90 |3 + \x87\x91 |3 + \x87\x96 |3 + \x87\x99 |0 + \x87\x40 |0 + \x87\x41 |0 + \x87\x42 |0 + \x87\x43 |0 + \x87\x44 |0 + \x87\x45 |0 + \x87\x46 |0 + \x87\x47 |0 + \x87\x48 |0 + \x87\x49 |0 + \x87\x4A |0 + \x87\x4B |0 + \x87\x4C |0 + \x87\x4D |0 + \x87\x4E |0 + \x87\x4F |0 + \x87\x50 |0 + \x87\x51 |0 + \x87\x52 |0 + \x87\x53 |0 + \x81\x60 |1 + \x87\x80 |0 + \x87\x81 |0 + \x87\x8A |0 + \xFA\x58 |3 + \x87\x8B |0 + \x87\x8C |0 + \x87\x85 |0 + \x87\x86 |0 + \x87\x87 |0 + \x87\x88 |0 + \x87\x89 |0 + \x87\x65 |0 + \x87\x69 |0 + \x87\x60 |0 + \x87\x63 |0 + \x87\x61 |0 + \x87\x6B |0 + \x87\x6A |0 + \x87\x64 |0 + \x87\x6C |0 + \x87\x66 |0 + \x87\x6E |0 + \x87\x5F |0 + \x87\x6D |0 + \x87\x62 |0 + \x87\x67 |0 + \x87\x68 |0 + \x87\x7E |0 + \x87\x8F |0 + \x87\x8E |0 + \x87\x8D |0 + \x87\x72 |0 + \x87\x73 |0 + \x87\x6F |0 + \x87\x70 |0 + \x87\x71 |0 + \x87\x75 |0 + \x87\x74 |0 + \x87\x83 |0 + \xED\x4C |3 + \xED\x4D |3 + \xED\x4E |3 + \xED\x4F |3 + \xED\x50 |3 + \xED\x51 |3 + \xED\x52 |3 + \xED\x54 |3 + \xED\x53 |3 + \xED\x56 |3 + \xED\x55 |3 + \x96\x99 |0 + \xED\x45 |3 + \xED\x57 |3 + \xED\x5A |3 + \xED\x5B |3 + \xED\x59 |3 + \xED\x58 |3 + \xED\x5E |3 + \xED\x5C |3 + \xED\x5D |3 + \xED\x5F |3 + \xED\x61 |3 + \xED\x60 |3 + \x98\xD4 |0 + \xED\x62 |3 + \xED\x63 |3 + \xED\x64 |3 + \xED\x65 |3 + \xED\x66 |3 + \xED\x67 |3 + \xED\x68 |3 + \xED\x69 |3 + \xEE\x5B |3 + \xED\x6A |3 + \xED\x6B |3 + \xED\x6C |3 + \xED\x6D |3 + \xED\x6E |3 + \xED\x6F |3 + \xED\x70 |3 + \xED\x71 |3 + \xED\x72 |3 + \xED\x75 |3 + \xED\x74 |3 + \xED\x76 |3 + \xED\x77 |3 + \xED\x78 |3 + \xED\x79 |3 + \xED\x7A |3 + \xED\x7B |3 + \xED\x7D |3 + \xED\x7C |3 + \xEA\x9F |0 + \xED\x81 |3 + \xED\x82 |3 + \x92\xD9 |0 + \x9A\xE2 |0 + \xED\x83 |3 + \xED\x84 |3 + \xED\x85 |3 + \xED\x86 |3 + \xED\x87 |3 + \xED\x88 |3 + \xED\x89 |3 + \xED\x8A |3 + \xED\x8B |3 + \xED\x8D |3 + \xED\x8E |3 + \xED\x8F |3 + \x8B\xC4 |0 + \xED\x90 |3 + \xED\x91 |3 + \xED\x92 |3 + \xED\x93 |3 + \xED\x96 |3 + \xED\x94 |3 + \xED\x97 |3 + \xED\x98 |3 + \xED\x99 |3 + \xED\x9A |3 + \xED\x9B |3 + \xED\x9C |3 + \xED\x4B |3 + \xED\x9D |3 + \xED\x9E |3 + \xED\x9F |3 + \xED\xA0 |3 + \xED\xA1 |3 + \xED\xA2 |3 + \xED\xA4 |3 + \xED\xA3 |3 + \xED\xA6 |3 + \xED\xA7 |3 + \xED\xA5 |3 + \xED\xA9 |3 + \xED\xA8 |3 + \xED\xAA |3 + \xED\xAB |3 + \xED\xAC |3 + \xED\xAD |3 + \xED\xAE |3 + \xED\xAF |3 + \x8A\x68 |0 + \xED\xB0 |3 + \x9D\x98 |0 + \xED\xB1 |3 + \xED\xB2 |3 + \x8D\x56 |0 + \xED\xB5 |3 + \xED\xB3 |3 + \xED\xB7 |3 + \xED\xB8 |3 + \xED\xB6 |3 + \xED\x47 |3 + \xED\xB4 |3 + \xFA\xD0 |0 + \xED\xBA |3 + \xED\xBB |3 + \xED\xB9 |3 + \xED\xBD |3 + \xED\xBE |3 + \xED\xBF |3 + \xED\xC0 |3 + \xED\xC1 |3 + \xED\xC2 |3 + \xED\x4A |3 + \xED\xC3 |3 + \xED\xC5 |3 + \xED\xC6 |3 + \xED\xC8 |3 + \xED\xC9 |3 + \xED\xCA |3 + \xED\xC7 |3 + \x95\x4F |0 + \x93\x8E |0 + \xED\x48 |3 + \xED\xCB |3 + \xED\xCD |3 + \xED\xCF |3 + \xEA\xA0 |0 + \x96\x8A |0 + \xED\xD0 |3 + \xED\xD1 |3 + \xED\xD3 |3 + \xED\xD2 |3 + \xED\xD4 |3 + \xED\xD5 |3 + \x9E\x77 |0 + \x9E\x8D |0 + \xED\xD6 |3 + \xED\xD7 |3 + \xED\xD8 |3 + \xED\xD9 |3 + \xED\xDA |3 + \xED\xDC |3 + \xED\xDB |3 + \xED\xDD |3 + \xED\xDE |3 + \xED\xE0 |3 + \xED\xDF |3 + \xED\xE1 |3 + \x93\x93 |0 + \xED\xE2 |3 + \xED\xE3 |3 + \xED\xE5 |3 + \xED\xE4 |3 + \xED\xE6 |3 + \xED\xE9 |3 + \xED\xE7 |3 + \xED\xEA |3 + \xED\xE8 |3 + \xED\xEB |3 + \x8A\xC1 |0 + \xED\xEC |3 + \xED\xED |3 + \x9F\xB7 |0 + \xED\xEE |3 + \xED\xEF |3 + \xED\xF0 |3 + \xED\xF1 |3 + \x9F\xF3 |0 + \xED\xF2 |3 + \xED\xF3 |3 + \xED\x46 |3 + \xED\xF5 |3 + \xED\xF4 |3 + \xED\xF7 |3 + \xED\xF8 |3 + \xE0\x86 |0 + \xED\xF6 |3 + \xEA\xA4 |0 + \xED\xFA |3 + \xED\xFB |3 + \xED\xFC |3 + \xEE\x40 |3 + \xEE\x41 |3 + \xEE\x43 |3 + \xEE\x44 |3 + \xEE\x45 |3 + \xEE\x48 |3 + \xEE\x46 |3 + \xEE\x47 |3 + \xEE\x4A |3 + \xEE\x49 |3 + \xEE\x4B |3 + \xEE\x4D |3 + \xEE\x4C |3 + \xEE\x4E |3 + \xEE\x4F |3 + \xEA\xA2 |0 + \xE0\xF4 |0 + \xEE\x50 |3 + \xEE\x51 |3 + \xEE\x52 |3 + \xED\x8C |3 + \xEE\x53 |3 + \xEE\x54 |3 + \xEE\x57 |3 + \xEE\x55 |3 + \xEE\x56 |3 + \xEE\x58 |3 + \xEE\x5A |3 + \xEE\x5C |3 + \x93\x76 |0 + \x8D\x7B |0 + \xEE\x5D |3 + \xEE\x5E |3 + \xEE\x5F |3 + \xE1\xE6 |0 + \xE1\xE8 |0 + \xEE\x60 |3 + \xEE\x64 |3 + \xEE\x66 |3 + \x8A\x96 |0 + \xE2\x7D |0 + \xEE\x67 |3 + \xEE\x68 |3 + \xEE\x6A |3 + \xEE\x6B |3 + \x98\x55 |0 + \xE2\xC4 |0 + \xEE\x6D |3 + \xEE\x6E |3 + \xEE\x70 |3 + \xEE\x6F |3 + \xEE\x71 |3 + \xEE\x72 |3 + \xED\x40 |3 + \xEE\x73 |3 + \xEE\x74 |3 + \xEE\x76 |3 + \xEE\x77 |3 + \xEE\x78 |3 + \xEE\x79 |3 + \xEE\x7A |3 + \xEE\x7B |3 + \xEE\x7C |3 + \xED\x44 |3 + \x8E\xC7 |0 + \xEE\x7D |3 + \xEE\x7E |3 + \xEE\x80 |3 + \x96\xF7 |0 + \xEE\x82 |3 + \xE5\x4D |0 + \xE5\x41 |0 + \x8A\x61 |0 + \x94\x88 |0 + \xE5\xA2 |0 + \xEE\x85 |3 + \xE5\x79 |0 + \xEE\x86 |3 + \xED\x41 |3 + \xEE\x87 |3 + \xEE\x88 |3 + \xEE\x89 |3 + \xEE\x8A |3 + \xEE\x8B |3 + \x8A\xD0 |0 + \xEE\x8C |3 + \xE6\x7C |0 + \xEE\x8E |3 + \xEE\x8F |3 + \xEE\x90 |3 + \x91\x47 |0 + \xE6\xCB |0 + \xEE\x91 |3 + \xEE\x92 |3 + \xEE\x93 |3 + \xEE\x94 |3 + \xEE\x96 |3 + \x93\xF4 |0 + \xEA\xA1 |0 + \x97\x79 |0 + \xEE\x99 |3 + \xE7\x8E |0 + \xEE\x9A |3 + \xEE\x9C |3 + \xEE\x9D |3 + \xEE\x9F |3 + \xEE\x9E |3 + \xEE\xA0 |3 + \xEE\xA3 |3 + \xEE\xA4 |3 + \xEE\xA1 |3 + \xEE\xA2 |3 + \xEE\xA5 |3 + \xEE\xA7 |3 + \xEE\xA6 |3 + \xEE\xAE |3 + \xEE\xA8 |3 + \xEE\xAA |3 + \xEE\xA9 |3 + \xEE\xAB |3 + \xEE\xAD |3 + \xEE\xAC |3 + \xEE\xAF |3 + \xEE\xB1 |3 + \xEE\xB2 |3 + \xED\x43 |3 + \xEE\xB0 |3 + \xEE\xB6 |3 + \xEE\xBA |3 + \xEE\xB8 |3 + \xEE\xB4 |3 + \xEE\xB5 |3 + \xEE\xB9 |3 + \xEE\xB3 |3 + \xED\x49 |3 + \xEE\xBD |3 + \xEE\xC0 |3 + \xEE\xC2 |3 + \xEE\xC1 |3 + \xEE\xBF |3 + \xEE\xBC |3 + \xEE\xBB |3 + \xED\x42 |3 + \xEE\xC4 |3 + \xEE\xC3 |3 + \xEE\xC5 |3 + \xEE\xC6 |3 + \xEE\xC7 |3 + \xEE\xC8 |3 + \xEE\xC9 |3 + \xEE\xCA |3 + \xEE\xCB |3 + \xEE\xCC |3 + \xEE\xCF |3 + \xEE\xD0 |3 + \xEE\xD1 |3 + \xEE\xD2 |3 + \xEE\xD3 |3 + \xEE\xD4 |3 + \xEE\xD5 |3 + \xEE\xD6 |3 + \xEE\xD7 |3 + \x90\x78 |0 + \xE8\xD5 |0 + \x8C\x7A |0 + \xE8\xF2 |0 + \xEE\xD8 |3 + \xEE\xD9 |3 + \xEE\xDC |3 + \xEE\xDE |3 + \xEE\xDF |3 + \xEE\xE0 |3 + \xEE\xE1 |3 + \xEE\xE3 |3 + \xEE\xE2 |3 + \xEE\xE4 |3 + \xEE\xE5 |3 + \xEE\xE6 |3 + \x88\xB1 |0 + \xEE\xE7 |3 + \xE9\xCB |0 + \x89\xA7 |0 + \xEE\xE9 |3 + \xEE\xE8 |3 + \xE9\xF2 |0 + \xEE\xEB |3 + \xEE\xEC |3 + \x87\x82 |1 + \xED\xC4 |3 + \xEE\xCD |3 + \xED\x73 |3 + \xED\x7E |3 + \xED\x80 |3 + \xED\x95 |3 + \xED\xBC |3 + \xED\xCC |3 + \xED\xCE |3 + \xED\xF9 |3 + \xEE\x42 |3 + \xEE\x59 |3 + \xEE\x61 |3 + \xEE\x62 |3 + \xEE\x63 |3 + \xEE\x65 |3 + \xEE\x69 |3 + \xEE\x6C |3 + \xEE\x75 |3 + \xEE\x81 |3 + \xEE\x83 |3 + \xEE\x84 |3 + \xEE\x8D |3 + \xEE\x95 |3 + \xEE\x97 |3 + \xEE\x98 |3 + \xEE\x9B |3 + \xEE\xB7 |3 + \xEE\xBE |3 + \xEE\xCE |3 + \xEE\xDA |3 + \xEE\xDB |3 + \xEE\xDD |3 + \xEE\xEA |3 + \xEE\xFC |3 + \xEE\xFB |3 + \x81\x7C |0 + \x81\x60 |0 + \x81\xCA |0 + \xEE\xF9 |3 + \xFA\x54 |3 + \xEE\xFA |3 + \xFA\x55 |0 +END CHARMAP diff --git a/icuSources/data/mappings/ibm-9447_P100-2002.ucm b/icuSources/data/mappings/ibm-9447_P100-2002.ucm new file mode 100644 index 00000000..94476bb1 --- /dev/null +++ b/icuSources/data/mappings/ibm-9447_P100-2002.ucm @@ -0,0 +1,360 @@ +# *************************************************************************** +# * +# * Copyright (C) 1995-2003, International Business Machines +# * Corporation and others. All Rights Reserved. +# * +# *************************************************************************** +# +# File created by rptp2ucm (compiled on Oct 7 2003) +# from source files 44B024E7.RPMAP100 and 24E744B0.TPMAP100 +# + "ibm-9447_P100-2002" + "AXXXX" + 1 + 1 + "SBCS" + "ASCII" + "ibm-9447_STD" + +CHARMAP + \x00 |0 + \x01 |0 + \x02 |0 + \x03 |0 + \x04 |0 + \x05 |0 + \x06 |0 + \x07 |0 + \x08 |0 + \x09 |0 + \x0A |0 + \x0B |0 + \x0C |0 + \x0D |0 + \x0E |0 + \x0F |0 + \x10 |0 + \x11 |0 + \x12 |0 + \x13 |0 + \x14 |0 + \x15 |0 + \x16 |0 + \x17 |0 + \x18 |0 + \x19 |0 + \x1A |0 + \x1B |0 + \x1C |0 + \x1D |0 + \x1E |0 + \x1F |0 + \x20 |0 + \x21 |0 + \x22 |0 + \x23 |0 + \x24 |0 + \x25 |0 + \x26 |0 + \x27 |0 + \x28 |0 + \x29 |0 + \x2A |0 + \x2B |0 + \x2C |0 + \x2D |0 + \x2E |0 + \x2F |0 + \x30 |0 + \x31 |0 + \x32 |0 + \x33 |0 + \x34 |0 + \x35 |0 + \x36 |0 + \x37 |0 + \x38 |0 + \x39 |0 + \x3A |0 + \x3B |0 + \x3C |0 + \x3D |0 + \x3E |0 + \x3F |0 + \x40 |0 + \x41 |0 + \x42 |0 + \x43 |0 + \x44 |0 + \x45 |0 + \x46 |0 + \x47 |0 + \x48 |0 + \x49 |0 + \x4A |0 + \x4B |0 + \x4C |0 + \x4D |0 + \x4E |0 + \x4F |0 + \x50 |0 + \x51 |0 + \x52 |0 + \x53 |0 + \x54 |0 + \x55 |0 + \x56 |0 + \x57 |0 + \x58 |0 + \x59 |0 + \x5A |0 + \x5B |0 + \x5C |0 + \x5D |0 + \x5E |0 + \x5F |0 + \x60 |0 + \x61 |0 + \x62 |0 + \x63 |0 + \x64 |0 + \x65 |0 + \x66 |0 + \x67 |0 + \x68 |0 + \x69 |0 + \x6A |0 + \x6B |0 + \x6C |0 + \x6D |0 + \x6E |0 + \x6F |0 + \x70 |0 + \x71 |0 + \x72 |0 + \x73 |0 + \x74 |0 + \x75 |0 + \x76 |0 + \x77 |0 + \x78 |0 + \x79 |0 + \x7A |0 + \x7B |0 + \x7C |0 + \x7D |0 + \x7E |0 + \x7F |0 + \x81 |0 + \x8A |0 + \x8C |0 + \x8D |0 + \x8E |0 + \x8F |0 + \x90 |0 + \x9A |0 + \x9C |0 + \x9D |0 + \x9E |0 + \x9F |0 + \xA0 |0 + \xA1 |0 + \xA2 |0 + \xA3 |0 + \xA5 |0 + \xA6 |0 + \xA7 |0 + \xA8 |0 + \xA9 |0 + \xAB |0 + \xAC |0 + \xAD |0 + \xAE |0 + \xAF |0 + \xB0 |0 + \xB1 |0 + \xB2 |0 + \xB3 |0 + \xB4 |0 + \xB5 |0 + \xB6 |0 + \xB7 |0 + \xB8 |0 + \xB9 |0 + \xBB |0 + \xBC |0 + \xBD |0 + \xBE |0 + \xBF |0 + \xAA |0 + \xBA |0 + \x83 |0 + \x88 |0 + \x98 |0 + \xC0 |0 + \xC1 |0 + \xC2 |0 + \xC3 |0 + \xC4 |0 + \xC5 |0 + \xC6 |0 + \xC7 |0 + \xC8 |0 + \xC9 |0 + \xCB |0 + \xCC |0 + \xCD |0 + \xCE |0 + \xCF |0 + \xD0 |0 + \xD1 |0 + \xD2 |0 + \xD3 |0 + \xE0 |0 + \xE1 |0 + \xE2 |0 + \xE3 |0 + \xE4 |0 + \xE5 |0 + \xE6 |0 + \xE7 |0 + \xE8 |0 + \xE9 |0 + \xEA |0 + \xEB |0 + \xEC |0 + \xED |0 + \xEE |0 + \xEF |0 + \xF0 |0 + \xF1 |0 + \xF2 |0 + \xF3 |0 + \xF4 |0 + \xF5 |0 + \xF6 |0 + \xF7 |0 + \xF8 |0 + \xF9 |0 + \xFA |0 + \xD4 |0 + \xD5 |0 + \xD6 |0 + \xD7 |0 + \xD8 |0 + \xFD |0 + \xFE |0 + \x96 |0 + \x97 |0 + \x91 |0 + \x92 |0 + \x82 |0 + \x93 |0 + \x94 |0 + \x84 |0 + \x86 |0 + \x87 |0 + \x95 |0 + \x85 |0 + \x89 |0 + \x8B |0 + \x9B |0 + \xAF |1 + \xA4 |0 + \x80 |0 + \x99 |0 + \x21 |1 + \x22 |1 + \x23 |1 + \x24 |1 + \x25 |1 + \x26 |1 + \x27 |1 + \x28 |1 + \x29 |1 + \x2A |1 + \x2B |1 + \x2C |1 + \x2D |1 + \x2E |1 + \x2F |1 + \x30 |1 + \x31 |1 + \x32 |1 + \x33 |1 + \x34 |1 + \x35 |1 + \x36 |1 + \x37 |1 + \x38 |1 + \x39 |1 + \x3A |1 + \x3B |1 + \x3C |1 + \x3D |1 + \x3E |1 + \x3F |1 + \x40 |1 + \x41 |1 + \x42 |1 + \x43 |1 + \x44 |1 + \x45 |1 + \x46 |1 + \x47 |1 + \x48 |1 + \x49 |1 + \x4A |1 + \x4B |1 + \x4C |1 + \x4D |1 + \x4E |1 + \x4F |1 + \x50 |1 + \x51 |1 + \x52 |1 + \x53 |1 + \x54 |1 + \x55 |1 + \x56 |1 + \x57 |1 + \x58 |1 + \x59 |1 + \x5A |1 + \x5B |1 + \x5C |1 + \x5D |1 + \x5E |1 + \x5F |1 + \x60 |1 + \x61 |1 + \x62 |1 + \x63 |1 + \x64 |1 + \x65 |1 + \x66 |1 + \x67 |1 + \x68 |1 + \x69 |1 + \x6A |1 + \x6B |1 + \x6C |1 + \x6D |1 + \x6E |1 + \x6F |1 + \x70 |1 + \x71 |1 + \x72 |1 + \x73 |1 + \x74 |1 + \x75 |1 + \x76 |1 + \x77 |1 + \x78 |1 + \x79 |1 + \x7A |1 + \x7B |1 + \x7C |1 + \x7D |1 + \x7E |1 +END CHARMAP diff --git a/icuSources/data/mappings/ibm-9449_P100-2002.ucm b/icuSources/data/mappings/ibm-9449_P100-2002.ucm new file mode 100644 index 00000000..576b51f3 --- /dev/null +++ b/icuSources/data/mappings/ibm-9449_P100-2002.ucm @@ -0,0 +1,369 @@ +# *************************************************************************** +# * +# * Copyright (C) 1995-2003, International Business Machines +# * Corporation and others. All Rights Reserved. +# * +# *************************************************************************** +# +# File created by rptp2ucm (compiled on Oct 7 2003) +# from source files 44B024E9.RPMAP100 and 24E944B0.TPMAP100 +# + "ibm-9449_P100-2002" + "AXXXX" + 1 + 1 + "SBCS" + "ASCII" + "ibm-9449_STD" + +CHARMAP + \x00 |0 + \x01 |0 + \x02 |0 + \x03 |0 + \x04 |0 + \x05 |0 + \x06 |0 + \x07 |0 + \x08 |0 + \x09 |0 + \x0A |0 + \x0B |0 + \x0C |0 + \x0D |0 + \x0E |0 + \x0F |0 + \x10 |0 + \x11 |0 + \x12 |0 + \x13 |0 + \x14 |0 + \x15 |0 + \x16 |0 + \x17 |0 + \x18 |0 + \x19 |0 + \x1A |0 + \x1B |0 + \x1C |0 + \x1D |0 + \x1E |0 + \x1F |0 + \x20 |0 + \x21 |0 + \x22 |0 + \x23 |0 + \x24 |0 + \x25 |0 + \x26 |0 + \x27 |0 + \x28 |0 + \x29 |0 + \x2A |0 + \x2B |0 + \x2C |0 + \x2D |0 + \x2E |0 + \x2F |0 + \x30 |0 + \x31 |0 + \x32 |0 + \x33 |0 + \x34 |0 + \x35 |0 + \x36 |0 + \x37 |0 + \x38 |0 + \x39 |0 + \x3A |0 + \x3B |0 + \x3C |0 + \x3D |0 + \x3E |0 + \x3F |0 + \x40 |0 + \x41 |0 + \x42 |0 + \x43 |0 + \x44 |0 + \x45 |0 + \x46 |0 + \x47 |0 + \x48 |0 + \x49 |0 + \x4A |0 + \x4B |0 + \x4C |0 + \x4D |0 + \x4E |0 + \x4F |0 + \x50 |0 + \x51 |0 + \x52 |0 + \x53 |0 + \x54 |0 + \x55 |0 + \x56 |0 + \x57 |0 + \x58 |0 + \x59 |0 + \x5A |0 + \x5B |0 + \x5C |0 + \x5D |0 + \x5E |0 + \x5F |0 + \x60 |0 + \x61 |0 + \x62 |0 + \x63 |0 + \x64 |0 + \x65 |0 + \x66 |0 + \x67 |0 + \x68 |0 + \x69 |0 + \x6A |0 + \x6B |0 + \x6C |0 + \x6D |0 + \x6E |0 + \x6F |0 + \x70 |0 + \x71 |0 + \x72 |0 + \x73 |0 + \x74 |0 + \x75 |0 + \x76 |0 + \x77 |0 + \x78 |0 + \x79 |0 + \x7A |0 + \x7B |0 + \x7C |0 + \x7D |0 + \x7E |0 + \x7F |0 + \x81 |0 + \x83 |0 + \x88 |0 + \x8A |0 + \x8C |0 + \x90 |0 + \x98 |0 + \x9A |0 + \x9C |0 + \x9F |0 + \xA0 |0 + \xA2 |0 + \xA3 |0 + \xA4 |0 + \xA6 |0 + \xA7 |0 + \x8D |0 + \xA9 |0 + \xAB |0 + \xAC |0 + \xAD |0 + \xAE |0 + \x9D |0 + \xB0 |0 + \xB1 |0 + \xB2 |0 + \xB3 |0 + \xB4 |0 + \xB5 |0 + \xB6 |0 + \xB7 |0 + \x8F |0 + \xB9 |0 + \xBB |0 + \xBC |0 + \xBD |0 + \xBE |0 + \xC4 |0 + \xC5 |0 + \xAF |0 + \xC9 |0 + \xD3 |0 + \xD5 |0 + \xD6 |0 + \xD7 |0 + \xA8 |0 + \xDC |0 + \xDF |0 + \xE4 |0 + \xE5 |0 + \xBF |0 + \xE9 |0 + \xF3 |0 + \xF5 |0 + \xF6 |0 + \xF7 |0 + \xB8 |0 + \xFC |0 + \xC2 |0 + \xE2 |0 + \xC0 |0 + \xE0 |0 + \xC3 |0 + \xE3 |0 + \xC8 |0 + \xE8 |0 + \xC7 |0 + \xE7 |0 + \xCB |0 + \xEB |0 + \xC6 |0 + \xE6 |0 + \xCC |0 + \xEC |0 + \xCE |0 + \xEE |0 + \xC1 |0 + \xE1 |0 + \xCD |0 + \xED |0 + \xCF |0 + \xEF |0 + \xD9 |0 + \xF9 |0 + \xD1 |0 + \xF1 |0 + \xD2 |0 + \xF2 |0 + \xD4 |0 + \xF4 |0 + \xAA |0 + \xBA |0 + \xDA |0 + \xFA |0 + \xD0 |0 + \xF0 |0 + \xDB |0 + \xFB |0 + \xD8 |0 + \xF8 |0 + \xCA |0 + \xEA |0 + \xDD |0 + \xFD |0 + \xDE |0 + \xFE |0 + \x8E |0 + \xFF |0 + \x9E |0 + \x96 |0 + \x97 |0 + \x91 |0 + \x92 |0 + \x82 |0 + \x93 |0 + \x94 |0 + \x84 |0 + \x86 |0 + \x87 |0 + \x95 |0 + \x85 |0 + \x89 |0 + \x8B |0 + \x9B |0 + \x9D |1 + \x80 |0 + \x99 |0 + \x21 |1 + \x22 |1 + \x23 |1 + \x24 |1 + \x25 |1 + \x26 |1 + \x27 |1 + \x28 |1 + \x29 |1 + \x2A |1 + \x2B |1 + \x2C |1 + \x2D |1 + \x2E |1 + \x2F |1 + \x30 |1 + \x31 |1 + \x32 |1 + \x33 |1 + \x34 |1 + \x35 |1 + \x36 |1 + \x37 |1 + \x38 |1 + \x39 |1 + \x3A |1 + \x3B |1 + \x3C |1 + \x3D |1 + \x3E |1 + \x3F |1 + \x40 |1 + \x41 |1 + \x42 |1 + \x43 |1 + \x44 |1 + \x45 |1 + \x46 |1 + \x47 |1 + \x48 |1 + \x49 |1 + \x4A |1 + \x4B |1 + \x4C |1 + \x4D |1 + \x4E |1 + \x4F |1 + \x50 |1 + \x51 |1 + \x52 |1 + \x53 |1 + \x54 |1 + \x55 |1 + \x56 |1 + \x57 |1 + \x58 |1 + \x59 |1 + \x5A |1 + \x5B |1 + \x5C |1 + \x5D |1 + \x5E |1 + \x5F |1 + \x60 |1 + \x61 |1 + \x62 |1 + \x63 |1 + \x64 |1 + \x65 |1 + \x66 |1 + \x67 |1 + \x68 |1 + \x69 |1 + \x6A |1 + \x6B |1 + \x6C |1 + \x6D |1 + \x6E |1 + \x6F |1 + \x70 |1 + \x71 |1 + \x72 |1 + \x73 |1 + \x74 |1 + \x75 |1 + \x76 |1 + \x77 |1 + \x78 |1 + \x79 |1 + \x7A |1 + \x7B |1 + \x7C |1 + \x7D |1 + \x7E |1 +END CHARMAP diff --git a/icuSources/data/mappings/ibm-949_P110-1999.ucm b/icuSources/data/mappings/ibm-949_P110-1999.ucm index 85dcb181..139189b6 100644 --- a/icuSources/data/mappings/ibm-949_P110-1999.ucm +++ b/icuSources/data/mappings/ibm-949_P110-1999.ucm @@ -21,6 +21,10 @@ 0-84, 8f-fe:1 40-7e, 80-fe +# build an extension-only (delta) .cnv file +# requires the base .cnv file at runtime + "ibm-949_P11A-1999" + CHARMAP \x00 |0 \x01 |0 diff --git a/icuSources/data/mappings/ibm-949_P11A-1999.ucm b/icuSources/data/mappings/ibm-949_P11A-1999.ucm index d5159280..fa6515a9 100644 --- a/icuSources/data/mappings/ibm-949_P11A-1999.ucm +++ b/icuSources/data/mappings/ibm-949_P11A-1999.ucm @@ -114,8 +114,6 @@ CHARMAP \x59 |0 \x5A |0 \x5B |0 - \x5C |0 - \x82 |3 \x5D |0 \x5E |0 \x5F |0 @@ -151,134 +149,40 @@ CHARMAP \x7D |0 \x7E |0 \x1C |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \xA2\xAE |0 \x80 |0 - \x7F |2 \xA2\xB4 |0 - \x7F |2 \x84 |0 \xA1\xD7 |0 \xA1\xA7 |0 - \x7F |2 \xA8\xA3 |0 - \x7F |2 \x81 |0 \xA1\xA9 |1 - \x7F |2 - \x7F |2 \xA1\xC6 |0 \xA1\xBE |0 \xA9\xF7 |0 \xA9\xF8 |0 \xA2\xA5 |0 - \x7F |2 \xA2\xD2 |0 \xA1\xA4 |1 \xA2\xAC |0 \xA9\xF6 |0 \xA8\xAC |0 - \x7F |2 \xA8\xF9 |0 \xA8\xF6 |0 \xA8\xFA |0 \xA2\xAF |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \xA8\xA1 |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \xA8\xA2 |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \xA1\xBF |0 \xA8\xAA |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \xA8\xAD |0 \xA9\xAC |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \xA9\xA1 |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \xA9\xA3 |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \xA1\xC0 |0 \xA9\xAA |0 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 - \x7F |2 \xA9\xAD |0 - \x7F |2 \xA9\xA2 |0 \xA8\xA4 |0 \xA9\xA4 |0 @@ -443,7 +347,6 @@ CHARMAP \xA9\xFC |0 \xA9\xFD |0 \xA9\xFE |0 - \x5C |1 \xA1\xC9 |0 \xA2\xB5 |0 \xA7\xA4 |0 @@ -10353,6 +10256,113 @@ CHARMAP \xA3\xFC |0 \xA3\xFD |0 \xA2\xA6 |1 + \xA1\xCB |0 + \xA1\xCC |0 + \xA1\xFE |0 + \xA3\xFE |0 + \x9A\xAA |0 + \xA1\xCD |0 + \xA3\xDC |0 +END CHARMAP + +CHARMAP + \x5C |0 + \x82 |3 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x7F |2 + \x5C |1 \x7F |2 \x7F |2 \x7F |2 @@ -10405,11 +10415,4 @@ CHARMAP \x7F |2 \x7F |2 \x7F |2 - \xA1\xCB |0 - \xA1\xCC |0 - \xA1\xFE |0 - \xA3\xFE |0 - \x9A\xAA |0 - \xA1\xCD |0 - \xA3\xDC |0 END CHARMAP diff --git a/icuSources/data/mappings/ibm-950_P110-1999.ucm b/icuSources/data/mappings/ibm-950_P110-1999.ucm index 231d42cb..e92464e2 100644 --- a/icuSources/data/mappings/ibm-950_P110-1999.ucm +++ b/icuSources/data/mappings/ibm-950_P110-1999.ucm @@ -21,6 +21,10 @@ 0-7f, 81-fe:1 40-7e, 80-fe +# build an extension-only (delta) .cnv file +# requires the base .cnv file at runtime + "ibm-1373_P100-2002" + CHARMAP \x00 |0 \x01 |0 diff --git a/icuSources/data/mappings/ibm-954_P101-2000.ucm b/icuSources/data/mappings/ibm-954_P101-2000.ucm new file mode 100644 index 00000000..14b9c8a0 --- /dev/null +++ b/icuSources/data/mappings/ibm-954_P101-2000.ucm @@ -0,0 +1,15225 @@ +# *************************************************************************** +# * +# * Copyright (C) 1995-2003, International Business Machines +# * Corporation and others. All Rights Reserved. +# * +# *************************************************************************** +# +# File created by rptp2ucm (compiled on Dec 3 2002) +# from source files 44B003BA.RPMAP101 and 03BA44B0.TPMAP101 +# + "ibm-954_P101-2000" + "AXXXX" + 3 + 1 + "MBCS" + \xF4\xFE + "ASCII" + "ibm-954_VPUA" + + 0-8d, 8e:2, 8f:3, 90-9f, a1-fe:1 + a1-fe + a1-e4 + a1-fe:1, a1:4 + a1-fe.u + +CHARMAP + \x00 |0 + \x01 |0 + \x02 |0 + \x03 |0 + \x04 |0 + \x05 |0 + \x06 |0 + \x07 |0 + \x08 |0 + \x09 |0 + \x0A |0 + \x0B |0 + \x0C |0 + \x0D |0 + \x0E |0 + \x0F |0 + \x10 |0 + \x11 |0 + \x12 |0 + \x13 |0 + \x14 |0 + \x15 |0 + \x16 |0 + \x17 |0 + \x18 |0 + \x19 |0 + \x1A |0 + \x1B |0 + \x1C |0 + \x1D |0 + \x1E |0 + \x1F |0 + \x20 |0 + \x21 |0 + \x22 |0 + \x23 |0 + \x24 |0 + \x25 |0 + \x26 |0 + \x27 |0 + \x28 |0 + \x29 |0 + \x2A |0 + \x2B |0 + \x2C |0 + \x2D |0 + \x2E |0 + \x2F |0 + \x30 |0 + \x31 |0 + \x32 |0 + \x33 |0 + \x34 |0 + \x35 |0 + \x36 |0 + \x37 |0 + \x38 |0 + \x39 |0 + \x3A |0 + \x3B |0 + \x3C |0 + \x3D |0 + \x3E |0 + \x3F |0 + \x40 |0 + \x41 |0 + \x42 |0 + \x43 |0 + \x44 |0 + \x45 |0 + \x46 |0 + \x47 |0 + \x48 |0 + \x49 |0 + \x4A |0 + \x4B |0 + \x4C |0 + \x4D |0 + \x4E |0 + \x4F |0 + \x50 |0 + \x51 |0 + \x52 |0 + \x53 |0 + \x54 |0 + \x55 |0 + \x56 |0 + \x57 |0 + \x58 |0 + \x59 |0 + \x5A |0 + \x5B |0 + \x5C |0 + \x8E\xE3 |3 + \x5D |0 + \x5E |0 + \x5F |0 + \x60 |0 + \x61 |0 + \x62 |0 + \x63 |0 + \x64 |0 + \x65 |0 + \x66 |0 + \x67 |0 + \x68 |0 + \x69 |0 + \x6A |0 + \x6B |0 + \x6C |0 + \x6D |0 + \x6E |0 + \x6F |0 + \x70 |0 + \x71 |0 + \x72 |0 + \x73 |0 + \x74 |0 + \x75 |0 + \x76 |0 + \x77 |0 + \x78 |0 + \x79 |0 + \x7A |0 + \x7B |0 + \x7C |0 + \x7D |0 + \x7E |0 + \x8E\xE4 |3 + \x7F |0 + \x80 |0 + \x81 |0 + \x82 |0 + \x83 |0 + \x84 |0 + \x85 |0 + \x86 |0 + \x87 |0 + \x88 |0 + \x89 |0 + \x8A |0 + \x8B |0 + \x8C |0 + \x8D |0 + \x1A |1 + \x1A |1 + \x90 |0 + \x91 |0 + \x92 |0 + \x93 |0 + \x94 |0 + \x95 |0 + \x96 |0 + \x97 |0 + \x98 |0 + \x99 |0 + \x9A |0 + \x9B |0 + \x9C |0 + \x9D |0 + \x9E |0 + \x9F |0 + \x1A |1 + \x8F\xA2\xC2 |0 + \x8E\xE0 |0 + \x8E\xE1 |0 + \x8F\xA2\xF0 |0 + \x5C |1 + \x8F\xA2\xC3 |0 + \xA1\xF8 |0 + \xA1\xAF |0 + \x8F\xA2\xED |0 + \x8F\xA2\xEC |0 + \x1A |1 + \x8E\xE2 |0 + \x1A |1 + \x8F\xA2\xEE |0 + \x8F\xA2\xB4 |0 + \xA1\xEB |0 + \xA1\xDE |0 + \x1A |1 + \x1A |1 + \xA1\xAD |0 + \x1A |1 + \xA2\xF9 |0 + \x1A |1 + \x8F\xA2\xB1 |0 + \x1A |1 + \x8F\xA2\xEB |0 + \x1A |1 + \x1A |1 + \x1A |1 + \x1A |1 + \x8F\xA2\xC4 |0 + \x8F\xAA\xA2 |0 + \x8F\xAA\xA1 |0 + \x8F\xAA\xA4 |0 + \x8F\xAA\xAA |0 + \x8F\xAA\xA3 |0 + \x8F\xAA\xA9 |0 + \x8F\xA9\xA1 |0 + \x8F\xAA\xAE |0 + \x8F\xAA\xB2 |0 + \x8F\xAA\xB1 |0 + \x8F\xAA\xB4 |0 + \x8F\xAA\xB3 |0 + \x8F\xAA\xC0 |0 + \x8F\xAA\xBF |0 + \x8F\xAA\xC2 |0 + \x8F\xAA\xC1 |0 + \x1A |1 + \x8F\xAA\xD0 |0 + \x8F\xAA\xD2 |0 + \x8F\xAA\xD1 |0 + \x8F\xAA\xD4 |0 + \x8F\xAA\xD8 |0 + \x8F\xAA\xD3 |0 + \xA1\xDF |0 + \x8F\xA9\xAC |0 + \x8F\xAA\xE3 |0 + \x8F\xAA\xE2 |0 + \x8F\xAA\xE5 |0 + \x8F\xAA\xE4 |0 + \x8F\xAA\xF2 |0 + \x8F\xA9\xB0 |0 + \x8F\xA9\xCE |0 + \x8F\xAB\xA2 |0 + \x8F\xAB\xA1 |0 + \x8F\xAB\xA4 |0 + \x8F\xAB\xAA |0 + \x8F\xAB\xA3 |0 + \x8F\xAB\xA9 |0 + \x8F\xA9\xC1 |0 + \x8F\xAB\xAE |0 + \x8F\xAB\xB2 |0 + \x8F\xAB\xB1 |0 + \x8F\xAB\xB4 |0 + \x8F\xAB\xB3 |0 + \x8F\xAB\xC0 |0 + \x8F\xAB\xBF |0 + \x8F\xAB\xC2 |0 + \x8F\xAB\xC1 |0 + \x8F\xA9\xC3 |0 + \x8F\xAB\xD0 |0 + \x8F\xAB\xD2 |0 + \x8F\xAB\xD1 |0 + \x8F\xAB\xD4 |0 + \x8F\xAB\xD8 |0 + \x8F\xAB\xD3 |0 + \xA1\xE0 |0 + \x8F\xA9\xCC |0 + \x8F\xAB\xE3 |0 + \x8F\xAB\xE2 |0 + \x8F\xAB\xE5 |0 + \x8F\xAB\xE4 |0 + \x8F\xAB\xF2 |0 + \x8F\xA9\xD0 |0 + \x8F\xAB\xF3 |0 + \x8F\xAA\xA7 |0 + \x8F\xAB\xA7 |0 + \x8F\xAA\xA5 |0 + \x8F\xAB\xA5 |0 + \x8F\xAA\xA8 |0 + \x8F\xAB\xA8 |0 + \x8F\xAA\xAB |0 + \x8F\xAB\xAB |0 + \x8F\xAA\xAC |0 + \x8F\xAB\xAC |0 + \x8F\xAA\xAF |0 + \x8F\xAB\xAF |0 + \x8F\xAA\xAD |0 + \x8F\xAB\xAD |0 + \x8F\xAA\xB0 |0 + \x8F\xAB\xB0 |0 + \x8F\xA9\xA2 |0 + \x8F\xA9\xC2 |0 + \x8F\xAA\xB7 |0 + \x8F\xAB\xB7 |0 + \x8F\xAA\xB6 |0 + \x8F\xAB\xB6 |0 + \x8F\xAA\xB8 |0 + \x8F\xAB\xB8 |0 + \x8F\xAA\xB5 |0 + \x8F\xAB\xB5 |0 + \x8F\xAA\xBA |0 + \x8F\xAB\xBA |0 + \x8F\xAA\xBB |0 + \x8F\xAB\xBB |0 + \x8F\xAA\xBD |0 + \x8F\xAB\xBD |0 + \x8F\xAA\xBC |0 + \x8F\xAA\xBE |0 + \x8F\xAB\xBE |0 + \x8F\xA9\xA4 |0 + \x8F\xA9\xC4 |0 + \x8F\xAA\xC7 |0 + \x8F\xAB\xC7 |0 + \x8F\xAA\xC5 |0 + \x8F\xAB\xC5 |0 + \x8F\xAA\xC6 |0 + \x8F\xAB\xC6 |0 + \x8F\xAA\xC4 |0 + \x8F\xA9\xC5 |0 + \x8F\xA9\xA6 |0 + \x8F\xA9\xC6 |0 + \x8F\xAA\xC8 |0 + \x8F\xAB\xC8 |0 + \x8F\xAA\xC9 |0 + \x8F\xAB\xC9 |0 + \x8F\xA9\xC7 |0 + \x8F\xAA\xCA |0 + \x8F\xAB\xCA |0 + \x8F\xAA\xCC |0 + \x8F\xAB\xCC |0 + \x8F\xAA\xCB |0 + \x8F\xAB\xCB |0 + \x8F\xA9\xA9 |0 + \x8F\xA9\xC9 |0 + \x8F\xA9\xA8 |0 + \x8F\xA9\xC8 |0 + \x8F\xAA\xCD |0 + \x8F\xAB\xCD |0 + \x8F\xAA\xCF |0 + \x8F\xAB\xCF |0 + \x8F\xAA\xCE |0 + \x8F\xAB\xCE |0 + \x8F\xA9\xCA |0 + \x8F\xA9\xAB |0 + \x8F\xA9\xCB |0 + \x8F\xAA\xD7 |0 + \x8F\xAB\xD7 |0 + \x8F\xAA\xD6 |0 + \x8F\xAB\xD6 |0 + \x8F\xA9\xAD |0 + \x8F\xA9\xCD |0 + \x8F\xAA\xD9 |0 + \x8F\xAB\xD9 |0 + \x8F\xAA\xDB |0 + \x8F\xAB\xDB |0 + \x8F\xAA\xDA |0 + \x8F\xAB\xDA |0 + \x8F\xAA\xDC |0 + \x8F\xAB\xDC |0 + \x8F\xAA\xDD |0 + \x8F\xAB\xDD |0 + \x8F\xAA\xDF |0 + \x8F\xAB\xDF |0 + \x8F\xAA\xDE |0 + \x8F\xAB\xDE |0 + \x8F\xAA\xE1 |0 + \x8F\xAB\xE1 |0 + \x8F\xAA\xE0 |0 + \x8F\xAB\xE0 |0 + \x8F\xA9\xAF |0 + \x8F\xA9\xCF |0 + \x8F\xAA\xEC |0 + \x8F\xAB\xEC |0 + \x8F\xAA\xE9 |0 + \x8F\xAB\xE9 |0 + \x8F\xAA\xE6 |0 + \x8F\xAB\xE6 |0 + \x8F\xAA\xEB |0 + \x8F\xAB\xEB |0 + \x8F\xAA\xE8 |0 + \x8F\xAB\xE8 |0 + \x8F\xAA\xEA |0 + \x8F\xAB\xEA |0 + \x8F\xAA\xF1 |0 + \x8F\xAB\xF1 |0 + \x8F\xAA\xF4 |0 + \x8F\xAB\xF4 |0 + \x8F\xAA\xF3 |0 + \x8F\xAA\xF5 |0 + \x8F\xAB\xF5 |0 + \x8F\xAA\xF7 |0 + \x8F\xAB\xF7 |0 + \x8F\xAA\xF6 |0 + \x8F\xAB\xF6 |0 + \x8F\xAA\xA6 |0 + \x8F\xAB\xA6 |0 + \x8F\xAA\xC3 |0 + \x8F\xAB\xC3 |0 + \x8F\xAA\xD5 |0 + \x8F\xAB\xD5 |0 + \x8F\xAA\xE7 |0 + \x8F\xAB\xE7 |0 + \x8F\xAA\xF0 |0 + \x8F\xAB\xF0 |0 + \x8F\xAA\xED |0 + \x8F\xAB\xED |0 + \x8F\xAA\xEF |0 + \x8F\xAB\xEF |0 + \x8F\xAA\xEE |0 + \x8F\xAB\xEE |0 + \x8F\xAB\xB9 |0 + \x8F\xA2\xB0 |0 + \x8F\xA2\xAF |0 + \x8F\xA2\xB2 |0 + \x8F\xA2\xB6 |0 + \x8F\xA2\xB5 |0 + \x8F\xA2\xB3 |0 + \x8F\xA2\xB8 |0 + \x8F\xA2\xB9 |0 + \x8F\xA6\xE1 |0 + \x8F\xA6\xE2 |0 + \x8F\xA6\xE3 |0 + \x8F\xA6\xE4 |0 + \x8F\xA6\xE7 |0 + \x8F\xA6\xE9 |0 + \x8F\xA6\xEC |0 + \x8F\xA6\xF6 |0 + \xA6\xA1 |0 + \xA6\xA2 |0 + \xA6\xA3 |0 + \xA6\xA4 |0 + \xA6\xA5 |0 + \xA6\xA6 |0 + \xA6\xA7 |0 + \xA6\xA8 |0 + \xA6\xA9 |0 + \xA6\xAA |0 + \xA6\xAB |0 + \xA6\xAC |0 + \xA6\xAD |0 + \xA6\xAE |0 + \xA6\xAF |0 + \xA6\xB0 |0 + \xA6\xB1 |0 + \xA6\xB2 |0 + \xA6\xB3 |0 + \xA6\xB4 |0 + \xA6\xB5 |0 + \xA6\xB6 |0 + \xA6\xB7 |0 + \xA6\xB8 |0 + \x8F\xA6\xE5 |0 + \x8F\xA6\xEA |0 + \x8F\xA6\xF1 |0 + \x8F\xA6\xF2 |0 + \x8F\xA6\xF3 |0 + \x8F\xA6\xF4 |0 + \x8F\xA6\xFB |0 + \xA6\xC1 |0 + \xA6\xC2 |0 + \xA6\xC3 |0 + \xA6\xC4 |0 + \xA6\xC5 |0 + \xA6\xC6 |0 + \xA6\xC7 |0 + \xA6\xC8 |0 + \xA6\xC9 |0 + \xA6\xCA |0 + \xA6\xCB |0 + \xA6\xCC |0 + \xA6\xCD |0 + \xA6\xCE |0 + \xA6\xCF |0 + \xA6\xD0 |0 + \xA6\xD1 |0 + \x8F\xA6\xF8 |0 + \xA6\xD2 |0 + \xA6\xD3 |0 + \xA6\xD4 |0 + \xA6\xD5 |0 + \xA6\xD6 |0 + \xA6\xD7 |0 + \xA6\xD8 |0 + \x8F\xA6\xF5 |0 + \x8F\xA6\xFA |0 + \x8F\xA6\xF7 |0 + \x8F\xA6\xF9 |0 + \x8F\xA6\xFC |0 + \xA7\xA7 |0 + \x8F\xA7\xC2 |0 + \x8F\xA7\xC3 |0 + \x8F\xA7\xC4 |0 + \x8F\xA7\xC5 |0 + \x8F\xA7\xC6 |0 + \x8F\xA7\xC7 |0 + \x8F\xA7\xC8 |0 + \x8F\xA7\xC9 |0 + \x8F\xA7\xCA |0 + \x8F\xA7\xCB |0 + \x8F\xA7\xCC |0 + \x8F\xA7\xCD |0 + \x8F\xA7\xCE |0 + \xA7\xA1 |0 + \xA7\xA2 |0 + \xA7\xA3 |0 + \xA7\xA4 |0 + \xA7\xA5 |0 + \xA7\xA6 |0 + \xA7\xA8 |0 + \xA7\xA9 |0 + \xA7\xAA |0 + \xA7\xAB |0 + \xA7\xAC |0 + \xA7\xAD |0 + \xA7\xAE |0 + \xA7\xAF |0 + \xA7\xB0 |0 + \xA7\xB1 |0 + \xA7\xB2 |0 + \xA7\xB3 |0 + \xA7\xB4 |0 + \xA7\xB5 |0 + \xA7\xB6 |0 + \xA7\xB7 |0 + \xA7\xB8 |0 + \xA7\xB9 |0 + \xA7\xBA |0 + \xA7\xBB |0 + \xA7\xBC |0 + \xA7\xBD |0 + \xA7\xBE |0 + \xA7\xBF |0 + \xA7\xC0 |0 + \xA7\xC1 |0 + \xA7\xD1 |0 + \xA7\xD2 |0 + \xA7\xD3 |0 + \xA7\xD4 |0 + \xA7\xD5 |0 + \xA7\xD6 |0 + \xA7\xD8 |0 + \xA7\xD9 |0 + \xA7\xDA |0 + \xA7\xDB |0 + \xA7\xDC |0 + \xA7\xDD |0 + \xA7\xDE |0 + \xA7\xDF |0 + \xA7\xE0 |0 + \xA7\xE1 |0 + \xA7\xE2 |0 + \xA7\xE3 |0 + \xA7\xE4 |0 + \xA7\xE5 |0 + \xA7\xE6 |0 + \xA7\xE7 |0 + \xA7\xE8 |0 + \xA7\xE9 |0 + \xA7\xEA |0 + \xA7\xEB |0 + \xA7\xEC |0 + \xA7\xED |0 + \xA7\xEE |0 + \xA7\xEF |0 + \xA7\xF0 |0 + \xA7\xF1 |0 + \xA7\xD7 |0 + \x8F\xA7\xF2 |0 + \x8F\xA7\xF3 |0 + \x8F\xA7\xF4 |0 + \x8F\xA7\xF5 |0 + \x8F\xA7\xF6 |0 + \x8F\xA7\xF7 |0 + \x8F\xA7\xF8 |0 + \x8F\xA7\xF9 |0 + \x8F\xA7\xFA |0 + \x8F\xA7\xFB |0 + \x8F\xA7\xFC |0 + \x8F\xA7\xFD |0 + \x8F\xA7\xFE |0 + \xA1\xBE |0 + \xA1\xBD |0 + \xA1\xBD |1 + \xA1\xC2 |0 + \xA1\xC6 |0 + \xA1\xC7 |0 + \xA1\xC8 |0 + \xA1\xC9 |0 + \xA2\xF7 |0 + \xA2\xF8 |0 + \xA1\xC5 |0 + \xA1\xC4 |0 + \xA2\xF3 |0 + \xA1\xEC |0 + \xA1\xED |0 + \xA2\xA8 |0 + \x7E |1 + \xA1\xEE |0 + \x8F\xA2\xF1 |0 + \x8F\xF3\xB8 |3 + \x8F\xF3\xB9 |0 + \x8F\xA2\xEF |0 + \xA2\xF2 |0 + \x8F\xF3\xAB |0 + \x8F\xF3\xAC |0 + \x8F\xF3\xAD |0 + \x8F\xF3\xAE |0 + \x8F\xF3\xAF |0 + \x8F\xF3\xB0 |0 + \x8F\xF3\xB1 |0 + \x8F\xF3\xB2 |0 + \x8F\xF3\xB3 |0 + \x8F\xF3\xB4 |0 + \x8F\xF3\xA1 |0 + \x8F\xF3\xA2 |0 + \x8F\xF3\xA3 |0 + \x8F\xF3\xA4 |0 + \x8F\xF3\xA5 |0 + \x8F\xF3\xA6 |0 + \x8F\xF3\xA7 |0 + \x8F\xF3\xA8 |0 + \x8F\xF3\xA9 |0 + \x8F\xF3\xAA |0 + \xA2\xAB |0 + \xA2\xAC |0 + \xA2\xAA |0 + \xA2\xAD |0 + \xA2\xCD |0 + \xA2\xCE |0 + \xA2\xCF |0 + \xA2\xDF |0 + \xA2\xD0 |0 + \xA2\xE0 |0 + \xA2\xBA |0 + \xA2\xBB |0 + \xA1\xDD |0 + \xA2\xE5 |0 + \xA2\xE7 |0 + \xA1\xE7 |0 + \xA2\xDC |0 + \xA1\xC2 |1 + \xA2\xCA |0 + \xA2\xCB |0 + \xA2\xC1 |0 + \xA2\xC0 |0 + \xA2\xE9 |0 + \xA2\xEA |0 + \xA1\xE8 |0 + \xA2\xE8 |0 + \xA2\xE6 |0 + \xA2\xE2 |0 + \xA1\xE2 |0 + \xA2\xE1 |0 + \xA1\xE5 |0 + \xA1\xE6 |0 + \xA2\xE3 |0 + \xA2\xE4 |0 + \xA2\xBE |0 + \xA2\xBF |0 + \xA2\xBC |0 + \xA2\xBD |0 + \xA2\xDD |0 + \xA2\xDE |0 + \xA8\xA1 |0 + \xA8\xAC |0 + \xA8\xA2 |0 + \xA8\xAD |0 + \xA8\xA3 |0 + \xA8\xAE |0 + \xA8\xA4 |0 + \xA8\xAF |0 + \xA8\xA6 |0 + \xA8\xB1 |0 + \xA8\xA5 |0 + \xA8\xB0 |0 + \xA8\xA7 |0 + \xA8\xBC |0 + \xA8\xB7 |0 + \xA8\xB2 |0 + \xA8\xA9 |0 + \xA8\xBE |0 + \xA8\xB9 |0 + \xA8\xB4 |0 + \xA8\xA8 |0 + \xA8\xB8 |0 + \xA8\xBD |0 + \xA8\xB3 |0 + \xA8\xAA |0 + \xA8\xBA |0 + \xA8\xBF |0 + \xA8\xB5 |0 + \xA8\xAB |0 + \xA8\xBB |0 + \xA8\xC0 |0 + \xA8\xB6 |0 + \xA2\xA3 |0 + \xA2\xA2 |0 + \xA2\xA5 |0 + \xA2\xA4 |0 + \xA2\xA7 |0 + \xA2\xA6 |0 + \xA2\xA1 |0 + \xA1\xFE |0 + \xA1\xFB |0 + \xA1\xFD |0 + \xA1\xFC |0 + \xA2\xFE |0 + \xA1\xFA |0 + \xA1\xF9 |0 + \xA1\xEA |0 + \xA1\xE9 |0 + \xA2\xF6 |0 + \xA2\xF5 |0 + \xA2\xF4 |0 + \xA1\xA1 |0 + \xA1\xA2 |0 + \xA1\xA3 |0 + \xA1\xB7 |0 + \xA1\xB9 |0 + \xA1\xBA |0 + \xA1\xBB |0 + \xA1\xD2 |0 + \xA1\xD3 |0 + \xA1\xD4 |0 + \xA1\xD5 |0 + \xA1\xD6 |0 + \xA1\xD7 |0 + \xA1\xD8 |0 + \xA1\xD9 |0 + \xA1\xDA |0 + \xA1\xDB |0 + \xA2\xA9 |0 + \xA2\xAE |0 + \xA1\xCC |0 + \xA1\xCD |0 + \xA1\xC1 |0 + \xA4\xA1 |0 + \xA4\xA2 |0 + \xA4\xA3 |0 + \xA4\xA4 |0 + \xA4\xA5 |0 + \xA4\xA6 |0 + \xA4\xA7 |0 + \xA4\xA8 |0 + \xA4\xA9 |0 + \xA4\xAA |0 + \xA4\xAB |0 + \xA4\xAC |0 + \xA4\xAD |0 + \xA4\xAE |0 + \xA4\xAF |0 + \xA4\xB0 |0 + \xA4\xB1 |0 + \xA4\xB2 |0 + \xA4\xB3 |0 + \xA4\xB4 |0 + \xA4\xB5 |0 + \xA4\xB6 |0 + \xA4\xB7 |0 + \xA4\xB8 |0 + \xA4\xB9 |0 + \xA4\xBA |0 + \xA4\xBB |0 + \xA4\xBC |0 + \xA4\xBD |0 + \xA4\xBE |0 + \xA4\xBF |0 + \xA4\xC0 |0 + \xA4\xC1 |0 + \xA4\xC2 |0 + \xA4\xC3 |0 + \xA4\xC4 |0 + \xA4\xC5 |0 + \xA4\xC6 |0 + \xA4\xC7 |0 + \xA4\xC8 |0 + \xA4\xC9 |0 + \xA4\xCA |0 + \xA4\xCB |0 + \xA4\xCC |0 + \xA4\xCD |0 + \xA4\xCE |0 + \xA4\xCF |0 + \xA4\xD0 |0 + \xA4\xD1 |0 + \xA4\xD2 |0 + \xA4\xD3 |0 + \xA4\xD4 |0 + \xA4\xD5 |0 + \xA4\xD6 |0 + \xA4\xD7 |0 + \xA4\xD8 |0 + \xA4\xD9 |0 + \xA4\xDA |0 + \xA4\xDB |0 + \xA4\xDC |0 + \xA4\xDD |0 + \xA4\xDE |0 + \xA4\xDF |0 + \xA4\xE0 |0 + \xA4\xE1 |0 + \xA4\xE2 |0 + \xA4\xE3 |0 + \xA4\xE4 |0 + \xA4\xE5 |0 + \xA4\xE6 |0 + \xA4\xE7 |0 + \xA4\xE8 |0 + \xA4\xE9 |0 + \xA4\xEA |0 + \xA4\xEB |0 + \xA4\xEC |0 + \xA4\xED |0 + \xA4\xEE |0 + \xA4\xEF |0 + \xA4\xF0 |0 + \xA4\xF1 |0 + \xA4\xF2 |0 + \xA4\xF3 |0 + \xA1\xAB |0 + \xA1\xAC |0 + \xA1\xB5 |0 + \xA1\xB6 |0 + \xA5\xA1 |0 + \xA5\xA2 |0 + \xA5\xA3 |0 + \xA5\xA4 |0 + \xA5\xA5 |0 + \xA5\xA6 |0 + \xA5\xA7 |0 + \xA5\xA8 |0 + \xA5\xA9 |0 + \xA5\xAA |0 + \xA5\xAB |0 + \xA5\xAC |0 + \xA5\xAD |0 + \xA5\xAE |0 + \xA5\xAF |0 + \xA5\xB0 |0 + \xA5\xB1 |0 + \xA5\xB2 |0 + \xA5\xB3 |0 + \xA5\xB4 |0 + \xA5\xB5 |0 + \xA5\xB6 |0 + \xA5\xB7 |0 + \xA5\xB8 |0 + \xA5\xB9 |0 + \xA5\xBA |0 + \xA5\xBB |0 + \xA5\xBC |0 + \xA5\xBD |0 + \xA5\xBE |0 + \xA5\xBF |0 + \xA5\xC0 |0 + \xA5\xC1 |0 + \xA5\xC2 |0 + \xA5\xC3 |0 + \xA5\xC4 |0 + \xA5\xC5 |0 + \xA5\xC6 |0 + \xA5\xC7 |0 + \xA5\xC8 |0 + \xA5\xC9 |0 + \xA5\xCA |0 + \xA5\xCB |0 + \xA5\xCC |0 + \xA5\xCD |0 + \xA5\xCE |0 + \xA5\xCF |0 + \xA5\xD0 |0 + \xA5\xD1 |0 + \xA5\xD2 |0 + \xA5\xD3 |0 + \xA5\xD4 |0 + \xA5\xD5 |0 + \xA5\xD6 |0 + \xA5\xD7 |0 + \xA5\xD8 |0 + \xA5\xD9 |0 + \xA5\xDA |0 + \xA5\xDB |0 + \xA5\xDC |0 + \xA5\xDD |0 + \xA5\xDE |0 + \xA5\xDF |0 + \xA5\xE0 |0 + \xA5\xE1 |0 + \xA5\xE2 |0 + \xA5\xE3 |0 + \xA5\xE4 |0 + \xA5\xE5 |0 + \xA5\xE6 |0 + \xA5\xE7 |0 + \xA5\xE8 |0 + \xA5\xE9 |0 + \xA5\xEA |0 + \xA5\xEB |0 + \xA5\xEC |0 + \xA5\xED |0 + \xA5\xEE |0 + \xA5\xEF |0 + \xA5\xF0 |0 + \xA5\xF1 |0 + \xA5\xF2 |0 + \xA5\xF3 |0 + \xA5\xF4 |0 + \xA5\xF5 |0 + \xA5\xF6 |0 + \xA1\xA6 |0 + \xA1\xBC |0 + \xA1\xB3 |0 + \xA1\xB4 |0 + \x8F\xF3\xB7 |0 + \xB0\xEC |0 + \xC3\xFA |0 + \x8F\xB0\xA1 |0 + \xBC\xB7 |0 + \x8F\xB0\xA2 |0 + \x8F\xB0\xA3 |0 + \xCB\xFC |0 + \xBE\xE6 |0 + \xBB\xB0 |0 + \xBE\xE5 |0 + \xB2\xBC |0 + \x8F\xB0\xA4 |0 + \xC9\xD4 |0 + \xCD\xBF |0 + \xD0\xA2 |0 + \xB1\xAF |0 + \x8F\xB0\xA5 |0 + \xB3\xEE |0 + \xD0\xA3 |0 + \xC0\xA4 |0 + \xD2\xC2 |0 + \xB5\xD6 |0 + \xCA\xBA |0 + \xBE\xE7 |0 + \x8F\xB0\xA6 |0 + \xCE\xBE |0 + \x8F\xB0\xA7 |0 + \x8F\xB0\xA8 |0 + \xCA\xC2 |0 + \x8F\xB0\xA9 |0 + \xD0\xA4 |0 + \x8F\xB0\xAA |0 + \xC3\xE6 |0 + \x8F\xB0\xAB |0 + \x8F\xB0\xAC |0 + \x8F\xB0\xAD |0 + \xD0\xA5 |0 + \xB6\xFA |0 + \x8F\xB0\xAE |0 + \xD0\xA6 |0 + \xB4\xDD |0 + \xC3\xB0 |0 + \xBC\xE7 |0 + \xD0\xA7 |0 + \xD0\xA8 |0 + \x8F\xB0\xAF |0 + \x8F\xB0\xB0 |0 + \xD0\xA9 |0 + \xC7\xB5 |0 + \x8F\xB0\xB1 |0 + \xB5\xD7 |0 + \x8F\xB0\xB2 |0 + \xC7\xB7 |0 + \xC6\xE3 |0 + \xB8\xC3 |0 + \xCB\xB3 |0 + \x8F\xB0\xB3 |0 + \xE9\xC9 |0 + \xD0\xAA |0 + \xBE\xE8 |0 + \xD0\xAB |0 + \xB2\xB5 |0 + \x8F\xB0\xB4 |0 + \x8F\xB0\xB5 |0 + \xB6\xE5 |0 + \xB8\xF0 |0 + \xCC\xE9 |0 + \xD6\xA6 |0 + \x8F\xB0\xB6 |0 + \x8F\xB0\xB7 |0 + \x8F\xB0\xB8 |0 + \xCD\xF0 |0 + \xC6\xFD |0 + \x8F\xB0\xB9 |0 + \x8F\xB0\xBA |0 + \x8F\xB0\xBB |0 + \xB4\xA5 |0 + \x8F\xB0\xBC |0 + \xB5\xB5 |0 + \xD0\xAC |0 + \xD0\xAD |0 + \xCE\xBB |0 + \xCD\xBD |0 + \xC1\xE8 |0 + \xD0\xAF |0 + \xBB\xF6 |0 + \xC6\xF3 |0 + \x8F\xB0\xBD |0 + \xD0\xB2 |0 + \xB1\xBE |0 + \xB8\xDF |0 + \xB8\xDE |0 + \xB0\xE6 |0 + \x8F\xB0\xBE |0 + \x8F\xB0\xBF |0 + \xCF\xCB |0 + \xCF\xCA |0 + \xBA\xB3 |0 + \xB0\xA1 |0 + \x8F\xB0\xC0 |0 + \xD0\xB3 |0 + \xD0\xB4 |0 + \xD0\xB5 |0 + \xCB\xB4 |0 + \xD0\xB6 |0 + \xB8\xF2 |0 + \xB0\xE7 |0 + \xCB\xF2 |0 + \xB5\xFC |0 + \xB5\xFD |0 + \xB5\xFE |0 + \xC4\xE2 |0 + \xCE\xBC |0 + \x8F\xB0\xC1 |0 + \xD0\xB7 |0 + \xD0\xB8 |0 + \xD0\xB9 |0 + \x8F\xB0\xC2 |0 + \xBF\xCD |0 + \xBD\xBA |0 + \xBF\xCE |0 + \xD0\xBE |0 + \x8F\xB0\xC3 |0 + \xD0\xBC |0 + \xD0\xBD |0 + \xB5\xD8 |0 + \xBA\xA3 |0 + \xB2\xF0 |0 + \xD0\xBB |0 + \xD0\xBA |0 + \xCA\xA9 |0 + \x8F\xB0\xC4 |0 + \xBB\xC6 |0 + \xBB\xC5 |0 + \xC2\xBE |0 + \xD0\xBF |0 + \xC9\xD5 |0 + \xC0\xE7 |0 + \x8F\xB0\xC5 |0 + \x8F\xB0\xC6 |0 + \xA1\xB8 |0 + \xD0\xC0 |0 + \xD0\xC2 |0 + \x8F\xB0\xC7 |0 + \x8F\xB0\xC8 |0 + \x8F\xB0\xC9 |0 + \xC2\xE5 |0 + \xCE\xE1 |0 + \xB0\xCA |0 + \x8F\xB0\xCA |0 + \xD0\xC1 |0 + \xB2\xBE |0 + \x8F\xB0\xCB |0 + \xB6\xC4 |0 + \x8F\xB0\xCC |0 + \xC3\xE7 |0 + \x8F\xB0\xCD |0 + \x8F\xB0\xCE |0 + \xB7\xEF |0 + \xD0\xC3 |0 + \xC7\xA4 |0 + \x8F\xF4\xA2 |0 + \x8F\xB0\xCF |0 + \x8F\xB0\xD0 |0 + \x8F\xB0\xD1 |0 + \x8F\xB0\xD2 |0 + \xB4\xEB |0 + \x8F\xB0\xD3 |0 + \x8F\xB0\xD4 |0 + \x8F\xB0\xD5 |0 + \xD0\xC4 |0 + \xB0\xCB |0 + \x8F\xB0\xD6 |0 + \x8F\xB0\xD7 |0 + \xB8\xE0 |0 + \xB4\xEC |0 + \xC9\xFA |0 + \xC8\xB2 |0 + \xB5\xD9 |0 + \x8F\xB0\xD8 |0 + \x8F\xB0\xD9 |0 + \x8F\xB0\xDA |0 + \x8F\xB0\xDB |0 + \x8F\xB0\xDC |0 + \xB2\xF1 |0 + \xD0\xE7 |0 + \xC5\xC1 |0 + \x8F\xB0\xDD |0 + \xC7\xEC |0 + \xD0\xC6 |0 + \x8F\xB0\xDE |0 + \x8F\xB0\xE0 |0 + \xC8\xBC |0 + \x8F\xB0\xE1 |0 + \xCE\xE2 |0 + \x8F\xB0\xE2 |0 + \xBF\xAD |0 + \x8F\xB0\xE3 |0 + \xBB\xC7 |0 + \x8F\xB0\xE4 |0 + \xBB\xF7 |0 + \xB2\xC0 |0 + \x8F\xB0\xE5 |0 + \x8F\xB0\xE6 |0 + \x8F\xB0\xE7 |0 + \xC4\xD1 |0 + \xC3\xA2 |0 + \xD0\xCA |0 + \x8F\xB0\xE8 |0 + \x8F\xB0\xE9 |0 + \x8F\xB0\xEA |0 + \x8F\xB0\xEB |0 + \xB0\xCC |0 + \xC4\xE3 |0 + \xBD\xBB |0 + \xBA\xB4 |0 + \xCD\xA4 |0 + \x8F\xB0\xEC |0 + \xC2\xCE |0 + \x8F\xB0\xED |0 + \xB2\xBF |0 + \x8F\xB0\xEE |0 + \xD0\xC9 |0 + \x8F\xB0\xEF |0 + \xCD\xBE |0 + \xD0\xC5 |0 + \xD0\xC7 |0 + \xBA\xEE |0 + \xD0\xC8 |0 + \xD5\xA4 |0 + \x8F\xB0\xF0 |0 + \x8F\xB0\xDF |0 + \x8F\xB0\xF1 |0 + \xD0\xD0 |0 + \x8F\xB0\xF2 |0 + \x8F\xB0\xF3 |0 + \x8F\xB0\xF4 |0 + \xD0\xD3 |0 + \xD0\xD1 |0 + \x8F\xB0\xF5 |0 + \xB2\xC2 |0 + \xCA\xBB |0 + \xD0\xCB |0 + \x8F\xB0\xF6 |0 + \x8F\xB0\xF7 |0 + \x8F\xB0\xF8 |0 + \x8F\xB0\xF9 |0 + \xD0\xCF |0 + \xB8\xF3 |0 + \x8F\xB0\xFA |0 + \x8F\xB0\xFB |0 + \xBB\xC8 |0 + \x8F\xB0\xFC |0 + \x8F\xB0\xFD |0 + \xB4\xA6 |0 + \x8F\xB0\xFE |0 + \x8F\xB1\xA1 |0 + \xD0\xD4 |0 + \xD0\xCC |0 + \x8F\xB1\xA2 |0 + \x8F\xB1\xA3 |0 + \xCE\xE3 |0 + \x8F\xB1\xA4 |0 + \xBB\xF8 |0 + \x8F\xB1\xA5 |0 + \xD0\xCD |0 + \x8F\xB1\xA6 |0 + \xD0\xD2 |0 + \x8F\xB1\xA7 |0 + \x8F\xB1\xA8 |0 + \x8F\xB1\xA9 |0 + \xD0\xD5 |0 + \x8F\xB1\xAA |0 + \xD0\xCE |0 + \x8F\xB1\xAB |0 + \x8F\xB1\xAC |0 + \xB6\xA1 |0 + \xB0\xCD |0 + \x8F\xB1\xAD |0 + \x8F\xB1\xAE |0 + \xB6\xA2 |0 + \xB2\xC1 |0 + \xD5\xA5 |0 + \xCB\xF9 |0 + \xC9\xEE |0 + \xB8\xF4 |0 + \x8F\xB1\xAF |0 + \xBF\xAF |0 + \xCE\xB7 |0 + \x8F\xB1\xB0 |0 + \x8F\xB1\xB1 |0 + \x8F\xB1\xB2 |0 + \x8F\xB1\xB3 |0 + \x8F\xB1\xB4 |0 + \x8F\xB1\xB5 |0 + \xCA\xD8 |0 + \x8F\xB1\xB6 |0 + \x8F\xB1\xB7 |0 + \xB7\xB8 |0 + \xC2\xA5 |0 + \xB2\xE4 |0 + \x8F\xB1\xB8 |0 + \x8F\xB1\xB9 |0 + \x8F\xB1\xBA |0 + \x8F\xB1\xBB |0 + \xBD\xD3 |0 + \x8F\xB1\xBC |0 + \x8F\xB1\xBD |0 + \x8F\xB1\xBE |0 + \xD0\xD9 |0 + \x8F\xB1\xBF |0 + \xD0\xDE |0 + \xD0\xDC |0 + \x8F\xB1\xC0 |0 + \xD0\xD7 |0 + \xC2\xAF |0 + \xD0\xDA |0 + \xD0\xDD |0 + \xD0\xDB |0 + \x8F\xB1\xC1 |0 + \xCA\xDD |0 + \xD0\xD8 |0 + \x8F\xB1\xC2 |0 + \xBF\xAE |0 + \x8F\xB1\xC3 |0 + \xCB\xF3 |0 + \xD0\xDF |0 + \xD0\xE0 |0 + \xBD\xA4 |0 + \xD0\xED |0 + \x8F\xB1\xC4 |0 + \x8F\xB1\xC5 |0 + \xC7\xD0 |0 + \xC9\xB6 |0 + \xD0\xE8 |0 + \xCA\xF0 |0 + \xB2\xB6 |0 + \x8F\xB1\xC6 |0 + \x8F\xB1\xC7 |0 + \xD0\xEC |0 + \x8F\xB1\xC8 |0 + \x8F\xB1\xC9 |0 + \x8F\xB1\xCA |0 + \x8F\xB1\xCB |0 + \xD0\xE6 |0 + \xD0\xEF |0 + \x8F\xB1\xCC |0 + \xC1\xD2 |0 + \x8F\xB1\xCD |0 + \xB8\xC4 |0 + \x8F\xB1\xCE |0 + \xC7\xDC |0 + \x8F\xB1\xCF |0 + \xE0\xC7 |0 + \x8F\xB1\xD0 |0 + \xD0\xEE |0 + \xC5\xDD |0 + \x8F\xB1\xD1 |0 + \xD0\xE3 |0 + \xB8\xF6 |0 + \x8F\xB1\xD2 |0 + \x8F\xB1\xD3 |0 + \xB8\xF5 |0 + \xD0\xE1 |0 + \x8F\xB1\xD4 |0 + \x8F\xB1\xD5 |0 + \x8F\xB1\xD6 |0 + \x8F\xB1\xD7 |0 + \xBC\xDA |0 + \xD0\xE9 |0 + \x8F\xB1\xD8 |0 + \xCA\xEF |0 + \xC3\xCD |0 + \xD0\xE5 |0 + \xB7\xF1 |0 + \x8F\xB1\xD9 |0 + \xD0\xE2 |0 + \xD0\xEA |0 + \xD0\xE4 |0 + \xCE\xD1 |0 + \xD0\xEB |0 + \xCF\xC1 |0 + \x8F\xB1\xDA |0 + \x8F\xB1\xDB |0 + \x8F\xB1\xDC |0 + \x8F\xB1\xDD |0 + \x8F\xB1\xDE |0 + \xB6\xE6 |0 + \xB7\xF0 |0 + \x8F\xB1\xF6 |0 + \x8F\xB1\xDF |0 + \x8F\xB1\xE0 |0 + \x8F\xB1\xE1 |0 + \xD0\xF0 |0 + \x8F\xB1\xE2 |0 + \x8F\xB1\xE3 |0 + \xD0\xF1 |0 + \xD0\xF5 |0 + \xB0\xCE |0 + \x8F\xB1\xE4 |0 + \x8F\xB1\xE5 |0 + \x8F\xB1\xE6 |0 + \xCA\xD0 |0 + \xD0\xF4 |0 + \x8F\xB1\xE7 |0 + \x8F\xB1\xE8 |0 + \x8F\xB1\xE9 |0 + \xD0\xF3 |0 + \xD0\xF7 |0 + \x8F\xB1\xEA |0 + \x8F\xB1\xEB |0 + \xD0\xF6 |0 + \xC4\xE4 |0 + \x8F\xB1\xEC |0 + \x8F\xB1\xED |0 + \x8F\xB1\xEE |0 + \x8F\xB1\xEF |0 + \xB7\xF2 |0 + \x8F\xB1\xF0 |0 + \x8F\xB1\xF1 |0 + \x8F\xB1\xF2 |0 + \xD0\xF8 |0 + \x8F\xB1\xF3 |0 + \x8F\xB1\xF4 |0 + \x8F\xB1\xF5 |0 + \xBC\xC5 |0 + \xC2\xA6 |0 + \xC4\xE5 |0 + \xB6\xF6 |0 + \xD0\xF9 |0 + \xB5\xB6 |0 + \xD0\xFA |0 + \x8F\xB1\xF7 |0 + \x8F\xB1\xF8 |0 + \x8F\xB1\xF9 |0 + \xD0\xFC |0 + \x8F\xB1\xFA |0 + \x8F\xB1\xFB |0 + \xCB\xB5 |0 + \x8F\xB1\xFC |0 + \x8F\xB1\xFD |0 + \x8F\xB1\xFE |0 + \xB7\xE6 |0 + \x8F\xB2\xA1 |0 + \x8F\xB2\xA2 |0 + \x8F\xB2\xA3 |0 + \x8F\xB2\xA4 |0 + \xBB\xB1 |0 + \xC8\xF7 |0 + \xD0\xFB |0 + \x8F\xB2\xA5 |0 + \x8F\xB2\xA6 |0 + \x8F\xB2\xA7 |0 + \x8F\xB2\xA8 |0 + \x8F\xB2\xA9 |0 + \x8F\xB2\xAA |0 + \x8F\xB2\xAB |0 + \x8F\xB2\xAC |0 + \xBA\xC5 |0 + \xCD\xC3 |0 + \x8F\xB2\xAD |0 + \x8F\xB2\xAE |0 + \xD0\xFE |0 + \xD1\xA3 |0 + \xD0\xFD |0 + \xBA\xC4 |0 + \xBD\xFD |0 + \x8F\xB2\xAF |0 + \x8F\xB2\xB0 |0 + \x8F\xB2\xB1 |0 + \xB7\xB9 |0 + \x8F\xB2\xB2 |0 + \xD1\xA4 |0 + \x8F\xB2\xB3 |0 + \x8F\xB2\xB4 |0 + \xB6\xCF |0 + \x8F\xB2\xB5 |0 + \xD1\xA1 |0 + \xD1\xA2 |0 + \x8F\xB2\xB6 |0 + \xC6\xAF |0 + \x8F\xB2\xB7 |0 + \xC1\xFC |0 + \x8F\xB2\xB8 |0 + \xB6\xA3 |0 + \x8F\xB2\xB9 |0 + \x8F\xB2\xBA |0 + \xCB\xCD |0 + \xD1\xA5 |0 + \x8F\xB2\xBB |0 + \xCE\xBD |0 + \x8F\xB2\xBC |0 + \x8F\xB2\xBD |0 + \xD1\xA6 |0 + \x8F\xB2\xBE |0 + \x8F\xB2\xBF |0 + \xD1\xA9 |0 + \x8F\xB2\xC0 |0 + \xD1\xA7 |0 + \x8F\xB2\xC1 |0 + \xC1\xCE |0 + \x8F\xB2\xC2 |0 + \x8F\xB2\xC3 |0 + \xD1\xA8 |0 + \xD1\xAA |0 + \x8F\xB2\xC4 |0 + \x8F\xB2\xC5 |0 + \x8F\xB2\xD1 |0 + \x8F\xF4\xA3 |0 + \xD1\xAC |0 + \x8F\xB2\xC6 |0 + \xD1\xAB |0 + \x8F\xB2\xC7 |0 + \xCA\xC8 |0 + \x8F\xB2\xC8 |0 + \xB5\xB7 |0 + \xD1\xAE |0 + \xD1\xAF |0 + \x8F\xB2\xC9 |0 + \xB2\xAF |0 + \x8F\xB2\xCA |0 + \x8F\xB2\xCB |0 + \x8F\xB2\xCC |0 + \xD1\xAD |0 + \x8F\xB2\xCD |0 + \x8F\xB2\xCE |0 + \x8F\xB2\xCF |0 + \x8F\xB2\xD0 |0 + \x8F\xB2\xD2 |0 + \xBC\xF4 |0 + \xD1\xB2 |0 + \xD1\xB1 |0 + \xD1\xB0 |0 + \x8F\xB2\xD3 |0 + \xD0\xD6 |0 + \x8F\xB2\xD4 |0 + \xD1\xB3 |0 + \x8F\xB2\xD5 |0 + \x8F\xB2\xD6 |0 + \x8F\xB2\xD7 |0 + \x8F\xB2\xD8 |0 + \xBD\xFE |0 + \xD1\xB4 |0 + \x8F\xB2\xD9 |0 + \x8F\xB2\xDA |0 + \x8F\xB2\xDB |0 + \xCD\xA5 |0 + \x8F\xB2\xDC |0 + \x8F\xB2\xDD |0 + \x8F\xB2\xDE |0 + \x8F\xB2\xDF |0 + \xCC\xD9 |0 + \x8F\xB2\xE0 |0 + \x8F\xB2\xE1 |0 + \x8F\xB2\xE2 |0 + \xD1\xB6 |0 + \x8F\xB2\xE3 |0 + \x8F\xB2\xE4 |0 + \xD1\xB5 |0 + \xD1\xB8 |0 + \xD1\xB7 |0 + \xD1\xB9 |0 + \xD1\xBA |0 + \xB0\xF4 |0 + \x8F\xB2\xE5 |0 + \xB8\xB5 |0 + \xB7\xBB |0 + \xBD\xBC |0 + \xC3\xFB |0 + \xB6\xA4 |0 + \xC0\xE8 |0 + \xB8\xF7 |0 + \x8F\xB2\xE6 |0 + \xB9\xEE |0 + \xD1\xBC |0 + \xCC\xC8 |0 + \xC5\xC6 |0 + \x8F\xB2\xE7 |0 + \xBB\xF9 |0 + \xD1\xBB |0 + \x8F\xB2\xE8 |0 + \xD1\xBD |0 + \x8F\xB2\xE9 |0 + \x8F\xB2\xEA |0 + \x8F\xB2\xEB |0 + \xC5\xDE |0 + \xB3\xF5 |0 + \x8F\xB2\xEC |0 + \xD1\xBE |0 + \x8F\xB2\xED |0 + \xC6\xFE |0 + \x8F\xB2\xEE |0 + \xC1\xB4 |0 + \xD1\xC0 |0 + \xD1\xC1 |0 + \xC8\xAC |0 + \xB8\xF8 |0 + \xCF\xBB |0 + \xD1\xC2 |0 + \xB6\xA6 |0 + \xCA\xBC |0 + \xC2\xB6 |0 + \xB6\xF1 |0 + \xC5\xB5 |0 + \xB7\xF3 |0 + \x8F\xB2\xEF |0 + \xD1\xC3 |0 + \xD1\xC4 |0 + \x8F\xB2\xF0 |0 + \x8F\xB2\xF1 |0 + \xC6\xE2 |0 + \xB1\xDF |0 + \xD1\xC7 |0 + \xBA\xFD |0 + \x8F\xB2\xF2 |0 + \xD1\xC6 |0 + \xBA\xC6 |0 + \x8F\xB2\xF3 |0 + \xD1\xC8 |0 + \xE6\xEE |0 + \xD1\xC9 |0 + \xCB\xC1 |0 + \xD1\xCA |0 + \xD1\xCB |0 + \xD1\xCC |0 + \xBE\xE9 |0 + \x8F\xB2\xF4 |0 + \xBC\xCC |0 + \x8F\xB2\xF5 |0 + \xB4\xA7 |0 + \x8F\xB2\xF6 |0 + \xD1\xCF |0 + \x8F\xB2\xF7 |0 + \xD1\xCD |0 + \xCC\xBD |0 + \xD1\xCE |0 + \xC9\xDA |0 + \xD1\xD0 |0 + \xD1\xD1 |0 + \xD1\xD2 |0 + \xC5\xDF |0 + \x8F\xB2\xF8 |0 + \xD1\xD6 |0 + \xD1\xD4 |0 + \xD1\xD5 |0 + \xD1\xD3 |0 + \xBA\xE3 |0 + \xD1\xD7 |0 + \xCC\xEA |0 + \xCE\xE4 |0 + \x8F\xB2\xF9 |0 + \x8F\xB2\xFA |0 + \x8F\xB2\xFB |0 + \xD1\xD8 |0 + \x8F\xB2\xFC |0 + \x8F\xB2\xFD |0 + \x8F\xB2\xFE |0 + \xC0\xA8 |0 + \xD1\xD9 |0 + \xBD\xDA |0 + \x8F\xB3\xA1 |0 + \xD1\xDA |0 + \xC3\xFC |0 + \xCE\xBF |0 + \xC5\xE0 |0 + \x8F\xB3\xA2 |0 + \x8F\xB3\xA3 |0 + \x8F\xB3\xA4 |0 + \x8F\xB3\xA5 |0 + \x8F\xB3\xA6 |0 + \xD2\xC5 |0 + \x8F\xB3\xA7 |0 + \xD1\xDB |0 + \xF4\xA5 |0 + \xB6\xC5 |0 + \x8F\xB3\xA8 |0 + \xD1\xDC |0 + \xCB\xDE |0 + \x8F\xB3\xA9 |0 + \x8F\xB3\xAA |0 + \xBD\xE8 |0 + \xC2\xFC |0 + \xD1\xDE |0 + \xC6\xE4 |0 + \x8F\xF4\xA4 |0 + \xD1\xDF |0 + \x8F\xB3\xAB |0 + \xD1\xE0 |0 + \xB3\xAE |0 + \x8F\xB3\xAC |0 + \x8F\xB3\xAD |0 + \x8F\xB3\xAE |0 + \xD1\xE1 |0 + \xB6\xA7 |0 + \x8F\xB3\xAF |0 + \xC6\xCC |0 + \xB1\xFA |0 + \xBD\xD0 |0 + \xC8\xA1 |0 + \xD1\xE2 |0 + \xC5\xE1 |0 + \x8F\xB3\xB0 |0 + \x8F\xB3\xB1 |0 + \xBF\xCF |0 + \xD1\xE3 |0 + \x8F\xB3\xB2 |0 + \xCA\xAC |0 + \xC0\xDA |0 + \xB4\xA2 |0 + \xB4\xA9 |0 + \xD1\xE4 |0 + \xD1\xE6 |0 + \xB7\xBA |0 + \x8F\xB3\xB3 |0 + \x8F\xB3\xB4 |0 + \xD1\xE5 |0 + \x8F\xB3\xB5 |0 + \x8F\xB3\xB6 |0 + \xCE\xF3 |0 + \x8F\xB3\xB7 |0 + \xBD\xE9 |0 + \x8F\xB3\xB8 |0 + \xC8\xBD |0 + \xCA\xCC |0 + \xD1\xE7 |0 + \x8F\xB3\xB9 |0 + \xCD\xF8 |0 + \xD1\xE8 |0 + \xD1\xE9 |0 + \xC5\xFE |0 + \x8F\xB3\xBA |0 + \x8F\xB3\xBB |0 + \xD1\xEA |0 + \x8F\xB3\xBC |0 + \xC0\xA9 |0 + \xBA\xFE |0 + \xB7\xF4 |0 + \xD1\xEB |0 + \xBB\xC9 |0 + \xB9\xEF |0 + \x8F\xB3\xBD |0 + \xC4\xE6 |0 + \xD1\xED |0 + \x8F\xB3\xBE |0 + \xC2\xA7 |0 + \x8F\xB3\xBF |0 + \xBA\xEF |0 + \xD1\xEE |0 + \xD1\xEF |0 + \xC1\xB0 |0 + \xD1\xEC |0 + \xD1\xF1 |0 + \x8F\xB3\xC0 |0 + \xCB\xB6 |0 + \x8F\xB3\xC1 |0 + \x8F\xB3\xC2 |0 + \x8F\xB3\xC3 |0 + \xB9\xE4 |0 + \x8F\xB3\xC4 |0 + \xC7\xED |1 + \xD1\xF0 |0 + \x8F\xB3\xC5 |0 + \x8F\xB3\xC6 |0 + \x8F\xB3\xC7 |0 + \xB7\xF5 |0 + \xBA\xDE |0 + \xC7\xED |0 + \x8F\xB3\xC8 |0 + \xD1\xF4 |0 + \xD1\xF2 |0 + \x8F\xB3\xC9 |0 + \xC9\xFB |0 + \xBE\xEA |0 + \xD1\xFB |0 + \xB3\xE4 |0 + \xD1\xF5 |0 + \xD1\xF3 |0 + \xC1\xCF |0 + \x8F\xB3\xCA |0 + \x8F\xB3\xCB |0 + \x8F\xB3\xCC |0 + \xD1\xF7 |0 + \xD1\xF6 |0 + \x8F\xB3\xCD |0 + \x8F\xB3\xCE |0 + \xB3\xC4 |0 + \x8F\xB3\xCF |0 + \xB7\xE0 |0 + \xD1\xFC |0 + \xCE\xAD |0 + \x8F\xB3\xD0 |0 + \x8F\xB3\xD1 |0 + \xD1\xF8 |0 + \xD1\xFD |0 + \xD1\xFA |0 + \x8F\xB3\xD2 |0 + \xD1\xF9 |0 + \x8F\xB3\xD3 |0 + \x8F\xB3\xD4 |0 + \x8F\xB3\xD5 |0 + \x8F\xB3\xD6 |0 + \x8F\xB3\xD7 |0 + \xCE\xCF |0 + \x8F\xB3\xD8 |0 + \xB8\xF9 |0 + \xB2\xC3 |0 + \xCE\xF4 |0 + \x8F\xB3\xD9 |0 + \x8F\xB3\xDA |0 + \x8F\xB3\xDB |0 + \x8F\xB3\xDC |0 + \xBD\xF5 |0 + \xC5\xD8 |0 + \xB9\xE5 |0 + \xD2\xA2 |0 + \xD2\xA3 |0 + \x8F\xB3\xDD |0 + \x8F\xB3\xDE |0 + \xCE\xE5 |0 + \xCF\xAB |0 + \xD2\xA5 |0 + \x8F\xB3\xDF |0 + \x8F\xB3\xE0 |0 + \x8F\xB3\xE1 |0 + \xB8\xFA |0 + \x8F\xB3\xE2 |0 + \x8F\xB3\xE3 |0 + \xD2\xA4 |0 + \x8F\xB3\xE4 |0 + \xB3\xAF |0 + \x8F\xB3\xE5 |0 + \xD2\xA6 |0 + \xCB\xD6 |0 + \x8F\xB3\xE6 |0 + \xC4\xBC |0 + \x8F\xB3\xE7 |0 + \xCD\xA6 |0 + \x8F\xB3\xE8 |0 + \xCA\xD9 |0 + \x8F\xB3\xE9 |0 + \xD2\xA7 |0 + \x8F\xB3\xEA |0 + \x8F\xB3\xEB |0 + \xF0\xD5 |0 + \x8F\xB3\xEC |0 + \xC6\xB0 |0 + \x8F\xB3\xED |0 + \xD2\xA8 |0 + \xB4\xAA |0 + \xCC\xB3 |0 + \x8F\xB3\xEE |0 + \x8F\xB3\xEF |0 + \xBE\xA1 |0 + \xD2\xA9 |0 + \xCA\xE7 |0 + \xD2\xAD |0 + \x8F\xB3\xF0 |0 + \xC0\xAA |0 + \xD2\xAA |0 + \xB6\xD0 |0 + \x8F\xB3\xF1 |0 + \xD2\xAB |0 + \xB4\xAB |0 + \x8F\xB3\xF2 |0 + \x8F\xB3\xF3 |0 + \x8F\xB3\xF4 |0 + \x8F\xB3\xF5 |0 + \x8F\xB3\xF6 |0 + \x8F\xB3\xF7 |0 + \xB7\xAE |0 + \xD2\xAE |0 + \x8F\xB3\xF8 |0 + \xD2\xAF |0 + \x8F\xB3\xF9 |0 + \x8F\xB3\xFA |0 + \xD2\xB0 |0 + \xD2\xB1 |0 + \xBC\xDB |0 + \xB8\xFB |0 + \xCC\xDE |0 + \x8F\xB3\xFB |0 + \xCC\xE8 |0 + \xC6\xF7 |0 + \x8F\xB3\xFC |0 + \xCA\xF1 |0 + \xD2\xB2 |0 + \x8F\xF4\xA5 |0 + \xD2\xB3 |0 + \x8F\xB3\xFD |0 + \x8F\xB3\xFE |0 + \x8F\xB4\xA1 |0 + \xD2\xB5 |0 + \xD2\xB7 |0 + \xD2\xB6 |0 + \x8F\xB4\xA2 |0 + \x8F\xB4\xA3 |0 + \xD2\xB8 |0 + \xB2\xBD |0 + \xCB\xCC |0 + \x8F\xB4\xA4 |0 + \xBA\xFC |0 + \xD2\xB9 |0 + \x8F\xB4\xA5 |0 + \x8F\xB4\xA6 |0 + \xC1\xD9 |0 + \x8F\xB4\xA7 |0 + \x8F\xB4\xA8 |0 + \xBE\xA2 |0 + \xB6\xA9 |0 + \xD2\xBA |0 + \x8F\xF4\xA6 |0 + \x8F\xB4\xA9 |0 + \x8F\xB4\xAA |0 + \x8F\xB4\xAB |0 + \x8F\xB4\xAC |0 + \xC8\xDB |0 + \x8F\xB4\xAD |0 + \x8F\xB4\xAE |0 + \x8F\xB4\xAF |0 + \xD2\xBB |0 + \x8F\xB4\xB0 |0 + \xD2\xBC |0 + \x8F\xB4\xB1 |0 + \xD2\xBD |0 + \x8F\xB4\xB2 |0 + \xD2\xBE |0 + \xC9\xA4 |0 + \xB6\xE8 |0 + \xB0\xE5 |0 + \x8F\xB4\xB3 |0 + \x8F\xB4\xB4 |0 + \x8F\xB4\xB5 |0 + \xC6\xBF |0 + \xD2\xBF |0 + \xBD\xBD |0 + \x8F\xB4\xB6 |0 + \xC0\xE9 |0 + \xD2\xC1 |0 + \xD2\xC0 |0 + \xBE\xA3 |0 + \xB8\xE1 |0 + \xD2\xC3 |0 + \xC8\xBE |0 + \x8F\xB4\xB8 |0 + \x8F\xB4\xB7 |0 + \xD2\xC4 |0 + \xC8\xDC |0 + \xC2\xB4 |0 + \xC2\xEE |0 + \xB6\xA8 |0 + \xC6\xEE |0 + \xC3\xB1 |0 + \x8F\xB4\xB9 |0 + \xC7\xEE |0 + \x8F\xB4\xBA |0 + \xCB\xCE |0 + \xD2\xC6 |0 + \xC0\xEA |0 + \x8F\xB4\xBB |0 + \x8F\xB4\xBC |0 + \x8F\xB4\xBD |0 + \xB7\xB5 |0 + \xD2\xC7 |0 + \x8F\xB4\xBE |0 + \x8F\xB4\xBF |0 + \xD2\xC8 |0 + \xB1\xAC |0 + \xB0\xF5 |0 + \xB4\xED |0 + \x8F\xB4\xC0 |0 + \xC2\xA8 |0 + \xB5\xD1 |0 + \xCD\xF1 |0 + \xD2\xCB |0 + \xB2\xB7 |0 + \x8F\xB4\xC1 |0 + \xD2\xCA |0 + \x8F\xB4\xC2 |0 + \xB6\xAA |0 + \xD2\xCC |0 + \x8F\xB4\xC3 |0 + \xCC\xF1 |0 + \x8F\xB4\xC4 |0 + \x8F\xB4\xC5 |0 + \x8F\xB4\xC6 |0 + \x8F\xB4\xC7 |0 + \x8F\xB4\xC8 |0 + \xD2\xCD |0 + \xCE\xD2 |0 + \x8F\xB4\xC9 |0 + \xB8\xFC |0 + \x8F\xB4\xCA |0 + \xB8\xB6 |0 + \xD2\xCE |0 + \x8F\xB4\xCB |0 + \x8F\xB4\xCC |0 + \xD2\xD0 |0 + \xD2\xCF |0 + \xBF\xDF |0 + \xB1\xB9 |0 + \x8F\xB4\xCD |0 + \x8F\xB4\xCE |0 + \xB1\xDE |0 + \xD2\xD1 |0 + \x8F\xB4\xCF |0 + \xD2\xD2 |0 + \x8F\xB4\xD0 |0 + \xB8\xB7 |0 + \x8F\xB4\xD1 |0 + \x8F\xB4\xD2 |0 + \xD2\xD3 |0 + \x8F\xB4\xD3 |0 + \x8F\xB4\xD4 |0 + \x8F\xB4\xD5 |0 + \xB5\xEE |0 + \x8F\xB4\xD6 |0 + \x8F\xB4\xD7 |0 + \xBB\xB2 |0 + \xD2\xD4 |0 + \x8F\xB4\xD8 |0 + \xCB\xF4 |0 + \xBA\xB5 |0 + \xB5\xDA |0 + \xCD\xA7 |0 + \xC1\xD0 |0 + \xC8\xBF |0 + \xBC\xFD |0 + \x8F\xB4\xD9 |0 + \x8F\xB4\xDA |0 + \x8F\xB4\xDB |0 + \xBD\xC7 |0 + \x8F\xB4\xDC |0 + \xBC\xE8 |0 + \xBC\xF5 |0 + \xBD\xF6 |0 + \x8F\xB4\xDD |0 + \xC8\xC0 |0 + \x8F\xB4\xDE |0 + \x8F\xB4\xDF |0 + \xD2\xD7 |0 + \x8F\xB4\xE0 |0 + \xB1\xC3 |0 + \xC1\xD1 |0 + \xB8\xFD |0 + \xB8\xC5 |0 + \xB6\xE7 |0 + \x8F\xB4\xE1 |0 + \x8F\xB4\xE2 |0 + \xD2\xDB |0 + \xC3\xA1 |0 + \xC2\xFE |0 + \xB6\xAB |0 + \xBE\xA4 |0 + \xD2\xDC |0 + \xD2\xDA |0 + \xB2\xC4 |0 + \xC2\xE6 |0 + \xBC\xB8 |0 + \xBB\xCB |0 + \xB1\xA6 |0 + \x8F\xB4\xE3 |0 + \xB3\xF0 |0 + \xB9\xE6 |0 + \xBB\xCA |0 + \xD2\xDD |0 + \xD2\xDE |0 + \x8F\xB4\xE4 |0 + \xB5\xC9 |0 + \xB3\xC6 |0 + \xB9\xE7 |0 + \xB5\xC8 |0 + \xC4\xDF |0 + \xB1\xA5 |0 + \xC6\xB1 |0 + \xCC\xBE |0 + \xB9\xA1 |0 + \xCD\xF9 |0 + \xC5\xC7 |0 + \xB8\xFE |0 + \x8F\xB4\xE5 |0 + \x8F\xB4\xE6 |0 + \xB7\xAF |0 + \xD2\xE7 |0 + \xB6\xE3 |0 + \xCB\xCA |0 + \x8F\xB4\xE7 |0 + \xC8\xDD |0 + \x8F\xB4\xE8 |0 + \x8F\xB4\xE9 |0 + \xD2\xE6 |0 + \x8F\xB4\xEA |0 + \xB4\xDE |0 + \xD2\xE1 |0 + \xD2\xE2 |0 + \xD2\xE4 |0 + \x8F\xB4\xEB |0 + \x8F\xB4\xEC |0 + \x8F\xB4\xED |0 + \x8F\xB4\xEE |0 + \xD2\xE5 |0 + \xB5\xDB |0 + \xBF\xE1 |0 + \xCA\xAD |0 + \xD2\xE3 |0 + \xD2\xDF |0 + \xB8\xE3 |0 + \xD2\xE0 |0 + \xCF\xA4 |0 + \x8F\xB4\xEF |0 + \x8F\xB4\xF0 |0 + \xCA\xF2 |0 + \x8F\xB4\xF1 |0 + \xC4\xE8 |0 + \xB8\xE2 |0 + \xB9\xF0 |0 + \x8F\xB4\xF2 |0 + \xD2\xE8 |0 + \x8F\xB4\xF3 |0 + \xC6\xDD |0 + \x8F\xB4\xF4 |0 + \xD2\xEC |0 + \x8F\xB4\xF5 |0 + \x8F\xB4\xF6 |0 + \x8F\xB4\xF7 |0 + \x8F\xB4\xF8 |0 + \xBC\xFE |0 + \x8F\xB4\xF9 |0 + \xBC\xF6 |0 + \x8F\xB4\xFA |0 + \x8F\xB4\xFB |0 + \x8F\xB4\xFC |0 + \xD2\xEF |0 + \xD2\xED |0 + \xCC\xA3 |0 + \x8F\xB4\xFD |0 + \xD2\xEA |0 + \xD2\xF3 |0 + \xD2\xEE |0 + \xD2\xF1 |0 + \xB8\xC6 |0 + \xCC\xBF |0 + \x8F\xB4\xFE |0 + \xD2\xF2 |0 + \x8F\xB5\xA1 |0 + \x8F\xB5\xA2 |0 + \xD2\xF4 |0 + \x8F\xB5\xA3 |0 + \xD2\xF6 |0 + \x8F\xB5\xA4 |0 + \x8F\xB5\xA5 |0 + \x8F\xF4\xA8 |0 + \xBA\xF0 |0 + \xCF\xC2 |0 + \x8F\xB5\xA6 |0 + \xD2\xEB |0 + \xD2\xE9 |0 + \xD2\xF5 |0 + \x8F\xB5\xA7 |0 + \xD2\xF0 |0 + \x8F\xB5\xA8 |0 + \x8F\xB5\xA9 |0 + \x8F\xB5\xAA |0 + \x8F\xB5\xAB |0 + \x8F\xB5\xAC |0 + \xD2\xF8 |0 + \xD3\xA3 |0 + \xD2\xFA |0 + \x8F\xB5\xAD |0 + \x8F\xB5\xAE |0 + \xD2\xFE |0 + \x8F\xB5\xAF |0 + \x8F\xB5\xB0 |0 + \xD3\xA1 |0 + \xD2\xFB |0 + \x8F\xB5\xB1 |0 + \x8F\xB5\xB2 |0 + \xD3\xBE |0 + \x8F\xB5\xB3 |0 + \xBA\xE9 |0 + \xB3\xB1 |0 + \x8F\xB5\xB4 |0 + \xD2\xF9 |0 + \x8F\xB5\xB5 |0 + \x8F\xB5\xB6 |0 + \x8F\xB5\xB7 |0 + \xD3\xA5 |0 + \xB0\xF6 |0 + \xD3\xA4 |0 + \x8F\xB5\xB8 |0 + \xB0\xA5 |0 + \xC9\xCA |0 + \xD3\xA2 |0 + \xD2\xFC |0 + \x8F\xB5\xB9 |0 + \xD2\xF7 |0 + \xD2\xFD |0 + \xBA\xC8 |0 + \x8F\xB5\xBA |0 + \x8F\xB5\xBB |0 + \x8F\xB5\xBC |0 + \xD3\xA6 |0 + \x8F\xB5\xBD |0 + \xB0\xF7 |0 + \xD3\xAF |0 + \xD3\xA7 |0 + \xD3\xA8 |0 + \xBE\xA5 |0 + \xCB\xE9 |0 + \x8F\xB5\xBE |0 + \x8F\xB5\xBF |0 + \xD3\xAD |0 + \xD3\xAC |0 + \x8F\xB5\xC0 |0 + \xC5\xAF |0 + \x8F\xB5\xC1 |0 + \xD3\xAE |0 + \x8F\xB5\xC2 |0 + \xD3\xAB |0 + \x8F\xB5\xC3 |0 + \x8F\xB5\xC4 |0 + \x8F\xB5\xC5 |0 + \x8F\xB5\xC6 |0 + \xB1\xB4 |0 + \x8F\xB5\xC7 |0 + \xBA\xB6 |0 + \xBF\xB0 |0 + \x8F\xB5\xC8 |0 + \x8F\xB5\xC9 |0 + \x8F\xB5\xCA |0 + \x8F\xB5\xCB |0 + \x8F\xB5\xCC |0 + \xD3\xA9 |0 + \xC5\xE2 |0 + \xD3\xAA |0 + \x8F\xB5\xCD |0 + \xB0\xA2 |0 + \x8F\xB5\xCE |0 + \x8F\xB5\xCF |0 + \xD3\xB4 |0 + \xCD\xA3 |0 + \xBE\xA7 |0 + \x8F\xB5\xD0 |0 + \xD3\xBA |0 + \x8F\xB5\xD1 |0 + \x8F\xB5\xD2 |0 + \xD3\xB9 |0 + \xD3\xB0 |0 + \x8F\xB5\xD3 |0 + \x8F\xB5\xD4 |0 + \x8F\xB5\xD5 |0 + \xC2\xC3 |0 + \xD3\xB1 |0 + \x8F\xB5\xD6 |0 + \xC2\xEF |0 + \xD3\xB6 |0 + \xBE\xA6 |0 + \x8F\xB5\xD7 |0 + \x8F\xB5\xD8 |0 + \x8F\xB5\xD9 |0 + \xD3\xB3 |0 + \x8F\xB5\xDA |0 + \xCC\xE4 |0 + \x8F\xB5\xDB |0 + \x8F\xB5\xDC |0 + \xB7\xBC |0 + \xD3\xB7 |0 + \xD3\xB8 |0 + \x8F\xB5\xDD |0 + \x8F\xB5\xDE |0 + \x8F\xB5\xDF |0 + \xD3\xB5 |0 + \xD3\xBB |0 + \x8F\xB5\xE0 |0 + \x8F\xB5\xE1 |0 + \x8F\xB5\xE2 |0 + \xD3\xB2 |0 + \x8F\xB5\xE3 |0 + \x8F\xB5\xE4 |0 + \xD3\xC1 |0 + \xD3\xC6 |0 + \xD3\xC2 |0 + \x8F\xB5\xE5 |0 + \xD3\xBD |0 + \x8F\xB5\xE6 |0 + \x8F\xB5\xE7 |0 + \xD3\xC7 |0 + \xC1\xB1 |0 + \x8F\xB5\xE8 |0 + \xD3\xC9 |0 + \x8F\xB5\xE9 |0 + \xB9\xA2 |0 + \xD3\xBF |0 + \xC3\xFD |0 + \x8F\xB5\xEA |0 + \x8F\xB5\xEB |0 + \x8F\xB5\xEC |0 + \x8F\xB5\xED |0 + \x8F\xB5\xEE |0 + \x8F\xB5\xEF |0 + \x8F\xB5\xF0 |0 + \xD3\xC3 |0 + \xD3\xBC |0 + \xB4\xAD |0 + \xB4\xEE |0 + \xB3\xE5 |0 + \xD3\xC4 |0 + \xD3\xC0 |0 + \x8F\xB5\xF1 |0 + \x8F\xB5\xF2 |0 + \xB7\xF6 |0 + \xD3\xCA |0 + \xD3\xC8 |0 + \xC1\xD3 |0 + \xB5\xCA |0 + \xB6\xAC |0 + \x8F\xB5\xF3 |0 + \xD3\xC5 |0 + \xB6\xF4 |0 + \x8F\xB5\xF4 |0 + \xB1\xC4 |0 + \x8F\xB5\xF5 |0 + \x8F\xB5\xF6 |0 + \x8F\xB5\xF7 |0 + \xD3\xCE |0 + \xD3\xCC |0 + \x8F\xB5\xF8 |0 + \xD4\xA7 |0 + \x8F\xB5\xF9 |0 + \x8F\xB5\xFA |0 + \x8F\xB5\xFB |0 + \x8F\xB5\xFC |0 + \x8F\xB5\xFD |0 + \x8F\xB5\xFE |0 + \x8F\xB6\xA1 |0 + \xD3\xD1 |0 + \x8F\xB6\xA2 |0 + \x8F\xB6\xA3 |0 + \xD3\xCB |0 + \x8F\xB6\xA4 |0 + \xD3\xCF |0 + \x8F\xB6\xA5 |0 + \xD3\xCD |0 + \x8F\xB6\xA6 |0 + \xBB\xCC |0 + \xD3\xD0 |0 + \x8F\xB6\xA7 |0 + \x8F\xB6\xA8 |0 + \xD3\xD3 |0 + \xD3\xD8 |0 + \xD3\xD6 |0 + \xD3\xD5 |0 + \x8F\xB6\xA9 |0 + \x8F\xB6\xAA |0 + \xC3\xB2 |0 + \x8F\xB6\xAB |0 + \xB2\xC5 |0 + \x8F\xB6\xAC |0 + \x8F\xB6\xAD |0 + \x8F\xB6\xAE |0 + \x8F\xB6\xAF |0 + \x8F\xB6\xB0 |0 + \x8F\xB6\xB1 |0 + \x8F\xB6\xB2 |0 + \xD3\xD2 |0 + \xD3\xD4 |0 + \xBE\xA8 |0 + \xB1\xB3 |0 + \x8F\xB6\xB3 |0 + \xD3\xD7 |0 + \xB2\xDE |0 + \x8F\xB6\xB4 |0 + \xD3\xE2 |0 + \x8F\xB6\xB5 |0 + \xBE\xFC |0 + \xD3\xDE |0 + \x8F\xB6\xB6 |0 + \xD3\xDC |0 + \x8F\xB6\xB7 |0 + \xD3\xDD |0 + \x8F\xB6\xB8 |0 + \xD3\xDF |0 + \x8F\xB6\xB9 |0 + \x8F\xB6\xBA |0 + \x8F\xB6\xBB |0 + \x8F\xB6\xBC |0 + \x8F\xB6\xBD |0 + \x8F\xB6\xBE |0 + \x8F\xB6\xBF |0 + \xB1\xBD |0 + \x8F\xB6\xC0 |0 + \x8F\xB6\xC1 |0 + \x8F\xB6\xC2 |0 + \x8F\xB6\xC3 |0 + \x8F\xB6\xC4 |0 + \xC1\xB9 |0 + \x8F\xB6\xC5 |0 + \xD3\xD9 |0 + \x8F\xB6\xC6 |0 + \xD3\xDA |0 + \x8F\xB6\xC7 |0 + \xB3\xFA |0 + \x8F\xB6\xC8 |0 + \x8F\xB6\xC9 |0 + \x8F\xB6\xCA |0 + \x8F\xB6\xCB |0 + \x8F\xB6\xCC |0 + \xD3\xE1 |0 + \x8F\xB6\xCD |0 + \xB4\xEF |0 + \x8F\xB6\xCE |0 + \xD3\xE4 |0 + \xD3\xE0 |0 + \xD3\xE3 |0 + \x8F\xB6\xCF |0 + \x8F\xB6\xD0 |0 + \x8F\xB6\xD1 |0 + \x8F\xB6\xD2 |0 + \xCA\xAE |0 + \x8F\xB6\xD3 |0 + \xC6\xD5 |0 + \xC8\xB8 |0 + \xD3\xE6 |0 + \x8F\xB6\xD4 |0 + \x8F\xB6\xD5 |0 + \xD3\xE5 |0 + \xB3\xC5 |0 + \x8F\xB6\xD6 |0 + \xD3\xE7 |0 + \x8F\xB6\xD7 |0 + \x8F\xB6\xD8 |0 + \xD3\xEA |0 + \xD3\xE9 |0 + \x8F\xB6\xD9 |0 + \x8F\xB6\xDA |0 + \x8F\xB6\xDB |0 + \x8F\xB6\xDC |0 + \x8F\xB6\xDD |0 + \x8F\xB6\xDE |0 + \xD3\xE8 |0 + \xC7\xB9 |0 + \xD3\xEB |0 + \x8F\xB6\xDF |0 + \x8F\xB6\xE0 |0 + \x8F\xB6\xE1 |0 + \x8F\xB6\xE2 |0 + \x8F\xB6\xE3 |0 + \x8F\xB6\xE4 |0 + \x8F\xB6\xE5 |0 + \xD3\xEC |0 + \x8F\xB6\xE6 |0 + \x8F\xB6\xE7 |0 + \xD3\xEE |0 + \xD3\xED |0 + \x8F\xB6\xE8 |0 + \xD3\xF0 |0 + \x8F\xB6\xE9 |0 + \xD3\xF3 |0 + \xD3\xF1 |0 + \xD3\xEF |0 + \xD3\xF2 |0 + \x8F\xB6\xEA |0 + \xD3\xF4 |0 + \x8F\xB6\xEB |0 + \x8F\xB6\xEC |0 + \x8F\xB6\xED |0 + \x8F\xB6\xF0 |0 + \x8F\xB6\xF1 |0 + \xD3\xF5 |0 + \x8F\xB6\xEE |0 + \x8F\xB6\xEF |0 + \xD3\xF6 |0 + \xD3\xF7 |0 + \xD3\xF8 |0 + \xD1\xC5 |0 + \x8F\xB6\xF2 |0 + \xBC\xFC |0 + \xBB\xCD |0 + \x8F\xB6\xF3 |0 + \x8F\xB6\xF4 |0 + \xB2\xF3 |0 + \x8F\xB6\xF5 |0 + \xB0\xF8 |0 + \x8F\xB6\xF6 |0 + \xC3\xC4 |0 + \x8F\xB6\xF7 |0 + \x8F\xB6\xF8 |0 + \x8F\xB6\xF9 |0 + \x8F\xB6\xFA |0 + \x8F\xB6\xFB |0 + \x8F\xB6\xFD |0 + \x8F\xB6\xFE |0 + \xD3\xF9 |0 + \xBA\xA4 |0 + \x8F\xB6\xFC |0 + \xB0\xCF |0 + \xBF\xDE |0 + \x8F\xB7\xA1 |0 + \x8F\xB7\xA2 |0 + \xD3\xFA |0 + \xB8\xC7 |0 + \xB9\xF1 |0 + \xD3\xFC |0 + \xD3\xFB |0 + \x8F\xB7\xA3 |0 + \x8F\xB7\xA4 |0 + \xCA\xE0 |0 + \xD3\xFD |0 + \x8F\xB7\xA5 |0 + \xD4\xA1 |0 + \xD3\xFE |0 + \x8F\xB7\xA6 |0 + \xD4\xA2 |0 + \x8F\xB7\xA7 |0 + \xD4\xA3 |0 + \xB7\xF7 |0 + \x8F\xB7\xA8 |0 + \xB1\xE0 |0 + \xD4\xA4 |0 + \x8F\xB7\xA9 |0 + \xD4\xA6 |0 + \xD4\xA5 |0 + \x8F\xB7\xAA |0 + \x8F\xB7\xAB |0 + \xD4\xA8 |0 + \x8F\xB7\xAC |0 + \xC5\xDA |0 + \x8F\xB7\xAD |0 + \x8F\xB7\xAE |0 + \x8F\xB7\xAF |0 + \x8F\xB7\xB0 |0 + \x8F\xB7\xB1 |0 + \xD4\xA9 |0 + \xB0\xB5 |0 + \xBA\xDF |0 + \x8F\xB7\xB2 |0 + \x8F\xB7\xB3 |0 + \x8F\xB7\xB4 |0 + \xB7\xBD |0 + \x8F\xB7\xB5 |0 + \x8F\xB7\xB6 |0 + \xC3\xCF |0 + \x8F\xB7\xB7 |0 + \x8F\xB7\xB8 |0 + \xD4\xAA |0 + \xD4\xAB |0 + \xD4\xAD |0 + \x8F\xB7\xB9 |0 + \x8F\xB7\xBA |0 + \x8F\xB7\xBB |0 + \xD4\xAE |0 + \xBA\xE4 |0 + \x8F\xB7\xBC |0 + \x8F\xB7\xBD |0 + \xB6\xD1 |0 + \xCB\xB7 |0 + \x8F\xB7\xBE |0 + \x8F\xB7\xBF |0 + \xD4\xAC |0 + \xD4\xAF |0 + \xBA\xC1 |0 + \xB9\xA3 |0 + \x8F\xB7\xC0 |0 + \x8F\xF4\xA9 |0 + \xD4\xB3 |0 + \x8F\xB7\xC1 |0 + \xBA\xA5 |0 + \x8F\xB7\xC2 |0 + \xC3\xB3 |0 + \x8F\xB7\xC3 |0 + \x8F\xB7\xC4 |0 + \xD4\xB0 |0 + \xC4\xDA |0 + \x8F\xB7\xC5 |0 + \x8F\xB7\xC6 |0 + \x8F\xB7\xC7 |0 + \x8F\xB7\xC8 |0 + \x8F\xB7\xC9 |0 + \x8F\xB7\xCA |0 + \x8F\xB7\xCB |0 + \x8F\xB7\xCC |0 + \x8F\xB7\xCD |0 + \x8F\xB7\xCE |0 + \x8F\xB7\xCF |0 + \x8F\xB7\xD0 |0 + \x8F\xB7\xD1 |0 + \x8F\xB7\xD2 |0 + \x8F\xB7\xD3 |0 + \xD4\xB4 |0 + \x8F\xB7\xD4 |0 + \xBF\xE2 |0 + \x8F\xB7\xD5 |0 + \xD4\xB2 |0 + \xD4\xB5 |0 + \xB7\xBF |0 + \x8F\xB7\xD6 |0 + \xD4\xB6 |0 + \x8F\xB7\xD7 |0 + \x8F\xB7\xE0 |0 + \x8F\xB7\xD8 |0 + \x8F\xB7\xD9 |0 + \x8F\xB7\xDA |0 + \x8F\xB7\xDB |0 + \x8F\xB7\xDC |0 + \x8F\xB7\xDD |0 + \x8F\xB7\xDE |0 + \xD4\xB7 |0 + \x8F\xB7\xDF |0 + \xB9\xA4 |0 + \xB3\xC0 |0 + \xD4\xB9 |0 + \x8F\xB7\xE1 |0 + \x8F\xB7\xE2 |0 + \x8F\xB7\xE3 |0 + \xD4\xBA |0 + \x8F\xB7\xE4 |0 + \xD4\xBB |0 + \xD4\xB8 |0 + \x8F\xB7\xE5 |0 + \x8F\xB7\xE6 |0 + \xD4\xB1 |0 + \xD4\xBC |0 + \xD4\xBD |0 + \x8F\xB7\xE7 |0 + \x8F\xB7\xE8 |0 + \xCB\xE4 |0 + \x8F\xB7\xE9 |0 + \xBE\xEB |0 + \x8F\xB7\xEA |0 + \xD4\xBF |0 + \xD4\xC0 |0 + \xD4\xBE |0 + \x8F\xB7\xEB |0 + \xD4\xC2 |0 + \xC7\xB8 |0 + \x8F\xB7\xEC |0 + \x8F\xB7\xED |0 + \xB0\xE8 |0 + \xC9\xD6 |0 + \x8F\xB7\xFE |0 + \xD4\xC3 |0 + \x8F\xB7\xEE |0 + \x8F\xB7\xEF |0 + \x8F\xB7\xF0 |0 + \x8F\xB7\xF1 |0 + \x8F\xB7\xF2 |0 + \x8F\xB7\xF3 |0 + \xBE\xFD |0 + \x8F\xB7\xF4 |0 + \x8F\xB7\xF5 |0 + \xBC\xB9 |0 + \x8F\xB7\xF6 |0 + \xC7\xDD |0 + \xB4\xF0 |0 + \xBA\xEB |0 + \x8F\xB7\xF7 |0 + \x8F\xB7\xF8 |0 + \x8F\xB7\xF9 |0 + \xCB\xD9 |0 + \xC6\xB2 |0 + \x8F\xB7\xFA |0 + \x8F\xB7\xFB |0 + \xB7\xF8 |0 + \xC2\xCF |0 + \x8F\xB7\xFC |0 + \x8F\xB7\xFD |0 + \xD4\xC1 |0 + \xD4\xC4 |0 + \x8F\xB8\xA1 |0 + \x8F\xB8\xA2 |0 + \xC2\xC4 |0 + \xD4\xC5 |0 + \x8F\xB8\xA3 |0 + \xD4\xC6 |0 + \x8F\xB8\xA4 |0 + \x8F\xB8\xA5 |0 + \x8F\xB8\xA6 |0 + \xD4\xC8 |0 + \xC4\xE9 |0 + \x8F\xB8\xA7 |0 + \x8F\xB8\xA8 |0 + \xB4\xAE |0 + \x8F\xB8\xA9 |0 + \xF4\xA1 |0 + \xB1\xE1 |0 + \xCA\xF3 |0 + \x8F\xB8\xAA |0 + \xBE\xEC |0 + \xC5\xC8 |0 + \x8F\xB8\xAB |0 + \xBA\xE6 |0 + \xD4\xCE |0 + \x8F\xB8\xAC |0 + \xCA\xBD |0 + \xCE\xDD |0 + \x8F\xB8\xAD |0 + \xB2\xF4 |0 + \xD4\xCA |0 + \x8F\xB8\xAE |0 + \x8F\xB8\xAF |0 + \x8F\xB8\xB0 |0 + \x8F\xB8\xB1 |0 + \xC1\xBA |0 + \xD4\xCD |0 + \xC5\xE3 |0 + \x8F\xB8\xB2 |0 + \xC5\xC9 |0 + \xC5\xE4 |0 + \xC8\xB9 |0 + \xC4\xCD |0 + \xBA\xC9 |0 + \x8F\xB8\xB3 |0 + \x8F\xB8\xB4 |0 + \xD4\xC9 |0 + \x8F\xB8\xB5 |0 + \x8F\xB8\xB6 |0 + \x8F\xB8\xB7 |0 + \xB1\xF6 |0 + \xC5\xB6 |0 + \xD4\xCB |0 + \xD4\xC7 |0 + \xBF\xD0 |0 + \x8F\xB8\xB8 |0 + \xD4\xCF |0 + \x8F\xB8\xB9 |0 + \xBD\xCE |0 + \x8F\xB8\xBA |0 + \x8F\xB8\xBB |0 + \x8F\xB8\xBC |0 + \xB6\xAD |0 + \xD4\xD0 |0 + \x8F\xB8\xBD |0 + \x8F\xB8\xBE |0 + \x8F\xB8\xBF |0 + \x8F\xB8\xC0 |0 + \x8F\xB8\xC1 |0 + \x8F\xB8\xC2 |0 + \x8F\xB8\xC3 |0 + \x8F\xB8\xC4 |0 + \xCA\xE8 |0 + \x8F\xB8\xC5 |0 + \x8F\xB8\xC6 |0 + \xC1\xFD |0 + \xC4\xC6 |0 + \x8F\xB8\xC7 |0 + \x8F\xF4\xAC |0 + \xD4\xD2 |0 + \x8F\xB8\xC8 |0 + \x8F\xB8\xC9 |0 + \x8F\xB8\xCA |0 + \x8F\xB8\xCB |0 + \xCB\xCF |0 + \x8F\xB8\xCC |0 + \xD4\xD3 |0 + \xD4\xD8 |0 + \x8F\xB8\xCD |0 + \x8F\xB8\xCE |0 + \xCA\xAF |0 + \xD4\xD7 |0 + \xD4\xD1 |0 + \xD4\xD4 |0 + \xD4\xD6 |0 + \x8F\xB8\xD0 |0 + \xBA\xA6 |0 + \xCA\xC9 |0 + \x8F\xB8\xD1 |0 + \x8F\xB8\xCF |0 + \xD4\xD9 |0 + \xC3\xC5 |0 + \x8F\xB8\xD2 |0 + \xB2\xF5 |0 + \xBE\xED |0 + \x8F\xB8\xD3 |0 + \x8F\xB8\xD4 |0 + \x8F\xB8\xD5 |0 + \xD4\xDB |0 + \x8F\xB8\xD6 |0 + \xD4\xDA |0 + \x8F\xB8\xD7 |0 + \xB9\xE8 |0 + \x8F\xB8\xD8 |0 + \xD4\xDC |0 + \xD4\xDE |0 + \xD4\xDD |0 + \x8F\xB8\xD9 |0 + \xD4\xE0 |0 + \x8F\xB8\xDA |0 + \xD4\xD5 |0 + \xD4\xE2 |0 + \x8F\xB8\xDB |0 + \x8F\xB8\xDC |0 + \xD4\xE1 |0 + \xD4\xDF |0 + \x8F\xB8\xDD |0 + \xBB\xCE |0 + \xBF\xD1 |0 + \xC1\xD4 |0 + \xD4\xE3 |0 + \xC0\xBC |0 + \xB0\xED |0 + \xC7\xE4 |0 + \x8F\xB8\xDE |0 + \xC4\xDB |0 + \xD4\xE5 |0 + \xD4\xE4 |0 + \xD4\xE6 |0 + \xD4\xE7 |0 + \xD4\xE8 |0 + \xD4\xE9 |0 + \x8F\xB8\xDF |0 + \x8F\xB8\xE0 |0 + \xCA\xD1 |0 + \xD4\xEA |0 + \x8F\xB8\xE1 |0 + \x8F\xB8\xE2 |0 + \xB2\xC6 |0 + \xD4\xEB |0 + \x8F\xB8\xE3 |0 + \x8F\xB8\xE4 |0 + \x8F\xB8\xE5 |0 + \xCD\xBC |0 + \xB3\xB0 |0 + \xD2\xC9 |0 + \xBD\xC8 |0 + \xC2\xBF |0 + \xD4\xEC |0 + \xCC\xEB |0 + \x8F\xB8\xE7 |0 + \x8F\xB8\xE8 |0 + \xCC\xB4 |0 + \x8F\xB8\xE9 |0 + \x8F\xB8\xEA |0 + \xD4\xEE |0 + \xC2\xE7 |0 + \x8F\xB8\xEB |0 + \xC5\xB7 |0 + \xC2\xC0 |0 + \xC9\xD7 |0 + \xD4\xEF |0 + \xD4\xF0 |0 + \xB1\xFB |0 + \x8F\xB8\xEC |0 + \x8F\xB8\xED |0 + \xBC\xBA |0 + \xD4\xF1 |0 + \x8F\xB8\xEE |0 + \x8F\xB8\xEF |0 + \x8F\xB8\xF0 |0 + \xB0\xD0 |0 + \xD4\xF2 |0 + \xD4\xF3 |0 + \x8F\xB8\xF1 |0 + \x8F\xB8\xF2 |0 + \xB1\xE2 |0 + \x8F\xB8\xF3 |0 + \xB4\xF1 |0 + \xC6\xE0 |0 + \xCA\xF4 |0 + \xD4\xF7 |0 + \xC1\xD5 |0 + \xD4\xF6 |0 + \xB7\xC0 |0 + \x8F\xB8\xF4 |0 + \x8F\xB8\xF5 |0 + \xCB\xDB |0 + \xD4\xF5 |0 + \xC5\xE5 |0 + \xD4\xF9 |0 + \x8F\xB8\xF6 |0 + \xD4\xF8 |0 + \x8F\xB8\xF7 |0 + \x8F\xB8\xF8 |0 + \x8F\xB8\xF9 |0 + \x8F\xB8\xFA |0 + \xD4\xFB |0 + \x8F\xB8\xFB |0 + \xD4\xFA |0 + \x8F\xB8\xFC |0 + \xB1\xFC |0 + \xD4\xFC |0 + \xBE\xA9 |0 + \xD4\xFE |0 + \xC3\xA5 |0 + \x8F\xB8\xFD |0 + \xD4\xFD |0 + \x8F\xB8\xFE |0 + \xCA\xB3 |0 + \x8F\xB9\xA1 |0 + \x8F\xB9\xA2 |0 + \xBD\xF7 |0 + \xC5\xDB |0 + \x8F\xB9\xA3 |0 + \x8F\xB9\xA4 |0 + \xD5\xA1 |0 + \x8F\xB9\xA5 |0 + \x8F\xB9\xA6 |0 + \x8F\xB9\xA7 |0 + \xB9\xA5 |0 + \xD5\xA2 |0 + \xC7\xA1 |0 + \xC8\xDE |0 + \xCC\xD1 |0 + \xC7\xA5 |0 + \x8F\xB9\xA8 |0 + \x8F\xB9\xA9 |0 + \xD5\xAB |0 + \x8F\xB9\xAA |0 + \x8F\xB9\xAB |0 + \xB5\xB8 |0 + \x8F\xB9\xAC |0 + \xCD\xC5 |0 + \x8F\xB9\xAD |0 + \xCC\xAF |0 + \xD6\xAC |0 + \xD5\xA3 |0 + \x8F\xB9\xAE |0 + \xD5\xA6 |0 + \x8F\xB9\xAF |0 + \xC2\xC5 |0 + \x8F\xB9\xB0 |0 + \xCB\xB8 |0 + \xC5\xCA |0 + \x8F\xB9\xB1 |0 + \x8F\xB9\xB2 |0 + \x8F\xB9\xB3 |0 + \x8F\xB9\xB4 |0 + \xD5\xA7 |0 + \x8F\xB9\xB5 |0 + \x8F\xB9\xB6 |0 + \xCB\xE5 |0 + \x8F\xB9\xB7 |0 + \xBA\xCA |0 + \x8F\xB9\xB8 |0 + \xBE\xAA |0 + \x8F\xB9\xB9 |0 + \x8F\xB9\xBA |0 + \x8F\xB9\xBB |0 + \xD5\xA8 |0 + \x8F\xB9\xBC |0 + \xBB\xD0 |0 + \x8F\xB9\xBD |0 + \xBB\xCF |0 + \x8F\xB9\xBE |0 + \xB0\xB9 |0 + \xB8\xC8 |0 + \x8F\xB9\xBF |0 + \xC0\xAB |0 + \xB0\xD1 |0 + \xD5\xAC |0 + \xD5\xAD |0 + \xD5\xAA |0 + \x8F\xB9\xC0 |0 + \x8F\xB9\xC1 |0 + \x8F\xB9\xC2 |0 + \x8F\xB9\xC3 |0 + \x8F\xB9\xC4 |0 + \xB1\xB8 |0 + \xB4\xAF |0 + \x8F\xB9\xC5 |0 + \xD5\xA9 |0 + \xCC\xC5 |0 + \xC9\xB1 |0 + \x8F\xB9\xC6 |0 + \x8F\xB9\xC7 |0 + \x8F\xB9\xC8 |0 + \x8F\xB9\xC9 |0 + \x8F\xB9\xCA |0 + \xB0\xA8 |0 + \x8F\xB9\xCB |0 + \xB0\xF9 |0 + \xBB\xD1 |0 + \x8F\xB9\xCC |0 + \xB0\xD2 |0 + \xB0\xA3 |0 + \x8F\xB9\xCD |0 + \xD5\xB2 |0 + \x8F\xB9\xCE |0 + \x8F\xB9\xCF |0 + \x8F\xB9\xD0 |0 + \xD5\xB0 |0 + \x8F\xB9\xD1 |0 + \x8F\xB9\xD2 |0 + \xCC\xBC |0 + \xD5\xB3 |0 + \xD5\xB1 |0 + \x8F\xB9\xD3 |0 + \xD5\xAF |0 + \xBF\xB1 |0 + \x8F\xB9\xD4 |0 + \x8F\xB9\xD5 |0 + \xD5\xAE |0 + \x8F\xB9\xD6 |0 + \x8F\xB9\xD7 |0 + \xCA\xDA |0 + \x8F\xB9\xD8 |0 + \x8F\xB9\xD9 |0 + \xB8\xE4 |0 + \x8F\xB9\xDA |0 + \xD5\xB7 |0 + \xD5\xB8 |0 + \xBE\xAB |0 + \xD5\xB4 |0 + \xCF\xAC |0 + \x8F\xB9\xDB |0 + \x8F\xB9\xDC |0 + \xC7\xCC |0 + \x8F\xB9\xDD |0 + \x8F\xB9\xDE |0 + \xD5\xB6 |0 + \x8F\xB9\xDF |0 + \x8F\xB9\xE0 |0 + \x8F\xB9\xE1 |0 + \xBA\xA7 |0 + \x8F\xB9\xE2 |0 + \xD5\xB9 |0 + \x8F\xB9\xE3 |0 + \x8F\xB9\xE4 |0 + \xC9\xD8 |0 + \x8F\xB9\xE5 |0 + \xD5\xBA |0 + \xD5\xB5 |0 + \x8F\xB9\xE6 |0 + \x8F\xB9\xE7 |0 + \x8F\xB9\xE8 |0 + \x8F\xB9\xE9 |0 + \x8F\xB9\xEA |0 + \xCC\xBB |0 + \x8F\xB9\xEB |0 + \x8F\xB9\xEC |0 + \xC7\xDE |0 + \x8F\xB9\xED |0 + \x8F\xB9\xEE |0 + \x8F\xB9\xEF |0 + \xD5\xBB |0 + \xC9\xB2 |0 + \x8F\xB9\xF0 |0 + \x8F\xB9\xF1 |0 + \x8F\xB9\xF2 |0 + \x8F\xB9\xF3 |0 + \x8F\xB9\xF4 |0 + \x8F\xB9\xF5 |0 + \x8F\xB9\xF6 |0 + \x8F\xB9\xF7 |0 + \x8F\xB9\xF8 |0 + \x8F\xB9\xF9 |0 + \x8F\xB9\xFA |0 + \x8F\xB9\xFB |0 + \x8F\xB9\xFC |0 + \x8F\xB9\xFD |0 + \xD5\xBC |0 + \xD5\xC0 |0 + \xD5\xBD |0 + \x8F\xB9\xFE |0 + \xB2\xC7 |0 + \xD5\xBF |0 + \x8F\xBA\xA1 |0 + \x8F\xBA\xA2 |0 + \x8F\xBA\xA3 |0 + \xBC\xBB |0 + \xD5\xBE |0 + \xB7\xF9 |0 + \x8F\xBA\xA4 |0 + \xD5\xCC |0 + \xD5\xC5 |0 + \xD5\xC2 |0 + \x8F\xBA\xA5 |0 + \x8F\xBA\xA6 |0 + \x8F\xBA\xA7 |0 + \xC3\xE4 |0 + \xD5\xC1 |0 + \x8F\xBA\xA8 |0 + \xD5\xC3 |0 + \xD5\xC4 |0 + \x8F\xBA\xA9 |0 + \x8F\xBA\xAA |0 + \x8F\xBA\xAB |0 + \x8F\xBA\xAC |0 + \xD5\xC6 |0 + \xD5\xC7 |0 + \x8F\xBA\xAD |0 + \x8F\xBA\xAE |0 + \x8F\xBA\xAF |0 + \x8F\xBA\xB0 |0 + \xB4\xF2 |0 + \xD5\xC9 |0 + \xD5\xC8 |0 + \xD5\xCA |0 + \x8F\xBA\xB1 |0 + \x8F\xBA\xB3 |0 + \x8F\xBA\xB4 |0 + \x8F\xBA\xB5 |0 + \x8F\xBA\xB6 |0 + \xBE\xEE |0 + \x8F\xBA\xB7 |0 + \xD5\xCD |0 + \xC4\xDC |0 + \x8F\xBA\xB8 |0 + \xB1\xC5 |0 + \xD5\xCB |0 + \x8F\xBA\xB2 |0 + \xD5\xCE |0 + \x8F\xBA\xB9 |0 + \xD5\xCF |0 + \xD5\xD2 |0 + \x8F\xBA\xBA |0 + \xD5\xD0 |0 + \xD5\xD1 |0 + \x8F\xBA\xBB |0 + \x8F\xBA\xBC |0 + \xBB\xD2 |0 + \xD5\xD3 |0 + \x8F\xBA\xBD |0 + \xB9\xA6 |0 + \xD5\xD4 |0 + \x8F\xBA\xBE |0 + \xBB\xFA |0 + \xC2\xB8 |0 + \xD5\xD5 |0 + \xD5\xD6 |0 + \xBB\xDA |0 + \xB9\xA7 |0 + \x8F\xBA\xBF |0 + \xCC\xD2 |0 + \xB5\xA8 |0 + \xB8\xC9 |0 + \xD5\xD7 |0 + \xB3\xD8 |0 + \x8F\xBA\xC0 |0 + \xD5\xD8 |0 + \xC2\xB9 |0 + \x8F\xBA\xC1 |0 + \x8F\xBA\xC2 |0 + \xD5\xD9 |0 + \xD6\xA3 |0 + \xD5\xDA |0 + \xD5\xDB |0 + \xD5\xDC |0 + \xD5\xDE |0 + \x8F\xBA\xC3 |0 + \x8F\xBA\xC4 |0 + \x8F\xBA\xC5 |0 + \x8F\xBA\xC6 |0 + \xD5\xDF |0 + \x8F\xBA\xC7 |0 + \xD5\xE0 |0 + \x8F\xBA\xC8 |0 + \xC2\xF0 |0 + \x8F\xBA\xC9 |0 + \xB1\xA7 |0 + \xBC\xE9 |0 + \xB0\xC2 |0 + \x8F\xBA\xCA |0 + \xC1\xD7 |0 + \xB4\xB0 |0 + \xBC\xB5 |0 + \x8F\xBA\xCB |0 + \xB9\xA8 |0 + \x8F\xBA\xCC |0 + \x8F\xBA\xCD |0 + \x8F\xBA\xCE |0 + \x8F\xBA\xCF |0 + \xC5\xE6 |0 + \x8F\xBA\xD0 |0 + \xBD\xA1 |0 + \xB4\xB1 |0 + \xC3\xE8 |0 + \xC4\xEA |0 + \xB0\xB8 |0 + \xB5\xB9 |0 + \xCA\xF5 |0 + \xBC\xC2 |0 + \xB5\xD2 |0 + \xC0\xEB |0 + \xBC\xBC |0 + \xCD\xA8 |0 + \xD5\xE1 |0 + \x8F\xBA\xD1 |0 + \x8F\xBA\xD2 |0 + \x8F\xBA\xD3 |0 + \x8F\xBA\xD4 |0 + \xB5\xDC |0 + \x8F\xBA\xD5 |0 + \xBA\xCB |0 + \x8F\xBA\xD6 |0 + \x8F\xBA\xD7 |0 + \xB3\xB2 |0 + \xB1\xE3 |0 + \xBE\xAC |0 + \xB2\xC8 |0 + \x8F\xBA\xD8 |0 + \xD5\xE2 |0 + \xCD\xC6 |0 + \x8F\xBA\xD9 |0 + \x8F\xBA\xDA |0 + \xBD\xC9 |0 + \x8F\xBA\xDB |0 + \x8F\xBA\xDC |0 + \xBC\xE4 |0 + \xD5\xE3 |0 + \xB4\xF3 |0 + \xC6\xD2 |0 + \xCC\xA9 |0 + \xD5\xE4 |0 + \xD5\xE5 |0 + \xC9\xD9 |0 + \x8F\xBA\xDD |0 + \x8F\xBA\xDE |0 + \xD5\xE7 |0 + \xB4\xA8 |0 + \xB6\xF7 |0 + \xD5\xE6 |0 + \x8F\xBA\xDF |0 + \x8F\xBA\xE0 |0 + \x8F\xBA\xE1 |0 + \x8F\xBA\xE2 |0 + \x8F\xBA\xE3 |0 + \xB4\xB2 |0 + \xBF\xB2 |0 + \xD5\xEB |0 + \xBB\xA1 |0 + \x8F\xBA\xE4 |0 + \xB2\xC9 |0 + \xD5\xEA |0 + \xD5\xE8 |0 + \xD5\xEC |0 + \xD5\xE9 |0 + \xC7\xAB |0 + \xDC\xCD |0 + \xBF\xB3 |0 + \xD5\xED |0 + \x8F\xF4\xAE |0 + \xCE\xC0 |0 + \x8F\xBA\xE5 |0 + \xD5\xEE |0 + \x8F\xBA\xE6 |0 + \xD5\xF0 |0 + \x8F\xBA\xE7 |0 + \xC3\xFE |0 + \xD5\xEF |0 + \xC0\xA3 |0 + \xBB\xFB |0 + \x8F\xBA\xE8 |0 + \xC2\xD0 |0 + \xBC\xF7 |0 + \xC9\xF5 |0 + \xC0\xEC |0 + \xBC\xCD |0 + \xD5\xF1 |0 + \xBE\xAD |0 + \xD5\xF2 |0 + \xD5\xF3 |0 + \xB0\xD3 |0 + \xC2\xBA |0 + \xBF\xD2 |0 + \x8F\xBA\xE9 |0 + \xD5\xF4 |0 + \xC6\xB3 |0 + \xBE\xAE |0 + \xBE\xAF |0 + \xD5\xF5 |0 + \xC0\xED |0 + \x8F\xBA\xEA |0 + \xBE\xB0 |0 + \x8F\xBA\xEB |0 + \x8F\xBA\xEC |0 + \xD5\xF6 |0 + \xD5\xF7 |0 + \x8F\xBA\xED |0 + \xCC\xE0 |0 + \x8F\xBA\xEE |0 + \xD5\xF8 |0 + \x8F\xBA\xEF |0 + \x8F\xBA\xF0 |0 + \x8F\xBA\xF1 |0 + \xB6\xC6 |0 + \x8F\xBA\xF2 |0 + \x8F\xBA\xF3 |0 + \xBD\xA2 |0 + \x8F\xBA\xF4 |0 + \x8F\xBA\xF5 |0 + \x8F\xBA\xF6 |0 + \xD5\xF9 |0 + \xD5\xFA |0 + \xBC\xDC |0 + \xBF\xAC |0 + \xC6\xF4 |0 + \xBF\xD4 |0 + \xC8\xF8 |0 + \xC7\xA2 |0 + \xB6\xC9 |0 + \xD5\xFB |0 + \xB5\xEF |0 + \xD5\xFC |0 + \xB6\xFE |0 + \xC6\xCF |0 + \xB2\xB0 |0 + \xBB\xD3 |0 + \xD5\xFD |0 + \xD6\xA2 |0 + \xD6\xA1 |0 + \xB6\xFD |0 + \xD5\xFE |0 + \xC5\xB8 |0 + \x8F\xBA\xF7 |0 + \x8F\xBA\xF8 |0 + \xD6\xA2 |1 + \x8F\xBA\xF9 |0 + \xC2\xB0 |0 + \xC5\xCB |0 + \xBC\xC8 |0 + \x8F\xBA\xFA |0 + \x8F\xBA\xFB |0 + \xC1\xD8 |0 + \xCD\xFA |0 + \x8F\xBA\xFC |0 + \x8F\xBA\xFD |0 + \x8F\xBA\xFE |0 + \xD6\xA4 |0 + \x8F\xBB\xA1 |0 + \xD6\xA5 |0 + \xC6\xD6 |0 + \x8F\xBB\xA2 |0 + \xBB\xB3 |0 + \x8F\xBB\xA3 |0 + \x8F\xBB\xA4 |0 + \xD6\xA7 |0 + \xD6\xA8 |0 + \x8F\xBB\xA5 |0 + \x8F\xBB\xA6 |0 + \x8F\xBB\xA7 |0 + \x8F\xBB\xA8 |0 + \x8F\xBB\xA9 |0 + \x8F\xBB\xAA |0 + \x8F\xBB\xAB |0 + \xD6\xA9 |0 + \x8F\xBB\xAC |0 + \xB4\xF4 |0 + \xD6\xAA |0 + \x8F\xBB\xAD |0 + \xD6\xAB |0 + \x8F\xBB\xAE |0 + \x8F\xBB\xAF |0 + \x8F\xBB\xB0 |0 + \xB2\xAC |0 + \x8F\xBB\xB1 |0 + \x8F\xBB\xB2 |0 + \x8F\xBB\xB3 |0 + \xC1\xBB |0 + \xB4\xE4 |0 + \x8F\xBB\xB4 |0 + \xD6\xAD |0 + \xCC\xA8 |0 + \xC2\xD2 |0 + \x8F\xBB\xB5 |0 + \xB3\xD9 |0 + \x8F\xBB\xB6 |0 + \x8F\xBB\xB7 |0 + \xD6\xAF |0 + \xD6\xB1 |0 + \xB4\xDF |0 + \x8F\xBB\xB8 |0 + \xD6\xAE |0 + \xD6\xB0 |0 + \xD6\xB3 |0 + \xD6\xB2 |0 + \xD6\xB4 |0 + \x8F\xBB\xB9 |0 + \x8F\xBB\xBA |0 + \x8F\xBB\xBB |0 + \x8F\xBB\xBD |0 + \xD6\xB5 |0 + \x8F\xBB\xBC |0 + \xC6\xBD |0 + \xB6\xAE |0 + \xB2\xE5 |0 + \xD6\xB6 |0 + \xD6\xBB |0 + \xD6\xB9 |0 + \x8F\xBB\xBE |0 + \xCA\xF7 |0 + \xCA\xF6 |0 + \x8F\xBB\xBF |0 + \x8F\xBB\xC0 |0 + \x8F\xBB\xC1 |0 + \x8F\xF4\xAF |0 + \xC5\xE7 |0 + \xD6\xB8 |0 + \xBD\xD4 |0 + \xD6\xB7 |0 + \x8F\xBB\xC2 |0 + \x8F\xBB\xC3 |0 + \xBF\xF2 |0 + \xD6\xBC |0 + \x8F\xBB\xC4 |0 + \xBA\xEA |0 + \xD6\xC2 |0 + \x8F\xBB\xC5 |0 + \xD6\xC3 |0 + \xD6\xBD |0 + \xB3\xB3 |0 + \xD6\xBE |0 + \xD6\xC7 |0 + \xD6\xC6 |0 + \xD6\xC5 |0 + \xD6\xC1 |0 + \xD6\xC0 |0 + \xD6\xC4 |0 + \x8F\xBB\xC7 |0 + \x8F\xBB\xC8 |0 + \x8F\xBB\xC9 |0 + \x8F\xBB\xCA |0 + \xCA\xF8 |0 + \x8F\xBB\xC6 |0 + \x8F\xBB\xCB |0 + \x8F\xBB\xCC |0 + \x8F\xBB\xCD |0 + \x8F\xBB\xCE |0 + \x8F\xBB\xCF |0 + \x8F\xBB\xD0 |0 + \x8F\xBB\xD1 |0 + \x8F\xBB\xD2 |0 + \x8F\xBB\xD3 |0 + \x8F\xBB\xD7 |0 + \xD6\xCB |0 + \xD6\xC8 |0 + \xD6\xCA |0 + \xCD\xF2 |0 + \x8F\xBB\xD5 |0 + \xD6\xC9 |0 + \x8F\xF4\xB0 |0 + \x8F\xBB\xD4 |0 + \x8F\xBB\xD6 |0 + \xD6\xBF |0 + \x8F\xBB\xD8 |0 + \x8F\xBB\xD9 |0 + \x8F\xBB\xDA |0 + \x8F\xBB\xDB |0 + \x8F\xBB\xDC |0 + \xBF\xF3 |0 + \x8F\xBB\xDD |0 + \xD6\xCC |0 + \x8F\xBB\xDE |0 + \xBA\xB7 |0 + \x8F\xBB\xDF |0 + \xD6\xCD |0 + \xD6\xCE |0 + \x8F\xBB\xE0 |0 + \x8F\xBB\xE1 |0 + \x8F\xBB\xE2 |0 + \x8F\xBB\xE3 |0 + \x8F\xBB\xE4 |0 + \xD6\xD1 |0 + \x8F\xBB\xE5 |0 + \xD6\xD0 |0 + \xD6\xCF |0 + \x8F\xBB\xE6 |0 + \x8F\xBB\xE7 |0 + \xC5\xE8 |0 + \xD6\xBA |0 + \xD6\xD7 |0 + \x8F\xBB\xE8 |0 + \x8F\xBB\xE9 |0 + \x8F\xBB\xEA |0 + \x8F\xBB\xEB |0 + \x8F\xBB\xEC |0 + \x8F\xBB\xED |0 + \xD6\xD3 |0 + \x8F\xBB\xEE |0 + \x8F\xBB\xEF |0 + \xD6\xD2 |0 + \x8F\xBB\xF0 |0 + \x8F\xBB\xF1 |0 + \xD6\xD4 |0 + \xD6\xD5 |0 + \x8F\xBB\xF2 |0 + \x8F\xE6\xF4 |0 + \x8F\xBB\xF3 |0 + \xD6\xD8 |0 + \x8F\xBB\xF4 |0 + \x8F\xBB\xF5 |0 + \xCE\xE6 |0 + \xD6\xD9 |0 + \xD6\xD6 |0 + \x8F\xBB\xF6 |0 + \x8F\xBB\xF7 |0 + \xD6\xDA |0 + \x8F\xBB\xF8 |0 + \xB4\xE0 |0 + \xD6\xDB |0 + \x8F\xBB\xFA |0 + \x8F\xBB\xF9 |0 + \xD6\xDD |0 + \xD6\xDC |0 + \xD6\xDE |0 + \x8F\xBB\xFB |0 + \x8F\xBB\xFC |0 + \xD6\xDF |0 + \xC0\xEE |0 + \xBD\xA3 |0 + \x8F\xBB\xFD |0 + \xBD\xE4 |0 + \xC1\xE3 |0 + \x8F\xBB\xFE |0 + \xB9\xA9 |0 + \xBA\xB8 |0 + \xB9\xAA |0 + \xB5\xF0 |0 + \x8F\xBC\xA1 |0 + \xD6\xE0 |0 + \xBA\xB9 |0 + \xB8\xCA |0 + \xD6\xE1 |0 + \xCC\xA6 |0 + \xC7\xC3 |0 + \xD6\xE2 |0 + \xB9\xAB |0 + \x8F\xBC\xA2 |0 + \x8F\xBC\xA3 |0 + \xB4\xAC |0 + \xC3\xA7 |0 + \xB6\xD2 |0 + \x8F\xBC\xA4 |0 + \xBB\xD4 |0 + \xC9\xDB |0 + \xC8\xC1 |0 + \x8F\xBC\xA5 |0 + \xD6\xE3 |0 + \xB4\xF5 |0 + \x8F\xBC\xA6 |0 + \xD6\xE6 |0 + \x8F\xBC\xA7 |0 + \x8F\xBC\xA8 |0 + \x8F\xBC\xA9 |0 + \xC4\xA1 |0 + \x8F\xBC\xAA |0 + \xD6\xE5 |0 + \xD6\xE4 |0 + \xD6\xE7 |0 + \xC4\xEB |0 + \x8F\xBC\xAB |0 + \x8F\xBC\xAC |0 + \xBF\xE3 |0 + \x8F\xBC\xAE |0 + \xBB\xD5 |0 + \xC0\xCA |0 + \x8F\xBC\xAD |0 + \xC2\xD3 |0 + \xB5\xA2 |0 + \x8F\xBC\xAF |0 + \xC4\xA2 |0 + \x8F\xBC\xB0 |0 + \xD6\xE8 |0 + \xD6\xE9 |0 + \xBE\xEF |0 + \xCB\xB9 |0 + \x8F\xBC\xB1 |0 + \xD6\xEC |0 + \xD6\xEB |0 + \xD6\xEA |0 + \xC9\xFD |0 + \xD6\xF3 |0 + \x8F\xBC\xB4 |0 + \x8F\xBC\xB2 |0 + \xCB\xDA |0 + \xD6\xED |0 + \x8F\xBC\xB3 |0 + \x8F\xBC\xB5 |0 + \xD6\xEF |0 + \xCB\xEB |0 + \x8F\xBC\xB6 |0 + \xD6\xEE |0 + \x8F\xBC\xB7 |0 + \x8F\xBC\xB8 |0 + \x8F\xBC\xB9 |0 + \x8F\xBC\xBA |0 + \xD6\xF0 |0 + \xC8\xA8 |0 + \xD6\xF1 |0 + \xCA\xBE |0 + \xD6\xF2 |0 + \x8F\xBC\xBB |0 + \x8F\xBC\xBC |0 + \x8F\xBC\xBD |0 + \x8F\xBC\xBE |0 + \x8F\xBC\xBF |0 + \x8F\xBC\xC0 |0 + \x8F\xBC\xC1 |0 + \xB4\xB3 |0 + \xCA\xBF |0 + \xC7\xAF |0 + \xD6\xF4 |0 + \xD6\xF5 |0 + \xB9\xAC |0 + \xB4\xB4 |0 + \xD6\xF6 |0 + \xB8\xB8 |0 + \xCD\xC4 |0 + \xCD\xA9 |0 + \xB4\xF6 |0 + \xD6\xF8 |0 + \x8F\xBC\xC2 |0 + \xC4\xA3 |0 + \xB9\xAD |0 + \xBE\xB1 |0 + \xC8\xDF |0 + \xBE\xB2 |0 + \x8F\xBC\xC3 |0 + \x8F\xBC\xC4 |0 + \xBD\xF8 |0 + \xC4\xEC |0 + \xCA\xF9 |0 + \xC5\xB9 |0 + \xB9\xAE |0 + \xC9\xDC |0 + \xD6\xF9 |0 + \x8F\xBC\xC5 |0 + \x8F\xBC\xC6 |0 + \x8F\xBC\xC7 |0 + \xC5\xD9 |0 + \xBA\xC2 |0 + \x8F\xBC\xC8 |0 + \x8F\xBC\xC9 |0 + \xB8\xCB |0 + \x8F\xBC\xCA |0 + \xC4\xED |0 + \x8F\xBC\xCB |0 + \x8F\xBC\xCC |0 + \xB0\xC3 |0 + \xBD\xEE |0 + \xB9\xAF |0 + \xCD\xC7 |0 + \x8F\xBC\xCD |0 + \x8F\xBC\xCE |0 + \x8F\xBC\xCF |0 + \xD6\xFA |0 + \xD6\xFB |0 + \xC7\xD1 |0 + \x8F\xBC\xD0 |0 + \xD6\xFC |0 + \xCE\xF7 |0 + \xCF\xAD |0 + \x8F\xBC\xD2 |0 + \x8F\xBC\xD1 |0 + \x8F\xBC\xD3 |0 + \xD6\xFE |0 + \xD6\xFD |0 + \x8F\xBC\xD4 |0 + \x8F\xBC\xD5 |0 + \xB3\xC7 |0 + \x8F\xBC\xD6 |0 + \x8F\xBC\xD7 |0 + \xD7\xA1 |0 + \xD7\xA4 |0 + \xD7\xA5 |0 + \x8F\xBC\xD8 |0 + \xD7\xA3 |0 + \x8F\xBC\xD9 |0 + \xC9\xC0 |0 + \xBE\xB3 |0 + \xD7\xA7 |0 + \xD7\xA6 |0 + \xD7\xA2 |0 + \x8F\xBC\xDA |0 + \xD7\xA8 |0 + \xD7\xA9 |0 + \x8F\xBC\xDB |0 + \xD7\xAA |0 + \xD7\xAD |0 + \xD7\xAB |0 + \xD7\xAC |0 + \xD7\xAE |0 + \xB1\xE4 |0 + \xC4\xEE |0 + \xD7\xAF |0 + \xB7\xFA |0 + \xB2\xF6 |0 + \xC7\xB6 |0 + \xD7\xB0 |0 + \xC6\xFB |0 + \xCA\xDB |0 + \x8F\xBC\xDC |0 + \xD7\xB1 |0 + \xCF\xAE |0 + \x8F\xBC\xDD |0 + \x8F\xBC\xDE |0 + \x8F\xBC\xDF |0 + \xD7\xB2 |0 + \xCA\xC0 |0 + \xD7\xB5 |0 + \xD0\xA1 |0 + \xD0\xB1 |0 + \x8F\xBC\xE0 |0 + \xBC\xB0 |0 + \xC6\xF5 |0 + \xD7\xB6 |0 + \xB5\xDD |0 + \xC4\xA4 |0 + \xB0\xFA |0 + \xD7\xB7 |0 + \xCA\xA6 |0 + \xB9\xB0 |0 + \x8F\xBC\xE1 |0 + \xC3\xD0 |0 + \x8F\xBC\xE2 |0 + \x8F\xBC\xE3 |0 + \xC4\xEF |0 + \x8F\xBC\xE4 |0 + \x8F\xBC\xE5 |0 + \x8F\xBC\xE6 |0 + \x8F\xBC\xE7 |0 + \xCC\xEF |0 + \xB8\xB9 |0 + \xB8\xCC |0 + \x8F\xBC\xE8 |0 + \xD7\xB8 |0 + \x8F\xBC\xE9 |0 + \x8F\xBC\xEA |0 + \xD7\xB9 |0 + \x8F\xBC\xEB |0 + \xD7\xBF |0 + \x8F\xBC\xEC |0 + \xBC\xE5 |0 + \x8F\xBC\xED |0 + \xC4\xA5 |0 + \x8F\xBC\xEE |0 + \xB6\xAF |0 + \xD7\xBA |0 + \x8F\xBC\xEF |0 + \xC9\xAB |0 + \x8F\xBC\xF0 |0 + \xC3\xC6 |0 + \x8F\xBC\xF1 |0 + \x8F\xBC\xF2 |0 + \xD7\xBB |0 + \x8F\xBC\xF3 |0 + \x8F\xBC\xF4 |0 + \x8F\xBC\xF5 |0 + \xD7\xBC |0 + \xB6\xB0 |0 + \xD7\xBD |0 + \x8F\xBC\xF6 |0 + \xD7\xBE |0 + \x8F\xBC\xF7 |0 + \xD7\xC0 |0 + \xC5\xF6 |0 + \x8F\xBC\xF8 |0 + \xD7\xC1 |0 + \xD7\xC2 |0 + \x8F\xBC\xF9 |0 + \xD7\xC3 |0 + \x8F\xBC\xFA |0 + \xD7\xB4 |0 + \xD7\xB3 |0 + \x8F\xBC\xFB |0 + \xD7\xC4 |0 + \xB7\xC1 |0 + \x8F\xBC\xFC |0 + \x8F\xBC\xFD |0 + \xC9\xA7 |0 + \x8F\xBC\xFE |0 + \xBA\xCC |0 + \xC9\xB7 |0 + \xC4\xA6 |0 + \xC9\xCB |0 + \xD7\xC5 |0 + \x8F\xBD\xA1 |0 + \xBE\xB4 |0 + \xB1\xC6 |0 + \x8F\xBD\xA2 |0 + \xD7\xC6 |0 + \x8F\xBD\xA3 |0 + \x8F\xBD\xA4 |0 + \xD7\xC7 |0 + \x8F\xBD\xA5 |0 + \xCC\xF2 |0 + \x8F\xBD\xA6 |0 + \xC8\xE0 |0 + \x8F\xBD\xA7 |0 + \x8F\xBD\xA8 |0 + \xD7\xCA |0 + \xB1\xFD |0 + \xC0\xAC |0 + \xD7\xC9 |0 + \xD7\xC8 |0 + \xB7\xC2 |0 + \xC2\xD4 |0 + \xD7\xCE |0 + \xD7\xCC |0 + \x8F\xBD\xA9 |0 + \xD7\xCB |0 + \xCE\xA7 |0 + \xB8\xE5 |0 + \x8F\xBD\xAA |0 + \x8F\xBD\xAB |0 + \xBD\xF9 |0 + \xD7\xCD |0 + \xC5\xCC |0 + \xBD\xBE |0 + \x8F\xBD\xAC |0 + \xC6\xC0 |0 + \xD7\xD1 |0 + \xD7\xD0 |0 + \x8F\xBD\xAD |0 + \x8F\xBD\xAE |0 + \xD7\xCF |0 + \xD7\xD2 |0 + \xB8\xE6 |0 + \x8F\xBD\xAF |0 + \x8F\xBD\xB2 |0 + \x8F\xBD\xB0 |0 + \xD7\xD3 |0 + \xC9\xFC |0 + \xBD\xDB |0 + \x8F\xBD\xB1 |0 + \x8F\xBD\xB3 |0 + \xD7\xD4 |0 + \xC8\xF9 |0 + \x8F\xBD\xB4 |0 + \x8F\xBD\xB5 |0 + \x8F\xBD\xB6 |0 + \xC6\xC1 |0 + \xC4\xA7 |0 + \x8F\xF4\xB2 |0 + \x8F\xBD\xB7 |0 + \xC5\xB0 |0 + \xD7\xD5 |0 + \xB5\xAB |0 + \xBF\xB4 |0 + \x8F\xBD\xB8 |0 + \xC9\xAC |0 + \x8F\xBD\xB9 |0 + \x8F\xBD\xBA |0 + \x8F\xBD\xBB |0 + \x8F\xBD\xBC |0 + \xB4\xF7 |0 + \xC7\xA6 |0 + \x8F\xBD\xBD |0 + \x8F\xBD\xBE |0 + \x8F\xBD\xBF |0 + \x8F\xBD\xC0 |0 + \x8F\xBD\xC1 |0 + \xD7\xD6 |0 + \xBB\xD6 |0 + \xCB\xBA |0 + \xCB\xBB |0 + \xB1\xFE |0 + \xD7\xDB |0 + \x8F\xBD\xC2 |0 + \xC3\xE9 |0 + \x8F\xBD\xC3 |0 + \x8F\xBD\xC4 |0 + \xD7\xD8 |0 + \x8F\xBD\xC5 |0 + \x8F\xBD\xC6 |0 + \x8F\xBD\xC7 |0 + \xB2\xF7 |0 + \x8F\xBD\xC8 |0 + \x8F\xBD\xC9 |0 + \x8F\xBD\xCA |0 + \x8F\xBD\xCB |0 + \xD8\xAD |0 + \xD7\xDA |0 + \x8F\xBD\xCC |0 + \x8F\xBD\xCD |0 + \xC7\xB0 |0 + \x8F\xBD\xCE |0 + \xD7\xD9 |0 + \x8F\xBD\xCF |0 + \xD7\xD7 |0 + \x8F\xBD\xD0 |0 + \xB9\xFA |0 + \xD7\xDD |0 + \x8F\xBD\xD1 |0 + \x8F\xBD\xD2 |0 + \x8F\xBD\xD3 |0 + \xD7\xE3 |0 + \xD7\xE9 |0 + \xD7\xE1 |0 + \xC5\xDC |0 + \x8F\xBD\xD4 |0 + \x8F\xBD\xD5 |0 + \xD7\xE6 |0 + \xC9\xDD |0 + \x8F\xBD\xD6 |0 + \x8F\xBD\xD7 |0 + \xD7\xE0 |0 + \x8F\xBD\xD8 |0 + \xD7\xE5 |0 + \xCE\xE7 |0 + \xBB\xD7 |0 + \x8F\xBD\xD9 |0 + \xC2\xD5 |0 + \xD7\xDE |0 + \x8F\xBD\xDA |0 + \xB5\xDE |0 + \xD7\xE8 |0 + \xC0\xAD |0 + \xB1\xE5 |0 + \xD7\xE2 |0 + \xB2\xF8 |0 + \xD7\xE7 |0 + \x8F\xBD\xDB |0 + \xB6\xB1 |0 + \xD7\xE4 |0 + \x8F\xBD\xDC |0 + \x8F\xBD\xDD |0 + \xD7\xEA |0 + \x8F\xBD\xDE |0 + \xD7\xEC |0 + \xD7\xF6 |0 + \xD7\xF4 |0 + \xD7\xF1 |0 + \x8F\xBD\xDF |0 + \x8F\xBD\xE0 |0 + \x8F\xBD\xE1 |0 + \xD7\xF0 |0 + \xCE\xF8 |0 + \x8F\xBD\xE2 |0 + \xD7\xF2 |0 + \xB6\xB2 |0 + \x8F\xBD\xE3 |0 + \xB9\xB1 |0 + \x8F\xBD\xE4 |0 + \xBD\xFA |0 + \x8F\xBD\xE5 |0 + \x8F\xBD\xE6 |0 + \xD7\xF9 |0 + \xD7\xEB |0 + \x8F\xBD\xE7 |0 + \xD7\xEF |0 + \xD7\xDF |0 + \x8F\xBD\xE8 |0 + \xB2\xFA |0 + \xD7\xF3 |0 + \xD7\xF5 |0 + \xC3\xD1 |0 + \x8F\xBD\xE9 |0 + \xBA\xA8 |0 + \xB2\xB8 |0 + \xD7\xED |0 + \xD7\xF8 |0 + \xD7\xF7 |0 + \xB6\xB3 |0 + \xC2\xA9 |0 + \xB3\xE6 |0 + \x8F\xBD\xEA |0 + \xB7\xC3 |0 + \xD7\xEE |0 + \x8F\xBD\xEB |0 + \x8F\xBD\xEC |0 + \xD7\xFA |0 + \x8F\xBD\xED |0 + \xD7\xFD |0 + \xD8\xA1 |0 + \x8F\xF4\xB3 |0 + \x8F\xBD\xEE |0 + \x8F\xBD\xEF |0 + \xBC\xBD |0 + \x8F\xBD\xF0 |0 + \xD8\xA7 |0 + \xC4\xF0 |0 + \xD7\xFB |0 + \x8F\xBD\xF1 |0 + \x8F\xBD\xF2 |0 + \xD8\xA5 |0 + \x8F\xBD\xF3 |0 + \xB2\xF9 |0 + \x8F\xBD\xF4 |0 + \xD8\xA3 |0 + \xD8\xA4 |0 + \x8F\xBD\xF5 |0 + \xD7\xFE |0 + \xD8\xA2 |0 + \x8F\xBD\xF6 |0 + \x8F\xBD\xF7 |0 + \xB8\xE7 |0 + \xCD\xAA |0 + \x8F\xBD\xF8 |0 + \xB4\xB5 |0 + \x8F\xBD\xF9 |0 + \x8F\xBD\xFA |0 + \xB1\xD9 |0 + \xD8\xA6 |0 + \x8F\xBD\xFB |0 + \xC7\xBA |0 + \xB0\xAD |0 + \x8F\xBD\xFC |0 + \x8F\xBD\xFD |0 + \xC8\xE1 |0 + \xD7\xDC |0 + \xD8\xAC |0 + \xD8\xB0 |0 + \xCC\xE5 |0 + \x8F\xBD\xFE |0 + \xD8\xA9 |0 + \x8F\xBE\xA1 |0 + \xC5\xE9 |0 + \xD8\xAE |0 + \x8F\xBE\xA2 |0 + \x8F\xBE\xA3 |0 + \x8F\xBE\xA4 |0 + \xBE\xF0 |0 + \xD8\xAF |0 + \xC6\xD7 |0 + \x8F\xBE\xA5 |0 + \x8F\xBE\xA6 |0 + \x8F\xBE\xA7 |0 + \x8F\xBE\xA8 |0 + \x8F\xBE\xA9 |0 + \x8F\xBE\xAA |0 + \xCF\xC7 |0 + \xD8\xAB |0 + \x8F\xBE\xAB |0 + \x8F\xBE\xAC |0 + \xD8\xB1 |0 + \x8F\xBE\xAD |0 + \xB9\xFB |0 + \x8F\xBE\xAE |0 + \xC0\xCB |0 + \x8F\xBE\xAF |0 + \x8F\xBE\xB0 |0 + \xB0\xD4 |0 + \xD8\xAA |0 + \xD8\xA8 |0 + \x8F\xBE\xB1 |0 + \xC1\xDA |0 + \x8F\xBE\xB2 |0 + \xD7\xFC |0 + \xBB\xB4 |0 + \xC2\xC6 |0 + \xD8\xBD |0 + \x8F\xBE\xB3 |0 + \xC1\xDB |0 + \xD8\xB8 |0 + \x8F\xBE\xB4 |0 + \xD8\xB5 |0 + \xD8\xB6 |0 + \x8F\xBE\xB5 |0 + \xBC\xE6 |0 + \xD8\xB9 |0 + \xD8\xBC |0 + \x8F\xBE\xB6 |0 + \x8F\xBE\xB7 |0 + \xD8\xB7 |0 + \xBD\xA5 |0 + \x8F\xBE\xB8 |0 + \xD8\xBA |0 + \xD8\xB4 |0 + \x8F\xBE\xB9 |0 + \xCC\xFC |0 + \xCC\xFB |0 + \x8F\xBE\xBA |0 + \x8F\xBE\xBB |0 + \xD8\xBE |0 + \xD8\xBF |0 + \xB0\xD5 |0 + \x8F\xBE\xBC |0 + \x8F\xBE\xBD |0 + \x8F\xBE\xBE |0 + \x8F\xBE\xBF |0 + \x8F\xBE\xC0 |0 + \xD8\xB3 |0 + \x8F\xBE\xC1 |0 + \x8F\xBE\xC2 |0 + \x8F\xBE\xC3 |0 + \xB6\xF2 |0 + \xB0\xA6 |0 + \x8F\xBE\xC4 |0 + \x8F\xBE\xC5 |0 + \xB4\xB6 |0 + \x8F\xF4\xB4 |0 + \xD8\xBB |0 + \x8F\xBE\xC6 |0 + \xD8\xC3 |0 + \xD8\xC2 |0 + \x8F\xBE\xC7 |0 + \x8F\xBE\xC8 |0 + \xD8\xC7 |0 + \x8F\xBE\xC9 |0 + \x8F\xBE\xCA |0 + \xD8\xC8 |0 + \x8F\xBE\xCB |0 + \x8F\xBE\xCC |0 + \x8F\xBE\xCD |0 + \x8F\xBE\xCE |0 + \xD8\xC6 |0 + \xD8\xC9 |0 + \xD8\xC1 |0 + \xD8\xC5 |0 + \x8F\xBE\xCF |0 + \xD8\xCA |0 + \xD8\xCB |0 + \x8F\xBE\xD0 |0 + \x8F\xBE\xD1 |0 + \xD8\xC0 |0 + \xBB\xFC |0 + \x8F\xBE\xD2 |0 + \xD8\xC4 |0 + \xC2\xD6 |0 + \xB9\xB2 |0 + \xD8\xB2 |0 + \xBF\xB5 |0 + \xD8\xD8 |0 + \xCA\xE9 |0 + \xD8\xCE |0 + \xD8\xCF |0 + \xD8\xD0 |0 + \xD8\xD7 |0 + \x8F\xBE\xD3 |0 + \xD8\xD6 |0 + \x8F\xBE\xD4 |0 + \xCB\xFD |0 + \xB4\xB7 |0 + \xD8\xD4 |0 + \xB7\xC5 |0 + \xB3\xB4 |0 + \xD8\xD1 |0 + \x8F\xBE\xD5 |0 + \xCE\xB8 |0 + \xD8\xD3 |0 + \xB0\xD6 |0 + \xD8\xD5 |0 + \x8F\xBE\xD6 |0 + \xD8\xCC |0 + \xD8\xD2 |0 + \xD8\xD9 |0 + \xB7\xC4 |0 + \xD8\xCD |0 + \x8F\xBE\xD7 |0 + \x8F\xBE\xD8 |0 + \x8F\xBE\xD9 |0 + \xCD\xDD |0 + \x8F\xBE\xDA |0 + \x8F\xBE\xDB |0 + \x8F\xBE\xDC |0 + \xCD\xAB |0 + \x8F\xBE\xDD |0 + \x8F\xBE\xDE |0 + \xD8\xDC |0 + \xD8\xE0 |0 + \x8F\xBE\xDF |0 + \x8F\xBE\xE0 |0 + \xC1\xFE |0 + \xCE\xF9 |0 + \xD8\xE1 |0 + \x8F\xBE\xE1 |0 + \x8F\xBE\xE2 |0 + \xD8\xDE |0 + \xD8\xDB |0 + \x8F\xBE\xE3 |0 + \x8F\xBE\xE4 |0 + \xD8\xDA |0 + \xD8\xDF |0 + \x8F\xBE\xE5 |0 + \x8F\xBE\xE6 |0 + \x8F\xBE\xE7 |0 + \x8F\xBE\xE8 |0 + \xCA\xB0 |0 + \x8F\xBE\xE9 |0 + \xC6\xB4 |0 + \x8F\xBE\xEA |0 + \xB7\xC6 |0 + \x8F\xBE\xEB |0 + \xD8\xE2 |0 + \xD8\xDD |0 + \x8F\xBE\xEC |0 + \xD8\xE3 |0 + \xB7\xFB |0 + \xB2\xB1 |0 + \x8F\xBE\xED |0 + \x8F\xBE\xEE |0 + \xD8\xEB |0 + \x8F\xBE\xEF |0 + \xB4\xB8 |0 + \x8F\xBE\xF0 |0 + \x8F\xBE\xF1 |0 + \x8F\xBE\xF2 |0 + \xD8\xE9 |0 + \xD8\xEA |0 + \xBA\xA9 |0 + \xD8\xE8 |0 + \xD8\xE6 |0 + \xD8\xE5 |0 + \xD8\xEC |0 + \xD8\xE4 |0 + \xD8\xEE |0 + \x8F\xBE\xF3 |0 + \x8F\xBE\xF4 |0 + \xB2\xFB |0 + \x8F\xBE\xF5 |0 + \x8F\xBE\xF6 |0 + \x8F\xBE\xF7 |0 + \x8F\xBE\xF8 |0 + \x8F\xBE\xF9 |0 + \x8F\xBE\xFA |0 + \x8F\xBE\xFB |0 + \xD8\xF0 |0 + \x8F\xBE\xFE |0 + \xD8\xEF |0 + \x8F\xBE\xFC |0 + \x8F\xBE\xFD |0 + \x8F\xBF\xA1 |0 + \x8F\xBF\xA2 |0 + \x8F\xBF\xA3 |0 + \xC4\xA8 |0 + \xD8\xF3 |0 + \xD8\xF1 |0 + \xD8\xE7 |0 + \xB7\xFC |0 + \xD8\xF2 |0 + \xD8\xF6 |0 + \xD8\xF5 |0 + \xD8\xF7 |0 + \xD8\xF4 |0 + \xD8\xF8 |0 + \x8F\xBF\xA4 |0 + \x8F\xBF\xA5 |0 + \x8F\xBF\xA6 |0 + \x8F\xBF\xA7 |0 + \xD8\xF9 |0 + \xD8\xFA |0 + \xCA\xEA |0 + \xD8\xFC |0 + \xD8\xFB |0 + \xBD\xBF |0 + \xC0\xAE |0 + \xB2\xE6 |0 + \xB2\xFC |0 + \x8F\xBF\xA8 |0 + \xD8\xFD |0 + \x8F\xBF\xA9 |0 + \xB0\xBF |0 + \xC0\xCC |0 + \xD8\xFE |0 + \x8F\xBF\xAA |0 + \xEC\xC3 |0 + \xD9\xA1 |0 + \xB7\xE1 |0 + \x8F\xBF\xAB |0 + \xD9\xA2 |0 + \x8F\xBF\xAC |0 + \x8F\xBF\xAD |0 + \xC0\xEF |0 + \x8F\xBF\xAE |0 + \x8F\xBF\xAF |0 + \xD9\xA3 |0 + \x8F\xBF\xB0 |0 + \xD9\xA4 |0 + \xB5\xBA |0 + \xD9\xA5 |0 + \xD9\xA6 |0 + \xD9\xA7 |0 + \xC2\xD7 |0 + \xB8\xCD |0 + \x8F\xBF\xB1 |0 + \xCC\xE1 |0 + \x8F\xBF\xB2 |0 + \xCB\xBC |0 + \xBD\xEA |0 + \xD9\xA8 |0 + \x8F\xBF\xB3 |0 + \x8F\xBF\xB4 |0 + \x8F\xBF\xB5 |0 + \x8F\xBF\xB6 |0 + \xC0\xF0 |0 + \xEE\xBD |0 + \xC8\xE2 |0 + \xBC\xEA |0 + \x8F\xBF\xB7 |0 + \xBA\xCD |0 + \xD9\xA9 |0 + \x8F\xBF\xB8 |0 + \x8F\xBF\xB9 |0 + \x8F\xBF\xBA |0 + \xC2\xC7 |0 + \x8F\xBF\xBB |0 + \xCA\xA7 |0 + \x8F\xBF\xBC |0 + \xC2\xF1 |0 + \x8F\xBF\xBD |0 + \xD9\xAC |0 + \x8F\xBF\xBE |0 + \xD9\xAA |0 + \xD9\xAD |0 + \xD9\xAB |0 + \x8F\xBF\xBF |0 + \xD9\xAE |0 + \x8F\xBF\xC0 |0 + \xCA\xB1 |0 + \x8F\xBF\xC1 |0 + \xB0\xB7 |0 + \x8F\xBF\xC2 |0 + \xC9\xDE |0 + \xC8\xE3 |0 + \x8F\xBF\xC3 |0 + \xD9\xAF |0 + \x8F\xBF\xC4 |0 + \xD9\xB2 |0 + \xBE\xB5 |0 + \xB5\xBB |0 + \xD9\xB0 |0 + \xD9\xB7 |0 + \xBE\xB6 |0 + \xD9\xB1 |0 + \xC7\xC4 |0 + \x8F\xBF\xC5 |0 + \x8F\xBF\xC6 |0 + \x8F\xBF\xC7 |0 + \x8F\xBF\xC8 |0 + \xCD\xDE |0 + \xD9\xB3 |0 + \xD9\xB4 |0 + \xD9\xB8 |0 + \xC5\xEA |0 + \xD9\xB5 |0 + \xB9\xB3 |0 + \xC0\xDE |0 + \xD9\xC6 |0 + \xC8\xB4 |0 + \xC2\xF2 |0 + \x8F\xBF\xC9 |0 + \x8F\xBF\xCA |0 + \xC8\xE4 |0 + \xDA\xAD |0 + \xCA\xFA |0 + \x8F\xBF\xCB |0 + \xC4\xF1 |0 + \x8F\xBF\xCC |0 + \x8F\xBF\xCD |0 + \xCB\xF5 |0 + \x8F\xBF\xCE |0 + \xD9\xBB |0 + \xB2\xA1 |0 + \xC3\xEA |0 + \x8F\xBF\xCF |0 + \x8F\xBF\xD0 |0 + \xD9\xC4 |0 + \x8F\xBF\xD1 |0 + \xC3\xB4 |0 + \xD9\xBE |0 + \xD9\xC5 |0 + \xD9\xC0 |0 + \xD9\xC7 |0 + \xD9\xC3 |0 + \xD9\xC2 |0 + \xC7\xEF |0 + \x8F\xBF\xD2 |0 + \xD9\xBC |0 + \xB2\xFD |0 + \xD9\xBA |0 + \xB5\xF1 |0 + \xC2\xF3 |0 + \xD9\xB6 |0 + \x8F\xBF\xD3 |0 + \x8F\xBF\xD4 |0 + \xD9\xB9 |0 + \xB9\xB4 |0 + \xC0\xDB |0 + \x8F\xBF\xD5 |0 + \xBE\xB7 |0 + \xD9\xC1 |0 + \xC7\xD2 |0 + \xB5\xF2 |0 + \xB3\xC8 |0 + \x8F\xBF\xD6 |0 + \xB3\xE7 |0 + \xBF\xA1 |0 + \xD9\xC9 |0 + \xD9\xCE |0 + \xD9\xCA |0 + \x8F\xBF\xD7 |0 + \xB7\xFD |0 + \x8F\xBF\xD8 |0 + \xD9\xCF |0 + \xBB\xA2 |0 + \xB9\xE9 |0 + \x8F\xBF\xD9 |0 + \x8F\xBF\xDA |0 + \xBD\xA6 |0 + \xD9\xBD |0 + \xBB\xFD |0 + \xD9\xCC |0 + \x8F\xBF\xDB |0 + \x8F\xBF\xDC |0 + \xBB\xD8 |0 + \xD9\xCD |0 + \xB0\xC4 |0 + \x8F\xBF\xDD |0 + \x8F\xBF\xDE |0 + \xD9\xC8 |0 + \x8F\xBF\xDF |0 + \x8F\xBF\xE0 |0 + \xC4\xA9 |0 + \x8F\xBF\xE1 |0 + \x8F\xBF\xE2 |0 + \x8F\xBF\xE3 |0 + \xB5\xF3 |0 + \xB6\xB4 |0 + \xD9\xCB |0 + \xB0\xA7 |0 + \x8F\xBF\xE4 |0 + \x8F\xBF\xE5 |0 + \xBA\xC3 |0 + \x8F\xBF\xE6 |0 + \xBF\xB6 |0 + \x8F\xBF\xE7 |0 + \x8F\xBF\xE8 |0 + \x8F\xBF\xE9 |0 + \xC4\xF2 |0 + \x8F\xBF\xEA |0 + \xC8\xD4 |0 + \xD9\xD1 |0 + \xC1\xDE |0 + \x8F\xBF\xEB |0 + \x8F\xBF\xEC |0 + \x8F\xBF\xED |0 + \x8F\xBF\xEE |0 + \x8F\xBF\xEF |0 + \xC2\xAA |0 + \x8F\xBF\xF0 |0 + \x8F\xBF\xF1 |0 + \xBB\xAB |0 + \xD9\xD2 |0 + \x8F\xBF\xF2 |0 + \xD9\xD4 |0 + \xD9\xD0 |0 + \x8F\xBF\xF3 |0 + \x8F\xBF\xF4 |0 + \x8F\xBF\xF5 |0 + \xCA\xE1 |0 + \xC4\xBD |0 + \x8F\xBF\xF6 |0 + \x8F\xBF\xF7 |0 + \xC1\xDC |0 + \x8F\xBF\xF8 |0 + \x8F\xBF\xF9 |0 + \xCA\xFB |0 + \xBC\xCE |0 + \xD9\xE0 |0 + \xD9\xDF |0 + \x8F\xBF\xFA |0 + \x8F\xBF\xFB |0 + \xBF\xF8 |0 + \x8F\xBF\xFC |0 + \xB7\xFE |0 + \x8F\xBF\xFD |0 + \x8F\xBF\xFE |0 + \xD9\xD9 |0 + \xBE\xB9 |0 + \x8F\xC0\xA1 |0 + \xC6\xE8 |0 + \xC7\xB1 |0 + \x8F\xC0\xA2 |0 + \x8F\xC0\xA3 |0 + \x8F\xC0\xA4 |0 + \xD9\xD7 |0 + \x8F\xC0\xA5 |0 + \xC1\xDD |0 + \x8F\xC0\xA6 |0 + \x8F\xC0\xA7 |0 + \xBC\xF8 |0 + \xD9\xDC |0 + \x8F\xC0\xA8 |0 + \xBE\xB8 |0 + \xD9\xD6 |0 + \xD9\xDB |0 + \x8F\xC0\xA9 |0 + \xC7\xD3 |0 + \x8F\xC0\xAA |0 + \x8F\xC0\xAB |0 + \xD9\xD5 |0 + \xB7\xA1 |0 + \x8F\xC0\xAC |0 + \x8F\xC0\xAD |0 + \xB3\xDD |0 + \x8F\xC0\xAE |0 + \xD9\xDD |0 + \xCE\xAB |0 + \xBA\xCE |0 + \xC3\xB5 |0 + \xD9\xDA |0 + \x8F\xC0\xAF |0 + \xC0\xDC |0 + \x8F\xC0\xB0 |0 + \xB9\xB5 |0 + \xBF\xE4 |0 + \xB1\xE6 |0 + \xC1\xBC |0 + \xD9\xD8 |0 + \xB5\xC5 |0 + \x8F\xC0\xB1 |0 + \x8F\xC0\xB2 |0 + \x8F\xC0\xB3 |0 + \xB7\xC7 |0 + \xC4\xCF |0 + \xD9\xDE |0 + \xC1\xDF |0 + \x8F\xC0\xB4 |0 + \xD9\xE1 |0 + \xD9\xE3 |0 + \x8F\xC0\xB5 |0 + \xC2\xB7 |0 + \xD9\xE9 |0 + \x8F\xC0\xB6 |0 + \xD9\xE4 |0 + \x8F\xC0\xB7 |0 + \xD9\xE6 |0 + \x8F\xC0\xB8 |0 + \xC9\xC1 |0 + \xC4\xF3 |0 + \x8F\xC0\xB9 |0 + \xD9\xE7 |0 + \x8F\xC0\xBA |0 + \x8F\xC0\xBB |0 + \x8F\xC0\xBC |0 + \xCD\xAC |0 + \xCD\xC8 |0 + \xB4\xB9 |0 + \x8F\xC0\xBD |0 + \x8F\xC0\xBE |0 + \xB0\xAE |0 + \xD9\xE5 |0 + \x8F\xC0\xBF |0 + \xD9\xE2 |0 + \x8F\xC0\xC0 |0 + \x8F\xC0\xC1 |0 + \xB4\xF8 |0 + \x8F\xC0\xC2 |0 + \x8F\xC0\xC3 |0 + \xB1\xE7 |0 + \x8F\xC0\xC4 |0 + \xD9\xE8 |0 + \x8F\xC0\xC5 |0 + \x8F\xC0\xC6 |0 + \xCD\xC9 |0 + \xD9\xEC |0 + \x8F\xC0\xC7 |0 + \x8F\xC0\xC8 |0 + \xC2\xBB |0 + \xD9\xF3 |0 + \x8F\xC0\xC9 |0 + \x8F\xC0\xCA |0 + \xD9\xED |0 + \x8F\xC0\xCB |0 + \xD9\xEA |0 + \xD9\xF1 |0 + \x8F\xC0\xCC |0 + \xD9\xD3 |0 + \x8F\xC0\xCD |0 + \x8F\xC0\xCE |0 + \x8F\xC0\xCF |0 + \x8F\xC0\xD0 |0 + \x8F\xC0\xD1 |0 + \xD9\xEE |0 + \xD9\xF2 |0 + \x8F\xC0\xD2 |0 + \x8F\xC0\xD3 |0 + \xC8\xC2 |0 + \xC5\xEB |0 + \x8F\xC0\xD4 |0 + \x8F\xC0\xD5 |0 + \xD9\xEB |0 + \x8F\xC0\xD6 |0 + \xD9\xEF |0 + \xB7\xC8 |0 + \x8F\xC0\xD7 |0 + \xBA\xF1 |0 + \x8F\xC0\xD8 |0 + \xC0\xDD |0 + \x8F\xC0\xD9 |0 + \xD9\xF7 |0 + \x8F\xC0\xDA |0 + \x8F\xC0\xDB |0 + \x8F\xC0\xDC |0 + \x8F\xC0\xDD |0 + \x8F\xC0\xDE |0 + \xC5\xA6 |0 + \x8F\xC0\xDF |0 + \x8F\xC0\xE0 |0 + \x8F\xC0\xE1 |0 + \x8F\xC0\xE2 |0 + \x8F\xC0\xE3 |0 + \x8F\xC0\xE4 |0 + \x8F\xC0\xE5 |0 + \x8F\xC0\xE6 |0 + \xD9\xF4 |0 + \xCB\xE0 |0 + \x8F\xC0\xE7 |0 + \xD9\xF5 |0 + \x8F\xC0\xE8 |0 + \x8F\xC0\xE9 |0 + \xD9\xF6 |0 + \xCC\xCE |0 + \xC0\xA2 |0 + \x8F\xC0\xEA |0 + \x8F\xC0\xEB |0 + \xB7\xE2 |0 + \x8F\xC0\xEC |0 + \x8F\xC0\xED |0 + \xD9\xFD |0 + \x8F\xC0\xEE |0 + \x8F\xC0\xEF |0 + \x8F\xC0\xF0 |0 + \xBB\xB5 |0 + \xD9\xFA |0 + \xD9\xF9 |0 + \x8F\xC0\xF1 |0 + \x8F\xC0\xF2 |0 + \xC7\xB2 |0 + \x8F\xC0\xF3 |0 + \x8F\xC0\xF4 |0 + \xC6\xB5 |0 + \x8F\xC0\xF5 |0 + \x8F\xC0\xF6 |0 + \x8F\xC0\xF7 |0 + \xC5\xB1 |0 + \xD9\xFB |0 + \x8F\xC0\xF8 |0 + \x8F\xC0\xF9 |0 + \xD9\xFC |0 + \xC9\xEF |0 + \x8F\xC0\xFA |0 + \xC7\xC5 |0 + \xBB\xA3 |0 + \xC0\xF1 |0 + \xCB\xD0 |0 + \x8F\xC0\xFB |0 + \xB3\xC9 |0 + \xDA\xA5 |0 + \xD9\xFE |0 + \x8F\xC0\xFC |0 + \x8F\xC0\xFD |0 + \x8F\xC0\xFE |0 + \xCD\xCA |0 + \xDA\xA7 |0 + \x8F\xC1\xA1 |0 + \xDA\xA3 |0 + \xDA\xA4 |0 + \x8F\xC1\xA2 |0 + \x8F\xC1\xA3 |0 + \x8F\xC1\xA4 |0 + \x8F\xC1\xA5 |0 + \xC1\xE0 |0 + \x8F\xC1\xA6 |0 + \x8F\xC1\xA7 |0 + \x8F\xC1\xA8 |0 + \xDA\xA2 |0 + \xD9\xBF |0 + \x8F\xC1\xA9 |0 + \x8F\xC1\xAA |0 + \xDA\xA6 |0 + \xDA\xA1 |0 + \xDA\xAB |0 + \xDA\xAC |0 + \xC5\xA7 |0 + \xDA\xAE |0 + \x8F\xC1\xAB |0 + \x8F\xC1\xAC |0 + \xBB\xA4 |0 + \xDA\xA9 |0 + \x8F\xC1\xAD |0 + \x8F\xC1\xAE |0 + \xB5\xBC |0 + \x8F\xC1\xAF |0 + \xDA\xAF |0 + \x8F\xC1\xB0 |0 + \xDA\xA8 |0 + \xDA\xB3 |0 + \xDA\xB2 |0 + \x8F\xC1\xB1 |0 + \xDA\xB1 |0 + \x8F\xC1\xB2 |0 + \xDA\xB4 |0 + \x8F\xC1\xB3 |0 + \xDA\xB6 |0 + \xBE\xF1 |0 + \x8F\xC1\xB4 |0 + \xDA\xB5 |0 + \x8F\xC1\xB5 |0 + \x8F\xC1\xB6 |0 + \xDA\xB9 |0 + \x8F\xC1\xB7 |0 + \x8F\xC1\xB8 |0 + \x8F\xC1\xB9 |0 + \x8F\xC1\xBA |0 + \x8F\xC1\xBB |0 + \x8F\xC1\xBC |0 + \x8F\xC1\xBD |0 + \xDA\xB7 |0 + \x8F\xC1\xBE |0 + \x8F\xC1\xBF |0 + \xDA\xB8 |0 + \xD9\xF0 |0 + \x8F\xC1\xC0 |0 + \x8F\xC1\xC1 |0 + \x8F\xC1\xC2 |0 + \xDA\xBB |0 + \xDA\xBA |0 + \x8F\xC1\xC3 |0 + \x8F\xC1\xC4 |0 + \xD9\xF8 |0 + \xDA\xBC |0 + \xDA\xB0 |0 + \x8F\xC1\xC5 |0 + \xBB\xD9 |0 + \x8F\xC1\xC6 |0 + \xDA\xBD |0 + \xDA\xBE |0 + \xDA\xC0 |0 + \xDA\xBF |0 + \xDA\xC1 |0 + \xB2\xFE |0 + \x8F\xC1\xC7 |0 + \xB9\xB6 |0 + \x8F\xC1\xC8 |0 + \x8F\xC1\xC9 |0 + \xCA\xFC |0 + \xC0\xAF |0 + \x8F\xC1\xCA |0 + \xB8\xCE |0 + \x8F\xC1\xCB |0 + \xDA\xC3 |0 + \x8F\xC1\xCC |0 + \xDA\xC6 |0 + \x8F\xF4\xB5 |0 + \xC9\xD2 |0 + \x8F\xC1\xCD |0 + \xB5\xDF |0 + \x8F\xC1\xCE |0 + \x8F\xC1\xCF |0 + \xDA\xC5 |0 + \xDA\xC4 |0 + \xC7\xD4 |0 + \xDA\xC7 |0 + \xB6\xB5 |0 + \xDA\xC9 |0 + \xDA\xC8 |0 + \x8F\xC1\xD0 |0 + \x8F\xC1\xD1 |0 + \xB4\xBA |0 + \xBB\xB6 |0 + \xC6\xD8 |0 + \x8F\xC1\xD2 |0 + \x8F\xC1\xD3 |0 + \xB7\xC9 |0 + \xBF\xF4 |0 + \xDA\xCA |0 + \xC0\xB0 |0 + \xC5\xA8 |0 + \xC9\xDF |0 + \xDA\xCB |0 + \x8F\xC1\xD4 |0 + \x8F\xC1\xD5 |0 + \x8F\xC1\xD6 |0 + \xDA\xCC |0 + \xDA\xCD |0 + \x8F\xC1\xD7 |0 + \xCA\xB8 |0 + \xD5\xDD |0 + \xC0\xC6 |0 + \x8F\xC1\xD8 |0 + \xC9\xCC |0 + \xBA\xD8 |0 + \xC8\xE5 |0 + \xC8\xC3 |0 + \x8F\xC1\xD9 |0 + \x8F\xC1\xDA |0 + \xC5\xCD |0 + \x8F\xC1\xDB |0 + \xCE\xC1 |0 + \xDA\xCF |0 + \xBC\xD0 |0 + \x8F\xC1\xDC |0 + \xDA\xD0 |0 + \x8F\xC1\xDD |0 + \xB0\xB6 |0 + \x8F\xC1\xDE |0 + \xB6\xD4 |0 + \xC0\xCD |0 + \x8F\xC1\xDF |0 + \xC9\xE0 |0 + \xDA\xD1 |0 + \xBB\xC2 |0 + \xC3\xC7 |0 + \x8F\xC1\xE0 |0 + \xBB\xDB |0 + \xBF\xB7 |0 + \x8F\xC1\xE1 |0 + \x8F\xC1\xE2 |0 + \x8F\xC1\xE3 |0 + \xDA\xD2 |0 + \xCA\xFD |0 + \xB1\xF7 |0 + \xBB\xDC |0 + \x8F\xC1\xE4 |0 + \xDA\xD5 |0 + \x8F\xC1\xE5 |0 + \xDA\xD3 |0 + \xDA\xD6 |0 + \xCE\xB9 |0 + \xDA\xD4 |0 + \x8F\xC1\xE6 |0 + \x8F\xC1\xE7 |0 + \xC0\xFB |0 + \xDA\xD7 |0 + \x8F\xC1\xE8 |0 + \xC2\xB2 |0 + \x8F\xC1\xE9 |0 + \xDA\xD8 |0 + \x8F\xC1\xEA |0 + \x8F\xC1\xEB |0 + \xB4\xFA |0 + \x8F\xC1\xEC |0 + \xDA\xDA |0 + \xDA\xD9 |0 + \x8F\xC1\xED |0 + \xDA\xDB |0 + \xDA\xDC |0 + \xB4\xFB |0 + \xC6\xFC |0 + \xC3\xB6 |0 + \xB5\xEC |0 + \xBB\xDD |0 + \xC1\xE1 |0 + \xBD\xDC |0 + \xB0\xB0 |0 + \x8F\xC1\xEE |0 + \xDA\xDD |0 + \x8F\xC1\xEF |0 + \x8F\xC1\xF0 |0 + \x8F\xC1\xF1 |0 + \x8F\xC1\xF2 |0 + \xB2\xA2 |0 + \xDA\xE1 |0 + \x8F\xC1\xF3 |0 + \x8F\xC1\xF4 |0 + \x8F\xC1\xF5 |0 + \xB9\xB7 |0 + \xDA\xE0 |0 + \x8F\xC1\xF6 |0 + \xBA\xAB |0 + \xBE\xBA |0 + \x8F\xC1\xF7 |0 + \x8F\xC1\xF8 |0 + \xDA\xDF |0 + \xBE\xBB |0 + \x8F\xC1\xF9 |0 + \xCC\xC0 |0 + \xBA\xAA |0 + \x8F\xC1\xFA |0 + \x8F\xC1\xFB |0 + \xB0\xD7 |0 + \xC0\xCE |0 + \x8F\xC1\xFC |0 + \x8F\xC1\xFD |0 + \xDA\xE6 |0 + \x8F\xC1\xFE |0 + \x8F\xC2\xA1 |0 + \xC0\xB1 |0 + \xB1\xC7 |0 + \x8F\xC2\xA2 |0 + \x8F\xC2\xA3 |0 + \x8F\xC2\xA4 |0 + \x8F\xC2\xA5 |0 + \xBD\xD5 |0 + \x8F\xC2\xA6 |0 + \xCB\xE6 |0 + \xBA\xF2 |0 + \x8F\xC2\xA7 |0 + \x8F\xC2\xA8 |0 + \x8F\xC2\xA9 |0 + \x8F\xC2\xAA |0 + \xBE\xBC |0 + \x8F\xC2\xAB |0 + \xC0\xA7 |0 + \x8F\xC2\xAC |0 + \x8F\xC2\xAD |0 + \x8F\xC2\xAE |0 + \xDA\xE5 |0 + \xDA\xE3 |0 + \xDA\xE4 |0 + \x8F\xC2\xB0 |0 + \x8F\xC2\xAF |0 + \x8F\xF4\xB6 |0 + \xC3\xEB |0 + \xDB\xA6 |0 + \x8F\xC2\xB1 |0 + \xDA\xEA |0 + \xBB\xFE |0 + \xB9\xB8 |0 + \xDA\xE8 |0 + \x8F\xC2\xB2 |0 + \x8F\xC2\xB3 |0 + \xDA\xE9 |0 + \x8F\xC2\xB4 |0 + \xBF\xB8 |0 + \x8F\xC2\xB5 |0 + \x8F\xC2\xB7 |0 + \xDA\xE7 |0 + \x8F\xC2\xB6 |0 + \xBB\xAF |0 + \x8F\xC2\xB8 |0 + \x8F\xC2\xB9 |0 + \x8F\xC2\xBA |0 + \x8F\xC2\xBB |0 + \x8F\xC2\xBC |0 + \xDA\xEC |0 + \xDA\xEB |0 + \xDA\xF0 |0 + \x8F\xC2\xBD |0 + \x8F\xC2\xBE |0 + \xDA\xF1 |0 + \xDA\xED |0 + \x8F\xF4\xB7 |0 + \xB3\xA2 |0 + \xDA\xEE |0 + \xDA\xEF |0 + \xC8\xD5 |0 + \x8F\xC2\xC0 |0 + \x8F\xC2\xC1 |0 + \x8F\xC2\xC2 |0 + \xC9\xE1 |0 + \xB7\xCA |0 + \xDA\xF2 |0 + \x8F\xC2\xC4 |0 + \xC0\xB2 |0 + \x8F\xC2\xC5 |0 + \xBE\xBD |0 + \x8F\xC2\xC7 |0 + \x8F\xC2\xC8 |0 + \x8F\xC2\xC9 |0 + \xC3\xD2 |0 + \x8F\xC2\xCA |0 + \x8F\xC2\xCC |0 + \x8F\xC2\xC3 |0 + \x8F\xC2\xC6 |0 + \x8F\xC2\xCB |0 + \xB6\xC7 |0 + \xDA\xF3 |0 + \xDA\xF7 |0 + \xB2\xCB |0 + \xDA\xF4 |0 + \xDA\xF6 |0 + \x8F\xC2\xCD |0 + \x8F\xC2\xCE |0 + \x8F\xC2\xCF |0 + \xDA\xF5 |0 + \x8F\xC2\xD0 |0 + \xBD\xEB |0 + \x8F\xC2\xD1 |0 + \xC3\xC8 |0 + \xB0\xC5 |0 + \xDA\xF8 |0 + \x8F\xC2\xD2 |0 + \x8F\xC2\xD3 |0 + \x8F\xC2\xD4 |0 + \x8F\xC2\xD5 |0 + \xDA\xF9 |0 + \x8F\xC2\xD6 |0 + \x8F\xC2\xD7 |0 + \xC4\xAA |0 + \x8F\xC2\xD8 |0 + \xCE\xF1 |0 + \xBB\xC3 |0 + \x8F\xC2\xD9 |0 + \xCA\xEB |0 + \x8F\xC2\xDA |0 + \x8F\xC2\xDB |0 + \xCB\xBD |0 + \x8F\xC2\xDC |0 + \xDB\xA2 |0 + \xDA\xFB |0 + \x8F\xC2\xDD |0 + \xDA\xFE |0 + \xDA\xFD |0 + \x8F\xC2\xDE |0 + \x8F\xC2\xDF |0 + \xDA\xFA |0 + \x8F\xC2\xE0 |0 + \x8F\xC2\xE1 |0 + \xDB\xA1 |0 + \xC6\xDE |0 + \x8F\xC2\xE2 |0 + \xDA\xFC |0 + \x8F\xC2\xE3 |0 + \x8F\xC2\xE4 |0 + \x8F\xC2\xE5 |0 + \x8F\xC2\xE6 |0 + \xDB\xA3 |0 + \xBD\xEC |0 + \xDB\xA4 |0 + \x8F\xC2\xE7 |0 + \xCD\xCB |0 + \xC7\xF8 |0 + \x8F\xC2\xE8 |0 + \xDB\xA5 |0 + \xDB\xA7 |0 + \x8F\xC2\xE9 |0 + \xDB\xA8 |0 + \x8F\xC2\xEA |0 + \x8F\xC2\xEB |0 + \x8F\xC2\xEC |0 + \xDB\xA9 |0 + \xB6\xCA |0 + \xB1\xC8 |0 + \xB9\xB9 |0 + \xDB\xAA |0 + \xDB\xAB |0 + \xBD\xF1 |0 + \xC1\xE2 |0 + \x8F\xC2\xED |0 + \x8F\xC2\xBF |0 + \xD2\xD8 |0 + \xC1\xBE |0 + \xC1\xBD |0 + \xC2\xD8 |0 + \xBA\xC7 |0 + \xD0\xF2 |0 + \x8F\xC2\xEE |0 + \x8F\xC2\xEF |0 + \xB7\xEE |0 + \xCD\xAD |0 + \xCA\xFE |0 + \xC9\xFE |0 + \x8F\xC2\xF0 |0 + \xDB\xAC |0 + \x8F\xC2\xF1 |0 + \xBA\xF3 |0 + \xC4\xBF |0 + \xDB\xAD |0 + \xCF\xAF |0 + \x8F\xC2\xF2 |0 + \xCB\xBE |0 + \x8F\xC2\xF3 |0 + \xC4\xAB |0 + \xDB\xAE |0 + \xB4\xFC |0 + \x8F\xC2\xF4 |0 + \x8F\xC2\xF5 |0 + \xDB\xAF |0 + \xDB\xB0 |0 + \xCC\xDA |0 + \xCC\xA4 |0 + \xCB\xF6 |0 + \xCB\xDC |0 + \xBB\xA5 |0 + \xDB\xB2 |0 + \xBC\xEB |0 + \x8F\xC2\xF6 |0 + \xCB\xD1 |0 + \xDB\xB4 |0 + \xDB\xB7 |0 + \xDB\xB6 |0 + \xB4\xF9 |0 + \xB5\xE0 |0 + \x8F\xC2\xF7 |0 + \xDB\xB3 |0 + \xDB\xB5 |0 + \x8F\xC2\xF8 |0 + \xDB\xB8 |0 + \x8F\xC2\xF9 |0 + \x8F\xC2\xFA |0 + \xBF\xF9 |0 + \x8F\xC2\xFB |0 + \xCD\xFB |0 + \xB0\xC9 |0 + \xBA\xE0 |0 + \xC2\xBC |0 + \xBC\xDD |0 + \x8F\xC2\xFC |0 + \x8F\xC2\xFD |0 + \xBE\xF3 |0 + \xDB\xBB |0 + \xC5\xCE |0 + \x8F\xC2\xFE |0 + \xDB\xB9 |0 + \xC2\xAB |0 + \xDB\xBA |0 + \xBE\xF2 |0 + \xCC\xDD |0 + \xDB\xBC |0 + \xDB\xBD |0 + \xCD\xE8 |0 + \x8F\xC3\xA1 |0 + \xDB\xC2 |0 + \x8F\xC3\xA2 |0 + \xB9\xBA |0 + \x8F\xC3\xA3 |0 + \xC7\xD5 |0 + \xDB\xBF |0 + \xC5\xEC |0 + \xDA\xDE |0 + \xDA\xE2 |0 + \x8F\xC3\xA4 |0 + \xB5\xCF |0 + \x8F\xC3\xA5 |0 + \xC7\xC7 |0 + \x8F\xC3\xA6 |0 + \xDB\xC1 |0 + \xBE\xBE |0 + \xC8\xC4 |0 + \x8F\xC3\xA7 |0 + \x8F\xC3\xA8 |0 + \xDB\xC7 |0 + \xC8\xFA |0 + \xDB\xBE |0 + \xDB\xC4 |0 + \xDB\xC3 |0 + \x8F\xC3\xA9 |0 + \x8F\xC3\xAA |0 + \xC0\xCF |0 + \x8F\xC3\xAB |0 + \x8F\xC3\xAC |0 + \xCB\xED |0 + \x8F\xC3\xAD |0 + \xCE\xD3 |0 + \x8F\xC3\xAE |0 + \x8F\xC3\xAF |0 + \xCB\xE7 |0 + \x8F\xC3\xB0 |0 + \xB2\xCC |0 + \xBB\xDE |0 + \xCF\xC8 |0 + \xDB\xC6 |0 + \xBF\xF5 |0 + \xDB\xC5 |0 + \xDB\xC0 |0 + \xB8\xCF |0 + \x8F\xC3\xB1 |0 + \x8F\xC3\xB2 |0 + \x8F\xC3\xB3 |0 + \xDB\xCC |0 + \xDB\xCA |0 + \x8F\xC3\xB4 |0 + \xB2\xCD |0 + \xDB\xC8 |0 + \xDB\xCE |0 + \xDB\xD4 |0 + \x8F\xC3\xB5 |0 + \x8F\xC3\xB6 |0 + \x8F\xC3\xB7 |0 + \x8F\xC3\xB9 |0 + \xC2\xC8 |0 + \x8F\xC3\xBA |0 + \x8F\xC3\xBB |0 + \xCA\xC1 |0 + \x8F\xC3\xBC |0 + \xDB\xD6 |0 + \x8F\xC3\xBD |0 + \x8F\xC3\xBE |0 + \xC9\xA2 |0 + \xDB\xD5 |0 + \xC7\xF0 |0 + \xCB\xBF |0 + \xB4\xBB |0 + \x8F\xC3\xBF |0 + \xC0\xF7 |0 + \xBD\xC0 |0 + \x8F\xC3\xC0 |0 + \xC4\xD3 |0 + \x8F\xC3\xC1 |0 + \xCD\xAE |0 + \x8F\xC3\xC2 |0 + \xDB\xD1 |0 + \xDB\xD0 |0 + \x8F\xC3\xC3 |0 + \xDB\xD2 |0 + \xDB\xCF |0 + \x8F\xC3\xC4 |0 + \xDB\xD7 |0 + \xDB\xCD |0 + \xDB\xCB |0 + \xDB\xD3 |0 + \xDB\xC9 |0 + \x8F\xC3\xC5 |0 + \xC3\xEC |0 + \x8F\xC3\xC6 |0 + \xCC\xF8 |0 + \xBC\xC6 |0 + \xBA\xF4 |0 + \x8F\xC3\xC7 |0 + \x8F\xC3\xC8 |0 + \x8F\xC3\xB8 |0 + \xBA\xBA |0 + \xCB\xEF |0 + \xB3\xC1 |0 + \x8F\xF4\xBA |0 + \xC4\xCE |0 + \xC6\xCA |0 + \xB1\xC9 |0 + \xBA\xF4 |1 + \xC0\xF2 |0 + \x8F\xC3\xCA |0 + \xC0\xB4 |0 + \xB7\xAA |0 + \x8F\xC3\xCB |0 + \x8F\xC3\xCC |0 + \xDB\xD9 |0 + \x8F\xC3\xCD |0 + \xB9\xBB |0 + \xB3\xFC |0 + \x8F\xC3\xCF |0 + \x8F\xC3\xCE |0 + \xDB\xDB |0 + \xB3\xF4 |0 + \xDB\xE1 |0 + \x8F\xC3\xD0 |0 + \x8F\xC3\xD1 |0 + \x8F\xC3\xD2 |0 + \x8F\xC3\xD3 |0 + \x8F\xC3\xD4 |0 + \xDB\xDE |0 + \x8F\xC3\xD5 |0 + \xC0\xF3 |0 + \xB3\xCB |0 + \xBA\xAC |0 + \x8F\xC3\xD6 |0 + \xB3\xCA |0 + \xBA\xCF |0 + \x8F\xC3\xD7 |0 + \xDB\xDC |0 + \xB7\xE5 |0 + \xB7\xCB |0 + \xC5\xED |0 + \x8F\xC3\xD8 |0 + \x8F\xC3\xD9 |0 + \xDB\xDA |0 + \xB0\xC6 |0 + \x8F\xC3\xDA |0 + \x8F\xC3\xDB |0 + \xDB\xDD |0 + \xDB\xDF |0 + \xB6\xCD |0 + \xB7\xAC |0 + \x8F\xC3\xC9 |0 + \xB4\xBC |0 + \xB5\xCB |0 + \x8F\xC3\xDC |0 + \x8F\xC3\xDD |0 + \x8F\xC3\xDE |0 + \xDB\xE2 |0 + \x8F\xC3\xDF |0 + \xBA\xF9 |0 + \xCB\xF1 |0 + \xBB\xB7 |0 + \xDB\xE3 |0 + \xC9\xB0 |0 + \x8F\xC3\xE0 |0 + \x8F\xC3\xE1 |0 + \x8F\xC3\xE2 |0 + \x8F\xC3\xE3 |0 + \x8F\xC3\xE4 |0 + \x8F\xC3\xE5 |0 + \xDB\xEF |0 + \x8F\xC3\xE6 |0 + \xB2\xB3 |0 + \xDB\xE4 |0 + \x8F\xC3\xE7 |0 + \x8F\xC3\xE8 |0 + \x8F\xC3\xE9 |0 + \x8F\xC3\xEA |0 + \xDB\xF5 |0 + \xDB\xE5 |0 + \xCE\xC2 |0 + \x8F\xC3\xEB |0 + \xDB\xEC |0 + \x8F\xC3\xEC |0 + \xC7\xDF |0 + \x8F\xC3\xED |0 + \x8F\xC3\xEE |0 + \xDB\xF4 |0 + \xDB\xF4 |1 + \xDB\xE7 |0 + \xB0\xB4 |0 + \xDB\xE9 |0 + \x8F\xC3\xEF |0 + \xB9\xBC |0 + \x8F\xC3\xF0 |0 + \x8F\xC3\xF1 |0 + \xDB\xEB |0 + \x8F\xC3\xF2 |0 + \xDB\xEA |0 + \xDB\xE6 |0 + \xDB\xF1 |0 + \x8F\xC3\xF3 |0 + \xBE\xBF |0 + \x8F\xC3\xF4 |0 + \x8F\xC3\xF5 |0 + \xD4\xED |0 + \xB8\xE8 |0 + \xCD\xFC |0 + \x8F\xC3\xF6 |0 + \x8F\xC3\xF7 |0 + \xDB\xE8 |0 + \x8F\xC3\xF8 |0 + \xC4\xF4 |0 + \xB3\xA3 |0 + \xBA\xAD |0 + \x8F\xC3\xF9 |0 + \xDB\xE0 |0 + \xDB\xF0 |0 + \xB3\xE1 |0 + \xDB\xEE |0 + \xDB\xF2 |0 + \x8F\xC3\xFA |0 + \xC5\xEE |0 + \xB4\xFE |0 + \x8F\xC3\xFB |0 + \xDC\xB2 |0 + \x8F\xC3\xFC |0 + \xCC\xC9 |0 + \xDB\xF7 |0 + \xB4\xFD |0 + \x8F\xC3\xFD |0 + \xDB\xFE |0 + \x8F\xC3\xFE |0 + \x8F\xC4\xA1 |0 + \x8F\xC4\xA2 |0 + \xCB\xC0 |0 + \x8F\xC4\xA3 |0 + \xDC\xA1 |0 + \xDC\xA3 |0 + \x8F\xC4\xA4 |0 + \xDC\xA7 |0 + \xDB\xF9 |0 + \x8F\xC4\xA5 |0 + \xC3\xAA |0 + \x8F\xC4\xA6 |0 + \x8F\xC4\xA7 |0 + \xC5\xEF |0 + \xDC\xAB |0 + \xDB\xFC |0 + \xDC\xA8 |0 + \x8F\xC4\xA8 |0 + \xDC\xA2 |0 + \x8F\xC4\xA9 |0 + \x8F\xC4\xAA |0 + \x8F\xC4\xAB |0 + \x8F\xC4\xAC |0 + \x8F\xC4\xAD |0 + \xBF\xB9 |0 + \xDC\xAC |0 + \x8F\xC4\xAE |0 + \x8F\xC4\xAF |0 + \xC0\xB3 |0 + \x8F\xC4\xB0 |0 + \x8F\xC4\xB1 |0 + \xDC\xAA |0 + \xB4\xBD |0 + \x8F\xC4\xB2 |0 + \x8F\xC4\xB3 |0 + \x8F\xC4\xB4 |0 + \xCF\xD0 |0 + \xDB\xF6 |0 + \xDC\xA6 |0 + \xB0\xD8 |0 + \x8F\xC4\xB5 |0 + \xDB\xF8 |0 + \x8F\xC4\xB6 |0 + \x8F\xC4\xB7 |0 + \xCC\xBA |0 + \xDB\xFD |0 + \xBF\xA2 |0 + \xC4\xC7 |0 + \xDB\xF3 |0 + \x8F\xC4\xB8 |0 + \x8F\xC4\xB9 |0 + \xDC\xA5 |0 + \x8F\xC4\xBA |0 + \x8F\xC4\xBB |0 + \x8F\xC4\xBC |0 + \xBF\xFA |0 + \xDC\xAF |0 + \xB3\xF1 |0 + \xB8\xA1 |0 + \xDC\xB1 |0 + \xDB\xFA |0 + \xDC\xB0 |0 + \xDC\xA9 |0 + \xDB\xFB |0 + \xDC\xAD |0 + \xDC\xAE |0 + \xDC\xBF |0 + \x8F\xC4\xBD |0 + \x8F\xC4\xBE |0 + \xC6\xCE |0 + \x8F\xC4\xBF |0 + \xDC\xA4 |0 + \x8F\xC4\xC0 |0 + \xDC\xBB |0 + \x8F\xC4\xC1 |0 + \xDC\xBD |0 + \xC4\xD8 |0 + \x8F\xC4\xC2 |0 + \x8F\xC4\xC3 |0 + \x8F\xC4\xC4 |0 + \xCD\xCC |0 + \x8F\xC4\xC5 |0 + \xC9\xF6 |0 + \xDC\xB8 |0 + \xC2\xCA |0 + \x8F\xC4\xC6 |0 + \xDC\xBE |0 + \xC1\xBF |0 + \x8F\xC4\xC7 |0 + \xDC\xB5 |0 + \xDC\xC2 |0 + \xDC\xC1 |0 + \xC6\xEF |0 + \xDC\xC0 |0 + \xC6\xEA |0 + \x8F\xC4\xC8 |0 + \x8F\xC4\xC9 |0 + \x8F\xC4\xCA |0 + \x8F\xC4\xCB |0 + \x8F\xC4\xCC |0 + \x8F\xC4\xCD |0 + \xDC\xC4 |0 + \xDC\xB7 |0 + \x8F\xC4\xCE |0 + \xB6\xC8 |0 + \xDC\xBA |0 + \xBD\xDD |0 + \x8F\xC4\xCF |0 + \x8F\xC4\xD0 |0 + \x8F\xC4\xD1 |0 + \xC7\xE0 |0 + \xDC\xBC |0 + \xB6\xCB |0 + \xDC\xB4 |0 + \xDC\xB6 |0 + \xDC\xB3 |0 + \x8F\xC4\xD2 |0 + \x8F\xC4\xD3 |0 + \xCF\xB0 |0 + \xB3\xDA |0 + \xDC\xB9 |0 + \x8F\xC4\xD4 |0 + \x8F\xC4\xD5 |0 + \xDC\xC3 |0 + \xB3\xB5 |0 + \xBA\xE7 |0 + \x8F\xC4\xD6 |0 + \xB1\xDD |0 + \xDC\xD4 |0 + \x8F\xC4\xD7 |0 + \xCF\xB1 |0 + \xDC\xD7 |0 + \x8F\xC4\xD8 |0 + \x8F\xC4\xD9 |0 + \xBF\xBA |0 + \xDC\xD6 |0 + \xDC\xD5 |0 + \x8F\xC4\xDA |0 + \x8F\xC4\xDB |0 + \x8F\xC4\xDC |0 + \xDC\xD2 |0 + \x8F\xC4\xDD |0 + \x8F\xC4\xDE |0 + \x8F\xC4\xDF |0 + \xDC\xC6 |0 + \x8F\xC4\xE0 |0 + \xDC\xE3 |0 + \xDC\xC5 |0 + \xDC\xD8 |0 + \x8F\xC4\xE1 |0 + \x8F\xC4\xE2 |0 + \x8F\xC4\xE3 |0 + \xDC\xD0 |0 + \x8F\xC4\xE4 |0 + \xDC\xCB |0 + \xDC\xC8 |0 + \xDC\xC9 |0 + \xDC\xD1 |0 + \x8F\xC4\xE5 |0 + \xF4\xA2 |0 + \x8F\xC4\xE6 |0 + \xDC\xCE |0 + \xB9\xBD |0 + \xC4\xC8 |0 + \xC1\xE4 |0 + \xDC\xCC |0 + \xDC\xC7 |0 + \x8F\xC4\xE7 |0 + \xDC\xCA |0 + \x8F\xC4\xE8 |0 + \x8F\xC4\xE9 |0 + \xCD\xCD |0 + \xCB\xEA |0 + \xDC\xCF |0 + \xDC\xD9 |0 + \x8F\xC4\xEA |0 + \x8F\xC4\xEB |0 + \xDC\xE1 |0 + \xDC\xDA |0 + \xDC\xE7 |0 + \xDC\xE5 |0 + \x8F\xC4\xEC |0 + \x8F\xC4\xED |0 + \x8F\xC4\xEE |0 + \xDC\xE0 |0 + \x8F\xC4\xEF |0 + \x8F\xC4\xF0 |0 + \xDC\xDF |0 + \xC4\xD0 |0 + \xC1\xE5 |0 + \x8F\xC4\xF1 |0 + \xDC\xDD |0 + \x8F\xC4\xF2 |0 + \x8F\xC4\xF3 |0 + \xDC\xDB |0 + \x8F\xC4\xF4 |0 + \xDC\xE2 |0 + \xDC\xE8 |0 + \xC8\xF5 |0 + \xDC\xEE |0 + \x8F\xC4\xF5 |0 + \x8F\xC4\xF6 |0 + \xDC\xE9 |0 + \xDC\xEC |0 + \xDC\xE6 |0 + \x8F\xC4\xF7 |0 + \xC3\xF4 |0 + \xC9\xB8 |0 + \x8F\xC4\xF8 |0 + \xDC\xDC |0 + \x8F\xC4\xF9 |0 + \xDC\xE4 |0 + \xBE\xC0 |0 + \x8F\xC4\xFA |0 + \xCC\xCF |0 + \xDC\xF8 |0 + \xDC\xEB |0 + \x8F\xC4\xFB |0 + \x8F\xC4\xFC |0 + \xB8\xA2 |0 + \xB2\xA3 |0 + \xB3\xDF |0 + \xDC\xD3 |0 + \x8F\xC4\xFD |0 + \x8F\xC4\xFE |0 + \x8F\xC5\xA1 |0 + \xBE\xC1 |0 + \xDC\xF0 |0 + \x8F\xC5\xA2 |0 + \xDC\xF7 |0 + \xBC\xF9 |0 + \xB3\xF2 |0 + \x8F\xC5\xA3 |0 + \xC3\xAE |0 + \x8F\xC5\xA4 |0 + \x8F\xC5\xA5 |0 + \xDC\xED |0 + \x8F\xC5\xA6 |0 + \x8F\xC5\xA7 |0 + \xDC\xF2 |0 + \xDC\xF6 |0 + \x8F\xC5\xA8 |0 + \x8F\xC5\xA9 |0 + \xB6\xB6 |0 + \x8F\xC5\xAA |0 + \x8F\xC5\xAB |0 + \x8F\xC5\xAC |0 + \x8F\xC5\xAD |0 + \x8F\xC5\xAE |0 + \x8F\xC5\xAF |0 + \xB5\xCC |0 + \xDC\xF4 |0 + \x8F\xC5\xB0 |0 + \xB5\xA1 |0 + \xC6\xCB |0 + \xDC\xF3 |0 + \x8F\xC5\xB1 |0 + \xDC\xF5 |0 + \x8F\xC5\xB2 |0 + \x8F\xC5\xB3 |0 + \x8F\xF4\xBD |0 + \x8F\xC5\xB4 |0 + \xDC\xEF |0 + \x8F\xC5\xB5 |0 + \xDC\xF1 |0 + \x8F\xC5\xB6 |0 + \xB3\xE0 |0 + \xC3\xC9 |0 + \x8F\xC5\xB7 |0 + \x8F\xC5\xB8 |0 + \xDC\xFC |0 + \x8F\xC5\xB9 |0 + \x8F\xC5\xBA |0 + \x8F\xC5\xBB |0 + \x8F\xC5\xBC |0 + \xDC\xFA |0 + \xB8\xE9 |0 + \xDC\xF9 |0 + \x8F\xC5\xBD |0 + \xDD\xA1 |0 + \x8F\xC5\xBE |0 + \xDB\xD8 |0 + \x8F\xC5\xBF |0 + \x8F\xC5\xC0 |0 + \x8F\xC5\xC1 |0 + \xDC\xFB |0 + \xDC\xFD |0 + \xDC\xFE |0 + \x8F\xC5\xC2 |0 + \xDD\xAC |0 + \x8F\xC5\xC3 |0 + \xDD\xA8 |0 + \xDB\xED |0 + \x8F\xC5\xC4 |0 + \x8F\xC5\xC5 |0 + \x8F\xC5\xC6 |0 + \xDD\xA7 |0 + \x8F\xC5\xC7 |0 + \xDD\xA6 |0 + \xDD\xA3 |0 + \x8F\xC5\xC8 |0 + \x8F\xC5\xC9 |0 + \x8F\xC5\xCA |0 + \xDC\xEA |0 + \xDD\xA5 |0 + \xDD\xA4 |0 + \x8F\xC5\xCB |0 + \x8F\xC5\xCD |0 + \x8F\xC5\xCC |0 + \x8F\xC5\xCE |0 + \x8F\xC5\xCF |0 + \xDD\xAA |0 + \xCF\xA6 |0 + \x8F\xC5\xD0 |0 + \x8F\xC5\xD1 |0 + \x8F\xC5\xD2 |0 + \xDD\xAD |0 + \xB6\xFB |0 + \x8F\xC5\xD3 |0 + \x8F\xC5\xD4 |0 + \xDD\xA9 |0 + \xDD\xAB |0 + \x8F\xF4\xBE |0 + \x8F\xC5\xD5 |0 + \x8F\xC5\xD6 |0 + \xC8\xA7 |0 + \xDD\xAE |0 + \x8F\xC5\xD7 |0 + \x8F\xC5\xD8 |0 + \x8F\xC5\xD9 |0 + \x8F\xC5\xDA |0 + \xDD\xB2 |0 + \xDD\xAF |0 + \x8F\xC5\xDB |0 + \x8F\xC5\xDC |0 + \x8F\xC5\xDD |0 + \x8F\xC5\xDE |0 + \xCD\xF3 |0 + \xDD\xB0 |0 + \x8F\xC5\xDF |0 + \x8F\xC5\xE0 |0 + \x8F\xC5\xE1 |0 + \xDC\xDE |0 + \x8F\xC5\xE2 |0 + \x8F\xC5\xE3 |0 + \x8F\xC5\xE4 |0 + \xDD\xB3 |0 + \xDD\xB4 |0 + \x8F\xC5\xE5 |0 + \x8F\xC5\xE6 |0 + \xB1\xB5 |0 + \x8F\xC5\xE7 |0 + \xDD\xB6 |0 + \xB7\xE7 |0 + \xBC\xA1 |0 + \xB6\xD5 |0 + \x8F\xC5\xE8 |0 + \xB2\xA4 |0 + \x8F\xC5\xE9 |0 + \x8F\xC5\xEA |0 + \x8F\xC5\xEB |0 + \x8F\xC5\xEC |0 + \xCD\xDF |0 + \x8F\xC5\xED |0 + \x8F\xC5\xEE |0 + \xDD\xB8 |0 + \xDD\xB7 |0 + \xDD\xBA |0 + \xB5\xBD |0 + \x8F\xC5\xEF |0 + \xB6\xD6 |0 + \xB4\xBE |0 + \x8F\xC5\xF0 |0 + \xDD\xBD |0 + \x8F\xC5\xF1 |0 + \xDD\xBC |0 + \xDD\xBE |0 + \x8F\xC5\xF2 |0 + \xB2\xCE |0 + \x8F\xC5\xF3 |0 + \xC3\xB7 |0 + \xDD\xBF |0 + \x8F\xC5\xF4 |0 + \xB4\xBF |0 + \xDD\xC1 |0 + \x8F\xC5\xF5 |0 + \x8F\xC5\xF6 |0 + \xDD\xC0 |0 + \xDD\xC2 |0 + \x8F\xC5\xF7 |0 + \xDD\xC3 |0 + \x8F\xC5\xF8 |0 + \xDD\xC4 |0 + \xBB\xDF |0 + \xC0\xB5 |0 + \xBA\xA1 |0 + \xC9\xF0 |0 + \x8F\xC5\xF9 |0 + \xCA\xE2 |0 + \xCF\xC4 |0 + \x8F\xC5\xFA |0 + \x8F\xC5\xFB |0 + \xBB\xF5 |0 + \x8F\xC5\xFC |0 + \xBA\xD0 |0 + \xCE\xF2 |0 + \x8F\xC5\xFD |0 + \xDD\xC5 |0 + \xDD\xC6 |0 + \xBB\xE0 |0 + \x8F\xC5\xFE |0 + \x8F\xC6\xA1 |0 + \xDD\xC7 |0 + \xDD\xC8 |0 + \x8F\xC6\xA2 |0 + \xDD\xCA |0 + \xDD\xC9 |0 + \x8F\xC6\xA3 |0 + \xCB\xD8 |0 + \xBD\xDE |0 + \xBC\xEC |0 + \xBB\xC4 |0 + \xDD\xCB |0 + \xDD\xCD |0 + \xBF\xA3 |0 + \x8F\xC6\xA4 |0 + \xDD\xCC |0 + \x8F\xC6\xA5 |0 + \xDD\xCE |0 + \x8F\xC6\xA6 |0 + \x8F\xC6\xA7 |0 + \x8F\xC6\xA8 |0 + \x8F\xC6\xA9 |0 + \xDD\xCF |0 + \x8F\xC6\xAA |0 + \x8F\xC6\xAB |0 + \xDD\xD0 |0 + \xDD\xD1 |0 + \x8F\xC6\xAC |0 + \x8F\xC6\xAD |0 + \x8F\xC6\xAE |0 + \xDD\xD2 |0 + \x8F\xC6\xAF |0 + \xDD\xD4 |0 + \xDD\xD3 |0 + \xDD\xD5 |0 + \xB2\xA5 |0 + \xC3\xCA |0 + \xDD\xD6 |0 + \x8F\xC6\xB0 |0 + \x8F\xC6\xB1 |0 + \xBB\xA6 |0 + \xB3\xCC |0 + \xDD\xD7 |0 + \x8F\xC6\xB2 |0 + \x8F\xC6\xB3 |0 + \xC5\xC2 |0 + \xD4\xCC |0 + \x8F\xC6\xB4 |0 + \x8F\xC6\xB5 |0 + \xB5\xA3 |0 + \xDD\xD8 |0 + \x8F\xC6\xB6 |0 + \xDD\xD9 |0 + \x8F\xC6\xB7 |0 + \xCA\xEC |0 + \xCB\xE8 |0 + \xC6\xC7 |0 + \xDD\xDA |0 + \xC8\xE6 |0 + \x8F\xC6\xB8 |0 + \xC8\xFB |0 + \x8F\xC6\xB9 |0 + \xCC\xD3 |0 + \xDD\xDB |0 + \x8F\xC6\xBA |0 + \x8F\xC6\xBB |0 + \x8F\xC6\xBC |0 + \x8F\xC6\xBD |0 + \xDD\xDD |0 + \xDD\xDC |0 + \x8F\xC6\xBE |0 + \xDD\xDF |0 + \x8F\xC6\xBF |0 + \xDD\xDE |0 + \x8F\xC6\xC0 |0 + \x8F\xC6\xC1 |0 + \x8F\xC6\xC2 |0 + \x8F\xC6\xC3 |0 + \x8F\xC6\xC4 |0 + \x8F\xC6\xC5 |0 + \xDD\xE1 |0 + \x8F\xC6\xC6 |0 + \x8F\xC6\xC7 |0 + \x8F\xC6\xC8 |0 + \xBB\xE1 |0 + \x8F\xC6\xC9 |0 + \xCC\xB1 |0 + \x8F\xC6\xCA |0 + \xDD\xE2 |0 + \xDD\xE3 |0 + \xB5\xA4 |0 + \x8F\xC6\xCB |0 + \xDD\xE4 |0 + \x8F\xC6\xCC |0 + \xDD\xE6 |0 + \xDD\xE5 |0 + \x8F\xC6\xCD |0 + \x8F\xC6\xCE |0 + \x8F\xC6\xCF |0 + \x8F\xC6\xD0 |0 + \x8F\xC6\xD1 |0 + \x8F\xC6\xD2 |0 + \xBF\xE5 |0 + \x8F\xC6\xD3 |0 + \x8F\xC6\xD4 |0 + \xC9\xB9 |0 + \xB1\xCA |0 + \x8F\xC6\xD5 |0 + \x8F\xC6\xD6 |0 + \xC8\xC5 |0 + \x8F\xC6\xD7 |0 + \xC4\xF5 |0 + \xBD\xC1 |0 + \xB5\xE1 |0 + \x8F\xC6\xD8 |0 + \x8F\xC6\xD9 |0 + \x8F\xC6\xDA |0 + \xC8\xC6 |0 + \x8F\xC6\xDB |0 + \xBC\xAE |0 + \x8F\xC6\xDC |0 + \x8F\xC6\xDD |0 + \xDD\xE8 |0 + \xB4\xC0 |0 + \x8F\xC6\xDE |0 + \xB1\xF8 |0 + \x8F\xC6\xDF |0 + \x8F\xC6\xE0 |0 + \xC6\xF2 |0 + \xDD\xE7 |0 + \xB9\xBE |0 + \xC3\xD3 |0 + \xDD\xE9 |0 + \x8F\xC7\xB6 |0 + \xDD\xF1 |0 + \xDD\xEA |0 + \x8F\xC6\xE1 |0 + \x8F\xC6\xE2 |0 + \x8F\xC6\xE3 |0 + \xC2\xC1 |0 + \xB5\xE2 |0 + \xDD\xF2 |0 + \x8F\xC6\xE4 |0 + \x8F\xC6\xE5 |0 + \x8F\xC6\xE6 |0 + \x8F\xC6\xE7 |0 + \xB7\xE8 |0 + \x8F\xC6\xE8 |0 + \xB5\xA5 |0 + \xDD\xF0 |0 + \xDD\xEE |0 + \xDD\xEB |0 + \xCD\xE0 |0 + \x8F\xC6\xE9 |0 + \x8F\xC6\xEA |0 + \x8F\xC6\xEB |0 + \xC4\xC0 |0 + \x8F\xC6\xEC |0 + \xC6\xD9 |0 + \xDD\xEC |0 + \xDD\xF4 |0 + \xDD\xF3 |0 + \xB7\xA3 |0 + \x8F\xC6\xED |0 + \x8F\xC6\xEE |0 + \xB2\xAD |0 + \x8F\xC6\xEF |0 + \x8F\xC6\xF0 |0 + \xBA\xBB |0 + \xDD\xED |0 + \xDD\xEF |0 + \x8F\xC6\xF1 |0 + \x8F\xC6\xF2 |0 + \xCB\xD7 |0 + \xC2\xF4 |0 + \xCB\xF7 |0 + \xDD\xFC |0 + \x8F\xC6\xF3 |0 + \xDD\xFD |0 + \x8F\xC6\xF4 |0 + \xB2\xCF |0 + \x8F\xC6\xF5 |0 + \xCA\xA8 |0 + \xCC\xFD |0 + \xDE\xA1 |0 + \xBC\xA3 |0 + \xBE\xC2 |0 + \xDD\xF8 |0 + \xDD\xFE |0 + \xB1\xE8 |0 + \xB6\xB7 |0 + \x8F\xC6\xF6 |0 + \xDD\xF5 |0 + \xDD\xFA |0 + \x8F\xC6\xF7 |0 + \xC0\xF4 |0 + \xC7\xF1 |0 + \xC8\xE7 |0 + \x8F\xC6\xF8 |0 + \x8F\xC6\xF9 |0 + \x8F\xC6\xFA |0 + \x8F\xC6\xFB |0 + \x8F\xC6\xFC |0 + \xDD\xF7 |0 + \x8F\xC6\xFD |0 + \xCB\xA1 |0 + \x8F\xC6\xFE |0 + \xDD\xF9 |0 + \xDE\xA4 |0 + \x8F\xC7\xA1 |0 + \xDE\xA2 |0 + \x8F\xC7\xA2 |0 + \xDD\xFB |0 + \x8F\xC7\xA3 |0 + \xCB\xA2 |0 + \xC7\xC8 |0 + \xB5\xE3 |0 + \xC5\xA5 |0 + \x8F\xC7\xA4 |0 + \xC3\xED |0 + \x8F\xC7\xA5 |0 + \xDE\xA5 |0 + \x8F\xC7\xA6 |0 + \x8F\xC7\xA7 |0 + \x8F\xC7\xA8 |0 + \xDE\xA3 |0 + \xC2\xD9 |0 + \xDD\xF6 |0 + \x8F\xC7\xA9 |0 + \xB1\xCB |0 + \x8F\xC7\xAA |0 + \x8F\xC7\xAB |0 + \x8F\xC7\xAC |0 + \x8F\xC7\xAD |0 + \xCD\xCE |0 + \xDE\xB0 |0 + \x8F\xC7\xAE |0 + \x8F\xC7\xAF |0 + \x8F\xC7\xB0 |0 + \xDE\xAF |0 + \x8F\xC7\xB1 |0 + \xC0\xF6 |0 + \xDE\xAC |0 + \x8F\xC7\xB2 |0 + \xCD\xEC |0 + \xC6\xB6 |0 + \xDE\xA6 |0 + \xC4\xC5 |0 + \x8F\xC7\xB3 |0 + \x8F\xC7\xB4 |0 + \x8F\xC7\xB5 |0 + \xB1\xCC |0 + \xB9\xBF |0 + \xDE\xA9 |0 + \x8F\xC7\xB7 |0 + \x8F\xC7\xB8 |0 + \x8F\xC7\xB9 |0 + \xBD\xA7 |0 + \xDE\xAE |0 + \xDE\xAD |0 + \xDE\xA8 |0 + \xDE\xAB |0 + \x8F\xC7\xBA |0 + \xB3\xE8 |0 + \x8F\xC7\xBB |0 + \xDE\xAA |0 + \xC7\xC9 |0 + \x8F\xC7\xBC |0 + \xCE\xAE |0 + \xBE\xF4 |0 + \xC0\xF5 |0 + \x8F\xC7\xBD |0 + \xDE\xB6 |0 + \xDE\xB4 |0 + \xC9\xCD |0 + \x8F\xC7\xBE |0 + \x8F\xC7\xBF |0 + \x8F\xC7\xC0 |0 + \xDE\xB1 |0 + \xDE\xB3 |0 + \x8F\xC7\xC1 |0 + \xB1\xBA |0 + \x8F\xC7\xC2 |0 + \xB9\xC0 |0 + \xCF\xB2 |0 + \xB3\xBD |0 + \xC9\xE2 |0 + \x8F\xC7\xC3 |0 + \x8F\xC7\xC4 |0 + \xCD\xE1 |0 + \xB3\xA4 |0 + \xBF\xBB |0 + \xDE\xB5 |0 + \x8F\xC7\xC5 |0 + \x8F\xC7\xC6 |0 + \xDE\xBA |0 + \x8F\xC7\xC7 |0 + \xBE\xC3 |0 + \xCD\xB0 |0 + \xDE\xB7 |0 + \x8F\xC7\xC8 |0 + \x8F\xC7\xC9 |0 + \xDE\xB2 |0 + \x8F\xC7\xCA |0 + \xDE\xB8 |0 + \x8F\xC7\xCB |0 + \x8F\xC7\xCC |0 + \x8F\xC7\xCD |0 + \xCE\xDE |0 + \xC5\xF3 |0 + \xC6\xC2 |0 + \x8F\xC7\xCE |0 + \x8F\xC7\xCF |0 + \xB3\xB6 |0 + \xB1\xD5 |0 + \x8F\xC7\xD0 |0 + \xDE\xBE |0 + \x8F\xC7\xD1 |0 + \xDE\xC1 |0 + \x8F\xC7\xD2 |0 + \xCE\xC3 |0 + \x8F\xC7\xD3 |0 + \x8F\xC7\xD4 |0 + \xCD\xE4 |0 + \x8F\xC7\xD5 |0 + \xDE\xC8 |0 + \xDE\xC2 |0 + \xDE\xBF |0 + \x8F\xC7\xD6 |0 + \x8F\xC7\xD7 |0 + \xCE\xD4 |0 + \xDE\xC5 |0 + \x8F\xC7\xD8 |0 + \x8F\xC7\xD9 |0 + \xBD\xCA |0 + \xDE\xC7 |0 + \xDE\xCC |0 + \x8F\xC7\xDA |0 + \xC5\xF1 |0 + \xDE\xCA |0 + \x8F\xC7\xDB |0 + \x8F\xC7\xDC |0 + \xDE\xC4 |0 + \x8F\xC7\xDD |0 + \x8F\xC7\xDE |0 + \xC3\xB8 |0 + \x8F\xC7\xDF |0 + \xDE\xCB |0 + \x8F\xC7\xE0 |0 + \xDE\xC0 |0 + \xDE\xC6 |0 + \x8F\xC7\xE1 |0 + \xDE\xCD |0 + \xB0\xFC |0 + \xDE\xC3 |0 + \xDE\xCE |0 + \x8F\xC7\xE2 |0 + \x8F\xC7\xE3 |0 + \xBF\xBC |0 + \x8F\xF4\xC0 |0 + \xBD\xDF |0 + \x8F\xC7\xE4 |0 + \xCA\xA5 |0 + \x8F\xC7\xE5 |0 + \xBA\xAE |0 + \x8F\xF4\xBF |0 + \xDE\xBB |0 + \xDE\xC9 |0 + \xC5\xBA |0 + \x8F\xC7\xE6 |0 + \x8F\xC7\xE7 |0 + \x8F\xC7\xE8 |0 + \xC0\xB6 |0 + \xB3\xE9 |0 + \xBA\xD1 |0 + \xBE\xC4 |0 + \xDE\xBD |0 + \xBD\xC2 |0 + \xB7\xCC |0 + \xDE\xBC |0 + \xDE\xD2 |0 + \xBD\xED |0 + \xB8\xBA |0 + \xDE\xE1 |0 + \x8F\xC7\xE9 |0 + \xDE\xDB |0 + \xB5\xF4 |0 + \xC5\xCF |0 + \x8F\xC7\xEA |0 + \xDE\xD6 |0 + \xDE\xDF |0 + \xB0\xAF |0 + \xB1\xB2 |0 + \x8F\xC7\xEB |0 + \xB2\xB9 |0 + \xDE\xD8 |0 + \xC2\xAC |0 + \xDE\xCF |0 + \xDE\xD1 |0 + \xB9\xC1 |0 + \x8F\xC7\xEC |0 + \x8F\xC7\xED |0 + \xDE\xE2 |0 + \x8F\xC7\xEE |0 + \xDE\xDD |0 + \x8F\xC7\xEF |0 + \x8F\xC7\xF0 |0 + \xDE\xD5 |0 + \xDE\xDC |0 + \x8F\xC7\xF1 |0 + \x8F\xC7\xF2 |0 + \x8F\xC7\xF3 |0 + \x8F\xC7\xF4 |0 + \xCC\xAB |0 + \x8F\xC7\xF5 |0 + \xDE\xDA |0 + \xDE\xDE |0 + \x8F\xC7\xF6 |0 + \x8F\xC7\xF7 |0 + \x8F\xC7\xF8 |0 + \x8F\xC7\xF9 |0 + \x8F\xC7\xFA |0 + \xB8\xD0 |0 + \x8F\xC7\xFB |0 + \xBE\xC5 |0 + \xC3\xB9 |0 + \x8F\xC7\xFC |0 + \x8F\xC7\xFD |0 + \x8F\xC7\xFE |0 + \xDE\xD4 |0 + \x8F\xC8\xA1 |0 + \x8F\xC8\xA2 |0 + \xCD\xAF |0 + \x8F\xC8\xA3 |0 + \xDE\xD7 |0 + \xDE\xD0 |0 + \xC5\xF2 |0 + \xDE\xD3 |0 + \x8F\xC8\xA4 |0 + \xDE\xD9 |0 + \x8F\xC8\xA5 |0 + \x8F\xC8\xA6 |0 + \xCF\xD1 |0 + \xBC\xBE |0 + \xCB\xFE |0 + \xDE\xE3 |0 + \xC8\xAE |0 + \x8F\xC8\xA7 |0 + \xDE\xEF |0 + \xB8\xBB |0 + \x8F\xC8\xA8 |0 + \xBD\xE0 |0 + \xDE\xE5 |0 + \x8F\xC8\xA9 |0 + \xCE\xAF |0 + \xB9\xC2 |0 + \xDE\xF2 |0 + \x8F\xC8\xAA |0 + \xB0\xEE |0 + \xDE\xF0 |0 + \x8F\xC8\xAB |0 + \xDE\xE4 |0 + \x8F\xC8\xAC |0 + \x8F\xC8\xAD |0 + \xDE\xEA |0 + \x8F\xC8\xAE |0 + \xDE\xEC |0 + \x8F\xC8\xAF |0 + \xCD\xCF |0 + \xDE\xE7 |0 + \xC5\xAE |0 + \x8F\xC8\xB0 |0 + \xDE\xE9 |0 + \x8F\xC8\xB1 |0 + \x8F\xC8\xB2 |0 + \x8F\xC8\xB3 |0 + \xDE\xF1 |0 + \x8F\xC8\xB4 |0 + \xDE\xEB |0 + \xCC\xC7 |0 + \x8F\xC8\xB5 |0 + \x8F\xC8\xB6 |0 + \xDE\xE6 |0 + \x8F\xC8\xB7 |0 + \xBC\xA2 |0 + \xDE\xFE |0 + \x8F\xC8\xB8 |0 + \x8F\xC8\xB9 |0 + \x8F\xC8\xBA |0 + \xB3\xEA |0 + \xDE\xE8 |0 + \xDE\xED |0 + \xDE\xEE |0 + \xC2\xEC |0 + \xC2\xDA |0 + \x8F\xC8\xBB |0 + \xDE\xF6 |0 + \x8F\xC8\xBC |0 + \x8F\xC8\xBD |0 + \xDE\xFC |0 + \xDE\xFA |0 + \xC5\xA9 |0 + \xDF\xA3 |0 + \xDE\xF7 |0 + \x8F\xC8\xBE |0 + \x8F\xC8\xBF |0 + \x8F\xC8\xC0 |0 + \xDE\xF8 |0 + \xDE\xE0 |0 + \xB5\xF9 |0 + \xC9\xBA |0 + \x8F\xC8\xC1 |0 + \xBC\xBF |0 + \x8F\xC8\xC2 |0 + \xB9\xF7 |0 + \x8F\xC8\xC3 |0 + \x8F\xC8\xC4 |0 + \x8F\xC8\xC5 |0 + \xCF\xB3 |0 + \xDE\xF4 |0 + \xDF\xA2 |0 + \xB1\xE9 |0 + \xC1\xE6 |0 + \x8F\xC8\xC6 |0 + \x8F\xC8\xC7 |0 + \x8F\xC8\xC8 |0 + \x8F\xC8\xC9 |0 + \xC7\xF9 |0 + \xB4\xC1 |0 + \xCE\xFA |0 + \x8F\xC8\xCA |0 + \x8F\xC8\xCB |0 + \x8F\xC8\xCC |0 + \xCC\xA1 |0 + \xC4\xD2 |0 + \x8F\xC8\xD3 |0 + \x8F\xC8\xCD |0 + \x8F\xC8\xCE |0 + \xDE\xFB |0 + \xDE\xFD |0 + \x8F\xC8\xCF |0 + \x8F\xC8\xD0 |0 + \xC1\xB2 |0 + \x8F\xC8\xD1 |0 + \x8F\xC8\xD2 |0 + \xDF\xA1 |0 + \xDE\xF9 |0 + \xDE\xF3 |0 + \xB4\xC3 |0 + \x8F\xC8\xD4 |0 + \x8F\xC8\xD5 |0 + \x8F\xC8\xD6 |0 + \x8F\xC8\xD7 |0 + \xB7\xE9 |0 + \x8F\xC8\xD8 |0 + \xDF\xAF |0 + \x8F\xC8\xD9 |0 + \x8F\xC8\xDA |0 + \xDF\xAA |0 + \xC0\xF8 |0 + \x8F\xC8\xDB |0 + \x8F\xC8\xDC |0 + \xB3\xE3 |0 + \x8F\xC8\xDD |0 + \x8F\xC8\xDE |0 + \xBD\xE1 |0 + \xDF\xB3 |0 + \x8F\xC8\xDF |0 + \x8F\xC8\xE0 |0 + \xDF\xAC |0 + \xC4\xAC |0 + \xDF\xA9 |0 + \xC4\xD9 |0 + \xDF\xCC |0 + \xDF\xA6 |0 + \xDF\xA5 |0 + \xDF\xAE |0 + \x8F\xC8\xE1 |0 + \x8F\xC8\xE2 |0 + \xDF\xA8 |0 + \xDF\xA7 |0 + \xDF\xAD |0 + \x8F\xC8\xE3 |0 + \xC0\xA1 |0 + \xDF\xA4 |0 + \x8F\xC8\xE4 |0 + \x8F\xC8\xE5 |0 + \x8F\xC8\xE6 |0 + \x8F\xC8\xE7 |0 + \x8F\xC8\xE8 |0 + \xDF\xB0 |0 + \x8F\xC8\xE9 |0 + \xDF\xB1 |0 + \x8F\xC8\xEA |0 + \x8F\xC8\xEB |0 + \x8F\xC8\xEC |0 + \x8F\xC8\xED |0 + \xB4\xC2 |0 + \x8F\xC8\xEE |0 + \x8F\xC8\xEF |0 + \x8F\xC8\xF0 |0 + \xDF\xB6 |0 + \xDF\xB5 |0 + \xDF\xB7 |0 + \x8F\xC8\xF1 |0 + \x8F\xC8\xF2 |0 + \x8F\xC8\xF3 |0 + \x8F\xC8\xF4 |0 + \xDF\xBA |0 + \x8F\xC8\xF5 |0 + \x8F\xC8\xF6 |0 + \x8F\xC8\xF7 |0 + \xC5\xC3 |0 + \xDF\xB4 |0 + \x8F\xC8\xF8 |0 + \x8F\xC8\xF9 |0 + \xDF\xB8 |0 + \x8F\xC8\xFA |0 + \xB7\xE3 |0 + \xC2\xF9 |0 + \xDF\xB2 |0 + \xC7\xBB |0 + \x8F\xC8\xFB |0 + \xDF\xB9 |0 + \x8F\xC8\xFC |0 + \x8F\xC8\xFD |0 + \x8F\xC8\xFE |0 + \xDF\xBE |0 + \xDF\xBC |0 + \xDF\xBF |0 + \x8F\xC9\xA1 |0 + \xDF\xC2 |0 + \x8F\xC9\xA2 |0 + \xDF\xBB |0 + \xB9\xEA |0 + \xC7\xA8 |0 + \xDE\xB9 |0 + \x8F\xC9\xA3 |0 + \x8F\xC9\xA4 |0 + \xCD\xF4 |0 + \xDF\xBD |0 + \xDF\xC1 |0 + \xC2\xF5 |0 + \x8F\xC9\xA5 |0 + \xDF\xC0 |0 + \xDF\xAB |0 + \x8F\xC9\xA6 |0 + \xEF\xE9 |0 + \x8F\xC9\xA7 |0 + \xDF\xC5 |0 + \x8F\xC9\xA8 |0 + \x8F\xC9\xA9 |0 + \xDF\xC9 |0 + \x8F\xC9\xAA |0 + \xDF\xC7 |0 + \x8F\xC9\xAB |0 + \x8F\xC9\xAC |0 + \x8F\xC9\xAD |0 + \xDF\xC3 |0 + \xDF\xC4 |0 + \x8F\xC9\xAE |0 + \xDF\xC8 |0 + \xDF\xC6 |0 + \xC9\xCE |0 + \x8F\xC9\xAF |0 + \xDF\xCE |0 + \xDF\xCB |0 + \xDF\xCA |0 + \xDF\xCD |0 + \xC6\xD4 |0 + \xDF\xCF |0 + \x8F\xC9\xB0 |0 + \x8F\xC9\xB1 |0 + \xC3\xF5 |0 + \xC2\xED |0 + \x8F\xF4\xC2 |0 + \xC0\xA5 |0 + \x8F\xC9\xB2 |0 + \xDF\xD0 |0 + \xDF\xD2 |0 + \x8F\xC9\xB3 |0 + \x8F\xC9\xB4 |0 + \x8F\xC9\xB5 |0 + \x8F\xC9\xB6 |0 + \xDF\xD1 |0 + \x8F\xC9\xB7 |0 + \x8F\xC9\xB8 |0 + \x8F\xC9\xB9 |0 + \x8F\xC9\xBA |0 + \x8F\xC9\xBB |0 + \x8F\xC9\xBC |0 + \xDE\xF5 |0 + \x8F\xC9\xC1 |0 + \xDF\xD3 |0 + \x8F\xC9\xBD |0 + \x8F\xC9\xBE |0 + \xC6\xE7 |0 + \x8F\xC9\xBF |0 + \x8F\xC9\xC0 |0 + \xDF\xD4 |0 + \x8F\xC9\xC2 |0 + \x8F\xC9\xC3 |0 + \xB2\xD0 |0 + \x8F\xC9\xC4 |0 + \x8F\xC9\xC5 |0 + \xC5\xF4 |0 + \xB3\xA5 |0 + \x8F\xC9\xC6 |0 + \x8F\xC9\xC7 |0 + \xB5\xE4 |0 + \xBC\xDE |0 + \xBA\xD2 |0 + \x8F\xC9\xC8 |0 + \x8F\xC9\xC9 |0 + \x8F\xC9\xCA |0 + \x8F\xC9\xCB |0 + \xCF\xA7 |0 + \xBF\xE6 |0 + \xB1\xEA |0 + \xDF\xD6 |0 + \x8F\xC9\xCC |0 + \x8F\xC9\xCD |0 + \x8F\xC9\xCE |0 + \x8F\xC9\xCF |0 + \x8F\xC9\xD0 |0 + \xDF\xD5 |0 + \x8F\xC9\xD1 |0 + \x8F\xC9\xD2 |0 + \x8F\xC9\xD3 |0 + \xDF\xD9 |0 + \xC3\xBA |0 + \xDF\xDC |0 + \xDF\xD7 |0 + \x8F\xC9\xD4 |0 + \x8F\xC9\xD5 |0 + \xDF\xDB |0 + \x8F\xC9\xD6 |0 + \x8F\xC9\xD7 |0 + \xDF\xDA |0 + \xC5\xC0 |0 + \xB0\xD9 |0 + \x8F\xF4\xA1 |0 + \xCE\xF5 |0 + \x8F\xC9\xD8 |0 + \xDF\xDE |0 + \xB1\xA8 |0 + \x8F\xC9\xD9 |0 + \x8F\xC9\xDA |0 + \x8F\xC9\xDB |0 + \x8F\xC9\xDC |0 + \x8F\xC9\xDD |0 + \x8F\xC9\xDE |0 + \xDF\xE0 |0 + \x8F\xC9\xDF |0 + \xDF\xDF |0 + \xDF\xDD |0 + \x8F\xC9\xE0 |0 + \xDF\xD8 |0 + \xCB\xA3 |0 + \x8F\xC9\xE1 |0 + \xDF\xE2 |0 + \x8F\xC9\xE2 |0 + \x8F\xC9\xE3 |0 + \x8F\xC9\xE4 |0 + \x8F\xC9\xE5 |0 + \x8F\xC9\xE6 |0 + \xDF\xE1 |0 + \x8F\xC9\xE7 |0 + \x8F\xC9\xE8 |0 + \x8F\xC9\xE9 |0 + \xB1\xEB |0 + \xDF\xE4 |0 + \xCA\xB2 |0 + \xDF\xE3 |0 + \x8F\xC9\xEA |0 + \x8F\xC9\xEB |0 + \xCC\xB5 |0 + \xBE\xC7 |0 + \x8F\xC9\xEC |0 + \x8F\xC9\xED |0 + \x8F\xC9\xEE |0 + \x8F\xC9\xEF |0 + \x8F\xC9\xF0 |0 + \xC1\xB3 |0 + \x8F\xC9\xF1 |0 + \xBE\xC6 |0 + \x8F\xC9\xF2 |0 + \x8F\xC9\xF3 |0 + \x8F\xC9\xF4 |0 + \x8F\xC9\xF5 |0 + \xCE\xFB |0 + \x8F\xC9\xF6 |0 + \x8F\xC9\xF7 |0 + \xDF\xEA |0 + \xC0\xF9 |0 + \x8F\xC9\xF8 |0 + \x8F\xC9\xF9 |0 + \xDF\xE6 |0 + \xDF\xEB |0 + \x8F\xC9\xFA |0 + \xB1\xEC |0 + \x8F\xC9\xFB |0 + \x8F\xC9\xFC |0 + \x8F\xC9\xFD |0 + \x8F\xC9\xFE |0 + \xDF\xE9 |0 + \xC7\xE1 |0 + \xDF\xE5 |0 + \xDF\xE8 |0 + \xBE\xC8 |0 + \x8F\xCA\xA1 |0 + \xC8\xD1 |0 + \xDF\xEC |0 + \xBC\xD1 |0 + \x8F\xCA\xA2 |0 + \xC0\xFA |0 + \x8F\xCA\xA3 |0 + \xDF\xEF |0 + \x8F\xCA\xA4 |0 + \x8F\xCA\xA5 |0 + \xDF\xE7 |0 + \xB7\xA7 |0 + \x8F\xCA\xA6 |0 + \xDF\xED |0 + \x8F\xCA\xA7 |0 + \xCD\xD0 |0 + \xDF\xF0 |0 + \xF4\xA6 |0 + \x8F\xCA\xA8 |0 + \x8F\xCA\xA9 |0 + \xBD\xCF |0 + \x8F\xCA\xAA |0 + \x8F\xCA\xAB |0 + \xDF\xF1 |0 + \xDF\xF2 |0 + \x8F\xCA\xAC |0 + \x8F\xCA\xAD |0 + \xC7\xAE |0 + \x8F\xCA\xAE |0 + \x8F\xCA\xAF |0 + \xDF\xF4 |0 + \x8F\xCA\xB0 |0 + \xDF\xF5 |0 + \x8F\xCA\xB1 |0 + \x8F\xCA\xB2 |0 + \x8F\xCA\xB3 |0 + \xC7\xB3 |0 + \x8F\xCA\xB4 |0 + \xC5\xF5 |0 + \xDF\xF7 |0 + \x8F\xCA\xB5 |0 + \x8F\xCA\xB6 |0 + \xDF\xF9 |0 + \xCE\xD5 |0 + \xDF\xF6 |0 + \x8F\xCA\xB7 |0 + \xDF\xF8 |0 + \xB1\xED |0 + \x8F\xCA\xB8 |0 + \xDF\xF3 |0 + \x8F\xCA\xB9 |0 + \x8F\xCA\xBA |0 + \x8F\xCA\xBB |0 + \xD3\xDB |0 + \xDF\xFA |0 + \xC1\xE7 |0 + \xBB\xB8 |0 + \xDF\xFC |0 + \xDF\xFB |0 + \xBF\xA4 |0 + \xD2\xD9 |0 + \xDF\xFD |0 + \x8F\xCA\xBC |0 + \xE0\xA1 |0 + \xDF\xEE |0 + \xDF\xFE |0 + \x8F\xCA\xBD |0 + \xE0\xA2 |0 + \x8F\xCA\xBE |0 + \xC7\xFA |0 + \x8F\xCA\xBF |0 + \x8F\xCA\xC0 |0 + \x8F\xCA\xC1 |0 + \xE0\xA3 |0 + \xE0\xA4 |0 + \x8F\xCA\xC2 |0 + \x8F\xCA\xC3 |0 + \x8F\xCA\xC4 |0 + \xE0\xA5 |0 + \x8F\xCA\xC5 |0 + \x8F\xCA\xC6 |0 + \x8F\xCA\xC7 |0 + \xE0\xA6 |0 + \xC4\xDE |0 + \x8F\xCA\xC8 |0 + \xE0\xA8 |0 + \xE0\xA7 |0 + \x8F\xCA\xC9 |0 + \xE0\xA9 |0 + \xE0\xAA |0 + \x8F\xCA\xCA |0 + \xBC\xDF |0 + \xC9\xE3 |0 + \x8F\xCA\xCB |0 + \x8F\xCA\xCC |0 + \xCC\xEC |0 + \xE0\xAB |0 + \xE0\xAC |0 + \xC1\xD6 |0 + \xBC\xA4 |0 + \xE0\xAD |0 + \xE0\xAE |0 + \x8F\xCA\xCD |0 + \x8F\xCA\xCE |0 + \x8F\xCA\xCF |0 + \x8F\xCA\xD0 |0 + \xE0\xAF |0 + \xCA\xD2 |0 + \xC8\xC7 |0 + \xE0\xB0 |0 + \xC7\xD7 |0 + \x8F\xCA\xD1 |0 + \x8F\xCA\xD2 |0 + \x8F\xCA\xD3 |0 + \xC4\xAD |0 + \x8F\xCA\xD4 |0 + \x8F\xCA\xD5 |0 + \x8F\xCA\xD6 |0 + \xE0\xB1 |0 + \xB2\xE7 |0 + \x8F\xCA\xD7 |0 + \xB5\xED |0 + \x8F\xCA\xD8 |0 + \xCC\xC6 |0 + \x8F\xCA\xD9 |0 + \xCC\xB6 |0 + \x8F\xCA\xDA |0 + \xB2\xB4 |0 + \xCF\xB4 |0 + \x8F\xCA\xDB |0 + \xCB\xD2 |0 + \x8F\xCA\xDC |0 + \xCA\xAA |0 + \x8F\xCA\xDD |0 + \x8F\xCA\xDE |0 + \x8F\xCA\xDF |0 + \x8F\xCA\xE0 |0 + \xC0\xB7 |0 + \xE0\xB2 |0 + \x8F\xCA\xE1 |0 + \x8F\xCA\xE2 |0 + \xC6\xC3 |0 + \x8F\xCA\xE3 |0 + \x8F\xCA\xE4 |0 + \xB8\xA3 |0 + \xE0\xB3 |0 + \x8F\xCA\xE5 |0 + \xBA\xD4 |0 + \xE0\xB5 |0 + \xE0\xB4 |0 + \x8F\xCA\xE6 |0 + \xE0\xB6 |0 + \x8F\xCA\xE7 |0 + \x8F\xCA\xE8 |0 + \x8F\xCA\xE9 |0 + \xE0\xB7 |0 + \x8F\xCA\xEA |0 + \xE0\xB8 |0 + \x8F\xCA\xEB |0 + \xB5\xBE |0 + \xE0\xB9 |0 + \xE0\xBA |0 + \x8F\xCA\xEC |0 + \xB8\xA4 |0 + \x8F\xCA\xED |0 + \x8F\xCA\xEE |0 + \xC8\xC8 |0 + \x8F\xCA\xEF |0 + \xE0\xBC |0 + \x8F\xCA\xF0 |0 + \xBE\xF5 |0 + \xE0\xBB |0 + \x8F\xCA\xF1 |0 + \x8F\xCA\xF2 |0 + \xB6\xB8 |0 + \xE0\xBD |0 + \xE0\xBF |0 + \xE0\xBE |0 + \x8F\xCA\xF3 |0 + \x8F\xCA\xF4 |0 + \x8F\xCA\xF5 |0 + \xE0\xC0 |0 + \xB8\xD1 |0 + \xE0\xC1 |0 + \x8F\xCA\xF6 |0 + \x8F\xCA\xF7 |0 + \xB6\xE9 |0 + \x8F\xCA\xF8 |0 + \xC1\xC0 |0 + \xB9\xFD |0 + \x8F\xCA\xF9 |0 + \xE0\xC3 |0 + \xE0\xC4 |0 + \xE0\xC2 |0 + \x8F\xCA\xFA |0 + \xBC\xED |0 + \xC6\xC8 |0 + \xB6\xB9 |0 + \x8F\xCA\xFB |0 + \x8F\xCA\xFC |0 + \xE0\xC6 |0 + \xC3\xAC |0 + \xE0\xC5 |0 + \x8F\xCA\xFD |0 + \x8F\xCA\xFE |0 + \xCF\xB5 |0 + \xC7\xE2 |0 + \x8F\xCB\xA1 |0 + \x8F\xCB\xA2 |0 + \x8F\xCB\xA3 |0 + \x8F\xCB\xA4 |0 + \x8F\xCB\xA5 |0 + \xE0\xC9 |0 + \x8F\xCB\xA6 |0 + \x8F\xCB\xA7 |0 + \x8F\xCB\xA8 |0 + \x8F\xCB\xA9 |0 + \xE0\xCB |0 + \xE0\xC8 |0 + \x8F\xCB\xAA |0 + \x8F\xCB\xAB |0 + \xCC\xD4 |0 + \xE0\xCA |0 + \xE0\xCC |0 + \x8F\xCB\xAC |0 + \xCE\xC4 |0 + \x8F\xCB\xAD |0 + \x8F\xCB\xAE |0 + \xE0\xD0 |0 + \x8F\xCB\xAF |0 + \x8F\xCB\xB0 |0 + \xE0\xCF |0 + \xC3\xF6 |0 + \xC7\xAD |0 + \x8F\xCB\xB1 |0 + \xB8\xA5 |0 + \xE0\xCE |0 + \x8F\xCB\xB2 |0 + \x8F\xCB\xB3 |0 + \xE0\xCD |0 + \x8F\xCB\xB4 |0 + \xCD\xB1 |0 + \xCD\xB2 |0 + \x8F\xCB\xB5 |0 + \x8F\xCB\xB6 |0 + \x8F\xCB\xB7 |0 + \xE0\xD1 |0 + \xB1\xEE |0 + \x8F\xCB\xB8 |0 + \xB9\xF6 |0 + \xBB\xE2 |0 + \x8F\xCB\xB9 |0 + \xE0\xD2 |0 + \xE0\xD3 |0 + \x8F\xCB\xBA |0 + \x8F\xCB\xBB |0 + \x8F\xCB\xBC |0 + \xE0\xD5 |0 + \x8F\xCB\xBD |0 + \x8F\xCB\xBE |0 + \x8F\xCB\xBF |0 + \x8F\xCB\xC0 |0 + \x8F\xCB\xC1 |0 + \xBD\xC3 |0 + \x8F\xCB\xC2 |0 + \x8F\xCB\xC3 |0 + \xE0\xD7 |0 + \x8F\xCB\xC4 |0 + \xE0\xD6 |0 + \x8F\xCB\xC5 |0 + \x8F\xCB\xC6 |0 + \x8F\xCB\xC7 |0 + \x8F\xCB\xC8 |0 + \xE0\xD8 |0 + \x8F\xCB\xC9 |0 + \xB3\xCD |0 + \xE0\xDA |0 + \x8F\xCB\xCA |0 + \xE0\xD9 |0 + \x8F\xCB\xCB |0 + \xE0\xDC |0 + \xE0\xDB |0 + \x8F\xCB\xCC |0 + \x8F\xCB\xCD |0 + \x8F\xCB\xCE |0 + \x8F\xCB\xCF |0 + \xB8\xBC |0 + \x8F\xCB\xD0 |0 + \x8F\xCB\xD1 |0 + \xCE\xA8 |0 + \xB6\xCC |0 + \xB2\xA6 |0 + \x8F\xCB\xD2 |0 + \x8F\xCB\xD3 |0 + \x8F\xCB\xD4 |0 + \x8F\xCB\xD5 |0 + \xB6\xEA |0 + \x8F\xCB\xD6 |0 + \x8F\xCB\xD7 |0 + \x8F\xCB\xD8 |0 + \x8F\xCB\xD9 |0 + \x8F\xCB\xDA |0 + \x8F\xCB\xDB |0 + \x8F\xCB\xDC |0 + \x8F\xCB\xDD |0 + \x8F\xCB\xDE |0 + \xB4\xE1 |0 + \x8F\xCB\xDF |0 + \x8F\xCB\xE0 |0 + \x8F\xCB\xE1 |0 + \xCE\xE8 |0 + \xE0\xDE |0 + \x8F\xCB\xE2 |0 + \x8F\xCB\xE3 |0 + \x8F\xCB\xE4 |0 + \xE0\xE0 |0 + \x8F\xCB\xE5 |0 + \x8F\xCB\xE6 |0 + \x8F\xCB\xE7 |0 + \xE0\xE1 |0 + \xB2\xD1 |0 + \x8F\xCB\xE8 |0 + \x8F\xCB\xE9 |0 + \xE0\xDD |0 + \x8F\xCB\xEA |0 + \xBB\xB9 |0 + \x8F\xCB\xEB |0 + \x8F\xCB\xEC |0 + \xC4\xC1 |0 + \xE0\xDF |0 + \x8F\xCB\xED |0 + \x8F\xCB\xEE |0 + \x8F\xCB\xEF |0 + \x8F\xCB\xF0 |0 + \x8F\xCB\xF1 |0 + \x8F\xCB\xF2 |0 + \xE0\xE4 |0 + \xBC\xEE |0 + \x8F\xCB\xF3 |0 + \x8F\xCB\xF4 |0 + \xE0\xE2 |0 + \x8F\xCB\xF5 |0 + \x8F\xCB\xF6 |0 + \x8F\xCB\xF7 |0 + \xB7\xBE |0 + \xC8\xC9 |0 + \xE0\xE3 |0 + \xE0\xFE |0 + \x8F\xCB\xF8 |0 + \x8F\xCB\xF9 |0 + \x8F\xCB\xFA |0 + \xE0\xE9 |0 + \x8F\xCB\xFB |0 + \x8F\xCB\xFC |0 + \x8F\xCB\xFD |0 + \x8F\xCB\xFE |0 + \xB8\xBD |0 + \x8F\xCC\xA1 |0 + \x8F\xCC\xA2 |0 + \x8F\xCC\xA3 |0 + \xB5\xE5 |0 + \x8F\xCC\xA4 |0 + \xE0\xE6 |0 + \xCD\xFD |0 + \x8F\xCC\xA5 |0 + \xCE\xB0 |0 + \x8F\xCC\xA6 |0 + \x8F\xCC\xA7 |0 + \x8F\xCC\xA8 |0 + \x8F\xCC\xA9 |0 + \xC2\xF6 |0 + \x8F\xCC\xAA |0 + \xE0\xE8 |0 + \x8F\xCC\xAB |0 + \x8F\xCC\xAC |0 + \x8F\xCC\xAD |0 + \x8F\xCC\xAE |0 + \x8F\xCC\xAF |0 + \x8F\xCC\xB0 |0 + \x8F\xCC\xB1 |0 + \x8F\xCC\xB2 |0 + \x8F\xCC\xB3 |0 + \x8F\xCC\xB4 |0 + \x8F\xCC\xB5 |0 + \xE0\xEA |0 + \xCE\xD6 |0 + \xB6\xD7 |0 + \xC8\xFC |0 + \xC7\xCA |0 + \x8F\xCC\xB6 |0 + \xE0\xEB |0 + \xE0\xED |0 + \x8F\xCC\xB7 |0 + \xE0\xF0 |0 + \x8F\xCC\xB8 |0 + \x8F\xCC\xB9 |0 + \x8F\xCC\xBA |0 + \x8F\xCC\xBB |0 + \x8F\xCC\xBC |0 + \x8F\xCC\xBD |0 + \x8F\xCC\xBE |0 + \x8F\xCC\xBF |0 + \xE0\xEC |0 + \x8F\xCC\xC0 |0 + \xE0\xEF |0 + \xB8\xEA |0 + \xB1\xCD |0 + \xE0\xF1 |0 + \x8F\xCC\xC1 |0 + \xBF\xF0 |0 + \xE0\xEE |0 + \xCE\xDC |0 + \x8F\xCC\xC2 |0 + \xE0\xF4 |0 + \xF4\xA4 |0 + \x8F\xCC\xC3 |0 + \x8F\xCC\xC4 |0 + \x8F\xCC\xC5 |0 + \xE0\xF2 |0 + \xE0\xF5 |0 + \x8F\xCC\xC6 |0 + \x8F\xCC\xC7 |0 + \x8F\xCC\xC8 |0 + \xE0\xE7 |0 + \xE0\xF3 |0 + \x8F\xCC\xC9 |0 + \x8F\xCC\xCA |0 + \xBA\xBC |0 + \xE0\xF6 |0 + \xE0\xF7 |0 + \x8F\xCC\xCB |0 + \x8F\xCC\xCC |0 + \xCD\xFE |0 + \x8F\xCC\xCD |0 + \x8F\xCC\xCE |0 + \x8F\xCC\xCF |0 + \x8F\xCC\xD0 |0 + \xE0\xF8 |0 + \x8F\xCC\xD1 |0 + \x8F\xCC\xD2 |0 + \x8F\xCC\xD3 |0 + \x8F\xCC\xD4 |0 + \x8F\xCC\xD5 |0 + \x8F\xCC\xD6 |0 + \x8F\xCC\xD7 |0 + \x8F\xCC\xD8 |0 + \xE0\xF9 |0 + \x8F\xCC\xD9 |0 + \x8F\xCC\xDA |0 + \x8F\xCC\xDB |0 + \xE0\xE5 |0 + \x8F\xCC\xDC |0 + \x8F\xCC\xDD |0 + \xE0\xFA |0 + \x8F\xCC\xDE |0 + \x8F\xCC\xDF |0 + \x8F\xCC\xE0 |0 + \x8F\xCC\xE1 |0 + \x8F\xCC\xE2 |0 + \x8F\xCC\xE3 |0 + \xB4\xC4 |0 + \x8F\xCC\xE4 |0 + \x8F\xCC\xE5 |0 + \x8F\xCC\xE6 |0 + \x8F\xCC\xE7 |0 + \x8F\xCC\xE8 |0 + \xBC\xA5 |0 + \x8F\xCC\xE9 |0 + \x8F\xCC\xEA |0 + \x8F\xCC\xEB |0 + \xE0\xFB |0 + \x8F\xCC\xEC |0 + \xE0\xFC |0 + \x8F\xCC\xED |0 + \x8F\xCC\xEE |0 + \xE0\xFD |0 + \x8F\xCC\xEF |0 + \x8F\xCC\xF0 |0 + \x8F\xCC\xF1 |0 + \xB1\xBB |0 + \x8F\xCC\xF2 |0 + \x8F\xCC\xF3 |0 + \xE1\xA1 |0 + \xC9\xBB |0 + \xE1\xA2 |0 + \x8F\xCC\xF4 |0 + \xB4\xA4 |0 + \xE1\xA3 |0 + \x8F\xCC\xF5 |0 + \xE1\xA4 |0 + \x8F\xCC\xF6 |0 + \x8F\xCC\xF7 |0 + \xE1\xA5 |0 + \x8F\xCC\xF8 |0 + \xE1\xA7 |0 + \xE1\xA8 |0 + \xE1\xA6 |0 + \x8F\xCC\xF9 |0 + \xC9\xD3 |0 + \xE1\xAA |0 + \xE1\xA9 |0 + \x8F\xCC\xFA |0 + \x8F\xCC\xFB |0 + \x8F\xCC\xFC |0 + \x8F\xCC\xFD |0 + \x8F\xF4\xC6 |0 + \xE1\xAC |0 + \xE1\xAB |0 + \xE1\xAD |0 + \x8F\xCC\xFE |0 + \xE1\xAE |0 + \xE1\xB0 |0 + \xE1\xAF |0 + \xB9\xF9 |0 + \x8F\xCD\xA1 |0 + \xE1\xB2 |0 + \xE1\xB1 |0 + \x8F\xCD\xA2 |0 + \x8F\xCD\xA3 |0 + \xB4\xC5 |0 + \xBF\xD3 |0 + \xC5\xBC |0 + \xE1\xB3 |0 + \xC0\xB8 |0 + \x8F\xCD\xA4 |0 + \x8F\xCD\xA5 |0 + \xBB\xBA |0 + \x8F\xCD\xA6 |0 + \xB1\xF9 |0 + \xE1\xB4 |0 + \x8F\xCD\xA7 |0 + \xCD\xD1 |0 + \x8F\xCD\xA8 |0 + \x8F\xCD\xA9 |0 + \xCA\xE3 |0 + \xE1\xB5 |0 + \x8F\xCD\xAA |0 + \xC5\xC4 |0 + \xCD\xB3 |0 + \xB9\xC3 |0 + \xBF\xBD |0 + \x8F\xCD\xAB |0 + \xC3\xCB |0 + \xD2\xB4 |0 + \x8F\xCD\xAC |0 + \xC4\xAE |0 + \xB2\xE8 |0 + \xE1\xB6 |0 + \x8F\xCD\xAD |0 + \x8F\xCD\xAE |0 + \x8F\xCD\xAF |0 + \x8F\xCD\xB0 |0 + \x8F\xCD\xB1 |0 + \xE1\xB7 |0 + \xE1\xBC |0 + \x8F\xCD\xB2 |0 + \x8F\xCD\xB3 |0 + \xE1\xBA |0 + \xE1\xB9 |0 + \xDA\xC2 |0 + \xB3\xA6 |0 + \xE1\xB8 |0 + \x8F\xCD\xB4 |0 + \xB0\xDA |0 + \x8F\xCD\xB5 |0 + \xC8\xAA |0 + \x8F\xCD\xB6 |0 + \xC8\xCA |0 + \x8F\xCD\xB7 |0 + \xCE\xB1 |0 + \xE1\xBD |0 + \xE1\xBB |0 + \xC3\xDC |0 + \xC0\xA6 |0 + \x8F\xCD\xB8 |0 + \x8F\xCD\xB9 |0 + \xC8\xAB |0 + \x8F\xCD\xBA |0 + \xC9\xAD |0 + \xE1\xBF |0 + \xCE\xAC |0 + \xB7\xCD |0 + \xE1\xC0 |0 + \xE1\xBE |0 + \xC8\xD6 |0 + \xE1\xC1 |0 + \xE1\xC2 |0 + \x8F\xCD\xBB |0 + \xB0\xDB |0 + \x8F\xCD\xBC |0 + \xBE\xF6 |0 + \xE1\xC7 |0 + \xE1\xC4 |0 + \xC6\xED |0 + \xE1\xC3 |0 + \x8F\xCD\xBD |0 + \x8F\xCD\xBE |0 + \x8F\xCD\xBF |0 + \x8F\xCD\xC0 |0 + \x8F\xCD\xC1 |0 + \x8F\xCD\xC2 |0 + \xB5\xA6 |0 + \x8F\xCD\xC3 |0 + \xE1\xCA |0 + \x8F\xCD\xC4 |0 + \xE1\xC5 |0 + \xE1\xC6 |0 + \xE1\xC9 |0 + \xE1\xC8 |0 + \xC9\xA5 |0 + \xC1\xC2 |0 + \xC1\xC1 |0 + \x8F\xCD\xC5 |0 + \xB5\xBF |0 + \x8F\xCD\xC6 |0 + \x8F\xCD\xC7 |0 + \xE1\xCB |0 + \x8F\xCD\xC8 |0 + \x8F\xCD\xC9 |0 + \xE1\xCC |0 + \x8F\xCD\xCA |0 + \xE1\xCD |0 + \x8F\xCD\xCB |0 + \xE1\xCF |0 + \x8F\xCD\xCC |0 + \xE1\xCE |0 + \xB1\xD6 |0 + \xE1\xD7 |0 + \xC8\xE8 |0 + \xE1\xD1 |0 + \x8F\xCD\xCD |0 + \xE1\xD3 |0 + \xE1\xD5 |0 + \xBF\xBE |0 + \x8F\xCD\xCE |0 + \xE1\xD6 |0 + \xE1\xD4 |0 + \xBC\xC0 |0 + \x8F\xCD\xCF |0 + \x8F\xCD\xD0 |0 + \x8F\xCD\xD1 |0 + \xE1\xD0 |0 + \xE1\xD2 |0 + \x8F\xCD\xD2 |0 + \xC9\xC2 |0 + \x8F\xCD\xD3 |0 + \xBE\xC9 |0 + \xE1\xD9 |0 + \x8F\xCD\xD4 |0 + \xE1\xD8 |0 + \x8F\xCD\xD5 |0 + \x8F\xCD\xD6 |0 + \xE1\xDA |0 + \xBC\xA6 |0 + \xBA\xAF |0 + \x8F\xCD\xD7 |0 + \xC5\xF7 |0 + \xE1\xDB |0 + \xC4\xCB |0 + \x8F\xCD\xD8 |0 + \xE1\xDD |0 + \x8F\xCD\xD9 |0 + \x8F\xCD\xDA |0 + \x8F\xCD\xDB |0 + \xCE\xA1 |0 + \xE1\xDC |0 + \x8F\xCD\xDC |0 + \x8F\xCD\xDD |0 + \xC1\xE9 |0 + \x8F\xCD\xDE |0 + \x8F\xCD\xDF |0 + \x8F\xCD\xE0 |0 + \xE1\xE2 |0 + \x8F\xCD\xE1 |0 + \xE1\xE4 |0 + \xE1\xE5 |0 + \xC3\xD4 |0 + \x8F\xCD\xE2 |0 + \xE1\xE3 |0 + \xE1\xE0 |0 + \xE1\xDE |0 + \xE1\xDF |0 + \x8F\xCD\xE3 |0 + \xE1\xE1 |0 + \x8F\xCD\xE4 |0 + \x8F\xCD\xE5 |0 + \x8F\xCD\xE6 |0 + \x8F\xCD\xE7 |0 + \x8F\xCD\xE8 |0 + \xE1\xE8 |0 + \x8F\xCD\xE9 |0 + \xE1\xE6 |0 + \x8F\xCD\xEA |0 + \xE1\xE7 |0 + \x8F\xCD\xEB |0 + \x8F\xCD\xEC |0 + \x8F\xCD\xED |0 + \x8F\xCD\xEE |0 + \x8F\xCD\xEF |0 + \x8F\xCD\xF0 |0 + \x8F\xCD\xF1 |0 + \x8F\xCD\xF2 |0 + \x8F\xCD\xF3 |0 + \x8F\xCD\xF4 |0 + \xE1\xE9 |0 + \xE1\xEB |0 + \xE1\xEC |0 + \xE1\xED |0 + \x8F\xCD\xF5 |0 + \xE1\xEE |0 + \x8F\xCD\xF6 |0 + \x8F\xCD\xF7 |0 + \xE1\xEA |0 + \x8F\xCD\xF8 |0 + \x8F\xCD\xF9 |0 + \xE1\xF0 |0 + \x8F\xCD\xFA |0 + \x8F\xCD\xFB |0 + \xE1\xEF |0 + \x8F\xCD\xFC |0 + \x8F\xCD\xFD |0 + \x8F\xCD\xFE |0 + \x8F\xCE\xA1 |0 + \xE1\xF1 |0 + \x8F\xCE\xA2 |0 + \x8F\xCE\xA4 |0 + \x8F\xCE\xA5 |0 + \xCE\xC5 |0 + \x8F\xCE\xA6 |0 + \x8F\xCE\xA7 |0 + \x8F\xCE\xA8 |0 + \xE1\xF4 |0 + \xE1\xF2 |0 + \xE1\xF3 |0 + \x8F\xCE\xA9 |0 + \x8F\xCE\xA3 |0 + \x8F\xCE\xAA |0 + \xB4\xE2 |0 + \xCC\xFE |0 + \x8F\xCE\xAB |0 + \xCA\xCA |0 + \xE1\xF6 |0 + \x8F\xCE\xAC |0 + \xE1\xF5 |0 + \x8F\xCE\xAD |0 + \xE1\xF7 |0 + \xE1\xF8 |0 + \x8F\xCE\xAE |0 + \x8F\xCE\xAF |0 + \xE1\xFC |0 + \xE1\xF9 |0 + \xE1\xFA |0 + \xE1\xFB |0 + \xE1\xFD |0 + \x8F\xCE\xB0 |0 + \x8F\xCE\xB1 |0 + \x8F\xCE\xB2 |0 + \xE1\xFE |0 + \x8F\xCE\xB3 |0 + \xE2\xA1 |0 + \x8F\xCE\xB4 |0 + \xE2\xA2 |0 + \xE2\xA3 |0 + \xC8\xAF |0 + \xC5\xD0 |0 + \xE2\xA4 |0 + \xC7\xF2 |0 + \xC9\xB4 |0 + \xE2\xA5 |0 + \x8F\xCE\xB5 |0 + \x8F\xF4\xC7 |0 + \xE2\xA6 |0 + \xC5\xAA |0 + \x8F\xCE\xB6 |0 + \xB3\xA7 |0 + \xB9\xC4 |0 + \xE2\xA7 |0 + \xE2\xA8 |0 + \x8F\xCE\xB7 |0 + \x8F\xCE\xB8 |0 + \xE2\xA9 |0 + \xBB\xA9 |0 + \xE2\xAB |0 + \x8F\xCE\xB9 |0 + \xE2\xAA |0 + \xE2\xAC |0 + \xE2\xAD |0 + \x8F\xCE\xBA |0 + \x8F\xCE\xBB |0 + \x8F\xCE\xBC |0 + \x8F\xF4\xC8 |0 + \x8F\xCE\xBD |0 + \x8F\xCE\xBE |0 + \x8F\xCE\xBF |0 + \x8F\xCE\xC0 |0 + \x8F\xCE\xC1 |0 + \x8F\xCE\xC2 |0 + \x8F\xCE\xC3 |0 + \x8F\xCE\xC4 |0 + \x8F\xCE\xC5 |0 + \x8F\xCE\xC6 |0 + \x8F\xCE\xC7 |0 + \xC8\xE9 |0 + \xE2\xAE |0 + \xE2\xAF |0 + \xF3\xE9 |0 + \xE2\xB0 |0 + \xE2\xB1 |0 + \xE2\xB2 |0 + \x8F\xCE\xC8 |0 + \xBB\xAE |0 + \x8F\xCE\xC9 |0 + \xE2\xB3 |0 + \xC7\xD6 |0 + \x8F\xCE\xCA |0 + \xCB\xDF |0 + \xB1\xCE |0 + \x8F\xCE\xCB |0 + \xB1\xD7 |0 + \x8F\xCE\xCC |0 + \x8F\xCE\xCD |0 + \xE2\xB4 |0 + \x8F\xCE\xCE |0 + \xE2\xB6 |0 + \x8F\xCE\xCF |0 + \xE2\xB5 |0 + \xC5\xF0 |0 + \x8F\xCE\xD0 |0 + \xC0\xB9 |0 + \xDD\xB9 |0 + \xE2\xB7 |0 + \xCC\xC1 |0 + \x8F\xCE\xD1 |0 + \xE2\xB8 |0 + \xB4\xC6 |0 + \xC8\xD7 |0 + \xE2\xB9 |0 + \x8F\xCE\xD2 |0 + \xE2\xBA |0 + \x8F\xCE\xD3 |0 + \xE2\xBB |0 + \x8F\xCE\xD4 |0 + \xCC\xDC |0 + \x8F\xCE\xD5 |0 + \x8F\xCE\xD6 |0 + \xCC\xD5 |0 + \xC4\xBE |0 + \x8F\xCE\xD7 |0 + \xC1\xEA |0 + \x8F\xCE\xD8 |0 + \xE2\xBD |0 + \x8F\xCE\xD9 |0 + \xBD\xE2 |0 + \x8F\xCE\xDA |0 + \xBE\xCA |0 + \xE2\xC0 |0 + \x8F\xCE\xDB |0 + \xE2\xBF |0 + \xE2\xBE |0 + \xC8\xFD |0 + \x8F\xCE\xDC |0 + \xB4\xC7 |0 + \xB8\xA9 |0 + \x8F\xCE\xDD |0 + \x8F\xCE\xDE |0 + \x8F\xCE\xDF |0 + \x8F\xCE\xE0 |0 + \x8F\xCE\xE1 |0 + \x8F\xCE\xE2 |0 + \x8F\xCE\xE3 |0 + \xE2\xC6 |0 + \x8F\xCE\xE4 |0 + \xE2\xC3 |0 + \xBF\xBF |0 + \xCC\xB2 |0 + \x8F\xCE\xE5 |0 + \xE2\xC2 |0 + \xE2\xC4 |0 + \xE2\xC5 |0 + \x8F\xCE\xE6 |0 + \xE2\xC1 |0 + \x8F\xCE\xE7 |0 + \x8F\xCE\xE8 |0 + \x8F\xCE\xE9 |0 + \x8F\xCE\xEA |0 + \x8F\xCE\xEB |0 + \x8F\xCE\xEC |0 + \xE2\xC7 |0 + \xE2\xC8 |0 + \x8F\xCE\xED |0 + \xC4\xAF |0 + \xB4\xE3 |0 + \x8F\xCE\xEE |0 + \x8F\xCE\xEF |0 + \xC3\xE5 |0 + \x8F\xCE\xF0 |0 + \x8F\xCE\xF1 |0 + \x8F\xCE\xF2 |0 + \xE2\xC9 |0 + \x8F\xCE\xF3 |0 + \x8F\xCE\xF4 |0 + \x8F\xCE\xF5 |0 + \x8F\xCE\xF6 |0 + \x8F\xCE\xF7 |0 + \x8F\xCE\xF8 |0 + \x8F\xCE\xF9 |0 + \xE2\xCA |0 + \xE2\xCD |0 + \x8F\xCE\xFA |0 + \x8F\xCE\xFB |0 + \x8F\xCE\xFC |0 + \x8F\xCE\xFD |0 + \xBF\xE7 |0 + \x8F\xCE\xFE |0 + \xC6\xC4 |0 + \x8F\xCF\xA1 |0 + \xE2\xCE |0 + \xCB\xD3 |0 + \x8F\xCF\xA2 |0 + \xE2\xCB |0 + \x8F\xCF\xA3 |0 + \xE2\xCC |0 + \x8F\xCF\xA4 |0 + \x8F\xCF\xA5 |0 + \x8F\xCF\xA6 |0 + \x8F\xCF\xA7 |0 + \x8F\xCF\xA8 |0 + \xE2\xD1 |0 + \x8F\xCF\xA9 |0 + \x8F\xCF\xAA |0 + \xE2\xD0 |0 + \xE2\xCF |0 + \x8F\xCF\xAB |0 + \x8F\xCF\xAC |0 + \xE2\xD3 |0 + \x8F\xCF\xAD |0 + \x8F\xCF\xAE |0 + \xE2\xD2 |0 + \xE2\xD4 |0 + \x8F\xCF\xAF |0 + \x8F\xCF\xB0 |0 + \x8F\xCF\xB1 |0 + \x8F\xCF\xB2 |0 + \xE2\xD6 |0 + \x8F\xCF\xB3 |0 + \xE2\xD5 |0 + \x8F\xCF\xB4 |0 + \xCA\xCD |0 + \x8F\xCF\xB5 |0 + \x8F\xCF\xB6 |0 + \xBD\xD6 |0 + \xCE\xC6 |0 + \x8F\xCF\xB7 |0 + \x8F\xCF\xB8 |0 + \xE2\xD7 |0 + \x8F\xCF\xB9 |0 + \xC6\xB7 |0 + \x8F\xCF\xBA |0 + \xE2\xD8 |0 + \xE2\xD9 |0 + \xE2\xDD |0 + \xE2\xDB |0 + \xE2\xDC |0 + \x8F\xCF\xBB |0 + \xE2\xDA |0 + \x8F\xCF\xBC |0 + \xE2\xDE |0 + \x8F\xCF\xBD |0 + \xE2\xDF |0 + \x8F\xCF\xBE |0 + \x8F\xCF\xBF |0 + \x8F\xCF\xC0 |0 + \xE2\xE0 |0 + \x8F\xCF\xC1 |0 + \xE2\xE1 |0 + \xCC\xB7 |0 + \xE2\xE2 |0 + \x8F\xCF\xC2 |0 + \x8F\xCF\xC3 |0 + \x8F\xCF\xC4 |0 + \xCC\xF0 |0 + \xE2\xE3 |0 + \x8F\xCF\xC5 |0 + \xC3\xCE |0 + \x8F\xCF\xC6 |0 + \xC7\xEA |0 + \xB6\xEB |0 + \x8F\xCF\xC7 |0 + \x8F\xCF\xC8 |0 + \xC3\xBB |0 + \xE2\xE4 |0 + \xB6\xBA |0 + \x8F\xCF\xC9 |0 + \x8F\xCF\xCA |0 + \xC0\xD0 |0 + \x8F\xCF\xCB |0 + \x8F\xCF\xCC |0 + \x8F\xCF\xCD |0 + \xE2\xE5 |0 + \xBA\xBD |0 + \x8F\xCF\xCE |0 + \x8F\xCF\xCF |0 + \x8F\xCF\xD0 |0 + \xE2\xE6 |0 + \x8F\xCF\xD1 |0 + \x8F\xCF\xD2 |0 + \x8F\xCF\xD3 |0 + \xE2\xE7 |0 + \xB8\xA6 |0 + \xBA\xD5 |0 + \x8F\xCF\xD4 |0 + \xE2\xE9 |0 + \x8F\xCF\xD5 |0 + \x8F\xCF\xD6 |0 + \x8F\xCF\xD7 |0 + \xC5\xD6 |0 + \xBA\xD6 |0 + \xB5\xCE |0 + \x8F\xCF\xD8 |0 + \x8F\xCF\xD9 |0 + \x8F\xCF\xDA |0 + \xCB\xA4 |0 + \xC7\xCB |0 + \x8F\xCF\xDB |0 + \x8F\xCF\xDC |0 + \xC5\xD7 |0 + \xB9\xDC |0 + \x8F\xCF\xDD |0 + \x8F\xCF\xDE |0 + \xE2\xEB |0 + \x8F\xCF\xDF |0 + \x8F\xCF\xE0 |0 + \x8F\xCF\xE1 |0 + \x8F\xCF\xE2 |0 + \x8F\xCF\xE3 |0 + \x8F\xCF\xE4 |0 + \xBE\xCB |0 + \x8F\xCF\xE5 |0 + \x8F\xCF\xE6 |0 + \x8F\xCF\xE7 |0 + \x8F\xCF\xE8 |0 + \x8F\xCF\xE9 |0 + \x8F\xCF\xEA |0 + \x8F\xCF\xEB |0 + \xCE\xB2 |0 + \xB9\xC5 |0 + \x8F\xCF\xEC |0 + \xB8\xA7 |0 + \xC8\xA3 |0 + \xE2\xED |0 + \x8F\xCF\xED |0 + \xE2\xEF |0 + \x8F\xCF\xEE |0 + \xB8\xEB |0 + \xE2\xEE |0 + \xC4\xF6 |0 + \x8F\xCF\xEF |0 + \xE2\xF1 |0 + \xB3\xB7 |0 + \xE2\xEC |0 + \x8F\xCF\xF0 |0 + \xC8\xEA |0 + \xB1\xB0 |0 + \x8F\xCF\xF1 |0 + \xBA\xEC |0 + \xCF\xD2 |0 + \x8F\xCF\xF2 |0 + \xE2\xF0 |0 + \x8F\xCF\xF4 |0 + \x8F\xCF\xF5 |0 + \x8F\xCF\xF6 |0 + \x8F\xCF\xF3 |0 + \xE2\xF2 |0 + \x8F\xCF\xF7 |0 + \xCA\xCB |0 + \x8F\xCF\xF8 |0 + \xC0\xD9 |0 + \xE2\xF4 |0 + \x8F\xCF\xF9 |0 + \x8F\xCF\xFA |0 + \xE2\xF5 |0 + \x8F\xCF\xFB |0 + \x8F\xCF\xFC |0 + \x8F\xCF\xFD |0 + \x8F\xCF\xFE |0 + \xE2\xF3 |0 + \xB3\xCE |0 + \x8F\xD0\xA1 |0 + \xE2\xFB |0 + \x8F\xD0\xA2 |0 + \xE2\xFA |0 + \x8F\xD0\xA3 |0 + \xBC\xA7 |0 + \xE2\xFC |0 + \xE2\xF7 |0 + \x8F\xD0\xA4 |0 + \x8F\xD0\xA5 |0 + \x8F\xD0\xA6 |0 + \xE2\xFD |0 + \xE2\xF8 |0 + \x8F\xD0\xA7 |0 + \x8F\xD0\xA8 |0 + \xC8\xD8 |0 + \xE2\xF6 |0 + \x8F\xD0\xA9 |0 + \x8F\xD0\xAA |0 + \xE2\xF9 |0 + \x8F\xD0\xAB |0 + \x8F\xD0\xAC |0 + \xE3\xA2 |0 + \x8F\xD0\xAE |0 + \x8F\xD0\xAF |0 + \x8F\xD0\xB0 |0 + \x8F\xD0\xB1 |0 + \x8F\xD0\xAD |0 + \x8F\xD0\xB2 |0 + \xE3\xA1 |0 + \xCB\xE1 |0 + \x8F\xD0\xB3 |0 + \xE2\xFE |0 + \xB0\xEB |0 + \x8F\xD0\xB4 |0 + \x8F\xD0\xB5 |0 + \xE3\xA4 |0 + \x8F\xD0\xB7 |0 + \x8F\xD0\xB8 |0 + \x8F\xD0\xB9 |0 + \x8F\xD0\xBA |0 + \xE3\xA3 |0 + \x8F\xD0\xBB |0 + \x8F\xD0\xB6 |0 + \xBE\xCC |0 + \x8F\xD0\xBC |0 + \xE3\xA5 |0 + \x8F\xD0\xBD |0 + \xC1\xC3 |0 + \x8F\xD0\xBE |0 + \xE3\xA7 |0 + \xE3\xA6 |0 + \xE3\xA8 |0 + \x8F\xD0\xBF |0 + \x8F\xD0\xC0 |0 + \x8F\xD0\xC1 |0 + \x8F\xD0\xC2 |0 + \x8F\xD0\xC3 |0 + \x8F\xD0\xC4 |0 + \xE2\xE8 |0 + \x8F\xD0\xC5 |0 + \x8F\xD0\xC6 |0 + \xE2\xEA |0 + \xE3\xAA |0 + \xE3\xA9 |0 + \x8F\xD0\xC7 |0 + \x8F\xF4\xCB |0 + \x8F\xD0\xC8 |0 + \x8F\xD0\xC9 |0 + \x8F\xD0\xCA |0 + \xBC\xA8 |0 + \x8F\xD0\xCB |0 + \xCE\xE9 |0 + \x8F\xD0\xCC |0 + \xBC\xD2 |0 + \x8F\xD0\xCD |0 + \xE3\xAB |0 + \xB7\xB7 |0 + \x8F\xD0\xCE |0 + \x8F\xD0\xCF |0 + \x8F\xD0\xD0 |0 + \xB5\xC0 |0 + \xB5\xA7 |0 + \xBB\xE3 |0 + \x8F\xD0\xD1 |0 + \x8F\xD0\xD2 |0 + \x8F\xD0\xD3 |0 + \xCD\xB4 |0 + \x8F\xD0\xD4 |0 + \xE3\xB1 |0 + \x8F\xD0\xD5 |0 + \xE3\xB0 |0 + \xC1\xC4 |0 + \xE3\xAD |0 + \x8F\xD0\xD6 |0 + \xE3\xAF |0 + \x8F\xD0\xD7 |0 + \x8F\xD0\xD8 |0 + \xBD\xCB |0 + \xBF\xC0 |0 + \xE3\xAE |0 + \xE3\xAC |0 + \xC7\xAA |0 + \xBE\xCD |0 + \x8F\xD0\xD9 |0 + \xC9\xBC |0 + \x8F\xD0\xDA |0 + \x8F\xD0\xDB |0 + \xBA\xD7 |0 + \x8F\xD0\xDC |0 + \xC5\xF8 |0 + \x8F\xD0\xDD |0 + \xE3\xB2 |0 + \x8F\xD0\xDE |0 + \x8F\xD0\xDF |0 + \x8F\xD0\xE0 |0 + \xE3\xB3 |0 + \xE3\xC9 |0 + \xB6\xD8 |0 + \xCF\xBD |0 + \xC1\xB5 |0 + \xE3\xB4 |0 + \x8F\xD0\xE1 |0 + \x8F\xD0\xE2 |0 + \xB2\xD2 |0 + \xC4\xF7 |0 + \xCA\xA1 |0 + \x8F\xD0\xE3 |0 + \x8F\xD0\xE4 |0 + \x8F\xD0\xE5 |0 + \x8F\xD0\xE6 |0 + \x8F\xD0\xE7 |0 + \x8F\xD0\xE8 |0 + \x8F\xD0\xE9 |0 + \x8F\xD0\xEA |0 + \xE3\xB5 |0 + \x8F\xD0\xEB |0 + \xB5\xFA |0 + \xE3\xB6 |0 + \x8F\xD0\xEC |0 + \x8F\xD0\xED |0 + \xE3\xB8 |0 + \x8F\xD0\xEE |0 + \xE3\xB9 |0 + \x8F\xD0\xEF |0 + \xC7\xA9 |0 + \x8F\xD0\xF0 |0 + \xE3\xBA |0 + \x8F\xD0\xF1 |0 + \x8F\xD0\xF2 |0 + \xE3\xBB |0 + \xE3\xBC |0 + \x8F\xD0\xF3 |0 + \xB6\xD9 |0 + \xB2\xD3 |0 + \xC6\xC5 |0 + \xBD\xA8 |0 + \xBB\xE4 |0 + \x8F\xD0\xF4 |0 + \x8F\xD0\xF5 |0 + \x8F\xD0\xF6 |0 + \x8F\xD0\xF7 |0 + \xE3\xBD |0 + \x8F\xD0\xF8 |0 + \xBD\xA9 |0 + \x8F\xD0\xF9 |0 + \xB2\xCA |0 + \xC9\xC3 |0 + \x8F\xD0\xFA |0 + \xE3\xBE |0 + \x8F\xD0\xFB |0 + \xC8\xEB |0 + \x8F\xD0\xFC |0 + \x8F\xD0\xFD |0 + \x8F\xD0\xFE |0 + \xC1\xC5 |0 + \x8F\xD1\xA1 |0 + \xE3\xC1 |0 + \x8F\xD1\xA2 |0 + \xE3\xC2 |0 + \xC7\xE9 |0 + \x8F\xD1\xA3 |0 + \xBF\xC1 |0 + \xE3\xBF |0 + \xC3\xE1 |0 + \x8F\xD1\xA4 |0 + \x8F\xD1\xA5 |0 + \xE3\xC0 |0 + \x8F\xD1\xA6 |0 + \xBE\xCE |0 + \x8F\xD1\xA7 |0 + \x8F\xD1\xA8 |0 + \xB0\xDC |0 + \x8F\xD1\xA9 |0 + \xB5\xA9 |0 + \x8F\xD1\xAA |0 + \x8F\xD1\xAB |0 + \x8F\xD1\xAC |0 + \xE3\xC3 |0 + \x8F\xD1\xAD |0 + \x8F\xD1\xAE |0 + \xC4\xF8 |0 + \x8F\xD1\xAF |0 + \xE3\xC4 |0 + \xC0\xC7 |0 + \x8F\xD1\xB0 |0 + \xCC\xAD |0 + \x8F\xD1\xB1 |0 + \xC9\xA3 |0 + \xE3\xC5 |0 + \xE3\xC6 |0 + \xC3\xD5 |0 + \x8F\xD1\xB2 |0 + \xCE\xC7 |0 + \x8F\xD1\xB3 |0 + \xE3\xC8 |0 + \xE3\xC7 |0 + \x8F\xD1\xB4 |0 + \x8F\xD1\xB5 |0 + \x8F\xD1\xB6 |0 + \x8F\xD1\xB7 |0 + \xBC\xEF |0 + \x8F\xD1\xB8 |0 + \x8F\xD1\xB9 |0 + \xE3\xCA |0 + \xB0\xF0 |0 + \x8F\xD1\xBA |0 + \x8F\xD1\xBB |0 + \xE3\xCD |0 + \x8F\xD1\xBC |0 + \x8F\xD1\xBD |0 + \x8F\xD1\xBE |0 + \xE3\xCB |0 + \xB2\xD4 |0 + \xB7\xCE |0 + \xE3\xCC |0 + \xB9\xC6 |0 + \xB9\xF2 |0 + \xCA\xE6 |0 + \xE3\xCE |0 + \x8F\xD1\xBF |0 + \x8F\xD1\xC0 |0 + \xCB\xD4 |0 + \x8F\xD1\xC1 |0 + \x8F\xD1\xC2 |0 + \xE3\xD0 |0 + \x8F\xD1\xC3 |0 + \xC0\xD1 |0 + \xB1\xCF |0 + \xB2\xBA |0 + \xB0\xAC |0 + \x8F\xD1\xC4 |0 + \x8F\xD1\xC5 |0 + \xE3\xCF |0 + \x8F\xD1\xC6 |0 + \x8F\xD1\xC7 |0 + \x8F\xD1\xC8 |0 + \x8F\xD1\xC9 |0 + \x8F\xD1\xCA |0 + \xE3\xD1 |0 + \xE3\xD2 |0 + \xBE\xF7 |0 + \x8F\xD1\xCB |0 + \x8F\xD1\xCC |0 + \xE3\xD3 |0 + \x8F\xD1\xCD |0 + \xB3\xCF |0 + \x8F\xD1\xCE |0 + \xE3\xD5 |0 + \xB7\xEA |0 + \x8F\xD1\xCF |0 + \xB5\xE6 |0 + \x8F\xD1\xD0 |0 + \xE3\xD6 |0 + \xB6\xF5 |0 + \xE3\xD7 |0 + \x8F\xD1\xD1 |0 + \xC0\xFC |0 + \x8F\xD1\xD2 |0 + \xC6\xCD |0 + \x8F\xD1\xD3 |0 + \xC0\xE0 |0 + \xBA\xF5 |0 + \x8F\xD1\xD4 |0 + \x8F\xD1\xD5 |0 + \xE3\xD8 |0 + \x8F\xD1\xD6 |0 + \x8F\xD1\xD7 |0 + \x8F\xD1\xD8 |0 + \x8F\xD1\xD9 |0 + \xC3\xE2 |0 + \xC1\xEB |0 + \x8F\xD1\xDA |0 + \xE3\xDA |0 + \xE3\xDC |0 + \xE3\xD9 |0 + \xE3\xDB |0 + \x8F\xD1\xDB |0 + \xB7\xA2 |0 + \x8F\xD1\xDC |0 + \x8F\xD1\xDD |0 + \xE3\xDD |0 + \xB7\xA6 |0 + \x8F\xD1\xDE |0 + \xB5\xE7 |0 + \xCD\xD2 |0 + \xE3\xDF |0 + \x8F\xD1\xDF |0 + \x8F\xD1\xE0 |0 + \xE3\xE0 |0 + \x8F\xD1\xE1 |0 + \xB1\xAE |0 + \x8F\xD1\xE2 |0 + \x8F\xD1\xE3 |0 + \xE3\xE3 |0 + \xB3\xF6 |0 + \xE3\xE2 |0 + \xE3\xE1 |0 + \x8F\xD1\xE4 |0 + \xE3\xE5 |0 + \xE3\xDE |0 + \x8F\xD1\xE5 |0 + \xE3\xE6 |0 + \xCE\xA9 |0 + \x8F\xD1\xE6 |0 + \xE3\xE7 |0 + \x8F\xD1\xE7 |0 + \xE3\xE8 |0 + \x8F\xD1\xE8 |0 + \xD4\xF4 |0 + \xE3\xEA |0 + \xE3\xE9 |0 + \xE3\xEB |0 + \xE3\xEC |0 + \x8F\xD1\xE9 |0 + \xCE\xB5 |0 + \xE3\xED |0 + \xF0\xEF |0 + \xBE\xCF |0 + \xE3\xEE |0 + \xE3\xEF |0 + \xBD\xD7 |0 + \xC6\xB8 |0 + \xE3\xF0 |0 + \x8F\xF4\xD0 |0 + \x8F\xD1\xEA |0 + \x8F\xD1\xEB |0 + \xC3\xA8 |0 + \x8F\xD1\xEC |0 + \x8F\xD1\xED |0 + \xE3\xF1 |0 + \xC3\xBC |0 + \xE3\xF2 |0 + \x8F\xD1\xEE |0 + \x8F\xD1\xEF |0 + \xB6\xA5 |0 + \xD1\xBF |0 + \xC3\xDD |0 + \xBC\xB3 |0 + \x8F\xD1\xF0 |0 + \x8F\xD1\xF1 |0 + \x8F\xD1\xF2 |0 + \xB4\xC8 |0 + \xE3\xF3 |0 + \xE4\xA2 |0 + \xE3\xF6 |0 + \x8F\xD1\xF3 |0 + \xB5\xE8 |0 + \xE3\xF5 |0 + \xE4\xA4 |0 + \xE3\xF4 |0 + \xBE\xD0 |0 + \x8F\xD1\xF4 |0 + \xE3\xF8 |0 + \xE3\xF9 |0 + \xC5\xAB |0 + \xE3\xFA |0 + \x8F\xD1\xF5 |0 + \xB3\xDE |0 + \x8F\xD1\xF6 |0 + \xBF\xDA |0 + \xC9\xE4 |0 + \x8F\xD1\xF7 |0 + \xE3\xFC |0 + \x8F\xD1\xF8 |0 + \x8F\xD1\xF9 |0 + \x8F\xD1\xFA |0 + \xC2\xE8 |0 + \x8F\xD1\xFB |0 + \x8F\xD1\xFC |0 + \x8F\xD1\xFD |0 + \x8F\xD1\xFE |0 + \x8F\xD2\xA1 |0 + \xE3\xF7 |0 + \x8F\xD2\xA2 |0 + \xE3\xFB |0 + \xE3\xFD |0 + \xBA\xFB |0 + \x8F\xD2\xA3 |0 + \x8F\xD2\xA4 |0 + \x8F\xD2\xA5 |0 + \x8F\xD2\xA6 |0 + \xE4\xA6 |0 + \xC9\xAE |0 + \x8F\xD2\xA7 |0 + \xC8\xA6 |0 + \xC5\xF9 |0 + \xB6\xDA |0 + \xE4\xA5 |0 + \xE4\xA3 |0 + \x8F\xD2\xA8 |0 + \xC8\xB5 |0 + \xE3\xFE |0 + \xC3\xDE |0 + \xC5\xFB |0 + \xC5\xFA |0 + \x8F\xD2\xA9 |0 + \xBA\xF6 |0 + \xE4\xB8 |0 + \x8F\xD2\xAA |0 + \x8F\xD2\xAB |0 + \xE4\xA8 |0 + \x8F\xD2\xAC |0 + \xE4\xAA |0 + \x8F\xD2\xAD |0 + \x8F\xD2\xAE |0 + \xE4\xAD |0 + \x8F\xD2\xAF |0 + \xE4\xAE |0 + \x8F\xD2\xB0 |0 + \xE4\xAB |0 + \xE4\xAC |0 + \x8F\xD2\xB1 |0 + \x8F\xD2\xB2 |0 + \xE4\xA9 |0 + \xE4\xA7 |0 + \x8F\xD2\xB3 |0 + \xE4\xA1 |0 + \x8F\xD2\xB4 |0 + \xCA\xCF |0 + \xB2\xD5 |0 + \x8F\xD2\xB5 |0 + \xE4\xB5 |0 + \xE4\xB2 |0 + \x8F\xD2\xB6 |0 + \xE4\xB7 |0 + \x8F\xD2\xB7 |0 + \x8F\xD2\xB8 |0 + \xE4\xB6 |0 + \xC7\xF3 |0 + \xCC\xA7 |0 + \x8F\xD2\xB9 |0 + \xBB\xBB |0 + \xE4\xB0 |0 + \xE4\xB9 |0 + \xE4\xB4 |0 + \x8F\xD2\xBA |0 + \xE4\xB3 |0 + \xE4\xAF |0 + \x8F\xD2\xBB |0 + \xE4\xB1 |0 + \x8F\xD2\xBC |0 + \xB4\xC9 |0 + \x8F\xD2\xBD |0 + \xC3\xBD |0 + \x8F\xD2\xBE |0 + \xC0\xFD |0 + \x8F\xD2\xBF |0 + \x8F\xD2\xC0 |0 + \xC8\xA2 |0 + \x8F\xD2\xC1 |0 + \xE4\xBE |0 + \x8F\xD2\xC2 |0 + \x8F\xD2\xC3 |0 + \xC8\xA4 |0 + \x8F\xD2\xC4 |0 + \x8F\xD2\xC5 |0 + \x8F\xD2\xC6 |0 + \x8F\xD2\xC7 |0 + \xC0\xE1 |0 + \xE4\xBB |0 + \x8F\xD2\xC8 |0 + \xC8\xCF |0 + \x8F\xD2\xC9 |0 + \xE4\xBF |0 + \xCA\xD3 |0 + \x8F\xD2\xCA |0 + \xC3\xDB |0 + \x8F\xD2\xCB |0 + \xE4\xBA |0 + \xE4\xBC |0 + \xE4\xBD |0 + \x8F\xD2\xCC |0 + \x8F\xD2\xCD |0 + \x8F\xD2\xCE |0 + \x8F\xD2\xCF |0 + \x8F\xD2\xD0 |0 + \x8F\xD2\xD1 |0 + \xE4\xC0 |0 + \xBC\xC4 |0 + \xC6\xC6 |0 + \xE4\xC5 |0 + \xE4\xC4 |0 + \x8F\xD2\xD2 |0 + \xE4\xC1 |0 + \x8F\xD2\xD3 |0 + \xCF\xB6 |0 + \x8F\xD2\xD4 |0 + \xE4\xCA |0 + \x8F\xD2\xD5 |0 + \x8F\xD2\xD6 |0 + \xE4\xCE |0 + \xE4\xCB |0 + \x8F\xD2\xD7 |0 + \x8F\xD2\xD8 |0 + \x8F\xD2\xD9 |0 + \x8F\xD2\xDA |0 + \x8F\xD2\xDB |0 + \xE4\xC7 |0 + \x8F\xD2\xDC |0 + \x8F\xD2\xDD |0 + \x8F\xD2\xDE |0 + \x8F\xD2\xDF |0 + \x8F\xD2\xE0 |0 + \xE4\xC8 |0 + \x8F\xD2\xE1 |0 + \x8F\xD2\xE2 |0 + \x8F\xD2\xE3 |0 + \xE4\xCD |0 + \x8F\xD2\xE4 |0 + \x8F\xD2\xE5 |0 + \xE4\xC2 |0 + \xD2\xD5 |0 + \xE4\xC9 |0 + \xE4\xC3 |0 + \xE4\xCC |0 + \x8F\xD2\xE6 |0 + \x8F\xD2\xE7 |0 + \xC3\xBD |1 + \xE4\xD2 |0 + \x8F\xD2\xE8 |0 + \xB4\xCA |0 + \xE4\xCF |0 + \x8F\xD2\xE9 |0 + \x8F\xD2\xEA |0 + \xE4\xD0 |0 + \x8F\xD2\xEB |0 + \xE4\xD1 |0 + \xE4\xD4 |0 + \x8F\xD2\xEC |0 + \x8F\xD2\xED |0 + \x8F\xD2\xEE |0 + \x8F\xD2\xEF |0 + \x8F\xD2\xF0 |0 + \xE4\xD3 |0 + \xC8\xF6 |0 + \x8F\xD2\xF1 |0 + \x8F\xD2\xF2 |0 + \xE4\xD5 |0 + \xCE\xFC |0 + \xCA\xED |0 + \xE4\xDA |0 + \xE4\xD7 |0 + \x8F\xD2\xF3 |0 + \x8F\xD2\xF4 |0 + \xE4\xD6 |0 + \xC0\xD2 |0 + \xE4\xD9 |0 + \xE4\xDB |0 + \x8F\xD2\xF6 |0 + \x8F\xD2\xF7 |0 + \x8F\xD2\xF8 |0 + \xE4\xD8 |0 + \x8F\xD2\xF5 |0 + \xE4\xDF |0 + \xE4\xDC |0 + \x8F\xD2\xF9 |0 + \x8F\xD2\xFA |0 + \x8F\xD2\xFB |0 + \x8F\xD2\xFC |0 + \x8F\xD2\xFD |0 + \x8F\xD2\xFE |0 + \xE4\xDD |0 + \xE4\xC6 |0 + \x8F\xD3\xA1 |0 + \x8F\xD3\xA2 |0 + \xE4\xDE |0 + \xE4\xE0 |0 + \x8F\xD3\xA3 |0 + \x8F\xD3\xA4 |0 + \xE4\xE1 |0 + \x8F\xD3\xA5 |0 + \x8F\xD3\xA6 |0 + \x8F\xD3\xA7 |0 + \x8F\xD3\xA8 |0 + \xCA\xC6 |0 + \xE4\xE2 |0 + \x8F\xD3\xA9 |0 + \x8F\xD3\xAA |0 + \x8F\xD3\xAB |0 + \xCC\xE2 |0 + \xB6\xCE |0 + \xB7\xA9 |0 + \xE4\xE3 |0 + \x8F\xD3\xAC |0 + \x8F\xD3\xAD |0 + \xCA\xB4 |0 + \xBF\xE8 |0 + \xCC\xB0 |0 + \x8F\xD3\xAE |0 + \xE4\xE4 |0 + \xCE\xB3 |0 + \x8F\xD3\xAF |0 + \xC7\xF4 |0 + \xC1\xC6 |0 + \xC7\xB4 |0 + \xBD\xCD |0 + \x8F\xD3\xB0 |0 + \xB0\xC0 |0 + \x8F\xD3\xB1 |0 + \xE4\xE9 |0 + \xE4\xE7 |0 + \xE4\xE5 |0 + \xB4\xA1 |0 + \x8F\xD3\xB2 |0 + \xBE\xD1 |0 + \xE4\xEA |0 + \xE4\xE8 |0 + \xE4\xE6 |0 + \xE4\xEE |0 + \x8F\xD3\xB3 |0 + \xE4\xED |0 + \xE4\xEC |0 + \xE4\xEB |0 + \x8F\xD3\xB4 |0 + \x8F\xD3\xB5 |0 + \xE4\xEF |0 + \x8F\xD3\xB6 |0 + \x8F\xD3\xB7 |0 + \x8F\xD3\xB8 |0 + \xE4\xF0 |0 + \xC0\xBA |0 + \x8F\xD3\xB9 |0 + \xE4\xF1 |0 + \xE4\xF3 |0 + \x8F\xD3\xBA |0 + \xE4\xF2 |0 + \x8F\xD3\xBB |0 + \x8F\xD3\xBC |0 + \x8F\xD3\xBD |0 + \xB8\xD2 |0 + \x8F\xD3\xBE |0 + \xC1\xB8 |0 + \x8F\xD3\xBF |0 + \xE4\xF5 |0 + \x8F\xD3\xC0 |0 + \x8F\xD3\xC1 |0 + \x8F\xD3\xC2 |0 + \xC5\xFC |0 + \x8F\xD3\xC3 |0 + \xE4\xF4 |0 + \x8F\xD3\xC4 |0 + \x8F\xD3\xC5 |0 + \xE4\xF6 |0 + \x8F\xD3\xC6 |0 + \xCA\xB5 |0 + \xC1\xEC |0 + \xB9\xC7 |0 + \xE4\xF7 |0 + \x8F\xD3\xC7 |0 + \xCE\xC8 |0 + \x8F\xD3\xC8 |0 + \x8F\xD3\xC9 |0 + \xE4\xF9 |0 + \xE4\xFA |0 + \xE4\xFB |0 + \x8F\xD3\xCA |0 + \xE4\xFC |0 + \xBB\xE5 |0 + \xE4\xFD |0 + \xB7\xCF |0 + \xB5\xEA |0 + \xB5\xAA |0 + \xE5\xA1 |0 + \x8F\xD3\xCB |0 + \xCC\xF3 |0 + \xB9\xC8 |0 + \xE4\xFE |0 + \x8F\xD3\xCC |0 + \x8F\xD3\xCD |0 + \x8F\xD3\xCE |0 + \xE5\xA4 |0 + \xCC\xE6 |0 + \xC7\xBC |0 + \x8F\xD3\xCF |0 + \xC9\xB3 |0 + \x8F\xD3\xD0 |0 + \x8F\xD3\xD1 |0 + \x8F\xD3\xD2 |0 + \xBD\xE3 |0 + \xE5\xA3 |0 + \x8F\xD3\xD3 |0 + \xBC\xD3 |0 + \xB9\xC9 |0 + \xBB\xE6 |0 + \xB5\xE9 |0 + \xCA\xB6 |0 + \xE5\xA2 |0 + \x8F\xD3\xD4 |0 + \x8F\xD3\xD5 |0 + \xC1\xC7 |0 + \xCB\xC2 |0 + \xBA\xF7 |0 + \x8F\xD3\xD6 |0 + \x8F\xD3\xD7 |0 + \x8F\xD3\xD8 |0 + \xBB\xE7 |0 + \xC4\xDD |0 + \x8F\xD3\xD9 |0 + \xE5\xA7 |0 + \xCE\xDF |0 + \xBA\xD9 |0 + \x8F\xD3\xDA |0 + \xE5\xA8 |0 + \xBF\xC2 |0 + \xE5\xAA |0 + \xBE\xD2 |0 + \xBA\xB0 |0 + \x8F\xD3\xDB |0 + \x8F\xD3\xDC |0 + \x8F\xD3\xDD |0 + \xE5\xA9 |0 + \x8F\xD3\xDE |0 + \x8F\xD3\xDF |0 + \xBD\xAA |0 + \xB8\xBE |0 + \xC1\xC8 |0 + \xE5\xA5 |0 + \xE5\xAB |0 + \x8F\xD3\xE0 |0 + \x8F\xD3\xE1 |0 + \xE5\xA6 |0 + \xB7\xD0 |0 + \x8F\xD3\xE2 |0 + \xE5\xAE |0 + \xE5\xB2 |0 + \xB7\xEB |0 + \x8F\xD3\xE3 |0 + \x8F\xD3\xE4 |0 + \xE5\xAD |0 + \x8F\xD3\xE5 |0 + \x8F\xD3\xE6 |0 + \x8F\xD3\xE7 |0 + \xE5\xB6 |0 + \x8F\xD3\xE8 |0 + \x8F\xD3\xE9 |0 + \xB9\xCA |0 + \xCD\xED |0 + \xB0\xBC |0 + \xE5\xB3 |0 + \x8F\xD3\xEA |0 + \xB5\xEB |0 + \x8F\xD3\xEB |0 + \xE5\xB0 |0 + \x8F\xD3\xEC |0 + \xE5\xB1 |0 + \x8F\xD3\xED |0 + \xC5\xFD |0 + \xE5\xAF |0 + \xE5\xAC |0 + \xB3\xA8 |0 + \xC0\xE4 |0 + \x8F\xD3\xEE |0 + \xB8\xA8 |0 + \x8F\xD3\xEF |0 + \x8F\xD3\xF0 |0 + \xE5\xB8 |0 + \x8F\xD3\xF1 |0 + \x8F\xD3\xF2 |0 + \x8F\xD3\xF3 |0 + \x8F\xD3\xF4 |0 + \x8F\xD3\xF5 |0 + \x8F\xD3\xF6 |0 + \x8F\xD3\xF7 |0 + \xE5\xB5 |0 + \x8F\xD3\xF8 |0 + \x8F\xD3\xF9 |0 + \x8F\xD3\xFA |0 + \xE5\xB7 |0 + \x8F\xD3\xFB |0 + \xE5\xB4 |0 + \x8F\xD3\xFC |0 + \x8F\xD3\xFD |0 + \xB7\xD1 |0 + \xC2\xB3 |0 + \xE5\xB9 |0 + \xC1\xEE |0 + \x8F\xD3\xFE |0 + \x8F\xD4\xA1 |0 + \xE5\xC6 |0 + \x8F\xF4\xD4 |0 + \xE5\xC2 |0 + \xE5\xBC |0 + \x8F\xD4\xA2 |0 + \x8F\xD4\xA3 |0 + \x8F\xD4\xA4 |0 + \xE5\xC0 |0 + \xBC\xFA |0 + \xB0\xDD |0 + \xE5\xBB |0 + \xE5\xC3 |0 + \xE5\xC7 |0 + \xB9\xCB |0 + \xCC\xD6 |0 + \x8F\xD4\xA5 |0 + \xC4\xD6 |0 + \xE5\xBD |0 + \x8F\xD4\xA6 |0 + \x8F\xD4\xA7 |0 + \xE5\xC5 |0 + \x8F\xD4\xA8 |0 + \xE5\xBA |0 + \xC3\xBE |0 + \xE5\xBF |0 + \xB0\xBD |0 + \xCC\xCA |0 + \x8F\xD4\xA9 |0 + \x8F\xD4\xAA |0 + \x8F\xD4\xAB |0 + \x8F\xD4\xAC |0 + \x8F\xD4\xAD |0 + \xE5\xBE |0 + \xB6\xDB |0 + \xC8\xEC |0 + \x8F\xD4\xAE |0 + \x8F\xD4\xAF |0 + \x8F\xD4\xB0 |0 + \xC1\xED |0 + \xCE\xD0 |0 + \xBD\xEF |0 + \xE5\xEE |0 + \x8F\xF4\xD5 |0 + \x8F\xD4\xB1 |0 + \xE5\xC8 |0 + \x8F\xD4\xB2 |0 + \xC0\xFE |0 + \xE5\xC4 |0 + \xE5\xC9 |0 + \xE5\xCB |0 + \xC4\xF9 |0 + \xE5\xCE |0 + \x8F\xD4\xB4 |0 + \xE5\xCA |0 + \x8F\xD4\xB5 |0 + \x8F\xD4\xB6 |0 + \xCA\xD4 |0 + \xB4\xCB |0 + \x8F\xD4\xB7 |0 + \x8F\xD4\xB8 |0 + \xCC\xCB |0 + \x8F\xD4\xB9 |0 + \xB0\xDE |0 + \x8F\xD4\xBA |0 + \xE5\xCD |0 + \xCE\xFD |0 + \x8F\xD4\xBB |0 + \x8F\xD4\xBC |0 + \x8F\xD4\xBD |0 + \x8F\xD4\xBE |0 + \xE5\xCC |0 + \x8F\xD4\xB3 |0 + \xB1\xEF |0 + \xC6\xEC |0 + \xE5\xCF |0 + \x8F\xD4\xBF |0 + \xE5\xD6 |0 + \xE5\xD0 |0 + \xE5\xD7 |0 + \x8F\xD4\xC0 |0 + \x8F\xD4\xC1 |0 + \xE5\xD3 |0 + \x8F\xD4\xC2 |0 + \x8F\xD4\xC3 |0 + \xC7\xFB |0 + \x8F\xD4\xC4 |0 + \x8F\xD4\xC5 |0 + \xBC\xCA |0 + \xE5\xD5 |0 + \x8F\xD4\xC6 |0 + \xE5\xD2 |0 + \xE5\xD8 |0 + \xE5\xD1 |0 + \xBD\xC4 |0 + \x8F\xD4\xC7 |0 + \x8F\xD4\xC8 |0 + \xCB\xA5 |0 + \x8F\xD4\xC9 |0 + \x8F\xD4\xCA |0 + \xBD\xCC |0 + \x8F\xD4\xCB |0 + \xE5\xD4 |0 + \xE5\xE0 |0 + \x8F\xD4\xCC |0 + \xE5\xDC |0 + \x8F\xD4\xCD |0 + \xE5\xDF |0 + \xE5\xDD |0 + \xE5\xE1 |0 + \xE5\xDB |0 + \xE5\xC1 |0 + \xC0\xD3 |0 + \x8F\xD4\xCE |0 + \xC8\xCB |0 + \xE5\xDE |0 + \x8F\xD4\xCF |0 + \x8F\xD4\xD0 |0 + \xE5\xD9 |0 + \x8F\xD4\xD1 |0 + \xE5\xDA |1 + \xC1\xA1 |0 + \xB7\xD2 |0 + \xBD\xAB |0 + \x8F\xD4\xD2 |0 + \x8F\xD4\xD3 |0 + \x8F\xD4\xD4 |0 + \xBF\xA5 |0 + \xC1\xB6 |0 + \xE5\xE4 |0 + \x8F\xD4\xD5 |0 + \xE5\xE6 |0 + \xE5\xE7 |0 + \xE5\xE3 |0 + \xE5\xE5 |0 + \x8F\xD4\xD6 |0 + \x8F\xD4\xD7 |0 + \x8F\xD4\xD8 |0 + \x8F\xD4\xD9 |0 + \xE5\xDA |0 + \xE5\xE2 |0 + \xE5\xEA |0 + \xE5\xE9 |0 + \x8F\xD4\xDA |0 + \xCB\xFA |0 + \x8F\xD4\xDB |0 + \x8F\xD4\xDC |0 + \xB7\xAB |0 + \x8F\xD4\xDD |0 + \x8F\xD4\xDE |0 + \xE5\xE8 |0 + \xE5\xEC |0 + \xE5\xEB |0 + \xE5\xEF |0 + \x8F\xD4\xDF |0 + \xE5\xF1 |0 + \x8F\xD4\xE0 |0 + \xBB\xBC |0 + \xE5\xED |0 + \x8F\xD4\xE1 |0 + \x8F\xD4\xE2 |0 + \xE5\xF2 |0 + \xE5\xF3 |0 + \x8F\xD4\xE3 |0 + \xE5\xF4 |0 + \x8F\xD4\xE4 |0 + \xE5\xFA |0 + \xC5\xBB |0 + \xE5\xF6 |0 + \x8F\xD4\xE5 |0 + \xE5\xF5 |0 + \xE5\xF7 |0 + \xE5\xF8 |0 + \x8F\xD4\xE6 |0 + \xE5\xF9 |0 + \x8F\xD4\xE7 |0 + \x8F\xD4\xE8 |0 + \xE5\xFB |0 + \xE5\xFC |0 + \x8F\xD4\xE9 |0 + \x8F\xD4\xEA |0 + \xB4\xCC |0 + \xE5\xFD |0 + \xE5\xFE |0 + \x8F\xD4\xEC |0 + \x8F\xD4\xEB |0 + \x8F\xD4\xED |0 + \x8F\xD4\xEE |0 + \x8F\xD4\xEF |0 + \x8F\xD4\xF0 |0 + \x8F\xD4\xF1 |0 + \xE6\xA1 |0 + \x8F\xD4\xF2 |0 + \xE6\xA2 |0 + \xE6\xA3 |0 + \xE6\xA4 |0 + \x8F\xD4\xF3 |0 + \xE6\xA5 |0 + \xE6\xA6 |0 + \x8F\xD4\xF4 |0 + \x8F\xD4\xF5 |0 + \xE6\xA8 |0 + \xE6\xA7 |0 + \xE6\xA9 |0 + \x8F\xD4\xF6 |0 + \x8F\xD4\xF7 |0 + \x8F\xD4\xF8 |0 + \xE6\xAA |0 + \xE6\xAB |0 + \x8F\xD4\xF9 |0 + \x8F\xD4\xFA |0 + \x8F\xD4\xFB |0 + \x8F\xD4\xFC |0 + \x8F\xD4\xFD |0 + \xE6\xAE |0 + \xE6\xAC |0 + \xE6\xAD |0 + \xBA\xE1 |0 + \xB7\xD3 |0 + \x8F\xD4\xFE |0 + \xC3\xD6 |0 + \xC8\xB3 |0 + \x8F\xD5\xA1 |0 + \xBD\xF0 |0 + \xC7\xCD |0 + \xC8\xED |0 + \xE6\xAF |0 + \xD8\xED |0 + \x8F\xD5\xA2 |0 + \x8F\xD5\xA3 |0 + \x8F\xD5\xA4 |0 + \x8F\xD5\xA5 |0 + \xE6\xB0 |0 + \xE6\xB2 |0 + \xCD\xE5 |0 + \xE6\xB1 |0 + \xE6\xB4 |0 + \xE6\xB3 |0 + \xCD\xD3 |0 + \x8F\xD5\xA6 |0 + \xE6\xB5 |0 + \x8F\xD5\xA7 |0 + \xC8\xFE |0 + \x8F\xD5\xA8 |0 + \x8F\xD5\xA9 |0 + \x8F\xD5\xAA |0 + \xE6\xB6 |0 + \x8F\xD5\xAB |0 + \x8F\xD5\xAC |0 + \xE6\xB9 |0 + \x8F\xD5\xAD |0 + \xE6\xB8 |0 + \xE6\xB7 |0 + \x8F\xD5\xAE |0 + \x8F\xD5\xAF |0 + \xE6\xBA |0 + \xB7\xB2 |0 + \x8F\xD5\xB0 |0 + \xC1\xA2 |0 + \xB5\xC1 |0 + \x8F\xD5\xB1 |0 + \x8F\xD5\xB2 |0 + \xE6\xBE |0 + \xE6\xBB |0 + \xE6\xBC |0 + \x8F\xD5\xB3 |0 + \xE6\xBF |0 + \xE6\xC0 |0 + \xE6\xBD |0 + \x8F\xD5\xB4 |0 + \xB1\xA9 |0 + \x8F\xD5\xB5 |0 + \x8F\xD5\xB6 |0 + \xB2\xA7 |0 + \x8F\xD5\xB7 |0 + \xE6\xC2 |0 + \xE6\xC3 |0 + \x8F\xD5\xB8 |0 + \xE6\xC4 |0 + \xCD\xE2 |0 + \x8F\xD5\xB9 |0 + \x8F\xD5\xBA |0 + \xBD\xAC |0 + \xE6\xC6 |0 + \xE6\xC5 |0 + \x8F\xD5\xBB |0 + \x8F\xD5\xBC |0 + \xBF\xE9 |0 + \xE6\xC7 |0 + \x8F\xD5\xBD |0 + \x8F\xD5\xBE |0 + \xE6\xC8 |0 + \x8F\xD5\xBF |0 + \xE6\xC9 |0 + \xB4\xE5 |0 + \x8F\xD5\xC0 |0 + \x8F\xD5\xC1 |0 + \x8F\xD5\xC2 |0 + \xB4\xCD |0 + \x8F\xD5\xC3 |0 + \xE6\xCA |0 + \xE6\xCB |0 + \x8F\xD5\xC4 |0 + \xCB\xDD |0 + \xCD\xE3 |0 + \x8F\xD5\xC5 |0 + \x8F\xD5\xC6 |0 + \x8F\xD5\xC7 |0 + \xCD\xD4 |0 + \xCF\xB7 |0 + \xB9\xCD |0 + \xE6\xCE |0 + \xBC\xD4 |0 + \xE6\xCD |0 + \x8F\xD5\xC8 |0 + \x8F\xD5\xC9 |0 + \x8F\xD5\xCA |0 + \xE6\xCF |0 + \xBC\xA9 |0 + \x8F\xD5\xCB |0 + \x8F\xD5\xCC |0 + \x8F\xD5\xCD |0 + \xC2\xD1 |0 + \x8F\xD5\xCE |0 + \xE6\xD0 |0 + \x8F\xD5\xCF |0 + \x8F\xD5\xD0 |0 + \xB9\xCC |0 + \x8F\xD5\xD1 |0 + \xCC\xD7 |0 + \xE6\xD1 |0 + \xE6\xD2 |0 + \xE6\xD3 |0 + \x8F\xD5\xD2 |0 + \x8F\xD5\xD3 |0 + \x8F\xD5\xD4 |0 + \x8F\xD5\xD5 |0 + \xE6\xD4 |0 + \x8F\xD5\xD6 |0 + \x8F\xD5\xD7 |0 + \xE6\xD5 |0 + \x8F\xD5\xD8 |0 + \x8F\xD5\xD9 |0 + \x8F\xD5\xDA |0 + \xBC\xAA |0 + \x8F\xD5\xDB |0 + \x8F\xD5\xDC |0 + \xCC\xED |0 + \x8F\xD5\xDD |0 + \x8F\xD5\xDE |0 + \x8F\xD5\xDF |0 + \xE6\xD7 |0 + \x8F\xD5\xE0 |0 + \xC3\xBF |0 + \x8F\xD5\xE1 |0 + \xE6\xD6 |0 + \x8F\xD5\xE2 |0 + \x8F\xD5\xE3 |0 + \xE6\xD9 |0 + \xE6\xD8 |0 + \xE6\xDA |0 + \xC0\xBB |0 + \xE6\xDB |0 + \xE6\xDC |0 + \xCA\xB9 |0 + \xE6\xDD |0 + \x8F\xD5\xE4 |0 + \xC1\xEF |0 + \xE6\xDE |0 + \x8F\xD5\xE5 |0 + \x8F\xD5\xE6 |0 + \xE6\xDF |0 + \x8F\xD5\xE7 |0 + \xCE\xFE |0 + \xE6\xE2 |0 + \x8F\xD5\xE8 |0 + \xE6\xE1 |0 + \xE6\xE0 |0 + \xC4\xB0 |0 + \x8F\xD5\xE9 |0 + \xE6\xE3 |0 + \xBF\xA6 |0 + \xE6\xE4 |0 + \xE6\xE5 |0 + \xCF\xB8 |0 + \xE6\xE6 |0 + \x8F\xD5\xEA |0 + \xE6\xE7 |0 + \xE6\xE9 |0 + \xE6\xE8 |0 + \xC8\xA5 |0 + \x8F\xD5\xEB |0 + \xC6\xF9 |0 + \xCF\xBE |0 + \xC8\xA9 |0 + \x8F\xD5\xEC |0 + \xE6\xEB |0 + \xBE\xD3 |0 + \xC9\xAA |0 + \xE6\xEC |0 + \xE6\xEA |0 + \x8F\xD5\xED |0 + \xB4\xCE |0 + \x8F\xD5\xEE |0 + \xB8\xD4 |0 + \xBB\xE8 |0 + \xC8\xEE |0 + \x8F\xD5\xEF |0 + \x8F\xD5\xF0 |0 + \xB8\xAA |0 + \xCB\xC3 |0 + \x8F\xD5\xF1 |0 + \xE6\xEF |0 + \xE6\xED |0 + \xB9\xCE |0 + \xB9\xCF |0 + \xB0\xE9 |0 + \xBA\xE8 |0 + \x8F\xD5\xF2 |0 + \x8F\xD5\xF3 |0 + \xC7\xD9 |0 + \xB0\xDF |0 + \xE6\xF4 |0 + \xC3\xC0 |0 + \x8F\xD5\xF4 |0 + \xC7\xD8 |0 + \x8F\xD5\xF5 |0 + \xC2\xDB |0 + \x8F\xD5\xF6 |0 + \x8F\xD5\xF7 |0 + \x8F\xD5\xF8 |0 + \x8F\xD5\xF9 |0 + \xE6\xF6 |0 + \x8F\xD5\xFA |0 + \x8F\xD5\xFB |0 + \xE6\xF2 |0 + \xE6\xF5 |0 + \xE6\xF0 |0 + \xE6\xF3 |0 + \xCB\xA6 |0 + \x8F\xD5\xFC |0 + \xB8\xD5 |0 + \xB0\xFD |0 + \xE6\xF1 |0 + \x8F\xD5\xFD |0 + \x8F\xD5\xFE |0 + \xE6\xF8 |0 + \x8F\xD6\xA1 |0 + \xE6\xF9 |0 + \x8F\xD6\xA2 |0 + \x8F\xD6\xA3 |0 + \xC6\xB9 |0 + \x8F\xD6\xA4 |0 + \xB6\xBB |0 + \x8F\xD6\xA5 |0 + \x8F\xD6\xA6 |0 + \xE7\xA6 |0 + \xC7\xBD |0 + \x8F\xD6\xA7 |0 + \xBB\xE9 |0 + \x8F\xD6\xA8 |0 + \xB6\xBC |0 + \xC0\xC8 |0 + \xCF\xC6 |0 + \xCC\xAE |0 + \xE6\xF7 |0 + \xC0\xD4 |0 + \x8F\xD6\xA9 |0 + \x8F\xD6\xAA |0 + \x8F\xD6\xAB |0 + \x8F\xD6\xAC |0 + \xB5\xD3 |0 + \xE6\xFA |0 + \x8F\xD6\xAD |0 + \x8F\xD6\xAE |0 + \x8F\xD6\xAF |0 + \xE6\xFC |0 + \x8F\xD6\xB0 |0 + \x8F\xD6\xB1 |0 + \xE6\xFB |0 + \x8F\xD6\xB2 |0 + \xE6\xFD |0 + \x8F\xD6\xB3 |0 + \xC3\xA6 |0 + \xC7\xBE |0 + \x8F\xD6\xB4 |0 + \xC4\xB1 |0 + \x8F\xD6\xB5 |0 + \x8F\xD6\xB6 |0 + \xE7\xA3 |0 + \xE7\xA6 |1 + \x8F\xD6\xB7 |0 + \xE7\xA2 |0 + \x8F\xD6\xB8 |0 + \x8F\xD6\xB9 |0 + \xE6\xFE |0 + \x8F\xD6\xBA |0 + \xBF\xD5 |0 + \xC9\xE5 |0 + \xE7\xA5 |0 + \x8F\xD6\xBB |0 + \xE7\xA4 |0 + \xB9\xD0 |0 + \xCF\xD3 |0 + \x8F\xD6\xBC |0 + \xE7\xB5 |0 + \x8F\xD6\xBD |0 + \x8F\xD6\xBE |0 + \xE7\xA9 |0 + \xE7\xAA |0 + \x8F\xD6\xBF |0 + \x8F\xD6\xC0 |0 + \x8F\xD6\xC1 |0 + \xBC\xF0 |0 + \x8F\xD6\xC2 |0 + \xE7\xA8 |0 + \x8F\xD6\xC3 |0 + \xB9\xF8 |0 + \xE7\xA7 |0 + \xE7\xAB |0 + \x8F\xD6\xC4 |0 + \xC4\xB2 |0 + \xCA\xA2 |0 + \xC1\xA3 |0 + \xC2\xDC |0 + \xE7\xAF |0 + \x8F\xD6\xC5 |0 + \xE7\xB0 |0 + \xE7\xAC |0 + \x8F\xD6\xC7 |0 + \x8F\xD6\xC8 |0 + \x8F\xD6\xC9 |0 + \xE7\xAD |0 + \xE7\xAE |0 + \x8F\xD6\xCA |0 + \x8F\xD6\xCB |0 + \xB9\xD1 |0 + \x8F\xD6\xC6 |0 + \xE7\xB6 |0 + \xE7\xB2 |0 + \x8F\xD6\xCC |0 + \x8F\xD6\xCD |0 + \xC9\xE6 |0 + \x8F\xD6\xCE |0 + \xCB\xEC |0 + \xC9\xA8 |0 + \x8F\xD6\xCF |0 + \xE7\xB1 |0 + \x8F\xD6\xD0 |0 + \xE7\xB4 |0 + \xE7\xB3 |0 + \xCB\xC4 |0 + \xE7\xB7 |0 + \x8F\xD6\xD1 |0 + \xE7\xB8 |0 + \x8F\xD6\xD2 |0 + \xC1\xB7 |0 + \x8F\xD6\xD3 |0 + \xE7\xB9 |0 + \xE7\xBB |0 + \xE7\xBF |0 + \x8F\xD6\xD4 |0 + \xE7\xBC |0 + \xE7\xBA |0 + \xC7\xBF |0 + \xE7\xBD |0 + \xE7\xBE |0 + \x8F\xD6\xD6 |0 + \x8F\xD6\xD7 |0 + \xB2\xB2 |0 + \xE7\xC5 |0 + \xE7\xC0 |0 + \x8F\xD6\xD8 |0 + \x8F\xD6\xD5 |0 + \xE7\xC1 |0 + \x8F\xD6\xD9 |0 + \x8F\xD6\xDA |0 + \xE7\xC2 |0 + \xC2\xA1 |0 + \x8F\xD6\xDB |0 + \x8F\xD6\xDC |0 + \xE7\xC4 |0 + \xE7\xC3 |0 + \xE7\xC6 |0 + \x8F\xD6\xDD |0 + \x8F\xD6\xDE |0 + \x8F\xD6\xDF |0 + \xE7\xC7 |0 + \xE7\xC8 |0 + \x8F\xD6\xE0 |0 + \xBF\xC3 |0 + \x8F\xD6\xE1 |0 + \xB2\xE9 |0 + \xE7\xC9 |0 + \xCE\xD7 |0 + \xBC\xAB |0 + \x8F\xD6\xE2 |0 + \x8F\xD6\xE3 |0 + \xBD\xAD |0 + \x8F\xD6\xE4 |0 + \x8F\xD6\xE5 |0 + \x8F\xD6\xE6 |0 + \xBB\xEA |0 + \xC3\xD7 |0 + \x8F\xD6\xE7 |0 + \x8F\xD6\xE8 |0 + \x8F\xD6\xE9 |0 + \x8F\xD6\xEA |0 + \xE7\xCA |0 + \xE7\xCB |0 + \xB1\xB1 |0 + \x8F\xD6\xEB |0 + \xE7\xCC |0 + \x8F\xD6\xEC |0 + \x8F\xD6\xED |0 + \xE7\xCD |0 + \xE7\xCE |0 + \x8F\xD6\xEE |0 + \xE7\xCF |0 + \xE7\xD0 |0 + \xB6\xBD |0 + \xDA\xAA |0 + \xE7\xD1 |0 + \xC0\xE5 |0 + \xE7\xD2 |0 + \xBC\xCB |0 + \x8F\xD6\xEF |0 + \xE7\xD3 |0 + \xD0\xB0 |0 + \x8F\xD6\xF0 |0 + \x8F\xD6\xF1 |0 + \xE7\xD4 |0 + \xCA\xDE |0 + \xB4\xDC |0 + \x8F\xD6\xF2 |0 + \x8F\xD6\xF3 |0 + \xC1\xA4 |0 + \xBD\xD8 |0 + \x8F\xD6\xF4 |0 + \xC9\xF1 |0 + \xBD\xAE |0 + \x8F\xD6\xF5 |0 + \x8F\xD6\xF6 |0 + \x8F\xD6\xF7 |0 + \xE7\xD5 |0 + \xB9\xD2 |0 + \xE7\xD6 |0 + \xC8\xCC |0 + \xE7\xE4 |0 + \x8F\xD6\xF8 |0 + \xE7\xD8 |0 + \x8F\xD6\xF9 |0 + \xC2\xC9 |0 + \xC7\xF5 |0 + \xB8\xBF |0 + \xE7\xD7 |0 + \xC1\xA5 |0 + \x8F\xD6\xFA |0 + \xE7\xD9 |0 + \x8F\xD6\xFB |0 + \x8F\xD6\xFC |0 + \x8F\xD6\xFD |0 + \x8F\xD6\xFE |0 + \xC4\xFA |0 + \x8F\xD7\xA1 |0 + \x8F\xD7\xA2 |0 + \x8F\xD7\xA3 |0 + \x8F\xD7\xA4 |0 + \x8F\xD7\xA5 |0 + \xE7\xDB |0 + \xE7\xDA |0 + \xE7\xDD |0 + \x8F\xD7\xA6 |0 + \xE7\xDC |0 + \xE7\xDE |0 + \x8F\xD7\xA7 |0 + \xE7\xE0 |0 + \x8F\xD7\xA8 |0 + \xE7\xDF |0 + \xB4\xCF |0 + \x8F\xD7\xA9 |0 + \xE7\xE1 |0 + \xE7\xE2 |0 + \xE7\xE3 |0 + \x8F\xD7\xAA |0 + \xBA\xB1 |0 + \xCE\xC9 |0 + \xE7\xE5 |0 + \xBF\xA7 |0 + \x8F\xD7\xAB |0 + \xB1\xF0 |0 + \xE7\xE6 |0 + \xE7\xE7 |0 + \x8F\xD7\xAC |0 + \x8F\xD7\xAD |0 + \xE7\xE8 |0 + \x8F\xD7\xAE |0 + \x8F\xD7\xAF |0 + \x8F\xD7\xB0 |0 + \x8F\xD7\xB1 |0 + \x8F\xD7\xB2 |0 + \x8F\xD7\xB3 |0 + \x8F\xD7\xB4 |0 + \x8F\xD7\xB5 |0 + \xB0\xF2 |0 + \xE7\xE9 |0 + \x8F\xD7\xB6 |0 + \x8F\xD7\xB7 |0 + \xE7\xEA |0 + \x8F\xD7\xB8 |0 + \x8F\xD7\xB9 |0 + \x8F\xD7\xBA |0 + \xC9\xE7 |0 + \x8F\xD7\xBB |0 + \x8F\xD7\xBC |0 + \xBC\xC7 |0 + \xE7\xEC |0 + \x8F\xD7\xBD |0 + \x8F\xD7\xBE |0 + \x8F\xD7\xBF |0 + \x8F\xD7\xC0 |0 + \xB3\xA9 |0 + \xB0\xB2 |0 + \x8F\xD7\xC1 |0 + \x8F\xD7\xC2 |0 + \x8F\xD7\xC3 |0 + \x8F\xD7\xC4 |0 + \xE7\xEB |0 + \xE7\xEE |0 + \xC7\xCE |0 + \x8F\xD7\xC5 |0 + \xBF\xC4 |0 + \x8F\xD7\xC6 |0 + \xB2\xD6 |0 + \x8F\xD7\xC7 |0 + \xCB\xA7 |0 + \x8F\xD7\xC8 |0 + \x8F\xD7\xC9 |0 + \xB7\xDD |0 + \xB6\xDC |0 + \x8F\xD7\xCA |0 + \xE7\xED |0 + \x8F\xD7\xCB |0 + \xB2\xEA |0 + \x8F\xD7\xCC |0 + \x8F\xD7\xCD |0 + \xB4\xA3 |0 + \x8F\xD7\xCE |0 + \x8F\xD7\xCF |0 + \xB1\xF1 |0 + \xE7\xF2 |0 + \xCE\xEA |0 + \xC2\xDD |0 + \x8F\xD7\xD0 |0 + \xC9\xC4 |0 + \xE7\xFE |0 + \x8F\xD7\xD1 |0 + \xB2\xD7 |0 + \xE7\xFC |0 + \xE7\xFA |0 + \xE7\xF1 |0 + \x8F\xD7\xD2 |0 + \xE7\xEF |0 + \x8F\xD7\xD3 |0 + \xE7\xF0 |0 + \x8F\xD7\xD4 |0 + \xBC\xE3 |0 + \xB6\xEC |0 + \xC3\xF7 |0 + \x8F\xD7\xD5 |0 + \x8F\xD7\xD6 |0 + \xC6\xD1 |0 + \x8F\xD7\xD7 |0 + \x8F\xD7\xD8 |0 + \xB1\xD1 |0 + \xE7\xF4 |0 + \xE7\xF3 |0 + \x8F\xD7\xD9 |0 + \x8F\xD7\xDA |0 + \xE7\xF9 |0 + \xE7\xF5 |0 + \xE7\xF8 |0 + \x8F\xD7\xDB |0 + \x8F\xD7\xDC |0 + \x8F\xD7\xDD |0 + \x8F\xD7\xDE |0 + \xCC\xD0 |0 + \xE7\xF7 |0 + \xB2\xD8 |0 + \xB3\xFD |0 + \xE7\xFB |0 + \x8F\xD7\xDF |0 + \x8F\xD7\xE0 |0 + \xE7\xFD |0 + \x8F\xD7\xE1 |0 + \x8F\xD7\xE2 |0 + \xB7\xD4 |0 + \xE8\xA3 |0 + \xE8\xAC |0 + \xE8\xAD |0 + \x8F\xD7\xE4 |0 + \xB0\xAB |0 + \x8F\xD7\xE5 |0 + \x8F\xD7\xE6 |0 + \x8F\xD7\xE7 |0 + \x8F\xD7\xE8 |0 + \x8F\xD7\xE9 |0 + \xE8\xB4 |0 + \xB0\xF1 |0 + \xE8\xAB |0 + \x8F\xD7\xEA |0 + \x8F\xD7\xEB |0 + \x8F\xD7\xEC |0 + \xE8\xAA |0 + \x8F\xD7\xED |0 + \xE8\xA5 |0 + \xE8\xA4 |0 + \x8F\xD7\xEE |0 + \xE8\xA2 |0 + \xE8\xA1 |0 + \xC3\xE3 |0 + \x8F\xD7\xEF |0 + \xC2\xFB |0 + \xE8\xA7 |0 + \x8F\xD7\xF0 |0 + \x8F\xD7\xF1 |0 + \x8F\xD7\xF2 |0 + \xE8\xA6 |0 + \x8F\xD7\xF3 |0 + \x8F\xD7\xF4 |0 + \x8F\xD7\xF5 |0 + \xE8\xA9 |0 + \xB7\xD5 |1 + \x8F\xD7\xF6 |0 + \xC1\xF0 |0 + \xB7\xD5 |0 + \x8F\xD7\xF7 |0 + \x8F\xD7\xF8 |0 + \xB1\xC1 |0 + \xE8\xA8 |0 + \x8F\xD7\xF9 |0 + \xB9\xD3 |0 + \x8F\xD8\xBE |0 + \x8F\xD7\xE3 |0 + \x8F\xD7\xFA |0 + \x8F\xD7\xFB |0 + \x8F\xD7\xFC |0 + \xC1\xF1 |0 + \x8F\xF4\xD7 |0 + \x8F\xD7\xFD |0 + \xE8\xBA |0 + \xE8\xBB |0 + \xB2\xD9 |0 + \x8F\xD7\xFE |0 + \xB2\xAE |0 + \xE8\xB8 |0 + \x8F\xD8\xA1 |0 + \x8F\xD8\xA2 |0 + \x8F\xD8\xA3 |0 + \x8F\xD8\xA4 |0 + \x8F\xD8\xA5 |0 + \xE8\xAE |0 + \x8F\xD8\xA6 |0 + \xE8\xB6 |0 + \xE8\xBD |0 + \xE8\xB7 |0 + \x8F\xD8\xA7 |0 + \xE8\xB5 |0 + \x8F\xD8\xA8 |0 + \xE7\xF6 |0 + \x8F\xD8\xA9 |0 + \x8F\xD8\xAA |0 + \xE8\xB3 |0 + \x8F\xD8\xAB |0 + \x8F\xD8\xAC |0 + \xE8\xAF |0 + \x8F\xD8\xAD |0 + \x8F\xD8\xAE |0 + \x8F\xD8\xAF |0 + \xB4\xD0 |0 + \xE8\xB1 |0 + \xE8\xBC |0 + \xE8\xB2 |0 + \x8F\xD8\xB0 |0 + \x8F\xD8\xB1 |0 + \xE8\xBE |0 + \x8F\xD8\xB2 |0 + \xE8\xB0 |0 + \xC7\xFC |0 + \x8F\xD8\xB3 |0 + \x8F\xD8\xCC |0 + \xCD\xE9 |0 + \xE8\xB9 |0 + \xE8\xCF |0 + \x8F\xD8\xB4 |0 + \x8F\xD8\xB5 |0 + \x8F\xD8\xB6 |0 + \xE8\xC7 |0 + \xBF\xFB |0 + \x8F\xD8\xB7 |0 + \x8F\xD8\xB8 |0 + \xB5\xC6 |0 + \xB6\xDD |0 + \xE8\xC2 |0 + \x8F\xD8\xB9 |0 + \x8F\xD8\xBA |0 + \x8F\xD8\xBB |0 + \xB2\xDB |0 + \x8F\xD8\xBC |0 + \xBE\xD4 |0 + \xE8\xC5 |0 + \xBA\xDA |0 + \x8F\xD8\xBD |0 + \xC5\xD1 |0 + \xE8\xCA |0 + \x8F\xD8\xBF |0 + \xCA\xEE |0 + \x8F\xD8\xC0 |0 + \xE8\xC1 |0 + \xB2\xDA |0 + \xB8\xD6 |0 + \xC9\xA9 |0 + \xE8\xCB |0 + \xE8\xBF |0 + \x8F\xD8\xC1 |0 + \xE8\xC8 |0 + \x8F\xD8\xC2 |0 + \x8F\xD8\xC3 |0 + \xE8\xD2 |0 + \x8F\xD8\xC4 |0 + \xE8\xC3 |0 + \x8F\xD8\xC5 |0 + \xE8\xC4 |0 + \xC6\xBA |0 + \x8F\xD8\xC6 |0 + \xE8\xC9 |0 + \x8F\xD8\xC7 |0 + \xE8\xC6 |0 + \xCB\xA8 |0 + \xE8\xCC |0 + \xB0\xE0 |0 + \x8F\xD8\xC8 |0 + \x8F\xD8\xC9 |0 + \xE8\xC0 |0 + \x8F\xD8\xCA |0 + \x8F\xD8\xCB |0 + \xE8\xCE |0 + \xE8\xCD |0 + \xC7\xEB |0 + \xE8\xD4 |0 + \xE8\xDF |0 + \x8F\xD8\xCD |0 + \xB3\xFE |0 + \xE8\xE2 |0 + \xE8\xD0 |0 + \x8F\xD8\xCE |0 + \xE8\xD5 |0 + \xCD\xEE |0 + \x8F\xD8\xCF |0 + \xE8\xDE |0 + \x8F\xD8\xD0 |0 + \x8F\xD8\xD1 |0 + \xCD\xD5 |0 + \x8F\xD8\xD2 |0 + \x8F\xD8\xD3 |0 + \xCE\xAA |0 + \x8F\xD8\xD4 |0 + \x8F\xD8\xD5 |0 + \x8F\xD8\xD6 |0 + \x8F\xD8\xD7 |0 + \xC3\xF8 |0 + \x8F\xD8\xD8 |0 + \x8F\xD8\xD9 |0 + \x8F\xD8\xDA |0 + \xB3\xEB |0 + \x8F\xD8\xDB |0 + \x8F\xD8\xDC |0 + \xC9\xF2 |0 + \xE8\xE4 |0 + \xC6\xA1 |0 + \x8F\xD8\xDD |0 + \x8F\xD8\xDE |0 + \xB0\xB1 |0 + \x8F\xD8\xDF |0 + \xE8\xDD |0 + \x8F\xD8\xE0 |0 + \xE8\xD9 |0 + \xC1\xF2 |0 + \xE8\xD3 |0 + \xE8\xDB |0 + \xE8\xE0 |0 + \x8F\xD8\xE1 |0 + \xC7\xAC |0 + \x8F\xD8\xE2 |0 + \x8F\xD8\xE3 |0 + \xB0\xAA |0 + \x8F\xD8\xE4 |0 + \xE8\xD8 |0 + \x8F\xD8\xE5 |0 + \xE8\xE1 |0 + \xC9\xF8 |0 + \x8F\xD8\xE6 |0 + \x8F\xD8\xE7 |0 + \x8F\xD8\xE8 |0 + \xE8\xDC |0 + \xE8\xD7 |0 + \x8F\xD8\xE9 |0 + \xBE\xD5 |0 + \xBD\xAF |0 + \x8F\xD8\xEA |0 + \x8F\xD8\xEB |0 + \xBC\xAC |0 + \x8F\xD8\xEC |0 + \xCC\xD8 |0 + \xC9\xC7 |0 + \x8F\xD8\xED |0 + \xE8\xE7 |0 + \xE8\xF0 |0 + \x8F\xD8\xEE |0 + \x8F\xD8\xEF |0 + \x8F\xD8\xF0 |0 + \x8F\xD8\xF1 |0 + \xE8\xDA |0 + \x8F\xD8\xF2 |0 + \x8F\xD8\xF3 |0 + \xB3\xF7 |0 + \x8F\xD8\xF4 |0 + \xBE\xF8 |0 + \xE8\xE5 |0 + \x8F\xD8\xF5 |0 + \xE8\xEA |0 + \xC1\xF3 |0 + \x8F\xD8\xF6 |0 + \x8F\xD8\xF7 |0 + \xE8\xE6 |0 + \x8F\xD8\xF8 |0 + \xE8\xED |0 + \x8F\xD8\xF9 |0 + \xC3\xDF |0 + \xE8\xEE |0 + \x8F\xD8\xFA |0 + \x8F\xD8\xFB |0 + \xCD\xD6 |0 + \xE8\xE3 |0 + \xB3\xB8 |0 + \x8F\xD8\xFC |0 + \xE8\xE9 |0 + \x8F\xD8\xFD |0 + \xE8\xEC |0 + \xCC\xAC |0 + \x8F\xD8\xFE |0 + \xE8\xEF |0 + \xE8\xE8 |0 + \xE8\xEB |0 + \x8F\xD9\xA1 |0 + \x8F\xD9\xA2 |0 + \x8F\xD9\xA3 |0 + \xCB\xA9 |0 + \xCF\xA1 |0 + \x8F\xD9\xA4 |0 + \x8F\xD9\xA5 |0 + \x8F\xD9\xA6 |0 + \x8F\xD9\xA7 |0 + \xE8\xF3 |0 + \x8F\xD9\xA8 |0 + \x8F\xD9\xAA |0 + \x8F\xD9\xAB |0 + \xE8\xFA |0 + \x8F\xD9\xAC |0 + \xE8\xF2 |0 + \xBC\xC3 |0 + \x8F\xD9\xAD |0 + \x8F\xD9\xAE |0 + \xE8\xD1 |0 + \x8F\xD9\xAF |0 + \x8F\xD9\xB0 |0 + \x8F\xD9\xB1 |0 + \x8F\xD9\xB2 |0 + \xCA\xCE |0 + \xCC\xA2 |0 + \xE8\xF9 |0 + \xE8\xF8 |0 + \xE8\xF4 |0 + \xE8\xF5 |0 + \xB1\xB6 |0 + \x8F\xD9\xB3 |0 + \x8F\xD9\xB4 |0 + \xE8\xF7 |0 + \xE8\xF1 |0 + \x8F\xD9\xB5 |0 + \x8F\xD9\xB6 |0 + \x8F\xD9\xB7 |0 + \x8F\xD9\xB8 |0 + \xC4\xD5 |0 + \x8F\xD9\xB9 |0 + \x8F\xD9\xBA |0 + \x8F\xD9\xBB |0 + \xE8\xF6 |0 + \xB0\xFE |0 + \x8F\xD9\xBC |0 + \x8F\xD9\xA9 |0 + \x8F\xD9\xBD |0 + \x8F\xD9\xBE |0 + \xC2\xA2 |0 + \x8F\xD9\xBF |0 + \xCA\xC3 |0 + \x8F\xD9\xC0 |0 + \xE8\xFB |0 + \xE9\xA1 |0 + \xC8\xD9 |0 + \x8F\xD9\xC1 |0 + \xE8\xFE |0 + \xBE\xD6 |0 + \xBC\xC9 |0 + \xE9\xA3 |0 + \xB6\xBE |0 + \x8F\xD9\xC2 |0 + \x8F\xD9\xC3 |0 + \x8F\xD9\xC4 |0 + \x8F\xD9\xC5 |0 + \x8F\xD9\xC6 |0 + \xE9\xA4 |0 + \x8F\xD9\xC7 |0 + \xC9\xF9 |0 + \xE8\xFD |0 + \x8F\xD9\xC8 |0 + \xE8\xD6 |0 + \x8F\xD9\xC9 |0 + \x8F\xD9\xCA |0 + \x8F\xD9\xCB |0 + \x8F\xD9\xCC |0 + \x8F\xD9\xCD |0 + \x8F\xD9\xCE |0 + \x8F\xD9\xCF |0 + \xE8\xFC |0 + \x8F\xD9\xD0 |0 + \xCF\xCF |0 + \xC6\xA2 |0 + \xC9\xF3 |0 + \x8F\xD9\xD1 |0 + \xE9\xAB |0 + \x8F\xD9\xD2 |0 + \xE9\xB1 |0 + \x8F\xD9\xD3 |0 + \x8F\xD9\xD4 |0 + \x8F\xD9\xD5 |0 + \x8F\xD9\xD6 |0 + \xE9\xB2 |0 + \x8F\xD9\xD7 |0 + \xE9\xA5 |0 + \x8F\xD9\xD8 |0 + \xC7\xF6 |0 + \x8F\xD9\xD9 |0 + \x8F\xD9\xDA |0 + \xE9\xAF |0 + \xE9\xA7 |0 + \x8F\xD9\xDB |0 + \xE9\xA9 |0 + \x8F\xD9\xDC |0 + \x8F\xD9\xDD |0 + \x8F\xD9\xDE |0 + \xE9\xB3 |0 + \xE9\xA8 |0 + \x8F\xD9\xDF |0 + \xE9\xAC |0 + \xB1\xF2 |0 + \x8F\xD9\xE0 |0 + \xC6\xE5 |0 + \xE9\xAD |0 + \xE9\xB0 |0 + \x8F\xD9\xE1 |0 + \x8F\xD9\xE2 |0 + \x8F\xD9\xE3 |0 + \x8F\xD9\xE4 |0 + \xE9\xA6 |0 + \x8F\xD9\xE5 |0 + \xC1\xA6 |0 + \x8F\xD9\xE6 |0 + \xE9\xAA |0 + \xBB\xA7 |0 + \xBF\xC5 |0 + \xB7\xB0 |0 + \xCC\xF4 |0 + \x8F\xD9\xF4 |0 + \xCC\xF9 |0 + \xBD\xF2 |0 + \x8F\xF4\xD9 |0 + \x8F\xD9\xE7 |0 + \x8F\xD9\xE8 |0 + \x8F\xD9\xE9 |0 + \x8F\xD9\xEA |0 + \xE9\xB7 |0 + \xE9\xB5 |0 + \x8F\xD9\xEB |0 + \x8F\xD9\xEC |0 + \x8F\xD9\xED |0 + \x8F\xD9\xEE |0 + \xCF\xCE |0 + \x8F\xD9\xEF |0 + \x8F\xD9\xF0 |0 + \xE9\xB4 |0 + \x8F\xD9\xF1 |0 + \x8F\xD9\xF2 |0 + \xCD\xF5 |0 + \x8F\xD9\xF3 |0 + \xE9\xB6 |0 + \xE9\xB8 |0 + \xE9\xB9 |0 + \x8F\xD9\xF5 |0 + \x8F\xD9\xF6 |0 + \xE9\xBC |0 + \xE9\xBA |0 + \x8F\xD9\xF7 |0 + \x8F\xD9\xF8 |0 + \xC6\xA3 |0 + \xE9\xBB |0 + \x8F\xD9\xF9 |0 + \x8F\xD9\xFA |0 + \xC8\xCD |0 + \xE9\xAE |0 + \x8F\xD9\xFB |0 + \x8F\xD9\xFC |0 + \x8F\xD9\xFD |0 + \xBD\xF3 |0 + \xE9\xBD |0 + \xE9\xC2 |0 + \xC1\xF4 |0 + \x8F\xD9\xFE |0 + \xE9\xC1 |0 + \x8F\xDA\xA1 |0 + \x8F\xDA\xA2 |0 + \xE9\xA2 |0 + \x8F\xDA\xA3 |0 + \x8F\xDA\xA4 |0 + \xE9\xC3 |0 + \xC1\xC9 |0 + \xE9\xBE |0 + \xE9\xC0 |0 + \x8F\xDA\xA5 |0 + \x8F\xDA\xA6 |0 + \x8F\xDA\xA7 |0 + \x8F\xDA\xA8 |0 + \x8F\xDA\xA9 |0 + \xE9\xBF |0 + \xDD\xB1 |0 + \xDD\xA2 |0 + \x8F\xDA\xAA |0 + \x8F\xDA\xAB |0 + \xE9\xC5 |0 + \x8F\xDA\xAC |0 + \x8F\xDA\xAD |0 + \x8F\xDA\xAE |0 + \xE9\xC4 |0 + \x8F\xDA\xAF |0 + \x8F\xDA\xB0 |0 + \xCD\xF6 |0 + \xE2\xBC |0 + \xE9\xC6 |0 + \x8F\xDA\xB1 |0 + \x8F\xDA\xB2 |0 + \x8F\xDA\xB3 |0 + \x8F\xDA\xB4 |0 + \x8F\xDA\xB5 |0 + \xE9\xC7 |0 + \x8F\xDA\xB6 |0 + \x8F\xB8\xE6 |0 + \x8F\xDA\xB7 |0 + \x8F\xDA\xB8 |0 + \xE9\xC8 |0 + \xB8\xD7 |0 + \xB5\xD4 |0 + \x8F\xDA\xB9 |0 + \x8F\xDA\xBA |0 + \xE9\xCA |0 + \xD1\xDD |0 + \x8F\xDA\xBB |0 + \x8F\xDA\xBC |0 + \x8F\xDA\xBD |0 + \x8F\xDA\xBE |0 + \xB5\xF5 |0 + \xCE\xBA |0 + \x8F\xDA\xBF |0 + \xB6\xF3 |0 + \xE9\xCB |0 + \x8F\xDA\xC0 |0 + \x8F\xDA\xC1 |0 + \x8F\xDA\xC2 |0 + \x8F\xDA\xC3 |0 + \x8F\xDA\xC4 |0 + \xE9\xCC |0 + \x8F\xDA\xC5 |0 + \xC3\xEE |0 + \x8F\xDA\xC6 |0 + \x8F\xDA\xC7 |0 + \xE9\xCD |0 + \x8F\xDA\xC8 |0 + \x8F\xDA\xC9 |0 + \x8F\xDA\xCA |0 + \xC6\xFA |0 + \x8F\xDA\xCB |0 + \xB0\xBA |0 + \x8F\xDA\xED |0 + \xB2\xE3 |0 + \xE9\xD2 |0 + \xE9\xD3 |0 + \x8F\xDA\xCC |0 + \x8F\xDA\xCD |0 + \xE9\xCE |0 + \xBB\xBD |0 + \x8F\xDA\xCE |0 + \x8F\xDA\xCF |0 + \x8F\xDA\xD0 |0 + \x8F\xDA\xD1 |0 + \x8F\xDA\xD2 |0 + \xE9\xCF |0 + \xC7\xC2 |0 + \x8F\xDA\xD3 |0 + \x8F\xDA\xD4 |0 + \x8F\xDA\xD5 |0 + \xE9\xD0 |0 + \xE9\xD1 |0 + \xE9\xDB |0 + \x8F\xDA\xD6 |0 + \xE9\xD5 |0 + \xE9\xD8 |0 + \x8F\xDA\xD7 |0 + \x8F\xDA\xD8 |0 + \x8F\xDA\xD9 |0 + \x8F\xDA\xDA |0 + \xE9\xD4 |0 + \x8F\xDA\xDB |0 + \x8F\xDA\xDC |0 + \x8F\xDA\xDD |0 + \x8F\xDA\xDE |0 + \x8F\xDA\xDF |0 + \x8F\xDA\xE0 |0 + \x8F\xDA\xE1 |0 + \xE9\xD6 |0 + \x8F\xDA\xE2 |0 + \xE9\xD7 |0 + \xBC\xD8 |0 + \xE9\xD9 |0 + \xC3\xC1 |0 + \xB7\xD6 |0 + \xB3\xC2 |0 + \x8F\xDA\xE3 |0 + \x8F\xDA\xE4 |0 + \xE9\xDC |0 + \x8F\xDA\xE5 |0 + \x8F\xDA\xE6 |0 + \xB3\xBF |0 + \x8F\xDA\xE7 |0 + \xE9\xE1 |0 + \x8F\xDA\xE8 |0 + \xE9\xDD |0 + \xE9\xE0 |0 + \x8F\xDA\xE9 |0 + \x8F\xDA\xEA |0 + \xC8\xBA |0 + \x8F\xDA\xEB |0 + \x8F\xDA\xEC |0 + \xE9\xDE |0 + \xE9\xDF |0 + \xC9\xC8 |0 + \xC8\xDA |0 + \xE9\xE2 |0 + \xC2\xFD |0 + \xE9\xEC |0 + \x8F\xDA\xEE |0 + \xE9\xE8 |0 + \x8F\xDA\xEF |0 + \x8F\xDA\xF0 |0 + \xB2\xEB |0 + \xE9\xE6 |0 + \xCB\xAA |0 + \xE9\xE7 |0 + \x8F\xDA\xF1 |0 + \x8F\xDA\xF2 |0 + \xE9\xE4 |0 + \x8F\xDA\xF3 |0 + \xE9\xE5 |0 + \xE9\xEA |0 + \xE9\xED |0 + \x8F\xDA\xF4 |0 + \xE9\xEB |0 + \x8F\xDA\xF5 |0 + \x8F\xDA\xF6 |0 + \x8F\xDA\xF7 |0 + \xE9\xE9 |0 + \xE9\xE3 |0 + \x8F\xDA\xF8 |0 + \x8F\xDA\xF9 |0 + \xC3\xD8 |0 + \x8F\xDA\xFA |0 + \xE9\xF4 |0 + \xCC\xAA |0 + \x8F\xDA\xFB |0 + \x8F\xDA\xFC |0 + \x8F\xDA\xFD |0 + \x8F\xDA\xFE |0 + \xE9\xF2 |0 + \x8F\xDB\xA1 |0 + \xE9\xF3 |0 + \x8F\xDB\xA2 |0 + \x8F\xDB\xA3 |0 + \x8F\xDB\xA4 |0 + \x8F\xDB\xA5 |0 + \xE9\xEE |0 + \xE9\xF0 |0 + \x8F\xDB\xA6 |0 + \x8F\xDB\xA7 |0 + \xE9\xF1 |0 + \x8F\xDB\xA8 |0 + \x8F\xDB\xA9 |0 + \x8F\xDB\xAA |0 + \xE9\xEF |0 + \x8F\xDB\xAB |0 + \x8F\xDB\xAC |0 + \x8F\xDB\xAD |0 + \xC0\xE6 |0 + \xCF\xB9 |0 + \xE9\xF8 |0 + \x8F\xDB\xAE |0 + \xE9\xF9 |0 + \xEA\xA1 |0 + \xBF\xAA |0 + \xE9\xFB |0 + \x8F\xDB\xAF |0 + \xE9\xFE |0 + \x8F\xDB\xB0 |0 + \xE9\xF6 |0 + \xE9\xF5 |0 + \x8F\xDB\xB1 |0 + \xEA\xA2 |0 + \x8F\xDB\xB2 |0 + \x8F\xDB\xB3 |0 + \xB2\xDC |0 + \xE9\xFC |0 + \xEA\xA3 |0 + \xE9\xFD |0 + \x8F\xDB\xB4 |0 + \x8F\xDB\xB5 |0 + \x8F\xDB\xB6 |0 + \xE9\xFA |0 + \xC4\xB3 |0 + \xE9\xF7 |0 + \x8F\xDB\xB7 |0 + \xC7\xE8 |0 + \xEA\xA7 |0 + \x8F\xDB\xB8 |0 + \x8F\xDB\xB9 |0 + \x8F\xDB\xBA |0 + \x8F\xDB\xBB |0 + \x8F\xDB\xBC |0 + \x8F\xDB\xBD |0 + \x8F\xDB\xBE |0 + \x8F\xDB\xBF |0 + \x8F\xDB\xC0 |0 + \xCD\xBB |0 + \x8F\xDB\xC1 |0 + \x8F\xDB\xC2 |0 + \x8F\xDB\xC3 |0 + \x8F\xDB\xC4 |0 + \x8F\xDB\xC5 |0 + \x8F\xDB\xC6 |0 + \x8F\xDB\xC7 |0 + \xEA\xA6 |0 + \x8F\xDB\xC8 |0 + \xEA\xA5 |0 + \x8F\xDB\xC9 |0 + \x8F\xDB\xCA |0 + \xEA\xAE |0 + \x8F\xDB\xCB |0 + \x8F\xDB\xCC |0 + \x8F\xDB\xCD |0 + \xEA\xA8 |0 + \x8F\xDB\xCE |0 + \xEA\xB0 |0 + \x8F\xDB\xCF |0 + \xCD\xE6 |0 + \xEA\xB3 |0 + \xEA\xAA |0 + \x8F\xDB\xD0 |0 + \x8F\xDB\xD1 |0 + \xEA\xAB |0 + \x8F\xDB\xD2 |0 + \xEA\xAF |0 + \xEA\xB2 |0 + \xEA\xB1 |0 + \x8F\xDB\xD3 |0 + \x8F\xDB\xD4 |0 + \x8F\xDB\xD5 |0 + \xEA\xA9 |0 + \x8F\xDB\xD6 |0 + \xEA\xAC |0 + \xEA\xBD |0 + \x8F\xDB\xD7 |0 + \x8F\xDB\xD8 |0 + \x8F\xDB\xD9 |0 + \x8F\xDB\xDA |0 + \x8F\xDB\xDB |0 + \x8F\xDB\xDC |0 + \xEA\xB6 |0 + \x8F\xDB\xDD |0 + \x8F\xDB\xDE |0 + \x8F\xDB\xDF |0 + \x8F\xDB\xE0 |0 + \x8F\xDB\xE1 |0 + \xC0\xE6 |1 + \x8F\xDB\xE2 |0 + \xEA\xB4 |0 + \x8F\xDB\xE3 |0 + \xEA\xB5 |0 + \x8F\xDB\xE4 |0 + \xEA\xBA |0 + \xEA\xBB |0 + \x8F\xDB\xE5 |0 + \xB3\xAA |0 + \x8F\xDB\xE6 |0 + \xB5\xC2 |0 + \xEA\xB9 |0 + \x8F\xDB\xE7 |0 + \x8F\xDB\xE8 |0 + \x8F\xDB\xE9 |0 + \xEA\xA4 |0 + \x8F\xDB\xEA |0 + \x8F\xF4\xDC |0 + \x8F\xDB\xEB |0 + \x8F\xDB\xEC |0 + \x8F\xDB\xED |0 + \xEA\xB8 |0 + \xEA\xBC |0 + \xEA\xB7 |0 + \x8F\xDB\xEE |0 + \xEA\xBE |0 + \x8F\xDB\xF0 |0 + \x8F\xDB\xF1 |0 + \x8F\xDB\xF2 |0 + \xEA\xC0 |0 + \xEA\xBF |0 + \x8F\xDB\xF3 |0 + \x8F\xDB\xEF |0 + \x8F\xDB\xF4 |0 + \x8F\xDB\xF5 |0 + \x8F\xDB\xF6 |0 + \x8F\xDB\xF7 |0 + \x8F\xDB\xF8 |0 + \xEA\xC2 |0 + \xEA\xC1 |0 + \xE9\xDA |0 + \xEA\xC6 |0 + \x8F\xDB\xF9 |0 + \x8F\xDB\xFA |0 + \x8F\xDB\xFB |0 + \x8F\xDB\xFC |0 + \xEA\xC3 |0 + \x8F\xDB\xFD |0 + \x8F\xDB\xFE |0 + \xEA\xC4 |0 + \xEA\xC5 |0 + \x8F\xDC\xA1 |0 + \xEA\xC7 |0 + \x8F\xDC\xA2 |0 + \xB7\xEC |0 + \x8F\xDC\xA3 |0 + \xEA\xC9 |0 + \x8F\xDC\xA4 |0 + \xEA\xC8 |0 + \x8F\xDC\xA5 |0 + \xBD\xB0 |0 + \x8F\xDC\xA6 |0 + \x8F\xDC\xA7 |0 + \x8F\xDC\xA8 |0 + \x8F\xDC\xA9 |0 + \xB9\xD4 |0 + \xDE\xA7 |0 + \x8F\xDC\xAA |0 + \x8F\xDC\xAB |0 + \xEA\xCA |0 + \xBD\xD1 |0 + \x8F\xDC\xAC |0 + \x8F\xDC\xAD |0 + \xB3\xB9 |0 + \x8F\xDC\xAE |0 + \xEA\xCB |0 + \x8F\xDC\xAF |0 + \xB1\xD2 |0 + \x8F\xDC\xB0 |0 + \xBE\xD7 |0 + \xEA\xCC |0 + \x8F\xDC\xB1 |0 + \x8F\xDC\xB2 |0 + \xB9\xD5 |0 + \xEA\xCD |0 + \xB0\xE1 |0 + \x8F\xDC\xB3 |0 + \xC9\xBD |0 + \x8F\xDC\xB4 |0 + \xEA\xCE |0 + \xBF\xEA |0 + \x8F\xDC\xB5 |0 + \xEA\xD5 |0 + \xEA\xD2 |0 + \xC3\xEF |0 + \x8F\xDC\xB6 |0 + \x8F\xDC\xB7 |0 + \xEA\xD3 |0 + \xEA\xD0 |0 + \xB6\xDE |0 + \x8F\xDC\xB8 |0 + \xEA\xCF |0 + \xEA\xD6 |0 + \xB7\xB6 |0 + \xC2\xDE |0 + \xEA\xDC |0 + \xEA\xD8 |0 + \xC2\xB5 |0 + \xEA\xD7 |0 + \x8F\xDC\xB9 |0 + \xEA\xDA |0 + \x8F\xDC\xBA |0 + \x8F\xDC\xBB |0 + \x8F\xDC\xBC |0 + \xEA\xD1 |0 + \x8F\xDC\xBD |0 + \x8F\xDC\xBE |0 + \xEA\xDB |0 + \xEA\xDD |0 + \x8F\xDC\xBF |0 + \x8F\xDC\xC0 |0 + \xC8\xEF |0 + \xEA\xD9 |0 + \xEA\xDE |0 + \xEA\xE0 |0 + \xB8\xD3 |0 + \xEA\xD4 |0 + \xB0\xC1 |0 + \x8F\xDC\xC1 |0 + \x8F\xDC\xC2 |0 + \x8F\xDC\xC3 |0 + \xEA\xDF |0 + \x8F\xDC\xC4 |0 + \xBA\xDB |0 + \xCE\xF6 |0 + \xEA\xE1 |0 + \xEA\xE2 |0 + \xC1\xF5 |0 + \x8F\xDC\xC5 |0 + \x8F\xDC\xC6 |0 + \x8F\xDC\xC7 |0 + \x8F\xDC\xC8 |0 + \x8F\xDC\xC9 |0 + \xCE\xA2 |0 + \x8F\xDC\xCA |0 + \x8F\xDC\xCB |0 + \x8F\xDC\xCC |0 + \xEA\xE3 |0 + \xCD\xB5 |0 + \xEA\xE4 |0 + \xEA\xE5 |0 + \x8F\xDC\xCD |0 + \xCA\xE4 |0 + \xEA\xE6 |0 + \x8F\xDC\xCE |0 + \xBA\xC0 |0 + \xCE\xA3 |0 + \x8F\xDC\xCF |0 + \xEA\xEB |0 + \x8F\xDC\xD0 |0 + \x8F\xDC\xD1 |0 + \x8F\xDC\xD2 |0 + \xEA\xEC |0 + \xBE\xD8 |0 + \xEA\xEA |0 + \x8F\xDC\xD3 |0 + \x8F\xDC\xD4 |0 + \xCD\xE7 |0 + \xEA\xE7 |0 + \xEA\xE9 |0 + \xC0\xBD |0 + \xBF\xFE |0 + \x8F\xDC\xD5 |0 + \xEA\xE8 |0 + \xEA\xED |0 + \x8F\xDC\xD6 |0 + \xCA\xA3 |0 + \xEA\xEF |0 + \xEA\xEE |0 + \x8F\xDC\xD7 |0 + \x8F\xDC\xD8 |0 + \x8F\xDC\xD9 |0 + \xB3\xEC |0 + \xCB\xAB |0 + \xEA\xF0 |0 + \x8F\xDC\xDA |0 + \x8F\xDC\xDB |0 + \x8F\xDC\xDC |0 + \x8F\xDC\xDD |0 + \x8F\xDC\xDE |0 + \x8F\xDC\xDF |0 + \xEA\xFC |0 + \xEA\xF2 |0 + \x8F\xDC\xE0 |0 + \xEA\xF3 |0 + \x8F\xDC\xE1 |0 + \x8F\xDC\xE2 |0 + \x8F\xDC\xE3 |0 + \xEA\xF4 |0 + \xEA\xF5 |0 + \x8F\xDC\xE4 |0 + \x8F\xDC\xE5 |0 + \x8F\xDC\xE6 |0 + \x8F\xDC\xE7 |0 + \xEA\xF9 |0 + \xEA\xFA |0 + \x8F\xDC\xE8 |0 + \x8F\xDC\xE9 |0 + \xEA\xF8 |0 + \x8F\xDC\xEA |0 + \x8F\xDC\xEB |0 + \xEA\xF6 |0 + \x8F\xDC\xEC |0 + \xEA\xF1 |0 + \xEA\xF7 |0 + \x8F\xDC\xED |0 + \x8F\xDC\xEE |0 + \x8F\xDC\xEF |0 + \xEA\xFB |0 + \xF0\xB7 |0 + \x8F\xDC\xF0 |0 + \x8F\xDC\xF1 |0 + \xB2\xA8 |0 + \x8F\xDC\xF2 |0 + \x8F\xDC\xF3 |0 + \x8F\xDC\xF4 |0 + \x8F\xDC\xF5 |0 + \xEA\xFE |0 + \xB6\xDF |0 + \xEA\xFD |0 + \x8F\xDC\xF6 |0 + \x8F\xDC\xF7 |0 + \x8F\xDC\xF8 |0 + \xEB\xA2 |0 + \xEB\xA1 |0 + \xEB\xA4 |0 + \x8F\xDC\xF9 |0 + \xEB\xA3 |0 + \x8F\xDC\xFA |0 + \xEB\xA5 |0 + \x8F\xDC\xFB |0 + \xBD\xB1 |0 + \x8F\xDC\xFC |0 + \xEB\xA6 |0 + \x8F\xDC\xFD |0 + \xEB\xA7 |0 + \x8F\xDC\xFE |0 + \x8F\xDD\xA1 |0 + \x8F\xDD\xA2 |0 + \x8F\xDD\xA3 |0 + \xEB\xA8 |0 + \xC0\xBE |0 + \xCD\xD7 |0 + \xEB\xA9 |0 + \xCA\xA4 |0 + \xC7\xC6 |0 + \xEB\xAA |0 + \x8F\xDD\xA4 |0 + \xEB\xAB |0 + \xB8\xAB |0 + \x8F\xDD\xA5 |0 + \xB5\xAC |0 + \x8F\xDD\xA6 |0 + \xEB\xAC |0 + \x8F\xDD\xA7 |0 + \x8F\xDD\xA8 |0 + \xBB\xEB |0 + \xC7\xC1 |0 + \xEB\xAD |0 + \xB3\xD0 |0 + \x8F\xDD\xA9 |0 + \x8F\xDD\xAA |0 + \x8F\xDD\xAB |0 + \x8F\xDD\xAC |0 + \xEB\xAE |0 + \x8F\xDD\xAD |0 + \xEB\xB0 |0 + \xCD\xF7 |0 + \xEB\xAF |0 + \xBF\xC6 |0 + \xEB\xB1 |0 + \xEB\xB2 |0 + \x8F\xDD\xAE |0 + \xEB\xB3 |0 + \xB4\xD1 |0 + \x8F\xDD\xAF |0 + \x8F\xDD\xB0 |0 + \x8F\xDD\xB1 |0 + \x8F\xDD\xB2 |0 + \xEB\xB4 |0 + \x8F\xDD\xB3 |0 + \xEB\xB5 |0 + \xEB\xB6 |0 + \xEB\xB7 |0 + \xB3\xD1 |0 + \x8F\xDD\xB4 |0 + \x8F\xDD\xB5 |0 + \x8F\xDD\xB6 |0 + \x8F\xDD\xB7 |0 + \x8F\xDD\xB8 |0 + \xEB\xB8 |0 + \xEB\xB9 |0 + \xEB\xBA |0 + \xB2\xF2 |0 + \x8F\xDD\xB9 |0 + \xBF\xA8 |0 + \xEB\xBB |0 + \x8F\xDD\xBA |0 + \x8F\xDD\xBB |0 + \x8F\xDD\xBC |0 + \x8F\xDD\xBD |0 + \x8F\xDD\xBE |0 + \xEB\xBC |0 + \x8F\xDD\xBF |0 + \xEB\xBD |0 + \x8F\xDD\xC0 |0 + \x8F\xDD\xC1 |0 + \x8F\xDD\xC2 |0 + \xB8\xC0 |0 + \xC4\xFB |0 + \xEB\xBE |0 + \x8F\xDD\xC3 |0 + \x8F\xDD\xC4 |0 + \x8F\xDD\xC5 |0 + \xB7\xD7 |0 + \xBF\xD6 |0 + \xEB\xC1 |0 + \xC6\xA4 |0 + \x8F\xDD\xC6 |0 + \xEB\xC0 |0 + \x8F\xDD\xC7 |0 + \x8F\xDD\xC8 |0 + \xB7\xB1 |0 + \x8F\xDD\xC9 |0 + \x8F\xDD\xCA |0 + \xEB\xBF |0 + \xC2\xF7 |0 + \xB5\xAD |0 + \xEB\xC2 |0 + \xEB\xC3 |0 + \x8F\xDD\xCB |0 + \xBE\xD9 |0 + \x8F\xDD\xCC |0 + \x8F\xDD\xCD |0 + \xB7\xED |0 + \x8F\xDD\xCE |0 + \xEB\xC4 |0 + \x8F\xDD\xCF |0 + \xCB\xAC |0 + \x8F\xDD\xD0 |0 + \x8F\xDD\xD1 |0 + \xC0\xDF |0 + \x8F\xDD\xD2 |0 + \xB5\xF6 |0 + \xCC\xF5 |0 + \xC1\xCA |0 + \x8F\xDD\xD3 |0 + \xEB\xC5 |0 + \x8F\xDD\xD4 |0 + \xBF\xC7 |0 + \xC3\xF0 |0 + \xBE\xDA |0 + \x8F\xDD\xD5 |0 + \x8F\xDD\xD6 |0 + \x8F\xDD\xD7 |0 + \xEB\xC6 |0 + \x8F\xDD\xD8 |0 + \x8F\xDD\xD9 |0 + \xEB\xC9 |0 + \x8F\xDD\xDA |0 + \xEB\xCA |0 + \x8F\xDD\xDB |0 + \x8F\xDD\xDC |0 + \x8F\xDD\xDD |0 + \xBA\xBE |0 + \xC2\xC2 |0 + \xEB\xC8 |0 + \x8F\xDD\xDE |0 + \xBE\xDB |0 + \xC9\xBE |0 + \x8F\xDD\xDF |0 + \x8F\xDD\xE0 |0 + \x8F\xDD\xE1 |0 + \xEB\xC7 |0 + \x8F\xDD\xE2 |0 + \x8F\xDD\xE3 |0 + \xBB\xEC |0 + \xB1\xD3 |0 + \x8F\xDD\xE4 |0 + \xEB\xCE |0 + \xB7\xD8 |0 + \x8F\xDD\xE5 |0 + \xBB\xEE |0 + \x8F\xDD\xE6 |0 + \xBB\xED |0 + \xCF\xCD |0 + \xEB\xCD |0 + \xEB\xCC |0 + \xC1\xA7 |0 + \xB5\xCD |0 + \xCF\xC3 |0 + \xB3\xBA |0 + \xBE\xDC |0 + \x8F\xDD\xE7 |0 + \x8F\xDD\xE8 |0 + \x8F\xDD\xE9 |0 + \x8F\xDD\xEA |0 + \x8F\xDD\xEB |0 + \x8F\xDD\xEC |0 + \xEB\xCB |0 + \x8F\xDD\xED |0 + \x8F\xDD\xEE |0 + \x8F\xDD\xEF |0 + \xEB\xD0 |0 + \x8F\xDD\xF0 |0 + \xEB\xD1 |0 + \xEB\xCF |0 + \x8F\xDD\xF1 |0 + \xB8\xD8 |0 + \xCD\xC0 |0 + \x8F\xDD\xF2 |0 + \xBB\xEF |0 + \xC7\xA7 |0 + \x8F\xDD\xF3 |0 + \x8F\xDD\xF4 |0 + \xEB\xD4 |0 + \x8F\xDD\xF5 |0 + \xC0\xC0 |0 + \xC3\xC2 |0 + \x8F\xDD\xF6 |0 + \x8F\xDD\xF7 |0 + \xCD\xB6 |0 + \x8F\xDD\xF8 |0 + \xEB\xD7 |0 + \xB8\xEC |0 + \x8F\xDD\xF9 |0 + \xC0\xBF |0 + \xEB\xD3 |0 + \xEB\xD8 |0 + \xB8\xED |0 + \xEB\xD5 |0 + \xEB\xD6 |0 + \x8F\xDD\xFA |0 + \xEB\xD2 |0 + \x8F\xDD\xFB |0 + \xC0\xE2 |0 + \xC6\xC9 |0 + \x8F\xDD\xFC |0 + \x8F\xDD\xFD |0 + \xC3\xAF |0 + \xB2\xDD |0 + \x8F\xDD\xFE |0 + \x8F\xDE\xA1 |0 + \x8F\xDE\xA2 |0 + \xC8\xF0 |0 + \x8F\xDE\xA3 |0 + \xB5\xC3 |0 + \x8F\xDE\xA4 |0 + \xC4\xB4 |0 + \xEB\xDB |0 + \x8F\xDE\xA5 |0 + \xEB\xD9 |0 + \x8F\xDE\xA6 |0 + \xC3\xCC |0 + \x8F\xDE\xA7 |0 + \x8F\xDE\xA8 |0 + \x8F\xDE\xA9 |0 + \xC0\xC1 |0 + \xB4\xD2 |0 + \xEB\xDA |0 + \xBF\xDB |0 + \x8F\xDE\xAA |0 + \xCE\xCA |0 + \x8F\xDE\xAB |0 + \x8F\xDE\xAC |0 + \x8F\xDE\xAD |0 + \xCF\xC0 |0 + \x8F\xDE\xAE |0 + \xEB\xDC |0 + \xEB\xE7 |0 + \xC4\xB5 |0 + \x8F\xDE\xAF |0 + \xEB\xE6 |0 + \x8F\xDE\xB0 |0 + \xEB\xE3 |0 + \xEB\xEB |0 + \xEB\xE4 |0 + \xEB\xE0 |0 + \xC4\xFC |0 + \xEB\xDF |0 + \xEB\xDD |0 + \x8F\xDE\xB1 |0 + \xCD\xA1 |0 + \xBB\xF0 |0 + \x8F\xDE\xB2 |0 + \xEB\xE1 |0 + \xEB\xDE |0 + \x8F\xDE\xB3 |0 + \x8F\xDE\xB4 |0 + \x8F\xDE\xB5 |0 + \xEB\xE5 |0 + \xBD\xF4 |0 + \xB8\xC1 |0 + \x8F\xDE\xB6 |0 + \xC2\xFA |0 + \x8F\xDE\xB7 |0 + \xCB\xC5 |0 + \xB1\xDA |0 + \xB0\xE2 |0 + \xC6\xA5 |0 + \x8F\xDE\xB8 |0 + \x8F\xDE\xB9 |0 + \xEB\xE9 |0 + \x8F\xDE\xBF |0 + \x8F\xDE\xBA |0 + \xEB\xE8 |0 + \xC6\xE6 |0 + \xEB\xED |0 + \x8F\xDE\xBB |0 + \xEB\xE2 |0 + \xEB\xEC |0 + \xEB\xEE |0 + \xB8\xAC |0 + \xEB\xEA |0 + \xB9\xD6 |0 + \x8F\xDE\xBC |0 + \xBC\xD5 |0 + \x8F\xDE\xBD |0 + \x8F\xDE\xBE |0 + \xEB\xEF |0 + \xCD\xD8 |0 + \xEB\xF2 |0 + \xEB\xF5 |0 + \xEB\xF3 |0 + \xC9\xB5 |0 + \x8F\xDE\xC0 |0 + \x8F\xDE\xC1 |0 + \xEB\xF0 |0 + \x8F\xDE\xC2 |0 + \xB6\xE0 |0 + \x8F\xDE\xC3 |0 + \xEB\xF4 |0 + \xEB\xF6 |0 + \x8F\xDE\xC4 |0 + \x8F\xDE\xC5 |0 + \x8F\xDE\xC6 |0 + \x8F\xDE\xC7 |0 + \x8F\xDE\xC8 |0 + \x8F\xDE\xC9 |0 + \xEB\xFA |0 + \xEB\xF7 |0 + \x8F\xDE\xCE |0 + \xEB\xF9 |0 + \xEB\xF8 |0 + \x8F\xDE\xCA |0 + \x8F\xDE\xCB |0 + \x8F\xDE\xCC |0 + \xEB\xFB |0 + \xBC\xB1 |0 + \x8F\xDE\xCD |0 + \xEB\xFD |0 + \xEB\xFC |0 + \xC9\xE8 |0 + \x8F\xDE\xCF |0 + \xEC\xA1 |0 + \x8F\xDE\xD0 |0 + \xB7\xD9 |0 + \xEB\xFE |0 + \xEC\xA2 |0 + \x8F\xDE\xD1 |0 + \xEC\xA3 |0 + \xB5\xC4 |0 + \xE6\xC1 |0 + \xBE\xF9 |0 + \xEC\xA4 |0 + \x8F\xDE\xD2 |0 + \xB8\xEE |0 + \x8F\xDE\xD3 |0 + \x8F\xDE\xD4 |0 + \x8F\xDE\xD5 |0 + \xEC\xA5 |0 + \x8F\xDE\xD6 |0 + \x8F\xF4\xDF |0 + \xEC\xA6 |0 + \x8F\xDE\xD7 |0 + \xBB\xBE |0 + \x8F\xDE\xD8 |0 + \x8F\xDE\xD9 |0 + \xDA\xCE |0 + \x8F\xDE\xDA |0 + \xEC\xA7 |0 + \x8F\xDE\xDB |0 + \xEC\xA8 |0 + \x8F\xDE\xDC |0 + \xBD\xB2 |0 + \xEC\xA9 |0 + \xEC\xAA |0 + \x8F\xDE\xDD |0 + \x8F\xDE\xDE |0 + \xEC\xAB |0 + \xEC\xAC |0 + \xEC\xAD |0 + \x8F\xDE\xDF |0 + \x8F\xDE\xE0 |0 + \x8F\xDE\xE1 |0 + \xC3\xAB |0 + \x8F\xDE\xE2 |0 + \x8F\xDE\xE3 |0 + \xEC\xAE |0 + \x8F\xDE\xE4 |0 + \x8F\xDE\xE5 |0 + \xEC\xB0 |0 + \xEC\xAF |0 + \x8F\xDE\xE6 |0 + \xC6\xA6 |0 + \x8F\xDE\xE7 |0 + \xEC\xB1 |0 + \x8F\xDE\xE8 |0 + \xCB\xAD |0 + \x8F\xDE\xE9 |0 + \xEC\xB2 |0 + \xEC\xB3 |0 + \x8F\xDE\xEA |0 + \xEC\xB4 |0 + \x8F\xDE\xEB |0 + \x8F\xDE\xEC |0 + \x8F\xDE\xED |0 + \xEC\xB5 |0 + \x8F\xDE\xEE |0 + \x8F\xDE\xEF |0 + \x8F\xDE\xF2 |0 + \xC6\xDA |0 + \x8F\xDE\xF0 |0 + \x8F\xDE\xF1 |0 + \xBE\xDD |0 + \xEC\xB6 |0 + \x8F\xDE\xF3 |0 + \x8F\xDE\xF4 |0 + \x8F\xDE\xF5 |0 + \x8F\xDE\xF6 |0 + \x8F\xDE\xF7 |0 + \xB9\xEB |0 + \xD0\xAE |0 + \xEC\xB7 |0 + \x8F\xDE\xF8 |0 + \x8F\xDE\xF9 |0 + \x8F\xDE\xFA |0 + \x8F\xDE\xFB |0 + \xEC\xB8 |0 + \xC9\xBF |0 + \xEC\xB9 |0 + \x8F\xDE\xFC |0 + \xEC\xC1 |0 + \x8F\xDE\xFD |0 + \xEC\xBA |0 + \xEC\xBC |0 + \x8F\xDE\xFE |0 + \x8F\xDF\xA1 |0 + \xEC\xBB |0 + \xEC\xBD |0 + \x8F\xDF\xA2 |0 + \xCB\xC6 |0 + \xEC\xBE |0 + \xEC\xBF |0 + \x8F\xDF\xA3 |0 + \x8F\xDF\xA4 |0 + \x8F\xDF\xA5 |0 + \xEC\xC0 |0 + \xEC\xC2 |0 + \x8F\xDF\xA6 |0 + \x8F\xDF\xA7 |0 + \x8F\xDF\xA8 |0 + \xB3\xAD |0 + \xC4\xE7 |0 + \xC9\xE9 |0 + \xBA\xE2 |0 + \xB9\xD7 |0 + \x8F\xDF\xA9 |0 + \xC9\xCF |0 + \xB2\xDF |0 + \xC8\xCE |0 + \xEC\xC5 |0 + \xB4\xD3 |0 + \xC0\xD5 |0 + \xEC\xC4 |0 + \xEC\xC9 |0 + \xC3\xF9 |0 + \xCC\xE3 |0 + \xEC\xC7 |0 + \xEC\xC8 |0 + \xB5\xAE |0 + \xEC\xCA |0 + \xC7\xE3 |0 + \xC2\xDF |0 + \x8F\xDF\xAA |0 + \x8F\xDF\xAB |0 + \xC8\xF1 |0 + \xC5\xBD |0 + \xEC\xC6 |0 + \xCB\xC7 |0 + \xB2\xEC |0 + \xEC\xCC |0 + \xCF\xA8 |0 + \xC4\xC2 |0 + \xCF\xC5 |0 + \x8F\xDF\xAC |0 + \x8F\xDF\xAD |0 + \xBB\xF1 |0 + \xEC\xCB |0 + \x8F\xDF\xAE |0 + \xC2\xB1 |0 + \x8F\xDF\xAF |0 + \xEC\xDC |0 + \xC1\xA8 |0 + \x8F\xDF\xB0 |0 + \xC6\xF8 |0 + \xC9\xD0 |0 + \x8F\xDF\xB2 |0 + \x8F\xDF\xB1 |0 + \x8F\xDF\xB3 |0 + \xEC\xCF |0 + \xBB\xBF |0 + \xBB\xF2 |0 + \x8F\xDF\xB4 |0 + \xBE\xDE |0 + \xC7\xE5 |0 + \x8F\xDF\xB5 |0 + \xB8\xAD |0 + \xEC\xCE |0 + \xEC\xCD |0 + \xC9\xEA |0 + \x8F\xDF\xB6 |0 + \xBC\xC1 |0 + \x8F\xDF\xB7 |0 + \xC5\xD2 |0 + \x8F\xDF\xB8 |0 + \x8F\xDF\xB9 |0 + \x8F\xDF\xBA |0 + \x8F\xF4\xE0 |0 + \x8F\xDF\xBB |0 + \x8F\xDF\xBC |0 + \x8F\xDF\xBD |0 + \xEC\xD1 |0 + \xEC\xD2 |0 + \xB9\xD8 |0 + \xEC\xD0 |0 + \x8F\xDF\xBE |0 + \x8F\xDF\xBF |0 + \x8F\xDF\xC0 |0 + \x8F\xDF\xC1 |0 + \xEC\xD3 |0 + \xEC\xD4 |0 + \xEC\xD6 |0 + \xC2\xA3 |0 + \x8F\xDF\xC2 |0 + \xEC\xD5 |0 + \xB4\xE6 |0 + \xEC\xD8 |0 + \xEC\xD7 |0 + \xEC\xD9 |0 + \x8F\xDF\xC3 |0 + \xEC\xDB |0 + \xEC\xDD |0 + \xEC\xDE |0 + \x8F\xDF\xC4 |0 + \x8F\xDF\xC5 |0 + \xC0\xD6 |0 + \x8F\xDF\xC6 |0 + \xBC\xCF |0 + \xEC\xDF |0 + \x8F\xDF\xC7 |0 + \xB3\xD2 |0 + \x8F\xDF\xC8 |0 + \xEC\xE0 |0 + \x8F\xDF\xC9 |0 + \xC1\xF6 |0 + \xEC\xE1 |0 + \xEC\xE2 |0 + \xC9\xEB |0 + \x8F\xF4\xE1 |0 + \xB5\xAF |0 + \x8F\xDF\xCA |0 + \xEC\xE3 |0 + \x8F\xDF\xCB |0 + \x8F\xDF\xCC |0 + \xC4\xB6 |0 + \x8F\xDF\xCD |0 + \xB1\xDB |0 + \x8F\xDF\xCE |0 + \x8F\xDF\xCF |0 + \x8F\xDF\xD0 |0 + \x8F\xDF\xD1 |0 + \xEC\xE4 |0 + \x8F\xDF\xD2 |0 + \x8F\xDF\xD3 |0 + \x8F\xDF\xD4 |0 + \xBC\xF1 |0 + \x8F\xDF\xD5 |0 + \xBF\xF6 |0 + \x8F\xDF\xD6 |0 + \x8F\xDF\xD7 |0 + \x8F\xDF\xD8 |0 + \x8F\xDF\xD9 |0 + \xC2\xAD |0 + \x8F\xDF\xDA |0 + \x8F\xDF\xDB |0 + \x8F\xDF\xDC |0 + \xEC\xE7 |0 + \x8F\xDF\xDD |0 + \x8F\xDF\xEF |0 + \xEC\xE6 |0 + \x8F\xDF\xDE |0 + \xEC\xE5 |0 + \x8F\xDF\xDF |0 + \x8F\xDF\xE0 |0 + \x8F\xDF\xE1 |0 + \x8F\xDF\xE2 |0 + \x8F\xDF\xE3 |0 + \xEC\xED |0 + \xEC\xEB |0 + \x8F\xDF\xE4 |0 + \xEC\xE8 |0 + \x8F\xDF\xE5 |0 + \x8F\xDF\xE6 |0 + \x8F\xDF\xE7 |0 + \xEC\xEA |0 + \x8F\xDF\xE8 |0 + \x8F\xDF\xE9 |0 + \xEC\xE9 |0 + \xEC\xEC |0 + \xB5\xF7 |0 + \xEC\xF0 |0 + \xC0\xD7 |0 + \xEC\xF1 |0 + \x8F\xDF\xEA |0 + \x8F\xDF\xEB |0 + \x8F\xDF\xEC |0 + \xB8\xD9 |0 + \xEC\xEE |0 + \xEC\xEF |0 + \x8F\xDF\xED |0 + \xCF\xA9 |0 + \x8F\xDF\xEE |0 + \x8F\xDF\xF0 |0 + \x8F\xDF\xF1 |0 + \xC4\xB7 |0 + \x8F\xDF\xF2 |0 + \xC1\xA9 |0 + \xEC\xF2 |0 + \x8F\xDF\xF3 |0 + \xEC\xF5 |0 + \x8F\xDF\xF4 |0 + \x8F\xDF\xF5 |0 + \x8F\xDF\xF6 |0 + \x8F\xDF\xF7 |0 + \xEC\xF3 |0 + \xEC\xF4 |0 + \xCD\xD9 |0 + \x8F\xDF\xF8 |0 + \xC6\xA7 |0 + \xEC\xF8 |0 + \x8F\xDF\xF9 |0 + \x8F\xDF\xFA |0 + \x8F\xDF\xFB |0 + \xEC\xF6 |0 + \xEC\xF7 |0 + \xEC\xF9 |0 + \x8F\xDF\xFC |0 + \x8F\xDF\xFD |0 + \x8F\xDF\xFE |0 + \x8F\xE0\xA1 |0 + \x8F\xE0\xA2 |0 + \x8F\xE0\xA3 |0 + \xED\xA9 |0 + \xEC\xFC |0 + \x8F\xE0\xA4 |0 + \x8F\xE0\xA5 |0 + \xEC\xFD |0 + \xEC\xFB |0 + \x8F\xE0\xA6 |0 + \x8F\xE0\xA7 |0 + \x8F\xE0\xA8 |0 + \x8F\xE0\xA9 |0 + \x8F\xE0\xAA |0 + \x8F\xE0\xAB |0 + \x8F\xE0\xAC |0 + \xEC\xFA |0 + \xC4\xFD |0 + \xED\xA1 |0 + \xED\xA5 |0 + \xED\xA2 |0 + \xEC\xFE |0 + \x8F\xE0\xAD |0 + \xED\xA3 |0 + \x8F\xE0\xAE |0 + \x8F\xE0\xAF |0 + \x8F\xE0\xB0 |0 + \xED\xA4 |0 + \x8F\xE0\xB1 |0 + \xED\xAB |0 + \xED\xA6 |0 + \x8F\xE0\xB2 |0 + \x8F\xE0\xB3 |0 + \x8F\xE0\xB4 |0 + \x8F\xE0\xB5 |0 + \xC0\xD8 |0 + \xED\xA8 |0 + \x8F\xE0\xB6 |0 + \x8F\xE0\xB7 |0 + \xED\xAA |0 + \xED\xA7 |0 + \x8F\xE0\xB8 |0 + \x8F\xE0\xB9 |0 + \x8F\xE0\xBA |0 + \x8F\xE0\xBB |0 + \x8F\xE0\xBC |0 + \x8F\xE0\xBD |0 + \xED\xAD |0 + \xBD\xB3 |0 + \xED\xAC |0 + \x8F\xE0\xBE |0 + \x8F\xE0\xBF |0 + \x8F\xE0\xC0 |0 + \xED\xAE |0 + \xED\xAF |0 + \x8F\xE0\xC1 |0 + \x8F\xE0\xC2 |0 + \xED\xB2 |0 + \xED\xB1 |0 + \xED\xB0 |0 + \x8F\xE0\xC3 |0 + \xED\xB4 |0 + \xED\xB3 |0 + \xCC\xF6 |0 + \x8F\xE0\xC4 |0 + \xED\xB6 |0 + \x8F\xE0\xC5 |0 + \xED\xB5 |0 + \xED\xB7 |0 + \x8F\xE0\xC6 |0 + \xED\xB8 |0 + \x8F\xE0\xC7 |0 + \x8F\xE0\xC8 |0 + \x8F\xE0\xC9 |0 + \x8F\xE0\xCA |0 + \xED\xBA |0 + \x8F\xE0\xCB |0 + \x8F\xE0\xCC |0 + \x8F\xE0\xCD |0 + \xED\xB9 |0 + \xBF\xC8 |0 + \xED\xBB |0 + \x8F\xE0\xCE |0 + \x8F\xE0\xCF |0 + \xB6\xED |0 + \xED\xBC |0 + \xED\xBE |0 + \x8F\xE0\xD0 |0 + \x8F\xE0\xD1 |0 + \x8F\xE0\xD2 |0 + \x8F\xE0\xD3 |0 + \xED\xBF |0 + \x8F\xE0\xD4 |0 + \x8F\xE0\xD5 |0 + \x8F\xE0\xD6 |0 + \x8F\xE0\xD7 |0 + \xED\xC0 |0 + \xED\xBD |0 + \x8F\xE0\xD8 |0 + \xED\xC1 |0 + \xBC\xD6 |0 + \xED\xC2 |0 + \xB5\xB0 |0 + \xB7\xB3 |0 + \x8F\xE0\xD9 |0 + \x8F\xE0\xDA |0 + \xB8\xAE |0 + \x8F\xE0\xDB |0 + \xED\xC3 |0 + \x8F\xE0\xDC |0 + \xC6\xF0 |0 + \xC5\xBE |0 + \xED\xC4 |0 + \x8F\xE0\xDD |0 + \xED\xC7 |0 + \x8F\xE0\xE4 |0 + \x8F\xE0\xDE |0 + \x8F\xE0\xDF |0 + \x8F\xE0\xE0 |0 + \x8F\xE0\xE1 |0 + \xBC\xB4 |0 + \x8F\xE0\xE2 |0 + \x8F\xE0\xE3 |0 + \xED\xC6 |0 + \xED\xC5 |0 + \xB7\xDA |0 + \xED\xC8 |0 + \x8F\xE0\xE5 |0 + \x8F\xE0\xE6 |0 + \xB3\xD3 |0 + \xED\xCA |0 + \x8F\xE0\xE7 |0 + \x8F\xE0\xE8 |0 + \xBA\xDC |0 + \xED\xC9 |0 + \xED\xD2 |0 + \x8F\xE0\xE9 |0 + \x8F\xE0\xEA |0 + \xED\xCC |0 + \xED\xCE |0 + \xCA\xE5 |0 + \xED\xCB |0 + \x8F\xE0\xEB |0 + \x8F\xE0\xEC |0 + \x8F\xE0\xED |0 + \xED\xCD |0 + \xED\xD1 |0 + \xED\xCF |0 + \xB5\xB1 |0 + \x8F\xE0\xEE |0 + \xED\xD0 |0 + \x8F\xE0\xEF |0 + \x8F\xE0\xF0 |0 + \x8F\xE0\xF1 |0 + \x8F\xE0\xF2 |0 + \xED\xD3 |0 + \x8F\xE0\xF3 |0 + \x8F\xE0\xF4 |0 + \xC7\xDA |0 + \xCE\xD8 |0 + \x8F\xE0\xF5 |0 + \x8F\xE0\xF6 |0 + \x8F\xE0\xF7 |0 + \xBD\xB4 |0 + \xED\xD4 |0 + \x8F\xE0\xF8 |0 + \x8F\xE0\xF9 |0 + \x8F\xE0\xFA |0 + \x8F\xE0\xFB |0 + \xCD\xA2 |0 + \xED\xD6 |0 + \x8F\xE0\xFC |0 + \xED\xD5 |0 + \xED\xD9 |0 + \xCD\xC1 |0 + \x8F\xE0\xFD |0 + \x8F\xE0\xFE |0 + \xED\xD8 |0 + \x8F\xE1\xA1 |0 + \xB3\xED |0 + \xED\xD7 |0 + \xED\xDC |0 + \x8F\xE1\xA2 |0 + \xED\xDB |0 + \xED\xDA |0 + \xC5\xB2 |0 + \xED\xDD |0 + \x8F\xE1\xA3 |0 + \x8F\xE1\xA4 |0 + \x8F\xE1\xA5 |0 + \x8F\xE1\xA6 |0 + \x8F\xE1\xA7 |0 + \x8F\xE1\xA8 |0 + \xED\xDE |0 + \x8F\xE1\xA9 |0 + \xED\xDF |0 + \x8F\xE1\xAA |0 + \x8F\xE1\xAB |0 + \xB9\xEC |0 + \xB7\xA5 |0 + \xED\xE0 |0 + \xED\xE1 |0 + \xED\xE2 |0 + \x8F\xE1\xAC |0 + \xBF\xC9 |0 + \xED\xE3 |0 + \x8F\xE1\xAD |0 + \xBC\xAD |0 + \xED\xE4 |0 + \x8F\xE1\xAE |0 + \x8F\xE1\xAF |0 + \xED\xE5 |0 + \x8F\xE1\xB0 |0 + \x8F\xE1\xB1 |0 + \x8F\xE1\xB2 |0 + \xD2\xA1 |0 + \xD1\xFE |0 + \xED\xE6 |0 + \xE5\xF0 |0 + \xED\xE7 |0 + \xC3\xA4 |0 + \xBF\xAB |0 + \xC7\xC0 |0 + \x8F\xE1\xB3 |0 + \x8F\xE1\xB4 |0 + \xED\xE8 |0 + \x8F\xE1\xB5 |0 + \xCA\xD5 |0 + \xC4\xD4 |0 + \xB9\xFE |0 + \x8F\xE1\xB6 |0 + \xC3\xA9 |0 + \x8F\xE1\xB7 |0 + \x8F\xE1\xB8 |0 + \xB1\xAA |0 + \xCB\xF8 |0 + \xBF\xD7 |0 + \x8F\xE1\xB9 |0 + \x8F\xE1\xBA |0 + \x8F\xE1\xBB |0 + \x8F\xE1\xBC |0 + \xB7\xDE |0 + \x8F\xE1\xBD |0 + \xB6\xE1 |0 + \x8F\xE1\xBE |0 + \x8F\xE1\xBF |0 + \xCA\xD6 |0 + \x8F\xE1\xC0 |0 + \xED\xE9 |0 + \x8F\xE1\xC1 |0 + \xED\xEB |0 + \x8F\xE1\xC2 |0 + \x8F\xE1\xC3 |0 + \xED\xEA |0 + \xB2\xE0 |0 + \x8F\xE1\xC4 |0 + \xC6\xF6 |0 + \xED\xEC |0 + \xC7\xF7 |0 + \xC5\xB3 |0 + \x8F\xE1\xC5 |0 + \xED\xED |0 + \xBD\xD2 |0 + \x8F\xE1\xC6 |0 + \xED\xEF |0 + \x8F\xE1\xC7 |0 + \x8F\xE1\xC8 |0 + \xCC\xC2 |0 + \xED\xFE |0 + \xED\xF1 |0 + \xED\xF2 |0 + \x8F\xE1\xC9 |0 + \xC4\xC9 |0 + \x8F\xE1\xCA |0 + \xC2\xE0 |0 + \xC1\xF7 |0 + \x8F\xE1\xCB |0 + \xC6\xA8 |0 + \x8F\xE1\xCC |0 + \xED\xF0 |0 + \xB5\xD5 |0 + \x8F\xE1\xCD |0 + \xED\xF9 |0 + \x8F\xE1\xCE |0 + \xED\xF6 |0 + \xEE\xA5 |0 + \xC6\xA9 |0 + \xC3\xE0 |0 + \xED\xF3 |0 + \xC4\xFE |0 + \xC5\xD3 |0 + \xED\xF4 |0 + \xED\xF8 |0 + \xBF\xE0 |0 + \x8F\xE1\xCF |0 + \xC7\xE7 |0 + \xC4\xCC |0 + \x8F\xE1\xD0 |0 + \xC0\xC2 |0 + \xED\xF7 |0 + \xC2\xAE |0 + \xC2\xA4 |0 + \xED\xF5 |0 + \xB0\xA9 |0 + \xCF\xA2 |0 + \xED\xFA |0 + \x8F\xE1\xD1 |0 + \x8F\xE1\xD2 |0 + \x8F\xE1\xD4 |0 + \x8F\xE1\xD5 |0 + \x8F\xE1\xD6 |0 + \xC2\xE1 |0 + \x8F\xE1\xD3 |0 + \xBD\xB5 |0 + \xBF\xCA |0 + \x8F\xE1\xD7 |0 + \x8F\xE1\xD8 |0 + \xED\xFC |0 + \xED\xFB |0 + \x8F\xE1\xD9 |0 + \xB0\xEF |0 + \xED\xFD |0 + \xC9\xAF |0 + \xEE\xA7 |0 + \x8F\xE1\xDA |0 + \xC6\xDB |0 + \xBF\xEB |0 + \x8F\xE1\xDB |0 + \x8F\xE1\xDC |0 + \xC3\xD9 |0 + \xB6\xF8 |0 + \xEE\xA6 |0 + \xCD\xB7 |0 + \xB1\xBF |0 + \x8F\xE1\xDD |0 + \xCA\xD7 |0 + \xB2\xE1 |0 + \xEE\xA1 |0 + \xEE\xA2 |0 + \xEE\xA3 |0 + \xEE\xA4 |0 + \xC6\xBB |0 + \xC3\xA3 |0 + \xB0\xE3 |0 + \xEE\xA8 |0 + \xEE\xA9 |0 + \xF4\xA3 |0 + \x8F\xE1\xDE |0 + \xC2\xBD |0 + \x8F\xE1\xDF |0 + \xEE\xAA |0 + \xB1\xF3 |0 + \xC1\xCC |0 + \x8F\xE1\xE0 |0 + \xB8\xAF |0 + \xCD\xDA |0 + \x8F\xE1\xE1 |0 + \x8F\xE1\xE2 |0 + \xEE\xAB |0 + \xC5\xAC |0 + \x8F\xE1\xE3 |0 + \xC1\xF8 |0 + \xBC\xD7 |0 + \xEE\xAC |0 + \x8F\xE1\xE4 |0 + \xEE\xAF |0 + \x8F\xE1\xE5 |0 + \xBD\xE5 |0 + \xEE\xAD |0 + \xC1\xAB |0 + \xC1\xAA |0 + \x8F\xE1\xE6 |0 + \xB0\xE4 |0 + \xCE\xCB |0 + \xEE\xB1 |0 + \xC8\xF2 |0 + \xEE\xB3 |0 + \xEE\xB2 |0 + \xEE\xB0 |0 + \xE3\xE4 |0 + \xB4\xD4 |0 + \x8F\xE1\xE7 |0 + \xED\xEE |0 + \x8F\xE1\xE8 |0 + \xEE\xB5 |0 + \xEE\xB4 |0 + \x8F\xE1\xE9 |0 + \x8F\xE1\xEA |0 + \x8F\xE1\xEB |0 + \xEE\xB6 |0 + \x8F\xE1\xEC |0 + \xCD\xB8 |0 + \x8F\xE1\xED |0 + \x8F\xE1\xEE |0 + \x8F\xE1\xEF |0 + \x8F\xE1\xF0 |0 + \x8F\xE1\xF1 |0 + \x8F\xE1\xF2 |0 + \x8F\xE1\xF3 |0 + \x8F\xE1\xF4 |0 + \xC6\xE1 |0 + \x8F\xE1\xF5 |0 + \xCB\xAE |0 + \xEE\xB7 |0 + \xBC\xD9 |0 + \xEE\xB8 |0 + \x8F\xE1\xF6 |0 + \xEE\xB9 |0 + \x8F\xE1\xF7 |0 + \x8F\xE1\xF8 |0 + \x8F\xE1\xF9 |0 + \xEE\xBA |0 + \x8F\xE1\xFA |0 + \xC5\xA1 |0 + \x8F\xE1\xFB |0 + \x8F\xE1\xFD |0 + \xB0\xEA |0 + \x8F\xE1\xFE |0 + \x8F\xE2\xA1 |0 + \x8F\xE2\xA2 |0 + \x8F\xE2\xA3 |0 + \x8F\xE2\xA4 |0 + \xB9\xD9 |0 + \x8F\xE1\xFC |0 + \xCF\xBA |0 + \x8F\xE2\xAD |0 + \x8F\xE2\xA5 |0 + \x8F\xE2\xA6 |0 + \x8F\xE2\xA7 |0 + \x8F\xE2\xA8 |0 + \xEE\xBE |0 + \x8F\xE2\xA9 |0 + \x8F\xE2\xAA |0 + \x8F\xF4\xE5 |0 + \x8F\xE2\xAB |0 + \xB7\xB4 |0 + \xEE\xBB |0 + \xEE\xBC |0 + \x8F\xE2\xAC |0 + \xC9\xF4 |0 + \x8F\xE2\xAF |0 + \xB3\xD4 |0 + \x8F\xE2\xB0 |0 + \x8F\xE2\xB1 |0 + \x8F\xE2\xB2 |0 + \xCD\xB9 |0 + \x8F\xE2\xAE |0 + \xB6\xBF |0 + \xC5\xD4 |0 + \x8F\xE2\xB3 |0 + \x8F\xE2\xB4 |0 + \x8F\xE2\xB5 |0 + \xEE\xBF |0 + \x8F\xE2\xB6 |0 + \x8F\xE2\xB7 |0 + \x8F\xE2\xB8 |0 + \x8F\xE2\xB9 |0 + \x8F\xE2\xBA |0 + \x8F\xE2\xBB |0 + \xEE\xC0 |0 + \x8F\xE2\xBC |0 + \x8F\xF4\xE7 |0 + \x8F\xE2\xBD |0 + \x8F\xE2\xBE |0 + \x8F\xE2\xBF |0 + \xEE\xC1 |0 + \x8F\xE2\xC0 |0 + \x8F\xE2\xC1 |0 + \x8F\xE2\xC2 |0 + \x8F\xE2\xC3 |0 + \x8F\xE2\xC5 |0 + \x8F\xE2\xC6 |0 + \x8F\xE2\xC4 |0 + \x8F\xE2\xC7 |0 + \x8F\xE2\xC8 |0 + \xC5\xA2 |0 + \x8F\xE2\xC9 |0 + \x8F\xE2\xCA |0 + \xEE\xC3 |0 + \x8F\xE2\xCB |0 + \xEE\xC2 |0 + \x8F\xE2\xCC |0 + \x8F\xE2\xCD |0 + \x8F\xE2\xCE |0 + \x8F\xE2\xCF |0 + \x8F\xE2\xD0 |0 + \x8F\xE2\xD1 |0 + \x8F\xE2\xD2 |0 + \x8F\xE2\xD3 |0 + \x8F\xE2\xD4 |0 + \x8F\xE2\xD5 |0 + \xC6\xD3 |0 + \xEE\xC4 |0 + \xBD\xB6 |0 + \xBC\xE0 |0 + \xC7\xDB |0 + \xC3\xF1 |0 + \x8F\xE2\xD6 |0 + \xBC\xF2 |0 + \x8F\xE2\xD7 |0 + \xBF\xEC |0 + \xEE\xC5 |0 + \x8F\xE2\xD8 |0 + \xEE\xC6 |0 + \x8F\xE2\xD9 |0 + \x8F\xE2\xDA |0 + \x8F\xE2\xDB |0 + \x8F\xE2\xDC |0 + \xBF\xDD |0 + \xEE\xC7 |0 + \x8F\xE2\xDD |0 + \xEE\xC8 |0 + \x8F\xE2\xDE |0 + \xEE\xC9 |0 + \xCD\xEF |0 + \xBD\xB7 |0 + \x8F\xE2\xDF |0 + \xEE\xCB |0 + \xEE\xCA |0 + \x8F\xE2\xE0 |0 + \xB9\xDA |0 + \xB9\xF3 |0 + \xBB\xC0 |0 + \x8F\xE2\xE1 |0 + \x8F\xE2\xE2 |0 + \x8F\xE2\xE3 |0 + \x8F\xE2\xE4 |0 + \xEE\xCE |0 + \x8F\xE2\xE5 |0 + \x8F\xE2\xE6 |0 + \x8F\xE2\xE7 |0 + \xBD\xE6 |0 + \xEE\xCD |0 + \x8F\xE2\xE8 |0 + \xEE\xCC |0 + \xC2\xE9 |0 + \x8F\xE2\xE9 |0 + \xB8\xEF |0 + \x8F\xE2\xEA |0 + \xC0\xC3 |0 + \x8F\xE2\xEB |0 + \x8F\xE2\xEC |0 + \x8F\xE2\xED |0 + \xC8\xB0 |0 + \x8F\xE2\xEE |0 + \xBD\xB9 |0 + \x8F\xE2\xEF |0 + \x8F\xE2\xF0 |0 + \xEE\xCF |0 + \xBE\xDF |0 + \x8F\xE2\xF1 |0 + \x8F\xE2\xF2 |0 + \xEE\xD2 |0 + \xEE\xD0 |0 + \x8F\xE2\xF3 |0 + \x8F\xE2\xF4 |0 + \x8F\xE2\xF5 |0 + \xEE\xD1 |0 + \x8F\xE2\xF6 |0 + \x8F\xE2\xF7 |0 + \x8F\xE2\xF8 |0 + \x8F\xE2\xF9 |0 + \xEE\xD4 |0 + \xEE\xD3 |0 + \x8F\xE2\xFA |0 + \xBE\xFA |0 + \xEE\xD5 |0 + \x8F\xE2\xFB |0 + \x8F\xE2\xFC |0 + \x8F\xE2\xFD |0 + \x8F\xE2\xFE |0 + \xEE\xD6 |0 + \xEE\xD7 |0 + \x8F\xE3\xA1 |0 + \x8F\xE3\xA2 |0 + \x8F\xE3\xA3 |0 + \xC8\xD0 |0 + \xBA\xD3 |0 + \xBC\xE1 |0 + \xEE\xD8 |0 + \xEE\xD9 |0 + \xCE\xA4 |0 + \xBD\xC5 |0 + \xCC\xEE |0 + \xCE\xCC |0 + \xEE\xDA |0 + \xB6\xE2 |0 + \x8F\xE3\xA4 |0 + \x8F\xE3\xA5 |0 + \xEE\xDB |0 + \x8F\xE3\xA6 |0 + \xC5\xA3 |0 + \x8F\xE3\xA7 |0 + \x8F\xE3\xA8 |0 + \xEE\xDE |0 + \xB3\xF8 |0 + \xBF\xCB |0 + \x8F\xE3\xA9 |0 + \xEE\xDC |0 + \xEE\xDD |0 + \xC4\xE0 |0 + \x8F\xE3\xAA |0 + \x8F\xE3\xAB |0 + \xCB\xD5 |0 + \xB6\xFC |0 + \x8F\xE3\xAC |0 + \x8F\xE3\xAD |0 + \x8F\xE3\xAE |0 + \x8F\xE3\xAF |0 + \x8F\xE3\xB0 |0 + \x8F\xE3\xB1 |0 + \x8F\xE3\xB2 |0 + \x8F\xE3\xB3 |0 + \xEE\xE0 |0 + \xEE\xE1 |0 + \x8F\xE3\xB4 |0 + \x8F\xE3\xB5 |0 + \x8F\xE3\xB6 |0 + \xEE\xDF |0 + \x8F\xE3\xB7 |0 + \xEE\xE3 |0 + \x8F\xE3\xB8 |0 + \x8F\xE3\xB9 |0 + \x8F\xE3\xBA |0 + \x8F\xE3\xBB |0 + \x8F\xE3\xBC |0 + \x8F\xE3\xBD |0 + \x8F\xE3\xBE |0 + \x8F\xE3\xBF |0 + \x8F\xE3\xC0 |0 + \xC6\xDF |0 + \xB3\xC3 |0 + \x8F\xE3\xC1 |0 + \xEE\xE7 |0 + \x8F\xE3\xC2 |0 + \x8F\xE3\xC3 |0 + \xEE\xE4 |0 + \xEE\xE6 |0 + \x8F\xE3\xC4 |0 + \x8F\xE3\xC5 |0 + \x8F\xE3\xC6 |0 + \x8F\xE3\xC7 |0 + \xEE\xE2 |0 + \x8F\xE3\xC8 |0 + \x8F\xE3\xC9 |0 + \x8F\xE3\xCA |0 + \x8F\xE3\xCB |0 + \x8F\xE3\xCC |0 + \xEF\xCF |0 + \xEE\xE5 |0 + \x8F\xE3\xCD |0 + \x8F\xE3\xCE |0 + \x8F\xE3\xCF |0 + \x8F\xE3\xD0 |0 + \xCE\xEB |0 + \x8F\xE3\xD1 |0 + \x8F\xE3\xD2 |0 + \xB8\xDA |0 + \x8F\xE3\xD3 |0 + \x8F\xE3\xD4 |0 + \x8F\xE3\xD5 |0 + \x8F\xE3\xD6 |0 + \x8F\xE3\xD7 |0 + \xEE\xEF |0 + \x8F\xE3\xD8 |0 + \x8F\xE3\xD9 |0 + \x8F\xE3\xDA |0 + \xC5\xB4 |0 + \xEE\xEA |0 + \x8F\xE3\xDB |0 + \x8F\xE3\xDC |0 + \xEE\xED |0 + \xEE\xEB |0 + \x8F\xE3\xDD |0 + \xEE\xF0 |0 + \x8F\xE3\xDE |0 + \x8F\xE3\xDF |0 + \x8F\xE3\xE0 |0 + \xEE\xF1 |0 + \x8F\xE3\xE1 |0 + \xEE\xE9 |0 + \x8F\xE3\xE2 |0 + \x8F\xE3\xE3 |0 + \xEE\xF6 |0 + \xB1\xF4 |0 + \x8F\xE3\xE4 |0 + \x8F\xE3\xE5 |0 + \xEE\xE8 |0 + \x8F\xE3\xE6 |0 + \x8F\xE3\xE7 |0 + \xC8\xAD |0 + \xEE\xEC |0 + \x8F\xE3\xE8 |0 + \xBE\xE0 |0 + \x8F\xE3\xE9 |0 + \x8F\xE3\xEA |0 + \x8F\xE3\xEB |0 + \x8F\xE3\xEC |0 + \x8F\xE3\xED |0 + \x8F\xE3\xEE |0 + \xB9\xDB |0 + \x8F\xE3\xEF |0 + \x8F\xE3\xF0 |0 + \x8F\xE3\xF1 |0 + \x8F\xE3\xF2 |0 + \x8F\xE3\xF3 |0 + \x8F\xE3\xF4 |0 + \x8F\xE3\xF5 |0 + \x8F\xE3\xF6 |0 + \xCB\xC8 |0 + \x8F\xE3\xF7 |0 + \xB6\xE4 |0 + \xBD\xC6 |0 + \xC6\xBC |0 + \x8F\xE3\xF8 |0 + \x8F\xE3\xF9 |0 + \x8F\xE3\xFA |0 + \x8F\xE3\xFB |0 + \x8F\xE3\xFC |0 + \xC1\xAD |0 + \x8F\xE3\xFD |0 + \xEE\xF4 |0 + \xEE\xEE |0 + \xEE\xF3 |0 + \x8F\xE3\xFE |0 + \xCC\xC3 |0 + \x8F\xE4\xA1 |0 + \xC4\xB8 |0 + \xEE\xF5 |0 + \xEE\xF2 |0 + \x8F\xE4\xA2 |0 + \x8F\xE4\xA3 |0 + \x8F\xE4\xA4 |0 + \x8F\xE4\xA5 |0 + \x8F\xE4\xA6 |0 + \x8F\xE4\xA7 |0 + \x8F\xE4\xA8 |0 + \xC1\xAC |0 + \x8F\xE4\xA9 |0 + \x8F\xE4\xAA |0 + \x8F\xE4\xAB |0 + \xEE\xF9 |0 + \x8F\xE4\xAC |0 + \xEE\xF8 |0 + \x8F\xE4\xAD |0 + \x8F\xE4\xAE |0 + \x8F\xE4\xAF |0 + \x8F\xE4\xB0 |0 + \x8F\xE4\xB1 |0 + \x8F\xE4\xB2 |0 + \x8F\xE4\xB3 |0 + \x8F\xE4\xB4 |0 + \x8F\xE4\xB5 |0 + \x8F\xE4\xB6 |0 + \x8F\xE4\xB7 |0 + \x8F\xE4\xB8 |0 + \x8F\xE4\xB9 |0 + \x8F\xE4\xBA |0 + \x8F\xE4\xBB |0 + \x8F\xE4\xBC |0 + \x8F\xE4\xBD |0 + \xEE\xF7 |0 + \x8F\xE4\xBE |0 + \xCB\xAF |0 + \x8F\xE4\xBF |0 + \x8F\xE4\xC0 |0 + \x8F\xE4\xC1 |0 + \x8F\xE4\xC2 |0 + \x8F\xE4\xC3 |0 + \x8F\xE4\xC4 |0 + \x8F\xE4\xC5 |0 + \x8F\xE4\xC6 |0 + \x8F\xE4\xC7 |0 + \x8F\xE4\xC8 |0 + \x8F\xE4\xC9 |0 + \xBD\xFB |0 + \x8F\xE4\xCA |0 + \x8F\xE4\xCB |0 + \x8F\xE4\xCC |0 + \xEE\xFA |0 + \xCA\xDF |0 + \x8F\xE4\xCD |0 + \xB1\xD4 |0 + \x8F\xE4\xCE |0 + \x8F\xE4\xCF |0 + \xC9\xC6 |0 + \xC3\xF2 |0 + \xB5\xF8 |0 + \x8F\xE4\xD0 |0 + \xEE\xFC |0 + \x8F\xE4\xD1 |0 + \xB9\xDD |0 + \x8F\xE4\xD2 |0 + \x8F\xE4\xD3 |0 + \x8F\xE4\xD4 |0 + \xBB\xAC |0 + \x8F\xE4\xD5 |0 + \x8F\xE4\xD6 |0 + \xEE\xFB |0 + \xBF\xED |0 + \x8F\xE4\xD7 |0 + \x8F\xE4\xD8 |0 + \x8F\xE4\xD9 |0 + \xBF\xEE |0 + \xEF\xA1 |0 + \xEF\xA3 |0 + \x8F\xE4\xDA |0 + \x8F\xE4\xDB |0 + \x8F\xE4\xDC |0 + \x8F\xE4\xDD |0 + \xBE\xFB |0 + \x8F\xE4\xDE |0 + \xEF\xA2 |0 + \xEF\xA4 |0 + \x8F\xE4\xDF |0 + \x8F\xE4\xE0 |0 + \xB6\xD3 |0 + \x8F\xE4\xE1 |0 + \xC9\xC5 |0 + \x8F\xE4\xE2 |0 + \x8F\xE4\xE3 |0 + \xBC\xE2 |0 + \xCF\xA3 |0 + \xEE\xFE |0 + \xBA\xF8 |0 + \xCF\xBF |0 + \x8F\xE4\xE4 |0 + \x8F\xE4\xE5 |0 + \xEF\xA6 |0 + \x8F\xE4\xE6 |0 + \x8F\xE4\xE7 |0 + \xEF\xA5 |0 + \xEF\xA7 |0 + \xEE\xFD |0 + \x8F\xE4\xE8 |0 + \x8F\xE4\xE9 |0 + \x8F\xE4\xEA |0 + \xC6\xE9 |0 + \xC5\xD5 |0 + \x8F\xE4\xEB |0 + \x8F\xE4\xEC |0 + \x8F\xE4\xED |0 + \xC4\xD7 |0 + \x8F\xE4\xEE |0 + \xEF\xAC |0 + \x8F\xE4\xEF |0 + \x8F\xE4\xF0 |0 + \x8F\xE4\xF1 |0 + \xC3\xC3 |0 + \xEF\xA8 |0 + \x8F\xE4\xF2 |0 + \xEF\xA9 |0 + \x8F\xE4\xF3 |0 + \x8F\xE4\xF4 |0 + \x8F\xE4\xF5 |0 + \x8F\xE4\xF6 |0 + \x8F\xE4\xF7 |0 + \xB7\xAD |0 + \x8F\xE4\xF8 |0 + \xEF\xAB |0 + \x8F\xE4\xF9 |0 + \x8F\xE4\xFA |0 + \x8F\xE4\xFB |0 + \x8F\xE4\xFC |0 + \x8F\xE4\xFD |0 + \xB8\xB0 |0 + \x8F\xE4\xFE |0 + \x8F\xE5\xA1 |0 + \xEF\xAA |0 + \x8F\xE5\xA2 |0 + \xBE\xE1 |0 + \x8F\xE5\xA3 |0 + \x8F\xE5\xA4 |0 + \x8F\xE5\xA5 |0 + \x8F\xE5\xA6 |0 + \x8F\xE5\xA7 |0 + \x8F\xE5\xA8 |0 + \x8F\xE5\xA9 |0 + \xB3\xF9 |0 + \x8F\xE5\xAA |0 + \x8F\xE5\xAB |0 + \x8F\xE5\xAC |0 + \xEF\xB0 |0 + \x8F\xE5\xAD |0 + \xBA\xBF |0 + \xC1\xF9 |0 + \x8F\xE5\xAE |0 + \xC4\xCA |0 + \x8F\xE5\xAF |0 + \x8F\xE5\xB0 |0 + \x8F\xE5\xB1 |0 + \x8F\xE5\xB2 |0 + \x8F\xE5\xB3 |0 + \x8F\xE5\xB4 |0 + \xB3\xBB |0 + \x8F\xE5\xB5 |0 + \x8F\xE5\xBB |0 + \x8F\xE5\xB6 |0 + \xEF\xAE |0 + \xEF\xAF |0 + \xC4\xC3 |0 + \xEF\xAD |0 + \x8F\xE5\xB7 |0 + \x8F\xE5\xB8 |0 + \x8F\xE5\xB9 |0 + \xEF\xB1 |0 + \x8F\xE5\xBA |0 + \x8F\xE5\xBC |0 + \xEF\xB7 |0 + \x8F\xE5\xBD |0 + \x8F\xE5\xBE |0 + \x8F\xE5\xBF |0 + \x8F\xE5\xC0 |0 + \xEF\xBA |0 + \x8F\xE5\xC1 |0 + \x8F\xE5\xC2 |0 + \x8F\xE5\xC3 |0 + \x8F\xE5\xC4 |0 + \x8F\xE5\xC5 |0 + \xEF\xB9 |0 + \xC5\xAD |0 + \x8F\xE5\xC6 |0 + \xEF\xB2 |0 + \xEF\xB3 |0 + \xEF\xB6 |0 + \x8F\xE5\xC7 |0 + \x8F\xE5\xC8 |0 + \xEF\xB8 |0 + \x8F\xE5\xC9 |0 + \x8F\xE5\xCA |0 + \xB6\xC0 |0 + \x8F\xE5\xCB |0 + \xEF\xBB |0 + \xEF\xB5 |0 + \x8F\xE5\xCC |0 + \x8F\xE5\xCD |0 + \xEF\xB4 |0 + \x8F\xE5\xCF |0 + \x8F\xE5\xD0 |0 + \x8F\xE5\xCE |0 + \x8F\xE5\xD1 |0 + \x8F\xE5\xD2 |0 + \x8F\xE5\xD3 |0 + \x8F\xE5\xD4 |0 + \x8F\xE5\xD5 |0 + \xEF\xBF |0 + \x8F\xE5\xD6 |0 + \xEF\xC0 |0 + \x8F\xE5\xD7 |0 + \x8F\xE5\xD8 |0 + \x8F\xE5\xD9 |0 + \x8F\xE5\xDA |0 + \x8F\xE5\xDB |0 + \xEF\xC1 |0 + \xEF\xBE |0 + \xEF\xBD |0 + \x8F\xE5\xDC |0 + \x8F\xE5\xDD |0 + \x8F\xE5\xDE |0 + \xBE\xE2 |0 + \xC6\xAA |0 + \xEF\xBC |0 + \x8F\xE5\xDF |0 + \xEF\xC5 |0 + \xEF\xC3 |0 + \x8F\xE5\xE0 |0 + \x8F\xE5\xE1 |0 + \x8F\xE5\xE2 |0 + \x8F\xE5\xE3 |0 + \x8F\xE5\xE4 |0 + \x8F\xE5\xE5 |0 + \xEF\xC4 |0 + \xEF\xC2 |0 + \xC2\xF8 |0 + \xEF\xC6 |0 + \x8F\xE5\xE6 |0 + \x8F\xE5\xE8 |0 + \x8F\xE5\xE7 |0 + \xEF\xC7 |0 + \x8F\xE5\xE9 |0 + \xEF\xC9 |0 + \x8F\xE5\xEA |0 + \x8F\xE5\xEB |0 + \x8F\xE5\xEC |0 + \x8F\xE5\xED |0 + \xB4\xD5 |0 + \xEF\xC8 |0 + \xCC\xFA |0 + \x8F\xE5\xEE |0 + \x8F\xE5\xEF |0 + \xEF\xD4 |0 + \xEF\xCA |0 + \x8F\xE5\xF0 |0 + \xEF\xCD |0 + \x8F\xE5\xF1 |0 + \xEF\xCB |0 + \x8F\xE5\xF2 |0 + \xEF\xCC |0 + \x8F\xE5\xF3 |0 + \x8F\xE5\xF4 |0 + \xEF\xCE |0 + \x8F\xE5\xF5 |0 + \x8F\xE5\xF6 |0 + \x8F\xE5\xF7 |0 + \x8F\xE5\xF8 |0 + \xEF\xD0 |0 + \x8F\xE5\xF9 |0 + \x8F\xE5\xFA |0 + \xEF\xD1 |0 + \xEF\xD2 |0 + \xEF\xD5 |0 + \xEF\xD3 |0 + \xEF\xD6 |0 + \xEF\xD8 |0 + \xEF\xD7 |0 + \x8F\xE5\xFC |0 + \x8F\xE5\xFB |0 + \xC4\xB9 |0 + \x8F\xE5\xFD |0 + \x8F\xE5\xFE |0 + \x8F\xE6\xA1 |0 + \xCC\xE7 |0 + \xEF\xD9 |0 + \xC1\xAE |0 + \x8F\xE6\xA2 |0 + \xEF\xDA |0 + \x8F\xE6\xA3 |0 + \xCA\xC4 |0 + \xEF\xDB |0 + \xB3\xAB |0 + \x8F\xE6\xA4 |0 + \x8F\xE6\xA5 |0 + \x8F\xE6\xA6 |0 + \xB1\xBC |0 + \xB4\xD7 |0 + \x8F\xF4\xEA |0 + \xB4\xD6 |0 + \xEF\xDC |0 + \xEF\xDD |0 + \xEF\xDE |0 + \xEF\xDF |0 + \x8F\xE6\xA7 |0 + \x8F\xE6\xA8 |0 + \x8F\xE6\xA9 |0 + \xEF\xE0 |0 + \x8F\xE6\xAA |0 + \xB4\xD8 |0 + \xB3\xD5 |0 + \xB9\xDE |0 + \xC8\xB6 |0 + \x8F\xE6\xAB |0 + \xEF\xE2 |0 + \xEF\xE1 |0 + \x8F\xE6\xAC |0 + \x8F\xE6\xAD |0 + \x8F\xE6\xAE |0 + \xEF\xE3 |0 + \xB1\xDC |0 + \x8F\xE6\xAF |0 + \x8F\xE6\xB0 |0 + \xEF\xE6 |0 + \x8F\xE6\xB1 |0 + \xEF\xE5 |0 + \xEF\xE4 |0 + \x8F\xE6\xB2 |0 + \xEF\xE7 |0 + \x8F\xE6\xB3 |0 + \xEF\xEA |0 + \x8F\xE6\xB4 |0 + \xB0\xC7 |0 + \x8F\xE6\xB5 |0 + \x8F\xE6\xB6 |0 + \xEF\xE8 |0 + \x8F\xE6\xB7 |0 + \xEF\xEC |0 + \xEF\xEB |0 + \x8F\xE6\xB8 |0 + \x8F\xE6\xB9 |0 + \x8F\xE6\xBA |0 + \x8F\xE6\xBB |0 + \xEF\xEE |0 + \xEF\xED |0 + \xEF\xEF |0 + \xC6\xAE |0 + \x8F\xE6\xBC |0 + \x8F\xE6\xBD |0 + \xEF\xF0 |0 + \x8F\xE6\xBE |0 + \x8F\xE6\xBF |0 + \x8F\xE6\xC0 |0 + \x8F\xE6\xC1 |0 + \xEF\xF1 |0 + \xEF\xF3 |0 + \x8F\xE6\xC2 |0 + \xEF\xF2 |0 + \x8F\xE6\xC3 |0 + \xC9\xEC |0 + \x8F\xE6\xC4 |0 + \x8F\xE6\xC5 |0 + \xEF\xF4 |0 + \x8F\xE6\xC6 |0 + \x8F\xE6\xC7 |0 + \x8F\xE6\xC8 |0 + \x8F\xE6\xC9 |0 + \xEF\xF5 |0 + \xBA\xE5 |0 + \x8F\xE6\xCA |0 + \xEF\xF6 |0 + \xEF\xF7 |0 + \x8F\xE6\xCB |0 + \xCB\xC9 |0 + \x8F\xE6\xCC |0 + \x8F\xE6\xCD |0 + \x8F\xE6\xCE |0 + \x8F\xE6\xCF |0 + \x8F\xE6\xD0 |0 + \xC1\xCB |0 + \x8F\xE6\xD1 |0 + \x8F\xE6\xD2 |0 + \xB0\xA4 |0 + \xC2\xCB |0 + \x8F\xE6\xD3 |0 + \xEF\xF8 |0 + \xC9\xED |0 + \xEF\xFB |0 + \xEF\xF9 |0 + \xB9\xDF |0 + \xEF\xFA |0 + \xB8\xC2 |0 + \x8F\xE6\xD4 |0 + \x8F\xE6\xD5 |0 + \x8F\xE6\xD6 |0 + \x8F\xE6\xD7 |0 + \x8F\xE6\xD8 |0 + \xCA\xC5 |0 + \xEF\xFD |0 + \xF0\xA1 |0 + \xEF\xFE |0 + \xF0\xA2 |0 + \x8F\xE6\xD9 |0 + \xB1\xA1 |0 + \xBF\xD8 |0 + \xBD\xFC |0 + \xB4\xD9 |0 + \xF0\xA3 |0 + \xC7\xE6 |0 + \xF0\xA5 |0 + \x8F\xE6\xDA |0 + \xB1\xA2 |0 + \xF0\xA4 |0 + \xC4\xC4 |0 + \x8F\xE6\xDB |0 + \xCE\xCD |0 + \xC6\xAB |0 + \xEF\xFC |0 + \xCE\xA6 |0 + \xB8\xB1 |0 + \x8F\xE6\xDC |0 + \x8F\xE6\xDD |0 + \xCD\xDB |0 + \x8F\xE6\xDE |0 + \x8F\xE6\xDF |0 + \x8F\xE6\xE0 |0 + \x8F\xE6\xE1 |0 + \x8F\xE6\xE2 |0 + \x8F\xE6\xE3 |0 + \xB6\xF9 |0 + \xCE\xB4 |0 + \xB7\xA8 |0 + \x8F\xE6\xE4 |0 + \xC2\xE2 |0 + \xE7\xA1 |0 + \xF0\xA6 |0 + \xB3\xAC |0 + \xBF\xEF |0 + \x8F\xE6\xE5 |0 + \xB3\xD6 |0 + \xF0\xA8 |0 + \x8F\xE6\xE6 |0 + \xF0\xA9 |0 + \xF0\xA7 |0 + \xB7\xE4 |0 + \x8F\xE6\xE7 |0 + \xBA\xDD |0 + \xBE\xE3 |0 + \x8F\xE6\xE8 |0 + \x8F\xE6\xE9 |0 + \xB1\xA3 |0 + \xCE\xD9 |0 + \x8F\xE6\xEA |0 + \x8F\xE6\xEB |0 + \x8F\xE6\xEC |0 + \xF0\xAB |0 + \xEE\xAE |0 + \x8F\xE6\xED |0 + \xF0\xAA |0 + \x8F\xE6\xEE |0 + \x8F\xE6\xEF |0 + \xF0\xAE |0 + \xF0\xAC |0 + \xF0\xAD |0 + \x8F\xE6\xF0 |0 + \xF0\xAF |0 + \xF0\xB0 |0 + \xCE\xEC |0 + \xF0\xB1 |0 + \xF0\xB2 |0 + \x8F\xE6\xF1 |0 + \xC0\xC9 |0 + \xC8\xBB |0 + \xBF\xFD |0 + \xB4\xE7 |0 + \xCD\xBA |0 + \xB2\xED |0 + \xBD\xB8 |0 + \xB8\xDB |0 + \xF0\xB5 |0 + \x8F\xE6\xF2 |0 + \xF0\xB4 |0 + \xBB\xF3 |0 + \xF0\xB6 |0 + \xF0\xB3 |0 + \xBB\xA8 |0 + \x8F\xE6\xF3 |0 + \xF0\xBA |0 + \xEA\xAD |0 + \x8F\xE6\xF5 |0 + \xD2\xD6 |0 + \x8F\xE6\xF6 |0 + \xBF\xF7 |0 + \xF0\xB8 |0 + \x8F\xE6\xF7 |0 + \x8F\xE6\xF8 |0 + \x8F\xE6\xF9 |0 + \xCE\xA5 |0 + \xC6\xF1 |0 + \xB1\xAB |0 + \x8F\xE6\xFA |0 + \xC0\xE3 |0 + \xBC\xB6 |0 + \x8F\xE6\xFB |0 + \xCA\xB7 |0 + \x8F\xE6\xFC |0 + \xB1\xC0 |0 + \xCE\xED |0 + \xCD\xEB |0 + \xF0\xBB |0 + \x8F\xE6\xFD |0 + \xC5\xC5 |0 + \xBC\xFB |0 + \x8F\xE6\xFE |0 + \x8F\xE7\xA1 |0 + \xF0\xBC |0 + \x8F\xE7\xA2 |0 + \xF0\xBD |0 + \xBF\xCC |0 + \xF0\xBE |0 + \x8F\xE7\xA3 |0 + \xCE\xEE |0 + \xF0\xB9 |0 + \xF0\xC0 |0 + \xF0\xC2 |0 + \xF0\xC1 |0 + \xF0\xBF |0 + \xF0\xC3 |0 + \xF0\xC4 |0 + \x8F\xE7\xA4 |0 + \x8F\xE7\xA5 |0 + \xC1\xFA |0 + \x8F\xE7\xA6 |0 + \xB2\xE2 |0 + \x8F\xE7\xA7 |0 + \x8F\xE7\xA8 |0 + \x8F\xE7\xA9 |0 + \xF0\xC5 |0 + \xCC\xB8 |0 + \x8F\xE7\xAA |0 + \xF0\xC6 |0 + \xF0\xC7 |0 + \x8F\xE7\xAB |0 + \xCF\xAA |0 + \x8F\xE7\xAC |0 + \xDB\xB1 |0 + \xF0\xC8 |0 + \x8F\xF4\xED |0 + \xF0\xC9 |0 + \xF0\xCA |0 + \x8F\xE7\xAD |0 + \xF0\xCE |0 + \x8F\xE7\xAE |0 + \xF0\xCB |0 + \xF0\xCC |0 + \xF0\xCD |0 + \xF0\xCF |0 + \x8F\xE7\xAF |0 + \x8F\xF4\xEE |0 + \x8F\xE7\xB0 |0 + \x8F\xE7\xB1 |0 + \x8F\xF4\xEF |0 + \xC0\xC4 |0 + \x8F\xE7\xB2 |0 + \xCC\xF7 |0 + \x8F\xE7\xB3 |0 + \x8F\xE7\xB4 |0 + \xC0\xC5 |0 + \x8F\xE7\xB5 |0 + \x8F\xE7\xB6 |0 + \xF0\xD0 |0 + \xC8\xF3 |0 + \xF0\xD1 |0 + \xF3\xD3 |0 + \xCC\xCC |0 + \x8F\xE7\xB7 |0 + \xF0\xD2 |0 + \xF0\xD3 |0 + \x8F\xE7\xB8 |0 + \xF0\xD4 |0 + \xB3\xD7 |0 + \x8F\xE7\xB9 |0 + \xF0\xD6 |0 + \xBF\xD9 |0 + \x8F\xE7\xBA |0 + \xF0\xD7 |0 + \x8F\xE7\xBB |0 + \xB7\xA4 |0 + \x8F\xE7\xBC |0 + \x8F\xE7\xBD |0 + \x8F\xE7\xBE |0 + \xF0\xD8 |0 + \xF0\xDC |0 + \x8F\xE7\xBF |0 + \xF0\xDA |0 + \x8F\xE7\xC0 |0 + \x8F\xE7\xC1 |0 + \x8F\xE7\xC2 |0 + \xF0\xDB |0 + \xB3\xF3 |0 + \xF0\xD9 |0 + \xF0\xDD |0 + \x8F\xE7\xC3 |0 + \xF0\xDE |0 + \xB0\xC8 |0 + \xF0\xDF |0 + \xF0\xE0 |0 + \x8F\xE7\xC4 |0 + \x8F\xE7\xC5 |0 + \x8F\xE7\xC6 |0 + \xBE\xE4 |0 + \x8F\xE7\xC7 |0 + \x8F\xE7\xC8 |0 + \xF0\xE1 |0 + \x8F\xE7\xC9 |0 + \x8F\xE7\xCA |0 + \xB5\xC7 |0 + \x8F\xE7\xCB |0 + \xF0\xE4 |0 + \xF0\xE3 |0 + \xF0\xE2 |0 + \xEB\xF1 |0 + \x8F\xE7\xCC |0 + \xCA\xDC |0 + \x8F\xE7\xCD |0 + \x8F\xE7\xCE |0 + \x8F\xE7\xCF |0 + \xF0\xE5 |0 + \xF0\xE6 |0 + \x8F\xE7\xD0 |0 + \x8F\xE7\xD1 |0 + \x8F\xE7\xD2 |0 + \x8F\xE7\xD3 |0 + \x8F\xE7\xD4 |0 + \x8F\xE7\xD5 |0 + \x8F\xE7\xD6 |0 + \x8F\xE7\xD7 |0 + \x8F\xE7\xD8 |0 + \xF0\xE7 |0 + \x8F\xE7\xD9 |0 + \x8F\xE7\xDA |0 + \xF0\xE8 |0 + \x8F\xE7\xDB |0 + \xF0\xE9 |0 + \x8F\xE7\xDC |0 + \x8F\xE7\xDD |0 + \xF0\xEA |0 + \x8F\xE7\xDE |0 + \x8F\xE7\xDF |0 + \x8F\xE7\xE0 |0 + \x8F\xE7\xE1 |0 + \x8F\xE7\xE2 |0 + \xB4\xDA |0 + \x8F\xE7\xE3 |0 + \x8F\xE7\xE4 |0 + \x8F\xE7\xE5 |0 + \x8F\xE7\xE6 |0 + \x8F\xE7\xEA |0 + \xF0\xEB |0 + \x8F\xE7\xE7 |0 + \x8F\xE7\xE8 |0 + \x8F\xE7\xE9 |0 + \x8F\xE7\xEB |0 + \x8F\xE7\xEC |0 + \xF0\xEC |0 + \xC7\xA3 |0 + \x8F\xE7\xED |0 + \x8F\xE7\xEE |0 + \xF0\xEE |0 + \xB2\xBB |0 + \x8F\xE7\xEF |0 + \xF0\xF1 |0 + \xF0\xF0 |0 + \x8F\xE7\xF0 |0 + \x8F\xE7\xF1 |0 + \x8F\xE7\xF2 |0 + \xB1\xA4 |0 + \xB6\xC1 |0 + \xCA\xC7 |0 + \xC4\xBA |0 + \xBA\xA2 |0 + \xB9\xE0 |0 + \xBD\xE7 |0 + \x8F\xE7\xF3 |0 + \xBF\xDC |0 + \x8F\xE7\xF4 |0 + \xF0\xF3 |0 + \x8F\xE7\xF6 |0 + \x8F\xE7\xF7 |0 + \xF0\xF2 |0 + \xCD\xC2 |0 + \xB4\xE8 |0 + \xC8\xD2 |0 + \xC6\xDC |0 + \x8F\xE7\xF8 |0 + \x8F\xE7\xF9 |0 + \xBF\xFC |0 + \xCE\xCE |0 + \x8F\xE7\xF5 |0 + \xB7\xDB |0 + \x8F\xE7\xFA |0 + \x8F\xE7\xFB |0 + \x8F\xE7\xFC |0 + \xF0\xF6 |0 + \x8F\xE7\xFD |0 + \xF0\xF5 |0 + \x8F\xE8\xA8 |0 + \x8F\xE7\xFE |0 + \x8F\xE8\xA1 |0 + \xCB\xCB |0 + \xC6\xAC |0 + \x8F\xE8\xA2 |0 + \x8F\xE8\xA3 |0 + \x8F\xE8\xA4 |0 + \x8F\xE8\xA5 |0 + \x8F\xE8\xA6 |0 + \xB1\xD0 |0 + \x8F\xE8\xA7 |0 + \xF0\xF7 |0 + \xF0\xF4 |0 + \xF0\xF8 |1 + \xC9\xD1 |0 + \xCD\xEA |0 + \xF0\xF8 |0 + \x8F\xE8\xA9 |0 + \x8F\xE8\xAA |0 + \xF0\xF9 |0 + \x8F\xE8\xAB |0 + \x8F\xE8\xAC |0 + \xF0\xFB |0 + \xC2\xEA |0 + \xB3\xDB |0 + \xB3\xDC |0 + \xF0\xFA |0 + \x8F\xE8\xAD |0 + \x8F\xE8\xAE |0 + \x8F\xE8\xAF |0 + \xB4\xE9 |0 + \xB8\xB2 |0 + \x8F\xE8\xB0 |0 + \x8F\xE8\xB1 |0 + \xB4\xEA |0 + \x8F\xE8\xB2 |0 + \x8F\xE8\xB3 |0 + \xC5\xBF |0 + \xCE\xE0 |0 + \x8F\xE8\xB4 |0 + \x8F\xE8\xB5 |0 + \x8F\xE8\xB6 |0 + \x8F\xE8\xB7 |0 + \xB8\xDC |0 + \x8F\xE8\xB8 |0 + \xF0\xFC |0 + \x8F\xE8\xB9 |0 + \xF0\xFD |0 + \xF0\xFE |0 + \xF1\xA1 |0 + \xF1\xA3 |0 + \xF1\xA2 |0 + \xC9\xF7 |0 + \xF1\xA4 |0 + \x8F\xE8\xBA |0 + \x8F\xE8\xBB |0 + \x8F\xE8\xBC |0 + \xF1\xA5 |0 + \x8F\xE8\xBD |0 + \xF1\xA6 |0 + \x8F\xE8\xBE |0 + \xF1\xA7 |0 + \x8F\xE8\xBF |0 + \x8F\xE8\xC0 |0 + \x8F\xE8\xC1 |0 + \x8F\xE8\xC2 |0 + \x8F\xE8\xC3 |0 + \x8F\xE8\xC4 |0 + \xF1\xA9 |0 + \xF1\xA8 |0 + \x8F\xE8\xC5 |0 + \xF1\xAA |0 + \x8F\xE8\xC6 |0 + \x8F\xE8\xC7 |0 + \xC8\xF4 |0 + \xE6\xCC |0 + \xBF\xA9 |0 + \x8F\xE8\xC8 |0 + \xB5\xB2 |0 + \x8F\xE8\xC9 |0 + \x8F\xE8\xCA |0 + \x8F\xE8\xCB |0 + \x8F\xE8\xCC |0 + \xF1\xAB |0 + \x8F\xE8\xCD |0 + \xF1\xAC |0 + \xD2\xAC |0 + \xDD\xBB |0 + \xC8\xD3 |0 + \xB0\xFB |0 + \x8F\xE8\xCE |0 + \xB0\xBB |0 + \x8F\xE8\xCF |0 + \xBB\xF4 |0 + \xCB\xB0 |0 + \xBE\xFE |0 + \x8F\xE8\xD0 |0 + \xF1\xAD |0 + \xCC\xDF |0 + \x8F\xE8\xD1 |0 + \x8F\xE8\xD2 |0 + \xF1\xAE |0 + \xCD\xDC |0 + \xB1\xC2 |0 + \xBB\xC1 |0 + \x8F\xE8\xD3 |0 + \xF1\xAF |0 + \xB2\xEE |0 + \xF1\xB0 |0 + \x8F\xE8\xD4 |0 + \x8F\xE8\xD5 |0 + \x8F\xE8\xD6 |0 + \xF1\xB1 |0 + \x8F\xE8\xD7 |0 + \x8F\xE8\xD8 |0 + \x8F\xE8\xD9 |0 + \xF1\xB3 |0 + \xF1\xB4 |0 + \x8F\xE8\xDA |0 + \xF1\xB6 |0 + \xF1\xB2 |0 + \x8F\xE8\xDB |0 + \xF1\xB5 |0 + \x8F\xE8\xDC |0 + \x8F\xE8\xDD |0 + \xB4\xDB |0 + \x8F\xE8\xDE |0 + \xF1\xB7 |0 + \xF1\xB8 |0 + \x8F\xE8\xDF |0 + \x8F\xE8\xE0 |0 + \x8F\xE8\xE1 |0 + \x8F\xE8\xE2 |0 + \x8F\xE8\xE3 |0 + \x8F\xE8\xE4 |0 + \x8F\xE8\xE5 |0 + \x8F\xE8\xE6 |0 + \x8F\xE8\xE7 |0 + \xF1\xB9 |0 + \xF1\xBA |0 + \x8F\xE8\xE8 |0 + \x8F\xE8\xE9 |0 + \xF1\xBB |0 + \xF1\xBD |0 + \x8F\xE8\xEA |0 + \x8F\xE8\xEB |0 + \x8F\xE8\xEC |0 + \xF1\xBC |0 + \xF1\xBF |0 + \xF1\xC2 |0 + \x8F\xE8\xED |0 + \x8F\xE8\xEE |0 + \xF1\xBE |0 + \xF1\xC0 |0 + \xF1\xC1 |0 + \x8F\xE8\xEF |0 + \xF1\xC3 |0 + \xB6\xC2 |0 + \x8F\xE8\xF0 |0 + \x8F\xE8\xF1 |0 + \x8F\xE8\xF2 |0 + \x8F\xE8\xF3 |0 + \x8F\xE8\xF4 |0 + \x8F\xE8\xF5 |0 + \x8F\xE8\xF6 |0 + \xBC\xF3 |0 + \xF1\xC4 |0 + \xF1\xC5 |0 + \xB9\xE1 |0 + \x8F\xE8\xF7 |0 + \x8F\xE8\xF8 |0 + \x8F\xF4\xF4 |0 + \x8F\xE8\xF9 |0 + \xF1\xC6 |0 + \x8F\xE8\xFA |0 + \xB3\xBE |0 + \xC7\xCF |0 + \xF1\xC7 |0 + \xF1\xC8 |0 + \x8F\xE8\xFB |0 + \x8F\xE8\xFC |0 + \x8F\xE8\xFD |0 + \xC3\xDA |0 + \xC6\xEB |0 + \x8F\xE8\xFE |0 + \x8F\xE9\xA1 |0 + \x8F\xE9\xA2 |0 + \xF1\xC9 |0 + \x8F\xE9\xA3 |0 + \x8F\xE9\xA4 |0 + \xC7\xFD |0 + \x8F\xE9\xA5 |0 + \xC2\xCC |0 + \xB1\xD8 |0 + \xB6\xEE |0 + \xB6\xEF |0 + \x8F\xE9\xA6 |0 + \xC3\xF3 |0 + \xF1\xCE |0 + \xB6\xF0 |0 + \x8F\xE9\xA7 |0 + \x8F\xE9\xA8 |0 + \xB2\xEF |0 + \xF1\xCD |0 + \x8F\xE9\xA9 |0 + \x8F\xE9\xAA |0 + \xF1\xCB |0 + \x8F\xE9\xAB |0 + \xF1\xCC |0 + \x8F\xE9\xAC |0 + \xF1\xCA |0 + \xF1\xD8 |0 + \x8F\xE9\xAD |0 + \x8F\xE9\xAE |0 + \x8F\xE9\xAF |0 + \x8F\xE9\xB0 |0 + \xF1\xCF |0 + \xF1\xD0 |0 + \x8F\xE9\xB1 |0 + \xF1\xD1 |0 + \xF1\xD2 |0 + \x8F\xE9\xB2 |0 + \x8F\xE9\xB3 |0 + \xF1\xD4 |0 + \x8F\xE9\xB4 |0 + \xF1\xD3 |0 + \x8F\xE9\xB5 |0 + \x8F\xE9\xB6 |0 + \xBD\xD9 |0 + \xF1\xD5 |0 + \x8F\xE9\xB7 |0 + \x8F\xE9\xB8 |0 + \x8F\xE9\xB9 |0 + \xF1\xD7 |0 + \x8F\xE9\xBA |0 + \x8F\xE9\xBB |0 + \xB5\xB3 |0 + \xF1\xD6 |0 + \x8F\xE9\xBC |0 + \x8F\xE9\xBD |0 + \xC1\xFB |0 + \xB8\xB3 |0 + \x8F\xE9\xBE |0 + \xF1\xD9 |0 + \x8F\xE9\xBF |0 + \x8F\xE9\xC0 |0 + \x8F\xE9\xC1 |0 + \x8F\xE9\xC2 |0 + \x8F\xE9\xC3 |0 + \x8F\xE9\xC4 |0 + \xC2\xCD |0 + \xF1\xDA |0 + \x8F\xE9\xC5 |0 + \x8F\xE9\xC6 |0 + \xC6\xAD |0 + \x8F\xE9\xC7 |0 + \x8F\xE9\xC8 |0 + \x8F\xE9\xC9 |0 + \xF1\xDB |0 + \x8F\xE9\xCA |0 + \xF1\xE0 |0 + \xF1\xDE |0 + \x8F\xE9\xCC |0 + \xF1\xDD |0 + \xF1\xDF |0 + \x8F\xE9\xCD |0 + \xF1\xDC |0 + \x8F\xE9\xCB |0 + \x8F\xE9\xCE |0 + \x8F\xE9\xCF |0 + \x8F\xE9\xD0 |0 + \xF1\xE2 |0 + \x8F\xE9\xD1 |0 + \x8F\xE9\xD2 |0 + \xC2\xCD |1 + \x8F\xE9\xD3 |0 + \xF1\xE1 |0 + \x8F\xE9\xD4 |0 + \xF1\xE4 |0 + \xB6\xC3 |0 + \xF1\xE3 |0 + \x8F\xE9\xD5 |0 + \xF1\xE5 |0 + \xF1\xE6 |0 + \xF1\xE8 |0 + \xF1\xE7 |0 + \xF1\xE9 |0 + \xF1\xEB |0 + \xF1\xEA |0 + \xB9\xFC |0 + \x8F\xE9\xD6 |0 + \x8F\xE9\xD7 |0 + \xF1\xEC |0 + \x8F\xE9\xD8 |0 + \x8F\xE9\xD9 |0 + \xF1\xED |0 + \x8F\xE9\xDA |0 + \x8F\xE9\xDB |0 + \x8F\xE9\xDC |0 + \x8F\xE9\xDD |0 + \xB3\xBC |0 + \x8F\xE9\xDE |0 + \x8F\xE9\xDF |0 + \xF1\xEE |0 + \x8F\xE9\xE0 |0 + \x8F\xE9\xE1 |0 + \xF1\xEF |0 + \x8F\xE9\xE2 |0 + \x8F\xE9\xE3 |0 + \xBF\xF1 |0 + \x8F\xE9\xE4 |0 + \x8F\xE9\xE5 |0 + \x8F\xE9\xE6 |0 + \xF1\xF0 |0 + \x8F\xE9\xE7 |0 + \xF1\xF1 |0 + \x8F\xE9\xE8 |0 + \xF1\xF2 |0 + \xF1\xF3 |0 + \x8F\xE9\xE9 |0 + \x8F\xE9\xEA |0 + \x8F\xE9\xEB |0 + \xB9\xE2 |0 + \x8F\xF4\xF5 |0 + \x8F\xE9\xEC |0 + \x8F\xE9\xED |0 + \xF1\xF4 |0 + \xF1\xF5 |0 + \x8F\xE9\xEE |0 + \xF1\xF6 |0 + \xF1\xF7 |0 + \x8F\xE9\xEF |0 + \x8F\xE9\xF0 |0 + \xF1\xF8 |0 + \x8F\xE9\xF1 |0 + \x8F\xE9\xF2 |0 + \xC8\xB1 |0 + \xF1\xFA |0 + \x8F\xE9\xF3 |0 + \xC9\xA6 |0 + \xF1\xFB |0 + \xF1\xF9 |0 + \xF1\xFD |0 + \x8F\xE9\xF4 |0 + \x8F\xE9\xF5 |0 + \xF1\xFC |0 + \x8F\xE9\xF6 |0 + \xF1\xFE |0 + \x8F\xE9\xF7 |0 + \x8F\xE9\xF8 |0 + \xF2\xA1 |0 + \x8F\xE9\xF9 |0 + \x8F\xE9\xFA |0 + \x8F\xE9\xFB |0 + \x8F\xE9\xFC |0 + \x8F\xE9\xFD |0 + \x8F\xE9\xFE |0 + \x8F\xEA\xA1 |0 + \x8F\xEA\xA2 |0 + \xF2\xA2 |0 + \x8F\xEA\xA3 |0 + \x8F\xEA\xA4 |0 + \x8F\xEA\xA5 |0 + \x8F\xEA\xA6 |0 + \x8F\xEA\xA7 |0 + \x8F\xEA\xA8 |0 + \x8F\xEA\xA9 |0 + \x8F\xEA\xAA |0 + \x8F\xEA\xAB |0 + \xF2\xA3 |0 + \x8F\xEA\xAC |0 + \xF2\xA4 |0 + \x8F\xEA\xAD |0 + \x8F\xEA\xAE |0 + \xF2\xA5 |0 + \x8F\xEA\xAF |0 + \xF2\xA6 |0 + \xF2\xA7 |0 + \xF2\xA8 |0 + \x8F\xEA\xB0 |0 + \xF2\xA9 |0 + \xF2\xAA |0 + \xF2\xAB |0 + \xF2\xAC |0 + \x8F\xEA\xB1 |0 + \x8F\xEA\xB2 |0 + \xF2\xAD |0 + \xF2\xAE |0 + \xDD\xB5 |0 + \xF2\xAF |0 + \x8F\xEA\xB3 |0 + \x8F\xEA\xB4 |0 + \x8F\xEA\xB5 |0 + \x8F\xEA\xB6 |0 + \x8F\xEA\xB7 |0 + \x8F\xEA\xB8 |0 + \xE4\xF8 |0 + \xB5\xB4 |0 + \x8F\xEA\xB9 |0 + \xB3\xA1 |0 + \xBA\xB2 |0 + \xF2\xB1 |0 + \xF2\xB0 |0 + \xCC\xA5 |0 + \x8F\xEA\xBA |0 + \x8F\xEA\xBB |0 + \x8F\xEA\xBC |0 + \xF2\xB3 |0 + \xF2\xB4 |0 + \xF2\xB2 |0 + \xF2\xB5 |0 + \xCB\xE2 |0 + \x8F\xEA\xBD |0 + \x8F\xEA\xBE |0 + \x8F\xEA\xBF |0 + \xF2\xB6 |0 + \xB5\xFB |0 + \x8F\xEA\xC0 |0 + \x8F\xEA\xC1 |0 + \x8F\xEA\xC2 |0 + \x8F\xEA\xC3 |0 + \x8F\xEA\xC4 |0 + \x8F\xEA\xC5 |0 + \x8F\xEA\xC6 |0 + \x8F\xEA\xC7 |0 + \x8F\xEA\xC8 |0 + \x8F\xEA\xC9 |0 + \x8F\xEA\xCA |0 + \x8F\xEA\xCB |0 + \xCF\xA5 |0 + \x8F\xF4\xF6 |0 + \x8F\xEA\xCC |0 + \xF2\xB7 |0 + \x8F\xEA\xCD |0 + \x8F\xEA\xCE |0 + \x8F\xEA\xCF |0 + \x8F\xEA\xD0 |0 + \x8F\xEA\xD1 |0 + \x8F\xEA\xD2 |0 + \xF2\xB9 |0 + \x8F\xEA\xD3 |0 + \x8F\xEA\xD4 |0 + \x8F\xEA\xD5 |0 + \x8F\xEA\xD6 |0 + \x8F\xEA\xD7 |0 + \x8F\xEA\xD8 |0 + \x8F\xEA\xD9 |0 + \x8F\xEA\xDA |0 + \xB0\xBE |0 + \x8F\xEA\xDB |0 + \x8F\xEA\xDC |0 + \xF2\xBA |0 + \xCA\xAB |0 + \xF2\xB8 |0 + \x8F\xEA\xDD |0 + \xF2\xBB |0 + \xF2\xBC |0 + \x8F\xEA\xDE |0 + \x8F\xEA\xDF |0 + \x8F\xEA\xE0 |0 + \xF2\xBD |0 + \xF2\xBE |0 + \x8F\xEA\xE1 |0 + \x8F\xEA\xE2 |0 + \xF2\xBF |0 + \x8F\xEA\xE3 |0 + \xCB\xEE |0 + \xBB\xAD |0 + \x8F\xEA\xE4 |0 + \xBA\xFA |0 + \xC1\xAF |0 + \x8F\xEA\xE5 |0 + \x8F\xEA\xE6 |0 + \x8F\xEA\xE7 |0 + \xF2\xC0 |0 + \x8F\xEA\xE8 |0 + \x8F\xEA\xE9 |0 + \xF2\xC3 |0 + \x8F\xEA\xEA |0 + \x8F\xEA\xEB |0 + \x8F\xEA\xEC |0 + \x8F\xEA\xED |0 + \xF2\xC1 |0 + \x8F\xEA\xEE |0 + \xF2\xC4 |0 + \x8F\xEA\xEF |0 + \x8F\xEA\xF0 |0 + \xB8\xF1 |0 + \xF2\xC2 |0 + \x8F\xEA\xF1 |0 + \xF2\xC5 |0 + \x8F\xEA\xF2 |0 + \xF2\xC6 |0 + \xF2\xC7 |0 + \xF2\xCB |0 + \xBB\xAA |0 + \x8F\xEA\xF3 |0 + \x8F\xEA\xF4 |0 + \xC2\xE4 |0 + \x8F\xEA\xF5 |0 + \x8F\xEA\xF6 |0 + \xF2\xCC |0 + \xF2\xC9 |0 + \xF2\xC8 |0 + \xF2\xCA |0 + \x8F\xEA\xF7 |0 + \x8F\xEA\xF8 |0 + \xB7\xDF |0 + \x8F\xEA\xF9 |0 + \x8F\xEA\xFA |0 + \x8F\xEA\xFB |0 + \xF2\xD0 |0 + \xF2\xCF |0 + \xF2\xCE |0 + \x8F\xEA\xFC |0 + \xB0\xB3 |0 + \x8F\xEA\xFD |0 + \x8F\xEA\xFE |0 + \x8F\xEB\xA1 |0 + \x8F\xEB\xA2 |0 + \x8F\xEB\xA3 |0 + \x8F\xEB\xA4 |0 + \x8F\xEB\xA5 |0 + \x8F\xEB\xA6 |0 + \xF2\xDA |0 + \xF2\xD6 |0 + \xF2\xD7 |0 + \xF2\xD3 |0 + \xF2\xD9 |0 + \x8F\xEB\xA7 |0 + \xF2\xD5 |0 + \xB3\xE2 |0 + \x8F\xEB\xA8 |0 + \xCF\xCC |0 + \x8F\xEB\xA9 |0 + \xF2\xD8 |0 + \xF2\xD4 |0 + \xF2\xD2 |0 + \xF2\xD1 |0 + \x8F\xEB\xAA |0 + \x8F\xEB\xAB |0 + \x8F\xEB\xAC |0 + \x8F\xEB\xAD |0 + \xF2\xDC |0 + \x8F\xEB\xAE |0 + \x8F\xEB\xAF |0 + \xF2\xDF |0 + \x8F\xEB\xB0 |0 + \x8F\xEB\xB1 |0 + \xF2\xDE |0 + \xF2\xDD |0 + \x8F\xEB\xB2 |0 + \x8F\xEB\xB3 |0 + \x8F\xEB\xB4 |0 + \x8F\xEB\xB5 |0 + \x8F\xEB\xB6 |0 + \xC9\xC9 |0 + \xF2\xDB |0 + \xB0\xF3 |0 + \xF2\xE0 |0 + \x8F\xEB\xB7 |0 + \xF2\xE2 |0 + \x8F\xEB\xB8 |0 + \x8F\xEB\xB9 |0 + \x8F\xEB\xBA |0 + \xB3\xEF |0 + \xF2\xCD |0 + \xB1\xB7 |0 + \x8F\xEB\xBB |0 + \xF2\xE4 |0 + \x8F\xEB\xBC |0 + \x8F\xEB\xBD |0 + \x8F\xEB\xBE |0 + \x8F\xEB\xBF |0 + \xF2\xE3 |0 + \xF2\xE1 |0 + \xC3\xAD |0 + \x8F\xEB\xC0 |0 + \x8F\xEB\xC1 |0 + \x8F\xEB\xC2 |0 + \x8F\xEB\xC3 |0 + \x8F\xEB\xC4 |0 + \xCB\xF0 |0 + \x8F\xEB\xC5 |0 + \x8F\xEB\xC6 |0 + \x8F\xEB\xC7 |0 + \xCE\xDA |0 + \x8F\xEB\xC8 |0 + \xF2\xE5 |0 + \x8F\xEB\xC9 |0 + \x8F\xEB\xD0 |0 + \x8F\xEB\xCA |0 + \x8F\xEB\xCB |0 + \x8F\xEB\xCC |0 + \xF2\xE6 |0 + \x8F\xEB\xCD |0 + \xF2\xE7 |0 + \x8F\xEB\xD2 |0 + \x8F\xEB\xCE |0 + \x8F\xEB\xCF |0 + \x8F\xEB\xD1 |0 + \x8F\xEB\xD3 |0 + \x8F\xEB\xD4 |0 + \x8F\xEB\xD5 |0 + \x8F\xEB\xD6 |0 + \xF2\xE8 |0 + \x8F\xEB\xD7 |0 + \xF2\xE9 |0 + \x8F\xEB\xD8 |0 + \xC4\xBB |0 + \x8F\xEB\xD9 |0 + \xF2\xEA |0 + \xC8\xB7 |0 + \xF2\xEF |0 + \xF2\xEB |0 + \xF2\xEC |0 + \x8F\xEB\xDA |0 + \xCB\xB1 |0 + \xCC\xC4 |0 + \xC6\xD0 |0 + \x8F\xEB\xDB |0 + \x8F\xEB\xDC |0 + \x8F\xEB\xDE |0 + \xF2\xF0 |0 + \xF2\xF1 |0 + \xC6\xBE |0 + \xF2\xEE |0 + \xF2\xED |0 + \x8F\xEB\xDD |0 + \xB2\xAA |0 + \x8F\xEB\xDF |0 + \xF2\xF9 |0 + \xF2\xF8 |0 + \x8F\xEB\xE0 |0 + \x8F\xEB\xE1 |0 + \xB1\xF5 |0 + \x8F\xEB\xE2 |0 + \x8F\xEB\xE3 |0 + \x8F\xEB\xE4 |0 + \xF2\xF6 |0 + \xF2\xF5 |0 + \xF2\xF3 |0 + \xB3\xFB |0 + \xF2\xF2 |0 + \xBC\xB2 |0 + \xB2\xA9 |0 + \x8F\xEB\xE5 |0 + \x8F\xEB\xE6 |0 + \x8F\xEB\xE7 |0 + \x8F\xEB\xE8 |0 + \x8F\xEB\xE9 |0 + \x8F\xEB\xEA |0 + \xB9\xE3 |0 + \x8F\xEB\xEB |0 + \x8F\xEB\xED |0 + \xF2\xFC |0 + \xF2\xFB |0 + \xF2\xFA |0 + \x8F\xEB\xEE |0 + \x8F\xEB\xEF |0 + \xF2\xF7 |0 + \x8F\xEB\xEC |0 + \xF2\xFD |0 + \x8F\xEB\xF0 |0 + \xF2\xFE |0 + \x8F\xEB\xF1 |0 + \xF3\xA5 |0 + \xF3\xA4 |0 + \x8F\xEB\xF2 |0 + \x8F\xEB\xF3 |0 + \xF3\xA6 |0 + \xB1\xAD |0 + \xF3\xA1 |0 + \xF3\xA2 |0 + \x8F\xEB\xF4 |0 + \xB9\xF4 |0 + \xCC\xB9 |0 + \x8F\xEB\xF6 |0 + \x8F\xEB\xF5 |0 + \xF3\xA3 |0 + \x8F\xEB\xF7 |0 + \x8F\xEB\xF8 |0 + \x8F\xEB\xF9 |0 + \x8F\xEB\xFA |0 + \xCB\xB2 |0 + \xF3\xAB |0 + \x8F\xEB\xFB |0 + \xF3\xA7 |0 + \x8F\xEB\xFC |0 + \x8F\xEB\xFD |0 + \xF3\xAC |0 + \x8F\xEB\xFE |0 + \x8F\xEC\xA1 |0 + \x8F\xEC\xA2 |0 + \x8F\xEC\xA3 |0 + \x8F\xEC\xA4 |0 + \x8F\xEC\xA5 |0 + \xF3\xA9 |0 + \xF3\xA8 |0 + \x8F\xEC\xA6 |0 + \x8F\xEC\xA7 |0 + \x8F\xEC\xA8 |0 + \xB7\xDC |0 + \x8F\xEC\xA9 |0 + \x8F\xEC\xAA |0 + \x8F\xEC\xAB |0 + \x8F\xEC\xAC |0 + \x8F\xEC\xAD |0 + \x8F\xEC\xAE |0 + \xF3\xAD |0 + \x8F\xEC\xAF |0 + \xF3\xAE |0 + \xF3\xAF |0 + \x8F\xEC\xB0 |0 + \xF3\xAA |0 + \x8F\xEC\xB1 |0 + \x8F\xEC\xB2 |0 + \xF2\xF4 |0 + \x8F\xEC\xB3 |0 + \xF3\xB0 |0 + \xC4\xE1 |0 + \x8F\xEC\xB4 |0 + \xF3\xB4 |0 + \x8F\xEC\xB5 |0 + \xF3\xB5 |0 + \xF3\xB3 |0 + \x8F\xEC\xB6 |0 + \x8F\xEC\xB7 |0 + \xF3\xB2 |0 + \xF3\xB8 |0 + \x8F\xEC\xB8 |0 + \xF3\xB1 |0 + \xF3\xB6 |0 + \x8F\xEC\xB9 |0 + \x8F\xEC\xBA |0 + \x8F\xEC\xBB |0 + \xF3\xB7 |0 + \xF3\xBA |0 + \x8F\xEC\xBC |0 + \x8F\xEC\xBD |0 + \x8F\xEC\xBE |0 + \x8F\xEC\xBF |0 + \xF3\xB9 |0 + \x8F\xEC\xC0 |0 + \x8F\xEC\xC1 |0 + \x8F\xEC\xC2 |0 + \x8F\xEC\xC3 |0 + \x8F\xEC\xC4 |0 + \xF3\xBC |0 + \x8F\xEC\xC5 |0 + \x8F\xEC\xC6 |0 + \x8F\xEC\xC7 |0 + \xF3\xBD |0 + \x8F\xEC\xC8 |0 + \xF3\xBE |0 + \x8F\xEC\xC9 |0 + \xCF\xC9 |0 + \x8F\xEC\xCA |0 + \x8F\xEC\xCB |0 + \xF3\xBB |0 + \xC2\xEB |0 + \xBA\xED |0 + \xF3\xBF |0 + \x8F\xEC\xCC |0 + \x8F\xEC\xCE |0 + \x8F\xEC\xCF |0 + \x8F\xEC\xCD |0 + \x8F\xEC\xD0 |0 + \x8F\xEC\xD1 |0 + \x8F\xEC\xD2 |0 + \x8F\xEC\xD3 |0 + \x8F\xEC\xD4 |0 + \x8F\xEC\xD5 |0 + \x8F\xEC\xD6 |0 + \xF3\xC0 |0 + \xF3\xC1 |0 + \x8F\xEC\xD7 |0 + \x8F\xEC\xD8 |0 + \xF3\xC2 |0 + \xF3\xC3 |0 + \xB8\xB4 |0 + \xF3\xC4 |0 + \x8F\xEC\xD9 |0 + \x8F\xEC\xDA |0 + \x8F\xEC\xDB |0 + \xF3\xC5 |0 + \xBC\xAF |0 + \x8F\xEC\xDC |0 + \xF3\xC6 |0 + \x8F\xEC\xDD |0 + \x8F\xEC\xDE |0 + \x8F\xEC\xDF |0 + \x8F\xEC\xE0 |0 + \x8F\xEC\xE1 |0 + \xF3\xC7 |0 + \xF3\xC8 |0 + \xF3\xC9 |0 + \x8F\xEC\xE2 |0 + \x8F\xEC\xE3 |0 + \xF3\xCC |0 + \xF3\xCA |0 + \xCF\xBC |0 + \xF3\xCB |0 + \x8F\xEC\xE4 |0 + \xCE\xEF |0 + \x8F\xEC\xE5 |0 + \x8F\xEC\xE6 |0 + \xF3\xCD |0 + \x8F\xEC\xE7 |0 + \xCE\xDB |0 + \x8F\xEC\xE8 |0 + \xF3\xCE |0 + \xC7\xFE |0 + \x8F\xEC\xE9 |0 + \xF3\xCF |0 + \xF3\xD1 |0 + \x8F\xEC\xEA |0 + \xF3\xD2 |0 + \x8F\xEC\xEB |0 + \x8F\xEC\xEC |0 + \x8F\xEC\xED |0 + \x8F\xEC\xEE |0 + \x8F\xEC\xEF |0 + \x8F\xEC\xF0 |0 + \xF3\xD0 |0 + \xB9\xED |0 + \xCC\xCD |0 + \xCB\xE3 |0 + \xD6\xF7 |0 + \xDD\xE0 |0 + \xCB\xFB |0 + \xB2\xAB |0 + \x8F\xEC\xF1 |0 + \x8F\xEC\xF2 |0 + \x8F\xEC\xF3 |0 + \xF3\xD4 |0 + \xB5\xD0 |0 + \xF3\xD5 |0 + \xF3\xD6 |0 + \xF3\xD7 |0 + \x8F\xF4\xF8 |0 + \xB9\xF5 |0 + \xF3\xD8 |0 + \x8F\xEC\xF4 |0 + \xE0\xD4 |0 + \xCC\xDB |0 + \xC2\xE3 |0 + \xF3\xD9 |0 + \xF3\xDB |0 + \xF3\xDA |0 + \x8F\xEC\xF5 |0 + \xF3\xDC |0 + \x8F\xEC\xF6 |0 + \xF3\xDD |0 + \x8F\xEC\xF7 |0 + \xF3\xDE |0 + \x8F\xEC\xF8 |0 + \x8F\xEC\xF9 |0 + \x8F\xEC\xFA |0 + \xF3\xDF |0 + \x8F\xEC\xFB |0 + \x8F\xEC\xFC |0 + \x8F\xEC\xFD |0 + \xF3\xE0 |0 + \x8F\xEC\xFE |0 + \xF3\xE1 |0 + \xF3\xE2 |0 + \x8F\xED\xA1 |0 + \xF3\xE3 |0 + \xF3\xE4 |0 + \xF3\xE5 |0 + \xF3\xE6 |0 + \x8F\xED\xA2 |0 + \x8F\xED\xA3 |0 + \x8F\xED\xA4 |0 + \xF3\xE7 |0 + \xF3\xE8 |0 + \x8F\xED\xA5 |0 + \xC5\xA4 |0 + \x8F\xED\xA6 |0 + \x8F\xED\xA7 |0 + \x8F\xED\xA8 |0 + \x8F\xED\xA9 |0 + \xB8\xDD |0 + \x8F\xED\xAA |0 + \xF3\xEA |0 + \x8F\xED\xAB |0 + \x8F\xED\xAC |0 + \x8F\xED\xAD |0 + \x8F\xED\xAE |0 + \x8F\xED\xAF |0 + \x8F\xED\xB0 |0 + \xC1\xCD |0 + \xF3\xEB |0 + \x8F\xED\xB1 |0 + \x8F\xED\xB2 |0 + \x8F\xED\xB3 |0 + \x8F\xED\xB4 |0 + \xF3\xEC |0 + \x8F\xED\xB5 |0 + \x8F\xED\xB6 |0 + \x8F\xED\xB7 |0 + \x8F\xED\xB8 |0 + \x8F\xED\xB9 |0 + \x8F\xED\xBA |0 + \x8F\xED\xBB |0 + \xC9\xA1 |0 + \x8F\xED\xBC |0 + \x8F\xED\xBD |0 + \xF3\xED |0 + \x8F\xED\xBE |0 + \x8F\xED\xBF |0 + \x8F\xED\xC0 |0 + \x8F\xED\xC1 |0 + \x8F\xED\xC2 |0 + \x8F\xED\xC3 |0 + \x8F\xED\xC4 |0 + \xF3\xEE |0 + \xE3\xB7 |0 + \xEC\xDA |0 + \xF0\xED |0 + \xF3\xEF |0 + \x8F\xED\xC5 |0 + \xF3\xF0 |0 + \x8F\xED\xC6 |0 + \x8F\xED\xC7 |0 + \x8F\xED\xC8 |0 + \x8F\xED\xC9 |0 + \x8F\xED\xCA |0 + \x8F\xED\xCB |0 + \x8F\xED\xCC |0 + \xF3\xF2 |0 + \xF3\xF3 |0 + \xF3\xF4 |0 + \xCE\xF0 |0 + \xF3\xF1 |0 + \xF3\xF5 |0 + \xF3\xF6 |0 + \x8F\xED\xCD |0 + \x8F\xED\xCE |0 + \xF3\xF8 |0 + \xF3\xF7 |0 + \x8F\xED\xCF |0 + \x8F\xED\xD0 |0 + \x8F\xED\xD1 |0 + \x8F\xED\xD2 |0 + \x8F\xED\xD3 |0 + \xF3\xFA |0 + \x8F\xED\xD4 |0 + \x8F\xED\xD5 |0 + \xF3\xFB |0 + \xF3\xF9 |0 + \x8F\xED\xD6 |0 + \x8F\xED\xD7 |0 + \xCE\xB6 |0 + \x8F\xED\xD8 |0 + \x8F\xED\xD9 |0 + \x8F\xED\xDA |0 + \x8F\xED\xDB |0 + \x8F\xED\xDC |0 + \xF3\xFC |0 + \x8F\xED\xDD |0 + \x8F\xED\xDE |0 + \xF3\xFD |0 + \xE3\xD4 |0 + \x8F\xED\xDF |0 + \xF3\xFE |0 + \x8F\xED\xE0 |0 + \x8F\xED\xE1 |0 + \x8F\xED\xE2 |0 + \x8F\xED\xE3 |0 + \xF5\xA1 |0 + \xF5\xA2 |0 + \xF5\xA3 |0 + \xF5\xA4 |0 + \xF5\xA5 |0 + \xF5\xA6 |0 + \xF5\xA7 |0 + \xF5\xA8 |0 + \xF5\xA9 |0 + \xF5\xAA |0 + \xF5\xAB |0 + \xF5\xAC |0 + \xF5\xAD |0 + \xF5\xAE |0 + \xF5\xAF |0 + \xF5\xB0 |0 + \xF5\xB1 |0 + \xF5\xB2 |0 + \xF5\xB3 |0 + \xF5\xB4 |0 + \xF5\xB5 |0 + \xF5\xB6 |0 + \xF5\xB7 |0 + \xF5\xB8 |0 + \xF5\xB9 |0 + \xF5\xBA |0 + \xF5\xBB |0 + \xF5\xBC |0 + \xF5\xBD |0 + \xF5\xBE |0 + \xF5\xBF |0 + \xF5\xC0 |0 + \xF5\xC1 |0 + \xF5\xC2 |0 + \xF5\xC3 |0 + \xF5\xC4 |0 + \xF5\xC5 |0 + \xF5\xC6 |0 + \xF5\xC7 |0 + \xF5\xC8 |0 + \xF5\xC9 |0 + \xF5\xCA |0 + \xF5\xCB |0 + \xF5\xCC |0 + \xF5\xCD |0 + \xF5\xCE |0 + \xF5\xCF |0 + \xF5\xD0 |0 + \xF5\xD1 |0 + \xF5\xD2 |0 + \xF5\xD3 |0 + \xF5\xD4 |0 + \xF5\xD5 |0 + \xF5\xD6 |0 + \xF5\xD7 |0 + \xF5\xD8 |0 + \xF5\xD9 |0 + \xF5\xDA |0 + \xF5\xDB |0 + \xF5\xDC |0 + \xF5\xDD |0 + \xF5\xDE |0 + \xF5\xDF |0 + \xF5\xE0 |0 + \xF5\xE1 |0 + \xF5\xE2 |0 + \xF5\xE3 |0 + \xF5\xE4 |0 + \xF5\xE5 |0 + \xF5\xE6 |0 + \xF5\xE7 |0 + \xF5\xE8 |0 + \xF5\xE9 |0 + \xF5\xEA |0 + \xF5\xEB |0 + \xF5\xEC |0 + \xF5\xED |0 + \xF5\xEE |0 + \xF5\xEF |0 + \xF5\xF0 |0 + \xF5\xF1 |0 + \xF5\xF2 |0 + \xF5\xF3 |0 + \xF5\xF4 |0 + \xF5\xF5 |0 + \xF5\xF6 |0 + \xF5\xF7 |0 + \xF5\xF8 |0 + \xF5\xF9 |0 + \xF5\xFA |0 + \xF5\xFB |0 + \xF5\xFC |0 + \xF5\xFD |0 + \xF5\xFE |0 + \xF6\xA1 |0 + \xF6\xA2 |0 + \xF6\xA3 |0 + \xF6\xA4 |0 + \xF6\xA5 |0 + \xF6\xA6 |0 + \xF6\xA7 |0 + \xF6\xA8 |0 + \xF6\xA9 |0 + \xF6\xAA |0 + \xF6\xAB |0 + \xF6\xAC |0 + \xF6\xAD |0 + \xF6\xAE |0 + \xF6\xAF |0 + \xF6\xB0 |0 + \xF6\xB1 |0 + \xF6\xB2 |0 + \xF6\xB3 |0 + \xF6\xB4 |0 + \xF6\xB5 |0 + \xF6\xB6 |0 + \xF6\xB7 |0 + \xF6\xB8 |0 + \xF6\xB9 |0 + \xF6\xBA |0 + \xF6\xBB |0 + \xF6\xBC |0 + \xF6\xBD |0 + \xF6\xBE |0 + \xF6\xBF |0 + \xF6\xC0 |0 + \xF6\xC1 |0 + \xF6\xC2 |0 + \xF6\xC3 |0 + \xF6\xC4 |0 + \xF6\xC5 |0 + \xF6\xC6 |0 + \xF6\xC7 |0 + \xF6\xC8 |0 + \xF6\xC9 |0 + \xF6\xCA |0 + \xF6\xCB |0 + \xF6\xCC |0 + \xF6\xCD |0 + \xF6\xCE |0 + \xF6\xCF |0 + \xF6\xD0 |0 + \xF6\xD1 |0 + \xF6\xD2 |0 + \xF6\xD3 |0 + \xF6\xD4 |0 + \xF6\xD5 |0 + \xF6\xD6 |0 + \xF6\xD7 |0 + \xF6\xD8 |0 + \xF6\xD9 |0 + \xF6\xDA |0 + \xF6\xDB |0 + \xF6\xDC |0 + \xF6\xDD |0 + \xF6\xDE |0 + \xF6\xDF |0 + \xF6\xE0 |0 + \xF6\xE1 |0 + \xF6\xE2 |0 + \xF6\xE3 |0 + \xF6\xE4 |0 + \xF6\xE5 |0 + \xF6\xE6 |0 + \xF6\xE7 |0 + \xF6\xE8 |0 + \xF6\xE9 |0 + \xF6\xEA |0 + \xF6\xEB |0 + \xF6\xEC |0 + \xF6\xED |0 + \xF6\xEE |0 + \xF6\xEF |0 + \xF6\xF0 |0 + \xF6\xF1 |0 + \xF6\xF2 |0 + \xF6\xF3 |0 + \xF6\xF4 |0 + \xF6\xF5 |0 + \xF6\xF6 |0 + \xF6\xF7 |0 + \xF6\xF8 |0 + \xF6\xF9 |0 + \xF6\xFA |0 + \xF6\xFB |0 + \xF6\xFC |0 + \xF6\xFD |0 + \xF6\xFE |0 + \xF7\xA1 |0 + \xF7\xA2 |0 + \xF7\xA3 |0 + \xF7\xA4 |0 + \xF7\xA5 |0 + \xF7\xA6 |0 + \xF7\xA7 |0 + \xF7\xA8 |0 + \xF7\xA9 |0 + \xF7\xAA |0 + \xF7\xAB |0 + \xF7\xAC |0 + \xF7\xAD |0 + \xF7\xAE |0 + \xF7\xAF |0 + \xF7\xB0 |0 + \xF7\xB1 |0 + \xF7\xB2 |0 + \xF7\xB3 |0 + \xF7\xB4 |0 + \xF7\xB5 |0 + \xF7\xB6 |0 + \xF7\xB7 |0 + \xF7\xB8 |0 + \xF7\xB9 |0 + \xF7\xBA |0 + \xF7\xBB |0 + \xF7\xBC |0 + \xF7\xBD |0 + \xF7\xBE |0 + \xF7\xBF |0 + \xF7\xC0 |0 + \xF7\xC1 |0 + \xF7\xC2 |0 + \xF7\xC3 |0 + \xF7\xC4 |0 + \xF7\xC5 |0 + \xF7\xC6 |0 + \xF7\xC7 |0 + \xF7\xC8 |0 + \xF7\xC9 |0 + \xF7\xCA |0 + \xF7\xCB |0 + \xF7\xCC |0 + \xF7\xCD |0 + \xF7\xCE |0 + \xF7\xCF |0 + \xF7\xD0 |0 + \xF7\xD1 |0 + \xF7\xD2 |0 + \xF7\xD3 |0 + \xF7\xD4 |0 + \xF7\xD5 |0 + \xF7\xD6 |0 + \xF7\xD7 |0 + \xF7\xD8 |0 + \xF7\xD9 |0 + \xF7\xDA |0 + \xF7\xDB |0 + \xF7\xDC |0 + \xF7\xDD |0 + \xF7\xDE |0 + \xF7\xDF |0 + \xF7\xE0 |0 + \xF7\xE1 |0 + \xF7\xE2 |0 + \xF7\xE3 |0 + \xF7\xE4 |0 + \xF7\xE5 |0 + \xF7\xE6 |0 + \xF7\xE7 |0 + \xF7\xE8 |0 + \xF7\xE9 |0 + \xF7\xEA |0 + \xF7\xEB |0 + \xF7\xEC |0 + \xF7\xED |0 + \xF7\xEE |0 + \xF7\xEF |0 + \xF7\xF0 |0 + \xF7\xF1 |0 + \xF7\xF2 |0 + \xF7\xF3 |0 + \xF7\xF4 |0 + \xF7\xF5 |0 + \xF7\xF6 |0 + \xF7\xF7 |0 + \xF7\xF8 |0 + \xF7\xF9 |0 + \xF7\xFA |0 + \xF7\xFB |0 + \xF7\xFC |0 + \xF7\xFD |0 + \xF7\xFE |0 + \xF8\xA1 |0 + \xF8\xA2 |0 + \xF8\xA3 |0 + \xF8\xA4 |0 + \xF8\xA5 |0 + \xF8\xA6 |0 + \xF8\xA7 |0 + \xF8\xA8 |0 + \xF8\xA9 |0 + \xF8\xAA |0 + \xF8\xAB |0 + \xF8\xAC |0 + \xF8\xAD |0 + \xF8\xAE |0 + \xF8\xAF |0 + \xF8\xB0 |0 + \xF8\xB1 |0 + \xF8\xB2 |0 + \xF8\xB3 |0 + \xF8\xB4 |0 + \xF8\xB5 |0 + \xF8\xB6 |0 + \xF8\xB7 |0 + \xF8\xB8 |0 + \xF8\xB9 |0 + \xF8\xBA |0 + \xF8\xBB |0 + \xF8\xBC |0 + \xF8\xBD |0 + \xF8\xBE |0 + \xF8\xBF |0 + \xF8\xC0 |0 + \xF8\xC1 |0 + \xF8\xC2 |0 + \xF8\xC3 |0 + \xF8\xC4 |0 + \xF8\xC5 |0 + \xF8\xC6 |0 + \xF8\xC7 |0 + \xF8\xC8 |0 + \xF8\xC9 |0 + \xF8\xCA |0 + \xF8\xCB |0 + \xF8\xCC |0 + \xF8\xCD |0 + \xF8\xCE |0 + \xF8\xCF |0 + \xF8\xD0 |0 + \xF8\xD1 |0 + \xF8\xD2 |0 + \xF8\xD3 |0 + \xF8\xD4 |0 + \xF8\xD5 |0 + \xF8\xD6 |0 + \xF8\xD7 |0 + \xF8\xD8 |0 + \xF8\xD9 |0 + \xF8\xDA |0 + \xF8\xDB |0 + \xF8\xDC |0 + \xF8\xDD |0 + \xF8\xDE |0 + \xF8\xDF |0 + \xF8\xE0 |0 + \xF8\xE1 |0 + \xF8\xE2 |0 + \xF8\xE3 |0 + \xF8\xE4 |0 + \xF8\xE5 |0 + \xF8\xE6 |0 + \xF8\xE7 |0 + \xF8\xE8 |0 + \xF8\xE9 |0 + \xF8\xEA |0 + \xF8\xEB |0 + \xF8\xEC |0 + \xF8\xED |0 + \xF8\xEE |0 + \xF8\xEF |0 + \xF8\xF0 |0 + \xF8\xF1 |0 + \xF8\xF2 |0 + \xF8\xF3 |0 + \xF8\xF4 |0 + \xF8\xF5 |0 + \xF8\xF6 |0 + \xF8\xF7 |0 + \xF8\xF8 |0 + \xF8\xF9 |0 + \xF8\xFA |0 + \xF8\xFB |0 + \xF8\xFC |0 + \xF8\xFD |0 + \xF8\xFE |0 + \xF9\xA1 |0 + \xF9\xA2 |0 + \xF9\xA3 |0 + \xF9\xA4 |0 + \xF9\xA5 |0 + \xF9\xA6 |0 + \xF9\xA7 |0 + \xF9\xA8 |0 + \xF9\xA9 |0 + \xF9\xAA |0 + \xF9\xAB |0 + \xF9\xAC |0 + \xF9\xAD |0 + \xF9\xAE |0 + \xF9\xAF |0 + \xF9\xB0 |0 + \xF9\xB1 |0 + \xF9\xB2 |0 + \xF9\xB3 |0 + \xF9\xB4 |0 + \xF9\xB5 |0 + \xF9\xB6 |0 + \xF9\xB7 |0 + \xF9\xB8 |0 + \xF9\xB9 |0 + \xF9\xBA |0 + \xF9\xBB |0 + \xF9\xBC |0 + \xF9\xBD |0 + \xF9\xBE |0 + \xF9\xBF |0 + \xF9\xC0 |0 + \xF9\xC1 |0 + \xF9\xC2 |0 + \xF9\xC3 |0 + \xF9\xC4 |0 + \xF9\xC5 |0 + \xF9\xC6 |0 + \xF9\xC7 |0 + \xF9\xC8 |0 + \xF9\xC9 |0 + \xF9\xCA |0 + \xF9\xCB |0 + \xF9\xCC |0 + \xF9\xCD |0 + \xF9\xCE |0 + \xF9\xCF |0 + \xF9\xD0 |0 + \xF9\xD1 |0 + \xF9\xD2 |0 + \xF9\xD3 |0 + \xF9\xD4 |0 + \xF9\xD5 |0 + \xF9\xD6 |0 + \xF9\xD7 |0 + \xF9\xD8 |0 + \xF9\xD9 |0 + \xF9\xDA |0 + \xF9\xDB |0 + \xF9\xDC |0 + \xF9\xDD |0 + \xF9\xDE |0 + \xF9\xDF |0 + \xF9\xE0 |0 + \xF9\xE1 |0 + \xF9\xE2 |0 + \xF9\xE3 |0 + \xF9\xE4 |0 + \xF9\xE5 |0 + \xF9\xE6 |0 + \xF9\xE7 |0 + \xF9\xE8 |0 + \xF9\xE9 |0 + \xF9\xEA |0 + \xF9\xEB |0 + \xF9\xEC |0 + \xF9\xED |0 + \xF9\xEE |0 + \xF9\xEF |0 + \xF9\xF0 |0 + \xF9\xF1 |0 + \xF9\xF2 |0 + \xF9\xF3 |0 + \xF9\xF4 |0 + \xF9\xF5 |0 + \xF9\xF6 |0 + \xF9\xF7 |0 + \xF9\xF8 |0 + \xF9\xF9 |0 + \xF9\xFA |0 + \xF9\xFB |0 + \xF9\xFC |0 + \xF9\xFD |0 + \xF9\xFE |0 + \xFA\xA1 |0 + \xFA\xA2 |0 + \xFA\xA3 |0 + \xFA\xA4 |0 + \xFA\xA5 |0 + \xFA\xA6 |0 + \xFA\xA7 |0 + \xFA\xA8 |0 + \xFA\xA9 |0 + \xFA\xAA |0 + \xFA\xAB |0 + \xFA\xAC |0 + \xFA\xAD |0 + \xFA\xAE |0 + \xFA\xAF |0 + \xFA\xB0 |0 + \xFA\xB1 |0 + \xFA\xB2 |0 + \xFA\xB3 |0 + \xFA\xB4 |0 + \xFA\xB5 |0 + \xFA\xB6 |0 + \xFA\xB7 |0 + \xFA\xB8 |0 + \xFA\xB9 |0 + \xFA\xBA |0 + \xFA\xBB |0 + \xFA\xBC |0 + \xFA\xBD |0 + \xFA\xBE |0 + \xFA\xBF |0 + \xFA\xC0 |0 + \xFA\xC1 |0 + \xFA\xC2 |0 + \xFA\xC3 |0 + \xFA\xC4 |0 + \xFA\xC5 |0 + \xFA\xC6 |0 + \xFA\xC7 |0 + \xFA\xC8 |0 + \xFA\xC9 |0 + \xFA\xCA |0 + \xFA\xCB |0 + \xFA\xCC |0 + \xFA\xCD |0 + \xFA\xCE |0 + \xFA\xCF |0 + \xFA\xD0 |0 + \xFA\xD1 |0 + \xFA\xD2 |0 + \xFA\xD3 |0 + \xFA\xD4 |0 + \xFA\xD5 |0 + \xFA\xD6 |0 + \xFA\xD7 |0 + \xFA\xD8 |0 + \xFA\xD9 |0 + \xFA\xDA |0 + \xFA\xDB |0 + \xFA\xDC |0 + \xFA\xDD |0 + \xFA\xDE |0 + \xFA\xDF |0 + \xFA\xE0 |0 + \xFA\xE1 |0 + \xFA\xE2 |0 + \xFA\xE3 |0 + \xFA\xE4 |0 + \xFA\xE5 |0 + \xFA\xE6 |0 + \xFA\xE7 |0 + \xFA\xE8 |0 + \xFA\xE9 |0 + \xFA\xEA |0 + \xFA\xEB |0 + \xFA\xEC |0 + \xFA\xED |0 + \xFA\xEE |0 + \xFA\xEF |0 + \xFA\xF0 |0 + \xFA\xF1 |0 + \xFA\xF2 |0 + \xFA\xF3 |0 + \xFA\xF4 |0 + \xFA\xF5 |0 + \xFA\xF6 |0 + \xFA\xF7 |0 + \xFA\xF8 |0 + \xFA\xF9 |0 + \xFA\xFA |0 + \xFA\xFB |0 + \xFA\xFC |0 + \xFA\xFD |0 + \xFA\xFE |0 + \xFB\xA1 |0 + \xFB\xA2 |0 + \xFB\xA3 |0 + \xFB\xA4 |0 + \xFB\xA5 |0 + \xFB\xA6 |0 + \xFB\xA7 |0 + \xFB\xA8 |0 + \xFB\xA9 |0 + \xFB\xAA |0 + \xFB\xAB |0 + \xFB\xAC |0 + \xFB\xAD |0 + \xFB\xAE |0 + \xFB\xAF |0 + \xFB\xB0 |0 + \xFB\xB1 |0 + \xFB\xB2 |0 + \xFB\xB3 |0 + \xFB\xB4 |0 + \xFB\xB5 |0 + \xFB\xB6 |0 + \xFB\xB7 |0 + \xFB\xB8 |0 + \xFB\xB9 |0 + \xFB\xBA |0 + \xFB\xBB |0 + \xFB\xBC |0 + \xFB\xBD |0 + \xFB\xBE |0 + \xFB\xBF |0 + \xFB\xC0 |0 + \xFB\xC1 |0 + \xFB\xC2 |0 + \xFB\xC3 |0 + \xFB\xC4 |0 + \xFB\xC5 |0 + \xFB\xC6 |0 + \xFB\xC7 |0 + \xFB\xC8 |0 + \xFB\xC9 |0 + \xFB\xCA |0 + \xFB\xCB |0 + \xFB\xCC |0 + \xFB\xCD |0 + \xFB\xCE |0 + \xFB\xCF |0 + \xFB\xD0 |0 + \xFB\xD1 |0 + \xFB\xD2 |0 + \xFB\xD3 |0 + \xFB\xD4 |0 + \xFB\xD5 |0 + \xFB\xD6 |0 + \xFB\xD7 |0 + \xFB\xD8 |0 + \xFB\xD9 |0 + \xFB\xDA |0 + \xFB\xDB |0 + \xFB\xDC |0 + \xFB\xDD |0 + \xFB\xDE |0 + \xFB\xDF |0 + \xFB\xE0 |0 + \xFB\xE1 |0 + \xFB\xE2 |0 + \xFB\xE3 |0 + \xFB\xE4 |0 + \xFB\xE5 |0 + \xFB\xE6 |0 + \xFB\xE7 |0 + \xFB\xE8 |0 + \xFB\xE9 |0 + \xFB\xEA |0 + \xFB\xEB |0 + \xFB\xEC |0 + \xFB\xED |0 + \xFB\xEE |0 + \xFB\xEF |0 + \xFB\xF0 |0 + \xFB\xF1 |0 + \xFB\xF2 |0 + \xFB\xF3 |0 + \xFB\xF4 |0 + \xFB\xF5 |0 + \xFB\xF6 |0 + \xFB\xF7 |0 + \xFB\xF8 |0 + \xFB\xF9 |0 + \xFB\xFA |0 + \xFB\xFB |0 + \xFB\xFC |0 + \xFB\xFD |0 + \xFB\xFE |0 + \xFC\xA1 |0 + \xFC\xA2 |0 + \xFC\xA3 |0 + \xFC\xA4 |0 + \xFC\xA5 |0 + \xFC\xA6 |0 + \xFC\xA7 |0 + \xFC\xA8 |0 + \xFC\xA9 |0 + \xFC\xAA |0 + \xFC\xAB |0 + \xFC\xAC |0 + \xFC\xAD |0 + \xFC\xAE |0 + \xFC\xAF |0 + \xFC\xB0 |0 + \xFC\xB1 |0 + \xFC\xB2 |0 + \xFC\xB3 |0 + \xFC\xB4 |0 + \xFC\xB5 |0 + \xFC\xB6 |0 + \xFC\xB7 |0 + \xFC\xB8 |0 + \xFC\xB9 |0 + \xFC\xBA |0 + \xFC\xBB |0 + \xFC\xBC |0 + \xFC\xBD |0 + \xFC\xBE |0 + \xFC\xBF |0 + \xFC\xC0 |0 + \xFC\xC1 |0 + \xFC\xC2 |0 + \xFC\xC3 |0 + \xFC\xC4 |0 + \xFC\xC5 |0 + \xFC\xC6 |0 + \xFC\xC7 |0 + \xFC\xC8 |0 + \xFC\xC9 |0 + \xFC\xCA |0 + \xFC\xCB |0 + \xFC\xCC |0 + \xFC\xCD |0 + \xFC\xCE |0 + \xFC\xCF |0 + \xFC\xD0 |0 + \xFC\xD1 |0 + \xFC\xD2 |0 + \xFC\xD3 |0 + \xFC\xD4 |0 + \xFC\xD5 |0 + \xFC\xD6 |0 + \xFC\xD7 |0 + \xFC\xD8 |0 + \xFC\xD9 |0 + \xFC\xDA |0 + \xFC\xDB |0 + \xFC\xDC |0 + \xFC\xDD |0 + \xFC\xDE |0 + \xFC\xDF |0 + \xFC\xE0 |0 + \xFC\xE1 |0 + \xFC\xE2 |0 + \xFC\xE3 |0 + \xFC\xE4 |0 + \xFC\xE5 |0 + \xFC\xE6 |0 + \xFC\xE7 |0 + \xFC\xE8 |0 + \xFC\xE9 |0 + \xFC\xEA |0 + \xFC\xEB |0 + \xFC\xEC |0 + \xFC\xED |0 + \xFC\xEE |0 + \xFC\xEF |0 + \xFC\xF0 |0 + \xFC\xF1 |0 + \xFC\xF2 |0 + \xFC\xF3 |0 + \xFC\xF4 |0 + \xFC\xF5 |0 + \xFC\xF6 |0 + \xFC\xF7 |0 + \xFC\xF8 |0 + \xFC\xF9 |0 + \xFC\xFA |0 + \xFC\xFB |0 + \xFC\xFC |0 + \xFC\xFD |0 + \xFC\xFE |0 + \xFD\xA1 |0 + \xFD\xA2 |0 + \xFD\xA3 |0 + \xFD\xA4 |0 + \xFD\xA5 |0 + \xFD\xA6 |0 + \xFD\xA7 |0 + \xFD\xA8 |0 + \xFD\xA9 |0 + \xFD\xAA |0 + \xFD\xAB |0 + \xFD\xAC |0 + \xFD\xAD |0 + \xFD\xAE |0 + \xFD\xAF |0 + \xFD\xB0 |0 + \xFD\xB1 |0 + \xFD\xB2 |0 + \xFD\xB3 |0 + \xFD\xB4 |0 + \xFD\xB5 |0 + \xFD\xB6 |0 + \xFD\xB7 |0 + \xFD\xB8 |0 + \xFD\xB9 |0 + \xFD\xBA |0 + \xFD\xBB |0 + \xFD\xBC |0 + \xFD\xBD |0 + \xFD\xBE |0 + \xFD\xBF |0 + \xFD\xC0 |0 + \xFD\xC1 |0 + \xFD\xC2 |0 + \xFD\xC3 |0 + \xFD\xC4 |0 + \xFD\xC5 |0 + \xFD\xC6 |0 + \xFD\xC7 |0 + \xFD\xC8 |0 + \xFD\xC9 |0 + \xFD\xCA |0 + \xFD\xCB |0 + \xFD\xCC |0 + \xFD\xCD |0 + \xFD\xCE |0 + \xFD\xCF |0 + \xFD\xD0 |0 + \xFD\xD1 |0 + \xFD\xD2 |0 + \xFD\xD3 |0 + \xFD\xD4 |0 + \xFD\xD5 |0 + \xFD\xD6 |0 + \xFD\xD7 |0 + \xFD\xD8 |0 + \xFD\xD9 |0 + \xFD\xDA |0 + \xFD\xDB |0 + \xFD\xDC |0 + \xFD\xDD |0 + \xFD\xDE |0 + \xFD\xDF |0 + \xFD\xE0 |0 + \xFD\xE1 |0 + \xFD\xE2 |0 + \xFD\xE3 |0 + \xFD\xE4 |0 + \xFD\xE5 |0 + \xFD\xE6 |0 + \xFD\xE7 |0 + \xFD\xE8 |0 + \xFD\xE9 |0 + \xFD\xEA |0 + \xFD\xEB |0 + \xFD\xEC |0 + \xFD\xED |0 + \xFD\xEE |0 + \xFD\xEF |0 + \xFD\xF0 |0 + \xFD\xF1 |0 + \xFD\xF2 |0 + \xFD\xF3 |0 + \xFD\xF4 |0 + \xFD\xF5 |0 + \xFD\xF6 |0 + \xFD\xF7 |0 + \xFD\xF8 |0 + \xFD\xF9 |0 + \xFD\xFA |0 + \xFD\xFB |0 + \xFD\xFC |0 + \xFD\xFD |0 + \xFD\xFE |0 + \xFE\xA1 |0 + \xFE\xA2 |0 + \xFE\xA3 |0 + \xFE\xA4 |0 + \xFE\xA5 |0 + \xFE\xA6 |0 + \xFE\xA7 |0 + \xFE\xA8 |0 + \xFE\xA9 |0 + \xFE\xAA |0 + \xFE\xAB |0 + \xFE\xAC |0 + \xFE\xAD |0 + \xFE\xAE |0 + \xFE\xAF |0 + \xFE\xB0 |0 + \xFE\xB1 |0 + \xFE\xB2 |0 + \xFE\xB3 |0 + \xFE\xB4 |0 + \xFE\xB5 |0 + \xFE\xB6 |0 + \xFE\xB7 |0 + \xFE\xB8 |0 + \xFE\xB9 |0 + \xFE\xBA |0 + \xFE\xBB |0 + \xFE\xBC |0 + \xFE\xBD |0 + \xFE\xBE |0 + \xFE\xBF |0 + \xFE\xC0 |0 + \xFE\xC1 |0 + \xFE\xC2 |0 + \xFE\xC3 |0 + \xFE\xC4 |0 + \xFE\xC5 |0 + \xFE\xC6 |0 + \xFE\xC7 |0 + \xFE\xC8 |0 + \xFE\xC9 |0 + \xFE\xCA |0 + \xFE\xCB |0 + \xFE\xCC |0 + \xFE\xCD |0 + \xFE\xCE |0 + \xFE\xCF |0 + \xFE\xD0 |0 + \xFE\xD1 |0 + \xFE\xD2 |0 + \xFE\xD3 |0 + \xFE\xD4 |0 + \xFE\xD5 |0 + \xFE\xD6 |0 + \xFE\xD7 |0 + \xFE\xD8 |0 + \xFE\xD9 |0 + \xFE\xDA |0 + \xFE\xDB |0 + \xFE\xDC |0 + \xFE\xDD |0 + \xFE\xDE |0 + \xFE\xDF |0 + \xFE\xE0 |0 + \xFE\xE1 |0 + \xFE\xE2 |0 + \xFE\xE3 |0 + \xFE\xE4 |0 + \xFE\xE5 |0 + \xFE\xE6 |0 + \xFE\xE7 |0 + \xFE\xE8 |0 + \xFE\xE9 |0 + \xFE\xEA |0 + \xFE\xEB |0 + \xFE\xEC |0 + \xFE\xED |0 + \xFE\xEE |0 + \xFE\xEF |0 + \xFE\xF0 |0 + \xFE\xF1 |0 + \xFE\xF2 |0 + \xFE\xF3 |0 + \xFE\xF4 |0 + \xFE\xF5 |0 + \xFE\xF6 |0 + \xFE\xF7 |0 + \xFE\xF8 |0 + \xFE\xF9 |0 + \xFE\xFA |0 + \xFE\xFB |0 + \xFE\xFC |0 + \xFE\xFD |0 + \xFE\xFE |0 + \x8F\xF5\xA1 |0 + \x8F\xF5\xA2 |0 + \x8F\xF5\xA3 |0 + \x8F\xF5\xA4 |0 + \x8F\xF5\xA5 |0 + \x8F\xF5\xA6 |0 + \x8F\xF5\xA7 |0 + \x8F\xF5\xA8 |0 + \x8F\xF5\xA9 |0 + \x8F\xF5\xAA |0 + \x8F\xF5\xAB |0 + \x8F\xF5\xAC |0 + \x8F\xF5\xAD |0 + \x8F\xF5\xAE |0 + \x8F\xF5\xAF |0 + \x8F\xF5\xB0 |0 + \x8F\xF5\xB1 |0 + \x8F\xF5\xB2 |0 + \x8F\xF5\xB3 |0 + \x8F\xF5\xB4 |0 + \x8F\xF5\xB5 |0 + \x8F\xF5\xB6 |0 + \x8F\xF5\xB7 |0 + \x8F\xF5\xB8 |0 + \x8F\xF5\xB9 |0 + \x8F\xF5\xBA |0 + \x8F\xF5\xBB |0 + \x8F\xF5\xBC |0 + \x8F\xF5\xBD |0 + \x8F\xF5\xBE |0 + \x8F\xF5\xBF |0 + \x8F\xF5\xC0 |0 + \x8F\xF5\xC1 |0 + \x8F\xF5\xC2 |0 + \x8F\xF5\xC3 |0 + \x8F\xF5\xC4 |0 + \x8F\xF5\xC5 |0 + \x8F\xF5\xC6 |0 + \x8F\xF5\xC7 |0 + \x8F\xF5\xC8 |0 + \x8F\xF5\xC9 |0 + \x8F\xF5\xCA |0 + \x8F\xF5\xCB |0 + \x8F\xF5\xCC |0 + \x8F\xF5\xCD |0 + \x8F\xF5\xCE |0 + \x8F\xF5\xCF |0 + \x8F\xF5\xD0 |0 + \x8F\xF5\xD1 |0 + \x8F\xF5\xD2 |0 + \x8F\xF5\xD3 |0 + \x8F\xF5\xD4 |0 + \x8F\xF5\xD5 |0 + \x8F\xF5\xD6 |0 + \x8F\xF5\xD7 |0 + \x8F\xF5\xD8 |0 + \x8F\xF5\xD9 |0 + \x8F\xF5\xDA |0 + \x8F\xF5\xDB |0 + \x8F\xF5\xDC |0 + \x8F\xF5\xDD |0 + \x8F\xF5\xDE |0 + \x8F\xF5\xDF |0 + \x8F\xF5\xE0 |0 + \x8F\xF5\xE1 |0 + \x8F\xF5\xE2 |0 + \x8F\xF5\xE3 |0 + \x8F\xF5\xE4 |0 + \x8F\xF5\xE5 |0 + \x8F\xF5\xE6 |0 + \x8F\xF5\xE7 |0 + \x8F\xF5\xE8 |0 + \x8F\xF5\xE9 |0 + \x8F\xF5\xEA |0 + \x8F\xF5\xEB |0 + \x8F\xF5\xEC |0 + \x8F\xF5\xED |0 + \x8F\xF5\xEE |0 + \x8F\xF5\xEF |0 + \x8F\xF5\xF0 |0 + \x8F\xF5\xF1 |0 + \x8F\xF5\xF2 |0 + \x8F\xF5\xF3 |0 + \x8F\xF5\xF4 |0 + \x8F\xF5\xF5 |0 + \x8F\xF5\xF6 |0 + \x8F\xF5\xF7 |0 + \x8F\xF5\xF8 |0 + \x8F\xF5\xF9 |0 + \x8F\xF5\xFA |0 + \x8F\xF5\xFB |0 + \x8F\xF5\xFC |0 + \x8F\xF5\xFD |0 + \x8F\xF5\xFE |0 + \x8F\xF6\xA1 |0 + \x8F\xF6\xA2 |0 + \x8F\xF6\xA3 |0 + \x8F\xF6\xA4 |0 + \x8F\xF6\xA5 |0 + \x8F\xF6\xA6 |0 + \x8F\xF6\xA7 |0 + \x8F\xF6\xA8 |0 + \x8F\xF6\xA9 |0 + \x8F\xF6\xAA |0 + \x8F\xF6\xAB |0 + \x8F\xF6\xAC |0 + \x8F\xF6\xAD |0 + \x8F\xF6\xAE |0 + \x8F\xF6\xAF |0 + \x8F\xF6\xB0 |0 + \x8F\xF6\xB1 |0 + \x8F\xF6\xB2 |0 + \x8F\xF6\xB3 |0 + \x8F\xF6\xB4 |0 + \x8F\xF6\xB5 |0 + \x8F\xF6\xB6 |0 + \x8F\xF6\xB7 |0 + \x8F\xF6\xB8 |0 + \x8F\xF6\xB9 |0 + \x8F\xF6\xBA |0 + \x8F\xF6\xBB |0 + \x8F\xF6\xBC |0 + \x8F\xF6\xBD |0 + \x8F\xF6\xBE |0 + \x8F\xF6\xBF |0 + \x8F\xF6\xC0 |0 + \x8F\xF6\xC1 |0 + \x8F\xF6\xC2 |0 + \x8F\xF6\xC3 |0 + \x8F\xF6\xC4 |0 + \x8F\xF6\xC5 |0 + \x8F\xF6\xC6 |0 + \x8F\xF6\xC7 |0 + \x8F\xF6\xC8 |0 + \x8F\xF6\xC9 |0 + \x8F\xF6\xCA |0 + \x8F\xF6\xCB |0 + \x8F\xF6\xCC |0 + \x8F\xF6\xCD |0 + \x8F\xF6\xCE |0 + \x8F\xF6\xCF |0 + \x8F\xF6\xD0 |0 + \x8F\xF6\xD1 |0 + \x8F\xF6\xD2 |0 + \x8F\xF6\xD3 |0 + \x8F\xF6\xD4 |0 + \x8F\xF6\xD5 |0 + \x8F\xF6\xD6 |0 + \x8F\xF6\xD7 |0 + \x8F\xF6\xD8 |0 + \x8F\xF6\xD9 |0 + \x8F\xF6\xDA |0 + \x8F\xF6\xDB |0 + \x8F\xF6\xDC |0 + \x8F\xF6\xDD |0 + \x8F\xF6\xDE |0 + \x8F\xF6\xDF |0 + \x8F\xF6\xE0 |0 + \x8F\xF6\xE1 |0 + \x8F\xF6\xE2 |0 + \x8F\xF6\xE3 |0 + \x8F\xF6\xE4 |0 + \x8F\xF6\xE5 |0 + \x8F\xF6\xE6 |0 + \x8F\xF6\xE7 |0 + \x8F\xF6\xE8 |0 + \x8F\xF6\xE9 |0 + \x8F\xF6\xEA |0 + \x8F\xF6\xEB |0 + \x8F\xF6\xEC |0 + \x8F\xF6\xED |0 + \x8F\xF6\xEE |0 + \x8F\xF6\xEF |0 + \x8F\xF6\xF0 |0 + \x8F\xF6\xF1 |0 + \x8F\xF6\xF2 |0 + \x8F\xF6\xF3 |0 + \x8F\xF6\xF4 |0 + \x8F\xF6\xF5 |0 + \x8F\xF6\xF6 |0 + \x8F\xF6\xF7 |0 + \x8F\xF6\xF8 |0 + \x8F\xF6\xF9 |0 + \x8F\xF6\xFA |0 + \x8F\xF6\xFB |0 + \x8F\xF6\xFC |0 + \x8F\xF6\xFD |0 + \x8F\xF6\xFE |0 + \x8F\xF7\xA1 |0 + \x8F\xF7\xA2 |0 + \x8F\xF7\xA3 |0 + \x8F\xF7\xA4 |0 + \x8F\xF7\xA5 |0 + \x8F\xF7\xA6 |0 + \x8F\xF7\xA7 |0 + \x8F\xF7\xA8 |0 + \x8F\xF7\xA9 |0 + \x8F\xF7\xAA |0 + \x8F\xF7\xAB |0 + \x8F\xF7\xAC |0 + \x8F\xF7\xAD |0 + \x8F\xF7\xAE |0 + \x8F\xF7\xAF |0 + \x8F\xF7\xB0 |0 + \x8F\xF7\xB1 |0 + \x8F\xF7\xB2 |0 + \x8F\xF7\xB3 |0 + \x8F\xF7\xB4 |0 + \x8F\xF7\xB5 |0 + \x8F\xF7\xB6 |0 + \x8F\xF7\xB7 |0 + \x8F\xF7\xB8 |0 + \x8F\xF7\xB9 |0 + \x8F\xF7\xBA |0 + \x8F\xF7\xBB |0 + \x8F\xF7\xBC |0 + \x8F\xF7\xBD |0 + \x8F\xF7\xBE |0 + \x8F\xF7\xBF |0 + \x8F\xF7\xC0 |0 + \x8F\xF7\xC1 |0 + \x8F\xF7\xC2 |0 + \x8F\xF7\xC3 |0 + \x8F\xF7\xC4 |0 + \x8F\xF7\xC5 |0 + \x8F\xF7\xC6 |0 + \x8F\xF7\xC7 |0 + \x8F\xF7\xC8 |0 + \x8F\xF7\xC9 |0 + \x8F\xF7\xCA |0 + \x8F\xF7\xCB |0 + \x8F\xF7\xCC |0 + \x8F\xF7\xCD |0 + \x8F\xF7\xCE |0 + \x8F\xF7\xCF |0 + \x8F\xF7\xD0 |0 + \x8F\xF7\xD1 |0 + \x8F\xF7\xD2 |0 + \x8F\xF7\xD3 |0 + \x8F\xF7\xD4 |0 + \x8F\xF7\xD5 |0 + \x8F\xF7\xD6 |0 + \x8F\xF7\xD7 |0 + \x8F\xF7\xD8 |0 + \x8F\xF7\xD9 |0 + \x8F\xF7\xDA |0 + \x8F\xF7\xDB |0 + \x8F\xF7\xDC |0 + \x8F\xF7\xDD |0 + \x8F\xF7\xDE |0 + \x8F\xF7\xDF |0 + \x8F\xF7\xE0 |0 + \x8F\xF7\xE1 |0 + \x8F\xF7\xE2 |0 + \x8F\xF7\xE3 |0 + \x8F\xF7\xE4 |0 + \x8F\xF7\xE5 |0 + \x8F\xF7\xE6 |0 + \x8F\xF7\xE7 |0 + \x8F\xF7\xE8 |0 + \x8F\xF7\xE9 |0 + \x8F\xF7\xEA |0 + \x8F\xF7\xEB |0 + \x8F\xF7\xEC |0 + \x8F\xF7\xED |0 + \x8F\xF7\xEE |0 + \x8F\xF7\xEF |0 + \x8F\xF7\xF0 |0 + \x8F\xF7\xF1 |0 + \x8F\xF7\xF2 |0 + \x8F\xF7\xF3 |0 + \x8F\xF7\xF4 |0 + \x8F\xF7\xF5 |0 + \x8F\xF7\xF6 |0 + \x8F\xF7\xF7 |0 + \x8F\xF7\xF8 |0 + \x8F\xF7\xF9 |0 + \x8F\xF7\xFA |0 + \x8F\xF7\xFB |0 + \x8F\xF7\xFC |0 + \x8F\xF7\xFD |0 + \x8F\xF7\xFE |0 + \x8F\xF8\xA1 |0 + \x8F\xF8\xA2 |0 + \x8F\xF8\xA3 |0 + \x8F\xF8\xA4 |0 + \x8F\xF8\xA5 |0 + \x8F\xF8\xA6 |0 + \x8F\xF8\xA7 |0 + \x8F\xF8\xA8 |0 + \x8F\xF8\xA9 |0 + \x8F\xF8\xAA |0 + \x8F\xF8\xAB |0 + \x8F\xF8\xAC |0 + \x8F\xF8\xAD |0 + \x8F\xF8\xAE |0 + \x8F\xF8\xAF |0 + \x8F\xF8\xB0 |0 + \x8F\xF8\xB1 |0 + \x8F\xF8\xB2 |0 + \x8F\xF8\xB3 |0 + \x8F\xF8\xB4 |0 + \x8F\xF8\xB5 |0 + \x8F\xF8\xB6 |0 + \x8F\xF8\xB7 |0 + \x8F\xF8\xB8 |0 + \x8F\xF8\xB9 |0 + \x8F\xF8\xBA |0 + \x8F\xF8\xBB |0 + \x8F\xF8\xBC |0 + \x8F\xF8\xBD |0 + \x8F\xF8\xBE |0 + \x8F\xF8\xBF |0 + \x8F\xF8\xC0 |0 + \x8F\xF8\xC1 |0 + \x8F\xF8\xC2 |0 + \x8F\xF8\xC3 |0 + \x8F\xF8\xC4 |0 + \x8F\xF8\xC5 |0 + \x8F\xF8\xC6 |0 + \x8F\xF8\xC7 |0 + \x8F\xF8\xC8 |0 + \x8F\xF8\xC9 |0 + \x8F\xF8\xCA |0 + \x8F\xF8\xCB |0 + \x8F\xF8\xCC |0 + \x8F\xF8\xCD |0 + \x8F\xF8\xCE |0 + \x8F\xF8\xCF |0 + \x8F\xF8\xD0 |0 + \x8F\xF8\xD1 |0 + \x8F\xF8\xD2 |0 + \x8F\xF8\xD3 |0 + \x8F\xF8\xD4 |0 + \x8F\xF8\xD5 |0 + \x8F\xF8\xD6 |0 + \x8F\xF8\xD7 |0 + \x8F\xF8\xD8 |0 + \x8F\xF8\xD9 |0 + \x8F\xF8\xDA |0 + \x8F\xF8\xDB |0 + \x8F\xF8\xDC |0 + \x8F\xF8\xDD |0 + \x8F\xF8\xDE |0 + \x8F\xF8\xDF |0 + \x8F\xF8\xE0 |0 + \x8F\xF8\xE1 |0 + \x8F\xF8\xE2 |0 + \x8F\xF8\xE3 |0 + \x8F\xF8\xE4 |0 + \x8F\xF8\xE5 |0 + \x8F\xF8\xE6 |0 + \x8F\xF8\xE7 |0 + \x8F\xF8\xE8 |0 + \x8F\xF8\xE9 |0 + \x8F\xF8\xEA |0 + \x8F\xF8\xEB |0 + \x8F\xF8\xEC |0 + \x8F\xF8\xED |0 + \x8F\xF8\xEE |0 + \x8F\xF8\xEF |0 + \x8F\xF8\xF0 |0 + \x8F\xF8\xF1 |0 + \x8F\xF8\xF2 |0 + \x8F\xF8\xF3 |0 + \x8F\xF8\xF4 |0 + \x8F\xF8\xF5 |0 + \x8F\xF8\xF6 |0 + \x8F\xF8\xF7 |0 + \x8F\xF8\xF8 |0 + \x8F\xF8\xF9 |0 + \x8F\xF8\xFA |0 + \x8F\xF8\xFB |0 + \x8F\xF8\xFC |0 + \x8F\xF8\xFD |0 + \x8F\xF8\xFE |0 + \x8F\xF9\xA1 |0 + \x8F\xF9\xA2 |0 + \x8F\xF9\xA3 |0 + \x8F\xF9\xA4 |0 + \x8F\xF9\xA5 |0 + \x8F\xF9\xA6 |0 + \x8F\xF9\xA7 |0 + \x8F\xF9\xA8 |0 + \x8F\xF9\xA9 |0 + \x8F\xF9\xAA |0 + \x8F\xF9\xAB |0 + \x8F\xF9\xAC |0 + \x8F\xF9\xAD |0 + \x8F\xF9\xAE |0 + \x8F\xF9\xAF |0 + \x8F\xF9\xB0 |0 + \x8F\xF9\xB1 |0 + \x8F\xF9\xB2 |0 + \x8F\xF9\xB3 |0 + \x8F\xF9\xB4 |0 + \x8F\xF9\xB5 |0 + \x8F\xF9\xB6 |0 + \x8F\xF9\xB7 |0 + \x8F\xF9\xB8 |0 + \x8F\xF9\xB9 |0 + \x8F\xF9\xBA |0 + \x8F\xF9\xBB |0 + \x8F\xF9\xBC |0 + \x8F\xF9\xBD |0 + \x8F\xF9\xBE |0 + \x8F\xF9\xBF |0 + \x8F\xF9\xC0 |0 + \x8F\xF9\xC1 |0 + \x8F\xF9\xC2 |0 + \x8F\xF9\xC3 |0 + \x8F\xF9\xC4 |0 + \x8F\xF9\xC5 |0 + \x8F\xF9\xC6 |0 + \x8F\xF9\xC7 |0 + \x8F\xF9\xC8 |0 + \x8F\xF9\xC9 |0 + \x8F\xF9\xCA |0 + \x8F\xF9\xCB |0 + \x8F\xF9\xCC |0 + \x8F\xF9\xCD |0 + \x8F\xF9\xCE |0 + \x8F\xF9\xCF |0 + \x8F\xF9\xD0 |0 + \x8F\xF9\xD1 |0 + \x8F\xF9\xD2 |0 + \x8F\xF9\xD3 |0 + \x8F\xF9\xD4 |0 + \x8F\xF9\xD5 |0 + \x8F\xF9\xD6 |0 + \x8F\xF9\xD7 |0 + \x8F\xF9\xD8 |0 + \x8F\xF9\xD9 |0 + \x8F\xF9\xDA |0 + \x8F\xF9\xDB |0 + \x8F\xF9\xDC |0 + \x8F\xF9\xDD |0 + \x8F\xF9\xDE |0 + \x8F\xF9\xDF |0 + \x8F\xF9\xE0 |0 + \x8F\xF9\xE1 |0 + \x8F\xF9\xE2 |0 + \x8F\xF9\xE3 |0 + \x8F\xF9\xE4 |0 + \x8F\xF9\xE5 |0 + \x8F\xF9\xE6 |0 + \x8F\xF9\xE7 |0 + \x8F\xF9\xE8 |0 + \x8F\xF9\xE9 |0 + \x8F\xF9\xEA |0 + \x8F\xF9\xEB |0 + \x8F\xF9\xEC |0 + \x8F\xF9\xED |0 + \x8F\xF9\xEE |0 + \x8F\xF9\xEF |0 + \x8F\xF9\xF0 |0 + \x8F\xF9\xF1 |0 + \x8F\xF9\xF2 |0 + \x8F\xF9\xF3 |0 + \x8F\xF9\xF4 |0 + \x8F\xF9\xF5 |0 + \x8F\xF9\xF6 |0 + \x8F\xF9\xF7 |0 + \x8F\xF9\xF8 |0 + \x8F\xF9\xF9 |0 + \x8F\xF9\xFA |0 + \x8F\xF9\xFB |0 + \x8F\xF9\xFC |0 + \x8F\xF9\xFD |0 + \x8F\xF9\xFE |0 + \x8F\xFA\xA1 |0 + \x8F\xFA\xA2 |0 + \x8F\xFA\xA3 |0 + \x8F\xFA\xA4 |0 + \x8F\xFA\xA5 |0 + \x8F\xFA\xA6 |0 + \x8F\xFA\xA7 |0 + \x8F\xFA\xA8 |0 + \x8F\xFA\xA9 |0 + \x8F\xFA\xAA |0 + \x8F\xFA\xAB |0 + \x8F\xFA\xAC |0 + \x8F\xFA\xAD |0 + \x8F\xFA\xAE |0 + \x8F\xFA\xAF |0 + \x8F\xFA\xB0 |0 + \x8F\xFA\xB1 |0 + \x8F\xFA\xB2 |0 + \x8F\xFA\xB3 |0 + \x8F\xFA\xB4 |0 + \x8F\xFA\xB5 |0 + \x8F\xFA\xB6 |0 + \x8F\xFA\xB7 |0 + \x8F\xFA\xB8 |0 + \x8F\xFA\xB9 |0 + \x8F\xFA\xBA |0 + \x8F\xFA\xBB |0 + \x8F\xFA\xBC |0 + \x8F\xFA\xBD |0 + \x8F\xFA\xBE |0 + \x8F\xFA\xBF |0 + \x8F\xFA\xC0 |0 + \x8F\xFA\xC1 |0 + \x8F\xFA\xC2 |0 + \x8F\xFA\xC3 |0 + \x8F\xFA\xC4 |0 + \x8F\xFA\xC5 |0 + \x8F\xFA\xC6 |0 + \x8F\xFA\xC7 |0 + \x8F\xFA\xC8 |0 + \x8F\xFA\xC9 |0 + \x8F\xFA\xCA |0 + \x8F\xFA\xCB |0 + \x8F\xFA\xCC |0 + \x8F\xFA\xCD |0 + \x8F\xFA\xCE |0 + \x8F\xFA\xCF |0 + \x8F\xFA\xD0 |0 + \x8F\xFA\xD1 |0 + \x8F\xFA\xD2 |0 + \x8F\xFA\xD3 |0 + \x8F\xFA\xD4 |0 + \x8F\xFA\xD5 |0 + \x8F\xFA\xD6 |0 + \x8F\xFA\xD7 |0 + \x8F\xFA\xD8 |0 + \x8F\xFA\xD9 |0 + \x8F\xFA\xDA |0 + \x8F\xFA\xDB |0 + \x8F\xFA\xDC |0 + \x8F\xFA\xDD |0 + \x8F\xFA\xDE |0 + \x8F\xFA\xDF |0 + \x8F\xFA\xE0 |0 + \x8F\xFA\xE1 |0 + \x8F\xFA\xE2 |0 + \x8F\xFA\xE3 |0 + \x8F\xFA\xE4 |0 + \x8F\xFA\xE5 |0 + \x8F\xFA\xE6 |0 + \x8F\xFA\xE7 |0 + \x8F\xFA\xE8 |0 + \x8F\xFA\xE9 |0 + \x8F\xFA\xEA |0 + \x8F\xFA\xEB |0 + \x8F\xFA\xEC |0 + \x8F\xFA\xED |0 + \x8F\xFA\xEE |0 + \x8F\xFA\xEF |0 + \x8F\xFA\xF0 |0 + \x8F\xFA\xF1 |0 + \x8F\xFA\xF2 |0 + \x8F\xFA\xF3 |0 + \x8F\xFA\xF4 |0 + \x8F\xFA\xF5 |0 + \x8F\xFA\xF6 |0 + \x8F\xFA\xF7 |0 + \x8F\xFA\xF8 |0 + \x8F\xFA\xF9 |0 + \x8F\xFA\xFA |0 + \x8F\xFA\xFB |0 + \x8F\xFA\xFC |0 + \x8F\xFA\xFD |0 + \x8F\xFA\xFE |0 + \x8F\xFB\xA1 |0 + \x8F\xFB\xA2 |0 + \x8F\xFB\xA3 |0 + \x8F\xFB\xA4 |0 + \x8F\xFB\xA5 |0 + \x8F\xFB\xA6 |0 + \x8F\xFB\xA7 |0 + \x8F\xFB\xA8 |0 + \x8F\xFB\xA9 |0 + \x8F\xFB\xAA |0 + \x8F\xFB\xAB |0 + \x8F\xFB\xAC |0 + \x8F\xFB\xAD |0 + \x8F\xFB\xAE |0 + \x8F\xFB\xAF |0 + \x8F\xFB\xB0 |0 + \x8F\xFB\xB1 |0 + \x8F\xFB\xB2 |0 + \x8F\xFB\xB3 |0 + \x8F\xFB\xB4 |0 + \x8F\xFB\xB5 |0 + \x8F\xFB\xB6 |0 + \x8F\xFB\xB7 |0 + \x8F\xFB\xB8 |0 + \x8F\xFB\xB9 |0 + \x8F\xFB\xBA |0 + \x8F\xFB\xBB |0 + \x8F\xFB\xBC |0 + \x8F\xFB\xBD |0 + \x8F\xFB\xBE |0 + \x8F\xFB\xBF |0 + \x8F\xFB\xC0 |0 + \x8F\xFB\xC1 |0 + \x8F\xFB\xC2 |0 + \x8F\xFB\xC3 |0 + \x8F\xFB\xC4 |0 + \x8F\xFB\xC5 |0 + \x8F\xFB\xC6 |0 + \x8F\xFB\xC7 |0 + \x8F\xFB\xC8 |0 + \x8F\xFB\xC9 |0 + \x8F\xFB\xCA |0 + \x8F\xFB\xCB |0 + \x8F\xFB\xCC |0 + \x8F\xFB\xCD |0 + \x8F\xFB\xCE |0 + \x8F\xFB\xCF |0 + \x8F\xFB\xD0 |0 + \x8F\xFB\xD1 |0 + \x8F\xFB\xD2 |0 + \x8F\xFB\xD3 |0 + \x8F\xFB\xD4 |0 + \x8F\xFB\xD5 |0 + \x8F\xFB\xD6 |0 + \x8F\xFB\xD7 |0 + \x8F\xFB\xD8 |0 + \x8F\xFB\xD9 |0 + \x8F\xFB\xDA |0 + \x8F\xFB\xDB |0 + \x8F\xFB\xDC |0 + \x8F\xFB\xDD |0 + \x8F\xFB\xDE |0 + \x8F\xFB\xDF |0 + \x8F\xFB\xE0 |0 + \x8F\xFB\xE1 |0 + \x8F\xFB\xE2 |0 + \x8F\xFB\xE3 |0 + \x8F\xFB\xE4 |0 + \x8F\xFB\xE5 |0 + \x8F\xFB\xE6 |0 + \x8F\xFB\xE7 |0 + \x8F\xFB\xE8 |0 + \x8F\xFB\xE9 |0 + \x8F\xFB\xEA |0 + \x8F\xFB\xEB |0 + \x8F\xFB\xEC |0 + \x8F\xFB\xED |0 + \x8F\xFB\xEE |0 + \x8F\xFB\xEF |0 + \x8F\xFB\xF0 |0 + \x8F\xFB\xF1 |0 + \x8F\xFB\xF2 |0 + \x8F\xFB\xF3 |0 + \x8F\xFB\xF4 |0 + \x8F\xFB\xF5 |0 + \x8F\xFB\xF6 |0 + \x8F\xFB\xF7 |0 + \x8F\xFB\xF8 |0 + \x8F\xFB\xF9 |0 + \x8F\xFB\xFA |0 + \x8F\xFB\xFB |0 + \x8F\xFB\xFC |0 + \x8F\xFB\xFD |0 + \x8F\xFB\xFE |0 + \x8F\xFC\xA1 |0 + \x8F\xFC\xA2 |0 + \x8F\xFC\xA3 |0 + \x8F\xFC\xA4 |0 + \x8F\xFC\xA5 |0 + \x8F\xFC\xA6 |0 + \x8F\xFC\xA7 |0 + \x8F\xFC\xA8 |0 + \x8F\xFC\xA9 |0 + \x8F\xFC\xAA |0 + \x8F\xFC\xAB |0 + \x8F\xFC\xAC |0 + \x8F\xFC\xAD |0 + \x8F\xFC\xAE |0 + \x8F\xFC\xAF |0 + \x8F\xFC\xB0 |0 + \x8F\xFC\xB1 |0 + \x8F\xFC\xB2 |0 + \x8F\xFC\xB3 |0 + \x8F\xFC\xB4 |0 + \x8F\xFC\xB5 |0 + \x8F\xFC\xB6 |0 + \x8F\xFC\xB7 |0 + \x8F\xFC\xB8 |0 + \x8F\xFC\xB9 |0 + \x8F\xFC\xBA |0 + \x8F\xFC\xBB |0 + \x8F\xFC\xBC |0 + \x8F\xFC\xBD |0 + \x8F\xFC\xBE |0 + \x8F\xFC\xBF |0 + \x8F\xFC\xC0 |0 + \x8F\xFC\xC1 |0 + \x8F\xFC\xC2 |0 + \x8F\xFC\xC3 |0 + \x8F\xFC\xC4 |0 + \x8F\xFC\xC5 |0 + \x8F\xFC\xC6 |0 + \x8F\xFC\xC7 |0 + \x8F\xFC\xC8 |0 + \x8F\xFC\xC9 |0 + \x8F\xFC\xCA |0 + \x8F\xFC\xCB |0 + \x8F\xFC\xCC |0 + \x8F\xFC\xCD |0 + \x8F\xFC\xCE |0 + \x8F\xFC\xCF |0 + \x8F\xFC\xD0 |0 + \x8F\xFC\xD1 |0 + \x8F\xFC\xD2 |0 + \x8F\xFC\xD3 |0 + \x8F\xFC\xD4 |0 + \x8F\xFC\xD5 |0 + \x8F\xFC\xD6 |0 + \x8F\xFC\xD7 |0 + \x8F\xFC\xD8 |0 + \x8F\xFC\xD9 |0 + \x8F\xFC\xDA |0 + \x8F\xFC\xDB |0 + \x8F\xFC\xDC |0 + \x8F\xFC\xDD |0 + \x8F\xFC\xDE |0 + \x8F\xFC\xDF |0 + \x8F\xFC\xE0 |0 + \x8F\xFC\xE1 |0 + \x8F\xFC\xE2 |0 + \x8F\xFC\xE3 |0 + \x8F\xFC\xE4 |0 + \x8F\xFC\xE5 |0 + \x8F\xFC\xE6 |0 + \x8F\xFC\xE7 |0 + \x8F\xFC\xE8 |0 + \x8F\xFC\xE9 |0 + \x8F\xFC\xEA |0 + \x8F\xFC\xEB |0 + \x8F\xFC\xEC |0 + \x8F\xFC\xED |0 + \x8F\xFC\xEE |0 + \x8F\xFC\xEF |0 + \x8F\xFC\xF0 |0 + \x8F\xFC\xF1 |0 + \x8F\xFC\xF2 |0 + \x8F\xFC\xF3 |0 + \x8F\xFC\xF4 |0 + \x8F\xFC\xF5 |0 + \x8F\xFC\xF6 |0 + \x8F\xFC\xF7 |0 + \x8F\xFC\xF8 |0 + \x8F\xFC\xF9 |0 + \x8F\xFC\xFA |0 + \x8F\xFC\xFB |0 + \x8F\xFC\xFC |0 + \x8F\xFC\xFD |0 + \x8F\xFC\xFE |0 + \x8F\xFD\xA1 |0 + \x8F\xFD\xA2 |0 + \x8F\xFD\xA3 |0 + \x8F\xFD\xA4 |0 + \x8F\xFD\xA5 |0 + \x8F\xFD\xA6 |0 + \x8F\xFD\xA7 |0 + \x8F\xFD\xA8 |0 + \x8F\xFD\xA9 |0 + \x8F\xFD\xAA |0 + \x8F\xFD\xAB |0 + \x8F\xFD\xAC |0 + \x8F\xFD\xAD |0 + \x8F\xFD\xAE |0 + \x8F\xFD\xAF |0 + \x8F\xFD\xB0 |0 + \x8F\xFD\xB1 |0 + \x8F\xFD\xB2 |0 + \x8F\xFD\xB3 |0 + \x8F\xFD\xB4 |0 + \x8F\xFD\xB5 |0 + \x8F\xFD\xB6 |0 + \x8F\xFD\xB7 |0 + \x8F\xFD\xB8 |0 + \x8F\xFD\xB9 |0 + \x8F\xFD\xBA |0 + \x8F\xFD\xBB |0 + \x8F\xFD\xBC |0 + \x8F\xFD\xBD |0 + \x8F\xFD\xBE |0 + \x8F\xFD\xBF |0 + \x8F\xFD\xC0 |0 + \x8F\xFD\xC1 |0 + \x8F\xFD\xC2 |0 + \x8F\xFD\xC3 |0 + \x8F\xFD\xC4 |0 + \x8F\xFD\xC5 |0 + \x8F\xFD\xC6 |0 + \x8F\xFD\xC7 |0 + \x8F\xFD\xC8 |0 + \x8F\xFD\xC9 |0 + \x8F\xFD\xCA |0 + \x8F\xFD\xCB |0 + \x8F\xFD\xCC |0 + \x8F\xFD\xCD |0 + \x8F\xFD\xCE |0 + \x8F\xFD\xCF |0 + \x8F\xFD\xD0 |0 + \x8F\xFD\xD1 |0 + \x8F\xFD\xD2 |0 + \x8F\xFD\xD3 |0 + \x8F\xFD\xD4 |0 + \x8F\xFD\xD5 |0 + \x8F\xFD\xD6 |0 + \x8F\xFD\xD7 |0 + \x8F\xFD\xD8 |0 + \x8F\xFD\xD9 |0 + \x8F\xFD\xDA |0 + \x8F\xFD\xDB |0 + \x8F\xFD\xDC |0 + \x8F\xFD\xDD |0 + \x8F\xFD\xDE |0 + \x8F\xFD\xDF |0 + \x8F\xFD\xE0 |0 + \x8F\xFD\xE1 |0 + \x8F\xFD\xE2 |0 + \x8F\xFD\xE3 |0 + \x8F\xFD\xE4 |0 + \x8F\xFD\xE5 |0 + \x8F\xFD\xE6 |0 + \x8F\xFD\xE7 |0 + \x8F\xFD\xE8 |0 + \x8F\xFD\xE9 |0 + \x8F\xFD\xEA |0 + \x8F\xFD\xEB |0 + \x8F\xFD\xEC |0 + \x8F\xFD\xED |0 + \x8F\xFD\xEE |0 + \x8F\xFD\xEF |0 + \x8F\xFD\xF0 |0 + \x8F\xFD\xF1 |0 + \x8F\xFD\xF2 |0 + \x8F\xFD\xF3 |0 + \x8F\xFD\xF4 |0 + \x8F\xFD\xF5 |0 + \x8F\xFD\xF6 |0 + \x8F\xFD\xF7 |0 + \x8F\xFD\xF8 |0 + \x8F\xFD\xF9 |0 + \x8F\xFD\xFA |0 + \x8F\xFD\xFB |0 + \x8F\xFD\xFC |0 + \x8F\xFD\xFD |0 + \x8F\xFD\xFE |0 + \x8F\xFE\xA1 |0 + \x8F\xFE\xA2 |0 + \x8F\xFE\xA3 |0 + \x8F\xFE\xA4 |0 + \x8F\xFE\xA5 |0 + \x8F\xFE\xA6 |0 + \x8F\xFE\xA7 |0 + \x8F\xFE\xA8 |0 + \x8F\xFE\xA9 |0 + \x8F\xFE\xAA |0 + \x8F\xFE\xAB |0 + \x8F\xFE\xAC |0 + \x8F\xFE\xAD |0 + \x8F\xFE\xAE |0 + \x8F\xFE\xAF |0 + \x8F\xFE\xB0 |0 + \x8F\xFE\xB1 |0 + \x8F\xFE\xB2 |0 + \x8F\xFE\xB3 |0 + \x8F\xFE\xB4 |0 + \x8F\xFE\xB5 |0 + \x8F\xFE\xB6 |0 + \x8F\xFE\xB7 |0 + \x8F\xFE\xB8 |0 + \x8F\xFE\xB9 |0 + \x8F\xFE\xBA |0 + \x8F\xFE\xBB |0 + \x8F\xFE\xBC |0 + \x8F\xFE\xBD |0 + \x8F\xFE\xBE |0 + \x8F\xFE\xBF |0 + \x8F\xFE\xC0 |0 + \x8F\xFE\xC1 |0 + \x8F\xFE\xC2 |0 + \x8F\xFE\xC3 |0 + \x8F\xFE\xC4 |0 + \x8F\xFE\xC5 |0 + \x8F\xFE\xC6 |0 + \x8F\xFE\xC7 |0 + \x8F\xFE\xC8 |0 + \x8F\xFE\xC9 |0 + \x8F\xFE\xCA |0 + \x8F\xFE\xCB |0 + \x8F\xFE\xCC |0 + \x8F\xFE\xCD |0 + \x8F\xFE\xCE |0 + \x8F\xFE\xCF |0 + \x8F\xFE\xD0 |0 + \x8F\xFE\xD1 |0 + \x8F\xFE\xD2 |0 + \x8F\xFE\xD3 |0 + \x8F\xFE\xD4 |0 + \x8F\xFE\xD5 |0 + \x8F\xFE\xD6 |0 + \x8F\xFE\xD7 |0 + \x8F\xFE\xD8 |0 + \x8F\xFE\xD9 |0 + \x8F\xFE\xDA |0 + \x8F\xFE\xDB |0 + \x8F\xFE\xDC |0 + \x8F\xFE\xDD |0 + \x8F\xFE\xDE |0 + \x8F\xFE\xDF |0 + \x8F\xFE\xE0 |0 + \x8F\xFE\xE1 |0 + \x8F\xFE\xE2 |0 + \x8F\xFE\xE3 |0 + \x8F\xFE\xE4 |0 + \x8F\xFE\xE5 |0 + \x8F\xFE\xE6 |0 + \x8F\xFE\xE7 |0 + \x8F\xFE\xE8 |0 + \x8F\xFE\xE9 |0 + \x8F\xFE\xEA |0 + \x8F\xFE\xEB |0 + \x8F\xFE\xEC |0 + \x8F\xFE\xED |0 + \x8F\xFE\xEE |0 + \x8F\xFE\xEF |0 + \x8F\xFE\xF0 |0 + \x8F\xFE\xF1 |0 + \x8F\xFE\xF2 |0 + \x8F\xFE\xF3 |0 + \x8F\xFE\xF4 |0 + \x8F\xFE\xF5 |0 + \x8F\xFE\xF6 |0 + \x8F\xFE\xF7 |0 + \x8F\xFE\xF8 |0 + \x8F\xFE\xF9 |0 + \x8F\xFE\xFA |0 + \x8F\xFE\xFB |0 + \x8F\xFE\xFC |0 + \x8F\xFE\xFD |0 + \x8F\xFE\xFE |0 + \x8F\xF3\xB8 |1 + \x8F\xF4\xB9 |0 + \x8F\xF4\xEB |0 + \x8F\xF4\xA7 |0 + \x8F\xF4\xAA |0 + \x8F\xF4\xAB |0 + \x8F\xF4\xB1 |0 + \x8F\xF4\xB8 |0 + \x8F\xF4\xBB |0 + \x8F\xF4\xBC |0 + \x8F\xF4\xC4 |0 + \x8F\xF4\xC5 |0 + \x8F\xF4\xC9 |0 + \x8F\xF4\xCC |0 + \x8F\xF4\xCD |0 + \x8F\xF4\xCE |0 + \x8F\xF4\xCF |0 + \x8F\xF4\xD1 |0 + \x8F\xF4\xD3 |0 + \x8F\xF4\xD6 |0 + \x8F\xF4\xD8 |0 + \x8F\xF4\xDA |0 + \x8F\xF4\xDB |0 + \x8F\xF4\xDE |0 + \x8F\xF4\xE2 |0 + \x8F\xF4\xE3 |0 + \x8F\xF4\xE4 |0 + \x8F\xF4\xE6 |0 + \x8F\xF4\xE8 |0 + \x8F\xF4\xE9 |0 + \x8F\xF4\xEC |0 + \x8F\xF4\xF1 |0 + \x8F\xF4\xF2 |0 + \x8F\xF4\xF3 |0 + \x8F\xF4\xF7 |0 + \xA1\xAA |0 + \x8F\xF3\xB6 |0 + \xA1\xF4 |0 + \xA1\xF0 |0 + \xA1\xF3 |0 + \xA1\xF5 |0 + \x8F\xF3\xB5 |0 + \xA1\xCA |0 + \xA1\xCB |0 + \xA1\xF6 |0 + \xA1\xDC |0 + \xA1\xA4 |0 + \xA1\xDD |1 + \xA1\xA5 |0 + \xA1\xBF |0 + \xA3\xB0 |0 + \xA3\xB1 |0 + \xA3\xB2 |0 + \xA3\xB3 |0 + \xA3\xB4 |0 + \xA3\xB5 |0 + \xA3\xB6 |0 + \xA3\xB7 |0 + \xA3\xB8 |0 + \xA3\xB9 |0 + \xA1\xA7 |0 + \xA1\xA8 |0 + \xA1\xE3 |0 + \xA1\xE1 |0 + \xA1\xE4 |0 + \xA1\xA9 |0 + \xA1\xF7 |0 + \xA3\xC1 |0 + \xA3\xC2 |0 + \xA3\xC3 |0 + \xA3\xC4 |0 + \xA3\xC5 |0 + \xA3\xC6 |0 + \xA3\xC7 |0 + \xA3\xC8 |0 + \xA3\xC9 |0 + \xA3\xCA |0 + \xA3\xCB |0 + \xA3\xCC |0 + \xA3\xCD |0 + \xA3\xCE |0 + \xA3\xCF |0 + \xA3\xD0 |0 + \xA3\xD1 |0 + \xA3\xD2 |0 + \xA3\xD3 |0 + \xA3\xD4 |0 + \xA3\xD5 |0 + \xA3\xD6 |0 + \xA3\xD7 |0 + \xA3\xD8 |0 + \xA3\xD9 |0 + \xA3\xDA |0 + \xA1\xCE |0 + \xA1\xC0 |0 + \xA1\xCF |0 + \xA1\xB0 |0 + \xA1\xB2 |0 + \xA1\xAE |0 + \xA3\xE1 |0 + \xA3\xE2 |0 + \xA3\xE3 |0 + \xA3\xE4 |0 + \xA3\xE5 |0 + \xA3\xE6 |0 + \xA3\xE7 |0 + \xA3\xE8 |0 + \xA3\xE9 |0 + \xA3\xEA |0 + \xA3\xEB |0 + \xA3\xEC |0 + \xA3\xED |0 + \xA3\xEE |0 + \xA3\xEF |0 + \xA3\xF0 |0 + \xA3\xF1 |0 + \xA3\xF2 |0 + \xA3\xF3 |0 + \xA3\xF4 |0 + \xA3\xF5 |0 + \xA3\xF6 |0 + \xA3\xF7 |0 + \xA3\xF8 |0 + \xA3\xF9 |0 + \xA3\xFA |0 + \xA1\xD0 |0 + \xA1\xC3 |0 + \xA1\xD1 |0 + \x8F\xA2\xB7 |0 + \x8E\xA1 |0 + \x8E\xA2 |0 + \x8E\xA3 |0 + \x8E\xA4 |0 + \x8E\xA5 |0 + \x8E\xA6 |0 + \x8E\xA7 |0 + \x8E\xA8 |0 + \x8E\xA9 |0 + \x8E\xAA |0 + \x8E\xAB |0 + \x8E\xAC |0 + \x8E\xAD |0 + \x8E\xAE |0 + \x8E\xAF |0 + \x8E\xB0 |0 + \x8E\xB1 |0 + \x8E\xB2 |0 + \x8E\xB3 |0 + \x8E\xB4 |0 + \x8E\xB5 |0 + \x8E\xB6 |0 + \x8E\xB7 |0 + \x8E\xB8 |0 + \x8E\xB9 |0 + \x8E\xBA |0 + \x8E\xBB |0 + \x8E\xBC |0 + \x8E\xBD |0 + \x8E\xBE |0 + \x8E\xBF |0 + \x8E\xC0 |0 + \x8E\xC1 |0 + \x8E\xC2 |0 + \x8E\xC3 |0 + \x8E\xC4 |0 + \x8E\xC5 |0 + \x8E\xC6 |0 + \x8E\xC7 |0 + \x8E\xC8 |0 + \x8E\xC9 |0 + \x8E\xCA |0 + \x8E\xCB |0 + \x8E\xCC |0 + \x8E\xCD |0 + \x8E\xCE |0 + \x8E\xCF |0 + \x8E\xD0 |0 + \x8E\xD1 |0 + \x8E\xD2 |0 + \x8E\xD3 |0 + \x8E\xD4 |0 + \x8E\xD5 |0 + \x8E\xD6 |0 + \x8E\xD7 |0 + \x8E\xD8 |0 + \x8E\xD9 |0 + \x8E\xDA |0 + \x8E\xDB |0 + \x8E\xDC |0 + \x8E\xDD |0 + \x8E\xDE |0 + \x8E\xDF |0 + \xA1\xF1 |0 + \xA1\xF2 |0 + \xA2\xCC |0 + \xA1\xB1 |0 + \x8F\xA2\xC3 |1 + \xA1\xEF |0 + \x1A |1 + \x1A |1 + \x1A |1 + \x1A |1 + \x1A |1 + \x1A |1 + \x1A |1 +END CHARMAP diff --git a/icuSources/data/mappings/ibm-970_P110-1995.ucm b/icuSources/data/mappings/ibm-970_P110-1995.ucm index 7eb1de70..b465ccf2 100644 --- a/icuSources/data/mappings/ibm-970_P110-1995.ucm +++ b/icuSources/data/mappings/ibm-970_P110-1995.ucm @@ -164,8 +164,6 @@ CHARMAP \x8B |0 \x8C |0 \x8D |0 - \x1A |2 - \x1A |2 \x90 |0 \x91 |0 \x92 |0 @@ -182,102 +180,35 @@ CHARMAP \x9D |0 \x9E |0 \x9F |0 - \x1A |2 \xA2\xAE |0 - \x1A |2 - \x1A |2 \xA2\xB4 |0 - \x1A |2 - \x1A |2 \xA1\xD7 |0 \xA1\xA7 |0 - \x1A |2 \xA8\xA3 |0 - \x1A |2 - \x1A |2 - \xA1\xA9 |1 - \x1A |2 - \x1A |2 \xA1\xC6 |0 \xA1\xBE |0 \xA9\xF7 |0 \xA9\xF8 |0 \xA2\xA5 |0 - \x1A |2 \xA2\xD2 |0 - \xA1\xA4 |1 \xA2\xAC |0 \xA9\xF6 |0 \xA8\xAC |0 - \x1A |2 \xA8\xF9 |0 \xA8\xF6 |0 \xA8\xFA |0 \xA2\xAF |0 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 \xA8\xA1 |0 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 \xA8\xA2 |0 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 \xA1\xBF |0 \xA8\xAA |0 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 \xA8\xAD |0 \xA9\xAC |0 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 \xA9\xA1 |0 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 \xA9\xA3 |0 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 \xA1\xC0 |0 \xA9\xAA |0 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 - \x1A |2 \xA9\xAD |0 - \x1A |2 \xA9\xA2 |0 \xA8\xA4 |0 \xA9\xA4 |0 @@ -420,7 +351,6 @@ CHARMAP \xAC\xD7 |0 \xA1\xA9 |0 \xA1\xAA |0 - \xA1\xAA |1 \xA1\xAE |0 \xA1\xAF |0 \xA1\xB0 |0 @@ -433,7 +363,6 @@ CHARMAP \xA1\xC7 |0 \xA1\xC8 |0 \xA1\xD8 |0 - \x1A |2 \xA9\xF9 |0 \xA9\xFA |0 \xA9\xFB |0 @@ -509,7 +438,6 @@ CHARMAP \xA2\xB1 |0 \xA1\xC5 |0 \xA1\xF1 |0 - \xA1\xAD |1 \xA1\xEF |0 \xA1\xD6 |0 \xA1\xC1 |0 @@ -522,7 +450,6 @@ CHARMAP \xA1\xF9 |0 \xA1\xF6 |0 \xA1\xF7 |0 - \xA2\xC1 |1 \xA1\xD1 |0 \xA1\xD2 |0 \xA8\xE7 |0 @@ -8660,6 +8587,88 @@ CHARMAP \xA3\xFB |0 \xA3\xFC |0 \xA3\xFD |0 + \xA1\xCB |0 + \xA1\xCC |0 + \xA1\xFE |0 + \xA3\xFE |0 + \xA1\xCD |0 + \xA3\xDC |0 +END CHARMAP + +CHARMAP + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \xA1\xA9 |1 + \x1A |2 + \x1A |2 + \x1A |2 + \xA1\xA4 |1 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \x1A |2 + \xA1\xAA |1 + \x1A |2 + \xA1\xAD |1 + \xA2\xC1 |1 \xA2\xA6 |1 \x1A |2 \x1A |2 @@ -8713,10 +8722,4 @@ CHARMAP \x1A |2 \x1A |2 \x1A |2 - \xA1\xCB |0 - \xA1\xCC |0 - \xA1\xFE |0 - \xA3\xFE |0 - \xA1\xCD |0 - \xA3\xDC |0 END CHARMAP diff --git a/icuSources/data/mappings/ibm-971_P100-1995.ucm b/icuSources/data/mappings/ibm-971_P100-1995.ucm new file mode 100644 index 00000000..04f4120e --- /dev/null +++ b/icuSources/data/mappings/ibm-971_P100-1995.ucm @@ -0,0 +1,8438 @@ +# *************************************************************************** +# * +# * Copyright (C) 1995-2003, International Business Machines +# * Corporation and others. All Rights Reserved. +# * +# *************************************************************************** +# +# File created by rptp2ucm (compiled on Dec 3 2002) +# from source files 34B003CB.RPMAP100 and 03CB34B0.TPMAP100 +# + "ibm-971_P100-1995" + "AXXXX" + 2 + 2 + "DBCS" + \xAF\xFE + "ASCII" + "ibm-971_VPUA" + +# build an extension-only (delta) .cnv file +# requires the base .cnv file at runtime + "ibm-970_P110-1995" + +CHARMAP + \xA2\xAE |0 + \xA2\xB4 |0 + \xA1\xD7 |0 + \xA1\xA7 |0 + \xA8\xA3 |0 + \xA1\xC6 |0 + \xA1\xBE |0 + \xA9\xF7 |0 + \xA9\xF8 |0 + \xA2\xA5 |0 + \xA2\xD2 |0 + \xA2\xAC |0 + \xA9\xF6 |0 + \xA8\xAC |0 + \xA8\xF9 |0 + \xA8\xF6 |0 + \xA8\xFA |0 + \xA2\xAF |0 + \xA8\xA1 |0 + \xA8\xA2 |0 + \xA1\xBF |0 + \xA8\xAA |0 + \xA8\xAD |0 + \xA9\xAC |0 + \xA9\xA1 |0 + \xA9\xA3 |0 + \xA1\xC0 |0 + \xA9\xAA |0 + \xA9\xAD |0 + \xA9\xA2 |0 + \xA8\xA4 |0 + \xA9\xA4 |0 + \xA9\xA5 |0 + \xA8\xA6 |0 + \xA9\xA6 |0 + \xA9\xA7 |0 + \xA8\xA8 |0 + \xA9\xA8 |0 + \xA8\xA9 |0 + \xA9\xA9 |0 + \xA9\xB0 |0 + \xA8\xAF |0 + \xA9\xAF |0 + \xA8\xAB |0 + \xA9\xAB |0 + \xA8\xAE |0 + \xA9\xAE |0 + \xA2\xA7 |0 + \xA2\xB0 |0 + \xA2\xA8 |0 + \xA2\xAB |0 + \xA2\xAA |0 + \xA2\xAD |0 + \xA2\xA6 |0 + \xA2\xA9 |0 + \xA5\xC1 |0 + \xA5\xC2 |0 + \xA5\xC3 |0 + \xA5\xC4 |0 + \xA5\xC5 |0 + \xA5\xC6 |0 + \xA5\xC7 |0 + \xA5\xC8 |0 + \xA5\xC9 |0 + \xA5\xCA |0 + \xA5\xCB |0 + \xA5\xCC |0 + \xA5\xCD |0 + \xA5\xCE |0 + \xA5\xCF |0 + \xA5\xD0 |0 + \xA5\xD1 |0 + \xA5\xD2 |0 + \xA5\xD3 |0 + \xA5\xD4 |0 + \xA5\xD5 |0 + \xA5\xD6 |0 + \xA5\xD7 |0 + \xA5\xD8 |0 + \xA5\xE1 |0 + \xA5\xE2 |0 + \xA5\xE3 |0 + \xA5\xE4 |0 + \xA5\xE5 |0 + \xA5\xE6 |0 + \xA5\xE7 |0 + \xA5\xE8 |0 + \xA5\xE9 |0 + \xA5\xEA |0 + \xA5\xEB |0 + \xA5\xEC |0 + \xA5\xED |0 + \xA5\xEE |0 + \xA5\xEF |0 + \xA5\xF0 |0 + \xA5\xF1 |0 + \xA5\xF2 |0 + \xA5\xF3 |0 + \xA5\xF4 |0 + \xA5\xF5 |0 + \xA5\xF6 |0 + \xA5\xF7 |0 + \xA5\xF8 |0 + \xAC\xA7 |0 + \xAC\xA1 |0 + \xAC\xA2 |0 + \xAC\xA3 |0 + \xAC\xA4 |0 + \xAC\xA5 |0 + \xAC\xA6 |0 + \xAC\xA8 |0 + \xAC\xA9 |0 + \xAC\xAA |0 + \xAC\xAB |0 + \xAC\xAC |0 + \xAC\xAD |0 + \xAC\xAE |0 + \xAC\xAF |0 + \xAC\xB0 |0 + \xAC\xB1 |0 + \xAC\xB2 |0 + \xAC\xB3 |0 + \xAC\xB4 |0 + \xAC\xB5 |0 + \xAC\xB6 |0 + \xAC\xB7 |0 + \xAC\xB8 |0 + \xAC\xB9 |0 + \xAC\xBA |0 + \xAC\xBB |0 + \xAC\xBC |0 + \xAC\xBD |0 + \xAC\xBE |0 + \xAC\xBF |0 + \xAC\xC0 |0 + \xAC\xC1 |0 + \xAC\xD1 |0 + \xAC\xD2 |0 + \xAC\xD3 |0 + \xAC\xD4 |0 + \xAC\xD5 |0 + \xAC\xD6 |0 + \xAC\xD8 |0 + \xAC\xD9 |0 + \xAC\xDA |0 + \xAC\xDB |0 + \xAC\xDC |0 + \xAC\xDD |0 + \xAC\xDE |0 + \xAC\xDF |0 + \xAC\xE0 |0 + \xAC\xE1 |0 + \xAC\xE2 |0 + \xAC\xE3 |0 + \xAC\xE4 |0 + \xAC\xE5 |0 + \xAC\xE6 |0 + \xAC\xE7 |0 + \xAC\xE8 |0 + \xAC\xE9 |0 + \xAC\xEA |0 + \xAC\xEB |0 + \xAC\xEC |0 + \xAC\xED |0 + \xAC\xEE |0 + \xAC\xEF |0 + \xAC\xF0 |0 + \xAC\xF1 |0 + \xAC\xD7 |0 + \xA1\xA9 |0 + \xA1\xAA |0 + \xA1\xAE |0 + \xA1\xAF |0 + \xA1\xB0 |0 + \xA1\xB1 |0 + \xA2\xD3 |0 + \xA2\xD4 |0 + \xA1\xA5 |0 + \xA1\xA6 |0 + \xA2\xB6 |0 + \xA1\xC7 |0 + \xA1\xC8 |0 + \xA1\xD8 |0 + \xA9\xF9 |0 + \xA9\xFA |0 + \xA9\xFB |0 + \xA9\xFC |0 + \xA9\xFD |0 + \xA9\xFE |0 + \xA3\xDC |1 + \xA1\xC9 |0 + \xA2\xB5 |0 + \xA7\xA4 |0 + \xA2\xE0 |0 + \xA2\xE5 |0 + \xA2\xE2 |0 + \xA7\xD9 |0 + \xA1\xCA |0 + \xA8\xF7 |0 + \xA8\xF8 |0 + \xA8\xFB |0 + \xA8\xFC |0 + \xA8\xFD |0 + \xA8\xFE |0 + \xA5\xB0 |0 + \xA5\xB1 |0 + \xA5\xB2 |0 + \xA5\xB3 |0 + \xA5\xB4 |0 + \xA5\xB5 |0 + \xA5\xB6 |0 + \xA5\xB7 |0 + \xA5\xB8 |0 + \xA5\xB9 |0 + \xA5\xA1 |0 + \xA5\xA2 |0 + \xA5\xA3 |0 + \xA5\xA4 |0 + \xA5\xA5 |0 + \xA5\xA6 |0 + \xA5\xA7 |0 + \xA5\xA8 |0 + \xA5\xA9 |0 + \xA5\xAA |0 + \xA1\xE7 |0 + \xA1\xE8 |0 + \xA1\xE6 |0 + \xA1\xE9 |0 + \xA1\xEA |0 + \xA2\xD5 |0 + \xA2\xD8 |0 + \xA2\xD6 |0 + \xA2\xD9 |0 + \xA2\xD7 |0 + \xA2\xA1 |0 + \xA2\xA2 |0 + \xA2\xA3 |0 + \xA1\xD3 |0 + \xA2\xA4 |0 + \xA1\xD4 |0 + \xA1\xF4 |0 + \xA1\xF5 |0 + \xA2\xB3 |0 + \xA2\xB2 |0 + \xA1\xEE |0 + \xA1\xF0 |0 + \xA1\xC4 |0 + \xA1\xD0 |0 + \xA1\xAB |0 + \xA1\xFC |0 + \xA1\xFD |0 + \xA1\xFB |0 + \xA1\xFA |0 + \xA1\xF2 |0 + \xA1\xF3 |0 + \xA2\xB1 |0 + \xA1\xC5 |0 + \xA1\xF1 |0 + \xA1\xEF |0 + \xA1\xD6 |0 + \xA1\xC1 |0 + \xA1\xD5 |0 + \xA1\xC2 |0 + \xA1\xC3 |0 + \xA1\xEC |0 + \xA1\xED |0 + \xA1\xF8 |0 + \xA1\xF9 |0 + \xA1\xF6 |0 + \xA1\xF7 |0 + \xA1\xD1 |0 + \xA1\xD2 |0 + \xA8\xE7 |0 + \xA8\xE8 |0 + \xA8\xE9 |0 + \xA8\xEA |0 + \xA8\xEB |0 + \xA8\xEC |0 + \xA8\xED |0 + \xA8\xEE |0 + \xA8\xEF |0 + \xA8\xF0 |0 + \xA8\xF1 |0 + \xA8\xF2 |0 + \xA8\xF3 |0 + \xA8\xF4 |0 + \xA8\xF5 |0 + \xA9\xE7 |0 + \xA9\xE8 |0 + \xA9\xE9 |0 + \xA9\xEA |0 + \xA9\xEB |0 + \xA9\xEC |0 + \xA9\xED |0 + \xA9\xEE |0 + \xA9\xEF |0 + \xA9\xF0 |0 + \xA9\xF1 |0 + \xA9\xF2 |0 + \xA9\xF3 |0 + \xA9\xF4 |0 + \xA9\xF5 |0 + \xA9\xCD |0 + \xA9\xCE |0 + \xA9\xCF |0 + \xA9\xD0 |0 + \xA9\xD1 |0 + \xA9\xD2 |0 + \xA9\xD3 |0 + \xA9\xD4 |0 + \xA9\xD5 |0 + \xA9\xD6 |0 + \xA9\xD7 |0 + \xA9\xD8 |0 + \xA9\xD9 |0 + \xA9\xDA |0 + \xA9\xDB |0 + \xA9\xDC |0 + \xA9\xDD |0 + \xA9\xDE |0 + \xA9\xDF |0 + \xA9\xE0 |0 + \xA9\xE1 |0 + \xA9\xE2 |0 + \xA9\xE3 |0 + \xA9\xE4 |0 + \xA9\xE5 |0 + \xA9\xE6 |0 + \xA8\xCD |0 + \xA8\xCE |0 + \xA8\xCF |0 + \xA8\xD0 |0 + \xA8\xD1 |0 + \xA8\xD2 |0 + \xA8\xD3 |0 + \xA8\xD4 |0 + \xA8\xD5 |0 + \xA8\xD6 |0 + \xA8\xD7 |0 + \xA8\xD8 |0 + \xA8\xD9 |0 + \xA8\xDA |0 + \xA8\xDB |0 + \xA8\xDC |0 + \xA8\xDD |0 + \xA8\xDE |0 + \xA8\xDF |0 + \xA8\xE0 |0 + \xA8\xE1 |0 + \xA8\xE2 |0 + \xA8\xE3 |0 + \xA8\xE4 |0 + \xA8\xE5 |0 + \xA8\xE6 |0 + \xA6\xA1 |0 + \xA6\xAC |0 + \xA6\xA2 |0 + \xA6\xAD |0 + \xA6\xA3 |0 + \xA6\xC8 |0 + \xA6\xC7 |0 + \xA6\xAE |0 + \xA6\xA4 |0 + \xA6\xC2 |0 + \xA6\xC1 |0 + \xA6\xAF |0 + \xA6\xA6 |0 + \xA6\xC6 |0 + \xA6\xC5 |0 + \xA6\xB1 |0 + \xA6\xA5 |0 + \xA6\xC4 |0 + \xA6\xC3 |0 + \xA6\xB0 |0 + \xA6\xA7 |0 + \xA6\xBC |0 + \xA6\xC9 |0 + \xA6\xCA |0 + \xA6\xB7 |0 + \xA6\xCB |0 + \xA6\xCC |0 + \xA6\xB2 |0 + \xA6\xA9 |0 + \xA6\xBE |0 + \xA6\xCD |0 + \xA6\xCE |0 + \xA6\xB9 |0 + \xA6\xCF |0 + \xA6\xD0 |0 + \xA6\xB4 |0 + \xA6\xA8 |0 + \xA6\xD1 |0 + \xA6\xD2 |0 + \xA6\xB8 |0 + \xA6\xBD |0 + \xA6\xD3 |0 + \xA6\xD4 |0 + \xA6\xB3 |0 + \xA6\xAA |0 + \xA6\xD5 |0 + \xA6\xD6 |0 + \xA6\xBA |0 + \xA6\xBF |0 + \xA6\xD7 |0 + \xA6\xD8 |0 + \xA6\xB5 |0 + \xA6\xAB |0 + \xA6\xD9 |0 + \xA6\xDA |0 + \xA6\xBB |0 + \xA6\xDB |0 + \xA6\xDC |0 + \xA6\xC0 |0 + \xA6\xDD |0 + \xA6\xDE |0 + \xA6\xDF |0 + \xA6\xE0 |0 + \xA6\xE1 |0 + \xA6\xE2 |0 + \xA6\xE3 |0 + \xA6\xE4 |0 + \xA6\xB6 |0 + \xA2\xC6 |0 + \xA1\xE1 |0 + \xA1\xE0 |0 + \xA2\xC3 |0 + \xA2\xC7 |0 + \xA2\xC8 |0 + \xA2\xCB |0 + \xA2\xCA |0 + \xA2\xC9 |0 + \xA2\xCC |0 + \xA1\xE3 |0 + \xA1\xE2 |0 + \xA2\xBA |0 + \xA2\xB9 |0 + \xA1\xE5 |0 + \xA1\xE4 |0 + \xA2\xB8 |0 + \xA2\xB7 |0 + \xA1\xDF |0 + \xA1\xDE |0 + \xA2\xC2 |0 + \xA2\xC1 |0 + \xA1\xDB |0 + \xA1\xDD |0 + \xA1\xDC |0 + \xA2\xC4 |0 + \xA2\xC5 |0 + \xA1\xDA |0 + \xA1\xD9 |0 + \xA2\xCF |0 + \xA2\xCE |0 + \xA2\xD0 |0 + \xA2\xD1 |0 + \xA1\xCF |0 + \xA1\xCE |0 + \xA2\xBC |0 + \xA2\xBD |0 + \xA2\xC0 |0 + \xA2\xBB |0 + \xA2\xBE |0 + \xA2\xBF |0 + \xA2\xCD |0 + \xA2\xDB |0 + \xA2\xDC |0 + \xA2\xDD |0 + \xA2\xDA |0 + \xA1\xA1 |0 + \xA1\xA2 |0 + \xA1\xA3 |0 + \xA1\xA8 |0 + \xA1\xB4 |0 + \xA1\xB5 |0 + \xA1\xB6 |0 + \xA1\xB7 |0 + \xA1\xB8 |0 + \xA1\xB9 |0 + \xA1\xBA |0 + \xA1\xBB |0 + \xA1\xBC |0 + \xA1\xBD |0 + \xA1\xEB |0 + \xA1\xB2 |0 + \xA1\xB3 |0 + \xA1\xAD |0 + \xAA\xA1 |0 + \xAA\xA2 |0 + \xAA\xA3 |0 + \xAA\xA4 |0 + \xAA\xA5 |0 + \xAA\xA6 |0 + \xAA\xA7 |0 + \xAA\xA8 |0 + \xAA\xA9 |0 + \xAA\xAA |0 + \xAA\xAB |0 + \xAA\xAC |0 + \xAA\xAD |0 + \xAA\xAE |0 + \xAA\xAF |0 + \xAA\xB0 |0 + \xAA\xB1 |0 + \xAA\xB2 |0 + \xAA\xB3 |0 + \xAA\xB4 |0 + \xAA\xB5 |0 + \xAA\xB6 |0 + \xAA\xB7 |0 + \xAA\xB8 |0 + \xAA\xB9 |0 + \xAA\xBA |0 + \xAA\xBB |0 + \xAA\xBC |0 + \xAA\xBD |0 + \xAA\xBE |0 + \xAA\xBF |0 + \xAA\xC0 |0 + \xAA\xC1 |0 + \xAA\xC2 |0 + \xAA\xC3 |0 + \xAA\xC4 |0 + \xAA\xC5 |0 + \xAA\xC6 |0 + \xAA\xC7 |0 + \xAA\xC8 |0 + \xAA\xC9 |0 + \xAA\xCA |0 + \xAA\xCB |0 + \xAA\xCC |0 + \xAA\xCD |0 + \xAA\xCE |0 + \xAA\xCF |0 + \xAA\xD0 |0 + \xAA\xD1 |0 + \xAA\xD2 |0 + \xAA\xD3 |0 + \xAA\xD4 |0 + \xAA\xD5 |0 + \xAA\xD6 |0 + \xAA\xD7 |0 + \xAA\xD8 |0 + \xAA\xD9 |0 + \xAA\xDA |0 + \xAA\xDB |0 + \xAA\xDC |0 + \xAA\xDD |0 + \xAA\xDE |0 + \xAA\xDF |0 + \xAA\xE0 |0 + \xAA\xE1 |0 + \xAA\xE2 |0 + \xAA\xE3 |0 + \xAA\xE4 |0 + \xAA\xE5 |0 + \xAA\xE6 |0 + \xAA\xE7 |0 + \xAA\xE8 |0 + \xAA\xE9 |0 + \xAA\xEA |0 + \xAA\xEB |0 + \xAA\xEC |0 + \xAA\xED |0 + \xAA\xEE |0 + \xAA\xEF |0 + \xAA\xF0 |0 + \xAA\xF1 |0 + \xAA\xF2 |0 + \xAA\xF3 |0 + \xAB\xA1 |0 + \xAB\xA2 |0 + \xAB\xA3 |0 + \xAB\xA4 |0 + \xAB\xA5 |0 + \xAB\xA6 |0 + \xAB\xA7 |0 + \xAB\xA8 |0 + \xAB\xA9 |0 + \xAB\xAA |0 + \xAB\xAB |0 + \xAB\xAC |0 + \xAB\xAD |0 + \xAB\xAE |0 + \xAB\xAF |0 + \xAB\xB0 |0 + \xAB\xB1 |0 + \xAB\xB2 |0 + \xAB\xB3 |0 + \xAB\xB4 |0 + \xAB\xB5 |0 + \xAB\xB6 |0 + \xAB\xB7 |0 + \xAB\xB8 |0 + \xAB\xB9 |0 + \xAB\xBA |0 + \xAB\xBB |0 + \xAB\xBC |0 + \xAB\xBD |0 + \xAB\xBE |0 + \xAB\xBF |0 + \xAB\xC0 |0 + \xAB\xC1 |0 + \xAB\xC2 |0 + \xAB\xC3 |0 + \xAB\xC4 |0 + \xAB\xC5 |0 + \xAB\xC6 |0 + \xAB\xC7 |0 + \xAB\xC8 |0 + \xAB\xC9 |0 + \xAB\xCA |0 + \xAB\xCB |0 + \xAB\xCC |0 + \xAB\xCD |0 + \xAB\xCE |0 + \xAB\xCF |0 + \xAB\xD0 |0 + \xAB\xD1 |0 + \xAB\xD2 |0 + \xAB\xD3 |0 + \xAB\xD4 |0 + \xAB\xD5 |0 + \xAB\xD6 |0 + \xAB\xD7 |0 + \xAB\xD8 |0 + \xAB\xD9 |0 + \xAB\xDA |0 + \xAB\xDB |0 + \xAB\xDC |0 + \xAB\xDD |0 + \xAB\xDE |0 + \xAB\xDF |0 + \xAB\xE0 |0 + \xAB\xE1 |0 + \xAB\xE2 |0 + \xAB\xE3 |0 + \xAB\xE4 |0 + \xAB\xE5 |0 + \xAB\xE6 |0 + \xAB\xE7 |0 + \xAB\xE8 |0 + \xAB\xE9 |0 + \xAB\xEA |0 + \xAB\xEB |0 + \xAB\xEC |0 + \xAB\xED |0 + \xAB\xEE |0 + \xAB\xEF |0 + \xAB\xF0 |0 + \xAB\xF1 |0 + \xAB\xF2 |0 + \xAB\xF3 |0 + \xAB\xF4 |0 + \xAB\xF5 |0 + \xAB\xF6 |0 + \xA1\xA4 |0 + \xA4\xA1 |0 + \xA4\xA2 |0 + \xA4\xA3 |0 + \xA4\xA4 |0 + \xA4\xA5 |0 + \xA4\xA6 |0 + \xA4\xA7 |0 + \xA4\xA8 |0 + \xA4\xA9 |0 + \xA4\xAA |0 + \xA4\xAB |0 + \xA4\xAC |0 + \xA4\xAD |0 + \xA4\xAE |0 + \xA4\xAF |0 + \xA4\xB0 |0 + \xA4\xB1 |0 + \xA4\xB2 |0 + \xA4\xB3 |0 + \xA4\xB4 |0 + \xA4\xB5 |0 + \xA4\xB6 |0 + \xA4\xB7 |0 + \xA4\xB8 |0 + \xA4\xB9 |0 + \xA4\xBA |0 + \xA4\xBB |0 + \xA4\xBC |0 + \xA4\xBD |0 + \xA4\xBE |0 + \xA4\xBF |0 + \xA4\xC0 |0 + \xA4\xC1 |0 + \xA4\xC2 |0 + \xA4\xC3 |0 + \xA4\xC4 |0 + \xA4\xC5 |0 + \xA4\xC6 |0 + \xA4\xC7 |0 + \xA4\xC8 |0 + \xA4\xC9 |0 + \xA4\xCA |0 + \xA4\xCB |0 + \xA4\xCC |0 + \xA4\xCD |0 + \xA4\xCE |0 + \xA4\xCF |0 + \xA4\xD0 |0 + \xA4\xD1 |0 + \xA4\xD2 |0 + \xA4\xD3 |0 + \xA4\xD4 |0 + \xA4\xD5 |0 + \xA4\xD6 |0 + \xA4\xD7 |0 + \xA4\xD8 |0 + \xA4\xD9 |0 + \xA4\xDA |0 + \xA4\xDB |0 + \xA4\xDC |0 + \xA4\xDD |0 + \xA4\xDE |0 + \xA4\xDF |0 + \xA4\xE0 |0 + \xA4\xE1 |0 + \xA4\xE2 |0 + \xA4\xE3 |0 + \xA4\xE4 |0 + \xA4\xE5 |0 + \xA4\xE6 |0 + \xA4\xE7 |0 + \xA4\xE8 |0 + \xA4\xE9 |0 + \xA4\xEA |0 + \xA4\xEB |0 + \xA4\xEC |0 + \xA4\xED |0 + \xA4\xEE |0 + \xA4\xEF |0 + \xA4\xF0 |0 + \xA4\xF1 |0 + \xA4\xF2 |0 + \xA4\xF3 |0 + \xA4\xF4 |0 + \xA4\xF5 |0 + \xA4\xF6 |0 + \xA4\xF7 |0 + \xA4\xF8 |0 + \xA4\xF9 |0 + \xA4\xFA |0 + \xA4\xFB |0 + \xA4\xFC |0 + \xA4\xFD |0 + \xA4\xFE |0 + \xA9\xB1 |0 + \xA9\xB2 |0 + \xA9\xB3 |0 + \xA9\xB4 |0 + \xA9\xB5 |0 + \xA9\xB6 |0 + \xA9\xB7 |0 + \xA9\xB8 |0 + \xA9\xB9 |0 + \xA9\xBA |0 + \xA9\xBB |0 + \xA9\xBC |0 + \xA9\xBD |0 + \xA9\xBE |0 + \xA9\xBF |0 + \xA9\xC0 |0 + \xA9\xC1 |0 + \xA9\xC2 |0 + \xA9\xC3 |0 + \xA9\xC4 |0 + \xA9\xC5 |0 + \xA9\xC6 |0 + \xA9\xC7 |0 + \xA9\xC8 |0 + \xA9\xC9 |0 + \xA9\xCA |0 + \xA9\xCB |0 + \xA9\xCC |0 + \xA2\xDF |0 + \xA8\xB1 |0 + \xA8\xB2 |0 + \xA8\xB3 |0 + \xA8\xB4 |0 + \xA8\xB5 |0 + \xA8\xB6 |0 + \xA8\xB7 |0 + \xA8\xB8 |0 + \xA8\xB9 |0 + \xA8\xBA |0 + \xA8\xBB |0 + \xA8\xBC |0 + \xA8\xBD |0 + \xA8\xBE |0 + \xA8\xBF |0 + \xA8\xC0 |0 + \xA8\xC1 |0 + \xA8\xC2 |0 + \xA8\xC3 |0 + \xA8\xC4 |0 + \xA8\xC5 |0 + \xA8\xC6 |0 + \xA8\xC7 |0 + \xA8\xC8 |0 + \xA8\xC9 |0 + \xA8\xCA |0 + \xA8\xCB |0 + \xA8\xCC |0 + \xA2\xDE |0 + \xA7\xC9 |0 + \xA7\xCA |0 + \xA7\xCB |0 + \xA7\xCC |0 + \xA7\xCD |0 + \xA7\xBA |0 + \xA7\xBB |0 + \xA7\xDC |0 + \xA7\xDD |0 + \xA7\xDE |0 + \xA7\xB6 |0 + \xA7\xB7 |0 + \xA7\xB8 |0 + \xA7\xD4 |0 + \xA7\xD5 |0 + \xA7\xD6 |0 + \xA7\xD7 |0 + \xA7\xD8 |0 + \xA7\xA1 |0 + \xA7\xA2 |0 + \xA7\xA3 |0 + \xA7\xA5 |0 + \xA7\xAB |0 + \xA7\xAC |0 + \xA7\xAD |0 + \xA7\xAE |0 + \xA7\xAF |0 + \xA7\xB0 |0 + \xA7\xB1 |0 + \xA7\xB2 |0 + \xA7\xB3 |0 + \xA7\xB4 |0 + \xA7\xA7 |0 + \xA7\xA8 |0 + \xA7\xA9 |0 + \xA7\xAA |0 + \xA7\xBD |0 + \xA7\xBE |0 + \xA7\xE5 |0 + \xA7\xE6 |0 + \xA7\xE7 |0 + \xA7\xE8 |0 + \xA7\xE1 |0 + \xA7\xE2 |0 + \xA7\xE3 |0 + \xA7\xBF |0 + \xA7\xC0 |0 + \xA7\xC1 |0 + \xA7\xC2 |0 + \xA7\xC3 |0 + \xA7\xC4 |0 + \xA7\xC5 |0 + \xA7\xC6 |0 + \xA7\xC7 |0 + \xA7\xC8 |0 + \xA7\xCE |0 + \xA7\xCF |0 + \xA7\xD0 |0 + \xA7\xD1 |0 + \xA7\xD2 |0 + \xA7\xD3 |0 + \xA7\xDA |0 + \xA7\xDB |0 + \xA2\xE3 |0 + \xA7\xEC |0 + \xA7\xA6 |0 + \xA7\xE0 |0 + \xA7\xEF |0 + \xA2\xE1 |0 + \xA7\xBC |0 + \xA7\xED |0 + \xA7\xB5 |0 + \xA7\xB9 |0 + \xA7\xEA |0 + \xA7\xEB |0 + \xA7\xDF |0 + \xA2\xE4 |0 + \xA7\xE4 |0 + \xA7\xEE |0 + \xA7\xE9 |0 + \xEC\xE9 |0 + \xEF\xCB |0 + \xF6\xD2 |0 + \xD8\xB2 |0 + \xED\xDB |0 + \xDF\xB2 |0 + \xDF\xBE |0 + \xF9\xBB |0 + \xDC\xF4 |0 + \xF5\xE4 |0 + \xF3\xA6 |0 + \xDD\xE0 |0 + \xE1\xA6 |0 + \xCE\xF8 |0 + \xDC\xB0 |0 + \xE3\xAA |0 + \xF1\xE9 |0 + \xCD\xFA |0 + \xFC\xAF |0 + \xD3\xA1 |0 + \xF1\xAB |0 + \xE7\xD1 |0 + \xD2\xAC |0 + \xCE\xF9 |0 + \xF1\xFD |0 + \xDE\xBF |0 + \xFB\xBA |0 + \xF9\xB9 |0 + \xCE\xD2 |0 + \xE3\xAB |0 + \xEB\xE0 |0 + \xCE\xFA |0 + \xCB\xF7 |0 + \xE5\xA5 |0 + \xCA\xE1 |0 + \xD4\xCC |0 + \xEA\xE1 |0 + \xDC\xE3 |0 + \xDF\xAD |0 + \xCB\xEB |0 + \xD5\xAF |0 + \xD6\xF5 |0 + \xE5\xF8 |0 + \xDE\xC0 |0 + \xEC\xA3 |0 + \xE9\xCD |0 + \xEA\xA7 |0 + \xE9\xF6 |0 + \xFB\xBB |0 + \xE7\xE9 |0 + \xEF\xCC |0 + \xD0\xE6 |0 + \xDE\xC1 |0 + \xE4\xAC |0 + \xD8\xCC |0 + \xF9\xF1 |0 + \xCE\xDF |0 + \xFA\xA4 |0 + \xE6\xB2 |0 + \xFA\xFB |0 + \xFA\xBD |0 + \xCC\xC8 |0 + \xEF\xCD |0 + \xD5\xD5 |0 + \xD3\xA2 |0 + \xEC\xD1 |0 + \xE4\xA7 |0 + \xEC\xD2 |0 + \xF6\xB1 |0 + \xCE\xFB |0 + \xD0\xD1 |0 + \xCB\xBF |0 + \xED\xA4 |0 + \xED\xA8 |0 + \xDE\xC2 |0 + \xF6\xE2 |0 + \xED\xDC |0 + \xDC\xF5 |0 + \xE0\xB9 |0 + \xD4\xCE |0 + \xF4\xB5 |0 + \xD3\xDB |0 + \xD6\xB5 |0 + \xEC\xA4 |0 + \xE4\xE6 |0 + \xF1\xEA |0 + \xCB\xEC |0 + \xCB\xC0 |0 + \xEC\xF2 |0 + \xD0\xEA |0 + \xF9\xF2 |0 + \xEC\xA5 |0 + \xD0\xDF |0 + \xE7\xEA |0 + \xD0\xEB |0 + \xDC\xD1 |0 + \xDB\xE9 |0 + \xFD\xCC |0 + \xDB\xD7 |0 + \xDA\xE1 |0 + \xD6\xB6 |0 + \xE3\xDF |0 + \xDE\xC3 |0 + \xDE\xC4 |0 + \xCA\xA1 |0 + \xEE\xEC |0 + \xD3\xA3 |0 + \xEE\xB7 |0 + \xF8\xCF |0 + \xEA\xC8 |0 + \xEE\xB8 |0 + \xF1\xAC |0 + \xF1\xA5 |0 + \xE9\xCE |0 + \xF9\xBC |0 + \xE5\xF9 |0 + \xEC\xEA |0 + \xDD\xD6 |0 + \xED\xC2 |0 + \xF8\xA5 |0 + \xE5\xBA |0 + \xDB\xD8 |0 + \xCA\xA2 |0 + \xD1\xCD |0 + \xEE\xED |0 + \xEC\xEB |0 + \xDE\xC5 |0 + \xE3\xE0 |0 + \xCA\xC9 |0 + \xF2\xE9 |0 + \xD5\xCE |0 + \xF6\xB6 |0 + \xCE\xC2 |0 + \xD6\xC7 |0 + \xE3\xB4 |0 + \xF1\xAD |0 + \xEA\xE2 |0 + \xD7\xC2 |0 + \xF3\xA7 |0 + \xCD\xEA |0 + \xEB\xEE |0 + \xD9\xB2 |0 + \xFD\xA5 |0 + \xF6\xD5 |0 + \xD5\xE2 |0 + \xF8\xB5 |0 + \xCC\xF5 |0 + \xF5\xB5 |0 + \xE4\xAD |0 + \xE7\xEB |0 + \xF1\xD5 |0 + \xF0\xBB |0 + \xE9\xB5 |0 + \xCC\xC9 |0 + \xFA\xD5 |0 + \xE1\xD4 |0 + \xD7\xD6 |0 + \xDC\xC1 |0 + \xDE\xC6 |0 + \xFA\xEF |0 + \xE3\xE1 |0 + \xE1\xF3 |0 + \xDC\xF6 |0 + \xCE\xFC |0 + \xDB\xC4 |0 + \xF8\xF1 |0 + \xDC\xE4 |0 + \xE5\xEF |0 + \xDC\xB1 |0 + \xD5\xD6 |0 + \xF3\xDA |0 + \xCB\xC1 |0 + \xDB\xC3 |0 + \xD9\xFA |0 + \xD3\xEE |0 + \xFA\xB8 |0 + \xFD\xA6 |0 + \xEB\xEF |0 + \xF4\xA6 |0 + \xCC\xCA |0 + \xF3\xA8 |0 + \xF3\xDB |0 + \xDB\xA7 |0 + \xF6\xB7 |0 + \xCF\xE6 |0 + \xF0\xF2 |0 + \xCB\xDA |0 + \xE7\xD2 |0 + \xD7\xC3 |0 + \xF6\xF0 |0 + \xE8\xDE |0 + \xE5\xA6 |0 + \xE5\xE7 |0 + \xCA\xA3 |0 + \xCC\xA7 |0 + \xEA\xC9 |0 + \xF8\xB6 |0 + \xFA\xA5 |0 + \xF1\xAE |0 + \xEF\xCE |0 + \xCB\xED |0 + \xF6\xB0 |0 + \xEF\xCF |0 + \xE9\xCF |0 + \xF7\xDE |0 + \xCE\xD3 |0 + \xDC\xF7 |0 + \xDB\xA8 |0 + \xCB\xF8 |0 + \xDF\xA1 |0 + \xDD\xE1 |0 + \xF5\xCA |0 + \xE9\xB6 |0 + \xE7\xEC |0 + \xEE\xEE |0 + \xF3\xF0 |0 + \xDF\xBF |0 + \xCC\xCB |0 + \xD0\xC1 |0 + \xF4\xD2 |0 + \xE0\xBA |0 + \xDF\xC0 |0 + \xCE\xE0 |0 + \xDC\xD2 |0 + \xFD\xEA |0 + \xD6\xF6 |0 + \xEA\xCA |0 + \xE8\xE9 |0 + \xE3\xAC |0 + \xF3\xD0 |0 + \xCA\xA4 |0 + \xDB\xF8 |0 + \xDE\xC7 |0 + \xEB\xF0 |0 + \xF1\xD6 |0 + \xE5\xE2 |0 + \xCC\xCC |0 + \xCB\xFB |0 + \xEA\xE3 |0 + \xDF\xC1 |0 + \xD6\xED |0 + \xE9\xD0 |0 + \xEE\xB9 |0 + \xD5\xE3 |0 + \xD1\xD3 |0 + \xE5\xF0 |0 + \xE8\xB4 |0 + \xEB\xC3 |0 + \xEA\xAA |0 + \xFA\xFC |0 + \xF5\xF6 |0 + \xF0\xBC |0 + \xFD\xD4 |0 + \xE0\xBB |0 + \xCE\xC3 |0 + \xD0\xBA |0 + \xF7\xBA |0 + \xD8\xF3 |0 + \xF7\xCD |0 + \xE4\xAE |0 + \xD4\xDF |0 + \xD0\xE7 |0 + \xEC\xFD |0 + \xD2\xAE |0 + \xEE\xEF |0 + \xD5\xD7 |0 + \xEA\xE4 |0 + \xF8\xA2 |0 + \xCD\xEB |0 + \xD7\xBF |0 + \xFB\xB1 |0 + \xCD\xEC |0 + \xDC\xB2 |0 + \xD0\xEC |0 + \xCE\xFD |0 + \xEE\xF0 |0 + \xCC\xC2 |0 + \xD0\xED |0 + \xE5\xF7 |0 + \xF3\xFC |0 + \xEE\xA2 |0 + \xD9\xB3 |0 + \xD8\xF4 |0 + \xE9\xB7 |0 + \xCE\xAE |0 + \xD9\xA2 |0 + \xD8\xF1 |0 + \xD4\xCF |0 + \xE5\xA7 |0 + \xD5\xD2 |0 + \xD6\xA9 |0 + \xF4\xA2 |0 + \xF1\xD7 |0 + \xD5\xD8 |0 + \xF0\xBD |0 + \xD7\xD0 |0 + \xD4\xD0 |0 + \xD7\xCF |0 + \xEB\xEA |0 + \xFD\xEB |0 + \xDB\xED |0 + \xFC\xC5 |0 + \xCB\xC2 |0 + \xFD\xD5 |0 + \xF4\xC8 |0 + \xE8\xEA |0 + \xF5\xF3 |0 + \xF9\xDE |0 + \xD3\xEF |0 + \xEC\xD3 |0 + \xDD\xC2 |0 + \xEF\xB7 |0 + \xE7\xD4 |0 + \xCA\xCA |0 + \xD9\xFB |0 + \xFA\xFD |0 + \xD6\xAA |0 + \xF4\xF8 |0 + \xF7\xF7 |0 + \xDC\xAC |0 + \xD7\xD7 |0 + \xDF\xA2 |0 + \xCE\xBE |0 + \xD3\xF0 |0 + \xF0\xA4 |0 + \xE1\xEC |0 + \xCF\xE7 |0 + \xF3\xCB |0 + \xED\xA9 |0 + \xCA\xBE |0 + \xF4\xEF |0 + \xF6\xCE |0 + \xDE\xFB |0 + \xD0\xBB |0 + \xD5\xB7 |0 + \xEE\xF1 |0 + \xF4\xA8 |0 + \xDC\xF8 |0 + \xCB\xA7 |0 + \xDA\xCE |0 + \xE0\xE6 |0 + \xED\xA5 |0 + \xEE\xF2 |0 + \xDC\xF9 |0 + \xF9\xDC |0 + \xF3\xDC |0 + \xF8\xF2 |0 + \xF4\xF9 |0 + \xFC\xF1 |0 + \xD0\xBC |0 + \xDB\xF9 |0 + \xD7\xB1 |0 + \xCB\xFC |0 + \xF0\xA5 |0 + \xCB\xFD |0 + \xD5\xF4 |0 + \xCD\xED |0 + \xCA\xA5 |0 + \xD6\xAB |0 + \xD0\xC2 |0 + \xF0\xBE |0 + \xD2\xBD |0 + \xCC\xA4 |0 + \xFA\xB6 |0 + \xCC\xCD |0 + \xDA\xFA |0 + \xF6\xCF |0 + \xE9\xB8 |0 + \xD8\xF5 |0 + \xCC\xCE |0 + \xD7\xCD |0 + \xD4\xD1 |0 + \xE9\xED |0 + \xCA\xEB |0 + \xD9\xE2 |0 + \xFD\xB2 |0 + \xE3\xAD |0 + \xD6\xCC |0 + \xD9\xB4 |0 + \xE1\xA7 |0 + \xEE\xD3 |0 + \xD0\xC3 |0 + \xFD\xB3 |0 + \xD5\xE4 |0 + \xCF\xE8 |0 + \xED\xC3 |0 + \xD0\xB2 |0 + \xCE\xFE |0 + \xDA\xA8 |0 + \xF8\xD0 |0 + \xFD\xD6 |0 + \xF8\xD1 |0 + \xF8\xD2 |0 + \xDC\xD3 |0 + \xDD\xE2 |0 + \xFB\xF9 |0 + \xDD\xC1 |0 + \xE3\xB5 |0 + \xED\xDD |0 + \xCE\xC4 |0 + \xCB\xA1 |0 + \xDD\xE3 |0 + \xFC\xDD |0 + \xF9\xAF |0 + \xD2\xFB |0 + \xCF\xA1 |0 + \xE4\xA8 |0 + \xF4\xB6 |0 + \xEC\xFE |0 + \xE3\xAE |0 + \xE7\xED |0 + \xFD\xC1 |0 + \xDA\xE2 |0 + \xD8\xB3 |0 + \xDD\xE4 |0 + \xF0\xEF |0 + \xF6\xF1 |0 + \xFA\xF0 |0 + \xD1\xF5 |0 + \xDA\xCF |0 + \xDC\xD4 |0 + \xDC\xA6 |0 + \xEF\xBF |0 + \xCE\xCF |0 + \xE0\xD9 |0 + \xD9\xD6 |0 + \xEC\xD4 |0 + \xEA\xCB |0 + \xCA\xBF |0 + \xD5\xB0 |0 + \xCF\xE9 |0 + \xF1\xED |0 + \xCC\xCF |0 + \xE4\xF8 |0 + \xE4\xED |0 + \xD7\xD8 |0 + \xFD\xA7 |0 + \xEA\xAB |0 + \xF6\xB2 |0 + \xCF\xF0 |0 + \xF9\xBD |0 + \xE6\xF4 |0 + \xCB\xDB |0 + \xF3\xD1 |0 + \xE9\xD1 |0 + \xF3\xA9 |0 + \xD0\xE0 |0 + \xE9\xD2 |0 + \xDA\xE3 |0 + \xE2\xD2 |0 + \xF6\xA2 |0 + \xE1\xF4 |0 + \xDA\xE4 |0 + \xE7\xD5 |0 + \xF5\xBF |0 + \xCF\xA2 |0 + \xCD\xAF |0 + \xCF\xA3 |0 + \xCD\xB0 |0 + \xF1\xFE |0 + \xD0\xA3 |0 + \xE1\xAF |0 + \xF8\xA3 |0 + \xCA\xA6 |0 + \xF7\xBB |0 + \xF2\xEA |0 + \xDE\xC8 |0 + \xE9\xD3 |0 + \xDE\xC9 |0 + \xFD\xDE |0 + \xCA\xC0 |0 + \xF9\xEA |0 + \xD1\xCE |0 + \xEE\xD4 |0 + \xD4\xD2 |0 + \xD9\xA3 |0 + \xFD\xA8 |0 + \xD7\xD9 |0 + \xF7\xCE |0 + \xFA\xBE |0 + \xCF\xD6 |0 + \xD7\xF0 |0 + \xEB\xE1 |0 + \xF8\xC5 |0 + \xDC\xFA |0 + \xDD\xC3 |0 + \xF9\xDF |0 + \xE7\xEF |0 + \xFD\xE5 |0 + \xF6\xA3 |0 + \xD9\xFC |0 + \xFD\xA9 |0 + \xE7\xEE |0 + \xD5\xE5 |0 + \xEF\xD0 |0 + \xCD\xB1 |0 + \xF7\xA2 |0 + \xF1\xB2 |0 + \xF1\xB1 |0 + \xCD\xB2 |0 + \xDA\xAB |0 + \xCA\xA7 |0 + \xE3\xE2 |0 + \xFB\xBC |0 + \xD9\xA4 |0 + \xEE\xBA |0 + \xF8\xD3 |0 + \xFB\xFA |0 + \xCF\xA4 |0 + \xDC\xFB |0 + \xF6\xE3 |0 + \xED\xAA |0 + \xF2\xA1 |0 + \xCE\xE1 |0 + \xFA\xA6 |0 + \xF9\xE0 |0 + \xEC\xD6 |0 + \xE4\xEE |0 + \xF9\xA1 |0 + \xFB\xEF |0 + \xF9\xEB |0 + \xEE\xA3 |0 + \xEA\xAC |0 + \xCA\xA8 |0 + \xF4\xFA |0 + \xCD\xD6 |0 + \xFC\xF6 |0 + \xF4\xC9 |0 + \xF8\xD4 |0 + \xF8\xA6 |0 + \xDE\xCA |0 + \xF2\xC6 |0 + \xD7\xDA |0 + \xD3\xD0 |0 + \xD8\xC5 |0 + \xEA\xE6 |0 + \xF3\xDD |0 + \xE4\xDA |0 + \xF6\xE4 |0 + \xF6\xF2 |0 + \xDF\xC2 |0 + \xD9\xFD |0 + \xCC\xF6 |0 + \xD3\xBA |0 + \xE4\xAF |0 + \xF9\xE1 |0 + \xF0\xA6 |0 + \xCB\xD3 |0 + \xE0\xBC |0 + \xF4\xCA |0 + \xD4\xFA |0 + \xFD\xAA |0 + \xF9\xE2 |0 + \xF4\xB7 |0 + \xFD\xC2 |0 + \xFC\xB0 |0 + \xFD\xEC |0 + \xCA\xE2 |0 + \xFD\xBD |0 + \xEA\xE7 |0 + \xDF\xC3 |0 + \xD1\xD2 |0 + \xCE\xE2 |0 + \xD3\xA4 |0 + \xFD\xAB |0 + \xDF\xE0 |0 + \xF2\xC7 |0 + \xE7\xF0 |0 + \xD0\xEE |0 + \xF3\xAA |0 + \xDE\xCB |0 + \xF6\xB8 |0 + \xE1\xF5 |0 + \xF1\xB3 |0 + \xF7\xA3 |0 + \xCA\xA9 |0 + \xCF\xA5 |0 + \xDF\xC4 |0 + \xE1\xB0 |0 + \xF0\xBF |0 + \xF6\xA4 |0 + \xE3\xB6 |0 + \xFA\xC6 |0 + \xD0\xEF |0 + \xFD\xED |0 + \xDD\xC4 |0 + \xFC\xF7 |0 + \xE6\xBF |0 + \xDE\xAD |0 + \xFA\xBF |0 + \xE5\xF1 |0 + \xED\xC4 |0 + \xD2\xA5 |0 + \xFD\xEE |0 + \xF5\xB6 |0 + \xE1\xF6 |0 + \xDE\xCC |0 + \xFC\xDE |0 + \xEC\xD7 |0 + \xCD\xDD |0 + \xD6\xB7 |0 + \xCD\xB3 |0 + \xF8\xD5 |0 + \xE5\xD8 |0 + \xCF\xEA |0 + \xCF\xD0 |0 + \xEA\xCC |0 + \xEA\xAE |0 + \xEA\xAD |0 + \xD3\xF1 |0 + \xD3\xA5 |0 + \xF7\xCF |0 + \xEE\xA4 |0 + \xD0\xA4 |0 + \xF2\xA2 |0 + \xD0\xF0 |0 + \xF2\xA3 |0 + \xF7\xF8 |0 + \xD0\xB3 |0 + \xDB\xA9 |0 + \xD3\xBB |0 + \xCA\xEC |0 + \xF1\xA6 |0 + \xCB\xD5 |0 + \xF7\xE7 |0 + \xCD\xDE |0 + \xF7\xA4 |0 + \xF8\xC0 |0 + \xD3\xDD |0 + \xCC\xD0 |0 + \xCF\xA6 |0 + \xF6\xF3 |0 + \xE1\xF7 |0 + \xD3\xDC |0 + \xFA\xFE |0 + \xFA\xA7 |0 + \xEB\xD9 |0 + \xCF\xA7 |0 + \xEA\xAF |0 + \xE4\xEF |0 + \xE9\xB9 |0 + \xF1\xD8 |0 + \xD8\xD8 |0 + \xE0\xF2 |0 + \xE6\xB4 |0 + \xDC\xFC |0 + \xF3\xF1 |0 + \xE3\xD0 |0 + \xF2\xFB |0 + \xDB\xC6 |0 + \xD0\xF1 |0 + \xD0\xF2 |0 + \xCF\xDC |0 + \xD3\xD1 |0 + \xCC\xB1 |0 + \xF7\xD8 |0 + \xCB\xA8 |0 + \xEB\xBC |0 + \xE4\xBE |0 + \xF4\xDC |0 + \xDC\xC2 |0 + \xF0\xA7 |0 + \xE6\xC0 |0 + \xCA\xED |0 + \xE8\xEB |0 + \xE5\xE8 |0 + \xDC\xC3 |0 + \xED\xDE |0 + \xD3\xF2 |0 + \xCC\xF7 |0 + \xCE\xD4 |0 + \xE7\xAB |0 + \xCB\xC3 |0 + \xE1\xB1 |0 + \xF7\xB2 |0 + \xD3\xF3 |0 + \xD3\xD2 |0 + \xF5\xC0 |0 + \xDF\xDD |0 + \xEE\xF3 |0 + \xE7\xF1 |0 + \xFD\xB4 |0 + \xF2\xC8 |0 + \xF3\xD2 |0 + \xEE\xF4 |0 + \xE2\xD3 |0 + \xCC\xD1 |0 + \xDF\xEA |0 + \xE9\xBA |0 + \xD9\xD7 |0 + \xF5\xCD |0 + \xF1\xF2 |0 + \xFA\xC7 |0 + \xD9\xF8 |0 + \xD4\xC2 |0 + \xF6\xE5 |0 + \xDD\xC5 |0 + \xE7\xF2 |0 + \xED\xDF |0 + \xCA\xCB |0 + \xDB\xFA |0 + \xE8\xB5 |0 + \xD3\xA6 |0 + \xFD\xB5 |0 + \xF9\xC9 |0 + \xE4\xE2 |0 + \xFB\xBD |0 + \xD7\xA4 |0 + \xCE\xC5 |0 + \xCE\xD5 |0 + \xD6\xE6 |0 + \xE5\xBD |0 + \xDE\xCD |0 + \xEC\xF3 |0 + \xED\xE0 |0 + \xEC\xEC |0 + \xFB\xBE |0 + \xDF\xEB |0 + \xE1\xF8 |0 + \xF9\xBE |0 + \xD0\xF3 |0 + \xE0\xAA |0 + \xE8\xE2 |0 + \xE2\xD4 |0 + \xD2\xFD |0 + \xE5\xA8 |0 + \xD9\xD3 |0 + \xD3\xDE |0 + \xF4\xB8 |0 + \xF7\xBC |0 + \xDC\xFD |0 + \xE8\xEC |0 + \xE4\xE7 |0 + \xE3\xF7 |0 + \xEC\xA8 |0 + \xFA\xF1 |0 + \xE5\xF2 |0 + \xD0\xF4 |0 + \xD2\xAF |0 + \xDC\xE5 |0 + \xD0\xA5 |0 + \xF1\xB4 |0 + \xFC\xB1 |0 + \xCC\xF8 |0 + \xDD\xC6 |0 + \xFA\xD1 |0 + \xF7\xDF |0 + \xFA\xA8 |0 + \xEE\xF5 |0 + \xDE\xCE |0 + \xE7\xF3 |0 + \xF7\xAC |0 + \xEB\xC4 |0 + \xED\xE1 |0 + \xE0\xAB |0 + \xDD\xC7 |0 + \xD2\xB3 |0 + \xD2\xBF |0 + \xCA\xCC |0 + \xFB\xBF |0 + \xE5\xFD |0 + \xDD\xE5 |0 + \xD8\xCD |0 + \xEC\xF4 |0 + \xD0\xF5 |0 + \xE8\xED |0 + \xD0\xD2 |0 + \xD9\xD8 |0 + \xF6\xE6 |0 + \xDB\xAA |0 + \xF7\xE0 |0 + \xD8\xD9 |0 + \xF4\xA3 |0 + \xF4\xDD |0 + \xEF\xD1 |0 + \xD9\xB5 |0 + \xED\xAB |0 + \xE3\xB7 |0 + \xEE\xBB |0 + \xCD\xB4 |0 + \xE0\xF3 |0 + \xEA\xCD |0 + \xEC\xF5 |0 + \xE8\xEE |0 + \xCB\xA9 |0 + \xF1\xAF |0 + \xCA\xCD |0 + \xEC\xA9 |0 + \xF2\xEB |0 + \xFD\xEF |0 + \xF9\xF3 |0 + \xE6\xC1 |0 + \xEC\xD8 |0 + \xED\xAC |0 + \xEA\xCE |0 + \xE8\xDF |0 + \xDE\xCF |0 + \xD2\xA6 |0 + \xE7\xF4 |0 + \xD1\xD6 |0 + \xE6\xC2 |0 + \xE3\xE3 |0 + \xE4\xB0 |0 + \xD8\xB4 |0 + \xF6\xA5 |0 + \xF3\xDE |0 + \xD7\xA5 |0 + \xF7\xE8 |0 + \xE8\xC6 |0 + \xFB\xE6 |0 + \xDD\xE6 |0 + \xDC\xFE |0 + \xD8\xDA |0 + \xDA\xAC |0 + \xEA\xB0 |0 + \xE3\xB8 |0 + \xCA\xAA |0 + \xE1\xF9 |0 + \xEA\xB1 |0 + \xF2\xEC |0 + \xFA\xEE |0 + \xEE\xD5 |0 + \xF9\xF4 |0 + \xD2\xEC |0 + \xFB\xFB |0 + \xFD\xF0 |0 + \xE0\xBD |0 + \xCE\xE3 |0 + \xF8\xC6 |0 + \xDE\xAE |0 + \xDF\xC5 |0 + \xE5\xBE |0 + \xED\xAD |0 + \xFA\xEA |0 + \xCD\xEE |0 + \xED\xA6 |0 + \xED\xAE |0 + \xF0\xED |0 + \xDD\xA1 |0 + \xED\xAF |0 + \xFC\xF8 |0 + \xD8\xEB |0 + \xCC\xF9 |0 + \xCD\xB5 |0 + \xFA\xA9 |0 + \xE1\xDD |0 + \xE2\xD5 |0 + \xED\xCF |0 + \xDD\xA2 |0 + \xF9\xCA |0 + \xEA\xE8 |0 + \xE5\xED |0 + \xD3\xEB |0 + \xE9\xD4 |0 + \xE1\xFA |0 + \xE4\xCC |0 + \xE1\xE4 |0 + \xE8\xC7 |0 + \xCE\xDB |0 + \xDC\xD5 |0 + \xF7\xB5 |0 + \xFC\xF3 |0 + \xF0\xF3 |0 + \xCE\xAF |0 + \xF1\xB5 |0 + \xEF\xD2 |0 + \xE8\xC8 |0 + \xEB\xF1 |0 + \xCB\xD4 |0 + \xE0\xBE |0 + \xE3\xF8 |0 + \xEA\xE9 |0 + \xFC\xB2 |0 + \xE0\xF4 |0 + \xCF\xE0 |0 + \xEE\xA5 |0 + \xFA\xAA |0 + \xE6\xC3 |0 + \xE1\xB2 |0 + \xCA\xAB |0 + \xE3\xE4 |0 + \xE9\xBB |0 + \xE2\xD6 |0 + \xF3\xF2 |0 + \xEE\xD6 |0 + \xEA\xB2 |0 + \xD0\xF6 |0 + \xEC\xD9 |0 + \xDA\xCB |0 + \xCF\xA8 |0 + \xDD\xA3 |0 + \xD8\xDB |0 + \xF9\xCE |0 + \xE9\xD5 |0 + \xE3\xD1 |0 + \xD2\xBC |0 + \xD8\xAC |0 + \xF3\xCC |0 + \xCD\xFB |0 + \xF6\xD6 |0 + \xE7\xF5 |0 + \xE8\xEF |0 + \xE3\xF9 |0 + \xD2\xBB |0 + \xF3\xF3 |0 + \xE3\xFB |0 + \xDE\xD0 |0 + \xCE\xB0 |0 + \xD6\xF7 |0 + \xF1\xD9 |0 + \xF5\xC1 |0 + \xDC\xC4 |0 + \xF5\xBB |0 + \xDE\xD1 |0 + \xDC\xE6 |0 + \xDE\xD2 |0 + \xED\xE2 |0 + \xEE\xF6 |0 + \xEA\xCF |0 + \xF0\xEE |0 + \xE3\xFC |0 + \xD3\xDF |0 + \xD3\xF4 |0 + \xE1\xB3 |0 + \xE1\xB4 |0 + \xF4\xD3 |0 + \xDF\xC6 |0 + \xE9\xD6 |0 + \xDB\xAB |0 + \xF6\xA6 |0 + \xE3\xB9 |0 + \xEB\xC5 |0 + \xF4\xA9 |0 + \xCD\xB6 |0 + \xD2\xF9 |0 + \xDA\xAD |0 + \xD2\xE3 |0 + \xCF\xD1 |0 + \xCB\xDC |0 + \xCC\xFA |0 + \xCF\xDD |0 + \xE8\xA9 |0 + \xE3\xBB |0 + \xE3\xBA |0 + \xE0\xDA |0 + \xEE\xF7 |0 + \xDC\xB3 |0 + \xD3\xF5 |0 + \xD7\xA6 |0 + \xF6\xB5 |0 + \xD7\xDB |0 + \xE1\xD5 |0 + \xD4\xEA |0 + \xDF\xA3 |0 + \xFD\xDF |0 + \xD0\xF7 |0 + \xED\xD4 |0 + \xCB\xAA |0 + \xE4\xDB |0 + \xE1\xFB |0 + \xCB\xA2 |0 + \xD3\xE0 |0 + \xE4\xBF |0 + \xFB\xC0 |0 + \xDA\xBE |0 + \xE4\xCD |0 + \xD6\xB9 |0 + \xEF\xC0 |0 + \xE1\xFC |0 + \xF6\xB9 |0 + \xDF\xC7 |0 + \xE4\xB1 |0 + \xDC\xE7 |0 + \xDC\xE8 |0 + \xFA\xD6 |0 + \xD3\xF6 |0 + \xF1\xDA |0 + \xFA\xF2 |0 + \xE2\xFD |0 + \xD5\xCF |0 + \xD0\xF8 |0 + \xCD\xDF |0 + \xF5\xCB |0 + \xE4\xF0 |0 + \xCB\xAB |0 + \xD7\xC4 |0 + \xE2\xFE |0 + \xDD\xDA |0 + \xDA\xAE |0 + \xCA\xEE |0 + \xD5\xB9 |0 + \xE3\xA1 |0 + \xE8\xE3 |0 + \xF3\xAB |0 + \xCF\xA9 |0 + \xD3\xF7 |0 + \xD4\xF1 |0 + \xCE\xE4 |0 + \xE8\xF2 |0 + \xE5\xF5 |0 + \xE7\xAE |0 + \xD6\xBA |0 + \xDF\xEC |0 + \xE4\xC0 |0 + \xE8\xE4 |0 + \xD8\xB5 |0 + \xE4\xDC |0 + \xF4\xB9 |0 + \xF1\xB6 |0 + \xE2\xDE |0 + \xE1\xB5 |0 + \xCD\xEF |0 + \xF1\xA7 |0 + \xCE\xE5 |0 + \xCB\xDD |0 + \xD9\xE3 |0 + \xF3\xAC |0 + \xD0\xF9 |0 + \xEC\xAB |0 + \xDE\xD3 |0 + \xF7\xE9 |0 + \xF9\xF5 |0 + \xE1\xDE |0 + \xCB\xEE |0 + \xE3\xBC |0 + \xF8\xD6 |0 + \xDB\xEE |0 + \xFD\xF1 |0 + \xF7\xB6 |0 + \xF4\xDE |0 + \xF2\xED |0 + \xDB\xD9 |0 + \xF0\xA8 |0 + \xE1\xFD |0 + \xDE\xD4 |0 + \xE0\xAC |0 + \xED\xE3 |0 + \xD3\xE1 |0 + \xDF\xC8 |0 + \xD9\xB6 |0 + \xFD\xAC |0 + \xEF\xD3 |0 + \xE4\xC1 |0 + \xF8\xEB |0 + \xDB\xAC |0 + \xFC\xC6 |0 + \xD8\xAD |0 + \xF6\xBA |0 + \xDB\xDF |0 + \xD3\xD3 |0 + \xF8\xC7 |0 + \xCA\xCE |0 + \xF8\xC1 |0 + \xD2\xB4 |0 + \xDC\xB4 |0 + \xFA\xB9 |0 + \xCA\xCF |0 + \xFC\xB3 |0 + \xEA\xEA |0 + \xEA\xEB |0 + \xD0\xFA |0 + \xED\xE4 |0 + \xDD\xE7 |0 + \xDF\xC9 |0 + \xDF\xED |0 + \xEE\xBC |0 + \xEF\xC1 |0 + \xCC\xD2 |0 + \xDD\xA4 |0 + \xDF\xCA |0 + \xD3\xF8 |0 + \xF1\xA8 |0 + \xCD\xB7 |0 + \xEF\xD4 |0 + \xE4\xDD |0 + \xDF\xEE |0 + \xCB\xAC |0 + \xE9\xBC |0 + \xEA\xEC |0 + \xDF\xCB |0 + \xF9\xBF |0 + \xD6\xAF |0 + \xD5\xC6 |0 + \xCF\xAA |0 + \xCE\xA9 |0 + \xD6\xF8 |0 + \xF1\xB7 |0 + \xEE\xF8 |0 + \xD9\xD9 |0 + \xF3\xDF |0 + \xF8\xC8 |0 + \xCE\xC6 |0 + \xD5\xE6 |0 + \xF4\xE6 |0 + \xE6\xC5 |0 + \xEF\xD5 |0 + \xCB\xEF |0 + \xFC\xDF |0 + \xDC\xA7 |0 + \xD6\xE7 |0 + \xF8\xC9 |0 + \xE3\xD2 |0 + \xE3\xBD |0 + \xCF\xE1 |0 + \xF0\xC0 |0 + \xEC\xDA |0 + \xDD\xD7 |0 + \xFB\xF0 |0 + \xEC\xAC |0 + \xF0\xA9 |0 + \xFA\xD7 |0 + \xFB\xC1 |0 + \xD2\xC0 |0 + \xE5\xB0 |0 + \xED\xE5 |0 + \xCB\xAD |0 + \xF9\xB0 |0 + \xF7\xA5 |0 + \xCB\xAE |0 + \xDA\xAF |0 + \xD8\xB6 |0 + \xD3\xA7 |0 + \xFB\xB2 |0 + \xFD\xC4 |0 + \xEC\xAD |0 + \xFB\xA1 |0 + \xE5\xE9 |0 + \xE9\xEE |0 + \xF3\xF4 |0 + \xF8\xF3 |0 + \xF0\xC1 |0 + \xDE\xAF |0 + \xF8\xB0 |0 + \xF3\xE0 |0 + \xE7\xAF |0 + \xDB\xAD |0 + \xE6\xB5 |0 + \xF9\xA8 |0 + \xDD\xD8 |0 + \xE8\xD9 |0 + \xEF\xD6 |0 + \xD3\xE2 |0 + \xE2\xDF |0 + \xFC\xE0 |0 + \xD7\xC8 |0 + \xFD\xAD |0 + \xDF\xEF |0 + \xCC\xD3 |0 + \xD3\xF9 |0 + \xD4\xF0 |0 + \xDB\xC7 |0 + \xDE\xD5 |0 + \xF0\xF4 |0 + \xD5\xD0 |0 + \xE5\xD9 |0 + \xFC\xC7 |0 + \xDC\xD6 |0 + \xE2\xE0 |0 + \xDA\xB0 |0 + \xF3\xA3 |0 + \xD3\xEC |0 + \xF4\xCB |0 + \xFD\xC5 |0 + \xE3\xFD |0 + \xF9\xB1 |0 + \xD0\xFB |0 + \xEC\xDB |0 + \xF5\xBC |0 + \xF2\xA4 |0 + \xD8\xCE |0 + \xD8\xCF |0 + \xF5\xF7 |0 + \xF6\xE1 |0 + \xD2\xB7 |0 + \xFB\xEC |0 + \xDD\xC8 |0 + \xE4\xE8 |0 + \xD2\xC1 |0 + \xF8\xD7 |0 + \xD6\xBB |0 + \xDE\xD6 |0 + \xF7\xBD |0 + \xEC\xAE |0 + \xD0\xE1 |0 + \xE0\xF5 |0 + \xEA\xB3 |0 + \xCE\xD6 |0 + \xCC\xA5 |0 + \xEC\xF6 |0 + \xE2\xE1 |0 + \xE3\xBE |0 + \xFC\xC8 |0 + \xCD\xF0 |0 + \xF9\xF6 |0 + \xDF\xF0 |0 + \xE5\xBF |0 + \xCE\xBF |0 + \xFC\xE1 |0 + \xED\xB0 |0 + \xFD\xD1 |0 + \xF6\xBB |0 + \xF9\xCF |0 + \xEB\xDA |0 + \xCA\xC1 |0 + \xD2\xB8 |0 + \xCD\xF1 |0 + \xE3\xD3 |0 + \xFD\xE6 |0 + \xE6\xED |0 + \xE3\xFA |0 + \xF0\xAA |0 + \xF9\xD0 |0 + \xFC\xE2 |0 + \xF8\xA7 |0 + \xE1\xE5 |0 + \xEE\xF9 |0 + \xE7\xF6 |0 + \xEA\xED |0 + \xFC\xB4 |0 + \xF5\xC2 |0 + \xD7\xDC |0 + \xF0\xF5 |0 + \xDD\xE8 |0 + \xD3\xED |0 + \xF5\xFC |0 + \xDA\xBF |0 + \xCC\xFB |0 + \xD3\xFA |0 + \xF4\xA4 |0 + \xEF\xD7 |0 + \xD4\xC3 |0 + \xFB\xE3 |0 + \xFB\xED |0 + \xE0\xAD |0 + \xEA\xEE |0 + \xFB\xB3 |0 + \xE4\xC2 |0 + \xF6\xE7 |0 + \xD2\xDD |0 + \xDF\xCC |0 + \xFC\xC9 |0 + \xE5\xA9 |0 + \xE0\xF6 |0 + \xF6\xB3 |0 + \xE1\xFE |0 + \xCB\xF0 |0 + \xEA\xEF |0 + \xEA\xF0 |0 + \xDA\xC0 |0 + \xF8\xB4 |0 + \xEB\xF2 |0 + \xE4\xC3 |0 + \xE9\xD7 |0 + \xE4\xF1 |0 + \xCA\xEF |0 + \xCE\xD7 |0 + \xFC\xCA |0 + \xF3\xE1 |0 + \xCB\xC4 |0 + \xE3\xE5 |0 + \xCB\xC5 |0 + \xEA\xB4 |0 + \xE9\xBD |0 + \xD7\xC9 |0 + \xEB\xDB |0 + \xED\xB1 |0 + \xCC\xC3 |0 + \xF7\xBE |0 + \xFC\xCB |0 + \xF8\xF4 |0 + \xD9\xB7 |0 + \xF3\xD3 |0 + \xF3\xD4 |0 + \xF7\xE4 |0 + \xF7\xD1 |0 + \xD8\xB7 |0 + \xCE\xB1 |0 + \xCA\xC2 |0 + \xFB\xB4 |0 + \xCB\xC6 |0 + \xF0\xF6 |0 + \xD5\xE7 |0 + \xEA\xD0 |0 + \xCC\xD4 |0 + \xCB\xAF |0 + \xF4\xAA |0 + \xE9\xAF |0 + \xF5\xC3 |0 + \xE9\xD8 |0 + \xDD\xE9 |0 + \xF1\xF3 |0 + \xD5\xFB |0 + \xDE\xBB |0 + \xF4\xFB |0 + \xFD\xF3 |0 + \xFD\xF2 |0 + \xF7\xA6 |0 + \xDD\xC9 |0 + \xD4\xD3 |0 + \xCC\xA8 |0 + \xDA\xC1 |0 + \xCC\xD5 |0 + \xD9\xE4 |0 + \xFA\xCA |0 + \xE5\xE3 |0 + \xD3\xBC |0 + \xCA\xF0 |0 + \xD0\xC4 |0 + \xCA\xD0 |0 + \xFA\xAB |0 + \xEB\xEB |0 + \xE7\xF8 |0 + \xD9\xE5 |0 + \xD1\xD7 |0 + \xF3\xA4 |0 + \xD4\xFB |0 + \xFC\xE3 |0 + \xFA\xD8 |0 + \xF3\xD5 |0 + \xCF\xAB |0 + \xEB\xF3 |0 + \xD5\xFC |0 + \xD3\xD4 |0 + \xCD\xFC |0 + \xD9\xE6 |0 + \xE2\xF9 |0 + \xE2\xA1 |0 + \xEB\xD4 |0 + \xE0\xF7 |0 + \xE4\xB2 |0 + \xCC\xFC |0 + \xFB\xE4 |0 + \xF4\xAB |0 + \xD0\xBD |0 + \xCA\xF1 |0 + \xEF\xB8 |0 + \xD7\xC0 |0 + \xEE\xFA |0 + \xFD\xF4 |0 + \xD3\xE3 |0 + \xFB\xC2 |0 + \xD5\xE8 |0 + \xDB\xAE |0 + \xE1\xB6 |0 + \xF8\xB7 |0 + \xE0\xBF |0 + \xFB\xC3 |0 + \xDD\xEA |0 + \xE2\xA2 |0 + \xEE\xA6 |0 + \xF6\xE8 |0 + \xF6\xF5 |0 + \xDD\xCA |0 + \xD0\xE2 |0 + \xDD\xA6 |0 + \xDD\xEB |0 + \xE4\xF9 |0 + \xE3\xAF |0 + \xD0\xFC |0 + \xF4\xFC |0 + \xCC\xBC |0 + \xF7\xEA |0 + \xE5\xE4 |0 + \xDF\xF1 |0 + \xF7\xE1 |0 + \xF9\xF7 |0 + \xEF\xB9 |0 + \xF8\xD8 |0 + \xF9\xA9 |0 + \xF8\xD9 |0 + \xEE\xBD |0 + \xD8\xC6 |0 + \xE4\xE3 |0 + \xF5\xCE |0 + \xDD\xD9 |0 + \xD9\xE7 |0 + \xD2\xB9 |0 + \xD5\xC3 |0 + \xDA\xE5 |0 + \xDA\xD0 |0 + \xD1\xD9 |0 + \xCE\xD8 |0 + \xCB\xDE |0 + \xF4\xAC |0 + \xDA\xFB |0 + \xF6\xE9 |0 + \xE8\xF3 |0 + \xCF\xAC |0 + \xF0\xF0 |0 + \xF4\xFD |0 + \xDB\xC8 |0 + \xCE\xC0 |0 + \xE3\xD4 |0 + \xD1\xCF |0 + \xF1\xF5 |0 + \xCD\xF2 |0 + \xCF\xEB |0 + \xCD\xB8 |0 + \xE3\xA6 |0 + \xD1\xDA |0 + \xF2\xA5 |0 + \xF2\xA6 |0 + \xE4\xCE |0 + \xD3\xFB |0 + \xF1\xA9 |0 + \xF2\xC9 |0 + \xEF\xD8 |0 + \xE6\xC9 |0 + \xD8\xB8 |0 + \xFA\xF3 |0 + \xF3\xB5 |0 + \xF8\xA4 |0 + \xD1\xF3 |0 + \xE6\xC8 |0 + \xF8\xDA |0 + \xDC\xE9 |0 + \xDE\xD7 |0 + \xCB\xDF |0 + \xCF\xEC |0 + \xF4\xDF |0 + \xD1\xF4 |0 + \xD2\xBA |0 + \xDF\xF2 |0 + \xE1\xB7 |0 + \xE2\xA3 |0 + \xD3\xFC |0 + \xED\xE6 |0 + \xDB\xC9 |0 + \xE4\xFA |0 + \xCF\xDE |0 + \xCE\xD0 |0 + \xD5\xD3 |0 + \xF3\xF5 |0 + \xF7\xAE |0 + \xEF\xC8 |0 + \xCD\xF3 |0 + \xF5\xCF |0 + \xE5\xF3 |0 + \xF0\xC2 |0 + \xCA\xD1 |0 + \xEA\xF1 |0 + \xD0\xA6 |0 + \xD9\xDA |0 + \xF0\xAB |0 + \xEB\xE7 |0 + \xE5\xC0 |0 + \xFC\xB5 |0 + \xE4\xC4 |0 + \xCC\xA9 |0 + \xFD\xC6 |0 + \xEA\xB5 |0 + \xE5\xAA |0 + \xDF\xBA |0 + \xE1\xDF |0 + \xDA\xD1 |0 + \xE1\xB8 |0 + \xE8\xF4 |0 + \xD3\xFD |0 + \xE2\xA4 |0 + \xF2\xCA |0 + \xDA\xE6 |0 + \xF7\xB3 |0 + \xFD\xCD |0 + \xF3\xB6 |0 + \xEE\xD7 |0 + \xF5\xC4 |0 + \xD8\xA4 |0 + \xF2\xA7 |0 + \xD9\xB8 |0 + \xD9\xB9 |0 + \xEF\xC9 |0 + \xD6\xCE |0 + \xF7\xCB |0 + \xDF\xAE |0 + \xE8\xF5 |0 + \xD2\xB5 |0 + \xD3\xD5 |0 + \xF4\xCC |0 + \xDA\xFC |0 + \xD9\xE8 |0 + \xF7\xEB |0 + \xF5\xC9 |0 + \xF3\xBC |0 + \xDA\xD2 |0 + \xD3\xB5 |0 + \xE8\xB6 |0 + \xD6\xCF |0 + \xF4\xBA |0 + \xF7\xC9 |0 + \xCC\xAA |0 + \xF0\xC3 |0 + \xCC\xD6 |0 + \xD0\xD3 |0 + \xD3\xBD |0 + \xDB\xFB |0 + \xCB\xE0 |0 + \xD3\xE4 |0 + \xF6\xF7 |0 + \xD5\xBA |0 + \xF3\xCD |0 + \xCB\xE1 |0 + \xEB\xF4 |0 + \xF4\xAD |0 + \xFC\xAA |0 + \xF7\xEC |0 + \xE8\xF6 |0 + \xDA\xE7 |0 + \xF7\xCC |0 + \xE5\xC1 |0 + \xE0\xEE |0 + \xD5\xFD |0 + \xCE\xE6 |0 + \xFC\xAB |0 + \xD5\xBB |0 + \xF2\xA8 |0 + \xE2\xA5 |0 + \xCD\xB9 |0 + \xEA\xF2 |0 + \xCB\xC7 |0 + \xCD\xF4 |0 + \xDB\xAF |0 + \xEF\xD9 |0 + \xCD\xBA |0 + \xFC\xF9 |0 + \xDF\xF3 |0 + \xCE\xE7 |0 + \xDA\xC2 |0 + \xCF\xAD |0 + \xE7\xF9 |0 + \xF8\xA8 |0 + \xF3\xE2 |0 + \xCA\xF2 |0 + \xDF\xA4 |0 + \xD4\xC4 |0 + \xCC\xD7 |0 + \xE5\xC2 |0 + \xCD\xBB |0 + \xEF\xDA |0 + \xEE\xD8 |0 + \xDD\xA7 |0 + \xE2\xA6 |0 + \xE0\xC0 |0 + \xD6\xB0 |0 + \xF8\xCA |0 + \xFC\xFA |0 + \xD9\xFE |0 + \xDE\xB0 |0 + \xDD\xEC |0 + \xDA\xE8 |0 + \xD4\xE0 |0 + \xD6\xF9 |0 + \xCD\xD7 |0 + \xDE\xD8 |0 + \xF2\xF8 |0 + \xE4\xD6 |0 + \xD0\xC5 |0 + \xF4\xAE |0 + \xDD\xA8 |0 + \xED\xC5 |0 + \xF3\xD6 |0 + \xDE\xD9 |0 + \xE3\xE6 |0 + \xD3\xA8 |0 + \xDB\xB0 |0 + \xE5\xDA |0 + \xE3\xBF |0 + \xDB\xB1 |0 + \xD5\xE9 |0 + \xE0\xC1 |0 + \xEF\xDB |0 + \xF0\xE9 |0 + \xD7\xB2 |0 + \xD0\xFD |0 + \xD9\xE9 |0 + \xD0\xFE |0 + \xEC\xED |0 + \xD3\xA9 |0 + \xF2\xA9 |0 + \xF0\xC4 |0 + \xE2\xE2 |0 + \xE9\xEF |0 + \xF9\xD1 |0 + \xE9\xD9 |0 + \xE8\xDA |0 + \xDA\xC3 |0 + \xDA\xC4 |0 + \xD4\xC5 |0 + \xE7\xFA |0 + \xCD\xE0 |0 + \xE3\xB0 |0 + \xDB\xB2 |0 + \xFB\xC4 |0 + \xF3\xE3 |0 + \xD9\xA5 |0 + \xFB\xE7 |0 + \xDD\xCB |0 + \xD0\xD4 |0 + \xE6\xB6 |0 + \xE0\xAE |0 + \xFD\xDA |0 + \xDC\xB5 |0 + \xE0\xF8 |0 + \xE7\xB1 |0 + \xF5\xF0 |0 + \xD8\xDC |0 + \xED\xC6 |0 + \xE1\xB9 |0 + \xE3\xC0 |0 + \xF9\xC0 |0 + \xE9\xF0 |0 + \xD9\xDB |0 + \xF3\xE4 |0 + \xDC\xB6 |0 + \xE4\xE9 |0 + \xF0\xC5 |0 + \xE3\xC1 |0 + \xFC\xCC |0 + \xFC\xCD |0 + \xF2\xCB |0 + \xF2\xCC |0 + \xE4\xCF |0 + \xF1\xDB |0 + \xFA\xD9 |0 + \xF1\xB8 |0 + \xFD\xF5 |0 + \xE0\xF9 |0 + \xE7\xFB |0 + \xFC\xB7 |0 + \xFC\xE4 |0 + \xFB\xC5 |0 + \xE3\xE7 |0 + \xD8\xB9 |0 + \xF6\xF8 |0 + \xDC\xC5 |0 + \xCC\xD8 |0 + \xE0\xAF |0 + \xF4\xE7 |0 + \xEF\xDC |0 + \xCF\xFC |0 + \xEF\xDD |0 + \xF2\xAA |0 + \xFD\xBE |0 + \xCA\xAC |0 + \xFD\xBB |0 + \xFD\xC7 |0 + \xE7\xB2 |0 + \xEA\xD1 |0 + \xDF\xF4 |0 + \xD1\xEC |0 + \xE4\xDE |0 + \xE5\xC3 |0 + \xD9\xA6 |0 + \xCD\xBC |0 + \xF3\xE5 |0 + \xED\xD5 |0 + \xD9\xBA |0 + \xED\xE7 |0 + \xFB\xB5 |0 + \xF8\xEC |0 + \xE0\xE7 |0 + \xCC\xD9 |0 + \xD4\xC6 |0 + \xE7\xA5 |0 + \xD5\xF5 |0 + \xD3\xBE |0 + \xFC\xFB |0 + \xE4\xF2 |0 + \xDF\xF5 |0 + \xE8\xF8 |0 + \xF8\xED |0 + \xCE\xC7 |0 + \xFD\xF6 |0 + \xE8\xD8 |0 + \xCD\xD8 |0 + \xE7\xD6 |0 + \xCC\xDA |0 + \xCA\xE3 |0 + \xDF\xF6 |0 + \xF0\xC7 |0 + \xF0\xC6 |0 + \xD8\xBA |0 + \xF1\xF4 |0 + \xF4\xF0 |0 + \xF5\xCC |0 + \xFC\xE5 |0 + \xEA\xC5 |0 + \xEA\xF3 |0 + \xDD\xDB |0 + \xDC\xD7 |0 + \xDE\xFD |0 + \xF2\xF9 |0 + \xD5\xC7 |0 + \xD8\xD0 |0 + \xF0\xC8 |0 + \xD1\xA1 |0 + \xD1\xA2 |0 + \xD9\xD4 |0 + \xD6\xE8 |0 + \xD9\xCA |0 + \xDA\xB1 |0 + \xD8\xC7 |0 + \xDC\xE2 |0 + \xF3\xCE |0 + \xF5\xF4 |0 + \xF1\xB9 |0 + \xDA\xD3 |0 + \xF6\xEA |0 + \xCF\xF5 |0 + \xFD\xAE |0 + \xCA\xD2 |0 + \xDF\xB4 |0 + \xD7\xDD |0 + \xFA\xBA |0 + \xEE\xA7 |0 + \xF5\xBD |0 + \xF8\xF5 |0 + \xED\xE8 |0 + \xD4\xE1 |0 + \xD1\xA3 |0 + \xE1\xD6 |0 + \xF9\xF8 |0 + \xDB\xCA |0 + \xCB\xF9 |0 + \xD4\xD4 |0 + \xD9\xDC |0 + \xEE\xBE |0 + \xF7\xED |0 + \xD2\xEE |0 + \xE1\xE6 |0 + \xF7\xF9 |0 + \xDD\xED |0 + \xE8\xDB |0 + \xDB\xB3 |0 + \xD1\xF7 |0 + \xE0\xB0 |0 + \xD4\xE2 |0 + \xF6\xD7 |0 + \xD7\xF9 |0 + \xD8\xDD |0 + \xCD\xFD |0 + \xF2\xAB |0 + \xCD\xBD |0 + \xF8\xC2 |0 + \xF2\xAC |0 + \xCA\xAD |0 + \xCA\xAE |0 + \xCF\xAE |0 + \xE3\xC2 |0 + \xDC\xB7 |0 + \xDB\xDA |0 + \xD9\xBB |0 + \xCA\xF3 |0 + \xF6\xD3 |0 + \xE6\xF8 |0 + \xEA\xF5 |0 + \xEA\xF6 |0 + \xF6\xF9 |0 + \xCF\xAF |0 + \xCA\xD3 |0 + \xCA\xAF |0 + \xD2\xB0 |0 + \xF1\xBA |0 + \xD7\xB3 |0 + \xE3\xC3 |0 + \xF3\xFD |0 + \xDE\xDA |0 + \xDE\xDB |0 + \xEF\xDE |0 + \xE2\xE3 |0 + \xEE\xFB |0 + \xDF\xF7 |0 + \xD7\xCA |0 + \xCE\xE8 |0 + \xDB\xDB |0 + \xF1\xBB |0 + \xE9\xF1 |0 + \xFA\xB7 |0 + \xD0\xC6 |0 + \xCC\xAB |0 + \xEE\xA8 |0 + \xCB\xFA |0 + \xF9\xF9 |0 + \xCC\xFD |0 + \xD3\xFE |0 + \xE4\xD0 |0 + \xF2\xEE |0 + \xD4\xD5 |0 + \xDF\xCD |0 + \xFC\xB8 |0 + \xD1\xD0 |0 + \xF2\xCD |0 + \xF7\xD2 |0 + \xCA\xD4 |0 + \xD5\xD9 |0 + \xD8\xDE |0 + \xCD\xD9 |0 + \xEE\xA9 |0 + \xF6\xBC |0 + \xCC\xDB |0 + \xF0\xC9 |0 + \xFC\xFC |0 + \xE8\xC9 |0 + \xF4\xFE |0 + \xE7\xFC |0 + \xD7\xDE |0 + \xDE\xDC |0 + \xF0\xAC |0 + \xCC\xFE |0 + \xCD\xE1 |0 + \xE1\xBA |0 + \xDB\xEF |0 + \xDA\xB2 |0 + \xD1\xA5 |0 + \xDC\xB8 |0 + \xD8\xF6 |0 + \xD1\xA4 |0 + \xCD\xE2 |0 + \xDC\xEA |0 + \xF0\xF7 |0 + \xF0\xCA |0 + \xD0\xBE |0 + \xDD\xDC |0 + \xD4\xD6 |0 + \xD3\xD6 |0 + \xED\xD0 |0 + \xCD\xA1 |0 + \xDF\xB5 |0 + \xDF\xF8 |0 + \xD4\xA1 |0 + \xCE\xB2 |0 + \xE8\xCA |0 + \xEB\xF5 |0 + \xE3\xD5 |0 + \xF5\xD0 |0 + \xF5\xA1 |0 + \xD9\xA7 |0 + \xE5\xAB |0 + \xE6\xCB |0 + \xF5\xF1 |0 + \xE5\xC5 |0 + \xF9\xA3 |0 + \xE0\xDB |0 + \xF6\xEB |0 + \xCB\xF1 |0 + \xD9\xEA |0 + \xF5\xA2 |0 + \xD7\xD1 |0 + \xD1\xF8 |0 + \xEA\xF8 |0 + \xEA\xF9 |0 + \xDA\xB3 |0 + \xEF\xDF |0 + \xF1\xEF |0 + \xE5\xF6 |0 + \xEE\xBF |0 + \xE2\xE4 |0 + \xD0\xBF |0 + \xFA\xAC |0 + \xF5\xD1 |0 + \xE7\xB3 |0 + \xE9\xBE |0 + \xF2\xCE |0 + \xDB\xB4 |0 + \xFC\xCE |0 + \xDD\xEE |0 + \xE7\xB4 |0 + \xD7\xB4 |0 + \xF7\xB4 |0 + \xCD\xBE |0 + \xDA\xE9 |0 + \xCF\xB0 |0 + \xF7\xD9 |0 + \xF3\xE6 |0 + \xCE\xD9 |0 + \xCE\xAA |0 + \xCB\xC8 |0 + \xD0\xA7 |0 + \xF0\xCB |0 + \xD0\xC7 |0 + \xE4\xC5 |0 + \xDB\xE0 |0 + \xD5\xDA |0 + \xD7\xA7 |0 + \xEE\xC0 |0 + \xF8\xF6 |0 + \xF5\xD2 |0 + \xED\xE9 |0 + \xD9\xBC |0 + \xE5\xC6 |0 + \xF5\xA3 |0 + \xDA\xD4 |0 + \xE2\xA7 |0 + \xFB\xFC |0 + \xF1\xDC |0 + \xCA\xF4 |0 + \xE8\xFA |0 + \xCE\xE9 |0 + \xE9\xF8 |0 + \xE2\xE5 |0 + \xD0\xB9 |0 + \xD4\xF2 |0 + \xD1\xA6 |0 + \xDF\xCE |0 + \xFC\xF4 |0 + \xD3\xAA |0 + \xCC\xAC |0 + \xEF\xE0 |0 + \xE5\xE5 |0 + \xD0\xD5 |0 + \xDB\xFC |0 + \xFC\xE6 |0 + \xCB\xFE |0 + \xED\xEA |0 + \xDE\xB1 |0 + \xF9\xE3 |0 + \xD4\xA2 |0 + \xCF\xF6 |0 + \xD6\xD0 |0 + \xD5\xEA |0 + \xF1\xEE |0 + \xFA\xCB |0 + \xE5\xA1 |0 + \xD5\xB1 |0 + \xCF\xED |0 + \xED\xEB |0 + \xD5\xB2 |0 + \xD5\xBC |0 + \xFD\xE2 |0 + \xF3\xAD |0 + \xFD\xDB |0 + \xE9\xB0 |0 + \xD1\xA7 |0 + \xFD\xE3 |0 + \xCE\xB3 |0 + \xFD\xE4 |0 + \xFA\xCE |0 + \xCA\xB0 |0 + \xF7\xA7 |0 + \xCF\xB1 |0 + \xE6\xA2 |0 + \xFC\xB6 |0 + \xF2\xAD |0 + \xEF\xE1 |0 + \xF3\xAE |0 + \xDC\xC6 |0 + \xD9\xEB |0 + \xE8\xE0 |0 + \xE1\xA8 |0 + \xD5\xF6 |0 + \xCF\xFD |0 + \xDE\xDD |0 + \xD9\xD1 |0 + \xE4\xEA |0 + \xF2\xCF |0 + \xF7\xBF |0 + \xE2\xE6 |0 + \xE2\xA8 |0 + \xE3\xD6 |0 + \xED\xD1 |0 + \xE9\xF9 |0 + \xD6\xB1 |0 + \xDE\xB2 |0 + \xE0\xE8 |0 + \xD3\xAB |0 + \xEB\xDC |0 + \xDF\xAF |0 + \xCA\xC3 |0 + \xEE\xFC |0 + \xFD\xC3 |0 + \xEB\xF6 |0 + \xCF\xB2 |0 + \xD9\xEC |0 + \xD9\xBD |0 + \xD8\xDF |0 + \xD4\xB8 |0 + \xEB\xBE |0 + \xDD\xEF |0 + \xDD\xF0 |0 + \xDD\xF1 |0 + \xDD\xF2 |0 + \xD9\xBE |0 + \xFB\xC6 |0 + \xCF\xB3 |0 + \xEE\xFD |0 + \xE4\xAB |0 + \xDA\xC5 |0 + \xD8\xEC |0 + \xD1\xA8 |0 + \xE2\xA9 |0 + \xDE\xBC |0 + \xE7\xB5 |0 + \xDB\xF0 |0 + \xEF\xE2 |0 + \xF1\xF0 |0 + \xCF\xB4 |0 + \xDB\xF1 |0 + \xE0\xB1 |0 + \xDF\xA5 |0 + \xF9\xD2 |0 + \xE7\xFD |0 + \xE6\xA3 |0 + \xFB\xF1 |0 + \xCB\xB0 |0 + \xF2\xAE |0 + \xCD\xE7 |0 + \xE8\xDC |0 + \xE7\xD7 |0 + \xF7\xC0 |0 + \xD0\xE3 |0 + \xDA\xA1 |0 + \xCC\xBD |0 + \xD1\xA9 |0 + \xDD\xCC |0 + \xE3\xFE |0 + \xD1\xAA |0 + \xE8\xAA |0 + \xEA\xB6 |0 + \xF9\xFA |0 + \xE6\xCC |0 + \xF6\xD8 |0 + \xD4\xC7 |0 + \xD9\xCB |0 + \xD9\xD2 |0 + \xD3\xCB |0 + \xD8\xF7 |0 + \xDA\xA9 |0 + \xF5\xF8 |0 + \xDE\xDE |0 + \xF2\xAF |0 + \xF8\xA9 |0 + \xD8\xC8 |0 + \xEE\xC1 |0 + \xF9\xC1 |0 + \xDD\xF3 |0 + \xEA\xFA |0 + \xF6\xBD |0 + \xE1\xBB |0 + \xCD\xBF |0 + \xF4\xD4 |0 + \xE6\xCD |0 + \xFC\xCF |0 + \xFB\xA2 |0 + \xE0\xDC |0 + \xF4\xBB |0 + \xDA\xD5 |0 + \xF9\xB2 |0 + \xFB\xF2 |0 + \xDB\xF6 |0 + \xDE\xDF |0 + \xDB\xF2 |0 + \xF8\xDC |0 + \xF7\xEE |0 + \xEB\xE8 |0 + \xD2\xFA |0 + \xF1\xBC |0 + \xFA\xDA |0 + \xDA\xEA |0 + \xDA\xC6 |0 + \xF7\xC1 |0 + \xE7\xB6 |0 + \xE5\xC7 |0 + \xD6\xAC |0 + \xDC\xC7 |0 + \xE1\xA9 |0 + \xE2\xAA |0 + \xD5\xA6 |0 + \xD4\xD7 |0 + \xF2\xD0 |0 + \xEA\xFB |0 + \xE0\xDD |0 + \xFB\xF3 |0 + \xF1\xBD |0 + \xE2\xE7 |0 + \xFD\xD7 |0 + \xCE\xC8 |0 + \xEA\xB7 |0 + \xFC\xC0 |0 + \xFD\xE7 |0 + \xF7\xEF |0 + \xD7\xB5 |0 + \xEF\xBA |0 + \xF1\xDD |0 + \xDE\xB3 |0 + \xE8\xCB |0 + \xF8\xDD |0 + \xFB\xC7 |0 + \xD5\xC8 |0 + \xD7\xDF |0 + \xDD\xA9 |0 + \xE9\xB1 |0 + \xFA\xAD |0 + \xF6\xD9 |0 + \xFA\xF4 |0 + \xF8\xAA |0 + \xE6\xEE |0 + \xCC\xDC |0 + \xE1\xBC |0 + \xE0\xEF |0 + \xE9\xBF |0 + \xFC\xFD |0 + \xE6\xCE |0 + \xE1\xD7 |0 + \xE6\xCF |0 + \xF4\xF1 |0 + \xE4\xF3 |0 + \xE4\xFB |0 + \xF9\xE4 |0 + \xEF\xE3 |0 + \xCF\xEE |0 + \xF6\xBE |0 + \xE0\xB2 |0 + \xFC\xFE |0 + \xD1\xAB |0 + \xD7\xFA |0 + \xFB\xC8 |0 + \xE2\xD7 |0 + \xD4\xA3 |0 + \xF0\xF8 |0 + \xD7\xA8 |0 + \xE1\xE7 |0 + \xD3\xBF |0 + \xEF\xE4 |0 + \xD7\xC5 |0 + \xEB\xE2 |0 + \xFC\xE7 |0 + \xE4\xA2 |0 + \xE2\xE8 |0 + \xE6\xD0 |0 + \xFB\xE8 |0 + \xF4\xE8 |0 + \xE5\xF4 |0 + \xF4\xBC |0 + \xF4\xD5 |0 + \xDF\xB6 |0 + \xFC\xB9 |0 + \xEE\xC2 |0 + \xCA\xF5 |0 + \xEF\xE5 |0 + \xCB\xE2 |0 + \xD4\xA4 |0 + \xDE\xE0 |0 + \xDA\xFD |0 + \xE4\xC6 |0 + \xE8\xBE |0 + \xE0\xDE |0 + \xF6\xB4 |0 + \xEA\xD2 |0 + \xF9\xFB |0 + \xE0\xC2 |0 + \xCA\xE4 |0 + \xE7\xB7 |0 + \xEA\xFD |0 + \xD9\xDD |0 + \xDA\xB4 |0 + \xEE\xAA |0 + \xFB\xE9 |0 + \xDB\xCB |0 + \xDA\xB5 |0 + \xF1\xBE |0 + \xD3\xAC |0 + \xFB\xC9 |0 + \xDF\xCF |0 + \xD3\xC0 |0 + \xE3\xD7 |0 + \xEF\xE6 |0 + \xFC\xD0 |0 + \xE9\xC0 |0 + \xF5\xD3 |0 + \xEC\xDC |0 + \xF7\xB7 |0 + \xEA\xB8 |0 + \xD1\xF9 |0 + \xDC\xC8 |0 + \xEA\xB9 |0 + \xF1\xDE |0 + \xD7\xB6 |0 + \xCF\xB5 |0 + \xD9\xA8 |0 + \xEC\xEE |0 + \xDD\xAA |0 + \xCD\xA2 |0 + \xE8\xAE |0 + \xE1\xBD |0 + \xF2\xD1 |0 + \xE9\xC1 |0 + \xD2\xFC |0 + \xDB\xB5 |0 + \xF3\xE7 |0 + \xD8\xFE |0 + \xFC\xD1 |0 + \xED\xB2 |0 + \xF4\xAF |0 + \xFB\xA3 |0 + \xFC\xC1 |0 + \xEE\xAB |0 + \xD4\xA5 |0 + \xF4\xF2 |0 + \xEE\xD9 |0 + \xFB\xCA |0 + \xCD\xE3 |0 + \xD8\xBB |0 + \xE5\xDB |0 + \xF8\xF7 |0 + \xF6\xD4 |0 + \xD7\xA9 |0 + \xCB\xC9 |0 + \xE6\xD1 |0 + \xF0\xCC |0 + \xD8\xAE |0 + \xF9\xD3 |0 + \xD5\xFE |0 + \xD8\xBC |0 + \xF2\xB0 |0 + \xE2\xAB |0 + \xF3\xE8 |0 + \xEF\xC2 |0 + \xED\xEC |0 + \xE7\xB8 |0 + \xDA\xFE |0 + \xCC\xBE |0 + \xF2\xFC |0 + \xDA\xEB |0 + \xE2\xD8 |0 + \xED\xD6 |0 + \xD6\xD1 |0 + \xE0\xB3 |0 + \xFC\xD2 |0 + \xEB\xC8 |0 + \xD3\xC1 |0 + \xF0\xCD |0 + \xCF\xF7 |0 + \xED\xD2 |0 + \xD4\xD8 |0 + \xDC\xC9 |0 + \xD7\xF1 |0 + \xDF\xBB |0 + \xF3\xA5 |0 + \xF4\xCD |0 + \xF1\xBF |0 + \xF8\xB1 |0 + \xE9\xFA |0 + \xFB\xCB |0 + \xCA\xD5 |0 + \xF9\xD4 |0 + \xF7\xCA |0 + \xD6\xC8 |0 + \xFC\xE8 |0 + \xF3\xBD |0 + \xEE\xFE |0 + \xE7\xFE |0 + \xD3\xC2 |0 + \xD3\xB6 |0 + \xCC\xAD |0 + \xF6\xFA |0 + \xD6\xB2 |0 + \xD2\xD8 |0 + \xE7\xD8 |0 + \xE3\xA5 |0 + \xE7\xB9 |0 + \xF0\xAD |0 + \xFB\xCC |0 + \xEB\xA1 |0 + \xD4\xA6 |0 + \xFB\xCD |0 + \xD5\xBD |0 + \xF1\xDF |0 + \xF6\xFB |0 + \xDE\xB4 |0 + \xD5\xEB |0 + \xE5\xC8 |0 + \xFB\xA4 |0 + \xD4\xB9 |0 + \xDE\xE1 |0 + \xE4\xA3 |0 + \xD7\xB7 |0 + \xF8\xEE |0 + \xDE\xB5 |0 + \xD6\xD2 |0 + \xF9\xD5 |0 + \xE7\xBA |0 + \xEB\xD5 |0 + \xD5\xF7 |0 + \xEF\xE7 |0 + \xE1\xBE |0 + \xFA\xAE |0 + \xD6\xE9 |0 + \xD6\xEE |0 + \xE7\xBB |0 + \xEC\xCB |0 + \xD5\xB3 |0 + \xCE\xB4 |0 + \xFB\xA5 |0 + \xE1\xEE |0 + \xF7\xA8 |0 + \xFB\xCE |0 + \xD8\xBD |0 + \xFB\xFD |0 + \xFC\xE9 |0 + \xCF\xB6 |0 + \xED\xC7 |0 + \xEE\xAC |0 + \xCC\xDD |0 + \xF6\xA7 |0 + \xE6\xFA |0 + \xF5\xA4 |0 + \xFD\xDC |0 + \xED\xB3 |0 + \xCE\xC9 |0 + \xEF\xE8 |0 + \xE1\xBF |0 + \xFA\xDB |0 + \xCB\xE3 |0 + \xF7\xA9 |0 + \xFB\xA6 |0 + \xDC\xB9 |0 + \xF1\xC0 |0 + \xED\xC8 |0 + \xEF\xC3 |0 + \xD6\xAD |0 + \xFD\xCE |0 + \xE8\xA1 |0 + \xFB\xF4 |0 + \xD5\xA7 |0 + \xF1\xF6 |0 + \xE6\xD3 |0 + \xCC\xDE |0 + \xF8\xB2 |0 + \xDC\xEB |0 + \xFD\xB6 |0 + \xE5\xEA |0 + \xF1\xE0 |0 + \xDB\xCC |0 + \xDD\xCD |0 + \xD4\xC8 |0 + \xD9\xED |0 + \xF5\xA5 |0 + \xE6\xFB |0 + \xE6\xD4 |0 + \xFD\xC8 |0 + \xD6\xA1 |0 + \xFD\xBF |0 + \xFC\xD3 |0 + \xEF\xA1 |0 + \xE7\xBC |0 + \xD1\xEE |0 + \xE6\xD5 |0 + \xE9\xF2 |0 + \xDF\xB0 |0 + \xD8\xE0 |0 + \xFC\xBA |0 + \xFD\xAF |0 + \xF0\xCE |0 + \xDB\xE1 |0 + \xE5\xC9 |0 + \xED\xB4 |0 + \xE0\xC3 |0 + \xE3\xD8 |0 + \xE9\xFB |0 + \xEA\xA8 |0 + \xFD\xB7 |0 + \xFB\xA7 |0 + \xE9\xC2 |0 + \xFD\xF7 |0 + \xE2\xD9 |0 + \xDC\xEC |0 + \xE8\xA2 |0 + \xE6\xF0 |0 + \xFD\xF8 |0 + \xFD\xF9 |0 + \xF6\xBF |0 + \xE7\xA7 |0 + \xE6\xD7 |0 + \xD4\xF3 |0 + \xD4\xC9 |0 + \xD6\xFA |0 + \xD7\xF2 |0 + \xE1\xC0 |0 + \xDB\xE2 |0 + \xE6\xD8 |0 + \xE7\xBD |0 + \xF0\xCF |0 + \xF3\xBE |0 + \xE2\xAC |0 + \xF5\xB7 |0 + \xE0\xF0 |0 + \xFD\xB8 |0 + \xE3\xE8 |0 + \xD4\xA7 |0 + \xE8\xFC |0 + \xFA\xD2 |0 + \xF8\xEF |0 + \xD6\xD3 |0 + \xD5\xB4 |0 + \xF0\xD0 |0 + \xF7\xF0 |0 + \xEE\xB3 |0 + \xEA\xBA |0 + \xEA\xD3 |0 + \xED\xC9 |0 + \xDD\xAB |0 + \xE5\xAC |0 + \xFD\xA1 |0 + \xDF\xD0 |0 + \xEC\xB3 |0 + \xDF\xD1 |0 + \xED\xED |0 + \xF8\xB8 |0 + \xF7\xFA |0 + \xF8\xAB |0 + \xF4\xE0 |0 + \xD4\xBA |0 + \xE4\xB3 |0 + \xE9\xDA |0 + \xDE\xB6 |0 + \xD9\xBF |0 + \xD9\xC0 |0 + \xD6\xEF |0 + \xD9\xCC |0 + \xDA\xAA |0 + \xDF\xE5 |0 + \xF7\xE5 |0 + \xCC\xB2 |0 + \xDF\xF9 |0 + \xD7\xE0 |0 + \xD4\xBB |0 + \xFD\xFA |0 + \xCC\xB3 |0 + \xDB\xF3 |0 + \xDF\xD2 |0 + \xCE\xCA |0 + \xEE\xDA |0 + \xE4\xE4 |0 + \xFB\xCF |0 + \xCF\xB7 |0 + \xEE\xC3 |0 + \xCE\xEA |0 + \xE2\xAD |0 + \xD7\xE1 |0 + \xFA\xF5 |0 + \xD5\xC9 |0 + \xF8\xAC |0 + \xE7\xD9 |0 + \xF3\xE9 |0 + \xD8\xED |0 + \xE3\xC4 |0 + \xF0\xF1 |0 + \xE8\xE5 |0 + \xE0\xFA |0 + \xEE\xC4 |0 + \xD9\xDE |0 + \xEB\xA2 |0 + \xEB\xA3 |0 + \xFC\xC2 |0 + \xEA\xBB |0 + \xE8\xAB |0 + \xDE\xE2 |0 + \xED\xEF |0 + \xE8\xA3 |0 + \xCF\xF1 |0 + \xD4\xBC |0 + \xFC\xEA |0 + \xE7\xBE |0 + \xFC\xF2 |0 + \xD6\xB4 |0 + \xE2\xAE |0 + \xD3\xB7 |0 + \xFA\xCC |0 + \xFA\xDC |0 + \xED\xB5 |0 + \xE1\xE3 |0 + \xE8\xAC |0 + \xE8\xDD |0 + \xEF\xE9 |0 + \xF4\xBD |0 + \xCF\xB8 |0 + \xE9\xDB |0 + \xD1\xAC |0 + \xDA\xC7 |0 + \xEB\xC9 |0 + \xE8\xCC |0 + \xDE\xB7 |0 + \xD6\xBC |0 + \xD3\xE5 |0 + \xFA\xDD |0 + \xDA\xD6 |0 + \xCA\xB1 |0 + \xDA\xC8 |0 + \xDF\xA6 |0 + \xF9\xB3 |0 + \xF2\xD2 |0 + \xCA\xC4 |0 + \xCE\xCB |0 + \xCD\xF5 |0 + \xFD\xB0 |0 + \xD5\xA8 |0 + \xF1\xC1 |0 + \xE2\xE9 |0 + \xDC\xCA |0 + \xEC\xB4 |0 + \xFA\xC0 |0 + \xFB\xA8 |0 + \xD0\xA8 |0 + \xDA\xEC |0 + \xD9\xEE |0 + \xE0\xFB |0 + \xEF\xEA |0 + \xFA\xDE |0 + \xE0\xC4 |0 + \xCF\xB9 |0 + \xD5\xCA |0 + \xD7\xE2 |0 + \xE2\xAF |0 + \xD7\xB8 |0 + \xE8\xCD |0 + \xF6\xDA |0 + \xEF\xA2 |0 + \xE2\xDA |0 + \xF6\xFC |0 + \xFB\xD0 |0 + \xD1\xAD |0 + \xCD\xE4 |0 + \xD1\xAE |0 + \xDC\xED |0 + \xE8\xCE |0 + \xF0\xF9 |0 + \xCE\xB5 |0 + \xE6\xFC |0 + \xD7\xFB |0 + \xD0\xD6 |0 + \xDD\xF5 |0 + \xF7\xF1 |0 + \xF6\xFD |0 + \xDB\xF7 |0 + \xFB\xEA |0 + \xE9\xDC |0 + \xD9\xC1 |0 + \xF5\xF2 |0 + \xE0\xC5 |0 + \xEA\xD4 |0 + \xF9\xC2 |0 + \xEA\xBC |0 + \xD2\xC5 |0 + \xFB\xD1 |0 + \xE7\xC0 |0 + \xEB\xA5 |0 + \xDF\xFA |0 + \xE3\xA2 |0 + \xD7\xB9 |0 + \xE9\xC3 |0 + \xE8\xFD |0 + \xE8\xAF |0 + \xF2\xD3 |0 + \xFB\xA9 |0 + \xD8\xA5 |0 + \xD5\xCB |0 + \xD0\xC8 |0 + \xD1\xAF |0 + \xD7\xE3 |0 + \xE0\xC6 |0 + \xD6\xA2 |0 + \xED\xF0 |0 + \xD7\xF3 |0 + \xFC\xD4 |0 + \xDA\xD7 |0 + \xCC\xDF |0 + \xF2\xD4 |0 + \xD1\xB0 |0 + \xCC\xE0 |0 + \xDB\xFD |0 + \xF3\xBF |0 + \xF0\xD1 |0 + \xFC\xBB |0 + \xE2\xB0 |0 + \xE6\xA5 |0 + \xE2\xDB |0 + \xDF\xDE |0 + \xE0\xC7 |0 + \xF2\xEF |0 + \xCC\xE1 |0 + \xD6\xEA |0 + \xE7\xC2 |0 + \xCE\xB6 |0 + \xF3\xC0 |0 + \xCD\xFE |0 + \xFB\xD2 |0 + \xF8\xF8 |0 + \xF7\xFB |0 + \xE8\xBF |0 + \xE8\xB7 |0 + \xED\xB6 |0 + \xDC\xBA |0 + \xCC\xB4 |0 + \xF1\xF7 |0 + \xE8\xB8 |0 + \xCA\xF6 |0 + \xE4\xA4 |0 + \xF4\xD6 |0 + \xDF\xE6 |0 + \xDF\xA7 |0 + \xDF\xE7 |0 + \xE1\xC1 |0 + \xE9\xC4 |0 + \xDC\xCB |0 + \xE9\xC5 |0 + \xEF\xA3 |0 + \xEB\xA6 |0 + \xCB\xA3 |0 + \xE3\xE9 |0 + \xD1\xFB |0 + \xEF\xA4 |0 + \xEF\xEB |0 + \xD0\xB4 |0 + \xCD\xA3 |0 + \xE8\xE6 |0 + \xEF\xA5 |0 + \xD3\xCC |0 + \xDA\xED |0 + \xD7\xBA |0 + \xF2\xD5 |0 + \xF5\xE5 |0 + \xD9\xEF |0 + \xF9\xB4 |0 + \xD5\xD4 |0 + \xFD\xCF |0 + \xDB\xE3 |0 + \xF1\xE1 |0 + \xEC\xB6 |0 + \xFB\xFE |0 + \xD3\xD7 |0 + \xD1\xB1 |0 + \xCB\xB1 |0 + \xD1\xB2 |0 + \xCB\xB2 |0 + \xF1\xC2 |0 + \xF4\xE1 |0 + \xF9\xB5 |0 + \xE1\xC3 |0 + \xE1\xC2 |0 + \xEB\xF7 |0 + \xDF\xA8 |0 + \xCB\xCA |0 + \xE6\xB9 |0 + \xF8\xDE |0 + \xF9\xAA |0 + \xCA\xF7 |0 + \xED\xB7 |0 + \xD3\xB8 |0 + \xF2\xD6 |0 + \xD4\xD9 |0 + \xEE\xC5 |0 + \xF2\xF0 |0 + \xCA\xB2 |0 + \xDC\xBB |0 + \xF1\xF8 |0 + \xEC\xB7 |0 + \xE5\xCA |0 + \xF6\xC0 |0 + \xFD\xDD |0 + \xD4\xE3 |0 + \xCC\xE2 |0 + \xF7\xD4 |0 + \xD7\xE5 |0 + \xD3\xC3 |0 + \xD8\xA6 |0 + \xF6\xC1 |0 + \xDD\xF6 |0 + \xCD\xC0 |0 + \xE5\xDC |0 + \xE5\xCB |0 + \xE1\xC4 |0 + \xE8\xB0 |0 + \xF4\xB0 |0 + \xF3\xEA |0 + \xDA\xEE |0 + \xD7\xBB |0 + \xE2\xB1 |0 + \xD7\xAA |0 + \xD6\xFB |0 + \xE4\xDF |0 + \xCA\xD6 |0 + \xEB\xA8 |0 + \xDB\xFE |0 + \xF6\xC2 |0 + \xEF\xBB |0 + \xD4\xFD |0 + \xE0\xC8 |0 + \xE8\xB9 |0 + \xEF\xA6 |0 + \xCD\xA4 |0 + \xD4\xF4 |0 + \xDB\xA1 |0 + \xDB\xDC |0 + \xDB\xDD |0 + \xEE\xDC |0 + \xCB\xCB |0 + \xFC\xD5 |0 + \xCE\xEB |0 + \xCD\xC1 |0 + \xFB\xD3 |0 + \xF9\xAB |0 + \xF5\xD4 |0 + \xD9\xA9 |0 + \xE9\xDD |0 + \xDB\xCD |0 + \xDD\xCE |0 + \xE7\xC3 |0 + \xEC\xCC |0 + \xF9\xEC |0 + \xCB\xCC |0 + \xE0\xFC |0 + \xD4\xA8 |0 + \xED\xD3 |0 + \xD8\xEF |0 + \xF2\xD7 |0 + \xCA\xF8 |0 + \xDA\xEF |0 + \xD6\xD4 |0 + \xD9\xCD |0 + \xD8\xEE |0 + \xF2\xC1 |0 + \xDF\xD3 |0 + \xDA\xF0 |0 + \xE2\xEA |0 + \xE0\xFD |0 + \xD8\xF8 |0 + \xF7\xAF |0 + \xDA\xB6 |0 + \xCA\xD7 |0 + \xF2\xD8 |0 + \xD8\xF9 |0 + \xFA\xDF |0 + \xCF\xEF |0 + \xD9\xC2 |0 + \xF0\xD2 |0 + \xE4\xD1 |0 + \xF3\xB7 |0 + \xFA\xE0 |0 + \xEF\xEC |0 + \xE2\xB2 |0 + \xD4\xBD |0 + \xD9\xCE |0 + \xF4\xE2 |0 + \xD4\xA9 |0 + \xCD\xC2 |0 + \xE7\xDA |0 + \xF2\xD9 |0 + \xD9\xAA |0 + \xD8\xBE |0 + \xDC\xAD |0 + \xE2\xEB |0 + \xD6\xFC |0 + \xCA\xF9 |0 + \xD4\xDA |0 + \xF4\xD7 |0 + \xCC\xA1 |0 + \xCF\xBA |0 + \xF5\xB8 |0 + \xD9\xC3 |0 + \xD0\xE8 |0 + \xE3\xC5 |0 + \xEB\xF8 |0 + \xF2\xB1 |0 + \xCF\xBB |0 + \xD3\xAD |0 + \xE8\xE1 |0 + \xCE\xEC |0 + \xE0\xB4 |0 + \xDE\xE3 |0 + \xDD\xF7 |0 + \xF2\xB2 |0 + \xF3\xF6 |0 + \xF6\xDB |0 + \xD7\xFE |0 + \xF8\xDF |0 + \xF7\xF2 |0 + \xD0\xA9 |0 + \xE6\xDA |0 + \xF5\xA6 |0 + \xD7\xBC |0 + \xCC\xE3 |0 + \xE6\xDB |0 + \xDD\xDD |0 + \xD1\xB3 |0 + \xEF\xED |0 + \xD6\xDE |0 + \xE4\xF4 |0 + \xE1\xEF |0 + \xDD\xF8 |0 + \xE8\xCF |0 + \xCA\xE5 |0 + \xDC\xA1 |0 + \xE0\xB5 |0 + \xFC\xAC |0 + \xFC\xAD |0 + \xD8\xA7 |0 + \xED\xB8 |0 + \xDB\xB6 |0 + \xD6\xF0 |0 + \xF3\xAF |0 + \xCD\xA5 |0 + \xDA\xF1 |0 + \xD8\xA8 |0 + \xCC\xE4 |0 + \xD1\xB4 |0 + \xCA\xD8 |0 + \xDA\xF2 |0 + \xF5\xA7 |0 + \xF5\xA8 |0 + \xE6\xA6 |0 + \xD5\xEC |0 + \xD5\xF8 |0 + \xDA\xF3 |0 + \xE3\xC6 |0 + \xDE\xE4 |0 + \xDE\xE5 |0 + \xD1\xB5 |0 + \xD1\xB6 |0 + \xD1\xB7 |0 + \xF2\xB3 |0 + \xE9\xDE |0 + \xF0\xD3 |0 + \xF2\xB4 |0 + \xF0\xD4 |0 + \xCB\xE4 |0 + \xFB\xD4 |0 + \xF5\xE6 |0 + \xE3\xEA |0 + \xDE\xE6 |0 + \xDF\xD4 |0 + \xF8\xF9 |0 + \xF0\xAE |0 + \xD1\xB8 |0 + \xD6\xDF |0 + \xD0\xD7 |0 + \xFC\xA1 |0 + \xEF\xEE |0 + \xDC\xD8 |0 + \xE9\xDF |0 + \xE5\xDD |0 + \xFD\xFB |0 + \xE0\xC9 |0 + \xD6\xC9 |0 + \xD4\xAA |0 + \xE5\xCC |0 + \xE9\xE0 |0 + \xD0\xD8 |0 + \xFC\xA2 |0 + \xD4\xBE |0 + \xE2\xB3 |0 + \xDE\xE7 |0 + \xDC\xBC |0 + \xD2\xB6 |0 + \xF5\xD5 |0 + \xCE\xA1 |0 + \xF5\xA9 |0 + \xDD\xF9 |0 + \xDD\xFA |0 + \xF0\xD5 |0 + \xF6\xDF |0 + \xF2\xDA |0 + \xE4\xEB |0 + \xF2\xF1 |0 + \xEC\xB9 |0 + \xFD\xFC |0 + \xE1\xAA |0 + \xCA\xD9 |0 + \xEF\xEF |0 + \xF5\xAA |0 + \xEC\xF9 |0 + \xF8\xAD |0 + \xF2\xC2 |0 + \xF6\xC3 |0 + \xD7\xD2 |0 + \xF9\xA2 |0 + \xF0\xD6 |0 + \xF0\xFA |0 + \xF6\xE0 |0 + \xE9\xF3 |0 + \xF2\xC3 |0 + \xD4\xAB |0 + \xCA\xB3 |0 + \xCD\xA6 |0 + \xCD\xC3 |0 + \xCD\xDA |0 + \xD9\xCF |0 + \xF6\xC4 |0 + \xEE\xDD |0 + \xE7\xC4 |0 + \xE2\xB4 |0 + \xDF\xE2 |0 + \xE7\xDB |0 + \xE8\xB1 |0 + \xFC\xAE |0 + \xE5\xCD |0 + \xFA\xEB |0 + \xCF\xBC |0 + \xCF\xE2 |0 + \xCD\xF6 |0 + \xEF\xF0 |0 + \xF4\xBE |0 + \xD4\xCD |0 + \xF3\xB8 |0 + \xE9\xA1 |0 + \xF2\xF2 |0 + \xF3\xEB |0 + \xF0\xD7 |0 + \xCF\xD7 |0 + \xCF\xDF |0 + \xE8\xC0 |0 + \xE8\xC1 |0 + \xCF\xE3 |0 + \xE9\xA2 |0 + \xD0\xAA |0 + \xF3\xC1 |0 + \xD0\xAB |0 + \xD4\xE4 |0 + \xEF\xBC |0 + \xD8\xA1 |0 + \xD9\xDF |0 + \xF3\xD7 |0 + \xDC\xBD |0 + \xCC\xE5 |0 + \xED\xF1 |0 + \xF1\xE2 |0 + \xD4\xDB |0 + \xE2\xB5 |0 + \xCA\xE6 |0 + \xD3\xAE |0 + \xCC\xE6 |0 + \xF1\xD3 |0 + \xF5\xE7 |0 + \xCA\xDA |0 + \xFB\xEE |0 + \xE1\xC5 |0 + \xDF\xE9 |0 + \xEE\xDE |0 + \xF7\xC2 |0 + \xD8\xA2 |0 + \xDD\xAC |0 + \xF0\xAF |0 + \xD6\xBD |0 + \xE1\xAB |0 + \xF9\xB6 |0 + \xD4\xF5 |0 + \xD0\xC9 |0 + \xEF\xA7 |0 + \xE2\xEC |0 + \xDB\xEA |0 + \xCE\xCC |0 + \xF5\xE8 |0 + \xF7\xD5 |0 + \xD3\xCD |0 + \xF3\xFE |0 + \xD0\xB5 |0 + \xE0\xFE |0 + \xDF\xFB |0 + \xE6\xDD |0 + \xE8\xA4 |0 + \xCB\xCD |0 + \xEF\xA8 |0 + \xEE\xB4 |0 + \xDA\xD8 |0 + \xD1\xB9 |0 + \xDF\xA9 |0 + \xF3\xB0 |0 + \xCC\xC4 |0 + \xCE\xB7 |0 + \xEF\xA9 |0 + \xDF\xD5 |0 + \xED\xD7 |0 + \xEE\xC6 |0 + \xEF\xBD |0 + \xFC\xD6 |0 + \xDB\xF4 |0 + \xEF\xAA |0 + \xF8\xB9 |0 + \xF5\xE9 |0 + \xE3\xD9 |0 + \xE1\xC6 |0 + \xD4\xBF |0 + \xDE\xE8 |0 + \xF0\xEA |0 + \xF3\xC2 |0 + \xD3\xAF |0 + \xCA\xDB |0 + \xFC\xD7 |0 + \xED\xD8 |0 + \xE1\xC7 |0 + \xF4\xD8 |0 + \xD6\xB3 |0 + \xDD\xAD |0 + \xD5\xBE |0 + \xF1\xC3 |0 + \xEE\xDF |0 + \xD6\xEB |0 + \xF4\xD9 |0 + \xD7\xE6 |0 + \xDA\xB7 |0 + \xDD\xFB |0 + \xDD\xCF |0 + \xD8\xA3 |0 + \xDA\xD9 |0 + \xF0\xD8 |0 + \xEF\xC4 |0 + \xE1\xD8 |0 + \xF1\xD4 |0 + \xED\xF2 |0 + \xD5\xDB |0 + \xD5\xDC |0 + \xF3\xC4 |0 + \xCB\xD7 |0 + \xE2\xB6 |0 + \xEF\xF1 |0 + \xFB\xD5 |0 + \xD3\xD8 |0 + \xDD\xD0 |0 + \xF0\xD9 |0 + \xCB\xB3 |0 + \xD5\xDD |0 + \xCD\xA7 |0 + \xD0\xAC |0 + \xD1\xBA |0 + \xF1\xC4 |0 + \xE5\xB3 |0 + \xFB\xF5 |0 + \xE9\xE1 |0 + \xFD\xE0 |0 + \xFC\xBC |0 + \xDA\xA2 |0 + \xDA\xA3 |0 + \xD2\xA1 |0 + \xD2\xEF |0 + \xE2\xED |0 + \xDE\xE9 |0 + \xCE\xDC |0 + \xF2\xB5 |0 + \xD0\xE4 |0 + \xDD\xD1 |0 + \xE1\xC8 |0 + \xDB\xB7 |0 + \xDF\xE3 |0 + \xED\xB9 |0 + \xF1\xC5 |0 + \xF3\xCF |0 + \xD7\xAB |0 + \xE1\xAC |0 + \xE3\xEB |0 + \xEE\xC7 |0 + \xE1\xC9 |0 + \xCA\xFA |0 + \xF0\xFB |0 + \xFA\xE1 |0 + \xF0\xDA |0 + \xCC\xE7 |0 + \xDA\xF4 |0 + \xCC\xBF |0 + \xCE\xED |0 + \xD5\xA9 |0 + \xFA\xE2 |0 + \xD0\xE5 |0 + \xEB\xD6 |0 + \xEC\xDF |0 + \xDF\xFC |0 + \xF7\xD6 |0 + \xDE\xEA |0 + \xCB\xB4 |0 + \xEF\xBE |0 + \xCC\xB5 |0 + \xCF\xBD |0 + \xEF\xF2 |0 + \xE2\xB7 |0 + \xCC\xE8 |0 + \xF0\xFC |0 + \xD6\xE0 |0 + \xF1\xC6 |0 + \xE2\xB8 |0 + \xEB\xAB |0 + \xCB\xB5 |0 + \xD8\xD1 |0 + \xF4\xCE |0 + \xF3\xF7 |0 + \xD7\xC6 |0 + \xD1\xBB |0 + \xF7\xAA |0 + \xED\xCA |0 + \xD7\xD3 |0 + \xD8\xFA |0 + \xF6\xC5 |0 + \xD1\xCC |0 + \xDD\xFC |0 + \xDF\xFD |0 + \xF9\xE5 |0 + \xE0\xCA |0 + \xF2\xFD |0 + \xD3\xB0 |0 + \xF4\xF3 |0 + \xDA\xC9 |0 + \xE6\xDE |0 + \xF8\xBA |0 + \xE8\xD0 |0 + \xD8\xFB |0 + \xEA\xD5 |0 + \xD6\xA3 |0 + \xF6\xC6 |0 + \xF2\xDB |0 + \xE4\xFC |0 + \xE8\xB2 |0 + \xDA\xDA |0 + \xF2\xDC |0 + \xFB\xD6 |0 + \xE9\xB2 |0 + \xEE\xAD |0 + \xFA\xE3 |0 + \xDC\xEE |0 + \xF5\xEA |0 + \xE6\xE0 |0 + \xF0\xFD |0 + \xD7\xAC |0 + \xF5\xC5 |0 + \xEE\xE0 |0 + \xDB\xE5 |0 + \xDD\xDE |0 + \xD9\xF0 |0 + \xE9\xA3 |0 + \xF1\xF9 |0 + \xF2\xC4 |0 + \xE0\xCB |0 + \xE9\xA4 |0 + \xE2\xB9 |0 + \xE3\xB1 |0 + \xFC\xEB |0 + \xCD\xA8 |0 + \xCC\xB6 |0 + \xF0\xDB |0 + \xE6\xBA |0 + \xCD\xA9 |0 + \xF3\xC3 |0 + \xE1\xD9 |0 + \xEF\xAB |0 + \xE7\xC5 |0 + \xE0\xE9 |0 + \xF3\xC5 |0 + \xD4\xC0 |0 + \xD5\xBF |0 + \xDD\xAE |0 + \xF9\xFC |0 + \xCC\xC0 |0 + \xE5\xA2 |0 + \xCE\xB8 |0 + \xD8\xD2 |0 + \xF9\xD6 |0 + \xF1\xAA |0 + \xCE\xD1 |0 + \xF6\xC7 |0 + \xDB\xEB |0 + \xDF\xFE |0 + \xD8\xE1 |0 + \xF7\xF3 |0 + \xD7\xE7 |0 + \xD4\xFE |0 + \xD1\xBC |0 + \xE5\xCF |0 + \xCB\xB6 |0 + \xDA\xB8 |0 + \xCD\xC4 |0 + \xD6\xBE |0 + \xE2\xBA |0 + \xCF\xD8 |0 + \xE0\xCC |0 + \xEB\xF9 |0 + \xFD\xFD |0 + \xD7\xE8 |0 + \xCB\xD8 |0 + \xE9\xE2 |0 + \xE8\xBA |0 + \xE3\xC7 |0 + \xEC\xCD |0 + \xEC\xCE |0 + \xD6\xBF |0 + \xE3\xA7 |0 + \xDF\xD6 |0 + \xFD\xE8 |0 + \xEE\xE1 |0 + \xF6\xA8 |0 + \xDD\xFD |0 + \xF8\xBB |0 + \xE8\xD1 |0 + \xF9\xD7 |0 + \xCE\xEE |0 + \xEC\xCF |0 + \xE9\xA5 |0 + \xD6\xD5 |0 + \xCD\xC5 |0 + \xED\xBA |0 + \xD1\xBD |0 + \xCF\xBE |0 + \xEC\xBB |0 + \xD2\xB1 |0 + \xCC\xE9 |0 + \xD9\xC4 |0 + \xE9\xFC |0 + \xD1\xBE |0 + \xEC\xBC |0 + \xE5\xAD |0 + \xF7\xB0 |0 + \xCC\xEA |0 + \xD3\xC4 |0 + \xD6\xC0 |0 + \xD6\xFD |0 + \xE1\xA1 |0 + \xDE\xBD |0 + \xF6\xA9 |0 + \xDA\xA4 |0 + \xD6\xA4 |0 + \xF5\xC6 |0 + \xE1\xA2 |0 + \xE9\xC6 |0 + \xF2\xC5 |0 + \xF4\xE9 |0 + \xD6\xEC |0 + \xEB\xD3 |0 + \xEC\xBD |0 + \xE2\xDC |0 + \xDE\xEB |0 + \xF0\xDC |0 + \xEB\xBF |0 + \xD7\xCE |0 + \xD1\xBF |0 + \xF5\xAB |0 + \xF9\xFD |0 + \xCA\xDC |0 + \xCD\xC6 |0 + \xF2\xB6 |0 + \xDD\xFE |0 + \xCC\xB7 |0 + \xDB\xB8 |0 + \xD0\xE9 |0 + \xCE\xDD |0 + \xEB\xC0 |0 + \xFD\xA2 |0 + \xF8\xCB |0 + \xEA\xD6 |0 + \xF1\xB0 |0 + \xDB\xCE |0 + \xF7\xC3 |0 + \xDB\xCF |0 + \xCB\xA4 |0 + \xF8\xE0 |0 + \xFB\xD7 |0 + \xEB\xCA |0 + \xE0\xA1 |0 + \xCE\xCD |0 + \xD4\xDC |0 + \xFD\xD8 |0 + \xD2\xF6 |0 + \xF2\xB7 |0 + \xFA\xF6 |0 + \xF6\xAA |0 + \xFA\xF7 |0 + \xD8\xE6 |0 + \xF4\xB1 |0 + \xE8\xD2 |0 + \xCA\xC5 |0 + \xCC\xEB |0 + \xE2\xEE |0 + \xE2\xBB |0 + \xF7\xAD |0 + \xF8\xE1 |0 + \xF3\xEC |0 + \xDE\xA1 |0 + \xE4\xFD |0 + \xE3\xEC |0 + \xDD\xAF |0 + \xDD\xB0 |0 + \xCB\xB7 |0 + \xE8\xD3 |0 + \xE1\xA3 |0 + \xD2\xE0 |0 + \xF0\xFE |0 + \xE9\xA6 |0 + \xCB\xF2 |0 + \xED\xF3 |0 + \xDC\xD9 |0 + \xE0\xCD |0 + \xF7\xDA |0 + \xDB\xB9 |0 + \xCC\xAE |0 + \xDA\xDB |0 + \xCD\xC7 |0 + \xDD\xB1 |0 + \xD8\xAF |0 + \xE3\xA3 |0 + \xCE\xEF |0 + \xF2\xF3 |0 + \xF8\xB3 |0 + \xE0\xCE |0 + \xF5\xFD |0 + \xEB\xEC |0 + \xD3\xC5 |0 + \xFC\xEC |0 + \xD2\xDB |0 + \xD4\xEB |0 + \xDE\xA2 |0 + \xE5\xE6 |0 + \xF0\xB0 |0 + \xD5\xC4 |0 + \xED\xF4 |0 + \xE3\xED |0 + \xE8\xC2 |0 + \xED\xF5 |0 + \xD7\xFC |0 + \xED\xBB |0 + \xF6\xAB |0 + \xF2\xB8 |0 + \xF6\xC8 |0 + \xD3\xE6 |0 + \xF2\xDD |0 + \xCF\xBF |0 + \xEB\xAC |0 + \xCF\xC0 |0 + \xE6\xA8 |0 + \xFD\xE9 |0 + \xCF\xC1 |0 + \xE0\xDF |0 + \xDE\xEC |0 + \xE0\xA2 |0 + \xF4\xBF |0 + \xE2\xEF |0 + \xD9\xF1 |0 + \xF1\xC7 |0 + \xCB\xB8 |0 + \xF9\xFE |0 + \xDB\xBA |0 + \xDA\xF5 |0 + \xF6\xEC |0 + \xDA\xDC |0 + \xFA\xE4 |0 + \xE0\xCF |0 + \xDD\xB2 |0 + \xE6\xA9 |0 + \xEF\xF3 |0 + \xF3\xED |0 + \xEB\xFA |0 + \xF9\xE6 |0 + \xCA\xDD |0 + \xD5\xDE |0 + \xCA\xDE |0 + \xDF\xE4 |0 + \xE6\xFD |0 + \xF5\xAC |0 + \xE4\xF5 |0 + \xE9\xE3 |0 + \xED\xCB |0 + \xCF\xE4 |0 + \xD8\xD3 |0 + \xDD\xB3 |0 + \xD4\xEC |0 + \xF2\xB9 |0 + \xDF\xB7 |0 + \xCB\xCE |0 + \xFB\xD8 |0 + \xD0\xD9 |0 + \xDD\xD2 |0 + \xF7\xF4 |0 + \xE7\xDC |0 + \xE4\xA5 |0 + \xFC\xA3 |0 + \xDB\xBB |0 + \xF2\xBA |0 + \xE9\xFD |0 + \xD0\xCA |0 + \xF5\xD6 |0 + \xD9\xC5 |0 + \xE4\xB4 |0 + \xED\xA7 |0 + \xEA\xBD |0 + \xE6\xFE |0 + \xF7\xC4 |0 + \xF5\xAD |0 + \xD9\xE0 |0 + \xCA\xB4 |0 + \xF8\xE2 |0 + \xCF\xC2 |0 + \xEC\xBE |0 + \xE5\xB4 |0 + \xCD\xC8 |0 + \xEE\xC8 |0 + \xE7\xC8 |0 + \xCD\xC9 |0 + \xF9\xB7 |0 + \xF1\xE8 |0 + \xD9\xF2 |0 + \xDB\xF5 |0 + \xCA\xB5 |0 + \xD9\xC6 |0 + \xD8\xC9 |0 + \xD9\xAB |0 + \xED\xBC |0 + \xD8\xD4 |0 + \xDC\xDA |0 + \xE2\xBC |0 + \xFC\xED |0 + \xEC\xE0 |0 + \xD2\xFE |0 + \xE9\xC7 |0 + \xE6\xAA |0 + \xE2\xF0 |0 + \xFA\xBB |0 + \xF5\xAE |0 + \xFB\xAA |0 + \xEC\xFB |0 + \xEC\xBF |0 + \xFC\xD8 |0 + \xD4\xE5 |0 + \xF9\xC3 |0 + \xEE\xE2 |0 + \xD7\xE9 |0 + \xED\xF6 |0 + \xDE\xED |0 + \xCC\xEC |0 + \xE3\xEE |0 + \xE8\xD4 |0 + \xFA\xF8 |0 + \xDD\xB4 |0 + \xE4\xB5 |0 + \xD8\xB0 |0 + \xD8\xD5 |0 + \xF4\xEA |0 + \xCE\xB9 |0 + \xD6\xE1 |0 + \xCF\xD2 |0 + \xD0\xB6 |0 + \xCE\xA2 |0 + \xF3\xEE |0 + \xF3\xF8 |0 + \xDC\xCC |0 + \xD0\xCB |0 + \xFC\xA4 |0 + \xCD\xCA |0 + \xD7\xD4 |0 + \xDE\xA3 |0 + \xE4\xE0 |0 + \xEE\xC9 |0 + \xE2\xDD |0 + \xF5\xFE |0 + \xD4\xAC |0 + \xD5\xD1 |0 + \xD8\xF0 |0 + \xF8\xC3 |0 + \xEA\xD7 |0 + \xF5\xD7 |0 + \xD8\xBF |0 + \xFD\xC0 |0 + \xEB\xAD |0 + \xD5\xAA |0 + \xE7\xA8 |0 + \xEE\xCA |0 + \xCA\xE7 |0 + \xF8\xE3 |0 + \xD4\xDD |0 + \xEA\xD8 |0 + \xFB\xD9 |0 + \xED\xF7 |0 + \xE5\xB5 |0 + \xD0\xAD |0 + \xF1\xF1 |0 + \xE2\xBD |0 + \xE3\xC8 |0 + \xD9\xD5 |0 + \xDF\xAA |0 + \xDB\xBC |0 + \xF8\xE4 |0 + \xF1\xFA |0 + \xE5\xB6 |0 + \xF3\xEF |0 + \xFB\xDA |0 + \xE1\xE0 |0 + \xD9\xAC |0 + \xF5\xEB |0 + \xE0\xB6 |0 + \xE9\xC8 |0 + \xCB\xCF |0 + \xE3\xC9 |0 + \xDE\xEE |0 + \xE2\xBE |0 + \xDC\xEF |0 + \xD6\xA5 |0 + \xE2\xF1 |0 + \xD6\xFE |0 + \xD9\xA1 |0 + \xD8\xC0 |0 + \xDC\xDB |0 + \xED\xBD |0 + \xDF\xB8 |0 + \xEA\xA5 |0 + \xD7\xAD |0 + \xF3\xF9 |0 + \xED\xF8 |0 + \xF5\xC7 |0 + \xE1\xCA |0 + \xEB\xE3 |0 + \xF2\xDE |0 + \xF8\xCC |0 + \xEA\xD9 |0 + \xD3\xC6 |0 + \xDB\xE6 |0 + \xF5\xAF |0 + \xCE\xF0 |0 + \xE9\xFE |0 + \xFB\xB6 |0 + \xE2\xF2 |0 + \xCF\xF2 |0 + \xF7\xB9 |0 + \xD9\xF3 |0 + \xE1\xCB |0 + \xDA\xDD |0 + \xDA\xB9 |0 + \xEB\xFB |0 + \xCB\xB9 |0 + \xED\xF9 |0 + \xE0\xE0 |0 + \xF4\xC0 |0 + \xFD\xBC |0 + \xDF\xB1 |0 + \xE3\xEF |0 + \xE0\xA3 |0 + \xFD\xB9 |0 + \xF0\xB1 |0 + \xCD\xCB |0 + \xED\xBE |0 + \xD5\xC0 |0 + \xE3\xF0 |0 + \xED\xFA |0 + \xE9\xE4 |0 + \xD5\xED |0 + \xE7\xDD |0 + \xD4\xF6 |0 + \xE5\xB7 |0 + \xDB\xE7 |0 + \xE2\xBF |0 + \xEE\xCB |0 + \xD7\xF4 |0 + \xF0\xDD |0 + \xCE\xAB |0 + \xE7\xDE |0 + \xD6\xD6 |0 + \xE1\xCC |0 + \xE8\xB3 |0 + \xE5\xEE |0 + \xDC\xA2 |0 + \xE0\xD0 |0 + \xD5\xB5 |0 + \xD5\xA1 |0 + \xFB\xDB |0 + \xF9\xCB |0 + \xCB\xF3 |0 + \xF4\xA5 |0 + \xFA\xC8 |0 + \xD6\xD7 |0 + \xE9\xE5 |0 + \xFB\xDC |0 + \xFD\xD0 |0 + \xFB\xF6 |0 + \xDA\xA5 |0 + \xDB\xBD |0 + \xEC\xE2 |0 + \xCD\xF7 |0 + \xF0\xDE |0 + \xF6\xC9 |0 + \xDE\xEF |0 + \xD3\xB1 |0 + \xFC\xEE |0 + \xE8\xC3 |0 + \xF1\xC8 |0 + \xCE\xF1 |0 + \xF9\xED |0 + \xF2\xF4 |0 + \xE4\xB6 |0 + \xF5\xB9 |0 + \xDC\xF0 |0 + \xE3\xF1 |0 + \xE8\xA5 |0 + \xF2\xBB |0 + \xDE\xA4 |0 + \xDA\xCC |0 + \xCA\xE9 |0 + \xE3\xDA |0 + \xFC\xD9 |0 + \xEA\xDA |0 + \xF9\xC4 |0 + \xE3\xA4 |0 + \xFB\xDD |0 + \xEF\xCA |0 + \xE8\xC4 |0 + \xD5\xCC |0 + \xEB\xD7 |0 + \xD9\xAD |0 + \xFB\xAB |0 + \xD3\xD9 |0 + \xD5\xA2 |0 + \xF6\xDE |0 + \xDA\xF6 |0 + \xE0\xD1 |0 + \xE9\xA8 |0 + \xF5\xF9 |0 + \xFA\xAF |0 + \xEB\xFC |0 + \xE0\xEA |0 + \xE3\xB2 |0 + \xD5\xC5 |0 + \xF1\xE3 |0 + \xD5\xEE |0 + \xCD\xCC |0 + \xED\xD9 |0 + \xD8\xC1 |0 + \xFA\xEC |0 + \xF1\xEB |0 + \xFA\xBC |0 + \xE6\xE2 |0 + \xFA\xE5 |0 + \xE2\xFA |0 + \xCA\xB6 |0 + \xE4\xB7 |0 + \xEA\xDB |0 + \xF5\xFA |0 + \xFB\xAC |0 + \xCF\xC3 |0 + \xEB\xFD |0 + \xF8\xFA |0 + \xDF\xB9 |0 + \xE1\xF1 |0 + \xD2\xA4 |0 + \xF5\xFB |0 + \xD0\xDA |0 + \xD0\xDB |0 + \xEA\xBE |0 + \xD9\xB1 |0 + \xCA\xB7 |0 + \xD3\xE7 |0 + \xF8\xE5 |0 + \xD3\xB2 |0 + \xE2\xC0 |0 + \xF2\xDF |0 + \xCD\xE5 |0 + \xF9\xAC |0 + \xCD\xCD |0 + \xEE\xAE |0 + \xD6\xAE |0 + \xD7\xEA |0 + \xE7\xE0 |0 + \xEB\xAE |0 + \xCF\xD9 |0 + \xDC\xCD |0 + \xED\xFB |0 + \xDE\xF0 |0 + \xD7\xEB |0 + \xDE\xA5 |0 + \xDF\xD7 |0 + \xDB\xD0 |0 + \xDB\xD1 |0 + \xD5\xA3 |0 + \xF0\xB2 |0 + \xDC\xDC |0 + \xCA\xE8 |0 + \xF8\xE6 |0 + \xDC\xCE |0 + \xEA\xDC |0 + \xDB\xD2 |0 + \xE9\xB3 |0 + \xF7\xDB |0 + \xE3\xA8 |0 + \xD7\xAE |0 + \xE0\xE1 |0 + \xCB\xBA |0 + \xE5\xD1 |0 + \xD0\xDC |0 + \xD5\xC1 |0 + \xD8\xCA |0 + \xE3\xA9 |0 + \xE0\xA4 |0 + \xE9\xA9 |0 + \xD3\xC7 |0 + \xDC\xDD |0 + \xF8\xAE |0 + \xCC\xB8 |0 + \xD0\xAE |0 + \xD8\xF2 |0 + \xE3\xCA |0 + \xCC\xAF |0 + \xD4\xAD |0 + \xF6\xD1 |0 + \xD0\xCC |0 + \xCA\xC6 |0 + \xD5\xC2 |0 + \xCE\xBA |0 + \xCA\xC7 |0 + \xFA\xB0 |0 + \xDF\xD8 |0 + \xF5\xBA |0 + \xE5\xEB |0 + \xEF\xF4 |0 + \xDD\xB5 |0 + \xCD\xAA |0 + \xE3\xF2 |0 + \xFB\xF7 |0 + \xF7\xD0 |0 + \xFD\xBA |0 + \xFD\xE1 |0 + \xF6\xFE |0 + \xD1\xC0 |0 + \xE8\xC5 |0 + \xE4\xB8 |0 + \xE1\xE8 |0 + \xCC\xC1 |0 + \xD2\xED |0 + \xDB\xBE |0 + \xE0\xE2 |0 + \xFA\xC9 |0 + \xE1\xCD |0 + \xCA\xB8 |0 + \xF2\xE0 |0 + \xF1\xC9 |0 + \xDE\xF1 |0 + \xF0\xDF |0 + \xF8\xC4 |0 + \xEE\xCC |0 + \xDE\xF2 |0 + \xE7\xC9 |0 + \xE2\xF3 |0 + \xE7\xE1 |0 + \xE3\xCB |0 + \xE3\xCC |0 + \xCF\xF8 |0 + \xEF\xAC |0 + \xFD\xFE |0 + \xFC\xA5 |0 + \xFA\xB1 |0 + \xDF\xD9 |0 + \xE0\xD2 |0 + \xF4\xDA |0 + \xF1\xCA |0 + \xCE\xA3 |0 + \xF2\xBC |0 + \xEC\xE3 |0 + \xE0\xA5 |0 + \xF7\xAB |0 + \xEB\xAF |0 + \xE5\xDE |0 + \xE1\xA4 |0 + \xCD\xAB |0 + \xD9\xF4 |0 + \xE8\xA6 |0 + \xCD\xCE |0 + \xE1\xE9 |0 + \xFC\xEF |0 + \xE0\xE3 |0 + \xE2\xC1 |0 + \xCE\xA4 |0 + \xDE\xA6 |0 + \xEB\xFE |0 + \xEB\xDD |0 + \xF0\xE0 |0 + \xF4\xDB |0 + \xE2\xF4 |0 + \xD3\xC8 |0 + \xF4\xEB |0 + \xEE\xB5 |0 + \xF5\xD8 |0 + \xD5\xDF |0 + \xD6\xE5 |0 + \xEB\xB0 |0 + \xF4\xE3 |0 + \xE3\xCD |0 + \xF4\xF4 |0 + \xFA\xB2 |0 + \xEF\xF5 |0 + \xCA\xDF |0 + \xEB\xB1 |0 + \xED\xBF |0 + \xFD\xC9 |0 + \xE4\xA6 |0 + \xF9\xA4 |0 + \xF0\xB3 |0 + \xE5\xEC |0 + \xD1\xE7 |0 + \xD9\xC7 |0 + \xE4\xD7 |0 + \xEA\xDD |0 + \xD4\xF7 |0 + \xDA\xBA |0 + \xDA\xCD |0 + \xF9\xCC |0 + \xE1\xDA |0 + \xDB\xBF |0 + \xCC\xC5 |0 + \xEC\xD0 |0 + \xCB\xBB |0 + \xDE\xF3 |0 + \xE9\xAA |0 + \xD9\xC8 |0 + \xEE\xE3 |0 + \xD7\xBD |0 + \xCF\xC4 |0 + \xD0\xCD |0 + \xFC\xA6 |0 + \xF1\xFB |0 + \xFD\xD2 |0 + \xD1\xC1 |0 + \xE3\xDB |0 + \xD3\xC9 |0 + \xDC\xCF |0 + \xCC\xED |0 + \xDE\xA7 |0 + \xE6\xBB |0 + \xEC\xA1 |0 + \xCC\xB9 |0 + \xFB\xDE |0 + \xE7\xE2 |0 + \xD4\xC1 |0 + \xDC\xA8 |0 + \xE2\xC2 |0 + \xF3\xD8 |0 + \xE5\xD3 |0 + \xF3\xD9 |0 + \xF3\xC6 |0 + \xCD\xDB |0 + \xCD\xAC |0 + \xFC\xC3 |0 + \xD4\xE7 |0 + \xD1\xC2 |0 + \xF9\xA5 |0 + \xE8\xD5 |0 + \xE3\xCE |0 + \xD4\xCA |0 + \xDF\xDA |0 + \xFB\xDF |0 + \xE7\xE3 |0 + \xF8\xFB |0 + \xE3\xCF |0 + \xF5\xB0 |0 + \xD8\xE7 |0 + \xD9\xC9 |0 + \xF8\xAF |0 + \xEF\xF6 |0 + \xDD\xB6 |0 + \xEE\xAF |0 + \xCD\xF8 |0 + \xDE\xB8 |0 + \xFC\xA7 |0 + \xF7\xFC |0 + \xF7\xB1 |0 + \xCE\xBB |0 + \xF4\xA1 |0 + \xEE\xCD |0 + \xE1\xAE |0 + \xEC\xC3 |0 + \xCF\xFE |0 + \xF8\xBF |0 + \xD8\xE2 |0 + \xD3\xE8 |0 + \xDE\xA8 |0 + \xF4\xE4 |0 + \xEC\xC2 |0 + \xD9\xF5 |0 + \xF9\xC5 |0 + \xDD\xD3 |0 + \xD6\xF1 |0 + \xEC\xFC |0 + \xFC\xF0 |0 + \xED\xC0 |0 + \xCA\xB9 |0 + \xEE\xE4 |0 + \xF2\xE1 |0 + \xDE\xB9 |0 + \xD6\xF2 |0 + \xDE\xF4 |0 + \xDF\xDB |0 + \xDB\xD3 |0 + \xFA\xE7 |0 + \xD8\xE3 |0 + \xF4\xC1 |0 + \xDD\xB7 |0 + \xF2\xF5 |0 + \xD4\xAE |0 + \xD6\xF3 |0 + \xDD\xB8 |0 + \xCF\xC5 |0 + \xDF\xDF |0 + \xF2\xBE |0 + \xF6\xA1 |0 + \xEB\xCB |0 + \xF1\xFC |0 + \xF3\xC7 |0 + \xE0\xEB |0 + \xED\xFC |0 + \xE1\xDB |0 + \xEE\xE5 |0 + \xDE\xF5 |0 + \xFA\xD3 |0 + \xF1\xCB |0 + \xD0\xAF |0 + \xDD\xB9 |0 + \xD1\xC3 |0 + \xF5\xB1 |0 + \xEA\xC6 |0 + \xF0\xE1 |0 + \xF6\xAC |0 + \xF5\xD9 |0 + \xF0\xEB |0 + \xDD\xBA |0 + \xF2\xBF |0 + \xF7\xC5 |0 + \xDB\xA2 |0 + \xF2\xF6 |0 + \xCA\xBA |0 + \xF7\xF5 |0 + \xCB\xE5 |0 + \xEE\xE6 |0 + \xE0\xD3 |0 + \xCE\xA5 |0 + \xD6\xD8 |0 + \xD4\xAF |0 + \xE9\xC9 |0 + \xD3\xCE |0 + \xF4\xC2 |0 + \xCB\xE6 |0 + \xF1\xA1 |0 + \xEB\xB2 |0 + \xF1\xA2 |0 + \xEB\xB3 |0 + \xF0\xB4 |0 + \xCB\xF4 |0 + \xD4\xB0 |0 + \xF3\xB2 |0 + \xFB\xB7 |0 + \xF5\xEC |0 + \xEE\xE7 |0 + \xF4\xB2 |0 + \xF5\xED |0 + \xCF\xF3 |0 + \xF0\xE2 |0 + \xEE\xCE |0 + \xF1\xCC |0 + \xE5\xB8 |0 + \xD7\xF5 |0 + \xE3\xF3 |0 + \xCF\xE5 |0 + \xCF\xC6 |0 + \xF3\xB3 |0 + \xE4\xD8 |0 + \xCF\xF9 |0 + \xCF\xDA |0 + \xFA\xCD |0 + \xE6\xE3 |0 + \xF2\xE2 |0 + \xF5\xEE |0 + \xCA\xBB |0 + \xE3\xDC |0 + \xCE\xF2 |0 + \xD6\xD9 |0 + \xEE\xB0 |0 + \xF4\xE5 |0 + \xD8\xC2 |0 + \xDC\xD0 |0 + \xCC\xEE |0 + \xD5\xE0 |0 + \xF6\xCA |0 + \xFD\xCA |0 + \xD8\xD6 |0 + \xF4\xCF |0 + \xD6\xA6 |0 + \xDC\xBE |0 + \xDB\xD4 |0 + \xD7\xC7 |0 + \xF2\xFE |0 + \xF1\xCD |0 + \xE2\xC3 |0 + \xDC\xDE |0 + \xDC\xDF |0 + \xEF\xAD |0 + \xE6\xAB |0 + \xF9\xDD |0 + \xEA\xBF |0 + \xEF\xAE |0 + \xF4\xD0 |0 + \xCE\xF3 |0 + \xE6\xAC |0 + \xCE\xDE |0 + \xD5\xF9 |0 + \xE3\xF4 |0 + \xCD\xD0 |0 + \xD5\xB8 |0 + \xF7\xFD |0 + \xDC\xA9 |0 + \xDE\xF6 |0 + \xDC\xAA |0 + \xF2\xE3 |0 + \xE9\xB4 |0 + \xD2\xDC |0 + \xE9\xE6 |0 + \xE3\xF6 |0 + \xE7\xCA |0 + \xD0\xCE |0 + \xDA\xF7 |0 + \xCA\xBC |0 + \xEE\xE8 |0 + \xDA\xDE |0 + \xF2\xF7 |0 + \xE2\xFB |0 + \xCC\xA6 |0 + \xDA\xBB |0 + \xEE\xE9 |0 + \xF5\xDA |0 + \xF7\xDC |0 + \xE1\xEA |0 + \xCE\xC1 |0 + \xD4\xB1 |0 + \xFD\xB1 |0 + \xE6\xBD |0 + \xFB\xAD |0 + \xF8\xE7 |0 + \xE1\xCE |0 + \xF7\xE2 |0 + \xF5\xEF |0 + \xCF\xC7 |0 + \xD4\xB2 |0 + \xCC\xEF |0 + \xD4\xE8 |0 + \xEE\xCF |0 + \xF7\xD7 |0 + \xE0\xA6 |0 + \xD6\xC1 |0 + \xE1\xDC |0 + \xF0\xE3 |0 + \xF1\xE4 |0 + \xDC\xF1 |0 + \xD6\xA7 |0 + \xF4\xF5 |0 + \xF1\xCE |0 + \xF2\xE4 |0 + \xD0\xB0 |0 + \xEC\xEF |0 + \xF9\xBA |0 + \xEB\xB5 |0 + \xD4\xED |0 + \xE2\xC4 |0 + \xE9\xE7 |0 + \xEB\xB4 |0 + \xEA\xA1 |0 + \xF8\xBC |0 + \xCE\xA6 |0 + \xF9\xC6 |0 + \xFC\xDA |0 + \xD4\xB3 |0 + \xD3\xB9 |0 + \xEA\xDE |0 + \xE9\xAB |0 + \xE1\xE1 |0 + \xD3\xCF |0 + \xF4\xF6 |0 + \xEA\xC0 |0 + \xE1\xCF |0 + \xCC\xBA |0 + \xEE\xEA |0 + \xF0\xE4 |0 + \xF3\xB4 |0 + \xD4\xEE |0 + \xF2\xC0 |0 + \xF1\xE5 |0 + \xF4\xC3 |0 + \xE0\xD4 |0 + \xEB\xB6 |0 + \xD7\xA1 |0 + \xCB\xE8 |0 + \xF9\xAD |0 + \xE9\xAD |0 + \xD8\xE4 |0 + \xFA\xB3 |0 + \xE2\xC5 |0 + \xFC\xBD |0 + \xEC\xC4 |0 + \xD8\xB1 |0 + \xDC\xAB |0 + \xD5\xA4 |0 + \xEB\xE9 |0 + \xE8\xBB |0 + \xD8\xD7 |0 + \xFB\xAE |0 + \xD1\xE1 |0 + \xDB\xC0 |0 + \xF5\xBE |0 + \xDE\xF7 |0 + \xCA\xFB |0 + \xF7\xC6 |0 + \xCF\xC8 |0 + \xE1\xD0 |0 + \xEE\xD0 |0 + \xE9\xF4 |0 + \xCE\xF4 |0 + \xD5\xCD |0 + \xCF\xDB |0 + \xDD\xBB |0 + \xCE\xAC |0 + \xE9\xE8 |0 + \xD4\xB4 |0 + \xE4\xC7 |0 + \xF5\xDB |0 + \xFA\xC1 |0 + \xDE\xA9 |0 + \xD4\xF8 |0 + \xEF\xF7 |0 + \xD3\xB3 |0 + \xEB\xB7 |0 + \xEF\xF8 |0 + \xF5\xDC |0 + \xED\xCC |0 + \xDB\xD5 |0 + \xF1\xCF |0 + \xF1\xD0 |0 + \xF5\xB2 |0 + \xD9\xAE |0 + \xD5\xAC |0 + \xE2\xC6 |0 + \xFD\xA3 |0 + \xFB\xE5 |0 + \xDF\xAB |0 + \xE2\xF5 |0 + \xF6\xAD |0 + \xF5\xB3 |0 + \xF0\xB5 |0 + \xE1\xA5 |0 + \xF5\xDD |0 + \xEC\xA2 |0 + \xED\xFD |0 + \xF5\xB4 |0 + \xFB\xB8 |0 + \xDB\xA3 |0 + \xD6\xCA |0 + \xCB\xD9 |0 + \xE5\xD4 |0 + \xF3\xFA |0 + \xEB\xB8 |0 + \xE0\xB7 |0 + \xD7\xEC |0 + \xF1\xEC |0 + \xE5\xAF |0 + \xD5\xE1 |0 + \xD7\xED |0 + \xD1\xD1 |0 + \xE1\xF2 |0 + \xEF\xF9 |0 + \xDD\xBC |0 + \xF6\xDC |0 + \xF0\xE5 |0 + \xF4\xC4 |0 + \xE9\xE9 |0 + \xF3\xFB |0 + \xD4\xEF |0 + \xCC\xA2 |0 + \xF7\xFE |0 + \xDF\xBC |0 + \xEB\xCD |0 + \xD0\xB7 |0 + \xD6\xC2 |0 + \xE8\xAD |0 + \xEF\xAF |0 + \xCB\xA5 |0 + \xCB\xE9 |0 + \xFA\xE8 |0 + \xCC\xC6 |0 + \xE6\xE7 |0 + \xEA\xC7 |0 + \xDB\xA4 |0 + \xCF\xC9 |0 + \xE2\xFC |0 + \xEF\xFA |0 + \xEB\xDE |0 + \xF5\xC8 |0 + \xD4\xDE |0 + \xE0\xD5 |0 + \xEF\xB0 |0 + \xE2\xC7 |0 + \xD9\xAF |0 + \xF9\xE7 |0 + \xE7\xE5 |0 + \xCF\xCA |0 + \xE1\xD1 |0 + \xE2\xC8 |0 + \xEF\xFB |0 + \xFA\xF9 |0 + \xDC\xF2 |0 + \xE0\xA7 |0 + \xF8\xE8 |0 + \xCB\xEA |0 + \xCB\xBC |0 + \xD6\xE2 |0 + \xF5\xDE |0 + \xF5\xDF |0 + \xEE\xB6 |0 + \xE2\xF6 |0 + \xD3\xCA |0 + \xEF\xFC |0 + \xD1\xC4 |0 + \xEF\xB1 |0 + \xD1\xC5 |0 + \xD0\xDE |0 + \xD9\xE1 |0 + \xE0\xB8 |0 + \xCD\xD1 |0 + \xF3\xB9 |0 + \xE7\xCC |0 + \xD6\xA8 |0 + \xCE\xA7 |0 + \xD4\xB5 |0 + \xE4\xC8 |0 + \xD3\xB4 |0 + \xEB\xB9 |0 + \xCB\xF5 |0 + \xF6\xDD |0 + \xF1\xA3 |0 + \xCC\xC7 |0 + \xE9\xCA |0 + \xE1\xF0 |0 + \xF5\xE0 |0 + \xFB\xAF |0 + \xCB\xD1 |0 + \xFB\xE0 |0 + \xF2\xE5 |0 + \xEC\xF0 |0 + \xF0\xEC |0 + \xEE\xEB |0 + \xE9\xCB |0 + \xCC\xF0 |0 + \xD7\xAF |0 + \xF3\xA1 |0 + \xFC\xF5 |0 + \xF1\xA4 |0 + \xE0\xD6 |0 + \xEF\xB2 |0 + \xF4\xD1 |0 + \xF7\xA1 |0 + \xF1\xD1 |0 + \xCA\xFC |0 + \xCA\xFD |0 + \xCE\xCE |0 + \xF3\xC8 |0 + \xF3\xBA |0 + \xED\xFE |0 + \xDA\xA6 |0 + \xE0\xEC |0 + \xF8\xCD |0 + \xCB\xD2 |0 + \xEB\xCE |0 + \xF9\xD8 |0 + \xF9\xD9 |0 + \xCA\xE0 |0 + \xDA\xCA |0 + \xCB\xA6 |0 + \xCA\xC8 |0 + \xF9\xEE |0 + \xDB\xEC |0 + \xD0\xB1 |0 + \xD5\xEF |0 + \xE6\xF3 |0 + \xE7\xA2 |0 + \xE4\xD9 |0 + \xE4\xE1 |0 + \xFC\xC4 |0 + \xF9\xEF |0 + \xCF\xF4 |0 + \xF7\xE6 |0 + \xCE\xBC |0 + \xF4\xC5 |0 + \xDC\xA3 |0 + \xDD\xBD |0 + \xF4\xC6 |0 + \xF8\xA1 |0 + \xE8\xD6 |0 + \xDB\xC1 |0 + \xF0\xE6 |0 + \xE4\xB9 |0 + \xF6\xED |0 + \xF9\xAE |0 + \xDD\xBE |0 + \xD7\xB0 |0 + \xD8\xE8 |0 + \xCB\xBD |0 + \xF9\xDA |0 + \xF8\xCE |0 + \xF9\xF0 |0 + \xE0\xED |0 + \xE3\xB3 |0 + \xF4\xB3 |0 + \xEA\xC2 |0 + \xF2\xE6 |0 + \xF0\xB6 |0 + \xDB\xD6 |0 + \xEB\xE4 |0 + \xF2\xE7 |0 + \xD7\xD5 |0 + \xD4\xB6 |0 + \xF9\xE8 |0 + \xD7\xC1 |0 + \xE5\xD5 |0 + \xE9\xEA |0 + \xD7\xCC |0 + \xD3\xE9 |0 + \xE2\xC9 |0 + \xFC\xDB |0 + \xCD\xAD |0 + \xCC\xB0 |0 + \xEA\xA2 |0 + \xE4\xF6 |0 + \xD0\xC0 |0 + \xF0\xB7 |0 + \xEE\xA1 |0 + \xD7\xF6 |0 + \xE2\xCA |0 + \xE2\xCB |0 + \xFA\xCF |0 + \xEB\xDF |0 + \xD6\xCB |0 + \xF4\xB4 |0 + \xED\xCD |0 + \xE4\xD2 |0 + \xEA\xA9 |0 + \xE4\xBA |0 + \xF3\xA2 |0 + \xCD\xD2 |0 + \xF6\xCB |0 + \xF1\xE6 |0 + \xED\xC1 |0 + \xE8\xBC |0 + \xEE\xD1 |0 + \xF0\xE7 |0 + \xE2\xCC |0 + \xE4\xAA |0 + \xF5\xE1 |0 + \xED\xDA |0 + \xD7\xEE |0 + \xD1\xF1 |0 + \xE9\xEB |0 + \xE9\xEC |0 + \xE0\xE4 |0 + \xDA\xA7 |0 + \xDD\xD4 |0 + \xEA\xA3 |0 + \xD6\xC3 |0 + \xD6\xF4 |0 + \xDA\xDF |0 + \xEF\xB3 |0 + \xE2\xCD |0 + \xEF\xFD |0 + \xF2\xE8 |0 + \xEF\xC5 |0 + \xE7\xE7 |0 + \xD7\xFD |0 + \xE7\xCE |0 + \xDF\xDC |0 + \xF9\xC7 |0 + \xD9\xF6 |0 + \xDF\xAC |0 + \xD6\xDA |0 + \xDC\xA4 |0 + \xF0\xB8 |0 + \xD5\xFA |0 + \xE4\xF7 |0 + \xD6\xC4 |0 + \xF4\xEC |0 + \xEF\xFE |0 + \xF0\xA1 |0 + \xDE\xAA |0 + \xDA\xBC |0 + \xD8\xFC |0 + \xFA\xD4 |0 + \xEC\xE5 |0 + \xFC\xA8 |0 + \xEC\xE6 |0 + \xD8\xCB |0 + \xFB\xB9 |0 + \xE4\xD3 |0 + \xCD\xF9 |0 + \xCF\xD3 |0 + \xCA\xEA |0 + \xCF\xD4 |0 + \xF8\xBD |0 + \xF4\xC7 |0 + \xEA\xDF |0 + \xF9\xDB |0 + \xD4\xB7 |0 + \xEB\xE5 |0 + \xE1\xD2 |0 + \xEA\xA4 |0 + \xFA\xC2 |0 + \xFB\xE1 |0 + \xFA\xED |0 + \xF0\xA2 |0 + \xCC\xF1 |0 + \xFA\xA3 |0 + \xE2\xF7 |0 + \xE2\xCE |0 + \xE9\xF5 |0 + \xE1\xEB |0 + \xE7\xE8 |0 + \xE8\xD7 |0 + \xDA\xF8 |0 + \xD4\xCB |0 + \xF7\xF6 |0 + \xD6\xC5 |0 + \xD4\xE9 |0 + \xFA\xFA |0 + \xCC\xF2 |0 + \xF7\xDD |0 + \xDE\xBA |0 + \xCE\xA8 |0 + \xF0\xB9 |0 + \xE4\xFE |0 + \xE4\xC9 |0 + \xE4\xD4 |0 + \xEA\xC3 |0 + \xEF\xB4 |0 + \xD7\xBE |0 + \xFB\xE2 |0 + \xCD\xD3 |0 + \xEF\xB5 |0 + \xFA\xE9 |0 + \xF9\xA6 |0 + \xDF\xBD |0 + \xF7\xC7 |0 + \xF8\xFD |0 + \xF8\xFC |0 + \xDE\xAB |0 + \xDB\xE8 |0 + \xE3\xDD |0 + \xE1\xE2 |0 + \xD1\xC6 |0 + \xF6\xD0 |0 + \xEB\xE6 |0 + \xDA\xF9 |0 + \xEC\xC7 |0 + \xDE\xF8 |0 + \xF8\xE9 |0 + \xE3\xDE |0 + \xCE\xF5 |0 + \xFA\xC3 |0 + \xE5\xD7 |0 + \xEC\xC8 |0 + \xF3\xC9 |0 + \xE4\xBB |0 + \xE6\xAE |0 + \xEF\xB6 |0 + \xDC\xBF |0 + \xCE\xBD |0 + \xD8\xC3 |0 + \xD0\xCF |0 + \xCF\xFA |0 + \xF3\xCA |0 + \xE0\xD7 |0 + \xD1\xC7 |0 + \xE9\xAE |0 + \xE8\xBD |0 + \xFA\xC4 |0 + \xE2\xCF |0 + \xFA\xC5 |0 + \xF9\xB8 |0 + \xDC\xE0 |0 + \xFB\xB0 |0 + \xD8\xA9 |0 + \xE5\xDF |0 + \xF9\xA7 |0 + \xF6\xEE |0 + \xF6\xCC |0 + \xE2\xF8 |0 + \xEC\xF1 |0 + \xDA\xE0 |0 + \xF1\xD2 |0 + \xD2\xCC |0 + \xCF\xCB |0 + \xCA\xBD |0 + \xDD\xBF |0 + \xF6\xEF |0 + \xDE\xF9 |0 + \xFA\xB4 |0 + \xD5\xAD |0 + \xF1\xE7 |0 + \xDE\xBE |0 + \xDC\xC0 |0 + \xD1\xC8 |0 + \xD1\xC9 |0 + \xF8\xBE |0 + \xCB\xF6 |0 + \xD4\xF9 |0 + \xF5\xE2 |0 + \xE1\xD3 |0 + \xD8\xE9 |0 + \xF8\xFE |0 + \xCF\xCC |0 + \xFD\xA4 |0 + \xCE\xF6 |0 + \xFA\xD0 |0 + \xCC\xF3 |0 + \xE6\xBE |0 + \xF6\xAE |0 + \xD5\xF0 |0 + \xD1\xCA |0 + \xFC\xBE |0 + \xD5\xF1 |0 + \xCD\xE9 |0 + \xFA\xB5 |0 + \xE2\xD0 |0 + \xF4\xF7 |0 + \xCD\xD4 |0 + \xE7\xA3 |0 + \xDB\xA5 |0 + \xE2\xD1 |0 + \xD7\xA2 |0 + \xF7\xE3 |0 + \xEA\xA6 |0 + \xD0\xA1 |0 + \xCE\xDA |0 + \xFB\xEB |0 + \xDB\xA6 |0 + \xDB\xDE |0 + \xD8\xE5 |0 + \xEA\xE0 |0 + \xD8\xAA |0 + \xE5\xE0 |0 + \xD6\xDB |0 + \xEF\xC6 |0 + \xF8\xEA |0 + \xE4\xD5 |0 + \xCE\xF7 |0 + \xE0\xD8 |0 + \xD7\xEF |0 + \xF4\xED |0 + \xCD\xE6 |0 + \xCC\xF4 |0 + \xF5\xE3 |0 + \xE4\xCA |0 + \xDC\xE1 |0 + \xF9\xC8 |0 + \xFC\xBF |0 + \xE8\xA7 |0 + \xD8\xC4 |0 + \xCB\xBE |0 + \xDC\xAE |0 + \xD7\xF7 |0 + \xF0\xE8 |0 + \xDD\xC0 |0 + \xCF\xCD |0 + \xDC\xF3 |0 + \xD9\xB0 |0 + \xE6\xE9 |0 + \xE4\xBC |0 + \xEA\xC4 |0 + \xE4\xEC |0 + \xE4\xE5 |0 + \xFB\xF8 |0 + \xCC\xBB |0 + \xE4\xBD |0 + \xCD\xDC |0 + \xD9\xF7 |0 + \xDD\xDF |0 + \xED\xCE |0 + \xD9\xD0 |0 + \xE5\xA3 |0 + \xF9\xCD |0 + \xCD\xAE |0 + \xCF\xCE |0 + \xF6\xAF |0 + \xFD\xD3 |0 + \xEB\xED |0 + \xD6\xDC |0 + \xE5\xA4 |0 + \xD5\xB6 |0 + \xD6\xDD |0 + \xF9\xE9 |0 + \xE7\xA4 |0 + \xD6\xE3 |0 + \xD1\xCB |0 + \xD6\xE4 |0 + \xD5\xF2 |0 + \xDE\xFA |0 + \xD7\xF8 |0 + \xD8\xEA |0 + \xCF\xD5 |0 + \xD8\xFD |0 + \xD8\xAB |0 + \xFD\xCB |0 + \xFC\xDC |0 + \xE0\xA8 |0 + \xD5\xF3 |0 + \xFD\xD9 |0 + \xCC\xA3 |0 + \xD9\xF9 |0 + \xD3\xEA |0 + \xF5\xF5 |0 + \xEF\xC7 |0 + \xD3\xDA |0 + \xDA\xBD |0 + \xE8\xA8 |0 + \xDC\xAF |0 + \xF0\xA3 |0 + \xCD\xD5 |0 + \xE0\xA9 |0 + \xDE\xAC |0 + \xF0\xBA |0 + \xEE\xB1 |0 + \xEE\xB2 |0 + \xF6\xCD |0 + \xEE\xD2 |0 + \xD6\xC6 |0 + \xE0\xE5 |0 + \xF3\xBB |0 + \xE5\xE1 |0 + \xE4\xCB |0 + \xD7\xA3 |0 + \xDB\xC2 |0 + \xCA\xFE |0 + \xCF\xCF |0 + \xB0\xA1 |0 + \xB0\xA2 |0 + \xB0\xA3 |0 + \xB0\xA4 |0 + \xB0\xA5 |0 + \xB0\xA6 |0 + \xB0\xA7 |0 + \xB0\xA8 |0 + \xB0\xA9 |0 + \xB0\xAA |0 + \xB0\xAB |0 + \xB0\xAC |0 + \xB0\xAD |0 + \xB0\xAE |0 + \xB0\xAF |0 + \xB0\xB0 |0 + \xB0\xB1 |0 + \xB0\xB2 |0 + \xB0\xB3 |0 + \xB0\xB4 |0 + \xB0\xB5 |0 + \xB0\xB6 |0 + \xB0\xB7 |0 + \xB0\xB8 |0 + \xB0\xB9 |0 + \xB0\xBA |0 + \xB0\xBB |0 + \xB0\xBC |0 + \xB0\xBD |0 + \xB0\xBE |0 + \xB0\xBF |0 + \xB0\xC0 |0 + \xB0\xC1 |0 + \xB0\xC2 |0 + \xB0\xC3 |0 + \xB0\xC4 |0 + \xB0\xC5 |0 + \xB0\xC6 |0 + \xB0\xC7 |0 + \xB0\xC8 |0 + \xB0\xC9 |0 + \xB0\xCA |0 + \xB0\xCB |0 + \xB0\xCC |0 + \xB0\xCD |0 + \xB0\xCE |0 + \xB0\xCF |0 + \xB0\xD0 |0 + \xB0\xD1 |0 + \xB0\xD2 |0 + \xB0\xD3 |0 + \xB0\xD4 |0 + \xB0\xD5 |0 + \xB0\xD6 |0 + \xB0\xD7 |0 + \xB0\xD8 |0 + \xB0\xD9 |0 + \xB0\xDA |0 + \xB0\xDB |0 + \xB0\xDC |0 + \xB0\xDD |0 + \xB0\xDE |0 + \xB0\xDF |0 + \xB0\xE0 |0 + \xB0\xE1 |0 + \xB0\xE2 |0 + \xB0\xE3 |0 + \xB0\xE4 |0 + \xB0\xE5 |0 + \xB0\xE6 |0 + \xB0\xE7 |0 + \xB0\xE8 |0 + \xB0\xE9 |0 + \xB0\xEA |0 + \xB0\xEB |0 + \xB0\xEC |0 + \xB0\xED |0 + \xB0\xEE |0 + \xB0\xEF |0 + \xB0\xF0 |0 + \xB0\xF1 |0 + \xB0\xF2 |0 + \xB0\xF3 |0 + \xB0\xF4 |0 + \xB0\xF5 |0 + \xB0\xF6 |0 + \xB0\xF7 |0 + \xB0\xF8 |0 + \xB0\xF9 |0 + \xB0\xFA |0 + \xB0\xFB |0 + \xB0\xFC |0 + \xB0\xFD |0 + \xB0\xFE |0 + \xB1\xA1 |0 + \xB1\xA2 |0 + \xB1\xA3 |0 + \xB1\xA4 |0 + \xB1\xA5 |0 + \xB1\xA6 |0 + \xB1\xA7 |0 + \xB1\xA8 |0 + \xB1\xA9 |0 + \xB1\xAA |0 + \xB1\xAB |0 + \xB1\xAC |0 + \xB1\xAD |0 + \xB1\xAE |0 + \xB1\xAF |0 + \xB1\xB0 |0 + \xB1\xB1 |0 + \xB1\xB2 |0 + \xB1\xB3 |0 + \xB1\xB4 |0 + \xB1\xB5 |0 + \xB1\xB6 |0 + \xB1\xB7 |0 + \xB1\xB8 |0 + \xB1\xB9 |0 + \xB1\xBA |0 + \xB1\xBB |0 + \xB1\xBC |0 + \xB1\xBD |0 + \xB1\xBE |0 + \xB1\xBF |0 + \xB1\xC0 |0 + \xB1\xC1 |0 + \xB1\xC2 |0 + \xB1\xC3 |0 + \xB1\xC4 |0 + \xB1\xC5 |0 + \xB1\xC6 |0 + \xB1\xC7 |0 + \xB1\xC8 |0 + \xB1\xC9 |0 + \xB1\xCA |0 + \xB1\xCB |0 + \xB1\xCC |0 + \xB1\xCD |0 + \xB1\xCE |0 + \xB1\xCF |0 + \xB1\xD0 |0 + \xB1\xD1 |0 + \xB1\xD2 |0 + \xB1\xD3 |0 + \xB1\xD4 |0 + \xB1\xD5 |0 + \xB1\xD6 |0 + \xB1\xD7 |0 + \xB1\xD8 |0 + \xB1\xD9 |0 + \xB1\xDA |0 + \xB1\xDB |0 + \xB1\xDC |0 + \xB1\xDD |0 + \xB1\xDE |0 + \xB1\xDF |0 + \xB1\xE0 |0 + \xB1\xE1 |0 + \xB1\xE2 |0 + \xB1\xE3 |0 + \xB1\xE4 |0 + \xB1\xE5 |0 + \xB1\xE6 |0 + \xB1\xE7 |0 + \xB1\xE8 |0 + \xB1\xE9 |0 + \xB1\xEA |0 + \xB1\xEB |0 + \xB1\xEC |0 + \xB1\xED |0 + \xB1\xEE |0 + \xB1\xEF |0 + \xB1\xF0 |0 + \xB1\xF1 |0 + \xB1\xF2 |0 + \xB1\xF3 |0 + \xB1\xF4 |0 + \xB1\xF5 |0 + \xB1\xF6 |0 + \xB1\xF7 |0 + \xB1\xF8 |0 + \xB1\xF9 |0 + \xB1\xFA |0 + \xB1\xFB |0 + \xB1\xFC |0 + \xB1\xFD |0 + \xB1\xFE |0 + \xB2\xA1 |0 + \xB2\xA2 |0 + \xB2\xA3 |0 + \xB2\xA4 |0 + \xB2\xA5 |0 + \xB2\xA6 |0 + \xB2\xA7 |0 + \xB2\xA8 |0 + \xB2\xA9 |0 + \xB2\xAA |0 + \xB2\xAB |0 + \xB2\xAC |0 + \xB2\xAD |0 + \xB2\xAE |0 + \xB2\xAF |0 + \xB2\xB0 |0 + \xB2\xB1 |0 + \xB2\xB2 |0 + \xB2\xB3 |0 + \xB2\xB4 |0 + \xB2\xB5 |0 + \xB2\xB6 |0 + \xB2\xB7 |0 + \xB2\xB8 |0 + \xB2\xB9 |0 + \xB2\xBA |0 + \xB2\xBB |0 + \xB2\xBC |0 + \xB2\xBD |0 + \xB2\xBE |0 + \xB2\xBF |0 + \xB2\xC0 |0 + \xB2\xC1 |0 + \xB2\xC2 |0 + \xB2\xC3 |0 + \xB2\xC4 |0 + \xB2\xC5 |0 + \xB2\xC6 |0 + \xB2\xC7 |0 + \xB2\xC8 |0 + \xB2\xC9 |0 + \xB2\xCA |0 + \xB2\xCB |0 + \xB2\xCC |0 + \xB2\xCD |0 + \xB2\xCE |0 + \xB2\xCF |0 + \xB2\xD0 |0 + \xB2\xD1 |0 + \xB2\xD2 |0 + \xB2\xD3 |0 + \xB2\xD4 |0 + \xB2\xD5 |0 + \xB2\xD6 |0 + \xB2\xD7 |0 + \xB2\xD8 |0 + \xB2\xD9 |0 + \xB2\xDA |0 + \xB2\xDB |0 + \xB2\xDC |0 + \xB2\xDD |0 + \xB2\xDE |0 + \xB2\xDF |0 + \xB2\xE0 |0 + \xB2\xE1 |0 + \xB2\xE2 |0 + \xB2\xE3 |0 + \xB2\xE4 |0 + \xB2\xE5 |0 + \xB2\xE6 |0 + \xB2\xE7 |0 + \xB2\xE8 |0 + \xB2\xE9 |0 + \xB2\xEA |0 + \xB2\xEB |0 + \xB2\xEC |0 + \xB2\xED |0 + \xB2\xEE |0 + \xB2\xEF |0 + \xB2\xF0 |0 + \xB2\xF1 |0 + \xB2\xF2 |0 + \xB2\xF3 |0 + \xB2\xF4 |0 + \xB2\xF5 |0 + \xB2\xF6 |0 + \xB2\xF7 |0 + \xB2\xF8 |0 + \xB2\xF9 |0 + \xB2\xFA |0 + \xB2\xFB |0 + \xB2\xFC |0 + \xB2\xFD |0 + \xB2\xFE |0 + \xB3\xA1 |0 + \xB3\xA2 |0 + \xB3\xA3 |0 + \xB3\xA4 |0 + \xB3\xA5 |0 + \xB3\xA6 |0 + \xB3\xA7 |0 + \xB3\xA8 |0 + \xB3\xA9 |0 + \xB3\xAA |0 + \xB3\xAB |0 + \xB3\xAC |0 + \xB3\xAD |0 + \xB3\xAE |0 + \xB3\xAF |0 + \xB3\xB0 |0 + \xB3\xB1 |0 + \xB3\xB2 |0 + \xB3\xB3 |0 + \xB3\xB4 |0 + \xB3\xB5 |0 + \xB3\xB6 |0 + \xB3\xB7 |0 + \xB3\xB8 |0 + \xB3\xB9 |0 + \xB3\xBA |0 + \xB3\xBB |0 + \xB3\xBC |0 + \xB3\xBD |0 + \xB3\xBE |0 + \xB3\xBF |0 + \xB3\xC0 |0 + \xB3\xC1 |0 + \xB3\xC2 |0 + \xB3\xC3 |0 + \xB3\xC4 |0 + \xB3\xC5 |0 + \xB3\xC6 |0 + \xB3\xC7 |0 + \xB3\xC8 |0 + \xB3\xC9 |0 + \xB3\xCA |0 + \xB3\xCB |0 + \xB3\xCC |0 + \xB3\xCD |0 + \xB3\xCE |0 + \xB3\xCF |0 + \xB3\xD0 |0 + \xB3\xD1 |0 + \xB3\xD2 |0 + \xB3\xD3 |0 + \xB3\xD4 |0 + \xB3\xD5 |0 + \xB3\xD6 |0 + \xB3\xD7 |0 + \xB3\xD8 |0 + \xB3\xD9 |0 + \xB3\xDA |0 + \xB3\xDB |0 + \xB3\xDC |0 + \xB3\xDD |0 + \xB3\xDE |0 + \xB3\xDF |0 + \xB3\xE0 |0 + \xB3\xE1 |0 + \xB3\xE2 |0 + \xB3\xE3 |0 + \xB3\xE4 |0 + \xB3\xE5 |0 + \xB3\xE6 |0 + \xB3\xE7 |0 + \xB3\xE8 |0 + \xB3\xE9 |0 + \xB3\xEA |0 + \xB3\xEB |0 + \xB3\xEC |0 + \xB3\xED |0 + \xB3\xEE |0 + \xB3\xEF |0 + \xB3\xF0 |0 + \xB3\xF1 |0 + \xB3\xF2 |0 + \xB3\xF3 |0 + \xB3\xF4 |0 + \xB3\xF5 |0 + \xB3\xF6 |0 + \xB3\xF7 |0 + \xB3\xF8 |0 + \xB3\xF9 |0 + \xB3\xFA |0 + \xB3\xFB |0 + \xB3\xFC |0 + \xB3\xFD |0 + \xB3\xFE |0 + \xB4\xA1 |0 + \xB4\xA2 |0 + \xB4\xA3 |0 + \xB4\xA4 |0 + \xB4\xA5 |0 + \xB4\xA6 |0 + \xB4\xA7 |0 + \xB4\xA8 |0 + \xB4\xA9 |0 + \xB4\xAA |0 + \xB4\xAB |0 + \xB4\xAC |0 + \xB4\xAD |0 + \xB4\xAE |0 + \xB4\xAF |0 + \xB4\xB0 |0 + \xB4\xB1 |0 + \xB4\xB2 |0 + \xB4\xB3 |0 + \xB4\xB4 |0 + \xB4\xB5 |0 + \xB4\xB6 |0 + \xB4\xB7 |0 + \xB4\xB8 |0 + \xB4\xB9 |0 + \xB4\xBA |0 + \xB4\xBB |0 + \xB4\xBC |0 + \xB4\xBD |0 + \xB4\xBE |0 + \xB4\xBF |0 + \xB4\xC0 |0 + \xB4\xC1 |0 + \xB4\xC2 |0 + \xB4\xC3 |0 + \xB4\xC4 |0 + \xB4\xC5 |0 + \xB4\xC6 |0 + \xB4\xC7 |0 + \xB4\xC8 |0 + \xB4\xC9 |0 + \xB4\xCA |0 + \xB4\xCB |0 + \xB4\xCC |0 + \xB4\xCD |0 + \xB4\xCE |0 + \xB4\xCF |0 + \xB4\xD0 |0 + \xB4\xD1 |0 + \xB4\xD2 |0 + \xB4\xD3 |0 + \xB4\xD4 |0 + \xB4\xD5 |0 + \xB4\xD6 |0 + \xB4\xD7 |0 + \xB4\xD8 |0 + \xB4\xD9 |0 + \xB4\xDA |0 + \xB4\xDB |0 + \xB4\xDC |0 + \xB4\xDD |0 + \xB4\xDE |0 + \xB4\xDF |0 + \xB4\xE0 |0 + \xB4\xE1 |0 + \xB4\xE2 |0 + \xB4\xE3 |0 + \xB4\xE4 |0 + \xB4\xE5 |0 + \xB4\xE6 |0 + \xB4\xE7 |0 + \xB4\xE8 |0 + \xB4\xE9 |0 + \xB4\xEA |0 + \xB4\xEB |0 + \xB4\xEC |0 + \xB4\xED |0 + \xB4\xEE |0 + \xB4\xEF |0 + \xB4\xF0 |0 + \xB4\xF1 |0 + \xB4\xF2 |0 + \xB4\xF3 |0 + \xB4\xF4 |0 + \xB4\xF5 |0 + \xB4\xF6 |0 + \xB4\xF7 |0 + \xB4\xF8 |0 + \xB4\xF9 |0 + \xB4\xFA |0 + \xB4\xFB |0 + \xB4\xFC |0 + \xB4\xFD |0 + \xB4\xFE |0 + \xB5\xA1 |0 + \xB5\xA2 |0 + \xB5\xA3 |0 + \xB5\xA4 |0 + \xB5\xA5 |0 + \xB5\xA6 |0 + \xB5\xA7 |0 + \xB5\xA8 |0 + \xB5\xA9 |0 + \xB5\xAA |0 + \xB5\xAB |0 + \xB5\xAC |0 + \xB5\xAD |0 + \xB5\xAE |0 + \xB5\xAF |0 + \xB5\xB0 |0 + \xB5\xB1 |0 + \xB5\xB2 |0 + \xB5\xB3 |0 + \xB5\xB4 |0 + \xB5\xB5 |0 + \xB5\xB6 |0 + \xB5\xB7 |0 + \xB5\xB8 |0 + \xB5\xB9 |0 + \xB5\xBA |0 + \xB5\xBB |0 + \xB5\xBC |0 + \xB5\xBD |0 + \xB5\xBE |0 + \xB5\xBF |0 + \xB5\xC0 |0 + \xB5\xC1 |0 + \xB5\xC2 |0 + \xB5\xC3 |0 + \xB5\xC4 |0 + \xB5\xC5 |0 + \xB5\xC6 |0 + \xB5\xC7 |0 + \xB5\xC8 |0 + \xB5\xC9 |0 + \xB5\xCA |0 + \xB5\xCB |0 + \xB5\xCC |0 + \xB5\xCD |0 + \xB5\xCE |0 + \xB5\xCF |0 + \xB5\xD0 |0 + \xB5\xD1 |0 + \xB5\xD2 |0 + \xB5\xD3 |0 + \xB5\xD4 |0 + \xB5\xD5 |0 + \xB5\xD6 |0 + \xB5\xD7 |0 + \xB5\xD8 |0 + \xB5\xD9 |0 + \xB5\xDA |0 + \xB5\xDB |0 + \xB5\xDC |0 + \xB5\xDD |0 + \xB5\xDE |0 + \xB5\xDF |0 + \xB5\xE0 |0 + \xB5\xE1 |0 + \xB5\xE2 |0 + \xB5\xE3 |0 + \xB5\xE4 |0 + \xB5\xE5 |0 + \xB5\xE6 |0 + \xB5\xE7 |0 + \xB5\xE8 |0 + \xB5\xE9 |0 + \xB5\xEA |0 + \xB5\xEB |0 + \xB5\xEC |0 + \xB5\xED |0 + \xB5\xEE |0 + \xB5\xEF |0 + \xB5\xF0 |0 + \xB5\xF1 |0 + \xB5\xF2 |0 + \xB5\xF3 |0 + \xB5\xF4 |0 + \xB5\xF5 |0 + \xB5\xF6 |0 + \xB5\xF7 |0 + \xB5\xF8 |0 + \xB5\xF9 |0 + \xB5\xFA |0 + \xB5\xFB |0 + \xB5\xFC |0 + \xB5\xFD |0 + \xB5\xFE |0 + \xB6\xA1 |0 + \xB6\xA2 |0 + \xB6\xA3 |0 + \xB6\xA4 |0 + \xB6\xA5 |0 + \xB6\xA6 |0 + \xB6\xA7 |0 + \xB6\xA8 |0 + \xB6\xA9 |0 + \xB6\xAA |0 + \xB6\xAB |0 + \xB6\xAC |0 + \xB6\xAD |0 + \xB6\xAE |0 + \xB6\xAF |0 + \xB6\xB0 |0 + \xB6\xB1 |0 + \xB6\xB2 |0 + \xB6\xB3 |0 + \xB6\xB4 |0 + \xB6\xB5 |0 + \xB6\xB6 |0 + \xB6\xB7 |0 + \xB6\xB8 |0 + \xB6\xB9 |0 + \xB6\xBA |0 + \xB6\xBB |0 + \xB6\xBC |0 + \xB6\xBD |0 + \xB6\xBE |0 + \xB6\xBF |0 + \xB6\xC0 |0 + \xB6\xC1 |0 + \xB6\xC2 |0 + \xB6\xC3 |0 + \xB6\xC4 |0 + \xB6\xC5 |0 + \xB6\xC6 |0 + \xB6\xC7 |0 + \xB6\xC8 |0 + \xB6\xC9 |0 + \xB6\xCA |0 + \xB6\xCB |0 + \xB6\xCC |0 + \xB6\xCD |0 + \xB6\xCE |0 + \xB6\xCF |0 + \xB6\xD0 |0 + \xB6\xD1 |0 + \xB6\xD2 |0 + \xB6\xD3 |0 + \xB6\xD4 |0 + \xB6\xD5 |0 + \xB6\xD6 |0 + \xB6\xD7 |0 + \xB6\xD8 |0 + \xB6\xD9 |0 + \xB6\xDA |0 + \xB6\xDB |0 + \xB6\xDC |0 + \xB6\xDD |0 + \xB6\xDE |0 + \xB6\xDF |0 + \xB6\xE0 |0 + \xB6\xE1 |0 + \xB6\xE2 |0 + \xB6\xE3 |0 + \xB6\xE4 |0 + \xB6\xE5 |0 + \xB6\xE6 |0 + \xB6\xE7 |0 + \xB6\xE8 |0 + \xB6\xE9 |0 + \xB6\xEA |0 + \xB6\xEB |0 + \xB6\xEC |0 + \xB6\xED |0 + \xB6\xEE |0 + \xB6\xEF |0 + \xB6\xF0 |0 + \xB6\xF1 |0 + \xB6\xF2 |0 + \xB6\xF3 |0 + \xB6\xF4 |0 + \xB6\xF5 |0 + \xB6\xF6 |0 + \xB6\xF7 |0 + \xB6\xF8 |0 + \xB6\xF9 |0 + \xB6\xFA |0 + \xB6\xFB |0 + \xB6\xFC |0 + \xB6\xFD |0 + \xB6\xFE |0 + \xB7\xA1 |0 + \xB7\xA2 |0 + \xB7\xA3 |0 + \xB7\xA4 |0 + \xB7\xA5 |0 + \xB7\xA6 |0 + \xB7\xA7 |0 + \xB7\xA8 |0 + \xB7\xA9 |0 + \xB7\xAA |0 + \xB7\xAB |0 + \xB7\xAC |0 + \xB7\xAD |0 + \xB7\xAE |0 + \xB7\xAF |0 + \xB7\xB0 |0 + \xB7\xB1 |0 + \xB7\xB2 |0 + \xB7\xB3 |0 + \xB7\xB4 |0 + \xB7\xB5 |0 + \xB7\xB6 |0 + \xB7\xB7 |0 + \xB7\xB8 |0 + \xB7\xB9 |0 + \xB7\xBA |0 + \xB7\xBB |0 + \xB7\xBC |0 + \xB7\xBD |0 + \xB7\xBE |0 + \xB7\xBF |0 + \xB7\xC0 |0 + \xB7\xC1 |0 + \xB7\xC2 |0 + \xB7\xC3 |0 + \xB7\xC4 |0 + \xB7\xC5 |0 + \xB7\xC6 |0 + \xB7\xC7 |0 + \xB7\xC8 |0 + \xB7\xC9 |0 + \xB7\xCA |0 + \xB7\xCB |0 + \xB7\xCC |0 + \xB7\xCD |0 + \xB7\xCE |0 + \xB7\xCF |0 + \xB7\xD0 |0 + \xB7\xD1 |0 + \xB7\xD2 |0 + \xB7\xD3 |0 + \xB7\xD4 |0 + \xB7\xD5 |0 + \xB7\xD6 |0 + \xB7\xD7 |0 + \xB7\xD8 |0 + \xB7\xD9 |0 + \xB7\xDA |0 + \xB7\xDB |0 + \xB7\xDC |0 + \xB7\xDD |0 + \xB7\xDE |0 + \xB7\xDF |0 + \xB7\xE0 |0 + \xB7\xE1 |0 + \xB7\xE2 |0 + \xB7\xE3 |0 + \xB7\xE4 |0 + \xB7\xE5 |0 + \xB7\xE6 |0 + \xB7\xE7 |0 + \xB7\xE8 |0 + \xB7\xE9 |0 + \xB7\xEA |0 + \xB7\xEB |0 + \xB7\xEC |0 + \xB7\xED |0 + \xB7\xEE |0 + \xB7\xEF |0 + \xB7\xF0 |0 + \xB7\xF1 |0 + \xB7\xF2 |0 + \xB7\xF3 |0 + \xB7\xF4 |0 + \xB7\xF5 |0 + \xB7\xF6 |0 + \xB7\xF7 |0 + \xB7\xF8 |0 + \xB7\xF9 |0 + \xB7\xFA |0 + \xB7\xFB |0 + \xB7\xFC |0 + \xB7\xFD |0 + \xB7\xFE |0 + \xB8\xA1 |0 + \xB8\xA2 |0 + \xB8\xA3 |0 + \xB8\xA4 |0 + \xB8\xA5 |0 + \xB8\xA6 |0 + \xB8\xA7 |0 + \xB8\xA8 |0 + \xB8\xA9 |0 + \xB8\xAA |0 + \xB8\xAB |0 + \xB8\xAC |0 + \xB8\xAD |0 + \xB8\xAE |0 + \xB8\xAF |0 + \xB8\xB0 |0 + \xB8\xB1 |0 + \xB8\xB2 |0 + \xB8\xB3 |0 + \xB8\xB4 |0 + \xB8\xB5 |0 + \xB8\xB6 |0 + \xB8\xB7 |0 + \xB8\xB8 |0 + \xB8\xB9 |0 + \xB8\xBA |0 + \xB8\xBB |0 + \xB8\xBC |0 + \xB8\xBD |0 + \xB8\xBE |0 + \xB8\xBF |0 + \xB8\xC0 |0 + \xB8\xC1 |0 + \xB8\xC2 |0 + \xB8\xC3 |0 + \xB8\xC4 |0 + \xB8\xC5 |0 + \xB8\xC6 |0 + \xB8\xC7 |0 + \xB8\xC8 |0 + \xB8\xC9 |0 + \xB8\xCA |0 + \xB8\xCB |0 + \xB8\xCC |0 + \xB8\xCD |0 + \xB8\xCE |0 + \xB8\xCF |0 + \xB8\xD0 |0 + \xB8\xD1 |0 + \xB8\xD2 |0 + \xB8\xD3 |0 + \xB8\xD4 |0 + \xB8\xD5 |0 + \xB8\xD6 |0 + \xB8\xD7 |0 + \xB8\xD8 |0 + \xB8\xD9 |0 + \xB8\xDA |0 + \xB8\xDB |0 + \xB8\xDC |0 + \xB8\xDD |0 + \xB8\xDE |0 + \xB8\xDF |0 + \xB8\xE0 |0 + \xB8\xE1 |0 + \xB8\xE2 |0 + \xB8\xE3 |0 + \xB8\xE4 |0 + \xB8\xE5 |0 + \xB8\xE6 |0 + \xB8\xE7 |0 + \xB8\xE8 |0 + \xB8\xE9 |0 + \xB8\xEA |0 + \xB8\xEB |0 + \xB8\xEC |0 + \xB8\xED |0 + \xB8\xEE |0 + \xB8\xEF |0 + \xB8\xF0 |0 + \xB8\xF1 |0 + \xB8\xF2 |0 + \xB8\xF3 |0 + \xB8\xF4 |0 + \xB8\xF5 |0 + \xB8\xF6 |0 + \xB8\xF7 |0 + \xB8\xF8 |0 + \xB8\xF9 |0 + \xB8\xFA |0 + \xB8\xFB |0 + \xB8\xFC |0 + \xB8\xFD |0 + \xB8\xFE |0 + \xB9\xA1 |0 + \xB9\xA2 |0 + \xB9\xA3 |0 + \xB9\xA4 |0 + \xB9\xA5 |0 + \xB9\xA6 |0 + \xB9\xA7 |0 + \xB9\xA8 |0 + \xB9\xA9 |0 + \xB9\xAA |0 + \xB9\xAB |0 + \xB9\xAC |0 + \xB9\xAD |0 + \xB9\xAE |0 + \xB9\xAF |0 + \xB9\xB0 |0 + \xB9\xB1 |0 + \xB9\xB2 |0 + \xB9\xB3 |0 + \xB9\xB4 |0 + \xB9\xB5 |0 + \xB9\xB6 |0 + \xB9\xB7 |0 + \xB9\xB8 |0 + \xB9\xB9 |0 + \xB9\xBA |0 + \xB9\xBB |0 + \xB9\xBC |0 + \xB9\xBD |0 + \xB9\xBE |0 + \xB9\xBF |0 + \xB9\xC0 |0 + \xB9\xC1 |0 + \xB9\xC2 |0 + \xB9\xC3 |0 + \xB9\xC4 |0 + \xB9\xC5 |0 + \xB9\xC6 |0 + \xB9\xC7 |0 + \xB9\xC8 |0 + \xB9\xC9 |0 + \xB9\xCA |0 + \xB9\xCB |0 + \xB9\xCC |0 + \xB9\xCD |0 + \xB9\xCE |0 + \xB9\xCF |0 + \xB9\xD0 |0 + \xB9\xD1 |0 + \xB9\xD2 |0 + \xB9\xD3 |0 + \xB9\xD4 |0 + \xB9\xD5 |0 + \xB9\xD6 |0 + \xB9\xD7 |0 + \xB9\xD8 |0 + \xB9\xD9 |0 + \xB9\xDA |0 + \xB9\xDB |0 + \xB9\xDC |0 + \xB9\xDD |0 + \xB9\xDE |0 + \xB9\xDF |0 + \xB9\xE0 |0 + \xB9\xE1 |0 + \xB9\xE2 |0 + \xB9\xE3 |0 + \xB9\xE4 |0 + \xB9\xE5 |0 + \xB9\xE6 |0 + \xB9\xE7 |0 + \xB9\xE8 |0 + \xB9\xE9 |0 + \xB9\xEA |0 + \xB9\xEB |0 + \xB9\xEC |0 + \xB9\xED |0 + \xB9\xEE |0 + \xB9\xEF |0 + \xB9\xF0 |0 + \xB9\xF1 |0 + \xB9\xF2 |0 + \xB9\xF3 |0 + \xB9\xF4 |0 + \xB9\xF5 |0 + \xB9\xF6 |0 + \xB9\xF7 |0 + \xB9\xF8 |0 + \xB9\xF9 |0 + \xB9\xFA |0 + \xB9\xFB |0 + \xB9\xFC |0 + \xB9\xFD |0 + \xB9\xFE |0 + \xBA\xA1 |0 + \xBA\xA2 |0 + \xBA\xA3 |0 + \xBA\xA4 |0 + \xBA\xA5 |0 + \xBA\xA6 |0 + \xBA\xA7 |0 + \xBA\xA8 |0 + \xBA\xA9 |0 + \xBA\xAA |0 + \xBA\xAB |0 + \xBA\xAC |0 + \xBA\xAD |0 + \xBA\xAE |0 + \xBA\xAF |0 + \xBA\xB0 |0 + \xBA\xB1 |0 + \xBA\xB2 |0 + \xBA\xB3 |0 + \xBA\xB4 |0 + \xBA\xB5 |0 + \xBA\xB6 |0 + \xBA\xB7 |0 + \xBA\xB8 |0 + \xBA\xB9 |0 + \xBA\xBA |0 + \xBA\xBB |0 + \xBA\xBC |0 + \xBA\xBD |0 + \xBA\xBE |0 + \xBA\xBF |0 + \xBA\xC0 |0 + \xBA\xC1 |0 + \xBA\xC2 |0 + \xBA\xC3 |0 + \xBA\xC4 |0 + \xBA\xC5 |0 + \xBA\xC6 |0 + \xBA\xC7 |0 + \xBA\xC8 |0 + \xBA\xC9 |0 + \xBA\xCA |0 + \xBA\xCB |0 + \xBA\xCC |0 + \xBA\xCD |0 + \xBA\xCE |0 + \xBA\xCF |0 + \xBA\xD0 |0 + \xBA\xD1 |0 + \xBA\xD2 |0 + \xBA\xD3 |0 + \xBA\xD4 |0 + \xBA\xD5 |0 + \xBA\xD6 |0 + \xBA\xD7 |0 + \xBA\xD8 |0 + \xBA\xD9 |0 + \xBA\xDA |0 + \xBA\xDB |0 + \xBA\xDC |0 + \xBA\xDD |0 + \xBA\xDE |0 + \xBA\xDF |0 + \xBA\xE0 |0 + \xBA\xE1 |0 + \xBA\xE2 |0 + \xBA\xE3 |0 + \xBA\xE4 |0 + \xBA\xE5 |0 + \xBA\xE6 |0 + \xBA\xE7 |0 + \xBA\xE8 |0 + \xBA\xE9 |0 + \xBA\xEA |0 + \xBA\xEB |0 + \xBA\xEC |0 + \xBA\xED |0 + \xBA\xEE |0 + \xBA\xEF |0 + \xBA\xF0 |0 + \xBA\xF1 |0 + \xBA\xF2 |0 + \xBA\xF3 |0 + \xBA\xF4 |0 + \xBA\xF5 |0 + \xBA\xF6 |0 + \xBA\xF7 |0 + \xBA\xF8 |0 + \xBA\xF9 |0 + \xBA\xFA |0 + \xBA\xFB |0 + \xBA\xFC |0 + \xBA\xFD |0 + \xBA\xFE |0 + \xBB\xA1 |0 + \xBB\xA2 |0 + \xBB\xA3 |0 + \xBB\xA4 |0 + \xBB\xA5 |0 + \xBB\xA6 |0 + \xBB\xA7 |0 + \xBB\xA8 |0 + \xBB\xA9 |0 + \xBB\xAA |0 + \xBB\xAB |0 + \xBB\xAC |0 + \xBB\xAD |0 + \xBB\xAE |0 + \xBB\xAF |0 + \xBB\xB0 |0 + \xBB\xB1 |0 + \xBB\xB2 |0 + \xBB\xB3 |0 + \xBB\xB4 |0 + \xBB\xB5 |0 + \xBB\xB6 |0 + \xBB\xB7 |0 + \xBB\xB8 |0 + \xBB\xB9 |0 + \xBB\xBA |0 + \xBB\xBB |0 + \xBB\xBC |0 + \xBB\xBD |0 + \xBB\xBE |0 + \xBB\xBF |0 + \xBB\xC0 |0 + \xBB\xC1 |0 + \xBB\xC2 |0 + \xBB\xC3 |0 + \xBB\xC4 |0 + \xBB\xC5 |0 + \xBB\xC6 |0 + \xBB\xC7 |0 + \xBB\xC8 |0 + \xBB\xC9 |0 + \xBB\xCA |0 + \xBB\xCB |0 + \xBB\xCC |0 + \xBB\xCD |0 + \xBB\xCE |0 + \xBB\xCF |0 + \xBB\xD0 |0 + \xBB\xD1 |0 + \xBB\xD2 |0 + \xBB\xD3 |0 + \xBB\xD4 |0 + \xBB\xD5 |0 + \xBB\xD6 |0 + \xBB\xD7 |0 + \xBB\xD8 |0 + \xBB\xD9 |0 + \xBB\xDA |0 + \xBB\xDB |0 + \xBB\xDC |0 + \xBB\xDD |0 + \xBB\xDE |0 + \xBB\xDF |0 + \xBB\xE0 |0 + \xBB\xE1 |0 + \xBB\xE2 |0 + \xBB\xE3 |0 + \xBB\xE4 |0 + \xBB\xE5 |0 + \xBB\xE6 |0 + \xBB\xE7 |0 + \xBB\xE8 |0 + \xBB\xE9 |0 + \xBB\xEA |0 + \xBB\xEB |0 + \xBB\xEC |0 + \xBB\xED |0 + \xBB\xEE |0 + \xBB\xEF |0 + \xBB\xF0 |0 + \xBB\xF1 |0 + \xBB\xF2 |0 + \xBB\xF3 |0 + \xBB\xF4 |0 + \xBB\xF5 |0 + \xBB\xF6 |0 + \xBB\xF7 |0 + \xBB\xF8 |0 + \xBB\xF9 |0 + \xBB\xFA |0 + \xBB\xFB |0 + \xBB\xFC |0 + \xBB\xFD |0 + \xBB\xFE |0 + \xBC\xA1 |0 + \xBC\xA2 |0 + \xBC\xA3 |0 + \xBC\xA4 |0 + \xBC\xA5 |0 + \xBC\xA6 |0 + \xBC\xA7 |0 + \xBC\xA8 |0 + \xBC\xA9 |0 + \xBC\xAA |0 + \xBC\xAB |0 + \xBC\xAC |0 + \xBC\xAD |0 + \xBC\xAE |0 + \xBC\xAF |0 + \xBC\xB0 |0 + \xBC\xB1 |0 + \xBC\xB2 |0 + \xBC\xB3 |0 + \xBC\xB4 |0 + \xBC\xB5 |0 + \xBC\xB6 |0 + \xBC\xB7 |0 + \xBC\xB8 |0 + \xBC\xB9 |0 + \xBC\xBA |0 + \xBC\xBB |0 + \xBC\xBC |0 + \xBC\xBD |0 + \xBC\xBE |0 + \xBC\xBF |0 + \xBC\xC0 |0 + \xBC\xC1 |0 + \xBC\xC2 |0 + \xBC\xC3 |0 + \xBC\xC4 |0 + \xBC\xC5 |0 + \xBC\xC6 |0 + \xBC\xC7 |0 + \xBC\xC8 |0 + \xBC\xC9 |0 + \xBC\xCA |0 + \xBC\xCB |0 + \xBC\xCC |0 + \xBC\xCD |0 + \xBC\xCE |0 + \xBC\xCF |0 + \xBC\xD0 |0 + \xBC\xD1 |0 + \xBC\xD2 |0 + \xBC\xD3 |0 + \xBC\xD4 |0 + \xBC\xD5 |0 + \xBC\xD6 |0 + \xBC\xD7 |0 + \xBC\xD8 |0 + \xBC\xD9 |0 + \xBC\xDA |0 + \xBC\xDB |0 + \xBC\xDC |0 + \xBC\xDD |0 + \xBC\xDE |0 + \xBC\xDF |0 + \xBC\xE0 |0 + \xBC\xE1 |0 + \xBC\xE2 |0 + \xBC\xE3 |0 + \xBC\xE4 |0 + \xBC\xE5 |0 + \xBC\xE6 |0 + \xBC\xE7 |0 + \xBC\xE8 |0 + \xBC\xE9 |0 + \xBC\xEA |0 + \xBC\xEB |0 + \xBC\xEC |0 + \xBC\xED |0 + \xBC\xEE |0 + \xBC\xEF |0 + \xBC\xF0 |0 + \xBC\xF1 |0 + \xBC\xF2 |0 + \xBC\xF3 |0 + \xBC\xF4 |0 + \xBC\xF5 |0 + \xBC\xF6 |0 + \xBC\xF7 |0 + \xBC\xF8 |0 + \xBC\xF9 |0 + \xBC\xFA |0 + \xBC\xFB |0 + \xBC\xFC |0 + \xBC\xFD |0 + \xBC\xFE |0 + \xBD\xA1 |0 + \xBD\xA2 |0 + \xBD\xA3 |0 + \xBD\xA4 |0 + \xBD\xA5 |0 + \xBD\xA6 |0 + \xBD\xA7 |0 + \xBD\xA8 |0 + \xBD\xA9 |0 + \xBD\xAA |0 + \xBD\xAB |0 + \xBD\xAC |0 + \xBD\xAD |0 + \xBD\xAE |0 + \xBD\xAF |0 + \xBD\xB0 |0 + \xBD\xB1 |0 + \xBD\xB2 |0 + \xBD\xB3 |0 + \xBD\xB4 |0 + \xBD\xB5 |0 + \xBD\xB6 |0 + \xBD\xB7 |0 + \xBD\xB8 |0 + \xBD\xB9 |0 + \xBD\xBA |0 + \xBD\xBB |0 + \xBD\xBC |0 + \xBD\xBD |0 + \xBD\xBE |0 + \xBD\xBF |0 + \xBD\xC0 |0 + \xBD\xC1 |0 + \xBD\xC2 |0 + \xBD\xC3 |0 + \xBD\xC4 |0 + \xBD\xC5 |0 + \xBD\xC6 |0 + \xBD\xC7 |0 + \xBD\xC8 |0 + \xBD\xC9 |0 + \xBD\xCA |0 + \xBD\xCB |0 + \xBD\xCC |0 + \xBD\xCD |0 + \xBD\xCE |0 + \xBD\xCF |0 + \xBD\xD0 |0 + \xBD\xD1 |0 + \xBD\xD2 |0 + \xBD\xD3 |0 + \xBD\xD4 |0 + \xBD\xD5 |0 + \xBD\xD6 |0 + \xBD\xD7 |0 + \xBD\xD8 |0 + \xBD\xD9 |0 + \xBD\xDA |0 + \xBD\xDB |0 + \xBD\xDC |0 + \xBD\xDD |0 + \xBD\xDE |0 + \xBD\xDF |0 + \xBD\xE0 |0 + \xBD\xE1 |0 + \xBD\xE2 |0 + \xBD\xE3 |0 + \xBD\xE4 |0 + \xBD\xE5 |0 + \xBD\xE6 |0 + \xBD\xE7 |0 + \xBD\xE8 |0 + \xBD\xE9 |0 + \xBD\xEA |0 + \xBD\xEB |0 + \xBD\xEC |0 + \xBD\xED |0 + \xBD\xEE |0 + \xBD\xEF |0 + \xBD\xF0 |0 + \xBD\xF1 |0 + \xBD\xF2 |0 + \xBD\xF3 |0 + \xBD\xF4 |0 + \xBD\xF5 |0 + \xBD\xF6 |0 + \xBD\xF7 |0 + \xBD\xF8 |0 + \xBD\xF9 |0 + \xBD\xFA |0 + \xBD\xFB |0 + \xBD\xFC |0 + \xBD\xFD |0 + \xBD\xFE |0 + \xBE\xA1 |0 + \xBE\xA2 |0 + \xBE\xA3 |0 + \xBE\xA4 |0 + \xBE\xA5 |0 + \xBE\xA6 |0 + \xBE\xA7 |0 + \xBE\xA8 |0 + \xBE\xA9 |0 + \xBE\xAA |0 + \xBE\xAB |0 + \xBE\xAC |0 + \xBE\xAD |0 + \xBE\xAE |0 + \xBE\xAF |0 + \xBE\xB0 |0 + \xBE\xB1 |0 + \xBE\xB2 |0 + \xBE\xB3 |0 + \xBE\xB4 |0 + \xBE\xB5 |0 + \xBE\xB6 |0 + \xBE\xB7 |0 + \xBE\xB8 |0 + \xBE\xB9 |0 + \xBE\xBA |0 + \xBE\xBB |0 + \xBE\xBC |0 + \xBE\xBD |0 + \xBE\xBE |0 + \xBE\xBF |0 + \xBE\xC0 |0 + \xBE\xC1 |0 + \xBE\xC2 |0 + \xBE\xC3 |0 + \xBE\xC4 |0 + \xBE\xC5 |0 + \xBE\xC6 |0 + \xBE\xC7 |0 + \xBE\xC8 |0 + \xBE\xC9 |0 + \xBE\xCA |0 + \xBE\xCB |0 + \xBE\xCC |0 + \xBE\xCD |0 + \xBE\xCE |0 + \xBE\xCF |0 + \xBE\xD0 |0 + \xBE\xD1 |0 + \xBE\xD2 |0 + \xBE\xD3 |0 + \xBE\xD4 |0 + \xBE\xD5 |0 + \xBE\xD6 |0 + \xBE\xD7 |0 + \xBE\xD8 |0 + \xBE\xD9 |0 + \xBE\xDA |0 + \xBE\xDB |0 + \xBE\xDC |0 + \xBE\xDD |0 + \xBE\xDE |0 + \xBE\xDF |0 + \xBE\xE0 |0 + \xBE\xE1 |0 + \xBE\xE2 |0 + \xBE\xE3 |0 + \xBE\xE4 |0 + \xBE\xE5 |0 + \xBE\xE6 |0 + \xBE\xE7 |0 + \xBE\xE8 |0 + \xBE\xE9 |0 + \xBE\xEA |0 + \xBE\xEB |0 + \xBE\xEC |0 + \xBE\xED |0 + \xBE\xEE |0 + \xBE\xEF |0 + \xBE\xF0 |0 + \xBE\xF1 |0 + \xBE\xF2 |0 + \xBE\xF3 |0 + \xBE\xF4 |0 + \xBE\xF5 |0 + \xBE\xF6 |0 + \xBE\xF7 |0 + \xBE\xF8 |0 + \xBE\xF9 |0 + \xBE\xFA |0 + \xBE\xFB |0 + \xBE\xFC |0 + \xBE\xFD |0 + \xBE\xFE |0 + \xBF\xA1 |0 + \xBF\xA2 |0 + \xBF\xA3 |0 + \xBF\xA4 |0 + \xBF\xA5 |0 + \xBF\xA6 |0 + \xBF\xA7 |0 + \xBF\xA8 |0 + \xBF\xA9 |0 + \xBF\xAA |0 + \xBF\xAB |0 + \xBF\xAC |0 + \xBF\xAD |0 + \xBF\xAE |0 + \xBF\xAF |0 + \xBF\xB0 |0 + \xBF\xB1 |0 + \xBF\xB2 |0 + \xBF\xB3 |0 + \xBF\xB4 |0 + \xBF\xB5 |0 + \xBF\xB6 |0 + \xBF\xB7 |0 + \xBF\xB8 |0 + \xBF\xB9 |0 + \xBF\xBA |0 + \xBF\xBB |0 + \xBF\xBC |0 + \xBF\xBD |0 + \xBF\xBE |0 + \xBF\xBF |0 + \xBF\xC0 |0 + \xBF\xC1 |0 + \xBF\xC2 |0 + \xBF\xC3 |0 + \xBF\xC4 |0 + \xBF\xC5 |0 + \xBF\xC6 |0 + \xBF\xC7 |0 + \xBF\xC8 |0 + \xBF\xC9 |0 + \xBF\xCA |0 + \xBF\xCB |0 + \xBF\xCC |0 + \xBF\xCD |0 + \xBF\xCE |0 + \xBF\xCF |0 + \xBF\xD0 |0 + \xBF\xD1 |0 + \xBF\xD2 |0 + \xBF\xD3 |0 + \xBF\xD4 |0 + \xBF\xD5 |0 + \xBF\xD6 |0 + \xBF\xD7 |0 + \xBF\xD8 |0 + \xBF\xD9 |0 + \xBF\xDA |0 + \xBF\xDB |0 + \xBF\xDC |0 + \xBF\xDD |0 + \xBF\xDE |0 + \xBF\xDF |0 + \xBF\xE0 |0 + \xBF\xE1 |0 + \xBF\xE2 |0 + \xBF\xE3 |0 + \xBF\xE4 |0 + \xBF\xE5 |0 + \xBF\xE6 |0 + \xBF\xE7 |0 + \xBF\xE8 |0 + \xBF\xE9 |0 + \xBF\xEA |0 + \xBF\xEB |0 + \xBF\xEC |0 + \xBF\xED |0 + \xBF\xEE |0 + \xBF\xEF |0 + \xBF\xF0 |0 + \xBF\xF1 |0 + \xBF\xF2 |0 + \xBF\xF3 |0 + \xBF\xF4 |0 + \xBF\xF5 |0 + \xBF\xF6 |0 + \xBF\xF7 |0 + \xBF\xF8 |0 + \xBF\xF9 |0 + \xBF\xFA |0 + \xBF\xFB |0 + \xBF\xFC |0 + \xBF\xFD |0 + \xBF\xFE |0 + \xC0\xA1 |0 + \xC0\xA2 |0 + \xC0\xA3 |0 + \xC0\xA4 |0 + \xC0\xA5 |0 + \xC0\xA6 |0 + \xC0\xA7 |0 + \xC0\xA8 |0 + \xC0\xA9 |0 + \xC0\xAA |0 + \xC0\xAB |0 + \xC0\xAC |0 + \xC0\xAD |0 + \xC0\xAE |0 + \xC0\xAF |0 + \xC0\xB0 |0 + \xC0\xB1 |0 + \xC0\xB2 |0 + \xC0\xB3 |0 + \xC0\xB4 |0 + \xC0\xB5 |0 + \xC0\xB6 |0 + \xC0\xB7 |0 + \xC0\xB8 |0 + \xC0\xB9 |0 + \xC0\xBA |0 + \xC0\xBB |0 + \xC0\xBC |0 + \xC0\xBD |0 + \xC0\xBE |0 + \xC0\xBF |0 + \xC0\xC0 |0 + \xC0\xC1 |0 + \xC0\xC2 |0 + \xC0\xC3 |0 + \xC0\xC4 |0 + \xC0\xC5 |0 + \xC0\xC6 |0 + \xC0\xC7 |0 + \xC0\xC8 |0 + \xC0\xC9 |0 + \xC0\xCA |0 + \xC0\xCB |0 + \xC0\xCC |0 + \xC0\xCD |0 + \xC0\xCE |0 + \xC0\xCF |0 + \xC0\xD0 |0 + \xC0\xD1 |0 + \xC0\xD2 |0 + \xC0\xD3 |0 + \xC0\xD4 |0 + \xC0\xD5 |0 + \xC0\xD6 |0 + \xC0\xD7 |0 + \xC0\xD8 |0 + \xC0\xD9 |0 + \xC0\xDA |0 + \xC0\xDB |0 + \xC0\xDC |0 + \xC0\xDD |0 + \xC0\xDE |0 + \xC0\xDF |0 + \xC0\xE0 |0 + \xC0\xE1 |0 + \xC0\xE2 |0 + \xC0\xE3 |0 + \xC0\xE4 |0 + \xC0\xE5 |0 + \xC0\xE6 |0 + \xC0\xE7 |0 + \xC0\xE8 |0 + \xC0\xE9 |0 + \xC0\xEA |0 + \xC0\xEB |0 + \xC0\xEC |0 + \xC0\xED |0 + \xC0\xEE |0 + \xC0\xEF |0 + \xC0\xF0 |0 + \xC0\xF1 |0 + \xC0\xF2 |0 + \xC0\xF3 |0 + \xC0\xF4 |0 + \xC0\xF5 |0 + \xC0\xF6 |0 + \xC0\xF7 |0 + \xC0\xF8 |0 + \xC0\xF9 |0 + \xC0\xFA |0 + \xC0\xFB |0 + \xC0\xFC |0 + \xC0\xFD |0 + \xC0\xFE |0 + \xC1\xA1 |0 + \xC1\xA2 |0 + \xC1\xA3 |0 + \xC1\xA4 |0 + \xC1\xA5 |0 + \xC1\xA6 |0 + \xC1\xA7 |0 + \xC1\xA8 |0 + \xC1\xA9 |0 + \xC1\xAA |0 + \xC1\xAB |0 + \xC1\xAC |0 + \xC1\xAD |0 + \xC1\xAE |0 + \xC1\xAF |0 + \xC1\xB0 |0 + \xC1\xB1 |0 + \xC1\xB2 |0 + \xC1\xB3 |0 + \xC1\xB4 |0 + \xC1\xB5 |0 + \xC1\xB6 |0 + \xC1\xB7 |0 + \xC1\xB8 |0 + \xC1\xB9 |0 + \xC1\xBA |0 + \xC1\xBB |0 + \xC1\xBC |0 + \xC1\xBD |0 + \xC1\xBE |0 + \xC1\xBF |0 + \xC1\xC0 |0 + \xC1\xC1 |0 + \xC1\xC2 |0 + \xC1\xC3 |0 + \xC1\xC4 |0 + \xC1\xC5 |0 + \xC1\xC6 |0 + \xC1\xC7 |0 + \xC1\xC8 |0 + \xC1\xC9 |0 + \xC1\xCA |0 + \xC1\xCB |0 + \xC1\xCC |0 + \xC1\xCD |0 + \xC1\xCE |0 + \xC1\xCF |0 + \xC1\xD0 |0 + \xC1\xD1 |0 + \xC1\xD2 |0 + \xC1\xD3 |0 + \xC1\xD4 |0 + \xC1\xD5 |0 + \xC1\xD6 |0 + \xC1\xD7 |0 + \xC1\xD8 |0 + \xC1\xD9 |0 + \xC1\xDA |0 + \xC1\xDB |0 + \xC1\xDC |0 + \xC1\xDD |0 + \xC1\xDE |0 + \xC1\xDF |0 + \xC1\xE0 |0 + \xC1\xE1 |0 + \xC1\xE2 |0 + \xC1\xE3 |0 + \xC1\xE4 |0 + \xC1\xE5 |0 + \xC1\xE6 |0 + \xC1\xE7 |0 + \xC1\xE8 |0 + \xC1\xE9 |0 + \xC1\xEA |0 + \xC1\xEB |0 + \xC1\xEC |0 + \xC1\xED |0 + \xC1\xEE |0 + \xC1\xEF |0 + \xC1\xF0 |0 + \xC1\xF1 |0 + \xC1\xF2 |0 + \xC1\xF3 |0 + \xC1\xF4 |0 + \xC1\xF5 |0 + \xC1\xF6 |0 + \xC1\xF7 |0 + \xC1\xF8 |0 + \xC1\xF9 |0 + \xC1\xFA |0 + \xC1\xFB |0 + \xC1\xFC |0 + \xC1\xFD |0 + \xC1\xFE |0 + \xC2\xA1 |0 + \xC2\xA2 |0 + \xC2\xA3 |0 + \xC2\xA4 |0 + \xC2\xA5 |0 + \xC2\xA6 |0 + \xC2\xA7 |0 + \xC2\xA8 |0 + \xC2\xA9 |0 + \xC2\xAA |0 + \xC2\xAB |0 + \xC2\xAC |0 + \xC2\xAD |0 + \xC2\xAE |0 + \xC2\xAF |0 + \xC2\xB0 |0 + \xC2\xB1 |0 + \xC2\xB2 |0 + \xC2\xB3 |0 + \xC2\xB4 |0 + \xC2\xB5 |0 + \xC2\xB6 |0 + \xC2\xB7 |0 + \xC2\xB8 |0 + \xC2\xB9 |0 + \xC2\xBA |0 + \xC2\xBB |0 + \xC2\xBC |0 + \xC2\xBD |0 + \xC2\xBE |0 + \xC2\xBF |0 + \xC2\xC0 |0 + \xC2\xC1 |0 + \xC2\xC2 |0 + \xC2\xC3 |0 + \xC2\xC4 |0 + \xC2\xC5 |0 + \xC2\xC6 |0 + \xC2\xC7 |0 + \xC2\xC8 |0 + \xC2\xC9 |0 + \xC2\xCA |0 + \xC2\xCB |0 + \xC2\xCC |0 + \xC2\xCD |0 + \xC2\xCE |0 + \xC2\xCF |0 + \xC2\xD0 |0 + \xC2\xD1 |0 + \xC2\xD2 |0 + \xC2\xD3 |0 + \xC2\xD4 |0 + \xC2\xD5 |0 + \xC2\xD6 |0 + \xC2\xD7 |0 + \xC2\xD8 |0 + \xC2\xD9 |0 + \xC2\xDA |0 + \xC2\xDB |0 + \xC2\xDC |0 + \xC2\xDD |0 + \xC2\xDE |0 + \xC2\xDF |0 + \xC2\xE0 |0 + \xC2\xE1 |0 + \xC2\xE2 |0 + \xC2\xE3 |0 + \xC2\xE4 |0 + \xC2\xE5 |0 + \xC2\xE6 |0 + \xC2\xE7 |0 + \xC2\xE8 |0 + \xC2\xE9 |0 + \xC2\xEA |0 + \xC2\xEB |0 + \xC2\xEC |0 + \xC2\xED |0 + \xC2\xEE |0 + \xC2\xEF |0 + \xC2\xF0 |0 + \xC2\xF1 |0 + \xC2\xF2 |0 + \xC2\xF3 |0 + \xC2\xF4 |0 + \xC2\xF5 |0 + \xC2\xF6 |0 + \xC2\xF7 |0 + \xC2\xF8 |0 + \xC2\xF9 |0 + \xC2\xFA |0 + \xC2\xFB |0 + \xC2\xFC |0 + \xC2\xFD |0 + \xC2\xFE |0 + \xC3\xA1 |0 + \xC3\xA2 |0 + \xC3\xA3 |0 + \xC3\xA4 |0 + \xC3\xA5 |0 + \xC3\xA6 |0 + \xC3\xA7 |0 + \xC3\xA8 |0 + \xC3\xA9 |0 + \xC3\xAA |0 + \xC3\xAB |0 + \xC3\xAC |0 + \xC3\xAD |0 + \xC3\xAE |0 + \xC3\xAF |0 + \xC3\xB0 |0 + \xC3\xB1 |0 + \xC3\xB2 |0 + \xC3\xB3 |0 + \xC3\xB4 |0 + \xC3\xB5 |0 + \xC3\xB6 |0 + \xC3\xB7 |0 + \xC3\xB8 |0 + \xC3\xB9 |0 + \xC3\xBA |0 + \xC3\xBB |0 + \xC3\xBC |0 + \xC3\xBD |0 + \xC3\xBE |0 + \xC3\xBF |0 + \xC3\xC0 |0 + \xC3\xC1 |0 + \xC3\xC2 |0 + \xC3\xC3 |0 + \xC3\xC4 |0 + \xC3\xC5 |0 + \xC3\xC6 |0 + \xC3\xC7 |0 + \xC3\xC8 |0 + \xC3\xC9 |0 + \xC3\xCA |0 + \xC3\xCB |0 + \xC3\xCC |0 + \xC3\xCD |0 + \xC3\xCE |0 + \xC3\xCF |0 + \xC3\xD0 |0 + \xC3\xD1 |0 + \xC3\xD2 |0 + \xC3\xD3 |0 + \xC3\xD4 |0 + \xC3\xD5 |0 + \xC3\xD6 |0 + \xC3\xD7 |0 + \xC3\xD8 |0 + \xC3\xD9 |0 + \xC3\xDA |0 + \xC3\xDB |0 + \xC3\xDC |0 + \xC3\xDD |0 + \xC3\xDE |0 + \xC3\xDF |0 + \xC3\xE0 |0 + \xC3\xE1 |0 + \xC3\xE2 |0 + \xC3\xE3 |0 + \xC3\xE4 |0 + \xC3\xE5 |0 + \xC3\xE6 |0 + \xC3\xE7 |0 + \xC3\xE8 |0 + \xC3\xE9 |0 + \xC3\xEA |0 + \xC3\xEB |0 + \xC3\xEC |0 + \xC3\xED |0 + \xC3\xEE |0 + \xC3\xEF |0 + \xC3\xF0 |0 + \xC3\xF1 |0 + \xC3\xF2 |0 + \xC3\xF3 |0 + \xC3\xF4 |0 + \xC3\xF5 |0 + \xC3\xF6 |0 + \xC3\xF7 |0 + \xC3\xF8 |0 + \xC3\xF9 |0 + \xC3\xFA |0 + \xC3\xFB |0 + \xC3\xFC |0 + \xC3\xFD |0 + \xC3\xFE |0 + \xC4\xA1 |0 + \xC4\xA2 |0 + \xC4\xA3 |0 + \xC4\xA4 |0 + \xC4\xA5 |0 + \xC4\xA6 |0 + \xC4\xA7 |0 + \xC4\xA8 |0 + \xC4\xA9 |0 + \xC4\xAA |0 + \xC4\xAB |0 + \xC4\xAC |0 + \xC4\xAD |0 + \xC4\xAE |0 + \xC4\xAF |0 + \xC4\xB0 |0 + \xC4\xB1 |0 + \xC4\xB2 |0 + \xC4\xB3 |0 + \xC4\xB4 |0 + \xC4\xB5 |0 + \xC4\xB6 |0 + \xC4\xB7 |0 + \xC4\xB8 |0 + \xC4\xB9 |0 + \xC4\xBA |0 + \xC4\xBB |0 + \xC4\xBC |0 + \xC4\xBD |0 + \xC4\xBE |0 + \xC4\xBF |0 + \xC4\xC0 |0 + \xC4\xC1 |0 + \xC4\xC2 |0 + \xC4\xC3 |0 + \xC4\xC4 |0 + \xC4\xC5 |0 + \xC4\xC6 |0 + \xC4\xC7 |0 + \xC4\xC8 |0 + \xC4\xC9 |0 + \xC4\xCA |0 + \xC4\xCB |0 + \xC4\xCC |0 + \xC4\xCD |0 + \xC4\xCE |0 + \xC4\xCF |0 + \xC4\xD0 |0 + \xC4\xD1 |0 + \xC4\xD2 |0 + \xC4\xD3 |0 + \xC4\xD4 |0 + \xC4\xD5 |0 + \xC4\xD6 |0 + \xC4\xD7 |0 + \xC4\xD8 |0 + \xC4\xD9 |0 + \xC4\xDA |0 + \xC4\xDB |0 + \xC4\xDC |0 + \xC4\xDD |0 + \xC4\xDE |0 + \xC4\xDF |0 + \xC4\xE0 |0 + \xC4\xE1 |0 + \xC4\xE2 |0 + \xC4\xE3 |0 + \xC4\xE4 |0 + \xC4\xE5 |0 + \xC4\xE6 |0 + \xC4\xE7 |0 + \xC4\xE8 |0 + \xC4\xE9 |0 + \xC4\xEA |0 + \xC4\xEB |0 + \xC4\xEC |0 + \xC4\xED |0 + \xC4\xEE |0 + \xC4\xEF |0 + \xC4\xF0 |0 + \xC4\xF1 |0 + \xC4\xF2 |0 + \xC4\xF3 |0 + \xC4\xF4 |0 + \xC4\xF5 |0 + \xC4\xF6 |0 + \xC4\xF7 |0 + \xC4\xF8 |0 + \xC4\xF9 |0 + \xC4\xFA |0 + \xC4\xFB |0 + \xC4\xFC |0 + \xC4\xFD |0 + \xC4\xFE |0 + \xC5\xA1 |0 + \xC5\xA2 |0 + \xC5\xA3 |0 + \xC5\xA4 |0 + \xC5\xA5 |0 + \xC5\xA6 |0 + \xC5\xA7 |0 + \xC5\xA8 |0 + \xC5\xA9 |0 + \xC5\xAA |0 + \xC5\xAB |0 + \xC5\xAC |0 + \xC5\xAD |0 + \xC5\xAE |0 + \xC5\xAF |0 + \xC5\xB0 |0 + \xC5\xB1 |0 + \xC5\xB2 |0 + \xC5\xB3 |0 + \xC5\xB4 |0 + \xC5\xB5 |0 + \xC5\xB6 |0 + \xC5\xB7 |0 + \xC5\xB8 |0 + \xC5\xB9 |0 + \xC5\xBA |0 + \xC5\xBB |0 + \xC5\xBC |0 + \xC5\xBD |0 + \xC5\xBE |0 + \xC5\xBF |0 + \xC5\xC0 |0 + \xC5\xC1 |0 + \xC5\xC2 |0 + \xC5\xC3 |0 + \xC5\xC4 |0 + \xC5\xC5 |0 + \xC5\xC6 |0 + \xC5\xC7 |0 + \xC5\xC8 |0 + \xC5\xC9 |0 + \xC5\xCA |0 + \xC5\xCB |0 + \xC5\xCC |0 + \xC5\xCD |0 + \xC5\xCE |0 + \xC5\xCF |0 + \xC5\xD0 |0 + \xC5\xD1 |0 + \xC5\xD2 |0 + \xC5\xD3 |0 + \xC5\xD4 |0 + \xC5\xD5 |0 + \xC5\xD6 |0 + \xC5\xD7 |0 + \xC5\xD8 |0 + \xC5\xD9 |0 + \xC5\xDA |0 + \xC5\xDB |0 + \xC5\xDC |0 + \xC5\xDD |0 + \xC5\xDE |0 + \xC5\xDF |0 + \xC5\xE0 |0 + \xC5\xE1 |0 + \xC5\xE2 |0 + \xC5\xE3 |0 + \xC5\xE4 |0 + \xC5\xE5 |0 + \xC5\xE6 |0 + \xC5\xE7 |0 + \xC5\xE8 |0 + \xC5\xE9 |0 + \xC5\xEA |0 + \xC5\xEB |0 + \xC5\xEC |0 + \xC5\xED |0 + \xC5\xEE |0 + \xC5\xEF |0 + \xC5\xF0 |0 + \xC5\xF1 |0 + \xC5\xF2 |0 + \xC5\xF3 |0 + \xC5\xF4 |0 + \xC5\xF5 |0 + \xC5\xF6 |0 + \xC5\xF7 |0 + \xC5\xF8 |0 + \xC5\xF9 |0 + \xC5\xFA |0 + \xC5\xFB |0 + \xC5\xFC |0 + \xC5\xFD |0 + \xC5\xFE |0 + \xC6\xA1 |0 + \xC6\xA2 |0 + \xC6\xA3 |0 + \xC6\xA4 |0 + \xC6\xA5 |0 + \xC6\xA6 |0 + \xC6\xA7 |0 + \xC6\xA8 |0 + \xC6\xA9 |0 + \xC6\xAA |0 + \xC6\xAB |0 + \xC6\xAC |0 + \xC6\xAD |0 + \xC6\xAE |0 + \xC6\xAF |0 + \xC6\xB0 |0 + \xC6\xB1 |0 + \xC6\xB2 |0 + \xC6\xB3 |0 + \xC6\xB4 |0 + \xC6\xB5 |0 + \xC6\xB6 |0 + \xC6\xB7 |0 + \xC6\xB8 |0 + \xC6\xB9 |0 + \xC6\xBA |0 + \xC6\xBB |0 + \xC6\xBC |0 + \xC6\xBD |0 + \xC6\xBE |0 + \xC6\xBF |0 + \xC6\xC0 |0 + \xC6\xC1 |0 + \xC6\xC2 |0 + \xC6\xC3 |0 + \xC6\xC4 |0 + \xC6\xC5 |0 + \xC6\xC6 |0 + \xC6\xC7 |0 + \xC6\xC8 |0 + \xC6\xC9 |0 + \xC6\xCA |0 + \xC6\xCB |0 + \xC6\xCC |0 + \xC6\xCD |0 + \xC6\xCE |0 + \xC6\xCF |0 + \xC6\xD0 |0 + \xC6\xD1 |0 + \xC6\xD2 |0 + \xC6\xD3 |0 + \xC6\xD4 |0 + \xC6\xD5 |0 + \xC6\xD6 |0 + \xC6\xD7 |0 + \xC6\xD8 |0 + \xC6\xD9 |0 + \xC6\xDA |0 + \xC6\xDB |0 + \xC6\xDC |0 + \xC6\xDD |0 + \xC6\xDE |0 + \xC6\xDF |0 + \xC6\xE0 |0 + \xC6\xE1 |0 + \xC6\xE2 |0 + \xC6\xE3 |0 + \xC6\xE4 |0 + \xC6\xE5 |0 + \xC6\xE6 |0 + \xC6\xE7 |0 + \xC6\xE8 |0 + \xC6\xE9 |0 + \xC6\xEA |0 + \xC6\xEB |0 + \xC6\xEC |0 + \xC6\xED |0 + \xC6\xEE |0 + \xC6\xEF |0 + \xC6\xF0 |0 + \xC6\xF1 |0 + \xC6\xF2 |0 + \xC6\xF3 |0 + \xC6\xF4 |0 + \xC6\xF5 |0 + \xC6\xF6 |0 + \xC6\xF7 |0 + \xC6\xF8 |0 + \xC6\xF9 |0 + \xC6\xFA |0 + \xC6\xFB |0 + \xC6\xFC |0 + \xC6\xFD |0 + \xC6\xFE |0 + \xC7\xA1 |0 + \xC7\xA2 |0 + \xC7\xA3 |0 + \xC7\xA4 |0 + \xC7\xA5 |0 + \xC7\xA6 |0 + \xC7\xA7 |0 + \xC7\xA8 |0 + \xC7\xA9 |0 + \xC7\xAA |0 + \xC7\xAB |0 + \xC7\xAC |0 + \xC7\xAD |0 + \xC7\xAE |0 + \xC7\xAF |0 + \xC7\xB0 |0 + \xC7\xB1 |0 + \xC7\xB2 |0 + \xC7\xB3 |0 + \xC7\xB4 |0 + \xC7\xB5 |0 + \xC7\xB6 |0 + \xC7\xB7 |0 + \xC7\xB8 |0 + \xC7\xB9 |0 + \xC7\xBA |0 + \xC7\xBB |0 + \xC7\xBC |0 + \xC7\xBD |0 + \xC7\xBE |0 + \xC7\xBF |0 + \xC7\xC0 |0 + \xC7\xC1 |0 + \xC7\xC2 |0 + \xC7\xC3 |0 + \xC7\xC4 |0 + \xC7\xC5 |0 + \xC7\xC6 |0 + \xC7\xC7 |0 + \xC7\xC8 |0 + \xC7\xC9 |0 + \xC7\xCA |0 + \xC7\xCB |0 + \xC7\xCC |0 + \xC7\xCD |0 + \xC7\xCE |0 + \xC7\xCF |0 + \xC7\xD0 |0 + \xC7\xD1 |0 + \xC7\xD2 |0 + \xC7\xD3 |0 + \xC7\xD4 |0 + \xC7\xD5 |0 + \xC7\xD6 |0 + \xC7\xD7 |0 + \xC7\xD8 |0 + \xC7\xD9 |0 + \xC7\xDA |0 + \xC7\xDB |0 + \xC7\xDC |0 + \xC7\xDD |0 + \xC7\xDE |0 + \xC7\xDF |0 + \xC7\xE0 |0 + \xC7\xE1 |0 + \xC7\xE2 |0 + \xC7\xE3 |0 + \xC7\xE4 |0 + \xC7\xE5 |0 + \xC7\xE6 |0 + \xC7\xE7 |0 + \xC7\xE8 |0 + \xC7\xE9 |0 + \xC7\xEA |0 + \xC7\xEB |0 + \xC7\xEC |0 + \xC7\xED |0 + \xC7\xEE |0 + \xC7\xEF |0 + \xC7\xF0 |0 + \xC7\xF1 |0 + \xC7\xF2 |0 + \xC7\xF3 |0 + \xC7\xF4 |0 + \xC7\xF5 |0 + \xC7\xF6 |0 + \xC7\xF7 |0 + \xC7\xF8 |0 + \xC7\xF9 |0 + \xC7\xFA |0 + \xC7\xFB |0 + \xC7\xFC |0 + \xC7\xFD |0 + \xC7\xFE |0 + \xC8\xA1 |0 + \xC8\xA2 |0 + \xC8\xA3 |0 + \xC8\xA4 |0 + \xC8\xA5 |0 + \xC8\xA6 |0 + \xC8\xA7 |0 + \xC8\xA8 |0 + \xC8\xA9 |0 + \xC8\xAA |0 + \xC8\xAB |0 + \xC8\xAC |0 + \xC8\xAD |0 + \xC8\xAE |0 + \xC8\xAF |0 + \xC8\xB0 |0 + \xC8\xB1 |0 + \xC8\xB2 |0 + \xC8\xB3 |0 + \xC8\xB4 |0 + \xC8\xB5 |0 + \xC8\xB6 |0 + \xC8\xB7 |0 + \xC8\xB8 |0 + \xC8\xB9 |0 + \xC8\xBA |0 + \xC8\xBB |0 + \xC8\xBC |0 + \xC8\xBD |0 + \xC8\xBE |0 + \xC8\xBF |0 + \xC8\xC0 |0 + \xC8\xC1 |0 + \xC8\xC2 |0 + \xC8\xC3 |0 + \xC8\xC4 |0 + \xC8\xC5 |0 + \xC8\xC6 |0 + \xC8\xC7 |0 + \xC8\xC8 |0 + \xC8\xC9 |0 + \xC8\xCA |0 + \xC8\xCB |0 + \xC8\xCC |0 + \xC8\xCD |0 + \xC8\xCE |0 + \xC8\xCF |0 + \xC8\xD0 |0 + \xC8\xD1 |0 + \xC8\xD2 |0 + \xC8\xD3 |0 + \xC8\xD4 |0 + \xC8\xD5 |0 + \xC8\xD6 |0 + \xC8\xD7 |0 + \xC8\xD8 |0 + \xC8\xD9 |0 + \xC8\xDA |0 + \xC8\xDB |0 + \xC8\xDC |0 + \xC8\xDD |0 + \xC8\xDE |0 + \xC8\xDF |0 + \xC8\xE0 |0 + \xC8\xE1 |0 + \xC8\xE2 |0 + \xC8\xE3 |0 + \xC8\xE4 |0 + \xC8\xE5 |0 + \xC8\xE6 |0 + \xC8\xE7 |0 + \xC8\xE8 |0 + \xC8\xE9 |0 + \xC8\xEA |0 + \xC8\xEB |0 + \xC8\xEC |0 + \xC8\xED |0 + \xC8\xEE |0 + \xC8\xEF |0 + \xC8\xF0 |0 + \xC8\xF1 |0 + \xC8\xF2 |0 + \xC8\xF3 |0 + \xC8\xF4 |0 + \xC8\xF5 |0 + \xC8\xF6 |0 + \xC8\xF7 |0 + \xC8\xF8 |0 + \xC8\xF9 |0 + \xC8\xFA |0 + \xC8\xFB |0 + \xC8\xFC |0 + \xC8\xFD |0 + \xC8\xFE |0 + \xC9\xA1 |0 + \xC9\xA2 |0 + \xC9\xA3 |0 + \xC9\xA4 |0 + \xC9\xA5 |0 + \xC9\xA6 |0 + \xC9\xA7 |0 + \xC9\xA8 |0 + \xC9\xA9 |0 + \xC9\xAA |0 + \xC9\xAB |0 + \xC9\xAC |0 + \xC9\xAD |0 + \xC9\xAE |0 + \xC9\xAF |0 + \xC9\xB0 |0 + \xC9\xB1 |0 + \xC9\xB2 |0 + \xC9\xB3 |0 + \xC9\xB4 |0 + \xC9\xB5 |0 + \xC9\xB6 |0 + \xC9\xB7 |0 + \xC9\xB8 |0 + \xC9\xB9 |0 + \xC9\xBA |0 + \xC9\xBB |0 + \xC9\xBC |0 + \xC9\xBD |0 + \xC9\xBE |0 + \xC9\xBF |0 + \xC9\xC0 |0 + \xC9\xC1 |0 + \xC9\xC2 |0 + \xC9\xC3 |0 + \xC9\xC4 |0 + \xC9\xC5 |0 + \xC9\xC6 |0 + \xC9\xC7 |0 + \xC9\xC8 |0 + \xC9\xC9 |0 + \xC9\xCA |0 + \xC9\xCB |0 + \xC9\xCC |0 + \xC9\xCD |0 + \xC9\xCE |0 + \xC9\xCF |0 + \xC9\xD0 |0 + \xC9\xD1 |0 + \xC9\xD2 |0 + \xC9\xD3 |0 + \xC9\xD4 |0 + \xC9\xD5 |0 + \xC9\xD6 |0 + \xC9\xD7 |0 + \xC9\xD8 |0 + \xC9\xD9 |0 + \xC9\xDA |0 + \xC9\xDB |0 + \xC9\xDC |0 + \xC9\xDD |0 + \xC9\xDE |0 + \xC9\xDF |0 + \xC9\xE0 |0 + \xC9\xE1 |0 + \xC9\xE2 |0 + \xC9\xE3 |0 + \xC9\xE4 |0 + \xC9\xE5 |0 + \xC9\xE6 |0 + \xC9\xE7 |0 + \xC9\xE8 |0 + \xC9\xE9 |0 + \xC9\xEA |0 + \xC9\xEB |0 + \xC9\xEC |0 + \xC9\xED |0 + \xC9\xEE |0 + \xC9\xEF |0 + \xC9\xF0 |0 + \xC9\xF1 |0 + \xC9\xF2 |0 + \xC9\xF3 |0 + \xC9\xF4 |0 + \xC9\xF5 |0 + \xC9\xF6 |0 + \xC9\xF7 |0 + \xC9\xF8 |0 + \xC9\xF9 |0 + \xC9\xFA |0 + \xC9\xFB |0 + \xC9\xFC |0 + \xC9\xFD |0 + \xC9\xFE |0 + \xFE\xA1 |0 + \xFE\xA2 |0 + \xFE\xA3 |0 + \xFE\xA4 |0 + \xFE\xA5 |0 + \xFE\xA6 |0 + \xFE\xA7 |0 + \xFE\xA8 |0 + \xFE\xA9 |0 + \xFE\xAA |0 + \xFE\xAB |0 + \xFE\xAC |0 + \xFE\xAD |0 + \xFE\xAE |0 + \xFE\xAF |0 + \xFE\xB0 |0 + \xFE\xB1 |0 + \xFE\xB2 |0 + \xFE\xB3 |0 + \xFE\xB4 |0 + \xFE\xB5 |0 + \xFE\xB6 |0 + \xFE\xB7 |0 + \xFE\xB8 |0 + \xFE\xB9 |0 + \xFE\xBA |0 + \xFE\xBB |0 + \xFE\xBC |0 + \xFE\xBD |0 + \xFE\xBE |0 + \xFE\xBF |0 + \xFE\xC0 |0 + \xFE\xC1 |0 + \xFE\xC2 |0 + \xFE\xC3 |0 + \xFE\xC4 |0 + \xFE\xC5 |0 + \xFE\xC6 |0 + \xFE\xC7 |0 + \xFE\xC8 |0 + \xFE\xC9 |0 + \xFE\xCA |0 + \xFE\xCB |0 + \xFE\xCC |0 + \xFE\xCD |0 + \xFE\xCE |0 + \xFE\xCF |0 + \xFE\xD0 |0 + \xFE\xD1 |0 + \xFE\xD2 |0 + \xFE\xD3 |0 + \xFE\xD4 |0 + \xFE\xD5 |0 + \xFE\xD6 |0 + \xFE\xD7 |0 + \xFE\xD8 |0 + \xFE\xD9 |0 + \xFE\xDA |0 + \xFE\xDB |0 + \xFE\xDC |0 + \xFE\xDD |0 + \xFE\xDE |0 + \xFE\xDF |0 + \xFE\xE0 |0 + \xFE\xE1 |0 + \xFE\xE2 |0 + \xFE\xE3 |0 + \xFE\xE4 |0 + \xFE\xE5 |0 + \xFE\xE6 |0 + \xFE\xE7 |0 + \xFE\xE8 |0 + \xFE\xE9 |0 + \xFE\xEA |0 + \xFE\xEB |0 + \xFE\xEC |0 + \xFE\xED |0 + \xFE\xEE |0 + \xFE\xEF |0 + \xFE\xF0 |0 + \xFE\xF1 |0 + \xFE\xF2 |0 + \xFE\xF3 |0 + \xFE\xF4 |0 + \xFE\xF5 |0 + \xFE\xF6 |0 + \xFE\xF7 |0 + \xFE\xF8 |0 + \xFE\xF9 |0 + \xFE\xFA |0 + \xFE\xFB |0 + \xFE\xFC |0 + \xFE\xFD |0 + \xFE\xFE |0 + \xCB\xD0 |0 + \xCB\xD6 |0 + \xCB\xE7 |0 + \xCD\xCF |0 + \xCD\xE8 |0 + \xCE\xAD |0 + \xCF\xFB |0 + \xD0\xA2 |0 + \xD0\xB8 |0 + \xD0\xD0 |0 + \xD0\xDD |0 + \xD1\xD4 |0 + \xD1\xD5 |0 + \xD1\xD8 |0 + \xD1\xDB |0 + \xD1\xDC |0 + \xD1\xDD |0 + \xD1\xDE |0 + \xD1\xDF |0 + \xD1\xE0 |0 + \xD1\xE2 |0 + \xD1\xE3 |0 + \xD1\xE4 |0 + \xD1\xE5 |0 + \xD1\xE6 |0 + \xD1\xE8 |0 + \xD1\xE9 |0 + \xD1\xEA |0 + \xD1\xEB |0 + \xD1\xED |0 + \xD1\xEF |0 + \xD1\xF0 |0 + \xD1\xF2 |0 + \xD1\xF6 |0 + \xD1\xFA |0 + \xD1\xFC |0 + \xD1\xFD |0 + \xD1\xFE |0 + \xD2\xA2 |0 + \xD2\xA3 |0 + \xD2\xA7 |0 + \xD2\xA8 |0 + \xD2\xA9 |0 + \xD2\xAA |0 + \xD2\xAB |0 + \xD2\xAD |0 + \xD2\xB2 |0 + \xD2\xBE |0 + \xD2\xC2 |0 + \xD2\xC3 |0 + \xD2\xC4 |0 + \xD2\xC6 |0 + \xD2\xC7 |0 + \xD2\xC8 |0 + \xD2\xC9 |0 + \xD2\xCA |0 + \xD2\xCB |0 + \xD2\xCD |0 + \xD2\xCE |0 + \xD2\xCF |0 + \xD2\xD0 |0 + \xD2\xD1 |0 + \xD2\xD2 |0 + \xD2\xD3 |0 + \xD2\xD4 |0 + \xD2\xD5 |0 + \xD2\xD6 |0 + \xD2\xD7 |0 + \xD2\xD9 |0 + \xD2\xDA |0 + \xD2\xDE |0 + \xD2\xDF |0 + \xD2\xE1 |0 + \xD2\xE2 |0 + \xD2\xE4 |0 + \xD2\xE5 |0 + \xD2\xE6 |0 + \xD2\xE7 |0 + \xD2\xE8 |0 + \xD2\xE9 |0 + \xD2\xEA |0 + \xD2\xEB |0 + \xD2\xF0 |0 + \xD2\xF1 |0 + \xD2\xF2 |0 + \xD2\xF3 |0 + \xD2\xF4 |0 + \xD2\xF5 |0 + \xD2\xF7 |0 + \xD2\xF8 |0 + \xD4\xE6 |0 + \xD4\xFC |0 + \xD5\xA5 |0 + \xD5\xAB |0 + \xD5\xAE |0 + \xD6\xB8 |0 + \xD6\xCD |0 + \xD7\xCB |0 + \xD7\xE4 |0 + \xDB\xC5 |0 + \xDB\xE4 |0 + \xDC\xA5 |0 + \xDD\xA5 |0 + \xDD\xD5 |0 + \xDD\xF4 |0 + \xDE\xFC |0 + \xDE\xFE |0 + \xDF\xB3 |0 + \xDF\xE1 |0 + \xDF\xE8 |0 + \xE0\xF1 |0 + \xE1\xAD |0 + \xE1\xED |0 + \xE3\xF5 |0 + \xE4\xA1 |0 + \xE4\xA9 |0 + \xE5\xAE |0 + \xE5\xB1 |0 + \xE5\xB2 |0 + \xE5\xB9 |0 + \xE5\xBB |0 + \xE5\xBC |0 + \xE5\xC4 |0 + \xE5\xCE |0 + \xE5\xD0 |0 + \xE5\xD2 |0 + \xE5\xD6 |0 + \xE5\xFA |0 + \xE5\xFB |0 + \xE5\xFC |0 + \xE5\xFE |0 + \xE6\xA1 |0 + \xE6\xA4 |0 + \xE6\xA7 |0 + \xE6\xAD |0 + \xE6\xAF |0 + \xE6\xB0 |0 + \xE6\xB1 |0 + \xE6\xB3 |0 + \xE6\xB7 |0 + \xE6\xB8 |0 + \xE6\xBC |0 + \xE6\xC4 |0 + \xE6\xC6 |0 + \xE6\xC7 |0 + \xE6\xCA |0 + \xE6\xD2 |0 + \xE6\xD6 |0 + \xE6\xD9 |0 + \xE6\xDC |0 + \xE6\xDF |0 + \xE6\xE1 |0 + \xE6\xE4 |0 + \xE6\xE5 |0 + \xE6\xE6 |0 + \xE6\xE8 |0 + \xE6\xEA |0 + \xE6\xEB |0 + \xE6\xEC |0 + \xE6\xEF |0 + \xE6\xF1 |0 + \xE6\xF2 |0 + \xE6\xF5 |0 + \xE6\xF6 |0 + \xE6\xF7 |0 + \xE6\xF9 |0 + \xE7\xA1 |0 + \xE7\xA6 |0 + \xE7\xA9 |0 + \xE7\xAA |0 + \xE7\xAC |0 + \xE7\xAD |0 + \xE7\xB0 |0 + \xE7\xBF |0 + \xE7\xC1 |0 + \xE7\xC6 |0 + \xE7\xC7 |0 + \xE7\xCB |0 + \xE7\xCD |0 + \xE7\xCF |0 + \xE7\xD0 |0 + \xE7\xD3 |0 + \xE7\xDF |0 + \xE7\xE4 |0 + \xE7\xE6 |0 + \xE7\xF7 |0 + \xE8\xE7 |0 + \xE8\xE8 |0 + \xE8\xF0 |0 + \xE8\xF1 |0 + \xE8\xF7 |0 + \xE8\xF9 |0 + \xE8\xFB |0 + \xE8\xFE |0 + \xE9\xA7 |0 + \xE9\xAC |0 + \xE9\xCC |0 + \xE9\xF7 |0 + \xEA\xC1 |0 + \xEA\xE5 |0 + \xEA\xF4 |0 + \xEA\xF7 |0 + \xEA\xFC |0 + \xEA\xFE |0 + \xEB\xA4 |0 + \xEB\xA7 |0 + \xEB\xA9 |0 + \xEB\xAA |0 + \xEB\xBA |0 + \xEB\xBB |0 + \xEB\xBD |0 + \xEB\xC1 |0 + \xEB\xC2 |0 + \xEB\xC6 |0 + \xEB\xC7 |0 + \xEB\xCC |0 + \xEB\xCF |0 + \xEB\xD0 |0 + \xEB\xD1 |0 + \xEB\xD2 |0 + \xEB\xD8 |0 + \xEC\xA6 |0 + \xEC\xA7 |0 + \xEC\xAA |0 + \xEC\xAF |0 + \xEC\xB0 |0 + \xEC\xB1 |0 + \xEC\xB2 |0 + \xEC\xB5 |0 + \xEC\xB8 |0 + \xEC\xBA |0 + \xEC\xC0 |0 + \xEC\xC1 |0 + \xEC\xC5 |0 + \xEC\xC6 |0 + \xEC\xC9 |0 + \xEC\xCA |0 + \xEC\xD5 |0 + \xEC\xDD |0 + \xEC\xDE |0 + \xEC\xE1 |0 + \xEC\xE4 |0 + \xEC\xE7 |0 + \xEC\xE8 |0 + \xEC\xF7 |0 + \xEC\xF8 |0 + \xEC\xFA |0 + \xED\xA1 |0 + \xED\xA2 |0 + \xED\xA3 |0 + \xED\xEE |0 + \xEE\xDB |0 + \xF2\xBD |0 + \xF2\xFA |0 + \xF3\xB1 |0 + \xF4\xA7 |0 + \xF4\xEE |0 + \xF6\xF4 |0 + \xF6\xF6 |0 + \xF7\xB8 |0 + \xF7\xC8 |0 + \xF7\xD3 |0 + \xF8\xDB |0 + \xF8\xF0 |0 + \xFA\xA1 |0 + \xFA\xA2 |0 + \xFA\xE6 |0 + \xFC\xA9 |0 + \xA3\xA1 |0 + \xA3\xA2 |0 + \xA3\xA3 |0 + \xA3\xA4 |0 + \xA3\xA5 |0 + \xA3\xA6 |0 + \xA3\xA7 |0 + \xA3\xA8 |0 + \xA3\xA9 |0 + \xA3\xAA |0 + \xA3\xAB |0 + \xA3\xAC |0 + \xA3\xAD |0 + \xA3\xAE |0 + \xA3\xAF |0 + \xA3\xB0 |0 + \xA3\xB1 |0 + \xA3\xB2 |0 + \xA3\xB3 |0 + \xA3\xB4 |0 + \xA3\xB5 |0 + \xA3\xB6 |0 + \xA3\xB7 |0 + \xA3\xB8 |0 + \xA3\xB9 |0 + \xA3\xBA |0 + \xA3\xBB |0 + \xA3\xBC |0 + \xA3\xBD |0 + \xA3\xBE |0 + \xA3\xBF |0 + \xA3\xC0 |0 + \xA3\xC1 |0 + \xA3\xC2 |0 + \xA3\xC3 |0 + \xA3\xC4 |0 + \xA3\xC5 |0 + \xA3\xC6 |0 + \xA3\xC7 |0 + \xA3\xC8 |0 + \xA3\xC9 |0 + \xA3\xCA |0 + \xA3\xCB |0 + \xA3\xCC |0 + \xA3\xCD |0 + \xA3\xCE |0 + \xA3\xCF |0 + \xA3\xD0 |0 + \xA3\xD1 |0 + \xA3\xD2 |0 + \xA3\xD3 |0 + \xA3\xD4 |0 + \xA3\xD5 |0 + \xA3\xD6 |0 + \xA3\xD7 |0 + \xA3\xD8 |0 + \xA3\xD9 |0 + \xA3\xDA |0 + \xA3\xDB |0 + \xA1\xAC |0 + \xA3\xDD |0 + \xA3\xDE |0 + \xA3\xDF |0 + \xA3\xE0 |0 + \xA3\xE1 |0 + \xA3\xE2 |0 + \xA3\xE3 |0 + \xA3\xE4 |0 + \xA3\xE5 |0 + \xA3\xE6 |0 + \xA3\xE7 |0 + \xA3\xE8 |0 + \xA3\xE9 |0 + \xA3\xEA |0 + \xA3\xEB |0 + \xA3\xEC |0 + \xA3\xED |0 + \xA3\xEE |0 + \xA3\xEF |0 + \xA3\xF0 |0 + \xA3\xF1 |0 + \xA3\xF2 |0 + \xA3\xF3 |0 + \xA3\xF4 |0 + \xA3\xF5 |0 + \xA3\xF6 |0 + \xA3\xF7 |0 + \xA3\xF8 |0 + \xA3\xF9 |0 + \xA3\xFA |0 + \xA3\xFB |0 + \xA3\xFC |0 + \xA3\xFD |0 + \xA1\xCB |0 + \xA1\xCC |0 + \xA1\xFE |0 + \xA3\xFE |0 + \xA1\xCD |0 + \xA3\xDC |0 +END CHARMAP diff --git a/icuSources/data/mappings/iso-8859_10-1998.ucm b/icuSources/data/mappings/iso-8859_10-1998.ucm new file mode 100644 index 00000000..4c607ec5 --- /dev/null +++ b/icuSources/data/mappings/iso-8859_10-1998.ucm @@ -0,0 +1,305 @@ +# +# Name: ISO/IEC 8859-10:1998 to Unicode +# Unicode version: 3.0 +# Table version: 1.1 +# Table format: Format A +# Date: 1999 October 11 +# Authors: Ken Whistler +# +# Copyright (c) 1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-10:1998 characters map into Unicode. +# +# Format: The ICU UCM format +# +# Version history +# 1.0 version new. +# 1.1 corrected mistake in mapping of 0xA4 +# +# Updated versions of this file may be found in: +# +# +# Any comments or problems, contact +# Please note that is an archival address; +# notices will be checked, but do not expect an immediate response. +# + "iso-8859_10-1998" + 1 + 1 + "SBCS" + \x1A +CHARMAP + \x00 |0 + \x01 |0 + \x02 |0 + \x03 |0 + \x04 |0 + \x05 |0 + \x06 |0 + \x07 |0 + \x08 |0 + \x09 |0 + \x0A |0 + \x0B |0 + \x0C |0 + \x0D |0 + \x0E |0 + \x0F |0 + \x10 |0 + \x11 |0 + \x12 |0 + \x13 |0 + \x14 |0 + \x15 |0 + \x16 |0 + \x17 |0 + \x18 |0 + \x19 |0 + \x1A |0 + \x1B |0 + \x1C |0 + \x1D |0 + \x1E |0 + \x1F |0 + \x20 |0 + \x21 |0 + \x22 |0 + \x23 |0 + \x24 |0 + \x25 |0 + \x26 |0 + \x27 |0 + \x28 |0 + \x29 |0 + \x2A |0 + \x2B |0 + \x2C |0 + \x2D |0 + \x2E |0 + \x2F |0 + \x30 |0 + \x31 |0 + \x32 |0 + \x33 |0 + \x34 |0 + \x35 |0 + \x36 |0 + \x37 |0 + \x38 |0 + \x39 |0 + \x3A |0 + \x3B |0 + \x3C |0 + \x3D |0 + \x3E |0 + \x3F |0 + \x40 |0 + \x41 |0 + \x42 |0 + \x43 |0 + \x44 |0 + \x45 |0 + \x46 |0 + \x47 |0 + \x48 |0 + \x49 |0 + \x4A |0 + \x4B |0 + \x4C |0 + \x4D |0 + \x4E |0 + \x4F |0 + \x50 |0 + \x51 |0 + \x52 |0 + \x53 |0 + \x54 |0 + \x55 |0 + \x56 |0 + \x57 |0 + \x58 |0 + \x59 |0 + \x5A |0 + \x5B |0 + \x5C |0 + \x5D |0 + \x5E |0 + \x5F |0 + \x60 |0 + \x61 |0 + \x62 |0 + \x63 |0 + \x64 |0 + \x65 |0 + \x66 |0 + \x67 |0 + \x68 |0 + \x69 |0 + \x6A |0 + \x6B |0 + \x6C |0 + \x6D |0 + \x6E |0 + \x6F |0 + \x70 |0 + \x71 |0 + \x72 |0 + \x73 |0 + \x74 |0 + \x75 |0 + \x76 |0 + \x77 |0 + \x78 |0 + \x79 |0 + \x7A |0 + \x7B |0 + \x7C |0 + \x7D |0 + \x7E |0 + \x7F |0 + \x80 |0 + \x81 |0 + \x82 |0 + \x83 |0 + \x84 |0 + \x85 |0 + \x86 |0 + \x87 |0 + \x88 |0 + \x89 |0 + \x8A |0 + \x8B |0 + \x8C |0 + \x8D |0 + \x8E |0 + \x8F |0 + \x90 |0 + \x91 |0 + \x92 |0 + \x93 |0 + \x94 |0 + \x95 |0 + \x96 |0 + \x97 |0 + \x98 |0 + \x99 |0 + \x9A |0 + \x9B |0 + \x9C |0 + \x9D |0 + \x9E |0 + \x9F |0 + \xA0 |0 + \xA7 |0 + \xAD |0 + \xB0 |0 + \xB7 |0 + \xC1 |0 + \xC2 |0 + \xC3 |0 + \xC4 |0 + \xC5 |0 + \xC6 |0 + \xC9 |0 + \xCB |0 + \xCD |0 + \xCE |0 + \xCF |0 + \xD0 |0 + \xD3 |0 + \xD4 |0 + \xD5 |0 + \xD6 |0 + \xD8 |0 + \xDA |0 + \xDB |0 + \xDC |0 + \xDD |0 + \xDE |0 + \xDF |0 + \xE1 |0 + \xE2 |0 + \xE3 |0 + \xE4 |0 + \xE5 |0 + \xE6 |0 + \xE9 |0 + \xEB |0 + \xED |0 + \xEE |0 + \xEF |0 + \xF0 |0 + \xF3 |0 + \xF4 |0 + \xF5 |0 + \xF6 |0 + \xF8 |0 + \xFA |0 + \xFB |0 + \xFC |0 + \xFD |0 + \xFE |0 + \xC0 |0 + \xE0 |0 + \xA1 |0 + \xB1 |0 + \xC8 |0 + \xE8 |0 + \xA9 |0 + \xB9 |0 + \xA2 |0 + \xB2 |0 + \xCC |0 + \xEC |0 + \xCA |0 + \xEA |0 + \xA3 |0 + \xB3 |0 + \xA5 |0 + \xB5 |0 + \xA4 |0 + \xB4 |0 + \xC7 |0 + \xE7 |0 + \xA6 |0 + \xB6 |0 + \xFF |0 + \xA8 |0 + \xB8 |0 + \xD1 |0 + \xF1 |0 + \xAF |0 + \xBF |0 + \xD2 |0 + \xF2 |0 + \xAA |0 + \xBA |0 + \xAB |0 + \xBB |0 + \xD7 |0 + \xF7 |0 + \xAE |0 + \xBE |0 + \xD9 |0 + \xF9 |0 + \xAC |0 + \xBC |0 + \xBD |0 +END CHARMAP diff --git a/icuSources/data/mappings/iso-8859_16-2001.ucm b/icuSources/data/mappings/iso-8859_16-2001.ucm new file mode 100644 index 00000000..cea5d837 --- /dev/null +++ b/icuSources/data/mappings/iso-8859_16-2001.ucm @@ -0,0 +1,301 @@ +# +# Name: ISO/IEC 8859-16:2001 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 2001 July 26 +# Authors: Markus Kuhn +# +# Copyright (c) 1999-2001 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-16:2001 characters map into Unicode. +# +# Format: The ICU UCM format +# +# Updated versions of this file may be found in: +# +# +# Any comments or problems, contact +# Please note that is an archival address; +# notices will be checked, but do not expect an immediate response. +# + "iso-8859_16-2001" + 1 + 1 + "SBCS" + \x1A +CHARMAP + \x00 |0 + \x01 |0 + \x02 |0 + \x03 |0 + \x04 |0 + \x05 |0 + \x06 |0 + \x07 |0 + \x08 |0 + \x09 |0 + \x0A |0 + \x0B |0 + \x0C |0 + \x0D |0 + \x0E |0 + \x0F |0 + \x10 |0 + \x11 |0 + \x12 |0 + \x13 |0 + \x14 |0 + \x15 |0 + \x16 |0 + \x17 |0 + \x18 |0 + \x19 |0 + \x1A |0 + \x1B |0 + \x1C |0 + \x1D |0 + \x1E |0 + \x1F |0 + \x20 |0 + \x21 |0 + \x22 |0 + \x23 |0 + \x24 |0 + \x25 |0 + \x26 |0 + \x27 |0 + \x28 |0 + \x29 |0 + \x2A |0 + \x2B |0 + \x2C |0 + \x2D |0 + \x2E |0 + \x2F |0 + \x30 |0 + \x31 |0 + \x32 |0 + \x33 |0 + \x34 |0 + \x35 |0 + \x36 |0 + \x37 |0 + \x38 |0 + \x39 |0 + \x3A |0 + \x3B |0 + \x3C |0 + \x3D |0 + \x3E |0 + \x3F |0 + \x40 |0 + \x41 |0 + \x42 |0 + \x43 |0 + \x44 |0 + \x45 |0 + \x46 |0 + \x47 |0 + \x48 |0 + \x49 |0 + \x4A |0 + \x4B |0 + \x4C |0 + \x4D |0 + \x4E |0 + \x4F |0 + \x50 |0 + \x51 |0 + \x52 |0 + \x53 |0 + \x54 |0 + \x55 |0 + \x56 |0 + \x57 |0 + \x58 |0 + \x59 |0 + \x5A |0 + \x5B |0 + \x5C |0 + \x5D |0 + \x5E |0 + \x5F |0 + \x60 |0 + \x61 |0 + \x62 |0 + \x63 |0 + \x64 |0 + \x65 |0 + \x66 |0 + \x67 |0 + \x68 |0 + \x69 |0 + \x6A |0 + \x6B |0 + \x6C |0 + \x6D |0 + \x6E |0 + \x6F |0 + \x70 |0 + \x71 |0 + \x72 |0 + \x73 |0 + \x74 |0 + \x75 |0 + \x76 |0 + \x77 |0 + \x78 |0 + \x79 |0 + \x7A |0 + \x7B |0 + \x7C |0 + \x7D |0 + \x7E |0 + \x7F |0 + \x80 |0 + \x81 |0 + \x82 |0 + \x83 |0 + \x84 |0 + \x85 |0 + \x86 |0 + \x87 |0 + \x88 |0 + \x89 |0 + \x8A |0 + \x8B |0 + \x8C |0 + \x8D |0 + \x8E |0 + \x8F |0 + \x90 |0 + \x91 |0 + \x92 |0 + \x93 |0 + \x94 |0 + \x95 |0 + \x96 |0 + \x97 |0 + \x98 |0 + \x99 |0 + \x9A |0 + \x9B |0 + \x9C |0 + \x9D |0 + \x9E |0 + \x9F |0 + \xA0 |0 + \xA7 |0 + \xA9 |0 + \xAB |0 + \xAD |0 + \xB0 |0 + \xB1 |0 + \xB6 |0 + \xB7 |0 + \xBB |0 + \xC0 |0 + \xC1 |0 + \xC2 |0 + \xC4 |0 + \xC6 |0 + \xC7 |0 + \xC8 |0 + \xC9 |0 + \xCA |0 + \xCB |0 + \xCC |0 + \xCD |0 + \xCE |0 + \xCF |0 + \xD2 |0 + \xD3 |0 + \xD4 |0 + \xD6 |0 + \xD9 |0 + \xDA |0 + \xDB |0 + \xDC |0 + \xDF |0 + \xE0 |0 + \xE1 |0 + \xE2 |0 + \xE4 |0 + \xE6 |0 + \xE7 |0 + \xE8 |0 + \xE9 |0 + \xEA |0 + \xEB |0 + \xEC |0 + \xED |0 + \xEE |0 + \xEF |0 + \xF2 |0 + \xF3 |0 + \xF4 |0 + \xF6 |0 + \xF9 |0 + \xFA |0 + \xFB |0 + \xFC |0 + \xFF |0 + \xC3 |0 + \xE3 |0 + \xA1 |0 + \xA2 |0 + \xC5 |0 + \xE5 |0 + \xB2 |0 + \xB9 |0 + \xD0 |0 + \xF0 |0 + \xDD |0 + \xFD |0 + \xA3 |0 + \xB3 |0 + \xD1 |0 + \xF1 |0 + \xD5 |0 + \xF5 |0 + \xBC |0 + \xBD |0 + \xD7 |0 + \xF7 |0 + \xA6 |0 + \xA8 |0 + \xD8 |0 + \xF8 |0 + \xBE |0 + \xAC |0 + \xAE |0 + \xAF |0 + \xBF |0 + \xB4 |0 + \xB8 |0 + \xAA |0 + \xBA |0 + \xDE |0 + \xFE |0 + \xB5 |0 + \xA5 |0 + \xA4 |0 +END CHARMAP diff --git a/icuSources/data/mappings/jisx-201.ucm b/icuSources/data/mappings/jisx-201.ucm deleted file mode 100644 index 3c682d32..00000000 --- a/icuSources/data/mappings/jisx-201.ucm +++ /dev/null @@ -1,229 +0,0 @@ -# ******************************************************************************* -# * -# * Copyright (C) 1997-2001, International Business Machines -# * Corporation and others. All Rights Reserved. -# * -# ******************************************************************************* -# -# Name: JIS X 0201 to Unicode -# Unicode version: 1.1 -# Table version: 0.9 -# -# Authors: Raghuram Viswanadha -# Date: 8/20/2000 -# General Notes: -# This file is created from JISX 208 -# mapping table from Unicode Consortium -# (www.unicode.org). -# Original authors: -# Glenn Adams -# John H. Jenkins -# -# - - "JISX-201" - "AXXXX" - 1 - 1 - "SBCS" - \x3F -# -CHARMAP -# -# -#10646 JISX201 -#______ _____ - \x00 |0 - \x01 |0 - \x02 |0 - \x03 |0 - \x04 |0 - \x05 |0 - \x06 |0 - \x07 |0 - \x08 |0 - \x09 |0 - \x0A |0 - \x0B |0 - \x0C |0 - \x0D |0 - \x0E |0 - \x0F |0 - \x10 |0 - \x11 |0 - \x12 |0 - \x13 |0 - \x14 |0 - \x15 |0 - \x16 |0 - \x17 |0 - \x18 |0 - \x19 |0 - \x1A |0 - \x1B |0 - \x1C |0 - \x1D |0 - \x1E |0 - \x1F |0 - \x20 #|0 SPACE - \x21 #|0 EXCLAMATION MARK - \x22 #|0 QUOTATION MARK - \x23 #|0 NUMBER SIGN - \x24 #|0 DOLLAR SIGN - \x25 #|0 PERCENT SIGN - \x26 #|0 AMPERSAND - \x27 #|0 APOSTROPHE - \x28 #|0 LEFT PARENTHESIS - \x29 #|0 RIGHT PARENTHESIS - \x2A #|0 ASTERISK - \x2B #|0 PLUS SIGN - \x2C #|0 COMMA - \x2D #|0 HYPHEN-MINUS - \x2E #|0 FULL STOP - \x2F #|0 SOLIDUS - \x30 #|0 DIGIT ZERO - \x31 #|0 DIGIT ONE - \x32 #|0 DIGIT TWO - \x33 #|0 DIGIT THREE - \x34 #|0 DIGIT FOUR - \x35 #|0 DIGIT FIVE - \x36 #|0 DIGIT SIX - \x37 #|0 DIGIT SEVEN - \x38 #|0 DIGIT EIGHT - \x39 #|0 DIGIT NINE - \x3A #|0 COLON - \x3B #|0 SEMICOLON - \x3C #|0 LESS-THAN SIGN - \x3D #|0 EQUALS SIGN - \x3E #|0 GREATER-THAN SIGN - \x3F #|0 QUESTION MARK - \x40 #|0 COMMERCIAL AT - \x41 #|0 LATIN CAPITAL LETTER A - \x42 #|0 LATIN CAPITAL LETTER B - \x43 #|0 LATIN CAPITAL LETTER C - \x44 #|0 LATIN CAPITAL LETTER D - \x45 #|0 LATIN CAPITAL LETTER E - \x46 #|0 LATIN CAPITAL LETTER F - \x47 #|0 LATIN CAPITAL LETTER G - \x48 #|0 LATIN CAPITAL LETTER H - \x49 #|0 LATIN CAPITAL LETTER I - \x4A #|0 LATIN CAPITAL LETTER J - \x4B #|0 LATIN CAPITAL LETTER K - \x4C #|0 LATIN CAPITAL LETTER L - \x4D #|0 LATIN CAPITAL LETTER M - \x4E #|0 LATIN CAPITAL LETTER N - \x4F #|0 LATIN CAPITAL LETTER O - \x50 #|0 LATIN CAPITAL LETTER P - \x51 #|0 LATIN CAPITAL LETTER Q - \x52 #|0 LATIN CAPITAL LETTER R - \x53 #|0 LATIN CAPITAL LETTER S - \x54 #|0 LATIN CAPITAL LETTER T - \x55 #|0 LATIN CAPITAL LETTER U - \x56 #|0 LATIN CAPITAL LETTER V - \x57 #|0 LATIN CAPITAL LETTER W - \x58 #|0 LATIN CAPITAL LETTER X - \x59 #|0 LATIN CAPITAL LETTER Y - \x5A #|0 LATIN CAPITAL LETTER Z - \x5B #|0 LEFT SQUARE BRACKET - \x5C #|0 YEN SIGN - \x5D #|0 RIGHT SQUARE BRACKET - \x5E #|0 CIRCUMFLEX ACCENT - \x5F #|0 LOW LINE - \x60 #|0 GRAVE ACCENT - \x61 #|0 LATIN SMALL LETTER A - \x62 #|0 LATIN SMALL LETTER B - \x63 #|0 LATIN SMALL LETTER C - \x64 #|0 LATIN SMALL LETTER D - \x65 #|0 LATIN SMALL LETTER E - \x66 #|0 LATIN SMALL LETTER F - \x67 #|0 LATIN SMALL LETTER G - \x68 #|0 LATIN SMALL LETTER H - \x69 #|0 LATIN SMALL LETTER I - \x6A #|0 LATIN SMALL LETTER J - \x6B #|0 LATIN SMALL LETTER K - \x6C #|0 LATIN SMALL LETTER L - \x6D #|0 LATIN SMALL LETTER M - \x6E #|0 LATIN SMALL LETTER N - \x6F #|0 LATIN SMALL LETTER O - \x70 #|0 LATIN SMALL LETTER P - \x71 #|0 LATIN SMALL LETTER Q - \x72 #|0 LATIN SMALL LETTER R - \x73 #|0 LATIN SMALL LETTER S - \x74 #|0 LATIN SMALL LETTER T - \x75 #|0 LATIN SMALL LETTER U - \x76 #|0 LATIN SMALL LETTER V - \x77 #|0 LATIN SMALL LETTER W - \x78 #|0 LATIN SMALL LETTER X - \x79 #|0 LATIN SMALL LETTER Y - \x7A #|0 LATIN SMALL LETTER Z - \x7B #|0 LEFT CURLY BRACKET - \x7C #|0 VERTICAL LINE - \x7D #|0 RIGHT CURLY BRACKET - \x7E #|0 OVERLINE - \xA1 #|0 HALFWIDTH IDEOGRAPHIC FULL STOP - \xA2 #|0 HALFWIDTH LEFT CORNER BRACKET - \xA3 #|0 HALFWIDTH RIGHT CORNER BRACKET - \xA4 #|0 HALFWIDTH IDEOGRAPHIC COMMA - \xA5 #|0 HALFWIDTH KATAKANA MIDDLE DOT - \xA6 #|0 HALFWIDTH KATAKANA LETTER WO - \xA7 #|0 HALFWIDTH KATAKANA LETTER SMALL A - \xA8 #|0 HALFWIDTH KATAKANA LETTER SMALL I - \xA9 #|0 HALFWIDTH KATAKANA LETTER SMALL U - \xAA #|0 HALFWIDTH KATAKANA LETTER SMALL E - \xAB #|0 HALFWIDTH KATAKANA LETTER SMALL O - \xAC #|0 HALFWIDTH KATAKANA LETTER SMALL YA - \xAD #|0 HALFWIDTH KATAKANA LETTER SMALL YU - \xAE #|0 HALFWIDTH KATAKANA LETTER SMALL YO - \xAF #|0 HALFWIDTH KATAKANA LETTER SMALL TU - \xB0 #|0 HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK - \xB1 #|0 HALFWIDTH KATAKANA LETTER A - \xB2 #|0 HALFWIDTH KATAKANA LETTER I - \xB3 #|0 HALFWIDTH KATAKANA LETTER U - \xB4 #|0 HALFWIDTH KATAKANA LETTER E - \xB5 #|0 HALFWIDTH KATAKANA LETTER O - \xB6 #|0 HALFWIDTH KATAKANA LETTER KA - \xB7 #|0 HALFWIDTH KATAKANA LETTER KI - \xB8 #|0 HALFWIDTH KATAKANA LETTER KU - \xB9 #|0 HALFWIDTH KATAKANA LETTER KE - \xBA #|0 HALFWIDTH KATAKANA LETTER KO - \xBB #|0 HALFWIDTH KATAKANA LETTER SA - \xBC #|0 HALFWIDTH KATAKANA LETTER SI - \xBD #|0 HALFWIDTH KATAKANA LETTER SU - \xBE #|0 HALFWIDTH KATAKANA LETTER SE - \xBF #|0 HALFWIDTH KATAKANA LETTER SO - \xC0 #|0 HALFWIDTH KATAKANA LETTER TA - \xC1 #|0 HALFWIDTH KATAKANA LETTER TI - \xC2 #|0 HALFWIDTH KATAKANA LETTER TU - \xC3 #|0 HALFWIDTH KATAKANA LETTER TE - \xC4 #|0 HALFWIDTH KATAKANA LETTER TO - \xC5 #|0 HALFWIDTH KATAKANA LETTER NA - \xC6 #|0 HALFWIDTH KATAKANA LETTER NI - \xC7 #|0 HALFWIDTH KATAKANA LETTER NU - \xC8 #|0 HALFWIDTH KATAKANA LETTER NE - \xC9 #|0 HALFWIDTH KATAKANA LETTER NO - \xCA #|0 HALFWIDTH KATAKANA LETTER HA - \xCB #|0 HALFWIDTH KATAKANA LETTER HI - \xCC #|0 HALFWIDTH KATAKANA LETTER HU - \xCD #|0 HALFWIDTH KATAKANA LETTER HE - \xCE #|0 HALFWIDTH KATAKANA LETTER HO - \xCF #|0 HALFWIDTH KATAKANA LETTER MA - \xD0 #|0 HALFWIDTH KATAKANA LETTER MI - \xD1 #|0 HALFWIDTH KATAKANA LETTER MU - \xD2 #|0 HALFWIDTH KATAKANA LETTER ME - \xD3 #|0 HALFWIDTH KATAKANA LETTER MO - \xD4 #|0 HALFWIDTH KATAKANA LETTER YA - \xD5 #|0 HALFWIDTH KATAKANA LETTER YU - \xD6 #|0 HALFWIDTH KATAKANA LETTER YO - \xD7 #|0 HALFWIDTH KATAKANA LETTER RA - \xD8 #|0 HALFWIDTH KATAKANA LETTER RI - \xD9 #|0 HALFWIDTH KATAKANA LETTER RU - \xDA #|0 HALFWIDTH KATAKANA LETTER RE - \xDB #|0 HALFWIDTH KATAKANA LETTER RO - \xDC #|0 HALFWIDTH KATAKANA LETTER WA - \xDD #|0 HALFWIDTH KATAKANA LETTER N - \xDE #|0 HALFWIDTH KATAKANA VOICED SOUND MARK - \xDF #|0 HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK -# -END CHARMAP -# -#________________________________________________________________________ diff --git a/icuSources/data/mappings/lmb-excp.ucm b/icuSources/data/mappings/lmb-excp.ucm index 15aae2bd..01095d41 100644 --- a/icuSources/data/mappings/lmb-excp.ucm +++ b/icuSources/data/mappings/lmb-excp.ucm @@ -1,6 +1,6 @@ # ******************************************************************************* # * -# * Copyright (C) 1995-2001, International Business Machines +# * Copyright (C) 1995-2003, International Business Machines # * Corporation and others. All Rights Reserved. # * # ******************************************************************************* @@ -14,7 +14,7 @@ "lmb-excp" "AXXXX" 2 - 1 + 2 "MBCS" \x01\x3f 0-ff:2, 1-2:1, 6:1 diff --git a/icuSources/data/mappings/ibm-1275_P100-1995.ucm b/icuSources/data/mappings/macos-0_2-10.2.ucm similarity index 69% rename from icuSources/data/mappings/ibm-1275_P100-1995.ucm rename to icuSources/data/mappings/macos-0_2-10.2.ucm index 3640a540..2702df83 100644 --- a/icuSources/data/mappings/ibm-1275_P100-1995.ucm +++ b/icuSources/data/mappings/macos-0_2-10.2.ucm @@ -1,23 +1,42 @@ # *************************************************************************** # * -# * Copyright (C) 1995-2002, International Business Machines +# * Copyright (C) 2001-2003, International Business Machines # * Corporation and others. All Rights Reserved. # * # *************************************************************************** # -# File created by rptp2ucm (compiled on Dec 3 2002) -# from source files 34B004FB.RPMAP100 and 04FB34B0.TPMAP100 +# File created on Feb 20 19:59 PST 2003 # - "ibm-1275_P100-1995" - "AXXXX" +# File created by genmucm tool. +# from macos 10.2 using TECCreateConverter +# +# Table Version : 1.0 +# The 1st column is the Unicode scalar value. +# The 2nd column is the codepage byte sequence. +# The 3rd column is the fallback indicator. +# The fallback indicator can have one of the following values: +# |0 for exact 1-1 roundtrip mapping +# |1 for the best fallback codepage byte sequence. +# |2 for the substitution character +# |3 for the best reverse fallback Unicode scaler value +# +# Encoding description: +# Encoding name: macintosh +# + "macos-0_2-10.2" 1 1 "SBCS" - \x1A + \x3F "ASCII" - "ibm-1275_VPUA" +# Suggested ICU specific alias information +# "macos-0_2_VPUA" +# CHARMAP +# +#UNICODE 0_2 +#_______ _________ \x00 |0 \x01 |0 \x02 |0 @@ -150,23 +169,27 @@ CHARMAP \xC1 |0 \xA2 |0 \xA3 |0 - \xDB |0 \xB4 |0 + \x7C |1 \xA4 |0 \xAC |0 \xA9 |0 \xBB |0 \xC7 |0 \xC2 |0 + \x2D |1 \xA8 |0 \xF8 |0 \xA1 |0 \xB1 |0 + \x32 |1 + \x33 |1 \xAB |0 \xB5 |0 \xA6 |0 \xE1 |0 \xFC |0 + \x31 |1 \xBC |0 \xC8 |0 \xC0 |0 @@ -192,6 +215,7 @@ CHARMAP \xEF |0 \xCD |0 \x85 |0 + \x2A |1 \xAF |0 \xF4 |0 \xF2 |0 @@ -232,17 +256,50 @@ CHARMAP \xCF |0 \xD9 |0 \xC4 |0 + \xD4 |1 + \xD5 |1 \xF6 |0 \xFF |0 + \xAB |1 + \x60 |1 \xF9 |0 \xFA |0 \xFB |0 \xFE |0 \xF7 |0 \xFD |0 + \x60 |1 + \xAB |1 + \xF6 |1 + \xF7 |1 + \xF8 |1 + \xF9 |1 + \xFA |1 + \xAC |1 + \xFB |1 + \xFD |1 + \xFF |1 + \xFC |1 + \xFE |1 + \x2F |1 + \xBD |0 \xB9 |0 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x2D |1 + \x2D |1 + \xD0 |1 \xD0 |0 \xD1 |0 + \xD1 |1 \xD4 |0 \xD5 |0 \xE2 |0 @@ -253,122 +310,36 @@ CHARMAP \xE0 |0 \xA5 |0 \xC9 |0 + \x0D |1 + \x0D |1 \xE4 |0 \xDC |0 \xDD |0 \xDA |0 + \xDB |0 \xAA |0 - \xBD |0 + \xBD |1 \xB6 |0 \xC6 |0 \xB8 |0 \xB7 |0 + \x2D |1 + \x2F |1 + \x2A |1 \xC3 |0 \xB0 |0 \xBA |0 + \x3A |1 + \x7E |1 \xC5 |0 \xAD |0 \xB2 |0 \xB3 |0 - \x11 |1 + \xE1 |1 \xD7 |0 - \x13 |1 - \x12 |1 \xF0 |0 \xDE |0 \xDF |0 - \x21 |1 - \x22 |1 - \x23 |1 - \x24 |1 - \x25 |1 - \x26 |1 - \x27 |1 - \x28 |1 - \x29 |1 - \x2A |1 - \x2B |1 - \x2C |1 - \x2D |1 - \x2E |1 - \x2F |1 - \x30 |1 - \x31 |1 - \x32 |1 - \x33 |1 - \x34 |1 - \x35 |1 - \x36 |1 - \x37 |1 - \x38 |1 - \x39 |1 - \x3A |1 - \x3B |1 - \x3C |1 - \x3D |1 - \x3E |1 - \x3F |1 - \x40 |1 - \x41 |1 - \x42 |1 - \x43 |1 - \x44 |1 - \x45 |1 - \x46 |1 - \x47 |1 - \x48 |1 - \x49 |1 - \x4A |1 - \x4B |1 - \x4C |1 - \x4D |1 - \x4E |1 - \x4F |1 - \x50 |1 - \x51 |1 - \x52 |1 - \x53 |1 - \x54 |1 - \x55 |1 - \x56 |1 - \x57 |1 - \x58 |1 - \x59 |1 - \x5A |1 - \x5B |1 - \x5C |1 - \x5D |1 - \x5E |1 - \x5F |1 - \x60 |1 - \x61 |1 - \x62 |1 - \x63 |1 - \x64 |1 - \x65 |1 - \x66 |1 - \x67 |1 - \x68 |1 - \x69 |1 - \x6A |1 - \x6B |1 - \x6C |1 - \x6D |1 - \x6E |1 - \x6F |1 - \x70 |1 - \x71 |1 - \x72 |1 - \x73 |1 - \x74 |1 - \x75 |1 - \x76 |1 - \x77 |1 - \x78 |1 - \x79 |1 - \x7A |1 - \x7B |1 - \x7C |1 - \x7D |1 - \x7E |1 +# END CHARMAP +# diff --git a/icuSources/data/mappings/macos-2566-10_2.ucm b/icuSources/data/mappings/macos-2566-10.2.ucm similarity index 99% rename from icuSources/data/mappings/macos-2566-10_2.ucm rename to icuSources/data/mappings/macos-2566-10.2.ucm index b76d80e0..32d9e395 100644 --- a/icuSources/data/mappings/macos-2566-10_2.ucm +++ b/icuSources/data/mappings/macos-2566-10.2.ucm @@ -23,7 +23,7 @@ # Encoding description: # Encoding name: Big5-HKSCS # - "macos-2566-10_2" + "macos-2566-10.2" 2 1 "MBCS" diff --git a/icuSources/data/mappings/ibm-1282_P100-1996.ucm b/icuSources/data/mappings/macos-29-10.2.ucm similarity index 70% rename from icuSources/data/mappings/ibm-1282_P100-1996.ucm rename to icuSources/data/mappings/macos-29-10.2.ucm index 6c3c6abf..3404ad6e 100644 --- a/icuSources/data/mappings/ibm-1282_P100-1996.ucm +++ b/icuSources/data/mappings/macos-29-10.2.ucm @@ -1,23 +1,42 @@ # *************************************************************************** # * -# * Copyright (C) 1995-2002, International Business Machines +# * Copyright (C) 2001-2003, International Business Machines # * Corporation and others. All Rights Reserved. # * # *************************************************************************** # -# File created by rptp2ucm (compiled on Dec 3 2002) -# from source files 34B00502.RPMAP100 and 050234B0.TPMAP100 +# File created on Feb 20 17:43 PST 2003 # - "ibm-1282_P100-1996" - "AXXXX" +# File created by genmucm tool. +# from macos 10.2 using TECCreateConverter +# +# Table Version : 1.0 +# The 1st column is the Unicode scalar value. +# The 2nd column is the codepage byte sequence. +# The 3rd column is the fallback indicator. +# The fallback indicator can have one of the following values: +# |0 for exact 1-1 roundtrip mapping +# |1 for the best fallback codepage byte sequence. +# |2 for the substitution character +# |3 for the best reverse fallback Unicode scaler value +# +# Encoding description: +# Encoding name: X-MAC-CENTRALEURROMAN +# + "macos-29-10.2" 1 1 "SBCS" - \x1A + \x3F "ASCII" - "ibm-1282_STD" +# Suggested ICU specific alias information +# "macos-29_VPUA" +# CHARMAP +# +#UNICODE 29 +#_______ _________ \x00 |0 \x01 |0 \x02 |0 @@ -251,9 +270,30 @@ CHARMAP \xFD |0 \xEB |0 \xEC |0 + \xD4 |1 + \xD5 |1 \xFF |0 + \x60 |1 + \x60 |1 + \xAC |1 + \xFF |1 + \x2F |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x2D |1 + \x2D |1 + \xD0 |1 \xD0 |0 \xD1 |0 + \xD1 |1 \xD4 |0 \xD5 |0 \xE2 |0 @@ -263,109 +303,23 @@ CHARMAP \xA0 |0 \xA5 |0 \xC9 |0 + \x0D |1 + \x0D |1 \xDC |0 \xDD |0 \xAA |0 \xB6 |0 \xC6 |0 \xB7 |0 + \x2F |1 + \x2A |1 \xC3 |0 + \x3A |1 + \x7E |1 \xAD |0 \xB2 |0 \xB3 |0 \xD7 |0 - \x21 |1 - \x22 |1 - \x23 |1 - \x24 |1 - \x25 |1 - \x26 |1 - \x27 |1 - \x28 |1 - \x29 |1 - \x2A |1 - \x2B |1 - \x2C |1 - \x2D |1 - \x2E |1 - \x2F |1 - \x30 |1 - \x31 |1 - \x32 |1 - \x33 |1 - \x34 |1 - \x35 |1 - \x36 |1 - \x37 |1 - \x38 |1 - \x39 |1 - \x3A |1 - \x3B |1 - \x3C |1 - \x3D |1 - \x3E |1 - \x3F |1 - \x40 |1 - \x41 |1 - \x42 |1 - \x43 |1 - \x44 |1 - \x45 |1 - \x46 |1 - \x47 |1 - \x48 |1 - \x49 |1 - \x4A |1 - \x4B |1 - \x4C |1 - \x4D |1 - \x4E |1 - \x4F |1 - \x50 |1 - \x51 |1 - \x52 |1 - \x53 |1 - \x54 |1 - \x55 |1 - \x56 |1 - \x57 |1 - \x58 |1 - \x59 |1 - \x5A |1 - \x5B |1 - \x5C |1 - \x5D |1 - \x5E |1 - \x5F |1 - \x60 |1 - \x61 |1 - \x62 |1 - \x63 |1 - \x64 |1 - \x65 |1 - \x66 |1 - \x67 |1 - \x68 |1 - \x69 |1 - \x6A |1 - \x6B |1 - \x6C |1 - \x6D |1 - \x6E |1 - \x6F |1 - \x70 |1 - \x71 |1 - \x72 |1 - \x73 |1 - \x74 |1 - \x75 |1 - \x76 |1 - \x77 |1 - \x78 |1 - \x79 |1 - \x7A |1 - \x7B |1 - \x7C |1 - \x7D |1 - \x7E |1 +# END CHARMAP +# diff --git a/icuSources/data/mappings/ibm-1281_P100-1996.ucm b/icuSources/data/mappings/macos-35-10.2.ucm similarity index 70% rename from icuSources/data/mappings/ibm-1281_P100-1996.ucm rename to icuSources/data/mappings/macos-35-10.2.ucm index 0950e7c6..5b246ecc 100644 --- a/icuSources/data/mappings/ibm-1281_P100-1996.ucm +++ b/icuSources/data/mappings/macos-35-10.2.ucm @@ -1,23 +1,42 @@ # *************************************************************************** # * -# * Copyright (C) 1995-2002, International Business Machines +# * Copyright (C) 2001-2003, International Business Machines # * Corporation and others. All Rights Reserved. # * # *************************************************************************** # -# File created by rptp2ucm (compiled on Dec 3 2002) -# from source files 34B00501.RPMAP100 and 050134B0.TPMAP100 +# File created on Feb 20 19:36 PST 2003 # - "ibm-1281_P100-1996" - "AXXXX" +# File created by genmucm tool. +# from macos 10.2 using TECCreateConverter +# +# Table Version : 1.0 +# The 1st column is the Unicode scalar value. +# The 2nd column is the codepage byte sequence. +# The 3rd column is the fallback indicator. +# The fallback indicator can have one of the following values: +# |0 for exact 1-1 roundtrip mapping +# |1 for the best fallback codepage byte sequence. +# |2 for the substitution character +# |3 for the best reverse fallback Unicode scaler value +# +# Encoding description: +# Encoding name: X-MAC-TURKISH +# + "macos-35-10.2" 1 1 "SBCS" - \x1A + \x3F "ASCII" - "ibm-1281_VPUA" +# Suggested ICU specific alias information +# "macos-35_VPUA" +# CHARMAP +# +#UNICODE 35 +#_______ _________ \x00 |0 \x01 |0 \x02 |0 @@ -236,17 +255,50 @@ CHARMAP \xDF |0 \xD9 |0 \xC4 |0 + \xD4 |1 + \xD5 |1 \xF6 |0 \xFF |0 + \xAB |1 + \x60 |1 \xF9 |0 \xFA |0 \xFB |0 \xFE |0 \xF7 |0 \xFD |0 + \x60 |1 + \xAB |1 + \xF6 |1 + \xF7 |1 + \xF8 |1 + \xF9 |1 + \xFA |1 + \xAC |1 + \xFB |1 + \xFD |1 + \xFF |1 + \xFC |1 + \xFE |1 + \x2F |1 + \xBD |0 \xB9 |0 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x2D |1 + \x2D |1 + \xD0 |1 \xD0 |0 \xD1 |0 + \xD1 |1 \xD4 |0 \xD5 |0 \xE2 |0 @@ -257,114 +309,30 @@ CHARMAP \xE0 |0 \xA5 |0 \xC9 |0 + \x0D |1 + \x0D |1 \xE4 |0 \xAA |0 - \xBD |0 + \xBD |1 \xB6 |0 \xC6 |0 \xB8 |0 \xB7 |0 + \x2F |1 + \x2A |1 \xC3 |0 \xB0 |0 \xBA |0 + \x3A |1 + \x7E |1 \xC5 |0 \xAD |0 \xB2 |0 \xB3 |0 + \xE1 |1 \xD7 |0 + \xF5 |0 \xF0 |0 - \x21 |1 - \x22 |1 - \x23 |1 - \x24 |1 - \x25 |1 - \x26 |1 - \x27 |1 - \x28 |1 - \x29 |1 - \x2A |1 - \x2B |1 - \x2C |1 - \x2D |1 - \x2E |1 - \x2F |1 - \x30 |1 - \x31 |1 - \x32 |1 - \x33 |1 - \x34 |1 - \x35 |1 - \x36 |1 - \x37 |1 - \x38 |1 - \x39 |1 - \x3A |1 - \x3B |1 - \x3C |1 - \x3D |1 - \x3E |1 - \x3F |1 - \x40 |1 - \x41 |1 - \x42 |1 - \x43 |1 - \x44 |1 - \x45 |1 - \x46 |1 - \x47 |1 - \x48 |1 - \x49 |1 - \x4A |1 - \x4B |1 - \x4C |1 - \x4D |1 - \x4E |1 - \x4F |1 - \x50 |1 - \x51 |1 - \x52 |1 - \x53 |1 - \x54 |1 - \x55 |1 - \x56 |1 - \x57 |1 - \x58 |1 - \x59 |1 - \x5A |1 - \x5B |1 - \x5C |1 - \x5D |1 - \x5E |1 - \x5F |1 - \x60 |1 - \x61 |1 - \x62 |1 - \x63 |1 - \x64 |1 - \x65 |1 - \x66 |1 - \x67 |1 - \x68 |1 - \x69 |1 - \x6A |1 - \x6B |1 - \x6C |1 - \x6D |1 - \x6E |1 - \x6F |1 - \x70 |1 - \x71 |1 - \x72 |1 - \x73 |1 - \x74 |1 - \x75 |1 - \x76 |1 - \x77 |1 - \x78 |1 - \x79 |1 - \x7A |1 - \x7B |1 - \x7C |1 - \x7D |1 - \x7E |1 +# END CHARMAP +# diff --git a/icuSources/data/mappings/ibm-1280_P100-1996.ucm b/icuSources/data/mappings/macos-6-10.2.ucm similarity index 70% rename from icuSources/data/mappings/ibm-1280_P100-1996.ucm rename to icuSources/data/mappings/macos-6-10.2.ucm index 87e07a0e..5885acb1 100644 --- a/icuSources/data/mappings/ibm-1280_P100-1996.ucm +++ b/icuSources/data/mappings/macos-6-10.2.ucm @@ -1,23 +1,42 @@ # *************************************************************************** # * -# * Copyright (C) 1995-2002, International Business Machines +# * Copyright (C) 2001-2003, International Business Machines # * Corporation and others. All Rights Reserved. # * # *************************************************************************** # -# File created by rptp2ucm (compiled on Dec 3 2002) -# from source files 34B00500.RPMAP100 and 050034B0.TPMAP100 +# File created on Feb 21 13:55 PST 2003 # - "ibm-1280_P100-1996" - "AXXXX" +# File created by genmucm tool. +# from macos 10.2 using TECCreateConverter +# +# Table Version : 1.0 +# The 1st column is the Unicode scalar value. +# The 2nd column is the codepage byte sequence. +# The 3rd column is the fallback indicator. +# The fallback indicator can have one of the following values: +# |0 for exact 1-1 roundtrip mapping +# |1 for the best fallback codepage byte sequence. +# |2 for the substitution character +# |3 for the best reverse fallback Unicode scaler value +# +# Encoding description: +# Encoding name: X-MAC-GREEK +# + "macos-6-10.2" 1 1 "SBCS" - \x1A + \x3F "ASCII" - "ibm-1280_STD" +# Suggested ICU specific alias information +# "macos-6_VPUA" +# CHARMAP +# +#UNICODE 6 +#_______ _________ \x00 |0 \x01 |0 \x02 |0 @@ -161,6 +180,8 @@ CHARMAP \xB1 |0 \x82 |0 \x84 |0 + \x8B |1 + \xAF |0 \x81 |0 \xC8 |0 \x97 |0 @@ -186,10 +207,24 @@ CHARMAP \x9E |0 \x9F |0 \xCF |0 + \xD4 |1 + \xD5 |1 + \x8B |1 + \x60 |1 + \x60 |1 + \x8B |1 + \x7E |1 + \x8C |1 + \x8B |1 + \xD5 |1 + \xD4 |1 + \x2F |1 + \xD5 |1 + \x87 |1 \x8B |0 \x87 |0 \xCD |0 - \xAF |0 + \xAF |1 \xCE |0 \xD7 |0 \xD8 |0 @@ -258,8 +293,21 @@ CHARMAP \xDE |0 \xE0 |0 \xF1 |0 - \xE6 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x2D |1 + \x2D |1 + \xD0 |1 \xD0 |0 + \xD1 |1 \xD1 |0 \xD4 |0 \xD5 |0 @@ -268,104 +316,21 @@ CHARMAP \xA0 |0 \x96 |0 \xC9 |0 + \x0D |1 + \x0D |1 \x98 |0 \x93 |0 + \x2D |1 + \x2F |1 + \x2A |1 + \x3A |1 + \x7E |1 \xC5 |0 \xAD |0 \xB2 |0 \xB3 |0 - \x21 |1 - \x22 |1 - \x23 |1 - \x24 |1 - \x25 |1 - \x26 |1 - \x27 |1 - \x28 |1 - \x29 |1 - \x2A |1 - \x2B |1 - \x2C |1 - \x2D |1 - \x2E |1 - \x2F |1 - \x30 |1 - \x31 |1 - \x32 |1 - \x33 |1 - \x34 |1 - \x35 |1 - \x36 |1 - \x37 |1 - \x38 |1 - \x39 |1 - \x3A |1 - \x3B |1 - \x3C |1 - \x3D |1 - \x3E |1 - \x3F |1 - \x40 |1 - \x41 |1 - \x42 |1 - \x43 |1 - \x44 |1 - \x45 |1 - \x46 |1 - \x47 |1 - \x48 |1 - \x49 |1 - \x4A |1 - \x4B |1 - \x4C |1 - \x4D |1 - \x4E |1 - \x4F |1 - \x50 |1 - \x51 |1 - \x52 |1 - \x53 |1 - \x54 |1 - \x55 |1 - \x56 |1 - \x57 |1 - \x58 |1 - \x59 |1 - \x5A |1 - \x5B |1 - \x5C |1 - \x5D |1 - \x5E |1 - \x5F |1 - \x60 |1 - \x61 |1 - \x62 |1 - \x63 |1 - \x64 |1 - \x65 |1 - \x66 |1 - \x67 |1 - \x68 |1 - \x69 |1 - \x6A |1 - \x6B |1 - \x6C |1 - \x6D |1 - \x6E |1 - \x6F |1 - \x70 |1 - \x71 |1 - \x72 |1 - \x73 |1 - \x74 |1 - \x75 |1 - \x76 |1 - \x77 |1 - \x78 |1 - \x79 |1 - \x7A |1 - \x7B |1 - \x7C |1 - \x7D |1 - \x7E |1 + \xAF |1 + \xFF |0 +# END CHARMAP +# diff --git a/icuSources/data/mappings/ibm-1283_P100-1996.ucm b/icuSources/data/mappings/macos-7_3-10.2.ucm similarity index 70% rename from icuSources/data/mappings/ibm-1283_P100-1996.ucm rename to icuSources/data/mappings/macos-7_3-10.2.ucm index 5996fe4d..8af97eee 100644 --- a/icuSources/data/mappings/ibm-1283_P100-1996.ucm +++ b/icuSources/data/mappings/macos-7_3-10.2.ucm @@ -1,23 +1,42 @@ # *************************************************************************** # * -# * Copyright (C) 1995-2002, International Business Machines +# * Copyright (C) 2001-2003, International Business Machines # * Corporation and others. All Rights Reserved. # * # *************************************************************************** # -# File created by rptp2ucm (compiled on Dec 3 2002) -# from source files 34B00503.RPMAP100 and 050334B0.TPMAP100 +# File created on Feb 21 13:52 PST 2003 # - "ibm-1283_P100-1996" - "AXXXX" +# File created by genmucm tool. +# from macos 10.2 using TECCreateConverter +# +# Table Version : 1.0 +# The 1st column is the Unicode scalar value. +# The 2nd column is the codepage byte sequence. +# The 3rd column is the fallback indicator. +# The fallback indicator can have one of the following values: +# |0 for exact 1-1 roundtrip mapping +# |1 for the best fallback codepage byte sequence. +# |2 for the substitution character +# |3 for the best reverse fallback Unicode scaler value +# +# Encoding description: +# Encoding name: X-MAC-CYRILLIC +# + "macos-7_3-10.2" 1 1 "SBCS" - \x1A + \x3F "ASCII" - "ibm-1283_STD" +# Suggested ICU specific alias information +# "macos-7_3_VPUA" +# CHARMAP +# +#UNICODE 7_3 +#_______ _________ \x00 |0 \x01 |0 \x02 |0 @@ -147,9 +166,7 @@ CHARMAP \x7E |0 \x7F |0 \xCA |0 - \xA2 |0 \xA3 |0 - \xFF |0 \xA4 |0 \xA9 |0 \xC7 |0 @@ -162,6 +179,11 @@ CHARMAP \xC8 |0 \xD6 |0 \xC4 |0 + \xD4 |1 + \xD5 |1 + \x60 |1 + \x60 |1 + \x2F |1 \xDD |0 \xAB |0 \xAE |0 @@ -254,8 +276,24 @@ CHARMAP \xCE |0 \xD9 |0 \xDB |0 + \xA2 |0 + \xB6 |0 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x20 |1 + \x2D |1 + \x2D |1 + \xD0 |1 \xD0 |0 \xD1 |0 + \xD1 |1 \xD4 |0 \xD5 |0 \xD2 |0 @@ -264,108 +302,22 @@ CHARMAP \xA0 |0 \xA5 |0 \xC9 |0 + \x0D |1 + \x0D |1 + \xFF |0 \xDC |0 \xAA |0 - \xB6 |0 \xC6 |0 + \x2F |1 + \x2A |1 \xC3 |0 \xB0 |0 + \x3A |1 + \x7E |1 \xC5 |0 \xAD |0 \xB2 |0 \xB3 |0 - \x21 |1 - \x22 |1 - \x23 |1 - \x24 |1 - \x25 |1 - \x26 |1 - \x27 |1 - \x28 |1 - \x29 |1 - \x2A |1 - \x2B |1 - \x2C |1 - \x2D |1 - \x2E |1 - \x2F |1 - \x30 |1 - \x31 |1 - \x32 |1 - \x33 |1 - \x34 |1 - \x35 |1 - \x36 |1 - \x37 |1 - \x38 |1 - \x39 |1 - \x3A |1 - \x3B |1 - \x3C |1 - \x3D |1 - \x3E |1 - \x3F |1 - \x40 |1 - \x41 |1 - \x42 |1 - \x43 |1 - \x44 |1 - \x45 |1 - \x46 |1 - \x47 |1 - \x48 |1 - \x49 |1 - \x4A |1 - \x4B |1 - \x4C |1 - \x4D |1 - \x4E |1 - \x4F |1 - \x50 |1 - \x51 |1 - \x52 |1 - \x53 |1 - \x54 |1 - \x55 |1 - \x56 |1 - \x57 |1 - \x58 |1 - \x59 |1 - \x5A |1 - \x5B |1 - \x5C |1 - \x5D |1 - \x5E |1 - \x5F |1 - \x60 |1 - \x61 |1 - \x62 |1 - \x63 |1 - \x64 |1 - \x65 |1 - \x66 |1 - \x67 |1 - \x68 |1 - \x69 |1 - \x6A |1 - \x6B |1 - \x6C |1 - \x6D |1 - \x6E |1 - \x6F |1 - \x70 |1 - \x71 |1 - \x72 |1 - \x73 |1 - \x74 |1 - \x75 |1 - \x76 |1 - \x77 |1 - \x78 |1 - \x79 |1 - \x7A |1 - \x7B |1 - \x7C |1 - \x7D |1 - \x7E |1 +# END CHARMAP +# diff --git a/icuSources/data/mappings/ucmcore.mk b/icuSources/data/mappings/ucmcore.mk index 6ce08006..372b3825 100644 --- a/icuSources/data/mappings/ucmcore.mk +++ b/icuSources/data/mappings/ucmcore.mk @@ -20,9 +20,9 @@ ibm-914_P100-1995.ucm ibm-915_P100-1995.ucm ibm-916_P100-1995.ucm\ ibm-920_P100-1995.ucm ibm-923_P100-1998.ucm ibm-1089_P100-1995.ucm\ ibm-4909_P100-1999.ucm\ ibm-5346_P100-1998.ucm ibm-5347_P100-1998.ucm ibm-5348_P100-1997.ucm\ -ibm-5349_P100-1998.ucm ibm-5350_P100-1998.ucm ibm-5351_P100-1998.ucm\ -ibm-5352_P100-1998.ucm ibm-5353_P100-1998.ucm ibm-5354_P100-1998.ucm\ +ibm-5349_P100-1998.ucm ibm-5350_P100-1998.ucm ibm-9447_P100-2002.ucm\ +ibm-5352_P100-1998.ucm ibm-9449_P100-2002.ucm ibm-5354_P100-1998.ucm\ ibm-1383_P110-1999.ucm ibm-1386_P100-2002.ucm gb18030.ucm\ ibm-1373_P100-2002.ucm\ -ibm-943_P14A-1999.ucm ibm-33722_P12A-1999.ucm\ +ibm-943_P15A-2003.ucm ibm-33722_P12A-1999.ucm\ ibm-970_P110-1995.ucm ibm-949_P11A-1999.ucm ibm-1363_P11B-1998.ucm diff --git a/icuSources/data/mappings/ucmebcdic.mk b/icuSources/data/mappings/ucmebcdic.mk index d4e360b5..dbf07944 100644 --- a/icuSources/data/mappings/ucmebcdic.mk +++ b/icuSources/data/mappings/ucmebcdic.mk @@ -7,8 +7,8 @@ UCM_SOURCE_EBCDIC = ebcdic-xml-us.ucm\ ibm-1025_P100-1995.ucm ibm-1026_P100-1995.ucm ibm-1097_P100-1995.ucm\ ibm-1112_P100-1995.ucm ibm-1122_P100-1999.ucm ibm-1130_P100-1997.ucm\ ibm-1132_P100-1998.ucm ibm-1137_P100-1999.ucm ibm-1364_P110-1997.ucm\ -ibm-1371_P100-1999.ucm ibm-1388_P103-2001.ucm ibm-1390_P100-1999.ucm\ -ibm-1399_P100-1999.ucm ibm-870_P100-1995.ucm ibm-875_P100-1995.ucm\ +ibm-1371_P100-1999.ucm ibm-1388_P103-2001.ucm ibm-1390_P110-2003.ucm\ +ibm-1399_P110-2003.ucm ibm-870_P100-1995.ucm ibm-875_P100-1995.ucm\ ibm-838_P100-1995.ucm ibm-918_P100-1995.ucm ibm-930_P120-1999.ucm\ ibm-933_P110-1995.ucm ibm-935_P110-1999.ucm ibm-937_P110-1999.ucm\ ibm-939_P120-1999.ucm ibm-1123_P100-1995.ucm ibm-1140_P100-1997.ucm\ @@ -23,5 +23,5 @@ ibm-277_P100-1995.ucm ibm-278_P100-1995.ucm ibm-280_P100-1995.ucm\ ibm-284_P100-1995.ucm ibm-285_P100-1995.ucm ibm-290_P100-1995.ucm\ ibm-297_P100-1995.ucm ibm-420_X120-1999.ucm ibm-424_P100-1995.ucm\ ibm-4899_P100-1998.ucm ibm-4971_P100-1999.ucm ibm-500_P100-1995.ucm\ -ibm-5123_P100-1999.ucm ibm-803_P100-1999.ucm ibm-8482.ucm\ -ibm-16684_P100-1999.ucm +ibm-5123_P100-1999.ucm ibm-803_P100-1999.ucm ibm-8482_P100-1999.ucm\ +ibm-16684_P110-2003.ucm diff --git a/icuSources/data/mappings/ucmfiles.mk b/icuSources/data/mappings/ucmfiles.mk index dc1ccfc6..4be9d860 100644 --- a/icuSources/data/mappings/ucmfiles.mk +++ b/icuSources/data/mappings/ucmfiles.mk @@ -1,4 +1,4 @@ -# Copyright (c) 1999-2003, International Business Machines Corporation and +# Copyright (c) 1999-2004, International Business Machines Corporation and # others. All Rights Reserved. # A list of UCM's to build # Note: @@ -69,23 +69,33 @@ ibm-1255_P100-1995.ucm\ ibm-1256_P110-1997.ucm\ ibm-1257_P100-1995.ucm\ ibm-1258_P100-1997.ucm\ -ibm-1275_P100-1995.ucm\ ibm-1276_P100-1995.ucm\ ibm-1277_P100-1995.ucm\ -ibm-1280_P100-1996.ucm\ -ibm-1281_P100-1996.ucm\ -ibm-1282_P100-1996.ucm\ -ibm-1283_P100-1996.ucm\ +ibm-5351_P100-1998.ucm\ +ibm-5353_P100-1998.ucm\ ibm-942_P12A-1999.ucm\ ibm-943_P130-1999.ucm\ ibm-949_P110-1999.ucm\ ibm-950_P110-1999.ucm\ +ibm-954_P101-2000.ucm\ ibm-964_P110-1999.ucm\ +ibm-971_P100-1995.ucm\ ibm-1363_P110-1997.ucm\ +ibm-1375_P100-2003.ucm\ ibm-1381_P110-1999.ucm\ ibm-33722_P120-1999.ucm\ -macos-2566-10_2.ucm\ -jisx-201.ucm jisx-208.ucm jisx-212.ucm\ +macos-0_2-10.2.ucm\ +macos-6-10.2.ucm\ +macos-7_3-10.2.ucm\ +macos-29-10.2.ucm\ +macos-35-10.2.ucm\ +macos-2566-10.2.ucm\ +windows-874-2000.ucm\ +windows-936-2000.ucm\ +windows-949-2000.ucm\ +windows-950-2000.ucm\ +windows-1256-2000.ucm\ +ibm-897_P100-1995.ucm jisx-208.ucm jisx-212.ucm\ iso-ir-165.ucm cns-11643-1992.ucm\ ibm-5478_P100-1995.ucm\ icu-internal-25546.ucm lmb-excp.ucm diff --git a/icuSources/data/mappings/ucmlocal.mk b/icuSources/data/mappings/ucmlocal.mk new file mode 100644 index 00000000..a1d75973 --- /dev/null +++ b/icuSources/data/mappings/ucmlocal.mk @@ -0,0 +1,11 @@ +# +# Local Apple addition for mapping resources +# Copyright (c) 2004 Apple Computer, Inc. All rights reserved. +# + +UCM_SOURCE_LOCAL = ibm-1168_P100-2002.ucm\ +ibm-737_P100-1997.ucm\ +ibm-775_P100-1996.ucm\ +iso-8859_10-1998.ucm\ +iso-8859_16-2001.ucm + diff --git a/icuSources/data/mappings/windows-1256-2000.ucm b/icuSources/data/mappings/windows-1256-2000.ucm new file mode 100644 index 00000000..f9096ffd --- /dev/null +++ b/icuSources/data/mappings/windows-1256-2000.ucm @@ -0,0 +1,570 @@ +# *************************************************************************** +# * +# * Copyright (C) 2001-2003, International Business Machines +# * Corporation and others. All Rights Reserved. +# * +# *************************************************************************** +# +# File created on Dec 03 13:48 Pacific Standard Time 2002 +# +# File created by genmucm tool. +# from windows 2000 using IMultiLanguage 5.50.4522.1800 +# +# Table Version : 1.0 +# The 1st column is the Unicode scalar value. +# The 2nd column is the codepage byte sequence. +# The 3rd column is the fallback indicator. +# The fallback indicator can have one of the following values: +# |0 for exact 1-1 roundtrip mapping +# |1 for the best fallback codepage byte sequence. +# |2 for the substitution character +# |3 for the best reverse fallback Unicode scaler value +# +# Encoding description: Arabic (Windows) +# Encoding name: windows-1256 +# + "windows-1256-2000" + 1 + 1 + "SBCS" + \x3F + "ASCII" +# Suggested ICU specific alias information +# "windows-1256_STD" + +# +CHARMAP + \x00 |0 + \x01 |0 + \x02 |0 + \x03 |0 + \x04 |0 + \x05 |0 + \x06 |0 + \x07 |0 + \x08 |0 + \x09 |0 + \x0A |0 + \x0B |0 + \x0C |0 + \x0D |0 + \x0E |0 + \x0F |0 + \x10 |0 + \x11 |0 + \x12 |0 + \x13 |0 + \x14 |0 + \x15 |0 + \x16 |0 + \x17 |0 + \x18 |0 + \x19 |0 + \x1A |0 + \x1B |0 + \x1C |0 + \x1D |0 + \x1E |0 + \x1F |0 + \x20 |0 + \x21 |0 + \x22 |0 + \x23 |0 + \x24 |0 + \x25 |0 + \x26 |0 + \x27 |0 + \x28 |0 + \x29 |0 + \x2A |0 + \x2B |0 + \x2C |0 + \x2D |0 + \x2E |0 + \x2F |0 + \x30 |0 + \x31 |0 + \x32 |0 + \x33 |0 + \x34 |0 + \x35 |0 + \x36 |0 + \x37 |0 + \x38 |0 + \x39 |0 + \x3A |0 + \x3B |0 + \x3C |0 + \x3D |0 + \x3E |0 + \x3F |0 + \x40 |0 + \x41 |0 + \x42 |0 + \x43 |0 + \x44 |0 + \x45 |0 + \x46 |0 + \x47 |0 + \x48 |0 + \x49 |0 + \x4A |0 + \x4B |0 + \x4C |0 + \x4D |0 + \x4E |0 + \x4F |0 + \x50 |0 + \x51 |0 + \x52 |0 + \x53 |0 + \x54 |0 + \x55 |0 + \x56 |0 + \x57 |0 + \x58 |0 + \x59 |0 + \x5A |0 + \x5B |0 + \x5C |0 + \x5D |0 + \x5E |0 + \x5F |0 + \x60 |0 + \x61 |0 + \x62 |0 + \x63 |0 + \x64 |0 + \x65 |0 + \x66 |0 + \x67 |0 + \x68 |0 + \x69 |0 + \x6A |0 + \x6B |0 + \x6C |0 + \x6D |0 + \x6E |0 + \x6F |0 + \x70 |0 + \x71 |0 + \x72 |0 + \x73 |0 + \x74 |0 + \x75 |0 + \x76 |0 + \x77 |0 + \x78 |0 + \x79 |0 + \x7A |0 + \x7B |0 + \x7C |0 + \x7D |0 + \x7E |0 + \x7F |0 + \xA0 |0 + \xA2 |0 + \xA3 |0 + \xA4 |0 + \xA5 |0 + \xA6 |0 + \xA7 |0 + \xA8 |0 + \xA9 |0 + \xAB |0 + \xAC |0 + \xAD |0 + \xAE |0 + \xAF |0 + \xB0 |0 + \xB1 |0 + \xB2 |0 + \xB3 |0 + \xB4 |0 + \xB5 |0 + \xB6 |0 + \xB7 |0 + \xB8 |0 + \xB9 |0 + \xBB |0 + \xBC |0 + \xBD |0 + \xBE |0 + \x41 |1 + \x41 |1 + \x43 |1 + \x45 |1 + \x45 |1 + \x45 |1 + \x45 |1 + \x49 |1 + \x49 |1 + \x4F |1 + \xD7 |0 + \x55 |1 + \x55 |1 + \x55 |1 + \xE0 |0 + \xE2 |0 + \xE7 |0 + \xE8 |0 + \xE9 |0 + \xEA |0 + \xEB |0 + \xEE |0 + \xEF |0 + \xF4 |0 + \xF7 |0 + \xF9 |0 + \xFB |0 + \xFC |0 + \x8C |0 + \x9C |0 + \x46 |1 + \x83 |0 + \x88 |0 + \xA1 |0 + \xBA |0 + \xBF |0 + \xC1 |0 + \xC2 |0 + \xC3 |0 + \xC4 |0 + \xC5 |0 + \xC6 |0 + \xC7 |0 + \xC8 |0 + \xC9 |0 + \xCA |0 + \xCB |0 + \xCC |0 + \xCD |0 + \xCE |0 + \xCF |0 + \xD0 |0 + \xD1 |0 + \xD2 |0 + \xD3 |0 + \xD4 |0 + \xD5 |0 + \xD6 |0 + \xD8 |0 + \xD9 |0 + \xDA |0 + \xDB |0 + \xDC |0 + \xDD |0 + \xDE |0 + \xDF |0 + \xE1 |0 + \xE3 |0 + \xE4 |0 + \xE5 |0 + \xE6 |0 + \xEC |0 + \xED |0 + \xF0 |0 + \xF1 |0 + \xF2 |0 + \xF3 |0 + \xF5 |0 + \xF6 |0 + \xF8 |0 + \xFA |0 + \x8A |0 + \x81 |0 + \x8D |0 + \x8F |0 + \x9A |0 + \x8E |0 + \x98 |0 + \x90 |0 + \x9F |0 + \xAA |0 + \xC0 |0 + \xED |1 + \xFF |0 + \x9D |0 + \x9E |0 + \xFD |0 + \xFE |0 + \x96 |0 + \x97 |0 + \x91 |0 + \x92 |0 + \x82 |0 + \x93 |0 + \x94 |0 + \x84 |0 + \x86 |0 + \x87 |0 + \x95 |0 + \x85 |0 + \x89 |0 + \x8B |0 + \x9B |0 + \x80 |0 + \x99 |0 + \x81 |1 + \x81 |1 + \x81 |1 + \x81 |1 + \x8A |1 + \x8A |1 + \x8A |1 + \x8A |1 + \x8D |1 + \x8D |1 + \x8D |1 + \x8D |1 + \x8F |1 + \x8F |1 + \x8E |1 + \x8E |1 + \x9A |1 + \x9A |1 + \x98 |1 + \x98 |1 + \x98 |1 + \x98 |1 + \x90 |1 + \x90 |1 + \x90 |1 + \x90 |1 + \x9F |1 + \x9F |1 + \xC0 |1 + \xC0 |1 + \xC0 |1 + \xC0 |1 + \xAA |1 + \xAA |1 + \xAA |1 + \xAA |1 + \xFF |1 + \xFF |1 + \xF0 |1 + \xF0 |1 + \xF1 |1 + \xF2 |1 + \xF3 |1 + \xF3 |1 + \xF5 |1 + \xF5 |1 + \xF6 |1 + \xF6 |1 + \xF8 |1 + \xF8 |1 + \xFA |1 + \xFA |1 + \xC1 |1 + \xC2 |1 + \xC2 |1 + \xC3 |1 + \xC3 |1 + \xC4 |1 + \xC4 |1 + \xC5 |1 + \xC5 |1 + \xC6 |1 + \xC6 |1 + \xC6 |1 + \xC6 |1 + \xC7 |1 + \xC7 |1 + \xC8 |1 + \xC8 |1 + \xC8 |1 + \xC8 |1 + \xC9 |1 + \xC9 |1 + \xCA |1 + \xCA |1 + \xCA |1 + \xCA |1 + \xCB |1 + \xCB |1 + \xCB |1 + \xCB |1 + \xCC |1 + \xCC |1 + \xCC |1 + \xCC |1 + \xCD |1 + \xCD |1 + \xCD |1 + \xCD |1 + \xCE |1 + \xCE |1 + \xCE |1 + \xCE |1 + \xCF |1 + \xCF |1 + \xD0 |1 + \xD0 |1 + \xD1 |1 + \xD1 |1 + \xD2 |1 + \xD2 |1 + \xD3 |1 + \xD3 |1 + \xD3 |1 + \xD3 |1 + \xD4 |1 + \xD4 |1 + \xD4 |1 + \xD4 |1 + \xD5 |1 + \xD5 |1 + \xD5 |1 + \xD5 |1 + \xD6 |1 + \xD6 |1 + \xD6 |1 + \xD6 |1 + \xD8 |1 + \xD8 |1 + \xD8 |1 + \xD8 |1 + \xD9 |1 + \xD9 |1 + \xD9 |1 + \xD9 |1 + \xDA |1 + \xDA |1 + \xDA |1 + \xDA |1 + \xDB |1 + \xDB |1 + \xDB |1 + \xDB |1 + \xDD |1 + \xDD |1 + \xDD |1 + \xDD |1 + \xDE |1 + \xDE |1 + \xDE |1 + \xDE |1 + \xDF |1 + \xDF |1 + \xDF |1 + \xDF |1 + \xE1 |1 + \xE1 |1 + \xE1 |1 + \xE1 |1 + \xE3 |1 + \xE3 |1 + \xE3 |1 + \xE3 |1 + \xE4 |1 + \xE4 |1 + \xE4 |1 + \xE4 |1 + \xE5 |1 + \xE5 |1 + \xE5 |1 + \xE5 |1 + \xE6 |1 + \xE6 |1 + \xEC |1 + \xEC |1 + \xED |1 + \xED |1 + \xED |1 + \xED |1 + \x21 |1 + \x22 |1 + \x23 |1 + \x24 |1 + \x25 |1 + \x26 |1 + \x27 |1 + \x28 |1 + \x29 |1 + \x2A |1 + \x2B |1 + \x2C |1 + \x2D |1 + \x2E |1 + \x2F |1 + \x30 |1 + \x31 |1 + \x32 |1 + \x33 |1 + \x34 |1 + \x35 |1 + \x36 |1 + \x37 |1 + \x38 |1 + \x39 |1 + \x3A |1 + \x3B |1 + \x3C |1 + \x3D |1 + \x3E |1 + \x40 |1 + \x41 |1 + \x42 |1 + \x43 |1 + \x44 |1 + \x45 |1 + \x46 |1 + \x47 |1 + \x48 |1 + \x49 |1 + \x4A |1 + \x4B |1 + \x4C |1 + \x4D |1 + \x4E |1 + \x4F |1 + \x50 |1 + \x51 |1 + \x52 |1 + \x53 |1 + \x54 |1 + \x55 |1 + \x56 |1 + \x57 |1 + \x58 |1 + \x59 |1 + \x5A |1 + \x5B |1 + \x5C |1 + \x5D |1 + \x5E |1 + \x5F |1 + \x60 |1 + \x61 |1 + \x62 |1 + \x63 |1 + \x64 |1 + \x65 |1 + \x66 |1 + \x67 |1 + \x68 |1 + \x69 |1 + \x6A |1 + \x6B |1 + \x6C |1 + \x6D |1 + \x6E |1 + \x6F |1 + \x70 |1 + \x71 |1 + \x72 |1 + \x73 |1 + \x74 |1 + \x75 |1 + \x76 |1 + \x77 |1 + \x78 |1 + \x79 |1 + \x7A |1 + \x7B |1 + \x7C |1 + \x7D |1 + \x7E |1 +END CHARMAP diff --git a/icuSources/data/mappings/windows-874-2000.ucm b/icuSources/data/mappings/windows-874-2000.ucm new file mode 100644 index 00000000..ace93e9f --- /dev/null +++ b/icuSources/data/mappings/windows-874-2000.ucm @@ -0,0 +1,430 @@ +# *************************************************************************** +# * +# * Copyright (C) 2001-2003, International Business Machines +# * Corporation and others. All Rights Reserved. +# * +# *************************************************************************** +# +# File created on Dec 03 13:49 Pacific Standard Time 2002 +# +# File created by genmucm tool. +# from windows 2000 using IMultiLanguage 5.50.4522.1800 +# +# Table Version : 1.0 +# The 1st column is the Unicode scalar value. +# The 2nd column is the codepage byte sequence. +# The 3rd column is the fallback indicator. +# The fallback indicator can have one of the following values: +# |0 for exact 1-1 roundtrip mapping +# |1 for the best fallback codepage byte sequence. +# |2 for the substitution character +# |3 for the best reverse fallback Unicode scaler value +# +# Encoding description: Thai (Windows) +# Encoding name: windows-874 +# + "windows-874-2000" + 1 + 1 + "SBCS" + \x3F + "ASCII" +# Suggested ICU specific alias information +# "windows-874_VPUA" + +# +CHARMAP + \x00 |0 + \x01 |0 + \x02 |0 + \x03 |0 + \x04 |0 + \x05 |0 + \x06 |0 + \x07 |0 + \x08 |0 + \x09 |0 + \x0A |0 + \x0B |0 + \x0C |0 + \x0D |0 + \x0E |0 + \x0F |0 + \x10 |0 + \x11 |0 + \x12 |0 + \x13 |0 + \x14 |0 + \x15 |0 + \x16 |0 + \x17 |0 + \x18 |0 + \x19 |0 + \x1A |0 + \x1B |0 + \x1C |0 + \x1D |0 + \x1E |0 + \x1F |0 + \x20 |0 + \x21 |0 + \x22 |0 + \x23 |0 + \x24 |0 + \x25 |0 + \x26 |0 + \x27 |0 + \x28 |0 + \x29 |0 + \x2A |0 + \x2B |0 + \x2C |0 + \x2D |0 + \x2E |0 + \x2F |0 + \x30 |0 + \x31 |0 + \x32 |0 + \x33 |0 + \x34 |0 + \x35 |0 + \x36 |0 + \x37 |0 + \x38 |0 + \x39 |0 + \x3A |0 + \x3B |0 + \x3C |0 + \x3D |0 + \x3E |0 + \x3F |0 + \x40 |0 + \x41 |0 + \x42 |0 + \x43 |0 + \x44 |0 + \x45 |0 + \x46 |0 + \x47 |0 + \x48 |0 + \x49 |0 + \x4A |0 + \x4B |0 + \x4C |0 + \x4D |0 + \x4E |0 + \x4F |0 + \x50 |0 + \x51 |0 + \x52 |0 + \x53 |0 + \x54 |0 + \x55 |0 + \x56 |0 + \x57 |0 + \x58 |0 + \x59 |0 + \x5A |0 + \x5B |0 + \x5C |0 + \x5D |0 + \x5E |0 + \x5F |0 + \x60 |0 + \x61 |0 + \x62 |0 + \x63 |0 + \x64 |0 + \x65 |0 + \x66 |0 + \x67 |0 + \x68 |0 + \x69 |0 + \x6A |0 + \x6B |0 + \x6C |0 + \x6D |0 + \x6E |0 + \x6F |0 + \x70 |0 + \x71 |0 + \x72 |0 + \x73 |0 + \x74 |0 + \x75 |0 + \x76 |0 + \x77 |0 + \x78 |0 + \x79 |0 + \x7A |0 + \x7B |0 + \x7C |0 + \x7D |0 + \x7E |0 + \x7F |0 + \x81 |0 + \x82 |0 + \x83 |0 + \x84 |0 + \x86 |0 + \x87 |0 + \x88 |0 + \x89 |0 + \x8A |0 + \x8B |0 + \x8C |0 + \x8D |0 + \x8E |0 + \x8F |0 + \x90 |0 + \x98 |0 + \x99 |0 + \x9A |0 + \x9B |0 + \x9C |0 + \x9D |0 + \x9E |0 + \x9F |0 + \xA0 |0 + \x15 |1 + \x14 |1 + \xA1 |0 + \xA2 |0 + \xA3 |0 + \xA4 |0 + \xA5 |0 + \xA6 |0 + \xA7 |0 + \xA8 |0 + \xA9 |0 + \xAA |0 + \xAB |0 + \xAC |0 + \xAD |0 + \xAE |0 + \xAF |0 + \xB0 |0 + \xB1 |0 + \xB2 |0 + \xB3 |0 + \xB4 |0 + \xB5 |0 + \xB6 |0 + \xB7 |0 + \xB8 |0 + \xB9 |0 + \xBA |0 + \xBB |0 + \xBC |0 + \xBD |0 + \xBE |0 + \xBF |0 + \xC0 |0 + \xC1 |0 + \xC2 |0 + \xC3 |0 + \xC4 |0 + \xC5 |0 + \xC6 |0 + \xC7 |0 + \xC8 |0 + \xC9 |0 + \xCA |0 + \xCB |0 + \xCC |0 + \xCD |0 + \xCE |0 + \xCF |0 + \xD0 |0 + \xD1 |0 + \xD2 |0 + \xD3 |0 + \xD4 |0 + \xD5 |0 + \xD6 |0 + \xD7 |0 + \xD8 |0 + \xD9 |0 + \xDA |0 + \xDF |0 + \xE0 |0 + \xE1 |0 + \xE2 |0 + \xE3 |0 + \xE4 |0 + \xE5 |0 + \xE6 |0 + \xE7 |0 + \xE8 |0 + \xE9 |0 + \xEA |0 + \xEB |0 + \xEC |0 + \xED |0 + \xEE |0 + \xEF |0 + \xF0 |0 + \xF1 |0 + \xF2 |0 + \xF3 |0 + \xF4 |0 + \xF5 |0 + \xF6 |0 + \xF7 |0 + \xF8 |0 + \xF9 |0 + \xFA |0 + \xFB |0 + \x96 |0 + \x97 |0 + \x91 |0 + \x92 |0 + \x93 |0 + \x94 |0 + \x95 |0 + \x85 |0 + \x13 |1 + \x80 |0 + \x1B |1 + \x18 |1 + \x1A |1 + \x19 |1 + \x1D |1 + \x12 |1 + \x17 |1 + \x1C |1 + \x7F |1 + \xC4 |1 + \xB3 |1 + \xDA |1 + \xBF |1 + \xC0 |1 + \xD9 |1 + \xCD |1 + \xBA |1 + \xC9 |1 + \xBB |1 + \xC8 |1 + \xBC |1 + \xDC |1 + \x16 |1 + \x1E |1 + \x10 |1 + \x1F |1 + \x11 |1 + \x09 |1 + \x08 |1 + \x0A |1 + \x01 |1 + \x02 |1 + \x0F |1 + \x0C |1 + \x0B |1 + \x06 |1 + \x05 |1 + \x03 |1 + \x04 |1 + \x0D |1 + \x0E |1 + \xDB |0 + \xDC |0 + \xDD |0 + \xDE |0 + \xFC |0 + \xFD |0 + \xFE |0 + \xFF |0 + \x21 |1 + \x22 |1 + \x23 |1 + \x24 |1 + \x25 |1 + \x26 |1 + \x27 |1 + \x28 |1 + \x29 |1 + \x2A |1 + \x2B |1 + \x2C |1 + \x2D |1 + \x2E |1 + \x2F |1 + \x30 |1 + \x31 |1 + \x32 |1 + \x33 |1 + \x34 |1 + \x35 |1 + \x36 |1 + \x37 |1 + \x38 |1 + \x39 |1 + \x3A |1 + \x3B |1 + \x3C |1 + \x3D |1 + \x3E |1 + \x40 |1 + \x41 |1 + \x42 |1 + \x43 |1 + \x44 |1 + \x45 |1 + \x46 |1 + \x47 |1 + \x48 |1 + \x49 |1 + \x4A |1 + \x4B |1 + \x4C |1 + \x4D |1 + \x4E |1 + \x4F |1 + \x50 |1 + \x51 |1 + \x52 |1 + \x53 |1 + \x54 |1 + \x55 |1 + \x56 |1 + \x57 |1 + \x58 |1 + \x59 |1 + \x5A |1 + \x5B |1 + \x5C |1 + \x5D |1 + \x5E |1 + \x5F |1 + \x60 |1 + \x61 |1 + \x62 |1 + \x63 |1 + \x64 |1 + \x65 |1 + \x66 |1 + \x67 |1 + \x68 |1 + \x69 |1 + \x6A |1 + \x6B |1 + \x6C |1 + \x6D |1 + \x6E |1 + \x6F |1 + \x70 |1 + \x71 |1 + \x72 |1 + \x73 |1 + \x74 |1 + \x75 |1 + \x76 |1 + \x77 |1 + \x78 |1 + \x79 |1 + \x7A |1 + \x7B |1 + \x7C |1 + \x7D |1 + \x7E |1 +END CHARMAP diff --git a/icuSources/data/mappings/windows-936-2000.ucm b/icuSources/data/mappings/windows-936-2000.ucm new file mode 100644 index 00000000..f7d31e37 --- /dev/null +++ b/icuSources/data/mappings/windows-936-2000.ucm @@ -0,0 +1,24530 @@ +# *************************************************************************** +# * +# * Copyright (C) 2001-2003, International Business Machines +# * Corporation and others. All Rights Reserved. +# * +# *************************************************************************** +# +# File created on Dec 03 13:48 Pacific Standard Time 2002 +# +# File created by genmucm tool. +# from windows 2000 using IMultiLanguage 5.50.4522.1800 +# +# Table Version : 1.0 +# The 1st column is the Unicode scalar value. +# The 2nd column is the codepage byte sequence. +# The 3rd column is the fallback indicator. +# The fallback indicator can have one of the following values: +# |0 for exact 1-1 roundtrip mapping +# |1 for the best fallback codepage byte sequence. +# |2 for the substitution character +# |3 for the best reverse fallback Unicode scaler value +# +# Encoding description: Chinese Simplified (GB2312) +# Encoding name: gb2312 +# + "windows-936-2000" + 2 + 1 + "MBCS" + \x3F + "ASCII" +# Suggested ICU specific alias information +# "windows-936_VPUA" + + 0-80, 81-fe:1, ff + 40-7e, 80-fe + +# build an extension-only (delta) .cnv file +# requires the base .cnv file at runtime + "ibm-1386_P100-2002" + +# The following was the generated state table. +# This does not account for unassigned characters +# 0-80, 81-fe:1, ff +# 40-7e, 80-fe +# +CHARMAP + \x00 |0 + \x01 |0 + \x02 |0 + \x03 |0 + \x04 |0 + \x05 |0 + \x06 |0 + \x07 |0 + \x08 |0 + \x09 |0 + \x0A |0 + \x0B |0 + \x0C |0 + \x0D |0 + \x0E |0 + \x0F |0 + \x10 |0 + \x11 |0 + \x12 |0 + \x13 |0 + \x14 |0 + \x15 |0 + \x16 |0 + \x17 |0 + \x18 |0 + \x19 |0 + \x1A |0 + \x1B |0 + \x1C |0 + \x1D |0 + \x1E |0 + \x1F |0 + \x20 |0 + \x21 |0 + \x22 |0 + \x23 |0 + \x24 |0 + \x25 |0 + \x26 |0 + \x27 |0 + \x28 |0 + \x29 |0 + \x2A |0 + \x2B |0 + \x2C |0 + \x2D |0 + \x2E |0 + \x2F |0 + \x30 |0 + \x31 |0 + \x32 |0 + \x33 |0 + \x34 |0 + \x35 |0 + \x36 |0 + \x37 |0 + \x38 |0 + \x39 |0 + \x3A |0 + \x3B |0 + \x3C |0 + \x3D |0 + \x3E |0 + \x3F |0 + \x40 |0 + \x41 |0 + \x42 |0 + \x43 |0 + \x44 |0 + \x45 |0 + \x46 |0 + \x47 |0 + \x48 |0 + \x49 |0 + \x4A |0 + \x4B |0 + \x4C |0 + \x4D |0 + \x4E |0 + \x4F |0 + \x50 |0 + \x51 |0 + \x52 |0 + \x53 |0 + \x54 |0 + \x55 |0 + \x56 |0 + \x57 |0 + \x58 |0 + \x59 |0 + \x5A |0 + \x5B |0 + \x5C |0 + \x5D |0 + \x5E |0 + \x5F |0 + \x60 |0 + \x61 |0 + \x62 |0 + \x63 |0 + \x64 |0 + \x65 |0 + \x66 |0 + \x67 |0 + \x68 |0 + \x69 |0 + \x6A |0 + \x6B |0 + \x6C |0 + \x6D |0 + \x6E |0 + \x6F |0 + \x70 |0 + \x71 |0 + \x72 |0 + \x73 |0 + \x74 |0 + \x75 |0 + \x76 |0 + \x77 |0 + \x78 |0 + \x79 |0 + \x7A |0 + \x7B |0 + \x7C |0 + \x7D |0 + \x7E |0 + \x7F |0 + \xA1\xE9 |1 + \xA1\xEA |1 + \xA1\xE8 |0 + \xA3\xA4 |1 + \x7C |1 + \xA1\xEC |0 + \xA1\xA7 |0 + \x61 |1 + \x2D |1 + \xA1\xA5 |1 + \xA1\xE3 |0 + \xA1\xC0 |0 + \x32 |1 + \x33 |1 + \xA1\xE4 |1 + \xA6\xCC |1 + \xA1\xA4 |0 + \x31 |1 + \x6F |1 + \xA8\xA4 |1 + \xA8\xA2 |1 + \xA8\xA8 |1 + \xA8\xA6 |1 + \xA8\xBA |1 + \xA8\xAC |1 + \xA8\xAA |1 + \x44 |1 + \xA8\xB0 |1 + \xA8\xAE |1 + \xA1\xC1 |0 + \xA8\xB4 |1 + \xA8\xB2 |1 + \xA8\xB9 |1 + \x59 |1 + \x54 |1 + \xA8\xA4 |0 + \xA8\xA2 |0 + \x61 |1 + \xA8\xA8 |0 + \xA8\xA6 |0 + \xA8\xBA |0 + \xA8\xAC |0 + \xA8\xAA |0 + \x65 |1 + \xA8\xB0 |0 + \xA8\xAE |0 + \xA1\xC2 |0 + \xA8\xB4 |0 + \xA8\xB2 |0 + \xA8\xB9 |0 + \x79 |1 + \x74 |1 + \xA8\xA1 |1 + \xA8\xA1 |0 + \xA8\xA5 |1 + \xA8\xA5 |0 + \xA8\xA7 |1 + \xA8\xA7 |0 + \xA8\xA9 |1 + \xA8\xA9 |0 + \xA8\xBD |0 + \xA8\xBE |0 + \xA8\xAD |1 + \xA8\xAD |0 + \xA8\xB1 |1 + \xA8\xB1 |0 + \xA1\xCE |1 + \xA8\xA3 |1 + \xA8\xA3 |0 + \xA8\xAB |1 + \xA8\xAB |0 + \xA8\xAF |1 + \xA8\xAF |0 + \xA8\xB3 |1 + \xA8\xB3 |0 + \xA8\xB5 |1 + \xA8\xB5 |0 + \xA8\xB6 |1 + \xA8\xB6 |0 + \xA8\xB7 |1 + \xA8\xB7 |0 + \xA8\xB8 |1 + \xA8\xB8 |0 + \xA8\xBB |0 + \xA8\xC0 |0 + \xA1\xA6 |0 + \xA1\xA5 |0 + \xA8\x40 |0 + \xA8\x41 |0 + \xA8\x42 |0 + \xA6\xA1 |0 + \xA6\xA2 |0 + \xA6\xA3 |0 + \xA6\xA4 |0 + \xA6\xA5 |0 + \xA6\xA6 |0 + \xA6\xA7 |0 + \xA6\xA8 |0 + \xA6\xA9 |0 + \xA6\xAA |0 + \xA6\xAB |0 + \xA6\xAC |0 + \xA6\xAD |0 + \xA6\xAE |0 + \xA6\xAF |0 + \xA6\xB0 |0 + \xA6\xB1 |0 + \xA6\xB2 |0 + \xA6\xB3 |0 + \xA6\xB4 |0 + \xA6\xB5 |0 + \xA6\xB6 |0 + \xA6\xB7 |0 + \xA6\xB8 |0 + \xA6\xC1 |0 + \xA6\xC2 |0 + \xA6\xC3 |0 + \xA6\xC4 |0 + \xA6\xC5 |0 + \xA6\xC6 |0 + \xA6\xC7 |0 + \xA6\xC8 |0 + \xA6\xC9 |0 + \xA6\xCA |0 + \xA6\xCB |0 + \xA6\xCC |0 + \xA6\xCD |0 + \xA6\xCE |0 + \xA6\xCF |0 + \xA6\xD0 |0 + \xA6\xD1 |0 + \xA6\xD2 |0 + \xA6\xD3 |0 + \xA6\xD4 |0 + \xA6\xD5 |0 + \xA6\xD6 |0 + \xA6\xD7 |0 + \xA6\xD8 |0 + \xA7\xA7 |0 + \xA7\xA1 |0 + \xA7\xA2 |0 + \xA7\xA3 |0 + \xA7\xA4 |0 + \xA7\xA5 |0 + \xA7\xA6 |0 + \xA7\xA8 |0 + \xA7\xA9 |0 + \xA7\xAA |0 + \xA7\xAB |0 + \xA7\xAC |0 + \xA7\xAD |0 + \xA7\xAE |0 + \xA7\xAF |0 + \xA7\xB0 |0 + \xA7\xB1 |0 + \xA7\xB2 |0 + \xA7\xB3 |0 + \xA7\xB4 |0 + \xA7\xB5 |0 + \xA7\xB6 |0 + \xA7\xB7 |0 + \xA7\xB8 |0 + \xA7\xB9 |0 + \xA7\xBA |0 + \xA7\xBB |0 + \xA7\xBC |0 + \xA7\xBD |0 + \xA7\xBE |0 + \xA7\xBF |0 + \xA7\xC0 |0 + \xA7\xC1 |0 + \xA7\xD1 |0 + \xA7\xD2 |0 + \xA7\xD3 |0 + \xA7\xD4 |0 + \xA7\xD5 |0 + \xA7\xD6 |0 + \xA7\xD8 |0 + \xA7\xD9 |0 + \xA7\xDA |0 + \xA7\xDB |0 + \xA7\xDC |0 + \xA7\xDD |0 + \xA7\xDE |0 + \xA7\xDF |0 + \xA7\xE0 |0 + \xA7\xE1 |0 + \xA7\xE2 |0 + \xA7\xE3 |0 + \xA7\xE4 |0 + \xA7\xE5 |0 + \xA7\xE6 |0 + \xA7\xE7 |0 + \xA7\xE8 |0 + \xA7\xE9 |0 + \xA7\xEA |0 + \xA7\xEB |0 + \xA7\xEC |0 + \xA7\xED |0 + \xA7\xEE |0 + \xA7\xEF |0 + \xA7\xF0 |0 + \xA7\xF1 |0 + \xA7\xD7 |0 + \xA9\x5C |0 + \xA8\x43 |0 + \xA1\xAA |0 + \xA8\x44 |0 + \xA1\xAC |0 + \xA1\xAE |0 + \xA1\xAF |0 + \xA1\xB0 |0 + \xA1\xB1 |0 + \xA8\x45 |0 + \xA1\xAD |0 + \xA1\xEB |0 + \xA1\xE4 |0 + \xA1\xE5 |0 + \xA8\x46 |0 + \xA1\xF9 |0 + \xA3\xFE |1 + \x80 |0 + \xA1\xE6 |0 + \xA8\x47 |0 + \xA8\x48 |0 + \xA1\xED |0 + \xA9\x59 |0 + \xA2\xF1 |0 + \xA2\xF2 |0 + \xA2\xF3 |0 + \xA2\xF4 |0 + \xA2\xF5 |0 + \xA2\xF6 |0 + \xA2\xF7 |0 + \xA2\xF8 |0 + \xA2\xF9 |0 + \xA2\xFA |0 + \xA2\xFB |0 + \xA2\xFC |0 + \xA2\xA1 |0 + \xA2\xA2 |0 + \xA2\xA3 |0 + \xA2\xA4 |0 + \xA2\xA5 |0 + \xA2\xA6 |0 + \xA2\xA7 |0 + \xA2\xA8 |0 + \xA2\xA9 |0 + \xA2\xAA |0 + \xA1\xFB |0 + \xA1\xFC |0 + \xA1\xFA |0 + \xA1\xFD |0 + \xA8\x49 |0 + \xA8\x4A |0 + \xA8\x4B |0 + \xA8\x4C |0 + \xA1\xCA |0 + \xA1\xC7 |0 + \xA1\xC6 |0 + \xA8\x4D |0 + \xA1\xE3 |1 + \xA1\xCC |0 + \xA1\xD8 |0 + \xA1\xDE |0 + \xA8\x4E |0 + \xA1\xCF |0 + \xA8\x4F |0 + \xA1\xCE |0 + \xA1\xC4 |0 + \xA1\xC5 |0 + \xA1\xC9 |0 + \xA1\xC8 |0 + \xA1\xD2 |0 + \xA1\xD3 |0 + \xA1\xE0 |0 + \xA1\xDF |0 + \xA1\xC3 |0 + \xA1\xCB |0 + \xA1\xAB |1 + \xA1\xD7 |0 + \xA1\xD6 |0 + \xA1\xD5 |0 + \xA8\x50 |0 + \xA1\xD9 |0 + \xA1\xD4 |0 + \xA1\xDC |0 + \xA1\xDD |0 + \xA8\x51 |0 + \xA8\x52 |0 + \xA1\xDA |0 + \xA1\xDB |0 + \xA8\x92 |0 + \xA1\xD1 |0 + \xA1\xCD |0 + \xA8\x53 |0 + \xA1\xD0 |0 + \xA2\xD9 |0 + \xA2\xDA |0 + \xA2\xDB |0 + \xA2\xDC |0 + \xA2\xDD |0 + \xA2\xDE |0 + \xA2\xDF |0 + \xA2\xE0 |0 + \xA2\xE1 |0 + \xA2\xE2 |0 + \xA2\xC5 |0 + \xA2\xC6 |0 + \xA2\xC7 |0 + \xA2\xC8 |0 + \xA2\xC9 |0 + \xA2\xCA |0 + \xA2\xCB |0 + \xA2\xCC |0 + \xA2\xCD |0 + \xA2\xCE |0 + \xA2\xCF |0 + \xA2\xD0 |0 + \xA2\xD1 |0 + \xA2\xD2 |0 + \xA2\xD3 |0 + \xA2\xD4 |0 + \xA2\xD5 |0 + \xA2\xD6 |0 + \xA2\xD7 |0 + \xA2\xD8 |0 + \xA2\xB1 |0 + \xA2\xB2 |0 + \xA2\xB3 |0 + \xA2\xB4 |0 + \xA2\xB5 |0 + \xA2\xB6 |0 + \xA2\xB7 |0 + \xA2\xB8 |0 + \xA2\xB9 |0 + \xA2\xBA |0 + \xA2\xBB |0 + \xA2\xBC |0 + \xA2\xBD |0 + \xA2\xBE |0 + \xA2\xBF |0 + \xA2\xC0 |0 + \xA2\xC1 |0 + \xA2\xC2 |0 + \xA2\xC3 |0 + \xA2\xC4 |0 + \xA9\xA4 |0 + \xA9\xA5 |0 + \xA9\xA6 |0 + \xA9\xA7 |0 + \xA9\xA8 |0 + \xA9\xA9 |0 + \xA9\xAA |0 + \xA9\xAB |0 + \xA9\xAC |0 + \xA9\xAD |0 + \xA9\xAE |0 + \xA9\xAF |0 + \xA9\xB0 |0 + \xA9\xB1 |0 + \xA9\xB2 |0 + \xA9\xB3 |0 + \xA9\xB4 |0 + \xA9\xB5 |0 + \xA9\xB6 |0 + \xA9\xB7 |0 + \xA9\xB8 |0 + \xA9\xB9 |0 + \xA9\xBA |0 + \xA9\xBB |0 + \xA9\xBC |0 + \xA9\xBD |0 + \xA9\xBE |0 + \xA9\xBF |0 + \xA9\xC0 |0 + \xA9\xC1 |0 + \xA9\xC2 |0 + \xA9\xC3 |0 + \xA9\xC4 |0 + \xA9\xC5 |0 + \xA9\xC6 |0 + \xA9\xC7 |0 + \xA9\xC8 |0 + \xA9\xC9 |0 + \xA9\xCA |0 + \xA9\xCB |0 + \xA9\xCC |0 + \xA9\xCD |0 + \xA9\xCE |0 + \xA9\xCF |0 + \xA9\xD0 |0 + \xA9\xD1 |0 + \xA9\xD2 |0 + \xA9\xD3 |0 + \xA9\xD4 |0 + \xA9\xD5 |0 + \xA9\xD6 |0 + \xA9\xD7 |0 + \xA9\xD8 |0 + \xA9\xD9 |0 + \xA9\xDA |0 + \xA9\xDB |0 + \xA9\xDC |0 + \xA9\xDD |0 + \xA9\xDE |0 + \xA9\xDF |0 + \xA9\xE0 |0 + \xA9\xE1 |0 + \xA9\xE2 |0 + \xA9\xE3 |0 + \xA9\xE4 |0 + \xA9\xE5 |0 + \xA9\xE6 |0 + \xA9\xE7 |0 + \xA9\xE8 |0 + \xA9\xE9 |0 + \xA9\xEA |0 + \xA9\xEB |0 + \xA9\xEC |0 + \xA9\xED |0 + \xA9\xEE |0 + \xA9\xEF |0 + \xA8\x54 |0 + \xA8\x55 |0 + \xA8\x56 |0 + \xA8\x57 |0 + \xA8\x58 |0 + \xA8\x59 |0 + \xA8\x5A |0 + \xA8\x5B |0 + \xA8\x5C |0 + \xA8\x5D |0 + \xA8\x5E |0 + \xA8\x5F |0 + \xA8\x60 |0 + \xA8\x61 |0 + \xA8\x62 |0 + \xA8\x63 |0 + \xA8\x64 |0 + \xA8\x65 |0 + \xA8\x66 |0 + \xA8\x67 |0 + \xA8\x68 |0 + \xA8\x69 |0 + \xA8\x6A |0 + \xA8\x6B |0 + \xA8\x6C |0 + \xA8\x6D |0 + \xA8\x6E |0 + \xA8\x6F |0 + \xA8\x70 |0 + \xA8\x71 |0 + \xA8\x72 |0 + \xA8\x73 |0 + \xA8\x74 |0 + \xA8\x75 |0 + \xA8\x76 |0 + \xA8\x77 |0 + \xA8\x78 |0 + \xA8\x79 |0 + \xA8\x7A |0 + \xA8\x7B |0 + \xA8\x7C |0 + \xA8\x7D |0 + \xA8\x7E |0 + \xA8\x80 |0 + \xA8\x81 |0 + \xA8\x82 |0 + \xA8\x83 |0 + \xA8\x84 |0 + \xA8\x85 |0 + \xA8\x86 |0 + \xA8\x87 |0 + \xA8\x88 |0 + \xA8\x89 |0 + \xA8\x8A |0 + \xA1\xF6 |0 + \xA1\xF5 |0 + \xA1\xF8 |0 + \xA1\xF7 |0 + \xA8\x8B |0 + \xA8\x8C |0 + \xA1\xF4 |0 + \xA1\xF3 |0 + \xA1\xF0 |0 + \xA1\xF2 |0 + \xA1\xF1 |0 + \xA8\x8D |0 + \xA8\x8E |0 + \xA8\x8F |0 + \xA8\x90 |0 + \xA1\xEF |0 + \xA1\xEE |0 + \xA8\x91 |0 + \xA1\xE2 |0 + \xA1\xE1 |0 + \xA1\xA1 |0 + \xA1\xA2 |0 + \xA1\xA3 |0 + \xA1\xA8 |0 + \xA1\xA9 |0 + \xA9\x65 |0 + \xA9\x96 |0 + \xA1\xB4 |0 + \xA1\xB5 |0 + \xA1\xB6 |0 + \xA1\xB7 |0 + \xA1\xB8 |0 + \xA1\xB9 |0 + \xA1\xBA |0 + \xA1\xBB |0 + \xA1\xBE |0 + \xA1\xBF |0 + \xA8\x93 |0 + \xA1\xFE |0 + \xA1\xB2 |0 + \xA1\xB3 |0 + \xA1\xBC |0 + \xA1\xBD |0 + \xA8\x94 |0 + \xA8\x95 |0 + \xA9\x40 |0 + \xA9\x41 |0 + \xA9\x42 |0 + \xA9\x43 |0 + \xA9\x44 |0 + \xA9\x45 |0 + \xA9\x46 |0 + \xA9\x47 |0 + \xA9\x48 |0 + \xA4\xA1 |0 + \xA4\xA2 |0 + \xA4\xA3 |0 + \xA4\xA4 |0 + \xA4\xA5 |0 + \xA4\xA6 |0 + \xA4\xA7 |0 + \xA4\xA8 |0 + \xA4\xA9 |0 + \xA4\xAA |0 + \xA4\xAB |0 + \xA4\xAC |0 + \xA4\xAD |0 + \xA4\xAE |0 + \xA4\xAF |0 + \xA4\xB0 |0 + \xA4\xB1 |0 + \xA4\xB2 |0 + \xA4\xB3 |0 + \xA4\xB4 |0 + \xA4\xB5 |0 + \xA4\xB6 |0 + \xA4\xB7 |0 + \xA4\xB8 |0 + \xA4\xB9 |0 + \xA4\xBA |0 + \xA4\xBB |0 + \xA4\xBC |0 + \xA4\xBD |0 + \xA4\xBE |0 + \xA4\xBF |0 + \xA4\xC0 |0 + \xA4\xC1 |0 + \xA4\xC2 |0 + \xA4\xC3 |0 + \xA4\xC4 |0 + \xA4\xC5 |0 + \xA4\xC6 |0 + \xA4\xC7 |0 + \xA4\xC8 |0 + \xA4\xC9 |0 + \xA4\xCA |0 + \xA4\xCB |0 + \xA4\xCC |0 + \xA4\xCD |0 + \xA4\xCE |0 + \xA4\xCF |0 + \xA4\xD0 |0 + \xA4\xD1 |0 + \xA4\xD2 |0 + \xA4\xD3 |0 + \xA4\xD4 |0 + \xA4\xD5 |0 + \xA4\xD6 |0 + \xA4\xD7 |0 + \xA4\xD8 |0 + \xA4\xD9 |0 + \xA4\xDA |0 + \xA4\xDB |0 + \xA4\xDC |0 + \xA4\xDD |0 + \xA4\xDE |0 + \xA4\xDF |0 + \xA4\xE0 |0 + \xA4\xE1 |0 + \xA4\xE2 |0 + \xA4\xE3 |0 + \xA4\xE4 |0 + \xA4\xE5 |0 + \xA4\xE6 |0 + \xA4\xE7 |0 + \xA4\xE8 |0 + \xA4\xE9 |0 + \xA4\xEA |0 + \xA4\xEB |0 + \xA4\xEC |0 + \xA4\xED |0 + \xA4\xEE |0 + \xA4\xEF |0 + \xA4\xF0 |0 + \xA4\xF1 |0 + \xA4\xF2 |0 + \xA4\xF3 |0 + \xA9\x61 |0 + \xA9\x62 |0 + \xA9\x66 |0 + \xA9\x67 |0 + \xA5\xA1 |0 + \xA5\xA2 |0 + \xA5\xA3 |0 + \xA5\xA4 |0 + \xA5\xA5 |0 + \xA5\xA6 |0 + \xA5\xA7 |0 + \xA5\xA8 |0 + \xA5\xA9 |0 + \xA5\xAA |0 + \xA5\xAB |0 + \xA5\xAC |0 + \xA5\xAD |0 + \xA5\xAE |0 + \xA5\xAF |0 + \xA5\xB0 |0 + \xA5\xB1 |0 + \xA5\xB2 |0 + \xA5\xB3 |0 + \xA5\xB4 |0 + \xA5\xB5 |0 + \xA5\xB6 |0 + \xA5\xB7 |0 + \xA5\xB8 |0 + \xA5\xB9 |0 + \xA5\xBA |0 + \xA5\xBB |0 + \xA5\xBC |0 + \xA5\xBD |0 + \xA5\xBE |0 + \xA5\xBF |0 + \xA5\xC0 |0 + \xA5\xC1 |0 + \xA5\xC2 |0 + \xA5\xC3 |0 + \xA5\xC4 |0 + \xA5\xC5 |0 + \xA5\xC6 |0 + \xA5\xC7 |0 + \xA5\xC8 |0 + \xA5\xC9 |0 + \xA5\xCA |0 + \xA5\xCB |0 + \xA5\xCC |0 + \xA5\xCD |0 + \xA5\xCE |0 + \xA5\xCF |0 + \xA5\xD0 |0 + \xA5\xD1 |0 + \xA5\xD2 |0 + \xA5\xD3 |0 + \xA5\xD4 |0 + \xA5\xD5 |0 + \xA5\xD6 |0 + \xA5\xD7 |0 + \xA5\xD8 |0 + \xA5\xD9 |0 + \xA5\xDA |0 + \xA5\xDB |0 + \xA5\xDC |0 + \xA5\xDD |0 + \xA5\xDE |0 + \xA5\xDF |0 + \xA5\xE0 |0 + \xA5\xE1 |0 + \xA5\xE2 |0 + \xA5\xE3 |0 + \xA5\xE4 |0 + \xA5\xE5 |0 + \xA5\xE6 |0 + \xA5\xE7 |0 + \xA5\xE8 |0 + \xA5\xE9 |0 + \xA5\xEA |0 + \xA5\xEB |0 + \xA5\xEC |0 + \xA5\xED |0 + \xA5\xEE |0 + \xA5\xEF |0 + \xA5\xF0 |0 + \xA5\xF1 |0 + \xA5\xF2 |0 + \xA5\xF3 |0 + \xA5\xF4 |0 + \xA5\xF5 |0 + \xA5\xF6 |0 + \xA9\x60 |0 + \xA9\x63 |0 + \xA9\x64 |0 + \xA8\xC5 |0 + \xA8\xC6 |0 + \xA8\xC7 |0 + \xA8\xC8 |0 + \xA8\xC9 |0 + \xA8\xCA |0 + \xA8\xCB |0 + \xA8\xCC |0 + \xA8\xCD |0 + \xA8\xCE |0 + \xA8\xCF |0 + \xA8\xD0 |0 + \xA8\xD1 |0 + \xA8\xD2 |0 + \xA8\xD3 |0 + \xA8\xD4 |0 + \xA8\xD5 |0 + \xA8\xD6 |0 + \xA8\xD7 |0 + \xA8\xD8 |0 + \xA8\xD9 |0 + \xA8\xDA |0 + \xA8\xDB |0 + \xA8\xDC |0 + \xA8\xDD |0 + \xA8\xDE |0 + \xA8\xDF |0 + \xA8\xE0 |0 + \xA8\xE1 |0 + \xA8\xE2 |0 + \xA8\xE3 |0 + \xA8\xE4 |0 + \xA8\xE5 |0 + \xA8\xE6 |0 + \xA8\xE7 |0 + \xA8\xE8 |0 + \xA8\xE9 |0 + \xD2\xBB |1 + \xB6\xFE |1 + \xC8\xFD |1 + \xCB\xC4 |1 + \xC9\xCF |1 + \xD6\xD0 |1 + \xCF\xC2 |1 + \xBC\xD7 |1 + \xD2\xD2 |1 + \xB1\xFB |1 + \xB6\xA1 |1 + \xCC\xEC |1 + \xB5\xD8 |1 + \xC8\xCB |1 + \xA2\xE5 |0 + \xA2\xE6 |0 + \xA2\xE7 |0 + \xA2\xE8 |0 + \xA2\xE9 |0 + \xA2\xEA |0 + \xA2\xEB |0 + \xA2\xEC |0 + \xA2\xED |0 + \xA2\xEE |0 + \xD4\xC2 |1 + \xBB\xF0 |1 + \xCB\xAE |1 + \xC4\xBE |1 + \xBD\xF0 |1 + \xCD\xC1 |1 + \xC8\xD5 |1 + \xA9\x5A |0 + \xD3\xD0 |1 + \xC9\xE7 |1 + \xC3\xFB |1 + \xCC\xD8 |1 + \xB2\xC6 |1 + \xD7\xA3 |1 + \xC0\xCD |1 + \xB4\xFA |1 + \xBA\xF4 |1 + \xD1\xA7 |1 + \xBC\xE0 |1 + \xC6\xF3 |1 + \xD7\xCA |1 + \xD0\xAD |1 + \xBC\xC0 |1 + \xD0\xDD |1 + \xD7\xD4 |1 + \xD6\xC1 |1 + \xD2\xBB |1 + \xB6\xFE |1 + \xC8\xFD |1 + \xCB\xC4 |1 + \xCE\xE5 |1 + \xC1\xF9 |1 + \xC6\xDF |1 + \xB0\xCB |1 + \xBE\xC5 |1 + \xCA\xAE |1 + \xD4\xC2 |1 + \xBB\xF0 |1 + \xCB\xAE |1 + \xC4\xBE |1 + \xBD\xF0 |1 + \xCD\xC1 |1 + \xC8\xD5 |1 + \xD6\xEA |1 + \xD3\xD0 |1 + \xC9\xE7 |1 + \xC3\xFB |1 + \xCC\xD8 |1 + \xB2\xC6 |1 + \xD7\xA3 |1 + \xC0\xCD |1 + \xC3\xD8 |1 + \xC4\xD0 |1 + \xC5\xAE |1 + \xCA\xCA |1 + \xD3\xC5 |1 + \xD7\xA2 |1 + \xCF\xEE |1 + \xD0\xDD |1 + \xD0\xB4 |1 + \xA9\x49 |0 + \xD2\xBD |1 + \xD7\xDA |1 + \xD1\xA7 |1 + \xBC\xE0 |1 + \xC6\xF3 |1 + \xD7\xCA |1 + \xD0\xAD |1 + \xD2\xB9 |1 + \xA9\x4A |0 + \xA9\x4B |0 + \xA9\x4C |0 + \xA9\x4D |0 + \xA9\x4E |0 + \xA9\x4F |0 + \xA9\x50 |0 + \xA9\x51 |0 + \xA9\x52 |0 + \xA9\x53 |0 + \xA9\x54 |0 + \xD2\xBB |0 + \xB6\xA1 |0 + \x81\x40 |0 + \xC6\xDF |0 + \x81\x41 |0 + \x81\x42 |0 + \x81\x43 |0 + \xCD\xF2 |0 + \xD5\xC9 |0 + \xC8\xFD |0 + \xC9\xCF |0 + \xCF\xC2 |0 + \xD8\xA2 |0 + \xB2\xBB |0 + \xD3\xEB |0 + \x81\x44 |0 + \xD8\xA4 |0 + \xB3\xF3 |0 + \x81\x45 |0 + \xD7\xA8 |0 + \xC7\xD2 |0 + \xD8\xA7 |0 + \xCA\xC0 |0 + \x81\x46 |0 + \xC7\xF0 |0 + \xB1\xFB |0 + \xD2\xB5 |0 + \xB4\xD4 |0 + \xB6\xAB |0 + \xCB\xBF |0 + \xD8\xA9 |0 + \x81\x47 |0 + \x81\x48 |0 + \x81\x49 |0 + \xB6\xAA |0 + \x81\x4A |0 + \xC1\xBD |0 + \xD1\xCF |0 + \x81\x4B |0 + \xC9\xA5 |0 + \xD8\xAD |0 + \x81\x4C |0 + \xB8\xF6 |0 + \xD1\xBE |0 + \xE3\xDC |0 + \xD6\xD0 |0 + \x81\x4D |0 + \x81\x4E |0 + \xB7\xE1 |0 + \x81\x4F |0 + \xB4\xAE |0 + \x81\x50 |0 + \xC1\xD9 |0 + \x81\x51 |0 + \xD8\xBC |0 + \x81\x52 |0 + \xCD\xE8 |0 + \xB5\xA4 |0 + \xCE\xAA |0 + \xD6\xF7 |0 + \x81\x53 |0 + \xC0\xF6 |0 + \xBE\xD9 |0 + \xD8\xAF |0 + \x81\x54 |0 + \x81\x55 |0 + \x81\x56 |0 + \xC4\xCB |0 + \x81\x57 |0 + \xBE\xC3 |0 + \x81\x58 |0 + \xD8\xB1 |0 + \xC3\xB4 |0 + \xD2\xE5 |0 + \x81\x59 |0 + \xD6\xAE |0 + \xCE\xDA |0 + \xD5\xA7 |0 + \xBA\xF5 |0 + \xB7\xA6 |0 + \xC0\xD6 |0 + \x81\x5A |0 + \xC6\xB9 |0 + \xC5\xD2 |0 + \xC7\xC7 |0 + \x81\x5B |0 + \xB9\xD4 |0 + \x81\x5C |0 + \xB3\xCB |0 + \xD2\xD2 |0 + \x81\x5D |0 + \x81\x5E |0 + \xD8\xBF |0 + \xBE\xC5 |0 + \xC6\xF2 |0 + \xD2\xB2 |0 + \xCF\xB0 |0 + \xCF\xE7 |0 + \x81\x5F |0 + \x81\x60 |0 + \x81\x61 |0 + \x81\x62 |0 + \xCA\xE9 |0 + \x81\x63 |0 + \x81\x64 |0 + \xD8\xC0 |0 + \x81\x65 |0 + \x81\x66 |0 + \x81\x67 |0 + \x81\x68 |0 + \x81\x69 |0 + \x81\x6A |0 + \xC2\xF2 |0 + \xC2\xD2 |0 + \x81\x6B |0 + \xC8\xE9 |0 + \x81\x6C |0 + \x81\x6D |0 + \x81\x6E |0 + \x81\x6F |0 + \x81\x70 |0 + \x81\x71 |0 + \x81\x72 |0 + \x81\x73 |0 + \x81\x74 |0 + \x81\x75 |0 + \xC7\xAC |0 + \x81\x76 |0 + \x81\x77 |0 + \x81\x78 |0 + \x81\x79 |0 + \x81\x7A |0 + \x81\x7B |0 + \x81\x7C |0 + \xC1\xCB |0 + \x81\x7D |0 + \xD3\xE8 |0 + \xD5\xF9 |0 + \x81\x7E |0 + \xCA\xC2 |0 + \xB6\xFE |0 + \xD8\xA1 |0 + \xD3\xDA |0 + \xBF\xF7 |0 + \x81\x80 |0 + \xD4\xC6 |0 + \xBB\xA5 |0 + \xD8\xC1 |0 + \xCE\xE5 |0 + \xBE\xAE |0 + \x81\x81 |0 + \x81\x82 |0 + \xD8\xA8 |0 + \x81\x83 |0 + \xD1\xC7 |0 + \xD0\xA9 |0 + \x81\x84 |0 + \x81\x85 |0 + \x81\x86 |0 + \xD8\xBD |0 + \xD9\xEF |0 + \xCD\xF6 |0 + \xBF\xBA |0 + \x81\x87 |0 + \xBD\xBB |0 + \xBA\xA5 |0 + \xD2\xE0 |0 + \xB2\xFA |0 + \xBA\xE0 |0 + \xC4\xB6 |0 + \x81\x88 |0 + \xCF\xED |0 + \xBE\xA9 |0 + \xCD\xA4 |0 + \xC1\xC1 |0 + \x81\x89 |0 + \x81\x8A |0 + \x81\x8B |0 + \xC7\xD7 |0 + \xD9\xF1 |0 + \x81\x8C |0 + \xD9\xF4 |0 + \x81\x8D |0 + \x81\x8E |0 + \x81\x8F |0 + \x81\x90 |0 + \xC8\xCB |0 + \xD8\xE9 |0 + \x81\x91 |0 + \x81\x92 |0 + \x81\x93 |0 + \xD2\xDA |0 + \xCA\xB2 |0 + \xC8\xCA |0 + \xD8\xEC |0 + \xD8\xEA |0 + \xD8\xC6 |0 + \xBD\xF6 |0 + \xC6\xCD |0 + \xB3\xF0 |0 + \x81\x94 |0 + \xD8\xEB |0 + \xBD\xF1 |0 + \xBD\xE9 |0 + \x81\x95 |0 + \xC8\xD4 |0 + \xB4\xD3 |0 + \x81\x96 |0 + \x81\x97 |0 + \xC2\xD8 |0 + \x81\x98 |0 + \xB2\xD6 |0 + \xD7\xD0 |0 + \xCA\xCB |0 + \xCB\xFB |0 + \xD5\xCC |0 + \xB8\xB6 |0 + \xCF\xC9 |0 + \x81\x99 |0 + \x81\x9A |0 + \x81\x9B |0 + \xD9\xDA |0 + \xD8\xF0 |0 + \xC7\xAA |0 + \x81\x9C |0 + \xD8\xEE |0 + \x81\x9D |0 + \xB4\xFA |0 + \xC1\xEE |0 + \xD2\xD4 |0 + \x81\x9E |0 + \x81\x9F |0 + \xD8\xED |0 + \x81\xA0 |0 + \xD2\xC7 |0 + \xD8\xEF |0 + \xC3\xC7 |0 + \x81\xA1 |0 + \x81\xA2 |0 + \x81\xA3 |0 + \xD1\xF6 |0 + \x81\xA4 |0 + \xD6\xD9 |0 + \xD8\xF2 |0 + \x81\xA5 |0 + \xD8\xF5 |0 + \xBC\xFE |0 + \xBC\xDB |0 + \x81\xA6 |0 + \x81\xA7 |0 + \x81\xA8 |0 + \xC8\xCE |0 + \x81\xA9 |0 + \xB7\xDD |0 + \x81\xAA |0 + \xB7\xC2 |0 + \x81\xAB |0 + \xC6\xF3 |0 + \x81\xAC |0 + \x81\xAD |0 + \x81\xAE |0 + \x81\xAF |0 + \x81\xB0 |0 + \x81\xB1 |0 + \x81\xB2 |0 + \xD8\xF8 |0 + \xD2\xC1 |0 + \x81\xB3 |0 + \x81\xB4 |0 + \xCE\xE9 |0 + \xBC\xBF |0 + \xB7\xFC |0 + \xB7\xA5 |0 + \xD0\xDD |0 + \x81\xB5 |0 + \x81\xB6 |0 + \x81\xB7 |0 + \x81\xB8 |0 + \x81\xB9 |0 + \xD6\xDA |0 + \xD3\xC5 |0 + \xBB\xEF |0 + \xBB\xE1 |0 + \xD8\xF1 |0 + \x81\xBA |0 + \x81\xBB |0 + \xC9\xA1 |0 + \xCE\xB0 |0 + \xB4\xAB |0 + \x81\xBC |0 + \xD8\xF3 |0 + \x81\xBD |0 + \xC9\xCB |0 + \xD8\xF6 |0 + \xC2\xD7 |0 + \xD8\xF7 |0 + \x81\xBE |0 + \x81\xBF |0 + \xCE\xB1 |0 + \xD8\xF9 |0 + \x81\xC0 |0 + \x81\xC1 |0 + \x81\xC2 |0 + \xB2\xAE |0 + \xB9\xC0 |0 + \x81\xC3 |0 + \xD9\xA3 |0 + \x81\xC4 |0 + \xB0\xE9 |0 + \x81\xC5 |0 + \xC1\xE6 |0 + \x81\xC6 |0 + \xC9\xEC |0 + \x81\xC7 |0 + \xCB\xC5 |0 + \x81\xC8 |0 + \xCB\xC6 |0 + \xD9\xA4 |0 + \x81\xC9 |0 + \x81\xCA |0 + \x81\xCB |0 + \x81\xCC |0 + \x81\xCD |0 + \xB5\xE8 |0 + \x81\xCE |0 + \x81\xCF |0 + \xB5\xAB |0 + \x81\xD0 |0 + \x81\xD1 |0 + \x81\xD2 |0 + \x81\xD3 |0 + \x81\xD4 |0 + \x81\xD5 |0 + \xCE\xBB |0 + \xB5\xCD |0 + \xD7\xA1 |0 + \xD7\xF4 |0 + \xD3\xD3 |0 + \x81\xD6 |0 + \xCC\xE5 |0 + \x81\xD7 |0 + \xBA\xCE |0 + \x81\xD8 |0 + \xD9\xA2 |0 + \xD9\xDC |0 + \xD3\xE0 |0 + \xD8\xFD |0 + \xB7\xF0 |0 + \xD7\xF7 |0 + \xD8\xFE |0 + \xD8\xFA |0 + \xD9\xA1 |0 + \xC4\xE3 |0 + \x81\xD9 |0 + \x81\xDA |0 + \xD3\xB6 |0 + \xD8\xF4 |0 + \xD9\xDD |0 + \x81\xDB |0 + \xD8\xFB |0 + \x81\xDC |0 + \xC5\xE5 |0 + \x81\xDD |0 + \x81\xDE |0 + \xC0\xD0 |0 + \x81\xDF |0 + \x81\xE0 |0 + \xD1\xF0 |0 + \xB0\xDB |0 + \x81\xE1 |0 + \x81\xE2 |0 + \xBC\xD1 |0 + \xD9\xA6 |0 + \x81\xE3 |0 + \xD9\xA5 |0 + \x81\xE4 |0 + \x81\xE5 |0 + \x81\xE6 |0 + \x81\xE7 |0 + \xD9\xAC |0 + \xD9\xAE |0 + \x81\xE8 |0 + \xD9\xAB |0 + \xCA\xB9 |0 + \x81\xE9 |0 + \x81\xEA |0 + \x81\xEB |0 + \xD9\xA9 |0 + \xD6\xB6 |0 + \x81\xEC |0 + \x81\xED |0 + \x81\xEE |0 + \xB3\xDE |0 + \xD9\xA8 |0 + \x81\xEF |0 + \xC0\xFD |0 + \x81\xF0 |0 + \xCA\xCC |0 + \x81\xF1 |0 + \xD9\xAA |0 + \x81\xF2 |0 + \xD9\xA7 |0 + \x81\xF3 |0 + \x81\xF4 |0 + \xD9\xB0 |0 + \x81\xF5 |0 + \x81\xF6 |0 + \xB6\xB1 |0 + \x81\xF7 |0 + \x81\xF8 |0 + \x81\xF9 |0 + \xB9\xA9 |0 + \x81\xFA |0 + \xD2\xC0 |0 + \x81\xFB |0 + \x81\xFC |0 + \xCF\xC0 |0 + \x81\xFD |0 + \x81\xFE |0 + \xC2\xC2 |0 + \x82\x40 |0 + \xBD\xC4 |0 + \xD5\xEC |0 + \xB2\xE0 |0 + \xC7\xC8 |0 + \xBF\xEB |0 + \xD9\xAD |0 + \x82\x41 |0 + \xD9\xAF |0 + \x82\x42 |0 + \xCE\xEA |0 + \xBA\xEE |0 + \x82\x43 |0 + \x82\x44 |0 + \x82\x45 |0 + \x82\x46 |0 + \x82\x47 |0 + \xC7\xD6 |0 + \x82\x48 |0 + \x82\x49 |0 + \x82\x4A |0 + \x82\x4B |0 + \x82\x4C |0 + \x82\x4D |0 + \x82\x4E |0 + \x82\x4F |0 + \x82\x50 |0 + \xB1\xE3 |0 + \x82\x51 |0 + \x82\x52 |0 + \x82\x53 |0 + \xB4\xD9 |0 + \xB6\xED |0 + \xD9\xB4 |0 + \x82\x54 |0 + \x82\x55 |0 + \x82\x56 |0 + \x82\x57 |0 + \xBF\xA1 |0 + \x82\x58 |0 + \x82\x59 |0 + \x82\x5A |0 + \xD9\xDE |0 + \xC7\xCE |0 + \xC0\xFE |0 + \xD9\xB8 |0 + \x82\x5B |0 + \x82\x5C |0 + \x82\x5D |0 + \x82\x5E |0 + \x82\x5F |0 + \xCB\xD7 |0 + \xB7\xFD |0 + \x82\x60 |0 + \xD9\xB5 |0 + \x82\x61 |0 + \xD9\xB7 |0 + \xB1\xA3 |0 + \xD3\xE1 |0 + \xD9\xB9 |0 + \x82\x62 |0 + \xD0\xC5 |0 + \x82\x63 |0 + \xD9\xB6 |0 + \x82\x64 |0 + \x82\x65 |0 + \xD9\xB1 |0 + \x82\x66 |0 + \xD9\xB2 |0 + \xC1\xA9 |0 + \xD9\xB3 |0 + \x82\x67 |0 + \x82\x68 |0 + \xBC\xF3 |0 + \xD0\xDE |0 + \xB8\xA9 |0 + \x82\x69 |0 + \xBE\xE3 |0 + \x82\x6A |0 + \xD9\xBD |0 + \x82\x6B |0 + \x82\x6C |0 + \x82\x6D |0 + \x82\x6E |0 + \xD9\xBA |0 + \x82\x6F |0 + \xB0\xB3 |0 + \x82\x70 |0 + \x82\x71 |0 + \x82\x72 |0 + \xD9\xC2 |0 + \x82\x73 |0 + \x82\x74 |0 + \x82\x75 |0 + \x82\x76 |0 + \x82\x77 |0 + \x82\x78 |0 + \x82\x79 |0 + \x82\x7A |0 + \x82\x7B |0 + \x82\x7C |0 + \x82\x7D |0 + \x82\x7E |0 + \x82\x80 |0 + \xD9\xC4 |0 + \xB1\xB6 |0 + \x82\x81 |0 + \xD9\xBF |0 + \x82\x82 |0 + \x82\x83 |0 + \xB5\xB9 |0 + \x82\x84 |0 + \xBE\xF3 |0 + \x82\x85 |0 + \x82\x86 |0 + \x82\x87 |0 + \xCC\xC8 |0 + \xBA\xF2 |0 + \xD2\xD0 |0 + \x82\x88 |0 + \xD9\xC3 |0 + \x82\x89 |0 + \x82\x8A |0 + \xBD\xE8 |0 + \x82\x8B |0 + \xB3\xAB |0 + \x82\x8C |0 + \x82\x8D |0 + \x82\x8E |0 + \xD9\xC5 |0 + \xBE\xEB |0 + \x82\x8F |0 + \xD9\xC6 |0 + \xD9\xBB |0 + \xC4\xDF |0 + \x82\x90 |0 + \xD9\xBE |0 + \xD9\xC1 |0 + \xD9\xC0 |0 + \x82\x91 |0 + \x82\x92 |0 + \x82\x93 |0 + \x82\x94 |0 + \x82\x95 |0 + \x82\x96 |0 + \x82\x97 |0 + \x82\x98 |0 + \x82\x99 |0 + \x82\x9A |0 + \x82\x9B |0 + \xD5\xAE |0 + \x82\x9C |0 + \xD6\xB5 |0 + \x82\x9D |0 + \xC7\xE3 |0 + \x82\x9E |0 + \x82\x9F |0 + \x82\xA0 |0 + \x82\xA1 |0 + \xD9\xC8 |0 + \x82\xA2 |0 + \x82\xA3 |0 + \x82\xA4 |0 + \xBC\xD9 |0 + \xD9\xCA |0 + \x82\xA5 |0 + \x82\xA6 |0 + \x82\xA7 |0 + \xD9\xBC |0 + \x82\xA8 |0 + \xD9\xCB |0 + \xC6\xAB |0 + \x82\xA9 |0 + \x82\xAA |0 + \x82\xAB |0 + \x82\xAC |0 + \x82\xAD |0 + \xD9\xC9 |0 + \x82\xAE |0 + \x82\xAF |0 + \x82\xB0 |0 + \x82\xB1 |0 + \xD7\xF6 |0 + \x82\xB2 |0 + \xCD\xA3 |0 + \x82\xB3 |0 + \x82\xB4 |0 + \x82\xB5 |0 + \x82\xB6 |0 + \x82\xB7 |0 + \x82\xB8 |0 + \x82\xB9 |0 + \x82\xBA |0 + \xBD\xA1 |0 + \x82\xBB |0 + \x82\xBC |0 + \x82\xBD |0 + \x82\xBE |0 + \x82\xBF |0 + \x82\xC0 |0 + \xD9\xCC |0 + \x82\xC1 |0 + \x82\xC2 |0 + \x82\xC3 |0 + \x82\xC4 |0 + \x82\xC5 |0 + \x82\xC6 |0 + \x82\xC7 |0 + \x82\xC8 |0 + \x82\xC9 |0 + \xC5\xBC |0 + \xCD\xB5 |0 + \x82\xCA |0 + \x82\xCB |0 + \x82\xCC |0 + \xD9\xCD |0 + \x82\xCD |0 + \x82\xCE |0 + \xD9\xC7 |0 + \xB3\xA5 |0 + \xBF\xFE |0 + \x82\xCF |0 + \x82\xD0 |0 + \x82\xD1 |0 + \x82\xD2 |0 + \xB8\xB5 |0 + \x82\xD3 |0 + \x82\xD4 |0 + \xC0\xFC |0 + \x82\xD5 |0 + \x82\xD6 |0 + \x82\xD7 |0 + \x82\xD8 |0 + \xB0\xF8 |0 + \x82\xD9 |0 + \x82\xDA |0 + \x82\xDB |0 + \x82\xDC |0 + \x82\xDD |0 + \x82\xDE |0 + \x82\xDF |0 + \x82\xE0 |0 + \x82\xE1 |0 + \x82\xE2 |0 + \x82\xE3 |0 + \x82\xE4 |0 + \x82\xE5 |0 + \x82\xE6 |0 + \x82\xE7 |0 + \x82\xE8 |0 + \x82\xE9 |0 + \x82\xEA |0 + \x82\xEB |0 + \x82\xEC |0 + \x82\xED |0 + \xB4\xF6 |0 + \x82\xEE |0 + \xD9\xCE |0 + \x82\xEF |0 + \xD9\xCF |0 + \xB4\xA2 |0 + \xD9\xD0 |0 + \x82\xF0 |0 + \x82\xF1 |0 + \xB4\xDF |0 + \x82\xF2 |0 + \x82\xF3 |0 + \x82\xF4 |0 + \x82\xF5 |0 + \x82\xF6 |0 + \xB0\xC1 |0 + \x82\xF7 |0 + \x82\xF8 |0 + \x82\xF9 |0 + \x82\xFA |0 + \x82\xFB |0 + \x82\xFC |0 + \x82\xFD |0 + \xD9\xD1 |0 + \xC9\xB5 |0 + \x82\xFE |0 + \x83\x40 |0 + \x83\x41 |0 + \x83\x42 |0 + \x83\x43 |0 + \x83\x44 |0 + \x83\x45 |0 + \x83\x46 |0 + \x83\x47 |0 + \x83\x48 |0 + \x83\x49 |0 + \x83\x4A |0 + \x83\x4B |0 + \x83\x4C |0 + \x83\x4D |0 + \x83\x4E |0 + \x83\x4F |0 + \x83\x50 |0 + \x83\x51 |0 + \xCF\xF1 |0 + \x83\x52 |0 + \x83\x53 |0 + \x83\x54 |0 + \x83\x55 |0 + \x83\x56 |0 + \x83\x57 |0 + \xD9\xD2 |0 + \x83\x58 |0 + \x83\x59 |0 + \x83\x5A |0 + \xC1\xC5 |0 + \x83\x5B |0 + \x83\x5C |0 + \x83\x5D |0 + \x83\x5E |0 + \x83\x5F |0 + \x83\x60 |0 + \x83\x61 |0 + \x83\x62 |0 + \x83\x63 |0 + \x83\x64 |0 + \x83\x65 |0 + \xD9\xD6 |0 + \xC9\xAE |0 + \x83\x66 |0 + \x83\x67 |0 + \x83\x68 |0 + \x83\x69 |0 + \xD9\xD5 |0 + \xD9\xD4 |0 + \xD9\xD7 |0 + \x83\x6A |0 + \x83\x6B |0 + \x83\x6C |0 + \x83\x6D |0 + \xCB\xDB |0 + \x83\x6E |0 + \xBD\xA9 |0 + \x83\x6F |0 + \x83\x70 |0 + \x83\x71 |0 + \x83\x72 |0 + \x83\x73 |0 + \xC6\xA7 |0 + \x83\x74 |0 + \x83\x75 |0 + \x83\x76 |0 + \x83\x77 |0 + \x83\x78 |0 + \x83\x79 |0 + \x83\x7A |0 + \x83\x7B |0 + \x83\x7C |0 + \x83\x7D |0 + \xD9\xD3 |0 + \xD9\xD8 |0 + \x83\x7E |0 + \x83\x80 |0 + \x83\x81 |0 + \xD9\xD9 |0 + \x83\x82 |0 + \x83\x83 |0 + \x83\x84 |0 + \x83\x85 |0 + \x83\x86 |0 + \x83\x87 |0 + \xC8\xE5 |0 + \x83\x88 |0 + \x83\x89 |0 + \x83\x8A |0 + \x83\x8B |0 + \x83\x8C |0 + \x83\x8D |0 + \x83\x8E |0 + \x83\x8F |0 + \x83\x90 |0 + \x83\x91 |0 + \x83\x92 |0 + \x83\x93 |0 + \x83\x94 |0 + \x83\x95 |0 + \xC0\xDC |0 + \x83\x96 |0 + \x83\x97 |0 + \x83\x98 |0 + \x83\x99 |0 + \x83\x9A |0 + \x83\x9B |0 + \x83\x9C |0 + \x83\x9D |0 + \x83\x9E |0 + \x83\x9F |0 + \x83\xA0 |0 + \x83\xA1 |0 + \x83\xA2 |0 + \x83\xA3 |0 + \x83\xA4 |0 + \x83\xA5 |0 + \x83\xA6 |0 + \x83\xA7 |0 + \x83\xA8 |0 + \x83\xA9 |0 + \x83\xAA |0 + \x83\xAB |0 + \x83\xAC |0 + \x83\xAD |0 + \x83\xAE |0 + \x83\xAF |0 + \x83\xB0 |0 + \x83\xB1 |0 + \x83\xB2 |0 + \xB6\xF9 |0 + \xD8\xA3 |0 + \xD4\xCA |0 + \x83\xB3 |0 + \xD4\xAA |0 + \xD0\xD6 |0 + \xB3\xE4 |0 + \xD5\xD7 |0 + \x83\xB4 |0 + \xCF\xC8 |0 + \xB9\xE2 |0 + \x83\xB5 |0 + \xBF\xCB |0 + \x83\xB6 |0 + \xC3\xE2 |0 + \x83\xB7 |0 + \x83\xB8 |0 + \x83\xB9 |0 + \xB6\xD2 |0 + \x83\xBA |0 + \x83\xBB |0 + \xCD\xC3 |0 + \xD9\xEE |0 + \xD9\xF0 |0 + \x83\xBC |0 + \x83\xBD |0 + \x83\xBE |0 + \xB5\xB3 |0 + \x83\xBF |0 + \xB6\xB5 |0 + \x83\xC0 |0 + \x83\xC1 |0 + \x83\xC2 |0 + \x83\xC3 |0 + \x83\xC4 |0 + \xBE\xA4 |0 + \x83\xC5 |0 + \x83\xC6 |0 + \xC8\xEB |0 + \x83\xC7 |0 + \x83\xC8 |0 + \xC8\xAB |0 + \x83\xC9 |0 + \x83\xCA |0 + \xB0\xCB |0 + \xB9\xAB |0 + \xC1\xF9 |0 + \xD9\xE2 |0 + \x83\xCB |0 + \xC0\xBC |0 + \xB9\xB2 |0 + \x83\xCC |0 + \xB9\xD8 |0 + \xD0\xCB |0 + \xB1\xF8 |0 + \xC6\xE4 |0 + \xBE\xDF |0 + \xB5\xE4 |0 + \xD7\xC8 |0 + \x83\xCD |0 + \xD1\xF8 |0 + \xBC\xE6 |0 + \xCA\xDE |0 + \x83\xCE |0 + \x83\xCF |0 + \xBC\xBD |0 + \xD9\xE6 |0 + \xD8\xE7 |0 + \x83\xD0 |0 + \x83\xD1 |0 + \xC4\xDA |0 + \x83\xD2 |0 + \x83\xD3 |0 + \xB8\xD4 |0 + \xC8\xBD |0 + \x83\xD4 |0 + \x83\xD5 |0 + \xB2\xE1 |0 + \xD4\xD9 |0 + \x83\xD6 |0 + \x83\xD7 |0 + \x83\xD8 |0 + \x83\xD9 |0 + \xC3\xB0 |0 + \x83\xDA |0 + \x83\xDB |0 + \xC3\xE1 |0 + \xDA\xA2 |0 + \xC8\xDF |0 + \x83\xDC |0 + \xD0\xB4 |0 + \x83\xDD |0 + \xBE\xFC |0 + \xC5\xA9 |0 + \x83\xDE |0 + \x83\xDF |0 + \x83\xE0 |0 + \xB9\xDA |0 + \x83\xE1 |0 + \xDA\xA3 |0 + \x83\xE2 |0 + \xD4\xA9 |0 + \xDA\xA4 |0 + \x83\xE3 |0 + \x83\xE4 |0 + \x83\xE5 |0 + \x83\xE6 |0 + \x83\xE7 |0 + \xD9\xFB |0 + \xB6\xAC |0 + \x83\xE8 |0 + \x83\xE9 |0 + \xB7\xEB |0 + \xB1\xF9 |0 + \xD9\xFC |0 + \xB3\xE5 |0 + \xBE\xF6 |0 + \x83\xEA |0 + \xBF\xF6 |0 + \xD2\xB1 |0 + \xC0\xE4 |0 + \x83\xEB |0 + \x83\xEC |0 + \x83\xED |0 + \xB6\xB3 |0 + \xD9\xFE |0 + \xD9\xFD |0 + \x83\xEE |0 + \x83\xEF |0 + \xBE\xBB |0 + \x83\xF0 |0 + \x83\xF1 |0 + \x83\xF2 |0 + \xC6\xE0 |0 + \x83\xF3 |0 + \xD7\xBC |0 + \xDA\xA1 |0 + \x83\xF4 |0 + \xC1\xB9 |0 + \x83\xF5 |0 + \xB5\xF2 |0 + \xC1\xE8 |0 + \x83\xF6 |0 + \x83\xF7 |0 + \xBC\xF5 |0 + \x83\xF8 |0 + \xB4\xD5 |0 + \x83\xF9 |0 + \x83\xFA |0 + \x83\xFB |0 + \x83\xFC |0 + \x83\xFD |0 + \x83\xFE |0 + \x84\x40 |0 + \x84\x41 |0 + \x84\x42 |0 + \xC1\xDD |0 + \x84\x43 |0 + \xC4\xFD |0 + \x84\x44 |0 + \x84\x45 |0 + \xBC\xB8 |0 + \xB7\xB2 |0 + \x84\x46 |0 + \x84\x47 |0 + \xB7\xEF |0 + \x84\x48 |0 + \x84\x49 |0 + \x84\x4A |0 + \x84\x4B |0 + \x84\x4C |0 + \x84\x4D |0 + \xD9\xEC |0 + \x84\x4E |0 + \xC6\xBE |0 + \x84\x4F |0 + \xBF\xAD |0 + \xBB\xCB |0 + \x84\x50 |0 + \x84\x51 |0 + \xB5\xCA |0 + \x84\x52 |0 + \xDB\xC9 |0 + \xD0\xD7 |0 + \x84\x53 |0 + \xCD\xB9 |0 + \xB0\xBC |0 + \xB3\xF6 |0 + \xBB\xF7 |0 + \xDB\xCA |0 + \xBA\xAF |0 + \x84\x54 |0 + \xD4\xE4 |0 + \xB5\xB6 |0 + \xB5\xF3 |0 + \xD8\xD6 |0 + \xC8\xD0 |0 + \x84\x55 |0 + \x84\x56 |0 + \xB7\xD6 |0 + \xC7\xD0 |0 + \xD8\xD7 |0 + \x84\x57 |0 + \xBF\xAF |0 + \x84\x58 |0 + \x84\x59 |0 + \xDB\xBB |0 + \xD8\xD8 |0 + \x84\x5A |0 + \x84\x5B |0 + \xD0\xCC |0 + \xBB\xAE |0 + \x84\x5C |0 + \x84\x5D |0 + \x84\x5E |0 + \xEB\xBE |0 + \xC1\xD0 |0 + \xC1\xF5 |0 + \xD4\xF2 |0 + \xB8\xD5 |0 + \xB4\xB4 |0 + \x84\x5F |0 + \xB3\xF5 |0 + \x84\x60 |0 + \x84\x61 |0 + \xC9\xBE |0 + \x84\x62 |0 + \x84\x63 |0 + \x84\x64 |0 + \xC5\xD0 |0 + \x84\x65 |0 + \x84\x66 |0 + \x84\x67 |0 + \xC5\xD9 |0 + \xC0\xFB |0 + \x84\x68 |0 + \xB1\xF0 |0 + \x84\x69 |0 + \xD8\xD9 |0 + \xB9\xCE |0 + \x84\x6A |0 + \xB5\xBD |0 + \x84\x6B |0 + \x84\x6C |0 + \xD8\xDA |0 + \x84\x6D |0 + \x84\x6E |0 + \xD6\xC6 |0 + \xCB\xA2 |0 + \xC8\xAF |0 + \xC9\xB2 |0 + \xB4\xCC |0 + \xBF\xCC |0 + \x84\x6F |0 + \xB9\xF4 |0 + \x84\x70 |0 + \xD8\xDB |0 + \xD8\xDC |0 + \xB6\xE7 |0 + \xBC\xC1 |0 + \xCC\xEA |0 + \x84\x71 |0 + \x84\x72 |0 + \x84\x73 |0 + \x84\x74 |0 + \x84\x75 |0 + \x84\x76 |0 + \xCF\xF7 |0 + \x84\x77 |0 + \xD8\xDD |0 + \xC7\xB0 |0 + \x84\x78 |0 + \x84\x79 |0 + \xB9\xD0 |0 + \xBD\xA3 |0 + \x84\x7A |0 + \x84\x7B |0 + \xCC\xDE |0 + \x84\x7C |0 + \xC6\xCA |0 + \x84\x7D |0 + \x84\x7E |0 + \x84\x80 |0 + \x84\x81 |0 + \x84\x82 |0 + \xD8\xE0 |0 + \x84\x83 |0 + \xD8\xDE |0 + \x84\x84 |0 + \x84\x85 |0 + \xD8\xDF |0 + \x84\x86 |0 + \x84\x87 |0 + \x84\x88 |0 + \xB0\xFE |0 + \x84\x89 |0 + \xBE\xE7 |0 + \x84\x8A |0 + \xCA\xA3 |0 + \xBC\xF4 |0 + \x84\x8B |0 + \x84\x8C |0 + \x84\x8D |0 + \x84\x8E |0 + \xB8\xB1 |0 + \x84\x8F |0 + \x84\x90 |0 + \xB8\xEE |0 + \x84\x91 |0 + \x84\x92 |0 + \x84\x93 |0 + \x84\x94 |0 + \x84\x95 |0 + \x84\x96 |0 + \x84\x97 |0 + \x84\x98 |0 + \x84\x99 |0 + \x84\x9A |0 + \xD8\xE2 |0 + \x84\x9B |0 + \xBD\xCB |0 + \x84\x9C |0 + \xD8\xE4 |0 + \xD8\xE3 |0 + \x84\x9D |0 + \x84\x9E |0 + \x84\x9F |0 + \x84\xA0 |0 + \x84\xA1 |0 + \xC5\xFC |0 + \x84\xA2 |0 + \x84\xA3 |0 + \x84\xA4 |0 + \x84\xA5 |0 + \x84\xA6 |0 + \x84\xA7 |0 + \x84\xA8 |0 + \xD8\xE5 |0 + \x84\xA9 |0 + \x84\xAA |0 + \xD8\xE6 |0 + \x84\xAB |0 + \x84\xAC |0 + \x84\xAD |0 + \x84\xAE |0 + \x84\xAF |0 + \x84\xB0 |0 + \x84\xB1 |0 + \xC1\xA6 |0 + \x84\xB2 |0 + \xC8\xB0 |0 + \xB0\xEC |0 + \xB9\xA6 |0 + \xBC\xD3 |0 + \xCE\xF1 |0 + \xDB\xBD |0 + \xC1\xD3 |0 + \x84\xB3 |0 + \x84\xB4 |0 + \x84\xB5 |0 + \x84\xB6 |0 + \xB6\xAF |0 + \xD6\xFA |0 + \xC5\xAC |0 + \xBD\xD9 |0 + \xDB\xBE |0 + \xDB\xBF |0 + \x84\xB7 |0 + \x84\xB8 |0 + \x84\xB9 |0 + \xC0\xF8 |0 + \xBE\xA2 |0 + \xC0\xCD |0 + \x84\xBA |0 + \x84\xBB |0 + \x84\xBC |0 + \x84\xBD |0 + \x84\xBE |0 + \x84\xBF |0 + \x84\xC0 |0 + \x84\xC1 |0 + \x84\xC2 |0 + \x84\xC3 |0 + \xDB\xC0 |0 + \xCA\xC6 |0 + \x84\xC4 |0 + \x84\xC5 |0 + \x84\xC6 |0 + \xB2\xAA |0 + \x84\xC7 |0 + \x84\xC8 |0 + \x84\xC9 |0 + \xD3\xC2 |0 + \x84\xCA |0 + \xC3\xE3 |0 + \x84\xCB |0 + \xD1\xAB |0 + \x84\xCC |0 + \x84\xCD |0 + \x84\xCE |0 + \x84\xCF |0 + \xDB\xC2 |0 + \x84\xD0 |0 + \xC0\xD5 |0 + \x84\xD1 |0 + \x84\xD2 |0 + \x84\xD3 |0 + \xDB\xC3 |0 + \x84\xD4 |0 + \xBF\xB1 |0 + \x84\xD5 |0 + \x84\xD6 |0 + \x84\xD7 |0 + \x84\xD8 |0 + \x84\xD9 |0 + \x84\xDA |0 + \xC4\xBC |0 + \x84\xDB |0 + \x84\xDC |0 + \x84\xDD |0 + \x84\xDE |0 + \xC7\xDA |0 + \x84\xDF |0 + \x84\xE0 |0 + \x84\xE1 |0 + \x84\xE2 |0 + \x84\xE3 |0 + \x84\xE4 |0 + \x84\xE5 |0 + \x84\xE6 |0 + \x84\xE7 |0 + \x84\xE8 |0 + \x84\xE9 |0 + \xDB\xC4 |0 + \x84\xEA |0 + \x84\xEB |0 + \x84\xEC |0 + \x84\xED |0 + \x84\xEE |0 + \x84\xEF |0 + \x84\xF0 |0 + \x84\xF1 |0 + \xD9\xE8 |0 + \xC9\xD7 |0 + \x84\xF2 |0 + \x84\xF3 |0 + \x84\xF4 |0 + \xB9\xB4 |0 + \xCE\xF0 |0 + \xD4\xC8 |0 + \x84\xF5 |0 + \x84\xF6 |0 + \x84\xF7 |0 + \x84\xF8 |0 + \xB0\xFC |0 + \xB4\xD2 |0 + \x84\xF9 |0 + \xD0\xD9 |0 + \x84\xFA |0 + \x84\xFB |0 + \x84\xFC |0 + \x84\xFD |0 + \xD9\xE9 |0 + \x84\xFE |0 + \xDE\xCB |0 + \xD9\xEB |0 + \x85\x40 |0 + \x85\x41 |0 + \x85\x42 |0 + \x85\x43 |0 + \xD8\xB0 |0 + \xBB\xAF |0 + \xB1\xB1 |0 + \x85\x44 |0 + \xB3\xD7 |0 + \xD8\xCE |0 + \x85\x45 |0 + \x85\x46 |0 + \xD4\xD1 |0 + \x85\x47 |0 + \x85\x48 |0 + \xBD\xB3 |0 + \xBF\xEF |0 + \x85\x49 |0 + \xCF\xBB |0 + \x85\x4A |0 + \x85\x4B |0 + \xD8\xD0 |0 + \x85\x4C |0 + \x85\x4D |0 + \x85\x4E |0 + \xB7\xCB |0 + \x85\x4F |0 + \x85\x50 |0 + \x85\x51 |0 + \xD8\xD1 |0 + \x85\x52 |0 + \x85\x53 |0 + \x85\x54 |0 + \x85\x55 |0 + \x85\x56 |0 + \x85\x57 |0 + \x85\x58 |0 + \x85\x59 |0 + \x85\x5A |0 + \x85\x5B |0 + \xC6\xA5 |0 + \xC7\xF8 |0 + \xD2\xBD |0 + \x85\x5C |0 + \x85\x5D |0 + \xD8\xD2 |0 + \xC4\xE4 |0 + \x85\x5E |0 + \xCA\xAE |0 + \x85\x5F |0 + \xC7\xA7 |0 + \x85\x60 |0 + \xD8\xA6 |0 + \x85\x61 |0 + \xC9\xFD |0 + \xCE\xE7 |0 + \xBB\xDC |0 + \xB0\xEB |0 + \x85\x62 |0 + \x85\x63 |0 + \x85\x64 |0 + \xBB\xAA |0 + \xD0\xAD |0 + \x85\x65 |0 + \xB1\xB0 |0 + \xD7\xE4 |0 + \xD7\xBF |0 + \x85\x66 |0 + \xB5\xA5 |0 + \xC2\xF4 |0 + \xC4\xCF |0 + \x85\x67 |0 + \x85\x68 |0 + \xB2\xA9 |0 + \x85\x69 |0 + \xB2\xB7 |0 + \x85\x6A |0 + \xB1\xE5 |0 + \xDF\xB2 |0 + \xD5\xBC |0 + \xBF\xA8 |0 + \xC2\xAC |0 + \xD8\xD5 |0 + \xC2\xB1 |0 + \x85\x6B |0 + \xD8\xD4 |0 + \xCE\xD4 |0 + \x85\x6C |0 + \xDA\xE0 |0 + \x85\x6D |0 + \xCE\xC0 |0 + \x85\x6E |0 + \x85\x6F |0 + \xD8\xB4 |0 + \xC3\xAE |0 + \xD3\xA1 |0 + \xCE\xA3 |0 + \x85\x70 |0 + \xBC\xB4 |0 + \xC8\xB4 |0 + \xC2\xD1 |0 + \x85\x71 |0 + \xBE\xED |0 + \xD0\xB6 |0 + \x85\x72 |0 + \xDA\xE1 |0 + \x85\x73 |0 + \x85\x74 |0 + \x85\x75 |0 + \x85\x76 |0 + \xC7\xE4 |0 + \x85\x77 |0 + \x85\x78 |0 + \xB3\xA7 |0 + \x85\x79 |0 + \xB6\xF2 |0 + \xCC\xFC |0 + \xC0\xFA |0 + \x85\x7A |0 + \x85\x7B |0 + \xC0\xF7 |0 + \x85\x7C |0 + \xD1\xB9 |0 + \xD1\xE1 |0 + \xD8\xC7 |0 + \x85\x7D |0 + \x85\x7E |0 + \x85\x80 |0 + \x85\x81 |0 + \x85\x82 |0 + \x85\x83 |0 + \x85\x84 |0 + \xB2\xDE |0 + \x85\x85 |0 + \x85\x86 |0 + \xC0\xE5 |0 + \x85\x87 |0 + \xBA\xF1 |0 + \x85\x88 |0 + \x85\x89 |0 + \xD8\xC8 |0 + \x85\x8A |0 + \xD4\xAD |0 + \x85\x8B |0 + \x85\x8C |0 + \xCF\xE1 |0 + \xD8\xC9 |0 + \x85\x8D |0 + \xD8\xCA |0 + \xCF\xC3 |0 + \x85\x8E |0 + \xB3\xF8 |0 + \xBE\xC7 |0 + \x85\x8F |0 + \x85\x90 |0 + \x85\x91 |0 + \x85\x92 |0 + \xD8\xCB |0 + \x85\x93 |0 + \x85\x94 |0 + \x85\x95 |0 + \x85\x96 |0 + \x85\x97 |0 + \x85\x98 |0 + \x85\x99 |0 + \xDB\xCC |0 + \x85\x9A |0 + \x85\x9B |0 + \x85\x9C |0 + \x85\x9D |0 + \xC8\xA5 |0 + \x85\x9E |0 + \x85\x9F |0 + \x85\xA0 |0 + \xCF\xD8 |0 + \x85\xA1 |0 + \xC8\xFE |0 + \xB2\xCE |0 + \x85\xA2 |0 + \x85\xA3 |0 + \x85\xA4 |0 + \x85\xA5 |0 + \x85\xA6 |0 + \xD3\xD6 |0 + \xB2\xE6 |0 + \xBC\xB0 |0 + \xD3\xD1 |0 + \xCB\xAB |0 + \xB7\xB4 |0 + \x85\xA7 |0 + \x85\xA8 |0 + \x85\xA9 |0 + \xB7\xA2 |0 + \x85\xAA |0 + \x85\xAB |0 + \xCA\xE5 |0 + \x85\xAC |0 + \xC8\xA1 |0 + \xCA\xDC |0 + \xB1\xE4 |0 + \xD0\xF0 |0 + \x85\xAD |0 + \xC5\xD1 |0 + \x85\xAE |0 + \x85\xAF |0 + \x85\xB0 |0 + \xDB\xC5 |0 + \xB5\xFE |0 + \x85\xB1 |0 + \x85\xB2 |0 + \xBF\xDA |0 + \xB9\xC5 |0 + \xBE\xE4 |0 + \xC1\xED |0 + \x85\xB3 |0 + \xDF\xB6 |0 + \xDF\xB5 |0 + \xD6\xBB |0 + \xBD\xD0 |0 + \xD5\xD9 |0 + \xB0\xC8 |0 + \xB6\xA3 |0 + \xBF\xC9 |0 + \xCC\xA8 |0 + \xDF\xB3 |0 + \xCA\xB7 |0 + \xD3\xD2 |0 + \x85\xB4 |0 + \xD8\xCF |0 + \xD2\xB6 |0 + \xBA\xC5 |0 + \xCB\xBE |0 + \xCC\xBE |0 + \x85\xB5 |0 + \xDF\xB7 |0 + \xB5\xF0 |0 + \xDF\xB4 |0 + \x85\xB6 |0 + \x85\xB7 |0 + \x85\xB8 |0 + \xD3\xF5 |0 + \x85\xB9 |0 + \xB3\xD4 |0 + \xB8\xF7 |0 + \x85\xBA |0 + \xDF\xBA |0 + \x85\xBB |0 + \xBA\xCF |0 + \xBC\xAA |0 + \xB5\xF5 |0 + \x85\xBC |0 + \xCD\xAC |0 + \xC3\xFB |0 + \xBA\xF3 |0 + \xC0\xF4 |0 + \xCD\xC2 |0 + \xCF\xF2 |0 + \xDF\xB8 |0 + \xCF\xC5 |0 + \x85\xBD |0 + \xC2\xC0 |0 + \xDF\xB9 |0 + \xC2\xF0 |0 + \x85\xBE |0 + \x85\xBF |0 + \x85\xC0 |0 + \xBE\xFD |0 + \x85\xC1 |0 + \xC1\xDF |0 + \xCD\xCC |0 + \xD2\xF7 |0 + \xB7\xCD |0 + \xDF\xC1 |0 + \x85\xC2 |0 + \xDF\xC4 |0 + \x85\xC3 |0 + \x85\xC4 |0 + \xB7\xF1 |0 + \xB0\xC9 |0 + \xB6\xD6 |0 + \xB7\xD4 |0 + \x85\xC5 |0 + \xBA\xAC |0 + \xCC\xFD |0 + \xBF\xD4 |0 + \xCB\xB1 |0 + \xC6\xF4 |0 + \x85\xC6 |0 + \xD6\xA8 |0 + \xDF\xC5 |0 + \x85\xC7 |0 + \xCE\xE2 |0 + \xB3\xB3 |0 + \x85\xC8 |0 + \x85\xC9 |0 + \xCE\xFC |0 + \xB4\xB5 |0 + \x85\xCA |0 + \xCE\xC7 |0 + \xBA\xF0 |0 + \x85\xCB |0 + \xCE\xE1 |0 + \x85\xCC |0 + \xD1\xBD |0 + \x85\xCD |0 + \x85\xCE |0 + \xDF\xC0 |0 + \x85\xCF |0 + \x85\xD0 |0 + \xB4\xF4 |0 + \x85\xD1 |0 + \xB3\xCA |0 + \x85\xD2 |0 + \xB8\xE6 |0 + \xDF\xBB |0 + \x85\xD3 |0 + \x85\xD4 |0 + \x85\xD5 |0 + \x85\xD6 |0 + \xC4\xC5 |0 + \x85\xD7 |0 + \xDF\xBC |0 + \xDF\xBD |0 + \xDF\xBE |0 + \xC5\xBB |0 + \xDF\xBF |0 + \xDF\xC2 |0 + \xD4\xB1 |0 + \xDF\xC3 |0 + \x85\xD8 |0 + \xC7\xBA |0 + \xCE\xD8 |0 + \x85\xD9 |0 + \x85\xDA |0 + \x85\xDB |0 + \x85\xDC |0 + \x85\xDD |0 + \xC4\xD8 |0 + \x85\xDE |0 + \xDF\xCA |0 + \x85\xDF |0 + \xDF\xCF |0 + \x85\xE0 |0 + \xD6\xDC |0 + \x85\xE1 |0 + \x85\xE2 |0 + \x85\xE3 |0 + \x85\xE4 |0 + \x85\xE5 |0 + \x85\xE6 |0 + \x85\xE7 |0 + \x85\xE8 |0 + \xDF\xC9 |0 + \xDF\xDA |0 + \xCE\xB6 |0 + \x85\xE9 |0 + \xBA\xC7 |0 + \xDF\xCE |0 + \xDF\xC8 |0 + \xC5\xDE |0 + \x85\xEA |0 + \x85\xEB |0 + \xC9\xEB |0 + \xBA\xF4 |0 + \xC3\xFC |0 + \x85\xEC |0 + \x85\xED |0 + \xBE\xD7 |0 + \x85\xEE |0 + \xDF\xC6 |0 + \x85\xEF |0 + \xDF\xCD |0 + \x85\xF0 |0 + \xC5\xD8 |0 + \x85\xF1 |0 + \x85\xF2 |0 + \x85\xF3 |0 + \x85\xF4 |0 + \xD5\xA6 |0 + \xBA\xCD |0 + \x85\xF5 |0 + \xBE\xCC |0 + \xD3\xBD |0 + \xB8\xC0 |0 + \x85\xF6 |0 + \xD6\xE4 |0 + \x85\xF7 |0 + \xDF\xC7 |0 + \xB9\xBE |0 + \xBF\xA7 |0 + \x85\xF8 |0 + \x85\xF9 |0 + \xC1\xFC |0 + \xDF\xCB |0 + \xDF\xCC |0 + \x85\xFA |0 + \xDF\xD0 |0 + \x85\xFB |0 + \x85\xFC |0 + \x85\xFD |0 + \x85\xFE |0 + \x86\x40 |0 + \xDF\xDB |0 + \xDF\xE5 |0 + \x86\x41 |0 + \xDF\xD7 |0 + \xDF\xD6 |0 + \xD7\xC9 |0 + \xDF\xE3 |0 + \xDF\xE4 |0 + \xE5\xEB |0 + \xD2\xA7 |0 + \xDF\xD2 |0 + \x86\x42 |0 + \xBF\xA9 |0 + \x86\x43 |0 + \xD4\xDB |0 + \x86\x44 |0 + \xBF\xC8 |0 + \xDF\xD4 |0 + \x86\x45 |0 + \x86\x46 |0 + \x86\x47 |0 + \xCF\xCC |0 + \x86\x48 |0 + \x86\x49 |0 + \xDF\xDD |0 + \x86\x4A |0 + \xD1\xCA |0 + \x86\x4B |0 + \xDF\xDE |0 + \xB0\xA7 |0 + \xC6\xB7 |0 + \xDF\xD3 |0 + \x86\x4C |0 + \xBA\xE5 |0 + \x86\x4D |0 + \xB6\xDF |0 + \xCD\xDB |0 + \xB9\xFE |0 + \xD4\xD5 |0 + \x86\x4E |0 + \x86\x4F |0 + \xDF\xDF |0 + \xCF\xEC |0 + \xB0\xA5 |0 + \xDF\xE7 |0 + \xDF\xD1 |0 + \xD1\xC6 |0 + \xDF\xD5 |0 + \xDF\xD8 |0 + \xDF\xD9 |0 + \xDF\xDC |0 + \x86\x50 |0 + \xBB\xA9 |0 + \x86\x51 |0 + \xDF\xE0 |0 + \xDF\xE1 |0 + \x86\x52 |0 + \xDF\xE2 |0 + \xDF\xE6 |0 + \xDF\xE8 |0 + \xD3\xB4 |0 + \x86\x53 |0 + \x86\x54 |0 + \x86\x55 |0 + \x86\x56 |0 + \x86\x57 |0 + \xB8\xE7 |0 + \xC5\xB6 |0 + \xDF\xEA |0 + \xC9\xDA |0 + \xC1\xA8 |0 + \xC4\xC4 |0 + \x86\x58 |0 + \x86\x59 |0 + \xBF\xDE |0 + \xCF\xF8 |0 + \x86\x5A |0 + \x86\x5B |0 + \x86\x5C |0 + \xD5\xDC |0 + \xDF\xEE |0 + \x86\x5D |0 + \x86\x5E |0 + \x86\x5F |0 + \x86\x60 |0 + \x86\x61 |0 + \x86\x62 |0 + \xB2\xB8 |0 + \x86\x63 |0 + \xBA\xDF |0 + \xDF\xEC |0 + \x86\x64 |0 + \xDB\xC1 |0 + \x86\x65 |0 + \xD1\xE4 |0 + \x86\x66 |0 + \x86\x67 |0 + \x86\x68 |0 + \x86\x69 |0 + \xCB\xF4 |0 + \xB4\xBD |0 + \x86\x6A |0 + \xB0\xA6 |0 + \x86\x6B |0 + \x86\x6C |0 + \x86\x6D |0 + \x86\x6E |0 + \x86\x6F |0 + \xDF\xF1 |0 + \xCC\xC6 |0 + \xDF\xF2 |0 + \x86\x70 |0 + \x86\x71 |0 + \xDF\xED |0 + \x86\x72 |0 + \x86\x73 |0 + \x86\x74 |0 + \x86\x75 |0 + \x86\x76 |0 + \x86\x77 |0 + \xDF\xE9 |0 + \x86\x78 |0 + \x86\x79 |0 + \x86\x7A |0 + \x86\x7B |0 + \xDF\xEB |0 + \x86\x7C |0 + \xDF\xEF |0 + \xDF\xF0 |0 + \xBB\xBD |0 + \x86\x7D |0 + \x86\x7E |0 + \xDF\xF3 |0 + \x86\x80 |0 + \x86\x81 |0 + \xDF\xF4 |0 + \x86\x82 |0 + \xBB\xA3 |0 + \x86\x83 |0 + \xCA\xDB |0 + \xCE\xA8 |0 + \xE0\xA7 |0 + \xB3\xAA |0 + \x86\x84 |0 + \xE0\xA6 |0 + \x86\x85 |0 + \x86\x86 |0 + \x86\x87 |0 + \xE0\xA1 |0 + \x86\x88 |0 + \x86\x89 |0 + \x86\x8A |0 + \x86\x8B |0 + \xDF\xFE |0 + \x86\x8C |0 + \xCD\xD9 |0 + \xDF\xFC |0 + \x86\x8D |0 + \xDF\xFA |0 + \x86\x8E |0 + \xBF\xD0 |0 + \xD7\xC4 |0 + \x86\x8F |0 + \xC9\xCC |0 + \x86\x90 |0 + \x86\x91 |0 + \xDF\xF8 |0 + \xB0\xA1 |0 + \x86\x92 |0 + \x86\x93 |0 + \x86\x94 |0 + \x86\x95 |0 + \x86\x96 |0 + \xDF\xFD |0 + \x86\x97 |0 + \x86\x98 |0 + \x86\x99 |0 + \x86\x9A |0 + \xDF\xFB |0 + \xE0\xA2 |0 + \x86\x9B |0 + \x86\x9C |0 + \x86\x9D |0 + \x86\x9E |0 + \x86\x9F |0 + \xE0\xA8 |0 + \x86\xA0 |0 + \x86\xA1 |0 + \x86\xA2 |0 + \x86\xA3 |0 + \xB7\xC8 |0 + \x86\xA4 |0 + \x86\xA5 |0 + \xC6\xA1 |0 + \xC9\xB6 |0 + \xC0\xB2 |0 + \xDF\xF5 |0 + \x86\xA6 |0 + \x86\xA7 |0 + \xC5\xBE |0 + \x86\xA8 |0 + \xD8\xC4 |0 + \xDF\xF9 |0 + \xC4\xF6 |0 + \x86\xA9 |0 + \x86\xAA |0 + \x86\xAB |0 + \x86\xAC |0 + \x86\xAD |0 + \x86\xAE |0 + \xE0\xA3 |0 + \xE0\xA4 |0 + \xE0\xA5 |0 + \xD0\xA5 |0 + \x86\xAF |0 + \x86\xB0 |0 + \xE0\xB4 |0 + \xCC\xE4 |0 + \x86\xB1 |0 + \xE0\xB1 |0 + \x86\xB2 |0 + \xBF\xA6 |0 + \xE0\xAF |0 + \xCE\xB9 |0 + \xE0\xAB |0 + \xC9\xC6 |0 + \x86\xB3 |0 + \x86\xB4 |0 + \xC0\xAE |0 + \xE0\xAE |0 + \xBA\xED |0 + \xBA\xB0 |0 + \xE0\xA9 |0 + \x86\xB5 |0 + \x86\xB6 |0 + \x86\xB7 |0 + \xDF\xF6 |0 + \x86\xB8 |0 + \xE0\xB3 |0 + \x86\xB9 |0 + \x86\xBA |0 + \xE0\xB8 |0 + \x86\xBB |0 + \x86\xBC |0 + \x86\xBD |0 + \xB4\xAD |0 + \xE0\xB9 |0 + \x86\xBE |0 + \x86\xBF |0 + \xCF\xB2 |0 + \xBA\xC8 |0 + \x86\xC0 |0 + \xE0\xB0 |0 + \x86\xC1 |0 + \x86\xC2 |0 + \x86\xC3 |0 + \x86\xC4 |0 + \x86\xC5 |0 + \x86\xC6 |0 + \x86\xC7 |0 + \xD0\xFA |0 + \x86\xC8 |0 + \x86\xC9 |0 + \x86\xCA |0 + \x86\xCB |0 + \x86\xCC |0 + \x86\xCD |0 + \x86\xCE |0 + \x86\xCF |0 + \x86\xD0 |0 + \xE0\xAC |0 + \x86\xD1 |0 + \xD4\xFB |0 + \x86\xD2 |0 + \xDF\xF7 |0 + \x86\xD3 |0 + \xC5\xE7 |0 + \x86\xD4 |0 + \xE0\xAD |0 + \x86\xD5 |0 + \xD3\xF7 |0 + \x86\xD6 |0 + \xE0\xB6 |0 + \xE0\xB7 |0 + \x86\xD7 |0 + \x86\xD8 |0 + \x86\xD9 |0 + \x86\xDA |0 + \x86\xDB |0 + \xE0\xC4 |0 + \xD0\xE1 |0 + \x86\xDC |0 + \x86\xDD |0 + \x86\xDE |0 + \xE0\xBC |0 + \x86\xDF |0 + \x86\xE0 |0 + \xE0\xC9 |0 + \xE0\xCA |0 + \x86\xE1 |0 + \x86\xE2 |0 + \x86\xE3 |0 + \xE0\xBE |0 + \xE0\xAA |0 + \xC9\xA4 |0 + \xE0\xC1 |0 + \x86\xE4 |0 + \xE0\xB2 |0 + \x86\xE5 |0 + \x86\xE6 |0 + \x86\xE7 |0 + \x86\xE8 |0 + \x86\xE9 |0 + \xCA\xC8 |0 + \xE0\xC3 |0 + \x86\xEA |0 + \xE0\xB5 |0 + \x86\xEB |0 + \xCE\xCB |0 + \x86\xEC |0 + \xCB\xC3 |0 + \xE0\xCD |0 + \xE0\xC6 |0 + \xE0\xC2 |0 + \x86\xED |0 + \xE0\xCB |0 + \x86\xEE |0 + \xE0\xBA |0 + \xE0\xBF |0 + \xE0\xC0 |0 + \x86\xEF |0 + \x86\xF0 |0 + \xE0\xC5 |0 + \x86\xF1 |0 + \x86\xF2 |0 + \xE0\xC7 |0 + \xE0\xC8 |0 + \x86\xF3 |0 + \xE0\xCC |0 + \x86\xF4 |0 + \xE0\xBB |0 + \x86\xF5 |0 + \x86\xF6 |0 + \x86\xF7 |0 + \x86\xF8 |0 + \x86\xF9 |0 + \xCB\xD4 |0 + \xE0\xD5 |0 + \x86\xFA |0 + \xE0\xD6 |0 + \xE0\xD2 |0 + \x86\xFB |0 + \x86\xFC |0 + \x86\xFD |0 + \x86\xFE |0 + \x87\x40 |0 + \x87\x41 |0 + \xE0\xD0 |0 + \xBC\xCE |0 + \x87\x42 |0 + \x87\x43 |0 + \xE0\xD1 |0 + \x87\x44 |0 + \xB8\xC2 |0 + \xD8\xC5 |0 + \x87\x45 |0 + \x87\x46 |0 + \x87\x47 |0 + \x87\x48 |0 + \x87\x49 |0 + \x87\x4A |0 + \x87\x4B |0 + \x87\x4C |0 + \xD0\xEA |0 + \x87\x4D |0 + \x87\x4E |0 + \xC2\xEF |0 + \x87\x4F |0 + \x87\x50 |0 + \xE0\xCF |0 + \xE0\xBD |0 + \x87\x51 |0 + \x87\x52 |0 + \x87\x53 |0 + \xE0\xD4 |0 + \xE0\xD3 |0 + \x87\x54 |0 + \x87\x55 |0 + \xE0\xD7 |0 + \x87\x56 |0 + \x87\x57 |0 + \x87\x58 |0 + \x87\x59 |0 + \xE0\xDC |0 + \xE0\xD8 |0 + \x87\x5A |0 + \x87\x5B |0 + \x87\x5C |0 + \xD6\xF6 |0 + \xB3\xB0 |0 + \x87\x5D |0 + \xD7\xEC |0 + \x87\x5E |0 + \xCB\xBB |0 + \x87\x5F |0 + \x87\x60 |0 + \xE0\xDA |0 + \x87\x61 |0 + \xCE\xFB |0 + \x87\x62 |0 + \x87\x63 |0 + \x87\x64 |0 + \xBA\xD9 |0 + \x87\x65 |0 + \x87\x66 |0 + \x87\x67 |0 + \x87\x68 |0 + \x87\x69 |0 + \x87\x6A |0 + \x87\x6B |0 + \x87\x6C |0 + \x87\x6D |0 + \x87\x6E |0 + \x87\x6F |0 + \x87\x70 |0 + \xE0\xE1 |0 + \xE0\xDD |0 + \xD2\xAD |0 + \x87\x71 |0 + \x87\x72 |0 + \x87\x73 |0 + \x87\x74 |0 + \x87\x75 |0 + \xE0\xE2 |0 + \x87\x76 |0 + \x87\x77 |0 + \xE0\xDB |0 + \xE0\xD9 |0 + \xE0\xDF |0 + \x87\x78 |0 + \x87\x79 |0 + \xE0\xE0 |0 + \x87\x7A |0 + \x87\x7B |0 + \x87\x7C |0 + \x87\x7D |0 + \x87\x7E |0 + \xE0\xDE |0 + \x87\x80 |0 + \xE0\xE4 |0 + \x87\x81 |0 + \x87\x82 |0 + \x87\x83 |0 + \xC6\xF7 |0 + \xD8\xAC |0 + \xD4\xEB |0 + \xE0\xE6 |0 + \xCA\xC9 |0 + \x87\x84 |0 + \x87\x85 |0 + \x87\x86 |0 + \x87\x87 |0 + \xE0\xE5 |0 + \x87\x88 |0 + \x87\x89 |0 + \x87\x8A |0 + \x87\x8B |0 + \xB8\xC1 |0 + \x87\x8C |0 + \x87\x8D |0 + \x87\x8E |0 + \x87\x8F |0 + \xE0\xE7 |0 + \xE0\xE8 |0 + \x87\x90 |0 + \x87\x91 |0 + \x87\x92 |0 + \x87\x93 |0 + \x87\x94 |0 + \x87\x95 |0 + \x87\x96 |0 + \x87\x97 |0 + \xE0\xE9 |0 + \xE0\xE3 |0 + \x87\x98 |0 + \x87\x99 |0 + \x87\x9A |0 + \x87\x9B |0 + \x87\x9C |0 + \x87\x9D |0 + \x87\x9E |0 + \xBA\xBF |0 + \xCC\xE7 |0 + \x87\x9F |0 + \x87\xA0 |0 + \x87\xA1 |0 + \xE0\xEA |0 + \x87\xA2 |0 + \x87\xA3 |0 + \x87\xA4 |0 + \x87\xA5 |0 + \x87\xA6 |0 + \x87\xA7 |0 + \x87\xA8 |0 + \x87\xA9 |0 + \x87\xAA |0 + \x87\xAB |0 + \x87\xAC |0 + \x87\xAD |0 + \x87\xAE |0 + \x87\xAF |0 + \x87\xB0 |0 + \xCF\xF9 |0 + \x87\xB1 |0 + \x87\xB2 |0 + \x87\xB3 |0 + \x87\xB4 |0 + \x87\xB5 |0 + \x87\xB6 |0 + \x87\xB7 |0 + \x87\xB8 |0 + \x87\xB9 |0 + \x87\xBA |0 + \x87\xBB |0 + \xE0\xEB |0 + \x87\xBC |0 + \x87\xBD |0 + \x87\xBE |0 + \x87\xBF |0 + \x87\xC0 |0 + \x87\xC1 |0 + \x87\xC2 |0 + \xC8\xC2 |0 + \x87\xC3 |0 + \x87\xC4 |0 + \x87\xC5 |0 + \x87\xC6 |0 + \xBD\xC0 |0 + \x87\xC7 |0 + \x87\xC8 |0 + \x87\xC9 |0 + \x87\xCA |0 + \x87\xCB |0 + \x87\xCC |0 + \x87\xCD |0 + \x87\xCE |0 + \x87\xCF |0 + \x87\xD0 |0 + \x87\xD1 |0 + \x87\xD2 |0 + \x87\xD3 |0 + \xC4\xD2 |0 + \x87\xD4 |0 + \x87\xD5 |0 + \x87\xD6 |0 + \x87\xD7 |0 + \x87\xD8 |0 + \x87\xD9 |0 + \x87\xDA |0 + \x87\xDB |0 + \x87\xDC |0 + \xE0\xEC |0 + \x87\xDD |0 + \x87\xDE |0 + \xE0\xED |0 + \x87\xDF |0 + \x87\xE0 |0 + \xC7\xF4 |0 + \xCB\xC4 |0 + \x87\xE1 |0 + \xE0\xEE |0 + \xBB\xD8 |0 + \xD8\xB6 |0 + \xD2\xF2 |0 + \xE0\xEF |0 + \xCD\xC5 |0 + \x87\xE2 |0 + \xB6\xDA |0 + \x87\xE3 |0 + \x87\xE4 |0 + \x87\xE5 |0 + \x87\xE6 |0 + \x87\xE7 |0 + \x87\xE8 |0 + \xE0\xF1 |0 + \x87\xE9 |0 + \xD4\xB0 |0 + \x87\xEA |0 + \x87\xEB |0 + \xC0\xA7 |0 + \xB4\xD1 |0 + \x87\xEC |0 + \x87\xED |0 + \xCE\xA7 |0 + \xE0\xF0 |0 + \x87\xEE |0 + \x87\xEF |0 + \x87\xF0 |0 + \xE0\xF2 |0 + \xB9\xCC |0 + \x87\xF1 |0 + \x87\xF2 |0 + \xB9\xFA |0 + \xCD\xBC |0 + \xE0\xF3 |0 + \x87\xF3 |0 + \x87\xF4 |0 + \x87\xF5 |0 + \xC6\xD4 |0 + \xE0\xF4 |0 + \x87\xF6 |0 + \xD4\xB2 |0 + \x87\xF7 |0 + \xC8\xA6 |0 + \xE0\xF6 |0 + \xE0\xF5 |0 + \x87\xF8 |0 + \x87\xF9 |0 + \x87\xFA |0 + \x87\xFB |0 + \x87\xFC |0 + \x87\xFD |0 + \x87\xFE |0 + \x88\x40 |0 + \x88\x41 |0 + \x88\x42 |0 + \x88\x43 |0 + \x88\x44 |0 + \x88\x45 |0 + \x88\x46 |0 + \x88\x47 |0 + \x88\x48 |0 + \x88\x49 |0 + \xE0\xF7 |0 + \x88\x4A |0 + \x88\x4B |0 + \xCD\xC1 |0 + \x88\x4C |0 + \x88\x4D |0 + \x88\x4E |0 + \xCA\xA5 |0 + \x88\x4F |0 + \x88\x50 |0 + \x88\x51 |0 + \x88\x52 |0 + \xD4\xDA |0 + \xDB\xD7 |0 + \xDB\xD9 |0 + \x88\x53 |0 + \xDB\xD8 |0 + \xB9\xE7 |0 + \xDB\xDC |0 + \xDB\xDD |0 + \xB5\xD8 |0 + \x88\x54 |0 + \x88\x55 |0 + \xDB\xDA |0 + \x88\x56 |0 + \x88\x57 |0 + \x88\x58 |0 + \x88\x59 |0 + \x88\x5A |0 + \xDB\xDB |0 + \xB3\xA1 |0 + \xDB\xDF |0 + \x88\x5B |0 + \x88\x5C |0 + \xBB\xF8 |0 + \x88\x5D |0 + \xD6\xB7 |0 + \x88\x5E |0 + \xDB\xE0 |0 + \x88\x5F |0 + \x88\x60 |0 + \x88\x61 |0 + \x88\x62 |0 + \xBE\xF9 |0 + \x88\x63 |0 + \x88\x64 |0 + \xB7\xBB |0 + \x88\x65 |0 + \xDB\xD0 |0 + \xCC\xAE |0 + \xBF\xB2 |0 + \xBB\xB5 |0 + \xD7\xF8 |0 + \xBF\xD3 |0 + \x88\x66 |0 + \x88\x67 |0 + \x88\x68 |0 + \x88\x69 |0 + \x88\x6A |0 + \xBF\xE9 |0 + \x88\x6B |0 + \x88\x6C |0 + \xBC\xE1 |0 + \xCC\xB3 |0 + \xDB\xDE |0 + \xB0\xD3 |0 + \xCE\xEB |0 + \xB7\xD8 |0 + \xD7\xB9 |0 + \xC6\xC2 |0 + \x88\x6D |0 + \x88\x6E |0 + \xC0\xA4 |0 + \x88\x6F |0 + \xCC\xB9 |0 + \x88\x70 |0 + \xDB\xE7 |0 + \xDB\xE1 |0 + \xC6\xBA |0 + \xDB\xE3 |0 + \x88\x71 |0 + \xDB\xE8 |0 + \x88\x72 |0 + \xC5\xF7 |0 + \x88\x73 |0 + \x88\x74 |0 + \x88\x75 |0 + \xDB\xEA |0 + \x88\x76 |0 + \x88\x77 |0 + \xDB\xE9 |0 + \xBF\xC0 |0 + \x88\x78 |0 + \x88\x79 |0 + \x88\x7A |0 + \xDB\xE6 |0 + \xDB\xE5 |0 + \x88\x7B |0 + \x88\x7C |0 + \x88\x7D |0 + \x88\x7E |0 + \x88\x80 |0 + \xB4\xB9 |0 + \xC0\xAC |0 + \xC2\xA2 |0 + \xDB\xE2 |0 + \xDB\xE4 |0 + \x88\x81 |0 + \x88\x82 |0 + \x88\x83 |0 + \x88\x84 |0 + \xD0\xCD |0 + \xDB\xED |0 + \x88\x85 |0 + \x88\x86 |0 + \x88\x87 |0 + \x88\x88 |0 + \x88\x89 |0 + \xC0\xDD |0 + \xDB\xF2 |0 + \x88\x8A |0 + \x88\x8B |0 + \x88\x8C |0 + \x88\x8D |0 + \x88\x8E |0 + \x88\x8F |0 + \x88\x90 |0 + \xB6\xE2 |0 + \x88\x91 |0 + \x88\x92 |0 + \x88\x93 |0 + \x88\x94 |0 + \xDB\xF3 |0 + \xDB\xD2 |0 + \xB9\xB8 |0 + \xD4\xAB |0 + \xDB\xEC |0 + \x88\x95 |0 + \xBF\xD1 |0 + \xDB\xF0 |0 + \x88\x96 |0 + \xDB\xD1 |0 + \x88\x97 |0 + \xB5\xE6 |0 + \x88\x98 |0 + \xDB\xEB |0 + \xBF\xE5 |0 + \x88\x99 |0 + \x88\x9A |0 + \x88\x9B |0 + \xDB\xEE |0 + \x88\x9C |0 + \xDB\xF1 |0 + \x88\x9D |0 + \x88\x9E |0 + \x88\x9F |0 + \xDB\xF9 |0 + \x88\xA0 |0 + \x88\xA1 |0 + \x88\xA2 |0 + \x88\xA3 |0 + \x88\xA4 |0 + \x88\xA5 |0 + \x88\xA6 |0 + \x88\xA7 |0 + \x88\xA8 |0 + \xB9\xA1 |0 + \xB0\xA3 |0 + \x88\xA9 |0 + \x88\xAA |0 + \x88\xAB |0 + \x88\xAC |0 + \x88\xAD |0 + \x88\xAE |0 + \x88\xAF |0 + \xC2\xF1 |0 + \x88\xB0 |0 + \x88\xB1 |0 + \xB3\xC7 |0 + \xDB\xEF |0 + \x88\xB2 |0 + \x88\xB3 |0 + \xDB\xF8 |0 + \x88\xB4 |0 + \xC6\xD2 |0 + \xDB\xF4 |0 + \x88\xB5 |0 + \x88\xB6 |0 + \xDB\xF5 |0 + \xDB\xF7 |0 + \xDB\xF6 |0 + \x88\xB7 |0 + \x88\xB8 |0 + \xDB\xFE |0 + \x88\xB9 |0 + \xD3\xF2 |0 + \xB2\xBA |0 + \x88\xBA |0 + \x88\xBB |0 + \x88\xBC |0 + \xDB\xFD |0 + \x88\xBD |0 + \x88\xBE |0 + \x88\xBF |0 + \x88\xC0 |0 + \x88\xC1 |0 + \x88\xC2 |0 + \x88\xC3 |0 + \x88\xC4 |0 + \xDC\xA4 |0 + \x88\xC5 |0 + \xDB\xFB |0 + \x88\xC6 |0 + \x88\xC7 |0 + \x88\xC8 |0 + \x88\xC9 |0 + \xDB\xFA |0 + \x88\xCA |0 + \x88\xCB |0 + \x88\xCC |0 + \xDB\xFC |0 + \xC5\xE0 |0 + \xBB\xF9 |0 + \x88\xCD |0 + \x88\xCE |0 + \xDC\xA3 |0 + \x88\xCF |0 + \x88\xD0 |0 + \xDC\xA5 |0 + \x88\xD1 |0 + \xCC\xC3 |0 + \x88\xD2 |0 + \x88\xD3 |0 + \x88\xD4 |0 + \xB6\xD1 |0 + \xDD\xC0 |0 + \x88\xD5 |0 + \x88\xD6 |0 + \x88\xD7 |0 + \xDC\xA1 |0 + \x88\xD8 |0 + \xDC\xA2 |0 + \x88\xD9 |0 + \x88\xDA |0 + \x88\xDB |0 + \xC7\xB5 |0 + \x88\xDC |0 + \x88\xDD |0 + \x88\xDE |0 + \xB6\xE9 |0 + \x88\xDF |0 + \x88\xE0 |0 + \x88\xE1 |0 + \xDC\xA7 |0 + \x88\xE2 |0 + \x88\xE3 |0 + \x88\xE4 |0 + \x88\xE5 |0 + \xDC\xA6 |0 + \x88\xE6 |0 + \xDC\xA9 |0 + \xB1\xA4 |0 + \x88\xE7 |0 + \x88\xE8 |0 + \xB5\xCC |0 + \x88\xE9 |0 + \x88\xEA |0 + \x88\xEB |0 + \x88\xEC |0 + \x88\xED |0 + \xBF\xB0 |0 + \x88\xEE |0 + \x88\xEF |0 + \x88\xF0 |0 + \x88\xF1 |0 + \x88\xF2 |0 + \xD1\xDF |0 + \x88\xF3 |0 + \x88\xF4 |0 + \x88\xF5 |0 + \x88\xF6 |0 + \xB6\xC2 |0 + \x88\xF7 |0 + \x88\xF8 |0 + \x88\xF9 |0 + \x88\xFA |0 + \x88\xFB |0 + \x88\xFC |0 + \x88\xFD |0 + \x88\xFE |0 + \x89\x40 |0 + \x89\x41 |0 + \x89\x42 |0 + \x89\x43 |0 + \x89\x44 |0 + \x89\x45 |0 + \xDC\xA8 |0 + \x89\x46 |0 + \x89\x47 |0 + \x89\x48 |0 + \x89\x49 |0 + \x89\x4A |0 + \x89\x4B |0 + \x89\x4C |0 + \xCB\xFA |0 + \xEB\xF3 |0 + \x89\x4D |0 + \x89\x4E |0 + \x89\x4F |0 + \xCB\xDC |0 + \x89\x50 |0 + \x89\x51 |0 + \xCB\xFE |0 + \x89\x52 |0 + \x89\x53 |0 + \x89\x54 |0 + \xCC\xC1 |0 + \x89\x55 |0 + \x89\x56 |0 + \x89\x57 |0 + \x89\x58 |0 + \x89\x59 |0 + \xC8\xFB |0 + \x89\x5A |0 + \x89\x5B |0 + \x89\x5C |0 + \x89\x5D |0 + \x89\x5E |0 + \x89\x5F |0 + \xDC\xAA |0 + \x89\x60 |0 + \x89\x61 |0 + \x89\x62 |0 + \x89\x63 |0 + \x89\x64 |0 + \xCC\xEE |0 + \xDC\xAB |0 + \x89\x65 |0 + \x89\x66 |0 + \x89\x67 |0 + \x89\x68 |0 + \x89\x69 |0 + \x89\x6A |0 + \x89\x6B |0 + \x89\x6C |0 + \x89\x6D |0 + \x89\x6E |0 + \x89\x6F |0 + \x89\x70 |0 + \x89\x71 |0 + \x89\x72 |0 + \x89\x73 |0 + \x89\x74 |0 + \x89\x75 |0 + \xDB\xD3 |0 + \x89\x76 |0 + \xDC\xAF |0 + \xDC\xAC |0 + \x89\x77 |0 + \xBE\xB3 |0 + \x89\x78 |0 + \xCA\xFB |0 + \x89\x79 |0 + \x89\x7A |0 + \x89\x7B |0 + \xDC\xAD |0 + \x89\x7C |0 + \x89\x7D |0 + \x89\x7E |0 + \x89\x80 |0 + \x89\x81 |0 + \x89\x82 |0 + \x89\x83 |0 + \x89\x84 |0 + \xC9\xCA |0 + \xC4\xB9 |0 + \x89\x85 |0 + \x89\x86 |0 + \x89\x87 |0 + \x89\x88 |0 + \x89\x89 |0 + \xC7\xBD |0 + \xDC\xAE |0 + \x89\x8A |0 + \x89\x8B |0 + \x89\x8C |0 + \xD4\xF6 |0 + \xD0\xE6 |0 + \x89\x8D |0 + \x89\x8E |0 + \x89\x8F |0 + \x89\x90 |0 + \x89\x91 |0 + \x89\x92 |0 + \x89\x93 |0 + \x89\x94 |0 + \xC4\xAB |0 + \xB6\xD5 |0 + \x89\x95 |0 + \x89\x96 |0 + \x89\x97 |0 + \x89\x98 |0 + \x89\x99 |0 + \x89\x9A |0 + \x89\x9B |0 + \x89\x9C |0 + \x89\x9D |0 + \x89\x9E |0 + \x89\x9F |0 + \x89\xA0 |0 + \x89\xA1 |0 + \x89\xA2 |0 + \x89\xA3 |0 + \x89\xA4 |0 + \x89\xA5 |0 + \x89\xA6 |0 + \xDB\xD4 |0 + \x89\xA7 |0 + \x89\xA8 |0 + \x89\xA9 |0 + \x89\xAA |0 + \xB1\xDA |0 + \x89\xAB |0 + \x89\xAC |0 + \x89\xAD |0 + \xDB\xD5 |0 + \x89\xAE |0 + \x89\xAF |0 + \x89\xB0 |0 + \x89\xB1 |0 + \x89\xB2 |0 + \x89\xB3 |0 + \x89\xB4 |0 + \x89\xB5 |0 + \x89\xB6 |0 + \x89\xB7 |0 + \x89\xB8 |0 + \xDB\xD6 |0 + \x89\xB9 |0 + \x89\xBA |0 + \x89\xBB |0 + \xBA\xBE |0 + \x89\xBC |0 + \x89\xBD |0 + \x89\xBE |0 + \x89\xBF |0 + \x89\xC0 |0 + \x89\xC1 |0 + \x89\xC2 |0 + \x89\xC3 |0 + \x89\xC4 |0 + \x89\xC5 |0 + \x89\xC6 |0 + \x89\xC7 |0 + \x89\xC8 |0 + \x89\xC9 |0 + \xC8\xC0 |0 + \x89\xCA |0 + \x89\xCB |0 + \x89\xCC |0 + \x89\xCD |0 + \x89\xCE |0 + \x89\xCF |0 + \xCA\xBF |0 + \xC8\xC9 |0 + \x89\xD0 |0 + \xD7\xB3 |0 + \x89\xD1 |0 + \xC9\xF9 |0 + \x89\xD2 |0 + \x89\xD3 |0 + \xBF\xC7 |0 + \x89\xD4 |0 + \x89\xD5 |0 + \xBA\xF8 |0 + \x89\xD6 |0 + \x89\xD7 |0 + \xD2\xBC |0 + \x89\xD8 |0 + \x89\xD9 |0 + \x89\xDA |0 + \x89\xDB |0 + \x89\xDC |0 + \x89\xDD |0 + \x89\xDE |0 + \x89\xDF |0 + \xE2\xBA |0 + \x89\xE0 |0 + \xB4\xA6 |0 + \x89\xE1 |0 + \x89\xE2 |0 + \xB1\xB8 |0 + \x89\xE3 |0 + \x89\xE4 |0 + \x89\xE5 |0 + \x89\xE6 |0 + \x89\xE7 |0 + \xB8\xB4 |0 + \x89\xE8 |0 + \xCF\xC4 |0 + \x89\xE9 |0 + \x89\xEA |0 + \x89\xEB |0 + \x89\xEC |0 + \xD9\xE7 |0 + \xCF\xA6 |0 + \xCD\xE2 |0 + \x89\xED |0 + \x89\xEE |0 + \xD9\xED |0 + \xB6\xE0 |0 + \x89\xEF |0 + \xD2\xB9 |0 + \x89\xF0 |0 + \x89\xF1 |0 + \xB9\xBB |0 + \x89\xF2 |0 + \x89\xF3 |0 + \x89\xF4 |0 + \x89\xF5 |0 + \xE2\xB9 |0 + \xE2\xB7 |0 + \x89\xF6 |0 + \xB4\xF3 |0 + \x89\xF7 |0 + \xCC\xEC |0 + \xCC\xAB |0 + \xB7\xF2 |0 + \x89\xF8 |0 + \xD8\xB2 |0 + \xD1\xEB |0 + \xBA\xBB |0 + \x89\xF9 |0 + \xCA\xA7 |0 + \x89\xFA |0 + \x89\xFB |0 + \xCD\xB7 |0 + \x89\xFC |0 + \x89\xFD |0 + \xD2\xC4 |0 + \xBF\xE4 |0 + \xBC\xD0 |0 + \xB6\xE1 |0 + \x89\xFE |0 + \xDE\xC5 |0 + \x8A\x40 |0 + \x8A\x41 |0 + \x8A\x42 |0 + \x8A\x43 |0 + \xDE\xC6 |0 + \xDB\xBC |0 + \x8A\x44 |0 + \xD1\xD9 |0 + \x8A\x45 |0 + \x8A\x46 |0 + \xC6\xE6 |0 + \xC4\xCE |0 + \xB7\xEE |0 + \x8A\x47 |0 + \xB7\xDC |0 + \x8A\x48 |0 + \x8A\x49 |0 + \xBF\xFC |0 + \xD7\xE0 |0 + \x8A\x4A |0 + \xC6\xF5 |0 + \x8A\x4B |0 + \x8A\x4C |0 + \xB1\xBC |0 + \xDE\xC8 |0 + \xBD\xB1 |0 + \xCC\xD7 |0 + \xDE\xCA |0 + \x8A\x4D |0 + \xDE\xC9 |0 + \x8A\x4E |0 + \x8A\x4F |0 + \x8A\x50 |0 + \x8A\x51 |0 + \x8A\x52 |0 + \xB5\xEC |0 + \x8A\x53 |0 + \xC9\xDD |0 + \x8A\x54 |0 + \x8A\x55 |0 + \xB0\xC2 |0 + \x8A\x56 |0 + \x8A\x57 |0 + \x8A\x58 |0 + \x8A\x59 |0 + \x8A\x5A |0 + \x8A\x5B |0 + \x8A\x5C |0 + \x8A\x5D |0 + \x8A\x5E |0 + \x8A\x5F |0 + \x8A\x60 |0 + \x8A\x61 |0 + \x8A\x62 |0 + \xC5\xAE |0 + \xC5\xAB |0 + \x8A\x63 |0 + \xC4\xCC |0 + \x8A\x64 |0 + \xBC\xE9 |0 + \xCB\xFD |0 + \x8A\x65 |0 + \x8A\x66 |0 + \x8A\x67 |0 + \xBA\xC3 |0 + \x8A\x68 |0 + \x8A\x69 |0 + \x8A\x6A |0 + \xE5\xF9 |0 + \xC8\xE7 |0 + \xE5\xFA |0 + \xCD\xFD |0 + \x8A\x6B |0 + \xD7\xB1 |0 + \xB8\xBE |0 + \xC2\xE8 |0 + \x8A\x6C |0 + \xC8\xD1 |0 + \x8A\x6D |0 + \x8A\x6E |0 + \xE5\xFB |0 + \x8A\x6F |0 + \x8A\x70 |0 + \x8A\x71 |0 + \x8A\x72 |0 + \xB6\xCA |0 + \xBC\xCB |0 + \x8A\x73 |0 + \x8A\x74 |0 + \xD1\xFD |0 + \xE6\xA1 |0 + \x8A\x75 |0 + \xC3\xEE |0 + \x8A\x76 |0 + \x8A\x77 |0 + \x8A\x78 |0 + \x8A\x79 |0 + \xE6\xA4 |0 + \x8A\x7A |0 + \x8A\x7B |0 + \x8A\x7C |0 + \x8A\x7D |0 + \xE5\xFE |0 + \xE6\xA5 |0 + \xCD\xD7 |0 + \x8A\x7E |0 + \x8A\x80 |0 + \xB7\xC1 |0 + \xE5\xFC |0 + \xE5\xFD |0 + \xE6\xA3 |0 + \x8A\x81 |0 + \x8A\x82 |0 + \xC4\xDD |0 + \xE6\xA8 |0 + \x8A\x83 |0 + \x8A\x84 |0 + \xE6\xA7 |0 + \x8A\x85 |0 + \x8A\x86 |0 + \x8A\x87 |0 + \x8A\x88 |0 + \x8A\x89 |0 + \x8A\x8A |0 + \xC3\xC3 |0 + \x8A\x8B |0 + \xC6\xDE |0 + \x8A\x8C |0 + \x8A\x8D |0 + \xE6\xAA |0 + \x8A\x8E |0 + \x8A\x8F |0 + \x8A\x90 |0 + \x8A\x91 |0 + \x8A\x92 |0 + \x8A\x93 |0 + \x8A\x94 |0 + \xC4\xB7 |0 + \x8A\x95 |0 + \x8A\x96 |0 + \x8A\x97 |0 + \xE6\xA2 |0 + \xCA\xBC |0 + \x8A\x98 |0 + \x8A\x99 |0 + \x8A\x9A |0 + \x8A\x9B |0 + \xBD\xE3 |0 + \xB9\xC3 |0 + \xE6\xA6 |0 + \xD0\xD5 |0 + \xCE\xAF |0 + \x8A\x9C |0 + \x8A\x9D |0 + \xE6\xA9 |0 + \xE6\xB0 |0 + \x8A\x9E |0 + \xD2\xA6 |0 + \x8A\x9F |0 + \xBD\xAA |0 + \xE6\xAD |0 + \x8A\xA0 |0 + \x8A\xA1 |0 + \x8A\xA2 |0 + \x8A\xA3 |0 + \x8A\xA4 |0 + \xE6\xAF |0 + \x8A\xA5 |0 + \xC0\xD1 |0 + \x8A\xA6 |0 + \x8A\xA7 |0 + \xD2\xCC |0 + \x8A\xA8 |0 + \x8A\xA9 |0 + \x8A\xAA |0 + \xBC\xA7 |0 + \x8A\xAB |0 + \x8A\xAC |0 + \x8A\xAD |0 + \x8A\xAE |0 + \x8A\xAF |0 + \x8A\xB0 |0 + \x8A\xB1 |0 + \x8A\xB2 |0 + \x8A\xB3 |0 + \x8A\xB4 |0 + \x8A\xB5 |0 + \x8A\xB6 |0 + \xE6\xB1 |0 + \x8A\xB7 |0 + \xD2\xF6 |0 + \x8A\xB8 |0 + \x8A\xB9 |0 + \x8A\xBA |0 + \xD7\xCB |0 + \x8A\xBB |0 + \xCD\xFE |0 + \x8A\xBC |0 + \xCD\xDE |0 + \xC2\xA6 |0 + \xE6\xAB |0 + \xE6\xAC |0 + \xBD\xBF |0 + \xE6\xAE |0 + \xE6\xB3 |0 + \x8A\xBD |0 + \x8A\xBE |0 + \xE6\xB2 |0 + \x8A\xBF |0 + \x8A\xC0 |0 + \x8A\xC1 |0 + \x8A\xC2 |0 + \xE6\xB6 |0 + \x8A\xC3 |0 + \xE6\xB8 |0 + \x8A\xC4 |0 + \x8A\xC5 |0 + \x8A\xC6 |0 + \x8A\xC7 |0 + \xC4\xEF |0 + \x8A\xC8 |0 + \x8A\xC9 |0 + \x8A\xCA |0 + \xC4\xC8 |0 + \x8A\xCB |0 + \x8A\xCC |0 + \xBE\xEA |0 + \xC9\xEF |0 + \x8A\xCD |0 + \x8A\xCE |0 + \xE6\xB7 |0 + \x8A\xCF |0 + \xB6\xF0 |0 + \x8A\xD0 |0 + \x8A\xD1 |0 + \x8A\xD2 |0 + \xC3\xE4 |0 + \x8A\xD3 |0 + \x8A\xD4 |0 + \x8A\xD5 |0 + \x8A\xD6 |0 + \x8A\xD7 |0 + \x8A\xD8 |0 + \x8A\xD9 |0 + \xD3\xE9 |0 + \xE6\xB4 |0 + \x8A\xDA |0 + \xE6\xB5 |0 + \x8A\xDB |0 + \xC8\xA2 |0 + \x8A\xDC |0 + \x8A\xDD |0 + \x8A\xDE |0 + \x8A\xDF |0 + \x8A\xE0 |0 + \xE6\xBD |0 + \x8A\xE1 |0 + \x8A\xE2 |0 + \x8A\xE3 |0 + \xE6\xB9 |0 + \x8A\xE4 |0 + \x8A\xE5 |0 + \x8A\xE6 |0 + \x8A\xE7 |0 + \x8A\xE8 |0 + \xC6\xC5 |0 + \x8A\xE9 |0 + \x8A\xEA |0 + \xCD\xF1 |0 + \xE6\xBB |0 + \x8A\xEB |0 + \x8A\xEC |0 + \x8A\xED |0 + \x8A\xEE |0 + \x8A\xEF |0 + \x8A\xF0 |0 + \x8A\xF1 |0 + \x8A\xF2 |0 + \x8A\xF3 |0 + \x8A\xF4 |0 + \xE6\xBC |0 + \x8A\xF5 |0 + \x8A\xF6 |0 + \x8A\xF7 |0 + \x8A\xF8 |0 + \xBB\xE9 |0 + \x8A\xF9 |0 + \x8A\xFA |0 + \x8A\xFB |0 + \x8A\xFC |0 + \x8A\xFD |0 + \x8A\xFE |0 + \x8B\x40 |0 + \xE6\xBE |0 + \x8B\x41 |0 + \x8B\x42 |0 + \x8B\x43 |0 + \x8B\x44 |0 + \xE6\xBA |0 + \x8B\x45 |0 + \x8B\x46 |0 + \xC0\xB7 |0 + \x8B\x47 |0 + \x8B\x48 |0 + \x8B\x49 |0 + \x8B\x4A |0 + \x8B\x4B |0 + \x8B\x4C |0 + \x8B\x4D |0 + \x8B\x4E |0 + \x8B\x4F |0 + \xD3\xA4 |0 + \xE6\xBF |0 + \xC9\xF4 |0 + \xE6\xC3 |0 + \x8B\x50 |0 + \x8B\x51 |0 + \xE6\xC4 |0 + \x8B\x52 |0 + \x8B\x53 |0 + \x8B\x54 |0 + \x8B\x55 |0 + \xD0\xF6 |0 + \x8B\x56 |0 + \x8B\x57 |0 + \x8B\x58 |0 + \x8B\x59 |0 + \x8B\x5A |0 + \x8B\x5B |0 + \x8B\x5C |0 + \x8B\x5D |0 + \x8B\x5E |0 + \x8B\x5F |0 + \x8B\x60 |0 + \x8B\x61 |0 + \x8B\x62 |0 + \x8B\x63 |0 + \x8B\x64 |0 + \x8B\x65 |0 + \x8B\x66 |0 + \x8B\x67 |0 + \xC3\xBD |0 + \x8B\x68 |0 + \x8B\x69 |0 + \x8B\x6A |0 + \x8B\x6B |0 + \x8B\x6C |0 + \x8B\x6D |0 + \x8B\x6E |0 + \xC3\xC4 |0 + \xE6\xC2 |0 + \x8B\x6F |0 + \x8B\x70 |0 + \x8B\x71 |0 + \x8B\x72 |0 + \x8B\x73 |0 + \x8B\x74 |0 + \x8B\x75 |0 + \x8B\x76 |0 + \x8B\x77 |0 + \x8B\x78 |0 + \x8B\x79 |0 + \x8B\x7A |0 + \x8B\x7B |0 + \x8B\x7C |0 + \xE6\xC1 |0 + \x8B\x7D |0 + \x8B\x7E |0 + \x8B\x80 |0 + \x8B\x81 |0 + \x8B\x82 |0 + \x8B\x83 |0 + \x8B\x84 |0 + \xE6\xC7 |0 + \xCF\xB1 |0 + \x8B\x85 |0 + \xEB\xF4 |0 + \x8B\x86 |0 + \x8B\x87 |0 + \xE6\xCA |0 + \x8B\x88 |0 + \x8B\x89 |0 + \x8B\x8A |0 + \x8B\x8B |0 + \x8B\x8C |0 + \xE6\xC5 |0 + \x8B\x8D |0 + \x8B\x8E |0 + \xBC\xDE |0 + \xC9\xA9 |0 + \x8B\x8F |0 + \x8B\x90 |0 + \x8B\x91 |0 + \x8B\x92 |0 + \x8B\x93 |0 + \x8B\x94 |0 + \xBC\xB5 |0 + \x8B\x95 |0 + \x8B\x96 |0 + \xCF\xD3 |0 + \x8B\x97 |0 + \x8B\x98 |0 + \x8B\x99 |0 + \x8B\x9A |0 + \x8B\x9B |0 + \xE6\xC8 |0 + \x8B\x9C |0 + \xE6\xC9 |0 + \x8B\x9D |0 + \xE6\xCE |0 + \x8B\x9E |0 + \xE6\xD0 |0 + \x8B\x9F |0 + \x8B\xA0 |0 + \x8B\xA1 |0 + \xE6\xD1 |0 + \x8B\xA2 |0 + \x8B\xA3 |0 + \x8B\xA4 |0 + \xE6\xCB |0 + \xB5\xD5 |0 + \x8B\xA5 |0 + \xE6\xCC |0 + \x8B\xA6 |0 + \x8B\xA7 |0 + \xE6\xCF |0 + \x8B\xA8 |0 + \x8B\xA9 |0 + \xC4\xDB |0 + \x8B\xAA |0 + \xE6\xC6 |0 + \x8B\xAB |0 + \x8B\xAC |0 + \x8B\xAD |0 + \x8B\xAE |0 + \x8B\xAF |0 + \xE6\xCD |0 + \x8B\xB0 |0 + \x8B\xB1 |0 + \x8B\xB2 |0 + \x8B\xB3 |0 + \x8B\xB4 |0 + \x8B\xB5 |0 + \x8B\xB6 |0 + \x8B\xB7 |0 + \x8B\xB8 |0 + \x8B\xB9 |0 + \x8B\xBA |0 + \x8B\xBB |0 + \x8B\xBC |0 + \x8B\xBD |0 + \x8B\xBE |0 + \x8B\xBF |0 + \x8B\xC0 |0 + \x8B\xC1 |0 + \x8B\xC2 |0 + \x8B\xC3 |0 + \x8B\xC4 |0 + \x8B\xC5 |0 + \x8B\xC6 |0 + \xE6\xD2 |0 + \x8B\xC7 |0 + \x8B\xC8 |0 + \x8B\xC9 |0 + \x8B\xCA |0 + \x8B\xCB |0 + \x8B\xCC |0 + \x8B\xCD |0 + \x8B\xCE |0 + \x8B\xCF |0 + \x8B\xD0 |0 + \x8B\xD1 |0 + \x8B\xD2 |0 + \xE6\xD4 |0 + \xE6\xD3 |0 + \x8B\xD3 |0 + \x8B\xD4 |0 + \x8B\xD5 |0 + \x8B\xD6 |0 + \x8B\xD7 |0 + \x8B\xD8 |0 + \x8B\xD9 |0 + \x8B\xDA |0 + \x8B\xDB |0 + \x8B\xDC |0 + \x8B\xDD |0 + \x8B\xDE |0 + \x8B\xDF |0 + \x8B\xE0 |0 + \x8B\xE1 |0 + \x8B\xE2 |0 + \x8B\xE3 |0 + \x8B\xE4 |0 + \x8B\xE5 |0 + \x8B\xE6 |0 + \x8B\xE7 |0 + \x8B\xE8 |0 + \x8B\xE9 |0 + \x8B\xEA |0 + \x8B\xEB |0 + \x8B\xEC |0 + \xE6\xD5 |0 + \x8B\xED |0 + \xD9\xF8 |0 + \x8B\xEE |0 + \x8B\xEF |0 + \xE6\xD6 |0 + \x8B\xF0 |0 + \x8B\xF1 |0 + \x8B\xF2 |0 + \x8B\xF3 |0 + \x8B\xF4 |0 + \x8B\xF5 |0 + \x8B\xF6 |0 + \x8B\xF7 |0 + \xE6\xD7 |0 + \x8B\xF8 |0 + \x8B\xF9 |0 + \x8B\xFA |0 + \x8B\xFB |0 + \x8B\xFC |0 + \x8B\xFD |0 + \x8B\xFE |0 + \x8C\x40 |0 + \x8C\x41 |0 + \x8C\x42 |0 + \x8C\x43 |0 + \x8C\x44 |0 + \x8C\x45 |0 + \x8C\x46 |0 + \x8C\x47 |0 + \xD7\xD3 |0 + \xE6\xDD |0 + \x8C\x48 |0 + \xE6\xDE |0 + \xBF\xD7 |0 + \xD4\xD0 |0 + \x8C\x49 |0 + \xD7\xD6 |0 + \xB4\xE6 |0 + \xCB\xEF |0 + \xE6\xDA |0 + \xD8\xC3 |0 + \xD7\xCE |0 + \xD0\xA2 |0 + \x8C\x4A |0 + \xC3\xCF |0 + \x8C\x4B |0 + \x8C\x4C |0 + \xE6\xDF |0 + \xBC\xBE |0 + \xB9\xC2 |0 + \xE6\xDB |0 + \xD1\xA7 |0 + \x8C\x4D |0 + \x8C\x4E |0 + \xBA\xA2 |0 + \xC2\xCF |0 + \x8C\x4F |0 + \xD8\xAB |0 + \x8C\x50 |0 + \x8C\x51 |0 + \x8C\x52 |0 + \xCA\xEB |0 + \xE5\xEE |0 + \x8C\x53 |0 + \xE6\xDC |0 + \x8C\x54 |0 + \xB7\xF5 |0 + \x8C\x55 |0 + \x8C\x56 |0 + \x8C\x57 |0 + \x8C\x58 |0 + \xC8\xE6 |0 + \x8C\x59 |0 + \x8C\x5A |0 + \xC4\xF5 |0 + \x8C\x5B |0 + \x8C\x5C |0 + \xE5\xB2 |0 + \xC4\xFE |0 + \x8C\x5D |0 + \xCB\xFC |0 + \xE5\xB3 |0 + \xD5\xAC |0 + \x8C\x5E |0 + \xD3\xEE |0 + \xCA\xD8 |0 + \xB0\xB2 |0 + \x8C\x5F |0 + \xCB\xCE |0 + \xCD\xEA |0 + \x8C\x60 |0 + \x8C\x61 |0 + \xBA\xEA |0 + \x8C\x62 |0 + \x8C\x63 |0 + \x8C\x64 |0 + \xE5\xB5 |0 + \x8C\x65 |0 + \xE5\xB4 |0 + \x8C\x66 |0 + \xD7\xDA |0 + \xB9\xD9 |0 + \xD6\xE6 |0 + \xB6\xA8 |0 + \xCD\xF0 |0 + \xD2\xCB |0 + \xB1\xA6 |0 + \xCA\xB5 |0 + \x8C\x67 |0 + \xB3\xE8 |0 + \xC9\xF3 |0 + \xBF\xCD |0 + \xD0\xFB |0 + \xCA\xD2 |0 + \xE5\xB6 |0 + \xBB\xC2 |0 + \x8C\x68 |0 + \x8C\x69 |0 + \x8C\x6A |0 + \xCF\xDC |0 + \xB9\xAC |0 + \x8C\x6B |0 + \x8C\x6C |0 + \x8C\x6D |0 + \x8C\x6E |0 + \xD4\xD7 |0 + \x8C\x6F |0 + \x8C\x70 |0 + \xBA\xA6 |0 + \xD1\xE7 |0 + \xCF\xFC |0 + \xBC\xD2 |0 + \x8C\x71 |0 + \xE5\xB7 |0 + \xC8\xDD |0 + \x8C\x72 |0 + \x8C\x73 |0 + \x8C\x74 |0 + \xBF\xED |0 + \xB1\xF6 |0 + \xCB\xDE |0 + \x8C\x75 |0 + \x8C\x76 |0 + \xBC\xC5 |0 + \x8C\x77 |0 + \xBC\xC4 |0 + \xD2\xFA |0 + \xC3\xDC |0 + \xBF\xDC |0 + \x8C\x78 |0 + \x8C\x79 |0 + \x8C\x7A |0 + \x8C\x7B |0 + \xB8\xBB |0 + \x8C\x7C |0 + \x8C\x7D |0 + \x8C\x7E |0 + \xC3\xC2 |0 + \x8C\x80 |0 + \xBA\xAE |0 + \xD4\xA2 |0 + \x8C\x81 |0 + \x8C\x82 |0 + \x8C\x83 |0 + \x8C\x84 |0 + \x8C\x85 |0 + \x8C\x86 |0 + \x8C\x87 |0 + \x8C\x88 |0 + \x8C\x89 |0 + \xC7\xDE |0 + \xC4\xAF |0 + \xB2\xEC |0 + \x8C\x8A |0 + \xB9\xD1 |0 + \x8C\x8B |0 + \x8C\x8C |0 + \xE5\xBB |0 + \xC1\xC8 |0 + \x8C\x8D |0 + \x8C\x8E |0 + \xD5\xAF |0 + \x8C\x8F |0 + \x8C\x90 |0 + \x8C\x91 |0 + \x8C\x92 |0 + \x8C\x93 |0 + \xE5\xBC |0 + \x8C\x94 |0 + \xE5\xBE |0 + \x8C\x95 |0 + \x8C\x96 |0 + \x8C\x97 |0 + \x8C\x98 |0 + \x8C\x99 |0 + \x8C\x9A |0 + \x8C\x9B |0 + \xB4\xE7 |0 + \xB6\xD4 |0 + \xCB\xC2 |0 + \xD1\xB0 |0 + \xB5\xBC |0 + \x8C\x9C |0 + \x8C\x9D |0 + \xCA\xD9 |0 + \x8C\x9E |0 + \xB7\xE2 |0 + \x8C\x9F |0 + \x8C\xA0 |0 + \xC9\xE4 |0 + \x8C\xA1 |0 + \xBD\xAB |0 + \x8C\xA2 |0 + \x8C\xA3 |0 + \xCE\xBE |0 + \xD7\xF0 |0 + \x8C\xA4 |0 + \x8C\xA5 |0 + \x8C\xA6 |0 + \x8C\xA7 |0 + \xD0\xA1 |0 + \x8C\xA8 |0 + \xC9\xD9 |0 + \x8C\xA9 |0 + \x8C\xAA |0 + \xB6\xFB |0 + \xE6\xD8 |0 + \xBC\xE2 |0 + \x8C\xAB |0 + \xB3\xBE |0 + \x8C\xAC |0 + \xC9\xD0 |0 + \x8C\xAD |0 + \xE6\xD9 |0 + \xB3\xA2 |0 + \x8C\xAE |0 + \x8C\xAF |0 + \x8C\xB0 |0 + \x8C\xB1 |0 + \xDE\xCC |0 + \x8C\xB2 |0 + \xD3\xC8 |0 + \xDE\xCD |0 + \x8C\xB3 |0 + \xD2\xA2 |0 + \x8C\xB4 |0 + \x8C\xB5 |0 + \x8C\xB6 |0 + \x8C\xB7 |0 + \xDE\xCE |0 + \x8C\xB8 |0 + \x8C\xB9 |0 + \x8C\xBA |0 + \x8C\xBB |0 + \xBE\xCD |0 + \x8C\xBC |0 + \x8C\xBD |0 + \xDE\xCF |0 + \x8C\xBE |0 + \x8C\xBF |0 + \x8C\xC0 |0 + \xCA\xAC |0 + \xD2\xFC |0 + \xB3\xDF |0 + \xE5\xEA |0 + \xC4\xE1 |0 + \xBE\xA1 |0 + \xCE\xB2 |0 + \xC4\xF2 |0 + \xBE\xD6 |0 + \xC6\xA8 |0 + \xB2\xE3 |0 + \x8C\xC1 |0 + \x8C\xC2 |0 + \xBE\xD3 |0 + \x8C\xC3 |0 + \x8C\xC4 |0 + \xC7\xFC |0 + \xCC\xEB |0 + \xBD\xEC |0 + \xCE\xDD |0 + \x8C\xC5 |0 + \x8C\xC6 |0 + \xCA\xBA |0 + \xC6\xC1 |0 + \xE5\xEC |0 + \xD0\xBC |0 + \x8C\xC7 |0 + \x8C\xC8 |0 + \x8C\xC9 |0 + \xD5\xB9 |0 + \x8C\xCA |0 + \x8C\xCB |0 + \x8C\xCC |0 + \xE5\xED |0 + \x8C\xCD |0 + \x8C\xCE |0 + \x8C\xCF |0 + \x8C\xD0 |0 + \xCA\xF4 |0 + \x8C\xD1 |0 + \xCD\xC0 |0 + \xC2\xC5 |0 + \x8C\xD2 |0 + \xE5\xEF |0 + \x8C\xD3 |0 + \xC2\xC4 |0 + \xE5\xF0 |0 + \x8C\xD4 |0 + \x8C\xD5 |0 + \x8C\xD6 |0 + \x8C\xD7 |0 + \x8C\xD8 |0 + \x8C\xD9 |0 + \x8C\xDA |0 + \xE5\xF8 |0 + \xCD\xCD |0 + \x8C\xDB |0 + \xC9\xBD |0 + \x8C\xDC |0 + \x8C\xDD |0 + \x8C\xDE |0 + \x8C\xDF |0 + \x8C\xE0 |0 + \x8C\xE1 |0 + \x8C\xE2 |0 + \xD2\xD9 |0 + \xE1\xA8 |0 + \x8C\xE3 |0 + \x8C\xE4 |0 + \x8C\xE5 |0 + \x8C\xE6 |0 + \xD3\xEC |0 + \x8C\xE7 |0 + \xCB\xEA |0 + \xC6\xF1 |0 + \x8C\xE8 |0 + \x8C\xE9 |0 + \x8C\xEA |0 + \x8C\xEB |0 + \x8C\xEC |0 + \xE1\xAC |0 + \x8C\xED |0 + \x8C\xEE |0 + \x8C\xEF |0 + \xE1\xA7 |0 + \xE1\xA9 |0 + \x8C\xF0 |0 + \x8C\xF1 |0 + \xE1\xAA |0 + \xE1\xAF |0 + \x8C\xF2 |0 + \x8C\xF3 |0 + \xB2\xED |0 + \x8C\xF4 |0 + \xE1\xAB |0 + \xB8\xDA |0 + \xE1\xAD |0 + \xE1\xAE |0 + \xE1\xB0 |0 + \xB5\xBA |0 + \xE1\xB1 |0 + \x8C\xF5 |0 + \x8C\xF6 |0 + \x8C\xF7 |0 + \x8C\xF8 |0 + \x8C\xF9 |0 + \xE1\xB3 |0 + \xE1\xB8 |0 + \x8C\xFA |0 + \x8C\xFB |0 + \x8C\xFC |0 + \x8C\xFD |0 + \x8C\xFE |0 + \xD1\xD2 |0 + \x8D\x40 |0 + \xE1\xB6 |0 + \xE1\xB5 |0 + \xC1\xEB |0 + \x8D\x41 |0 + \x8D\x42 |0 + \x8D\x43 |0 + \xE1\xB7 |0 + \x8D\x44 |0 + \xD4\xC0 |0 + \x8D\x45 |0 + \xE1\xB2 |0 + \x8D\x46 |0 + \xE1\xBA |0 + \xB0\xB6 |0 + \x8D\x47 |0 + \x8D\x48 |0 + \x8D\x49 |0 + \x8D\x4A |0 + \xE1\xB4 |0 + \x8D\x4B |0 + \xBF\xF9 |0 + \x8D\x4C |0 + \xE1\xB9 |0 + \x8D\x4D |0 + \x8D\x4E |0 + \xE1\xBB |0 + \x8D\x4F |0 + \x8D\x50 |0 + \x8D\x51 |0 + \x8D\x52 |0 + \x8D\x53 |0 + \x8D\x54 |0 + \xE1\xBE |0 + \x8D\x55 |0 + \x8D\x56 |0 + \x8D\x57 |0 + \x8D\x58 |0 + \x8D\x59 |0 + \x8D\x5A |0 + \xE1\xBC |0 + \x8D\x5B |0 + \x8D\x5C |0 + \x8D\x5D |0 + \x8D\x5E |0 + \x8D\x5F |0 + \x8D\x60 |0 + \xD6\xC5 |0 + \x8D\x61 |0 + \x8D\x62 |0 + \x8D\x63 |0 + \x8D\x64 |0 + \x8D\x65 |0 + \x8D\x66 |0 + \x8D\x67 |0 + \xCF\xBF |0 + \x8D\x68 |0 + \x8D\x69 |0 + \xE1\xBD |0 + \xE1\xBF |0 + \xC2\xCD |0 + \x8D\x6A |0 + \xB6\xEB |0 + \x8D\x6B |0 + \xD3\xF8 |0 + \x8D\x6C |0 + \x8D\x6D |0 + \xC7\xCD |0 + \x8D\x6E |0 + \x8D\x6F |0 + \xB7\xE5 |0 + \x8D\x70 |0 + \x8D\x71 |0 + \x8D\x72 |0 + \x8D\x73 |0 + \x8D\x74 |0 + \x8D\x75 |0 + \x8D\x76 |0 + \x8D\x77 |0 + \x8D\x78 |0 + \x8D\x79 |0 + \xBE\xFE |0 + \x8D\x7A |0 + \x8D\x7B |0 + \x8D\x7C |0 + \x8D\x7D |0 + \x8D\x7E |0 + \x8D\x80 |0 + \xE1\xC0 |0 + \xE1\xC1 |0 + \x8D\x81 |0 + \x8D\x82 |0 + \xE1\xC7 |0 + \xB3\xE7 |0 + \x8D\x83 |0 + \x8D\x84 |0 + \x8D\x85 |0 + \x8D\x86 |0 + \x8D\x87 |0 + \x8D\x88 |0 + \xC6\xE9 |0 + \x8D\x89 |0 + \x8D\x8A |0 + \x8D\x8B |0 + \x8D\x8C |0 + \x8D\x8D |0 + \xB4\xDE |0 + \x8D\x8E |0 + \xD1\xC2 |0 + \x8D\x8F |0 + \x8D\x90 |0 + \x8D\x91 |0 + \x8D\x92 |0 + \xE1\xC8 |0 + \x8D\x93 |0 + \x8D\x94 |0 + \xE1\xC6 |0 + \x8D\x95 |0 + \x8D\x96 |0 + \x8D\x97 |0 + \x8D\x98 |0 + \x8D\x99 |0 + \xE1\xC5 |0 + \x8D\x9A |0 + \xE1\xC3 |0 + \xE1\xC2 |0 + \x8D\x9B |0 + \xB1\xC0 |0 + \x8D\x9C |0 + \x8D\x9D |0 + \x8D\x9E |0 + \xD5\xB8 |0 + \xE1\xC4 |0 + \x8D\x9F |0 + \x8D\xA0 |0 + \x8D\xA1 |0 + \x8D\xA2 |0 + \x8D\xA3 |0 + \xE1\xCB |0 + \x8D\xA4 |0 + \x8D\xA5 |0 + \x8D\xA6 |0 + \x8D\xA7 |0 + \x8D\xA8 |0 + \x8D\xA9 |0 + \x8D\xAA |0 + \x8D\xAB |0 + \xE1\xCC |0 + \xE1\xCA |0 + \x8D\xAC |0 + \x8D\xAD |0 + \x8D\xAE |0 + \x8D\xAF |0 + \x8D\xB0 |0 + \x8D\xB1 |0 + \x8D\xB2 |0 + \x8D\xB3 |0 + \xEF\xFA |0 + \x8D\xB4 |0 + \x8D\xB5 |0 + \xE1\xD3 |0 + \xE1\xD2 |0 + \xC7\xB6 |0 + \x8D\xB6 |0 + \x8D\xB7 |0 + \x8D\xB8 |0 + \x8D\xB9 |0 + \x8D\xBA |0 + \x8D\xBB |0 + \x8D\xBC |0 + \x8D\xBD |0 + \x8D\xBE |0 + \x8D\xBF |0 + \x8D\xC0 |0 + \xE1\xC9 |0 + \x8D\xC1 |0 + \x8D\xC2 |0 + \xE1\xCE |0 + \x8D\xC3 |0 + \xE1\xD0 |0 + \x8D\xC4 |0 + \x8D\xC5 |0 + \x8D\xC6 |0 + \x8D\xC7 |0 + \x8D\xC8 |0 + \x8D\xC9 |0 + \x8D\xCA |0 + \x8D\xCB |0 + \x8D\xCC |0 + \x8D\xCD |0 + \x8D\xCE |0 + \xE1\xD4 |0 + \x8D\xCF |0 + \xE1\xD1 |0 + \xE1\xCD |0 + \x8D\xD0 |0 + \x8D\xD1 |0 + \xE1\xCF |0 + \x8D\xD2 |0 + \x8D\xD3 |0 + \x8D\xD4 |0 + \x8D\xD5 |0 + \xE1\xD5 |0 + \x8D\xD6 |0 + \x8D\xD7 |0 + \x8D\xD8 |0 + \x8D\xD9 |0 + \x8D\xDA |0 + \x8D\xDB |0 + \x8D\xDC |0 + \x8D\xDD |0 + \x8D\xDE |0 + \x8D\xDF |0 + \x8D\xE0 |0 + \x8D\xE1 |0 + \x8D\xE2 |0 + \xE1\xD6 |0 + \x8D\xE3 |0 + \x8D\xE4 |0 + \x8D\xE5 |0 + \x8D\xE6 |0 + \x8D\xE7 |0 + \x8D\xE8 |0 + \x8D\xE9 |0 + \x8D\xEA |0 + \x8D\xEB |0 + \x8D\xEC |0 + \x8D\xED |0 + \x8D\xEE |0 + \x8D\xEF |0 + \x8D\xF0 |0 + \x8D\xF1 |0 + \x8D\xF2 |0 + \x8D\xF3 |0 + \x8D\xF4 |0 + \x8D\xF5 |0 + \x8D\xF6 |0 + \x8D\xF7 |0 + \x8D\xF8 |0 + \xE1\xD7 |0 + \x8D\xF9 |0 + \x8D\xFA |0 + \x8D\xFB |0 + \xE1\xD8 |0 + \x8D\xFC |0 + \x8D\xFD |0 + \x8D\xFE |0 + \x8E\x40 |0 + \x8E\x41 |0 + \x8E\x42 |0 + \x8E\x43 |0 + \x8E\x44 |0 + \x8E\x45 |0 + \x8E\x46 |0 + \x8E\x47 |0 + \x8E\x48 |0 + \x8E\x49 |0 + \x8E\x4A |0 + \x8E\x4B |0 + \x8E\x4C |0 + \x8E\x4D |0 + \x8E\x4E |0 + \x8E\x4F |0 + \x8E\x50 |0 + \x8E\x51 |0 + \x8E\x52 |0 + \x8E\x53 |0 + \x8E\x54 |0 + \x8E\x55 |0 + \xE1\xDA |0 + \x8E\x56 |0 + \x8E\x57 |0 + \x8E\x58 |0 + \x8E\x59 |0 + \x8E\x5A |0 + \x8E\x5B |0 + \x8E\x5C |0 + \x8E\x5D |0 + \x8E\x5E |0 + \x8E\x5F |0 + \x8E\x60 |0 + \x8E\x61 |0 + \x8E\x62 |0 + \xE1\xDB |0 + \x8E\x63 |0 + \x8E\x64 |0 + \x8E\x65 |0 + \x8E\x66 |0 + \x8E\x67 |0 + \x8E\x68 |0 + \x8E\x69 |0 + \xCE\xA1 |0 + \x8E\x6A |0 + \x8E\x6B |0 + \x8E\x6C |0 + \x8E\x6D |0 + \x8E\x6E |0 + \x8E\x6F |0 + \x8E\x70 |0 + \x8E\x71 |0 + \x8E\x72 |0 + \x8E\x73 |0 + \x8E\x74 |0 + \x8E\x75 |0 + \x8E\x76 |0 + \xE7\xDD |0 + \x8E\x77 |0 + \xB4\xA8 |0 + \xD6\xDD |0 + \x8E\x78 |0 + \x8E\x79 |0 + \xD1\xB2 |0 + \xB3\xB2 |0 + \x8E\x7A |0 + \x8E\x7B |0 + \xB9\xA4 |0 + \xD7\xF3 |0 + \xC7\xC9 |0 + \xBE\xDE |0 + \xB9\xAE |0 + \x8E\x7C |0 + \xCE\xD7 |0 + \x8E\x7D |0 + \x8E\x7E |0 + \xB2\xEE |0 + \xDB\xCF |0 + \x8E\x80 |0 + \xBC\xBA |0 + \xD2\xD1 |0 + \xCB\xC8 |0 + \xB0\xCD |0 + \x8E\x81 |0 + \x8E\x82 |0 + \xCF\xEF |0 + \x8E\x83 |0 + \x8E\x84 |0 + \x8E\x85 |0 + \x8E\x86 |0 + \x8E\x87 |0 + \xD9\xE3 |0 + \xBD\xED |0 + \x8E\x88 |0 + \x8E\x89 |0 + \xB1\xD2 |0 + \xCA\xD0 |0 + \xB2\xBC |0 + \x8E\x8A |0 + \xCB\xA7 |0 + \xB7\xAB |0 + \x8E\x8B |0 + \xCA\xA6 |0 + \x8E\x8C |0 + \x8E\x8D |0 + \x8E\x8E |0 + \xCF\xA3 |0 + \x8E\x8F |0 + \x8E\x90 |0 + \xE0\xF8 |0 + \xD5\xCA |0 + \xE0\xFB |0 + \x8E\x91 |0 + \x8E\x92 |0 + \xE0\xFA |0 + \xC5\xC1 |0 + \xCC\xFB |0 + \x8E\x93 |0 + \xC1\xB1 |0 + \xE0\xF9 |0 + \xD6\xE3 |0 + \xB2\xAF |0 + \xD6\xC4 |0 + \xB5\xDB |0 + \x8E\x94 |0 + \x8E\x95 |0 + \x8E\x96 |0 + \x8E\x97 |0 + \x8E\x98 |0 + \x8E\x99 |0 + \x8E\x9A |0 + \x8E\x9B |0 + \xB4\xF8 |0 + \xD6\xA1 |0 + \x8E\x9C |0 + \x8E\x9D |0 + \x8E\x9E |0 + \x8E\x9F |0 + \x8E\xA0 |0 + \xCF\xAF |0 + \xB0\xEF |0 + \x8E\xA1 |0 + \x8E\xA2 |0 + \xE0\xFC |0 + \x8E\xA3 |0 + \x8E\xA4 |0 + \x8E\xA5 |0 + \x8E\xA6 |0 + \x8E\xA7 |0 + \xE1\xA1 |0 + \xB3\xA3 |0 + \x8E\xA8 |0 + \x8E\xA9 |0 + \xE0\xFD |0 + \xE0\xFE |0 + \xC3\xB1 |0 + \x8E\xAA |0 + \x8E\xAB |0 + \x8E\xAC |0 + \x8E\xAD |0 + \xC3\xDD |0 + \x8E\xAE |0 + \xE1\xA2 |0 + \xB7\xF9 |0 + \x8E\xAF |0 + \x8E\xB0 |0 + \x8E\xB1 |0 + \x8E\xB2 |0 + \x8E\xB3 |0 + \x8E\xB4 |0 + \xBB\xCF |0 + \x8E\xB5 |0 + \x8E\xB6 |0 + \x8E\xB7 |0 + \x8E\xB8 |0 + \x8E\xB9 |0 + \x8E\xBA |0 + \x8E\xBB |0 + \xE1\xA3 |0 + \xC4\xBB |0 + \x8E\xBC |0 + \x8E\xBD |0 + \x8E\xBE |0 + \x8E\xBF |0 + \x8E\xC0 |0 + \xE1\xA4 |0 + \x8E\xC1 |0 + \x8E\xC2 |0 + \xE1\xA5 |0 + \x8E\xC3 |0 + \x8E\xC4 |0 + \xE1\xA6 |0 + \xB4\xB1 |0 + \x8E\xC5 |0 + \x8E\xC6 |0 + \x8E\xC7 |0 + \x8E\xC8 |0 + \x8E\xC9 |0 + \x8E\xCA |0 + \x8E\xCB |0 + \x8E\xCC |0 + \x8E\xCD |0 + \x8E\xCE |0 + \x8E\xCF |0 + \x8E\xD0 |0 + \x8E\xD1 |0 + \x8E\xD2 |0 + \x8E\xD3 |0 + \xB8\xC9 |0 + \xC6\xBD |0 + \xC4\xEA |0 + \x8E\xD4 |0 + \xB2\xA2 |0 + \x8E\xD5 |0 + \xD0\xD2 |0 + \x8E\xD6 |0 + \xE7\xDB |0 + \xBB\xC3 |0 + \xD3\xD7 |0 + \xD3\xC4 |0 + \x8E\xD7 |0 + \xB9\xE3 |0 + \xE2\xCF |0 + \x8E\xD8 |0 + \x8E\xD9 |0 + \x8E\xDA |0 + \xD7\xAF |0 + \x8E\xDB |0 + \xC7\xEC |0 + \xB1\xD3 |0 + \x8E\xDC |0 + \x8E\xDD |0 + \xB4\xB2 |0 + \xE2\xD1 |0 + \x8E\xDE |0 + \x8E\xDF |0 + \x8E\xE0 |0 + \xD0\xF2 |0 + \xC2\xAE |0 + \xE2\xD0 |0 + \x8E\xE1 |0 + \xBF\xE2 |0 + \xD3\xA6 |0 + \xB5\xD7 |0 + \xE2\xD2 |0 + \xB5\xEA |0 + \x8E\xE2 |0 + \xC3\xED |0 + \xB8\xFD |0 + \x8E\xE3 |0 + \xB8\xAE |0 + \x8E\xE4 |0 + \xC5\xD3 |0 + \xB7\xCF |0 + \xE2\xD4 |0 + \x8E\xE5 |0 + \x8E\xE6 |0 + \x8E\xE7 |0 + \x8E\xE8 |0 + \xE2\xD3 |0 + \xB6\xC8 |0 + \xD7\xF9 |0 + \x8E\xE9 |0 + \x8E\xEA |0 + \x8E\xEB |0 + \x8E\xEC |0 + \x8E\xED |0 + \xCD\xA5 |0 + \x8E\xEE |0 + \x8E\xEF |0 + \x8E\xF0 |0 + \x8E\xF1 |0 + \x8E\xF2 |0 + \xE2\xD8 |0 + \x8E\xF3 |0 + \xE2\xD6 |0 + \xCA\xFC |0 + \xBF\xB5 |0 + \xD3\xB9 |0 + \xE2\xD5 |0 + \x8E\xF4 |0 + \x8E\xF5 |0 + \x8E\xF6 |0 + \x8E\xF7 |0 + \xE2\xD7 |0 + \x8E\xF8 |0 + \x8E\xF9 |0 + \x8E\xFA |0 + \x8E\xFB |0 + \x8E\xFC |0 + \x8E\xFD |0 + \x8E\xFE |0 + \x8F\x40 |0 + \x8F\x41 |0 + \x8F\x42 |0 + \xC1\xAE |0 + \xC0\xC8 |0 + \x8F\x43 |0 + \x8F\x44 |0 + \x8F\x45 |0 + \x8F\x46 |0 + \x8F\x47 |0 + \x8F\x48 |0 + \xE2\xDB |0 + \xE2\xDA |0 + \xC0\xAA |0 + \x8F\x49 |0 + \x8F\x4A |0 + \xC1\xCE |0 + \x8F\x4B |0 + \x8F\x4C |0 + \x8F\x4D |0 + \x8F\x4E |0 + \xE2\xDC |0 + \x8F\x4F |0 + \x8F\x50 |0 + \x8F\x51 |0 + \x8F\x52 |0 + \x8F\x53 |0 + \x8F\x54 |0 + \x8F\x55 |0 + \x8F\x56 |0 + \x8F\x57 |0 + \x8F\x58 |0 + \x8F\x59 |0 + \x8F\x5A |0 + \xE2\xDD |0 + \x8F\x5B |0 + \xE2\xDE |0 + \x8F\x5C |0 + \x8F\x5D |0 + \x8F\x5E |0 + \x8F\x5F |0 + \x8F\x60 |0 + \x8F\x61 |0 + \x8F\x62 |0 + \x8F\x63 |0 + \x8F\x64 |0 + \xDB\xC8 |0 + \x8F\x65 |0 + \xD1\xD3 |0 + \xCD\xA2 |0 + \x8F\x66 |0 + \x8F\x67 |0 + \xBD\xA8 |0 + \x8F\x68 |0 + \x8F\x69 |0 + \x8F\x6A |0 + \xDE\xC3 |0 + \xD8\xA5 |0 + \xBF\xAA |0 + \xDB\xCD |0 + \xD2\xEC |0 + \xC6\xFA |0 + \xC5\xAA |0 + \x8F\x6B |0 + \x8F\x6C |0 + \x8F\x6D |0 + \xDE\xC4 |0 + \x8F\x6E |0 + \xB1\xD7 |0 + \xDF\xAE |0 + \x8F\x6F |0 + \x8F\x70 |0 + \x8F\x71 |0 + \xCA\xBD |0 + \x8F\x72 |0 + \xDF\xB1 |0 + \x8F\x73 |0 + \xB9\xAD |0 + \x8F\x74 |0 + \xD2\xFD |0 + \x8F\x75 |0 + \xB8\xA5 |0 + \xBA\xEB |0 + \x8F\x76 |0 + \x8F\x77 |0 + \xB3\xDA |0 + \x8F\x78 |0 + \x8F\x79 |0 + \x8F\x7A |0 + \xB5\xDC |0 + \xD5\xC5 |0 + \x8F\x7B |0 + \x8F\x7C |0 + \x8F\x7D |0 + \x8F\x7E |0 + \xC3\xD6 |0 + \xCF\xD2 |0 + \xBB\xA1 |0 + \x8F\x80 |0 + \xE5\xF3 |0 + \xE5\xF2 |0 + \x8F\x81 |0 + \x8F\x82 |0 + \xE5\xF4 |0 + \x8F\x83 |0 + \xCD\xE4 |0 + \x8F\x84 |0 + \xC8\xF5 |0 + \x8F\x85 |0 + \x8F\x86 |0 + \x8F\x87 |0 + \x8F\x88 |0 + \x8F\x89 |0 + \x8F\x8A |0 + \x8F\x8B |0 + \xB5\xAF |0 + \xC7\xBF |0 + \x8F\x8C |0 + \xE5\xF6 |0 + \x8F\x8D |0 + \x8F\x8E |0 + \x8F\x8F |0 + \xEC\xB0 |0 + \x8F\x90 |0 + \x8F\x91 |0 + \x8F\x92 |0 + \x8F\x93 |0 + \x8F\x94 |0 + \x8F\x95 |0 + \x8F\x96 |0 + \x8F\x97 |0 + \x8F\x98 |0 + \x8F\x99 |0 + \x8F\x9A |0 + \x8F\x9B |0 + \x8F\x9C |0 + \x8F\x9D |0 + \x8F\x9E |0 + \xE5\xE6 |0 + \x8F\x9F |0 + \xB9\xE9 |0 + \xB5\xB1 |0 + \x8F\xA0 |0 + \xC2\xBC |0 + \xE5\xE8 |0 + \xE5\xE7 |0 + \xE5\xE9 |0 + \x8F\xA1 |0 + \x8F\xA2 |0 + \x8F\xA3 |0 + \x8F\xA4 |0 + \xD2\xCD |0 + \x8F\xA5 |0 + \x8F\xA6 |0 + \x8F\xA7 |0 + \xE1\xEA |0 + \xD0\xCE |0 + \x8F\xA8 |0 + \xCD\xAE |0 + \x8F\xA9 |0 + \xD1\xE5 |0 + \x8F\xAA |0 + \x8F\xAB |0 + \xB2\xCA |0 + \xB1\xEB |0 + \x8F\xAC |0 + \xB1\xF2 |0 + \xC5\xED |0 + \x8F\xAD |0 + \x8F\xAE |0 + \xD5\xC3 |0 + \xD3\xB0 |0 + \x8F\xAF |0 + \xE1\xDC |0 + \x8F\xB0 |0 + \x8F\xB1 |0 + \x8F\xB2 |0 + \xE1\xDD |0 + \x8F\xB3 |0 + \xD2\xDB |0 + \x8F\xB4 |0 + \xB3\xB9 |0 + \xB1\xCB |0 + \x8F\xB5 |0 + \x8F\xB6 |0 + \x8F\xB7 |0 + \xCD\xF9 |0 + \xD5\xF7 |0 + \xE1\xDE |0 + \x8F\xB8 |0 + \xBE\xB6 |0 + \xB4\xFD |0 + \x8F\xB9 |0 + \xE1\xDF |0 + \xBA\xDC |0 + \xE1\xE0 |0 + \xBB\xB2 |0 + \xC2\xC9 |0 + \xE1\xE1 |0 + \x8F\xBA |0 + \x8F\xBB |0 + \x8F\xBC |0 + \xD0\xEC |0 + \x8F\xBD |0 + \xCD\xBD |0 + \x8F\xBE |0 + \x8F\xBF |0 + \xE1\xE2 |0 + \x8F\xC0 |0 + \xB5\xC3 |0 + \xC5\xC7 |0 + \xE1\xE3 |0 + \x8F\xC1 |0 + \x8F\xC2 |0 + \xE1\xE4 |0 + \x8F\xC3 |0 + \x8F\xC4 |0 + \x8F\xC5 |0 + \x8F\xC6 |0 + \xD3\xF9 |0 + \x8F\xC7 |0 + \x8F\xC8 |0 + \x8F\xC9 |0 + \x8F\xCA |0 + \x8F\xCB |0 + \x8F\xCC |0 + \xE1\xE5 |0 + \x8F\xCD |0 + \xD1\xAD |0 + \x8F\xCE |0 + \x8F\xCF |0 + \xE1\xE6 |0 + \xCE\xA2 |0 + \x8F\xD0 |0 + \x8F\xD1 |0 + \x8F\xD2 |0 + \x8F\xD3 |0 + \x8F\xD4 |0 + \x8F\xD5 |0 + \xE1\xE7 |0 + \x8F\xD6 |0 + \xB5\xC2 |0 + \x8F\xD7 |0 + \x8F\xD8 |0 + \x8F\xD9 |0 + \x8F\xDA |0 + \xE1\xE8 |0 + \xBB\xD5 |0 + \x8F\xDB |0 + \x8F\xDC |0 + \x8F\xDD |0 + \x8F\xDE |0 + \x8F\xDF |0 + \xD0\xC4 |0 + \xE2\xE0 |0 + \xB1\xD8 |0 + \xD2\xE4 |0 + \x8F\xE0 |0 + \x8F\xE1 |0 + \xE2\xE1 |0 + \x8F\xE2 |0 + \x8F\xE3 |0 + \xBC\xC9 |0 + \xC8\xCC |0 + \x8F\xE4 |0 + \xE2\xE3 |0 + \xEC\xFE |0 + \xEC\xFD |0 + \xDF\xAF |0 + \x8F\xE5 |0 + \x8F\xE6 |0 + \x8F\xE7 |0 + \xE2\xE2 |0 + \xD6\xBE |0 + \xCD\xFC |0 + \xC3\xA6 |0 + \x8F\xE8 |0 + \x8F\xE9 |0 + \x8F\xEA |0 + \xE3\xC3 |0 + \x8F\xEB |0 + \x8F\xEC |0 + \xD6\xD2 |0 + \xE2\xE7 |0 + \x8F\xED |0 + \x8F\xEE |0 + \xE2\xE8 |0 + \x8F\xEF |0 + \x8F\xF0 |0 + \xD3\xC7 |0 + \x8F\xF1 |0 + \x8F\xF2 |0 + \xE2\xEC |0 + \xBF\xEC |0 + \x8F\xF3 |0 + \xE2\xED |0 + \xE2\xE5 |0 + \x8F\xF4 |0 + \x8F\xF5 |0 + \xB3\xC0 |0 + \x8F\xF6 |0 + \x8F\xF7 |0 + \x8F\xF8 |0 + \xC4\xEE |0 + \x8F\xF9 |0 + \x8F\xFA |0 + \xE2\xEE |0 + \x8F\xFB |0 + \x8F\xFC |0 + \xD0\xC3 |0 + \x8F\xFD |0 + \xBA\xF6 |0 + \xE2\xE9 |0 + \xB7\xDE |0 + \xBB\xB3 |0 + \xCC\xAC |0 + \xCB\xCB |0 + \xE2\xE4 |0 + \xE2\xE6 |0 + \xE2\xEA |0 + \xE2\xEB |0 + \x8F\xFE |0 + \x90\x40 |0 + \x90\x41 |0 + \xE2\xF7 |0 + \x90\x42 |0 + \x90\x43 |0 + \xE2\xF4 |0 + \xD4\xF5 |0 + \xE2\xF3 |0 + \x90\x44 |0 + \x90\x45 |0 + \xC5\xAD |0 + \x90\x46 |0 + \xD5\xFA |0 + \xC5\xC2 |0 + \xB2\xC0 |0 + \x90\x47 |0 + \x90\x48 |0 + \xE2\xEF |0 + \x90\x49 |0 + \xE2\xF2 |0 + \xC1\xAF |0 + \xCB\xBC |0 + \x90\x4A |0 + \x90\x4B |0 + \xB5\xA1 |0 + \xE2\xF9 |0 + \x90\x4C |0 + \x90\x4D |0 + \x90\x4E |0 + \xBC\xB1 |0 + \xE2\xF1 |0 + \xD0\xD4 |0 + \xD4\xB9 |0 + \xE2\xF5 |0 + \xB9\xD6 |0 + \xE2\xF6 |0 + \x90\x4F |0 + \x90\x50 |0 + \x90\x51 |0 + \xC7\xD3 |0 + \x90\x52 |0 + \x90\x53 |0 + \x90\x54 |0 + \x90\x55 |0 + \x90\x56 |0 + \xE2\xF0 |0 + \x90\x57 |0 + \x90\x58 |0 + \x90\x59 |0 + \x90\x5A |0 + \x90\x5B |0 + \xD7\xDC |0 + \xED\xA1 |0 + \x90\x5C |0 + \x90\x5D |0 + \xE2\xF8 |0 + \x90\x5E |0 + \xED\xA5 |0 + \xE2\xFE |0 + \xCA\xD1 |0 + \x90\x5F |0 + \x90\x60 |0 + \x90\x61 |0 + \x90\x62 |0 + \x90\x63 |0 + \x90\x64 |0 + \x90\x65 |0 + \xC1\xB5 |0 + \x90\x66 |0 + \xBB\xD0 |0 + \x90\x67 |0 + \x90\x68 |0 + \xBF\xD6 |0 + \x90\x69 |0 + \xBA\xE3 |0 + \x90\x6A |0 + \x90\x6B |0 + \xCB\xA1 |0 + \x90\x6C |0 + \x90\x6D |0 + \x90\x6E |0 + \xED\xA6 |0 + \xED\xA3 |0 + \x90\x6F |0 + \x90\x70 |0 + \xED\xA2 |0 + \x90\x71 |0 + \x90\x72 |0 + \x90\x73 |0 + \x90\x74 |0 + \xBB\xD6 |0 + \xED\xA7 |0 + \xD0\xF4 |0 + \x90\x75 |0 + \x90\x76 |0 + \xED\xA4 |0 + \xBA\xDE |0 + \xB6\xF7 |0 + \xE3\xA1 |0 + \xB6\xB2 |0 + \xCC\xF1 |0 + \xB9\xA7 |0 + \x90\x77 |0 + \xCF\xA2 |0 + \xC7\xA1 |0 + \x90\x78 |0 + \x90\x79 |0 + \xBF\xD2 |0 + \x90\x7A |0 + \x90\x7B |0 + \xB6\xF1 |0 + \x90\x7C |0 + \xE2\xFA |0 + \xE2\xFB |0 + \xE2\xFD |0 + \xE2\xFC |0 + \xC4\xD5 |0 + \xE3\xA2 |0 + \x90\x7D |0 + \xD3\xC1 |0 + \x90\x7E |0 + \x90\x80 |0 + \x90\x81 |0 + \xE3\xA7 |0 + \xC7\xC4 |0 + \x90\x82 |0 + \x90\x83 |0 + \x90\x84 |0 + \x90\x85 |0 + \xCF\xA4 |0 + \x90\x86 |0 + \x90\x87 |0 + \xE3\xA9 |0 + \xBA\xB7 |0 + \x90\x88 |0 + \x90\x89 |0 + \x90\x8A |0 + \x90\x8B |0 + \xE3\xA8 |0 + \x90\x8C |0 + \xBB\xDA |0 + \x90\x8D |0 + \xE3\xA3 |0 + \x90\x8E |0 + \x90\x8F |0 + \x90\x90 |0 + \xE3\xA4 |0 + \xE3\xAA |0 + \x90\x91 |0 + \xE3\xA6 |0 + \x90\x92 |0 + \xCE\xF2 |0 + \xD3\xC6 |0 + \x90\x93 |0 + \x90\x94 |0 + \xBB\xBC |0 + \x90\x95 |0 + \x90\x96 |0 + \xD4\xC3 |0 + \x90\x97 |0 + \xC4\xFA |0 + \x90\x98 |0 + \x90\x99 |0 + \xED\xA8 |0 + \xD0\xFC |0 + \xE3\xA5 |0 + \x90\x9A |0 + \xC3\xF5 |0 + \x90\x9B |0 + \xE3\xAD |0 + \xB1\xAF |0 + \x90\x9C |0 + \xE3\xB2 |0 + \x90\x9D |0 + \x90\x9E |0 + \x90\x9F |0 + \xBC\xC2 |0 + \x90\xA0 |0 + \x90\xA1 |0 + \xE3\xAC |0 + \xB5\xBF |0 + \x90\xA2 |0 + \x90\xA3 |0 + \x90\xA4 |0 + \x90\xA5 |0 + \x90\xA6 |0 + \x90\xA7 |0 + \x90\xA8 |0 + \x90\xA9 |0 + \xC7\xE9 |0 + \xE3\xB0 |0 + \x90\xAA |0 + \x90\xAB |0 + \x90\xAC |0 + \xBE\xAA |0 + \xCD\xEF |0 + \x90\xAD |0 + \x90\xAE |0 + \x90\xAF |0 + \x90\xB0 |0 + \x90\xB1 |0 + \xBB\xF3 |0 + \x90\xB2 |0 + \x90\xB3 |0 + \x90\xB4 |0 + \xCC\xE8 |0 + \x90\xB5 |0 + \x90\xB6 |0 + \xE3\xAF |0 + \x90\xB7 |0 + \xE3\xB1 |0 + \x90\xB8 |0 + \xCF\xA7 |0 + \xE3\xAE |0 + \x90\xB9 |0 + \xCE\xA9 |0 + \xBB\xDD |0 + \x90\xBA |0 + \x90\xBB |0 + \x90\xBC |0 + \x90\xBD |0 + \x90\xBE |0 + \xB5\xEB |0 + \xBE\xE5 |0 + \xB2\xD2 |0 + \xB3\xCD |0 + \x90\xBF |0 + \xB1\xB9 |0 + \xE3\xAB |0 + \xB2\xD1 |0 + \xB5\xAC |0 + \xB9\xDF |0 + \xB6\xE8 |0 + \x90\xC0 |0 + \x90\xC1 |0 + \xCF\xEB |0 + \xE3\xB7 |0 + \x90\xC2 |0 + \xBB\xCC |0 + \x90\xC3 |0 + \x90\xC4 |0 + \xC8\xC7 |0 + \xD0\xCA |0 + \x90\xC5 |0 + \x90\xC6 |0 + \x90\xC7 |0 + \x90\xC8 |0 + \x90\xC9 |0 + \xE3\xB8 |0 + \xB3\xEE |0 + \x90\xCA |0 + \x90\xCB |0 + \x90\xCC |0 + \x90\xCD |0 + \xED\xA9 |0 + \x90\xCE |0 + \xD3\xFA |0 + \xD3\xE4 |0 + \x90\xCF |0 + \x90\xD0 |0 + \x90\xD1 |0 + \xED\xAA |0 + \xE3\xB9 |0 + \xD2\xE2 |0 + \x90\xD2 |0 + \x90\xD3 |0 + \x90\xD4 |0 + \x90\xD5 |0 + \x90\xD6 |0 + \xE3\xB5 |0 + \x90\xD7 |0 + \x90\xD8 |0 + \x90\xD9 |0 + \x90\xDA |0 + \xD3\xDE |0 + \x90\xDB |0 + \x90\xDC |0 + \x90\xDD |0 + \x90\xDE |0 + \xB8\xD0 |0 + \xE3\xB3 |0 + \x90\xDF |0 + \x90\xE0 |0 + \xE3\xB6 |0 + \xB7\xDF |0 + \x90\xE1 |0 + \xE3\xB4 |0 + \xC0\xA2 |0 + \x90\xE2 |0 + \x90\xE3 |0 + \x90\xE4 |0 + \xE3\xBA |0 + \x90\xE5 |0 + \x90\xE6 |0 + \x90\xE7 |0 + \x90\xE8 |0 + \x90\xE9 |0 + \x90\xEA |0 + \x90\xEB |0 + \x90\xEC |0 + \x90\xED |0 + \x90\xEE |0 + \x90\xEF |0 + \x90\xF0 |0 + \x90\xF1 |0 + \x90\xF2 |0 + \x90\xF3 |0 + \x90\xF4 |0 + \x90\xF5 |0 + \x90\xF6 |0 + \x90\xF7 |0 + \xD4\xB8 |0 + \x90\xF8 |0 + \x90\xF9 |0 + \x90\xFA |0 + \x90\xFB |0 + \x90\xFC |0 + \x90\xFD |0 + \x90\xFE |0 + \x91\x40 |0 + \xB4\xC8 |0 + \x91\x41 |0 + \xE3\xBB |0 + \x91\x42 |0 + \xBB\xC5 |0 + \x91\x43 |0 + \xC9\xF7 |0 + \x91\x44 |0 + \x91\x45 |0 + \xC9\xE5 |0 + \x91\x46 |0 + \x91\x47 |0 + \x91\x48 |0 + \xC4\xBD |0 + \x91\x49 |0 + \x91\x4A |0 + \x91\x4B |0 + \x91\x4C |0 + \x91\x4D |0 + \x91\x4E |0 + \x91\x4F |0 + \xED\xAB |0 + \x91\x50 |0 + \x91\x51 |0 + \x91\x52 |0 + \x91\x53 |0 + \xC2\xFD |0 + \x91\x54 |0 + \x91\x55 |0 + \x91\x56 |0 + \x91\x57 |0 + \xBB\xDB |0 + \xBF\xAE |0 + \x91\x58 |0 + \x91\x59 |0 + \x91\x5A |0 + \x91\x5B |0 + \x91\x5C |0 + \x91\x5D |0 + \x91\x5E |0 + \xCE\xBF |0 + \x91\x5F |0 + \x91\x60 |0 + \x91\x61 |0 + \x91\x62 |0 + \xE3\xBC |0 + \x91\x63 |0 + \xBF\xB6 |0 + \x91\x64 |0 + \x91\x65 |0 + \x91\x66 |0 + \x91\x67 |0 + \x91\x68 |0 + \x91\x69 |0 + \x91\x6A |0 + \x91\x6B |0 + \x91\x6C |0 + \x91\x6D |0 + \x91\x6E |0 + \x91\x6F |0 + \x91\x70 |0 + \x91\x71 |0 + \x91\x72 |0 + \x91\x73 |0 + \x91\x74 |0 + \x91\x75 |0 + \x91\x76 |0 + \xB1\xEF |0 + \x91\x77 |0 + \x91\x78 |0 + \xD4\xF7 |0 + \x91\x79 |0 + \x91\x7A |0 + \x91\x7B |0 + \x91\x7C |0 + \x91\x7D |0 + \xE3\xBE |0 + \x91\x7E |0 + \x91\x80 |0 + \x91\x81 |0 + \x91\x82 |0 + \x91\x83 |0 + \x91\x84 |0 + \x91\x85 |0 + \x91\x86 |0 + \xED\xAD |0 + \x91\x87 |0 + \x91\x88 |0 + \x91\x89 |0 + \x91\x8A |0 + \x91\x8B |0 + \x91\x8C |0 + \x91\x8D |0 + \x91\x8E |0 + \x91\x8F |0 + \xE3\xBF |0 + \xBA\xA9 |0 + \xED\xAC |0 + \x91\x90 |0 + \x91\x91 |0 + \xE3\xBD |0 + \x91\x92 |0 + \x91\x93 |0 + \x91\x94 |0 + \x91\x95 |0 + \x91\x96 |0 + \x91\x97 |0 + \x91\x98 |0 + \x91\x99 |0 + \x91\x9A |0 + \x91\x9B |0 + \xE3\xC0 |0 + \x91\x9C |0 + \x91\x9D |0 + \x91\x9E |0 + \x91\x9F |0 + \x91\xA0 |0 + \x91\xA1 |0 + \xBA\xB6 |0 + \x91\xA2 |0 + \x91\xA3 |0 + \x91\xA4 |0 + \xB6\xAE |0 + \x91\xA5 |0 + \x91\xA6 |0 + \x91\xA7 |0 + \x91\xA8 |0 + \x91\xA9 |0 + \xD0\xB8 |0 + \x91\xAA |0 + \xB0\xC3 |0 + \xED\xAE |0 + \x91\xAB |0 + \x91\xAC |0 + \x91\xAD |0 + \x91\xAE |0 + \x91\xAF |0 + \xED\xAF |0 + \xC0\xC1 |0 + \x91\xB0 |0 + \xE3\xC1 |0 + \x91\xB1 |0 + \x91\xB2 |0 + \x91\xB3 |0 + \x91\xB4 |0 + \x91\xB5 |0 + \x91\xB6 |0 + \x91\xB7 |0 + \x91\xB8 |0 + \x91\xB9 |0 + \x91\xBA |0 + \x91\xBB |0 + \x91\xBC |0 + \x91\xBD |0 + \x91\xBE |0 + \x91\xBF |0 + \x91\xC0 |0 + \x91\xC1 |0 + \xC5\xB3 |0 + \x91\xC2 |0 + \x91\xC3 |0 + \x91\xC4 |0 + \x91\xC5 |0 + \x91\xC6 |0 + \x91\xC7 |0 + \x91\xC8 |0 + \x91\xC9 |0 + \x91\xCA |0 + \x91\xCB |0 + \x91\xCC |0 + \x91\xCD |0 + \x91\xCE |0 + \x91\xCF |0 + \xE3\xC2 |0 + \x91\xD0 |0 + \x91\xD1 |0 + \x91\xD2 |0 + \x91\xD3 |0 + \x91\xD4 |0 + \x91\xD5 |0 + \x91\xD6 |0 + \x91\xD7 |0 + \x91\xD8 |0 + \xDC\xB2 |0 + \x91\xD9 |0 + \x91\xDA |0 + \x91\xDB |0 + \x91\xDC |0 + \x91\xDD |0 + \x91\xDE |0 + \xED\xB0 |0 + \x91\xDF |0 + \xB8\xEA |0 + \x91\xE0 |0 + \xCE\xEC |0 + \xEA\xA7 |0 + \xD0\xE7 |0 + \xCA\xF9 |0 + \xC8\xD6 |0 + \xCF\xB7 |0 + \xB3\xC9 |0 + \xCE\xD2 |0 + \xBD\xE4 |0 + \x91\xE1 |0 + \x91\xE2 |0 + \xE3\xDE |0 + \xBB\xF2 |0 + \xEA\xA8 |0 + \xD5\xBD |0 + \x91\xE3 |0 + \xC6\xDD |0 + \xEA\xA9 |0 + \x91\xE4 |0 + \x91\xE5 |0 + \x91\xE6 |0 + \xEA\xAA |0 + \x91\xE7 |0 + \xEA\xAC |0 + \xEA\xAB |0 + \x91\xE8 |0 + \xEA\xAE |0 + \xEA\xAD |0 + \x91\xE9 |0 + \x91\xEA |0 + \x91\xEB |0 + \x91\xEC |0 + \xBD\xD8 |0 + \x91\xED |0 + \xEA\xAF |0 + \x91\xEE |0 + \xC2\xBE |0 + \x91\xEF |0 + \x91\xF0 |0 + \x91\xF1 |0 + \x91\xF2 |0 + \xB4\xC1 |0 + \xB4\xF7 |0 + \x91\xF3 |0 + \x91\xF4 |0 + \xBB\xA7 |0 + \x91\xF5 |0 + \x91\xF6 |0 + \x91\xF7 |0 + \x91\xF8 |0 + \x91\xF9 |0 + \xEC\xE6 |0 + \xEC\xE5 |0 + \xB7\xBF |0 + \xCB\xF9 |0 + \xB1\xE2 |0 + \x91\xFA |0 + \xEC\xE7 |0 + \x91\xFB |0 + \x91\xFC |0 + \x91\xFD |0 + \xC9\xC8 |0 + \xEC\xE8 |0 + \xEC\xE9 |0 + \x91\xFE |0 + \xCA\xD6 |0 + \xDE\xD0 |0 + \xB2\xC5 |0 + \xD4\xFA |0 + \x92\x40 |0 + \x92\x41 |0 + \xC6\xCB |0 + \xB0\xC7 |0 + \xB4\xF2 |0 + \xC8\xD3 |0 + \x92\x42 |0 + \x92\x43 |0 + \x92\x44 |0 + \xCD\xD0 |0 + \x92\x45 |0 + \x92\x46 |0 + \xBF\xB8 |0 + \x92\x47 |0 + \x92\x48 |0 + \x92\x49 |0 + \x92\x4A |0 + \x92\x4B |0 + \x92\x4C |0 + \x92\x4D |0 + \xBF\xDB |0 + \x92\x4E |0 + \x92\x4F |0 + \xC7\xA4 |0 + \xD6\xB4 |0 + \x92\x50 |0 + \xC0\xA9 |0 + \xDE\xD1 |0 + \xC9\xA8 |0 + \xD1\xEF |0 + \xC5\xA4 |0 + \xB0\xE7 |0 + \xB3\xB6 |0 + \xC8\xC5 |0 + \x92\x51 |0 + \x92\x52 |0 + \xB0\xE2 |0 + \x92\x53 |0 + \x92\x54 |0 + \xB7\xF6 |0 + \x92\x55 |0 + \x92\x56 |0 + \xC5\xFA |0 + \x92\x57 |0 + \x92\x58 |0 + \xB6\xF3 |0 + \x92\x59 |0 + \xD5\xD2 |0 + \xB3\xD0 |0 + \xBC\xBC |0 + \x92\x5A |0 + \x92\x5B |0 + \x92\x5C |0 + \xB3\xAD |0 + \x92\x5D |0 + \x92\x5E |0 + \x92\x5F |0 + \x92\x60 |0 + \xBE\xF1 |0 + \xB0\xD1 |0 + \x92\x61 |0 + \x92\x62 |0 + \x92\x63 |0 + \x92\x64 |0 + \x92\x65 |0 + \x92\x66 |0 + \xD2\xD6 |0 + \xCA\xE3 |0 + \xD7\xA5 |0 + \x92\x67 |0 + \xCD\xB6 |0 + \xB6\xB6 |0 + \xBF\xB9 |0 + \xD5\xDB |0 + \x92\x68 |0 + \xB8\xA7 |0 + \xC5\xD7 |0 + \x92\x69 |0 + \x92\x6A |0 + \x92\x6B |0 + \xDE\xD2 |0 + \xBF\xD9 |0 + \xC2\xD5 |0 + \xC7\xC0 |0 + \x92\x6C |0 + \xBB\xA4 |0 + \xB1\xA8 |0 + \x92\x6D |0 + \x92\x6E |0 + \xC5\xEA |0 + \x92\x6F |0 + \x92\x70 |0 + \xC5\xFB |0 + \xCC\xA7 |0 + \x92\x71 |0 + \x92\x72 |0 + \x92\x73 |0 + \x92\x74 |0 + \xB1\xA7 |0 + \x92\x75 |0 + \x92\x76 |0 + \x92\x77 |0 + \xB5\xD6 |0 + \x92\x78 |0 + \x92\x79 |0 + \x92\x7A |0 + \xC4\xA8 |0 + \x92\x7B |0 + \xDE\xD3 |0 + \xD1\xBA |0 + \xB3\xE9 |0 + \x92\x7C |0 + \xC3\xF2 |0 + \x92\x7D |0 + \x92\x7E |0 + \xB7\xF7 |0 + \x92\x80 |0 + \xD6\xF4 |0 + \xB5\xA3 |0 + \xB2\xF0 |0 + \xC4\xB4 |0 + \xC4\xE9 |0 + \xC0\xAD |0 + \xDE\xD4 |0 + \x92\x81 |0 + \xB0\xE8 |0 + \xC5\xC4 |0 + \xC1\xE0 |0 + \x92\x82 |0 + \xB9\xD5 |0 + \x92\x83 |0 + \xBE\xDC |0 + \xCD\xD8 |0 + \xB0\xCE |0 + \x92\x84 |0 + \xCD\xCF |0 + \xDE\xD6 |0 + \xBE\xD0 |0 + \xD7\xBE |0 + \xDE\xD5 |0 + \xD5\xD0 |0 + \xB0\xDD |0 + \x92\x85 |0 + \x92\x86 |0 + \xC4\xE2 |0 + \x92\x87 |0 + \x92\x88 |0 + \xC2\xA3 |0 + \xBC\xF0 |0 + \x92\x89 |0 + \xD3\xB5 |0 + \xC0\xB9 |0 + \xC5\xA1 |0 + \xB2\xA6 |0 + \xD4\xF1 |0 + \x92\x8A |0 + \x92\x8B |0 + \xC0\xA8 |0 + \xCA\xC3 |0 + \xDE\xD7 |0 + \xD5\xFC |0 + \x92\x8C |0 + \xB9\xB0 |0 + \x92\x8D |0 + \xC8\xAD |0 + \xCB\xA9 |0 + \x92\x8E |0 + \xDE\xD9 |0 + \xBF\xBD |0 + \x92\x8F |0 + \x92\x90 |0 + \x92\x91 |0 + \x92\x92 |0 + \xC6\xB4 |0 + \xD7\xA7 |0 + \xCA\xB0 |0 + \xC4\xC3 |0 + \x92\x93 |0 + \xB3\xD6 |0 + \xB9\xD2 |0 + \x92\x94 |0 + \x92\x95 |0 + \x92\x96 |0 + \x92\x97 |0 + \xD6\xB8 |0 + \xEA\xFC |0 + \xB0\xB4 |0 + \x92\x98 |0 + \x92\x99 |0 + \x92\x9A |0 + \x92\x9B |0 + \xBF\xE6 |0 + \x92\x9C |0 + \x92\x9D |0 + \xCC\xF4 |0 + \x92\x9E |0 + \x92\x9F |0 + \x92\xA0 |0 + \x92\xA1 |0 + \xCD\xDA |0 + \x92\xA2 |0 + \x92\xA3 |0 + \x92\xA4 |0 + \xD6\xBF |0 + \xC2\xCE |0 + \x92\xA5 |0 + \xCE\xCE |0 + \xCC\xA2 |0 + \xD0\xAE |0 + \xC4\xD3 |0 + \xB5\xB2 |0 + \xDE\xD8 |0 + \xD5\xF5 |0 + \xBC\xB7 |0 + \xBB\xD3 |0 + \x92\xA6 |0 + \x92\xA7 |0 + \xB0\xA4 |0 + \x92\xA8 |0 + \xC5\xB2 |0 + \xB4\xEC |0 + \x92\xA9 |0 + \x92\xAA |0 + \x92\xAB |0 + \xD5\xF1 |0 + \x92\xAC |0 + \x92\xAD |0 + \xEA\xFD |0 + \x92\xAE |0 + \x92\xAF |0 + \x92\xB0 |0 + \x92\xB1 |0 + \x92\xB2 |0 + \x92\xB3 |0 + \xDE\xDA |0 + \xCD\xA6 |0 + \x92\xB4 |0 + \x92\xB5 |0 + \xCD\xEC |0 + \x92\xB6 |0 + \x92\xB7 |0 + \x92\xB8 |0 + \x92\xB9 |0 + \xCE\xE6 |0 + \xDE\xDC |0 + \x92\xBA |0 + \xCD\xB1 |0 + \xC0\xA6 |0 + \x92\xBB |0 + \x92\xBC |0 + \xD7\xBD |0 + \x92\xBD |0 + \xDE\xDB |0 + \xB0\xC6 |0 + \xBA\xB4 |0 + \xC9\xD3 |0 + \xC4\xF3 |0 + \xBE\xE8 |0 + \x92\xBE |0 + \x92\xBF |0 + \x92\xC0 |0 + \x92\xC1 |0 + \xB2\xB6 |0 + \x92\xC2 |0 + \x92\xC3 |0 + \x92\xC4 |0 + \x92\xC5 |0 + \x92\xC6 |0 + \x92\xC7 |0 + \x92\xC8 |0 + \x92\xC9 |0 + \xC0\xCC |0 + \xCB\xF0 |0 + \x92\xCA |0 + \xBC\xF1 |0 + \xBB\xBB |0 + \xB5\xB7 |0 + \x92\xCB |0 + \x92\xCC |0 + \x92\xCD |0 + \xC5\xF5 |0 + \x92\xCE |0 + \xDE\xE6 |0 + \x92\xCF |0 + \x92\xD0 |0 + \x92\xD1 |0 + \xDE\xE3 |0 + \xBE\xDD |0 + \x92\xD2 |0 + \x92\xD3 |0 + \xDE\xDF |0 + \x92\xD4 |0 + \x92\xD5 |0 + \x92\xD6 |0 + \x92\xD7 |0 + \xB4\xB7 |0 + \xBD\xDD |0 + \x92\xD8 |0 + \x92\xD9 |0 + \xDE\xE0 |0 + \xC4\xED |0 + \x92\xDA |0 + \x92\xDB |0 + \x92\xDC |0 + \x92\xDD |0 + \xCF\xC6 |0 + \x92\xDE |0 + \xB5\xE0 |0 + \x92\xDF |0 + \x92\xE0 |0 + \x92\xE1 |0 + \x92\xE2 |0 + \xB6\xDE |0 + \xCA\xDA |0 + \xB5\xF4 |0 + \xDE\xE5 |0 + \x92\xE3 |0 + \xD5\xC6 |0 + \x92\xE4 |0 + \xDE\xE1 |0 + \xCC\xCD |0 + \xC6\xFE |0 + \x92\xE5 |0 + \xC5\xC5 |0 + \x92\xE6 |0 + \x92\xE7 |0 + \x92\xE8 |0 + \xD2\xB4 |0 + \x92\xE9 |0 + \xBE\xF2 |0 + \x92\xEA |0 + \x92\xEB |0 + \x92\xEC |0 + \x92\xED |0 + \x92\xEE |0 + \x92\xEF |0 + \x92\xF0 |0 + \xC2\xD3 |0 + \x92\xF1 |0 + \xCC\xBD |0 + \xB3\xB8 |0 + \x92\xF2 |0 + \xBD\xD3 |0 + \x92\xF3 |0 + \xBF\xD8 |0 + \xCD\xC6 |0 + \xD1\xDA |0 + \xB4\xEB |0 + \x92\xF4 |0 + \xDE\xE4 |0 + \xDE\xDD |0 + \xDE\xE7 |0 + \x92\xF5 |0 + \xEA\xFE |0 + \x92\xF6 |0 + \x92\xF7 |0 + \xC2\xB0 |0 + \xDE\xE2 |0 + \x92\xF8 |0 + \x92\xF9 |0 + \xD6\xC0 |0 + \xB5\xA7 |0 + \x92\xFA |0 + \xB2\xF4 |0 + \x92\xFB |0 + \xDE\xE8 |0 + \x92\xFC |0 + \xDE\xF2 |0 + \x92\xFD |0 + \x92\xFE |0 + \x93\x40 |0 + \x93\x41 |0 + \x93\x42 |0 + \xDE\xED |0 + \x93\x43 |0 + \xDE\xF1 |0 + \x93\x44 |0 + \x93\x45 |0 + \xC8\xE0 |0 + \x93\x46 |0 + \x93\x47 |0 + \x93\x48 |0 + \xD7\xE1 |0 + \xDE\xEF |0 + \xC3\xE8 |0 + \xCC\xE1 |0 + \x93\x49 |0 + \xB2\xE5 |0 + \x93\x4A |0 + \x93\x4B |0 + \x93\x4C |0 + \xD2\xBE |0 + \x93\x4D |0 + \x93\x4E |0 + \x93\x4F |0 + \x93\x50 |0 + \x93\x51 |0 + \x93\x52 |0 + \x93\x53 |0 + \xDE\xEE |0 + \x93\x54 |0 + \xDE\xEB |0 + \xCE\xD5 |0 + \x93\x55 |0 + \xB4\xA7 |0 + \x93\x56 |0 + \x93\x57 |0 + \x93\x58 |0 + \x93\x59 |0 + \x93\x5A |0 + \xBF\xAB |0 + \xBE\xBE |0 + \x93\x5B |0 + \x93\x5C |0 + \xBD\xD2 |0 + \x93\x5D |0 + \x93\x5E |0 + \x93\x5F |0 + \x93\x60 |0 + \xDE\xE9 |0 + \x93\x61 |0 + \xD4\xAE |0 + \x93\x62 |0 + \xDE\xDE |0 + \x93\x63 |0 + \xDE\xEA |0 + \x93\x64 |0 + \x93\x65 |0 + \x93\x66 |0 + \x93\x67 |0 + \xC0\xBF |0 + \x93\x68 |0 + \xDE\xEC |0 + \xB2\xF3 |0 + \xB8\xE9 |0 + \xC2\xA7 |0 + \x93\x69 |0 + \x93\x6A |0 + \xBD\xC1 |0 + \x93\x6B |0 + \x93\x6C |0 + \x93\x6D |0 + \x93\x6E |0 + \x93\x6F |0 + \xDE\xF5 |0 + \xDE\xF8 |0 + \x93\x70 |0 + \x93\x71 |0 + \xB2\xAB |0 + \xB4\xA4 |0 + \x93\x72 |0 + \x93\x73 |0 + \xB4\xEA |0 + \xC9\xA6 |0 + \x93\x74 |0 + \x93\x75 |0 + \x93\x76 |0 + \x93\x77 |0 + \x93\x78 |0 + \x93\x79 |0 + \xDE\xF6 |0 + \xCB\xD1 |0 + \x93\x7A |0 + \xB8\xE3 |0 + \x93\x7B |0 + \xDE\xF7 |0 + \xDE\xFA |0 + \x93\x7C |0 + \x93\x7D |0 + \x93\x7E |0 + \x93\x80 |0 + \xDE\xF9 |0 + \x93\x81 |0 + \x93\x82 |0 + \x93\x83 |0 + \xCC\xC2 |0 + \x93\x84 |0 + \xB0\xE1 |0 + \xB4\xEE |0 + \x93\x85 |0 + \x93\x86 |0 + \x93\x87 |0 + \x93\x88 |0 + \x93\x89 |0 + \x93\x8A |0 + \xE5\xBA |0 + \x93\x8B |0 + \x93\x8C |0 + \x93\x8D |0 + \x93\x8E |0 + \x93\x8F |0 + \xD0\xAF |0 + \x93\x90 |0 + \x93\x91 |0 + \xB2\xEB |0 + \x93\x92 |0 + \xEB\xA1 |0 + \x93\x93 |0 + \xDE\xF4 |0 + \x93\x94 |0 + \x93\x95 |0 + \xC9\xE3 |0 + \xDE\xF3 |0 + \xB0\xDA |0 + \xD2\xA1 |0 + \xB1\xF7 |0 + \x93\x96 |0 + \xCC\xAF |0 + \x93\x97 |0 + \x93\x98 |0 + \x93\x99 |0 + \x93\x9A |0 + \x93\x9B |0 + \x93\x9C |0 + \x93\x9D |0 + \xDE\xF0 |0 + \x93\x9E |0 + \xCB\xA4 |0 + \x93\x9F |0 + \x93\xA0 |0 + \x93\xA1 |0 + \xD5\xAA |0 + \x93\xA2 |0 + \x93\xA3 |0 + \x93\xA4 |0 + \x93\xA5 |0 + \x93\xA6 |0 + \xDE\xFB |0 + \x93\xA7 |0 + \x93\xA8 |0 + \x93\xA9 |0 + \x93\xAA |0 + \x93\xAB |0 + \x93\xAC |0 + \x93\xAD |0 + \x93\xAE |0 + \xB4\xDD |0 + \x93\xAF |0 + \xC4\xA6 |0 + \x93\xB0 |0 + \x93\xB1 |0 + \x93\xB2 |0 + \xDE\xFD |0 + \x93\xB3 |0 + \x93\xB4 |0 + \x93\xB5 |0 + \x93\xB6 |0 + \x93\xB7 |0 + \x93\xB8 |0 + \x93\xB9 |0 + \x93\xBA |0 + \x93\xBB |0 + \x93\xBC |0 + \xC3\xFE |0 + \xC4\xA1 |0 + \xDF\xA1 |0 + \x93\xBD |0 + \x93\xBE |0 + \x93\xBF |0 + \x93\xC0 |0 + \x93\xC1 |0 + \x93\xC2 |0 + \x93\xC3 |0 + \xC1\xCC |0 + \x93\xC4 |0 + \xDE\xFC |0 + \xBE\xEF |0 + \x93\xC5 |0 + \xC6\xB2 |0 + \x93\xC6 |0 + \x93\xC7 |0 + \x93\xC8 |0 + \x93\xC9 |0 + \x93\xCA |0 + \x93\xCB |0 + \x93\xCC |0 + \x93\xCD |0 + \x93\xCE |0 + \xB3\xC5 |0 + \xC8\xF6 |0 + \x93\xCF |0 + \x93\xD0 |0 + \xCB\xBA |0 + \xDE\xFE |0 + \x93\xD1 |0 + \x93\xD2 |0 + \xDF\xA4 |0 + \x93\xD3 |0 + \x93\xD4 |0 + \x93\xD5 |0 + \x93\xD6 |0 + \xD7\xB2 |0 + \x93\xD7 |0 + \x93\xD8 |0 + \x93\xD9 |0 + \x93\xDA |0 + \x93\xDB |0 + \xB3\xB7 |0 + \x93\xDC |0 + \x93\xDD |0 + \x93\xDE |0 + \x93\xDF |0 + \xC1\xC3 |0 + \x93\xE0 |0 + \x93\xE1 |0 + \xC7\xCB |0 + \xB2\xA5 |0 + \xB4\xE9 |0 + \x93\xE2 |0 + \xD7\xAB |0 + \x93\xE3 |0 + \x93\xE4 |0 + \x93\xE5 |0 + \x93\xE6 |0 + \xC4\xEC |0 + \x93\xE7 |0 + \xDF\xA2 |0 + \xDF\xA3 |0 + \x93\xE8 |0 + \xDF\xA5 |0 + \x93\xE9 |0 + \xBA\xB3 |0 + \x93\xEA |0 + \x93\xEB |0 + \x93\xEC |0 + \xDF\xA6 |0 + \x93\xED |0 + \xC0\xDE |0 + \x93\xEE |0 + \x93\xEF |0 + \xC9\xC3 |0 + \x93\xF0 |0 + \x93\xF1 |0 + \x93\xF2 |0 + \x93\xF3 |0 + \x93\xF4 |0 + \x93\xF5 |0 + \x93\xF6 |0 + \xB2\xD9 |0 + \xC7\xE6 |0 + \x93\xF7 |0 + \xDF\xA7 |0 + \x93\xF8 |0 + \xC7\xDC |0 + \x93\xF9 |0 + \x93\xFA |0 + \x93\xFB |0 + \x93\xFC |0 + \xDF\xA8 |0 + \xEB\xA2 |0 + \x93\xFD |0 + \x93\xFE |0 + \x94\x40 |0 + \x94\x41 |0 + \x94\x42 |0 + \xCB\xD3 |0 + \x94\x43 |0 + \x94\x44 |0 + \x94\x45 |0 + \xDF\xAA |0 + \x94\x46 |0 + \xDF\xA9 |0 + \x94\x47 |0 + \xB2\xC1 |0 + \x94\x48 |0 + \x94\x49 |0 + \x94\x4A |0 + \x94\x4B |0 + \x94\x4C |0 + \x94\x4D |0 + \x94\x4E |0 + \x94\x4F |0 + \x94\x50 |0 + \x94\x51 |0 + \x94\x52 |0 + \x94\x53 |0 + \x94\x54 |0 + \x94\x55 |0 + \x94\x56 |0 + \x94\x57 |0 + \x94\x58 |0 + \x94\x59 |0 + \x94\x5A |0 + \x94\x5B |0 + \x94\x5C |0 + \x94\x5D |0 + \x94\x5E |0 + \x94\x5F |0 + \x94\x60 |0 + \xC5\xCA |0 + \x94\x61 |0 + \x94\x62 |0 + \x94\x63 |0 + \x94\x64 |0 + \x94\x65 |0 + \x94\x66 |0 + \x94\x67 |0 + \x94\x68 |0 + \xDF\xAB |0 + \x94\x69 |0 + \x94\x6A |0 + \x94\x6B |0 + \x94\x6C |0 + \x94\x6D |0 + \x94\x6E |0 + \x94\x6F |0 + \x94\x70 |0 + \xD4\xDC |0 + \x94\x71 |0 + \x94\x72 |0 + \x94\x73 |0 + \x94\x74 |0 + \x94\x75 |0 + \xC8\xC1 |0 + \x94\x76 |0 + \x94\x77 |0 + \x94\x78 |0 + \x94\x79 |0 + \x94\x7A |0 + \x94\x7B |0 + \x94\x7C |0 + \x94\x7D |0 + \x94\x7E |0 + \x94\x80 |0 + \x94\x81 |0 + \x94\x82 |0 + \xDF\xAC |0 + \x94\x83 |0 + \x94\x84 |0 + \x94\x85 |0 + \x94\x86 |0 + \x94\x87 |0 + \xBE\xF0 |0 + \x94\x88 |0 + \x94\x89 |0 + \xDF\xAD |0 + \xD6\xA7 |0 + \x94\x8A |0 + \x94\x8B |0 + \x94\x8C |0 + \x94\x8D |0 + \xEA\xB7 |0 + \xEB\xB6 |0 + \xCA\xD5 |0 + \x94\x8E |0 + \xD8\xFC |0 + \xB8\xC4 |0 + \x94\x8F |0 + \xB9\xA5 |0 + \x94\x90 |0 + \x94\x91 |0 + \xB7\xC5 |0 + \xD5\xFE |0 + \x94\x92 |0 + \x94\x93 |0 + \x94\x94 |0 + \x94\x95 |0 + \x94\x96 |0 + \xB9\xCA |0 + \x94\x97 |0 + \x94\x98 |0 + \xD0\xA7 |0 + \xF4\xCD |0 + \x94\x99 |0 + \x94\x9A |0 + \xB5\xD0 |0 + \x94\x9B |0 + \x94\x9C |0 + \xC3\xF4 |0 + \x94\x9D |0 + \xBE\xC8 |0 + \x94\x9E |0 + \x94\x9F |0 + \x94\xA0 |0 + \xEB\xB7 |0 + \xB0\xBD |0 + \x94\xA1 |0 + \x94\xA2 |0 + \xBD\xCC |0 + \x94\xA3 |0 + \xC1\xB2 |0 + \x94\xA4 |0 + \xB1\xD6 |0 + \xB3\xA8 |0 + \x94\xA5 |0 + \x94\xA6 |0 + \x94\xA7 |0 + \xB8\xD2 |0 + \xC9\xA2 |0 + \x94\xA8 |0 + \x94\xA9 |0 + \xB6\xD8 |0 + \x94\xAA |0 + \x94\xAB |0 + \x94\xAC |0 + \x94\xAD |0 + \xEB\xB8 |0 + \xBE\xB4 |0 + \x94\xAE |0 + \x94\xAF |0 + \x94\xB0 |0 + \xCA\xFD |0 + \x94\xB1 |0 + \xC7\xC3 |0 + \x94\xB2 |0 + \xD5\xFB |0 + \x94\xB3 |0 + \x94\xB4 |0 + \xB7\xF3 |0 + \x94\xB5 |0 + \x94\xB6 |0 + \x94\xB7 |0 + \x94\xB8 |0 + \x94\xB9 |0 + \x94\xBA |0 + \x94\xBB |0 + \x94\xBC |0 + \x94\xBD |0 + \x94\xBE |0 + \x94\xBF |0 + \x94\xC0 |0 + \x94\xC1 |0 + \x94\xC2 |0 + \x94\xC3 |0 + \xCE\xC4 |0 + \x94\xC4 |0 + \x94\xC5 |0 + \x94\xC6 |0 + \xD5\xAB |0 + \xB1\xF3 |0 + \x94\xC7 |0 + \x94\xC8 |0 + \x94\xC9 |0 + \xEC\xB3 |0 + \xB0\xDF |0 + \x94\xCA |0 + \xEC\xB5 |0 + \x94\xCB |0 + \x94\xCC |0 + \x94\xCD |0 + \xB6\xB7 |0 + \x94\xCE |0 + \xC1\xCF |0 + \x94\xCF |0 + \xF5\xFA |0 + \xD0\xB1 |0 + \x94\xD0 |0 + \x94\xD1 |0 + \xD5\xE5 |0 + \x94\xD2 |0 + \xCE\xD3 |0 + \x94\xD3 |0 + \x94\xD4 |0 + \xBD\xEF |0 + \xB3\xE2 |0 + \x94\xD5 |0 + \xB8\xAB |0 + \x94\xD6 |0 + \xD5\xB6 |0 + \x94\xD7 |0 + \xED\xBD |0 + \x94\xD8 |0 + \xB6\xCF |0 + \x94\xD9 |0 + \xCB\xB9 |0 + \xD0\xC2 |0 + \x94\xDA |0 + \x94\xDB |0 + \x94\xDC |0 + \x94\xDD |0 + \x94\xDE |0 + \x94\xDF |0 + \x94\xE0 |0 + \x94\xE1 |0 + \xB7\xBD |0 + \x94\xE2 |0 + \x94\xE3 |0 + \xEC\xB6 |0 + \xCA\xA9 |0 + \x94\xE4 |0 + \x94\xE5 |0 + \x94\xE6 |0 + \xC5\xD4 |0 + \x94\xE7 |0 + \xEC\xB9 |0 + \xEC\xB8 |0 + \xC2\xC3 |0 + \xEC\xB7 |0 + \x94\xE8 |0 + \x94\xE9 |0 + \x94\xEA |0 + \x94\xEB |0 + \xD0\xFD |0 + \xEC\xBA |0 + \x94\xEC |0 + \xEC\xBB |0 + \xD7\xE5 |0 + \x94\xED |0 + \x94\xEE |0 + \xEC\xBC |0 + \x94\xEF |0 + \x94\xF0 |0 + \x94\xF1 |0 + \xEC\xBD |0 + \xC6\xEC |0 + \x94\xF2 |0 + \x94\xF3 |0 + \x94\xF4 |0 + \x94\xF5 |0 + \x94\xF6 |0 + \x94\xF7 |0 + \x94\xF8 |0 + \x94\xF9 |0 + \xCE\xDE |0 + \x94\xFA |0 + \xBC\xC8 |0 + \x94\xFB |0 + \x94\xFC |0 + \xC8\xD5 |0 + \xB5\xA9 |0 + \xBE\xC9 |0 + \xD6\xBC |0 + \xD4\xE7 |0 + \x94\xFD |0 + \x94\xFE |0 + \xD1\xAE |0 + \xD0\xF1 |0 + \xEA\xB8 |0 + \xEA\xB9 |0 + \xEA\xBA |0 + \xBA\xB5 |0 + \x95\x40 |0 + \x95\x41 |0 + \x95\x42 |0 + \x95\x43 |0 + \xCA\xB1 |0 + \xBF\xF5 |0 + \x95\x44 |0 + \x95\x45 |0 + \xCD\xFA |0 + \x95\x46 |0 + \x95\x47 |0 + \x95\x48 |0 + \x95\x49 |0 + \x95\x4A |0 + \xEA\xC0 |0 + \x95\x4B |0 + \xB0\xBA |0 + \xEA\xBE |0 + \x95\x4C |0 + \x95\x4D |0 + \xC0\xA5 |0 + \x95\x4E |0 + \x95\x4F |0 + \x95\x50 |0 + \xEA\xBB |0 + \x95\x51 |0 + \xB2\xFD |0 + \x95\x52 |0 + \xC3\xF7 |0 + \xBB\xE8 |0 + \x95\x53 |0 + \x95\x54 |0 + \x95\x55 |0 + \xD2\xD7 |0 + \xCE\xF4 |0 + \xEA\xBF |0 + \x95\x56 |0 + \x95\x57 |0 + \x95\x58 |0 + \xEA\xBC |0 + \x95\x59 |0 + \x95\x5A |0 + \x95\x5B |0 + \xEA\xC3 |0 + \x95\x5C |0 + \xD0\xC7 |0 + \xD3\xB3 |0 + \x95\x5D |0 + \x95\x5E |0 + \x95\x5F |0 + \x95\x60 |0 + \xB4\xBA |0 + \x95\x61 |0 + \xC3\xC1 |0 + \xD7\xF2 |0 + \x95\x62 |0 + \x95\x63 |0 + \x95\x64 |0 + \x95\x65 |0 + \xD5\xD1 |0 + \x95\x66 |0 + \xCA\xC7 |0 + \x95\x67 |0 + \xEA\xC5 |0 + \x95\x68 |0 + \x95\x69 |0 + \xEA\xC4 |0 + \xEA\xC7 |0 + \xEA\xC6 |0 + \x95\x6A |0 + \x95\x6B |0 + \x95\x6C |0 + \x95\x6D |0 + \x95\x6E |0 + \xD6\xE7 |0 + \x95\x6F |0 + \xCF\xD4 |0 + \x95\x70 |0 + \x95\x71 |0 + \xEA\xCB |0 + \x95\x72 |0 + \xBB\xCE |0 + \x95\x73 |0 + \x95\x74 |0 + \x95\x75 |0 + \x95\x76 |0 + \x95\x77 |0 + \x95\x78 |0 + \x95\x79 |0 + \xBD\xFA |0 + \xC9\xCE |0 + \x95\x7A |0 + \x95\x7B |0 + \xEA\xCC |0 + \x95\x7C |0 + \x95\x7D |0 + \xC9\xB9 |0 + \xCF\xFE |0 + \xEA\xCA |0 + \xD4\xCE |0 + \xEA\xCD |0 + \xEA\xCF |0 + \x95\x7E |0 + \x95\x80 |0 + \xCD\xED |0 + \x95\x81 |0 + \x95\x82 |0 + \x95\x83 |0 + \x95\x84 |0 + \xEA\xC9 |0 + \x95\x85 |0 + \xEA\xCE |0 + \x95\x86 |0 + \x95\x87 |0 + \xCE\xEE |0 + \x95\x88 |0 + \xBB\xDE |0 + \x95\x89 |0 + \xB3\xBF |0 + \x95\x8A |0 + \x95\x8B |0 + \x95\x8C |0 + \x95\x8D |0 + \x95\x8E |0 + \xC6\xD5 |0 + \xBE\xB0 |0 + \xCE\xFA |0 + \x95\x8F |0 + \x95\x90 |0 + \x95\x91 |0 + \xC7\xE7 |0 + \x95\x92 |0 + \xBE\xA7 |0 + \xEA\xD0 |0 + \x95\x93 |0 + \x95\x94 |0 + \xD6\xC7 |0 + \x95\x95 |0 + \x95\x96 |0 + \x95\x97 |0 + \xC1\xC0 |0 + \x95\x98 |0 + \x95\x99 |0 + \x95\x9A |0 + \xD4\xDD |0 + \x95\x9B |0 + \xEA\xD1 |0 + \x95\x9C |0 + \x95\x9D |0 + \xCF\xBE |0 + \x95\x9E |0 + \x95\x9F |0 + \x95\xA0 |0 + \x95\xA1 |0 + \xEA\xD2 |0 + \x95\xA2 |0 + \x95\xA3 |0 + \x95\xA4 |0 + \x95\xA5 |0 + \xCA\xEE |0 + \x95\xA6 |0 + \x95\xA7 |0 + \x95\xA8 |0 + \x95\xA9 |0 + \xC5\xAF |0 + \xB0\xB5 |0 + \x95\xAA |0 + \x95\xAB |0 + \x95\xAC |0 + \x95\xAD |0 + \x95\xAE |0 + \xEA\xD4 |0 + \x95\xAF |0 + \x95\xB0 |0 + \x95\xB1 |0 + \x95\xB2 |0 + \x95\xB3 |0 + \x95\xB4 |0 + \x95\xB5 |0 + \x95\xB6 |0 + \x95\xB7 |0 + \xEA\xD3 |0 + \xF4\xDF |0 + \x95\xB8 |0 + \x95\xB9 |0 + \x95\xBA |0 + \x95\xBB |0 + \x95\xBC |0 + \xC4\xBA |0 + \x95\xBD |0 + \x95\xBE |0 + \x95\xBF |0 + \x95\xC0 |0 + \x95\xC1 |0 + \xB1\xA9 |0 + \x95\xC2 |0 + \x95\xC3 |0 + \x95\xC4 |0 + \x95\xC5 |0 + \xE5\xDF |0 + \x95\xC6 |0 + \x95\xC7 |0 + \x95\xC8 |0 + \x95\xC9 |0 + \xEA\xD5 |0 + \x95\xCA |0 + \x95\xCB |0 + \x95\xCC |0 + \x95\xCD |0 + \x95\xCE |0 + \x95\xCF |0 + \x95\xD0 |0 + \x95\xD1 |0 + \x95\xD2 |0 + \x95\xD3 |0 + \x95\xD4 |0 + \x95\xD5 |0 + \x95\xD6 |0 + \x95\xD7 |0 + \x95\xD8 |0 + \x95\xD9 |0 + \x95\xDA |0 + \x95\xDB |0 + \x95\xDC |0 + \x95\xDD |0 + \x95\xDE |0 + \x95\xDF |0 + \x95\xE0 |0 + \x95\xE1 |0 + \x95\xE2 |0 + \x95\xE3 |0 + \xCA\xEF |0 + \x95\xE4 |0 + \xEA\xD6 |0 + \xEA\xD7 |0 + \xC6\xD8 |0 + \x95\xE5 |0 + \x95\xE6 |0 + \x95\xE7 |0 + \x95\xE8 |0 + \x95\xE9 |0 + \x95\xEA |0 + \x95\xEB |0 + \x95\xEC |0 + \xEA\xD8 |0 + \x95\xED |0 + \x95\xEE |0 + \xEA\xD9 |0 + \x95\xEF |0 + \x95\xF0 |0 + \x95\xF1 |0 + \x95\xF2 |0 + \x95\xF3 |0 + \x95\xF4 |0 + \xD4\xBB |0 + \x95\xF5 |0 + \xC7\xFA |0 + \xD2\xB7 |0 + \xB8\xFC |0 + \x95\xF6 |0 + \x95\xF7 |0 + \xEA\xC2 |0 + \x95\xF8 |0 + \xB2\xDC |0 + \x95\xF9 |0 + \x95\xFA |0 + \xC2\xFC |0 + \x95\xFB |0 + \xD4\xF8 |0 + \xCC\xE6 |0 + \xD7\xEE |0 + \x95\xFC |0 + \x95\xFD |0 + \x95\xFE |0 + \x96\x40 |0 + \x96\x41 |0 + \x96\x42 |0 + \x96\x43 |0 + \xD4\xC2 |0 + \xD3\xD0 |0 + \xEB\xC3 |0 + \xC5\xF3 |0 + \x96\x44 |0 + \xB7\xFE |0 + \x96\x45 |0 + \x96\x46 |0 + \xEB\xD4 |0 + \x96\x47 |0 + \x96\x48 |0 + \x96\x49 |0 + \xCB\xB7 |0 + \xEB\xDE |0 + \x96\x4A |0 + \xC0\xCA |0 + \x96\x4B |0 + \x96\x4C |0 + \x96\x4D |0 + \xCD\xFB |0 + \x96\x4E |0 + \xB3\xAF |0 + \x96\x4F |0 + \xC6\xDA |0 + \x96\x50 |0 + \x96\x51 |0 + \x96\x52 |0 + \x96\x53 |0 + \x96\x54 |0 + \x96\x55 |0 + \xEB\xFC |0 + \x96\x56 |0 + \xC4\xBE |0 + \x96\x57 |0 + \xCE\xB4 |0 + \xC4\xA9 |0 + \xB1\xBE |0 + \xD4\xFD |0 + \x96\x58 |0 + \xCA\xF5 |0 + \x96\x59 |0 + \xD6\xEC |0 + \x96\x5A |0 + \x96\x5B |0 + \xC6\xD3 |0 + \xB6\xE4 |0 + \x96\x5C |0 + \x96\x5D |0 + \x96\x5E |0 + \x96\x5F |0 + \xBB\xFA |0 + \x96\x60 |0 + \x96\x61 |0 + \xD0\xE0 |0 + \x96\x62 |0 + \x96\x63 |0 + \xC9\xB1 |0 + \x96\x64 |0 + \xD4\xD3 |0 + \xC8\xA8 |0 + \x96\x65 |0 + \x96\x66 |0 + \xB8\xCB |0 + \x96\x67 |0 + \xE8\xBE |0 + \xC9\xBC |0 + \x96\x68 |0 + \x96\x69 |0 + \xE8\xBB |0 + \x96\x6A |0 + \xC0\xEE |0 + \xD0\xD3 |0 + \xB2\xC4 |0 + \xB4\xE5 |0 + \x96\x6B |0 + \xE8\xBC |0 + \x96\x6C |0 + \x96\x6D |0 + \xD5\xC8 |0 + \x96\x6E |0 + \x96\x6F |0 + \x96\x70 |0 + \x96\x71 |0 + \x96\x72 |0 + \xB6\xC5 |0 + \x96\x73 |0 + \xE8\xBD |0 + \xCA\xF8 |0 + \xB8\xDC |0 + \xCC\xF5 |0 + \x96\x74 |0 + \x96\x75 |0 + \x96\x76 |0 + \xC0\xB4 |0 + \x96\x77 |0 + \x96\x78 |0 + \xD1\xEE |0 + \xE8\xBF |0 + \xE8\xC2 |0 + \x96\x79 |0 + \x96\x7A |0 + \xBA\xBC |0 + \x96\x7B |0 + \xB1\xAD |0 + \xBD\xDC |0 + \x96\x7C |0 + \xEA\xBD |0 + \xE8\xC3 |0 + \x96\x7D |0 + \xE8\xC6 |0 + \x96\x7E |0 + \xE8\xCB |0 + \x96\x80 |0 + \x96\x81 |0 + \x96\x82 |0 + \x96\x83 |0 + \xE8\xCC |0 + \x96\x84 |0 + \xCB\xC9 |0 + \xB0\xE5 |0 + \x96\x85 |0 + \xBC\xAB |0 + \x96\x86 |0 + \x96\x87 |0 + \xB9\xB9 |0 + \x96\x88 |0 + \x96\x89 |0 + \xE8\xC1 |0 + \x96\x8A |0 + \xCD\xF7 |0 + \x96\x8B |0 + \xE8\xCA |0 + \x96\x8C |0 + \x96\x8D |0 + \x96\x8E |0 + \x96\x8F |0 + \xCE\xF6 |0 + \x96\x90 |0 + \x96\x91 |0 + \x96\x92 |0 + \x96\x93 |0 + \xD5\xED |0 + \x96\x94 |0 + \xC1\xD6 |0 + \xE8\xC4 |0 + \x96\x95 |0 + \xC3\xB6 |0 + \x96\x96 |0 + \xB9\xFB |0 + \xD6\xA6 |0 + \xE8\xC8 |0 + \x96\x97 |0 + \x96\x98 |0 + \x96\x99 |0 + \xCA\xE0 |0 + \xD4\xE6 |0 + \x96\x9A |0 + \xE8\xC0 |0 + \x96\x9B |0 + \xE8\xC5 |0 + \xE8\xC7 |0 + \x96\x9C |0 + \xC7\xB9 |0 + \xB7\xE3 |0 + \x96\x9D |0 + \xE8\xC9 |0 + \x96\x9E |0 + \xBF\xDD |0 + \xE8\xD2 |0 + \x96\x9F |0 + \x96\xA0 |0 + \xE8\xD7 |0 + \x96\xA1 |0 + \xE8\xD5 |0 + \xBC\xDC |0 + \xBC\xCF |0 + \xE8\xDB |0 + \x96\xA2 |0 + \x96\xA3 |0 + \x96\xA4 |0 + \x96\xA5 |0 + \x96\xA6 |0 + \x96\xA7 |0 + \x96\xA8 |0 + \x96\xA9 |0 + \xE8\xDE |0 + \x96\xAA |0 + \xE8\xDA |0 + \xB1\xFA |0 + \x96\xAB |0 + \x96\xAC |0 + \x96\xAD |0 + \x96\xAE |0 + \x96\xAF |0 + \x96\xB0 |0 + \x96\xB1 |0 + \x96\xB2 |0 + \x96\xB3 |0 + \x96\xB4 |0 + \xB0\xD8 |0 + \xC4\xB3 |0 + \xB8\xCC |0 + \xC6\xE2 |0 + \xC8\xBE |0 + \xC8\xE1 |0 + \x96\xB5 |0 + \x96\xB6 |0 + \x96\xB7 |0 + \xE8\xCF |0 + \xE8\xD4 |0 + \xE8\xD6 |0 + \x96\xB8 |0 + \xB9\xF1 |0 + \xE8\xD8 |0 + \xD7\xF5 |0 + \x96\xB9 |0 + \xC4\xFB |0 + \x96\xBA |0 + \xE8\xDC |0 + \x96\xBB |0 + \x96\xBC |0 + \xB2\xE9 |0 + \x96\xBD |0 + \x96\xBE |0 + \x96\xBF |0 + \xE8\xD1 |0 + \x96\xC0 |0 + \x96\xC1 |0 + \xBC\xED |0 + \x96\xC2 |0 + \x96\xC3 |0 + \xBF\xC2 |0 + \xE8\xCD |0 + \xD6\xF9 |0 + \x96\xC4 |0 + \xC1\xF8 |0 + \xB2\xF1 |0 + \x96\xC5 |0 + \x96\xC6 |0 + \x96\xC7 |0 + \x96\xC8 |0 + \x96\xC9 |0 + \x96\xCA |0 + \x96\xCB |0 + \x96\xCC |0 + \xE8\xDF |0 + \x96\xCD |0 + \xCA\xC1 |0 + \xE8\xD9 |0 + \x96\xCE |0 + \x96\xCF |0 + \x96\xD0 |0 + \x96\xD1 |0 + \xD5\xA4 |0 + \x96\xD2 |0 + \xB1\xEA |0 + \xD5\xBB |0 + \xE8\xCE |0 + \xE8\xD0 |0 + \xB6\xB0 |0 + \xE8\xD3 |0 + \x96\xD3 |0 + \xE8\xDD |0 + \xC0\xB8 |0 + \x96\xD4 |0 + \xCA\xF7 |0 + \x96\xD5 |0 + \xCB\xA8 |0 + \x96\xD6 |0 + \x96\xD7 |0 + \xC6\xDC |0 + \xC0\xF5 |0 + \x96\xD8 |0 + \x96\xD9 |0 + \x96\xDA |0 + \x96\xDB |0 + \x96\xDC |0 + \xE8\xE9 |0 + \x96\xDD |0 + \x96\xDE |0 + \x96\xDF |0 + \xD0\xA3 |0 + \x96\xE0 |0 + \x96\xE1 |0 + \x96\xE2 |0 + \x96\xE3 |0 + \x96\xE4 |0 + \x96\xE5 |0 + \x96\xE6 |0 + \xE8\xF2 |0 + \xD6\xEA |0 + \x96\xE7 |0 + \x96\xE8 |0 + \x96\xE9 |0 + \x96\xEA |0 + \x96\xEB |0 + \x96\xEC |0 + \x96\xED |0 + \xE8\xE0 |0 + \xE8\xE1 |0 + \x96\xEE |0 + \x96\xEF |0 + \x96\xF0 |0 + \xD1\xF9 |0 + \xBA\xCB |0 + \xB8\xF9 |0 + \x96\xF1 |0 + \x96\xF2 |0 + \xB8\xF1 |0 + \xD4\xD4 |0 + \xE8\xEF |0 + \x96\xF3 |0 + \xE8\xEE |0 + \xE8\xEC |0 + \xB9\xF0 |0 + \xCC\xD2 |0 + \xE8\xE6 |0 + \xCE\xA6 |0 + \xBF\xF2 |0 + \x96\xF4 |0 + \xB0\xB8 |0 + \xE8\xF1 |0 + \xE8\xF0 |0 + \x96\xF5 |0 + \xD7\xC0 |0 + \x96\xF6 |0 + \xE8\xE4 |0 + \x96\xF7 |0 + \xCD\xA9 |0 + \xC9\xA3 |0 + \x96\xF8 |0 + \xBB\xB8 |0 + \xBD\xDB |0 + \xE8\xEA |0 + \x96\xF9 |0 + \x96\xFA |0 + \x96\xFB |0 + \x96\xFC |0 + \x96\xFD |0 + \x96\xFE |0 + \x97\x40 |0 + \x97\x41 |0 + \x97\x42 |0 + \x97\x43 |0 + \xE8\xE2 |0 + \xE8\xE3 |0 + \xE8\xE5 |0 + \xB5\xB5 |0 + \xE8\xE7 |0 + \xC7\xC5 |0 + \xE8\xEB |0 + \xE8\xED |0 + \xBD\xB0 |0 + \xD7\xAE |0 + \x97\x44 |0 + \xE8\xF8 |0 + \x97\x45 |0 + \x97\x46 |0 + \x97\x47 |0 + \x97\x48 |0 + \x97\x49 |0 + \x97\x4A |0 + \x97\x4B |0 + \x97\x4C |0 + \xE8\xF5 |0 + \x97\x4D |0 + \xCD\xB0 |0 + \xE8\xF6 |0 + \x97\x4E |0 + \x97\x4F |0 + \x97\x50 |0 + \x97\x51 |0 + \x97\x52 |0 + \x97\x53 |0 + \x97\x54 |0 + \x97\x55 |0 + \x97\x56 |0 + \xC1\xBA |0 + \x97\x57 |0 + \xE8\xE8 |0 + \x97\x58 |0 + \xC3\xB7 |0 + \xB0\xF0 |0 + \x97\x59 |0 + \x97\x5A |0 + \x97\x5B |0 + \x97\x5C |0 + \x97\x5D |0 + \x97\x5E |0 + \x97\x5F |0 + \x97\x60 |0 + \xE8\xF4 |0 + \x97\x61 |0 + \x97\x62 |0 + \x97\x63 |0 + \xE8\xF7 |0 + \x97\x64 |0 + \x97\x65 |0 + \x97\x66 |0 + \xB9\xA3 |0 + \x97\x67 |0 + \x97\x68 |0 + \x97\x69 |0 + \x97\x6A |0 + \x97\x6B |0 + \x97\x6C |0 + \x97\x6D |0 + \x97\x6E |0 + \x97\x6F |0 + \x97\x70 |0 + \xC9\xD2 |0 + \x97\x71 |0 + \x97\x72 |0 + \x97\x73 |0 + \xC3\xCE |0 + \xCE\xE0 |0 + \xC0\xE6 |0 + \x97\x74 |0 + \x97\x75 |0 + \x97\x76 |0 + \x97\x77 |0 + \xCB\xF3 |0 + \x97\x78 |0 + \xCC\xDD |0 + \xD0\xB5 |0 + \x97\x79 |0 + \x97\x7A |0 + \xCA\xE1 |0 + \x97\x7B |0 + \xE8\xF3 |0 + \x97\x7C |0 + \x97\x7D |0 + \x97\x7E |0 + \x97\x80 |0 + \x97\x81 |0 + \x97\x82 |0 + \x97\x83 |0 + \x97\x84 |0 + \x97\x85 |0 + \x97\x86 |0 + \xBC\xEC |0 + \x97\x87 |0 + \xE8\xF9 |0 + \x97\x88 |0 + \x97\x89 |0 + \x97\x8A |0 + \x97\x8B |0 + \x97\x8C |0 + \x97\x8D |0 + \xC3\xDE |0 + \x97\x8E |0 + \xC6\xE5 |0 + \x97\x8F |0 + \xB9\xF7 |0 + \x97\x90 |0 + \x97\x91 |0 + \x97\x92 |0 + \x97\x93 |0 + \xB0\xF4 |0 + \x97\x94 |0 + \x97\x95 |0 + \xD7\xD8 |0 + \x97\x96 |0 + \x97\x97 |0 + \xBC\xAC |0 + \x97\x98 |0 + \xC5\xEF |0 + \x97\x99 |0 + \x97\x9A |0 + \x97\x9B |0 + \x97\x9C |0 + \x97\x9D |0 + \xCC\xC4 |0 + \x97\x9E |0 + \x97\x9F |0 + \xE9\xA6 |0 + \x97\xA0 |0 + \x97\xA1 |0 + \x97\xA2 |0 + \x97\xA3 |0 + \x97\xA4 |0 + \x97\xA5 |0 + \x97\xA6 |0 + \x97\xA7 |0 + \x97\xA8 |0 + \x97\xA9 |0 + \xC9\xAD |0 + \x97\xAA |0 + \xE9\xA2 |0 + \xC0\xE2 |0 + \x97\xAB |0 + \x97\xAC |0 + \x97\xAD |0 + \xBF\xC3 |0 + \x97\xAE |0 + \x97\xAF |0 + \x97\xB0 |0 + \xE8\xFE |0 + \xB9\xD7 |0 + \x97\xB1 |0 + \xE8\xFB |0 + \x97\xB2 |0 + \x97\xB3 |0 + \x97\xB4 |0 + \x97\xB5 |0 + \xE9\xA4 |0 + \x97\xB6 |0 + \x97\xB7 |0 + \x97\xB8 |0 + \xD2\xCE |0 + \x97\xB9 |0 + \x97\xBA |0 + \x97\xBB |0 + \x97\xBC |0 + \x97\xBD |0 + \xE9\xA3 |0 + \x97\xBE |0 + \xD6\xB2 |0 + \xD7\xB5 |0 + \x97\xBF |0 + \xE9\xA7 |0 + \x97\xC0 |0 + \xBD\xB7 |0 + \x97\xC1 |0 + \x97\xC2 |0 + \x97\xC3 |0 + \x97\xC4 |0 + \x97\xC5 |0 + \x97\xC6 |0 + \x97\xC7 |0 + \x97\xC8 |0 + \x97\xC9 |0 + \x97\xCA |0 + \x97\xCB |0 + \x97\xCC |0 + \xE8\xFC |0 + \xE8\xFD |0 + \x97\xCD |0 + \x97\xCE |0 + \x97\xCF |0 + \xE9\xA1 |0 + \x97\xD0 |0 + \x97\xD1 |0 + \x97\xD2 |0 + \x97\xD3 |0 + \x97\xD4 |0 + \x97\xD5 |0 + \x97\xD6 |0 + \x97\xD7 |0 + \xCD\xD6 |0 + \x97\xD8 |0 + \x97\xD9 |0 + \xD2\xAC |0 + \x97\xDA |0 + \x97\xDB |0 + \x97\xDC |0 + \xE9\xB2 |0 + \x97\xDD |0 + \x97\xDE |0 + \x97\xDF |0 + \x97\xE0 |0 + \xE9\xA9 |0 + \x97\xE1 |0 + \x97\xE2 |0 + \x97\xE3 |0 + \xB4\xAA |0 + \x97\xE4 |0 + \xB4\xBB |0 + \x97\xE5 |0 + \x97\xE6 |0 + \xE9\xAB |0 + \x97\xE7 |0 + \x97\xE8 |0 + \x97\xE9 |0 + \x97\xEA |0 + \x97\xEB |0 + \x97\xEC |0 + \x97\xED |0 + \x97\xEE |0 + \x97\xEF |0 + \x97\xF0 |0 + \x97\xF1 |0 + \x97\xF2 |0 + \x97\xF3 |0 + \x97\xF4 |0 + \x97\xF5 |0 + \x97\xF6 |0 + \x97\xF7 |0 + \xD0\xA8 |0 + \x97\xF8 |0 + \x97\xF9 |0 + \xE9\xA5 |0 + \x97\xFA |0 + \x97\xFB |0 + \xB3\xFE |0 + \x97\xFC |0 + \x97\xFD |0 + \xE9\xAC |0 + \xC0\xE3 |0 + \x97\xFE |0 + \xE9\xAA |0 + \x98\x40 |0 + \x98\x41 |0 + \xE9\xB9 |0 + \x98\x42 |0 + \x98\x43 |0 + \xE9\xB8 |0 + \x98\x44 |0 + \x98\x45 |0 + \x98\x46 |0 + \x98\x47 |0 + \xE9\xAE |0 + \x98\x48 |0 + \x98\x49 |0 + \xE8\xFA |0 + \x98\x4A |0 + \x98\x4B |0 + \xE9\xA8 |0 + \x98\x4C |0 + \x98\x4D |0 + \x98\x4E |0 + \x98\x4F |0 + \x98\x50 |0 + \xBF\xAC |0 + \xE9\xB1 |0 + \xE9\xBA |0 + \x98\x51 |0 + \x98\x52 |0 + \xC2\xA5 |0 + \x98\x53 |0 + \x98\x54 |0 + \x98\x55 |0 + \xE9\xAF |0 + \x98\x56 |0 + \xB8\xC5 |0 + \x98\x57 |0 + \xE9\xAD |0 + \x98\x58 |0 + \xD3\xDC |0 + \xE9\xB4 |0 + \xE9\xB5 |0 + \xE9\xB7 |0 + \x98\x59 |0 + \x98\x5A |0 + \x98\x5B |0 + \xE9\xC7 |0 + \x98\x5C |0 + \x98\x5D |0 + \x98\x5E |0 + \x98\x5F |0 + \x98\x60 |0 + \x98\x61 |0 + \xC0\xC6 |0 + \xE9\xC5 |0 + \x98\x62 |0 + \x98\x63 |0 + \xE9\xB0 |0 + \x98\x64 |0 + \x98\x65 |0 + \xE9\xBB |0 + \xB0\xF1 |0 + \x98\x66 |0 + \x98\x67 |0 + \x98\x68 |0 + \x98\x69 |0 + \x98\x6A |0 + \x98\x6B |0 + \x98\x6C |0 + \x98\x6D |0 + \x98\x6E |0 + \x98\x6F |0 + \xE9\xBC |0 + \xD5\xA5 |0 + \x98\x70 |0 + \x98\x71 |0 + \xE9\xBE |0 + \x98\x72 |0 + \xE9\xBF |0 + \x98\x73 |0 + \x98\x74 |0 + \x98\x75 |0 + \xE9\xC1 |0 + \x98\x76 |0 + \x98\x77 |0 + \xC1\xF1 |0 + \x98\x78 |0 + \x98\x79 |0 + \xC8\xB6 |0 + \x98\x7A |0 + \x98\x7B |0 + \x98\x7C |0 + \xE9\xBD |0 + \x98\x7D |0 + \x98\x7E |0 + \x98\x80 |0 + \x98\x81 |0 + \x98\x82 |0 + \xE9\xC2 |0 + \x98\x83 |0 + \x98\x84 |0 + \x98\x85 |0 + \x98\x86 |0 + \x98\x87 |0 + \x98\x88 |0 + \x98\x89 |0 + \x98\x8A |0 + \xE9\xC3 |0 + \x98\x8B |0 + \xE9\xB3 |0 + \x98\x8C |0 + \xE9\xB6 |0 + \x98\x8D |0 + \xBB\xB1 |0 + \x98\x8E |0 + \x98\x8F |0 + \x98\x90 |0 + \xE9\xC0 |0 + \x98\x91 |0 + \x98\x92 |0 + \x98\x93 |0 + \x98\x94 |0 + \x98\x95 |0 + \x98\x96 |0 + \xBC\xF7 |0 + \x98\x97 |0 + \x98\x98 |0 + \x98\x99 |0 + \xE9\xC4 |0 + \xE9\xC6 |0 + \x98\x9A |0 + \x98\x9B |0 + \x98\x9C |0 + \x98\x9D |0 + \x98\x9E |0 + \x98\x9F |0 + \x98\xA0 |0 + \x98\xA1 |0 + \x98\xA2 |0 + \x98\xA3 |0 + \x98\xA4 |0 + \x98\xA5 |0 + \xE9\xCA |0 + \x98\xA6 |0 + \x98\xA7 |0 + \x98\xA8 |0 + \x98\xA9 |0 + \xE9\xCE |0 + \x98\xAA |0 + \x98\xAB |0 + \x98\xAC |0 + \x98\xAD |0 + \x98\xAE |0 + \x98\xAF |0 + \x98\xB0 |0 + \x98\xB1 |0 + \x98\xB2 |0 + \x98\xB3 |0 + \xB2\xDB |0 + \x98\xB4 |0 + \xE9\xC8 |0 + \x98\xB5 |0 + \x98\xB6 |0 + \x98\xB7 |0 + \x98\xB8 |0 + \x98\xB9 |0 + \x98\xBA |0 + \x98\xBB |0 + \x98\xBC |0 + \x98\xBD |0 + \x98\xBE |0 + \xB7\xAE |0 + \x98\xBF |0 + \x98\xC0 |0 + \x98\xC1 |0 + \x98\xC2 |0 + \x98\xC3 |0 + \x98\xC4 |0 + \x98\xC5 |0 + \x98\xC6 |0 + \x98\xC7 |0 + \x98\xC8 |0 + \x98\xC9 |0 + \x98\xCA |0 + \xE9\xCB |0 + \xE9\xCC |0 + \x98\xCB |0 + \x98\xCC |0 + \x98\xCD |0 + \x98\xCE |0 + \x98\xCF |0 + \x98\xD0 |0 + \xD5\xC1 |0 + \x98\xD1 |0 + \xC4\xA3 |0 + \x98\xD2 |0 + \x98\xD3 |0 + \x98\xD4 |0 + \x98\xD5 |0 + \x98\xD6 |0 + \x98\xD7 |0 + \xE9\xD8 |0 + \x98\xD8 |0 + \xBA\xE1 |0 + \x98\xD9 |0 + \x98\xDA |0 + \x98\xDB |0 + \x98\xDC |0 + \xE9\xC9 |0 + \x98\xDD |0 + \xD3\xA3 |0 + \x98\xDE |0 + \x98\xDF |0 + \x98\xE0 |0 + \xE9\xD4 |0 + \x98\xE1 |0 + \x98\xE2 |0 + \x98\xE3 |0 + \x98\xE4 |0 + \x98\xE5 |0 + \x98\xE6 |0 + \x98\xE7 |0 + \xE9\xD7 |0 + \xE9\xD0 |0 + \x98\xE8 |0 + \x98\xE9 |0 + \x98\xEA |0 + \x98\xEB |0 + \x98\xEC |0 + \xE9\xCF |0 + \x98\xED |0 + \x98\xEE |0 + \xC7\xC1 |0 + \x98\xEF |0 + \x98\xF0 |0 + \x98\xF1 |0 + \x98\xF2 |0 + \x98\xF3 |0 + \x98\xF4 |0 + \x98\xF5 |0 + \x98\xF6 |0 + \xE9\xD2 |0 + \x98\xF7 |0 + \x98\xF8 |0 + \x98\xF9 |0 + \x98\xFA |0 + \x98\xFB |0 + \x98\xFC |0 + \x98\xFD |0 + \xE9\xD9 |0 + \xB3\xC8 |0 + \x98\xFE |0 + \xE9\xD3 |0 + \x99\x40 |0 + \x99\x41 |0 + \x99\x42 |0 + \x99\x43 |0 + \x99\x44 |0 + \xCF\xF0 |0 + \x99\x45 |0 + \x99\x46 |0 + \x99\x47 |0 + \xE9\xCD |0 + \x99\x48 |0 + \x99\x49 |0 + \x99\x4A |0 + \x99\x4B |0 + \x99\x4C |0 + \x99\x4D |0 + \x99\x4E |0 + \x99\x4F |0 + \x99\x50 |0 + \x99\x51 |0 + \x99\x52 |0 + \xB3\xF7 |0 + \x99\x53 |0 + \x99\x54 |0 + \x99\x55 |0 + \x99\x56 |0 + \x99\x57 |0 + \x99\x58 |0 + \x99\x59 |0 + \xE9\xD6 |0 + \x99\x5A |0 + \x99\x5B |0 + \xE9\xDA |0 + \x99\x5C |0 + \x99\x5D |0 + \x99\x5E |0 + \xCC\xB4 |0 + \x99\x5F |0 + \x99\x60 |0 + \x99\x61 |0 + \xCF\xAD |0 + \x99\x62 |0 + \x99\x63 |0 + \x99\x64 |0 + \x99\x65 |0 + \x99\x66 |0 + \x99\x67 |0 + \x99\x68 |0 + \x99\x69 |0 + \x99\x6A |0 + \xE9\xD5 |0 + \x99\x6B |0 + \xE9\xDC |0 + \xE9\xDB |0 + \x99\x6C |0 + \x99\x6D |0 + \x99\x6E |0 + \x99\x6F |0 + \x99\x70 |0 + \xE9\xDE |0 + \x99\x71 |0 + \x99\x72 |0 + \x99\x73 |0 + \x99\x74 |0 + \x99\x75 |0 + \x99\x76 |0 + \x99\x77 |0 + \x99\x78 |0 + \xE9\xD1 |0 + \x99\x79 |0 + \x99\x7A |0 + \x99\x7B |0 + \x99\x7C |0 + \x99\x7D |0 + \x99\x7E |0 + \x99\x80 |0 + \x99\x81 |0 + \xE9\xDD |0 + \x99\x82 |0 + \xE9\xDF |0 + \xC3\xCA |0 + \x99\x83 |0 + \x99\x84 |0 + \x99\x85 |0 + \x99\x86 |0 + \x99\x87 |0 + \x99\x88 |0 + \x99\x89 |0 + \x99\x8A |0 + \x99\x8B |0 + \x99\x8C |0 + \x99\x8D |0 + \x99\x8E |0 + \x99\x8F |0 + \x99\x90 |0 + \x99\x91 |0 + \x99\x92 |0 + \x99\x93 |0 + \x99\x94 |0 + \x99\x95 |0 + \x99\x96 |0 + \x99\x97 |0 + \x99\x98 |0 + \x99\x99 |0 + \x99\x9A |0 + \x99\x9B |0 + \x99\x9C |0 + \x99\x9D |0 + \x99\x9E |0 + \x99\x9F |0 + \x99\xA0 |0 + \x99\xA1 |0 + \x99\xA2 |0 + \x99\xA3 |0 + \x99\xA4 |0 + \x99\xA5 |0 + \x99\xA6 |0 + \x99\xA7 |0 + \x99\xA8 |0 + \x99\xA9 |0 + \x99\xAA |0 + \x99\xAB |0 + \x99\xAC |0 + \x99\xAD |0 + \x99\xAE |0 + \x99\xAF |0 + \x99\xB0 |0 + \x99\xB1 |0 + \x99\xB2 |0 + \x99\xB3 |0 + \x99\xB4 |0 + \x99\xB5 |0 + \x99\xB6 |0 + \x99\xB7 |0 + \x99\xB8 |0 + \x99\xB9 |0 + \x99\xBA |0 + \x99\xBB |0 + \x99\xBC |0 + \x99\xBD |0 + \x99\xBE |0 + \x99\xBF |0 + \x99\xC0 |0 + \x99\xC1 |0 + \x99\xC2 |0 + \x99\xC3 |0 + \x99\xC4 |0 + \x99\xC5 |0 + \x99\xC6 |0 + \x99\xC7 |0 + \x99\xC8 |0 + \x99\xC9 |0 + \x99\xCA |0 + \x99\xCB |0 + \x99\xCC |0 + \x99\xCD |0 + \x99\xCE |0 + \x99\xCF |0 + \x99\xD0 |0 + \x99\xD1 |0 + \x99\xD2 |0 + \x99\xD3 |0 + \x99\xD4 |0 + \x99\xD5 |0 + \x99\xD6 |0 + \x99\xD7 |0 + \x99\xD8 |0 + \x99\xD9 |0 + \x99\xDA |0 + \x99\xDB |0 + \x99\xDC |0 + \x99\xDD |0 + \x99\xDE |0 + \x99\xDF |0 + \x99\xE0 |0 + \x99\xE1 |0 + \x99\xE2 |0 + \x99\xE3 |0 + \x99\xE4 |0 + \x99\xE5 |0 + \x99\xE6 |0 + \x99\xE7 |0 + \x99\xE8 |0 + \x99\xE9 |0 + \x99\xEA |0 + \x99\xEB |0 + \x99\xEC |0 + \x99\xED |0 + \x99\xEE |0 + \x99\xEF |0 + \x99\xF0 |0 + \x99\xF1 |0 + \x99\xF2 |0 + \x99\xF3 |0 + \x99\xF4 |0 + \x99\xF5 |0 + \xC7\xB7 |0 + \xB4\xCE |0 + \xBB\xB6 |0 + \xD0\xC0 |0 + \xEC\xA3 |0 + \x99\xF6 |0 + \x99\xF7 |0 + \xC5\xB7 |0 + \x99\xF8 |0 + \x99\xF9 |0 + \x99\xFA |0 + \x99\xFB |0 + \x99\xFC |0 + \x99\xFD |0 + \x99\xFE |0 + \x9A\x40 |0 + \x9A\x41 |0 + \x9A\x42 |0 + \xD3\xFB |0 + \x9A\x43 |0 + \x9A\x44 |0 + \x9A\x45 |0 + \x9A\x46 |0 + \xEC\xA4 |0 + \x9A\x47 |0 + \xEC\xA5 |0 + \xC6\xDB |0 + \x9A\x48 |0 + \x9A\x49 |0 + \x9A\x4A |0 + \xBF\xEE |0 + \x9A\x4B |0 + \x9A\x4C |0 + \x9A\x4D |0 + \x9A\x4E |0 + \xEC\xA6 |0 + \x9A\x4F |0 + \x9A\x50 |0 + \xEC\xA7 |0 + \xD0\xAA |0 + \x9A\x51 |0 + \xC7\xB8 |0 + \x9A\x52 |0 + \x9A\x53 |0 + \xB8\xE8 |0 + \x9A\x54 |0 + \x9A\x55 |0 + \x9A\x56 |0 + \x9A\x57 |0 + \x9A\x58 |0 + \x9A\x59 |0 + \x9A\x5A |0 + \x9A\x5B |0 + \x9A\x5C |0 + \x9A\x5D |0 + \x9A\x5E |0 + \x9A\x5F |0 + \xEC\xA8 |0 + \x9A\x60 |0 + \x9A\x61 |0 + \x9A\x62 |0 + \x9A\x63 |0 + \x9A\x64 |0 + \x9A\x65 |0 + \x9A\x66 |0 + \x9A\x67 |0 + \xD6\xB9 |0 + \xD5\xFD |0 + \xB4\xCB |0 + \xB2\xBD |0 + \xCE\xE4 |0 + \xC6\xE7 |0 + \x9A\x68 |0 + \x9A\x69 |0 + \xCD\xE1 |0 + \x9A\x6A |0 + \x9A\x6B |0 + \x9A\x6C |0 + \x9A\x6D |0 + \x9A\x6E |0 + \x9A\x6F |0 + \x9A\x70 |0 + \x9A\x71 |0 + \x9A\x72 |0 + \x9A\x73 |0 + \x9A\x74 |0 + \x9A\x75 |0 + \x9A\x76 |0 + \x9A\x77 |0 + \xB4\xF5 |0 + \x9A\x78 |0 + \xCB\xC0 |0 + \xBC\xDF |0 + \x9A\x79 |0 + \x9A\x7A |0 + \x9A\x7B |0 + \x9A\x7C |0 + \xE9\xE2 |0 + \xE9\xE3 |0 + \xD1\xEA |0 + \xE9\xE5 |0 + \x9A\x7D |0 + \xB4\xF9 |0 + \xE9\xE4 |0 + \x9A\x7E |0 + \xD1\xB3 |0 + \xCA\xE2 |0 + \xB2\xD0 |0 + \x9A\x80 |0 + \xE9\xE8 |0 + \x9A\x81 |0 + \x9A\x82 |0 + \x9A\x83 |0 + \x9A\x84 |0 + \xE9\xE6 |0 + \xE9\xE7 |0 + \x9A\x85 |0 + \x9A\x86 |0 + \xD6\xB3 |0 + \x9A\x87 |0 + \x9A\x88 |0 + \x9A\x89 |0 + \xE9\xE9 |0 + \xE9\xEA |0 + \x9A\x8A |0 + \x9A\x8B |0 + \x9A\x8C |0 + \x9A\x8D |0 + \x9A\x8E |0 + \xE9\xEB |0 + \x9A\x8F |0 + \x9A\x90 |0 + \x9A\x91 |0 + \x9A\x92 |0 + \x9A\x93 |0 + \x9A\x94 |0 + \x9A\x95 |0 + \x9A\x96 |0 + \xE9\xEC |0 + \x9A\x97 |0 + \x9A\x98 |0 + \x9A\x99 |0 + \x9A\x9A |0 + \x9A\x9B |0 + \x9A\x9C |0 + \x9A\x9D |0 + \x9A\x9E |0 + \xEC\xAF |0 + \xC5\xB9 |0 + \xB6\xCE |0 + \x9A\x9F |0 + \xD2\xF3 |0 + \x9A\xA0 |0 + \x9A\xA1 |0 + \x9A\xA2 |0 + \x9A\xA3 |0 + \x9A\xA4 |0 + \x9A\xA5 |0 + \x9A\xA6 |0 + \xB5\xEE |0 + \x9A\xA7 |0 + \xBB\xD9 |0 + \xEC\xB1 |0 + \x9A\xA8 |0 + \x9A\xA9 |0 + \xD2\xE3 |0 + \x9A\xAA |0 + \x9A\xAB |0 + \x9A\xAC |0 + \x9A\xAD |0 + \x9A\xAE |0 + \xCE\xE3 |0 + \x9A\xAF |0 + \xC4\xB8 |0 + \x9A\xB0 |0 + \xC3\xBF |0 + \x9A\xB1 |0 + \x9A\xB2 |0 + \xB6\xBE |0 + \xD8\xB9 |0 + \xB1\xC8 |0 + \xB1\xCF |0 + \xB1\xD1 |0 + \xC5\xFE |0 + \x9A\xB3 |0 + \xB1\xD0 |0 + \x9A\xB4 |0 + \xC3\xAB |0 + \x9A\xB5 |0 + \x9A\xB6 |0 + \x9A\xB7 |0 + \x9A\xB8 |0 + \x9A\xB9 |0 + \xD5\xB1 |0 + \x9A\xBA |0 + \x9A\xBB |0 + \x9A\xBC |0 + \x9A\xBD |0 + \x9A\xBE |0 + \x9A\xBF |0 + \x9A\xC0 |0 + \x9A\xC1 |0 + \xEB\xA4 |0 + \xBA\xC1 |0 + \x9A\xC2 |0 + \x9A\xC3 |0 + \x9A\xC4 |0 + \xCC\xBA |0 + \x9A\xC5 |0 + \x9A\xC6 |0 + \x9A\xC7 |0 + \xEB\xA5 |0 + \x9A\xC8 |0 + \xEB\xA7 |0 + \x9A\xC9 |0 + \x9A\xCA |0 + \x9A\xCB |0 + \xEB\xA8 |0 + \x9A\xCC |0 + \x9A\xCD |0 + \x9A\xCE |0 + \xEB\xA6 |0 + \x9A\xCF |0 + \x9A\xD0 |0 + \x9A\xD1 |0 + \x9A\xD2 |0 + \x9A\xD3 |0 + \x9A\xD4 |0 + \x9A\xD5 |0 + \xEB\xA9 |0 + \xEB\xAB |0 + \xEB\xAA |0 + \x9A\xD6 |0 + \x9A\xD7 |0 + \x9A\xD8 |0 + \x9A\xD9 |0 + \x9A\xDA |0 + \xEB\xAC |0 + \x9A\xDB |0 + \xCA\xCF |0 + \xD8\xB5 |0 + \xC3\xF1 |0 + \x9A\xDC |0 + \xC3\xA5 |0 + \xC6\xF8 |0 + \xEB\xAD |0 + \xC4\xCA |0 + \x9A\xDD |0 + \xEB\xAE |0 + \xEB\xAF |0 + \xEB\xB0 |0 + \xB7\xD5 |0 + \x9A\xDE |0 + \x9A\xDF |0 + \x9A\xE0 |0 + \xB7\xFA |0 + \x9A\xE1 |0 + \xEB\xB1 |0 + \xC7\xE2 |0 + \x9A\xE2 |0 + \xEB\xB3 |0 + \x9A\xE3 |0 + \xBA\xA4 |0 + \xD1\xF5 |0 + \xB0\xB1 |0 + \xEB\xB2 |0 + \xEB\xB4 |0 + \x9A\xE4 |0 + \x9A\xE5 |0 + \x9A\xE6 |0 + \xB5\xAA |0 + \xC2\xC8 |0 + \xC7\xE8 |0 + \x9A\xE7 |0 + \xEB\xB5 |0 + \x9A\xE8 |0 + \xCB\xAE |0 + \xE3\xDF |0 + \x9A\xE9 |0 + \x9A\xEA |0 + \xD3\xC0 |0 + \x9A\xEB |0 + \x9A\xEC |0 + \x9A\xED |0 + \x9A\xEE |0 + \xD9\xDB |0 + \x9A\xEF |0 + \x9A\xF0 |0 + \xCD\xA1 |0 + \xD6\xAD |0 + \xC7\xF3 |0 + \x9A\xF1 |0 + \x9A\xF2 |0 + \x9A\xF3 |0 + \xD9\xE0 |0 + \xBB\xE3 |0 + \x9A\xF4 |0 + \xBA\xBA |0 + \xE3\xE2 |0 + \x9A\xF5 |0 + \x9A\xF6 |0 + \x9A\xF7 |0 + \x9A\xF8 |0 + \x9A\xF9 |0 + \xCF\xAB |0 + \x9A\xFA |0 + \x9A\xFB |0 + \x9A\xFC |0 + \xE3\xE0 |0 + \xC9\xC7 |0 + \x9A\xFD |0 + \xBA\xB9 |0 + \x9A\xFE |0 + \x9B\x40 |0 + \x9B\x41 |0 + \xD1\xB4 |0 + \xE3\xE1 |0 + \xC8\xEA |0 + \xB9\xAF |0 + \xBD\xAD |0 + \xB3\xD8 |0 + \xCE\xDB |0 + \x9B\x42 |0 + \x9B\x43 |0 + \xCC\xC0 |0 + \x9B\x44 |0 + \x9B\x45 |0 + \x9B\x46 |0 + \xE3\xE8 |0 + \xE3\xE9 |0 + \xCD\xF4 |0 + \x9B\x47 |0 + \x9B\x48 |0 + \x9B\x49 |0 + \x9B\x4A |0 + \x9B\x4B |0 + \xCC\xAD |0 + \x9B\x4C |0 + \xBC\xB3 |0 + \x9B\x4D |0 + \xE3\xEA |0 + \x9B\x4E |0 + \xE3\xEB |0 + \x9B\x4F |0 + \x9B\x50 |0 + \xD0\xDA |0 + \x9B\x51 |0 + \x9B\x52 |0 + \x9B\x53 |0 + \xC6\xFB |0 + \xB7\xDA |0 + \x9B\x54 |0 + \x9B\x55 |0 + \xC7\xDF |0 + \xD2\xCA |0 + \xCE\xD6 |0 + \x9B\x56 |0 + \xE3\xE4 |0 + \xE3\xEC |0 + \x9B\x57 |0 + \xC9\xF2 |0 + \xB3\xC1 |0 + \x9B\x58 |0 + \x9B\x59 |0 + \xE3\xE7 |0 + \x9B\x5A |0 + \x9B\x5B |0 + \xC6\xE3 |0 + \xE3\xE5 |0 + \x9B\x5C |0 + \x9B\x5D |0 + \xED\xB3 |0 + \xE3\xE6 |0 + \x9B\x5E |0 + \x9B\x5F |0 + \x9B\x60 |0 + \x9B\x61 |0 + \xC9\xB3 |0 + \x9B\x62 |0 + \xC5\xE6 |0 + \x9B\x63 |0 + \x9B\x64 |0 + \x9B\x65 |0 + \xB9\xB5 |0 + \x9B\x66 |0 + \xC3\xBB |0 + \x9B\x67 |0 + \xE3\xE3 |0 + \xC5\xBD |0 + \xC1\xA4 |0 + \xC2\xD9 |0 + \xB2\xD7 |0 + \x9B\x68 |0 + \xE3\xED |0 + \xBB\xA6 |0 + \xC4\xAD |0 + \x9B\x69 |0 + \xE3\xF0 |0 + \xBE\xDA |0 + \x9B\x6A |0 + \x9B\x6B |0 + \xE3\xFB |0 + \xE3\xF5 |0 + \xBA\xD3 |0 + \x9B\x6C |0 + \x9B\x6D |0 + \x9B\x6E |0 + \x9B\x6F |0 + \xB7\xD0 |0 + \xD3\xCD |0 + \x9B\x70 |0 + \xD6\xCE |0 + \xD5\xD3 |0 + \xB9\xC1 |0 + \xD5\xB4 |0 + \xD1\xD8 |0 + \x9B\x71 |0 + \x9B\x72 |0 + \x9B\x73 |0 + \x9B\x74 |0 + \xD0\xB9 |0 + \xC7\xF6 |0 + \x9B\x75 |0 + \x9B\x76 |0 + \x9B\x77 |0 + \xC8\xAA |0 + \xB2\xB4 |0 + \x9B\x78 |0 + \xC3\xDA |0 + \x9B\x79 |0 + \x9B\x7A |0 + \x9B\x7B |0 + \xE3\xEE |0 + \x9B\x7C |0 + \x9B\x7D |0 + \xE3\xFC |0 + \xE3\xEF |0 + \xB7\xA8 |0 + \xE3\xF7 |0 + \xE3\xF4 |0 + \x9B\x7E |0 + \x9B\x80 |0 + \x9B\x81 |0 + \xB7\xBA |0 + \x9B\x82 |0 + \x9B\x83 |0 + \xC5\xA2 |0 + \x9B\x84 |0 + \xE3\xF6 |0 + \xC5\xDD |0 + \xB2\xA8 |0 + \xC6\xFC |0 + \x9B\x85 |0 + \xC4\xE0 |0 + \x9B\x86 |0 + \x9B\x87 |0 + \xD7\xA2 |0 + \x9B\x88 |0 + \xC0\xE1 |0 + \xE3\xF9 |0 + \x9B\x89 |0 + \x9B\x8A |0 + \xE3\xFA |0 + \xE3\xFD |0 + \xCC\xA9 |0 + \xE3\xF3 |0 + \x9B\x8B |0 + \xD3\xBE |0 + \x9B\x8C |0 + \xB1\xC3 |0 + \xED\xB4 |0 + \xE3\xF1 |0 + \xE3\xF2 |0 + \x9B\x8D |0 + \xE3\xF8 |0 + \xD0\xBA |0 + \xC6\xC3 |0 + \xD4\xF3 |0 + \xE3\xFE |0 + \x9B\x8E |0 + \x9B\x8F |0 + \xBD\xE0 |0 + \x9B\x90 |0 + \x9B\x91 |0 + \xE4\xA7 |0 + \x9B\x92 |0 + \x9B\x93 |0 + \xE4\xA6 |0 + \x9B\x94 |0 + \x9B\x95 |0 + \x9B\x96 |0 + \xD1\xF3 |0 + \xE4\xA3 |0 + \x9B\x97 |0 + \xE4\xA9 |0 + \x9B\x98 |0 + \x9B\x99 |0 + \x9B\x9A |0 + \xC8\xF7 |0 + \x9B\x9B |0 + \x9B\x9C |0 + \x9B\x9D |0 + \x9B\x9E |0 + \xCF\xB4 |0 + \x9B\x9F |0 + \xE4\xA8 |0 + \xE4\xAE |0 + \xC2\xE5 |0 + \x9B\xA0 |0 + \x9B\xA1 |0 + \xB6\xB4 |0 + \x9B\xA2 |0 + \x9B\xA3 |0 + \x9B\xA4 |0 + \x9B\xA5 |0 + \x9B\xA6 |0 + \x9B\xA7 |0 + \xBD\xF2 |0 + \x9B\xA8 |0 + \xE4\xA2 |0 + \x9B\xA9 |0 + \x9B\xAA |0 + \xBA\xE9 |0 + \xE4\xAA |0 + \x9B\xAB |0 + \x9B\xAC |0 + \xE4\xAC |0 + \x9B\xAD |0 + \x9B\xAE |0 + \xB6\xFD |0 + \xD6\xDE |0 + \xE4\xB2 |0 + \x9B\xAF |0 + \xE4\xAD |0 + \x9B\xB0 |0 + \x9B\xB1 |0 + \x9B\xB2 |0 + \xE4\xA1 |0 + \x9B\xB3 |0 + \xBB\xEE |0 + \xCD\xDD |0 + \xC7\xA2 |0 + \xC5\xC9 |0 + \x9B\xB4 |0 + \x9B\xB5 |0 + \xC1\xF7 |0 + \x9B\xB6 |0 + \xE4\xA4 |0 + \x9B\xB7 |0 + \xC7\xB3 |0 + \xBD\xAC |0 + \xBD\xBD |0 + \xE4\xA5 |0 + \x9B\xB8 |0 + \xD7\xC7 |0 + \xB2\xE2 |0 + \x9B\xB9 |0 + \xE4\xAB |0 + \xBC\xC3 |0 + \xE4\xAF |0 + \x9B\xBA |0 + \xBB\xEB |0 + \xE4\xB0 |0 + \xC5\xA8 |0 + \xE4\xB1 |0 + \x9B\xBB |0 + \x9B\xBC |0 + \x9B\xBD |0 + \x9B\xBE |0 + \xD5\xE3 |0 + \xBF\xA3 |0 + \x9B\xBF |0 + \xE4\xBA |0 + \x9B\xC0 |0 + \xE4\xB7 |0 + \x9B\xC1 |0 + \xE4\xBB |0 + \x9B\xC2 |0 + \x9B\xC3 |0 + \xE4\xBD |0 + \x9B\xC4 |0 + \x9B\xC5 |0 + \xC6\xD6 |0 + \x9B\xC6 |0 + \x9B\xC7 |0 + \xBA\xC6 |0 + \xC0\xCB |0 + \x9B\xC8 |0 + \x9B\xC9 |0 + \x9B\xCA |0 + \xB8\xA1 |0 + \xE4\xB4 |0 + \x9B\xCB |0 + \x9B\xCC |0 + \x9B\xCD |0 + \x9B\xCE |0 + \xD4\xA1 |0 + \x9B\xCF |0 + \x9B\xD0 |0 + \xBA\xA3 |0 + \xBD\xFE |0 + \x9B\xD1 |0 + \x9B\xD2 |0 + \x9B\xD3 |0 + \xE4\xBC |0 + \x9B\xD4 |0 + \x9B\xD5 |0 + \x9B\xD6 |0 + \x9B\xD7 |0 + \x9B\xD8 |0 + \xCD\xBF |0 + \x9B\xD9 |0 + \x9B\xDA |0 + \xC4\xF9 |0 + \x9B\xDB |0 + \x9B\xDC |0 + \xCF\xFB |0 + \xC9\xE6 |0 + \x9B\xDD |0 + \x9B\xDE |0 + \xD3\xBF |0 + \x9B\xDF |0 + \xCF\xD1 |0 + \x9B\xE0 |0 + \x9B\xE1 |0 + \xE4\xB3 |0 + \x9B\xE2 |0 + \xE4\xB8 |0 + \xE4\xB9 |0 + \xCC\xE9 |0 + \x9B\xE3 |0 + \x9B\xE4 |0 + \x9B\xE5 |0 + \x9B\xE6 |0 + \x9B\xE7 |0 + \xCC\xCE |0 + \x9B\xE8 |0 + \xC0\xD4 |0 + \xE4\xB5 |0 + \xC1\xB0 |0 + \xE4\xB6 |0 + \xCE\xD0 |0 + \x9B\xE9 |0 + \xBB\xC1 |0 + \xB5\xD3 |0 + \x9B\xEA |0 + \xC8\xF3 |0 + \xBD\xA7 |0 + \xD5\xC7 |0 + \xC9\xAC |0 + \xB8\xA2 |0 + \xE4\xCA |0 + \x9B\xEB |0 + \x9B\xEC |0 + \xE4\xCC |0 + \xD1\xC4 |0 + \x9B\xED |0 + \x9B\xEE |0 + \xD2\xBA |0 + \x9B\xEF |0 + \x9B\xF0 |0 + \xBA\xAD |0 + \x9B\xF1 |0 + \x9B\xF2 |0 + \xBA\xD4 |0 + \x9B\xF3 |0 + \x9B\xF4 |0 + \x9B\xF5 |0 + \x9B\xF6 |0 + \x9B\xF7 |0 + \x9B\xF8 |0 + \xE4\xC3 |0 + \xB5\xED |0 + \x9B\xF9 |0 + \x9B\xFA |0 + \x9B\xFB |0 + \xD7\xCD |0 + \xE4\xC0 |0 + \xCF\xFD |0 + \xE4\xBF |0 + \x9B\xFC |0 + \x9B\xFD |0 + \x9B\xFE |0 + \xC1\xDC |0 + \xCC\xCA |0 + \x9C\x40 |0 + \x9C\x41 |0 + \x9C\x42 |0 + \x9C\x43 |0 + \xCA\xE7 |0 + \x9C\x44 |0 + \x9C\x45 |0 + \x9C\x46 |0 + \x9C\x47 |0 + \xC4\xD7 |0 + \x9C\x48 |0 + \xCC\xD4 |0 + \xE4\xC8 |0 + \x9C\x49 |0 + \x9C\x4A |0 + \x9C\x4B |0 + \xE4\xC7 |0 + \xE4\xC1 |0 + \x9C\x4C |0 + \xE4\xC4 |0 + \xB5\xAD |0 + \x9C\x4D |0 + \x9C\x4E |0 + \xD3\xD9 |0 + \x9C\x4F |0 + \xE4\xC6 |0 + \x9C\x50 |0 + \x9C\x51 |0 + \x9C\x52 |0 + \x9C\x53 |0 + \xD2\xF9 |0 + \xB4\xE3 |0 + \x9C\x54 |0 + \xBB\xB4 |0 + \x9C\x55 |0 + \x9C\x56 |0 + \xC9\xEE |0 + \x9C\x57 |0 + \xB4\xBE |0 + \x9C\x58 |0 + \x9C\x59 |0 + \x9C\x5A |0 + \xBB\xEC |0 + \x9C\x5B |0 + \xD1\xCD |0 + \x9C\x5C |0 + \xCC\xED |0 + \xED\xB5 |0 + \x9C\x5D |0 + \x9C\x5E |0 + \x9C\x5F |0 + \x9C\x60 |0 + \x9C\x61 |0 + \x9C\x62 |0 + \x9C\x63 |0 + \x9C\x64 |0 + \xC7\xE5 |0 + \x9C\x65 |0 + \x9C\x66 |0 + \x9C\x67 |0 + \x9C\x68 |0 + \xD4\xA8 |0 + \x9C\x69 |0 + \xE4\xCB |0 + \xD7\xD5 |0 + \xE4\xC2 |0 + \x9C\x6A |0 + \xBD\xA5 |0 + \xE4\xC5 |0 + \x9C\x6B |0 + \x9C\x6C |0 + \xD3\xE6 |0 + \x9C\x6D |0 + \xE4\xC9 |0 + \xC9\xF8 |0 + \x9C\x6E |0 + \x9C\x6F |0 + \xE4\xBE |0 + \x9C\x70 |0 + \x9C\x71 |0 + \xD3\xE5 |0 + \x9C\x72 |0 + \x9C\x73 |0 + \xC7\xFE |0 + \xB6\xC9 |0 + \x9C\x74 |0 + \xD4\xFC |0 + \xB2\xB3 |0 + \xE4\xD7 |0 + \x9C\x75 |0 + \x9C\x76 |0 + \x9C\x77 |0 + \xCE\xC2 |0 + \x9C\x78 |0 + \xE4\xCD |0 + \x9C\x79 |0 + \xCE\xBC |0 + \x9C\x7A |0 + \xB8\xDB |0 + \x9C\x7B |0 + \x9C\x7C |0 + \xE4\xD6 |0 + \x9C\x7D |0 + \xBF\xCA |0 + \x9C\x7E |0 + \x9C\x80 |0 + \x9C\x81 |0 + \xD3\xCE |0 + \x9C\x82 |0 + \xC3\xEC |0 + \x9C\x83 |0 + \x9C\x84 |0 + \x9C\x85 |0 + \x9C\x86 |0 + \x9C\x87 |0 + \x9C\x88 |0 + \x9C\x89 |0 + \x9C\x8A |0 + \xC5\xC8 |0 + \xE4\xD8 |0 + \x9C\x8B |0 + \x9C\x8C |0 + \x9C\x8D |0 + \x9C\x8E |0 + \x9C\x8F |0 + \x9C\x90 |0 + \x9C\x91 |0 + \x9C\x92 |0 + \xCD\xC4 |0 + \xE4\xCF |0 + \x9C\x93 |0 + \x9C\x94 |0 + \x9C\x95 |0 + \x9C\x96 |0 + \xE4\xD4 |0 + \xE4\xD5 |0 + \x9C\x97 |0 + \xBA\xFE |0 + \x9C\x98 |0 + \xCF\xE6 |0 + \x9C\x99 |0 + \x9C\x9A |0 + \xD5\xBF |0 + \x9C\x9B |0 + \x9C\x9C |0 + \x9C\x9D |0 + \xE4\xD2 |0 + \x9C\x9E |0 + \x9C\x9F |0 + \x9C\xA0 |0 + \x9C\xA1 |0 + \x9C\xA2 |0 + \x9C\xA3 |0 + \x9C\xA4 |0 + \x9C\xA5 |0 + \x9C\xA6 |0 + \x9C\xA7 |0 + \x9C\xA8 |0 + \xE4\xD0 |0 + \x9C\xA9 |0 + \x9C\xAA |0 + \xE4\xCE |0 + \x9C\xAB |0 + \x9C\xAC |0 + \x9C\xAD |0 + \x9C\xAE |0 + \x9C\xAF |0 + \x9C\xB0 |0 + \x9C\xB1 |0 + \x9C\xB2 |0 + \x9C\xB3 |0 + \x9C\xB4 |0 + \x9C\xB5 |0 + \x9C\xB6 |0 + \x9C\xB7 |0 + \x9C\xB8 |0 + \x9C\xB9 |0 + \xCD\xE5 |0 + \xCA\xAA |0 + \x9C\xBA |0 + \x9C\xBB |0 + \x9C\xBC |0 + \xC0\xA3 |0 + \x9C\xBD |0 + \xBD\xA6 |0 + \xE4\xD3 |0 + \x9C\xBE |0 + \x9C\xBF |0 + \xB8\xC8 |0 + \x9C\xC0 |0 + \x9C\xC1 |0 + \x9C\xC2 |0 + \x9C\xC3 |0 + \x9C\xC4 |0 + \xE4\xE7 |0 + \xD4\xB4 |0 + \x9C\xC5 |0 + \x9C\xC6 |0 + \x9C\xC7 |0 + \x9C\xC8 |0 + \x9C\xC9 |0 + \x9C\xCA |0 + \x9C\xCB |0 + \xE4\xDB |0 + \x9C\xCC |0 + \x9C\xCD |0 + \x9C\xCE |0 + \xC1\xEF |0 + \x9C\xCF |0 + \x9C\xD0 |0 + \xE4\xE9 |0 + \x9C\xD1 |0 + \x9C\xD2 |0 + \xD2\xE7 |0 + \x9C\xD3 |0 + \x9C\xD4 |0 + \xE4\xDF |0 + \x9C\xD5 |0 + \xE4\xE0 |0 + \x9C\xD6 |0 + \x9C\xD7 |0 + \xCF\xAA |0 + \x9C\xD8 |0 + \x9C\xD9 |0 + \x9C\xDA |0 + \x9C\xDB |0 + \xCB\xDD |0 + \x9C\xDC |0 + \xE4\xDA |0 + \xE4\xD1 |0 + \x9C\xDD |0 + \xE4\xE5 |0 + \x9C\xDE |0 + \xC8\xDC |0 + \xE4\xE3 |0 + \x9C\xDF |0 + \x9C\xE0 |0 + \xC4\xE7 |0 + \xE4\xE2 |0 + \x9C\xE1 |0 + \xE4\xE1 |0 + \x9C\xE2 |0 + \x9C\xE3 |0 + \x9C\xE4 |0 + \xB3\xFC |0 + \xE4\xE8 |0 + \x9C\xE5 |0 + \x9C\xE6 |0 + \x9C\xE7 |0 + \x9C\xE8 |0 + \xB5\xE1 |0 + \x9C\xE9 |0 + \x9C\xEA |0 + \x9C\xEB |0 + \xD7\xCC |0 + \x9C\xEC |0 + \x9C\xED |0 + \x9C\xEE |0 + \xE4\xE6 |0 + \x9C\xEF |0 + \xBB\xAC |0 + \x9C\xF0 |0 + \xD7\xD2 |0 + \xCC\xCF |0 + \xEB\xF8 |0 + \x9C\xF1 |0 + \xE4\xE4 |0 + \x9C\xF2 |0 + \x9C\xF3 |0 + \xB9\xF6 |0 + \x9C\xF4 |0 + \x9C\xF5 |0 + \x9C\xF6 |0 + \xD6\xCD |0 + \xE4\xD9 |0 + \xE4\xDC |0 + \xC2\xFA |0 + \xE4\xDE |0 + \x9C\xF7 |0 + \xC2\xCB |0 + \xC0\xC4 |0 + \xC2\xD0 |0 + \x9C\xF8 |0 + \xB1\xF5 |0 + \xCC\xB2 |0 + \x9C\xF9 |0 + \x9C\xFA |0 + \x9C\xFB |0 + \x9C\xFC |0 + \x9C\xFD |0 + \x9C\xFE |0 + \x9D\x40 |0 + \x9D\x41 |0 + \x9D\x42 |0 + \x9D\x43 |0 + \xB5\xCE |0 + \x9D\x44 |0 + \x9D\x45 |0 + \x9D\x46 |0 + \x9D\x47 |0 + \xE4\xEF |0 + \x9D\x48 |0 + \x9D\x49 |0 + \x9D\x4A |0 + \x9D\x4B |0 + \x9D\x4C |0 + \x9D\x4D |0 + \x9D\x4E |0 + \x9D\x4F |0 + \xC6\xAF |0 + \x9D\x50 |0 + \x9D\x51 |0 + \x9D\x52 |0 + \xC6\xE1 |0 + \x9D\x53 |0 + \x9D\x54 |0 + \xE4\xF5 |0 + \x9D\x55 |0 + \x9D\x56 |0 + \x9D\x57 |0 + \x9D\x58 |0 + \x9D\x59 |0 + \xC2\xA9 |0 + \x9D\x5A |0 + \x9D\x5B |0 + \x9D\x5C |0 + \xC0\xEC |0 + \xD1\xDD |0 + \xE4\xEE |0 + \x9D\x5D |0 + \x9D\x5E |0 + \x9D\x5F |0 + \x9D\x60 |0 + \x9D\x61 |0 + \x9D\x62 |0 + \x9D\x63 |0 + \x9D\x64 |0 + \x9D\x65 |0 + \x9D\x66 |0 + \xC4\xAE |0 + \x9D\x67 |0 + \x9D\x68 |0 + \x9D\x69 |0 + \xE4\xED |0 + \x9D\x6A |0 + \x9D\x6B |0 + \x9D\x6C |0 + \x9D\x6D |0 + \xE4\xF6 |0 + \xE4\xF4 |0 + \xC2\xFE |0 + \x9D\x6E |0 + \xE4\xDD |0 + \x9D\x6F |0 + \xE4\xF0 |0 + \x9D\x70 |0 + \xCA\xFE |0 + \x9D\x71 |0 + \xD5\xC4 |0 + \x9D\x72 |0 + \x9D\x73 |0 + \xE4\xF1 |0 + \x9D\x74 |0 + \x9D\x75 |0 + \x9D\x76 |0 + \x9D\x77 |0 + \x9D\x78 |0 + \x9D\x79 |0 + \x9D\x7A |0 + \xD1\xFA |0 + \x9D\x7B |0 + \x9D\x7C |0 + \x9D\x7D |0 + \x9D\x7E |0 + \x9D\x80 |0 + \x9D\x81 |0 + \x9D\x82 |0 + \xE4\xEB |0 + \xE4\xEC |0 + \x9D\x83 |0 + \x9D\x84 |0 + \x9D\x85 |0 + \xE4\xF2 |0 + \x9D\x86 |0 + \xCE\xAB |0 + \x9D\x87 |0 + \x9D\x88 |0 + \x9D\x89 |0 + \x9D\x8A |0 + \x9D\x8B |0 + \x9D\x8C |0 + \x9D\x8D |0 + \x9D\x8E |0 + \x9D\x8F |0 + \x9D\x90 |0 + \xC5\xCB |0 + \x9D\x91 |0 + \x9D\x92 |0 + \x9D\x93 |0 + \xC7\xB1 |0 + \x9D\x94 |0 + \xC2\xBA |0 + \x9D\x95 |0 + \x9D\x96 |0 + \x9D\x97 |0 + \xE4\xEA |0 + \x9D\x98 |0 + \x9D\x99 |0 + \x9D\x9A |0 + \xC1\xCA |0 + \x9D\x9B |0 + \x9D\x9C |0 + \x9D\x9D |0 + \x9D\x9E |0 + \x9D\x9F |0 + \x9D\xA0 |0 + \xCC\xB6 |0 + \xB3\xB1 |0 + \x9D\xA1 |0 + \x9D\xA2 |0 + \x9D\xA3 |0 + \xE4\xFB |0 + \x9D\xA4 |0 + \xE4\xF3 |0 + \x9D\xA5 |0 + \x9D\xA6 |0 + \x9D\xA7 |0 + \xE4\xFA |0 + \x9D\xA8 |0 + \xE4\xFD |0 + \x9D\xA9 |0 + \xE4\xFC |0 + \x9D\xAA |0 + \x9D\xAB |0 + \x9D\xAC |0 + \x9D\xAD |0 + \x9D\xAE |0 + \x9D\xAF |0 + \x9D\xB0 |0 + \xB3\xCE |0 + \x9D\xB1 |0 + \x9D\xB2 |0 + \x9D\xB3 |0 + \xB3\xBA |0 + \xE4\xF7 |0 + \x9D\xB4 |0 + \x9D\xB5 |0 + \xE4\xF9 |0 + \xE4\xF8 |0 + \xC5\xEC |0 + \x9D\xB6 |0 + \x9D\xB7 |0 + \x9D\xB8 |0 + \x9D\xB9 |0 + \x9D\xBA |0 + \x9D\xBB |0 + \x9D\xBC |0 + \x9D\xBD |0 + \x9D\xBE |0 + \x9D\xBF |0 + \x9D\xC0 |0 + \x9D\xC1 |0 + \x9D\xC2 |0 + \xC0\xBD |0 + \x9D\xC3 |0 + \x9D\xC4 |0 + \x9D\xC5 |0 + \x9D\xC6 |0 + \xD4\xE8 |0 + \x9D\xC7 |0 + \x9D\xC8 |0 + \x9D\xC9 |0 + \x9D\xCA |0 + \x9D\xCB |0 + \xE5\xA2 |0 + \x9D\xCC |0 + \x9D\xCD |0 + \x9D\xCE |0 + \x9D\xCF |0 + \x9D\xD0 |0 + \x9D\xD1 |0 + \x9D\xD2 |0 + \x9D\xD3 |0 + \x9D\xD4 |0 + \x9D\xD5 |0 + \x9D\xD6 |0 + \xB0\xC4 |0 + \x9D\xD7 |0 + \x9D\xD8 |0 + \xE5\xA4 |0 + \x9D\xD9 |0 + \x9D\xDA |0 + \xE5\xA3 |0 + \x9D\xDB |0 + \x9D\xDC |0 + \x9D\xDD |0 + \x9D\xDE |0 + \x9D\xDF |0 + \x9D\xE0 |0 + \xBC\xA4 |0 + \x9D\xE1 |0 + \xE5\xA5 |0 + \x9D\xE2 |0 + \x9D\xE3 |0 + \x9D\xE4 |0 + \x9D\xE5 |0 + \x9D\xE6 |0 + \x9D\xE7 |0 + \xE5\xA1 |0 + \x9D\xE8 |0 + \x9D\xE9 |0 + \x9D\xEA |0 + \x9D\xEB |0 + \x9D\xEC |0 + \x9D\xED |0 + \x9D\xEE |0 + \xE4\xFE |0 + \xB1\xF4 |0 + \x9D\xEF |0 + \x9D\xF0 |0 + \x9D\xF1 |0 + \x9D\xF2 |0 + \x9D\xF3 |0 + \x9D\xF4 |0 + \x9D\xF5 |0 + \x9D\xF6 |0 + \x9D\xF7 |0 + \x9D\xF8 |0 + \x9D\xF9 |0 + \xE5\xA8 |0 + \x9D\xFA |0 + \xE5\xA9 |0 + \xE5\xA6 |0 + \x9D\xFB |0 + \x9D\xFC |0 + \x9D\xFD |0 + \x9D\xFE |0 + \x9E\x40 |0 + \x9E\x41 |0 + \x9E\x42 |0 + \x9E\x43 |0 + \x9E\x44 |0 + \x9E\x45 |0 + \x9E\x46 |0 + \x9E\x47 |0 + \xE5\xA7 |0 + \xE5\xAA |0 + \x9E\x48 |0 + \x9E\x49 |0 + \x9E\x4A |0 + \x9E\x4B |0 + \x9E\x4C |0 + \x9E\x4D |0 + \x9E\x4E |0 + \x9E\x4F |0 + \x9E\x50 |0 + \x9E\x51 |0 + \x9E\x52 |0 + \x9E\x53 |0 + \x9E\x54 |0 + \x9E\x55 |0 + \x9E\x56 |0 + \x9E\x57 |0 + \x9E\x58 |0 + \x9E\x59 |0 + \x9E\x5A |0 + \x9E\x5B |0 + \x9E\x5C |0 + \x9E\x5D |0 + \x9E\x5E |0 + \x9E\x5F |0 + \x9E\x60 |0 + \x9E\x61 |0 + \x9E\x62 |0 + \x9E\x63 |0 + \x9E\x64 |0 + \x9E\x65 |0 + \x9E\x66 |0 + \x9E\x67 |0 + \x9E\x68 |0 + \xC6\xD9 |0 + \x9E\x69 |0 + \x9E\x6A |0 + \x9E\x6B |0 + \x9E\x6C |0 + \x9E\x6D |0 + \x9E\x6E |0 + \x9E\x6F |0 + \x9E\x70 |0 + \xE5\xAB |0 + \xE5\xAD |0 + \x9E\x71 |0 + \x9E\x72 |0 + \x9E\x73 |0 + \x9E\x74 |0 + \x9E\x75 |0 + \x9E\x76 |0 + \x9E\x77 |0 + \xE5\xAC |0 + \x9E\x78 |0 + \x9E\x79 |0 + \x9E\x7A |0 + \x9E\x7B |0 + \x9E\x7C |0 + \x9E\x7D |0 + \x9E\x7E |0 + \x9E\x80 |0 + \x9E\x81 |0 + \x9E\x82 |0 + \x9E\x83 |0 + \x9E\x84 |0 + \x9E\x85 |0 + \x9E\x86 |0 + \x9E\x87 |0 + \x9E\x88 |0 + \x9E\x89 |0 + \xE5\xAF |0 + \x9E\x8A |0 + \x9E\x8B |0 + \x9E\x8C |0 + \xE5\xAE |0 + \x9E\x8D |0 + \x9E\x8E |0 + \x9E\x8F |0 + \x9E\x90 |0 + \x9E\x91 |0 + \x9E\x92 |0 + \x9E\x93 |0 + \x9E\x94 |0 + \x9E\x95 |0 + \x9E\x96 |0 + \x9E\x97 |0 + \x9E\x98 |0 + \x9E\x99 |0 + \x9E\x9A |0 + \x9E\x9B |0 + \x9E\x9C |0 + \x9E\x9D |0 + \x9E\x9E |0 + \xB9\xE0 |0 + \x9E\x9F |0 + \x9E\xA0 |0 + \xE5\xB0 |0 + \x9E\xA1 |0 + \x9E\xA2 |0 + \x9E\xA3 |0 + \x9E\xA4 |0 + \x9E\xA5 |0 + \x9E\xA6 |0 + \x9E\xA7 |0 + \x9E\xA8 |0 + \x9E\xA9 |0 + \x9E\xAA |0 + \x9E\xAB |0 + \x9E\xAC |0 + \x9E\xAD |0 + \x9E\xAE |0 + \xE5\xB1 |0 + \x9E\xAF |0 + \x9E\xB0 |0 + \x9E\xB1 |0 + \x9E\xB2 |0 + \x9E\xB3 |0 + \x9E\xB4 |0 + \x9E\xB5 |0 + \x9E\xB6 |0 + \x9E\xB7 |0 + \x9E\xB8 |0 + \x9E\xB9 |0 + \x9E\xBA |0 + \xBB\xF0 |0 + \xEC\xE1 |0 + \xC3\xF0 |0 + \x9E\xBB |0 + \xB5\xC6 |0 + \xBB\xD2 |0 + \x9E\xBC |0 + \x9E\xBD |0 + \x9E\xBE |0 + \x9E\xBF |0 + \xC1\xE9 |0 + \xD4\xEE |0 + \x9E\xC0 |0 + \xBE\xC4 |0 + \x9E\xC1 |0 + \x9E\xC2 |0 + \x9E\xC3 |0 + \xD7\xC6 |0 + \x9E\xC4 |0 + \xD4\xD6 |0 + \xB2\xD3 |0 + \xEC\xBE |0 + \x9E\xC5 |0 + \x9E\xC6 |0 + \x9E\xC7 |0 + \x9E\xC8 |0 + \xEA\xC1 |0 + \x9E\xC9 |0 + \x9E\xCA |0 + \x9E\xCB |0 + \xC2\xAF |0 + \xB4\xB6 |0 + \x9E\xCC |0 + \x9E\xCD |0 + \x9E\xCE |0 + \xD1\xD7 |0 + \x9E\xCF |0 + \x9E\xD0 |0 + \x9E\xD1 |0 + \xB3\xB4 |0 + \x9E\xD2 |0 + \xC8\xB2 |0 + \xBF\xBB |0 + \xEC\xC0 |0 + \x9E\xD3 |0 + \x9E\xD4 |0 + \xD6\xCB |0 + \x9E\xD5 |0 + \x9E\xD6 |0 + \xEC\xBF |0 + \xEC\xC1 |0 + \x9E\xD7 |0 + \x9E\xD8 |0 + \x9E\xD9 |0 + \x9E\xDA |0 + \x9E\xDB |0 + \x9E\xDC |0 + \x9E\xDD |0 + \x9E\xDE |0 + \x9E\xDF |0 + \x9E\xE0 |0 + \x9E\xE1 |0 + \x9E\xE2 |0 + \x9E\xE3 |0 + \xEC\xC5 |0 + \xBE\xE6 |0 + \xCC\xBF |0 + \xC5\xDA |0 + \xBE\xBC |0 + \x9E\xE4 |0 + \xEC\xC6 |0 + \x9E\xE5 |0 + \xB1\xFE |0 + \x9E\xE6 |0 + \x9E\xE7 |0 + \x9E\xE8 |0 + \xEC\xC4 |0 + \xD5\xA8 |0 + \xB5\xE3 |0 + \x9E\xE9 |0 + \xEC\xC2 |0 + \xC1\xB6 |0 + \xB3\xE3 |0 + \x9E\xEA |0 + \x9E\xEB |0 + \xEC\xC3 |0 + \xCB\xB8 |0 + \xC0\xC3 |0 + \xCC\xFE |0 + \x9E\xEC |0 + \x9E\xED |0 + \x9E\xEE |0 + \x9E\xEF |0 + \xC1\xD2 |0 + \x9E\xF0 |0 + \xEC\xC8 |0 + \x9E\xF1 |0 + \x9E\xF2 |0 + \x9E\xF3 |0 + \x9E\xF4 |0 + \x9E\xF5 |0 + \x9E\xF6 |0 + \x9E\xF7 |0 + \x9E\xF8 |0 + \x9E\xF9 |0 + \x9E\xFA |0 + \x9E\xFB |0 + \x9E\xFC |0 + \x9E\xFD |0 + \xBA\xE6 |0 + \xC0\xD3 |0 + \x9E\xFE |0 + \xD6\xF2 |0 + \x9F\x40 |0 + \x9F\x41 |0 + \x9F\x42 |0 + \xD1\xCC |0 + \x9F\x43 |0 + \x9F\x44 |0 + \x9F\x45 |0 + \x9F\x46 |0 + \xBF\xBE |0 + \x9F\x47 |0 + \xB7\xB3 |0 + \xC9\xD5 |0 + \xEC\xC7 |0 + \xBB\xE2 |0 + \x9F\x48 |0 + \xCC\xCC |0 + \xBD\xFD |0 + \xC8\xC8 |0 + \x9F\x49 |0 + \xCF\xA9 |0 + \x9F\x4A |0 + \x9F\x4B |0 + \x9F\x4C |0 + \x9F\x4D |0 + \x9F\x4E |0 + \x9F\x4F |0 + \x9F\x50 |0 + \xCD\xE9 |0 + \x9F\x51 |0 + \xC5\xEB |0 + \x9F\x52 |0 + \x9F\x53 |0 + \x9F\x54 |0 + \xB7\xE9 |0 + \x9F\x55 |0 + \x9F\x56 |0 + \x9F\x57 |0 + \x9F\x58 |0 + \x9F\x59 |0 + \x9F\x5A |0 + \x9F\x5B |0 + \x9F\x5C |0 + \x9F\x5D |0 + \x9F\x5E |0 + \x9F\x5F |0 + \xD1\xC9 |0 + \xBA\xB8 |0 + \x9F\x60 |0 + \x9F\x61 |0 + \x9F\x62 |0 + \x9F\x63 |0 + \x9F\x64 |0 + \xEC\xC9 |0 + \x9F\x65 |0 + \x9F\x66 |0 + \xEC\xCA |0 + \x9F\x67 |0 + \xBB\xC0 |0 + \xEC\xCB |0 + \x9F\x68 |0 + \xEC\xE2 |0 + \xB1\xBA |0 + \xB7\xD9 |0 + \x9F\x69 |0 + \x9F\x6A |0 + \x9F\x6B |0 + \x9F\x6C |0 + \x9F\x6D |0 + \x9F\x6E |0 + \x9F\x6F |0 + \x9F\x70 |0 + \x9F\x71 |0 + \x9F\x72 |0 + \x9F\x73 |0 + \xBD\xB9 |0 + \x9F\x74 |0 + \x9F\x75 |0 + \x9F\x76 |0 + \x9F\x77 |0 + \x9F\x78 |0 + \x9F\x79 |0 + \x9F\x7A |0 + \x9F\x7B |0 + \xEC\xCC |0 + \xD1\xE6 |0 + \xEC\xCD |0 + \x9F\x7C |0 + \x9F\x7D |0 + \x9F\x7E |0 + \x9F\x80 |0 + \xC8\xBB |0 + \x9F\x81 |0 + \x9F\x82 |0 + \x9F\x83 |0 + \x9F\x84 |0 + \x9F\x85 |0 + \x9F\x86 |0 + \x9F\x87 |0 + \x9F\x88 |0 + \x9F\x89 |0 + \x9F\x8A |0 + \x9F\x8B |0 + \x9F\x8C |0 + \x9F\x8D |0 + \x9F\x8E |0 + \xEC\xD1 |0 + \x9F\x8F |0 + \x9F\x90 |0 + \x9F\x91 |0 + \x9F\x92 |0 + \xEC\xD3 |0 + \x9F\x93 |0 + \xBB\xCD |0 + \x9F\x94 |0 + \xBC\xE5 |0 + \x9F\x95 |0 + \x9F\x96 |0 + \x9F\x97 |0 + \x9F\x98 |0 + \x9F\x99 |0 + \x9F\x9A |0 + \x9F\x9B |0 + \x9F\x9C |0 + \x9F\x9D |0 + \x9F\x9E |0 + \x9F\x9F |0 + \x9F\xA0 |0 + \x9F\xA1 |0 + \xEC\xCF |0 + \x9F\xA2 |0 + \xC9\xB7 |0 + \x9F\xA3 |0 + \x9F\xA4 |0 + \x9F\xA5 |0 + \x9F\xA6 |0 + \x9F\xA7 |0 + \xC3\xBA |0 + \x9F\xA8 |0 + \xEC\xE3 |0 + \xD5\xD5 |0 + \xEC\xD0 |0 + \x9F\xA9 |0 + \x9F\xAA |0 + \x9F\xAB |0 + \x9F\xAC |0 + \x9F\xAD |0 + \xD6\xF3 |0 + \x9F\xAE |0 + \x9F\xAF |0 + \x9F\xB0 |0 + \xEC\xD2 |0 + \xEC\xCE |0 + \x9F\xB1 |0 + \x9F\xB2 |0 + \x9F\xB3 |0 + \x9F\xB4 |0 + \xEC\xD4 |0 + \x9F\xB5 |0 + \xEC\xD5 |0 + \x9F\xB6 |0 + \x9F\xB7 |0 + \xC9\xBF |0 + \x9F\xB8 |0 + \x9F\xB9 |0 + \x9F\xBA |0 + \x9F\xBB |0 + \x9F\xBC |0 + \x9F\xBD |0 + \xCF\xA8 |0 + \x9F\xBE |0 + \x9F\xBF |0 + \x9F\xC0 |0 + \x9F\xC1 |0 + \x9F\xC2 |0 + \xD0\xDC |0 + \x9F\xC3 |0 + \x9F\xC4 |0 + \x9F\xC5 |0 + \x9F\xC6 |0 + \xD1\xAC |0 + \x9F\xC7 |0 + \x9F\xC8 |0 + \x9F\xC9 |0 + \x9F\xCA |0 + \xC8\xDB |0 + \x9F\xCB |0 + \x9F\xCC |0 + \x9F\xCD |0 + \xEC\xD6 |0 + \xCE\xF5 |0 + \x9F\xCE |0 + \x9F\xCF |0 + \x9F\xD0 |0 + \x9F\xD1 |0 + \x9F\xD2 |0 + \xCA\xEC |0 + \xEC\xDA |0 + \x9F\xD3 |0 + \x9F\xD4 |0 + \x9F\xD5 |0 + \x9F\xD6 |0 + \x9F\xD7 |0 + \x9F\xD8 |0 + \x9F\xD9 |0 + \xEC\xD9 |0 + \x9F\xDA |0 + \x9F\xDB |0 + \x9F\xDC |0 + \xB0\xBE |0 + \x9F\xDD |0 + \x9F\xDE |0 + \x9F\xDF |0 + \x9F\xE0 |0 + \x9F\xE1 |0 + \x9F\xE2 |0 + \xEC\xD7 |0 + \x9F\xE3 |0 + \xEC\xD8 |0 + \x9F\xE4 |0 + \x9F\xE5 |0 + \x9F\xE6 |0 + \xEC\xE4 |0 + \x9F\xE7 |0 + \x9F\xE8 |0 + \x9F\xE9 |0 + \x9F\xEA |0 + \x9F\xEB |0 + \x9F\xEC |0 + \x9F\xED |0 + \x9F\xEE |0 + \x9F\xEF |0 + \xC8\xBC |0 + \x9F\xF0 |0 + \x9F\xF1 |0 + \x9F\xF2 |0 + \x9F\xF3 |0 + \x9F\xF4 |0 + \x9F\xF5 |0 + \x9F\xF6 |0 + \x9F\xF7 |0 + \x9F\xF8 |0 + \x9F\xF9 |0 + \xC1\xC7 |0 + \x9F\xFA |0 + \x9F\xFB |0 + \x9F\xFC |0 + \x9F\xFD |0 + \x9F\xFE |0 + \xEC\xDC |0 + \xD1\xE0 |0 + \xA0\x40 |0 + \xA0\x41 |0 + \xA0\x42 |0 + \xA0\x43 |0 + \xA0\x44 |0 + \xA0\x45 |0 + \xA0\x46 |0 + \xA0\x47 |0 + \xA0\x48 |0 + \xA0\x49 |0 + \xEC\xDB |0 + \xA0\x4A |0 + \xA0\x4B |0 + \xA0\x4C |0 + \xA0\x4D |0 + \xD4\xEF |0 + \xA0\x4E |0 + \xEC\xDD |0 + \xA0\x4F |0 + \xA0\x50 |0 + \xA0\x51 |0 + \xA0\x52 |0 + \xA0\x53 |0 + \xA0\x54 |0 + \xDB\xC6 |0 + \xA0\x55 |0 + \xA0\x56 |0 + \xA0\x57 |0 + \xA0\x58 |0 + \xA0\x59 |0 + \xA0\x5A |0 + \xA0\x5B |0 + \xA0\x5C |0 + \xA0\x5D |0 + \xA0\x5E |0 + \xEC\xDE |0 + \xA0\x5F |0 + \xA0\x60 |0 + \xA0\x61 |0 + \xA0\x62 |0 + \xA0\x63 |0 + \xA0\x64 |0 + \xA0\x65 |0 + \xA0\x66 |0 + \xA0\x67 |0 + \xA0\x68 |0 + \xA0\x69 |0 + \xA0\x6A |0 + \xB1\xAC |0 + \xA0\x6B |0 + \xA0\x6C |0 + \xA0\x6D |0 + \xA0\x6E |0 + \xA0\x6F |0 + \xA0\x70 |0 + \xA0\x71 |0 + \xA0\x72 |0 + \xA0\x73 |0 + \xA0\x74 |0 + \xA0\x75 |0 + \xA0\x76 |0 + \xA0\x77 |0 + \xA0\x78 |0 + \xA0\x79 |0 + \xA0\x7A |0 + \xA0\x7B |0 + \xA0\x7C |0 + \xA0\x7D |0 + \xA0\x7E |0 + \xA0\x80 |0 + \xA0\x81 |0 + \xEC\xDF |0 + \xA0\x82 |0 + \xA0\x83 |0 + \xA0\x84 |0 + \xA0\x85 |0 + \xA0\x86 |0 + \xA0\x87 |0 + \xA0\x88 |0 + \xA0\x89 |0 + \xA0\x8A |0 + \xA0\x8B |0 + \xEC\xE0 |0 + \xA0\x8C |0 + \xD7\xA6 |0 + \xA0\x8D |0 + \xC5\xC0 |0 + \xA0\x8E |0 + \xA0\x8F |0 + \xA0\x90 |0 + \xEB\xBC |0 + \xB0\xAE |0 + \xA0\x91 |0 + \xA0\x92 |0 + \xA0\x93 |0 + \xBE\xF4 |0 + \xB8\xB8 |0 + \xD2\xAF |0 + \xB0\xD6 |0 + \xB5\xF9 |0 + \xA0\x94 |0 + \xD8\xB3 |0 + \xA0\x95 |0 + \xCB\xAC |0 + \xA0\x96 |0 + \xE3\xDD |0 + \xA0\x97 |0 + \xA0\x98 |0 + \xA0\x99 |0 + \xA0\x9A |0 + \xA0\x9B |0 + \xA0\x9C |0 + \xA0\x9D |0 + \xC6\xAC |0 + \xB0\xE6 |0 + \xA0\x9E |0 + \xA0\x9F |0 + \xA0\xA0 |0 + \xC5\xC6 |0 + \xEB\xB9 |0 + \xA0\xA1 |0 + \xA0\xA2 |0 + \xA0\xA3 |0 + \xA0\xA4 |0 + \xEB\xBA |0 + \xA0\xA5 |0 + \xA0\xA6 |0 + \xA0\xA7 |0 + \xEB\xBB |0 + \xA0\xA8 |0 + \xA0\xA9 |0 + \xD1\xC0 |0 + \xA0\xAA |0 + \xC5\xA3 |0 + \xA0\xAB |0 + \xEA\xF2 |0 + \xA0\xAC |0 + \xC4\xB2 |0 + \xA0\xAD |0 + \xC4\xB5 |0 + \xC0\xCE |0 + \xA0\xAE |0 + \xA0\xAF |0 + \xA0\xB0 |0 + \xEA\xF3 |0 + \xC4\xC1 |0 + \xA0\xB1 |0 + \xCE\xEF |0 + \xA0\xB2 |0 + \xA0\xB3 |0 + \xA0\xB4 |0 + \xA0\xB5 |0 + \xEA\xF0 |0 + \xEA\xF4 |0 + \xA0\xB6 |0 + \xA0\xB7 |0 + \xC9\xFC |0 + \xA0\xB8 |0 + \xA0\xB9 |0 + \xC7\xA3 |0 + \xA0\xBA |0 + \xA0\xBB |0 + \xA0\xBC |0 + \xCC\xD8 |0 + \xCE\xFE |0 + \xA0\xBD |0 + \xA0\xBE |0 + \xA0\xBF |0 + \xEA\xF5 |0 + \xEA\xF6 |0 + \xCF\xAC |0 + \xC0\xE7 |0 + \xA0\xC0 |0 + \xA0\xC1 |0 + \xEA\xF7 |0 + \xA0\xC2 |0 + \xA0\xC3 |0 + \xA0\xC4 |0 + \xA0\xC5 |0 + \xA0\xC6 |0 + \xB6\xBF |0 + \xEA\xF8 |0 + \xA0\xC7 |0 + \xEA\xF9 |0 + \xA0\xC8 |0 + \xEA\xFA |0 + \xA0\xC9 |0 + \xA0\xCA |0 + \xEA\xFB |0 + \xA0\xCB |0 + \xA0\xCC |0 + \xA0\xCD |0 + \xA0\xCE |0 + \xA0\xCF |0 + \xA0\xD0 |0 + \xA0\xD1 |0 + \xA0\xD2 |0 + \xA0\xD3 |0 + \xA0\xD4 |0 + \xA0\xD5 |0 + \xA0\xD6 |0 + \xEA\xF1 |0 + \xA0\xD7 |0 + \xA0\xD8 |0 + \xA0\xD9 |0 + \xA0\xDA |0 + \xA0\xDB |0 + \xA0\xDC |0 + \xA0\xDD |0 + \xA0\xDE |0 + \xA0\xDF |0 + \xA0\xE0 |0 + \xA0\xE1 |0 + \xA0\xE2 |0 + \xC8\xAE |0 + \xE1\xEB |0 + \xA0\xE3 |0 + \xB7\xB8 |0 + \xE1\xEC |0 + \xA0\xE4 |0 + \xA0\xE5 |0 + \xA0\xE6 |0 + \xE1\xED |0 + \xA0\xE7 |0 + \xD7\xB4 |0 + \xE1\xEE |0 + \xE1\xEF |0 + \xD3\xCC |0 + \xA0\xE8 |0 + \xA0\xE9 |0 + \xA0\xEA |0 + \xA0\xEB |0 + \xA0\xEC |0 + \xA0\xED |0 + \xA0\xEE |0 + \xE1\xF1 |0 + \xBF\xF1 |0 + \xE1\xF0 |0 + \xB5\xD2 |0 + \xA0\xEF |0 + \xA0\xF0 |0 + \xA0\xF1 |0 + \xB1\xB7 |0 + \xA0\xF2 |0 + \xA0\xF3 |0 + \xA0\xF4 |0 + \xA0\xF5 |0 + \xE1\xF3 |0 + \xE1\xF2 |0 + \xA0\xF6 |0 + \xBA\xFC |0 + \xA0\xF7 |0 + \xE1\xF4 |0 + \xA0\xF8 |0 + \xA0\xF9 |0 + \xA0\xFA |0 + \xA0\xFB |0 + \xB9\xB7 |0 + \xA0\xFC |0 + \xBE\xD1 |0 + \xA0\xFD |0 + \xA0\xFE |0 + \xAA\x40 |0 + \xAA\x41 |0 + \xC4\xFC |0 + \xAA\x42 |0 + \xBA\xDD |0 + \xBD\xC6 |0 + \xAA\x43 |0 + \xAA\x44 |0 + \xAA\x45 |0 + \xAA\x46 |0 + \xAA\x47 |0 + \xAA\x48 |0 + \xE1\xF5 |0 + \xE1\xF7 |0 + \xAA\x49 |0 + \xAA\x4A |0 + \xB6\xC0 |0 + \xCF\xC1 |0 + \xCA\xA8 |0 + \xE1\xF6 |0 + \xD5\xF8 |0 + \xD3\xFC |0 + \xE1\xF8 |0 + \xE1\xFC |0 + \xE1\xF9 |0 + \xAA\x4B |0 + \xAA\x4C |0 + \xE1\xFA |0 + \xC0\xEA |0 + \xAA\x4D |0 + \xE1\xFE |0 + \xE2\xA1 |0 + \xC0\xC7 |0 + \xAA\x4E |0 + \xAA\x4F |0 + \xAA\x50 |0 + \xAA\x51 |0 + \xE1\xFB |0 + \xAA\x52 |0 + \xE1\xFD |0 + \xAA\x53 |0 + \xAA\x54 |0 + \xAA\x55 |0 + \xAA\x56 |0 + \xAA\x57 |0 + \xAA\x58 |0 + \xE2\xA5 |0 + \xAA\x59 |0 + \xAA\x5A |0 + \xAA\x5B |0 + \xC1\xD4 |0 + \xAA\x5C |0 + \xAA\x5D |0 + \xAA\x5E |0 + \xAA\x5F |0 + \xE2\xA3 |0 + \xAA\x60 |0 + \xE2\xA8 |0 + \xB2\xFE |0 + \xE2\xA2 |0 + \xAA\x61 |0 + \xAA\x62 |0 + \xAA\x63 |0 + \xC3\xCD |0 + \xB2\xC2 |0 + \xE2\xA7 |0 + \xE2\xA6 |0 + \xAA\x64 |0 + \xAA\x65 |0 + \xE2\xA4 |0 + \xE2\xA9 |0 + \xAA\x66 |0 + \xAA\x67 |0 + \xE2\xAB |0 + \xAA\x68 |0 + \xAA\x69 |0 + \xAA\x6A |0 + \xD0\xC9 |0 + \xD6\xED |0 + \xC3\xA8 |0 + \xE2\xAC |0 + \xAA\x6B |0 + \xCF\xD7 |0 + \xAA\x6C |0 + \xAA\x6D |0 + \xE2\xAE |0 + \xAA\x6E |0 + \xAA\x6F |0 + \xBA\xEF |0 + \xAA\x70 |0 + \xAA\x71 |0 + \xE9\xE0 |0 + \xE2\xAD |0 + \xE2\xAA |0 + \xAA\x72 |0 + \xAA\x73 |0 + \xAA\x74 |0 + \xAA\x75 |0 + \xBB\xAB |0 + \xD4\xB3 |0 + \xAA\x76 |0 + \xAA\x77 |0 + \xAA\x78 |0 + \xAA\x79 |0 + \xAA\x7A |0 + \xAA\x7B |0 + \xAA\x7C |0 + \xAA\x7D |0 + \xAA\x7E |0 + \xAA\x80 |0 + \xAA\x81 |0 + \xAA\x82 |0 + \xAA\x83 |0 + \xE2\xB0 |0 + \xAA\x84 |0 + \xAA\x85 |0 + \xE2\xAF |0 + \xAA\x86 |0 + \xE9\xE1 |0 + \xAA\x87 |0 + \xAA\x88 |0 + \xAA\x89 |0 + \xAA\x8A |0 + \xE2\xB1 |0 + \xAA\x8B |0 + \xAA\x8C |0 + \xAA\x8D |0 + \xAA\x8E |0 + \xAA\x8F |0 + \xAA\x90 |0 + \xAA\x91 |0 + \xAA\x92 |0 + \xE2\xB2 |0 + \xAA\x93 |0 + \xAA\x94 |0 + \xAA\x95 |0 + \xAA\x96 |0 + \xAA\x97 |0 + \xAA\x98 |0 + \xAA\x99 |0 + \xAA\x9A |0 + \xAA\x9B |0 + \xAA\x9C |0 + \xAA\x9D |0 + \xE2\xB3 |0 + \xCC\xA1 |0 + \xAA\x9E |0 + \xE2\xB4 |0 + \xAA\x9F |0 + \xAA\xA0 |0 + \xAB\x40 |0 + \xAB\x41 |0 + \xAB\x42 |0 + \xAB\x43 |0 + \xAB\x44 |0 + \xAB\x45 |0 + \xAB\x46 |0 + \xAB\x47 |0 + \xAB\x48 |0 + \xAB\x49 |0 + \xAB\x4A |0 + \xAB\x4B |0 + \xE2\xB5 |0 + \xAB\x4C |0 + \xAB\x4D |0 + \xAB\x4E |0 + \xAB\x4F |0 + \xAB\x50 |0 + \xD0\xFE |0 + \xAB\x51 |0 + \xAB\x52 |0 + \xC2\xCA |0 + \xAB\x53 |0 + \xD3\xF1 |0 + \xAB\x54 |0 + \xCD\xF5 |0 + \xAB\x55 |0 + \xAB\x56 |0 + \xE7\xE0 |0 + \xAB\x57 |0 + \xAB\x58 |0 + \xE7\xE1 |0 + \xAB\x59 |0 + \xAB\x5A |0 + \xAB\x5B |0 + \xAB\x5C |0 + \xBE\xC1 |0 + \xAB\x5D |0 + \xAB\x5E |0 + \xAB\x5F |0 + \xAB\x60 |0 + \xC2\xEA |0 + \xAB\x61 |0 + \xAB\x62 |0 + \xAB\x63 |0 + \xE7\xE4 |0 + \xAB\x64 |0 + \xAB\x65 |0 + \xE7\xE3 |0 + \xAB\x66 |0 + \xAB\x67 |0 + \xAB\x68 |0 + \xAB\x69 |0 + \xAB\x6A |0 + \xAB\x6B |0 + \xCD\xE6 |0 + \xAB\x6C |0 + \xC3\xB5 |0 + \xAB\x6D |0 + \xAB\x6E |0 + \xE7\xE2 |0 + \xBB\xB7 |0 + \xCF\xD6 |0 + \xAB\x6F |0 + \xC1\xE1 |0 + \xE7\xE9 |0 + \xAB\x70 |0 + \xAB\x71 |0 + \xAB\x72 |0 + \xE7\xE8 |0 + \xAB\x73 |0 + \xAB\x74 |0 + \xE7\xF4 |0 + \xB2\xA3 |0 + \xAB\x75 |0 + \xAB\x76 |0 + \xAB\x77 |0 + \xAB\x78 |0 + \xE7\xEA |0 + \xAB\x79 |0 + \xE7\xE6 |0 + \xAB\x7A |0 + \xAB\x7B |0 + \xAB\x7C |0 + \xAB\x7D |0 + \xAB\x7E |0 + \xE7\xEC |0 + \xE7\xEB |0 + \xC9\xBA |0 + \xAB\x80 |0 + \xAB\x81 |0 + \xD5\xE4 |0 + \xAB\x82 |0 + \xE7\xE5 |0 + \xB7\xA9 |0 + \xE7\xE7 |0 + \xAB\x83 |0 + \xAB\x84 |0 + \xAB\x85 |0 + \xAB\x86 |0 + \xAB\x87 |0 + \xAB\x88 |0 + \xAB\x89 |0 + \xE7\xEE |0 + \xAB\x8A |0 + \xAB\x8B |0 + \xAB\x8C |0 + \xAB\x8D |0 + \xE7\xF3 |0 + \xAB\x8E |0 + \xD6\xE9 |0 + \xAB\x8F |0 + \xAB\x90 |0 + \xAB\x91 |0 + \xAB\x92 |0 + \xE7\xED |0 + \xAB\x93 |0 + \xE7\xF2 |0 + \xAB\x94 |0 + \xE7\xF1 |0 + \xAB\x95 |0 + \xAB\x96 |0 + \xAB\x97 |0 + \xB0\xE0 |0 + \xAB\x98 |0 + \xAB\x99 |0 + \xAB\x9A |0 + \xAB\x9B |0 + \xE7\xF5 |0 + \xAB\x9C |0 + \xAB\x9D |0 + \xAB\x9E |0 + \xAB\x9F |0 + \xAB\xA0 |0 + \xAC\x40 |0 + \xAC\x41 |0 + \xAC\x42 |0 + \xAC\x43 |0 + \xAC\x44 |0 + \xAC\x45 |0 + \xAC\x46 |0 + \xAC\x47 |0 + \xAC\x48 |0 + \xAC\x49 |0 + \xAC\x4A |0 + \xC7\xF2 |0 + \xAC\x4B |0 + \xC0\xC5 |0 + \xC0\xED |0 + \xAC\x4C |0 + \xAC\x4D |0 + \xC1\xF0 |0 + \xE7\xF0 |0 + \xAC\x4E |0 + \xAC\x4F |0 + \xAC\x50 |0 + \xAC\x51 |0 + \xE7\xF6 |0 + \xCB\xF6 |0 + \xAC\x52 |0 + \xAC\x53 |0 + \xAC\x54 |0 + \xAC\x55 |0 + \xAC\x56 |0 + \xAC\x57 |0 + \xAC\x58 |0 + \xAC\x59 |0 + \xAC\x5A |0 + \xE8\xA2 |0 + \xE8\xA1 |0 + \xAC\x5B |0 + \xAC\x5C |0 + \xAC\x5D |0 + \xAC\x5E |0 + \xAC\x5F |0 + \xAC\x60 |0 + \xD7\xC1 |0 + \xAC\x61 |0 + \xAC\x62 |0 + \xE7\xFA |0 + \xE7\xF9 |0 + \xAC\x63 |0 + \xE7\xFB |0 + \xAC\x64 |0 + \xE7\xF7 |0 + \xAC\x65 |0 + \xE7\xFE |0 + \xAC\x66 |0 + \xE7\xFD |0 + \xAC\x67 |0 + \xE7\xFC |0 + \xAC\x68 |0 + \xAC\x69 |0 + \xC1\xD5 |0 + \xC7\xD9 |0 + \xC5\xFD |0 + \xC5\xC3 |0 + \xAC\x6A |0 + \xAC\x6B |0 + \xAC\x6C |0 + \xAC\x6D |0 + \xAC\x6E |0 + \xC7\xED |0 + \xAC\x6F |0 + \xAC\x70 |0 + \xAC\x71 |0 + \xAC\x72 |0 + \xE8\xA3 |0 + \xAC\x73 |0 + \xAC\x74 |0 + \xAC\x75 |0 + \xAC\x76 |0 + \xAC\x77 |0 + \xAC\x78 |0 + \xAC\x79 |0 + \xAC\x7A |0 + \xAC\x7B |0 + \xAC\x7C |0 + \xAC\x7D |0 + \xAC\x7E |0 + \xAC\x80 |0 + \xAC\x81 |0 + \xAC\x82 |0 + \xAC\x83 |0 + \xAC\x84 |0 + \xAC\x85 |0 + \xAC\x86 |0 + \xE8\xA6 |0 + \xAC\x87 |0 + \xE8\xA5 |0 + \xAC\x88 |0 + \xE8\xA7 |0 + \xBA\xF7 |0 + \xE7\xF8 |0 + \xE8\xA4 |0 + \xAC\x89 |0 + \xC8\xF0 |0 + \xC9\xAA |0 + \xAC\x8A |0 + \xAC\x8B |0 + \xAC\x8C |0 + \xAC\x8D |0 + \xAC\x8E |0 + \xAC\x8F |0 + \xAC\x90 |0 + \xAC\x91 |0 + \xAC\x92 |0 + \xAC\x93 |0 + \xAC\x94 |0 + \xAC\x95 |0 + \xAC\x96 |0 + \xE8\xA9 |0 + \xAC\x97 |0 + \xAC\x98 |0 + \xB9\xE5 |0 + \xAC\x99 |0 + \xAC\x9A |0 + \xAC\x9B |0 + \xAC\x9C |0 + \xAC\x9D |0 + \xD1\xFE |0 + \xE8\xA8 |0 + \xAC\x9E |0 + \xAC\x9F |0 + \xAC\xA0 |0 + \xAD\x40 |0 + \xAD\x41 |0 + \xAD\x42 |0 + \xE8\xAA |0 + \xAD\x43 |0 + \xE8\xAD |0 + \xE8\xAE |0 + \xAD\x44 |0 + \xC1\xA7 |0 + \xAD\x45 |0 + \xAD\x46 |0 + \xAD\x47 |0 + \xE8\xAF |0 + \xAD\x48 |0 + \xAD\x49 |0 + \xAD\x4A |0 + \xE8\xB0 |0 + \xAD\x4B |0 + \xAD\x4C |0 + \xE8\xAC |0 + \xAD\x4D |0 + \xE8\xB4 |0 + \xAD\x4E |0 + \xAD\x4F |0 + \xAD\x50 |0 + \xAD\x51 |0 + \xAD\x52 |0 + \xAD\x53 |0 + \xAD\x54 |0 + \xAD\x55 |0 + \xAD\x56 |0 + \xAD\x57 |0 + \xAD\x58 |0 + \xE8\xAB |0 + \xAD\x59 |0 + \xE8\xB1 |0 + \xAD\x5A |0 + \xAD\x5B |0 + \xAD\x5C |0 + \xAD\x5D |0 + \xAD\x5E |0 + \xAD\x5F |0 + \xAD\x60 |0 + \xAD\x61 |0 + \xE8\xB5 |0 + \xE8\xB2 |0 + \xE8\xB3 |0 + \xAD\x62 |0 + \xAD\x63 |0 + \xAD\x64 |0 + \xAD\x65 |0 + \xAD\x66 |0 + \xAD\x67 |0 + \xAD\x68 |0 + \xAD\x69 |0 + \xAD\x6A |0 + \xAD\x6B |0 + \xAD\x6C |0 + \xAD\x6D |0 + \xAD\x6E |0 + \xAD\x6F |0 + \xAD\x70 |0 + \xAD\x71 |0 + \xE8\xB7 |0 + \xAD\x72 |0 + \xAD\x73 |0 + \xAD\x74 |0 + \xAD\x75 |0 + \xAD\x76 |0 + \xAD\x77 |0 + \xAD\x78 |0 + \xAD\x79 |0 + \xAD\x7A |0 + \xAD\x7B |0 + \xAD\x7C |0 + \xAD\x7D |0 + \xAD\x7E |0 + \xAD\x80 |0 + \xAD\x81 |0 + \xAD\x82 |0 + \xAD\x83 |0 + \xAD\x84 |0 + \xAD\x85 |0 + \xAD\x86 |0 + \xAD\x87 |0 + \xAD\x88 |0 + \xAD\x89 |0 + \xE8\xB6 |0 + \xAD\x8A |0 + \xAD\x8B |0 + \xAD\x8C |0 + \xAD\x8D |0 + \xAD\x8E |0 + \xAD\x8F |0 + \xAD\x90 |0 + \xAD\x91 |0 + \xAD\x92 |0 + \xB9\xCF |0 + \xAD\x93 |0 + \xF0\xAC |0 + \xAD\x94 |0 + \xF0\xAD |0 + \xAD\x95 |0 + \xC6\xB0 |0 + \xB0\xEA |0 + \xC8\xBF |0 + \xAD\x96 |0 + \xCD\xDF |0 + \xAD\x97 |0 + \xAD\x98 |0 + \xAD\x99 |0 + \xAD\x9A |0 + \xAD\x9B |0 + \xAD\x9C |0 + \xAD\x9D |0 + \xCE\xCD |0 + \xEA\xB1 |0 + \xAD\x9E |0 + \xAD\x9F |0 + \xAD\xA0 |0 + \xAE\x40 |0 + \xEA\xB2 |0 + \xAE\x41 |0 + \xC6\xBF |0 + \xB4\xC9 |0 + \xAE\x42 |0 + \xAE\x43 |0 + \xAE\x44 |0 + \xAE\x45 |0 + \xAE\x46 |0 + \xAE\x47 |0 + \xAE\x48 |0 + \xEA\xB3 |0 + \xAE\x49 |0 + \xAE\x4A |0 + \xAE\x4B |0 + \xAE\x4C |0 + \xD5\xE7 |0 + \xAE\x4D |0 + \xAE\x4E |0 + \xAE\x4F |0 + \xAE\x50 |0 + \xAE\x51 |0 + \xAE\x52 |0 + \xAE\x53 |0 + \xAE\x54 |0 + \xDD\xF9 |0 + \xAE\x55 |0 + \xEA\xB4 |0 + \xAE\x56 |0 + \xEA\xB5 |0 + \xAE\x57 |0 + \xEA\xB6 |0 + \xAE\x58 |0 + \xAE\x59 |0 + \xAE\x5A |0 + \xAE\x5B |0 + \xB8\xCA |0 + \xDF\xB0 |0 + \xC9\xF5 |0 + \xAE\x5C |0 + \xCC\xF0 |0 + \xAE\x5D |0 + \xAE\x5E |0 + \xC9\xFA |0 + \xAE\x5F |0 + \xAE\x60 |0 + \xAE\x61 |0 + \xAE\x62 |0 + \xAE\x63 |0 + \xC9\xFB |0 + \xAE\x64 |0 + \xAE\x65 |0 + \xD3\xC3 |0 + \xCB\xA6 |0 + \xAE\x66 |0 + \xB8\xA6 |0 + \xF0\xAE |0 + \xB1\xC2 |0 + \xAE\x67 |0 + \xE5\xB8 |0 + \xCC\xEF |0 + \xD3\xC9 |0 + \xBC\xD7 |0 + \xC9\xEA |0 + \xAE\x68 |0 + \xB5\xE7 |0 + \xAE\x69 |0 + \xC4\xD0 |0 + \xB5\xE9 |0 + \xAE\x6A |0 + \xEE\xAE |0 + \xBB\xAD |0 + \xAE\x6B |0 + \xAE\x6C |0 + \xE7\xDE |0 + \xAE\x6D |0 + \xEE\xAF |0 + \xAE\x6E |0 + \xAE\x6F |0 + \xAE\x70 |0 + \xAE\x71 |0 + \xB3\xA9 |0 + \xAE\x72 |0 + \xAE\x73 |0 + \xEE\xB2 |0 + \xAE\x74 |0 + \xAE\x75 |0 + \xEE\xB1 |0 + \xBD\xE7 |0 + \xAE\x76 |0 + \xEE\xB0 |0 + \xCE\xB7 |0 + \xAE\x77 |0 + \xAE\x78 |0 + \xAE\x79 |0 + \xAE\x7A |0 + \xC5\xCF |0 + \xAE\x7B |0 + \xAE\x7C |0 + \xAE\x7D |0 + \xAE\x7E |0 + \xC1\xF4 |0 + \xDB\xCE |0 + \xEE\xB3 |0 + \xD0\xF3 |0 + \xAE\x80 |0 + \xAE\x81 |0 + \xAE\x82 |0 + \xAE\x83 |0 + \xAE\x84 |0 + \xAE\x85 |0 + \xAE\x86 |0 + \xAE\x87 |0 + \xC2\xD4 |0 + \xC6\xE8 |0 + \xAE\x88 |0 + \xAE\x89 |0 + \xAE\x8A |0 + \xB7\xAC |0 + \xAE\x8B |0 + \xAE\x8C |0 + \xAE\x8D |0 + \xAE\x8E |0 + \xAE\x8F |0 + \xAE\x90 |0 + \xAE\x91 |0 + \xEE\xB4 |0 + \xAE\x92 |0 + \xB3\xEB |0 + \xAE\x93 |0 + \xAE\x94 |0 + \xAE\x95 |0 + \xBB\xFB |0 + \xEE\xB5 |0 + \xAE\x96 |0 + \xAE\x97 |0 + \xAE\x98 |0 + \xAE\x99 |0 + \xAE\x9A |0 + \xE7\xDC |0 + \xAE\x9B |0 + \xAE\x9C |0 + \xAE\x9D |0 + \xEE\xB6 |0 + \xAE\x9E |0 + \xAE\x9F |0 + \xBD\xAE |0 + \xAE\xA0 |0 + \xAF\x40 |0 + \xAF\x41 |0 + \xAF\x42 |0 + \xF1\xE2 |0 + \xAF\x43 |0 + \xAF\x44 |0 + \xAF\x45 |0 + \xCA\xE8 |0 + \xAF\x46 |0 + \xD2\xC9 |0 + \xF0\xDA |0 + \xAF\x47 |0 + \xF0\xDB |0 + \xAF\x48 |0 + \xF0\xDC |0 + \xC1\xC6 |0 + \xAF\x49 |0 + \xB8\xED |0 + \xBE\xCE |0 + \xAF\x4A |0 + \xAF\x4B |0 + \xF0\xDE |0 + \xAF\x4C |0 + \xC5\xB1 |0 + \xF0\xDD |0 + \xD1\xF1 |0 + \xAF\x4D |0 + \xF0\xE0 |0 + \xB0\xCC |0 + \xBD\xEA |0 + \xAF\x4E |0 + \xAF\x4F |0 + \xAF\x50 |0 + \xAF\x51 |0 + \xAF\x52 |0 + \xD2\xDF |0 + \xF0\xDF |0 + \xAF\x53 |0 + \xB4\xAF |0 + \xB7\xE8 |0 + \xF0\xE6 |0 + \xF0\xE5 |0 + \xC6\xA3 |0 + \xF0\xE1 |0 + \xF0\xE2 |0 + \xB4\xC3 |0 + \xAF\x54 |0 + \xAF\x55 |0 + \xF0\xE3 |0 + \xD5\xEE |0 + \xAF\x56 |0 + \xAF\x57 |0 + \xCC\xDB |0 + \xBE\xD2 |0 + \xBC\xB2 |0 + \xAF\x58 |0 + \xAF\x59 |0 + \xAF\x5A |0 + \xF0\xE8 |0 + \xF0\xE7 |0 + \xF0\xE4 |0 + \xB2\xA1 |0 + \xAF\x5B |0 + \xD6\xA2 |0 + \xD3\xB8 |0 + \xBE\xB7 |0 + \xC8\xAC |0 + \xAF\x5C |0 + \xAF\x5D |0 + \xF0\xEA |0 + \xAF\x5E |0 + \xAF\x5F |0 + \xAF\x60 |0 + \xAF\x61 |0 + \xD1\xF7 |0 + \xAF\x62 |0 + \xD6\xCC |0 + \xBA\xDB |0 + \xF0\xE9 |0 + \xAF\x63 |0 + \xB6\xBB |0 + \xAF\x64 |0 + \xAF\x65 |0 + \xCD\xB4 |0 + \xAF\x66 |0 + \xAF\x67 |0 + \xC6\xA6 |0 + \xAF\x68 |0 + \xAF\x69 |0 + \xAF\x6A |0 + \xC1\xA1 |0 + \xF0\xEB |0 + \xF0\xEE |0 + \xAF\x6B |0 + \xF0\xED |0 + \xF0\xF0 |0 + \xF0\xEC |0 + \xAF\x6C |0 + \xBB\xBE |0 + \xF0\xEF |0 + \xAF\x6D |0 + \xAF\x6E |0 + \xAF\x6F |0 + \xAF\x70 |0 + \xCC\xB5 |0 + \xF0\xF2 |0 + \xAF\x71 |0 + \xAF\x72 |0 + \xB3\xD5 |0 + \xAF\x73 |0 + \xAF\x74 |0 + \xAF\x75 |0 + \xAF\x76 |0 + \xB1\xD4 |0 + \xAF\x77 |0 + \xAF\x78 |0 + \xF0\xF3 |0 + \xAF\x79 |0 + \xAF\x7A |0 + \xF0\xF4 |0 + \xF0\xF6 |0 + \xB4\xE1 |0 + \xAF\x7B |0 + \xF0\xF1 |0 + \xAF\x7C |0 + \xF0\xF7 |0 + \xAF\x7D |0 + \xAF\x7E |0 + \xAF\x80 |0 + \xAF\x81 |0 + \xF0\xFA |0 + \xAF\x82 |0 + \xF0\xF8 |0 + \xAF\x83 |0 + \xAF\x84 |0 + \xAF\x85 |0 + \xF0\xF5 |0 + \xAF\x86 |0 + \xAF\x87 |0 + \xAF\x88 |0 + \xAF\x89 |0 + \xF0\xFD |0 + \xAF\x8A |0 + \xF0\xF9 |0 + \xF0\xFC |0 + \xF0\xFE |0 + \xAF\x8B |0 + \xF1\xA1 |0 + \xAF\x8C |0 + \xAF\x8D |0 + \xAF\x8E |0 + \xCE\xC1 |0 + \xF1\xA4 |0 + \xAF\x8F |0 + \xF1\xA3 |0 + \xAF\x90 |0 + \xC1\xF6 |0 + \xF0\xFB |0 + \xCA\xDD |0 + \xAF\x91 |0 + \xAF\x92 |0 + \xB4\xF1 |0 + \xB1\xF1 |0 + \xCC\xB1 |0 + \xAF\x93 |0 + \xF1\xA6 |0 + \xAF\x94 |0 + \xAF\x95 |0 + \xF1\xA7 |0 + \xAF\x96 |0 + \xAF\x97 |0 + \xF1\xAC |0 + \xD5\xCE |0 + \xF1\xA9 |0 + \xAF\x98 |0 + \xAF\x99 |0 + \xC8\xB3 |0 + \xAF\x9A |0 + \xAF\x9B |0 + \xAF\x9C |0 + \xF1\xA2 |0 + \xAF\x9D |0 + \xF1\xAB |0 + \xF1\xA8 |0 + \xF1\xA5 |0 + \xAF\x9E |0 + \xAF\x9F |0 + \xF1\xAA |0 + \xAF\xA0 |0 + \xB0\x40 |0 + \xB0\x41 |0 + \xB0\x42 |0 + \xB0\x43 |0 + \xB0\x44 |0 + \xB0\x45 |0 + \xB0\x46 |0 + \xB0\xA9 |0 + \xF1\xAD |0 + \xB0\x47 |0 + \xB0\x48 |0 + \xB0\x49 |0 + \xB0\x4A |0 + \xB0\x4B |0 + \xB0\x4C |0 + \xF1\xAF |0 + \xB0\x4D |0 + \xF1\xB1 |0 + \xB0\x4E |0 + \xB0\x4F |0 + \xB0\x50 |0 + \xB0\x51 |0 + \xB0\x52 |0 + \xF1\xB0 |0 + \xB0\x53 |0 + \xF1\xAE |0 + \xB0\x54 |0 + \xB0\x55 |0 + \xB0\x56 |0 + \xB0\x57 |0 + \xD1\xA2 |0 + \xB0\x58 |0 + \xB0\x59 |0 + \xB0\x5A |0 + \xB0\x5B |0 + \xB0\x5C |0 + \xB0\x5D |0 + \xB0\x5E |0 + \xF1\xB2 |0 + \xB0\x5F |0 + \xB0\x60 |0 + \xB0\x61 |0 + \xF1\xB3 |0 + \xB0\x62 |0 + \xB0\x63 |0 + \xB0\x64 |0 + \xB0\x65 |0 + \xB0\x66 |0 + \xB0\x67 |0 + \xB0\x68 |0 + \xB0\x69 |0 + \xB9\xEF |0 + \xB0\x6A |0 + \xB0\x6B |0 + \xB5\xC7 |0 + \xB0\x6C |0 + \xB0\xD7 |0 + \xB0\xD9 |0 + \xB0\x6D |0 + \xB0\x6E |0 + \xB0\x6F |0 + \xD4\xED |0 + \xB0\x70 |0 + \xB5\xC4 |0 + \xB0\x71 |0 + \xBD\xD4 |0 + \xBB\xCA |0 + \xF0\xA7 |0 + \xB0\x72 |0 + \xB0\x73 |0 + \xB8\xDE |0 + \xB0\x74 |0 + \xB0\x75 |0 + \xF0\xA8 |0 + \xB0\x76 |0 + \xB0\x77 |0 + \xB0\xA8 |0 + \xB0\x78 |0 + \xF0\xA9 |0 + \xB0\x79 |0 + \xB0\x7A |0 + \xCD\xEE |0 + \xB0\x7B |0 + \xB0\x7C |0 + \xF0\xAA |0 + \xB0\x7D |0 + \xB0\x7E |0 + \xB0\x80 |0 + \xB0\x81 |0 + \xB0\x82 |0 + \xB0\x83 |0 + \xB0\x84 |0 + \xB0\x85 |0 + \xB0\x86 |0 + \xB0\x87 |0 + \xF0\xAB |0 + \xB0\x88 |0 + \xB0\x89 |0 + \xB0\x8A |0 + \xB0\x8B |0 + \xB0\x8C |0 + \xB0\x8D |0 + \xB0\x8E |0 + \xB0\x8F |0 + \xB0\x90 |0 + \xC6\xA4 |0 + \xB0\x91 |0 + \xB0\x92 |0 + \xD6\xE5 |0 + \xF1\xE4 |0 + \xB0\x93 |0 + \xF1\xE5 |0 + \xB0\x94 |0 + \xB0\x95 |0 + \xB0\x96 |0 + \xB0\x97 |0 + \xB0\x98 |0 + \xB0\x99 |0 + \xB0\x9A |0 + \xB0\x9B |0 + \xB0\x9C |0 + \xB0\x9D |0 + \xC3\xF3 |0 + \xB0\x9E |0 + \xB0\x9F |0 + \xD3\xDB |0 + \xB0\xA0 |0 + \xB1\x40 |0 + \xD6\xD1 |0 + \xC5\xE8 |0 + \xB1\x41 |0 + \xD3\xAF |0 + \xB1\x42 |0 + \xD2\xE6 |0 + \xB1\x43 |0 + \xB1\x44 |0 + \xEE\xC1 |0 + \xB0\xBB |0 + \xD5\xB5 |0 + \xD1\xCE |0 + \xBC\xE0 |0 + \xBA\xD0 |0 + \xB1\x45 |0 + \xBF\xF8 |0 + \xB1\x46 |0 + \xB8\xC7 |0 + \xB5\xC1 |0 + \xC5\xCC |0 + \xB1\x47 |0 + \xB1\x48 |0 + \xCA\xA2 |0 + \xB1\x49 |0 + \xB1\x4A |0 + \xB1\x4B |0 + \xC3\xCB |0 + \xB1\x4C |0 + \xB1\x4D |0 + \xB1\x4E |0 + \xB1\x4F |0 + \xB1\x50 |0 + \xEE\xC2 |0 + \xB1\x51 |0 + \xB1\x52 |0 + \xB1\x53 |0 + \xB1\x54 |0 + \xB1\x55 |0 + \xB1\x56 |0 + \xB1\x57 |0 + \xB1\x58 |0 + \xC4\xBF |0 + \xB6\xA2 |0 + \xB1\x59 |0 + \xED\xEC |0 + \xC3\xA4 |0 + \xB1\x5A |0 + \xD6\xB1 |0 + \xB1\x5B |0 + \xB1\x5C |0 + \xB1\x5D |0 + \xCF\xE0 |0 + \xED\xEF |0 + \xB1\x5E |0 + \xB1\x5F |0 + \xC5\xCE |0 + \xB1\x60 |0 + \xB6\xDC |0 + \xB1\x61 |0 + \xB1\x62 |0 + \xCA\xA1 |0 + \xB1\x63 |0 + \xB1\x64 |0 + \xED\xED |0 + \xB1\x65 |0 + \xB1\x66 |0 + \xED\xF0 |0 + \xED\xF1 |0 + \xC3\xBC |0 + \xB1\x67 |0 + \xBF\xB4 |0 + \xB1\x68 |0 + \xED\xEE |0 + \xB1\x69 |0 + \xB1\x6A |0 + \xB1\x6B |0 + \xB1\x6C |0 + \xB1\x6D |0 + \xB1\x6E |0 + \xB1\x6F |0 + \xB1\x70 |0 + \xB1\x71 |0 + \xB1\x72 |0 + \xB1\x73 |0 + \xED\xF4 |0 + \xED\xF2 |0 + \xB1\x74 |0 + \xB1\x75 |0 + \xB1\x76 |0 + \xB1\x77 |0 + \xD5\xE6 |0 + \xC3\xDF |0 + \xB1\x78 |0 + \xED\xF3 |0 + \xB1\x79 |0 + \xB1\x7A |0 + \xB1\x7B |0 + \xED\xF6 |0 + \xB1\x7C |0 + \xD5\xA3 |0 + \xD1\xA3 |0 + \xB1\x7D |0 + \xB1\x7E |0 + \xB1\x80 |0 + \xED\xF5 |0 + \xB1\x81 |0 + \xC3\xD0 |0 + \xB1\x82 |0 + \xB1\x83 |0 + \xB1\x84 |0 + \xB1\x85 |0 + \xB1\x86 |0 + \xED\xF7 |0 + \xBF\xF4 |0 + \xBE\xEC |0 + \xED\xF8 |0 + \xB1\x87 |0 + \xCC\xF7 |0 + \xB1\x88 |0 + \xD1\xDB |0 + \xB1\x89 |0 + \xB1\x8A |0 + \xB1\x8B |0 + \xD7\xC5 |0 + \xD5\xF6 |0 + \xB1\x8C |0 + \xED\xFC |0 + \xB1\x8D |0 + \xB1\x8E |0 + \xB1\x8F |0 + \xED\xFB |0 + \xB1\x90 |0 + \xB1\x91 |0 + \xB1\x92 |0 + \xB1\x93 |0 + \xB1\x94 |0 + \xB1\x95 |0 + \xB1\x96 |0 + \xB1\x97 |0 + \xED\xF9 |0 + \xED\xFA |0 + \xB1\x98 |0 + \xB1\x99 |0 + \xB1\x9A |0 + \xB1\x9B |0 + \xB1\x9C |0 + \xB1\x9D |0 + \xB1\x9E |0 + \xB1\x9F |0 + \xED\xFD |0 + \xBE\xA6 |0 + \xB1\xA0 |0 + \xB2\x40 |0 + \xB2\x41 |0 + \xB2\x42 |0 + \xB2\x43 |0 + \xCB\xAF |0 + \xEE\xA1 |0 + \xB6\xBD |0 + \xB2\x44 |0 + \xEE\xA2 |0 + \xC4\xC0 |0 + \xB2\x45 |0 + \xED\xFE |0 + \xB2\x46 |0 + \xB2\x47 |0 + \xBD\xDE |0 + \xB2\xC7 |0 + \xB2\x48 |0 + \xB2\x49 |0 + \xB2\x4A |0 + \xB2\x4B |0 + \xB2\x4C |0 + \xB2\x4D |0 + \xB2\x4E |0 + \xB2\x4F |0 + \xB2\x50 |0 + \xB2\x51 |0 + \xB2\x52 |0 + \xB2\x53 |0 + \xB6\xC3 |0 + \xB2\x54 |0 + \xB2\x55 |0 + \xB2\x56 |0 + \xEE\xA5 |0 + \xD8\xBA |0 + \xEE\xA3 |0 + \xEE\xA6 |0 + \xB2\x57 |0 + \xB2\x58 |0 + \xB2\x59 |0 + \xC3\xE9 |0 + \xB3\xF2 |0 + \xB2\x5A |0 + \xB2\x5B |0 + \xB2\x5C |0 + \xB2\x5D |0 + \xB2\x5E |0 + \xB2\x5F |0 + \xEE\xA7 |0 + \xEE\xA4 |0 + \xCF\xB9 |0 + \xB2\x60 |0 + \xB2\x61 |0 + \xEE\xA8 |0 + \xC2\xF7 |0 + \xB2\x62 |0 + \xB2\x63 |0 + \xB2\x64 |0 + \xB2\x65 |0 + \xB2\x66 |0 + \xB2\x67 |0 + \xB2\x68 |0 + \xB2\x69 |0 + \xB2\x6A |0 + \xB2\x6B |0 + \xB2\x6C |0 + \xB2\x6D |0 + \xEE\xA9 |0 + \xEE\xAA |0 + \xB2\x6E |0 + \xDE\xAB |0 + \xB2\x6F |0 + \xB2\x70 |0 + \xC6\xB3 |0 + \xB2\x71 |0 + \xC7\xC6 |0 + \xB2\x72 |0 + \xD6\xF5 |0 + \xB5\xC9 |0 + \xB2\x73 |0 + \xCB\xB2 |0 + \xB2\x74 |0 + \xB2\x75 |0 + \xB2\x76 |0 + \xEE\xAB |0 + \xB2\x77 |0 + \xB2\x78 |0 + \xCD\xAB |0 + \xB2\x79 |0 + \xEE\xAC |0 + \xB2\x7A |0 + \xB2\x7B |0 + \xB2\x7C |0 + \xB2\x7D |0 + \xB2\x7E |0 + \xD5\xB0 |0 + \xB2\x80 |0 + \xEE\xAD |0 + \xB2\x81 |0 + \xF6\xC4 |0 + \xB2\x82 |0 + \xB2\x83 |0 + \xB2\x84 |0 + \xB2\x85 |0 + \xB2\x86 |0 + \xB2\x87 |0 + \xB2\x88 |0 + \xB2\x89 |0 + \xB2\x8A |0 + \xB2\x8B |0 + \xB2\x8C |0 + \xB2\x8D |0 + \xB2\x8E |0 + \xDB\xC7 |0 + \xB2\x8F |0 + \xB2\x90 |0 + \xB2\x91 |0 + \xB2\x92 |0 + \xB2\x93 |0 + \xB2\x94 |0 + \xB2\x95 |0 + \xB2\x96 |0 + \xB2\x97 |0 + \xB4\xA3 |0 + \xB2\x98 |0 + \xB2\x99 |0 + \xB2\x9A |0 + \xC3\xAC |0 + \xF1\xE6 |0 + \xB2\x9B |0 + \xB2\x9C |0 + \xB2\x9D |0 + \xB2\x9E |0 + \xB2\x9F |0 + \xCA\xB8 |0 + \xD2\xD3 |0 + \xB2\xA0 |0 + \xD6\xAA |0 + \xB3\x40 |0 + \xEF\xF2 |0 + \xB3\x41 |0 + \xBE\xD8 |0 + \xB3\x42 |0 + \xBD\xC3 |0 + \xEF\xF3 |0 + \xB6\xCC |0 + \xB0\xAB |0 + \xB3\x43 |0 + \xB3\x44 |0 + \xB3\x45 |0 + \xB3\x46 |0 + \xCA\xAF |0 + \xB3\x47 |0 + \xB3\x48 |0 + \xED\xB6 |0 + \xB3\x49 |0 + \xED\xB7 |0 + \xB3\x4A |0 + \xB3\x4B |0 + \xB3\x4C |0 + \xB3\x4D |0 + \xCE\xF9 |0 + \xB7\xAF |0 + \xBF\xF3 |0 + \xED\xB8 |0 + \xC2\xEB |0 + \xC9\xB0 |0 + \xB3\x4E |0 + \xB3\x4F |0 + \xB3\x50 |0 + \xB3\x51 |0 + \xB3\x52 |0 + \xB3\x53 |0 + \xED\xB9 |0 + \xB3\x54 |0 + \xB3\x55 |0 + \xC6\xF6 |0 + \xBF\xB3 |0 + \xB3\x56 |0 + \xB3\x57 |0 + \xB3\x58 |0 + \xED\xBC |0 + \xC5\xF8 |0 + \xB3\x59 |0 + \xD1\xD0 |0 + \xB3\x5A |0 + \xD7\xA9 |0 + \xED\xBA |0 + \xED\xBB |0 + \xB3\x5B |0 + \xD1\xE2 |0 + \xB3\x5C |0 + \xED\xBF |0 + \xED\xC0 |0 + \xB3\x5D |0 + \xED\xC4 |0 + \xB3\x5E |0 + \xB3\x5F |0 + \xB3\x60 |0 + \xED\xC8 |0 + \xB3\x61 |0 + \xED\xC6 |0 + \xED\xCE |0 + \xD5\xE8 |0 + \xB3\x62 |0 + \xED\xC9 |0 + \xB3\x63 |0 + \xB3\x64 |0 + \xED\xC7 |0 + \xED\xBE |0 + \xB3\x65 |0 + \xB3\x66 |0 + \xC5\xE9 |0 + \xB3\x67 |0 + \xB3\x68 |0 + \xB3\x69 |0 + \xC6\xC6 |0 + \xB3\x6A |0 + \xB3\x6B |0 + \xC9\xE9 |0 + \xD4\xD2 |0 + \xED\xC1 |0 + \xED\xC2 |0 + \xED\xC3 |0 + \xED\xC5 |0 + \xB3\x6C |0 + \xC0\xF9 |0 + \xB3\x6D |0 + \xB4\xA1 |0 + \xB3\x6E |0 + \xB3\x6F |0 + \xB3\x70 |0 + \xB3\x71 |0 + \xB9\xE8 |0 + \xB3\x72 |0 + \xED\xD0 |0 + \xB3\x73 |0 + \xB3\x74 |0 + \xB3\x75 |0 + \xB3\x76 |0 + \xED\xD1 |0 + \xB3\x77 |0 + \xED\xCA |0 + \xB3\x78 |0 + \xED\xCF |0 + \xB3\x79 |0 + \xCE\xF8 |0 + \xB3\x7A |0 + \xB3\x7B |0 + \xCB\xB6 |0 + \xED\xCC |0 + \xED\xCD |0 + \xB3\x7C |0 + \xB3\x7D |0 + \xB3\x7E |0 + \xB3\x80 |0 + \xB3\x81 |0 + \xCF\xF5 |0 + \xB3\x82 |0 + \xB3\x83 |0 + \xB3\x84 |0 + \xB3\x85 |0 + \xB3\x86 |0 + \xB3\x87 |0 + \xB3\x88 |0 + \xB3\x89 |0 + \xB3\x8A |0 + \xB3\x8B |0 + \xB3\x8C |0 + \xB3\x8D |0 + \xED\xD2 |0 + \xC1\xF2 |0 + \xD3\xB2 |0 + \xED\xCB |0 + \xC8\xB7 |0 + \xB3\x8E |0 + \xB3\x8F |0 + \xB3\x90 |0 + \xB3\x91 |0 + \xB3\x92 |0 + \xB3\x93 |0 + \xB3\x94 |0 + \xB3\x95 |0 + \xBC\xEF |0 + \xB3\x96 |0 + \xB3\x97 |0 + \xB3\x98 |0 + \xB3\x99 |0 + \xC5\xF0 |0 + \xB3\x9A |0 + \xB3\x9B |0 + \xB3\x9C |0 + \xB3\x9D |0 + \xB3\x9E |0 + \xB3\x9F |0 + \xB3\xA0 |0 + \xB4\x40 |0 + \xB4\x41 |0 + \xB4\x42 |0 + \xED\xD6 |0 + \xB4\x43 |0 + \xB5\xEF |0 + \xB4\x44 |0 + \xB4\x45 |0 + \xC2\xB5 |0 + \xB0\xAD |0 + \xCB\xE9 |0 + \xB4\x46 |0 + \xB4\x47 |0 + \xB1\xAE |0 + \xB4\x48 |0 + \xED\xD4 |0 + \xB4\x49 |0 + \xB4\x4A |0 + \xB4\x4B |0 + \xCD\xEB |0 + \xB5\xE2 |0 + \xB4\x4C |0 + \xED\xD5 |0 + \xED\xD3 |0 + \xED\xD7 |0 + \xB4\x4D |0 + \xB4\x4E |0 + \xB5\xFA |0 + \xB4\x4F |0 + \xED\xD8 |0 + \xB4\x50 |0 + \xED\xD9 |0 + \xB4\x51 |0 + \xED\xDC |0 + \xB4\x52 |0 + \xB1\xCC |0 + \xB4\x53 |0 + \xB4\x54 |0 + \xB4\x55 |0 + \xB4\x56 |0 + \xB4\x57 |0 + \xB4\x58 |0 + \xB4\x59 |0 + \xB4\x5A |0 + \xC5\xF6 |0 + \xBC\xEE |0 + \xED\xDA |0 + \xCC\xBC |0 + \xB2\xEA |0 + \xB4\x5B |0 + \xB4\x5C |0 + \xB4\x5D |0 + \xB4\x5E |0 + \xED\xDB |0 + \xB4\x5F |0 + \xB4\x60 |0 + \xB4\x61 |0 + \xB4\x62 |0 + \xC4\xEB |0 + \xB4\x63 |0 + \xB4\x64 |0 + \xB4\xC5 |0 + \xB4\x65 |0 + \xB4\x66 |0 + \xB4\x67 |0 + \xB0\xF5 |0 + \xB4\x68 |0 + \xB4\x69 |0 + \xB4\x6A |0 + \xED\xDF |0 + \xC0\xDA |0 + \xB4\xE8 |0 + \xB4\x6B |0 + \xB4\x6C |0 + \xB4\x6D |0 + \xB4\x6E |0 + \xC5\xCD |0 + \xB4\x6F |0 + \xB4\x70 |0 + \xB4\x71 |0 + \xED\xDD |0 + \xBF\xC4 |0 + \xB4\x72 |0 + \xB4\x73 |0 + \xB4\x74 |0 + \xED\xDE |0 + \xB4\x75 |0 + \xB4\x76 |0 + \xB4\x77 |0 + \xB4\x78 |0 + \xB4\x79 |0 + \xB4\x7A |0 + \xB4\x7B |0 + \xB4\x7C |0 + \xB4\x7D |0 + \xB4\x7E |0 + \xB4\x80 |0 + \xB4\x81 |0 + \xB4\x82 |0 + \xB4\x83 |0 + \xC4\xA5 |0 + \xB4\x84 |0 + \xB4\x85 |0 + \xB4\x86 |0 + \xED\xE0 |0 + \xB4\x87 |0 + \xB4\x88 |0 + \xB4\x89 |0 + \xB4\x8A |0 + \xB4\x8B |0 + \xED\xE1 |0 + \xB4\x8C |0 + \xED\xE3 |0 + \xB4\x8D |0 + \xB4\x8E |0 + \xC1\xD7 |0 + \xB4\x8F |0 + \xB4\x90 |0 + \xBB\xC7 |0 + \xB4\x91 |0 + \xB4\x92 |0 + \xB4\x93 |0 + \xB4\x94 |0 + \xB4\x95 |0 + \xB4\x96 |0 + \xBD\xB8 |0 + \xB4\x97 |0 + \xB4\x98 |0 + \xB4\x99 |0 + \xED\xE2 |0 + \xB4\x9A |0 + \xB4\x9B |0 + \xB4\x9C |0 + \xB4\x9D |0 + \xB4\x9E |0 + \xB4\x9F |0 + \xB4\xA0 |0 + \xB5\x40 |0 + \xB5\x41 |0 + \xB5\x42 |0 + \xB5\x43 |0 + \xB5\x44 |0 + \xB5\x45 |0 + \xED\xE4 |0 + \xB5\x46 |0 + \xB5\x47 |0 + \xB5\x48 |0 + \xB5\x49 |0 + \xB5\x4A |0 + \xB5\x4B |0 + \xB5\x4C |0 + \xB5\x4D |0 + \xB5\x4E |0 + \xB5\x4F |0 + \xED\xE6 |0 + \xB5\x50 |0 + \xB5\x51 |0 + \xB5\x52 |0 + \xB5\x53 |0 + \xB5\x54 |0 + \xED\xE5 |0 + \xB5\x55 |0 + \xB5\x56 |0 + \xB5\x57 |0 + \xB5\x58 |0 + \xB5\x59 |0 + \xB5\x5A |0 + \xB5\x5B |0 + \xB5\x5C |0 + \xB5\x5D |0 + \xB5\x5E |0 + \xB5\x5F |0 + \xB5\x60 |0 + \xB5\x61 |0 + \xB5\x62 |0 + \xB5\x63 |0 + \xED\xE7 |0 + \xB5\x64 |0 + \xB5\x65 |0 + \xB5\x66 |0 + \xB5\x67 |0 + \xB5\x68 |0 + \xCA\xBE |0 + \xEC\xEA |0 + \xC0\xF1 |0 + \xB5\x69 |0 + \xC9\xE7 |0 + \xB5\x6A |0 + \xEC\xEB |0 + \xC6\xEE |0 + \xB5\x6B |0 + \xB5\x6C |0 + \xB5\x6D |0 + \xB5\x6E |0 + \xEC\xEC |0 + \xB5\x6F |0 + \xC6\xED |0 + \xEC\xED |0 + \xB5\x70 |0 + \xB5\x71 |0 + \xB5\x72 |0 + \xB5\x73 |0 + \xB5\x74 |0 + \xB5\x75 |0 + \xB5\x76 |0 + \xB5\x77 |0 + \xB5\x78 |0 + \xEC\xF0 |0 + \xB5\x79 |0 + \xB5\x7A |0 + \xD7\xE6 |0 + \xEC\xF3 |0 + \xB5\x7B |0 + \xB5\x7C |0 + \xEC\xF1 |0 + \xEC\xEE |0 + \xEC\xEF |0 + \xD7\xA3 |0 + \xC9\xF1 |0 + \xCB\xEE |0 + \xEC\xF4 |0 + \xB5\x7D |0 + \xEC\xF2 |0 + \xB5\x7E |0 + \xB5\x80 |0 + \xCF\xE9 |0 + \xB5\x81 |0 + \xEC\xF6 |0 + \xC6\xB1 |0 + \xB5\x82 |0 + \xB5\x83 |0 + \xB5\x84 |0 + \xB5\x85 |0 + \xBC\xC0 |0 + \xB5\x86 |0 + \xEC\xF5 |0 + \xB5\x87 |0 + \xB5\x88 |0 + \xB5\x89 |0 + \xB5\x8A |0 + \xB5\x8B |0 + \xB5\x8C |0 + \xB5\x8D |0 + \xB5\xBB |0 + \xBB\xF6 |0 + \xB5\x8E |0 + \xEC\xF7 |0 + \xB5\x8F |0 + \xB5\x90 |0 + \xB5\x91 |0 + \xB5\x92 |0 + \xB5\x93 |0 + \xD9\xF7 |0 + \xBD\xFB |0 + \xB5\x94 |0 + \xB5\x95 |0 + \xC2\xBB |0 + \xEC\xF8 |0 + \xB5\x96 |0 + \xB5\x97 |0 + \xB5\x98 |0 + \xB5\x99 |0 + \xEC\xF9 |0 + \xB5\x9A |0 + \xB5\x9B |0 + \xB5\x9C |0 + \xB5\x9D |0 + \xB8\xA3 |0 + \xB5\x9E |0 + \xB5\x9F |0 + \xB5\xA0 |0 + \xB6\x40 |0 + \xB6\x41 |0 + \xB6\x42 |0 + \xB6\x43 |0 + \xB6\x44 |0 + \xB6\x45 |0 + \xB6\x46 |0 + \xEC\xFA |0 + \xB6\x47 |0 + \xB6\x48 |0 + \xB6\x49 |0 + \xB6\x4A |0 + \xB6\x4B |0 + \xB6\x4C |0 + \xB6\x4D |0 + \xB6\x4E |0 + \xB6\x4F |0 + \xB6\x50 |0 + \xB6\x51 |0 + \xB6\x52 |0 + \xEC\xFB |0 + \xB6\x53 |0 + \xB6\x54 |0 + \xB6\x55 |0 + \xB6\x56 |0 + \xB6\x57 |0 + \xB6\x58 |0 + \xB6\x59 |0 + \xB6\x5A |0 + \xB6\x5B |0 + \xB6\x5C |0 + \xB6\x5D |0 + \xEC\xFC |0 + \xB6\x5E |0 + \xB6\x5F |0 + \xB6\x60 |0 + \xB6\x61 |0 + \xB6\x62 |0 + \xD3\xED |0 + \xD8\xAE |0 + \xC0\xEB |0 + \xB6\x63 |0 + \xC7\xDD |0 + \xBA\xCC |0 + \xB6\x64 |0 + \xD0\xE3 |0 + \xCB\xBD |0 + \xB6\x65 |0 + \xCD\xBA |0 + \xB6\x66 |0 + \xB6\x67 |0 + \xB8\xD1 |0 + \xB6\x68 |0 + \xB6\x69 |0 + \xB1\xFC |0 + \xB6\x6A |0 + \xC7\xEF |0 + \xB6\x6B |0 + \xD6\xD6 |0 + \xB6\x6C |0 + \xB6\x6D |0 + \xB6\x6E |0 + \xBF\xC6 |0 + \xC3\xEB |0 + \xB6\x6F |0 + \xB6\x70 |0 + \xEF\xF5 |0 + \xB6\x71 |0 + \xB6\x72 |0 + \xC3\xD8 |0 + \xB6\x73 |0 + \xB6\x74 |0 + \xB6\x75 |0 + \xB6\x76 |0 + \xB6\x77 |0 + \xB6\x78 |0 + \xD7\xE2 |0 + \xB6\x79 |0 + \xB6\x7A |0 + \xB6\x7B |0 + \xEF\xF7 |0 + \xB3\xD3 |0 + \xB6\x7C |0 + \xC7\xD8 |0 + \xD1\xED |0 + \xB6\x7D |0 + \xD6\xC8 |0 + \xB6\x7E |0 + \xEF\xF8 |0 + \xB6\x80 |0 + \xEF\xF6 |0 + \xB6\x81 |0 + \xBB\xFD |0 + \xB3\xC6 |0 + \xB6\x82 |0 + \xB6\x83 |0 + \xB6\x84 |0 + \xB6\x85 |0 + \xB6\x86 |0 + \xB6\x87 |0 + \xB6\x88 |0 + \xBD\xD5 |0 + \xB6\x89 |0 + \xB6\x8A |0 + \xD2\xC6 |0 + \xB6\x8B |0 + \xBB\xE0 |0 + \xB6\x8C |0 + \xB6\x8D |0 + \xCF\xA1 |0 + \xB6\x8E |0 + \xEF\xFC |0 + \xEF\xFB |0 + \xB6\x8F |0 + \xB6\x90 |0 + \xEF\xF9 |0 + \xB6\x91 |0 + \xB6\x92 |0 + \xB6\x93 |0 + \xB6\x94 |0 + \xB3\xCC |0 + \xB6\x95 |0 + \xC9\xD4 |0 + \xCB\xB0 |0 + \xB6\x96 |0 + \xB6\x97 |0 + \xB6\x98 |0 + \xB6\x99 |0 + \xB6\x9A |0 + \xEF\xFE |0 + \xB6\x9B |0 + \xB6\x9C |0 + \xB0\xDE |0 + \xB6\x9D |0 + \xB6\x9E |0 + \xD6\xC9 |0 + \xB6\x9F |0 + \xB6\xA0 |0 + \xB7\x40 |0 + \xEF\xFD |0 + \xB7\x41 |0 + \xB3\xED |0 + \xB7\x42 |0 + \xB7\x43 |0 + \xF6\xD5 |0 + \xB7\x44 |0 + \xB7\x45 |0 + \xB7\x46 |0 + \xB7\x47 |0 + \xB7\x48 |0 + \xB7\x49 |0 + \xB7\x4A |0 + \xB7\x4B |0 + \xB7\x4C |0 + \xB7\x4D |0 + \xB7\x4E |0 + \xB7\x4F |0 + \xB7\x50 |0 + \xB7\x51 |0 + \xB7\x52 |0 + \xCE\xC8 |0 + \xB7\x53 |0 + \xB7\x54 |0 + \xB7\x55 |0 + \xF0\xA2 |0 + \xB7\x56 |0 + \xF0\xA1 |0 + \xB7\x57 |0 + \xB5\xBE |0 + \xBC\xDA |0 + \xBB\xFC |0 + \xB7\x58 |0 + \xB8\xE5 |0 + \xB7\x59 |0 + \xB7\x5A |0 + \xB7\x5B |0 + \xB7\x5C |0 + \xB7\x5D |0 + \xB7\x5E |0 + \xC4\xC2 |0 + \xB7\x5F |0 + \xB7\x60 |0 + \xB7\x61 |0 + \xB7\x62 |0 + \xB7\x63 |0 + \xB7\x64 |0 + \xB7\x65 |0 + \xB7\x66 |0 + \xB7\x67 |0 + \xB7\x68 |0 + \xF0\xA3 |0 + \xB7\x69 |0 + \xB7\x6A |0 + \xB7\x6B |0 + \xB7\x6C |0 + \xB7\x6D |0 + \xCB\xEB |0 + \xB7\x6E |0 + \xB7\x6F |0 + \xB7\x70 |0 + \xB7\x71 |0 + \xB7\x72 |0 + \xB7\x73 |0 + \xB7\x74 |0 + \xB7\x75 |0 + \xB7\x76 |0 + \xB7\x77 |0 + \xB7\x78 |0 + \xB7\x79 |0 + \xB7\x7A |0 + \xB7\x7B |0 + \xB7\x7C |0 + \xB7\x7D |0 + \xB7\x7E |0 + \xB7\x80 |0 + \xB7\x81 |0 + \xB7\x82 |0 + \xB7\x83 |0 + \xB7\x84 |0 + \xB7\x85 |0 + \xB7\x86 |0 + \xF0\xA6 |0 + \xB7\x87 |0 + \xB7\x88 |0 + \xB7\x89 |0 + \xD1\xA8 |0 + \xB7\x8A |0 + \xBE\xBF |0 + \xC7\xEE |0 + \xF1\xB6 |0 + \xF1\xB7 |0 + \xBF\xD5 |0 + \xB7\x8B |0 + \xB7\x8C |0 + \xB7\x8D |0 + \xB7\x8E |0 + \xB4\xA9 |0 + \xF1\xB8 |0 + \xCD\xBB |0 + \xB7\x8F |0 + \xC7\xD4 |0 + \xD5\xAD |0 + \xB7\x90 |0 + \xF1\xB9 |0 + \xB7\x91 |0 + \xF1\xBA |0 + \xB7\x92 |0 + \xB7\x93 |0 + \xB7\x94 |0 + \xB7\x95 |0 + \xC7\xCF |0 + \xB7\x96 |0 + \xB7\x97 |0 + \xB7\x98 |0 + \xD2\xA4 |0 + \xD6\xCF |0 + \xB7\x99 |0 + \xB7\x9A |0 + \xF1\xBB |0 + \xBD\xD1 |0 + \xB4\xB0 |0 + \xBE\xBD |0 + \xB7\x9B |0 + \xB7\x9C |0 + \xB7\x9D |0 + \xB4\xDC |0 + \xCE\xD1 |0 + \xB7\x9E |0 + \xBF\xDF |0 + \xF1\xBD |0 + \xB7\x9F |0 + \xB7\xA0 |0 + \xB8\x40 |0 + \xB8\x41 |0 + \xBF\xFA |0 + \xF1\xBC |0 + \xB8\x42 |0 + \xF1\xBF |0 + \xB8\x43 |0 + \xB8\x44 |0 + \xB8\x45 |0 + \xF1\xBE |0 + \xF1\xC0 |0 + \xB8\x46 |0 + \xB8\x47 |0 + \xB8\x48 |0 + \xB8\x49 |0 + \xB8\x4A |0 + \xF1\xC1 |0 + \xB8\x4B |0 + \xB8\x4C |0 + \xB8\x4D |0 + \xB8\x4E |0 + \xB8\x4F |0 + \xB8\x50 |0 + \xB8\x51 |0 + \xB8\x52 |0 + \xB8\x53 |0 + \xB8\x54 |0 + \xB8\x55 |0 + \xC1\xFE |0 + \xB8\x56 |0 + \xB8\x57 |0 + \xB8\x58 |0 + \xB8\x59 |0 + \xB8\x5A |0 + \xB8\x5B |0 + \xB8\x5C |0 + \xB8\x5D |0 + \xB8\x5E |0 + \xB8\x5F |0 + \xB8\x60 |0 + \xC1\xA2 |0 + \xB8\x61 |0 + \xB8\x62 |0 + \xB8\x63 |0 + \xB8\x64 |0 + \xB8\x65 |0 + \xB8\x66 |0 + \xB8\x67 |0 + \xB8\x68 |0 + \xB8\x69 |0 + \xB8\x6A |0 + \xCA\xFA |0 + \xB8\x6B |0 + \xB8\x6C |0 + \xD5\xBE |0 + \xB8\x6D |0 + \xB8\x6E |0 + \xB8\x6F |0 + \xB8\x70 |0 + \xBE\xBA |0 + \xBE\xB9 |0 + \xD5\xC2 |0 + \xB8\x71 |0 + \xB8\x72 |0 + \xBF\xA2 |0 + \xB8\x73 |0 + \xCD\xAF |0 + \xF1\xB5 |0 + \xB8\x74 |0 + \xB8\x75 |0 + \xB8\x76 |0 + \xB8\x77 |0 + \xB8\x78 |0 + \xB8\x79 |0 + \xBD\xDF |0 + \xB8\x7A |0 + \xB6\xCB |0 + \xB8\x7B |0 + \xB8\x7C |0 + \xB8\x7D |0 + \xB8\x7E |0 + \xB8\x80 |0 + \xB8\x81 |0 + \xB8\x82 |0 + \xB8\x83 |0 + \xB8\x84 |0 + \xD6\xF1 |0 + \xF3\xC3 |0 + \xB8\x85 |0 + \xB8\x86 |0 + \xF3\xC4 |0 + \xB8\x87 |0 + \xB8\xCD |0 + \xB8\x88 |0 + \xB8\x89 |0 + \xB8\x8A |0 + \xF3\xC6 |0 + \xF3\xC7 |0 + \xB8\x8B |0 + \xB0\xCA |0 + \xB8\x8C |0 + \xF3\xC5 |0 + \xB8\x8D |0 + \xF3\xC9 |0 + \xCB\xF1 |0 + \xB8\x8E |0 + \xB8\x8F |0 + \xB8\x90 |0 + \xF3\xCB |0 + \xB8\x91 |0 + \xD0\xA6 |0 + \xB8\x92 |0 + \xB8\x93 |0 + \xB1\xCA |0 + \xF3\xC8 |0 + \xB8\x94 |0 + \xB8\x95 |0 + \xB8\x96 |0 + \xF3\xCF |0 + \xB8\x97 |0 + \xB5\xD1 |0 + \xB8\x98 |0 + \xB8\x99 |0 + \xF3\xD7 |0 + \xB8\x9A |0 + \xF3\xD2 |0 + \xB8\x9B |0 + \xB8\x9C |0 + \xB8\x9D |0 + \xF3\xD4 |0 + \xF3\xD3 |0 + \xB7\xFB |0 + \xB8\x9E |0 + \xB1\xBF |0 + \xB8\x9F |0 + \xF3\xCE |0 + \xF3\xCA |0 + \xB5\xDA |0 + \xB8\xA0 |0 + \xF3\xD0 |0 + \xB9\x40 |0 + \xB9\x41 |0 + \xF3\xD1 |0 + \xB9\x42 |0 + \xF3\xD5 |0 + \xB9\x43 |0 + \xB9\x44 |0 + \xB9\x45 |0 + \xB9\x46 |0 + \xF3\xCD |0 + \xB9\x47 |0 + \xBC\xE3 |0 + \xB9\x48 |0 + \xC1\xFD |0 + \xB9\x49 |0 + \xF3\xD6 |0 + \xB9\x4A |0 + \xB9\x4B |0 + \xB9\x4C |0 + \xB9\x4D |0 + \xB9\x4E |0 + \xB9\x4F |0 + \xF3\xDA |0 + \xB9\x50 |0 + \xF3\xCC |0 + \xB9\x51 |0 + \xB5\xC8 |0 + \xB9\x52 |0 + \xBD\xEE |0 + \xF3\xDC |0 + \xB9\x53 |0 + \xB9\x54 |0 + \xB7\xA4 |0 + \xBF\xF0 |0 + \xD6\xFE |0 + \xCD\xB2 |0 + \xB9\x55 |0 + \xB4\xF0 |0 + \xB9\x56 |0 + \xB2\xDF |0 + \xB9\x57 |0 + \xF3\xD8 |0 + \xB9\x58 |0 + \xF3\xD9 |0 + \xC9\xB8 |0 + \xB9\x59 |0 + \xF3\xDD |0 + \xB9\x5A |0 + \xB9\x5B |0 + \xF3\xDE |0 + \xB9\x5C |0 + \xF3\xE1 |0 + \xB9\x5D |0 + \xB9\x5E |0 + \xB9\x5F |0 + \xB9\x60 |0 + \xB9\x61 |0 + \xB9\x62 |0 + \xB9\x63 |0 + \xB9\x64 |0 + \xB9\x65 |0 + \xB9\x66 |0 + \xB9\x67 |0 + \xF3\xDF |0 + \xB9\x68 |0 + \xB9\x69 |0 + \xF3\xE3 |0 + \xF3\xE2 |0 + \xB9\x6A |0 + \xB9\x6B |0 + \xF3\xDB |0 + \xB9\x6C |0 + \xBF\xEA |0 + \xB9\x6D |0 + \xB3\xEF |0 + \xB9\x6E |0 + \xF3\xE0 |0 + \xB9\x6F |0 + \xB9\x70 |0 + \xC7\xA9 |0 + \xB9\x71 |0 + \xBC\xF2 |0 + \xB9\x72 |0 + \xB9\x73 |0 + \xB9\x74 |0 + \xB9\x75 |0 + \xF3\xEB |0 + \xB9\x76 |0 + \xB9\x77 |0 + \xB9\x78 |0 + \xB9\x79 |0 + \xB9\x7A |0 + \xB9\x7B |0 + \xB9\x7C |0 + \xB9\xBF |0 + \xB9\x7D |0 + \xB9\x7E |0 + \xF3\xE4 |0 + \xB9\x80 |0 + \xB9\x81 |0 + \xB9\x82 |0 + \xB2\xAD |0 + \xBB\xFE |0 + \xB9\x83 |0 + \xCB\xE3 |0 + \xB9\x84 |0 + \xB9\x85 |0 + \xB9\x86 |0 + \xB9\x87 |0 + \xF3\xED |0 + \xF3\xE9 |0 + \xB9\x88 |0 + \xB9\x89 |0 + \xB9\x8A |0 + \xB9\xDC |0 + \xF3\xEE |0 + \xB9\x8B |0 + \xB9\x8C |0 + \xB9\x8D |0 + \xF3\xE5 |0 + \xF3\xE6 |0 + \xF3\xEA |0 + \xC2\xE1 |0 + \xF3\xEC |0 + \xF3\xEF |0 + \xF3\xE8 |0 + \xBC\xFD |0 + \xB9\x8E |0 + \xB9\x8F |0 + \xB9\x90 |0 + \xCF\xE4 |0 + \xB9\x91 |0 + \xB9\x92 |0 + \xF3\xF0 |0 + \xB9\x93 |0 + \xB9\x94 |0 + \xB9\x95 |0 + \xF3\xE7 |0 + \xB9\x96 |0 + \xB9\x97 |0 + \xB9\x98 |0 + \xB9\x99 |0 + \xB9\x9A |0 + \xB9\x9B |0 + \xB9\x9C |0 + \xB9\x9D |0 + \xF3\xF2 |0 + \xB9\x9E |0 + \xB9\x9F |0 + \xB9\xA0 |0 + \xBA\x40 |0 + \xD7\xAD |0 + \xC6\xAA |0 + \xBA\x41 |0 + \xBA\x42 |0 + \xBA\x43 |0 + \xBA\x44 |0 + \xF3\xF3 |0 + \xBA\x45 |0 + \xBA\x46 |0 + \xBA\x47 |0 + \xBA\x48 |0 + \xF3\xF1 |0 + \xBA\x49 |0 + \xC2\xA8 |0 + \xBA\x4A |0 + \xBA\x4B |0 + \xBA\x4C |0 + \xBA\x4D |0 + \xBA\x4E |0 + \xB8\xDD |0 + \xF3\xF5 |0 + \xBA\x4F |0 + \xBA\x50 |0 + \xF3\xF4 |0 + \xBA\x51 |0 + \xBA\x52 |0 + \xBA\x53 |0 + \xB4\xDB |0 + \xBA\x54 |0 + \xBA\x55 |0 + \xBA\x56 |0 + \xF3\xF6 |0 + \xF3\xF7 |0 + \xBA\x57 |0 + \xBA\x58 |0 + \xBA\x59 |0 + \xF3\xF8 |0 + \xBA\x5A |0 + \xBA\x5B |0 + \xBA\x5C |0 + \xC0\xBA |0 + \xBA\x5D |0 + \xBA\x5E |0 + \xC0\xE9 |0 + \xBA\x5F |0 + \xBA\x60 |0 + \xBA\x61 |0 + \xBA\x62 |0 + \xBA\x63 |0 + \xC5\xF1 |0 + \xBA\x64 |0 + \xBA\x65 |0 + \xBA\x66 |0 + \xBA\x67 |0 + \xF3\xFB |0 + \xBA\x68 |0 + \xF3\xFA |0 + \xBA\x69 |0 + \xBA\x6A |0 + \xBA\x6B |0 + \xBA\x6C |0 + \xBA\x6D |0 + \xBA\x6E |0 + \xBA\x6F |0 + \xBA\x70 |0 + \xB4\xD8 |0 + \xBA\x71 |0 + \xBA\x72 |0 + \xBA\x73 |0 + \xF3\xFE |0 + \xF3\xF9 |0 + \xBA\x74 |0 + \xBA\x75 |0 + \xF3\xFC |0 + \xBA\x76 |0 + \xBA\x77 |0 + \xBA\x78 |0 + \xBA\x79 |0 + \xBA\x7A |0 + \xBA\x7B |0 + \xF3\xFD |0 + \xBA\x7C |0 + \xBA\x7D |0 + \xBA\x7E |0 + \xBA\x80 |0 + \xBA\x81 |0 + \xBA\x82 |0 + \xBA\x83 |0 + \xBA\x84 |0 + \xF4\xA1 |0 + \xBA\x85 |0 + \xBA\x86 |0 + \xBA\x87 |0 + \xBA\x88 |0 + \xBA\x89 |0 + \xBA\x8A |0 + \xF4\xA3 |0 + \xBB\xC9 |0 + \xBA\x8B |0 + \xBA\x8C |0 + \xF4\xA2 |0 + \xBA\x8D |0 + \xBA\x8E |0 + \xBA\x8F |0 + \xBA\x90 |0 + \xBA\x91 |0 + \xBA\x92 |0 + \xBA\x93 |0 + \xBA\x94 |0 + \xBA\x95 |0 + \xBA\x96 |0 + \xBA\x97 |0 + \xBA\x98 |0 + \xBA\x99 |0 + \xF4\xA4 |0 + \xBA\x9A |0 + \xBA\x9B |0 + \xBA\x9C |0 + \xBA\x9D |0 + \xBA\x9E |0 + \xBA\x9F |0 + \xB2\xBE |0 + \xF4\xA6 |0 + \xF4\xA5 |0 + \xBA\xA0 |0 + \xBB\x40 |0 + \xBB\x41 |0 + \xBB\x42 |0 + \xBB\x43 |0 + \xBB\x44 |0 + \xBB\x45 |0 + \xBB\x46 |0 + \xBB\x47 |0 + \xBB\x48 |0 + \xBB\x49 |0 + \xBC\xAE |0 + \xBB\x4A |0 + \xBB\x4B |0 + \xBB\x4C |0 + \xBB\x4D |0 + \xBB\x4E |0 + \xBB\x4F |0 + \xBB\x50 |0 + \xBB\x51 |0 + \xBB\x52 |0 + \xBB\x53 |0 + \xBB\x54 |0 + \xBB\x55 |0 + \xBB\x56 |0 + \xBB\x57 |0 + \xBB\x58 |0 + \xBB\x59 |0 + \xBB\x5A |0 + \xBB\x5B |0 + \xBB\x5C |0 + \xBB\x5D |0 + \xBB\x5E |0 + \xBB\x5F |0 + \xBB\x60 |0 + \xBB\x61 |0 + \xBB\x62 |0 + \xBB\x63 |0 + \xBB\x64 |0 + \xBB\x65 |0 + \xBB\x66 |0 + \xBB\x67 |0 + \xBB\x68 |0 + \xBB\x69 |0 + \xBB\x6A |0 + \xBB\x6B |0 + \xBB\x6C |0 + \xBB\x6D |0 + \xBB\x6E |0 + \xC3\xD7 |0 + \xD9\xE1 |0 + \xBB\x6F |0 + \xBB\x70 |0 + \xBB\x71 |0 + \xBB\x72 |0 + \xBB\x73 |0 + \xBB\x74 |0 + \xC0\xE0 |0 + \xF4\xCC |0 + \xD7\xD1 |0 + \xBB\x75 |0 + \xBB\x76 |0 + \xBB\x77 |0 + \xBB\x78 |0 + \xBB\x79 |0 + \xBB\x7A |0 + \xBB\x7B |0 + \xBB\x7C |0 + \xBB\x7D |0 + \xBB\x7E |0 + \xBB\x80 |0 + \xB7\xDB |0 + \xBB\x81 |0 + \xBB\x82 |0 + \xBB\x83 |0 + \xBB\x84 |0 + \xBB\x85 |0 + \xBB\x86 |0 + \xBB\x87 |0 + \xF4\xCE |0 + \xC1\xA3 |0 + \xBB\x88 |0 + \xBB\x89 |0 + \xC6\xC9 |0 + \xBB\x8A |0 + \xB4\xD6 |0 + \xD5\xB3 |0 + \xBB\x8B |0 + \xBB\x8C |0 + \xBB\x8D |0 + \xF4\xD0 |0 + \xF4\xCF |0 + \xF4\xD1 |0 + \xCB\xDA |0 + \xBB\x8E |0 + \xBB\x8F |0 + \xF4\xD2 |0 + \xBB\x90 |0 + \xD4\xC1 |0 + \xD6\xE0 |0 + \xBB\x91 |0 + \xBB\x92 |0 + \xBB\x93 |0 + \xBB\x94 |0 + \xB7\xE0 |0 + \xBB\x95 |0 + \xBB\x96 |0 + \xBB\x97 |0 + \xC1\xB8 |0 + \xBB\x98 |0 + \xBB\x99 |0 + \xC1\xBB |0 + \xF4\xD3 |0 + \xBE\xAC |0 + \xBB\x9A |0 + \xBB\x9B |0 + \xBB\x9C |0 + \xBB\x9D |0 + \xBB\x9E |0 + \xB4\xE2 |0 + \xBB\x9F |0 + \xBB\xA0 |0 + \xF4\xD4 |0 + \xF4\xD5 |0 + \xBE\xAB |0 + \xBC\x40 |0 + \xBC\x41 |0 + \xF4\xD6 |0 + \xBC\x42 |0 + \xBC\x43 |0 + \xBC\x44 |0 + \xF4\xDB |0 + \xBC\x45 |0 + \xF4\xD7 |0 + \xF4\xDA |0 + \xBC\x46 |0 + \xBA\xFD |0 + \xBC\x47 |0 + \xF4\xD8 |0 + \xF4\xD9 |0 + \xBC\x48 |0 + \xBC\x49 |0 + \xBC\x4A |0 + \xBC\x4B |0 + \xBC\x4C |0 + \xBC\x4D |0 + \xBC\x4E |0 + \xB8\xE2 |0 + \xCC\xC7 |0 + \xF4\xDC |0 + \xBC\x4F |0 + \xB2\xDA |0 + \xBC\x50 |0 + \xBC\x51 |0 + \xC3\xD3 |0 + \xBC\x52 |0 + \xBC\x53 |0 + \xD4\xE3 |0 + \xBF\xB7 |0 + \xBC\x54 |0 + \xBC\x55 |0 + \xBC\x56 |0 + \xBC\x57 |0 + \xBC\x58 |0 + \xBC\x59 |0 + \xBC\x5A |0 + \xF4\xDD |0 + \xBC\x5B |0 + \xBC\x5C |0 + \xBC\x5D |0 + \xBC\x5E |0 + \xBC\x5F |0 + \xBC\x60 |0 + \xC5\xB4 |0 + \xBC\x61 |0 + \xBC\x62 |0 + \xBC\x63 |0 + \xBC\x64 |0 + \xBC\x65 |0 + \xBC\x66 |0 + \xBC\x67 |0 + \xBC\x68 |0 + \xF4\xE9 |0 + \xBC\x69 |0 + \xBC\x6A |0 + \xCF\xB5 |0 + \xBC\x6B |0 + \xBC\x6C |0 + \xBC\x6D |0 + \xBC\x6E |0 + \xBC\x6F |0 + \xBC\x70 |0 + \xBC\x71 |0 + \xBC\x72 |0 + \xBC\x73 |0 + \xBC\x74 |0 + \xBC\x75 |0 + \xBC\x76 |0 + \xBC\x77 |0 + \xBC\x78 |0 + \xCE\xC9 |0 + \xBC\x79 |0 + \xBC\x7A |0 + \xBC\x7B |0 + \xBC\x7C |0 + \xBC\x7D |0 + \xBC\x7E |0 + \xBC\x80 |0 + \xBC\x81 |0 + \xBC\x82 |0 + \xBC\x83 |0 + \xBC\x84 |0 + \xBC\x85 |0 + \xBC\x86 |0 + \xBC\x87 |0 + \xBC\x88 |0 + \xBC\x89 |0 + \xBC\x8A |0 + \xBC\x8B |0 + \xBC\x8C |0 + \xBC\x8D |0 + \xBC\x8E |0 + \xCB\xD8 |0 + \xBC\x8F |0 + \xCB\xF7 |0 + \xBC\x90 |0 + \xBC\x91 |0 + \xBC\x92 |0 + \xBC\x93 |0 + \xBD\xF4 |0 + \xBC\x94 |0 + \xBC\x95 |0 + \xBC\x96 |0 + \xD7\xCF |0 + \xBC\x97 |0 + \xBC\x98 |0 + \xBC\x99 |0 + \xC0\xDB |0 + \xBC\x9A |0 + \xBC\x9B |0 + \xBC\x9C |0 + \xBC\x9D |0 + \xBC\x9E |0 + \xBC\x9F |0 + \xBC\xA0 |0 + \xBD\x40 |0 + \xBD\x41 |0 + \xBD\x42 |0 + \xBD\x43 |0 + \xBD\x44 |0 + \xBD\x45 |0 + \xBD\x46 |0 + \xBD\x47 |0 + \xBD\x48 |0 + \xBD\x49 |0 + \xBD\x4A |0 + \xBD\x4B |0 + \xBD\x4C |0 + \xBD\x4D |0 + \xBD\x4E |0 + \xBD\x4F |0 + \xBD\x50 |0 + \xBD\x51 |0 + \xBD\x52 |0 + \xBD\x53 |0 + \xBD\x54 |0 + \xBD\x55 |0 + \xBD\x56 |0 + \xBD\x57 |0 + \xBD\x58 |0 + \xBD\x59 |0 + \xBD\x5A |0 + \xBD\x5B |0 + \xBD\x5C |0 + \xBD\x5D |0 + \xBD\x5E |0 + \xBD\x5F |0 + \xBD\x60 |0 + \xBD\x61 |0 + \xBD\x62 |0 + \xBD\x63 |0 + \xBD\x64 |0 + \xBD\x65 |0 + \xBD\x66 |0 + \xBD\x67 |0 + \xBD\x68 |0 + \xBD\x69 |0 + \xBD\x6A |0 + \xBD\x6B |0 + \xBD\x6C |0 + \xBD\x6D |0 + \xBD\x6E |0 + \xBD\x6F |0 + \xBD\x70 |0 + \xBD\x71 |0 + \xBD\x72 |0 + \xBD\x73 |0 + \xBD\x74 |0 + \xBD\x75 |0 + \xBD\x76 |0 + \xD0\xF5 |0 + \xBD\x77 |0 + \xBD\x78 |0 + \xBD\x79 |0 + \xBD\x7A |0 + \xBD\x7B |0 + \xBD\x7C |0 + \xBD\x7D |0 + \xBD\x7E |0 + \xF4\xEA |0 + \xBD\x80 |0 + \xBD\x81 |0 + \xBD\x82 |0 + \xBD\x83 |0 + \xBD\x84 |0 + \xBD\x85 |0 + \xBD\x86 |0 + \xBD\x87 |0 + \xBD\x88 |0 + \xBD\x89 |0 + \xBD\x8A |0 + \xBD\x8B |0 + \xBD\x8C |0 + \xBD\x8D |0 + \xBD\x8E |0 + \xBD\x8F |0 + \xBD\x90 |0 + \xBD\x91 |0 + \xBD\x92 |0 + \xBD\x93 |0 + \xBD\x94 |0 + \xBD\x95 |0 + \xBD\x96 |0 + \xBD\x97 |0 + \xBD\x98 |0 + \xBD\x99 |0 + \xBD\x9A |0 + \xBD\x9B |0 + \xBD\x9C |0 + \xBD\x9D |0 + \xBD\x9E |0 + \xBD\x9F |0 + \xBD\xA0 |0 + \xBE\x40 |0 + \xBE\x41 |0 + \xBE\x42 |0 + \xBE\x43 |0 + \xBE\x44 |0 + \xBE\x45 |0 + \xBE\x46 |0 + \xBE\x47 |0 + \xBE\x48 |0 + \xBE\x49 |0 + \xBE\x4A |0 + \xBE\x4B |0 + \xBE\x4C |0 + \xF4\xEB |0 + \xBE\x4D |0 + \xBE\x4E |0 + \xBE\x4F |0 + \xBE\x50 |0 + \xBE\x51 |0 + \xBE\x52 |0 + \xBE\x53 |0 + \xF4\xEC |0 + \xBE\x54 |0 + \xBE\x55 |0 + \xBE\x56 |0 + \xBE\x57 |0 + \xBE\x58 |0 + \xBE\x59 |0 + \xBE\x5A |0 + \xBE\x5B |0 + \xBE\x5C |0 + \xBE\x5D |0 + \xBE\x5E |0 + \xBE\x5F |0 + \xBE\x60 |0 + \xBE\x61 |0 + \xBE\x62 |0 + \xBE\x63 |0 + \xBE\x64 |0 + \xBE\x65 |0 + \xBE\x66 |0 + \xBE\x67 |0 + \xBE\x68 |0 + \xBE\x69 |0 + \xBE\x6A |0 + \xBE\x6B |0 + \xBE\x6C |0 + \xBE\x6D |0 + \xBE\x6E |0 + \xBE\x6F |0 + \xBE\x70 |0 + \xBE\x71 |0 + \xBE\x72 |0 + \xBE\x73 |0 + \xBE\x74 |0 + \xBE\x75 |0 + \xBE\x76 |0 + \xBE\x77 |0 + \xBE\x78 |0 + \xBE\x79 |0 + \xBE\x7A |0 + \xBE\x7B |0 + \xBE\x7C |0 + \xBE\x7D |0 + \xBE\x7E |0 + \xBE\x80 |0 + \xBE\x81 |0 + \xBE\x82 |0 + \xBE\x83 |0 + \xBE\x84 |0 + \xBE\x85 |0 + \xBE\x86 |0 + \xBE\x87 |0 + \xBE\x88 |0 + \xBE\x89 |0 + \xBE\x8A |0 + \xBE\x8B |0 + \xBE\x8C |0 + \xBE\x8D |0 + \xBE\x8E |0 + \xBE\x8F |0 + \xBE\x90 |0 + \xBE\x91 |0 + \xBE\x92 |0 + \xBE\x93 |0 + \xBE\x94 |0 + \xBE\x95 |0 + \xBE\x96 |0 + \xBE\x97 |0 + \xBE\x98 |0 + \xBE\x99 |0 + \xBE\x9A |0 + \xBE\x9B |0 + \xBE\x9C |0 + \xBE\x9D |0 + \xBE\x9E |0 + \xBE\x9F |0 + \xBE\xA0 |0 + \xBF\x40 |0 + \xBF\x41 |0 + \xBF\x42 |0 + \xBF\x43 |0 + \xBF\x44 |0 + \xBF\x45 |0 + \xBF\x46 |0 + \xBF\x47 |0 + \xBF\x48 |0 + \xBF\x49 |0 + \xBF\x4A |0 + \xBF\x4B |0 + \xBF\x4C |0 + \xBF\x4D |0 + \xBF\x4E |0 + \xBF\x4F |0 + \xBF\x50 |0 + \xBF\x51 |0 + \xBF\x52 |0 + \xBF\x53 |0 + \xBF\x54 |0 + \xBF\x55 |0 + \xBF\x56 |0 + \xBF\x57 |0 + \xBF\x58 |0 + \xBF\x59 |0 + \xBF\x5A |0 + \xBF\x5B |0 + \xBF\x5C |0 + \xBF\x5D |0 + \xBF\x5E |0 + \xBF\x5F |0 + \xBF\x60 |0 + \xBF\x61 |0 + \xBF\x62 |0 + \xBF\x63 |0 + \xBF\x64 |0 + \xBF\x65 |0 + \xBF\x66 |0 + \xBF\x67 |0 + \xBF\x68 |0 + \xBF\x69 |0 + \xBF\x6A |0 + \xBF\x6B |0 + \xBF\x6C |0 + \xBF\x6D |0 + \xBF\x6E |0 + \xBF\x6F |0 + \xBF\x70 |0 + \xBF\x71 |0 + \xBF\x72 |0 + \xBF\x73 |0 + \xBF\x74 |0 + \xBF\x75 |0 + \xBF\x76 |0 + \xBF\x77 |0 + \xBF\x78 |0 + \xBF\x79 |0 + \xBF\x7A |0 + \xBF\x7B |0 + \xBF\x7C |0 + \xBF\x7D |0 + \xBF\x7E |0 + \xBF\x80 |0 + \xF7\xE3 |0 + \xBF\x81 |0 + \xBF\x82 |0 + \xBF\x83 |0 + \xBF\x84 |0 + \xBF\x85 |0 + \xB7\xB1 |0 + \xBF\x86 |0 + \xBF\x87 |0 + \xBF\x88 |0 + \xBF\x89 |0 + \xBF\x8A |0 + \xF4\xED |0 + \xBF\x8B |0 + \xBF\x8C |0 + \xBF\x8D |0 + \xBF\x8E |0 + \xBF\x8F |0 + \xBF\x90 |0 + \xBF\x91 |0 + \xBF\x92 |0 + \xBF\x93 |0 + \xBF\x94 |0 + \xBF\x95 |0 + \xBF\x96 |0 + \xBF\x97 |0 + \xBF\x98 |0 + \xBF\x99 |0 + \xBF\x9A |0 + \xBF\x9B |0 + \xBF\x9C |0 + \xBF\x9D |0 + \xBF\x9E |0 + \xBF\x9F |0 + \xBF\xA0 |0 + \xC0\x40 |0 + \xC0\x41 |0 + \xC0\x42 |0 + \xC0\x43 |0 + \xC0\x44 |0 + \xC0\x45 |0 + \xC0\x46 |0 + \xC0\x47 |0 + \xC0\x48 |0 + \xC0\x49 |0 + \xC0\x4A |0 + \xC0\x4B |0 + \xC0\x4C |0 + \xC0\x4D |0 + \xC0\x4E |0 + \xC0\x4F |0 + \xC0\x50 |0 + \xC0\x51 |0 + \xC0\x52 |0 + \xC0\x53 |0 + \xC0\x54 |0 + \xC0\x55 |0 + \xC0\x56 |0 + \xC0\x57 |0 + \xC0\x58 |0 + \xC0\x59 |0 + \xC0\x5A |0 + \xC0\x5B |0 + \xC0\x5C |0 + \xC0\x5D |0 + \xC0\x5E |0 + \xC0\x5F |0 + \xC0\x60 |0 + \xC0\x61 |0 + \xC0\x62 |0 + \xC0\x63 |0 + \xD7\xEB |0 + \xC0\x64 |0 + \xC0\x65 |0 + \xC0\x66 |0 + \xC0\x67 |0 + \xC0\x68 |0 + \xC0\x69 |0 + \xC0\x6A |0 + \xC0\x6B |0 + \xC0\x6C |0 + \xC0\x6D |0 + \xC0\x6E |0 + \xC0\x6F |0 + \xC0\x70 |0 + \xC0\x71 |0 + \xC0\x72 |0 + \xC0\x73 |0 + \xC0\x74 |0 + \xC0\x75 |0 + \xC0\x76 |0 + \xC0\x77 |0 + \xC0\x78 |0 + \xC0\x79 |0 + \xC0\x7A |0 + \xC0\x7B |0 + \xF4\xEE |0 + \xC0\x7C |0 + \xC0\x7D |0 + \xC0\x7E |0 + \xE6\xF9 |0 + \xBE\xC0 |0 + \xE6\xFA |0 + \xBA\xEC |0 + \xE6\xFB |0 + \xCF\xCB |0 + \xE6\xFC |0 + \xD4\xBC |0 + \xBC\xB6 |0 + \xE6\xFD |0 + \xE6\xFE |0 + \xBC\xCD |0 + \xC8\xD2 |0 + \xCE\xB3 |0 + \xE7\xA1 |0 + \xC0\x80 |0 + \xB4\xBF |0 + \xE7\xA2 |0 + \xC9\xB4 |0 + \xB8\xD9 |0 + \xC4\xC9 |0 + \xC0\x81 |0 + \xD7\xDD |0 + \xC2\xDA |0 + \xB7\xD7 |0 + \xD6\xBD |0 + \xCE\xC6 |0 + \xB7\xC4 |0 + \xC0\x82 |0 + \xC0\x83 |0 + \xC5\xA6 |0 + \xE7\xA3 |0 + \xCF\xDF |0 + \xE7\xA4 |0 + \xE7\xA5 |0 + \xE7\xA6 |0 + \xC1\xB7 |0 + \xD7\xE9 |0 + \xC9\xF0 |0 + \xCF\xB8 |0 + \xD6\xAF |0 + \xD6\xD5 |0 + \xE7\xA7 |0 + \xB0\xED |0 + \xE7\xA8 |0 + \xE7\xA9 |0 + \xC9\xDC |0 + \xD2\xEF |0 + \xBE\xAD |0 + \xE7\xAA |0 + \xB0\xF3 |0 + \xC8\xDE |0 + \xBD\xE1 |0 + \xE7\xAB |0 + \xC8\xC6 |0 + \xC0\x84 |0 + \xE7\xAC |0 + \xBB\xE6 |0 + \xB8\xF8 |0 + \xD1\xA4 |0 + \xE7\xAD |0 + \xC2\xE7 |0 + \xBE\xF8 |0 + \xBD\xCA |0 + \xCD\xB3 |0 + \xE7\xAE |0 + \xE7\xAF |0 + \xBE\xEE |0 + \xD0\xE5 |0 + \xC0\x85 |0 + \xCB\xE7 |0 + \xCC\xD0 |0 + \xBC\xCC |0 + \xE7\xB0 |0 + \xBC\xA8 |0 + \xD0\xF7 |0 + \xE7\xB1 |0 + \xC0\x86 |0 + \xD0\xF8 |0 + \xE7\xB2 |0 + \xE7\xB3 |0 + \xB4\xC2 |0 + \xE7\xB4 |0 + \xE7\xB5 |0 + \xC9\xFE |0 + \xCE\xAC |0 + \xC3\xE0 |0 + \xE7\xB7 |0 + \xB1\xC1 |0 + \xB3\xF1 |0 + \xC0\x87 |0 + \xE7\xB8 |0 + \xE7\xB9 |0 + \xD7\xDB |0 + \xD5\xC0 |0 + \xE7\xBA |0 + \xC2\xCC |0 + \xD7\xBA |0 + \xE7\xBB |0 + \xE7\xBC |0 + \xE7\xBD |0 + \xBC\xEA |0 + \xC3\xE5 |0 + \xC0\xC2 |0 + \xE7\xBE |0 + \xE7\xBF |0 + \xBC\xA9 |0 + \xC0\x88 |0 + \xE7\xC0 |0 + \xE7\xC1 |0 + \xE7\xB6 |0 + \xB6\xD0 |0 + \xE7\xC2 |0 + \xC0\x89 |0 + \xE7\xC3 |0 + \xE7\xC4 |0 + \xBB\xBA |0 + \xB5\xDE |0 + \xC2\xC6 |0 + \xB1\xE0 |0 + \xE7\xC5 |0 + \xD4\xB5 |0 + \xE7\xC6 |0 + \xB8\xBF |0 + \xE7\xC8 |0 + \xE7\xC7 |0 + \xB7\xEC |0 + \xC0\x8A |0 + \xE7\xC9 |0 + \xB2\xF8 |0 + \xE7\xCA |0 + \xE7\xCB |0 + \xE7\xCC |0 + \xE7\xCD |0 + \xE7\xCE |0 + \xE7\xCF |0 + \xE7\xD0 |0 + \xD3\xA7 |0 + \xCB\xF5 |0 + \xE7\xD1 |0 + \xE7\xD2 |0 + \xE7\xD3 |0 + \xE7\xD4 |0 + \xC9\xC9 |0 + \xE7\xD5 |0 + \xE7\xD6 |0 + \xE7\xD7 |0 + \xE7\xD8 |0 + \xE7\xD9 |0 + \xBD\xC9 |0 + \xE7\xDA |0 + \xF3\xBE |0 + \xC0\x8B |0 + \xB8\xD7 |0 + \xC0\x8C |0 + \xC8\xB1 |0 + \xC0\x8D |0 + \xC0\x8E |0 + \xC0\x8F |0 + \xC0\x90 |0 + \xC0\x91 |0 + \xC0\x92 |0 + \xC0\x93 |0 + \xF3\xBF |0 + \xC0\x94 |0 + \xF3\xC0 |0 + \xF3\xC1 |0 + \xC0\x95 |0 + \xC0\x96 |0 + \xC0\x97 |0 + \xC0\x98 |0 + \xC0\x99 |0 + \xC0\x9A |0 + \xC0\x9B |0 + \xC0\x9C |0 + \xC0\x9D |0 + \xC0\x9E |0 + \xB9\xDE |0 + \xCD\xF8 |0 + \xC0\x9F |0 + \xC0\xA0 |0 + \xD8\xE8 |0 + \xBA\xB1 |0 + \xC1\x40 |0 + \xC2\xDE |0 + \xEE\xB7 |0 + \xC1\x41 |0 + \xB7\xA3 |0 + \xC1\x42 |0 + \xC1\x43 |0 + \xC1\x44 |0 + \xC1\x45 |0 + \xEE\xB9 |0 + \xC1\x46 |0 + \xEE\xB8 |0 + \xB0\xD5 |0 + \xC1\x47 |0 + \xC1\x48 |0 + \xC1\x49 |0 + \xC1\x4A |0 + \xC1\x4B |0 + \xEE\xBB |0 + \xD5\xD6 |0 + \xD7\xEF |0 + \xC1\x4C |0 + \xC1\x4D |0 + \xC1\x4E |0 + \xD6\xC3 |0 + \xC1\x4F |0 + \xC1\x50 |0 + \xEE\xBD |0 + \xCA\xF0 |0 + \xC1\x51 |0 + \xEE\xBC |0 + \xC1\x52 |0 + \xC1\x53 |0 + \xC1\x54 |0 + \xC1\x55 |0 + \xEE\xBE |0 + \xC1\x56 |0 + \xC1\x57 |0 + \xC1\x58 |0 + \xC1\x59 |0 + \xEE\xC0 |0 + \xC1\x5A |0 + \xC1\x5B |0 + \xEE\xBF |0 + \xC1\x5C |0 + \xC1\x5D |0 + \xC1\x5E |0 + \xC1\x5F |0 + \xC1\x60 |0 + \xC1\x61 |0 + \xC1\x62 |0 + \xC1\x63 |0 + \xD1\xF2 |0 + \xC1\x64 |0 + \xC7\xBC |0 + \xC1\x65 |0 + \xC3\xC0 |0 + \xC1\x66 |0 + \xC1\x67 |0 + \xC1\x68 |0 + \xC1\x69 |0 + \xC1\x6A |0 + \xB8\xE1 |0 + \xC1\x6B |0 + \xC1\x6C |0 + \xC1\x6D |0 + \xC1\x6E |0 + \xC1\x6F |0 + \xC1\xE7 |0 + \xC1\x70 |0 + \xC1\x71 |0 + \xF4\xC6 |0 + \xD0\xDF |0 + \xF4\xC7 |0 + \xC1\x72 |0 + \xCF\xDB |0 + \xC1\x73 |0 + \xC1\x74 |0 + \xC8\xBA |0 + \xC1\x75 |0 + \xC1\x76 |0 + \xF4\xC8 |0 + \xC1\x77 |0 + \xC1\x78 |0 + \xC1\x79 |0 + \xC1\x7A |0 + \xC1\x7B |0 + \xC1\x7C |0 + \xC1\x7D |0 + \xF4\xC9 |0 + \xF4\xCA |0 + \xC1\x7E |0 + \xF4\xCB |0 + \xC1\x80 |0 + \xC1\x81 |0 + \xC1\x82 |0 + \xC1\x83 |0 + \xC1\x84 |0 + \xD9\xFA |0 + \xB8\xFE |0 + \xC1\x85 |0 + \xC1\x86 |0 + \xE5\xF1 |0 + \xD3\xF0 |0 + \xC1\x87 |0 + \xF4\xE0 |0 + \xC1\x88 |0 + \xCE\xCC |0 + \xC1\x89 |0 + \xC1\x8A |0 + \xC1\x8B |0 + \xB3\xE1 |0 + \xC1\x8C |0 + \xC1\x8D |0 + \xC1\x8E |0 + \xC1\x8F |0 + \xF1\xB4 |0 + \xC1\x90 |0 + \xD2\xEE |0 + \xC1\x91 |0 + \xF4\xE1 |0 + \xC1\x92 |0 + \xC1\x93 |0 + \xC1\x94 |0 + \xC1\x95 |0 + \xC1\x96 |0 + \xCF\xE8 |0 + \xF4\xE2 |0 + \xC1\x97 |0 + \xC1\x98 |0 + \xC7\xCC |0 + \xC1\x99 |0 + \xC1\x9A |0 + \xC1\x9B |0 + \xC1\x9C |0 + \xC1\x9D |0 + \xC1\x9E |0 + \xB5\xD4 |0 + \xB4\xE4 |0 + \xF4\xE4 |0 + \xC1\x9F |0 + \xC1\xA0 |0 + \xC2\x40 |0 + \xF4\xE3 |0 + \xF4\xE5 |0 + \xC2\x41 |0 + \xC2\x42 |0 + \xF4\xE6 |0 + \xC2\x43 |0 + \xC2\x44 |0 + \xC2\x45 |0 + \xC2\x46 |0 + \xF4\xE7 |0 + \xC2\x47 |0 + \xBA\xB2 |0 + \xB0\xBF |0 + \xC2\x48 |0 + \xF4\xE8 |0 + \xC2\x49 |0 + \xC2\x4A |0 + \xC2\x4B |0 + \xC2\x4C |0 + \xC2\x4D |0 + \xC2\x4E |0 + \xC2\x4F |0 + \xB7\xAD |0 + \xD2\xED |0 + \xC2\x50 |0 + \xC2\x51 |0 + \xC2\x52 |0 + \xD2\xAB |0 + \xC0\xCF |0 + \xC2\x53 |0 + \xBF\xBC |0 + \xEB\xA3 |0 + \xD5\xDF |0 + \xEA\xC8 |0 + \xC2\x54 |0 + \xC2\x55 |0 + \xC2\x56 |0 + \xC2\x57 |0 + \xF1\xF3 |0 + \xB6\xF8 |0 + \xCB\xA3 |0 + \xC2\x58 |0 + \xC2\x59 |0 + \xC4\xCD |0 + \xC2\x5A |0 + \xF1\xE7 |0 + \xC2\x5B |0 + \xF1\xE8 |0 + \xB8\xFB |0 + \xF1\xE9 |0 + \xBA\xC4 |0 + \xD4\xC5 |0 + \xB0\xD2 |0 + \xC2\x5C |0 + \xC2\x5D |0 + \xF1\xEA |0 + \xC2\x5E |0 + \xC2\x5F |0 + \xC2\x60 |0 + \xF1\xEB |0 + \xC2\x61 |0 + \xF1\xEC |0 + \xC2\x62 |0 + \xC2\x63 |0 + \xF1\xED |0 + \xF1\xEE |0 + \xF1\xEF |0 + \xF1\xF1 |0 + \xF1\xF0 |0 + \xC5\xD5 |0 + \xC2\x64 |0 + \xC2\x65 |0 + \xC2\x66 |0 + \xC2\x67 |0 + \xC2\x68 |0 + \xC2\x69 |0 + \xF1\xF2 |0 + \xC2\x6A |0 + \xB6\xFA |0 + \xC2\x6B |0 + \xF1\xF4 |0 + \xD2\xAE |0 + \xDE\xC7 |0 + \xCB\xCA |0 + \xC2\x6C |0 + \xC2\x6D |0 + \xB3\xDC |0 + \xC2\x6E |0 + \xB5\xA2 |0 + \xC2\x6F |0 + \xB9\xA2 |0 + \xC2\x70 |0 + \xC2\x71 |0 + \xC4\xF4 |0 + \xF1\xF5 |0 + \xC2\x72 |0 + \xC2\x73 |0 + \xF1\xF6 |0 + \xC2\x74 |0 + \xC2\x75 |0 + \xC2\x76 |0 + \xC1\xC4 |0 + \xC1\xFB |0 + \xD6\xB0 |0 + \xF1\xF7 |0 + \xC2\x77 |0 + \xC2\x78 |0 + \xC2\x79 |0 + \xC2\x7A |0 + \xF1\xF8 |0 + \xC2\x7B |0 + \xC1\xAA |0 + \xC2\x7C |0 + \xC2\x7D |0 + \xC2\x7E |0 + \xC6\xB8 |0 + \xC2\x80 |0 + \xBE\xDB |0 + \xC2\x81 |0 + \xC2\x82 |0 + \xC2\x83 |0 + \xC2\x84 |0 + \xC2\x85 |0 + \xC2\x86 |0 + \xC2\x87 |0 + \xC2\x88 |0 + \xC2\x89 |0 + \xC2\x8A |0 + \xC2\x8B |0 + \xC2\x8C |0 + \xC2\x8D |0 + \xC2\x8E |0 + \xF1\xF9 |0 + \xB4\xCF |0 + \xC2\x8F |0 + \xC2\x90 |0 + \xC2\x91 |0 + \xC2\x92 |0 + \xC2\x93 |0 + \xC2\x94 |0 + \xF1\xFA |0 + \xC2\x95 |0 + \xC2\x96 |0 + \xC2\x97 |0 + \xC2\x98 |0 + \xC2\x99 |0 + \xC2\x9A |0 + \xC2\x9B |0 + \xC2\x9C |0 + \xC2\x9D |0 + \xC2\x9E |0 + \xC2\x9F |0 + \xC2\xA0 |0 + \xC3\x40 |0 + \xED\xB2 |0 + \xED\xB1 |0 + \xC3\x41 |0 + \xC3\x42 |0 + \xCB\xE0 |0 + \xD2\xDE |0 + \xC3\x43 |0 + \xCB\xC1 |0 + \xD5\xD8 |0 + \xC3\x44 |0 + \xC8\xE2 |0 + \xC3\x45 |0 + \xC0\xDF |0 + \xBC\xA1 |0 + \xC3\x46 |0 + \xC3\x47 |0 + \xC3\x48 |0 + \xC3\x49 |0 + \xC3\x4A |0 + \xC3\x4B |0 + \xEB\xC1 |0 + \xC3\x4C |0 + \xC3\x4D |0 + \xD0\xA4 |0 + \xC3\x4E |0 + \xD6\xE2 |0 + \xC3\x4F |0 + \xB6\xC7 |0 + \xB8\xD8 |0 + \xEB\xC0 |0 + \xB8\xCE |0 + \xC3\x50 |0 + \xEB\xBF |0 + \xB3\xA6 |0 + \xB9\xC9 |0 + \xD6\xAB |0 + \xC3\x51 |0 + \xB7\xF4 |0 + \xB7\xCA |0 + \xC3\x52 |0 + \xC3\x53 |0 + \xC3\x54 |0 + \xBC\xE7 |0 + \xB7\xBE |0 + \xEB\xC6 |0 + \xC3\x55 |0 + \xEB\xC7 |0 + \xB0\xB9 |0 + \xBF\xCF |0 + \xC3\x56 |0 + \xEB\xC5 |0 + \xD3\xFD |0 + \xC3\x57 |0 + \xEB\xC8 |0 + \xC3\x58 |0 + \xC3\x59 |0 + \xEB\xC9 |0 + \xC3\x5A |0 + \xC3\x5B |0 + \xB7\xCE |0 + \xC3\x5C |0 + \xEB\xC2 |0 + \xEB\xC4 |0 + \xC9\xF6 |0 + \xD6\xD7 |0 + \xD5\xCD |0 + \xD0\xB2 |0 + \xEB\xCF |0 + \xCE\xB8 |0 + \xEB\xD0 |0 + \xC3\x5D |0 + \xB5\xA8 |0 + \xC3\x5E |0 + \xC3\x5F |0 + \xC3\x60 |0 + \xC3\x61 |0 + \xC3\x62 |0 + \xB1\xB3 |0 + \xEB\xD2 |0 + \xCC\xA5 |0 + \xC3\x63 |0 + \xC3\x64 |0 + \xC3\x65 |0 + \xC3\x66 |0 + \xC3\x67 |0 + \xC3\x68 |0 + \xC3\x69 |0 + \xC5\xD6 |0 + \xEB\xD3 |0 + \xC3\x6A |0 + \xEB\xD1 |0 + \xC5\xDF |0 + \xEB\xCE |0 + \xCA\xA4 |0 + \xEB\xD5 |0 + \xB0\xFB |0 + \xC3\x6B |0 + \xC3\x6C |0 + \xBA\xFA |0 + \xC3\x6D |0 + \xC3\x6E |0 + \xD8\xB7 |0 + \xF1\xE3 |0 + \xC3\x6F |0 + \xEB\xCA |0 + \xEB\xCB |0 + \xEB\xCC |0 + \xEB\xCD |0 + \xEB\xD6 |0 + \xE6\xC0 |0 + \xEB\xD9 |0 + \xC3\x70 |0 + \xBF\xE8 |0 + \xD2\xC8 |0 + \xEB\xD7 |0 + \xEB\xDC |0 + \xB8\xEC |0 + \xEB\xD8 |0 + \xC3\x71 |0 + \xBD\xBA |0 + \xC3\x72 |0 + \xD0\xD8 |0 + \xC3\x73 |0 + \xB0\xB7 |0 + \xC3\x74 |0 + \xEB\xDD |0 + \xC4\xDC |0 + \xC3\x75 |0 + \xC3\x76 |0 + \xC3\x77 |0 + \xC3\x78 |0 + \xD6\xAC |0 + \xC3\x79 |0 + \xC3\x7A |0 + \xC3\x7B |0 + \xB4\xE0 |0 + \xC3\x7C |0 + \xC3\x7D |0 + \xC2\xF6 |0 + \xBC\xB9 |0 + \xC3\x7E |0 + \xC3\x80 |0 + \xEB\xDA |0 + \xEB\xDB |0 + \xD4\xE0 |0 + \xC6\xEA |0 + \xC4\xD4 |0 + \xEB\xDF |0 + \xC5\xA7 |0 + \xD9\xF5 |0 + \xC3\x81 |0 + \xB2\xB1 |0 + \xC3\x82 |0 + \xEB\xE4 |0 + \xC3\x83 |0 + \xBD\xC5 |0 + \xC3\x84 |0 + \xC3\x85 |0 + \xC3\x86 |0 + \xEB\xE2 |0 + \xC3\x87 |0 + \xC3\x88 |0 + \xC3\x89 |0 + \xC3\x8A |0 + \xC3\x8B |0 + \xC3\x8C |0 + \xC3\x8D |0 + \xC3\x8E |0 + \xC3\x8F |0 + \xC3\x90 |0 + \xC3\x91 |0 + \xC3\x92 |0 + \xC3\x93 |0 + \xEB\xE3 |0 + \xC3\x94 |0 + \xC3\x95 |0 + \xB8\xAC |0 + \xC3\x96 |0 + \xCD\xD1 |0 + \xEB\xE5 |0 + \xC3\x97 |0 + \xC3\x98 |0 + \xC3\x99 |0 + \xEB\xE1 |0 + \xC3\x9A |0 + \xC1\xB3 |0 + \xC3\x9B |0 + \xC3\x9C |0 + \xC3\x9D |0 + \xC3\x9E |0 + \xC3\x9F |0 + \xC6\xA2 |0 + \xC3\xA0 |0 + \xC4\x40 |0 + \xC4\x41 |0 + \xC4\x42 |0 + \xC4\x43 |0 + \xC4\x44 |0 + \xC4\x45 |0 + \xCC\xF3 |0 + \xC4\x46 |0 + \xEB\xE6 |0 + \xC4\x47 |0 + \xC0\xB0 |0 + \xD2\xB8 |0 + \xEB\xE7 |0 + \xC4\x48 |0 + \xC4\x49 |0 + \xC4\x4A |0 + \xB8\xAF |0 + \xB8\xAD |0 + \xC4\x4B |0 + \xEB\xE8 |0 + \xC7\xBB |0 + \xCD\xF3 |0 + \xC4\x4C |0 + \xC4\x4D |0 + \xC4\x4E |0 + \xEB\xEA |0 + \xEB\xEB |0 + \xC4\x4F |0 + \xC4\x50 |0 + \xC4\x51 |0 + \xC4\x52 |0 + \xC4\x53 |0 + \xEB\xED |0 + \xC4\x54 |0 + \xC4\x55 |0 + \xC4\x56 |0 + \xC4\x57 |0 + \xD0\xC8 |0 + \xC4\x58 |0 + \xEB\xF2 |0 + \xC4\x59 |0 + \xEB\xEE |0 + \xC4\x5A |0 + \xC4\x5B |0 + \xC4\x5C |0 + \xEB\xF1 |0 + \xC8\xF9 |0 + \xC4\x5D |0 + \xD1\xFC |0 + \xEB\xEC |0 + \xC4\x5E |0 + \xC4\x5F |0 + \xEB\xE9 |0 + \xC4\x60 |0 + \xC4\x61 |0 + \xC4\x62 |0 + \xC4\x63 |0 + \xB8\xB9 |0 + \xCF\xD9 |0 + \xC4\xE5 |0 + \xEB\xEF |0 + \xEB\xF0 |0 + \xCC\xDA |0 + \xCD\xC8 |0 + \xB0\xF2 |0 + \xC4\x64 |0 + \xEB\xF6 |0 + \xC4\x65 |0 + \xC4\x66 |0 + \xC4\x67 |0 + \xC4\x68 |0 + \xC4\x69 |0 + \xEB\xF5 |0 + \xC4\x6A |0 + \xB2\xB2 |0 + \xC4\x6B |0 + \xC4\x6C |0 + \xC4\x6D |0 + \xC4\x6E |0 + \xB8\xE0 |0 + \xC4\x6F |0 + \xEB\xF7 |0 + \xC4\x70 |0 + \xC4\x71 |0 + \xC4\x72 |0 + \xC4\x73 |0 + \xC4\x74 |0 + \xC4\x75 |0 + \xB1\xEC |0 + \xC4\x76 |0 + \xC4\x77 |0 + \xCC\xC5 |0 + \xC4\xA4 |0 + \xCF\xA5 |0 + \xC4\x78 |0 + \xC4\x79 |0 + \xC4\x7A |0 + \xC4\x7B |0 + \xC4\x7C |0 + \xEB\xF9 |0 + \xC4\x7D |0 + \xC4\x7E |0 + \xEC\xA2 |0 + \xC4\x80 |0 + \xC5\xF2 |0 + \xC4\x81 |0 + \xEB\xFA |0 + \xC4\x82 |0 + \xC4\x83 |0 + \xC4\x84 |0 + \xC4\x85 |0 + \xC4\x86 |0 + \xC4\x87 |0 + \xC4\x88 |0 + \xC4\x89 |0 + \xC9\xC5 |0 + \xC4\x8A |0 + \xC4\x8B |0 + \xC4\x8C |0 + \xC4\x8D |0 + \xC4\x8E |0 + \xC4\x8F |0 + \xE2\xDF |0 + \xEB\xFE |0 + \xC4\x90 |0 + \xC4\x91 |0 + \xC4\x92 |0 + \xC4\x93 |0 + \xCD\xCE |0 + \xEC\xA1 |0 + \xB1\xDB |0 + \xD3\xB7 |0 + \xC4\x94 |0 + \xC4\x95 |0 + \xD2\xDC |0 + \xC4\x96 |0 + \xC4\x97 |0 + \xC4\x98 |0 + \xEB\xFD |0 + \xC4\x99 |0 + \xEB\xFB |0 + \xC4\x9A |0 + \xC4\x9B |0 + \xC4\x9C |0 + \xC4\x9D |0 + \xC4\x9E |0 + \xC4\x9F |0 + \xC4\xA0 |0 + \xC5\x40 |0 + \xC5\x41 |0 + \xC5\x42 |0 + \xC5\x43 |0 + \xC5\x44 |0 + \xC5\x45 |0 + \xC5\x46 |0 + \xC5\x47 |0 + \xC5\x48 |0 + \xC5\x49 |0 + \xC5\x4A |0 + \xC5\x4B |0 + \xC5\x4C |0 + \xC5\x4D |0 + \xC5\x4E |0 + \xB3\xBC |0 + \xC5\x4F |0 + \xC5\x50 |0 + \xC5\x51 |0 + \xEA\xB0 |0 + \xC5\x52 |0 + \xC5\x53 |0 + \xD7\xD4 |0 + \xC5\x54 |0 + \xF4\xAB |0 + \xB3\xF4 |0 + \xC5\x55 |0 + \xC5\x56 |0 + \xC5\x57 |0 + \xC5\x58 |0 + \xC5\x59 |0 + \xD6\xC1 |0 + \xD6\xC2 |0 + \xC5\x5A |0 + \xC5\x5B |0 + \xC5\x5C |0 + \xC5\x5D |0 + \xC5\x5E |0 + \xC5\x5F |0 + \xD5\xE9 |0 + \xBE\xCA |0 + \xC5\x60 |0 + \xF4\xA7 |0 + \xC5\x61 |0 + \xD2\xA8 |0 + \xF4\xA8 |0 + \xF4\xA9 |0 + \xC5\x62 |0 + \xF4\xAA |0 + \xBE\xCB |0 + \xD3\xDF |0 + \xC5\x63 |0 + \xC5\x64 |0 + \xC5\x65 |0 + \xC5\x66 |0 + \xC5\x67 |0 + \xC9\xE0 |0 + \xC9\xE1 |0 + \xC5\x68 |0 + \xC5\x69 |0 + \xF3\xC2 |0 + \xC5\x6A |0 + \xCA\xE6 |0 + \xC5\x6B |0 + \xCC\xF2 |0 + \xC5\x6C |0 + \xC5\x6D |0 + \xC5\x6E |0 + \xC5\x6F |0 + \xC5\x70 |0 + \xC5\x71 |0 + \xE2\xB6 |0 + \xCB\xB4 |0 + \xC5\x72 |0 + \xCE\xE8 |0 + \xD6\xDB |0 + \xC5\x73 |0 + \xF4\xAD |0 + \xF4\xAE |0 + \xF4\xAF |0 + \xC5\x74 |0 + \xC5\x75 |0 + \xC5\x76 |0 + \xC5\x77 |0 + \xF4\xB2 |0 + \xC5\x78 |0 + \xBA\xBD |0 + \xF4\xB3 |0 + \xB0\xE3 |0 + \xF4\xB0 |0 + \xC5\x79 |0 + \xF4\xB1 |0 + \xBD\xA2 |0 + \xB2\xD5 |0 + \xC5\x7A |0 + \xF4\xB6 |0 + \xF4\xB7 |0 + \xB6\xE6 |0 + \xB2\xB0 |0 + \xCF\xCF |0 + \xF4\xB4 |0 + \xB4\xAC |0 + \xC5\x7B |0 + \xF4\xB5 |0 + \xC5\x7C |0 + \xC5\x7D |0 + \xF4\xB8 |0 + \xC5\x7E |0 + \xC5\x80 |0 + \xC5\x81 |0 + \xC5\x82 |0 + \xC5\x83 |0 + \xF4\xB9 |0 + \xC5\x84 |0 + \xC5\x85 |0 + \xCD\xA7 |0 + \xC5\x86 |0 + \xF4\xBA |0 + \xC5\x87 |0 + \xF4\xBB |0 + \xC5\x88 |0 + \xC5\x89 |0 + \xC5\x8A |0 + \xF4\xBC |0 + \xC5\x8B |0 + \xC5\x8C |0 + \xC5\x8D |0 + \xC5\x8E |0 + \xC5\x8F |0 + \xC5\x90 |0 + \xC5\x91 |0 + \xC5\x92 |0 + \xCB\xD2 |0 + \xC5\x93 |0 + \xF4\xBD |0 + \xC5\x94 |0 + \xC5\x95 |0 + \xC5\x96 |0 + \xC5\x97 |0 + \xF4\xBE |0 + \xC5\x98 |0 + \xC5\x99 |0 + \xC5\x9A |0 + \xC5\x9B |0 + \xC5\x9C |0 + \xC5\x9D |0 + \xC5\x9E |0 + \xC5\x9F |0 + \xF4\xBF |0 + \xC5\xA0 |0 + \xC6\x40 |0 + \xC6\x41 |0 + \xC6\x42 |0 + \xC6\x43 |0 + \xF4\xDE |0 + \xC1\xBC |0 + \xBC\xE8 |0 + \xC6\x44 |0 + \xC9\xAB |0 + \xD1\xDE |0 + \xE5\xF5 |0 + \xC6\x45 |0 + \xC6\x46 |0 + \xC6\x47 |0 + \xC6\x48 |0 + \xDC\xB3 |0 + \xD2\xD5 |0 + \xC6\x49 |0 + \xC6\x4A |0 + \xDC\xB4 |0 + \xB0\xAC |0 + \xDC\xB5 |0 + \xC6\x4B |0 + \xC6\x4C |0 + \xBD\xDA |0 + \xC6\x4D |0 + \xDC\xB9 |0 + \xC6\x4E |0 + \xC6\x4F |0 + \xC6\x50 |0 + \xD8\xC2 |0 + \xC6\x51 |0 + \xDC\xB7 |0 + \xD3\xF3 |0 + \xC6\x52 |0 + \xC9\xD6 |0 + \xDC\xBA |0 + \xDC\xB6 |0 + \xC6\x53 |0 + \xDC\xBB |0 + \xC3\xA2 |0 + \xC6\x54 |0 + \xC6\x55 |0 + \xC6\x56 |0 + \xC6\x57 |0 + \xDC\xBC |0 + \xDC\xC5 |0 + \xDC\xBD |0 + \xC6\x58 |0 + \xC6\x59 |0 + \xCE\xDF |0 + \xD6\xA5 |0 + \xC6\x5A |0 + \xDC\xCF |0 + \xC6\x5B |0 + \xDC\xCD |0 + \xC6\x5C |0 + \xC6\x5D |0 + \xDC\xD2 |0 + \xBD\xE6 |0 + \xC2\xAB |0 + \xC6\x5E |0 + \xDC\xB8 |0 + \xDC\xCB |0 + \xDC\xCE |0 + \xDC\xBE |0 + \xB7\xD2 |0 + \xB0\xC5 |0 + \xDC\xC7 |0 + \xD0\xBE |0 + \xDC\xC1 |0 + \xBB\xA8 |0 + \xC6\x5F |0 + \xB7\xBC |0 + \xDC\xCC |0 + \xC6\x60 |0 + \xC6\x61 |0 + \xDC\xC6 |0 + \xDC\xBF |0 + \xC7\xDB |0 + \xC6\x62 |0 + \xC6\x63 |0 + \xC6\x64 |0 + \xD1\xBF |0 + \xDC\xC0 |0 + \xC6\x65 |0 + \xC6\x66 |0 + \xDC\xCA |0 + \xC6\x67 |0 + \xC6\x68 |0 + \xDC\xD0 |0 + \xC6\x69 |0 + \xC6\x6A |0 + \xCE\xAD |0 + \xDC\xC2 |0 + \xC6\x6B |0 + \xDC\xC3 |0 + \xDC\xC8 |0 + \xDC\xC9 |0 + \xB2\xD4 |0 + \xDC\xD1 |0 + \xCB\xD5 |0 + \xC6\x6C |0 + \xD4\xB7 |0 + \xDC\xDB |0 + \xDC\xDF |0 + \xCC\xA6 |0 + \xDC\xE6 |0 + \xC6\x6D |0 + \xC3\xE7 |0 + \xDC\xDC |0 + \xC6\x6E |0 + \xC6\x6F |0 + \xBF\xC1 |0 + \xDC\xD9 |0 + \xC6\x70 |0 + \xB0\xFA |0 + \xB9\xB6 |0 + \xDC\xE5 |0 + \xDC\xD3 |0 + \xC6\x71 |0 + \xDC\xC4 |0 + \xDC\xD6 |0 + \xC8\xF4 |0 + \xBF\xE0 |0 + \xC6\x72 |0 + \xC6\x73 |0 + \xC6\x74 |0 + \xC6\x75 |0 + \xC9\xBB |0 + \xC6\x76 |0 + \xC6\x77 |0 + \xC6\x78 |0 + \xB1\xBD |0 + \xC6\x79 |0 + \xD3\xA2 |0 + \xC6\x7A |0 + \xC6\x7B |0 + \xDC\xDA |0 + \xC6\x7C |0 + \xC6\x7D |0 + \xDC\xD5 |0 + \xC6\x7E |0 + \xC6\xBB |0 + \xC6\x80 |0 + \xDC\xDE |0 + \xC6\x81 |0 + \xC6\x82 |0 + \xC6\x83 |0 + \xC6\x84 |0 + \xC6\x85 |0 + \xD7\xC2 |0 + \xC3\xAF |0 + \xB7\xB6 |0 + \xC7\xD1 |0 + \xC3\xA9 |0 + \xDC\xE2 |0 + \xDC\xD8 |0 + \xDC\xEB |0 + \xDC\xD4 |0 + \xC6\x86 |0 + \xC6\x87 |0 + \xDC\xDD |0 + \xC6\x88 |0 + \xBE\xA5 |0 + \xDC\xD7 |0 + \xC6\x89 |0 + \xDC\xE0 |0 + \xC6\x8A |0 + \xC6\x8B |0 + \xDC\xE3 |0 + \xDC\xE4 |0 + \xC6\x8C |0 + \xDC\xF8 |0 + \xC6\x8D |0 + \xC6\x8E |0 + \xDC\xE1 |0 + \xDD\xA2 |0 + \xDC\xE7 |0 + \xC6\x8F |0 + \xC6\x90 |0 + \xC6\x91 |0 + \xC6\x92 |0 + \xC6\x93 |0 + \xC6\x94 |0 + \xC6\x95 |0 + \xC6\x96 |0 + \xC6\x97 |0 + \xC6\x98 |0 + \xBC\xEB |0 + \xB4\xC4 |0 + \xC6\x99 |0 + \xC6\x9A |0 + \xC3\xA3 |0 + \xB2\xE7 |0 + \xDC\xFA |0 + \xC6\x9B |0 + \xDC\xF2 |0 + \xC6\x9C |0 + \xDC\xEF |0 + \xC6\x9D |0 + \xDC\xFC |0 + \xDC\xEE |0 + \xD2\xF0 |0 + \xB2\xE8 |0 + \xC6\x9E |0 + \xC8\xD7 |0 + \xC8\xE3 |0 + \xDC\xFB |0 + \xC6\x9F |0 + \xDC\xED |0 + \xC6\xA0 |0 + \xC7\x40 |0 + \xC7\x41 |0 + \xDC\xF7 |0 + \xC7\x42 |0 + \xC7\x43 |0 + \xDC\xF5 |0 + \xC7\x44 |0 + \xC7\x45 |0 + \xBE\xA3 |0 + \xDC\xF4 |0 + \xC7\x46 |0 + \xB2\xDD |0 + \xC7\x47 |0 + \xC7\x48 |0 + \xC7\x49 |0 + \xC7\x4A |0 + \xC7\x4B |0 + \xDC\xF3 |0 + \xBC\xF6 |0 + \xDC\xE8 |0 + \xBB\xC4 |0 + \xC7\x4C |0 + \xC0\xF3 |0 + \xC7\x4D |0 + \xC7\x4E |0 + \xC7\x4F |0 + \xC7\x50 |0 + \xC7\x51 |0 + \xBC\xD4 |0 + \xDC\xE9 |0 + \xDC\xEA |0 + \xC7\x52 |0 + \xDC\xF1 |0 + \xDC\xF6 |0 + \xDC\xF9 |0 + \xB5\xB4 |0 + \xC7\x53 |0 + \xC8\xD9 |0 + \xBB\xE7 |0 + \xDC\xFE |0 + \xDC\xFD |0 + \xD3\xAB |0 + \xDD\xA1 |0 + \xDD\xA3 |0 + \xDD\xA5 |0 + \xD2\xF1 |0 + \xDD\xA4 |0 + \xDD\xA6 |0 + \xDD\xA7 |0 + \xD2\xA9 |0 + \xC7\x54 |0 + \xC7\x55 |0 + \xC7\x56 |0 + \xC7\x57 |0 + \xC7\x58 |0 + \xC7\x59 |0 + \xC7\x5A |0 + \xBA\xC9 |0 + \xDD\xA9 |0 + \xC7\x5B |0 + \xC7\x5C |0 + \xDD\xB6 |0 + \xDD\xB1 |0 + \xDD\xB4 |0 + \xC7\x5D |0 + \xC7\x5E |0 + \xC7\x5F |0 + \xC7\x60 |0 + \xC7\x61 |0 + \xC7\x62 |0 + \xC7\x63 |0 + \xDD\xB0 |0 + \xC6\xCE |0 + \xC7\x64 |0 + \xC7\x65 |0 + \xC0\xF2 |0 + \xC7\x66 |0 + \xC7\x67 |0 + \xC7\x68 |0 + \xC7\x69 |0 + \xC9\xAF |0 + \xC7\x6A |0 + \xC7\x6B |0 + \xC7\x6C |0 + \xDC\xEC |0 + \xDD\xAE |0 + \xC7\x6D |0 + \xC7\x6E |0 + \xC7\x6F |0 + \xC7\x70 |0 + \xDD\xB7 |0 + \xC7\x71 |0 + \xC7\x72 |0 + \xDC\xF0 |0 + \xDD\xAF |0 + \xC7\x73 |0 + \xDD\xB8 |0 + \xC7\x74 |0 + \xDD\xAC |0 + \xC7\x75 |0 + \xC7\x76 |0 + \xC7\x77 |0 + \xC7\x78 |0 + \xC7\x79 |0 + \xC7\x7A |0 + \xC7\x7B |0 + \xDD\xB9 |0 + \xDD\xB3 |0 + \xDD\xAD |0 + \xC4\xAA |0 + \xC7\x7C |0 + \xC7\x7D |0 + \xC7\x7E |0 + \xC7\x80 |0 + \xDD\xA8 |0 + \xC0\xB3 |0 + \xC1\xAB |0 + \xDD\xAA |0 + \xDD\xAB |0 + \xC7\x81 |0 + \xDD\xB2 |0 + \xBB\xF1 |0 + \xDD\xB5 |0 + \xD3\xA8 |0 + \xDD\xBA |0 + \xC7\x82 |0 + \xDD\xBB |0 + \xC3\xA7 |0 + \xC7\x83 |0 + \xC7\x84 |0 + \xDD\xD2 |0 + \xDD\xBC |0 + \xC7\x85 |0 + \xC7\x86 |0 + \xC7\x87 |0 + \xDD\xD1 |0 + \xC7\x88 |0 + \xB9\xBD |0 + \xC7\x89 |0 + \xC7\x8A |0 + \xBE\xD5 |0 + \xC7\x8B |0 + \xBE\xFA |0 + \xC7\x8C |0 + \xC7\x8D |0 + \xBA\xCA |0 + \xC7\x8E |0 + \xC7\x8F |0 + \xC7\x90 |0 + \xC7\x91 |0 + \xDD\xCA |0 + \xC7\x92 |0 + \xDD\xC5 |0 + \xC7\x93 |0 + \xDD\xBF |0 + \xC7\x94 |0 + \xC7\x95 |0 + \xC7\x96 |0 + \xB2\xCB |0 + \xDD\xC3 |0 + \xC7\x97 |0 + \xDD\xCB |0 + \xB2\xA4 |0 + \xDD\xD5 |0 + \xC7\x98 |0 + \xC7\x99 |0 + \xC7\x9A |0 + \xDD\xBE |0 + \xC7\x9B |0 + \xC7\x9C |0 + \xC7\x9D |0 + \xC6\xD0 |0 + \xDD\xD0 |0 + \xC7\x9E |0 + \xC7\x9F |0 + \xC7\xA0 |0 + \xC8\x40 |0 + \xC8\x41 |0 + \xDD\xD4 |0 + \xC1\xE2 |0 + \xB7\xC6 |0 + \xC8\x42 |0 + \xC8\x43 |0 + \xC8\x44 |0 + \xC8\x45 |0 + \xC8\x46 |0 + \xDD\xCE |0 + \xDD\xCF |0 + \xC8\x47 |0 + \xC8\x48 |0 + \xC8\x49 |0 + \xDD\xC4 |0 + \xC8\x4A |0 + \xC8\x4B |0 + \xC8\x4C |0 + \xDD\xBD |0 + \xC8\x4D |0 + \xDD\xCD |0 + \xCC\xD1 |0 + \xC8\x4E |0 + \xDD\xC9 |0 + \xC8\x4F |0 + \xC8\x50 |0 + \xC8\x51 |0 + \xC8\x52 |0 + \xDD\xC2 |0 + \xC3\xC8 |0 + \xC6\xBC |0 + \xCE\xAE |0 + \xDD\xCC |0 + \xC8\x53 |0 + \xDD\xC8 |0 + \xC8\x54 |0 + \xC8\x55 |0 + \xC8\x56 |0 + \xC8\x57 |0 + \xC8\x58 |0 + \xC8\x59 |0 + \xDD\xC1 |0 + \xC8\x5A |0 + \xC8\x5B |0 + \xC8\x5C |0 + \xDD\xC6 |0 + \xC2\xDC |0 + \xC8\x5D |0 + \xC8\x5E |0 + \xC8\x5F |0 + \xC8\x60 |0 + \xC8\x61 |0 + \xC8\x62 |0 + \xD3\xA9 |0 + \xD3\xAA |0 + \xDD\xD3 |0 + \xCF\xF4 |0 + \xC8\xF8 |0 + \xC8\x63 |0 + \xC8\x64 |0 + \xC8\x65 |0 + \xC8\x66 |0 + \xC8\x67 |0 + \xC8\x68 |0 + \xC8\x69 |0 + \xC8\x6A |0 + \xDD\xE6 |0 + \xC8\x6B |0 + \xC8\x6C |0 + \xC8\x6D |0 + \xC8\x6E |0 + \xC8\x6F |0 + \xC8\x70 |0 + \xDD\xC7 |0 + \xC8\x71 |0 + \xC8\x72 |0 + \xC8\x73 |0 + \xDD\xE0 |0 + \xC2\xE4 |0 + \xC8\x74 |0 + \xC8\x75 |0 + \xC8\x76 |0 + \xC8\x77 |0 + \xC8\x78 |0 + \xC8\x79 |0 + \xC8\x7A |0 + \xC8\x7B |0 + \xDD\xE1 |0 + \xC8\x7C |0 + \xC8\x7D |0 + \xC8\x7E |0 + \xC8\x80 |0 + \xC8\x81 |0 + \xC8\x82 |0 + \xC8\x83 |0 + \xC8\x84 |0 + \xC8\x85 |0 + \xC8\x86 |0 + \xDD\xD7 |0 + \xC8\x87 |0 + \xC8\x88 |0 + \xC8\x89 |0 + \xC8\x8A |0 + \xC8\x8B |0 + \xD6\xF8 |0 + \xC8\x8C |0 + \xDD\xD9 |0 + \xDD\xD8 |0 + \xB8\xF0 |0 + \xDD\xD6 |0 + \xC8\x8D |0 + \xC8\x8E |0 + \xC8\x8F |0 + \xC8\x90 |0 + \xC6\xCF |0 + \xC8\x91 |0 + \xB6\xAD |0 + \xC8\x92 |0 + \xC8\x93 |0 + \xC8\x94 |0 + \xC8\x95 |0 + \xC8\x96 |0 + \xDD\xE2 |0 + \xC8\x97 |0 + \xBA\xF9 |0 + \xD4\xE1 |0 + \xDD\xE7 |0 + \xC8\x98 |0 + \xC8\x99 |0 + \xC8\x9A |0 + \xB4\xD0 |0 + \xC8\x9B |0 + \xDD\xDA |0 + \xC8\x9C |0 + \xBF\xFB |0 + \xDD\xE3 |0 + \xC8\x9D |0 + \xDD\xDF |0 + \xC8\x9E |0 + \xDD\xDD |0 + \xC8\x9F |0 + \xC8\xA0 |0 + \xC9\x40 |0 + \xC9\x41 |0 + \xC9\x42 |0 + \xC9\x43 |0 + \xC9\x44 |0 + \xB5\xD9 |0 + \xC9\x45 |0 + \xC9\x46 |0 + \xC9\x47 |0 + \xC9\x48 |0 + \xDD\xDB |0 + \xDD\xDC |0 + \xDD\xDE |0 + \xC9\x49 |0 + \xBD\xAF |0 + \xDD\xE4 |0 + \xC9\x4A |0 + \xDD\xE5 |0 + \xC9\x4B |0 + \xC9\x4C |0 + \xC9\x4D |0 + \xC9\x4E |0 + \xC9\x4F |0 + \xC9\x50 |0 + \xC9\x51 |0 + \xC9\x52 |0 + \xDD\xF5 |0 + \xC9\x53 |0 + \xC3\xC9 |0 + \xC9\x54 |0 + \xC9\x55 |0 + \xCB\xE2 |0 + \xC9\x56 |0 + \xC9\x57 |0 + \xC9\x58 |0 + \xC9\x59 |0 + \xDD\xF2 |0 + \xC9\x5A |0 + \xC9\x5B |0 + \xC9\x5C |0 + \xC9\x5D |0 + \xC9\x5E |0 + \xC9\x5F |0 + \xC9\x60 |0 + \xC9\x61 |0 + \xC9\x62 |0 + \xC9\x63 |0 + \xC9\x64 |0 + \xC9\x65 |0 + \xC9\x66 |0 + \xD8\xE1 |0 + \xC9\x67 |0 + \xC9\x68 |0 + \xC6\xD1 |0 + \xC9\x69 |0 + \xDD\xF4 |0 + \xC9\x6A |0 + \xC9\x6B |0 + \xC9\x6C |0 + \xD5\xF4 |0 + \xDD\xF3 |0 + \xDD\xF0 |0 + \xC9\x6D |0 + \xC9\x6E |0 + \xDD\xEC |0 + \xC9\x6F |0 + \xDD\xEF |0 + \xC9\x70 |0 + \xDD\xE8 |0 + \xC9\x71 |0 + \xC9\x72 |0 + \xD0\xEE |0 + \xC9\x73 |0 + \xC9\x74 |0 + \xC9\x75 |0 + \xC9\x76 |0 + \xC8\xD8 |0 + \xDD\xEE |0 + \xC9\x77 |0 + \xC9\x78 |0 + \xDD\xE9 |0 + \xC9\x79 |0 + \xC9\x7A |0 + \xDD\xEA |0 + \xCB\xF2 |0 + \xC9\x7B |0 + \xDD\xED |0 + \xC9\x7C |0 + \xC9\x7D |0 + \xB1\xCD |0 + \xC9\x7E |0 + \xC9\x80 |0 + \xC9\x81 |0 + \xC9\x82 |0 + \xC9\x83 |0 + \xC9\x84 |0 + \xC0\xB6 |0 + \xC9\x85 |0 + \xBC\xBB |0 + \xDD\xF1 |0 + \xC9\x86 |0 + \xC9\x87 |0 + \xDD\xF7 |0 + \xC9\x88 |0 + \xDD\xF6 |0 + \xDD\xEB |0 + \xC9\x89 |0 + \xC9\x8A |0 + \xC9\x8B |0 + \xC9\x8C |0 + \xC9\x8D |0 + \xC5\xEE |0 + \xC9\x8E |0 + \xC9\x8F |0 + \xC9\x90 |0 + \xDD\xFB |0 + \xC9\x91 |0 + \xC9\x92 |0 + \xC9\x93 |0 + \xC9\x94 |0 + \xC9\x95 |0 + \xC9\x96 |0 + \xC9\x97 |0 + \xC9\x98 |0 + \xC9\x99 |0 + \xC9\x9A |0 + \xC9\x9B |0 + \xDE\xA4 |0 + \xC9\x9C |0 + \xC9\x9D |0 + \xDE\xA3 |0 + \xC9\x9E |0 + \xC9\x9F |0 + \xC9\xA0 |0 + \xCA\x40 |0 + \xCA\x41 |0 + \xCA\x42 |0 + \xCA\x43 |0 + \xCA\x44 |0 + \xCA\x45 |0 + \xCA\x46 |0 + \xCA\x47 |0 + \xCA\x48 |0 + \xDD\xF8 |0 + \xCA\x49 |0 + \xCA\x4A |0 + \xCA\x4B |0 + \xCA\x4C |0 + \xC3\xEF |0 + \xCA\x4D |0 + \xC2\xFB |0 + \xCA\x4E |0 + \xCA\x4F |0 + \xCA\x50 |0 + \xD5\xE1 |0 + \xCA\x51 |0 + \xCA\x52 |0 + \xCE\xB5 |0 + \xCA\x53 |0 + \xCA\x54 |0 + \xCA\x55 |0 + \xCA\x56 |0 + \xDD\xFD |0 + \xCA\x57 |0 + \xB2\xCC |0 + \xCA\x58 |0 + \xCA\x59 |0 + \xCA\x5A |0 + \xCA\x5B |0 + \xCA\x5C |0 + \xCA\x5D |0 + \xCA\x5E |0 + \xCA\x5F |0 + \xCA\x60 |0 + \xC4\xE8 |0 + \xCA\xDF |0 + \xCA\x61 |0 + \xCA\x62 |0 + \xCA\x63 |0 + \xCA\x64 |0 + \xCA\x65 |0 + \xCA\x66 |0 + \xCA\x67 |0 + \xCA\x68 |0 + \xCA\x69 |0 + \xCA\x6A |0 + \xC7\xBE |0 + \xDD\xFA |0 + \xDD\xFC |0 + \xDD\xFE |0 + \xDE\xA2 |0 + \xB0\xAA |0 + \xB1\xCE |0 + \xCA\x6B |0 + \xCA\x6C |0 + \xCA\x6D |0 + \xCA\x6E |0 + \xCA\x6F |0 + \xDE\xAC |0 + \xCA\x70 |0 + \xCA\x71 |0 + \xCA\x72 |0 + \xCA\x73 |0 + \xDE\xA6 |0 + \xBD\xB6 |0 + \xC8\xEF |0 + \xCA\x74 |0 + \xCA\x75 |0 + \xCA\x76 |0 + \xCA\x77 |0 + \xCA\x78 |0 + \xCA\x79 |0 + \xCA\x7A |0 + \xCA\x7B |0 + \xCA\x7C |0 + \xCA\x7D |0 + \xCA\x7E |0 + \xDE\xA1 |0 + \xCA\x80 |0 + \xCA\x81 |0 + \xDE\xA5 |0 + \xCA\x82 |0 + \xCA\x83 |0 + \xCA\x84 |0 + \xCA\x85 |0 + \xDE\xA9 |0 + \xCA\x86 |0 + \xCA\x87 |0 + \xCA\x88 |0 + \xCA\x89 |0 + \xCA\x8A |0 + \xDE\xA8 |0 + \xCA\x8B |0 + \xCA\x8C |0 + \xCA\x8D |0 + \xDE\xA7 |0 + \xCA\x8E |0 + \xCA\x8F |0 + \xCA\x90 |0 + \xCA\x91 |0 + \xCA\x92 |0 + \xCA\x93 |0 + \xCA\x94 |0 + \xCA\x95 |0 + \xCA\x96 |0 + \xDE\xAD |0 + \xCA\x97 |0 + \xD4\xCC |0 + \xCA\x98 |0 + \xCA\x99 |0 + \xCA\x9A |0 + \xCA\x9B |0 + \xDE\xB3 |0 + \xDE\xAA |0 + \xDE\xAE |0 + \xCA\x9C |0 + \xCA\x9D |0 + \xC0\xD9 |0 + \xCA\x9E |0 + \xCA\x9F |0 + \xCA\xA0 |0 + \xCB\x40 |0 + \xCB\x41 |0 + \xB1\xA1 |0 + \xDE\xB6 |0 + \xCB\x42 |0 + \xDE\xB1 |0 + \xCB\x43 |0 + \xCB\x44 |0 + \xCB\x45 |0 + \xCB\x46 |0 + \xCB\x47 |0 + \xCB\x48 |0 + \xCB\x49 |0 + \xDE\xB2 |0 + \xCB\x4A |0 + \xCB\x4B |0 + \xCB\x4C |0 + \xCB\x4D |0 + \xCB\x4E |0 + \xCB\x4F |0 + \xCB\x50 |0 + \xCB\x51 |0 + \xCB\x52 |0 + \xCB\x53 |0 + \xCB\x54 |0 + \xD1\xA6 |0 + \xDE\xB5 |0 + \xCB\x55 |0 + \xCB\x56 |0 + \xCB\x57 |0 + \xCB\x58 |0 + \xCB\x59 |0 + \xCB\x5A |0 + \xCB\x5B |0 + \xDE\xAF |0 + \xCB\x5C |0 + \xCB\x5D |0 + \xCB\x5E |0 + \xDE\xB0 |0 + \xCB\x5F |0 + \xD0\xBD |0 + \xCB\x60 |0 + \xCB\x61 |0 + \xCB\x62 |0 + \xDE\xB4 |0 + \xCA\xED |0 + \xDE\xB9 |0 + \xCB\x63 |0 + \xCB\x64 |0 + \xCB\x65 |0 + \xCB\x66 |0 + \xCB\x67 |0 + \xCB\x68 |0 + \xDE\xB8 |0 + \xCB\x69 |0 + \xDE\xB7 |0 + \xCB\x6A |0 + \xCB\x6B |0 + \xCB\x6C |0 + \xCB\x6D |0 + \xCB\x6E |0 + \xCB\x6F |0 + \xCB\x70 |0 + \xDE\xBB |0 + \xCB\x71 |0 + \xCB\x72 |0 + \xCB\x73 |0 + \xCB\x74 |0 + \xCB\x75 |0 + \xCB\x76 |0 + \xCB\x77 |0 + \xBD\xE5 |0 + \xCB\x78 |0 + \xCB\x79 |0 + \xCB\x7A |0 + \xCB\x7B |0 + \xCB\x7C |0 + \xB2\xD8 |0 + \xC3\xEA |0 + \xCB\x7D |0 + \xCB\x7E |0 + \xDE\xBA |0 + \xCB\x80 |0 + \xC5\xBA |0 + \xCB\x81 |0 + \xCB\x82 |0 + \xCB\x83 |0 + \xCB\x84 |0 + \xCB\x85 |0 + \xCB\x86 |0 + \xDE\xBC |0 + \xCB\x87 |0 + \xCB\x88 |0 + \xCB\x89 |0 + \xCB\x8A |0 + \xCB\x8B |0 + \xCB\x8C |0 + \xCB\x8D |0 + \xCC\xD9 |0 + \xCB\x8E |0 + \xCB\x8F |0 + \xCB\x90 |0 + \xCB\x91 |0 + \xB7\xAA |0 + \xCB\x92 |0 + \xCB\x93 |0 + \xCB\x94 |0 + \xCB\x95 |0 + \xCB\x96 |0 + \xCB\x97 |0 + \xCB\x98 |0 + \xCB\x99 |0 + \xCB\x9A |0 + \xCB\x9B |0 + \xCB\x9C |0 + \xCB\x9D |0 + \xCB\x9E |0 + \xCB\x9F |0 + \xCB\xA0 |0 + \xCC\x40 |0 + \xCC\x41 |0 + \xD4\xE5 |0 + \xCC\x42 |0 + \xCC\x43 |0 + \xCC\x44 |0 + \xDE\xBD |0 + \xCC\x45 |0 + \xCC\x46 |0 + \xCC\x47 |0 + \xCC\x48 |0 + \xCC\x49 |0 + \xDE\xBF |0 + \xCC\x4A |0 + \xCC\x4B |0 + \xCC\x4C |0 + \xCC\x4D |0 + \xCC\x4E |0 + \xCC\x4F |0 + \xCC\x50 |0 + \xCC\x51 |0 + \xCC\x52 |0 + \xCC\x53 |0 + \xCC\x54 |0 + \xC4\xA2 |0 + \xCC\x55 |0 + \xCC\x56 |0 + \xCC\x57 |0 + \xCC\x58 |0 + \xDE\xC1 |0 + \xCC\x59 |0 + \xCC\x5A |0 + \xCC\x5B |0 + \xCC\x5C |0 + \xCC\x5D |0 + \xCC\x5E |0 + \xCC\x5F |0 + \xCC\x60 |0 + \xCC\x61 |0 + \xCC\x62 |0 + \xCC\x63 |0 + \xCC\x64 |0 + \xCC\x65 |0 + \xCC\x66 |0 + \xCC\x67 |0 + \xCC\x68 |0 + \xDE\xBE |0 + \xCC\x69 |0 + \xDE\xC0 |0 + \xCC\x6A |0 + \xCC\x6B |0 + \xCC\x6C |0 + \xCC\x6D |0 + \xCC\x6E |0 + \xCC\x6F |0 + \xCC\x70 |0 + \xCC\x71 |0 + \xCC\x72 |0 + \xCC\x73 |0 + \xCC\x74 |0 + \xCC\x75 |0 + \xCC\x76 |0 + \xCC\x77 |0 + \xD5\xBA |0 + \xCC\x78 |0 + \xCC\x79 |0 + \xCC\x7A |0 + \xDE\xC2 |0 + \xCC\x7B |0 + \xCC\x7C |0 + \xCC\x7D |0 + \xCC\x7E |0 + \xCC\x80 |0 + \xCC\x81 |0 + \xCC\x82 |0 + \xCC\x83 |0 + \xCC\x84 |0 + \xCC\x85 |0 + \xCC\x86 |0 + \xCC\x87 |0 + \xCC\x88 |0 + \xCC\x89 |0 + \xCC\x8A |0 + \xCC\x8B |0 + \xF2\xAE |0 + \xBB\xA2 |0 + \xC2\xB2 |0 + \xC5\xB0 |0 + \xC2\xC7 |0 + \xCC\x8C |0 + \xCC\x8D |0 + \xF2\xAF |0 + \xCC\x8E |0 + \xCC\x8F |0 + \xCC\x90 |0 + \xCC\x91 |0 + \xCC\x92 |0 + \xD0\xE9 |0 + \xCC\x93 |0 + \xCC\x94 |0 + \xCC\x95 |0 + \xD3\xDD |0 + \xCC\x96 |0 + \xCC\x97 |0 + \xCC\x98 |0 + \xEB\xBD |0 + \xCC\x99 |0 + \xCC\x9A |0 + \xCC\x9B |0 + \xCC\x9C |0 + \xCC\x9D |0 + \xCC\x9E |0 + \xCC\x9F |0 + \xCC\xA0 |0 + \xB3\xE6 |0 + \xF2\xB0 |0 + \xCD\x40 |0 + \xF2\xB1 |0 + \xCD\x41 |0 + \xCD\x42 |0 + \xCA\xAD |0 + \xCD\x43 |0 + \xCD\x44 |0 + \xCD\x45 |0 + \xCD\x46 |0 + \xCD\x47 |0 + \xCD\x48 |0 + \xCD\x49 |0 + \xBA\xE7 |0 + \xF2\xB3 |0 + \xF2\xB5 |0 + \xF2\xB4 |0 + \xCB\xE4 |0 + \xCF\xBA |0 + \xF2\xB2 |0 + \xCA\xB4 |0 + \xD2\xCF |0 + \xC2\xEC |0 + \xCD\x4A |0 + \xCD\x4B |0 + \xCD\x4C |0 + \xCD\x4D |0 + \xCD\x4E |0 + \xCD\x4F |0 + \xCD\x50 |0 + \xCE\xC3 |0 + \xF2\xB8 |0 + \xB0\xF6 |0 + \xF2\xB7 |0 + \xCD\x51 |0 + \xCD\x52 |0 + \xCD\x53 |0 + \xCD\x54 |0 + \xCD\x55 |0 + \xF2\xBE |0 + \xCD\x56 |0 + \xB2\xCF |0 + \xCD\x57 |0 + \xCD\x58 |0 + \xCD\x59 |0 + \xCD\x5A |0 + \xCD\x5B |0 + \xCD\x5C |0 + \xD1\xC1 |0 + \xF2\xBA |0 + \xCD\x5D |0 + \xCD\x5E |0 + \xCD\x5F |0 + \xCD\x60 |0 + \xCD\x61 |0 + \xF2\xBC |0 + \xD4\xE9 |0 + \xCD\x62 |0 + \xCD\x63 |0 + \xF2\xBB |0 + \xF2\xB6 |0 + \xF2\xBF |0 + \xF2\xBD |0 + \xCD\x64 |0 + \xF2\xB9 |0 + \xCD\x65 |0 + \xCD\x66 |0 + \xF2\xC7 |0 + \xF2\xC4 |0 + \xF2\xC6 |0 + \xCD\x67 |0 + \xCD\x68 |0 + \xF2\xCA |0 + \xF2\xC2 |0 + \xF2\xC0 |0 + \xCD\x69 |0 + \xCD\x6A |0 + \xCD\x6B |0 + \xF2\xC5 |0 + \xCD\x6C |0 + \xCD\x6D |0 + \xCD\x6E |0 + \xCD\x6F |0 + \xCD\x70 |0 + \xD6\xFB |0 + \xCD\x71 |0 + \xCD\x72 |0 + \xCD\x73 |0 + \xF2\xC1 |0 + \xCD\x74 |0 + \xC7\xF9 |0 + \xC9\xDF |0 + \xCD\x75 |0 + \xF2\xC8 |0 + \xB9\xC6 |0 + \xB5\xB0 |0 + \xCD\x76 |0 + \xCD\x77 |0 + \xF2\xC3 |0 + \xF2\xC9 |0 + \xF2\xD0 |0 + \xF2\xD6 |0 + \xCD\x78 |0 + \xCD\x79 |0 + \xBB\xD7 |0 + \xCD\x7A |0 + \xCD\x7B |0 + \xCD\x7C |0 + \xF2\xD5 |0 + \xCD\xDC |0 + \xCD\x7D |0 + \xD6\xEB |0 + \xCD\x7E |0 + \xCD\x80 |0 + \xF2\xD2 |0 + \xF2\xD4 |0 + \xCD\x81 |0 + \xCD\x82 |0 + \xCD\x83 |0 + \xCD\x84 |0 + \xB8\xF2 |0 + \xCD\x85 |0 + \xCD\x86 |0 + \xCD\x87 |0 + \xCD\x88 |0 + \xF2\xCB |0 + \xCD\x89 |0 + \xCD\x8A |0 + \xCD\x8B |0 + \xF2\xCE |0 + \xC2\xF9 |0 + \xCD\x8C |0 + \xD5\xDD |0 + \xF2\xCC |0 + \xF2\xCD |0 + \xF2\xCF |0 + \xF2\xD3 |0 + \xCD\x8D |0 + \xCD\x8E |0 + \xCD\x8F |0 + \xF2\xD9 |0 + \xD3\xBC |0 + \xCD\x90 |0 + \xCD\x91 |0 + \xCD\x92 |0 + \xCD\x93 |0 + \xB6\xEA |0 + \xCD\x94 |0 + \xCA\xF1 |0 + \xCD\x95 |0 + \xB7\xE4 |0 + \xF2\xD7 |0 + \xCD\x96 |0 + \xCD\x97 |0 + \xCD\x98 |0 + \xF2\xD8 |0 + \xF2\xDA |0 + \xF2\xDD |0 + \xF2\xDB |0 + \xCD\x99 |0 + \xCD\x9A |0 + \xF2\xDC |0 + \xCD\x9B |0 + \xCD\x9C |0 + \xCD\x9D |0 + \xCD\x9E |0 + \xD1\xD1 |0 + \xF2\xD1 |0 + \xCD\x9F |0 + \xCD\xC9 |0 + \xCD\xA0 |0 + \xCE\xCF |0 + \xD6\xA9 |0 + \xCE\x40 |0 + \xF2\xE3 |0 + \xCE\x41 |0 + \xC3\xDB |0 + \xCE\x42 |0 + \xF2\xE0 |0 + \xCE\x43 |0 + \xCE\x44 |0 + \xC0\xAF |0 + \xF2\xEC |0 + \xF2\xDE |0 + \xCE\x45 |0 + \xF2\xE1 |0 + \xCE\x46 |0 + \xCE\x47 |0 + \xCE\x48 |0 + \xF2\xE8 |0 + \xCE\x49 |0 + \xCE\x4A |0 + \xCE\x4B |0 + \xCE\x4C |0 + \xF2\xE2 |0 + \xCE\x4D |0 + \xCE\x4E |0 + \xF2\xE7 |0 + \xCE\x4F |0 + \xCE\x50 |0 + \xF2\xE6 |0 + \xCE\x51 |0 + \xCE\x52 |0 + \xF2\xE9 |0 + \xCE\x53 |0 + \xCE\x54 |0 + \xCE\x55 |0 + \xF2\xDF |0 + \xCE\x56 |0 + \xCE\x57 |0 + \xF2\xE4 |0 + \xF2\xEA |0 + \xCE\x58 |0 + \xCE\x59 |0 + \xCE\x5A |0 + \xCE\x5B |0 + \xCE\x5C |0 + \xCE\x5D |0 + \xCE\x5E |0 + \xD3\xAC |0 + \xF2\xE5 |0 + \xB2\xF5 |0 + \xCE\x5F |0 + \xCE\x60 |0 + \xF2\xF2 |0 + \xCE\x61 |0 + \xD0\xAB |0 + \xCE\x62 |0 + \xCE\x63 |0 + \xCE\x64 |0 + \xCE\x65 |0 + \xF2\xF5 |0 + \xCE\x66 |0 + \xCE\x67 |0 + \xCE\x68 |0 + \xBB\xC8 |0 + \xCE\x69 |0 + \xF2\xF9 |0 + \xCE\x6A |0 + \xCE\x6B |0 + \xCE\x6C |0 + \xCE\x6D |0 + \xCE\x6E |0 + \xCE\x6F |0 + \xF2\xF0 |0 + \xCE\x70 |0 + \xCE\x71 |0 + \xF2\xF6 |0 + \xF2\xF8 |0 + \xF2\xFA |0 + \xCE\x72 |0 + \xCE\x73 |0 + \xCE\x74 |0 + \xCE\x75 |0 + \xCE\x76 |0 + \xCE\x77 |0 + \xCE\x78 |0 + \xCE\x79 |0 + \xF2\xF3 |0 + \xCE\x7A |0 + \xF2\xF1 |0 + \xCE\x7B |0 + \xCE\x7C |0 + \xCE\x7D |0 + \xBA\xFB |0 + \xCE\x7E |0 + \xB5\xFB |0 + \xCE\x80 |0 + \xCE\x81 |0 + \xCE\x82 |0 + \xCE\x83 |0 + \xF2\xEF |0 + \xF2\xF7 |0 + \xF2\xED |0 + \xF2\xEE |0 + \xCE\x84 |0 + \xCE\x85 |0 + \xCE\x86 |0 + \xF2\xEB |0 + \xF3\xA6 |0 + \xCE\x87 |0 + \xF3\xA3 |0 + \xCE\x88 |0 + \xCE\x89 |0 + \xF3\xA2 |0 + \xCE\x8A |0 + \xCE\x8B |0 + \xF2\xF4 |0 + \xCE\x8C |0 + \xC8\xDA |0 + \xCE\x8D |0 + \xCE\x8E |0 + \xCE\x8F |0 + \xCE\x90 |0 + \xCE\x91 |0 + \xF2\xFB |0 + \xCE\x92 |0 + \xCE\x93 |0 + \xCE\x94 |0 + \xF3\xA5 |0 + \xCE\x95 |0 + \xCE\x96 |0 + \xCE\x97 |0 + \xCE\x98 |0 + \xCE\x99 |0 + \xCE\x9A |0 + \xCE\x9B |0 + \xC3\xF8 |0 + \xCE\x9C |0 + \xCE\x9D |0 + \xCE\x9E |0 + \xCE\x9F |0 + \xCE\xA0 |0 + \xCF\x40 |0 + \xCF\x41 |0 + \xCF\x42 |0 + \xF2\xFD |0 + \xCF\x43 |0 + \xCF\x44 |0 + \xF3\xA7 |0 + \xF3\xA9 |0 + \xF3\xA4 |0 + \xCF\x45 |0 + \xF2\xFC |0 + \xCF\x46 |0 + \xCF\x47 |0 + \xCF\x48 |0 + \xF3\xAB |0 + \xCF\x49 |0 + \xF3\xAA |0 + \xCF\x4A |0 + \xCF\x4B |0 + \xCF\x4C |0 + \xCF\x4D |0 + \xC2\xDD |0 + \xCF\x4E |0 + \xCF\x4F |0 + \xF3\xAE |0 + \xCF\x50 |0 + \xCF\x51 |0 + \xF3\xB0 |0 + \xCF\x52 |0 + \xCF\x53 |0 + \xCF\x54 |0 + \xCF\x55 |0 + \xCF\x56 |0 + \xF3\xA1 |0 + \xCF\x57 |0 + \xCF\x58 |0 + \xCF\x59 |0 + \xF3\xB1 |0 + \xF3\xAC |0 + \xCF\x5A |0 + \xCF\x5B |0 + \xCF\x5C |0 + \xCF\x5D |0 + \xCF\x5E |0 + \xF3\xAF |0 + \xF2\xFE |0 + \xF3\xAD |0 + \xCF\x5F |0 + \xCF\x60 |0 + \xCF\x61 |0 + \xCF\x62 |0 + \xCF\x63 |0 + \xCF\x64 |0 + \xCF\x65 |0 + \xF3\xB2 |0 + \xCF\x66 |0 + \xCF\x67 |0 + \xCF\x68 |0 + \xCF\x69 |0 + \xF3\xB4 |0 + \xCF\x6A |0 + \xCF\x6B |0 + \xCF\x6C |0 + \xCF\x6D |0 + \xF3\xA8 |0 + \xCF\x6E |0 + \xCF\x6F |0 + \xCF\x70 |0 + \xCF\x71 |0 + \xF3\xB3 |0 + \xCF\x72 |0 + \xCF\x73 |0 + \xCF\x74 |0 + \xF3\xB5 |0 + \xCF\x75 |0 + \xCF\x76 |0 + \xCF\x77 |0 + \xCF\x78 |0 + \xCF\x79 |0 + \xCF\x7A |0 + \xCF\x7B |0 + \xCF\x7C |0 + \xCF\x7D |0 + \xCF\x7E |0 + \xD0\xB7 |0 + \xCF\x80 |0 + \xCF\x81 |0 + \xCF\x82 |0 + \xCF\x83 |0 + \xF3\xB8 |0 + \xCF\x84 |0 + \xCF\x85 |0 + \xCF\x86 |0 + \xCF\x87 |0 + \xD9\xF9 |0 + \xCF\x88 |0 + \xCF\x89 |0 + \xCF\x8A |0 + \xCF\x8B |0 + \xCF\x8C |0 + \xCF\x8D |0 + \xF3\xB9 |0 + \xCF\x8E |0 + \xCF\x8F |0 + \xCF\x90 |0 + \xCF\x91 |0 + \xCF\x92 |0 + \xCF\x93 |0 + \xCF\x94 |0 + \xCF\x95 |0 + \xF3\xB7 |0 + \xCF\x96 |0 + \xC8\xE4 |0 + \xF3\xB6 |0 + \xCF\x97 |0 + \xCF\x98 |0 + \xCF\x99 |0 + \xCF\x9A |0 + \xF3\xBA |0 + \xCF\x9B |0 + \xCF\x9C |0 + \xCF\x9D |0 + \xCF\x9E |0 + \xCF\x9F |0 + \xF3\xBB |0 + \xB4\xC0 |0 + \xCF\xA0 |0 + \xD0\x40 |0 + \xD0\x41 |0 + \xD0\x42 |0 + \xD0\x43 |0 + \xD0\x44 |0 + \xD0\x45 |0 + \xD0\x46 |0 + \xD0\x47 |0 + \xD0\x48 |0 + \xD0\x49 |0 + \xD0\x4A |0 + \xD0\x4B |0 + \xD0\x4C |0 + \xD0\x4D |0 + \xEE\xC3 |0 + \xD0\x4E |0 + \xD0\x4F |0 + \xD0\x50 |0 + \xD0\x51 |0 + \xD0\x52 |0 + \xD0\x53 |0 + \xF3\xBC |0 + \xD0\x54 |0 + \xD0\x55 |0 + \xF3\xBD |0 + \xD0\x56 |0 + \xD0\x57 |0 + \xD0\x58 |0 + \xD1\xAA |0 + \xD0\x59 |0 + \xD0\x5A |0 + \xD0\x5B |0 + \xF4\xAC |0 + \xD0\xC6 |0 + \xD0\x5C |0 + \xD0\x5D |0 + \xD0\x5E |0 + \xD0\x5F |0 + \xD0\x60 |0 + \xD0\x61 |0 + \xD0\xD0 |0 + \xD1\xDC |0 + \xD0\x62 |0 + \xD0\x63 |0 + \xD0\x64 |0 + \xD0\x65 |0 + \xD0\x66 |0 + \xD0\x67 |0 + \xCF\xCE |0 + \xD0\x68 |0 + \xD0\x69 |0 + \xBD\xD6 |0 + \xD0\x6A |0 + \xD1\xC3 |0 + \xD0\x6B |0 + \xD0\x6C |0 + \xD0\x6D |0 + \xD0\x6E |0 + \xD0\x6F |0 + \xD0\x70 |0 + \xD0\x71 |0 + \xBA\xE2 |0 + \xE1\xE9 |0 + \xD2\xC2 |0 + \xF1\xC2 |0 + \xB2\xB9 |0 + \xD0\x72 |0 + \xD0\x73 |0 + \xB1\xED |0 + \xF1\xC3 |0 + \xD0\x74 |0 + \xC9\xC0 |0 + \xB3\xC4 |0 + \xD0\x75 |0 + \xD9\xF2 |0 + \xD0\x76 |0 + \xCB\xA5 |0 + \xD0\x77 |0 + \xF1\xC4 |0 + \xD0\x78 |0 + \xD0\x79 |0 + \xD0\x7A |0 + \xD0\x7B |0 + \xD6\xD4 |0 + \xD0\x7C |0 + \xD0\x7D |0 + \xD0\x7E |0 + \xD0\x80 |0 + \xD0\x81 |0 + \xF1\xC5 |0 + \xF4\xC0 |0 + \xF1\xC6 |0 + \xD0\x82 |0 + \xD4\xAC |0 + \xF1\xC7 |0 + \xD0\x83 |0 + \xB0\xC0 |0 + \xF4\xC1 |0 + \xD0\x84 |0 + \xD0\x85 |0 + \xF4\xC2 |0 + \xD0\x86 |0 + \xD0\x87 |0 + \xB4\xFC |0 + \xD0\x88 |0 + \xC5\xDB |0 + \xD0\x89 |0 + \xD0\x8A |0 + \xD0\x8B |0 + \xD0\x8C |0 + \xCC\xBB |0 + \xD0\x8D |0 + \xD0\x8E |0 + \xD0\x8F |0 + \xD0\xE4 |0 + \xD0\x90 |0 + \xD0\x91 |0 + \xD0\x92 |0 + \xD0\x93 |0 + \xD0\x94 |0 + \xCD\xE0 |0 + \xD0\x95 |0 + \xD0\x96 |0 + \xD0\x97 |0 + \xD0\x98 |0 + \xD0\x99 |0 + \xF1\xC8 |0 + \xD0\x9A |0 + \xD9\xF3 |0 + \xD0\x9B |0 + \xD0\x9C |0 + \xD0\x9D |0 + \xD0\x9E |0 + \xD0\x9F |0 + \xD0\xA0 |0 + \xB1\xBB |0 + \xD1\x40 |0 + \xCF\xAE |0 + \xD1\x41 |0 + \xD1\x42 |0 + \xD1\x43 |0 + \xB8\xA4 |0 + \xD1\x44 |0 + \xD1\x45 |0 + \xD1\x46 |0 + \xD1\x47 |0 + \xD1\x48 |0 + \xF1\xCA |0 + \xD1\x49 |0 + \xD1\x4A |0 + \xD1\x4B |0 + \xD1\x4C |0 + \xF1\xCB |0 + \xD1\x4D |0 + \xD1\x4E |0 + \xD1\x4F |0 + \xD1\x50 |0 + \xB2\xC3 |0 + \xC1\xD1 |0 + \xD1\x51 |0 + \xD1\x52 |0 + \xD7\xB0 |0 + \xF1\xC9 |0 + \xD1\x53 |0 + \xD1\x54 |0 + \xF1\xCC |0 + \xD1\x55 |0 + \xD1\x56 |0 + \xD1\x57 |0 + \xD1\x58 |0 + \xF1\xCE |0 + \xD1\x59 |0 + \xD1\x5A |0 + \xD1\x5B |0 + \xD9\xF6 |0 + \xD1\x5C |0 + \xD2\xE1 |0 + \xD4\xA3 |0 + \xD1\x5D |0 + \xD1\x5E |0 + \xF4\xC3 |0 + \xC8\xB9 |0 + \xD1\x5F |0 + \xD1\x60 |0 + \xD1\x61 |0 + \xD1\x62 |0 + \xD1\x63 |0 + \xF4\xC4 |0 + \xD1\x64 |0 + \xD1\x65 |0 + \xF1\xCD |0 + \xF1\xCF |0 + \xBF\xE3 |0 + \xF1\xD0 |0 + \xD1\x66 |0 + \xD1\x67 |0 + \xF1\xD4 |0 + \xD1\x68 |0 + \xD1\x69 |0 + \xD1\x6A |0 + \xD1\x6B |0 + \xD1\x6C |0 + \xD1\x6D |0 + \xD1\x6E |0 + \xF1\xD6 |0 + \xF1\xD1 |0 + \xD1\x6F |0 + \xC9\xD1 |0 + \xC5\xE1 |0 + \xD1\x70 |0 + \xD1\x71 |0 + \xD1\x72 |0 + \xC2\xE3 |0 + \xB9\xFC |0 + \xD1\x73 |0 + \xD1\x74 |0 + \xF1\xD3 |0 + \xD1\x75 |0 + \xF1\xD5 |0 + \xD1\x76 |0 + \xD1\x77 |0 + \xD1\x78 |0 + \xB9\xD3 |0 + \xD1\x79 |0 + \xD1\x7A |0 + \xD1\x7B |0 + \xD1\x7C |0 + \xD1\x7D |0 + \xD1\x7E |0 + \xD1\x80 |0 + \xF1\xDB |0 + \xD1\x81 |0 + \xD1\x82 |0 + \xD1\x83 |0 + \xD1\x84 |0 + \xD1\x85 |0 + \xBA\xD6 |0 + \xD1\x86 |0 + \xB0\xFD |0 + \xF1\xD9 |0 + \xD1\x87 |0 + \xD1\x88 |0 + \xD1\x89 |0 + \xD1\x8A |0 + \xD1\x8B |0 + \xF1\xD8 |0 + \xF1\xD2 |0 + \xF1\xDA |0 + \xD1\x8C |0 + \xD1\x8D |0 + \xD1\x8E |0 + \xD1\x8F |0 + \xD1\x90 |0 + \xF1\xD7 |0 + \xD1\x91 |0 + \xD1\x92 |0 + \xD1\x93 |0 + \xC8\xEC |0 + \xD1\x94 |0 + \xD1\x95 |0 + \xD1\x96 |0 + \xD1\x97 |0 + \xCD\xCA |0 + \xF1\xDD |0 + \xD1\x98 |0 + \xD1\x99 |0 + \xD1\x9A |0 + \xD1\x9B |0 + \xE5\xBD |0 + \xD1\x9C |0 + \xD1\x9D |0 + \xD1\x9E |0 + \xF1\xDC |0 + \xD1\x9F |0 + \xF1\xDE |0 + \xD1\xA0 |0 + \xD2\x40 |0 + \xD2\x41 |0 + \xD2\x42 |0 + \xD2\x43 |0 + \xD2\x44 |0 + \xD2\x45 |0 + \xD2\x46 |0 + \xD2\x47 |0 + \xD2\x48 |0 + \xF1\xDF |0 + \xD2\x49 |0 + \xD2\x4A |0 + \xCF\xE5 |0 + \xD2\x4B |0 + \xD2\x4C |0 + \xD2\x4D |0 + \xD2\x4E |0 + \xD2\x4F |0 + \xD2\x50 |0 + \xD2\x51 |0 + \xD2\x52 |0 + \xD2\x53 |0 + \xD2\x54 |0 + \xD2\x55 |0 + \xD2\x56 |0 + \xD2\x57 |0 + \xD2\x58 |0 + \xD2\x59 |0 + \xD2\x5A |0 + \xD2\x5B |0 + \xD2\x5C |0 + \xD2\x5D |0 + \xD2\x5E |0 + \xD2\x5F |0 + \xD2\x60 |0 + \xD2\x61 |0 + \xD2\x62 |0 + \xD2\x63 |0 + \xF4\xC5 |0 + \xBD\xF3 |0 + \xD2\x64 |0 + \xD2\x65 |0 + \xD2\x66 |0 + \xD2\x67 |0 + \xD2\x68 |0 + \xD2\x69 |0 + \xF1\xE0 |0 + \xD2\x6A |0 + \xD2\x6B |0 + \xD2\x6C |0 + \xD2\x6D |0 + \xD2\x6E |0 + \xD2\x6F |0 + \xD2\x70 |0 + \xD2\x71 |0 + \xD2\x72 |0 + \xD2\x73 |0 + \xD2\x74 |0 + \xD2\x75 |0 + \xD2\x76 |0 + \xD2\x77 |0 + \xD2\x78 |0 + \xD2\x79 |0 + \xD2\x7A |0 + \xD2\x7B |0 + \xD2\x7C |0 + \xD2\x7D |0 + \xF1\xE1 |0 + \xD2\x7E |0 + \xD2\x80 |0 + \xD2\x81 |0 + \xCE\xF7 |0 + \xD2\x82 |0 + \xD2\xAA |0 + \xD2\x83 |0 + \xF1\xFB |0 + \xD2\x84 |0 + \xD2\x85 |0 + \xB8\xB2 |0 + \xD2\x86 |0 + \xD2\x87 |0 + \xD2\x88 |0 + \xD2\x89 |0 + \xD2\x8A |0 + \xD2\x8B |0 + \xD2\x8C |0 + \xD2\x8D |0 + \xD2\x8E |0 + \xD2\x8F |0 + \xD2\x90 |0 + \xD2\x91 |0 + \xD2\x92 |0 + \xD2\x93 |0 + \xD2\x94 |0 + \xD2\x95 |0 + \xD2\x96 |0 + \xD2\x97 |0 + \xD2\x98 |0 + \xD2\x99 |0 + \xD2\x9A |0 + \xD2\x9B |0 + \xD2\x9C |0 + \xD2\x9D |0 + \xD2\x9E |0 + \xD2\x9F |0 + \xD2\xA0 |0 + \xD3\x40 |0 + \xD3\x41 |0 + \xD3\x42 |0 + \xD3\x43 |0 + \xD3\x44 |0 + \xD3\x45 |0 + \xD3\x46 |0 + \xD3\x47 |0 + \xD3\x48 |0 + \xD3\x49 |0 + \xD3\x4A |0 + \xD3\x4B |0 + \xD3\x4C |0 + \xD3\x4D |0 + \xD3\x4E |0 + \xD3\x4F |0 + \xD3\x50 |0 + \xD3\x51 |0 + \xD3\x52 |0 + \xD3\x53 |0 + \xD3\x54 |0 + \xD3\x55 |0 + \xD3\x56 |0 + \xD3\x57 |0 + \xD3\x58 |0 + \xD3\x59 |0 + \xD3\x5A |0 + \xD3\x5B |0 + \xD3\x5C |0 + \xD3\x5D |0 + \xD3\x5E |0 + \xBC\xFB |0 + \xB9\xDB |0 + \xD3\x5F |0 + \xB9\xE6 |0 + \xC3\xD9 |0 + \xCA\xD3 |0 + \xEA\xE8 |0 + \xC0\xC0 |0 + \xBE\xF5 |0 + \xEA\xE9 |0 + \xEA\xEA |0 + \xEA\xEB |0 + \xD3\x60 |0 + \xEA\xEC |0 + \xEA\xED |0 + \xEA\xEE |0 + \xEA\xEF |0 + \xBD\xC7 |0 + \xD3\x61 |0 + \xD3\x62 |0 + \xD3\x63 |0 + \xF5\xFB |0 + \xD3\x64 |0 + \xD3\x65 |0 + \xD3\x66 |0 + \xF5\xFD |0 + \xD3\x67 |0 + \xF5\xFE |0 + \xD3\x68 |0 + \xF5\xFC |0 + \xD3\x69 |0 + \xD3\x6A |0 + \xD3\x6B |0 + \xD3\x6C |0 + \xBD\xE2 |0 + \xD3\x6D |0 + \xF6\xA1 |0 + \xB4\xA5 |0 + \xD3\x6E |0 + \xD3\x6F |0 + \xD3\x70 |0 + \xD3\x71 |0 + \xF6\xA2 |0 + \xD3\x72 |0 + \xD3\x73 |0 + \xD3\x74 |0 + \xF6\xA3 |0 + \xD3\x75 |0 + \xD3\x76 |0 + \xD3\x77 |0 + \xEC\xB2 |0 + \xD3\x78 |0 + \xD3\x79 |0 + \xD3\x7A |0 + \xD3\x7B |0 + \xD3\x7C |0 + \xD3\x7D |0 + \xD3\x7E |0 + \xD3\x80 |0 + \xD3\x81 |0 + \xD3\x82 |0 + \xD3\x83 |0 + \xD3\x84 |0 + \xD1\xD4 |0 + \xD3\x85 |0 + \xD3\x86 |0 + \xD3\x87 |0 + \xD3\x88 |0 + \xD3\x89 |0 + \xD3\x8A |0 + \xD9\xEA |0 + \xD3\x8B |0 + \xD3\x8C |0 + \xD3\x8D |0 + \xD3\x8E |0 + \xD3\x8F |0 + \xD3\x90 |0 + \xD3\x91 |0 + \xD3\x92 |0 + \xD3\x93 |0 + \xD3\x94 |0 + \xD3\x95 |0 + \xD3\x96 |0 + \xD3\x97 |0 + \xD3\x98 |0 + \xD3\x99 |0 + \xD3\x9A |0 + \xD3\x9B |0 + \xD3\x9C |0 + \xD3\x9D |0 + \xD3\x9E |0 + \xD3\x9F |0 + \xD3\xA0 |0 + \xD4\x40 |0 + \xD4\x41 |0 + \xD4\x42 |0 + \xD4\x43 |0 + \xD4\x44 |0 + \xD4\x45 |0 + \xD4\x46 |0 + \xD4\x47 |0 + \xD4\x48 |0 + \xD4\x49 |0 + \xD4\x4A |0 + \xD4\x4B |0 + \xD4\x4C |0 + \xD4\x4D |0 + \xD4\x4E |0 + \xD4\x4F |0 + \xD4\x50 |0 + \xD4\x51 |0 + \xD4\x52 |0 + \xD4\x53 |0 + \xD4\x54 |0 + \xD4\x55 |0 + \xD4\x56 |0 + \xD4\x57 |0 + \xD4\x58 |0 + \xD4\x59 |0 + \xD4\x5A |0 + \xD4\x5B |0 + \xD4\x5C |0 + \xD4\x5D |0 + \xD4\x5E |0 + \xD4\x5F |0 + \xF6\xA4 |0 + \xD4\x60 |0 + \xD4\x61 |0 + \xD4\x62 |0 + \xD4\x63 |0 + \xD4\x64 |0 + \xD4\x65 |0 + \xD4\x66 |0 + \xD4\x67 |0 + \xD4\x68 |0 + \xEE\xBA |0 + \xD4\x69 |0 + \xD4\x6A |0 + \xD4\x6B |0 + \xD4\x6C |0 + \xD4\x6D |0 + \xD4\x6E |0 + \xD4\x6F |0 + \xD4\x70 |0 + \xD4\x71 |0 + \xD4\x72 |0 + \xD4\x73 |0 + \xD4\x74 |0 + \xD4\x75 |0 + \xD4\x76 |0 + \xD4\x77 |0 + \xD4\x78 |0 + \xD4\x79 |0 + \xD4\x7A |0 + \xD4\x7B |0 + \xD4\x7C |0 + \xD4\x7D |0 + \xD4\x7E |0 + \xD4\x80 |0 + \xD4\x81 |0 + \xD4\x82 |0 + \xD4\x83 |0 + \xD4\x84 |0 + \xD4\x85 |0 + \xD4\x86 |0 + \xD4\x87 |0 + \xD4\x88 |0 + \xD4\x89 |0 + \xD4\x8A |0 + \xD4\x8B |0 + \xD4\x8C |0 + \xD4\x8D |0 + \xD4\x8E |0 + \xD4\x8F |0 + \xD4\x90 |0 + \xD4\x91 |0 + \xD4\x92 |0 + \xD4\x93 |0 + \xD4\x94 |0 + \xD4\x95 |0 + \xD4\x96 |0 + \xD4\x97 |0 + \xD4\x98 |0 + \xD4\x99 |0 + \xD5\xB2 |0 + \xD4\x9A |0 + \xD4\x9B |0 + \xD4\x9C |0 + \xD4\x9D |0 + \xD4\x9E |0 + \xD4\x9F |0 + \xD4\xA0 |0 + \xD5\x40 |0 + \xD5\x41 |0 + \xD5\x42 |0 + \xD5\x43 |0 + \xD5\x44 |0 + \xD5\x45 |0 + \xD5\x46 |0 + \xD5\x47 |0 + \xD3\xFE |0 + \xCC\xDC |0 + \xD5\x48 |0 + \xD5\x49 |0 + \xD5\x4A |0 + \xD5\x4B |0 + \xD5\x4C |0 + \xD5\x4D |0 + \xD5\x4E |0 + \xD5\x4F |0 + \xCA\xC4 |0 + \xD5\x50 |0 + \xD5\x51 |0 + \xD5\x52 |0 + \xD5\x53 |0 + \xD5\x54 |0 + \xD5\x55 |0 + \xD5\x56 |0 + \xD5\x57 |0 + \xD5\x58 |0 + \xD5\x59 |0 + \xD5\x5A |0 + \xD5\x5B |0 + \xD5\x5C |0 + \xD5\x5D |0 + \xD5\x5E |0 + \xD5\x5F |0 + \xD5\x60 |0 + \xD5\x61 |0 + \xD5\x62 |0 + \xD5\x63 |0 + \xD5\x64 |0 + \xD5\x65 |0 + \xD5\x66 |0 + \xD5\x67 |0 + \xD5\x68 |0 + \xD5\x69 |0 + \xD5\x6A |0 + \xD5\x6B |0 + \xD5\x6C |0 + \xD5\x6D |0 + \xD5\x6E |0 + \xD5\x6F |0 + \xD5\x70 |0 + \xD5\x71 |0 + \xD5\x72 |0 + \xD5\x73 |0 + \xD5\x74 |0 + \xD5\x75 |0 + \xD5\x76 |0 + \xD5\x77 |0 + \xD5\x78 |0 + \xD5\x79 |0 + \xD5\x7A |0 + \xD5\x7B |0 + \xD5\x7C |0 + \xD5\x7D |0 + \xD5\x7E |0 + \xD5\x80 |0 + \xD5\x81 |0 + \xD5\x82 |0 + \xD5\x83 |0 + \xD5\x84 |0 + \xD5\x85 |0 + \xD5\x86 |0 + \xD5\x87 |0 + \xD5\x88 |0 + \xD5\x89 |0 + \xD5\x8A |0 + \xD5\x8B |0 + \xD5\x8C |0 + \xD5\x8D |0 + \xD5\x8E |0 + \xD5\x8F |0 + \xD5\x90 |0 + \xD5\x91 |0 + \xD5\x92 |0 + \xD5\x93 |0 + \xD5\x94 |0 + \xD5\x95 |0 + \xD5\x96 |0 + \xD5\x97 |0 + \xD5\x98 |0 + \xD5\x99 |0 + \xD5\x9A |0 + \xD5\x9B |0 + \xD5\x9C |0 + \xD5\x9D |0 + \xD5\x9E |0 + \xD5\x9F |0 + \xD5\xA0 |0 + \xD6\x40 |0 + \xD6\x41 |0 + \xD6\x42 |0 + \xD6\x43 |0 + \xD6\x44 |0 + \xD6\x45 |0 + \xD6\x46 |0 + \xD6\x47 |0 + \xD6\x48 |0 + \xD6\x49 |0 + \xD6\x4A |0 + \xD6\x4B |0 + \xD6\x4C |0 + \xD6\x4D |0 + \xD6\x4E |0 + \xD6\x4F |0 + \xD6\x50 |0 + \xD6\x51 |0 + \xD6\x52 |0 + \xD6\x53 |0 + \xD6\x54 |0 + \xD6\x55 |0 + \xD6\x56 |0 + \xD6\x57 |0 + \xD6\x58 |0 + \xD6\x59 |0 + \xD6\x5A |0 + \xD6\x5B |0 + \xD6\x5C |0 + \xD6\x5D |0 + \xD6\x5E |0 + \xD6\x5F |0 + \xD6\x60 |0 + \xD6\x61 |0 + \xD6\x62 |0 + \xE5\xC0 |0 + \xD6\x63 |0 + \xD6\x64 |0 + \xD6\x65 |0 + \xD6\x66 |0 + \xD6\x67 |0 + \xD6\x68 |0 + \xD6\x69 |0 + \xD6\x6A |0 + \xD6\x6B |0 + \xD6\x6C |0 + \xD6\x6D |0 + \xD6\x6E |0 + \xD6\x6F |0 + \xD6\x70 |0 + \xD6\x71 |0 + \xD6\x72 |0 + \xD6\x73 |0 + \xD6\x74 |0 + \xD6\x75 |0 + \xD6\x76 |0 + \xD6\x77 |0 + \xD6\x78 |0 + \xD6\x79 |0 + \xD6\x7A |0 + \xD6\x7B |0 + \xD6\x7C |0 + \xD6\x7D |0 + \xD6\x7E |0 + \xD6\x80 |0 + \xD6\x81 |0 + \xF6\xA5 |0 + \xD6\x82 |0 + \xD6\x83 |0 + \xD6\x84 |0 + \xD6\x85 |0 + \xD6\x86 |0 + \xD6\x87 |0 + \xD6\x88 |0 + \xD6\x89 |0 + \xD6\x8A |0 + \xD6\x8B |0 + \xD6\x8C |0 + \xD6\x8D |0 + \xD6\x8E |0 + \xD6\x8F |0 + \xD6\x90 |0 + \xD6\x91 |0 + \xD6\x92 |0 + \xD6\x93 |0 + \xD6\x94 |0 + \xD6\x95 |0 + \xD6\x96 |0 + \xD6\x97 |0 + \xD6\x98 |0 + \xD6\x99 |0 + \xD6\x9A |0 + \xD6\x9B |0 + \xD6\x9C |0 + \xD6\x9D |0 + \xD6\x9E |0 + \xD6\x9F |0 + \xD6\xA0 |0 + \xD7\x40 |0 + \xD7\x41 |0 + \xD7\x42 |0 + \xD7\x43 |0 + \xD7\x44 |0 + \xD7\x45 |0 + \xD7\x46 |0 + \xD7\x47 |0 + \xD7\x48 |0 + \xD7\x49 |0 + \xD7\x4A |0 + \xD7\x4B |0 + \xD7\x4C |0 + \xD7\x4D |0 + \xD7\x4E |0 + \xD7\x4F |0 + \xD7\x50 |0 + \xD7\x51 |0 + \xD7\x52 |0 + \xD7\x53 |0 + \xD7\x54 |0 + \xD7\x55 |0 + \xD7\x56 |0 + \xD7\x57 |0 + \xD7\x58 |0 + \xD7\x59 |0 + \xD7\x5A |0 + \xD7\x5B |0 + \xD7\x5C |0 + \xD7\x5D |0 + \xD7\x5E |0 + \xD7\x5F |0 + \xBE\xAF |0 + \xD7\x60 |0 + \xD7\x61 |0 + \xD7\x62 |0 + \xD7\x63 |0 + \xD7\x64 |0 + \xC6\xA9 |0 + \xD7\x65 |0 + \xD7\x66 |0 + \xD7\x67 |0 + \xD7\x68 |0 + \xD7\x69 |0 + \xD7\x6A |0 + \xD7\x6B |0 + \xD7\x6C |0 + \xD7\x6D |0 + \xD7\x6E |0 + \xD7\x6F |0 + \xD7\x70 |0 + \xD7\x71 |0 + \xD7\x72 |0 + \xD7\x73 |0 + \xD7\x74 |0 + \xD7\x75 |0 + \xD7\x76 |0 + \xD7\x77 |0 + \xD7\x78 |0 + \xD7\x79 |0 + \xD7\x7A |0 + \xD7\x7B |0 + \xD7\x7C |0 + \xD7\x7D |0 + \xD7\x7E |0 + \xD7\x80 |0 + \xD7\x81 |0 + \xD7\x82 |0 + \xD7\x83 |0 + \xD7\x84 |0 + \xD7\x85 |0 + \xD7\x86 |0 + \xD7\x87 |0 + \xD7\x88 |0 + \xD7\x89 |0 + \xD7\x8A |0 + \xD7\x8B |0 + \xD7\x8C |0 + \xD7\x8D |0 + \xD7\x8E |0 + \xD7\x8F |0 + \xD7\x90 |0 + \xD7\x91 |0 + \xD7\x92 |0 + \xD7\x93 |0 + \xD7\x94 |0 + \xD7\x95 |0 + \xD7\x96 |0 + \xD7\x97 |0 + \xD7\x98 |0 + \xDA\xA5 |0 + \xBC\xC6 |0 + \xB6\xA9 |0 + \xB8\xBC |0 + \xC8\xCF |0 + \xBC\xA5 |0 + \xDA\xA6 |0 + \xDA\xA7 |0 + \xCC\xD6 |0 + \xC8\xC3 |0 + \xDA\xA8 |0 + \xC6\xFD |0 + \xD7\x99 |0 + \xD1\xB5 |0 + \xD2\xE9 |0 + \xD1\xB6 |0 + \xBC\xC7 |0 + \xD7\x9A |0 + \xBD\xB2 |0 + \xBB\xE4 |0 + \xDA\xA9 |0 + \xDA\xAA |0 + \xD1\xC8 |0 + \xDA\xAB |0 + \xD0\xED |0 + \xB6\xEF |0 + \xC2\xDB |0 + \xD7\x9B |0 + \xCB\xCF |0 + \xB7\xED |0 + \xC9\xE8 |0 + \xB7\xC3 |0 + \xBE\xF7 |0 + \xD6\xA4 |0 + \xDA\xAC |0 + \xDA\xAD |0 + \xC6\xC0 |0 + \xD7\xE7 |0 + \xCA\xB6 |0 + \xD7\x9C |0 + \xD5\xA9 |0 + \xCB\xDF |0 + \xD5\xEF |0 + \xDA\xAE |0 + \xD6\xDF |0 + \xB4\xCA |0 + \xDA\xB0 |0 + \xDA\xAF |0 + \xD7\x9D |0 + \xD2\xEB |0 + \xDA\xB1 |0 + \xDA\xB2 |0 + \xDA\xB3 |0 + \xCA\xD4 |0 + \xDA\xB4 |0 + \xCA\xAB |0 + \xDA\xB5 |0 + \xDA\xB6 |0 + \xB3\xCF |0 + \xD6\xEF |0 + \xDA\xB7 |0 + \xBB\xB0 |0 + \xB5\xAE |0 + \xDA\xB8 |0 + \xDA\xB9 |0 + \xB9\xEE |0 + \xD1\xAF |0 + \xD2\xE8 |0 + \xDA\xBA |0 + \xB8\xC3 |0 + \xCF\xEA |0 + \xB2\xEF |0 + \xDA\xBB |0 + \xDA\xBC |0 + \xD7\x9E |0 + \xBD\xEB |0 + \xCE\xDC |0 + \xD3\xEF |0 + \xDA\xBD |0 + \xCE\xF3 |0 + \xDA\xBE |0 + \xD3\xD5 |0 + \xBB\xE5 |0 + \xDA\xBF |0 + \xCB\xB5 |0 + \xCB\xD0 |0 + \xDA\xC0 |0 + \xC7\xEB |0 + \xD6\xEE |0 + \xDA\xC1 |0 + \xC5\xB5 |0 + \xB6\xC1 |0 + \xDA\xC2 |0 + \xB7\xCC |0 + \xBF\xCE |0 + \xDA\xC3 |0 + \xDA\xC4 |0 + \xCB\xAD |0 + \xDA\xC5 |0 + \xB5\xF7 |0 + \xDA\xC6 |0 + \xC1\xC2 |0 + \xD7\xBB |0 + \xDA\xC7 |0 + \xCC\xB8 |0 + \xD7\x9F |0 + \xD2\xEA |0 + \xC4\xB1 |0 + \xDA\xC8 |0 + \xB5\xFD |0 + \xBB\xD1 |0 + \xDA\xC9 |0 + \xD0\xB3 |0 + \xDA\xCA |0 + \xDA\xCB |0 + \xCE\xBD |0 + \xDA\xCC |0 + \xDA\xCD |0 + \xDA\xCE |0 + \xB2\xF7 |0 + \xDA\xD1 |0 + \xDA\xCF |0 + \xD1\xE8 |0 + \xDA\xD0 |0 + \xC3\xD5 |0 + \xDA\xD2 |0 + \xD7\xA0 |0 + \xDA\xD3 |0 + \xDA\xD4 |0 + \xDA\xD5 |0 + \xD0\xBB |0 + \xD2\xA5 |0 + \xB0\xF9 |0 + \xDA\xD6 |0 + \xC7\xAB |0 + \xDA\xD7 |0 + \xBD\xF7 |0 + \xC3\xA1 |0 + \xDA\xD8 |0 + \xDA\xD9 |0 + \xC3\xFD |0 + \xCC\xB7 |0 + \xDA\xDA |0 + \xDA\xDB |0 + \xC0\xBE |0 + \xC6\xD7 |0 + \xDA\xDC |0 + \xDA\xDD |0 + \xC7\xB4 |0 + \xDA\xDE |0 + \xDA\xDF |0 + \xB9\xC8 |0 + \xD8\x40 |0 + \xD8\x41 |0 + \xD8\x42 |0 + \xD8\x43 |0 + \xD8\x44 |0 + \xD8\x45 |0 + \xD8\x46 |0 + \xD8\x47 |0 + \xD8\x48 |0 + \xBB\xED |0 + \xD8\x49 |0 + \xD8\x4A |0 + \xD8\x4B |0 + \xD8\x4C |0 + \xB6\xB9 |0 + \xF4\xF8 |0 + \xD8\x4D |0 + \xF4\xF9 |0 + \xD8\x4E |0 + \xD8\x4F |0 + \xCD\xE3 |0 + \xD8\x50 |0 + \xD8\x51 |0 + \xD8\x52 |0 + \xD8\x53 |0 + \xD8\x54 |0 + \xD8\x55 |0 + \xD8\x56 |0 + \xD8\x57 |0 + \xF5\xB9 |0 + \xD8\x58 |0 + \xD8\x59 |0 + \xD8\x5A |0 + \xD8\x5B |0 + \xEB\xE0 |0 + \xD8\x5C |0 + \xD8\x5D |0 + \xD8\x5E |0 + \xD8\x5F |0 + \xD8\x60 |0 + \xD8\x61 |0 + \xCF\xF3 |0 + \xBB\xBF |0 + \xD8\x62 |0 + \xD8\x63 |0 + \xD8\x64 |0 + \xD8\x65 |0 + \xD8\x66 |0 + \xD8\x67 |0 + \xD8\x68 |0 + \xBA\xC0 |0 + \xD4\xA5 |0 + \xD8\x69 |0 + \xD8\x6A |0 + \xD8\x6B |0 + \xD8\x6C |0 + \xD8\x6D |0 + \xD8\x6E |0 + \xD8\x6F |0 + \xE1\xD9 |0 + \xD8\x70 |0 + \xD8\x71 |0 + \xD8\x72 |0 + \xD8\x73 |0 + \xF5\xF4 |0 + \xB1\xAA |0 + \xB2\xF2 |0 + \xD8\x74 |0 + \xD8\x75 |0 + \xD8\x76 |0 + \xD8\x77 |0 + \xD8\x78 |0 + \xD8\x79 |0 + \xD8\x7A |0 + \xF5\xF5 |0 + \xD8\x7B |0 + \xD8\x7C |0 + \xF5\xF7 |0 + \xD8\x7D |0 + \xD8\x7E |0 + \xD8\x80 |0 + \xBA\xD1 |0 + \xF5\xF6 |0 + \xD8\x81 |0 + \xC3\xB2 |0 + \xD8\x82 |0 + \xD8\x83 |0 + \xD8\x84 |0 + \xD8\x85 |0 + \xD8\x86 |0 + \xD8\x87 |0 + \xD8\x88 |0 + \xF5\xF9 |0 + \xD8\x89 |0 + \xD8\x8A |0 + \xD8\x8B |0 + \xF5\xF8 |0 + \xD8\x8C |0 + \xD8\x8D |0 + \xD8\x8E |0 + \xD8\x8F |0 + \xD8\x90 |0 + \xD8\x91 |0 + \xD8\x92 |0 + \xD8\x93 |0 + \xD8\x94 |0 + \xD8\x95 |0 + \xD8\x96 |0 + \xD8\x97 |0 + \xD8\x98 |0 + \xD8\x99 |0 + \xD8\x9A |0 + \xD8\x9B |0 + \xD8\x9C |0 + \xD8\x9D |0 + \xD8\x9E |0 + \xD8\x9F |0 + \xD8\xA0 |0 + \xD9\x40 |0 + \xD9\x41 |0 + \xD9\x42 |0 + \xD9\x43 |0 + \xD9\x44 |0 + \xD9\x45 |0 + \xD9\x46 |0 + \xD9\x47 |0 + \xD9\x48 |0 + \xD9\x49 |0 + \xD9\x4A |0 + \xD9\x4B |0 + \xD9\x4C |0 + \xD9\x4D |0 + \xD9\x4E |0 + \xD9\x4F |0 + \xD9\x50 |0 + \xD9\x51 |0 + \xD9\x52 |0 + \xD9\x53 |0 + \xD9\x54 |0 + \xD9\x55 |0 + \xD9\x56 |0 + \xD9\x57 |0 + \xD9\x58 |0 + \xD9\x59 |0 + \xD9\x5A |0 + \xD9\x5B |0 + \xD9\x5C |0 + \xD9\x5D |0 + \xD9\x5E |0 + \xD9\x5F |0 + \xD9\x60 |0 + \xD9\x61 |0 + \xD9\x62 |0 + \xD9\x63 |0 + \xD9\x64 |0 + \xD9\x65 |0 + \xD9\x66 |0 + \xD9\x67 |0 + \xD9\x68 |0 + \xD9\x69 |0 + \xD9\x6A |0 + \xD9\x6B |0 + \xD9\x6C |0 + \xD9\x6D |0 + \xD9\x6E |0 + \xD9\x6F |0 + \xD9\x70 |0 + \xD9\x71 |0 + \xD9\x72 |0 + \xD9\x73 |0 + \xD9\x74 |0 + \xD9\x75 |0 + \xD9\x76 |0 + \xD9\x77 |0 + \xD9\x78 |0 + \xD9\x79 |0 + \xD9\x7A |0 + \xD9\x7B |0 + \xD9\x7C |0 + \xD9\x7D |0 + \xD9\x7E |0 + \xD9\x80 |0 + \xD9\x81 |0 + \xD9\x82 |0 + \xD9\x83 |0 + \xD9\x84 |0 + \xD9\x85 |0 + \xD9\x86 |0 + \xD9\x87 |0 + \xD9\x88 |0 + \xD9\x89 |0 + \xD9\x8A |0 + \xD9\x8B |0 + \xD9\x8C |0 + \xD9\x8D |0 + \xD9\x8E |0 + \xD9\x8F |0 + \xD9\x90 |0 + \xD9\x91 |0 + \xD9\x92 |0 + \xD9\x93 |0 + \xD9\x94 |0 + \xD9\x95 |0 + \xD9\x96 |0 + \xD9\x97 |0 + \xD9\x98 |0 + \xD9\x99 |0 + \xD9\x9A |0 + \xD9\x9B |0 + \xD9\x9C |0 + \xD9\x9D |0 + \xD9\x9E |0 + \xD9\x9F |0 + \xD9\xA0 |0 + \xDA\x40 |0 + \xDA\x41 |0 + \xDA\x42 |0 + \xDA\x43 |0 + \xDA\x44 |0 + \xDA\x45 |0 + \xDA\x46 |0 + \xDA\x47 |0 + \xDA\x48 |0 + \xDA\x49 |0 + \xDA\x4A |0 + \xDA\x4B |0 + \xDA\x4C |0 + \xDA\x4D |0 + \xDA\x4E |0 + \xB1\xB4 |0 + \xD5\xEA |0 + \xB8\xBA |0 + \xDA\x4F |0 + \xB9\xB1 |0 + \xB2\xC6 |0 + \xD4\xF0 |0 + \xCF\xCD |0 + \xB0\xDC |0 + \xD5\xCB |0 + \xBB\xF5 |0 + \xD6\xCA |0 + \xB7\xB7 |0 + \xCC\xB0 |0 + \xC6\xB6 |0 + \xB1\xE1 |0 + \xB9\xBA |0 + \xD6\xFC |0 + \xB9\xE1 |0 + \xB7\xA1 |0 + \xBC\xFA |0 + \xEA\xDA |0 + \xEA\xDB |0 + \xCC\xF9 |0 + \xB9\xF3 |0 + \xEA\xDC |0 + \xB4\xFB |0 + \xC3\xB3 |0 + \xB7\xD1 |0 + \xBA\xD8 |0 + \xEA\xDD |0 + \xD4\xF4 |0 + \xEA\xDE |0 + \xBC\xD6 |0 + \xBB\xDF |0 + \xEA\xDF |0 + \xC1\xDE |0 + \xC2\xB8 |0 + \xD4\xDF |0 + \xD7\xCA |0 + \xEA\xE0 |0 + \xEA\xE1 |0 + \xEA\xE4 |0 + \xEA\xE2 |0 + \xEA\xE3 |0 + \xC9\xDE |0 + \xB8\xB3 |0 + \xB6\xC4 |0 + \xEA\xE5 |0 + \xCA\xEA |0 + \xC9\xCD |0 + \xB4\xCD |0 + \xDA\x50 |0 + \xDA\x51 |0 + \xE2\xD9 |0 + \xC5\xE2 |0 + \xEA\xE6 |0 + \xC0\xB5 |0 + \xDA\x52 |0 + \xD7\xB8 |0 + \xEA\xE7 |0 + \xD7\xAC |0 + \xC8\xFC |0 + \xD8\xD3 |0 + \xD8\xCD |0 + \xD4\xDE |0 + \xDA\x53 |0 + \xD4\xF9 |0 + \xC9\xC4 |0 + \xD3\xAE |0 + \xB8\xD3 |0 + \xB3\xE0 |0 + \xDA\x54 |0 + \xC9\xE2 |0 + \xF4\xF6 |0 + \xDA\x55 |0 + \xDA\x56 |0 + \xDA\x57 |0 + \xBA\xD5 |0 + \xDA\x58 |0 + \xF4\xF7 |0 + \xDA\x59 |0 + \xDA\x5A |0 + \xD7\xDF |0 + \xDA\x5B |0 + \xDA\x5C |0 + \xF4\xF1 |0 + \xB8\xB0 |0 + \xD5\xD4 |0 + \xB8\xCF |0 + \xC6\xF0 |0 + \xDA\x5D |0 + \xDA\x5E |0 + \xDA\x5F |0 + \xDA\x60 |0 + \xDA\x61 |0 + \xDA\x62 |0 + \xDA\x63 |0 + \xDA\x64 |0 + \xDA\x65 |0 + \xB3\xC3 |0 + \xDA\x66 |0 + \xDA\x67 |0 + \xF4\xF2 |0 + \xB3\xAC |0 + \xDA\x68 |0 + \xDA\x69 |0 + \xDA\x6A |0 + \xDA\x6B |0 + \xD4\xBD |0 + \xC7\xF7 |0 + \xDA\x6C |0 + \xDA\x6D |0 + \xDA\x6E |0 + \xDA\x6F |0 + \xDA\x70 |0 + \xF4\xF4 |0 + \xDA\x71 |0 + \xDA\x72 |0 + \xF4\xF3 |0 + \xDA\x73 |0 + \xDA\x74 |0 + \xDA\x75 |0 + \xDA\x76 |0 + \xDA\x77 |0 + \xDA\x78 |0 + \xDA\x79 |0 + \xDA\x7A |0 + \xDA\x7B |0 + \xDA\x7C |0 + \xCC\xCB |0 + \xDA\x7D |0 + \xDA\x7E |0 + \xDA\x80 |0 + \xC8\xA4 |0 + \xDA\x81 |0 + \xDA\x82 |0 + \xDA\x83 |0 + \xDA\x84 |0 + \xDA\x85 |0 + \xDA\x86 |0 + \xDA\x87 |0 + \xDA\x88 |0 + \xDA\x89 |0 + \xDA\x8A |0 + \xDA\x8B |0 + \xDA\x8C |0 + \xDA\x8D |0 + \xF4\xF5 |0 + \xDA\x8E |0 + \xD7\xE3 |0 + \xC5\xBF |0 + \xF5\xC0 |0 + \xDA\x8F |0 + \xDA\x90 |0 + \xF5\xBB |0 + \xDA\x91 |0 + \xF5\xC3 |0 + \xDA\x92 |0 + \xF5\xC2 |0 + \xDA\x93 |0 + \xD6\xBA |0 + \xF5\xC1 |0 + \xDA\x94 |0 + \xDA\x95 |0 + \xDA\x96 |0 + \xD4\xBE |0 + \xF5\xC4 |0 + \xDA\x97 |0 + \xF5\xCC |0 + \xDA\x98 |0 + \xDA\x99 |0 + \xDA\x9A |0 + \xDA\x9B |0 + \xB0\xCF |0 + \xB5\xF8 |0 + \xDA\x9C |0 + \xF5\xC9 |0 + \xF5\xCA |0 + \xDA\x9D |0 + \xC5\xDC |0 + \xDA\x9E |0 + \xDA\x9F |0 + \xDA\xA0 |0 + \xDB\x40 |0 + \xF5\xC5 |0 + \xF5\xC6 |0 + \xDB\x41 |0 + \xDB\x42 |0 + \xF5\xC7 |0 + \xF5\xCB |0 + \xDB\x43 |0 + \xBE\xE0 |0 + \xF5\xC8 |0 + \xB8\xFA |0 + \xDB\x44 |0 + \xDB\x45 |0 + \xDB\x46 |0 + \xF5\xD0 |0 + \xF5\xD3 |0 + \xDB\x47 |0 + \xDB\x48 |0 + \xDB\x49 |0 + \xBF\xE7 |0 + \xDB\x4A |0 + \xB9\xF2 |0 + \xF5\xBC |0 + \xF5\xCD |0 + \xDB\x4B |0 + \xDB\x4C |0 + \xC2\xB7 |0 + \xDB\x4D |0 + \xDB\x4E |0 + \xDB\x4F |0 + \xCC\xF8 |0 + \xDB\x50 |0 + \xBC\xF9 |0 + \xDB\x51 |0 + \xF5\xCE |0 + \xF5\xCF |0 + \xF5\xD1 |0 + \xB6\xE5 |0 + \xF5\xD2 |0 + \xDB\x52 |0 + \xF5\xD5 |0 + \xDB\x53 |0 + \xDB\x54 |0 + \xDB\x55 |0 + \xDB\x56 |0 + \xDB\x57 |0 + \xDB\x58 |0 + \xDB\x59 |0 + \xF5\xBD |0 + \xDB\x5A |0 + \xDB\x5B |0 + \xDB\x5C |0 + \xF5\xD4 |0 + \xD3\xBB |0 + \xDB\x5D |0 + \xB3\xEC |0 + \xDB\x5E |0 + \xDB\x5F |0 + \xCC\xA4 |0 + \xDB\x60 |0 + \xDB\x61 |0 + \xDB\x62 |0 + \xDB\x63 |0 + \xF5\xD6 |0 + \xDB\x64 |0 + \xDB\x65 |0 + \xDB\x66 |0 + \xDB\x67 |0 + \xDB\x68 |0 + \xDB\x69 |0 + \xDB\x6A |0 + \xDB\x6B |0 + \xF5\xD7 |0 + \xBE\xE1 |0 + \xF5\xD8 |0 + \xDB\x6C |0 + \xDB\x6D |0 + \xCC\xDF |0 + \xF5\xDB |0 + \xDB\x6E |0 + \xDB\x6F |0 + \xDB\x70 |0 + \xDB\x71 |0 + \xDB\x72 |0 + \xB2\xC8 |0 + \xD7\xD9 |0 + \xDB\x73 |0 + \xF5\xD9 |0 + \xDB\x74 |0 + \xF5\xDA |0 + \xF5\xDC |0 + \xDB\x75 |0 + \xF5\xE2 |0 + \xDB\x76 |0 + \xDB\x77 |0 + \xDB\x78 |0 + \xF5\xE0 |0 + \xDB\x79 |0 + \xDB\x7A |0 + \xDB\x7B |0 + \xF5\xDF |0 + \xF5\xDD |0 + \xDB\x7C |0 + \xDB\x7D |0 + \xF5\xE1 |0 + \xDB\x7E |0 + \xDB\x80 |0 + \xF5\xDE |0 + \xF5\xE4 |0 + \xF5\xE5 |0 + \xDB\x81 |0 + \xCC\xE3 |0 + \xDB\x82 |0 + \xDB\x83 |0 + \xE5\xBF |0 + \xB5\xB8 |0 + \xF5\xE3 |0 + \xF5\xE8 |0 + \xCC\xA3 |0 + \xDB\x84 |0 + \xDB\x85 |0 + \xDB\x86 |0 + \xDB\x87 |0 + \xDB\x88 |0 + \xF5\xE6 |0 + \xF5\xE7 |0 + \xDB\x89 |0 + \xDB\x8A |0 + \xDB\x8B |0 + \xDB\x8C |0 + \xDB\x8D |0 + \xDB\x8E |0 + \xF5\xBE |0 + \xDB\x8F |0 + \xDB\x90 |0 + \xDB\x91 |0 + \xDB\x92 |0 + \xDB\x93 |0 + \xDB\x94 |0 + \xDB\x95 |0 + \xDB\x96 |0 + \xDB\x97 |0 + \xDB\x98 |0 + \xDB\x99 |0 + \xDB\x9A |0 + \xB1\xC4 |0 + \xDB\x9B |0 + \xDB\x9C |0 + \xF5\xBF |0 + \xDB\x9D |0 + \xDB\x9E |0 + \xB5\xC5 |0 + \xB2\xE4 |0 + \xDB\x9F |0 + \xF5\xEC |0 + \xF5\xE9 |0 + \xDB\xA0 |0 + \xB6\xD7 |0 + \xDC\x40 |0 + \xF5\xED |0 + \xDC\x41 |0 + \xF5\xEA |0 + \xDC\x42 |0 + \xDC\x43 |0 + \xDC\x44 |0 + \xDC\x45 |0 + \xDC\x46 |0 + \xF5\xEB |0 + \xDC\x47 |0 + \xDC\x48 |0 + \xB4\xDA |0 + \xDC\x49 |0 + \xD4\xEA |0 + \xDC\x4A |0 + \xDC\x4B |0 + \xDC\x4C |0 + \xF5\xEE |0 + \xDC\x4D |0 + \xB3\xF9 |0 + \xDC\x4E |0 + \xDC\x4F |0 + \xDC\x50 |0 + \xDC\x51 |0 + \xDC\x52 |0 + \xDC\x53 |0 + \xDC\x54 |0 + \xF5\xEF |0 + \xF5\xF1 |0 + \xDC\x55 |0 + \xDC\x56 |0 + \xDC\x57 |0 + \xF5\xF0 |0 + \xDC\x58 |0 + \xDC\x59 |0 + \xDC\x5A |0 + \xDC\x5B |0 + \xDC\x5C |0 + \xDC\x5D |0 + \xDC\x5E |0 + \xF5\xF2 |0 + \xDC\x5F |0 + \xF5\xF3 |0 + \xDC\x60 |0 + \xDC\x61 |0 + \xDC\x62 |0 + \xDC\x63 |0 + \xDC\x64 |0 + \xDC\x65 |0 + \xDC\x66 |0 + \xDC\x67 |0 + \xDC\x68 |0 + \xDC\x69 |0 + \xDC\x6A |0 + \xDC\x6B |0 + \xC9\xED |0 + \xB9\xAA |0 + \xDC\x6C |0 + \xDC\x6D |0 + \xC7\xFB |0 + \xDC\x6E |0 + \xDC\x6F |0 + \xB6\xE3 |0 + \xDC\x70 |0 + \xDC\x71 |0 + \xDC\x72 |0 + \xDC\x73 |0 + \xDC\x74 |0 + \xDC\x75 |0 + \xDC\x76 |0 + \xCC\xC9 |0 + \xDC\x77 |0 + \xDC\x78 |0 + \xDC\x79 |0 + \xDC\x7A |0 + \xDC\x7B |0 + \xDC\x7C |0 + \xDC\x7D |0 + \xDC\x7E |0 + \xDC\x80 |0 + \xDC\x81 |0 + \xDC\x82 |0 + \xDC\x83 |0 + \xDC\x84 |0 + \xDC\x85 |0 + \xDC\x86 |0 + \xDC\x87 |0 + \xDC\x88 |0 + \xDC\x89 |0 + \xDC\x8A |0 + \xEA\xA6 |0 + \xDC\x8B |0 + \xDC\x8C |0 + \xDC\x8D |0 + \xDC\x8E |0 + \xDC\x8F |0 + \xDC\x90 |0 + \xDC\x91 |0 + \xDC\x92 |0 + \xDC\x93 |0 + \xDC\x94 |0 + \xDC\x95 |0 + \xDC\x96 |0 + \xDC\x97 |0 + \xDC\x98 |0 + \xDC\x99 |0 + \xDC\x9A |0 + \xDC\x9B |0 + \xDC\x9C |0 + \xDC\x9D |0 + \xDC\x9E |0 + \xDC\x9F |0 + \xDC\xA0 |0 + \xDD\x40 |0 + \xDD\x41 |0 + \xDD\x42 |0 + \xDD\x43 |0 + \xDD\x44 |0 + \xDD\x45 |0 + \xDD\x46 |0 + \xDD\x47 |0 + \xDD\x48 |0 + \xDD\x49 |0 + \xDD\x4A |0 + \xDD\x4B |0 + \xDD\x4C |0 + \xDD\x4D |0 + \xDD\x4E |0 + \xDD\x4F |0 + \xDD\x50 |0 + \xDD\x51 |0 + \xDD\x52 |0 + \xDD\x53 |0 + \xDD\x54 |0 + \xDD\x55 |0 + \xDD\x56 |0 + \xDD\x57 |0 + \xDD\x58 |0 + \xDD\x59 |0 + \xDD\x5A |0 + \xDD\x5B |0 + \xDD\x5C |0 + \xDD\x5D |0 + \xDD\x5E |0 + \xDD\x5F |0 + \xDD\x60 |0 + \xDD\x61 |0 + \xDD\x62 |0 + \xDD\x63 |0 + \xDD\x64 |0 + \xDD\x65 |0 + \xDD\x66 |0 + \xDD\x67 |0 + \xDD\x68 |0 + \xDD\x69 |0 + \xDD\x6A |0 + \xDD\x6B |0 + \xDD\x6C |0 + \xDD\x6D |0 + \xDD\x6E |0 + \xDD\x6F |0 + \xDD\x70 |0 + \xDD\x71 |0 + \xDD\x72 |0 + \xDD\x73 |0 + \xDD\x74 |0 + \xDD\x75 |0 + \xDD\x76 |0 + \xDD\x77 |0 + \xDD\x78 |0 + \xDD\x79 |0 + \xDD\x7A |0 + \xDD\x7B |0 + \xDD\x7C |0 + \xDD\x7D |0 + \xDD\x7E |0 + \xDD\x80 |0 + \xDD\x81 |0 + \xDD\x82 |0 + \xDD\x83 |0 + \xDD\x84 |0 + \xDD\x85 |0 + \xDD\x86 |0 + \xDD\x87 |0 + \xDD\x88 |0 + \xDD\x89 |0 + \xDD\x8A |0 + \xDD\x8B |0 + \xDD\x8C |0 + \xDD\x8D |0 + \xDD\x8E |0 + \xDD\x8F |0 + \xDD\x90 |0 + \xDD\x91 |0 + \xDD\x92 |0 + \xDD\x93 |0 + \xDD\x94 |0 + \xDD\x95 |0 + \xDD\x96 |0 + \xDD\x97 |0 + \xDD\x98 |0 + \xDD\x99 |0 + \xDD\x9A |0 + \xDD\x9B |0 + \xDD\x9C |0 + \xDD\x9D |0 + \xDD\x9E |0 + \xDD\x9F |0 + \xDD\xA0 |0 + \xDE\x40 |0 + \xDE\x41 |0 + \xDE\x42 |0 + \xDE\x43 |0 + \xDE\x44 |0 + \xDE\x45 |0 + \xDE\x46 |0 + \xDE\x47 |0 + \xDE\x48 |0 + \xDE\x49 |0 + \xDE\x4A |0 + \xDE\x4B |0 + \xDE\x4C |0 + \xDE\x4D |0 + \xDE\x4E |0 + \xDE\x4F |0 + \xDE\x50 |0 + \xDE\x51 |0 + \xDE\x52 |0 + \xDE\x53 |0 + \xDE\x54 |0 + \xDE\x55 |0 + \xDE\x56 |0 + \xDE\x57 |0 + \xDE\x58 |0 + \xDE\x59 |0 + \xDE\x5A |0 + \xDE\x5B |0 + \xDE\x5C |0 + \xDE\x5D |0 + \xDE\x5E |0 + \xDE\x5F |0 + \xDE\x60 |0 + \xB3\xB5 |0 + \xD4\xFE |0 + \xB9\xEC |0 + \xD0\xF9 |0 + \xDE\x61 |0 + \xE9\xED |0 + \xD7\xAA |0 + \xE9\xEE |0 + \xC2\xD6 |0 + \xC8\xED |0 + \xBA\xE4 |0 + \xE9\xEF |0 + \xE9\xF0 |0 + \xE9\xF1 |0 + \xD6\xE1 |0 + \xE9\xF2 |0 + \xE9\xF3 |0 + \xE9\xF5 |0 + \xE9\xF4 |0 + \xE9\xF6 |0 + \xE9\xF7 |0 + \xC7\xE1 |0 + \xE9\xF8 |0 + \xD4\xD8 |0 + \xE9\xF9 |0 + \xBD\xCE |0 + \xDE\x62 |0 + \xE9\xFA |0 + \xE9\xFB |0 + \xBD\xCF |0 + \xE9\xFC |0 + \xB8\xA8 |0 + \xC1\xBE |0 + \xE9\xFD |0 + \xB1\xB2 |0 + \xBB\xD4 |0 + \xB9\xF5 |0 + \xE9\xFE |0 + \xDE\x63 |0 + \xEA\xA1 |0 + \xEA\xA2 |0 + \xEA\xA3 |0 + \xB7\xF8 |0 + \xBC\xAD |0 + \xDE\x64 |0 + \xCA\xE4 |0 + \xE0\xCE |0 + \xD4\xAF |0 + \xCF\xBD |0 + \xD5\xB7 |0 + \xEA\xA4 |0 + \xD5\xDE |0 + \xEA\xA5 |0 + \xD0\xC1 |0 + \xB9\xBC |0 + \xDE\x65 |0 + \xB4\xC7 |0 + \xB1\xD9 |0 + \xDE\x66 |0 + \xDE\x67 |0 + \xDE\x68 |0 + \xC0\xB1 |0 + \xDE\x69 |0 + \xDE\x6A |0 + \xDE\x6B |0 + \xDE\x6C |0 + \xB1\xE6 |0 + \xB1\xE7 |0 + \xDE\x6D |0 + \xB1\xE8 |0 + \xDE\x6E |0 + \xDE\x6F |0 + \xDE\x70 |0 + \xDE\x71 |0 + \xB3\xBD |0 + \xC8\xE8 |0 + \xDE\x72 |0 + \xDE\x73 |0 + \xDE\x74 |0 + \xDE\x75 |0 + \xE5\xC1 |0 + \xDE\x76 |0 + \xDE\x77 |0 + \xB1\xDF |0 + \xDE\x78 |0 + \xDE\x79 |0 + \xDE\x7A |0 + \xC1\xC9 |0 + \xB4\xEF |0 + \xDE\x7B |0 + \xDE\x7C |0 + \xC7\xA8 |0 + \xD3\xD8 |0 + \xDE\x7D |0 + \xC6\xF9 |0 + \xD1\xB8 |0 + \xDE\x7E |0 + \xB9\xFD |0 + \xC2\xF5 |0 + \xDE\x80 |0 + \xDE\x81 |0 + \xDE\x82 |0 + \xDE\x83 |0 + \xDE\x84 |0 + \xD3\xAD |0 + \xDE\x85 |0 + \xD4\xCB |0 + \xBD\xFC |0 + \xDE\x86 |0 + \xE5\xC2 |0 + \xB7\xB5 |0 + \xE5\xC3 |0 + \xDE\x87 |0 + \xDE\x88 |0 + \xBB\xB9 |0 + \xD5\xE2 |0 + \xDE\x89 |0 + \xBD\xF8 |0 + \xD4\xB6 |0 + \xCE\xA5 |0 + \xC1\xAC |0 + \xB3\xD9 |0 + \xDE\x8A |0 + \xDE\x8B |0 + \xCC\xF6 |0 + \xDE\x8C |0 + \xE5\xC6 |0 + \xE5\xC4 |0 + \xE5\xC8 |0 + \xDE\x8D |0 + \xE5\xCA |0 + \xE5\xC7 |0 + \xB5\xCF |0 + \xC6\xC8 |0 + \xDE\x8E |0 + \xB5\xFC |0 + \xE5\xC5 |0 + \xDE\x8F |0 + \xCA\xF6 |0 + \xDE\x90 |0 + \xDE\x91 |0 + \xE5\xC9 |0 + \xDE\x92 |0 + \xDE\x93 |0 + \xDE\x94 |0 + \xC3\xD4 |0 + \xB1\xC5 |0 + \xBC\xA3 |0 + \xDE\x95 |0 + \xDE\x96 |0 + \xDE\x97 |0 + \xD7\xB7 |0 + \xDE\x98 |0 + \xDE\x99 |0 + \xCD\xCB |0 + \xCB\xCD |0 + \xCA\xCA |0 + \xCC\xD3 |0 + \xE5\xCC |0 + \xE5\xCB |0 + \xC4\xE6 |0 + \xDE\x9A |0 + \xDE\x9B |0 + \xD1\xA1 |0 + \xD1\xB7 |0 + \xE5\xCD |0 + \xDE\x9C |0 + \xE5\xD0 |0 + \xDE\x9D |0 + \xCD\xB8 |0 + \xD6\xF0 |0 + \xE5\xCF |0 + \xB5\xDD |0 + \xDE\x9E |0 + \xCD\xBE |0 + \xDE\x9F |0 + \xE5\xD1 |0 + \xB6\xBA |0 + \xDE\xA0 |0 + \xDF\x40 |0 + \xCD\xA8 |0 + \xB9\xE4 |0 + \xDF\x41 |0 + \xCA\xC5 |0 + \xB3\xD1 |0 + \xCB\xD9 |0 + \xD4\xEC |0 + \xE5\xD2 |0 + \xB7\xEA |0 + \xDF\x42 |0 + \xDF\x43 |0 + \xDF\x44 |0 + \xE5\xCE |0 + \xDF\x45 |0 + \xDF\x46 |0 + \xDF\x47 |0 + \xDF\x48 |0 + \xDF\x49 |0 + \xDF\x4A |0 + \xE5\xD5 |0 + \xB4\xFE |0 + \xE5\xD6 |0 + \xDF\x4B |0 + \xDF\x4C |0 + \xDF\x4D |0 + \xDF\x4E |0 + \xDF\x4F |0 + \xE5\xD3 |0 + \xE5\xD4 |0 + \xDF\x50 |0 + \xD2\xDD |0 + \xDF\x51 |0 + \xDF\x52 |0 + \xC2\xDF |0 + \xB1\xC6 |0 + \xDF\x53 |0 + \xD3\xE2 |0 + \xDF\x54 |0 + \xDF\x55 |0 + \xB6\xDD |0 + \xCB\xEC |0 + \xDF\x56 |0 + \xE5\xD7 |0 + \xDF\x57 |0 + \xDF\x58 |0 + \xD3\xF6 |0 + \xDF\x59 |0 + \xDF\x5A |0 + \xDF\x5B |0 + \xDF\x5C |0 + \xDF\x5D |0 + \xB1\xE9 |0 + \xDF\x5E |0 + \xB6\xF4 |0 + \xE5\xDA |0 + \xE5\xD8 |0 + \xE5\xD9 |0 + \xB5\xC0 |0 + \xDF\x5F |0 + \xDF\x60 |0 + \xDF\x61 |0 + \xD2\xC5 |0 + \xE5\xDC |0 + \xDF\x62 |0 + \xDF\x63 |0 + \xE5\xDE |0 + \xDF\x64 |0 + \xDF\x65 |0 + \xDF\x66 |0 + \xDF\x67 |0 + \xDF\x68 |0 + \xDF\x69 |0 + \xE5\xDD |0 + \xC7\xB2 |0 + \xDF\x6A |0 + \xD2\xA3 |0 + \xDF\x6B |0 + \xDF\x6C |0 + \xE5\xDB |0 + \xDF\x6D |0 + \xDF\x6E |0 + \xDF\x6F |0 + \xDF\x70 |0 + \xD4\xE2 |0 + \xD5\xDA |0 + \xDF\x71 |0 + \xDF\x72 |0 + \xDF\x73 |0 + \xDF\x74 |0 + \xDF\x75 |0 + \xE5\xE0 |0 + \xD7\xF1 |0 + \xDF\x76 |0 + \xDF\x77 |0 + \xDF\x78 |0 + \xDF\x79 |0 + \xDF\x7A |0 + \xDF\x7B |0 + \xDF\x7C |0 + \xE5\xE1 |0 + \xDF\x7D |0 + \xB1\xDC |0 + \xD1\xFB |0 + \xDF\x7E |0 + \xE5\xE2 |0 + \xE5\xE4 |0 + \xDF\x80 |0 + \xDF\x81 |0 + \xDF\x82 |0 + \xDF\x83 |0 + \xE5\xE3 |0 + \xDF\x84 |0 + \xDF\x85 |0 + \xE5\xE5 |0 + \xDF\x86 |0 + \xDF\x87 |0 + \xDF\x88 |0 + \xDF\x89 |0 + \xDF\x8A |0 + \xD2\xD8 |0 + \xDF\x8B |0 + \xB5\xCB |0 + \xDF\x8C |0 + \xE7\xDF |0 + \xDF\x8D |0 + \xDA\xF5 |0 + \xDF\x8E |0 + \xDA\xF8 |0 + \xDF\x8F |0 + \xDA\xF6 |0 + \xDF\x90 |0 + \xDA\xF7 |0 + \xDF\x91 |0 + \xDF\x92 |0 + \xDF\x93 |0 + \xDA\xFA |0 + \xD0\xCF |0 + \xC4\xC7 |0 + \xDF\x94 |0 + \xDF\x95 |0 + \xB0\xEE |0 + \xDF\x96 |0 + \xDF\x97 |0 + \xDF\x98 |0 + \xD0\xB0 |0 + \xDF\x99 |0 + \xDA\xF9 |0 + \xDF\x9A |0 + \xD3\xCA |0 + \xBA\xAA |0 + \xDB\xA2 |0 + \xC7\xF1 |0 + \xDF\x9B |0 + \xDA\xFC |0 + \xDA\xFB |0 + \xC9\xDB |0 + \xDA\xFD |0 + \xDF\x9C |0 + \xDB\xA1 |0 + \xD7\xDE |0 + \xDA\xFE |0 + \xC1\xDA |0 + \xDF\x9D |0 + \xDF\x9E |0 + \xDB\xA5 |0 + \xDF\x9F |0 + \xDF\xA0 |0 + \xD3\xF4 |0 + \xE0\x40 |0 + \xE0\x41 |0 + \xDB\xA7 |0 + \xDB\xA4 |0 + \xE0\x42 |0 + \xDB\xA8 |0 + \xE0\x43 |0 + \xE0\x44 |0 + \xBD\xBC |0 + \xE0\x45 |0 + \xE0\x46 |0 + \xE0\x47 |0 + \xC0\xC9 |0 + \xDB\xA3 |0 + \xDB\xA6 |0 + \xD6\xA3 |0 + \xE0\x48 |0 + \xDB\xA9 |0 + \xE0\x49 |0 + \xE0\x4A |0 + \xE0\x4B |0 + \xDB\xAD |0 + \xE0\x4C |0 + \xE0\x4D |0 + \xE0\x4E |0 + \xDB\xAE |0 + \xDB\xAC |0 + \xBA\xC2 |0 + \xE0\x4F |0 + \xE0\x50 |0 + \xE0\x51 |0 + \xBF\xA4 |0 + \xDB\xAB |0 + \xE0\x52 |0 + \xE0\x53 |0 + \xE0\x54 |0 + \xDB\xAA |0 + \xD4\xC7 |0 + \xB2\xBF |0 + \xE0\x55 |0 + \xE0\x56 |0 + \xDB\xAF |0 + \xE0\x57 |0 + \xB9\xF9 |0 + \xE0\x58 |0 + \xDB\xB0 |0 + \xE0\x59 |0 + \xE0\x5A |0 + \xE0\x5B |0 + \xE0\x5C |0 + \xB3\xBB |0 + \xE0\x5D |0 + \xE0\x5E |0 + \xE0\x5F |0 + \xB5\xA6 |0 + \xE0\x60 |0 + \xE0\x61 |0 + \xE0\x62 |0 + \xE0\x63 |0 + \xB6\xBC |0 + \xDB\xB1 |0 + \xE0\x64 |0 + \xE0\x65 |0 + \xE0\x66 |0 + \xB6\xF5 |0 + \xE0\x67 |0 + \xDB\xB2 |0 + \xE0\x68 |0 + \xE0\x69 |0 + \xE0\x6A |0 + \xE0\x6B |0 + \xE0\x6C |0 + \xE0\x6D |0 + \xE0\x6E |0 + \xE0\x6F |0 + \xE0\x70 |0 + \xE0\x71 |0 + \xE0\x72 |0 + \xE0\x73 |0 + \xE0\x74 |0 + \xE0\x75 |0 + \xE0\x76 |0 + \xE0\x77 |0 + \xE0\x78 |0 + \xE0\x79 |0 + \xE0\x7A |0 + \xE0\x7B |0 + \xB1\xC9 |0 + \xE0\x7C |0 + \xE0\x7D |0 + \xE0\x7E |0 + \xE0\x80 |0 + \xDB\xB4 |0 + \xE0\x81 |0 + \xE0\x82 |0 + \xE0\x83 |0 + \xDB\xB3 |0 + \xDB\xB5 |0 + \xE0\x84 |0 + \xE0\x85 |0 + \xE0\x86 |0 + \xE0\x87 |0 + \xE0\x88 |0 + \xE0\x89 |0 + \xE0\x8A |0 + \xE0\x8B |0 + \xE0\x8C |0 + \xE0\x8D |0 + \xE0\x8E |0 + \xDB\xB7 |0 + \xE0\x8F |0 + \xDB\xB6 |0 + \xE0\x90 |0 + \xE0\x91 |0 + \xE0\x92 |0 + \xE0\x93 |0 + \xE0\x94 |0 + \xE0\x95 |0 + \xE0\x96 |0 + \xDB\xB8 |0 + \xE0\x97 |0 + \xE0\x98 |0 + \xE0\x99 |0 + \xE0\x9A |0 + \xE0\x9B |0 + \xE0\x9C |0 + \xE0\x9D |0 + \xE0\x9E |0 + \xE0\x9F |0 + \xDB\xB9 |0 + \xE0\xA0 |0 + \xE1\x40 |0 + \xDB\xBA |0 + \xE1\x41 |0 + \xE1\x42 |0 + \xD3\xCF |0 + \xF4\xFA |0 + \xC7\xF5 |0 + \xD7\xC3 |0 + \xC5\xE4 |0 + \xF4\xFC |0 + \xF4\xFD |0 + \xF4\xFB |0 + \xE1\x43 |0 + \xBE\xC6 |0 + \xE1\x44 |0 + \xE1\x45 |0 + \xE1\x46 |0 + \xE1\x47 |0 + \xD0\xEF |0 + \xE1\x48 |0 + \xE1\x49 |0 + \xB7\xD3 |0 + \xE1\x4A |0 + \xE1\x4B |0 + \xD4\xCD |0 + \xCC\xAA |0 + \xE1\x4C |0 + \xE1\x4D |0 + \xF5\xA2 |0 + \xF5\xA1 |0 + \xBA\xA8 |0 + \xF4\xFE |0 + \xCB\xD6 |0 + \xE1\x4E |0 + \xE1\x4F |0 + \xE1\x50 |0 + \xF5\xA4 |0 + \xC0\xD2 |0 + \xE1\x51 |0 + \xB3\xEA |0 + \xE1\x52 |0 + \xCD\xAA |0 + \xF5\xA5 |0 + \xF5\xA3 |0 + \xBD\xB4 |0 + \xF5\xA8 |0 + \xE1\x53 |0 + \xF5\xA9 |0 + \xBD\xCD |0 + \xC3\xB8 |0 + \xBF\xE1 |0 + \xCB\xE1 |0 + \xF5\xAA |0 + \xE1\x54 |0 + \xE1\x55 |0 + \xE1\x56 |0 + \xF5\xA6 |0 + \xF5\xA7 |0 + \xC4\xF0 |0 + \xE1\x57 |0 + \xE1\x58 |0 + \xE1\x59 |0 + \xE1\x5A |0 + \xE1\x5B |0 + \xF5\xAC |0 + \xE1\x5C |0 + \xB4\xBC |0 + \xE1\x5D |0 + \xD7\xED |0 + \xE1\x5E |0 + \xB4\xD7 |0 + \xF5\xAB |0 + \xF5\xAE |0 + \xE1\x5F |0 + \xE1\x60 |0 + \xF5\xAD |0 + \xF5\xAF |0 + \xD0\xD1 |0 + \xE1\x61 |0 + \xE1\x62 |0 + \xE1\x63 |0 + \xE1\x64 |0 + \xE1\x65 |0 + \xE1\x66 |0 + \xE1\x67 |0 + \xC3\xD1 |0 + \xC8\xA9 |0 + \xE1\x68 |0 + \xE1\x69 |0 + \xE1\x6A |0 + \xE1\x6B |0 + \xE1\x6C |0 + \xE1\x6D |0 + \xF5\xB0 |0 + \xF5\xB1 |0 + \xE1\x6E |0 + \xE1\x6F |0 + \xE1\x70 |0 + \xE1\x71 |0 + \xE1\x72 |0 + \xE1\x73 |0 + \xF5\xB2 |0 + \xE1\x74 |0 + \xE1\x75 |0 + \xF5\xB3 |0 + \xF5\xB4 |0 + \xF5\xB5 |0 + \xE1\x76 |0 + \xE1\x77 |0 + \xE1\x78 |0 + \xE1\x79 |0 + \xF5\xB7 |0 + \xF5\xB6 |0 + \xE1\x7A |0 + \xE1\x7B |0 + \xE1\x7C |0 + \xE1\x7D |0 + \xF5\xB8 |0 + \xE1\x7E |0 + \xE1\x80 |0 + \xE1\x81 |0 + \xE1\x82 |0 + \xE1\x83 |0 + \xE1\x84 |0 + \xE1\x85 |0 + \xE1\x86 |0 + \xE1\x87 |0 + \xE1\x88 |0 + \xE1\x89 |0 + \xE1\x8A |0 + \xB2\xC9 |0 + \xE1\x8B |0 + \xD3\xD4 |0 + \xCA\xCD |0 + \xE1\x8C |0 + \xC0\xEF |0 + \xD6\xD8 |0 + \xD2\xB0 |0 + \xC1\xBF |0 + \xE1\x8D |0 + \xBD\xF0 |0 + \xE1\x8E |0 + \xE1\x8F |0 + \xE1\x90 |0 + \xE1\x91 |0 + \xE1\x92 |0 + \xE1\x93 |0 + \xE1\x94 |0 + \xE1\x95 |0 + \xE1\x96 |0 + \xE1\x97 |0 + \xB8\xAA |0 + \xE1\x98 |0 + \xE1\x99 |0 + \xE1\x9A |0 + \xE1\x9B |0 + \xE1\x9C |0 + \xE1\x9D |0 + \xE1\x9E |0 + \xE1\x9F |0 + \xE1\xA0 |0 + \xE2\x40 |0 + \xE2\x41 |0 + \xE2\x42 |0 + \xE2\x43 |0 + \xE2\x44 |0 + \xE2\x45 |0 + \xE2\x46 |0 + \xE2\x47 |0 + \xE2\x48 |0 + \xE2\x49 |0 + \xE2\x4A |0 + \xE2\x4B |0 + \xE2\x4C |0 + \xE2\x4D |0 + \xE2\x4E |0 + \xE2\x4F |0 + \xE2\x50 |0 + \xE2\x51 |0 + \xE2\x52 |0 + \xE2\x53 |0 + \xE2\x54 |0 + \xE2\x55 |0 + \xE2\x56 |0 + \xE2\x57 |0 + \xE2\x58 |0 + \xE2\x59 |0 + \xE2\x5A |0 + \xE2\x5B |0 + \xE2\x5C |0 + \xE2\x5D |0 + \xE2\x5E |0 + \xE2\x5F |0 + \xE2\x60 |0 + \xE2\x61 |0 + \xE2\x62 |0 + \xE2\x63 |0 + \xE2\x64 |0 + \xE2\x65 |0 + \xE2\x66 |0 + \xE2\x67 |0 + \xE2\x68 |0 + \xE2\x69 |0 + \xE2\x6A |0 + \xE2\x6B |0 + \xE2\x6C |0 + \xE2\x6D |0 + \xE2\x6E |0 + \xE2\x6F |0 + \xE2\x70 |0 + \xE2\x71 |0 + \xE2\x72 |0 + \xE2\x73 |0 + \xE2\x74 |0 + \xE2\x75 |0 + \xE2\x76 |0 + \xE2\x77 |0 + \xE2\x78 |0 + \xE2\x79 |0 + \xE2\x7A |0 + \xE2\x7B |0 + \xE2\x7C |0 + \xE2\x7D |0 + \xE2\x7E |0 + \xE2\x80 |0 + \xE2\x81 |0 + \xE2\x82 |0 + \xE2\x83 |0 + \xE2\x84 |0 + \xE2\x85 |0 + \xE2\x86 |0 + \xE2\x87 |0 + \xE2\x88 |0 + \xE2\x89 |0 + \xE2\x8A |0 + \xE2\x8B |0 + \xE2\x8C |0 + \xE2\x8D |0 + \xE2\x8E |0 + \xE2\x8F |0 + \xE2\x90 |0 + \xE2\x91 |0 + \xE2\x92 |0 + \xE2\x93 |0 + \xE2\x94 |0 + \xE2\x95 |0 + \xE2\x96 |0 + \xE2\x97 |0 + \xE2\x98 |0 + \xE2\x99 |0 + \xE2\x9A |0 + \xE2\x9B |0 + \xE2\x9C |0 + \xE2\x9D |0 + \xE2\x9E |0 + \xE2\x9F |0 + \xE2\xA0 |0 + \xE3\x40 |0 + \xE3\x41 |0 + \xE3\x42 |0 + \xE3\x43 |0 + \xE3\x44 |0 + \xE3\x45 |0 + \xE3\x46 |0 + \xE3\x47 |0 + \xE3\x48 |0 + \xE3\x49 |0 + \xE3\x4A |0 + \xE3\x4B |0 + \xE3\x4C |0 + \xE3\x4D |0 + \xE3\x4E |0 + \xE3\x4F |0 + \xE3\x50 |0 + \xE3\x51 |0 + \xE3\x52 |0 + \xE3\x53 |0 + \xE3\x54 |0 + \xE3\x55 |0 + \xE3\x56 |0 + \xE3\x57 |0 + \xE3\x58 |0 + \xE3\x59 |0 + \xE3\x5A |0 + \xE3\x5B |0 + \xE3\x5C |0 + \xE3\x5D |0 + \xE3\x5E |0 + \xE3\x5F |0 + \xE3\x60 |0 + \xE3\x61 |0 + \xE3\x62 |0 + \xE3\x63 |0 + \xE3\x64 |0 + \xE3\x65 |0 + \xE3\x66 |0 + \xE3\x67 |0 + \xE3\x68 |0 + \xE3\x69 |0 + \xE3\x6A |0 + \xE3\x6B |0 + \xE3\x6C |0 + \xE3\x6D |0 + \xBC\xF8 |0 + \xE3\x6E |0 + \xE3\x6F |0 + \xE3\x70 |0 + \xE3\x71 |0 + \xE3\x72 |0 + \xE3\x73 |0 + \xE3\x74 |0 + \xE3\x75 |0 + \xE3\x76 |0 + \xE3\x77 |0 + \xE3\x78 |0 + \xE3\x79 |0 + \xE3\x7A |0 + \xE3\x7B |0 + \xE3\x7C |0 + \xE3\x7D |0 + \xE3\x7E |0 + \xE3\x80 |0 + \xE3\x81 |0 + \xE3\x82 |0 + \xE3\x83 |0 + \xE3\x84 |0 + \xE3\x85 |0 + \xE3\x86 |0 + \xE3\x87 |0 + \xF6\xC6 |0 + \xE3\x88 |0 + \xE3\x89 |0 + \xE3\x8A |0 + \xE3\x8B |0 + \xE3\x8C |0 + \xE3\x8D |0 + \xE3\x8E |0 + \xE3\x8F |0 + \xE3\x90 |0 + \xE3\x91 |0 + \xE3\x92 |0 + \xE3\x93 |0 + \xE3\x94 |0 + \xE3\x95 |0 + \xE3\x96 |0 + \xE3\x97 |0 + \xE3\x98 |0 + \xE3\x99 |0 + \xE3\x9A |0 + \xE3\x9B |0 + \xE3\x9C |0 + \xE3\x9D |0 + \xE3\x9E |0 + \xE3\x9F |0 + \xE3\xA0 |0 + \xE4\x40 |0 + \xE4\x41 |0 + \xE4\x42 |0 + \xE4\x43 |0 + \xE4\x44 |0 + \xE4\x45 |0 + \xF6\xC7 |0 + \xE4\x46 |0 + \xE4\x47 |0 + \xE4\x48 |0 + \xE4\x49 |0 + \xE4\x4A |0 + \xE4\x4B |0 + \xE4\x4C |0 + \xE4\x4D |0 + \xE4\x4E |0 + \xE4\x4F |0 + \xE4\x50 |0 + \xE4\x51 |0 + \xE4\x52 |0 + \xE4\x53 |0 + \xE4\x54 |0 + \xE4\x55 |0 + \xE4\x56 |0 + \xE4\x57 |0 + \xE4\x58 |0 + \xE4\x59 |0 + \xE4\x5A |0 + \xE4\x5B |0 + \xE4\x5C |0 + \xE4\x5D |0 + \xE4\x5E |0 + \xF6\xC8 |0 + \xE4\x5F |0 + \xE4\x60 |0 + \xE4\x61 |0 + \xE4\x62 |0 + \xE4\x63 |0 + \xE4\x64 |0 + \xE4\x65 |0 + \xE4\x66 |0 + \xE4\x67 |0 + \xE4\x68 |0 + \xE4\x69 |0 + \xE4\x6A |0 + \xE4\x6B |0 + \xE4\x6C |0 + \xE4\x6D |0 + \xE4\x6E |0 + \xE4\x6F |0 + \xE4\x70 |0 + \xE4\x71 |0 + \xE4\x72 |0 + \xE4\x73 |0 + \xE4\x74 |0 + \xE4\x75 |0 + \xE4\x76 |0 + \xE4\x77 |0 + \xE4\x78 |0 + \xE4\x79 |0 + \xE4\x7A |0 + \xE4\x7B |0 + \xE4\x7C |0 + \xE4\x7D |0 + \xE4\x7E |0 + \xE4\x80 |0 + \xE4\x81 |0 + \xE4\x82 |0 + \xE4\x83 |0 + \xE4\x84 |0 + \xE4\x85 |0 + \xE4\x86 |0 + \xE4\x87 |0 + \xE4\x88 |0 + \xE4\x89 |0 + \xE4\x8A |0 + \xE4\x8B |0 + \xE4\x8C |0 + \xE4\x8D |0 + \xE4\x8E |0 + \xE4\x8F |0 + \xE4\x90 |0 + \xE4\x91 |0 + \xE4\x92 |0 + \xE4\x93 |0 + \xE4\x94 |0 + \xE4\x95 |0 + \xE4\x96 |0 + \xE4\x97 |0 + \xE4\x98 |0 + \xE4\x99 |0 + \xE4\x9A |0 + \xE4\x9B |0 + \xE4\x9C |0 + \xE4\x9D |0 + \xE4\x9E |0 + \xE4\x9F |0 + \xE4\xA0 |0 + \xE5\x40 |0 + \xE5\x41 |0 + \xE5\x42 |0 + \xE5\x43 |0 + \xE5\x44 |0 + \xE5\x45 |0 + \xE5\x46 |0 + \xE5\x47 |0 + \xE5\x48 |0 + \xE5\x49 |0 + \xE5\x4A |0 + \xE5\x4B |0 + \xE5\x4C |0 + \xE5\x4D |0 + \xE5\x4E |0 + \xE5\x4F |0 + \xE5\x50 |0 + \xE5\x51 |0 + \xE5\x52 |0 + \xE5\x53 |0 + \xE5\x54 |0 + \xE5\x55 |0 + \xE5\x56 |0 + \xE5\x57 |0 + \xE5\x58 |0 + \xE5\x59 |0 + \xE5\x5A |0 + \xE5\x5B |0 + \xE5\x5C |0 + \xE5\x5D |0 + \xE5\x5E |0 + \xE5\x5F |0 + \xE5\x60 |0 + \xE5\x61 |0 + \xE5\x62 |0 + \xE5\x63 |0 + \xE5\x64 |0 + \xE5\x65 |0 + \xE5\x66 |0 + \xE5\x67 |0 + \xE5\x68 |0 + \xE5\x69 |0 + \xE5\x6A |0 + \xE5\x6B |0 + \xE5\x6C |0 + \xE5\x6D |0 + \xE5\x6E |0 + \xE5\x6F |0 + \xE5\x70 |0 + \xE5\x71 |0 + \xE5\x72 |0 + \xE5\x73 |0 + \xF6\xC9 |0 + \xE5\x74 |0 + \xE5\x75 |0 + \xE5\x76 |0 + \xE5\x77 |0 + \xE5\x78 |0 + \xE5\x79 |0 + \xE5\x7A |0 + \xE5\x7B |0 + \xE5\x7C |0 + \xE5\x7D |0 + \xE5\x7E |0 + \xE5\x80 |0 + \xE5\x81 |0 + \xE5\x82 |0 + \xE5\x83 |0 + \xE5\x84 |0 + \xE5\x85 |0 + \xE5\x86 |0 + \xE5\x87 |0 + \xE5\x88 |0 + \xE5\x89 |0 + \xE5\x8A |0 + \xE5\x8B |0 + \xE5\x8C |0 + \xE5\x8D |0 + \xE5\x8E |0 + \xE5\x8F |0 + \xE5\x90 |0 + \xE5\x91 |0 + \xE5\x92 |0 + \xE5\x93 |0 + \xE5\x94 |0 + \xE5\x95 |0 + \xE5\x96 |0 + \xE5\x97 |0 + \xE5\x98 |0 + \xE5\x99 |0 + \xE5\x9A |0 + \xE5\x9B |0 + \xE5\x9C |0 + \xE5\x9D |0 + \xE5\x9E |0 + \xE5\x9F |0 + \xF6\xCA |0 + \xE5\xA0 |0 + \xE6\x40 |0 + \xE6\x41 |0 + \xE6\x42 |0 + \xE6\x43 |0 + \xE6\x44 |0 + \xE6\x45 |0 + \xE6\x46 |0 + \xE6\x47 |0 + \xE6\x48 |0 + \xE6\x49 |0 + \xE6\x4A |0 + \xE6\x4B |0 + \xE6\x4C |0 + \xE6\x4D |0 + \xE6\x4E |0 + \xE6\x4F |0 + \xE6\x50 |0 + \xE6\x51 |0 + \xE6\x52 |0 + \xE6\x53 |0 + \xE6\x54 |0 + \xE6\x55 |0 + \xE6\x56 |0 + \xE6\x57 |0 + \xE6\x58 |0 + \xE6\x59 |0 + \xE6\x5A |0 + \xE6\x5B |0 + \xE6\x5C |0 + \xE6\x5D |0 + \xE6\x5E |0 + \xE6\x5F |0 + \xE6\x60 |0 + \xE6\x61 |0 + \xE6\x62 |0 + \xF6\xCC |0 + \xE6\x63 |0 + \xE6\x64 |0 + \xE6\x65 |0 + \xE6\x66 |0 + \xE6\x67 |0 + \xE6\x68 |0 + \xE6\x69 |0 + \xE6\x6A |0 + \xE6\x6B |0 + \xE6\x6C |0 + \xE6\x6D |0 + \xE6\x6E |0 + \xE6\x6F |0 + \xE6\x70 |0 + \xE6\x71 |0 + \xE6\x72 |0 + \xE6\x73 |0 + \xE6\x74 |0 + \xE6\x75 |0 + \xE6\x76 |0 + \xE6\x77 |0 + \xE6\x78 |0 + \xE6\x79 |0 + \xE6\x7A |0 + \xE6\x7B |0 + \xE6\x7C |0 + \xE6\x7D |0 + \xE6\x7E |0 + \xE6\x80 |0 + \xE6\x81 |0 + \xE6\x82 |0 + \xE6\x83 |0 + \xE6\x84 |0 + \xE6\x85 |0 + \xE6\x86 |0 + \xE6\x87 |0 + \xE6\x88 |0 + \xE6\x89 |0 + \xE6\x8A |0 + \xE6\x8B |0 + \xE6\x8C |0 + \xE6\x8D |0 + \xE6\x8E |0 + \xE6\x8F |0 + \xE6\x90 |0 + \xE6\x91 |0 + \xE6\x92 |0 + \xE6\x93 |0 + \xE6\x94 |0 + \xE6\x95 |0 + \xE6\x96 |0 + \xE6\x97 |0 + \xE6\x98 |0 + \xE6\x99 |0 + \xE6\x9A |0 + \xE6\x9B |0 + \xE6\x9C |0 + \xE6\x9D |0 + \xF6\xCB |0 + \xE6\x9E |0 + \xE6\x9F |0 + \xE6\xA0 |0 + \xE7\x40 |0 + \xE7\x41 |0 + \xE7\x42 |0 + \xE7\x43 |0 + \xE7\x44 |0 + \xE7\x45 |0 + \xE7\x46 |0 + \xE7\x47 |0 + \xF7\xE9 |0 + \xE7\x48 |0 + \xE7\x49 |0 + \xE7\x4A |0 + \xE7\x4B |0 + \xE7\x4C |0 + \xE7\x4D |0 + \xE7\x4E |0 + \xE7\x4F |0 + \xE7\x50 |0 + \xE7\x51 |0 + \xE7\x52 |0 + \xE7\x53 |0 + \xE7\x54 |0 + \xE7\x55 |0 + \xE7\x56 |0 + \xE7\x57 |0 + \xE7\x58 |0 + \xE7\x59 |0 + \xE7\x5A |0 + \xE7\x5B |0 + \xE7\x5C |0 + \xE7\x5D |0 + \xE7\x5E |0 + \xE7\x5F |0 + \xE7\x60 |0 + \xE7\x61 |0 + \xE7\x62 |0 + \xE7\x63 |0 + \xE7\x64 |0 + \xE7\x65 |0 + \xE7\x66 |0 + \xE7\x67 |0 + \xE7\x68 |0 + \xE7\x69 |0 + \xE7\x6A |0 + \xE7\x6B |0 + \xE7\x6C |0 + \xE7\x6D |0 + \xE7\x6E |0 + \xE7\x6F |0 + \xE7\x70 |0 + \xE7\x71 |0 + \xE7\x72 |0 + \xE7\x73 |0 + \xE7\x74 |0 + \xE7\x75 |0 + \xE7\x76 |0 + \xE7\x77 |0 + \xE7\x78 |0 + \xE7\x79 |0 + \xE7\x7A |0 + \xE7\x7B |0 + \xE7\x7C |0 + \xE7\x7D |0 + \xE7\x7E |0 + \xE7\x80 |0 + \xE7\x81 |0 + \xE7\x82 |0 + \xE7\x83 |0 + \xE7\x84 |0 + \xE7\x85 |0 + \xE7\x86 |0 + \xE7\x87 |0 + \xE7\x88 |0 + \xE7\x89 |0 + \xE7\x8A |0 + \xE7\x8B |0 + \xE7\x8C |0 + \xE7\x8D |0 + \xE7\x8E |0 + \xE7\x8F |0 + \xE7\x90 |0 + \xE7\x91 |0 + \xE7\x92 |0 + \xE7\x93 |0 + \xE7\x94 |0 + \xE7\x95 |0 + \xE7\x96 |0 + \xE7\x97 |0 + \xE7\x98 |0 + \xE7\x99 |0 + \xE7\x9A |0 + \xE7\x9B |0 + \xE7\x9C |0 + \xE7\x9D |0 + \xE7\x9E |0 + \xE7\x9F |0 + \xE7\xA0 |0 + \xE8\x40 |0 + \xE8\x41 |0 + \xE8\x42 |0 + \xE8\x43 |0 + \xE8\x44 |0 + \xE8\x45 |0 + \xE8\x46 |0 + \xE8\x47 |0 + \xE8\x48 |0 + \xE8\x49 |0 + \xE8\x4A |0 + \xE8\x4B |0 + \xE8\x4C |0 + \xE8\x4D |0 + \xE8\x4E |0 + \xF6\xCD |0 + \xE8\x4F |0 + \xE8\x50 |0 + \xE8\x51 |0 + \xE8\x52 |0 + \xE8\x53 |0 + \xE8\x54 |0 + \xE8\x55 |0 + \xE8\x56 |0 + \xE8\x57 |0 + \xE8\x58 |0 + \xE8\x59 |0 + \xE8\x5A |0 + \xE8\x5B |0 + \xE8\x5C |0 + \xE8\x5D |0 + \xE8\x5E |0 + \xE8\x5F |0 + \xE8\x60 |0 + \xE8\x61 |0 + \xE8\x62 |0 + \xE8\x63 |0 + \xE8\x64 |0 + \xE8\x65 |0 + \xE8\x66 |0 + \xE8\x67 |0 + \xE8\x68 |0 + \xE8\x69 |0 + \xE8\x6A |0 + \xE8\x6B |0 + \xE8\x6C |0 + \xE8\x6D |0 + \xE8\x6E |0 + \xE8\x6F |0 + \xE8\x70 |0 + \xE8\x71 |0 + \xE8\x72 |0 + \xE8\x73 |0 + \xE8\x74 |0 + \xE8\x75 |0 + \xE8\x76 |0 + \xE8\x77 |0 + \xE8\x78 |0 + \xE8\x79 |0 + \xE8\x7A |0 + \xF6\xCE |0 + \xE8\x7B |0 + \xE8\x7C |0 + \xE8\x7D |0 + \xE8\x7E |0 + \xE8\x80 |0 + \xE8\x81 |0 + \xE8\x82 |0 + \xE8\x83 |0 + \xE8\x84 |0 + \xE8\x85 |0 + \xE8\x86 |0 + \xE8\x87 |0 + \xE8\x88 |0 + \xE8\x89 |0 + \xE8\x8A |0 + \xE8\x8B |0 + \xE8\x8C |0 + \xE8\x8D |0 + \xE8\x8E |0 + \xE8\x8F |0 + \xE8\x90 |0 + \xE8\x91 |0 + \xE8\x92 |0 + \xE8\x93 |0 + \xE8\x94 |0 + \xEE\xC4 |0 + \xEE\xC5 |0 + \xEE\xC6 |0 + \xD5\xEB |0 + \xB6\xA4 |0 + \xEE\xC8 |0 + \xEE\xC7 |0 + \xEE\xC9 |0 + \xEE\xCA |0 + \xC7\xA5 |0 + \xEE\xCB |0 + \xEE\xCC |0 + \xE8\x95 |0 + \xB7\xB0 |0 + \xB5\xF6 |0 + \xEE\xCD |0 + \xEE\xCF |0 + \xE8\x96 |0 + \xEE\xCE |0 + \xE8\x97 |0 + \xB8\xC6 |0 + \xEE\xD0 |0 + \xEE\xD1 |0 + \xEE\xD2 |0 + \xB6\xDB |0 + \xB3\xAE |0 + \xD6\xD3 |0 + \xC4\xC6 |0 + \xB1\xB5 |0 + \xB8\xD6 |0 + \xEE\xD3 |0 + \xEE\xD4 |0 + \xD4\xBF |0 + \xC7\xD5 |0 + \xBE\xFB |0 + \xCE\xD9 |0 + \xB9\xB3 |0 + \xEE\xD6 |0 + \xEE\xD5 |0 + \xEE\xD8 |0 + \xEE\xD7 |0 + \xC5\xA5 |0 + \xEE\xD9 |0 + \xEE\xDA |0 + \xC7\xAE |0 + \xEE\xDB |0 + \xC7\xAF |0 + \xEE\xDC |0 + \xB2\xA7 |0 + \xEE\xDD |0 + \xEE\xDE |0 + \xEE\xDF |0 + \xEE\xE0 |0 + \xEE\xE1 |0 + \xD7\xEA |0 + \xEE\xE2 |0 + \xEE\xE3 |0 + \xBC\xD8 |0 + \xEE\xE4 |0 + \xD3\xCB |0 + \xCC\xFA |0 + \xB2\xAC |0 + \xC1\xE5 |0 + \xEE\xE5 |0 + \xC7\xA6 |0 + \xC3\xAD |0 + \xE8\x98 |0 + \xEE\xE6 |0 + \xEE\xE7 |0 + \xEE\xE8 |0 + \xEE\xE9 |0 + \xEE\xEA |0 + \xEE\xEB |0 + \xEE\xEC |0 + \xE8\x99 |0 + \xEE\xED |0 + \xEE\xEE |0 + \xEE\xEF |0 + \xE8\x9A |0 + \xE8\x9B |0 + \xEE\xF0 |0 + \xEE\xF1 |0 + \xEE\xF2 |0 + \xEE\xF4 |0 + \xEE\xF3 |0 + \xE8\x9C |0 + \xEE\xF5 |0 + \xCD\xAD |0 + \xC2\xC1 |0 + \xEE\xF6 |0 + \xEE\xF7 |0 + \xEE\xF8 |0 + \xD5\xA1 |0 + \xEE\xF9 |0 + \xCF\xB3 |0 + \xEE\xFA |0 + \xEE\xFB |0 + \xE8\x9D |0 + \xEE\xFC |0 + \xEE\xFD |0 + \xEF\xA1 |0 + \xEE\xFE |0 + \xEF\xA2 |0 + \xB8\xF5 |0 + \xC3\xFA |0 + \xEF\xA3 |0 + \xEF\xA4 |0 + \xBD\xC2 |0 + \xD2\xBF |0 + \xB2\xF9 |0 + \xEF\xA5 |0 + \xEF\xA6 |0 + \xEF\xA7 |0 + \xD2\xF8 |0 + \xEF\xA8 |0 + \xD6\xFD |0 + \xEF\xA9 |0 + \xC6\xCC |0 + \xE8\x9E |0 + \xEF\xAA |0 + \xEF\xAB |0 + \xC1\xB4 |0 + \xEF\xAC |0 + \xCF\xFA |0 + \xCB\xF8 |0 + \xEF\xAE |0 + \xEF\xAD |0 + \xB3\xFA |0 + \xB9\xF8 |0 + \xEF\xAF |0 + \xEF\xB0 |0 + \xD0\xE2 |0 + \xEF\xB1 |0 + \xEF\xB2 |0 + \xB7\xE6 |0 + \xD0\xBF |0 + \xEF\xB3 |0 + \xEF\xB4 |0 + \xEF\xB5 |0 + \xC8\xF1 |0 + \xCC\xE0 |0 + \xEF\xB6 |0 + \xEF\xB7 |0 + \xEF\xB8 |0 + \xEF\xB9 |0 + \xEF\xBA |0 + \xD5\xE0 |0 + \xEF\xBB |0 + \xB4\xED |0 + \xC3\xAA |0 + \xEF\xBC |0 + \xE8\x9F |0 + \xEF\xBD |0 + \xEF\xBE |0 + \xEF\xBF |0 + \xE8\xA0 |0 + \xCE\xFD |0 + \xEF\xC0 |0 + \xC2\xE0 |0 + \xB4\xB8 |0 + \xD7\xB6 |0 + \xBD\xF5 |0 + \xE9\x40 |0 + \xCF\xC7 |0 + \xEF\xC3 |0 + \xEF\xC1 |0 + \xEF\xC2 |0 + \xEF\xC4 |0 + \xB6\xA7 |0 + \xBC\xFC |0 + \xBE\xE2 |0 + \xC3\xCC |0 + \xEF\xC5 |0 + \xEF\xC6 |0 + \xE9\x41 |0 + \xEF\xC7 |0 + \xEF\xCF |0 + \xEF\xC8 |0 + \xEF\xC9 |0 + \xEF\xCA |0 + \xC7\xC2 |0 + \xEF\xF1 |0 + \xB6\xCD |0 + \xEF\xCB |0 + \xE9\x42 |0 + \xEF\xCC |0 + \xEF\xCD |0 + \xB6\xC6 |0 + \xC3\xBE |0 + \xEF\xCE |0 + \xE9\x43 |0 + \xEF\xD0 |0 + \xEF\xD1 |0 + \xEF\xD2 |0 + \xD5\xF2 |0 + \xE9\x44 |0 + \xEF\xD3 |0 + \xC4\xF7 |0 + \xE9\x45 |0 + \xEF\xD4 |0 + \xC4\xF8 |0 + \xEF\xD5 |0 + \xEF\xD6 |0 + \xB8\xE4 |0 + \xB0\xF7 |0 + \xEF\xD7 |0 + \xEF\xD8 |0 + \xEF\xD9 |0 + \xE9\x46 |0 + \xEF\xDA |0 + \xEF\xDB |0 + \xEF\xDC |0 + \xEF\xDD |0 + \xE9\x47 |0 + \xEF\xDE |0 + \xBE\xB5 |0 + \xEF\xE1 |0 + \xEF\xDF |0 + \xEF\xE0 |0 + \xE9\x48 |0 + \xEF\xE2 |0 + \xEF\xE3 |0 + \xC1\xCD |0 + \xEF\xE4 |0 + \xEF\xE5 |0 + \xEF\xE6 |0 + \xEF\xE7 |0 + \xEF\xE8 |0 + \xEF\xE9 |0 + \xEF\xEA |0 + \xEF\xEB |0 + \xEF\xEC |0 + \xC0\xD8 |0 + \xE9\x49 |0 + \xEF\xED |0 + \xC1\xAD |0 + \xEF\xEE |0 + \xEF\xEF |0 + \xEF\xF0 |0 + \xE9\x4A |0 + \xE9\x4B |0 + \xCF\xE2 |0 + \xE9\x4C |0 + \xE9\x4D |0 + \xE9\x4E |0 + \xE9\x4F |0 + \xE9\x50 |0 + \xE9\x51 |0 + \xE9\x52 |0 + \xE9\x53 |0 + \xB3\xA4 |0 + \xE9\x54 |0 + \xE9\x55 |0 + \xE9\x56 |0 + \xE9\x57 |0 + \xE9\x58 |0 + \xE9\x59 |0 + \xE9\x5A |0 + \xE9\x5B |0 + \xE9\x5C |0 + \xE9\x5D |0 + \xE9\x5E |0 + \xE9\x5F |0 + \xE9\x60 |0 + \xE9\x61 |0 + \xE9\x62 |0 + \xE9\x63 |0 + \xE9\x64 |0 + \xE9\x65 |0 + \xE9\x66 |0 + \xE9\x67 |0 + \xE9\x68 |0 + \xE9\x69 |0 + \xE9\x6A |0 + \xE9\x6B |0 + \xE9\x6C |0 + \xE9\x6D |0 + \xE9\x6E |0 + \xE9\x6F |0 + \xE9\x70 |0 + \xE9\x71 |0 + \xE9\x72 |0 + \xE9\x73 |0 + \xE9\x74 |0 + \xE9\x75 |0 + \xE9\x76 |0 + \xE9\x77 |0 + \xE9\x78 |0 + \xE9\x79 |0 + \xE9\x7A |0 + \xE9\x7B |0 + \xE9\x7C |0 + \xE9\x7D |0 + \xE9\x7E |0 + \xE9\x80 |0 + \xE9\x81 |0 + \xE9\x82 |0 + \xE9\x83 |0 + \xE9\x84 |0 + \xE9\x85 |0 + \xE9\x86 |0 + \xE9\x87 |0 + \xE9\x88 |0 + \xE9\x89 |0 + \xE9\x8A |0 + \xE9\x8B |0 + \xE9\x8C |0 + \xE9\x8D |0 + \xE9\x8E |0 + \xE9\x8F |0 + \xE9\x90 |0 + \xE9\x91 |0 + \xE9\x92 |0 + \xE9\x93 |0 + \xE9\x94 |0 + \xE9\x95 |0 + \xE9\x96 |0 + \xE9\x97 |0 + \xE9\x98 |0 + \xE9\x99 |0 + \xE9\x9A |0 + \xE9\x9B |0 + \xE9\x9C |0 + \xE9\x9D |0 + \xE9\x9E |0 + \xE9\x9F |0 + \xE9\xA0 |0 + \xEA\x40 |0 + \xEA\x41 |0 + \xEA\x42 |0 + \xEA\x43 |0 + \xEA\x44 |0 + \xEA\x45 |0 + \xEA\x46 |0 + \xEA\x47 |0 + \xEA\x48 |0 + \xEA\x49 |0 + \xEA\x4A |0 + \xEA\x4B |0 + \xEA\x4C |0 + \xEA\x4D |0 + \xEA\x4E |0 + \xEA\x4F |0 + \xEA\x50 |0 + \xEA\x51 |0 + \xEA\x52 |0 + \xEA\x53 |0 + \xEA\x54 |0 + \xEA\x55 |0 + \xEA\x56 |0 + \xEA\x57 |0 + \xEA\x58 |0 + \xEA\x59 |0 + \xEA\x5A |0 + \xEA\x5B |0 + \xC3\xC5 |0 + \xE3\xC5 |0 + \xC9\xC1 |0 + \xE3\xC6 |0 + \xEA\x5C |0 + \xB1\xD5 |0 + \xCE\xCA |0 + \xB4\xB3 |0 + \xC8\xF2 |0 + \xE3\xC7 |0 + \xCF\xD0 |0 + \xE3\xC8 |0 + \xBC\xE4 |0 + \xE3\xC9 |0 + \xE3\xCA |0 + \xC3\xC6 |0 + \xD5\xA2 |0 + \xC4\xD6 |0 + \xB9\xEB |0 + \xCE\xC5 |0 + \xE3\xCB |0 + \xC3\xF6 |0 + \xE3\xCC |0 + \xEA\x5D |0 + \xB7\xA7 |0 + \xB8\xF3 |0 + \xBA\xD2 |0 + \xE3\xCD |0 + \xE3\xCE |0 + \xD4\xC4 |0 + \xE3\xCF |0 + \xEA\x5E |0 + \xE3\xD0 |0 + \xD1\xCB |0 + \xE3\xD1 |0 + \xE3\xD2 |0 + \xE3\xD3 |0 + \xE3\xD4 |0 + \xD1\xD6 |0 + \xE3\xD5 |0 + \xB2\xFB |0 + \xC0\xBB |0 + \xE3\xD6 |0 + \xEA\x5F |0 + \xC0\xAB |0 + \xE3\xD7 |0 + \xE3\xD8 |0 + \xE3\xD9 |0 + \xEA\x60 |0 + \xE3\xDA |0 + \xE3\xDB |0 + \xEA\x61 |0 + \xB8\xB7 |0 + \xDA\xE2 |0 + \xEA\x62 |0 + \xB6\xD3 |0 + \xEA\x63 |0 + \xDA\xE4 |0 + \xDA\xE3 |0 + \xEA\x64 |0 + \xEA\x65 |0 + \xEA\x66 |0 + \xEA\x67 |0 + \xEA\x68 |0 + \xEA\x69 |0 + \xEA\x6A |0 + \xDA\xE6 |0 + \xEA\x6B |0 + \xEA\x6C |0 + \xEA\x6D |0 + \xC8\xEE |0 + \xEA\x6E |0 + \xEA\x6F |0 + \xDA\xE5 |0 + \xB7\xC0 |0 + \xD1\xF4 |0 + \xD2\xF5 |0 + \xD5\xF3 |0 + \xBD\xD7 |0 + \xEA\x70 |0 + \xEA\x71 |0 + \xEA\x72 |0 + \xEA\x73 |0 + \xD7\xE8 |0 + \xDA\xE8 |0 + \xDA\xE7 |0 + \xEA\x74 |0 + \xB0\xA2 |0 + \xCD\xD3 |0 + \xEA\x75 |0 + \xDA\xE9 |0 + \xEA\x76 |0 + \xB8\xBD |0 + \xBC\xCA |0 + \xC2\xBD |0 + \xC2\xA4 |0 + \xB3\xC2 |0 + \xDA\xEA |0 + \xEA\x77 |0 + \xC2\xAA |0 + \xC4\xB0 |0 + \xBD\xB5 |0 + \xEA\x78 |0 + \xEA\x79 |0 + \xCF\xDE |0 + \xEA\x7A |0 + \xEA\x7B |0 + \xEA\x7C |0 + \xDA\xEB |0 + \xC9\xC2 |0 + \xEA\x7D |0 + \xEA\x7E |0 + \xEA\x80 |0 + \xEA\x81 |0 + \xEA\x82 |0 + \xB1\xDD |0 + \xEA\x83 |0 + \xEA\x84 |0 + \xEA\x85 |0 + \xDA\xEC |0 + \xEA\x86 |0 + \xB6\xB8 |0 + \xD4\xBA |0 + \xEA\x87 |0 + \xB3\xFD |0 + \xEA\x88 |0 + \xEA\x89 |0 + \xDA\xED |0 + \xD4\xC9 |0 + \xCF\xD5 |0 + \xC5\xE3 |0 + \xEA\x8A |0 + \xDA\xEE |0 + \xEA\x8B |0 + \xEA\x8C |0 + \xEA\x8D |0 + \xEA\x8E |0 + \xEA\x8F |0 + \xDA\xEF |0 + \xEA\x90 |0 + \xDA\xF0 |0 + \xC1\xEA |0 + \xCC\xD5 |0 + \xCF\xDD |0 + \xEA\x91 |0 + \xEA\x92 |0 + \xEA\x93 |0 + \xEA\x94 |0 + \xEA\x95 |0 + \xEA\x96 |0 + \xEA\x97 |0 + \xEA\x98 |0 + \xEA\x99 |0 + \xEA\x9A |0 + \xEA\x9B |0 + \xEA\x9C |0 + \xEA\x9D |0 + \xD3\xE7 |0 + \xC2\xA1 |0 + \xEA\x9E |0 + \xDA\xF1 |0 + \xEA\x9F |0 + \xEA\xA0 |0 + \xCB\xE5 |0 + \xEB\x40 |0 + \xDA\xF2 |0 + \xEB\x41 |0 + \xCB\xE6 |0 + \xD2\xFE |0 + \xEB\x42 |0 + \xEB\x43 |0 + \xEB\x44 |0 + \xB8\xF4 |0 + \xEB\x45 |0 + \xEB\x46 |0 + \xDA\xF3 |0 + \xB0\xAF |0 + \xCF\xB6 |0 + \xEB\x47 |0 + \xEB\x48 |0 + \xD5\xCF |0 + \xEB\x49 |0 + \xEB\x4A |0 + \xEB\x4B |0 + \xEB\x4C |0 + \xEB\x4D |0 + \xEB\x4E |0 + \xEB\x4F |0 + \xEB\x50 |0 + \xEB\x51 |0 + \xEB\x52 |0 + \xCB\xED |0 + \xEB\x53 |0 + \xEB\x54 |0 + \xEB\x55 |0 + \xEB\x56 |0 + \xEB\x57 |0 + \xEB\x58 |0 + \xEB\x59 |0 + \xEB\x5A |0 + \xDA\xF4 |0 + \xEB\x5B |0 + \xEB\x5C |0 + \xE3\xC4 |0 + \xEB\x5D |0 + \xEB\x5E |0 + \xC1\xA5 |0 + \xEB\x5F |0 + \xEB\x60 |0 + \xF6\xBF |0 + \xEB\x61 |0 + \xEB\x62 |0 + \xF6\xC0 |0 + \xF6\xC1 |0 + \xC4\xD1 |0 + \xEB\x63 |0 + \xC8\xB8 |0 + \xD1\xE3 |0 + \xEB\x64 |0 + \xEB\x65 |0 + \xD0\xDB |0 + \xD1\xC5 |0 + \xBC\xAF |0 + \xB9\xCD |0 + \xEB\x66 |0 + \xEF\xF4 |0 + \xEB\x67 |0 + \xEB\x68 |0 + \xB4\xC6 |0 + \xD3\xBA |0 + \xF6\xC2 |0 + \xB3\xFB |0 + \xEB\x69 |0 + \xEB\x6A |0 + \xF6\xC3 |0 + \xEB\x6B |0 + \xEB\x6C |0 + \xB5\xF1 |0 + \xEB\x6D |0 + \xEB\x6E |0 + \xEB\x6F |0 + \xEB\x70 |0 + \xEB\x71 |0 + \xEB\x72 |0 + \xEB\x73 |0 + \xEB\x74 |0 + \xEB\x75 |0 + \xEB\x76 |0 + \xF6\xC5 |0 + \xEB\x77 |0 + \xEB\x78 |0 + \xEB\x79 |0 + \xEB\x7A |0 + \xEB\x7B |0 + \xEB\x7C |0 + \xEB\x7D |0 + \xD3\xEA |0 + \xF6\xA7 |0 + \xD1\xA9 |0 + \xEB\x7E |0 + \xEB\x80 |0 + \xEB\x81 |0 + \xEB\x82 |0 + \xF6\xA9 |0 + \xEB\x83 |0 + \xEB\x84 |0 + \xEB\x85 |0 + \xF6\xA8 |0 + \xEB\x86 |0 + \xEB\x87 |0 + \xC1\xE3 |0 + \xC0\xD7 |0 + \xEB\x88 |0 + \xB1\xA2 |0 + \xEB\x89 |0 + \xEB\x8A |0 + \xEB\x8B |0 + \xEB\x8C |0 + \xCE\xED |0 + \xEB\x8D |0 + \xD0\xE8 |0 + \xF6\xAB |0 + \xEB\x8E |0 + \xEB\x8F |0 + \xCF\xF6 |0 + \xEB\x90 |0 + \xF6\xAA |0 + \xD5\xF0 |0 + \xF6\xAC |0 + \xC3\xB9 |0 + \xEB\x91 |0 + \xEB\x92 |0 + \xEB\x93 |0 + \xBB\xF4 |0 + \xF6\xAE |0 + \xF6\xAD |0 + \xEB\x94 |0 + \xEB\x95 |0 + \xEB\x96 |0 + \xC4\xDE |0 + \xEB\x97 |0 + \xEB\x98 |0 + \xC1\xD8 |0 + \xEB\x99 |0 + \xEB\x9A |0 + \xEB\x9B |0 + \xEB\x9C |0 + \xEB\x9D |0 + \xCB\xAA |0 + \xEB\x9E |0 + \xCF\xBC |0 + \xEB\x9F |0 + \xEB\xA0 |0 + \xEC\x40 |0 + \xEC\x41 |0 + \xEC\x42 |0 + \xEC\x43 |0 + \xEC\x44 |0 + \xEC\x45 |0 + \xEC\x46 |0 + \xEC\x47 |0 + \xEC\x48 |0 + \xF6\xAF |0 + \xEC\x49 |0 + \xEC\x4A |0 + \xF6\xB0 |0 + \xEC\x4B |0 + \xEC\x4C |0 + \xF6\xB1 |0 + \xEC\x4D |0 + \xC2\xB6 |0 + \xEC\x4E |0 + \xEC\x4F |0 + \xEC\x50 |0 + \xEC\x51 |0 + \xEC\x52 |0 + \xB0\xD4 |0 + \xC5\xF9 |0 + \xEC\x53 |0 + \xEC\x54 |0 + \xEC\x55 |0 + \xEC\x56 |0 + \xF6\xB2 |0 + \xEC\x57 |0 + \xEC\x58 |0 + \xEC\x59 |0 + \xEC\x5A |0 + \xEC\x5B |0 + \xEC\x5C |0 + \xEC\x5D |0 + \xEC\x5E |0 + \xEC\x5F |0 + \xEC\x60 |0 + \xEC\x61 |0 + \xEC\x62 |0 + \xEC\x63 |0 + \xEC\x64 |0 + \xEC\x65 |0 + \xEC\x66 |0 + \xEC\x67 |0 + \xEC\x68 |0 + \xEC\x69 |0 + \xC7\xE0 |0 + \xF6\xA6 |0 + \xEC\x6A |0 + \xEC\x6B |0 + \xBE\xB8 |0 + \xEC\x6C |0 + \xEC\x6D |0 + \xBE\xB2 |0 + \xEC\x6E |0 + \xB5\xE5 |0 + \xEC\x6F |0 + \xEC\x70 |0 + \xB7\xC7 |0 + \xEC\x71 |0 + \xBF\xBF |0 + \xC3\xD2 |0 + \xC3\xE6 |0 + \xEC\x72 |0 + \xEC\x73 |0 + \xD8\xCC |0 + \xEC\x74 |0 + \xEC\x75 |0 + \xEC\x76 |0 + \xB8\xEF |0 + \xEC\x77 |0 + \xEC\x78 |0 + \xEC\x79 |0 + \xEC\x7A |0 + \xEC\x7B |0 + \xEC\x7C |0 + \xEC\x7D |0 + \xEC\x7E |0 + \xEC\x80 |0 + \xBD\xF9 |0 + \xD1\xA5 |0 + \xEC\x81 |0 + \xB0\xD0 |0 + \xEC\x82 |0 + \xEC\x83 |0 + \xEC\x84 |0 + \xEC\x85 |0 + \xEC\x86 |0 + \xF7\xB0 |0 + \xEC\x87 |0 + \xEC\x88 |0 + \xEC\x89 |0 + \xEC\x8A |0 + \xEC\x8B |0 + \xEC\x8C |0 + \xEC\x8D |0 + \xEC\x8E |0 + \xF7\xB1 |0 + \xEC\x8F |0 + \xEC\x90 |0 + \xEC\x91 |0 + \xEC\x92 |0 + \xEC\x93 |0 + \xD0\xAC |0 + \xEC\x94 |0 + \xB0\xB0 |0 + \xEC\x95 |0 + \xEC\x96 |0 + \xEC\x97 |0 + \xF7\xB2 |0 + \xF7\xB3 |0 + \xEC\x98 |0 + \xF7\xB4 |0 + \xEC\x99 |0 + \xEC\x9A |0 + \xEC\x9B |0 + \xC7\xCA |0 + \xEC\x9C |0 + \xEC\x9D |0 + \xEC\x9E |0 + \xEC\x9F |0 + \xEC\xA0 |0 + \xED\x40 |0 + \xED\x41 |0 + \xBE\xCF |0 + \xED\x42 |0 + \xED\x43 |0 + \xF7\xB7 |0 + \xED\x44 |0 + \xED\x45 |0 + \xED\x46 |0 + \xED\x47 |0 + \xED\x48 |0 + \xED\x49 |0 + \xED\x4A |0 + \xF7\xB6 |0 + \xED\x4B |0 + \xB1\xDE |0 + \xED\x4C |0 + \xF7\xB5 |0 + \xED\x4D |0 + \xED\x4E |0 + \xF7\xB8 |0 + \xED\x4F |0 + \xF7\xB9 |0 + \xED\x50 |0 + \xED\x51 |0 + \xED\x52 |0 + \xED\x53 |0 + \xED\x54 |0 + \xED\x55 |0 + \xED\x56 |0 + \xED\x57 |0 + \xED\x58 |0 + \xED\x59 |0 + \xED\x5A |0 + \xED\x5B |0 + \xED\x5C |0 + \xED\x5D |0 + \xED\x5E |0 + \xED\x5F |0 + \xED\x60 |0 + \xED\x61 |0 + \xED\x62 |0 + \xED\x63 |0 + \xED\x64 |0 + \xED\x65 |0 + \xED\x66 |0 + \xED\x67 |0 + \xED\x68 |0 + \xED\x69 |0 + \xED\x6A |0 + \xED\x6B |0 + \xED\x6C |0 + \xED\x6D |0 + \xED\x6E |0 + \xED\x6F |0 + \xED\x70 |0 + \xED\x71 |0 + \xED\x72 |0 + \xED\x73 |0 + \xED\x74 |0 + \xED\x75 |0 + \xED\x76 |0 + \xED\x77 |0 + \xED\x78 |0 + \xED\x79 |0 + \xED\x7A |0 + \xED\x7B |0 + \xED\x7C |0 + \xED\x7D |0 + \xED\x7E |0 + \xED\x80 |0 + \xED\x81 |0 + \xCE\xA4 |0 + \xC8\xCD |0 + \xED\x82 |0 + \xBA\xAB |0 + \xE8\xB8 |0 + \xE8\xB9 |0 + \xE8\xBA |0 + \xBE\xC2 |0 + \xED\x83 |0 + \xED\x84 |0 + \xED\x85 |0 + \xED\x86 |0 + \xED\x87 |0 + \xD2\xF4 |0 + \xED\x88 |0 + \xD4\xCF |0 + \xC9\xD8 |0 + \xED\x89 |0 + \xED\x8A |0 + \xED\x8B |0 + \xED\x8C |0 + \xED\x8D |0 + \xED\x8E |0 + \xED\x8F |0 + \xED\x90 |0 + \xED\x91 |0 + \xED\x92 |0 + \xED\x93 |0 + \xED\x94 |0 + \xED\x95 |0 + \xED\x96 |0 + \xED\x97 |0 + \xED\x98 |0 + \xED\x99 |0 + \xED\x9A |0 + \xED\x9B |0 + \xED\x9C |0 + \xED\x9D |0 + \xED\x9E |0 + \xED\x9F |0 + \xED\xA0 |0 + \xEE\x40 |0 + \xEE\x41 |0 + \xEE\x42 |0 + \xEE\x43 |0 + \xEE\x44 |0 + \xEE\x45 |0 + \xEE\x46 |0 + \xEE\x47 |0 + \xEE\x48 |0 + \xEE\x49 |0 + \xEE\x4A |0 + \xEE\x4B |0 + \xEE\x4C |0 + \xEE\x4D |0 + \xEE\x4E |0 + \xEE\x4F |0 + \xEE\x50 |0 + \xEE\x51 |0 + \xEE\x52 |0 + \xEE\x53 |0 + \xEE\x54 |0 + \xEE\x55 |0 + \xEE\x56 |0 + \xEE\x57 |0 + \xEE\x58 |0 + \xEE\x59 |0 + \xEE\x5A |0 + \xEE\x5B |0 + \xEE\x5C |0 + \xEE\x5D |0 + \xEE\x5E |0 + \xEE\x5F |0 + \xEE\x60 |0 + \xEE\x61 |0 + \xEE\x62 |0 + \xEE\x63 |0 + \xEE\x64 |0 + \xEE\x65 |0 + \xEE\x66 |0 + \xEE\x67 |0 + \xEE\x68 |0 + \xEE\x69 |0 + \xEE\x6A |0 + \xEE\x6B |0 + \xEE\x6C |0 + \xEE\x6D |0 + \xEE\x6E |0 + \xEE\x6F |0 + \xEE\x70 |0 + \xEE\x71 |0 + \xEE\x72 |0 + \xEE\x73 |0 + \xEE\x74 |0 + \xEE\x75 |0 + \xEE\x76 |0 + \xEE\x77 |0 + \xEE\x78 |0 + \xEE\x79 |0 + \xEE\x7A |0 + \xEE\x7B |0 + \xEE\x7C |0 + \xEE\x7D |0 + \xEE\x7E |0 + \xEE\x80 |0 + \xEE\x81 |0 + \xEE\x82 |0 + \xEE\x83 |0 + \xEE\x84 |0 + \xEE\x85 |0 + \xEE\x86 |0 + \xEE\x87 |0 + \xEE\x88 |0 + \xEE\x89 |0 + \xEE\x8A |0 + \xEE\x8B |0 + \xEE\x8C |0 + \xEE\x8D |0 + \xEE\x8E |0 + \xEE\x8F |0 + \xEE\x90 |0 + \xEE\x91 |0 + \xEE\x92 |0 + \xEE\x93 |0 + \xEE\x94 |0 + \xEE\x95 |0 + \xEE\x96 |0 + \xEE\x97 |0 + \xEE\x98 |0 + \xEE\x99 |0 + \xEE\x9A |0 + \xEE\x9B |0 + \xEE\x9C |0 + \xEE\x9D |0 + \xEE\x9E |0 + \xEE\x9F |0 + \xEE\xA0 |0 + \xEF\x40 |0 + \xEF\x41 |0 + \xEF\x42 |0 + \xEF\x43 |0 + \xEF\x44 |0 + \xEF\x45 |0 + \xD2\xB3 |0 + \xB6\xA5 |0 + \xC7\xEA |0 + \xF1\xFC |0 + \xCF\xEE |0 + \xCB\xB3 |0 + \xD0\xEB |0 + \xE7\xEF |0 + \xCD\xE7 |0 + \xB9\xCB |0 + \xB6\xD9 |0 + \xF1\xFD |0 + \xB0\xE4 |0 + \xCB\xCC |0 + \xF1\xFE |0 + \xD4\xA4 |0 + \xC2\xAD |0 + \xC1\xEC |0 + \xC6\xC4 |0 + \xBE\xB1 |0 + \xF2\xA1 |0 + \xBC\xD5 |0 + \xEF\x46 |0 + \xF2\xA2 |0 + \xF2\xA3 |0 + \xEF\x47 |0 + \xF2\xA4 |0 + \xD2\xC3 |0 + \xC6\xB5 |0 + \xEF\x48 |0 + \xCD\xC7 |0 + \xF2\xA5 |0 + \xEF\x49 |0 + \xD3\xB1 |0 + \xBF\xC5 |0 + \xCC\xE2 |0 + \xEF\x4A |0 + \xF2\xA6 |0 + \xF2\xA7 |0 + \xD1\xD5 |0 + \xB6\xEE |0 + \xF2\xA8 |0 + \xF2\xA9 |0 + \xB5\xDF |0 + \xF2\xAA |0 + \xF2\xAB |0 + \xEF\x4B |0 + \xB2\xFC |0 + \xF2\xAC |0 + \xF2\xAD |0 + \xC8\xA7 |0 + \xEF\x4C |0 + \xEF\x4D |0 + \xEF\x4E |0 + \xEF\x4F |0 + \xEF\x50 |0 + \xEF\x51 |0 + \xEF\x52 |0 + \xEF\x53 |0 + \xEF\x54 |0 + \xEF\x55 |0 + \xEF\x56 |0 + \xEF\x57 |0 + \xEF\x58 |0 + \xEF\x59 |0 + \xEF\x5A |0 + \xEF\x5B |0 + \xEF\x5C |0 + \xEF\x5D |0 + \xEF\x5E |0 + \xEF\x5F |0 + \xEF\x60 |0 + \xEF\x61 |0 + \xEF\x62 |0 + \xEF\x63 |0 + \xEF\x64 |0 + \xEF\x65 |0 + \xEF\x66 |0 + \xEF\x67 |0 + \xEF\x68 |0 + \xEF\x69 |0 + \xEF\x6A |0 + \xEF\x6B |0 + \xEF\x6C |0 + \xEF\x6D |0 + \xEF\x6E |0 + \xEF\x6F |0 + \xEF\x70 |0 + \xEF\x71 |0 + \xB7\xE7 |0 + \xEF\x72 |0 + \xEF\x73 |0 + \xEC\xA9 |0 + \xEC\xAA |0 + \xEC\xAB |0 + \xEF\x74 |0 + \xEC\xAC |0 + \xEF\x75 |0 + \xEF\x76 |0 + \xC6\xAE |0 + \xEC\xAD |0 + \xEC\xAE |0 + \xEF\x77 |0 + \xEF\x78 |0 + \xEF\x79 |0 + \xB7\xC9 |0 + \xCA\xB3 |0 + \xEF\x7A |0 + \xEF\x7B |0 + \xEF\x7C |0 + \xEF\x7D |0 + \xEF\x7E |0 + \xEF\x80 |0 + \xEF\x81 |0 + \xE2\xB8 |0 + \xF7\xCF |0 + \xEF\x82 |0 + \xEF\x83 |0 + \xEF\x84 |0 + \xEF\x85 |0 + \xEF\x86 |0 + \xEF\x87 |0 + \xEF\x88 |0 + \xEF\x89 |0 + \xEF\x8A |0 + \xEF\x8B |0 + \xEF\x8C |0 + \xEF\x8D |0 + \xEF\x8E |0 + \xEF\x8F |0 + \xEF\x90 |0 + \xEF\x91 |0 + \xEF\x92 |0 + \xEF\x93 |0 + \xEF\x94 |0 + \xEF\x95 |0 + \xEF\x96 |0 + \xEF\x97 |0 + \xEF\x98 |0 + \xEF\x99 |0 + \xEF\x9A |0 + \xEF\x9B |0 + \xEF\x9C |0 + \xEF\x9D |0 + \xEF\x9E |0 + \xEF\x9F |0 + \xEF\xA0 |0 + \xF0\x40 |0 + \xF0\x41 |0 + \xF0\x42 |0 + \xF0\x43 |0 + \xF0\x44 |0 + \xF7\xD0 |0 + \xF0\x45 |0 + \xF0\x46 |0 + \xB2\xCD |0 + \xF0\x47 |0 + \xF0\x48 |0 + \xF0\x49 |0 + \xF0\x4A |0 + \xF0\x4B |0 + \xF0\x4C |0 + \xF0\x4D |0 + \xF0\x4E |0 + \xF0\x4F |0 + \xF0\x50 |0 + \xF0\x51 |0 + \xF0\x52 |0 + \xF0\x53 |0 + \xF0\x54 |0 + \xF0\x55 |0 + \xF0\x56 |0 + \xF0\x57 |0 + \xF0\x58 |0 + \xF0\x59 |0 + \xF0\x5A |0 + \xF0\x5B |0 + \xF0\x5C |0 + \xF0\x5D |0 + \xF0\x5E |0 + \xF0\x5F |0 + \xF0\x60 |0 + \xF0\x61 |0 + \xF0\x62 |0 + \xF0\x63 |0 + \xF7\xD1 |0 + \xF0\x64 |0 + \xF0\x65 |0 + \xF0\x66 |0 + \xF0\x67 |0 + \xF0\x68 |0 + \xF0\x69 |0 + \xF0\x6A |0 + \xF0\x6B |0 + \xF0\x6C |0 + \xF0\x6D |0 + \xF0\x6E |0 + \xF0\x6F |0 + \xF0\x70 |0 + \xF0\x71 |0 + \xF0\x72 |0 + \xF0\x73 |0 + \xF0\x74 |0 + \xF0\x75 |0 + \xF0\x76 |0 + \xF0\x77 |0 + \xF0\x78 |0 + \xF0\x79 |0 + \xF0\x7A |0 + \xF0\x7B |0 + \xF0\x7C |0 + \xF0\x7D |0 + \xF0\x7E |0 + \xF0\x80 |0 + \xF0\x81 |0 + \xF0\x82 |0 + \xF0\x83 |0 + \xF0\x84 |0 + \xF0\x85 |0 + \xF0\x86 |0 + \xF0\x87 |0 + \xF0\x88 |0 + \xF0\x89 |0 + \xF7\xD3 |0 + \xF7\xD2 |0 + \xF0\x8A |0 + \xF0\x8B |0 + \xF0\x8C |0 + \xF0\x8D |0 + \xF0\x8E |0 + \xF0\x8F |0 + \xF0\x90 |0 + \xF0\x91 |0 + \xF0\x92 |0 + \xF0\x93 |0 + \xF0\x94 |0 + \xF0\x95 |0 + \xF0\x96 |0 + \xE2\xBB |0 + \xF0\x97 |0 + \xBC\xA2 |0 + \xF0\x98 |0 + \xE2\xBC |0 + \xE2\xBD |0 + \xE2\xBE |0 + \xE2\xBF |0 + \xE2\xC0 |0 + \xE2\xC1 |0 + \xB7\xB9 |0 + \xD2\xFB |0 + \xBD\xA4 |0 + \xCA\xCE |0 + \xB1\xA5 |0 + \xCB\xC7 |0 + \xF0\x99 |0 + \xE2\xC2 |0 + \xB6\xFC |0 + \xC8\xC4 |0 + \xE2\xC3 |0 + \xF0\x9A |0 + \xF0\x9B |0 + \xBD\xC8 |0 + \xF0\x9C |0 + \xB1\xFD |0 + \xE2\xC4 |0 + \xF0\x9D |0 + \xB6\xF6 |0 + \xE2\xC5 |0 + \xC4\xD9 |0 + \xF0\x9E |0 + \xF0\x9F |0 + \xE2\xC6 |0 + \xCF\xDA |0 + \xB9\xDD |0 + \xE2\xC7 |0 + \xC0\xA1 |0 + \xF0\xA0 |0 + \xE2\xC8 |0 + \xB2\xF6 |0 + \xF1\x40 |0 + \xE2\xC9 |0 + \xF1\x41 |0 + \xC1\xF3 |0 + \xE2\xCA |0 + \xE2\xCB |0 + \xC2\xF8 |0 + \xE2\xCC |0 + \xE2\xCD |0 + \xE2\xCE |0 + \xCA\xD7 |0 + \xD8\xB8 |0 + \xD9\xE5 |0 + \xCF\xE3 |0 + \xF1\x42 |0 + \xF1\x43 |0 + \xF1\x44 |0 + \xF1\x45 |0 + \xF1\x46 |0 + \xF1\x47 |0 + \xF1\x48 |0 + \xF1\x49 |0 + \xF1\x4A |0 + \xF1\x4B |0 + \xF1\x4C |0 + \xF0\xA5 |0 + \xF1\x4D |0 + \xF1\x4E |0 + \xDC\xB0 |0 + \xF1\x4F |0 + \xF1\x50 |0 + \xF1\x51 |0 + \xF1\x52 |0 + \xF1\x53 |0 + \xF1\x54 |0 + \xF1\x55 |0 + \xF1\x56 |0 + \xF1\x57 |0 + \xF1\x58 |0 + \xF1\x59 |0 + \xF1\x5A |0 + \xF1\x5B |0 + \xF1\x5C |0 + \xF1\x5D |0 + \xF1\x5E |0 + \xF1\x5F |0 + \xF1\x60 |0 + \xF1\x61 |0 + \xF1\x62 |0 + \xF1\x63 |0 + \xF1\x64 |0 + \xF1\x65 |0 + \xF1\x66 |0 + \xF1\x67 |0 + \xF1\x68 |0 + \xF1\x69 |0 + \xF1\x6A |0 + \xF1\x6B |0 + \xF1\x6C |0 + \xF1\x6D |0 + \xF1\x6E |0 + \xF1\x6F |0 + \xF1\x70 |0 + \xF1\x71 |0 + \xF1\x72 |0 + \xF1\x73 |0 + \xF1\x74 |0 + \xF1\x75 |0 + \xF1\x76 |0 + \xF1\x77 |0 + \xF1\x78 |0 + \xF1\x79 |0 + \xF1\x7A |0 + \xF1\x7B |0 + \xF1\x7C |0 + \xF1\x7D |0 + \xF1\x7E |0 + \xF1\x80 |0 + \xF1\x81 |0 + \xF1\x82 |0 + \xF1\x83 |0 + \xF1\x84 |0 + \xF1\x85 |0 + \xF1\x86 |0 + \xF1\x87 |0 + \xF1\x88 |0 + \xF1\x89 |0 + \xF1\x8A |0 + \xF1\x8B |0 + \xF1\x8C |0 + \xF1\x8D |0 + \xF1\x8E |0 + \xF1\x8F |0 + \xF1\x90 |0 + \xF1\x91 |0 + \xF1\x92 |0 + \xF1\x93 |0 + \xF1\x94 |0 + \xF1\x95 |0 + \xF1\x96 |0 + \xF1\x97 |0 + \xF1\x98 |0 + \xF1\x99 |0 + \xF1\x9A |0 + \xF1\x9B |0 + \xF1\x9C |0 + \xF1\x9D |0 + \xF1\x9E |0 + \xF1\x9F |0 + \xF1\xA0 |0 + \xF2\x40 |0 + \xF2\x41 |0 + \xF2\x42 |0 + \xF2\x43 |0 + \xF2\x44 |0 + \xF2\x45 |0 + \xF2\x46 |0 + \xF2\x47 |0 + \xF2\x48 |0 + \xF2\x49 |0 + \xF2\x4A |0 + \xF2\x4B |0 + \xF2\x4C |0 + \xF2\x4D |0 + \xF2\x4E |0 + \xF2\x4F |0 + \xF2\x50 |0 + \xF2\x51 |0 + \xF2\x52 |0 + \xF2\x53 |0 + \xF2\x54 |0 + \xF2\x55 |0 + \xF2\x56 |0 + \xF2\x57 |0 + \xF2\x58 |0 + \xF2\x59 |0 + \xF2\x5A |0 + \xF2\x5B |0 + \xF2\x5C |0 + \xF2\x5D |0 + \xF2\x5E |0 + \xF2\x5F |0 + \xF2\x60 |0 + \xF2\x61 |0 + \xF2\x62 |0 + \xF2\x63 |0 + \xF2\x64 |0 + \xF2\x65 |0 + \xF2\x66 |0 + \xF2\x67 |0 + \xF2\x68 |0 + \xF2\x69 |0 + \xF2\x6A |0 + \xF2\x6B |0 + \xF2\x6C |0 + \xF2\x6D |0 + \xF2\x6E |0 + \xF2\x6F |0 + \xF2\x70 |0 + \xF2\x71 |0 + \xF2\x72 |0 + \xF2\x73 |0 + \xF2\x74 |0 + \xF2\x75 |0 + \xF2\x76 |0 + \xF2\x77 |0 + \xF2\x78 |0 + \xF2\x79 |0 + \xF2\x7A |0 + \xF2\x7B |0 + \xF2\x7C |0 + \xF2\x7D |0 + \xF2\x7E |0 + \xF2\x80 |0 + \xF2\x81 |0 + \xF2\x82 |0 + \xF2\x83 |0 + \xF2\x84 |0 + \xF2\x85 |0 + \xF2\x86 |0 + \xF2\x87 |0 + \xF2\x88 |0 + \xF2\x89 |0 + \xF2\x8A |0 + \xF2\x8B |0 + \xF2\x8C |0 + \xF2\x8D |0 + \xF2\x8E |0 + \xF2\x8F |0 + \xF2\x90 |0 + \xF2\x91 |0 + \xF2\x92 |0 + \xF2\x93 |0 + \xF2\x94 |0 + \xF2\x95 |0 + \xF2\x96 |0 + \xF2\x97 |0 + \xF2\x98 |0 + \xF2\x99 |0 + \xF2\x9A |0 + \xF2\x9B |0 + \xF2\x9C |0 + \xF2\x9D |0 + \xF2\x9E |0 + \xF2\x9F |0 + \xF2\xA0 |0 + \xF3\x40 |0 + \xF3\x41 |0 + \xF3\x42 |0 + \xF3\x43 |0 + \xF3\x44 |0 + \xF3\x45 |0 + \xF3\x46 |0 + \xF3\x47 |0 + \xF3\x48 |0 + \xF3\x49 |0 + \xF3\x4A |0 + \xF3\x4B |0 + \xF3\x4C |0 + \xF3\x4D |0 + \xF3\x4E |0 + \xF3\x4F |0 + \xF3\x50 |0 + \xF3\x51 |0 + \xC2\xED |0 + \xD4\xA6 |0 + \xCD\xD4 |0 + \xD1\xB1 |0 + \xB3\xDB |0 + \xC7\xFD |0 + \xF3\x52 |0 + \xB2\xB5 |0 + \xC2\xBF |0 + \xE6\xE0 |0 + \xCA\xBB |0 + \xE6\xE1 |0 + \xE6\xE2 |0 + \xBE\xD4 |0 + \xE6\xE3 |0 + \xD7\xA4 |0 + \xCD\xD5 |0 + \xE6\xE5 |0 + \xBC\xDD |0 + \xE6\xE4 |0 + \xE6\xE6 |0 + \xE6\xE7 |0 + \xC2\xEE |0 + \xF3\x53 |0 + \xBD\xBE |0 + \xE6\xE8 |0 + \xC2\xE6 |0 + \xBA\xA7 |0 + \xE6\xE9 |0 + \xF3\x54 |0 + \xE6\xEA |0 + \xB3\xD2 |0 + \xD1\xE9 |0 + \xF3\x55 |0 + \xF3\x56 |0 + \xBF\xA5 |0 + \xE6\xEB |0 + \xC6\xEF |0 + \xE6\xEC |0 + \xE6\xED |0 + \xF3\x57 |0 + \xF3\x58 |0 + \xE6\xEE |0 + \xC6\xAD |0 + \xE6\xEF |0 + \xF3\x59 |0 + \xC9\xA7 |0 + \xE6\xF0 |0 + \xE6\xF1 |0 + \xE6\xF2 |0 + \xE5\xB9 |0 + \xE6\xF3 |0 + \xE6\xF4 |0 + \xC2\xE2 |0 + \xE6\xF5 |0 + \xE6\xF6 |0 + \xD6\xE8 |0 + \xE6\xF7 |0 + \xF3\x5A |0 + \xE6\xF8 |0 + \xB9\xC7 |0 + \xF3\x5B |0 + \xF3\x5C |0 + \xF3\x5D |0 + \xF3\x5E |0 + \xF3\x5F |0 + \xF3\x60 |0 + \xF3\x61 |0 + \xF7\xBB |0 + \xF7\xBA |0 + \xF3\x62 |0 + \xF3\x63 |0 + \xF3\x64 |0 + \xF3\x65 |0 + \xF7\xBE |0 + \xF7\xBC |0 + \xBA\xA1 |0 + \xF3\x66 |0 + \xF7\xBF |0 + \xF3\x67 |0 + \xF7\xC0 |0 + \xF3\x68 |0 + \xF3\x69 |0 + \xF3\x6A |0 + \xF7\xC2 |0 + \xF7\xC1 |0 + \xF7\xC4 |0 + \xF3\x6B |0 + \xF3\x6C |0 + \xF7\xC3 |0 + \xF3\x6D |0 + \xF3\x6E |0 + \xF3\x6F |0 + \xF3\x70 |0 + \xF3\x71 |0 + \xF7\xC5 |0 + \xF7\xC6 |0 + \xF3\x72 |0 + \xF3\x73 |0 + \xF3\x74 |0 + \xF3\x75 |0 + \xF7\xC7 |0 + \xF3\x76 |0 + \xCB\xE8 |0 + \xF3\x77 |0 + \xF3\x78 |0 + \xF3\x79 |0 + \xF3\x7A |0 + \xB8\xDF |0 + \xF3\x7B |0 + \xF3\x7C |0 + \xF3\x7D |0 + \xF3\x7E |0 + \xF3\x80 |0 + \xF3\x81 |0 + \xF7\xD4 |0 + \xF3\x82 |0 + \xF7\xD5 |0 + \xF3\x83 |0 + \xF3\x84 |0 + \xF3\x85 |0 + \xF3\x86 |0 + \xF7\xD6 |0 + \xF3\x87 |0 + \xF3\x88 |0 + \xF3\x89 |0 + \xF3\x8A |0 + \xF7\xD8 |0 + \xF3\x8B |0 + \xF7\xDA |0 + \xF3\x8C |0 + \xF7\xD7 |0 + \xF3\x8D |0 + \xF3\x8E |0 + \xF3\x8F |0 + \xF3\x90 |0 + \xF3\x91 |0 + \xF3\x92 |0 + \xF3\x93 |0 + \xF3\x94 |0 + \xF3\x95 |0 + \xF7\xDB |0 + \xF3\x96 |0 + \xF7\xD9 |0 + \xF3\x97 |0 + \xF3\x98 |0 + \xF3\x99 |0 + \xF3\x9A |0 + \xF3\x9B |0 + \xF3\x9C |0 + \xF3\x9D |0 + \xD7\xD7 |0 + \xF3\x9E |0 + \xF3\x9F |0 + \xF3\xA0 |0 + \xF4\x40 |0 + \xF7\xDC |0 + \xF4\x41 |0 + \xF4\x42 |0 + \xF4\x43 |0 + \xF4\x44 |0 + \xF4\x45 |0 + \xF4\x46 |0 + \xF7\xDD |0 + \xF4\x47 |0 + \xF4\x48 |0 + \xF4\x49 |0 + \xF7\xDE |0 + \xF4\x4A |0 + \xF4\x4B |0 + \xF4\x4C |0 + \xF4\x4D |0 + \xF4\x4E |0 + \xF4\x4F |0 + \xF4\x50 |0 + \xF4\x51 |0 + \xF4\x52 |0 + \xF4\x53 |0 + \xF4\x54 |0 + \xF7\xDF |0 + \xF4\x55 |0 + \xF4\x56 |0 + \xF4\x57 |0 + \xF7\xE0 |0 + \xF4\x58 |0 + \xF4\x59 |0 + \xF4\x5A |0 + \xF4\x5B |0 + \xF4\x5C |0 + \xF4\x5D |0 + \xF4\x5E |0 + \xF4\x5F |0 + \xF4\x60 |0 + \xF4\x61 |0 + \xF4\x62 |0 + \xDB\xCB |0 + \xF4\x63 |0 + \xF4\x64 |0 + \xD8\xAA |0 + \xF4\x65 |0 + \xF4\x66 |0 + \xF4\x67 |0 + \xF4\x68 |0 + \xF4\x69 |0 + \xF4\x6A |0 + \xF4\x6B |0 + \xF4\x6C |0 + \xE5\xF7 |0 + \xB9\xED |0 + \xF4\x6D |0 + \xF4\x6E |0 + \xF4\x6F |0 + \xF4\x70 |0 + \xBF\xFD |0 + \xBB\xEA |0 + \xF7\xC9 |0 + \xC6\xC7 |0 + \xF7\xC8 |0 + \xF4\x71 |0 + \xF7\xCA |0 + \xF7\xCC |0 + \xF7\xCB |0 + \xF4\x72 |0 + \xF4\x73 |0 + \xF4\x74 |0 + \xF7\xCD |0 + \xF4\x75 |0 + \xCE\xBA |0 + \xF4\x76 |0 + \xF7\xCE |0 + \xF4\x77 |0 + \xF4\x78 |0 + \xC4\xA7 |0 + \xF4\x79 |0 + \xF4\x7A |0 + \xF4\x7B |0 + \xF4\x7C |0 + \xF4\x7D |0 + \xF4\x7E |0 + \xF4\x80 |0 + \xF4\x81 |0 + \xF4\x82 |0 + \xF4\x83 |0 + \xF4\x84 |0 + \xF4\x85 |0 + \xF4\x86 |0 + \xF4\x87 |0 + \xF4\x88 |0 + \xF4\x89 |0 + \xF4\x8A |0 + \xF4\x8B |0 + \xF4\x8C |0 + \xF4\x8D |0 + \xF4\x8E |0 + \xF4\x8F |0 + \xF4\x90 |0 + \xF4\x91 |0 + \xF4\x92 |0 + \xF4\x93 |0 + \xF4\x94 |0 + \xF4\x95 |0 + \xF4\x96 |0 + \xF4\x97 |0 + \xF4\x98 |0 + \xF4\x99 |0 + \xF4\x9A |0 + \xF4\x9B |0 + \xF4\x9C |0 + \xF4\x9D |0 + \xF4\x9E |0 + \xF4\x9F |0 + \xF4\xA0 |0 + \xF5\x40 |0 + \xF5\x41 |0 + \xF5\x42 |0 + \xF5\x43 |0 + \xF5\x44 |0 + \xF5\x45 |0 + \xF5\x46 |0 + \xF5\x47 |0 + \xF5\x48 |0 + \xF5\x49 |0 + \xF5\x4A |0 + \xF5\x4B |0 + \xF5\x4C |0 + \xF5\x4D |0 + \xF5\x4E |0 + \xF5\x4F |0 + \xF5\x50 |0 + \xF5\x51 |0 + \xF5\x52 |0 + \xF5\x53 |0 + \xF5\x54 |0 + \xF5\x55 |0 + \xF5\x56 |0 + \xF5\x57 |0 + \xF5\x58 |0 + \xF5\x59 |0 + \xF5\x5A |0 + \xF5\x5B |0 + \xF5\x5C |0 + \xF5\x5D |0 + \xF5\x5E |0 + \xF5\x5F |0 + \xF5\x60 |0 + \xF5\x61 |0 + \xF5\x62 |0 + \xF5\x63 |0 + \xF5\x64 |0 + \xF5\x65 |0 + \xF5\x66 |0 + \xF5\x67 |0 + \xF5\x68 |0 + \xF5\x69 |0 + \xF5\x6A |0 + \xF5\x6B |0 + \xF5\x6C |0 + \xF5\x6D |0 + \xF5\x6E |0 + \xF5\x6F |0 + \xF5\x70 |0 + \xF5\x71 |0 + \xF5\x72 |0 + \xF5\x73 |0 + \xF5\x74 |0 + \xF5\x75 |0 + \xF5\x76 |0 + \xF5\x77 |0 + \xF5\x78 |0 + \xF5\x79 |0 + \xF5\x7A |0 + \xF5\x7B |0 + \xF5\x7C |0 + \xF5\x7D |0 + \xF5\x7E |0 + \xF5\x80 |0 + \xF5\x81 |0 + \xF5\x82 |0 + \xF5\x83 |0 + \xF5\x84 |0 + \xF5\x85 |0 + \xF5\x86 |0 + \xF5\x87 |0 + \xF5\x88 |0 + \xF5\x89 |0 + \xF5\x8A |0 + \xF5\x8B |0 + \xF5\x8C |0 + \xF5\x8D |0 + \xF5\x8E |0 + \xF5\x8F |0 + \xF5\x90 |0 + \xF5\x91 |0 + \xF5\x92 |0 + \xF5\x93 |0 + \xF5\x94 |0 + \xF5\x95 |0 + \xF5\x96 |0 + \xF5\x97 |0 + \xF5\x98 |0 + \xF5\x99 |0 + \xF5\x9A |0 + \xF5\x9B |0 + \xF5\x9C |0 + \xF5\x9D |0 + \xF5\x9E |0 + \xF5\x9F |0 + \xF5\xA0 |0 + \xF6\x40 |0 + \xF6\x41 |0 + \xF6\x42 |0 + \xF6\x43 |0 + \xF6\x44 |0 + \xF6\x45 |0 + \xF6\x46 |0 + \xF6\x47 |0 + \xF6\x48 |0 + \xF6\x49 |0 + \xF6\x4A |0 + \xF6\x4B |0 + \xF6\x4C |0 + \xF6\x4D |0 + \xF6\x4E |0 + \xF6\x4F |0 + \xF6\x50 |0 + \xF6\x51 |0 + \xF6\x52 |0 + \xF6\x53 |0 + \xF6\x54 |0 + \xF6\x55 |0 + \xF6\x56 |0 + \xF6\x57 |0 + \xF6\x58 |0 + \xF6\x59 |0 + \xF6\x5A |0 + \xF6\x5B |0 + \xF6\x5C |0 + \xF6\x5D |0 + \xF6\x5E |0 + \xF6\x5F |0 + \xF6\x60 |0 + \xF6\x61 |0 + \xF6\x62 |0 + \xF6\x63 |0 + \xF6\x64 |0 + \xF6\x65 |0 + \xF6\x66 |0 + \xF6\x67 |0 + \xF6\x68 |0 + \xF6\x69 |0 + \xF6\x6A |0 + \xF6\x6B |0 + \xF6\x6C |0 + \xF6\x6D |0 + \xF6\x6E |0 + \xF6\x6F |0 + \xF6\x70 |0 + \xF6\x71 |0 + \xF6\x72 |0 + \xF6\x73 |0 + \xF6\x74 |0 + \xF6\x75 |0 + \xF6\x76 |0 + \xF6\x77 |0 + \xF6\x78 |0 + \xF6\x79 |0 + \xF6\x7A |0 + \xF6\x7B |0 + \xF6\x7C |0 + \xF6\x7D |0 + \xF6\x7E |0 + \xF6\x80 |0 + \xF6\x81 |0 + \xF6\x82 |0 + \xF6\x83 |0 + \xF6\x84 |0 + \xF6\x85 |0 + \xF6\x86 |0 + \xF6\x87 |0 + \xF6\x88 |0 + \xF6\x89 |0 + \xF6\x8A |0 + \xF6\x8B |0 + \xF6\x8C |0 + \xF6\x8D |0 + \xF6\x8E |0 + \xF6\x8F |0 + \xF6\x90 |0 + \xF6\x91 |0 + \xF6\x92 |0 + \xF6\x93 |0 + \xF6\x94 |0 + \xF6\x95 |0 + \xF6\x96 |0 + \xF6\x97 |0 + \xF6\x98 |0 + \xF6\x99 |0 + \xF6\x9A |0 + \xF6\x9B |0 + \xF6\x9C |0 + \xF6\x9D |0 + \xF6\x9E |0 + \xF6\x9F |0 + \xF6\xA0 |0 + \xF7\x40 |0 + \xF7\x41 |0 + \xF7\x42 |0 + \xF7\x43 |0 + \xF7\x44 |0 + \xF7\x45 |0 + \xF7\x46 |0 + \xF7\x47 |0 + \xF7\x48 |0 + \xF7\x49 |0 + \xF7\x4A |0 + \xF7\x4B |0 + \xF7\x4C |0 + \xF7\x4D |0 + \xF7\x4E |0 + \xF7\x4F |0 + \xF7\x50 |0 + \xF7\x51 |0 + \xF7\x52 |0 + \xF7\x53 |0 + \xF7\x54 |0 + \xF7\x55 |0 + \xF7\x56 |0 + \xF7\x57 |0 + \xF7\x58 |0 + \xF7\x59 |0 + \xF7\x5A |0 + \xF7\x5B |0 + \xF7\x5C |0 + \xF7\x5D |0 + \xF7\x5E |0 + \xF7\x5F |0 + \xF7\x60 |0 + \xF7\x61 |0 + \xF7\x62 |0 + \xF7\x63 |0 + \xF7\x64 |0 + \xF7\x65 |0 + \xF7\x66 |0 + \xF7\x67 |0 + \xF7\x68 |0 + \xF7\x69 |0 + \xF7\x6A |0 + \xF7\x6B |0 + \xF7\x6C |0 + \xF7\x6D |0 + \xF7\x6E |0 + \xF7\x6F |0 + \xF7\x70 |0 + \xF7\x71 |0 + \xF7\x72 |0 + \xF7\x73 |0 + \xF7\x74 |0 + \xF7\x75 |0 + \xF7\x76 |0 + \xF7\x77 |0 + \xF7\x78 |0 + \xF7\x79 |0 + \xF7\x7A |0 + \xF7\x7B |0 + \xF7\x7C |0 + \xF7\x7D |0 + \xF7\x7E |0 + \xF7\x80 |0 + \xD3\xE3 |0 + \xF7\x81 |0 + \xF7\x82 |0 + \xF6\xCF |0 + \xF7\x83 |0 + \xC2\xB3 |0 + \xF6\xD0 |0 + \xF7\x84 |0 + \xF7\x85 |0 + \xF6\xD1 |0 + \xF6\xD2 |0 + \xF6\xD3 |0 + \xF6\xD4 |0 + \xF7\x86 |0 + \xF7\x87 |0 + \xF6\xD6 |0 + \xF7\x88 |0 + \xB1\xAB |0 + \xF6\xD7 |0 + \xF7\x89 |0 + \xF6\xD8 |0 + \xF6\xD9 |0 + \xF6\xDA |0 + \xF7\x8A |0 + \xF6\xDB |0 + \xF6\xDC |0 + \xF7\x8B |0 + \xF7\x8C |0 + \xF7\x8D |0 + \xF7\x8E |0 + \xF6\xDD |0 + \xF6\xDE |0 + \xCF\xCA |0 + \xF7\x8F |0 + \xF6\xDF |0 + \xF6\xE0 |0 + \xF6\xE1 |0 + \xF6\xE2 |0 + \xF6\xE3 |0 + \xF6\xE4 |0 + \xC0\xF0 |0 + \xF6\xE5 |0 + \xF6\xE6 |0 + \xF6\xE7 |0 + \xF6\xE8 |0 + \xF6\xE9 |0 + \xF7\x90 |0 + \xF6\xEA |0 + \xF7\x91 |0 + \xF6\xEB |0 + \xF6\xEC |0 + \xF7\x92 |0 + \xF6\xED |0 + \xF6\xEE |0 + \xF6\xEF |0 + \xF6\xF0 |0 + \xF6\xF1 |0 + \xF6\xF2 |0 + \xF6\xF3 |0 + \xF6\xF4 |0 + \xBE\xA8 |0 + \xF7\x93 |0 + \xF6\xF5 |0 + \xF6\xF6 |0 + \xF6\xF7 |0 + \xF6\xF8 |0 + \xF7\x94 |0 + \xF7\x95 |0 + \xF7\x96 |0 + \xF7\x97 |0 + \xF7\x98 |0 + \xC8\xFA |0 + \xF6\xF9 |0 + \xF6\xFA |0 + \xF6\xFB |0 + \xF6\xFC |0 + \xF7\x99 |0 + \xF7\x9A |0 + \xF6\xFD |0 + \xF6\xFE |0 + \xF7\xA1 |0 + \xF7\xA2 |0 + \xF7\xA3 |0 + \xF7\xA4 |0 + \xF7\xA5 |0 + \xF7\x9B |0 + \xF7\x9C |0 + \xF7\xA6 |0 + \xF7\xA7 |0 + \xF7\xA8 |0 + \xB1\xEE |0 + \xF7\xA9 |0 + \xF7\xAA |0 + \xF7\xAB |0 + \xF7\x9D |0 + \xF7\x9E |0 + \xF7\xAC |0 + \xF7\xAD |0 + \xC1\xDB |0 + \xF7\xAE |0 + \xF7\x9F |0 + \xF7\xA0 |0 + \xF7\xAF |0 + \xF8\x40 |0 + \xF8\x41 |0 + \xF8\x42 |0 + \xF8\x43 |0 + \xF8\x44 |0 + \xF8\x45 |0 + \xF8\x46 |0 + \xF8\x47 |0 + \xF8\x48 |0 + \xF8\x49 |0 + \xF8\x4A |0 + \xF8\x4B |0 + \xF8\x4C |0 + \xF8\x4D |0 + \xF8\x4E |0 + \xF8\x4F |0 + \xF8\x50 |0 + \xF8\x51 |0 + \xF8\x52 |0 + \xF8\x53 |0 + \xF8\x54 |0 + \xF8\x55 |0 + \xF8\x56 |0 + \xF8\x57 |0 + \xF8\x58 |0 + \xF8\x59 |0 + \xF8\x5A |0 + \xF8\x5B |0 + \xF8\x5C |0 + \xF8\x5D |0 + \xF8\x5E |0 + \xF8\x5F |0 + \xF8\x60 |0 + \xF8\x61 |0 + \xF8\x62 |0 + \xF8\x63 |0 + \xF8\x64 |0 + \xF8\x65 |0 + \xF8\x66 |0 + \xF8\x67 |0 + \xF8\x68 |0 + \xF8\x69 |0 + \xF8\x6A |0 + \xF8\x6B |0 + \xF8\x6C |0 + \xF8\x6D |0 + \xF8\x6E |0 + \xF8\x6F |0 + \xF8\x70 |0 + \xF8\x71 |0 + \xF8\x72 |0 + \xF8\x73 |0 + \xF8\x74 |0 + \xF8\x75 |0 + \xF8\x76 |0 + \xF8\x77 |0 + \xF8\x78 |0 + \xF8\x79 |0 + \xF8\x7A |0 + \xF8\x7B |0 + \xF8\x7C |0 + \xF8\x7D |0 + \xF8\x7E |0 + \xF8\x80 |0 + \xF8\x81 |0 + \xF8\x82 |0 + \xF8\x83 |0 + \xF8\x84 |0 + \xF8\x85 |0 + \xF8\x86 |0 + \xF8\x87 |0 + \xF8\x88 |0 + \xF8\x89 |0 + \xF8\x8A |0 + \xF8\x8B |0 + \xF8\x8C |0 + \xF8\x8D |0 + \xF8\x8E |0 + \xF8\x8F |0 + \xF8\x90 |0 + \xF8\x91 |0 + \xF8\x92 |0 + \xF8\x93 |0 + \xF8\x94 |0 + \xF8\x95 |0 + \xF8\x96 |0 + \xF8\x97 |0 + \xF8\x98 |0 + \xF8\x99 |0 + \xF8\x9A |0 + \xF8\x9B |0 + \xF8\x9C |0 + \xF8\x9D |0 + \xF8\x9E |0 + \xF8\x9F |0 + \xF8\xA0 |0 + \xF9\x40 |0 + \xF9\x41 |0 + \xF9\x42 |0 + \xF9\x43 |0 + \xF9\x44 |0 + \xF9\x45 |0 + \xF9\x46 |0 + \xF9\x47 |0 + \xF9\x48 |0 + \xF9\x49 |0 + \xF9\x4A |0 + \xF9\x4B |0 + \xF9\x4C |0 + \xF9\x4D |0 + \xF9\x4E |0 + \xF9\x4F |0 + \xF9\x50 |0 + \xF9\x51 |0 + \xF9\x52 |0 + \xF9\x53 |0 + \xF9\x54 |0 + \xF9\x55 |0 + \xF9\x56 |0 + \xF9\x57 |0 + \xF9\x58 |0 + \xF9\x59 |0 + \xF9\x5A |0 + \xF9\x5B |0 + \xF9\x5C |0 + \xF9\x5D |0 + \xF9\x5E |0 + \xF9\x5F |0 + \xF9\x60 |0 + \xF9\x61 |0 + \xF9\x62 |0 + \xF9\x63 |0 + \xF9\x64 |0 + \xF9\x65 |0 + \xF9\x66 |0 + \xF9\x67 |0 + \xF9\x68 |0 + \xF9\x69 |0 + \xF9\x6A |0 + \xF9\x6B |0 + \xF9\x6C |0 + \xF9\x6D |0 + \xF9\x6E |0 + \xF9\x6F |0 + \xF9\x70 |0 + \xF9\x71 |0 + \xF9\x72 |0 + \xF9\x73 |0 + \xF9\x74 |0 + \xF9\x75 |0 + \xF9\x76 |0 + \xF9\x77 |0 + \xF9\x78 |0 + \xF9\x79 |0 + \xF9\x7A |0 + \xF9\x7B |0 + \xF9\x7C |0 + \xF9\x7D |0 + \xF9\x7E |0 + \xF9\x80 |0 + \xF9\x81 |0 + \xF9\x82 |0 + \xF9\x83 |0 + \xF9\x84 |0 + \xF9\x85 |0 + \xF9\x86 |0 + \xF9\x87 |0 + \xF9\x88 |0 + \xF9\x89 |0 + \xF9\x8A |0 + \xF9\x8B |0 + \xF9\x8C |0 + \xF9\x8D |0 + \xF9\x8E |0 + \xF9\x8F |0 + \xF9\x90 |0 + \xF9\x91 |0 + \xF9\x92 |0 + \xF9\x93 |0 + \xF9\x94 |0 + \xF9\x95 |0 + \xF9\x96 |0 + \xF9\x97 |0 + \xF9\x98 |0 + \xF9\x99 |0 + \xF9\x9A |0 + \xF9\x9B |0 + \xF9\x9C |0 + \xF9\x9D |0 + \xF9\x9E |0 + \xF9\x9F |0 + \xF9\xA0 |0 + \xFA\x40 |0 + \xFA\x41 |0 + \xFA\x42 |0 + \xFA\x43 |0 + \xFA\x44 |0 + \xFA\x45 |0 + \xFA\x46 |0 + \xFA\x47 |0 + \xFA\x48 |0 + \xFA\x49 |0 + \xFA\x4A |0 + \xFA\x4B |0 + \xFA\x4C |0 + \xFA\x4D |0 + \xFA\x4E |0 + \xFA\x4F |0 + \xFA\x50 |0 + \xFA\x51 |0 + \xFA\x52 |0 + \xFA\x53 |0 + \xFA\x54 |0 + \xFA\x55 |0 + \xFA\x56 |0 + \xFA\x57 |0 + \xFA\x58 |0 + \xFA\x59 |0 + \xFA\x5A |0 + \xFA\x5B |0 + \xFA\x5C |0 + \xFA\x5D |0 + \xFA\x5E |0 + \xFA\x5F |0 + \xFA\x60 |0 + \xFA\x61 |0 + \xFA\x62 |0 + \xFA\x63 |0 + \xFA\x64 |0 + \xFA\x65 |0 + \xFA\x66 |0 + \xFA\x67 |0 + \xFA\x68 |0 + \xFA\x69 |0 + \xFA\x6A |0 + \xFA\x6B |0 + \xFA\x6C |0 + \xFA\x6D |0 + \xFA\x6E |0 + \xFA\x6F |0 + \xFA\x70 |0 + \xFA\x71 |0 + \xFA\x72 |0 + \xFA\x73 |0 + \xFA\x74 |0 + \xFA\x75 |0 + \xFA\x76 |0 + \xFA\x77 |0 + \xFA\x78 |0 + \xFA\x79 |0 + \xFA\x7A |0 + \xFA\x7B |0 + \xFA\x7C |0 + \xFA\x7D |0 + \xFA\x7E |0 + \xFA\x80 |0 + \xFA\x81 |0 + \xFA\x82 |0 + \xFA\x83 |0 + \xFA\x84 |0 + \xFA\x85 |0 + \xFA\x86 |0 + \xFA\x87 |0 + \xFA\x88 |0 + \xFA\x89 |0 + \xFA\x8A |0 + \xFA\x8B |0 + \xFA\x8C |0 + \xFA\x8D |0 + \xFA\x8E |0 + \xFA\x8F |0 + \xFA\x90 |0 + \xFA\x91 |0 + \xFA\x92 |0 + \xFA\x93 |0 + \xFA\x94 |0 + \xFA\x95 |0 + \xFA\x96 |0 + \xFA\x97 |0 + \xFA\x98 |0 + \xFA\x99 |0 + \xFA\x9A |0 + \xFA\x9B |0 + \xFA\x9C |0 + \xFA\x9D |0 + \xFA\x9E |0 + \xFA\x9F |0 + \xFA\xA0 |0 + \xFB\x40 |0 + \xFB\x41 |0 + \xFB\x42 |0 + \xFB\x43 |0 + \xFB\x44 |0 + \xFB\x45 |0 + \xFB\x46 |0 + \xFB\x47 |0 + \xFB\x48 |0 + \xFB\x49 |0 + \xFB\x4A |0 + \xFB\x4B |0 + \xFB\x4C |0 + \xFB\x4D |0 + \xFB\x4E |0 + \xFB\x4F |0 + \xFB\x50 |0 + \xFB\x51 |0 + \xFB\x52 |0 + \xFB\x53 |0 + \xFB\x54 |0 + \xFB\x55 |0 + \xFB\x56 |0 + \xFB\x57 |0 + \xFB\x58 |0 + \xFB\x59 |0 + \xFB\x5A |0 + \xFB\x5B |0 + \xC4\xF1 |0 + \xF0\xAF |0 + \xBC\xA6 |0 + \xF0\xB0 |0 + \xC3\xF9 |0 + \xFB\x5C |0 + \xC5\xB8 |0 + \xD1\xBB |0 + \xFB\x5D |0 + \xF0\xB1 |0 + \xF0\xB2 |0 + \xF0\xB3 |0 + \xF0\xB4 |0 + \xF0\xB5 |0 + \xD1\xBC |0 + \xFB\x5E |0 + \xD1\xEC |0 + \xFB\x5F |0 + \xF0\xB7 |0 + \xF0\xB6 |0 + \xD4\xA7 |0 + \xFB\x60 |0 + \xCD\xD2 |0 + \xF0\xB8 |0 + \xF0\xBA |0 + \xF0\xB9 |0 + \xF0\xBB |0 + \xF0\xBC |0 + \xFB\x61 |0 + \xFB\x62 |0 + \xB8\xEB |0 + \xF0\xBD |0 + \xBA\xE8 |0 + \xFB\x63 |0 + \xF0\xBE |0 + \xF0\xBF |0 + \xBE\xE9 |0 + \xF0\xC0 |0 + \xB6\xEC |0 + \xF0\xC1 |0 + \xF0\xC2 |0 + \xF0\xC3 |0 + \xF0\xC4 |0 + \xC8\xB5 |0 + \xF0\xC5 |0 + \xF0\xC6 |0 + \xFB\x64 |0 + \xF0\xC7 |0 + \xC5\xF4 |0 + \xFB\x65 |0 + \xF0\xC8 |0 + \xFB\x66 |0 + \xFB\x67 |0 + \xFB\x68 |0 + \xF0\xC9 |0 + \xFB\x69 |0 + \xF0\xCA |0 + \xF7\xBD |0 + \xFB\x6A |0 + \xF0\xCB |0 + \xF0\xCC |0 + \xF0\xCD |0 + \xFB\x6B |0 + \xF0\xCE |0 + \xFB\x6C |0 + \xFB\x6D |0 + \xFB\x6E |0 + \xFB\x6F |0 + \xF0\xCF |0 + \xBA\xD7 |0 + \xFB\x70 |0 + \xF0\xD0 |0 + \xF0\xD1 |0 + \xF0\xD2 |0 + \xF0\xD3 |0 + \xF0\xD4 |0 + \xF0\xD5 |0 + \xF0\xD6 |0 + \xF0\xD8 |0 + \xFB\x71 |0 + \xFB\x72 |0 + \xD3\xA5 |0 + \xF0\xD7 |0 + \xFB\x73 |0 + \xF0\xD9 |0 + \xFB\x74 |0 + \xFB\x75 |0 + \xFB\x76 |0 + \xFB\x77 |0 + \xFB\x78 |0 + \xFB\x79 |0 + \xFB\x7A |0 + \xFB\x7B |0 + \xFB\x7C |0 + \xFB\x7D |0 + \xF5\xBA |0 + \xC2\xB9 |0 + \xFB\x7E |0 + \xFB\x80 |0 + \xF7\xE4 |0 + \xFB\x81 |0 + \xFB\x82 |0 + \xFB\x83 |0 + \xFB\x84 |0 + \xF7\xE5 |0 + \xF7\xE6 |0 + \xFB\x85 |0 + \xFB\x86 |0 + \xF7\xE7 |0 + \xFB\x87 |0 + \xFB\x88 |0 + \xFB\x89 |0 + \xFB\x8A |0 + \xFB\x8B |0 + \xFB\x8C |0 + \xF7\xE8 |0 + \xC2\xB4 |0 + \xFB\x8D |0 + \xFB\x8E |0 + \xFB\x8F |0 + \xFB\x90 |0 + \xFB\x91 |0 + \xFB\x92 |0 + \xFB\x93 |0 + \xFB\x94 |0 + \xFB\x95 |0 + \xF7\xEA |0 + \xFB\x96 |0 + \xF7\xEB |0 + \xFB\x97 |0 + \xFB\x98 |0 + \xFB\x99 |0 + \xFB\x9A |0 + \xFB\x9B |0 + \xFB\x9C |0 + \xC2\xF3 |0 + \xFB\x9D |0 + \xFB\x9E |0 + \xFB\x9F |0 + \xFB\xA0 |0 + \xFC\x40 |0 + \xFC\x41 |0 + \xFC\x42 |0 + \xFC\x43 |0 + \xFC\x44 |0 + \xFC\x45 |0 + \xFC\x46 |0 + \xFC\x47 |0 + \xFC\x48 |0 + \xF4\xF0 |0 + \xFC\x49 |0 + \xFC\x4A |0 + \xFC\x4B |0 + \xF4\xEF |0 + \xFC\x4C |0 + \xFC\x4D |0 + \xC2\xE9 |0 + \xFC\x4E |0 + \xF7\xE1 |0 + \xF7\xE2 |0 + \xFC\x4F |0 + \xFC\x50 |0 + \xFC\x51 |0 + \xFC\x52 |0 + \xFC\x53 |0 + \xBB\xC6 |0 + \xFC\x54 |0 + \xFC\x55 |0 + \xFC\x56 |0 + \xFC\x57 |0 + \xD9\xE4 |0 + \xFC\x58 |0 + \xFC\x59 |0 + \xFC\x5A |0 + \xCA\xF2 |0 + \xC0\xE8 |0 + \xF0\xA4 |0 + \xFC\x5B |0 + \xBA\xDA |0 + \xFC\x5C |0 + \xFC\x5D |0 + \xC7\xAD |0 + \xFC\x5E |0 + \xFC\x5F |0 + \xFC\x60 |0 + \xC4\xAC |0 + \xFC\x61 |0 + \xFC\x62 |0 + \xF7\xEC |0 + \xF7\xED |0 + \xF7\xEE |0 + \xFC\x63 |0 + \xF7\xF0 |0 + \xF7\xEF |0 + \xFC\x64 |0 + \xF7\xF1 |0 + \xFC\x65 |0 + \xFC\x66 |0 + \xF7\xF4 |0 + \xFC\x67 |0 + \xF7\xF3 |0 + \xFC\x68 |0 + \xF7\xF2 |0 + \xF7\xF5 |0 + \xFC\x69 |0 + \xFC\x6A |0 + \xFC\x6B |0 + \xFC\x6C |0 + \xF7\xF6 |0 + \xFC\x6D |0 + \xFC\x6E |0 + \xFC\x6F |0 + \xFC\x70 |0 + \xFC\x71 |0 + \xFC\x72 |0 + \xFC\x73 |0 + \xFC\x74 |0 + \xFC\x75 |0 + \xED\xE9 |0 + \xFC\x76 |0 + \xED\xEA |0 + \xED\xEB |0 + \xFC\x77 |0 + \xF6\xBC |0 + \xFC\x78 |0 + \xFC\x79 |0 + \xFC\x7A |0 + \xFC\x7B |0 + \xFC\x7C |0 + \xFC\x7D |0 + \xFC\x7E |0 + \xFC\x80 |0 + \xFC\x81 |0 + \xFC\x82 |0 + \xFC\x83 |0 + \xFC\x84 |0 + \xF6\xBD |0 + \xFC\x85 |0 + \xF6\xBE |0 + \xB6\xA6 |0 + \xFC\x86 |0 + \xD8\xBE |0 + \xFC\x87 |0 + \xFC\x88 |0 + \xB9\xC4 |0 + \xFC\x89 |0 + \xFC\x8A |0 + \xFC\x8B |0 + \xD8\xBB |0 + \xFC\x8C |0 + \xDC\xB1 |0 + \xFC\x8D |0 + \xFC\x8E |0 + \xFC\x8F |0 + \xFC\x90 |0 + \xFC\x91 |0 + \xFC\x92 |0 + \xCA\xF3 |0 + \xFC\x93 |0 + \xF7\xF7 |0 + \xFC\x94 |0 + \xFC\x95 |0 + \xFC\x96 |0 + \xFC\x97 |0 + \xFC\x98 |0 + \xFC\x99 |0 + \xFC\x9A |0 + \xFC\x9B |0 + \xFC\x9C |0 + \xF7\xF8 |0 + \xFC\x9D |0 + \xFC\x9E |0 + \xF7\xF9 |0 + \xFC\x9F |0 + \xFC\xA0 |0 + \xFD\x40 |0 + \xFD\x41 |0 + \xFD\x42 |0 + \xFD\x43 |0 + \xFD\x44 |0 + \xF7\xFB |0 + \xFD\x45 |0 + \xF7\xFA |0 + \xFD\x46 |0 + \xB1\xC7 |0 + \xFD\x47 |0 + \xF7\xFC |0 + \xF7\xFD |0 + \xFD\x48 |0 + \xFD\x49 |0 + \xFD\x4A |0 + \xFD\x4B |0 + \xFD\x4C |0 + \xF7\xFE |0 + \xFD\x4D |0 + \xFD\x4E |0 + \xFD\x4F |0 + \xFD\x50 |0 + \xFD\x51 |0 + \xFD\x52 |0 + \xFD\x53 |0 + \xFD\x54 |0 + \xFD\x55 |0 + \xFD\x56 |0 + \xFD\x57 |0 + \xC6\xEB |0 + \xEC\xB4 |0 + \xFD\x58 |0 + \xFD\x59 |0 + \xFD\x5A |0 + \xFD\x5B |0 + \xFD\x5C |0 + \xFD\x5D |0 + \xFD\x5E |0 + \xFD\x5F |0 + \xFD\x60 |0 + \xFD\x61 |0 + \xFD\x62 |0 + \xFD\x63 |0 + \xFD\x64 |0 + \xFD\x65 |0 + \xFD\x66 |0 + \xFD\x67 |0 + \xFD\x68 |0 + \xFD\x69 |0 + \xFD\x6A |0 + \xFD\x6B |0 + \xFD\x6C |0 + \xFD\x6D |0 + \xFD\x6E |0 + \xFD\x6F |0 + \xFD\x70 |0 + \xFD\x71 |0 + \xFD\x72 |0 + \xFD\x73 |0 + \xFD\x74 |0 + \xFD\x75 |0 + \xFD\x76 |0 + \xFD\x77 |0 + \xFD\x78 |0 + \xFD\x79 |0 + \xFD\x7A |0 + \xFD\x7B |0 + \xFD\x7C |0 + \xFD\x7D |0 + \xFD\x7E |0 + \xFD\x80 |0 + \xFD\x81 |0 + \xFD\x82 |0 + \xFD\x83 |0 + \xFD\x84 |0 + \xFD\x85 |0 + \xB3\xDD |0 + \xF6\xB3 |0 + \xFD\x86 |0 + \xFD\x87 |0 + \xF6\xB4 |0 + \xC1\xE4 |0 + \xF6\xB5 |0 + \xF6\xB6 |0 + \xF6\xB7 |0 + \xF6\xB8 |0 + \xF6\xB9 |0 + \xF6\xBA |0 + \xC8\xA3 |0 + \xF6\xBB |0 + \xFD\x88 |0 + \xFD\x89 |0 + \xFD\x8A |0 + \xFD\x8B |0 + \xFD\x8C |0 + \xFD\x8D |0 + \xFD\x8E |0 + \xFD\x8F |0 + \xFD\x90 |0 + \xFD\x91 |0 + \xFD\x92 |0 + \xFD\x93 |0 + \xC1\xFA |0 + \xB9\xA8 |0 + \xED\xE8 |0 + \xFD\x94 |0 + \xFD\x95 |0 + \xFD\x96 |0 + \xB9\xEA |0 + \xD9\xDF |0 + \xFD\x97 |0 + \xFD\x98 |0 + \xFD\x99 |0 + \xFD\x9A |0 + \xFD\x9B |0 + \xAA\xA1 |0 + \xAA\xA2 |0 + \xAA\xA3 |0 + \xAA\xA4 |0 + \xAA\xA5 |0 + \xAA\xA6 |0 + \xAA\xA7 |0 + \xAA\xA8 |0 + \xAA\xA9 |0 + \xAA\xAA |0 + \xAA\xAB |0 + \xAA\xAC |0 + \xAA\xAD |0 + \xAA\xAE |0 + \xAA\xAF |0 + \xAA\xB0 |0 + \xAA\xB1 |0 + \xAA\xB2 |0 + \xAA\xB3 |0 + \xAA\xB4 |0 + \xAA\xB5 |0 + \xAA\xB6 |0 + \xAA\xB7 |0 + \xAA\xB8 |0 + \xAA\xB9 |0 + \xAA\xBA |0 + \xAA\xBB |0 + \xAA\xBC |0 + \xAA\xBD |0 + \xAA\xBE |0 + \xAA\xBF |0 + \xAA\xC0 |0 + \xAA\xC1 |0 + \xAA\xC2 |0 + \xAA\xC3 |0 + \xAA\xC4 |0 + \xAA\xC5 |0 + \xAA\xC6 |0 + \xAA\xC7 |0 + \xAA\xC8 |0 + \xAA\xC9 |0 + \xAA\xCA |0 + \xAA\xCB |0 + \xAA\xCC |0 + \xAA\xCD |0 + \xAA\xCE |0 + \xAA\xCF |0 + \xAA\xD0 |0 + \xAA\xD1 |0 + \xAA\xD2 |0 + \xAA\xD3 |0 + \xAA\xD4 |0 + \xAA\xD5 |0 + \xAA\xD6 |0 + \xAA\xD7 |0 + \xAA\xD8 |0 + \xAA\xD9 |0 + \xAA\xDA |0 + \xAA\xDB |0 + \xAA\xDC |0 + \xAA\xDD |0 + \xAA\xDE |0 + \xAA\xDF |0 + \xAA\xE0 |0 + \xAA\xE1 |0 + \xAA\xE2 |0 + \xAA\xE3 |0 + \xAA\xE4 |0 + \xAA\xE5 |0 + \xAA\xE6 |0 + \xAA\xE7 |0 + \xAA\xE8 |0 + \xAA\xE9 |0 + \xAA\xEA |0 + \xAA\xEB |0 + \xAA\xEC |0 + \xAA\xED |0 + \xAA\xEE |0 + \xAA\xEF |0 + \xAA\xF0 |0 + \xAA\xF1 |0 + \xAA\xF2 |0 + \xAA\xF3 |0 + \xAA\xF4 |0 + \xAA\xF5 |0 + \xAA\xF6 |0 + \xAA\xF7 |0 + \xAA\xF8 |0 + \xAA\xF9 |0 + \xAA\xFA |0 + \xAA\xFB |0 + \xAA\xFC |0 + \xAA\xFD |0 + \xAA\xFE |0 + \xAB\xA1 |0 + \xAB\xA2 |0 + \xAB\xA3 |0 + \xAB\xA4 |0 + \xAB\xA5 |0 + \xAB\xA6 |0 + \xAB\xA7 |0 + \xAB\xA8 |0 + \xAB\xA9 |0 + \xAB\xAA |0 + \xAB\xAB |0 + \xAB\xAC |0 + \xAB\xAD |0 + \xAB\xAE |0 + \xAB\xAF |0 + \xAB\xB0 |0 + \xAB\xB1 |0 + \xAB\xB2 |0 + \xAB\xB3 |0 + \xAB\xB4 |0 + \xAB\xB5 |0 + \xAB\xB6 |0 + \xAB\xB7 |0 + \xAB\xB8 |0 + \xAB\xB9 |0 + \xAB\xBA |0 + \xAB\xBB |0 + \xAB\xBC |0 + \xAB\xBD |0 + \xAB\xBE |0 + \xAB\xBF |0 + \xAB\xC0 |0 + \xAB\xC1 |0 + \xAB\xC2 |0 + \xAB\xC3 |0 + \xAB\xC4 |0 + \xAB\xC5 |0 + \xAB\xC6 |0 + \xAB\xC7 |0 + \xAB\xC8 |0 + \xAB\xC9 |0 + \xAB\xCA |0 + \xAB\xCB |0 + \xAB\xCC |0 + \xAB\xCD |0 + \xAB\xCE |0 + \xAB\xCF |0 + \xAB\xD0 |0 + \xAB\xD1 |0 + \xAB\xD2 |0 + \xAB\xD3 |0 + \xAB\xD4 |0 + \xAB\xD5 |0 + \xAB\xD6 |0 + \xAB\xD7 |0 + \xAB\xD8 |0 + \xAB\xD9 |0 + \xAB\xDA |0 + \xAB\xDB |0 + \xAB\xDC |0 + \xAB\xDD |0 + \xAB\xDE |0 + \xAB\xDF |0 + \xAB\xE0 |0 + \xAB\xE1 |0 + \xAB\xE2 |0 + \xAB\xE3 |0 + \xAB\xE4 |0 + \xAB\xE5 |0 + \xAB\xE6 |0 + \xAB\xE7 |0 + \xAB\xE8 |0 + \xAB\xE9 |0 + \xAB\xEA |0 + \xAB\xEB |0 + \xAB\xEC |0 + \xAB\xED |0 + \xAB\xEE |0 + \xAB\xEF |0 + \xAB\xF0 |0 + \xAB\xF1 |0 + \xAB\xF2 |0 + \xAB\xF3 |0 + \xAB\xF4 |0 + \xAB\xF5 |0 + \xAB\xF6 |0 + \xAB\xF7 |0 + \xAB\xF8 |0 + \xAB\xF9 |0 + \xAB\xFA |0 + \xAB\xFB |0 + \xAB\xFC |0 + \xAB\xFD |0 + \xAB\xFE |0 + \xAC\xA1 |0 + \xAC\xA2 |0 + \xAC\xA3 |0 + \xAC\xA4 |0 + \xAC\xA5 |0 + \xAC\xA6 |0 + \xAC\xA7 |0 + \xAC\xA8 |0 + \xAC\xA9 |0 + \xAC\xAA |0 + \xAC\xAB |0 + \xAC\xAC |0 + \xAC\xAD |0 + \xAC\xAE |0 + \xAC\xAF |0 + \xAC\xB0 |0 + \xAC\xB1 |0 + \xAC\xB2 |0 + \xAC\xB3 |0 + \xAC\xB4 |0 + \xAC\xB5 |0 + \xAC\xB6 |0 + \xAC\xB7 |0 + \xAC\xB8 |0 + \xAC\xB9 |0 + \xAC\xBA |0 + \xAC\xBB |0 + \xAC\xBC |0 + \xAC\xBD |0 + \xAC\xBE |0 + \xAC\xBF |0 + \xAC\xC0 |0 + \xAC\xC1 |0 + \xAC\xC2 |0 + \xAC\xC3 |0 + \xAC\xC4 |0 + \xAC\xC5 |0 + \xAC\xC6 |0 + \xAC\xC7 |0 + \xAC\xC8 |0 + \xAC\xC9 |0 + \xAC\xCA |0 + \xAC\xCB |0 + \xAC\xCC |0 + \xAC\xCD |0 + \xAC\xCE |0 + \xAC\xCF |0 + \xAC\xD0 |0 + \xAC\xD1 |0 + \xAC\xD2 |0 + \xAC\xD3 |0 + \xAC\xD4 |0 + \xAC\xD5 |0 + \xAC\xD6 |0 + \xAC\xD7 |0 + \xAC\xD8 |0 + \xAC\xD9 |0 + \xAC\xDA |0 + \xAC\xDB |0 + \xAC\xDC |0 + \xAC\xDD |0 + \xAC\xDE |0 + \xAC\xDF |0 + \xAC\xE0 |0 + \xAC\xE1 |0 + \xAC\xE2 |0 + \xAC\xE3 |0 + \xAC\xE4 |0 + \xAC\xE5 |0 + \xAC\xE6 |0 + \xAC\xE7 |0 + \xAC\xE8 |0 + \xAC\xE9 |0 + \xAC\xEA |0 + \xAC\xEB |0 + \xAC\xEC |0 + \xAC\xED |0 + \xAC\xEE |0 + \xAC\xEF |0 + \xAC\xF0 |0 + \xAC\xF1 |0 + \xAC\xF2 |0 + \xAC\xF3 |0 + \xAC\xF4 |0 + \xAC\xF5 |0 + \xAC\xF6 |0 + \xAC\xF7 |0 + \xAC\xF8 |0 + \xAC\xF9 |0 + \xAC\xFA |0 + \xAC\xFB |0 + \xAC\xFC |0 + \xAC\xFD |0 + \xAC\xFE |0 + \xAD\xA1 |0 + \xAD\xA2 |0 + \xAD\xA3 |0 + \xAD\xA4 |0 + \xAD\xA5 |0 + \xAD\xA6 |0 + \xAD\xA7 |0 + \xAD\xA8 |0 + \xAD\xA9 |0 + \xAD\xAA |0 + \xAD\xAB |0 + \xAD\xAC |0 + \xAD\xAD |0 + \xAD\xAE |0 + \xAD\xAF |0 + \xAD\xB0 |0 + \xAD\xB1 |0 + \xAD\xB2 |0 + \xAD\xB3 |0 + \xAD\xB4 |0 + \xAD\xB5 |0 + \xAD\xB6 |0 + \xAD\xB7 |0 + \xAD\xB8 |0 + \xAD\xB9 |0 + \xAD\xBA |0 + \xAD\xBB |0 + \xAD\xBC |0 + \xAD\xBD |0 + \xAD\xBE |0 + \xAD\xBF |0 + \xAD\xC0 |0 + \xAD\xC1 |0 + \xAD\xC2 |0 + \xAD\xC3 |0 + \xAD\xC4 |0 + \xAD\xC5 |0 + \xAD\xC6 |0 + \xAD\xC7 |0 + \xAD\xC8 |0 + \xAD\xC9 |0 + \xAD\xCA |0 + \xAD\xCB |0 + \xAD\xCC |0 + \xAD\xCD |0 + \xAD\xCE |0 + \xAD\xCF |0 + \xAD\xD0 |0 + \xAD\xD1 |0 + \xAD\xD2 |0 + \xAD\xD3 |0 + \xAD\xD4 |0 + \xAD\xD5 |0 + \xAD\xD6 |0 + \xAD\xD7 |0 + \xAD\xD8 |0 + \xAD\xD9 |0 + \xAD\xDA |0 + \xAD\xDB |0 + \xAD\xDC |0 + \xAD\xDD |0 + \xAD\xDE |0 + \xAD\xDF |0 + \xAD\xE0 |0 + \xAD\xE1 |0 + \xAD\xE2 |0 + \xAD\xE3 |0 + \xAD\xE4 |0 + \xAD\xE5 |0 + \xAD\xE6 |0 + \xAD\xE7 |0 + \xAD\xE8 |0 + \xAD\xE9 |0 + \xAD\xEA |0 + \xAD\xEB |0 + \xAD\xEC |0 + \xAD\xED |0 + \xAD\xEE |0 + \xAD\xEF |0 + \xAD\xF0 |0 + \xAD\xF1 |0 + \xAD\xF2 |0 + \xAD\xF3 |0 + \xAD\xF4 |0 + \xAD\xF5 |0 + \xAD\xF6 |0 + \xAD\xF7 |0 + \xAD\xF8 |0 + \xAD\xF9 |0 + \xAD\xFA |0 + \xAD\xFB |0 + \xAD\xFC |0 + \xAD\xFD |0 + \xAD\xFE |0 + \xAE\xA1 |0 + \xAE\xA2 |0 + \xAE\xA3 |0 + \xAE\xA4 |0 + \xAE\xA5 |0 + \xAE\xA6 |0 + \xAE\xA7 |0 + \xAE\xA8 |0 + \xAE\xA9 |0 + \xAE\xAA |0 + \xAE\xAB |0 + \xAE\xAC |0 + \xAE\xAD |0 + \xAE\xAE |0 + \xAE\xAF |0 + \xAE\xB0 |0 + \xAE\xB1 |0 + \xAE\xB2 |0 + \xAE\xB3 |0 + \xAE\xB4 |0 + \xAE\xB5 |0 + \xAE\xB6 |0 + \xAE\xB7 |0 + \xAE\xB8 |0 + \xAE\xB9 |0 + \xAE\xBA |0 + \xAE\xBB |0 + \xAE\xBC |0 + \xAE\xBD |0 + \xAE\xBE |0 + \xAE\xBF |0 + \xAE\xC0 |0 + \xAE\xC1 |0 + \xAE\xC2 |0 + \xAE\xC3 |0 + \xAE\xC4 |0 + \xAE\xC5 |0 + \xAE\xC6 |0 + \xAE\xC7 |0 + \xAE\xC8 |0 + \xAE\xC9 |0 + \xAE\xCA |0 + \xAE\xCB |0 + \xAE\xCC |0 + \xAE\xCD |0 + \xAE\xCE |0 + \xAE\xCF |0 + \xAE\xD0 |0 + \xAE\xD1 |0 + \xAE\xD2 |0 + \xAE\xD3 |0 + \xAE\xD4 |0 + \xAE\xD5 |0 + \xAE\xD6 |0 + \xAE\xD7 |0 + \xAE\xD8 |0 + \xAE\xD9 |0 + \xAE\xDA |0 + \xAE\xDB |0 + \xAE\xDC |0 + \xAE\xDD |0 + \xAE\xDE |0 + \xAE\xDF |0 + \xAE\xE0 |0 + \xAE\xE1 |0 + \xAE\xE2 |0 + \xAE\xE3 |0 + \xAE\xE4 |0 + \xAE\xE5 |0 + \xAE\xE6 |0 + \xAE\xE7 |0 + \xAE\xE8 |0 + \xAE\xE9 |0 + \xAE\xEA |0 + \xAE\xEB |0 + \xAE\xEC |0 + \xAE\xED |0 + \xAE\xEE |0 + \xAE\xEF |0 + \xAE\xF0 |0 + \xAE\xF1 |0 + \xAE\xF2 |0 + \xAE\xF3 |0 + \xAE\xF4 |0 + \xAE\xF5 |0 + \xAE\xF6 |0 + \xAE\xF7 |0 + \xAE\xF8 |0 + \xAE\xF9 |0 + \xAE\xFA |0 + \xAE\xFB |0 + \xAE\xFC |0 + \xAE\xFD |0 + \xAE\xFE |0 + \xAF\xA1 |0 + \xAF\xA2 |0 + \xAF\xA3 |0 + \xAF\xA4 |0 + \xAF\xA5 |0 + \xAF\xA6 |0 + \xAF\xA7 |0 + \xAF\xA8 |0 + \xAF\xA9 |0 + \xAF\xAA |0 + \xAF\xAB |0 + \xAF\xAC |0 + \xAF\xAD |0 + \xAF\xAE |0 + \xAF\xAF |0 + \xAF\xB0 |0 + \xAF\xB1 |0 + \xAF\xB2 |0 + \xAF\xB3 |0 + \xAF\xB4 |0 + \xAF\xB5 |0 + \xAF\xB6 |0 + \xAF\xB7 |0 + \xAF\xB8 |0 + \xAF\xB9 |0 + \xAF\xBA |0 + \xAF\xBB |0 + \xAF\xBC |0 + \xAF\xBD |0 + \xAF\xBE |0 + \xAF\xBF |0 + \xAF\xC0 |0 + \xAF\xC1 |0 + \xAF\xC2 |0 + \xAF\xC3 |0 + \xAF\xC4 |0 + \xAF\xC5 |0 + \xAF\xC6 |0 + \xAF\xC7 |0 + \xAF\xC8 |0 + \xAF\xC9 |0 + \xAF\xCA |0 + \xAF\xCB |0 + \xAF\xCC |0 + \xAF\xCD |0 + \xAF\xCE |0 + \xAF\xCF |0 + \xAF\xD0 |0 + \xAF\xD1 |0 + \xAF\xD2 |0 + \xAF\xD3 |0 + \xAF\xD4 |0 + \xAF\xD5 |0 + \xAF\xD6 |0 + \xAF\xD7 |0 + \xAF\xD8 |0 + \xAF\xD9 |0 + \xAF\xDA |0 + \xAF\xDB |0 + \xAF\xDC |0 + \xAF\xDD |0 + \xAF\xDE |0 + \xAF\xDF |0 + \xAF\xE0 |0 + \xAF\xE1 |0 + \xAF\xE2 |0 + \xAF\xE3 |0 + \xAF\xE4 |0 + \xAF\xE5 |0 + \xAF\xE6 |0 + \xAF\xE7 |0 + \xAF\xE8 |0 + \xAF\xE9 |0 + \xAF\xEA |0 + \xAF\xEB |0 + \xAF\xEC |0 + \xAF\xED |0 + \xAF\xEE |0 + \xAF\xEF |0 + \xAF\xF0 |0 + \xAF\xF1 |0 + \xAF\xF2 |0 + \xAF\xF3 |0 + \xAF\xF4 |0 + \xAF\xF5 |0 + \xAF\xF6 |0 + \xAF\xF7 |0 + \xAF\xF8 |0 + \xAF\xF9 |0 + \xAF\xFA |0 + \xAF\xFB |0 + \xAF\xFC |0 + \xAF\xFD |0 + \xAF\xFE |0 + \xF8\xA1 |0 + \xF8\xA2 |0 + \xF8\xA3 |0 + \xF8\xA4 |0 + \xF8\xA5 |0 + \xF8\xA6 |0 + \xF8\xA7 |0 + \xF8\xA8 |0 + \xF8\xA9 |0 + \xF8\xAA |0 + \xF8\xAB |0 + \xF8\xAC |0 + \xF8\xAD |0 + \xF8\xAE |0 + \xF8\xAF |0 + \xF8\xB0 |0 + \xF8\xB1 |0 + \xF8\xB2 |0 + \xF8\xB3 |0 + \xF8\xB4 |0 + \xF8\xB5 |0 + \xF8\xB6 |0 + \xF8\xB7 |0 + \xF8\xB8 |0 + \xF8\xB9 |0 + \xF8\xBA |0 + \xF8\xBB |0 + \xF8\xBC |0 + \xF8\xBD |0 + \xF8\xBE |0 + \xF8\xBF |0 + \xF8\xC0 |0 + \xF8\xC1 |0 + \xF8\xC2 |0 + \xF8\xC3 |0 + \xF8\xC4 |0 + \xF8\xC5 |0 + \xF8\xC6 |0 + \xF8\xC7 |0 + \xF8\xC8 |0 + \xF8\xC9 |0 + \xF8\xCA |0 + \xF8\xCB |0 + \xF8\xCC |0 + \xF8\xCD |0 + \xF8\xCE |0 + \xF8\xCF |0 + \xF8\xD0 |0 + \xF8\xD1 |0 + \xF8\xD2 |0 + \xF8\xD3 |0 + \xF8\xD4 |0 + \xF8\xD5 |0 + \xF8\xD6 |0 + \xF8\xD7 |0 + \xF8\xD8 |0 + \xF8\xD9 |0 + \xF8\xDA |0 + \xF8\xDB |0 + \xF8\xDC |0 + \xF8\xDD |0 + \xF8\xDE |0 + \xF8\xDF |0 + \xF8\xE0 |0 + \xF8\xE1 |0 + \xF8\xE2 |0 + \xF8\xE3 |0 + \xF8\xE4 |0 + \xF8\xE5 |0 + \xF8\xE6 |0 + \xF8\xE7 |0 + \xF8\xE8 |0 + \xF8\xE9 |0 + \xF8\xEA |0 + \xF8\xEB |0 + \xF8\xEC |0 + \xF8\xED |0 + \xF8\xEE |0 + \xF8\xEF |0 + \xF8\xF0 |0 + \xF8\xF1 |0 + \xF8\xF2 |0 + \xF8\xF3 |0 + \xF8\xF4 |0 + \xF8\xF5 |0 + \xF8\xF6 |0 + \xF8\xF7 |0 + \xF8\xF8 |0 + \xF8\xF9 |0 + \xF8\xFA |0 + \xF8\xFB |0 + \xF8\xFC |0 + \xF8\xFD |0 + \xF8\xFE |0 + \xF9\xA1 |0 + \xF9\xA2 |0 + \xF9\xA3 |0 + \xF9\xA4 |0 + \xF9\xA5 |0 + \xF9\xA6 |0 + \xF9\xA7 |0 + \xF9\xA8 |0 + \xF9\xA9 |0 + \xF9\xAA |0 + \xF9\xAB |0 + \xF9\xAC |0 + \xF9\xAD |0 + \xF9\xAE |0 + \xF9\xAF |0 + \xF9\xB0 |0 + \xF9\xB1 |0 + \xF9\xB2 |0 + \xF9\xB3 |0 + \xF9\xB4 |0 + \xF9\xB5 |0 + \xF9\xB6 |0 + \xF9\xB7 |0 + \xF9\xB8 |0 + \xF9\xB9 |0 + \xF9\xBA |0 + \xF9\xBB |0 + \xF9\xBC |0 + \xF9\xBD |0 + \xF9\xBE |0 + \xF9\xBF |0 + \xF9\xC0 |0 + \xF9\xC1 |0 + \xF9\xC2 |0 + \xF9\xC3 |0 + \xF9\xC4 |0 + \xF9\xC5 |0 + \xF9\xC6 |0 + \xF9\xC7 |0 + \xF9\xC8 |0 + \xF9\xC9 |0 + \xF9\xCA |0 + \xF9\xCB |0 + \xF9\xCC |0 + \xF9\xCD |0 + \xF9\xCE |0 + \xF9\xCF |0 + \xF9\xD0 |0 + \xF9\xD1 |0 + \xF9\xD2 |0 + \xF9\xD3 |0 + \xF9\xD4 |0 + \xF9\xD5 |0 + \xF9\xD6 |0 + \xF9\xD7 |0 + \xF9\xD8 |0 + \xF9\xD9 |0 + \xF9\xDA |0 + \xF9\xDB |0 + \xF9\xDC |0 + \xF9\xDD |0 + \xF9\xDE |0 + \xF9\xDF |0 + \xF9\xE0 |0 + \xF9\xE1 |0 + \xF9\xE2 |0 + \xF9\xE3 |0 + \xF9\xE4 |0 + \xF9\xE5 |0 + \xF9\xE6 |0 + \xF9\xE7 |0 + \xF9\xE8 |0 + \xF9\xE9 |0 + \xF9\xEA |0 + \xF9\xEB |0 + \xF9\xEC |0 + \xF9\xED |0 + \xF9\xEE |0 + \xF9\xEF |0 + \xF9\xF0 |0 + \xF9\xF1 |0 + \xF9\xF2 |0 + \xF9\xF3 |0 + \xF9\xF4 |0 + \xF9\xF5 |0 + \xF9\xF6 |0 + \xF9\xF7 |0 + \xF9\xF8 |0 + \xF9\xF9 |0 + \xF9\xFA |0 + \xF9\xFB |0 + \xF9\xFC |0 + \xF9\xFD |0 + \xF9\xFE |0 + \xFA\xA1 |0 + \xFA\xA2 |0 + \xFA\xA3 |0 + \xFA\xA4 |0 + \xFA\xA5 |0 + \xFA\xA6 |0 + \xFA\xA7 |0 + \xFA\xA8 |0 + \xFA\xA9 |0 + \xFA\xAA |0 + \xFA\xAB |0 + \xFA\xAC |0 + \xFA\xAD |0 + \xFA\xAE |0 + \xFA\xAF |0 + \xFA\xB0 |0 + \xFA\xB1 |0 + \xFA\xB2 |0 + \xFA\xB3 |0 + \xFA\xB4 |0 + \xFA\xB5 |0 + \xFA\xB6 |0 + \xFA\xB7 |0 + \xFA\xB8 |0 + \xFA\xB9 |0 + \xFA\xBA |0 + \xFA\xBB |0 + \xFA\xBC |0 + \xFA\xBD |0 + \xFA\xBE |0 + \xFA\xBF |0 + \xFA\xC0 |0 + \xFA\xC1 |0 + \xFA\xC2 |0 + \xFA\xC3 |0 + \xFA\xC4 |0 + \xFA\xC5 |0 + \xFA\xC6 |0 + \xFA\xC7 |0 + \xFA\xC8 |0 + \xFA\xC9 |0 + \xFA\xCA |0 + \xFA\xCB |0 + \xFA\xCC |0 + \xFA\xCD |0 + \xFA\xCE |0 + \xFA\xCF |0 + \xFA\xD0 |0 + \xFA\xD1 |0 + \xFA\xD2 |0 + \xFA\xD3 |0 + \xFA\xD4 |0 + \xFA\xD5 |0 + \xFA\xD6 |0 + \xFA\xD7 |0 + \xFA\xD8 |0 + \xFA\xD9 |0 + \xFA\xDA |0 + \xFA\xDB |0 + \xFA\xDC |0 + \xFA\xDD |0 + \xFA\xDE |0 + \xFA\xDF |0 + \xFA\xE0 |0 + \xFA\xE1 |0 + \xFA\xE2 |0 + \xFA\xE3 |0 + \xFA\xE4 |0 + \xFA\xE5 |0 + \xFA\xE6 |0 + \xFA\xE7 |0 + \xFA\xE8 |0 + \xFA\xE9 |0 + \xFA\xEA |0 + \xFA\xEB |0 + \xFA\xEC |0 + \xFA\xED |0 + \xFA\xEE |0 + \xFA\xEF |0 + \xFA\xF0 |0 + \xFA\xF1 |0 + \xFA\xF2 |0 + \xFA\xF3 |0 + \xFA\xF4 |0 + \xFA\xF5 |0 + \xFA\xF6 |0 + \xFA\xF7 |0 + \xFA\xF8 |0 + \xFA\xF9 |0 + \xFA\xFA |0 + \xFA\xFB |0 + \xFA\xFC |0 + \xFA\xFD |0 + \xFA\xFE |0 + \xFB\xA1 |0 + \xFB\xA2 |0 + \xFB\xA3 |0 + \xFB\xA4 |0 + \xFB\xA5 |0 + \xFB\xA6 |0 + \xFB\xA7 |0 + \xFB\xA8 |0 + \xFB\xA9 |0 + \xFB\xAA |0 + \xFB\xAB |0 + \xFB\xAC |0 + \xFB\xAD |0 + \xFB\xAE |0 + \xFB\xAF |0 + \xFB\xB0 |0 + \xFB\xB1 |0 + \xFB\xB2 |0 + \xFB\xB3 |0 + \xFB\xB4 |0 + \xFB\xB5 |0 + \xFB\xB6 |0 + \xFB\xB7 |0 + \xFB\xB8 |0 + \xFB\xB9 |0 + \xFB\xBA |0 + \xFB\xBB |0 + \xFB\xBC |0 + \xFB\xBD |0 + \xFB\xBE |0 + \xFB\xBF |0 + \xFB\xC0 |0 + \xFB\xC1 |0 + \xFB\xC2 |0 + \xFB\xC3 |0 + \xFB\xC4 |0 + \xFB\xC5 |0 + \xFB\xC6 |0 + \xFB\xC7 |0 + \xFB\xC8 |0 + \xFB\xC9 |0 + \xFB\xCA |0 + \xFB\xCB |0 + \xFB\xCC |0 + \xFB\xCD |0 + \xFB\xCE |0 + \xFB\xCF |0 + \xFB\xD0 |0 + \xFB\xD1 |0 + \xFB\xD2 |0 + \xFB\xD3 |0 + \xFB\xD4 |0 + \xFB\xD5 |0 + \xFB\xD6 |0 + \xFB\xD7 |0 + \xFB\xD8 |0 + \xFB\xD9 |0 + \xFB\xDA |0 + \xFB\xDB |0 + \xFB\xDC |0 + \xFB\xDD |0 + \xFB\xDE |0 + \xFB\xDF |0 + \xFB\xE0 |0 + \xFB\xE1 |0 + \xFB\xE2 |0 + \xFB\xE3 |0 + \xFB\xE4 |0 + \xFB\xE5 |0 + \xFB\xE6 |0 + \xFB\xE7 |0 + \xFB\xE8 |0 + \xFB\xE9 |0 + \xFB\xEA |0 + \xFB\xEB |0 + \xFB\xEC |0 + \xFB\xED |0 + \xFB\xEE |0 + \xFB\xEF |0 + \xFB\xF0 |0 + \xFB\xF1 |0 + \xFB\xF2 |0 + \xFB\xF3 |0 + \xFB\xF4 |0 + \xFB\xF5 |0 + \xFB\xF6 |0 + \xFB\xF7 |0 + \xFB\xF8 |0 + \xFB\xF9 |0 + \xFB\xFA |0 + \xFB\xFB |0 + \xFB\xFC |0 + \xFB\xFD |0 + \xFB\xFE |0 + \xFC\xA1 |0 + \xFC\xA2 |0 + \xFC\xA3 |0 + \xFC\xA4 |0 + \xFC\xA5 |0 + \xFC\xA6 |0 + \xFC\xA7 |0 + \xFC\xA8 |0 + \xFC\xA9 |0 + \xFC\xAA |0 + \xFC\xAB |0 + \xFC\xAC |0 + \xFC\xAD |0 + \xFC\xAE |0 + \xFC\xAF |0 + \xFC\xB0 |0 + \xFC\xB1 |0 + \xFC\xB2 |0 + \xFC\xB3 |0 + \xFC\xB4 |0 + \xFC\xB5 |0 + \xFC\xB6 |0 + \xFC\xB7 |0 + \xFC\xB8 |0 + \xFC\xB9 |0 + \xFC\xBA |0 + \xFC\xBB |0 + \xFC\xBC |0 + \xFC\xBD |0 + \xFC\xBE |0 + \xFC\xBF |0 + \xFC\xC0 |0 + \xFC\xC1 |0 + \xFC\xC2 |0 + \xFC\xC3 |0 + \xFC\xC4 |0 + \xFC\xC5 |0 + \xFC\xC6 |0 + \xFC\xC7 |0 + \xFC\xC8 |0 + \xFC\xC9 |0 + \xFC\xCA |0 + \xFC\xCB |0 + \xFC\xCC |0 + \xFC\xCD |0 + \xFC\xCE |0 + \xFC\xCF |0 + \xFC\xD0 |0 + \xFC\xD1 |0 + \xFC\xD2 |0 + \xFC\xD3 |0 + \xFC\xD4 |0 + \xFC\xD5 |0 + \xFC\xD6 |0 + \xFC\xD7 |0 + \xFC\xD8 |0 + \xFC\xD9 |0 + \xFC\xDA |0 + \xFC\xDB |0 + \xFC\xDC |0 + \xFC\xDD |0 + \xFC\xDE |0 + \xFC\xDF |0 + \xFC\xE0 |0 + \xFC\xE1 |0 + \xFC\xE2 |0 + \xFC\xE3 |0 + \xFC\xE4 |0 + \xFC\xE5 |0 + \xFC\xE6 |0 + \xFC\xE7 |0 + \xFC\xE8 |0 + \xFC\xE9 |0 + \xFC\xEA |0 + \xFC\xEB |0 + \xFC\xEC |0 + \xFC\xED |0 + \xFC\xEE |0 + \xFC\xEF |0 + \xFC\xF0 |0 + \xFC\xF1 |0 + \xFC\xF2 |0 + \xFC\xF3 |0 + \xFC\xF4 |0 + \xFC\xF5 |0 + \xFC\xF6 |0 + \xFC\xF7 |0 + \xFC\xF8 |0 + \xFC\xF9 |0 + \xFC\xFA |0 + \xFC\xFB |0 + \xFC\xFC |0 + \xFC\xFD |0 + \xFC\xFE |0 + \xFD\xA1 |0 + \xFD\xA2 |0 + \xFD\xA3 |0 + \xFD\xA4 |0 + \xFD\xA5 |0 + \xFD\xA6 |0 + \xFD\xA7 |0 + \xFD\xA8 |0 + \xFD\xA9 |0 + \xFD\xAA |0 + \xFD\xAB |0 + \xFD\xAC |0 + \xFD\xAD |0 + \xFD\xAE |0 + \xFD\xAF |0 + \xFD\xB0 |0 + \xFD\xB1 |0 + \xFD\xB2 |0 + \xFD\xB3 |0 + \xFD\xB4 |0 + \xFD\xB5 |0 + \xFD\xB6 |0 + \xFD\xB7 |0 + \xFD\xB8 |0 + \xFD\xB9 |0 + \xFD\xBA |0 + \xFD\xBB |0 + \xFD\xBC |0 + \xFD\xBD |0 + \xFD\xBE |0 + \xFD\xBF |0 + \xFD\xC0 |0 + \xFD\xC1 |0 + \xFD\xC2 |0 + \xFD\xC3 |0 + \xFD\xC4 |0 + \xFD\xC5 |0 + \xFD\xC6 |0 + \xFD\xC7 |0 + \xFD\xC8 |0 + \xFD\xC9 |0 + \xFD\xCA |0 + \xFD\xCB |0 + \xFD\xCC |0 + \xFD\xCD |0 + \xFD\xCE |0 + \xFD\xCF |0 + \xFD\xD0 |0 + \xFD\xD1 |0 + \xFD\xD2 |0 + \xFD\xD3 |0 + \xFD\xD4 |0 + \xFD\xD5 |0 + \xFD\xD6 |0 + \xFD\xD7 |0 + \xFD\xD8 |0 + \xFD\xD9 |0 + \xFD\xDA |0 + \xFD\xDB |0 + \xFD\xDC |0 + \xFD\xDD |0 + \xFD\xDE |0 + \xFD\xDF |0 + \xFD\xE0 |0 + \xFD\xE1 |0 + \xFD\xE2 |0 + \xFD\xE3 |0 + \xFD\xE4 |0 + \xFD\xE5 |0 + \xFD\xE6 |0 + \xFD\xE7 |0 + \xFD\xE8 |0 + \xFD\xE9 |0 + \xFD\xEA |0 + \xFD\xEB |0 + \xFD\xEC |0 + \xFD\xED |0 + \xFD\xEE |0 + \xFD\xEF |0 + \xFD\xF0 |0 + \xFD\xF1 |0 + \xFD\xF2 |0 + \xFD\xF3 |0 + \xFD\xF4 |0 + \xFD\xF5 |0 + \xFD\xF6 |0 + \xFD\xF7 |0 + \xFD\xF8 |0 + \xFD\xF9 |0 + \xFD\xFA |0 + \xFD\xFB |0 + \xFD\xFC |0 + \xFD\xFD |0 + \xFD\xFE |0 + \xFE\xA1 |0 + \xFE\xA2 |0 + \xFE\xA3 |0 + \xFE\xA4 |0 + \xFE\xA5 |0 + \xFE\xA6 |0 + \xFE\xA7 |0 + \xFE\xA8 |0 + \xFE\xA9 |0 + \xFE\xAA |0 + \xFE\xAB |0 + \xFE\xAC |0 + \xFE\xAD |0 + \xFE\xAE |0 + \xFE\xAF |0 + \xFE\xB0 |0 + \xFE\xB1 |0 + \xFE\xB2 |0 + \xFE\xB3 |0 + \xFE\xB4 |0 + \xFE\xB5 |0 + \xFE\xB6 |0 + \xFE\xB7 |0 + \xFE\xB8 |0 + \xFE\xB9 |0 + \xFE\xBA |0 + \xFE\xBB |0 + \xFE\xBC |0 + \xFE\xBD |0 + \xFE\xBE |0 + \xFE\xBF |0 + \xFE\xC0 |0 + \xFE\xC1 |0 + \xFE\xC2 |0 + \xFE\xC3 |0 + \xFE\xC4 |0 + \xFE\xC5 |0 + \xFE\xC6 |0 + \xFE\xC7 |0 + \xFE\xC8 |0 + \xFE\xC9 |0 + \xFE\xCA |0 + \xFE\xCB |0 + \xFE\xCC |0 + \xFE\xCD |0 + \xFE\xCE |0 + \xFE\xCF |0 + \xFE\xD0 |0 + \xFE\xD1 |0 + \xFE\xD2 |0 + \xFE\xD3 |0 + \xFE\xD4 |0 + \xFE\xD5 |0 + \xFE\xD6 |0 + \xFE\xD7 |0 + \xFE\xD8 |0 + \xFE\xD9 |0 + \xFE\xDA |0 + \xFE\xDB |0 + \xFE\xDC |0 + \xFE\xDD |0 + \xFE\xDE |0 + \xFE\xDF |0 + \xFE\xE0 |0 + \xFE\xE1 |0 + \xFE\xE2 |0 + \xFE\xE3 |0 + \xFE\xE4 |0 + \xFE\xE5 |0 + \xFE\xE6 |0 + \xFE\xE7 |0 + \xFE\xE8 |0 + \xFE\xE9 |0 + \xFE\xEA |0 + \xFE\xEB |0 + \xFE\xEC |0 + \xFE\xED |0 + \xFE\xEE |0 + \xFE\xEF |0 + \xFE\xF0 |0 + \xFE\xF1 |0 + \xFE\xF2 |0 + \xFE\xF3 |0 + \xFE\xF4 |0 + \xFE\xF5 |0 + \xFE\xF6 |0 + \xFE\xF7 |0 + \xFE\xF8 |0 + \xFE\xF9 |0 + \xFE\xFA |0 + \xFE\xFB |0 + \xFE\xFC |0 + \xFE\xFD |0 + \xFE\xFE |0 + \xA1\x40 |0 + \xA1\x41 |0 + \xA1\x42 |0 + \xA1\x43 |0 + \xA1\x44 |0 + \xA1\x45 |0 + \xA1\x46 |0 + \xA1\x47 |0 + \xA1\x48 |0 + \xA1\x49 |0 + \xA1\x4A |0 + \xA1\x4B |0 + \xA1\x4C |0 + \xA1\x4D |0 + \xA1\x4E |0 + \xA1\x4F |0 + \xA1\x50 |0 + \xA1\x51 |0 + \xA1\x52 |0 + \xA1\x53 |0 + \xA1\x54 |0 + \xA1\x55 |0 + \xA1\x56 |0 + \xA1\x57 |0 + \xA1\x58 |0 + \xA1\x59 |0 + \xA1\x5A |0 + \xA1\x5B |0 + \xA1\x5C |0 + \xA1\x5D |0 + \xA1\x5E |0 + \xA1\x5F |0 + \xA1\x60 |0 + \xA1\x61 |0 + \xA1\x62 |0 + \xA1\x63 |0 + \xA1\x64 |0 + \xA1\x65 |0 + \xA1\x66 |0 + \xA1\x67 |0 + \xA1\x68 |0 + \xA1\x69 |0 + \xA1\x6A |0 + \xA1\x6B |0 + \xA1\x6C |0 + \xA1\x6D |0 + \xA1\x6E |0 + \xA1\x6F |0 + \xA1\x70 |0 + \xA1\x71 |0 + \xA1\x72 |0 + \xA1\x73 |0 + \xA1\x74 |0 + \xA1\x75 |0 + \xA1\x76 |0 + \xA1\x77 |0 + \xA1\x78 |0 + \xA1\x79 |0 + \xA1\x7A |0 + \xA1\x7B |0 + \xA1\x7C |0 + \xA1\x7D |0 + \xA1\x7E |0 + \xA1\x80 |0 + \xA1\x81 |0 + \xA1\x82 |0 + \xA1\x83 |0 + \xA1\x84 |0 + \xA1\x85 |0 + \xA1\x86 |0 + \xA1\x87 |0 + \xA1\x88 |0 + \xA1\x89 |0 + \xA1\x8A |0 + \xA1\x8B |0 + \xA1\x8C |0 + \xA1\x8D |0 + \xA1\x8E |0 + \xA1\x8F |0 + \xA1\x90 |0 + \xA1\x91 |0 + \xA1\x92 |0 + \xA1\x93 |0 + \xA1\x94 |0 + \xA1\x95 |0 + \xA1\x96 |0 + \xA1\x97 |0 + \xA1\x98 |0 + \xA1\x99 |0 + \xA1\x9A |0 + \xA1\x9B |0 + \xA1\x9C |0 + \xA1\x9D |0 + \xA1\x9E |0 + \xA1\x9F |0 + \xA1\xA0 |0 + \xA2\x40 |0 + \xA2\x41 |0 + \xA2\x42 |0 + \xA2\x43 |0 + \xA2\x44 |0 + \xA2\x45 |0 + \xA2\x46 |0 + \xA2\x47 |0 + \xA2\x48 |0 + \xA2\x49 |0 + \xA2\x4A |0 + \xA2\x4B |0 + \xA2\x4C |0 + \xA2\x4D |0 + \xA2\x4E |0 + \xA2\x4F |0 + \xA2\x50 |0 + \xA2\x51 |0 + \xA2\x52 |0 + \xA2\x53 |0 + \xA2\x54 |0 + \xA2\x55 |0 + \xA2\x56 |0 + \xA2\x57 |0 + \xA2\x58 |0 + \xA2\x59 |0 + \xA2\x5A |0 + \xA2\x5B |0 + \xA2\x5C |0 + \xA2\x5D |0 + \xA2\x5E |0 + \xA2\x5F |0 + \xA2\x60 |0 + \xA2\x61 |0 + \xA2\x62 |0 + \xA2\x63 |0 + \xA2\x64 |0 + \xA2\x65 |0 + \xA2\x66 |0 + \xA2\x67 |0 + \xA2\x68 |0 + \xA2\x69 |0 + \xA2\x6A |0 + \xA2\x6B |0 + \xA2\x6C |0 + \xA2\x6D |0 + \xA2\x6E |0 + \xA2\x6F |0 + \xA2\x70 |0 + \xA2\x71 |0 + \xA2\x72 |0 + \xA2\x73 |0 + \xA2\x74 |0 + \xA2\x75 |0 + \xA2\x76 |0 + \xA2\x77 |0 + \xA2\x78 |0 + \xA2\x79 |0 + \xA2\x7A |0 + \xA2\x7B |0 + \xA2\x7C |0 + \xA2\x7D |0 + \xA2\x7E |0 + \xA2\x80 |0 + \xA2\x81 |0 + \xA2\x82 |0 + \xA2\x83 |0 + \xA2\x84 |0 + \xA2\x85 |0 + \xA2\x86 |0 + \xA2\x87 |0 + \xA2\x88 |0 + \xA2\x89 |0 + \xA2\x8A |0 + \xA2\x8B |0 + \xA2\x8C |0 + \xA2\x8D |0 + \xA2\x8E |0 + \xA2\x8F |0 + \xA2\x90 |0 + \xA2\x91 |0 + \xA2\x92 |0 + \xA2\x93 |0 + \xA2\x94 |0 + \xA2\x95 |0 + \xA2\x96 |0 + \xA2\x97 |0 + \xA2\x98 |0 + \xA2\x99 |0 + \xA2\x9A |0 + \xA2\x9B |0 + \xA2\x9C |0 + \xA2\x9D |0 + \xA2\x9E |0 + \xA2\x9F |0 + \xA2\xA0 |0 + \xA3\x40 |0 + \xA3\x41 |0 + \xA3\x42 |0 + \xA3\x43 |0 + \xA3\x44 |0 + \xA3\x45 |0 + \xA3\x46 |0 + \xA3\x47 |0 + \xA3\x48 |0 + \xA3\x49 |0 + \xA3\x4A |0 + \xA3\x4B |0 + \xA3\x4C |0 + \xA3\x4D |0 + \xA3\x4E |0 + \xA3\x4F |0 + \xA3\x50 |0 + \xA3\x51 |0 + \xA3\x52 |0 + \xA3\x53 |0 + \xA3\x54 |0 + \xA3\x55 |0 + \xA3\x56 |0 + \xA3\x57 |0 + \xA3\x58 |0 + \xA3\x59 |0 + \xA3\x5A |0 + \xA3\x5B |0 + \xA3\x5C |0 + \xA3\x5D |0 + \xA3\x5E |0 + \xA3\x5F |0 + \xA3\x60 |0 + \xA3\x61 |0 + \xA3\x62 |0 + \xA3\x63 |0 + \xA3\x64 |0 + \xA3\x65 |0 + \xA3\x66 |0 + \xA3\x67 |0 + \xA3\x68 |0 + \xA3\x69 |0 + \xA3\x6A |0 + \xA3\x6B |0 + \xA3\x6C |0 + \xA3\x6D |0 + \xA3\x6E |0 + \xA3\x6F |0 + \xA3\x70 |0 + \xA3\x71 |0 + \xA3\x72 |0 + \xA3\x73 |0 + \xA3\x74 |0 + \xA3\x75 |0 + \xA3\x76 |0 + \xA3\x77 |0 + \xA3\x78 |0 + \xA3\x79 |0 + \xA3\x7A |0 + \xA3\x7B |0 + \xA3\x7C |0 + \xA3\x7D |0 + \xA3\x7E |0 + \xA3\x80 |0 + \xA3\x81 |0 + \xA3\x82 |0 + \xA3\x83 |0 + \xA3\x84 |0 + \xA3\x85 |0 + \xA3\x86 |0 + \xA3\x87 |0 + \xA3\x88 |0 + \xA3\x89 |0 + \xA3\x8A |0 + \xA3\x8B |0 + \xA3\x8C |0 + \xA3\x8D |0 + \xA3\x8E |0 + \xA3\x8F |0 + \xA3\x90 |0 + \xA3\x91 |0 + \xA3\x92 |0 + \xA3\x93 |0 + \xA3\x94 |0 + \xA3\x95 |0 + \xA3\x96 |0 + \xA3\x97 |0 + \xA3\x98 |0 + \xA3\x99 |0 + \xA3\x9A |0 + \xA3\x9B |0 + \xA3\x9C |0 + \xA3\x9D |0 + \xA3\x9E |0 + \xA3\x9F |0 + \xA3\xA0 |0 + \xA4\x40 |0 + \xA4\x41 |0 + \xA4\x42 |0 + \xA4\x43 |0 + \xA4\x44 |0 + \xA4\x45 |0 + \xA4\x46 |0 + \xA4\x47 |0 + \xA4\x48 |0 + \xA4\x49 |0 + \xA4\x4A |0 + \xA4\x4B |0 + \xA4\x4C |0 + \xA4\x4D |0 + \xA4\x4E |0 + \xA4\x4F |0 + \xA4\x50 |0 + \xA4\x51 |0 + \xA4\x52 |0 + \xA4\x53 |0 + \xA4\x54 |0 + \xA4\x55 |0 + \xA4\x56 |0 + \xA4\x57 |0 + \xA4\x58 |0 + \xA4\x59 |0 + \xA4\x5A |0 + \xA4\x5B |0 + \xA4\x5C |0 + \xA4\x5D |0 + \xA4\x5E |0 + \xA4\x5F |0 + \xA4\x60 |0 + \xA4\x61 |0 + \xA4\x62 |0 + \xA4\x63 |0 + \xA4\x64 |0 + \xA4\x65 |0 + \xA4\x66 |0 + \xA4\x67 |0 + \xA4\x68 |0 + \xA4\x69 |0 + \xA4\x6A |0 + \xA4\x6B |0 + \xA4\x6C |0 + \xA4\x6D |0 + \xA4\x6E |0 + \xA4\x6F |0 + \xA4\x70 |0 + \xA4\x71 |0 + \xA4\x72 |0 + \xA4\x73 |0 + \xA4\x74 |0 + \xA4\x75 |0 + \xA4\x76 |0 + \xA4\x77 |0 + \xA4\x78 |0 + \xA4\x79 |0 + \xA4\x7A |0 + \xA4\x7B |0 + \xA4\x7C |0 + \xA4\x7D |0 + \xA4\x7E |0 + \xA4\x80 |0 + \xA4\x81 |0 + \xA4\x82 |0 + \xA4\x83 |0 + \xA4\x84 |0 + \xA4\x85 |0 + \xA4\x86 |0 + \xA4\x87 |0 + \xA4\x88 |0 + \xA4\x89 |0 + \xA4\x8A |0 + \xA4\x8B |0 + \xA4\x8C |0 + \xA4\x8D |0 + \xA4\x8E |0 + \xA4\x8F |0 + \xA4\x90 |0 + \xA4\x91 |0 + \xA4\x92 |0 + \xA4\x93 |0 + \xA4\x94 |0 + \xA4\x95 |0 + \xA4\x96 |0 + \xA4\x97 |0 + \xA4\x98 |0 + \xA4\x99 |0 + \xA4\x9A |0 + \xA4\x9B |0 + \xA4\x9C |0 + \xA4\x9D |0 + \xA4\x9E |0 + \xA4\x9F |0 + \xA4\xA0 |0 + \xA5\x40 |0 + \xA5\x41 |0 + \xA5\x42 |0 + \xA5\x43 |0 + \xA5\x44 |0 + \xA5\x45 |0 + \xA5\x46 |0 + \xA5\x47 |0 + \xA5\x48 |0 + \xA5\x49 |0 + \xA5\x4A |0 + \xA5\x4B |0 + \xA5\x4C |0 + \xA5\x4D |0 + \xA5\x4E |0 + \xA5\x4F |0 + \xA5\x50 |0 + \xA5\x51 |0 + \xA5\x52 |0 + \xA5\x53 |0 + \xA5\x54 |0 + \xA5\x55 |0 + \xA5\x56 |0 + \xA5\x57 |0 + \xA5\x58 |0 + \xA5\x59 |0 + \xA5\x5A |0 + \xA5\x5B |0 + \xA5\x5C |0 + \xA5\x5D |0 + \xA5\x5E |0 + \xA5\x5F |0 + \xA5\x60 |0 + \xA5\x61 |0 + \xA5\x62 |0 + \xA5\x63 |0 + \xA5\x64 |0 + \xA5\x65 |0 + \xA5\x66 |0 + \xA5\x67 |0 + \xA5\x68 |0 + \xA5\x69 |0 + \xA5\x6A |0 + \xA5\x6B |0 + \xA5\x6C |0 + \xA5\x6D |0 + \xA5\x6E |0 + \xA5\x6F |0 + \xA5\x70 |0 + \xA5\x71 |0 + \xA5\x72 |0 + \xA5\x73 |0 + \xA5\x74 |0 + \xA5\x75 |0 + \xA5\x76 |0 + \xA5\x77 |0 + \xA5\x78 |0 + \xA5\x79 |0 + \xA5\x7A |0 + \xA5\x7B |0 + \xA5\x7C |0 + \xA5\x7D |0 + \xA5\x7E |0 + \xA5\x80 |0 + \xA5\x81 |0 + \xA5\x82 |0 + \xA5\x83 |0 + \xA5\x84 |0 + \xA5\x85 |0 + \xA5\x86 |0 + \xA5\x87 |0 + \xA5\x88 |0 + \xA5\x89 |0 + \xA5\x8A |0 + \xA5\x8B |0 + \xA5\x8C |0 + \xA5\x8D |0 + \xA5\x8E |0 + \xA5\x8F |0 + \xA5\x90 |0 + \xA5\x91 |0 + \xA5\x92 |0 + \xA5\x93 |0 + \xA5\x94 |0 + \xA5\x95 |0 + \xA5\x96 |0 + \xA5\x97 |0 + \xA5\x98 |0 + \xA5\x99 |0 + \xA5\x9A |0 + \xA5\x9B |0 + \xA5\x9C |0 + \xA5\x9D |0 + \xA5\x9E |0 + \xA5\x9F |0 + \xA5\xA0 |0 + \xA6\x40 |0 + \xA6\x41 |0 + \xA6\x42 |0 + \xA6\x43 |0 + \xA6\x44 |0 + \xA6\x45 |0 + \xA6\x46 |0 + \xA6\x47 |0 + \xA6\x48 |0 + \xA6\x49 |0 + \xA6\x4A |0 + \xA6\x4B |0 + \xA6\x4C |0 + \xA6\x4D |0 + \xA6\x4E |0 + \xA6\x4F |0 + \xA6\x50 |0 + \xA6\x51 |0 + \xA6\x52 |0 + \xA6\x53 |0 + \xA6\x54 |0 + \xA6\x55 |0 + \xA6\x56 |0 + \xA6\x57 |0 + \xA6\x58 |0 + \xA6\x59 |0 + \xA6\x5A |0 + \xA6\x5B |0 + \xA6\x5C |0 + \xA6\x5D |0 + \xA6\x5E |0 + \xA6\x5F |0 + \xA6\x60 |0 + \xA6\x61 |0 + \xA6\x62 |0 + \xA6\x63 |0 + \xA6\x64 |0 + \xA6\x65 |0 + \xA6\x66 |0 + \xA6\x67 |0 + \xA6\x68 |0 + \xA6\x69 |0 + \xA6\x6A |0 + \xA6\x6B |0 + \xA6\x6C |0 + \xA6\x6D |0 + \xA6\x6E |0 + \xA6\x6F |0 + \xA6\x70 |0 + \xA6\x71 |0 + \xA6\x72 |0 + \xA6\x73 |0 + \xA6\x74 |0 + \xA6\x75 |0 + \xA6\x76 |0 + \xA6\x77 |0 + \xA6\x78 |0 + \xA6\x79 |0 + \xA6\x7A |0 + \xA6\x7B |0 + \xA6\x7C |0 + \xA6\x7D |0 + \xA6\x7E |0 + \xA6\x80 |0 + \xA6\x81 |0 + \xA6\x82 |0 + \xA6\x83 |0 + \xA6\x84 |0 + \xA6\x85 |0 + \xA6\x86 |0 + \xA6\x87 |0 + \xA6\x88 |0 + \xA6\x89 |0 + \xA6\x8A |0 + \xA6\x8B |0 + \xA6\x8C |0 + \xA6\x8D |0 + \xA6\x8E |0 + \xA6\x8F |0 + \xA6\x90 |0 + \xA6\x91 |0 + \xA6\x92 |0 + \xA6\x93 |0 + \xA6\x94 |0 + \xA6\x95 |0 + \xA6\x96 |0 + \xA6\x97 |0 + \xA6\x98 |0 + \xA6\x99 |0 + \xA6\x9A |0 + \xA6\x9B |0 + \xA6\x9C |0 + \xA6\x9D |0 + \xA6\x9E |0 + \xA6\x9F |0 + \xA6\xA0 |0 + \xA7\x40 |0 + \xA7\x41 |0 + \xA7\x42 |0 + \xA7\x43 |0 + \xA7\x44 |0 + \xA7\x45 |0 + \xA7\x46 |0 + \xA7\x47 |0 + \xA7\x48 |0 + \xA7\x49 |0 + \xA7\x4A |0 + \xA7\x4B |0 + \xA7\x4C |0 + \xA7\x4D |0 + \xA7\x4E |0 + \xA7\x4F |0 + \xA7\x50 |0 + \xA7\x51 |0 + \xA7\x52 |0 + \xA7\x53 |0 + \xA7\x54 |0 + \xA7\x55 |0 + \xA7\x56 |0 + \xA7\x57 |0 + \xA7\x58 |0 + \xA7\x59 |0 + \xA7\x5A |0 + \xA7\x5B |0 + \xA7\x5C |0 + \xA7\x5D |0 + \xA7\x5E |0 + \xA7\x5F |0 + \xA7\x60 |0 + \xA7\x61 |0 + \xA7\x62 |0 + \xA7\x63 |0 + \xA7\x64 |0 + \xA7\x65 |0 + \xA7\x66 |0 + \xA7\x67 |0 + \xA7\x68 |0 + \xA7\x69 |0 + \xA7\x6A |0 + \xA7\x6B |0 + \xA7\x6C |0 + \xA7\x6D |0 + \xA7\x6E |0 + \xA7\x6F |0 + \xA7\x70 |0 + \xA7\x71 |0 + \xA7\x72 |0 + \xA7\x73 |0 + \xA7\x74 |0 + \xA7\x75 |0 + \xA7\x76 |0 + \xA7\x77 |0 + \xA7\x78 |0 + \xA7\x79 |0 + \xA7\x7A |0 + \xA7\x7B |0 + \xA7\x7C |0 + \xA7\x7D |0 + \xA7\x7E |0 + \xA7\x80 |0 + \xA7\x81 |0 + \xA7\x82 |0 + \xA7\x83 |0 + \xA7\x84 |0 + \xA7\x85 |0 + \xA7\x86 |0 + \xA7\x87 |0 + \xA7\x88 |0 + \xA7\x89 |0 + \xA7\x8A |0 + \xA7\x8B |0 + \xA7\x8C |0 + \xA7\x8D |0 + \xA7\x8E |0 + \xA7\x8F |0 + \xA7\x90 |0 + \xA7\x91 |0 + \xA7\x92 |0 + \xA7\x93 |0 + \xA7\x94 |0 + \xA7\x95 |0 + \xA7\x96 |0 + \xA7\x97 |0 + \xA7\x98 |0 + \xA7\x99 |0 + \xA7\x9A |0 + \xA7\x9B |0 + \xA7\x9C |0 + \xA7\x9D |0 + \xA7\x9E |0 + \xA7\x9F |0 + \xA7\xA0 |0 + \xA2\xAB |0 + \xA2\xAC |0 + \xA2\xAD |0 + \xA2\xAE |0 + \xA2\xAF |0 + \xA2\xB0 |0 + \xA2\xE3 |0 + \xA2\xE4 |0 + \xA2\xEF |0 + \xA2\xF0 |0 + \xA2\xFD |0 + \xA2\xFE |0 + \xA4\xF4 |0 + \xA4\xF5 |0 + \xA4\xF6 |0 + \xA4\xF7 |0 + \xA4\xF8 |0 + \xA4\xF9 |0 + \xA4\xFA |0 + \xA4\xFB |0 + \xA4\xFC |0 + \xA4\xFD |0 + \xA4\xFE |0 + \xA5\xF7 |0 + \xA5\xF8 |0 + \xA5\xF9 |0 + \xA5\xFA |0 + \xA5\xFB |0 + \xA5\xFC |0 + \xA5\xFD |0 + \xA5\xFE |0 + \xA6\xB9 |0 + \xA6\xBA |0 + \xA6\xBB |0 + \xA6\xBC |0 + \xA6\xBD |0 + \xA6\xBE |0 + \xA6\xBF |0 + \xA6\xC0 |0 + \xA6\xD9 |0 + \xA6\xDA |0 + \xA6\xDB |0 + \xA6\xDC |0 + \xA6\xDD |0 + \xA6\xDE |0 + \xA6\xDF |0 + \xA6\xEC |0 + \xA6\xED |0 + \xA6\xF3 |0 + \xA6\xF6 |0 + \xA6\xF7 |0 + \xA6\xF8 |0 + \xA6\xF9 |0 + \xA6\xFA |0 + \xA6\xFB |0 + \xA6\xFC |0 + \xA6\xFD |0 + \xA6\xFE |0 + \xA7\xC2 |0 + \xA7\xC3 |0 + \xA7\xC4 |0 + \xA7\xC5 |0 + \xA7\xC6 |0 + \xA7\xC7 |0 + \xA7\xC8 |0 + \xA7\xC9 |0 + \xA7\xCA |0 + \xA7\xCB |0 + \xA7\xCC |0 + \xA7\xCD |0 + \xA7\xCE |0 + \xA7\xCF |0 + \xA7\xD0 |0 + \xA7\xF2 |0 + \xA7\xF3 |0 + \xA7\xF4 |0 + \xA7\xF5 |0 + \xA7\xF6 |0 + \xA7\xF7 |0 + \xA7\xF8 |0 + \xA7\xF9 |0 + \xA7\xFA |0 + \xA7\xFB |0 + \xA7\xFC |0 + \xA7\xFD |0 + \xA7\xFE |0 + \xA8\x96 |0 + \xA8\x97 |0 + \xA8\x98 |0 + \xA8\x99 |0 + \xA8\x9A |0 + \xA8\x9B |0 + \xA8\x9C |0 + \xA8\x9D |0 + \xA8\x9E |0 + \xA8\x9F |0 + \xA8\xA0 |0 + \xA8\xBC |0 + \xA8\xBF |0 + \xA8\xC1 |0 + \xA8\xC2 |0 + \xA8\xC3 |0 + \xA8\xC4 |0 + \xA8\xEA |0 + \xA8\xEB |0 + \xA8\xEC |0 + \xA8\xED |0 + \xA8\xEE |0 + \xA8\xEF |0 + \xA8\xF0 |0 + \xA8\xF1 |0 + \xA8\xF2 |0 + \xA8\xF3 |0 + \xA8\xF4 |0 + \xA8\xF5 |0 + \xA8\xF6 |0 + \xA8\xF7 |0 + \xA8\xF8 |0 + \xA8\xF9 |0 + \xA8\xFA |0 + \xA8\xFB |0 + \xA8\xFC |0 + \xA8\xFD |0 + \xA8\xFE |0 + \xA9\x58 |0 + \xA9\x5B |0 + \xA9\x5D |0 + \xA9\x5E |0 + \xA9\x5F |0 + \xA9\x89 |0 + \xA9\x8A |0 + \xA9\x8B |0 + \xA9\x8C |0 + \xA9\x8D |0 + \xA9\x8E |0 + \xA9\x8F |0 + \xA9\x90 |0 + \xA9\x91 |0 + \xA9\x92 |0 + \xA9\x93 |0 + \xA9\x94 |0 + \xA9\x95 |0 + \xA9\x97 |0 + \xA9\x98 |0 + \xA9\x99 |0 + \xA9\x9A |0 + \xA9\x9B |0 + \xA9\x9C |0 + \xA9\x9D |0 + \xA9\x9E |0 + \xA9\x9F |0 + \xA9\xA0 |0 + \xA9\xA1 |0 + \xA9\xA2 |0 + \xA9\xA3 |0 + \xA9\xF0 |0 + \xA9\xF1 |0 + \xA9\xF2 |0 + \xA9\xF3 |0 + \xA9\xF4 |0 + \xA9\xF5 |0 + \xA9\xF6 |0 + \xA9\xF7 |0 + \xA9\xF8 |0 + \xA9\xF9 |0 + \xA9\xFA |0 + \xA9\xFB |0 + \xA9\xFC |0 + \xA9\xFD |0 + \xA9\xFE |0 + \xD7\xFA |0 + \xD7\xFB |0 + \xD7\xFC |0 + \xD7\xFD |0 + \xD7\xFE |0 + \xFE\x50 |0 + \xFE\x51 |0 + \xFE\x52 |0 + \xFE\x53 |0 + \xFE\x54 |0 + \xFE\x55 |0 + \xFE\x56 |0 + \xFE\x57 |0 + \xFE\x58 |0 + \xFE\x59 |0 + \xFE\x5A |0 + \xFE\x5B |0 + \xFE\x5C |0 + \xFE\x5D |0 + \xFE\x5E |0 + \xFE\x5F |0 + \xFE\x60 |0 + \xFE\x61 |0 + \xFE\x62 |0 + \xFE\x63 |0 + \xFE\x64 |0 + \xFE\x65 |0 + \xFE\x66 |0 + \xFE\x67 |0 + \xFE\x68 |0 + \xFE\x69 |0 + \xFE\x6A |0 + \xFE\x6B |0 + \xFE\x6C |0 + \xFE\x6D |0 + \xFE\x6E |0 + \xFE\x6F |0 + \xFE\x70 |0 + \xFE\x71 |0 + \xFE\x72 |0 + \xFE\x73 |0 + \xFE\x74 |0 + \xFE\x75 |0 + \xFE\x76 |0 + \xFE\x77 |0 + \xFE\x78 |0 + \xFE\x79 |0 + \xFE\x7A |0 + \xFE\x7B |0 + \xFE\x7C |0 + \xFE\x7D |0 + \xFE\x7E |0 + \xFE\x80 |0 + \xFE\x81 |0 + \xFE\x82 |0 + \xFE\x83 |0 + \xFE\x84 |0 + \xFE\x85 |0 + \xFE\x86 |0 + \xFE\x87 |0 + \xFE\x88 |0 + \xFE\x89 |0 + \xFE\x8A |0 + \xFE\x8B |0 + \xFE\x8C |0 + \xFE\x8D |0 + \xFE\x8E |0 + \xFE\x8F |0 + \xFE\x90 |0 + \xFE\x91 |0 + \xFE\x92 |0 + \xFE\x93 |0 + \xFE\x94 |0 + \xFE\x95 |0 + \xFE\x96 |0 + \xFE\x97 |0 + \xFE\x98 |0 + \xFE\x99 |0 + \xFE\x9A |0 + \xFE\x9B |0 + \xFE\x9C |0 + \xFE\x9D |0 + \xFE\x9E |0 + \xFE\x9F |0 + \xFE\xA0 |0 + \xFF |0 + \xD8\x4D |1 + \xB8\xFC |1 + \xDC\x87 |1 + \xD9\x5A |1 + \xBB\xAC |1 + \xB4\xAE |1 + \xBE\xE4 |1 + \xFD\x94 |1 + \xFD\x94 |1 + \xC6\xF5 |1 + \xBD\xF0 |1 + \xC0\xAE |1 + \xC4\xCE |1 + \x91\xD0 |1 + \xB0\x5D |1 + \xC1\x5F |1 + \xCC\x7D |1 + \xC2\xDD |1 + \xC2\xE3 |1 + \xDF\x89 |1 + \x98\xB7 |1 + \xC2\xE5 |1 + \xC0\xD3 |1 + \xE7\xF3 |1 + \xC2\xE4 |1 + \xC0\xD2 |1 + \xF1\x98 |1 + \x81\x79 |1 + \xC2\xD1 |1 + \x99\xDA |1 + \xA0\x80 |1 + \xCC\x6D |1 + \xFB\x5B |1 + \x8D\xB9 |1 + \x9E\x45 |1 + \xCB\x7B |1 + \xD2\x68 |1 + \xC0\xAD |1 + \xC5\x44 |1 + \xCF\x9E |1 + \xC0\xC8 |1 + \xC0\xCA |1 + \xC0\xCB |1 + \xC0\xC7 |1 + \xFD\x9C |0 + \x81\xED |1 + \xC0\xE4 |1 + \x84\xDA |1 + \x93\xEF |1 + \x99\xA9 |1 + \xA0\x74 |1 + \xB1\x52 |1 + \xC0\xCF |1 + \xCC\x4A |1 + \xCC\x94 |1 + \xC2\xB7 |1 + \xC2\xB6 |1 + \xF4\x94 |1 + \xFA\x98 |1 + \xC2\xB5 |1 + \xB5\x93 |1 + \xBE\x47 |1 + \xC7\x8A |1 + \xE4\x9B |1 + \xC2\xB9 |1 + \xD5\x93 |1 + \x89\xC5 |1 + \xC5\xAA |1 + \xBB\x5C |1 + \xC3\x40 |1 + \xC0\xCE |1 + \xC0\xDA |1 + \xD9\x54 |1 + \xC0\xD7 |1 + \x89\xBE |1 + \x8C\xD2 |1 + \x98\xC7 |1 + \x9C\x49 |1 + \xC2\xA9 |1 + \xC0\xDB |1 + \xBF\x7C |1 + \xC2\xAA |1 + \xC0\xD5 |1 + \xC0\xDF |1 + \x84\x43 |1 + \xC1\xE8 |1 + \xB6\xA0 |1 + \xBE\x63 |1 + \xC1\xE2 |1 + \xC1\xEA |1 + \xD7\x78 |1 + \x92\x82 |1 + \x98\xB7 |1 + \xD6\x5A |1 + \xB5\xA4 |1 + \x8C\x8E |1 + \xC5\xAD |1 + \xC2\xCA |1 + \xAE\x90 |1 + \xB1\xB1 |1 + \xB4\x91 |1 + \xB1\xE3 |1 + \x8F\xCD |1 + \xB2\xBB |1 + \xC3\xDA |1 + \x94\xB5 |1 + \xCB\xF7 |1 + \x85\xA2 |1 + \xC8\xFB |1 + \xCA\xA1 |1 + \xC8\x7E |1 + \xD5\x66 |1 + \x9A\xA2 |1 + \xB3\xBD |1 + \xC9\xF2 |1 + \xCA\xB0 |1 + \xC8\xF4 |1 + \xC2\xD3 |1 + \xC2\xD4 |1 + \xC1\xC1 |1 + \x83\xC9 |1 + \xFD\x9D |0 + \xC1\xBA |1 + \xBC\x5A |1 + \xC1\xBC |1 + \xD5\x8F |1 + \xC1\xBF |1 + \x84\xEE |1 + \x85\xCE |1 + \xC5\xAE |1 + \x8F\x5D |1 + \xC2\xC3 |1 + \x9E\x56 |1 + \xB5\x5A |1 + \xE9\x82 |1 + \xF3\x50 |1 + \xFB\x90 |1 + \xC0\xE8 |1 + \xC1\xA6 |1 + \x95\xD1 |1 + \x9A\x76 |1 + \xDE\x5D |1 + \xC4\xEA |1 + \x91\x7A |1 + \x91\xD9 |1 + \x93\xD3 |1 + \x9D\x69 |1 + \x9F\x92 |1 + \xAD\x49 |1 + \xFD\x9E |0 + \xBE\x9A |1 + \xC2\x93 |1 + \xDD\x82 |1 + \xC9\x8F |1 + \xDF\x42 |1 + \xE5\x80 |1 + \xC1\xD0 |1 + \xC1\xD3 |1 + \xD1\xCA |1 + \xC1\xD2 |1 + \xC1\xD1 |1 + \xD5\x66 |1 + \xC1\xAE |1 + \xC4\xEE |1 + \xC4\xED |1 + \x9A\x9A |1 + \xBA\x9F |1 + \xAB\x43 |1 + \xC1\xEE |1 + \xE0\xF2 |1 + \x8C\x8E |1 + \x8E\x58 |1 + \xC1\xAF |1 + \xC1\xE1 |1 + \xAC\x93 |1 + \xC1\xE7 |1 + \xF1\xF6 |1 + \xE2\x8F |1 + \xC1\xE3 |1 + \xEC\x60 |1 + \xEE\x49 |1 + \xC0\xFD |1 + \xB6\x59 |1 + \xF5\xB7 |1 + \xEB\x60 |1 + \x90\xBA |1 + \xC1\xCB |1 + \xC1\xC5 |1 + \xE5\xBC |1 + \xC4\xF2 |1 + \xC1\xCF |1 + \x98\xB7 |1 + \xC1\xC7 |1 + \xAF\x9F |1 + \xDE\xA4 |1 + \xDF\x7C |1 + \xFD\x88 |1 + \x95\x9E |1 + \xC8\xEE |1 + \x84\xA2 |1 + \x96\x83 |1 + \xC1\xF8 |1 + \xC1\xF7 |1 + \xC1\xEF |1 + \xC1\xF0 |1 + \xC1\xF4 |1 + \xC1\xF2 |1 + \xBC\x7E |1 + \xEE\x90 |1 + \xC1\xF9 |1 + \xC2\xBE |1 + \xEA\x91 |1 + \x82\x90 |1 + \x8D\x91 |1 + \x9C\x53 |1 + \xDD\x86 |1 + \xC2\xC9 |1 + \x90\xFC |1 + \xC0\xF5 |1 + \xC2\xCA |1 + \xC2\xA1 |1 + \xC0\xFB |1 + \xC0\xF4 |1 + \xC2\xC4 |1 + \xD2\xD7 |1 + \xC0\xEE |1 + \xC0\xE6 |1 + \xC4\xE0 |1 + \xC0\xED |1 + \xC1\xA1 |1 + \xEE\xBE |1 + \xFD\x9F |0 + \xD1\x65 |1 + \xC0\xEF |1 + \xEB\x78 |1 + \xC4\xE4 |1 + \xC4\xE7 |1 + \xC1\xDF |1 + \x9F\xFB |1 + \xAD\x55 |1 + \xCC\x41 |1 + \xFD\xA0 |0 + \xF7\x5B |1 + \xF7\xEB |1 + \xC1\xD6 |1 + \xC1\xDC |1 + \xC5\x52 |1 + \xC1\xA2 |1 + \xF3\xD2 |1 + \xC1\xA3 |1 + \xA0\xEE |1 + \xD6\xCB |1 + \xD7\x52 |1 + \xCA\xB2 |1 + \xB2\xE8 |1 + \xB4\xCC |1 + \xC7\xD0 |1 + \xB6\xC8 |1 + \xCD\xD8 |1 + \xCC\xC7 |1 + \xD5\xAC |1 + \xB6\xB4 |1 + \xB1\xA9 |1 + \xDD\x97 |1 + \xD0\xD0 |1 + \xBD\xB5 |1 + \xD2\x8A |1 + \xC0\xAA |1 + \xFE\x40 |0 + \xFE\x41 |0 + \xFE\x42 |0 + \xFE\x43 |0 + \x89\x56 |1 + \xFE\x44 |0 + \xC7\xE7 |1 + \xFE\x45 |0 + \xFE\x46 |0 + \x84\x44 |1 + \xD8\x69 |1 + \xD2\xE6 |1 + \xFE\x47 |0 + \xC9\xF1 |1 + \xCF\xE9 |1 + \xB8\xA3 |1 + \xBE\xB8 |1 + \xBE\xAB |1 + \xD3\xF0 |1 + \xFE\x48 |0 + \xFE\x49 |0 + \xFE\x4A |0 + \xD6\x54 |1 + \xFE\x4B |0 + \xFE\x4C |0 + \xD2\xDD |1 + \xB6\xBC |1 + \xFE\x4D |0 + \xFE\x4E |0 + \xFE\x4F |0 + \xEF\x88 |1 + \xEF\x95 |1 + \xF0\x5E |1 + \xFA\x51 |1 + \xA9\x55 |0 + \xA6\xF2 |0 + \xA6\xF4 |0 + \xA6\xF5 |0 + \xA6\xE0 |0 + \xA6\xE1 |0 + \xA6\xF0 |0 + \xA6\xF1 |0 + \xA6\xE2 |0 + \xA6\xE3 |0 + \xA6\xEE |0 + \xA6\xEF |0 + \xA6\xE6 |0 + \xA6\xE7 |0 + \xA6\xE4 |0 + \xA6\xE5 |0 + \xA6\xE8 |0 + \xA6\xE9 |0 + \xA6\xEA |0 + \xA6\xEB |0 + \xA9\x68 |0 + \xA9\x69 |0 + \xA9\x6A |0 + \xA9\x6B |0 + \xA9\x6C |0 + \xA9\x6D |0 + \xA9\x6E |0 + \xA9\x6F |0 + \xA9\x70 |0 + \xA9\x71 |0 + \xA9\x72 |0 + \xA9\x73 |0 + \xA9\x74 |0 + \xA9\x75 |0 + \xA9\x76 |0 + \xA9\x77 |0 + \xA9\x78 |0 + \xA9\x79 |0 + \xA9\x7A |0 + \xA9\x7B |0 + \xA9\x7C |0 + \xA9\x7D |0 + \xA9\x7E |0 + \xA9\x80 |0 + \xA9\x81 |0 + \xA9\x82 |0 + \xA9\x83 |0 + \xA9\x84 |0 + \xA9\x85 |0 + \xA9\x86 |0 + \xA9\x87 |0 + \xA9\x88 |0 + \xA3\xA1 |0 + \xA3\xA2 |0 + \xA3\xA3 |0 + \xA1\xE7 |0 + \xA3\xA5 |0 + \xA3\xA6 |0 + \xA3\xA7 |0 + \xA3\xA8 |0 + \xA3\xA9 |0 + \xA3\xAA |0 + \xA3\xAB |0 + \xA3\xAC |0 + \xA3\xAD |0 + \xA3\xAE |0 + \xA3\xAF |0 + \xA3\xB0 |0 + \xA3\xB1 |0 + \xA3\xB2 |0 + \xA3\xB3 |0 + \xA3\xB4 |0 + \xA3\xB5 |0 + \xA3\xB6 |0 + \xA3\xB7 |0 + \xA3\xB8 |0 + \xA3\xB9 |0 + \xA3\xBA |0 + \xA3\xBB |0 + \xA3\xBC |0 + \xA3\xBD |0 + \xA3\xBE |0 + \xA3\xBF |0 + \xA3\xC0 |0 + \xA3\xC1 |0 + \xA3\xC2 |0 + \xA3\xC3 |0 + \xA3\xC4 |0 + \xA3\xC5 |0 + \xA3\xC6 |0 + \xA3\xC7 |0 + \xA3\xC8 |0 + \xA3\xC9 |0 + \xA3\xCA |0 + \xA3\xCB |0 + \xA3\xCC |0 + \xA3\xCD |0 + \xA3\xCE |0 + \xA3\xCF |0 + \xA3\xD0 |0 + \xA3\xD1 |0 + \xA3\xD2 |0 + \xA3\xD3 |0 + \xA3\xD4 |0 + \xA3\xD5 |0 + \xA3\xD6 |0 + \xA3\xD7 |0 + \xA3\xD8 |0 + \xA3\xD9 |0 + \xA3\xDA |0 + \xA3\xDB |0 + \xA3\xDC |0 + \xA3\xDD |0 + \xA3\xDE |0 + \xA3\xDF |0 + \xA3\xE0 |0 + \xA3\xE1 |0 + \xA3\xE2 |0 + \xA3\xE3 |0 + \xA3\xE4 |0 + \xA3\xE5 |0 + \xA3\xE6 |0 + \xA3\xE7 |0 + \xA3\xE8 |0 + \xA3\xE9 |0 + \xA3\xEA |0 + \xA3\xEB |0 + \xA3\xEC |0 + \xA3\xED |0 + \xA3\xEE |0 + \xA3\xEF |0 + \xA3\xF0 |0 + \xA3\xF1 |0 + \xA3\xF2 |0 + \xA3\xF3 |0 + \xA3\xF4 |0 + \xA3\xF5 |0 + \xA3\xF6 |0 + \xA3\xF7 |0 + \xA3\xF8 |0 + \xA3\xF9 |0 + \xA3\xFA |0 + \xA3\xFB |0 + \xA3\xFC |0 + \xA3\xFD |0 + \xA1\xAB |0 + \xA1\xE9 |0 + \xA1\xEA |0 + \xA9\x56 |0 + \xA3\xFE |0 + \xA9\x57 |0 + \xA3\xA4 |0 +END CHARMAP diff --git a/icuSources/data/mappings/windows-949-2000.ucm b/icuSources/data/mappings/windows-949-2000.ucm new file mode 100644 index 00000000..290080a4 --- /dev/null +++ b/icuSources/data/mappings/windows-949-2000.ucm @@ -0,0 +1,17808 @@ +# *************************************************************************** +# * +# * Copyright (C) 2001-2003, International Business Machines +# * Corporation and others. All Rights Reserved. +# * +# *************************************************************************** +# +# File created on Dec 03 13:49 Pacific Standard Time 2002 +# +# File created by genmucm tool. +# from windows 2000 using IMultiLanguage 5.50.4522.1800 +# +# Table Version : 1.0 +# The 1st column is the Unicode scalar value. +# The 2nd column is the codepage byte sequence. +# The 3rd column is the fallback indicator. +# The fallback indicator can have one of the following values: +# |0 for exact 1-1 roundtrip mapping +# |1 for the best fallback codepage byte sequence. +# |2 for the substitution character +# |3 for the best reverse fallback Unicode scaler value +# +# Encoding description: Korean +# Encoding name: ks_c_5601-1987 +# + "windows-949-2000" + 2 + 1 + "MBCS" + \x3F + "ASCII" +# Suggested ICU specific alias information +# "windows-949_VPUA" + + 0-80, 81-fe:1, ff + 40-7e, 80-fe + +# build an extension-only (delta) .cnv file +# requires the base .cnv file at runtime + "ibm-1363_P11B-1998" + +# The following was the generated state table. +# This does not account for unassigned characters +# 0-80, 81-fe:1, ff +# 41-5a, 61-7a, 81-fe +# +CHARMAP + \x00 |0 + \x01 |0 + \x02 |0 + \x03 |0 + \x04 |0 + \x05 |0 + \x06 |0 + \x07 |0 + \x08 |0 + \x09 |0 + \x0A |0 + \x0B |0 + \x0C |0 + \x0D |0 + \x0E |0 + \x0F |0 + \x10 |0 + \x11 |0 + \x12 |0 + \x13 |0 + \x14 |0 + \x15 |0 + \x16 |0 + \x17 |0 + \x18 |0 + \x19 |0 + \x1A |0 + \x1B |0 + \x1C |0 + \x1D |0 + \x1E |0 + \x1F |0 + \x20 |0 + \x21 |0 + \x22 |0 + \x23 |0 + \x24 |0 + \x25 |0 + \x26 |0 + \x27 |0 + \x28 |0 + \x29 |0 + \x2A |0 + \x2B |0 + \x2C |0 + \x2D |0 + \x2E |0 + \x2F |0 + \x30 |0 + \x31 |0 + \x32 |0 + \x33 |0 + \x34 |0 + \x35 |0 + \x36 |0 + \x37 |0 + \x38 |0 + \x39 |0 + \x3A |0 + \x3B |0 + \x3C |0 + \x3D |0 + \x3E |0 + \x3F |0 + \x40 |0 + \x41 |0 + \x42 |0 + \x43 |0 + \x44 |0 + \x45 |0 + \x46 |0 + \x47 |0 + \x48 |0 + \x49 |0 + \x4A |0 + \x4B |0 + \x4C |0 + \x4D |0 + \x4E |0 + \x4F |0 + \x50 |0 + \x51 |0 + \x52 |0 + \x53 |0 + \x54 |0 + \x55 |0 + \x56 |0 + \x57 |0 + \x58 |0 + \x59 |0 + \x5A |0 + \x5B |0 + \x5C |0 + \x5D |0 + \x5E |0 + \x5F |0 + \x60 |0 + \x61 |0 + \x62 |0 + \x63 |0 + \x64 |0 + \x65 |0 + \x66 |0 + \x67 |0 + \x68 |0 + \x69 |0 + \x6A |0 + \x6B |0 + \x6C |0 + \x6D |0 + \x6E |0 + \x6F |0 + \x70 |0 + \x71 |0 + \x72 |0 + \x73 |0 + \x74 |0 + \x75 |0 + \x76 |0 + \x77 |0 + \x78 |0 + \x79 |0 + \x7A |0 + \x7B |0 + \x7C |0 + \x7D |0 + \x7E |0 + \x7F |0 + \x80 |0 + \xA2\xAE |0 + \xA1\xCB |1 + \xA1\xCC |1 + \xA2\xB4 |0 + \xA1\xCD |1 + \x7C |1 + \xA1\xD7 |0 + \xA1\xA7 |0 + \xA8\xCF |1 + \xA8\xA3 |0 + \xA1\xEC |1 + \xA1\xFE |1 + \xA1\xA9 |0 + \xA2\xE7 |0 + \xA1\xC6 |0 + \xA1\xBE |0 + \xA9\xF7 |0 + \xA9\xF8 |0 + \xA2\xA5 |0 + \xA5\xEC |1 + \xA2\xD2 |0 + \xA1\xA4 |0 + \xA2\xAC |0 + \xA9\xF6 |0 + \xA8\xAC |0 + \xA1\xED |1 + \xA8\xF9 |0 + \xA8\xF6 |0 + \xA8\xFA |0 + \xA2\xAF |0 + \x41 |1 + \x41 |1 + \x41 |1 + \x41 |1 + \x41 |1 + \x41 |1 + \xA8\xA1 |0 + \x43 |1 + \x45 |1 + \x45 |1 + \x45 |1 + \x45 |1 + \x49 |1 + \x49 |1 + \x49 |1 + \x49 |1 + \xA8\xA2 |0 + \x4E |1 + \x4F |1 + \x4F |1 + \x4F |1 + \x4F |1 + \x4F |1 + \xA1\xBF |0 + \xA8\xAA |0 + \x55 |1 + \x55 |1 + \x55 |1 + \x55 |1 + \x59 |1 + \xA8\xAD |0 + \xA9\xAC |0 + \x61 |1 + \x61 |1 + \x61 |1 + \x61 |1 + \x61 |1 + \x61 |1 + \xA9\xA1 |0 + \x63 |1 + \x65 |1 + \x65 |1 + \x65 |1 + \x65 |1 + \x69 |1 + \x69 |1 + \x69 |1 + \x69 |1 + \xA9\xA3 |0 + \x6E |1 + \x6F |1 + \x6F |1 + \x6F |1 + \x6F |1 + \x6F |1 + \xA1\xC0 |0 + \xA9\xAA |0 + \x75 |1 + \x75 |1 + \x75 |1 + \x75 |1 + \x79 |1 + \xA9\xAD |0 + \x79 |1 + \xA9\xA2 |1 + \xA9\xA2 |0 + \xA8\xA4 |0 + \xA9\xA4 |0 + \xA9\xA5 |0 + \xA8\xA6 |0 + \xA9\xA6 |0 + \xA9\xA7 |0 + \xA8\xA8 |0 + \xA9\xA8 |0 + \xA8\xA9 |0 + \xA9\xA9 |0 + \xA9\xB0 |0 + \xA8\xAF |0 + \xA9\xAF |0 + \xA8\xAB |0 + \xA9\xAB |0 + \xA8\xAE |0 + \xA9\xAE |0 + \xA2\xA7 |0 + \xA2\xB0 |0 + \xA2\xA8 |0 + \xA2\xAB |0 + \xA2\xAA |0 + \xA2\xAD |0 + \xA2\xA9 |0 + \xA5\xC1 |0 + \xA5\xC2 |0 + \xA5\xC3 |0 + \xA5\xC4 |0 + \xA5\xC5 |0 + \xA5\xC6 |0 + \xA5\xC7 |0 + \xA5\xC8 |0 + \xA5\xC9 |0 + \xA5\xCA |0 + \xA5\xCB |0 + \xA5\xCC |0 + \xA5\xCD |0 + \xA5\xCE |0 + \xA5\xCF |0 + \xA5\xD0 |0 + \xA5\xD1 |0 + \xA5\xD2 |0 + \xA5\xD3 |0 + \xA5\xD4 |0 + \xA5\xD5 |0 + \xA5\xD6 |0 + \xA5\xD7 |0 + \xA5\xD8 |0 + \xA5\xE1 |0 + \xA5\xE2 |0 + \xA5\xE3 |0 + \xA5\xE4 |0 + \xA5\xE5 |0 + \xA5\xE6 |0 + \xA5\xE7 |0 + \xA5\xE8 |0 + \xA5\xE9 |0 + \xA5\xEA |0 + \xA5\xEB |0 + \xA5\xEC |0 + \xA5\xED |0 + \xA5\xEE |0 + \xA5\xEF |0 + \xA5\xF0 |0 + \xA5\xF1 |0 + \xA5\xF2 |0 + \xA5\xF3 |0 + \xA5\xF4 |0 + \xA5\xF5 |0 + \xA5\xF6 |0 + \xA5\xF7 |0 + \xA5\xF8 |0 + \xAC\xA7 |0 + \xAC\xA1 |0 + \xAC\xA2 |0 + \xAC\xA3 |0 + \xAC\xA4 |0 + \xAC\xA5 |0 + \xAC\xA6 |0 + \xAC\xA8 |0 + \xAC\xA9 |0 + \xAC\xAA |0 + \xAC\xAB |0 + \xAC\xAC |0 + \xAC\xAD |0 + \xAC\xAE |0 + \xAC\xAF |0 + \xAC\xB0 |0 + \xAC\xB1 |0 + \xAC\xB2 |0 + \xAC\xB3 |0 + \xAC\xB4 |0 + \xAC\xB5 |0 + \xAC\xB6 |0 + \xAC\xB7 |0 + \xAC\xB8 |0 + \xAC\xB9 |0 + \xAC\xBA |0 + \xAC\xBB |0 + \xAC\xBC |0 + \xAC\xBD |0 + \xAC\xBE |0 + \xAC\xBF |0 + \xAC\xC0 |0 + \xAC\xC1 |0 + \xAC\xD1 |0 + \xAC\xD2 |0 + \xAC\xD3 |0 + \xAC\xD4 |0 + \xAC\xD5 |0 + \xAC\xD6 |0 + \xAC\xD8 |0 + \xAC\xD9 |0 + \xAC\xDA |0 + \xAC\xDB |0 + \xAC\xDC |0 + \xAC\xDD |0 + \xAC\xDE |0 + \xAC\xDF |0 + \xAC\xE0 |0 + \xAC\xE1 |0 + \xAC\xE2 |0 + \xAC\xE3 |0 + \xAC\xE4 |0 + \xAC\xE5 |0 + \xAC\xE6 |0 + \xAC\xE7 |0 + \xAC\xE8 |0 + \xAC\xE9 |0 + \xAC\xEA |0 + \xAC\xEB |0 + \xAC\xEC |0 + \xAC\xED |0 + \xAC\xEE |0 + \xAC\xEF |0 + \xAC\xF0 |0 + \xAC\xF1 |0 + \xAC\xD7 |0 + \xA4\xA1 |1 + \xA4\xA2 |1 + \xA4\xA4 |1 + \xA4\xA7 |1 + \xA4\xA8 |1 + \xA4\xA9 |1 + \xA4\xB1 |1 + \xA4\xB2 |1 + \xA4\xB3 |1 + \xA4\xB5 |1 + \xA4\xB6 |1 + \xA4\xB7 |1 + \xA4\xB8 |1 + \xA4\xB9 |1 + \xA4\xBA |1 + \xA4\xBB |1 + \xA4\xBC |1 + \xA4\xBD |1 + \xA4\xBE |1 + \xA4\xD5 |1 + \xA4\xD6 |1 + \xA4\xDD |1 + \xA4\xDE |1 + \xA4\xE1 |1 + \xA4\xE2 |1 + \xA4\xE3 |1 + \xA4\xB4 |1 + \xA4\xE4 |1 + \xA4\xE5 |1 + \xA4\xE6 |1 + \xA4\xE7 |1 + \xA4\xE8 |1 + \xA4\xE9 |1 + \xA4\xEA |1 + \xA4\xEB |1 + \xA4\xEC |1 + \xA4\xED |1 + \xA4\xEE |1 + \xA4\xB5 |1 + \xA4\xB6 |1 + \xA4\xB5 |1 + \xA4\xB6 |1 + \xA4\xEF |1 + \xA4\xF2 |1 + \xA4\xF3 |1 + \xA4\xF0 |1 + \xA4\xB7 |1 + \xA4\xB8 |1 + \xA4\xB9 |1 + \xA4\xB8 |1 + \xA4\xB9 |1 + \xA4\xBA |1 + \xA4\xBA |1 + \xA4\xF4 |1 + \xA4\xF5 |1 + \xA4\xF6 |1 + \xA4\xD4 |1 + \xA4\xBF |1 + \xA4\xC0 |1 + \xA4\xC1 |1 + \xA4\xC2 |1 + \xA4\xC3 |1 + \xA4\xC4 |1 + \xA4\xC5 |1 + \xA4\xC6 |1 + \xA4\xC7 |1 + \xA4\xC8 |1 + \xA4\xC9 |1 + \xA4\xCA |1 + \xA4\xCB |1 + \xA4\xCC |1 + \xA4\xCD |1 + \xA4\xCE |1 + \xA4\xCF |1 + \xA4\xD0 |1 + \xA4\xD1 |1 + \xA4\xD2 |1 + \xA4\xD3 |1 + \xA4\xF7 |1 + \xA4\xF8 |1 + \xA4\xF9 |1 + \xA4\xFA |1 + \xA4\xFB |1 + \xA4\xFC |1 + \xA4\xFD |1 + \xA4\xFE |1 + \xA4\xA1 |1 + \xA4\xA2 |1 + \xA4\xA3 |1 + \xA4\xA4 |1 + \xA4\xA5 |1 + \xA4\xA6 |1 + \xA4\xA7 |1 + \xA4\xA9 |1 + \xA4\xAA |1 + \xA4\xAB |1 + \xA4\xAC |1 + \xA4\xAD |1 + \xA4\xAE |1 + \xA4\xAF |1 + \xA4\xB0 |1 + \xA4\xB1 |1 + \xA4\xB2 |1 + \xA4\xB4 |1 + \xA4\xB5 |1 + \xA4\xB6 |1 + \xA4\xB7 |1 + \xA4\xB8 |1 + \xA4\xBA |1 + \xA4\xBB |1 + \xA4\xBC |1 + \xA4\xBD |1 + \xA4\xBE |1 + \xA4\xD6 |1 + \xA4\xD7 |1 + \xA4\xD8 |1 + \xA4\xD9 |1 + \xA4\xDA |1 + \xA4\xDB |1 + \xA4\xDC |1 + \xA4\xDD |1 + \xA4\xDE |1 + \xA4\xDF |1 + \xA4\xE0 |1 + \xA4\xE8 |1 + \xA4\xEA |1 + \xA4\xEC |1 + \xA4\xED |1 + \xA4\xEF |1 + \xA4\xF0 |1 + \xA4\xB7 |1 + \xA4\xF2 |1 + \xA4\xF3 |1 + \xA4\xF4 |1 + \xA4\xF6 |1 + \xA1\xAA |0 + \xA1\xAE |0 + \xA1\xAF |0 + \xA1\xB0 |0 + \xA1\xB1 |0 + \xA2\xD3 |0 + \xA2\xD4 |0 + \xA1\xA5 |0 + \xA1\xA6 |0 + \xA2\xB6 |0 + \xA1\xC7 |0 + \xA1\xC8 |0 + \xA1\xD8 |0 + \xA9\xF9 |0 + \xA9\xFA |0 + \xA9\xFB |0 + \xA9\xFC |0 + \xA9\xFD |0 + \xA9\xFE |0 + \x5C |1 + \xA2\xE6 |0 + \xA1\xC9 |0 + \xA2\xB5 |0 + \xA7\xA4 |0 + \xA2\xE0 |0 + \xA2\xE5 |0 + \xA2\xE2 |0 + \xA7\xD9 |0 + \xA1\xCA |0 + \xA8\xF7 |0 + \xA8\xF8 |0 + \xA8\xFB |0 + \xA8\xFC |0 + \xA8\xFD |0 + \xA8\xFE |0 + \xA5\xB0 |0 + \xA5\xB1 |0 + \xA5\xB2 |0 + \xA5\xB3 |0 + \xA5\xB4 |0 + \xA5\xB5 |0 + \xA5\xB6 |0 + \xA5\xB7 |0 + \xA5\xB8 |0 + \xA5\xB9 |0 + \xA5\xA1 |0 + \xA5\xA2 |0 + \xA5\xA3 |0 + \xA5\xA4 |0 + \xA5\xA5 |0 + \xA5\xA6 |0 + \xA5\xA7 |0 + \xA5\xA8 |0 + \xA5\xA9 |0 + \xA5\xAA |0 + \xA1\xE7 |0 + \xA1\xE8 |0 + \xA1\xE6 |0 + \xA1\xE9 |0 + \xA1\xEA |0 + \xA2\xD5 |0 + \xA2\xD8 |0 + \xA2\xD6 |0 + \xA2\xD9 |0 + \xA2\xD7 |0 + \xA2\xA1 |0 + \xA2\xA2 |0 + \xA2\xA3 |0 + \xA1\xD3 |0 + \xA2\xA4 |0 + \xA1\xD4 |0 + \xA1\xF4 |0 + \xA1\xF5 |0 + \xA2\xB3 |0 + \xA2\xB2 |0 + \xA1\xEE |0 + \xA1\xF0 |0 + \xA1\xC4 |0 + \xA1\xD0 |0 + \xA1\xAB |0 + \xA1\xFC |0 + \xA1\xFD |0 + \xA1\xFB |0 + \xA1\xFA |0 + \xA1\xF2 |0 + \xA1\xF3 |0 + \xA2\xB1 |0 + \xA1\xC5 |0 + \xA1\xF1 |0 + \xA1\xAD |0 + \xA1\xEF |0 + \xA1\xD6 |0 + \xA1\xC1 |0 + \xA1\xD5 |0 + \xA1\xC2 |0 + \xA1\xC3 |0 + \xA1\xEC |0 + \xA1\xED |0 + \xA1\xF8 |0 + \xA1\xF9 |0 + \xA1\xF6 |0 + \xA1\xF7 |0 + \xA2\xC1 |0 + \xA1\xD1 |0 + \xA1\xD2 |0 + \xA8\xE7 |0 + \xA8\xE8 |0 + \xA8\xE9 |0 + \xA8\xEA |0 + \xA8\xEB |0 + \xA8\xEC |0 + \xA8\xED |0 + \xA8\xEE |0 + \xA8\xEF |0 + \xA8\xF0 |0 + \xA8\xF1 |0 + \xA8\xF2 |0 + \xA8\xF3 |0 + \xA8\xF4 |0 + \xA8\xF5 |0 + \xA9\xE7 |0 + \xA9\xE8 |0 + \xA9\xE9 |0 + \xA9\xEA |0 + \xA9\xEB |0 + \xA9\xEC |0 + \xA9\xED |0 + \xA9\xEE |0 + \xA9\xEF |0 + \xA9\xF0 |0 + \xA9\xF1 |0 + \xA9\xF2 |0 + \xA9\xF3 |0 + \xA9\xF4 |0 + \xA9\xF5 |0 + \xA9\xCD |0 + \xA9\xCE |0 + \xA9\xCF |0 + \xA9\xD0 |0 + \xA9\xD1 |0 + \xA9\xD2 |0 + \xA9\xD3 |0 + \xA9\xD4 |0 + \xA9\xD5 |0 + \xA9\xD6 |0 + \xA9\xD7 |0 + \xA9\xD8 |0 + \xA9\xD9 |0 + \xA9\xDA |0 + \xA9\xDB |0 + \xA9\xDC |0 + \xA9\xDD |0 + \xA9\xDE |0 + \xA9\xDF |0 + \xA9\xE0 |0 + \xA9\xE1 |0 + \xA9\xE2 |0 + \xA9\xE3 |0 + \xA9\xE4 |0 + \xA9\xE5 |0 + \xA9\xE6 |0 + \xA8\xCD |1 + \xA8\xCE |1 + \xA8\xCF |1 + \xA8\xD0 |1 + \xA8\xD1 |1 + \xA8\xD2 |1 + \xA8\xD3 |1 + \xA8\xD4 |1 + \xA8\xD5 |1 + \xA8\xD6 |1 + \xA8\xD7 |1 + \xA8\xD8 |1 + \xA8\xD9 |1 + \xA8\xDA |1 + \xA8\xDB |1 + \xA8\xDC |1 + \xA8\xDD |1 + \xA8\xDE |1 + \xA8\xDF |1 + \xA8\xE0 |1 + \xA8\xE1 |1 + \xA8\xE2 |1 + \xA8\xE3 |1 + \xA8\xE4 |1 + \xA8\xE5 |1 + \xA8\xE6 |1 + \xA8\xCD |0 + \xA8\xCE |0 + \xA8\xCF |0 + \xA8\xD0 |0 + \xA8\xD1 |0 + \xA8\xD2 |0 + \xA8\xD3 |0 + \xA8\xD4 |0 + \xA8\xD5 |0 + \xA8\xD6 |0 + \xA8\xD7 |0 + \xA8\xD8 |0 + \xA8\xD9 |0 + \xA8\xDA |0 + \xA8\xDB |0 + \xA8\xDC |0 + \xA8\xDD |0 + \xA8\xDE |0 + \xA8\xDF |0 + \xA8\xE0 |0 + \xA8\xE1 |0 + \xA8\xE2 |0 + \xA8\xE3 |0 + \xA8\xE4 |0 + \xA8\xE5 |0 + \xA8\xE6 |0 + \xA6\xA1 |0 + \xA6\xAC |0 + \xA6\xA2 |0 + \xA6\xAD |0 + \xA6\xA3 |0 + \xA6\xC8 |0 + \xA6\xC7 |0 + \xA6\xAE |0 + \xA6\xA4 |0 + \xA6\xC2 |0 + \xA6\xC1 |0 + \xA6\xAF |0 + \xA6\xA6 |0 + \xA6\xC6 |0 + \xA6\xC5 |0 + \xA6\xB1 |0 + \xA6\xA5 |0 + \xA6\xC4 |0 + \xA6\xC3 |0 + \xA6\xB0 |0 + \xA6\xA7 |0 + \xA6\xBC |0 + \xA6\xC9 |0 + \xA6\xCA |0 + \xA6\xB7 |0 + \xA6\xCB |0 + \xA6\xCC |0 + \xA6\xB2 |0 + \xA6\xA9 |0 + \xA6\xBE |0 + \xA6\xCD |0 + \xA6\xCE |0 + \xA6\xB9 |0 + \xA6\xCF |0 + \xA6\xD0 |0 + \xA6\xB4 |0 + \xA6\xA8 |0 + \xA6\xD1 |0 + \xA6\xD2 |0 + \xA6\xB8 |0 + \xA6\xBD |0 + \xA6\xD3 |0 + \xA6\xD4 |0 + \xA6\xB3 |0 + \xA6\xAA |0 + \xA6\xD5 |0 + \xA6\xD6 |0 + \xA6\xBA |0 + \xA6\xBF |0 + \xA6\xD7 |0 + \xA6\xD8 |0 + \xA6\xB5 |0 + \xA6\xAB |0 + \xA6\xD9 |0 + \xA6\xDA |0 + \xA6\xBB |0 + \xA6\xDB |0 + \xA6\xDC |0 + \xA6\xC0 |0 + \xA6\xDD |0 + \xA6\xDE |0 + \xA6\xDF |0 + \xA6\xE0 |0 + \xA6\xE1 |0 + \xA6\xE2 |0 + \xA6\xE3 |0 + \xA6\xE4 |0 + \xA6\xB6 |0 + \xA2\xC6 |0 + \xA1\xE1 |0 + \xA1\xE0 |0 + \xA2\xC3 |0 + \xA2\xC7 |0 + \xA2\xC8 |0 + \xA2\xCB |0 + \xA2\xCA |0 + \xA2\xC9 |0 + \xA2\xCC |0 + \xA1\xE3 |0 + \xA1\xE2 |0 + \xA2\xBA |0 + \xA2\xB9 |0 + \xA1\xE5 |0 + \xA1\xE4 |0 + \xA2\xB8 |0 + \xA2\xB7 |0 + \xA1\xDF |0 + \xA1\xDE |0 + \xA2\xC2 |0 + \xA1\xDB |0 + \xA1\xDD |0 + \xA1\xDC |0 + \xA2\xC4 |0 + \xA2\xC5 |0 + \xA1\xDA |0 + \xA1\xD9 |0 + \xA2\xCF |0 + \xA2\xCE |0 + \xA2\xD0 |0 + \xA2\xD1 |0 + \xA1\xCF |0 + \xA1\xCE |0 + \xA2\xBC |0 + \xA2\xBD |0 + \xA2\xC0 |0 + \xA2\xBB |0 + \xA2\xBE |0 + \xA2\xBF |0 + \xA2\xCD |0 + \xA2\xDB |0 + \xA2\xDC |0 + \xA2\xDD |0 + \xA2\xDA |0 + \xA1\xA1 |0 + \xA1\xA2 |0 + \xA1\xA3 |0 + \xA1\xA8 |0 + \xA1\xB4 |0 + \xA1\xB5 |0 + \xA1\xB6 |0 + \xA1\xB7 |0 + \xA1\xB8 |0 + \xA1\xB9 |0 + \xA1\xBA |0 + \xA1\xBB |0 + \xA1\xBC |0 + \xA1\xBD |0 + \xA1\xEB |0 + \xA1\xB2 |0 + \xA1\xB3 |0 + \xAA\xA1 |0 + \xAA\xA2 |0 + \xAA\xA3 |0 + \xAA\xA4 |0 + \xAA\xA5 |0 + \xAA\xA6 |0 + \xAA\xA7 |0 + \xAA\xA8 |0 + \xAA\xA9 |0 + \xAA\xAA |0 + \xAA\xAB |0 + \xAA\xAC |0 + \xAA\xAD |0 + \xAA\xAE |0 + \xAA\xAF |0 + \xAA\xB0 |0 + \xAA\xB1 |0 + \xAA\xB2 |0 + \xAA\xB3 |0 + \xAA\xB4 |0 + \xAA\xB5 |0 + \xAA\xB6 |0 + \xAA\xB7 |0 + \xAA\xB8 |0 + \xAA\xB9 |0 + \xAA\xBA |0 + \xAA\xBB |0 + \xAA\xBC |0 + \xAA\xBD |0 + \xAA\xBE |0 + \xAA\xBF |0 + \xAA\xC0 |0 + \xAA\xC1 |0 + \xAA\xC2 |0 + \xAA\xC3 |0 + \xAA\xC4 |0 + \xAA\xC5 |0 + \xAA\xC6 |0 + \xAA\xC7 |0 + \xAA\xC8 |0 + \xAA\xC9 |0 + \xAA\xCA |0 + \xAA\xCB |0 + \xAA\xCC |0 + \xAA\xCD |0 + \xAA\xCE |0 + \xAA\xCF |0 + \xAA\xD0 |0 + \xAA\xD1 |0 + \xAA\xD2 |0 + \xAA\xD3 |0 + \xAA\xD4 |0 + \xAA\xD5 |0 + \xAA\xD6 |0 + \xAA\xD7 |0 + \xAA\xD8 |0 + \xAA\xD9 |0 + \xAA\xDA |0 + \xAA\xDB |0 + \xAA\xDC |0 + \xAA\xDD |0 + \xAA\xDE |0 + \xAA\xDF |0 + \xAA\xE0 |0 + \xAA\xE1 |0 + \xAA\xE2 |0 + \xAA\xE3 |0 + \xAA\xE4 |0 + \xAA\xE5 |0 + \xAA\xE6 |0 + \xAA\xE7 |0 + \xAA\xE8 |0 + \xAA\xE9 |0 + \xAA\xEA |0 + \xAA\xEB |0 + \xAA\xEC |0 + \xAA\xED |0 + \xAA\xEE |0 + \xAA\xEF |0 + \xAA\xF0 |0 + \xAA\xF1 |0 + \xAA\xF2 |0 + \xAA\xF3 |0 + \xAB\xA1 |0 + \xAB\xA2 |0 + \xAB\xA3 |0 + \xAB\xA4 |0 + \xAB\xA5 |0 + \xAB\xA6 |0 + \xAB\xA7 |0 + \xAB\xA8 |0 + \xAB\xA9 |0 + \xAB\xAA |0 + \xAB\xAB |0 + \xAB\xAC |0 + \xAB\xAD |0 + \xAB\xAE |0 + \xAB\xAF |0 + \xAB\xB0 |0 + \xAB\xB1 |0 + \xAB\xB2 |0 + \xAB\xB3 |0 + \xAB\xB4 |0 + \xAB\xB5 |0 + \xAB\xB6 |0 + \xAB\xB7 |0 + \xAB\xB8 |0 + \xAB\xB9 |0 + \xAB\xBA |0 + \xAB\xBB |0 + \xAB\xBC |0 + \xAB\xBD |0 + \xAB\xBE |0 + \xAB\xBF |0 + \xAB\xC0 |0 + \xAB\xC1 |0 + \xAB\xC2 |0 + \xAB\xC3 |0 + \xAB\xC4 |0 + \xAB\xC5 |0 + \xAB\xC6 |0 + \xAB\xC7 |0 + \xAB\xC8 |0 + \xAB\xC9 |0 + \xAB\xCA |0 + \xAB\xCB |0 + \xAB\xCC |0 + \xAB\xCD |0 + \xAB\xCE |0 + \xAB\xCF |0 + \xAB\xD0 |0 + \xAB\xD1 |0 + \xAB\xD2 |0 + \xAB\xD3 |0 + \xAB\xD4 |0 + \xAB\xD5 |0 + \xAB\xD6 |0 + \xAB\xD7 |0 + \xAB\xD8 |0 + \xAB\xD9 |0 + \xAB\xDA |0 + \xAB\xDB |0 + \xAB\xDC |0 + \xAB\xDD |0 + \xAB\xDE |0 + \xAB\xDF |0 + \xAB\xE0 |0 + \xAB\xE1 |0 + \xAB\xE2 |0 + \xAB\xE3 |0 + \xAB\xE4 |0 + \xAB\xE5 |0 + \xAB\xE6 |0 + \xAB\xE7 |0 + \xAB\xE8 |0 + \xAB\xE9 |0 + \xAB\xEA |0 + \xAB\xEB |0 + \xAB\xEC |0 + \xAB\xED |0 + \xAB\xEE |0 + \xAB\xEF |0 + \xAB\xF0 |0 + \xAB\xF1 |0 + \xAB\xF2 |0 + \xAB\xF3 |0 + \xAB\xF4 |0 + \xAB\xF5 |0 + \xAB\xF6 |0 + \xA4\xA1 |0 + \xA4\xA2 |0 + \xA4\xA3 |0 + \xA4\xA4 |0 + \xA4\xA5 |0 + \xA4\xA6 |0 + \xA4\xA7 |0 + \xA4\xA8 |0 + \xA4\xA9 |0 + \xA4\xAA |0 + \xA4\xAB |0 + \xA4\xAC |0 + \xA4\xAD |0 + \xA4\xAE |0 + \xA4\xAF |0 + \xA4\xB0 |0 + \xA4\xB1 |0 + \xA4\xB2 |0 + \xA4\xB3 |0 + \xA4\xB4 |0 + \xA4\xB5 |0 + \xA4\xB6 |0 + \xA4\xB7 |0 + \xA4\xB8 |0 + \xA4\xB9 |0 + \xA4\xBA |0 + \xA4\xBB |0 + \xA4\xBC |0 + \xA4\xBD |0 + \xA4\xBE |0 + \xA4\xBF |0 + \xA4\xC0 |0 + \xA4\xC1 |0 + \xA4\xC2 |0 + \xA4\xC3 |0 + \xA4\xC4 |0 + \xA4\xC5 |0 + \xA4\xC6 |0 + \xA4\xC7 |0 + \xA4\xC8 |0 + \xA4\xC9 |0 + \xA4\xCA |0 + \xA4\xCB |0 + \xA4\xCC |0 + \xA4\xCD |0 + \xA4\xCE |0 + \xA4\xCF |0 + \xA4\xD0 |0 + \xA4\xD1 |0 + \xA4\xD2 |0 + \xA4\xD3 |0 + \xA4\xD4 |0 + \xA4\xD5 |0 + \xA4\xD6 |0 + \xA4\xD7 |0 + \xA4\xD8 |0 + \xA4\xD9 |0 + \xA4\xDA |0 + \xA4\xDB |0 + \xA4\xDC |0 + \xA4\xDD |0 + \xA4\xDE |0 + \xA4\xDF |0 + \xA4\xE0 |0 + \xA4\xE1 |0 + \xA4\xE2 |0 + \xA4\xE3 |0 + \xA4\xE4 |0 + \xA4\xE5 |0 + \xA4\xE6 |0 + \xA4\xE7 |0 + \xA4\xE8 |0 + \xA4\xE9 |0 + \xA4\xEA |0 + \xA4\xEB |0 + \xA4\xEC |0 + \xA4\xED |0 + \xA4\xEE |0 + \xA4\xEF |0 + \xA4\xF0 |0 + \xA4\xF1 |0 + \xA4\xF2 |0 + \xA4\xF3 |0 + \xA4\xF4 |0 + \xA4\xF5 |0 + \xA4\xF6 |0 + \xA4\xF7 |0 + \xA4\xF8 |0 + \xA4\xF9 |0 + \xA4\xFA |0 + \xA4\xFB |0 + \xA4\xFC |0 + \xA4\xFD |0 + \xA4\xFE |0 + \xEC\xE9 |1 + \xEC\xA3 |1 + \xDF\xB2 |1 + \xDE\xCC |1 + \xDF\xBE |1 + \xF1\xE9 |1 + \xF9\xBB |1 + \xCB\xA3 |1 + \xEB\xE0 |1 + \xDC\xB0 |1 + \xEF\xCB |1 + \xF4\xB8 |1 + \xF2\xA2 |1 + \xEC\xD1 |1 + \xA9\xB1 |0 + \xA9\xB2 |0 + \xA9\xB3 |0 + \xA9\xB4 |0 + \xA9\xB5 |0 + \xA9\xB6 |0 + \xA9\xB7 |0 + \xA9\xB8 |0 + \xA9\xB9 |0 + \xA9\xBA |0 + \xA9\xBB |0 + \xA9\xBC |0 + \xA9\xBD |0 + \xA9\xBE |0 + \xA9\xBF |0 + \xA9\xC0 |0 + \xA9\xC1 |0 + \xA9\xC2 |0 + \xA9\xC3 |0 + \xA9\xC4 |0 + \xA9\xC5 |0 + \xA9\xC6 |0 + \xA9\xC7 |0 + \xA9\xC8 |0 + \xA9\xC9 |0 + \xA9\xCA |0 + \xA9\xCB |0 + \xA9\xCC |0 + \xA2\xDF |0 + \xEC\xE9 |1 + \xEC\xA3 |1 + \xDF\xB2 |1 + \xDE\xCC |1 + \xE7\xE9 |1 + \xD7\xBF |1 + \xF6\xD2 |1 + \xF8\xA2 |1 + \xCE\xFA |1 + \xE4\xA8 |1 + \xEA\xC5 |1 + \xFB\xFD |1 + \xE2\xA9 |1 + \xD9\xCA |1 + \xD1\xD1 |1 + \xF7\xCF |1 + \xEC\xED |1 + \xF1\xBB |1 + \xEA\xF3 |1 + \xDE\xE4 |1 + \xD9\xA3 |1 + \xF7\xE5 |1 + \xEE\xAF |1 + \xF5\xE6 |1 + \xD6\xCC |1 + \xD3\xDB |1 + \xFB\xBC |1 + \xF9\xCA |1 + \xCA\xF8 |1 + \xD0\xEA |1 + \xED\xC0 |1 + \xFA\xF0 |1 + \xF0\xAE |1 + \xFD\xCC |1 + \xED\xBB |1 + \xF2\xB8 |1 + \xA8\xB1 |0 + \xA8\xB2 |0 + \xA8\xB3 |0 + \xA8\xB4 |0 + \xA8\xB5 |0 + \xA8\xB6 |0 + \xA8\xB7 |0 + \xA8\xB8 |0 + \xA8\xB9 |0 + \xA8\xBA |0 + \xA8\xBB |0 + \xA8\xBC |0 + \xA8\xBD |0 + \xA8\xBE |0 + \xA8\xBF |0 + \xA8\xC0 |0 + \xA8\xC1 |0 + \xA8\xC2 |0 + \xA8\xC3 |0 + \xA8\xC4 |0 + \xA8\xC5 |0 + \xA8\xC6 |0 + \xA8\xC7 |0 + \xA8\xC8 |0 + \xA8\xC9 |0 + \xA8\xCA |0 + \xA8\xCB |0 + \xA8\xCC |0 + \xA2\xDE |0 + \xEC\xE9 |1 + \xEC\xA3 |1 + \xDF\xB2 |1 + \xDE\xCC |1 + \xE7\xE9 |1 + \xD7\xBF |1 + \xF6\xD2 |1 + \xF8\xA2 |1 + \xCE\xFA |1 + \xE4\xA8 |1 + \xEA\xC5 |1 + \xFB\xFD |1 + \xE2\xA9 |1 + \xD9\xCA |1 + \xD1\xD1 |1 + \xF7\xCF |1 + \xEC\xED |1 + \xF1\xBB |1 + \xEA\xF3 |1 + \xDE\xE4 |1 + \xD9\xA3 |1 + \xF7\xE5 |1 + \xEE\xAF |1 + \xF5\xE6 |1 + \xD6\xCC |1 + \xDD\xFA |1 + \xD1\xFB |1 + \xD2\xB3 |1 + \xEE\xEA |1 + \xE9\xD0 |1 + \xEC\xD4 |1 + \xF1\xBC |1 + \xFA\xA3 |1 + \xFD\xCC |1 + \xDE\xD0 |1 + \xEF\xE1 |1 + \xDF\xBE |1 + \xF1\xE9 |1 + \xF9\xBB |1 + \xF1\xA7 |1 + \xE9\xD3 |1 + \xEC\xA2 |1 + \xF0\xF3 |1 + \xF9\xCA |1 + \xCA\xF8 |1 + \xD0\xEA |1 + \xED\xC0 |1 + \xFA\xF0 |1 + \xE5\xA8 |1 + \xA7\xC9 |0 + \xA7\xCA |0 + \xA7\xCB |0 + \xA7\xCC |0 + \xA7\xCD |0 + \xA7\xBA |0 + \xA7\xBB |0 + \xA7\xDC |0 + \xA7\xDD |0 + \xA7\xDE |0 + \xA7\xB6 |0 + \xA7\xB7 |0 + \xA7\xB8 |0 + \xA7\xD4 |0 + \xA7\xD5 |0 + \xA7\xD6 |0 + \xA7\xD7 |0 + \xA7\xD8 |0 + \xA7\xA1 |0 + \xA7\xA2 |0 + \xA7\xA3 |0 + \xA7\xA5 |0 + \xA7\xAB |0 + \xA7\xAC |0 + \xA7\xAD |0 + \xA7\xAE |0 + \xA7\xAF |0 + \xA7\xB0 |0 + \xA7\xB1 |0 + \xA7\xB2 |0 + \xA7\xB3 |0 + \xA7\xB4 |0 + \xA7\xA7 |0 + \xA7\xA8 |0 + \xA7\xA9 |0 + \xA7\xAA |0 + \xA7\xBD |0 + \xA7\xBE |0 + \xA7\xE5 |0 + \xA7\xE6 |0 + \xA7\xE7 |0 + \xA7\xE8 |0 + \xA7\xE1 |0 + \xA7\xE2 |0 + \xA7\xE3 |0 + \xA7\xBF |0 + \xA7\xC0 |0 + \xA7\xC1 |0 + \xA7\xC2 |0 + \xA7\xC3 |0 + \xA7\xC4 |0 + \xA7\xC5 |0 + \xA7\xC6 |0 + \xA7\xC7 |0 + \xA7\xC8 |0 + \xA7\xCE |0 + \xA7\xCF |0 + \xA7\xD0 |0 + \xA7\xD1 |0 + \xA7\xD2 |0 + \xA7\xD3 |0 + \xA7\xDA |0 + \xA7\xDB |0 + \xA2\xE3 |0 + \xA7\xEC |0 + \xA7\xA6 |0 + \xA7\xE0 |0 + \xA7\xEF |0 + \xA2\xE1 |0 + \xA7\xBC |0 + \xA7\xED |0 + \xA7\xB5 |0 + \xA7\xB9 |0 + \xA7\xEA |0 + \xA7\xEB |0 + \xA7\xDF |0 + \xA2\xE4 |0 + \xA7\xE4 |0 + \xA7\xEE |0 + \xA7\xE9 |0 + \xEC\xE9 |0 + \xEF\xCB |0 + \xF6\xD2 |0 + \xD8\xB2 |0 + \xED\xDB |0 + \xDF\xB2 |0 + \xDF\xBE |0 + \xF9\xBB |0 + \xDC\xF4 |0 + \xF5\xE4 |0 + \xF3\xA6 |0 + \xDD\xE0 |0 + \xE1\xA6 |0 + \xCE\xF8 |0 + \xDC\xB0 |0 + \xE3\xAA |0 + \xF1\xE9 |0 + \xCD\xFA |0 + \xFC\xAF |0 + \xD3\xA1 |0 + \xF1\xAB |0 + \xE7\xD1 |0 + \xD2\xAC |0 + \xCE\xF9 |0 + \xF1\xFD |0 + \xDE\xBF |0 + \xFB\xBA |0 + \xF9\xB9 |0 + \xCE\xD2 |0 + \xE3\xAB |0 + \xEB\xE0 |0 + \xCE\xFA |0 + \xCB\xF7 |0 + \xE5\xA5 |0 + \xCA\xE1 |0 + \xD4\xCC |0 + \xEA\xE1 |0 + \xDC\xE3 |0 + \xDF\xAD |0 + \xCB\xEB |0 + \xD5\xAF |0 + \xD6\xF5 |0 + \xE5\xF8 |0 + \xDE\xC0 |0 + \xEC\xA3 |0 + \xE9\xCD |0 + \xEA\xA7 |0 + \xE9\xF6 |0 + \xFB\xBB |0 + \xE7\xE9 |0 + \xEF\xCC |0 + \xD0\xE6 |0 + \xDE\xC1 |0 + \xE4\xAC |0 + \xD8\xCC |0 + \xF9\xF1 |0 + \xCE\xDF |0 + \xFA\xA4 |0 + \xE6\xB2 |0 + \xFA\xFB |0 + \xFA\xBD |0 + \xCC\xC8 |0 + \xEF\xCD |0 + \xD5\xD5 |0 + \xD3\xA2 |0 + \xEC\xD1 |0 + \xE4\xA7 |0 + \xEC\xD2 |0 + \xF6\xB1 |0 + \xCE\xFB |0 + \xD0\xD1 |0 + \xCB\xBF |0 + \xED\xA4 |0 + \xED\xA8 |0 + \xDE\xC2 |0 + \xF6\xE2 |0 + \xED\xDC |0 + \xDC\xF5 |0 + \xE0\xB9 |0 + \xD4\xCE |0 + \xF4\xB5 |0 + \xD3\xDB |0 + \xD6\xB5 |0 + \xEC\xA4 |0 + \xE4\xE6 |0 + \xF1\xEA |0 + \xCB\xEC |0 + \xCB\xC0 |0 + \xEC\xF2 |0 + \xD0\xEA |0 + \xF9\xF2 |0 + \xEC\xA5 |0 + \xD0\xDF |0 + \xE7\xEA |0 + \xD0\xEB |0 + \xDC\xD1 |0 + \xDB\xE9 |0 + \xFD\xCC |0 + \xDB\xD7 |0 + \xDA\xE1 |0 + \xD6\xB6 |0 + \xE3\xDF |0 + \xDE\xC3 |0 + \xDE\xC4 |0 + \xCA\xA1 |0 + \xEE\xEC |0 + \xD3\xA3 |0 + \xEE\xB7 |0 + \xF8\xCF |0 + \xEA\xC8 |0 + \xEE\xB8 |0 + \xF1\xAC |0 + \xF1\xA5 |0 + \xE9\xCE |0 + \xF9\xBC |0 + \xE5\xF9 |0 + \xEC\xEA |0 + \xDD\xD6 |0 + \xED\xC2 |0 + \xF8\xA5 |0 + \xE5\xBA |0 + \xDB\xD8 |0 + \xCA\xA2 |0 + \xD1\xCD |0 + \xEE\xED |0 + \xEC\xEB |0 + \xDE\xC5 |0 + \xE3\xE0 |0 + \xCA\xC9 |0 + \xF2\xE9 |0 + \xD5\xCE |0 + \xF6\xB6 |0 + \xCE\xC2 |0 + \xD6\xC7 |0 + \xE3\xB4 |0 + \xF1\xAD |0 + \xEA\xE2 |0 + \xD7\xC2 |0 + \xF3\xA7 |0 + \xCD\xEA |0 + \xEB\xEE |0 + \xD9\xB2 |0 + \xFD\xA5 |0 + \xF6\xD5 |0 + \xD5\xE2 |0 + \xF8\xB5 |0 + \xCC\xF5 |0 + \xF5\xB5 |0 + \xE4\xAD |0 + \xE7\xEB |0 + \xF1\xD5 |0 + \xF0\xBB |0 + \xE9\xB5 |0 + \xCC\xC9 |0 + \xFA\xD5 |0 + \xE1\xD4 |0 + \xD7\xD6 |0 + \xDC\xC1 |0 + \xDE\xC6 |0 + \xFA\xEF |0 + \xE3\xE1 |0 + \xE1\xF3 |0 + \xDC\xF6 |0 + \xCE\xFC |0 + \xDB\xC4 |0 + \xF8\xF1 |0 + \xDC\xE4 |0 + \xE5\xEF |0 + \xDC\xB1 |0 + \xD5\xD6 |0 + \xF3\xDA |0 + \xCB\xC1 |0 + \xDB\xC3 |0 + \xD9\xFA |0 + \xD3\xEE |0 + \xFA\xB8 |0 + \xFD\xA6 |0 + \xEB\xEF |0 + \xF4\xA6 |0 + \xCC\xCA |0 + \xF3\xA8 |0 + \xF3\xDB |0 + \xDB\xA7 |0 + \xF6\xB7 |0 + \xCF\xE6 |0 + \xF0\xF2 |0 + \xCB\xDA |0 + \xE7\xD2 |0 + \xD7\xC3 |0 + \xF6\xF0 |0 + \xE8\xDE |0 + \xE5\xA6 |0 + \xE5\xE7 |0 + \xCA\xA3 |0 + \xCC\xA7 |0 + \xEA\xC9 |0 + \xF8\xB6 |0 + \xFA\xA5 |0 + \xF1\xAE |0 + \xEF\xCE |0 + \xCB\xED |0 + \xF6\xB0 |0 + \xEF\xCF |0 + \xE9\xCF |0 + \xF7\xDE |0 + \xCE\xD3 |0 + \xDC\xF7 |0 + \xDB\xA8 |0 + \xCB\xF8 |0 + \xDF\xA1 |0 + \xDD\xE1 |0 + \xF5\xCA |0 + \xE9\xB6 |0 + \xE7\xEC |0 + \xEE\xEE |0 + \xF3\xF0 |0 + \xDF\xBF |0 + \xCC\xCB |0 + \xD0\xC1 |0 + \xF4\xD2 |0 + \xE0\xBA |0 + \xDF\xC0 |0 + \xCE\xE0 |0 + \xDC\xD2 |0 + \xFD\xEA |0 + \xD6\xF6 |0 + \xEA\xCA |0 + \xE8\xE9 |0 + \xE3\xAC |0 + \xF3\xD0 |0 + \xCA\xA4 |0 + \xDB\xF8 |0 + \xDE\xC7 |0 + \xEB\xF0 |0 + \xF1\xD6 |0 + \xE5\xE2 |0 + \xCC\xCC |0 + \xCB\xFB |0 + \xEA\xE3 |0 + \xDF\xC1 |0 + \xD6\xED |0 + \xE9\xD0 |0 + \xEE\xB9 |0 + \xD5\xE3 |0 + \xD1\xD3 |0 + \xE5\xF0 |0 + \xE8\xB4 |0 + \xEB\xC3 |0 + \xEA\xAA |0 + \xFA\xFC |0 + \xF5\xF6 |0 + \xF0\xBC |0 + \xFD\xD4 |0 + \xE0\xBB |0 + \xCE\xC3 |0 + \xD0\xBA |0 + \xF7\xBA |0 + \xD8\xF3 |0 + \xF7\xCD |0 + \xE4\xAE |0 + \xD4\xDF |0 + \xD0\xE7 |0 + \xEC\xFD |0 + \xD2\xAE |0 + \xEE\xEF |0 + \xD5\xD7 |0 + \xEA\xE4 |0 + \xF8\xA2 |0 + \xCD\xEB |0 + \xD7\xBF |0 + \xFB\xB1 |0 + \xCD\xEC |0 + \xDC\xB2 |0 + \xD0\xEC |0 + \xCE\xFD |0 + \xEE\xF0 |0 + \xCC\xC2 |0 + \xD0\xED |0 + \xE5\xF7 |0 + \xF3\xFC |0 + \xEE\xA2 |0 + \xD9\xB3 |0 + \xD8\xF4 |0 + \xE9\xB7 |0 + \xCE\xAE |0 + \xD9\xA2 |0 + \xD8\xF1 |0 + \xD4\xCF |0 + \xE5\xA7 |0 + \xD5\xD2 |0 + \xD6\xA9 |0 + \xF4\xA2 |0 + \xF1\xD7 |0 + \xD5\xD8 |0 + \xF0\xBD |0 + \xD7\xD0 |0 + \xD4\xD0 |0 + \xD7\xCF |0 + \xEB\xEA |0 + \xFD\xEB |0 + \xDB\xED |0 + \xFC\xC5 |0 + \xCB\xC2 |0 + \xFD\xD5 |0 + \xF4\xC8 |0 + \xE8\xEA |0 + \xF5\xF3 |0 + \xF9\xDE |0 + \xD3\xEF |0 + \xEC\xD3 |0 + \xDD\xC2 |0 + \xEF\xB7 |0 + \xE7\xD4 |0 + \xCA\xCA |0 + \xD9\xFB |0 + \xFA\xFD |0 + \xD6\xAA |0 + \xF4\xF8 |0 + \xF7\xF7 |0 + \xDC\xAC |0 + \xD7\xD7 |0 + \xDF\xA2 |0 + \xCE\xBE |0 + \xD3\xF0 |0 + \xF0\xA4 |0 + \xE1\xEC |0 + \xCF\xE7 |0 + \xF3\xCB |0 + \xED\xA9 |0 + \xCA\xBE |0 + \xF4\xEF |0 + \xF6\xCE |0 + \xDE\xFB |0 + \xD0\xBB |0 + \xD5\xB7 |0 + \xEE\xF1 |0 + \xF4\xA8 |0 + \xDC\xF8 |0 + \xCB\xA7 |0 + \xDA\xCE |0 + \xE0\xE6 |0 + \xED\xA5 |0 + \xEE\xF2 |0 + \xDC\xF9 |0 + \xF9\xDC |0 + \xF3\xDC |0 + \xF8\xF2 |0 + \xF4\xF9 |0 + \xFC\xF1 |0 + \xD0\xBC |0 + \xDB\xF9 |0 + \xD7\xB1 |0 + \xCB\xFC |0 + \xF0\xA5 |0 + \xCB\xFD |0 + \xD5\xF4 |0 + \xCD\xED |0 + \xCA\xA5 |0 + \xD6\xAB |0 + \xD0\xC2 |0 + \xF0\xBE |0 + \xD2\xBD |0 + \xCC\xA4 |0 + \xFA\xB6 |0 + \xCC\xCD |0 + \xDA\xFA |0 + \xF6\xCF |0 + \xE9\xB8 |0 + \xD8\xF5 |0 + \xCC\xCE |0 + \xD7\xCD |0 + \xD4\xD1 |0 + \xE9\xED |0 + \xCA\xEB |0 + \xD9\xE2 |0 + \xFD\xB2 |0 + \xE3\xAD |0 + \xD6\xCC |0 + \xD9\xB4 |0 + \xE1\xA7 |0 + \xEE\xD3 |0 + \xD0\xC3 |0 + \xFD\xB3 |0 + \xD5\xE4 |0 + \xCF\xE8 |0 + \xED\xC3 |0 + \xD0\xB2 |0 + \xCE\xFE |0 + \xDA\xA8 |0 + \xF8\xD0 |0 + \xFD\xD6 |0 + \xF8\xD1 |0 + \xF8\xD2 |0 + \xDC\xD3 |0 + \xDD\xE2 |0 + \xFB\xF9 |0 + \xDD\xC1 |0 + \xE3\xB5 |0 + \xED\xDD |0 + \xCE\xC4 |0 + \xCB\xA1 |0 + \xDD\xE3 |0 + \xFC\xDD |0 + \xF9\xAF |0 + \xD2\xFB |0 + \xCF\xA1 |0 + \xE4\xA8 |0 + \xF4\xB6 |0 + \xEC\xFE |0 + \xE3\xAE |0 + \xE7\xED |0 + \xFD\xC1 |0 + \xDA\xE2 |0 + \xD8\xB3 |0 + \xDD\xE4 |0 + \xF0\xEF |0 + \xF6\xF1 |0 + \xFA\xF0 |0 + \xD1\xF5 |0 + \xDA\xCF |0 + \xDC\xD4 |0 + \xDC\xA6 |0 + \xEF\xBF |0 + \xCE\xCF |0 + \xE0\xD9 |0 + \xD9\xD6 |0 + \xEC\xD4 |0 + \xEA\xCB |0 + \xCA\xBF |0 + \xD5\xB0 |0 + \xCF\xE9 |0 + \xF1\xED |0 + \xCC\xCF |0 + \xE4\xF8 |0 + \xE4\xED |0 + \xD7\xD8 |0 + \xFD\xA7 |0 + \xEA\xAB |0 + \xF6\xB2 |0 + \xCF\xF0 |0 + \xF9\xBD |0 + \xE6\xF4 |0 + \xCB\xDB |0 + \xF3\xD1 |0 + \xE9\xD1 |0 + \xF3\xA9 |0 + \xD0\xE0 |0 + \xE9\xD2 |0 + \xDA\xE3 |0 + \xE2\xD2 |0 + \xF6\xA2 |0 + \xE1\xF4 |0 + \xDA\xE4 |0 + \xE7\xD5 |0 + \xF5\xBF |0 + \xCF\xA2 |0 + \xCD\xAF |0 + \xCF\xA3 |0 + \xCD\xB0 |0 + \xF1\xFE |0 + \xD0\xA3 |0 + \xE1\xAF |0 + \xF8\xA3 |0 + \xCA\xA6 |0 + \xF7\xBB |0 + \xF2\xEA |0 + \xDE\xC8 |0 + \xE9\xD3 |0 + \xDE\xC9 |0 + \xFD\xDE |0 + \xCA\xC0 |0 + \xF9\xEA |0 + \xD1\xCE |0 + \xEE\xD4 |0 + \xD4\xD2 |0 + \xD9\xA3 |0 + \xFD\xA8 |0 + \xD7\xD9 |0 + \xF7\xCE |0 + \xFA\xBE |0 + \xCF\xD6 |0 + \xD7\xF0 |0 + \xEB\xE1 |0 + \xF8\xC5 |0 + \xDC\xFA |0 + \xDD\xC3 |0 + \xF9\xDF |0 + \xE7\xEF |0 + \xFD\xE5 |0 + \xF6\xA3 |0 + \xD9\xFC |0 + \xFD\xA9 |0 + \xE7\xEE |0 + \xD5\xE5 |0 + \xEF\xD0 |0 + \xCD\xB1 |0 + \xF7\xA2 |0 + \xF1\xB2 |0 + \xF1\xB1 |0 + \xCD\xB2 |0 + \xDA\xAB |0 + \xCA\xA7 |0 + \xE3\xE2 |0 + \xFB\xBC |0 + \xD9\xA4 |0 + \xEE\xBA |0 + \xF8\xD3 |0 + \xFB\xFA |0 + \xCF\xA4 |0 + \xDC\xFB |0 + \xF6\xE3 |0 + \xED\xAA |0 + \xF2\xA1 |0 + \xCE\xE1 |0 + \xFA\xA6 |0 + \xF9\xE0 |0 + \xEC\xD6 |0 + \xE4\xEE |0 + \xF9\xA1 |0 + \xFB\xEF |0 + \xF9\xEB |0 + \xEE\xA3 |0 + \xEA\xAC |0 + \xCA\xA8 |0 + \xF4\xFA |0 + \xCD\xD6 |0 + \xFC\xF6 |0 + \xF4\xC9 |0 + \xF8\xD4 |0 + \xF8\xA6 |0 + \xDE\xCA |0 + \xF2\xC6 |0 + \xD7\xDA |0 + \xD3\xD0 |0 + \xD8\xC5 |0 + \xEA\xE6 |0 + \xF3\xDD |0 + \xE4\xDA |0 + \xF6\xE4 |0 + \xF6\xF2 |0 + \xDF\xC2 |0 + \xD9\xFD |0 + \xCC\xF6 |0 + \xD3\xBA |0 + \xE4\xAF |0 + \xF9\xE1 |0 + \xF0\xA6 |0 + \xCB\xD3 |0 + \xE0\xBC |0 + \xF4\xCA |0 + \xD4\xFA |0 + \xFD\xAA |0 + \xF9\xE2 |0 + \xF4\xB7 |0 + \xFD\xC2 |0 + \xFC\xB0 |0 + \xFD\xEC |0 + \xCA\xE2 |0 + \xFD\xBD |0 + \xEA\xE7 |0 + \xDF\xC3 |0 + \xD1\xD2 |0 + \xCE\xE2 |0 + \xD3\xA4 |0 + \xFD\xAB |0 + \xDF\xE0 |0 + \xF2\xC7 |0 + \xE7\xF0 |0 + \xD0\xEE |0 + \xF3\xAA |0 + \xDE\xCB |0 + \xF6\xB8 |0 + \xE1\xF5 |0 + \xF1\xB3 |0 + \xF7\xA3 |0 + \xCA\xA9 |0 + \xCF\xA5 |0 + \xDF\xC4 |0 + \xE1\xB0 |0 + \xF0\xBF |0 + \xF6\xA4 |0 + \xE3\xB6 |0 + \xFA\xC6 |0 + \xD0\xEF |0 + \xFD\xED |0 + \xDD\xC4 |0 + \xFC\xF7 |0 + \xE6\xBF |0 + \xDE\xAD |0 + \xFA\xBF |0 + \xE5\xF1 |0 + \xED\xC4 |0 + \xD2\xA5 |0 + \xFD\xEE |0 + \xF5\xB6 |0 + \xE1\xF6 |0 + \xDE\xCC |0 + \xFC\xDE |0 + \xEC\xD7 |0 + \xCD\xDD |0 + \xD6\xB7 |0 + \xCD\xB3 |0 + \xF8\xD5 |0 + \xE5\xD8 |0 + \xCF\xEA |0 + \xCF\xD0 |0 + \xEA\xCC |0 + \xEA\xAE |0 + \xEA\xAD |0 + \xD3\xF1 |0 + \xD3\xA5 |0 + \xF7\xCF |0 + \xEE\xA4 |0 + \xD0\xA4 |0 + \xF2\xA2 |0 + \xD0\xF0 |0 + \xF2\xA3 |0 + \xF7\xF8 |0 + \xD0\xB3 |0 + \xDB\xA9 |0 + \xD3\xBB |0 + \xCA\xEC |0 + \xF1\xA6 |0 + \xCB\xD5 |0 + \xF7\xE7 |0 + \xCD\xDE |0 + \xF7\xA4 |0 + \xF8\xC0 |0 + \xD3\xDD |0 + \xCC\xD0 |0 + \xCF\xA6 |0 + \xF6\xF3 |0 + \xE1\xF7 |0 + \xD3\xDC |0 + \xFA\xFE |0 + \xFA\xA7 |0 + \xEB\xD9 |0 + \xCF\xA7 |0 + \xEA\xAF |0 + \xE4\xEF |0 + \xE9\xB9 |0 + \xF1\xD8 |0 + \xD8\xD8 |0 + \xE0\xF2 |0 + \xE6\xB4 |0 + \xDC\xFC |0 + \xF3\xF1 |0 + \xE3\xD0 |0 + \xF2\xFB |0 + \xDB\xC6 |0 + \xD0\xF1 |0 + \xD0\xF2 |0 + \xCF\xDC |0 + \xD3\xD1 |0 + \xCC\xB1 |0 + \xF7\xD8 |0 + \xCB\xA8 |0 + \xEB\xBC |0 + \xE4\xBE |0 + \xF4\xDC |0 + \xDC\xC2 |0 + \xF0\xA7 |0 + \xE6\xC0 |0 + \xCA\xED |0 + \xE8\xEB |0 + \xE5\xE8 |0 + \xDC\xC3 |0 + \xED\xDE |0 + \xD3\xF2 |0 + \xCC\xF7 |0 + \xCE\xD4 |0 + \xE7\xAB |0 + \xCB\xC3 |0 + \xE1\xB1 |0 + \xF7\xB2 |0 + \xD3\xF3 |0 + \xD3\xD2 |0 + \xF5\xC0 |0 + \xDF\xDD |0 + \xEE\xF3 |0 + \xE7\xF1 |0 + \xFD\xB4 |0 + \xF2\xC8 |0 + \xF3\xD2 |0 + \xEE\xF4 |0 + \xE2\xD3 |0 + \xCC\xD1 |0 + \xDF\xEA |0 + \xE9\xBA |0 + \xD9\xD7 |0 + \xF5\xCD |0 + \xF1\xF2 |0 + \xFA\xC7 |0 + \xD9\xF8 |0 + \xD4\xC2 |0 + \xF6\xE5 |0 + \xDD\xC5 |0 + \xE7\xF2 |0 + \xED\xDF |0 + \xCA\xCB |0 + \xDB\xFA |0 + \xE8\xB5 |0 + \xD3\xA6 |0 + \xFD\xB5 |0 + \xF9\xC9 |0 + \xE4\xE2 |0 + \xFB\xBD |0 + \xD7\xA4 |0 + \xCE\xC5 |0 + \xCE\xD5 |0 + \xD6\xE6 |0 + \xE5\xBD |0 + \xDE\xCD |0 + \xEC\xF3 |0 + \xED\xE0 |0 + \xEC\xEC |0 + \xFB\xBE |0 + \xDF\xEB |0 + \xE1\xF8 |0 + \xF9\xBE |0 + \xD0\xF3 |0 + \xE0\xAA |0 + \xE8\xE2 |0 + \xE2\xD4 |0 + \xD2\xFD |0 + \xE5\xA8 |0 + \xD9\xD3 |0 + \xD3\xDE |0 + \xF4\xB8 |0 + \xF7\xBC |0 + \xDC\xFD |0 + \xE8\xEC |0 + \xE4\xE7 |0 + \xE3\xF7 |0 + \xEC\xA8 |0 + \xFA\xF1 |0 + \xE5\xF2 |0 + \xD0\xF4 |0 + \xD2\xAF |0 + \xDC\xE5 |0 + \xD0\xA5 |0 + \xF1\xB4 |0 + \xFC\xB1 |0 + \xCC\xF8 |0 + \xDD\xC6 |0 + \xFA\xD1 |0 + \xF7\xDF |0 + \xFA\xA8 |0 + \xEE\xF5 |0 + \xDE\xCE |0 + \xE7\xF3 |0 + \xF7\xAC |0 + \xEB\xC4 |0 + \xED\xE1 |0 + \xE0\xAB |0 + \xDD\xC7 |0 + \xD2\xB3 |0 + \xD2\xBF |0 + \xCA\xCC |0 + \xFB\xBF |0 + \xE5\xFD |0 + \xDD\xE5 |0 + \xD8\xCD |0 + \xEC\xF4 |0 + \xD0\xF5 |0 + \xE8\xED |0 + \xD0\xD2 |0 + \xD9\xD8 |0 + \xF6\xE6 |0 + \xDB\xAA |0 + \xF7\xE0 |0 + \xD8\xD9 |0 + \xF4\xA3 |0 + \xF4\xDD |0 + \xEF\xD1 |0 + \xD9\xB5 |0 + \xED\xAB |0 + \xE3\xB7 |0 + \xEE\xBB |0 + \xCD\xB4 |0 + \xE0\xF3 |0 + \xEA\xCD |0 + \xEC\xF5 |0 + \xE8\xEE |0 + \xCB\xA9 |0 + \xF1\xAF |0 + \xCA\xCD |0 + \xEC\xA9 |0 + \xF2\xEB |0 + \xFD\xEF |0 + \xF9\xF3 |0 + \xE6\xC1 |0 + \xEC\xD8 |0 + \xED\xAC |0 + \xEA\xCE |0 + \xE8\xDF |0 + \xDE\xCF |0 + \xD2\xA6 |0 + \xE7\xF4 |0 + \xD1\xD6 |0 + \xE6\xC2 |0 + \xE3\xE3 |0 + \xE4\xB0 |0 + \xD8\xB4 |0 + \xF6\xA5 |0 + \xF3\xDE |0 + \xD7\xA5 |0 + \xF7\xE8 |0 + \xE8\xC6 |0 + \xFB\xE6 |0 + \xDD\xE6 |0 + \xDC\xFE |0 + \xD8\xDA |0 + \xDA\xAC |0 + \xEA\xB0 |0 + \xE3\xB8 |0 + \xCA\xAA |0 + \xE1\xF9 |0 + \xEA\xB1 |0 + \xF2\xEC |0 + \xFA\xEE |0 + \xEE\xD5 |0 + \xF9\xF4 |0 + \xD2\xEC |0 + \xFB\xFB |0 + \xFD\xF0 |0 + \xE0\xBD |0 + \xCE\xE3 |0 + \xF8\xC6 |0 + \xDE\xAE |0 + \xDF\xC5 |0 + \xE5\xBE |0 + \xED\xAD |0 + \xFA\xEA |0 + \xCD\xEE |0 + \xED\xA6 |0 + \xED\xAE |0 + \xF0\xED |0 + \xDD\xA1 |0 + \xED\xAF |0 + \xFC\xF8 |0 + \xD8\xEB |0 + \xCC\xF9 |0 + \xCD\xB5 |0 + \xFA\xA9 |0 + \xE1\xDD |0 + \xE2\xD5 |0 + \xED\xCF |0 + \xDD\xA2 |0 + \xF9\xCA |0 + \xEA\xE8 |0 + \xE5\xED |0 + \xD3\xEB |0 + \xE9\xD4 |0 + \xE1\xFA |0 + \xE4\xCC |0 + \xE1\xE4 |0 + \xE8\xC7 |0 + \xCE\xDB |0 + \xDC\xD5 |0 + \xF7\xB5 |0 + \xFC\xF3 |0 + \xF0\xF3 |0 + \xCE\xAF |0 + \xF1\xB5 |0 + \xEF\xD2 |0 + \xE8\xC8 |0 + \xEB\xF1 |0 + \xCB\xD4 |0 + \xE0\xBE |0 + \xE3\xF8 |0 + \xEA\xE9 |0 + \xFC\xB2 |0 + \xE0\xF4 |0 + \xCF\xE0 |0 + \xEE\xA5 |0 + \xFA\xAA |0 + \xE6\xC3 |0 + \xE1\xB2 |0 + \xCA\xAB |0 + \xE3\xE4 |0 + \xE9\xBB |0 + \xE2\xD6 |0 + \xF3\xF2 |0 + \xEE\xD6 |0 + \xEA\xB2 |0 + \xD0\xF6 |0 + \xEC\xD9 |0 + \xDA\xCB |0 + \xCF\xA8 |0 + \xDD\xA3 |0 + \xD8\xDB |0 + \xF9\xCE |0 + \xE9\xD5 |0 + \xE3\xD1 |0 + \xD2\xBC |0 + \xD8\xAC |0 + \xF3\xCC |0 + \xCD\xFB |0 + \xF6\xD6 |0 + \xE7\xF5 |0 + \xE8\xEF |0 + \xE3\xF9 |0 + \xD2\xBB |0 + \xF3\xF3 |0 + \xE3\xFB |0 + \xDE\xD0 |0 + \xCE\xB0 |0 + \xD6\xF7 |0 + \xF1\xD9 |0 + \xF5\xC1 |0 + \xDC\xC4 |0 + \xF5\xBB |0 + \xDE\xD1 |0 + \xDC\xE6 |0 + \xDE\xD2 |0 + \xED\xE2 |0 + \xEE\xF6 |0 + \xEA\xCF |0 + \xF0\xEE |0 + \xE3\xFC |0 + \xD3\xDF |0 + \xD3\xF4 |0 + \xE1\xB3 |0 + \xE1\xB4 |0 + \xF4\xD3 |0 + \xDF\xC6 |0 + \xE9\xD6 |0 + \xDB\xAB |0 + \xF6\xA6 |0 + \xE3\xB9 |0 + \xEB\xC5 |0 + \xF4\xA9 |0 + \xCD\xB6 |0 + \xD2\xF9 |0 + \xDA\xAD |0 + \xD2\xE3 |0 + \xCF\xD1 |0 + \xCB\xDC |0 + \xCC\xFA |0 + \xCF\xDD |0 + \xE8\xA9 |0 + \xE3\xBB |0 + \xE3\xBA |0 + \xE0\xDA |0 + \xEE\xF7 |0 + \xDC\xB3 |0 + \xD3\xF5 |0 + \xD7\xA6 |0 + \xF6\xB5 |0 + \xD7\xDB |0 + \xE1\xD5 |0 + \xD4\xEA |0 + \xDF\xA3 |0 + \xFD\xDF |0 + \xD0\xF7 |0 + \xED\xD4 |0 + \xCB\xAA |0 + \xE4\xDB |0 + \xE1\xFB |0 + \xCB\xA2 |0 + \xD3\xE0 |0 + \xE4\xBF |0 + \xFB\xC0 |0 + \xDA\xBE |0 + \xE4\xCD |0 + \xD6\xB9 |0 + \xEF\xC0 |0 + \xE1\xFC |0 + \xF6\xB9 |0 + \xDF\xC7 |0 + \xE4\xB1 |0 + \xDC\xE7 |0 + \xDC\xE8 |0 + \xFA\xD6 |0 + \xD3\xF6 |0 + \xF1\xDA |0 + \xFA\xF2 |0 + \xE2\xFD |0 + \xD5\xCF |0 + \xD0\xF8 |0 + \xCD\xDF |0 + \xF5\xCB |0 + \xE4\xF0 |0 + \xCB\xAB |0 + \xD7\xC4 |0 + \xE2\xFE |0 + \xDD\xDA |0 + \xDA\xAE |0 + \xCA\xEE |0 + \xD5\xB9 |0 + \xE3\xA1 |0 + \xE8\xE3 |0 + \xF3\xAB |0 + \xCF\xA9 |0 + \xD3\xF7 |0 + \xD4\xF1 |0 + \xCE\xE4 |0 + \xE8\xF2 |0 + \xE5\xF5 |0 + \xE7\xAE |0 + \xD6\xBA |0 + \xDF\xEC |0 + \xE4\xC0 |0 + \xE8\xE4 |0 + \xD8\xB5 |0 + \xE4\xDC |0 + \xF4\xB9 |0 + \xF1\xB6 |0 + \xE2\xDE |0 + \xE1\xB5 |0 + \xCD\xEF |0 + \xF1\xA7 |0 + \xCE\xE5 |0 + \xCB\xDD |0 + \xD9\xE3 |0 + \xF3\xAC |0 + \xD0\xF9 |0 + \xEC\xAB |0 + \xDE\xD3 |0 + \xF7\xE9 |0 + \xF9\xF5 |0 + \xE1\xDE |0 + \xCB\xEE |0 + \xE3\xBC |0 + \xF8\xD6 |0 + \xDB\xEE |0 + \xFD\xF1 |0 + \xF7\xB6 |0 + \xF4\xDE |0 + \xF2\xED |0 + \xDB\xD9 |0 + \xF0\xA8 |0 + \xE1\xFD |0 + \xDE\xD4 |0 + \xE0\xAC |0 + \xED\xE3 |0 + \xD3\xE1 |0 + \xDF\xC8 |0 + \xD9\xB6 |0 + \xFD\xAC |0 + \xEF\xD3 |0 + \xE4\xC1 |0 + \xF8\xEB |0 + \xDB\xAC |0 + \xFC\xC6 |0 + \xD8\xAD |0 + \xF6\xBA |0 + \xDB\xDF |0 + \xD3\xD3 |0 + \xF8\xC7 |0 + \xCA\xCE |0 + \xF8\xC1 |0 + \xD2\xB4 |0 + \xDC\xB4 |0 + \xFA\xB9 |0 + \xCA\xCF |0 + \xFC\xB3 |0 + \xEA\xEA |0 + \xEA\xEB |0 + \xD0\xFA |0 + \xED\xE4 |0 + \xDD\xE7 |0 + \xDF\xC9 |0 + \xDF\xED |0 + \xEE\xBC |0 + \xEF\xC1 |0 + \xCC\xD2 |0 + \xDD\xA4 |0 + \xDF\xCA |0 + \xD3\xF8 |0 + \xF1\xA8 |0 + \xCD\xB7 |0 + \xEF\xD4 |0 + \xE4\xDD |0 + \xDF\xEE |0 + \xCB\xAC |0 + \xE9\xBC |0 + \xEA\xEC |0 + \xDF\xCB |0 + \xF9\xBF |0 + \xD6\xAF |0 + \xD5\xC6 |0 + \xCF\xAA |0 + \xCE\xA9 |0 + \xD6\xF8 |0 + \xF1\xB7 |0 + \xEE\xF8 |0 + \xD9\xD9 |0 + \xF3\xDF |0 + \xF8\xC8 |0 + \xCE\xC6 |0 + \xD5\xE6 |0 + \xF4\xE6 |0 + \xE6\xC5 |0 + \xEF\xD5 |0 + \xCB\xEF |0 + \xFC\xDF |0 + \xDC\xA7 |0 + \xD6\xE7 |0 + \xF8\xC9 |0 + \xE3\xD2 |0 + \xE3\xBD |0 + \xCF\xE1 |0 + \xF0\xC0 |0 + \xEC\xDA |0 + \xDD\xD7 |0 + \xFB\xF0 |0 + \xEC\xAC |0 + \xF0\xA9 |0 + \xFA\xD7 |0 + \xFB\xC1 |0 + \xD2\xC0 |0 + \xE5\xB0 |0 + \xED\xE5 |0 + \xCB\xAD |0 + \xF9\xB0 |0 + \xF7\xA5 |0 + \xCB\xAE |0 + \xDA\xAF |0 + \xD8\xB6 |0 + \xD3\xA7 |0 + \xFB\xB2 |0 + \xFD\xC4 |0 + \xEC\xAD |0 + \xFB\xA1 |0 + \xE5\xE9 |0 + \xE9\xEE |0 + \xF3\xF4 |0 + \xF8\xF3 |0 + \xF0\xC1 |0 + \xDE\xAF |0 + \xF8\xB0 |0 + \xF3\xE0 |0 + \xE7\xAF |0 + \xDB\xAD |0 + \xE6\xB5 |0 + \xF9\xA8 |0 + \xDD\xD8 |0 + \xE8\xD9 |0 + \xEF\xD6 |0 + \xD3\xE2 |0 + \xE2\xDF |0 + \xFC\xE0 |0 + \xD7\xC8 |0 + \xFD\xAD |0 + \xDF\xEF |0 + \xCC\xD3 |0 + \xD3\xF9 |0 + \xD4\xF0 |0 + \xDB\xC7 |0 + \xDE\xD5 |0 + \xF0\xF4 |0 + \xD5\xD0 |0 + \xE5\xD9 |0 + \xFC\xC7 |0 + \xDC\xD6 |0 + \xE2\xE0 |0 + \xDA\xB0 |0 + \xF3\xA3 |0 + \xD3\xEC |0 + \xF4\xCB |0 + \xFD\xC5 |0 + \xE3\xFD |0 + \xF9\xB1 |0 + \xD0\xFB |0 + \xEC\xDB |0 + \xF5\xBC |0 + \xF2\xA4 |0 + \xD8\xCE |0 + \xD8\xCF |0 + \xF5\xF7 |0 + \xF6\xE1 |0 + \xD2\xB7 |0 + \xFB\xEC |0 + \xDD\xC8 |0 + \xE4\xE8 |0 + \xD2\xC1 |0 + \xF8\xD7 |0 + \xD6\xBB |0 + \xDE\xD6 |0 + \xF7\xBD |0 + \xEC\xAE |0 + \xD0\xE1 |0 + \xE0\xF5 |0 + \xEA\xB3 |0 + \xCE\xD6 |0 + \xCC\xA5 |0 + \xEC\xF6 |0 + \xE2\xE1 |0 + \xE3\xBE |0 + \xFC\xC8 |0 + \xCD\xF0 |0 + \xF9\xF6 |0 + \xDF\xF0 |0 + \xE5\xBF |0 + \xCE\xBF |0 + \xFC\xE1 |0 + \xED\xB0 |0 + \xFD\xD1 |0 + \xF6\xBB |0 + \xF9\xCF |0 + \xEB\xDA |0 + \xCA\xC1 |0 + \xD2\xB8 |0 + \xCD\xF1 |0 + \xE3\xD3 |0 + \xFD\xE6 |0 + \xE6\xED |0 + \xE3\xFA |0 + \xF0\xAA |0 + \xF9\xD0 |0 + \xFC\xE2 |0 + \xF8\xA7 |0 + \xE1\xE5 |0 + \xEE\xF9 |0 + \xE7\xF6 |0 + \xEA\xED |0 + \xFC\xB4 |0 + \xF5\xC2 |0 + \xD7\xDC |0 + \xF0\xF5 |0 + \xDD\xE8 |0 + \xD3\xED |0 + \xF5\xFC |0 + \xDA\xBF |0 + \xCC\xFB |0 + \xD3\xFA |0 + \xF4\xA4 |0 + \xEF\xD7 |0 + \xD4\xC3 |0 + \xFB\xE3 |0 + \xFB\xED |0 + \xE0\xAD |0 + \xEA\xEE |0 + \xFB\xB3 |0 + \xE4\xC2 |0 + \xF6\xE7 |0 + \xD2\xDD |0 + \xDF\xCC |0 + \xFC\xC9 |0 + \xE5\xA9 |0 + \xE0\xF6 |0 + \xF6\xB3 |0 + \xE1\xFE |0 + \xCB\xF0 |0 + \xEA\xEF |0 + \xEA\xF0 |0 + \xDA\xC0 |0 + \xF8\xB4 |0 + \xEB\xF2 |0 + \xE4\xC3 |0 + \xE9\xD7 |0 + \xE4\xF1 |0 + \xCA\xEF |0 + \xCE\xD7 |0 + \xFC\xCA |0 + \xF3\xE1 |0 + \xCB\xC4 |0 + \xE3\xE5 |0 + \xCB\xC5 |0 + \xEA\xB4 |0 + \xE9\xBD |0 + \xD7\xC9 |0 + \xEB\xDB |0 + \xED\xB1 |0 + \xCC\xC3 |0 + \xF7\xBE |0 + \xFC\xCB |0 + \xF8\xF4 |0 + \xD9\xB7 |0 + \xF3\xD3 |0 + \xF3\xD4 |0 + \xF7\xE4 |0 + \xF7\xD1 |0 + \xD8\xB7 |0 + \xCE\xB1 |0 + \xCA\xC2 |0 + \xFB\xB4 |0 + \xCB\xC6 |0 + \xF0\xF6 |0 + \xD5\xE7 |0 + \xEA\xD0 |0 + \xCC\xD4 |0 + \xCB\xAF |0 + \xF4\xAA |0 + \xE9\xAF |0 + \xF5\xC3 |0 + \xE9\xD8 |0 + \xDD\xE9 |0 + \xF1\xF3 |0 + \xD5\xFB |0 + \xDE\xBB |0 + \xF4\xFB |0 + \xFD\xF3 |0 + \xFD\xF2 |0 + \xF7\xA6 |0 + \xDD\xC9 |0 + \xD4\xD3 |0 + \xCC\xA8 |0 + \xDA\xC1 |0 + \xCC\xD5 |0 + \xD9\xE4 |0 + \xFA\xCA |0 + \xE5\xE3 |0 + \xD3\xBC |0 + \xCA\xF0 |0 + \xD0\xC4 |0 + \xCA\xD0 |0 + \xFA\xAB |0 + \xEB\xEB |0 + \xE7\xF8 |0 + \xD9\xE5 |0 + \xD1\xD7 |0 + \xF3\xA4 |0 + \xD4\xFB |0 + \xFC\xE3 |0 + \xFA\xD8 |0 + \xF3\xD5 |0 + \xCF\xAB |0 + \xEB\xF3 |0 + \xD5\xFC |0 + \xD3\xD4 |0 + \xCD\xFC |0 + \xD9\xE6 |0 + \xE2\xF9 |0 + \xE2\xA1 |0 + \xEB\xD4 |0 + \xE0\xF7 |0 + \xE4\xB2 |0 + \xCC\xFC |0 + \xFB\xE4 |0 + \xF4\xAB |0 + \xD0\xBD |0 + \xCA\xF1 |0 + \xEF\xB8 |0 + \xD7\xC0 |0 + \xEE\xFA |0 + \xFD\xF4 |0 + \xD3\xE3 |0 + \xFB\xC2 |0 + \xD5\xE8 |0 + \xDB\xAE |0 + \xE1\xB6 |0 + \xF8\xB7 |0 + \xE0\xBF |0 + \xFB\xC3 |0 + \xDD\xEA |0 + \xE2\xA2 |0 + \xEE\xA6 |0 + \xF6\xE8 |0 + \xF6\xF5 |0 + \xDD\xCA |0 + \xD0\xE2 |0 + \xDD\xA6 |0 + \xDD\xEB |0 + \xE4\xF9 |0 + \xE3\xAF |0 + \xD0\xFC |0 + \xF4\xFC |0 + \xCC\xBC |0 + \xF7\xEA |0 + \xE5\xE4 |0 + \xDF\xF1 |0 + \xF7\xE1 |0 + \xF9\xF7 |0 + \xEF\xB9 |0 + \xF8\xD8 |0 + \xF9\xA9 |0 + \xF8\xD9 |0 + \xEE\xBD |0 + \xD8\xC6 |0 + \xE4\xE3 |0 + \xF5\xCE |0 + \xDD\xD9 |0 + \xD9\xE7 |0 + \xD2\xB9 |0 + \xD5\xC3 |0 + \xDA\xE5 |0 + \xDA\xD0 |0 + \xD1\xD9 |0 + \xCE\xD8 |0 + \xCB\xDE |0 + \xF4\xAC |0 + \xDA\xFB |0 + \xF6\xE9 |0 + \xE8\xF3 |0 + \xCF\xAC |0 + \xF0\xF0 |0 + \xF4\xFD |0 + \xDB\xC8 |0 + \xCE\xC0 |0 + \xE3\xD4 |0 + \xD1\xCF |0 + \xF1\xF5 |0 + \xCD\xF2 |0 + \xCF\xEB |0 + \xCD\xB8 |0 + \xE3\xA6 |0 + \xD1\xDA |0 + \xF2\xA5 |0 + \xF2\xA6 |0 + \xE4\xCE |0 + \xD3\xFB |0 + \xF1\xA9 |0 + \xF2\xC9 |0 + \xEF\xD8 |0 + \xE6\xC9 |0 + \xD8\xB8 |0 + \xFA\xF3 |0 + \xF3\xB5 |0 + \xF8\xA4 |0 + \xD1\xF3 |0 + \xE6\xC8 |0 + \xF8\xDA |0 + \xDC\xE9 |0 + \xDE\xD7 |0 + \xCB\xDF |0 + \xCF\xEC |0 + \xF4\xDF |0 + \xD1\xF4 |0 + \xD2\xBA |0 + \xDF\xF2 |0 + \xE1\xB7 |0 + \xE2\xA3 |0 + \xD3\xFC |0 + \xED\xE6 |0 + \xDB\xC9 |0 + \xE4\xFA |0 + \xCF\xDE |0 + \xCE\xD0 |0 + \xD5\xD3 |0 + \xF3\xF5 |0 + \xF7\xAE |0 + \xEF\xC8 |0 + \xCD\xF3 |0 + \xF5\xCF |0 + \xE5\xF3 |0 + \xF0\xC2 |0 + \xCA\xD1 |0 + \xEA\xF1 |0 + \xD0\xA6 |0 + \xD9\xDA |0 + \xF0\xAB |0 + \xEB\xE7 |0 + \xE5\xC0 |0 + \xFC\xB5 |0 + \xE4\xC4 |0 + \xCC\xA9 |0 + \xFD\xC6 |0 + \xEA\xB5 |0 + \xE5\xAA |0 + \xDF\xBA |0 + \xE1\xDF |0 + \xDA\xD1 |0 + \xE1\xB8 |0 + \xE8\xF4 |0 + \xD3\xFD |0 + \xE2\xA4 |0 + \xF2\xCA |0 + \xDA\xE6 |0 + \xF7\xB3 |0 + \xFD\xCD |0 + \xF3\xB6 |0 + \xEE\xD7 |0 + \xF5\xC4 |0 + \xD8\xA4 |0 + \xF2\xA7 |0 + \xD9\xB8 |0 + \xD9\xB9 |0 + \xEF\xC9 |0 + \xD6\xCE |0 + \xF7\xCB |0 + \xDF\xAE |0 + \xE8\xF5 |0 + \xD2\xB5 |0 + \xD3\xD5 |0 + \xF4\xCC |0 + \xDA\xFC |0 + \xD9\xE8 |0 + \xF7\xEB |0 + \xF5\xC9 |0 + \xF3\xBC |0 + \xDA\xD2 |0 + \xD3\xB5 |0 + \xE8\xB6 |0 + \xD6\xCF |0 + \xF4\xBA |0 + \xF7\xC9 |0 + \xCC\xAA |0 + \xF0\xC3 |0 + \xCC\xD6 |0 + \xD0\xD3 |0 + \xD3\xBD |0 + \xDB\xFB |0 + \xCB\xE0 |0 + \xD3\xE4 |0 + \xF6\xF7 |0 + \xD5\xBA |0 + \xF3\xCD |0 + \xCB\xE1 |0 + \xEB\xF4 |0 + \xF4\xAD |0 + \xFC\xAA |0 + \xF7\xEC |0 + \xE8\xF6 |0 + \xDA\xE7 |0 + \xF7\xCC |0 + \xE5\xC1 |0 + \xE0\xEE |0 + \xD5\xFD |0 + \xCE\xE6 |0 + \xFC\xAB |0 + \xD5\xBB |0 + \xF2\xA8 |0 + \xE2\xA5 |0 + \xCD\xB9 |0 + \xEA\xF2 |0 + \xCB\xC7 |0 + \xCD\xF4 |0 + \xDB\xAF |0 + \xEF\xD9 |0 + \xCD\xBA |0 + \xFC\xF9 |0 + \xDF\xF3 |0 + \xCE\xE7 |0 + \xDA\xC2 |0 + \xCF\xAD |0 + \xE7\xF9 |0 + \xF8\xA8 |0 + \xF3\xE2 |0 + \xCA\xF2 |0 + \xDF\xA4 |0 + \xD4\xC4 |0 + \xCC\xD7 |0 + \xE5\xC2 |0 + \xCD\xBB |0 + \xEF\xDA |0 + \xEE\xD8 |0 + \xDD\xA7 |0 + \xE2\xA6 |0 + \xE0\xC0 |0 + \xD6\xB0 |0 + \xF8\xCA |0 + \xFC\xFA |0 + \xD9\xFE |0 + \xDE\xB0 |0 + \xDD\xEC |0 + \xDA\xE8 |0 + \xD4\xE0 |0 + \xD6\xF9 |0 + \xCD\xD7 |0 + \xDE\xD8 |0 + \xF2\xF8 |0 + \xE4\xD6 |0 + \xD0\xC5 |0 + \xF4\xAE |0 + \xDD\xA8 |0 + \xED\xC5 |0 + \xF3\xD6 |0 + \xDE\xD9 |0 + \xE3\xE6 |0 + \xD3\xA8 |0 + \xDB\xB0 |0 + \xE5\xDA |0 + \xE3\xBF |0 + \xDB\xB1 |0 + \xD5\xE9 |0 + \xE0\xC1 |0 + \xEF\xDB |0 + \xF0\xE9 |0 + \xD7\xB2 |0 + \xD0\xFD |0 + \xD9\xE9 |0 + \xD0\xFE |0 + \xEC\xED |0 + \xD3\xA9 |0 + \xF2\xA9 |0 + \xF0\xC4 |0 + \xE2\xE2 |0 + \xE9\xEF |0 + \xF9\xD1 |0 + \xE9\xD9 |0 + \xE8\xDA |0 + \xDA\xC3 |0 + \xDA\xC4 |0 + \xD4\xC5 |0 + \xE7\xFA |0 + \xCD\xE0 |0 + \xE3\xB0 |0 + \xDB\xB2 |0 + \xFB\xC4 |0 + \xF3\xE3 |0 + \xD9\xA5 |0 + \xFB\xE7 |0 + \xDD\xCB |0 + \xD0\xD4 |0 + \xE6\xB6 |0 + \xE0\xAE |0 + \xFD\xDA |0 + \xDC\xB5 |0 + \xE0\xF8 |0 + \xE7\xB1 |0 + \xF5\xF0 |0 + \xD8\xDC |0 + \xED\xC6 |0 + \xE1\xB9 |0 + \xE3\xC0 |0 + \xF9\xC0 |0 + \xE9\xF0 |0 + \xD9\xDB |0 + \xF3\xE4 |0 + \xDC\xB6 |0 + \xE4\xE9 |0 + \xF0\xC5 |0 + \xE3\xC1 |0 + \xFC\xCC |0 + \xFC\xCD |0 + \xF2\xCB |0 + \xF2\xCC |0 + \xE4\xCF |0 + \xF1\xDB |0 + \xFA\xD9 |0 + \xF1\xB8 |0 + \xFD\xF5 |0 + \xE0\xF9 |0 + \xE7\xFB |0 + \xFC\xB7 |0 + \xFC\xE4 |0 + \xFB\xC5 |0 + \xE3\xE7 |0 + \xD8\xB9 |0 + \xF6\xF8 |0 + \xDC\xC5 |0 + \xCC\xD8 |0 + \xE0\xAF |0 + \xF4\xE7 |0 + \xEF\xDC |0 + \xCF\xFC |0 + \xEF\xDD |0 + \xF2\xAA |0 + \xFD\xBE |0 + \xCA\xAC |0 + \xFD\xBB |0 + \xFD\xC7 |0 + \xE7\xB2 |0 + \xEA\xD1 |0 + \xDF\xF4 |0 + \xD1\xEC |0 + \xE4\xDE |0 + \xE5\xC3 |0 + \xD9\xA6 |0 + \xCD\xBC |0 + \xF3\xE5 |0 + \xED\xD5 |0 + \xD9\xBA |0 + \xED\xE7 |0 + \xFB\xB5 |0 + \xF8\xEC |0 + \xE0\xE7 |0 + \xCC\xD9 |0 + \xD4\xC6 |0 + \xE7\xA5 |0 + \xD5\xF5 |0 + \xD3\xBE |0 + \xFC\xFB |0 + \xE4\xF2 |0 + \xDF\xF5 |0 + \xE8\xF8 |0 + \xF8\xED |0 + \xCE\xC7 |0 + \xFD\xF6 |0 + \xE8\xD8 |0 + \xCD\xD8 |0 + \xE7\xD6 |0 + \xCC\xDA |0 + \xCA\xE3 |0 + \xDF\xF6 |0 + \xF0\xC7 |0 + \xF0\xC6 |0 + \xD8\xBA |0 + \xF1\xF4 |0 + \xF4\xF0 |0 + \xF5\xCC |0 + \xFC\xE5 |0 + \xEA\xC5 |0 + \xEA\xF3 |0 + \xDD\xDB |0 + \xDC\xD7 |0 + \xDE\xFD |0 + \xF2\xF9 |0 + \xD5\xC7 |0 + \xD8\xD0 |0 + \xF0\xC8 |0 + \xD1\xA1 |0 + \xD1\xA2 |0 + \xD9\xD4 |0 + \xD6\xE8 |0 + \xD9\xCA |0 + \xDA\xB1 |0 + \xD8\xC7 |0 + \xDC\xE2 |0 + \xF3\xCE |0 + \xF5\xF4 |0 + \xF1\xB9 |0 + \xDA\xD3 |0 + \xF6\xEA |0 + \xCF\xF5 |0 + \xFD\xAE |0 + \xCA\xD2 |0 + \xDF\xB4 |0 + \xD7\xDD |0 + \xFA\xBA |0 + \xEE\xA7 |0 + \xF5\xBD |0 + \xF8\xF5 |0 + \xED\xE8 |0 + \xD4\xE1 |0 + \xD1\xA3 |0 + \xE1\xD6 |0 + \xF9\xF8 |0 + \xDB\xCA |0 + \xCB\xF9 |0 + \xD4\xD4 |0 + \xD9\xDC |0 + \xEE\xBE |0 + \xF7\xED |0 + \xD2\xEE |0 + \xE1\xE6 |0 + \xF7\xF9 |0 + \xDD\xED |0 + \xE8\xDB |0 + \xDB\xB3 |0 + \xD1\xF7 |0 + \xE0\xB0 |0 + \xD4\xE2 |0 + \xF6\xD7 |0 + \xD7\xF9 |0 + \xD8\xDD |0 + \xCD\xFD |0 + \xF2\xAB |0 + \xCD\xBD |0 + \xF8\xC2 |0 + \xF2\xAC |0 + \xCA\xAD |0 + \xCA\xAE |0 + \xCF\xAE |0 + \xE3\xC2 |0 + \xDC\xB7 |0 + \xDB\xDA |0 + \xD9\xBB |0 + \xCA\xF3 |0 + \xF6\xD3 |0 + \xE6\xF8 |0 + \xEA\xF5 |0 + \xEA\xF6 |0 + \xF6\xF9 |0 + \xCF\xAF |0 + \xCA\xD3 |0 + \xCA\xAF |0 + \xD2\xB0 |0 + \xF1\xBA |0 + \xD7\xB3 |0 + \xE3\xC3 |0 + \xF3\xFD |0 + \xDE\xDA |0 + \xDE\xDB |0 + \xEF\xDE |0 + \xE2\xE3 |0 + \xEE\xFB |0 + \xDF\xF7 |0 + \xD7\xCA |0 + \xCE\xE8 |0 + \xDB\xDB |0 + \xF1\xBB |0 + \xE9\xF1 |0 + \xFA\xB7 |0 + \xD0\xC6 |0 + \xCC\xAB |0 + \xEE\xA8 |0 + \xCB\xFA |0 + \xF9\xF9 |0 + \xCC\xFD |0 + \xD3\xFE |0 + \xE4\xD0 |0 + \xF2\xEE |0 + \xD4\xD5 |0 + \xDF\xCD |0 + \xFC\xB8 |0 + \xD1\xD0 |0 + \xF2\xCD |0 + \xF7\xD2 |0 + \xCA\xD4 |0 + \xD5\xD9 |0 + \xD8\xDE |0 + \xCD\xD9 |0 + \xEE\xA9 |0 + \xF6\xBC |0 + \xCC\xDB |0 + \xF0\xC9 |0 + \xFC\xFC |0 + \xE8\xC9 |0 + \xF4\xFE |0 + \xE7\xFC |0 + \xD7\xDE |0 + \xDE\xDC |0 + \xF0\xAC |0 + \xCC\xFE |0 + \xCD\xE1 |0 + \xE1\xBA |0 + \xDB\xEF |0 + \xDA\xB2 |0 + \xD1\xA5 |0 + \xDC\xB8 |0 + \xD8\xF6 |0 + \xD1\xA4 |0 + \xCD\xE2 |0 + \xDC\xEA |0 + \xF0\xF7 |0 + \xF0\xCA |0 + \xD0\xBE |0 + \xDD\xDC |0 + \xD4\xD6 |0 + \xD3\xD6 |0 + \xED\xD0 |0 + \xCD\xA1 |0 + \xDF\xB5 |0 + \xDF\xF8 |0 + \xD4\xA1 |0 + \xCE\xB2 |0 + \xE8\xCA |0 + \xEB\xF5 |0 + \xE3\xD5 |0 + \xF5\xD0 |0 + \xF5\xA1 |0 + \xD9\xA7 |0 + \xE5\xAB |0 + \xE6\xCB |0 + \xF5\xF1 |0 + \xE5\xC5 |0 + \xF9\xA3 |0 + \xE0\xDB |0 + \xF6\xEB |0 + \xCB\xF1 |0 + \xD9\xEA |0 + \xF5\xA2 |0 + \xD7\xD1 |0 + \xD1\xF8 |0 + \xEA\xF8 |0 + \xEA\xF9 |0 + \xDA\xB3 |0 + \xEF\xDF |0 + \xF1\xEF |0 + \xE5\xF6 |0 + \xEE\xBF |0 + \xE2\xE4 |0 + \xD0\xBF |0 + \xFA\xAC |0 + \xF5\xD1 |0 + \xE7\xB3 |0 + \xE9\xBE |0 + \xF2\xCE |0 + \xDB\xB4 |0 + \xFC\xCE |0 + \xDD\xEE |0 + \xE7\xB4 |0 + \xD7\xB4 |0 + \xF7\xB4 |0 + \xCD\xBE |0 + \xDA\xE9 |0 + \xCF\xB0 |0 + \xF7\xD9 |0 + \xF3\xE6 |0 + \xCE\xD9 |0 + \xCE\xAA |0 + \xCB\xC8 |0 + \xD0\xA7 |0 + \xF0\xCB |0 + \xD0\xC7 |0 + \xE4\xC5 |0 + \xDB\xE0 |0 + \xD5\xDA |0 + \xD7\xA7 |0 + \xEE\xC0 |0 + \xF8\xF6 |0 + \xF5\xD2 |0 + \xED\xE9 |0 + \xD9\xBC |0 + \xE5\xC6 |0 + \xF5\xA3 |0 + \xDA\xD4 |0 + \xE2\xA7 |0 + \xFB\xFC |0 + \xF1\xDC |0 + \xCA\xF4 |0 + \xE8\xFA |0 + \xCE\xE9 |0 + \xE9\xF8 |0 + \xE2\xE5 |0 + \xD0\xB9 |0 + \xD4\xF2 |0 + \xD1\xA6 |0 + \xDF\xCE |0 + \xFC\xF4 |0 + \xD3\xAA |0 + \xCC\xAC |0 + \xEF\xE0 |0 + \xE5\xE5 |0 + \xD0\xD5 |0 + \xDB\xFC |0 + \xFC\xE6 |0 + \xCB\xFE |0 + \xED\xEA |0 + \xDE\xB1 |0 + \xF9\xE3 |0 + \xD4\xA2 |0 + \xCF\xF6 |0 + \xD6\xD0 |0 + \xD5\xEA |0 + \xF1\xEE |0 + \xFA\xCB |0 + \xE5\xA1 |0 + \xD5\xB1 |0 + \xCF\xED |0 + \xED\xEB |0 + \xD5\xB2 |0 + \xD5\xBC |0 + \xFD\xE2 |0 + \xF3\xAD |0 + \xFD\xDB |0 + \xE9\xB0 |0 + \xD1\xA7 |0 + \xFD\xE3 |0 + \xCE\xB3 |0 + \xFD\xE4 |0 + \xFA\xCE |0 + \xCA\xB0 |0 + \xF7\xA7 |0 + \xCF\xB1 |0 + \xE6\xA2 |0 + \xFC\xB6 |0 + \xF2\xAD |0 + \xEF\xE1 |0 + \xF3\xAE |0 + \xDC\xC6 |0 + \xD9\xEB |0 + \xE8\xE0 |0 + \xE1\xA8 |0 + \xD5\xF6 |0 + \xCF\xFD |0 + \xDE\xDD |0 + \xD9\xD1 |0 + \xE4\xEA |0 + \xF2\xCF |0 + \xF7\xBF |0 + \xE2\xE6 |0 + \xE2\xA8 |0 + \xE3\xD6 |0 + \xED\xD1 |0 + \xE9\xF9 |0 + \xD6\xB1 |0 + \xDE\xB2 |0 + \xE0\xE8 |0 + \xD3\xAB |0 + \xEB\xDC |0 + \xDF\xAF |0 + \xCA\xC3 |0 + \xEE\xFC |0 + \xFD\xC3 |0 + \xEB\xF6 |0 + \xCF\xB2 |0 + \xD9\xEC |0 + \xD9\xBD |0 + \xD8\xDF |0 + \xD4\xB8 |0 + \xEB\xBE |0 + \xDD\xEF |0 + \xDD\xF0 |0 + \xDD\xF1 |0 + \xDD\xF2 |0 + \xD9\xBE |0 + \xFB\xC6 |0 + \xCF\xB3 |0 + \xEE\xFD |0 + \xE4\xAB |0 + \xDA\xC5 |0 + \xD8\xEC |0 + \xD1\xA8 |0 + \xE2\xA9 |0 + \xDE\xBC |0 + \xE7\xB5 |0 + \xDB\xF0 |0 + \xEF\xE2 |0 + \xF1\xF0 |0 + \xCF\xB4 |0 + \xDB\xF1 |0 + \xE0\xB1 |0 + \xDF\xA5 |0 + \xF9\xD2 |0 + \xE7\xFD |0 + \xE6\xA3 |0 + \xFB\xF1 |0 + \xCB\xB0 |0 + \xF2\xAE |0 + \xCD\xE7 |0 + \xE8\xDC |0 + \xE7\xD7 |0 + \xF7\xC0 |0 + \xD0\xE3 |0 + \xDA\xA1 |0 + \xCC\xBD |0 + \xD1\xA9 |0 + \xDD\xCC |0 + \xE3\xFE |0 + \xD1\xAA |0 + \xE8\xAA |0 + \xEA\xB6 |0 + \xF9\xFA |0 + \xE6\xCC |0 + \xF6\xD8 |0 + \xD4\xC7 |0 + \xD9\xCB |0 + \xD9\xD2 |0 + \xD3\xCB |0 + \xD8\xF7 |0 + \xDA\xA9 |0 + \xF5\xF8 |0 + \xDE\xDE |0 + \xF2\xAF |0 + \xF8\xA9 |0 + \xD8\xC8 |0 + \xEE\xC1 |0 + \xF9\xC1 |0 + \xDD\xF3 |0 + \xEA\xFA |0 + \xF6\xBD |0 + \xE1\xBB |0 + \xCD\xBF |0 + \xF4\xD4 |0 + \xE6\xCD |0 + \xFC\xCF |0 + \xFB\xA2 |0 + \xE0\xDC |0 + \xF4\xBB |0 + \xDA\xD5 |0 + \xF9\xB2 |0 + \xFB\xF2 |0 + \xDB\xF6 |0 + \xDE\xDF |0 + \xDB\xF2 |0 + \xF8\xDC |0 + \xF7\xEE |0 + \xEB\xE8 |0 + \xD2\xFA |0 + \xF1\xBC |0 + \xFA\xDA |0 + \xDA\xEA |0 + \xDA\xC6 |0 + \xF7\xC1 |0 + \xE7\xB6 |0 + \xE5\xC7 |0 + \xD6\xAC |0 + \xDC\xC7 |0 + \xE1\xA9 |0 + \xE2\xAA |0 + \xD5\xA6 |0 + \xD4\xD7 |0 + \xF2\xD0 |0 + \xEA\xFB |0 + \xE0\xDD |0 + \xFB\xF3 |0 + \xF1\xBD |0 + \xE2\xE7 |0 + \xFD\xD7 |0 + \xCE\xC8 |0 + \xEA\xB7 |0 + \xFC\xC0 |0 + \xFD\xE7 |0 + \xF7\xEF |0 + \xD7\xB5 |0 + \xEF\xBA |0 + \xF1\xDD |0 + \xDE\xB3 |0 + \xE8\xCB |0 + \xF8\xDD |0 + \xFB\xC7 |0 + \xD5\xC8 |0 + \xD7\xDF |0 + \xDD\xA9 |0 + \xE9\xB1 |0 + \xFA\xAD |0 + \xF6\xD9 |0 + \xFA\xF4 |0 + \xF8\xAA |0 + \xE6\xEE |0 + \xCC\xDC |0 + \xE1\xBC |0 + \xE0\xEF |0 + \xE9\xBF |0 + \xFC\xFD |0 + \xE6\xCE |0 + \xE1\xD7 |0 + \xE6\xCF |0 + \xF4\xF1 |0 + \xE4\xF3 |0 + \xE4\xFB |0 + \xF9\xE4 |0 + \xEF\xE3 |0 + \xCF\xEE |0 + \xF6\xBE |0 + \xE0\xB2 |0 + \xFC\xFE |0 + \xD1\xAB |0 + \xD7\xFA |0 + \xFB\xC8 |0 + \xE2\xD7 |0 + \xD4\xA3 |0 + \xF0\xF8 |0 + \xD7\xA8 |0 + \xE1\xE7 |0 + \xD3\xBF |0 + \xEF\xE4 |0 + \xD7\xC5 |0 + \xEB\xE2 |0 + \xFC\xE7 |0 + \xE4\xA2 |0 + \xE2\xE8 |0 + \xE6\xD0 |0 + \xFB\xE8 |0 + \xF4\xE8 |0 + \xE5\xF4 |0 + \xF4\xBC |0 + \xF4\xD5 |0 + \xDF\xB6 |0 + \xFC\xB9 |0 + \xEE\xC2 |0 + \xCA\xF5 |0 + \xEF\xE5 |0 + \xCB\xE2 |0 + \xD4\xA4 |0 + \xDE\xE0 |0 + \xDA\xFD |0 + \xE4\xC6 |0 + \xE8\xBE |0 + \xE0\xDE |0 + \xF6\xB4 |0 + \xEA\xD2 |0 + \xF9\xFB |0 + \xE0\xC2 |0 + \xCA\xE4 |0 + \xE7\xB7 |0 + \xEA\xFD |0 + \xD9\xDD |0 + \xDA\xB4 |0 + \xEE\xAA |0 + \xFB\xE9 |0 + \xDB\xCB |0 + \xDA\xB5 |0 + \xF1\xBE |0 + \xD3\xAC |0 + \xFB\xC9 |0 + \xDF\xCF |0 + \xD3\xC0 |0 + \xE3\xD7 |0 + \xEF\xE6 |0 + \xFC\xD0 |0 + \xE9\xC0 |0 + \xF5\xD3 |0 + \xEC\xDC |0 + \xF7\xB7 |0 + \xEA\xB8 |0 + \xD1\xF9 |0 + \xDC\xC8 |0 + \xEA\xB9 |0 + \xF1\xDE |0 + \xD7\xB6 |0 + \xCF\xB5 |0 + \xD9\xA8 |0 + \xEC\xEE |0 + \xDD\xAA |0 + \xCD\xA2 |0 + \xE8\xAE |0 + \xE1\xBD |0 + \xF2\xD1 |0 + \xE9\xC1 |0 + \xD2\xFC |0 + \xDB\xB5 |0 + \xF3\xE7 |0 + \xD8\xFE |0 + \xFC\xD1 |0 + \xED\xB2 |0 + \xF4\xAF |0 + \xFB\xA3 |0 + \xFC\xC1 |0 + \xEE\xAB |0 + \xD4\xA5 |0 + \xF4\xF2 |0 + \xEE\xD9 |0 + \xFB\xCA |0 + \xCD\xE3 |0 + \xD8\xBB |0 + \xE5\xDB |0 + \xF8\xF7 |0 + \xF6\xD4 |0 + \xD7\xA9 |0 + \xCB\xC9 |0 + \xE6\xD1 |0 + \xF0\xCC |0 + \xD8\xAE |0 + \xF9\xD3 |0 + \xD5\xFE |0 + \xD8\xBC |0 + \xF2\xB0 |0 + \xE2\xAB |0 + \xF3\xE8 |0 + \xEF\xC2 |0 + \xED\xEC |0 + \xE7\xB8 |0 + \xDA\xFE |0 + \xCC\xBE |0 + \xF2\xFC |0 + \xDA\xEB |0 + \xE2\xD8 |0 + \xED\xD6 |0 + \xD6\xD1 |0 + \xE0\xB3 |0 + \xFC\xD2 |0 + \xEB\xC8 |0 + \xD3\xC1 |0 + \xF0\xCD |0 + \xCF\xF7 |0 + \xED\xD2 |0 + \xD4\xD8 |0 + \xDC\xC9 |0 + \xD7\xF1 |0 + \xDF\xBB |0 + \xF3\xA5 |0 + \xF4\xCD |0 + \xF1\xBF |0 + \xF8\xB1 |0 + \xE9\xFA |0 + \xFB\xCB |0 + \xCA\xD5 |0 + \xF9\xD4 |0 + \xF7\xCA |0 + \xD6\xC8 |0 + \xFC\xE8 |0 + \xF3\xBD |0 + \xEE\xFE |0 + \xE7\xFE |0 + \xD3\xC2 |0 + \xD3\xB6 |0 + \xCC\xAD |0 + \xF6\xFA |0 + \xD6\xB2 |0 + \xD2\xD8 |0 + \xE7\xD8 |0 + \xE3\xA5 |0 + \xE7\xB9 |0 + \xF0\xAD |0 + \xFB\xCC |0 + \xEB\xA1 |0 + \xD4\xA6 |0 + \xFB\xCD |0 + \xD5\xBD |0 + \xF1\xDF |0 + \xF6\xFB |0 + \xDE\xB4 |0 + \xD5\xEB |0 + \xE5\xC8 |0 + \xFB\xA4 |0 + \xD4\xB9 |0 + \xDE\xE1 |0 + \xE4\xA3 |0 + \xD7\xB7 |0 + \xF8\xEE |0 + \xDE\xB5 |0 + \xD6\xD2 |0 + \xF9\xD5 |0 + \xE7\xBA |0 + \xEB\xD5 |0 + \xD5\xF7 |0 + \xEF\xE7 |0 + \xE1\xBE |0 + \xFA\xAE |0 + \xD6\xE9 |0 + \xD6\xEE |0 + \xE7\xBB |0 + \xEC\xCB |0 + \xD5\xB3 |0 + \xCE\xB4 |0 + \xFB\xA5 |0 + \xE1\xEE |0 + \xF7\xA8 |0 + \xFB\xCE |0 + \xD8\xBD |0 + \xFB\xFD |0 + \xFC\xE9 |0 + \xCF\xB6 |0 + \xED\xC7 |0 + \xEE\xAC |0 + \xCC\xDD |0 + \xF6\xA7 |0 + \xE6\xFA |0 + \xF5\xA4 |0 + \xFD\xDC |0 + \xED\xB3 |0 + \xCE\xC9 |0 + \xEF\xE8 |0 + \xE1\xBF |0 + \xFA\xDB |0 + \xCB\xE3 |0 + \xF7\xA9 |0 + \xFB\xA6 |0 + \xDC\xB9 |0 + \xF1\xC0 |0 + \xED\xC8 |0 + \xEF\xC3 |0 + \xD6\xAD |0 + \xFD\xCE |0 + \xE8\xA1 |0 + \xFB\xF4 |0 + \xD5\xA7 |0 + \xF1\xF6 |0 + \xE6\xD3 |0 + \xCC\xDE |0 + \xF8\xB2 |0 + \xDC\xEB |0 + \xFD\xB6 |0 + \xE5\xEA |0 + \xF1\xE0 |0 + \xDB\xCC |0 + \xDD\xCD |0 + \xD4\xC8 |0 + \xD9\xED |0 + \xF5\xA5 |0 + \xE6\xFB |0 + \xE6\xD4 |0 + \xFD\xC8 |0 + \xD6\xA1 |0 + \xFD\xBF |0 + \xFC\xD3 |0 + \xEF\xA1 |0 + \xE7\xBC |0 + \xD1\xEE |0 + \xE6\xD5 |0 + \xE9\xF2 |0 + \xDF\xB0 |0 + \xD8\xE0 |0 + \xFC\xBA |0 + \xFD\xAF |0 + \xF0\xCE |0 + \xDB\xE1 |0 + \xE5\xC9 |0 + \xED\xB4 |0 + \xE0\xC3 |0 + \xE3\xD8 |0 + \xE9\xFB |0 + \xEA\xA8 |0 + \xFD\xB7 |0 + \xFB\xA7 |0 + \xE9\xC2 |0 + \xFD\xF7 |0 + \xE2\xD9 |0 + \xDC\xEC |0 + \xE8\xA2 |0 + \xE6\xF0 |0 + \xFD\xF8 |0 + \xFD\xF9 |0 + \xF6\xBF |0 + \xE7\xA7 |0 + \xE6\xD7 |0 + \xD4\xF3 |0 + \xD4\xC9 |0 + \xD6\xFA |0 + \xD7\xF2 |0 + \xE1\xC0 |0 + \xDB\xE2 |0 + \xE6\xD8 |0 + \xE7\xBD |0 + \xF0\xCF |0 + \xF3\xBE |0 + \xE2\xAC |0 + \xF5\xB7 |0 + \xE0\xF0 |0 + \xFD\xB8 |0 + \xE3\xE8 |0 + \xD4\xA7 |0 + \xE8\xFC |0 + \xFA\xD2 |0 + \xF8\xEF |0 + \xD6\xD3 |0 + \xD5\xB4 |0 + \xF0\xD0 |0 + \xF7\xF0 |0 + \xEE\xB3 |0 + \xEA\xBA |0 + \xEA\xD3 |0 + \xED\xC9 |0 + \xDD\xAB |0 + \xE5\xAC |0 + \xFD\xA1 |0 + \xDF\xD0 |0 + \xEC\xB3 |0 + \xDF\xD1 |0 + \xED\xED |0 + \xF8\xB8 |0 + \xF7\xFA |0 + \xF8\xAB |0 + \xF4\xE0 |0 + \xD4\xBA |0 + \xE4\xB3 |0 + \xE9\xDA |0 + \xDE\xB6 |0 + \xD9\xBF |0 + \xD9\xC0 |0 + \xD6\xEF |0 + \xD9\xCC |0 + \xDA\xAA |0 + \xDF\xE5 |0 + \xF7\xE5 |0 + \xCC\xB2 |0 + \xDF\xF9 |0 + \xD7\xE0 |0 + \xD4\xBB |0 + \xFD\xFA |0 + \xCC\xB3 |0 + \xDB\xF3 |0 + \xDF\xD2 |0 + \xCE\xCA |0 + \xEE\xDA |0 + \xE4\xE4 |0 + \xFB\xCF |0 + \xCF\xB7 |0 + \xEE\xC3 |0 + \xCE\xEA |0 + \xE2\xAD |0 + \xD7\xE1 |0 + \xFA\xF5 |0 + \xD5\xC9 |0 + \xF8\xAC |0 + \xE7\xD9 |0 + \xF3\xE9 |0 + \xD8\xED |0 + \xE3\xC4 |0 + \xF0\xF1 |0 + \xE8\xE5 |0 + \xE0\xFA |0 + \xEE\xC4 |0 + \xD9\xDE |0 + \xEB\xA2 |0 + \xEB\xA3 |0 + \xFC\xC2 |0 + \xEA\xBB |0 + \xE8\xAB |0 + \xDE\xE2 |0 + \xED\xEF |0 + \xE8\xA3 |0 + \xCF\xF1 |0 + \xD4\xBC |0 + \xFC\xEA |0 + \xE7\xBE |0 + \xFC\xF2 |0 + \xD6\xB4 |0 + \xE2\xAE |0 + \xD3\xB7 |0 + \xFA\xCC |0 + \xFA\xDC |0 + \xED\xB5 |0 + \xE1\xE3 |0 + \xE8\xAC |0 + \xE8\xDD |0 + \xEF\xE9 |0 + \xF4\xBD |0 + \xCF\xB8 |0 + \xE9\xDB |0 + \xD1\xAC |0 + \xDA\xC7 |0 + \xEB\xC9 |0 + \xE8\xCC |0 + \xDE\xB7 |0 + \xD6\xBC |0 + \xD3\xE5 |0 + \xFA\xDD |0 + \xDA\xD6 |0 + \xCA\xB1 |0 + \xDA\xC8 |0 + \xDF\xA6 |0 + \xF9\xB3 |0 + \xF2\xD2 |0 + \xCA\xC4 |0 + \xCE\xCB |0 + \xCD\xF5 |0 + \xFD\xB0 |0 + \xD5\xA8 |0 + \xF1\xC1 |0 + \xE2\xE9 |0 + \xDC\xCA |0 + \xEC\xB4 |0 + \xFA\xC0 |0 + \xFB\xA8 |0 + \xD0\xA8 |0 + \xDA\xEC |0 + \xD9\xEE |0 + \xE0\xFB |0 + \xEF\xEA |0 + \xFA\xDE |0 + \xE0\xC4 |0 + \xCF\xB9 |0 + \xD5\xCA |0 + \xD7\xE2 |0 + \xE2\xAF |0 + \xD7\xB8 |0 + \xE8\xCD |0 + \xF6\xDA |0 + \xEF\xA2 |0 + \xE2\xDA |0 + \xF6\xFC |0 + \xFB\xD0 |0 + \xD1\xAD |0 + \xCD\xE4 |0 + \xD1\xAE |0 + \xDC\xED |0 + \xE8\xCE |0 + \xF0\xF9 |0 + \xCE\xB5 |0 + \xE6\xFC |0 + \xD7\xFB |0 + \xD0\xD6 |0 + \xDD\xF5 |0 + \xF7\xF1 |0 + \xF6\xFD |0 + \xDB\xF7 |0 + \xFB\xEA |0 + \xE9\xDC |0 + \xD9\xC1 |0 + \xF5\xF2 |0 + \xE0\xC5 |0 + \xEA\xD4 |0 + \xF9\xC2 |0 + \xEA\xBC |0 + \xD2\xC5 |0 + \xFB\xD1 |0 + \xE7\xC0 |0 + \xEB\xA5 |0 + \xDF\xFA |0 + \xE3\xA2 |0 + \xD7\xB9 |0 + \xE9\xC3 |0 + \xE8\xFD |0 + \xE8\xAF |0 + \xF2\xD3 |0 + \xFB\xA9 |0 + \xD8\xA5 |0 + \xD5\xCB |0 + \xD0\xC8 |0 + \xD1\xAF |0 + \xD7\xE3 |0 + \xE0\xC6 |0 + \xD6\xA2 |0 + \xED\xF0 |0 + \xD7\xF3 |0 + \xFC\xD4 |0 + \xDA\xD7 |0 + \xCC\xDF |0 + \xF2\xD4 |0 + \xD1\xB0 |0 + \xCC\xE0 |0 + \xDB\xFD |0 + \xF3\xBF |0 + \xF0\xD1 |0 + \xFC\xBB |0 + \xE2\xB0 |0 + \xE6\xA5 |0 + \xE2\xDB |0 + \xDF\xDE |0 + \xE0\xC7 |0 + \xF2\xEF |0 + \xCC\xE1 |0 + \xD6\xEA |0 + \xE7\xC2 |0 + \xCE\xB6 |0 + \xF3\xC0 |0 + \xCD\xFE |0 + \xFB\xD2 |0 + \xF8\xF8 |0 + \xF7\xFB |0 + \xE8\xBF |0 + \xE8\xB7 |0 + \xED\xB6 |0 + \xDC\xBA |0 + \xCC\xB4 |0 + \xF1\xF7 |0 + \xE8\xB8 |0 + \xCA\xF6 |0 + \xE4\xA4 |0 + \xF4\xD6 |0 + \xDF\xE6 |0 + \xDF\xA7 |0 + \xDF\xE7 |0 + \xE1\xC1 |0 + \xE9\xC4 |0 + \xDC\xCB |0 + \xE9\xC5 |0 + \xEF\xA3 |0 + \xEB\xA6 |0 + \xCB\xA3 |0 + \xE3\xE9 |0 + \xD1\xFB |0 + \xEF\xA4 |0 + \xEF\xEB |0 + \xD0\xB4 |0 + \xCD\xA3 |0 + \xE8\xE6 |0 + \xEF\xA5 |0 + \xD3\xCC |0 + \xDA\xED |0 + \xD7\xBA |0 + \xF2\xD5 |0 + \xF5\xE5 |0 + \xD9\xEF |0 + \xF9\xB4 |0 + \xD5\xD4 |0 + \xFD\xCF |0 + \xDB\xE3 |0 + \xF1\xE1 |0 + \xEC\xB6 |0 + \xFB\xFE |0 + \xD3\xD7 |0 + \xD1\xB1 |0 + \xCB\xB1 |0 + \xD1\xB2 |0 + \xCB\xB2 |0 + \xF1\xC2 |0 + \xF4\xE1 |0 + \xF9\xB5 |0 + \xE1\xC3 |0 + \xE1\xC2 |0 + \xEB\xF7 |0 + \xDF\xA8 |0 + \xCB\xCA |0 + \xE6\xB9 |0 + \xF8\xDE |0 + \xF9\xAA |0 + \xCA\xF7 |0 + \xED\xB7 |0 + \xD3\xB8 |0 + \xF2\xD6 |0 + \xD4\xD9 |0 + \xEE\xC5 |0 + \xF2\xF0 |0 + \xCA\xB2 |0 + \xDC\xBB |0 + \xF1\xF8 |0 + \xEC\xB7 |0 + \xE5\xCA |0 + \xF6\xC0 |0 + \xFD\xDD |0 + \xD4\xE3 |0 + \xCC\xE2 |0 + \xF7\xD4 |0 + \xD7\xE5 |0 + \xD3\xC3 |0 + \xD8\xA6 |0 + \xF6\xC1 |0 + \xDD\xF6 |0 + \xCD\xC0 |0 + \xE5\xDC |0 + \xE5\xCB |0 + \xE1\xC4 |0 + \xE8\xB0 |0 + \xF4\xB0 |0 + \xF3\xEA |0 + \xDA\xEE |0 + \xD7\xBB |0 + \xE2\xB1 |0 + \xD7\xAA |0 + \xD6\xFB |0 + \xE4\xDF |0 + \xCA\xD6 |0 + \xEB\xA8 |0 + \xDB\xFE |0 + \xF6\xC2 |0 + \xEF\xBB |0 + \xD4\xFD |0 + \xE0\xC8 |0 + \xE8\xB9 |0 + \xEF\xA6 |0 + \xCD\xA4 |0 + \xD4\xF4 |0 + \xDB\xA1 |0 + \xDB\xDC |0 + \xDB\xDD |0 + \xEE\xDC |0 + \xCB\xCB |0 + \xFC\xD5 |0 + \xCE\xEB |0 + \xCD\xC1 |0 + \xFB\xD3 |0 + \xF9\xAB |0 + \xF5\xD4 |0 + \xD9\xA9 |0 + \xE9\xDD |0 + \xDB\xCD |0 + \xDD\xCE |0 + \xE7\xC3 |0 + \xEC\xCC |0 + \xF9\xEC |0 + \xCB\xCC |0 + \xE0\xFC |0 + \xD4\xA8 |0 + \xED\xD3 |0 + \xD8\xEF |0 + \xF2\xD7 |0 + \xCA\xF8 |0 + \xDA\xEF |0 + \xD6\xD4 |0 + \xD9\xCD |0 + \xD8\xEE |0 + \xF2\xC1 |0 + \xDF\xD3 |0 + \xDA\xF0 |0 + \xE2\xEA |0 + \xE0\xFD |0 + \xD8\xF8 |0 + \xF7\xAF |0 + \xDA\xB6 |0 + \xCA\xD7 |0 + \xF2\xD8 |0 + \xD8\xF9 |0 + \xFA\xDF |0 + \xCF\xEF |0 + \xD9\xC2 |0 + \xF0\xD2 |0 + \xE4\xD1 |0 + \xF3\xB7 |0 + \xFA\xE0 |0 + \xEF\xEC |0 + \xE2\xB2 |0 + \xD4\xBD |0 + \xD9\xCE |0 + \xF4\xE2 |0 + \xD4\xA9 |0 + \xCD\xC2 |0 + \xE7\xDA |0 + \xF2\xD9 |0 + \xD9\xAA |0 + \xD8\xBE |0 + \xDC\xAD |0 + \xE2\xEB |0 + \xD6\xFC |0 + \xCA\xF9 |0 + \xD4\xDA |0 + \xF4\xD7 |0 + \xCC\xA1 |0 + \xCF\xBA |0 + \xF5\xB8 |0 + \xD9\xC3 |0 + \xD0\xE8 |0 + \xE3\xC5 |0 + \xEB\xF8 |0 + \xF2\xB1 |0 + \xCF\xBB |0 + \xD3\xAD |0 + \xE8\xE1 |0 + \xCE\xEC |0 + \xE0\xB4 |0 + \xDE\xE3 |0 + \xDD\xF7 |0 + \xF2\xB2 |0 + \xF3\xF6 |0 + \xF6\xDB |0 + \xD7\xFE |0 + \xF8\xDF |0 + \xF7\xF2 |0 + \xD0\xA9 |0 + \xE6\xDA |0 + \xF5\xA6 |0 + \xD7\xBC |0 + \xCC\xE3 |0 + \xE6\xDB |0 + \xDD\xDD |0 + \xD1\xB3 |0 + \xEF\xED |0 + \xD6\xDE |0 + \xE4\xF4 |0 + \xE1\xEF |0 + \xDD\xF8 |0 + \xE8\xCF |0 + \xCA\xE5 |0 + \xDC\xA1 |0 + \xE0\xB5 |0 + \xFC\xAC |0 + \xFC\xAD |0 + \xD8\xA7 |0 + \xED\xB8 |0 + \xDB\xB6 |0 + \xD6\xF0 |0 + \xF3\xAF |0 + \xCD\xA5 |0 + \xDA\xF1 |0 + \xD8\xA8 |0 + \xCC\xE4 |0 + \xD1\xB4 |0 + \xCA\xD8 |0 + \xDA\xF2 |0 + \xF5\xA7 |0 + \xF5\xA8 |0 + \xE6\xA6 |0 + \xD5\xEC |0 + \xD5\xF8 |0 + \xDA\xF3 |0 + \xE3\xC6 |0 + \xDE\xE4 |0 + \xDE\xE5 |0 + \xD1\xB5 |0 + \xD1\xB6 |0 + \xD1\xB7 |0 + \xF2\xB3 |0 + \xE9\xDE |0 + \xF0\xD3 |0 + \xF2\xB4 |0 + \xF0\xD4 |0 + \xCB\xE4 |0 + \xFB\xD4 |0 + \xF5\xE6 |0 + \xE3\xEA |0 + \xDE\xE6 |0 + \xDF\xD4 |0 + \xF8\xF9 |0 + \xF0\xAE |0 + \xD1\xB8 |0 + \xD6\xDF |0 + \xD0\xD7 |0 + \xFC\xA1 |0 + \xEF\xEE |0 + \xDC\xD8 |0 + \xE9\xDF |0 + \xE5\xDD |0 + \xFD\xFB |0 + \xE0\xC9 |0 + \xD6\xC9 |0 + \xD4\xAA |0 + \xE5\xCC |0 + \xE9\xE0 |0 + \xD0\xD8 |0 + \xFC\xA2 |0 + \xD4\xBE |0 + \xE2\xB3 |0 + \xDE\xE7 |0 + \xDC\xBC |0 + \xD2\xB6 |0 + \xF5\xD5 |0 + \xCE\xA1 |0 + \xF5\xA9 |0 + \xDD\xF9 |0 + \xDD\xFA |0 + \xF0\xD5 |0 + \xF6\xDF |0 + \xF2\xDA |0 + \xE4\xEB |0 + \xF2\xF1 |0 + \xEC\xB9 |0 + \xFD\xFC |0 + \xE1\xAA |0 + \xCA\xD9 |0 + \xEF\xEF |0 + \xF5\xAA |0 + \xEC\xF9 |0 + \xF8\xAD |0 + \xF2\xC2 |0 + \xF6\xC3 |0 + \xD7\xD2 |0 + \xF9\xA2 |0 + \xF0\xD6 |0 + \xF0\xFA |0 + \xF6\xE0 |0 + \xE9\xF3 |0 + \xF2\xC3 |0 + \xD4\xAB |0 + \xCA\xB3 |0 + \xCD\xA6 |0 + \xCD\xC3 |0 + \xCD\xDA |0 + \xD9\xCF |0 + \xF6\xC4 |0 + \xEE\xDD |0 + \xE7\xC4 |0 + \xE2\xB4 |0 + \xDF\xE2 |0 + \xE7\xDB |0 + \xE8\xB1 |0 + \xFC\xAE |0 + \xE5\xCD |0 + \xFA\xEB |0 + \xCF\xBC |0 + \xCF\xE2 |0 + \xCD\xF6 |0 + \xEF\xF0 |0 + \xF4\xBE |0 + \xD4\xCD |0 + \xF3\xB8 |0 + \xE9\xA1 |0 + \xF2\xF2 |0 + \xF3\xEB |0 + \xF0\xD7 |0 + \xCF\xD7 |0 + \xCF\xDF |0 + \xE8\xC0 |0 + \xE8\xC1 |0 + \xCF\xE3 |0 + \xE9\xA2 |0 + \xD0\xAA |0 + \xF3\xC1 |0 + \xD0\xAB |0 + \xD4\xE4 |0 + \xEF\xBC |0 + \xD8\xA1 |0 + \xD9\xDF |0 + \xF3\xD7 |0 + \xDC\xBD |0 + \xCC\xE5 |0 + \xED\xF1 |0 + \xF1\xE2 |0 + \xD4\xDB |0 + \xE2\xB5 |0 + \xCA\xE6 |0 + \xD3\xAE |0 + \xCC\xE6 |0 + \xF1\xD3 |0 + \xF5\xE7 |0 + \xCA\xDA |0 + \xFB\xEE |0 + \xE1\xC5 |0 + \xDF\xE9 |0 + \xEE\xDE |0 + \xF7\xC2 |0 + \xD8\xA2 |0 + \xDD\xAC |0 + \xF0\xAF |0 + \xD6\xBD |0 + \xE1\xAB |0 + \xF9\xB6 |0 + \xD4\xF5 |0 + \xD0\xC9 |0 + \xEF\xA7 |0 + \xE2\xEC |0 + \xDB\xEA |0 + \xCE\xCC |0 + \xF5\xE8 |0 + \xF7\xD5 |0 + \xD3\xCD |0 + \xF3\xFE |0 + \xD0\xB5 |0 + \xE0\xFE |0 + \xDF\xFB |0 + \xE6\xDD |0 + \xE8\xA4 |0 + \xCB\xCD |0 + \xEF\xA8 |0 + \xEE\xB4 |0 + \xDA\xD8 |0 + \xD1\xB9 |0 + \xDF\xA9 |0 + \xF3\xB0 |0 + \xCC\xC4 |0 + \xCE\xB7 |0 + \xEF\xA9 |0 + \xDF\xD5 |0 + \xED\xD7 |0 + \xEE\xC6 |0 + \xEF\xBD |0 + \xFC\xD6 |0 + \xDB\xF4 |0 + \xEF\xAA |0 + \xF8\xB9 |0 + \xF5\xE9 |0 + \xE3\xD9 |0 + \xE1\xC6 |0 + \xD4\xBF |0 + \xDE\xE8 |0 + \xF0\xEA |0 + \xF3\xC2 |0 + \xD3\xAF |0 + \xCA\xDB |0 + \xFC\xD7 |0 + \xED\xD8 |0 + \xE1\xC7 |0 + \xF4\xD8 |0 + \xD6\xB3 |0 + \xDD\xAD |0 + \xD5\xBE |0 + \xF1\xC3 |0 + \xEE\xDF |0 + \xD6\xEB |0 + \xF4\xD9 |0 + \xD7\xE6 |0 + \xDA\xB7 |0 + \xDD\xFB |0 + \xDD\xCF |0 + \xD8\xA3 |0 + \xDA\xD9 |0 + \xF0\xD8 |0 + \xEF\xC4 |0 + \xE1\xD8 |0 + \xF1\xD4 |0 + \xED\xF2 |0 + \xD5\xDB |0 + \xD5\xDC |0 + \xF3\xC4 |0 + \xCB\xD7 |0 + \xE2\xB6 |0 + \xEF\xF1 |0 + \xFB\xD5 |0 + \xD3\xD8 |0 + \xDD\xD0 |0 + \xF0\xD9 |0 + \xCB\xB3 |0 + \xD5\xDD |0 + \xCD\xA7 |0 + \xD0\xAC |0 + \xD1\xBA |0 + \xF1\xC4 |0 + \xE5\xB3 |0 + \xFB\xF5 |0 + \xE9\xE1 |0 + \xFD\xE0 |0 + \xFC\xBC |0 + \xDA\xA2 |0 + \xDA\xA3 |0 + \xD2\xA1 |0 + \xD2\xEF |0 + \xE2\xED |0 + \xDE\xE9 |0 + \xCE\xDC |0 + \xF2\xB5 |0 + \xD0\xE4 |0 + \xDD\xD1 |0 + \xE1\xC8 |0 + \xDB\xB7 |0 + \xDF\xE3 |0 + \xED\xB9 |0 + \xF1\xC5 |0 + \xF3\xCF |0 + \xD7\xAB |0 + \xE1\xAC |0 + \xE3\xEB |0 + \xEE\xC7 |0 + \xE1\xC9 |0 + \xCA\xFA |0 + \xF0\xFB |0 + \xFA\xE1 |0 + \xF0\xDA |0 + \xCC\xE7 |0 + \xDA\xF4 |0 + \xCC\xBF |0 + \xCE\xED |0 + \xD5\xA9 |0 + \xFA\xE2 |0 + \xD0\xE5 |0 + \xEB\xD6 |0 + \xEC\xDF |0 + \xDF\xFC |0 + \xF7\xD6 |0 + \xDE\xEA |0 + \xCB\xB4 |0 + \xEF\xBE |0 + \xCC\xB5 |0 + \xCF\xBD |0 + \xEF\xF2 |0 + \xE2\xB7 |0 + \xCC\xE8 |0 + \xF0\xFC |0 + \xD6\xE0 |0 + \xF1\xC6 |0 + \xE2\xB8 |0 + \xEB\xAB |0 + \xCB\xB5 |0 + \xD8\xD1 |0 + \xF4\xCE |0 + \xF3\xF7 |0 + \xD7\xC6 |0 + \xD1\xBB |0 + \xF7\xAA |0 + \xED\xCA |0 + \xD7\xD3 |0 + \xD8\xFA |0 + \xF6\xC5 |0 + \xD1\xCC |0 + \xDD\xFC |0 + \xDF\xFD |0 + \xF9\xE5 |0 + \xE0\xCA |0 + \xF2\xFD |0 + \xD3\xB0 |0 + \xF4\xF3 |0 + \xDA\xC9 |0 + \xE6\xDE |0 + \xF8\xBA |0 + \xE8\xD0 |0 + \xD8\xFB |0 + \xEA\xD5 |0 + \xD6\xA3 |0 + \xF6\xC6 |0 + \xF2\xDB |0 + \xE4\xFC |0 + \xE8\xB2 |0 + \xDA\xDA |0 + \xF2\xDC |0 + \xFB\xD6 |0 + \xE9\xB2 |0 + \xEE\xAD |0 + \xFA\xE3 |0 + \xDC\xEE |0 + \xF5\xEA |0 + \xE6\xE0 |0 + \xF0\xFD |0 + \xD7\xAC |0 + \xF5\xC5 |0 + \xEE\xE0 |0 + \xDB\xE5 |0 + \xDD\xDE |0 + \xD9\xF0 |0 + \xE9\xA3 |0 + \xF1\xF9 |0 + \xF2\xC4 |0 + \xE0\xCB |0 + \xE9\xA4 |0 + \xE2\xB9 |0 + \xE3\xB1 |0 + \xFC\xEB |0 + \xCD\xA8 |0 + \xCC\xB6 |0 + \xF0\xDB |0 + \xE6\xBA |0 + \xCD\xA9 |0 + \xF3\xC3 |0 + \xE1\xD9 |0 + \xEF\xAB |0 + \xE7\xC5 |0 + \xE0\xE9 |0 + \xF3\xC5 |0 + \xD4\xC0 |0 + \xD5\xBF |0 + \xDD\xAE |0 + \xF9\xFC |0 + \xCC\xC0 |0 + \xE5\xA2 |0 + \xCE\xB8 |0 + \xD8\xD2 |0 + \xF9\xD6 |0 + \xF1\xAA |0 + \xCE\xD1 |0 + \xF6\xC7 |0 + \xDB\xEB |0 + \xDF\xFE |0 + \xD8\xE1 |0 + \xF7\xF3 |0 + \xD7\xE7 |0 + \xD4\xFE |0 + \xD1\xBC |0 + \xE5\xCF |0 + \xCB\xB6 |0 + \xDA\xB8 |0 + \xCD\xC4 |0 + \xD6\xBE |0 + \xE2\xBA |0 + \xCF\xD8 |0 + \xE0\xCC |0 + \xEB\xF9 |0 + \xFD\xFD |0 + \xD7\xE8 |0 + \xCB\xD8 |0 + \xE9\xE2 |0 + \xE8\xBA |0 + \xE3\xC7 |0 + \xEC\xCD |0 + \xEC\xCE |0 + \xD6\xBF |0 + \xE3\xA7 |0 + \xDF\xD6 |0 + \xFD\xE8 |0 + \xEE\xE1 |0 + \xF6\xA8 |0 + \xDD\xFD |0 + \xF8\xBB |0 + \xE8\xD1 |0 + \xF9\xD7 |0 + \xCE\xEE |0 + \xEC\xCF |0 + \xE9\xA5 |0 + \xD6\xD5 |0 + \xCD\xC5 |0 + \xED\xBA |0 + \xD1\xBD |0 + \xCF\xBE |0 + \xEC\xBB |0 + \xD2\xB1 |0 + \xCC\xE9 |0 + \xD9\xC4 |0 + \xE9\xFC |0 + \xD1\xBE |0 + \xEC\xBC |0 + \xE5\xAD |0 + \xF7\xB0 |0 + \xCC\xEA |0 + \xD3\xC4 |0 + \xD6\xC0 |0 + \xD6\xFD |0 + \xE1\xA1 |0 + \xDE\xBD |0 + \xF6\xA9 |0 + \xDA\xA4 |0 + \xD6\xA4 |0 + \xF5\xC6 |0 + \xE1\xA2 |0 + \xE9\xC6 |0 + \xF2\xC5 |0 + \xF4\xE9 |0 + \xD6\xEC |0 + \xEB\xD3 |0 + \xEC\xBD |0 + \xE2\xDC |0 + \xDE\xEB |0 + \xF0\xDC |0 + \xEB\xBF |0 + \xD7\xCE |0 + \xD1\xBF |0 + \xF5\xAB |0 + \xF9\xFD |0 + \xCA\xDC |0 + \xCD\xC6 |0 + \xF2\xB6 |0 + \xDD\xFE |0 + \xCC\xB7 |0 + \xDB\xB8 |0 + \xD0\xE9 |0 + \xCE\xDD |0 + \xEB\xC0 |0 + \xFD\xA2 |0 + \xF8\xCB |0 + \xEA\xD6 |0 + \xF1\xB0 |0 + \xDB\xCE |0 + \xF7\xC3 |0 + \xDB\xCF |0 + \xCB\xA4 |0 + \xF8\xE0 |0 + \xFB\xD7 |0 + \xEB\xCA |0 + \xE0\xA1 |0 + \xCE\xCD |0 + \xD4\xDC |0 + \xFD\xD8 |0 + \xD2\xF6 |0 + \xF2\xB7 |0 + \xFA\xF6 |0 + \xF6\xAA |0 + \xFA\xF7 |0 + \xD8\xE6 |0 + \xF4\xB1 |0 + \xE8\xD2 |0 + \xCA\xC5 |0 + \xCC\xEB |0 + \xE2\xEE |0 + \xE2\xBB |0 + \xF7\xAD |0 + \xF8\xE1 |0 + \xF3\xEC |0 + \xDE\xA1 |0 + \xE4\xFD |0 + \xE3\xEC |0 + \xDD\xAF |0 + \xDD\xB0 |0 + \xCB\xB7 |0 + \xE8\xD3 |0 + \xE1\xA3 |0 + \xD2\xE0 |0 + \xF0\xFE |0 + \xE9\xA6 |0 + \xCB\xF2 |0 + \xED\xF3 |0 + \xDC\xD9 |0 + \xE0\xCD |0 + \xF7\xDA |0 + \xDB\xB9 |0 + \xCC\xAE |0 + \xDA\xDB |0 + \xCD\xC7 |0 + \xDD\xB1 |0 + \xD8\xAF |0 + \xE3\xA3 |0 + \xCE\xEF |0 + \xF2\xF3 |0 + \xF8\xB3 |0 + \xE0\xCE |0 + \xF5\xFD |0 + \xEB\xEC |0 + \xD3\xC5 |0 + \xFC\xEC |0 + \xD2\xDB |0 + \xD4\xEB |0 + \xDE\xA2 |0 + \xE5\xE6 |0 + \xF0\xB0 |0 + \xD5\xC4 |0 + \xED\xF4 |0 + \xE3\xED |0 + \xE8\xC2 |0 + \xED\xF5 |0 + \xD7\xFC |0 + \xED\xBB |0 + \xF6\xAB |0 + \xF2\xB8 |0 + \xF6\xC8 |0 + \xD3\xE6 |0 + \xF2\xDD |0 + \xCF\xBF |0 + \xEB\xAC |0 + \xCF\xC0 |0 + \xE6\xA8 |0 + \xFD\xE9 |0 + \xCF\xC1 |0 + \xE0\xDF |0 + \xDE\xEC |0 + \xE0\xA2 |0 + \xF4\xBF |0 + \xE2\xEF |0 + \xD9\xF1 |0 + \xF1\xC7 |0 + \xCB\xB8 |0 + \xF9\xFE |0 + \xDB\xBA |0 + \xDA\xF5 |0 + \xF6\xEC |0 + \xDA\xDC |0 + \xFA\xE4 |0 + \xE0\xCF |0 + \xDD\xB2 |0 + \xE6\xA9 |0 + \xEF\xF3 |0 + \xF3\xED |0 + \xEB\xFA |0 + \xF9\xE6 |0 + \xCA\xDD |0 + \xD5\xDE |0 + \xCA\xDE |0 + \xDF\xE4 |0 + \xE6\xFD |0 + \xF5\xAC |0 + \xE4\xF5 |0 + \xE9\xE3 |0 + \xED\xCB |0 + \xCF\xE4 |0 + \xD8\xD3 |0 + \xDD\xB3 |0 + \xD4\xEC |0 + \xF2\xB9 |0 + \xDF\xB7 |0 + \xCB\xCE |0 + \xFB\xD8 |0 + \xD0\xD9 |0 + \xDD\xD2 |0 + \xF7\xF4 |0 + \xE7\xDC |0 + \xE4\xA5 |0 + \xFC\xA3 |0 + \xDB\xBB |0 + \xF2\xBA |0 + \xE9\xFD |0 + \xD0\xCA |0 + \xF5\xD6 |0 + \xD9\xC5 |0 + \xE4\xB4 |0 + \xED\xA7 |0 + \xEA\xBD |0 + \xE6\xFE |0 + \xF7\xC4 |0 + \xF5\xAD |0 + \xD9\xE0 |0 + \xCA\xB4 |0 + \xF8\xE2 |0 + \xCF\xC2 |0 + \xEC\xBE |0 + \xE5\xB4 |0 + \xCD\xC8 |0 + \xEE\xC8 |0 + \xE7\xC8 |0 + \xCD\xC9 |0 + \xF9\xB7 |0 + \xF1\xE8 |0 + \xD9\xF2 |0 + \xDB\xF5 |0 + \xCA\xB5 |0 + \xD9\xC6 |0 + \xD8\xC9 |0 + \xD9\xAB |0 + \xED\xBC |0 + \xD8\xD4 |0 + \xDC\xDA |0 + \xE2\xBC |0 + \xFC\xED |0 + \xEC\xE0 |0 + \xD2\xFE |0 + \xE9\xC7 |0 + \xE6\xAA |0 + \xE2\xF0 |0 + \xFA\xBB |0 + \xF5\xAE |0 + \xFB\xAA |0 + \xEC\xFB |0 + \xEC\xBF |0 + \xFC\xD8 |0 + \xD4\xE5 |0 + \xF9\xC3 |0 + \xEE\xE2 |0 + \xD7\xE9 |0 + \xED\xF6 |0 + \xDE\xED |0 + \xCC\xEC |0 + \xE3\xEE |0 + \xE8\xD4 |0 + \xFA\xF8 |0 + \xDD\xB4 |0 + \xE4\xB5 |0 + \xD8\xB0 |0 + \xD8\xD5 |0 + \xF4\xEA |0 + \xCE\xB9 |0 + \xD6\xE1 |0 + \xCF\xD2 |0 + \xD0\xB6 |0 + \xCE\xA2 |0 + \xF3\xEE |0 + \xF3\xF8 |0 + \xDC\xCC |0 + \xD0\xCB |0 + \xFC\xA4 |0 + \xCD\xCA |0 + \xD7\xD4 |0 + \xDE\xA3 |0 + \xE4\xE0 |0 + \xEE\xC9 |0 + \xE2\xDD |0 + \xF5\xFE |0 + \xD4\xAC |0 + \xD5\xD1 |0 + \xD8\xF0 |0 + \xF8\xC3 |0 + \xEA\xD7 |0 + \xF5\xD7 |0 + \xD8\xBF |0 + \xFD\xC0 |0 + \xEB\xAD |0 + \xD5\xAA |0 + \xE7\xA8 |0 + \xEE\xCA |0 + \xCA\xE7 |0 + \xF8\xE3 |0 + \xD4\xDD |0 + \xEA\xD8 |0 + \xFB\xD9 |0 + \xED\xF7 |0 + \xE5\xB5 |0 + \xD0\xAD |0 + \xF1\xF1 |0 + \xE2\xBD |0 + \xE3\xC8 |0 + \xD9\xD5 |0 + \xDF\xAA |0 + \xDB\xBC |0 + \xF8\xE4 |0 + \xF1\xFA |0 + \xE5\xB6 |0 + \xF3\xEF |0 + \xFB\xDA |0 + \xE1\xE0 |0 + \xD9\xAC |0 + \xF5\xEB |0 + \xE0\xB6 |0 + \xE9\xC8 |0 + \xCB\xCF |0 + \xE3\xC9 |0 + \xDE\xEE |0 + \xE2\xBE |0 + \xDC\xEF |0 + \xD6\xA5 |0 + \xE2\xF1 |0 + \xD6\xFE |0 + \xD9\xA1 |0 + \xD8\xC0 |0 + \xDC\xDB |0 + \xED\xBD |0 + \xDF\xB8 |0 + \xEA\xA5 |0 + \xD7\xAD |0 + \xF3\xF9 |0 + \xED\xF8 |0 + \xF5\xC7 |0 + \xE1\xCA |0 + \xEB\xE3 |0 + \xF2\xDE |0 + \xF8\xCC |0 + \xEA\xD9 |0 + \xD3\xC6 |0 + \xDB\xE6 |0 + \xF5\xAF |0 + \xCE\xF0 |0 + \xE9\xFE |0 + \xFB\xB6 |0 + \xE2\xF2 |0 + \xCF\xF2 |0 + \xF7\xB9 |0 + \xD9\xF3 |0 + \xE1\xCB |0 + \xDA\xDD |0 + \xDA\xB9 |0 + \xEB\xFB |0 + \xCB\xB9 |0 + \xED\xF9 |0 + \xE0\xE0 |0 + \xF4\xC0 |0 + \xFD\xBC |0 + \xDF\xB1 |0 + \xE3\xEF |0 + \xE0\xA3 |0 + \xFD\xB9 |0 + \xF0\xB1 |0 + \xCD\xCB |0 + \xED\xBE |0 + \xD5\xC0 |0 + \xE3\xF0 |0 + \xED\xFA |0 + \xE9\xE4 |0 + \xD5\xED |0 + \xE7\xDD |0 + \xD4\xF6 |0 + \xE5\xB7 |0 + \xDB\xE7 |0 + \xE2\xBF |0 + \xEE\xCB |0 + \xD7\xF4 |0 + \xF0\xDD |0 + \xCE\xAB |0 + \xE7\xDE |0 + \xD6\xD6 |0 + \xE1\xCC |0 + \xE8\xB3 |0 + \xE5\xEE |0 + \xDC\xA2 |0 + \xE0\xD0 |0 + \xD5\xB5 |0 + \xD5\xA1 |0 + \xFB\xDB |0 + \xF9\xCB |0 + \xCB\xF3 |0 + \xF4\xA5 |0 + \xFA\xC8 |0 + \xD6\xD7 |0 + \xE9\xE5 |0 + \xFB\xDC |0 + \xFD\xD0 |0 + \xFB\xF6 |0 + \xDA\xA5 |0 + \xDB\xBD |0 + \xEC\xE2 |0 + \xCD\xF7 |0 + \xF0\xDE |0 + \xF6\xC9 |0 + \xDE\xEF |0 + \xD3\xB1 |0 + \xFC\xEE |0 + \xE8\xC3 |0 + \xF1\xC8 |0 + \xCE\xF1 |0 + \xF9\xED |0 + \xF2\xF4 |0 + \xE4\xB6 |0 + \xF5\xB9 |0 + \xDC\xF0 |0 + \xE3\xF1 |0 + \xE8\xA5 |0 + \xF2\xBB |0 + \xDE\xA4 |0 + \xDA\xCC |0 + \xCA\xE9 |0 + \xE3\xDA |0 + \xFC\xD9 |0 + \xEA\xDA |0 + \xF9\xC4 |0 + \xE3\xA4 |0 + \xFB\xDD |0 + \xEF\xCA |0 + \xE8\xC4 |0 + \xD5\xCC |0 + \xEB\xD7 |0 + \xD9\xAD |0 + \xFB\xAB |0 + \xD3\xD9 |0 + \xD5\xA2 |0 + \xF6\xDE |0 + \xDA\xF6 |0 + \xE0\xD1 |0 + \xE9\xA8 |0 + \xF5\xF9 |0 + \xFA\xAF |0 + \xEB\xFC |0 + \xE0\xEA |0 + \xE3\xB2 |0 + \xD5\xC5 |0 + \xF1\xE3 |0 + \xD5\xEE |0 + \xCD\xCC |0 + \xED\xD9 |0 + \xD8\xC1 |0 + \xFA\xEC |0 + \xF1\xEB |0 + \xFA\xBC |0 + \xE6\xE2 |0 + \xFA\xE5 |0 + \xE2\xFA |0 + \xCA\xB6 |0 + \xE4\xB7 |0 + \xEA\xDB |0 + \xF5\xFA |0 + \xFB\xAC |0 + \xCF\xC3 |0 + \xEB\xFD |0 + \xF8\xFA |0 + \xDF\xB9 |0 + \xE1\xF1 |0 + \xD2\xA4 |0 + \xF5\xFB |0 + \xD0\xDA |0 + \xD0\xDB |0 + \xEA\xBE |0 + \xD9\xB1 |0 + \xCA\xB7 |0 + \xD3\xE7 |0 + \xF8\xE5 |0 + \xD3\xB2 |0 + \xE2\xC0 |0 + \xF2\xDF |0 + \xCD\xE5 |0 + \xF9\xAC |0 + \xCD\xCD |0 + \xEE\xAE |0 + \xD6\xAE |0 + \xD7\xEA |0 + \xE7\xE0 |0 + \xEB\xAE |0 + \xCF\xD9 |0 + \xDC\xCD |0 + \xED\xFB |0 + \xDE\xF0 |0 + \xD7\xEB |0 + \xDE\xA5 |0 + \xDF\xD7 |0 + \xDB\xD0 |0 + \xDB\xD1 |0 + \xD5\xA3 |0 + \xF0\xB2 |0 + \xDC\xDC |0 + \xCA\xE8 |0 + \xF8\xE6 |0 + \xDC\xCE |0 + \xEA\xDC |0 + \xDB\xD2 |0 + \xE9\xB3 |0 + \xF7\xDB |0 + \xE3\xA8 |0 + \xD7\xAE |0 + \xE0\xE1 |0 + \xCB\xBA |0 + \xE5\xD1 |0 + \xD0\xDC |0 + \xD5\xC1 |0 + \xD8\xCA |0 + \xE3\xA9 |0 + \xE0\xA4 |0 + \xE9\xA9 |0 + \xD3\xC7 |0 + \xDC\xDD |0 + \xF8\xAE |0 + \xCC\xB8 |0 + \xD0\xAE |0 + \xD8\xF2 |0 + \xE3\xCA |0 + \xCC\xAF |0 + \xD4\xAD |0 + \xF6\xD1 |0 + \xD0\xCC |0 + \xCA\xC6 |0 + \xD5\xC2 |0 + \xCE\xBA |0 + \xCA\xC7 |0 + \xFA\xB0 |0 + \xDF\xD8 |0 + \xF5\xBA |0 + \xE5\xEB |0 + \xEF\xF4 |0 + \xDD\xB5 |0 + \xCD\xAA |0 + \xE3\xF2 |0 + \xFB\xF7 |0 + \xF7\xD0 |0 + \xFD\xBA |0 + \xFD\xE1 |0 + \xF6\xFE |0 + \xD1\xC0 |0 + \xE8\xC5 |0 + \xE4\xB8 |0 + \xE1\xE8 |0 + \xCC\xC1 |0 + \xD2\xED |0 + \xDB\xBE |0 + \xE0\xE2 |0 + \xFA\xC9 |0 + \xE1\xCD |0 + \xCA\xB8 |0 + \xF2\xE0 |0 + \xF1\xC9 |0 + \xDE\xF1 |0 + \xF0\xDF |0 + \xF8\xC4 |0 + \xEE\xCC |0 + \xDE\xF2 |0 + \xE7\xC9 |0 + \xE2\xF3 |0 + \xE7\xE1 |0 + \xE3\xCB |0 + \xE3\xCC |0 + \xCF\xF8 |0 + \xEF\xAC |0 + \xFD\xFE |0 + \xFC\xA5 |0 + \xFA\xB1 |0 + \xDF\xD9 |0 + \xE0\xD2 |0 + \xF4\xDA |0 + \xF1\xCA |0 + \xCE\xA3 |0 + \xF2\xBC |0 + \xEC\xE3 |0 + \xE0\xA5 |0 + \xF7\xAB |0 + \xEB\xAF |0 + \xE5\xDE |0 + \xE1\xA4 |0 + \xCD\xAB |0 + \xD9\xF4 |0 + \xE8\xA6 |0 + \xCD\xCE |0 + \xE1\xE9 |0 + \xFC\xEF |0 + \xE0\xE3 |0 + \xE2\xC1 |0 + \xCE\xA4 |0 + \xDE\xA6 |0 + \xEB\xFE |0 + \xEB\xDD |0 + \xF0\xE0 |0 + \xF4\xDB |0 + \xE2\xF4 |0 + \xD3\xC8 |0 + \xF4\xEB |0 + \xEE\xB5 |0 + \xF5\xD8 |0 + \xD5\xDF |0 + \xD6\xE5 |0 + \xEB\xB0 |0 + \xF4\xE3 |0 + \xE3\xCD |0 + \xF4\xF4 |0 + \xFA\xB2 |0 + \xEF\xF5 |0 + \xCA\xDF |0 + \xEB\xB1 |0 + \xED\xBF |0 + \xFD\xC9 |0 + \xE4\xA6 |0 + \xF9\xA4 |0 + \xF0\xB3 |0 + \xE5\xEC |0 + \xD1\xE7 |0 + \xD9\xC7 |0 + \xE4\xD7 |0 + \xEA\xDD |0 + \xD4\xF7 |0 + \xDA\xBA |0 + \xDA\xCD |0 + \xF9\xCC |0 + \xE1\xDA |0 + \xDB\xBF |0 + \xCC\xC5 |0 + \xEC\xD0 |0 + \xCB\xBB |0 + \xDE\xF3 |0 + \xE9\xAA |0 + \xD9\xC8 |0 + \xEE\xE3 |0 + \xD7\xBD |0 + \xCF\xC4 |0 + \xD0\xCD |0 + \xFC\xA6 |0 + \xF1\xFB |0 + \xFD\xD2 |0 + \xD1\xC1 |0 + \xE3\xDB |0 + \xD3\xC9 |0 + \xDC\xCF |0 + \xCC\xED |0 + \xDE\xA7 |0 + \xE6\xBB |0 + \xEC\xA1 |0 + \xCC\xB9 |0 + \xFB\xDE |0 + \xE7\xE2 |0 + \xD4\xC1 |0 + \xDC\xA8 |0 + \xE2\xC2 |0 + \xF3\xD8 |0 + \xE5\xD3 |0 + \xF3\xD9 |0 + \xF3\xC6 |0 + \xCD\xDB |0 + \xCD\xAC |0 + \xFC\xC3 |0 + \xD4\xE7 |0 + \xD1\xC2 |0 + \xF9\xA5 |0 + \xE8\xD5 |0 + \xE3\xCE |0 + \xD4\xCA |0 + \xDF\xDA |0 + \xFB\xDF |0 + \xE7\xE3 |0 + \xF8\xFB |0 + \xE3\xCF |0 + \xF5\xB0 |0 + \xD8\xE7 |0 + \xD9\xC9 |0 + \xF8\xAF |0 + \xEF\xF6 |0 + \xDD\xB6 |0 + \xEE\xAF |0 + \xCD\xF8 |0 + \xDE\xB8 |0 + \xFC\xA7 |0 + \xF7\xFC |0 + \xF7\xB1 |0 + \xCE\xBB |0 + \xF4\xA1 |0 + \xEE\xCD |0 + \xE1\xAE |0 + \xEC\xC3 |0 + \xCF\xFE |0 + \xF8\xBF |0 + \xD8\xE2 |0 + \xD3\xE8 |0 + \xDE\xA8 |0 + \xF4\xE4 |0 + \xEC\xC2 |0 + \xD9\xF5 |0 + \xF9\xC5 |0 + \xDD\xD3 |0 + \xD6\xF1 |0 + \xEC\xFC |0 + \xFC\xF0 |0 + \xED\xC0 |0 + \xCA\xB9 |0 + \xEE\xE4 |0 + \xF2\xE1 |0 + \xDE\xB9 |0 + \xD6\xF2 |0 + \xDE\xF4 |0 + \xDF\xDB |0 + \xDB\xD3 |0 + \xFA\xE7 |0 + \xD8\xE3 |0 + \xF4\xC1 |0 + \xDD\xB7 |0 + \xF2\xF5 |0 + \xD4\xAE |0 + \xD6\xF3 |0 + \xDD\xB8 |0 + \xCF\xC5 |0 + \xDF\xDF |0 + \xF2\xBE |0 + \xF6\xA1 |0 + \xEB\xCB |0 + \xF1\xFC |0 + \xF3\xC7 |0 + \xE0\xEB |0 + \xED\xFC |0 + \xE1\xDB |0 + \xEE\xE5 |0 + \xDE\xF5 |0 + \xFA\xD3 |0 + \xF1\xCB |0 + \xD0\xAF |0 + \xDD\xB9 |0 + \xD1\xC3 |0 + \xF5\xB1 |0 + \xEA\xC6 |0 + \xF0\xE1 |0 + \xF6\xAC |0 + \xF5\xD9 |0 + \xF0\xEB |0 + \xDD\xBA |0 + \xF2\xBF |0 + \xF7\xC5 |0 + \xDB\xA2 |0 + \xF2\xF6 |0 + \xCA\xBA |0 + \xF7\xF5 |0 + \xCB\xE5 |0 + \xEE\xE6 |0 + \xE0\xD3 |0 + \xCE\xA5 |0 + \xD6\xD8 |0 + \xD4\xAF |0 + \xE9\xC9 |0 + \xD3\xCE |0 + \xF4\xC2 |0 + \xCB\xE6 |0 + \xF1\xA1 |0 + \xEB\xB2 |0 + \xF1\xA2 |0 + \xEB\xB3 |0 + \xF0\xB4 |0 + \xCB\xF4 |0 + \xD4\xB0 |0 + \xF3\xB2 |0 + \xFB\xB7 |0 + \xF5\xEC |0 + \xEE\xE7 |0 + \xF4\xB2 |0 + \xF5\xED |0 + \xCF\xF3 |0 + \xF0\xE2 |0 + \xEE\xCE |0 + \xF1\xCC |0 + \xE5\xB8 |0 + \xD7\xF5 |0 + \xE3\xF3 |0 + \xCF\xE5 |0 + \xCF\xC6 |0 + \xF3\xB3 |0 + \xE4\xD8 |0 + \xCF\xF9 |0 + \xCF\xDA |0 + \xFA\xCD |0 + \xE6\xE3 |0 + \xF2\xE2 |0 + \xF5\xEE |0 + \xCA\xBB |0 + \xE3\xDC |0 + \xCE\xF2 |0 + \xD6\xD9 |0 + \xEE\xB0 |0 + \xF4\xE5 |0 + \xD8\xC2 |0 + \xDC\xD0 |0 + \xCC\xEE |0 + \xD5\xE0 |0 + \xF6\xCA |0 + \xFD\xCA |0 + \xD8\xD6 |0 + \xF4\xCF |0 + \xD6\xA6 |0 + \xDC\xBE |0 + \xDB\xD4 |0 + \xD7\xC7 |0 + \xF2\xFE |0 + \xF1\xCD |0 + \xE2\xC3 |0 + \xDC\xDE |0 + \xDC\xDF |0 + \xEF\xAD |0 + \xE6\xAB |0 + \xF9\xDD |0 + \xEA\xBF |0 + \xEF\xAE |0 + \xF4\xD0 |0 + \xCE\xF3 |0 + \xE6\xAC |0 + \xCE\xDE |0 + \xD5\xF9 |0 + \xE3\xF4 |0 + \xCD\xD0 |0 + \xD5\xB8 |0 + \xF7\xFD |0 + \xDC\xA9 |0 + \xDE\xF6 |0 + \xDC\xAA |0 + \xF2\xE3 |0 + \xE9\xB4 |0 + \xD2\xDC |0 + \xE9\xE6 |0 + \xE3\xF6 |0 + \xE7\xCA |0 + \xD0\xCE |0 + \xDA\xF7 |0 + \xCA\xBC |0 + \xEE\xE8 |0 + \xDA\xDE |0 + \xF2\xF7 |0 + \xE2\xFB |0 + \xCC\xA6 |0 + \xDA\xBB |0 + \xEE\xE9 |0 + \xF5\xDA |0 + \xF7\xDC |0 + \xE1\xEA |0 + \xCE\xC1 |0 + \xD4\xB1 |0 + \xFD\xB1 |0 + \xE6\xBD |0 + \xFB\xAD |0 + \xF8\xE7 |0 + \xE1\xCE |0 + \xF7\xE2 |0 + \xF5\xEF |0 + \xCF\xC7 |0 + \xD4\xB2 |0 + \xCC\xEF |0 + \xD4\xE8 |0 + \xEE\xCF |0 + \xF7\xD7 |0 + \xE0\xA6 |0 + \xD6\xC1 |0 + \xE1\xDC |0 + \xF0\xE3 |0 + \xF1\xE4 |0 + \xDC\xF1 |0 + \xD6\xA7 |0 + \xF4\xF5 |0 + \xF1\xCE |0 + \xF2\xE4 |0 + \xD0\xB0 |0 + \xEC\xEF |0 + \xF9\xBA |0 + \xEB\xB5 |0 + \xD4\xED |0 + \xE2\xC4 |0 + \xE9\xE7 |0 + \xEB\xB4 |0 + \xEA\xA1 |0 + \xF8\xBC |0 + \xCE\xA6 |0 + \xF9\xC6 |0 + \xFC\xDA |0 + \xD4\xB3 |0 + \xD3\xB9 |0 + \xEA\xDE |0 + \xE9\xAB |0 + \xE1\xE1 |0 + \xD3\xCF |0 + \xF4\xF6 |0 + \xEA\xC0 |0 + \xE1\xCF |0 + \xCC\xBA |0 + \xEE\xEA |0 + \xF0\xE4 |0 + \xF3\xB4 |0 + \xD4\xEE |0 + \xF2\xC0 |0 + \xF1\xE5 |0 + \xF4\xC3 |0 + \xE0\xD4 |0 + \xEB\xB6 |0 + \xD7\xA1 |0 + \xCB\xE8 |0 + \xF9\xAD |0 + \xE9\xAD |0 + \xD8\xE4 |0 + \xFA\xB3 |0 + \xE2\xC5 |0 + \xFC\xBD |0 + \xEC\xC4 |0 + \xD8\xB1 |0 + \xDC\xAB |0 + \xD5\xA4 |0 + \xEB\xE9 |0 + \xE8\xBB |0 + \xD8\xD7 |0 + \xFB\xAE |0 + \xD1\xE1 |0 + \xDB\xC0 |0 + \xF5\xBE |0 + \xDE\xF7 |0 + \xCA\xFB |0 + \xF7\xC6 |0 + \xCF\xC8 |0 + \xE1\xD0 |0 + \xEE\xD0 |0 + \xE9\xF4 |0 + \xCE\xF4 |0 + \xD5\xCD |0 + \xCF\xDB |0 + \xDD\xBB |0 + \xCE\xAC |0 + \xE9\xE8 |0 + \xD4\xB4 |0 + \xE4\xC7 |0 + \xF5\xDB |0 + \xFA\xC1 |0 + \xDE\xA9 |0 + \xD4\xF8 |0 + \xEF\xF7 |0 + \xD3\xB3 |0 + \xEB\xB7 |0 + \xEF\xF8 |0 + \xF5\xDC |0 + \xED\xCC |0 + \xDB\xD5 |0 + \xF1\xCF |0 + \xF1\xD0 |0 + \xF5\xB2 |0 + \xD9\xAE |0 + \xD5\xAC |0 + \xE2\xC6 |0 + \xFD\xA3 |0 + \xFB\xE5 |0 + \xDF\xAB |0 + \xE2\xF5 |0 + \xF6\xAD |0 + \xF5\xB3 |0 + \xF0\xB5 |0 + \xE1\xA5 |0 + \xF5\xDD |0 + \xEC\xA2 |0 + \xED\xFD |0 + \xF5\xB4 |0 + \xFB\xB8 |0 + \xDB\xA3 |0 + \xD6\xCA |0 + \xCB\xD9 |0 + \xE5\xD4 |0 + \xF3\xFA |0 + \xEB\xB8 |0 + \xE0\xB7 |0 + \xD7\xEC |0 + \xF1\xEC |0 + \xE5\xAF |0 + \xD5\xE1 |0 + \xD7\xED |0 + \xD1\xD1 |0 + \xE1\xF2 |0 + \xEF\xF9 |0 + \xDD\xBC |0 + \xF6\xDC |0 + \xF0\xE5 |0 + \xF4\xC4 |0 + \xE9\xE9 |0 + \xF3\xFB |0 + \xD4\xEF |0 + \xCC\xA2 |0 + \xF7\xFE |0 + \xDF\xBC |0 + \xEB\xCD |0 + \xD0\xB7 |0 + \xD6\xC2 |0 + \xE8\xAD |0 + \xEF\xAF |0 + \xCB\xA5 |0 + \xCB\xE9 |0 + \xFA\xE8 |0 + \xCC\xC6 |0 + \xE6\xE7 |0 + \xEA\xC7 |0 + \xDB\xA4 |0 + \xCF\xC9 |0 + \xE2\xFC |0 + \xEF\xFA |0 + \xEB\xDE |0 + \xF5\xC8 |0 + \xD4\xDE |0 + \xE0\xD5 |0 + \xEF\xB0 |0 + \xE2\xC7 |0 + \xD9\xAF |0 + \xF9\xE7 |0 + \xE7\xE5 |0 + \xCF\xCA |0 + \xE1\xD1 |0 + \xE2\xC8 |0 + \xEF\xFB |0 + \xFA\xF9 |0 + \xDC\xF2 |0 + \xE0\xA7 |0 + \xF8\xE8 |0 + \xCB\xEA |0 + \xCB\xBC |0 + \xD6\xE2 |0 + \xF5\xDE |0 + \xF5\xDF |0 + \xEE\xB6 |0 + \xE2\xF6 |0 + \xD3\xCA |0 + \xEF\xFC |0 + \xD1\xC4 |0 + \xEF\xB1 |0 + \xD1\xC5 |0 + \xD0\xDE |0 + \xD9\xE1 |0 + \xE0\xB8 |0 + \xCD\xD1 |0 + \xF3\xB9 |0 + \xE7\xCC |0 + \xD6\xA8 |0 + \xCE\xA7 |0 + \xD4\xB5 |0 + \xE4\xC8 |0 + \xD3\xB4 |0 + \xEB\xB9 |0 + \xCB\xF5 |0 + \xF6\xDD |0 + \xF1\xA3 |0 + \xCC\xC7 |0 + \xE9\xCA |0 + \xE1\xF0 |0 + \xF5\xE0 |0 + \xFB\xAF |0 + \xCB\xD1 |0 + \xFB\xE0 |0 + \xF2\xE5 |0 + \xEC\xF0 |0 + \xF0\xEC |0 + \xEE\xEB |0 + \xE9\xCB |0 + \xCC\xF0 |0 + \xD7\xAF |0 + \xF3\xA1 |0 + \xFC\xF5 |0 + \xF1\xA4 |0 + \xE0\xD6 |0 + \xEF\xB2 |0 + \xF4\xD1 |0 + \xF7\xA1 |0 + \xF1\xD1 |0 + \xCA\xFC |0 + \xCA\xFD |0 + \xCE\xCE |0 + \xF3\xC8 |0 + \xF3\xBA |0 + \xED\xFE |0 + \xDA\xA6 |0 + \xE0\xEC |0 + \xF8\xCD |0 + \xCB\xD2 |0 + \xEB\xCE |0 + \xF9\xD8 |0 + \xF9\xD9 |0 + \xCA\xE0 |0 + \xDA\xCA |0 + \xCB\xA6 |0 + \xCA\xC8 |0 + \xF9\xEE |0 + \xDB\xEC |0 + \xD0\xB1 |0 + \xD5\xEF |0 + \xE6\xF3 |0 + \xE7\xA2 |0 + \xE4\xD9 |0 + \xE4\xE1 |0 + \xFC\xC4 |0 + \xF9\xEF |0 + \xCF\xF4 |0 + \xF7\xE6 |0 + \xCE\xBC |0 + \xF4\xC5 |0 + \xDC\xA3 |0 + \xDD\xBD |0 + \xF4\xC6 |0 + \xF8\xA1 |0 + \xE8\xD6 |0 + \xDB\xC1 |0 + \xF0\xE6 |0 + \xE4\xB9 |0 + \xF6\xED |0 + \xF9\xAE |0 + \xDD\xBE |0 + \xD7\xB0 |0 + \xD8\xE8 |0 + \xCB\xBD |0 + \xF9\xDA |0 + \xF8\xCE |0 + \xF9\xF0 |0 + \xE0\xED |0 + \xE3\xB3 |0 + \xF4\xB3 |0 + \xEA\xC2 |0 + \xF2\xE6 |0 + \xF0\xB6 |0 + \xDB\xD6 |0 + \xEB\xE4 |0 + \xF2\xE7 |0 + \xD7\xD5 |0 + \xD4\xB6 |0 + \xF9\xE8 |0 + \xD7\xC1 |0 + \xE5\xD5 |0 + \xE9\xEA |0 + \xD7\xCC |0 + \xD3\xE9 |0 + \xE2\xC9 |0 + \xFC\xDB |0 + \xCD\xAD |0 + \xCC\xB0 |0 + \xEA\xA2 |0 + \xE4\xF6 |0 + \xD0\xC0 |0 + \xF0\xB7 |0 + \xEE\xA1 |0 + \xD7\xF6 |0 + \xE2\xCA |0 + \xE2\xCB |0 + \xFA\xCF |0 + \xEB\xDF |0 + \xD6\xCB |0 + \xF4\xB4 |0 + \xED\xCD |0 + \xE4\xD2 |0 + \xEA\xA9 |0 + \xE4\xBA |0 + \xF3\xA2 |0 + \xCD\xD2 |0 + \xF6\xCB |0 + \xF1\xE6 |0 + \xED\xC1 |0 + \xE8\xBC |0 + \xEE\xD1 |0 + \xF0\xE7 |0 + \xE2\xCC |0 + \xE4\xAA |0 + \xF5\xE1 |0 + \xED\xDA |0 + \xD7\xEE |0 + \xD1\xF1 |0 + \xE9\xEB |0 + \xE9\xEC |0 + \xE0\xE4 |0 + \xDA\xA7 |0 + \xDD\xD4 |0 + \xEA\xA3 |0 + \xD6\xC3 |0 + \xD6\xF4 |0 + \xDA\xDF |0 + \xEF\xB3 |0 + \xE2\xCD |0 + \xEF\xFD |0 + \xF2\xE8 |0 + \xEF\xC5 |0 + \xE7\xE7 |0 + \xD7\xFD |0 + \xE7\xCE |0 + \xDF\xDC |0 + \xF9\xC7 |0 + \xD9\xF6 |0 + \xDF\xAC |0 + \xD6\xDA |0 + \xDC\xA4 |0 + \xF0\xB8 |0 + \xD5\xFA |0 + \xE4\xF7 |0 + \xD6\xC4 |0 + \xF4\xEC |0 + \xEF\xFE |0 + \xF0\xA1 |0 + \xDE\xAA |0 + \xDA\xBC |0 + \xD8\xFC |0 + \xFA\xD4 |0 + \xEC\xE5 |0 + \xFC\xA8 |0 + \xEC\xE6 |0 + \xD8\xCB |0 + \xFB\xB9 |0 + \xE4\xD3 |0 + \xCD\xF9 |0 + \xCF\xD3 |0 + \xCA\xEA |0 + \xCF\xD4 |0 + \xF8\xBD |0 + \xF4\xC7 |0 + \xEA\xDF |0 + \xF9\xDB |0 + \xD4\xB7 |0 + \xEB\xE5 |0 + \xE1\xD2 |0 + \xEA\xA4 |0 + \xFA\xC2 |0 + \xFB\xE1 |0 + \xFA\xED |0 + \xF0\xA2 |0 + \xCC\xF1 |0 + \xFA\xA3 |0 + \xE2\xF7 |0 + \xE2\xCE |0 + \xE9\xF5 |0 + \xE1\xEB |0 + \xE7\xE8 |0 + \xE8\xD7 |0 + \xDA\xF8 |0 + \xD4\xCB |0 + \xF7\xF6 |0 + \xD6\xC5 |0 + \xD4\xE9 |0 + \xFA\xFA |0 + \xCC\xF2 |0 + \xF7\xDD |0 + \xDE\xBA |0 + \xCE\xA8 |0 + \xF0\xB9 |0 + \xE4\xFE |0 + \xE4\xC9 |0 + \xE4\xD4 |0 + \xEA\xC3 |0 + \xEF\xB4 |0 + \xD7\xBE |0 + \xFB\xE2 |0 + \xCD\xD3 |0 + \xEF\xB5 |0 + \xFA\xE9 |0 + \xF9\xA6 |0 + \xDF\xBD |0 + \xF7\xC7 |0 + \xF8\xFD |0 + \xF8\xFC |0 + \xDE\xAB |0 + \xDB\xE8 |0 + \xE3\xDD |0 + \xE1\xE2 |0 + \xD1\xC6 |0 + \xF6\xD0 |0 + \xEB\xE6 |0 + \xDA\xF9 |0 + \xEC\xC7 |0 + \xDE\xF8 |0 + \xF8\xE9 |0 + \xE3\xDE |0 + \xCE\xF5 |0 + \xFA\xC3 |0 + \xE5\xD7 |0 + \xEC\xC8 |0 + \xF3\xC9 |0 + \xE4\xBB |0 + \xE6\xAE |0 + \xEF\xB6 |0 + \xDC\xBF |0 + \xCE\xBD |0 + \xD8\xC3 |0 + \xD0\xCF |0 + \xCF\xFA |0 + \xF3\xCA |0 + \xE0\xD7 |0 + \xD1\xC7 |0 + \xE9\xAE |0 + \xE8\xBD |0 + \xFA\xC4 |0 + \xE2\xCF |0 + \xFA\xC5 |0 + \xF9\xB8 |0 + \xDC\xE0 |0 + \xFB\xB0 |0 + \xD8\xA9 |0 + \xE5\xDF |0 + \xF9\xA7 |0 + \xF6\xEE |0 + \xF6\xCC |0 + \xE2\xF8 |0 + \xEC\xF1 |0 + \xDA\xE0 |0 + \xF1\xD2 |0 + \xD2\xCC |0 + \xCF\xCB |0 + \xCA\xBD |0 + \xDD\xBF |0 + \xF6\xEF |0 + \xDE\xF9 |0 + \xFA\xB4 |0 + \xD5\xAD |0 + \xF1\xE7 |0 + \xDE\xBE |0 + \xDC\xC0 |0 + \xD1\xC8 |0 + \xD1\xC9 |0 + \xF8\xBE |0 + \xCB\xF6 |0 + \xD4\xF9 |0 + \xF5\xE2 |0 + \xE1\xD3 |0 + \xD8\xE9 |0 + \xF8\xFE |0 + \xCF\xCC |0 + \xFD\xA4 |0 + \xCE\xF6 |0 + \xFA\xD0 |0 + \xCC\xF3 |0 + \xE6\xBE |0 + \xF6\xAE |0 + \xD5\xF0 |0 + \xD1\xCA |0 + \xFC\xBE |0 + \xD5\xF1 |0 + \xCD\xE9 |0 + \xFA\xB5 |0 + \xE2\xD0 |0 + \xF4\xF7 |0 + \xCD\xD4 |0 + \xE7\xA3 |0 + \xDB\xA5 |0 + \xE2\xD1 |0 + \xD7\xA2 |0 + \xF7\xE3 |0 + \xEA\xA6 |0 + \xD0\xA1 |0 + \xCE\xDA |0 + \xFB\xEB |0 + \xDB\xA6 |0 + \xDB\xDE |0 + \xD8\xE5 |0 + \xEA\xE0 |0 + \xD8\xAA |0 + \xE5\xE0 |0 + \xD6\xDB |0 + \xEF\xC6 |0 + \xF8\xEA |0 + \xE4\xD5 |0 + \xCE\xF7 |0 + \xE0\xD8 |0 + \xD7\xEF |0 + \xF4\xED |0 + \xCD\xE6 |0 + \xCC\xF4 |0 + \xF5\xE3 |0 + \xE4\xCA |0 + \xDC\xE1 |0 + \xF9\xC8 |0 + \xFC\xBF |0 + \xE8\xA7 |0 + \xD8\xC4 |0 + \xCB\xBE |0 + \xDC\xAE |0 + \xD7\xF7 |0 + \xF0\xE8 |0 + \xDD\xC0 |0 + \xCF\xCD |0 + \xDC\xF3 |0 + \xD9\xB0 |0 + \xE6\xE9 |0 + \xE4\xBC |0 + \xEA\xC4 |0 + \xE4\xEC |0 + \xE4\xE5 |0 + \xFB\xF8 |0 + \xCC\xBB |0 + \xE4\xBD |0 + \xCD\xDC |0 + \xD9\xF7 |0 + \xDD\xDF |0 + \xED\xCE |0 + \xD9\xD0 |0 + \xE5\xA3 |0 + \xF9\xCD |0 + \xCD\xAE |0 + \xCF\xCE |0 + \xF6\xAF |0 + \xFD\xD3 |0 + \xEB\xED |0 + \xD6\xDC |0 + \xE5\xA4 |0 + \xD5\xB6 |0 + \xD6\xDD |0 + \xF9\xE9 |0 + \xE7\xA4 |0 + \xD6\xE3 |0 + \xD1\xCB |0 + \xD6\xE4 |0 + \xD5\xF2 |0 + \xDE\xFA |0 + \xD7\xF8 |0 + \xD8\xEA |0 + \xCF\xD5 |0 + \xD8\xFD |0 + \xD8\xAB |0 + \xFD\xCB |0 + \xFC\xDC |0 + \xE0\xA8 |0 + \xD5\xF3 |0 + \xFD\xD9 |0 + \xCC\xA3 |0 + \xD9\xF9 |0 + \xD3\xEA |0 + \xF5\xF5 |0 + \xEF\xC7 |0 + \xD3\xDA |0 + \xDA\xBD |0 + \xE8\xA8 |0 + \xDC\xAF |0 + \xF0\xA3 |0 + \xCD\xD5 |0 + \xE0\xA9 |0 + \xDE\xAC |0 + \xF0\xBA |0 + \xEE\xB1 |0 + \xEE\xB2 |0 + \xF6\xCD |0 + \xEE\xD2 |0 + \xD6\xC6 |0 + \xE0\xE5 |0 + \xF3\xBB |0 + \xE5\xE1 |0 + \xE4\xCB |0 + \xD7\xA3 |0 + \xDB\xC2 |0 + \xCA\xFE |0 + \xCF\xCF |0 + \xB0\xA1 |0 + \xB0\xA2 |0 + \x81\x41 |0 + \x81\x42 |0 + \xB0\xA3 |0 + \x81\x43 |0 + \x81\x44 |0 + \xB0\xA4 |0 + \xB0\xA5 |0 + \xB0\xA6 |0 + \xB0\xA7 |0 + \x81\x45 |0 + \x81\x46 |0 + \x81\x47 |0 + \x81\x48 |0 + \x81\x49 |0 + \xB0\xA8 |0 + \xB0\xA9 |0 + \xB0\xAA |0 + \xB0\xAB |0 + \xB0\xAC |0 + \xB0\xAD |0 + \xB0\xAE |0 + \xB0\xAF |0 + \x81\x4A |0 + \xB0\xB0 |0 + \xB0\xB1 |0 + \xB0\xB2 |0 + \xB0\xB3 |0 + \xB0\xB4 |0 + \x81\x4B |0 + \x81\x4C |0 + \xB0\xB5 |0 + \x81\x4D |0 + \x81\x4E |0 + \x81\x4F |0 + \xB0\xB6 |0 + \x81\x50 |0 + \x81\x51 |0 + \x81\x52 |0 + \x81\x53 |0 + \x81\x54 |0 + \x81\x55 |0 + \x81\x56 |0 + \xB0\xB7 |0 + \xB0\xB8 |0 + \x81\x57 |0 + \xB0\xB9 |0 + \xB0\xBA |0 + \xB0\xBB |0 + \x81\x58 |0 + \x81\x59 |0 + \x81\x5A |0 + \x81\x61 |0 + \x81\x62 |0 + \x81\x63 |0 + \xB0\xBC |0 + \xB0\xBD |0 + \x81\x64 |0 + \x81\x65 |0 + \xB0\xBE |0 + \x81\x66 |0 + \x81\x67 |0 + \x81\x68 |0 + \xB0\xBF |0 + \x81\x69 |0 + \x81\x6A |0 + \x81\x6B |0 + \x81\x6C |0 + \x81\x6D |0 + \x81\x6E |0 + \x81\x6F |0 + \x81\x70 |0 + \x81\x71 |0 + \x81\x72 |0 + \xB0\xC0 |0 + \x81\x73 |0 + \xB0\xC1 |0 + \x81\x74 |0 + \x81\x75 |0 + \x81\x76 |0 + \x81\x77 |0 + \x81\x78 |0 + \x81\x79 |0 + \xB0\xC2 |0 + \x81\x7A |0 + \x81\x81 |0 + \x81\x82 |0 + \xB0\xC3 |0 + \x81\x83 |0 + \x81\x84 |0 + \x81\x85 |0 + \xB0\xC4 |0 + \x81\x86 |0 + \x81\x87 |0 + \x81\x88 |0 + \x81\x89 |0 + \x81\x8A |0 + \x81\x8B |0 + \x81\x8C |0 + \x81\x8D |0 + \x81\x8E |0 + \x81\x8F |0 + \x81\x90 |0 + \x81\x91 |0 + \x81\x92 |0 + \x81\x93 |0 + \x81\x94 |0 + \x81\x95 |0 + \x81\x96 |0 + \x81\x97 |0 + \x81\x98 |0 + \xB0\xC5 |0 + \xB0\xC6 |0 + \x81\x99 |0 + \x81\x9A |0 + \xB0\xC7 |0 + \x81\x9B |0 + \x81\x9C |0 + \xB0\xC8 |0 + \xB0\xC9 |0 + \x81\x9D |0 + \xB0\xCA |0 + \x81\x9E |0 + \x81\x9F |0 + \x81\xA0 |0 + \x81\xA1 |0 + \x81\xA2 |0 + \xB0\xCB |0 + \xB0\xCC |0 + \x81\xA3 |0 + \xB0\xCD |0 + \xB0\xCE |0 + \xB0\xCF |0 + \xB0\xD0 |0 + \x81\xA4 |0 + \x81\xA5 |0 + \xB0\xD1 |0 + \xB0\xD2 |0 + \xB0\xD3 |0 + \xB0\xD4 |0 + \x81\xA6 |0 + \x81\xA7 |0 + \x81\xA8 |0 + \xB0\xD5 |0 + \x81\xA9 |0 + \x81\xAA |0 + \x81\xAB |0 + \xB0\xD6 |0 + \x81\xAC |0 + \x81\xAD |0 + \x81\xAE |0 + \x81\xAF |0 + \x81\xB0 |0 + \x81\xB1 |0 + \x81\xB2 |0 + \xB0\xD7 |0 + \xB0\xD8 |0 + \x81\xB3 |0 + \xB0\xD9 |0 + \xB0\xDA |0 + \xB0\xDB |0 + \x81\xB4 |0 + \x81\xB5 |0 + \x81\xB6 |0 + \x81\xB7 |0 + \x81\xB8 |0 + \x81\xB9 |0 + \xB0\xDC |0 + \xB0\xDD |0 + \xB0\xDE |0 + \x81\xBA |0 + \xB0\xDF |0 + \x81\xBB |0 + \x81\xBC |0 + \xB0\xE0 |0 + \xB0\xE1 |0 + \x81\xBD |0 + \x81\xBE |0 + \x81\xBF |0 + \x81\xC0 |0 + \x81\xC1 |0 + \x81\xC2 |0 + \x81\xC3 |0 + \xB0\xE2 |0 + \xB0\xE3 |0 + \x81\xC4 |0 + \xB0\xE4 |0 + \xB0\xE5 |0 + \xB0\xE6 |0 + \x81\xC5 |0 + \x81\xC6 |0 + \x81\xC7 |0 + \xB0\xE7 |0 + \x81\xC8 |0 + \x81\xC9 |0 + \xB0\xE8 |0 + \x81\xCA |0 + \x81\xCB |0 + \x81\xCC |0 + \xB0\xE9 |0 + \x81\xCD |0 + \x81\xCE |0 + \x81\xCF |0 + \xB0\xEA |0 + \x81\xD0 |0 + \x81\xD1 |0 + \x81\xD2 |0 + \x81\xD3 |0 + \x81\xD4 |0 + \x81\xD5 |0 + \x81\xD6 |0 + \x81\xD7 |0 + \xB0\xEB |0 + \x81\xD8 |0 + \xB0\xEC |0 + \x81\xD9 |0 + \x81\xDA |0 + \x81\xDB |0 + \x81\xDC |0 + \x81\xDD |0 + \x81\xDE |0 + \x81\xDF |0 + \x81\xE0 |0 + \xB0\xED |0 + \xB0\xEE |0 + \x81\xE1 |0 + \x81\xE2 |0 + \xB0\xEF |0 + \x81\xE3 |0 + \x81\xE4 |0 + \xB0\xF0 |0 + \xB0\xF1 |0 + \x81\xE5 |0 + \xB0\xF2 |0 + \x81\xE6 |0 + \xB0\xF3 |0 + \x81\xE7 |0 + \x81\xE8 |0 + \xB0\xF4 |0 + \xB0\xF5 |0 + \xB0\xF6 |0 + \x81\xE9 |0 + \xB0\xF7 |0 + \x81\xEA |0 + \xB0\xF8 |0 + \xB0\xF9 |0 + \x81\xEB |0 + \x81\xEC |0 + \x81\xED |0 + \x81\xEE |0 + \x81\xEF |0 + \xB0\xFA |0 + \xB0\xFB |0 + \x81\xF0 |0 + \x81\xF1 |0 + \xB0\xFC |0 + \x81\xF2 |0 + \x81\xF3 |0 + \x81\xF4 |0 + \xB0\xFD |0 + \x81\xF5 |0 + \xB0\xFE |0 + \x81\xF6 |0 + \x81\xF7 |0 + \x81\xF8 |0 + \x81\xF9 |0 + \x81\xFA |0 + \xB1\xA1 |0 + \xB1\xA2 |0 + \x81\xFB |0 + \xB1\xA3 |0 + \x81\xFC |0 + \xB1\xA4 |0 + \x81\xFD |0 + \x81\xFE |0 + \x82\x41 |0 + \x82\x42 |0 + \x82\x43 |0 + \x82\x44 |0 + \xB1\xA5 |0 + \x82\x45 |0 + \x82\x46 |0 + \x82\x47 |0 + \xB1\xA6 |0 + \x82\x48 |0 + \x82\x49 |0 + \x82\x4A |0 + \xB1\xA7 |0 + \x82\x4B |0 + \x82\x4C |0 + \x82\x4D |0 + \x82\x4E |0 + \x82\x4F |0 + \x82\x50 |0 + \x82\x51 |0 + \x82\x52 |0 + \xB1\xA8 |0 + \x82\x53 |0 + \x82\x54 |0 + \xB1\xA9 |0 + \xB1\xAA |0 + \x82\x55 |0 + \x82\x56 |0 + \x82\x57 |0 + \x82\x58 |0 + \x82\x59 |0 + \x82\x5A |0 + \xB1\xAB |0 + \xB1\xAC |0 + \x82\x61 |0 + \x82\x62 |0 + \xB1\xAD |0 + \x82\x63 |0 + \x82\x64 |0 + \x82\x65 |0 + \xB1\xAE |0 + \x82\x66 |0 + \x82\x67 |0 + \x82\x68 |0 + \x82\x69 |0 + \x82\x6A |0 + \x82\x6B |0 + \x82\x6C |0 + \xB1\xAF |0 + \xB1\xB0 |0 + \x82\x6D |0 + \xB1\xB1 |0 + \x82\x6E |0 + \xB1\xB2 |0 + \x82\x6F |0 + \x82\x70 |0 + \x82\x71 |0 + \x82\x72 |0 + \x82\x73 |0 + \x82\x74 |0 + \xB1\xB3 |0 + \x82\x75 |0 + \x82\x76 |0 + \x82\x77 |0 + \xB1\xB4 |0 + \x82\x78 |0 + \x82\x79 |0 + \x82\x7A |0 + \xB1\xB5 |0 + \x82\x81 |0 + \x82\x82 |0 + \x82\x83 |0 + \x82\x84 |0 + \x82\x85 |0 + \x82\x86 |0 + \x82\x87 |0 + \x82\x88 |0 + \xB1\xB6 |0 + \x82\x89 |0 + \xB1\xB7 |0 + \x82\x8A |0 + \x82\x8B |0 + \x82\x8C |0 + \x82\x8D |0 + \x82\x8E |0 + \x82\x8F |0 + \x82\x90 |0 + \x82\x91 |0 + \xB1\xB8 |0 + \xB1\xB9 |0 + \x82\x92 |0 + \x82\x93 |0 + \xB1\xBA |0 + \x82\x94 |0 + \x82\x95 |0 + \xB1\xBB |0 + \xB1\xBC |0 + \xB1\xBD |0 + \xB1\xBE |0 + \x82\x96 |0 + \x82\x97 |0 + \x82\x98 |0 + \x82\x99 |0 + \xB1\xBF |0 + \xB1\xC0 |0 + \xB1\xC1 |0 + \x82\x9A |0 + \xB1\xC2 |0 + \x82\x9B |0 + \xB1\xC3 |0 + \xB1\xC4 |0 + \x82\x9C |0 + \x82\x9D |0 + \x82\x9E |0 + \x82\x9F |0 + \x82\xA0 |0 + \xB1\xC5 |0 + \xB1\xC6 |0 + \x82\xA1 |0 + \x82\xA2 |0 + \xB1\xC7 |0 + \x82\xA3 |0 + \x82\xA4 |0 + \x82\xA5 |0 + \xB1\xC8 |0 + \x82\xA6 |0 + \x82\xA7 |0 + \x82\xA8 |0 + \x82\xA9 |0 + \x82\xAA |0 + \x82\xAB |0 + \x82\xAC |0 + \x82\xAD |0 + \x82\xAE |0 + \x82\xAF |0 + \x82\xB0 |0 + \xB1\xC9 |0 + \xB1\xCA |0 + \x82\xB1 |0 + \x82\xB2 |0 + \x82\xB3 |0 + \x82\xB4 |0 + \x82\xB5 |0 + \x82\xB6 |0 + \xB1\xCB |0 + \x82\xB7 |0 + \x82\xB8 |0 + \x82\xB9 |0 + \x82\xBA |0 + \x82\xBB |0 + \x82\xBC |0 + \x82\xBD |0 + \x82\xBE |0 + \x82\xBF |0 + \x82\xC0 |0 + \x82\xC1 |0 + \x82\xC2 |0 + \x82\xC3 |0 + \x82\xC4 |0 + \x82\xC5 |0 + \x82\xC6 |0 + \x82\xC7 |0 + \x82\xC8 |0 + \xB1\xCC |0 + \x82\xC9 |0 + \x82\xCA |0 + \x82\xCB |0 + \x82\xCC |0 + \x82\xCD |0 + \x82\xCE |0 + \x82\xCF |0 + \x82\xD0 |0 + \xB1\xCD |0 + \xB1\xCE |0 + \x82\xD1 |0 + \x82\xD2 |0 + \xB1\xCF |0 + \x82\xD3 |0 + \x82\xD4 |0 + \x82\xD5 |0 + \xB1\xD0 |0 + \x82\xD6 |0 + \x82\xD7 |0 + \x82\xD8 |0 + \x82\xD9 |0 + \x82\xDA |0 + \x82\xDB |0 + \x82\xDC |0 + \xB1\xD1 |0 + \xB1\xD2 |0 + \x82\xDD |0 + \xB1\xD3 |0 + \x82\xDE |0 + \x82\xDF |0 + \x82\xE0 |0 + \x82\xE1 |0 + \x82\xE2 |0 + \x82\xE3 |0 + \x82\xE4 |0 + \x82\xE5 |0 + \xB1\xD4 |0 + \x82\xE6 |0 + \x82\xE7 |0 + \x82\xE8 |0 + \xB1\xD5 |0 + \x82\xE9 |0 + \x82\xEA |0 + \x82\xEB |0 + \xB1\xD6 |0 + \x82\xEC |0 + \x82\xED |0 + \x82\xEE |0 + \x82\xEF |0 + \x82\xF0 |0 + \x82\xF1 |0 + \x82\xF2 |0 + \x82\xF3 |0 + \x82\xF4 |0 + \x82\xF5 |0 + \x82\xF6 |0 + \x82\xF7 |0 + \x82\xF8 |0 + \x82\xF9 |0 + \x82\xFA |0 + \x82\xFB |0 + \x82\xFC |0 + \x82\xFD |0 + \x82\xFE |0 + \xB1\xD7 |0 + \xB1\xD8 |0 + \x83\x41 |0 + \x83\x42 |0 + \xB1\xD9 |0 + \x83\x43 |0 + \x83\x44 |0 + \xB1\xDA |0 + \xB1\xDB |0 + \xB1\xDC |0 + \x83\x45 |0 + \x83\x46 |0 + \x83\x47 |0 + \x83\x48 |0 + \x83\x49 |0 + \x83\x4A |0 + \xB1\xDD |0 + \xB1\xDE |0 + \x83\x4B |0 + \xB1\xDF |0 + \x83\x4C |0 + \xB1\xE0 |0 + \x83\x4D |0 + \x83\x4E |0 + \x83\x4F |0 + \x83\x50 |0 + \x83\x51 |0 + \x83\x52 |0 + \xB1\xE1 |0 + \x83\x53 |0 + \x83\x54 |0 + \x83\x55 |0 + \x83\x56 |0 + \x83\x57 |0 + \x83\x58 |0 + \x83\x59 |0 + \x83\x5A |0 + \x83\x61 |0 + \x83\x62 |0 + \x83\x63 |0 + \x83\x64 |0 + \x83\x65 |0 + \x83\x66 |0 + \x83\x67 |0 + \x83\x68 |0 + \x83\x69 |0 + \x83\x6A |0 + \x83\x6B |0 + \x83\x6C |0 + \x83\x6D |0 + \x83\x6E |0 + \x83\x6F |0 + \x83\x70 |0 + \x83\x71 |0 + \x83\x72 |0 + \x83\x73 |0 + \xB1\xE2 |0 + \xB1\xE3 |0 + \x83\x74 |0 + \x83\x75 |0 + \xB1\xE4 |0 + \x83\x76 |0 + \x83\x77 |0 + \xB1\xE5 |0 + \xB1\xE6 |0 + \x83\x78 |0 + \xB1\xE7 |0 + \x83\x79 |0 + \x83\x7A |0 + \x83\x81 |0 + \x83\x82 |0 + \x83\x83 |0 + \xB1\xE8 |0 + \xB1\xE9 |0 + \x83\x84 |0 + \xB1\xEA |0 + \x83\x85 |0 + \xB1\xEB |0 + \xB1\xEC |0 + \x83\x86 |0 + \x83\x87 |0 + \x83\x88 |0 + \xB1\xED |0 + \x83\x89 |0 + \xB1\xEE |0 + \xB1\xEF |0 + \xB1\xF0 |0 + \x83\x8A |0 + \xB1\xF1 |0 + \x83\x8B |0 + \x83\x8C |0 + \x83\x8D |0 + \xB1\xF2 |0 + \x83\x8E |0 + \xB1\xF3 |0 + \x83\x8F |0 + \x83\x90 |0 + \x83\x91 |0 + \x83\x92 |0 + \x83\x93 |0 + \xB1\xF4 |0 + \xB1\xF5 |0 + \x83\x94 |0 + \xB1\xF6 |0 + \xB1\xF7 |0 + \xB1\xF8 |0 + \x83\x95 |0 + \x83\x96 |0 + \x83\x97 |0 + \xB1\xF9 |0 + \x83\x98 |0 + \x83\x99 |0 + \xB1\xFA |0 + \xB1\xFB |0 + \x83\x9A |0 + \x83\x9B |0 + \xB1\xFC |0 + \x83\x9C |0 + \x83\x9D |0 + \x83\x9E |0 + \xB1\xFD |0 + \x83\x9F |0 + \x83\xA0 |0 + \x83\xA1 |0 + \x83\xA2 |0 + \x83\xA3 |0 + \x83\xA4 |0 + \x83\xA5 |0 + \xB1\xFE |0 + \xB2\xA1 |0 + \x83\xA6 |0 + \xB2\xA2 |0 + \xB2\xA3 |0 + \xB2\xA4 |0 + \x83\xA7 |0 + \x83\xA8 |0 + \x83\xA9 |0 + \x83\xAA |0 + \x83\xAB |0 + \x83\xAC |0 + \xB2\xA5 |0 + \xB2\xA6 |0 + \x83\xAD |0 + \x83\xAE |0 + \x83\xAF |0 + \x83\xB0 |0 + \x83\xB1 |0 + \x83\xB2 |0 + \xB2\xA7 |0 + \x83\xB3 |0 + \x83\xB4 |0 + \x83\xB5 |0 + \x83\xB6 |0 + \x83\xB7 |0 + \x83\xB8 |0 + \x83\xB9 |0 + \x83\xBA |0 + \x83\xBB |0 + \x83\xBC |0 + \x83\xBD |0 + \x83\xBE |0 + \x83\xBF |0 + \x83\xC0 |0 + \x83\xC1 |0 + \x83\xC2 |0 + \x83\xC3 |0 + \x83\xC4 |0 + \x83\xC5 |0 + \x83\xC6 |0 + \x83\xC7 |0 + \x83\xC8 |0 + \x83\xC9 |0 + \x83\xCA |0 + \x83\xCB |0 + \x83\xCC |0 + \x83\xCD |0 + \x83\xCE |0 + \x83\xCF |0 + \x83\xD0 |0 + \x83\xD1 |0 + \x83\xD2 |0 + \x83\xD3 |0 + \x83\xD4 |0 + \x83\xD5 |0 + \x83\xD6 |0 + \x83\xD7 |0 + \x83\xD8 |0 + \x83\xD9 |0 + \x83\xDA |0 + \x83\xDB |0 + \x83\xDC |0 + \x83\xDD |0 + \x83\xDE |0 + \x83\xDF |0 + \x83\xE0 |0 + \x83\xE1 |0 + \xB2\xA8 |0 + \xB2\xA9 |0 + \xB2\xAA |0 + \x83\xE2 |0 + \xB2\xAB |0 + \x83\xE3 |0 + \x83\xE4 |0 + \x83\xE5 |0 + \xB2\xAC |0 + \x83\xE6 |0 + \x83\xE7 |0 + \x83\xE8 |0 + \x83\xE9 |0 + \x83\xEA |0 + \x83\xEB |0 + \x83\xEC |0 + \xB2\xAD |0 + \xB2\xAE |0 + \x83\xED |0 + \xB2\xAF |0 + \xB2\xB0 |0 + \xB2\xB1 |0 + \x83\xEE |0 + \x83\xEF |0 + \x83\xF0 |0 + \x83\xF1 |0 + \x83\xF2 |0 + \x83\xF3 |0 + \xB2\xB2 |0 + \xB2\xB3 |0 + \x83\xF4 |0 + \x83\xF5 |0 + \xB2\xB4 |0 + \x83\xF6 |0 + \x83\xF7 |0 + \x83\xF8 |0 + \x83\xF9 |0 + \x83\xFA |0 + \x83\xFB |0 + \x83\xFC |0 + \x83\xFD |0 + \x83\xFE |0 + \x84\x41 |0 + \x84\x42 |0 + \xB2\xB5 |0 + \x84\x43 |0 + \x84\x44 |0 + \xB2\xB6 |0 + \x84\x45 |0 + \xB2\xB7 |0 + \x84\x46 |0 + \x84\x47 |0 + \x84\x48 |0 + \x84\x49 |0 + \x84\x4A |0 + \x84\x4B |0 + \xB2\xB8 |0 + \x84\x4C |0 + \x84\x4D |0 + \x84\x4E |0 + \xB2\xB9 |0 + \x84\x4F |0 + \x84\x50 |0 + \x84\x51 |0 + \xB2\xBA |0 + \x84\x52 |0 + \x84\x53 |0 + \x84\x54 |0 + \x84\x55 |0 + \x84\x56 |0 + \x84\x57 |0 + \x84\x58 |0 + \x84\x59 |0 + \x84\x5A |0 + \x84\x61 |0 + \xB2\xBB |0 + \xB2\xBC |0 + \x84\x62 |0 + \x84\x63 |0 + \x84\x64 |0 + \x84\x65 |0 + \xB2\xBD |0 + \x84\x66 |0 + \x84\x67 |0 + \xB2\xBE |0 + \x84\x68 |0 + \x84\x69 |0 + \x84\x6A |0 + \x84\x6B |0 + \x84\x6C |0 + \x84\x6D |0 + \x84\x6E |0 + \x84\x6F |0 + \x84\x70 |0 + \x84\x71 |0 + \x84\x72 |0 + \x84\x73 |0 + \x84\x74 |0 + \x84\x75 |0 + \x84\x76 |0 + \x84\x77 |0 + \x84\x78 |0 + \x84\x79 |0 + \x84\x7A |0 + \x84\x81 |0 + \x84\x82 |0 + \x84\x83 |0 + \x84\x84 |0 + \x84\x85 |0 + \x84\x86 |0 + \x84\x87 |0 + \x84\x88 |0 + \xB2\xBF |0 + \xB2\xC0 |0 + \x84\x89 |0 + \x84\x8A |0 + \xB2\xC1 |0 + \x84\x8B |0 + \xB2\xC2 |0 + \x84\x8C |0 + \xB2\xC3 |0 + \x84\x8D |0 + \x84\x8E |0 + \x84\x8F |0 + \x84\x90 |0 + \x84\x91 |0 + \x84\x92 |0 + \x84\x93 |0 + \xB2\xC4 |0 + \xB2\xC5 |0 + \x84\x94 |0 + \xB2\xC6 |0 + \x84\x95 |0 + \xB2\xC7 |0 + \xB2\xC8 |0 + \xB2\xC9 |0 + \x84\x96 |0 + \x84\x97 |0 + \x84\x98 |0 + \x84\x99 |0 + \xB2\xCA |0 + \xB2\xCB |0 + \x84\x9A |0 + \x84\x9B |0 + \x84\x9C |0 + \x84\x9D |0 + \x84\x9E |0 + \x84\x9F |0 + \xB2\xCC |0 + \x84\xA0 |0 + \x84\xA1 |0 + \x84\xA2 |0 + \x84\xA3 |0 + \x84\xA4 |0 + \x84\xA5 |0 + \x84\xA6 |0 + \x84\xA7 |0 + \x84\xA8 |0 + \x84\xA9 |0 + \x84\xAA |0 + \xB2\xCD |0 + \xB2\xCE |0 + \x84\xAB |0 + \x84\xAC |0 + \x84\xAD |0 + \x84\xAE |0 + \x84\xAF |0 + \x84\xB0 |0 + \xB2\xCF |0 + \xB2\xD0 |0 + \x84\xB1 |0 + \x84\xB2 |0 + \x84\xB3 |0 + \x84\xB4 |0 + \x84\xB5 |0 + \x84\xB6 |0 + \x84\xB7 |0 + \x84\xB8 |0 + \x84\xB9 |0 + \x84\xBA |0 + \x84\xBB |0 + \x84\xBC |0 + \x84\xBD |0 + \x84\xBE |0 + \x84\xBF |0 + \x84\xC0 |0 + \x84\xC1 |0 + \x84\xC2 |0 + \x84\xC3 |0 + \xB2\xD1 |0 + \x84\xC4 |0 + \x84\xC5 |0 + \x84\xC6 |0 + \x84\xC7 |0 + \x84\xC8 |0 + \x84\xC9 |0 + \xB2\xD2 |0 + \x84\xCA |0 + \x84\xCB |0 + \x84\xCC |0 + \xB2\xD3 |0 + \x84\xCD |0 + \x84\xCE |0 + \x84\xCF |0 + \xB2\xD4 |0 + \x84\xD0 |0 + \x84\xD1 |0 + \x84\xD2 |0 + \x84\xD3 |0 + \x84\xD4 |0 + \x84\xD5 |0 + \x84\xD6 |0 + \xB2\xD5 |0 + \xB2\xD6 |0 + \x84\xD7 |0 + \x84\xD8 |0 + \x84\xD9 |0 + \xB2\xD7 |0 + \x84\xDA |0 + \x84\xDB |0 + \x84\xDC |0 + \x84\xDD |0 + \x84\xDE |0 + \x84\xDF |0 + \xB2\xD8 |0 + \x84\xE0 |0 + \x84\xE1 |0 + \x84\xE2 |0 + \x84\xE3 |0 + \x84\xE4 |0 + \x84\xE5 |0 + \x84\xE6 |0 + \x84\xE7 |0 + \x84\xE8 |0 + \x84\xE9 |0 + \x84\xEA |0 + \x84\xEB |0 + \x84\xEC |0 + \x84\xED |0 + \x84\xEE |0 + \x84\xEF |0 + \x84\xF0 |0 + \x84\xF1 |0 + \x84\xF2 |0 + \x84\xF3 |0 + \x84\xF4 |0 + \x84\xF5 |0 + \x84\xF6 |0 + \x84\xF7 |0 + \x84\xF8 |0 + \x84\xF9 |0 + \x84\xFA |0 + \xB2\xD9 |0 + \xB2\xDA |0 + \x84\xFB |0 + \x84\xFC |0 + \xB2\xDB |0 + \x84\xFD |0 + \x84\xFE |0 + \x85\x41 |0 + \xB2\xDC |0 + \x85\x42 |0 + \x85\x43 |0 + \x85\x44 |0 + \x85\x45 |0 + \x85\x46 |0 + \x85\x47 |0 + \xB2\xDD |0 + \xB2\xDE |0 + \xB2\xDF |0 + \x85\x48 |0 + \xB2\xE0 |0 + \x85\x49 |0 + \xB2\xE1 |0 + \xB2\xE2 |0 + \x85\x4A |0 + \x85\x4B |0 + \x85\x4C |0 + \x85\x4D |0 + \x85\x4E |0 + \xB2\xE3 |0 + \x85\x4F |0 + \x85\x50 |0 + \x85\x51 |0 + \x85\x52 |0 + \x85\x53 |0 + \x85\x54 |0 + \x85\x55 |0 + \xB2\xE4 |0 + \x85\x56 |0 + \x85\x57 |0 + \x85\x58 |0 + \x85\x59 |0 + \x85\x5A |0 + \x85\x61 |0 + \x85\x62 |0 + \x85\x63 |0 + \x85\x64 |0 + \x85\x65 |0 + \x85\x66 |0 + \xB2\xE5 |0 + \xB2\xE6 |0 + \x85\x67 |0 + \x85\x68 |0 + \x85\x69 |0 + \x85\x6A |0 + \x85\x6B |0 + \x85\x6C |0 + \xB2\xE7 |0 + \xB2\xE8 |0 + \x85\x6D |0 + \x85\x6E |0 + \xB2\xE9 |0 + \x85\x6F |0 + \x85\x70 |0 + \x85\x71 |0 + \xB2\xEA |0 + \x85\x72 |0 + \x85\x73 |0 + \x85\x74 |0 + \x85\x75 |0 + \x85\x76 |0 + \x85\x77 |0 + \x85\x78 |0 + \xB2\xEB |0 + \xB2\xEC |0 + \x85\x79 |0 + \x85\x7A |0 + \xB2\xED |0 + \x85\x81 |0 + \x85\x82 |0 + \x85\x83 |0 + \x85\x84 |0 + \x85\x85 |0 + \x85\x86 |0 + \x85\x87 |0 + \xB2\xEE |0 + \x85\x88 |0 + \x85\x89 |0 + \x85\x8A |0 + \xB2\xEF |0 + \x85\x8B |0 + \x85\x8C |0 + \x85\x8D |0 + \xB2\xF0 |0 + \x85\x8E |0 + \x85\x8F |0 + \x85\x90 |0 + \x85\x91 |0 + \x85\x92 |0 + \x85\x93 |0 + \x85\x94 |0 + \xB2\xF1 |0 + \xB2\xF2 |0 + \x85\x95 |0 + \x85\x96 |0 + \x85\x97 |0 + \x85\x98 |0 + \x85\x99 |0 + \x85\x9A |0 + \x85\x9B |0 + \x85\x9C |0 + \x85\x9D |0 + \x85\x9E |0 + \xB2\xF3 |0 + \x85\x9F |0 + \x85\xA0 |0 + \x85\xA1 |0 + \x85\xA2 |0 + \x85\xA3 |0 + \x85\xA4 |0 + \x85\xA5 |0 + \x85\xA6 |0 + \x85\xA7 |0 + \x85\xA8 |0 + \x85\xA9 |0 + \x85\xAA |0 + \x85\xAB |0 + \x85\xAC |0 + \x85\xAD |0 + \x85\xAE |0 + \x85\xAF |0 + \x85\xB0 |0 + \x85\xB1 |0 + \x85\xB2 |0 + \x85\xB3 |0 + \x85\xB4 |0 + \x85\xB5 |0 + \x85\xB6 |0 + \x85\xB7 |0 + \x85\xB8 |0 + \x85\xB9 |0 + \xB2\xF4 |0 + \xB2\xF5 |0 + \x85\xBA |0 + \x85\xBB |0 + \xB2\xF6 |0 + \x85\xBC |0 + \xB2\xF7 |0 + \x85\xBD |0 + \xB2\xF8 |0 + \x85\xBE |0 + \xB2\xF9 |0 + \x85\xBF |0 + \x85\xC0 |0 + \x85\xC1 |0 + \x85\xC2 |0 + \xB2\xFA |0 + \xB2\xFB |0 + \xB2\xFC |0 + \x85\xC3 |0 + \xB2\xFD |0 + \x85\xC4 |0 + \xB2\xFE |0 + \x85\xC5 |0 + \x85\xC6 |0 + \x85\xC7 |0 + \xB3\xA1 |0 + \x85\xC8 |0 + \x85\xC9 |0 + \x85\xCA |0 + \x85\xCB |0 + \x85\xCC |0 + \x85\xCD |0 + \x85\xCE |0 + \x85\xCF |0 + \x85\xD0 |0 + \x85\xD1 |0 + \x85\xD2 |0 + \x85\xD3 |0 + \x85\xD4 |0 + \x85\xD5 |0 + \x85\xD6 |0 + \x85\xD7 |0 + \x85\xD8 |0 + \x85\xD9 |0 + \x85\xDA |0 + \x85\xDB |0 + \x85\xDC |0 + \x85\xDD |0 + \x85\xDE |0 + \x85\xDF |0 + \x85\xE0 |0 + \x85\xE1 |0 + \x85\xE2 |0 + \x85\xE3 |0 + \x85\xE4 |0 + \x85\xE5 |0 + \xB3\xA2 |0 + \xB3\xA3 |0 + \x85\xE6 |0 + \x85\xE7 |0 + \xB3\xA4 |0 + \x85\xE8 |0 + \x85\xE9 |0 + \x85\xEA |0 + \xB3\xA5 |0 + \x85\xEB |0 + \x85\xEC |0 + \x85\xED |0 + \x85\xEE |0 + \x85\xEF |0 + \x85\xF0 |0 + \x85\xF1 |0 + \xB3\xA6 |0 + \xB3\xA7 |0 + \x85\xF2 |0 + \xB3\xA8 |0 + \x85\xF3 |0 + \xB3\xA9 |0 + \x85\xF4 |0 + \x85\xF5 |0 + \x85\xF6 |0 + \x85\xF7 |0 + \x85\xF8 |0 + \x85\xF9 |0 + \xB3\xAA |0 + \xB3\xAB |0 + \xB3\xAC |0 + \x85\xFA |0 + \xB3\xAD |0 + \x85\xFB |0 + \x85\xFC |0 + \xB3\xAE |0 + \xB3\xAF |0 + \xB3\xB0 |0 + \xB3\xB1 |0 + \x85\xFD |0 + \x85\xFE |0 + \x86\x41 |0 + \x86\x42 |0 + \x86\x43 |0 + \xB3\xB2 |0 + \xB3\xB3 |0 + \x86\x44 |0 + \xB3\xB4 |0 + \xB3\xB5 |0 + \xB3\xB6 |0 + \xB3\xB7 |0 + \xB3\xB8 |0 + \x86\x45 |0 + \xB3\xB9 |0 + \x86\x46 |0 + \xB3\xBA |0 + \xB3\xBB |0 + \xB3\xBC |0 + \x86\x47 |0 + \x86\x48 |0 + \xB3\xBD |0 + \x86\x49 |0 + \x86\x4A |0 + \x86\x4B |0 + \xB3\xBE |0 + \x86\x4C |0 + \x86\x4D |0 + \x86\x4E |0 + \x86\x4F |0 + \x86\x50 |0 + \x86\x51 |0 + \x86\x52 |0 + \xB3\xBF |0 + \xB3\xC0 |0 + \x86\x53 |0 + \xB3\xC1 |0 + \xB3\xC2 |0 + \xB3\xC3 |0 + \x86\x54 |0 + \x86\x55 |0 + \x86\x56 |0 + \x86\x57 |0 + \x86\x58 |0 + \x86\x59 |0 + \xB3\xC4 |0 + \xB3\xC5 |0 + \x86\x5A |0 + \x86\x61 |0 + \xB3\xC6 |0 + \x86\x62 |0 + \x86\x63 |0 + \x86\x64 |0 + \xB3\xC7 |0 + \x86\x65 |0 + \x86\x66 |0 + \x86\x67 |0 + \x86\x68 |0 + \x86\x69 |0 + \x86\x6A |0 + \x86\x6B |0 + \xB3\xC8 |0 + \x86\x6C |0 + \x86\x6D |0 + \x86\x6E |0 + \x86\x6F |0 + \xB3\xC9 |0 + \x86\x70 |0 + \x86\x71 |0 + \x86\x72 |0 + \x86\x73 |0 + \x86\x74 |0 + \x86\x75 |0 + \x86\x76 |0 + \x86\x77 |0 + \x86\x78 |0 + \x86\x79 |0 + \x86\x7A |0 + \x86\x81 |0 + \x86\x82 |0 + \x86\x83 |0 + \x86\x84 |0 + \x86\x85 |0 + \x86\x86 |0 + \x86\x87 |0 + \x86\x88 |0 + \x86\x89 |0 + \x86\x8A |0 + \x86\x8B |0 + \x86\x8C |0 + \x86\x8D |0 + \x86\x8E |0 + \x86\x8F |0 + \x86\x90 |0 + \x86\x91 |0 + \x86\x92 |0 + \x86\x93 |0 + \x86\x94 |0 + \x86\x95 |0 + \x86\x96 |0 + \x86\x97 |0 + \xB3\xCA |0 + \xB3\xCB |0 + \x86\x98 |0 + \xB3\xCC |0 + \xB3\xCD |0 + \x86\x99 |0 + \x86\x9A |0 + \x86\x9B |0 + \xB3\xCE |0 + \x86\x9C |0 + \xB3\xCF |0 + \xB3\xD0 |0 + \x86\x9D |0 + \x86\x9E |0 + \x86\x9F |0 + \x86\xA0 |0 + \xB3\xD1 |0 + \xB3\xD2 |0 + \x86\xA1 |0 + \xB3\xD3 |0 + \xB3\xD4 |0 + \xB3\xD5 |0 + \x86\xA2 |0 + \x86\xA3 |0 + \x86\xA4 |0 + \x86\xA5 |0 + \x86\xA6 |0 + \xB3\xD6 |0 + \xB3\xD7 |0 + \xB3\xD8 |0 + \x86\xA7 |0 + \x86\xA8 |0 + \xB3\xD9 |0 + \x86\xA9 |0 + \x86\xAA |0 + \x86\xAB |0 + \xB3\xDA |0 + \x86\xAC |0 + \x86\xAD |0 + \x86\xAE |0 + \x86\xAF |0 + \x86\xB0 |0 + \x86\xB1 |0 + \x86\xB2 |0 + \xB3\xDB |0 + \xB3\xDC |0 + \x86\xB3 |0 + \xB3\xDD |0 + \xB3\xDE |0 + \xB3\xDF |0 + \x86\xB4 |0 + \x86\xB5 |0 + \x86\xB6 |0 + \x86\xB7 |0 + \x86\xB8 |0 + \x86\xB9 |0 + \xB3\xE0 |0 + \xB3\xE1 |0 + \x86\xBA |0 + \x86\xBB |0 + \xB3\xE2 |0 + \x86\xBC |0 + \x86\xBD |0 + \x86\xBE |0 + \xB3\xE3 |0 + \x86\xBF |0 + \x86\xC0 |0 + \x86\xC1 |0 + \x86\xC2 |0 + \x86\xC3 |0 + \x86\xC4 |0 + \x86\xC5 |0 + \xB3\xE4 |0 + \xB3\xE5 |0 + \x86\xC6 |0 + \x86\xC7 |0 + \xB3\xE6 |0 + \xB3\xE7 |0 + \x86\xC8 |0 + \x86\xC9 |0 + \xB3\xE8 |0 + \x86\xCA |0 + \x86\xCB |0 + \x86\xCC |0 + \xB3\xE9 |0 + \x86\xCD |0 + \x86\xCE |0 + \x86\xCF |0 + \xB3\xEA |0 + \x86\xD0 |0 + \x86\xD1 |0 + \x86\xD2 |0 + \x86\xD3 |0 + \x86\xD4 |0 + \x86\xD5 |0 + \x86\xD6 |0 + \x86\xD7 |0 + \x86\xD8 |0 + \x86\xD9 |0 + \x86\xDA |0 + \x86\xDB |0 + \x86\xDC |0 + \x86\xDD |0 + \x86\xDE |0 + \x86\xDF |0 + \x86\xE0 |0 + \x86\xE1 |0 + \x86\xE2 |0 + \x86\xE3 |0 + \x86\xE4 |0 + \x86\xE5 |0 + \x86\xE6 |0 + \xB3\xEB |0 + \xB3\xEC |0 + \x86\xE7 |0 + \x86\xE8 |0 + \xB3\xED |0 + \x86\xE9 |0 + \x86\xEA |0 + \x86\xEB |0 + \xB3\xEE |0 + \x86\xEC |0 + \xB3\xEF |0 + \x86\xED |0 + \x86\xEE |0 + \x86\xEF |0 + \x86\xF0 |0 + \x86\xF1 |0 + \xB3\xF0 |0 + \xB3\xF1 |0 + \x86\xF2 |0 + \xB3\xF2 |0 + \x86\xF3 |0 + \xB3\xF3 |0 + \x86\xF4 |0 + \x86\xF5 |0 + \x86\xF6 |0 + \x86\xF7 |0 + \xB3\xF4 |0 + \xB3\xF5 |0 + \xB3\xF6 |0 + \x86\xF8 |0 + \x86\xF9 |0 + \x86\xFA |0 + \xB3\xF7 |0 + \x86\xFB |0 + \x86\xFC |0 + \x86\xFD |0 + \xB3\xF8 |0 + \x86\xFE |0 + \x87\x41 |0 + \x87\x42 |0 + \x87\x43 |0 + \x87\x44 |0 + \x87\x45 |0 + \x87\x46 |0 + \x87\x47 |0 + \x87\x48 |0 + \x87\x49 |0 + \x87\x4A |0 + \xB3\xF9 |0 + \x87\x4B |0 + \x87\x4C |0 + \x87\x4D |0 + \x87\x4E |0 + \x87\x4F |0 + \x87\x50 |0 + \x87\x51 |0 + \x87\x52 |0 + \x87\x53 |0 + \x87\x54 |0 + \x87\x55 |0 + \x87\x56 |0 + \x87\x57 |0 + \x87\x58 |0 + \x87\x59 |0 + \x87\x5A |0 + \x87\x61 |0 + \x87\x62 |0 + \x87\x63 |0 + \x87\x64 |0 + \x87\x65 |0 + \x87\x66 |0 + \x87\x67 |0 + \x87\x68 |0 + \x87\x69 |0 + \x87\x6A |0 + \x87\x6B |0 + \x87\x6C |0 + \x87\x6D |0 + \x87\x6E |0 + \x87\x6F |0 + \x87\x70 |0 + \x87\x71 |0 + \x87\x72 |0 + \x87\x73 |0 + \xB3\xFA |0 + \x87\x74 |0 + \x87\x75 |0 + \x87\x76 |0 + \xB3\xFB |0 + \x87\x77 |0 + \x87\x78 |0 + \x87\x79 |0 + \xB3\xFC |0 + \x87\x7A |0 + \x87\x81 |0 + \x87\x82 |0 + \x87\x83 |0 + \x87\x84 |0 + \x87\x85 |0 + \x87\x86 |0 + \xB3\xFD |0 + \xB3\xFE |0 + \x87\x87 |0 + \xB4\xA1 |0 + \x87\x88 |0 + \x87\x89 |0 + \x87\x8A |0 + \x87\x8B |0 + \x87\x8C |0 + \x87\x8D |0 + \x87\x8E |0 + \x87\x8F |0 + \xB4\xA2 |0 + \xB4\xA3 |0 + \x87\x90 |0 + \x87\x91 |0 + \xB4\xA4 |0 + \x87\x92 |0 + \x87\x93 |0 + \x87\x94 |0 + \xB4\xA5 |0 + \x87\x95 |0 + \x87\x96 |0 + \x87\x97 |0 + \x87\x98 |0 + \x87\x99 |0 + \x87\x9A |0 + \x87\x9B |0 + \x87\x9C |0 + \xB4\xA6 |0 + \x87\x9D |0 + \xB4\xA7 |0 + \x87\x9E |0 + \xB4\xA8 |0 + \x87\x9F |0 + \x87\xA0 |0 + \x87\xA1 |0 + \x87\xA2 |0 + \x87\xA3 |0 + \x87\xA4 |0 + \xB4\xA9 |0 + \xB4\xAA |0 + \x87\xA5 |0 + \x87\xA6 |0 + \xB4\xAB |0 + \x87\xA7 |0 + \x87\xA8 |0 + \xB4\xAC |0 + \xB4\xAD |0 + \x87\xA9 |0 + \x87\xAA |0 + \x87\xAB |0 + \x87\xAC |0 + \x87\xAD |0 + \x87\xAE |0 + \x87\xAF |0 + \xB4\xAE |0 + \xB4\xAF |0 + \x87\xB0 |0 + \xB4\xB0 |0 + \x87\xB1 |0 + \xB4\xB1 |0 + \x87\xB2 |0 + \x87\xB3 |0 + \x87\xB4 |0 + \x87\xB5 |0 + \x87\xB6 |0 + \x87\xB7 |0 + \xB4\xB2 |0 + \x87\xB8 |0 + \x87\xB9 |0 + \x87\xBA |0 + \x87\xBB |0 + \x87\xBC |0 + \x87\xBD |0 + \x87\xBE |0 + \x87\xBF |0 + \x87\xC0 |0 + \x87\xC1 |0 + \x87\xC2 |0 + \x87\xC3 |0 + \x87\xC4 |0 + \x87\xC5 |0 + \x87\xC6 |0 + \x87\xC7 |0 + \x87\xC8 |0 + \x87\xC9 |0 + \x87\xCA |0 + \xB4\xB3 |0 + \x87\xCB |0 + \x87\xCC |0 + \x87\xCD |0 + \x87\xCE |0 + \x87\xCF |0 + \x87\xD0 |0 + \x87\xD1 |0 + \xB4\xB4 |0 + \x87\xD2 |0 + \x87\xD3 |0 + \x87\xD4 |0 + \x87\xD5 |0 + \x87\xD6 |0 + \x87\xD7 |0 + \x87\xD8 |0 + \x87\xD9 |0 + \x87\xDA |0 + \x87\xDB |0 + \x87\xDC |0 + \x87\xDD |0 + \x87\xDE |0 + \x87\xDF |0 + \x87\xE0 |0 + \x87\xE1 |0 + \x87\xE2 |0 + \x87\xE3 |0 + \x87\xE4 |0 + \x87\xE5 |0 + \x87\xE6 |0 + \x87\xE7 |0 + \x87\xE8 |0 + \x87\xE9 |0 + \x87\xEA |0 + \x87\xEB |0 + \x87\xEC |0 + \xB4\xB5 |0 + \x87\xED |0 + \x87\xEE |0 + \x87\xEF |0 + \xB4\xB6 |0 + \x87\xF0 |0 + \x87\xF1 |0 + \x87\xF2 |0 + \xB4\xB7 |0 + \x87\xF3 |0 + \x87\xF4 |0 + \x87\xF5 |0 + \x87\xF6 |0 + \x87\xF7 |0 + \x87\xF8 |0 + \x87\xF9 |0 + \xB4\xB8 |0 + \xB4\xB9 |0 + \x87\xFA |0 + \x87\xFB |0 + \x87\xFC |0 + \x87\xFD |0 + \x87\xFE |0 + \x88\x41 |0 + \x88\x42 |0 + \x88\x43 |0 + \x88\x44 |0 + \x88\x45 |0 + \xB4\xBA |0 + \xB4\xBB |0 + \x88\x46 |0 + \x88\x47 |0 + \x88\x48 |0 + \x88\x49 |0 + \x88\x4A |0 + \x88\x4B |0 + \xB4\xBC |0 + \x88\x4C |0 + \x88\x4D |0 + \x88\x4E |0 + \x88\x4F |0 + \x88\x50 |0 + \x88\x51 |0 + \x88\x52 |0 + \xB4\xBD |0 + \xB4\xBE |0 + \x88\x53 |0 + \x88\x54 |0 + \x88\x55 |0 + \xB4\xBF |0 + \x88\x56 |0 + \x88\x57 |0 + \x88\x58 |0 + \x88\x59 |0 + \x88\x5A |0 + \x88\x61 |0 + \xB4\xC0 |0 + \xB4\xC1 |0 + \x88\x62 |0 + \x88\x63 |0 + \xB4\xC2 |0 + \x88\x64 |0 + \x88\x65 |0 + \x88\x66 |0 + \xB4\xC3 |0 + \xB4\xC4 |0 + \xB4\xC5 |0 + \x88\x67 |0 + \x88\x68 |0 + \x88\x69 |0 + \x88\x6A |0 + \x88\x6B |0 + \xB4\xC6 |0 + \xB4\xC7 |0 + \x88\x6C |0 + \xB4\xC8 |0 + \x88\x6D |0 + \xB4\xC9 |0 + \xB4\xCA |0 + \x88\x6E |0 + \x88\x6F |0 + \x88\x70 |0 + \xB4\xCB |0 + \x88\x71 |0 + \xB4\xCC |0 + \x88\x72 |0 + \x88\x73 |0 + \x88\x74 |0 + \xB4\xCD |0 + \x88\x75 |0 + \x88\x76 |0 + \x88\x77 |0 + \xB4\xCE |0 + \x88\x78 |0 + \x88\x79 |0 + \x88\x7A |0 + \x88\x81 |0 + \x88\x82 |0 + \x88\x83 |0 + \x88\x84 |0 + \x88\x85 |0 + \x88\x86 |0 + \x88\x87 |0 + \x88\x88 |0 + \x88\x89 |0 + \x88\x8A |0 + \x88\x8B |0 + \x88\x8C |0 + \x88\x8D |0 + \x88\x8E |0 + \x88\x8F |0 + \x88\x90 |0 + \xB4\xCF |0 + \xB4\xD0 |0 + \x88\x91 |0 + \x88\x92 |0 + \xB4\xD1 |0 + \x88\x93 |0 + \x88\x94 |0 + \x88\x95 |0 + \xB4\xD2 |0 + \x88\x96 |0 + \xB4\xD3 |0 + \x88\x97 |0 + \x88\x98 |0 + \x88\x99 |0 + \x88\x9A |0 + \x88\x9B |0 + \xB4\xD4 |0 + \xB4\xD5 |0 + \x88\x9C |0 + \xB4\xD6 |0 + \x88\x9D |0 + \xB4\xD7 |0 + \x88\x9E |0 + \x88\x9F |0 + \x88\xA0 |0 + \x88\xA1 |0 + \xB4\xD8 |0 + \x88\xA2 |0 + \xB4\xD9 |0 + \xB4\xDA |0 + \xB4\xDB |0 + \x88\xA3 |0 + \xB4\xDC |0 + \x88\xA4 |0 + \x88\xA5 |0 + \xB4\xDD |0 + \xB4\xDE |0 + \xB4\xDF |0 + \xB4\xE0 |0 + \xB4\xE1 |0 + \x88\xA6 |0 + \x88\xA7 |0 + \x88\xA8 |0 + \xB4\xE2 |0 + \xB4\xE3 |0 + \xB4\xE4 |0 + \x88\xA9 |0 + \xB4\xE5 |0 + \xB4\xE6 |0 + \xB4\xE7 |0 + \xB4\xE8 |0 + \xB4\xE9 |0 + \x88\xAA |0 + \x88\xAB |0 + \x88\xAC |0 + \xB4\xEA |0 + \xB4\xEB |0 + \xB4\xEC |0 + \x88\xAD |0 + \x88\xAE |0 + \xB4\xED |0 + \x88\xAF |0 + \x88\xB0 |0 + \x88\xB1 |0 + \xB4\xEE |0 + \x88\xB2 |0 + \x88\xB3 |0 + \x88\xB4 |0 + \x88\xB5 |0 + \x88\xB6 |0 + \x88\xB7 |0 + \x88\xB8 |0 + \xB4\xEF |0 + \xB4\xF0 |0 + \x88\xB9 |0 + \xB4\xF1 |0 + \xB4\xF2 |0 + \xB4\xF3 |0 + \x88\xBA |0 + \x88\xBB |0 + \x88\xBC |0 + \x88\xBD |0 + \x88\xBE |0 + \x88\xBF |0 + \xB4\xF4 |0 + \x88\xC0 |0 + \x88\xC1 |0 + \x88\xC2 |0 + \x88\xC3 |0 + \x88\xC4 |0 + \x88\xC5 |0 + \x88\xC6 |0 + \x88\xC7 |0 + \x88\xC8 |0 + \x88\xC9 |0 + \x88\xCA |0 + \x88\xCB |0 + \x88\xCC |0 + \x88\xCD |0 + \x88\xCE |0 + \x88\xCF |0 + \x88\xD0 |0 + \x88\xD1 |0 + \x88\xD2 |0 + \x88\xD3 |0 + \x88\xD4 |0 + \x88\xD5 |0 + \x88\xD6 |0 + \x88\xD7 |0 + \x88\xD8 |0 + \x88\xD9 |0 + \x88\xDA |0 + \x88\xDB |0 + \x88\xDC |0 + \x88\xDD |0 + \x88\xDE |0 + \x88\xDF |0 + \x88\xE0 |0 + \x88\xE1 |0 + \x88\xE2 |0 + \x88\xE3 |0 + \x88\xE4 |0 + \x88\xE5 |0 + \x88\xE6 |0 + \x88\xE7 |0 + \x88\xE8 |0 + \x88\xE9 |0 + \x88\xEA |0 + \x88\xEB |0 + \x88\xEC |0 + \x88\xED |0 + \x88\xEE |0 + \x88\xEF |0 + \x88\xF0 |0 + \x88\xF1 |0 + \x88\xF2 |0 + \x88\xF3 |0 + \x88\xF4 |0 + \x88\xF5 |0 + \x88\xF6 |0 + \xB4\xF5 |0 + \xB4\xF6 |0 + \xB4\xF7 |0 + \x88\xF7 |0 + \xB4\xF8 |0 + \x88\xF8 |0 + \x88\xF9 |0 + \xB4\xF9 |0 + \xB4\xFA |0 + \x88\xFA |0 + \xB4\xFB |0 + \xB4\xFC |0 + \x88\xFB |0 + \x88\xFC |0 + \x88\xFD |0 + \x88\xFE |0 + \xB4\xFD |0 + \xB4\xFE |0 + \x89\x41 |0 + \xB5\xA1 |0 + \x89\x42 |0 + \xB5\xA2 |0 + \x89\x43 |0 + \xB5\xA3 |0 + \x89\x44 |0 + \x89\x45 |0 + \xB5\xA4 |0 + \x89\x46 |0 + \xB5\xA5 |0 + \xB5\xA6 |0 + \x89\x47 |0 + \x89\x48 |0 + \xB5\xA7 |0 + \x89\x49 |0 + \x89\x4A |0 + \x89\x4B |0 + \xB5\xA8 |0 + \x89\x4C |0 + \x89\x4D |0 + \x89\x4E |0 + \x89\x4F |0 + \x89\x50 |0 + \x89\x51 |0 + \x89\x52 |0 + \xB5\xA9 |0 + \xB5\xAA |0 + \x89\x53 |0 + \xB5\xAB |0 + \xB5\xAC |0 + \xB5\xAD |0 + \x89\x54 |0 + \x89\x55 |0 + \x89\x56 |0 + \x89\x57 |0 + \x89\x58 |0 + \x89\x59 |0 + \xB5\xAE |0 + \x89\x5A |0 + \x89\x61 |0 + \x89\x62 |0 + \xB5\xAF |0 + \x89\x63 |0 + \x89\x64 |0 + \x89\x65 |0 + \xB5\xB0 |0 + \x89\x66 |0 + \x89\x67 |0 + \x89\x68 |0 + \x89\x69 |0 + \x89\x6A |0 + \x89\x6B |0 + \x89\x6C |0 + \x89\x6D |0 + \x89\x6E |0 + \x89\x6F |0 + \x89\x70 |0 + \xB5\xB1 |0 + \xB5\xB2 |0 + \x89\x71 |0 + \x89\x72 |0 + \x89\x73 |0 + \x89\x74 |0 + \x89\x75 |0 + \x89\x76 |0 + \xB5\xB3 |0 + \x89\x77 |0 + \x89\x78 |0 + \x89\x79 |0 + \xB5\xB4 |0 + \x89\x7A |0 + \x89\x81 |0 + \x89\x82 |0 + \x89\x83 |0 + \x89\x84 |0 + \x89\x85 |0 + \x89\x86 |0 + \x89\x87 |0 + \x89\x88 |0 + \x89\x89 |0 + \x89\x8A |0 + \x89\x8B |0 + \x89\x8C |0 + \x89\x8D |0 + \x89\x8E |0 + \x89\x8F |0 + \x89\x90 |0 + \x89\x91 |0 + \x89\x92 |0 + \x89\x93 |0 + \x89\x94 |0 + \x89\x95 |0 + \x89\x96 |0 + \xB5\xB5 |0 + \xB5\xB6 |0 + \x89\x97 |0 + \x89\x98 |0 + \xB5\xB7 |0 + \x89\x99 |0 + \x89\x9A |0 + \xB5\xB8 |0 + \xB5\xB9 |0 + \x89\x9B |0 + \xB5\xBA |0 + \x89\x9C |0 + \xB5\xBB |0 + \x89\x9D |0 + \x89\x9E |0 + \x89\x9F |0 + \xB5\xBC |0 + \xB5\xBD |0 + \x89\xA0 |0 + \xB5\xBE |0 + \x89\xA1 |0 + \xB5\xBF |0 + \x89\xA2 |0 + \xB5\xC0 |0 + \x89\xA3 |0 + \xB5\xC1 |0 + \x89\xA4 |0 + \x89\xA5 |0 + \xB5\xC2 |0 + \x89\xA6 |0 + \x89\xA7 |0 + \x89\xA8 |0 + \xB5\xC3 |0 + \x89\xA9 |0 + \x89\xAA |0 + \x89\xAB |0 + \xB5\xC4 |0 + \x89\xAC |0 + \x89\xAD |0 + \x89\xAE |0 + \x89\xAF |0 + \x89\xB0 |0 + \x89\xB1 |0 + \x89\xB2 |0 + \x89\xB3 |0 + \x89\xB4 |0 + \x89\xB5 |0 + \x89\xB6 |0 + \x89\xB7 |0 + \x89\xB8 |0 + \x89\xB9 |0 + \x89\xBA |0 + \x89\xBB |0 + \x89\xBC |0 + \x89\xBD |0 + \x89\xBE |0 + \xB5\xC5 |0 + \x89\xBF |0 + \x89\xC0 |0 + \x89\xC1 |0 + \x89\xC2 |0 + \x89\xC3 |0 + \x89\xC4 |0 + \x89\xC5 |0 + \x89\xC6 |0 + \x89\xC7 |0 + \x89\xC8 |0 + \x89\xC9 |0 + \x89\xCA |0 + \x89\xCB |0 + \x89\xCC |0 + \x89\xCD |0 + \x89\xCE |0 + \x89\xCF |0 + \x89\xD0 |0 + \x89\xD1 |0 + \xB5\xC6 |0 + \x89\xD2 |0 + \x89\xD3 |0 + \x89\xD4 |0 + \x89\xD5 |0 + \x89\xD6 |0 + \x89\xD7 |0 + \x89\xD8 |0 + \xB5\xC7 |0 + \x89\xD9 |0 + \x89\xDA |0 + \x89\xDB |0 + \xB5\xC8 |0 + \x89\xDC |0 + \x89\xDD |0 + \x89\xDE |0 + \xB5\xC9 |0 + \x89\xDF |0 + \x89\xE0 |0 + \x89\xE1 |0 + \x89\xE2 |0 + \x89\xE3 |0 + \x89\xE4 |0 + \x89\xE5 |0 + \xB5\xCA |0 + \xB5\xCB |0 + \x89\xE6 |0 + \xB5\xCC |0 + \x89\xE7 |0 + \x89\xE8 |0 + \x89\xE9 |0 + \x89\xEA |0 + \x89\xEB |0 + \x89\xEC |0 + \x89\xED |0 + \x89\xEE |0 + \xB5\xCD |0 + \x89\xEF |0 + \x89\xF0 |0 + \x89\xF1 |0 + \x89\xF2 |0 + \x89\xF3 |0 + \x89\xF4 |0 + \x89\xF5 |0 + \x89\xF6 |0 + \x89\xF7 |0 + \x89\xF8 |0 + \x89\xF9 |0 + \x89\xFA |0 + \x89\xFB |0 + \x89\xFC |0 + \x89\xFD |0 + \x89\xFE |0 + \x8A\x41 |0 + \x8A\x42 |0 + \x8A\x43 |0 + \x8A\x44 |0 + \x8A\x45 |0 + \x8A\x46 |0 + \x8A\x47 |0 + \x8A\x48 |0 + \x8A\x49 |0 + \x8A\x4A |0 + \x8A\x4B |0 + \xB5\xCE |0 + \xB5\xCF |0 + \x8A\x4C |0 + \x8A\x4D |0 + \xB5\xD0 |0 + \x8A\x4E |0 + \x8A\x4F |0 + \x8A\x50 |0 + \xB5\xD1 |0 + \x8A\x51 |0 + \x8A\x52 |0 + \x8A\x53 |0 + \x8A\x54 |0 + \x8A\x55 |0 + \x8A\x56 |0 + \x8A\x57 |0 + \xB5\xD2 |0 + \xB5\xD3 |0 + \x8A\x58 |0 + \xB5\xD4 |0 + \x8A\x59 |0 + \xB5\xD5 |0 + \x8A\x5A |0 + \x8A\x61 |0 + \x8A\x62 |0 + \x8A\x63 |0 + \x8A\x64 |0 + \x8A\x65 |0 + \xB5\xD6 |0 + \x8A\x66 |0 + \x8A\x67 |0 + \x8A\x68 |0 + \x8A\x69 |0 + \x8A\x6A |0 + \x8A\x6B |0 + \x8A\x6C |0 + \x8A\x6D |0 + \x8A\x6E |0 + \x8A\x6F |0 + \x8A\x70 |0 + \x8A\x71 |0 + \x8A\x72 |0 + \x8A\x73 |0 + \x8A\x74 |0 + \x8A\x75 |0 + \x8A\x76 |0 + \x8A\x77 |0 + \x8A\x78 |0 + \xB5\xD7 |0 + \x8A\x79 |0 + \x8A\x7A |0 + \x8A\x81 |0 + \x8A\x82 |0 + \x8A\x83 |0 + \x8A\x84 |0 + \x8A\x85 |0 + \xB5\xD8 |0 + \x8A\x86 |0 + \x8A\x87 |0 + \x8A\x88 |0 + \x8A\x89 |0 + \x8A\x8A |0 + \x8A\x8B |0 + \x8A\x8C |0 + \x8A\x8D |0 + \x8A\x8E |0 + \x8A\x8F |0 + \x8A\x90 |0 + \x8A\x91 |0 + \x8A\x92 |0 + \x8A\x93 |0 + \x8A\x94 |0 + \x8A\x95 |0 + \x8A\x96 |0 + \x8A\x97 |0 + \x8A\x98 |0 + \x8A\x99 |0 + \xB5\xD9 |0 + \x8A\x9A |0 + \x8A\x9B |0 + \x8A\x9C |0 + \x8A\x9D |0 + \x8A\x9E |0 + \x8A\x9F |0 + \xB5\xDA |0 + \x8A\xA0 |0 + \x8A\xA1 |0 + \x8A\xA2 |0 + \xB5\xDB |0 + \x8A\xA3 |0 + \x8A\xA4 |0 + \x8A\xA5 |0 + \xB5\xDC |0 + \x8A\xA6 |0 + \x8A\xA7 |0 + \x8A\xA8 |0 + \x8A\xA9 |0 + \x8A\xAA |0 + \x8A\xAB |0 + \x8A\xAC |0 + \x8A\xAD |0 + \xB5\xDD |0 + \x8A\xAE |0 + \xB5\xDE |0 + \x8A\xAF |0 + \xB5\xDF |0 + \x8A\xB0 |0 + \x8A\xB1 |0 + \x8A\xB2 |0 + \x8A\xB3 |0 + \x8A\xB4 |0 + \x8A\xB5 |0 + \xB5\xE0 |0 + \x8A\xB6 |0 + \x8A\xB7 |0 + \x8A\xB8 |0 + \xB5\xE1 |0 + \x8A\xB9 |0 + \x8A\xBA |0 + \x8A\xBB |0 + \xB5\xE2 |0 + \x8A\xBC |0 + \x8A\xBD |0 + \x8A\xBE |0 + \x8A\xBF |0 + \x8A\xC0 |0 + \x8A\xC1 |0 + \x8A\xC2 |0 + \xB5\xE3 |0 + \x8A\xC3 |0 + \x8A\xC4 |0 + \x8A\xC5 |0 + \x8A\xC6 |0 + \xB5\xE4 |0 + \x8A\xC7 |0 + \x8A\xC8 |0 + \x8A\xC9 |0 + \x8A\xCA |0 + \x8A\xCB |0 + \x8A\xCC |0 + \xB5\xE5 |0 + \xB5\xE6 |0 + \x8A\xCD |0 + \x8A\xCE |0 + \xB5\xE7 |0 + \x8A\xCF |0 + \x8A\xD0 |0 + \xB5\xE8 |0 + \xB5\xE9 |0 + \x8A\xD1 |0 + \xB5\xEA |0 + \x8A\xD2 |0 + \x8A\xD3 |0 + \x8A\xD4 |0 + \x8A\xD5 |0 + \x8A\xD6 |0 + \xB5\xEB |0 + \xB5\xEC |0 + \x8A\xD7 |0 + \xB5\xED |0 + \x8A\xD8 |0 + \xB5\xEE |0 + \x8A\xD9 |0 + \x8A\xDA |0 + \x8A\xDB |0 + \x8A\xDC |0 + \x8A\xDD |0 + \x8A\xDE |0 + \xB5\xEF |0 + \x8A\xDF |0 + \x8A\xE0 |0 + \x8A\xE1 |0 + \x8A\xE2 |0 + \x8A\xE3 |0 + \x8A\xE4 |0 + \x8A\xE5 |0 + \x8A\xE6 |0 + \x8A\xE7 |0 + \x8A\xE8 |0 + \x8A\xE9 |0 + \x8A\xEA |0 + \x8A\xEB |0 + \x8A\xEC |0 + \x8A\xED |0 + \x8A\xEE |0 + \x8A\xEF |0 + \x8A\xF0 |0 + \x8A\xF1 |0 + \x8A\xF2 |0 + \x8A\xF3 |0 + \x8A\xF4 |0 + \x8A\xF5 |0 + \x8A\xF6 |0 + \x8A\xF7 |0 + \x8A\xF8 |0 + \x8A\xF9 |0 + \xB5\xF0 |0 + \xB5\xF1 |0 + \x8A\xFA |0 + \x8A\xFB |0 + \xB5\xF2 |0 + \x8A\xFC |0 + \x8A\xFD |0 + \xB5\xF3 |0 + \xB5\xF4 |0 + \x8A\xFE |0 + \x8B\x41 |0 + \x8B\x42 |0 + \x8B\x43 |0 + \x8B\x44 |0 + \x8B\x45 |0 + \x8B\x46 |0 + \xB5\xF5 |0 + \xB5\xF6 |0 + \x8B\x47 |0 + \xB5\xF7 |0 + \xB5\xF8 |0 + \xB5\xF9 |0 + \xB5\xFA |0 + \x8B\x48 |0 + \x8B\x49 |0 + \x8B\x4A |0 + \x8B\x4B |0 + \x8B\x4C |0 + \xB5\xFB |0 + \xB5\xFC |0 + \x8B\x4D |0 + \x8B\x4E |0 + \xB5\xFD |0 + \x8B\x4F |0 + \x8B\x50 |0 + \x8B\x51 |0 + \xB5\xFE |0 + \x8B\x52 |0 + \x8B\x53 |0 + \x8B\x54 |0 + \x8B\x55 |0 + \x8B\x56 |0 + \x8B\x57 |0 + \x8B\x58 |0 + \xB6\xA1 |0 + \xB6\xA2 |0 + \x8B\x59 |0 + \xB6\xA3 |0 + \xB6\xA4 |0 + \xB6\xA5 |0 + \x8B\x5A |0 + \x8B\x61 |0 + \x8B\x62 |0 + \x8B\x63 |0 + \x8B\x64 |0 + \xB6\xA6 |0 + \xB6\xA7 |0 + \xB6\xA8 |0 + \x8B\x65 |0 + \x8B\x66 |0 + \xB6\xA9 |0 + \x8B\x67 |0 + \x8B\x68 |0 + \x8B\x69 |0 + \xB6\xAA |0 + \x8B\x6A |0 + \x8B\x6B |0 + \x8B\x6C |0 + \x8B\x6D |0 + \x8B\x6E |0 + \x8B\x6F |0 + \x8B\x70 |0 + \xB6\xAB |0 + \xB6\xAC |0 + \x8B\x71 |0 + \xB6\xAD |0 + \xB6\xAE |0 + \xB6\xAF |0 + \x8B\x72 |0 + \x8B\x73 |0 + \x8B\x74 |0 + \x8B\x75 |0 + \x8B\x76 |0 + \x8B\x77 |0 + \x8B\x78 |0 + \x8B\x79 |0 + \x8B\x7A |0 + \x8B\x81 |0 + \x8B\x82 |0 + \x8B\x83 |0 + \x8B\x84 |0 + \x8B\x85 |0 + \x8B\x86 |0 + \x8B\x87 |0 + \x8B\x88 |0 + \x8B\x89 |0 + \x8B\x8A |0 + \x8B\x8B |0 + \x8B\x8C |0 + \x8B\x8D |0 + \x8B\x8E |0 + \x8B\x8F |0 + \x8B\x90 |0 + \x8B\x91 |0 + \x8B\x92 |0 + \x8B\x93 |0 + \x8B\x94 |0 + \x8B\x95 |0 + \x8B\x96 |0 + \x8B\x97 |0 + \x8B\x98 |0 + \x8B\x99 |0 + \x8B\x9A |0 + \x8B\x9B |0 + \x8B\x9C |0 + \x8B\x9D |0 + \x8B\x9E |0 + \x8B\x9F |0 + \x8B\xA0 |0 + \x8B\xA1 |0 + \x8B\xA2 |0 + \x8B\xA3 |0 + \x8B\xA4 |0 + \x8B\xA5 |0 + \x8B\xA6 |0 + \x8B\xA7 |0 + \x8B\xA8 |0 + \x8B\xA9 |0 + \x8B\xAA |0 + \x8B\xAB |0 + \x8B\xAC |0 + \x8B\xAD |0 + \x8B\xAE |0 + \x8B\xAF |0 + \x8B\xB0 |0 + \x8B\xB1 |0 + \x8B\xB2 |0 + \x8B\xB3 |0 + \x8B\xB4 |0 + \x8B\xB5 |0 + \xB6\xB0 |0 + \xB6\xB1 |0 + \x8B\xB6 |0 + \x8B\xB7 |0 + \xB6\xB2 |0 + \x8B\xB8 |0 + \x8B\xB9 |0 + \x8B\xBA |0 + \xB6\xB3 |0 + \x8B\xBB |0 + \xB6\xB4 |0 + \xB6\xB5 |0 + \x8B\xBC |0 + \x8B\xBD |0 + \x8B\xBE |0 + \x8B\xBF |0 + \xB6\xB6 |0 + \xB6\xB7 |0 + \x8B\xC0 |0 + \xB6\xB8 |0 + \xB6\xB9 |0 + \xB6\xBA |0 + \x8B\xC1 |0 + \x8B\xC2 |0 + \x8B\xC3 |0 + \x8B\xC4 |0 + \x8B\xC5 |0 + \xB6\xBB |0 + \xB6\xBC |0 + \xB6\xBD |0 + \x8B\xC6 |0 + \x8B\xC7 |0 + \xB6\xBE |0 + \x8B\xC8 |0 + \x8B\xC9 |0 + \x8B\xCA |0 + \xB6\xBF |0 + \x8B\xCB |0 + \x8B\xCC |0 + \x8B\xCD |0 + \x8B\xCE |0 + \x8B\xCF |0 + \x8B\xD0 |0 + \x8B\xD1 |0 + \xB6\xC0 |0 + \xB6\xC1 |0 + \x8B\xD2 |0 + \xB6\xC2 |0 + \xB6\xC3 |0 + \xB6\xC4 |0 + \x8B\xD3 |0 + \x8B\xD4 |0 + \x8B\xD5 |0 + \x8B\xD6 |0 + \x8B\xD7 |0 + \x8B\xD8 |0 + \xB6\xC5 |0 + \x8B\xD9 |0 + \x8B\xDA |0 + \x8B\xDB |0 + \x8B\xDC |0 + \x8B\xDD |0 + \x8B\xDE |0 + \x8B\xDF |0 + \x8B\xE0 |0 + \x8B\xE1 |0 + \x8B\xE2 |0 + \x8B\xE3 |0 + \x8B\xE4 |0 + \x8B\xE5 |0 + \x8B\xE6 |0 + \x8B\xE7 |0 + \x8B\xE8 |0 + \x8B\xE9 |0 + \x8B\xEA |0 + \x8B\xEB |0 + \xB6\xC6 |0 + \x8B\xEC |0 + \x8B\xED |0 + \x8B\xEE |0 + \x8B\xEF |0 + \x8B\xF0 |0 + \x8B\xF1 |0 + \x8B\xF2 |0 + \x8B\xF3 |0 + \x8B\xF4 |0 + \x8B\xF5 |0 + \x8B\xF6 |0 + \x8B\xF7 |0 + \x8B\xF8 |0 + \x8B\xF9 |0 + \x8B\xFA |0 + \x8B\xFB |0 + \x8B\xFC |0 + \x8B\xFD |0 + \x8B\xFE |0 + \x8C\x41 |0 + \x8C\x42 |0 + \x8C\x43 |0 + \x8C\x44 |0 + \x8C\x45 |0 + \x8C\x46 |0 + \x8C\x47 |0 + \x8C\x48 |0 + \x8C\x49 |0 + \x8C\x4A |0 + \x8C\x4B |0 + \x8C\x4C |0 + \x8C\x4D |0 + \x8C\x4E |0 + \x8C\x4F |0 + \x8C\x50 |0 + \xB6\xC7 |0 + \xB6\xC8 |0 + \x8C\x51 |0 + \x8C\x52 |0 + \xB6\xC9 |0 + \x8C\x53 |0 + \x8C\x54 |0 + \x8C\x55 |0 + \xB6\xCA |0 + \x8C\x56 |0 + \x8C\x57 |0 + \x8C\x58 |0 + \x8C\x59 |0 + \x8C\x5A |0 + \x8C\x61 |0 + \x8C\x62 |0 + \x8C\x63 |0 + \x8C\x64 |0 + \x8C\x65 |0 + \x8C\x66 |0 + \x8C\x67 |0 + \xB6\xCB |0 + \x8C\x68 |0 + \x8C\x69 |0 + \x8C\x6A |0 + \x8C\x6B |0 + \x8C\x6C |0 + \x8C\x6D |0 + \xB6\xCC |0 + \x8C\x6E |0 + \x8C\x6F |0 + \x8C\x70 |0 + \x8C\x71 |0 + \x8C\x72 |0 + \x8C\x73 |0 + \x8C\x74 |0 + \xB6\xCD |0 + \x8C\x75 |0 + \x8C\x76 |0 + \x8C\x77 |0 + \x8C\x78 |0 + \x8C\x79 |0 + \x8C\x7A |0 + \x8C\x81 |0 + \x8C\x82 |0 + \x8C\x83 |0 + \x8C\x84 |0 + \x8C\x85 |0 + \x8C\x86 |0 + \x8C\x87 |0 + \x8C\x88 |0 + \x8C\x89 |0 + \x8C\x8A |0 + \x8C\x8B |0 + \x8C\x8C |0 + \x8C\x8D |0 + \xB6\xCE |0 + \x8C\x8E |0 + \x8C\x8F |0 + \x8C\x90 |0 + \x8C\x91 |0 + \x8C\x92 |0 + \x8C\x93 |0 + \x8C\x94 |0 + \x8C\x95 |0 + \x8C\x96 |0 + \x8C\x97 |0 + \x8C\x98 |0 + \x8C\x99 |0 + \x8C\x9A |0 + \x8C\x9B |0 + \x8C\x9C |0 + \x8C\x9D |0 + \x8C\x9E |0 + \x8C\x9F |0 + \x8C\xA0 |0 + \x8C\xA1 |0 + \x8C\xA2 |0 + \x8C\xA3 |0 + \x8C\xA4 |0 + \x8C\xA5 |0 + \x8C\xA6 |0 + \x8C\xA7 |0 + \x8C\xA8 |0 + \xB6\xCF |0 + \x8C\xA9 |0 + \x8C\xAA |0 + \x8C\xAB |0 + \xB6\xD0 |0 + \x8C\xAC |0 + \x8C\xAD |0 + \x8C\xAE |0 + \x8C\xAF |0 + \x8C\xB0 |0 + \x8C\xB1 |0 + \x8C\xB2 |0 + \x8C\xB3 |0 + \x8C\xB4 |0 + \x8C\xB5 |0 + \x8C\xB6 |0 + \x8C\xB7 |0 + \x8C\xB8 |0 + \x8C\xB9 |0 + \x8C\xBA |0 + \x8C\xBB |0 + \x8C\xBC |0 + \x8C\xBD |0 + \x8C\xBE |0 + \x8C\xBF |0 + \x8C\xC0 |0 + \x8C\xC1 |0 + \x8C\xC2 |0 + \x8C\xC3 |0 + \x8C\xC4 |0 + \x8C\xC5 |0 + \x8C\xC6 |0 + \x8C\xC7 |0 + \x8C\xC8 |0 + \x8C\xC9 |0 + \x8C\xCA |0 + \x8C\xCB |0 + \x8C\xCC |0 + \x8C\xCD |0 + \x8C\xCE |0 + \x8C\xCF |0 + \x8C\xD0 |0 + \x8C\xD1 |0 + \x8C\xD2 |0 + \x8C\xD3 |0 + \x8C\xD4 |0 + \x8C\xD5 |0 + \x8C\xD6 |0 + \x8C\xD7 |0 + \x8C\xD8 |0 + \x8C\xD9 |0 + \x8C\xDA |0 + \x8C\xDB |0 + \x8C\xDC |0 + \x8C\xDD |0 + \x8C\xDE |0 + \xB6\xD1 |0 + \xB6\xD2 |0 + \x8C\xDF |0 + \x8C\xE0 |0 + \xB6\xD3 |0 + \x8C\xE1 |0 + \x8C\xE2 |0 + \x8C\xE3 |0 + \xB6\xD4 |0 + \x8C\xE4 |0 + \x8C\xE5 |0 + \x8C\xE6 |0 + \x8C\xE7 |0 + \x8C\xE8 |0 + \x8C\xE9 |0 + \xB6\xD5 |0 + \xB6\xD6 |0 + \x8C\xEA |0 + \x8C\xEB |0 + \x8C\xEC |0 + \x8C\xED |0 + \xB6\xD7 |0 + \x8C\xEE |0 + \x8C\xEF |0 + \x8C\xF0 |0 + \x8C\xF1 |0 + \x8C\xF2 |0 + \x8C\xF3 |0 + \x8C\xF4 |0 + \x8C\xF5 |0 + \x8C\xF6 |0 + \x8C\xF7 |0 + \x8C\xF8 |0 + \x8C\xF9 |0 + \x8C\xFA |0 + \x8C\xFB |0 + \x8C\xFC |0 + \x8C\xFD |0 + \x8C\xFE |0 + \x8D\x41 |0 + \x8D\x42 |0 + \x8D\x43 |0 + \x8D\x44 |0 + \x8D\x45 |0 + \x8D\x46 |0 + \x8D\x47 |0 + \x8D\x48 |0 + \x8D\x49 |0 + \x8D\x4A |0 + \x8D\x4B |0 + \x8D\x4C |0 + \x8D\x4D |0 + \x8D\x4E |0 + \x8D\x4F |0 + \x8D\x50 |0 + \x8D\x51 |0 + \xB6\xD8 |0 + \x8D\x52 |0 + \x8D\x53 |0 + \x8D\x54 |0 + \x8D\x55 |0 + \x8D\x56 |0 + \x8D\x57 |0 + \x8D\x58 |0 + \x8D\x59 |0 + \x8D\x5A |0 + \x8D\x61 |0 + \x8D\x62 |0 + \x8D\x63 |0 + \x8D\x64 |0 + \x8D\x65 |0 + \x8D\x66 |0 + \x8D\x67 |0 + \x8D\x68 |0 + \x8D\x69 |0 + \x8D\x6A |0 + \x8D\x6B |0 + \x8D\x6C |0 + \x8D\x6D |0 + \x8D\x6E |0 + \x8D\x6F |0 + \x8D\x70 |0 + \x8D\x71 |0 + \x8D\x72 |0 + \xB6\xD9 |0 + \x8D\x73 |0 + \x8D\x74 |0 + \x8D\x75 |0 + \xB6\xDA |0 + \x8D\x76 |0 + \x8D\x77 |0 + \x8D\x78 |0 + \xB6\xDB |0 + \x8D\x79 |0 + \x8D\x7A |0 + \x8D\x81 |0 + \x8D\x82 |0 + \x8D\x83 |0 + \x8D\x84 |0 + \x8D\x85 |0 + \xB6\xDC |0 + \xB6\xDD |0 + \x8D\x86 |0 + \x8D\x87 |0 + \x8D\x88 |0 + \xB6\xDE |0 + \x8D\x89 |0 + \x8D\x8A |0 + \x8D\x8B |0 + \x8D\x8C |0 + \x8D\x8D |0 + \x8D\x8E |0 + \x8D\x8F |0 + \x8D\x90 |0 + \x8D\x91 |0 + \x8D\x92 |0 + \x8D\x93 |0 + \x8D\x94 |0 + \x8D\x95 |0 + \x8D\x96 |0 + \x8D\x97 |0 + \x8D\x98 |0 + \x8D\x99 |0 + \x8D\x9A |0 + \x8D\x9B |0 + \x8D\x9C |0 + \x8D\x9D |0 + \x8D\x9E |0 + \x8D\x9F |0 + \x8D\xA0 |0 + \x8D\xA1 |0 + \x8D\xA2 |0 + \x8D\xA3 |0 + \x8D\xA4 |0 + \x8D\xA5 |0 + \x8D\xA6 |0 + \x8D\xA7 |0 + \x8D\xA8 |0 + \x8D\xA9 |0 + \x8D\xAA |0 + \xB6\xDF |0 + \xB6\xE0 |0 + \x8D\xAB |0 + \x8D\xAC |0 + \xB6\xE1 |0 + \x8D\xAD |0 + \x8D\xAE |0 + \xB6\xE2 |0 + \xB6\xE3 |0 + \x8D\xAF |0 + \x8D\xB0 |0 + \x8D\xB1 |0 + \x8D\xB2 |0 + \x8D\xB3 |0 + \x8D\xB4 |0 + \x8D\xB5 |0 + \xB6\xE4 |0 + \xB6\xE5 |0 + \x8D\xB6 |0 + \xB6\xE6 |0 + \x8D\xB7 |0 + \x8D\xB8 |0 + \x8D\xB9 |0 + \x8D\xBA |0 + \x8D\xBB |0 + \x8D\xBC |0 + \x8D\xBD |0 + \x8D\xBE |0 + \xB6\xE7 |0 + \x8D\xBF |0 + \x8D\xC0 |0 + \x8D\xC1 |0 + \xB6\xE8 |0 + \x8D\xC2 |0 + \x8D\xC3 |0 + \x8D\xC4 |0 + \xB6\xE9 |0 + \x8D\xC5 |0 + \x8D\xC6 |0 + \x8D\xC7 |0 + \x8D\xC8 |0 + \x8D\xC9 |0 + \x8D\xCA |0 + \x8D\xCB |0 + \xB6\xEA |0 + \xB6\xEB |0 + \x8D\xCC |0 + \x8D\xCD |0 + \x8D\xCE |0 + \x8D\xCF |0 + \x8D\xD0 |0 + \x8D\xD1 |0 + \x8D\xD2 |0 + \x8D\xD3 |0 + \x8D\xD4 |0 + \x8D\xD5 |0 + \xB6\xEC |0 + \x8D\xD6 |0 + \x8D\xD7 |0 + \x8D\xD8 |0 + \xB6\xED |0 + \x8D\xD9 |0 + \x8D\xDA |0 + \x8D\xDB |0 + \xB6\xEE |0 + \x8D\xDC |0 + \x8D\xDD |0 + \x8D\xDE |0 + \x8D\xDF |0 + \x8D\xE0 |0 + \x8D\xE1 |0 + \x8D\xE2 |0 + \xB6\xEF |0 + \xB6\xF0 |0 + \x8D\xE3 |0 + \xB6\xF1 |0 + \x8D\xE4 |0 + \xB6\xF2 |0 + \x8D\xE5 |0 + \x8D\xE6 |0 + \x8D\xE7 |0 + \x8D\xE8 |0 + \x8D\xE9 |0 + \x8D\xEA |0 + \xB6\xF3 |0 + \xB6\xF4 |0 + \x8D\xEB |0 + \x8D\xEC |0 + \xB6\xF5 |0 + \x8D\xED |0 + \x8D\xEE |0 + \x8D\xEF |0 + \xB6\xF6 |0 + \x8D\xF0 |0 + \x8D\xF1 |0 + \x8D\xF2 |0 + \x8D\xF3 |0 + \x8D\xF4 |0 + \x8D\xF5 |0 + \x8D\xF6 |0 + \xB6\xF7 |0 + \xB6\xF8 |0 + \x8D\xF7 |0 + \xB6\xF9 |0 + \xB6\xFA |0 + \xB6\xFB |0 + \xB6\xFC |0 + \x8D\xF8 |0 + \x8D\xF9 |0 + \x8D\xFA |0 + \xB6\xFD |0 + \xB6\xFE |0 + \xB7\xA1 |0 + \xB7\xA2 |0 + \x8D\xFB |0 + \x8D\xFC |0 + \xB7\xA3 |0 + \x8D\xFD |0 + \x8D\xFE |0 + \x8E\x41 |0 + \xB7\xA4 |0 + \x8E\x42 |0 + \x8E\x43 |0 + \x8E\x44 |0 + \x8E\x45 |0 + \x8E\x46 |0 + \x8E\x47 |0 + \x8E\x48 |0 + \xB7\xA5 |0 + \xB7\xA6 |0 + \x8E\x49 |0 + \xB7\xA7 |0 + \xB7\xA8 |0 + \xB7\xA9 |0 + \x8E\x4A |0 + \x8E\x4B |0 + \x8E\x4C |0 + \x8E\x4D |0 + \x8E\x4E |0 + \x8E\x4F |0 + \xB7\xAA |0 + \xB7\xAB |0 + \x8E\x50 |0 + \x8E\x51 |0 + \xB7\xAC |0 + \x8E\x52 |0 + \x8E\x53 |0 + \x8E\x54 |0 + \x8E\x55 |0 + \x8E\x56 |0 + \x8E\x57 |0 + \x8E\x58 |0 + \x8E\x59 |0 + \x8E\x5A |0 + \x8E\x61 |0 + \x8E\x62 |0 + \x8E\x63 |0 + \x8E\x64 |0 + \x8E\x65 |0 + \xB7\xAD |0 + \x8E\x66 |0 + \xB7\xAE |0 + \x8E\x67 |0 + \x8E\x68 |0 + \x8E\x69 |0 + \x8E\x6A |0 + \x8E\x6B |0 + \x8E\x6C |0 + \x8E\x6D |0 + \x8E\x6E |0 + \x8E\x6F |0 + \x8E\x70 |0 + \x8E\x71 |0 + \x8E\x72 |0 + \x8E\x73 |0 + \x8E\x74 |0 + \x8E\x75 |0 + \x8E\x76 |0 + \x8E\x77 |0 + \x8E\x78 |0 + \x8E\x79 |0 + \x8E\x7A |0 + \x8E\x81 |0 + \x8E\x82 |0 + \x8E\x83 |0 + \x8E\x84 |0 + \x8E\x85 |0 + \x8E\x86 |0 + \x8E\x87 |0 + \x8E\x88 |0 + \x8E\x89 |0 + \x8E\x8A |0 + \x8E\x8B |0 + \x8E\x8C |0 + \x8E\x8D |0 + \x8E\x8E |0 + \xB7\xAF |0 + \xB7\xB0 |0 + \x8E\x8F |0 + \x8E\x90 |0 + \xB7\xB1 |0 + \x8E\x91 |0 + \x8E\x92 |0 + \x8E\x93 |0 + \xB7\xB2 |0 + \x8E\x94 |0 + \x8E\x95 |0 + \x8E\x96 |0 + \x8E\x97 |0 + \x8E\x98 |0 + \x8E\x99 |0 + \x8E\x9A |0 + \xB7\xB3 |0 + \xB7\xB4 |0 + \x8E\x9B |0 + \xB7\xB5 |0 + \xB7\xB6 |0 + \xB7\xB7 |0 + \x8E\x9C |0 + \x8E\x9D |0 + \x8E\x9E |0 + \x8E\x9F |0 + \x8E\xA0 |0 + \xB7\xB8 |0 + \xB7\xB9 |0 + \xB7\xBA |0 + \x8E\xA1 |0 + \x8E\xA2 |0 + \xB7\xBB |0 + \x8E\xA3 |0 + \x8E\xA4 |0 + \x8E\xA5 |0 + \xB7\xBC |0 + \x8E\xA6 |0 + \x8E\xA7 |0 + \x8E\xA8 |0 + \x8E\xA9 |0 + \x8E\xAA |0 + \x8E\xAB |0 + \x8E\xAC |0 + \xB7\xBD |0 + \xB7\xBE |0 + \x8E\xAD |0 + \xB7\xBF |0 + \x8E\xAE |0 + \xB7\xC0 |0 + \x8E\xAF |0 + \x8E\xB0 |0 + \x8E\xB1 |0 + \x8E\xB2 |0 + \x8E\xB3 |0 + \x8E\xB4 |0 + \xB7\xC1 |0 + \xB7\xC2 |0 + \x8E\xB5 |0 + \x8E\xB6 |0 + \xB7\xC3 |0 + \x8E\xB7 |0 + \x8E\xB8 |0 + \x8E\xB9 |0 + \xB7\xC4 |0 + \x8E\xBA |0 + \x8E\xBB |0 + \x8E\xBC |0 + \x8E\xBD |0 + \x8E\xBE |0 + \x8E\xBF |0 + \x8E\xC0 |0 + \xB7\xC5 |0 + \xB7\xC6 |0 + \x8E\xC1 |0 + \xB7\xC7 |0 + \xB7\xC8 |0 + \xB7\xC9 |0 + \x8E\xC2 |0 + \x8E\xC3 |0 + \x8E\xC4 |0 + \x8E\xC5 |0 + \x8E\xC6 |0 + \x8E\xC7 |0 + \xB7\xCA |0 + \x8E\xC8 |0 + \x8E\xC9 |0 + \x8E\xCA |0 + \xB7\xCB |0 + \x8E\xCB |0 + \x8E\xCC |0 + \x8E\xCD |0 + \x8E\xCE |0 + \x8E\xCF |0 + \x8E\xD0 |0 + \x8E\xD1 |0 + \x8E\xD2 |0 + \x8E\xD3 |0 + \x8E\xD4 |0 + \x8E\xD5 |0 + \x8E\xD6 |0 + \xB7\xCC |0 + \x8E\xD7 |0 + \xB7\xCD |0 + \x8E\xD8 |0 + \x8E\xD9 |0 + \x8E\xDA |0 + \x8E\xDB |0 + \x8E\xDC |0 + \x8E\xDD |0 + \x8E\xDE |0 + \x8E\xDF |0 + \xB7\xCE |0 + \xB7\xCF |0 + \x8E\xE0 |0 + \x8E\xE1 |0 + \xB7\xD0 |0 + \x8E\xE2 |0 + \x8E\xE3 |0 + \x8E\xE4 |0 + \xB7\xD1 |0 + \x8E\xE5 |0 + \x8E\xE6 |0 + \x8E\xE7 |0 + \x8E\xE8 |0 + \x8E\xE9 |0 + \x8E\xEA |0 + \x8E\xEB |0 + \xB7\xD2 |0 + \xB7\xD3 |0 + \x8E\xEC |0 + \xB7\xD4 |0 + \x8E\xED |0 + \xB7\xD5 |0 + \x8E\xEE |0 + \x8E\xEF |0 + \x8E\xF0 |0 + \x8E\xF1 |0 + \x8E\xF2 |0 + \x8E\xF3 |0 + \xB7\xD6 |0 + \x8E\xF4 |0 + \x8E\xF5 |0 + \x8E\xF6 |0 + \xB7\xD7 |0 + \x8E\xF7 |0 + \x8E\xF8 |0 + \x8E\xF9 |0 + \x8E\xFA |0 + \x8E\xFB |0 + \x8E\xFC |0 + \x8E\xFD |0 + \x8E\xFE |0 + \x8F\x41 |0 + \x8F\x42 |0 + \x8F\x43 |0 + \x8F\x44 |0 + \x8F\x45 |0 + \x8F\x46 |0 + \x8F\x47 |0 + \x8F\x48 |0 + \xB7\xD8 |0 + \x8F\x49 |0 + \x8F\x4A |0 + \x8F\x4B |0 + \x8F\x4C |0 + \x8F\x4D |0 + \x8F\x4E |0 + \x8F\x4F |0 + \x8F\x50 |0 + \x8F\x51 |0 + \x8F\x52 |0 + \x8F\x53 |0 + \x8F\x54 |0 + \x8F\x55 |0 + \x8F\x56 |0 + \x8F\x57 |0 + \x8F\x58 |0 + \x8F\x59 |0 + \x8F\x5A |0 + \x8F\x61 |0 + \x8F\x62 |0 + \x8F\x63 |0 + \x8F\x64 |0 + \x8F\x65 |0 + \x8F\x66 |0 + \x8F\x67 |0 + \x8F\x68 |0 + \xB7\xD9 |0 + \x8F\x69 |0 + \x8F\x6A |0 + \x8F\x6B |0 + \x8F\x6C |0 + \x8F\x6D |0 + \x8F\x6E |0 + \x8F\x6F |0 + \xB7\xDA |0 + \x8F\x70 |0 + \x8F\x71 |0 + \x8F\x72 |0 + \xB7\xDB |0 + \x8F\x73 |0 + \x8F\x74 |0 + \x8F\x75 |0 + \xB7\xDC |0 + \x8F\x76 |0 + \x8F\x77 |0 + \x8F\x78 |0 + \x8F\x79 |0 + \x8F\x7A |0 + \x8F\x81 |0 + \x8F\x82 |0 + \xB7\xDD |0 + \xB7\xDE |0 + \x8F\x83 |0 + \xB7\xDF |0 + \x8F\x84 |0 + \xB7\xE0 |0 + \x8F\x85 |0 + \x8F\x86 |0 + \x8F\x87 |0 + \x8F\x88 |0 + \x8F\x89 |0 + \x8F\x8A |0 + \xB7\xE1 |0 + \x8F\x8B |0 + \x8F\x8C |0 + \x8F\x8D |0 + \xB7\xE2 |0 + \x8F\x8E |0 + \x8F\x8F |0 + \x8F\x90 |0 + \xB7\xE3 |0 + \x8F\x91 |0 + \x8F\x92 |0 + \x8F\x93 |0 + \x8F\x94 |0 + \x8F\x95 |0 + \x8F\x96 |0 + \x8F\x97 |0 + \x8F\x98 |0 + \xB7\xE4 |0 + \x8F\x99 |0 + \xB7\xE5 |0 + \x8F\x9A |0 + \xB7\xE6 |0 + \x8F\x9B |0 + \x8F\x9C |0 + \x8F\x9D |0 + \x8F\x9E |0 + \x8F\x9F |0 + \x8F\xA0 |0 + \xB7\xE7 |0 + \xB7\xE8 |0 + \x8F\xA1 |0 + \x8F\xA2 |0 + \xB7\xE9 |0 + \x8F\xA3 |0 + \x8F\xA4 |0 + \x8F\xA5 |0 + \xB7\xEA |0 + \x8F\xA6 |0 + \x8F\xA7 |0 + \x8F\xA8 |0 + \x8F\xA9 |0 + \x8F\xAA |0 + \x8F\xAB |0 + \x8F\xAC |0 + \xB7\xEB |0 + \xB7\xEC |0 + \x8F\xAD |0 + \xB7\xED |0 + \x8F\xAE |0 + \xB7\xEE |0 + \x8F\xAF |0 + \x8F\xB0 |0 + \x8F\xB1 |0 + \x8F\xB2 |0 + \x8F\xB3 |0 + \x8F\xB4 |0 + \xB7\xEF |0 + \x8F\xB5 |0 + \x8F\xB6 |0 + \x8F\xB7 |0 + \x8F\xB8 |0 + \x8F\xB9 |0 + \x8F\xBA |0 + \x8F\xBB |0 + \x8F\xBC |0 + \x8F\xBD |0 + \x8F\xBE |0 + \x8F\xBF |0 + \x8F\xC0 |0 + \x8F\xC1 |0 + \x8F\xC2 |0 + \x8F\xC3 |0 + \x8F\xC4 |0 + \x8F\xC5 |0 + \x8F\xC6 |0 + \x8F\xC7 |0 + \xB7\xF0 |0 + \x8F\xC8 |0 + \x8F\xC9 |0 + \x8F\xCA |0 + \x8F\xCB |0 + \x8F\xCC |0 + \x8F\xCD |0 + \x8F\xCE |0 + \xB7\xF1 |0 + \x8F\xCF |0 + \x8F\xD0 |0 + \x8F\xD1 |0 + \x8F\xD2 |0 + \x8F\xD3 |0 + \x8F\xD4 |0 + \x8F\xD5 |0 + \x8F\xD6 |0 + \x8F\xD7 |0 + \x8F\xD8 |0 + \x8F\xD9 |0 + \x8F\xDA |0 + \x8F\xDB |0 + \x8F\xDC |0 + \x8F\xDD |0 + \x8F\xDE |0 + \x8F\xDF |0 + \x8F\xE0 |0 + \x8F\xE1 |0 + \x8F\xE2 |0 + \x8F\xE3 |0 + \x8F\xE4 |0 + \x8F\xE5 |0 + \x8F\xE6 |0 + \x8F\xE7 |0 + \x8F\xE8 |0 + \x8F\xE9 |0 + \xB7\xF2 |0 + \xB7\xF3 |0 + \x8F\xEA |0 + \x8F\xEB |0 + \xB7\xF4 |0 + \x8F\xEC |0 + \x8F\xED |0 + \x8F\xEE |0 + \xB7\xF5 |0 + \x8F\xEF |0 + \x8F\xF0 |0 + \x8F\xF1 |0 + \x8F\xF2 |0 + \x8F\xF3 |0 + \x8F\xF4 |0 + \x8F\xF5 |0 + \xB7\xF6 |0 + \x8F\xF6 |0 + \x8F\xF7 |0 + \xB7\xF7 |0 + \x8F\xF8 |0 + \xB7\xF8 |0 + \x8F\xF9 |0 + \x8F\xFA |0 + \x8F\xFB |0 + \x8F\xFC |0 + \x8F\xFD |0 + \x8F\xFE |0 + \xB7\xF9 |0 + \xB7\xFA |0 + \x90\x41 |0 + \x90\x42 |0 + \xB7\xFB |0 + \x90\x43 |0 + \x90\x44 |0 + \x90\x45 |0 + \xB7\xFC |0 + \x90\x46 |0 + \x90\x47 |0 + \x90\x48 |0 + \x90\x49 |0 + \x90\x4A |0 + \x90\x4B |0 + \x90\x4C |0 + \xB7\xFD |0 + \xB7\xFE |0 + \x90\x4D |0 + \xB8\xA1 |0 + \x90\x4E |0 + \xB8\xA2 |0 + \x90\x4F |0 + \x90\x50 |0 + \x90\x51 |0 + \x90\x52 |0 + \x90\x53 |0 + \x90\x54 |0 + \xB8\xA3 |0 + \xB8\xA4 |0 + \x90\x55 |0 + \x90\x56 |0 + \xB8\xA5 |0 + \x90\x57 |0 + \x90\x58 |0 + \x90\x59 |0 + \xB8\xA6 |0 + \x90\x5A |0 + \x90\x61 |0 + \x90\x62 |0 + \x90\x63 |0 + \x90\x64 |0 + \x90\x65 |0 + \x90\x66 |0 + \xB8\xA7 |0 + \xB8\xA8 |0 + \x90\x67 |0 + \xB8\xA9 |0 + \x90\x68 |0 + \xB8\xAA |0 + \xB8\xAB |0 + \x90\x69 |0 + \x90\x6A |0 + \xB8\xAC |0 + \xB8\xAD |0 + \x90\x6B |0 + \x90\x6C |0 + \x90\x6D |0 + \x90\x6E |0 + \x90\x6F |0 + \x90\x70 |0 + \x90\x71 |0 + \x90\x72 |0 + \x90\x73 |0 + \x90\x74 |0 + \x90\x75 |0 + \x90\x76 |0 + \x90\x77 |0 + \x90\x78 |0 + \x90\x79 |0 + \x90\x7A |0 + \x90\x81 |0 + \x90\x82 |0 + \x90\x83 |0 + \x90\x84 |0 + \x90\x85 |0 + \x90\x86 |0 + \x90\x87 |0 + \x90\x88 |0 + \x90\x89 |0 + \x90\x8A |0 + \x90\x8B |0 + \x90\x8C |0 + \x90\x8D |0 + \xB8\xAE |0 + \xB8\xAF |0 + \x90\x8E |0 + \x90\x8F |0 + \xB8\xB0 |0 + \x90\x90 |0 + \x90\x91 |0 + \x90\x92 |0 + \xB8\xB1 |0 + \x90\x93 |0 + \x90\x94 |0 + \x90\x95 |0 + \x90\x96 |0 + \x90\x97 |0 + \x90\x98 |0 + \x90\x99 |0 + \xB8\xB2 |0 + \xB8\xB3 |0 + \x90\x9A |0 + \xB8\xB4 |0 + \x90\x9B |0 + \xB8\xB5 |0 + \x90\x9C |0 + \x90\x9D |0 + \x90\x9E |0 + \x90\x9F |0 + \x90\xA0 |0 + \x90\xA1 |0 + \xB8\xB6 |0 + \xB8\xB7 |0 + \x90\xA2 |0 + \x90\xA3 |0 + \xB8\xB8 |0 + \x90\xA4 |0 + \xB8\xB9 |0 + \xB8\xBA |0 + \xB8\xBB |0 + \xB8\xBC |0 + \xB8\xBD |0 + \x90\xA5 |0 + \x90\xA6 |0 + \x90\xA7 |0 + \x90\xA8 |0 + \x90\xA9 |0 + \xB8\xBE |0 + \xB8\xBF |0 + \x90\xAA |0 + \xB8\xC0 |0 + \x90\xAB |0 + \xB8\xC1 |0 + \xB8\xC2 |0 + \x90\xAC |0 + \x90\xAD |0 + \xB8\xC3 |0 + \x90\xAE |0 + \xB8\xC4 |0 + \xB8\xC5 |0 + \xB8\xC6 |0 + \x90\xAF |0 + \x90\xB0 |0 + \xB8\xC7 |0 + \x90\xB1 |0 + \x90\xB2 |0 + \x90\xB3 |0 + \xB8\xC8 |0 + \x90\xB4 |0 + \x90\xB5 |0 + \x90\xB6 |0 + \x90\xB7 |0 + \x90\xB8 |0 + \x90\xB9 |0 + \x90\xBA |0 + \xB8\xC9 |0 + \xB8\xCA |0 + \x90\xBB |0 + \xB8\xCB |0 + \xB8\xCC |0 + \xB8\xCD |0 + \xB8\xCE |0 + \x90\xBC |0 + \x90\xBD |0 + \x90\xBE |0 + \x90\xBF |0 + \x90\xC0 |0 + \xB8\xCF |0 + \xB8\xD0 |0 + \x90\xC1 |0 + \x90\xC2 |0 + \x90\xC3 |0 + \x90\xC4 |0 + \x90\xC5 |0 + \x90\xC6 |0 + \xB8\xD1 |0 + \x90\xC7 |0 + \x90\xC8 |0 + \x90\xC9 |0 + \x90\xCA |0 + \x90\xCB |0 + \x90\xCC |0 + \x90\xCD |0 + \x90\xCE |0 + \x90\xCF |0 + \x90\xD0 |0 + \x90\xD1 |0 + \x90\xD2 |0 + \xB8\xD2 |0 + \x90\xD3 |0 + \x90\xD4 |0 + \x90\xD5 |0 + \x90\xD6 |0 + \x90\xD7 |0 + \x90\xD8 |0 + \x90\xD9 |0 + \x90\xDA |0 + \x90\xDB |0 + \x90\xDC |0 + \x90\xDD |0 + \x90\xDE |0 + \x90\xDF |0 + \x90\xE0 |0 + \x90\xE1 |0 + \x90\xE2 |0 + \x90\xE3 |0 + \x90\xE4 |0 + \x90\xE5 |0 + \x90\xE6 |0 + \x90\xE7 |0 + \x90\xE8 |0 + \x90\xE9 |0 + \x90\xEA |0 + \x90\xEB |0 + \x90\xEC |0 + \x90\xED |0 + \x90\xEE |0 + \x90\xEF |0 + \x90\xF0 |0 + \x90\xF1 |0 + \x90\xF2 |0 + \x90\xF3 |0 + \x90\xF4 |0 + \xB8\xD3 |0 + \xB8\xD4 |0 + \x90\xF5 |0 + \x90\xF6 |0 + \xB8\xD5 |0 + \x90\xF7 |0 + \x90\xF8 |0 + \x90\xF9 |0 + \xB8\xD6 |0 + \x90\xFA |0 + \xB8\xD7 |0 + \x90\xFB |0 + \x90\xFC |0 + \x90\xFD |0 + \x90\xFE |0 + \x91\x41 |0 + \xB8\xD8 |0 + \xB8\xD9 |0 + \x91\x42 |0 + \xB8\xDA |0 + \x91\x43 |0 + \xB8\xDB |0 + \xB8\xDC |0 + \x91\x44 |0 + \x91\x45 |0 + \x91\x46 |0 + \x91\x47 |0 + \xB8\xDD |0 + \xB8\xDE |0 + \xB8\xDF |0 + \x91\x48 |0 + \x91\x49 |0 + \xB8\xE0 |0 + \x91\x4A |0 + \x91\x4B |0 + \x91\x4C |0 + \xB8\xE1 |0 + \x91\x4D |0 + \x91\x4E |0 + \x91\x4F |0 + \x91\x50 |0 + \x91\x51 |0 + \x91\x52 |0 + \x91\x53 |0 + \xB8\xE2 |0 + \xB8\xE3 |0 + \x91\x54 |0 + \xB8\xE4 |0 + \xB8\xE5 |0 + \xB8\xE6 |0 + \x91\x55 |0 + \x91\x56 |0 + \x91\x57 |0 + \x91\x58 |0 + \x91\x59 |0 + \x91\x5A |0 + \xB8\xE7 |0 + \xB8\xE8 |0 + \x91\x61 |0 + \x91\x62 |0 + \xB8\xE9 |0 + \x91\x63 |0 + \x91\x64 |0 + \x91\x65 |0 + \xB8\xEA |0 + \x91\x66 |0 + \x91\x67 |0 + \x91\x68 |0 + \x91\x69 |0 + \x91\x6A |0 + \x91\x6B |0 + \x91\x6C |0 + \x91\x6D |0 + \x91\x6E |0 + \x91\x6F |0 + \xB8\xEB |0 + \xB8\xEC |0 + \xB8\xED |0 + \x91\x70 |0 + \xB8\xEE |0 + \x91\x71 |0 + \x91\x72 |0 + \x91\x73 |0 + \x91\x74 |0 + \xB8\xEF |0 + \x91\x75 |0 + \x91\x76 |0 + \x91\x77 |0 + \x91\x78 |0 + \x91\x79 |0 + \x91\x7A |0 + \x91\x81 |0 + \x91\x82 |0 + \x91\x83 |0 + \x91\x84 |0 + \x91\x85 |0 + \x91\x86 |0 + \x91\x87 |0 + \x91\x88 |0 + \x91\x89 |0 + \x91\x8A |0 + \x91\x8B |0 + \x91\x8C |0 + \x91\x8D |0 + \x91\x8E |0 + \x91\x8F |0 + \x91\x90 |0 + \x91\x91 |0 + \x91\x92 |0 + \x91\x93 |0 + \x91\x94 |0 + \x91\x95 |0 + \xB8\xF0 |0 + \xB8\xF1 |0 + \x91\x96 |0 + \xB8\xF2 |0 + \xB8\xF3 |0 + \x91\x97 |0 + \x91\x98 |0 + \x91\x99 |0 + \xB8\xF4 |0 + \x91\x9A |0 + \xB8\xF5 |0 + \x91\x9B |0 + \x91\x9C |0 + \x91\x9D |0 + \x91\x9E |0 + \x91\x9F |0 + \xB8\xF6 |0 + \xB8\xF7 |0 + \x91\xA0 |0 + \xB8\xF8 |0 + \x91\xA1 |0 + \xB8\xF9 |0 + \x91\xA2 |0 + \x91\xA3 |0 + \x91\xA4 |0 + \x91\xA5 |0 + \x91\xA6 |0 + \x91\xA7 |0 + \xB8\xFA |0 + \x91\xA8 |0 + \x91\xA9 |0 + \x91\xAA |0 + \xB8\xFB |0 + \x91\xAB |0 + \x91\xAC |0 + \x91\xAD |0 + \x91\xAE |0 + \x91\xAF |0 + \x91\xB0 |0 + \x91\xB1 |0 + \x91\xB2 |0 + \x91\xB3 |0 + \x91\xB4 |0 + \x91\xB5 |0 + \x91\xB6 |0 + \x91\xB7 |0 + \x91\xB8 |0 + \x91\xB9 |0 + \xB8\xFC |0 + \xB8\xFD |0 + \x91\xBA |0 + \x91\xBB |0 + \x91\xBC |0 + \x91\xBD |0 + \x91\xBE |0 + \x91\xBF |0 + \x91\xC0 |0 + \x91\xC1 |0 + \x91\xC2 |0 + \x91\xC3 |0 + \x91\xC4 |0 + \x91\xC5 |0 + \x91\xC6 |0 + \x91\xC7 |0 + \x91\xC8 |0 + \x91\xC9 |0 + \x91\xCA |0 + \x91\xCB |0 + \x91\xCC |0 + \x91\xCD |0 + \x91\xCE |0 + \x91\xCF |0 + \x91\xD0 |0 + \x91\xD1 |0 + \x91\xD2 |0 + \x91\xD3 |0 + \x91\xD4 |0 + \x91\xD5 |0 + \x91\xD6 |0 + \x91\xD7 |0 + \x91\xD8 |0 + \x91\xD9 |0 + \x91\xDA |0 + \x91\xDB |0 + \xB8\xFE |0 + \x91\xDC |0 + \x91\xDD |0 + \x91\xDE |0 + \xB9\xA1 |0 + \x91\xDF |0 + \x91\xE0 |0 + \x91\xE1 |0 + \xB9\xA2 |0 + \x91\xE2 |0 + \x91\xE3 |0 + \x91\xE4 |0 + \x91\xE5 |0 + \x91\xE6 |0 + \x91\xE7 |0 + \x91\xE8 |0 + \x91\xE9 |0 + \xB9\xA3 |0 + \x91\xEA |0 + \xB9\xA4 |0 + \x91\xEB |0 + \xB9\xA5 |0 + \x91\xEC |0 + \x91\xED |0 + \x91\xEE |0 + \x91\xEF |0 + \x91\xF0 |0 + \x91\xF1 |0 + \xB9\xA6 |0 + \x91\xF2 |0 + \x91\xF3 |0 + \x91\xF4 |0 + \xB9\xA7 |0 + \x91\xF5 |0 + \x91\xF6 |0 + \x91\xF7 |0 + \xB9\xA8 |0 + \x91\xF8 |0 + \x91\xF9 |0 + \x91\xFA |0 + \x91\xFB |0 + \x91\xFC |0 + \x91\xFD |0 + \x91\xFE |0 + \x92\x41 |0 + \xB9\xA9 |0 + \x92\x42 |0 + \xB9\xAA |0 + \x92\x43 |0 + \x92\x44 |0 + \x92\x45 |0 + \x92\x46 |0 + \x92\x47 |0 + \x92\x48 |0 + \x92\x49 |0 + \x92\x4A |0 + \xB9\xAB |0 + \xB9\xAC |0 + \xB9\xAD |0 + \x92\x4B |0 + \xB9\xAE |0 + \x92\x4C |0 + \x92\x4D |0 + \xB9\xAF |0 + \xB9\xB0 |0 + \xB9\xB1 |0 + \xB9\xB2 |0 + \x92\x4E |0 + \x92\x4F |0 + \x92\x50 |0 + \x92\x51 |0 + \x92\x52 |0 + \xB9\xB3 |0 + \xB9\xB4 |0 + \x92\x53 |0 + \xB9\xB5 |0 + \x92\x54 |0 + \xB9\xB6 |0 + \x92\x55 |0 + \x92\x56 |0 + \x92\x57 |0 + \xB9\xB7 |0 + \x92\x58 |0 + \xB9\xB8 |0 + \xB9\xB9 |0 + \x92\x59 |0 + \x92\x5A |0 + \x92\x61 |0 + \xB9\xBA |0 + \x92\x62 |0 + \x92\x63 |0 + \x92\x64 |0 + \xB9\xBB |0 + \x92\x65 |0 + \x92\x66 |0 + \x92\x67 |0 + \x92\x68 |0 + \x92\x69 |0 + \x92\x6A |0 + \x92\x6B |0 + \x92\x6C |0 + \xB9\xBC |0 + \x92\x6D |0 + \xB9\xBD |0 + \x92\x6E |0 + \x92\x6F |0 + \x92\x70 |0 + \x92\x71 |0 + \x92\x72 |0 + \x92\x73 |0 + \x92\x74 |0 + \x92\x75 |0 + \xB9\xBE |0 + \x92\x76 |0 + \x92\x77 |0 + \x92\x78 |0 + \x92\x79 |0 + \x92\x7A |0 + \x92\x81 |0 + \x92\x82 |0 + \x92\x83 |0 + \x92\x84 |0 + \x92\x85 |0 + \x92\x86 |0 + \x92\x87 |0 + \x92\x88 |0 + \x92\x89 |0 + \x92\x8A |0 + \x92\x8B |0 + \x92\x8C |0 + \x92\x8D |0 + \x92\x8E |0 + \x92\x8F |0 + \x92\x90 |0 + \x92\x91 |0 + \x92\x92 |0 + \x92\x93 |0 + \x92\x94 |0 + \x92\x95 |0 + \x92\x96 |0 + \xB9\xBF |0 + \x92\x97 |0 + \x92\x98 |0 + \x92\x99 |0 + \xB9\xC0 |0 + \x92\x9A |0 + \x92\x9B |0 + \x92\x9C |0 + \xB9\xC1 |0 + \x92\x9D |0 + \x92\x9E |0 + \x92\x9F |0 + \x92\xA0 |0 + \x92\xA1 |0 + \x92\xA2 |0 + \x92\xA3 |0 + \x92\xA4 |0 + \x92\xA5 |0 + \x92\xA6 |0 + \x92\xA7 |0 + \x92\xA8 |0 + \x92\xA9 |0 + \x92\xAA |0 + \x92\xAB |0 + \x92\xAC |0 + \x92\xAD |0 + \x92\xAE |0 + \x92\xAF |0 + \xB9\xC2 |0 + \x92\xB0 |0 + \x92\xB1 |0 + \x92\xB2 |0 + \xB9\xC3 |0 + \x92\xB3 |0 + \x92\xB4 |0 + \x92\xB5 |0 + \xB9\xC4 |0 + \x92\xB6 |0 + \x92\xB7 |0 + \x92\xB8 |0 + \x92\xB9 |0 + \x92\xBA |0 + \x92\xBB |0 + \x92\xBC |0 + \xB9\xC5 |0 + \x92\xBD |0 + \x92\xBE |0 + \xB9\xC6 |0 + \x92\xBF |0 + \x92\xC0 |0 + \x92\xC1 |0 + \x92\xC2 |0 + \x92\xC3 |0 + \x92\xC4 |0 + \x92\xC5 |0 + \x92\xC6 |0 + \xB9\xC7 |0 + \x92\xC7 |0 + \x92\xC8 |0 + \x92\xC9 |0 + \xB9\xC8 |0 + \x92\xCA |0 + \x92\xCB |0 + \x92\xCC |0 + \xB9\xC9 |0 + \x92\xCD |0 + \x92\xCE |0 + \x92\xCF |0 + \x92\xD0 |0 + \x92\xD1 |0 + \x92\xD2 |0 + \x92\xD3 |0 + \xB9\xCA |0 + \x92\xD4 |0 + \x92\xD5 |0 + \xB9\xCB |0 + \x92\xD6 |0 + \x92\xD7 |0 + \x92\xD8 |0 + \x92\xD9 |0 + \x92\xDA |0 + \x92\xDB |0 + \x92\xDC |0 + \x92\xDD |0 + \x92\xDE |0 + \x92\xDF |0 + \x92\xE0 |0 + \x92\xE1 |0 + \x92\xE2 |0 + \x92\xE3 |0 + \x92\xE4 |0 + \x92\xE5 |0 + \x92\xE6 |0 + \x92\xE7 |0 + \x92\xE8 |0 + \x92\xE9 |0 + \x92\xEA |0 + \x92\xEB |0 + \x92\xEC |0 + \x92\xED |0 + \x92\xEE |0 + \x92\xEF |0 + \x92\xF0 |0 + \x92\xF1 |0 + \x92\xF2 |0 + \x92\xF3 |0 + \x92\xF4 |0 + \x92\xF5 |0 + \x92\xF6 |0 + \x92\xF7 |0 + \x92\xF8 |0 + \x92\xF9 |0 + \xB9\xCC |0 + \xB9\xCD |0 + \x92\xFA |0 + \x92\xFB |0 + \xB9\xCE |0 + \x92\xFC |0 + \x92\xFD |0 + \xB9\xCF |0 + \xB9\xD0 |0 + \x92\xFE |0 + \xB9\xD1 |0 + \x93\x41 |0 + \x93\x42 |0 + \x93\x43 |0 + \x93\x44 |0 + \x93\x45 |0 + \xB9\xD2 |0 + \xB9\xD3 |0 + \x93\x46 |0 + \xB9\xD4 |0 + \xB9\xD5 |0 + \xB9\xD6 |0 + \x93\x47 |0 + \xB9\xD7 |0 + \x93\x48 |0 + \xB9\xD8 |0 + \x93\x49 |0 + \x93\x4A |0 + \xB9\xD9 |0 + \xB9\xDA |0 + \xB9\xDB |0 + \xB9\xDC |0 + \xB9\xDD |0 + \x93\x4B |0 + \x93\x4C |0 + \xB9\xDE |0 + \xB9\xDF |0 + \xB9\xE0 |0 + \xB9\xE1 |0 + \xB9\xE2 |0 + \x93\x4D |0 + \x93\x4E |0 + \x93\x4F |0 + \x93\x50 |0 + \xB9\xE3 |0 + \xB9\xE4 |0 + \x93\x51 |0 + \xB9\xE5 |0 + \x93\x52 |0 + \xB9\xE6 |0 + \x93\x53 |0 + \x93\x54 |0 + \x93\x55 |0 + \xB9\xE7 |0 + \x93\x56 |0 + \x93\x57 |0 + \xB9\xE8 |0 + \xB9\xE9 |0 + \x93\x58 |0 + \x93\x59 |0 + \xB9\xEA |0 + \x93\x5A |0 + \x93\x61 |0 + \x93\x62 |0 + \xB9\xEB |0 + \x93\x63 |0 + \x93\x64 |0 + \x93\x65 |0 + \x93\x66 |0 + \x93\x67 |0 + \x93\x68 |0 + \x93\x69 |0 + \xB9\xEC |0 + \xB9\xED |0 + \x93\x6A |0 + \xB9\xEE |0 + \xB9\xEF |0 + \xB9\xF0 |0 + \x93\x6B |0 + \x93\x6C |0 + \x93\x6D |0 + \xB9\xF1 |0 + \x93\x6E |0 + \x93\x6F |0 + \xB9\xF2 |0 + \xB9\xF3 |0 + \x93\x70 |0 + \x93\x71 |0 + \xB9\xF4 |0 + \x93\x72 |0 + \x93\x73 |0 + \x93\x74 |0 + \x93\x75 |0 + \x93\x76 |0 + \x93\x77 |0 + \x93\x78 |0 + \x93\x79 |0 + \x93\x7A |0 + \x93\x81 |0 + \x93\x82 |0 + \x93\x83 |0 + \xB9\xF5 |0 + \x93\x84 |0 + \x93\x85 |0 + \x93\x86 |0 + \x93\x87 |0 + \x93\x88 |0 + \x93\x89 |0 + \x93\x8A |0 + \x93\x8B |0 + \x93\x8C |0 + \x93\x8D |0 + \x93\x8E |0 + \x93\x8F |0 + \x93\x90 |0 + \x93\x91 |0 + \x93\x92 |0 + \x93\x93 |0 + \x93\x94 |0 + \x93\x95 |0 + \x93\x96 |0 + \x93\x97 |0 + \x93\x98 |0 + \x93\x99 |0 + \x93\x9A |0 + \x93\x9B |0 + \x93\x9C |0 + \x93\x9D |0 + \x93\x9E |0 + \x93\x9F |0 + \x93\xA0 |0 + \x93\xA1 |0 + \x93\xA2 |0 + \x93\xA3 |0 + \x93\xA4 |0 + \x93\xA5 |0 + \x93\xA6 |0 + \x93\xA7 |0 + \x93\xA8 |0 + \x93\xA9 |0 + \xB9\xF6 |0 + \xB9\xF7 |0 + \x93\xAA |0 + \x93\xAB |0 + \xB9\xF8 |0 + \x93\xAC |0 + \x93\xAD |0 + \xB9\xF9 |0 + \xB9\xFA |0 + \x93\xAE |0 + \xB9\xFB |0 + \x93\xAF |0 + \x93\xB0 |0 + \x93\xB1 |0 + \x93\xB2 |0 + \x93\xB3 |0 + \xB9\xFC |0 + \xB9\xFD |0 + \x93\xB4 |0 + \xB9\xFE |0 + \x93\xB5 |0 + \xBA\xA1 |0 + \xBA\xA2 |0 + \x93\xB6 |0 + \x93\xB7 |0 + \x93\xB8 |0 + \x93\xB9 |0 + \x93\xBA |0 + \xBA\xA3 |0 + \xBA\xA4 |0 + \x93\xBB |0 + \x93\xBC |0 + \xBA\xA5 |0 + \x93\xBD |0 + \x93\xBE |0 + \xBA\xA6 |0 + \xBA\xA7 |0 + \x93\xBF |0 + \x93\xC0 |0 + \x93\xC1 |0 + \x93\xC2 |0 + \x93\xC3 |0 + \x93\xC4 |0 + \x93\xC5 |0 + \xBA\xA8 |0 + \xBA\xA9 |0 + \x93\xC6 |0 + \xBA\xAA |0 + \xBA\xAB |0 + \xBA\xAC |0 + \x93\xC7 |0 + \x93\xC8 |0 + \x93\xC9 |0 + \x93\xCA |0 + \x93\xCB |0 + \x93\xCC |0 + \xBA\xAD |0 + \xBA\xAE |0 + \x93\xCD |0 + \x93\xCE |0 + \xBA\xAF |0 + \x93\xCF |0 + \x93\xD0 |0 + \x93\xD1 |0 + \xBA\xB0 |0 + \x93\xD2 |0 + \x93\xD3 |0 + \x93\xD4 |0 + \x93\xD5 |0 + \x93\xD6 |0 + \x93\xD7 |0 + \x93\xD8 |0 + \x93\xD9 |0 + \xBA\xB1 |0 + \x93\xDA |0 + \xBA\xB2 |0 + \xBA\xB3 |0 + \xBA\xB4 |0 + \x93\xDB |0 + \x93\xDC |0 + \x93\xDD |0 + \xBA\xB5 |0 + \x93\xDE |0 + \x93\xDF |0 + \xBA\xB6 |0 + \x93\xE0 |0 + \x93\xE1 |0 + \x93\xE2 |0 + \xBA\xB7 |0 + \x93\xE3 |0 + \x93\xE4 |0 + \x93\xE5 |0 + \x93\xE6 |0 + \x93\xE7 |0 + \x93\xE8 |0 + \x93\xE9 |0 + \x93\xEA |0 + \x93\xEB |0 + \x93\xEC |0 + \x93\xED |0 + \x93\xEE |0 + \x93\xEF |0 + \x93\xF0 |0 + \x93\xF1 |0 + \x93\xF2 |0 + \x93\xF3 |0 + \x93\xF4 |0 + \x93\xF5 |0 + \x93\xF6 |0 + \x93\xF7 |0 + \x93\xF8 |0 + \x93\xF9 |0 + \xBA\xB8 |0 + \xBA\xB9 |0 + \xBA\xBA |0 + \x93\xFA |0 + \xBA\xBB |0 + \x93\xFB |0 + \x93\xFC |0 + \x93\xFD |0 + \xBA\xBC |0 + \x93\xFE |0 + \x94\x41 |0 + \x94\x42 |0 + \x94\x43 |0 + \x94\x44 |0 + \x94\x45 |0 + \x94\x46 |0 + \xBA\xBD |0 + \xBA\xBE |0 + \x94\x47 |0 + \xBA\xBF |0 + \x94\x48 |0 + \xBA\xC0 |0 + \x94\x49 |0 + \x94\x4A |0 + \x94\x4B |0 + \x94\x4C |0 + \x94\x4D |0 + \x94\x4E |0 + \xBA\xC1 |0 + \x94\x4F |0 + \x94\x50 |0 + \x94\x51 |0 + \xBA\xC2 |0 + \x94\x52 |0 + \x94\x53 |0 + \x94\x54 |0 + \x94\x55 |0 + \x94\x56 |0 + \x94\x57 |0 + \x94\x58 |0 + \x94\x59 |0 + \x94\x5A |0 + \x94\x61 |0 + \x94\x62 |0 + \x94\x63 |0 + \x94\x64 |0 + \x94\x65 |0 + \x94\x66 |0 + \xBA\xC3 |0 + \x94\x67 |0 + \x94\x68 |0 + \x94\x69 |0 + \x94\x6A |0 + \x94\x6B |0 + \x94\x6C |0 + \x94\x6D |0 + \xBA\xC4 |0 + \x94\x6E |0 + \x94\x6F |0 + \x94\x70 |0 + \x94\x71 |0 + \x94\x72 |0 + \x94\x73 |0 + \x94\x74 |0 + \x94\x75 |0 + \x94\x76 |0 + \x94\x77 |0 + \x94\x78 |0 + \x94\x79 |0 + \x94\x7A |0 + \x94\x81 |0 + \x94\x82 |0 + \x94\x83 |0 + \x94\x84 |0 + \x94\x85 |0 + \x94\x86 |0 + \xBA\xC5 |0 + \x94\x87 |0 + \x94\x88 |0 + \x94\x89 |0 + \x94\x8A |0 + \x94\x8B |0 + \x94\x8C |0 + \x94\x8D |0 + \xBA\xC6 |0 + \xBA\xC7 |0 + \x94\x8E |0 + \x94\x8F |0 + \xBA\xC8 |0 + \x94\x90 |0 + \x94\x91 |0 + \x94\x92 |0 + \xBA\xC9 |0 + \x94\x93 |0 + \x94\x94 |0 + \x94\x95 |0 + \x94\x96 |0 + \x94\x97 |0 + \x94\x98 |0 + \x94\x99 |0 + \xBA\xCA |0 + \xBA\xCB |0 + \x94\x9A |0 + \x94\x9B |0 + \x94\x9C |0 + \x94\x9D |0 + \x94\x9E |0 + \x94\x9F |0 + \x94\xA0 |0 + \x94\xA1 |0 + \x94\xA2 |0 + \x94\xA3 |0 + \xBA\xCC |0 + \x94\xA4 |0 + \x94\xA5 |0 + \x94\xA6 |0 + \xBA\xCD |0 + \x94\xA7 |0 + \x94\xA8 |0 + \x94\xA9 |0 + \x94\xAA |0 + \x94\xAB |0 + \x94\xAC |0 + \x94\xAD |0 + \x94\xAE |0 + \x94\xAF |0 + \x94\xB0 |0 + \x94\xB1 |0 + \x94\xB2 |0 + \x94\xB3 |0 + \x94\xB4 |0 + \x94\xB5 |0 + \x94\xB6 |0 + \x94\xB7 |0 + \x94\xB8 |0 + \x94\xB9 |0 + \x94\xBA |0 + \x94\xBB |0 + \x94\xBC |0 + \x94\xBD |0 + \xBA\xCE |0 + \xBA\xCF |0 + \x94\xBE |0 + \x94\xBF |0 + \xBA\xD0 |0 + \x94\xC0 |0 + \x94\xC1 |0 + \xBA\xD1 |0 + \xBA\xD2 |0 + \xBA\xD3 |0 + \xBA\xD4 |0 + \x94\xC2 |0 + \x94\xC3 |0 + \x94\xC4 |0 + \x94\xC5 |0 + \x94\xC6 |0 + \xBA\xD5 |0 + \xBA\xD6 |0 + \x94\xC7 |0 + \xBA\xD7 |0 + \x94\xC8 |0 + \xBA\xD8 |0 + \x94\xC9 |0 + \x94\xCA |0 + \x94\xCB |0 + \xBA\xD9 |0 + \xBA\xDA |0 + \x94\xCC |0 + \xBA\xDB |0 + \x94\xCD |0 + \x94\xCE |0 + \x94\xCF |0 + \x94\xD0 |0 + \x94\xD1 |0 + \x94\xD2 |0 + \x94\xD3 |0 + \xBA\xDC |0 + \x94\xD4 |0 + \x94\xD5 |0 + \x94\xD6 |0 + \x94\xD7 |0 + \x94\xD8 |0 + \x94\xD9 |0 + \x94\xDA |0 + \x94\xDB |0 + \x94\xDC |0 + \x94\xDD |0 + \x94\xDE |0 + \xBA\xDD |0 + \x94\xDF |0 + \x94\xE0 |0 + \x94\xE1 |0 + \x94\xE2 |0 + \x94\xE3 |0 + \x94\xE4 |0 + \x94\xE5 |0 + \xBA\xDE |0 + \x94\xE6 |0 + \x94\xE7 |0 + \x94\xE8 |0 + \x94\xE9 |0 + \x94\xEA |0 + \x94\xEB |0 + \x94\xEC |0 + \x94\xED |0 + \x94\xEE |0 + \x94\xEF |0 + \x94\xF0 |0 + \x94\xF1 |0 + \x94\xF2 |0 + \x94\xF3 |0 + \x94\xF4 |0 + \x94\xF5 |0 + \x94\xF6 |0 + \x94\xF7 |0 + \x94\xF8 |0 + \x94\xF9 |0 + \x94\xFA |0 + \x94\xFB |0 + \x94\xFC |0 + \x94\xFD |0 + \x94\xFE |0 + \x95\x41 |0 + \x95\x42 |0 + \xBA\xDF |0 + \xBA\xE0 |0 + \x95\x43 |0 + \x95\x44 |0 + \xBA\xE1 |0 + \x95\x45 |0 + \x95\x46 |0 + \x95\x47 |0 + \xBA\xE2 |0 + \x95\x48 |0 + \x95\x49 |0 + \x95\x4A |0 + \x95\x4B |0 + \x95\x4C |0 + \x95\x4D |0 + \x95\x4E |0 + \x95\x4F |0 + \x95\x50 |0 + \x95\x51 |0 + \x95\x52 |0 + \x95\x53 |0 + \xBA\xE3 |0 + \x95\x54 |0 + \x95\x55 |0 + \x95\x56 |0 + \x95\x57 |0 + \x95\x58 |0 + \x95\x59 |0 + \xBA\xE4 |0 + \x95\x5A |0 + \x95\x61 |0 + \x95\x62 |0 + \xBA\xE5 |0 + \x95\x63 |0 + \x95\x64 |0 + \x95\x65 |0 + \xBA\xE6 |0 + \x95\x66 |0 + \x95\x67 |0 + \x95\x68 |0 + \x95\x69 |0 + \x95\x6A |0 + \x95\x6B |0 + \x95\x6C |0 + \xBA\xE7 |0 + \x95\x6D |0 + \x95\x6E |0 + \xBA\xE8 |0 + \x95\x6F |0 + \xBA\xE9 |0 + \x95\x70 |0 + \x95\x71 |0 + \x95\x72 |0 + \x95\x73 |0 + \x95\x74 |0 + \x95\x75 |0 + \xBA\xEA |0 + \xBA\xEB |0 + \x95\x76 |0 + \x95\x77 |0 + \xBA\xEC |0 + \x95\x78 |0 + \x95\x79 |0 + \x95\x7A |0 + \xBA\xED |0 + \x95\x81 |0 + \x95\x82 |0 + \x95\x83 |0 + \x95\x84 |0 + \x95\x85 |0 + \x95\x86 |0 + \x95\x87 |0 + \xBA\xEE |0 + \xBA\xEF |0 + \x95\x88 |0 + \xBA\xF0 |0 + \x95\x89 |0 + \x95\x8A |0 + \x95\x8B |0 + \x95\x8C |0 + \x95\x8D |0 + \x95\x8E |0 + \x95\x8F |0 + \x95\x90 |0 + \x95\x91 |0 + \x95\x92 |0 + \x95\x93 |0 + \x95\x94 |0 + \x95\x95 |0 + \x95\x96 |0 + \x95\x97 |0 + \x95\x98 |0 + \x95\x99 |0 + \x95\x9A |0 + \x95\x9B |0 + \x95\x9C |0 + \x95\x9D |0 + \x95\x9E |0 + \x95\x9F |0 + \x95\xA0 |0 + \x95\xA1 |0 + \x95\xA2 |0 + \x95\xA3 |0 + \x95\xA4 |0 + \x95\xA5 |0 + \x95\xA6 |0 + \x95\xA7 |0 + \x95\xA8 |0 + \x95\xA9 |0 + \x95\xAA |0 + \x95\xAB |0 + \x95\xAC |0 + \xBA\xF1 |0 + \xBA\xF2 |0 + \x95\xAD |0 + \x95\xAE |0 + \xBA\xF3 |0 + \x95\xAF |0 + \x95\xB0 |0 + \x95\xB1 |0 + \xBA\xF4 |0 + \x95\xB2 |0 + \xBA\xF5 |0 + \x95\xB3 |0 + \x95\xB4 |0 + \x95\xB5 |0 + \x95\xB6 |0 + \x95\xB7 |0 + \xBA\xF6 |0 + \xBA\xF7 |0 + \x95\xB8 |0 + \xBA\xF8 |0 + \x95\xB9 |0 + \xBA\xF9 |0 + \xBA\xFA |0 + \xBA\xFB |0 + \x95\xBA |0 + \x95\xBB |0 + \x95\xBC |0 + \x95\xBD |0 + \xBA\xFC |0 + \xBA\xFD |0 + \x95\xBE |0 + \x95\xBF |0 + \xBA\xFE |0 + \x95\xC0 |0 + \x95\xC1 |0 + \x95\xC2 |0 + \xBB\xA1 |0 + \x95\xC3 |0 + \xBB\xA2 |0 + \x95\xC4 |0 + \x95\xC5 |0 + \x95\xC6 |0 + \x95\xC7 |0 + \x95\xC8 |0 + \xBB\xA3 |0 + \xBB\xA4 |0 + \x95\xC9 |0 + \xBB\xA5 |0 + \xBB\xA6 |0 + \xBB\xA7 |0 + \x95\xCA |0 + \x95\xCB |0 + \x95\xCC |0 + \x95\xCD |0 + \x95\xCE |0 + \xBB\xA8 |0 + \xBB\xA9 |0 + \xBB\xAA |0 + \x95\xCF |0 + \x95\xD0 |0 + \xBB\xAB |0 + \x95\xD1 |0 + \x95\xD2 |0 + \x95\xD3 |0 + \xBB\xAC |0 + \x95\xD4 |0 + \x95\xD5 |0 + \x95\xD6 |0 + \x95\xD7 |0 + \x95\xD8 |0 + \x95\xD9 |0 + \x95\xDA |0 + \xBB\xAD |0 + \xBB\xAE |0 + \x95\xDB |0 + \xBB\xAF |0 + \xBB\xB0 |0 + \xBB\xB1 |0 + \x95\xDC |0 + \x95\xDD |0 + \x95\xDE |0 + \x95\xDF |0 + \x95\xE0 |0 + \x95\xE1 |0 + \xBB\xB2 |0 + \xBB\xB3 |0 + \x95\xE2 |0 + \x95\xE3 |0 + \x95\xE4 |0 + \x95\xE5 |0 + \x95\xE6 |0 + \x95\xE7 |0 + \x95\xE8 |0 + \x95\xE9 |0 + \x95\xEA |0 + \x95\xEB |0 + \x95\xEC |0 + \x95\xED |0 + \x95\xEE |0 + \x95\xEF |0 + \xBB\xB4 |0 + \x95\xF0 |0 + \x95\xF1 |0 + \x95\xF2 |0 + \x95\xF3 |0 + \x95\xF4 |0 + \x95\xF5 |0 + \x95\xF6 |0 + \x95\xF7 |0 + \x95\xF8 |0 + \x95\xF9 |0 + \x95\xFA |0 + \x95\xFB |0 + \x95\xFC |0 + \x95\xFD |0 + \x95\xFE |0 + \x96\x41 |0 + \x96\x42 |0 + \x96\x43 |0 + \x96\x44 |0 + \x96\x45 |0 + \x96\x46 |0 + \x96\x47 |0 + \x96\x48 |0 + \x96\x49 |0 + \x96\x4A |0 + \x96\x4B |0 + \x96\x4C |0 + \x96\x4D |0 + \x96\x4E |0 + \x96\x4F |0 + \x96\x50 |0 + \x96\x51 |0 + \x96\x52 |0 + \x96\x53 |0 + \x96\x54 |0 + \x96\x55 |0 + \x96\x56 |0 + \x96\x57 |0 + \x96\x58 |0 + \xBB\xB5 |0 + \xBB\xB6 |0 + \x96\x59 |0 + \x96\x5A |0 + \xBB\xB7 |0 + \x96\x61 |0 + \x96\x62 |0 + \xBB\xB8 |0 + \xBB\xB9 |0 + \x96\x63 |0 + \x96\x64 |0 + \x96\x65 |0 + \x96\x66 |0 + \x96\x67 |0 + \x96\x68 |0 + \x96\x69 |0 + \xBB\xBA |0 + \x96\x6A |0 + \x96\x6B |0 + \xBB\xBB |0 + \xBB\xBC |0 + \xBB\xBD |0 + \x96\x6C |0 + \x96\x6D |0 + \x96\x6E |0 + \x96\x6F |0 + \x96\x70 |0 + \x96\x71 |0 + \xBB\xBE |0 + \x96\x72 |0 + \x96\x73 |0 + \x96\x74 |0 + \x96\x75 |0 + \x96\x76 |0 + \x96\x77 |0 + \x96\x78 |0 + \x96\x79 |0 + \x96\x7A |0 + \x96\x81 |0 + \x96\x82 |0 + \x96\x83 |0 + \x96\x84 |0 + \x96\x85 |0 + \x96\x86 |0 + \x96\x87 |0 + \x96\x88 |0 + \x96\x89 |0 + \x96\x8A |0 + \x96\x8B |0 + \xBB\xBF |0 + \x96\x8C |0 + \x96\x8D |0 + \x96\x8E |0 + \x96\x8F |0 + \x96\x90 |0 + \x96\x91 |0 + \xBB\xC0 |0 + \xBB\xC1 |0 + \x96\x92 |0 + \x96\x93 |0 + \x96\x94 |0 + \x96\x95 |0 + \x96\x96 |0 + \x96\x97 |0 + \x96\x98 |0 + \x96\x99 |0 + \x96\x9A |0 + \x96\x9B |0 + \x96\x9C |0 + \x96\x9D |0 + \x96\x9E |0 + \x96\x9F |0 + \xBB\xC2 |0 + \xBB\xC3 |0 + \x96\xA0 |0 + \xBB\xC4 |0 + \xBB\xC5 |0 + \xBB\xC6 |0 + \x96\xA1 |0 + \x96\xA2 |0 + \x96\xA3 |0 + \x96\xA4 |0 + \x96\xA5 |0 + \x96\xA6 |0 + \x96\xA7 |0 + \x96\xA8 |0 + \x96\xA9 |0 + \x96\xAA |0 + \x96\xAB |0 + \x96\xAC |0 + \x96\xAD |0 + \x96\xAE |0 + \x96\xAF |0 + \x96\xB0 |0 + \x96\xB1 |0 + \x96\xB2 |0 + \x96\xB3 |0 + \x96\xB4 |0 + \x96\xB5 |0 + \x96\xB6 |0 + \x96\xB7 |0 + \x96\xB8 |0 + \x96\xB9 |0 + \x96\xBA |0 + \x96\xBB |0 + \x96\xBC |0 + \x96\xBD |0 + \x96\xBE |0 + \x96\xBF |0 + \x96\xC0 |0 + \x96\xC1 |0 + \x96\xC2 |0 + \xBB\xC7 |0 + \xBB\xC8 |0 + \x96\xC3 |0 + \x96\xC4 |0 + \xBB\xC9 |0 + \x96\xC5 |0 + \x96\xC6 |0 + \x96\xC7 |0 + \xBB\xCA |0 + \x96\xC8 |0 + \x96\xC9 |0 + \x96\xCA |0 + \x96\xCB |0 + \x96\xCC |0 + \x96\xCD |0 + \x96\xCE |0 + \xBB\xCB |0 + \xBB\xCC |0 + \x96\xCF |0 + \x96\xD0 |0 + \x96\xD1 |0 + \xBB\xCD |0 + \x96\xD2 |0 + \x96\xD3 |0 + \x96\xD4 |0 + \x96\xD5 |0 + \x96\xD6 |0 + \x96\xD7 |0 + \x96\xD8 |0 + \x96\xD9 |0 + \x96\xDA |0 + \x96\xDB |0 + \x96\xDC |0 + \x96\xDD |0 + \x96\xDE |0 + \x96\xDF |0 + \x96\xE0 |0 + \x96\xE1 |0 + \x96\xE2 |0 + \x96\xE3 |0 + \x96\xE4 |0 + \x96\xE5 |0 + \x96\xE6 |0 + \x96\xE7 |0 + \x96\xE8 |0 + \x96\xE9 |0 + \x96\xEA |0 + \x96\xEB |0 + \x96\xEC |0 + \x96\xED |0 + \x96\xEE |0 + \x96\xEF |0 + \x96\xF0 |0 + \x96\xF1 |0 + \x96\xF2 |0 + \x96\xF3 |0 + \x96\xF4 |0 + \x96\xF5 |0 + \x96\xF6 |0 + \x96\xF7 |0 + \x96\xF8 |0 + \x96\xF9 |0 + \x96\xFA |0 + \x96\xFB |0 + \x96\xFC |0 + \x96\xFD |0 + \x96\xFE |0 + \x97\x41 |0 + \x97\x42 |0 + \x97\x43 |0 + \x97\x44 |0 + \x97\x45 |0 + \x97\x46 |0 + \x97\x47 |0 + \x97\x48 |0 + \x97\x49 |0 + \x97\x4A |0 + \x97\x4B |0 + \x97\x4C |0 + \x97\x4D |0 + \x97\x4E |0 + \x97\x4F |0 + \x97\x50 |0 + \x97\x51 |0 + \xBB\xCE |0 + \x97\x52 |0 + \x97\x53 |0 + \x97\x54 |0 + \x97\x55 |0 + \x97\x56 |0 + \x97\x57 |0 + \x97\x58 |0 + \x97\x59 |0 + \x97\x5A |0 + \x97\x61 |0 + \x97\x62 |0 + \x97\x63 |0 + \x97\x64 |0 + \x97\x65 |0 + \x97\x66 |0 + \x97\x67 |0 + \x97\x68 |0 + \x97\x69 |0 + \x97\x6A |0 + \x97\x6B |0 + \x97\x6C |0 + \x97\x6D |0 + \x97\x6E |0 + \x97\x6F |0 + \x97\x70 |0 + \x97\x71 |0 + \x97\x72 |0 + \xBB\xCF |0 + \x97\x73 |0 + \x97\x74 |0 + \x97\x75 |0 + \x97\x76 |0 + \x97\x77 |0 + \x97\x78 |0 + \x97\x79 |0 + \x97\x7A |0 + \x97\x81 |0 + \x97\x82 |0 + \x97\x83 |0 + \x97\x84 |0 + \x97\x85 |0 + \x97\x86 |0 + \x97\x87 |0 + \x97\x88 |0 + \x97\x89 |0 + \x97\x8A |0 + \x97\x8B |0 + \x97\x8C |0 + \xBB\xD0 |0 + \x97\x8D |0 + \x97\x8E |0 + \x97\x8F |0 + \x97\x90 |0 + \x97\x91 |0 + \x97\x92 |0 + \xBB\xD1 |0 + \xBB\xD2 |0 + \x97\x93 |0 + \x97\x94 |0 + \xBB\xD3 |0 + \x97\x95 |0 + \x97\x96 |0 + \x97\x97 |0 + \xBB\xD4 |0 + \x97\x98 |0 + \x97\x99 |0 + \x97\x9A |0 + \x97\x9B |0 + \x97\x9C |0 + \x97\x9D |0 + \x97\x9E |0 + \xBB\xD5 |0 + \x97\x9F |0 + \x97\xA0 |0 + \xBB\xD6 |0 + \x97\xA1 |0 + \xBB\xD7 |0 + \x97\xA2 |0 + \x97\xA3 |0 + \x97\xA4 |0 + \x97\xA5 |0 + \x97\xA6 |0 + \x97\xA7 |0 + \x97\xA8 |0 + \x97\xA9 |0 + \x97\xAA |0 + \x97\xAB |0 + \x97\xAC |0 + \x97\xAD |0 + \x97\xAE |0 + \x97\xAF |0 + \x97\xB0 |0 + \x97\xB1 |0 + \x97\xB2 |0 + \x97\xB3 |0 + \x97\xB4 |0 + \x97\xB5 |0 + \x97\xB6 |0 + \x97\xB7 |0 + \x97\xB8 |0 + \x97\xB9 |0 + \x97\xBA |0 + \x97\xBB |0 + \x97\xBC |0 + \x97\xBD |0 + \x97\xBE |0 + \x97\xBF |0 + \x97\xC0 |0 + \x97\xC1 |0 + \x97\xC2 |0 + \x97\xC3 |0 + \x97\xC4 |0 + \x97\xC5 |0 + \x97\xC6 |0 + \x97\xC7 |0 + \x97\xC8 |0 + \x97\xC9 |0 + \x97\xCA |0 + \x97\xCB |0 + \x97\xCC |0 + \x97\xCD |0 + \x97\xCE |0 + \x97\xCF |0 + \x97\xD0 |0 + \x97\xD1 |0 + \x97\xD2 |0 + \x97\xD3 |0 + \x97\xD4 |0 + \x97\xD5 |0 + \x97\xD6 |0 + \x97\xD7 |0 + \x97\xD8 |0 + \x97\xD9 |0 + \x97\xDA |0 + \x97\xDB |0 + \x97\xDC |0 + \x97\xDD |0 + \x97\xDE |0 + \x97\xDF |0 + \x97\xE0 |0 + \x97\xE1 |0 + \x97\xE2 |0 + \x97\xE3 |0 + \x97\xE4 |0 + \x97\xE5 |0 + \x97\xE6 |0 + \x97\xE7 |0 + \x97\xE8 |0 + \x97\xE9 |0 + \x97\xEA |0 + \x97\xEB |0 + \x97\xEC |0 + \x97\xED |0 + \x97\xEE |0 + \x97\xEF |0 + \x97\xF0 |0 + \x97\xF1 |0 + \x97\xF2 |0 + \x97\xF3 |0 + \x97\xF4 |0 + \x97\xF5 |0 + \x97\xF6 |0 + \x97\xF7 |0 + \x97\xF8 |0 + \x97\xF9 |0 + \x97\xFA |0 + \x97\xFB |0 + \xBB\xD8 |0 + \x97\xFC |0 + \x97\xFD |0 + \x97\xFE |0 + \x98\x41 |0 + \x98\x42 |0 + \x98\x43 |0 + \x98\x44 |0 + \x98\x45 |0 + \x98\x46 |0 + \x98\x47 |0 + \x98\x48 |0 + \x98\x49 |0 + \x98\x4A |0 + \x98\x4B |0 + \x98\x4C |0 + \x98\x4D |0 + \x98\x4E |0 + \x98\x4F |0 + \x98\x50 |0 + \x98\x51 |0 + \xBB\xD9 |0 + \x98\x52 |0 + \x98\x53 |0 + \x98\x54 |0 + \x98\x55 |0 + \x98\x56 |0 + \x98\x57 |0 + \xBB\xDA |0 + \x98\x58 |0 + \x98\x59 |0 + \x98\x5A |0 + \xBB\xDB |0 + \x98\x61 |0 + \x98\x62 |0 + \x98\x63 |0 + \xBB\xDC |0 + \x98\x64 |0 + \x98\x65 |0 + \x98\x66 |0 + \x98\x67 |0 + \x98\x68 |0 + \x98\x69 |0 + \x98\x6A |0 + \xBB\xDD |0 + \xBB\xDE |0 + \x98\x6B |0 + \x98\x6C |0 + \x98\x6D |0 + \x98\x6E |0 + \x98\x6F |0 + \x98\x70 |0 + \x98\x71 |0 + \x98\x72 |0 + \x98\x73 |0 + \x98\x74 |0 + \x98\x75 |0 + \x98\x76 |0 + \x98\x77 |0 + \x98\x78 |0 + \x98\x79 |0 + \x98\x7A |0 + \x98\x81 |0 + \x98\x82 |0 + \x98\x83 |0 + \x98\x84 |0 + \x98\x85 |0 + \x98\x86 |0 + \x98\x87 |0 + \x98\x88 |0 + \x98\x89 |0 + \x98\x8A |0 + \x98\x8B |0 + \x98\x8C |0 + \x98\x8D |0 + \x98\x8E |0 + \x98\x8F |0 + \x98\x90 |0 + \x98\x91 |0 + \x98\x92 |0 + \x98\x93 |0 + \x98\x94 |0 + \x98\x95 |0 + \x98\x96 |0 + \xBB\xDF |0 + \xBB\xE0 |0 + \x98\x97 |0 + \x98\x98 |0 + \xBB\xE1 |0 + \x98\x99 |0 + \x98\x9A |0 + \x98\x9B |0 + \xBB\xE2 |0 + \x98\x9C |0 + \x98\x9D |0 + \x98\x9E |0 + \x98\x9F |0 + \x98\xA0 |0 + \x98\xA1 |0 + \x98\xA2 |0 + \xBB\xE3 |0 + \xBB\xE4 |0 + \x98\xA3 |0 + \xBB\xE5 |0 + \x98\xA4 |0 + \xBB\xE6 |0 + \x98\xA5 |0 + \x98\xA6 |0 + \x98\xA7 |0 + \x98\xA8 |0 + \x98\xA9 |0 + \x98\xAA |0 + \xBB\xE7 |0 + \xBB\xE8 |0 + \x98\xAB |0 + \xBB\xE9 |0 + \xBB\xEA |0 + \x98\xAC |0 + \x98\xAD |0 + \xBB\xEB |0 + \xBB\xEC |0 + \xBB\xED |0 + \xBB\xEE |0 + \x98\xAE |0 + \x98\xAF |0 + \x98\xB0 |0 + \x98\xB1 |0 + \x98\xB2 |0 + \xBB\xEF |0 + \xBB\xF0 |0 + \x98\xB3 |0 + \xBB\xF1 |0 + \xBB\xF2 |0 + \xBB\xF3 |0 + \x98\xB4 |0 + \x98\xB5 |0 + \x98\xB6 |0 + \xBB\xF4 |0 + \x98\xB7 |0 + \x98\xB8 |0 + \xBB\xF5 |0 + \xBB\xF6 |0 + \x98\xB9 |0 + \x98\xBA |0 + \xBB\xF7 |0 + \x98\xBB |0 + \x98\xBC |0 + \x98\xBD |0 + \xBB\xF8 |0 + \x98\xBE |0 + \x98\xBF |0 + \x98\xC0 |0 + \x98\xC1 |0 + \x98\xC2 |0 + \x98\xC3 |0 + \x98\xC4 |0 + \xBB\xF9 |0 + \xBB\xFA |0 + \x98\xC5 |0 + \xBB\xFB |0 + \xBB\xFC |0 + \xBB\xFD |0 + \x98\xC6 |0 + \x98\xC7 |0 + \x98\xC8 |0 + \x98\xC9 |0 + \x98\xCA |0 + \x98\xCB |0 + \xBB\xFE |0 + \xBC\xA1 |0 + \x98\xCC |0 + \x98\xCD |0 + \xBC\xA2 |0 + \x98\xCE |0 + \x98\xCF |0 + \x98\xD0 |0 + \xBC\xA3 |0 + \x98\xD1 |0 + \x98\xD2 |0 + \x98\xD3 |0 + \x98\xD4 |0 + \x98\xD5 |0 + \x98\xD6 |0 + \x98\xD7 |0 + \xBC\xA4 |0 + \xBC\xA5 |0 + \x98\xD8 |0 + \xBC\xA6 |0 + \x98\xD9 |0 + \xBC\xA7 |0 + \x98\xDA |0 + \x98\xDB |0 + \x98\xDC |0 + \x98\xDD |0 + \x98\xDE |0 + \x98\xDF |0 + \xBC\xA8 |0 + \x98\xE0 |0 + \x98\xE1 |0 + \x98\xE2 |0 + \xBC\xA9 |0 + \x98\xE3 |0 + \x98\xE4 |0 + \x98\xE5 |0 + \xBC\xAA |0 + \x98\xE6 |0 + \x98\xE7 |0 + \x98\xE8 |0 + \x98\xE9 |0 + \x98\xEA |0 + \x98\xEB |0 + \x98\xEC |0 + \xBC\xAB |0 + \x98\xED |0 + \x98\xEE |0 + \x98\xEF |0 + \x98\xF0 |0 + \xBC\xAC |0 + \x98\xF1 |0 + \x98\xF2 |0 + \x98\xF3 |0 + \x98\xF4 |0 + \x98\xF5 |0 + \x98\xF6 |0 + \xBC\xAD |0 + \xBC\xAE |0 + \xBC\xAF |0 + \xBC\xB0 |0 + \xBC\xB1 |0 + \x98\xF7 |0 + \x98\xF8 |0 + \xBC\xB2 |0 + \xBC\xB3 |0 + \x98\xF9 |0 + \xBC\xB4 |0 + \xBC\xB5 |0 + \x98\xFA |0 + \x98\xFB |0 + \x98\xFC |0 + \x98\xFD |0 + \xBC\xB6 |0 + \xBC\xB7 |0 + \x98\xFE |0 + \xBC\xB8 |0 + \xBC\xB9 |0 + \xBC\xBA |0 + \x99\x41 |0 + \x99\x42 |0 + \x99\x43 |0 + \x99\x44 |0 + \xBC\xBB |0 + \x99\x45 |0 + \xBC\xBC |0 + \xBC\xBD |0 + \x99\x46 |0 + \x99\x47 |0 + \xBC\xBE |0 + \x99\x48 |0 + \x99\x49 |0 + \x99\x4A |0 + \xBC\xBF |0 + \x99\x4B |0 + \x99\x4C |0 + \x99\x4D |0 + \x99\x4E |0 + \x99\x4F |0 + \x99\x50 |0 + \x99\x51 |0 + \xBC\xC0 |0 + \xBC\xC1 |0 + \x99\x52 |0 + \xBC\xC2 |0 + \xBC\xC3 |0 + \xBC\xC4 |0 + \x99\x53 |0 + \x99\x54 |0 + \x99\x55 |0 + \x99\x56 |0 + \x99\x57 |0 + \x99\x58 |0 + \xBC\xC5 |0 + \xBC\xC6 |0 + \x99\x59 |0 + \x99\x5A |0 + \xBC\xC7 |0 + \x99\x61 |0 + \x99\x62 |0 + \x99\x63 |0 + \xBC\xC8 |0 + \x99\x64 |0 + \x99\x65 |0 + \x99\x66 |0 + \x99\x67 |0 + \x99\x68 |0 + \x99\x69 |0 + \x99\x6A |0 + \xBC\xC9 |0 + \xBC\xCA |0 + \x99\x6B |0 + \xBC\xCB |0 + \xBC\xCC |0 + \xBC\xCD |0 + \x99\x6C |0 + \x99\x6D |0 + \x99\x6E |0 + \x99\x6F |0 + \x99\x70 |0 + \x99\x71 |0 + \xBC\xCE |0 + \x99\x72 |0 + \x99\x73 |0 + \x99\x74 |0 + \xBC\xCF |0 + \x99\x75 |0 + \x99\x76 |0 + \x99\x77 |0 + \xBC\xD0 |0 + \x99\x78 |0 + \x99\x79 |0 + \x99\x7A |0 + \x99\x81 |0 + \x99\x82 |0 + \x99\x83 |0 + \x99\x84 |0 + \x99\x85 |0 + \x99\x86 |0 + \x99\x87 |0 + \x99\x88 |0 + \x99\x89 |0 + \xBC\xD1 |0 + \x99\x8A |0 + \x99\x8B |0 + \x99\x8C |0 + \x99\x8D |0 + \x99\x8E |0 + \x99\x8F |0 + \xBC\xD2 |0 + \xBC\xD3 |0 + \xBC\xD4 |0 + \x99\x90 |0 + \xBC\xD5 |0 + \x99\x91 |0 + \x99\x92 |0 + \x99\x93 |0 + \xBC\xD6 |0 + \x99\x94 |0 + \xBC\xD7 |0 + \x99\x95 |0 + \x99\x96 |0 + \x99\x97 |0 + \x99\x98 |0 + \x99\x99 |0 + \xBC\xD8 |0 + \xBC\xD9 |0 + \x99\x9A |0 + \xBC\xDA |0 + \x99\x9B |0 + \xBC\xDB |0 + \x99\x9C |0 + \x99\x9D |0 + \x99\x9E |0 + \xBC\xDC |0 + \x99\x9F |0 + \x99\xA0 |0 + \xBC\xDD |0 + \xBC\xDE |0 + \x99\xA1 |0 + \x99\xA2 |0 + \xBC\xDF |0 + \x99\xA3 |0 + \x99\xA4 |0 + \x99\xA5 |0 + \xBC\xE0 |0 + \x99\xA6 |0 + \x99\xA7 |0 + \x99\xA8 |0 + \x99\xA9 |0 + \x99\xAA |0 + \x99\xAB |0 + \x99\xAC |0 + \x99\xAD |0 + \x99\xAE |0 + \x99\xAF |0 + \x99\xB0 |0 + \x99\xB1 |0 + \xBC\xE1 |0 + \x99\xB2 |0 + \x99\xB3 |0 + \x99\xB4 |0 + \x99\xB5 |0 + \x99\xB6 |0 + \x99\xB7 |0 + \xBC\xE2 |0 + \x99\xB8 |0 + \x99\xB9 |0 + \x99\xBA |0 + \xBC\xE3 |0 + \x99\xBB |0 + \x99\xBC |0 + \x99\xBD |0 + \xBC\xE4 |0 + \x99\xBE |0 + \x99\xBF |0 + \x99\xC0 |0 + \x99\xC1 |0 + \x99\xC2 |0 + \x99\xC3 |0 + \x99\xC4 |0 + \xBC\xE5 |0 + \x99\xC5 |0 + \x99\xC6 |0 + \xBC\xE6 |0 + \xBC\xE7 |0 + \x99\xC7 |0 + \x99\xC8 |0 + \x99\xC9 |0 + \x99\xCA |0 + \x99\xCB |0 + \x99\xCC |0 + \x99\xCD |0 + \xBC\xE8 |0 + \x99\xCE |0 + \x99\xCF |0 + \x99\xD0 |0 + \xBC\xE9 |0 + \x99\xD1 |0 + \x99\xD2 |0 + \x99\xD3 |0 + \xBC\xEA |0 + \x99\xD4 |0 + \x99\xD5 |0 + \x99\xD6 |0 + \x99\xD7 |0 + \x99\xD8 |0 + \x99\xD9 |0 + \x99\xDA |0 + \xBC\xEB |0 + \xBC\xEC |0 + \x99\xDB |0 + \xBC\xED |0 + \x99\xDC |0 + \x99\xDD |0 + \x99\xDE |0 + \x99\xDF |0 + \x99\xE0 |0 + \x99\xE1 |0 + \x99\xE2 |0 + \x99\xE3 |0 + \xBC\xEE |0 + \xBC\xEF |0 + \x99\xE4 |0 + \x99\xE5 |0 + \xBC\xF0 |0 + \x99\xE6 |0 + \x99\xE7 |0 + \x99\xE8 |0 + \xBC\xF1 |0 + \x99\xE9 |0 + \x99\xEA |0 + \x99\xEB |0 + \x99\xEC |0 + \x99\xED |0 + \x99\xEE |0 + \x99\xEF |0 + \xBC\xF2 |0 + \xBC\xF3 |0 + \x99\xF0 |0 + \xBC\xF4 |0 + \x99\xF1 |0 + \xBC\xF5 |0 + \x99\xF2 |0 + \x99\xF3 |0 + \x99\xF4 |0 + \x99\xF5 |0 + \x99\xF6 |0 + \x99\xF7 |0 + \xBC\xF6 |0 + \xBC\xF7 |0 + \x99\xF8 |0 + \x99\xF9 |0 + \xBC\xF8 |0 + \x99\xFA |0 + \x99\xFB |0 + \xBC\xF9 |0 + \xBC\xFA |0 + \x99\xFC |0 + \x99\xFD |0 + \x99\xFE |0 + \x9A\x41 |0 + \x9A\x42 |0 + \x9A\x43 |0 + \x9A\x44 |0 + \xBC\xFB |0 + \xBC\xFC |0 + \x9A\x45 |0 + \xBC\xFD |0 + \x9A\x46 |0 + \xBC\xFE |0 + \x9A\x47 |0 + \xBD\xA1 |0 + \x9A\x48 |0 + \xBD\xA2 |0 + \xBD\xA3 |0 + \x9A\x49 |0 + \xBD\xA4 |0 + \x9A\x4A |0 + \x9A\x4B |0 + \x9A\x4C |0 + \x9A\x4D |0 + \x9A\x4E |0 + \x9A\x4F |0 + \x9A\x50 |0 + \x9A\x51 |0 + \x9A\x52 |0 + \x9A\x53 |0 + \x9A\x54 |0 + \x9A\x55 |0 + \x9A\x56 |0 + \x9A\x57 |0 + \x9A\x58 |0 + \x9A\x59 |0 + \x9A\x5A |0 + \x9A\x61 |0 + \x9A\x62 |0 + \xBD\xA5 |0 + \x9A\x63 |0 + \x9A\x64 |0 + \x9A\x65 |0 + \x9A\x66 |0 + \x9A\x67 |0 + \x9A\x68 |0 + \x9A\x69 |0 + \xBD\xA6 |0 + \xBD\xA7 |0 + \x9A\x6A |0 + \x9A\x6B |0 + \xBD\xA8 |0 + \x9A\x6C |0 + \x9A\x6D |0 + \x9A\x6E |0 + \xBD\xA9 |0 + \x9A\x6F |0 + \x9A\x70 |0 + \x9A\x71 |0 + \x9A\x72 |0 + \x9A\x73 |0 + \x9A\x74 |0 + \x9A\x75 |0 + \xBD\xAA |0 + \x9A\x76 |0 + \x9A\x77 |0 + \x9A\x78 |0 + \x9A\x79 |0 + \xBD\xAB |0 + \x9A\x7A |0 + \x9A\x81 |0 + \x9A\x82 |0 + \x9A\x83 |0 + \x9A\x84 |0 + \x9A\x85 |0 + \xBD\xAC |0 + \xBD\xAD |0 + \x9A\x86 |0 + \x9A\x87 |0 + \xBD\xAE |0 + \x9A\x88 |0 + \x9A\x89 |0 + \x9A\x8A |0 + \xBD\xAF |0 + \x9A\x8B |0 + \x9A\x8C |0 + \x9A\x8D |0 + \x9A\x8E |0 + \x9A\x8F |0 + \x9A\x90 |0 + \x9A\x91 |0 + \xBD\xB0 |0 + \xBD\xB1 |0 + \x9A\x92 |0 + \xBD\xB2 |0 + \x9A\x93 |0 + \xBD\xB3 |0 + \x9A\x94 |0 + \x9A\x95 |0 + \x9A\x96 |0 + \x9A\x97 |0 + \x9A\x98 |0 + \x9A\x99 |0 + \xBD\xB4 |0 + \xBD\xB5 |0 + \x9A\x9A |0 + \x9A\x9B |0 + \x9A\x9C |0 + \x9A\x9D |0 + \x9A\x9E |0 + \x9A\x9F |0 + \xBD\xB6 |0 + \x9A\xA0 |0 + \x9A\xA1 |0 + \x9A\xA2 |0 + \x9A\xA3 |0 + \x9A\xA4 |0 + \x9A\xA5 |0 + \x9A\xA6 |0 + \xBD\xB7 |0 + \x9A\xA7 |0 + \x9A\xA8 |0 + \xBD\xB8 |0 + \x9A\xA9 |0 + \xBD\xB9 |0 + \x9A\xAA |0 + \x9A\xAB |0 + \x9A\xAC |0 + \x9A\xAD |0 + \x9A\xAE |0 + \x9A\xAF |0 + \xBD\xBA |0 + \xBD\xBB |0 + \x9A\xB0 |0 + \x9A\xB1 |0 + \xBD\xBC |0 + \x9A\xB2 |0 + \x9A\xB3 |0 + \x9A\xB4 |0 + \xBD\xBD |0 + \xBD\xBE |0 + \x9A\xB5 |0 + \x9A\xB6 |0 + \x9A\xB7 |0 + \x9A\xB8 |0 + \x9A\xB9 |0 + \x9A\xBA |0 + \xBD\xBF |0 + \xBD\xC0 |0 + \x9A\xBB |0 + \xBD\xC1 |0 + \x9A\xBC |0 + \xBD\xC2 |0 + \x9A\xBD |0 + \x9A\xBE |0 + \x9A\xBF |0 + \x9A\xC0 |0 + \x9A\xC1 |0 + \x9A\xC2 |0 + \x9A\xC3 |0 + \x9A\xC4 |0 + \x9A\xC5 |0 + \x9A\xC6 |0 + \x9A\xC7 |0 + \x9A\xC8 |0 + \x9A\xC9 |0 + \x9A\xCA |0 + \x9A\xCB |0 + \x9A\xCC |0 + \x9A\xCD |0 + \x9A\xCE |0 + \x9A\xCF |0 + \x9A\xD0 |0 + \x9A\xD1 |0 + \x9A\xD2 |0 + \x9A\xD3 |0 + \x9A\xD4 |0 + \x9A\xD5 |0 + \x9A\xD6 |0 + \x9A\xD7 |0 + \x9A\xD8 |0 + \x9A\xD9 |0 + \x9A\xDA |0 + \x9A\xDB |0 + \x9A\xDC |0 + \x9A\xDD |0 + \x9A\xDE |0 + \xBD\xC3 |0 + \xBD\xC4 |0 + \x9A\xDF |0 + \x9A\xE0 |0 + \xBD\xC5 |0 + \x9A\xE1 |0 + \x9A\xE2 |0 + \xBD\xC6 |0 + \xBD\xC7 |0 + \x9A\xE3 |0 + \x9A\xE4 |0 + \x9A\xE5 |0 + \x9A\xE6 |0 + \x9A\xE7 |0 + \x9A\xE8 |0 + \xBD\xC8 |0 + \xBD\xC9 |0 + \xBD\xCA |0 + \x9A\xE9 |0 + \xBD\xCB |0 + \x9A\xEA |0 + \xBD\xCC |0 + \x9A\xEB |0 + \x9A\xEC |0 + \x9A\xED |0 + \x9A\xEE |0 + \xBD\xCD |0 + \x9A\xEF |0 + \xBD\xCE |0 + \xBD\xCF |0 + \x9A\xF0 |0 + \xBD\xD0 |0 + \xBD\xD1 |0 + \x9A\xF1 |0 + \x9A\xF2 |0 + \x9A\xF3 |0 + \xBD\xD2 |0 + \x9A\xF4 |0 + \x9A\xF5 |0 + \x9A\xF6 |0 + \x9A\xF7 |0 + \x9A\xF8 |0 + \x9A\xF9 |0 + \x9A\xFA |0 + \xBD\xD3 |0 + \xBD\xD4 |0 + \x9A\xFB |0 + \x9A\xFC |0 + \xBD\xD5 |0 + \xBD\xD6 |0 + \x9A\xFD |0 + \x9A\xFE |0 + \x9B\x41 |0 + \x9B\x42 |0 + \x9B\x43 |0 + \xBD\xD7 |0 + \xBD\xD8 |0 + \xBD\xD9 |0 + \x9B\x44 |0 + \x9B\x45 |0 + \xBD\xDA |0 + \x9B\x46 |0 + \x9B\x47 |0 + \x9B\x48 |0 + \xBD\xDB |0 + \x9B\x49 |0 + \x9B\x4A |0 + \x9B\x4B |0 + \x9B\x4C |0 + \x9B\x4D |0 + \x9B\x4E |0 + \x9B\x4F |0 + \xBD\xDC |0 + \xBD\xDD |0 + \x9B\x50 |0 + \x9B\x51 |0 + \xBD\xDE |0 + \xBD\xDF |0 + \x9B\x52 |0 + \x9B\x53 |0 + \x9B\x54 |0 + \x9B\x55 |0 + \x9B\x56 |0 + \x9B\x57 |0 + \x9B\x58 |0 + \x9B\x59 |0 + \x9B\x5A |0 + \x9B\x61 |0 + \x9B\x62 |0 + \x9B\x63 |0 + \x9B\x64 |0 + \x9B\x65 |0 + \x9B\x66 |0 + \x9B\x67 |0 + \x9B\x68 |0 + \x9B\x69 |0 + \x9B\x6A |0 + \x9B\x6B |0 + \x9B\x6C |0 + \x9B\x6D |0 + \x9B\x6E |0 + \x9B\x6F |0 + \x9B\x70 |0 + \x9B\x71 |0 + \x9B\x72 |0 + \xBD\xE0 |0 + \x9B\x73 |0 + \x9B\x74 |0 + \x9B\x75 |0 + \x9B\x76 |0 + \x9B\x77 |0 + \x9B\x78 |0 + \x9B\x79 |0 + \x9B\x7A |0 + \x9B\x81 |0 + \x9B\x82 |0 + \x9B\x83 |0 + \x9B\x84 |0 + \x9B\x85 |0 + \x9B\x86 |0 + \x9B\x87 |0 + \x9B\x88 |0 + \x9B\x89 |0 + \x9B\x8A |0 + \x9B\x8B |0 + \x9B\x8C |0 + \x9B\x8D |0 + \x9B\x8E |0 + \x9B\x8F |0 + \x9B\x90 |0 + \x9B\x91 |0 + \x9B\x92 |0 + \x9B\x93 |0 + \x9B\x94 |0 + \x9B\x95 |0 + \x9B\x96 |0 + \x9B\x97 |0 + \x9B\x98 |0 + \x9B\x99 |0 + \x9B\x9A |0 + \xBD\xE1 |0 + \xBD\xE2 |0 + \x9B\x9B |0 + \x9B\x9C |0 + \xBD\xE3 |0 + \x9B\x9D |0 + \x9B\x9E |0 + \x9B\x9F |0 + \xBD\xE4 |0 + \x9B\xA0 |0 + \xBD\xE5 |0 + \x9B\xA1 |0 + \x9B\xA2 |0 + \x9B\xA3 |0 + \x9B\xA4 |0 + \x9B\xA5 |0 + \xBD\xE6 |0 + \xBD\xE7 |0 + \x9B\xA6 |0 + \x9B\xA7 |0 + \xBD\xE8 |0 + \xBD\xE9 |0 + \x9B\xA8 |0 + \x9B\xA9 |0 + \x9B\xAA |0 + \x9B\xAB |0 + \x9B\xAC |0 + \x9B\xAD |0 + \xBD\xEA |0 + \x9B\xAE |0 + \x9B\xAF |0 + \x9B\xB0 |0 + \xBD\xEB |0 + \x9B\xB1 |0 + \x9B\xB2 |0 + \x9B\xB3 |0 + \xBD\xEC |0 + \x9B\xB4 |0 + \x9B\xB5 |0 + \x9B\xB6 |0 + \x9B\xB7 |0 + \x9B\xB8 |0 + \x9B\xB9 |0 + \x9B\xBA |0 + \x9B\xBB |0 + \x9B\xBC |0 + \x9B\xBD |0 + \x9B\xBE |0 + \x9B\xBF |0 + \x9B\xC0 |0 + \x9B\xC1 |0 + \x9B\xC2 |0 + \x9B\xC3 |0 + \x9B\xC4 |0 + \x9B\xC5 |0 + \x9B\xC6 |0 + \x9B\xC7 |0 + \x9B\xC8 |0 + \x9B\xC9 |0 + \x9B\xCA |0 + \x9B\xCB |0 + \x9B\xCC |0 + \x9B\xCD |0 + \x9B\xCE |0 + \x9B\xCF |0 + \x9B\xD0 |0 + \x9B\xD1 |0 + \x9B\xD2 |0 + \x9B\xD3 |0 + \x9B\xD4 |0 + \x9B\xD5 |0 + \x9B\xD6 |0 + \x9B\xD7 |0 + \x9B\xD8 |0 + \x9B\xD9 |0 + \x9B\xDA |0 + \x9B\xDB |0 + \x9B\xDC |0 + \x9B\xDD |0 + \x9B\xDE |0 + \x9B\xDF |0 + \x9B\xE0 |0 + \x9B\xE1 |0 + \x9B\xE2 |0 + \x9B\xE3 |0 + \x9B\xE4 |0 + \x9B\xE5 |0 + \x9B\xE6 |0 + \xBD\xED |0 + \x9B\xE7 |0 + \x9B\xE8 |0 + \x9B\xE9 |0 + \x9B\xEA |0 + \x9B\xEB |0 + \x9B\xEC |0 + \x9B\xED |0 + \x9B\xEE |0 + \x9B\xEF |0 + \x9B\xF0 |0 + \x9B\xF1 |0 + \x9B\xF2 |0 + \x9B\xF3 |0 + \x9B\xF4 |0 + \x9B\xF5 |0 + \x9B\xF6 |0 + \x9B\xF7 |0 + \x9B\xF8 |0 + \x9B\xF9 |0 + \x9B\xFA |0 + \x9B\xFB |0 + \x9B\xFC |0 + \x9B\xFD |0 + \xBD\xEE |0 + \xBD\xEF |0 + \x9B\xFE |0 + \x9C\x41 |0 + \xBD\xF0 |0 + \x9C\x42 |0 + \x9C\x43 |0 + \xBD\xF1 |0 + \xBD\xF2 |0 + \x9C\x44 |0 + \xBD\xF3 |0 + \x9C\x45 |0 + \x9C\x46 |0 + \x9C\x47 |0 + \x9C\x48 |0 + \x9C\x49 |0 + \xBD\xF4 |0 + \xBD\xF5 |0 + \x9C\x4A |0 + \x9C\x4B |0 + \x9C\x4C |0 + \xBD\xF6 |0 + \x9C\x4D |0 + \x9C\x4E |0 + \x9C\x4F |0 + \x9C\x50 |0 + \x9C\x51 |0 + \x9C\x52 |0 + \xBD\xF7 |0 + \xBD\xF8 |0 + \x9C\x53 |0 + \x9C\x54 |0 + \xBD\xF9 |0 + \x9C\x55 |0 + \x9C\x56 |0 + \x9C\x57 |0 + \x9C\x58 |0 + \x9C\x59 |0 + \x9C\x5A |0 + \x9C\x61 |0 + \x9C\x62 |0 + \x9C\x63 |0 + \x9C\x64 |0 + \x9C\x65 |0 + \x9C\x66 |0 + \x9C\x67 |0 + \x9C\x68 |0 + \x9C\x69 |0 + \xBD\xFA |0 + \x9C\x6A |0 + \x9C\x6B |0 + \x9C\x6C |0 + \x9C\x6D |0 + \x9C\x6E |0 + \x9C\x6F |0 + \x9C\x70 |0 + \xBD\xFB |0 + \x9C\x71 |0 + \x9C\x72 |0 + \x9C\x73 |0 + \x9C\x74 |0 + \x9C\x75 |0 + \x9C\x76 |0 + \x9C\x77 |0 + \x9C\x78 |0 + \x9C\x79 |0 + \x9C\x7A |0 + \x9C\x81 |0 + \x9C\x82 |0 + \x9C\x83 |0 + \x9C\x84 |0 + \x9C\x85 |0 + \x9C\x86 |0 + \x9C\x87 |0 + \x9C\x88 |0 + \x9C\x89 |0 + \xBD\xFC |0 + \x9C\x8A |0 + \x9C\x8B |0 + \x9C\x8C |0 + \x9C\x8D |0 + \x9C\x8E |0 + \x9C\x8F |0 + \x9C\x90 |0 + \xBD\xFD |0 + \x9C\x91 |0 + \x9C\x92 |0 + \x9C\x93 |0 + \xBD\xFE |0 + \x9C\x94 |0 + \x9C\x95 |0 + \x9C\x96 |0 + \xBE\xA1 |0 + \x9C\x97 |0 + \x9C\x98 |0 + \x9C\x99 |0 + \x9C\x9A |0 + \x9C\x9B |0 + \x9C\x9C |0 + \x9C\x9D |0 + \xBE\xA2 |0 + \xBE\xA3 |0 + \x9C\x9E |0 + \x9C\x9F |0 + \x9C\xA0 |0 + \x9C\xA1 |0 + \x9C\xA2 |0 + \x9C\xA3 |0 + \x9C\xA4 |0 + \x9C\xA5 |0 + \x9C\xA6 |0 + \x9C\xA7 |0 + \xBE\xA4 |0 + \x9C\xA8 |0 + \x9C\xA9 |0 + \x9C\xAA |0 + \x9C\xAB |0 + \x9C\xAC |0 + \x9C\xAD |0 + \x9C\xAE |0 + \x9C\xAF |0 + \x9C\xB0 |0 + \x9C\xB1 |0 + \x9C\xB2 |0 + \x9C\xB3 |0 + \x9C\xB4 |0 + \x9C\xB5 |0 + \x9C\xB6 |0 + \x9C\xB7 |0 + \x9C\xB8 |0 + \x9C\xB9 |0 + \x9C\xBA |0 + \x9C\xBB |0 + \x9C\xBC |0 + \x9C\xBD |0 + \x9C\xBE |0 + \x9C\xBF |0 + \x9C\xC0 |0 + \x9C\xC1 |0 + \x9C\xC2 |0 + \xBE\xA5 |0 + \xBE\xA6 |0 + \x9C\xC3 |0 + \x9C\xC4 |0 + \xBE\xA7 |0 + \x9C\xC5 |0 + \x9C\xC6 |0 + \x9C\xC7 |0 + \xBE\xA8 |0 + \x9C\xC8 |0 + \x9C\xC9 |0 + \x9C\xCA |0 + \x9C\xCB |0 + \x9C\xCC |0 + \x9C\xCD |0 + \x9C\xCE |0 + \xBE\xA9 |0 + \xBE\xAA |0 + \x9C\xCF |0 + \x9C\xD0 |0 + \x9C\xD1 |0 + \xBE\xAB |0 + \x9C\xD2 |0 + \x9C\xD3 |0 + \x9C\xD4 |0 + \x9C\xD5 |0 + \x9C\xD6 |0 + \x9C\xD7 |0 + \xBE\xAC |0 + \x9C\xD8 |0 + \x9C\xD9 |0 + \x9C\xDA |0 + \x9C\xDB |0 + \x9C\xDC |0 + \x9C\xDD |0 + \x9C\xDE |0 + \x9C\xDF |0 + \x9C\xE0 |0 + \x9C\xE1 |0 + \x9C\xE2 |0 + \x9C\xE3 |0 + \x9C\xE4 |0 + \x9C\xE5 |0 + \x9C\xE6 |0 + \x9C\xE7 |0 + \x9C\xE8 |0 + \x9C\xE9 |0 + \x9C\xEA |0 + \xBE\xAD |0 + \x9C\xEB |0 + \x9C\xEC |0 + \x9C\xED |0 + \x9C\xEE |0 + \x9C\xEF |0 + \x9C\xF0 |0 + \x9C\xF1 |0 + \xBE\xAE |0 + \x9C\xF2 |0 + \x9C\xF3 |0 + \x9C\xF4 |0 + \x9C\xF5 |0 + \x9C\xF6 |0 + \x9C\xF7 |0 + \x9C\xF8 |0 + \x9C\xF9 |0 + \x9C\xFA |0 + \x9C\xFB |0 + \x9C\xFC |0 + \x9C\xFD |0 + \x9C\xFE |0 + \x9D\x41 |0 + \x9D\x42 |0 + \x9D\x43 |0 + \x9D\x44 |0 + \x9D\x45 |0 + \x9D\x46 |0 + \x9D\x47 |0 + \x9D\x48 |0 + \x9D\x49 |0 + \x9D\x4A |0 + \x9D\x4B |0 + \x9D\x4C |0 + \x9D\x4D |0 + \x9D\x4E |0 + \xBE\xAF |0 + \x9D\x4F |0 + \x9D\x50 |0 + \x9D\x51 |0 + \xBE\xB0 |0 + \x9D\x52 |0 + \x9D\x53 |0 + \x9D\x54 |0 + \x9D\x55 |0 + \x9D\x56 |0 + \x9D\x57 |0 + \x9D\x58 |0 + \x9D\x59 |0 + \x9D\x5A |0 + \x9D\x61 |0 + \x9D\x62 |0 + \x9D\x63 |0 + \x9D\x64 |0 + \x9D\x65 |0 + \x9D\x66 |0 + \x9D\x67 |0 + \x9D\x68 |0 + \x9D\x69 |0 + \x9D\x6A |0 + \x9D\x6B |0 + \x9D\x6C |0 + \x9D\x6D |0 + \x9D\x6E |0 + \x9D\x6F |0 + \x9D\x70 |0 + \x9D\x71 |0 + \x9D\x72 |0 + \x9D\x73 |0 + \x9D\x74 |0 + \x9D\x75 |0 + \x9D\x76 |0 + \x9D\x77 |0 + \x9D\x78 |0 + \x9D\x79 |0 + \x9D\x7A |0 + \x9D\x81 |0 + \x9D\x82 |0 + \x9D\x83 |0 + \x9D\x84 |0 + \x9D\x85 |0 + \x9D\x86 |0 + \x9D\x87 |0 + \x9D\x88 |0 + \x9D\x89 |0 + \xBE\xB1 |0 + \x9D\x8A |0 + \x9D\x8B |0 + \x9D\x8C |0 + \x9D\x8D |0 + \x9D\x8E |0 + \x9D\x8F |0 + \xBE\xB2 |0 + \xBE\xB3 |0 + \x9D\x90 |0 + \x9D\x91 |0 + \xBE\xB4 |0 + \x9D\x92 |0 + \x9D\x93 |0 + \x9D\x94 |0 + \xBE\xB5 |0 + \x9D\x95 |0 + \xBE\xB6 |0 + \x9D\x96 |0 + \x9D\x97 |0 + \x9D\x98 |0 + \x9D\x99 |0 + \xBE\xB7 |0 + \xBE\xB8 |0 + \xBE\xB9 |0 + \x9D\x9A |0 + \x9D\x9B |0 + \x9D\x9C |0 + \x9D\x9D |0 + \x9D\x9E |0 + \x9D\x9F |0 + \x9D\xA0 |0 + \x9D\xA1 |0 + \x9D\xA2 |0 + \x9D\xA3 |0 + \xBE\xBA |0 + \x9D\xA4 |0 + \x9D\xA5 |0 + \x9D\xA6 |0 + \xBE\xBB |0 + \x9D\xA7 |0 + \x9D\xA8 |0 + \x9D\xA9 |0 + \xBE\xBC |0 + \x9D\xAA |0 + \x9D\xAB |0 + \x9D\xAC |0 + \x9D\xAD |0 + \x9D\xAE |0 + \x9D\xAF |0 + \x9D\xB0 |0 + \xBE\xBD |0 + \x9D\xB1 |0 + \x9D\xB2 |0 + \x9D\xB3 |0 + \x9D\xB4 |0 + \x9D\xB5 |0 + \x9D\xB6 |0 + \x9D\xB7 |0 + \x9D\xB8 |0 + \x9D\xB9 |0 + \x9D\xBA |0 + \x9D\xBB |0 + \xBE\xBE |0 + \xBE\xBF |0 + \x9D\xBC |0 + \x9D\xBD |0 + \xBE\xC0 |0 + \x9D\xBE |0 + \x9D\xBF |0 + \x9D\xC0 |0 + \xBE\xC1 |0 + \x9D\xC1 |0 + \x9D\xC2 |0 + \x9D\xC3 |0 + \x9D\xC4 |0 + \x9D\xC5 |0 + \x9D\xC6 |0 + \x9D\xC7 |0 + \xBE\xC2 |0 + \xBE\xC3 |0 + \x9D\xC8 |0 + \xBE\xC4 |0 + \x9D\xC9 |0 + \xBE\xC5 |0 + \x9D\xCA |0 + \x9D\xCB |0 + \x9D\xCC |0 + \x9D\xCD |0 + \x9D\xCE |0 + \x9D\xCF |0 + \xBE\xC6 |0 + \xBE\xC7 |0 + \x9D\xD0 |0 + \x9D\xD1 |0 + \xBE\xC8 |0 + \xBE\xC9 |0 + \xBE\xCA |0 + \x9D\xD2 |0 + \xBE\xCB |0 + \xBE\xCC |0 + \xBE\xCD |0 + \x9D\xD3 |0 + \x9D\xD4 |0 + \x9D\xD5 |0 + \x9D\xD6 |0 + \xBE\xCE |0 + \xBE\xCF |0 + \xBE\xD0 |0 + \x9D\xD7 |0 + \xBE\xD1 |0 + \xBE\xD2 |0 + \xBE\xD3 |0 + \x9D\xD8 |0 + \x9D\xD9 |0 + \x9D\xDA |0 + \xBE\xD4 |0 + \xBE\xD5 |0 + \x9D\xDB |0 + \xBE\xD6 |0 + \xBE\xD7 |0 + \x9D\xDC |0 + \x9D\xDD |0 + \xBE\xD8 |0 + \x9D\xDE |0 + \x9D\xDF |0 + \x9D\xE0 |0 + \xBE\xD9 |0 + \x9D\xE1 |0 + \x9D\xE2 |0 + \x9D\xE3 |0 + \x9D\xE4 |0 + \x9D\xE5 |0 + \x9D\xE6 |0 + \x9D\xE7 |0 + \xBE\xDA |0 + \xBE\xDB |0 + \x9D\xE8 |0 + \xBE\xDC |0 + \xBE\xDD |0 + \xBE\xDE |0 + \x9D\xE9 |0 + \x9D\xEA |0 + \x9D\xEB |0 + \x9D\xEC |0 + \x9D\xED |0 + \x9D\xEE |0 + \xBE\xDF |0 + \xBE\xE0 |0 + \x9D\xEF |0 + \x9D\xF0 |0 + \xBE\xE1 |0 + \x9D\xF1 |0 + \x9D\xF2 |0 + \x9D\xF3 |0 + \xBE\xE2 |0 + \x9D\xF4 |0 + \x9D\xF5 |0 + \xBE\xE3 |0 + \x9D\xF6 |0 + \x9D\xF7 |0 + \x9D\xF8 |0 + \x9D\xF9 |0 + \xBE\xE4 |0 + \xBE\xE5 |0 + \x9D\xFA |0 + \xBE\xE6 |0 + \x9D\xFB |0 + \xBE\xE7 |0 + \x9D\xFC |0 + \x9D\xFD |0 + \x9D\xFE |0 + \xBE\xE8 |0 + \x9E\x41 |0 + \xBE\xE9 |0 + \xBE\xEA |0 + \x9E\x42 |0 + \x9E\x43 |0 + \x9E\x44 |0 + \xBE\xEB |0 + \x9E\x45 |0 + \x9E\x46 |0 + \x9E\x47 |0 + \xBE\xEC |0 + \x9E\x48 |0 + \x9E\x49 |0 + \x9E\x4A |0 + \x9E\x4B |0 + \x9E\x4C |0 + \x9E\x4D |0 + \x9E\x4E |0 + \x9E\x4F |0 + \xBE\xED |0 + \x9E\x50 |0 + \x9E\x51 |0 + \x9E\x52 |0 + \x9E\x53 |0 + \x9E\x54 |0 + \x9E\x55 |0 + \x9E\x56 |0 + \x9E\x57 |0 + \x9E\x58 |0 + \x9E\x59 |0 + \xBE\xEE |0 + \xBE\xEF |0 + \x9E\x5A |0 + \x9E\x61 |0 + \xBE\xF0 |0 + \xBE\xF1 |0 + \x9E\x62 |0 + \xBE\xF2 |0 + \xBE\xF3 |0 + \xBE\xF4 |0 + \xBE\xF5 |0 + \x9E\x63 |0 + \x9E\x64 |0 + \x9E\x65 |0 + \x9E\x66 |0 + \x9E\x67 |0 + \xBE\xF6 |0 + \xBE\xF7 |0 + \xBE\xF8 |0 + \xBE\xF9 |0 + \xBE\xFA |0 + \xBE\xFB |0 + \xBE\xFC |0 + \x9E\x68 |0 + \xBE\xFD |0 + \x9E\x69 |0 + \xBE\xFE |0 + \x9E\x6A |0 + \xBF\xA1 |0 + \xBF\xA2 |0 + \x9E\x6B |0 + \x9E\x6C |0 + \xBF\xA3 |0 + \x9E\x6D |0 + \x9E\x6E |0 + \x9E\x6F |0 + \xBF\xA4 |0 + \x9E\x70 |0 + \x9E\x71 |0 + \x9E\x72 |0 + \x9E\x73 |0 + \x9E\x74 |0 + \x9E\x75 |0 + \x9E\x76 |0 + \xBF\xA5 |0 + \xBF\xA6 |0 + \x9E\x77 |0 + \xBF\xA7 |0 + \x9E\x78 |0 + \xBF\xA8 |0 + \x9E\x79 |0 + \x9E\x7A |0 + \x9E\x81 |0 + \x9E\x82 |0 + \x9E\x83 |0 + \x9E\x84 |0 + \xBF\xA9 |0 + \xBF\xAA |0 + \xBF\xAB |0 + \x9E\x85 |0 + \xBF\xAC |0 + \x9E\x86 |0 + \x9E\x87 |0 + \x9E\x88 |0 + \xBF\xAD |0 + \x9E\x89 |0 + \xBF\xAE |0 + \xBF\xAF |0 + \x9E\x8A |0 + \x9E\x8B |0 + \x9E\x8C |0 + \x9E\x8D |0 + \xBF\xB0 |0 + \xBF\xB1 |0 + \xBF\xB2 |0 + \xBF\xB3 |0 + \xBF\xB4 |0 + \xBF\xB5 |0 + \x9E\x8E |0 + \x9E\x8F |0 + \x9E\x90 |0 + \xBF\xB6 |0 + \xBF\xB7 |0 + \xBF\xB8 |0 + \xBF\xB9 |0 + \x9E\x91 |0 + \x9E\x92 |0 + \x9E\x93 |0 + \xBF\xBA |0 + \x9E\x94 |0 + \x9E\x95 |0 + \x9E\x96 |0 + \xBF\xBB |0 + \x9E\x97 |0 + \x9E\x98 |0 + \x9E\x99 |0 + \x9E\x9A |0 + \x9E\x9B |0 + \x9E\x9C |0 + \x9E\x9D |0 + \xBF\xBC |0 + \xBF\xBD |0 + \x9E\x9E |0 + \xBF\xBE |0 + \xBF\xBF |0 + \x9E\x9F |0 + \x9E\xA0 |0 + \x9E\xA1 |0 + \x9E\xA2 |0 + \x9E\xA3 |0 + \x9E\xA4 |0 + \x9E\xA5 |0 + \xBF\xC0 |0 + \xBF\xC1 |0 + \x9E\xA6 |0 + \x9E\xA7 |0 + \xBF\xC2 |0 + \x9E\xA8 |0 + \x9E\xA9 |0 + \x9E\xAA |0 + \xBF\xC3 |0 + \xBF\xC4 |0 + \xBF\xC5 |0 + \x9E\xAB |0 + \xBF\xC6 |0 + \x9E\xAC |0 + \x9E\xAD |0 + \xBF\xC7 |0 + \xBF\xC8 |0 + \xBF\xC9 |0 + \x9E\xAE |0 + \xBF\xCA |0 + \x9E\xAF |0 + \xBF\xCB |0 + \x9E\xB0 |0 + \xBF\xCC |0 + \x9E\xB1 |0 + \x9E\xB2 |0 + \x9E\xB3 |0 + \x9E\xB4 |0 + \xBF\xCD |0 + \xBF\xCE |0 + \x9E\xB5 |0 + \x9E\xB6 |0 + \xBF\xCF |0 + \x9E\xB7 |0 + \x9E\xB8 |0 + \x9E\xB9 |0 + \xBF\xD0 |0 + \x9E\xBA |0 + \x9E\xBB |0 + \x9E\xBC |0 + \x9E\xBD |0 + \x9E\xBE |0 + \x9E\xBF |0 + \x9E\xC0 |0 + \xBF\xD1 |0 + \xBF\xD2 |0 + \x9E\xC1 |0 + \xBF\xD3 |0 + \xBF\xD4 |0 + \xBF\xD5 |0 + \x9E\xC2 |0 + \x9E\xC3 |0 + \x9E\xC4 |0 + \x9E\xC5 |0 + \x9E\xC6 |0 + \x9E\xC7 |0 + \xBF\xD6 |0 + \xBF\xD7 |0 + \x9E\xC8 |0 + \x9E\xC9 |0 + \xBF\xD8 |0 + \x9E\xCA |0 + \x9E\xCB |0 + \x9E\xCC |0 + \x9E\xCD |0 + \x9E\xCE |0 + \x9E\xCF |0 + \x9E\xD0 |0 + \x9E\xD1 |0 + \x9E\xD2 |0 + \x9E\xD3 |0 + \x9E\xD4 |0 + \xBF\xD9 |0 + \x9E\xD5 |0 + \x9E\xD6 |0 + \xBF\xDA |0 + \x9E\xD7 |0 + \xBF\xDB |0 + \x9E\xD8 |0 + \x9E\xD9 |0 + \x9E\xDA |0 + \x9E\xDB |0 + \x9E\xDC |0 + \x9E\xDD |0 + \xBF\xDC |0 + \xBF\xDD |0 + \x9E\xDE |0 + \x9E\xDF |0 + \xBF\xDE |0 + \x9E\xE0 |0 + \x9E\xE1 |0 + \x9E\xE2 |0 + \xBF\xDF |0 + \x9E\xE3 |0 + \x9E\xE4 |0 + \x9E\xE5 |0 + \x9E\xE6 |0 + \x9E\xE7 |0 + \x9E\xE8 |0 + \x9E\xE9 |0 + \xBF\xE0 |0 + \xBF\xE1 |0 + \x9E\xEA |0 + \xBF\xE2 |0 + \x9E\xEB |0 + \xBF\xE3 |0 + \x9E\xEC |0 + \x9E\xED |0 + \x9E\xEE |0 + \x9E\xEF |0 + \x9E\xF0 |0 + \x9E\xF1 |0 + \xBF\xE4 |0 + \xBF\xE5 |0 + \x9E\xF2 |0 + \x9E\xF3 |0 + \xBF\xE6 |0 + \x9E\xF4 |0 + \x9E\xF5 |0 + \x9E\xF6 |0 + \xBF\xE7 |0 + \x9E\xF7 |0 + \x9E\xF8 |0 + \x9E\xF9 |0 + \x9E\xFA |0 + \x9E\xFB |0 + \x9E\xFC |0 + \x9E\xFD |0 + \xBF\xE8 |0 + \xBF\xE9 |0 + \x9E\xFE |0 + \xBF\xEA |0 + \x9F\x41 |0 + \xBF\xEB |0 + \x9F\x42 |0 + \x9F\x43 |0 + \x9F\x44 |0 + \x9F\x45 |0 + \x9F\x46 |0 + \x9F\x47 |0 + \xBF\xEC |0 + \xBF\xED |0 + \x9F\x48 |0 + \x9F\x49 |0 + \xBF\xEE |0 + \x9F\x4A |0 + \x9F\x4B |0 + \x9F\x4C |0 + \xBF\xEF |0 + \xBF\xF0 |0 + \xBF\xF1 |0 + \x9F\x4D |0 + \x9F\x4E |0 + \x9F\x4F |0 + \x9F\x50 |0 + \x9F\x51 |0 + \xBF\xF2 |0 + \xBF\xF3 |0 + \x9F\x52 |0 + \xBF\xF4 |0 + \x9F\x53 |0 + \xBF\xF5 |0 + \x9F\x54 |0 + \x9F\x55 |0 + \x9F\x56 |0 + \x9F\x57 |0 + \x9F\x58 |0 + \x9F\x59 |0 + \xBF\xF6 |0 + \xBF\xF7 |0 + \x9F\x5A |0 + \x9F\x61 |0 + \xBF\xF8 |0 + \x9F\x62 |0 + \x9F\x63 |0 + \x9F\x64 |0 + \xBF\xF9 |0 + \x9F\x65 |0 + \x9F\x66 |0 + \x9F\x67 |0 + \x9F\x68 |0 + \x9F\x69 |0 + \x9F\x6A |0 + \x9F\x6B |0 + \xBF\xFA |0 + \xBF\xFB |0 + \x9F\x6C |0 + \x9F\x6D |0 + \xBF\xFC |0 + \xBF\xFD |0 + \x9F\x6E |0 + \x9F\x6F |0 + \x9F\x70 |0 + \x9F\x71 |0 + \x9F\x72 |0 + \x9F\x73 |0 + \xBF\xFE |0 + \xC0\xA1 |0 + \x9F\x74 |0 + \x9F\x75 |0 + \xC0\xA2 |0 + \x9F\x76 |0 + \x9F\x77 |0 + \x9F\x78 |0 + \xC0\xA3 |0 + \x9F\x79 |0 + \x9F\x7A |0 + \x9F\x81 |0 + \x9F\x82 |0 + \x9F\x83 |0 + \x9F\x84 |0 + \x9F\x85 |0 + \xC0\xA4 |0 + \xC0\xA5 |0 + \x9F\x86 |0 + \x9F\x87 |0 + \x9F\x88 |0 + \xC0\xA6 |0 + \x9F\x89 |0 + \x9F\x8A |0 + \x9F\x8B |0 + \x9F\x8C |0 + \x9F\x8D |0 + \x9F\x8E |0 + \xC0\xA7 |0 + \xC0\xA8 |0 + \x9F\x8F |0 + \x9F\x90 |0 + \xC0\xA9 |0 + \x9F\x91 |0 + \x9F\x92 |0 + \x9F\x93 |0 + \xC0\xAA |0 + \x9F\x94 |0 + \x9F\x95 |0 + \x9F\x96 |0 + \x9F\x97 |0 + \x9F\x98 |0 + \x9F\x99 |0 + \x9F\x9A |0 + \xC0\xAB |0 + \xC0\xAC |0 + \x9F\x9B |0 + \xC0\xAD |0 + \x9F\x9C |0 + \xC0\xAE |0 + \x9F\x9D |0 + \x9F\x9E |0 + \x9F\x9F |0 + \x9F\xA0 |0 + \x9F\xA1 |0 + \x9F\xA2 |0 + \xC0\xAF |0 + \xC0\xB0 |0 + \x9F\xA3 |0 + \x9F\xA4 |0 + \xC0\xB1 |0 + \x9F\xA5 |0 + \x9F\xA6 |0 + \x9F\xA7 |0 + \xC0\xB2 |0 + \x9F\xA8 |0 + \x9F\xA9 |0 + \x9F\xAA |0 + \x9F\xAB |0 + \x9F\xAC |0 + \x9F\xAD |0 + \x9F\xAE |0 + \xC0\xB3 |0 + \xC0\xB4 |0 + \x9F\xAF |0 + \xC0\xB5 |0 + \x9F\xB0 |0 + \xC0\xB6 |0 + \x9F\xB1 |0 + \xC0\xB7 |0 + \x9F\xB2 |0 + \x9F\xB3 |0 + \x9F\xB4 |0 + \x9F\xB5 |0 + \xC0\xB8 |0 + \xC0\xB9 |0 + \x9F\xB6 |0 + \x9F\xB7 |0 + \xC0\xBA |0 + \x9F\xB8 |0 + \x9F\xB9 |0 + \x9F\xBA |0 + \xC0\xBB |0 + \x9F\xBB |0 + \x9F\xBC |0 + \x9F\xBD |0 + \x9F\xBE |0 + \x9F\xBF |0 + \xC0\xBC |0 + \x9F\xC0 |0 + \xC0\xBD |0 + \xC0\xBE |0 + \x9F\xC1 |0 + \xC0\xBF |0 + \x9F\xC2 |0 + \xC0\xC0 |0 + \xC0\xC1 |0 + \xC0\xC2 |0 + \xC0\xC3 |0 + \xC0\xC4 |0 + \xC0\xC5 |0 + \xC0\xC6 |0 + \xC0\xC7 |0 + \x9F\xC3 |0 + \x9F\xC4 |0 + \x9F\xC5 |0 + \xC0\xC8 |0 + \x9F\xC6 |0 + \x9F\xC7 |0 + \x9F\xC8 |0 + \xC0\xC9 |0 + \x9F\xC9 |0 + \x9F\xCA |0 + \x9F\xCB |0 + \x9F\xCC |0 + \x9F\xCD |0 + \x9F\xCE |0 + \x9F\xCF |0 + \xC0\xCA |0 + \x9F\xD0 |0 + \x9F\xD1 |0 + \xC0\xCB |0 + \x9F\xD2 |0 + \x9F\xD3 |0 + \x9F\xD4 |0 + \x9F\xD5 |0 + \x9F\xD6 |0 + \x9F\xD7 |0 + \x9F\xD8 |0 + \x9F\xD9 |0 + \xC0\xCC |0 + \xC0\xCD |0 + \x9F\xDA |0 + \x9F\xDB |0 + \xC0\xCE |0 + \x9F\xDC |0 + \x9F\xDD |0 + \x9F\xDE |0 + \xC0\xCF |0 + \xC0\xD0 |0 + \xC0\xD1 |0 + \x9F\xDF |0 + \x9F\xE0 |0 + \x9F\xE1 |0 + \x9F\xE2 |0 + \xC0\xD2 |0 + \xC0\xD3 |0 + \xC0\xD4 |0 + \x9F\xE3 |0 + \xC0\xD5 |0 + \xC0\xD6 |0 + \xC0\xD7 |0 + \xC0\xD8 |0 + \x9F\xE4 |0 + \x9F\xE5 |0 + \x9F\xE6 |0 + \xC0\xD9 |0 + \x9F\xE7 |0 + \xC0\xDA |0 + \xC0\xDB |0 + \x9F\xE8 |0 + \x9F\xE9 |0 + \xC0\xDC |0 + \x9F\xEA |0 + \xC0\xDD |0 + \xC0\xDE |0 + \xC0\xDF |0 + \x9F\xEB |0 + \xC0\xE0 |0 + \x9F\xEC |0 + \x9F\xED |0 + \x9F\xEE |0 + \x9F\xEF |0 + \x9F\xF0 |0 + \xC0\xE1 |0 + \xC0\xE2 |0 + \x9F\xF1 |0 + \xC0\xE3 |0 + \xC0\xE4 |0 + \xC0\xE5 |0 + \xC0\xE6 |0 + \x9F\xF2 |0 + \x9F\xF3 |0 + \x9F\xF4 |0 + \x9F\xF5 |0 + \x9F\xF6 |0 + \xC0\xE7 |0 + \xC0\xE8 |0 + \x9F\xF7 |0 + \x9F\xF8 |0 + \xC0\xE9 |0 + \x9F\xF9 |0 + \x9F\xFA |0 + \x9F\xFB |0 + \xC0\xEA |0 + \x9F\xFC |0 + \x9F\xFD |0 + \x9F\xFE |0 + \xA0\x41 |0 + \xA0\x42 |0 + \xA0\x43 |0 + \xA0\x44 |0 + \xC0\xEB |0 + \xC0\xEC |0 + \xA0\x45 |0 + \xC0\xED |0 + \xC0\xEE |0 + \xC0\xEF |0 + \xA0\x46 |0 + \xA0\x47 |0 + \xA0\x48 |0 + \xA0\x49 |0 + \xA0\x4A |0 + \xA0\x4B |0 + \xC0\xF0 |0 + \xC0\xF1 |0 + \xA0\x4C |0 + \xA0\x4D |0 + \xC0\xF2 |0 + \xA0\x4E |0 + \xC0\xF3 |0 + \xA0\x4F |0 + \xC0\xF4 |0 + \xA0\x50 |0 + \xA0\x51 |0 + \xA0\x52 |0 + \xA0\x53 |0 + \xA0\x54 |0 + \xA0\x55 |0 + \xA0\x56 |0 + \xC0\xF5 |0 + \xA0\x57 |0 + \xA0\x58 |0 + \xA0\x59 |0 + \xA0\x5A |0 + \xC0\xF6 |0 + \xA0\x61 |0 + \xA0\x62 |0 + \xA0\x63 |0 + \xA0\x64 |0 + \xA0\x65 |0 + \xA0\x66 |0 + \xC0\xF7 |0 + \xA0\x67 |0 + \xA0\x68 |0 + \xA0\x69 |0 + \xC0\xF8 |0 + \xA0\x6A |0 + \xA0\x6B |0 + \xA0\x6C |0 + \xC0\xF9 |0 + \xA0\x6D |0 + \xA0\x6E |0 + \xA0\x6F |0 + \xA0\x70 |0 + \xA0\x71 |0 + \xA0\x72 |0 + \xA0\x73 |0 + \xA0\x74 |0 + \xA0\x75 |0 + \xA0\x76 |0 + \xA0\x77 |0 + \xA0\x78 |0 + \xA0\x79 |0 + \xA0\x7A |0 + \xA0\x81 |0 + \xA0\x82 |0 + \xA0\x83 |0 + \xA0\x84 |0 + \xA0\x85 |0 + \xC0\xFA |0 + \xC0\xFB |0 + \xA0\x86 |0 + \xA0\x87 |0 + \xC0\xFC |0 + \xA0\x88 |0 + \xA0\x89 |0 + \xA0\x8A |0 + \xC0\xFD |0 + \xA0\x8B |0 + \xC0\xFE |0 + \xA0\x8C |0 + \xA0\x8D |0 + \xA0\x8E |0 + \xA0\x8F |0 + \xA0\x90 |0 + \xC1\xA1 |0 + \xC1\xA2 |0 + \xA0\x91 |0 + \xC1\xA3 |0 + \xA0\x92 |0 + \xC1\xA4 |0 + \xC1\xA5 |0 + \xA0\x93 |0 + \xA0\x94 |0 + \xA0\x95 |0 + \xA0\x96 |0 + \xA0\x97 |0 + \xC1\xA6 |0 + \xC1\xA7 |0 + \xA0\x98 |0 + \xA0\x99 |0 + \xC1\xA8 |0 + \xA0\x9A |0 + \xA0\x9B |0 + \xA0\x9C |0 + \xC1\xA9 |0 + \xA0\x9D |0 + \xA0\x9E |0 + \xA0\x9F |0 + \xA0\xA0 |0 + \xA0\xA1 |0 + \xA0\xA2 |0 + \xA0\xA3 |0 + \xC1\xAA |0 + \xC1\xAB |0 + \xA0\xA4 |0 + \xC1\xAC |0 + \xA0\xA5 |0 + \xC1\xAD |0 + \xA0\xA6 |0 + \xA0\xA7 |0 + \xA0\xA8 |0 + \xA0\xA9 |0 + \xA0\xAA |0 + \xA0\xAB |0 + \xC1\xAE |0 + \xA0\xAC |0 + \xA0\xAD |0 + \xA0\xAE |0 + \xC1\xAF |0 + \xA0\xAF |0 + \xA0\xB0 |0 + \xA0\xB1 |0 + \xC1\xB0 |0 + \xA0\xB2 |0 + \xA0\xB3 |0 + \xA0\xB4 |0 + \xA0\xB5 |0 + \xA0\xB6 |0 + \xA0\xB7 |0 + \xA0\xB8 |0 + \xC1\xB1 |0 + \xC1\xB2 |0 + \xA0\xB9 |0 + \xA0\xBA |0 + \xC1\xB3 |0 + \xC1\xB4 |0 + \xA0\xBB |0 + \xA0\xBC |0 + \xA0\xBD |0 + \xA0\xBE |0 + \xA0\xBF |0 + \xA0\xC0 |0 + \xC1\xB5 |0 + \xA0\xC1 |0 + \xA0\xC2 |0 + \xA0\xC3 |0 + \xA0\xC4 |0 + \xA0\xC5 |0 + \xA0\xC6 |0 + \xA0\xC7 |0 + \xA0\xC8 |0 + \xA0\xC9 |0 + \xA0\xCA |0 + \xA0\xCB |0 + \xA0\xCC |0 + \xA0\xCD |0 + \xA0\xCE |0 + \xA0\xCF |0 + \xA0\xD0 |0 + \xA0\xD1 |0 + \xA0\xD2 |0 + \xA0\xD3 |0 + \xA0\xD4 |0 + \xA0\xD5 |0 + \xA0\xD6 |0 + \xA0\xD7 |0 + \xA0\xD8 |0 + \xA0\xD9 |0 + \xA0\xDA |0 + \xA0\xDB |0 + \xC1\xB6 |0 + \xC1\xB7 |0 + \xA0\xDC |0 + \xA0\xDD |0 + \xC1\xB8 |0 + \xA0\xDE |0 + \xA0\xDF |0 + \xA0\xE0 |0 + \xC1\xB9 |0 + \xA0\xE1 |0 + \xC1\xBA |0 + \xA0\xE2 |0 + \xA0\xE3 |0 + \xA0\xE4 |0 + \xA0\xE5 |0 + \xA0\xE6 |0 + \xC1\xBB |0 + \xC1\xBC |0 + \xA0\xE7 |0 + \xC1\xBD |0 + \xA0\xE8 |0 + \xC1\xBE |0 + \xC1\xBF |0 + \xC1\xC0 |0 + \xA0\xE9 |0 + \xA0\xEA |0 + \xA0\xEB |0 + \xC1\xC1 |0 + \xC1\xC2 |0 + \xC1\xC3 |0 + \xA0\xEC |0 + \xA0\xED |0 + \xA0\xEE |0 + \xA0\xEF |0 + \xA0\xF0 |0 + \xA0\xF1 |0 + \xC1\xC4 |0 + \xA0\xF2 |0 + \xA0\xF3 |0 + \xA0\xF4 |0 + \xA0\xF5 |0 + \xA0\xF6 |0 + \xA0\xF7 |0 + \xA0\xF8 |0 + \xA0\xF9 |0 + \xC1\xC5 |0 + \xA0\xFA |0 + \xC1\xC6 |0 + \xA0\xFB |0 + \xC1\xC7 |0 + \xA0\xFC |0 + \xA0\xFD |0 + \xA0\xFE |0 + \xA1\x41 |0 + \xA1\x42 |0 + \xA1\x43 |0 + \xC1\xC8 |0 + \xA1\x44 |0 + \xA1\x45 |0 + \xA1\x46 |0 + \xA1\x47 |0 + \xA1\x48 |0 + \xA1\x49 |0 + \xA1\x4A |0 + \xA1\x4B |0 + \xA1\x4C |0 + \xA1\x4D |0 + \xA1\x4E |0 + \xA1\x4F |0 + \xA1\x50 |0 + \xA1\x51 |0 + \xA1\x52 |0 + \xA1\x53 |0 + \xA1\x54 |0 + \xA1\x55 |0 + \xA1\x56 |0 + \xC1\xC9 |0 + \xC1\xCA |0 + \xA1\x57 |0 + \xA1\x58 |0 + \xA1\x59 |0 + \xA1\x5A |0 + \xA1\x61 |0 + \xA1\x62 |0 + \xC1\xCB |0 + \xA1\x63 |0 + \xA1\x64 |0 + \xA1\x65 |0 + \xC1\xCC |0 + \xA1\x66 |0 + \xA1\x67 |0 + \xA1\x68 |0 + \xC1\xCD |0 + \xA1\x69 |0 + \xA1\x6A |0 + \xA1\x6B |0 + \xA1\x6C |0 + \xA1\x6D |0 + \xA1\x6E |0 + \xA1\x6F |0 + \xC1\xCE |0 + \xC1\xCF |0 + \xA1\x70 |0 + \xC1\xD0 |0 + \xA1\x71 |0 + \xC1\xD1 |0 + \xA1\x72 |0 + \xA1\x73 |0 + \xA1\x74 |0 + \xA1\x75 |0 + \xA1\x76 |0 + \xA1\x77 |0 + \xC1\xD2 |0 + \xC1\xD3 |0 + \xA1\x78 |0 + \xA1\x79 |0 + \xC1\xD4 |0 + \xA1\x7A |0 + \xA1\x81 |0 + \xA1\x82 |0 + \xA1\x83 |0 + \xA1\x84 |0 + \xA1\x85 |0 + \xA1\x86 |0 + \xA1\x87 |0 + \xA1\x88 |0 + \xA1\x89 |0 + \xA1\x8A |0 + \xA1\x8B |0 + \xA1\x8C |0 + \xA1\x8D |0 + \xA1\x8E |0 + \xA1\x8F |0 + \xC1\xD5 |0 + \xA1\x90 |0 + \xA1\x91 |0 + \xA1\x92 |0 + \xA1\x93 |0 + \xA1\x94 |0 + \xA1\x95 |0 + \xC1\xD6 |0 + \xC1\xD7 |0 + \xA1\x96 |0 + \xA1\x97 |0 + \xC1\xD8 |0 + \xA1\x98 |0 + \xA1\x99 |0 + \xA1\x9A |0 + \xC1\xD9 |0 + \xC1\xDA |0 + \xC1\xDB |0 + \xA1\x9B |0 + \xA1\x9C |0 + \xA1\x9D |0 + \xA1\x9E |0 + \xA1\x9F |0 + \xC1\xDC |0 + \xC1\xDD |0 + \xA1\xA0 |0 + \xC1\xDE |0 + \xA2\x41 |0 + \xC1\xDF |0 + \xA2\x42 |0 + \xA2\x43 |0 + \xA2\x44 |0 + \xA2\x45 |0 + \xA2\x46 |0 + \xA2\x47 |0 + \xC1\xE0 |0 + \xA2\x48 |0 + \xA2\x49 |0 + \xA2\x4A |0 + \xA2\x4B |0 + \xA2\x4C |0 + \xA2\x4D |0 + \xA2\x4E |0 + \xA2\x4F |0 + \xA2\x50 |0 + \xA2\x51 |0 + \xA2\x52 |0 + \xA2\x53 |0 + \xA2\x54 |0 + \xA2\x55 |0 + \xA2\x56 |0 + \xA2\x57 |0 + \xA2\x58 |0 + \xA2\x59 |0 + \xA2\x5A |0 + \xC1\xE1 |0 + \xA2\x61 |0 + \xA2\x62 |0 + \xA2\x63 |0 + \xA2\x64 |0 + \xA2\x65 |0 + \xA2\x66 |0 + \xA2\x67 |0 + \xC1\xE2 |0 + \xA2\x68 |0 + \xA2\x69 |0 + \xA2\x6A |0 + \xA2\x6B |0 + \xA2\x6C |0 + \xA2\x6D |0 + \xA2\x6E |0 + \xA2\x6F |0 + \xA2\x70 |0 + \xA2\x71 |0 + \xA2\x72 |0 + \xA2\x73 |0 + \xA2\x74 |0 + \xA2\x75 |0 + \xA2\x76 |0 + \xA2\x77 |0 + \xA2\x78 |0 + \xA2\x79 |0 + \xA2\x7A |0 + \xA2\x81 |0 + \xA2\x82 |0 + \xA2\x83 |0 + \xA2\x84 |0 + \xA2\x85 |0 + \xA2\x86 |0 + \xA2\x87 |0 + \xA2\x88 |0 + \xC1\xE3 |0 + \xC1\xE4 |0 + \xA2\x89 |0 + \xA2\x8A |0 + \xC1\xE5 |0 + \xA2\x8B |0 + \xA2\x8C |0 + \xA2\x8D |0 + \xC1\xE6 |0 + \xA2\x8E |0 + \xA2\x8F |0 + \xA2\x90 |0 + \xA2\x91 |0 + \xA2\x92 |0 + \xA2\x93 |0 + \xA2\x94 |0 + \xC1\xE7 |0 + \xC1\xE8 |0 + \xA2\x95 |0 + \xC1\xE9 |0 + \xA2\x96 |0 + \xA2\x97 |0 + \xA2\x98 |0 + \xA2\x99 |0 + \xA2\x9A |0 + \xA2\x9B |0 + \xA2\x9C |0 + \xA2\x9D |0 + \xC1\xEA |0 + \xA2\x9E |0 + \xA2\x9F |0 + \xA2\xA0 |0 + \xC1\xEB |0 + \xA3\x41 |0 + \xA3\x42 |0 + \xA3\x43 |0 + \xC1\xEC |0 + \xA3\x44 |0 + \xA3\x45 |0 + \xA3\x46 |0 + \xA3\x47 |0 + \xA3\x48 |0 + \xA3\x49 |0 + \xA3\x4A |0 + \xC1\xED |0 + \xA3\x4B |0 + \xA3\x4C |0 + \xA3\x4D |0 + \xA3\x4E |0 + \xA3\x4F |0 + \xA3\x50 |0 + \xA3\x51 |0 + \xA3\x52 |0 + \xA3\x53 |0 + \xA3\x54 |0 + \xA3\x55 |0 + \xC1\xEE |0 + \xC1\xEF |0 + \xA3\x56 |0 + \xA3\x57 |0 + \xC1\xF0 |0 + \xA3\x58 |0 + \xA3\x59 |0 + \xA3\x5A |0 + \xC1\xF1 |0 + \xA3\x61 |0 + \xA3\x62 |0 + \xA3\x63 |0 + \xA3\x64 |0 + \xA3\x65 |0 + \xA3\x66 |0 + \xA3\x67 |0 + \xC1\xF2 |0 + \xC1\xF3 |0 + \xA3\x68 |0 + \xC1\xF4 |0 + \xA3\x69 |0 + \xC1\xF5 |0 + \xA3\x6A |0 + \xA3\x6B |0 + \xA3\x6C |0 + \xA3\x6D |0 + \xA3\x6E |0 + \xA3\x6F |0 + \xA3\x70 |0 + \xA3\x71 |0 + \xA3\x72 |0 + \xA3\x73 |0 + \xA3\x74 |0 + \xA3\x75 |0 + \xA3\x76 |0 + \xA3\x77 |0 + \xA3\x78 |0 + \xA3\x79 |0 + \xA3\x7A |0 + \xA3\x81 |0 + \xA3\x82 |0 + \xA3\x83 |0 + \xA3\x84 |0 + \xA3\x85 |0 + \xA3\x86 |0 + \xA3\x87 |0 + \xA3\x88 |0 + \xA3\x89 |0 + \xA3\x8A |0 + \xA3\x8B |0 + \xA3\x8C |0 + \xA3\x8D |0 + \xA3\x8E |0 + \xA3\x8F |0 + \xA3\x90 |0 + \xA3\x91 |0 + \xC1\xF6 |0 + \xC1\xF7 |0 + \xA3\x92 |0 + \xA3\x93 |0 + \xC1\xF8 |0 + \xA3\x94 |0 + \xA3\x95 |0 + \xC1\xF9 |0 + \xC1\xFA |0 + \xA3\x96 |0 + \xC1\xFB |0 + \xA3\x97 |0 + \xA3\x98 |0 + \xA3\x99 |0 + \xA3\x9A |0 + \xA3\x9B |0 + \xC1\xFC |0 + \xC1\xFD |0 + \xA3\x9C |0 + \xC1\xFE |0 + \xA3\x9D |0 + \xC2\xA1 |0 + \xC2\xA2 |0 + \xA3\x9E |0 + \xA3\x9F |0 + \xC2\xA3 |0 + \xC2\xA4 |0 + \xA3\xA0 |0 + \xC2\xA5 |0 + \xC2\xA6 |0 + \xA4\x41 |0 + \xA4\x42 |0 + \xC2\xA7 |0 + \xA4\x43 |0 + \xC2\xA8 |0 + \xA4\x44 |0 + \xC2\xA9 |0 + \xA4\x45 |0 + \xA4\x46 |0 + \xC2\xAA |0 + \xA4\x47 |0 + \xA4\x48 |0 + \xA4\x49 |0 + \xA4\x4A |0 + \xC2\xAB |0 + \xC2\xAC |0 + \xA4\x4B |0 + \xC2\xAD |0 + \xC2\xAE |0 + \xC2\xAF |0 + \xA4\x4C |0 + \xA4\x4D |0 + \xA4\x4E |0 + \xA4\x4F |0 + \xA4\x50 |0 + \xA4\x51 |0 + \xC2\xB0 |0 + \xC2\xB1 |0 + \xA4\x52 |0 + \xA4\x53 |0 + \xC2\xB2 |0 + \xA4\x54 |0 + \xA4\x55 |0 + \xA4\x56 |0 + \xC2\xB3 |0 + \xA4\x57 |0 + \xA4\x58 |0 + \xA4\x59 |0 + \xA4\x5A |0 + \xA4\x61 |0 + \xA4\x62 |0 + \xA4\x63 |0 + \xC2\xB4 |0 + \xC2\xB5 |0 + \xA4\x64 |0 + \xC2\xB6 |0 + \xC2\xB7 |0 + \xC2\xB8 |0 + \xA4\x65 |0 + \xA4\x66 |0 + \xA4\x67 |0 + \xA4\x68 |0 + \xA4\x69 |0 + \xA4\x6A |0 + \xC2\xB9 |0 + \xA4\x6B |0 + \xA4\x6C |0 + \xA4\x6D |0 + \xC2\xBA |0 + \xA4\x6E |0 + \xA4\x6F |0 + \xA4\x70 |0 + \xA4\x71 |0 + \xA4\x72 |0 + \xA4\x73 |0 + \xA4\x74 |0 + \xA4\x75 |0 + \xA4\x76 |0 + \xA4\x77 |0 + \xA4\x78 |0 + \xA4\x79 |0 + \xA4\x7A |0 + \xA4\x81 |0 + \xA4\x82 |0 + \xA4\x83 |0 + \xC2\xBB |0 + \xA4\x84 |0 + \xA4\x85 |0 + \xA4\x86 |0 + \xA4\x87 |0 + \xA4\x88 |0 + \xA4\x89 |0 + \xA4\x8A |0 + \xA4\x8B |0 + \xA4\x8C |0 + \xA4\x8D |0 + \xA4\x8E |0 + \xA4\x8F |0 + \xA4\x90 |0 + \xA4\x91 |0 + \xA4\x92 |0 + \xA4\x93 |0 + \xA4\x94 |0 + \xA4\x95 |0 + \xA4\x96 |0 + \xA4\x97 |0 + \xA4\x98 |0 + \xA4\x99 |0 + \xA4\x9A |0 + \xA4\x9B |0 + \xA4\x9C |0 + \xA4\x9D |0 + \xA4\x9E |0 + \xA4\x9F |0 + \xA4\xA0 |0 + \xA5\x41 |0 + \xA5\x42 |0 + \xA5\x43 |0 + \xA5\x44 |0 + \xA5\x45 |0 + \xC2\xBC |0 + \xC2\xBD |0 + \xA5\x46 |0 + \xA5\x47 |0 + \xC2\xBE |0 + \xA5\x48 |0 + \xA5\x49 |0 + \xA5\x4A |0 + \xC2\xBF |0 + \xA5\x4B |0 + \xA5\x4C |0 + \xA5\x4D |0 + \xA5\x4E |0 + \xA5\x4F |0 + \xA5\x50 |0 + \xA5\x51 |0 + \xC2\xC0 |0 + \xC2\xC1 |0 + \xA5\x52 |0 + \xC2\xC2 |0 + \xC2\xC3 |0 + \xC2\xC4 |0 + \xA5\x53 |0 + \xA5\x54 |0 + \xA5\x55 |0 + \xA5\x56 |0 + \xA5\x57 |0 + \xA5\x58 |0 + \xC2\xC5 |0 + \xA5\x59 |0 + \xA5\x5A |0 + \xA5\x61 |0 + \xA5\x62 |0 + \xA5\x63 |0 + \xA5\x64 |0 + \xA5\x65 |0 + \xA5\x66 |0 + \xA5\x67 |0 + \xA5\x68 |0 + \xA5\x69 |0 + \xA5\x6A |0 + \xA5\x6B |0 + \xA5\x6C |0 + \xA5\x6D |0 + \xA5\x6E |0 + \xA5\x6F |0 + \xA5\x70 |0 + \xA5\x71 |0 + \xA5\x72 |0 + \xC2\xC6 |0 + \xA5\x73 |0 + \xA5\x74 |0 + \xA5\x75 |0 + \xA5\x76 |0 + \xA5\x77 |0 + \xA5\x78 |0 + \xC2\xC7 |0 + \xA5\x79 |0 + \xA5\x7A |0 + \xA5\x81 |0 + \xA5\x82 |0 + \xA5\x83 |0 + \xA5\x84 |0 + \xA5\x85 |0 + \xA5\x86 |0 + \xA5\x87 |0 + \xA5\x88 |0 + \xA5\x89 |0 + \xA5\x8A |0 + \xA5\x8B |0 + \xA5\x8C |0 + \xA5\x8D |0 + \xA5\x8E |0 + \xA5\x8F |0 + \xA5\x90 |0 + \xA5\x91 |0 + \xC2\xC8 |0 + \xA5\x92 |0 + \xA5\x93 |0 + \xA5\x94 |0 + \xA5\x95 |0 + \xA5\x96 |0 + \xA5\x97 |0 + \xA5\x98 |0 + \xA5\x99 |0 + \xA5\x9A |0 + \xA5\x9B |0 + \xA5\x9C |0 + \xA5\x9D |0 + \xA5\x9E |0 + \xA5\x9F |0 + \xA5\xA0 |0 + \xA6\x41 |0 + \xA6\x42 |0 + \xA6\x43 |0 + \xA6\x44 |0 + \xA6\x45 |0 + \xA6\x46 |0 + \xA6\x47 |0 + \xA6\x48 |0 + \xA6\x49 |0 + \xA6\x4A |0 + \xA6\x4B |0 + \xA6\x4C |0 + \xA6\x4D |0 + \xA6\x4E |0 + \xA6\x4F |0 + \xA6\x50 |0 + \xA6\x51 |0 + \xA6\x52 |0 + \xA6\x53 |0 + \xA6\x54 |0 + \xC2\xC9 |0 + \xC2\xCA |0 + \xA6\x55 |0 + \xA6\x56 |0 + \xC2\xCB |0 + \xA6\x57 |0 + \xA6\x58 |0 + \xA6\x59 |0 + \xC2\xCC |0 + \xA6\x5A |0 + \xA6\x61 |0 + \xA6\x62 |0 + \xA6\x63 |0 + \xA6\x64 |0 + \xA6\x65 |0 + \xA6\x66 |0 + \xC2\xCD |0 + \xC2\xCE |0 + \xA6\x67 |0 + \xC2\xCF |0 + \xA6\x68 |0 + \xC2\xD0 |0 + \xA6\x69 |0 + \xC2\xD1 |0 + \xA6\x6A |0 + \xA6\x6B |0 + \xA6\x6C |0 + \xA6\x6D |0 + \xC2\xD2 |0 + \xC2\xD3 |0 + \xA6\x6E |0 + \xA6\x6F |0 + \xA6\x70 |0 + \xA6\x71 |0 + \xA6\x72 |0 + \xA6\x73 |0 + \xC2\xD4 |0 + \xA6\x74 |0 + \xA6\x75 |0 + \xA6\x76 |0 + \xA6\x77 |0 + \xA6\x78 |0 + \xA6\x79 |0 + \xA6\x7A |0 + \xA6\x81 |0 + \xA6\x82 |0 + \xA6\x83 |0 + \xA6\x84 |0 + \xC2\xD5 |0 + \xA6\x85 |0 + \xA6\x86 |0 + \xA6\x87 |0 + \xA6\x88 |0 + \xA6\x89 |0 + \xA6\x8A |0 + \xA6\x8B |0 + \xC2\xD6 |0 + \xA6\x8C |0 + \xA6\x8D |0 + \xA6\x8E |0 + \xA6\x8F |0 + \xA6\x90 |0 + \xA6\x91 |0 + \xA6\x92 |0 + \xA6\x93 |0 + \xA6\x94 |0 + \xA6\x95 |0 + \xA6\x96 |0 + \xA6\x97 |0 + \xA6\x98 |0 + \xA6\x99 |0 + \xA6\x9A |0 + \xA6\x9B |0 + \xA6\x9C |0 + \xA6\x9D |0 + \xA6\x9E |0 + \xC2\xD7 |0 + \xA6\x9F |0 + \xA6\xA0 |0 + \xA7\x41 |0 + \xA7\x42 |0 + \xA7\x43 |0 + \xA7\x44 |0 + \xA7\x45 |0 + \xC2\xD8 |0 + \xA7\x46 |0 + \xA7\x47 |0 + \xA7\x48 |0 + \xC2\xD9 |0 + \xA7\x49 |0 + \xA7\x4A |0 + \xA7\x4B |0 + \xC2\xDA |0 + \xA7\x4C |0 + \xA7\x4D |0 + \xA7\x4E |0 + \xA7\x4F |0 + \xA7\x50 |0 + \xA7\x51 |0 + \xA7\x52 |0 + \xC2\xDB |0 + \xC2\xDC |0 + \xA7\x53 |0 + \xA7\x54 |0 + \xA7\x55 |0 + \xA7\x56 |0 + \xA7\x57 |0 + \xA7\x58 |0 + \xA7\x59 |0 + \xA7\x5A |0 + \xA7\x61 |0 + \xA7\x62 |0 + \xA7\x63 |0 + \xA7\x64 |0 + \xA7\x65 |0 + \xA7\x66 |0 + \xA7\x67 |0 + \xA7\x68 |0 + \xA7\x69 |0 + \xA7\x6A |0 + \xA7\x6B |0 + \xA7\x6C |0 + \xA7\x6D |0 + \xA7\x6E |0 + \xA7\x6F |0 + \xA7\x70 |0 + \xA7\x71 |0 + \xA7\x72 |0 + \xA7\x73 |0 + \xA7\x74 |0 + \xA7\x75 |0 + \xA7\x76 |0 + \xA7\x77 |0 + \xC2\xDD |0 + \xA7\x78 |0 + \xA7\x79 |0 + \xA7\x7A |0 + \xA7\x81 |0 + \xA7\x82 |0 + \xA7\x83 |0 + \xC2\xDE |0 + \xC2\xDF |0 + \xA7\x84 |0 + \xA7\x85 |0 + \xC2\xE0 |0 + \xA7\x86 |0 + \xA7\x87 |0 + \xA7\x88 |0 + \xC2\xE1 |0 + \xA7\x89 |0 + \xA7\x8A |0 + \xA7\x8B |0 + \xA7\x8C |0 + \xA7\x8D |0 + \xA7\x8E |0 + \xA7\x8F |0 + \xC2\xE2 |0 + \xC2\xE3 |0 + \xA7\x90 |0 + \xA7\x91 |0 + \xA7\x92 |0 + \xC2\xE4 |0 + \xA7\x93 |0 + \xA7\x94 |0 + \xA7\x95 |0 + \xA7\x96 |0 + \xA7\x97 |0 + \xA7\x98 |0 + \xC2\xE5 |0 + \xA7\x99 |0 + \xA7\x9A |0 + \xA7\x9B |0 + \xA7\x9C |0 + \xA7\x9D |0 + \xA7\x9E |0 + \xA7\x9F |0 + \xA7\xA0 |0 + \xA8\x41 |0 + \xA8\x42 |0 + \xA8\x43 |0 + \xA8\x44 |0 + \xA8\x45 |0 + \xA8\x46 |0 + \xA8\x47 |0 + \xA8\x48 |0 + \xA8\x49 |0 + \xA8\x4A |0 + \xA8\x4B |0 + \xC2\xE6 |0 + \xC2\xE7 |0 + \xA8\x4C |0 + \xA8\x4D |0 + \xA8\x4E |0 + \xA8\x4F |0 + \xA8\x50 |0 + \xA8\x51 |0 + \xA8\x52 |0 + \xA8\x53 |0 + \xA8\x54 |0 + \xA8\x55 |0 + \xA8\x56 |0 + \xA8\x57 |0 + \xA8\x58 |0 + \xA8\x59 |0 + \xA8\x5A |0 + \xA8\x61 |0 + \xA8\x62 |0 + \xA8\x63 |0 + \xA8\x64 |0 + \xA8\x65 |0 + \xA8\x66 |0 + \xA8\x67 |0 + \xA8\x68 |0 + \xA8\x69 |0 + \xA8\x6A |0 + \xA8\x6B |0 + \xA8\x6C |0 + \xA8\x6D |0 + \xA8\x6E |0 + \xA8\x6F |0 + \xA8\x70 |0 + \xA8\x71 |0 + \xA8\x72 |0 + \xA8\x73 |0 + \xC2\xE8 |0 + \xA8\x74 |0 + \xA8\x75 |0 + \xA8\x76 |0 + \xA8\x77 |0 + \xA8\x78 |0 + \xA8\x79 |0 + \xA8\x7A |0 + \xA8\x81 |0 + \xA8\x82 |0 + \xA8\x83 |0 + \xA8\x84 |0 + \xA8\x85 |0 + \xA8\x86 |0 + \xA8\x87 |0 + \xA8\x88 |0 + \xA8\x89 |0 + \xA8\x8A |0 + \xA8\x8B |0 + \xA8\x8C |0 + \xA8\x8D |0 + \xA8\x8E |0 + \xA8\x8F |0 + \xA8\x90 |0 + \xA8\x91 |0 + \xA8\x92 |0 + \xA8\x93 |0 + \xA8\x94 |0 + \xC2\xE9 |0 + \xA8\x95 |0 + \xA8\x96 |0 + \xA8\x97 |0 + \xA8\x98 |0 + \xA8\x99 |0 + \xA8\x9A |0 + \xA8\x9B |0 + \xA8\x9C |0 + \xA8\x9D |0 + \xA8\x9E |0 + \xA8\x9F |0 + \xA8\xA0 |0 + \xA9\x41 |0 + \xA9\x42 |0 + \xA9\x43 |0 + \xA9\x44 |0 + \xA9\x45 |0 + \xA9\x46 |0 + \xA9\x47 |0 + \xA9\x48 |0 + \xA9\x49 |0 + \xA9\x4A |0 + \xA9\x4B |0 + \xA9\x4C |0 + \xA9\x4D |0 + \xA9\x4E |0 + \xA9\x4F |0 + \xC2\xEA |0 + \xA9\x50 |0 + \xA9\x51 |0 + \xA9\x52 |0 + \xA9\x53 |0 + \xA9\x54 |0 + \xA9\x55 |0 + \xA9\x56 |0 + \xA9\x57 |0 + \xA9\x58 |0 + \xA9\x59 |0 + \xA9\x5A |0 + \xA9\x61 |0 + \xA9\x62 |0 + \xA9\x63 |0 + \xA9\x64 |0 + \xC2\xEB |0 + \xA9\x65 |0 + \xA9\x66 |0 + \xC2\xEC |0 + \xA9\x67 |0 + \xC2\xED |0 + \xA9\x68 |0 + \xA9\x69 |0 + \xA9\x6A |0 + \xA9\x6B |0 + \xA9\x6C |0 + \xA9\x6D |0 + \xA9\x6E |0 + \xA9\x6F |0 + \xA9\x70 |0 + \xA9\x71 |0 + \xA9\x72 |0 + \xA9\x73 |0 + \xA9\x74 |0 + \xA9\x75 |0 + \xA9\x76 |0 + \xA9\x77 |0 + \xA9\x78 |0 + \xA9\x79 |0 + \xA9\x7A |0 + \xA9\x81 |0 + \xA9\x82 |0 + \xA9\x83 |0 + \xA9\x84 |0 + \xA9\x85 |0 + \xA9\x86 |0 + \xA9\x87 |0 + \xA9\x88 |0 + \xA9\x89 |0 + \xA9\x8A |0 + \xA9\x8B |0 + \xA9\x8C |0 + \xA9\x8D |0 + \xA9\x8E |0 + \xA9\x8F |0 + \xC2\xEE |0 + \xC2\xEF |0 + \xA9\x90 |0 + \xA9\x91 |0 + \xC2\xF0 |0 + \xA9\x92 |0 + \xA9\x93 |0 + \xA9\x94 |0 + \xC2\xF1 |0 + \xA9\x95 |0 + \xA9\x96 |0 + \xA9\x97 |0 + \xA9\x98 |0 + \xA9\x99 |0 + \xA9\x9A |0 + \xA9\x9B |0 + \xC2\xF2 |0 + \xC2\xF3 |0 + \xA9\x9C |0 + \xA9\x9D |0 + \xA9\x9E |0 + \xC2\xF4 |0 + \xC2\xF5 |0 + \xA9\x9F |0 + \xA9\xA0 |0 + \xAA\x41 |0 + \xAA\x42 |0 + \xC2\xF6 |0 + \xC2\xF7 |0 + \xC2\xF8 |0 + \xAA\x43 |0 + \xAA\x44 |0 + \xC2\xF9 |0 + \xAA\x45 |0 + \xC2\xFA |0 + \xAA\x46 |0 + \xC2\xFB |0 + \xAA\x47 |0 + \xAA\x48 |0 + \xAA\x49 |0 + \xAA\x4A |0 + \xAA\x4B |0 + \xAA\x4C |0 + \xAA\x4D |0 + \xC2\xFC |0 + \xC2\xFD |0 + \xAA\x4E |0 + \xC2\xFE |0 + \xC3\xA1 |0 + \xC3\xA2 |0 + \xC3\xA3 |0 + \xAA\x4F |0 + \xAA\x50 |0 + \xAA\x51 |0 + \xAA\x52 |0 + \xAA\x53 |0 + \xC3\xA4 |0 + \xC3\xA5 |0 + \xAA\x54 |0 + \xAA\x55 |0 + \xC3\xA6 |0 + \xAA\x56 |0 + \xAA\x57 |0 + \xAA\x58 |0 + \xC3\xA7 |0 + \xAA\x59 |0 + \xAA\x5A |0 + \xAA\x61 |0 + \xAA\x62 |0 + \xAA\x63 |0 + \xAA\x64 |0 + \xAA\x65 |0 + \xC3\xA8 |0 + \xC3\xA9 |0 + \xAA\x66 |0 + \xC3\xAA |0 + \xC3\xAB |0 + \xC3\xAC |0 + \xAA\x67 |0 + \xAA\x68 |0 + \xAA\x69 |0 + \xAA\x6A |0 + \xAA\x6B |0 + \xAA\x6C |0 + \xC3\xAD |0 + \xAA\x6D |0 + \xAA\x6E |0 + \xAA\x6F |0 + \xC3\xAE |0 + \xAA\x70 |0 + \xC3\xAF |0 + \xAA\x71 |0 + \xC3\xB0 |0 + \xAA\x72 |0 + \xAA\x73 |0 + \xAA\x74 |0 + \xAA\x75 |0 + \xAA\x76 |0 + \xAA\x77 |0 + \xAA\x78 |0 + \xC3\xB1 |0 + \xAA\x79 |0 + \xAA\x7A |0 + \xAA\x81 |0 + \xAA\x82 |0 + \xC3\xB2 |0 + \xAA\x83 |0 + \xAA\x84 |0 + \xAA\x85 |0 + \xAA\x86 |0 + \xAA\x87 |0 + \xAA\x88 |0 + \xAA\x89 |0 + \xAA\x8A |0 + \xAA\x8B |0 + \xAA\x8C |0 + \xAA\x8D |0 + \xAA\x8E |0 + \xAA\x8F |0 + \xAA\x90 |0 + \xAA\x91 |0 + \xAA\x92 |0 + \xAA\x93 |0 + \xAA\x94 |0 + \xAA\x95 |0 + \xAA\x96 |0 + \xAA\x97 |0 + \xAA\x98 |0 + \xAA\x99 |0 + \xAA\x9A |0 + \xAA\x9B |0 + \xAA\x9C |0 + \xAA\x9D |0 + \xAA\x9E |0 + \xAA\x9F |0 + \xAA\xA0 |0 + \xAB\x41 |0 + \xAB\x42 |0 + \xAB\x43 |0 + \xAB\x44 |0 + \xC3\xB3 |0 + \xC3\xB4 |0 + \xAB\x45 |0 + \xAB\x46 |0 + \xC3\xB5 |0 + \xAB\x47 |0 + \xAB\x48 |0 + \xAB\x49 |0 + \xC3\xB6 |0 + \xAB\x4A |0 + \xAB\x4B |0 + \xAB\x4C |0 + \xAB\x4D |0 + \xAB\x4E |0 + \xAB\x4F |0 + \xAB\x50 |0 + \xC3\xB7 |0 + \xC3\xB8 |0 + \xAB\x51 |0 + \xC3\xB9 |0 + \xC3\xBA |0 + \xC3\xBB |0 + \xAB\x52 |0 + \xAB\x53 |0 + \xAB\x54 |0 + \xAB\x55 |0 + \xAB\x56 |0 + \xAB\x57 |0 + \xC3\xBC |0 + \xC3\xBD |0 + \xAB\x58 |0 + \xAB\x59 |0 + \xC3\xBE |0 + \xAB\x5A |0 + \xAB\x61 |0 + \xAB\x62 |0 + \xC3\xBF |0 + \xAB\x63 |0 + \xAB\x64 |0 + \xAB\x65 |0 + \xAB\x66 |0 + \xAB\x67 |0 + \xAB\x68 |0 + \xAB\x69 |0 + \xC3\xC0 |0 + \xC3\xC1 |0 + \xAB\x6A |0 + \xC3\xC2 |0 + \xAB\x6B |0 + \xC3\xC3 |0 + \xAB\x6C |0 + \xAB\x6D |0 + \xAB\x6E |0 + \xAB\x6F |0 + \xAB\x70 |0 + \xAB\x71 |0 + \xC3\xC4 |0 + \xAB\x72 |0 + \xAB\x73 |0 + \xAB\x74 |0 + \xC3\xC5 |0 + \xAB\x75 |0 + \xAB\x76 |0 + \xAB\x77 |0 + \xAB\x78 |0 + \xAB\x79 |0 + \xAB\x7A |0 + \xAB\x81 |0 + \xAB\x82 |0 + \xAB\x83 |0 + \xAB\x84 |0 + \xAB\x85 |0 + \xAB\x86 |0 + \xAB\x87 |0 + \xAB\x88 |0 + \xAB\x89 |0 + \xC3\xC6 |0 + \xAB\x8A |0 + \xAB\x8B |0 + \xAB\x8C |0 + \xAB\x8D |0 + \xAB\x8E |0 + \xAB\x8F |0 + \xAB\x90 |0 + \xC3\xC7 |0 + \xAB\x91 |0 + \xAB\x92 |0 + \xAB\x93 |0 + \xC3\xC8 |0 + \xAB\x94 |0 + \xAB\x95 |0 + \xAB\x96 |0 + \xAB\x97 |0 + \xAB\x98 |0 + \xAB\x99 |0 + \xAB\x9A |0 + \xAB\x9B |0 + \xAB\x9C |0 + \xAB\x9D |0 + \xAB\x9E |0 + \xAB\x9F |0 + \xAB\xA0 |0 + \xAC\x41 |0 + \xAC\x42 |0 + \xAC\x43 |0 + \xC3\xC9 |0 + \xAC\x44 |0 + \xAC\x45 |0 + \xAC\x46 |0 + \xAC\x47 |0 + \xAC\x48 |0 + \xAC\x49 |0 + \xC3\xCA |0 + \xC3\xCB |0 + \xAC\x4A |0 + \xAC\x4B |0 + \xC3\xCC |0 + \xAC\x4C |0 + \xAC\x4D |0 + \xAC\x4E |0 + \xC3\xCD |0 + \xAC\x4F |0 + \xAC\x50 |0 + \xAC\x51 |0 + \xAC\x52 |0 + \xAC\x53 |0 + \xAC\x54 |0 + \xAC\x55 |0 + \xC3\xCE |0 + \xC3\xCF |0 + \xAC\x56 |0 + \xC3\xD0 |0 + \xAC\x57 |0 + \xC3\xD1 |0 + \xAC\x58 |0 + \xAC\x59 |0 + \xAC\x5A |0 + \xAC\x61 |0 + \xAC\x62 |0 + \xAC\x63 |0 + \xC3\xD2 |0 + \xAC\x64 |0 + \xAC\x65 |0 + \xAC\x66 |0 + \xC3\xD3 |0 + \xAC\x67 |0 + \xAC\x68 |0 + \xAC\x69 |0 + \xC3\xD4 |0 + \xAC\x6A |0 + \xAC\x6B |0 + \xAC\x6C |0 + \xAC\x6D |0 + \xAC\x6E |0 + \xAC\x6F |0 + \xAC\x70 |0 + \xAC\x71 |0 + \xAC\x72 |0 + \xAC\x73 |0 + \xAC\x74 |0 + \xAC\x75 |0 + \xC3\xD5 |0 + \xAC\x76 |0 + \xAC\x77 |0 + \xAC\x78 |0 + \xAC\x79 |0 + \xAC\x7A |0 + \xAC\x81 |0 + \xAC\x82 |0 + \xAC\x83 |0 + \xAC\x84 |0 + \xAC\x85 |0 + \xAC\x86 |0 + \xAC\x87 |0 + \xAC\x88 |0 + \xAC\x89 |0 + \xAC\x8A |0 + \xAC\x8B |0 + \xAC\x8C |0 + \xAC\x8D |0 + \xAC\x8E |0 + \xAC\x8F |0 + \xAC\x90 |0 + \xAC\x91 |0 + \xAC\x92 |0 + \xAC\x93 |0 + \xAC\x94 |0 + \xAC\x95 |0 + \xAC\x96 |0 + \xAC\x97 |0 + \xAC\x98 |0 + \xAC\x99 |0 + \xAC\x9A |0 + \xAC\x9B |0 + \xAC\x9C |0 + \xAC\x9D |0 + \xC3\xD6 |0 + \xAC\x9E |0 + \xAC\x9F |0 + \xAC\xA0 |0 + \xC3\xD7 |0 + \xAD\x41 |0 + \xAD\x42 |0 + \xAD\x43 |0 + \xC3\xD8 |0 + \xAD\x44 |0 + \xAD\x45 |0 + \xAD\x46 |0 + \xAD\x47 |0 + \xAD\x48 |0 + \xAD\x49 |0 + \xAD\x4A |0 + \xC3\xD9 |0 + \xC3\xDA |0 + \xAD\x4B |0 + \xC3\xDB |0 + \xAD\x4C |0 + \xC3\xDC |0 + \xAD\x4D |0 + \xAD\x4E |0 + \xAD\x4F |0 + \xAD\x50 |0 + \xAD\x51 |0 + \xAD\x52 |0 + \xC3\xDD |0 + \xAD\x53 |0 + \xAD\x54 |0 + \xAD\x55 |0 + \xAD\x56 |0 + \xAD\x57 |0 + \xAD\x58 |0 + \xAD\x59 |0 + \xAD\x5A |0 + \xAD\x61 |0 + \xAD\x62 |0 + \xAD\x63 |0 + \xAD\x64 |0 + \xAD\x65 |0 + \xAD\x66 |0 + \xAD\x67 |0 + \xC3\xDE |0 + \xAD\x68 |0 + \xAD\x69 |0 + \xAD\x6A |0 + \xAD\x6B |0 + \xAD\x6C |0 + \xAD\x6D |0 + \xAD\x6E |0 + \xAD\x6F |0 + \xAD\x70 |0 + \xAD\x71 |0 + \xAD\x72 |0 + \xC3\xDF |0 + \xC3\xE0 |0 + \xAD\x73 |0 + \xAD\x74 |0 + \xC3\xE1 |0 + \xAD\x75 |0 + \xAD\x76 |0 + \xAD\x77 |0 + \xC3\xE2 |0 + \xAD\x78 |0 + \xAD\x79 |0 + \xAD\x7A |0 + \xAD\x81 |0 + \xAD\x82 |0 + \xAD\x83 |0 + \xAD\x84 |0 + \xC3\xE3 |0 + \xC3\xE4 |0 + \xAD\x85 |0 + \xC3\xE5 |0 + \xAD\x86 |0 + \xC3\xE6 |0 + \xAD\x87 |0 + \xAD\x88 |0 + \xAD\x89 |0 + \xAD\x8A |0 + \xAD\x8B |0 + \xAD\x8C |0 + \xC3\xE7 |0 + \xAD\x8D |0 + \xAD\x8E |0 + \xAD\x8F |0 + \xAD\x90 |0 + \xAD\x91 |0 + \xAD\x92 |0 + \xAD\x93 |0 + \xAD\x94 |0 + \xAD\x95 |0 + \xAD\x96 |0 + \xAD\x97 |0 + \xAD\x98 |0 + \xAD\x99 |0 + \xAD\x9A |0 + \xAD\x9B |0 + \xAD\x9C |0 + \xAD\x9D |0 + \xAD\x9E |0 + \xAD\x9F |0 + \xC3\xE8 |0 + \xAD\xA0 |0 + \xAE\x41 |0 + \xAE\x42 |0 + \xAE\x43 |0 + \xAE\x44 |0 + \xAE\x45 |0 + \xAE\x46 |0 + \xC3\xE9 |0 + \xAE\x47 |0 + \xAE\x48 |0 + \xAE\x49 |0 + \xC3\xEA |0 + \xAE\x4A |0 + \xAE\x4B |0 + \xAE\x4C |0 + \xAE\x4D |0 + \xAE\x4E |0 + \xAE\x4F |0 + \xAE\x50 |0 + \xAE\x51 |0 + \xAE\x52 |0 + \xAE\x53 |0 + \xAE\x54 |0 + \xAE\x55 |0 + \xAE\x56 |0 + \xAE\x57 |0 + \xAE\x58 |0 + \xAE\x59 |0 + \xAE\x5A |0 + \xAE\x61 |0 + \xAE\x62 |0 + \xAE\x63 |0 + \xAE\x64 |0 + \xAE\x65 |0 + \xAE\x66 |0 + \xC3\xEB |0 + \xAE\x67 |0 + \xAE\x68 |0 + \xAE\x69 |0 + \xC3\xEC |0 + \xAE\x6A |0 + \xAE\x6B |0 + \xAE\x6C |0 + \xC3\xED |0 + \xAE\x6D |0 + \xAE\x6E |0 + \xAE\x6F |0 + \xAE\x70 |0 + \xAE\x71 |0 + \xAE\x72 |0 + \xAE\x73 |0 + \xC3\xEE |0 + \xC3\xEF |0 + \xAE\x74 |0 + \xC3\xF0 |0 + \xAE\x75 |0 + \xC3\xF1 |0 + \xAE\x76 |0 + \xAE\x77 |0 + \xAE\x78 |0 + \xAE\x79 |0 + \xAE\x7A |0 + \xAE\x81 |0 + \xC3\xF2 |0 + \xAE\x82 |0 + \xAE\x83 |0 + \xAE\x84 |0 + \xC3\xF3 |0 + \xAE\x85 |0 + \xAE\x86 |0 + \xAE\x87 |0 + \xC3\xF4 |0 + \xAE\x88 |0 + \xAE\x89 |0 + \xAE\x8A |0 + \xAE\x8B |0 + \xAE\x8C |0 + \xAE\x8D |0 + \xAE\x8E |0 + \xC3\xF5 |0 + \xAE\x8F |0 + \xAE\x90 |0 + \xAE\x91 |0 + \xAE\x92 |0 + \xC3\xF6 |0 + \xAE\x93 |0 + \xAE\x94 |0 + \xAE\x95 |0 + \xAE\x96 |0 + \xAE\x97 |0 + \xAE\x98 |0 + \xC3\xF7 |0 + \xC3\xF8 |0 + \xAE\x99 |0 + \xAE\x9A |0 + \xC3\xF9 |0 + \xAE\x9B |0 + \xAE\x9C |0 + \xAE\x9D |0 + \xC3\xFA |0 + \xAE\x9E |0 + \xAE\x9F |0 + \xAE\xA0 |0 + \xAF\x41 |0 + \xAF\x42 |0 + \xAF\x43 |0 + \xAF\x44 |0 + \xC3\xFB |0 + \xC3\xFC |0 + \xAF\x45 |0 + \xC3\xFD |0 + \xAF\x46 |0 + \xC3\xFE |0 + \xAF\x47 |0 + \xAF\x48 |0 + \xAF\x49 |0 + \xAF\x4A |0 + \xAF\x4B |0 + \xAF\x4C |0 + \xAF\x4D |0 + \xAF\x4E |0 + \xAF\x4F |0 + \xAF\x50 |0 + \xAF\x51 |0 + \xAF\x52 |0 + \xAF\x53 |0 + \xAF\x54 |0 + \xAF\x55 |0 + \xAF\x56 |0 + \xAF\x57 |0 + \xAF\x58 |0 + \xAF\x59 |0 + \xAF\x5A |0 + \xAF\x61 |0 + \xAF\x62 |0 + \xAF\x63 |0 + \xAF\x64 |0 + \xAF\x65 |0 + \xAF\x66 |0 + \xAF\x67 |0 + \xAF\x68 |0 + \xAF\x69 |0 + \xAF\x6A |0 + \xAF\x6B |0 + \xAF\x6C |0 + \xAF\x6D |0 + \xAF\x6E |0 + \xC4\xA1 |0 + \xC4\xA2 |0 + \xAF\x6F |0 + \xAF\x70 |0 + \xC4\xA3 |0 + \xAF\x71 |0 + \xAF\x72 |0 + \xC4\xA4 |0 + \xC4\xA5 |0 + \xC4\xA6 |0 + \xAF\x73 |0 + \xAF\x74 |0 + \xAF\x75 |0 + \xAF\x76 |0 + \xAF\x77 |0 + \xAF\x78 |0 + \xC4\xA7 |0 + \xC4\xA8 |0 + \xAF\x79 |0 + \xC4\xA9 |0 + \xAF\x7A |0 + \xC4\xAA |0 + \xAF\x81 |0 + \xAF\x82 |0 + \xAF\x83 |0 + \xAF\x84 |0 + \xAF\x85 |0 + \xAF\x86 |0 + \xC4\xAB |0 + \xC4\xAC |0 + \xAF\x87 |0 + \xAF\x88 |0 + \xC4\xAD |0 + \xAF\x89 |0 + \xAF\x8A |0 + \xAF\x8B |0 + \xC4\xAE |0 + \xAF\x8C |0 + \xAF\x8D |0 + \xAF\x8E |0 + \xAF\x8F |0 + \xAF\x90 |0 + \xAF\x91 |0 + \xAF\x92 |0 + \xC4\xAF |0 + \xC4\xB0 |0 + \xAF\x93 |0 + \xC4\xB1 |0 + \xAF\x94 |0 + \xC4\xB2 |0 + \xAF\x95 |0 + \xAF\x96 |0 + \xAF\x97 |0 + \xAF\x98 |0 + \xAF\x99 |0 + \xAF\x9A |0 + \xC4\xB3 |0 + \xC4\xB4 |0 + \xAF\x9B |0 + \xAF\x9C |0 + \xC4\xB5 |0 + \xAF\x9D |0 + \xAF\x9E |0 + \xAF\x9F |0 + \xC4\xB6 |0 + \xAF\xA0 |0 + \xB0\x41 |0 + \xB0\x42 |0 + \xB0\x43 |0 + \xB0\x44 |0 + \xB0\x45 |0 + \xB0\x46 |0 + \xC4\xB7 |0 + \xC4\xB8 |0 + \xB0\x47 |0 + \xC4\xB9 |0 + \xC4\xBA |0 + \xC4\xBB |0 + \xB0\x48 |0 + \xB0\x49 |0 + \xB0\x4A |0 + \xB0\x4B |0 + \xB0\x4C |0 + \xB0\x4D |0 + \xC4\xBC |0 + \xC4\xBD |0 + \xB0\x4E |0 + \xB0\x4F |0 + \xB0\x50 |0 + \xB0\x51 |0 + \xB0\x52 |0 + \xB0\x53 |0 + \xB0\x54 |0 + \xB0\x55 |0 + \xB0\x56 |0 + \xB0\x57 |0 + \xB0\x58 |0 + \xB0\x59 |0 + \xB0\x5A |0 + \xB0\x61 |0 + \xB0\x62 |0 + \xB0\x63 |0 + \xB0\x64 |0 + \xB0\x65 |0 + \xB0\x66 |0 + \xC4\xBE |0 + \xB0\x67 |0 + \xB0\x68 |0 + \xB0\x69 |0 + \xB0\x6A |0 + \xB0\x6B |0 + \xB0\x6C |0 + \xB0\x6D |0 + \xB0\x6E |0 + \xB0\x6F |0 + \xB0\x70 |0 + \xB0\x71 |0 + \xB0\x72 |0 + \xB0\x73 |0 + \xB0\x74 |0 + \xB0\x75 |0 + \xB0\x76 |0 + \xB0\x77 |0 + \xB0\x78 |0 + \xB0\x79 |0 + \xB0\x7A |0 + \xB0\x81 |0 + \xB0\x82 |0 + \xB0\x83 |0 + \xB0\x84 |0 + \xB0\x85 |0 + \xB0\x86 |0 + \xB0\x87 |0 + \xB0\x88 |0 + \xB0\x89 |0 + \xB0\x8A |0 + \xB0\x8B |0 + \xB0\x8C |0 + \xB0\x8D |0 + \xB0\x8E |0 + \xC4\xBF |0 + \xC4\xC0 |0 + \xB0\x8F |0 + \xB0\x90 |0 + \xC4\xC1 |0 + \xB0\x91 |0 + \xB0\x92 |0 + \xC4\xC2 |0 + \xC4\xC3 |0 + \xB0\x93 |0 + \xB0\x94 |0 + \xB0\x95 |0 + \xB0\x96 |0 + \xB0\x97 |0 + \xB0\x98 |0 + \xB0\x99 |0 + \xC4\xC4 |0 + \xC4\xC5 |0 + \xB0\x9A |0 + \xC4\xC6 |0 + \xC4\xC7 |0 + \xC4\xC8 |0 + \xB0\x9B |0 + \xB0\x9C |0 + \xB0\x9D |0 + \xB0\x9E |0 + \xB0\x9F |0 + \xB0\xA0 |0 + \xC4\xC9 |0 + \xC4\xCA |0 + \xB1\x41 |0 + \xB1\x42 |0 + \xC4\xCB |0 + \xB1\x43 |0 + \xB1\x44 |0 + \xB1\x45 |0 + \xC4\xCC |0 + \xB1\x46 |0 + \xB1\x47 |0 + \xB1\x48 |0 + \xB1\x49 |0 + \xB1\x4A |0 + \xB1\x4B |0 + \xB1\x4C |0 + \xC4\xCD |0 + \xC4\xCE |0 + \xB1\x4D |0 + \xC4\xCF |0 + \xB1\x4E |0 + \xC4\xD0 |0 + \xB1\x4F |0 + \xB1\x50 |0 + \xB1\x51 |0 + \xB1\x52 |0 + \xB1\x53 |0 + \xB1\x54 |0 + \xC4\xD1 |0 + \xB1\x55 |0 + \xB1\x56 |0 + \xB1\x57 |0 + \xC4\xD2 |0 + \xB1\x58 |0 + \xB1\x59 |0 + \xB1\x5A |0 + \xC4\xD3 |0 + \xB1\x61 |0 + \xB1\x62 |0 + \xB1\x63 |0 + \xB1\x64 |0 + \xB1\x65 |0 + \xB1\x66 |0 + \xB1\x67 |0 + \xC4\xD4 |0 + \xC4\xD5 |0 + \xB1\x68 |0 + \xC4\xD6 |0 + \xC4\xD7 |0 + \xC4\xD8 |0 + \xB1\x69 |0 + \xB1\x6A |0 + \xB1\x6B |0 + \xB1\x6C |0 + \xB1\x6D |0 + \xB1\x6E |0 + \xC4\xD9 |0 + \xB1\x6F |0 + \xB1\x70 |0 + \xB1\x71 |0 + \xB1\x72 |0 + \xB1\x73 |0 + \xB1\x74 |0 + \xB1\x75 |0 + \xB1\x76 |0 + \xB1\x77 |0 + \xB1\x78 |0 + \xB1\x79 |0 + \xB1\x7A |0 + \xB1\x81 |0 + \xB1\x82 |0 + \xB1\x83 |0 + \xB1\x84 |0 + \xB1\x85 |0 + \xB1\x86 |0 + \xB1\x87 |0 + \xB1\x88 |0 + \xB1\x89 |0 + \xB1\x8A |0 + \xB1\x8B |0 + \xB1\x8C |0 + \xB1\x8D |0 + \xB1\x8E |0 + \xB1\x8F |0 + \xC4\xDA |0 + \xC4\xDB |0 + \xB1\x90 |0 + \xB1\x91 |0 + \xC4\xDC |0 + \xB1\x92 |0 + \xB1\x93 |0 + \xB1\x94 |0 + \xC4\xDD |0 + \xB1\x95 |0 + \xB1\x96 |0 + \xB1\x97 |0 + \xB1\x98 |0 + \xB1\x99 |0 + \xB1\x9A |0 + \xB1\x9B |0 + \xC4\xDE |0 + \xC4\xDF |0 + \xB1\x9C |0 + \xC4\xE0 |0 + \xB1\x9D |0 + \xC4\xE1 |0 + \xB1\x9E |0 + \xB1\x9F |0 + \xB1\xA0 |0 + \xB2\x41 |0 + \xB2\x42 |0 + \xB2\x43 |0 + \xC4\xE2 |0 + \xC4\xE3 |0 + \xB2\x44 |0 + \xB2\x45 |0 + \xC4\xE4 |0 + \xB2\x46 |0 + \xB2\x47 |0 + \xB2\x48 |0 + \xC4\xE5 |0 + \xB2\x49 |0 + \xB2\x4A |0 + \xB2\x4B |0 + \xB2\x4C |0 + \xB2\x4D |0 + \xB2\x4E |0 + \xB2\x4F |0 + \xC4\xE6 |0 + \xB2\x50 |0 + \xB2\x51 |0 + \xB2\x52 |0 + \xB2\x53 |0 + \xC4\xE7 |0 + \xB2\x54 |0 + \xB2\x55 |0 + \xB2\x56 |0 + \xB2\x57 |0 + \xB2\x58 |0 + \xB2\x59 |0 + \xC4\xE8 |0 + \xB2\x5A |0 + \xB2\x61 |0 + \xB2\x62 |0 + \xB2\x63 |0 + \xB2\x64 |0 + \xB2\x65 |0 + \xB2\x66 |0 + \xB2\x67 |0 + \xB2\x68 |0 + \xB2\x69 |0 + \xB2\x6A |0 + \xB2\x6B |0 + \xB2\x6C |0 + \xB2\x6D |0 + \xB2\x6E |0 + \xB2\x6F |0 + \xB2\x70 |0 + \xB2\x71 |0 + \xB2\x72 |0 + \xB2\x73 |0 + \xC4\xE9 |0 + \xB2\x74 |0 + \xB2\x75 |0 + \xB2\x76 |0 + \xB2\x77 |0 + \xB2\x78 |0 + \xB2\x79 |0 + \xC4\xEA |0 + \xB2\x7A |0 + \xB2\x81 |0 + \xB2\x82 |0 + \xB2\x83 |0 + \xB2\x84 |0 + \xB2\x85 |0 + \xB2\x86 |0 + \xC4\xEB |0 + \xB2\x87 |0 + \xB2\x88 |0 + \xB2\x89 |0 + \xB2\x8A |0 + \xB2\x8B |0 + \xB2\x8C |0 + \xB2\x8D |0 + \xB2\x8E |0 + \xB2\x8F |0 + \xB2\x90 |0 + \xB2\x91 |0 + \xB2\x92 |0 + \xB2\x93 |0 + \xB2\x94 |0 + \xB2\x95 |0 + \xB2\x96 |0 + \xB2\x97 |0 + \xB2\x98 |0 + \xB2\x99 |0 + \xC4\xEC |0 + \xB2\x9A |0 + \xB2\x9B |0 + \xB2\x9C |0 + \xB2\x9D |0 + \xB2\x9E |0 + \xB2\x9F |0 + \xB2\xA0 |0 + \xB3\x41 |0 + \xB3\x42 |0 + \xB3\x43 |0 + \xB3\x44 |0 + \xB3\x45 |0 + \xB3\x46 |0 + \xB3\x47 |0 + \xB3\x48 |0 + \xB3\x49 |0 + \xB3\x4A |0 + \xB3\x4B |0 + \xB3\x4C |0 + \xB3\x4D |0 + \xB3\x4E |0 + \xB3\x4F |0 + \xB3\x50 |0 + \xB3\x51 |0 + \xB3\x52 |0 + \xB3\x53 |0 + \xB3\x54 |0 + \xC4\xED |0 + \xC4\xEE |0 + \xB3\x55 |0 + \xB3\x56 |0 + \xC4\xEF |0 + \xB3\x57 |0 + \xB3\x58 |0 + \xB3\x59 |0 + \xC4\xF0 |0 + \xB3\x5A |0 + \xB3\x61 |0 + \xB3\x62 |0 + \xB3\x63 |0 + \xB3\x64 |0 + \xB3\x65 |0 + \xB3\x66 |0 + \xC4\xF1 |0 + \xC4\xF2 |0 + \xB3\x67 |0 + \xC4\xF3 |0 + \xB3\x68 |0 + \xC4\xF4 |0 + \xB3\x69 |0 + \xB3\x6A |0 + \xB3\x6B |0 + \xB3\x6C |0 + \xB3\x6D |0 + \xB3\x6E |0 + \xC4\xF5 |0 + \xB3\x6F |0 + \xB3\x70 |0 + \xB3\x71 |0 + \xC4\xF6 |0 + \xB3\x72 |0 + \xB3\x73 |0 + \xB3\x74 |0 + \xC4\xF7 |0 + \xB3\x75 |0 + \xB3\x76 |0 + \xB3\x77 |0 + \xB3\x78 |0 + \xB3\x79 |0 + \xB3\x7A |0 + \xB3\x81 |0 + \xB3\x82 |0 + \xB3\x83 |0 + \xB3\x84 |0 + \xB3\x85 |0 + \xB3\x86 |0 + \xC4\xF8 |0 + \xB3\x87 |0 + \xB3\x88 |0 + \xB3\x89 |0 + \xB3\x8A |0 + \xB3\x8B |0 + \xB3\x8C |0 + \xC4\xF9 |0 + \xB3\x8D |0 + \xB3\x8E |0 + \xB3\x8F |0 + \xB3\x90 |0 + \xB3\x91 |0 + \xB3\x92 |0 + \xB3\x93 |0 + \xB3\x94 |0 + \xB3\x95 |0 + \xB3\x96 |0 + \xB3\x97 |0 + \xB3\x98 |0 + \xB3\x99 |0 + \xB3\x9A |0 + \xB3\x9B |0 + \xB3\x9C |0 + \xB3\x9D |0 + \xB3\x9E |0 + \xB3\x9F |0 + \xB3\xA0 |0 + \xC4\xFA |0 + \xB4\x41 |0 + \xB4\x42 |0 + \xB4\x43 |0 + \xB4\x44 |0 + \xB4\x45 |0 + \xB4\x46 |0 + \xC4\xFB |0 + \xC4\xFC |0 + \xB4\x47 |0 + \xB4\x48 |0 + \xC4\xFD |0 + \xB4\x49 |0 + \xB4\x4A |0 + \xB4\x4B |0 + \xC4\xFE |0 + \xB4\x4C |0 + \xB4\x4D |0 + \xB4\x4E |0 + \xB4\x4F |0 + \xB4\x50 |0 + \xB4\x51 |0 + \xB4\x52 |0 + \xC5\xA1 |0 + \xC5\xA2 |0 + \xB4\x53 |0 + \xC5\xA3 |0 + \xB4\x54 |0 + \xC5\xA4 |0 + \xB4\x55 |0 + \xB4\x56 |0 + \xB4\x57 |0 + \xB4\x58 |0 + \xB4\x59 |0 + \xB4\x5A |0 + \xC5\xA5 |0 + \xB4\x61 |0 + \xB4\x62 |0 + \xB4\x63 |0 + \xC5\xA6 |0 + \xB4\x64 |0 + \xB4\x65 |0 + \xB4\x66 |0 + \xC5\xA7 |0 + \xB4\x67 |0 + \xB4\x68 |0 + \xB4\x69 |0 + \xB4\x6A |0 + \xB4\x6B |0 + \xB4\x6C |0 + \xB4\x6D |0 + \xC5\xA8 |0 + \xB4\x6E |0 + \xB4\x6F |0 + \xB4\x70 |0 + \xB4\x71 |0 + \xB4\x72 |0 + \xB4\x73 |0 + \xB4\x74 |0 + \xB4\x75 |0 + \xB4\x76 |0 + \xB4\x77 |0 + \xB4\x78 |0 + \xC5\xA9 |0 + \xC5\xAA |0 + \xB4\x79 |0 + \xB4\x7A |0 + \xC5\xAB |0 + \xB4\x81 |0 + \xB4\x82 |0 + \xB4\x83 |0 + \xC5\xAC |0 + \xB4\x84 |0 + \xB4\x85 |0 + \xB4\x86 |0 + \xB4\x87 |0 + \xB4\x88 |0 + \xB4\x89 |0 + \xB4\x8A |0 + \xC5\xAD |0 + \xC5\xAE |0 + \xB4\x8B |0 + \xB4\x8C |0 + \xB4\x8D |0 + \xC5\xAF |0 + \xB4\x8E |0 + \xB4\x8F |0 + \xB4\x90 |0 + \xB4\x91 |0 + \xB4\x92 |0 + \xB4\x93 |0 + \xB4\x94 |0 + \xB4\x95 |0 + \xB4\x96 |0 + \xB4\x97 |0 + \xB4\x98 |0 + \xB4\x99 |0 + \xB4\x9A |0 + \xB4\x9B |0 + \xB4\x9C |0 + \xB4\x9D |0 + \xB4\x9E |0 + \xB4\x9F |0 + \xB4\xA0 |0 + \xB5\x41 |0 + \xB5\x42 |0 + \xB5\x43 |0 + \xB5\x44 |0 + \xB5\x45 |0 + \xB5\x46 |0 + \xB5\x47 |0 + \xB5\x48 |0 + \xB5\x49 |0 + \xB5\x4A |0 + \xB5\x4B |0 + \xB5\x4C |0 + \xB5\x4D |0 + \xB5\x4E |0 + \xB5\x4F |0 + \xC5\xB0 |0 + \xC5\xB1 |0 + \xB5\x50 |0 + \xB5\x51 |0 + \xC5\xB2 |0 + \xB5\x52 |0 + \xB5\x53 |0 + \xB5\x54 |0 + \xC5\xB3 |0 + \xB5\x55 |0 + \xB5\x56 |0 + \xB5\x57 |0 + \xB5\x58 |0 + \xB5\x59 |0 + \xB5\x5A |0 + \xB5\x61 |0 + \xC5\xB4 |0 + \xC5\xB5 |0 + \xB5\x62 |0 + \xC5\xB6 |0 + \xB5\x63 |0 + \xC5\xB7 |0 + \xB5\x64 |0 + \xB5\x65 |0 + \xB5\x66 |0 + \xB5\x67 |0 + \xB5\x68 |0 + \xB5\x69 |0 + \xC5\xB8 |0 + \xC5\xB9 |0 + \xB5\x6A |0 + \xB5\x6B |0 + \xC5\xBA |0 + \xB5\x6C |0 + \xB5\x6D |0 + \xB5\x6E |0 + \xC5\xBB |0 + \xC5\xBC |0 + \xB5\x6F |0 + \xB5\x70 |0 + \xB5\x71 |0 + \xB5\x72 |0 + \xB5\x73 |0 + \xB5\x74 |0 + \xC5\xBD |0 + \xC5\xBE |0 + \xB5\x75 |0 + \xC5\xBF |0 + \xC5\xC0 |0 + \xC5\xC1 |0 + \xB5\x76 |0 + \xB5\x77 |0 + \xB5\x78 |0 + \xB5\x79 |0 + \xB5\x7A |0 + \xB5\x81 |0 + \xC5\xC2 |0 + \xC5\xC3 |0 + \xB5\x82 |0 + \xB5\x83 |0 + \xC5\xC4 |0 + \xB5\x84 |0 + \xB5\x85 |0 + \xB5\x86 |0 + \xC5\xC5 |0 + \xB5\x87 |0 + \xB5\x88 |0 + \xB5\x89 |0 + \xB5\x8A |0 + \xB5\x8B |0 + \xB5\x8C |0 + \xB5\x8D |0 + \xC5\xC6 |0 + \xC5\xC7 |0 + \xB5\x8E |0 + \xC5\xC8 |0 + \xC5\xC9 |0 + \xC5\xCA |0 + \xB5\x8F |0 + \xB5\x90 |0 + \xB5\x91 |0 + \xB5\x92 |0 + \xB5\x93 |0 + \xB5\x94 |0 + \xC5\xCB |0 + \xB5\x95 |0 + \xB5\x96 |0 + \xB5\x97 |0 + \xB5\x98 |0 + \xB5\x99 |0 + \xB5\x9A |0 + \xB5\x9B |0 + \xB5\x9C |0 + \xB5\x9D |0 + \xB5\x9E |0 + \xB5\x9F |0 + \xB5\xA0 |0 + \xB6\x41 |0 + \xB6\x42 |0 + \xB6\x43 |0 + \xB6\x44 |0 + \xB6\x45 |0 + \xB6\x46 |0 + \xB6\x47 |0 + \xB6\x48 |0 + \xC5\xCC |0 + \xB6\x49 |0 + \xB6\x4A |0 + \xB6\x4B |0 + \xB6\x4C |0 + \xB6\x4D |0 + \xB6\x4E |0 + \xB6\x4F |0 + \xB6\x50 |0 + \xB6\x51 |0 + \xB6\x52 |0 + \xB6\x53 |0 + \xB6\x54 |0 + \xB6\x55 |0 + \xB6\x56 |0 + \xB6\x57 |0 + \xB6\x58 |0 + \xB6\x59 |0 + \xB6\x5A |0 + \xB6\x61 |0 + \xB6\x62 |0 + \xB6\x63 |0 + \xB6\x64 |0 + \xB6\x65 |0 + \xB6\x66 |0 + \xB6\x67 |0 + \xB6\x68 |0 + \xB6\x69 |0 + \xB6\x6A |0 + \xB6\x6B |0 + \xB6\x6C |0 + \xB6\x6D |0 + \xB6\x6E |0 + \xB6\x6F |0 + \xB6\x70 |0 + \xC5\xCD |0 + \xC5\xCE |0 + \xB6\x71 |0 + \xB6\x72 |0 + \xC5\xCF |0 + \xB6\x73 |0 + \xB6\x74 |0 + \xB6\x75 |0 + \xC5\xD0 |0 + \xB6\x76 |0 + \xC5\xD1 |0 + \xB6\x77 |0 + \xB6\x78 |0 + \xB6\x79 |0 + \xB6\x7A |0 + \xB6\x81 |0 + \xC5\xD2 |0 + \xC5\xD3 |0 + \xB6\x82 |0 + \xC5\xD4 |0 + \xC5\xD5 |0 + \xC5\xD6 |0 + \xB6\x83 |0 + \xB6\x84 |0 + \xB6\x85 |0 + \xB6\x86 |0 + \xB6\x87 |0 + \xB6\x88 |0 + \xC5\xD7 |0 + \xC5\xD8 |0 + \xB6\x89 |0 + \xB6\x8A |0 + \xC5\xD9 |0 + \xB6\x8B |0 + \xB6\x8C |0 + \xB6\x8D |0 + \xC5\xDA |0 + \xB6\x8E |0 + \xB6\x8F |0 + \xB6\x90 |0 + \xB6\x91 |0 + \xB6\x92 |0 + \xB6\x93 |0 + \xB6\x94 |0 + \xC5\xDB |0 + \xC5\xDC |0 + \xB6\x95 |0 + \xC5\xDD |0 + \xB6\x96 |0 + \xC5\xDE |0 + \xB6\x97 |0 + \xB6\x98 |0 + \xB6\x99 |0 + \xB6\x9A |0 + \xB6\x9B |0 + \xB6\x9C |0 + \xC5\xDF |0 + \xB6\x9D |0 + \xB6\x9E |0 + \xB6\x9F |0 + \xC5\xE0 |0 + \xB6\xA0 |0 + \xB7\x41 |0 + \xB7\x42 |0 + \xB7\x43 |0 + \xB7\x44 |0 + \xB7\x45 |0 + \xB7\x46 |0 + \xB7\x47 |0 + \xB7\x48 |0 + \xB7\x49 |0 + \xB7\x4A |0 + \xB7\x4B |0 + \xB7\x4C |0 + \xB7\x4D |0 + \xB7\x4E |0 + \xC5\xE1 |0 + \xB7\x4F |0 + \xB7\x50 |0 + \xB7\x51 |0 + \xB7\x52 |0 + \xB7\x53 |0 + \xB7\x54 |0 + \xB7\x55 |0 + \xC5\xE2 |0 + \xB7\x56 |0 + \xB7\x57 |0 + \xB7\x58 |0 + \xC5\xE3 |0 + \xB7\x59 |0 + \xB7\x5A |0 + \xB7\x61 |0 + \xB7\x62 |0 + \xB7\x63 |0 + \xB7\x64 |0 + \xB7\x65 |0 + \xB7\x66 |0 + \xB7\x67 |0 + \xB7\x68 |0 + \xB7\x69 |0 + \xB7\x6A |0 + \xB7\x6B |0 + \xB7\x6C |0 + \xB7\x6D |0 + \xB7\x6E |0 + \xB7\x6F |0 + \xB7\x70 |0 + \xB7\x71 |0 + \xB7\x72 |0 + \xB7\x73 |0 + \xB7\x74 |0 + \xB7\x75 |0 + \xC5\xE4 |0 + \xC5\xE5 |0 + \xB7\x76 |0 + \xB7\x77 |0 + \xC5\xE6 |0 + \xB7\x78 |0 + \xB7\x79 |0 + \xB7\x7A |0 + \xC5\xE7 |0 + \xB7\x81 |0 + \xB7\x82 |0 + \xB7\x83 |0 + \xB7\x84 |0 + \xB7\x85 |0 + \xB7\x86 |0 + \xB7\x87 |0 + \xC5\xE8 |0 + \xC5\xE9 |0 + \xB7\x88 |0 + \xC5\xEA |0 + \xB7\x89 |0 + \xC5\xEB |0 + \xB7\x8A |0 + \xB7\x8B |0 + \xB7\x8C |0 + \xB7\x8D |0 + \xC5\xEC |0 + \xB7\x8E |0 + \xC5\xED |0 + \xB7\x8F |0 + \xB7\x90 |0 + \xB7\x91 |0 + \xC5\xEE |0 + \xB7\x92 |0 + \xB7\x93 |0 + \xB7\x94 |0 + \xB7\x95 |0 + \xB7\x96 |0 + \xB7\x97 |0 + \xB7\x98 |0 + \xB7\x99 |0 + \xB7\x9A |0 + \xB7\x9B |0 + \xB7\x9C |0 + \xB7\x9D |0 + \xB7\x9E |0 + \xB7\x9F |0 + \xB7\xA0 |0 + \xB8\x41 |0 + \xB8\x42 |0 + \xB8\x43 |0 + \xB8\x44 |0 + \xB8\x45 |0 + \xB8\x46 |0 + \xB8\x47 |0 + \xB8\x48 |0 + \xC5\xEF |0 + \xB8\x49 |0 + \xB8\x4A |0 + \xB8\x4B |0 + \xB8\x4C |0 + \xB8\x4D |0 + \xB8\x4E |0 + \xB8\x4F |0 + \xB8\x50 |0 + \xB8\x51 |0 + \xB8\x52 |0 + \xB8\x53 |0 + \xB8\x54 |0 + \xB8\x55 |0 + \xB8\x56 |0 + \xB8\x57 |0 + \xB8\x58 |0 + \xB8\x59 |0 + \xB8\x5A |0 + \xB8\x61 |0 + \xB8\x62 |0 + \xB8\x63 |0 + \xB8\x64 |0 + \xB8\x65 |0 + \xB8\x66 |0 + \xB8\x67 |0 + \xB8\x68 |0 + \xB8\x69 |0 + \xC5\xF0 |0 + \xB8\x6A |0 + \xB8\x6B |0 + \xB8\x6C |0 + \xC5\xF1 |0 + \xB8\x6D |0 + \xB8\x6E |0 + \xB8\x6F |0 + \xB8\x70 |0 + \xB8\x71 |0 + \xB8\x72 |0 + \xB8\x73 |0 + \xB8\x74 |0 + \xB8\x75 |0 + \xB8\x76 |0 + \xB8\x77 |0 + \xB8\x78 |0 + \xB8\x79 |0 + \xB8\x7A |0 + \xC5\xF2 |0 + \xB8\x81 |0 + \xC5\xF3 |0 + \xB8\x82 |0 + \xB8\x83 |0 + \xB8\x84 |0 + \xB8\x85 |0 + \xB8\x86 |0 + \xB8\x87 |0 + \xC5\xF4 |0 + \xB8\x88 |0 + \xB8\x89 |0 + \xB8\x8A |0 + \xB8\x8B |0 + \xB8\x8C |0 + \xB8\x8D |0 + \xB8\x8E |0 + \xB8\x8F |0 + \xB8\x90 |0 + \xB8\x91 |0 + \xB8\x92 |0 + \xB8\x93 |0 + \xB8\x94 |0 + \xB8\x95 |0 + \xB8\x96 |0 + \xB8\x97 |0 + \xB8\x98 |0 + \xB8\x99 |0 + \xB8\x9A |0 + \xB8\x9B |0 + \xB8\x9C |0 + \xB8\x9D |0 + \xB8\x9E |0 + \xB8\x9F |0 + \xB8\xA0 |0 + \xB9\x41 |0 + \xB9\x42 |0 + \xC5\xF5 |0 + \xC5\xF6 |0 + \xB9\x43 |0 + \xB9\x44 |0 + \xC5\xF7 |0 + \xB9\x45 |0 + \xB9\x46 |0 + \xB9\x47 |0 + \xC5\xF8 |0 + \xB9\x48 |0 + \xB9\x49 |0 + \xB9\x4A |0 + \xB9\x4B |0 + \xB9\x4C |0 + \xB9\x4D |0 + \xB9\x4E |0 + \xC5\xF9 |0 + \xC5\xFA |0 + \xB9\x4F |0 + \xC5\xFB |0 + \xB9\x50 |0 + \xC5\xFC |0 + \xB9\x51 |0 + \xB9\x52 |0 + \xB9\x53 |0 + \xB9\x54 |0 + \xB9\x55 |0 + \xB9\x56 |0 + \xC5\xFD |0 + \xB9\x57 |0 + \xB9\x58 |0 + \xB9\x59 |0 + \xB9\x5A |0 + \xB9\x61 |0 + \xB9\x62 |0 + \xB9\x63 |0 + \xB9\x64 |0 + \xB9\x65 |0 + \xB9\x66 |0 + \xB9\x67 |0 + \xB9\x68 |0 + \xB9\x69 |0 + \xB9\x6A |0 + \xB9\x6B |0 + \xB9\x6C |0 + \xB9\x6D |0 + \xB9\x6E |0 + \xB9\x6F |0 + \xC5\xFE |0 + \xB9\x70 |0 + \xB9\x71 |0 + \xB9\x72 |0 + \xB9\x73 |0 + \xB9\x74 |0 + \xB9\x75 |0 + \xB9\x76 |0 + \xC6\xA1 |0 + \xB9\x77 |0 + \xB9\x78 |0 + \xB9\x79 |0 + \xB9\x7A |0 + \xB9\x81 |0 + \xB9\x82 |0 + \xB9\x83 |0 + \xB9\x84 |0 + \xB9\x85 |0 + \xB9\x86 |0 + \xB9\x87 |0 + \xB9\x88 |0 + \xB9\x89 |0 + \xB9\x8A |0 + \xB9\x8B |0 + \xB9\x8C |0 + \xB9\x8D |0 + \xB9\x8E |0 + \xB9\x8F |0 + \xB9\x90 |0 + \xB9\x91 |0 + \xB9\x92 |0 + \xB9\x93 |0 + \xB9\x94 |0 + \xB9\x95 |0 + \xB9\x96 |0 + \xB9\x97 |0 + \xC6\xA2 |0 + \xC6\xA3 |0 + \xB9\x98 |0 + \xB9\x99 |0 + \xC6\xA4 |0 + \xB9\x9A |0 + \xB9\x9B |0 + \xB9\x9C |0 + \xC6\xA5 |0 + \xB9\x9D |0 + \xB9\x9E |0 + \xB9\x9F |0 + \xB9\xA0 |0 + \xBA\x41 |0 + \xBA\x42 |0 + \xBA\x43 |0 + \xC6\xA6 |0 + \xC6\xA7 |0 + \xBA\x44 |0 + \xBA\x45 |0 + \xBA\x46 |0 + \xC6\xA8 |0 + \xBA\x47 |0 + \xBA\x48 |0 + \xBA\x49 |0 + \xBA\x4A |0 + \xBA\x4B |0 + \xBA\x4C |0 + \xC6\xA9 |0 + \xBA\x4D |0 + \xBA\x4E |0 + \xBA\x4F |0 + \xC6\xAA |0 + \xBA\x50 |0 + \xBA\x51 |0 + \xBA\x52 |0 + \xC6\xAB |0 + \xBA\x53 |0 + \xBA\x54 |0 + \xBA\x55 |0 + \xBA\x56 |0 + \xBA\x57 |0 + \xBA\x58 |0 + \xBA\x59 |0 + \xC6\xAC |0 + \xBA\x5A |0 + \xBA\x61 |0 + \xBA\x62 |0 + \xBA\x63 |0 + \xC6\xAD |0 + \xBA\x64 |0 + \xBA\x65 |0 + \xBA\x66 |0 + \xBA\x67 |0 + \xBA\x68 |0 + \xBA\x69 |0 + \xC6\xAE |0 + \xC6\xAF |0 + \xBA\x6A |0 + \xBA\x6B |0 + \xC6\xB0 |0 + \xBA\x6C |0 + \xBA\x6D |0 + \xC6\xB1 |0 + \xC6\xB2 |0 + \xBA\x6E |0 + \xC6\xB3 |0 + \xBA\x6F |0 + \xBA\x70 |0 + \xBA\x71 |0 + \xBA\x72 |0 + \xBA\x73 |0 + \xC6\xB4 |0 + \xC6\xB5 |0 + \xBA\x74 |0 + \xC6\xB6 |0 + \xBA\x75 |0 + \xBA\x76 |0 + \xBA\x77 |0 + \xBA\x78 |0 + \xBA\x79 |0 + \xBA\x7A |0 + \xBA\x81 |0 + \xBA\x82 |0 + \xC6\xB7 |0 + \xBA\x83 |0 + \xBA\x84 |0 + \xBA\x85 |0 + \xC6\xB8 |0 + \xBA\x86 |0 + \xBA\x87 |0 + \xBA\x88 |0 + \xC6\xB9 |0 + \xBA\x89 |0 + \xBA\x8A |0 + \xBA\x8B |0 + \xBA\x8C |0 + \xBA\x8D |0 + \xBA\x8E |0 + \xBA\x8F |0 + \xC6\xBA |0 + \xC6\xBB |0 + \xBA\x90 |0 + \xBA\x91 |0 + \xBA\x92 |0 + \xBA\x93 |0 + \xBA\x94 |0 + \xBA\x95 |0 + \xBA\x96 |0 + \xBA\x97 |0 + \xBA\x98 |0 + \xBA\x99 |0 + \xC6\xBC |0 + \xC6\xBD |0 + \xBA\x9A |0 + \xBA\x9B |0 + \xC6\xBE |0 + \xBA\x9C |0 + \xBA\x9D |0 + \xBA\x9E |0 + \xC6\xBF |0 + \xBA\x9F |0 + \xBA\xA0 |0 + \xBB\x41 |0 + \xBB\x42 |0 + \xBB\x43 |0 + \xBB\x44 |0 + \xBB\x45 |0 + \xC6\xC0 |0 + \xC6\xC1 |0 + \xBB\x46 |0 + \xC6\xC2 |0 + \xBB\x47 |0 + \xC6\xC3 |0 + \xBB\x48 |0 + \xBB\x49 |0 + \xBB\x4A |0 + \xBB\x4B |0 + \xBB\x4C |0 + \xBB\x4D |0 + \xC6\xC4 |0 + \xC6\xC5 |0 + \xC6\xC6 |0 + \xBB\x4E |0 + \xC6\xC7 |0 + \xBB\x4F |0 + \xBB\x50 |0 + \xBB\x51 |0 + \xC6\xC8 |0 + \xBB\x52 |0 + \xC6\xC9 |0 + \xBB\x53 |0 + \xBB\x54 |0 + \xBB\x55 |0 + \xBB\x56 |0 + \xBB\x57 |0 + \xC6\xCA |0 + \xC6\xCB |0 + \xBB\x58 |0 + \xC6\xCC |0 + \xC6\xCD |0 + \xC6\xCE |0 + \xBB\x59 |0 + \xBB\x5A |0 + \xBB\x61 |0 + \xC6\xCF |0 + \xBB\x62 |0 + \xBB\x63 |0 + \xC6\xD0 |0 + \xC6\xD1 |0 + \xBB\x64 |0 + \xBB\x65 |0 + \xC6\xD2 |0 + \xBB\x66 |0 + \xBB\x67 |0 + \xBB\x68 |0 + \xC6\xD3 |0 + \xBB\x69 |0 + \xBB\x6A |0 + \xBB\x6B |0 + \xBB\x6C |0 + \xBB\x6D |0 + \xBB\x6E |0 + \xBB\x6F |0 + \xC6\xD4 |0 + \xC6\xD5 |0 + \xBB\x70 |0 + \xC6\xD6 |0 + \xC6\xD7 |0 + \xC6\xD8 |0 + \xBB\x71 |0 + \xBB\x72 |0 + \xBB\x73 |0 + \xBB\x74 |0 + \xBB\x75 |0 + \xBB\x76 |0 + \xC6\xD9 |0 + \xC6\xDA |0 + \xBB\x77 |0 + \xBB\x78 |0 + \xBB\x79 |0 + \xBB\x7A |0 + \xBB\x81 |0 + \xBB\x82 |0 + \xBB\x83 |0 + \xBB\x84 |0 + \xBB\x85 |0 + \xBB\x86 |0 + \xBB\x87 |0 + \xBB\x88 |0 + \xBB\x89 |0 + \xBB\x8A |0 + \xBB\x8B |0 + \xBB\x8C |0 + \xBB\x8D |0 + \xBB\x8E |0 + \xBB\x8F |0 + \xBB\x90 |0 + \xBB\x91 |0 + \xBB\x92 |0 + \xBB\x93 |0 + \xBB\x94 |0 + \xBB\x95 |0 + \xBB\x96 |0 + \xBB\x97 |0 + \xBB\x98 |0 + \xBB\x99 |0 + \xBB\x9A |0 + \xBB\x9B |0 + \xBB\x9C |0 + \xBB\x9D |0 + \xBB\x9E |0 + \xBB\x9F |0 + \xBB\xA0 |0 + \xBC\x41 |0 + \xBC\x42 |0 + \xBC\x43 |0 + \xBC\x44 |0 + \xBC\x45 |0 + \xBC\x46 |0 + \xBC\x47 |0 + \xBC\x48 |0 + \xBC\x49 |0 + \xBC\x4A |0 + \xBC\x4B |0 + \xBC\x4C |0 + \xBC\x4D |0 + \xBC\x4E |0 + \xBC\x4F |0 + \xBC\x50 |0 + \xBC\x51 |0 + \xBC\x52 |0 + \xC6\xDB |0 + \xC6\xDC |0 + \xBC\x53 |0 + \xBC\x54 |0 + \xC6\xDD |0 + \xBC\x55 |0 + \xBC\x56 |0 + \xBC\x57 |0 + \xC6\xDE |0 + \xBC\x58 |0 + \xBC\x59 |0 + \xBC\x5A |0 + \xBC\x61 |0 + \xBC\x62 |0 + \xBC\x63 |0 + \xBC\x64 |0 + \xC6\xDF |0 + \xC6\xE0 |0 + \xBC\x65 |0 + \xC6\xE1 |0 + \xC6\xE2 |0 + \xC6\xE3 |0 + \xBC\x66 |0 + \xBC\x67 |0 + \xBC\x68 |0 + \xBC\x69 |0 + \xBC\x6A |0 + \xBC\x6B |0 + \xC6\xE4 |0 + \xC6\xE5 |0 + \xBC\x6C |0 + \xBC\x6D |0 + \xC6\xE6 |0 + \xBC\x6E |0 + \xBC\x6F |0 + \xBC\x70 |0 + \xC6\xE7 |0 + \xBC\x71 |0 + \xBC\x72 |0 + \xBC\x73 |0 + \xBC\x74 |0 + \xBC\x75 |0 + \xBC\x76 |0 + \xBC\x77 |0 + \xC6\xE8 |0 + \xC6\xE9 |0 + \xBC\x78 |0 + \xC6\xEA |0 + \xBC\x79 |0 + \xC6\xEB |0 + \xBC\x7A |0 + \xBC\x81 |0 + \xBC\x82 |0 + \xBC\x83 |0 + \xBC\x84 |0 + \xBC\x85 |0 + \xC6\xEC |0 + \xBC\x86 |0 + \xBC\x87 |0 + \xBC\x88 |0 + \xC6\xED |0 + \xBC\x89 |0 + \xBC\x8A |0 + \xBC\x8B |0 + \xC6\xEE |0 + \xBC\x8C |0 + \xBC\x8D |0 + \xBC\x8E |0 + \xBC\x8F |0 + \xBC\x90 |0 + \xBC\x91 |0 + \xBC\x92 |0 + \xC6\xEF |0 + \xC6\xF0 |0 + \xBC\x93 |0 + \xBC\x94 |0 + \xC6\xF1 |0 + \xC6\xF2 |0 + \xBC\x95 |0 + \xBC\x96 |0 + \xBC\x97 |0 + \xBC\x98 |0 + \xBC\x99 |0 + \xBC\x9A |0 + \xC6\xF3 |0 + \xBC\x9B |0 + \xBC\x9C |0 + \xBC\x9D |0 + \xBC\x9E |0 + \xBC\x9F |0 + \xBC\xA0 |0 + \xBD\x41 |0 + \xC6\xF4 |0 + \xBD\x42 |0 + \xBD\x43 |0 + \xBD\x44 |0 + \xBD\x45 |0 + \xBD\x46 |0 + \xBD\x47 |0 + \xBD\x48 |0 + \xBD\x49 |0 + \xC6\xF5 |0 + \xBD\x4A |0 + \xC6\xF6 |0 + \xBD\x4B |0 + \xBD\x4C |0 + \xBD\x4D |0 + \xBD\x4E |0 + \xBD\x4F |0 + \xBD\x50 |0 + \xBD\x51 |0 + \xBD\x52 |0 + \xC6\xF7 |0 + \xC6\xF8 |0 + \xBD\x53 |0 + \xBD\x54 |0 + \xC6\xF9 |0 + \xBD\x55 |0 + \xBD\x56 |0 + \xBD\x57 |0 + \xC6\xFA |0 + \xBD\x58 |0 + \xBD\x59 |0 + \xBD\x5A |0 + \xBD\x61 |0 + \xBD\x62 |0 + \xBD\x63 |0 + \xBD\x64 |0 + \xC6\xFB |0 + \xC6\xFC |0 + \xBD\x65 |0 + \xC6\xFD |0 + \xBD\x66 |0 + \xC6\xFE |0 + \xBD\x67 |0 + \xBD\x68 |0 + \xBD\x69 |0 + \xBD\x6A |0 + \xBD\x6B |0 + \xBD\x6C |0 + \xC7\xA1 |0 + \xBD\x6D |0 + \xBD\x6E |0 + \xBD\x6F |0 + \xBD\x70 |0 + \xBD\x71 |0 + \xBD\x72 |0 + \xBD\x73 |0 + \xBD\x74 |0 + \xBD\x75 |0 + \xBD\x76 |0 + \xBD\x77 |0 + \xBD\x78 |0 + \xBD\x79 |0 + \xBD\x7A |0 + \xBD\x81 |0 + \xBD\x82 |0 + \xBD\x83 |0 + \xBD\x84 |0 + \xBD\x85 |0 + \xBD\x86 |0 + \xC7\xA2 |0 + \xBD\x87 |0 + \xBD\x88 |0 + \xBD\x89 |0 + \xBD\x8A |0 + \xBD\x8B |0 + \xBD\x8C |0 + \xBD\x8D |0 + \xBD\x8E |0 + \xBD\x8F |0 + \xBD\x90 |0 + \xBD\x91 |0 + \xBD\x92 |0 + \xBD\x93 |0 + \xBD\x94 |0 + \xBD\x95 |0 + \xBD\x96 |0 + \xBD\x97 |0 + \xBD\x98 |0 + \xBD\x99 |0 + \xBD\x9A |0 + \xBD\x9B |0 + \xBD\x9C |0 + \xBD\x9D |0 + \xBD\x9E |0 + \xBD\x9F |0 + \xBD\xA0 |0 + \xBE\x41 |0 + \xBE\x42 |0 + \xBE\x43 |0 + \xBE\x44 |0 + \xBE\x45 |0 + \xBE\x46 |0 + \xBE\x47 |0 + \xBE\x48 |0 + \xC7\xA3 |0 + \xBE\x49 |0 + \xBE\x4A |0 + \xBE\x4B |0 + \xC7\xA4 |0 + \xBE\x4C |0 + \xBE\x4D |0 + \xBE\x4E |0 + \xBE\x4F |0 + \xBE\x50 |0 + \xBE\x51 |0 + \xBE\x52 |0 + \xBE\x53 |0 + \xBE\x54 |0 + \xBE\x55 |0 + \xBE\x56 |0 + \xBE\x57 |0 + \xBE\x58 |0 + \xBE\x59 |0 + \xBE\x5A |0 + \xBE\x61 |0 + \xBE\x62 |0 + \xBE\x63 |0 + \xBE\x64 |0 + \xBE\x65 |0 + \xBE\x66 |0 + \xBE\x67 |0 + \xBE\x68 |0 + \xC7\xA5 |0 + \xBE\x69 |0 + \xBE\x6A |0 + \xBE\x6B |0 + \xC7\xA6 |0 + \xBE\x6C |0 + \xBE\x6D |0 + \xBE\x6E |0 + \xC7\xA7 |0 + \xBE\x6F |0 + \xBE\x70 |0 + \xBE\x71 |0 + \xBE\x72 |0 + \xBE\x73 |0 + \xBE\x74 |0 + \xBE\x75 |0 + \xBE\x76 |0 + \xC7\xA8 |0 + \xBE\x77 |0 + \xC7\xA9 |0 + \xBE\x78 |0 + \xBE\x79 |0 + \xBE\x7A |0 + \xBE\x81 |0 + \xBE\x82 |0 + \xBE\x83 |0 + \xBE\x84 |0 + \xBE\x85 |0 + \xC7\xAA |0 + \xC7\xAB |0 + \xBE\x86 |0 + \xBE\x87 |0 + \xC7\xAC |0 + \xBE\x88 |0 + \xBE\x89 |0 + \xC7\xAD |0 + \xC7\xAE |0 + \xBE\x8A |0 + \xC7\xAF |0 + \xBE\x8B |0 + \xBE\x8C |0 + \xBE\x8D |0 + \xBE\x8E |0 + \xBE\x8F |0 + \xC7\xB0 |0 + \xC7\xB1 |0 + \xBE\x90 |0 + \xC7\xB2 |0 + \xBE\x91 |0 + \xC7\xB3 |0 + \xBE\x92 |0 + \xBE\x93 |0 + \xBE\x94 |0 + \xBE\x95 |0 + \xBE\x96 |0 + \xBE\x97 |0 + \xC7\xB4 |0 + \xBE\x98 |0 + \xBE\x99 |0 + \xBE\x9A |0 + \xBE\x9B |0 + \xBE\x9C |0 + \xBE\x9D |0 + \xBE\x9E |0 + \xBE\x9F |0 + \xBE\xA0 |0 + \xBF\x41 |0 + \xBF\x42 |0 + \xBF\x43 |0 + \xBF\x44 |0 + \xBF\x45 |0 + \xBF\x46 |0 + \xBF\x47 |0 + \xBF\x48 |0 + \xBF\x49 |0 + \xBF\x4A |0 + \xBF\x4B |0 + \xC7\xB5 |0 + \xBF\x4C |0 + \xBF\x4D |0 + \xBF\x4E |0 + \xBF\x4F |0 + \xBF\x50 |0 + \xBF\x51 |0 + \xBF\x52 |0 + \xBF\x53 |0 + \xBF\x54 |0 + \xBF\x55 |0 + \xBF\x56 |0 + \xBF\x57 |0 + \xBF\x58 |0 + \xBF\x59 |0 + \xBF\x5A |0 + \xBF\x61 |0 + \xBF\x62 |0 + \xBF\x63 |0 + \xBF\x64 |0 + \xBF\x65 |0 + \xBF\x66 |0 + \xBF\x67 |0 + \xBF\x68 |0 + \xBF\x69 |0 + \xBF\x6A |0 + \xBF\x6B |0 + \xBF\x6C |0 + \xBF\x6D |0 + \xBF\x6E |0 + \xBF\x6F |0 + \xBF\x70 |0 + \xBF\x71 |0 + \xBF\x72 |0 + \xBF\x73 |0 + \xC7\xB6 |0 + \xBF\x74 |0 + \xBF\x75 |0 + \xBF\x76 |0 + \xC7\xB7 |0 + \xBF\x77 |0 + \xBF\x78 |0 + \xBF\x79 |0 + \xC7\xB8 |0 + \xBF\x7A |0 + \xBF\x81 |0 + \xBF\x82 |0 + \xBF\x83 |0 + \xBF\x84 |0 + \xBF\x85 |0 + \xBF\x86 |0 + \xC7\xB9 |0 + \xBF\x87 |0 + \xBF\x88 |0 + \xC7\xBA |0 + \xBF\x89 |0 + \xBF\x8A |0 + \xBF\x8B |0 + \xBF\x8C |0 + \xBF\x8D |0 + \xBF\x8E |0 + \xBF\x8F |0 + \xBF\x90 |0 + \xC7\xBB |0 + \xBF\x91 |0 + \xBF\x92 |0 + \xBF\x93 |0 + \xC7\xBC |0 + \xBF\x94 |0 + \xBF\x95 |0 + \xBF\x96 |0 + \xC7\xBD |0 + \xBF\x97 |0 + \xBF\x98 |0 + \xBF\x99 |0 + \xBF\x9A |0 + \xBF\x9B |0 + \xBF\x9C |0 + \xBF\x9D |0 + \xC7\xBE |0 + \xBF\x9E |0 + \xBF\x9F |0 + \xC7\xBF |0 + \xBF\xA0 |0 + \xC7\xC0 |0 + \xC0\x41 |0 + \xC0\x42 |0 + \xC0\x43 |0 + \xC0\x44 |0 + \xC0\x45 |0 + \xC0\x46 |0 + \xC7\xC1 |0 + \xC0\x47 |0 + \xC0\x48 |0 + \xC0\x49 |0 + \xC7\xC2 |0 + \xC0\x4A |0 + \xC0\x4B |0 + \xC0\x4C |0 + \xC7\xC3 |0 + \xC0\x4D |0 + \xC0\x4E |0 + \xC0\x4F |0 + \xC0\x50 |0 + \xC0\x51 |0 + \xC0\x52 |0 + \xC0\x53 |0 + \xC7\xC4 |0 + \xC7\xC5 |0 + \xC0\x54 |0 + \xC7\xC6 |0 + \xC0\x55 |0 + \xC0\x56 |0 + \xC0\x57 |0 + \xC0\x58 |0 + \xC0\x59 |0 + \xC0\x5A |0 + \xC0\x61 |0 + \xC0\x62 |0 + \xC0\x63 |0 + \xC0\x64 |0 + \xC0\x65 |0 + \xC0\x66 |0 + \xC0\x67 |0 + \xC0\x68 |0 + \xC0\x69 |0 + \xC0\x6A |0 + \xC0\x6B |0 + \xC0\x6C |0 + \xC0\x6D |0 + \xC0\x6E |0 + \xC0\x6F |0 + \xC0\x70 |0 + \xC0\x71 |0 + \xC0\x72 |0 + \xC0\x73 |0 + \xC0\x74 |0 + \xC0\x75 |0 + \xC0\x76 |0 + \xC0\x77 |0 + \xC0\x78 |0 + \xC0\x79 |0 + \xC0\x7A |0 + \xC0\x81 |0 + \xC0\x82 |0 + \xC0\x83 |0 + \xC0\x84 |0 + \xC7\xC7 |0 + \xC7\xC8 |0 + \xC0\x85 |0 + \xC0\x86 |0 + \xC7\xC9 |0 + \xC0\x87 |0 + \xC0\x88 |0 + \xC0\x89 |0 + \xC7\xCA |0 + \xC0\x8A |0 + \xC0\x8B |0 + \xC0\x8C |0 + \xC0\x8D |0 + \xC0\x8E |0 + \xC0\x8F |0 + \xC0\x90 |0 + \xC7\xCB |0 + \xC7\xCC |0 + \xC0\x91 |0 + \xC7\xCD |0 + \xC0\x92 |0 + \xC7\xCE |0 + \xC0\x93 |0 + \xC0\x94 |0 + \xC0\x95 |0 + \xC0\x96 |0 + \xC0\x97 |0 + \xC0\x98 |0 + \xC7\xCF |0 + \xC7\xD0 |0 + \xC0\x99 |0 + \xC0\x9A |0 + \xC7\xD1 |0 + \xC0\x9B |0 + \xC0\x9C |0 + \xC0\x9D |0 + \xC7\xD2 |0 + \xC0\x9E |0 + \xC0\x9F |0 + \xC0\xA0 |0 + \xC1\x41 |0 + \xC7\xD3 |0 + \xC1\x42 |0 + \xC1\x43 |0 + \xC7\xD4 |0 + \xC7\xD5 |0 + \xC1\x44 |0 + \xC7\xD6 |0 + \xC1\x45 |0 + \xC7\xD7 |0 + \xC1\x46 |0 + \xC1\x47 |0 + \xC1\x48 |0 + \xC1\x49 |0 + \xC1\x4A |0 + \xC1\x4B |0 + \xC7\xD8 |0 + \xC7\xD9 |0 + \xC1\x4C |0 + \xC1\x4D |0 + \xC7\xDA |0 + \xC1\x4E |0 + \xC1\x4F |0 + \xC1\x50 |0 + \xC7\xDB |0 + \xC1\x51 |0 + \xC1\x52 |0 + \xC1\x53 |0 + \xC1\x54 |0 + \xC1\x55 |0 + \xC1\x56 |0 + \xC1\x57 |0 + \xC7\xDC |0 + \xC7\xDD |0 + \xC1\x58 |0 + \xC7\xDE |0 + \xC7\xDF |0 + \xC7\xE0 |0 + \xC1\x59 |0 + \xC1\x5A |0 + \xC1\x61 |0 + \xC1\x62 |0 + \xC1\x63 |0 + \xC1\x64 |0 + \xC7\xE1 |0 + \xC1\x65 |0 + \xC1\x66 |0 + \xC1\x67 |0 + \xC1\x68 |0 + \xC1\x69 |0 + \xC1\x6A |0 + \xC1\x6B |0 + \xC1\x6C |0 + \xC1\x6D |0 + \xC1\x6E |0 + \xC1\x6F |0 + \xC1\x70 |0 + \xC1\x71 |0 + \xC1\x72 |0 + \xC1\x73 |0 + \xC1\x74 |0 + \xC1\x75 |0 + \xC1\x76 |0 + \xC1\x77 |0 + \xC1\x78 |0 + \xC7\xE2 |0 + \xC1\x79 |0 + \xC1\x7A |0 + \xC1\x81 |0 + \xC1\x82 |0 + \xC1\x83 |0 + \xC1\x84 |0 + \xC1\x85 |0 + \xC1\x86 |0 + \xC1\x87 |0 + \xC1\x88 |0 + \xC1\x89 |0 + \xC1\x8A |0 + \xC1\x8B |0 + \xC1\x8C |0 + \xC1\x8D |0 + \xC1\x8E |0 + \xC1\x8F |0 + \xC1\x90 |0 + \xC1\x91 |0 + \xC1\x92 |0 + \xC1\x93 |0 + \xC1\x94 |0 + \xC1\x95 |0 + \xC1\x96 |0 + \xC1\x97 |0 + \xC1\x98 |0 + \xC1\x99 |0 + \xC1\x9A |0 + \xC1\x9B |0 + \xC1\x9C |0 + \xC1\x9D |0 + \xC1\x9E |0 + \xC1\x9F |0 + \xC1\xA0 |0 + \xC7\xE3 |0 + \xC7\xE4 |0 + \xC2\x41 |0 + \xC2\x42 |0 + \xC7\xE5 |0 + \xC2\x43 |0 + \xC2\x44 |0 + \xC2\x45 |0 + \xC7\xE6 |0 + \xC2\x46 |0 + \xC7\xE7 |0 + \xC2\x47 |0 + \xC2\x48 |0 + \xC2\x49 |0 + \xC2\x4A |0 + \xC2\x4B |0 + \xC7\xE8 |0 + \xC7\xE9 |0 + \xC2\x4C |0 + \xC7\xEA |0 + \xC2\x4D |0 + \xC7\xEB |0 + \xC2\x4E |0 + \xC2\x4F |0 + \xC2\x50 |0 + \xC2\x51 |0 + \xC2\x52 |0 + \xC2\x53 |0 + \xC7\xEC |0 + \xC7\xED |0 + \xC2\x54 |0 + \xC2\x55 |0 + \xC7\xEE |0 + \xC2\x56 |0 + \xC2\x57 |0 + \xC2\x58 |0 + \xC7\xEF |0 + \xC2\x59 |0 + \xC2\x5A |0 + \xC2\x61 |0 + \xC2\x62 |0 + \xC2\x63 |0 + \xC2\x64 |0 + \xC2\x65 |0 + \xC7\xF0 |0 + \xC7\xF1 |0 + \xC2\x66 |0 + \xC7\xF2 |0 + \xC2\x67 |0 + \xC7\xF3 |0 + \xC2\x68 |0 + \xC2\x69 |0 + \xC2\x6A |0 + \xC2\x6B |0 + \xC2\x6C |0 + \xC2\x6D |0 + \xC7\xF4 |0 + \xC7\xF5 |0 + \xC2\x6E |0 + \xC2\x6F |0 + \xC7\xF6 |0 + \xC2\x70 |0 + \xC2\x71 |0 + \xC2\x72 |0 + \xC7\xF7 |0 + \xC2\x73 |0 + \xC2\x74 |0 + \xC2\x75 |0 + \xC2\x76 |0 + \xC2\x77 |0 + \xC2\x78 |0 + \xC2\x79 |0 + \xC7\xF8 |0 + \xC7\xF9 |0 + \xC2\x7A |0 + \xC7\xFA |0 + \xC7\xFB |0 + \xC7\xFC |0 + \xC2\x81 |0 + \xC2\x82 |0 + \xC2\x83 |0 + \xC2\x84 |0 + \xC2\x85 |0 + \xC2\x86 |0 + \xC7\xFD |0 + \xC2\x87 |0 + \xC2\x88 |0 + \xC2\x89 |0 + \xC7\xFE |0 + \xC2\x8A |0 + \xC2\x8B |0 + \xC2\x8C |0 + \xC8\xA1 |0 + \xC2\x8D |0 + \xC2\x8E |0 + \xC2\x8F |0 + \xC2\x90 |0 + \xC2\x91 |0 + \xC2\x92 |0 + \xC2\x93 |0 + \xC2\x94 |0 + \xC8\xA2 |0 + \xC2\x95 |0 + \xC2\x96 |0 + \xC2\x97 |0 + \xC2\x98 |0 + \xC2\x99 |0 + \xC2\x9A |0 + \xC2\x9B |0 + \xC2\x9C |0 + \xC2\x9D |0 + \xC2\x9E |0 + \xC8\xA3 |0 + \xC8\xA4 |0 + \xC2\x9F |0 + \xC2\xA0 |0 + \xC8\xA5 |0 + \xC3\x41 |0 + \xC3\x42 |0 + \xC3\x43 |0 + \xC8\xA6 |0 + \xC3\x44 |0 + \xC3\x45 |0 + \xC3\x46 |0 + \xC3\x47 |0 + \xC8\xA7 |0 + \xC3\x48 |0 + \xC3\x49 |0 + \xC8\xA8 |0 + \xC8\xA9 |0 + \xC3\x4A |0 + \xC8\xAA |0 + \xC3\x4B |0 + \xC8\xAB |0 + \xC3\x4C |0 + \xC3\x4D |0 + \xC3\x4E |0 + \xC8\xAC |0 + \xC3\x4F |0 + \xC3\x50 |0 + \xC8\xAD |0 + \xC8\xAE |0 + \xC3\x51 |0 + \xC3\x52 |0 + \xC8\xAF |0 + \xC3\x53 |0 + \xC3\x54 |0 + \xC3\x55 |0 + \xC8\xB0 |0 + \xC3\x56 |0 + \xC3\x57 |0 + \xC3\x58 |0 + \xC3\x59 |0 + \xC3\x5A |0 + \xC3\x61 |0 + \xC3\x62 |0 + \xC3\x63 |0 + \xC3\x64 |0 + \xC3\x65 |0 + \xC8\xB1 |0 + \xC3\x66 |0 + \xC8\xB2 |0 + \xC3\x67 |0 + \xC3\x68 |0 + \xC3\x69 |0 + \xC3\x6A |0 + \xC3\x6B |0 + \xC3\x6C |0 + \xC8\xB3 |0 + \xC8\xB4 |0 + \xC3\x6D |0 + \xC3\x6E |0 + \xC8\xB5 |0 + \xC3\x6F |0 + \xC3\x70 |0 + \xC3\x71 |0 + \xC3\x72 |0 + \xC3\x73 |0 + \xC3\x74 |0 + \xC3\x75 |0 + \xC3\x76 |0 + \xC3\x77 |0 + \xC3\x78 |0 + \xC3\x79 |0 + \xC3\x7A |0 + \xC3\x81 |0 + \xC3\x82 |0 + \xC8\xB6 |0 + \xC3\x83 |0 + \xC8\xB7 |0 + \xC3\x84 |0 + \xC3\x85 |0 + \xC3\x86 |0 + \xC3\x87 |0 + \xC3\x88 |0 + \xC3\x89 |0 + \xC8\xB8 |0 + \xC8\xB9 |0 + \xC3\x8A |0 + \xC3\x8B |0 + \xC8\xBA |0 + \xC3\x8C |0 + \xC3\x8D |0 + \xC3\x8E |0 + \xC8\xBB |0 + \xC3\x8F |0 + \xC3\x90 |0 + \xC3\x91 |0 + \xC3\x92 |0 + \xC3\x93 |0 + \xC3\x94 |0 + \xC3\x95 |0 + \xC3\x96 |0 + \xC8\xBC |0 + \xC3\x97 |0 + \xC8\xBD |0 + \xC3\x98 |0 + \xC8\xBE |0 + \xC3\x99 |0 + \xC3\x9A |0 + \xC3\x9B |0 + \xC3\x9C |0 + \xC3\x9D |0 + \xC3\x9E |0 + \xC8\xBF |0 + \xC3\x9F |0 + \xC3\xA0 |0 + \xC4\x41 |0 + \xC8\xC0 |0 + \xC4\x42 |0 + \xC4\x43 |0 + \xC4\x44 |0 + \xC8\xC1 |0 + \xC4\x45 |0 + \xC4\x46 |0 + \xC4\x47 |0 + \xC4\x48 |0 + \xC4\x49 |0 + \xC4\x4A |0 + \xC4\x4B |0 + \xC4\x4C |0 + \xC8\xC2 |0 + \xC4\x4D |0 + \xC8\xC3 |0 + \xC4\x4E |0 + \xC4\x4F |0 + \xC4\x50 |0 + \xC4\x51 |0 + \xC4\x52 |0 + \xC4\x53 |0 + \xC4\x54 |0 + \xC4\x55 |0 + \xC8\xC4 |0 + \xC8\xC5 |0 + \xC4\x56 |0 + \xC4\x57 |0 + \xC8\xC6 |0 + \xC4\x58 |0 + \xC4\x59 |0 + \xC4\x5A |0 + \xC8\xC7 |0 + \xC4\x61 |0 + \xC4\x62 |0 + \xC4\x63 |0 + \xC4\x64 |0 + \xC8\xC8 |0 + \xC4\x65 |0 + \xC4\x66 |0 + \xC8\xC9 |0 + \xC4\x67 |0 + \xC4\x68 |0 + \xC8\xCA |0 + \xC4\x69 |0 + \xC8\xCB |0 + \xC4\x6A |0 + \xC4\x6B |0 + \xC4\x6C |0 + \xC4\x6D |0 + \xC4\x6E |0 + \xC4\x6F |0 + \xC8\xCC |0 + \xC4\x70 |0 + \xC4\x71 |0 + \xC4\x72 |0 + \xC8\xCD |0 + \xC4\x73 |0 + \xC4\x74 |0 + \xC4\x75 |0 + \xC8\xCE |0 + \xC4\x76 |0 + \xC4\x77 |0 + \xC4\x78 |0 + \xC4\x79 |0 + \xC4\x7A |0 + \xC4\x81 |0 + \xC4\x82 |0 + \xC8\xCF |0 + \xC4\x83 |0 + \xC4\x84 |0 + \xC4\x85 |0 + \xC4\x86 |0 + \xC8\xD0 |0 + \xC4\x87 |0 + \xC4\x88 |0 + \xC4\x89 |0 + \xC4\x8A |0 + \xC4\x8B |0 + \xC4\x8C |0 + \xC8\xD1 |0 + \xC8\xD2 |0 + \xC4\x8D |0 + \xC4\x8E |0 + \xC8\xD3 |0 + \xC4\x8F |0 + \xC4\x90 |0 + \xC4\x91 |0 + \xC8\xD4 |0 + \xC4\x92 |0 + \xC4\x93 |0 + \xC4\x94 |0 + \xC4\x95 |0 + \xC4\x96 |0 + \xC4\x97 |0 + \xC4\x98 |0 + \xC4\x99 |0 + \xC4\x9A |0 + \xC4\x9B |0 + \xC4\x9C |0 + \xC4\x9D |0 + \xC8\xD5 |0 + \xC4\x9E |0 + \xC4\x9F |0 + \xC4\xA0 |0 + \xC5\x41 |0 + \xC5\x42 |0 + \xC5\x43 |0 + \xC8\xD6 |0 + \xC8\xD7 |0 + \xC5\x44 |0 + \xC5\x45 |0 + \xC8\xD8 |0 + \xC5\x46 |0 + \xC5\x47 |0 + \xC5\x48 |0 + \xC8\xD9 |0 + \xC5\x49 |0 + \xC5\x4A |0 + \xC5\x4B |0 + \xC5\x4C |0 + \xC5\x4D |0 + \xC5\x4E |0 + \xC5\x4F |0 + \xC8\xDA |0 + \xC8\xDB |0 + \xC5\x50 |0 + \xC8\xDC |0 + \xC5\x51 |0 + \xC8\xDD |0 + \xC5\x52 |0 + \xC5\x53 |0 + \xC5\x54 |0 + \xC5\x55 |0 + \xC5\x56 |0 + \xC5\x57 |0 + \xC8\xDE |0 + \xC8\xDF |0 + \xC5\x58 |0 + \xC5\x59 |0 + \xC8\xE0 |0 + \xC5\x5A |0 + \xC5\x61 |0 + \xC5\x62 |0 + \xC8\xE1 |0 + \xC5\x63 |0 + \xC5\x64 |0 + \xC5\x65 |0 + \xC5\x66 |0 + \xC5\x67 |0 + \xC5\x68 |0 + \xC5\x69 |0 + \xC8\xE2 |0 + \xC5\x6A |0 + \xC5\x6B |0 + \xC8\xE3 |0 + \xC5\x6C |0 + \xC8\xE4 |0 + \xC5\x6D |0 + \xC5\x6E |0 + \xC5\x6F |0 + \xC5\x70 |0 + \xC5\x71 |0 + \xC5\x72 |0 + \xC8\xE5 |0 + \xC8\xE6 |0 + \xC5\x73 |0 + \xC5\x74 |0 + \xC8\xE7 |0 + \xC5\x75 |0 + \xC8\xE8 |0 + \xC8\xE9 |0 + \xC8\xEA |0 + \xC8\xEB |0 + \xC5\x76 |0 + \xC5\x77 |0 + \xC5\x78 |0 + \xC5\x79 |0 + \xC5\x7A |0 + \xC5\x81 |0 + \xC8\xEC |0 + \xC8\xED |0 + \xC5\x82 |0 + \xC8\xEE |0 + \xC5\x83 |0 + \xC8\xEF |0 + \xC5\x84 |0 + \xC5\x85 |0 + \xC5\x86 |0 + \xC8\xF0 |0 + \xC5\x87 |0 + \xC5\x88 |0 + \xC8\xF1 |0 + \xC5\x89 |0 + \xC5\x8A |0 + \xC5\x8B |0 + \xC8\xF2 |0 + \xC5\x8C |0 + \xC5\x8D |0 + \xC5\x8E |0 + \xC8\xF3 |0 + \xC5\x8F |0 + \xC5\x90 |0 + \xC5\x91 |0 + \xC5\x92 |0 + \xC5\x93 |0 + \xC5\x94 |0 + \xC5\x95 |0 + \xC8\xF4 |0 + \xC8\xF5 |0 + \xC5\x96 |0 + \xC5\x97 |0 + \xC5\x98 |0 + \xC8\xF6 |0 + \xC5\x99 |0 + \xC5\x9A |0 + \xC5\x9B |0 + \xC5\x9C |0 + \xC5\x9D |0 + \xC5\x9E |0 + \xC8\xF7 |0 + \xC8\xF8 |0 + \xC5\x9F |0 + \xC5\xA0 |0 + \xC8\xF9 |0 + \xC6\x41 |0 + \xC6\x42 |0 + \xC6\x43 |0 + \xC8\xFA |0 + \xC6\x44 |0 + \xC6\x45 |0 + \xC6\x46 |0 + \xC6\x47 |0 + \xC6\x48 |0 + \xC6\x49 |0 + \xC6\x4A |0 + \xC8\xFB |0 + \xC8\xFC |0 + \xC6\x4B |0 + \xC8\xFD |0 + \xC6\x4C |0 + \xC8\xFE |0 + \xC6\x4D |0 + \xC6\x4E |0 + \xC6\x4F |0 + \xC6\x50 |0 + \xC6\x51 |0 + \xC6\x52 |0 + \xC9\xA1 |0 + \xC9\xA2 |0 + \xC9\xA3 |0 + \xC9\xA4 |0 + \xC9\xA5 |0 + \xC9\xA6 |0 + \xC9\xA7 |0 + \xC9\xA8 |0 + \xC9\xA9 |0 + \xC9\xAA |0 + \xC9\xAB |0 + \xC9\xAC |0 + \xC9\xAD |0 + \xC9\xAE |0 + \xC9\xAF |0 + \xC9\xB0 |0 + \xC9\xB1 |0 + \xC9\xB2 |0 + \xC9\xB3 |0 + \xC9\xB4 |0 + \xC9\xB5 |0 + \xC9\xB6 |0 + \xC9\xB7 |0 + \xC9\xB8 |0 + \xC9\xB9 |0 + \xC9\xBA |0 + \xC9\xBB |0 + \xC9\xBC |0 + \xC9\xBD |0 + \xC9\xBE |0 + \xC9\xBF |0 + \xC9\xC0 |0 + \xC9\xC1 |0 + \xC9\xC2 |0 + \xC9\xC3 |0 + \xC9\xC4 |0 + \xC9\xC5 |0 + \xC9\xC6 |0 + \xC9\xC7 |0 + \xC9\xC8 |0 + \xC9\xC9 |0 + \xC9\xCA |0 + \xC9\xCB |0 + \xC9\xCC |0 + \xC9\xCD |0 + \xC9\xCE |0 + \xC9\xCF |0 + \xC9\xD0 |0 + \xC9\xD1 |0 + \xC9\xD2 |0 + \xC9\xD3 |0 + \xC9\xD4 |0 + \xC9\xD5 |0 + \xC9\xD6 |0 + \xC9\xD7 |0 + \xC9\xD8 |0 + \xC9\xD9 |0 + \xC9\xDA |0 + \xC9\xDB |0 + \xC9\xDC |0 + \xC9\xDD |0 + \xC9\xDE |0 + \xC9\xDF |0 + \xC9\xE0 |0 + \xC9\xE1 |0 + \xC9\xE2 |0 + \xC9\xE3 |0 + \xC9\xE4 |0 + \xC9\xE5 |0 + \xC9\xE6 |0 + \xC9\xE7 |0 + \xC9\xE8 |0 + \xC9\xE9 |0 + \xC9\xEA |0 + \xC9\xEB |0 + \xC9\xEC |0 + \xC9\xED |0 + \xC9\xEE |0 + \xC9\xEF |0 + \xC9\xF0 |0 + \xC9\xF1 |0 + \xC9\xF2 |0 + \xC9\xF3 |0 + \xC9\xF4 |0 + \xC9\xF5 |0 + \xC9\xF6 |0 + \xC9\xF7 |0 + \xC9\xF8 |0 + \xC9\xF9 |0 + \xC9\xFA |0 + \xC9\xFB |0 + \xC9\xFC |0 + \xC9\xFD |0 + \xC9\xFE |0 + \xFE\xA1 |0 + \xFE\xA2 |0 + \xFE\xA3 |0 + \xFE\xA4 |0 + \xFE\xA5 |0 + \xFE\xA6 |0 + \xFE\xA7 |0 + \xFE\xA8 |0 + \xFE\xA9 |0 + \xFE\xAA |0 + \xFE\xAB |0 + \xFE\xAC |0 + \xFE\xAD |0 + \xFE\xAE |0 + \xFE\xAF |0 + \xFE\xB0 |0 + \xFE\xB1 |0 + \xFE\xB2 |0 + \xFE\xB3 |0 + \xFE\xB4 |0 + \xFE\xB5 |0 + \xFE\xB6 |0 + \xFE\xB7 |0 + \xFE\xB8 |0 + \xFE\xB9 |0 + \xFE\xBA |0 + \xFE\xBB |0 + \xFE\xBC |0 + \xFE\xBD |0 + \xFE\xBE |0 + \xFE\xBF |0 + \xFE\xC0 |0 + \xFE\xC1 |0 + \xFE\xC2 |0 + \xFE\xC3 |0 + \xFE\xC4 |0 + \xFE\xC5 |0 + \xFE\xC6 |0 + \xFE\xC7 |0 + \xFE\xC8 |0 + \xFE\xC9 |0 + \xFE\xCA |0 + \xFE\xCB |0 + \xFE\xCC |0 + \xFE\xCD |0 + \xFE\xCE |0 + \xFE\xCF |0 + \xFE\xD0 |0 + \xFE\xD1 |0 + \xFE\xD2 |0 + \xFE\xD3 |0 + \xFE\xD4 |0 + \xFE\xD5 |0 + \xFE\xD6 |0 + \xFE\xD7 |0 + \xFE\xD8 |0 + \xFE\xD9 |0 + \xFE\xDA |0 + \xFE\xDB |0 + \xFE\xDC |0 + \xFE\xDD |0 + \xFE\xDE |0 + \xFE\xDF |0 + \xFE\xE0 |0 + \xFE\xE1 |0 + \xFE\xE2 |0 + \xFE\xE3 |0 + \xFE\xE4 |0 + \xFE\xE5 |0 + \xFE\xE6 |0 + \xFE\xE7 |0 + \xFE\xE8 |0 + \xFE\xE9 |0 + \xFE\xEA |0 + \xFE\xEB |0 + \xFE\xEC |0 + \xFE\xED |0 + \xFE\xEE |0 + \xFE\xEF |0 + \xFE\xF0 |0 + \xFE\xF1 |0 + \xFE\xF2 |0 + \xFE\xF3 |0 + \xFE\xF4 |0 + \xFE\xF5 |0 + \xFE\xF6 |0 + \xFE\xF7 |0 + \xFE\xF8 |0 + \xFE\xF9 |0 + \xFE\xFA |0 + \xFE\xFB |0 + \xFE\xFC |0 + \xFE\xFD |0 + \xFE\xFE |0 + \xFF |0 + \xCB\xD0 |0 + \xCB\xD6 |0 + \xCB\xE7 |0 + \xCD\xCF |0 + \xCD\xE8 |0 + \xCE\xAD |0 + \xCF\xFB |0 + \xD0\xA2 |0 + \xD0\xB8 |0 + \xD0\xD0 |0 + \xD0\xDD |0 + \xD1\xD4 |0 + \xD1\xD5 |0 + \xD1\xD8 |0 + \xD1\xDB |0 + \xD1\xDC |0 + \xD1\xDD |0 + \xD1\xDE |0 + \xD1\xDF |0 + \xD1\xE0 |0 + \xD1\xE2 |0 + \xD1\xE3 |0 + \xD1\xE4 |0 + \xD1\xE5 |0 + \xD1\xE6 |0 + \xD1\xE8 |0 + \xD1\xE9 |0 + \xD1\xEA |0 + \xD1\xEB |0 + \xD1\xED |0 + \xD1\xEF |0 + \xD1\xF0 |0 + \xD1\xF2 |0 + \xD1\xF6 |0 + \xD1\xFA |0 + \xD1\xFC |0 + \xD1\xFD |0 + \xD1\xFE |0 + \xD2\xA2 |0 + \xD2\xA3 |0 + \xD2\xA7 |0 + \xD2\xA8 |0 + \xD2\xA9 |0 + \xD2\xAA |0 + \xD2\xAB |0 + \xD2\xAD |0 + \xD2\xB2 |0 + \xD2\xBE |0 + \xD2\xC2 |0 + \xD2\xC3 |0 + \xD2\xC4 |0 + \xD2\xC6 |0 + \xD2\xC7 |0 + \xD2\xC8 |0 + \xD2\xC9 |0 + \xD2\xCA |0 + \xD2\xCB |0 + \xD2\xCD |0 + \xD2\xCE |0 + \xD2\xCF |0 + \xD2\xD0 |0 + \xD2\xD1 |0 + \xD2\xD2 |0 + \xD2\xD3 |0 + \xD2\xD4 |0 + \xD2\xD5 |0 + \xD2\xD6 |0 + \xD2\xD7 |0 + \xD2\xD9 |0 + \xD2\xDA |0 + \xD2\xDE |0 + \xD2\xDF |0 + \xD2\xE1 |0 + \xD2\xE2 |0 + \xD2\xE4 |0 + \xD2\xE5 |0 + \xD2\xE6 |0 + \xD2\xE7 |0 + \xD2\xE8 |0 + \xD2\xE9 |0 + \xD2\xEA |0 + \xD2\xEB |0 + \xD2\xF0 |0 + \xD2\xF1 |0 + \xD2\xF2 |0 + \xD2\xF3 |0 + \xD2\xF4 |0 + \xD2\xF5 |0 + \xD2\xF7 |0 + \xD2\xF8 |0 + \xD4\xE6 |0 + \xD4\xFC |0 + \xD5\xA5 |0 + \xD5\xAB |0 + \xD5\xAE |0 + \xD6\xB8 |0 + \xD6\xCD |0 + \xD7\xCB |0 + \xD7\xE4 |0 + \xDB\xC5 |0 + \xDB\xE4 |0 + \xDC\xA5 |0 + \xDD\xA5 |0 + \xDD\xD5 |0 + \xDD\xF4 |0 + \xDE\xFC |0 + \xDE\xFE |0 + \xDF\xB3 |0 + \xDF\xE1 |0 + \xDF\xE8 |0 + \xE0\xF1 |0 + \xE1\xAD |0 + \xE1\xED |0 + \xE3\xF5 |0 + \xE4\xA1 |0 + \xE4\xA9 |0 + \xE5\xAE |0 + \xE5\xB1 |0 + \xE5\xB2 |0 + \xE5\xB9 |0 + \xE5\xBB |0 + \xE5\xBC |0 + \xE5\xC4 |0 + \xE5\xCE |0 + \xE5\xD0 |0 + \xE5\xD2 |0 + \xE5\xD6 |0 + \xE5\xFA |0 + \xE5\xFB |0 + \xE5\xFC |0 + \xE5\xFE |0 + \xE6\xA1 |0 + \xE6\xA4 |0 + \xE6\xA7 |0 + \xE6\xAD |0 + \xE6\xAF |0 + \xE6\xB0 |0 + \xE6\xB1 |0 + \xE6\xB3 |0 + \xE6\xB7 |0 + \xE6\xB8 |0 + \xE6\xBC |0 + \xE6\xC4 |0 + \xE6\xC6 |0 + \xE6\xC7 |0 + \xE6\xCA |0 + \xE6\xD2 |0 + \xE6\xD6 |0 + \xE6\xD9 |0 + \xE6\xDC |0 + \xE6\xDF |0 + \xE6\xE1 |0 + \xE6\xE4 |0 + \xE6\xE5 |0 + \xE6\xE6 |0 + \xE6\xE8 |0 + \xE6\xEA |0 + \xE6\xEB |0 + \xE6\xEC |0 + \xE6\xEF |0 + \xE6\xF1 |0 + \xE6\xF2 |0 + \xE6\xF5 |0 + \xE6\xF6 |0 + \xE6\xF7 |0 + \xE6\xF9 |0 + \xE7\xA1 |0 + \xE7\xA6 |0 + \xE7\xA9 |0 + \xE7\xAA |0 + \xE7\xAC |0 + \xE7\xAD |0 + \xE7\xB0 |0 + \xE7\xBF |0 + \xE7\xC1 |0 + \xE7\xC6 |0 + \xE7\xC7 |0 + \xE7\xCB |0 + \xE7\xCD |0 + \xE7\xCF |0 + \xE7\xD0 |0 + \xE7\xD3 |0 + \xE7\xDF |0 + \xE7\xE4 |0 + \xE7\xE6 |0 + \xE7\xF7 |0 + \xE8\xE7 |0 + \xE8\xE8 |0 + \xE8\xF0 |0 + \xE8\xF1 |0 + \xE8\xF7 |0 + \xE8\xF9 |0 + \xE8\xFB |0 + \xE8\xFE |0 + \xE9\xA7 |0 + \xE9\xAC |0 + \xE9\xCC |0 + \xE9\xF7 |0 + \xEA\xC1 |0 + \xEA\xE5 |0 + \xEA\xF4 |0 + \xEA\xF7 |0 + \xEA\xFC |0 + \xEA\xFE |0 + \xEB\xA4 |0 + \xEB\xA7 |0 + \xEB\xA9 |0 + \xEB\xAA |0 + \xEB\xBA |0 + \xEB\xBB |0 + \xEB\xBD |0 + \xEB\xC1 |0 + \xEB\xC2 |0 + \xEB\xC6 |0 + \xEB\xC7 |0 + \xEB\xCC |0 + \xEB\xCF |0 + \xEB\xD0 |0 + \xEB\xD1 |0 + \xEB\xD2 |0 + \xEB\xD8 |0 + \xEC\xA6 |0 + \xEC\xA7 |0 + \xEC\xAA |0 + \xEC\xAF |0 + \xEC\xB0 |0 + \xEC\xB1 |0 + \xEC\xB2 |0 + \xEC\xB5 |0 + \xEC\xB8 |0 + \xEC\xBA |0 + \xEC\xC0 |0 + \xEC\xC1 |0 + \xEC\xC5 |0 + \xEC\xC6 |0 + \xEC\xC9 |0 + \xEC\xCA |0 + \xEC\xD5 |0 + \xEC\xDD |0 + \xEC\xDE |0 + \xEC\xE1 |0 + \xEC\xE4 |0 + \xEC\xE7 |0 + \xEC\xE8 |0 + \xEC\xF7 |0 + \xEC\xF8 |0 + \xEC\xFA |0 + \xED\xA1 |0 + \xED\xA2 |0 + \xED\xA3 |0 + \xED\xEE |0 + \xEE\xDB |0 + \xF2\xBD |0 + \xF2\xFA |0 + \xF3\xB1 |0 + \xF4\xA7 |0 + \xF4\xEE |0 + \xF6\xF4 |0 + \xF6\xF6 |0 + \xF7\xB8 |0 + \xF7\xC8 |0 + \xF7\xD3 |0 + \xF8\xDB |0 + \xF8\xF0 |0 + \xFA\xA1 |0 + \xFA\xA2 |0 + \xFA\xE6 |0 + \xFC\xA9 |0 + \xE8\xB4 |1 + \xF5\xC0 |1 + \xF4\xE7 |1 + \xFD\xEB |1 + \xEC\xCC |1 + \xE3\xEA |1 + \xDF\xD4 |1 + \xDC\xD8 |1 + \xEF\xFE |1 + \xEF\xF1 |1 + \xE9\xE2 |1 + \xF0\xB3 |1 + \xEC\xEF |1 + \xD4\xB4 |1 + \xDA\xF9 |1 + \xDE\xF8 |1 + \xCE\xBD |1 + \xF9\xCD |1 + \xA3\xA1 |0 + \xA3\xA2 |0 + \xA3\xA3 |0 + \xA3\xA4 |0 + \xA3\xA5 |0 + \xA3\xA6 |0 + \xA3\xA7 |0 + \xA3\xA8 |0 + \xA3\xA9 |0 + \xA3\xAA |0 + \xA3\xAB |0 + \xA3\xAC |0 + \xA3\xAD |0 + \xA3\xAE |0 + \xA3\xAF |0 + \xA3\xB0 |0 + \xA3\xB1 |0 + \xA3\xB2 |0 + \xA3\xB3 |0 + \xA3\xB4 |0 + \xA3\xB5 |0 + \xA3\xB6 |0 + \xA3\xB7 |0 + \xA3\xB8 |0 + \xA3\xB9 |0 + \xA3\xBA |0 + \xA3\xBB |0 + \xA3\xBC |0 + \xA3\xBD |0 + \xA3\xBE |0 + \xA3\xBF |0 + \xA3\xC0 |0 + \xA3\xC1 |0 + \xA3\xC2 |0 + \xA3\xC3 |0 + \xA3\xC4 |0 + \xA3\xC5 |0 + \xA3\xC6 |0 + \xA3\xC7 |0 + \xA3\xC8 |0 + \xA3\xC9 |0 + \xA3\xCA |0 + \xA3\xCB |0 + \xA3\xCC |0 + \xA3\xCD |0 + \xA3\xCE |0 + \xA3\xCF |0 + \xA3\xD0 |0 + \xA3\xD1 |0 + \xA3\xD2 |0 + \xA3\xD3 |0 + \xA3\xD4 |0 + \xA3\xD5 |0 + \xA3\xD6 |0 + \xA3\xD7 |0 + \xA3\xD8 |0 + \xA3\xD9 |0 + \xA3\xDA |0 + \xA3\xDB |0 + \xA1\xAC |0 + \xA3\xDD |0 + \xA3\xDE |0 + \xA3\xDF |0 + \xA3\xE0 |0 + \xA3\xE1 |0 + \xA3\xE2 |0 + \xA3\xE3 |0 + \xA3\xE4 |0 + \xA3\xE5 |0 + \xA3\xE6 |0 + \xA3\xE7 |0 + \xA3\xE8 |0 + \xA3\xE9 |0 + \xA3\xEA |0 + \xA3\xEB |0 + \xA3\xEC |0 + \xA3\xED |0 + \xA3\xEE |0 + \xA3\xEF |0 + \xA3\xF0 |0 + \xA3\xF1 |0 + \xA3\xF2 |0 + \xA3\xF3 |0 + \xA3\xF4 |0 + \xA3\xF5 |0 + \xA3\xF6 |0 + \xA3\xF7 |0 + \xA3\xF8 |0 + \xA3\xF9 |0 + \xA3\xFA |0 + \xA3\xFB |0 + \xA3\xFC |0 + \xA3\xFD |0 + \xA2\xA6 |0 + \xA4\xD4 |1 + \xA4\xA1 |1 + \xA4\xA2 |1 + \xA4\xA3 |1 + \xA4\xA4 |1 + \xA4\xA5 |1 + \xA4\xA6 |1 + \xA4\xA7 |1 + \xA4\xA8 |1 + \xA4\xA9 |1 + \xA4\xAA |1 + \xA4\xAB |1 + \xA4\xAC |1 + \xA4\xAD |1 + \xA4\xAE |1 + \xA4\xAF |1 + \xA4\xB0 |1 + \xA4\xB1 |1 + \xA4\xB2 |1 + \xA4\xB3 |1 + \xA4\xB4 |1 + \xA4\xB5 |1 + \xA4\xB6 |1 + \xA4\xB7 |1 + \xA4\xB8 |1 + \xA4\xB9 |1 + \xA4\xBA |1 + \xA4\xBB |1 + \xA4\xBC |1 + \xA4\xBD |1 + \xA4\xBE |1 + \xA4\xBF |1 + \xA4\xC0 |1 + \xA4\xC1 |1 + \xA4\xC2 |1 + \xA4\xC3 |1 + \xA4\xC4 |1 + \xA4\xC5 |1 + \xA4\xC6 |1 + \xA4\xC7 |1 + \xA4\xC8 |1 + \xA4\xC9 |1 + \xA4\xCA |1 + \xA4\xCB |1 + \xA4\xCC |1 + \xA4\xCD |1 + \xA4\xCE |1 + \xA4\xCF |1 + \xA4\xD0 |1 + \xA4\xD1 |1 + \xA4\xD2 |1 + \xA4\xD3 |1 + \xA1\xCB |0 + \xA1\xCC |0 + \xA1\xFE |0 + \xA3\xFE |0 + \xA1\xCD |0 + \xA3\xDC |0 +END CHARMAP diff --git a/icuSources/data/mappings/windows-950-2000.ucm b/icuSources/data/mappings/windows-950-2000.ucm new file mode 100644 index 00000000..99df8798 --- /dev/null +++ b/icuSources/data/mappings/windows-950-2000.ucm @@ -0,0 +1,20378 @@ +# *************************************************************************** +# * +# * Copyright (C) 2001-2003, International Business Machines +# * Corporation and others. All Rights Reserved. +# * +# *************************************************************************** +# +# File created on Dec 03 13:48 Pacific Standard Time 2002 +# +# File created by genmucm tool. +# from windows 2000 using IMultiLanguage 5.50.4522.1800 +# +# Table Version : 1.0 +# The 1st column is the Unicode scalar value. +# The 2nd column is the codepage byte sequence. +# The 3rd column is the fallback indicator. +# The fallback indicator can have one of the following values: +# |0 for exact 1-1 roundtrip mapping +# |1 for the best fallback codepage byte sequence. +# |2 for the substitution character +# |3 for the best reverse fallback Unicode scaler value +# +# Encoding description: Chinese Traditional (Big5) +# Encoding name: big5 +# + "windows-950-2000" + 2 + 1 + "MBCS" + \x3F + "ASCII" +# Suggested ICU specific alias information +# "windows-950_VPUA" + + 0-80, 81-fe:1, ff + 40-7e, 80-fe + +# build an extension-only (delta) .cnv file +# requires the base .cnv file at runtime + "ibm-1373_P100-2002" + +# The following was the generated state table. +# This does not account for unassigned characters +# 0-80, 81-fe:1, ff +# 40-7e, a1-fe +# +CHARMAP + \x00 |0 + \x01 |0 + \x02 |0 + \x03 |0 + \x04 |0 + \x05 |0 + \x06 |0 + \x07 |0 + \x08 |0 + \x09 |0 + \x0A |0 + \x0B |0 + \x0C |0 + \x0D |0 + \x0E |0 + \x0F |0 + \x10 |0 + \x11 |0 + \x12 |0 + \x13 |0 + \x14 |0 + \x15 |0 + \x16 |0 + \x17 |0 + \x18 |0 + \x19 |0 + \x1A |0 + \x1B |0 + \x1C |0 + \x1D |0 + \x1E |0 + \x1F |0 + \x20 |0 + \x21 |0 + \x22 |0 + \x23 |0 + \x24 |0 + \x25 |0 + \x26 |0 + \x27 |0 + \x28 |0 + \x29 |0 + \x2A |0 + \x2B |0 + \x2C |0 + \x2D |0 + \x2E |0 + \x2F |0 + \x30 |0 + \x31 |0 + \x32 |0 + \x33 |0 + \x34 |0 + \x35 |0 + \x36 |0 + \x37 |0 + \x38 |0 + \x39 |0 + \x3A |0 + \x3B |0 + \x3C |0 + \x3D |0 + \x3E |0 + \x3F |0 + \x40 |0 + \x41 |0 + \x42 |0 + \x43 |0 + \x44 |0 + \x45 |0 + \x46 |0 + \x47 |0 + \x48 |0 + \x49 |0 + \x4A |0 + \x4B |0 + \x4C |0 + \x4D |0 + \x4E |0 + \x4F |0 + \x50 |0 + \x51 |0 + \x52 |0 + \x53 |0 + \x54 |0 + \x55 |0 + \x56 |0 + \x57 |0 + \x58 |0 + \x59 |0 + \x5A |0 + \x5B |0 + \x5C |0 + \x5D |0 + \x5E |0 + \x5F |0 + \x60 |0 + \x61 |0 + \x62 |0 + \x63 |0 + \x64 |0 + \x65 |0 + \x66 |0 + \x67 |0 + \x68 |0 + \x69 |0 + \x6A |0 + \x6B |0 + \x6C |0 + \x6D |0 + \x6E |0 + \x6F |0 + \x70 |0 + \x71 |0 + \x72 |0 + \x73 |0 + \x74 |0 + \x75 |0 + \x76 |0 + \x77 |0 + \x78 |0 + \x79 |0 + \x7A |0 + \x7B |0 + \x7C |0 + \x7D |0 + \x7E |0 + \x7F |0 + \x80 |0 + \x21 |1 + \xA2\x46 |1 + \xA2\x47 |1 + \xA2\x44 |1 + \x7C |1 + \xA1\xB1 |0 + \xA1\x4C |1 + \x63 |1 + \x61 |1 + \x2D |1 + \x52 |1 + \xA1\xC2 |0 + \xA2\x58 |0 + \xA1\xD3 |0 + \x32 |1 + \x33 |1 + \xA1\xA6 |1 + \xA3\x67 |1 + \xA1\x50 |0 + \xA1\x4D |1 + \x31 |1 + \x6F |1 + \x41 |1 + \x41 |1 + \x41 |1 + \x41 |1 + \x41 |1 + \x41 |1 + \x41 |1 + \x43 |1 + \x45 |1 + \x45 |1 + \x45 |1 + \x45 |1 + \x49 |1 + \x49 |1 + \x49 |1 + \x49 |1 + \x44 |1 + \x4E |1 + \x4F |1 + \x4F |1 + \x4F |1 + \x4F |1 + \x4F |1 + \xA1\xD1 |0 + \x4F |1 + \x55 |1 + \x55 |1 + \x55 |1 + \x55 |1 + \x59 |1 + \x54 |1 + \x73 |1 + \x61 |1 + \x61 |1 + \x61 |1 + \x61 |1 + \x61 |1 + \x61 |1 + \x61 |1 + \x63 |1 + \x65 |1 + \x65 |1 + \x65 |1 + \x65 |1 + \x69 |1 + \x69 |1 + \x69 |1 + \x69 |1 + \x65 |1 + \x6E |1 + \x6F |1 + \x6F |1 + \x6F |1 + \x6F |1 + \x6F |1 + \xA1\xD2 |0 + \x6F |1 + \x75 |1 + \x75 |1 + \x75 |1 + \x75 |1 + \x79 |1 + \x74 |1 + \x79 |1 + \xA3\xBE |0 + \xA3\xBC |0 + \xA3\xBD |0 + \xA3\xBF |0 + \xA1\xC5 |0 + \xA3\xBB |0 + \xA1\xC2 |1 + \xA3\x44 |0 + \xA3\x45 |0 + \xA3\x46 |0 + \xA3\x47 |0 + \xA3\x48 |0 + \xA3\x49 |0 + \xA3\x4A |0 + \xA3\x4B |0 + \xA3\x4C |0 + \xA3\x4D |0 + \xA3\x4E |0 + \xA3\x4F |0 + \xA3\x50 |0 + \xA3\x51 |0 + \xA3\x52 |0 + \xA3\x53 |0 + \xA3\x54 |0 + \xA3\x55 |0 + \xA3\x56 |0 + \xA3\x57 |0 + \xA3\x58 |0 + \xA3\x59 |0 + \xA3\x5A |0 + \xA3\x5B |0 + \xA3\x5C |0 + \xA3\x5D |0 + \xA3\x5E |0 + \xA3\x5F |0 + \xA3\x60 |0 + \xA3\x61 |0 + \xA3\x62 |0 + \xA3\x63 |0 + \xA3\x64 |0 + \xA3\x65 |0 + \xA3\x66 |0 + \xA3\x67 |0 + \xA3\x68 |0 + \xA3\x69 |0 + \xA3\x6A |0 + \xA3\x6B |0 + \xA3\x6C |0 + \xA3\x6D |0 + \xA3\x6E |0 + \xA3\x6F |0 + \xA3\x70 |0 + \xA3\x71 |0 + \xA3\x72 |0 + \xA3\x73 |0 + \xA1\x56 |0 + \xA1\x58 |0 + \xA2\x77 |1 + \xA1\xFC |1 + \xA1\xA5 |0 + \xA1\xA6 |0 + \xA1\xA7 |0 + \xA1\xA8 |0 + \xA1\x45 |1 + \xA3\xBB |1 + \xA1\x4C |0 + \xA1\x4B |0 + \xA1\x45 |0 + \xA1\xAC |0 + \xA1\xB2 |1 + \xA1\xAB |0 + \xA1\xB0 |0 + \xA1\xC3 |1 + \xA3\xE1 |0 + \xA2\x4A |0 + \xA1\xC1 |0 + \xA2\x4B |0 + \xA2\xB9 |0 + \xA2\xBA |0 + \xA2\xBB |0 + \xA2\xBC |0 + \xA2\xBD |0 + \xA2\xBE |0 + \xA2\xBF |0 + \xA2\xC0 |0 + \xA2\xC1 |0 + \xA2\xC2 |0 + \xA1\xF6 |0 + \xA1\xF4 |0 + \xA1\xF7 |0 + \xA1\xF5 |0 + \xA1\xF8 |0 + \xA1\xF9 |0 + \xA1\xFB |0 + \xA1\xFA |0 + \xA2\x41 |0 + \xA2\x42 |1 + \xA2\x58 |1 + \xA1\xD4 |0 + \xA1\xDB |0 + \xA1\xE8 |0 + \xA1\xE7 |0 + \xA1\xFD |0 + \xA1\xFC |0 + \xA1\xE4 |0 + \xA1\xE5 |0 + \xA1\xEC |0 + \xA1\xED |0 + \xA1\xEF |0 + \xA1\xEE |0 + \xA1\xDC |0 + \xA1\xDA |0 + \xA1\xDD |0 + \xA1\xDD |1 + \xA1\xD8 |0 + \xA1\xD9 |0 + \xA1\xF2 |0 + \xA1\xF3 |0 + \xA1\xE6 |0 + \xA1\xE9 |0 + \xA1\x5B |1 + \xA2\x77 |0 + \xA2\x78 |0 + \xA2\x7A |0 + \xA2\x7B |0 + \xA2\x7C |0 + \xA2\x7D |0 + \xA2\x75 |0 + \xA2\x74 |0 + \xA2\x73 |0 + \xA2\x72 |0 + \xA2\x71 |0 + \xA2\xA4 |3 + \xF9\xF9 |0 + \xF9\xF8 |0 + \xF9\xE6 |0 + \xF9\xEF |0 + \xF9\xDD |0 + \xF9\xE8 |0 + \xF9\xF1 |0 + \xF9\xDF |0 + \xF9\xEC |0 + \xF9\xF5 |0 + \xF9\xE3 |0 + \xF9\xEE |0 + \xF9\xF7 |0 + \xF9\xE5 |0 + \xA2\xA5 |3 + \xF9\xE9 |0 + \xF9\xF2 |0 + \xF9\xE0 |0 + \xA2\xA7 |3 + \xF9\xEB |0 + \xF9\xF4 |0 + \xF9\xE2 |0 + \xF9\xE7 |0 + \xF9\xF0 |0 + \xF9\xDE |0 + \xF9\xED |0 + \xF9\xF6 |0 + \xF9\xE4 |0 + \xA2\xA6 |3 + \xF9\xEA |0 + \xF9\xF3 |0 + \xF9\xE1 |0 + \xA2\x7E |0 + \xF9\xFA |3 + \xA2\xA1 |0 + \xF9\xFB |3 + \xA2\xA3 |0 + \xF9\xFD |3 + \xA2\xA2 |0 + \xF9\xFC |3 + \xA2\xAC |0 + \xA2\xAD |0 + \xA2\xAE |0 + \xA1\x5A |0 + \xA2\x62 |0 + \xA2\x63 |0 + \xA2\x64 |0 + \xA2\x65 |0 + \xA2\x66 |0 + \xA2\x67 |0 + \xA2\x68 |0 + \xA2\x69 |0 + \xA2\x70 |0 + \xA2\x6F |0 + \xA2\x6E |0 + \xA2\x6D |0 + \xA2\x6C |0 + \xA2\x6B |0 + \xA2\x6A |0 + \xF9\xFE |0 + \xA2\x76 |0 + \xA2\x79 |0 + \xA1\xBD |0 + \xA1\xBC |0 + \xA1\xB6 |0 + \xA1\xB5 |0 + \xA1\xBF |0 + \xA1\xBE |0 + \xA1\xBB |0 + \xA1\xBA |0 + \xA1\xB3 |0 + \xA1\xB7 |0 + \xA1\xB4 |0 + \xA2\xA8 |0 + \xA2\xA9 |0 + \xA2\xAB |0 + \xA2\xAA |0 + \xA1\xB9 |0 + \xA1\xB8 |0 + \xA1\xF3 |1 + \xA1\xF0 |0 + \xA1\xF2 |1 + \xA1\xF1 |0 + \xA1\x40 |0 + \xA1\x42 |0 + \xA1\x43 |0 + \xA1\xB2 |0 + \xA1\x71 |0 + \xA1\x72 |0 + \xA1\x6D |0 + \xA1\x6E |0 + \xA1\x75 |0 + \xA1\x76 |0 + \xA1\x79 |0 + \xA1\x7A |0 + \xA1\x69 |0 + \xA1\x6A |0 + \xA2\x45 |0 + \xA1\x65 |0 + \xA1\x66 |0 + \xA1\xE3 |1 + \xA1\xA9 |0 + \xA1\xAA |0 + \xA2\xC3 |0 + \xA2\xC4 |0 + \xA2\xC5 |0 + \xA2\xC6 |0 + \xA2\xC7 |0 + \xA2\xC8 |0 + \xA2\xC9 |0 + \xA2\xCA |0 + \xA2\xCB |0 + \xA1\xCA |1 + \xA3\x74 |0 + \xA3\x75 |0 + \xA3\x76 |0 + \xA3\x77 |0 + \xA3\x78 |0 + \xA3\x79 |0 + \xA3\x7A |0 + \xA3\x7B |0 + \xA3\x7C |0 + \xA3\x7D |0 + \xA3\x7E |0 + \xA3\xA1 |0 + \xA3\xA2 |0 + \xA3\xA3 |0 + \xA3\xA4 |0 + \xA3\xA5 |0 + \xA3\xA6 |0 + \xA3\xA7 |0 + \xA3\xA8 |0 + \xA3\xA9 |0 + \xA3\xAA |0 + \xA3\xAB |0 + \xA3\xAC |0 + \xA3\xAD |0 + \xA3\xAE |0 + \xA3\xAF |0 + \xA3\xB0 |0 + \xA3\xB1 |0 + \xA3\xB2 |0 + \xA3\xB3 |0 + \xA3\xB4 |0 + \xA3\xB5 |0 + \xA3\xB6 |0 + \xA3\xB7 |0 + \xA3\xB8 |0 + \xA3\xB9 |0 + \xA3\xBA |0 + \xA4\x40 |1 + \xA4\x47 |1 + \xA4\x54 |1 + \xA5\x7C |1 + \xA4\x57 |1 + \xA4\xA4 |1 + \xA4\x55 |1 + \xA5\xD2 |1 + \xA4\x41 |1 + \xA4\xFE |1 + \xA4\x42 |1 + \xA4\xD1 |1 + \xA6\x61 |1 + \xA4\x48 |1 + \xA4\x40 |1 + \xA4\x47 |1 + \xA4\x54 |1 + \xA5\x7C |1 + \xA4\xAD |1 + \xA4\xBB |1 + \xA4\x43 |1 + \xA4\x4B |1 + \xA4\x45 |1 + \xA4\x51 |1 + \xA4\xEB |1 + \xA4\xF5 |1 + \xA4\xF4 |1 + \xA4\xEC |1 + \xAA\xF7 |1 + \xA4\x67 |1 + \xA4\xE9 |1 + \xAE\xE8 |1 + \xA6\xB3 |1 + \xAA\xC0 |1 + \xA6\x57 |1 + \xAF\x53 |1 + \xB0\x5D |1 + \xAF\xAC |1 + \xB3\xD2 |1 + \xA5\x4E |1 + \xA9\x49 |1 + \xBE\xC7 |1 + \xBA\xCA |1 + \xA5\xF8 |1 + \xB8\xEA |1 + \xA8\xF3 |1 + \xB2\xBD |1 + \xA5\xF0 |1 + \xA6\xDB |1 + \xA6\xDC |1 + \xA4\x40 |1 + \xA4\x47 |1 + \xA4\x54 |1 + \xA5\x7C |1 + \xA4\xAD |1 + \xA4\xBB |1 + \xA4\x43 |1 + \xA4\x4B |1 + \xA4\x45 |1 + \xA4\x51 |1 + \xA4\xEB |1 + \xA4\xF5 |1 + \xA4\xF4 |1 + \xA4\xEC |1 + \xAA\xF7 |1 + \xA4\x67 |1 + \xA4\xE9 |1 + \xAE\xE8 |1 + \xA6\xB3 |1 + \xAA\xC0 |1 + \xA6\x57 |1 + \xAF\x53 |1 + \xB0\x5D |1 + \xAF\xAC |1 + \xB3\xD2 |1 + \xAF\xB5 |1 + \xA8\x6B |1 + \xA4\x6B |1 + \xBE\x41 |1 + \xC0\x75 |1 + \xA6\x4C |1 + \xAA\x60 |1 + \xB6\xB5 |1 + \xA5\xF0 |1 + \xBC\x67 |1 + \xA1\xC0 |0 + \xA4\x57 |1 + \xA4\xA4 |1 + \xA4\x55 |1 + \xA5\xAA |1 + \xA5\x6B |1 + \xC2\xE5 |1 + \xA9\x76 |1 + \xBE\xC7 |1 + \xBA\xCA |1 + \xA5\xF8 |1 + \xB8\xEA |1 + \xA8\xF3 |1 + \xA9\x5D |1 + \xA2\x55 |0 + \xA2\x56 |0 + \xA2\x50 |0 + \xA2\x51 |0 + \xA2\x52 |0 + \xA2\x54 |0 + \xA2\x57 |0 + \xA2\x53 |0 + \xA1\xEB |0 + \xA1\xEA |0 + \xA2\x4F |0 + \xA4\x40 |0 + \xA4\x42 |0 + \xA4\x43 |0 + \xC9\x45 |0 + \xA4\x56 |0 + \xA4\x54 |0 + \xA4\x57 |0 + \xA4\x55 |0 + \xC9\x46 |0 + \xA4\xA3 |0 + \xC9\x4F |0 + \xC9\x4D |0 + \xA4\xA2 |0 + \xA4\xA1 |0 + \xA5\x42 |0 + \xA5\x41 |0 + \xA5\x40 |0 + \xA5\x43 |0 + \xA4\xFE |0 + \xA5\xE0 |0 + \xA5\xE1 |0 + \xA8\xC3 |0 + \xA4\x58 |0 + \xA4\xA4 |0 + \xC9\x50 |0 + \xA4\xA5 |0 + \xC9\x63 |0 + \xA6\xEA |0 + \xCB\xB1 |0 + \xA4\x59 |0 + \xA4\xA6 |0 + \xA5\x44 |0 + \xC9\x64 |0 + \xC9\x40 |0 + \xA4\x44 |0 + \xA4\x5B |0 + \xC9\x47 |0 + \xA4\x5C |0 + \xA4\xA7 |0 + \xA5\x45 |0 + \xA5\x47 |0 + \xA5\x46 |0 + \xA5\xE2 |0 + \xA5\xE3 |0 + \xA8\xC4 |0 + \xAD\xBC |0 + \xA4\x41 |0 + \xC9\x41 |0 + \xA4\x45 |0 + \xA4\x5E |0 + \xA4\x5D |0 + \xA5\xE4 |0 + \xA8\xC5 |0 + \xB0\xAE |0 + \xD4\x4B |0 + \xB6\xC3 |0 + \xDC\xB1 |0 + \xDC\xB2 |0 + \xA4\x46 |0 + \xA4\xA9 |0 + \xA8\xC6 |0 + \xA4\x47 |0 + \xC9\x48 |0 + \xA4\x5F |0 + \xA4\xAA |0 + \xA4\xAC |0 + \xC9\x51 |0 + \xA4\xAD |0 + \xA4\xAB |0 + \xA5\xE5 |0 + \xA8\xC7 |0 + \xA8\xC8 |0 + \xAB\x45 |0 + \xA4\x60 |0 + \xA4\xAE |0 + \xA5\xE6 |0 + \xA5\xE8 |0 + \xA5\xE7 |0 + \xA6\xEB |0 + \xA8\xC9 |0 + \xA8\xCA |0 + \xAB\x46 |0 + \xAB\x47 |0 + \xAD\xBD |0 + \xDC\xB3 |0 + \xF6\xD6 |0 + \xA4\x48 |0 + \xA4\xB0 |0 + \xA4\xAF |0 + \xC9\x52 |0 + \xA4\xB1 |0 + \xA4\xB7 |0 + \xA4\xB2 |0 + \xA4\xB3 |0 + \xC9\x54 |0 + \xC9\x53 |0 + \xA4\xB5 |0 + \xA4\xB6 |0 + \xA4\xB4 |0 + \xA5\x4A |0 + \xA5\x4B |0 + \xA5\x4C |0 + \xA5\x4D |0 + \xA5\x49 |0 + \xA5\x50 |0 + \xC9\x6A |0 + \xC9\x66 |0 + \xC9\x69 |0 + \xA5\x51 |0 + \xA5\x61 |0 + \xC9\x68 |0 + \xA5\x4E |0 + \xA5\x4F |0 + \xA5\x48 |0 + \xC9\x65 |0 + \xC9\x67 |0 + \xA5\xF5 |0 + \xC9\xB0 |0 + \xA5\xF2 |0 + \xA5\xF6 |0 + \xC9\xBA |0 + \xC9\xAE |0 + \xA5\xF3 |0 + \xC9\xB2 |0 + \xA5\xF4 |0 + \xA5\xF7 |0 + \xA5\xE9 |0 + \xC9\xB1 |0 + \xA5\xF8 |0 + \xC9\xB5 |0 + \xC9\xB9 |0 + \xC9\xB6 |0 + \xC9\xB3 |0 + \xA5\xEA |0 + \xA5\xEC |0 + \xA5\xF9 |0 + \xA5\xEE |0 + \xC9\xAB |0 + \xA5\xF1 |0 + \xA5\xEF |0 + \xA5\xF0 |0 + \xC9\xBB |0 + \xC9\xB8 |0 + \xC9\xAF |0 + \xA5\xED |0 + \xC9\xAC |0 + \xA5\xEB |0 + \xC9\xB4 |0 + \xC9\xB7 |0 + \xC9\xAD |0 + \xCA\x66 |0 + \xA7\x42 |0 + \xA6\xF4 |0 + \xCA\x67 |0 + \xA6\xF1 |0 + \xA7\x44 |0 + \xA6\xF9 |0 + \xA6\xF8 |0 + \xCA\x5B |0 + \xA6\xFC |0 + \xA6\xF7 |0 + \xCA\x60 |0 + \xCA\x68 |0 + \xCA\x64 |0 + \xA6\xFA |0 + \xA6\xFD |0 + \xA6\xEE |0 + \xA7\x47 |0 + \xCA\x5D |0 + \xCB\xBD |0 + \xA6\xEC |0 + \xA7\x43 |0 + \xA6\xED |0 + \xA6\xF5 |0 + \xA6\xF6 |0 + \xCA\x62 |0 + \xCA\x5E |0 + \xA6\xFB |0 + \xA6\xF3 |0 + \xCA\x5A |0 + \xA6\xEF |0 + \xCA\x65 |0 + \xA7\x45 |0 + \xA7\x48 |0 + \xA6\xF2 |0 + \xA7\x40 |0 + \xA7\x46 |0 + \xA6\xF0 |0 + \xCA\x63 |0 + \xA7\x41 |0 + \xCA\x69 |0 + \xCA\x5C |0 + \xA6\xFE |0 + \xCA\x5F |0 + \xCA\x61 |0 + \xA8\xD8 |0 + \xCB\xBF |0 + \xCB\xCB |0 + \xA8\xD0 |0 + \xCB\xCC |0 + \xA8\xCB |0 + \xA8\xD5 |0 + \xA8\xCE |0 + \xCB\xB9 |0 + \xA8\xD6 |0 + \xCB\xB8 |0 + \xCB\xBC |0 + \xCB\xC3 |0 + \xCB\xC1 |0 + \xA8\xDE |0 + \xA8\xD9 |0 + \xCB\xB3 |0 + \xCB\xB5 |0 + \xA8\xDB |0 + \xA8\xCF |0 + \xCB\xB6 |0 + \xCB\xC2 |0 + \xCB\xC9 |0 + \xA8\xD4 |0 + \xCB\xBB |0 + \xCB\xB4 |0 + \xA8\xD3 |0 + \xCB\xB7 |0 + \xA8\xD7 |0 + \xCB\xBA |0 + \xA8\xD2 |0 + \xA8\xCD |0 + \xA8\xDC |0 + \xCB\xC4 |0 + \xA8\xDD |0 + \xCB\xC8 |0 + \xCB\xC6 |0 + \xCB\xCA |0 + \xA8\xDA |0 + \xCB\xBE |0 + \xCB\xB2 |0 + \xCB\xC0 |0 + \xA8\xD1 |0 + \xCB\xC5 |0 + \xA8\xCC |0 + \xCB\xC7 |0 + \xAB\x56 |0 + \xAB\x4A |0 + \xCD\xE0 |0 + \xCD\xE8 |0 + \xAB\x49 |0 + \xAB\x51 |0 + \xAB\x5D |0 + \xCD\xEE |0 + \xCD\xEC |0 + \xCD\xE7 |0 + \xAB\x4B |0 + \xCD\xED |0 + \xCD\xE3 |0 + \xAB\x59 |0 + \xAB\x50 |0 + \xAB\x58 |0 + \xCD\xDE |0 + \xCD\xEA |0 + \xCD\xE1 |0 + \xAB\x54 |0 + \xCD\xE2 |0 + \xCD\xDD |0 + \xAB\x5B |0 + \xAB\x4E |0 + \xAB\x57 |0 + \xAB\x4D |0 + \xCD\xDF |0 + \xCD\xE4 |0 + \xCD\xEB |0 + \xAB\x55 |0 + \xAB\x52 |0 + \xCD\xE6 |0 + \xAB\x5A |0 + \xCD\xE9 |0 + \xCD\xE5 |0 + \xAB\x4F |0 + \xAB\x5C |0 + \xAB\x53 |0 + \xAB\x4C |0 + \xAB\x48 |0 + \xCD\xEF |0 + \xAD\xD7 |0 + \xAD\xC1 |0 + \xAD\xD1 |0 + \xAD\xD6 |0 + \xD0\xD0 |0 + \xD0\xCF |0 + \xD0\xD4 |0 + \xD0\xD5 |0 + \xAD\xC4 |0 + \xAD\xCD |0 + \xAD\xDA |0 + \xAD\xCE |0 + \xD0\xC9 |0 + \xAD\xC7 |0 + \xD0\xCA |0 + \xAD\xDC |0 + \xAD\xD3 |0 + \xAD\xBE |0 + \xAD\xBF |0 + \xD0\xDD |0 + \xB0\xBF |0 + \xAD\xCC |0 + \xAD\xCB |0 + \xD0\xCB |0 + \xAD\xCF |0 + \xD4\x5B |0 + \xAD\xC6 |0 + \xD0\xD6 |0 + \xAD\xD5 |0 + \xAD\xD4 |0 + \xAD\xCA |0 + \xD0\xCE |0 + \xD0\xD7 |0 + \xD0\xC8 |0 + \xAD\xC9 |0 + \xD0\xD8 |0 + \xAD\xD2 |0 + \xD0\xCC |0 + \xAD\xC0 |0 + \xAD\xC3 |0 + \xAD\xC2 |0 + \xD0\xD9 |0 + \xAD\xD0 |0 + \xAD\xC5 |0 + \xAD\xD9 |0 + \xAD\xDB |0 + \xD0\xD3 |0 + \xAD\xD8 |0 + \xD0\xDB |0 + \xD0\xCD |0 + \xD0\xDC |0 + \xD0\xD1 |0 + \xD0\xDA |0 + \xD0\xD2 |0 + \xAD\xC8 |0 + \xD4\x63 |0 + \xD4\x57 |0 + \xB0\xB3 |0 + \xD4\x5C |0 + \xD4\x62 |0 + \xB0\xB2 |0 + \xD4\x55 |0 + \xB0\xB6 |0 + \xD4\x59 |0 + \xD4\x52 |0 + \xB0\xB4 |0 + \xD4\x56 |0 + \xB0\xB9 |0 + \xB0\xBE |0 + \xD4\x67 |0 + \xD4\x51 |0 + \xB0\xBA |0 + \xD4\x66 |0 + \xB0\xB5 |0 + \xD4\x58 |0 + \xB0\xB1 |0 + \xD4\x53 |0 + \xD4\x4F |0 + \xD4\x5D |0 + \xD4\x50 |0 + \xD4\x4E |0 + \xD4\x5A |0 + \xD4\x60 |0 + \xD4\x61 |0 + \xB0\xB7 |0 + \xD8\x5B |0 + \xD4\x5E |0 + \xD4\x4D |0 + \xD4\x5F |0 + \xB0\xC1 |0 + \xD4\x64 |0 + \xB0\xC0 |0 + \xD4\x4C |0 + \xD4\x54 |0 + \xD4\x65 |0 + \xB0\xBC |0 + \xB0\xBB |0 + \xB0\xB8 |0 + \xB0\xBD |0 + \xB0\xAF |0 + \xB0\xB0 |0 + \xB3\xC8 |0 + \xD8\x5E |0 + \xD8\x57 |0 + \xB3\xC5 |0 + \xD8\x5F |0 + \xD8\x55 |0 + \xD8\x58 |0 + \xB3\xC4 |0 + \xD8\x59 |0 + \xB3\xC7 |0 + \xD8\x5D |0 + \xD8\x53 |0 + \xD8\x52 |0 + \xB3\xC9 |0 + \xB3\xCA |0 + \xB3\xC6 |0 + \xB3\xCB |0 + \xD8\x51 |0 + \xD8\x5C |0 + \xD8\x5A |0 + \xD8\x54 |0 + \xB3\xC3 |0 + \xD8\x56 |0 + \xB6\xCA |0 + \xB6\xC4 |0 + \xDC\xB7 |0 + \xB6\xCD |0 + \xDC\xBD |0 + \xDC\xC0 |0 + \xB6\xC6 |0 + \xB6\xC7 |0 + \xDC\xBA |0 + \xB6\xC5 |0 + \xDC\xC3 |0 + \xB6\xCB |0 + \xDC\xC4 |0 + \xDC\xBF |0 + \xB6\xCC |0 + \xDC\xB4 |0 + \xB6\xC9 |0 + \xDC\xB5 |0 + \xDC\xBE |0 + \xDC\xBC |0 + \xDC\xB8 |0 + \xB6\xC8 |0 + \xDC\xB6 |0 + \xB6\xCE |0 + \xDC\xBB |0 + \xDC\xC2 |0 + \xDC\xB9 |0 + \xDC\xC1 |0 + \xB9\xB6 |0 + \xB9\xB3 |0 + \xB9\xB4 |0 + \xE0\xF9 |0 + \xE0\xF1 |0 + \xB9\xB2 |0 + \xB9\xAF |0 + \xE0\xF2 |0 + \xB9\xB1 |0 + \xE0\xF5 |0 + \xE0\xF7 |0 + \xE0\xFE |0 + \xE0\xFD |0 + \xE0\xF8 |0 + \xB9\xAE |0 + \xE0\xF0 |0 + \xB9\xAC |0 + \xE0\xF3 |0 + \xB9\xB7 |0 + \xE0\xF6 |0 + \xE0\xFA |0 + \xB9\xB0 |0 + \xB9\xAD |0 + \xE0\xFC |0 + \xE0\xFB |0 + \xB9\xB5 |0 + \xE0\xF4 |0 + \xBB\xF8 |0 + \xE4\xEC |0 + \xE4\xE9 |0 + \xBB\xF9 |0 + \xBB\xF7 |0 + \xE4\xF0 |0 + \xE4\xED |0 + \xE4\xE6 |0 + \xBB\xF6 |0 + \xBB\xFA |0 + \xE4\xE7 |0 + \xBB\xF5 |0 + \xBB\xFD |0 + \xE4\xEA |0 + \xE4\xEB |0 + \xBB\xFB |0 + \xBB\xFC |0 + \xE4\xF1 |0 + \xE4\xEE |0 + \xE4\xEF |0 + \xBE\xAA |0 + \xE8\xF8 |0 + \xBE\xA7 |0 + \xE8\xF5 |0 + \xBE\xA9 |0 + \xBE\xAB |0 + \xE8\xF6 |0 + \xBE\xA8 |0 + \xE8\xF7 |0 + \xE8\xF4 |0 + \xC0\x76 |0 + \xEC\xBD |0 + \xC0\x77 |0 + \xEC\xBB |0 + \xEC\xBC |0 + \xEC\xBA |0 + \xEC\xB9 |0 + \xEC\xBE |0 + \xC0\x75 |0 + \xEF\xB8 |0 + \xEF\xB9 |0 + \xE4\xE8 |0 + \xEF\xB7 |0 + \xC0\x78 |0 + \xC3\x5F |0 + \xF1\xEB |0 + \xF1\xEC |0 + \xC4\xD7 |0 + \xC4\xD8 |0 + \xF5\xC1 |0 + \xF5\xC0 |0 + \xC5\x6C |0 + \xC5\x6B |0 + \xF7\xD0 |0 + \xA4\x49 |0 + \xA4\x61 |0 + \xA4\xB9 |0 + \xA4\xB8 |0 + \xA5\x53 |0 + \xA5\x52 |0 + \xA5\xFC |0 + \xA5\xFB |0 + \xA5\xFD |0 + \xA5\xFA |0 + \xA7\x4A |0 + \xA7\x49 |0 + \xA7\x4B |0 + \xA8\xE0 |0 + \xA8\xDF |0 + \xA8\xE1 |0 + \xAB\x5E |0 + \xA2\x59 |0 + \xD0\xDE |0 + \xA2\x5A |0 + \xB0\xC2 |0 + \xA2\x5C |0 + \xA2\x5B |0 + \xD8\x60 |0 + \xA2\x5D |0 + \xB9\xB8 |0 + \xA2\x5E |0 + \xA4\x4A |0 + \xA4\xBA |0 + \xA5\xFE |0 + \xA8\xE2 |0 + \xA4\x4B |0 + \xA4\xBD |0 + \xA4\xBB |0 + \xA4\xBC |0 + \xA6\x40 |0 + \xA7\x4C |0 + \xA8\xE4 |0 + \xA8\xE3 |0 + \xA8\xE5 |0 + \xAD\xDD |0 + \xBE\xAC |0 + \xC9\x4E |0 + \xA5\x54 |0 + \xA5\x55 |0 + \xA6\x41 |0 + \xCA\x6A |0 + \xAB\x60 |0 + \xAB\x5F |0 + \xD0\xE0 |0 + \xD0\xDF |0 + \xB0\xC3 |0 + \xA4\xBE |0 + \xC9\x55 |0 + \xCB\xCD |0 + \xAB\x61 |0 + \xAD\xE0 |0 + \xAD\xDE |0 + \xAD\xDF |0 + \xBE\xAD |0 + \xA5\x56 |0 + \xA6\x42 |0 + \xC9\xBC |0 + \xA7\x4D |0 + \xA7\x4E |0 + \xCA\x6B |0 + \xCB\xCE |0 + \xA8\xE6 |0 + \xCB\xCF |0 + \xD0\xE2 |0 + \xD0\xE3 |0 + \xAD\xE3 |0 + \xD0\xE4 |0 + \xD0\xE1 |0 + \xAD\xE4 |0 + \xAD\xE2 |0 + \xAD\xE1 |0 + \xD0\xE5 |0 + \xD4\x68 |0 + \xD8\x61 |0 + \xDC\xC5 |0 + \xE1\x40 |0 + \xBB\xFE |0 + \xBE\xAE |0 + \xE8\xF9 |0 + \xA4\x4C |0 + \xA4\x5A |0 + \xB0\xC4 |0 + \xB3\xCD |0 + \xB9\xB9 |0 + \xC9\x42 |0 + \xA4\xBF |0 + \xA5\x59 |0 + \xA5\x57 |0 + \xA5\x58 |0 + \xA8\xE7 |0 + \xA4\x4D |0 + \xA4\x4E |0 + \xA4\x62 |0 + \xA4\xC0 |0 + \xA4\xC1 |0 + \xA4\xC2 |0 + \xC9\xBE |0 + \xA5\x5A |0 + \xC9\x6B |0 + \xA6\x46 |0 + \xC9\xBF |0 + \xA6\x44 |0 + \xA6\x45 |0 + \xC9\xBD |0 + \xA6\x47 |0 + \xA6\x43 |0 + \xCA\x6C |0 + \xAA\xEC |0 + \xCA\x6D |0 + \xCA\x6E |0 + \xA7\x50 |0 + \xA7\x4F |0 + \xA7\x53 |0 + \xA7\x51 |0 + \xA7\x52 |0 + \xA8\xED |0 + \xA8\xEC |0 + \xCB\xD4 |0 + \xCB\xD1 |0 + \xCB\xD2 |0 + \xCB\xD0 |0 + \xA8\xEE |0 + \xA8\xEA |0 + \xA8\xE9 |0 + \xA8\xEB |0 + \xA8\xE8 |0 + \xA8\xEF |0 + \xAB\x63 |0 + \xCD\xF0 |0 + \xCB\xD3 |0 + \xAB\x68 |0 + \xCD\xF1 |0 + \xAB\x64 |0 + \xAB\x67 |0 + \xAB\x66 |0 + \xAB\x65 |0 + \xAB\x62 |0 + \xD0\xE8 |0 + \xAD\xE7 |0 + \xD0\xEB |0 + \xAD\xE5 |0 + \xD0\xE7 |0 + \xAD\xE8 |0 + \xAD\xE6 |0 + \xAD\xE9 |0 + \xD0\xE9 |0 + \xD0\xEA |0 + \xD0\xE6 |0 + \xD0\xEC |0 + \xB3\xD1 |0 + \xB0\xC5 |0 + \xD4\x69 |0 + \xD4\x6B |0 + \xD4\x6A |0 + \xD4\x6C |0 + \xB0\xC6 |0 + \xB3\xCE |0 + \xB3\xCF |0 + \xB3\xD0 |0 + \xB6\xD0 |0 + \xDC\xC7 |0 + \xDC\xC6 |0 + \xDC\xC8 |0 + \xDC\xC9 |0 + \xB6\xD1 |0 + \xB6\xCF |0 + \xE1\x41 |0 + \xE1\x42 |0 + \xB9\xBB |0 + \xB9\xBA |0 + \xE3\x5A |0 + \xBC\x40 |0 + \xBC\x41 |0 + \xBC\x42 |0 + \xBC\x44 |0 + \xE4\xF2 |0 + \xE4\xF3 |0 + \xBC\x43 |0 + \xBE\xAF |0 + \xBE\xB0 |0 + \xF1\xED |0 + \xF5\xC3 |0 + \xF5\xC2 |0 + \xF7\xD1 |0 + \xA4\x4F |0 + \xA5\x5C |0 + \xA5\x5B |0 + \xA6\x48 |0 + \xC9\xC0 |0 + \xA7\x55 |0 + \xA7\x56 |0 + \xA7\x54 |0 + \xA7\x57 |0 + \xCA\x6F |0 + \xCA\x70 |0 + \xA8\xF1 |0 + \xCB\xD5 |0 + \xA8\xF0 |0 + \xCD\xF2 |0 + \xAB\x6C |0 + \xCD\xF3 |0 + \xAB\x6B |0 + \xAB\x69 |0 + \xAB\x6A |0 + \xD0\xED |0 + \xB0\xC7 |0 + \xD4\x6E |0 + \xB0\xCA |0 + \xD4\x6D |0 + \xB1\xE5 |0 + \xB0\xC9 |0 + \xB0\xC8 |0 + \xB3\xD4 |0 + \xB3\xD3 |0 + \xB3\xD2 |0 + \xB6\xD2 |0 + \xB6\xD5 |0 + \xB6\xD6 |0 + \xB6\xD4 |0 + \xB6\xD3 |0 + \xE1\x43 |0 + \xE1\x44 |0 + \xE4\xF5 |0 + \xBC\x45 |0 + \xE4\xF4 |0 + \xBE\xB1 |0 + \xEC\xBF |0 + \xC0\x79 |0 + \xF1\xEE |0 + \xC4\x55 |0 + \xA4\x63 |0 + \xA4\xC3 |0 + \xC9\x56 |0 + \xA4\xC4 |0 + \xA4\xC5 |0 + \xA5\x5D |0 + \xA5\x5E |0 + \xA6\x49 |0 + \xCA\x71 |0 + \xCB\xD6 |0 + \xCB\xD7 |0 + \xAB\x6D |0 + \xD0\xEE |0 + \xB0\xCC |0 + \xB0\xCB |0 + \xD8\x63 |0 + \xD8\x62 |0 + \xA4\x50 |0 + \xA4\xC6 |0 + \xA5\x5F |0 + \xB0\xCD |0 + \xC9\x43 |0 + \xC9\x6C |0 + \xA5\x60 |0 + \xC9\xC2 |0 + \xA6\x4B |0 + \xA6\x4A |0 + \xC9\xC1 |0 + \xA7\x58 |0 + \xAD\xEA |0 + \xD4\x6F |0 + \xB6\xD7 |0 + \xE1\x45 |0 + \xB9\xBC |0 + \xE8\xFA |0 + \xF3\xFD |0 + \xA4\xC7 |0 + \xCB\xD8 |0 + \xCD\xF4 |0 + \xB0\xD0 |0 + \xB0\xCE |0 + \xB0\xCF |0 + \xA2\xCC |3 + \xA4\x51 |0 + \xA4\x64 |0 + \xA2\xCD |0 + \xA2\xCE |3 + \xA4\xCA |0 + \xA4\xC9 |0 + \xA4\xC8 |0 + \xA5\x63 |0 + \xA5\x62 |0 + \xC9\x6D |0 + \xC9\xC3 |0 + \xA8\xF5 |0 + \xA8\xF2 |0 + \xA8\xF4 |0 + \xA8\xF3 |0 + \xAB\x6E |0 + \xB3\xD5 |0 + \xA4\x52 |0 + \xA4\xCB |0 + \xA5\x65 |0 + \xA5\x64 |0 + \xCA\x72 |0 + \xA8\xF6 |0 + \xC9\x57 |0 + \xA5\x67 |0 + \xA5\x66 |0 + \xA6\x4C |0 + \xA6\x4D |0 + \xCA\x73 |0 + \xA7\x59 |0 + \xA7\x5A |0 + \xA8\xF7 |0 + \xA8\xF8 |0 + \xA8\xF9 |0 + \xAB\x6F |0 + \xCD\xF5 |0 + \xAD\xEB |0 + \xC9\x44 |0 + \xA4\xCC |0 + \xC9\xC4 |0 + \xCA\x74 |0 + \xCA\x75 |0 + \xCB\xD9 |0 + \xCB\xDA |0 + \xCD\xF7 |0 + \xCD\xF6 |0 + \xCD\xF9 |0 + \xCD\xF8 |0 + \xAB\x70 |0 + \xD4\x70 |0 + \xAD\xED |0 + \xD0\xEF |0 + \xAD\xEC |0 + \xD8\x64 |0 + \xB3\xD6 |0 + \xD8\x65 |0 + \xE1\x46 |0 + \xB9\xBD |0 + \xBC\x46 |0 + \xF1\xEF |0 + \xC9\x58 |0 + \xA5\x68 |0 + \xB0\xD1 |0 + \xA4\x53 |0 + \xA4\x65 |0 + \xA4\xCE |0 + \xA4\xCD |0 + \xA4\xCF |0 + \xA8\xFB |0 + \xA8\xFA |0 + \xA8\xFC |0 + \xAB\x71 |0 + \xAD\xEE |0 + \xE8\xFB |0 + \xC2\x4F |0 + \xA4\x66 |0 + \xA5\x6A |0 + \xA5\x79 |0 + \xA5\x74 |0 + \xA5\x6F |0 + \xA5\x6E |0 + \xA5\x75 |0 + \xA5\x73 |0 + \xA5\x6C |0 + \xA5\x7A |0 + \xA5\x6D |0 + \xA5\x69 |0 + \xA5\x78 |0 + \xA5\x77 |0 + \xA5\x76 |0 + \xA5\x6B |0 + \xA5\x72 |0 + \xA5\x71 |0 + \xA5\x7B |0 + \xA5\x70 |0 + \xA6\x53 |0 + \xA6\x59 |0 + \xA6\x55 |0 + \xA6\x5B |0 + \xC9\xC5 |0 + \xA6\x58 |0 + \xA6\x4E |0 + \xA6\x51 |0 + \xA6\x54 |0 + \xA6\x50 |0 + \xA6\x57 |0 + \xA6\x5A |0 + \xA6\x4F |0 + \xA6\x52 |0 + \xA6\x56 |0 + \xA6\x5C |0 + \xCA\x7E |0 + \xCA\x7B |0 + \xA7\x67 |0 + \xCA\x7C |0 + \xA7\x5B |0 + \xA7\x5D |0 + \xA7\x75 |0 + \xA7\x70 |0 + \xCA\xA5 |0 + \xCA\x7D |0 + \xA7\x5F |0 + \xA7\x61 |0 + \xCA\xA4 |0 + \xA7\x68 |0 + \xCA\x78 |0 + \xA7\x74 |0 + \xA7\x76 |0 + \xA7\x5C |0 + \xA7\x6D |0 + \xCA\x76 |0 + \xA7\x73 |0 + \xA7\x64 |0 + \xA7\x6E |0 + \xA7\x6F |0 + \xCA\x77 |0 + \xA7\x6C |0 + \xA7\x6A |0 + \xA7\x6B |0 + \xA7\x71 |0 + \xCA\xA1 |0 + \xA7\x5E |0 + \xA7\x72 |0 + \xCA\xA3 |0 + \xA7\x66 |0 + \xA7\x63 |0 + \xCA\x7A |0 + \xA7\x62 |0 + \xCA\xA6 |0 + \xA7\x65 |0 + \xA7\x69 |0 + \xA7\x60 |0 + \xCA\xA2 |0 + \xCA\x79 |0 + \xCB\xEB |0 + \xCB\xEA |0 + \xA9\x4F |0 + \xCB\xED |0 + \xCB\xEF |0 + \xCB\xE4 |0 + \xCB\xE7 |0 + \xCB\xEE |0 + \xA9\x50 |0 + \xCB\xE1 |0 + \xCB\xE5 |0 + \xCB\xE9 |0 + \xCE\x49 |0 + \xA9\x4B |0 + \xCE\x4D |0 + \xA8\xFD |0 + \xCB\xE6 |0 + \xA8\xFE |0 + \xA9\x4C |0 + \xA9\x45 |0 + \xA9\x41 |0 + \xCB\xE2 |0 + \xA9\x44 |0 + \xA9\x49 |0 + \xA9\x52 |0 + \xCB\xE3 |0 + \xCB\xDC |0 + \xA9\x43 |0 + \xCB\xDD |0 + \xCB\xDF |0 + \xA9\x46 |0 + \xA9\x48 |0 + \xCB\xDB |0 + \xCB\xE0 |0 + \xA9\x51 |0 + \xA9\x4D |0 + \xCB\xE8 |0 + \xA9\x53 |0 + \xA9\x4A |0 + \xCB\xDE |0 + \xA9\x47 |0 + \xA9\x42 |0 + \xA9\x40 |0 + \xCB\xEC |0 + \xA9\x4E |0 + \xCE\x48 |0 + \xCD\xFB |0 + \xCE\x4B |0 + \xCD\xFD |0 + \xAB\x78 |0 + \xAB\xA8 |0 + \xAB\x74 |0 + \xAB\xA7 |0 + \xAB\x7D |0 + \xAB\xA4 |0 + \xAB\x72 |0 + \xCD\xFC |0 + \xCE\x43 |0 + \xAB\xA3 |0 + \xCE\x4F |0 + \xAB\xA5 |0 + \xAB\x79 |0 + \xCE\x45 |0 + \xCE\x42 |0 + \xAB\x77 |0 + \xCD\xFA |0 + \xAB\xA6 |0 + \xCE\x4A |0 + \xAB\x7C |0 + \xCE\x4C |0 + \xAB\xA9 |0 + \xAB\x73 |0 + \xAB\x7E |0 + \xAB\x7B |0 + \xCE\x40 |0 + \xAB\xA1 |0 + \xCE\x46 |0 + \xCE\x47 |0 + \xAB\x7A |0 + \xAB\xA2 |0 + \xAB\x76 |0 + \xAB\x75 |0 + \xCD\xFE |0 + \xCE\x44 |0 + \xCE\x4E |0 + \xD1\x44 |0 + \xAD\xFB |0 + \xD0\xF1 |0 + \xD0\xF6 |0 + \xAD\xF4 |0 + \xAE\x40 |0 + \xD0\xF4 |0 + \xAD\xEF |0 + \xAD\xF9 |0 + \xAD\xFE |0 + \xD0\xFB |0 + \xAD\xFA |0 + \xAD\xFD |0 + \xD0\xFE |0 + \xAD\xF5 |0 + \xD0\xF5 |0 + \xD1\x42 |0 + \xD1\x43 |0 + \xAD\xF7 |0 + \xD1\x41 |0 + \xAD\xF3 |0 + \xAE\x43 |0 + \xD0\xF8 |0 + \xAD\xF1 |0 + \xD1\x46 |0 + \xD0\xF9 |0 + \xD0\xFD |0 + \xAD\xF6 |0 + \xAE\x42 |0 + \xD0\xFA |0 + \xAD\xFC |0 + \xD1\x40 |0 + \xD1\x47 |0 + \xD4\xA1 |0 + \xD1\x45 |0 + \xAE\x44 |0 + \xAD\xF0 |0 + \xD0\xFC |0 + \xD0\xF3 |0 + \xAD\xF8 |0 + \xD0\xF2 |0 + \xD0\xF7 |0 + \xD0\xF0 |0 + \xAE\x41 |0 + \xD4\x77 |0 + \xB0\xE4 |0 + \xD4\xA7 |0 + \xB0\xE2 |0 + \xB0\xDF |0 + \xD4\x7C |0 + \xB0\xDB |0 + \xD4\xA2 |0 + \xB0\xE6 |0 + \xD4\x76 |0 + \xD4\x7B |0 + \xD4\x7A |0 + \xAD\xF2 |0 + \xB0\xE1 |0 + \xD4\xA5 |0 + \xD4\xA8 |0 + \xD4\x73 |0 + \xB3\xE8 |0 + \xD4\xA9 |0 + \xB0\xE7 |0 + \xB0\xD9 |0 + \xB0\xD6 |0 + \xD4\x7E |0 + \xB0\xD3 |0 + \xD4\xA6 |0 + \xB0\xDA |0 + \xD4\xAA |0 + \xD4\x74 |0 + \xD4\xA4 |0 + \xB0\xDD |0 + \xD4\x75 |0 + \xD4\x78 |0 + \xD4\x7D |0 + \xB0\xDE |0 + \xB0\xDC |0 + \xB0\xE8 |0 + \xB0\xE3 |0 + \xB0\xD7 |0 + \xB1\xD2 |0 + \xB0\xD8 |0 + \xD4\x79 |0 + \xB0\xE5 |0 + \xB0\xE0 |0 + \xD4\xA3 |0 + \xB0\xD5 |0 + \xB0\xD4 |0 + \xD4\x71 |0 + \xD4\x72 |0 + \xD8\x6A |0 + \xB3\xD7 |0 + \xB3\xDA |0 + \xD8\x75 |0 + \xB3\xEE |0 + \xD8\x78 |0 + \xB3\xD8 |0 + \xD8\x71 |0 + \xB3\xDE |0 + \xB3\xE4 |0 + \xB5\xBD |0 + \xB3\xE2 |0 + \xD8\x6E |0 + \xB3\xEF |0 + \xB3\xDB |0 + \xB3\xE3 |0 + \xD8\x76 |0 + \xDC\xD7 |0 + \xD8\x7B |0 + \xD8\x6F |0 + \xD8\x66 |0 + \xD8\x73 |0 + \xD8\x6D |0 + \xB3\xE1 |0 + \xD8\x79 |0 + \xB3\xDD |0 + \xB3\xF1 |0 + \xB3\xEA |0 + \xB3\xDF |0 + \xB3\xDC |0 + \xB3\xE7 |0 + \xD8\x7A |0 + \xD8\x6C |0 + \xD8\x72 |0 + \xD8\x74 |0 + \xD8\x68 |0 + \xD8\x77 |0 + \xB3\xD9 |0 + \xD8\x67 |0 + \xB3\xE0 |0 + \xB3\xF0 |0 + \xB3\xEC |0 + \xD8\x69 |0 + \xB3\xE6 |0 + \xB3\xED |0 + \xB3\xE9 |0 + \xB3\xE5 |0 + \xD8\x70 |0 + \xB3\xEB |0 + \xDC\xD5 |0 + \xDC\xD1 |0 + \xDC\xE0 |0 + \xDC\xCA |0 + \xDC\xD3 |0 + \xB6\xE5 |0 + \xB6\xE6 |0 + \xB6\xDE |0 + \xDC\xDC |0 + \xB6\xE8 |0 + \xDC\xCF |0 + \xDC\xCE |0 + \xDC\xCC |0 + \xDC\xDE |0 + \xB6\xDC |0 + \xDC\xD8 |0 + \xDC\xCD |0 + \xB6\xDF |0 + \xDC\xD6 |0 + \xB6\xDA |0 + \xDC\xD2 |0 + \xDC\xD9 |0 + \xDC\xDB |0 + \xDC\xDF |0 + \xB6\xE3 |0 + \xDC\xCB |0 + \xB6\xDD |0 + \xDC\xD0 |0 + \xB6\xD8 |0 + \xB6\xE4 |0 + \xDC\xDA |0 + \xB6\xE0 |0 + \xB6\xE1 |0 + \xB6\xE7 |0 + \xB6\xDB |0 + \xA2\x5F |0 + \xB6\xD9 |0 + \xDC\xD4 |0 + \xB6\xE2 |0 + \xDC\xDD |0 + \xB9\xCD |0 + \xB9\xC8 |0 + \xE1\x55 |0 + \xE1\x51 |0 + \xE1\x4B |0 + \xB9\xC2 |0 + \xB9\xBE |0 + \xE1\x54 |0 + \xB9\xBF |0 + \xE1\x4E |0 + \xE1\x50 |0 + \xE1\x53 |0 + \xB9\xC4 |0 + \xB9\xCB |0 + \xB9\xC5 |0 + \xE1\x49 |0 + \xB9\xC6 |0 + \xB9\xC7 |0 + \xE1\x4C |0 + \xB9\xCC |0 + \xE1\x4A |0 + \xE1\x4F |0 + \xB9\xC3 |0 + \xE1\x48 |0 + \xB9\xC9 |0 + \xB9\xC1 |0 + \xB9\xC0 |0 + \xE1\x4D |0 + \xE1\x52 |0 + \xB9\xCA |0 + \xE1\x47 |0 + \xBC\x4D |0 + \xE5\x47 |0 + \xE5\x44 |0 + \xBC\x47 |0 + \xBC\x53 |0 + \xBC\x54 |0 + \xBC\x4A |0 + \xE5\x42 |0 + \xBC\x4C |0 + \xE4\xF9 |0 + \xBC\x52 |0 + \xE5\x46 |0 + \xBC\x49 |0 + \xE5\x48 |0 + \xBC\x48 |0 + \xE5\x43 |0 + \xE5\x45 |0 + \xBC\x4B |0 + \xE5\x41 |0 + \xE4\xFA |0 + \xE4\xF7 |0 + \xD8\x6B |0 + \xE4\xFD |0 + \xE4\xF6 |0 + \xE4\xFC |0 + \xE4\xFB |0 + \xE4\xF8 |0 + \xBC\x4F |0 + \xBC\x4E |0 + \xBC\x50 |0 + \xE4\xFE |0 + \xBE\xB2 |0 + \xE5\x40 |0 + \xE9\x45 |0 + \xE8\xFD |0 + \xBE\xBE |0 + \xE9\x42 |0 + \xBE\xB6 |0 + \xBE\xBA |0 + \xE9\x41 |0 + \xBE\xB9 |0 + \xBE\xB5 |0 + \xBE\xB8 |0 + \xBE\xB3 |0 + \xBE\xBD |0 + \xE9\x43 |0 + \xE8\xFE |0 + \xBE\xBC |0 + \xE8\xFC |0 + \xBE\xBB |0 + \xE9\x44 |0 + \xE9\x40 |0 + \xBC\x51 |0 + \xBE\xBF |0 + \xE9\x46 |0 + \xBE\xB7 |0 + \xBE\xB4 |0 + \xEC\xC6 |0 + \xEC\xC8 |0 + \xC0\x7B |0 + \xEC\xC9 |0 + \xEC\xC7 |0 + \xEC\xC5 |0 + \xEC\xC4 |0 + \xC0\x7D |0 + \xEC\xC3 |0 + \xC0\x7E |0 + \xEC\xC1 |0 + \xEC\xC2 |0 + \xC0\x7A |0 + \xC0\xA1 |0 + \xC0\x7C |0 + \xEC\xC0 |0 + \xC2\x50 |0 + \xEF\xBC |0 + \xEF\xBA |0 + \xEF\xBF |0 + \xEF\xBD |0 + \xEF\xBB |0 + \xEF\xBE |0 + \xC3\x60 |0 + \xF1\xF2 |0 + \xF1\xF3 |0 + \xC4\x56 |0 + \xF1\xF4 |0 + \xF1\xF0 |0 + \xF1\xF5 |0 + \xF1\xF1 |0 + \xC2\x51 |0 + \xF3\xFE |0 + \xF4\x41 |0 + \xC4\x59 |0 + \xF4\x40 |0 + \xC4\x58 |0 + \xC4\x57 |0 + \xC4\x5A |0 + \xF5\xC5 |0 + \xF5\xC6 |0 + \xC4\xDA |0 + \xC4\xD9 |0 + \xC4\xDB |0 + \xF5\xC4 |0 + \xF6\xD8 |0 + \xF6\xD7 |0 + \xC5\x6D |0 + \xC5\x6F |0 + \xC5\x6E |0 + \xF6\xD9 |0 + \xC5\xC8 |0 + \xF8\xA6 |0 + \xC5\xF1 |0 + \xF8\xA5 |0 + \xF8\xEE |0 + \xC9\x49 |0 + \xA5\x7D |0 + \xA5\x7C |0 + \xA6\x5F |0 + \xA6\x5E |0 + \xC9\xC7 |0 + \xA6\x5D |0 + \xC9\xC6 |0 + \xA7\x79 |0 + \xCA\xA9 |0 + \xCA\xA8 |0 + \xA7\x77 |0 + \xA7\x7A |0 + \xCA\xA7 |0 + \xA7\x78 |0 + \xCB\xF0 |0 + \xCB\xF1 |0 + \xA9\x54 |0 + \xAB\xAA |0 + \xD1\x48 |0 + \xD1\x49 |0 + \xAE\x45 |0 + \xAE\x46 |0 + \xD4\xAC |0 + \xB0\xE9 |0 + \xB0\xEB |0 + \xD4\xAB |0 + \xB0\xEA |0 + \xD8\x7C |0 + \xB3\xF2 |0 + \xB6\xE9 |0 + \xB6\xEA |0 + \xDC\xE1 |0 + \xB9\xCF |0 + \xB9\xCE |0 + \xE5\x49 |0 + \xE9\x48 |0 + \xE9\x47 |0 + \xF9\x6B |0 + \xA4\x67 |0 + \xC9\x59 |0 + \xC9\x6E |0 + \xC9\x6F |0 + \xA6\x62 |0 + \xA6\x66 |0 + \xC9\xC9 |0 + \xA6\x64 |0 + \xA6\x63 |0 + \xC9\xC8 |0 + \xA6\x65 |0 + \xA6\x61 |0 + \xA6\x60 |0 + \xC9\xCA |0 + \xA7\xA6 |0 + \xA7\xA3 |0 + \xA7\x7D |0 + \xCA\xAA |0 + \xCA\xAB |0 + \xA7\xA1 |0 + \xCA\xAD |0 + \xA7\x7B |0 + \xCA\xAE |0 + \xCA\xAC |0 + \xA7\x7E |0 + \xA7\xA2 |0 + \xA7\xA5 |0 + \xA7\xA4 |0 + \xA7\x7C |0 + \xCA\xAF |0 + \xA9\x59 |0 + \xCB\xFE |0 + \xA9\x5B |0 + \xA9\x5A |0 + \xCC\x40 |0 + \xA9\x58 |0 + \xA9\x57 |0 + \xCB\xF5 |0 + \xCB\xF4 |0 + \xCB\xF2 |0 + \xCB\xF7 |0 + \xCB\xF6 |0 + \xCB\xF3 |0 + \xCB\xFC |0 + \xCB\xFD |0 + \xCB\xFA |0 + \xCB\xF8 |0 + \xA9\x56 |0 + \xCB\xFB |0 + \xA9\x5C |0 + \xCC\x41 |0 + \xCB\xF9 |0 + \xAB\xAB |0 + \xA9\x55 |0 + \xAB\xAC |0 + \xCE\x54 |0 + \xCE\x5A |0 + \xAB\xB2 |0 + \xCE\x58 |0 + \xCE\x5E |0 + \xCE\x55 |0 + \xCE\x59 |0 + \xCE\x5B |0 + \xCE\x5D |0 + \xCE\x57 |0 + \xCE\x56 |0 + \xCE\x51 |0 + \xCE\x52 |0 + \xAB\xAD |0 + \xAB\xAF |0 + \xAB\xAE |0 + \xCE\x53 |0 + \xCE\x5C |0 + \xAB\xB1 |0 + \xCE\x50 |0 + \xD1\x53 |0 + \xD1\x52 |0 + \xD1\x57 |0 + \xD1\x4E |0 + \xD1\x51 |0 + \xD1\x50 |0 + \xD1\x54 |0 + \xD1\x58 |0 + \xAE\x47 |0 + \xAE\x4A |0 + \xD1\x4F |0 + \xD1\x55 |0 + \xAE\x49 |0 + \xD1\x4A |0 + \xAB\xB0 |0 + \xD4\xBA |0 + \xD1\x56 |0 + \xD1\x4D |0 + \xAE\x48 |0 + \xD1\x4C |0 + \xD4\xB1 |0 + \xB0\xEC |0 + \xB0\xF0 |0 + \xD4\xC1 |0 + \xD4\xAF |0 + \xD4\xBD |0 + \xB0\xF1 |0 + \xD4\xBF |0 + \xD4\xC5 |0 + \xD4\xC9 |0 + \xD4\xC0 |0 + \xD4\xB4 |0 + \xD4\xBC |0 + \xD4\xCA |0 + \xD4\xC8 |0 + \xD4\xBE |0 + \xD4\xB9 |0 + \xD4\xB2 |0 + \xD8\xA6 |0 + \xD4\xB0 |0 + \xB0\xF5 |0 + \xD4\xB7 |0 + \xB0\xF6 |0 + \xB0\xF2 |0 + \xD4\xAD |0 + \xD4\xC3 |0 + \xD4\xB5 |0 + \xD4\xB3 |0 + \xD4\xC6 |0 + \xB0\xF3 |0 + \xD4\xCC |0 + \xB0\xED |0 + \xB0\xEF |0 + \xD4\xBB |0 + \xD4\xB6 |0 + \xAE\x4B |0 + \xB0\xEE |0 + \xD4\xB8 |0 + \xD4\xC7 |0 + \xD4\xCB |0 + \xD4\xC2 |0 + \xD4\xC4 |0 + \xD4\xAE |0 + \xD8\xA1 |0 + \xD8\xAA |0 + \xD8\xA9 |0 + \xB3\xFA |0 + \xD8\xA2 |0 + \xB3\xFB |0 + \xB3\xF9 |0 + \xD8\xA4 |0 + \xB3\xF6 |0 + \xD8\xA8 |0 + \xD8\xA3 |0 + \xD8\xA5 |0 + \xD8\x7D |0 + \xB3\xF4 |0 + \xD8\xB2 |0 + \xD8\xB1 |0 + \xD8\xAE |0 + \xB3\xF3 |0 + \xB3\xF7 |0 + \xB3\xF8 |0 + \xD1\x4B |0 + \xD8\xAB |0 + \xB3\xF5 |0 + \xB0\xF4 |0 + \xD8\xAD |0 + \xD8\x7E |0 + \xD8\xB0 |0 + \xD8\xAF |0 + \xD8\xB3 |0 + \xDC\xEF |0 + \xD8\xAC |0 + \xD8\xA7 |0 + \xDC\xE7 |0 + \xB6\xF4 |0 + \xB6\xF7 |0 + \xB6\xF2 |0 + \xDC\xE6 |0 + \xDC\xEA |0 + \xDC\xE5 |0 + \xB6\xEC |0 + \xB6\xF6 |0 + \xDC\xE2 |0 + \xB6\xF0 |0 + \xDC\xE9 |0 + \xB6\xEE |0 + \xB6\xED |0 + \xDC\xEC |0 + \xB6\xEF |0 + \xDC\xEE |0 + \xDC\xEB |0 + \xB6\xEB |0 + \xB6\xF5 |0 + \xDC\xF0 |0 + \xDC\xE4 |0 + \xDC\xED |0 + \xDC\xE3 |0 + \xB6\xF1 |0 + \xB6\xF3 |0 + \xDC\xE8 |0 + \xDC\xF1 |0 + \xE1\x5D |0 + \xB9\xD0 |0 + \xE1\x63 |0 + \xB9\xD5 |0 + \xE1\x5F |0 + \xE1\x66 |0 + \xE1\x57 |0 + \xB9\xD7 |0 + \xB9\xD1 |0 + \xE1\x5C |0 + \xBC\x55 |0 + \xE1\x5B |0 + \xE1\x64 |0 + \xB9\xD2 |0 + \xB9\xD6 |0 + \xE1\x5A |0 + \xE1\x60 |0 + \xE1\x65 |0 + \xE1\x56 |0 + \xB9\xD4 |0 + \xE1\x5E |0 + \xE1\x62 |0 + \xE1\x68 |0 + \xE1\x58 |0 + \xE1\x61 |0 + \xB9\xD3 |0 + \xE1\x67 |0 + \xE1\x59 |0 + \xBC\x59 |0 + \xE5\x4B |0 + \xBC\x57 |0 + \xBC\x56 |0 + \xE5\x4D |0 + \xE5\x52 |0 + \xE5\x4E |0 + \xE5\x51 |0 + \xBC\x5C |0 + \xBE\xA5 |0 + \xBC\x5B |0 + \xE5\x4A |0 + \xE5\x50 |0 + \xBC\x5A |0 + \xE5\x4F |0 + \xE5\x4C |0 + \xBC\x58 |0 + \xE9\x4D |0 + \xF9\xD9 |0 + \xE9\x4F |0 + \xE9\x4A |0 + \xBE\xC1 |0 + \xE9\x4C |0 + \xBE\xC0 |0 + \xE9\x4E |0 + \xBE\xC3 |0 + \xE9\x50 |0 + \xBE\xC2 |0 + \xE9\x49 |0 + \xE9\x4B |0 + \xC0\xA5 |0 + \xEC\xCC |0 + \xC0\xA4 |0 + \xEC\xCD |0 + \xC0\xA3 |0 + \xEC\xCB |0 + \xC0\xA2 |0 + \xEC\xCA |0 + \xC2\x53 |0 + \xC2\x52 |0 + \xF1\xF6 |0 + \xF1\xF8 |0 + \xF1\xF7 |0 + \xC3\x61 |0 + \xC3\x62 |0 + \xC3\x63 |0 + \xF4\x42 |0 + \xC4\x5B |0 + \xF7\xD3 |0 + \xF7\xD2 |0 + \xC5\xF2 |0 + \xA4\x68 |0 + \xA4\xD0 |0 + \xA7\xA7 |0 + \xCE\x5F |0 + \xB3\xFC |0 + \xB3\xFD |0 + \xDC\xF2 |0 + \xB9\xD8 |0 + \xE1\x69 |0 + \xE5\x53 |0 + \xC9\x5A |0 + \xCA\xB0 |0 + \xCC\x42 |0 + \xCE\x60 |0 + \xD1\x59 |0 + \xAE\x4C |0 + \xF1\xF9 |0 + \xC4\xDC |0 + \xA4\x69 |0 + \xA5\x7E |0 + \xC9\x70 |0 + \xA6\x67 |0 + \xA6\x68 |0 + \xA9\x5D |0 + \xB0\xF7 |0 + \xB9\xDA |0 + \xB9\xDB |0 + \xB9\xD9 |0 + \xA4\x6A |0 + \xA4\xD1 |0 + \xA4\xD3 |0 + \xA4\xD2 |0 + \xC9\x5B |0 + \xA4\xD4 |0 + \xA5\xA1 |0 + \xC9\x71 |0 + \xA5\xA2 |0 + \xA6\x69 |0 + \xA6\x6A |0 + \xC9\xCB |0 + \xA7\xA8 |0 + \xCA\xB1 |0 + \xA9\x61 |0 + \xCC\x43 |0 + \xA9\x5F |0 + \xA9\x60 |0 + \xA9\x5E |0 + \xD1\x5A |0 + \xAB\xB6 |0 + \xAB\xB5 |0 + \xAB\xB7 |0 + \xAB\xB4 |0 + \xCE\x61 |0 + \xA9\x62 |0 + \xAB\xB3 |0 + \xAE\x4D |0 + \xAE\x4E |0 + \xAE\x4F |0 + \xD4\xCD |0 + \xB3\xFE |0 + \xD8\xB4 |0 + \xB0\xF8 |0 + \xB6\xF8 |0 + \xB9\xDD |0 + \xB9\xDC |0 + \xE1\x6A |0 + \xBC\x5D |0 + \xBE\xC4 |0 + \xEF\xC0 |0 + \xF6\xDA |0 + \xF7\xD4 |0 + \xA4\x6B |0 + \xA5\xA3 |0 + \xA5\xA4 |0 + \xC9\xD1 |0 + \xA6\x6C |0 + \xA6\x6F |0 + \xC9\xCF |0 + \xC9\xCD |0 + \xA6\x6E |0 + \xC9\xD0 |0 + \xC9\xD2 |0 + \xC9\xCC |0 + \xA6\x71 |0 + \xA6\x70 |0 + \xA6\x6D |0 + \xA6\x6B |0 + \xC9\xCE |0 + \xA7\xB3 |0 + \xA7\xB0 |0 + \xCA\xB6 |0 + \xCA\xB9 |0 + \xCA\xB8 |0 + \xA7\xAA |0 + \xA7\xB2 |0 + \xA7\xAF |0 + \xCA\xB5 |0 + \xCA\xB3 |0 + \xA7\xAE |0 + \xA7\xA9 |0 + \xA7\xAC |0 + \xCA\xB4 |0 + \xCA\xBB |0 + \xCA\xB7 |0 + \xA7\xAD |0 + \xA7\xB1 |0 + \xA7\xB4 |0 + \xCA\xB2 |0 + \xCA\xBA |0 + \xA7\xAB |0 + \xA9\x67 |0 + \xA9\x6F |0 + \xCC\x4F |0 + \xCC\x48 |0 + \xA9\x70 |0 + \xCC\x53 |0 + \xCC\x44 |0 + \xCC\x4B |0 + \xA9\x66 |0 + \xCC\x45 |0 + \xA9\x64 |0 + \xCC\x4C |0 + \xCC\x50 |0 + \xA9\x63 |0 + \xCC\x51 |0 + \xCC\x4A |0 + \xCC\x4D |0 + \xA9\x72 |0 + \xA9\x69 |0 + \xCC\x54 |0 + \xCC\x52 |0 + \xA9\x6E |0 + \xA9\x6C |0 + \xCC\x49 |0 + \xA9\x6B |0 + \xCC\x47 |0 + \xCC\x46 |0 + \xA9\x6A |0 + \xA9\x68 |0 + \xA9\x71 |0 + \xA9\x6D |0 + \xA9\x65 |0 + \xCC\x4E |0 + \xAB\xB9 |0 + \xAB\xC0 |0 + \xCE\x6F |0 + \xAB\xB8 |0 + \xCE\x67 |0 + \xCE\x63 |0 + \xCE\x73 |0 + \xCE\x62 |0 + \xAB\xBB |0 + \xCE\x6C |0 + \xAB\xBE |0 + \xAB\xC1 |0 + \xAB\xBC |0 + \xCE\x70 |0 + \xAB\xBF |0 + \xAE\x56 |0 + \xCE\x76 |0 + \xCE\x64 |0 + \xCE\x66 |0 + \xCE\x6D |0 + \xCE\x71 |0 + \xCE\x75 |0 + \xCE\x72 |0 + \xCE\x6B |0 + \xCE\x6E |0 + \xCE\x68 |0 + \xAB\xC3 |0 + \xCE\x6A |0 + \xCE\x69 |0 + \xCE\x74 |0 + \xAB\xBA |0 + \xCE\x65 |0 + \xAB\xC2 |0 + \xAB\xBD |0 + \xAE\x5C |0 + \xD1\x62 |0 + \xAE\x5B |0 + \xD1\x60 |0 + \xAE\x50 |0 + \xAE\x55 |0 + \xD1\x5F |0 + \xD1\x5C |0 + \xD1\x61 |0 + \xAE\x51 |0 + \xD1\x5B |0 + \xAE\x54 |0 + \xAE\x52 |0 + \xD1\x63 |0 + \xAE\x53 |0 + \xAE\x57 |0 + \xAE\x58 |0 + \xAE\x5A |0 + \xAE\x59 |0 + \xD1\x5D |0 + \xD1\x5E |0 + \xD1\x64 |0 + \xD4\xD4 |0 + \xB0\xF9 |0 + \xD8\xC2 |0 + \xD4\xD3 |0 + \xD4\xE6 |0 + \xB1\x40 |0 + \xD4\xE4 |0 + \xB0\xFE |0 + \xB0\xFA |0 + \xD4\xED |0 + \xD4\xDD |0 + \xD4\xE0 |0 + \xB1\x43 |0 + \xD4\xEA |0 + \xD4\xE2 |0 + \xB0\xFB |0 + \xB1\x44 |0 + \xD4\xE7 |0 + \xD4\xE5 |0 + \xD4\xD6 |0 + \xD4\xEB |0 + \xD4\xDF |0 + \xD4\xDA |0 + \xD4\xD0 |0 + \xD4\xEC |0 + \xD4\xDC |0 + \xD4\xCF |0 + \xB1\x42 |0 + \xD4\xE1 |0 + \xD4\xEE |0 + \xD4\xDE |0 + \xD4\xD2 |0 + \xD4\xD7 |0 + \xD4\xCE |0 + \xB1\x41 |0 + \xD4\xDB |0 + \xD4\xD8 |0 + \xB0\xFC |0 + \xD4\xD1 |0 + \xD4\xE9 |0 + \xB0\xFD |0 + \xD4\xD9 |0 + \xD4\xD5 |0 + \xD4\xE8 |0 + \xB4\x40 |0 + \xD8\xBB |0 + \xD8\xB8 |0 + \xD8\xC9 |0 + \xD8\xBD |0 + \xD8\xCA |0 + \xB4\x42 |0 + \xD8\xC6 |0 + \xD8\xC3 |0 + \xD8\xC4 |0 + \xD8\xC7 |0 + \xD8\xCB |0 + \xD4\xE3 |0 + \xD8\xCD |0 + \xDD\x47 |0 + \xB4\x43 |0 + \xD8\xCE |0 + \xD8\xB6 |0 + \xD8\xC0 |0 + \xD8\xC5 |0 + \xB4\x41 |0 + \xB4\x44 |0 + \xD8\xCC |0 + \xD8\xCF |0 + \xD8\xBA |0 + \xD8\xB7 |0 + \xD8\xB9 |0 + \xD8\xBE |0 + \xD8\xBC |0 + \xB4\x45 |0 + \xD8\xC8 |0 + \xD8\xBF |0 + \xD8\xC1 |0 + \xD8\xB5 |0 + \xDC\xFA |0 + \xDC\xF8 |0 + \xB7\x42 |0 + \xB7\x40 |0 + \xDD\x43 |0 + \xDC\xF9 |0 + \xDD\x44 |0 + \xDD\x40 |0 + \xDC\xF7 |0 + \xDD\x46 |0 + \xDC\xF6 |0 + \xDC\xFD |0 + \xB6\xFE |0 + \xB6\xFD |0 + \xB6\xFC |0 + \xDC\xFB |0 + \xDD\x41 |0 + \xB6\xF9 |0 + \xB7\x41 |0 + \xDC\xF4 |0 + \xDC\xFE |0 + \xDC\xF3 |0 + \xDC\xFC |0 + \xB6\xFA |0 + \xDD\x42 |0 + \xDC\xF5 |0 + \xB6\xFB |0 + \xDD\x45 |0 + \xE1\x6E |0 + \xB9\xE2 |0 + \xB9\xE1 |0 + \xB9\xE3 |0 + \xE1\x7A |0 + \xE1\x70 |0 + \xE1\x76 |0 + \xE1\x6B |0 + \xE1\x79 |0 + \xE1\x78 |0 + \xE1\x7C |0 + \xE1\x75 |0 + \xB9\xDE |0 + \xE1\x74 |0 + \xB9\xE4 |0 + \xE1\x6D |0 + \xB9\xDF |0 + \xE1\x7B |0 + \xB9\xE0 |0 + \xE1\x6F |0 + \xE1\x72 |0 + \xE1\x77 |0 + \xE1\x71 |0 + \xE1\x6C |0 + \xE1\x73 |0 + \xE5\x55 |0 + \xBC\x61 |0 + \xE5\x58 |0 + \xE5\x57 |0 + \xE5\x5A |0 + \xE5\x5C |0 + \xF9\xDC |0 + \xBC\x5F |0 + \xE5\x56 |0 + \xE5\x54 |0 + \xE5\x5D |0 + \xE5\x5B |0 + \xE5\x59 |0 + \xE5\x5F |0 + \xE5\x5E |0 + \xBC\x63 |0 + \xBC\x5E |0 + \xBC\x60 |0 + \xBC\x62 |0 + \xE5\x60 |0 + \xE9\x57 |0 + \xE9\x56 |0 + \xE9\x55 |0 + \xE9\x58 |0 + \xE9\x51 |0 + \xE9\x52 |0 + \xE9\x5A |0 + \xE9\x53 |0 + \xBE\xC5 |0 + \xE9\x5C |0 + \xE9\x5B |0 + \xE9\x54 |0 + \xEC\xD1 |0 + \xC0\xA8 |0 + \xEC\xCF |0 + \xEC\xD4 |0 + \xEC\xD3 |0 + \xE9\x59 |0 + \xC0\xA7 |0 + \xEC\xD2 |0 + \xEC\xCE |0 + \xEC\xD6 |0 + \xEC\xD5 |0 + \xC0\xA6 |0 + \xEC\xD0 |0 + \xBE\xC6 |0 + \xC2\x54 |0 + \xEF\xC1 |0 + \xF1\xFA |0 + \xF1\xFB |0 + \xF1\xFC |0 + \xC4\x5C |0 + \xC4\x5D |0 + \xF4\x43 |0 + \xF5\xC8 |0 + \xF5\xC7 |0 + \xF6\xDB |0 + \xF6\xDC |0 + \xF7\xD5 |0 + \xF8\xA7 |0 + \xA4\x6C |0 + \xA4\x6D |0 + \xA4\x6E |0 + \xA4\xD5 |0 + \xA5\xA5 |0 + \xC9\xD3 |0 + \xA6\x72 |0 + \xA6\x73 |0 + \xA7\xB7 |0 + \xA7\xB8 |0 + \xA7\xB6 |0 + \xA7\xB5 |0 + \xA9\x73 |0 + \xCC\x55 |0 + \xA9\x75 |0 + \xA9\x74 |0 + \xCC\x56 |0 + \xAB\xC4 |0 + \xAE\x5D |0 + \xD1\x65 |0 + \xD4\xF0 |0 + \xB1\x45 |0 + \xB4\x47 |0 + \xD4\xEF |0 + \xB4\x46 |0 + \xB9\xE5 |0 + \xE1\x7D |0 + \xBE\xC7 |0 + \xC0\xA9 |0 + \xEC\xD7 |0 + \xC4\x5E |0 + \xC5\x70 |0 + \xC9\x72 |0 + \xA5\xA6 |0 + \xC9\x73 |0 + \xA6\x76 |0 + \xA6\x74 |0 + \xA6\x75 |0 + \xA6\x77 |0 + \xA7\xBA |0 + \xA7\xB9 |0 + \xCA\xBC |0 + \xA7\xBB |0 + \xCA\xBD |0 + \xCC\x57 |0 + \xCC\x58 |0 + \xA9\x76 |0 + \xA9\x78 |0 + \xA9\x7A |0 + \xA9\x77 |0 + \xA9\x7B |0 + \xA9\x79 |0 + \xAB\xC8 |0 + \xAB\xC5 |0 + \xAB\xC7 |0 + \xAB\xC9 |0 + \xAB\xC6 |0 + \xD1\x66 |0 + \xCE\x77 |0 + \xD1\x68 |0 + \xD1\x67 |0 + \xAE\x63 |0 + \xAE\x5F |0 + \xAE\x60 |0 + \xAE\x62 |0 + \xAE\x64 |0 + \xAE\x61 |0 + \xAE\x66 |0 + \xAE\x65 |0 + \xB1\x4A |0 + \xD4\xF2 |0 + \xD4\xF1 |0 + \xB1\x49 |0 + \xB1\x48 |0 + \xB1\x47 |0 + \xB1\x4B |0 + \xB1\x46 |0 + \xD8\xD5 |0 + \xD8\xD2 |0 + \xB4\x49 |0 + \xD8\xD1 |0 + \xD8\xD6 |0 + \xB4\x4B |0 + \xD8\xD4 |0 + \xB4\x48 |0 + \xB4\x4A |0 + \xD8\xD3 |0 + \xDD\x48 |0 + \xDD\x49 |0 + \xDD\x4A |0 + \xB9\xE6 |0 + \xB9\xEE |0 + \xE1\x7E |0 + \xB9\xE8 |0 + \xB9\xEC |0 + \xE1\xA1 |0 + \xB9\xED |0 + \xB9\xE9 |0 + \xB9\xEA |0 + \xB9\xE7 |0 + \xB9\xEB |0 + \xBC\x66 |0 + \xD8\xD0 |0 + \xBC\x67 |0 + \xBC\x65 |0 + \xBC\x64 |0 + \xE9\x5D |0 + \xBE\xC8 |0 + \xEC\xD8 |0 + \xEC\xD9 |0 + \xC3\x64 |0 + \xC4\x5F |0 + \xA4\x6F |0 + \xA6\x78 |0 + \xAB\xCA |0 + \xD1\x69 |0 + \xAE\x67 |0 + \xB1\x4E |0 + \xB1\x4D |0 + \xB1\x4C |0 + \xB4\x4C |0 + \xB4\x4D |0 + \xD8\xD7 |0 + \xB9\xEF |0 + \xBE\xC9 |0 + \xA4\x70 |0 + \xC9\x5C |0 + \xA4\xD6 |0 + \xC9\x74 |0 + \xC9\xD4 |0 + \xA6\x79 |0 + \xA9\x7C |0 + \xDD\x4B |0 + \xA4\x71 |0 + \xA4\xD7 |0 + \xC9\xD5 |0 + \xCA\xBE |0 + \xCA\xBF |0 + \xA7\xBC |0 + \xD8\xD8 |0 + \xB4\x4E |0 + \xDD\x4C |0 + \xC0\xAA |0 + \xA4\x72 |0 + \xA4\xA8 |0 + \xA4\xD8 |0 + \xC9\x75 |0 + \xA5\xA7 |0 + \xA7\xC0 |0 + \xA7\xBF |0 + \xA7\xBD |0 + \xA7\xBE |0 + \xCC\x59 |0 + \xA9\x7E |0 + \xA9\xA1 |0 + \xCC\x5A |0 + \xA9\x7D |0 + \xAB\xCE |0 + \xCE\x78 |0 + \xAB\xCD |0 + \xAB\xCB |0 + \xAB\xCC |0 + \xAE\x6A |0 + \xAE\x68 |0 + \xD1\x6B |0 + \xAE\x69 |0 + \xD1\x6A |0 + \xAE\x5E |0 + \xD4\xF3 |0 + \xB1\x50 |0 + \xB1\x51 |0 + \xB1\x4F |0 + \xB9\xF0 |0 + \xE1\xA2 |0 + \xBC\x68 |0 + \xBC\x69 |0 + \xE5\x61 |0 + \xC0\xAB |0 + \xEF\xC2 |0 + \xEF\xC3 |0 + \xC4\xDD |0 + \xF8\xA8 |0 + \xC9\x4B |0 + \xA4\xD9 |0 + \xA4\x73 |0 + \xC9\x77 |0 + \xC9\x76 |0 + \xA6\x7A |0 + \xC9\xD7 |0 + \xC9\xD8 |0 + \xC9\xD6 |0 + \xC9\xD9 |0 + \xCA\xC7 |0 + \xCA\xC2 |0 + \xCA\xC4 |0 + \xCA\xC6 |0 + \xCA\xC3 |0 + \xA7\xC4 |0 + \xCA\xC0 |0 + \xCA\xC1 |0 + \xA7\xC1 |0 + \xA7\xC2 |0 + \xCA\xC5 |0 + \xCA\xC8 |0 + \xA7\xC3 |0 + \xCA\xC9 |0 + \xCC\x68 |0 + \xCC\x62 |0 + \xCC\x5D |0 + \xA9\xA3 |0 + \xCC\x65 |0 + \xCC\x63 |0 + \xCC\x5C |0 + \xCC\x69 |0 + \xCC\x6C |0 + \xCC\x67 |0 + \xCC\x60 |0 + \xA9\xA5 |0 + \xCC\x66 |0 + \xA9\xA6 |0 + \xCC\x61 |0 + \xCC\x64 |0 + \xCC\x5B |0 + \xCC\x5F |0 + \xCC\x6B |0 + \xA9\xA7 |0 + \xA9\xA8 |0 + \xCC\x5E |0 + \xCC\x6A |0 + \xA9\xA2 |0 + \xA9\xA4 |0 + \xCE\xAB |0 + \xCE\xA4 |0 + \xCE\xAA |0 + \xCE\xA3 |0 + \xCE\xA5 |0 + \xCE\x7D |0 + \xCE\x7B |0 + \xCE\xAC |0 + \xCE\xA9 |0 + \xCE\x79 |0 + \xAB\xD0 |0 + \xCE\xA7 |0 + \xCE\xA8 |0 + \xCE\xA6 |0 + \xCE\x7C |0 + \xCE\x7A |0 + \xAB\xCF |0 + \xCE\xA2 |0 + \xCE\x7E |0 + \xCE\xA1 |0 + \xCE\xAD |0 + \xAE\x6F |0 + \xAE\x6E |0 + \xD1\x6C |0 + \xAE\x6B |0 + \xD1\x6E |0 + \xAE\x70 |0 + \xD1\x6F |0 + \xAE\x73 |0 + \xAE\x71 |0 + \xD1\x70 |0 + \xCE\xAE |0 + \xD1\x72 |0 + \xAE\x6D |0 + \xAE\x6C |0 + \xD1\x6D |0 + \xD1\x71 |0 + \xAE\x72 |0 + \xB1\x53 |0 + \xB1\x52 |0 + \xD4\xF5 |0 + \xD4\xF9 |0 + \xD4\xFB |0 + \xB1\x54 |0 + \xD4\xFE |0 + \xB1\x58 |0 + \xD5\x41 |0 + \xB1\x5A |0 + \xB1\x56 |0 + \xB1\x5E |0 + \xB1\x5B |0 + \xD4\xF7 |0 + \xB1\x55 |0 + \xD4\xF6 |0 + \xD4\xF4 |0 + \xD5\x43 |0 + \xD4\xF8 |0 + \xB1\x57 |0 + \xD5\x42 |0 + \xB1\x5C |0 + \xD4\xFD |0 + \xD4\xFC |0 + \xB1\x5D |0 + \xD4\xFA |0 + \xB1\x59 |0 + \xD5\x44 |0 + \xD5\x40 |0 + \xD8\xE7 |0 + \xD8\xEE |0 + \xD8\xE3 |0 + \xB4\x51 |0 + \xD8\xDF |0 + \xD8\xEF |0 + \xD8\xD9 |0 + \xD8\xEC |0 + \xD8\xEA |0 + \xD8\xE4 |0 + \xD8\xED |0 + \xD8\xE6 |0 + \xD8\xDE |0 + \xD8\xF0 |0 + \xD8\xDC |0 + \xD8\xE9 |0 + \xD8\xDA |0 + \xD8\xF1 |0 + \xB4\x52 |0 + \xD8\xEB |0 + \xDD\x4F |0 + \xD8\xDD |0 + \xB4\x4F |0 + \xD8\xE1 |0 + \xB4\x50 |0 + \xD8\xE0 |0 + \xD8\xE5 |0 + \xD8\xE2 |0 + \xD8\xE8 |0 + \xDD\x53 |0 + \xDD\x56 |0 + \xDD\x4E |0 + \xDD\x50 |0 + \xDD\x55 |0 + \xDD\x54 |0 + \xB7\x43 |0 + \xD8\xDB |0 + \xDD\x52 |0 + \xB7\x44 |0 + \xDD\x4D |0 + \xDD\x51 |0 + \xE1\xA9 |0 + \xE1\xB0 |0 + \xE1\xA7 |0 + \xE1\xAE |0 + \xE1\xA5 |0 + \xE1\xAD |0 + \xE1\xB1 |0 + \xE1\xA4 |0 + \xE1\xA8 |0 + \xE1\xA3 |0 + \xB9\xF1 |0 + \xE1\xA6 |0 + \xB9\xF2 |0 + \xE1\xAC |0 + \xE1\xAB |0 + \xE1\xAA |0 + \xE1\xAF |0 + \xE5\x65 |0 + \xE5\x67 |0 + \xBC\x6B |0 + \xE5\x68 |0 + \xE5\x63 |0 + \xE5\x62 |0 + \xE5\x6C |0 + \xE5\x6A |0 + \xBC\x6A |0 + \xE5\x6D |0 + \xE5\x64 |0 + \xE5\x69 |0 + \xE5\x6B |0 + \xE5\x66 |0 + \xE9\x61 |0 + \xE9\x66 |0 + \xE9\x60 |0 + \xE9\x65 |0 + \xE9\x5E |0 + \xE9\x68 |0 + \xE9\x64 |0 + \xE9\x69 |0 + \xE9\x63 |0 + \xE9\x5F |0 + \xE9\x67 |0 + \xE9\x6A |0 + \xE9\x62 |0 + \xEC\xDA |0 + \xC0\xAF |0 + \xC0\xAD |0 + \xC0\xAC |0 + \xC0\xAE |0 + \xEF\xC4 |0 + \xF1\x72 |0 + \xF1\xFD |0 + \xF4\x44 |0 + \xF4\x45 |0 + \xC4\x60 |0 + \xF5\xC9 |0 + \xC4\xDE |0 + \xF5\xCA |0 + \xF6\xDE |0 + \xC5\x72 |0 + \xC5\x71 |0 + \xF6\xDD |0 + \xC5\xC9 |0 + \xF7\xD6 |0 + \xA4\x74 |0 + \xA6\x7B |0 + \xC9\xDA |0 + \xCA\xCA |0 + \xA8\xB5 |0 + \xB1\x5F |0 + \xA4\x75 |0 + \xA5\xAA |0 + \xA5\xA9 |0 + \xA5\xA8 |0 + \xA7\xC5 |0 + \xAE\x74 |0 + \xDD\x57 |0 + \xA4\x76 |0 + \xA4\x77 |0 + \xA4\x78 |0 + \xA4\xDA |0 + \xAB\xD1 |0 + \xCE\xAF |0 + \xB4\x53 |0 + \xA4\x79 |0 + \xC9\x5D |0 + \xA5\xAB |0 + \xA5\xAC |0 + \xC9\x78 |0 + \xA6\x7C |0 + \xCA\xCB |0 + \xA7\xC6 |0 + \xCA\xCC |0 + \xA9\xAE |0 + \xCC\x6E |0 + \xA9\xAC |0 + \xA9\xAB |0 + \xCC\x6D |0 + \xA9\xA9 |0 + \xCC\x6F |0 + \xA9\xAA |0 + \xA9\xAD |0 + \xAB\xD2 |0 + \xAB\xD4 |0 + \xCE\xB3 |0 + \xCE\xB0 |0 + \xCE\xB1 |0 + \xCE\xB2 |0 + \xCE\xB4 |0 + \xAB\xD3 |0 + \xD1\x74 |0 + \xD1\x73 |0 + \xAE\x76 |0 + \xAE\x75 |0 + \xB1\x62 |0 + \xD5\x46 |0 + \xB1\x61 |0 + \xB1\x63 |0 + \xB1\x60 |0 + \xB4\x55 |0 + \xD5\x45 |0 + \xB4\x56 |0 + \xD8\xF3 |0 + \xB4\x57 |0 + \xD8\xF2 |0 + \xB4\x54 |0 + \xDD\x5A |0 + \xDD\x5C |0 + \xB7\x45 |0 + \xDD\x5B |0 + \xDD\x59 |0 + \xDD\x58 |0 + \xE1\xB4 |0 + \xB9\xF7 |0 + \xB9\xF5 |0 + \xB9\xF6 |0 + \xE1\xB2 |0 + \xE1\xB3 |0 + \xB9\xF3 |0 + \xE5\x71 |0 + \xE5\x6F |0 + \xBC\x6D |0 + \xE5\x70 |0 + \xBC\x6E |0 + \xBC\x6C |0 + \xB9\xF4 |0 + \xE9\x6D |0 + \xE9\x6B |0 + \xE9\x6C |0 + \xE5\x6E |0 + \xEC\xDC |0 + \xC0\xB0 |0 + \xEC\xDB |0 + \xEF\xC5 |0 + \xEF\xC6 |0 + \xE9\x6E |0 + \xF1\xFE |0 + \xA4\x7A |0 + \xA5\xAD |0 + \xA6\x7E |0 + \xC9\xDB |0 + \xA6\x7D |0 + \xA9\xAF |0 + \xB7\x46 |0 + \xA4\xDB |0 + \xA5\xAE |0 + \xAB\xD5 |0 + \xB4\x58 |0 + \xC9\x79 |0 + \xC9\x7A |0 + \xC9\xDC |0 + \xA7\xC8 |0 + \xCA\xD0 |0 + \xCA\xCE |0 + \xA7\xC9 |0 + \xCA\xCD |0 + \xCA\xCF |0 + \xCA\xD1 |0 + \xA7\xC7 |0 + \xA9\xB3 |0 + \xA9\xB4 |0 + \xA9\xB1 |0 + \xA9\xB0 |0 + \xCE\xB8 |0 + \xA9\xB2 |0 + \xAB\xD6 |0 + \xCE\xB7 |0 + \xCE\xB9 |0 + \xCE\xB6 |0 + \xCE\xBA |0 + \xAB\xD7 |0 + \xAE\x79 |0 + \xD1\x75 |0 + \xD1\x77 |0 + \xAE\x77 |0 + \xD1\x78 |0 + \xAE\x78 |0 + \xD1\x76 |0 + \xCE\xB5 |0 + \xD5\x47 |0 + \xD5\x4A |0 + \xD5\x4B |0 + \xD5\x48 |0 + \xB1\x67 |0 + \xB1\x66 |0 + \xB1\x64 |0 + \xB1\x65 |0 + \xD5\x49 |0 + \xB1\x68 |0 + \xB4\x5A |0 + \xB4\x5B |0 + \xB4\x5C |0 + \xDD\x5D |0 + \xDD\x5F |0 + \xDD\x61 |0 + \xB7\x48 |0 + \xB7\x47 |0 + \xB4\x59 |0 + \xDD\x60 |0 + \xDD\x5E |0 + \xE1\xB8 |0 + \xE1\xB6 |0 + \xE1\xBC |0 + \xB9\xF8 |0 + \xE1\xBD |0 + \xE1\xBA |0 + \xB9\xF9 |0 + \xE1\xB7 |0 + \xE1\xB5 |0 + \xE1\xBB |0 + \xBC\x70 |0 + \xE5\x73 |0 + \xE1\xB9 |0 + \xBC\x72 |0 + \xE5\x74 |0 + \xBC\x71 |0 + \xBC\x74 |0 + \xE5\x75 |0 + \xBC\x6F |0 + \xBC\x73 |0 + \xE9\x73 |0 + \xE9\x71 |0 + \xE9\x70 |0 + \xE9\x72 |0 + \xE9\x6F |0 + \xC3\x66 |0 + \xF4\x46 |0 + \xF4\x47 |0 + \xF5\xCB |0 + \xF6\xDF |0 + \xC6\x55 |0 + \xA9\xB5 |0 + \xA7\xCA |0 + \xAB\xD8 |0 + \xA4\x7B |0 + \xA4\xDC |0 + \xA5\xAF |0 + \xC9\xDD |0 + \xA7\xCB |0 + \xCA\xD2 |0 + \xCE\xBB |0 + \xAB\xD9 |0 + \xB9\xFA |0 + \xA4\x7C |0 + \xA6\xA1 |0 + \xB7\x49 |0 + \xA4\x7D |0 + \xA4\xDD |0 + \xA4\xDE |0 + \xA5\xB1 |0 + \xA5\xB0 |0 + \xC9\xDE |0 + \xA6\xA2 |0 + \xCA\xD3 |0 + \xA7\xCC |0 + \xCC\x71 |0 + \xCC\x72 |0 + \xCC\x73 |0 + \xA9\xB6 |0 + \xA9\xB7 |0 + \xCC\x70 |0 + \xA9\xB8 |0 + \xAB\xDA |0 + \xCE\xBC |0 + \xD1\x7A |0 + \xAE\x7A |0 + \xD1\x79 |0 + \xB1\x69 |0 + \xD5\x4C |0 + \xB1\x6A |0 + \xD5\x4D |0 + \xB4\x5D |0 + \xDD\x62 |0 + \xE1\xBF |0 + \xE1\xBE |0 + \xB9\xFB |0 + \xBC\x75 |0 + \xE5\x76 |0 + \xBE\xCA |0 + \xE9\x74 |0 + \xC0\xB1 |0 + \xC5\x73 |0 + \xF7\xD8 |0 + \xCC\x74 |0 + \xCE\xBD |0 + \xB1\x6B |0 + \xD8\xF4 |0 + \xB7\x4A |0 + \xC2\x55 |0 + \xA7\xCE |0 + \xA7\xCD |0 + \xAB\xDB |0 + \xD1\x7B |0 + \xB1\x6D |0 + \xB3\x43 |0 + \xB1\x6E |0 + \xB1\x6C |0 + \xB4\x5E |0 + \xE1\xC0 |0 + \xB9\xFC |0 + \xBC\x76 |0 + \xC9\x4C |0 + \xC9\xDF |0 + \xCA\xD5 |0 + \xA7\xCF |0 + \xCA\xD4 |0 + \xA7\xD0 |0 + \xA9\xBC |0 + \xCC\x77 |0 + \xCC\x76 |0 + \xA9\xBB |0 + \xA9\xB9 |0 + \xA9\xBA |0 + \xCC\x75 |0 + \xAB\xDD |0 + \xCE\xBE |0 + \xAB\xE0 |0 + \xAB\xDC |0 + \xAB\xE2 |0 + \xAB\xDE |0 + \xAB\xDF |0 + \xAB\xE1 |0 + \xAE\x7D |0 + \xAE\x7C |0 + \xAE\x7B |0 + \xD5\x4F |0 + \xB1\x6F |0 + \xB1\x72 |0 + \xB1\x70 |0 + \xD5\x4E |0 + \xB1\x75 |0 + \xB1\x71 |0 + \xD5\x50 |0 + \xB1\x74 |0 + \xB1\x73 |0 + \xD8\xF6 |0 + \xD8\xF5 |0 + \xB4\x61 |0 + \xB4\x5F |0 + \xB4\x60 |0 + \xD8\xF7 |0 + \xB7\x4B |0 + \xDD\x64 |0 + \xB7\x4C |0 + \xDD\x63 |0 + \xE5\x77 |0 + \xBC\x78 |0 + \xE1\xC1 |0 + \xBC\x77 |0 + \xB9\xFD |0 + \xEC\xDE |0 + \xE9\x75 |0 + \xC0\xB2 |0 + \xEC\xDD |0 + \xF2\x40 |0 + \xF4\x48 |0 + \xF4\x49 |0 + \xA4\xDF |0 + \xA5\xB2 |0 + \xC9\x7B |0 + \xA7\xD2 |0 + \xA7\xD4 |0 + \xC9\xE2 |0 + \xCA\xD8 |0 + \xCA\xD7 |0 + \xCA\xD6 |0 + \xC9\xE1 |0 + \xC9\xE0 |0 + \xA6\xA4 |0 + \xA7\xD3 |0 + \xA7\xD1 |0 + \xA6\xA3 |0 + \xA9\xBD |0 + \xCC\x78 |0 + \xA9\xBE |0 + \xCA\xDD |0 + \xCA\xDF |0 + \xCA\xDE |0 + \xCC\x79 |0 + \xCA\xDA |0 + \xA7\xD8 |0 + \xA7\xD6 |0 + \xCA\xD9 |0 + \xCA\xDB |0 + \xCA\xE1 |0 + \xA7\xD5 |0 + \xCA\xDC |0 + \xCA\xE5 |0 + \xA9\xC0 |0 + \xCA\xE2 |0 + \xA7\xD7 |0 + \xCA\xE0 |0 + \xCA\xE3 |0 + \xA9\xBF |0 + \xA9\xC1 |0 + \xCA\xE4 |0 + \xCC\xAF |0 + \xCC\xA2 |0 + \xCC\x7E |0 + \xCC\xAE |0 + \xCC\xA9 |0 + \xAB\xE7 |0 + \xA9\xC2 |0 + \xCC\xAA |0 + \xCC\xAD |0 + \xAB\xE3 |0 + \xCC\xAC |0 + \xA9\xC3 |0 + \xA9\xC8 |0 + \xA9\xC6 |0 + \xCC\xA3 |0 + \xCC\x7C |0 + \xCC\xA5 |0 + \xA9\xCD |0 + \xCC\xB0 |0 + \xAB\xE4 |0 + \xCC\xA6 |0 + \xAB\xE5 |0 + \xA9\xC9 |0 + \xCC\xA8 |0 + \xCE\xCD |0 + \xAB\xE6 |0 + \xCC\x7B |0 + \xA9\xCA |0 + \xAB\xE8 |0 + \xA9\xCB |0 + \xA9\xC7 |0 + \xA9\xCC |0 + \xCC\xA7 |0 + \xCC\x7A |0 + \xCC\xAB |0 + \xA9\xC4 |0 + \xCC\x7D |0 + \xCC\xA4 |0 + \xCC\xA1 |0 + \xA9\xC5 |0 + \xCE\xBF |0 + \xCE\xC0 |0 + \xCE\xCA |0 + \xD1\xA1 |0 + \xCE\xCB |0 + \xAB\xEE |0 + \xCE\xCE |0 + \xCE\xC4 |0 + \xAB\xED |0 + \xCE\xC6 |0 + \xCE\xC7 |0 + \xCE\xC9 |0 + \xAB\xE9 |0 + \xAE\xA3 |0 + \xF9\xDA |0 + \xCE\xC5 |0 + \xCE\xC1 |0 + \xAE\xA4 |0 + \xCE\xCF |0 + \xAE\x7E |0 + \xD1\x7D |0 + \xCE\xC8 |0 + \xD1\x7C |0 + \xCE\xC3 |0 + \xCE\xCC |0 + \xAB\xEC |0 + \xAE\xA1 |0 + \xAB\xF2 |0 + \xAE\xA2 |0 + \xCE\xD0 |0 + \xD1\x7E |0 + \xAB\xEB |0 + \xAE\xA6 |0 + \xAB\xF1 |0 + \xAB\xF0 |0 + \xAB\xEF |0 + \xAE\xA5 |0 + \xCE\xD1 |0 + \xAE\xA7 |0 + \xAB\xEA |0 + \xCE\xC2 |0 + \xB1\x76 |0 + \xD1\xA4 |0 + \xD1\xA6 |0 + \xD1\xA8 |0 + \xAE\xA8 |0 + \xAE\xAE |0 + \xD5\x53 |0 + \xD1\xAC |0 + \xD1\xA3 |0 + \xB1\x78 |0 + \xD5\x51 |0 + \xAE\xAD |0 + \xAE\xAB |0 + \xD1\xAE |0 + \xD5\x52 |0 + \xD1\xA5 |0 + \xAE\xAC |0 + \xD1\xA9 |0 + \xAE\xAF |0 + \xD1\xAB |0 + \xAE\xAA |0 + \xD1\xAA |0 + \xD1\xAD |0 + \xD1\xA7 |0 + \xAE\xA9 |0 + \xB1\x79 |0 + \xD1\xA2 |0 + \xB1\x77 |0 + \xB1\x7A |0 + \xD5\x55 |0 + \xD5\x5E |0 + \xB4\x64 |0 + \xB1\x7C |0 + \xB1\xA3 |0 + \xB4\x65 |0 + \xD5\x60 |0 + \xB1\xAA |0 + \xD8\xF9 |0 + \xD5\x56 |0 + \xB1\xA2 |0 + \xB1\xA5 |0 + \xB1\x7E |0 + \xD5\x54 |0 + \xD5\x62 |0 + \xD5\x65 |0 + \xD9\x49 |0 + \xD5\x63 |0 + \xD8\xFD |0 + \xB1\xA1 |0 + \xB1\xA8 |0 + \xB1\xAC |0 + \xD5\x5D |0 + \xD8\xF8 |0 + \xD5\x61 |0 + \xB1\x7B |0 + \xD8\xFA |0 + \xD5\x64 |0 + \xD8\xFC |0 + \xD5\x59 |0 + \xB4\x62 |0 + \xD5\x57 |0 + \xD5\x58 |0 + \xB1\xA7 |0 + \xB1\xA6 |0 + \xD5\x5B |0 + \xB1\xAB |0 + \xD5\x5F |0 + \xB1\xA4 |0 + \xD5\x5C |0 + \xB1\xA9 |0 + \xB4\x66 |0 + \xB4\x63 |0 + \xD8\xFB |0 + \xD5\x5A |0 + \xB1\x7D |0 + \xB4\x6B |0 + \xB4\x6F |0 + \xD9\x40 |0 + \xB7\x51 |0 + \xB4\x6D |0 + \xD9\x44 |0 + \xB4\x71 |0 + \xDD\x65 |0 + \xD9\x46 |0 + \xB7\x53 |0 + \xB4\x69 |0 + \xB4\x6C |0 + \xD9\x47 |0 + \xD9\x48 |0 + \xD9\x4E |0 + \xB4\x73 |0 + \xB7\x54 |0 + \xD9\x4A |0 + \xD9\x4F |0 + \xD9\x43 |0 + \xB7\x5E |0 + \xB7\x55 |0 + \xB4\x72 |0 + \xD9\x41 |0 + \xD9\x50 |0 + \xB7\x5D |0 + \xB4\x70 |0 + \xB7\x4E |0 + \xD9\x4D |0 + \xB4\x74 |0 + \xD9\x45 |0 + \xD8\xFE |0 + \xB4\x6A |0 + \xD9\x42 |0 + \xD9\x4B |0 + \xB7\x4D |0 + \xB7\x52 |0 + \xB4\x67 |0 + \xD9\x4C |0 + \xB7\x50 |0 + \xB4\x68 |0 + \xB7\x5C |0 + \xE1\xC3 |0 + \xDD\x70 |0 + \xDD\x68 |0 + \xE1\xC2 |0 + \xDD\x6C |0 + \xDD\x6E |0 + \xDD\x6B |0 + \xB7\x5B |0 + \xDD\x6A |0 + \xB7\x5F |0 + \xE1\xD2 |0 + \xB7\x5A |0 + \xBA\x40 |0 + \xDD\x71 |0 + \xE1\xC4 |0 + \xB7\x58 |0 + \xDD\x69 |0 + \xDD\x6D |0 + \xB9\xFE |0 + \xB7\x4F |0 + \xDD\x66 |0 + \xDD\x67 |0 + \xBA\x41 |0 + \xB7\x57 |0 + \xB7\x59 |0 + \xB7\x56 |0 + \xDD\x6F |0 + \xE1\xC8 |0 + \xE1\xC9 |0 + \xE1\xCE |0 + \xBC\x7D |0 + \xE1\xD5 |0 + \xBA\x47 |0 + \xBA\x46 |0 + \xE1\xD0 |0 + \xBC\x7C |0 + \xE1\xC5 |0 + \xBA\x45 |0 + \xE1\xD4 |0 + \xBA\x43 |0 + \xBA\x44 |0 + \xE1\xD1 |0 + \xE5\xAA |0 + \xBC\x7A |0 + \xB4\x6E |0 + \xE1\xD3 |0 + \xBC\xA3 |0 + \xE1\xCB |0 + \xBC\x7B |0 + \xBC\xA2 |0 + \xE1\xC6 |0 + \xE1\xCA |0 + \xE1\xC7 |0 + \xE1\xCD |0 + \xBA\x48 |0 + \xBC\x79 |0 + \xBA\x42 |0 + \xE5\x7A |0 + \xE1\xCF |0 + \xBC\xA1 |0 + \xBC\xA4 |0 + \xE1\xCC |0 + \xBC\x7E |0 + \xE5\x79 |0 + \xE5\x7E |0 + \xBE\xCE |0 + \xE5\x78 |0 + \xE9\xA3 |0 + \xE5\xA9 |0 + \xBC\xA8 |0 + \xBC\xA6 |0 + \xBE\xCC |0 + \xE5\xA6 |0 + \xE5\xA2 |0 + \xBC\xAC |0 + \xE9\x78 |0 + \xBC\xAA |0 + \xE5\xA1 |0 + \xE9\x76 |0 + \xE5\xA5 |0 + \xE5\xA8 |0 + \xE5\x7D |0 + \xBC\xAB |0 + \xBC\xA5 |0 + \xE9\x77 |0 + \xBE\xCD |0 + \xE5\xA7 |0 + \xBC\xA7 |0 + \xBC\xA9 |0 + \xE5\xA4 |0 + \xBC\xAD |0 + \xE5\xA3 |0 + \xE5\x7C |0 + \xE5\x7B |0 + \xBE\xCB |0 + \xE5\xAB |0 + \xE9\x7A |0 + \xEC\xE0 |0 + \xBE\xD0 |0 + \xE9\xA2 |0 + \xE9\x7E |0 + \xEC\xE1 |0 + \xBE\xD1 |0 + \xE9\xA1 |0 + \xE9\x7C |0 + \xC0\xB4 |0 + \xEC\xDF |0 + \xE9\x79 |0 + \xE9\x7B |0 + \xC0\xB5 |0 + \xBE\xD3 |0 + \xC0\xB3 |0 + \xBE\xD2 |0 + \xC0\xB7 |0 + \xE9\x7D |0 + \xBE\xCF |0 + \xEF\xCF |0 + \xEF\xC7 |0 + \xEC\xE7 |0 + \xEF\xC8 |0 + \xEC\xE3 |0 + \xC2\x56 |0 + \xEC\xE5 |0 + \xEC\xE4 |0 + \xC0\xB6 |0 + \xEC\xE2 |0 + \xEC\xE6 |0 + \xEF\xD0 |0 + \xEF\xCC |0 + \xEF\xCE |0 + \xEF\xC9 |0 + \xEF\xCA |0 + \xEF\xCD |0 + \xEF\xCB |0 + \xC3\x67 |0 + \xC3\x6A |0 + \xC3\x69 |0 + \xC3\x68 |0 + \xC4\x61 |0 + \xF4\x4A |0 + \xC4\x62 |0 + \xF2\x41 |0 + \xC4\xDF |0 + \xF5\xCC |0 + \xC4\xE0 |0 + \xC5\x74 |0 + \xC5\xCA |0 + \xF7\xD9 |0 + \xF7\xDA |0 + \xF7\xDB |0 + \xF9\xBA |0 + \xA4\xE0 |0 + \xC9\x7C |0 + \xA5\xB3 |0 + \xA6\xA6 |0 + \xA6\xA7 |0 + \xA6\xA5 |0 + \xA6\xA8 |0 + \xA7\xDA |0 + \xA7\xD9 |0 + \xCC\xB1 |0 + \xA9\xCF |0 + \xA9\xCE |0 + \xD1\xAF |0 + \xB1\xAD |0 + \xB1\xAE |0 + \xB4\x75 |0 + \xDD\x72 |0 + \xB7\x60 |0 + \xB7\x61 |0 + \xDD\x74 |0 + \xDD\x76 |0 + \xDD\x75 |0 + \xE1\xD7 |0 + \xE1\xD6 |0 + \xBA\x49 |0 + \xE1\xD8 |0 + \xE5\xAC |0 + \xBC\xAE |0 + \xBE\xD4 |0 + \xC0\xB8 |0 + \xC2\x57 |0 + \xC0\xB9 |0 + \xA4\xE1 |0 + \xCA\xE6 |0 + \xCC\xB2 |0 + \xA9\xD1 |0 + \xA9\xD0 |0 + \xA9\xD2 |0 + \xAB\xF3 |0 + \xCE\xD2 |0 + \xCE\xD3 |0 + \xD1\xB0 |0 + \xAE\xB0 |0 + \xB1\xAF |0 + \xB4\x76 |0 + \xD9\x51 |0 + \xA4\xE2 |0 + \xA4\x7E |0 + \xA4\xE3 |0 + \xC9\x7D |0 + \xA5\xB7 |0 + \xA5\xB6 |0 + \xA5\xB4 |0 + \xA5\xB5 |0 + \xA6\xAB |0 + \xC9\xE9 |0 + \xC9\xEB |0 + \xA6\xAA |0 + \xC9\xE3 |0 + \xC9\xE4 |0 + \xC9\xEA |0 + \xC9\xE6 |0 + \xC9\xE8 |0 + \xA6\xA9 |0 + \xC9\xE5 |0 + \xC9\xEC |0 + \xC9\xE7 |0 + \xA7\xE1 |0 + \xA7\xEA |0 + \xA7\xE8 |0 + \xCA\xF0 |0 + \xCA\xED |0 + \xCA\xF5 |0 + \xA7\xE6 |0 + \xCA\xF6 |0 + \xA7\xDF |0 + \xCA\xF3 |0 + \xA7\xE5 |0 + \xCA\xEF |0 + \xCA\xEE |0 + \xA7\xE3 |0 + \xCA\xF4 |0 + \xA7\xE4 |0 + \xA9\xD3 |0 + \xA7\xDE |0 + \xCA\xF1 |0 + \xCA\xE7 |0 + \xA7\xDB |0 + \xA7\xEE |0 + \xCA\xEC |0 + \xCA\xF2 |0 + \xA7\xE0 |0 + \xA7\xE2 |0 + \xCA\xE8 |0 + \xCA\xE9 |0 + \xCA\xEA |0 + \xA7\xED |0 + \xA7\xE7 |0 + \xA7\xEC |0 + \xCA\xEB |0 + \xA7\xEB |0 + \xA7\xDD |0 + \xA7\xDC |0 + \xA7\xE9 |0 + \xA9\xE1 |0 + \xCC\xBE |0 + \xCC\xB7 |0 + \xA9\xDC |0 + \xA9\xEF |0 + \xCC\xB3 |0 + \xCC\xBA |0 + \xCC\xBC |0 + \xCC\xBF |0 + \xA9\xEA |0 + \xCC\xBB |0 + \xCC\xB4 |0 + \xA9\xE8 |0 + \xCC\xB8 |0 + \xCC\xC0 |0 + \xA9\xD9 |0 + \xCC\xBD |0 + \xA9\xE3 |0 + \xA9\xE2 |0 + \xCC\xB6 |0 + \xA9\xD7 |0 + \xA9\xD8 |0 + \xA9\xD6 |0 + \xA9\xEE |0 + \xA9\xE6 |0 + \xA9\xE0 |0 + \xA9\xD4 |0 + \xCC\xB9 |0 + \xA9\xDF |0 + \xA9\xD5 |0 + \xA9\xE7 |0 + \xA9\xF0 |0 + \xCE\xD4 |0 + \xA9\xE4 |0 + \xCC\xB5 |0 + \xA9\xDA |0 + \xA9\xDD |0 + \xA9\xDE |0 + \xA9\xEC |0 + \xA9\xED |0 + \xA9\xEB |0 + \xA9\xE5 |0 + \xA9\xE9 |0 + \xA9\xDB |0 + \xAB\xF4 |0 + \xCE\xDA |0 + \xAC\x41 |0 + \xAB\xF8 |0 + \xAB\xFA |0 + \xAC\x40 |0 + \xCE\xE6 |0 + \xAB\xFD |0 + \xD1\xB1 |0 + \xAE\xB1 |0 + \xAC\x43 |0 + \xCE\xD7 |0 + \xCE\xDF |0 + \xAB\xFE |0 + \xCE\xDE |0 + \xCE\xDB |0 + \xCE\xE3 |0 + \xCE\xE5 |0 + \xAB\xF7 |0 + \xAB\xFB |0 + \xAC\x42 |0 + \xAE\xB3 |0 + \xCE\xE0 |0 + \xAB\xF9 |0 + \xAC\x45 |0 + \xCE\xD9 |0 + \xAB\xFC |0 + \xAE\xB2 |0 + \xAB\xF6 |0 + \xCE\xD6 |0 + \xCE\xDD |0 + \xCE\xD5 |0 + \xCE\xD8 |0 + \xCE\xDC |0 + \xD1\xB2 |0 + \xAC\x44 |0 + \xCE\xE1 |0 + \xCE\xE2 |0 + \xCE\xE4 |0 + \xAB\xF5 |0 + \xAE\xC1 |0 + \xD1\xBE |0 + \xAE\xBF |0 + \xAE\xC0 |0 + \xD1\xB4 |0 + \xD1\xC4 |0 + \xAE\xB6 |0 + \xD5\x66 |0 + \xD1\xC6 |0 + \xD1\xC0 |0 + \xD1\xB7 |0 + \xD1\xC9 |0 + \xD1\xBA |0 + \xAE\xBC |0 + \xD5\x7D |0 + \xD1\xBD |0 + \xAE\xBE |0 + \xAE\xB5 |0 + \xD1\xCB |0 + \xD1\xBF |0 + \xAE\xB8 |0 + \xD1\xB8 |0 + \xD1\xB5 |0 + \xD1\xB6 |0 + \xAE\xB9 |0 + \xD1\xC5 |0 + \xD1\xCC |0 + \xAE\xBB |0 + \xD1\xBC |0 + \xD1\xBB |0 + \xAE\xC3 |0 + \xAE\xC2 |0 + \xAE\xB4 |0 + \xAE\xBA |0 + \xAE\xBD |0 + \xD1\xC8 |0 + \xD1\xC2 |0 + \xAE\xB7 |0 + \xD1\xB3 |0 + \xD1\xCA |0 + \xD1\xC1 |0 + \xD1\xC3 |0 + \xD1\xC7 |0 + \xD5\x67 |0 + \xB1\xB7 |0 + \xB1\xCB |0 + \xB1\xCA |0 + \xB1\xBF |0 + \xD5\x79 |0 + \xD5\x75 |0 + \xD5\x72 |0 + \xD5\xA6 |0 + \xB1\xBA |0 + \xB1\xB2 |0 + \xD5\x77 |0 + \xB4\xA8 |0 + \xB1\xB6 |0 + \xD5\xA1 |0 + \xB1\xCC |0 + \xB1\xC9 |0 + \xD5\x7B |0 + \xD5\x6A |0 + \xB1\xC8 |0 + \xD5\xA3 |0 + \xD5\x69 |0 + \xB1\xBD |0 + \xB1\xC1 |0 + \xD5\xA2 |0 + \xD5\x73 |0 + \xB1\xC2 |0 + \xB1\xBC |0 + \xD5\x68 |0 + \xB4\x78 |0 + \xD5\xA5 |0 + \xD5\x71 |0 + \xB1\xC7 |0 + \xD5\x74 |0 + \xD5\xA4 |0 + \xB1\xC6 |0 + \xD9\x52 |0 + \xB1\xB3 |0 + \xD5\x6F |0 + \xB1\xB8 |0 + \xB1\xC3 |0 + \xB1\xBE |0 + \xD5\x78 |0 + \xD5\x6E |0 + \xD5\x6C |0 + \xD5\x7E |0 + \xB1\xB0 |0 + \xB1\xC4 |0 + \xB1\xB4 |0 + \xB4\x77 |0 + \xD5\x7C |0 + \xB1\xB5 |0 + \xB1\xB1 |0 + \xB1\xC0 |0 + \xB1\xBB |0 + \xB1\xB9 |0 + \xD5\x70 |0 + \xB1\xC5 |0 + \xD5\x6D |0 + \xD5\x7A |0 + \xD5\x76 |0 + \xD9\x54 |0 + \xD9\x53 |0 + \xD5\x6B |0 + \xD9\x64 |0 + \xB4\x7A |0 + \xD9\x6A |0 + \xD9\x59 |0 + \xD9\x67 |0 + \xDD\x77 |0 + \xB4\x7D |0 + \xD9\x6B |0 + \xD9\x6E |0 + \xB4\x7C |0 + \xD9\x5C |0 + \xD9\x6D |0 + \xD9\x6C |0 + \xB4\x7E |0 + \xD9\x55 |0 + \xB4\x79 |0 + \xB4\xA3 |0 + \xB4\xA1 |0 + \xD9\x69 |0 + \xD9\x5F |0 + \xB4\xA5 |0 + \xD9\x70 |0 + \xD9\x68 |0 + \xD9\x71 |0 + \xB4\xAD |0 + \xB4\xAB |0 + \xD9\x66 |0 + \xD9\x65 |0 + \xD9\x63 |0 + \xD9\x5D |0 + \xB4\xA4 |0 + \xB4\xA2 |0 + \xD1\xB9 |0 + \xD9\x56 |0 + \xDD\xB7 |0 + \xD9\x57 |0 + \xB4\x7B |0 + \xB4\xAA |0 + \xDD\x79 |0 + \xB4\xA6 |0 + \xB4\xA7 |0 + \xD9\x58 |0 + \xD9\x6F |0 + \xDD\x78 |0 + \xD9\x60 |0 + \xD9\x5B |0 + \xB4\xA9 |0 + \xD9\x61 |0 + \xD9\x5E |0 + \xB4\xAE |0 + \xB7\x70 |0 + \xDD\x7C |0 + \xDD\xB1 |0 + \xDD\xB6 |0 + \xDD\xAA |0 + \xB7\x6C |0 + \xDD\xBB |0 + \xB7\x69 |0 + \xDD\x7A |0 + \xDD\x7B |0 + \xB7\x62 |0 + \xB7\x6B |0 + \xDD\xA4 |0 + \xB7\x6E |0 + \xB7\x6F |0 + \xDD\xA5 |0 + \xDD\xB2 |0 + \xDD\xB8 |0 + \xB7\x6A |0 + \xB7\x64 |0 + \xDD\xA3 |0 + \xDD\x7D |0 + \xDD\xBA |0 + \xDD\xA8 |0 + \xDD\xA9 |0 + \xDD\x7E |0 + \xDD\xB4 |0 + \xDD\xAB |0 + \xDD\xB5 |0 + \xDD\xAD |0 + \xB7\x65 |0 + \xE1\xD9 |0 + \xB7\x68 |0 + \xB7\x66 |0 + \xDD\xB9 |0 + \xDD\xB0 |0 + \xDD\xAC |0 + \xDD\xA1 |0 + \xBA\x53 |0 + \xDD\xAF |0 + \xB7\x6D |0 + \xDD\xA7 |0 + \xDD\xA6 |0 + \xB7\x67 |0 + \xB7\x63 |0 + \xE1\xEE |0 + \xDD\xB3 |0 + \xDD\xAE |0 + \xDD\xA2 |0 + \xE1\xE9 |0 + \xE1\xDA |0 + \xE1\xE5 |0 + \xE1\xEC |0 + \xBA\x51 |0 + \xB4\xAC |0 + \xE1\xEA |0 + \xBA\x4C |0 + \xBA\x4B |0 + \xE1\xF1 |0 + \xE1\xDB |0 + \xE1\xE8 |0 + \xE1\xDC |0 + \xE1\xE7 |0 + \xBA\x4F |0 + \xE1\xEB |0 + \xD9\x62 |0 + \xE1\xF2 |0 + \xE1\xE3 |0 + \xBA\x52 |0 + \xE5\xBA |0 + \xBC\xAF |0 + \xE1\xF0 |0 + \xE1\xEF |0 + \xBA\x54 |0 + \xE5\xAD |0 + \xBC\xB0 |0 + \xE5\xAE |0 + \xE1\xDF |0 + \xE1\xE0 |0 + \xE1\xDD |0 + \xE1\xE2 |0 + \xE1\xDE |0 + \xE1\xF3 |0 + \xBA\x4E |0 + \xBC\xB1 |0 + \xBA\x50 |0 + \xBA\x55 |0 + \xE1\xE1 |0 + \xE1\xED |0 + \xE1\xE6 |0 + \xE5\xB1 |0 + \xBA\x4A |0 + \xBC\xB4 |0 + \xE9\xAA |0 + \xE5\xB6 |0 + \xE5\xB5 |0 + \xE5\xB7 |0 + \xE5\xB4 |0 + \xBC\xB5 |0 + \xBC\xBB |0 + \xBC\xB8 |0 + \xBC\xB9 |0 + \xE5\xAF |0 + \xE5\xB2 |0 + \xE5\xBC |0 + \xBC\xC1 |0 + \xBC\xBF |0 + \xE5\xB3 |0 + \xD9\x5A |0 + \xBC\xB2 |0 + \xE5\xB9 |0 + \xE5\xB0 |0 + \xBC\xC2 |0 + \xE5\xB8 |0 + \xBA\x4D |0 + \xBC\xB7 |0 + \xE1\xE4 |0 + \xBC\xBA |0 + \xBC\xBE |0 + \xBC\xC0 |0 + \xBC\xBD |0 + \xBC\xBC |0 + \xBC\xB6 |0 + \xE5\xBB |0 + \xBC\xB3 |0 + \xBC\xC3 |0 + \xBE\xD8 |0 + \xBE\xD9 |0 + \xE9\xA9 |0 + \xBE\xE2 |0 + \xBE\xDF |0 + \xBE\xD6 |0 + \xBE\xDD |0 + \xE9\xAB |0 + \xBE\xDB |0 + \xBE\xD5 |0 + \xBE\xDC |0 + \xE9\xA8 |0 + \xC0\xBB |0 + \xBE\xD7 |0 + \xBE\xDE |0 + \xC0\xBA |0 + \xE9\xA7 |0 + \xE9\xA6 |0 + \xBE\xE0 |0 + \xBE\xE1 |0 + \xE9\xA5 |0 + \xE9\xA4 |0 + \xC0\xBC |0 + \xE9\xAE |0 + \xBE\xDA |0 + \xE9\xAC |0 + \xC0\xBD |0 + \xC0\xC2 |0 + \xEC\xEA |0 + \xEC\xEC |0 + \xC0\xBF |0 + \xEC\xED |0 + \xEC\xE9 |0 + \xEC\xEB |0 + \xC0\xC0 |0 + \xC0\xC3 |0 + \xEC\xE8 |0 + \xC0\xBE |0 + \xC0\xC1 |0 + \xC2\x59 |0 + \xE9\xAD |0 + \xC2\x58 |0 + \xC2\x5E |0 + \xEF\xD4 |0 + \xC2\x5C |0 + \xC2\x5D |0 + \xEF\xD7 |0 + \xEF\xD3 |0 + \xC2\x5A |0 + \xEF\xD1 |0 + \xC3\x6B |0 + \xEF\xD5 |0 + \xEF\xD6 |0 + \xEF\xD2 |0 + \xC2\x5B |0 + \xF2\x42 |0 + \xF2\x45 |0 + \xF2\x46 |0 + \xF2\x44 |0 + \xF2\x47 |0 + \xC3\x6C |0 + \xF2\x43 |0 + \xF4\x4E |0 + \xC4\x64 |0 + \xF4\x4D |0 + \xF4\x4C |0 + \xF4\x4B |0 + \xC4\x63 |0 + \xC4\x65 |0 + \xF5\xCD |0 + \xC4\xE2 |0 + \xC4\xE1 |0 + \xF6\xE1 |0 + \xF6\xE0 |0 + \xF6\xE3 |0 + \xC5\xCB |0 + \xC5\x75 |0 + \xF7\xDD |0 + \xF6\xE2 |0 + \xF7\xDC |0 + \xC5\xCD |0 + \xC5\xCC |0 + \xC5\xF3 |0 + \xF8\xA9 |0 + \xF8\xEF |0 + \xA4\xE4 |0 + \xD9\x72 |0 + \xE9\xAF |0 + \xA6\xAC |0 + \xCA\xF7 |0 + \xA7\xF1 |0 + \xA7\xEF |0 + \xA7\xF0 |0 + \xCC\xC1 |0 + \xA9\xF1 |0 + \xAC\x46 |0 + \xCE\xE7 |0 + \xCE\xE8 |0 + \xAC\x47 |0 + \xD1\xCE |0 + \xAE\xC4 |0 + \xAE\xC5 |0 + \xD1\xCD |0 + \xB1\xD3 |0 + \xB1\xCF |0 + \xD5\xA7 |0 + \xB1\xD6 |0 + \xB1\xD5 |0 + \xB1\xCE |0 + \xB1\xD1 |0 + \xB1\xD4 |0 + \xB1\xD0 |0 + \xD9\x76 |0 + \xB1\xCD |0 + \xB4\xAF |0 + \xB4\xB1 |0 + \xB4\xB2 |0 + \xD9\x75 |0 + \xD9\x78 |0 + \xB4\xB0 |0 + \xD9\x73 |0 + \xD9\x77 |0 + \xD9\x74 |0 + \xB7\x71 |0 + \xDD\xBC |0 + \xBA\x56 |0 + \xE1\xF4 |0 + \xBE\xE3 |0 + \xBC\xC4 |0 + \xE5\xBD |0 + \xBC\xC5 |0 + \xBC\xC6 |0 + \xE5\xBF |0 + \xE5\xBE |0 + \xE5\xC0 |0 + \xE9\xB1 |0 + \xE9\xB0 |0 + \xEC\xEF |0 + \xEC\xEE |0 + \xC0\xC4 |0 + \xC0\xC5 |0 + \xF2\x48 |0 + \xA4\xE5 |0 + \xD9\x79 |0 + \xB4\xB4 |0 + \xB4\xB3 |0 + \xDD\xBD |0 + \xEF\xD8 |0 + \xC4\xE3 |0 + \xF7\xDE |0 + \xA4\xE6 |0 + \xAE\xC6 |0 + \xB1\xD8 |0 + \xB1\xD7 |0 + \xD9\x7A |0 + \xD9\x7B |0 + \xB7\x72 |0 + \xE1\xF5 |0 + \xBA\x57 |0 + \xE9\xB2 |0 + \xA4\xE7 |0 + \xA5\xB8 |0 + \xA9\xF2 |0 + \xCC\xC2 |0 + \xCE\xE9 |0 + \xAC\x48 |0 + \xB1\xD9 |0 + \xD9\x7C |0 + \xB4\xB5 |0 + \xB7\x73 |0 + \xE5\xC1 |0 + \xE5\xC2 |0 + \xEC\xF0 |0 + \xC2\x5F |0 + \xF8\xF0 |0 + \xA4\xE8 |0 + \xCC\xC3 |0 + \xA9\xF3 |0 + \xAC\x49 |0 + \xCE\xEA |0 + \xAE\xC7 |0 + \xD1\xD2 |0 + \xD1\xD0 |0 + \xD1\xD1 |0 + \xAE\xC8 |0 + \xD1\xCF |0 + \xB1\xDB |0 + \xB1\xDC |0 + \xD5\xA8 |0 + \xB1\xDD |0 + \xB1\xDA |0 + \xD9\x7D |0 + \xD9\x7E |0 + \xDD\xBE |0 + \xBA\x59 |0 + \xBA\x58 |0 + \xEC\xF1 |0 + \xEF\xD9 |0 + \xF2\x4A |0 + \xF2\x49 |0 + \xF4\x4F |0 + \xC9\x5E |0 + \xAC\x4A |0 + \xA4\xE9 |0 + \xA5\xB9 |0 + \xA6\xAE |0 + \xA6\xAD |0 + \xA6\xAF |0 + \xA6\xB0 |0 + \xC9\xEE |0 + \xC9\xED |0 + \xCA\xF8 |0 + \xA7\xF2 |0 + \xCA\xFB |0 + \xCA\xFA |0 + \xCA\xF9 |0 + \xCA\xFC |0 + \xA9\xF4 |0 + \xCC\xC9 |0 + \xCC\xC5 |0 + \xCC\xCE |0 + \xA9\xFB |0 + \xA9\xF9 |0 + \xCC\xCA |0 + \xCC\xC6 |0 + \xCC\xCD |0 + \xA9\xF8 |0 + \xAA\x40 |0 + \xCC\xC8 |0 + \xCC\xC4 |0 + \xA9\xFE |0 + \xCC\xCB |0 + \xA9\xF7 |0 + \xCC\xCC |0 + \xA9\xFA |0 + \xA9\xFC |0 + \xCC\xD0 |0 + \xCC\xCF |0 + \xCC\xC7 |0 + \xA9\xF6 |0 + \xA9\xF5 |0 + \xA9\xFD |0 + \xCE\xEF |0 + \xCE\xF5 |0 + \xAC\x50 |0 + \xAC\x4D |0 + \xCE\xEC |0 + \xCE\xF1 |0 + \xAC\x53 |0 + \xAC\x4B |0 + \xCE\xF0 |0 + \xAC\x4E |0 + \xAC\x51 |0 + \xCE\xF3 |0 + \xAC\x4C |0 + \xCE\xF8 |0 + \xAC\x4F |0 + \xAC\x52 |0 + \xCE\xED |0 + \xCE\xF2 |0 + \xCE\xF6 |0 + \xCE\xEE |0 + \xCE\xEB |0 + \xCE\xF7 |0 + \xCE\xF4 |0 + \xAE\xD0 |0 + \xAE\xC9 |0 + \xAE\xCC |0 + \xAE\xCF |0 + \xD1\xD5 |0 + \xAE\xCA |0 + \xD1\xD3 |0 + \xAE\xCE |0 + \xAE\xCB |0 + \xD1\xD6 |0 + \xAE\xCD |0 + \xD5\xAC |0 + \xB1\xDF |0 + \xD5\xAB |0 + \xD5\xAD |0 + \xB1\xDE |0 + \xB1\xE3 |0 + \xD1\xD4 |0 + \xD5\xAA |0 + \xD5\xAE |0 + \xB1\xE0 |0 + \xD5\xA9 |0 + \xB1\xE2 |0 + \xB1\xE1 |0 + \xD9\xA7 |0 + \xD9\xA2 |0 + \xB4\xB6 |0 + \xB4\xBA |0 + \xB4\xB7 |0 + \xD9\xA5 |0 + \xD9\xA8 |0 + \xB4\xB8 |0 + \xB4\xB9 |0 + \xB4\xBE |0 + \xDD\xC7 |0 + \xD9\xA6 |0 + \xB4\xBC |0 + \xD9\xA3 |0 + \xD9\xA1 |0 + \xB4\xBD |0 + \xD9\xA4 |0 + \xB7\x79 |0 + \xDD\xBF |0 + \xB7\x76 |0 + \xB7\x77 |0 + \xB7\x75 |0 + \xDD\xC4 |0 + \xDD\xC3 |0 + \xDD\xC0 |0 + \xB7\x7B |0 + \xDD\xC2 |0 + \xB4\xBB |0 + \xDD\xC6 |0 + \xDD\xC1 |0 + \xB7\x78 |0 + \xB7\x74 |0 + \xB7\x7A |0 + \xDD\xC5 |0 + \xBA\x5C |0 + \xE1\xF8 |0 + \xE1\xF7 |0 + \xE1\xF6 |0 + \xBA\x5A |0 + \xBA\x5B |0 + \xE5\xC5 |0 + \xE5\xC8 |0 + \xBC\xC8 |0 + \xBC\xC7 |0 + \xE5\xC9 |0 + \xE5\xC4 |0 + \xBC\xCA |0 + \xE5\xC6 |0 + \xBC\xC9 |0 + \xE5\xC3 |0 + \xE5\xC7 |0 + \xBE\xE9 |0 + \xBE\xE6 |0 + \xE9\xBB |0 + \xE9\xBA |0 + \xE9\xB9 |0 + \xE9\xB4 |0 + \xE9\xB5 |0 + \xBE\xE7 |0 + \xBE\xE4 |0 + \xBE\xE8 |0 + \xE9\xB3 |0 + \xBE\xE5 |0 + \xE9\xB6 |0 + \xE9\xB7 |0 + \xE9\xBC |0 + \xE9\xB8 |0 + \xEC\xF2 |0 + \xC0\xC7 |0 + \xEF\xDC |0 + \xC0\xC6 |0 + \xEF\xDA |0 + \xEF\xDB |0 + \xC2\x60 |0 + \xC3\x6E |0 + \xF2\x4B |0 + \xC3\x6D |0 + \xF4\x51 |0 + \xF4\x52 |0 + \xC4\x66 |0 + \xF4\x50 |0 + \xC4\xE4 |0 + \xF7\xDF |0 + \xC5\xCE |0 + \xF8\xAA |0 + \xF8\xAB |0 + \xA4\xEA |0 + \xA6\xB1 |0 + \xA6\xB2 |0 + \xA7\xF3 |0 + \xCC\xD1 |0 + \xAC\x54 |0 + \xAE\xD1 |0 + \xB1\xE4 |0 + \xB0\xD2 |0 + \xB4\xBF |0 + \xB4\xC0 |0 + \xB3\xCC |0 + \xD9\xA9 |0 + \xB7\x7C |0 + \xE1\xFA |0 + \xE1\xF9 |0 + \xA4\xEB |0 + \xA6\xB3 |0 + \xCC\xD2 |0 + \xAA\x42 |0 + \xAA\x41 |0 + \xCE\xF9 |0 + \xCE\xFA |0 + \xD1\xD7 |0 + \xD1\xD8 |0 + \xAE\xD2 |0 + \xAE\xD3 |0 + \xAE\xD4 |0 + \xD5\xAF |0 + \xB1\xE6 |0 + \xB4\xC2 |0 + \xB4\xC1 |0 + \xDD\xC8 |0 + \xDF\x7A |0 + \xE1\xFB |0 + \xE9\xBD |0 + \xC2\x61 |0 + \xC4\x67 |0 + \xA4\xEC |0 + \xA5\xBC |0 + \xA5\xBD |0 + \xA5\xBB |0 + \xA5\xBE |0 + \xA5\xBA |0 + \xA6\xB6 |0 + \xC9\xF6 |0 + \xA6\xB5 |0 + \xA6\xB7 |0 + \xC9\xF1 |0 + \xC9\xF0 |0 + \xC9\xF3 |0 + \xC9\xF2 |0 + \xC9\xF5 |0 + \xA6\xB4 |0 + \xC9\xEF |0 + \xC9\xF4 |0 + \xCA\xFD |0 + \xA7\xFD |0 + \xCA\xFE |0 + \xCB\x43 |0 + \xA7\xFC |0 + \xCB\x47 |0 + \xCB\x42 |0 + \xCB\x45 |0 + \xA7\xF5 |0 + \xA7\xF6 |0 + \xA7\xF7 |0 + \xA7\xF8 |0 + \xA8\x40 |0 + \xCB\x41 |0 + \xA7\xFA |0 + \xA8\x41 |0 + \xCB\x40 |0 + \xCB\x46 |0 + \xA7\xF9 |0 + \xCB\x44 |0 + \xA7\xFB |0 + \xA7\xF4 |0 + \xA7\xFE |0 + \xAA\x57 |0 + \xCC\xD4 |0 + \xAA\x43 |0 + \xAA\x4D |0 + \xAA\x4E |0 + \xAA\x46 |0 + \xAA\x58 |0 + \xAA\x48 |0 + \xCC\xDC |0 + \xAA\x53 |0 + \xCC\xD7 |0 + \xAA\x49 |0 + \xCC\xE6 |0 + \xCC\xE7 |0 + \xCC\xDF |0 + \xCC\xD8 |0 + \xAA\x56 |0 + \xCC\xE4 |0 + \xAA\x51 |0 + \xAA\x4F |0 + \xCC\xE5 |0 + \xCC\xE3 |0 + \xCC\xDB |0 + \xCC\xD3 |0 + \xCC\xDA |0 + \xAA\x4A |0 + \xAA\x50 |0 + \xAA\x44 |0 + \xCC\xDE |0 + \xCC\xDD |0 + \xCC\xD5 |0 + \xAA\x52 |0 + \xCC\xE1 |0 + \xCC\xD6 |0 + \xAA\x55 |0 + \xCC\xE8 |0 + \xAA\x45 |0 + \xAA\x4C |0 + \xCC\xD9 |0 + \xCC\xE2 |0 + \xAA\x54 |0 + \xAA\x47 |0 + \xAA\x4B |0 + \xCC\xE0 |0 + \xCF\x5B |0 + \xAC\x5C |0 + \xAC\x69 |0 + \xCF\x56 |0 + \xCF\x4C |0 + \xAC\x62 |0 + \xCF\x4A |0 + \xAC\x5B |0 + \xCF\x45 |0 + \xAC\x65 |0 + \xCF\x52 |0 + \xCE\xFE |0 + \xCF\x41 |0 + \xCF\x44 |0 + \xCE\xFB |0 + \xCF\x51 |0 + \xCF\x61 |0 + \xAC\x60 |0 + \xCF\x46 |0 + \xCF\x58 |0 + \xCE\xFD |0 + \xCF\x5F |0 + \xCF\x60 |0 + \xCF\x63 |0 + \xCF\x5A |0 + \xCF\x4B |0 + \xCF\x53 |0 + \xAC\x66 |0 + \xAC\x59 |0 + \xAC\x61 |0 + \xAC\x6D |0 + \xAC\x56 |0 + \xAC\x58 |0 + \xCF\x43 |0 + \xAC\x6A |0 + \xAC\x63 |0 + \xCF\x5D |0 + \xCF\x40 |0 + \xAC\x6C |0 + \xAC\x67 |0 + \xCF\x49 |0 + \xAC\x6B |0 + \xCF\x50 |0 + \xCF\x48 |0 + \xAC\x64 |0 + \xCF\x5C |0 + \xCF\x54 |0 + \xAC\x5E |0 + \xCF\x62 |0 + \xCF\x47 |0 + \xAC\x5A |0 + \xCF\x59 |0 + \xCF\x4F |0 + \xAC\x5F |0 + \xCF\x55 |0 + \xAC\x57 |0 + \xCE\xFC |0 + \xAC\x68 |0 + \xAE\xE3 |0 + \xAC\x5D |0 + \xCF\x4E |0 + \xCF\x4D |0 + \xCF\x42 |0 + \xCF\x5E |0 + \xCF\x57 |0 + \xAC\x55 |0 + \xD1\xEC |0 + \xAE\xEA |0 + \xD1\xED |0 + \xD1\xE1 |0 + \xAE\xDF |0 + \xAE\xEB |0 + \xD1\xDA |0 + \xD1\xE3 |0 + \xD1\xEB |0 + \xD1\xD9 |0 + \xD1\xF4 |0 + \xAE\xD5 |0 + \xD1\xF3 |0 + \xD1\xEE |0 + \xD1\xEF |0 + \xAE\xDD |0 + \xAE\xE8 |0 + \xD1\xE5 |0 + \xD1\xE6 |0 + \xD1\xF0 |0 + \xD1\xE7 |0 + \xD1\xE2 |0 + \xD1\xDC |0 + \xD1\xDD |0 + \xD1\xEA |0 + \xD1\xE4 |0 + \xAE\xD6 |0 + \xAE\xDA |0 + \xD1\xF2 |0 + \xD1\xDE |0 + \xAE\xE6 |0 + \xAE\xE2 |0 + \xAE\xE5 |0 + \xAE\xEC |0 + \xAE\xDB |0 + \xAE\xE7 |0 + \xD1\xE9 |0 + \xAE\xE9 |0 + \xAE\xD8 |0 + \xAE\xD7 |0 + \xD1\xDB |0 + \xD1\xDF |0 + \xAE\xE0 |0 + \xD1\xF1 |0 + \xD1\xE8 |0 + \xD1\xE0 |0 + \xAE\xE4 |0 + \xAE\xE1 |0 + \xAE\xD9 |0 + \xAE\xDC |0 + \xD5\xC4 |0 + \xD5\xB4 |0 + \xD5\xB5 |0 + \xD5\xB9 |0 + \xD5\xC8 |0 + \xD5\xC5 |0 + \xD5\xBE |0 + \xD5\xBD |0 + \xB1\xED |0 + \xD5\xC1 |0 + \xD5\xD0 |0 + \xD5\xB0 |0 + \xD5\xD1 |0 + \xD5\xC3 |0 + \xD5\xD5 |0 + \xD5\xC9 |0 + \xB1\xEC |0 + \xD5\xC7 |0 + \xB1\xE7 |0 + \xB1\xFC |0 + \xB1\xF2 |0 + \xB1\xF6 |0 + \xB1\xF5 |0 + \xD5\xB1 |0 + \xD5\xCE |0 + \xD5\xD4 |0 + \xD5\xCC |0 + \xD5\xD3 |0 + \xD5\xC0 |0 + \xD5\xB2 |0 + \xD5\xD2 |0 + \xD5\xC2 |0 + \xB1\xEA |0 + \xB1\xF7 |0 + \xD5\xCB |0 + \xB1\xF0 |0 + \xD5\xCA |0 + \xD5\xB3 |0 + \xB1\xF8 |0 + \xB1\xFA |0 + \xD5\xCD |0 + \xB1\xFB |0 + \xB1\xE9 |0 + \xD5\xBA |0 + \xD5\xCF |0 + \xB1\xEF |0 + \xB1\xF9 |0 + \xD5\xBC |0 + \xD5\xC6 |0 + \xD5\xB7 |0 + \xD5\xBB |0 + \xB1\xF4 |0 + \xD5\xB6 |0 + \xB1\xE8 |0 + \xB1\xF1 |0 + \xB1\xEE |0 + \xD5\xBF |0 + \xAE\xDE |0 + \xD9\xC0 |0 + \xB1\xEB |0 + \xB1\xF3 |0 + \xD9\xC3 |0 + \xD9\xD9 |0 + \xD9\xCE |0 + \xB4\xD6 |0 + \xB4\xD1 |0 + \xD9\xBD |0 + \xB4\xD2 |0 + \xD9\xCD |0 + \xD9\xC6 |0 + \xD9\xD3 |0 + \xB4\xCE |0 + \xD9\xAB |0 + \xD9\xD5 |0 + \xB4\xC4 |0 + \xD9\xB3 |0 + \xB4\xC7 |0 + \xB4\xC6 |0 + \xB4\xD7 |0 + \xD9\xAD |0 + \xD9\xCF |0 + \xD9\xD0 |0 + \xB4\xC9 |0 + \xB4\xC5 |0 + \xD9\xBB |0 + \xB4\xD0 |0 + \xD9\xB6 |0 + \xD9\xD1 |0 + \xB4\xCC |0 + \xD9\xC9 |0 + \xD9\xD6 |0 + \xD9\xB0 |0 + \xD9\xB5 |0 + \xD9\xAF |0 + \xB4\xCB |0 + \xD9\xC2 |0 + \xDD\xDE |0 + \xD9\xB1 |0 + \xB4\xCF |0 + \xD9\xBA |0 + \xD9\xD2 |0 + \xB4\xCA |0 + \xD9\xB7 |0 + \xD9\xB4 |0 + \xD9\xC5 |0 + \xB4\xCD |0 + \xB4\xC3 |0 + \xB4\xD9 |0 + \xD9\xC8 |0 + \xD9\xC7 |0 + \xD9\xAC |0 + \xB4\xC8 |0 + \xD9\xD4 |0 + \xD9\xBC |0 + \xD9\xBE |0 + \xD9\xCB |0 + \xD9\xCA |0 + \xD9\xAA |0 + \xB4\xD3 |0 + \xB4\xD5 |0 + \xD9\xB2 |0 + \xD9\xB9 |0 + \xD9\xC1 |0 + \xB4\xD4 |0 + \xD9\xB8 |0 + \xD9\xC4 |0 + \xD9\xD7 |0 + \xD9\xCC |0 + \xD9\xD8 |0 + \xD9\xAE |0 + \xDD\xF2 |0 + \xB7\xA6 |0 + \xDD\xF0 |0 + \xDD\xDB |0 + \xDD\xE0 |0 + \xDD\xD9 |0 + \xDD\xEC |0 + \xDD\xCB |0 + \xDD\xD2 |0 + \xDD\xEA |0 + \xDD\xF4 |0 + \xDD\xDC |0 + \xDD\xCF |0 + \xDD\xE2 |0 + \xDD\xE7 |0 + \xDD\xD3 |0 + \xDD\xE4 |0 + \xDD\xD0 |0 + \xDD\xD7 |0 + \xDD\xD8 |0 + \xB7\xA8 |0 + \xDD\xEB |0 + \xDD\xE9 |0 + \xDD\xCC |0 + \xDD\xEE |0 + \xDD\xEF |0 + \xDD\xF1 |0 + \xB7\xAC |0 + \xB7\xA4 |0 + \xD5\xB8 |0 + \xDD\xD4 |0 + \xDD\xE6 |0 + \xDD\xD5 |0 + \xB7\xA1 |0 + \xB7\xB1 |0 + \xDD\xED |0 + \xB7\xAF |0 + \xB7\xAB |0 + \xDD\xCA |0 + \xB7\xA3 |0 + \xDD\xCD |0 + \xB7\xB0 |0 + \xDD\xDD |0 + \xDD\xC9 |0 + \xB7\xA9 |0 + \xDD\xE1 |0 + \xDD\xD1 |0 + \xB7\xAA |0 + \xDD\xDA |0 + \xB7\x7E |0 + \xB4\xD8 |0 + \xDD\xE3 |0 + \xD9\xBF |0 + \xDD\xCE |0 + \xDD\xE8 |0 + \xB7\xA5 |0 + \xDD\xE5 |0 + \xB7\xA2 |0 + \xDD\xDF |0 + \xB7\xAD |0 + \xDD\xD6 |0 + \xDD\xF3 |0 + \xB7\xA7 |0 + \xDE\xC6 |0 + \xB7\xAE |0 + \xE2\x4A |0 + \xE2\x48 |0 + \xE2\x5E |0 + \xE2\x46 |0 + \xE2\x58 |0 + \xB7\x7D |0 + \xBA\x5F |0 + \xE2\x42 |0 + \xE2\x5D |0 + \xE2\x47 |0 + \xE2\x55 |0 + \xBA\x64 |0 + \xBA\x5D |0 + \xE2\x5B |0 + \xE2\x40 |0 + \xE2\x5A |0 + \xBA\x6F |0 + \xE2\x51 |0 + \xE2\x61 |0 + \xBA\x6D |0 + \xE2\x49 |0 + \xBA\x5E |0 + \xE2\x4B |0 + \xE2\x59 |0 + \xBA\x67 |0 + \xE2\x44 |0 + \xBA\x6B |0 + \xBA\x61 |0 + \xE2\x4D |0 + \xE2\x43 |0 + \xE1\xFC |0 + \xE2\x57 |0 + \xBA\x68 |0 + \xE2\x60 |0 + \xE1\xFD |0 + \xBA\x65 |0 + \xE2\x53 |0 + \xBA\x66 |0 + \xE2\x45 |0 + \xE2\x50 |0 + \xE2\x4C |0 + \xE2\x4E |0 + \xBA\x60 |0 + \xE2\x5F |0 + \xBA\x6E |0 + \xE2\x4F |0 + \xE2\x62 |0 + \xE1\xFE |0 + \xE2\x54 |0 + \xBA\x63 |0 + \xBA\x6C |0 + \xBA\x6A |0 + \xE2\x41 |0 + \xE2\x56 |0 + \xBA\x69 |0 + \xBA\x62 |0 + \xE2\x52 |0 + \xE2\x5C |0 + \xE5\xD5 |0 + \xE5\xD1 |0 + \xE5\xCD |0 + \xE5\xE1 |0 + \xE5\xDE |0 + \xBC\xCD |0 + \xE5\xE5 |0 + \xE5\xD4 |0 + \xBC\xD8 |0 + \xE5\xDB |0 + \xE5\xD0 |0 + \xE5\xDA |0 + \xBC\xD5 |0 + \xE5\xEE |0 + \xE5\xEB |0 + \xE5\xDD |0 + \xE5\xCE |0 + \xE5\xE2 |0 + \xE5\xE4 |0 + \xBC\xD1 |0 + \xE5\xD8 |0 + \xE5\xD3 |0 + \xE5\xCA |0 + \xBC\xCE |0 + \xBC\xD6 |0 + \xE5\xE7 |0 + \xBC\xD7 |0 + \xE5\xCB |0 + \xE5\xED |0 + \xE5\xE0 |0 + \xE5\xE6 |0 + \xBC\xD4 |0 + \xE5\xE3 |0 + \xE5\xEA |0 + \xBC\xD9 |0 + \xBC\xD3 |0 + \xE5\xDC |0 + \xE5\xCF |0 + \xE5\xEF |0 + \xE5\xCC |0 + \xE5\xE8 |0 + \xBC\xD0 |0 + \xE5\xD6 |0 + \xE5\xD7 |0 + \xBC\xCF |0 + \xBC\xCC |0 + \xE5\xD2 |0 + \xBC\xD2 |0 + \xBC\xCB |0 + \xE5\xE9 |0 + \xE5\xEC |0 + \xE5\xD9 |0 + \xE9\xCA |0 + \xE9\xC2 |0 + \xE9\xBE |0 + \xBE\xF6 |0 + \xBE\xEB |0 + \xBE\xF0 |0 + \xBE\xEC |0 + \xE9\xCC |0 + \xE9\xD7 |0 + \xBE\xEA |0 + \xE9\xC4 |0 + \xE9\xCD |0 + \xE5\xDF |0 + \xE9\xCE |0 + \xBE\xF1 |0 + \xE9\xDD |0 + \xBE\xF5 |0 + \xBE\xF8 |0 + \xE9\xC0 |0 + \xBE\xF4 |0 + \xE9\xDB |0 + \xE9\xDC |0 + \xE9\xD2 |0 + \xE9\xD1 |0 + \xE9\xC9 |0 + \xE9\xD3 |0 + \xE9\xDA |0 + \xE9\xD9 |0 + \xBE\xEF |0 + \xBE\xED |0 + \xE9\xCB |0 + \xE9\xC8 |0 + \xE9\xC5 |0 + \xE9\xD8 |0 + \xBE\xF7 |0 + \xE9\xD6 |0 + \xBE\xF3 |0 + \xBE\xF2 |0 + \xE9\xD0 |0 + \xE9\xBF |0 + \xE9\xC1 |0 + \xE9\xC3 |0 + \xE9\xD5 |0 + \xE9\xCF |0 + \xBE\xEE |0 + \xE9\xC6 |0 + \xE9\xD4 |0 + \xE9\xC7 |0 + \xC0\xCF |0 + \xED\x45 |0 + \xC0\xC8 |0 + \xEC\xF5 |0 + \xED\x41 |0 + \xC0\xCA |0 + \xED\x48 |0 + \xEC\xFC |0 + \xEC\xF7 |0 + \xED\x49 |0 + \xEC\xF3 |0 + \xEC\xFE |0 + \xC0\xD1 |0 + \xED\x44 |0 + \xED\x4A |0 + \xEC\xFD |0 + \xC0\xC9 |0 + \xED\x40 |0 + \xEC\xF4 |0 + \xC0\xD0 |0 + \xED\x47 |0 + \xEC\xF9 |0 + \xC0\xCC |0 + \xEC\xFB |0 + \xEC\xF8 |0 + \xC0\xD2 |0 + \xEC\xFA |0 + \xC0\xCB |0 + \xC0\xCE |0 + \xED\x43 |0 + \xEC\xF6 |0 + \xED\x46 |0 + \xED\x42 |0 + \xC2\x63 |0 + \xEF\xE7 |0 + \xC2\x68 |0 + \xC2\x69 |0 + \xC2\x62 |0 + \xEF\xE6 |0 + \xEF\xE3 |0 + \xEF\xE4 |0 + \xC2\x66 |0 + \xEF\xDE |0 + \xEF\xE2 |0 + \xC2\x65 |0 + \xEF\xDF |0 + \xC2\x67 |0 + \xC2\x64 |0 + \xEF\xDD |0 + \xEF\xE1 |0 + \xEF\xE5 |0 + \xF2\x51 |0 + \xF2\x4E |0 + \xF2\x57 |0 + \xF2\x56 |0 + \xF2\x54 |0 + \xF2\x4F |0 + \xC3\x72 |0 + \xF2\x50 |0 + \xC3\x71 |0 + \xC0\xCD |0 + \xF2\x53 |0 + \xC3\x70 |0 + \xF2\x58 |0 + \xF2\x52 |0 + \xF2\x4D |0 + \xEF\xE0 |0 + \xC3\x6F |0 + \xF2\x4C |0 + \xF4\x56 |0 + \xF4\x55 |0 + \xF2\x55 |0 + \xC4\x68 |0 + \xF4\x59 |0 + \xF4\x5A |0 + \xF4\x54 |0 + \xF4\x58 |0 + \xF4\x53 |0 + \xF5\xD1 |0 + \xF4\x57 |0 + \xC4\xE7 |0 + \xC4\xE5 |0 + \xF5\xCF |0 + \xF5\xD2 |0 + \xF5\xCE |0 + \xF5\xD0 |0 + \xC4\xE6 |0 + \xF6\xE5 |0 + \xF6\xE6 |0 + \xC5\x76 |0 + \xF6\xE4 |0 + \xF7\xE2 |0 + \xC5\xCF |0 + \xF7\xE0 |0 + \xF7\xE1 |0 + \xF8\xAC |0 + \xC6\x56 |0 + \xF8\xF3 |0 + \xF8\xF1 |0 + \xF8\xF2 |0 + \xF8\xF4 |0 + \xF9\xBB |0 + \xA4\xED |0 + \xA6\xB8 |0 + \xAA\x59 |0 + \xCC\xE9 |0 + \xCF\x64 |0 + \xD1\xF5 |0 + \xD1\xF7 |0 + \xD1\xF6 |0 + \xD1\xF8 |0 + \xB1\xFD |0 + \xD5\xD7 |0 + \xD1\xF9 |0 + \xD5\xD6 |0 + \xD5\xD8 |0 + \xD5\xD9 |0 + \xD9\xDA |0 + \xB4\xDB |0 + \xD9\xDB |0 + \xD9\xDD |0 + \xB4\xDC |0 + \xB4\xDA |0 + \xD9\xDC |0 + \xDD\xFA |0 + \xDD\xF8 |0 + \xDD\xF7 |0 + \xDD\xF6 |0 + \xDD\xF5 |0 + \xB7\xB2 |0 + \xDD\xF9 |0 + \xBA\x70 |0 + \xE2\x63 |0 + \xE2\x65 |0 + \xBA\x71 |0 + \xE2\x64 |0 + \xBC\xDB |0 + \xBC\xDA |0 + \xE5\xF0 |0 + \xE9\xDF |0 + \xE9\xDE |0 + \xE9\xE0 |0 + \xBE\xF9 |0 + \xED\x4B |0 + \xC0\xD3 |0 + \xEF\xE8 |0 + \xC2\x6A |0 + \xF2\x59 |0 + \xC5\x77 |0 + \xA4\xEE |0 + \xA5\xBF |0 + \xA6\xB9 |0 + \xA8\x42 |0 + \xAA\x5A |0 + \xAA\x5B |0 + \xAC\x6E |0 + \xD1\xFA |0 + \xB7\xB3 |0 + \xE6\xD1 |0 + \xBE\xFA |0 + \xC2\x6B |0 + \xA4\xEF |0 + \xA6\xBA |0 + \xCC\xEB |0 + \xAA\x5C |0 + \xCC\xEA |0 + \xCF\x65 |0 + \xAC\x6F |0 + \xCF\x66 |0 + \xAC\x70 |0 + \xD1\xFC |0 + \xAE\xEE |0 + \xAE\xED |0 + \xD5\xDE |0 + \xD5\xDC |0 + \xD5\xDD |0 + \xD5\xDB |0 + \xD5\xDA |0 + \xD9\xDE |0 + \xD9\xE1 |0 + \xB4\xDE |0 + \xD9\xDF |0 + \xB4\xDD |0 + \xD9\xE0 |0 + \xDD\xFB |0 + \xE2\x66 |0 + \xE2\x67 |0 + \xE2\x68 |0 + \xE5\xF3 |0 + \xE5\xF2 |0 + \xBC\xDC |0 + \xE5\xF1 |0 + \xE5\xF4 |0 + \xE9\xE1 |0 + \xE9\xE2 |0 + \xE9\xE3 |0 + \xED\x4C |0 + \xC0\xD4 |0 + \xC2\x6C |0 + \xF2\x5A |0 + \xC4\xE8 |0 + \xC9\x5F |0 + \xAC\x71 |0 + \xCF\x67 |0 + \xAE\xEF |0 + \xB1\xFE |0 + \xB4\xDF |0 + \xD9\xE2 |0 + \xB7\xB5 |0 + \xB7\xB4 |0 + \xE2\x69 |0 + \xE2\x6A |0 + \xBC\xDD |0 + \xBC\xDE |0 + \xE9\xE5 |0 + \xE9\xE4 |0 + \xEF\xE9 |0 + \xF7\xE3 |0 + \xA4\xF0 |0 + \xC9\x60 |0 + \xA5\xC0 |0 + \xA8\x43 |0 + \xCB\x48 |0 + \xAC\x72 |0 + \xB7\xB6 |0 + \xA4\xF1 |0 + \xCF\x68 |0 + \xAC\x73 |0 + \xCF\x69 |0 + \xC0\xD5 |0 + \xA4\xF2 |0 + \xCC\xEC |0 + \xCF\x6A |0 + \xD2\x42 |0 + \xD2\x41 |0 + \xD1\xFE |0 + \xD1\xFD |0 + \xD2\x43 |0 + \xD2\x40 |0 + \xB2\x40 |0 + \xB2\x41 |0 + \xB4\xE0 |0 + \xD9\xE3 |0 + \xD9\xE4 |0 + \xD9\xE5 |0 + \xDE\x41 |0 + \xDE\x42 |0 + \xDE\x40 |0 + \xDD\xFD |0 + \xDD\xFE |0 + \xB7\xB7 |0 + \xE2\x6B |0 + \xE5\xF7 |0 + \xE5\xF6 |0 + \xE5\xF5 |0 + \xE5\xF8 |0 + \xE9\xE7 |0 + \xE9\xE6 |0 + \xBE\xFB |0 + \xE9\xE8 |0 + \xC0\xD6 |0 + \xED\x4D |0 + \xEF\xEA |0 + \xF2\x5B |0 + \xF6\xE7 |0 + \xA4\xF3 |0 + \xA5\xC2 |0 + \xA5\xC1 |0 + \xAA\x5D |0 + \xC9\x61 |0 + \xC9\x7E |0 + \xA6\xBB |0 + \xC9\xF7 |0 + \xCB\x49 |0 + \xCB\x4A |0 + \xAA\x5E |0 + \xCC\xED |0 + \xAC\x74 |0 + \xCF\x6B |0 + \xCF\x6C |0 + \xAE\xF0 |0 + \xAE\xF4 |0 + \xD2\x44 |0 + \xAE\xF3 |0 + \xAE\xF1 |0 + \xAE\xF2 |0 + \xD5\xDF |0 + \xB2\x42 |0 + \xB4\xE3 |0 + \xB4\xE1 |0 + \xB4\xE2 |0 + \xD9\xE6 |0 + \xBA\x72 |0 + \xA4\xF4 |0 + \xC9\xA1 |0 + \xA5\xC3 |0 + \xC9\xA4 |0 + \xA5\xC6 |0 + \xC9\xA3 |0 + \xA5\xC5 |0 + \xA5\xC4 |0 + \xA8\x44 |0 + \xC9\xA2 |0 + \xC9\xF8 |0 + \xC9\xFC |0 + \xC9\xFE |0 + \xCA\x40 |0 + \xA6\xC5 |0 + \xA6\xC6 |0 + \xC9\xFB |0 + \xA6\xC1 |0 + \xC9\xF9 |0 + \xC9\xFD |0 + \xA6\xC2 |0 + \xA6\xBD |0 + \xA6\xBE |0 + \xA6\xC4 |0 + \xC9\xFA |0 + \xA6\xBC |0 + \xA8\x45 |0 + \xA6\xBF |0 + \xA6\xC0 |0 + \xA6\xC3 |0 + \xCB\x5B |0 + \xCB\x59 |0 + \xCB\x4C |0 + \xA8\x51 |0 + \xCB\x53 |0 + \xA8\x4C |0 + \xCB\x4D |0 + \xCB\x55 |0 + \xCB\x52 |0 + \xA8\x4F |0 + \xCB\x51 |0 + \xA8\x56 |0 + \xCB\x5A |0 + \xA8\x58 |0 + \xA8\x5A |0 + \xCB\x4B |0 + \xA8\x4D |0 + \xCB\x5C |0 + \xA8\x54 |0 + \xA8\x57 |0 + \xCD\x45 |0 + \xA8\x47 |0 + \xA8\x5E |0 + \xA8\x55 |0 + \xCB\x4E |0 + \xA8\x4A |0 + \xA8\x59 |0 + \xCB\x56 |0 + \xA8\x48 |0 + \xA8\x49 |0 + \xCD\x43 |0 + \xCB\x4F |0 + \xA8\x50 |0 + \xA8\x5B |0 + \xCB\x5D |0 + \xCB\x50 |0 + \xA8\x4E |0 + \xA8\x53 |0 + \xCC\xEE |0 + \xA8\x5C |0 + \xCB\x57 |0 + \xA8\x52 |0 + \xA8\x5D |0 + \xA8\x46 |0 + \xCB\x54 |0 + \xA8\x4B |0 + \xCB\x58 |0 + \xCD\x44 |0 + \xAA\x6A |0 + \xAA\x7A |0 + \xCC\xF5 |0 + \xAA\x71 |0 + \xCD\x4B |0 + \xAA\x62 |0 + \xAA\x65 |0 + \xCD\x42 |0 + \xCC\xF3 |0 + \xCC\xF7 |0 + \xAA\x6D |0 + \xAA\x6F |0 + \xCC\xFA |0 + \xAA\x76 |0 + \xAA\x68 |0 + \xAA\x66 |0 + \xAA\x67 |0 + \xAA\x75 |0 + \xCD\x47 |0 + \xAA\x70 |0 + \xCC\xF9 |0 + \xCC\xFB |0 + \xAA\x6E |0 + \xAA\x73 |0 + \xCC\xFC |0 + \xCD\x4A |0 + \xAC\x75 |0 + \xAA\x79 |0 + \xAA\x63 |0 + \xCD\x49 |0 + \xCD\x4D |0 + \xCC\xF8 |0 + \xCD\x4F |0 + \xCD\x40 |0 + \xAA\x6C |0 + \xCC\xF4 |0 + \xAA\x6B |0 + \xAA\x7D |0 + \xAA\x72 |0 + \xCC\xF2 |0 + \xCF\x75 |0 + \xAA\x78 |0 + \xAA\x7C |0 + \xCD\x41 |0 + \xCD\x46 |0 + \xAA\x7E |0 + \xAA\x77 |0 + \xAA\x69 |0 + \xAA\x5F |0 + \xAA\x64 |0 + \xCC\xF6 |0 + \xAA\x60 |0 + \xCD\x4E |0 + \xCC\xF0 |0 + \xCC\xEF |0 + \xCC\xFD |0 + \xCC\xF1 |0 + \xAA\x7B |0 + \xAE\xF5 |0 + \xAA\x74 |0 + \xCC\xFE |0 + \xAA\x61 |0 + \xAC\xA6 |0 + \xCD\x4C |0 + \xCF\x7C |0 + \xCF\xA1 |0 + \xCF\xA4 |0 + \xCF\x77 |0 + \xCF\xA7 |0 + \xCF\xAA |0 + \xCF\xAC |0 + \xCF\x74 |0 + \xAC\x76 |0 + \xAC\x7B |0 + \xD2\x49 |0 + \xAC\xAD |0 + \xCF\xA5 |0 + \xCF\xAD |0 + \xCF\x7B |0 + \xCF\x73 |0 + \xD2\x64 |0 + \xAC\x7E |0 + \xCF\xA2 |0 + \xCF\x78 |0 + \xCF\x7A |0 + \xAC\xA5 |0 + \xCF\x7D |0 + \xAC\x7D |0 + \xCF\x70 |0 + \xCF\xA8 |0 + \xCF\xAB |0 + \xAC\x7A |0 + \xAC\xA8 |0 + \xCF\x6D |0 + \xAC\xAA |0 + \xAC\x78 |0 + \xAC\xAE |0 + \xCF\xA9 |0 + \xCF\x6F |0 + \xAC\xAB |0 + \xD2\x5E |0 + \xCD\x48 |0 + \xAC\x7C |0 + \xAC\x77 |0 + \xCF\x76 |0 + \xCF\x6E |0 + \xAC\xAC |0 + \xAC\xA4 |0 + \xCF\xA3 |0 + \xAC\xA9 |0 + \xAC\xA7 |0 + \xCF\x79 |0 + \xAC\xA1 |0 + \xCF\x71 |0 + \xAC\xA2 |0 + \xAC\xA3 |0 + \xCF\x72 |0 + \xCF\xA6 |0 + \xAC\x79 |0 + \xCF\x7E |0 + \xD2\x4C |0 + \xAE\xFD |0 + \xAF\x43 |0 + \xD2\x55 |0 + \xD2\x5B |0 + \xD2\x57 |0 + \xD2\x4A |0 + \xD2\x4D |0 + \xD2\x46 |0 + \xD2\x47 |0 + \xAF\x4A |0 + \xAE\xFA |0 + \xD2\x56 |0 + \xD2\x5F |0 + \xAF\x45 |0 + \xAE\xF6 |0 + \xAF\x40 |0 + \xD2\x4E |0 + \xAF\x42 |0 + \xD2\x4F |0 + \xD2\x59 |0 + \xAF\x44 |0 + \xD2\x68 |0 + \xD2\x48 |0 + \xAE\xFC |0 + \xAE\xFB |0 + \xAF\x48 |0 + \xD2\x45 |0 + \xD2\x66 |0 + \xD2\x5A |0 + \xD2\x67 |0 + \xD2\x61 |0 + \xD2\x53 |0 + \xD2\x62 |0 + \xD2\x5C |0 + \xD2\x65 |0 + \xD2\x63 |0 + \xAF\x49 |0 + \xD2\x54 |0 + \xAE\xF9 |0 + \xAE\xF8 |0 + \xAF\x41 |0 + \xAF\x47 |0 + \xD2\x60 |0 + \xAF\x46 |0 + \xD2\x51 |0 + \xB2\x43 |0 + \xD2\x69 |0 + \xD2\x50 |0 + \xD2\x4B |0 + \xAE\xFE |0 + \xAF\x4B |0 + \xAE\xF7 |0 + \xD2\x58 |0 + \xD2\x5D |0 + \xB2\x65 |0 + \xD5\xE1 |0 + \xD5\xE5 |0 + \xB2\x52 |0 + \xB2\x50 |0 + \xB2\x47 |0 + \xD5\xE3 |0 + \xD5\xE2 |0 + \xB2\x5B |0 + \xD5\xE8 |0 + \xB2\x55 |0 + \xD5\xFA |0 + \xD6\x47 |0 + \xB2\x44 |0 + \xD5\xF7 |0 + \xD5\xF0 |0 + \xB2\x67 |0 + \xD5\xE0 |0 + \xD5\xFC |0 + \xB2\x64 |0 + \xB2\x58 |0 + \xB2\x63 |0 + \xB2\x4E |0 + \xD5\xEC |0 + \xD5\xFE |0 + \xD5\xF6 |0 + \xB2\x4F |0 + \xB2\x49 |0 + \xD6\x45 |0 + \xD5\xFD |0 + \xD6\x40 |0 + \xB2\x51 |0 + \xB2\x59 |0 + \xD6\x42 |0 + \xD5\xEA |0 + \xD5\xFB |0 + \xD5\xEF |0 + \xD6\x44 |0 + \xB2\x5E |0 + \xB2\x46 |0 + \xB2\x5C |0 + \xD5\xF4 |0 + \xD5\xF2 |0 + \xD5\xF3 |0 + \xB2\x53 |0 + \xD5\xEE |0 + \xD5\xED |0 + \xB2\x48 |0 + \xD5\xE7 |0 + \xD6\x46 |0 + \xB2\x4A |0 + \xD5\xF1 |0 + \xB2\x68 |0 + \xB2\x62 |0 + \xD5\xE6 |0 + \xB2\x5F |0 + \xB2\x5D |0 + \xB2\x66 |0 + \xD5\xF8 |0 + \xB2\x61 |0 + \xD2\x52 |0 + \xD5\xF9 |0 + \xB2\x60 |0 + \xD6\x41 |0 + \xB2\x45 |0 + \xD5\xF5 |0 + \xB2\x57 |0 + \xD5\xE9 |0 + \xB2\x56 |0 + \xB2\x54 |0 + \xB2\x4C |0 + \xB2\x4B |0 + \xD9\xE7 |0 + \xD6\x43 |0 + \xD5\xEB |0 + \xD9\xFC |0 + \xB2\x4D |0 + \xB5\x41 |0 + \xB2\x5A |0 + \xB4\xEE |0 + \xD9\xF6 |0 + \xB4\xFC |0 + \xD9\xEA |0 + \xB4\xEB |0 + \xB4\xE7 |0 + \xDA\x49 |0 + \xB4\xED |0 + \xB4\xF1 |0 + \xB4\xEC |0 + \xB4\xF5 |0 + \xDA\x4D |0 + \xDA\x44 |0 + \xD9\xF1 |0 + \xB4\xFA |0 + \xB4\xF4 |0 + \xD9\xFD |0 + \xB4\xE4 |0 + \xDA\x4A |0 + \xDA\x43 |0 + \xB4\xE8 |0 + \xD9\xF7 |0 + \xB4\xF7 |0 + \xDA\x55 |0 + \xDA\x56 |0 + \xB4\xE5 |0 + \xDA\x48 |0 + \xB4\xF9 |0 + \xD9\xFB |0 + \xD9\xED |0 + \xD9\xEE |0 + \xB4\xFD |0 + \xD9\xF2 |0 + \xD9\xF9 |0 + \xD9\xF3 |0 + \xB4\xFB |0 + \xB5\x44 |0 + \xD9\xEF |0 + \xD9\xE8 |0 + \xD9\xE9 |0 + \xD9\xEB |0 + \xB4\xEA |0 + \xD9\xF8 |0 + \xB4\xF8 |0 + \xB5\x42 |0 + \xD9\xFA |0 + \xDA\x53 |0 + \xDA\x4B |0 + \xB4\xE6 |0 + \xDA\x51 |0 + \xB4\xF2 |0 + \xB4\xF0 |0 + \xDA\x57 |0 + \xB4\xEF |0 + \xDA\x41 |0 + \xD9\xF4 |0 + \xD9\xFE |0 + \xB5\x47 |0 + \xDA\x45 |0 + \xDA\x42 |0 + \xD9\xF0 |0 + \xB5\x43 |0 + \xDA\x4F |0 + \xDA\x4C |0 + \xDA\x54 |0 + \xB4\xE9 |0 + \xDA\x40 |0 + \xB5\x46 |0 + \xDA\x47 |0 + \xB4\xF3 |0 + \xB4\xF6 |0 + \xDA\x46 |0 + \xB5\x45 |0 + \xD9\xF5 |0 + \xD5\xE4 |0 + \xDA\x50 |0 + \xDA\x4E |0 + \xDA\x52 |0 + \xD9\xEC |0 + \xB5\x40 |0 + \xDE\x61 |0 + \xDE\x60 |0 + \xDE\x46 |0 + \xB7\xBD |0 + \xDE\x5F |0 + \xDE\x49 |0 + \xDE\x4A |0 + \xB7\xC7 |0 + \xDE\x68 |0 + \xB7\xC2 |0 + \xDE\x5E |0 + \xDE\x43 |0 + \xB7\xC8 |0 + \xB7\xBE |0 + \xDE\x52 |0 + \xDE\x48 |0 + \xDE\x4B |0 + \xDE\x63 |0 + \xB7\xB8 |0 + \xDE\x6A |0 + \xDE\x62 |0 + \xB7\xC1 |0 + \xDE\x57 |0 + \xB7\xCC |0 + \xB7\xCB |0 + \xB7\xC5 |0 + \xDE\x69 |0 + \xB7\xB9 |0 + \xDE\x55 |0 + \xDE\x4C |0 + \xDE\x59 |0 + \xDE\x65 |0 + \xB7\xCD |0 + \xB7\xBB |0 + \xDE\x54 |0 + \xDE\x4D |0 + \xB7\xC4 |0 + \xB7\xC3 |0 + \xDE\x50 |0 + \xDE\x5A |0 + \xDE\x64 |0 + \xDE\x47 |0 + \xDE\x51 |0 + \xB7\xBC |0 + \xDE\x5B |0 + \xB7\xC9 |0 + \xB7\xC0 |0 + \xDE\x4E |0 + \xB7\xBF |0 + \xDE\x45 |0 + \xDE\x53 |0 + \xDE\x67 |0 + \xB4\xFE |0 + \xBA\xB0 |0 + \xDE\x56 |0 + \xE2\x6C |0 + \xDE\x58 |0 + \xDE\x66 |0 + \xB7\xC6 |0 + \xDE\x4F |0 + \xB7\xBA |0 + \xB7\xCA |0 + \xBC\xF0 |0 + \xDE\x44 |0 + \xDE\x5D |0 + \xDE\x5C |0 + \xE2\xAA |0 + \xBA\xAD |0 + \xE2\x7D |0 + \xE2\xA4 |0 + \xBA\xA2 |0 + \xE2\x6E |0 + \xBA\xAF |0 + \xBA\x77 |0 + \xE2\x6D |0 + \xE2\xB0 |0 + \xBA\xB1 |0 + \xE2\x71 |0 + \xE2\xA3 |0 + \xE2\x73 |0 + \xE2\xB3 |0 + \xE2\xAF |0 + \xBA\x75 |0 + \xBA\xA1 |0 + \xE6\x53 |0 + \xBA\xAE |0 + \xBA\x7D |0 + \xE2\x6F |0 + \xE2\xAE |0 + \xBA\xA3 |0 + \xE2\xAB |0 + \xE2\xB8 |0 + \xE2\x75 |0 + \xE2\x7E |0 + \xE2\xB6 |0 + \xE2\xAC |0 + \xBA\x7C |0 + \xE2\x7C |0 + \xBA\x76 |0 + \xBA\x74 |0 + \xBA\xA8 |0 + \xE2\x7A |0 + \xE2\x77 |0 + \xE2\x78 |0 + \xE2\xB2 |0 + \xE2\xB7 |0 + \xE2\xB5 |0 + \xBA\x7A |0 + \xE2\xB9 |0 + \xBA\x7E |0 + \xBA\xA7 |0 + \xE2\x70 |0 + \xE5\xFA |0 + \xE2\x79 |0 + \xBA\x78 |0 + \xBA\xAC |0 + \xBA\xA9 |0 + \xBA\x7B |0 + \xE2\xA5 |0 + \xE2\x74 |0 + \xBA\xAA |0 + \xE2\xA7 |0 + \xBA\xA4 |0 + \xBA\xA6 |0 + \xBA\x73 |0 + \xE2\xA9 |0 + \xE2\xA1 |0 + \xE2\x72 |0 + \xBA\xA5 |0 + \xE2\xB1 |0 + \xE2\xB4 |0 + \xE2\x7B |0 + \xE2\xA8 |0 + \xBA\x79 |0 + \xBC\xDF |0 + \xE2\xA6 |0 + \xE5\xF9 |0 + \xE2\xAD |0 + \xE2\x76 |0 + \xE6\x44 |0 + \xE6\x4E |0 + \xBC\xE2 |0 + \xE6\x4D |0 + \xE6\x59 |0 + \xBC\xE4 |0 + \xE6\x4B |0 + \xE6\x4F |0 + \xBC\xEF |0 + \xE6\x46 |0 + \xBC\xE7 |0 + \xE6\x52 |0 + \xE9\xF0 |0 + \xBC\xF3 |0 + \xBC\xF2 |0 + \xE6\x54 |0 + \xE6\x43 |0 + \xE6\x5E |0 + \xBC\xED |0 + \xBC\xE3 |0 + \xE6\x57 |0 + \xE6\x5B |0 + \xE6\x60 |0 + \xE6\x55 |0 + \xE6\x49 |0 + \xBC\xE6 |0 + \xBC\xE9 |0 + \xBC\xF1 |0 + \xBC\xEC |0 + \xE6\x4C |0 + \xE2\xA2 |0 + \xE6\x48 |0 + \xE6\x5F |0 + \xBC\xE8 |0 + \xBC\xEB |0 + \xE6\x61 |0 + \xBC\xE0 |0 + \xE6\x56 |0 + \xE5\xFB |0 + \xE6\x5C |0 + \xC0\xDF |0 + \xE6\x4A |0 + \xBC\xE1 |0 + \xE6\x45 |0 + \xBC\xE5 |0 + \xE5\xFC |0 + \xBA\xAB |0 + \xE6\x41 |0 + \xE6\x5A |0 + \xE6\x42 |0 + \xE6\x40 |0 + \xBC\xEA |0 + \xE6\x58 |0 + \xE5\xFE |0 + \xE6\x51 |0 + \xE6\x50 |0 + \xE6\x5D |0 + \xE6\x47 |0 + \xBC\xEE |0 + \xE9\xF3 |0 + \xBF\x49 |0 + \xBE\xFE |0 + \xEA\x40 |0 + \xE9\xEB |0 + \xBF\x41 |0 + \xE9\xF7 |0 + \xBF\x48 |0 + \xBF\x43 |0 + \xE9\xF5 |0 + \xED\x4F |0 + \xE9\xFB |0 + \xEA\x42 |0 + \xE9\xFA |0 + \xE9\xE9 |0 + \xE9\xF8 |0 + \xEA\x44 |0 + \xEA\x46 |0 + \xBE\xFD |0 + \xEA\x45 |0 + \xBF\x44 |0 + \xBF\x4A |0 + \xBF\x47 |0 + \xE9\xFE |0 + \xBF\x46 |0 + \xE9\xF9 |0 + \xE9\xED |0 + \xE9\xF2 |0 + \xE9\xFD |0 + \xBF\x45 |0 + \xBF\x42 |0 + \xBE\xFC |0 + \xBF\x40 |0 + \xE9\xF1 |0 + \xE5\xFD |0 + \xE9\xEC |0 + \xE9\xEF |0 + \xEA\x41 |0 + \xE9\xF4 |0 + \xE9\xEA |0 + \xED\x4E |0 + \xEA\x43 |0 + \xE9\xEE |0 + \xE9\xFC |0 + \xED\x51 |0 + \xC0\xE3 |0 + \xC0\xD7 |0 + \xC0\xDB |0 + \xED\x53 |0 + \xED\x59 |0 + \xED\x57 |0 + \xC0\xD9 |0 + \xC0\xDA |0 + \xC0\xE1 |0 + \xED\x5A |0 + \xED\x52 |0 + \xC0\xDC |0 + \xED\x56 |0 + \xED\x55 |0 + \xED\x5B |0 + \xC0\xE2 |0 + \xC0\xDD |0 + \xC0\xE0 |0 + \xED\x54 |0 + \xC0\xE4 |0 + \xC0\xDE |0 + \xC0\xE5 |0 + \xC0\xD8 |0 + \xED\x58 |0 + \xED\x50 |0 + \xEF\xF7 |0 + \xC2\x71 |0 + \xEF\xF4 |0 + \xEF\xF6 |0 + \xC2\x6F |0 + \xEF\xF2 |0 + \xEF\xF3 |0 + \xEF\xEE |0 + \xE9\xF6 |0 + \xEF\xEF |0 + \xC2\x70 |0 + \xEF\xEB |0 + \xC2\x6D |0 + \xEF\xF8 |0 + \xC2\x6E |0 + \xEF\xEC |0 + \xEF\xED |0 + \xEF\xF1 |0 + \xC2\x73 |0 + \xC2\x72 |0 + \xEF\xF0 |0 + \xC3\x78 |0 + \xF2\x5F |0 + \xF2\x65 |0 + \xC3\x79 |0 + \xF2\x5C |0 + \xC3\x76 |0 + \xC3\x73 |0 + \xF2\x67 |0 + \xC3\x77 |0 + \xC3\x74 |0 + \xF2\x5E |0 + \xF2\x61 |0 + \xF2\x62 |0 + \xF2\x63 |0 + \xF2\x66 |0 + \xEF\xF5 |0 + \xF2\x5D |0 + \xC3\x75 |0 + \xF2\x64 |0 + \xF2\x68 |0 + \xF2\x60 |0 + \xF4\x5D |0 + \xC4\x6A |0 + \xF4\x60 |0 + \xC4\x6B |0 + \xF4\x68 |0 + \xF4\x5F |0 + \xF4\x5C |0 + \xF4\x5E |0 + \xF4\x62 |0 + \xF4\x65 |0 + \xF4\x64 |0 + \xF4\x67 |0 + \xF4\x5B |0 + \xC4\x69 |0 + \xF4\x63 |0 + \xF4\x66 |0 + \xF4\x69 |0 + \xF4\x61 |0 + \xF5\xD3 |0 + \xF5\xD4 |0 + \xF5\xD8 |0 + \xF5\xD9 |0 + \xF5\xD6 |0 + \xF5\xD7 |0 + \xF5\xD5 |0 + \xC4\xE9 |0 + \xC5\x78 |0 + \xF6\xEB |0 + \xF6\xE8 |0 + \xF6\xE9 |0 + \xF6\xEA |0 + \xC5\x79 |0 + \xF7\xE5 |0 + \xF7\xE4 |0 + \xF8\xAF |0 + \xC5\xF4 |0 + \xF8\xAD |0 + \xF8\xB0 |0 + \xF8\xAE |0 + \xF8\xF5 |0 + \xC6\x57 |0 + \xC6\x65 |0 + \xF9\xA3 |0 + \xF9\x6C |0 + \xF9\xA2 |0 + \xF9\xD0 |0 + \xF9\xD1 |0 + \xA4\xF5 |0 + \xA6\xC7 |0 + \xCA\x41 |0 + \xCB\x5E |0 + \xA8\x5F |0 + \xA8\x62 |0 + \xCB\x5F |0 + \xA8\x60 |0 + \xA8\x61 |0 + \xCD\x58 |0 + \xCD\x5A |0 + \xCD\x55 |0 + \xCD\x52 |0 + \xCD\x54 |0 + \xAA\xA4 |0 + \xAA\xA2 |0 + \xCD\x56 |0 + \xAA\xA3 |0 + \xCD\x53 |0 + \xCD\x50 |0 + \xAA\xA1 |0 + \xCD\x57 |0 + \xCD\x51 |0 + \xAA\xA5 |0 + \xCD\x59 |0 + \xCF\xAF |0 + \xCF\xB3 |0 + \xAC\xB7 |0 + \xCF\xB6 |0 + \xAC\xAF |0 + \xAC\xB2 |0 + \xAC\xB4 |0 + \xAC\xB6 |0 + \xAC\xB3 |0 + \xCF\xB2 |0 + \xCF\xB1 |0 + \xAC\xB1 |0 + \xCF\xB4 |0 + \xCF\xB5 |0 + \xCF\xAE |0 + \xAC\xB5 |0 + \xAC\xB0 |0 + \xCF\xB0 |0 + \xD2\x77 |0 + \xD2\x78 |0 + \xD2\x79 |0 + \xAF\x50 |0 + \xAF\x4C |0 + \xD2\x6E |0 + \xD2\x76 |0 + \xD2\x7B |0 + \xAF\x51 |0 + \xD2\x6C |0 + \xD2\x72 |0 + \xD2\x6B |0 + \xD2\x75 |0 + \xD2\x71 |0 + \xAF\x4D |0 + \xAF\x4F |0 + \xD2\x7A |0 + \xD2\x6A |0 + \xD2\x6D |0 + \xD2\x73 |0 + \xD2\x74 |0 + \xD2\x7C |0 + \xD2\x70 |0 + \xAF\x4E |0 + \xB2\x6D |0 + \xD6\x4E |0 + \xD6\x50 |0 + \xD6\x4C |0 + \xD6\x58 |0 + \xD6\x4A |0 + \xD6\x57 |0 + \xB2\x69 |0 + \xD6\x48 |0 + \xDA\x5B |0 + \xD6\x52 |0 + \xB2\x6C |0 + \xD6\x53 |0 + \xD6\x56 |0 + \xD6\x5A |0 + \xD6\x4F |0 + \xD6\x54 |0 + \xB2\x6A |0 + \xB2\x6B |0 + \xD6\x59 |0 + \xD6\x4D |0 + \xD6\x49 |0 + \xD6\x5B |0 + \xD6\x51 |0 + \xD6\x55 |0 + \xD6\x4B |0 + \xB5\x48 |0 + \xB5\x49 |0 + \xDA\x65 |0 + \xB5\x4F |0 + \xDA\x59 |0 + \xDA\x62 |0 + \xDA\x58 |0 + \xB5\x4C |0 + \xDA\x60 |0 + \xDA\x5E |0 + \xDA\x5F |0 + \xB5\x4A |0 + \xDA\x63 |0 + \xDA\x5C |0 + \xDA\x5A |0 + \xB5\x4B |0 + \xDA\x5D |0 + \xDA\x61 |0 + \xB5\x4D |0 + \xDA\x64 |0 + \xDE\x70 |0 + \xDE\x77 |0 + \xDE\x79 |0 + \xDE\xA1 |0 + \xB7\xDA |0 + \xDE\x6B |0 + \xB7\xD2 |0 + \xDE\x7A |0 + \xB7\xD7 |0 + \xDE\xA2 |0 + \xB7\xCE |0 + \xDE\x7D |0 + \xDE\x6D |0 + \xDE\x7E |0 + \xDE\x6C |0 + \xB7\xDC |0 + \xDE\x78 |0 + \xB7\xCF |0 + \xDE\xA3 |0 + \xB7\xD4 |0 + \xDE\x71 |0 + \xB7\xD9 |0 + \xDE\x7C |0 + \xDE\x6F |0 + \xDE\x76 |0 + \xDE\x72 |0 + \xDE\x6E |0 + \xB7\xD1 |0 + \xB7\xD8 |0 + \xB7\xD6 |0 + \xB7\xD3 |0 + \xB7\xDB |0 + \xB7\xD0 |0 + \xDE\x75 |0 + \xB7\xD5 |0 + \xB5\x4E |0 + \xDE\x7B |0 + \xDE\x73 |0 + \xDE\x74 |0 + \xE2\xC1 |0 + \xBA\xB4 |0 + \xE2\xBD |0 + \xE2\xC3 |0 + \xE2\xBF |0 + \xBA\xB6 |0 + \xE2\xBE |0 + \xE2\xC2 |0 + \xE2\xBA |0 + \xE2\xBC |0 + \xBA\xB5 |0 + \xE2\xC0 |0 + \xE2\xBB |0 + \xBA\xB7 |0 + \xBA\xB2 |0 + \xE2\xC4 |0 + \xBA\xB3 |0 + \xE6\x67 |0 + \xE6\x64 |0 + \xE6\x70 |0 + \xE6\x6A |0 + \xE6\x6C |0 + \xBC\xF4 |0 + \xE6\x66 |0 + \xE6\x6E |0 + \xE6\x6D |0 + \xE6\x6B |0 + \xE6\x71 |0 + \xBC\xF7 |0 + \xE6\x68 |0 + \xE6\x6F |0 + \xBC\xF5 |0 + \xE6\x63 |0 + \xE6\x65 |0 + \xBC\xF6 |0 + \xE6\x62 |0 + \xE6\x72 |0 + \xE6\x69 |0 + \xEA\x4A |0 + \xBF\x51 |0 + \xEA\x55 |0 + \xEA\x53 |0 + \xBF\x4B |0 + \xEA\x49 |0 + \xEA\x4C |0 + \xEA\x4D |0 + \xEA\x48 |0 + \xBF\x55 |0 + \xBF\x56 |0 + \xEA\x47 |0 + \xEA\x56 |0 + \xEA\x51 |0 + \xBF\x4F |0 + \xBF\x4C |0 + \xEA\x50 |0 + \xEA\x4E |0 + \xBF\x52 |0 + \xEA\x52 |0 + \xBF\x4D |0 + \xBF\x4E |0 + \xEA\x4F |0 + \xBF\x50 |0 + \xEA\x4B |0 + \xEA\x54 |0 + \xBF\x53 |0 + \xEA\x57 |0 + \xEA\x58 |0 + \xBF\x54 |0 + \xC0\xE7 |0 + \xC0\xEE |0 + \xED\x5C |0 + \xED\x62 |0 + \xED\x60 |0 + \xC0\xEA |0 + \xC0\xE9 |0 + \xC0\xE6 |0 + \xED\x5E |0 + \xC0\xEC |0 + \xC0\xEB |0 + \xC0\xE8 |0 + \xED\x61 |0 + \xED\x5D |0 + \xED\x5F |0 + \xC0\xED |0 + \xC2\x77 |0 + \xEF\xFB |0 + \xC2\x74 |0 + \xC2\x75 |0 + \xEF\xFD |0 + \xC2\x76 |0 + \xEF\xFA |0 + \xEF\xF9 |0 + \xF2\x6C |0 + \xEF\xFC |0 + \xF2\x6D |0 + \xC3\x7A |0 + \xF2\x6B |0 + \xF2\x6A |0 + \xF2\x69 |0 + \xC3\x7B |0 + \xC4\x6C |0 + \xF4\x6A |0 + \xF4\x6B |0 + \xF5\xDC |0 + \xF5\xDB |0 + \xC4\xEA |0 + \xF5\xDA |0 + \xF6\xEC |0 + \xF6\xED |0 + \xF7\xE6 |0 + \xF8\xB1 |0 + \xF8\xF6 |0 + \xF9\xBC |0 + \xC6\x79 |0 + \xF9\xC6 |0 + \xA4\xF6 |0 + \xAA\xA6 |0 + \xAA\xA7 |0 + \xAC\xB8 |0 + \xC0\xEF |0 + \xA4\xF7 |0 + \xAA\xA8 |0 + \xAF\x52 |0 + \xB7\xDD |0 + \xA4\xF8 |0 + \xB2\x6E |0 + \xBA\xB8 |0 + \xC9\x62 |0 + \xCF\xB7 |0 + \xD2\x7D |0 + \xE2\xC5 |0 + \xC0\xF0 |0 + \xA4\xF9 |0 + \xAA\xA9 |0 + \xCF\xB8 |0 + \xCF\xB9 |0 + \xDA\x66 |0 + \xB5\x50 |0 + \xDE\xA4 |0 + \xB7\xDE |0 + \xE2\xC6 |0 + \xBC\xF8 |0 + \xC3\x7C |0 + \xA4\xFA |0 + \xDA\x67 |0 + \xA4\xFB |0 + \xA6\xC9 |0 + \xCA\x42 |0 + \xA6\xC8 |0 + \xA8\x65 |0 + \xA8\x64 |0 + \xA8\x63 |0 + \xCB\x60 |0 + \xAA\xAA |0 + \xAA\xAB |0 + \xCD\x5B |0 + \xCF\xBA |0 + \xCF\xBD |0 + \xAC\xBA |0 + \xCF\xBB |0 + \xAC\xB9 |0 + \xCF\xBC |0 + \xAC\xBB |0 + \xD2\xA2 |0 + \xD2\xA1 |0 + \xD2\x7E |0 + \xAF\x53 |0 + \xD6\x5D |0 + \xD6\x5E |0 + \xB2\x6F |0 + \xD6\x5C |0 + \xD6\x5F |0 + \xB5\x52 |0 + \xB2\x70 |0 + \xB5\x51 |0 + \xDA\x6B |0 + \xDA\x6A |0 + \xDA\x68 |0 + \xDA\x69 |0 + \xDA\x6C |0 + \xDE\xA6 |0 + \xDE\xA5 |0 + \xDE\xA9 |0 + \xDE\xA8 |0 + \xDE\xA7 |0 + \xBA\xB9 |0 + \xE2\xC9 |0 + \xE2\xC8 |0 + \xBA\xBA |0 + \xE2\xC7 |0 + \xE6\x73 |0 + \xE6\x74 |0 + \xBC\xF9 |0 + \xEA\x59 |0 + \xEA\x5A |0 + \xF2\x72 |0 + \xC3\x7D |0 + \xF2\x71 |0 + \xF2\x70 |0 + \xF2\x6E |0 + \xF2\x6F |0 + \xC4\xEB |0 + \xF4\x6C |0 + \xF6\xEE |0 + \xF8\xF7 |0 + \xA4\xFC |0 + \xC9\xA5 |0 + \xA5\xC7 |0 + \xC9\xA6 |0 + \xCA\x43 |0 + \xCA\x44 |0 + \xCB\x66 |0 + \xCB\x62 |0 + \xCB\x61 |0 + \xAA\xAC |0 + \xCB\x65 |0 + \xA8\x67 |0 + \xCB\x63 |0 + \xA8\x66 |0 + \xCB\x67 |0 + \xCB\x64 |0 + \xCD\x5F |0 + \xCF\xBE |0 + \xCD\x5D |0 + \xCD\x64 |0 + \xAA\xAD |0 + \xAA\xB0 |0 + \xCD\x65 |0 + \xCD\x61 |0 + \xCD\x62 |0 + \xCD\x5C |0 + \xAA\xAF |0 + \xCD\x5E |0 + \xAA\xAE |0 + \xCD\x63 |0 + \xCD\x60 |0 + \xCF\xC2 |0 + \xAC\xBD |0 + \xAC\xBE |0 + \xCF\xC5 |0 + \xCF\xBF |0 + \xCF\xC4 |0 + \xCF\xC0 |0 + \xAC\xBC |0 + \xCF\xC3 |0 + \xCF\xC1 |0 + \xD2\xA8 |0 + \xD2\xA5 |0 + \xD2\xA7 |0 + \xAF\x58 |0 + \xAF\x57 |0 + \xAF\x55 |0 + \xD2\xA4 |0 + \xD2\xA9 |0 + \xAF\x54 |0 + \xAF\x56 |0 + \xD2\xA6 |0 + \xD6\x67 |0 + \xD2\xA3 |0 + \xD2\xAA |0 + \xD6\x62 |0 + \xD6\x66 |0 + \xD6\x65 |0 + \xDA\x6E |0 + \xDA\x79 |0 + \xD6\x68 |0 + \xD6\x63 |0 + \xDA\x6D |0 + \xB2\x74 |0 + \xB2\x73 |0 + \xD6\x61 |0 + \xD6\x64 |0 + \xB2\x75 |0 + \xB2\x72 |0 + \xB2\x71 |0 + \xD6\x60 |0 + \xD6\x69 |0 + \xDA\x70 |0 + \xDA\x77 |0 + \xB5\x54 |0 + \xDA\x76 |0 + \xDA\x73 |0 + \xB5\x56 |0 + \xDA\x75 |0 + \xDA\x6F |0 + \xDA\x71 |0 + \xDA\x74 |0 + \xDA\x72 |0 + \xB5\x55 |0 + \xDA\x78 |0 + \xB5\x53 |0 + \xB7\xDF |0 + \xDE\xAD |0 + \xDE\xAC |0 + \xDE\xAA |0 + \xB7\xE2 |0 + \xB7\xE1 |0 + \xDE\xAE |0 + \xDE\xAB |0 + \xE2\xCA |0 + \xBA\xBB |0 + \xB7\xE0 |0 + \xDE\xB0 |0 + \xDE\xAF |0 + \xE2\xCD |0 + \xE2\xCB |0 + \xBC\xFA |0 + \xBA\xBC |0 + \xE2\xCC |0 + \xE6\x76 |0 + \xBC\xFB |0 + \xE6\x75 |0 + \xE6\x7E |0 + \xE6\x7D |0 + \xE6\x7B |0 + \xE6\x7A |0 + \xE6\x77 |0 + \xE6\x78 |0 + \xE6\x79 |0 + \xE6\x7C |0 + \xE6\xA1 |0 + \xEA\x5F |0 + \xEA\x5C |0 + \xEA\x5D |0 + \xBF\x57 |0 + \xEA\x5B |0 + \xEA\x61 |0 + \xEA\x60 |0 + \xEA\x5E |0 + \xED\x64 |0 + \xED\x65 |0 + \xC0\xF1 |0 + \xC0\xF2 |0 + \xED\x63 |0 + \xC2\x79 |0 + \xEF\xFE |0 + \xC2\x78 |0 + \xC3\x7E |0 + \xC3\xA1 |0 + \xC4\x6D |0 + \xF4\x6E |0 + \xF4\x6D |0 + \xF5\xDD |0 + \xF6\xEF |0 + \xC5\x7A |0 + \xF7\xE8 |0 + \xF7\xE7 |0 + \xF7\xE9 |0 + \xA5\xC8 |0 + \xCF\xC6 |0 + \xAF\x59 |0 + \xB2\x76 |0 + \xD6\x6A |0 + \xA5\xC9 |0 + \xC9\xA7 |0 + \xA4\xFD |0 + \xCA\x45 |0 + \xCB\x6C |0 + \xCB\x6A |0 + \xCB\x6B |0 + \xCB\x68 |0 + \xA8\x68 |0 + \xCB\x69 |0 + \xCD\x6D |0 + \xAA\xB3 |0 + \xCD\x6B |0 + \xCD\x67 |0 + \xCD\x6A |0 + \xCD\x66 |0 + \xAA\xB5 |0 + \xCD\x69 |0 + \xAA\xB2 |0 + \xAA\xB1 |0 + \xAA\xB4 |0 + \xCD\x6C |0 + \xCD\x68 |0 + \xAC\xC2 |0 + \xAC\xC5 |0 + \xCF\xCE |0 + \xCF\xCD |0 + \xCF\xCC |0 + \xAC\xBF |0 + \xCF\xD5 |0 + \xCF\xCB |0 + \xAC\xC1 |0 + \xD2\xAF |0 + \xCF\xD2 |0 + \xCF\xD0 |0 + \xAC\xC4 |0 + \xCF\xC8 |0 + \xCF\xD3 |0 + \xCF\xCA |0 + \xCF\xD4 |0 + \xCF\xD1 |0 + \xCF\xC9 |0 + \xAC\xC0 |0 + \xCF\xD6 |0 + \xCF\xC7 |0 + \xAC\xC3 |0 + \xD2\xB4 |0 + \xD2\xAB |0 + \xD2\xB6 |0 + \xD2\xAE |0 + \xD2\xB9 |0 + \xD2\xBA |0 + \xD2\xAC |0 + \xD2\xB8 |0 + \xD2\xB5 |0 + \xD2\xB3 |0 + \xD2\xB7 |0 + \xAF\x5F |0 + \xAF\x5D |0 + \xD2\xB1 |0 + \xD2\xAD |0 + \xD2\xB0 |0 + \xD2\xBB |0 + \xD2\xB2 |0 + \xAF\x5E |0 + \xCF\xCF |0 + \xAF\x5A |0 + \xAF\x5C |0 + \xD6\x78 |0 + \xD6\x6D |0 + \xD6\x6B |0 + \xD6\x6C |0 + \xD6\x73 |0 + \xD6\x74 |0 + \xD6\x70 |0 + \xB2\x7B |0 + \xD6\x75 |0 + \xD6\x72 |0 + \xD6\x6F |0 + \xB2\x79 |0 + \xD6\x6E |0 + \xB2\x77 |0 + \xB2\x7A |0 + \xD6\x71 |0 + \xD6\x79 |0 + \xAF\x5B |0 + \xB2\x78 |0 + \xD6\x77 |0 + \xD6\x76 |0 + \xB2\x7C |0 + \xDA\x7E |0 + \xDA\xA1 |0 + \xB5\x60 |0 + \xDA\xA7 |0 + \xDA\xA9 |0 + \xDA\xA2 |0 + \xB5\x5A |0 + \xDA\xA6 |0 + \xDA\xA5 |0 + \xB5\x5B |0 + \xB5\x61 |0 + \xB5\x62 |0 + \xDA\xA8 |0 + \xB5\x58 |0 + \xDA\x7D |0 + \xDA\x7B |0 + \xDA\xA3 |0 + \xDA\x7A |0 + \xB5\x5F |0 + \xDA\x7C |0 + \xDA\xA4 |0 + \xDA\xAA |0 + \xB5\x59 |0 + \xB5\x5E |0 + \xB5\x5C |0 + \xB5\x5D |0 + \xB5\x57 |0 + \xB7\xE9 |0 + \xDE\xB7 |0 + \xB7\xE8 |0 + \xDE\xBB |0 + \xDE\xB1 |0 + \xDE\xBC |0 + \xDE\xB2 |0 + \xDE\xB3 |0 + \xDE\xBD |0 + \xDE\xBA |0 + \xDE\xB8 |0 + \xDE\xB9 |0 + \xDE\xB5 |0 + \xDE\xB4 |0 + \xDE\xBE |0 + \xB7\xE5 |0 + \xDE\xB6 |0 + \xB7\xEA |0 + \xB7\xE4 |0 + \xB7\xEB |0 + \xB7\xEC |0 + \xB7\xE7 |0 + \xB7\xE6 |0 + \xE2\xCE |0 + \xBA\xBE |0 + \xBA\xBD |0 + \xE2\xD3 |0 + \xBC\xFC |0 + \xBA\xBF |0 + \xBA\xC1 |0 + \xE2\xD4 |0 + \xB7\xE3 |0 + \xBA\xC0 |0 + \xE2\xD0 |0 + \xE2\xD2 |0 + \xE2\xCF |0 + \xE2\xD1 |0 + \xE6\xAB |0 + \xE6\xAA |0 + \xE6\xA7 |0 + \xBD\x40 |0 + \xEA\x62 |0 + \xBD\x41 |0 + \xE6\xA6 |0 + \xBC\xFE |0 + \xE6\xA8 |0 + \xE6\xA5 |0 + \xE6\xA2 |0 + \xE6\xA9 |0 + \xE6\xA3 |0 + \xE6\xA4 |0 + \xBC\xFD |0 + \xED\x69 |0 + \xEA\x66 |0 + \xEA\x65 |0 + \xEA\x67 |0 + \xED\x66 |0 + \xBF\x5A |0 + \xEA\x63 |0 + \xBF\x58 |0 + \xBF\x5C |0 + \xBF\x5B |0 + \xEA\x64 |0 + \xEA\x68 |0 + \xBF\x59 |0 + \xED\x6D |0 + \xC0\xF5 |0 + \xC2\x7A |0 + \xC0\xF6 |0 + \xC0\xF3 |0 + \xED\x6A |0 + \xED\x68 |0 + \xED\x6B |0 + \xED\x6E |0 + \xC0\xF4 |0 + \xED\x6C |0 + \xED\x67 |0 + \xF0\x42 |0 + \xF0\x45 |0 + \xF2\x75 |0 + \xF0\x40 |0 + \xF4\x6F |0 + \xF0\x46 |0 + \xC3\xA2 |0 + \xF0\x44 |0 + \xC2\x7B |0 + \xF0\x41 |0 + \xF0\x43 |0 + \xF0\x47 |0 + \xF2\x76 |0 + \xF2\x74 |0 + \xC3\xA3 |0 + \xF2\x73 |0 + \xC4\x6E |0 + \xC4\xED |0 + \xF6\xF1 |0 + \xC4\xEC |0 + \xF6\xF3 |0 + \xF6\xF0 |0 + \xF6\xF2 |0 + \xC5\xD0 |0 + \xF8\xB2 |0 + \xA5\xCA |0 + \xCD\x6E |0 + \xD2\xBC |0 + \xD2\xBD |0 + \xB2\x7D |0 + \xDE\xBF |0 + \xBF\x5D |0 + \xC3\xA4 |0 + \xC5\x7B |0 + \xF8\xB3 |0 + \xA5\xCB |0 + \xCD\x6F |0 + \xA2\x60 |0 + \xCF\xD7 |0 + \xCF\xD8 |0 + \xD2\xBE |0 + \xD2\xBF |0 + \xB2\x7E |0 + \xB2\xA1 |0 + \xDA\xAB |0 + \xDE\xC2 |0 + \xDE\xC1 |0 + \xDE\xC0 |0 + \xE2\xD5 |0 + \xE2\xD6 |0 + \xE2\xD7 |0 + \xBA\xC2 |0 + \xE6\xAD |0 + \xE6\xAC |0 + \xEA\x69 |0 + \xBF\x5E |0 + \xBF\x5F |0 + \xED\x72 |0 + \xED\x6F |0 + \xED\x70 |0 + \xED\x71 |0 + \xF0\x49 |0 + \xF0\x48 |0 + \xC2\x7C |0 + \xF2\x77 |0 + \xF5\xDE |0 + \xA5\xCC |0 + \xAC\xC6 |0 + \xB2\xA2 |0 + \xDE\xC3 |0 + \xA5\xCD |0 + \xD2\xC0 |0 + \xB2\xA3 |0 + \xB5\x63 |0 + \xB5\x64 |0 + \xA5\xCE |0 + \xA5\xCF |0 + \xCA\x46 |0 + \xA8\x6A |0 + \xA8\x69 |0 + \xAC\xC7 |0 + \xCF\xD9 |0 + \xDA\xAC |0 + \xA5\xD0 |0 + \xA5\xD1 |0 + \xA5\xD2 |0 + \xA5\xD3 |0 + \xA8\x6B |0 + \xA8\x6C |0 + \xCB\x6E |0 + \xCB\x6D |0 + \xAA\xB6 |0 + \xCD\x72 |0 + \xCD\x70 |0 + \xCD\x71 |0 + \xCF\xDA |0 + \xCF\xDB |0 + \xAC\xCB |0 + \xAC\xC9 |0 + \xAC\xCA |0 + \xAC\xC8 |0 + \xAF\x60 |0 + \xAF\x64 |0 + \xAF\x63 |0 + \xD2\xC1 |0 + \xAF\x62 |0 + \xAF\x61 |0 + \xD2\xC2 |0 + \xB2\xA6 |0 + \xD6\x7B |0 + \xD6\x7A |0 + \xB2\xA4 |0 + \xB2\xA5 |0 + \xB5\x66 |0 + \xB5\x65 |0 + \xDA\xAE |0 + \xDA\xAD |0 + \xB2\xA7 |0 + \xB7\xED |0 + \xDE\xC5 |0 + \xB7\xEE |0 + \xDE\xC4 |0 + \xE2\xD8 |0 + \xE6\xAE |0 + \xBD\x42 |0 + \xEA\x6A |0 + \xED\x73 |0 + \xC3\xA6 |0 + \xC3\xA5 |0 + \xC5\x7C |0 + \xA5\xD4 |0 + \xCD\x73 |0 + \xB2\xA8 |0 + \xE2\xD9 |0 + \xBA\xC3 |0 + \xCB\x6F |0 + \xCB\x70 |0 + \xCD\x74 |0 + \xAA\xB8 |0 + \xAA\xB9 |0 + \xAA\xB7 |0 + \xAC\xCF |0 + \xAC\xD0 |0 + \xAC\xCD |0 + \xAC\xCE |0 + \xCF\xDC |0 + \xCF\xDD |0 + \xAC\xCC |0 + \xD2\xC3 |0 + \xAF\x68 |0 + \xAF\x69 |0 + \xB2\xAB |0 + \xD2\xC9 |0 + \xAF\x6E |0 + \xAF\x6C |0 + \xD2\xCA |0 + \xD2\xC5 |0 + \xAF\x6B |0 + \xAF\x6A |0 + \xAF\x65 |0 + \xD2\xC8 |0 + \xD2\xC7 |0 + \xD2\xC4 |0 + \xAF\x6D |0 + \xD2\xC6 |0 + \xAF\x66 |0 + \xAF\x67 |0 + \xB2\xAC |0 + \xD6\xA1 |0 + \xD6\xA2 |0 + \xB2\xAD |0 + \xD6\x7C |0 + \xD6\x7E |0 + \xD6\xA4 |0 + \xD6\xA3 |0 + \xD6\x7D |0 + \xB2\xA9 |0 + \xB2\xAA |0 + \xDA\xB6 |0 + \xB5\x6B |0 + \xB5\x6A |0 + \xDA\xB0 |0 + \xB5\x68 |0 + \xDA\xB3 |0 + \xB5\x6C |0 + \xDA\xB4 |0 + \xB5\x6D |0 + \xDA\xB1 |0 + \xB5\x67 |0 + \xB5\x69 |0 + \xDA\xB5 |0 + \xDA\xB2 |0 + \xDA\xAF |0 + \xDE\xD2 |0 + \xDE\xC7 |0 + \xB7\xF0 |0 + \xB7\xF3 |0 + \xB7\xF2 |0 + \xB7\xF7 |0 + \xB7\xF6 |0 + \xDE\xD3 |0 + \xDE\xD1 |0 + \xDE\xCA |0 + \xDE\xCE |0 + \xDE\xCD |0 + \xB7\xF4 |0 + \xDE\xD0 |0 + \xDE\xCC |0 + \xDE\xD4 |0 + \xDE\xCB |0 + \xB7\xF5 |0 + \xB7\xEF |0 + \xB7\xF1 |0 + \xDE\xC9 |0 + \xE2\xDB |0 + \xBA\xC7 |0 + \xE2\xDF |0 + \xBA\xC6 |0 + \xE2\xDC |0 + \xBA\xC5 |0 + \xDE\xC8 |0 + \xDE\xCF |0 + \xE2\xDE |0 + \xBA\xC8 |0 + \xE2\xE0 |0 + \xE2\xDD |0 + \xE2\xDA |0 + \xE6\xB1 |0 + \xE6\xB5 |0 + \xE6\xB7 |0 + \xE6\xB3 |0 + \xE6\xB2 |0 + \xE6\xB0 |0 + \xBD\x45 |0 + \xBD\x43 |0 + \xBD\x48 |0 + \xBD\x49 |0 + \xE6\xB4 |0 + \xBD\x46 |0 + \xE6\xAF |0 + \xBD\x47 |0 + \xBA\xC4 |0 + \xE6\xB6 |0 + \xBD\x44 |0 + \xEA\x6C |0 + \xEA\x6B |0 + \xEA\x73 |0 + \xEA\x6D |0 + \xEA\x72 |0 + \xEA\x6F |0 + \xBF\x60 |0 + \xEA\x71 |0 + \xBF\x61 |0 + \xBF\x62 |0 + \xEA\x70 |0 + \xEA\x6E |0 + \xC0\xF8 |0 + \xED\x74 |0 + \xC0\xF7 |0 + \xED\x77 |0 + \xED\x75 |0 + \xED\x76 |0 + \xC0\xF9 |0 + \xF0\x4D |0 + \xC2\xA1 |0 + \xF0\x4E |0 + \xC2\x7D |0 + \xF0\x4F |0 + \xC2\x7E |0 + \xF0\x4C |0 + \xF0\x50 |0 + \xF0\x4A |0 + \xC3\xA7 |0 + \xF2\x78 |0 + \xC3\xA8 |0 + \xC4\x6F |0 + \xF0\x4B |0 + \xC4\x70 |0 + \xC4\xEE |0 + \xF5\xDF |0 + \xC5\x7E |0 + \xF6\xF4 |0 + \xC5\x7D |0 + \xF7\xEA |0 + \xC5\xF5 |0 + \xC5\xF6 |0 + \xF9\xCC |0 + \xAC\xD1 |0 + \xCF\xDE |0 + \xB5\x6E |0 + \xB5\x6F |0 + \xA5\xD5 |0 + \xA6\xCA |0 + \xCA\x47 |0 + \xCB\x71 |0 + \xA8\x6D |0 + \xAA\xBA |0 + \xAC\xD2 |0 + \xAC\xD3 |0 + \xAC\xD4 |0 + \xD6\xA6 |0 + \xD2\xCB |0 + \xAF\x6F |0 + \xB2\xAE |0 + \xD6\xA5 |0 + \xDA\xB8 |0 + \xB5\x71 |0 + \xDA\xB7 |0 + \xB5\x70 |0 + \xDE\xD5 |0 + \xBD\x4A |0 + \xE6\xBB |0 + \xE6\xB8 |0 + \xE6\xB9 |0 + \xE6\xBA |0 + \xED\x78 |0 + \xF0\x51 |0 + \xF4\x71 |0 + \xF4\x70 |0 + \xF6\xF5 |0 + \xA5\xD6 |0 + \xCD\x75 |0 + \xAF\x70 |0 + \xB5\x72 |0 + \xDE\xD6 |0 + \xE2\xE1 |0 + \xBD\x4B |0 + \xEA\x74 |0 + \xF0\x52 |0 + \xF4\x72 |0 + \xA5\xD7 |0 + \xAA\xBB |0 + \xAC\xD7 |0 + \xCF\xDF |0 + \xAC\xD8 |0 + \xAC\xD6 |0 + \xAC\xD5 |0 + \xD2\xCC |0 + \xAF\x71 |0 + \xAF\x72 |0 + \xAF\x73 |0 + \xB2\xB0 |0 + \xD6\xA7 |0 + \xB2\xAF |0 + \xDA\xB9 |0 + \xB2\xB1 |0 + \xB5\x73 |0 + \xDE\xD7 |0 + \xB7\xF8 |0 + \xB7\xF9 |0 + \xBA\xC9 |0 + \xBA\xCA |0 + \xBD\x4C |0 + \xBF\x64 |0 + \xEA\x75 |0 + \xBF\x63 |0 + \xED\x79 |0 + \xC0\xFA |0 + \xF0\x53 |0 + \xF4\x73 |0 + \xA5\xD8 |0 + \xA8\x6E |0 + \xCD\x78 |0 + \xCD\x77 |0 + \xAA\xBC |0 + \xCD\x76 |0 + \xAA\xBD |0 + \xCD\x79 |0 + \xCF\xE5 |0 + \xAC\xDB |0 + \xAC\xDA |0 + \xCF\xE7 |0 + \xCF\xE6 |0 + \xAC\xDF |0 + \xAC\xDE |0 + \xAC\xD9 |0 + \xCF\xE1 |0 + \xCF\xE2 |0 + \xCF\xE3 |0 + \xAC\xE0 |0 + \xCF\xE0 |0 + \xAC\xDC |0 + \xCF\xE4 |0 + \xAC\xDD |0 + \xD2\xCF |0 + \xD2\xD3 |0 + \xD2\xD1 |0 + \xD2\xD0 |0 + \xD2\xD4 |0 + \xD2\xD5 |0 + \xD2\xD6 |0 + \xD2\xCE |0 + \xD2\xCD |0 + \xAF\x75 |0 + \xAF\x76 |0 + \xD2\xD7 |0 + \xD2\xD2 |0 + \xD6\xB0 |0 + \xD2\xD8 |0 + \xAF\x77 |0 + \xAF\x74 |0 + \xD6\xAA |0 + \xD6\xA9 |0 + \xD6\xAB |0 + \xD6\xAC |0 + \xD6\xAE |0 + \xD6\xAD |0 + \xD6\xB2 |0 + \xB2\xB5 |0 + \xB2\xB2 |0 + \xB2\xB6 |0 + \xD6\xA8 |0 + \xB2\xB7 |0 + \xD6\xB1 |0 + \xB2\xB4 |0 + \xD6\xAF |0 + \xB2\xB3 |0 + \xDA\xBC |0 + \xDA\xBE |0 + \xDA\xBA |0 + \xDA\xBB |0 + \xDA\xBF |0 + \xDA\xC1 |0 + \xDA\xC2 |0 + \xDA\xBD |0 + \xDA\xC0 |0 + \xB5\x74 |0 + \xDE\xDB |0 + \xDE\xE0 |0 + \xDE\xD8 |0 + \xDE\xDC |0 + \xDE\xE1 |0 + \xDE\xDD |0 + \xB7\xFA |0 + \xB8\x43 |0 + \xB7\xFD |0 + \xDE\xD9 |0 + \xDE\xDA |0 + \xBA\xCE |0 + \xB8\x46 |0 + \xB7\xFE |0 + \xB8\x44 |0 + \xB7\xFC |0 + \xDE\xDF |0 + \xB8\x45 |0 + \xDE\xDE |0 + \xB8\x41 |0 + \xB7\xFB |0 + \xB8\x42 |0 + \xDE\xE2 |0 + \xE2\xE6 |0 + \xE2\xE8 |0 + \xB8\x40 |0 + \xE2\xE3 |0 + \xBA\xCC |0 + \xE2\xE9 |0 + \xBA\xCD |0 + \xE2\xE7 |0 + \xE2\xE2 |0 + \xE2\xE5 |0 + \xE2\xEA |0 + \xBA\xCB |0 + \xE2\xE4 |0 + \xBD\x4E |0 + \xE6\xBF |0 + \xE6\xBE |0 + \xBD\x51 |0 + \xBD\x4F |0 + \xE6\xBC |0 + \xBD\x4D |0 + \xE6\xBD |0 + \xBD\x50 |0 + \xEA\x7D |0 + \xEA\xA1 |0 + \xEA\x7E |0 + \xEA\x76 |0 + \xEA\x7A |0 + \xEA\x79 |0 + \xEA\x77 |0 + \xBF\x66 |0 + \xBF\x67 |0 + \xBF\x65 |0 + \xEA\x78 |0 + \xEA\x7B |0 + \xEA\x7C |0 + \xBF\x68 |0 + \xC1\x40 |0 + \xED\xA3 |0 + \xC0\xFC |0 + \xED\x7B |0 + \xC0\xFE |0 + \xC1\x41 |0 + \xC0\xFD |0 + \xED\xA2 |0 + \xED\x7C |0 + \xC0\xFB |0 + \xED\xA1 |0 + \xED\x7A |0 + \xED\x7E |0 + \xED\x7D |0 + \xF0\x55 |0 + \xC2\xA4 |0 + \xC2\xA5 |0 + \xC2\xA2 |0 + \xC2\xA3 |0 + \xF0\x54 |0 + \xF2\x7B |0 + \xC3\xA9 |0 + \xF2\x79 |0 + \xF2\x7A |0 + \xF4\x74 |0 + \xF4\x77 |0 + \xF4\x75 |0 + \xF4\x76 |0 + \xF5\xE0 |0 + \xC4\xEF |0 + \xF7\xEB |0 + \xF8\xB4 |0 + \xC5\xF7 |0 + \xF8\xF8 |0 + \xF8\xF9 |0 + \xC6\x66 |0 + \xA5\xD9 |0 + \xAC\xE1 |0 + \xDA\xC3 |0 + \xDE\xE3 |0 + \xA5\xDA |0 + \xA8\x6F |0 + \xAA\xBE |0 + \xCF\xE8 |0 + \xCF\xE9 |0 + \xAF\x78 |0 + \xDA\xC4 |0 + \xB5\x75 |0 + \xB8\x47 |0 + \xC1\x42 |0 + \xED\xA4 |0 + \xF2\x7C |0 + \xF4\x78 |0 + \xA5\xDB |0 + \xCD\xA1 |0 + \xCD\x7A |0 + \xCD\x7C |0 + \xCD\x7E |0 + \xCD\x7D |0 + \xCD\x7B |0 + \xAA\xBF |0 + \xAC\xE2 |0 + \xCF\xF2 |0 + \xCF\xED |0 + \xCF\xEA |0 + \xCF\xF1 |0 + \xAC\xE4 |0 + \xAC\xE5 |0 + \xCF\xF0 |0 + \xCF\xEF |0 + \xCF\xEE |0 + \xCF\xEB |0 + \xCF\xEC |0 + \xCF\xF3 |0 + \xAC\xE3 |0 + \xAF\x7C |0 + \xAF\xA4 |0 + \xAF\xA3 |0 + \xD2\xE1 |0 + \xD2\xDB |0 + \xD2\xD9 |0 + \xAF\xA1 |0 + \xD6\xB9 |0 + \xAF\x7A |0 + \xD2\xDE |0 + \xD2\xE2 |0 + \xD2\xE4 |0 + \xD2\xE0 |0 + \xD2\xDA |0 + \xAF\xA2 |0 + \xD2\xDF |0 + \xD2\xDD |0 + \xAF\x79 |0 + \xD2\xE5 |0 + \xAF\xA5 |0 + \xD2\xE3 |0 + \xAF\x7D |0 + \xD2\xDC |0 + \xAF\x7E |0 + \xAF\x7B |0 + \xB2\xB9 |0 + \xD6\xBA |0 + \xD6\xB3 |0 + \xD6\xB5 |0 + \xD6\xB7 |0 + \xD6\xB8 |0 + \xD6\xB6 |0 + \xB2\xBA |0 + \xD6\xBB |0 + \xD6\xB4 |0 + \xDA\xC8 |0 + \xB5\x76 |0 + \xDA\xD0 |0 + \xDA\xC5 |0 + \xDA\xD1 |0 + \xDA\xC6 |0 + \xDA\xC7 |0 + \xDA\xCF |0 + \xDA\xCE |0 + \xDA\xCB |0 + \xB2\xB8 |0 + \xB5\x77 |0 + \xDA\xC9 |0 + \xDA\xCC |0 + \xB5\x78 |0 + \xDA\xCD |0 + \xDA\xCA |0 + \xDE\xEE |0 + \xDE\xF2 |0 + \xB8\x4E |0 + \xE2\xF0 |0 + \xB8\x51 |0 + \xDE\xF0 |0 + \xF9\xD6 |0 + \xDE\xED |0 + \xDE\xE8 |0 + \xDE\xEA |0 + \xDE\xEB |0 + \xDE\xE4 |0 + \xB8\x4D |0 + \xB8\x4C |0 + \xB8\x48 |0 + \xDE\xE7 |0 + \xB8\x4F |0 + \xB8\x50 |0 + \xDE\xE6 |0 + \xDE\xE9 |0 + \xDE\xF1 |0 + \xB8\x4A |0 + \xB8\x4B |0 + \xDE\xEF |0 + \xDE\xE5 |0 + \xE2\xF2 |0 + \xBA\xD0 |0 + \xE2\xF4 |0 + \xDE\xEC |0 + \xE2\xF6 |0 + \xBA\xD4 |0 + \xE2\xF7 |0 + \xE2\xF3 |0 + \xBA\xD1 |0 + \xE2\xEF |0 + \xBA\xD3 |0 + \xE2\xEC |0 + \xE2\xF1 |0 + \xE2\xF5 |0 + \xE2\xEE |0 + \xB8\x49 |0 + \xE2\xEB |0 + \xBA\xD2 |0 + \xE2\xED |0 + \xBD\x54 |0 + \xE6\xC1 |0 + \xBD\x58 |0 + \xBD\x56 |0 + \xBA\xCF |0 + \xE6\xC8 |0 + \xE6\xC9 |0 + \xBD\x53 |0 + \xE6\xC7 |0 + \xE6\xCA |0 + \xBD\x55 |0 + \xBD\x52 |0 + \xE6\xC3 |0 + \xE6\xC0 |0 + \xE6\xC5 |0 + \xE6\xC2 |0 + \xBD\x59 |0 + \xE6\xC4 |0 + \xE6\xC6 |0 + \xBD\x57 |0 + \xBF\x6A |0 + \xEA\xA8 |0 + \xEA\xA2 |0 + \xEA\xA6 |0 + \xEA\xAC |0 + \xEA\xAD |0 + \xEA\xA9 |0 + \xEA\xAA |0 + \xEA\xA7 |0 + \xEA\xA4 |0 + \xBF\x6C |0 + \xBF\x69 |0 + \xEA\xA3 |0 + \xEA\xA5 |0 + \xBF\x6B |0 + \xEA\xAB |0 + \xC1\x46 |0 + \xED\xAA |0 + \xED\xA5 |0 + \xC1\x45 |0 + \xC1\x43 |0 + \xED\xAC |0 + \xC1\x44 |0 + \xED\xA8 |0 + \xED\xA9 |0 + \xED\xA6 |0 + \xED\xAD |0 + \xF0\x56 |0 + \xC1\x47 |0 + \xED\xA7 |0 + \xED\xAE |0 + \xED\xAB |0 + \xF0\x5A |0 + \xF0\x57 |0 + \xC2\xA6 |0 + \xF0\x5B |0 + \xF0\x5D |0 + \xF0\x5C |0 + \xF0\x58 |0 + \xF0\x59 |0 + \xF2\xA3 |0 + \xC3\xAA |0 + \xF2\x7E |0 + \xF2\xA2 |0 + \xF2\x7D |0 + \xF2\xA4 |0 + \xF2\xA1 |0 + \xF4\x7A |0 + \xF4\x7D |0 + \xF4\x79 |0 + \xC4\x71 |0 + \xF4\x7B |0 + \xF4\x7C |0 + \xF4\x7E |0 + \xC4\x72 |0 + \xC4\x74 |0 + \xC4\x73 |0 + \xF5\xE1 |0 + \xF5\xE3 |0 + \xF5\xE2 |0 + \xF6\xF6 |0 + \xF8\xB5 |0 + \xF8\xFA |0 + \xA5\xDC |0 + \xCB\x72 |0 + \xAA\xC0 |0 + \xCD\xA3 |0 + \xAA\xC1 |0 + \xAA\xC2 |0 + \xCD\xA2 |0 + \xCF\xF8 |0 + \xCF\xF7 |0 + \xAC\xE6 |0 + \xAC\xE9 |0 + \xAC\xE8 |0 + \xAC\xE7 |0 + \xCF\xF4 |0 + \xCF\xF6 |0 + \xCF\xF5 |0 + \xD2\xE8 |0 + \xAF\xA7 |0 + \xD2\xEC |0 + \xD2\xEB |0 + \xD2\xEA |0 + \xD2\xE6 |0 + \xAF\xA6 |0 + \xAF\xAA |0 + \xAF\xAD |0 + \xAF\xAE |0 + \xD2\xE7 |0 + \xD2\xE9 |0 + \xAF\xAC |0 + \xAF\xAB |0 + \xAF\xA9 |0 + \xAF\xA8 |0 + \xD6\xC2 |0 + \xD6\xC0 |0 + \xD6\xBC |0 + \xB2\xBB |0 + \xD6\xBD |0 + \xB2\xBC |0 + \xD6\xBE |0 + \xD6\xBF |0 + \xD6\xC1 |0 + \xB2\xBD |0 + \xDA\xD5 |0 + \xDA\xD4 |0 + \xDA\xD3 |0 + \xDA\xD2 |0 + \xDE\xF6 |0 + \xB8\x52 |0 + \xDE\xF3 |0 + \xDE\xF5 |0 + \xB8\x53 |0 + \xB8\x54 |0 + \xDE\xF4 |0 + \xE3\x41 |0 + \xE2\xF9 |0 + \xE2\xFA |0 + \xBA\xD7 |0 + \xBA\xD5 |0 + \xBA\xD6 |0 + \xE3\x43 |0 + \xE3\x42 |0 + \xE2\xFE |0 + \xE2\xFD |0 + \xE2\xFC |0 + \xE2\xFB |0 + \xE3\x40 |0 + \xE2\xF8 |0 + \xE6\xCB |0 + \xE6\xD0 |0 + \xE6\xCE |0 + \xE6\xCD |0 + \xE6\xCC |0 + \xE6\xCF |0 + \xEA\xAE |0 + \xBF\x6D |0 + \xC1\x48 |0 + \xED\xB0 |0 + \xC1\x49 |0 + \xED\xAF |0 + \xF0\x5F |0 + \xF0\x5E |0 + \xC2\xA7 |0 + \xF2\xA5 |0 + \xC3\xAB |0 + \xF4\xA1 |0 + \xC5\xA1 |0 + \xF6\xF7 |0 + \xF8\xB7 |0 + \xF8\xB6 |0 + \xC9\xA8 |0 + \xAC\xEA |0 + \xAC\xEB |0 + \xD6\xC3 |0 + \xB8\x56 |0 + \xA5\xDD |0 + \xA8\x72 |0 + \xA8\x71 |0 + \xA8\x70 |0 + \xCD\xA4 |0 + \xAA\xC4 |0 + \xAA\xC3 |0 + \xAC\xEE |0 + \xCF\xFA |0 + \xCF\xFD |0 + \xCF\xFB |0 + \xAC\xEC |0 + \xAC\xED |0 + \xCF\xF9 |0 + \xCF\xFC |0 + \xAF\xB5 |0 + \xD2\xF3 |0 + \xD2\xF5 |0 + \xD2\xF4 |0 + \xAF\xB2 |0 + \xD2\xEF |0 + \xAF\xB0 |0 + \xAF\xAF |0 + \xAF\xB3 |0 + \xAF\xB1 |0 + \xAF\xB4 |0 + \xD2\xF2 |0 + \xD2\xED |0 + \xD2\xEE |0 + \xD2\xF1 |0 + \xD2\xF0 |0 + \xD6\xC6 |0 + \xD6\xC7 |0 + \xD6\xC5 |0 + \xD6\xC4 |0 + \xB2\xBE |0 + \xB5\x7D |0 + \xDA\xD6 |0 + \xDA\xD8 |0 + \xDA\xDA |0 + \xB5\x7C |0 + \xB5\x7A |0 + \xDA\xD7 |0 + \xB5\x7B |0 + \xDA\xD9 |0 + \xB5\x79 |0 + \xDF\x41 |0 + \xDE\xF7 |0 + \xDE\xFA |0 + \xDE\xFE |0 + \xB8\x5A |0 + \xDE\xFC |0 + \xDE\xFB |0 + \xDE\xF8 |0 + \xDE\xF9 |0 + \xB8\x58 |0 + \xDF\x40 |0 + \xB8\x57 |0 + \xB8\x5C |0 + \xB8\x5B |0 + \xB8\x59 |0 + \xDE\xFD |0 + \xE3\x49 |0 + \xE3\x48 |0 + \xE3\x44 |0 + \xBA\xD8 |0 + \xE3\x47 |0 + \xE3\x46 |0 + \xBA\xD9 |0 + \xBD\x5E |0 + \xE6\xD2 |0 + \xBD\x5F |0 + \xBD\x5B |0 + \xBD\x5D |0 + \xBD\x5A |0 + \xBD\x5C |0 + \xEA\xAF |0 + \xBF\x70 |0 + \xEA\xB1 |0 + \xEA\xB0 |0 + \xE3\x45 |0 + \xBF\x72 |0 + \xBF\x71 |0 + \xBF\x6E |0 + \xBF\x6F |0 + \xED\xB5 |0 + \xED\xB3 |0 + \xC1\x4A |0 + \xED\xB4 |0 + \xED\xB6 |0 + \xED\xB2 |0 + \xED\xB1 |0 + \xF0\x60 |0 + \xC2\xAA |0 + \xC2\xA8 |0 + \xC2\xA9 |0 + \xF2\xA6 |0 + \xF2\xA7 |0 + \xC3\xAD |0 + \xC3\xAC |0 + \xF4\xA3 |0 + \xF4\xA4 |0 + \xF4\xA2 |0 + \xF6\xF8 |0 + \xF6\xF9 |0 + \xA5\xDE |0 + \xCA\x48 |0 + \xA8\x73 |0 + \xCD\xA5 |0 + \xAA\xC6 |0 + \xAA\xC5 |0 + \xCD\xA6 |0 + \xD0\x40 |0 + \xAC\xEF |0 + \xCF\xFE |0 + \xAC\xF0 |0 + \xAF\xB6 |0 + \xD2\xF8 |0 + \xD2\xF6 |0 + \xD2\xFC |0 + \xAF\xB7 |0 + \xD2\xF7 |0 + \xD2\xFB |0 + \xD2\xF9 |0 + \xD2\xFA |0 + \xD6\xC8 |0 + \xD6\xCA |0 + \xB2\xBF |0 + \xD6\xC9 |0 + \xB2\xC0 |0 + \xB5\xA2 |0 + \xB5\xA1 |0 + \xB5\x7E |0 + \xDA\xDB |0 + \xDF\x44 |0 + \xB8\x5D |0 + \xB8\x5E |0 + \xDF\x43 |0 + \xDF\x42 |0 + \xE3\x4A |0 + \xBA\xDB |0 + \xBA\xDA |0 + \xE3\x4B |0 + \xE3\x4C |0 + \xBD\x61 |0 + \xBD\x60 |0 + \xEA\xB5 |0 + \xE6\xD3 |0 + \xE6\xD5 |0 + \xE6\xD4 |0 + \xEA\xB4 |0 + \xEA\xB2 |0 + \xEA\xB6 |0 + \xEA\xB3 |0 + \xBF\x73 |0 + \xED\xB7 |0 + \xC1\x4B |0 + \xED\xB8 |0 + \xED\xB9 |0 + \xC2\xAB |0 + \xC2\xAC |0 + \xC4\x75 |0 + \xC5\xD1 |0 + \xA5\xDF |0 + \xD0\x41 |0 + \xD2\xFD |0 + \xAF\xB8 |0 + \xB3\xBA |0 + \xB3\xB9 |0 + \xB5\xA4 |0 + \xDA\xDD |0 + \xB5\xA3 |0 + \xDA\xDC |0 + \xDF\x45 |0 + \xBA\xDC |0 + \xE3\x4D |0 + \xBA\xDD |0 + \xC4\x76 |0 + \xF4\xA5 |0 + \xA6\xCB |0 + \xAA\xC7 |0 + \xCD\xA7 |0 + \xAC\xF2 |0 + \xAC\xF1 |0 + \xD0\x42 |0 + \xD0\x43 |0 + \xD3\x40 |0 + \xD3\x42 |0 + \xAF\xB9 |0 + \xD3\x44 |0 + \xD3\x47 |0 + \xD3\x45 |0 + \xD3\x46 |0 + \xD3\x43 |0 + \xD2\xFE |0 + \xAF\xBA |0 + \xD3\x48 |0 + \xD3\x41 |0 + \xD6\xD3 |0 + \xB2\xC6 |0 + \xD6\xDC |0 + \xB2\xC3 |0 + \xD6\xD5 |0 + \xB2\xC7 |0 + \xB2\xC1 |0 + \xD6\xD0 |0 + \xD6\xDD |0 + \xD6\xD1 |0 + \xD6\xCE |0 + \xB2\xC5 |0 + \xB2\xC2 |0 + \xD6\xD4 |0 + \xD6\xD7 |0 + \xB2\xC4 |0 + \xD6\xD8 |0 + \xB2\xC8 |0 + \xD6\xD9 |0 + \xD6\xCF |0 + \xD6\xD6 |0 + \xD6\xDA |0 + \xD6\xD2 |0 + \xD6\xCD |0 + \xD6\xCB |0 + \xD6\xDB |0 + \xDA\xDF |0 + \xDA\xE4 |0 + \xDA\xE0 |0 + \xDA\xE6 |0 + \xB5\xA7 |0 + \xD6\xCC |0 + \xDA\xE1 |0 + \xB5\xA5 |0 + \xDA\xDE |0 + \xB5\xAC |0 + \xDA\xE2 |0 + \xB5\xAB |0 + \xDA\xE3 |0 + \xB5\xAD |0 + \xB5\xA8 |0 + \xB5\xAE |0 + \xB5\xA9 |0 + \xB5\xAA |0 + \xB5\xA6 |0 + \xDA\xE5 |0 + \xB8\x61 |0 + \xDF\x50 |0 + \xDF\x53 |0 + \xDF\x47 |0 + \xDF\x4C |0 + \xDF\x46 |0 + \xB8\x63 |0 + \xDF\x4A |0 + \xDF\x48 |0 + \xB8\x62 |0 + \xDF\x4F |0 + \xDF\x4E |0 + \xDF\x4B |0 + \xDF\x4D |0 + \xDF\x49 |0 + \xBA\xE1 |0 + \xDF\x52 |0 + \xB8\x5F |0 + \xDF\x51 |0 + \xE3\x5D |0 + \xBA\xE8 |0 + \xE3\x58 |0 + \xBA\xE7 |0 + \xE3\x4E |0 + \xE3\x50 |0 + \xBA\xE0 |0 + \xE3\x55 |0 + \xE3\x54 |0 + \xE3\x57 |0 + \xBA\xE5 |0 + \xE3\x52 |0 + \xE3\x51 |0 + \xBA\xE4 |0 + \xBA\xDF |0 + \xE3\x53 |0 + \xBA\xE2 |0 + \xE3\x59 |0 + \xE3\x5B |0 + \xE3\x56 |0 + \xE3\x4F |0 + \xBA\xE3 |0 + \xBD\x69 |0 + \xBA\xDE |0 + \xE3\x5C |0 + \xE6\xD9 |0 + \xBD\x62 |0 + \xE6\xDB |0 + \xBD\x63 |0 + \xBD\x65 |0 + \xE6\xDE |0 + \xE6\xD6 |0 + \xBA\xE6 |0 + \xE6\xDC |0 + \xE6\xD8 |0 + \xB8\x60 |0 + \xBD\x68 |0 + \xBD\x64 |0 + \xBD\x66 |0 + \xBD\x67 |0 + \xBF\x76 |0 + \xE6\xDD |0 + \xE6\xD7 |0 + \xBD\x6A |0 + \xE6\xDA |0 + \xEA\xC0 |0 + \xEA\xBB |0 + \xEA\xC5 |0 + \xBF\x74 |0 + \xEA\xBD |0 + \xBF\x78 |0 + \xEA\xC3 |0 + \xEA\xBA |0 + \xEA\xB7 |0 + \xEA\xC6 |0 + \xC1\x51 |0 + \xBF\x79 |0 + \xEA\xC2 |0 + \xEA\xB8 |0 + \xBF\x77 |0 + \xEA\xBC |0 + \xBF\x7B |0 + \xEA\xB9 |0 + \xEA\xBE |0 + \xBF\x7A |0 + \xEA\xC1 |0 + \xEA\xC4 |0 + \xED\xCB |0 + \xED\xCC |0 + \xED\xBC |0 + \xED\xC3 |0 + \xED\xC1 |0 + \xC1\x4F |0 + \xED\xC8 |0 + \xEA\xBF |0 + \xED\xBF |0 + \xED\xC9 |0 + \xC1\x4E |0 + \xED\xBE |0 + \xED\xBD |0 + \xED\xC7 |0 + \xED\xC4 |0 + \xED\xC6 |0 + \xED\xBA |0 + \xED\xCA |0 + \xC1\x4C |0 + \xED\xC5 |0 + \xED\xCE |0 + \xED\xC2 |0 + \xC1\x50 |0 + \xC1\x4D |0 + \xED\xC0 |0 + \xED\xBB |0 + \xED\xCD |0 + \xBF\x75 |0 + \xF0\x63 |0 + \xF0\x61 |0 + \xF0\x67 |0 + \xC2\xB0 |0 + \xF0\x65 |0 + \xF0\x64 |0 + \xC2\xB2 |0 + \xF0\x6A |0 + \xC2\xB1 |0 + \xF0\x6B |0 + \xF0\x68 |0 + \xC2\xAE |0 + \xF0\x69 |0 + \xF0\x62 |0 + \xC2\xAF |0 + \xC2\xAD |0 + \xF2\xAB |0 + \xF0\x66 |0 + \xF0\x6C |0 + \xF2\xA8 |0 + \xC3\xB2 |0 + \xC3\xB0 |0 + \xF2\xAA |0 + \xF2\xAC |0 + \xF2\xA9 |0 + \xC3\xB1 |0 + \xC3\xAE |0 + \xC3\xAF |0 + \xC3\xB3 |0 + \xC4\x78 |0 + \xF4\xAA |0 + \xF4\xA9 |0 + \xF4\xA7 |0 + \xF4\xA6 |0 + \xF4\xA8 |0 + \xC4\x77 |0 + \xC4\x79 |0 + \xC4\xF0 |0 + \xF5\xE5 |0 + \xF5\xE4 |0 + \xF6\xFA |0 + \xF6\xFC |0 + \xF6\xFE |0 + \xF6\xFD |0 + \xF6\xFB |0 + \xC5\xA3 |0 + \xC5\xA2 |0 + \xC5\xD3 |0 + \xC5\xD2 |0 + \xC5\xD4 |0 + \xF7\xED |0 + \xF7\xEC |0 + \xF8\xFB |0 + \xF8\xB8 |0 + \xF8\xFC |0 + \xC6\x58 |0 + \xC6\x59 |0 + \xF9\x6D |0 + \xC6\x7E |0 + \xA6\xCC |0 + \xCD\xA8 |0 + \xD0\x45 |0 + \xD0\x46 |0 + \xD0\x44 |0 + \xAC\xF3 |0 + \xD0\x47 |0 + \xD0\x48 |0 + \xD0\x49 |0 + \xD3\x49 |0 + \xD3\x4F |0 + \xD3\x4D |0 + \xAF\xBB |0 + \xD3\x4B |0 + \xD3\x4C |0 + \xD3\x4E |0 + \xD3\x4A |0 + \xB2\xC9 |0 + \xD6\xDE |0 + \xB2\xCB |0 + \xD6\xE0 |0 + \xB2\xCA |0 + \xD6\xDF |0 + \xDA\xE8 |0 + \xB5\xAF |0 + \xDA\xEA |0 + \xDA\xE7 |0 + \xD6\xE1 |0 + \xB5\xB0 |0 + \xF9\xDB |0 + \xDA\xE9 |0 + \xDF\x56 |0 + \xB8\x64 |0 + \xDF\x54 |0 + \xB8\x65 |0 + \xDF\x55 |0 + \xB8\x66 |0 + \xBA\xE9 |0 + \xE3\x61 |0 + \xE3\x5E |0 + \xE3\x60 |0 + \xBA\xEA |0 + \xBA\xEB |0 + \xE3\x5F |0 + \xE6\xDF |0 + \xE6\xE0 |0 + \xBD\x6B |0 + \xE6\xE2 |0 + \xE6\xE1 |0 + \xA2\x61 |0 + \xEA\xCA |0 + \xEA\xCB |0 + \xEA\xC7 |0 + \xEA\xC8 |0 + \xBF\x7C |0 + \xBF\x7D |0 + \xEA\xC9 |0 + \xC1\x57 |0 + \xC1\x53 |0 + \xC1\x58 |0 + \xC1\x54 |0 + \xC1\x56 |0 + \xC1\x52 |0 + \xC1\x55 |0 + \xC2\xB3 |0 + \xED\xCF |0 + \xF2\xAE |0 + \xF2\xAD |0 + \xF4\xAB |0 + \xC4\x7A |0 + \xC4\x7B |0 + \xF7\x41 |0 + \xF5\xE6 |0 + \xF7\x40 |0 + \xF8\xFD |0 + \xF9\xA4 |0 + \xA6\xCD |0 + \xA8\x74 |0 + \xCD\xA9 |0 + \xAA\xC8 |0 + \xAC\xF6 |0 + \xD0\x4C |0 + \xAC\xF4 |0 + \xD0\x4A |0 + \xAC\xF9 |0 + \xAC\xF5 |0 + \xAC\xFA |0 + \xAC\xF8 |0 + \xD0\x4B |0 + \xAC\xF7 |0 + \xAF\xBF |0 + \xAF\xBE |0 + \xD3\x5A |0 + \xAF\xC7 |0 + \xD3\x53 |0 + \xD3\x59 |0 + \xAF\xC3 |0 + \xD3\x52 |0 + \xD3\x58 |0 + \xD3\x56 |0 + \xAF\xC2 |0 + \xAF\xC4 |0 + \xD3\x55 |0 + \xAF\xBD |0 + \xD3\x54 |0 + \xAF\xC8 |0 + \xAF\xC5 |0 + \xAF\xC9 |0 + \xAF\xC6 |0 + \xD3\x51 |0 + \xD3\x50 |0 + \xD3\x57 |0 + \xAF\xC0 |0 + \xAF\xBC |0 + \xAF\xC1 |0 + \xD6\xF0 |0 + \xD6\xE9 |0 + \xB5\xB5 |0 + \xD6\xE8 |0 + \xB2\xCF |0 + \xB2\xD6 |0 + \xB2\xD3 |0 + \xB2\xD9 |0 + \xB2\xD8 |0 + \xB2\xD4 |0 + \xD6\xE2 |0 + \xD6\xE5 |0 + \xD6\xE4 |0 + \xB2\xD0 |0 + \xD6\xE6 |0 + \xD6\xEF |0 + \xB2\xD1 |0 + \xD6\xE3 |0 + \xD6\xEC |0 + \xD6\xED |0 + \xB2\xD2 |0 + \xD6\xEA |0 + \xB2\xD7 |0 + \xB2\xCD |0 + \xB2\xD5 |0 + \xD6\xE7 |0 + \xB2\xCC |0 + \xD6\xEB |0 + \xD6\xEE |0 + \xDA\xFB |0 + \xDA\xF2 |0 + \xB5\xB2 |0 + \xDA\xF9 |0 + \xDA\xF6 |0 + \xDA\xEE |0 + \xDA\xF7 |0 + \xB5\xB4 |0 + \xDA\xEF |0 + \xDA\xEB |0 + \xB8\x6C |0 + \xDA\xF4 |0 + \xB5\xB1 |0 + \xDA\xFA |0 + \xB5\xB8 |0 + \xB5\xBA |0 + \xDA\xED |0 + \xB5\xB9 |0 + \xDA\xF0 |0 + \xB5\xB3 |0 + \xDA\xF8 |0 + \xDA\xF1 |0 + \xDA\xF5 |0 + \xDA\xF3 |0 + \xB5\xB6 |0 + \xDA\xEC |0 + \xB5\xBB |0 + \xB2\xCE |0 + \xB5\xB7 |0 + \xB5\xBC |0 + \xB8\x68 |0 + \xDF\x5D |0 + \xDF\x5F |0 + \xDF\x61 |0 + \xDF\x65 |0 + \xDF\x5B |0 + \xDF\x59 |0 + \xB8\x6A |0 + \xDF\x60 |0 + \xDF\x64 |0 + \xDF\x5C |0 + \xDF\x58 |0 + \xDF\x57 |0 + \xDF\x62 |0 + \xDF\x5A |0 + \xDF\x5E |0 + \xB8\x6B |0 + \xB8\x69 |0 + \xDF\x66 |0 + \xB8\x67 |0 + \xDF\x63 |0 + \xE3\x72 |0 + \xBA\xEE |0 + \xE3\x6A |0 + \xBD\x78 |0 + \xE3\x74 |0 + \xBA\xF1 |0 + \xE3\x78 |0 + \xBA\xF7 |0 + \xE3\x65 |0 + \xE3\x75 |0 + \xE3\x62 |0 + \xE3\x77 |0 + \xE3\x66 |0 + \xBA\xFE |0 + \xBA\xFB |0 + \xE3\x76 |0 + \xE3\x70 |0 + \xBA\xED |0 + \xBA\xF5 |0 + \xBA\xF4 |0 + \xBA\xF3 |0 + \xBA\xF9 |0 + \xE3\x63 |0 + \xBA\xFA |0 + \xE3\x71 |0 + \xBA\xF6 |0 + \xBA\xEC |0 + \xE3\x73 |0 + \xBA\xEF |0 + \xBA\xF0 |0 + \xBA\xF8 |0 + \xE3\x68 |0 + \xE3\x67 |0 + \xE3\x64 |0 + \xE3\x6C |0 + \xE3\x69 |0 + \xE3\x6D |0 + \xBA\xFD |0 + \xE3\x79 |0 + \xBA\xF2 |0 + \xE3\x6E |0 + \xE3\x6F |0 + \xE3\x6B |0 + \xBA\xFC |0 + \xE6\xE7 |0 + \xBD\x70 |0 + \xBD\x79 |0 + \xBD\x75 |0 + \xE6\xE4 |0 + \xBD\x72 |0 + \xBD\x76 |0 + \xE6\xF0 |0 + \xBD\x6C |0 + \xE6\xE8 |0 + \xBD\x74 |0 + \xE6\xEB |0 + \xE6\xE6 |0 + \xBD\x73 |0 + \xBD\x77 |0 + \xE6\xE5 |0 + \xBD\x71 |0 + \xE6\xEF |0 + \xBD\x6E |0 + \xE6\xEE |0 + \xE6\xED |0 + \xBD\x7A |0 + \xE5\x72 |0 + \xBD\x6D |0 + \xE6\xEC |0 + \xE6\xE3 |0 + \xBD\x7B |0 + \xE6\xEA |0 + \xBD\x6F |0 + \xE6\xE9 |0 + \xBF\xA2 |0 + \xBF\xA7 |0 + \xBF\x7E |0 + \xEA\xD8 |0 + \xEA\xCF |0 + \xEA\xDB |0 + \xEA\xD3 |0 + \xEA\xD9 |0 + \xBF\xA8 |0 + \xBF\xA1 |0 + \xEA\xCC |0 + \xEA\xD2 |0 + \xEA\xDC |0 + \xEA\xD5 |0 + \xEA\xDA |0 + \xEA\xCE |0 + \xEA\xD6 |0 + \xBF\xA3 |0 + \xEA\xD4 |0 + \xBF\xA6 |0 + \xBF\xA5 |0 + \xEA\xD0 |0 + \xEA\xD1 |0 + \xEA\xCD |0 + \xEA\xD7 |0 + \xBF\xA4 |0 + \xEA\xDE |0 + \xEA\xDD |0 + \xED\xDA |0 + \xED\xD6 |0 + \xC1\x5F |0 + \xED\xD0 |0 + \xC1\x59 |0 + \xC1\x69 |0 + \xED\xDC |0 + \xC1\x61 |0 + \xC1\x5D |0 + \xED\xD3 |0 + \xC1\x64 |0 + \xC1\x67 |0 + \xED\xDE |0 + \xC1\x5C |0 + \xED\xD5 |0 + \xC1\x65 |0 + \xED\xE0 |0 + \xED\xDD |0 + \xED\xD1 |0 + \xC1\x60 |0 + \xC1\x5A |0 + \xC1\x68 |0 + \xED\xD8 |0 + \xC1\x63 |0 + \xED\xD2 |0 + \xC1\x5E |0 + \xED\xDF |0 + \xC1\x62 |0 + \xC1\x5B |0 + \xED\xD9 |0 + \xC1\x66 |0 + \xED\xD7 |0 + \xED\xDB |0 + \xF0\x6E |0 + \xF0\x74 |0 + \xC2\xB9 |0 + \xF0\x77 |0 + \xC2\xB4 |0 + \xC2\xB5 |0 + \xF0\x6F |0 + \xF0\x76 |0 + \xF0\x71 |0 + \xC2\xBA |0 + \xC2\xB7 |0 + \xF0\x6D |0 + \xC2\xB6 |0 + \xF0\x73 |0 + \xF0\x75 |0 + \xC2\xB8 |0 + \xF0\x72 |0 + \xF0\x70 |0 + \xF2\xB8 |0 + \xC3\xB7 |0 + \xC3\xB8 |0 + \xC3\xB4 |0 + \xC3\xB5 |0 + \xF2\xB4 |0 + \xF2\xB2 |0 + \xF2\xB6 |0 + \xC3\xBA |0 + \xF2\xB7 |0 + \xF2\xB0 |0 + \xF2\xAF |0 + \xF2\xB3 |0 + \xF2\xB1 |0 + \xC3\xB6 |0 + \xF2\xB5 |0 + \xF4\xAC |0 + \xC4\x7E |0 + \xC4\x7D |0 + \xF4\xAD |0 + \xF4\xAF |0 + \xF4\xAE |0 + \xC4\xA1 |0 + \xF5\xEB |0 + \xF5\xE8 |0 + \xF5\xE9 |0 + \xF5\xE7 |0 + \xF5\xEA |0 + \xC4\xF2 |0 + \xF5\xEC |0 + \xC4\xF1 |0 + \xF7\x42 |0 + \xC5\xD5 |0 + \xC5\xD7 |0 + \xF7\xEE |0 + \xC5\xD6 |0 + \xF8\xB9 |0 + \xF9\x40 |0 + \xF9\x42 |0 + \xF8\xFE |0 + \xF9\x41 |0 + \xC6\x6C |0 + \xA6\xCE |0 + \xAC\xFB |0 + \xD2\x6F |0 + \xAF\xCA |0 + \xB2\xDA |0 + \xDA\xFC |0 + \xDA\xFD |0 + \xEA\xDF |0 + \xC1\x6A |0 + \xED\xE1 |0 + \xC2\xBB |0 + \xF2\xBA |0 + \xF2\xB9 |0 + \xC4\xA2 |0 + \xF5\xED |0 + \xF7\x43 |0 + \xC5\xF8 |0 + \xCA\x49 |0 + \xAA\xC9 |0 + \xA8\x75 |0 + \xD0\x4D |0 + \xD3\x60 |0 + \xD3\x5B |0 + \xD3\x5F |0 + \xD3\x5D |0 + \xAF\xCB |0 + \xD3\x5E |0 + \xD3\x5C |0 + \xD6\xF1 |0 + \xDA\xFE |0 + \xDB\x40 |0 + \xDF\x69 |0 + \xDF\x6A |0 + \xB8\x6E |0 + \xB8\x6F |0 + \xDF\x68 |0 + \xDF\x6B |0 + \xDF\x67 |0 + \xB8\x6D |0 + \xBB\x40 |0 + \xB8\x70 |0 + \xE3\x7A |0 + \xBD\x7C |0 + \xE6\xF1 |0 + \xBD\x7D |0 + \xBF\xA9 |0 + \xEA\xE2 |0 + \xEA\xE0 |0 + \xEA\xE1 |0 + \xED\xE4 |0 + \xED\xE3 |0 + \xED\xE2 |0 + \xF2\xBB |0 + \xC3\xB9 |0 + \xF2\xBC |0 + \xF7\x44 |0 + \xC5\xF9 |0 + \xF8\xBA |0 + \xA6\xCF |0 + \xAA\xCB |0 + \xAA\xCA |0 + \xD0\x4F |0 + \xAC\xFC |0 + \xD0\x4E |0 + \xD3\x62 |0 + \xAF\xCC |0 + \xD6\xF2 |0 + \xD3\x61 |0 + \xB2\xDC |0 + \xD6\xF5 |0 + \xD6\xF3 |0 + \xD6\xF4 |0 + \xB2\xDB |0 + \xDB\x42 |0 + \xDB\x43 |0 + \xDB\x41 |0 + \xB8\x73 |0 + \xDF\x6D |0 + \xDF\x6C |0 + \xDF\x6E |0 + \xB8\x72 |0 + \xB8\x71 |0 + \xE6\xF2 |0 + \xE6\xF4 |0 + \xBD\x7E |0 + \xE6\xF3 |0 + \xEA\xE3 |0 + \xBF\xAA |0 + \xF0\x79 |0 + \xF0\x78 |0 + \xC3\xBB |0 + \xF2\xBD |0 + \xC3\xBD |0 + \xC3\xBC |0 + \xF4\xB0 |0 + \xF5\xEE |0 + \xC4\xF3 |0 + \xA6\xD0 |0 + \xD0\x50 |0 + \xAC\xFD |0 + \xD3\x65 |0 + \xAF\xCE |0 + \xD3\x64 |0 + \xD3\x63 |0 + \xAF\xCD |0 + \xD6\xFB |0 + \xD6\xFD |0 + \xD6\xF6 |0 + \xD6\xF7 |0 + \xB2\xDD |0 + \xD6\xF8 |0 + \xB2\xDE |0 + \xD6\xFC |0 + \xD6\xF9 |0 + \xD6\xFA |0 + \xB2\xDF |0 + \xB5\xBE |0 + \xB5\xBF |0 + \xDB\x44 |0 + \xDF\x6F |0 + \xDF\x70 |0 + \xE3\x7E |0 + \xBB\x43 |0 + \xBB\x41 |0 + \xBB\x42 |0 + \xE3\x7B |0 + \xE3\x7C |0 + \xE3\x7D |0 + \xE6\xF9 |0 + \xE6\xFA |0 + \xBD\xA1 |0 + \xE6\xF7 |0 + \xE6\xF6 |0 + \xE6\xF8 |0 + \xE6\xF5 |0 + \xBF\xAD |0 + \xEA\xE4 |0 + \xBF\xAB |0 + \xBF\xAC |0 + \xED\xE6 |0 + \xC1\x6B |0 + \xED\xE5 |0 + \xEF\xA8 |0 + \xF0\x7A |0 + \xF0\x7B |0 + \xC2\xBC |0 + \xC2\xBD |0 + \xC1\x6C |0 + \xF2\xBE |0 + \xF2\xBF |0 + \xF4\xB1 |0 + \xC4\xA3 |0 + \xA6\xD1 |0 + \xA6\xD2 |0 + \xAC\xFE |0 + \xAA\xCC |0 + \xAF\xCF |0 + \xD0\x51 |0 + \xB5\xC0 |0 + \xA6\xD3 |0 + \xAD\x41 |0 + \xD0\x52 |0 + \xD0\x53 |0 + \xAD\x40 |0 + \xAD\x42 |0 + \xA6\xD4 |0 + \xD0\x54 |0 + \xAF\xD1 |0 + \xD3\x66 |0 + \xAF\xD3 |0 + \xAF\xD0 |0 + \xAF\xD2 |0 + \xD7\x41 |0 + \xB2\xE0 |0 + \xD7\x40 |0 + \xD6\xFE |0 + \xDF\x71 |0 + \xE3\xA1 |0 + \xBD\xA2 |0 + \xBF\xAE |0 + \xEA\xE6 |0 + \xEA\xE5 |0 + \xED\xE7 |0 + \xF5\xEF |0 + \xA6\xD5 |0 + \xCB\x73 |0 + \xCD\xAA |0 + \xAD\x43 |0 + \xD0\x55 |0 + \xD3\x68 |0 + \xAF\xD4 |0 + \xD3\x67 |0 + \xAF\xD5 |0 + \xD7\x43 |0 + \xB2\xE2 |0 + \xD7\x42 |0 + \xD7\x44 |0 + \xB2\xE1 |0 + \xDB\x46 |0 + \xDB\x47 |0 + \xDB\x45 |0 + \xB5\xC1 |0 + \xB8\x74 |0 + \xB8\x75 |0 + \xBB\x45 |0 + \xE3\xA3 |0 + \xE3\xA2 |0 + \xBB\x44 |0 + \xE6\xFB |0 + \xE6\xFC |0 + \xEA\xE7 |0 + \xC1\x70 |0 + \xC1\x6F |0 + \xC1\x6D |0 + \xC1\x6E |0 + \xC1\x71 |0 + \xF0\x7C |0 + \xC2\xBF |0 + \xC2\xBE |0 + \xF2\xC0 |0 + \xF4\xB2 |0 + \xC5\xA5 |0 + \xC5\xA4 |0 + \xA6\xD6 |0 + \xD1\xFB |0 + \xB8\x77 |0 + \xB5\xC2 |0 + \xB8\x76 |0 + \xBB\x46 |0 + \xA6\xD7 |0 + \xC9\xA9 |0 + \xA6\xD8 |0 + \xA6\xD9 |0 + \xCD\xAB |0 + \xCB\x76 |0 + \xCB\x77 |0 + \xA8\x77 |0 + \xCB\x74 |0 + \xA8\x76 |0 + \xA8\x79 |0 + \xCB\x75 |0 + \xA8\x7B |0 + \xA8\x7A |0 + \xCB\x78 |0 + \xA8\x78 |0 + \xAA\xD1 |0 + \xAA\xCF |0 + \xCD\xAD |0 + \xAA\xCE |0 + \xAA\xD3 |0 + \xAA\xD5 |0 + \xAA\xD2 |0 + \xCD\xB0 |0 + \xCD\xAC |0 + \xAA\xD6 |0 + \xAA\xD0 |0 + \xA8\x7C |0 + \xAA\xD4 |0 + \xCD\xAF |0 + \xCD\xAE |0 + \xAA\xCD |0 + \xD0\x5B |0 + \xAD\x47 |0 + \xAD\x48 |0 + \xD0\x5D |0 + \xD0\x57 |0 + \xD0\x5A |0 + \xD0\x63 |0 + \xD0\x61 |0 + \xAD\x49 |0 + \xD0\x67 |0 + \xAD\x4C |0 + \xD0\x64 |0 + \xD0\x5C |0 + \xD0\x59 |0 + \xDB\x49 |0 + \xD0\x62 |0 + \xAD\x44 |0 + \xD0\x65 |0 + \xD0\x56 |0 + \xD0\x5F |0 + \xAD\x46 |0 + \xAD\x4B |0 + \xD0\x60 |0 + \xAD\x4F |0 + \xAD\x4D |0 + \xD0\x58 |0 + \xAD\x4A |0 + \xD0\x5E |0 + \xAD\x4E |0 + \xAD\x45 |0 + \xD0\x66 |0 + \xAF\xDA |0 + \xAF\xE3 |0 + \xAF\xD8 |0 + \xAF\xD6 |0 + \xD3\x6A |0 + \xAF\xDE |0 + \xAF\xDB |0 + \xD3\x6C |0 + \xAF\xDD |0 + \xD3\x6B |0 + \xD3\x69 |0 + \xD3\x6E |0 + \xAF\xE2 |0 + \xAF\xE0 |0 + \xDB\x48 |0 + \xD3\x6F |0 + \xD3\x6D |0 + \xAF\xD7 |0 + \xAF\xD9 |0 + \xAF\xDC |0 + \xAF\xDF |0 + \xAF\xE1 |0 + \xD7\x4E |0 + \xB2\xE4 |0 + \xD7\x45 |0 + \xD7\x47 |0 + \xD7\x48 |0 + \xD7\x50 |0 + \xD7\x4C |0 + \xD7\x4A |0 + \xD7\x4D |0 + \xD7\x51 |0 + \xB2\xE5 |0 + \xB2\xE9 |0 + \xD7\x46 |0 + \xD7\x4F |0 + \xB2\xE7 |0 + \xB2\xE6 |0 + \xD7\x4B |0 + \xD7\x49 |0 + \xB2\xE3 |0 + \xB2\xE8 |0 + \xB5\xC8 |0 + \xDB\x51 |0 + \xDB\x4F |0 + \xB5\xCA |0 + \xDB\x4A |0 + \xDF\xA1 |0 + \xB5\xC9 |0 + \xDB\x4E |0 + \xDB\x4B |0 + \xB5\xC5 |0 + \xB5\xCB |0 + \xDB\x50 |0 + \xB5\xC7 |0 + \xDB\x4D |0 + \xBB\x47 |0 + \xB5\xC6 |0 + \xDB\x4C |0 + \xB5\xCC |0 + \xB5\xC4 |0 + \xB5\xC3 |0 + \xDF\x77 |0 + \xDF\x75 |0 + \xDF\x7B |0 + \xDF\x73 |0 + \xDF\xA2 |0 + \xDF\x78 |0 + \xDF\x72 |0 + \xB8\x7B |0 + \xB8\xA3 |0 + \xDF\x7D |0 + \xDF\x76 |0 + \xB8\x7E |0 + \xB8\x7C |0 + \xDF\x7E |0 + \xB8\x79 |0 + \xB8\x78 |0 + \xDF\x79 |0 + \xB8\x7D |0 + \xB5\xCD |0 + \xDF\x7C |0 + \xDF\x74 |0 + \xB8\x7A |0 + \xB8\xA1 |0 + \xB8\xA2 |0 + \xBB\x4C |0 + \xBB\x48 |0 + \xBB\x4D |0 + \xE3\xA6 |0 + \xE3\xA5 |0 + \xE3\xA7 |0 + \xBB\x4A |0 + \xE3\xA4 |0 + \xBB\x4B |0 + \xE3\xAA |0 + \xE3\xA9 |0 + \xE3\xA8 |0 + \xBB\x49 |0 + \xE7\x41 |0 + \xE7\x44 |0 + \xBD\xA8 |0 + \xE7\x43 |0 + \xBD\xA7 |0 + \xBD\xA3 |0 + \xBD\xA4 |0 + \xBD\xA5 |0 + \xE7\x40 |0 + \xE6\xFE |0 + \xBD\xA6 |0 + \xE7\x42 |0 + \xE6\xFD |0 + \xEA\xE9 |0 + \xEA\xF3 |0 + \xBF\xB1 |0 + \xBF\xB0 |0 + \xEA\xED |0 + \xEA\xEF |0 + \xEA\xEA |0 + \xEA\xEE |0 + \xEA\xE8 |0 + \xEA\xF1 |0 + \xBF\xAF |0 + \xEA\xF0 |0 + \xEA\xEC |0 + \xEA\xF2 |0 + \xEA\xEB |0 + \xC1\x74 |0 + \xED\xE8 |0 + \xED\xEE |0 + \xC1\x78 |0 + \xC1\x7A |0 + \xC1\x77 |0 + \xC1\x76 |0 + \xC1\x75 |0 + \xC1\x73 |0 + \xED\xE9 |0 + \xED\xEC |0 + \xC1\x72 |0 + \xED\xED |0 + \xC1\x79 |0 + \xED\xEB |0 + \xED\xEA |0 + \xC2\xC0 |0 + \xC2\xC1 |0 + \xF0\xA1 |0 + \xF0\x7D |0 + \xF0\x7E |0 + \xF2\xC2 |0 + \xF2\xC1 |0 + \xC3\xBE |0 + \xF4\xB4 |0 + \xC4\xA4 |0 + \xF4\xB3 |0 + \xF5\xF0 |0 + \xF7\x45 |0 + \xC5\xA6 |0 + \xF9\x43 |0 + \xF9\x44 |0 + \xC5\xD8 |0 + \xA6\xDA |0 + \xAA\xD7 |0 + \xDB\x52 |0 + \xBB\x4E |0 + \xC1\x7B |0 + \xED\xEF |0 + \xA6\xDB |0 + \xAF\xE5 |0 + \xAF\xE4 |0 + \xDB\x53 |0 + \xEA\xF4 |0 + \xA6\xDC |0 + \xAD\x50 |0 + \xDB\x54 |0 + \xDB\x55 |0 + \xDB\x56 |0 + \xBB\x4F |0 + \xBF\xB2 |0 + \xA6\xDD |0 + \xAA\xD8 |0 + \xD0\x68 |0 + \xAF\xE6 |0 + \xD3\x70 |0 + \xB2\xEA |0 + \xDB\x57 |0 + \xB8\xA4 |0 + \xBB\x50 |0 + \xBF\xB3 |0 + \xC1\x7C |0 + \xC2\xC2 |0 + \xF4\xB5 |0 + \xA6\xDE |0 + \xAA\xD9 |0 + \xAF\xE7 |0 + \xD7\x52 |0 + \xB5\xCE |0 + \xBB\x51 |0 + \xE3\xAB |0 + \xE7\x45 |0 + \xA6\xDF |0 + \xB5\xCF |0 + \xDF\xA3 |0 + \xBB\x52 |0 + \xA6\xE0 |0 + \xCD\xB1 |0 + \xD0\x69 |0 + \xAD\x51 |0 + \xD3\x72 |0 + \xAF\xEA |0 + \xAF\xE8 |0 + \xAF\xE9 |0 + \xAF\xEB |0 + \xD3\x71 |0 + \xD7\x57 |0 + \xD7\x54 |0 + \xD7\x56 |0 + \xB2\xEB |0 + \xB2\xED |0 + \xB2\xEC |0 + \xD7\x53 |0 + \xB2\xEE |0 + \xD7\x55 |0 + \xDB\x58 |0 + \xDB\x59 |0 + \xDB\x5A |0 + \xDF\xA6 |0 + \xDF\xA7 |0 + \xDF\xA5 |0 + \xDF\xA8 |0 + \xB8\xA5 |0 + \xDF\xA4 |0 + \xBB\x53 |0 + \xE7\x4A |0 + \xE7\x46 |0 + \xE7\x49 |0 + \xE7\x4B |0 + \xE7\x48 |0 + \xE7\x47 |0 + \xEA\xF5 |0 + \xEA\xF6 |0 + \xEA\xF7 |0 + \xBF\xB4 |0 + \xBF\xB5 |0 + \xED\xF1 |0 + \xED\xF0 |0 + \xED\xF2 |0 + \xF0\xA3 |0 + \xF0\xA2 |0 + \xF2\xC4 |0 + \xF2\xC5 |0 + \xF2\xC3 |0 + \xC4\xA5 |0 + \xF4\xB6 |0 + \xF4\xB7 |0 + \xF7\x46 |0 + \xF7\xEF |0 + \xF8\xBB |0 + \xA6\xE1 |0 + \xA8\x7D |0 + \xC1\x7D |0 + \xA6\xE2 |0 + \xD7\x58 |0 + \xDB\x5B |0 + \xC6\x41 |0 + \xCA\x4A |0 + \xCA\x4B |0 + \xCA\x4D |0 + \xA6\xE3 |0 + \xCA\x4E |0 + \xCA\x4C |0 + \xCB\xA2 |0 + \xCB\xA3 |0 + \xCB\x7B |0 + \xCB\xA1 |0 + \xA8\xA1 |0 + \xA8\xA2 |0 + \xCB\x7C |0 + \xCB\x7A |0 + \xCB\x79 |0 + \xCB\x7D |0 + \xA8\x7E |0 + \xCB\x7E |0 + \xD0\x6A |0 + \xCD\xB6 |0 + \xAA\xDC |0 + \xCD\xB5 |0 + \xCD\xB7 |0 + \xAA\xDB |0 + \xCD\xBC |0 + \xAA\xDF |0 + \xCD\xB2 |0 + \xCD\xC0 |0 + \xCD\xC6 |0 + \xAA\xE6 |0 + \xCD\xC3 |0 + \xAA\xE3 |0 + \xCD\xB9 |0 + \xCD\xBF |0 + \xCD\xC1 |0 + \xCD\xB4 |0 + \xAA\xE2 |0 + \xAA\xDD |0 + \xCD\xBA |0 + \xAA\xE4 |0 + \xAA\xE7 |0 + \xAA\xE1 |0 + \xAA\xDA |0 + \xCD\xBE |0 + \xCD\xB8 |0 + \xCD\xC5 |0 + \xAA\xE9 |0 + \xAA\xE5 |0 + \xAA\xE0 |0 + \xCD\xBD |0 + \xAF\xEC |0 + \xCD\xBB |0 + \xAA\xDE |0 + \xAA\xE8 |0 + \xCD\xB3 |0 + \xCD\xC2 |0 + \xCD\xC4 |0 + \xAD\x62 |0 + \xAD\x5C |0 + \xAD\x64 |0 + \xAD\x61 |0 + \xD0\x71 |0 + \xD0\x74 |0 + \xAD\x5D |0 + \xD0\x6B |0 + \xAD\x56 |0 + \xAD\x60 |0 + \xAD\x63 |0 + \xAD\x65 |0 + \xD0\xA2 |0 + \xD0\x77 |0 + \xAD\x55 |0 + \xD0\xA1 |0 + \xAD\x59 |0 + \xAD\x57 |0 + \xAD\x52 |0 + \xD0\x6F |0 + \xD0\x7E |0 + \xD0\x73 |0 + \xD0\x76 |0 + \xD0\xA5 |0 + \xAD\x66 |0 + \xD0\x7D |0 + \xAD\x5E |0 + \xD0\x78 |0 + \xD0\xA4 |0 + \xD0\x75 |0 + \xD0\x79 |0 + \xD0\x7C |0 + \xD0\x6D |0 + \xD0\xA3 |0 + \xD0\x7B |0 + \xD0\x6C |0 + \xD0\x70 |0 + \xAD\x5F |0 + \xAD\x5A |0 + \xAD\x53 |0 + \xAD\x58 |0 + \xAD\x54 |0 + \xAD\x67 |0 + \xD0\x6E |0 + \xD3\xA5 |0 + \xAD\x5B |0 + \xD0\x7A |0 + \xCE\x41 |0 + \xD3\xA8 |0 + \xAF\xFA |0 + \xD3\x76 |0 + \xD3\xA3 |0 + \xD3\x7D |0 + \xD3\xB2 |0 + \xD3\xAA |0 + \xD3\x7E |0 + \xD3\xA9 |0 + \xD3\x78 |0 + \xD3\x7C |0 + \xD3\xB5 |0 + \xAF\xFD |0 + \xD3\xAD |0 + \xD3\xA4 |0 + \xAF\xED |0 + \xD3\xB3 |0 + \xD3\x74 |0 + \xD3\xAC |0 + \xAF\xFC |0 + \xAF\xF7 |0 + \xD3\x73 |0 + \xAF\xF5 |0 + \xAF\xF4 |0 + \xAF\xF9 |0 + \xD3\xAB |0 + \xAF\xF1 |0 + \xAF\xF8 |0 + \xD0\x72 |0 + \xDB\x5C |0 + \xD3\xA6 |0 + \xD3\x7A |0 + \xAF\xFB |0 + \xD3\x7B |0 + \xD3\xA1 |0 + \xAF\xFE |0 + \xD3\x75 |0 + \xD3\xAF |0 + \xD3\xAE |0 + \xD3\xB6 |0 + \xAF\xF3 |0 + \xAF\xF0 |0 + \xD3\xB4 |0 + \xD3\xB0 |0 + \xD3\xA7 |0 + \xD3\xA2 |0 + \xAF\xF6 |0 + \xAF\xF2 |0 + \xD3\x77 |0 + \xAF\xEE |0 + \xD3\xB1 |0 + \xAF\xEF |0 + \xD3\x79 |0 + \xD7\x5E |0 + \xD7\x60 |0 + \xD7\x65 |0 + \xD7\x79 |0 + \xB2\xFC |0 + \xB2\xF2 |0 + \xD7\x5D |0 + \xB2\xFD |0 + \xB2\xFE |0 + \xD7\x68 |0 + \xD7\x6F |0 + \xD7\x75 |0 + \xD7\x62 |0 + \xD7\x69 |0 + \xB3\x40 |0 + \xD7\x77 |0 + \xD7\x72 |0 + \xB2\xFA |0 + \xB2\xF8 |0 + \xD7\x6E |0 + \xD7\x6A |0 + \xD7\x5C |0 + \xB2\xEF |0 + \xD7\x61 |0 + \xD7\x59 |0 + \xB2\xF7 |0 + \xB2\xF9 |0 + \xD7\x66 |0 + \xD7\x63 |0 + \xB2\xF4 |0 + \xD7\x73 |0 + \xB2\xF1 |0 + \xD7\x64 |0 + \xD7\x7A |0 + \xD7\x6C |0 + \xD7\x6B |0 + \xB2\xF0 |0 + \xB2\xFB |0 + \xB2\xF3 |0 + \xD7\x5A |0 + \xD7\x5F |0 + \xD7\x70 |0 + \xD7\x76 |0 + \xB3\x41 |0 + \xD7\x5B |0 + \xD7\x67 |0 + \xD7\x6D |0 + \xB2\xF6 |0 + \xD7\x78 |0 + \xD7\x71 |0 + \xD7\x74 |0 + \xB2\xF5 |0 + \xDB\x6C |0 + \xDB\x60 |0 + \xB5\xD7 |0 + \xDB\x7D |0 + \xDB\xA7 |0 + \xDB\xAA |0 + \xB5\xD5 |0 + \xDB\x68 |0 + \xDB\xA3 |0 + \xDB\x69 |0 + \xDB\x77 |0 + \xB5\xE2 |0 + \xDB\x73 |0 + \xB5\xDF |0 + \xDB\x74 |0 + \xDB\x5D |0 + \xDB\xA4 |0 + \xB5\xE8 |0 + \xDB\xA1 |0 + \xDB\x75 |0 + \xDB\xAC |0 + \xDB\x70 |0 + \xDF\xC8 |0 + \xDB\xAF |0 + \xB5\xE6 |0 + \xDB\x6E |0 + \xDB\x7A |0 + \xB5\xE9 |0 + \xB5\xD4 |0 + \xDB\x72 |0 + \xDB\xAD |0 + \xDB\x6B |0 + \xDB\x64 |0 + \xDB\x6F |0 + \xDB\x63 |0 + \xDB\x61 |0 + \xB5\xD0 |0 + \xDB\xA5 |0 + \xDB\x6A |0 + \xDB\xA8 |0 + \xDB\xA9 |0 + \xB5\xD8 |0 + \xB5\xDD |0 + \xB5\xD9 |0 + \xB5\xE1 |0 + \xDB\x7E |0 + \xB5\xDA |0 + \xDB\x76 |0 + \xDB\x66 |0 + \xB5\xD2 |0 + \xDB\x5E |0 + \xDB\xA2 |0 + \xDB\xAB |0 + \xDB\x65 |0 + \xB5\xE0 |0 + \xDB\xB0 |0 + \xDB\x71 |0 + \xDB\x6D |0 + \xB5\xD1 |0 + \xB5\xE5 |0 + \xDB\x7C |0 + \xB5\xE7 |0 + \xDB\x78 |0 + \xB5\xDC |0 + \xB5\xD6 |0 + \xB5\xDE |0 + \xB5\xD3 |0 + \xB5\xE4 |0 + \xDB\x79 |0 + \xDB\x67 |0 + \xDB\x7B |0 + \xDB\x62 |0 + \xDB\xA6 |0 + \xDB\xAE |0 + \xDB\x5F |0 + \xDF\xC7 |0 + \xDF\xDD |0 + \xB8\x55 |0 + \xDF\xCC |0 + \xDF\xCA |0 + \xDF\xB5 |0 + \xB8\xA9 |0 + \xDF\xC5 |0 + \xDF\xD9 |0 + \xDF\xC1 |0 + \xB8\xB1 |0 + \xDF\xD8 |0 + \xDF\xBF |0 + \xB5\xE3 |0 + \xDF\xCF |0 + \xDF\xC0 |0 + \xDF\xD6 |0 + \xB8\xB0 |0 + \xB8\xA8 |0 + \xDF\xAA |0 + \xDF\xB2 |0 + \xDF\xCB |0 + \xDF\xC3 |0 + \xDF\xDC |0 + \xDF\xC6 |0 + \xB8\xB6 |0 + \xDF\xD7 |0 + \xB8\xAD |0 + \xDF\xC9 |0 + \xDF\xD1 |0 + \xDF\xB6 |0 + \xDF\xD0 |0 + \xDF\xE1 |0 + \xDF\xB1 |0 + \xDF\xD2 |0 + \xDF\xDF |0 + \xDF\xAB |0 + \xB5\xDB |0 + \xDF\xB9 |0 + \xDF\xB8 |0 + \xB8\xAF |0 + \xDF\xBC |0 + \xDF\xBE |0 + \xDF\xCD |0 + \xDF\xDE |0 + \xB8\xB2 |0 + \xB8\xB3 |0 + \xDF\xB0 |0 + \xB8\xAB |0 + \xDF\xB4 |0 + \xDF\xDA |0 + \xB8\xB4 |0 + \xB8\xAC |0 + \xB8\xAE |0 + \xB8\xB5 |0 + \xDF\xE0 |0 + \xDF\xD3 |0 + \xDF\xCE |0 + \xDF\xBB |0 + \xDF\xBA |0 + \xB8\xAA |0 + \xDF\xAC |0 + \xB8\xA7 |0 + \xDF\xC4 |0 + \xDF\xAD |0 + \xDF\xC2 |0 + \xDF\xB7 |0 + \xDF\xDB |0 + \xB8\xA6 |0 + \xDF\xB3 |0 + \xDF\xAF |0 + \xDF\xD5 |0 + \xDF\xAE |0 + \xBB\x60 |0 + \xE3\xD3 |0 + \xE3\xC2 |0 + \xE3\xAC |0 + \xE3\xCA |0 + \xBB\x58 |0 + \xE3\xBB |0 + \xE3\xC5 |0 + \xBB\x5B |0 + \xE3\xBE |0 + \xBB\x59 |0 + \xE3\xAF |0 + \xE3\xCD |0 + \xE3\xAE |0 + \xE3\xC1 |0 + \xE3\xAD |0 + \xE3\xBF |0 + \xE3\xC8 |0 + \xE3\xC6 |0 + \xE3\xBA |0 + \xE3\xB5 |0 + \xE3\xB3 |0 + \xE3\xB4 |0 + \xE3\xC7 |0 + \xE3\xD2 |0 + \xE3\xBC |0 + \xBB\x5A |0 + \xE3\xB7 |0 + \xE3\xCB |0 + \xBB\x5D |0 + \xE3\xB6 |0 + \xE3\xB0 |0 + \xE3\xC0 |0 + \xBB\x61 |0 + \xBB\x55 |0 + \xBB\x5E |0 + \xE3\xB8 |0 + \xE3\xB2 |0 + \xBB\x57 |0 + \xDF\xD4 |0 + \xBB\x56 |0 + \xE3\xC3 |0 + \xBB\x54 |0 + \xBB\x63 |0 + \xBB\x5C |0 + \xE3\xC4 |0 + \xE3\xB9 |0 + \xE3\xB1 |0 + \xE3\xCC |0 + \xE3\xBD |0 + \xBB\x62 |0 + \xE3\xD0 |0 + \xBB\x5F |0 + \xE3\xCF |0 + \xE3\xC9 |0 + \xE3\xCE |0 + \xE3\xD1 |0 + \xE7\x73 |0 + \xE7\x74 |0 + \xE7\x67 |0 + \xE7\x66 |0 + \xE7\x62 |0 + \xBD\xB4 |0 + \xBD\xAC |0 + \xE7\x76 |0 + \xE7\x75 |0 + \xDF\xA9 |0 + \xE7\x5F |0 + \xE7\x63 |0 + \xE7\x5D |0 + \xE7\x70 |0 + \xE7\x61 |0 + \xE7\x77 |0 + \xE7\x5A |0 + \xE7\x58 |0 + \xE7\x64 |0 + \xE7\x6E |0 + \xE7\x69 |0 + \xBD\xB6 |0 + \xE7\x4F |0 + \xE7\x6D |0 + \xBD\xB7 |0 + \xDF\xBD |0 + \xE7\x5B |0 + \xE7\x52 |0 + \xE7\x55 |0 + \xE7\x7B |0 + \xE7\x5C |0 + \xE7\x53 |0 + \xE7\x51 |0 + \xE7\x4E |0 + \xBD\xB0 |0 + \xE7\x65 |0 + \xBD\xAF |0 + \xBD\xB3 |0 + \xE7\x60 |0 + \xE7\x68 |0 + \xBD\xA9 |0 + \xE7\x78 |0 + \xE7\x7C |0 + \xBD\xAB |0 + \xE7\x57 |0 + \xE7\x6B |0 + \xE7\x6F |0 + \xE7\x54 |0 + \xE7\x79 |0 + \xBD\xB2 |0 + \xBD\xB1 |0 + \xE7\x4C |0 + \xBD\xB5 |0 + \xE7\x72 |0 + \xE7\x56 |0 + \xE7\x6A |0 + \xE7\x50 |0 + \xE7\x5E |0 + \xE7\x59 |0 + \xBD\xAD |0 + \xBD\xAE |0 + \xE7\x6C |0 + \xE7\x7D |0 + \xE7\x7A |0 + \xE7\x71 |0 + \xE7\x4D |0 + \xBD\xAA |0 + \xEB\x49 |0 + \xEB\x40 |0 + \xEB\x43 |0 + \xBF\xBB |0 + \xEB\x45 |0 + \xEA\xF9 |0 + \xEB\x41 |0 + \xEB\x47 |0 + \xBF\xB8 |0 + \xBF\xBC |0 + \xBF\xB6 |0 + \xEA\xFB |0 + \xEB\x4C |0 + \xEB\x46 |0 + \xEA\xFC |0 + \xEB\x55 |0 + \xEB\x4F |0 + \xEA\xF8 |0 + \xEE\x46 |0 + \xEA\xFE |0 + \xBF\xB7 |0 + \xEB\x4A |0 + \xEB\x54 |0 + \xBF\xBF |0 + \xEB\x51 |0 + \xEA\xFD |0 + \xEB\x44 |0 + \xEB\x48 |0 + \xEB\x42 |0 + \xEB\x56 |0 + \xEB\x53 |0 + \xEB\x50 |0 + \xBF\xB9 |0 + \xBF\xBA |0 + \xBF\xBE |0 + \xEA\xFA |0 + \xEB\x57 |0 + \xBF\xBD |0 + \xEB\x4D |0 + \xEB\x4B |0 + \xEB\x4E |0 + \xEE\x53 |0 + \xEE\x40 |0 + \xEE\x45 |0 + \xEE\x52 |0 + \xEE\x44 |0 + \xED\xFB |0 + \xEE\x41 |0 + \xC1\xA2 |0 + \xED\xF4 |0 + \xEE\x4D |0 + \xEE\x4F |0 + \xED\xF3 |0 + \xC1\xA1 |0 + \xEE\x51 |0 + \xEE\x49 |0 + \xC1\xA8 |0 + \xEE\x50 |0 + \xEE\x42 |0 + \xC1\xAA |0 + \xED\xF9 |0 + \xEB\x52 |0 + \xEE\x4A |0 + \xEE\x47 |0 + \xED\xF5 |0 + \xEE\x55 |0 + \xC1\xA4 |0 + \xC1\xA5 |0 + \xED\xF7 |0 + \xEE\x48 |0 + \xEE\x54 |0 + \xEE\x4B |0 + \xED\xFD |0 + \xC1\xA7 |0 + \xC1\xA3 |0 + \xEE\x4C |0 + \xED\xFE |0 + \xEE\x56 |0 + \xED\xF8 |0 + \xEE\x43 |0 + \xEE\x4E |0 + \xED\xFA |0 + \xED\xFC |0 + \xC2\xCB |0 + \xED\xF6 |0 + \xC1\xA9 |0 + \xC2\xC4 |0 + \xC1\x7E |0 + \xC1\xA6 |0 + \xC2\xC8 |0 + \xF0\xB3 |0 + \xF0\xA9 |0 + \xF0\xA4 |0 + \xF0\xAA |0 + \xF0\xB4 |0 + \xF0\xB8 |0 + \xF0\xB7 |0 + \xC2\xCA |0 + \xC2\xC9 |0 + \xF0\xAB |0 + \xF0\xB9 |0 + \xF0\xAE |0 + \xF0\xA6 |0 + \xF0\xA8 |0 + \xF0\xA7 |0 + \xF0\xAD |0 + \xF0\xB2 |0 + \xF0\xA5 |0 + \xF0\xAC |0 + \xF0\xB1 |0 + \xC2\xC7 |0 + \xF0\xAF |0 + \xC2\xC5 |0 + \xF0\xB0 |0 + \xC2\xC3 |0 + \xC2\xC6 |0 + \xF2\xD5 |0 + \xF0\xB5 |0 + \xC3\xC2 |0 + \xF2\xCD |0 + \xF2\xD1 |0 + \xF2\xC9 |0 + \xF2\xCC |0 + \xF2\xD4 |0 + \xC3\xC0 |0 + \xF2\xD9 |0 + \xF2\xD2 |0 + \xF2\xCA |0 + \xF2\xDA |0 + \xF2\xD3 |0 + \xC3\xC3 |0 + \xC3\xC4 |0 + \xF2\xD7 |0 + \xF2\xCB |0 + \xC3\xBF |0 + \xC3\xC1 |0 + \xF2\xC6 |0 + \xF2\xCE |0 + \xF2\xC8 |0 + \xF2\xD8 |0 + \xF2\xD6 |0 + \xF2\xC7 |0 + \xF2\xCF |0 + \xF4\xBE |0 + \xC3\xC5 |0 + \xF2\xD0 |0 + \xC4\xA7 |0 + \xC4\xA9 |0 + \xC4\xA6 |0 + \xF4\xC3 |0 + \xF4\xBB |0 + \xF4\xB9 |0 + \xF4\xBD |0 + \xF4\xBA |0 + \xF4\xBF |0 + \xF4\xC1 |0 + \xC4\xAA |0 + \xC4\xAC |0 + \xF4\xC0 |0 + \xC4\xAD |0 + \xC4\xAB |0 + \xF4\xC2 |0 + \xC4\xA8 |0 + \xC4\xF4 |0 + \xF5\xF1 |0 + \xF5\xF7 |0 + \xC4\xF6 |0 + \xF4\xBC |0 + \xF5\xF6 |0 + \xF5\xFD |0 + \xF5\xF4 |0 + \xF5\xFB |0 + \xF5\xFA |0 + \xF4\xB8 |0 + \xF5\xF5 |0 + \xF0\xB6 |0 + \xF5\xFE |0 + \xF5\xF3 |0 + \xF5\xF8 |0 + \xF5\xFC |0 + \xF5\xF2 |0 + \xF7\x4A |0 + \xC4\xF5 |0 + \xF5\xF9 |0 + \xF7\xF4 |0 + \xF7\x4B |0 + \xF7\x49 |0 + \xF7\x47 |0 + \xF7\x48 |0 + \xF7\x4C |0 + \xC5\xD9 |0 + \xF7\xF2 |0 + \xF7\xF0 |0 + \xF7\xF5 |0 + \xF7\xF3 |0 + \xF7\xF6 |0 + \xC5\xDA |0 + \xF7\xF1 |0 + \xF8\xBC |0 + \xF9\x45 |0 + \xF9\x46 |0 + \xF9\x47 |0 + \xF9\xC7 |0 + \xF9\xBD |0 + \xCA\x4F |0 + \xAA\xEA |0 + \xAD\x68 |0 + \xD3\xB8 |0 + \xD3\xB7 |0 + \xB0\x40 |0 + \xB3\x42 |0 + \xD7\x7C |0 + \xD7\x7B |0 + \xB5\xEA |0 + \xB8\xB8 |0 + \xB8\xB7 |0 + \xB8\xB9 |0 + \xE3\xD4 |0 + \xE7\x7E |0 + \xEB\x58 |0 + \xEB\x5A |0 + \xEB\x59 |0 + \xC1\xAB |0 + \xEE\x57 |0 + \xF0\xBA |0 + \xF9\xA5 |0 + \xA6\xE4 |0 + \xCD\xC9 |0 + \xCD\xCA |0 + \xCD\xC8 |0 + \xCD\xC7 |0 + \xAA\xEB |0 + \xD0\xA9 |0 + \xD0\xA7 |0 + \xD0\xA6 |0 + \xAD\x69 |0 + \xAD\x6B |0 + \xAD\x6A |0 + \xD0\xA8 |0 + \xD3\xC4 |0 + \xD3\xC1 |0 + \xD3\xBF |0 + \xB0\x41 |0 + \xD3\xC2 |0 + \xB0\x46 |0 + \xD3\xBC |0 + \xD3\xCB |0 + \xD3\xCD |0 + \xD3\xBD |0 + \xB0\x43 |0 + \xD3\xCE |0 + \xD3\xC9 |0 + \xD3\xBB |0 + \xD3\xC0 |0 + \xD3\xCA |0 + \xD3\xC6 |0 + \xD3\xC3 |0 + \xB0\x48 |0 + \xD3\xCC |0 + \xD3\xBE |0 + \xD3\xC7 |0 + \xD3\xB9 |0 + \xB0\x47 |0 + \xB0\x44 |0 + \xD3\xC5 |0 + \xD3\xC8 |0 + \xD3\xBA |0 + \xB0\x45 |0 + \xB0\x42 |0 + \xB3\x4C |0 + \xD7\xA5 |0 + \xB3\x4B |0 + \xD7\xA8 |0 + \xD7\xAB |0 + \xB3\x48 |0 + \xB3\x46 |0 + \xD7\x7E |0 + \xD7\xA9 |0 + \xD7\xA7 |0 + \xD7\xA4 |0 + \xD7\xAC |0 + \xD7\xAD |0 + \xD7\xAF |0 + \xD7\xB0 |0 + \xD7\x7D |0 + \xB3\x45 |0 + \xD7\xA2 |0 + \xD7\xA1 |0 + \xD7\xAE |0 + \xB3\x47 |0 + \xD7\xA3 |0 + \xB3\x49 |0 + \xB3\x44 |0 + \xD7\xA6 |0 + \xB3\x4D |0 + \xB3\x4A |0 + \xD7\xAA |0 + \xB5\xF1 |0 + \xDB\xBF |0 + \xDB\xB4 |0 + \xB5\xEE |0 + \xDF\xE7 |0 + \xDB\xBD |0 + \xDB\xB1 |0 + \xB5\xEC |0 + \xDB\xB6 |0 + \xB5\xEF |0 + \xDB\xBA |0 + \xDB\xB8 |0 + \xB5\xF2 |0 + \xB5\xEB |0 + \xDB\xB2 |0 + \xDB\xB5 |0 + \xB5\xF0 |0 + \xDB\xB3 |0 + \xDB\xBE |0 + \xDB\xBC |0 + \xDB\xB7 |0 + \xDB\xB9 |0 + \xDB\xBB |0 + \xB5\xED |0 + \xDF\xE8 |0 + \xDF\xEE |0 + \xDF\xE4 |0 + \xDF\xEA |0 + \xB8\xBA |0 + \xDF\xE6 |0 + \xB8\xC0 |0 + \xB8\xBF |0 + \xB8\xBE |0 + \xDF\xED |0 + \xB8\xC1 |0 + \xB8\xC2 |0 + \xDF\xE3 |0 + \xDF\xF0 |0 + \xB8\xC3 |0 + \xB8\xBD |0 + \xB8\xBC |0 + \xDF\xEC |0 + \xB8\xC4 |0 + \xDF\xE2 |0 + \xDF\xE5 |0 + \xDF\xEF |0 + \xDF\xEB |0 + \xE3\xF4 |0 + \xE3\xE9 |0 + \xB8\xBB |0 + \xBB\x6A |0 + \xE3\xDD |0 + \xE3\xF2 |0 + \xE3\xDE |0 + \xBB\x65 |0 + \xE3\xDB |0 + \xE3\xE4 |0 + \xE3\xDC |0 + \xBB\x67 |0 + \xE3\xD6 |0 + \xE3\xF1 |0 + \xBB\x68 |0 + \xE3\xEE |0 + \xE3\xEF |0 + \xE3\xD7 |0 + \xBB\x6D |0 + \xE3\xE6 |0 + \xE3\xE0 |0 + \xE3\xE7 |0 + \xE3\xDA |0 + \xE3\xF3 |0 + \xE3\xEB |0 + \xE3\xE5 |0 + \xE3\xD5 |0 + \xBB\x69 |0 + \xE3\xEC |0 + \xBB\x6C |0 + \xE3\xF0 |0 + \xE3\xEA |0 + \xBB\x66 |0 + \xE3\xE8 |0 + \xE3\xE2 |0 + \xBB\x64 |0 + \xE3\xD9 |0 + \xE3\xE1 |0 + \xE3\xED |0 + \xE3\xDF |0 + \xE3\xE3 |0 + \xBD\xC1 |0 + \xDF\xE9 |0 + \xE7\xB2 |0 + \xE7\xBB |0 + \xE7\xB1 |0 + \xE7\xAD |0 + \xE7\xAA |0 + \xBD\xC2 |0 + \xE7\xA8 |0 + \xBB\x6B |0 + \xE7\xA1 |0 + \xBD\xC0 |0 + \xE7\xA7 |0 + \xBD\xBF |0 + \xE7\xAC |0 + \xE7\xA9 |0 + \xE7\xB9 |0 + \xE7\xB4 |0 + \xE7\xAE |0 + \xE7\xB3 |0 + \xBD\xBB |0 + \xE7\xAB |0 + \xE7\xBE |0 + \xE7\xA2 |0 + \xE7\xA3 |0 + \xE7\xBA |0 + \xBD\xBC |0 + \xE7\xBF |0 + \xBD\xBE |0 + \xE7\xC0 |0 + \xE7\xB0 |0 + \xE3\xD8 |0 + \xE7\xB6 |0 + \xE7\xAF |0 + \xE7\xB8 |0 + \xE7\xB5 |0 + \xE7\xA6 |0 + \xBD\xB9 |0 + \xE7\xBD |0 + \xBD\xBA |0 + \xE7\xA4 |0 + \xBD\xBD |0 + \xEB\x64 |0 + \xE7\xB7 |0 + \xE7\xBC |0 + \xEB\x61 |0 + \xBD\xB8 |0 + \xBF\xC0 |0 + \xEB\x6B |0 + \xEB\x67 |0 + \xEB\x65 |0 + \xEB\x60 |0 + \xEB\x6F |0 + \xBF\xC4 |0 + \xEB\x5C |0 + \xEB\x68 |0 + \xEB\x69 |0 + \xEB\x5F |0 + \xEB\x5E |0 + \xEB\x6C |0 + \xEB\x62 |0 + \xEB\x5D |0 + \xEB\x63 |0 + \xEB\x6E |0 + \xEB\x5B |0 + \xEB\x6D |0 + \xEB\x6A |0 + \xBF\xC2 |0 + \xBF\xC1 |0 + \xBF\xC3 |0 + \xEB\x66 |0 + \xF0\xCB |0 + \xEE\x59 |0 + \xC1\xB1 |0 + \xEE\x5D |0 + \xEE\x5A |0 + \xEE\x61 |0 + \xEE\x67 |0 + \xEE\x5C |0 + \xEE\x70 |0 + \xC1\xAE |0 + \xEE\x6A |0 + \xEE\x5F |0 + \xEE\x6B |0 + \xEE\x66 |0 + \xEE\x6D |0 + \xEE\x5E |0 + \xC1\xB3 |0 + \xC1\xB2 |0 + \xEE\x60 |0 + \xEE\x6E |0 + \xEE\x58 |0 + \xEE\x6C |0 + \xC1\xAC |0 + \xEE\x64 |0 + \xEE\x63 |0 + \xEE\x68 |0 + \xEE\x5B |0 + \xC1\xB0 |0 + \xC1\xB4 |0 + \xEE\x62 |0 + \xEE\x69 |0 + \xC1\xB5 |0 + \xEE\x65 |0 + \xC1\xAD |0 + \xC1\xAF |0 + \xF0\xC7 |0 + \xF0\xC5 |0 + \xF0\xCC |0 + \xF0\xC9 |0 + \xF0\xCD |0 + \xF0\xBE |0 + \xF0\xC6 |0 + \xF0\xD1 |0 + \xEE\x6F |0 + \xF0\xC2 |0 + \xC2\xCF |0 + \xE7\xA5 |0 + \xF0\xBD |0 + \xF0\xCA |0 + \xF0\xC4 |0 + \xF0\xC1 |0 + \xF0\xBC |0 + \xF0\xBB |0 + \xF0\xD0 |0 + \xF0\xC0 |0 + \xF0\xBF |0 + \xC2\xCD |0 + \xF0\xC8 |0 + \xC2\xCC |0 + \xC2\xCE |0 + \xF0\xC3 |0 + \xF0\xCF |0 + \xF2\xDE |0 + \xF2\xDF |0 + \xC3\xC9 |0 + \xF2\xDC |0 + \xC3\xC6 |0 + \xF2\xE4 |0 + \xC3\xCA |0 + \xF2\xE6 |0 + \xF2\xDB |0 + \xF0\xCE |0 + \xF2\xE8 |0 + \xF2\xDD |0 + \xC3\xC7 |0 + \xF2\xE3 |0 + \xF2\xE5 |0 + \xF2\xE0 |0 + \xF2\xE7 |0 + \xF2\xE2 |0 + \xF2\xE1 |0 + \xC3\xC8 |0 + \xF4\xC5 |0 + \xF4\xC6 |0 + \xF4\xC8 |0 + \xC4\xAE |0 + \xC4\xAF |0 + \xF4\xC9 |0 + \xF4\xC7 |0 + \xF4\xC4 |0 + \xF6\x42 |0 + \xF6\x45 |0 + \xF6\x41 |0 + \xC4\xFA |0 + \xF6\x43 |0 + \xC4\xF9 |0 + \xC4\xF8 |0 + \xC4\xF7 |0 + \xF6\x44 |0 + \xF7\x51 |0 + \xF7\x4F |0 + \xF7\x4E |0 + \xF6\x40 |0 + \xF7\x50 |0 + \xF6\x46 |0 + \xF7\x4D |0 + \xF7\xF9 |0 + \xF7\xD7 |0 + \xF7\xF7 |0 + \xC5\xDB |0 + \xF7\xF8 |0 + \xF7\xFA |0 + \xF8\xBF |0 + \xC5\xFA |0 + \xF8\xBE |0 + \xF8\xBD |0 + \xC5\xFB |0 + \xC6\x5A |0 + \xF9\x6E |0 + \xF9\xA7 |0 + \xF9\xA6 |0 + \xF9\xA8 |0 + \xA6\xE5 |0 + \xD0\xAA |0 + \xD3\xCF |0 + \xD3\xD0 |0 + \xDB\xC0 |0 + \xF6\x47 |0 + \xF8\xC0 |0 + \xA6\xE6 |0 + \xAD\x6C |0 + \xD0\xAB |0 + \xD7\xB1 |0 + \xB3\x4E |0 + \xDB\xC2 |0 + \xDB\xC1 |0 + \xB5\xF3 |0 + \xB8\xC5 |0 + \xE7\xC1 |0 + \xBD\xC3 |0 + \xBD\xC4 |0 + \xBF\xC5 |0 + \xC5\xFC |0 + \xA6\xE7 |0 + \xD0\xAC |0 + \xAA\xED |0 + \xD0\xAE |0 + \xD0\xAD |0 + \xAD\x6D |0 + \xD3\xD1 |0 + \xD3\xD8 |0 + \xB0\x49 |0 + \xD3\xD6 |0 + \xD3\xD4 |0 + \xD3\xDB |0 + \xD3\xD2 |0 + \xD3\xD3 |0 + \xB0\x4A |0 + \xB0\x4E |0 + \xD3\xDC |0 + \xB0\x4D |0 + \xD3\xDA |0 + \xD3\xD7 |0 + \xD3\xD5 |0 + \xB0\x4B |0 + \xB0\x4C |0 + \xD3\xD9 |0 + \xB3\x50 |0 + \xD7\xB2 |0 + \xB3\x55 |0 + \xD7\xC2 |0 + \xB3\x54 |0 + \xD7\xC4 |0 + \xD7\xB8 |0 + \xB3\x52 |0 + \xD7\xC3 |0 + \xD7\xB3 |0 + \xB3\x53 |0 + \xD7\xBF |0 + \xD7\xBB |0 + \xD7\xBD |0 + \xD7\xB7 |0 + \xD7\xBE |0 + \xB3\x4F |0 + \xD7\xBA |0 + \xD7\xB9 |0 + \xD7\xB5 |0 + \xD7\xC0 |0 + \xD7\xBC |0 + \xD7\xB4 |0 + \xD7\xB6 |0 + \xB3\x51 |0 + \xD7\xC1 |0 + \xB5\xF6 |0 + \xDB\xCD |0 + \xDB\xC9 |0 + \xDB\xCB |0 + \xDB\xC6 |0 + \xDB\xC5 |0 + \xDB\xC3 |0 + \xDB\xCA |0 + \xDB\xCC |0 + \xDB\xC8 |0 + \xDB\xC7 |0 + \xB5\xF4 |0 + \xB5\xF5 |0 + \xDB\xCF |0 + \xB8\xCD |0 + \xDF\xF2 |0 + \xDF\xF8 |0 + \xDF\xF3 |0 + \xDF\xF4 |0 + \xF9\xD8 |0 + \xDF\xF9 |0 + \xB8\xCF |0 + \xB8\xC7 |0 + \xB8\xCE |0 + \xDF\xF1 |0 + \xDB\xC4 |0 + \xB8\xCA |0 + \xB8\xC8 |0 + \xDF\xF7 |0 + \xDF\xF6 |0 + \xB8\xC9 |0 + \xB8\xCB |0 + \xDF\xF5 |0 + \xB8\xC6 |0 + \xB8\xCC |0 + \xE3\xF6 |0 + \xBB\x74 |0 + \xE4\x42 |0 + \xE4\x41 |0 + \xE3\xFB |0 + \xBB\x76 |0 + \xE4\x40 |0 + \xE3\xF7 |0 + \xE3\xF8 |0 + \xBB\x6E |0 + \xBB\x70 |0 + \xE3\xFD |0 + \xE3\xF5 |0 + \xBB\x72 |0 + \xBB\x71 |0 + \xE3\xF9 |0 + \xE3\xFE |0 + \xE3\xFC |0 + \xBB\x73 |0 + \xE3\xFA |0 + \xDB\xCE |0 + \xBB\x6F |0 + \xE7\xC2 |0 + \xE7\xC9 |0 + \xBD\xC6 |0 + \xE7\xCD |0 + \xBD\xCA |0 + \xE7\xC5 |0 + \xE7\xC3 |0 + \xE7\xCC |0 + \xBD\xC5 |0 + \xE7\xCB |0 + \xBD\xC7 |0 + \xBD\xC8 |0 + \xE7\xC4 |0 + \xBD\xC9 |0 + \xE7\xCA |0 + \xE7\xC6 |0 + \xE7\xC7 |0 + \xE7\xC8 |0 + \xBB\x75 |0 + \xEB\x70 |0 + \xEB\x7C |0 + \xBF\xCA |0 + \xEB\x77 |0 + \xEB\x79 |0 + \xBF\xC8 |0 + \xEB\x71 |0 + \xEB\x75 |0 + \xEB\x78 |0 + \xBF\xC6 |0 + \xBF\xC9 |0 + \xEB\x7B |0 + \xEB\x73 |0 + \xEB\x74 |0 + \xEB\x7A |0 + \xEB\x72 |0 + \xEB\x76 |0 + \xBF\xC7 |0 + \xEE\x72 |0 + \xEE\x71 |0 + \xC1\xB7 |0 + \xEE\x77 |0 + \xC1\xB9 |0 + \xC1\xB6 |0 + \xEE\x73 |0 + \xC1\xBA |0 + \xEE\x74 |0 + \xEE\x75 |0 + \xEE\x78 |0 + \xC1\xB8 |0 + \xF0\xD6 |0 + \xF0\xD9 |0 + \xF0\xD3 |0 + \xF0\xD5 |0 + \xF0\xD4 |0 + \xF0\xD7 |0 + \xF0\xD8 |0 + \xEE\x76 |0 + \xF0\xD2 |0 + \xC3\xCD |0 + \xF2\xEC |0 + \xF2\xEF |0 + \xF2\xF1 |0 + \xF2\xEA |0 + \xF2\xEB |0 + \xF2\xEE |0 + \xF2\xF0 |0 + \xC3\xCE |0 + \xC3\xCC |0 + \xC3\xCB |0 + \xF2\xED |0 + \xF2\xE9 |0 + \xF4\xCA |0 + \xC4\xB0 |0 + \xF4\xCB |0 + \xF6\x49 |0 + \xC4\xFB |0 + \xF6\x4B |0 + \xC4\xFC |0 + \xF6\x48 |0 + \xF6\x4A |0 + \xC5\xA8 |0 + \xF7\x52 |0 + \xC5\xA7 |0 + \xF7\xFD |0 + \xF7\xFC |0 + \xF7\xFB |0 + \xF9\x48 |0 + \xF9\x49 |0 + \xF9\x4B |0 + \xF9\x4A |0 + \xCA\x50 |0 + \xA6\xE8 |0 + \xAD\x6E |0 + \xD7\xC5 |0 + \xB5\xF7 |0 + \xDF\xFA |0 + \xC2\xD0 |0 + \xF2\xF2 |0 + \xA8\xA3 |0 + \xB3\x57 |0 + \xB3\x56 |0 + \xDB\xD0 |0 + \xB5\xF8 |0 + \xDB\xD2 |0 + \xDB\xD1 |0 + \xDF\xFB |0 + \xB8\xD0 |0 + \xE4\x43 |0 + \xE4\x46 |0 + \xE4\x45 |0 + \xE4\x44 |0 + \xE7\xCE |0 + \xE7\xD0 |0 + \xE7\xCF |0 + \xBF\xCC |0 + \xBF\xCB |0 + \xC1\xBB |0 + \xEE\x79 |0 + \xEE\x7B |0 + \xEE\x7A |0 + \xC2\xD1 |0 + \xF2\xF4 |0 + \xF2\xF3 |0 + \xF4\xCC |0 + \xC4\xB1 |0 + \xC4\xFD |0 + \xF7\x54 |0 + \xF7\x53 |0 + \xC6\x5B |0 + \xA8\xA4 |0 + \xD0\xAF |0 + \xAD\x6F |0 + \xD7\xC8 |0 + \xD7\xC6 |0 + \xD7\xC7 |0 + \xDB\xD4 |0 + \xDB\xD5 |0 + \xE0\x43 |0 + \xDB\xD3 |0 + \xDF\xFC |0 + \xE0\x41 |0 + \xE0\x40 |0 + \xE0\x42 |0 + \xB8\xD1 |0 + \xDF\xFE |0 + \xDF\xFD |0 + \xE0\x44 |0 + \xE4\x49 |0 + \xE4\x47 |0 + \xE4\x48 |0 + \xE7\xD3 |0 + \xE7\xD1 |0 + \xE7\xD2 |0 + \xEB\x7D |0 + \xEE\x7C |0 + \xEE\x7D |0 + \xC2\xD2 |0 + \xF2\xF5 |0 + \xF4\xCD |0 + \xC4\xB2 |0 + \xF6\x4C |0 + \xF7\x55 |0 + \xC5\xA9 |0 + \xF7\xFE |0 + \xF9\x4C |0 + \xA8\xA5 |0 + \xAD\x71 |0 + \xAD\x72 |0 + \xD0\xB0 |0 + \xD0\xB1 |0 + \xAD\x70 |0 + \xB0\x54 |0 + \xB0\x52 |0 + \xB0\x51 |0 + \xB0\x58 |0 + \xB0\x50 |0 + \xB0\x59 |0 + \xD3\xDD |0 + \xB0\x56 |0 + \xB0\x53 |0 + \xB0\x57 |0 + \xB0\x55 |0 + \xB0\x4F |0 + \xB3\x5F |0 + \xB3\x59 |0 + \xD7\xCC |0 + \xB3\x5E |0 + \xB3\x60 |0 + \xB3\x5A |0 + \xB3\x5B |0 + \xD7\xCA |0 + \xB3\x58 |0 + \xD7\xCB |0 + \xB3\x5D |0 + \xD7\xC9 |0 + \xB3\x5C |0 + \xB6\x44 |0 + \xB6\x46 |0 + \xDB\xD8 |0 + \xB6\x45 |0 + \xB5\xF9 |0 + \xB5\xFD |0 + \xB8\xE4 |0 + \xE0\x49 |0 + \xDB\xDA |0 + \xB5\xFE |0 + \xDB\xDD |0 + \xDB\xDE |0 + \xB6\x43 |0 + \xDB\xE0 |0 + \xDB\xE2 |0 + \xDB\xE3 |0 + \xDB\xD7 |0 + \xDB\xD6 |0 + \xDB\xE4 |0 + \xB6\x42 |0 + \xDB\xE1 |0 + \xDB\xDF |0 + \xB6\x40 |0 + \xB5\xFB |0 + \xB6\x47 |0 + \xDB\xDB |0 + \xDB\xDC |0 + \xDB\xD9 |0 + \xB6\x41 |0 + \xB5\xFC |0 + \xB5\xFA |0 + \xE0\x48 |0 + \xB8\xDF |0 + \xB8\xDA |0 + \xB8\xD5 |0 + \xB8\xE5 |0 + \xB8\xD6 |0 + \xB8\xD2 |0 + \xB8\xE1 |0 + \xB8\xDE |0 + \xB8\xE0 |0 + \xB8\xD7 |0 + \xB8\xDC |0 + \xB8\xD3 |0 + \xB8\xD4 |0 + \xE0\x50 |0 + \xE0\x4D |0 + \xE0\x45 |0 + \xE0\x4A |0 + \xB8\xE2 |0 + \xE0\x51 |0 + \xB8\xE3 |0 + \xB8\xD9 |0 + \xE0\x47 |0 + \xE0\x4F |0 + \xE0\x4B |0 + \xE0\x4E |0 + \xE0\x4C |0 + \xB8\xDD |0 + \xE0\x46 |0 + \xB8\xD8 |0 + \xE4\x4C |0 + \xBB\x78 |0 + \xBB\x7B |0 + \xE4\x4E |0 + \xBB\xA5 |0 + \xE4\x4D |0 + \xBB\x7D |0 + \xBD\xCF |0 + \xE4\x4F |0 + \xBB\xA4 |0 + \xE4\x4B |0 + \xBB\xA6 |0 + \xBB\x79 |0 + \xB8\xDB |0 + \xBB\x7C |0 + \xBB\x7A |0 + \xBB\x7E |0 + \xBB\xA2 |0 + \xBB\x77 |0 + \xBB\xA7 |0 + \xBB\xA3 |0 + \xBB\xA1 |0 + \xE4\x4A |0 + \xBD\xD6 |0 + \xBD\xD2 |0 + \xBD\xD9 |0 + \xE7\xD6 |0 + \xBD\xDA |0 + \xE7\xE2 |0 + \xE7\xDB |0 + \xBD\xCB |0 + \xE7\xE3 |0 + \xE7\xDD |0 + \xBD\xD5 |0 + \xE7\xDE |0 + \xBD\xD4 |0 + \xE7\xE1 |0 + \xBD\xCE |0 + \xE7\xDF |0 + \xE7\xD5 |0 + \xBD\xCD |0 + \xEB\xAA |0 + \xBD\xD3 |0 + \xBD\xD0 |0 + \xBD\xD8 |0 + \xE7\xD4 |0 + \xE7\xD8 |0 + \xBD\xCC |0 + \xE7\xD7 |0 + \xE7\xD9 |0 + \xE7\xDA |0 + \xBD\xD7 |0 + \xE7\xDC |0 + \xE7\xE0 |0 + \xE7\xE4 |0 + \xBD\xDB |0 + \xBF\xD2 |0 + \xEB\xA5 |0 + \xEB\xAB |0 + \xEB\xA8 |0 + \xEB\x7E |0 + \xEB\xAC |0 + \xEB\xA1 |0 + \xEB\xA7 |0 + \xBF\xCD |0 + \xBF\xD3 |0 + \xEB\xAD |0 + \xBF\xCF |0 + \xBF\xD9 |0 + \xBF\xD4 |0 + \xEB\xAF |0 + \xEB\xA9 |0 + \xBF\xD0 |0 + \xEB\xA2 |0 + \xBF\xDA |0 + \xEB\xA3 |0 + \xEB\xA4 |0 + \xBF\xDB |0 + \xBF\xD8 |0 + \xBD\xD1 |0 + \xBF\xCE |0 + \xEB\xB0 |0 + \xBF\xDC |0 + \xBF\xD5 |0 + \xEB\xAE |0 + \xBF\xD1 |0 + \xBF\xD6 |0 + \xBF\xD7 |0 + \xC1\xC3 |0 + \xEE\xA4 |0 + \xEE\xAD |0 + \xEE\xAA |0 + \xEE\xAC |0 + \xC1\xC0 |0 + \xEE\xA5 |0 + \xEE\xAB |0 + \xC1\xBC |0 + \xEE\xA7 |0 + \xC1\xC4 |0 + \xEE\xA3 |0 + \xEE\xA8 |0 + \xEE\xAF |0 + \xEB\xA6 |0 + \xEE\xA9 |0 + \xEE\xA2 |0 + \xC1\xBD |0 + \xEE\xA1 |0 + \xC1\xBE |0 + \xEE\xB0 |0 + \xC1\xBF |0 + \xEE\xAE |0 + \xC1\xC2 |0 + \xEE\x7E |0 + \xC1\xC1 |0 + \xEE\xA6 |0 + \xF0\xDC |0 + \xF0\xEA |0 + \xF0\xE5 |0 + \xF0\xE7 |0 + \xF0\xDB |0 + \xC2\xD3 |0 + \xF0\xDA |0 + \xC2\xD6 |0 + \xC2\xD5 |0 + \xF0\xE9 |0 + \xF0\xE1 |0 + \xF0\xDE |0 + \xF0\xE4 |0 + \xF0\xDD |0 + \xF0\xDF |0 + \xF0\xE8 |0 + \xF0\xE6 |0 + \xC2\xD4 |0 + \xF0\xED |0 + \xF0\xEB |0 + \xF0\xE2 |0 + \xF0\xEC |0 + \xF0\xE3 |0 + \xF2\xF9 |0 + \xC3\xCF |0 + \xF3\x41 |0 + \xF6\x4F |0 + \xC3\xD6 |0 + \xF0\xE0 |0 + \xF2\xF7 |0 + \xC3\xD2 |0 + \xF2\xF8 |0 + \xF2\xFD |0 + \xC3\xD4 |0 + \xC3\xD5 |0 + \xF2\xF6 |0 + \xF3\x40 |0 + \xF3\x42 |0 + \xF2\xFA |0 + \xF2\xFC |0 + \xF2\xFE |0 + \xF2\xFB |0 + \xF3\x43 |0 + \xC3\xD1 |0 + \xC3\xD7 |0 + \xC3\xD3 |0 + \xC3\xD0 |0 + \xF4\xD0 |0 + \xC4\xB7 |0 + \xF4\xCE |0 + \xF4\xD2 |0 + \xF4\xD3 |0 + \xC4\xB5 |0 + \xF4\xD4 |0 + \xF4\xD1 |0 + \xF4\xCF |0 + \xC4\xB8 |0 + \xC4\xB4 |0 + \xF4\xD5 |0 + \xC4\xB6 |0 + \xC4\xB3 |0 + \xC4\xFE |0 + \xC5\x40 |0 + \xF6\x4E |0 + \xF6\x4D |0 + \xF6\x50 |0 + \xF6\x51 |0 + \xC5\x41 |0 + \xF7\x56 |0 + \xF7\x5B |0 + \xC5\xAA |0 + \xF7\x58 |0 + \xF7\x57 |0 + \xF7\x5A |0 + \xF7\x59 |0 + \xF8\x43 |0 + \xC5\xDC |0 + \xF8\x42 |0 + \xF8\x40 |0 + \xF8\x41 |0 + \xC5\xFE |0 + \xC5\xFD |0 + \xF8\xC1 |0 + \xF8\xC2 |0 + \xC6\x40 |0 + \xF9\x4D |0 + \xF9\x4E |0 + \xC6\x67 |0 + \xC6\x6D |0 + \xF9\xA9 |0 + \xF9\xC8 |0 + \xA8\xA6 |0 + \xD7\xCD |0 + \xD7\xCE |0 + \xE0\x52 |0 + \xE4\x50 |0 + \xE7\xE5 |0 + \xC1\xC6 |0 + \xC1\xC5 |0 + \xF0\xEE |0 + \xF3\x44 |0 + \xF8\x44 |0 + \xA8\xA7 |0 + \xD3\xDE |0 + \xB0\x5A |0 + \xB3\x61 |0 + \xE0\x54 |0 + \xE0\x53 |0 + \xBD\xDC |0 + \xE7\xE6 |0 + \xBD\xDD |0 + \xEE\xB1 |0 + \xC2\xD7 |0 + \xC6\x76 |0 + \xA8\xA8 |0 + \xCD\xCB |0 + \xD3\xDF |0 + \xB3\x62 |0 + \xD7\xCF |0 + \xD7\xD0 |0 + \xDB\xE5 |0 + \xB6\x48 |0 + \xB8\xE6 |0 + \xE0\x56 |0 + \xE0\x55 |0 + \xE0\x57 |0 + \xE4\x51 |0 + \xE4\x52 |0 + \xBB\xA8 |0 + \xBF\xDD |0 + \xBD\xDE |0 + \xBF\xDE |0 + \xEE\xB5 |0 + \xEE\xB2 |0 + \xEE\xB4 |0 + \xEE\xB3 |0 + \xC1\xC7 |0 + \xF0\xEF |0 + \xF3\x46 |0 + \xF3\x45 |0 + \xCB\xA4 |0 + \xB0\x5C |0 + \xB0\x5B |0 + \xD3\xE0 |0 + \xD7\xD1 |0 + \xDB\xE7 |0 + \xDB\xE6 |0 + \xB6\x49 |0 + \xE0\x59 |0 + \xE0\x5A |0 + \xE0\x58 |0 + \xB8\xE8 |0 + \xB8\xE7 |0 + \xBB\xAA |0 + \xBB\xA9 |0 + \xE7\xE7 |0 + \xEB\xB3 |0 + \xEB\xB1 |0 + \xEB\xB2 |0 + \xBF\xDF |0 + \xEE\xB7 |0 + \xEE\xB6 |0 + \xF0\xF2 |0 + \xF0\xF1 |0 + \xF0\xF0 |0 + \xF3\x47 |0 + \xF9\xAA |0 + \xA8\xA9 |0 + \xAD\x73 |0 + \xAD\x74 |0 + \xB0\x5D |0 + \xB0\x5E |0 + \xD3\xE2 |0 + \xD3\xE1 |0 + \xD7\xD2 |0 + \xB3\x68 |0 + \xB3\x66 |0 + \xB3\x63 |0 + \xB3\x67 |0 + \xB3\x65 |0 + \xB3\x64 |0 + \xB6\x4A |0 + \xDB\xEA |0 + \xB8\xED |0 + \xB6\x4C |0 + \xB6\x51 |0 + \xDB\xEC |0 + \xB6\x53 |0 + \xB6\x52 |0 + \xB6\x55 |0 + \xDB\xEB |0 + \xDB\xE8 |0 + \xB6\x4F |0 + \xB6\x4B |0 + \xB6\x4D |0 + \xDB\xE9 |0 + \xB6\x54 |0 + \xB6\x50 |0 + \xB6\x4E |0 + \xB8\xEF |0 + \xB8\xEE |0 + \xB8\xEC |0 + \xB8\xF0 |0 + \xB8\xEA |0 + \xB8\xEB |0 + \xB8\xE9 |0 + \xE0\x5B |0 + \xE4\x54 |0 + \xBB\xAC |0 + \xBB\xAD |0 + \xBB\xAB |0 + \xE4\x53 |0 + \xE4\x55 |0 + \xE7\xEA |0 + \xE7\xEC |0 + \xBD\xE7 |0 + \xE7\xED |0 + \xBD\xE0 |0 + \xE7\xE9 |0 + \xBD\xDF |0 + \xBD\xE9 |0 + \xBD\xE5 |0 + \xBD\xE6 |0 + \xBD\xE2 |0 + \xE7\xE8 |0 + \xBD\xE1 |0 + \xE7\xEE |0 + \xE7\xEB |0 + \xBD\xE8 |0 + \xBD\xE3 |0 + \xBD\xE4 |0 + \xEB\xB5 |0 + \xEB\xB7 |0 + \xEB\xB6 |0 + \xEB\xB8 |0 + \xBF\xE0 |0 + \xEB\xB4 |0 + \xC1\xCB |0 + \xEE\xB8 |0 + \xC1\xC8 |0 + \xC1\xCC |0 + \xC1\xCA |0 + \xC1\xC9 |0 + \xF0\xF3 |0 + \xF0\xF6 |0 + \xF0\xF5 |0 + \xF0\xF4 |0 + \xC2\xD8 |0 + \xF3\x48 |0 + \xF3\x49 |0 + \xC3\xD8 |0 + \xF3\x4A |0 + \xC3\xD9 |0 + \xC4\xBA |0 + \xC4\xB9 |0 + \xF6\x52 |0 + \xC5\x42 |0 + \xF6\x53 |0 + \xF7\x5C |0 + \xC5\xAB |0 + \xC5\xAC |0 + \xF8\x45 |0 + \xC6\x42 |0 + \xA8\xAA |0 + \xB3\x6A |0 + \xB3\x69 |0 + \xE0\x5C |0 + \xE0\x5D |0 + \xBB\xAE |0 + \xEB\xB9 |0 + \xBD\xEA |0 + \xEB\xBA |0 + \xEE\xB9 |0 + \xA8\xAB |0 + \xD0\xB2 |0 + \xAD\x76 |0 + \xAD\x75 |0 + \xD3\xE3 |0 + \xB0\x5F |0 + \xD3\xE4 |0 + \xD7\xD5 |0 + \xD7\xD4 |0 + \xD7\xD3 |0 + \xDB\xEE |0 + \xB6\x58 |0 + \xDB\xED |0 + \xB6\x57 |0 + \xDB\xEF |0 + \xB6\x56 |0 + \xE0\x5F |0 + \xE0\x62 |0 + \xE0\x60 |0 + \xE0\x61 |0 + \xE0\x65 |0 + \xE0\x5E |0 + \xE0\x66 |0 + \xE0\x63 |0 + \xE0\x64 |0 + \xBB\xB0 |0 + \xE4\x56 |0 + \xBB\xAF |0 + \xE7\xF2 |0 + \xE7\xF0 |0 + \xBD\xEB |0 + \xE7\xEF |0 + \xE7\xF1 |0 + \xBD\xEC |0 + \xEB\xBB |0 + \xEB\xBC |0 + \xC1\xCD |0 + \xF3\x4C |0 + \xF3\x4E |0 + \xF3\x4B |0 + \xF3\x4D |0 + \xF4\xD6 |0 + \xF6\x54 |0 + \xF9\x6F |0 + \xA8\xAC |0 + \xAD\x77 |0 + \xD3\xE5 |0 + \xD3\xE7 |0 + \xD3\xE6 |0 + \xD7\xD8 |0 + \xB3\x6C |0 + \xD7\xD6 |0 + \xB3\x6B |0 + \xD7\xD9 |0 + \xD7\xDA |0 + \xD7\xD7 |0 + \xDB\xFB |0 + \xB6\x60 |0 + \xDB\xF3 |0 + \xDB\xF9 |0 + \xB6\x5B |0 + \xB6\x5E |0 + \xDB\xF2 |0 + \xB6\x59 |0 + \xDB\xF6 |0 + \xE0\x6C |0 + \xB6\x5D |0 + \xDB\xF1 |0 + \xDB\xF7 |0 + \xDB\xF4 |0 + \xDB\xFA |0 + \xDB\xF0 |0 + \xDB\xF8 |0 + \xB6\x5C |0 + \xB6\x5F |0 + \xDB\xF5 |0 + \xB6\x5A |0 + \xB8\xF2 |0 + \xE0\x68 |0 + \xB8\xF1 |0 + \xE0\x6F |0 + \xE0\x6E |0 + \xB8\xF8 |0 + \xB8\xF9 |0 + \xE0\x70 |0 + \xB8\xF3 |0 + \xE0\x6D |0 + \xB8\xF7 |0 + \xE0\x72 |0 + \xE0\x69 |0 + \xE0\x6B |0 + \xB8\xF4 |0 + \xE0\x67 |0 + \xE0\x6A |0 + \xE0\x71 |0 + \xB8\xF5 |0 + \xE0\x73 |0 + \xB8\xF6 |0 + \xBB\xB1 |0 + \xE4\x5B |0 + \xE4\x61 |0 + \xE4\x59 |0 + \xE4\x62 |0 + \xE4\x58 |0 + \xE4\x5D |0 + \xE4\x63 |0 + \xE4\x60 |0 + \xE4\x5F |0 + \xE4\x5E |0 + \xE4\x57 |0 + \xE4\x5C |0 + \xE4\x5A |0 + \xBD\xF1 |0 + \xBD\xEE |0 + \xE7\xFB |0 + \xE8\x41 |0 + \xE8\x43 |0 + \xE8\x40 |0 + \xE7\xF8 |0 + \xE7\xFA |0 + \xE8\x45 |0 + \xE8\x42 |0 + \xE7\xFC |0 + \xE8\x46 |0 + \xE7\xF9 |0 + \xE8\x44 |0 + \xBD\xEF |0 + \xBD\xF5 |0 + \xBD\xF3 |0 + \xE7\xF3 |0 + \xBD\xF4 |0 + \xBD\xF0 |0 + \xE7\xF4 |0 + \xE7\xF6 |0 + \xE7\xF5 |0 + \xE7\xFD |0 + \xE7\xFE |0 + \xBD\xF2 |0 + \xBD\xED |0 + \xE7\xF7 |0 + \xEB\xC6 |0 + \xBF\xE2 |0 + \xEB\xBD |0 + \xBF\xE3 |0 + \xBF\xE6 |0 + \xEB\xC2 |0 + \xEB\xBF |0 + \xBF\xE5 |0 + \xEB\xC3 |0 + \xEB\xC4 |0 + \xEB\xBE |0 + \xEB\xC7 |0 + \xEB\xC0 |0 + \xEB\xC5 |0 + \xBF\xE4 |0 + \xBF\xE1 |0 + \xEB\xC1 |0 + \xEE\xBF |0 + \xC1\xD0 |0 + \xC1\xCE |0 + \xC1\xD1 |0 + \xC1\xCF |0 + \xEE\xBE |0 + \xEE\xBB |0 + \xEE\xBA |0 + \xEE\xBD |0 + \xEE\xBC |0 + \xF1\x45 |0 + \xC2\xDE |0 + \xF0\xFB |0 + \xF0\xFA |0 + \xC2\xD9 |0 + \xF1\x41 |0 + \xF1\x40 |0 + \xF0\xF7 |0 + \xF1\x43 |0 + \xF0\xFC |0 + \xC2\xDD |0 + \xF0\xF9 |0 + \xF1\x42 |0 + \xF0\xF8 |0 + \xC2\xDA |0 + \xC2\xDC |0 + \xF0\xFD |0 + \xC2\xDB |0 + \xF0\xFE |0 + \xF1\x44 |0 + \xF3\x52 |0 + \xC3\xDE |0 + \xF3\x4F |0 + \xF3\x53 |0 + \xC3\xDB |0 + \xF3\x51 |0 + \xC3\xE0 |0 + \xC3\xDD |0 + \xF3\x50 |0 + \xC3\xDF |0 + \xF3\x54 |0 + \xC3\xDA |0 + \xC4\xBC |0 + \xC4\xBE |0 + \xF4\xD9 |0 + \xC4\xBD |0 + \xF4\xD7 |0 + \xC3\xDC |0 + \xF4\xD8 |0 + \xC4\xBB |0 + \xC5\x43 |0 + \xC5\x45 |0 + \xF6\x56 |0 + \xC5\x44 |0 + \xF6\x55 |0 + \xF7\x61 |0 + \xC5\xAD |0 + \xF7\x60 |0 + \xC5\xAE |0 + \xF7\x5E |0 + \xF7\x5D |0 + \xF7\x62 |0 + \xF7\x63 |0 + \xF8\x46 |0 + \xF7\x5F |0 + \xF8\xC6 |0 + \xF8\xC3 |0 + \xF8\xC4 |0 + \xF8\xC5 |0 + \xC6\x5C |0 + \xF9\x51 |0 + \xF9\x50 |0 + \xF9\x4F |0 + \xF9\x70 |0 + \xF9\xBE |0 + \xF9\xAB |0 + \xC6\x6E |0 + \xA8\xAD |0 + \xB0\x60 |0 + \xB8\xFA |0 + \xBD\xF6 |0 + \xEB\xC8 |0 + \xC2\xDF |0 + \xF3\x55 |0 + \xF9\xAC |0 + \xA8\xAE |0 + \xAA\xEE |0 + \xAD\x79 |0 + \xAD\x78 |0 + \xB0\x63 |0 + \xD3\xE8 |0 + \xB0\x61 |0 + \xD3\xE9 |0 + \xB0\x62 |0 + \xD7\xDF |0 + \xD7\xDB |0 + \xB3\x6D |0 + \xD7\xDE |0 + \xD7\xDD |0 + \xD7\xDC |0 + \xB3\x6E |0 + \xD7\xE0 |0 + \xD7\xE1 |0 + \xDC\x43 |0 + \xDC\x41 |0 + \xDC\x45 |0 + \xDC\x46 |0 + \xDC\x4C |0 + \xDC\x48 |0 + \xDC\x4A |0 + \xDC\x42 |0 + \xDB\xFC |0 + \xDC\x49 |0 + \xDC\x4B |0 + \xDC\x44 |0 + \xDC\x47 |0 + \xDB\xFD |0 + \xB6\x62 |0 + \xDC\x40 |0 + \xDB\xFE |0 + \xB6\x61 |0 + \xB6\x63 |0 + \xB8\xFD |0 + \xE0\x75 |0 + \xE0\x77 |0 + \xE0\x76 |0 + \xE0\x7B |0 + \xB8\xFB |0 + \xE0\x78 |0 + \xE0\x74 |0 + \xE0\x79 |0 + \xE0\x7A |0 + \xB8\xFC |0 + \xB8\xFE |0 + \xE0\x7C |0 + \xE4\x67 |0 + \xE4\x66 |0 + \xE4\x64 |0 + \xE4\x65 |0 + \xBB\xB3 |0 + \xBB\xB5 |0 + \xBB\xB2 |0 + \xBB\xB4 |0 + \xE8\x4D |0 + \xE8\x4E |0 + \xE8\x49 |0 + \xE8\x4A |0 + \xBD\xF8 |0 + \xBD\xFD |0 + \xBD\xF7 |0 + \xBD\xFE |0 + \xBD\xF9 |0 + \xE8\x4B |0 + \xE8\x4C |0 + \xE8\x48 |0 + \xBE\x40 |0 + \xBD\xFB |0 + \xBD\xFA |0 + \xBD\xFC |0 + \xE8\x47 |0 + \xEB\xCA |0 + \xBF\xE8 |0 + \xEB\xCC |0 + \xBF\xEA |0 + \xEB\xCF |0 + \xEB\xCB |0 + \xEB\xC9 |0 + \xEB\xCE |0 + \xBF\xE9 |0 + \xEB\xCD |0 + \xBF\xE7 |0 + \xC1\xD3 |0 + \xC1\xD6 |0 + \xEE\xC1 |0 + \xC1\xD4 |0 + \xEE\xC0 |0 + \xC1\xD2 |0 + \xC1\xD5 |0 + \xF1\x46 |0 + \xF1\x47 |0 + \xF1\x48 |0 + \xC2\xE0 |0 + \xF1\x49 |0 + \xC2\xE1 |0 + \xC3\xE2 |0 + \xF3\x58 |0 + \xF3\x59 |0 + \xF3\x57 |0 + \xF3\x56 |0 + \xF3\x5A |0 + \xC3\xE1 |0 + \xF4\xDD |0 + \xF4\xDB |0 + \xF4\xDC |0 + \xF4\xDE |0 + \xF4\xDA |0 + \xF4\xDF |0 + \xF6\x58 |0 + \xF6\x59 |0 + \xF6\x57 |0 + \xC5\x46 |0 + \xF7\x64 |0 + \xC5\xAF |0 + \xF7\x65 |0 + \xF8\x48 |0 + \xF8\x47 |0 + \xA8\xAF |0 + \xB6\x64 |0 + \xB9\x40 |0 + \xBB\xB6 |0 + \xBF\xEC |0 + \xBF\xEB |0 + \xC3\xE3 |0 + \xC4\x7C |0 + \xC5\x47 |0 + \xA8\xB0 |0 + \xB0\x64 |0 + \xB9\x41 |0 + \xF3\x5B |0 + \xCB\xA6 |0 + \xA8\xB1 |0 + \xA8\xB4 |0 + \xA8\xB3 |0 + \xA8\xB2 |0 + \xCB\xA5 |0 + \xCD\xCD |0 + \xCD\xCF |0 + \xAA\xEF |0 + \xAA\xF1 |0 + \xCD\xCC |0 + \xCD\xCE |0 + \xAA\xF0 |0 + \xCD\xD1 |0 + \xCD\xD0 |0 + \xCD\xD2 |0 + \xD0\xB6 |0 + \xD0\xB4 |0 + \xAD\x7C |0 + \xD0\xB3 |0 + \xAD\xA3 |0 + \xAD\x7E |0 + \xAD\x7B |0 + \xAD\xA4 |0 + \xAD\x7D |0 + \xAD\xA2 |0 + \xAD\xA1 |0 + \xD0\xB5 |0 + \xAD\x7A |0 + \xB0\x6A |0 + \xD3\xEB |0 + \xD3\xF1 |0 + \xB0\x67 |0 + \xB0\x6E |0 + \xB0\x69 |0 + \xD3\xEE |0 + \xD3\xF0 |0 + \xB0\x6C |0 + \xD3\xEA |0 + \xD3\xED |0 + \xB0\x68 |0 + \xB0\x65 |0 + \xD3\xEC |0 + \xB0\x6B |0 + \xD3\xEF |0 + \xB0\x6D |0 + \xB0\x66 |0 + \xD7\xE3 |0 + \xD7\xE6 |0 + \xB3\x70 |0 + \xB3\x7A |0 + \xB3\x76 |0 + \xD7\xE4 |0 + \xB3\x7E |0 + \xB3\x77 |0 + \xB3\x7C |0 + \xB3\x72 |0 + \xB3\x6F |0 + \xB3\x71 |0 + \xB3\x7D |0 + \xD7\xE5 |0 + \xB3\x75 |0 + \xB3\x78 |0 + \xB3\x74 |0 + \xB3\x79 |0 + \xD7\xE7 |0 + \xB3\x7B |0 + \xB3\x73 |0 + \xD7\xE2 |0 + \xDC\x4D |0 + \xB6\x65 |0 + \xDC\x4F |0 + \xB6\x67 |0 + \xB6\x69 |0 + \xDC\x4E |0 + \xB6\x66 |0 + \xB6\x6A |0 + \xB6\x68 |0 + \xB9\x47 |0 + \xE0\xA3 |0 + \xB9\x4F |0 + \xE0\x7E |0 + \xB9\x50 |0 + \xB9\x45 |0 + \xE0\xA1 |0 + \xB9\x4A |0 + \xE0\xA2 |0 + \xB9\x43 |0 + \xB9\x42 |0 + \xB9\x4D |0 + \xB9\x4C |0 + \xB9\x4B |0 + \xB9\x49 |0 + \xB9\x4E |0 + \xE0\x7D |0 + \xB9\x44 |0 + \xB9\x46 |0 + \xB9\x48 |0 + \xBB\xB8 |0 + \xBB\xBB |0 + \xBB\xBF |0 + \xBB\xB9 |0 + \xBB\xBE |0 + \xBB\xBC |0 + \xBB\xB7 |0 + \xBB\xBD |0 + \xBB\xBA |0 + \xE8\x52 |0 + \xBE\x43 |0 + \xBE\x41 |0 + \xE8\x53 |0 + \xBE\x44 |0 + \xBE\x42 |0 + \xE8\x51 |0 + \xE8\x50 |0 + \xBF\xF0 |0 + \xE8\x4F |0 + \xBF\xEE |0 + \xBF\xED |0 + \xEB\xD0 |0 + \xBE\x45 |0 + \xBF\xEF |0 + \xEB\xD1 |0 + \xBF\xF2 |0 + \xEB\xD2 |0 + \xBF\xF1 |0 + \xC1\xD8 |0 + \xEE\xC3 |0 + \xC1\xD7 |0 + \xC1\xDC |0 + \xC1\xDA |0 + \xC1\xDB |0 + \xC2\xE3 |0 + \xC1\xD9 |0 + \xEE\xC2 |0 + \xEB\xD3 |0 + \xC2\xE2 |0 + \xC2\xE4 |0 + \xC3\xE4 |0 + \xC3\xE5 |0 + \xF4\xE0 |0 + \xC5\xDE |0 + \xC5\xDD |0 + \xA8\xB6 |0 + \xCA\x55 |0 + \xB0\x6F |0 + \xCA\x52 |0 + \xCA\x53 |0 + \xCA\x51 |0 + \xCA\x54 |0 + \xCB\xAA |0 + \xCB\xA7 |0 + \xCB\xAC |0 + \xCB\xA8 |0 + \xA8\xB7 |0 + \xA8\xBA |0 + \xCB\xA9 |0 + \xA8\xB9 |0 + \xCB\xAB |0 + \xA8\xB8 |0 + \xCD\xD5 |0 + \xCD\xD7 |0 + \xAA\xF4 |0 + \xCD\xD3 |0 + \xCD\xD6 |0 + \xCD\xD4 |0 + \xAA\xF2 |0 + \xAA\xF5 |0 + \xAA\xF3 |0 + \xD0\xB8 |0 + \xD0\xBC |0 + \xD0\xB9 |0 + \xAD\xA7 |0 + \xAD\xA8 |0 + \xD0\xBB |0 + \xD0\xBD |0 + \xD0\xBF |0 + \xAD\xA5 |0 + \xD0\xBE |0 + \xAD\xA6 |0 + \xD7\xEE |0 + \xD0\xBA |0 + \xD3\xF2 |0 + \xD3\xFB |0 + \xD3\xF9 |0 + \xD3\xF4 |0 + \xD3\xF5 |0 + \xD3\xFA |0 + \xD3\xFC |0 + \xB0\x71 |0 + \xD3\xF7 |0 + \xD3\xF3 |0 + \xB0\x70 |0 + \xB0\x72 |0 + \xD3\xF6 |0 + \xD3\xFD |0 + \xD3\xF8 |0 + \xB3\xA1 |0 + \xD7\xF1 |0 + \xD7\xE9 |0 + \xD7\xEF |0 + \xD7\xF0 |0 + \xB3\xA2 |0 + \xD7\xE8 |0 + \xD7\xEA |0 + \xD0\xB7 |0 + \xD7\xEC |0 + \xD7\xED |0 + \xD7\xEB |0 + \xB6\x6C |0 + \xDC\x56 |0 + \xEB\xD4 |0 + \xDC\x57 |0 + \xDC\x54 |0 + \xB3\xA3 |0 + \xB6\x6E |0 + \xDC\x53 |0 + \xDC\x59 |0 + \xDC\x58 |0 + \xB6\x6B |0 + \xDC\x5C |0 + \xDC\x52 |0 + \xDC\x5B |0 + \xDC\x50 |0 + \xDC\x5A |0 + \xDC\x55 |0 + \xB6\x6D |0 + \xE0\xAA |0 + \xE0\xA5 |0 + \xE0\xAB |0 + \xE0\xA6 |0 + \xE0\xA4 |0 + \xE0\xA7 |0 + \xB9\x51 |0 + \xE0\xA9 |0 + \xE0\xA8 |0 + \xB9\x52 |0 + \xBB\xC1 |0 + \xBB\xC0 |0 + \xE4\x6E |0 + \xE4\x71 |0 + \xE4\x69 |0 + \xE4\x6D |0 + \xBB\xC2 |0 + \xE4\x6C |0 + \xE4\x6A |0 + \xE4\x70 |0 + \xE4\x6B |0 + \xE4\x68 |0 + \xE4\x6F |0 + \xE8\x59 |0 + \xBE\x48 |0 + \xF1\x4A |0 + \xE8\x56 |0 + \xE8\x57 |0 + \xE8\x55 |0 + \xDC\x51 |0 + \xBE\x47 |0 + \xE8\x5A |0 + \xE8\x54 |0 + \xBE\x46 |0 + \xBE\x49 |0 + \xE8\x58 |0 + \xEB\xD5 |0 + \xBF\xF3 |0 + \xEB\xD6 |0 + \xEB\xD7 |0 + \xEE\xC4 |0 + \xC1\xDD |0 + \xF1\x4B |0 + \xF1\x4C |0 + \xF1\x4D |0 + \xF3\x5D |0 + \xF3\x5C |0 + \xF4\xE2 |0 + \xF4\xE1 |0 + \xF6\x5B |0 + \xF6\x5C |0 + \xF6\x5A |0 + \xF7\x66 |0 + \xC5\xB0 |0 + \xA8\xBB |0 + \xAD\xAA |0 + \xAD\xA9 |0 + \xB0\x75 |0 + \xB0\x74 |0 + \xD4\x40 |0 + \xD4\x41 |0 + \xD3\xFE |0 + \xB0\x73 |0 + \xD7\xF5 |0 + \xD7\xF6 |0 + \xD7\xF2 |0 + \xB3\xA4 |0 + \xD7\xF3 |0 + \xD7\xF4 |0 + \xDC\x5F |0 + \xDC\x61 |0 + \xDC\x5D |0 + \xDC\x60 |0 + \xB6\x6F |0 + \xDC\x5E |0 + \xB6\x70 |0 + \xDD\x73 |0 + \xB9\x55 |0 + \xB9\x54 |0 + \xB9\x53 |0 + \xE0\xAC |0 + \xE0\xAD |0 + \xE4\x73 |0 + \xE4\x75 |0 + \xBB\xC6 |0 + \xBB\xC3 |0 + \xBB\xC5 |0 + \xBB\xC4 |0 + \xE4\x74 |0 + \xE4\x72 |0 + \xE8\x61 |0 + \xE8\x5E |0 + \xE8\x5F |0 + \xBE\x4D |0 + \xE8\x60 |0 + \xE8\x5B |0 + \xE8\x5C |0 + \xBE\x4A |0 + \xBE\x4B |0 + \xE8\x5D |0 + \xBE\x4C |0 + \xEB\xDB |0 + \xEB\xDC |0 + \xEB\xD9 |0 + \xEB\xDA |0 + \xBF\xF4 |0 + \xEB\xD8 |0 + \xEE\xC8 |0 + \xEE\xC5 |0 + \xEE\xC7 |0 + \xC1\xE0 |0 + \xEE\xCB |0 + \xC1\xDF |0 + \xEE\xC9 |0 + \xEE\xCC |0 + \xEE\xCA |0 + \xEE\xC6 |0 + \xC1\xDE |0 + \xF1\x4F |0 + \xF1\x50 |0 + \xF1\x4E |0 + \xF1\x52 |0 + \xC2\xE5 |0 + \xC2\xE6 |0 + \xF3\x5F |0 + \xC3\xE7 |0 + \xF1\x51 |0 + \xF3\x5E |0 + \xC3\xE6 |0 + \xF4\xE5 |0 + \xF4\xE6 |0 + \xC4\xBF |0 + \xF4\xE4 |0 + \xF4\xE3 |0 + \xF6\x5D |0 + \xC5\x48 |0 + \xF8\x49 |0 + \xF8\xC8 |0 + \xF8\xC7 |0 + \xC6\x43 |0 + \xC6\x5D |0 + \xF8\xC9 |0 + \xF9\x71 |0 + \xC6\x6F |0 + \xA8\xBC |0 + \xAA\xF6 |0 + \xB9\x56 |0 + \xC4\xC0 |0 + \xA8\xBD |0 + \xAD\xAB |0 + \xB3\xA5 |0 + \xB6\x71 |0 + \xC2\xE7 |0 + \xAA\xF7 |0 + \xD0\xC1 |0 + \xD0\xC0 |0 + \xD4\x42 |0 + \xB0\x78 |0 + \xB0\x76 |0 + \xB0\x7A |0 + \xD4\x44 |0 + \xB0\x79 |0 + \xB0\x77 |0 + \xD4\x43 |0 + \xB3\xA8 |0 + \xD7\xFC |0 + \xB3\xA7 |0 + \xB3\xA9 |0 + \xD8\x42 |0 + \xB3\xAB |0 + \xD7\xFE |0 + \xD8\x40 |0 + \xD7\xF7 |0 + \xB3\xAA |0 + \xD8\x43 |0 + \xD7\xF9 |0 + \xD7\xFA |0 + \xD7\xF8 |0 + \xB3\xA6 |0 + \xD8\x41 |0 + \xD7\xFB |0 + \xD7\xFD |0 + \xDC\x6D |0 + \xDC\x6C |0 + \xDC\x6A |0 + \xDC\x62 |0 + \xDC\x71 |0 + \xDC\x65 |0 + \xDC\x6F |0 + \xDC\x76 |0 + \xDC\x6E |0 + \xB6\x79 |0 + \xB6\x75 |0 + \xDC\x63 |0 + \xDC\x69 |0 + \xB6\x77 |0 + \xDC\x68 |0 + \xB6\x78 |0 + \xB6\x7A |0 + \xDC\x6B |0 + \xB6\x72 |0 + \xB6\x73 |0 + \xDC\x77 |0 + \xDC\x75 |0 + \xDC\x74 |0 + \xDC\x66 |0 + \xDC\x72 |0 + \xB6\x76 |0 + \xB6\x74 |0 + \xDC\x73 |0 + \xDC\x64 |0 + \xDC\x67 |0 + \xDC\x70 |0 + \xE4\xBA |0 + \xE0\xB7 |0 + \xE0\xB0 |0 + \xE0\xC3 |0 + \xE0\xCC |0 + \xE0\xB3 |0 + \xB9\x61 |0 + \xE0\xC0 |0 + \xB9\x57 |0 + \xB9\x59 |0 + \xB9\x65 |0 + \xE0\xB1 |0 + \xB9\x5A |0 + \xB9\x5C |0 + \xB9\x66 |0 + \xB9\x5B |0 + \xB9\x64 |0 + \xE0\xB9 |0 + \xE0\xAE |0 + \xB9\x62 |0 + \xE0\xB8 |0 + \xB9\x5E |0 + \xE0\xCA |0 + \xB9\x63 |0 + \xE0\xC8 |0 + \xE0\xBC |0 + \xE0\xC6 |0 + \xB9\x60 |0 + \xE0\xAF |0 + \xE0\xC9 |0 + \xE0\xC4 |0 + \xE0\xCB |0 + \xB9\x58 |0 + \xB9\x67 |0 + \xB9\x5D |0 + \xE0\xB5 |0 + \xE0\xBD |0 + \xE0\xC1 |0 + \xE0\xC5 |0 + \xB9\x5F |0 + \xE0\xB4 |0 + \xE0\xB2 |0 + \xE0\xBE |0 + \xE0\xBB |0 + \xE0\xBA |0 + \xE0\xBF |0 + \xE0\xC2 |0 + \xE0\xC7 |0 + \xE4\x78 |0 + \xBB\xC7 |0 + \xE4\xA4 |0 + \xE4\x7A |0 + \xBB\xCC |0 + \xBB\xD0 |0 + \xE4\xAD |0 + \xE4\xB5 |0 + \xE4\xA6 |0 + \xBB\xC8 |0 + \xE4\xAA |0 + \xE0\xB6 |0 + \xBB\xC9 |0 + \xE4\xB1 |0 + \xE4\xB6 |0 + \xE4\xAE |0 + \xE4\xB0 |0 + \xE4\xB9 |0 + \xE4\xB2 |0 + \xE4\x7E |0 + \xE4\xA9 |0 + \xBB\xD1 |0 + \xBB\xCD |0 + \xE4\x7C |0 + \xE4\xAB |0 + \xBB\xCB |0 + \xE4\xA5 |0 + \xBB\xCA |0 + \xE4\xB3 |0 + \xE4\xA2 |0 + \xE4\x79 |0 + \xBB\xCE |0 + \xE4\xB8 |0 + \xE4\x7B |0 + \xE4\xAF |0 + \xE4\xAC |0 + \xE4\xA7 |0 + \xE4\x77 |0 + \xE4\x76 |0 + \xE4\xA1 |0 + \xE4\xB4 |0 + \xBB\xCF |0 + \xE4\xB7 |0 + \xE4\x7D |0 + \xE4\xA3 |0 + \xBE\x52 |0 + \xBE\x5A |0 + \xBE\x55 |0 + \xE8\xA4 |0 + \xE8\xA1 |0 + \xE8\x67 |0 + \xBE\x50 |0 + \xF9\xD7 |0 + \xBE\x4F |0 + \xBE\x56 |0 + \xE8\x65 |0 + \xBE\x54 |0 + \xE8\x71 |0 + \xE8\x63 |0 + \xE8\x64 |0 + \xBE\x4E |0 + \xE8\xA3 |0 + \xBE\x58 |0 + \xE8\x74 |0 + \xE8\x79 |0 + \xE8\x73 |0 + \xEB\xEE |0 + \xE8\x6F |0 + \xE8\x77 |0 + \xE8\x75 |0 + \xE8\x68 |0 + \xE8\x62 |0 + \xE8\x7D |0 + \xBE\x57 |0 + \xE8\x7E |0 + \xE8\x78 |0 + \xE8\x6D |0 + \xE8\x6B |0 + \xE8\x66 |0 + \xE8\x6E |0 + \xE8\x7B |0 + \xE8\x6A |0 + \xE8\x7A |0 + \xE8\xA2 |0 + \xBE\x53 |0 + \xE8\x76 |0 + \xE8\x7C |0 + \xE8\x72 |0 + \xE8\x6C |0 + \xBE\x51 |0 + \xE4\xA8 |0 + \xE8\x70 |0 + \xBE\x59 |0 + \xE8\x69 |0 + \xEB\xF4 |0 + \xBF\xF7 |0 + \xEB\xF3 |0 + \xEB\xF0 |0 + \xEC\x44 |0 + \xBF\xFB |0 + \xEC\x41 |0 + \xEB\xF8 |0 + \xEC\x43 |0 + \xEB\xE9 |0 + \xEB\xF6 |0 + \xBF\xFD |0 + \xEB\xE1 |0 + \xEB\xDF |0 + \xEC\x42 |0 + \xEC\x40 |0 + \xEB\xFE |0 + \xEB\xED |0 + \xEB\xEC |0 + \xEB\xE2 |0 + \xC0\x40 |0 + \xEB\xE8 |0 + \xEB\xF2 |0 + \xEB\xFD |0 + \xC0\x43 |0 + \xEC\x45 |0 + \xC1\xE8 |0 + \xC0\x45 |0 + \xBF\xFE |0 + \xEB\xE6 |0 + \xEB\xEF |0 + \xEB\xDE |0 + \xEB\xE0 |0 + \xBF\xF5 |0 + \xC0\x42 |0 + \xBF\xFA |0 + \xEB\xE7 |0 + \xEB\xF7 |0 + \xEB\xF1 |0 + \xC0\x41 |0 + \xEB\xDD |0 + \xC1\xE3 |0 + \xEB\xF9 |0 + \xEB\xFC |0 + \xBF\xFC |0 + \xEB\xEB |0 + \xC0\x44 |0 + \xBF\xF9 |0 + \xBF\xF8 |0 + \xEB\xF5 |0 + \xEB\xFB |0 + \xBF\xF6 |0 + \xEB\xE4 |0 + \xEB\xFA |0 + \xEB\xE5 |0 + \xEB\xEA |0 + \xEE\xD2 |0 + \xEE\xD7 |0 + \xC1\xE5 |0 + \xC1\xE7 |0 + \xEE\xDD |0 + \xC1\xE1 |0 + \xEE\xEC |0 + \xEE\xE3 |0 + \xEE\xD8 |0 + \xEE\xD9 |0 + \xEE\xE2 |0 + \xC1\xEE |0 + \xEE\xE1 |0 + \xEE\xD1 |0 + \xEE\xE0 |0 + \xEE\xD4 |0 + \xEE\xED |0 + \xC1\xED |0 + \xC1\xEB |0 + \xEE\xD5 |0 + \xEE\xE8 |0 + \xEE\xDA |0 + \xEE\xE7 |0 + \xEE\xE9 |0 + \xEE\xD0 |0 + \xC1\xE6 |0 + \xEE\xEA |0 + \xEE\xDE |0 + \xC1\xEA |0 + \xEE\xDB |0 + \xC1\xEC |0 + \xEE\xE4 |0 + \xC1\xE4 |0 + \xEE\xD6 |0 + \xEE\xE5 |0 + \xEE\xDF |0 + \xEB\xE3 |0 + \xEE\xE6 |0 + \xEE\xD3 |0 + \xC1\xE9 |0 + \xEE\xEB |0 + \xC1\xE2 |0 + \xEE\xCE |0 + \xF1\x60 |0 + \xF1\x59 |0 + \xC2\xE9 |0 + \xF1\x54 |0 + \xF1\x63 |0 + \xF1\x5B |0 + \xEE\xDC |0 + \xF1\x65 |0 + \xF1\x55 |0 + \xC2\xE8 |0 + \xF1\x5F |0 + \xC2\xEA |0 + \xC2\xF2 |0 + \xC2\xF0 |0 + \xF1\x61 |0 + \xC2\xF1 |0 + \xF1\x57 |0 + \xF1\x58 |0 + \xF1\x5D |0 + \xF1\x62 |0 + \xEE\xCD |0 + \xC2\xEB |0 + \xF1\x6A |0 + \xF1\x67 |0 + \xF1\x6B |0 + \xF1\x5E |0 + \xF1\x5A |0 + \xF1\x68 |0 + \xF3\x6A |0 + \xF1\x5C |0 + \xC2\xEE |0 + \xC2\xED |0 + \xEE\xCF |0 + \xC2\xEF |0 + \xF1\x64 |0 + \xF1\x66 |0 + \xC2\xEC |0 + \xF1\x69 |0 + \xF1\x53 |0 + \xF1\x56 |0 + \xF3\x73 |0 + \xF3\x63 |0 + \xC3\xEB |0 + \xF3\x71 |0 + \xF3\x61 |0 + \xC3\xEC |0 + \xF3\x6C |0 + \xF3\x68 |0 + \xC3\xF1 |0 + \xF3\x72 |0 + \xF3\x62 |0 + \xF3\x65 |0 + \xC3\xE9 |0 + \xF3\x74 |0 + \xF3\x6D |0 + \xF3\x70 |0 + \xC3\xEF |0 + \xC3\xF4 |0 + \xC3\xF2 |0 + \xF3\x69 |0 + \xF3\x64 |0 + \xC3\xED |0 + \xC3\xEE |0 + \xF3\x60 |0 + \xC3\xEA |0 + \xC3\xE8 |0 + \xC3\xF0 |0 + \xF3\x6F |0 + \xC3\xF3 |0 + \xF3\x6B |0 + \xF3\x75 |0 + \xC3\xF5 |0 + \xF3\x67 |0 + \xF3\x6E |0 + \xF4\xF3 |0 + \xF5\x42 |0 + \xF4\xF5 |0 + \xF4\xFC |0 + \xF3\x66 |0 + \xF4\xFA |0 + \xF4\xE9 |0 + \xF5\x40 |0 + \xC4\xC3 |0 + \xF4\xED |0 + \xF4\xFE |0 + \xF4\xF4 |0 + \xC4\xC2 |0 + \xF5\x44 |0 + \xF4\xF6 |0 + \xF4\xFB |0 + \xF4\xFD |0 + \xF4\xE7 |0 + \xF5\x41 |0 + \xF4\xF2 |0 + \xF4\xF7 |0 + \xF4\xEB |0 + \xF4\xEF |0 + \xF5\x43 |0 + \xF4\xF9 |0 + \xF4\xE8 |0 + \xF4\xEC |0 + \xF4\xEE |0 + \xF4\xF8 |0 + \xC4\xC1 |0 + \xF4\xF1 |0 + \xF4\xEA |0 + \xF4\xF0 |0 + \xF6\x61 |0 + \xF6\x66 |0 + \xC5\x4F |0 + \xF6\x68 |0 + \xC5\x49 |0 + \xF6\x64 |0 + \xF6\x6A |0 + \xC5\x4E |0 + \xC5\x4A |0 + \xC5\x4B |0 + \xF6\x60 |0 + \xF6\x67 |0 + \xC5\x4D |0 + \xF6\x65 |0 + \xC5\x4C |0 + \xF6\x5F |0 + \xF6\x63 |0 + \xF6\x62 |0 + \xF6\x5E |0 + \xF6\x69 |0 + \xC5\xB1 |0 + \xF7\x6D |0 + \xF7\x70 |0 + \xF7\x6C |0 + \xF7\x6E |0 + \xF7\x6F |0 + \xF7\x69 |0 + \xF7\x6A |0 + \xF7\x67 |0 + \xF7\x6B |0 + \xF7\x68 |0 + \xC5\xB2 |0 + \xC5\xB3 |0 + \xF8\x4B |0 + \xF8\x4D |0 + \xF8\x4C |0 + \xF8\x4E |0 + \xC5\xE0 |0 + \xF8\x4A |0 + \xC5\xDF |0 + \xC5\xE1 |0 + \xF8\xCB |0 + \xF8\xCC |0 + \xC6\x44 |0 + \xF8\xCA |0 + \xF9\x53 |0 + \xF9\x52 |0 + \xF9\x54 |0 + \xC6\x5F |0 + \xF9\x55 |0 + \xC6\x5E |0 + \xF9\x56 |0 + \xF9\x72 |0 + \xF9\x75 |0 + \xF9\x74 |0 + \xC6\x68 |0 + \xF9\x73 |0 + \xC6\x72 |0 + \xC6\x70 |0 + \xC6\x71 |0 + \xC6\x77 |0 + \xF9\xC0 |0 + \xF9\xC1 |0 + \xF9\xBF |0 + \xF9\xC9 |0 + \xAA\xF8 |0 + \xD8\x44 |0 + \xDC\x78 |0 + \xE8\xA5 |0 + \xF3\x76 |0 + \xAA\xF9 |0 + \xAD\xAC |0 + \xB0\x7B |0 + \xD8\x45 |0 + \xD8\x46 |0 + \xB3\xAC |0 + \xB6\x7D |0 + \xDC\x7A |0 + \xDC\x79 |0 + \xB6\xA3 |0 + \xB6\x7C |0 + \xDC\x7B |0 + \xB6\x7E |0 + \xB6\xA2 |0 + \xB6\xA1 |0 + \xB6\x7B |0 + \xB9\x68 |0 + \xE0\xD0 |0 + \xE0\xCE |0 + \xE0\xCF |0 + \xE0\xCD |0 + \xBB\xD2 |0 + \xBB\xD5 |0 + \xBB\xD7 |0 + \xBB\xD6 |0 + \xBB\xD3 |0 + \xBB\xD4 |0 + \xE8\xA7 |0 + \xE8\xA6 |0 + \xBE\x5B |0 + \xE8\xA8 |0 + \xE8\xA9 |0 + \xBE\x5C |0 + \xEC\x4D |0 + \xEC\x4B |0 + \xEE\xF3 |0 + \xEC\x49 |0 + \xEC\x4A |0 + \xC0\x46 |0 + \xEC\x46 |0 + \xEC\x4E |0 + \xEC\x48 |0 + \xEC\x4C |0 + \xEE\xEF |0 + \xEE\xF1 |0 + \xEE\xF2 |0 + \xC1\xF3 |0 + \xEE\xEE |0 + \xC1\xF2 |0 + \xEE\xF0 |0 + \xC1\xEF |0 + \xC1\xF0 |0 + \xC1\xF1 |0 + \xEC\x47 |0 + \xC2\xF5 |0 + \xF1\x6E |0 + \xF1\x6C |0 + \xF1\x6D |0 + \xC2\xF3 |0 + \xC2\xF6 |0 + \xC2\xF4 |0 + \xF3\x77 |0 + \xF3\x78 |0 + \xC3\xF6 |0 + \xF5\x45 |0 + \xF5\x47 |0 + \xF5\x46 |0 + \xC4\xC4 |0 + \xC5\x50 |0 + \xF6\x6D |0 + \xF6\x6C |0 + \xF6\x6B |0 + \xAA\xFA |0 + \xC9\xAA |0 + \xCA\x58 |0 + \xA6\xE9 |0 + \xCA\x56 |0 + \xCA\x59 |0 + \xCA\x57 |0 + \xCB\xAE |0 + \xA8\xC1 |0 + \xA8\xC2 |0 + \xCB\xB0 |0 + \xA8\xBF |0 + \xCB\xAF |0 + \xCB\xAD |0 + \xA8\xC0 |0 + \xA8\xBE |0 + \xCD\xD8 |0 + \xCD\xDB |0 + \xAA\xFD |0 + \xCD\xDA |0 + \xCD\xD9 |0 + \xAA\xFC |0 + \xAA\xFB |0 + \xAB\x40 |0 + \xCD\xDC |0 + \xAA\xFE |0 + \xD0\xC6 |0 + \xAD\xAE |0 + \xAD\xAF |0 + \xAD\xB0 |0 + \xD0\xC7 |0 + \xD0\xC3 |0 + \xAD\xAD |0 + \xD0\xC4 |0 + \xD0\xC5 |0 + \xD0\xC2 |0 + \xB0\xA4 |0 + \xB0\xA1 |0 + \xD4\x45 |0 + \xB0\xA2 |0 + \xB0\xA5 |0 + \xD4\x46 |0 + \xB0\x7E |0 + \xB0\x7C |0 + \xB0\x7D |0 + \xB0\xA3 |0 + \xB3\xAD |0 + \xD8\x49 |0 + \xB3\xB5 |0 + \xD8\x48 |0 + \xD8\x4B |0 + \xB3\xB1 |0 + \xD8\x4A |0 + \xB6\xAB |0 + \xB3\xAF |0 + \xB3\xB2 |0 + \xB3\xAE |0 + \xB3\xB3 |0 + \xB3\xB4 |0 + \xB3\xB0 |0 + \xD8\x47 |0 + \xB6\xA7 |0 + \xDC\x7D |0 + \xDC\xA3 |0 + \xDC\xA2 |0 + \xB6\xAC |0 + \xB6\xA8 |0 + \xB6\xA9 |0 + \xDC\x7C |0 + \xDC\x7E |0 + \xDC\xA1 |0 + \xB6\xA4 |0 + \xB6\xA6 |0 + \xB6\xAA |0 + \xB6\xA5 |0 + \xE0\xD3 |0 + \xE0\xD1 |0 + \xE0\xD2 |0 + \xB9\x6A |0 + \xB9\x6B |0 + \xE0\xD4 |0 + \xB9\x69 |0 + \xBB\xD8 |0 + \xBB\xDA |0 + \xBB\xD9 |0 + \xE4\xBB |0 + \xE4\xBC |0 + \xE8\xAB |0 + \xE8\xAA |0 + \xC0\x47 |0 + \xC0\x48 |0 + \xEC\x4F |0 + \xC0\x49 |0 + \xEE\xF6 |0 + \xEE\xF4 |0 + \xEE\xF5 |0 + \xC1\xF4 |0 + \xF1\x6F |0 + \xC3\xF7 |0 + \xC1\xF5 |0 + \xAB\x41 |0 + \xB0\xA6 |0 + \xD4\x47 |0 + \xD8\x4C |0 + \xB3\xB6 |0 + \xB6\xAD |0 + \xDC\xA4 |0 + \xDC\xA6 |0 + \xB6\xAF |0 + \xB6\xAE |0 + \xB6\xB0 |0 + \xB6\xB1 |0 + \xDC\xA5 |0 + \xB9\x6E |0 + \xB9\x6F |0 + \xB9\x6D |0 + \xBB\xDB |0 + \xB9\x6C |0 + \xE0\xD5 |0 + \xBB\xDC |0 + \xE8\xAC |0 + \xEC\x50 |0 + \xC0\x4A |0 + \xC1\xF6 |0 + \xF1\x70 |0 + \xF1\x74 |0 + \xC2\xF9 |0 + \xF1\x71 |0 + \xC2\xFA |0 + \xC2\xF8 |0 + \xF1\x75 |0 + \xC2\xFB |0 + \xF1\x73 |0 + \xF3\x79 |0 + \xC2\xF7 |0 + \xC3\xF8 |0 + \xF8\xCD |0 + \xAB\x42 |0 + \xB3\xB8 |0 + \xB3\xB7 |0 + \xB6\xB2 |0 + \xDC\xA8 |0 + \xDC\xA7 |0 + \xB6\xB3 |0 + \xE0\xD9 |0 + \xB9\x73 |0 + \xB9\x70 |0 + \xE0\xD8 |0 + \xB9\x72 |0 + \xE0\xD6 |0 + \xB9\x71 |0 + \xE0\xD7 |0 + \xE4\xBD |0 + \xBB\xDD |0 + \xE8\xAF |0 + \xBE\x5D |0 + \xE8\xAD |0 + \xBE\x5E |0 + \xBE\x5F |0 + \xE8\xAE |0 + \xBE\x60 |0 + \xEC\x51 |0 + \xC0\x4E |0 + \xC0\x4B |0 + \xC0\x50 |0 + \xEC\x53 |0 + \xC0\x4C |0 + \xEC\x52 |0 + \xC0\x4F |0 + \xC0\x4D |0 + \xEE\xF9 |0 + \xEE\xFB |0 + \xC1\xF7 |0 + \xEE\xFA |0 + \xC1\xF8 |0 + \xEE\xF8 |0 + \xEE\xF7 |0 + \xF1\x77 |0 + \xF1\x76 |0 + \xC2\xFC |0 + \xF1\x78 |0 + \xF3\x7E |0 + \xC3\xFA |0 + \xF3\x7D |0 + \xF3\x7A |0 + \xC3\xF9 |0 + \xF3\x7B |0 + \xF3\x7C |0 + \xF5\x48 |0 + \xF5\x49 |0 + \xC4\xC5 |0 + \xC5\x53 |0 + \xF6\x6E |0 + \xC5\x51 |0 + \xC5\x52 |0 + \xF6\x6F |0 + \xC5\xB4 |0 + \xC5\xB5 |0 + \xF7\x71 |0 + \xC6\x45 |0 + \xF8\xCF |0 + \xC6\x47 |0 + \xF8\xCE |0 + \xF8\xD0 |0 + \xC6\x46 |0 + \xF9\x57 |0 + \xF9\xAD |0 + \xAB\x43 |0 + \xB9\x74 |0 + \xE4\xBE |0 + \xE8\xB0 |0 + \xC0\x51 |0 + \xC0\x52 |0 + \xAB\x44 |0 + \xBE\x61 |0 + \xC3\xFB |0 + \xAD\xB1 |0 + \xC0\x53 |0 + \xC5\xE2 |0 + \xAD\xB2 |0 + \xD8\x4D |0 + \xDC\xA9 |0 + \xDC\xAB |0 + \xDC\xAA |0 + \xE0\xDD |0 + \xE0\xDA |0 + \xB9\x75 |0 + \xB9\x76 |0 + \xE0\xDB |0 + \xE0\xDC |0 + \xE4\xC0 |0 + \xE4\xC5 |0 + \xBB\xDE |0 + \xE4\xBF |0 + \xE4\xC1 |0 + \xE4\xC8 |0 + \xE4\xC3 |0 + \xE4\xC7 |0 + \xE4\xC4 |0 + \xE4\xC2 |0 + \xE4\xC6 |0 + \xBB\xDF |0 + \xE8\xB3 |0 + \xE8\xB1 |0 + \xBE\x63 |0 + \xBE\x62 |0 + \xE8\xB2 |0 + \xBE\x64 |0 + \xEC\x56 |0 + \xEC\x55 |0 + \xC0\x54 |0 + \xEC\x54 |0 + \xEE\xFC |0 + \xEE\xFE |0 + \xEF\x41 |0 + \xEF\x40 |0 + \xC1\xF9 |0 + \xEE\xFD |0 + \xF1\xA1 |0 + \xC2\xFD |0 + \xF1\x7D |0 + \xF1\xA2 |0 + \xC2\xFE |0 + \xF1\x7B |0 + \xF1\x7E |0 + \xF1\x7C |0 + \xF1\x79 |0 + \xC3\x40 |0 + \xF1\x7A |0 + \xF3\xA1 |0 + \xF3\xA3 |0 + \xF3\xA2 |0 + \xF5\x4A |0 + \xF5\x4B |0 + \xF6\x70 |0 + \xC5\xB7 |0 + \xC5\xB6 |0 + \xF8\x4F |0 + \xF8\x50 |0 + \xC6\x48 |0 + \xF8\xD1 |0 + \xC6\x69 |0 + \xAD\xB3 |0 + \xB6\xB4 |0 + \xE4\xCA |0 + \xE4\xC9 |0 + \xE8\xB5 |0 + \xE8\xB4 |0 + \xC1\xFA |0 + \xEF\x43 |0 + \xEF\x42 |0 + \xF1\xA5 |0 + \xF1\xA3 |0 + \xF1\xA6 |0 + \xF1\xA4 |0 + \xC3\xFC |0 + \xF3\xA4 |0 + \xF3\xA5 |0 + \xF3\xA6 |0 + \xF6\x71 |0 + \xF7\x72 |0 + \xF8\xD2 |0 + \xAD\xB4 |0 + \xEC\x57 |0 + \xEF\x44 |0 + \xAD\xB5 |0 + \xBB\xE0 |0 + \xEC\x58 |0 + \xC3\x41 |0 + \xF1\xA7 |0 + \xC3\xFD |0 + \xF5\x4C |0 + \xF5\x4D |0 + \xC5\x54 |0 + \xF8\x51 |0 + \xAD\xB6 |0 + \xB3\xBB |0 + \xB3\xBC |0 + \xD8\x4E |0 + \xB6\xB5 |0 + \xB6\xB6 |0 + \xDC\xAC |0 + \xB6\xB7 |0 + \xB9\x7A |0 + \xB9\x7C |0 + \xE0\xDF |0 + \xE0\xE0 |0 + \xE0\xDE |0 + \xB9\x77 |0 + \xB9\x78 |0 + \xB9\x7B |0 + \xB9\x79 |0 + \xE4\xCB |0 + \xBB\xE1 |0 + \xBB\xE2 |0 + \xE8\xBC |0 + \xBE\x67 |0 + \xE8\xB7 |0 + \xE8\xB6 |0 + \xE8\xBB |0 + \xBE\x65 |0 + \xC0\x5B |0 + \xE8\xB8 |0 + \xE8\xBD |0 + \xE8\xBA |0 + \xE8\xB9 |0 + \xBE\x66 |0 + \xC0\x59 |0 + \xEC\x5A |0 + \xC0\x55 |0 + \xEC\x5B |0 + \xEC\x59 |0 + \xC0\x58 |0 + \xC0\x56 |0 + \xC0\x5A |0 + \xC0\x57 |0 + \xEF\x45 |0 + \xEF\x4A |0 + \xEF\x46 |0 + \xEF\x49 |0 + \xC1\xFB |0 + \xED\xD4 |0 + \xEF\x48 |0 + \xEF\x47 |0 + \xC3\x44 |0 + \xC3\x42 |0 + \xC3\x45 |0 + \xC3\x43 |0 + \xF1\xA8 |0 + \xF1\xA9 |0 + \xF1\xAA |0 + \xC3\x46 |0 + \xF3\xAA |0 + \xC4\x40 |0 + \xF3\xA8 |0 + \xC4\x41 |0 + \xF3\xA7 |0 + \xF3\xA9 |0 + \xC3\xFE |0 + \xF5\x51 |0 + \xF5\x4E |0 + \xF5\x4F |0 + \xF5\x50 |0 + \xF6\x72 |0 + \xC5\x56 |0 + \xC5\x55 |0 + \xF7\x74 |0 + \xF7\x73 |0 + \xC5\xB8 |0 + \xC5\xE3 |0 + \xC6\x49 |0 + \xC6\x60 |0 + \xF9\x58 |0 + \xF9\xAE |0 + \xF9\xAF |0 + \xAD\xB7 |0 + \xDC\xAD |0 + \xE0\xE1 |0 + \xE4\xCC |0 + \xE4\xCD |0 + \xBB\xE3 |0 + \xBB\xE4 |0 + \xE8\xBE |0 + \xBE\x68 |0 + \xC1\xFC |0 + \xF1\xAB |0 + \xC3\x47 |0 + \xF3\xAD |0 + \xC4\x42 |0 + \xF3\xAC |0 + \xF3\xAE |0 + \xF3\xAB |0 + \xF6\x75 |0 + \xF5\x52 |0 + \xF5\x53 |0 + \xC4\xC6 |0 + \xF6\x74 |0 + \xF6\x73 |0 + \xF7\x75 |0 + \xF9\xB0 |0 + \xAD\xB8 |0 + \xAD\xB9 |0 + \xB0\xA7 |0 + \xD4\x48 |0 + \xD8\x4F |0 + \xB6\xB8 |0 + \xB6\xBB |0 + \xB6\xB9 |0 + \xDC\xAE |0 + \xB6\xBD |0 + \xB6\xBA |0 + \xB6\xBC |0 + \xB9\x7E |0 + \xE0\xE2 |0 + \xE0\xE3 |0 + \xE8\xC0 |0 + \xB9\x7D |0 + \xB9\xA1 |0 + \xB9\xA2 |0 + \xE4\xCF |0 + \xE4\xCE |0 + \xBB\xE5 |0 + \xBB\xE6 |0 + \xE4\xD0 |0 + \xE8\xBF |0 + \xBB\xE8 |0 + \xBE\x69 |0 + \xBB\xE7 |0 + \xC0\x5C |0 + \xE8\xC1 |0 + \xBE\x6B |0 + \xBE\x6A |0 + \xE8\xC2 |0 + \xE8\xC5 |0 + \xE8\xC3 |0 + \xE8\xC4 |0 + \xBE\x6C |0 + \xC0\x61 |0 + \xC0\x5F |0 + \xC0\x5E |0 + \xEC\x5D |0 + \xC0\x60 |0 + \xEC\x5C |0 + \xEF\x4B |0 + \xEC\x5E |0 + \xC0\x5D |0 + \xEC\x5F |0 + \xEF\x4E |0 + \xEF\x4C |0 + \xEF\x4D |0 + \xEF\x52 |0 + \xC3\x4B |0 + \xEF\x51 |0 + \xEF\x54 |0 + \xEF\x53 |0 + \xEF\x50 |0 + \xEF\x4F |0 + \xC1\xFD |0 + \xF1\xAE |0 + \xF1\xAD |0 + \xC3\x4A |0 + \xC3\x48 |0 + \xC3\x49 |0 + \xF1\xAC |0 + \xF3\xB1 |0 + \xC4\x43 |0 + \xF3\xB0 |0 + \xF3\xAF |0 + \xC4\x44 |0 + \xF5\x58 |0 + \xF5\x57 |0 + \xF5\x55 |0 + \xF5\x54 |0 + \xC4\xC8 |0 + \xC4\xC7 |0 + \xF5\x59 |0 + \xF7\x76 |0 + \xC5\xB9 |0 + \xF6\x77 |0 + \xC5\x57 |0 + \xF6\x76 |0 + \xF5\x56 |0 + \xF7\x77 |0 + \xC5\xE4 |0 + \xC6\x61 |0 + \xF9\x59 |0 + \xF9\xB1 |0 + \xAD\xBA |0 + \xD8\x50 |0 + \xEF\x55 |0 + \xAD\xBB |0 + \xE4\xD2 |0 + \xE4\xD1 |0 + \xEC\x60 |0 + \xEF\x57 |0 + \xEF\x56 |0 + \xC3\x4C |0 + \xF3\xB2 |0 + \xF3\xB3 |0 + \xC4\xC9 |0 + \xF9\xB2 |0 + \xB0\xA8 |0 + \xB6\xBF |0 + \xB6\xBE |0 + \xE0\xE4 |0 + \xE0\xE6 |0 + \xB9\xA4 |0 + \xE0\xE5 |0 + \xB9\xA3 |0 + \xB9\xA5 |0 + \xE0\xE7 |0 + \xE4\xD4 |0 + \xE4\xD6 |0 + \xE4\xD5 |0 + \xE4\xD8 |0 + \xBB\xE9 |0 + \xE4\xD7 |0 + \xE4\xD3 |0 + \xE4\xD9 |0 + \xE8\xCC |0 + \xE8\xCF |0 + \xE8\xD1 |0 + \xE8\xC7 |0 + \xE8\xCB |0 + \xE8\xC8 |0 + \xBE\x6E |0 + \xBE\x71 |0 + \xBE\x73 |0 + \xE8\xC9 |0 + \xE8\xCA |0 + \xBE\x72 |0 + \xE8\xCD |0 + \xE8\xD0 |0 + \xE8\xCE |0 + \xBE\x74 |0 + \xBE\x70 |0 + \xE8\xC6 |0 + \xBE\x6D |0 + \xBE\x6F |0 + \xC0\x63 |0 + \xEC\x66 |0 + \xEC\x64 |0 + \xEC\x63 |0 + \xEC\x69 |0 + \xEC\x68 |0 + \xEC\x67 |0 + \xEC\x62 |0 + \xC0\x62 |0 + \xEC\x61 |0 + \xEC\x65 |0 + \xC0\x64 |0 + \xEF\x5A |0 + \xEF\x5E |0 + \xEF\x5B |0 + \xEF\x5D |0 + \xEF\x5C |0 + \xEF\x59 |0 + \xEF\x5F |0 + \xEF\x62 |0 + \xEF\x60 |0 + \xEF\x61 |0 + \xC2\x40 |0 + \xC1\xFE |0 + \xEF\x58 |0 + \xEF\x63 |0 + \xF1\xB3 |0 + \xF1\xB6 |0 + \xF1\xB8 |0 + \xF1\xB7 |0 + \xF1\xB1 |0 + \xF1\xB5 |0 + \xF1\xB0 |0 + \xF1\xB2 |0 + \xC3\x4D |0 + \xF1\xAF |0 + \xF1\xB4 |0 + \xF3\xC0 |0 + \xF3\xB5 |0 + \xC4\x45 |0 + \xC4\x46 |0 + \xF3\xB4 |0 + \xF3\xB9 |0 + \xF3\xBF |0 + \xF3\xB7 |0 + \xF3\xBE |0 + \xF3\xBB |0 + \xF3\xBA |0 + \xF3\xBD |0 + \xF3\xB8 |0 + \xF3\xB6 |0 + \xF3\xBC |0 + \xF5\x60 |0 + \xF5\x5E |0 + \xC4\xCA |0 + \xF5\x5D |0 + \xF5\x63 |0 + \xF5\x61 |0 + \xC4\xCB |0 + \xF5\x5C |0 + \xF5\x5A |0 + \xF5\x5B |0 + \xC4\xCD |0 + \xF5\x5F |0 + \xC4\xCC |0 + \xF5\x62 |0 + \xF6\x78 |0 + \xF6\x7E |0 + \xF6\x79 |0 + \xC5\x5B |0 + \xF6\xA1 |0 + \xC5\x5A |0 + \xF6\x7D |0 + \xF6\x7C |0 + \xC5\x59 |0 + \xF6\x7B |0 + \xC5\x58 |0 + \xF6\x7A |0 + \xF7\x7D |0 + \xF7\xA1 |0 + \xF7\x7E |0 + \xF7\x7B |0 + \xC5\xBB |0 + \xF7\x78 |0 + \xF7\x7C |0 + \xF7\xA3 |0 + \xF7\xA2 |0 + \xF7\x79 |0 + \xF7\x7A |0 + \xC5\xBA |0 + \xF8\x52 |0 + \xC5\xE7 |0 + \xF8\x53 |0 + \xC5\xE5 |0 + \xC5\xE6 |0 + \xF8\xD3 |0 + \xC6\x4A |0 + \xF9\x76 |0 + \xC6\x6A |0 + \xF9\xB3 |0 + \xC6\x6B |0 + \xF9\xB4 |0 + \xF9\xB5 |0 + \xF9\xC3 |0 + \xF9\xC2 |0 + \xC6\x7A |0 + \xF9\xCD |0 + \xB0\xA9 |0 + \xE0\xE9 |0 + \xE0\xE8 |0 + \xBB\xEA |0 + \xBB\xEB |0 + \xE4\xDA |0 + \xE8\xD2 |0 + \xEC\x6C |0 + \xBE\x75 |0 + \xC0\x65 |0 + \xEC\x6A |0 + \xEC\x6D |0 + \xC0\x66 |0 + \xEF\x64 |0 + \xEC\x6B |0 + \xF1\xB9 |0 + \xC3\x4E |0 + \xF3\xC1 |0 + \xF5\x66 |0 + \xF5\x64 |0 + \xF5\x65 |0 + \xF6\xA2 |0 + \xC5\x5C |0 + \xF7\xA4 |0 + \xC5\xEA |0 + \xC5\xBC |0 + \xC5\xE8 |0 + \xC5\xE9 |0 + \xF8\xD4 |0 + \xC6\x62 |0 + \xB0\xAA |0 + \xF1\xBA |0 + \xD4\x49 |0 + \xB9\xA6 |0 + \xE4\xDB |0 + \xBB\xEC |0 + \xE4\xDC |0 + \xE8\xD4 |0 + \xE8\xD3 |0 + \xC0\x68 |0 + \xBE\x76 |0 + \xBE\x77 |0 + \xE8\xD7 |0 + \xE8\xD6 |0 + \xE8\xD5 |0 + \xEC\x6E |0 + \xEC\x71 |0 + \xEC\x70 |0 + \xEC\x6F |0 + \xC0\x67 |0 + \xEF\x68 |0 + \xEF\x66 |0 + \xEF\x65 |0 + \xEF\x67 |0 + \xC3\x4F |0 + \xF1\xBC |0 + \xF1\xBD |0 + \xC3\x50 |0 + \xF1\xBB |0 + \xF3\xC3 |0 + \xF3\xC2 |0 + \xF3\xC5 |0 + \xC4\x47 |0 + \xF3\xC4 |0 + \xF5\x67 |0 + \xF5\x69 |0 + \xF5\x68 |0 + \xF6\xA3 |0 + \xF6\xA6 |0 + \xF6\xA4 |0 + \xF6\xA5 |0 + \xF7\xA5 |0 + \xC5\xBD |0 + \xF8\x54 |0 + \xF8\x55 |0 + \xF8\x56 |0 + \xC6\x4B |0 + \xC6\x63 |0 + \xF9\xB6 |0 + \xB0\xAB |0 + \xBE\x78 |0 + \xC0\x69 |0 + \xF1\xBE |0 + \xF7\xA6 |0 + \xF9\xC4 |0 + \xD4\x4A |0 + \xC6\x7B |0 + \xB0\xAC |0 + \xEC\x72 |0 + \xF1\xBF |0 + \xF3\xC6 |0 + \xF6\xA7 |0 + \xF7\xA7 |0 + \xB0\xAD |0 + \xE4\xDD |0 + \xE4\xDE |0 + \xBB\xED |0 + \xBB\xEE |0 + \xE8\xD9 |0 + \xBE\x7A |0 + \xBE\x79 |0 + \xE8\xD8 |0 + \xEF\x69 |0 + \xF1\xC0 |0 + \xF1\xC2 |0 + \xF1\xC1 |0 + \xC3\x53 |0 + \xC3\x52 |0 + \xC3\x51 |0 + \xC5\x5E |0 + \xF6\xA8 |0 + \xC5\x5D |0 + \xF7\xA9 |0 + \xF7\xA8 |0 + \xC6\x4C |0 + \xF8\xD5 |0 + \xB3\xBD |0 + \xE0\xEA |0 + \xE4\xE1 |0 + \xE4\xDF |0 + \xE4\xE0 |0 + \xE8\xE2 |0 + \xE8\xDD |0 + \xE8\xDA |0 + \xE8\xE1 |0 + \xE8\xE3 |0 + \xBE\x7C |0 + \xE8\xE0 |0 + \xE8\xDC |0 + \xE8\xDB |0 + \xE8\xDF |0 + \xE8\xDE |0 + \xBE\x7B |0 + \xEC\x7D |0 + \xEC\x78 |0 + \xEC\x76 |0 + \xEC\xA1 |0 + \xEC\x77 |0 + \xEC\x73 |0 + \xEC\x79 |0 + \xEC\x74 |0 + \xEF\x72 |0 + \xEC\x75 |0 + \xEC\xA2 |0 + \xEC\x7C |0 + \xC0\x6A |0 + \xEC\x7B |0 + \xEC\x7A |0 + \xEC\x7E |0 + \xEF\x6A |0 + \xEF\x6D |0 + \xEF\x6C |0 + \xEF\x74 |0 + \xEF\x6F |0 + \xEF\x73 |0 + \xEF\x71 |0 + \xEF\x70 |0 + \xEF\x6E |0 + \xEF\x6B |0 + \xC2\x43 |0 + \xC2\x42 |0 + \xC2\x44 |0 + \xC2\x41 |0 + \xEF\x75 |0 + \xF1\xC8 |0 + \xF1\xCB |0 + \xF1\xC9 |0 + \xF1\xCD |0 + \xF1\xCE |0 + \xF1\xC6 |0 + \xC3\x58 |0 + \xF1\xC7 |0 + \xF1\xC5 |0 + \xF1\xCC |0 + \xF1\xC4 |0 + \xF1\xC3 |0 + \xC3\x57 |0 + \xC3\x55 |0 + \xC3\x54 |0 + \xF1\xCA |0 + \xF3\xCF |0 + \xF3\xD5 |0 + \xC4\x4A |0 + \xF3\xD0 |0 + \xF3\xD3 |0 + \xF3\xD7 |0 + \xC4\x4B |0 + \xF3\xD2 |0 + \xF3\xCA |0 + \xF3\xC9 |0 + \xF3\xD6 |0 + \xF3\xCD |0 + \xF3\xCB |0 + \xF3\xD4 |0 + \xF3\xCC |0 + \xC4\x49 |0 + \xC4\x48 |0 + \xF3\xC7 |0 + \xF3\xC8 |0 + \xF3\xD1 |0 + \xF3\xCE |0 + \xF5\x6C |0 + \xF5\x6F |0 + \xC3\x56 |0 + \xF5\x6D |0 + \xF5\x73 |0 + \xF5\x71 |0 + \xF5\x6B |0 + \xF5\x76 |0 + \xF5\x6A |0 + \xC4\xCF |0 + \xF5\x72 |0 + \xF5\x6E |0 + \xC4\xCE |0 + \xF5\x75 |0 + \xF5\x74 |0 + \xF6\xAB |0 + \xF6\xAA |0 + \xF6\xB1 |0 + \xF6\xAD |0 + \xF6\xB0 |0 + \xC5\x60 |0 + \xF6\xAE |0 + \xF6\xAF |0 + \xF6\xA9 |0 + \xF6\xAC |0 + \xC5\x5F |0 + \xC5\xBF |0 + \xF7\xB4 |0 + \xF7\xAF |0 + \xF7\xB3 |0 + \xF7\xB6 |0 + \xF7\xB2 |0 + \xF7\xAE |0 + \xC5\xC1 |0 + \xF7\xB1 |0 + \xF7\xB5 |0 + \xC5\xC0 |0 + \xF7\xAC |0 + \xF5\x70 |0 + \xF7\xB0 |0 + \xF7\xAD |0 + \xF7\xAA |0 + \xF7\xAB |0 + \xC5\xBE |0 + \xF8\x5A |0 + \xF8\x5C |0 + \xF8\x5F |0 + \xF8\x5B |0 + \xF8\x60 |0 + \xF8\x59 |0 + \xF8\x57 |0 + \xC5\xEB |0 + \xF8\x5D |0 + \xC5\xED |0 + \xC5\xEC |0 + \xF8\x58 |0 + \xF8\x5E |0 + \xF8\xDA |0 + \xC6\x4D |0 + \xF8\xDB |0 + \xF8\xD9 |0 + \xF8\xD6 |0 + \xF8\xD8 |0 + \xF8\xD7 |0 + \xF9\x5A |0 + \xF9\x5C |0 + \xF9\x5B |0 + \xF9\x79 |0 + \xF9\x78 |0 + \xF9\x77 |0 + \xF9\x7A |0 + \xC6\x73 |0 + \xC6\x74 |0 + \xF9\xCA |0 + \xF9\xCE |0 + \xB3\xBE |0 + \xDC\xAF |0 + \xE0\xED |0 + \xB9\xA7 |0 + \xE0\xEB |0 + \xE0\xEC |0 + \xE4\xE2 |0 + \xE4\xE3 |0 + \xBB\xF1 |0 + \xBB\xEF |0 + \xE4\xE4 |0 + \xBB\xF0 |0 + \xE8\xE8 |0 + \xE8\xEB |0 + \xE8\xE5 |0 + \xE8\xEC |0 + \xE8\xE4 |0 + \xE8\xE6 |0 + \xE8\xE7 |0 + \xE8\xEA |0 + \xBE\xA1 |0 + \xE8\xEF |0 + \xE8\xEE |0 + \xBE\x7D |0 + \xE8\xE9 |0 + \xE8\xED |0 + \xBE\x7E |0 + \xEC\xAC |0 + \xC0\x6F |0 + \xEC\xA7 |0 + \xC0\x6B |0 + \xEC\xA4 |0 + \xEC\xAA |0 + \xEC\xAD |0 + \xC0\x70 |0 + \xEC\xA9 |0 + \xEC\xA6 |0 + \xEC\xAE |0 + \xEC\xA5 |0 + \xEC\xAB |0 + \xC0\x6C |0 + \xEC\xA3 |0 + \xC0\x6D |0 + \xC0\x6E |0 + \xEC\xA8 |0 + \xEF\xA9 |0 + \xEF\x7A |0 + \xEF\x7B |0 + \xEF\x7E |0 + \xEF\x7C |0 + \xEF\x76 |0 + \xEF\x79 |0 + \xEF\xA5 |0 + \xEF\x7D |0 + \xC2\x45 |0 + \xEF\xA7 |0 + \xEF\xA4 |0 + \xC2\x46 |0 + \xEF\xA6 |0 + \xEF\x77 |0 + \xEF\xA2 |0 + \xEF\xA3 |0 + \xEF\xA1 |0 + \xF1\xD2 |0 + \xF1\xD4 |0 + \xF1\xD7 |0 + \xF1\xD1 |0 + \xC3\x59 |0 + \xF1\xD9 |0 + \xF1\xD0 |0 + \xF1\xDA |0 + \xF1\xD6 |0 + \xF1\xD8 |0 + \xF1\xDC |0 + \xF1\xD5 |0 + \xF1\xDD |0 + \xF1\xD3 |0 + \xF1\xCF |0 + \xC3\x5A |0 + \xF1\xDB |0 + \xC3\x5B |0 + \xC4\x4D |0 + \xEF\x78 |0 + \xF3\xF1 |0 + \xF3\xE8 |0 + \xC4\x4F |0 + \xF3\xE4 |0 + \xC4\x50 |0 + \xF3\xED |0 + \xF3\xE7 |0 + \xF3\xDD |0 + \xC4\x4E |0 + \xF3\xEA |0 + \xF3\xE5 |0 + \xF3\xE6 |0 + \xF3\xD8 |0 + \xF3\xDF |0 + \xF3\xEE |0 + \xF3\xEB |0 + \xF3\xE3 |0 + \xF3\xEF |0 + \xF3\xDE |0 + \xF3\xD9 |0 + \xF3\xEC |0 + \xF3\xDB |0 + \xF3\xE9 |0 + \xF3\xE0 |0 + \xF3\xF0 |0 + \xF3\xDC |0 + \xC4\x4C |0 + \xF3\xDA |0 + \xF3\xE1 |0 + \xF3\xE2 |0 + \xF5\x7D |0 + \xF5\x7B |0 + \xF5\xA2 |0 + \xF5\xAE |0 + \xF5\xA5 |0 + \xF5\x7C |0 + \xF5\x78 |0 + \xF5\xA7 |0 + \xF5\x7E |0 + \xF5\xA3 |0 + \xF5\x7A |0 + \xF5\xAA |0 + \xF5\x77 |0 + \xF5\xA1 |0 + \xF5\xA6 |0 + \xF5\xA8 |0 + \xF5\xAB |0 + \xF5\x79 |0 + \xF5\xAF |0 + \xF5\xB0 |0 + \xF5\xA9 |0 + \xF5\xAD |0 + \xF5\xA4 |0 + \xF6\xC1 |0 + \xF6\xC4 |0 + \xC5\x61 |0 + \xF6\xC3 |0 + \xF6\xC8 |0 + \xF6\xC6 |0 + \xC5\x62 |0 + \xF6\xBD |0 + \xF6\xB3 |0 + \xF6\xB2 |0 + \xC5\x64 |0 + \xF6\xBF |0 + \xF6\xC0 |0 + \xF6\xBC |0 + \xF6\xB4 |0 + \xF6\xB9 |0 + \xF5\xAC |0 + \xF6\xB5 |0 + \xC5\x63 |0 + \xF6\xBB |0 + \xF6\xBA |0 + \xF6\xB6 |0 + \xF6\xC2 |0 + \xF6\xB7 |0 + \xF7\xBB |0 + \xF6\xC5 |0 + \xF6\xC7 |0 + \xF6\xBE |0 + \xF6\xB8 |0 + \xF7\xBC |0 + \xF7\xBE |0 + \xF7\xB8 |0 + \xC5\xC2 |0 + \xF7\xC5 |0 + \xF7\xC3 |0 + \xC5\xC3 |0 + \xF7\xC2 |0 + \xF7\xC1 |0 + \xF7\xBA |0 + \xF7\xB7 |0 + \xF7\xBD |0 + \xF7\xC6 |0 + \xF7\xB9 |0 + \xF7\xBF |0 + \xF8\x69 |0 + \xF8\x6E |0 + \xF8\x64 |0 + \xF8\x67 |0 + \xC5\xEE |0 + \xF8\x6B |0 + \xF8\x72 |0 + \xF7\xC0 |0 + \xF8\x65 |0 + \xF8\x6F |0 + \xF8\x73 |0 + \xF8\x6A |0 + \xF8\x63 |0 + \xF8\x6D |0 + \xF8\x6C |0 + \xF8\x71 |0 + \xF8\x70 |0 + \xF7\xC4 |0 + \xF8\x68 |0 + \xF8\x62 |0 + \xF8\x66 |0 + \xC6\x4E |0 + \xC6\x4F |0 + \xF8\x61 |0 + \xF8\xE6 |0 + \xF8\xDD |0 + \xF8\xE5 |0 + \xF8\xE2 |0 + \xF8\xE3 |0 + \xF8\xDC |0 + \xF8\xDF |0 + \xF8\xE7 |0 + \xF8\xE1 |0 + \xF8\xE0 |0 + \xF8\xDE |0 + \xF8\xE4 |0 + \xF9\x5D |0 + \xF9\x5E |0 + \xF9\x60 |0 + \xF9\x5F |0 + \xF9\x62 |0 + \xF9\x61 |0 + \xF9\x7C |0 + \xF9\x7B |0 + \xF9\xB7 |0 + \xF9\xB8 |0 + \xF9\xC5 |0 + \xC6\x78 |0 + \xC6\x7C |0 + \xF9\xCF |0 + \xC6\x7D |0 + \xB3\xBF |0 + \xC4\xD0 |0 + \xF6\xC9 |0 + \xC6\x50 |0 + \xC6\x51 |0 + \xB3\xC0 |0 + \xE0\xEE |0 + \xB9\xA8 |0 + \xE8\xF0 |0 + \xEC\xB0 |0 + \xEC\xB1 |0 + \xEC\xAF |0 + \xEF\xAB |0 + \xEF\xAA |0 + \xC2\x47 |0 + \xF1\xDF |0 + \xEF\xAC |0 + \xF1\xDE |0 + \xF3\xF3 |0 + \xC4\x51 |0 + \xC4\x53 |0 + \xF3\xF2 |0 + \xC4\x52 |0 + \xF5\xB1 |0 + \xF5\xB3 |0 + \xF5\xB2 |0 + \xF6\xCA |0 + \xC5\x65 |0 + \xC5\xEF |0 + \xF8\xE8 |0 + \xF9\x63 |0 + \xF9\xD2 |0 + \xB3\xC1 |0 + \xE4\xE5 |0 + \xBE\xA2 |0 + \xEC\xB3 |0 + \xEC\xB2 |0 + \xEF\xAD |0 + \xC4\x54 |0 + \xC4\xD1 |0 + \xF7\xC7 |0 + \xF9\xCB |0 + \xB3\xC2 |0 + \xBB\xF2 |0 + \xBE\xA3 |0 + \xF3\xF4 |0 + \xF8\x74 |0 + \xB6\xC0 |0 + \xEF\xAE |0 + \xC6\x64 |0 + \xB6\xC1 |0 + \xBE\xA4 |0 + \xC2\x48 |0 + \xF8\x75 |0 + \xB6\xC2 |0 + \xE8\xF1 |0 + \xC0\x72 |0 + \xEC\xB4 |0 + \xEC\xB5 |0 + \xC0\x71 |0 + \xEF\xAF |0 + \xC2\x4C |0 + \xC2\x4A |0 + \xC2\x4B |0 + \xC2\x49 |0 + \xF1\xE0 |0 + \xC3\x5C |0 + \xF5\xB5 |0 + \xF5\xB4 |0 + \xF5\xB7 |0 + \xF5\xB6 |0 + \xC4\xD2 |0 + \xF6\xCB |0 + \xF6\xCD |0 + \xF6\xCC |0 + \xC5\x66 |0 + \xF7\xC8 |0 + \xF8\x76 |0 + \xF8\x77 |0 + \xC5\xF0 |0 + \xF9\x64 |0 + \xF9\x7D |0 + \xC6\x75 |0 + \xDC\xB0 |0 + \xEC\xB6 |0 + \xEF\xB0 |0 + \xF3\xF5 |0 + \xE0\xEF |0 + \xEF\xB1 |0 + \xF1\xE2 |0 + \xF1\xE1 |0 + \xF8\x78 |0 + \xC6\x52 |0 + \xF9\x65 |0 + \xF9\x7E |0 + \xB9\xA9 |0 + \xE8\xF2 |0 + \xE8\xF3 |0 + \xEC\xB7 |0 + \xB9\xAA |0 + \xC3\x5D |0 + \xF1\xE3 |0 + \xF6\xCF |0 + \xC5\x67 |0 + \xF6\xD0 |0 + \xF6\xCE |0 + \xF8\x79 |0 + \xF8\xE9 |0 + \xB9\xAB |0 + \xEF\xB4 |0 + \xEF\xB3 |0 + \xEF\xB2 |0 + \xF1\xE4 |0 + \xF1\xE8 |0 + \xF1\xE7 |0 + \xF1\xE6 |0 + \xF1\xE5 |0 + \xC3\x5E |0 + \xF3\xF6 |0 + \xF5\xB9 |0 + \xC4\xD3 |0 + \xF5\xB8 |0 + \xF6\xD1 |0 + \xF7\xCB |0 + \xF7\xCA |0 + \xC5\xC4 |0 + \xF7\xC9 |0 + \xF8\x7C |0 + \xF8\x7B |0 + \xF8\x7A |0 + \xBB\xF3 |0 + \xEC\xB8 |0 + \xC2\x4D |0 + \xF3\xF7 |0 + \xF3\xF8 |0 + \xF7\xCC |0 + \xF8\x7D |0 + \xF8\xEA |0 + \xF9\x66 |0 + \xF9\xB9 |0 + \xF9\xD4 |0 + \xBB\xF4 |0 + \xC2\x4E |0 + \xF1\xE9 |0 + \xF3\xF9 |0 + \xF6\xD2 |0 + \xF8\x7E |0 + \xBE\xA6 |0 + \xEF\xB5 |0 + \xF1\xEA |0 + \xF3\xFA |0 + \xF3\xFB |0 + \xF3\xFC |0 + \xF5\xBE |0 + \xF5\xBA |0 + \xC5\x68 |0 + \xF5\xBD |0 + \xF5\xBC |0 + \xC4\xD4 |0 + \xF5\xBB |0 + \xC4\xD6 |0 + \xC4\xD5 |0 + \xF6\xD4 |0 + \xF6\xD3 |0 + \xC5\x69 |0 + \xC5\x6A |0 + \xC5\xC6 |0 + \xF7\xCD |0 + \xC5\xC5 |0 + \xF8\xA3 |0 + \xF8\xA4 |0 + \xF8\xA2 |0 + \xF8\xA1 |0 + \xC6\x54 |0 + \xF8\xEB |0 + \xF8\xEC |0 + \xF8\xED |0 + \xC6\x53 |0 + \xF9\x67 |0 + \xF9\x6A |0 + \xF9\x69 |0 + \xF9\x68 |0 + \xF9\xD3 |0 + \xC0\x73 |0 + \xC3\x65 |0 + \xF5\xBF |0 + \xF6\xD5 |0 + \xC5\xC7 |0 + \xF7\xCE |0 + \xF9\xD5 |0 + \xC0\x74 |0 + \xEF\xB6 |0 + \xF7\xCF |0 + \xF9\xA1 |0 + \xFA\x40 |0 + \xFA\x41 |0 + \xFA\x42 |0 + \xFA\x43 |0 + \xFA\x44 |0 + \xFA\x45 |0 + \xFA\x46 |0 + \xFA\x47 |0 + \xFA\x48 |0 + \xFA\x49 |0 + \xFA\x4A |0 + \xFA\x4B |0 + \xFA\x4C |0 + \xFA\x4D |0 + \xFA\x4E |0 + \xFA\x4F |0 + \xFA\x50 |0 + \xFA\x51 |0 + \xFA\x52 |0 + \xFA\x53 |0 + \xFA\x54 |0 + \xFA\x55 |0 + \xFA\x56 |0 + \xFA\x57 |0 + \xFA\x58 |0 + \xFA\x59 |0 + \xFA\x5A |0 + \xFA\x5B |0 + \xFA\x5C |0 + \xFA\x5D |0 + \xFA\x5E |0 + \xFA\x5F |0 + \xFA\x60 |0 + \xFA\x61 |0 + \xFA\x62 |0 + \xFA\x63 |0 + \xFA\x64 |0 + \xFA\x65 |0 + \xFA\x66 |0 + \xFA\x67 |0 + \xFA\x68 |0 + \xFA\x69 |0 + \xFA\x6A |0 + \xFA\x6B |0 + \xFA\x6C |0 + \xFA\x6D |0 + \xFA\x6E |0 + \xFA\x6F |0 + \xFA\x70 |0 + \xFA\x71 |0 + \xFA\x72 |0 + \xFA\x73 |0 + \xFA\x74 |0 + \xFA\x75 |0 + \xFA\x76 |0 + \xFA\x77 |0 + \xFA\x78 |0 + \xFA\x79 |0 + \xFA\x7A |0 + \xFA\x7B |0 + \xFA\x7C |0 + \xFA\x7D |0 + \xFA\x7E |0 + \xFA\xA1 |0 + \xFA\xA2 |0 + \xFA\xA3 |0 + \xFA\xA4 |0 + \xFA\xA5 |0 + \xFA\xA6 |0 + \xFA\xA7 |0 + \xFA\xA8 |0 + \xFA\xA9 |0 + \xFA\xAA |0 + \xFA\xAB |0 + \xFA\xAC |0 + \xFA\xAD |0 + \xFA\xAE |0 + \xFA\xAF |0 + \xFA\xB0 |0 + \xFA\xB1 |0 + \xFA\xB2 |0 + \xFA\xB3 |0 + \xFA\xB4 |0 + \xFA\xB5 |0 + \xFA\xB6 |0 + \xFA\xB7 |0 + \xFA\xB8 |0 + \xFA\xB9 |0 + \xFA\xBA |0 + \xFA\xBB |0 + \xFA\xBC |0 + \xFA\xBD |0 + \xFA\xBE |0 + \xFA\xBF |0 + \xFA\xC0 |0 + \xFA\xC1 |0 + \xFA\xC2 |0 + \xFA\xC3 |0 + \xFA\xC4 |0 + \xFA\xC5 |0 + \xFA\xC6 |0 + \xFA\xC7 |0 + \xFA\xC8 |0 + \xFA\xC9 |0 + \xFA\xCA |0 + \xFA\xCB |0 + \xFA\xCC |0 + \xFA\xCD |0 + \xFA\xCE |0 + \xFA\xCF |0 + \xFA\xD0 |0 + \xFA\xD1 |0 + \xFA\xD2 |0 + \xFA\xD3 |0 + \xFA\xD4 |0 + \xFA\xD5 |0 + \xFA\xD6 |0 + \xFA\xD7 |0 + \xFA\xD8 |0 + \xFA\xD9 |0 + \xFA\xDA |0 + \xFA\xDB |0 + \xFA\xDC |0 + \xFA\xDD |0 + \xFA\xDE |0 + \xFA\xDF |0 + \xFA\xE0 |0 + \xFA\xE1 |0 + \xFA\xE2 |0 + \xFA\xE3 |0 + \xFA\xE4 |0 + \xFA\xE5 |0 + \xFA\xE6 |0 + \xFA\xE7 |0 + \xFA\xE8 |0 + \xFA\xE9 |0 + \xFA\xEA |0 + \xFA\xEB |0 + \xFA\xEC |0 + \xFA\xED |0 + \xFA\xEE |0 + \xFA\xEF |0 + \xFA\xF0 |0 + \xFA\xF1 |0 + \xFA\xF2 |0 + \xFA\xF3 |0 + \xFA\xF4 |0 + \xFA\xF5 |0 + \xFA\xF6 |0 + \xFA\xF7 |0 + \xFA\xF8 |0 + \xFA\xF9 |0 + \xFA\xFA |0 + \xFA\xFB |0 + \xFA\xFC |0 + \xFA\xFD |0 + \xFA\xFE |0 + \xFB\x40 |0 + \xFB\x41 |0 + \xFB\x42 |0 + \xFB\x43 |0 + \xFB\x44 |0 + \xFB\x45 |0 + \xFB\x46 |0 + \xFB\x47 |0 + \xFB\x48 |0 + \xFB\x49 |0 + \xFB\x4A |0 + \xFB\x4B |0 + \xFB\x4C |0 + \xFB\x4D |0 + \xFB\x4E |0 + \xFB\x4F |0 + \xFB\x50 |0 + \xFB\x51 |0 + \xFB\x52 |0 + \xFB\x53 |0 + \xFB\x54 |0 + \xFB\x55 |0 + \xFB\x56 |0 + \xFB\x57 |0 + \xFB\x58 |0 + \xFB\x59 |0 + \xFB\x5A |0 + \xFB\x5B |0 + \xFB\x5C |0 + \xFB\x5D |0 + \xFB\x5E |0 + \xFB\x5F |0 + \xFB\x60 |0 + \xFB\x61 |0 + \xFB\x62 |0 + \xFB\x63 |0 + \xFB\x64 |0 + \xFB\x65 |0 + \xFB\x66 |0 + \xFB\x67 |0 + \xFB\x68 |0 + \xFB\x69 |0 + \xFB\x6A |0 + \xFB\x6B |0 + \xFB\x6C |0 + \xFB\x6D |0 + \xFB\x6E |0 + \xFB\x6F |0 + \xFB\x70 |0 + \xFB\x71 |0 + \xFB\x72 |0 + \xFB\x73 |0 + \xFB\x74 |0 + \xFB\x75 |0 + \xFB\x76 |0 + \xFB\x77 |0 + \xFB\x78 |0 + \xFB\x79 |0 + \xFB\x7A |0 + \xFB\x7B |0 + \xFB\x7C |0 + \xFB\x7D |0 + \xFB\x7E |0 + \xFB\xA1 |0 + \xFB\xA2 |0 + \xFB\xA3 |0 + \xFB\xA4 |0 + \xFB\xA5 |0 + \xFB\xA6 |0 + \xFB\xA7 |0 + \xFB\xA8 |0 + \xFB\xA9 |0 + \xFB\xAA |0 + \xFB\xAB |0 + \xFB\xAC |0 + \xFB\xAD |0 + \xFB\xAE |0 + \xFB\xAF |0 + \xFB\xB0 |0 + \xFB\xB1 |0 + \xFB\xB2 |0 + \xFB\xB3 |0 + \xFB\xB4 |0 + \xFB\xB5 |0 + \xFB\xB6 |0 + \xFB\xB7 |0 + \xFB\xB8 |0 + \xFB\xB9 |0 + \xFB\xBA |0 + \xFB\xBB |0 + \xFB\xBC |0 + \xFB\xBD |0 + \xFB\xBE |0 + \xFB\xBF |0 + \xFB\xC0 |0 + \xFB\xC1 |0 + \xFB\xC2 |0 + \xFB\xC3 |0 + \xFB\xC4 |0 + \xFB\xC5 |0 + \xFB\xC6 |0 + \xFB\xC7 |0 + \xFB\xC8 |0 + \xFB\xC9 |0 + \xFB\xCA |0 + \xFB\xCB |0 + \xFB\xCC |0 + \xFB\xCD |0 + \xFB\xCE |0 + \xFB\xCF |0 + \xFB\xD0 |0 + \xFB\xD1 |0 + \xFB\xD2 |0 + \xFB\xD3 |0 + \xFB\xD4 |0 + \xFB\xD5 |0 + \xFB\xD6 |0 + \xFB\xD7 |0 + \xFB\xD8 |0 + \xFB\xD9 |0 + \xFB\xDA |0 + \xFB\xDB |0 + \xFB\xDC |0 + \xFB\xDD |0 + \xFB\xDE |0 + \xFB\xDF |0 + \xFB\xE0 |0 + \xFB\xE1 |0 + \xFB\xE2 |0 + \xFB\xE3 |0 + \xFB\xE4 |0 + \xFB\xE5 |0 + \xFB\xE6 |0 + \xFB\xE7 |0 + \xFB\xE8 |0 + \xFB\xE9 |0 + \xFB\xEA |0 + \xFB\xEB |0 + \xFB\xEC |0 + \xFB\xED |0 + \xFB\xEE |0 + \xFB\xEF |0 + \xFB\xF0 |0 + \xFB\xF1 |0 + \xFB\xF2 |0 + \xFB\xF3 |0 + \xFB\xF4 |0 + \xFB\xF5 |0 + \xFB\xF6 |0 + \xFB\xF7 |0 + \xFB\xF8 |0 + \xFB\xF9 |0 + \xFB\xFA |0 + \xFB\xFB |0 + \xFB\xFC |0 + \xFB\xFD |0 + \xFB\xFE |0 + \xFC\x40 |0 + \xFC\x41 |0 + \xFC\x42 |0 + \xFC\x43 |0 + \xFC\x44 |0 + \xFC\x45 |0 + \xFC\x46 |0 + \xFC\x47 |0 + \xFC\x48 |0 + \xFC\x49 |0 + \xFC\x4A |0 + \xFC\x4B |0 + \xFC\x4C |0 + \xFC\x4D |0 + \xFC\x4E |0 + \xFC\x4F |0 + \xFC\x50 |0 + \xFC\x51 |0 + \xFC\x52 |0 + \xFC\x53 |0 + \xFC\x54 |0 + \xFC\x55 |0 + \xFC\x56 |0 + \xFC\x57 |0 + \xFC\x58 |0 + \xFC\x59 |0 + \xFC\x5A |0 + \xFC\x5B |0 + \xFC\x5C |0 + \xFC\x5D |0 + \xFC\x5E |0 + \xFC\x5F |0 + \xFC\x60 |0 + \xFC\x61 |0 + \xFC\x62 |0 + \xFC\x63 |0 + \xFC\x64 |0 + \xFC\x65 |0 + \xFC\x66 |0 + \xFC\x67 |0 + \xFC\x68 |0 + \xFC\x69 |0 + \xFC\x6A |0 + \xFC\x6B |0 + \xFC\x6C |0 + \xFC\x6D |0 + \xFC\x6E |0 + \xFC\x6F |0 + \xFC\x70 |0 + \xFC\x71 |0 + \xFC\x72 |0 + \xFC\x73 |0 + \xFC\x74 |0 + \xFC\x75 |0 + \xFC\x76 |0 + \xFC\x77 |0 + \xFC\x78 |0 + \xFC\x79 |0 + \xFC\x7A |0 + \xFC\x7B |0 + \xFC\x7C |0 + \xFC\x7D |0 + \xFC\x7E |0 + \xFC\xA1 |0 + \xFC\xA2 |0 + \xFC\xA3 |0 + \xFC\xA4 |0 + \xFC\xA5 |0 + \xFC\xA6 |0 + \xFC\xA7 |0 + \xFC\xA8 |0 + \xFC\xA9 |0 + \xFC\xAA |0 + \xFC\xAB |0 + \xFC\xAC |0 + \xFC\xAD |0 + \xFC\xAE |0 + \xFC\xAF |0 + \xFC\xB0 |0 + \xFC\xB1 |0 + \xFC\xB2 |0 + \xFC\xB3 |0 + \xFC\xB4 |0 + \xFC\xB5 |0 + \xFC\xB6 |0 + \xFC\xB7 |0 + \xFC\xB8 |0 + \xFC\xB9 |0 + \xFC\xBA |0 + \xFC\xBB |0 + \xFC\xBC |0 + \xFC\xBD |0 + \xFC\xBE |0 + \xFC\xBF |0 + \xFC\xC0 |0 + \xFC\xC1 |0 + \xFC\xC2 |0 + \xFC\xC3 |0 + \xFC\xC4 |0 + \xFC\xC5 |0 + \xFC\xC6 |0 + \xFC\xC7 |0 + \xFC\xC8 |0 + \xFC\xC9 |0 + \xFC\xCA |0 + \xFC\xCB |0 + \xFC\xCC |0 + \xFC\xCD |0 + \xFC\xCE |0 + \xFC\xCF |0 + \xFC\xD0 |0 + \xFC\xD1 |0 + \xFC\xD2 |0 + \xFC\xD3 |0 + \xFC\xD4 |0 + \xFC\xD5 |0 + \xFC\xD6 |0 + \xFC\xD7 |0 + \xFC\xD8 |0 + \xFC\xD9 |0 + \xFC\xDA |0 + \xFC\xDB |0 + \xFC\xDC |0 + \xFC\xDD |0 + \xFC\xDE |0 + \xFC\xDF |0 + \xFC\xE0 |0 + \xFC\xE1 |0 + \xFC\xE2 |0 + \xFC\xE3 |0 + \xFC\xE4 |0 + \xFC\xE5 |0 + \xFC\xE6 |0 + \xFC\xE7 |0 + \xFC\xE8 |0 + \xFC\xE9 |0 + \xFC\xEA |0 + \xFC\xEB |0 + \xFC\xEC |0 + \xFC\xED |0 + \xFC\xEE |0 + \xFC\xEF |0 + \xFC\xF0 |0 + \xFC\xF1 |0 + \xFC\xF2 |0 + \xFC\xF3 |0 + \xFC\xF4 |0 + \xFC\xF5 |0 + \xFC\xF6 |0 + \xFC\xF7 |0 + \xFC\xF8 |0 + \xFC\xF9 |0 + \xFC\xFA |0 + \xFC\xFB |0 + \xFC\xFC |0 + \xFC\xFD |0 + \xFC\xFE |0 + \xFD\x40 |0 + \xFD\x41 |0 + \xFD\x42 |0 + \xFD\x43 |0 + \xFD\x44 |0 + \xFD\x45 |0 + \xFD\x46 |0 + \xFD\x47 |0 + \xFD\x48 |0 + \xFD\x49 |0 + \xFD\x4A |0 + \xFD\x4B |0 + \xFD\x4C |0 + \xFD\x4D |0 + \xFD\x4E |0 + \xFD\x4F |0 + \xFD\x50 |0 + \xFD\x51 |0 + \xFD\x52 |0 + \xFD\x53 |0 + \xFD\x54 |0 + \xFD\x55 |0 + \xFD\x56 |0 + \xFD\x57 |0 + \xFD\x58 |0 + \xFD\x59 |0 + \xFD\x5A |0 + \xFD\x5B |0 + \xFD\x5C |0 + \xFD\x5D |0 + \xFD\x5E |0 + \xFD\x5F |0 + \xFD\x60 |0 + \xFD\x61 |0 + \xFD\x62 |0 + \xFD\x63 |0 + \xFD\x64 |0 + \xFD\x65 |0 + \xFD\x66 |0 + \xFD\x67 |0 + \xFD\x68 |0 + \xFD\x69 |0 + \xFD\x6A |0 + \xFD\x6B |0 + \xFD\x6C |0 + \xFD\x6D |0 + \xFD\x6E |0 + \xFD\x6F |0 + \xFD\x70 |0 + \xFD\x71 |0 + \xFD\x72 |0 + \xFD\x73 |0 + \xFD\x74 |0 + \xFD\x75 |0 + \xFD\x76 |0 + \xFD\x77 |0 + \xFD\x78 |0 + \xFD\x79 |0 + \xFD\x7A |0 + \xFD\x7B |0 + \xFD\x7C |0 + \xFD\x7D |0 + \xFD\x7E |0 + \xFD\xA1 |0 + \xFD\xA2 |0 + \xFD\xA3 |0 + \xFD\xA4 |0 + \xFD\xA5 |0 + \xFD\xA6 |0 + \xFD\xA7 |0 + \xFD\xA8 |0 + \xFD\xA9 |0 + \xFD\xAA |0 + \xFD\xAB |0 + \xFD\xAC |0 + \xFD\xAD |0 + \xFD\xAE |0 + \xFD\xAF |0 + \xFD\xB0 |0 + \xFD\xB1 |0 + \xFD\xB2 |0 + \xFD\xB3 |0 + \xFD\xB4 |0 + \xFD\xB5 |0 + \xFD\xB6 |0 + \xFD\xB7 |0 + \xFD\xB8 |0 + \xFD\xB9 |0 + \xFD\xBA |0 + \xFD\xBB |0 + \xFD\xBC |0 + \xFD\xBD |0 + \xFD\xBE |0 + \xFD\xBF |0 + \xFD\xC0 |0 + \xFD\xC1 |0 + \xFD\xC2 |0 + \xFD\xC3 |0 + \xFD\xC4 |0 + \xFD\xC5 |0 + \xFD\xC6 |0 + \xFD\xC7 |0 + \xFD\xC8 |0 + \xFD\xC9 |0 + \xFD\xCA |0 + \xFD\xCB |0 + \xFD\xCC |0 + \xFD\xCD |0 + \xFD\xCE |0 + \xFD\xCF |0 + \xFD\xD0 |0 + \xFD\xD1 |0 + \xFD\xD2 |0 + \xFD\xD3 |0 + \xFD\xD4 |0 + \xFD\xD5 |0 + \xFD\xD6 |0 + \xFD\xD7 |0 + \xFD\xD8 |0 + \xFD\xD9 |0 + \xFD\xDA |0 + \xFD\xDB |0 + \xFD\xDC |0 + \xFD\xDD |0 + \xFD\xDE |0 + \xFD\xDF |0 + \xFD\xE0 |0 + \xFD\xE1 |0 + \xFD\xE2 |0 + \xFD\xE3 |0 + \xFD\xE4 |0 + \xFD\xE5 |0 + \xFD\xE6 |0 + \xFD\xE7 |0 + \xFD\xE8 |0 + \xFD\xE9 |0 + \xFD\xEA |0 + \xFD\xEB |0 + \xFD\xEC |0 + \xFD\xED |0 + \xFD\xEE |0 + \xFD\xEF |0 + \xFD\xF0 |0 + \xFD\xF1 |0 + \xFD\xF2 |0 + \xFD\xF3 |0 + \xFD\xF4 |0 + \xFD\xF5 |0 + \xFD\xF6 |0 + \xFD\xF7 |0 + \xFD\xF8 |0 + \xFD\xF9 |0 + \xFD\xFA |0 + \xFD\xFB |0 + \xFD\xFC |0 + \xFD\xFD |0 + \xFD\xFE |0 + \xFE\x40 |0 + \xFE\x41 |0 + \xFE\x42 |0 + \xFE\x43 |0 + \xFE\x44 |0 + \xFE\x45 |0 + \xFE\x46 |0 + \xFE\x47 |0 + \xFE\x48 |0 + \xFE\x49 |0 + \xFE\x4A |0 + \xFE\x4B |0 + \xFE\x4C |0 + \xFE\x4D |0 + \xFE\x4E |0 + \xFE\x4F |0 + \xFE\x50 |0 + \xFE\x51 |0 + \xFE\x52 |0 + \xFE\x53 |0 + \xFE\x54 |0 + \xFE\x55 |0 + \xFE\x56 |0 + \xFE\x57 |0 + \xFE\x58 |0 + \xFE\x59 |0 + \xFE\x5A |0 + \xFE\x5B |0 + \xFE\x5C |0 + \xFE\x5D |0 + \xFE\x5E |0 + \xFE\x5F |0 + \xFE\x60 |0 + \xFE\x61 |0 + \xFE\x62 |0 + \xFE\x63 |0 + \xFE\x64 |0 + \xFE\x65 |0 + \xFE\x66 |0 + \xFE\x67 |0 + \xFE\x68 |0 + \xFE\x69 |0 + \xFE\x6A |0 + \xFE\x6B |0 + \xFE\x6C |0 + \xFE\x6D |0 + \xFE\x6E |0 + \xFE\x6F |0 + \xFE\x70 |0 + \xFE\x71 |0 + \xFE\x72 |0 + \xFE\x73 |0 + \xFE\x74 |0 + \xFE\x75 |0 + \xFE\x76 |0 + \xFE\x77 |0 + \xFE\x78 |0 + \xFE\x79 |0 + \xFE\x7A |0 + \xFE\x7B |0 + \xFE\x7C |0 + \xFE\x7D |0 + \xFE\x7E |0 + \xFE\xA1 |0 + \xFE\xA2 |0 + \xFE\xA3 |0 + \xFE\xA4 |0 + \xFE\xA5 |0 + \xFE\xA6 |0 + \xFE\xA7 |0 + \xFE\xA8 |0 + \xFE\xA9 |0 + \xFE\xAA |0 + \xFE\xAB |0 + \xFE\xAC |0 + \xFE\xAD |0 + \xFE\xAE |0 + \xFE\xAF |0 + \xFE\xB0 |0 + \xFE\xB1 |0 + \xFE\xB2 |0 + \xFE\xB3 |0 + \xFE\xB4 |0 + \xFE\xB5 |0 + \xFE\xB6 |0 + \xFE\xB7 |0 + \xFE\xB8 |0 + \xFE\xB9 |0 + \xFE\xBA |0 + \xFE\xBB |0 + \xFE\xBC |0 + \xFE\xBD |0 + \xFE\xBE |0 + \xFE\xBF |0 + \xFE\xC0 |0 + \xFE\xC1 |0 + \xFE\xC2 |0 + \xFE\xC3 |0 + \xFE\xC4 |0 + \xFE\xC5 |0 + \xFE\xC6 |0 + \xFE\xC7 |0 + \xFE\xC8 |0 + \xFE\xC9 |0 + \xFE\xCA |0 + \xFE\xCB |0 + \xFE\xCC |0 + \xFE\xCD |0 + \xFE\xCE |0 + \xFE\xCF |0 + \xFE\xD0 |0 + \xFE\xD1 |0 + \xFE\xD2 |0 + \xFE\xD3 |0 + \xFE\xD4 |0 + \xFE\xD5 |0 + \xFE\xD6 |0 + \xFE\xD7 |0 + \xFE\xD8 |0 + \xFE\xD9 |0 + \xFE\xDA |0 + \xFE\xDB |0 + \xFE\xDC |0 + \xFE\xDD |0 + \xFE\xDE |0 + \xFE\xDF |0 + \xFE\xE0 |0 + \xFE\xE1 |0 + \xFE\xE2 |0 + \xFE\xE3 |0 + \xFE\xE4 |0 + \xFE\xE5 |0 + \xFE\xE6 |0 + \xFE\xE7 |0 + \xFE\xE8 |0 + \xFE\xE9 |0 + \xFE\xEA |0 + \xFE\xEB |0 + \xFE\xEC |0 + \xFE\xED |0 + \xFE\xEE |0 + \xFE\xEF |0 + \xFE\xF0 |0 + \xFE\xF1 |0 + \xFE\xF2 |0 + \xFE\xF3 |0 + \xFE\xF4 |0 + \xFE\xF5 |0 + \xFE\xF6 |0 + \xFE\xF7 |0 + \xFE\xF8 |0 + \xFE\xF9 |0 + \xFE\xFA |0 + \xFE\xFB |0 + \xFE\xFC |0 + \xFE\xFD |0 + \xFE\xFE |0 + \x8E\x40 |0 + \x8E\x41 |0 + \x8E\x42 |0 + \x8E\x43 |0 + \x8E\x44 |0 + \x8E\x45 |0 + \x8E\x46 |0 + \x8E\x47 |0 + \x8E\x48 |0 + \x8E\x49 |0 + \x8E\x4A |0 + \x8E\x4B |0 + \x8E\x4C |0 + \x8E\x4D |0 + \x8E\x4E |0 + \x8E\x4F |0 + \x8E\x50 |0 + \x8E\x51 |0 + \x8E\x52 |0 + \x8E\x53 |0 + \x8E\x54 |0 + \x8E\x55 |0 + \x8E\x56 |0 + \x8E\x57 |0 + \x8E\x58 |0 + \x8E\x59 |0 + \x8E\x5A |0 + \x8E\x5B |0 + \x8E\x5C |0 + \x8E\x5D |0 + \x8E\x5E |0 + \x8E\x5F |0 + \x8E\x60 |0 + \x8E\x61 |0 + \x8E\x62 |0 + \x8E\x63 |0 + \x8E\x64 |0 + \x8E\x65 |0 + \x8E\x66 |0 + \x8E\x67 |0 + \x8E\x68 |0 + \x8E\x69 |0 + \x8E\x6A |0 + \x8E\x6B |0 + \x8E\x6C |0 + \x8E\x6D |0 + \x8E\x6E |0 + \x8E\x6F |0 + \x8E\x70 |0 + \x8E\x71 |0 + \x8E\x72 |0 + \x8E\x73 |0 + \x8E\x74 |0 + \x8E\x75 |0 + \x8E\x76 |0 + \x8E\x77 |0 + \x8E\x78 |0 + \x8E\x79 |0 + \x8E\x7A |0 + \x8E\x7B |0 + \x8E\x7C |0 + \x8E\x7D |0 + \x8E\x7E |0 + \x8E\xA1 |0 + \x8E\xA2 |0 + \x8E\xA3 |0 + \x8E\xA4 |0 + \x8E\xA5 |0 + \x8E\xA6 |0 + \x8E\xA7 |0 + \x8E\xA8 |0 + \x8E\xA9 |0 + \x8E\xAA |0 + \x8E\xAB |0 + \x8E\xAC |0 + \x8E\xAD |0 + \x8E\xAE |0 + \x8E\xAF |0 + \x8E\xB0 |0 + \x8E\xB1 |0 + \x8E\xB2 |0 + \x8E\xB3 |0 + \x8E\xB4 |0 + \x8E\xB5 |0 + \x8E\xB6 |0 + \x8E\xB7 |0 + \x8E\xB8 |0 + \x8E\xB9 |0 + \x8E\xBA |0 + \x8E\xBB |0 + \x8E\xBC |0 + \x8E\xBD |0 + \x8E\xBE |0 + \x8E\xBF |0 + \x8E\xC0 |0 + \x8E\xC1 |0 + \x8E\xC2 |0 + \x8E\xC3 |0 + \x8E\xC4 |0 + \x8E\xC5 |0 + \x8E\xC6 |0 + \x8E\xC7 |0 + \x8E\xC8 |0 + \x8E\xC9 |0 + \x8E\xCA |0 + \x8E\xCB |0 + \x8E\xCC |0 + \x8E\xCD |0 + \x8E\xCE |0 + \x8E\xCF |0 + \x8E\xD0 |0 + \x8E\xD1 |0 + \x8E\xD2 |0 + \x8E\xD3 |0 + \x8E\xD4 |0 + \x8E\xD5 |0 + \x8E\xD6 |0 + \x8E\xD7 |0 + \x8E\xD8 |0 + \x8E\xD9 |0 + \x8E\xDA |0 + \x8E\xDB |0 + \x8E\xDC |0 + \x8E\xDD |0 + \x8E\xDE |0 + \x8E\xDF |0 + \x8E\xE0 |0 + \x8E\xE1 |0 + \x8E\xE2 |0 + \x8E\xE3 |0 + \x8E\xE4 |0 + \x8E\xE5 |0 + \x8E\xE6 |0 + \x8E\xE7 |0 + \x8E\xE8 |0 + \x8E\xE9 |0 + \x8E\xEA |0 + \x8E\xEB |0 + \x8E\xEC |0 + \x8E\xED |0 + \x8E\xEE |0 + \x8E\xEF |0 + \x8E\xF0 |0 + \x8E\xF1 |0 + \x8E\xF2 |0 + \x8E\xF3 |0 + \x8E\xF4 |0 + \x8E\xF5 |0 + \x8E\xF6 |0 + \x8E\xF7 |0 + \x8E\xF8 |0 + \x8E\xF9 |0 + \x8E\xFA |0 + \x8E\xFB |0 + \x8E\xFC |0 + \x8E\xFD |0 + \x8E\xFE |0 + \x8F\x40 |0 + \x8F\x41 |0 + \x8F\x42 |0 + \x8F\x43 |0 + \x8F\x44 |0 + \x8F\x45 |0 + \x8F\x46 |0 + \x8F\x47 |0 + \x8F\x48 |0 + \x8F\x49 |0 + \x8F\x4A |0 + \x8F\x4B |0 + \x8F\x4C |0 + \x8F\x4D |0 + \x8F\x4E |0 + \x8F\x4F |0 + \x8F\x50 |0 + \x8F\x51 |0 + \x8F\x52 |0 + \x8F\x53 |0 + \x8F\x54 |0 + \x8F\x55 |0 + \x8F\x56 |0 + \x8F\x57 |0 + \x8F\x58 |0 + \x8F\x59 |0 + \x8F\x5A |0 + \x8F\x5B |0 + \x8F\x5C |0 + \x8F\x5D |0 + \x8F\x5E |0 + \x8F\x5F |0 + \x8F\x60 |0 + \x8F\x61 |0 + \x8F\x62 |0 + \x8F\x63 |0 + \x8F\x64 |0 + \x8F\x65 |0 + \x8F\x66 |0 + \x8F\x67 |0 + \x8F\x68 |0 + \x8F\x69 |0 + \x8F\x6A |0 + \x8F\x6B |0 + \x8F\x6C |0 + \x8F\x6D |0 + \x8F\x6E |0 + \x8F\x6F |0 + \x8F\x70 |0 + \x8F\x71 |0 + \x8F\x72 |0 + \x8F\x73 |0 + \x8F\x74 |0 + \x8F\x75 |0 + \x8F\x76 |0 + \x8F\x77 |0 + \x8F\x78 |0 + \x8F\x79 |0 + \x8F\x7A |0 + \x8F\x7B |0 + \x8F\x7C |0 + \x8F\x7D |0 + \x8F\x7E |0 + \x8F\xA1 |0 + \x8F\xA2 |0 + \x8F\xA3 |0 + \x8F\xA4 |0 + \x8F\xA5 |0 + \x8F\xA6 |0 + \x8F\xA7 |0 + \x8F\xA8 |0 + \x8F\xA9 |0 + \x8F\xAA |0 + \x8F\xAB |0 + \x8F\xAC |0 + \x8F\xAD |0 + \x8F\xAE |0 + \x8F\xAF |0 + \x8F\xB0 |0 + \x8F\xB1 |0 + \x8F\xB2 |0 + \x8F\xB3 |0 + \x8F\xB4 |0 + \x8F\xB5 |0 + \x8F\xB6 |0 + \x8F\xB7 |0 + \x8F\xB8 |0 + \x8F\xB9 |0 + \x8F\xBA |0 + \x8F\xBB |0 + \x8F\xBC |0 + \x8F\xBD |0 + \x8F\xBE |0 + \x8F\xBF |0 + \x8F\xC0 |0 + \x8F\xC1 |0 + \x8F\xC2 |0 + \x8F\xC3 |0 + \x8F\xC4 |0 + \x8F\xC5 |0 + \x8F\xC6 |0 + \x8F\xC7 |0 + \x8F\xC8 |0 + \x8F\xC9 |0 + \x8F\xCA |0 + \x8F\xCB |0 + \x8F\xCC |0 + \x8F\xCD |0 + \x8F\xCE |0 + \x8F\xCF |0 + \x8F\xD0 |0 + \x8F\xD1 |0 + \x8F\xD2 |0 + \x8F\xD3 |0 + \x8F\xD4 |0 + \x8F\xD5 |0 + \x8F\xD6 |0 + \x8F\xD7 |0 + \x8F\xD8 |0 + \x8F\xD9 |0 + \x8F\xDA |0 + \x8F\xDB |0 + \x8F\xDC |0 + \x8F\xDD |0 + \x8F\xDE |0 + \x8F\xDF |0 + \x8F\xE0 |0 + \x8F\xE1 |0 + \x8F\xE2 |0 + \x8F\xE3 |0 + \x8F\xE4 |0 + \x8F\xE5 |0 + \x8F\xE6 |0 + \x8F\xE7 |0 + \x8F\xE8 |0 + \x8F\xE9 |0 + \x8F\xEA |0 + \x8F\xEB |0 + \x8F\xEC |0 + \x8F\xED |0 + \x8F\xEE |0 + \x8F\xEF |0 + \x8F\xF0 |0 + \x8F\xF1 |0 + \x8F\xF2 |0 + \x8F\xF3 |0 + \x8F\xF4 |0 + \x8F\xF5 |0 + \x8F\xF6 |0 + \x8F\xF7 |0 + \x8F\xF8 |0 + \x8F\xF9 |0 + \x8F\xFA |0 + \x8F\xFB |0 + \x8F\xFC |0 + \x8F\xFD |0 + \x8F\xFE |0 + \x90\x40 |0 + \x90\x41 |0 + \x90\x42 |0 + \x90\x43 |0 + \x90\x44 |0 + \x90\x45 |0 + \x90\x46 |0 + \x90\x47 |0 + \x90\x48 |0 + \x90\x49 |0 + \x90\x4A |0 + \x90\x4B |0 + \x90\x4C |0 + \x90\x4D |0 + \x90\x4E |0 + \x90\x4F |0 + \x90\x50 |0 + \x90\x51 |0 + \x90\x52 |0 + \x90\x53 |0 + \x90\x54 |0 + \x90\x55 |0 + \x90\x56 |0 + \x90\x57 |0 + \x90\x58 |0 + \x90\x59 |0 + \x90\x5A |0 + \x90\x5B |0 + \x90\x5C |0 + \x90\x5D |0 + \x90\x5E |0 + \x90\x5F |0 + \x90\x60 |0 + \x90\x61 |0 + \x90\x62 |0 + \x90\x63 |0 + \x90\x64 |0 + \x90\x65 |0 + \x90\x66 |0 + \x90\x67 |0 + \x90\x68 |0 + \x90\x69 |0 + \x90\x6A |0 + \x90\x6B |0 + \x90\x6C |0 + \x90\x6D |0 + \x90\x6E |0 + \x90\x6F |0 + \x90\x70 |0 + \x90\x71 |0 + \x90\x72 |0 + \x90\x73 |0 + \x90\x74 |0 + \x90\x75 |0 + \x90\x76 |0 + \x90\x77 |0 + \x90\x78 |0 + \x90\x79 |0 + \x90\x7A |0 + \x90\x7B |0 + \x90\x7C |0 + \x90\x7D |0 + \x90\x7E |0 + \x90\xA1 |0 + \x90\xA2 |0 + \x90\xA3 |0 + \x90\xA4 |0 + \x90\xA5 |0 + \x90\xA6 |0 + \x90\xA7 |0 + \x90\xA8 |0 + \x90\xA9 |0 + \x90\xAA |0 + \x90\xAB |0 + \x90\xAC |0 + \x90\xAD |0 + \x90\xAE |0 + \x90\xAF |0 + \x90\xB0 |0 + \x90\xB1 |0 + \x90\xB2 |0 + \x90\xB3 |0 + \x90\xB4 |0 + \x90\xB5 |0 + \x90\xB6 |0 + \x90\xB7 |0 + \x90\xB8 |0 + \x90\xB9 |0 + \x90\xBA |0 + \x90\xBB |0 + \x90\xBC |0 + \x90\xBD |0 + \x90\xBE |0 + \x90\xBF |0 + \x90\xC0 |0 + \x90\xC1 |0 + \x90\xC2 |0 + \x90\xC3 |0 + \x90\xC4 |0 + \x90\xC5 |0 + \x90\xC6 |0 + \x90\xC7 |0 + \x90\xC8 |0 + \x90\xC9 |0 + \x90\xCA |0 + \x90\xCB |0 + \x90\xCC |0 + \x90\xCD |0 + \x90\xCE |0 + \x90\xCF |0 + \x90\xD0 |0 + \x90\xD1 |0 + \x90\xD2 |0 + \x90\xD3 |0 + \x90\xD4 |0 + \x90\xD5 |0 + \x90\xD6 |0 + \x90\xD7 |0 + \x90\xD8 |0 + \x90\xD9 |0 + \x90\xDA |0 + \x90\xDB |0 + \x90\xDC |0 + \x90\xDD |0 + \x90\xDE |0 + \x90\xDF |0 + \x90\xE0 |0 + \x90\xE1 |0 + \x90\xE2 |0 + \x90\xE3 |0 + \x90\xE4 |0 + \x90\xE5 |0 + \x90\xE6 |0 + \x90\xE7 |0 + \x90\xE8 |0 + \x90\xE9 |0 + \x90\xEA |0 + \x90\xEB |0 + \x90\xEC |0 + \x90\xED |0 + \x90\xEE |0 + \x90\xEF |0 + \x90\xF0 |0 + \x90\xF1 |0 + \x90\xF2 |0 + \x90\xF3 |0 + \x90\xF4 |0 + \x90\xF5 |0 + \x90\xF6 |0 + \x90\xF7 |0 + \x90\xF8 |0 + \x90\xF9 |0 + \x90\xFA |0 + \x90\xFB |0 + \x90\xFC |0 + \x90\xFD |0 + \x90\xFE |0 + \x91\x40 |0 + \x91\x41 |0 + \x91\x42 |0 + \x91\x43 |0 + \x91\x44 |0 + \x91\x45 |0 + \x91\x46 |0 + \x91\x47 |0 + \x91\x48 |0 + \x91\x49 |0 + \x91\x4A |0 + \x91\x4B |0 + \x91\x4C |0 + \x91\x4D |0 + \x91\x4E |0 + \x91\x4F |0 + \x91\x50 |0 + \x91\x51 |0 + \x91\x52 |0 + \x91\x53 |0 + \x91\x54 |0 + \x91\x55 |0 + \x91\x56 |0 + \x91\x57 |0 + \x91\x58 |0 + \x91\x59 |0 + \x91\x5A |0 + \x91\x5B |0 + \x91\x5C |0 + \x91\x5D |0 + \x91\x5E |0 + \x91\x5F |0 + \x91\x60 |0 + \x91\x61 |0 + \x91\x62 |0 + \x91\x63 |0 + \x91\x64 |0 + \x91\x65 |0 + \x91\x66 |0 + \x91\x67 |0 + \x91\x68 |0 + \x91\x69 |0 + \x91\x6A |0 + \x91\x6B |0 + \x91\x6C |0 + \x91\x6D |0 + \x91\x6E |0 + \x91\x6F |0 + \x91\x70 |0 + \x91\x71 |0 + \x91\x72 |0 + \x91\x73 |0 + \x91\x74 |0 + \x91\x75 |0 + \x91\x76 |0 + \x91\x77 |0 + \x91\x78 |0 + \x91\x79 |0 + \x91\x7A |0 + \x91\x7B |0 + \x91\x7C |0 + \x91\x7D |0 + \x91\x7E |0 + \x91\xA1 |0 + \x91\xA2 |0 + \x91\xA3 |0 + \x91\xA4 |0 + \x91\xA5 |0 + \x91\xA6 |0 + \x91\xA7 |0 + \x91\xA8 |0 + \x91\xA9 |0 + \x91\xAA |0 + \x91\xAB |0 + \x91\xAC |0 + \x91\xAD |0 + \x91\xAE |0 + \x91\xAF |0 + \x91\xB0 |0 + \x91\xB1 |0 + \x91\xB2 |0 + \x91\xB3 |0 + \x91\xB4 |0 + \x91\xB5 |0 + \x91\xB6 |0 + \x91\xB7 |0 + \x91\xB8 |0 + \x91\xB9 |0 + \x91\xBA |0 + \x91\xBB |0 + \x91\xBC |0 + \x91\xBD |0 + \x91\xBE |0 + \x91\xBF |0 + \x91\xC0 |0 + \x91\xC1 |0 + \x91\xC2 |0 + \x91\xC3 |0 + \x91\xC4 |0 + \x91\xC5 |0 + \x91\xC6 |0 + \x91\xC7 |0 + \x91\xC8 |0 + \x91\xC9 |0 + \x91\xCA |0 + \x91\xCB |0 + \x91\xCC |0 + \x91\xCD |0 + \x91\xCE |0 + \x91\xCF |0 + \x91\xD0 |0 + \x91\xD1 |0 + \x91\xD2 |0 + \x91\xD3 |0 + \x91\xD4 |0 + \x91\xD5 |0 + \x91\xD6 |0 + \x91\xD7 |0 + \x91\xD8 |0 + \x91\xD9 |0 + \x91\xDA |0 + \x91\xDB |0 + \x91\xDC |0 + \x91\xDD |0 + \x91\xDE |0 + \x91\xDF |0 + \x91\xE0 |0 + \x91\xE1 |0 + \x91\xE2 |0 + \x91\xE3 |0 + \x91\xE4 |0 + \x91\xE5 |0 + \x91\xE6 |0 + \x91\xE7 |0 + \x91\xE8 |0 + \x91\xE9 |0 + \x91\xEA |0 + \x91\xEB |0 + \x91\xEC |0 + \x91\xED |0 + \x91\xEE |0 + \x91\xEF |0 + \x91\xF0 |0 + \x91\xF1 |0 + \x91\xF2 |0 + \x91\xF3 |0 + \x91\xF4 |0 + \x91\xF5 |0 + \x91\xF6 |0 + \x91\xF7 |0 + \x91\xF8 |0 + \x91\xF9 |0 + \x91\xFA |0 + \x91\xFB |0 + \x91\xFC |0 + \x91\xFD |0 + \x91\xFE |0 + \x92\x40 |0 + \x92\x41 |0 + \x92\x42 |0 + \x92\x43 |0 + \x92\x44 |0 + \x92\x45 |0 + \x92\x46 |0 + \x92\x47 |0 + \x92\x48 |0 + \x92\x49 |0 + \x92\x4A |0 + \x92\x4B |0 + \x92\x4C |0 + \x92\x4D |0 + \x92\x4E |0 + \x92\x4F |0 + \x92\x50 |0 + \x92\x51 |0 + \x92\x52 |0 + \x92\x53 |0 + \x92\x54 |0 + \x92\x55 |0 + \x92\x56 |0 + \x92\x57 |0 + \x92\x58 |0 + \x92\x59 |0 + \x92\x5A |0 + \x92\x5B |0 + \x92\x5C |0 + \x92\x5D |0 + \x92\x5E |0 + \x92\x5F |0 + \x92\x60 |0 + \x92\x61 |0 + \x92\x62 |0 + \x92\x63 |0 + \x92\x64 |0 + \x92\x65 |0 + \x92\x66 |0 + \x92\x67 |0 + \x92\x68 |0 + \x92\x69 |0 + \x92\x6A |0 + \x92\x6B |0 + \x92\x6C |0 + \x92\x6D |0 + \x92\x6E |0 + \x92\x6F |0 + \x92\x70 |0 + \x92\x71 |0 + \x92\x72 |0 + \x92\x73 |0 + \x92\x74 |0 + \x92\x75 |0 + \x92\x76 |0 + \x92\x77 |0 + \x92\x78 |0 + \x92\x79 |0 + \x92\x7A |0 + \x92\x7B |0 + \x92\x7C |0 + \x92\x7D |0 + \x92\x7E |0 + \x92\xA1 |0 + \x92\xA2 |0 + \x92\xA3 |0 + \x92\xA4 |0 + \x92\xA5 |0 + \x92\xA6 |0 + \x92\xA7 |0 + \x92\xA8 |0 + \x92\xA9 |0 + \x92\xAA |0 + \x92\xAB |0 + \x92\xAC |0 + \x92\xAD |0 + \x92\xAE |0 + \x92\xAF |0 + \x92\xB0 |0 + \x92\xB1 |0 + \x92\xB2 |0 + \x92\xB3 |0 + \x92\xB4 |0 + \x92\xB5 |0 + \x92\xB6 |0 + \x92\xB7 |0 + \x92\xB8 |0 + \x92\xB9 |0 + \x92\xBA |0 + \x92\xBB |0 + \x92\xBC |0 + \x92\xBD |0 + \x92\xBE |0 + \x92\xBF |0 + \x92\xC0 |0 + \x92\xC1 |0 + \x92\xC2 |0 + \x92\xC3 |0 + \x92\xC4 |0 + \x92\xC5 |0 + \x92\xC6 |0 + \x92\xC7 |0 + \x92\xC8 |0 + \x92\xC9 |0 + \x92\xCA |0 + \x92\xCB |0 + \x92\xCC |0 + \x92\xCD |0 + \x92\xCE |0 + \x92\xCF |0 + \x92\xD0 |0 + \x92\xD1 |0 + \x92\xD2 |0 + \x92\xD3 |0 + \x92\xD4 |0 + \x92\xD5 |0 + \x92\xD6 |0 + \x92\xD7 |0 + \x92\xD8 |0 + \x92\xD9 |0 + \x92\xDA |0 + \x92\xDB |0 + \x92\xDC |0 + \x92\xDD |0 + \x92\xDE |0 + \x92\xDF |0 + \x92\xE0 |0 + \x92\xE1 |0 + \x92\xE2 |0 + \x92\xE3 |0 + \x92\xE4 |0 + \x92\xE5 |0 + \x92\xE6 |0 + \x92\xE7 |0 + \x92\xE8 |0 + \x92\xE9 |0 + \x92\xEA |0 + \x92\xEB |0 + \x92\xEC |0 + \x92\xED |0 + \x92\xEE |0 + \x92\xEF |0 + \x92\xF0 |0 + \x92\xF1 |0 + \x92\xF2 |0 + \x92\xF3 |0 + \x92\xF4 |0 + \x92\xF5 |0 + \x92\xF6 |0 + \x92\xF7 |0 + \x92\xF8 |0 + \x92\xF9 |0 + \x92\xFA |0 + \x92\xFB |0 + \x92\xFC |0 + \x92\xFD |0 + \x92\xFE |0 + \x93\x40 |0 + \x93\x41 |0 + \x93\x42 |0 + \x93\x43 |0 + \x93\x44 |0 + \x93\x45 |0 + \x93\x46 |0 + \x93\x47 |0 + \x93\x48 |0 + \x93\x49 |0 + \x93\x4A |0 + \x93\x4B |0 + \x93\x4C |0 + \x93\x4D |0 + \x93\x4E |0 + \x93\x4F |0 + \x93\x50 |0 + \x93\x51 |0 + \x93\x52 |0 + \x93\x53 |0 + \x93\x54 |0 + \x93\x55 |0 + \x93\x56 |0 + \x93\x57 |0 + \x93\x58 |0 + \x93\x59 |0 + \x93\x5A |0 + \x93\x5B |0 + \x93\x5C |0 + \x93\x5D |0 + \x93\x5E |0 + \x93\x5F |0 + \x93\x60 |0 + \x93\x61 |0 + \x93\x62 |0 + \x93\x63 |0 + \x93\x64 |0 + \x93\x65 |0 + \x93\x66 |0 + \x93\x67 |0 + \x93\x68 |0 + \x93\x69 |0 + \x93\x6A |0 + \x93\x6B |0 + \x93\x6C |0 + \x93\x6D |0 + \x93\x6E |0 + \x93\x6F |0 + \x93\x70 |0 + \x93\x71 |0 + \x93\x72 |0 + \x93\x73 |0 + \x93\x74 |0 + \x93\x75 |0 + \x93\x76 |0 + \x93\x77 |0 + \x93\x78 |0 + \x93\x79 |0 + \x93\x7A |0 + \x93\x7B |0 + \x93\x7C |0 + \x93\x7D |0 + \x93\x7E |0 + \x93\xA1 |0 + \x93\xA2 |0 + \x93\xA3 |0 + \x93\xA4 |0 + \x93\xA5 |0 + \x93\xA6 |0 + \x93\xA7 |0 + \x93\xA8 |0 + \x93\xA9 |0 + \x93\xAA |0 + \x93\xAB |0 + \x93\xAC |0 + \x93\xAD |0 + \x93\xAE |0 + \x93\xAF |0 + \x93\xB0 |0 + \x93\xB1 |0 + \x93\xB2 |0 + \x93\xB3 |0 + \x93\xB4 |0 + \x93\xB5 |0 + \x93\xB6 |0 + \x93\xB7 |0 + \x93\xB8 |0 + \x93\xB9 |0 + \x93\xBA |0 + \x93\xBB |0 + \x93\xBC |0 + \x93\xBD |0 + \x93\xBE |0 + \x93\xBF |0 + \x93\xC0 |0 + \x93\xC1 |0 + \x93\xC2 |0 + \x93\xC3 |0 + \x93\xC4 |0 + \x93\xC5 |0 + \x93\xC6 |0 + \x93\xC7 |0 + \x93\xC8 |0 + \x93\xC9 |0 + \x93\xCA |0 + \x93\xCB |0 + \x93\xCC |0 + \x93\xCD |0 + \x93\xCE |0 + \x93\xCF |0 + \x93\xD0 |0 + \x93\xD1 |0 + \x93\xD2 |0 + \x93\xD3 |0 + \x93\xD4 |0 + \x93\xD5 |0 + \x93\xD6 |0 + \x93\xD7 |0 + \x93\xD8 |0 + \x93\xD9 |0 + \x93\xDA |0 + \x93\xDB |0 + \x93\xDC |0 + \x93\xDD |0 + \x93\xDE |0 + \x93\xDF |0 + \x93\xE0 |0 + \x93\xE1 |0 + \x93\xE2 |0 + \x93\xE3 |0 + \x93\xE4 |0 + \x93\xE5 |0 + \x93\xE6 |0 + \x93\xE7 |0 + \x93\xE8 |0 + \x93\xE9 |0 + \x93\xEA |0 + \x93\xEB |0 + \x93\xEC |0 + \x93\xED |0 + \x93\xEE |0 + \x93\xEF |0 + \x93\xF0 |0 + \x93\xF1 |0 + \x93\xF2 |0 + \x93\xF3 |0 + \x93\xF4 |0 + \x93\xF5 |0 + \x93\xF6 |0 + \x93\xF7 |0 + \x93\xF8 |0 + \x93\xF9 |0 + \x93\xFA |0 + \x93\xFB |0 + \x93\xFC |0 + \x93\xFD |0 + \x93\xFE |0 + \x94\x40 |0 + \x94\x41 |0 + \x94\x42 |0 + \x94\x43 |0 + \x94\x44 |0 + \x94\x45 |0 + \x94\x46 |0 + \x94\x47 |0 + \x94\x48 |0 + \x94\x49 |0 + \x94\x4A |0 + \x94\x4B |0 + \x94\x4C |0 + \x94\x4D |0 + \x94\x4E |0 + \x94\x4F |0 + \x94\x50 |0 + \x94\x51 |0 + \x94\x52 |0 + \x94\x53 |0 + \x94\x54 |0 + \x94\x55 |0 + \x94\x56 |0 + \x94\x57 |0 + \x94\x58 |0 + \x94\x59 |0 + \x94\x5A |0 + \x94\x5B |0 + \x94\x5C |0 + \x94\x5D |0 + \x94\x5E |0 + \x94\x5F |0 + \x94\x60 |0 + \x94\x61 |0 + \x94\x62 |0 + \x94\x63 |0 + \x94\x64 |0 + \x94\x65 |0 + \x94\x66 |0 + \x94\x67 |0 + \x94\x68 |0 + \x94\x69 |0 + \x94\x6A |0 + \x94\x6B |0 + \x94\x6C |0 + \x94\x6D |0 + \x94\x6E |0 + \x94\x6F |0 + \x94\x70 |0 + \x94\x71 |0 + \x94\x72 |0 + \x94\x73 |0 + \x94\x74 |0 + \x94\x75 |0 + \x94\x76 |0 + \x94\x77 |0 + \x94\x78 |0 + \x94\x79 |0 + \x94\x7A |0 + \x94\x7B |0 + \x94\x7C |0 + \x94\x7D |0 + \x94\x7E |0 + \x94\xA1 |0 + \x94\xA2 |0 + \x94\xA3 |0 + \x94\xA4 |0 + \x94\xA5 |0 + \x94\xA6 |0 + \x94\xA7 |0 + \x94\xA8 |0 + \x94\xA9 |0 + \x94\xAA |0 + \x94\xAB |0 + \x94\xAC |0 + \x94\xAD |0 + \x94\xAE |0 + \x94\xAF |0 + \x94\xB0 |0 + \x94\xB1 |0 + \x94\xB2 |0 + \x94\xB3 |0 + \x94\xB4 |0 + \x94\xB5 |0 + \x94\xB6 |0 + \x94\xB7 |0 + \x94\xB8 |0 + \x94\xB9 |0 + \x94\xBA |0 + \x94\xBB |0 + \x94\xBC |0 + \x94\xBD |0 + \x94\xBE |0 + \x94\xBF |0 + \x94\xC0 |0 + \x94\xC1 |0 + \x94\xC2 |0 + \x94\xC3 |0 + \x94\xC4 |0 + \x94\xC5 |0 + \x94\xC6 |0 + \x94\xC7 |0 + \x94\xC8 |0 + \x94\xC9 |0 + \x94\xCA |0 + \x94\xCB |0 + \x94\xCC |0 + \x94\xCD |0 + \x94\xCE |0 + \x94\xCF |0 + \x94\xD0 |0 + \x94\xD1 |0 + \x94\xD2 |0 + \x94\xD3 |0 + \x94\xD4 |0 + \x94\xD5 |0 + \x94\xD6 |0 + \x94\xD7 |0 + \x94\xD8 |0 + \x94\xD9 |0 + \x94\xDA |0 + \x94\xDB |0 + \x94\xDC |0 + \x94\xDD |0 + \x94\xDE |0 + \x94\xDF |0 + \x94\xE0 |0 + \x94\xE1 |0 + \x94\xE2 |0 + \x94\xE3 |0 + \x94\xE4 |0 + \x94\xE5 |0 + \x94\xE6 |0 + \x94\xE7 |0 + \x94\xE8 |0 + \x94\xE9 |0 + \x94\xEA |0 + \x94\xEB |0 + \x94\xEC |0 + \x94\xED |0 + \x94\xEE |0 + \x94\xEF |0 + \x94\xF0 |0 + \x94\xF1 |0 + \x94\xF2 |0 + \x94\xF3 |0 + \x94\xF4 |0 + \x94\xF5 |0 + \x94\xF6 |0 + \x94\xF7 |0 + \x94\xF8 |0 + \x94\xF9 |0 + \x94\xFA |0 + \x94\xFB |0 + \x94\xFC |0 + \x94\xFD |0 + \x94\xFE |0 + \x95\x40 |0 + \x95\x41 |0 + \x95\x42 |0 + \x95\x43 |0 + \x95\x44 |0 + \x95\x45 |0 + \x95\x46 |0 + \x95\x47 |0 + \x95\x48 |0 + \x95\x49 |0 + \x95\x4A |0 + \x95\x4B |0 + \x95\x4C |0 + \x95\x4D |0 + \x95\x4E |0 + \x95\x4F |0 + \x95\x50 |0 + \x95\x51 |0 + \x95\x52 |0 + \x95\x53 |0 + \x95\x54 |0 + \x95\x55 |0 + \x95\x56 |0 + \x95\x57 |0 + \x95\x58 |0 + \x95\x59 |0 + \x95\x5A |0 + \x95\x5B |0 + \x95\x5C |0 + \x95\x5D |0 + \x95\x5E |0 + \x95\x5F |0 + \x95\x60 |0 + \x95\x61 |0 + \x95\x62 |0 + \x95\x63 |0 + \x95\x64 |0 + \x95\x65 |0 + \x95\x66 |0 + \x95\x67 |0 + \x95\x68 |0 + \x95\x69 |0 + \x95\x6A |0 + \x95\x6B |0 + \x95\x6C |0 + \x95\x6D |0 + \x95\x6E |0 + \x95\x6F |0 + \x95\x70 |0 + \x95\x71 |0 + \x95\x72 |0 + \x95\x73 |0 + \x95\x74 |0 + \x95\x75 |0 + \x95\x76 |0 + \x95\x77 |0 + \x95\x78 |0 + \x95\x79 |0 + \x95\x7A |0 + \x95\x7B |0 + \x95\x7C |0 + \x95\x7D |0 + \x95\x7E |0 + \x95\xA1 |0 + \x95\xA2 |0 + \x95\xA3 |0 + \x95\xA4 |0 + \x95\xA5 |0 + \x95\xA6 |0 + \x95\xA7 |0 + \x95\xA8 |0 + \x95\xA9 |0 + \x95\xAA |0 + \x95\xAB |0 + \x95\xAC |0 + \x95\xAD |0 + \x95\xAE |0 + \x95\xAF |0 + \x95\xB0 |0 + \x95\xB1 |0 + \x95\xB2 |0 + \x95\xB3 |0 + \x95\xB4 |0 + \x95\xB5 |0 + \x95\xB6 |0 + \x95\xB7 |0 + \x95\xB8 |0 + \x95\xB9 |0 + \x95\xBA |0 + \x95\xBB |0 + \x95\xBC |0 + \x95\xBD |0 + \x95\xBE |0 + \x95\xBF |0 + \x95\xC0 |0 + \x95\xC1 |0 + \x95\xC2 |0 + \x95\xC3 |0 + \x95\xC4 |0 + \x95\xC5 |0 + \x95\xC6 |0 + \x95\xC7 |0 + \x95\xC8 |0 + \x95\xC9 |0 + \x95\xCA |0 + \x95\xCB |0 + \x95\xCC |0 + \x95\xCD |0 + \x95\xCE |0 + \x95\xCF |0 + \x95\xD0 |0 + \x95\xD1 |0 + \x95\xD2 |0 + \x95\xD3 |0 + \x95\xD4 |0 + \x95\xD5 |0 + \x95\xD6 |0 + \x95\xD7 |0 + \x95\xD8 |0 + \x95\xD9 |0 + \x95\xDA |0 + \x95\xDB |0 + \x95\xDC |0 + \x95\xDD |0 + \x95\xDE |0 + \x95\xDF |0 + \x95\xE0 |0 + \x95\xE1 |0 + \x95\xE2 |0 + \x95\xE3 |0 + \x95\xE4 |0 + \x95\xE5 |0 + \x95\xE6 |0 + \x95\xE7 |0 + \x95\xE8 |0 + \x95\xE9 |0 + \x95\xEA |0 + \x95\xEB |0 + \x95\xEC |0 + \x95\xED |0 + \x95\xEE |0 + \x95\xEF |0 + \x95\xF0 |0 + \x95\xF1 |0 + \x95\xF2 |0 + \x95\xF3 |0 + \x95\xF4 |0 + \x95\xF5 |0 + \x95\xF6 |0 + \x95\xF7 |0 + \x95\xF8 |0 + \x95\xF9 |0 + \x95\xFA |0 + \x95\xFB |0 + \x95\xFC |0 + \x95\xFD |0 + \x95\xFE |0 + \x96\x40 |0 + \x96\x41 |0 + \x96\x42 |0 + \x96\x43 |0 + \x96\x44 |0 + \x96\x45 |0 + \x96\x46 |0 + \x96\x47 |0 + \x96\x48 |0 + \x96\x49 |0 + \x96\x4A |0 + \x96\x4B |0 + \x96\x4C |0 + \x96\x4D |0 + \x96\x4E |0 + \x96\x4F |0 + \x96\x50 |0 + \x96\x51 |0 + \x96\x52 |0 + \x96\x53 |0 + \x96\x54 |0 + \x96\x55 |0 + \x96\x56 |0 + \x96\x57 |0 + \x96\x58 |0 + \x96\x59 |0 + \x96\x5A |0 + \x96\x5B |0 + \x96\x5C |0 + \x96\x5D |0 + \x96\x5E |0 + \x96\x5F |0 + \x96\x60 |0 + \x96\x61 |0 + \x96\x62 |0 + \x96\x63 |0 + \x96\x64 |0 + \x96\x65 |0 + \x96\x66 |0 + \x96\x67 |0 + \x96\x68 |0 + \x96\x69 |0 + \x96\x6A |0 + \x96\x6B |0 + \x96\x6C |0 + \x96\x6D |0 + \x96\x6E |0 + \x96\x6F |0 + \x96\x70 |0 + \x96\x71 |0 + \x96\x72 |0 + \x96\x73 |0 + \x96\x74 |0 + \x96\x75 |0 + \x96\x76 |0 + \x96\x77 |0 + \x96\x78 |0 + \x96\x79 |0 + \x96\x7A |0 + \x96\x7B |0 + \x96\x7C |0 + \x96\x7D |0 + \x96\x7E |0 + \x96\xA1 |0 + \x96\xA2 |0 + \x96\xA3 |0 + \x96\xA4 |0 + \x96\xA5 |0 + \x96\xA6 |0 + \x96\xA7 |0 + \x96\xA8 |0 + \x96\xA9 |0 + \x96\xAA |0 + \x96\xAB |0 + \x96\xAC |0 + \x96\xAD |0 + \x96\xAE |0 + \x96\xAF |0 + \x96\xB0 |0 + \x96\xB1 |0 + \x96\xB2 |0 + \x96\xB3 |0 + \x96\xB4 |0 + \x96\xB5 |0 + \x96\xB6 |0 + \x96\xB7 |0 + \x96\xB8 |0 + \x96\xB9 |0 + \x96\xBA |0 + \x96\xBB |0 + \x96\xBC |0 + \x96\xBD |0 + \x96\xBE |0 + \x96\xBF |0 + \x96\xC0 |0 + \x96\xC1 |0 + \x96\xC2 |0 + \x96\xC3 |0 + \x96\xC4 |0 + \x96\xC5 |0 + \x96\xC6 |0 + \x96\xC7 |0 + \x96\xC8 |0 + \x96\xC9 |0 + \x96\xCA |0 + \x96\xCB |0 + \x96\xCC |0 + \x96\xCD |0 + \x96\xCE |0 + \x96\xCF |0 + \x96\xD0 |0 + \x96\xD1 |0 + \x96\xD2 |0 + \x96\xD3 |0 + \x96\xD4 |0 + \x96\xD5 |0 + \x96\xD6 |0 + \x96\xD7 |0 + \x96\xD8 |0 + \x96\xD9 |0 + \x96\xDA |0 + \x96\xDB |0 + \x96\xDC |0 + \x96\xDD |0 + \x96\xDE |0 + \x96\xDF |0 + \x96\xE0 |0 + \x96\xE1 |0 + \x96\xE2 |0 + \x96\xE3 |0 + \x96\xE4 |0 + \x96\xE5 |0 + \x96\xE6 |0 + \x96\xE7 |0 + \x96\xE8 |0 + \x96\xE9 |0 + \x96\xEA |0 + \x96\xEB |0 + \x96\xEC |0 + \x96\xED |0 + \x96\xEE |0 + \x96\xEF |0 + \x96\xF0 |0 + \x96\xF1 |0 + \x96\xF2 |0 + \x96\xF3 |0 + \x96\xF4 |0 + \x96\xF5 |0 + \x96\xF6 |0 + \x96\xF7 |0 + \x96\xF8 |0 + \x96\xF9 |0 + \x96\xFA |0 + \x96\xFB |0 + \x96\xFC |0 + \x96\xFD |0 + \x96\xFE |0 + \x97\x40 |0 + \x97\x41 |0 + \x97\x42 |0 + \x97\x43 |0 + \x97\x44 |0 + \x97\x45 |0 + \x97\x46 |0 + \x97\x47 |0 + \x97\x48 |0 + \x97\x49 |0 + \x97\x4A |0 + \x97\x4B |0 + \x97\x4C |0 + \x97\x4D |0 + \x97\x4E |0 + \x97\x4F |0 + \x97\x50 |0 + \x97\x51 |0 + \x97\x52 |0 + \x97\x53 |0 + \x97\x54 |0 + \x97\x55 |0 + \x97\x56 |0 + \x97\x57 |0 + \x97\x58 |0 + \x97\x59 |0 + \x97\x5A |0 + \x97\x5B |0 + \x97\x5C |0 + \x97\x5D |0 + \x97\x5E |0 + \x97\x5F |0 + \x97\x60 |0 + \x97\x61 |0 + \x97\x62 |0 + \x97\x63 |0 + \x97\x64 |0 + \x97\x65 |0 + \x97\x66 |0 + \x97\x67 |0 + \x97\x68 |0 + \x97\x69 |0 + \x97\x6A |0 + \x97\x6B |0 + \x97\x6C |0 + \x97\x6D |0 + \x97\x6E |0 + \x97\x6F |0 + \x97\x70 |0 + \x97\x71 |0 + \x97\x72 |0 + \x97\x73 |0 + \x97\x74 |0 + \x97\x75 |0 + \x97\x76 |0 + \x97\x77 |0 + \x97\x78 |0 + \x97\x79 |0 + \x97\x7A |0 + \x97\x7B |0 + \x97\x7C |0 + \x97\x7D |0 + \x97\x7E |0 + \x97\xA1 |0 + \x97\xA2 |0 + \x97\xA3 |0 + \x97\xA4 |0 + \x97\xA5 |0 + \x97\xA6 |0 + \x97\xA7 |0 + \x97\xA8 |0 + \x97\xA9 |0 + \x97\xAA |0 + \x97\xAB |0 + \x97\xAC |0 + \x97\xAD |0 + \x97\xAE |0 + \x97\xAF |0 + \x97\xB0 |0 + \x97\xB1 |0 + \x97\xB2 |0 + \x97\xB3 |0 + \x97\xB4 |0 + \x97\xB5 |0 + \x97\xB6 |0 + \x97\xB7 |0 + \x97\xB8 |0 + \x97\xB9 |0 + \x97\xBA |0 + \x97\xBB |0 + \x97\xBC |0 + \x97\xBD |0 + \x97\xBE |0 + \x97\xBF |0 + \x97\xC0 |0 + \x97\xC1 |0 + \x97\xC2 |0 + \x97\xC3 |0 + \x97\xC4 |0 + \x97\xC5 |0 + \x97\xC6 |0 + \x97\xC7 |0 + \x97\xC8 |0 + \x97\xC9 |0 + \x97\xCA |0 + \x97\xCB |0 + \x97\xCC |0 + \x97\xCD |0 + \x97\xCE |0 + \x97\xCF |0 + \x97\xD0 |0 + \x97\xD1 |0 + \x97\xD2 |0 + \x97\xD3 |0 + \x97\xD4 |0 + \x97\xD5 |0 + \x97\xD6 |0 + \x97\xD7 |0 + \x97\xD8 |0 + \x97\xD9 |0 + \x97\xDA |0 + \x97\xDB |0 + \x97\xDC |0 + \x97\xDD |0 + \x97\xDE |0 + \x97\xDF |0 + \x97\xE0 |0 + \x97\xE1 |0 + \x97\xE2 |0 + \x97\xE3 |0 + \x97\xE4 |0 + \x97\xE5 |0 + \x97\xE6 |0 + \x97\xE7 |0 + \x97\xE8 |0 + \x97\xE9 |0 + \x97\xEA |0 + \x97\xEB |0 + \x97\xEC |0 + \x97\xED |0 + \x97\xEE |0 + \x97\xEF |0 + \x97\xF0 |0 + \x97\xF1 |0 + \x97\xF2 |0 + \x97\xF3 |0 + \x97\xF4 |0 + \x97\xF5 |0 + \x97\xF6 |0 + \x97\xF7 |0 + \x97\xF8 |0 + \x97\xF9 |0 + \x97\xFA |0 + \x97\xFB |0 + \x97\xFC |0 + \x97\xFD |0 + \x97\xFE |0 + \x98\x40 |0 + \x98\x41 |0 + \x98\x42 |0 + \x98\x43 |0 + \x98\x44 |0 + \x98\x45 |0 + \x98\x46 |0 + \x98\x47 |0 + \x98\x48 |0 + \x98\x49 |0 + \x98\x4A |0 + \x98\x4B |0 + \x98\x4C |0 + \x98\x4D |0 + \x98\x4E |0 + \x98\x4F |0 + \x98\x50 |0 + \x98\x51 |0 + \x98\x52 |0 + \x98\x53 |0 + \x98\x54 |0 + \x98\x55 |0 + \x98\x56 |0 + \x98\x57 |0 + \x98\x58 |0 + \x98\x59 |0 + \x98\x5A |0 + \x98\x5B |0 + \x98\x5C |0 + \x98\x5D |0 + \x98\x5E |0 + \x98\x5F |0 + \x98\x60 |0 + \x98\x61 |0 + \x98\x62 |0 + \x98\x63 |0 + \x98\x64 |0 + \x98\x65 |0 + \x98\x66 |0 + \x98\x67 |0 + \x98\x68 |0 + \x98\x69 |0 + \x98\x6A |0 + \x98\x6B |0 + \x98\x6C |0 + \x98\x6D |0 + \x98\x6E |0 + \x98\x6F |0 + \x98\x70 |0 + \x98\x71 |0 + \x98\x72 |0 + \x98\x73 |0 + \x98\x74 |0 + \x98\x75 |0 + \x98\x76 |0 + \x98\x77 |0 + \x98\x78 |0 + \x98\x79 |0 + \x98\x7A |0 + \x98\x7B |0 + \x98\x7C |0 + \x98\x7D |0 + \x98\x7E |0 + \x98\xA1 |0 + \x98\xA2 |0 + \x98\xA3 |0 + \x98\xA4 |0 + \x98\xA5 |0 + \x98\xA6 |0 + \x98\xA7 |0 + \x98\xA8 |0 + \x98\xA9 |0 + \x98\xAA |0 + \x98\xAB |0 + \x98\xAC |0 + \x98\xAD |0 + \x98\xAE |0 + \x98\xAF |0 + \x98\xB0 |0 + \x98\xB1 |0 + \x98\xB2 |0 + \x98\xB3 |0 + \x98\xB4 |0 + \x98\xB5 |0 + \x98\xB6 |0 + \x98\xB7 |0 + \x98\xB8 |0 + \x98\xB9 |0 + \x98\xBA |0 + \x98\xBB |0 + \x98\xBC |0 + \x98\xBD |0 + \x98\xBE |0 + \x98\xBF |0 + \x98\xC0 |0 + \x98\xC1 |0 + \x98\xC2 |0 + \x98\xC3 |0 + \x98\xC4 |0 + \x98\xC5 |0 + \x98\xC6 |0 + \x98\xC7 |0 + \x98\xC8 |0 + \x98\xC9 |0 + \x98\xCA |0 + \x98\xCB |0 + \x98\xCC |0 + \x98\xCD |0 + \x98\xCE |0 + \x98\xCF |0 + \x98\xD0 |0 + \x98\xD1 |0 + \x98\xD2 |0 + \x98\xD3 |0 + \x98\xD4 |0 + \x98\xD5 |0 + \x98\xD6 |0 + \x98\xD7 |0 + \x98\xD8 |0 + \x98\xD9 |0 + \x98\xDA |0 + \x98\xDB |0 + \x98\xDC |0 + \x98\xDD |0 + \x98\xDE |0 + \x98\xDF |0 + \x98\xE0 |0 + \x98\xE1 |0 + \x98\xE2 |0 + \x98\xE3 |0 + \x98\xE4 |0 + \x98\xE5 |0 + \x98\xE6 |0 + \x98\xE7 |0 + \x98\xE8 |0 + \x98\xE9 |0 + \x98\xEA |0 + \x98\xEB |0 + \x98\xEC |0 + \x98\xED |0 + \x98\xEE |0 + \x98\xEF |0 + \x98\xF0 |0 + \x98\xF1 |0 + \x98\xF2 |0 + \x98\xF3 |0 + \x98\xF4 |0 + \x98\xF5 |0 + \x98\xF6 |0 + \x98\xF7 |0 + \x98\xF8 |0 + \x98\xF9 |0 + \x98\xFA |0 + \x98\xFB |0 + \x98\xFC |0 + \x98\xFD |0 + \x98\xFE |0 + \x99\x40 |0 + \x99\x41 |0 + \x99\x42 |0 + \x99\x43 |0 + \x99\x44 |0 + \x99\x45 |0 + \x99\x46 |0 + \x99\x47 |0 + \x99\x48 |0 + \x99\x49 |0 + \x99\x4A |0 + \x99\x4B |0 + \x99\x4C |0 + \x99\x4D |0 + \x99\x4E |0 + \x99\x4F |0 + \x99\x50 |0 + \x99\x51 |0 + \x99\x52 |0 + \x99\x53 |0 + \x99\x54 |0 + \x99\x55 |0 + \x99\x56 |0 + \x99\x57 |0 + \x99\x58 |0 + \x99\x59 |0 + \x99\x5A |0 + \x99\x5B |0 + \x99\x5C |0 + \x99\x5D |0 + \x99\x5E |0 + \x99\x5F |0 + \x99\x60 |0 + \x99\x61 |0 + \x99\x62 |0 + \x99\x63 |0 + \x99\x64 |0 + \x99\x65 |0 + \x99\x66 |0 + \x99\x67 |0 + \x99\x68 |0 + \x99\x69 |0 + \x99\x6A |0 + \x99\x6B |0 + \x99\x6C |0 + \x99\x6D |0 + \x99\x6E |0 + \x99\x6F |0 + \x99\x70 |0 + \x99\x71 |0 + \x99\x72 |0 + \x99\x73 |0 + \x99\x74 |0 + \x99\x75 |0 + \x99\x76 |0 + \x99\x77 |0 + \x99\x78 |0 + \x99\x79 |0 + \x99\x7A |0 + \x99\x7B |0 + \x99\x7C |0 + \x99\x7D |0 + \x99\x7E |0 + \x99\xA1 |0 + \x99\xA2 |0 + \x99\xA3 |0 + \x99\xA4 |0 + \x99\xA5 |0 + \x99\xA6 |0 + \x99\xA7 |0 + \x99\xA8 |0 + \x99\xA9 |0 + \x99\xAA |0 + \x99\xAB |0 + \x99\xAC |0 + \x99\xAD |0 + \x99\xAE |0 + \x99\xAF |0 + \x99\xB0 |0 + \x99\xB1 |0 + \x99\xB2 |0 + \x99\xB3 |0 + \x99\xB4 |0 + \x99\xB5 |0 + \x99\xB6 |0 + \x99\xB7 |0 + \x99\xB8 |0 + \x99\xB9 |0 + \x99\xBA |0 + \x99\xBB |0 + \x99\xBC |0 + \x99\xBD |0 + \x99\xBE |0 + \x99\xBF |0 + \x99\xC0 |0 + \x99\xC1 |0 + \x99\xC2 |0 + \x99\xC3 |0 + \x99\xC4 |0 + \x99\xC5 |0 + \x99\xC6 |0 + \x99\xC7 |0 + \x99\xC8 |0 + \x99\xC9 |0 + \x99\xCA |0 + \x99\xCB |0 + \x99\xCC |0 + \x99\xCD |0 + \x99\xCE |0 + \x99\xCF |0 + \x99\xD0 |0 + \x99\xD1 |0 + \x99\xD2 |0 + \x99\xD3 |0 + \x99\xD4 |0 + \x99\xD5 |0 + \x99\xD6 |0 + \x99\xD7 |0 + \x99\xD8 |0 + \x99\xD9 |0 + \x99\xDA |0 + \x99\xDB |0 + \x99\xDC |0 + \x99\xDD |0 + \x99\xDE |0 + \x99\xDF |0 + \x99\xE0 |0 + \x99\xE1 |0 + \x99\xE2 |0 + \x99\xE3 |0 + \x99\xE4 |0 + \x99\xE5 |0 + \x99\xE6 |0 + \x99\xE7 |0 + \x99\xE8 |0 + \x99\xE9 |0 + \x99\xEA |0 + \x99\xEB |0 + \x99\xEC |0 + \x99\xED |0 + \x99\xEE |0 + \x99\xEF |0 + \x99\xF0 |0 + \x99\xF1 |0 + \x99\xF2 |0 + \x99\xF3 |0 + \x99\xF4 |0 + \x99\xF5 |0 + \x99\xF6 |0 + \x99\xF7 |0 + \x99\xF8 |0 + \x99\xF9 |0 + \x99\xFA |0 + \x99\xFB |0 + \x99\xFC |0 + \x99\xFD |0 + \x99\xFE |0 + \x9A\x40 |0 + \x9A\x41 |0 + \x9A\x42 |0 + \x9A\x43 |0 + \x9A\x44 |0 + \x9A\x45 |0 + \x9A\x46 |0 + \x9A\x47 |0 + \x9A\x48 |0 + \x9A\x49 |0 + \x9A\x4A |0 + \x9A\x4B |0 + \x9A\x4C |0 + \x9A\x4D |0 + \x9A\x4E |0 + \x9A\x4F |0 + \x9A\x50 |0 + \x9A\x51 |0 + \x9A\x52 |0 + \x9A\x53 |0 + \x9A\x54 |0 + \x9A\x55 |0 + \x9A\x56 |0 + \x9A\x57 |0 + \x9A\x58 |0 + \x9A\x59 |0 + \x9A\x5A |0 + \x9A\x5B |0 + \x9A\x5C |0 + \x9A\x5D |0 + \x9A\x5E |0 + \x9A\x5F |0 + \x9A\x60 |0 + \x9A\x61 |0 + \x9A\x62 |0 + \x9A\x63 |0 + \x9A\x64 |0 + \x9A\x65 |0 + \x9A\x66 |0 + \x9A\x67 |0 + \x9A\x68 |0 + \x9A\x69 |0 + \x9A\x6A |0 + \x9A\x6B |0 + \x9A\x6C |0 + \x9A\x6D |0 + \x9A\x6E |0 + \x9A\x6F |0 + \x9A\x70 |0 + \x9A\x71 |0 + \x9A\x72 |0 + \x9A\x73 |0 + \x9A\x74 |0 + \x9A\x75 |0 + \x9A\x76 |0 + \x9A\x77 |0 + \x9A\x78 |0 + \x9A\x79 |0 + \x9A\x7A |0 + \x9A\x7B |0 + \x9A\x7C |0 + \x9A\x7D |0 + \x9A\x7E |0 + \x9A\xA1 |0 + \x9A\xA2 |0 + \x9A\xA3 |0 + \x9A\xA4 |0 + \x9A\xA5 |0 + \x9A\xA6 |0 + \x9A\xA7 |0 + \x9A\xA8 |0 + \x9A\xA9 |0 + \x9A\xAA |0 + \x9A\xAB |0 + \x9A\xAC |0 + \x9A\xAD |0 + \x9A\xAE |0 + \x9A\xAF |0 + \x9A\xB0 |0 + \x9A\xB1 |0 + \x9A\xB2 |0 + \x9A\xB3 |0 + \x9A\xB4 |0 + \x9A\xB5 |0 + \x9A\xB6 |0 + \x9A\xB7 |0 + \x9A\xB8 |0 + \x9A\xB9 |0 + \x9A\xBA |0 + \x9A\xBB |0 + \x9A\xBC |0 + \x9A\xBD |0 + \x9A\xBE |0 + \x9A\xBF |0 + \x9A\xC0 |0 + \x9A\xC1 |0 + \x9A\xC2 |0 + \x9A\xC3 |0 + \x9A\xC4 |0 + \x9A\xC5 |0 + \x9A\xC6 |0 + \x9A\xC7 |0 + \x9A\xC8 |0 + \x9A\xC9 |0 + \x9A\xCA |0 + \x9A\xCB |0 + \x9A\xCC |0 + \x9A\xCD |0 + \x9A\xCE |0 + \x9A\xCF |0 + \x9A\xD0 |0 + \x9A\xD1 |0 + \x9A\xD2 |0 + \x9A\xD3 |0 + \x9A\xD4 |0 + \x9A\xD5 |0 + \x9A\xD6 |0 + \x9A\xD7 |0 + \x9A\xD8 |0 + \x9A\xD9 |0 + \x9A\xDA |0 + \x9A\xDB |0 + \x9A\xDC |0 + \x9A\xDD |0 + \x9A\xDE |0 + \x9A\xDF |0 + \x9A\xE0 |0 + \x9A\xE1 |0 + \x9A\xE2 |0 + \x9A\xE3 |0 + \x9A\xE4 |0 + \x9A\xE5 |0 + \x9A\xE6 |0 + \x9A\xE7 |0 + \x9A\xE8 |0 + \x9A\xE9 |0 + \x9A\xEA |0 + \x9A\xEB |0 + \x9A\xEC |0 + \x9A\xED |0 + \x9A\xEE |0 + \x9A\xEF |0 + \x9A\xF0 |0 + \x9A\xF1 |0 + \x9A\xF2 |0 + \x9A\xF3 |0 + \x9A\xF4 |0 + \x9A\xF5 |0 + \x9A\xF6 |0 + \x9A\xF7 |0 + \x9A\xF8 |0 + \x9A\xF9 |0 + \x9A\xFA |0 + \x9A\xFB |0 + \x9A\xFC |0 + \x9A\xFD |0 + \x9A\xFE |0 + \x9B\x40 |0 + \x9B\x41 |0 + \x9B\x42 |0 + \x9B\x43 |0 + \x9B\x44 |0 + \x9B\x45 |0 + \x9B\x46 |0 + \x9B\x47 |0 + \x9B\x48 |0 + \x9B\x49 |0 + \x9B\x4A |0 + \x9B\x4B |0 + \x9B\x4C |0 + \x9B\x4D |0 + \x9B\x4E |0 + \x9B\x4F |0 + \x9B\x50 |0 + \x9B\x51 |0 + \x9B\x52 |0 + \x9B\x53 |0 + \x9B\x54 |0 + \x9B\x55 |0 + \x9B\x56 |0 + \x9B\x57 |0 + \x9B\x58 |0 + \x9B\x59 |0 + \x9B\x5A |0 + \x9B\x5B |0 + \x9B\x5C |0 + \x9B\x5D |0 + \x9B\x5E |0 + \x9B\x5F |0 + \x9B\x60 |0 + \x9B\x61 |0 + \x9B\x62 |0 + \x9B\x63 |0 + \x9B\x64 |0 + \x9B\x65 |0 + \x9B\x66 |0 + \x9B\x67 |0 + \x9B\x68 |0 + \x9B\x69 |0 + \x9B\x6A |0 + \x9B\x6B |0 + \x9B\x6C |0 + \x9B\x6D |0 + \x9B\x6E |0 + \x9B\x6F |0 + \x9B\x70 |0 + \x9B\x71 |0 + \x9B\x72 |0 + \x9B\x73 |0 + \x9B\x74 |0 + \x9B\x75 |0 + \x9B\x76 |0 + \x9B\x77 |0 + \x9B\x78 |0 + \x9B\x79 |0 + \x9B\x7A |0 + \x9B\x7B |0 + \x9B\x7C |0 + \x9B\x7D |0 + \x9B\x7E |0 + \x9B\xA1 |0 + \x9B\xA2 |0 + \x9B\xA3 |0 + \x9B\xA4 |0 + \x9B\xA5 |0 + \x9B\xA6 |0 + \x9B\xA7 |0 + \x9B\xA8 |0 + \x9B\xA9 |0 + \x9B\xAA |0 + \x9B\xAB |0 + \x9B\xAC |0 + \x9B\xAD |0 + \x9B\xAE |0 + \x9B\xAF |0 + \x9B\xB0 |0 + \x9B\xB1 |0 + \x9B\xB2 |0 + \x9B\xB3 |0 + \x9B\xB4 |0 + \x9B\xB5 |0 + \x9B\xB6 |0 + \x9B\xB7 |0 + \x9B\xB8 |0 + \x9B\xB9 |0 + \x9B\xBA |0 + \x9B\xBB |0 + \x9B\xBC |0 + \x9B\xBD |0 + \x9B\xBE |0 + \x9B\xBF |0 + \x9B\xC0 |0 + \x9B\xC1 |0 + \x9B\xC2 |0 + \x9B\xC3 |0 + \x9B\xC4 |0 + \x9B\xC5 |0 + \x9B\xC6 |0 + \x9B\xC7 |0 + \x9B\xC8 |0 + \x9B\xC9 |0 + \x9B\xCA |0 + \x9B\xCB |0 + \x9B\xCC |0 + \x9B\xCD |0 + \x9B\xCE |0 + \x9B\xCF |0 + \x9B\xD0 |0 + \x9B\xD1 |0 + \x9B\xD2 |0 + \x9B\xD3 |0 + \x9B\xD4 |0 + \x9B\xD5 |0 + \x9B\xD6 |0 + \x9B\xD7 |0 + \x9B\xD8 |0 + \x9B\xD9 |0 + \x9B\xDA |0 + \x9B\xDB |0 + \x9B\xDC |0 + \x9B\xDD |0 + \x9B\xDE |0 + \x9B\xDF |0 + \x9B\xE0 |0 + \x9B\xE1 |0 + \x9B\xE2 |0 + \x9B\xE3 |0 + \x9B\xE4 |0 + \x9B\xE5 |0 + \x9B\xE6 |0 + \x9B\xE7 |0 + \x9B\xE8 |0 + \x9B\xE9 |0 + \x9B\xEA |0 + \x9B\xEB |0 + \x9B\xEC |0 + \x9B\xED |0 + \x9B\xEE |0 + \x9B\xEF |0 + \x9B\xF0 |0 + \x9B\xF1 |0 + \x9B\xF2 |0 + \x9B\xF3 |0 + \x9B\xF4 |0 + \x9B\xF5 |0 + \x9B\xF6 |0 + \x9B\xF7 |0 + \x9B\xF8 |0 + \x9B\xF9 |0 + \x9B\xFA |0 + \x9B\xFB |0 + \x9B\xFC |0 + \x9B\xFD |0 + \x9B\xFE |0 + \x9C\x40 |0 + \x9C\x41 |0 + \x9C\x42 |0 + \x9C\x43 |0 + \x9C\x44 |0 + \x9C\x45 |0 + \x9C\x46 |0 + \x9C\x47 |0 + \x9C\x48 |0 + \x9C\x49 |0 + \x9C\x4A |0 + \x9C\x4B |0 + \x9C\x4C |0 + \x9C\x4D |0 + \x9C\x4E |0 + \x9C\x4F |0 + \x9C\x50 |0 + \x9C\x51 |0 + \x9C\x52 |0 + \x9C\x53 |0 + \x9C\x54 |0 + \x9C\x55 |0 + \x9C\x56 |0 + \x9C\x57 |0 + \x9C\x58 |0 + \x9C\x59 |0 + \x9C\x5A |0 + \x9C\x5B |0 + \x9C\x5C |0 + \x9C\x5D |0 + \x9C\x5E |0 + \x9C\x5F |0 + \x9C\x60 |0 + \x9C\x61 |0 + \x9C\x62 |0 + \x9C\x63 |0 + \x9C\x64 |0 + \x9C\x65 |0 + \x9C\x66 |0 + \x9C\x67 |0 + \x9C\x68 |0 + \x9C\x69 |0 + \x9C\x6A |0 + \x9C\x6B |0 + \x9C\x6C |0 + \x9C\x6D |0 + \x9C\x6E |0 + \x9C\x6F |0 + \x9C\x70 |0 + \x9C\x71 |0 + \x9C\x72 |0 + \x9C\x73 |0 + \x9C\x74 |0 + \x9C\x75 |0 + \x9C\x76 |0 + \x9C\x77 |0 + \x9C\x78 |0 + \x9C\x79 |0 + \x9C\x7A |0 + \x9C\x7B |0 + \x9C\x7C |0 + \x9C\x7D |0 + \x9C\x7E |0 + \x9C\xA1 |0 + \x9C\xA2 |0 + \x9C\xA3 |0 + \x9C\xA4 |0 + \x9C\xA5 |0 + \x9C\xA6 |0 + \x9C\xA7 |0 + \x9C\xA8 |0 + \x9C\xA9 |0 + \x9C\xAA |0 + \x9C\xAB |0 + \x9C\xAC |0 + \x9C\xAD |0 + \x9C\xAE |0 + \x9C\xAF |0 + \x9C\xB0 |0 + \x9C\xB1 |0 + \x9C\xB2 |0 + \x9C\xB3 |0 + \x9C\xB4 |0 + \x9C\xB5 |0 + \x9C\xB6 |0 + \x9C\xB7 |0 + \x9C\xB8 |0 + \x9C\xB9 |0 + \x9C\xBA |0 + \x9C\xBB |0 + \x9C\xBC |0 + \x9C\xBD |0 + \x9C\xBE |0 + \x9C\xBF |0 + \x9C\xC0 |0 + \x9C\xC1 |0 + \x9C\xC2 |0 + \x9C\xC3 |0 + \x9C\xC4 |0 + \x9C\xC5 |0 + \x9C\xC6 |0 + \x9C\xC7 |0 + \x9C\xC8 |0 + \x9C\xC9 |0 + \x9C\xCA |0 + \x9C\xCB |0 + \x9C\xCC |0 + \x9C\xCD |0 + \x9C\xCE |0 + \x9C\xCF |0 + \x9C\xD0 |0 + \x9C\xD1 |0 + \x9C\xD2 |0 + \x9C\xD3 |0 + \x9C\xD4 |0 + \x9C\xD5 |0 + \x9C\xD6 |0 + \x9C\xD7 |0 + \x9C\xD8 |0 + \x9C\xD9 |0 + \x9C\xDA |0 + \x9C\xDB |0 + \x9C\xDC |0 + \x9C\xDD |0 + \x9C\xDE |0 + \x9C\xDF |0 + \x9C\xE0 |0 + \x9C\xE1 |0 + \x9C\xE2 |0 + \x9C\xE3 |0 + \x9C\xE4 |0 + \x9C\xE5 |0 + \x9C\xE6 |0 + \x9C\xE7 |0 + \x9C\xE8 |0 + \x9C\xE9 |0 + \x9C\xEA |0 + \x9C\xEB |0 + \x9C\xEC |0 + \x9C\xED |0 + \x9C\xEE |0 + \x9C\xEF |0 + \x9C\xF0 |0 + \x9C\xF1 |0 + \x9C\xF2 |0 + \x9C\xF3 |0 + \x9C\xF4 |0 + \x9C\xF5 |0 + \x9C\xF6 |0 + \x9C\xF7 |0 + \x9C\xF8 |0 + \x9C\xF9 |0 + \x9C\xFA |0 + \x9C\xFB |0 + \x9C\xFC |0 + \x9C\xFD |0 + \x9C\xFE |0 + \x9D\x40 |0 + \x9D\x41 |0 + \x9D\x42 |0 + \x9D\x43 |0 + \x9D\x44 |0 + \x9D\x45 |0 + \x9D\x46 |0 + \x9D\x47 |0 + \x9D\x48 |0 + \x9D\x49 |0 + \x9D\x4A |0 + \x9D\x4B |0 + \x9D\x4C |0 + \x9D\x4D |0 + \x9D\x4E |0 + \x9D\x4F |0 + \x9D\x50 |0 + \x9D\x51 |0 + \x9D\x52 |0 + \x9D\x53 |0 + \x9D\x54 |0 + \x9D\x55 |0 + \x9D\x56 |0 + \x9D\x57 |0 + \x9D\x58 |0 + \x9D\x59 |0 + \x9D\x5A |0 + \x9D\x5B |0 + \x9D\x5C |0 + \x9D\x5D |0 + \x9D\x5E |0 + \x9D\x5F |0 + \x9D\x60 |0 + \x9D\x61 |0 + \x9D\x62 |0 + \x9D\x63 |0 + \x9D\x64 |0 + \x9D\x65 |0 + \x9D\x66 |0 + \x9D\x67 |0 + \x9D\x68 |0 + \x9D\x69 |0 + \x9D\x6A |0 + \x9D\x6B |0 + \x9D\x6C |0 + \x9D\x6D |0 + \x9D\x6E |0 + \x9D\x6F |0 + \x9D\x70 |0 + \x9D\x71 |0 + \x9D\x72 |0 + \x9D\x73 |0 + \x9D\x74 |0 + \x9D\x75 |0 + \x9D\x76 |0 + \x9D\x77 |0 + \x9D\x78 |0 + \x9D\x79 |0 + \x9D\x7A |0 + \x9D\x7B |0 + \x9D\x7C |0 + \x9D\x7D |0 + \x9D\x7E |0 + \x9D\xA1 |0 + \x9D\xA2 |0 + \x9D\xA3 |0 + \x9D\xA4 |0 + \x9D\xA5 |0 + \x9D\xA6 |0 + \x9D\xA7 |0 + \x9D\xA8 |0 + \x9D\xA9 |0 + \x9D\xAA |0 + \x9D\xAB |0 + \x9D\xAC |0 + \x9D\xAD |0 + \x9D\xAE |0 + \x9D\xAF |0 + \x9D\xB0 |0 + \x9D\xB1 |0 + \x9D\xB2 |0 + \x9D\xB3 |0 + \x9D\xB4 |0 + \x9D\xB5 |0 + \x9D\xB6 |0 + \x9D\xB7 |0 + \x9D\xB8 |0 + \x9D\xB9 |0 + \x9D\xBA |0 + \x9D\xBB |0 + \x9D\xBC |0 + \x9D\xBD |0 + \x9D\xBE |0 + \x9D\xBF |0 + \x9D\xC0 |0 + \x9D\xC1 |0 + \x9D\xC2 |0 + \x9D\xC3 |0 + \x9D\xC4 |0 + \x9D\xC5 |0 + \x9D\xC6 |0 + \x9D\xC7 |0 + \x9D\xC8 |0 + \x9D\xC9 |0 + \x9D\xCA |0 + \x9D\xCB |0 + \x9D\xCC |0 + \x9D\xCD |0 + \x9D\xCE |0 + \x9D\xCF |0 + \x9D\xD0 |0 + \x9D\xD1 |0 + \x9D\xD2 |0 + \x9D\xD3 |0 + \x9D\xD4 |0 + \x9D\xD5 |0 + \x9D\xD6 |0 + \x9D\xD7 |0 + \x9D\xD8 |0 + \x9D\xD9 |0 + \x9D\xDA |0 + \x9D\xDB |0 + \x9D\xDC |0 + \x9D\xDD |0 + \x9D\xDE |0 + \x9D\xDF |0 + \x9D\xE0 |0 + \x9D\xE1 |0 + \x9D\xE2 |0 + \x9D\xE3 |0 + \x9D\xE4 |0 + \x9D\xE5 |0 + \x9D\xE6 |0 + \x9D\xE7 |0 + \x9D\xE8 |0 + \x9D\xE9 |0 + \x9D\xEA |0 + \x9D\xEB |0 + \x9D\xEC |0 + \x9D\xED |0 + \x9D\xEE |0 + \x9D\xEF |0 + \x9D\xF0 |0 + \x9D\xF1 |0 + \x9D\xF2 |0 + \x9D\xF3 |0 + \x9D\xF4 |0 + \x9D\xF5 |0 + \x9D\xF6 |0 + \x9D\xF7 |0 + \x9D\xF8 |0 + \x9D\xF9 |0 + \x9D\xFA |0 + \x9D\xFB |0 + \x9D\xFC |0 + \x9D\xFD |0 + \x9D\xFE |0 + \x9E\x40 |0 + \x9E\x41 |0 + \x9E\x42 |0 + \x9E\x43 |0 + \x9E\x44 |0 + \x9E\x45 |0 + \x9E\x46 |0 + \x9E\x47 |0 + \x9E\x48 |0 + \x9E\x49 |0 + \x9E\x4A |0 + \x9E\x4B |0 + \x9E\x4C |0 + \x9E\x4D |0 + \x9E\x4E |0 + \x9E\x4F |0 + \x9E\x50 |0 + \x9E\x51 |0 + \x9E\x52 |0 + \x9E\x53 |0 + \x9E\x54 |0 + \x9E\x55 |0 + \x9E\x56 |0 + \x9E\x57 |0 + \x9E\x58 |0 + \x9E\x59 |0 + \x9E\x5A |0 + \x9E\x5B |0 + \x9E\x5C |0 + \x9E\x5D |0 + \x9E\x5E |0 + \x9E\x5F |0 + \x9E\x60 |0 + \x9E\x61 |0 + \x9E\x62 |0 + \x9E\x63 |0 + \x9E\x64 |0 + \x9E\x65 |0 + \x9E\x66 |0 + \x9E\x67 |0 + \x9E\x68 |0 + \x9E\x69 |0 + \x9E\x6A |0 + \x9E\x6B |0 + \x9E\x6C |0 + \x9E\x6D |0 + \x9E\x6E |0 + \x9E\x6F |0 + \x9E\x70 |0 + \x9E\x71 |0 + \x9E\x72 |0 + \x9E\x73 |0 + \x9E\x74 |0 + \x9E\x75 |0 + \x9E\x76 |0 + \x9E\x77 |0 + \x9E\x78 |0 + \x9E\x79 |0 + \x9E\x7A |0 + \x9E\x7B |0 + \x9E\x7C |0 + \x9E\x7D |0 + \x9E\x7E |0 + \x9E\xA1 |0 + \x9E\xA2 |0 + \x9E\xA3 |0 + \x9E\xA4 |0 + \x9E\xA5 |0 + \x9E\xA6 |0 + \x9E\xA7 |0 + \x9E\xA8 |0 + \x9E\xA9 |0 + \x9E\xAA |0 + \x9E\xAB |0 + \x9E\xAC |0 + \x9E\xAD |0 + \x9E\xAE |0 + \x9E\xAF |0 + \x9E\xB0 |0 + \x9E\xB1 |0 + \x9E\xB2 |0 + \x9E\xB3 |0 + \x9E\xB4 |0 + \x9E\xB5 |0 + \x9E\xB6 |0 + \x9E\xB7 |0 + \x9E\xB8 |0 + \x9E\xB9 |0 + \x9E\xBA |0 + \x9E\xBB |0 + \x9E\xBC |0 + \x9E\xBD |0 + \x9E\xBE |0 + \x9E\xBF |0 + \x9E\xC0 |0 + \x9E\xC1 |0 + \x9E\xC2 |0 + \x9E\xC3 |0 + \x9E\xC4 |0 + \x9E\xC5 |0 + \x9E\xC6 |0 + \x9E\xC7 |0 + \x9E\xC8 |0 + \x9E\xC9 |0 + \x9E\xCA |0 + \x9E\xCB |0 + \x9E\xCC |0 + \x9E\xCD |0 + \x9E\xCE |0 + \x9E\xCF |0 + \x9E\xD0 |0 + \x9E\xD1 |0 + \x9E\xD2 |0 + \x9E\xD3 |0 + \x9E\xD4 |0 + \x9E\xD5 |0 + \x9E\xD6 |0 + \x9E\xD7 |0 + \x9E\xD8 |0 + \x9E\xD9 |0 + \x9E\xDA |0 + \x9E\xDB |0 + \x9E\xDC |0 + \x9E\xDD |0 + \x9E\xDE |0 + \x9E\xDF |0 + \x9E\xE0 |0 + \x9E\xE1 |0 + \x9E\xE2 |0 + \x9E\xE3 |0 + \x9E\xE4 |0 + \x9E\xE5 |0 + \x9E\xE6 |0 + \x9E\xE7 |0 + \x9E\xE8 |0 + \x9E\xE9 |0 + \x9E\xEA |0 + \x9E\xEB |0 + \x9E\xEC |0 + \x9E\xED |0 + \x9E\xEE |0 + \x9E\xEF |0 + \x9E\xF0 |0 + \x9E\xF1 |0 + \x9E\xF2 |0 + \x9E\xF3 |0 + \x9E\xF4 |0 + \x9E\xF5 |0 + \x9E\xF6 |0 + \x9E\xF7 |0 + \x9E\xF8 |0 + \x9E\xF9 |0 + \x9E\xFA |0 + \x9E\xFB |0 + \x9E\xFC |0 + \x9E\xFD |0 + \x9E\xFE |0 + \x9F\x40 |0 + \x9F\x41 |0 + \x9F\x42 |0 + \x9F\x43 |0 + \x9F\x44 |0 + \x9F\x45 |0 + \x9F\x46 |0 + \x9F\x47 |0 + \x9F\x48 |0 + \x9F\x49 |0 + \x9F\x4A |0 + \x9F\x4B |0 + \x9F\x4C |0 + \x9F\x4D |0 + \x9F\x4E |0 + \x9F\x4F |0 + \x9F\x50 |0 + \x9F\x51 |0 + \x9F\x52 |0 + \x9F\x53 |0 + \x9F\x54 |0 + \x9F\x55 |0 + \x9F\x56 |0 + \x9F\x57 |0 + \x9F\x58 |0 + \x9F\x59 |0 + \x9F\x5A |0 + \x9F\x5B |0 + \x9F\x5C |0 + \x9F\x5D |0 + \x9F\x5E |0 + \x9F\x5F |0 + \x9F\x60 |0 + \x9F\x61 |0 + \x9F\x62 |0 + \x9F\x63 |0 + \x9F\x64 |0 + \x9F\x65 |0 + \x9F\x66 |0 + \x9F\x67 |0 + \x9F\x68 |0 + \x9F\x69 |0 + \x9F\x6A |0 + \x9F\x6B |0 + \x9F\x6C |0 + \x9F\x6D |0 + \x9F\x6E |0 + \x9F\x6F |0 + \x9F\x70 |0 + \x9F\x71 |0 + \x9F\x72 |0 + \x9F\x73 |0 + \x9F\x74 |0 + \x9F\x75 |0 + \x9F\x76 |0 + \x9F\x77 |0 + \x9F\x78 |0 + \x9F\x79 |0 + \x9F\x7A |0 + \x9F\x7B |0 + \x9F\x7C |0 + \x9F\x7D |0 + \x9F\x7E |0 + \x9F\xA1 |0 + \x9F\xA2 |0 + \x9F\xA3 |0 + \x9F\xA4 |0 + \x9F\xA5 |0 + \x9F\xA6 |0 + \x9F\xA7 |0 + \x9F\xA8 |0 + \x9F\xA9 |0 + \x9F\xAA |0 + \x9F\xAB |0 + \x9F\xAC |0 + \x9F\xAD |0 + \x9F\xAE |0 + \x9F\xAF |0 + \x9F\xB0 |0 + \x9F\xB1 |0 + \x9F\xB2 |0 + \x9F\xB3 |0 + \x9F\xB4 |0 + \x9F\xB5 |0 + \x9F\xB6 |0 + \x9F\xB7 |0 + \x9F\xB8 |0 + \x9F\xB9 |0 + \x9F\xBA |0 + \x9F\xBB |0 + \x9F\xBC |0 + \x9F\xBD |0 + \x9F\xBE |0 + \x9F\xBF |0 + \x9F\xC0 |0 + \x9F\xC1 |0 + \x9F\xC2 |0 + \x9F\xC3 |0 + \x9F\xC4 |0 + \x9F\xC5 |0 + \x9F\xC6 |0 + \x9F\xC7 |0 + \x9F\xC8 |0 + \x9F\xC9 |0 + \x9F\xCA |0 + \x9F\xCB |0 + \x9F\xCC |0 + \x9F\xCD |0 + \x9F\xCE |0 + \x9F\xCF |0 + \x9F\xD0 |0 + \x9F\xD1 |0 + \x9F\xD2 |0 + \x9F\xD3 |0 + \x9F\xD4 |0 + \x9F\xD5 |0 + \x9F\xD6 |0 + \x9F\xD7 |0 + \x9F\xD8 |0 + \x9F\xD9 |0 + \x9F\xDA |0 + \x9F\xDB |0 + \x9F\xDC |0 + \x9F\xDD |0 + \x9F\xDE |0 + \x9F\xDF |0 + \x9F\xE0 |0 + \x9F\xE1 |0 + \x9F\xE2 |0 + \x9F\xE3 |0 + \x9F\xE4 |0 + \x9F\xE5 |0 + \x9F\xE6 |0 + \x9F\xE7 |0 + \x9F\xE8 |0 + \x9F\xE9 |0 + \x9F\xEA |0 + \x9F\xEB |0 + \x9F\xEC |0 + \x9F\xED |0 + \x9F\xEE |0 + \x9F\xEF |0 + \x9F\xF0 |0 + \x9F\xF1 |0 + \x9F\xF2 |0 + \x9F\xF3 |0 + \x9F\xF4 |0 + \x9F\xF5 |0 + \x9F\xF6 |0 + \x9F\xF7 |0 + \x9F\xF8 |0 + \x9F\xF9 |0 + \x9F\xFA |0 + \x9F\xFB |0 + \x9F\xFC |0 + \x9F\xFD |0 + \x9F\xFE |0 + \xA0\x40 |0 + \xA0\x41 |0 + \xA0\x42 |0 + \xA0\x43 |0 + \xA0\x44 |0 + \xA0\x45 |0 + \xA0\x46 |0 + \xA0\x47 |0 + \xA0\x48 |0 + \xA0\x49 |0 + \xA0\x4A |0 + \xA0\x4B |0 + \xA0\x4C |0 + \xA0\x4D |0 + \xA0\x4E |0 + \xA0\x4F |0 + \xA0\x50 |0 + \xA0\x51 |0 + \xA0\x52 |0 + \xA0\x53 |0 + \xA0\x54 |0 + \xA0\x55 |0 + \xA0\x56 |0 + \xA0\x57 |0 + \xA0\x58 |0 + \xA0\x59 |0 + \xA0\x5A |0 + \xA0\x5B |0 + \xA0\x5C |0 + \xA0\x5D |0 + \xA0\x5E |0 + \xA0\x5F |0 + \xA0\x60 |0 + \xA0\x61 |0 + \xA0\x62 |0 + \xA0\x63 |0 + \xA0\x64 |0 + \xA0\x65 |0 + \xA0\x66 |0 + \xA0\x67 |0 + \xA0\x68 |0 + \xA0\x69 |0 + \xA0\x6A |0 + \xA0\x6B |0 + \xA0\x6C |0 + \xA0\x6D |0 + \xA0\x6E |0 + \xA0\x6F |0 + \xA0\x70 |0 + \xA0\x71 |0 + \xA0\x72 |0 + \xA0\x73 |0 + \xA0\x74 |0 + \xA0\x75 |0 + \xA0\x76 |0 + \xA0\x77 |0 + \xA0\x78 |0 + \xA0\x79 |0 + \xA0\x7A |0 + \xA0\x7B |0 + \xA0\x7C |0 + \xA0\x7D |0 + \xA0\x7E |0 + \xA0\xA1 |0 + \xA0\xA2 |0 + \xA0\xA3 |0 + \xA0\xA4 |0 + \xA0\xA5 |0 + \xA0\xA6 |0 + \xA0\xA7 |0 + \xA0\xA8 |0 + \xA0\xA9 |0 + \xA0\xAA |0 + \xA0\xAB |0 + \xA0\xAC |0 + \xA0\xAD |0 + \xA0\xAE |0 + \xA0\xAF |0 + \xA0\xB0 |0 + \xA0\xB1 |0 + \xA0\xB2 |0 + \xA0\xB3 |0 + \xA0\xB4 |0 + \xA0\xB5 |0 + \xA0\xB6 |0 + \xA0\xB7 |0 + \xA0\xB8 |0 + \xA0\xB9 |0 + \xA0\xBA |0 + \xA0\xBB |0 + \xA0\xBC |0 + \xA0\xBD |0 + \xA0\xBE |0 + \xA0\xBF |0 + \xA0\xC0 |0 + \xA0\xC1 |0 + \xA0\xC2 |0 + \xA0\xC3 |0 + \xA0\xC4 |0 + \xA0\xC5 |0 + \xA0\xC6 |0 + \xA0\xC7 |0 + \xA0\xC8 |0 + \xA0\xC9 |0 + \xA0\xCA |0 + \xA0\xCB |0 + \xA0\xCC |0 + \xA0\xCD |0 + \xA0\xCE |0 + \xA0\xCF |0 + \xA0\xD0 |0 + \xA0\xD1 |0 + \xA0\xD2 |0 + \xA0\xD3 |0 + \xA0\xD4 |0 + \xA0\xD5 |0 + \xA0\xD6 |0 + \xA0\xD7 |0 + \xA0\xD8 |0 + \xA0\xD9 |0 + \xA0\xDA |0 + \xA0\xDB |0 + \xA0\xDC |0 + \xA0\xDD |0 + \xA0\xDE |0 + \xA0\xDF |0 + \xA0\xE0 |0 + \xA0\xE1 |0 + \xA0\xE2 |0 + \xA0\xE3 |0 + \xA0\xE4 |0 + \xA0\xE5 |0 + \xA0\xE6 |0 + \xA0\xE7 |0 + \xA0\xE8 |0 + \xA0\xE9 |0 + \xA0\xEA |0 + \xA0\xEB |0 + \xA0\xEC |0 + \xA0\xED |0 + \xA0\xEE |0 + \xA0\xEF |0 + \xA0\xF0 |0 + \xA0\xF1 |0 + \xA0\xF2 |0 + \xA0\xF3 |0 + \xA0\xF4 |0 + \xA0\xF5 |0 + \xA0\xF6 |0 + \xA0\xF7 |0 + \xA0\xF8 |0 + \xA0\xF9 |0 + \xA0\xFA |0 + \xA0\xFB |0 + \xA0\xFC |0 + \xA0\xFD |0 + \xA0\xFE |0 + \x81\x40 |0 + \x81\x41 |0 + \x81\x42 |0 + \x81\x43 |0 + \x81\x44 |0 + \x81\x45 |0 + \x81\x46 |0 + \x81\x47 |0 + \x81\x48 |0 + \x81\x49 |0 + \x81\x4A |0 + \x81\x4B |0 + \x81\x4C |0 + \x81\x4D |0 + \x81\x4E |0 + \x81\x4F |0 + \x81\x50 |0 + \x81\x51 |0 + \x81\x52 |0 + \x81\x53 |0 + \x81\x54 |0 + \x81\x55 |0 + \x81\x56 |0 + \x81\x57 |0 + \x81\x58 |0 + \x81\x59 |0 + \x81\x5A |0 + \x81\x5B |0 + \x81\x5C |0 + \x81\x5D |0 + \x81\x5E |0 + \x81\x5F |0 + \x81\x60 |0 + \x81\x61 |0 + \x81\x62 |0 + \x81\x63 |0 + \x81\x64 |0 + \x81\x65 |0 + \x81\x66 |0 + \x81\x67 |0 + \x81\x68 |0 + \x81\x69 |0 + \x81\x6A |0 + \x81\x6B |0 + \x81\x6C |0 + \x81\x6D |0 + \x81\x6E |0 + \x81\x6F |0 + \x81\x70 |0 + \x81\x71 |0 + \x81\x72 |0 + \x81\x73 |0 + \x81\x74 |0 + \x81\x75 |0 + \x81\x76 |0 + \x81\x77 |0 + \x81\x78 |0 + \x81\x79 |0 + \x81\x7A |0 + \x81\x7B |0 + \x81\x7C |0 + \x81\x7D |0 + \x81\x7E |0 + \x81\xA1 |0 + \x81\xA2 |0 + \x81\xA3 |0 + \x81\xA4 |0 + \x81\xA5 |0 + \x81\xA6 |0 + \x81\xA7 |0 + \x81\xA8 |0 + \x81\xA9 |0 + \x81\xAA |0 + \x81\xAB |0 + \x81\xAC |0 + \x81\xAD |0 + \x81\xAE |0 + \x81\xAF |0 + \x81\xB0 |0 + \x81\xB1 |0 + \x81\xB2 |0 + \x81\xB3 |0 + \x81\xB4 |0 + \x81\xB5 |0 + \x81\xB6 |0 + \x81\xB7 |0 + \x81\xB8 |0 + \x81\xB9 |0 + \x81\xBA |0 + \x81\xBB |0 + \x81\xBC |0 + \x81\xBD |0 + \x81\xBE |0 + \x81\xBF |0 + \x81\xC0 |0 + \x81\xC1 |0 + \x81\xC2 |0 + \x81\xC3 |0 + \x81\xC4 |0 + \x81\xC5 |0 + \x81\xC6 |0 + \x81\xC7 |0 + \x81\xC8 |0 + \x81\xC9 |0 + \x81\xCA |0 + \x81\xCB |0 + \x81\xCC |0 + \x81\xCD |0 + \x81\xCE |0 + \x81\xCF |0 + \x81\xD0 |0 + \x81\xD1 |0 + \x81\xD2 |0 + \x81\xD3 |0 + \x81\xD4 |0 + \x81\xD5 |0 + \x81\xD6 |0 + \x81\xD7 |0 + \x81\xD8 |0 + \x81\xD9 |0 + \x81\xDA |0 + \x81\xDB |0 + \x81\xDC |0 + \x81\xDD |0 + \x81\xDE |0 + \x81\xDF |0 + \x81\xE0 |0 + \x81\xE1 |0 + \x81\xE2 |0 + \x81\xE3 |0 + \x81\xE4 |0 + \x81\xE5 |0 + \x81\xE6 |0 + \x81\xE7 |0 + \x81\xE8 |0 + \x81\xE9 |0 + \x81\xEA |0 + \x81\xEB |0 + \x81\xEC |0 + \x81\xED |0 + \x81\xEE |0 + \x81\xEF |0 + \x81\xF0 |0 + \x81\xF1 |0 + \x81\xF2 |0 + \x81\xF3 |0 + \x81\xF4 |0 + \x81\xF5 |0 + \x81\xF6 |0 + \x81\xF7 |0 + \x81\xF8 |0 + \x81\xF9 |0 + \x81\xFA |0 + \x81\xFB |0 + \x81\xFC |0 + \x81\xFD |0 + \x81\xFE |0 + \x82\x40 |0 + \x82\x41 |0 + \x82\x42 |0 + \x82\x43 |0 + \x82\x44 |0 + \x82\x45 |0 + \x82\x46 |0 + \x82\x47 |0 + \x82\x48 |0 + \x82\x49 |0 + \x82\x4A |0 + \x82\x4B |0 + \x82\x4C |0 + \x82\x4D |0 + \x82\x4E |0 + \x82\x4F |0 + \x82\x50 |0 + \x82\x51 |0 + \x82\x52 |0 + \x82\x53 |0 + \x82\x54 |0 + \x82\x55 |0 + \x82\x56 |0 + \x82\x57 |0 + \x82\x58 |0 + \x82\x59 |0 + \x82\x5A |0 + \x82\x5B |0 + \x82\x5C |0 + \x82\x5D |0 + \x82\x5E |0 + \x82\x5F |0 + \x82\x60 |0 + \x82\x61 |0 + \x82\x62 |0 + \x82\x63 |0 + \x82\x64 |0 + \x82\x65 |0 + \x82\x66 |0 + \x82\x67 |0 + \x82\x68 |0 + \x82\x69 |0 + \x82\x6A |0 + \x82\x6B |0 + \x82\x6C |0 + \x82\x6D |0 + \x82\x6E |0 + \x82\x6F |0 + \x82\x70 |0 + \x82\x71 |0 + \x82\x72 |0 + \x82\x73 |0 + \x82\x74 |0 + \x82\x75 |0 + \x82\x76 |0 + \x82\x77 |0 + \x82\x78 |0 + \x82\x79 |0 + \x82\x7A |0 + \x82\x7B |0 + \x82\x7C |0 + \x82\x7D |0 + \x82\x7E |0 + \x82\xA1 |0 + \x82\xA2 |0 + \x82\xA3 |0 + \x82\xA4 |0 + \x82\xA5 |0 + \x82\xA6 |0 + \x82\xA7 |0 + \x82\xA8 |0 + \x82\xA9 |0 + \x82\xAA |0 + \x82\xAB |0 + \x82\xAC |0 + \x82\xAD |0 + \x82\xAE |0 + \x82\xAF |0 + \x82\xB0 |0 + \x82\xB1 |0 + \x82\xB2 |0 + \x82\xB3 |0 + \x82\xB4 |0 + \x82\xB5 |0 + \x82\xB6 |0 + \x82\xB7 |0 + \x82\xB8 |0 + \x82\xB9 |0 + \x82\xBA |0 + \x82\xBB |0 + \x82\xBC |0 + \x82\xBD |0 + \x82\xBE |0 + \x82\xBF |0 + \x82\xC0 |0 + \x82\xC1 |0 + \x82\xC2 |0 + \x82\xC3 |0 + \x82\xC4 |0 + \x82\xC5 |0 + \x82\xC6 |0 + \x82\xC7 |0 + \x82\xC8 |0 + \x82\xC9 |0 + \x82\xCA |0 + \x82\xCB |0 + \x82\xCC |0 + \x82\xCD |0 + \x82\xCE |0 + \x82\xCF |0 + \x82\xD0 |0 + \x82\xD1 |0 + \x82\xD2 |0 + \x82\xD3 |0 + \x82\xD4 |0 + \x82\xD5 |0 + \x82\xD6 |0 + \x82\xD7 |0 + \x82\xD8 |0 + \x82\xD9 |0 + \x82\xDA |0 + \x82\xDB |0 + \x82\xDC |0 + \x82\xDD |0 + \x82\xDE |0 + \x82\xDF |0 + \x82\xE0 |0 + \x82\xE1 |0 + \x82\xE2 |0 + \x82\xE3 |0 + \x82\xE4 |0 + \x82\xE5 |0 + \x82\xE6 |0 + \x82\xE7 |0 + \x82\xE8 |0 + \x82\xE9 |0 + \x82\xEA |0 + \x82\xEB |0 + \x82\xEC |0 + \x82\xED |0 + \x82\xEE |0 + \x82\xEF |0 + \x82\xF0 |0 + \x82\xF1 |0 + \x82\xF2 |0 + \x82\xF3 |0 + \x82\xF4 |0 + \x82\xF5 |0 + \x82\xF6 |0 + \x82\xF7 |0 + \x82\xF8 |0 + \x82\xF9 |0 + \x82\xFA |0 + \x82\xFB |0 + \x82\xFC |0 + \x82\xFD |0 + \x82\xFE |0 + \x83\x40 |0 + \x83\x41 |0 + \x83\x42 |0 + \x83\x43 |0 + \x83\x44 |0 + \x83\x45 |0 + \x83\x46 |0 + \x83\x47 |0 + \x83\x48 |0 + \x83\x49 |0 + \x83\x4A |0 + \x83\x4B |0 + \x83\x4C |0 + \x83\x4D |0 + \x83\x4E |0 + \x83\x4F |0 + \x83\x50 |0 + \x83\x51 |0 + \x83\x52 |0 + \x83\x53 |0 + \x83\x54 |0 + \x83\x55 |0 + \x83\x56 |0 + \x83\x57 |0 + \x83\x58 |0 + \x83\x59 |0 + \x83\x5A |0 + \x83\x5B |0 + \x83\x5C |0 + \x83\x5D |0 + \x83\x5E |0 + \x83\x5F |0 + \x83\x60 |0 + \x83\x61 |0 + \x83\x62 |0 + \x83\x63 |0 + \x83\x64 |0 + \x83\x65 |0 + \x83\x66 |0 + \x83\x67 |0 + \x83\x68 |0 + \x83\x69 |0 + \x83\x6A |0 + \x83\x6B |0 + \x83\x6C |0 + \x83\x6D |0 + \x83\x6E |0 + \x83\x6F |0 + \x83\x70 |0 + \x83\x71 |0 + \x83\x72 |0 + \x83\x73 |0 + \x83\x74 |0 + \x83\x75 |0 + \x83\x76 |0 + \x83\x77 |0 + \x83\x78 |0 + \x83\x79 |0 + \x83\x7A |0 + \x83\x7B |0 + \x83\x7C |0 + \x83\x7D |0 + \x83\x7E |0 + \x83\xA1 |0 + \x83\xA2 |0 + \x83\xA3 |0 + \x83\xA4 |0 + \x83\xA5 |0 + \x83\xA6 |0 + \x83\xA7 |0 + \x83\xA8 |0 + \x83\xA9 |0 + \x83\xAA |0 + \x83\xAB |0 + \x83\xAC |0 + \x83\xAD |0 + \x83\xAE |0 + \x83\xAF |0 + \x83\xB0 |0 + \x83\xB1 |0 + \x83\xB2 |0 + \x83\xB3 |0 + \x83\xB4 |0 + \x83\xB5 |0 + \x83\xB6 |0 + \x83\xB7 |0 + \x83\xB8 |0 + \x83\xB9 |0 + \x83\xBA |0 + \x83\xBB |0 + \x83\xBC |0 + \x83\xBD |0 + \x83\xBE |0 + \x83\xBF |0 + \x83\xC0 |0 + \x83\xC1 |0 + \x83\xC2 |0 + \x83\xC3 |0 + \x83\xC4 |0 + \x83\xC5 |0 + \x83\xC6 |0 + \x83\xC7 |0 + \x83\xC8 |0 + \x83\xC9 |0 + \x83\xCA |0 + \x83\xCB |0 + \x83\xCC |0 + \x83\xCD |0 + \x83\xCE |0 + \x83\xCF |0 + \x83\xD0 |0 + \x83\xD1 |0 + \x83\xD2 |0 + \x83\xD3 |0 + \x83\xD4 |0 + \x83\xD5 |0 + \x83\xD6 |0 + \x83\xD7 |0 + \x83\xD8 |0 + \x83\xD9 |0 + \x83\xDA |0 + \x83\xDB |0 + \x83\xDC |0 + \x83\xDD |0 + \x83\xDE |0 + \x83\xDF |0 + \x83\xE0 |0 + \x83\xE1 |0 + \x83\xE2 |0 + \x83\xE3 |0 + \x83\xE4 |0 + \x83\xE5 |0 + \x83\xE6 |0 + \x83\xE7 |0 + \x83\xE8 |0 + \x83\xE9 |0 + \x83\xEA |0 + \x83\xEB |0 + \x83\xEC |0 + \x83\xED |0 + \x83\xEE |0 + \x83\xEF |0 + \x83\xF0 |0 + \x83\xF1 |0 + \x83\xF2 |0 + \x83\xF3 |0 + \x83\xF4 |0 + \x83\xF5 |0 + \x83\xF6 |0 + \x83\xF7 |0 + \x83\xF8 |0 + \x83\xF9 |0 + \x83\xFA |0 + \x83\xFB |0 + \x83\xFC |0 + \x83\xFD |0 + \x83\xFE |0 + \x84\x40 |0 + \x84\x41 |0 + \x84\x42 |0 + \x84\x43 |0 + \x84\x44 |0 + \x84\x45 |0 + \x84\x46 |0 + \x84\x47 |0 + \x84\x48 |0 + \x84\x49 |0 + \x84\x4A |0 + \x84\x4B |0 + \x84\x4C |0 + \x84\x4D |0 + \x84\x4E |0 + \x84\x4F |0 + \x84\x50 |0 + \x84\x51 |0 + \x84\x52 |0 + \x84\x53 |0 + \x84\x54 |0 + \x84\x55 |0 + \x84\x56 |0 + \x84\x57 |0 + \x84\x58 |0 + \x84\x59 |0 + \x84\x5A |0 + \x84\x5B |0 + \x84\x5C |0 + \x84\x5D |0 + \x84\x5E |0 + \x84\x5F |0 + \x84\x60 |0 + \x84\x61 |0 + \x84\x62 |0 + \x84\x63 |0 + \x84\x64 |0 + \x84\x65 |0 + \x84\x66 |0 + \x84\x67 |0 + \x84\x68 |0 + \x84\x69 |0 + \x84\x6A |0 + \x84\x6B |0 + \x84\x6C |0 + \x84\x6D |0 + \x84\x6E |0 + \x84\x6F |0 + \x84\x70 |0 + \x84\x71 |0 + \x84\x72 |0 + \x84\x73 |0 + \x84\x74 |0 + \x84\x75 |0 + \x84\x76 |0 + \x84\x77 |0 + \x84\x78 |0 + \x84\x79 |0 + \x84\x7A |0 + \x84\x7B |0 + \x84\x7C |0 + \x84\x7D |0 + \x84\x7E |0 + \x84\xA1 |0 + \x84\xA2 |0 + \x84\xA3 |0 + \x84\xA4 |0 + \x84\xA5 |0 + \x84\xA6 |0 + \x84\xA7 |0 + \x84\xA8 |0 + \x84\xA9 |0 + \x84\xAA |0 + \x84\xAB |0 + \x84\xAC |0 + \x84\xAD |0 + \x84\xAE |0 + \x84\xAF |0 + \x84\xB0 |0 + \x84\xB1 |0 + \x84\xB2 |0 + \x84\xB3 |0 + \x84\xB4 |0 + \x84\xB5 |0 + \x84\xB6 |0 + \x84\xB7 |0 + \x84\xB8 |0 + \x84\xB9 |0 + \x84\xBA |0 + \x84\xBB |0 + \x84\xBC |0 + \x84\xBD |0 + \x84\xBE |0 + \x84\xBF |0 + \x84\xC0 |0 + \x84\xC1 |0 + \x84\xC2 |0 + \x84\xC3 |0 + \x84\xC4 |0 + \x84\xC5 |0 + \x84\xC6 |0 + \x84\xC7 |0 + \x84\xC8 |0 + \x84\xC9 |0 + \x84\xCA |0 + \x84\xCB |0 + \x84\xCC |0 + \x84\xCD |0 + \x84\xCE |0 + \x84\xCF |0 + \x84\xD0 |0 + \x84\xD1 |0 + \x84\xD2 |0 + \x84\xD3 |0 + \x84\xD4 |0 + \x84\xD5 |0 + \x84\xD6 |0 + \x84\xD7 |0 + \x84\xD8 |0 + \x84\xD9 |0 + \x84\xDA |0 + \x84\xDB |0 + \x84\xDC |0 + \x84\xDD |0 + \x84\xDE |0 + \x84\xDF |0 + \x84\xE0 |0 + \x84\xE1 |0 + \x84\xE2 |0 + \x84\xE3 |0 + \x84\xE4 |0 + \x84\xE5 |0 + \x84\xE6 |0 + \x84\xE7 |0 + \x84\xE8 |0 + \x84\xE9 |0 + \x84\xEA |0 + \x84\xEB |0 + \x84\xEC |0 + \x84\xED |0 + \x84\xEE |0 + \x84\xEF |0 + \x84\xF0 |0 + \x84\xF1 |0 + \x84\xF2 |0 + \x84\xF3 |0 + \x84\xF4 |0 + \x84\xF5 |0 + \x84\xF6 |0 + \x84\xF7 |0 + \x84\xF8 |0 + \x84\xF9 |0 + \x84\xFA |0 + \x84\xFB |0 + \x84\xFC |0 + \x84\xFD |0 + \x84\xFE |0 + \x85\x40 |0 + \x85\x41 |0 + \x85\x42 |0 + \x85\x43 |0 + \x85\x44 |0 + \x85\x45 |0 + \x85\x46 |0 + \x85\x47 |0 + \x85\x48 |0 + \x85\x49 |0 + \x85\x4A |0 + \x85\x4B |0 + \x85\x4C |0 + \x85\x4D |0 + \x85\x4E |0 + \x85\x4F |0 + \x85\x50 |0 + \x85\x51 |0 + \x85\x52 |0 + \x85\x53 |0 + \x85\x54 |0 + \x85\x55 |0 + \x85\x56 |0 + \x85\x57 |0 + \x85\x58 |0 + \x85\x59 |0 + \x85\x5A |0 + \x85\x5B |0 + \x85\x5C |0 + \x85\x5D |0 + \x85\x5E |0 + \x85\x5F |0 + \x85\x60 |0 + \x85\x61 |0 + \x85\x62 |0 + \x85\x63 |0 + \x85\x64 |0 + \x85\x65 |0 + \x85\x66 |0 + \x85\x67 |0 + \x85\x68 |0 + \x85\x69 |0 + \x85\x6A |0 + \x85\x6B |0 + \x85\x6C |0 + \x85\x6D |0 + \x85\x6E |0 + \x85\x6F |0 + \x85\x70 |0 + \x85\x71 |0 + \x85\x72 |0 + \x85\x73 |0 + \x85\x74 |0 + \x85\x75 |0 + \x85\x76 |0 + \x85\x77 |0 + \x85\x78 |0 + \x85\x79 |0 + \x85\x7A |0 + \x85\x7B |0 + \x85\x7C |0 + \x85\x7D |0 + \x85\x7E |0 + \x85\xA1 |0 + \x85\xA2 |0 + \x85\xA3 |0 + \x85\xA4 |0 + \x85\xA5 |0 + \x85\xA6 |0 + \x85\xA7 |0 + \x85\xA8 |0 + \x85\xA9 |0 + \x85\xAA |0 + \x85\xAB |0 + \x85\xAC |0 + \x85\xAD |0 + \x85\xAE |0 + \x85\xAF |0 + \x85\xB0 |0 + \x85\xB1 |0 + \x85\xB2 |0 + \x85\xB3 |0 + \x85\xB4 |0 + \x85\xB5 |0 + \x85\xB6 |0 + \x85\xB7 |0 + \x85\xB8 |0 + \x85\xB9 |0 + \x85\xBA |0 + \x85\xBB |0 + \x85\xBC |0 + \x85\xBD |0 + \x85\xBE |0 + \x85\xBF |0 + \x85\xC0 |0 + \x85\xC1 |0 + \x85\xC2 |0 + \x85\xC3 |0 + \x85\xC4 |0 + \x85\xC5 |0 + \x85\xC6 |0 + \x85\xC7 |0 + \x85\xC8 |0 + \x85\xC9 |0 + \x85\xCA |0 + \x85\xCB |0 + \x85\xCC |0 + \x85\xCD |0 + \x85\xCE |0 + \x85\xCF |0 + \x85\xD0 |0 + \x85\xD1 |0 + \x85\xD2 |0 + \x85\xD3 |0 + \x85\xD4 |0 + \x85\xD5 |0 + \x85\xD6 |0 + \x85\xD7 |0 + \x85\xD8 |0 + \x85\xD9 |0 + \x85\xDA |0 + \x85\xDB |0 + \x85\xDC |0 + \x85\xDD |0 + \x85\xDE |0 + \x85\xDF |0 + \x85\xE0 |0 + \x85\xE1 |0 + \x85\xE2 |0 + \x85\xE3 |0 + \x85\xE4 |0 + \x85\xE5 |0 + \x85\xE6 |0 + \x85\xE7 |0 + \x85\xE8 |0 + \x85\xE9 |0 + \x85\xEA |0 + \x85\xEB |0 + \x85\xEC |0 + \x85\xED |0 + \x85\xEE |0 + \x85\xEF |0 + \x85\xF0 |0 + \x85\xF1 |0 + \x85\xF2 |0 + \x85\xF3 |0 + \x85\xF4 |0 + \x85\xF5 |0 + \x85\xF6 |0 + \x85\xF7 |0 + \x85\xF8 |0 + \x85\xF9 |0 + \x85\xFA |0 + \x85\xFB |0 + \x85\xFC |0 + \x85\xFD |0 + \x85\xFE |0 + \x86\x40 |0 + \x86\x41 |0 + \x86\x42 |0 + \x86\x43 |0 + \x86\x44 |0 + \x86\x45 |0 + \x86\x46 |0 + \x86\x47 |0 + \x86\x48 |0 + \x86\x49 |0 + \x86\x4A |0 + \x86\x4B |0 + \x86\x4C |0 + \x86\x4D |0 + \x86\x4E |0 + \x86\x4F |0 + \x86\x50 |0 + \x86\x51 |0 + \x86\x52 |0 + \x86\x53 |0 + \x86\x54 |0 + \x86\x55 |0 + \x86\x56 |0 + \x86\x57 |0 + \x86\x58 |0 + \x86\x59 |0 + \x86\x5A |0 + \x86\x5B |0 + \x86\x5C |0 + \x86\x5D |0 + \x86\x5E |0 + \x86\x5F |0 + \x86\x60 |0 + \x86\x61 |0 + \x86\x62 |0 + \x86\x63 |0 + \x86\x64 |0 + \x86\x65 |0 + \x86\x66 |0 + \x86\x67 |0 + \x86\x68 |0 + \x86\x69 |0 + \x86\x6A |0 + \x86\x6B |0 + \x86\x6C |0 + \x86\x6D |0 + \x86\x6E |0 + \x86\x6F |0 + \x86\x70 |0 + \x86\x71 |0 + \x86\x72 |0 + \x86\x73 |0 + \x86\x74 |0 + \x86\x75 |0 + \x86\x76 |0 + \x86\x77 |0 + \x86\x78 |0 + \x86\x79 |0 + \x86\x7A |0 + \x86\x7B |0 + \x86\x7C |0 + \x86\x7D |0 + \x86\x7E |0 + \x86\xA1 |0 + \x86\xA2 |0 + \x86\xA3 |0 + \x86\xA4 |0 + \x86\xA5 |0 + \x86\xA6 |0 + \x86\xA7 |0 + \x86\xA8 |0 + \x86\xA9 |0 + \x86\xAA |0 + \x86\xAB |0 + \x86\xAC |0 + \x86\xAD |0 + \x86\xAE |0 + \x86\xAF |0 + \x86\xB0 |0 + \x86\xB1 |0 + \x86\xB2 |0 + \x86\xB3 |0 + \x86\xB4 |0 + \x86\xB5 |0 + \x86\xB6 |0 + \x86\xB7 |0 + \x86\xB8 |0 + \x86\xB9 |0 + \x86\xBA |0 + \x86\xBB |0 + \x86\xBC |0 + \x86\xBD |0 + \x86\xBE |0 + \x86\xBF |0 + \x86\xC0 |0 + \x86\xC1 |0 + \x86\xC2 |0 + \x86\xC3 |0 + \x86\xC4 |0 + \x86\xC5 |0 + \x86\xC6 |0 + \x86\xC7 |0 + \x86\xC8 |0 + \x86\xC9 |0 + \x86\xCA |0 + \x86\xCB |0 + \x86\xCC |0 + \x86\xCD |0 + \x86\xCE |0 + \x86\xCF |0 + \x86\xD0 |0 + \x86\xD1 |0 + \x86\xD2 |0 + \x86\xD3 |0 + \x86\xD4 |0 + \x86\xD5 |0 + \x86\xD6 |0 + \x86\xD7 |0 + \x86\xD8 |0 + \x86\xD9 |0 + \x86\xDA |0 + \x86\xDB |0 + \x86\xDC |0 + \x86\xDD |0 + \x86\xDE |0 + \x86\xDF |0 + \x86\xE0 |0 + \x86\xE1 |0 + \x86\xE2 |0 + \x86\xE3 |0 + \x86\xE4 |0 + \x86\xE5 |0 + \x86\xE6 |0 + \x86\xE7 |0 + \x86\xE8 |0 + \x86\xE9 |0 + \x86\xEA |0 + \x86\xEB |0 + \x86\xEC |0 + \x86\xED |0 + \x86\xEE |0 + \x86\xEF |0 + \x86\xF0 |0 + \x86\xF1 |0 + \x86\xF2 |0 + \x86\xF3 |0 + \x86\xF4 |0 + \x86\xF5 |0 + \x86\xF6 |0 + \x86\xF7 |0 + \x86\xF8 |0 + \x86\xF9 |0 + \x86\xFA |0 + \x86\xFB |0 + \x86\xFC |0 + \x86\xFD |0 + \x86\xFE |0 + \x87\x40 |0 + \x87\x41 |0 + \x87\x42 |0 + \x87\x43 |0 + \x87\x44 |0 + \x87\x45 |0 + \x87\x46 |0 + \x87\x47 |0 + \x87\x48 |0 + \x87\x49 |0 + \x87\x4A |0 + \x87\x4B |0 + \x87\x4C |0 + \x87\x4D |0 + \x87\x4E |0 + \x87\x4F |0 + \x87\x50 |0 + \x87\x51 |0 + \x87\x52 |0 + \x87\x53 |0 + \x87\x54 |0 + \x87\x55 |0 + \x87\x56 |0 + \x87\x57 |0 + \x87\x58 |0 + \x87\x59 |0 + \x87\x5A |0 + \x87\x5B |0 + \x87\x5C |0 + \x87\x5D |0 + \x87\x5E |0 + \x87\x5F |0 + \x87\x60 |0 + \x87\x61 |0 + \x87\x62 |0 + \x87\x63 |0 + \x87\x64 |0 + \x87\x65 |0 + \x87\x66 |0 + \x87\x67 |0 + \x87\x68 |0 + \x87\x69 |0 + \x87\x6A |0 + \x87\x6B |0 + \x87\x6C |0 + \x87\x6D |0 + \x87\x6E |0 + \x87\x6F |0 + \x87\x70 |0 + \x87\x71 |0 + \x87\x72 |0 + \x87\x73 |0 + \x87\x74 |0 + \x87\x75 |0 + \x87\x76 |0 + \x87\x77 |0 + \x87\x78 |0 + \x87\x79 |0 + \x87\x7A |0 + \x87\x7B |0 + \x87\x7C |0 + \x87\x7D |0 + \x87\x7E |0 + \x87\xA1 |0 + \x87\xA2 |0 + \x87\xA3 |0 + \x87\xA4 |0 + \x87\xA5 |0 + \x87\xA6 |0 + \x87\xA7 |0 + \x87\xA8 |0 + \x87\xA9 |0 + \x87\xAA |0 + \x87\xAB |0 + \x87\xAC |0 + \x87\xAD |0 + \x87\xAE |0 + \x87\xAF |0 + \x87\xB0 |0 + \x87\xB1 |0 + \x87\xB2 |0 + \x87\xB3 |0 + \x87\xB4 |0 + \x87\xB5 |0 + \x87\xB6 |0 + \x87\xB7 |0 + \x87\xB8 |0 + \x87\xB9 |0 + \x87\xBA |0 + \x87\xBB |0 + \x87\xBC |0 + \x87\xBD |0 + \x87\xBE |0 + \x87\xBF |0 + \x87\xC0 |0 + \x87\xC1 |0 + \x87\xC2 |0 + \x87\xC3 |0 + \x87\xC4 |0 + \x87\xC5 |0 + \x87\xC6 |0 + \x87\xC7 |0 + \x87\xC8 |0 + \x87\xC9 |0 + \x87\xCA |0 + \x87\xCB |0 + \x87\xCC |0 + \x87\xCD |0 + \x87\xCE |0 + \x87\xCF |0 + \x87\xD0 |0 + \x87\xD1 |0 + \x87\xD2 |0 + \x87\xD3 |0 + \x87\xD4 |0 + \x87\xD5 |0 + \x87\xD6 |0 + \x87\xD7 |0 + \x87\xD8 |0 + \x87\xD9 |0 + \x87\xDA |0 + \x87\xDB |0 + \x87\xDC |0 + \x87\xDD |0 + \x87\xDE |0 + \x87\xDF |0 + \x87\xE0 |0 + \x87\xE1 |0 + \x87\xE2 |0 + \x87\xE3 |0 + \x87\xE4 |0 + \x87\xE5 |0 + \x87\xE6 |0 + \x87\xE7 |0 + \x87\xE8 |0 + \x87\xE9 |0 + \x87\xEA |0 + \x87\xEB |0 + \x87\xEC |0 + \x87\xED |0 + \x87\xEE |0 + \x87\xEF |0 + \x87\xF0 |0 + \x87\xF1 |0 + \x87\xF2 |0 + \x87\xF3 |0 + \x87\xF4 |0 + \x87\xF5 |0 + \x87\xF6 |0 + \x87\xF7 |0 + \x87\xF8 |0 + \x87\xF9 |0 + \x87\xFA |0 + \x87\xFB |0 + \x87\xFC |0 + \x87\xFD |0 + \x87\xFE |0 + \x88\x40 |0 + \x88\x41 |0 + \x88\x42 |0 + \x88\x43 |0 + \x88\x44 |0 + \x88\x45 |0 + \x88\x46 |0 + \x88\x47 |0 + \x88\x48 |0 + \x88\x49 |0 + \x88\x4A |0 + \x88\x4B |0 + \x88\x4C |0 + \x88\x4D |0 + \x88\x4E |0 + \x88\x4F |0 + \x88\x50 |0 + \x88\x51 |0 + \x88\x52 |0 + \x88\x53 |0 + \x88\x54 |0 + \x88\x55 |0 + \x88\x56 |0 + \x88\x57 |0 + \x88\x58 |0 + \x88\x59 |0 + \x88\x5A |0 + \x88\x5B |0 + \x88\x5C |0 + \x88\x5D |0 + \x88\x5E |0 + \x88\x5F |0 + \x88\x60 |0 + \x88\x61 |0 + \x88\x62 |0 + \x88\x63 |0 + \x88\x64 |0 + \x88\x65 |0 + \x88\x66 |0 + \x88\x67 |0 + \x88\x68 |0 + \x88\x69 |0 + \x88\x6A |0 + \x88\x6B |0 + \x88\x6C |0 + \x88\x6D |0 + \x88\x6E |0 + \x88\x6F |0 + \x88\x70 |0 + \x88\x71 |0 + \x88\x72 |0 + \x88\x73 |0 + \x88\x74 |0 + \x88\x75 |0 + \x88\x76 |0 + \x88\x77 |0 + \x88\x78 |0 + \x88\x79 |0 + \x88\x7A |0 + \x88\x7B |0 + \x88\x7C |0 + \x88\x7D |0 + \x88\x7E |0 + \x88\xA1 |0 + \x88\xA2 |0 + \x88\xA3 |0 + \x88\xA4 |0 + \x88\xA5 |0 + \x88\xA6 |0 + \x88\xA7 |0 + \x88\xA8 |0 + \x88\xA9 |0 + \x88\xAA |0 + \x88\xAB |0 + \x88\xAC |0 + \x88\xAD |0 + \x88\xAE |0 + \x88\xAF |0 + \x88\xB0 |0 + \x88\xB1 |0 + \x88\xB2 |0 + \x88\xB3 |0 + \x88\xB4 |0 + \x88\xB5 |0 + \x88\xB6 |0 + \x88\xB7 |0 + \x88\xB8 |0 + \x88\xB9 |0 + \x88\xBA |0 + \x88\xBB |0 + \x88\xBC |0 + \x88\xBD |0 + \x88\xBE |0 + \x88\xBF |0 + \x88\xC0 |0 + \x88\xC1 |0 + \x88\xC2 |0 + \x88\xC3 |0 + \x88\xC4 |0 + \x88\xC5 |0 + \x88\xC6 |0 + \x88\xC7 |0 + \x88\xC8 |0 + \x88\xC9 |0 + \x88\xCA |0 + \x88\xCB |0 + \x88\xCC |0 + \x88\xCD |0 + \x88\xCE |0 + \x88\xCF |0 + \x88\xD0 |0 + \x88\xD1 |0 + \x88\xD2 |0 + \x88\xD3 |0 + \x88\xD4 |0 + \x88\xD5 |0 + \x88\xD6 |0 + \x88\xD7 |0 + \x88\xD8 |0 + \x88\xD9 |0 + \x88\xDA |0 + \x88\xDB |0 + \x88\xDC |0 + \x88\xDD |0 + \x88\xDE |0 + \x88\xDF |0 + \x88\xE0 |0 + \x88\xE1 |0 + \x88\xE2 |0 + \x88\xE3 |0 + \x88\xE4 |0 + \x88\xE5 |0 + \x88\xE6 |0 + \x88\xE7 |0 + \x88\xE8 |0 + \x88\xE9 |0 + \x88\xEA |0 + \x88\xEB |0 + \x88\xEC |0 + \x88\xED |0 + \x88\xEE |0 + \x88\xEF |0 + \x88\xF0 |0 + \x88\xF1 |0 + \x88\xF2 |0 + \x88\xF3 |0 + \x88\xF4 |0 + \x88\xF5 |0 + \x88\xF6 |0 + \x88\xF7 |0 + \x88\xF8 |0 + \x88\xF9 |0 + \x88\xFA |0 + \x88\xFB |0 + \x88\xFC |0 + \x88\xFD |0 + \x88\xFE |0 + \x89\x40 |0 + \x89\x41 |0 + \x89\x42 |0 + \x89\x43 |0 + \x89\x44 |0 + \x89\x45 |0 + \x89\x46 |0 + \x89\x47 |0 + \x89\x48 |0 + \x89\x49 |0 + \x89\x4A |0 + \x89\x4B |0 + \x89\x4C |0 + \x89\x4D |0 + \x89\x4E |0 + \x89\x4F |0 + \x89\x50 |0 + \x89\x51 |0 + \x89\x52 |0 + \x89\x53 |0 + \x89\x54 |0 + \x89\x55 |0 + \x89\x56 |0 + \x89\x57 |0 + \x89\x58 |0 + \x89\x59 |0 + \x89\x5A |0 + \x89\x5B |0 + \x89\x5C |0 + \x89\x5D |0 + \x89\x5E |0 + \x89\x5F |0 + \x89\x60 |0 + \x89\x61 |0 + \x89\x62 |0 + \x89\x63 |0 + \x89\x64 |0 + \x89\x65 |0 + \x89\x66 |0 + \x89\x67 |0 + \x89\x68 |0 + \x89\x69 |0 + \x89\x6A |0 + \x89\x6B |0 + \x89\x6C |0 + \x89\x6D |0 + \x89\x6E |0 + \x89\x6F |0 + \x89\x70 |0 + \x89\x71 |0 + \x89\x72 |0 + \x89\x73 |0 + \x89\x74 |0 + \x89\x75 |0 + \x89\x76 |0 + \x89\x77 |0 + \x89\x78 |0 + \x89\x79 |0 + \x89\x7A |0 + \x89\x7B |0 + \x89\x7C |0 + \x89\x7D |0 + \x89\x7E |0 + \x89\xA1 |0 + \x89\xA2 |0 + \x89\xA3 |0 + \x89\xA4 |0 + \x89\xA5 |0 + \x89\xA6 |0 + \x89\xA7 |0 + \x89\xA8 |0 + \x89\xA9 |0 + \x89\xAA |0 + \x89\xAB |0 + \x89\xAC |0 + \x89\xAD |0 + \x89\xAE |0 + \x89\xAF |0 + \x89\xB0 |0 + \x89\xB1 |0 + \x89\xB2 |0 + \x89\xB3 |0 + \x89\xB4 |0 + \x89\xB5 |0 + \x89\xB6 |0 + \x89\xB7 |0 + \x89\xB8 |0 + \x89\xB9 |0 + \x89\xBA |0 + \x89\xBB |0 + \x89\xBC |0 + \x89\xBD |0 + \x89\xBE |0 + \x89\xBF |0 + \x89\xC0 |0 + \x89\xC1 |0 + \x89\xC2 |0 + \x89\xC3 |0 + \x89\xC4 |0 + \x89\xC5 |0 + \x89\xC6 |0 + \x89\xC7 |0 + \x89\xC8 |0 + \x89\xC9 |0 + \x89\xCA |0 + \x89\xCB |0 + \x89\xCC |0 + \x89\xCD |0 + \x89\xCE |0 + \x89\xCF |0 + \x89\xD0 |0 + \x89\xD1 |0 + \x89\xD2 |0 + \x89\xD3 |0 + \x89\xD4 |0 + \x89\xD5 |0 + \x89\xD6 |0 + \x89\xD7 |0 + \x89\xD8 |0 + \x89\xD9 |0 + \x89\xDA |0 + \x89\xDB |0 + \x89\xDC |0 + \x89\xDD |0 + \x89\xDE |0 + \x89\xDF |0 + \x89\xE0 |0 + \x89\xE1 |0 + \x89\xE2 |0 + \x89\xE3 |0 + \x89\xE4 |0 + \x89\xE5 |0 + \x89\xE6 |0 + \x89\xE7 |0 + \x89\xE8 |0 + \x89\xE9 |0 + \x89\xEA |0 + \x89\xEB |0 + \x89\xEC |0 + \x89\xED |0 + \x89\xEE |0 + \x89\xEF |0 + \x89\xF0 |0 + \x89\xF1 |0 + \x89\xF2 |0 + \x89\xF3 |0 + \x89\xF4 |0 + \x89\xF5 |0 + \x89\xF6 |0 + \x89\xF7 |0 + \x89\xF8 |0 + \x89\xF9 |0 + \x89\xFA |0 + \x89\xFB |0 + \x89\xFC |0 + \x89\xFD |0 + \x89\xFE |0 + \x8A\x40 |0 + \x8A\x41 |0 + \x8A\x42 |0 + \x8A\x43 |0 + \x8A\x44 |0 + \x8A\x45 |0 + \x8A\x46 |0 + \x8A\x47 |0 + \x8A\x48 |0 + \x8A\x49 |0 + \x8A\x4A |0 + \x8A\x4B |0 + \x8A\x4C |0 + \x8A\x4D |0 + \x8A\x4E |0 + \x8A\x4F |0 + \x8A\x50 |0 + \x8A\x51 |0 + \x8A\x52 |0 + \x8A\x53 |0 + \x8A\x54 |0 + \x8A\x55 |0 + \x8A\x56 |0 + \x8A\x57 |0 + \x8A\x58 |0 + \x8A\x59 |0 + \x8A\x5A |0 + \x8A\x5B |0 + \x8A\x5C |0 + \x8A\x5D |0 + \x8A\x5E |0 + \x8A\x5F |0 + \x8A\x60 |0 + \x8A\x61 |0 + \x8A\x62 |0 + \x8A\x63 |0 + \x8A\x64 |0 + \x8A\x65 |0 + \x8A\x66 |0 + \x8A\x67 |0 + \x8A\x68 |0 + \x8A\x69 |0 + \x8A\x6A |0 + \x8A\x6B |0 + \x8A\x6C |0 + \x8A\x6D |0 + \x8A\x6E |0 + \x8A\x6F |0 + \x8A\x70 |0 + \x8A\x71 |0 + \x8A\x72 |0 + \x8A\x73 |0 + \x8A\x74 |0 + \x8A\x75 |0 + \x8A\x76 |0 + \x8A\x77 |0 + \x8A\x78 |0 + \x8A\x79 |0 + \x8A\x7A |0 + \x8A\x7B |0 + \x8A\x7C |0 + \x8A\x7D |0 + \x8A\x7E |0 + \x8A\xA1 |0 + \x8A\xA2 |0 + \x8A\xA3 |0 + \x8A\xA4 |0 + \x8A\xA5 |0 + \x8A\xA6 |0 + \x8A\xA7 |0 + \x8A\xA8 |0 + \x8A\xA9 |0 + \x8A\xAA |0 + \x8A\xAB |0 + \x8A\xAC |0 + \x8A\xAD |0 + \x8A\xAE |0 + \x8A\xAF |0 + \x8A\xB0 |0 + \x8A\xB1 |0 + \x8A\xB2 |0 + \x8A\xB3 |0 + \x8A\xB4 |0 + \x8A\xB5 |0 + \x8A\xB6 |0 + \x8A\xB7 |0 + \x8A\xB8 |0 + \x8A\xB9 |0 + \x8A\xBA |0 + \x8A\xBB |0 + \x8A\xBC |0 + \x8A\xBD |0 + \x8A\xBE |0 + \x8A\xBF |0 + \x8A\xC0 |0 + \x8A\xC1 |0 + \x8A\xC2 |0 + \x8A\xC3 |0 + \x8A\xC4 |0 + \x8A\xC5 |0 + \x8A\xC6 |0 + \x8A\xC7 |0 + \x8A\xC8 |0 + \x8A\xC9 |0 + \x8A\xCA |0 + \x8A\xCB |0 + \x8A\xCC |0 + \x8A\xCD |0 + \x8A\xCE |0 + \x8A\xCF |0 + \x8A\xD0 |0 + \x8A\xD1 |0 + \x8A\xD2 |0 + \x8A\xD3 |0 + \x8A\xD4 |0 + \x8A\xD5 |0 + \x8A\xD6 |0 + \x8A\xD7 |0 + \x8A\xD8 |0 + \x8A\xD9 |0 + \x8A\xDA |0 + \x8A\xDB |0 + \x8A\xDC |0 + \x8A\xDD |0 + \x8A\xDE |0 + \x8A\xDF |0 + \x8A\xE0 |0 + \x8A\xE1 |0 + \x8A\xE2 |0 + \x8A\xE3 |0 + \x8A\xE4 |0 + \x8A\xE5 |0 + \x8A\xE6 |0 + \x8A\xE7 |0 + \x8A\xE8 |0 + \x8A\xE9 |0 + \x8A\xEA |0 + \x8A\xEB |0 + \x8A\xEC |0 + \x8A\xED |0 + \x8A\xEE |0 + \x8A\xEF |0 + \x8A\xF0 |0 + \x8A\xF1 |0 + \x8A\xF2 |0 + \x8A\xF3 |0 + \x8A\xF4 |0 + \x8A\xF5 |0 + \x8A\xF6 |0 + \x8A\xF7 |0 + \x8A\xF8 |0 + \x8A\xF9 |0 + \x8A\xFA |0 + \x8A\xFB |0 + \x8A\xFC |0 + \x8A\xFD |0 + \x8A\xFE |0 + \x8B\x40 |0 + \x8B\x41 |0 + \x8B\x42 |0 + \x8B\x43 |0 + \x8B\x44 |0 + \x8B\x45 |0 + \x8B\x46 |0 + \x8B\x47 |0 + \x8B\x48 |0 + \x8B\x49 |0 + \x8B\x4A |0 + \x8B\x4B |0 + \x8B\x4C |0 + \x8B\x4D |0 + \x8B\x4E |0 + \x8B\x4F |0 + \x8B\x50 |0 + \x8B\x51 |0 + \x8B\x52 |0 + \x8B\x53 |0 + \x8B\x54 |0 + \x8B\x55 |0 + \x8B\x56 |0 + \x8B\x57 |0 + \x8B\x58 |0 + \x8B\x59 |0 + \x8B\x5A |0 + \x8B\x5B |0 + \x8B\x5C |0 + \x8B\x5D |0 + \x8B\x5E |0 + \x8B\x5F |0 + \x8B\x60 |0 + \x8B\x61 |0 + \x8B\x62 |0 + \x8B\x63 |0 + \x8B\x64 |0 + \x8B\x65 |0 + \x8B\x66 |0 + \x8B\x67 |0 + \x8B\x68 |0 + \x8B\x69 |0 + \x8B\x6A |0 + \x8B\x6B |0 + \x8B\x6C |0 + \x8B\x6D |0 + \x8B\x6E |0 + \x8B\x6F |0 + \x8B\x70 |0 + \x8B\x71 |0 + \x8B\x72 |0 + \x8B\x73 |0 + \x8B\x74 |0 + \x8B\x75 |0 + \x8B\x76 |0 + \x8B\x77 |0 + \x8B\x78 |0 + \x8B\x79 |0 + \x8B\x7A |0 + \x8B\x7B |0 + \x8B\x7C |0 + \x8B\x7D |0 + \x8B\x7E |0 + \x8B\xA1 |0 + \x8B\xA2 |0 + \x8B\xA3 |0 + \x8B\xA4 |0 + \x8B\xA5 |0 + \x8B\xA6 |0 + \x8B\xA7 |0 + \x8B\xA8 |0 + \x8B\xA9 |0 + \x8B\xAA |0 + \x8B\xAB |0 + \x8B\xAC |0 + \x8B\xAD |0 + \x8B\xAE |0 + \x8B\xAF |0 + \x8B\xB0 |0 + \x8B\xB1 |0 + \x8B\xB2 |0 + \x8B\xB3 |0 + \x8B\xB4 |0 + \x8B\xB5 |0 + \x8B\xB6 |0 + \x8B\xB7 |0 + \x8B\xB8 |0 + \x8B\xB9 |0 + \x8B\xBA |0 + \x8B\xBB |0 + \x8B\xBC |0 + \x8B\xBD |0 + \x8B\xBE |0 + \x8B\xBF |0 + \x8B\xC0 |0 + \x8B\xC1 |0 + \x8B\xC2 |0 + \x8B\xC3 |0 + \x8B\xC4 |0 + \x8B\xC5 |0 + \x8B\xC6 |0 + \x8B\xC7 |0 + \x8B\xC8 |0 + \x8B\xC9 |0 + \x8B\xCA |0 + \x8B\xCB |0 + \x8B\xCC |0 + \x8B\xCD |0 + \x8B\xCE |0 + \x8B\xCF |0 + \x8B\xD0 |0 + \x8B\xD1 |0 + \x8B\xD2 |0 + \x8B\xD3 |0 + \x8B\xD4 |0 + \x8B\xD5 |0 + \x8B\xD6 |0 + \x8B\xD7 |0 + \x8B\xD8 |0 + \x8B\xD9 |0 + \x8B\xDA |0 + \x8B\xDB |0 + \x8B\xDC |0 + \x8B\xDD |0 + \x8B\xDE |0 + \x8B\xDF |0 + \x8B\xE0 |0 + \x8B\xE1 |0 + \x8B\xE2 |0 + \x8B\xE3 |0 + \x8B\xE4 |0 + \x8B\xE5 |0 + \x8B\xE6 |0 + \x8B\xE7 |0 + \x8B\xE8 |0 + \x8B\xE9 |0 + \x8B\xEA |0 + \x8B\xEB |0 + \x8B\xEC |0 + \x8B\xED |0 + \x8B\xEE |0 + \x8B\xEF |0 + \x8B\xF0 |0 + \x8B\xF1 |0 + \x8B\xF2 |0 + \x8B\xF3 |0 + \x8B\xF4 |0 + \x8B\xF5 |0 + \x8B\xF6 |0 + \x8B\xF7 |0 + \x8B\xF8 |0 + \x8B\xF9 |0 + \x8B\xFA |0 + \x8B\xFB |0 + \x8B\xFC |0 + \x8B\xFD |0 + \x8B\xFE |0 + \x8C\x40 |0 + \x8C\x41 |0 + \x8C\x42 |0 + \x8C\x43 |0 + \x8C\x44 |0 + \x8C\x45 |0 + \x8C\x46 |0 + \x8C\x47 |0 + \x8C\x48 |0 + \x8C\x49 |0 + \x8C\x4A |0 + \x8C\x4B |0 + \x8C\x4C |0 + \x8C\x4D |0 + \x8C\x4E |0 + \x8C\x4F |0 + \x8C\x50 |0 + \x8C\x51 |0 + \x8C\x52 |0 + \x8C\x53 |0 + \x8C\x54 |0 + \x8C\x55 |0 + \x8C\x56 |0 + \x8C\x57 |0 + \x8C\x58 |0 + \x8C\x59 |0 + \x8C\x5A |0 + \x8C\x5B |0 + \x8C\x5C |0 + \x8C\x5D |0 + \x8C\x5E |0 + \x8C\x5F |0 + \x8C\x60 |0 + \x8C\x61 |0 + \x8C\x62 |0 + \x8C\x63 |0 + \x8C\x64 |0 + \x8C\x65 |0 + \x8C\x66 |0 + \x8C\x67 |0 + \x8C\x68 |0 + \x8C\x69 |0 + \x8C\x6A |0 + \x8C\x6B |0 + \x8C\x6C |0 + \x8C\x6D |0 + \x8C\x6E |0 + \x8C\x6F |0 + \x8C\x70 |0 + \x8C\x71 |0 + \x8C\x72 |0 + \x8C\x73 |0 + \x8C\x74 |0 + \x8C\x75 |0 + \x8C\x76 |0 + \x8C\x77 |0 + \x8C\x78 |0 + \x8C\x79 |0 + \x8C\x7A |0 + \x8C\x7B |0 + \x8C\x7C |0 + \x8C\x7D |0 + \x8C\x7E |0 + \x8C\xA1 |0 + \x8C\xA2 |0 + \x8C\xA3 |0 + \x8C\xA4 |0 + \x8C\xA5 |0 + \x8C\xA6 |0 + \x8C\xA7 |0 + \x8C\xA8 |0 + \x8C\xA9 |0 + \x8C\xAA |0 + \x8C\xAB |0 + \x8C\xAC |0 + \x8C\xAD |0 + \x8C\xAE |0 + \x8C\xAF |0 + \x8C\xB0 |0 + \x8C\xB1 |0 + \x8C\xB2 |0 + \x8C\xB3 |0 + \x8C\xB4 |0 + \x8C\xB5 |0 + \x8C\xB6 |0 + \x8C\xB7 |0 + \x8C\xB8 |0 + \x8C\xB9 |0 + \x8C\xBA |0 + \x8C\xBB |0 + \x8C\xBC |0 + \x8C\xBD |0 + \x8C\xBE |0 + \x8C\xBF |0 + \x8C\xC0 |0 + \x8C\xC1 |0 + \x8C\xC2 |0 + \x8C\xC3 |0 + \x8C\xC4 |0 + \x8C\xC5 |0 + \x8C\xC6 |0 + \x8C\xC7 |0 + \x8C\xC8 |0 + \x8C\xC9 |0 + \x8C\xCA |0 + \x8C\xCB |0 + \x8C\xCC |0 + \x8C\xCD |0 + \x8C\xCE |0 + \x8C\xCF |0 + \x8C\xD0 |0 + \x8C\xD1 |0 + \x8C\xD2 |0 + \x8C\xD3 |0 + \x8C\xD4 |0 + \x8C\xD5 |0 + \x8C\xD6 |0 + \x8C\xD7 |0 + \x8C\xD8 |0 + \x8C\xD9 |0 + \x8C\xDA |0 + \x8C\xDB |0 + \x8C\xDC |0 + \x8C\xDD |0 + \x8C\xDE |0 + \x8C\xDF |0 + \x8C\xE0 |0 + \x8C\xE1 |0 + \x8C\xE2 |0 + \x8C\xE3 |0 + \x8C\xE4 |0 + \x8C\xE5 |0 + \x8C\xE6 |0 + \x8C\xE7 |0 + \x8C\xE8 |0 + \x8C\xE9 |0 + \x8C\xEA |0 + \x8C\xEB |0 + \x8C\xEC |0 + \x8C\xED |0 + \x8C\xEE |0 + \x8C\xEF |0 + \x8C\xF0 |0 + \x8C\xF1 |0 + \x8C\xF2 |0 + \x8C\xF3 |0 + \x8C\xF4 |0 + \x8C\xF5 |0 + \x8C\xF6 |0 + \x8C\xF7 |0 + \x8C\xF8 |0 + \x8C\xF9 |0 + \x8C\xFA |0 + \x8C\xFB |0 + \x8C\xFC |0 + \x8C\xFD |0 + \x8C\xFE |0 + \x8D\x40 |0 + \x8D\x41 |0 + \x8D\x42 |0 + \x8D\x43 |0 + \x8D\x44 |0 + \x8D\x45 |0 + \x8D\x46 |0 + \x8D\x47 |0 + \x8D\x48 |0 + \x8D\x49 |0 + \x8D\x4A |0 + \x8D\x4B |0 + \x8D\x4C |0 + \x8D\x4D |0 + \x8D\x4E |0 + \x8D\x4F |0 + \x8D\x50 |0 + \x8D\x51 |0 + \x8D\x52 |0 + \x8D\x53 |0 + \x8D\x54 |0 + \x8D\x55 |0 + \x8D\x56 |0 + \x8D\x57 |0 + \x8D\x58 |0 + \x8D\x59 |0 + \x8D\x5A |0 + \x8D\x5B |0 + \x8D\x5C |0 + \x8D\x5D |0 + \x8D\x5E |0 + \x8D\x5F |0 + \x8D\x60 |0 + \x8D\x61 |0 + \x8D\x62 |0 + \x8D\x63 |0 + \x8D\x64 |0 + \x8D\x65 |0 + \x8D\x66 |0 + \x8D\x67 |0 + \x8D\x68 |0 + \x8D\x69 |0 + \x8D\x6A |0 + \x8D\x6B |0 + \x8D\x6C |0 + \x8D\x6D |0 + \x8D\x6E |0 + \x8D\x6F |0 + \x8D\x70 |0 + \x8D\x71 |0 + \x8D\x72 |0 + \x8D\x73 |0 + \x8D\x74 |0 + \x8D\x75 |0 + \x8D\x76 |0 + \x8D\x77 |0 + \x8D\x78 |0 + \x8D\x79 |0 + \x8D\x7A |0 + \x8D\x7B |0 + \x8D\x7C |0 + \x8D\x7D |0 + \x8D\x7E |0 + \x8D\xA1 |0 + \x8D\xA2 |0 + \x8D\xA3 |0 + \x8D\xA4 |0 + \x8D\xA5 |0 + \x8D\xA6 |0 + \x8D\xA7 |0 + \x8D\xA8 |0 + \x8D\xA9 |0 + \x8D\xAA |0 + \x8D\xAB |0 + \x8D\xAC |0 + \x8D\xAD |0 + \x8D\xAE |0 + \x8D\xAF |0 + \x8D\xB0 |0 + \x8D\xB1 |0 + \x8D\xB2 |0 + \x8D\xB3 |0 + \x8D\xB4 |0 + \x8D\xB5 |0 + \x8D\xB6 |0 + \x8D\xB7 |0 + \x8D\xB8 |0 + \x8D\xB9 |0 + \x8D\xBA |0 + \x8D\xBB |0 + \x8D\xBC |0 + \x8D\xBD |0 + \x8D\xBE |0 + \x8D\xBF |0 + \x8D\xC0 |0 + \x8D\xC1 |0 + \x8D\xC2 |0 + \x8D\xC3 |0 + \x8D\xC4 |0 + \x8D\xC5 |0 + \x8D\xC6 |0 + \x8D\xC7 |0 + \x8D\xC8 |0 + \x8D\xC9 |0 + \x8D\xCA |0 + \x8D\xCB |0 + \x8D\xCC |0 + \x8D\xCD |0 + \x8D\xCE |0 + \x8D\xCF |0 + \x8D\xD0 |0 + \x8D\xD1 |0 + \x8D\xD2 |0 + \x8D\xD3 |0 + \x8D\xD4 |0 + \x8D\xD5 |0 + \x8D\xD6 |0 + \x8D\xD7 |0 + \x8D\xD8 |0 + \x8D\xD9 |0 + \x8D\xDA |0 + \x8D\xDB |0 + \x8D\xDC |0 + \x8D\xDD |0 + \x8D\xDE |0 + \x8D\xDF |0 + \x8D\xE0 |0 + \x8D\xE1 |0 + \x8D\xE2 |0 + \x8D\xE3 |0 + \x8D\xE4 |0 + \x8D\xE5 |0 + \x8D\xE6 |0 + \x8D\xE7 |0 + \x8D\xE8 |0 + \x8D\xE9 |0 + \x8D\xEA |0 + \x8D\xEB |0 + \x8D\xEC |0 + \x8D\xED |0 + \x8D\xEE |0 + \x8D\xEF |0 + \x8D\xF0 |0 + \x8D\xF1 |0 + \x8D\xF2 |0 + \x8D\xF3 |0 + \x8D\xF4 |0 + \x8D\xF5 |0 + \x8D\xF6 |0 + \x8D\xF7 |0 + \x8D\xF8 |0 + \x8D\xF9 |0 + \x8D\xFA |0 + \x8D\xFB |0 + \x8D\xFC |0 + \x8D\xFD |0 + \x8D\xFE |0 + \xC6\xA1 |0 + \xC6\xA2 |0 + \xC6\xA3 |0 + \xC6\xA4 |0 + \xC6\xA5 |0 + \xC6\xA6 |0 + \xC6\xA7 |0 + \xC6\xA8 |0 + \xC6\xA9 |0 + \xC6\xAA |0 + \xC6\xAB |0 + \xC6\xAC |0 + \xC6\xAD |0 + \xC6\xAE |0 + \xC6\xAF |0 + \xC6\xB0 |0 + \xC6\xB1 |0 + \xC6\xB2 |0 + \xC6\xB3 |0 + \xC6\xB4 |0 + \xC6\xB5 |0 + \xC6\xB6 |0 + \xC6\xB7 |0 + \xC6\xB8 |0 + \xC6\xB9 |0 + \xC6\xBA |0 + \xC6\xBB |0 + \xC6\xBC |0 + \xC6\xBD |0 + \xC6\xBE |0 + \xC6\xBF |0 + \xC6\xC0 |0 + \xC6\xC1 |0 + \xC6\xC2 |0 + \xC6\xC3 |0 + \xC6\xC4 |0 + \xC6\xC5 |0 + \xC6\xC6 |0 + \xC6\xC7 |0 + \xC6\xC8 |0 + \xC6\xC9 |0 + \xC6\xCA |0 + \xC6\xCB |0 + \xC6\xCC |0 + \xC6\xCD |0 + \xC6\xCE |0 + \xC6\xCF |0 + \xC6\xD0 |0 + \xC6\xD1 |0 + \xC6\xD2 |0 + \xC6\xD3 |0 + \xC6\xD4 |0 + \xC6\xD5 |0 + \xC6\xD6 |0 + \xC6\xD7 |0 + \xC6\xD8 |0 + \xC6\xD9 |0 + \xC6\xDA |0 + \xC6\xDB |0 + \xC6\xDC |0 + \xC6\xDD |0 + \xC6\xDE |0 + \xC6\xDF |0 + \xC6\xE0 |0 + \xC6\xE1 |0 + \xC6\xE2 |0 + \xC6\xE3 |0 + \xC6\xE4 |0 + \xC6\xE5 |0 + \xC6\xE6 |0 + \xC6\xE7 |0 + \xC6\xE8 |0 + \xC6\xE9 |0 + \xC6\xEA |0 + \xC6\xEB |0 + \xC6\xEC |0 + \xC6\xED |0 + \xC6\xEE |0 + \xC6\xEF |0 + \xC6\xF0 |0 + \xC6\xF1 |0 + \xC6\xF2 |0 + \xC6\xF3 |0 + \xC6\xF4 |0 + \xC6\xF5 |0 + \xC6\xF6 |0 + \xC6\xF7 |0 + \xC6\xF8 |0 + \xC6\xF9 |0 + \xC6\xFA |0 + \xC6\xFB |0 + \xC6\xFC |0 + \xC6\xFD |0 + \xC6\xFE |0 + \xC7\x40 |0 + \xC7\x41 |0 + \xC7\x42 |0 + \xC7\x43 |0 + \xC7\x44 |0 + \xC7\x45 |0 + \xC7\x46 |0 + \xC7\x47 |0 + \xC7\x48 |0 + \xC7\x49 |0 + \xC7\x4A |0 + \xC7\x4B |0 + \xC7\x4C |0 + \xC7\x4D |0 + \xC7\x4E |0 + \xC7\x4F |0 + \xC7\x50 |0 + \xC7\x51 |0 + \xC7\x52 |0 + \xC7\x53 |0 + \xC7\x54 |0 + \xC7\x55 |0 + \xC7\x56 |0 + \xC7\x57 |0 + \xC7\x58 |0 + \xC7\x59 |0 + \xC7\x5A |0 + \xC7\x5B |0 + \xC7\x5C |0 + \xC7\x5D |0 + \xC7\x5E |0 + \xC7\x5F |0 + \xC7\x60 |0 + \xC7\x61 |0 + \xC7\x62 |0 + \xC7\x63 |0 + \xC7\x64 |0 + \xC7\x65 |0 + \xC7\x66 |0 + \xC7\x67 |0 + \xC7\x68 |0 + \xC7\x69 |0 + \xC7\x6A |0 + \xC7\x6B |0 + \xC7\x6C |0 + \xC7\x6D |0 + \xC7\x6E |0 + \xC7\x6F |0 + \xC7\x70 |0 + \xC7\x71 |0 + \xC7\x72 |0 + \xC7\x73 |0 + \xC7\x74 |0 + \xC7\x75 |0 + \xC7\x76 |0 + \xC7\x77 |0 + \xC7\x78 |0 + \xC7\x79 |0 + \xC7\x7A |0 + \xC7\x7B |0 + \xC7\x7C |0 + \xC7\x7D |0 + \xC7\x7E |0 + \xC7\xA1 |0 + \xC7\xA2 |0 + \xC7\xA3 |0 + \xC7\xA4 |0 + \xC7\xA5 |0 + \xC7\xA6 |0 + \xC7\xA7 |0 + \xC7\xA8 |0 + \xC7\xA9 |0 + \xC7\xAA |0 + \xC7\xAB |0 + \xC7\xAC |0 + \xC7\xAD |0 + \xC7\xAE |0 + \xC7\xAF |0 + \xC7\xB0 |0 + \xC7\xB1 |0 + \xC7\xB2 |0 + \xC7\xB3 |0 + \xC7\xB4 |0 + \xC7\xB5 |0 + \xC7\xB6 |0 + \xC7\xB7 |0 + \xC7\xB8 |0 + \xC7\xB9 |0 + \xC7\xBA |0 + \xC7\xBB |0 + \xC7\xBC |0 + \xC7\xBD |0 + \xC7\xBE |0 + \xC7\xBF |0 + \xC7\xC0 |0 + \xC7\xC1 |0 + \xC7\xC2 |0 + \xC7\xC3 |0 + \xC7\xC4 |0 + \xC7\xC5 |0 + \xC7\xC6 |0 + \xC7\xC7 |0 + \xC7\xC8 |0 + \xC7\xC9 |0 + \xC7\xCA |0 + \xC7\xCB |0 + \xC7\xCC |0 + \xC7\xCD |0 + \xC7\xCE |0 + \xC7\xCF |0 + \xC7\xD0 |0 + \xC7\xD1 |0 + \xC7\xD2 |0 + \xC7\xD3 |0 + \xC7\xD4 |0 + \xC7\xD5 |0 + \xC7\xD6 |0 + \xC7\xD7 |0 + \xC7\xD8 |0 + \xC7\xD9 |0 + \xC7\xDA |0 + \xC7\xDB |0 + \xC7\xDC |0 + \xC7\xDD |0 + \xC7\xDE |0 + \xC7\xDF |0 + \xC7\xE0 |0 + \xC7\xE1 |0 + \xC7\xE2 |0 + \xC7\xE3 |0 + \xC7\xE4 |0 + \xC7\xE5 |0 + \xC7\xE6 |0 + \xC7\xE7 |0 + \xC7\xE8 |0 + \xC7\xE9 |0 + \xC7\xEA |0 + \xC7\xEB |0 + \xC7\xEC |0 + \xC7\xED |0 + \xC7\xEE |0 + \xC7\xEF |0 + \xC7\xF0 |0 + \xC7\xF1 |0 + \xC7\xF2 |0 + \xC7\xF3 |0 + \xC7\xF4 |0 + \xC7\xF5 |0 + \xC7\xF6 |0 + \xC7\xF7 |0 + \xC7\xF8 |0 + \xC7\xF9 |0 + \xC7\xFA |0 + \xC7\xFB |0 + \xC7\xFC |0 + \xC7\xFD |0 + \xC7\xFE |0 + \xC8\x40 |0 + \xC8\x41 |0 + \xC8\x42 |0 + \xC8\x43 |0 + \xC8\x44 |0 + \xC8\x45 |0 + \xC8\x46 |0 + \xC8\x47 |0 + \xC8\x48 |0 + \xC8\x49 |0 + \xC8\x4A |0 + \xC8\x4B |0 + \xC8\x4C |0 + \xC8\x4D |0 + \xC8\x4E |0 + \xC8\x4F |0 + \xC8\x50 |0 + \xC8\x51 |0 + \xC8\x52 |0 + \xC8\x53 |0 + \xC8\x54 |0 + \xC8\x55 |0 + \xC8\x56 |0 + \xC8\x57 |0 + \xC8\x58 |0 + \xC8\x59 |0 + \xC8\x5A |0 + \xC8\x5B |0 + \xC8\x5C |0 + \xC8\x5D |0 + \xC8\x5E |0 + \xC8\x5F |0 + \xC8\x60 |0 + \xC8\x61 |0 + \xC8\x62 |0 + \xC8\x63 |0 + \xC8\x64 |0 + \xC8\x65 |0 + \xC8\x66 |0 + \xC8\x67 |0 + \xC8\x68 |0 + \xC8\x69 |0 + \xC8\x6A |0 + \xC8\x6B |0 + \xC8\x6C |0 + \xC8\x6D |0 + \xC8\x6E |0 + \xC8\x6F |0 + \xC8\x70 |0 + \xC8\x71 |0 + \xC8\x72 |0 + \xC8\x73 |0 + \xC8\x74 |0 + \xC8\x75 |0 + \xC8\x76 |0 + \xC8\x77 |0 + \xC8\x78 |0 + \xC8\x79 |0 + \xC8\x7A |0 + \xC8\x7B |0 + \xC8\x7C |0 + \xC8\x7D |0 + \xC8\x7E |0 + \xC8\xA1 |0 + \xC8\xA2 |0 + \xC8\xA3 |0 + \xC8\xA4 |0 + \xC8\xA5 |0 + \xC8\xA6 |0 + \xC8\xA7 |0 + \xC8\xA8 |0 + \xC8\xA9 |0 + \xC8\xAA |0 + \xC8\xAB |0 + \xC8\xAC |0 + \xC8\xAD |0 + \xC8\xAE |0 + \xC8\xAF |0 + \xC8\xB0 |0 + \xC8\xB1 |0 + \xC8\xB2 |0 + \xC8\xB3 |0 + \xC8\xB4 |0 + \xC8\xB5 |0 + \xC8\xB6 |0 + \xC8\xB7 |0 + \xC8\xB8 |0 + \xC8\xB9 |0 + \xC8\xBA |0 + \xC8\xBB |0 + \xC8\xBC |0 + \xC8\xBD |0 + \xC8\xBE |0 + \xC8\xBF |0 + \xC8\xC0 |0 + \xC8\xC1 |0 + \xC8\xC2 |0 + \xC8\xC3 |0 + \xC8\xC4 |0 + \xC8\xC5 |0 + \xC8\xC6 |0 + \xC8\xC7 |0 + \xC8\xC8 |0 + \xC8\xC9 |0 + \xC8\xCA |0 + \xC8\xCB |0 + \xC8\xCC |0 + \xC8\xCD |0 + \xC8\xCE |0 + \xC8\xCF |0 + \xC8\xD0 |0 + \xC8\xD1 |0 + \xC8\xD2 |0 + \xC8\xD3 |0 + \xC8\xD4 |0 + \xC8\xD5 |0 + \xC8\xD6 |0 + \xC8\xD7 |0 + \xC8\xD8 |0 + \xC8\xD9 |0 + \xC8\xDA |0 + \xC8\xDB |0 + \xC8\xDC |0 + \xC8\xDD |0 + \xC8\xDE |0 + \xC8\xDF |0 + \xC8\xE0 |0 + \xC8\xE1 |0 + \xC8\xE2 |0 + \xC8\xE3 |0 + \xC8\xE4 |0 + \xC8\xE5 |0 + \xC8\xE6 |0 + \xC8\xE7 |0 + \xC8\xE8 |0 + \xC8\xE9 |0 + \xC8\xEA |0 + \xC8\xEB |0 + \xC8\xEC |0 + \xC8\xED |0 + \xC8\xEE |0 + \xC8\xEF |0 + \xC8\xF0 |0 + \xC8\xF1 |0 + \xC8\xF2 |0 + \xC8\xF3 |0 + \xC8\xF4 |0 + \xC8\xF5 |0 + \xC8\xF6 |0 + \xC8\xF7 |0 + \xC8\xF8 |0 + \xC8\xF9 |0 + \xC8\xFA |0 + \xC8\xFB |0 + \xC8\xFC |0 + \xC8\xFD |0 + \xC8\xFE |0 + \xFF |0 + \xB0\x5A |1 + \xA7\xF3 |1 + \xA8\xAE |1 + \xB8\xEB |1 + \xB7\xC6 |1 + \xA6\xEA |1 + \xA5\x79 |1 + \xC0\x74 |1 + \xC0\x74 |1 + \xAB\xB4 |1 + \xAA\xF7 |1 + \xB3\xE2 |1 + \xA9\x60 |1 + \xC3\x69 |1 + \xC4\xEE |1 + \xC3\xB9 |1 + \xC5\xDA |1 + \xC1\xB3 |1 + \xBB\x72 |1 + \xC5\xDE |1 + \xBC\xD6 |1 + \xAC\xA5 |1 + \xAF\x4F |1 + \xAF\x5F |1 + \xB8\xA8 |1 + \xB9\x54 |1 + \xC0\x64 |1 + \xB6\xC3 |1 + \xA7\x5A |1 + \xC4\xE6 |1 + \xC4\xEA |1 + \xC4\xF5 |1 + \xC6\x7D |1 + \xB4\x50 |1 + \xC0\xDD |1 + \xC2\xC5 |1 + \xC4\xB0 |1 + \xA9\xD4 |1 + \xC3\xBE |1 + \xC4\xFA |1 + \xB4\x59 |1 + \xAE\xD4 |1 + \xAE\xF6 |1 + \xAF\x54 |1 + \xA8\xD3 |1 + \xA7\x4E |1 + \xB3\xD2 |1 + \xBE\xDB |1 + \xC3\x72 |1 + \xC4\x6C |1 + \xBF\x63 |1 + \xA6\xD1 |1 + \xC4\xAA |1 + \xB8\xB8 |1 + \xB8\xF4 |1 + \xC5\x53 |1 + \xBE\x7C |1 + \xC6\x4F |1 + \xB8\x4C |1 + \xB8\x53 |1 + \xBA\xF1 |1 + \xDB\x77 |1 + \xBF\xFD |1 + \xB3\xC0 |1 + \xBD\xD7 |1 + \xC3\x62 |1 + \xA7\xCB |1 + \xC5\xA2 |1 + \xC5\xA4 |1 + \xA8\x63 |1 + \xBD\x55 |1 + \xB8\xEF |1 + \xB9\x70 |1 + \xC2\x53 |1 + \xB9\xF0 |1 + \xBC\xD3 |1 + \xB2\x5C |1 + \xBA\x7C |1 + \xB2\xD6 |1 + \xC1\x5C |1 + \xAD\xAE |1 + \xB0\xC7 |1 + \xA6\xD8 |1 + \xBB\xFE |1 + \xAD\xE2 |1 + \xB8\x57 |1 + \xBA\xF0 |1 + \xB5\xD9 |1 + \xB3\xAE |1 + \xC5\xAA |1 + \xCE\xD4 |1 + \xBC\xD6 |1 + \xBF\xD5 |1 + \xA4\xA6 |1 + \xB9\xE7 |1 + \xAB\xE3 |1 + \xB2\x76 |1 + \xB2\xA7 |1 + \xA5\x5F |1 + \xED\xA8 |1 + \xAB\x4B |1 + \xB4\x5F |1 + \xA4\xA3 |1 + \xAA\x63 |1 + \xBC\xC6 |1 + \xAF\xC1 |1 + \xB0\xD1 |1 + \xB6\xEB |1 + \xAC\xD9 |1 + \xB8\xAD |1 + \xBB\xA1 |1 + \xB1\xFE |1 + \xA8\xB0 |1 + \xA8\x48 |1 + \xAC\x42 |1 + \xAD\x59 |1 + \xB1\xB0 |1 + \xB2\xA4 |1 + \xAB\x47 |1 + \xA8\xE2 |1 + \xB1\xE7 |1 + \xC2\xB3 |1 + \xA8\x7D |1 + \xBD\xCC |1 + \xB6\x71 |1 + \xC0\x79 |1 + \xA7\x66 |1 + \xA4\x6B |1 + \xC3\x66 |1 + \xAE\xC8 |1 + \xC2\x6F |1 + \xC4\x72 |1 + \xBE\x5B |1 + \xC6\x7A |1 + \xC4\x52 |1 + \xBE\xA4 |1 + \xA4\x4F |1 + \xBE\xE4 |1 + \xBE\xFA |1 + \xF7\x65 |1 + \xA6\x7E |1 + \xBC\xA6 |1 + \xC5\xCA |1 + \xBC\xBF |1 + \xBA\xA7 |1 + \xB7\xD2 |1 + \xE6\xA3 |1 + \xBD\x6D |1 + \xC1\x70 |1 + \xBD\xFB |1 + \xBD\xAC |1 + \xB3\x73 |1 + \xC1\xE5 |1 + \xA6\x43 |1 + \xA6\x48 |1 + \xAB\x7C |1 + \xAF\x50 |1 + \xB5\xF5 |1 + \xBB\xA1 |1 + \xB7\x47 |1 + \xA9\xC0 |1 + \xB1\xC9 |1 + \xC0\xD4 |1 + \xC3\xAE |1 + \xC2\x79 |1 + \xA5\x4F |1 + \xCB\xF1 |1 + \xB9\xE7 |1 + \xC0\xAD |1 + \xCC\xB0 |1 + \xAC\xC2 |1 + \xBC\xFC |1 + \xB2\xDC |1 + \xB2\xE2 |1 + \xB9\x61 |1 + \xB9\x73 |1 + \xC6\x46 |1 + \xBB\xE2 |1 + \xA8\xD2 |1 + \xC2\xA7 |1 + \xC4\xBF |1 + \xC1\xF5 |1 + \xB4\x63 |1 + \xA4\x46 |1 + \xB9\xB1 |1 + \xBC\x64 |1 + \xA7\xBF |1 + \xAE\xC6 |1 + \xBC\xD6 |1 + \xBF\x52 |1 + \xC0\xF8 |1 + \xE7\x64 |1 + \xBF\xF1 |1 + \xC0\x73 |1 + \xB7\x77 |1 + \xA8\xBF |1 + \xBC\x42 |1 + \xCC\xD8 |1 + \xAC\x68 |1 + \xAC\x79 |1 + \xB7\xC8 |1 + \xAF\x5B |1 + \xAF\x64 |1 + \xB2\xB8 |1 + \xAF\xC3 |1 + \xC3\xFE |1 + \xA4\xBB |1 + \xBC\xAE |1 + \xB3\xB0 |1 + \xAD\xDB |1 + \xB1\x5B |1 + \xB2\x5F |1 + \xBD\xFC |1 + \xAB\xDF |1 + \xB7\x58 |1 + \xAE\xDF |1 + \xB2\x76 |1 + \xB6\xA9 |1 + \xA7\x51 |1 + \xA6\x4F |1 + \xBC\x69 |1 + \xA9\xF6 |1 + \xA7\xF5 |1 + \xB1\xF9 |1 + \xAA\x64 |1 + \xB2\x7A |1 + \xB5\x67 |1 + \xBF\xA9 |1 + \xB8\xCC |1 + \xA8\xBD |1 + \xC2\xF7 |1 + \xB0\xCE |1 + \xB7\xC4 |1 + \xA7\x5B |1 + \xBF\x4D |1 + \xBF\x5A |1 + \xC4\xA9 |1 + \xC5\xEC |1 + \xC5\xEF |1 + \xAA\x4C |1 + \xB2\x4F |1 + \xC1\x7B |1 + \xA5\xDF |1 + \xB2\xC1 |1 + \xB2\xC9 |1 + \xAA\xAC |1 + \xAA\xA5 |1 + \xC3\xD1 |1 + \xA4\xB0 |1 + \xAF\xF9 |1 + \xA8\xEB |1 + \xA4\xC1 |1 + \xAB\xD7 |1 + \xA9\xDD |1 + \xBF\x7D |1 + \xA6\x76 |1 + \xAC\x7D |1 + \xBC\xC9 |1 + \xBF\xE7 |1 + \xA6\xE6 |1 + \xAD\xB0 |1 + \xA8\xA3 |1 + \xB9\xF8 |1 + \xC9\x4A |0 + \xDD\xFC |0 + \xB6\xEF |1 + \xB4\xB8 |1 + \xE8\xF9 |1 + \xBD\xDE |1 + \xAF\x71 |1 + \xAF\xAB |1 + \xB2\xBB |1 + \xBA\xD6 |1 + \xB9\x74 |1 + \xBA\xEB |1 + \xA6\xD0 |1 + \xBD\xD1 |1 + \xB6\x68 |1 + \xB3\xA3 |1 + \xB6\xBA |1 + \xB9\x7D |1 + \xC0\x5D |1 + \xC5\x62 |1 + \xA1\x4A |0 + \xA1\x57 |0 + \xA1\x59 |0 + \xA1\x5B |0 + \xA1\x5F |0 + \xA1\x60 |0 + \xA1\x63 |0 + \xA1\x64 |0 + \xA1\x67 |0 + \xA1\x68 |0 + \xA1\x6B |0 + \xA1\x6C |0 + \xA1\x6F |0 + \xA1\x70 |0 + \xA1\x73 |0 + \xA1\x74 |0 + \xA1\x77 |0 + \xA1\x78 |0 + \xA1\x7B |0 + \xA1\x7C |0 + \xA1\xC6 |0 + \xA1\xC7 |0 + \xA1\xCA |0 + \xA1\xCB |0 + \xA1\xC8 |0 + \xA1\xC9 |0 + \xA1\x5C |0 + \xA1\x4D |0 + \xA1\x4E |0 + \xA1\x4F |0 + \xA1\x51 |0 + \xA1\x52 |0 + \xA1\x53 |0 + \xA1\x54 |0 + \xA1\x7D |0 + \xA1\x7E |0 + \xA1\xA1 |0 + \xA1\xA2 |0 + \xA1\xA3 |0 + \xA1\xA4 |0 + \xA1\xCC |0 + \xA1\xCD |0 + \xA1\xCE |0 + \xA1\xDE |0 + \xA1\xDF |0 + \xA1\xE0 |0 + \xA1\xE1 |0 + \xA1\xE2 |0 + \xA2\x42 |0 + \xA2\x4C |0 + \xA2\x4D |0 + \xA2\x4E |0 + \xA1\x49 |0 + \xA1\xA8 |1 + \xA1\xAD |0 + \xA2\x43 |0 + \xA2\x48 |0 + \xA1\xAE |0 + \xA1\xA6 |1 + \xA1\x5D |0 + \xA1\x5E |0 + \xA1\xAF |0 + \xA1\xCF |0 + \xA1\x41 |0 + \xA1\xD0 |0 + \xA1\x44 |0 + \xA1\xFE |0 + \xA2\xAF |0 + \xA2\xB0 |0 + \xA2\xB1 |0 + \xA2\xB2 |0 + \xA2\xB3 |0 + \xA2\xB4 |0 + \xA2\xB5 |0 + \xA2\xB6 |0 + \xA2\xB7 |0 + \xA2\xB8 |0 + \xA1\x47 |0 + \xA1\x46 |0 + \xA1\xD5 |0 + \xA1\xD7 |0 + \xA1\xD6 |0 + \xA1\x48 |0 + \xA2\x49 |0 + \xA2\xCF |0 + \xA2\xD0 |0 + \xA2\xD1 |0 + \xA2\xD2 |0 + \xA2\xD3 |0 + \xA2\xD4 |0 + \xA2\xD5 |0 + \xA2\xD6 |0 + \xA2\xD7 |0 + \xA2\xD8 |0 + \xA2\xD9 |0 + \xA2\xDA |0 + \xA2\xDB |0 + \xA2\xDC |0 + \xA2\xDD |0 + \xA2\xDE |0 + \xA2\xDF |0 + \xA2\xE0 |0 + \xA2\xE1 |0 + \xA2\xE2 |0 + \xA2\xE3 |0 + \xA2\xE4 |0 + \xA2\xE5 |0 + \xA2\xE6 |0 + \xA2\xE7 |0 + \xA2\xE8 |0 + \xA1\x65 |1 + \xA2\x40 |0 + \xA1\x66 |1 + \xA1\x73 |1 + \xA1\xC4 |0 + \xA1\xA5 |1 + \xA2\xE9 |0 + \xA2\xEA |0 + \xA2\xEB |0 + \xA2\xEC |0 + \xA2\xED |0 + \xA2\xEE |0 + \xA2\xEF |0 + \xA2\xF0 |0 + \xA2\xF1 |0 + \xA2\xF2 |0 + \xA2\xF3 |0 + \xA2\xF4 |0 + \xA2\xF5 |0 + \xA2\xF6 |0 + \xA2\xF7 |0 + \xA2\xF8 |0 + \xA2\xF9 |0 + \xA2\xFA |0 + \xA2\xFB |0 + \xA2\xFC |0 + \xA2\xFD |0 + \xA2\xFE |0 + \xA3\x40 |0 + \xA3\x41 |0 + \xA3\x42 |0 + \xA3\x43 |0 + \xA1\x61 |0 + \xA1\x55 |0 + \xA1\x62 |0 + \xA1\xE3 |0 + \xA1\x4E |1 + \xA2\x46 |0 + \xA2\x47 |0 + \xA1\xC3 |0 + \xA2\x44 |0 +END CHARMAP diff --git a/icuSources/data/misc/CurrencyData.txt b/icuSources/data/misc/CurrencyData.txt new file mode 100644 index 00000000..3d715ea3 --- /dev/null +++ b/icuSources/data/misc/CurrencyData.txt @@ -0,0 +1,296 @@ +// *************************************************************************** +// * +// * Copyright (C) 1997-2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +CurrencyData{ + // Currency metadata. Unlike the "Currencies" element, this is + // NOT true locale data. It exists only in root. The two + // integers are the fraction digits for each currency, and the + // rounding increment. The fraction digits must be an integer + // from 0..9. If there is no rounding, the rounding increment is + // zero. Otherwise the rounding increment is given in units of + // 10^(-fraction_digits). The special tag "DEFAULT" gives the + // meta data for all currencies not otherwise listed. + // Last update: Tue Apr 8 16:57:42 2003 + CurrencyMeta { + ADP:intvector { 0, 0 } // Andorran Peseta: ANDORRA (AD) + BHD:intvector { 3, 0 } // Bahraini Dinar: BAHRAIN (BH) + BIF:intvector { 0, 0 } // Burundi Franc: BURUNDI (BI) + BYR:intvector { 0, 0 } // Belarussian Ruble: BELARUS (BY) + CHF:intvector { 2, 5 } // Swiss Franc: LIECHTENSTEIN (LI), SWITZERLAND (CH) + CLF:intvector { 0, 0 } // Unidades de fomento: CHILE (CL) + CLP:intvector { 0, 0 } // Chilean Peso: CHILE (CL) + DJF:intvector { 0, 0 } // Djibouti Franc: DJIBOUTI (DJ) + GNF:intvector { 0, 0 } // Guinea Franc: GUINEA (GN) + IQD:intvector { 3, 0 } // Iraqi Dinar: IRAQ (IQ) + ITL:intvector { 0, 0 } // Italian Lira: ITALY (IT) + JOD:intvector { 3, 0 } // Jordanian Dinar: JORDAN (JO) + JPY:intvector { 0, 0 } // Yen: JAPAN (JP) + KMF:intvector { 0, 0 } // Comoro Franc: COMOROS (KM) + KRW:intvector { 0, 0 } // Won: KOREA, REPUBLIC OF (KR) + KWD:intvector { 3, 0 } // Kuwaiti Dinar: KUWAIT (KW) + LYD:intvector { 3, 0 } // Lybian Dinar: LIBYAN ARAB JAMAHIRIYA (LY) + MGF:intvector { 0, 0 } // Malagasy Franc: MADAGASCAR (MG) + OMR:intvector { 3, 0 } // Rial Omani: OMAN (OM) + PYG:intvector { 0, 0 } // Guarani: PARAGUAY (PY) + RWF:intvector { 0, 0 } // Rwanda Franc: RWANDA (RW) + TND:intvector { 3, 0 } // Tunisian Dinar: TUNISIA (TN) + TRL:intvector { 0, 0 } // Turkish Lira: TURKEY (TR) + VUV:intvector { 0, 0 } // Vatu: VANUATU (VU) + XAF:intvector { 0, 0 } // CFA Franc BEAC: CAMEROON (CM), CENTRAL AFRICAN REPUBLIC (CF), CHAD (TD), CONGO (CG), EQUATORIAL GUINEA (GQ), GABON (GA) + XOF:intvector { 0, 0 } // CFA Franc BCEAO: BENIN (BJ), BURKINA FASO (BF), COTE D'IVOIRE (CI), GUINEA-BISSAU (GW), MALI (ML), NIGER (NE), SENEGAL (SN), TOGO (TG) + XPF:intvector { 0, 0 } // CFP Franc: FRENCH POLYNESIA (PF), NEW CALEDONIA (NC), WALLIS AND FUTUNA (WF) + DEFAULT:intvector { 2, 0 } // (All currencies not listed) + } + // Map from ISO 3166 country codes to ISO 4217 currency codes + // NOTE: This is not true locale data; it exists only in ROOT + // Last update: Tue Apr 8 16:57:42 2003 + CurrencyMap { + _EURO { "EUR" } // : Euro + AE { "AED" } // UNITED ARAB EMIRATES: UAE Dirham + AF { "AFN" } // AFGHANISTAN: Afghani + AG { "XCD" } // ANTIGUA AND BARBUDA: East Caribbean Dollar + AI { "XCD" } // ANGUILLA: East Caribbean Dollar + AL { "ALL" } // ALBANIA: Leck + AM { "AMD" } // ARMENIA: Armenian Dram + AN { "ANG" } // NETHERLANDS ANTILLES: Netherlands Antillan Guilder + AO { "AOA" } // ANGOLA: Kwanza + AR { "ARS" } // ARGENTINA: Argentine Peso + AS { "USD" } // AMERICAN SAMOA: US Dollar + AT { "EUR" } // AUSTRIA: Euro + AT_PREEURO { "ATS" } + AU { "AUD" } // AUSTRALIA: Australian Dollar + AW { "AWG" } // ARUBA: Aruban Guilder + AZ { "AZM" } // AZERBAIJAN: Azerbaijanian Manat + BA { "BAM" } // BOSNIA AND HERZEGOVINA: Convertible Marks + BB { "BBD" } // BARBADOS: Barbados Dollar + BD { "BDT" } // BANGLADESH: Taka + BE { "EUR" } // BELGIUM: Euro + BE_PREEURO { "BEF" } + BF { "XOF" } // BURKINA FASO: CFA Franc BCEAO + BG { "BGN" } // BULGARIA: Bulgarian Lev + BH { "BHD" } // BAHRAIN: Bahraini Dinar + BI { "BIF" } // BURUNDI: Burundi Franc + BJ { "XOF" } // BENIN: CFA Franc BCEAO + BM { "BMD" } // BERMUDA: Bermudian Dollar + BN { "BND" } // BRUNEI DARUSSALAM: Brunei Dollar + BO { "BOB" } // BOLIVIA: Boliviano + BR { "BRL" } // BRAZIL: Brazilian Real + BS { "BSD" } // BAHAMAS: Bahamian Dollar + BV { "NOK" } // BOUVET ISLAND: Norwegian Krone + BW { "BWP" } // BOTSWANA: Pula + BY { "BYR" } // BELARUS: Belarussian Ruble + BZ { "BZD" } // BELIZE: Belize Dollar + CA { "CAD" } // CANADA: Canadian Dollar + CC { "AUD" } // COCOS (KEELING) ISLANDS: Australian Dollar + CD { "CDF" } // CONGO, THE DEMOCRATIC REPUBLIC OF THE: Franc Congolais + CF { "XAF" } // CENTRAL AFRICAN REPUBLIC: CFA Franc BEAC + CG { "XAF" } // CONGO: CFA Franc BEAC + CH { "CHF" } // SWITZERLAND: Swiss Franc + CI { "XOF" } // COTE D'IVOIRE: CFA Franc BCEAO + CK { "NZD" } // COOK ISLANDS: New Zealand Dollar + CL { "CLP" } // CHILE: Chilean Peso + CM { "XAF" } // CAMEROON: CFA Franc BEAC + CN { "CNY" } // CHINA: Yuan Renminbi + CO { "COP" } // COLOMBIA: Colombian Peso + CR { "CRC" } // COSTA RICA: Costa Rican Colon + CU { "CUP" } // CUBA: Cuban Peso + CV { "CVE" } // CAPE VERDE: Cape Verde Escudo + CX { "AUD" } // CHRISTMAS ISLAND: Australian Dollar + CY { "CYP" } // CYPRUS: Cyprus Pound + CZ { "CZK" } // CZECH REPUBLIC: Czech Koruna + DE { "EUR" } // GERMANY: Euro + DE_PREEURO { "DEM" } + DJ { "DJF" } // DJIBOUTI: Djibouti Franc + DK { "DKK" } // DENMARK: Danish Krone + DM { "XCD" } // DOMINICA: East Caribbean Dollar + DO { "DOP" } // DOMINICAN REPUBLIC: Dominican Peso + DZ { "DZD" } // ALGERIA: Algerian Dinar + EC { "USD" } // ECUADOR: US Dollar + EE { "EEK" } // ESTONIA: Kroon + EG { "EGP" } // EGYPT: Egyptian Pound + EH { "MAD" } // WESTERN SAHARA: Moroccan Dirham + ER { "ERN" } // ERITREA: Nakfa + ES { "EUR" } // SPAIN: Euro + ES_PREEURO { "ESP" } + ET { "ETB" } // ETHIOPIA: Ethiopian Birr + FI { "EUR" } // FINLAND: Euro + FI_PREEURO { "FIM" } + FJ { "FJD" } // FIJI: Fiji Dollar + FK { "FKP" } // FALKLAND ISLANDS (MALVINAS): Falkland Islands Pound + FM { "USD" } // MICRONESIA, FEDERATED STATES OF: US Dollar + FO { "DKK" } // FAROE ISLANDS: Danish Krone + FR { "EUR" } // FRANCE: Euro + FR_PREEURO { "FRF" } + GA { "XAF" } // GABON: CFA Franc BEAC + GB { "GBP" } // UNITED KINGDOM: Pound Sterling + GD { "XCD" } // GRENADA: East Caribbean Dollar + GE { "GEL" } // GEORGIA: Lari + GF { "EUR" } // FRENCH GUIANA: Euro + GH { "GHC" } // GHANA: Cedi + GI { "GIP" } // GIBRALTAR: Gibraltar Pound + GL { "DKK" } // GREENLAND: Danish Krone + GM { "GMD" } // GAMBIA: Dalasi + GN { "GNF" } // GUINEA: Guinea Franc + GP { "EUR" } // GUADELOUPE: Euro + GQ { "XAF" } // EQUATORIAL GUINEA: CFA Franc BEAC + GR { "EUR" } // GREECE: Euro + GR_PREEURO { "GRD" } + GT { "GTQ" } // GUATEMALA: Quetzal + GU { "USD" } // GUAM: US Dollar + GY { "GYD" } // GUYANA: Guyana Dollar + HK { "HKD" } // HONG KONG: Hong Kong Dollar + HM { "AUD" } // HEARD ISLAND AND MCDONALD ISLANDS: Australian Dollar + HN { "HNL" } // HONDURAS: Lempira + HR { "HRK" } // CROATIA: Croatian kuna + HU { "HUF" } // HUNGARY: Forint + ID { "IDR" } // INDONESIA: Rupiah + IE { "EUR" } // IRELAND: Euro + IE_PREEURO { "IEP" } + IL { "ILS" } // ISRAEL: New Israeli Sheqel + IN { "INR" } // INDIA: Indian Rupee + IO { "USD" } // BRITISH INDIAN OCEAN TERRITORY: US Dollar + IQ { "IQD" } // IRAQ: Iraqi Dinar + IR { "IRR" } // IRAN, ISLAMIC REPUBLIC OF: Iranian Rial + IS { "ISK" } // ICELAND: Iceland Krona + IT { "EUR" } // ITALY: Euro + IT_PREEURO { "ITL" } + JM { "JMD" } // JAMAICA: Jamaican Dollar + JO { "JOD" } // JORDAN: Jordanian Dinar + JP { "JPY" } // JAPAN: Yen + KE { "KES" } // KENYA: Kenyan Shilling + KG { "KGS" } // KYRGYZSTAN: Som + KH { "KHR" } // CAMBODIA: Riel + KI { "AUD" } // KIRIBATI: Australian Dollar + KM { "KMF" } // COMOROS: Comoro Franc + KN { "XCD" } // SAINT KITTS AND NEVIS: East Caribbean Dollar + KP { "KPW" } // KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF: North Korean Won + KR { "KRW" } // KOREA, REPUBLIC OF: Won + KW { "KWD" } // KUWAIT: Kuwaiti Dinar + KY { "KYD" } // CAYMAN ISLANDS: Cayman Islands Dollar + KZ { "KZT" } // KAZAKHSTAN: Tenge + LA { "LAK" } // LAO PEOPLE'S DEMOCRATIC REPUBLIC: Kip + LB { "LBP" } // LEBANON: Lebanese Pound + LC { "XCD" } // SAINT LUCIA: East Caribbean Dollar + LI { "CHF" } // LIECHTENSTEIN: Swiss Franc + LK { "LKR" } // SRI LANKA: Sri Lanka Rupee + LR { "LRD" } // LIBERIA: Liberian Dollar + LT { "LTL" } // LITHUANIA: Lithuanian Litas + LU { "EUR" } // LUXEMBOURG: Euro + LU_PREEURO { "LUF" } + LV { "LVL" } // LATVIA: Latvian Lats + LY { "LYD" } // LIBYAN ARAB JAMAHIRIYA: Lybian Dinar + MA { "MAD" } // MOROCCO: Moroccan Dirham + MC { "EUR" } // MONACO: Euro + MD { "MDL" } // MOLDOVA, REPUBLIC OF: Moldovan Leu + MG { "MGF" } // MADAGASCAR: Malagasy Franc + MH { "USD" } // MARSHALL ISLANDS: US Dollar + MK { "MKD" } // MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF: Denar + ML { "XOF" } // MALI: CFA Franc BCEAO + MM { "MMK" } // MYANMAR: Kyat + MN { "MNT" } // MONGOLIA: Tugrik + MO { "MOP" } // MACAO: Pataca + MP { "USD" } // NORTHERN MARIANA ISLANDS: US Dollar + MQ { "EUR" } // MARTINIQUE: Euro + MR { "MRO" } // MAURITANIA: Ouguiya + MS { "XCD" } // MONTSERRAT: East Caribbean Dollar + MT { "MTL" } // MALTA: Maltese Lira + MU { "MUR" } // MAURITIUS: Mauritius Rupee + MV { "MVR" } // MALDIVES: Rufiyaa + MW { "MWK" } // MALAWI: Kwacha + MX { "MXN" } // MEXICO: Mexican Peso + MY { "MYR" } // MALAYSIA: Malaysian Ringgit + MZ { "MZM" } // MOZAMBIQUE: Metical + NC { "XPF" } // NEW CALEDONIA: CFP Franc + NE { "XOF" } // NIGER: CFA Franc BCEAO + NF { "AUD" } // NORFOLK ISLAND: Australian Dollar + NG { "NGN" } // NIGERIA: Naira + NI { "NIO" } // NICARAGUA: Cordoba Oro + NL { "EUR" } // NETHERLANDS: Euro + NL_PREEURO { "NLG" } + NO { "NOK" } // NORWAY: Norwegian Krone + NP { "NPR" } // NEPAL: Nepalese Rupee + NR { "AUD" } // NAURU: Australian Dollar + NU { "NZD" } // NIUE: New Zealand Dollar + NZ { "NZD" } // NEW ZEALAND: New Zealand Dollar + OM { "OMR" } // OMAN: Rial Omani + PA { "PAB" } // PANAMA: Balboa + PE { "PEN" } // PERU: Nuevo Sol + PF { "XPF" } // FRENCH POLYNESIA: CFP Franc + PG { "PGK" } // PAPUA NEW GUINEA: Kina + PH { "PHP" } // PHILIPPINES: Philippine Peso + PK { "PKR" } // PAKISTAN: Pakistan Rupee + PL { "PLN" } // POLAND: Zloty + PM { "EUR" } // SAINT PIERRE AND MIQUELON: Euro + PN { "NZD" } // PITCAIRN: New Zealand Dollar + PR { "USD" } // PUERTO RICO: US Dollar + PT { "EUR" } // PORTUGAL: Euro + PT_PREEURO { "PTE" } + PW { "USD" } // PALAU: US Dollar + PY { "PYG" } // PARAGUAY: Guarani + QA { "QAR" } // QATAR: Qatari Rial + RE { "EUR" } // REUNION: Euro + RO { "ROL" } // ROMANIA: Leu + RU { "RUB" } // RUSSIAN FEDERATION: Russian Ruble + RW { "RWF" } // RWANDA: Rwanda Franc + SA { "SAR" } // SAUDI ARABIA: Saudi Riyal + SB { "SBD" } // SOLOMON ISLANDS: Solomon Islands Dollar + SC { "SCR" } // SEYCHELLES: Seychelles Rupee + SD { "SDD" } // SUDAN: Sudanese Dinar + SE { "SEK" } // SWEDEN: Swedish Krona + SG { "SGD" } // SINGAPORE: Singapore Dollar + SH { "SHP" } // SAINT HELENA: Saint Helena Pound + SI { "SIT" } // SLOVENIA: Tolar + SJ { "NOK" } // SVALBARD AND JAN MAYEN: Norwegian Krone + SK { "SKK" } // SLOVAKIA: Slovak Koruna + SL { "SLL" } // SIERRA LEONE: Leone + SM { "EUR" } // SAN MARINO: Euro + SN { "XOF" } // SENEGAL: CFA Franc BCEAO + SO { "SOS" } // SOMALIA: Somali Shilling + SR { "SRG" } // SURINAME: Suriname Guilder + ST { "STD" } // SAO TOME AND PRINCIPE: Dobra + SV { "SVC" } // EL SALVADOR: El Salvador Colon + SY { "SYP" } // SYRIAN ARAB REPUBLIC: Syrian Pound + SZ { "SZL" } // SWAZILAND: Lilangeni + TC { "USD" } // TURKS AND CAICOS ISLANDS: US Dollar + TD { "XAF" } // CHAD: CFA Franc BEAC + TF { "EUR" } // FRENCH SOUTHERN TERRITORIES: Euro + TG { "XOF" } // TOGO: CFA Franc BCEAO + TH { "THB" } // THAILAND: Baht + TJ { "TJS" } // TAJIKISTAN: Somoni + TK { "NZD" } // TOKELAU: New Zealand Dollar + TL { "USD" } // TIMOR-LESTE: US Dollar + TM { "TMM" } // TURKMENISTAN: Manat + TN { "TND" } // TUNISIA: Tunisian Dinar + TO { "TOP" } // TONGA: Pa'anga + TR { "TRY" } // TURKEY: New Turkish Lira + TT { "TTD" } // TRINIDAD AND TOBAGO: Trinidad and Tobago Dollar + TV { "AUD" } // TUVALU: Australian Dollar + TW { "TWD" } // TAIWAN, PROVINCE OF CHINA: New Taiwan Dollar + TZ { "TZS" } // TANZANIA, UNITED REPUBLIC OF: Tanzanian Shilling + UA { "UAH" } // UKRAINE: Hryvnia + UG { "UGX" } // UGANDA: Uganda Shilling + UM { "USD" } // UNITED STATES MINOR OUTLYING ISLANDS: US Dollar + US { "USD" } // UNITED STATES: US Dollar + UY { "UYU" } // URUGUAY: Peso Uruguayo + UZ { "UZS" } // UZBEKISTAN: Uzbekistan Sum + VA { "EUR" } // HOLY SEE (VATICAN CITY STATE): Euro + VC { "XCD" } // SAINT VINCENT AND THE GRENADINES: East Caribbean Dollar + VE { "VEB" } // VENEZUELA: Bolivar + VG { "USD" } // VIRGIN ISLANDS, BRITISH: US Dollar + VI { "USD" } // VIRGIN ISLANDS, U.S.: US Dollar + VN { "VND" } // VIET NAM: Dong + VU { "VUV" } // VANUATU: Vatu + WF { "XPF" } // WALLIS AND FUTUNA: CFP Franc + WS { "WST" } // SAMOA: Tala + YE { "YER" } // YEMEN: Yemeni Rial + YT { "EUR" } // MAYOTTE: Euro + YU { "YUM" } // YUGOSLAVIA: Yugoslavian Dinar + ZA { "ZAR" } // SOUTH AFRICA: Rand + ZM { "ZMK" } // ZAMBIA: Kwacha + ZW { "ZWD" } // ZIMBABWE: Zimbabwe Dollar + } + + } diff --git a/icuSources/data/misc/NamePrepProfile.txt b/icuSources/data/misc/NamePrepProfile.txt new file mode 100644 index 00000000..46e90866 --- /dev/null +++ b/icuSources/data/misc/NamePrepProfile.txt @@ -0,0 +1,1945 @@ +################# +# This file was generated from RFC 3454 (http://www.ietf.org/rfc/rfc3454.txt) +# Copyright (C) The Internet Society (2002). All Rights Reserved. +################### + +################### +# WARNING: This table is generated by filterRFC3454.pl tool. DO NOT EDIT +################### + +# This table contains code points from Table A.1 from RFC 3454 + +0221; ; UNASSIGNED +0234..024F; ; UNASSIGNED +02AE..02AF; ; UNASSIGNED +02EF..02FF; ; UNASSIGNED +0350..035F; ; UNASSIGNED +0370..0373; ; UNASSIGNED +0376..0379; ; UNASSIGNED +037B..037D; ; UNASSIGNED +037F..0383; ; UNASSIGNED +038B; ; UNASSIGNED +038D; ; UNASSIGNED +03A2; ; UNASSIGNED +03CF; ; UNASSIGNED +03F7..03FF; ; UNASSIGNED +0487; ; UNASSIGNED +04CF; ; UNASSIGNED +04F6..04F7; ; UNASSIGNED +04FA..04FF; ; UNASSIGNED +0510..0530; ; UNASSIGNED +0557..0558; ; UNASSIGNED +0560; ; UNASSIGNED +0588; ; UNASSIGNED +058B..0590; ; UNASSIGNED +05A2; ; UNASSIGNED +05BA; ; UNASSIGNED +05C5..05CF; ; UNASSIGNED +05EB..05EF; ; UNASSIGNED +05F5..060B; ; UNASSIGNED +060D..061A; ; UNASSIGNED +061C..061E; ; UNASSIGNED +0620; ; UNASSIGNED +063B..063F; ; UNASSIGNED +0656..065F; ; UNASSIGNED +06EE..06EF; ; UNASSIGNED +06FF; ; UNASSIGNED +070E; ; UNASSIGNED +072D..072F; ; UNASSIGNED +074B..077F; ; UNASSIGNED +07B2..0900; ; UNASSIGNED +0904; ; UNASSIGNED +093A..093B; ; UNASSIGNED +094E..094F; ; UNASSIGNED +0955..0957; ; UNASSIGNED +0971..0980; ; UNASSIGNED +0984; ; UNASSIGNED +098D..098E; ; UNASSIGNED +0991..0992; ; UNASSIGNED +09A9; ; UNASSIGNED +09B1; ; UNASSIGNED +09B3..09B5; ; UNASSIGNED +09BA..09BB; ; UNASSIGNED +09BD; ; UNASSIGNED +09C5..09C6; ; UNASSIGNED +09C9..09CA; ; UNASSIGNED +09CE..09D6; ; UNASSIGNED +09D8..09DB; ; UNASSIGNED +09DE; ; UNASSIGNED +09E4..09E5; ; UNASSIGNED +09FB..0A01; ; UNASSIGNED +0A03..0A04; ; UNASSIGNED +0A0B..0A0E; ; UNASSIGNED +0A11..0A12; ; UNASSIGNED +0A29; ; UNASSIGNED +0A31; ; UNASSIGNED +0A34; ; UNASSIGNED +0A37; ; UNASSIGNED +0A3A..0A3B; ; UNASSIGNED +0A3D; ; UNASSIGNED +0A43..0A46; ; UNASSIGNED +0A49..0A4A; ; UNASSIGNED +0A4E..0A58; ; UNASSIGNED +0A5D; ; UNASSIGNED +0A5F..0A65; ; UNASSIGNED +0A75..0A80; ; UNASSIGNED +0A84; ; UNASSIGNED +0A8C; ; UNASSIGNED +0A8E; ; UNASSIGNED +0A92; ; UNASSIGNED +0AA9; ; UNASSIGNED +0AB1; ; UNASSIGNED +0AB4; ; UNASSIGNED +0ABA..0ABB; ; UNASSIGNED +0AC6; ; UNASSIGNED +0ACA; ; UNASSIGNED +0ACE..0ACF; ; UNASSIGNED +0AD1..0ADF; ; UNASSIGNED +0AE1..0AE5; ; UNASSIGNED +0AF0..0B00; ; UNASSIGNED +0B04; ; UNASSIGNED +0B0D..0B0E; ; UNASSIGNED +0B11..0B12; ; UNASSIGNED +0B29; ; UNASSIGNED +0B31; ; UNASSIGNED +0B34..0B35; ; UNASSIGNED +0B3A..0B3B; ; UNASSIGNED +0B44..0B46; ; UNASSIGNED +0B49..0B4A; ; UNASSIGNED +0B4E..0B55; ; UNASSIGNED +0B58..0B5B; ; UNASSIGNED +0B5E; ; UNASSIGNED +0B62..0B65; ; UNASSIGNED +0B71..0B81; ; UNASSIGNED +0B84; ; UNASSIGNED +0B8B..0B8D; ; UNASSIGNED +0B91; ; UNASSIGNED +0B96..0B98; ; UNASSIGNED +0B9B; ; UNASSIGNED +0B9D; ; UNASSIGNED +0BA0..0BA2; ; UNASSIGNED +0BA5..0BA7; ; UNASSIGNED +0BAB..0BAD; ; UNASSIGNED +0BB6; ; UNASSIGNED +0BBA..0BBD; ; UNASSIGNED +0BC3..0BC5; ; UNASSIGNED +0BC9; ; UNASSIGNED +0BCE..0BD6; ; UNASSIGNED +0BD8..0BE6; ; UNASSIGNED +0BF3..0C00; ; UNASSIGNED +0C04; ; UNASSIGNED +0C0D; ; UNASSIGNED +0C11; ; UNASSIGNED +0C29; ; UNASSIGNED +0C34; ; UNASSIGNED +0C3A..0C3D; ; UNASSIGNED +0C45; ; UNASSIGNED +0C49; ; UNASSIGNED +0C4E..0C54; ; UNASSIGNED +0C57..0C5F; ; UNASSIGNED +0C62..0C65; ; UNASSIGNED +0C70..0C81; ; UNASSIGNED +0C84; ; UNASSIGNED +0C8D; ; UNASSIGNED +0C91; ; UNASSIGNED +0CA9; ; UNASSIGNED +0CB4; ; UNASSIGNED +0CBA..0CBD; ; UNASSIGNED +0CC5; ; UNASSIGNED +0CC9; ; UNASSIGNED +0CCE..0CD4; ; UNASSIGNED +0CD7..0CDD; ; UNASSIGNED +0CDF; ; UNASSIGNED +0CE2..0CE5; ; UNASSIGNED +0CF0..0D01; ; UNASSIGNED +0D04; ; UNASSIGNED +0D0D; ; UNASSIGNED +0D11; ; UNASSIGNED +0D29; ; UNASSIGNED +0D3A..0D3D; ; UNASSIGNED +0D44..0D45; ; UNASSIGNED +0D49; ; UNASSIGNED +0D4E..0D56; ; UNASSIGNED +0D58..0D5F; ; UNASSIGNED +0D62..0D65; ; UNASSIGNED +0D70..0D81; ; UNASSIGNED +0D84; ; UNASSIGNED +0D97..0D99; ; UNASSIGNED +0DB2; ; UNASSIGNED +0DBC; ; UNASSIGNED +0DBE..0DBF; ; UNASSIGNED +0DC7..0DC9; ; UNASSIGNED +0DCB..0DCE; ; UNASSIGNED +0DD5; ; UNASSIGNED +0DD7; ; UNASSIGNED +0DE0..0DF1; ; UNASSIGNED +0DF5..0E00; ; UNASSIGNED +0E3B..0E3E; ; UNASSIGNED +0E5C..0E80; ; UNASSIGNED +0E83; ; UNASSIGNED +0E85..0E86; ; UNASSIGNED +0E89; ; UNASSIGNED +0E8B..0E8C; ; UNASSIGNED +0E8E..0E93; ; UNASSIGNED +0E98; ; UNASSIGNED +0EA0; ; UNASSIGNED +0EA4; ; UNASSIGNED +0EA6; ; UNASSIGNED +0EA8..0EA9; ; UNASSIGNED +0EAC; ; UNASSIGNED +0EBA; ; UNASSIGNED +0EBE..0EBF; ; UNASSIGNED +0EC5; ; UNASSIGNED +0EC7; ; UNASSIGNED +0ECE..0ECF; ; UNASSIGNED +0EDA..0EDB; ; UNASSIGNED +0EDE..0EFF; ; UNASSIGNED +0F48; ; UNASSIGNED +0F6B..0F70; ; UNASSIGNED +0F8C..0F8F; ; UNASSIGNED +0F98; ; UNASSIGNED +0FBD; ; UNASSIGNED +0FCD..0FCE; ; UNASSIGNED +0FD0..0FFF; ; UNASSIGNED +1022; ; UNASSIGNED +1028; ; UNASSIGNED +102B; ; UNASSIGNED +1033..1035; ; UNASSIGNED +103A..103F; ; UNASSIGNED +105A..109F; ; UNASSIGNED +10C6..10CF; ; UNASSIGNED +10F9..10FA; ; UNASSIGNED +10FC..10FF; ; UNASSIGNED +115A..115E; ; UNASSIGNED +11A3..11A7; ; UNASSIGNED +11FA..11FF; ; UNASSIGNED +1207; ; UNASSIGNED +1247; ; UNASSIGNED +1249; ; UNASSIGNED +124E..124F; ; UNASSIGNED +1257; ; UNASSIGNED +1259; ; UNASSIGNED +125E..125F; ; UNASSIGNED +1287; ; UNASSIGNED +1289; ; UNASSIGNED +128E..128F; ; UNASSIGNED +12AF; ; UNASSIGNED +12B1; ; UNASSIGNED +12B6..12B7; ; UNASSIGNED +12BF; ; UNASSIGNED +12C1; ; UNASSIGNED +12C6..12C7; ; UNASSIGNED +12CF; ; UNASSIGNED +12D7; ; UNASSIGNED +12EF; ; UNASSIGNED +130F; ; UNASSIGNED +1311; ; UNASSIGNED +1316..1317; ; UNASSIGNED +131F; ; UNASSIGNED +1347; ; UNASSIGNED +135B..1360; ; UNASSIGNED +137D..139F; ; UNASSIGNED +13F5..1400; ; UNASSIGNED +1677..167F; ; UNASSIGNED +169D..169F; ; UNASSIGNED +16F1..16FF; ; UNASSIGNED +170D; ; UNASSIGNED +1715..171F; ; UNASSIGNED +1737..173F; ; UNASSIGNED +1754..175F; ; UNASSIGNED +176D; ; UNASSIGNED +1771; ; UNASSIGNED +1774..177F; ; UNASSIGNED +17DD..17DF; ; UNASSIGNED +17EA..17FF; ; UNASSIGNED +180F; ; UNASSIGNED +181A..181F; ; UNASSIGNED +1878..187F; ; UNASSIGNED +18AA..1DFF; ; UNASSIGNED +1E9C..1E9F; ; UNASSIGNED +1EFA..1EFF; ; UNASSIGNED +1F16..1F17; ; UNASSIGNED +1F1E..1F1F; ; UNASSIGNED +1F46..1F47; ; UNASSIGNED +1F4E..1F4F; ; UNASSIGNED +1F58; ; UNASSIGNED +1F5A; ; UNASSIGNED +1F5C; ; UNASSIGNED +1F5E; ; UNASSIGNED +1F7E..1F7F; ; UNASSIGNED +1FB5; ; UNASSIGNED +1FC5; ; UNASSIGNED +1FD4..1FD5; ; UNASSIGNED +1FDC; ; UNASSIGNED +1FF0..1FF1; ; UNASSIGNED +1FF5; ; UNASSIGNED +1FFF; ; UNASSIGNED +2053..2056; ; UNASSIGNED +2058..205E; ; UNASSIGNED +2064..2069; ; UNASSIGNED +2072..2073; ; UNASSIGNED +208F..209F; ; UNASSIGNED +20B2..20CF; ; UNASSIGNED +20EB..20FF; ; UNASSIGNED +213B..213C; ; UNASSIGNED +214C..2152; ; UNASSIGNED +2184..218F; ; UNASSIGNED +23CF..23FF; ; UNASSIGNED +2427..243F; ; UNASSIGNED +244B..245F; ; UNASSIGNED +24FF; ; UNASSIGNED +2614..2615; ; UNASSIGNED +2618; ; UNASSIGNED +267E..267F; ; UNASSIGNED +268A..2700; ; UNASSIGNED +2705; ; UNASSIGNED +270A..270B; ; UNASSIGNED +2728; ; UNASSIGNED +274C; ; UNASSIGNED +274E; ; UNASSIGNED +2753..2755; ; UNASSIGNED +2757; ; UNASSIGNED +275F..2760; ; UNASSIGNED +2795..2797; ; UNASSIGNED +27B0; ; UNASSIGNED +27BF..27CF; ; UNASSIGNED +27EC..27EF; ; UNASSIGNED +2B00..2E7F; ; UNASSIGNED +2E9A; ; UNASSIGNED +2EF4..2EFF; ; UNASSIGNED +2FD6..2FEF; ; UNASSIGNED +2FFC..2FFF; ; UNASSIGNED +3040; ; UNASSIGNED +3097..3098; ; UNASSIGNED +3100..3104; ; UNASSIGNED +312D..3130; ; UNASSIGNED +318F; ; UNASSIGNED +31B8..31EF; ; UNASSIGNED +321D..321F; ; UNASSIGNED +3244..3250; ; UNASSIGNED +327C..327E; ; UNASSIGNED +32CC..32CF; ; UNASSIGNED +32FF; ; UNASSIGNED +3377..337A; ; UNASSIGNED +33DE..33DF; ; UNASSIGNED +33FF; ; UNASSIGNED +4DB6..4DFF; ; UNASSIGNED +9FA6..9FFF; ; UNASSIGNED +A48D..A48F; ; UNASSIGNED +A4C7..ABFF; ; UNASSIGNED +D7A4..D7FF; ; UNASSIGNED +FA2E..FA2F; ; UNASSIGNED +FA6B..FAFF; ; UNASSIGNED +FB07..FB12; ; UNASSIGNED +FB18..FB1C; ; UNASSIGNED +FB37; ; UNASSIGNED +FB3D; ; UNASSIGNED +FB3F; ; UNASSIGNED +FB42; ; UNASSIGNED +FB45; ; UNASSIGNED +FBB2..FBD2; ; UNASSIGNED +FD40..FD4F; ; UNASSIGNED +FD90..FD91; ; UNASSIGNED +FDC8..FDCF; ; UNASSIGNED +FDFD..FDFF; ; UNASSIGNED +FE10..FE1F; ; UNASSIGNED +FE24..FE2F; ; UNASSIGNED +FE47..FE48; ; UNASSIGNED +FE53; ; UNASSIGNED +FE67; ; UNASSIGNED +FE6C..FE6F; ; UNASSIGNED +FE75; ; UNASSIGNED +FEFD..FEFE; ; UNASSIGNED +FF00; ; UNASSIGNED +FFBF..FFC1; ; UNASSIGNED +FFC8..FFC9; ; UNASSIGNED +FFD0..FFD1; ; UNASSIGNED +FFD8..FFD9; ; UNASSIGNED +FFDD..FFDF; ; UNASSIGNED +FFE7; ; UNASSIGNED +FFEF..FFF8; ; UNASSIGNED +10000..102FF; ; UNASSIGNED +1031F; ; UNASSIGNED +10324..1032F; ; UNASSIGNED +1034B..103FF; ; UNASSIGNED +10426..10427; ; UNASSIGNED +1044E..1CFFF; ; UNASSIGNED +1D0F6..1D0FF; ; UNASSIGNED +1D127..1D129; ; UNASSIGNED +1D1DE..1D3FF; ; UNASSIGNED +1D455; ; UNASSIGNED +1D49D; ; UNASSIGNED +1D4A0..1D4A1; ; UNASSIGNED +1D4A3..1D4A4; ; UNASSIGNED +1D4A7..1D4A8; ; UNASSIGNED +1D4AD; ; UNASSIGNED +1D4BA; ; UNASSIGNED +1D4BC; ; UNASSIGNED +1D4C1; ; UNASSIGNED +1D4C4; ; UNASSIGNED +1D506; ; UNASSIGNED +1D50B..1D50C; ; UNASSIGNED +1D515; ; UNASSIGNED +1D51D; ; UNASSIGNED +1D53A; ; UNASSIGNED +1D53F; ; UNASSIGNED +1D545; ; UNASSIGNED +1D547..1D549; ; UNASSIGNED +1D551; ; UNASSIGNED +1D6A4..1D6A7; ; UNASSIGNED +1D7CA..1D7CD; ; UNASSIGNED +1D800..1FFFD; ; UNASSIGNED +2A6D7..2F7FF; ; UNASSIGNED +2FA1E..2FFFD; ; UNASSIGNED +30000..3FFFD; ; UNASSIGNED +40000..4FFFD; ; UNASSIGNED +50000..5FFFD; ; UNASSIGNED +60000..6FFFD; ; UNASSIGNED +70000..7FFFD; ; UNASSIGNED +80000..8FFFD; ; UNASSIGNED +90000..9FFFD; ; UNASSIGNED +A0000..AFFFD; ; UNASSIGNED +B0000..BFFFD; ; UNASSIGNED +C0000..CFFFD; ; UNASSIGNED +D0000..DFFFD; ; UNASSIGNED +E0000; ; UNASSIGNED +E0002..E001F; ; UNASSIGNED +E0080..EFFFD; ; UNASSIGNED + +# Total code points 3653 + +# This table contains code points from Table B.1 from RFC 3454 + +00AD; ; MAP +034F; ; MAP +1806; ; MAP +180B; ; MAP +180C; ; MAP +180D; ; MAP +200B; ; MAP +200C; ; MAP +200D; ; MAP +2060; ; MAP +FE00; ; MAP +FE01; ; MAP +FE02; ; MAP +FE03; ; MAP +FE04; ; MAP +FE05; ; MAP +FE06; ; MAP +FE07; ; MAP +FE08; ; MAP +FE09; ; MAP +FE0A; ; MAP +FE0B; ; MAP +FE0C; ; MAP +FE0D; ; MAP +FE0E; ; MAP +FE0F; ; MAP +FEFF; ; MAP + +# Total code points 27 + +################### +# WARNING: This table is generated by filterRFC3454.pl tool. DO NOT EDIT +################### + +# This table contains code points from Table B.2 from RFC 3454 + +0041; 0061; MAP +0042; 0062; MAP +0043; 0063; MAP +0044; 0064; MAP +0045; 0065; MAP +0046; 0066; MAP +0047; 0067; MAP +0048; 0068; MAP +0049; 0069; MAP +004A; 006A; MAP +004B; 006B; MAP +004C; 006C; MAP +004D; 006D; MAP +004E; 006E; MAP +004F; 006F; MAP +0050; 0070; MAP +0051; 0071; MAP +0052; 0072; MAP +0053; 0073; MAP +0054; 0074; MAP +0055; 0075; MAP +0056; 0076; MAP +0057; 0077; MAP +0058; 0078; MAP +0059; 0079; MAP +005A; 007A; MAP +00B5; 03BC; MAP +00C0; 00E0; MAP +00C1; 00E1; MAP +00C2; 00E2; MAP +00C3; 00E3; MAP +00C4; 00E4; MAP +00C5; 00E5; MAP +00C6; 00E6; MAP +00C7; 00E7; MAP +00C8; 00E8; MAP +00C9; 00E9; MAP +00CA; 00EA; MAP +00CB; 00EB; MAP +00CC; 00EC; MAP +00CD; 00ED; MAP +00CE; 00EE; MAP +00CF; 00EF; MAP +00D0; 00F0; MAP +00D1; 00F1; MAP +00D2; 00F2; MAP +00D3; 00F3; MAP +00D4; 00F4; MAP +00D5; 00F5; MAP +00D6; 00F6; MAP +00D8; 00F8; MAP +00D9; 00F9; MAP +00DA; 00FA; MAP +00DB; 00FB; MAP +00DC; 00FC; MAP +00DD; 00FD; MAP +00DE; 00FE; MAP +00DF; 0073 0073; MAP +0100; 0101; MAP +0102; 0103; MAP +0104; 0105; MAP +0106; 0107; MAP +0108; 0109; MAP +010A; 010B; MAP +010C; 010D; MAP +010E; 010F; MAP +0110; 0111; MAP +0112; 0113; MAP +0114; 0115; MAP +0116; 0117; MAP +0118; 0119; MAP +011A; 011B; MAP +011C; 011D; MAP +011E; 011F; MAP +0120; 0121; MAP +0122; 0123; MAP +0124; 0125; MAP +0126; 0127; MAP +0128; 0129; MAP +012A; 012B; MAP +012C; 012D; MAP +012E; 012F; MAP +0130; 0069 0307; MAP +0132; 0133; MAP +0134; 0135; MAP +0136; 0137; MAP +0139; 013A; MAP +013B; 013C; MAP +013D; 013E; MAP +013F; 0140; MAP +0141; 0142; MAP +0143; 0144; MAP +0145; 0146; MAP +0147; 0148; MAP +0149; 02BC 006E; MAP +014A; 014B; MAP +014C; 014D; MAP +014E; 014F; MAP +0150; 0151; MAP +0152; 0153; MAP +0154; 0155; MAP +0156; 0157; MAP +0158; 0159; MAP +015A; 015B; MAP +015C; 015D; MAP +015E; 015F; MAP +0160; 0161; MAP +0162; 0163; MAP +0164; 0165; MAP +0166; 0167; MAP +0168; 0169; MAP +016A; 016B; MAP +016C; 016D; MAP +016E; 016F; MAP +0170; 0171; MAP +0172; 0173; MAP +0174; 0175; MAP +0176; 0177; MAP +0178; 00FF; MAP +0179; 017A; MAP +017B; 017C; MAP +017D; 017E; MAP +017F; 0073; MAP +0181; 0253; MAP +0182; 0183; MAP +0184; 0185; MAP +0186; 0254; MAP +0187; 0188; MAP +0189; 0256; MAP +018A; 0257; MAP +018B; 018C; MAP +018E; 01DD; MAP +018F; 0259; MAP +0190; 025B; MAP +0191; 0192; MAP +0193; 0260; MAP +0194; 0263; MAP +0196; 0269; MAP +0197; 0268; MAP +0198; 0199; MAP +019C; 026F; MAP +019D; 0272; MAP +019F; 0275; MAP +01A0; 01A1; MAP +01A2; 01A3; MAP +01A4; 01A5; MAP +01A6; 0280; MAP +01A7; 01A8; MAP +01A9; 0283; MAP +01AC; 01AD; MAP +01AE; 0288; MAP +01AF; 01B0; MAP +01B1; 028A; MAP +01B2; 028B; MAP +01B3; 01B4; MAP +01B5; 01B6; MAP +01B7; 0292; MAP +01B8; 01B9; MAP +01BC; 01BD; MAP +01C4; 01C6; MAP +01C5; 01C6; MAP +01C7; 01C9; MAP +01C8; 01C9; MAP +01CA; 01CC; MAP +01CB; 01CC; MAP +01CD; 01CE; MAP +01CF; 01D0; MAP +01D1; 01D2; MAP +01D3; 01D4; MAP +01D5; 01D6; MAP +01D7; 01D8; MAP +01D9; 01DA; MAP +01DB; 01DC; MAP +01DE; 01DF; MAP +01E0; 01E1; MAP +01E2; 01E3; MAP +01E4; 01E5; MAP +01E6; 01E7; MAP +01E8; 01E9; MAP +01EA; 01EB; MAP +01EC; 01ED; MAP +01EE; 01EF; MAP +01F0; 006A 030C; MAP +01F1; 01F3; MAP +01F2; 01F3; MAP +01F4; 01F5; MAP +01F6; 0195; MAP +01F7; 01BF; MAP +01F8; 01F9; MAP +01FA; 01FB; MAP +01FC; 01FD; MAP +01FE; 01FF; MAP +0200; 0201; MAP +0202; 0203; MAP +0204; 0205; MAP +0206; 0207; MAP +0208; 0209; MAP +020A; 020B; MAP +020C; 020D; MAP +020E; 020F; MAP +0210; 0211; MAP +0212; 0213; MAP +0214; 0215; MAP +0216; 0217; MAP +0218; 0219; MAP +021A; 021B; MAP +021C; 021D; MAP +021E; 021F; MAP +0220; 019E; MAP +0222; 0223; MAP +0224; 0225; MAP +0226; 0227; MAP +0228; 0229; MAP +022A; 022B; MAP +022C; 022D; MAP +022E; 022F; MAP +0230; 0231; MAP +0232; 0233; MAP +0345; 03B9; MAP +037A; 0020 03B9; MAP +0386; 03AC; MAP +0388; 03AD; MAP +0389; 03AE; MAP +038A; 03AF; MAP +038C; 03CC; MAP +038E; 03CD; MAP +038F; 03CE; MAP +0390; 03B9 0308 0301; MAP +0391; 03B1; MAP +0392; 03B2; MAP +0393; 03B3; MAP +0394; 03B4; MAP +0395; 03B5; MAP +0396; 03B6; MAP +0397; 03B7; MAP +0398; 03B8; MAP +0399; 03B9; MAP +039A; 03BA; MAP +039B; 03BB; MAP +039C; 03BC; MAP +039D; 03BD; MAP +039E; 03BE; MAP +039F; 03BF; MAP +03A0; 03C0; MAP +03A1; 03C1; MAP +03A3; 03C3; MAP +03A4; 03C4; MAP +03A5; 03C5; MAP +03A6; 03C6; MAP +03A7; 03C7; MAP +03A8; 03C8; MAP +03A9; 03C9; MAP +03AA; 03CA; MAP +03AB; 03CB; MAP +03B0; 03C5 0308 0301; MAP +03C2; 03C3; MAP +03D0; 03B2; MAP +03D1; 03B8; MAP +03D2; 03C5; MAP +03D3; 03CD; MAP +03D4; 03CB; MAP +03D5; 03C6; MAP +03D6; 03C0; MAP +03D8; 03D9; MAP +03DA; 03DB; MAP +03DC; 03DD; MAP +03DE; 03DF; MAP +03E0; 03E1; MAP +03E2; 03E3; MAP +03E4; 03E5; MAP +03E6; 03E7; MAP +03E8; 03E9; MAP +03EA; 03EB; MAP +03EC; 03ED; MAP +03EE; 03EF; MAP +03F0; 03BA; MAP +03F1; 03C1; MAP +03F2; 03C3; MAP +03F4; 03B8; MAP +03F5; 03B5; MAP +0400; 0450; MAP +0401; 0451; MAP +0402; 0452; MAP +0403; 0453; MAP +0404; 0454; MAP +0405; 0455; MAP +0406; 0456; MAP +0407; 0457; MAP +0408; 0458; MAP +0409; 0459; MAP +040A; 045A; MAP +040B; 045B; MAP +040C; 045C; MAP +040D; 045D; MAP +040E; 045E; MAP +040F; 045F; MAP +0410; 0430; MAP +0411; 0431; MAP +0412; 0432; MAP +0413; 0433; MAP +0414; 0434; MAP +0415; 0435; MAP +0416; 0436; MAP +0417; 0437; MAP +0418; 0438; MAP +0419; 0439; MAP +041A; 043A; MAP +041B; 043B; MAP +041C; 043C; MAP +041D; 043D; MAP +041E; 043E; MAP +041F; 043F; MAP +0420; 0440; MAP +0421; 0441; MAP +0422; 0442; MAP +0423; 0443; MAP +0424; 0444; MAP +0425; 0445; MAP +0426; 0446; MAP +0427; 0447; MAP +0428; 0448; MAP +0429; 0449; MAP +042A; 044A; MAP +042B; 044B; MAP +042C; 044C; MAP +042D; 044D; MAP +042E; 044E; MAP +042F; 044F; MAP +0460; 0461; MAP +0462; 0463; MAP +0464; 0465; MAP +0466; 0467; MAP +0468; 0469; MAP +046A; 046B; MAP +046C; 046D; MAP +046E; 046F; MAP +0470; 0471; MAP +0472; 0473; MAP +0474; 0475; MAP +0476; 0477; MAP +0478; 0479; MAP +047A; 047B; MAP +047C; 047D; MAP +047E; 047F; MAP +0480; 0481; MAP +048A; 048B; MAP +048C; 048D; MAP +048E; 048F; MAP +0490; 0491; MAP +0492; 0493; MAP +0494; 0495; MAP +0496; 0497; MAP +0498; 0499; MAP +049A; 049B; MAP +049C; 049D; MAP +049E; 049F; MAP +04A0; 04A1; MAP +04A2; 04A3; MAP +04A4; 04A5; MAP +04A6; 04A7; MAP +04A8; 04A9; MAP +04AA; 04AB; MAP +04AC; 04AD; MAP +04AE; 04AF; MAP +04B0; 04B1; MAP +04B2; 04B3; MAP +04B4; 04B5; MAP +04B6; 04B7; MAP +04B8; 04B9; MAP +04BA; 04BB; MAP +04BC; 04BD; MAP +04BE; 04BF; MAP +04C1; 04C2; MAP +04C3; 04C4; MAP +04C5; 04C6; MAP +04C7; 04C8; MAP +04C9; 04CA; MAP +04CB; 04CC; MAP +04CD; 04CE; MAP +04D0; 04D1; MAP +04D2; 04D3; MAP +04D4; 04D5; MAP +04D6; 04D7; MAP +04D8; 04D9; MAP +04DA; 04DB; MAP +04DC; 04DD; MAP +04DE; 04DF; MAP +04E0; 04E1; MAP +04E2; 04E3; MAP +04E4; 04E5; MAP +04E6; 04E7; MAP +04E8; 04E9; MAP +04EA; 04EB; MAP +04EC; 04ED; MAP +04EE; 04EF; MAP +04F0; 04F1; MAP +04F2; 04F3; MAP +04F4; 04F5; MAP +04F8; 04F9; MAP +0500; 0501; MAP +0502; 0503; MAP +0504; 0505; MAP +0506; 0507; MAP +0508; 0509; MAP +050A; 050B; MAP +050C; 050D; MAP +050E; 050F; MAP +0531; 0561; MAP +0532; 0562; MAP +0533; 0563; MAP +0534; 0564; MAP +0535; 0565; MAP +0536; 0566; MAP +0537; 0567; MAP +0538; 0568; MAP +0539; 0569; MAP +053A; 056A; MAP +053B; 056B; MAP +053C; 056C; MAP +053D; 056D; MAP +053E; 056E; MAP +053F; 056F; MAP +0540; 0570; MAP +0541; 0571; MAP +0542; 0572; MAP +0543; 0573; MAP +0544; 0574; MAP +0545; 0575; MAP +0546; 0576; MAP +0547; 0577; MAP +0548; 0578; MAP +0549; 0579; MAP +054A; 057A; MAP +054B; 057B; MAP +054C; 057C; MAP +054D; 057D; MAP +054E; 057E; MAP +054F; 057F; MAP +0550; 0580; MAP +0551; 0581; MAP +0552; 0582; MAP +0553; 0583; MAP +0554; 0584; MAP +0555; 0585; MAP +0556; 0586; MAP +0587; 0565 0582; MAP +1E00; 1E01; MAP +1E02; 1E03; MAP +1E04; 1E05; MAP +1E06; 1E07; MAP +1E08; 1E09; MAP +1E0A; 1E0B; MAP +1E0C; 1E0D; MAP +1E0E; 1E0F; MAP +1E10; 1E11; MAP +1E12; 1E13; MAP +1E14; 1E15; MAP +1E16; 1E17; MAP +1E18; 1E19; MAP +1E1A; 1E1B; MAP +1E1C; 1E1D; MAP +1E1E; 1E1F; MAP +1E20; 1E21; MAP +1E22; 1E23; MAP +1E24; 1E25; MAP +1E26; 1E27; MAP +1E28; 1E29; MAP +1E2A; 1E2B; MAP +1E2C; 1E2D; MAP +1E2E; 1E2F; MAP +1E30; 1E31; MAP +1E32; 1E33; MAP +1E34; 1E35; MAP +1E36; 1E37; MAP +1E38; 1E39; MAP +1E3A; 1E3B; MAP +1E3C; 1E3D; MAP +1E3E; 1E3F; MAP +1E40; 1E41; MAP +1E42; 1E43; MAP +1E44; 1E45; MAP +1E46; 1E47; MAP +1E48; 1E49; MAP +1E4A; 1E4B; MAP +1E4C; 1E4D; MAP +1E4E; 1E4F; MAP +1E50; 1E51; MAP +1E52; 1E53; MAP +1E54; 1E55; MAP +1E56; 1E57; MAP +1E58; 1E59; MAP +1E5A; 1E5B; MAP +1E5C; 1E5D; MAP +1E5E; 1E5F; MAP +1E60; 1E61; MAP +1E62; 1E63; MAP +1E64; 1E65; MAP +1E66; 1E67; MAP +1E68; 1E69; MAP +1E6A; 1E6B; MAP +1E6C; 1E6D; MAP +1E6E; 1E6F; MAP +1E70; 1E71; MAP +1E72; 1E73; MAP +1E74; 1E75; MAP +1E76; 1E77; MAP +1E78; 1E79; MAP +1E7A; 1E7B; MAP +1E7C; 1E7D; MAP +1E7E; 1E7F; MAP +1E80; 1E81; MAP +1E82; 1E83; MAP +1E84; 1E85; MAP +1E86; 1E87; MAP +1E88; 1E89; MAP +1E8A; 1E8B; MAP +1E8C; 1E8D; MAP +1E8E; 1E8F; MAP +1E90; 1E91; MAP +1E92; 1E93; MAP +1E94; 1E95; MAP +1E96; 0068 0331; MAP +1E97; 0074 0308; MAP +1E98; 0077 030A; MAP +1E99; 0079 030A; MAP +1E9A; 0061 02BE; MAP +1E9B; 1E61; MAP +1EA0; 1EA1; MAP +1EA2; 1EA3; MAP +1EA4; 1EA5; MAP +1EA6; 1EA7; MAP +1EA8; 1EA9; MAP +1EAA; 1EAB; MAP +1EAC; 1EAD; MAP +1EAE; 1EAF; MAP +1EB0; 1EB1; MAP +1EB2; 1EB3; MAP +1EB4; 1EB5; MAP +1EB6; 1EB7; MAP +1EB8; 1EB9; MAP +1EBA; 1EBB; MAP +1EBC; 1EBD; MAP +1EBE; 1EBF; MAP +1EC0; 1EC1; MAP +1EC2; 1EC3; MAP +1EC4; 1EC5; MAP +1EC6; 1EC7; MAP +1EC8; 1EC9; MAP +1ECA; 1ECB; MAP +1ECC; 1ECD; MAP +1ECE; 1ECF; MAP +1ED0; 1ED1; MAP +1ED2; 1ED3; MAP +1ED4; 1ED5; MAP +1ED6; 1ED7; MAP +1ED8; 1ED9; MAP +1EDA; 1EDB; MAP +1EDC; 1EDD; MAP +1EDE; 1EDF; MAP +1EE0; 1EE1; MAP +1EE2; 1EE3; MAP +1EE4; 1EE5; MAP +1EE6; 1EE7; MAP +1EE8; 1EE9; MAP +1EEA; 1EEB; MAP +1EEC; 1EED; MAP +1EEE; 1EEF; MAP +1EF0; 1EF1; MAP +1EF2; 1EF3; MAP +1EF4; 1EF5; MAP +1EF6; 1EF7; MAP +1EF8; 1EF9; MAP +1F08; 1F00; MAP +1F09; 1F01; MAP +1F0A; 1F02; MAP +1F0B; 1F03; MAP +1F0C; 1F04; MAP +1F0D; 1F05; MAP +1F0E; 1F06; MAP +1F0F; 1F07; MAP +1F18; 1F10; MAP +1F19; 1F11; MAP +1F1A; 1F12; MAP +1F1B; 1F13; MAP +1F1C; 1F14; MAP +1F1D; 1F15; MAP +1F28; 1F20; MAP +1F29; 1F21; MAP +1F2A; 1F22; MAP +1F2B; 1F23; MAP +1F2C; 1F24; MAP +1F2D; 1F25; MAP +1F2E; 1F26; MAP +1F2F; 1F27; MAP +1F38; 1F30; MAP +1F39; 1F31; MAP +1F3A; 1F32; MAP +1F3B; 1F33; MAP +1F3C; 1F34; MAP +1F3D; 1F35; MAP +1F3E; 1F36; MAP +1F3F; 1F37; MAP +1F48; 1F40; MAP +1F49; 1F41; MAP +1F4A; 1F42; MAP +1F4B; 1F43; MAP +1F4C; 1F44; MAP +1F4D; 1F45; MAP +1F50; 03C5 0313; MAP +1F52; 03C5 0313 0300; MAP +1F54; 03C5 0313 0301; MAP +1F56; 03C5 0313 0342; MAP +1F59; 1F51; MAP +1F5B; 1F53; MAP +1F5D; 1F55; MAP +1F5F; 1F57; MAP +1F68; 1F60; MAP +1F69; 1F61; MAP +1F6A; 1F62; MAP +1F6B; 1F63; MAP +1F6C; 1F64; MAP +1F6D; 1F65; MAP +1F6E; 1F66; MAP +1F6F; 1F67; MAP +1F80; 1F00 03B9; MAP +1F81; 1F01 03B9; MAP +1F82; 1F02 03B9; MAP +1F83; 1F03 03B9; MAP +1F84; 1F04 03B9; MAP +1F85; 1F05 03B9; MAP +1F86; 1F06 03B9; MAP +1F87; 1F07 03B9; MAP +1F88; 1F00 03B9; MAP +1F89; 1F01 03B9; MAP +1F8A; 1F02 03B9; MAP +1F8B; 1F03 03B9; MAP +1F8C; 1F04 03B9; MAP +1F8D; 1F05 03B9; MAP +1F8E; 1F06 03B9; MAP +1F8F; 1F07 03B9; MAP +1F90; 1F20 03B9; MAP +1F91; 1F21 03B9; MAP +1F92; 1F22 03B9; MAP +1F93; 1F23 03B9; MAP +1F94; 1F24 03B9; MAP +1F95; 1F25 03B9; MAP +1F96; 1F26 03B9; MAP +1F97; 1F27 03B9; MAP +1F98; 1F20 03B9; MAP +1F99; 1F21 03B9; MAP +1F9A; 1F22 03B9; MAP +1F9B; 1F23 03B9; MAP +1F9C; 1F24 03B9; MAP +1F9D; 1F25 03B9; MAP +1F9E; 1F26 03B9; MAP +1F9F; 1F27 03B9; MAP +1FA0; 1F60 03B9; MAP +1FA1; 1F61 03B9; MAP +1FA2; 1F62 03B9; MAP +1FA3; 1F63 03B9; MAP +1FA4; 1F64 03B9; MAP +1FA5; 1F65 03B9; MAP +1FA6; 1F66 03B9; MAP +1FA7; 1F67 03B9; MAP +1FA8; 1F60 03B9; MAP +1FA9; 1F61 03B9; MAP +1FAA; 1F62 03B9; MAP +1FAB; 1F63 03B9; MAP +1FAC; 1F64 03B9; MAP +1FAD; 1F65 03B9; MAP +1FAE; 1F66 03B9; MAP +1FAF; 1F67 03B9; MAP +1FB2; 1F70 03B9; MAP +1FB3; 03B1 03B9; MAP +1FB4; 03AC 03B9; MAP +1FB6; 03B1 0342; MAP +1FB7; 03B1 0342 03B9; MAP +1FB8; 1FB0; MAP +1FB9; 1FB1; MAP +1FBA; 1F70; MAP +1FBB; 1F71; MAP +1FBC; 03B1 03B9; MAP +1FBE; 03B9; MAP +1FC2; 1F74 03B9; MAP +1FC3; 03B7 03B9; MAP +1FC4; 03AE 03B9; MAP +1FC6; 03B7 0342; MAP +1FC7; 03B7 0342 03B9; MAP +1FC8; 1F72; MAP +1FC9; 1F73; MAP +1FCA; 1F74; MAP +1FCB; 1F75; MAP +1FCC; 03B7 03B9; MAP +1FD2; 03B9 0308 0300; MAP +1FD3; 03B9 0308 0301; MAP +1FD6; 03B9 0342; MAP +1FD7; 03B9 0308 0342; MAP +1FD8; 1FD0; MAP +1FD9; 1FD1; MAP +1FDA; 1F76; MAP +1FDB; 1F77; MAP +1FE2; 03C5 0308 0300; MAP +1FE3; 03C5 0308 0301; MAP +1FE4; 03C1 0313; MAP +1FE6; 03C5 0342; MAP +1FE7; 03C5 0308 0342; MAP +1FE8; 1FE0; MAP +1FE9; 1FE1; MAP +1FEA; 1F7A; MAP +1FEB; 1F7B; MAP +1FEC; 1FE5; MAP +1FF2; 1F7C 03B9; MAP +1FF3; 03C9 03B9; MAP +1FF4; 03CE 03B9; MAP +1FF6; 03C9 0342; MAP +1FF7; 03C9 0342 03B9; MAP +1FF8; 1F78; MAP +1FF9; 1F79; MAP +1FFA; 1F7C; MAP +1FFB; 1F7D; MAP +1FFC; 03C9 03B9; MAP +20A8; 0072 0073; MAP +2102; 0063; MAP +2103; 00B0 0063; MAP +2107; 025B; MAP +2109; 00B0 0066; MAP +210B; 0068; MAP +210C; 0068; MAP +210D; 0068; MAP +2110; 0069; MAP +2111; 0069; MAP +2112; 006C; MAP +2115; 006E; MAP +2116; 006E 006F; MAP +2119; 0070; MAP +211A; 0071; MAP +211B; 0072; MAP +211C; 0072; MAP +211D; 0072; MAP +2120; 0073 006D; MAP +2121; 0074 0065 006C; MAP +2122; 0074 006D; MAP +2124; 007A; MAP +2126; 03C9; MAP +2128; 007A; MAP +212A; 006B; MAP +212B; 00E5; MAP +212C; 0062; MAP +212D; 0063; MAP +2130; 0065; MAP +2131; 0066; MAP +2133; 006D; MAP +213E; 03B3; MAP +213F; 03C0; MAP +2145; 0064; MAP +2160; 2170; MAP +2161; 2171; MAP +2162; 2172; MAP +2163; 2173; MAP +2164; 2174; MAP +2165; 2175; MAP +2166; 2176; MAP +2167; 2177; MAP +2168; 2178; MAP +2169; 2179; MAP +216A; 217A; MAP +216B; 217B; MAP +216C; 217C; MAP +216D; 217D; MAP +216E; 217E; MAP +216F; 217F; MAP +24B6; 24D0; MAP +24B7; 24D1; MAP +24B8; 24D2; MAP +24B9; 24D3; MAP +24BA; 24D4; MAP +24BB; 24D5; MAP +24BC; 24D6; MAP +24BD; 24D7; MAP +24BE; 24D8; MAP +24BF; 24D9; MAP +24C0; 24DA; MAP +24C1; 24DB; MAP +24C2; 24DC; MAP +24C3; 24DD; MAP +24C4; 24DE; MAP +24C5; 24DF; MAP +24C6; 24E0; MAP +24C7; 24E1; MAP +24C8; 24E2; MAP +24C9; 24E3; MAP +24CA; 24E4; MAP +24CB; 24E5; MAP +24CC; 24E6; MAP +24CD; 24E7; MAP +24CE; 24E8; MAP +24CF; 24E9; MAP +3371; 0068 0070 0061; MAP +3373; 0061 0075; MAP +3375; 006F 0076; MAP +3380; 0070 0061; MAP +3381; 006E 0061; MAP +3382; 03BC 0061; MAP +3383; 006D 0061; MAP +3384; 006B 0061; MAP +3385; 006B 0062; MAP +3386; 006D 0062; MAP +3387; 0067 0062; MAP +338A; 0070 0066; MAP +338B; 006E 0066; MAP +338C; 03BC 0066; MAP +3390; 0068 007A; MAP +3391; 006B 0068 007A; MAP +3392; 006D 0068 007A; MAP +3393; 0067 0068 007A; MAP +3394; 0074 0068 007A; MAP +33A9; 0070 0061; MAP +33AA; 006B 0070 0061; MAP +33AB; 006D 0070 0061; MAP +33AC; 0067 0070 0061; MAP +33B4; 0070 0076; MAP +33B5; 006E 0076; MAP +33B6; 03BC 0076; MAP +33B7; 006D 0076; MAP +33B8; 006B 0076; MAP +33B9; 006D 0076; MAP +33BA; 0070 0077; MAP +33BB; 006E 0077; MAP +33BC; 03BC 0077; MAP +33BD; 006D 0077; MAP +33BE; 006B 0077; MAP +33BF; 006D 0077; MAP +33C0; 006B 03C9; MAP +33C1; 006D 03C9; MAP +33C3; 0062 0071; MAP +33C6; 0063 2215 006B 0067; MAP +33C7; 0063 006F 002E; MAP +33C8; 0064 0062; MAP +33C9; 0067 0079; MAP +33CB; 0068 0070; MAP +33CD; 006B 006B; MAP +33CE; 006B 006D; MAP +33D7; 0070 0068; MAP +33D9; 0070 0070 006D; MAP +33DA; 0070 0072; MAP +33DC; 0073 0076; MAP +33DD; 0077 0062; MAP +FB00; 0066 0066; MAP +FB01; 0066 0069; MAP +FB02; 0066 006C; MAP +FB03; 0066 0066 0069; MAP +FB04; 0066 0066 006C; MAP +FB05; 0073 0074; MAP +FB06; 0073 0074; MAP +FB13; 0574 0576; MAP +FB14; 0574 0565; MAP +FB15; 0574 056B; MAP +FB16; 057E 0576; MAP +FB17; 0574 056D; MAP +FF21; FF41; MAP +FF22; FF42; MAP +FF23; FF43; MAP +FF24; FF44; MAP +FF25; FF45; MAP +FF26; FF46; MAP +FF27; FF47; MAP +FF28; FF48; MAP +FF29; FF49; MAP +FF2A; FF4A; MAP +FF2B; FF4B; MAP +FF2C; FF4C; MAP +FF2D; FF4D; MAP +FF2E; FF4E; MAP +FF2F; FF4F; MAP +FF30; FF50; MAP +FF31; FF51; MAP +FF32; FF52; MAP +FF33; FF53; MAP +FF34; FF54; MAP +FF35; FF55; MAP +FF36; FF56; MAP +FF37; FF57; MAP +FF38; FF58; MAP +FF39; FF59; MAP +FF3A; FF5A; MAP +10400; 10428; MAP +10401; 10429; MAP +10402; 1042A; MAP +10403; 1042B; MAP +10404; 1042C; MAP +10405; 1042D; MAP +10406; 1042E; MAP +10407; 1042F; MAP +10408; 10430; MAP +10409; 10431; MAP +1040A; 10432; MAP +1040B; 10433; MAP +1040C; 10434; MAP +1040D; 10435; MAP +1040E; 10436; MAP +1040F; 10437; MAP +10410; 10438; MAP +10411; 10439; MAP +10412; 1043A; MAP +10413; 1043B; MAP +10414; 1043C; MAP +10415; 1043D; MAP +10416; 1043E; MAP +10417; 1043F; MAP +10418; 10440; MAP +10419; 10441; MAP +1041A; 10442; MAP +1041B; 10443; MAP +1041C; 10444; MAP +1041D; 10445; MAP +1041E; 10446; MAP +1041F; 10447; MAP +10420; 10448; MAP +10421; 10449; MAP +10422; 1044A; MAP +10423; 1044B; MAP +10424; 1044C; MAP +10425; 1044D; MAP +1D400; 0061; MAP +1D401; 0062; MAP +1D402; 0063; MAP +1D403; 0064; MAP +1D404; 0065; MAP +1D405; 0066; MAP +1D406; 0067; MAP +1D407; 0068; MAP +1D408; 0069; MAP +1D409; 006A; MAP +1D40A; 006B; MAP +1D40B; 006C; MAP +1D40C; 006D; MAP +1D40D; 006E; MAP +1D40E; 006F; MAP +1D40F; 0070; MAP +1D410; 0071; MAP +1D411; 0072; MAP +1D412; 0073; MAP +1D413; 0074; MAP +1D414; 0075; MAP +1D415; 0076; MAP +1D416; 0077; MAP +1D417; 0078; MAP +1D418; 0079; MAP +1D419; 007A; MAP +1D434; 0061; MAP +1D435; 0062; MAP +1D436; 0063; MAP +1D437; 0064; MAP +1D438; 0065; MAP +1D439; 0066; MAP +1D43A; 0067; MAP +1D43B; 0068; MAP +1D43C; 0069; MAP +1D43D; 006A; MAP +1D43E; 006B; MAP +1D43F; 006C; MAP +1D440; 006D; MAP +1D441; 006E; MAP +1D442; 006F; MAP +1D443; 0070; MAP +1D444; 0071; MAP +1D445; 0072; MAP +1D446; 0073; MAP +1D447; 0074; MAP +1D448; 0075; MAP +1D449; 0076; MAP +1D44A; 0077; MAP +1D44B; 0078; MAP +1D44C; 0079; MAP +1D44D; 007A; MAP +1D468; 0061; MAP +1D469; 0062; MAP +1D46A; 0063; MAP +1D46B; 0064; MAP +1D46C; 0065; MAP +1D46D; 0066; MAP +1D46E; 0067; MAP +1D46F; 0068; MAP +1D470; 0069; MAP +1D471; 006A; MAP +1D472; 006B; MAP +1D473; 006C; MAP +1D474; 006D; MAP +1D475; 006E; MAP +1D476; 006F; MAP +1D477; 0070; MAP +1D478; 0071; MAP +1D479; 0072; MAP +1D47A; 0073; MAP +1D47B; 0074; MAP +1D47C; 0075; MAP +1D47D; 0076; MAP +1D47E; 0077; MAP +1D47F; 0078; MAP +1D480; 0079; MAP +1D481; 007A; MAP +1D49C; 0061; MAP +1D49E; 0063; MAP +1D49F; 0064; MAP +1D4A2; 0067; MAP +1D4A5; 006A; MAP +1D4A6; 006B; MAP +1D4A9; 006E; MAP +1D4AA; 006F; MAP +1D4AB; 0070; MAP +1D4AC; 0071; MAP +1D4AE; 0073; MAP +1D4AF; 0074; MAP +1D4B0; 0075; MAP +1D4B1; 0076; MAP +1D4B2; 0077; MAP +1D4B3; 0078; MAP +1D4B4; 0079; MAP +1D4B5; 007A; MAP +1D4D0; 0061; MAP +1D4D1; 0062; MAP +1D4D2; 0063; MAP +1D4D3; 0064; MAP +1D4D4; 0065; MAP +1D4D5; 0066; MAP +1D4D6; 0067; MAP +1D4D7; 0068; MAP +1D4D8; 0069; MAP +1D4D9; 006A; MAP +1D4DA; 006B; MAP +1D4DB; 006C; MAP +1D4DC; 006D; MAP +1D4DD; 006E; MAP +1D4DE; 006F; MAP +1D4DF; 0070; MAP +1D4E0; 0071; MAP +1D4E1; 0072; MAP +1D4E2; 0073; MAP +1D4E3; 0074; MAP +1D4E4; 0075; MAP +1D4E5; 0076; MAP +1D4E6; 0077; MAP +1D4E7; 0078; MAP +1D4E8; 0079; MAP +1D4E9; 007A; MAP +1D504; 0061; MAP +1D505; 0062; MAP +1D507; 0064; MAP +1D508; 0065; MAP +1D509; 0066; MAP +1D50A; 0067; MAP +1D50D; 006A; MAP +1D50E; 006B; MAP +1D50F; 006C; MAP +1D510; 006D; MAP +1D511; 006E; MAP +1D512; 006F; MAP +1D513; 0070; MAP +1D514; 0071; MAP +1D516; 0073; MAP +1D517; 0074; MAP +1D518; 0075; MAP +1D519; 0076; MAP +1D51A; 0077; MAP +1D51B; 0078; MAP +1D51C; 0079; MAP +1D538; 0061; MAP +1D539; 0062; MAP +1D53B; 0064; MAP +1D53C; 0065; MAP +1D53D; 0066; MAP +1D53E; 0067; MAP +1D540; 0069; MAP +1D541; 006A; MAP +1D542; 006B; MAP +1D543; 006C; MAP +1D544; 006D; MAP +1D546; 006F; MAP +1D54A; 0073; MAP +1D54B; 0074; MAP +1D54C; 0075; MAP +1D54D; 0076; MAP +1D54E; 0077; MAP +1D54F; 0078; MAP +1D550; 0079; MAP +1D56C; 0061; MAP +1D56D; 0062; MAP +1D56E; 0063; MAP +1D56F; 0064; MAP +1D570; 0065; MAP +1D571; 0066; MAP +1D572; 0067; MAP +1D573; 0068; MAP +1D574; 0069; MAP +1D575; 006A; MAP +1D576; 006B; MAP +1D577; 006C; MAP +1D578; 006D; MAP +1D579; 006E; MAP +1D57A; 006F; MAP +1D57B; 0070; MAP +1D57C; 0071; MAP +1D57D; 0072; MAP +1D57E; 0073; MAP +1D57F; 0074; MAP +1D580; 0075; MAP +1D581; 0076; MAP +1D582; 0077; MAP +1D583; 0078; MAP +1D584; 0079; MAP +1D585; 007A; MAP +1D5A0; 0061; MAP +1D5A1; 0062; MAP +1D5A2; 0063; MAP +1D5A3; 0064; MAP +1D5A4; 0065; MAP +1D5A5; 0066; MAP +1D5A6; 0067; MAP +1D5A7; 0068; MAP +1D5A8; 0069; MAP +1D5A9; 006A; MAP +1D5AA; 006B; MAP +1D5AB; 006C; MAP +1D5AC; 006D; MAP +1D5AD; 006E; MAP +1D5AE; 006F; MAP +1D5AF; 0070; MAP +1D5B0; 0071; MAP +1D5B1; 0072; MAP +1D5B2; 0073; MAP +1D5B3; 0074; MAP +1D5B4; 0075; MAP +1D5B5; 0076; MAP +1D5B6; 0077; MAP +1D5B7; 0078; MAP +1D5B8; 0079; MAP +1D5B9; 007A; MAP +1D5D4; 0061; MAP +1D5D5; 0062; MAP +1D5D6; 0063; MAP +1D5D7; 0064; MAP +1D5D8; 0065; MAP +1D5D9; 0066; MAP +1D5DA; 0067; MAP +1D5DB; 0068; MAP +1D5DC; 0069; MAP +1D5DD; 006A; MAP +1D5DE; 006B; MAP +1D5DF; 006C; MAP +1D5E0; 006D; MAP +1D5E1; 006E; MAP +1D5E2; 006F; MAP +1D5E3; 0070; MAP +1D5E4; 0071; MAP +1D5E5; 0072; MAP +1D5E6; 0073; MAP +1D5E7; 0074; MAP +1D5E8; 0075; MAP +1D5E9; 0076; MAP +1D5EA; 0077; MAP +1D5EB; 0078; MAP +1D5EC; 0079; MAP +1D5ED; 007A; MAP +1D608; 0061; MAP +1D609; 0062; MAP +1D60A; 0063; MAP +1D60B; 0064; MAP +1D60C; 0065; MAP +1D60D; 0066; MAP +1D60E; 0067; MAP +1D60F; 0068; MAP +1D610; 0069; MAP +1D611; 006A; MAP +1D612; 006B; MAP +1D613; 006C; MAP +1D614; 006D; MAP +1D615; 006E; MAP +1D616; 006F; MAP +1D617; 0070; MAP +1D618; 0071; MAP +1D619; 0072; MAP +1D61A; 0073; MAP +1D61B; 0074; MAP +1D61C; 0075; MAP +1D61D; 0076; MAP +1D61E; 0077; MAP +1D61F; 0078; MAP +1D620; 0079; MAP +1D621; 007A; MAP +1D63C; 0061; MAP +1D63D; 0062; MAP +1D63E; 0063; MAP +1D63F; 0064; MAP +1D640; 0065; MAP +1D641; 0066; MAP +1D642; 0067; MAP +1D643; 0068; MAP +1D644; 0069; MAP +1D645; 006A; MAP +1D646; 006B; MAP +1D647; 006C; MAP +1D648; 006D; MAP +1D649; 006E; MAP +1D64A; 006F; MAP +1D64B; 0070; MAP +1D64C; 0071; MAP +1D64D; 0072; MAP +1D64E; 0073; MAP +1D64F; 0074; MAP +1D650; 0075; MAP +1D651; 0076; MAP +1D652; 0077; MAP +1D653; 0078; MAP +1D654; 0079; MAP +1D655; 007A; MAP +1D670; 0061; MAP +1D671; 0062; MAP +1D672; 0063; MAP +1D673; 0064; MAP +1D674; 0065; MAP +1D675; 0066; MAP +1D676; 0067; MAP +1D677; 0068; MAP +1D678; 0069; MAP +1D679; 006A; MAP +1D67A; 006B; MAP +1D67B; 006C; MAP +1D67C; 006D; MAP +1D67D; 006E; MAP +1D67E; 006F; MAP +1D67F; 0070; MAP +1D680; 0071; MAP +1D681; 0072; MAP +1D682; 0073; MAP +1D683; 0074; MAP +1D684; 0075; MAP +1D685; 0076; MAP +1D686; 0077; MAP +1D687; 0078; MAP +1D688; 0079; MAP +1D689; 007A; MAP +1D6A8; 03B1; MAP +1D6A9; 03B2; MAP +1D6AA; 03B3; MAP +1D6AB; 03B4; MAP +1D6AC; 03B5; MAP +1D6AD; 03B6; MAP +1D6AE; 03B7; MAP +1D6AF; 03B8; MAP +1D6B0; 03B9; MAP +1D6B1; 03BA; MAP +1D6B2; 03BB; MAP +1D6B3; 03BC; MAP +1D6B4; 03BD; MAP +1D6B5; 03BE; MAP +1D6B6; 03BF; MAP +1D6B7; 03C0; MAP +1D6B8; 03C1; MAP +1D6B9; 03B8; MAP +1D6BA; 03C3; MAP +1D6BB; 03C4; MAP +1D6BC; 03C5; MAP +1D6BD; 03C6; MAP +1D6BE; 03C7; MAP +1D6BF; 03C8; MAP +1D6C0; 03C9; MAP +1D6D3; 03C3; MAP +1D6E2; 03B1; MAP +1D6E3; 03B2; MAP +1D6E4; 03B3; MAP +1D6E5; 03B4; MAP +1D6E6; 03B5; MAP +1D6E7; 03B6; MAP +1D6E8; 03B7; MAP +1D6E9; 03B8; MAP +1D6EA; 03B9; MAP +1D6EB; 03BA; MAP +1D6EC; 03BB; MAP +1D6ED; 03BC; MAP +1D6EE; 03BD; MAP +1D6EF; 03BE; MAP +1D6F0; 03BF; MAP +1D6F1; 03C0; MAP +1D6F2; 03C1; MAP +1D6F3; 03B8; MAP +1D6F4; 03C3; MAP +1D6F5; 03C4; MAP +1D6F6; 03C5; MAP +1D6F7; 03C6; MAP +1D6F8; 03C7; MAP +1D6F9; 03C8; MAP +1D6FA; 03C9; MAP +1D70D; 03C3; MAP +1D71C; 03B1; MAP +1D71D; 03B2; MAP +1D71E; 03B3; MAP +1D71F; 03B4; MAP +1D720; 03B5; MAP +1D721; 03B6; MAP +1D722; 03B7; MAP +1D723; 03B8; MAP +1D724; 03B9; MAP +1D725; 03BA; MAP +1D726; 03BB; MAP +1D727; 03BC; MAP +1D728; 03BD; MAP +1D729; 03BE; MAP +1D72A; 03BF; MAP +1D72B; 03C0; MAP +1D72C; 03C1; MAP +1D72D; 03B8; MAP +1D72E; 03C3; MAP +1D72F; 03C4; MAP +1D730; 03C5; MAP +1D731; 03C6; MAP +1D732; 03C7; MAP +1D733; 03C8; MAP +1D734; 03C9; MAP +1D747; 03C3; MAP +1D756; 03B1; MAP +1D757; 03B2; MAP +1D758; 03B3; MAP +1D759; 03B4; MAP +1D75A; 03B5; MAP +1D75B; 03B6; MAP +1D75C; 03B7; MAP +1D75D; 03B8; MAP +1D75E; 03B9; MAP +1D75F; 03BA; MAP +1D760; 03BB; MAP +1D761; 03BC; MAP +1D762; 03BD; MAP +1D763; 03BE; MAP +1D764; 03BF; MAP +1D765; 03C0; MAP +1D766; 03C1; MAP +1D767; 03B8; MAP +1D768; 03C3; MAP +1D769; 03C4; MAP +1D76A; 03C5; MAP +1D76B; 03C6; MAP +1D76C; 03C7; MAP +1D76D; 03C8; MAP +1D76E; 03C9; MAP +1D781; 03C3; MAP +1D790; 03B1; MAP +1D791; 03B2; MAP +1D792; 03B3; MAP +1D793; 03B4; MAP +1D794; 03B5; MAP +1D795; 03B6; MAP +1D796; 03B7; MAP +1D797; 03B8; MAP +1D798; 03B9; MAP +1D799; 03BA; MAP +1D79A; 03BB; MAP +1D79B; 03BC; MAP +1D79C; 03BD; MAP +1D79D; 03BE; MAP +1D79E; 03BF; MAP +1D79F; 03C0; MAP +1D7A0; 03C1; MAP +1D7A1; 03B8; MAP +1D7A2; 03C3; MAP +1D7A3; 03C4; MAP +1D7A4; 03C5; MAP +1D7A5; 03C6; MAP +1D7A6; 03C7; MAP +1D7A7; 03C8; MAP +1D7A8; 03C9; MAP +1D7BB; 03C3; MAP + +# Total code points 1371 + +# code points from Table C.1.2 + +00A0; ; PROHIBITED +1680; ; PROHIBITED +2000; ; PROHIBITED +2001; ; PROHIBITED +2002; ; PROHIBITED +2003; ; PROHIBITED +2004; ; PROHIBITED +2005; ; PROHIBITED +2006; ; PROHIBITED +2007; ; PROHIBITED +2008; ; PROHIBITED +2009; ; PROHIBITED +200A; ; PROHIBITED +200B; ; PROHIBITED +202F; ; PROHIBITED +205F; ; PROHIBITED +3000; ; PROHIBITED + +# Total code points 17 + +# code points from Table C.2.2 + +0080..009F; ; PROHIBITED +06DD; ; PROHIBITED +070F; ; PROHIBITED +180E; ; PROHIBITED +200C; ; PROHIBITED +200D; ; PROHIBITED +2028; ; PROHIBITED +2029; ; PROHIBITED +2060; ; PROHIBITED +2061; ; PROHIBITED +2062; ; PROHIBITED +2063; ; PROHIBITED +206A..206F; ; PROHIBITED +FEFF; ; PROHIBITED +FFF9..FFFC; ; PROHIBITED +1D173..1D17A; ; PROHIBITED + +# Total code points 30 + +# code points from Table C.3 + +E000..F8FF; ; PROHIBITED +F0000..FFFFD; ; PROHIBITED +100000..10FFFD; ; PROHIBITED + +# Total code points 2051 + +# code points from Table C.4 + +FDD0..FDEF; ; PROHIBITED +FFFE..FFFF; ; PROHIBITED +1FFFE..1FFFF; ; PROHIBITED +2FFFE..2FFFF; ; PROHIBITED +3FFFE..3FFFF; ; PROHIBITED +4FFFE..4FFFF; ; PROHIBITED +5FFFE..5FFFF; ; PROHIBITED +6FFFE..6FFFF; ; PROHIBITED +7FFFE..7FFFF; ; PROHIBITED +8FFFE..8FFFF; ; PROHIBITED +9FFFE..9FFFF; ; PROHIBITED +AFFFE..AFFFF; ; PROHIBITED +BFFFE..BFFFF; ; PROHIBITED +CFFFE..CFFFF; ; PROHIBITED +DFFFE..DFFFF; ; PROHIBITED +EFFFE..EFFFF; ; PROHIBITED +FFFFE..FFFFF; ; PROHIBITED +10FFFE..10FFFF; ; PROHIBITED + +# Total code points 18 + +# code points from Table C.5 + +D800..DFFF; ; PROHIBITED + +# Total code points 0 + +# code points from Table C.6 + +FFF9; ; PROHIBITED +FFFA; ; PROHIBITED +FFFB; ; PROHIBITED +FFFC; ; PROHIBITED +FFFD; ; PROHIBITED + +# Total code points 5 + +# code points from Table C.7 + +2FF0..2FFB; ; PROHIBITED + +# Total code points 1 + +# code points from Table C.8 + +0340; ; PROHIBITED +0341; ; PROHIBITED +200E; ; PROHIBITED +200F; ; PROHIBITED +202A; ; PROHIBITED +202B; ; PROHIBITED +202C; ; PROHIBITED +202D; ; PROHIBITED +202E; ; PROHIBITED +206A; ; PROHIBITED +206B; ; PROHIBITED +206C; ; PROHIBITED +206D; ; PROHIBITED +206E; ; PROHIBITED +206F; ; PROHIBITED + +# Total code points 15 + +# code points from Table C.9 + +E0001; ; PROHIBITED +E0020..E007F; ; PROHIBITED + +# Total code points 82 + diff --git a/icuSources/data/misc/icudata.rc b/icuSources/data/misc/icudata.rc index c63afead..2e88fc79 100644 --- a/icuSources/data/misc/icudata.rc +++ b/icuSources/data/misc/icudata.rc @@ -1,6 +1,6 @@ //Do not edit with Microsoft Developer Studio because it will modify this //script in the wrong way. -// Copyright (c) 2001-2003 International Business Machines +// Copyright (c) 2001-2004 International Business Machines // Corporation and others. All Rights Reserved. // #define APSTUDIO_READONLY_SYMBOLS @@ -50,7 +50,7 @@ BEGIN VALUE "FileDescription", "ICU Data DLL\0" VALUE "FileVersion", CommaVersionString(U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, 0) VALUE "LegalCopyright", U_COPYRIGHT_STRING "\0" - VALUE "OriginalFilename", U_ICUDATA_NAME ".dll\0" + VALUE "OriginalFilename", "icudt" U_ICU_VERSION_SHORT ".dll\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "International Components for Unicode\0" VALUE "ProductVersion", CommaVersionString(U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, 0) diff --git a/icuSources/data/misc/miscfiles.mk b/icuSources/data/misc/miscfiles.mk new file mode 100644 index 00000000..cdd19d61 --- /dev/null +++ b/icuSources/data/misc/miscfiles.mk @@ -0,0 +1,26 @@ +# * Copyright (C) 2003-2004, International Business Machines +# * Corporation and others. All Rights Reserved. +# A list of txt's to build +# Note: +# +# If you are thinking of modifying this file, READ THIS. +# +# Instead of changing this file [unless you want to check it back in], +# you should consider creating a 'misclocal.mk' file in this same directory. +# Then, you can have your local changes remain even if you upgrade or re- +# configure ICU. +# +# Example 'misclocal.mk' files: +# +# * To add an additional file to the list: +# _____________________________________________________ +# | MISC_SOURCE_LOCAL = myFile.txt ... +# +# * To REPLACE the default list and only build a subset of files: +# _____________________________________________________ +# | MISC_SOURCE = zoneinfo.txt +# +# + +MISC_SOURCE = \ +zoneinfo.txt CurrencyData.txt diff --git a/icuSources/data/misc/rfc3454_A_1.txt b/icuSources/data/misc/rfc3454_A_1.txt deleted file mode 100644 index 0766e072..00000000 --- a/icuSources/data/misc/rfc3454_A_1.txt +++ /dev/null @@ -1,407 +0,0 @@ -################### -# Copyright (C) 2003, International Business Machines -# Corporation and others. All Rights Reserved. -# WARNING: This table is generated by filterRFC3454.pl tool. DO NOT EDIT -################# - -# This file contains code points from Table A.1 from RFC 3454 - -0221; -0234..024F; -02AE..02AF; -02EF..02FF; -0350..035F; -0370..0373; -0376..0379; -037B..037D; -037F..0383; -038B; -038D; -03A2; -03CF; -03F7..03FF; -0487; -04CF; -04F6..04F7; -04FA..04FF; -0510..0530; -0557..0558; -0560; -0588; -058B..0590; -05A2; -05BA; -05C5..05CF; -05EB..05EF; -05F5..060B; -060D..061A; -061C..061E; -0620; -063B..063F; -0656..065F; -06EE..06EF; -06FF; -070E; -072D..072F; -074B..077F; -07B2..0900; -0904; -093A..093B; -094E..094F; -0955..0957; -0971..0980; -0984; -098D..098E; -0991..0992; -09A9; -09B1; -09B3..09B5; -09BA..09BB; -09BD; -09C5..09C6; -09C9..09CA; -09CE..09D6; -09D8..09DB; -09DE; -09E4..09E5; -09FB..0A01; -0A03..0A04; -0A0B..0A0E; -0A11..0A12; -0A29; -0A31; -0A34; -0A37; -0A3A..0A3B; -0A3D; -0A43..0A46; -0A49..0A4A; -0A4E..0A58; -0A5D; -0A5F..0A65; -0A75..0A80; -0A84; -0A8C; -0A8E; -0A92; -0AA9; -0AB1; -0AB4; -0ABA..0ABB; -0AC6; -0ACA; -0ACE..0ACF; -0AD1..0ADF; -0AE1..0AE5; -0AF0..0B00; -0B04; -0B0D..0B0E; -0B11..0B12; -0B29; -0B31; -0B34..0B35; -0B3A..0B3B; -0B44..0B46; -0B49..0B4A; -0B4E..0B55; -0B58..0B5B; -0B5E; -0B62..0B65; -0B71..0B81; -0B84; -0B8B..0B8D; -0B91; -0B96..0B98; -0B9B; -0B9D; -0BA0..0BA2; -0BA5..0BA7; -0BAB..0BAD; -0BB6; -0BBA..0BBD; -0BC3..0BC5; -0BC9; -0BCE..0BD6; -0BD8..0BE6; -0BF3..0C00; -0C04; -0C0D; -0C11; -0C29; -0C34; -0C3A..0C3D; -0C45; -0C49; -0C4E..0C54; -0C57..0C5F; -0C62..0C65; -0C70..0C81; -0C84; -0C8D; -0C91; -0CA9; -0CB4; -0CBA..0CBD; -0CC5; -0CC9; -0CCE..0CD4; -0CD7..0CDD; -0CDF; -0CE2..0CE5; -0CF0..0D01; -0D04; -0D0D; -0D11; -0D29; -0D3A..0D3D; -0D44..0D45; -0D49; -0D4E..0D56; -0D58..0D5F; -0D62..0D65; -0D70..0D81; -0D84; -0D97..0D99; -0DB2; -0DBC; -0DBE..0DBF; -0DC7..0DC9; -0DCB..0DCE; -0DD5; -0DD7; -0DE0..0DF1; -0DF5..0E00; -0E3B..0E3E; -0E5C..0E80; -0E83; -0E85..0E86; -0E89; -0E8B..0E8C; -0E8E..0E93; -0E98; -0EA0; -0EA4; -0EA6; -0EA8..0EA9; -0EAC; -0EBA; -0EBE..0EBF; -0EC5; -0EC7; -0ECE..0ECF; -0EDA..0EDB; -0EDE..0EFF; -0F48; -0F6B..0F70; -0F8C..0F8F; -0F98; -0FBD; -0FCD..0FCE; -0FD0..0FFF; -1022; -1028; -102B; -1033..1035; -103A..103F; -105A..109F; -10C6..10CF; -10F9..10FA; -10FC..10FF; -115A..115E; -11A3..11A7; -11FA..11FF; -1207; -1247; -1249; -124E..124F; -1257; -1259; -125E..125F; -1287; -1289; -128E..128F; -12AF; -12B1; -12B6..12B7; -12BF; -12C1; -12C6..12C7; -12CF; -12D7; -12EF; -130F; -1311; -1316..1317; -131F; -1347; -135B..1360; -137D..139F; -13F5..1400; -1677..167F; -169D..169F; -16F1..16FF; -170D; -1715..171F; -1737..173F; -1754..175F; -176D; -1771; -1774..177F; -17DD..17DF; -17EA..17FF; -180F; -181A..181F; -1878..187F; -18AA..1DFF; -1E9C..1E9F; -1EFA..1EFF; -1F16..1F17; -1F1E..1F1F; -1F46..1F47; -1F4E..1F4F; -1F58; -1F5A; -1F5C; -1F5E; -1F7E..1F7F; -1FB5; -1FC5; -1FD4..1FD5; -1FDC; -1FF0..1FF1; -1FF5; -1FFF; -2053..2056; -2058..205E; -2064..2069; -2072..2073; -208F..209F; -20B2..20CF; -20EB..20FF; -213B..213C; -214C..2152; -2184..218F; -23CF..23FF; -2427..243F; -244B..245F; -24FF; -2614..2615; -2618; -267E..267F; -268A..2700; -2705; -270A..270B; -2728; -274C; -274E; -2753..2755; -2757; -275F..2760; -2795..2797; -27B0; -27BF..27CF; -27EC..27EF; -2B00..2E7F; -2E9A; -2EF4..2EFF; -2FD6..2FEF; -2FFC..2FFF; -3040; -3097..3098; -3100..3104; -312D..3130; -318F; -31B8..31EF; -321D..321F; -3244..3250; -327C..327E; -32CC..32CF; -32FF; -3377..337A; -33DE..33DF; -33FF; -4DB6..4DFF; -9FA6..9FFF; -A48D..A48F; -A4C7..ABFF; -D7A4..D7FF; -FA2E..FA2F; -FA6B..FAFF; -FB07..FB12; -FB18..FB1C; -FB37; -FB3D; -FB3F; -FB42; -FB45; -FBB2..FBD2; -FD40..FD4F; -FD90..FD91; -FDC8..FDCF; -FDFD..FDFF; -FE10..FE1F; -FE24..FE2F; -FE47..FE48; -FE53; -FE67; -FE6C..FE6F; -FE75; -FEFD..FEFE; -FF00; -FFBF..FFC1; -FFC8..FFC9; -FFD0..FFD1; -FFD8..FFD9; -FFDD..FFDF; -FFE7; -FFEF..FFF8; -10000..102FF; -1031F; -10324..1032F; -1034B..103FF; -10426..10427; -1044E..1CFFF; -1D0F6..1D0FF; -1D127..1D129; -1D1DE..1D3FF; -1D455; -1D49D; -1D4A0..1D4A1; -1D4A3..1D4A4; -1D4A7..1D4A8; -1D4AD; -1D4BA; -1D4BC; -1D4C1; -1D4C4; -1D506; -1D50B..1D50C; -1D515; -1D51D; -1D53A; -1D53F; -1D545; -1D547..1D549; -1D551; -1D6A4..1D6A7; -1D7CA..1D7CD; -1D800..1FFFD; -2A6D7..2F7FF; -2FA1E..2FFFD; -30000..3FFFD; -40000..4FFFD; -50000..5FFFD; -60000..6FFFD; -70000..7FFFD; -80000..8FFFD; -90000..9FFFD; -A0000..AFFFD; -B0000..BFFFD; -C0000..CFFFD; -D0000..DFFFD; -E0000; -E0002..E001F; -E0080..EFFFD; - -# Total code points 3653 - diff --git a/icuSources/data/misc/rfc3454_B_1.txt b/icuSources/data/misc/rfc3454_B_1.txt deleted file mode 100644 index 4a1dcbeb..00000000 --- a/icuSources/data/misc/rfc3454_B_1.txt +++ /dev/null @@ -1,38 +0,0 @@ -################### -# Copyright (C) 2003, International Business Machines -# Corporation and others. All Rights Reserved. -# WARNING: This table is generated by filterRFC3454.pl tool. DO NOT EDIT -################# - -# This file contains code points from Table B.1 from RFC 3454 - -00AD; ; Map to nothing -034F; ; Map to nothing -1806; ; Map to nothing -180B; ; Map to nothing -180C; ; Map to nothing -180D; ; Map to nothing -200B; ; Map to nothing -200C; ; Map to nothing -200D; ; Map to nothing -2060; ; Map to nothing -FE00; ; Map to nothing -FE01; ; Map to nothing -FE02; ; Map to nothing -FE03; ; Map to nothing -FE04; ; Map to nothing -FE05; ; Map to nothing -FE06; ; Map to nothing -FE07; ; Map to nothing -FE08; ; Map to nothing -FE09; ; Map to nothing -FE0A; ; Map to nothing -FE0B; ; Map to nothing -FE0C; ; Map to nothing -FE0D; ; Map to nothing -FE0E; ; Map to nothing -FE0F; ; Map to nothing -FEFF; ; Map to nothing - -# Total code points 27 - diff --git a/icuSources/data/misc/rfc3454_B_2.txt b/icuSources/data/misc/rfc3454_B_2.txt deleted file mode 100644 index 70b1c8bf..00000000 --- a/icuSources/data/misc/rfc3454_B_2.txt +++ /dev/null @@ -1,1382 +0,0 @@ -################### -# Copyright (C) 2003, International Business Machines -# Corporation and others. All Rights Reserved. -# WARNING: This table is generated by filterRFC3454.pl tool. DO NOT EDIT -################# - -# This file contains code points from Table B.2 from RFC 3454 - -0041; 0061; Case map -0042; 0062; Case map -0043; 0063; Case map -0044; 0064; Case map -0045; 0065; Case map -0046; 0066; Case map -0047; 0067; Case map -0048; 0068; Case map -0049; 0069; Case map -004A; 006A; Case map -004B; 006B; Case map -004C; 006C; Case map -004D; 006D; Case map -004E; 006E; Case map -004F; 006F; Case map -0050; 0070; Case map -0051; 0071; Case map -0052; 0072; Case map -0053; 0073; Case map -0054; 0074; Case map -0055; 0075; Case map -0056; 0076; Case map -0057; 0077; Case map -0058; 0078; Case map -0059; 0079; Case map -005A; 007A; Case map -00B5; 03BC; Case map -00C0; 00E0; Case map -00C1; 00E1; Case map -00C2; 00E2; Case map -00C3; 00E3; Case map -00C4; 00E4; Case map -00C5; 00E5; Case map -00C6; 00E6; Case map -00C7; 00E7; Case map -00C8; 00E8; Case map -00C9; 00E9; Case map -00CA; 00EA; Case map -00CB; 00EB; Case map -00CC; 00EC; Case map -00CD; 00ED; Case map -00CE; 00EE; Case map -00CF; 00EF; Case map -00D0; 00F0; Case map -00D1; 00F1; Case map -00D2; 00F2; Case map -00D3; 00F3; Case map -00D4; 00F4; Case map -00D5; 00F5; Case map -00D6; 00F6; Case map -00D8; 00F8; Case map -00D9; 00F9; Case map -00DA; 00FA; Case map -00DB; 00FB; Case map -00DC; 00FC; Case map -00DD; 00FD; Case map -00DE; 00FE; Case map -00DF; 0073 0073; Case map -0100; 0101; Case map -0102; 0103; Case map -0104; 0105; Case map -0106; 0107; Case map -0108; 0109; Case map -010A; 010B; Case map -010C; 010D; Case map -010E; 010F; Case map -0110; 0111; Case map -0112; 0113; Case map -0114; 0115; Case map -0116; 0117; Case map -0118; 0119; Case map -011A; 011B; Case map -011C; 011D; Case map -011E; 011F; Case map -0120; 0121; Case map -0122; 0123; Case map -0124; 0125; Case map -0126; 0127; Case map -0128; 0129; Case map -012A; 012B; Case map -012C; 012D; Case map -012E; 012F; Case map -0130; 0069 0307; Case map -0132; 0133; Case map -0134; 0135; Case map -0136; 0137; Case map -0139; 013A; Case map -013B; 013C; Case map -013D; 013E; Case map -013F; 0140; Case map -0141; 0142; Case map -0143; 0144; Case map -0145; 0146; Case map -0147; 0148; Case map -0149; 02BC 006E; Case map -014A; 014B; Case map -014C; 014D; Case map -014E; 014F; Case map -0150; 0151; Case map -0152; 0153; Case map -0154; 0155; Case map -0156; 0157; Case map -0158; 0159; Case map -015A; 015B; Case map -015C; 015D; Case map -015E; 015F; Case map -0160; 0161; Case map -0162; 0163; Case map -0164; 0165; Case map -0166; 0167; Case map -0168; 0169; Case map -016A; 016B; Case map -016C; 016D; Case map -016E; 016F; Case map -0170; 0171; Case map -0172; 0173; Case map -0174; 0175; Case map -0176; 0177; Case map -0178; 00FF; Case map -0179; 017A; Case map -017B; 017C; Case map -017D; 017E; Case map -017F; 0073; Case map -0181; 0253; Case map -0182; 0183; Case map -0184; 0185; Case map -0186; 0254; Case map -0187; 0188; Case map -0189; 0256; Case map -018A; 0257; Case map -018B; 018C; Case map -018E; 01DD; Case map -018F; 0259; Case map -0190; 025B; Case map -0191; 0192; Case map -0193; 0260; Case map -0194; 0263; Case map -0196; 0269; Case map -0197; 0268; Case map -0198; 0199; Case map -019C; 026F; Case map -019D; 0272; Case map -019F; 0275; Case map -01A0; 01A1; Case map -01A2; 01A3; Case map -01A4; 01A5; Case map -01A6; 0280; Case map -01A7; 01A8; Case map -01A9; 0283; Case map -01AC; 01AD; Case map -01AE; 0288; Case map -01AF; 01B0; Case map -01B1; 028A; Case map -01B2; 028B; Case map -01B3; 01B4; Case map -01B5; 01B6; Case map -01B7; 0292; Case map -01B8; 01B9; Case map -01BC; 01BD; Case map -01C4; 01C6; Case map -01C5; 01C6; Case map -01C7; 01C9; Case map -01C8; 01C9; Case map -01CA; 01CC; Case map -01CB; 01CC; Case map -01CD; 01CE; Case map -01CF; 01D0; Case map -01D1; 01D2; Case map -01D3; 01D4; Case map -01D5; 01D6; Case map -01D7; 01D8; Case map -01D9; 01DA; Case map -01DB; 01DC; Case map -01DE; 01DF; Case map -01E0; 01E1; Case map -01E2; 01E3; Case map -01E4; 01E5; Case map -01E6; 01E7; Case map -01E8; 01E9; Case map -01EA; 01EB; Case map -01EC; 01ED; Case map -01EE; 01EF; Case map -01F0; 006A 030C; Case map -01F1; 01F3; Case map -01F2; 01F3; Case map -01F4; 01F5; Case map -01F6; 0195; Case map -01F7; 01BF; Case map -01F8; 01F9; Case map -01FA; 01FB; Case map -01FC; 01FD; Case map -01FE; 01FF; Case map -0200; 0201; Case map -0202; 0203; Case map -0204; 0205; Case map -0206; 0207; Case map -0208; 0209; Case map -020A; 020B; Case map -020C; 020D; Case map -020E; 020F; Case map -0210; 0211; Case map -0212; 0213; Case map -0214; 0215; Case map -0216; 0217; Case map -0218; 0219; Case map -021A; 021B; Case map -021C; 021D; Case map -021E; 021F; Case map -0220; 019E; Case map -0222; 0223; Case map -0224; 0225; Case map -0226; 0227; Case map -0228; 0229; Case map -022A; 022B; Case map -022C; 022D; Case map -022E; 022F; Case map -0230; 0231; Case map -0232; 0233; Case map -0345; 03B9; Case map -037A; 0020 03B9; Additional folding -0386; 03AC; Case map -0388; 03AD; Case map -0389; 03AE; Case map -038A; 03AF; Case map -038C; 03CC; Case map -038E; 03CD; Case map -038F; 03CE; Case map -0390; 03B9 0308 0301; Case map -0391; 03B1; Case map -0392; 03B2; Case map -0393; 03B3; Case map -0394; 03B4; Case map -0395; 03B5; Case map -0396; 03B6; Case map -0397; 03B7; Case map -0398; 03B8; Case map -0399; 03B9; Case map -039A; 03BA; Case map -039B; 03BB; Case map -039C; 03BC; Case map -039D; 03BD; Case map -039E; 03BE; Case map -039F; 03BF; Case map -03A0; 03C0; Case map -03A1; 03C1; Case map -03A3; 03C3; Case map -03A4; 03C4; Case map -03A5; 03C5; Case map -03A6; 03C6; Case map -03A7; 03C7; Case map -03A8; 03C8; Case map -03A9; 03C9; Case map -03AA; 03CA; Case map -03AB; 03CB; Case map -03B0; 03C5 0308 0301; Case map -03C2; 03C3; Case map -03D0; 03B2; Case map -03D1; 03B8; Case map -03D2; 03C5; Additional folding -03D3; 03CD; Additional folding -03D4; 03CB; Additional folding -03D5; 03C6; Case map -03D6; 03C0; Case map -03D8; 03D9; Case map -03DA; 03DB; Case map -03DC; 03DD; Case map -03DE; 03DF; Case map -03E0; 03E1; Case map -03E2; 03E3; Case map -03E4; 03E5; Case map -03E6; 03E7; Case map -03E8; 03E9; Case map -03EA; 03EB; Case map -03EC; 03ED; Case map -03EE; 03EF; Case map -03F0; 03BA; Case map -03F1; 03C1; Case map -03F2; 03C3; Case map -03F4; 03B8; Case map -03F5; 03B5; Case map -0400; 0450; Case map -0401; 0451; Case map -0402; 0452; Case map -0403; 0453; Case map -0404; 0454; Case map -0405; 0455; Case map -0406; 0456; Case map -0407; 0457; Case map -0408; 0458; Case map -0409; 0459; Case map -040A; 045A; Case map -040B; 045B; Case map -040C; 045C; Case map -040D; 045D; Case map -040E; 045E; Case map -040F; 045F; Case map -0410; 0430; Case map -0411; 0431; Case map -0412; 0432; Case map -0413; 0433; Case map -0414; 0434; Case map -0415; 0435; Case map -0416; 0436; Case map -0417; 0437; Case map -0418; 0438; Case map -0419; 0439; Case map -041A; 043A; Case map -041B; 043B; Case map -041C; 043C; Case map -041D; 043D; Case map -041E; 043E; Case map -041F; 043F; Case map -0420; 0440; Case map -0421; 0441; Case map -0422; 0442; Case map -0423; 0443; Case map -0424; 0444; Case map -0425; 0445; Case map -0426; 0446; Case map -0427; 0447; Case map -0428; 0448; Case map -0429; 0449; Case map -042A; 044A; Case map -042B; 044B; Case map -042C; 044C; Case map -042D; 044D; Case map -042E; 044E; Case map -042F; 044F; Case map -0460; 0461; Case map -0462; 0463; Case map -0464; 0465; Case map -0466; 0467; Case map -0468; 0469; Case map -046A; 046B; Case map -046C; 046D; Case map -046E; 046F; Case map -0470; 0471; Case map -0472; 0473; Case map -0474; 0475; Case map -0476; 0477; Case map -0478; 0479; Case map -047A; 047B; Case map -047C; 047D; Case map -047E; 047F; Case map -0480; 0481; Case map -048A; 048B; Case map -048C; 048D; Case map -048E; 048F; Case map -0490; 0491; Case map -0492; 0493; Case map -0494; 0495; Case map -0496; 0497; Case map -0498; 0499; Case map -049A; 049B; Case map -049C; 049D; Case map -049E; 049F; Case map -04A0; 04A1; Case map -04A2; 04A3; Case map -04A4; 04A5; Case map -04A6; 04A7; Case map -04A8; 04A9; Case map -04AA; 04AB; Case map -04AC; 04AD; Case map -04AE; 04AF; Case map -04B0; 04B1; Case map -04B2; 04B3; Case map -04B4; 04B5; Case map -04B6; 04B7; Case map -04B8; 04B9; Case map -04BA; 04BB; Case map -04BC; 04BD; Case map -04BE; 04BF; Case map -04C1; 04C2; Case map -04C3; 04C4; Case map -04C5; 04C6; Case map -04C7; 04C8; Case map -04C9; 04CA; Case map -04CB; 04CC; Case map -04CD; 04CE; Case map -04D0; 04D1; Case map -04D2; 04D3; Case map -04D4; 04D5; Case map -04D6; 04D7; Case map -04D8; 04D9; Case map -04DA; 04DB; Case map -04DC; 04DD; Case map -04DE; 04DF; Case map -04E0; 04E1; Case map -04E2; 04E3; Case map -04E4; 04E5; Case map -04E6; 04E7; Case map -04E8; 04E9; Case map -04EA; 04EB; Case map -04EC; 04ED; Case map -04EE; 04EF; Case map -04F0; 04F1; Case map -04F2; 04F3; Case map -04F4; 04F5; Case map -04F8; 04F9; Case map -0500; 0501; Case map -0502; 0503; Case map -0504; 0505; Case map -0506; 0507; Case map -0508; 0509; Case map -050A; 050B; Case map -050C; 050D; Case map -050E; 050F; Case map -0531; 0561; Case map -0532; 0562; Case map -0533; 0563; Case map -0534; 0564; Case map -0535; 0565; Case map -0536; 0566; Case map -0537; 0567; Case map -0538; 0568; Case map -0539; 0569; Case map -053A; 056A; Case map -053B; 056B; Case map -053C; 056C; Case map -053D; 056D; Case map -053E; 056E; Case map -053F; 056F; Case map -0540; 0570; Case map -0541; 0571; Case map -0542; 0572; Case map -0543; 0573; Case map -0544; 0574; Case map -0545; 0575; Case map -0546; 0576; Case map -0547; 0577; Case map -0548; 0578; Case map -0549; 0579; Case map -054A; 057A; Case map -054B; 057B; Case map -054C; 057C; Case map -054D; 057D; Case map -054E; 057E; Case map -054F; 057F; Case map -0550; 0580; Case map -0551; 0581; Case map -0552; 0582; Case map -0553; 0583; Case map -0554; 0584; Case map -0555; 0585; Case map -0556; 0586; Case map -0587; 0565 0582; Case map -1E00; 1E01; Case map -1E02; 1E03; Case map -1E04; 1E05; Case map -1E06; 1E07; Case map -1E08; 1E09; Case map -1E0A; 1E0B; Case map -1E0C; 1E0D; Case map -1E0E; 1E0F; Case map -1E10; 1E11; Case map -1E12; 1E13; Case map -1E14; 1E15; Case map -1E16; 1E17; Case map -1E18; 1E19; Case map -1E1A; 1E1B; Case map -1E1C; 1E1D; Case map -1E1E; 1E1F; Case map -1E20; 1E21; Case map -1E22; 1E23; Case map -1E24; 1E25; Case map -1E26; 1E27; Case map -1E28; 1E29; Case map -1E2A; 1E2B; Case map -1E2C; 1E2D; Case map -1E2E; 1E2F; Case map -1E30; 1E31; Case map -1E32; 1E33; Case map -1E34; 1E35; Case map -1E36; 1E37; Case map -1E38; 1E39; Case map -1E3A; 1E3B; Case map -1E3C; 1E3D; Case map -1E3E; 1E3F; Case map -1E40; 1E41; Case map -1E42; 1E43; Case map -1E44; 1E45; Case map -1E46; 1E47; Case map -1E48; 1E49; Case map -1E4A; 1E4B; Case map -1E4C; 1E4D; Case map -1E4E; 1E4F; Case map -1E50; 1E51; Case map -1E52; 1E53; Case map -1E54; 1E55; Case map -1E56; 1E57; Case map -1E58; 1E59; Case map -1E5A; 1E5B; Case map -1E5C; 1E5D; Case map -1E5E; 1E5F; Case map -1E60; 1E61; Case map -1E62; 1E63; Case map -1E64; 1E65; Case map -1E66; 1E67; Case map -1E68; 1E69; Case map -1E6A; 1E6B; Case map -1E6C; 1E6D; Case map -1E6E; 1E6F; Case map -1E70; 1E71; Case map -1E72; 1E73; Case map -1E74; 1E75; Case map -1E76; 1E77; Case map -1E78; 1E79; Case map -1E7A; 1E7B; Case map -1E7C; 1E7D; Case map -1E7E; 1E7F; Case map -1E80; 1E81; Case map -1E82; 1E83; Case map -1E84; 1E85; Case map -1E86; 1E87; Case map -1E88; 1E89; Case map -1E8A; 1E8B; Case map -1E8C; 1E8D; Case map -1E8E; 1E8F; Case map -1E90; 1E91; Case map -1E92; 1E93; Case map -1E94; 1E95; Case map -1E96; 0068 0331; Case map -1E97; 0074 0308; Case map -1E98; 0077 030A; Case map -1E99; 0079 030A; Case map -1E9A; 0061 02BE; Case map -1E9B; 1E61; Case map -1EA0; 1EA1; Case map -1EA2; 1EA3; Case map -1EA4; 1EA5; Case map -1EA6; 1EA7; Case map -1EA8; 1EA9; Case map -1EAA; 1EAB; Case map -1EAC; 1EAD; Case map -1EAE; 1EAF; Case map -1EB0; 1EB1; Case map -1EB2; 1EB3; Case map -1EB4; 1EB5; Case map -1EB6; 1EB7; Case map -1EB8; 1EB9; Case map -1EBA; 1EBB; Case map -1EBC; 1EBD; Case map -1EBE; 1EBF; Case map -1EC0; 1EC1; Case map -1EC2; 1EC3; Case map -1EC4; 1EC5; Case map -1EC6; 1EC7; Case map -1EC8; 1EC9; Case map -1ECA; 1ECB; Case map -1ECC; 1ECD; Case map -1ECE; 1ECF; Case map -1ED0; 1ED1; Case map -1ED2; 1ED3; Case map -1ED4; 1ED5; Case map -1ED6; 1ED7; Case map -1ED8; 1ED9; Case map -1EDA; 1EDB; Case map -1EDC; 1EDD; Case map -1EDE; 1EDF; Case map -1EE0; 1EE1; Case map -1EE2; 1EE3; Case map -1EE4; 1EE5; Case map -1EE6; 1EE7; Case map -1EE8; 1EE9; Case map -1EEA; 1EEB; Case map -1EEC; 1EED; Case map -1EEE; 1EEF; Case map -1EF0; 1EF1; Case map -1EF2; 1EF3; Case map -1EF4; 1EF5; Case map -1EF6; 1EF7; Case map -1EF8; 1EF9; Case map -1F08; 1F00; Case map -1F09; 1F01; Case map -1F0A; 1F02; Case map -1F0B; 1F03; Case map -1F0C; 1F04; Case map -1F0D; 1F05; Case map -1F0E; 1F06; Case map -1F0F; 1F07; Case map -1F18; 1F10; Case map -1F19; 1F11; Case map -1F1A; 1F12; Case map -1F1B; 1F13; Case map -1F1C; 1F14; Case map -1F1D; 1F15; Case map -1F28; 1F20; Case map -1F29; 1F21; Case map -1F2A; 1F22; Case map -1F2B; 1F23; Case map -1F2C; 1F24; Case map -1F2D; 1F25; Case map -1F2E; 1F26; Case map -1F2F; 1F27; Case map -1F38; 1F30; Case map -1F39; 1F31; Case map -1F3A; 1F32; Case map -1F3B; 1F33; Case map -1F3C; 1F34; Case map -1F3D; 1F35; Case map -1F3E; 1F36; Case map -1F3F; 1F37; Case map -1F48; 1F40; Case map -1F49; 1F41; Case map -1F4A; 1F42; Case map -1F4B; 1F43; Case map -1F4C; 1F44; Case map -1F4D; 1F45; Case map -1F50; 03C5 0313; Case map -1F52; 03C5 0313 0300; Case map -1F54; 03C5 0313 0301; Case map -1F56; 03C5 0313 0342; Case map -1F59; 1F51; Case map -1F5B; 1F53; Case map -1F5D; 1F55; Case map -1F5F; 1F57; Case map -1F68; 1F60; Case map -1F69; 1F61; Case map -1F6A; 1F62; Case map -1F6B; 1F63; Case map -1F6C; 1F64; Case map -1F6D; 1F65; Case map -1F6E; 1F66; Case map -1F6F; 1F67; Case map -1F80; 1F00 03B9; Case map -1F81; 1F01 03B9; Case map -1F82; 1F02 03B9; Case map -1F83; 1F03 03B9; Case map -1F84; 1F04 03B9; Case map -1F85; 1F05 03B9; Case map -1F86; 1F06 03B9; Case map -1F87; 1F07 03B9; Case map -1F88; 1F00 03B9; Case map -1F89; 1F01 03B9; Case map -1F8A; 1F02 03B9; Case map -1F8B; 1F03 03B9; Case map -1F8C; 1F04 03B9; Case map -1F8D; 1F05 03B9; Case map -1F8E; 1F06 03B9; Case map -1F8F; 1F07 03B9; Case map -1F90; 1F20 03B9; Case map -1F91; 1F21 03B9; Case map -1F92; 1F22 03B9; Case map -1F93; 1F23 03B9; Case map -1F94; 1F24 03B9; Case map -1F95; 1F25 03B9; Case map -1F96; 1F26 03B9; Case map -1F97; 1F27 03B9; Case map -1F98; 1F20 03B9; Case map -1F99; 1F21 03B9; Case map -1F9A; 1F22 03B9; Case map -1F9B; 1F23 03B9; Case map -1F9C; 1F24 03B9; Case map -1F9D; 1F25 03B9; Case map -1F9E; 1F26 03B9; Case map -1F9F; 1F27 03B9; Case map -1FA0; 1F60 03B9; Case map -1FA1; 1F61 03B9; Case map -1FA2; 1F62 03B9; Case map -1FA3; 1F63 03B9; Case map -1FA4; 1F64 03B9; Case map -1FA5; 1F65 03B9; Case map -1FA6; 1F66 03B9; Case map -1FA7; 1F67 03B9; Case map -1FA8; 1F60 03B9; Case map -1FA9; 1F61 03B9; Case map -1FAA; 1F62 03B9; Case map -1FAB; 1F63 03B9; Case map -1FAC; 1F64 03B9; Case map -1FAD; 1F65 03B9; Case map -1FAE; 1F66 03B9; Case map -1FAF; 1F67 03B9; Case map -1FB2; 1F70 03B9; Case map -1FB3; 03B1 03B9; Case map -1FB4; 03AC 03B9; Case map -1FB6; 03B1 0342; Case map -1FB7; 03B1 0342 03B9; Case map -1FB8; 1FB0; Case map -1FB9; 1FB1; Case map -1FBA; 1F70; Case map -1FBB; 1F71; Case map -1FBC; 03B1 03B9; Case map -1FBE; 03B9; Case map -1FC2; 1F74 03B9; Case map -1FC3; 03B7 03B9; Case map -1FC4; 03AE 03B9; Case map -1FC6; 03B7 0342; Case map -1FC7; 03B7 0342 03B9; Case map -1FC8; 1F72; Case map -1FC9; 1F73; Case map -1FCA; 1F74; Case map -1FCB; 1F75; Case map -1FCC; 03B7 03B9; Case map -1FD2; 03B9 0308 0300; Case map -1FD3; 03B9 0308 0301; Case map -1FD6; 03B9 0342; Case map -1FD7; 03B9 0308 0342; Case map -1FD8; 1FD0; Case map -1FD9; 1FD1; Case map -1FDA; 1F76; Case map -1FDB; 1F77; Case map -1FE2; 03C5 0308 0300; Case map -1FE3; 03C5 0308 0301; Case map -1FE4; 03C1 0313; Case map -1FE6; 03C5 0342; Case map -1FE7; 03C5 0308 0342; Case map -1FE8; 1FE0; Case map -1FE9; 1FE1; Case map -1FEA; 1F7A; Case map -1FEB; 1F7B; Case map -1FEC; 1FE5; Case map -1FF2; 1F7C 03B9; Case map -1FF3; 03C9 03B9; Case map -1FF4; 03CE 03B9; Case map -1FF6; 03C9 0342; Case map -1FF7; 03C9 0342 03B9; Case map -1FF8; 1F78; Case map -1FF9; 1F79; Case map -1FFA; 1F7C; Case map -1FFB; 1F7D; Case map -1FFC; 03C9 03B9; Case map -20A8; 0072 0073; Additional folding -2102; 0063; Additional folding -2103; 00B0 0063; Additional folding -2107; 025B; Additional folding -2109; 00B0 0066; Additional folding -210B; 0068; Additional folding -210C; 0068; Additional folding -210D; 0068; Additional folding -2110; 0069; Additional folding -2111; 0069; Additional folding -2112; 006C; Additional folding -2115; 006E; Additional folding -2116; 006E 006F; Additional folding -2119; 0070; Additional folding -211A; 0071; Additional folding -211B; 0072; Additional folding -211C; 0072; Additional folding -211D; 0072; Additional folding -2120; 0073 006D; Additional folding -2121; 0074 0065 006C; Additional folding -2122; 0074 006D; Additional folding -2124; 007A; Additional folding -2126; 03C9; Case map -2128; 007A; Additional folding -212A; 006B; Case map -212B; 00E5; Case map -212C; 0062; Additional folding -212D; 0063; Additional folding -2130; 0065; Additional folding -2131; 0066; Additional folding -2133; 006D; Additional folding -213E; 03B3; Additional folding -213F; 03C0; Additional folding -2145; 0064; Additional folding -2160; 2170; Case map -2161; 2171; Case map -2162; 2172; Case map -2163; 2173; Case map -2164; 2174; Case map -2165; 2175; Case map -2166; 2176; Case map -2167; 2177; Case map -2168; 2178; Case map -2169; 2179; Case map -216A; 217A; Case map -216B; 217B; Case map -216C; 217C; Case map -216D; 217D; Case map -216E; 217E; Case map -216F; 217F; Case map -24B6; 24D0; Case map -24B7; 24D1; Case map -24B8; 24D2; Case map -24B9; 24D3; Case map -24BA; 24D4; Case map -24BB; 24D5; Case map -24BC; 24D6; Case map -24BD; 24D7; Case map -24BE; 24D8; Case map -24BF; 24D9; Case map -24C0; 24DA; Case map -24C1; 24DB; Case map -24C2; 24DC; Case map -24C3; 24DD; Case map -24C4; 24DE; Case map -24C5; 24DF; Case map -24C6; 24E0; Case map -24C7; 24E1; Case map -24C8; 24E2; Case map -24C9; 24E3; Case map -24CA; 24E4; Case map -24CB; 24E5; Case map -24CC; 24E6; Case map -24CD; 24E7; Case map -24CE; 24E8; Case map -24CF; 24E9; Case map -3371; 0068 0070 0061; Additional folding -3373; 0061 0075; Additional folding -3375; 006F 0076; Additional folding -3380; 0070 0061; Additional folding -3381; 006E 0061; Additional folding -3382; 03BC 0061; Additional folding -3383; 006D 0061; Additional folding -3384; 006B 0061; Additional folding -3385; 006B 0062; Additional folding -3386; 006D 0062; Additional folding -3387; 0067 0062; Additional folding -338A; 0070 0066; Additional folding -338B; 006E 0066; Additional folding -338C; 03BC 0066; Additional folding -3390; 0068 007A; Additional folding -3391; 006B 0068 007A; Additional folding -3392; 006D 0068 007A; Additional folding -3393; 0067 0068 007A; Additional folding -3394; 0074 0068 007A; Additional folding -33A9; 0070 0061; Additional folding -33AA; 006B 0070 0061; Additional folding -33AB; 006D 0070 0061; Additional folding -33AC; 0067 0070 0061; Additional folding -33B4; 0070 0076; Additional folding -33B5; 006E 0076; Additional folding -33B6; 03BC 0076; Additional folding -33B7; 006D 0076; Additional folding -33B8; 006B 0076; Additional folding -33B9; 006D 0076; Additional folding -33BA; 0070 0077; Additional folding -33BB; 006E 0077; Additional folding -33BC; 03BC 0077; Additional folding -33BD; 006D 0077; Additional folding -33BE; 006B 0077; Additional folding -33BF; 006D 0077; Additional folding -33C0; 006B 03C9; Additional folding -33C1; 006D 03C9; Additional folding -33C3; 0062 0071; Additional folding -33C6; 0063 2215 006B 0067; Additional folding -33C7; 0063 006F 002E; Additional folding -33C8; 0064 0062; Additional folding -33C9; 0067 0079; Additional folding -33CB; 0068 0070; Additional folding -33CD; 006B 006B; Additional folding -33CE; 006B 006D; Additional folding -33D7; 0070 0068; Additional folding -33D9; 0070 0070 006D; Additional folding -33DA; 0070 0072; Additional folding -33DC; 0073 0076; Additional folding -33DD; 0077 0062; Additional folding -FB00; 0066 0066; Case map -FB01; 0066 0069; Case map -FB02; 0066 006C; Case map -FB03; 0066 0066 0069; Case map -FB04; 0066 0066 006C; Case map -FB05; 0073 0074; Case map -FB06; 0073 0074; Case map -FB13; 0574 0576; Case map -FB14; 0574 0565; Case map -FB15; 0574 056B; Case map -FB16; 057E 0576; Case map -FB17; 0574 056D; Case map -FF21; FF41; Case map -FF22; FF42; Case map -FF23; FF43; Case map -FF24; FF44; Case map -FF25; FF45; Case map -FF26; FF46; Case map -FF27; FF47; Case map -FF28; FF48; Case map -FF29; FF49; Case map -FF2A; FF4A; Case map -FF2B; FF4B; Case map -FF2C; FF4C; Case map -FF2D; FF4D; Case map -FF2E; FF4E; Case map -FF2F; FF4F; Case map -FF30; FF50; Case map -FF31; FF51; Case map -FF32; FF52; Case map -FF33; FF53; Case map -FF34; FF54; Case map -FF35; FF55; Case map -FF36; FF56; Case map -FF37; FF57; Case map -FF38; FF58; Case map -FF39; FF59; Case map -FF3A; FF5A; Case map -10400; 10428; Case map -10401; 10429; Case map -10402; 1042A; Case map -10403; 1042B; Case map -10404; 1042C; Case map -10405; 1042D; Case map -10406; 1042E; Case map -10407; 1042F; Case map -10408; 10430; Case map -10409; 10431; Case map -1040A; 10432; Case map -1040B; 10433; Case map -1040C; 10434; Case map -1040D; 10435; Case map -1040E; 10436; Case map -1040F; 10437; Case map -10410; 10438; Case map -10411; 10439; Case map -10412; 1043A; Case map -10413; 1043B; Case map -10414; 1043C; Case map -10415; 1043D; Case map -10416; 1043E; Case map -10417; 1043F; Case map -10418; 10440; Case map -10419; 10441; Case map -1041A; 10442; Case map -1041B; 10443; Case map -1041C; 10444; Case map -1041D; 10445; Case map -1041E; 10446; Case map -1041F; 10447; Case map -10420; 10448; Case map -10421; 10449; Case map -10422; 1044A; Case map -10423; 1044B; Case map -10424; 1044C; Case map -10425; 1044D; Case map -1D400; 0061; Additional folding -1D401; 0062; Additional folding -1D402; 0063; Additional folding -1D403; 0064; Additional folding -1D404; 0065; Additional folding -1D405; 0066; Additional folding -1D406; 0067; Additional folding -1D407; 0068; Additional folding -1D408; 0069; Additional folding -1D409; 006A; Additional folding -1D40A; 006B; Additional folding -1D40B; 006C; Additional folding -1D40C; 006D; Additional folding -1D40D; 006E; Additional folding -1D40E; 006F; Additional folding -1D40F; 0070; Additional folding -1D410; 0071; Additional folding -1D411; 0072; Additional folding -1D412; 0073; Additional folding -1D413; 0074; Additional folding -1D414; 0075; Additional folding -1D415; 0076; Additional folding -1D416; 0077; Additional folding -1D417; 0078; Additional folding -1D418; 0079; Additional folding -1D419; 007A; Additional folding -1D434; 0061; Additional folding -1D435; 0062; Additional folding -1D436; 0063; Additional folding -1D437; 0064; Additional folding -1D438; 0065; Additional folding -1D439; 0066; Additional folding -1D43A; 0067; Additional folding -1D43B; 0068; Additional folding -1D43C; 0069; Additional folding -1D43D; 006A; Additional folding -1D43E; 006B; Additional folding -1D43F; 006C; Additional folding -1D440; 006D; Additional folding -1D441; 006E; Additional folding -1D442; 006F; Additional folding -1D443; 0070; Additional folding -1D444; 0071; Additional folding -1D445; 0072; Additional folding -1D446; 0073; Additional folding -1D447; 0074; Additional folding -1D448; 0075; Additional folding -1D449; 0076; Additional folding -1D44A; 0077; Additional folding -1D44B; 0078; Additional folding -1D44C; 0079; Additional folding -1D44D; 007A; Additional folding -1D468; 0061; Additional folding -1D469; 0062; Additional folding -1D46A; 0063; Additional folding -1D46B; 0064; Additional folding -1D46C; 0065; Additional folding -1D46D; 0066; Additional folding -1D46E; 0067; Additional folding -1D46F; 0068; Additional folding -1D470; 0069; Additional folding -1D471; 006A; Additional folding -1D472; 006B; Additional folding -1D473; 006C; Additional folding -1D474; 006D; Additional folding -1D475; 006E; Additional folding -1D476; 006F; Additional folding -1D477; 0070; Additional folding -1D478; 0071; Additional folding -1D479; 0072; Additional folding -1D47A; 0073; Additional folding -1D47B; 0074; Additional folding -1D47C; 0075; Additional folding -1D47D; 0076; Additional folding -1D47E; 0077; Additional folding -1D47F; 0078; Additional folding -1D480; 0079; Additional folding -1D481; 007A; Additional folding -1D49C; 0061; Additional folding -1D49E; 0063; Additional folding -1D49F; 0064; Additional folding -1D4A2; 0067; Additional folding -1D4A5; 006A; Additional folding -1D4A6; 006B; Additional folding -1D4A9; 006E; Additional folding -1D4AA; 006F; Additional folding -1D4AB; 0070; Additional folding -1D4AC; 0071; Additional folding -1D4AE; 0073; Additional folding -1D4AF; 0074; Additional folding -1D4B0; 0075; Additional folding -1D4B1; 0076; Additional folding -1D4B2; 0077; Additional folding -1D4B3; 0078; Additional folding -1D4B4; 0079; Additional folding -1D4B5; 007A; Additional folding -1D4D0; 0061; Additional folding -1D4D1; 0062; Additional folding -1D4D2; 0063; Additional folding -1D4D3; 0064; Additional folding -1D4D4; 0065; Additional folding -1D4D5; 0066; Additional folding -1D4D6; 0067; Additional folding -1D4D7; 0068; Additional folding -1D4D8; 0069; Additional folding -1D4D9; 006A; Additional folding -1D4DA; 006B; Additional folding -1D4DB; 006C; Additional folding -1D4DC; 006D; Additional folding -1D4DD; 006E; Additional folding -1D4DE; 006F; Additional folding -1D4DF; 0070; Additional folding -1D4E0; 0071; Additional folding -1D4E1; 0072; Additional folding -1D4E2; 0073; Additional folding -1D4E3; 0074; Additional folding -1D4E4; 0075; Additional folding -1D4E5; 0076; Additional folding -1D4E6; 0077; Additional folding -1D4E7; 0078; Additional folding -1D4E8; 0079; Additional folding -1D4E9; 007A; Additional folding -1D504; 0061; Additional folding -1D505; 0062; Additional folding -1D507; 0064; Additional folding -1D508; 0065; Additional folding -1D509; 0066; Additional folding -1D50A; 0067; Additional folding -1D50D; 006A; Additional folding -1D50E; 006B; Additional folding -1D50F; 006C; Additional folding -1D510; 006D; Additional folding -1D511; 006E; Additional folding -1D512; 006F; Additional folding -1D513; 0070; Additional folding -1D514; 0071; Additional folding -1D516; 0073; Additional folding -1D517; 0074; Additional folding -1D518; 0075; Additional folding -1D519; 0076; Additional folding -1D51A; 0077; Additional folding -1D51B; 0078; Additional folding -1D51C; 0079; Additional folding -1D538; 0061; Additional folding -1D539; 0062; Additional folding -1D53B; 0064; Additional folding -1D53C; 0065; Additional folding -1D53D; 0066; Additional folding -1D53E; 0067; Additional folding -1D540; 0069; Additional folding -1D541; 006A; Additional folding -1D542; 006B; Additional folding -1D543; 006C; Additional folding -1D544; 006D; Additional folding -1D546; 006F; Additional folding -1D54A; 0073; Additional folding -1D54B; 0074; Additional folding -1D54C; 0075; Additional folding -1D54D; 0076; Additional folding -1D54E; 0077; Additional folding -1D54F; 0078; Additional folding -1D550; 0079; Additional folding -1D56C; 0061; Additional folding -1D56D; 0062; Additional folding -1D56E; 0063; Additional folding -1D56F; 0064; Additional folding -1D570; 0065; Additional folding -1D571; 0066; Additional folding -1D572; 0067; Additional folding -1D573; 0068; Additional folding -1D574; 0069; Additional folding -1D575; 006A; Additional folding -1D576; 006B; Additional folding -1D577; 006C; Additional folding -1D578; 006D; Additional folding -1D579; 006E; Additional folding -1D57A; 006F; Additional folding -1D57B; 0070; Additional folding -1D57C; 0071; Additional folding -1D57D; 0072; Additional folding -1D57E; 0073; Additional folding -1D57F; 0074; Additional folding -1D580; 0075; Additional folding -1D581; 0076; Additional folding -1D582; 0077; Additional folding -1D583; 0078; Additional folding -1D584; 0079; Additional folding -1D585; 007A; Additional folding -1D5A0; 0061; Additional folding -1D5A1; 0062; Additional folding -1D5A2; 0063; Additional folding -1D5A3; 0064; Additional folding -1D5A4; 0065; Additional folding -1D5A5; 0066; Additional folding -1D5A6; 0067; Additional folding -1D5A7; 0068; Additional folding -1D5A8; 0069; Additional folding -1D5A9; 006A; Additional folding -1D5AA; 006B; Additional folding -1D5AB; 006C; Additional folding -1D5AC; 006D; Additional folding -1D5AD; 006E; Additional folding -1D5AE; 006F; Additional folding -1D5AF; 0070; Additional folding -1D5B0; 0071; Additional folding -1D5B1; 0072; Additional folding -1D5B2; 0073; Additional folding -1D5B3; 0074; Additional folding -1D5B4; 0075; Additional folding -1D5B5; 0076; Additional folding -1D5B6; 0077; Additional folding -1D5B7; 0078; Additional folding -1D5B8; 0079; Additional folding -1D5B9; 007A; Additional folding -1D5D4; 0061; Additional folding -1D5D5; 0062; Additional folding -1D5D6; 0063; Additional folding -1D5D7; 0064; Additional folding -1D5D8; 0065; Additional folding -1D5D9; 0066; Additional folding -1D5DA; 0067; Additional folding -1D5DB; 0068; Additional folding -1D5DC; 0069; Additional folding -1D5DD; 006A; Additional folding -1D5DE; 006B; Additional folding -1D5DF; 006C; Additional folding -1D5E0; 006D; Additional folding -1D5E1; 006E; Additional folding -1D5E2; 006F; Additional folding -1D5E3; 0070; Additional folding -1D5E4; 0071; Additional folding -1D5E5; 0072; Additional folding -1D5E6; 0073; Additional folding -1D5E7; 0074; Additional folding -1D5E8; 0075; Additional folding -1D5E9; 0076; Additional folding -1D5EA; 0077; Additional folding -1D5EB; 0078; Additional folding -1D5EC; 0079; Additional folding -1D5ED; 007A; Additional folding -1D608; 0061; Additional folding -1D609; 0062; Additional folding -1D60A; 0063; Additional folding -1D60B; 0064; Additional folding -1D60C; 0065; Additional folding -1D60D; 0066; Additional folding -1D60E; 0067; Additional folding -1D60F; 0068; Additional folding -1D610; 0069; Additional folding -1D611; 006A; Additional folding -1D612; 006B; Additional folding -1D613; 006C; Additional folding -1D614; 006D; Additional folding -1D615; 006E; Additional folding -1D616; 006F; Additional folding -1D617; 0070; Additional folding -1D618; 0071; Additional folding -1D619; 0072; Additional folding -1D61A; 0073; Additional folding -1D61B; 0074; Additional folding -1D61C; 0075; Additional folding -1D61D; 0076; Additional folding -1D61E; 0077; Additional folding -1D61F; 0078; Additional folding -1D620; 0079; Additional folding -1D621; 007A; Additional folding -1D63C; 0061; Additional folding -1D63D; 0062; Additional folding -1D63E; 0063; Additional folding -1D63F; 0064; Additional folding -1D640; 0065; Additional folding -1D641; 0066; Additional folding -1D642; 0067; Additional folding -1D643; 0068; Additional folding -1D644; 0069; Additional folding -1D645; 006A; Additional folding -1D646; 006B; Additional folding -1D647; 006C; Additional folding -1D648; 006D; Additional folding -1D649; 006E; Additional folding -1D64A; 006F; Additional folding -1D64B; 0070; Additional folding -1D64C; 0071; Additional folding -1D64D; 0072; Additional folding -1D64E; 0073; Additional folding -1D64F; 0074; Additional folding -1D650; 0075; Additional folding -1D651; 0076; Additional folding -1D652; 0077; Additional folding -1D653; 0078; Additional folding -1D654; 0079; Additional folding -1D655; 007A; Additional folding -1D670; 0061; Additional folding -1D671; 0062; Additional folding -1D672; 0063; Additional folding -1D673; 0064; Additional folding -1D674; 0065; Additional folding -1D675; 0066; Additional folding -1D676; 0067; Additional folding -1D677; 0068; Additional folding -1D678; 0069; Additional folding -1D679; 006A; Additional folding -1D67A; 006B; Additional folding -1D67B; 006C; Additional folding -1D67C; 006D; Additional folding -1D67D; 006E; Additional folding -1D67E; 006F; Additional folding -1D67F; 0070; Additional folding -1D680; 0071; Additional folding -1D681; 0072; Additional folding -1D682; 0073; Additional folding -1D683; 0074; Additional folding -1D684; 0075; Additional folding -1D685; 0076; Additional folding -1D686; 0077; Additional folding -1D687; 0078; Additional folding -1D688; 0079; Additional folding -1D689; 007A; Additional folding -1D6A8; 03B1; Additional folding -1D6A9; 03B2; Additional folding -1D6AA; 03B3; Additional folding -1D6AB; 03B4; Additional folding -1D6AC; 03B5; Additional folding -1D6AD; 03B6; Additional folding -1D6AE; 03B7; Additional folding -1D6AF; 03B8; Additional folding -1D6B0; 03B9; Additional folding -1D6B1; 03BA; Additional folding -1D6B2; 03BB; Additional folding -1D6B3; 03BC; Additional folding -1D6B4; 03BD; Additional folding -1D6B5; 03BE; Additional folding -1D6B6; 03BF; Additional folding -1D6B7; 03C0; Additional folding -1D6B8; 03C1; Additional folding -1D6B9; 03B8; Additional folding -1D6BA; 03C3; Additional folding -1D6BB; 03C4; Additional folding -1D6BC; 03C5; Additional folding -1D6BD; 03C6; Additional folding -1D6BE; 03C7; Additional folding -1D6BF; 03C8; Additional folding -1D6C0; 03C9; Additional folding -1D6D3; 03C3; Additional folding -1D6E2; 03B1; Additional folding -1D6E3; 03B2; Additional folding -1D6E4; 03B3; Additional folding -1D6E5; 03B4; Additional folding -1D6E6; 03B5; Additional folding -1D6E7; 03B6; Additional folding -1D6E8; 03B7; Additional folding -1D6E9; 03B8; Additional folding -1D6EA; 03B9; Additional folding -1D6EB; 03BA; Additional folding -1D6EC; 03BB; Additional folding -1D6ED; 03BC; Additional folding -1D6EE; 03BD; Additional folding -1D6EF; 03BE; Additional folding -1D6F0; 03BF; Additional folding -1D6F1; 03C0; Additional folding -1D6F2; 03C1; Additional folding -1D6F3; 03B8; Additional folding -1D6F4; 03C3; Additional folding -1D6F5; 03C4; Additional folding -1D6F6; 03C5; Additional folding -1D6F7; 03C6; Additional folding -1D6F8; 03C7; Additional folding -1D6F9; 03C8; Additional folding -1D6FA; 03C9; Additional folding -1D70D; 03C3; Additional folding -1D71C; 03B1; Additional folding -1D71D; 03B2; Additional folding -1D71E; 03B3; Additional folding -1D71F; 03B4; Additional folding -1D720; 03B5; Additional folding -1D721; 03B6; Additional folding -1D722; 03B7; Additional folding -1D723; 03B8; Additional folding -1D724; 03B9; Additional folding -1D725; 03BA; Additional folding -1D726; 03BB; Additional folding -1D727; 03BC; Additional folding -1D728; 03BD; Additional folding -1D729; 03BE; Additional folding -1D72A; 03BF; Additional folding -1D72B; 03C0; Additional folding -1D72C; 03C1; Additional folding -1D72D; 03B8; Additional folding -1D72E; 03C3; Additional folding -1D72F; 03C4; Additional folding -1D730; 03C5; Additional folding -1D731; 03C6; Additional folding -1D732; 03C7; Additional folding -1D733; 03C8; Additional folding -1D734; 03C9; Additional folding -1D747; 03C3; Additional folding -1D756; 03B1; Additional folding -1D757; 03B2; Additional folding -1D758; 03B3; Additional folding -1D759; 03B4; Additional folding -1D75A; 03B5; Additional folding -1D75B; 03B6; Additional folding -1D75C; 03B7; Additional folding -1D75D; 03B8; Additional folding -1D75E; 03B9; Additional folding -1D75F; 03BA; Additional folding -1D760; 03BB; Additional folding -1D761; 03BC; Additional folding -1D762; 03BD; Additional folding -1D763; 03BE; Additional folding -1D764; 03BF; Additional folding -1D765; 03C0; Additional folding -1D766; 03C1; Additional folding -1D767; 03B8; Additional folding -1D768; 03C3; Additional folding -1D769; 03C4; Additional folding -1D76A; 03C5; Additional folding -1D76B; 03C6; Additional folding -1D76C; 03C7; Additional folding -1D76D; 03C8; Additional folding -1D76E; 03C9; Additional folding -1D781; 03C3; Additional folding -1D790; 03B1; Additional folding -1D791; 03B2; Additional folding -1D792; 03B3; Additional folding -1D793; 03B4; Additional folding -1D794; 03B5; Additional folding -1D795; 03B6; Additional folding -1D796; 03B7; Additional folding -1D797; 03B8; Additional folding -1D798; 03B9; Additional folding -1D799; 03BA; Additional folding -1D79A; 03BB; Additional folding -1D79B; 03BC; Additional folding -1D79C; 03BD; Additional folding -1D79D; 03BE; Additional folding -1D79E; 03BF; Additional folding -1D79F; 03C0; Additional folding -1D7A0; 03C1; Additional folding -1D7A1; 03B8; Additional folding -1D7A2; 03C3; Additional folding -1D7A3; 03C4; Additional folding -1D7A4; 03C5; Additional folding -1D7A5; 03C6; Additional folding -1D7A6; 03C7; Additional folding -1D7A7; 03C8; Additional folding -1D7A8; 03C9; Additional folding -1D7BB; 03C3; Additional folding - -# Total code points 1371 - diff --git a/icuSources/data/misc/rfc3454_C_X.txt b/icuSources/data/misc/rfc3454_C_X.txt deleted file mode 100644 index 6a1c9a78..00000000 --- a/icuSources/data/misc/rfc3454_C_X.txt +++ /dev/null @@ -1,182 +0,0 @@ -################### -# Copyright (C) 2003, International Business Machines -# Corporation and others. All Rights Reserved. -# WARNING: This table is generated by filterRFC3454.pl tool. DO NOT EDIT -################# - -# code points from Table C.1.1 - -0020; SPACE - -# Total code points 1 - -################### -# WARNING: This table is generated by filterRFC3454.pl tool. DO NOT EDIT -################# - -# code points from Table C.1.2 - -00A0; NO..BREAK SPACE -1680; OGHAM SPACE MARK -2000; EN QUAD -2001; EM QUAD -2002; EN SPACE -2003; EM SPACE -2004; THREE..PER-EM SPACE -2005; FOUR..PER-EM SPACE -2006; SIX..PER-EM SPACE -2007; FIGURE SPACE -2008; PUNCTUATION SPACE -2009; THIN SPACE -200A; HAIR SPACE -200B; ZERO WIDTH SPACE -202F; NARROW NO..BREAK SPACE -205F; MEDIUM MATHEMATICAL SPACE -3000; IDEOGRAPHIC SPACE - -# Total code points 13 - -################### -# WARNING: This table is generated by filterRFC3454.pl tool. DO NOT EDIT -################# - -# code points from Table C.2.1 - -0000..001F; [CONTROL CHARACTERS] -007F; DELETE - -# Total code points 18 - -################### -# WARNING: This table is generated by filterRFC3454.pl tool. DO NOT EDIT -################# - -# code points from Table C.2.2 - -0080..009F; [CONTROL CHARACTERS] -06DD; ARABIC END OF AYAH -070F; SYRIAC ABBREVIATION MARK -180E; MONGOLIAN VOWEL SEPARATOR -200C; ZERO WIDTH NON..JOINER -200D; ZERO WIDTH JOINER -2028; LINE SEPARATOR -2029; PARAGRAPH SEPARATOR -2060; WORD JOINER -2061; FUNCTION APPLICATION -2062; INVISIBLE TIMES -2063; INVISIBLE SEPARATOR -206A..206F; [CONTROL CHARACTERS] -FEFF; ZERO WIDTH NO..BREAK SPACE -FFF9..FFFC; [CONTROL CHARACTERS] -1D173..1D17A; [MUSICAL CONTROL CHARACTERS] - -# Total code points 29 - -################### -# WARNING: This table is generated by filterRFC3454.pl tool. DO NOT EDIT -################# - -# code points from Table C.3 - -E000..F8FF; [PRIVATE USE, PLANE 0] -F0000..FFFFD; [PRIVATE USE, PLANE 15] -100000..10FFFD; [PRIVATE USE, PLANE 16] - -# Total code points 2051 - -################### -# WARNING: This table is generated by filterRFC3454.pl tool. DO NOT EDIT -################# - -# code points from Table C.4 - -FDD0..FDEF; [NONCHARACTER CODE POINTS] -FFFE..FFFF; [NONCHARACTER CODE POINTS] -1FFFE..1FFFF; [NONCHARACTER CODE POINTS] -2FFFE..2FFFF; [NONCHARACTER CODE POINTS] -3FFFE..3FFFF; [NONCHARACTER CODE POINTS] -4FFFE..4FFFF; [NONCHARACTER CODE POINTS] -5FFFE..5FFFF; [NONCHARACTER CODE POINTS] -6FFFE..6FFFF; [NONCHARACTER CODE POINTS] -7FFFE..7FFFF; [NONCHARACTER CODE POINTS] -8FFFE..8FFFF; [NONCHARACTER CODE POINTS] -9FFFE..9FFFF; [NONCHARACTER CODE POINTS] -AFFFE..AFFFF; [NONCHARACTER CODE POINTS] -BFFFE..BFFFF; [NONCHARACTER CODE POINTS] -CFFFE..CFFFF; [NONCHARACTER CODE POINTS] -DFFFE..DFFFF; [NONCHARACTER CODE POINTS] -EFFFE..EFFFF; [NONCHARACTER CODE POINTS] -FFFFE..FFFFF; [NONCHARACTER CODE POINTS] -10FFFE..10FFFF; [NONCHARACTER CODE POINTS] - -# Total code points 18 - -################### -# WARNING: This table is generated by filterRFC3454.pl tool. DO NOT EDIT -################# - -# code points from Table C.5 - -D800..DFFF; [SURROGATE CODES] - -# Total code points 0 - -################### -# WARNING: This table is generated by filterRFC3454.pl tool. DO NOT EDIT -################# - -# code points from Table C.6 - -FFF9; INTERLINEAR ANNOTATION ANCHOR -FFFA; INTERLINEAR ANNOTATION SEPARATOR -FFFB; INTERLINEAR ANNOTATION TERMINATOR -FFFC; OBJECT REPLACEMENT CHARACTER -FFFD; REPLACEMENT CHARACTER - -# Total code points 5 - -################### -# WARNING: This table is generated by filterRFC3454.pl tool. DO NOT EDIT -################# - -# code points from Table C.7 - -2FF0..2FFB; [IDEOGRAPHIC DESCRIPTION CHARACTERS] - -# Total code points 1 - -################### -# WARNING: This table is generated by filterRFC3454.pl tool. DO NOT EDIT -################# - -# code points from Table C.8 - -0340; COMBINING GRAVE TONE MARK -0341; COMBINING ACUTE TONE MARK -200E; LEFT..TO-RIGHT MARK -200F; RIGHT..TO-LEFT MARK -202A; LEFT..TO-RIGHT EMBEDDING -202B; RIGHT..TO-LEFT EMBEDDING -202C; POP DIRECTIONAL FORMATTING -202D; LEFT..TO-RIGHT OVERRIDE -202E; RIGHT..TO-LEFT OVERRIDE -206A; INHIBIT SYMMETRIC SWAPPING -206B; ACTIVATE SYMMETRIC SWAPPING -206C; INHIBIT ARABIC FORM SHAPING -206D; ACTIVATE ARABIC FORM SHAPING -206E; NATIONAL DIGIT SHAPES -206F; NOMINAL DIGIT SHAPES - -# Total code points 9 - -################### -# WARNING: This table is generated by filterRFC3454.pl tool. DO NOT EDIT -################# - -# code points from Table C.9 - -E0001; LANGUAGE TAG -E0020..E007F; [TAGGING CHARACTERS] - -# Total code points 82 - diff --git a/icuSources/data/misc/timezone.txt b/icuSources/data/misc/timezone.txt deleted file mode 100644 index 1943d251..00000000 --- a/icuSources/data/misc/timezone.txt +++ /dev/null @@ -1,868 +0,0 @@ -##################################################################### -# Copyright (C) 2000-2003, International Business Machines Corporation and -# others. All Rights Reserved. -##################################################################### -#--- Header --- Generated by tz.pl -4 # format version number of this file -2003 # (tzdata2003a) version of Olson zone -1 # data from ftp://elsie.nci.nih.gov/pub -439 # total zone count -118 # equivalency groups count -50 # max zones with same gmtOffset -33 # max zones in an equivalency group -6400 # length of name table in bytes -end - -#--- Zone table --- -#| equiv_index,name -439 # count of zones to follow -97,ACT -101,AET -37,AGT -57,ART -7,AST -45,Africa/Abidjan -48,Africa/Accra -64,Africa/Addis_Ababa -49,Africa/Algiers -64,Africa/Asmera -45,Africa/Bamako -49,Africa/Bangui -45,Africa/Banjul -45,Africa/Bissau -54,Africa/Blantyre -49,Africa/Brazzaville -54,Africa/Bujumbura -57,Africa/Cairo -45,Africa/Casablanca -50,Africa/Ceuta -45,Africa/Conakry -45,Africa/Dakar -64,Africa/Dar_es_Salaam -64,Africa/Djibouti -49,Africa/Douala -45,Africa/El_Aaiun -46,Africa/Freetown -54,Africa/Gaborone -54,Africa/Harare -63,Africa/Johannesburg -64,Africa/Kampala -64,Africa/Khartoum -54,Africa/Kigali -49,Africa/Kinshasa -49,Africa/Lagos -49,Africa/Libreville -45,Africa/Lome -49,Africa/Luanda -54,Africa/Lubumbashi -54,Africa/Lusaka -49,Africa/Malabo -54,Africa/Maputo -54,Africa/Maseru -54,Africa/Mbabane -64,Africa/Mogadishu -45,Africa/Monrovia -64,Africa/Nairobi -49,Africa/Ndjamena -49,Africa/Niamey -45,Africa/Nouakchott -45,Africa/Ouagadougou -49,Africa/Porto-Novo -45,Africa/Sao_Tome -45,Africa/Timbuktu -54,Africa/Tripoli -52,Africa/Tunis -53,Africa/Windhoek -3,America/Adak -7,America/Anchorage -27,America/Anguilla -27,America/Antigua -41,America/Araguaina -27,America/Aruba -34,America/Asuncion -30,America/Barbados -37,America/Belem -15,America/Belize -27,America/Boa_Vista -26,America/Bogota -11,America/Boise -37,America/Buenos_Aires -11,America/Cambridge_Bay -13,America/Cancun -27,America/Caracas -37,America/Catamarca -37,America/Cayenne -20,America/Cayman -13,America/Chicago -11,America/Chihuahua -37,America/Cordoba -16,America/Costa_Rica -31,America/Cuiaba -27,America/Curacao -45,America/Danmarkshavn -9,America/Dawson -10,America/Dawson_Creek -11,America/Denver -24,America/Detroit -27,America/Dominica -11,America/Edmonton -20,America/Eirunepe -18,America/El_Salvador -37,America/Fortaleza -29,America/Glace_Bay -39,America/Godthab -28,America/Goose_Bay -21,America/Grand_Turk -27,America/Grenada -27,America/Guadeloupe -17,America/Guatemala -20,America/Guayaquil -27,America/Guyana -29,America/Halifax -22,America/Havana -10,America/Hermosillo -20,America/Indiana/Knox -20,America/Indiana/Marengo -20,America/Indiana/Vevay -20,America/Indianapolis -11,America/Inuvik -24,America/Iqaluit -20,America/Jamaica -37,America/Jujuy -7,America/Juneau -24,America/Kentucky/Monticello -27,America/La_Paz -25,America/Lima -9,America/Los_Angeles -24,America/Louisville -37,America/Maceio -12,America/Managua -27,America/Manaus -27,America/Martinique -11,America/Mazatlan -37,America/Mendoza -13,America/Menominee -13,America/Merida -13,America/Mexico_City -38,America/Miquelon -13,America/Monterrey -40,America/Montevideo -24,America/Montreal -27,America/Montserrat -24,America/Nassau -24,America/New_York -24,America/Nipigon -7,America/Nome -42,America/Noronha -13,America/North_Dakota/Center -20,America/Panama -24,America/Pangnirtung -37,America/Paramaribo -10,America/Phoenix -23,America/Port-au-Prince -27,America/Port_of_Spain -27,America/Porto_Velho -27,America/Puerto_Rico -13,America/Rainy_River -13,America/Rankin_Inlet -37,America/Recife -12,America/Regina -20,America/Rio_Branco -33,America/Santiago -27,America/Santo_Domingo -41,America/Sao_Paulo -44,America/Scoresbysund -36,America/St_Johns -27,America/St_Kitts -27,America/St_Lucia -27,America/St_Thomas -27,America/St_Vincent -12,America/Swift_Current -18,America/Tegucigalpa -29,America/Thule -24,America/Thunder_Bay -9,America/Tijuana -27,America/Tortola -9,America/Vancouver -9,America/Whitehorse -14,America/Winnipeg -7,America/Yakutat -11,America/Yellowknife -86,Antarctica/Casey -83,Antarctica/Davis -99,Antarctica/DumontDUrville -80,Antarctica/Mawson -113,Antarctica/McMurdo -32,Antarctica/Palmer -37,Antarctica/Rothera -64,Antarctica/Syowa -80,Antarctica/Vostok -50,Arctic/Longyearbyen -64,Asia/Aden -81,Asia/Almaty -62,Asia/Amman -111,Asia/Anadyr -72,Asia/Aqtau -76,Asia/Aqtobe -74,Asia/Ashgabat -65,Asia/Baghdad -64,Asia/Bahrain -71,Asia/Baku -83,Asia/Bangkok -59,Asia/Beirut -77,Asia/Bishkek -86,Asia/Brunei -78,Asia/Calcutta -94,Asia/Choibalsan -88,Asia/Chongqing -80,Asia/Colombo -55,Asia/Damascus -80,Asia/Dhaka -93,Asia/Dili -69,Asia/Dubai -74,Asia/Dushanbe -56,Asia/Gaza -88,Asia/Harbin -92,Asia/Hong_Kong -84,Asia/Hovd -91,Asia/Irkutsk -83,Asia/Jakarta -93,Asia/Jayapura -58,Asia/Jerusalem -73,Asia/Kabul -111,Asia/Kamchatka -75,Asia/Karachi -88,Asia/Kashgar -79,Asia/Katmandu -85,Asia/Krasnoyarsk -86,Asia/Kuala_Lumpur -86,Asia/Kuching -64,Asia/Kuwait -88,Asia/Macau -107,Asia/Magadan -86,Asia/Makassar -90,Asia/Manila -69,Asia/Muscat -60,Asia/Nicosia -81,Asia/Novosibirsk -81,Asia/Omsk -72,Asia/Oral -83,Asia/Phnom_Penh -83,Asia/Pontianak -93,Asia/Pyongyang -64,Asia/Qatar -81,Asia/Qyzylorda -82,Asia/Rangoon -64,Asia/Riyadh -67,Asia/Riyadh87 -67,Asia/Riyadh88 -67,Asia/Riyadh89 -83,Asia/Saigon -100,Asia/Sakhalin -74,Asia/Samarkand -96,Asia/Seoul -88,Asia/Shanghai -86,Asia/Singapore -89,Asia/Taipei -74,Asia/Tashkent -70,Asia/Tbilisi -68,Asia/Tehran -80,Asia/Thimphu -93,Asia/Tokyo -87,Asia/Ulaanbaatar -88,Asia/Urumqi -83,Asia/Vientiane -100,Asia/Vladivostok -95,Asia/Yakutsk -76,Asia/Yekaterinburg -72,Asia/Yerevan -44,Atlantic/Azores -29,Atlantic/Bermuda -47,Atlantic/Canary -43,Atlantic/Cape_Verde -47,Atlantic/Faeroe -50,Atlantic/Jan_Mayen -47,Atlantic/Madeira -45,Atlantic/Reykjavik -42,Atlantic/South_Georgia -45,Atlantic/St_Helena -35,Atlantic/Stanley -98,Australia/Adelaide -102,Australia/Brisbane -98,Australia/Broken_Hill -97,Australia/Darwin -103,Australia/Hobart -102,Australia/Lindeman -104,Australia/Lord_Howe -101,Australia/Melbourne -86,Australia/Perth -101,Australia/Sydney -41,BET -80,BST -54,CAT -51,CET -36,CNT -13,CST -88,CTT -64,EAT -50,ECT -60,EET -24,EST -45,Etc/GMT -43,Etc/GMT+1 -2,Etc/GMT+10 -1,Etc/GMT+11 -0,Etc/GMT+12 -42,Etc/GMT+2 -37,Etc/GMT+3 -27,Etc/GMT+4 -20,Etc/GMT+5 -12,Etc/GMT+6 -10,Etc/GMT+7 -8,Etc/GMT+8 -6,Etc/GMT+9 -49,Etc/GMT-1 -99,Etc/GMT-10 -105,Etc/GMT-11 -110,Etc/GMT-12 -115,Etc/GMT-13 -117,Etc/GMT-14 -54,Etc/GMT-2 -64,Etc/GMT-3 -69,Etc/GMT-4 -74,Etc/GMT-5 -80,Etc/GMT-6 -83,Etc/GMT-7 -86,Etc/GMT-8 -93,Etc/GMT-9 -45,Etc/UCT -45,Etc/UTC -50,Europe/Amsterdam -50,Europe/Andorra -60,Europe/Athens -47,Europe/Belfast -50,Europe/Belgrade -50,Europe/Berlin -50,Europe/Bratislava -50,Europe/Brussels -60,Europe/Bucharest -50,Europe/Budapest -60,Europe/Chisinau -50,Europe/Copenhagen -47,Europe/Dublin -50,Europe/Gibraltar -60,Europe/Helsinki -60,Europe/Istanbul -61,Europe/Kaliningrad -60,Europe/Kiev -47,Europe/Lisbon -50,Europe/Ljubljana -47,Europe/London -50,Europe/Luxembourg -50,Europe/Madrid -50,Europe/Malta -61,Europe/Minsk -50,Europe/Monaco -66,Europe/Moscow -50,Europe/Oslo -50,Europe/Paris -50,Europe/Prague -60,Europe/Riga -50,Europe/Rome -72,Europe/Samara -50,Europe/San_Marino -50,Europe/Sarajevo -60,Europe/Simferopol -50,Europe/Skopje -60,Europe/Sofia -50,Europe/Stockholm -60,Europe/Tallinn -50,Europe/Tirane -60,Europe/Uzhgorod -50,Europe/Vaduz -50,Europe/Vatican -50,Europe/Vienna -60,Europe/Vilnius -50,Europe/Warsaw -50,Europe/Zagreb -60,Europe/Zaporozhye -50,Europe/Zurich -45,GMT -2,HST -20,IET -78,IST -64,Indian/Antananarivo -80,Indian/Chagos -83,Indian/Christmas -82,Indian/Cocos -64,Indian/Comoro -74,Indian/Kerguelen -69,Indian/Mahe -74,Indian/Maldives -69,Indian/Mauritius -64,Indian/Mayotte -69,Indian/Reunion -93,JST -51,MET -1,MIT -11,MST -72,NET -113,NST -75,PLT -10,PNT -27,PRT -9,PST -1,Pacific/Apia -113,Pacific/Auckland -114,Pacific/Chatham -19,Pacific/Easter -108,Pacific/Efate -115,Pacific/Enderbury -2,Pacific/Fakaofo -112,Pacific/Fiji -110,Pacific/Funafuti -12,Pacific/Galapagos -6,Pacific/Gambier -105,Pacific/Guadalcanal -99,Pacific/Guam -2,Pacific/Honolulu -2,Pacific/Johnston -117,Pacific/Kiritimati -105,Pacific/Kosrae -110,Pacific/Kwajalein -110,Pacific/Majuro -5,Pacific/Marquesas -1,Pacific/Midway -110,Pacific/Nauru -1,Pacific/Niue -109,Pacific/Norfolk -106,Pacific/Noumea -1,Pacific/Pago_Pago -93,Pacific/Palau -8,Pacific/Pitcairn -105,Pacific/Ponape -99,Pacific/Port_Moresby -4,Pacific/Rarotonga -99,Pacific/Saipan -2,Pacific/Tahiti -110,Pacific/Tarawa -116,Pacific/Tongatapu -99,Pacific/Truk -110,Pacific/Wake -110,Pacific/Wallis -99,Pacific/Yap -105,SST -45,UTC -83,VST -47,WET -end - -#--- Equivalency table --- -#| ('s'|'d'),zone_spec,id_count,id_list -118 # count of equivalency groups to follow -s,-43200,1,296 # 0 GMT-12 [ Etc/GMT+12 ] -s,-39600,6,295,388,396,416,418,421 # 1 GMT-11 [ Etc/GMT+11 MIT Pacific/Apia Pacific/Midway Pacific/Niue Pacific/Pago_Pago ] -s,-36000,6,294,372,402,409,410,428 # 2 GMT-10 [ Etc/GMT+10 HST Pacific/Fakaofo Pacific/Honolulu Pacific/Johnston Pacific/Tahiti ] -d,-36000,3,1,-1,120,w,9,-1,1,120,w,60,1,57 # 3 GMT-10:00 Apr Sun>=1 2:00 Oct lastSun 2:00 1:00 [ America/Adak ] -s,-36000,1,426 # 4 GMT-10:00 [ Pacific/Rarotonga ] -s,-34200,1,415 # 5 GMT-9:30 [ Pacific/Marquesas ] -s,-32400,2,304,406 # 6 GMT-9 [ Etc/GMT+9 Pacific/Gambier ] -d,-32400,3,1,-1,120,w,9,-1,1,120,w,60,5,4,58,113,136,170 # 7 GMT-9:00 Apr Sun>=1 2:00 Oct lastSun 2:00 1:00 [ AST America/Anchorage America/Juneau America/Nome America/Yakutat ] -s,-28800,2,303,423 # 8 GMT-8 [ Etc/GMT+8 Pacific/Pitcairn ] -d,-28800,3,1,-1,120,w,9,-1,1,120,w,60,6,84,117,165,167,168,395 # 9 GMT-8:00 Apr Sun>=1 2:00 Oct lastSun 2:00 1:00 [ America/Dawson America/Los_Angeles America/Tijuana America/Vancouver America/Whitehorse PST ] -s,-25200,5,85,104,142,302,393 # 10 GMT-7:00 [ America/Dawson_Creek America/Hermosillo America/Phoenix Etc/GMT+7 PNT ] -d,-25200,3,1,-1,120,w,9,-1,1,120,w,60,9,69,71,78,86,89,109,123,171,389 # 11 GMT-7:00 Apr Sun>=1 2:00 Oct lastSun 2:00 1:00 [ America/Boise America/Cambridge_Bay America/Chihuahua America/Denver America/Edmonton America/Inuvik America/Mazatlan America/Yellowknife MST ] -s,-21600,5,120,150,161,301,405 # 12 GMT-6:00 [ America/Managua America/Regina America/Swift_Current Etc/GMT+6 Pacific/Galapagos ] -d,-21600,3,1,-1,120,w,9,-1,1,120,w,60,10,72,77,125,126,127,129,138,147,148,286 # 13 GMT-6:00 Apr Sun>=1 2:00 Oct lastSun 2:00 1:00 [ America/Cancun America/Chicago America/Menominee America/Merida America/Mexico_City America/Monterrey America/North_Dakota/Center America/Rainy_River America/Rankin_Inlet CST ] -d,-21600,3,1,-1,120,w,9,-1,1,120,s,60,1,169 # 14 GMT-6:00 Apr Sun>=1 2:00 Oct lastSun 2:00s 1:00 [ America/Winnipeg ] -s,-21600,1,66 # 15 GMT-6:00 [ America/Belize ] -s,-21600,1,80 # 16 GMT-6:00 [ America/Costa_Rica ] -s,-21600,1,99 # 17 GMT-6:00 [ America/Guatemala ] -s,-21600,2,91,162 # 18 GMT-6:00 [ America/El_Salvador America/Tegucigalpa ] -d,-21600,9,9,-1,240,u,2,9,-1,180,u,60,1,399 # 19 GMT-6:00 Oct Sun>=9 4:00u Mar Sun>=9 3:00u 1:00 [ Pacific/Easter ] -s,-18000,12,76,90,100,105,106,107,108,111,139,151,300,373 # 20 GMT-5:00 [ America/Cayman America/Eirunepe America/Guayaquil America/Indiana/Knox America/Indiana/Marengo America/Indiana/Vevay America/Indianapolis America/Jamaica America/Panama America/Rio_Branco Etc/GMT+5 IET ] -d,-18000,3,1,-1,0,w,9,-1,1,0,w,60,1,96 # 21 GMT-5:00 Apr Sun>=1 0:00 Oct lastSun 0:00 1:00 [ America/Grand_Turk ] -d,-18000,3,1,-1,0,s,9,-1,1,0,s,60,1,103 # 22 GMT-5:00 Apr Sun>=1 0:00s Oct lastSun 0:00s 1:00 [ America/Havana ] -s,-18000,1,143 # 23 GMT-5:00 [ America/Port-au-Prince ] -d,-18000,3,1,-1,120,w,9,-1,1,120,w,60,11,87,110,114,118,131,133,134,135,140,164,291 # 24 GMT-5:00 Apr Sun>=1 2:00 Oct lastSun 2:00 1:00 [ America/Detroit America/Iqaluit America/Kentucky/Monticello America/Louisville America/Montreal America/Nassau America/New_York America/Nipigon America/Pangnirtung America/Thunder_Bay EST ] -s,-18000,1,116 # 25 GMT-5:00 [ America/Lima ] -s,-18000,1,68 # 26 GMT-5:00 [ America/Bogota ] -s,-14400,25,59,60,62,67,73,82,88,97,98,101,115,121,122,132,144,145,146,153,157,158,159,160,166,299,394 # 27 GMT-4:00 [ America/Anguilla America/Antigua America/Aruba America/Boa_Vista America/Caracas America/Curacao America/Dominica America/Grenada America/Guadeloupe America/Guyana America/La_Paz America/Manaus America/Martinique America/Montserrat America/Port_of_Spain America/Porto_Velho America/Puerto_Rico America/Santo_Domingo America/St_Kitts America/St_Lucia America/St_Thomas America/St_Vincent America/Tortola Etc/GMT+4 PRT ] -d,-14400,3,1,-1,1,w,9,-1,1,1,w,60,1,95 # 28 GMT-4:00 Apr Sun>=1 0:01 Oct lastSun 0:01 1:00 [ America/Goose_Bay ] -d,-14400,3,1,-1,120,w,9,-1,1,120,w,60,4,93,102,163,261 # 29 GMT-4:00 Apr Sun>=1 2:00 Oct lastSun 2:00 1:00 [ America/Glace_Bay America/Halifax America/Thule Atlantic/Bermuda ] -s,-14400,1,64 # 30 GMT-4:00 [ America/Barbados ] -d,-14400,9,8,-1,0,w,1,15,-1,0,w,60,1,81 # 31 GMT-4:00 Oct Sun>=8 0:00 Feb Sun>=15 0:00 1:00 [ America/Cuiaba ] -d,-14400,9,9,-1,0,w,2,9,-1,0,w,60,1,177 # 32 GMT-4:00 Oct Sun>=9 0:00 Mar Sun>=9 0:00 1:00 [ Antarctica/Palmer ] -d,-14400,9,9,-1,240,u,2,9,-1,180,u,60,1,152 # 33 GMT-4:00 Oct Sun>=9 4:00u Mar Sun>=9 3:00u 1:00 [ America/Santiago ] -d,-14400,8,1,-1,0,w,3,1,-1,0,w,60,1,63 # 34 GMT-4:00 Sep Sun>=1 0:00 Apr Sun>=1 0:00 1:00 [ America/Asuncion ] -d,-14400,8,1,-1,120,w,3,15,-1,120,w,60,1,270 # 35 GMT-4:00 Sep Sun>=1 2:00 Apr Sun>=15 2:00 1:00 [ Atlantic/Stanley ] -d,-12600,3,1,-1,1,w,9,-1,1,1,w,60,2,156,285 # 36 GMT-3:30 Apr Sun>=1 0:01 Oct lastSun 0:01 1:00 [ America/St_Johns CNT ] -s,-10800,14,2,65,70,74,75,79,92,112,119,124,141,149,178,298 # 37 GMT-3:00 [ AGT America/Belem America/Buenos_Aires America/Catamarca America/Cayenne America/Cordoba America/Fortaleza America/Jujuy America/Maceio America/Mendoza America/Paramaribo America/Recife Antarctica/Rothera Etc/GMT+3 ] -d,-10800,3,1,-1,120,w,9,-1,1,120,w,60,1,128 # 38 GMT-3:00 Apr Sun>=1 2:00 Oct lastSun 2:00 1:00 [ America/Miquelon ] -d,-10800,2,-1,1,60,u,9,-1,1,60,u,60,1,94 # 39 GMT-3:00 Mar lastSun 1:00u Oct lastSun 1:00u 1:00 [ America/Godthab ] -s,-10800,1,130 # 40 GMT-3:00 [ America/Montevideo ] -d,-10800,9,8,-1,0,w,1,15,-1,0,w,60,3,61,154,281 # 41 GMT-3:00 Oct Sun>=8 0:00 Feb Sun>=15 0:00 1:00 [ America/Araguaina America/Sao_Paulo BET ] -s,-7200,3,137,268,297 # 42 GMT-2:00 [ America/Noronha Atlantic/South_Georgia Etc/GMT+2 ] -s,-3600,2,263,293 # 43 GMT-1:00 [ Atlantic/Cape_Verde Etc/GMT+1 ] -d,-3600,2,-1,1,60,u,9,-1,1,60,u,60,2,155,260 # 44 GMT-1:00 Mar lastSun 1:00u Oct lastSun 1:00u 1:00 [ America/Scoresbysund Atlantic/Azores ] -s,0,22,5,10,12,13,18,20,21,25,36,45,49,50,52,53,83,267,269,292,319,320,371,436 # 45 GMT+0:00 [ Africa/Abidjan Africa/Bamako Africa/Banjul Africa/Bissau Africa/Casablanca Africa/Conakry Africa/Dakar Africa/El_Aaiun Africa/Lome Africa/Monrovia Africa/Nouakchott Africa/Ouagadougou Africa/Sao_Tome Africa/Timbuktu America/Danmarkshavn Atlantic/Reykjavik Atlantic/St_Helena Etc/GMT Etc/UCT Etc/UTC GMT UTC ] -s,0,1,26 # 46 GMT+0:00 [ Africa/Freetown ] -d,0,2,-1,1,60,u,9,-1,1,60,u,60,8,262,264,266,324,333,339,341,438 # 47 GMT+0:00 Mar lastSun 1:00u Oct lastSun 1:00u 1:00 [ Atlantic/Canary Atlantic/Faeroe Atlantic/Madeira Europe/Belfast Europe/Dublin Europe/Lisbon Europe/London WET ] -s,0,1,6 # 48 GMT+0:00 [ Africa/Accra ] -s,3600,13,8,11,15,24,33,34,35,37,40,47,48,51,305 # 49 GMT+1:00 [ Africa/Algiers Africa/Bangui Africa/Brazzaville Africa/Douala Africa/Kinshasa Africa/Lagos Africa/Libreville Africa/Luanda Africa/Malabo Africa/Ndjamena Africa/Niamey Africa/Porto-Novo Etc/GMT-1 ] -d,3600,2,-1,1,60,u,9,-1,1,60,u,60,33,19,181,265,289,321,322,325,326,327,328,330,332,334,340,342,343,344,346,348,349,350,352,354,355,357,359,361,363,364,365,367,368,370 # 50 GMT+1:00 Mar lastSun 1:00u Oct lastSun 1:00u 1:00 [ Africa/Ceuta Arctic/Longyearbyen Atlantic/Jan_Mayen ECT Europe/Amsterdam Europe/Andorra Europe/Belgrade Europe/Berlin Europe/Bratislava Europe/Brussels Europe/Budapest Europe/Copenhagen Europe/Gibraltar Europe/Ljubljana Europe/Luxembourg Europe/Madrid Europe/Malta Europe/Monaco Europe/Oslo Europe/Paris Europe/Prague Europe/Rome Europe/San_Marino Europe/Sarajevo Europe/Skopje Europe/Stockholm Europe/Tirane Europe/Vaduz Europe/Vatican Europe/Vienna Europe/Warsaw Europe/Zagreb Europe/Zurich ] -d,3600,2,-1,1,120,s,9,-1,1,120,s,60,2,284,387 # 51 GMT+1:00 Mar lastSun 2:00s Oct lastSun 2:00s 1:00 [ CET MET ] -s,3600,1,55 # 52 GMT+1:00 [ Africa/Tunis ] -d,3600,8,1,-1,120,w,3,1,-1,120,w,60,1,56 # 53 GMT+1:00 Sep Sun>=1 2:00 Apr Sun>=1 2:00 1:00 [ Africa/Windhoek ] -s,7200,13,14,16,27,28,32,38,39,41,42,43,54,283,311 # 54 GMT+2:00 [ Africa/Blantyre Africa/Bujumbura Africa/Gaborone Africa/Harare Africa/Kigali Africa/Lubumbashi Africa/Lusaka Africa/Maputo Africa/Maseru Africa/Mbabane Africa/Tripoli CAT Etc/GMT-2 ] -d,7200,3,1,0,0,w,9,1,0,0,w,60,1,200 # 55 GMT+2:00 Apr 1 0:00 Oct 1 0:00 1:00 [ Asia/Damascus ] -d,7200,3,15,-6,0,w,9,15,-6,0,w,60,1,205 # 56 GMT+2:00 Apr Fri>=15 0:00 Oct Fri>=15 0:00 1:00 [ Asia/Gaza ] -d,7200,3,-1,6,0,s,8,-1,5,1380,s,60,2,3,17 # 57 GMT+2:00 Apr lastFri 0:00s Sep lastThu 23:00s 1:00 [ ART Africa/Cairo ] -d,7200,2,28,0,60,w,9,3,0,60,w,60,1,212 # 58 GMT+2:00 Mar 28 1:00 Oct 3 1:00 1:00 [ Asia/Jerusalem ] -d,7200,2,-1,1,0,w,9,-1,1,0,w,60,1,193 # 59 GMT+2:00 Mar lastSun 0:00 Oct lastSun 0:00 1:00 [ Asia/Beirut ] -d,7200,2,-1,1,60,u,9,-1,1,60,u,60,15,227,290,323,329,331,335,336,338,351,356,358,360,362,366,369 # 60 GMT+2:00 Mar lastSun 1:00u Oct lastSun 1:00u 1:00 [ Asia/Nicosia EET Europe/Athens Europe/Bucharest Europe/Chisinau Europe/Helsinki Europe/Istanbul Europe/Kiev Europe/Riga Europe/Simferopol Europe/Sofia Europe/Tallinn Europe/Uzhgorod Europe/Vilnius Europe/Zaporozhye ] -d,7200,2,-1,1,120,s,9,-1,1,120,s,60,2,337,345 # 61 GMT+2:00 Mar lastSun 2:00s Oct lastSun 2:00s 1:00 [ Europe/Kaliningrad Europe/Minsk ] -d,7200,2,-1,5,0,s,8,-1,5,0,s,60,1,184 # 62 GMT+2:00 Mar lastThu 0:00s Sep lastThu 0:00s 1:00 [ Asia/Amman ] -s,7200,1,29 # 63 GMT+2:00 [ Africa/Johannesburg ] -s,10800,19,7,9,22,23,30,31,44,46,179,182,190,221,234,237,288,312,375,379,384 # 64 GMT+3:00 [ Africa/Addis_Ababa Africa/Asmera Africa/Dar_es_Salaam Africa/Djibouti Africa/Kampala Africa/Khartoum Africa/Mogadishu Africa/Nairobi Antarctica/Syowa Asia/Aden Asia/Bahrain Asia/Kuwait Asia/Qatar Asia/Riyadh EAT Etc/GMT-3 Indian/Antananarivo Indian/Comoro Indian/Mayotte ] -d,10800,3,1,0,180,s,9,1,0,180,s,60,1,189 # 65 GMT+3:00 Apr 1 3:00s Oct 1 3:00s 1:00 [ Asia/Baghdad ] -d,10800,2,-1,1,120,s,9,-1,1,120,s,60,1,347 # 66 GMT+3:00 Mar lastSun 2:00s Oct lastSun 2:00s 1:00 [ Europe/Moscow ] -s,11224,3,238,239,240 # 67 GMT+3:07:04 [ Asia/Riyadh87 Asia/Riyadh88 Asia/Riyadh89 ] -d,12600,2,22,0,0,w,8,22,0,0,w,60,1,250 # 68 GMT+3:30 Mar 22 0:00 Sep 22 0:00 1:00 [ Asia/Tehran ] -s,14400,6,203,226,313,381,383,385 # 69 GMT+4:00 [ Asia/Dubai Asia/Muscat Etc/GMT-4 Indian/Mahe Indian/Mauritius Indian/Reunion ] -d,14400,2,-1,1,0,w,9,-1,1,0,w,60,1,249 # 70 GMT+4:00 Mar lastSun 0:00 Oct lastSun 0:00 1:00 [ Asia/Tbilisi ] -d,14400,2,-1,1,60,w,9,-1,1,60,w,60,1,191 # 71 GMT+4:00 Mar lastSun 1:00 Oct lastSun 1:00 1:00 [ Asia/Baku ] -d,14400,2,-1,1,120,s,9,-1,1,120,s,60,5,186,230,259,353,390 # 72 GMT+4:00 Mar lastSun 2:00s Oct lastSun 2:00s 1:00 [ Asia/Aqtau Asia/Oral Asia/Yerevan Europe/Samara NET ] -s,16200,1,213 # 73 GMT+4:30 [ Asia/Kabul ] -s,18000,7,188,204,243,248,314,380,382 # 74 GMT+5:00 [ Asia/Ashgabat Asia/Dushanbe Asia/Samarkand Asia/Tashkent Etc/GMT-5 Indian/Kerguelen Indian/Maldives ] -s,18000,2,215,392 # 75 GMT+5:00 [ Asia/Karachi PLT ] -d,18000,2,-1,1,120,s,9,-1,1,120,s,60,2,187,258 # 76 GMT+5:00 Mar lastSun 2:00s Oct lastSun 2:00s 1:00 [ Asia/Aqtobe Asia/Yekaterinburg ] -d,18000,2,-1,1,150,w,9,-1,1,150,w,60,1,194 # 77 GMT+5:00 Mar lastSun 2:30 Oct lastSun 2:30 1:00 [ Asia/Bishkek ] -s,19800,2,196,374 # 78 GMT+5:30 [ Asia/Calcutta IST ] -s,20700,1,217 # 79 GMT+5:45 [ Asia/Katmandu ] -s,21600,8,175,180,199,201,251,282,315,376 # 80 GMT+6:00 [ Antarctica/Mawson Antarctica/Vostok Asia/Colombo Asia/Dhaka Asia/Thimphu BST Etc/GMT-6 Indian/Chagos ] -d,21600,2,-1,1,120,s,9,-1,1,120,s,60,4,183,228,229,235 # 81 GMT+6:00 Mar lastSun 2:00s Oct lastSun 2:00s 1:00 [ Asia/Almaty Asia/Novosibirsk Asia/Omsk Asia/Qyzylorda ] -s,23400,2,236,378 # 82 GMT+6:30 [ Asia/Rangoon Indian/Cocos ] -s,25200,10,173,192,210,231,232,241,255,316,377,437 # 83 GMT+7:00 [ Antarctica/Davis Asia/Bangkok Asia/Jakarta Asia/Phnom_Penh Asia/Pontianak Asia/Saigon Asia/Vientiane Etc/GMT-7 Indian/Christmas VST ] -s,25200,1,208 # 84 GMT+7:00 [ Asia/Hovd ] -d,25200,2,-1,1,120,s,9,-1,1,120,s,60,1,218 # 85 GMT+7:00 Mar lastSun 2:00s Oct lastSun 2:00s 1:00 [ Asia/Krasnoyarsk ] -s,28800,8,172,195,219,220,224,246,279,317 # 86 GMT+8:00 [ Antarctica/Casey Asia/Brunei Asia/Kuala_Lumpur Asia/Kuching Asia/Makassar Asia/Singapore Australia/Perth Etc/GMT-8 ] -s,28800,1,253 # 87 GMT+8:00 [ Asia/Ulaanbaatar ] -s,28800,7,198,206,216,222,245,254,287 # 88 GMT+8:00 [ Asia/Chongqing Asia/Harbin Asia/Kashgar Asia/Macau Asia/Shanghai Asia/Urumqi CTT ] -s,28800,1,247 # 89 GMT+8:00 [ Asia/Taipei ] -s,28800,1,225 # 90 GMT+8:00 [ Asia/Manila ] -d,28800,2,-1,1,120,s,9,-1,1,120,s,60,1,209 # 91 GMT+8:00 Mar lastSun 2:00s Oct lastSun 2:00s 1:00 [ Asia/Irkutsk ] -s,28800,1,207 # 92 GMT+8:00 [ Asia/Hong_Kong ] -s,32400,7,202,211,233,252,318,386,422 # 93 GMT+9:00 [ Asia/Dili Asia/Jayapura Asia/Pyongyang Asia/Tokyo Etc/GMT-9 JST Pacific/Palau ] -s,32400,1,197 # 94 GMT+9:00 [ Asia/Choibalsan ] -d,32400,2,-1,1,120,s,9,-1,1,120,s,60,1,257 # 95 GMT+9:00 Mar lastSun 2:00s Oct lastSun 2:00s 1:00 [ Asia/Yakutsk ] -s,32400,1,244 # 96 GMT+9:00 [ Asia/Seoul ] -s,34200,2,0,274 # 97 GMT+9:30 [ ACT Australia/Darwin ] -d,34200,9,-1,1,120,s,2,-1,1,120,s,60,2,271,273 # 98 GMT+9:30 Oct lastSun 2:00s Mar lastSun 2:00s 1:00 [ Australia/Adelaide Australia/Broken_Hill ] -s,36000,7,174,306,408,425,427,431,434 # 99 GMT+10:00 [ Antarctica/DumontDUrville Etc/GMT-10 Pacific/Guam Pacific/Port_Moresby Pacific/Saipan Pacific/Truk Pacific/Yap ] -d,36000,2,-1,1,120,s,9,-1,1,120,s,60,2,242,256 # 100 GMT+10:00 Mar lastSun 2:00s Oct lastSun 2:00s 1:00 [ Asia/Sakhalin Asia/Vladivostok ] -d,36000,9,-1,1,120,s,2,-1,1,120,s,60,3,1,278,280 # 101 GMT+10:00 Oct lastSun 2:00s Mar lastSun 2:00s 1:00 [ AET Australia/Melbourne Australia/Sydney ] -s,36000,2,272,276 # 102 GMT+10:00 [ Australia/Brisbane Australia/Lindeman ] -d,36000,9,1,-1,120,s,2,-1,1,120,s,60,1,275 # 103 GMT+10:00 Oct Sun>=1 2:00s Mar lastSun 2:00s 1:00 [ Australia/Hobart ] -d,37800,9,-1,1,120,w,2,-1,1,120,w,30,1,277 # 104 GMT+10:30 Oct lastSun 2:00 Mar lastSun 2:00 0:30 [ Australia/Lord_Howe ] -s,39600,5,307,407,412,424,435 # 105 GMT+11 [ Etc/GMT-11 Pacific/Guadalcanal Pacific/Kosrae Pacific/Ponape SST ] -s,39600,1,420 # 106 GMT+11:00 [ Pacific/Noumea ] -d,39600,2,-1,1,120,s,9,-1,1,120,s,60,1,223 # 107 GMT+11:00 Mar lastSun 2:00s Oct lastSun 2:00s 1:00 [ Asia/Magadan ] -s,39600,1,400 # 108 GMT+11:00 [ Pacific/Efate ] -s,41400,1,419 # 109 GMT+11:30 [ Pacific/Norfolk ] -s,43200,8,308,404,413,414,417,429,432,433 # 110 GMT+12 [ Etc/GMT-12 Pacific/Funafuti Pacific/Kwajalein Pacific/Majuro Pacific/Nauru Pacific/Tarawa Pacific/Wake Pacific/Wallis ] -d,43200,2,-1,1,120,s,9,-1,1,120,s,60,2,185,214 # 111 GMT+12:00 Mar lastSun 2:00s Oct lastSun 2:00s 1:00 [ Asia/Anadyr Asia/Kamchatka ] -s,43200,1,403 # 112 GMT+12:00 [ Pacific/Fiji ] -d,43200,9,1,-1,120,s,2,15,-1,120,s,60,3,176,391,397 # 113 GMT+12:00 Oct Sun>=1 2:00s Mar Sun>=15 2:00s 1:00 [ Antarctica/McMurdo NST Pacific/Auckland ] -d,45900,9,1,-1,165,s,2,15,-1,165,s,60,1,398 # 114 GMT+12:45 Oct Sun>=1 2:45s Mar Sun>=15 2:45s 1:00 [ Pacific/Chatham ] -s,46800,2,309,401 # 115 GMT+13 [ Etc/GMT-13 Pacific/Enderbury ] -s,46800,1,430 # 116 GMT+13:00 [ Pacific/Tongatapu ] -s,50400,2,310,411 # 117 GMT+14 [ Etc/GMT-14 Pacific/Kiritimati ] -end - -#--- Offset INDEX --- -#| gmt_offset,default_id,id_count,id_list -39 # index by offset entries to follow --43200,296,1,296 # -12:00 d=Etc/GMT+12 Etc/GMT+12 --39600,396,6,295,388,396,416,418,421 # -11:00 d=Pacific/Apia Etc/GMT+11 MIT Pacific/Apia Pacific/Midway Pacific/Niue Pacific/Pago_Pago --36000,409,8,57,294,372,402,409,410,426,428 # -10:00 d=Pacific/Honolulu America/Adak Etc/GMT+10 HST Pacific/Fakaofo Pacific/Honolulu Pacific/Johnston Pacific/Rarotonga Pacific/Tahiti --34200,415,1,415 # -9:30 d=Pacific/Marquesas Pacific/Marquesas --32400,58,7,4,58,113,136,170,304,406 # -9:00 d=America/Anchorage AST America/Anchorage America/Juneau America/Nome America/Yakutat Etc/GMT+9 Pacific/Gambier --28800,117,8,84,117,165,167,168,303,395,423 # -8:00 d=America/Los_Angeles America/Dawson America/Los_Angeles America/Tijuana America/Vancouver America/Whitehorse Etc/GMT+8 PST Pacific/Pitcairn --25200,86,14,69,71,78,85,86,89,104,109,123,142,171,302,389,393 # -7:00 d=America/Denver America/Boise America/Cambridge_Bay America/Chihuahua America/Dawson_Creek America/Denver America/Edmonton America/Hermosillo America/Inuvik America/Mazatlan America/Phoenix America/Yellowknife Etc/GMT+7 MST PNT --21600,77,22,66,72,77,80,91,99,120,125,126,127,129,138,147,148,150,161,162,169,286,301,399,405 # -6:00 d=America/Chicago America/Belize America/Cancun America/Chicago America/Costa_Rica America/El_Salvador America/Guatemala America/Managua America/Menominee America/Merida America/Mexico_City America/Monterrey America/North_Dakota/Center America/Rainy_River America/Rankin_Inlet America/Regina America/Swift_Current America/Tegucigalpa America/Winnipeg CST Etc/GMT+6 Pacific/Easter Pacific/Galapagos --18000,134,28,68,76,87,90,96,100,103,105,106,107,108,110,111,114,116,118,131,133,134,135,139,140,143,151,164,291,300,373 # -5:00 d=America/New_York America/Bogota America/Cayman America/Detroit America/Eirunepe America/Grand_Turk America/Guayaquil America/Havana America/Indiana/Knox America/Indiana/Marengo America/Indiana/Vevay America/Indianapolis America/Iqaluit America/Jamaica America/Kentucky/Monticello America/Lima America/Louisville America/Montreal America/Nassau America/New_York America/Nipigon America/Panama America/Pangnirtung America/Port-au-Prince America/Rio_Branco America/Thunder_Bay EST Etc/GMT+5 IET --14400,146,36,59,60,62,63,64,67,73,81,82,88,93,95,97,98,101,102,115,121,122,132,144,145,146,152,153,157,158,159,160,163,166,177,261,270,299,394 # -4:00 d=America/Puerto_Rico America/Anguilla America/Antigua America/Aruba America/Asuncion America/Barbados America/Boa_Vista America/Caracas America/Cuiaba America/Curacao America/Dominica America/Glace_Bay America/Goose_Bay America/Grenada America/Guadeloupe America/Guyana America/Halifax America/La_Paz America/Manaus America/Martinique America/Montserrat America/Port_of_Spain America/Porto_Velho America/Puerto_Rico America/Santiago America/Santo_Domingo America/St_Kitts America/St_Lucia America/St_Thomas America/St_Vincent America/Thule America/Tortola Antarctica/Palmer Atlantic/Bermuda Atlantic/Stanley Etc/GMT+4 PRT --12600,156,2,156,285 # -3:30 d=America/St_Johns America/St_Johns CNT --10800,70,20,2,61,65,70,74,75,79,92,94,112,119,124,128,130,141,149,154,178,281,298 # -3:00 d=America/Buenos_Aires AGT America/Araguaina America/Belem America/Buenos_Aires America/Catamarca America/Cayenne America/Cordoba America/Fortaleza America/Godthab America/Jujuy America/Maceio America/Mendoza America/Miquelon America/Montevideo America/Paramaribo America/Recife America/Sao_Paulo Antarctica/Rothera BET Etc/GMT+3 --7200,137,3,137,268,297 # -2:00 d=America/Noronha America/Noronha Atlantic/South_Georgia Etc/GMT+2 --3600,260,4,155,260,263,293 # -1:00 d=Atlantic/Azores America/Scoresbysund Atlantic/Azores Atlantic/Cape_Verde Etc/GMT+1 -0,371,32,5,6,10,12,13,18,20,21,25,26,36,45,49,50,52,53,83,262,264,266,267,269,292,319,320,324,333,339,341,371,436,438 # +0:00 d=GMT Africa/Abidjan Africa/Accra Africa/Bamako Africa/Banjul Africa/Bissau Africa/Casablanca Africa/Conakry Africa/Dakar Africa/El_Aaiun Africa/Freetown Africa/Lome Africa/Monrovia Africa/Nouakchott Africa/Ouagadougou Africa/Sao_Tome Africa/Timbuktu America/Danmarkshavn Atlantic/Canary Atlantic/Faeroe Atlantic/Madeira Atlantic/Reykjavik Atlantic/St_Helena Etc/GMT Etc/UCT Etc/UTC Europe/Belfast Europe/Dublin Europe/Lisbon Europe/London GMT UTC WET -3600,349,50,8,11,15,19,24,33,34,35,37,40,47,48,51,55,56,181,265,284,289,305,321,322,325,326,327,328,330,332,334,340,342,343,344,346,348,349,350,352,354,355,357,359,361,363,364,365,367,368,370,387 # +1:00 d=Europe/Paris Africa/Algiers Africa/Bangui Africa/Brazzaville Africa/Ceuta Africa/Douala Africa/Kinshasa Africa/Lagos Africa/Libreville Africa/Luanda Africa/Malabo Africa/Ndjamena Africa/Niamey Africa/Porto-Novo Africa/Tunis Africa/Windhoek Arctic/Longyearbyen Atlantic/Jan_Mayen CET ECT Etc/GMT-1 Europe/Amsterdam Europe/Andorra Europe/Belgrade Europe/Berlin Europe/Bratislava Europe/Brussels Europe/Budapest Europe/Copenhagen Europe/Gibraltar Europe/Ljubljana Europe/Luxembourg Europe/Madrid Europe/Malta Europe/Monaco Europe/Oslo Europe/Paris Europe/Prague Europe/Rome Europe/San_Marino Europe/Sarajevo Europe/Skopje Europe/Stockholm Europe/Tirane Europe/Vaduz Europe/Vatican Europe/Vienna Europe/Warsaw Europe/Zagreb Europe/Zurich MET -7200,17,38,3,14,16,17,27,28,29,32,38,39,41,42,43,54,184,193,200,205,212,227,283,290,311,323,329,331,335,336,337,338,345,351,356,358,360,362,366,369 # +2:00 d=Africa/Cairo ART Africa/Blantyre Africa/Bujumbura Africa/Cairo Africa/Gaborone Africa/Harare Africa/Johannesburg Africa/Kigali Africa/Lubumbashi Africa/Lusaka Africa/Maputo Africa/Maseru Africa/Mbabane Africa/Tripoli Asia/Amman Asia/Beirut Asia/Damascus Asia/Gaza Asia/Jerusalem Asia/Nicosia CAT EET Etc/GMT-2 Europe/Athens Europe/Bucharest Europe/Chisinau Europe/Helsinki Europe/Istanbul Europe/Kaliningrad Europe/Kiev Europe/Minsk Europe/Riga Europe/Simferopol Europe/Sofia Europe/Tallinn Europe/Uzhgorod Europe/Vilnius Europe/Zaporozhye -10800,7,21,7,9,22,23,30,31,44,46,179,182,189,190,221,234,237,288,312,347,375,379,384 # +3:00 d=Africa/Addis_Ababa Africa/Addis_Ababa Africa/Asmera Africa/Dar_es_Salaam Africa/Djibouti Africa/Kampala Africa/Khartoum Africa/Mogadishu Africa/Nairobi Antarctica/Syowa Asia/Aden Asia/Baghdad Asia/Bahrain Asia/Kuwait Asia/Qatar Asia/Riyadh EAT Etc/GMT-3 Europe/Moscow Indian/Antananarivo Indian/Comoro Indian/Mayotte -11224,240,3,238,239,240 # +3:07:04 d=Asia/Riyadh89 Asia/Riyadh87 Asia/Riyadh88 Asia/Riyadh89 -12600,250,1,250 # +3:30 d=Asia/Tehran Asia/Tehran -14400,259,13,186,191,203,226,230,249,259,313,353,381,383,385,390 # +4:00 d=Asia/Yerevan Asia/Aqtau Asia/Baku Asia/Dubai Asia/Muscat Asia/Oral Asia/Tbilisi Asia/Yerevan Etc/GMT-4 Europe/Samara Indian/Mahe Indian/Mauritius Indian/Reunion NET -16200,213,1,213 # +4:30 d=Asia/Kabul Asia/Kabul -18000,215,12,187,188,194,204,215,243,248,258,314,380,382,392 # +5:00 d=Asia/Karachi Asia/Aqtobe Asia/Ashgabat Asia/Bishkek Asia/Dushanbe Asia/Karachi Asia/Samarkand Asia/Tashkent Asia/Yekaterinburg Etc/GMT-5 Indian/Kerguelen Indian/Maldives PLT -19800,196,2,196,374 # +5:30 d=Asia/Calcutta Asia/Calcutta IST -20700,217,1,217 # +5:45 d=Asia/Katmandu Asia/Katmandu -21600,201,12,175,180,183,199,201,228,229,235,251,282,315,376 # +6:00 d=Asia/Dhaka Antarctica/Mawson Antarctica/Vostok Asia/Almaty Asia/Colombo Asia/Dhaka Asia/Novosibirsk Asia/Omsk Asia/Qyzylorda Asia/Thimphu BST Etc/GMT-6 Indian/Chagos -23400,236,2,236,378 # +6:30 d=Asia/Rangoon Asia/Rangoon Indian/Cocos -25200,241,12,173,192,208,210,218,231,232,241,255,316,377,437 # +7:00 d=Asia/Saigon Antarctica/Davis Asia/Bangkok Asia/Hovd Asia/Jakarta Asia/Krasnoyarsk Asia/Phnom_Penh Asia/Pontianak Asia/Saigon Asia/Vientiane Etc/GMT-7 Indian/Christmas VST -28800,245,20,172,195,198,206,207,209,216,219,220,222,224,225,245,246,247,253,254,279,287,317 # +8:00 d=Asia/Shanghai Antarctica/Casey Asia/Brunei Asia/Chongqing Asia/Harbin Asia/Hong_Kong Asia/Irkutsk Asia/Kashgar Asia/Kuala_Lumpur Asia/Kuching Asia/Macau Asia/Makassar Asia/Manila Asia/Shanghai Asia/Singapore Asia/Taipei Asia/Ulaanbaatar Asia/Urumqi Australia/Perth CTT Etc/GMT-8 -32400,252,10,197,202,211,233,244,252,257,318,386,422 # +9:00 d=Asia/Tokyo Asia/Choibalsan Asia/Dili Asia/Jayapura Asia/Pyongyang Asia/Seoul Asia/Tokyo Asia/Yakutsk Etc/GMT-9 JST Pacific/Palau -34200,274,4,0,271,273,274 # +9:30 d=Australia/Darwin ACT Australia/Adelaide Australia/Broken_Hill Australia/Darwin -36000,280,15,1,174,242,256,272,275,276,278,280,306,408,425,427,431,434 # +10:00 d=Australia/Sydney AET Antarctica/DumontDUrville Asia/Sakhalin Asia/Vladivostok Australia/Brisbane Australia/Hobart Australia/Lindeman Australia/Melbourne Australia/Sydney Etc/GMT-10 Pacific/Guam Pacific/Port_Moresby Pacific/Saipan Pacific/Truk Pacific/Yap -37800,277,1,277 # +10:30 d=Australia/Lord_Howe Australia/Lord_Howe -39600,407,8,223,307,400,407,412,420,424,435 # +11:00 d=Pacific/Guadalcanal Asia/Magadan Etc/GMT-11 Pacific/Efate Pacific/Guadalcanal Pacific/Kosrae Pacific/Noumea Pacific/Ponape SST -41400,419,1,419 # +11:30 d=Pacific/Norfolk Pacific/Norfolk -43200,397,14,176,185,214,308,391,397,403,404,413,414,417,429,432,433 # +12:00 d=Pacific/Auckland Antarctica/McMurdo Asia/Anadyr Asia/Kamchatka Etc/GMT-12 NST Pacific/Auckland Pacific/Fiji Pacific/Funafuti Pacific/Kwajalein Pacific/Majuro Pacific/Nauru Pacific/Tarawa Pacific/Wake Pacific/Wallis -45900,398,1,398 # +12:45 d=Pacific/Chatham Pacific/Chatham -46800,401,3,309,401,430 # +13:00 d=Pacific/Enderbury Etc/GMT-13 Pacific/Enderbury Pacific/Tongatapu -50400,411,2,310,411 # +14:00 d=Pacific/Kiritimati Etc/GMT-14 Pacific/Kiritimati -end - -#--- Country INDEX --- -#| country_int_code,id_count,id_list -238 # index by country entries to follow -0,38,238,239,240,284,290,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,371,387,436,438 # (None) Asia/Riyadh87 Asia/Riyadh88 Asia/Riyadh89 CET EET Etc/GMT Etc/GMT+1 Etc/GMT+10 Etc/GMT+11 Etc/GMT+12 Etc/GMT+2 Etc/GMT+3 Etc/GMT+4 Etc/GMT+5 Etc/GMT+6 Etc/GMT+7 Etc/GMT+8 Etc/GMT+9 Etc/GMT-1 Etc/GMT-10 Etc/GMT-11 Etc/GMT-12 Etc/GMT-13 Etc/GMT-14 Etc/GMT-2 Etc/GMT-3 Etc/GMT-4 Etc/GMT-5 Etc/GMT-6 Etc/GMT-7 Etc/GMT-8 Etc/GMT-9 Etc/UCT Etc/UTC GMT MET UTC WET -3,1,322 # AD (Andorra) Europe/Andorra -4,1,203 # AE (United Arab Emirates) Asia/Dubai -5,1,213 # AF (Afghanistan) Asia/Kabul -6,1,60 # AG (Antigua & Barbuda) America/Antigua -8,1,59 # AI (Anguilla) America/Anguilla -11,1,361 # AL (Albania) Europe/Tirane -12,2,259,390 # AM (Armenia) Asia/Yerevan NET -13,1,82 # AN (Netherlands Antilles) America/Curacao -14,1,37 # AO (Angola) Africa/Luanda -16,9,172,173,174,175,176,177,178,179,180 # AQ (Antarctica) Antarctica/Casey Antarctica/Davis Antarctica/DumontDUrville Antarctica/Mawson Antarctica/McMurdo Antarctica/Palmer Antarctica/Rothera Antarctica/Syowa Antarctica/Vostok -17,6,2,70,74,79,112,124 # AR (Argentina) AGT America/Buenos_Aires America/Catamarca America/Cordoba America/Jujuy America/Mendoza -18,1,421 # AS (Samoa (American)) Pacific/Pago_Pago -19,1,365 # AT (Austria) Europe/Vienna -20,12,0,1,271,272,273,274,275,276,277,278,279,280 # AU (Australia) ACT AET Australia/Adelaide Australia/Brisbane Australia/Broken_Hill Australia/Darwin Australia/Hobart Australia/Lindeman Australia/Lord_Howe Australia/Melbourne Australia/Perth Australia/Sydney -22,1,62 # AW (Aruba) America/Aruba -25,1,191 # AZ (Azerbaijan) Asia/Baku -32,1,355 # BA (Bosnia & Herzegovina) Europe/Sarajevo -33,1,64 # BB (Barbados) America/Barbados -35,2,201,282 # BD (Bangladesh) Asia/Dhaka BST -36,1,328 # BE (Belgium) Europe/Brussels -37,1,50 # BF (Burkina Faso) Africa/Ouagadougou -38,1,358 # BG (Bulgaria) Europe/Sofia -39,1,190 # BH (Bahrain) Asia/Bahrain -40,1,16 # BI (Burundi) Africa/Bujumbura -41,1,51 # BJ (Benin) Africa/Porto-Novo -44,1,261 # BM (Bermuda) Atlantic/Bermuda -45,1,195 # BN (Brunei) Asia/Brunei -46,1,115 # BO (Bolivia) America/La_Paz -49,14,61,65,67,81,90,92,119,121,137,145,149,151,154,281 # BR (Brazil) America/Araguaina America/Belem America/Boa_Vista America/Cuiaba America/Eirunepe America/Fortaleza America/Maceio America/Manaus America/Noronha America/Porto_Velho America/Recife America/Rio_Branco America/Sao_Paulo BET -50,1,133 # BS (Bahamas) America/Nassau -51,1,251 # BT (Bhutan) Asia/Thimphu -54,1,27 # BW (Botswana) Africa/Gaborone -56,1,345 # BY (Belarus) Europe/Minsk -57,1,66 # BZ (Belize) America/Belize -64,23,71,84,85,89,93,95,102,109,110,131,135,140,147,148,150,156,161,164,167,168,169,171,285 # CA (Canada) America/Cambridge_Bay America/Dawson America/Dawson_Creek America/Edmonton America/Glace_Bay America/Goose_Bay America/Halifax America/Inuvik America/Iqaluit America/Montreal America/Nipigon America/Pangnirtung America/Rainy_River America/Rankin_Inlet America/Regina America/St_Johns America/Swift_Current America/Thunder_Bay America/Vancouver America/Whitehorse America/Winnipeg America/Yellowknife CNT -66,1,378 # CC (Cocos (Keeling) Islands) Indian/Cocos -67,2,33,38 # CD (Congo (Dem. Rep.)) Africa/Kinshasa Africa/Lubumbashi -69,1,11 # CF (Central African Rep.) Africa/Bangui -70,1,15 # CG (Congo (Rep.)) Africa/Brazzaville -71,1,370 # CH (Switzerland) Europe/Zurich -72,1,5 # CI (Cote d'Ivoire) Africa/Abidjan -74,1,426 # CK (Cook Islands) Pacific/Rarotonga -75,2,152,399 # CL (Chile) America/Santiago Pacific/Easter -76,1,24 # CM (Cameroon) Africa/Douala -77,6,198,206,216,245,254,287 # CN (China) Asia/Chongqing Asia/Harbin Asia/Kashgar Asia/Shanghai Asia/Urumqi CTT -78,1,68 # CO (Colombia) America/Bogota -81,1,80 # CR (Costa Rica) America/Costa_Rica -84,1,103 # CU (Cuba) America/Havana -85,1,263 # CV (Cape Verde) Atlantic/Cape_Verde -87,1,377 # CX (Christmas Island) Indian/Christmas -88,1,227 # CY (Cyprus) Asia/Nicosia -89,1,350 # CZ (Czech Republic) Europe/Prague -100,1,326 # DE (Germany) Europe/Berlin -105,1,23 # DJ (Djibouti) Africa/Djibouti -106,1,332 # DK (Denmark) Europe/Copenhagen -108,1,88 # DM (Dominica) America/Dominica -110,1,153 # DO (Dominican Republic) America/Santo_Domingo -121,1,8 # DZ (Algeria) Africa/Algiers -130,2,100,405 # EC (Ecuador) America/Guayaquil Pacific/Galapagos -132,1,360 # EE (Estonia) Europe/Tallinn -134,2,3,17 # EG (Egypt) ART Africa/Cairo -135,1,25 # EH (Western Sahara) Africa/El_Aaiun -145,1,9 # ER (Eritrea) Africa/Asmera -146,3,19,262,343 # ES (Spain) Africa/Ceuta Atlantic/Canary Europe/Madrid -147,2,7,288 # ET (Ethiopia) Africa/Addis_Ababa EAT -168,1,335 # FI (Finland) Europe/Helsinki -169,1,403 # FJ (Fiji) Pacific/Fiji -170,1,270 # FK (Falkland Islands) Atlantic/Stanley -172,4,412,424,431,434 # FM (Micronesia) Pacific/Kosrae Pacific/Ponape Pacific/Truk Pacific/Yap -174,1,264 # FO (Faeroe Islands) Atlantic/Faeroe -177,2,289,349 # FR (France) ECT Europe/Paris -192,1,35 # GA (Gabon) Africa/Libreville -193,2,324,341 # GB (Britain (UK)) Europe/Belfast Europe/London -195,1,97 # GD (Grenada) America/Grenada -196,1,249 # GE (Georgia) Asia/Tbilisi -197,1,75 # GF (French Guiana) America/Cayenne -199,1,6 # GH (Ghana) Africa/Accra -200,1,334 # GI (Gibraltar) Europe/Gibraltar -203,4,83,94,155,163 # GL (Greenland) America/Danmarkshavn America/Godthab America/Scoresbysund America/Thule -204,1,12 # GM (Gambia) Africa/Banjul -205,1,20 # GN (Guinea) Africa/Conakry -207,1,98 # GP (Guadeloupe) America/Guadeloupe -208,1,40 # GQ (Equatorial Guinea) Africa/Malabo -209,1,323 # GR (Greece) Europe/Athens -210,1,268 # GS (South Georgia & the South Sandwich Islands) Atlantic/South_Georgia -211,1,99 # GT (Guatemala) America/Guatemala -212,1,408 # GU (Guam) Pacific/Guam -214,1,13 # GW (Guinea-Bissau) Africa/Bissau -216,1,101 # GY (Guyana) America/Guyana -234,1,207 # HK (Hong Kong) Asia/Hong_Kong -237,1,162 # HN (Honduras) America/Tegucigalpa -241,1,368 # HR (Croatia) Europe/Zagreb -243,1,143 # HT (Haiti) America/Port-au-Prince -244,1,330 # HU (Hungary) Europe/Budapest -259,4,210,211,224,232 # ID (Indonesia) Asia/Jakarta Asia/Jayapura Asia/Makassar Asia/Pontianak -260,1,333 # IE (Ireland) Europe/Dublin -267,1,212 # IL (Israel) Asia/Jerusalem -269,2,196,374 # IN (India) Asia/Calcutta IST -270,1,376 # IO (British Indian Ocean Territory) Indian/Chagos -272,1,189 # IQ (Iraq) Asia/Baghdad -273,1,250 # IR (Iran) Asia/Tehran -274,1,267 # IS (Iceland) Atlantic/Reykjavik -275,1,352 # IT (Italy) Europe/Rome -300,1,111 # JM (Jamaica) America/Jamaica -302,1,184 # JO (Jordan) Asia/Amman -303,2,252,386 # JP (Japan) Asia/Tokyo JST -324,1,46 # KE (Kenya) Africa/Nairobi -326,1,194 # KG (Kyrgyzstan) Asia/Bishkek -327,1,231 # KH (Cambodia) Asia/Phnom_Penh -328,3,401,411,429 # KI (Kiribati) Pacific/Enderbury Pacific/Kiritimati Pacific/Tarawa -332,1,379 # KM (Comoros) Indian/Comoro -333,1,157 # KN (St Kitts & Nevis) America/St_Kitts -335,1,233 # KP (Korea (North)) Asia/Pyongyang -337,1,244 # KR (Korea (South)) Asia/Seoul -342,1,221 # KW (Kuwait) Asia/Kuwait -344,1,76 # KY (Cayman Islands) America/Cayman -345,5,183,186,187,230,235 # KZ (Kazakhstan) Asia/Almaty Asia/Aqtau Asia/Aqtobe Asia/Oral Asia/Qyzylorda -352,1,255 # LA (Laos) Asia/Vientiane -353,1,193 # LB (Lebanon) Asia/Beirut -354,1,158 # LC (St Lucia) America/St_Lucia -360,1,363 # LI (Liechtenstein) Europe/Vaduz -362,1,199 # LK (Sri Lanka) Asia/Colombo -369,1,45 # LR (Liberia) Africa/Monrovia -370,1,42 # LS (Lesotho) Africa/Maseru -371,1,366 # LT (Lithuania) Europe/Vilnius -372,1,342 # LU (Luxembourg) Europe/Luxembourg -373,1,351 # LV (Latvia) Europe/Riga -376,1,54 # LY (Libya) Africa/Tripoli -384,1,18 # MA (Morocco) Africa/Casablanca -386,1,346 # MC (Monaco) Europe/Monaco -387,1,331 # MD (Moldova) Europe/Chisinau -390,1,375 # MG (Madagascar) Indian/Antananarivo -391,2,413,414 # MH (Marshall Islands) Pacific/Kwajalein Pacific/Majuro -394,1,357 # MK (Macedonia) Europe/Skopje -395,2,10,53 # ML (Mali) Africa/Bamako Africa/Timbuktu -396,1,236 # MM (Myanmar (Burma)) Asia/Rangoon -397,3,197,208,253 # MN (Mongolia) Asia/Choibalsan Asia/Hovd Asia/Ulaanbaatar -398,1,222 # MO (Macau) Asia/Macau -399,1,427 # MP (Northern Mariana Islands) Pacific/Saipan -400,1,122 # MQ (Martinique) America/Martinique -401,1,49 # MR (Mauritania) Africa/Nouakchott -402,1,132 # MS (Montserrat) America/Montserrat -403,1,344 # MT (Malta) Europe/Malta -404,1,383 # MU (Mauritius) Indian/Mauritius -405,1,382 # MV (Maldives) Indian/Maldives -406,1,14 # MW (Malawi) Africa/Blantyre -407,8,72,78,104,123,126,127,129,165 # MX (Mexico) America/Cancun America/Chihuahua America/Hermosillo America/Mazatlan America/Merida America/Mexico_City America/Monterrey America/Tijuana -408,2,219,220 # MY (Malaysia) Asia/Kuala_Lumpur Asia/Kuching -409,1,41 # MZ (Mozambique) Africa/Maputo -416,1,56 # NA (Namibia) Africa/Windhoek -418,1,420 # NC (New Caledonia) Pacific/Noumea -420,1,48 # NE (Niger) Africa/Niamey -421,1,419 # NF (Norfolk Island) Pacific/Norfolk -422,1,34 # NG (Nigeria) Africa/Lagos -424,1,120 # NI (Nicaragua) America/Managua -427,1,321 # NL (Netherlands) Europe/Amsterdam -430,1,348 # NO (Norway) Europe/Oslo -431,1,217 # NP (Nepal) Asia/Katmandu -433,1,417 # NR (Nauru) Pacific/Nauru -436,1,418 # NU (Niue) Pacific/Niue -441,3,391,397,398 # NZ (New Zealand) NST Pacific/Auckland Pacific/Chatham -460,1,226 # OM (Oman) Asia/Muscat -480,1,139 # PA (Panama) America/Panama -484,1,116 # PE (Peru) America/Lima -485,3,406,415,428 # PF (French Polynesia) Pacific/Gambier Pacific/Marquesas Pacific/Tahiti -486,1,425 # PG (Papua New Guinea) Pacific/Port_Moresby -487,1,225 # PH (Philippines) Asia/Manila -490,2,215,392 # PK (Pakistan) Asia/Karachi PLT -491,1,367 # PL (Poland) Europe/Warsaw -492,1,128 # PM (St Pierre & Miquelon) America/Miquelon -493,1,423 # PN (Pitcairn) Pacific/Pitcairn -497,2,146,394 # PR (Puerto Rico) America/Puerto_Rico PRT -498,1,205 # PS (Palestine) Asia/Gaza -499,3,260,266,339 # PT (Portugal) Atlantic/Azores Atlantic/Madeira Europe/Lisbon -502,1,422 # PW (Palau) Pacific/Palau -504,1,63 # PY (Paraguay) America/Asuncion -512,1,234 # QA (Qatar) Asia/Qatar -548,1,385 # RE (Reunion) Indian/Reunion -558,1,329 # RO (Romania) Europe/Bucharest -564,14,185,209,214,218,223,228,229,242,256,257,258,337,347,353 # RU (Russia) Asia/Anadyr Asia/Irkutsk Asia/Kamchatka Asia/Krasnoyarsk Asia/Magadan Asia/Novosibirsk Asia/Omsk Asia/Sakhalin Asia/Vladivostok Asia/Yakutsk Asia/Yekaterinburg Europe/Kaliningrad Europe/Moscow Europe/Samara -566,1,32 # RW (Rwanda) Africa/Kigali -576,1,237 # SA (Saudi Arabia) Asia/Riyadh -577,2,407,435 # SB (Solomon Islands) Pacific/Guadalcanal SST -578,1,381 # SC (Seychelles) Indian/Mahe -579,1,31 # SD (Sudan) Africa/Khartoum -580,1,359 # SE (Sweden) Europe/Stockholm -582,1,246 # SG (Singapore) Asia/Singapore -583,1,269 # SH (St Helena) Atlantic/St_Helena -584,1,340 # SI (Slovenia) Europe/Ljubljana -585,2,181,265 # SJ (Svalbard & Jan Mayen) Arctic/Longyearbyen Atlantic/Jan_Mayen -586,1,327 # SK (Slovakia) Europe/Bratislava -587,1,26 # SL (Sierra Leone) Africa/Freetown -588,1,354 # SM (San Marino) Europe/San_Marino -589,1,21 # SN (Senegal) Africa/Dakar -590,1,44 # SO (Somalia) Africa/Mogadishu -593,1,141 # SR (Suriname) America/Paramaribo -595,1,52 # ST (Sao Tome & Principe) Africa/Sao_Tome -597,1,91 # SV (El Salvador) America/El_Salvador -600,1,200 # SY (Syria) Asia/Damascus -601,1,43 # SZ (Swaziland) Africa/Mbabane -610,1,96 # TC (Turks & Caicos Is) America/Grand_Turk -611,1,47 # TD (Chad) Africa/Ndjamena -613,1,380 # TF (French Southern & Antarctic Lands) Indian/Kerguelen -614,1,36 # TG (Togo) Africa/Lome -615,1,192 # TH (Thailand) Asia/Bangkok -617,1,204 # TJ (Tajikistan) Asia/Dushanbe -618,1,402 # TK (Tokelau) Pacific/Fakaofo -619,1,202 # TL (East Timor) Asia/Dili -620,1,188 # TM (Turkmenistan) Asia/Ashgabat -621,1,55 # TN (Tunisia) Africa/Tunis -622,1,430 # TO (Tonga) Pacific/Tongatapu -625,1,336 # TR (Turkey) Europe/Istanbul -627,1,144 # TT (Trinidad & Tobago) America/Port_of_Spain -629,1,404 # TV (Tuvalu) Pacific/Funafuti -630,1,247 # TW (Taiwan) Asia/Taipei -633,1,22 # TZ (Tanzania) Africa/Dar_es_Salaam -640,4,338,356,362,369 # UA (Ukraine) Europe/Kiev Europe/Simferopol Europe/Uzhgorod Europe/Zaporozhye -646,1,30 # UG (Uganda) Africa/Kampala -652,3,410,416,432 # UM (US minor outlying islands) Pacific/Johnston Pacific/Midway Pacific/Wake -658,29,4,57,58,69,77,86,87,105,106,107,108,113,114,117,118,125,134,136,138,142,170,286,291,372,373,389,393,395,409 # US (United States) AST America/Adak America/Anchorage America/Boise America/Chicago America/Denver America/Detroit America/Indiana/Knox America/Indiana/Marengo America/Indiana/Vevay America/Indianapolis America/Juneau America/Kentucky/Monticello America/Los_Angeles America/Louisville America/Menominee America/New_York America/Nome America/North_Dakota/Center America/Phoenix America/Yakutat CST EST HST IET MST PNT PST Pacific/Honolulu -664,1,130 # UY (Uruguay) America/Montevideo -665,2,243,248 # UZ (Uzbekistan) Asia/Samarkand Asia/Tashkent -672,1,364 # VA (Vatican City) Europe/Vatican -674,1,160 # VC (St Vincent) America/St_Vincent -676,1,73 # VE (Venezuela) America/Caracas -678,1,166 # VG (Virgin Islands (UK)) America/Tortola -680,1,159 # VI (Virgin Islands (US)) America/St_Thomas -685,2,241,437 # VN (Vietnam) Asia/Saigon VST -692,1,400 # VU (Vanuatu) Pacific/Efate -709,1,433 # WF (Wallis & Futuna) Pacific/Wallis -722,2,388,396 # WS (Samoa (Western)) MIT Pacific/Apia -772,1,182 # YE (Yemen) Asia/Aden -787,1,384 # YT (Mayotte) Indian/Mayotte -788,1,325 # YU (Serbia and Montenegro) Europe/Belgrade -800,1,29 # ZA (South Africa) Africa/Johannesburg -812,1,39 # ZM (Zambia) Africa/Lusaka -822,2,28,283 # ZW (Zimbabwe) Africa/Harare CAT -end diff --git a/icuSources/data/misc/zoneinfo.txt b/icuSources/data/misc/zoneinfo.txt new file mode 100644 index 00000000..b86bd4e3 --- /dev/null +++ b/icuSources/data/misc/zoneinfo.txt @@ -0,0 +1,3164 @@ +//--------------------------------------------------------- +// Copyright (C) 2003-2005, International Business Machines +// Corporation and others. All Rights Reserved. +//--------------------------------------------------------- +// Build tool: tz2icu +// Build date: Fri Feb 18 18:42:07 2005 +// Olson source: ftp://elsie.nci.nih.gov/pub/ +// Olson version: 2004e +//--------------------------------------------------------- +// >> !!! >> THIS IS A MACHINE-GENERATED FILE << !!! << +// >> !!! >>> DO NOT EDIT <<< !!! << +//--------------------------------------------------------- + +zoneinfo { + Zones:array { + /* ACT */ :int { 310 } //Z#0 +, /* AET */ :int { 321 } //Z#1 +, /* AGT */ :int { 62 } //Z#2 +, /* ART */ :int { 17 } //Z#3 +, /* AST */ :int { 58 } //Z#4 +, /* Africa/Abidjan */ :array { + :intvector { -1830383032 } + :intvector { 0, 0 } + :bin { "00" } + } //Z#5 +, /* Africa/Accra */ :array { + :intvector { -1640995148, -1051920000, -1041466800, -1020384000, -1009930800, -988848000, -978394800, -957312000, -946858800, -925689600, -915236400, -894153600, -883700400, -862617600, -852164400 } + :intvector { 0, 0, 0, 1200 } + :bin { "000100010001000100010001000100" } + } //Z#6 +, /* Africa/Addis_Ababa */ :array { + :intvector { -1062210920 } + :intvector { 10800, 0 } + :bin { "00" } + :intvector { 7, 350 } + } //Z#7 +, /* Africa/Algiers */ :array { + :intvector { -1855958961, -1689814800, -1680397200, -1665363600, -1648342800, -1635123600, -1616893200, -1604278800, -1585443600, -1574038800, -1552266000, -1539997200, -1531443600, -956365200, -950486400, -942012000, -812502000, -796262400, -781052400, -766630800, -733280400, -439430400, -212029200, 41468400, 54774000, 231724800, 246236400, 259545600, 275274000, 309740400, 325468800, 341802000, 357523200 } + :intvector { 0, 0, 0, 3600, 3600, 0, 3600, 3600 } + :bin { "000100010001000100010001000100020302030200020001000102030200010002" } + } //Z#8 +, /* Africa/Asmera */ :array { + :intvector { -1062210920 } + :intvector { 10800, 0 } + :bin { "00" } + } //Z#9 +, /* Africa/Bamako */ :array { + :intvector { -1830382080, -1131235200, -300841200 } + :intvector { -3600, 0, 0, 0 } + :bin { "010001" } + } //Z#10 +, /* Africa/Bangui */ :array { + :intvector { -1830388460 } + :intvector { 3600, 0 } + :bin { "00" } + } //Z#11 +, /* Africa/Banjul */ :array { + :intvector { -1830380004, -1104533604, -189385200 } + :intvector { -3996, 0, -3600, 0, 0, 0 } + :bin { "000102" } + } //Z#12 +, /* Africa/Bissau */ :array { + :intvector { -1849388260, 157770000 } + :intvector { -3600, 0, 0, 0 } + :bin { "0001" } + } //Z#13 +, /* Africa/Blantyre */ :array { + :intvector { -2109291600 } + :intvector { 7200, 0 } + :bin { "00" } + } //Z#14 +, /* Africa/Brazzaville */ :array { + :intvector { -1830387668 } + :intvector { 3600, 0 } + :bin { "00" } + } //Z#15 +, /* Africa/Bujumbura */ :array { + :intvector { } + :intvector { 7200, 0 } + :bin { "" } + } //Z#16 +, /* Africa/Cairo */ :array { + :intvector { -929844000, -923108400, -906170400, -892868400, -875844000, -857790000, -844308000, -825822000, -812685600, -794199600, -779853600, -762663600, -399088800, -386650800, -368330400, -355114800, -336790800, -323654400, -305168400, -292032000, -273632400, -260496000, -242096400, -228960000, -210560400, -197424000, -178938000, -165801600, -147402000, -134265600, -115866000, -102643200, -84330000, -71107200, -52707600, -39484800, -21171600, -7948800, 10364400, 23587200, 41900400, 55123200, 73522800, 86745600, 105058800, 118281600, 136594800, 149817600, 168130800, 181353600, 199753200, 212976000, 231289200, 244512000, 262825200, 276048000, 294361200, 307584000, 325983600, 339206400, 357519600, 370742400, 396399600, 402278400, 426812400, 433814400, 452214000, 465436800, 483750000, 496972800, 515286000, 528508800, 546822000, 560044800, 578444400, 591667200, 610412400, 623203200, 641516400, 654739200, 673052400, 686275200, 704674800, 717897600, 736210800, 749433600, 767746800, 780969600 } + :intvector { 7200, 0, 7200, 3600 } + :bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + "Egypt" + :intvector { 7200, 1995 } + :intvector { 3, 17, 355 } + } //Z#17 +, /* Africa/Casablanca */ :array { + :intvector { -1773012580, -956361600, -950490000, -942019200, -761187600, -617241600, -605149200, -81432000, -71110800, 141264000, 147222000, 199756800, 207702000, 231292800, 244249200, 265507200, 271033200, 448243200, 504918000 } + :intvector { 0, 0, 0, 3600, 3600, 0 } + :bin { "00010001000100010001000100010001000200" } + } //Z#18 +, /* Africa/Ceuta */ :array { + :intvector { -1630112400, -1616810400, -1442451600, -1427677200, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301274000, -1293840000, -81432000, -71110800, 141264000, 147222000, 199756800, 207702000, 231292800, 244249200, 265507200, 271033200, 448243200, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 0, 0, 0, 3600, 3600, 0, 3600, 3600 } + :bin { "010001000100010001000001000100010001000100020302030203020302030203020302030203020302" } + "EU" + :intvector { 3600, 1996 } + } //Z#19 +, /* Africa/Conakry */ :array { + :intvector { -1830380708, -1131235200, -315615600 } + :intvector { -3600, 0, 0, 0 } + :bin { "010001" } + } //Z#20 +, /* Africa/Dakar */ :array { + :intvector { -1830379816, -902098800 } + :intvector { -3600, 0, 0, 0 } + :bin { "0001" } + } //Z#21 +, /* Africa/Dar_es_Salaam */ :array { + :intvector { -1230777428, -694321200, -284006685 } + :intvector { 9885, 0, 10800, 0 } + :bin { "010001" } + } //Z#22 +, /* Africa/Djibouti */ :array { + :intvector { -1846291956 } + :intvector { 10800, 0 } + :bin { "00" } + } //Z#23 +, /* Africa/Douala */ :array { + :intvector { -1830386328 } + :intvector { 3600, 0 } + :bin { "00" } + } //Z#24 +, /* Africa/El_Aaiun */ :array { + :intvector { -1136070432, 198291600 } + :intvector { -3600, 0, 0, 0 } + :bin { "0001" } + } //Z#25 +, /* Africa/Freetown */ :array { + :intvector { -1785712020, -1091487600, -1080949200, -1059865200, -1049326800, -1028329200, -1017790800, -996793200, -986254800, -965257200, -954718800, -933634800, -923096400, -902098800, -891560400, -870562800, -860024400, -410223600, -397180800, -389235600, -365644800, -357699600, -334108800, -326163600, -302486400, -294541200, -270950400, -263005200, -239414400, -231469200 } + :intvector { -3600, 0, -3600, 2400, 0, 0, 0, 3600 } + :bin { "000100010001000100010001000100010002030203020302030203020302" } + } //Z#26 +, /* Africa/Gaborone */ :array { + :intvector { -829526400, -813805200 } + :intvector { 7200, 0, 7200, 3600 } + :bin { "0100" } + } //Z#27 +, /* Africa/Harare */ :array { + :intvector { -2109290652 } + :intvector { 7200, 0 } + :bin { "00" } + :intvector { 28, 332 } + } //Z#28 +, /* Africa/Johannesburg */ :array { + :intvector { -2109288600, -860976000, -845254800, -829526400, -813805200 } + :intvector { 7200, 0, 7200, 3600 } + :bin { "0001000100" } + } //Z#29 +, /* Africa/Kampala */ :array { + :intvector { -1309745380, -1262314800, -694319400, -410237085 } + :intvector { 9000, 0, 9885, 0, 10800, 0 } + :bin { "02000102" } + } //Z#30 +, /* Africa/Khartoum */ :array { + :intvector { -1230775808, 10360800, 24786000, 41810400, 56322000, 73432800, 87944400, 104882400, 119480400, 136332000, 151016400, 167781600, 182552400, 199231200, 214174800, 230680800, 245710800, 262735200, 277246800, 294184800, 308782800, 325634400, 340405200, 357084000, 371941200, 388533600, 403477200, 419983200, 435013200, 452037600, 466635600, 483487200, 498171600, 947930400 } + :intvector { 7200, 0, 7200, 3600, 10800, 0 } + :bin { "00010001000100010001000100010001000100010001000100010001000100010002" } + } //Z#31 +, /* Africa/Kigali */ :array { + :intvector { -1091498416 } + :intvector { 7200, 0 } + :bin { "00" } + } //Z#32 +, /* Africa/Kinshasa */ :array { + :intvector { } + :intvector { 3600, 0 } + :bin { "" } + } //Z#33 +, /* Africa/Lagos */ :array { + :intvector { -1588464816 } + :intvector { 3600, 0 } + :bin { "00" } + } //Z#34 +, /* Africa/Libreville */ :array { + :intvector { -1830386268 } + :intvector { 3600, 0 } + :bin { "00" } + } //Z#35 +, /* Africa/Lome */ :array { + :intvector { } + :intvector { 0, 0 } + :bin { "" } + } //Z#36 +, /* Africa/Luanda */ :array { + :intvector { -1849395124 } + :intvector { 3600, 0 } + :bin { "00" } + } //Z#37 +, /* Africa/Lubumbashi */ :array { + :intvector { } + :intvector { 7200, 0 } + :bin { "" } + } //Z#38 +, /* Africa/Lusaka */ :array { + :intvector { -2109289988 } + :intvector { 7200, 0 } + :bin { "00" } + } //Z#39 +, /* Africa/Malabo */ :array { + :intvector { -1830386108, -190857600 } + :intvector { 0, 0, 3600, 0 } + :bin { "0001" } + } //Z#40 +, /* Africa/Maputo */ :array { + :intvector { -2109291020 } + :intvector { 7200, 0 } + :bin { "00" } + } //Z#41 +, /* Africa/Maseru */ :array { + :intvector { -2109289800, -829526400, -813805200 } + :intvector { 7200, 0, 7200, 3600 } + :bin { "000100" } + } //Z#42 +, /* Africa/Mbabane */ :array { + :intvector { -2109290664 } + :intvector { 7200, 0 } + :bin { "00" } + } //Z#43 +, /* Africa/Mogadishu */ :array { + :intvector { -1230778800, -410236200 } + :intvector { 9000, 0, 10800, 0 } + :bin { "0001" } + } //Z#44 +, /* Africa/Monrovia */ :array { + :intvector { -1604359012, 73529070 } + :intvector { -2670, 0, 0, 0 } + :bin { "0001" } + } //Z#45 +, /* Africa/Nairobi */ :array { + :intvector { -1309746436, -1262314800, -946780200, -315629085 } + :intvector { 9000, 0, 9885, 0, 10800, 0 } + :bin { "02000102" } + } //Z#46 +, /* Africa/Ndjamena */ :array { + :intvector { -1830387612, 308703600, 321314400 } + :intvector { 3600, 0, 3600, 3600 } + :bin { "000100" } + } //Z#47 +, /* Africa/Niamey */ :array { + :intvector { -1830384508, -1131231600, -315619200 } + :intvector { -3600, 0, 0, 0, 3600, 0 } + :bin { "000102" } + } //Z#48 +, /* Africa/Nouakchott */ :array { + :intvector { -1830380172, -1131235200, -286930800 } + :intvector { -3600, 0, 0, 0 } + :bin { "010001" } + } //Z#49 +, /* Africa/Ouagadougou */ :array { + :intvector { -1830383636 } + :intvector { 0, 0 } + :bin { "00" } + } //Z#50 +, /* Africa/Porto-Novo */ :array { + :intvector { -1830384628, -1131235200 } + :intvector { 0, 0, 3600, 0 } + :bin { "0001" } + } //Z#51 +, /* Africa/Sao_Tome */ :array { + :intvector { -1830381808 } + :intvector { 0, 0 } + :bin { "00" } + } //Z#52 +, /* Africa/Timbuktu */ :array { + :intvector { -1830383276 } + :intvector { 0, 0 } + :bin { "00" } + } //Z#53 +, /* Africa/Tripoli */ :array { + :intvector { -1577926364, -574902000, -568087200, -512175600, -504928800, -449888400, -441856800, -347158800, 378684000, 386463600, 402271200, 417999600, 433807200, 449622000, 465429600, 481590000, 496965600, 512953200, 528674400, 544230000, 560037600, 575852400, 591660000, 607388400, 623196000, 641775600, 844034400, 860108400, 875916000 } + :intvector { 3600, 0, 3600, 3600, 7200, 0 } + :bin { "0001000100010002000100010001000100010001000100010002000102" } + :intvector { 54, 475 } + } //Z#54 +, /* Africa/Tunis */ :array { + :intvector { -1855958961, -969242400, -950493600, -941940000, -891136800, -877827600, -857257200, -844556400, -842918400, -842223600, -828230400, -812502000, -796269600, -781052400, -766634400, 231202800, 243903600, 262825200, 276044400, 581122800, 591145200, 606870000, 622594800, 641516400, 654649200 } + :intvector { 3600, 0, 3600, 3600 } + :bin { "00010001000100010001000100010001000100010001000100" } + } //Z#55 +, /* Africa/Windhoek */ :array { + :intvector { -2109288600, -860976000, -845254800, 637970400, 765324000, 778640400 } + :intvector { 3600, 0, 3600, 3600, 7200, 0, 7200, 3600 } + :bin { "020302020001" } + "Namibia" + :intvector { 3600, 1995 } + } //Z#56 +, /* America/Adak */ :array { + :intvector { -880196400, -769395600, -765374400, -86878800, -21466800, -5745600, 9982800, 25704000, 41432400, 57758400, 73486800, 89208000, 104936400, 120657600, 126709200, 152107200, 162392400, 183556800, 199285200, 215611200, 230734800, 247060800, 262789200, 278510400, 294238800, 309960000, 325688400, 341409600, 357138000, 372859200, 388587600, 404913600, 420037200, 436363200, 439034400, 452088000, 467809200, 483537600, 499258800, 514987200, 530708400 } + :intvector { -39600, 0, -39600, 3600, -36000, 0, -36000, 3600 } + :bin { "0101000001000100010001000100010001000100010001000100010001000100010202030203020302" } + "US" + :intvector { -36000, 1987 } + :intvector { 57, 75, 559 } + } //Z#57 +, /* America/Anchorage */ :array { + :intvector { -880200000, -769395600, -765378000, -86882400, -21470400, -5749200, 9979200, 25700400, 41428800, 57754800, 73483200, 89204400, 104932800, 120654000, 126705600, 152103600, 162388800, 183553200, 199281600, 215607600, 230731200, 247057200, 262785600, 278506800, 294235200, 309956400, 325684800, 341406000, 357134400, 372855600, 388584000, 404910000, 420033600, 436359600, 439030800, 452084400, 467805600, 483534000, 499255200, 514983600, 530704800 } + :intvector { -36000, 0, -36000, 3600, -32400, 0, -32400, 3600 } + :bin { "0101000001000100010001000100010001000100010001000100010001000100010202030203020302" } + "US" + :intvector { -32400, 1987 } + :intvector { 4, 58, 555, 558 } + } //Z#58 +, /* America/Anguilla */ :array { + :intvector { -1825098464 } + :intvector { -14400, 0 } + :bin { "00" } + } //Z#59 +, /* America/Antigua */ :array { + :intvector { -1825098768, -599598000 } + :intvector { -18000, 0, -14400, 0 } + :bin { "0001" } + } //Z#60 +, /* America/Araguaina */ :array { + :intvector { -1767214032, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 813726000, 824004000, 844570800, 856058400, 876106800, 888717600, 908074800, 919562400, 938919600, 951616800, 970974000, 982461600, 1003028400, 1013911200, 1036292400, 1045360800 } + :intvector { -10800, 0, -10800, 3600 } + :bin { "00010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + } //Z#61 +, /* America/Argentina/Buenos_Aires */ :array { + :intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667965600, 687927600, 699415200, 719377200, 731469600, 938919600, 952052400 } + :intvector { -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } + :bin { "0001000100010001000100010001000100010001000100010001000100010001000100010001000100020302030203020302030203020102" } + :intvector { 2, 62, 83 } + } //Z#62 +, /* America/Argentina/Catamarca */ :array { + :intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667965600, 687931200, 699415200, 719377200, 731469600, 938919600, 952052400, 1086058800, 1087704000 } + :intvector { -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } + :bin { "00010001000100010001000100010001000100010001000100010001000100010001000100010001000203020302030203000302030201020002" } + :intvector { 63, 88 } + } //Z#63 +, /* America/Argentina/ComodRivadavia */ :array { + :intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667965600, 687931200, 699415200, 719377200, 731469600, 938919600, 952052400, 1086058800, 1087704000 } + :intvector { -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } + :bin { "00010001000100010001000100010001000100010001000100010001000100010001000100010001000203020302030203000302030201020002" } + } //Z#64 +, /* America/Argentina/Cordoba */ :array { + :intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667965600, 687931200, 699415200, 719377200, 731469600, 938919600, 952052400 } + :intvector { -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } + :bin { "0001000100010001000100010001000100010001000100010001000100010001000100010001000100020302030203020300030203020102" } + :intvector { 65, 93, 172 } + } //Z#65 +, /* America/Argentina/Jujuy */ :array { + :intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 657086400, 669178800, 686721600, 699415200, 719377200, 731469600, 938919600, 952052400 } + :intvector { -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } + :bin { "0001000100010001000100010001000100010001000100010001000100010001000100010001000100020302030203000100030203020102" } + :intvector { 66, 129 } + } //Z#66 +, /* America/Argentina/La_Rioja */ :array { + :intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667792800, 673588800, 687927600, 699415200, 719377200, 731469600, 938919600, 952052400, 1086058800, 1087704000 } + :intvector { -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } + :bin { "0001000100010001000100010001000100010001000100010001000100010001000100010001000100020302030203020300020302030201020002" } + } //Z#67 +, /* America/Argentina/Mendoza */ :array { + :intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 655963200, 667796400, 687499200, 699418800, 719380800, 731469600, 938919600, 952052400, 1085281200, 1096171200 } + :intvector { -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } + :bin { "00010001000100010001000100010001000100010001000100010001000100010001000100010001000203020302030001000100030201020002" } + :intvector { 68, 143 } + } //Z#68 +, /* America/Argentina/Rio_Gallegos */ :array { + :intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667965600, 687927600, 699415200, 719377200, 731469600, 938919600, 952052400, 1086058800, 1087704000 } + :intvector { -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } + :bin { "00010001000100010001000100010001000100010001000100010001000100010001000100010001000203020302030203020302030201020002" } + } //Z#69 +, /* America/Argentina/San_Juan */ :array { + :intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667792800, 673588800, 687927600, 699415200, 719377200, 731469600, 938919600, 952052400, 1085972400, 1090728000 } + :intvector { -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } + :bin { "0001000100010001000100010001000100010001000100010001000100010001000100010001000100020302030203020300020302030201020002" } + } //Z#70 +, /* America/Argentina/Tucuman */ :array { + :intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667965600, 687931200, 699415200, 719377200, 731469600, 938919600, 952052400, 1086058800, 1087099200 } + :intvector { -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } + :bin { "00010001000100010001000100010001000100010001000100010001000100010001000100010001000203020302030203000302030201020002" } + } //Z#71 +, /* America/Argentina/Ushuaia */ :array { + :intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667965600, 687927600, 699415200, 719377200, 731469600, 938919600, 952052400, 1085886000, 1087704000 } + :intvector { -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } + :bin { "00010001000100010001000100010001000100010001000100010001000100010001000100010001000203020302030203020302030201020002" } + } //Z#72 +, /* America/Aruba */ :array { + :intvector { -1826738376, -157750200 } + :intvector { -16200, 0, -14400, 0 } + :bin { "0001" } + } //Z#73 +, /* America/Asuncion */ :array { + :intvector { -1206389360, 86760000, 134017200, 181368000, 194497200, 212990400, 226033200, 244526400, 257569200, 276062400, 291783600, 307598400, 323406000, 339220800, 354942000, 370756800, 386478000, 402292800, 418014000, 433828800, 449636400, 465451200, 481172400, 496987200, 512708400, 528523200, 544244400, 560059200, 575866800, 591681600, 607402800, 625032000, 638938800, 654753600, 670474800, 686721600, 699418800, 718257600, 733546800, 749448000, 762318000, 780984000, 793767600, 812520000, 825649200, 844574400, 856666800, 876024000, 888721200, 907473600, 920775600, 938923200, 952225200, 970372800, 983674800, 1002427200 } + :intvector { -14400, 0, -14400, 3600, -10800, 0 } + :bin { "0002000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001" } + "Para" + :intvector { -14400, 2002 } + } //Z#74 +, /* America/Atka */ :int { 57 } //Z#75 +, /* America/Bahia */ :array { + :intvector { -1767216356, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 656478000, 666756000, 687927600, 697600800, 719982000, 728445600, 750826800, 761709600, 782276400, 793159200, 813726000, 824004000, 844570800, 856058400, 876106800, 888717600, 908074800, 919562400, 938919600, 951616800, 970974000, 982461600, 1003028400, 1013911200, 1036292400, 1045360800 } + :intvector { -10800, 0, -10800, 3600 } + :bin { "0001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + } //Z#76 +, /* America/Barbados */ :array { + :intvector { -1451678492, -1199217692, 234943200, 244616400, 261554400, 276066000, 293004000, 307515600, 325058400, 338706000 } + :intvector { -14400, 0, -14400, 3600, -14308, 0 } + :bin { "02000100010001000100" } + } //Z#77 +, /* America/Belem */ :array { + :intvector { -1767213964, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600 } + :intvector { -10800, 0, -10800, 3600 } + :bin { "0001000100010001000100010001000100010001000100010001000100" } + } //Z#78 +, /* America/Belize */ :array { + :intvector { -1822500432, -1616954400, -1606069800, -1585504800, -1574015400, -1554055200, -1542565800, -1522605600, -1511116200, -1490551200, -1479666600, -1459101600, -1448217000, -1427652000, -1416162600, -1396202400, -1384713000, -1364752800, -1353263400, -1333303200, -1321813800, -1301248800, -1290364200, -1269799200, -1258914600, -1238349600, -1226860200, -1206900000, -1195410600, -1175450400, -1163961000, -1143396000, -1132511400, -1111946400, -1101061800, -1080496800, -1069612200, -1049047200, -1037557800, -1017597600, -1006108200, -986148000, -974658600, -954093600, -943209000, -922644000, -911759400, -891194400, -879705000, -859744800, -848255400, 123919200, 129618000, 409039200, 413874000 } + :intvector { -21600, 0, -21600, 1800, -21600, 3600 } + :bin { "00010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010002000200" } + } //Z#79 +, /* America/Boa_Vista */ :array { + :intvector { -1767211040, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 938923200, 951620400, 970977600, 971578800 } + :intvector { -14400, 0, -14400, 3600 } + :bin { "000100010001000100010001000100010001000100010001000100010001000100" } + } //Z#80 +, /* America/Bogota */ :array { + :intvector { -1739041420, 704782800, 725774400 } + :intvector { -18000, 0, -18000, 3600 } + :bin { "000100" } + } //Z#81 +, /* America/Boise */ :array { + :intvector { -1633269600, -1615129200, -1601820000, -1583679600, -1471788000, -880210800, -769395600, -765388800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 129114000, 152092800, 162378000, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600 } + :intvector { -28800, 0, -28800, 3600, -25200, 0, -25200, 3600 } + :bin { "010001000203030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } + "US" + :intvector { -25200, 1987 } + } //Z#82 +, /* America/Buenos_Aires */ :int { 62 } //Z#83 +, /* America/Cambridge_Bay */ :array { + :intvector { -1632063600, -1615132800, -1596985200, -1583172000, -880210800, -769395600, -765388800, -147891600, -131562000, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600 } + :intvector { -25200, 0, -25200, 3600, -25200, 7200 } + :bin { "0100010001010002000100010001000100010001000100" } + "Canada" + :intvector { -25200, 1987 } + } //Z#84 +, /* America/Campo_Grande */ :array { + :intvector { -1767212492, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 592977600, 602046000, 624427200, 634705200, 656481600, 666759600, 687931200, 697604400, 719985600, 728449200, 750830400, 761713200, 782280000, 793162800, 813729600, 824007600, 844574400, 856062000, 876110400, 888721200, 908078400, 919566000, 938923200, 951620400, 970977600, 982465200, 1003032000, 1013914800, 1036296000, 1045364400, 1066536000, 1076814000, 1099368000 } + :intvector { -14400, 0, -14400, 3600 } + :bin { "0001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001" } + "Brazil" + :intvector { -14400, 2005 } + } //Z#85 +, /* America/Cancun */ :array { + :intvector { -1514743200, 377935200, 828860400, 846396000, 860310000, 877845600, 891759600, 902037600, 909298800, 923212800, 941353200, 954662400, 972802800, 989136000, 1001833200 } + :intvector { -21600, 0, -21600, 3600, -18000, 0, -18000, 3600 } + :bin { "000203020302030100010001000100" } + "Mexico" + :intvector { -21600, 2002 } + } //Z#86 +, /* America/Caracas */ :array { + :intvector { -1826739140, -157750200 } + :intvector { -16200, 0, -14400, 0 } + :bin { "0001" } + } //Z#87 +, /* America/Catamarca */ :int { 63 } //Z#88 +, /* America/Cayenne */ :array { + :intvector { -1846269040, -71092800 } + :intvector { -14400, 0, -10800, 0 } + :bin { "0001" } + } //Z#89 +, /* America/Cayman */ :array { + :intvector { -1827687168 } + :intvector { -18000, 0 } + :bin { "00" } + } //Z#90 +, /* America/Chicago */ :array { + :intvector { -1633276800, -1615136400, -1601827200, -1583686800, -1563724800, -1551632400, -1538928000, -1520182800, -1504454400, -1491757200, -1473004800, -1459702800, -1441555200, -1428253200, -1410105600, -1396803600, -1378656000, -1365354000, -1347206400, -1333904400, -1315152000, -1301850000, -1283702400, -1270400400, -1252252800, -1238950800, -1220803200, -1207501200, -1189353600, -1176051600, -1157299200, -1144602000, -1125849600, -1112547600, -1094400000, -1081098000, -1067788800, -1045414800, -1031500800, -1018198800, -1000051200, -986749200, -967996800, -955299600, -936547200, -923245200, -905097600, -891795600, -880214400, -769395600, -765392400, -747244800, -733942800, -715795200, -702493200, -684345600, -671043600, -652896000, -639594000, -620841600, -608144400, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -447267600, -431539200, -415818000, -400089600, -384368400, -368640000, -352918800, -337190400, -321469200, -305740800, -289414800, -273686400, -257965200, -242236800, -226515600, -210787200, -195066000, -179337600, -163616400, -147888000, -131562000, -116438400, -100112400, -84384000, -68662800, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000 } + :intvector { -21600, 0, -21600, 3600, -18000, 0 } + :bin { "01000100010001000100010001000100010001000100010001000100010001000100010002000100010001000100010001010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + "US" + :intvector { -21600, 1987 } + :intvector { 91, 335, 336, 546, 561 } + } //Z#91 +, /* America/Chihuahua */ :array { + :intvector { -1514739600, -1343066400, -1234807200, -1220292000, -1207159200, -1191344400, 828864000, 846399600, 860313600, 877849200, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 989139600, 1001836800 } + :intvector { -25200, 0, -25200, 3600, -21600, 0, -21600, 3600 } + :bin { "000200020002030203020100010001000100" } + "Mexico" + :intvector { -25200, 2002 } + } //Z#92 +, /* America/Cordoba */ :int { 65 } //Z#93 +, /* America/Costa_Rica */ :array { + :intvector { -1545071020, 288770400, 297234000, 320220000, 328683600, 664264800, 678344400, 695714400, 700635600 } + :intvector { -21600, 0, -21600, 3600 } + :bin { "000100010001000100" } + } //Z#94 +, /* America/Cuiaba */ :array { + :intvector { -1767212140, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 592977600, 602046000, 624427200, 634705200, 656481600, 666759600, 687931200, 697604400, 719985600, 728449200, 750830400, 761713200, 782280000, 793162800, 813729600, 824007600, 844574400, 856062000, 876110400, 888721200, 908078400, 919566000, 938923200, 951620400, 970977600, 982465200, 1003032000, 1013914800, 1036296000, 1045364400, 1099368000 } + :intvector { -14400, 0, -14400, 3600 } + :bin { "000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001" } + "Brazil" + :intvector { -14400, 2005 } + } //Z#95 +, /* America/Curacao */ :array { + :intvector { -1826738656, -157750200 } + :intvector { -16200, 0, -14400, 0 } + :bin { "0001" } + } //Z#96 +, /* America/Danmarkshavn */ :array { + :intvector { -1686091520, 323845200, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 820465200 } + :intvector { -10800, 0, -10800, 3600, 0, 0 } + :bin { "00010001000100010001000100010001000100010001000100010001000100010002" } + } //Z#97 +, /* America/Dawson */ :array { + :intvector { -1632056400, -1615125600, -1596978000, -1583164800, -880203600, -769395600, -765381600, -147884400, -131554800, 120646800, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200 } + :intvector { -32400, 0, -32400, 3600, -32400, 7200, -28800, 0, -28800, 3600 } + :bin { "010001000101000200030403040304030403040304030403" } + "NT_YK" + :intvector { -28800, 1987 } + } //Z#98 +, /* America/Dawson_Creek */ :array { + :intvector { -1632060000, -1614783600, -880207200, -769395600, -765385200, -715788000, -702486000, -684338400, -671036400, -652888800, -639586800, -620834400, -608137200, -589384800, -576082800, -557935200, -544633200, -526485600, -513183600, -495036000, -481734000, -463586400, -450284400, -431532000, -418230000, -400082400, -386780400, -368632800, -355330800, -337183200, -323881200, -305733600, -292431600, -273679200, -260982000, -242229600, -226508400, -210780000, -195058800, -179330400, -163609200, -147880800, -131554800, -116431200, -100105200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 84013200 } + :intvector { -28800, 0, -28800, 3600, -25200, 0 } + :bin { "010001010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000102" } + } //Z#99 +, /* America/Denver */ :array { + :intvector { -1633273200, -1615132800, -1601823600, -1583683200, -1570374000, -1551628800, -1538924400, -1534089600, -880210800, -769395600, -765388800, -147884400, -131558400, -116434800, -100108800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 152092800, 162378000, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600 } + :intvector { -25200, 0, -25200, 3600 } + :bin { "01000100010001000101000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + "US" + :intvector { -25200, 1987 } + :intvector { 100, 177, 479, 490, 551, 567 } + } //Z#100 +, /* America/Detroit */ :array { + :intvector { -2051202469, -1724083200, -880218000, -769395600, -765396000, -684349200, -671047200, -80499600, -68666400, 104914800, 120636000, 126687600, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400 } + :intvector { -21600, 0, -18000, 0, -18000, 3600 } + :bin { "00010202010201020102010201020102010201020102010201020102010201020102010201" } + "US" + :intvector { -18000, 1987 } + :intvector { 101, 566 } + } //Z#101 +, /* America/Dominica */ :array { + :intvector { -1846266804 } + :intvector { -14400, 0 } + :bin { "00" } + } //Z#102 +, /* America/Edmonton */ :array { + :intvector { -1998663968, -1632063600, -1614787200, -1600614000, -1596816000, -1567954800, -1551628800, -1536505200, -1523203200, -1504450800, -1491753600, -1473001200, -1459699200, -880210800, -769395600, -765388800, -715791600, -702489600, -84380400, -68659200, -21481200, -5760000, 73472400, 89193600, 104922000, 120643200, 136371600, 152092800, 167821200, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600 } + :intvector { -25200, 0, -25200, 3600 } + :bin { "00010001000100010001000100010100010001000100010001000100010001000100010001000100010001000100010001000100" } + "Edm" + :intvector { -25200, 1987 } + :intvector { 103, 342 } + } //Z#103 +, /* America/Eirunepe */ :array { + :intvector { -1767208832, -1206950400, -1191355200, -1175367600, -1159819200, -633812400, -622062000, -602276400, -591825600, -570740400, -560203200, -539118000, -531345600, -191358000, -184190400, -155156400, -150062400, -128890800, -121118400, -99946800, -89582400, -68410800, -57960000, 499755600, 511243200, 530600400, 540273600, 562136400, 571204800, 750834000, 761716800 } + :intvector { -18000, 0, -18000, 3600 } + :bin { "00010001000100010001000100010001000100010001000100010001000100" } + } //Z#104 +, /* America/El_Salvador */ :array { + :intvector { -1546279392, 547020000, 559717200, 578469600, 591166800 } + :intvector { -21600, 0, -21600, 3600 } + :bin { "0001000100" } + } //Z#105 +, /* America/Ensenada */ :int { 187 } //Z#106 +, /* America/Fort_Wayne */ :int { 125 } //Z#107 +, /* America/Fortaleza */ :array { + :intvector { -1767216360, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 938919600, 951616800, 970974000, 972180000, 1003028400, 1013911200 } + :intvector { -10800, 0, -10800, 3600 } + :bin { "000100010001000100010001000100010001000100010001000100010001000100010001000100" } + } //Z#108 +, /* America/Glace_Bay */ :array { + :intvector { -2131646412, -1632074400, -1614798000, -880221600, -769395600, -765399600, -526500000, -513198000, 73461600, 89182800, 104911200, 120632400, 136360800, 152082000, 167810400, 183531600, 199260000, 215586000, 230709600, 247035600, 262764000, 278485200, 294213600, 309934800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800 } + :intvector { -14400, 0, -14400, 3600 } + :bin { "0001000101000100010001000100010001000100010001000100010001000100010001000100" } + "Canada" + :intvector { -14400, 1987 } + } //Z#109 +, /* America/Godthab */ :array { + :intvector { -1686083584, 323845200, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { -10800, 0, -10800, 3600 } + :bin { "000100010001000100010001000100010001000100010001000100010001000100" } + "EU" + :intvector { -10800, 1996 } + } //Z#110 +, /* America/Goose_Bay */ :array { + :intvector { -1632076148, -1614799748, -1096921748, -1061670600, -1048973400, -1030221000, -1017523800, -998771400, -986074200, -966717000, -954624600, -935267400, -922570200, -903817800, -891120600, -872368200, -769395600, -765401400, -746044200, -733347000, -714594600, -701897400, -683145000, -670447800, -651695400, -638998200, -619641000, -606943800, -589401000, -576099000, -557951400, -544649400, -526501800, -513199800, -495052200, -481750200, -463602600, -450300600, -431548200, -418246200, -400098600, -386796600, -368649000, -355347000, -337199400, -323897400, -305749800, -289423800, -273695400, -257974200, -242245800, -226524600, -210796200, -195075000, -179346600, -163625400, -147897000, -131571000, -119903400, -116445600, -100119600, -84391200, -68670000, -52941600, -37220400, -21492000, -5770800, 9957600, 25678800, 41407200, 57733200, 73461600, 89182800, 104911200, 120632400, 136360800, 152082000, 167810400, 183531600, 199260000, 215586000, 230709600, 247035600, 262764000, 278485200, 294213600, 309934800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800, 544593660, 562129260, 576043260, 594180060 } + :intvector { -14400, 0, -14400, 3600, -14400, 7200, -12652, 0, -12652, 3600, -12600, 0, -12600, 3600 } + :bin { "040305060506050605060506050605060605060506050605060506050605060506050605060506050605060506050605060506050605060506050001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000200" } + "StJohns" + :intvector { -14400, 1989 } + } //Z#111 +, /* America/Grand_Turk */ :array { + :intvector { -1827687168, 294210000, 309931200, 325659600, 341380800, 357109200, 372830400, 388558800, 404884800, 420008400, 436334400, 452062800, 467784000, 483512400, 499233600, 514962000, 530683200 } + :intvector { -18000, 0, -18000, 3600 } + :bin { "0001000100010001000100010001000100" } + "TC" + :intvector { -18000, 1987 } + } //Z#112 +, /* America/Grenada */ :array { + :intvector { -1846266780 } + :intvector { -14400, 0 } + :bin { "00" } + } //Z#113 +, /* America/Guadeloupe */ :array { + :intvector { -1848254032 } + :intvector { -14400, 0 } + :bin { "00" } + } //Z#114 +, /* America/Guatemala */ :array { + :intvector { -1617040676, 123055200, 130914000, 422344800, 433054800, 669708000, 684219600 } + :intvector { -21600, 0, -21600, 3600 } + :bin { "00010001000100" } + } //Z#115 +, /* America/Guayaquil */ :array { + :intvector { -1230749160 } + :intvector { -18000, 0 } + :bin { "00" } + } //Z#116 +, /* America/Guyana */ :array { + :intvector { -1730578040, -113688900, 176010300, 662698800 } + :intvector { -14400, 0, -13500, 0, -10800, 0 } + :bin { "01010200" } + } //Z#117 +, /* America/Halifax */ :array { + :intvector { -2131645536, -1696276800, -1680469200, -1632074400, -1614798000, -1566763200, -1557090000, -1535486400, -1524949200, -1504468800, -1493413200, -1472414400, -1461963600, -1440964800, -1429390800, -1409515200, -1396731600, -1376856000, -1366491600, -1346616000, -1333832400, -1313956800, -1303678800, -1282507200, -1272661200, -1251057600, -1240088400, -1219608000, -1207429200, -1188763200, -1175979600, -1157313600, -1143925200, -1124049600, -1113771600, -1091390400, -1081026000, -1059854400, -1050786000, -1030910400, -1018126800, -999460800, -986677200, -965592000, -955227600, -935956800, -923173200, -904507200, -891723600, -880221600, -769395600, -765399600, -747252000, -733950000, -715802400, -702500400, -684352800, -671050800, -652903200, -639601200, -589399200, -576097200, -557949600, -544647600, -526500000, -513198000, -495050400, -481748400, -431546400, -418244400, -400096800, -386794800, -368647200, -355345200, -337197600, -323895600, -242244000, -226522800, -210794400, -195073200, -179344800, -163623600, -147895200, -131569200, -116445600, -100119600, -84391200, -68670000, -52941600, -37220400, -21492000, -5770800, 9957600, 25678800, 41407200, 57733200, 73461600, 89182800, 104911200, 120632400, 136360800, 152082000, 167810400, 183531600, 199260000, 215586000, 230709600, 247035600, 262764000, 278485200, 294213600, 309934800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800 } + :intvector { -14400, 0, -14400, 3600 } + :bin { "000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000101000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + "Canada" + :intvector { -14400, 1987 } + :intvector { 118, 338, 544 } + } //Z#118 +, /* America/Havana */ :array { + :intvector { -1402813824, -1311534000, -1300996800, -933534000, -925675200, -902084400, -893620800, -870030000, -862171200, -775681200, -767822400, -744231600, -736372800, -144702000, -134251200, -113425200, -102542400, -86295600, -72907200, -54154800, -41457600, -21495600, -5774400, 9954000, 25675200, 41403600, 57729600, 73458000, 87364800, 104907600, 118900800, 136357200, 150436800, 167806800, 183528000, 199256400, 215582400, 230706000, 247032000, 263365200, 276667200, 290581200, 308721600, 322030800, 340171200, 358318800, 371620800, 389768400, 403070400, 421218000, 434520000, 452667600, 466574400, 484117200, 498024000, 511333200, 529473600, 542782800, 560923200, 574837200, 592372800, 606286800, 623822400, 638946000, 655876800, 671000400, 687330000, 702450000, 718779600, 733899600, 750229200, 765349200, 781678800, 796798800, 813128400, 828853200, 844578000, 860302800, 876632400, 891147600, 909291600, 922597200, 941346000 } + :intvector { -18000, 0, -18000, 3600 } + :bin { "0001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + "Cuba" + :intvector { -18000, 2000 } + :intvector { 119, 349 } + } //Z#119 +, /* America/Hermosillo */ :array { + :intvector { -1514739600, -1343066400, -1234807200, -1220292000, -1207159200, -1191344400, -873828000, -661539600, 28800, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400 } + :intvector { -28800, 0, -25200, 0, -25200, 3600, -21600, 0 } + :bin { "010301030103010001020102010201" } + } //Z#120 +, /* America/Indiana/Indianapolis */ :int { 125 } //Z#121 +, /* America/Indiana/Knox */ :array { + :intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -769395600, -765392400, -715795200, -702493200, -684345600, -671043600, -652896000, -639594000, -620841600, -608144400, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -447267600, -431539200, -415818000, -400089600, -386787600, -368640000, -355338000, -337190400, -321469200, -305740800, -289414800, -273686400, -257965200, -242236800, -195066000, -84384000, -68662800, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800 } + :intvector { -21600, 0, -21600, 3600, -18000, 0 } + :bin { "0100010001010001000100010001000100010001000100010001000100010001000100010002000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000102" } + :intvector { 122, 133, 565 } + } //Z#122 +, /* America/Indiana/Marengo */ :array { + :intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -769395600, -765392400, -589392000, -576090000, -495043200, -481741200, -463593600, -450291600, -431539200, -418237200, -400089600, -386787600, -368640000, -355338000, -337190400, -323888400, -305740800, -292438800, -273686400, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 126687600, 152089200, 162370800, 183535200 } + :intvector { -21600, 0, -21600, 3600, -18000, 0, -18000, 3600 } + :bin { "0100010001010001000100010001000100010001000100020302030203020302030201020302" } + } //Z#123 +, /* America/Indiana/Vevay */ :array { + :intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -769395600, -765392400, -495043200, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400 } + :intvector { -21600, 0, -21600, 3600, -18000, 0, -18000, 3600 } + :bin { "01000100010100020302030203020302" } + } //Z#124 +, /* America/Indianapolis */ :array { + :intvector { -1633276800, -1615136400, -1601827200, -1583686800, -900259200, -891795600, -880214400, -769395600, -765392400, -747244800, -733942800, -715795200, -702493200, -684345600, -671043600, -652896000, -639594000, -620841600, -608144400, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -386787600, -368640000, -21488400, -5767200, 9961200, 25682400 } + :intvector { -21600, 0, -21600, 3600, -18000, 0, -18000, 3600 } + :bin { "01000100010001010001000100010001000100010001000100010002000203020302" } + :intvector { 107, 121, 125, 353, 455, 547, 562 } + } //Z#125 +, /* America/Inuvik */ :array { + :intvector { -1632060000, -1615129200, -1596981600, -1583168400, -880207200, -769395600, -765385200, -147888000, -131558400, 294228000, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600 } + :intvector { -28800, 0, -28800, 3600, -28800, 7200, -25200, 0, -25200, 3600 } + :bin { "010001000101000200030403040304030403040304030403" } + "NT_YK" + :intvector { -25200, 1987 } + } //Z#126 +, /* America/Iqaluit */ :array { + :intvector { -1632070800, -1615140000, -1596992400, -1583179200, -880218000, -769395600, -765396000, -147898800, -131569200, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400 } + :intvector { -18000, 0, -18000, 3600, -18000, 7200 } + :bin { "0100010001010002000100010001000100010001000100" } + "Canada" + :intvector { -18000, 1987 } + } //Z#127 +, /* America/Jamaica */ :array { + :intvector { -1827687168, 136364400, 152085600, 162370800, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600 } + :intvector { -18000, 0, -18000, 3600 } + :bin { "000100010001000100010001000100010001000100" } + :intvector { 128, 472 } + } //Z#128 +, /* America/Jujuy */ :int { 66 } //Z#129 +, /* America/Juneau */ :array { + :intvector { -880207200, -769395600, -765385200, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 152096400, 162381600, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 439030800, 452084400, 467805600, 483534000, 499255200, 514983600, 530704800 } + :intvector { -32400, 0, -32400, 3600, -28800, 0, -28800, 3600 } + :bin { "03030203020302030203020302030203020302030203020302030203020302030000010001000100" } + "US" + :intvector { -32400, 1987 } + } //Z#130 +, /* America/Kentucky/Louisville */ :int { 137 } //Z#131 +, /* America/Kentucky/Monticello */ :array { + :intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -769395600, -765392400, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000 } + :intvector { -21600, 0, -21600, 3600 } + :bin { "010001000101000100010001000100010001000100010001000100010001000100010001000100010001000100" } + "US" + :intvector { -18000, 1987 } + } //Z#132 +, /* America/Knox_IN */ :int { 122 } //Z#133 +, /* America/La_Paz */ :array { + :intvector { -1205954844, -1192307244 } + :intvector { -16356, 3600, -14400, 0 } + :bin { "0001" } + } //Z#134 +, /* America/Lima */ :array { + :intvector { -1938538284, -1009825200, -1002052800, -986756400, -971035200, -955306800, -939585600, 504939600, 512712000, 536475600, 544248000, 631170000, 638942400, 757400400, 765172800 } + :intvector { -18000, 0, -18000, 3600 } + :bin { "000100010001000100010001000100" } + } //Z#135 +, /* America/Los_Angeles */ :array { + :intvector { -1633269600, -1615129200, -1601820000, -1583679600, -880207200, -769395600, -765385200, -687967200, -662655600, -620834400, -608137200, -589384800, -576082800, -557935200, -544633200, -526485600, -513183600, -495036000, -481734000, -463586400, -450284400, -431532000, -418230000, -400082400, -386780400, -368632800, -355330800, -337183200, -323881200, -305733600, -292431600, -273679200, -260982000, -242229600, -226508400, -210780000, -195058800, -179330400, -163609200, -147880800, -131554800, -116431200, -100105200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 152096400, 162381600, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200 } + :intvector { -28800, 0, -28800, 3600 } + :bin { "0100010001010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + "US" + :intvector { -28800, 1987 } + :intvector { 136, 495, 496, 553, 568, 569 } + } //Z#136 +, /* America/Louisville */ :array { + :intvector { -1633276800, -1615136400, -1601827200, -1583686800, -1535904000, -1525280400, -905097600, -891795600, -880214400, -769395600, -765392400, -757360800, -744224400, -715795200, -608144400, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -450291600, -431539200, -415818000, -400089600, -384368400, -368640000, -352918800, -337190400, -321469200, -305740800, -289414800, -273686400, -266432400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 126687600, 152089200, 162370800, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400 } + :intvector { -21600, 0, -21600, 3600, -18000, 0, -18000, 3600 } + :bin { "010001000100010001010001000100010001000100010001000100010001000100010001020302030203020302030203020102030203020302030203020302030203020302030203020302" } + "US" + :intvector { -18000, 1987 } + :intvector { 131, 137 } + } //Z#137 +, /* America/Maceio */ :array { + :intvector { -1767217028, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 813726000, 824004000, 938919600, 951616800, 970974000, 972180000, 1003028400, 1013911200 } + :intvector { -10800, 0, -10800, 3600 } + :bin { "0001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + } //Z#138 +, /* America/Managua */ :array { + :intvector { -1121105688, 105084000, 161758800, 290584800, 299134800, 322034400, 330584400, 694260000, 717310800, 725882400, 912488400 } + :intvector { -21600, 0, -21600, 3600, -18000, 0 } + :bin { "0002000100010001000200" } + } //Z#139 +, /* America/Manaus */ :array { + :intvector { -1767211196, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 750830400, 761713200 } + :intvector { -14400, 0, -14400, 3600 } + :bin { "00010001000100010001000100010001000100010001000100010001000100" } + :intvector { 140, 331 } + } //Z#140 +, /* America/Martinique */ :array { + :intvector { -1851537340, 323841600, 338958000 } + :intvector { -14400, 0, -14400, 3600 } + :bin { "000100" } + } //Z#141 +, /* America/Mazatlan */ :array { + :intvector { -1514739600, -1343066400, -1234807200, -1220292000, -1207159200, -1191344400, -873828000, -661539600, 28800, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 989139600, 1001836800 } + :intvector { -28800, 0, -25200, 0, -25200, 3600, -21600, 0 } + :bin { "010301030103010001020102010201020102010201" } + "Mexico" + :intvector { -25200, 2002 } + :intvector { 142, 481 } + } //Z#142 +, /* America/Mendoza */ :int { 68 } //Z#143 +, /* America/Menominee */ :array { + :intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -769395600, -765392400, -747244800, -733942800, -116438400, -100112400, -21484800, 104914800, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000 } + :intvector { -21600, 0, -21600, 3600, -18000, 0 } + :bin { "01000100010100010001000201000100010001000100010001000100010001000100010001000100" } + "US" + :intvector { -21600, 1987 } + } //Z#144 +, /* America/Merida */ :array { + :intvector { -1514743200, 377935200, 407653200, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 989136000, 1001833200 } + :intvector { -21600, 0, -21600, 3600, -18000, 0 } + :bin { "000200010001000100010001000100" } + "Mexico" + :intvector { -21600, 2002 } + } //Z#145 +, /* America/Mexico_City */ :array { + :intvector { -1514739600, -1343066400, -1234807200, -1220292000, -1207159200, -1191344400, -975261600, -963169200, -917114400, -907354800, -821901600, -810068400, -627501600, -612990000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 989136000, 1001833200 } + :intvector { -25200, 0, -21600, 0, -21600, 3600 } + :bin { "0001000100010201020102010201020102010201020102010201" } + "Mexico" + :intvector { -21600, 2002 } + :intvector { 146, 482 } + } //Z#146 +, /* America/Miquelon */ :array { + :intvector { -1850328920, 326001600 } + :intvector { -14400, 0, -10800, 0 } + :bin { "0001" } + "Canada" + :intvector { -10800, 1987 } + } //Z#147 +, /* America/Monterrey */ :array { + :intvector { -1514743200, 576057600, 594198000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 989136000, 1001833200 } + :intvector { -21600, 0, -21600, 3600 } + :bin { "000100010001000100010001000100" } + "Mexico" + :intvector { -21600, 2002 } + } //Z#148 +, /* America/Montevideo */ :array { + :intvector { -1567455316, -1459542600, -1443819600, -1428006600, -1412283600, -1396470600, -1380747600, -1141590600, -1128286800, -1110141000, -1096837200, -1078691400, -1065387600, -1046637000, -1033938000, -1015187400, -1002488400, -983737800, -971038800, -952288200, -938984400, -920838600, -907534800, -883600200, -853621200, -845848800, -334789200, -319672800, -314226000, -309996000, -149720400, -134604000, -118270800, -100044000, -86821200, -68508000, -50446800, -34119000, -18910800, -2583000, 12625200, 28953000, 72932400, 82692000, 132116400, 156911400, 212983200, 250052400, 260244000, 307594800, 325994400, 566449200, 574308000, 597812400, 605671200, 625633200, 636516000, 656478000, 667965600, 688532400, 699415200, 719377200, 730864800, 1095562800, 1110679200 } + :intvector { -12600, 0, -12600, 1800, -10800, 0, -10800, 1800, -10800, 3600 } + :bin { "0001000100010001000100010001000100010001000100010402040204020402040204020302030203020402030402040204020402040204020402040204020402" } + } //Z#149 +, /* America/Montreal */ :array { + :intvector { -1665334800, -1662753600, -1632070800, -1614794400, -1601742600, -1583775000, -1567355400, -1554053400, -1535907600, -1522603800, -1504458000, -1491154200, -1439830800, -1428255000, -1409504400, -1396805400, -1378054800, -1365355800, -1346612400, -1333915200, -1315162800, -1301860800, -1283713200, -1270411200, -1252263600, -1238961600, -1220814000, -1207512000, -1188759600, -1176062400, -1157310000, -1144008000, -1125860400, -1112558400, -1094410800, -1081108800, -1062961200, -1049659200, -1031511600, -1018209600, -1000062000, -986760000, -968007600, -955310400, -936558000, -880218000, -769395600, -765396000, -747248400, -733946400, -715798800, -702496800, -684349200, -671047200, -652899600, -636573600, -620845200, -605124000, -589395600, -576093600, -557946000, -544644000, -526496400, -513194400, -495046800, -481744800, -463597200, -450295200, -431542800, -418240800, -400093200, -384372000, -368643600, -352922400, -337194000, -321472800, -305744400, -289418400, -273690000, -257968800, -242240400, -226519200, -210790800, -195069600, -179341200, -163620000, -147891600, -131565600, -116442000, -100116000, -84387600, -68666400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 136364400, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400 } + :intvector { -18000, 0, -18000, 3600 } + :bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000101010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + "Canada" + :intvector { -18000, 1987 } + } //Z#150 +, /* America/Montserrat */ :array { + :intvector { -1846266608 } + :intvector { -14400, 0 } + :bin { "00" } + } //Z#151 +, /* America/Nassau */ :array { + :intvector { -1825095036, -179341200, -163620000, -147891600, -131565600, -116442000, -100116000, -84387600, -68666400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 136364400, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400 } + :intvector { -18000, 0, -18000, 3600 } + :bin { "0001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + "Bahamas" + :intvector { -18000, 1987 } + } //Z#152 +, /* America/New_York */ :array { + :intvector { -1633280400, -1615140000, -1601830800, -1583690400, -1570381200, -1551636000, -1536512400, -1523210400, -1504458000, -1491760800, -1473008400, -1459706400, -1441558800, -1428256800, -1410109200, -1396807200, -1378659600, -1365357600, -1347210000, -1333908000, -1315155600, -1301853600, -1283706000, -1270404000, -1252256400, -1238954400, -1220806800, -1207504800, -1189357200, -1176055200, -1157302800, -1144605600, -1125853200, -1112551200, -1094403600, -1081101600, -1062954000, -1049652000, -1031504400, -1018202400, -1000054800, -986752800, -968000400, -955303200, -936550800, -923248800, -905101200, -891799200, -880218000, -769395600, -765396000, -747248400, -733946400, -715798800, -702496800, -684349200, -671047200, -652899600, -639597600, -620845200, -608148000, -589395600, -576093600, -557946000, -544644000, -526496400, -513194400, -495046800, -481744800, -463597200, -447271200, -431542800, -415821600, -400093200, -384372000, -368643600, -352922400, -337194000, -321472800, -305744400, -289418400, -273690000, -257968800, -242240400, -226519200, -210790800, -195069600, -179341200, -163620000, -147891600, -131565600, -116442000, -100116000, -84387600, -68666400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 126687600, 152085600, 162370800, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400 } + :intvector { -18000, 0, -18000, 3600 } + :bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + "US" + :intvector { -18000, 1987 } + :intvector { 153, 354, 548, 563 } + } //Z#153 +, /* America/Nipigon */ :array { + :intvector { -1632070800, -1614794400, -923252400, -880218000, -769395600, -765396000, 136364400, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400 } + :intvector { -18000, 0, -18000, 3600 } + :bin { "0100010101000100010001000100010001000100010001000100010001000100" } + "Canada" + :intvector { -18000, 1987 } + } //Z#154 +, /* America/Nome */ :array { + :intvector { -880196400, -769395600, -765374400, -86878800, -21466800, -5745600, 9982800, 25704000, 41432400, 57758400, 73486800, 89208000, 104936400, 120657600, 126709200, 152107200, 162392400, 183556800, 199285200, 215611200, 230734800, 247060800, 262789200, 278510400, 294238800, 309960000, 325688400, 341409600, 357138000, 372859200, 388587600, 404913600, 420037200, 436363200, 439030800, 452084400, 467805600, 483534000, 499255200, 514983600, 530704800 } + :intvector { -39600, 0, -39600, 3600, -32400, 0, -32400, 3600 } + :bin { "0101000001000100010001000100010001000100010001000100010001000100010202030203020302" } + "US" + :intvector { -32400, 1987 } + } //Z#155 +, /* America/Noronha */ :array { + :intvector { -1767217820, -1206961200, -1191366000, -1175378400, -1159830000, -633823200, -622072800, -602287200, -591836400, -570751200, -560214000, -539128800, -531356400, -191368800, -184201200, -155167200, -150073200, -128901600, -121129200, -99957600, -89593200, -68421600, -57970800, 499744800, 511232400, 530589600, 540262800, 562125600, 571194000, 592970400, 602038800, 624420000, 634698000, 938916000, 951613200, 970970400, 971571600, 1003024800, 1013907600 } + :intvector { -7200, 0, -7200, 3600 } + :bin { "000100010001000100010001000100010001000100010001000100010001000100010001000100" } + :intvector { 156, 329 } + } //Z#156 +, /* America/North_Dakota/Center */ :array { + :intvector { -1633273200, -1615132800, -1601823600, -1583683200, -880210800, -769395600, -765388800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 152092800, 162378000, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600 } + :intvector { -25200, 0, -25200, 3600 } + :bin { "0100010001010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + "US" + :intvector { -21600, 1987 } + } //Z#157 +, /* America/Panama */ :array { + :intvector { -1946918424 } + :intvector { -18000, 0 } + :bin { "00" } + } //Z#158 +, /* America/Pangnirtung */ :array { + :intvector { -1632074400, -1615143600, -1596996000, -1583182800, -880221600, -769395600, -765399600, -147902400, -131572800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800 } + :intvector { -14400, 0, -14400, 3600, -14400, 7200 } + :bin { "0100010001010002000100010001000100010001000100" } + "Canada" + :intvector { -18000, 1987 } + } //Z#159 +, /* America/Paramaribo */ :array { + :intvector { -1861906760, -1104524348, -765317964, 185686200, 465449400 } + :intvector { -13252, 0, -13236, 0, -12600, 0, -10800, 0 } + :bin { "0001020203" } + } //Z#160 +, /* America/Phoenix */ :array { + :intvector { -1633273200, -1615132800, -1601823600, -1583683200, -880210800, -820519140, -812653140, -796845540, -84380400, -68659200 } + :intvector { -25200, 0, -25200, 3600 } + :bin { "01000100010001000100" } + :intvector { 161, 478, 492, 550, 560 } + } //Z#161 +, /* America/Port-au-Prince */ :array { + :intvector { -1670483460, 421218000, 436334400, 452062800, 467784000, 483512400, 499233600, 514962000, 530683200, 546411600, 562132800, 576050400, 594194400, 607500000, 625644000, 638949600, 657093600, 671004000, 688543200, 702453600, 719992800, 733903200, 752047200, 765352800, 783496800, 796802400, 814946400, 828856800, 846396000, 860306400, 877845600 } + :intvector { -18000, 0, -18000, 3600 } + :bin { "00010001000100010001000100010001000100010001000100010001000100" } + } //Z#162 +, /* America/Port_of_Spain */ :array { + :intvector { -1825098836 } + :intvector { -14400, 0 } + :bin { "00" } + } //Z#163 +, /* America/Porto_Acre */ :int { 171 } //Z#164 +, /* America/Porto_Velho */ :array { + :intvector { -1767210264, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200 } + :intvector { -14400, 0, -14400, 3600 } + :bin { "0001000100010001000100010001000100010001000100010001000100" } + } //Z#165 +, /* America/Puerto_Rico */ :array { + :intvector { -873057600, -765399600 } + :intvector { -14400, 0, -14400, 3600 } + :bin { "0100" } + :intvector { 166, 494, 543 } + } //Z#166 +, /* America/Rainy_River */ :array { + :intvector { -1632067200, -1614790800, -923248800, -880214400, -769395600, -765392400, 136368000, 152089200, 167817600, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000 } + :intvector { -21600, 0, -21600, 3600 } + :bin { "0100010101000100010001000100010001000100010001000100010001000100" } + "Canada" + :intvector { -21600, 1987 } + } //Z#167 +, /* America/Rankin_Inlet */ :array { + :intvector { -1632067200, -1615136400, -1596988800, -1583175600, -880214400, -769395600, -765392400, -147895200, -131565600, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000 } + :intvector { -21600, 0, -21600, 3600, -21600, 7200 } + :bin { "0100010001010002000100010001000100010001000100" } + "Canada" + :intvector { -21600, 1987 } + } //Z#168 +, /* America/Recife */ :array { + :intvector { -1767217224, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 938919600, 951616800, 970974000, 971575200, 1003028400, 1013911200 } + :intvector { -10800, 0, -10800, 3600 } + :bin { "000100010001000100010001000100010001000100010001000100010001000100010001000100" } + } //Z#169 +, /* America/Regina */ :array { + :intvector { -2030202084, -1632063600, -1614787200, -1251651600, -1238349600, -1220202000, -1206900000, -1188752400, -1175450400, -1156698000, -1144000800, -1125248400, -1111946400, -1032714000, -1016992800, -1001264400, -986148000, -969814800, -954093600, -937760400, -922039200, -906310800, -890589600, -880210800, -769395600, -765388800, -748450800, -732729600, -715791600, -702489600, -684342000, -671040000, -652892400, -639590400, -620838000, -608140800, -589388400, -576086400, -557938800, -544636800, -526489200, -513187200, -495039600, -481737600, -463590000, -450288000, -431535600, -418233600, -400086000, -386784000, -337186800, -321465600, -305737200 } + :intvector { -25200, 0, -25200, 3600, -21600, 0 } + :bin { "0001000100010001000100010001000100010001000100010100010001000100010001000100010001000100010001000100010002" } + :intvector { 170, 340, 345, 545 } + } //Z#170 +, /* America/Rio_Branco */ :array { + :intvector { -1767209328, -1206950400, -1191355200, -1175367600, -1159819200, -633812400, -622062000, -602276400, -591825600, -570740400, -560203200, -539118000, -531345600, -191358000, -184190400, -155156400, -150062400, -128890800, -121118400, -99946800, -89582400, -68410800, -57960000, 499755600, 511243200, 530600400, 540273600, 562136400, 571204800 } + :intvector { -18000, 0, -18000, 3600 } + :bin { "0001000100010001000100010001000100010001000100010001000100" } + :intvector { 164, 171, 328 } + } //Z#171 +, /* America/Rosario */ :int { 65 } //Z#172 +, /* America/Santiago */ :array { + :intvector { -1893439040, -1619982000, -1593720000, -1335985200, -1317585600, -1304362800, -1286049600, -1272826800, -1254513600, -1241290800, -1222977600, -1209754800, -1191355200, -1178132400, -101937600, -88635600, -69883200, -57186000, -38433600, -25736400, -6984000, 6318000, 24465600, 37767600, 55915200, 69217200, 87969600, 100666800, 119419200, 132116400, 150868800, 163566000, 182318400, 195620400, 213768000, 227070000, 245217600, 258519600, 277272000, 289969200, 308721600, 321418800, 340171200, 353473200, 371620800, 384922800, 403070400, 416372400, 434520000, 447822000, 466574400, 479271600, 498024000, 510721200, 529473600, 542775600, 560923200, 574225200, 592372800, 605674800, 624427200, 637124400, 655876800, 668574000, 687326400, 700628400, 718776000, 732078000, 750225600, 763527600, 781675200, 794977200, 813729600, 826426800, 845179200, 857876400, 876628800, 889930800, 906868800, 923194800, 939528000 } + :intvector { -18000, 0, -18000, 3600, -14400, 0, -14400, 3600 } + :bin { "000100010001000100010001000203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203" } + "Chile" + :intvector { -14400, 2000 } + :intvector { 173, 347 } + } //Z#173 +, /* America/Santo_Domingo */ :array { + :intvector { -1159773600, -100119600, -89668800, -5770800, 4422600, 25678800, 33193800, 57733200, 64816200, 89182800, 96438600, 120632400, 127974600, 152082000, 972799200, 975823200 } + :intvector { -18000, 0, -18000, 1800, -18000, 3600, -14400, 0 } + :bin { "00020001000100010001000100030003" } + } //Z#174 +, /* America/Sao_Paulo */ :array { + :intvector { -1767214412, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -195426000, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 656478000, 666756000, 687927600, 697600800, 719982000, 728445600, 750826800, 761709600, 782276400, 793159200, 813726000, 824004000, 844570800, 856058400, 876106800, 888717600, 908074800, 919562400, 938919600, 951616800, 970974000, 982461600, 1003028400, 1013911200, 1036292400, 1045360800, 1066532400, 1076810400, 1099364400 } + :intvector { -10800, 0, -10800, 3600 } + :bin { "0001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001" } + "Brazil" + :intvector { -10800, 2005 } + :intvector { 175, 326, 330 } + } //Z#175 +, /* America/Scoresbysund */ :array { + :intvector { -1686090660, 323841600, 338961600, 354679200, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { -7200, 0, -7200, 3600, -3600, 0, -3600, 3600 } + :bin { "000100030203020302030203020302030203020302030203020302030203020302" } + "EU" + :intvector { -3600, 1996 } + } //Z#176 +, /* America/Shiprock */ :int { 100 } //Z#177 +, /* America/St_Johns */ :array { + :intvector { -1664130548, -1650137348, -1632076148, -1614799748, -1598650148, -1590100148, -1567286948, -1551565748, -1535837348, -1520116148, -1503782948, -1488666548, -1472333348, -1457216948, -1440883748, -1425767348, -1409434148, -1394317748, -1377984548, -1362263348, -1346534948, -1330813748, -1314480548, -1299364148, -1283030948, -1267914548, -1251581348, -1236464948, -1220131748, -1205015348, -1188682148, -1172960948, -1156627748, -1141511348, -1125178148, -1110061748, -1096921748, -1093728600, -1078612200, -1061670600, -1048973400, -1030221000, -1017523800, -998771400, -986074200, -966717000, -954624600, -935267400, -922570200, -903817800, -891120600, -872368200, -769395600, -765401400, -746044200, -733347000, -714594600, -701897400, -683145000, -670447800, -651695400, -638998200, -619641000, -606943800, -589401000, -576099000, -557951400, -544649400, -526501800, -513199800, -495052200, -481750200, -463602600, -450300600, -431548200, -418246200, -400098600, -386796600, -368649000, -355347000, -337199400, -323897400, -305749800, -289423800, -273695400, -257974200, -242245800, -226524600, -210796200, -195075000, -179346600, -163625400, -147897000, -131571000, -116447400, -100121400, -84393000, -68671800, -52943400, -37222200, -21493800, -5772600, 9955800, 25677000, 41405400, 57731400, 73459800, 89181000, 104909400, 120630600, 136359000, 152080200, 167808600, 183529800, 199258200, 215584200, 230707800, 247033800, 262762200, 278483400, 294211800, 309933000, 325661400, 341382600, 357111000, 372832200, 388560600, 404886600, 420010200, 436336200, 452064600, 467785800, 483514200, 499235400, 514963800, 530685000, 544591860, 562127460, 576041460, 594178260 } + :intvector { -12652, 0, -12652, 3600, -12600, 0, -12600, 3600, -12600, 7200 } + :bin { "0100010001000100010001000100010001000100010001000100010001000100010001000203020302030203020302030203020303020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020402" } + "StJohns" + :intvector { -12600, 1989 } + :intvector { 178, 334, 343 } + } //Z#178 +, /* America/St_Kitts */ :array { + :intvector { -1825098548 } + :intvector { -14400, 0 } + :bin { "00" } + } //Z#179 +, /* America/St_Lucia */ :array { + :intvector { -1830369360 } + :intvector { -14400, 0 } + :bin { "00" } + } //Z#180 +, /* America/St_Thomas */ :array { + :intvector { -1846266016 } + :intvector { -14400, 0 } + :bin { "00" } + :intvector { 181, 191 } + } //Z#181 +, /* America/St_Vincent */ :array { + :intvector { -1830369304 } + :intvector { -14400, 0 } + :bin { "00" } + } //Z#182 +, /* America/Swift_Current */ :array { + :intvector { -2030201320, -1632063600, -1614787200, -880210800, -769395600, -765388800, -747241200, -732729600, -715791600, -702489600, -684342000, -671040000, -652892400, -639590400, -400086000, -384364800, -337186800, -321465600, -305737200, -292435200, -273682800, -260985600, 73472400 } + :intvector { -25200, 0, -25200, 3600, -21600, 0 } + :bin { "0001000101000100010001000100010001000100010002" } + } //Z#183 +, /* America/Tegucigalpa */ :array { + :intvector { -1538503868, 547020000, 559717200, 578469600, 591166800 } + :intvector { -21600, 0, -21600, 3600 } + :bin { "0001000100" } + } //Z#184 +, /* America/Thule */ :array { + :intvector { -1686079492, 670399200, 686120400, 701848800, 717570000 } + :intvector { -14400, 0, -14400, 3600 } + :bin { "0001000100" } + "Thule" + :intvector { -14400, 1993 } + } //Z#185 +, /* America/Thunder_Bay */ :array { + :intvector { -1893434400, -880218000, -769395600, -765396000, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 136364400, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400 } + :intvector { -18000, 0, -18000, 3600 } + :bin { "000101000100010001000100010001000100010001000100010001000100010001000100" } + "Canada" + :intvector { -18000, 1987 } + } //Z#186 +, /* America/Tijuana */ :array { + :intvector { -1514736000, -1451667600, -1343062800, -1234803600, -1222963200, -1207242000, -873820800, -761677200, -686073600, -661539600, -495036000, -481734000, -463586400, -450284400, -431532000, -418230000, -400082400, -386780400, -368632800, -355330800, -337183200, -323881200, -305733600, -292431600, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600 } + :intvector { -28800, 0, -28800, 3600, -25200, 0 } + :bin { "02000200010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + "Mexico" + :intvector { -28800, 2002 } + :intvector { 106, 187, 480 } + } //Z#187 +, /* America/Toronto */ :array { + :intvector { -1632070800, -1614794400, -1601753400, -1583697600, -1567357200, -1554667200, -1534698000, -1524074400, -1503248400, -1492365600, -1471798800, -1460916000, -1440954000, -1428861600, -1409504400, -1397412000, -1378054800, -1365962400, -1346605200, -1333908000, -1315155600, -1301853600, -1283706000, -1270404000, -1252256400, -1238954400, -1220806800, -1207504800, -1188752400, -1176055200, -1157302800, -1144000800, -1125853200, -1112551200, -1094403600, -1081101600, -1062954000, -1049652000, -1031504400, -1018202400, -1000054800, -986752800, -968000400, -955303200, -936550800, -880218000, -769395600, -765396000, -747248400, -733946400, -715806000, -702504000, -684356400, -671054400, -652906800, -634161600, -620845200, -602704800, -589395600, -576093600, -557946000, -544644000, -526496400, -513194400, -495046800, -481744800, -463597200, -450295200, -431542800, -418240800, -400093200, -384372000, -368643600, -352922400, -337194000, -321472800, -305744400, -289418400, -273690000, -257968800, -242240400, -226519200, -210790800, -195069600, -179341200, -163620000, -147891600, -131565600, -116442000, -100116000, -84387600, -68666400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 136364400, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400 } + :intvector { -18000, 0, -18000, 3600 } + :bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000101010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + "Canada" + :intvector { -18000, 1987 } + :intvector { 188, 341 } + } //Z#188 +, /* America/Tortola */ :array { + :intvector { -1846266092 } + :intvector { -14400, 0 } + :bin { "00" } + } //Z#189 +, /* America/Vancouver */ :array { + :intvector { -1632060000, -1614783600, -880207200, -769395600, -765385200, -747237600, -732726000, -715788000, -702486000, -684338400, -671036400, -652888800, -639586800, -620834400, -608137200, -589384800, -576082800, -557935200, -544633200, -526485600, -513183600, -495036000, -481734000, -463586400, -450284400, -431532000, -418230000, -400082400, -386780400, -368632800, -355330800, -337183200, -323881200, -305733600, -292431600, -273679200, -260982000, -242229600, -226508400, -210780000, -195058800, -179330400, -163609200, -147880800, -131554800, -116431200, -100105200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 136375200, 152096400, 167824800, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200 } + :intvector { -28800, 0, -28800, 3600 } + :bin { "010001010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + "Vanc" + :intvector { -28800, 1987 } + :intvector { 190, 344 } + } //Z#190 +, /* America/Virgin */ :int { 181 } //Z#191 +, /* America/Whitehorse */ :array { + :intvector { -1632056400, -1615125600, -1596978000, -1583164800, -880203600, -769395600, -765381600, -147884400, -131554800, -110552400, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200 } + :intvector { -32400, 0, -32400, 3600, -32400, 7200, -28800, 0, -28800, 3600 } + :bin { "010001000101000200030403040304030403040304030403" } + "NT_YK" + :intvector { -28800, 1987 } + :intvector { 192, 346 } + } //Z#192 +, /* America/Winnipeg */ :array { + :intvector { -1694368800, -1681671600, -1632067200, -1614790800, -1029686400, -1018198800, -880214400, -769395600, -765392400, -746035200, -732733200, -715795200, -702493200, -684345600, -671043600, -652896000, -639594000, -620755200, -607626000, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -450291600, -431539200, -418237200, -400089600, -386787600, -368640000, -355338000, -337190400, -321469200, -305740800, -292438800, -210787200, -198090000, -116438400, -100112400, -84384000, -68662800, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 136368000, 152089200, 167817600, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000 } + :intvector { -21600, 0, -21600, 3600 } + :bin { "0100010001000101000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + "Winn" + :intvector { -21600, 1987 } + :intvector { 193, 339 } + } //Z#193 +, /* America/Yakutat */ :array { + :intvector { -880203600, -769395600, -765381600, -21474000, -5752800, 9975600, 25696800, 41425200, 57751200, 73479600, 89200800, 104929200, 120650400, 126702000, 152100000, 162385200, 183549600, 199278000, 215604000, 230727600, 247053600, 262782000, 278503200, 294231600, 309952800, 325681200, 341402400, 357130800, 372852000, 388580400, 404906400, 420030000, 436356000, 439030800, 452084400, 467805600, 483534000, 499255200, 514983600, 530704800 } + :intvector { -32400, 0, -32400, 3600 } + :bin { "01010001000100010001000100010001000100010001000100010001000100010000010001000100" } + "US" + :intvector { -32400, 1987 } + } //Z#194 +, /* America/Yellowknife */ :array { + :intvector { -1632063600, -1615132800, -1596985200, -1583172000, -880210800, -769395600, -765388800, -147891600, -131562000, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600 } + :intvector { -25200, 0, -25200, 3600, -25200, 7200 } + :bin { "0100010001010002000100010001000100010001000100" } + "NT_YK" + :intvector { -25200, 1987 } + } //Z#195 +, /* Antarctica/Casey */ :array { + :intvector { -31536000 } + :intvector { 28800, 0 } + :bin { "00" } + } //Z#196 +, /* Antarctica/Davis */ :array { + :intvector { -409190400, -163062000, -28857600 } + :intvector { 0, 0, 25200, 0 } + :bin { "010001" } + } //Z#197 +, /* Antarctica/DumontDUrville */ :array { + :intvector { -725846400, -566992800, -415497600 } + :intvector { 0, 0, 36000, 0 } + :bin { "010001" } + } //Z#198 +, /* Antarctica/Mawson */ :array { + :intvector { -501206400 } + :intvector { 21600, 0 } + :bin { "00" } + } //Z#199 +, /* Antarctica/McMurdo */ :array { + :intvector { -441849600, 152632800, 162309600, 183477600, 194968800, 215532000, 226418400, 246981600, 257868000, 278431200, 289317600, 309880800, 320767200, 341330400, 352216800, 372780000, 384271200, 404834400, 415720800, 436284000, 447170400, 467733600, 478620000, 499183200, 510069600, 530632800, 541519200, 562082400, 573573600, 594136800, 605023200, 623772000 } + :intvector { 43200, 0, 43200, 3600 } + :bin { "0001000100010001000100010001000100010001000100010001000100010001" } + "NZAQ" + :intvector { 43200, 1990 } + :intvector { 200, 203 } + } //Z#200 +, /* Antarctica/Palmer */ :array { + :intvector { -157766400, -152658000, -132955200, -121122000, -101419200, -86907600, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 150260400, 165981600, 181710000, 197431200, 213159600, 228880800, 389070000, 403070400, 416372400, 434520000, 447822000, 466574400, 479271600, 498024000, 510721200, 529473600, 542775600, 560923200, 574225200, 592372800, 605674800, 624427200, 637124400, 655876800, 668574000, 687326400, 700628400, 718776000, 732078000, 750225600, 763527600, 781675200, 794977200, 813729600, 826426800, 845179200, 857876400, 876628800, 889930800, 906868800, 923194800, 939528000 } + :intvector { -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } + :bin { "01000100010001000100020302030203020302000100010001000100010001000100010001000100010001000100010001000100010001" } + "ChileAQ" + :intvector { -14400, 2000 } + } //Z#201 +, /* Antarctica/Rothera */ :array { + :intvector { 218246400 } + :intvector { -10800, 0 } + :bin { "00" } + } //Z#202 +, /* Antarctica/South_Pole */ :int { 200 } //Z#203 +, /* Antarctica/Syowa */ :array { + :intvector { -407808000 } + :intvector { 10800, 0 } + :bin { "00" } + } //Z#204 +, /* Antarctica/Vostok */ :array { + :intvector { -380073600 } + :intvector { 21600, 0 } + :bin { "00" } + } //Z#205 +, /* Arctic/Longyearbyen */ :int { 421 } //Z#206 +, /* Asia/Aden */ :array { + :intvector { -631162848 } + :intvector { 10800, 0 } + :bin { "00" } + } //Z#207 +, /* Asia/Almaty */ :array { + :intvector { -1441170468, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 662666400, 701802000, 717523200, 733262400, 748987200, 764712000, 780436800, 796161600, 811886400 } + :intvector { 18000, 0, 21600, 0, 21600, 3600 } + :bin { "00010201020102010201020102010201020102010201010201020102010201" } + "RussiaAsia" + :intvector { 21600, 1996 } + } //Z#208 +, /* Asia/Amman */ :array { + :intvector { -1230776624, 108165600, 118270800, 136591200, 149806800, 168127200, 181342800, 199749600, 215643600, 231285600, 244501200, 262735200, 275950800, 481154400, 496962000, 512949600, 528670800, 544399200, 560120400, 575848800, 592174800, 610581600, 623624400, 641167200, 655074000, 671839200, 685918800, 702856800, 717973200, 733701600, 749422800, 765151200, 779662800, 797205600, 811116000, 828655200, 843170400, 860104800, 874620000, 891554400, 906069600, 930780000, 938642400 } + :intvector { 7200, 0, 7200, 3600 } + :bin { "00010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + "Jordan" + :intvector { 7200, 2000 } + } //Z#209 +, /* Asia/Anadyr */ :array { + :intvector { -1441194596, -1247572800, 354884400, 370692000, 386420400, 402231600, 417960000, 433767600, 449582400, 465314400, 481039200, 496764000, 512488800, 528213600, 543938400, 559663200, 575388000, 591112800, 606837600, 622562400, 638287200, 654616800, 670341600, 686070000, 695746800, 701780400, 717501600, 733240800, 748965600, 764690400, 780415200, 796140000, 811864800 } + :intvector { 39600, 0, 39600, 3600, 43200, 0, 43200, 3600, 46800, 0, 46800, 3600 } + :bin { "020405040302030203020302030203020302030203020100020302030203020302" } + "Russia" + :intvector { 43200, 1996 } + } //Z#210 +, /* Asia/Aqtau */ :array { + :intvector { -1441164064, -1247544000, -220942800, 370724400, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 662670000, 692823600, 701805600, 717526800, 733266000, 748990800, 764715600, 780440400, 796165200, 811893600 } + :intvector { 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } + :bin { "0002020403020302030203020302030203020302030202020302030203020100" } + "RussiaAsia" + :intvector { 14400, 1996 } + } //Z#211 +, /* Asia/Aqtobe */ :array { + :intvector { -1441165720, -1247544000, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 662670000, 692823600, 701805600, 717526800, 733266000, 748990800, 764715600, 780440400, 796165200, 811890000 } + :intvector { 14400, 0, 18000, 0, 18000, 3600, 21600, 0 } + :bin { "0001020302010201020102010201020102010201020101010201020102010201" } + "RussiaAsia" + :intvector { 18000, 1996 } + } //Z#212 +, /* Asia/Ashgabat */ :array { + :intvector { -1441166012, -1247544000, 354913200, 370720800, 386449200, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 688507200, 695772000 } + :intvector { 14400, 0, 14400, 3600, 18000, 0, 18000, 3600 } + :bin { "0002030203020302030203020302030203020302030201000002" } + :intvector { 213, 214 } + } //Z#213 +, /* Asia/Ashkhabad */ :int { 213 } //Z#214 +, /* Asia/Baghdad */ :array { + :intvector { -1641005856, 389048400, 402264000, 417906000, 433800000, 449614800, 465422400, 481150800, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622591200, 638316000, 654645600 } + :intvector { 10800, 0, 10800, 3600 } + :bin { "00010001000100010001000100010001000100" } + "Iraq" + :intvector { 10800, 1991 } + } //Z#215 +, /* Asia/Bahrain */ :array { + :intvector { -1577935340, 76190400 } + :intvector { 10800, 0, 14400, 0 } + :bin { "0100" } + } //Z#216 +, /* Asia/Baku */ :array { + :intvector { -1441163964, -405140400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622591200, 638316000, 654645600, 670370400, 683496000, 686098800, 701812800, 717534000, 717548400, 820440000, 828234000, 846378000, 852062400 } + :intvector { 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } + :bin { "0002030203020302030203020302030203020302030201010001000203030202" } + "Azer" + :intvector { 14400, 1997 } + } //Z#217 +, /* Asia/Bangkok */ :array { + :intvector { -1570084924 } + :intvector { 25200, 0 } + :bin { "00" } + } //Z#218 +, /* Asia/Beirut */ :array { + :intvector { -1570413600, -1552186800, -1538359200, -1522551600, -1507514400, -1490583600, -1473645600, -1460948400, -399866400, -386650800, -368330400, -355114800, -336794400, -323578800, -305172000, -291956400, -273636000, -260420400, 78012000, 86734800, 105055200, 118270800, 136591200, 149806800, 168127200, 181342800, 199749600, 212965200, 231285600, 244501200, 262735200, 275950800, 452210400, 466722000, 483746400, 498258000, 515282400, 529794000, 546818400, 561330000, 581119200, 592952400, 610754400, 624488400, 641512800, 656024400, 673048800, 687560400, 704671200, 718146000, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000, 828223200, 843944400, 859672800, 875394000, 891122400, 906843600 } + :intvector { 7200, 0, 7200, 3600 } + :bin { "0100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + "Lebanon" + :intvector { 7200, 1999 } + } //Z#219 +, /* Asia/Bishkek */ :array { + :intvector { -1441169904, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 683582400, 703018800, 717530400, 734468400, 748980000, 765918000, 780429600, 797367600, 811879200, 828817200, 843933600 } + :intvector { 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 } + :bin { "00020302030203020302030203020302030203020302010001000100010001000100" } + "Kirgiz" + :intvector { 18000, 1997 } + } //Z#220 +, /* Asia/Brunei */ :array { + :intvector { -1383464380, -1167636600 } + :intvector { 27000, 0, 28800, 0 } + :bin { "0001" } + } //Z#221 +, /* Asia/Calcutta */ :array { + :intvector { -891582800, -872058600, -862637400, -764145000 } + :intvector { 19800, 0, 19800, 3600, 23400, 0 } + :bin { "02000100" } + :intvector { 222, 456 } + } //Z#222 +, /* Asia/Choibalsan */ :array { + :intvector { -2032933080, 252435600, 417974400, 433778400, 449593200, 465325200, 481050000, 496774800, 512499600, 528224400, 543949200, 559674000, 575398800, 591123600, 606848400, 622573200, 638298000, 654627600, 670352400, 686077200, 701802000, 717526800, 733251600, 748976400, 764701200, 780426000, 796150800, 811875600, 828205200, 843930000, 859654800, 875379600, 891104400, 906829200, 988390800, 1001692800 } + :intvector { 25200, 0, 28800, 0, 32400, 0, 32400, 3600 } + :bin { "000103020302030203020302030203020302030203020302030203020302030203020302" } + "Mongol" + :intvector { 32400, 2002 } + } //Z#223 +, /* Asia/Chongqing */ :array { + :intvector { -1325487980, 325962000, 515520000, 527007600, 545155200, 558457200, 576604800, 589906800, 608659200, 621961200, 640108800, 653410800, 671558400, 684860400 } + :intvector { 25200, 0, 28800, 0, 28800, 3600 } + :bin { "0001020102010201020102010201" } + :intvector { 224, 225 } + } //Z#224 +, /* Asia/Chungking */ :int { 224 } //Z#225 +, /* Asia/Colombo */ :array { + :intvector { -2019705572, -883287000, -862639200, -764051400, 832962600, 846266400 } + :intvector { 19800, 0, 19800, 1800, 19800, 3600, 21600, 0, 23400, 0 } + :bin { "000102000403" } + } //Z#226 +, /* Asia/Dacca */ :int { 229 } //Z#227 +, /* Asia/Damascus */ :array { + :intvector { -1577931912, -1568592000, -1554080400, -1537142400, -1522630800, -1505692800, -1491181200, -1474243200, -1459126800, -242265600, -228877200, -210556800, -197427600, -178934400, -165718800, -147398400, -134269200, -116467200, -102646800, -84326400, -71110800, -52704000, -39488400, -21168000, -7952400, 10368000, 23583600, 41904000, 55119600, 73526400, 86742000, 105062400, 118278000, 136598400, 149814000, 168134400, 181350000, 199756800, 212972400, 231292800, 241916400, 262828800, 273452400, 418694400, 433810800, 450316800, 465433200, 508896000, 529196400, 541555200, 562633200, 574387200, 594255600, 607305600, 623199600, 638928000, 654649200, 670456800, 686264400, 702684000, 717886800, 733096800, 748904400, 765151200, 780958800, 796687200, 812494800, 828309600, 844117200, 859759200, 875653200, 891208800, 907189200 } + :intvector { 7200, 0, 7200, 3600 } + :bin { "00010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + "Syria" + :intvector { 7200, 1999 } + } //Z#228 +, /* Asia/Dhaka */ :array { + :intvector { -891582800, -872058600, -862637400, -576138600, 38772000 } + :intvector { 19800, 0, 21600, 0, 23400, 0 } + :bin { "0200020101" } + :intvector { 227, 229, 327 } + } //Z#229 +, /* Asia/Dili */ :array { + :intvector { -1830414140, -879152400, -770634000, 199897200, 969120000 } + :intvector { 28800, 0, 32400, 0 } + :bin { "0001010001" } + } //Z#230 +, /* Asia/Dubai */ :array { + :intvector { -1577936472 } + :intvector { 14400, 0 } + :bin { "00" } + } //Z#231 +, /* Asia/Dushanbe */ :array { + :intvector { -1441168512, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 684363600 } + :intvector { 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 } + :bin { "000203020302030203020302030203020302030203020100" } + } //Z#232 +, /* Asia/Gaza */ :array { + :intvector { -933645600, -857358000, -844300800, -825822000, -812685600, -794199600, -779853600, -762656400, -748310400, -731127600, -399088800, -386650800, -368330400, -355114800, -336790800, -323654400, -305168400, -292032000, -273632400, -260496000, -242096400, -228960000, -210560400, -197424000, -178938000, -165801600, -147402000, -134265600, -115866000, -102643200, -84330000, -81313200, 142380000, 150843600, 167176800, 178664400, 482277600, 495579600, 516751200, 526424400, 545436000, 558478800, 576540000, 589237200, 609890400, 620773200, 638316000, 651618000, 669765600, 683672400, 701820000, 715726800, 733701600, 747176400, 765151200, 778021200, 796600800, 810075600, 820447200, 828655200, 843170400, 860104800, 874620000, 891554400, 906069600, 915141600 } + :intvector { 7200, 0, 7200, 3600 } + :bin { "010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000001000100010000" } + "Palestine" + :intvector { 7200, 1999 } + } //Z#233 +, /* Asia/Harbin */ :array { + :intvector { -1325492804, -1194078600, -946800000, -115894800, 325956600, 515520000, 527007600, 545155200, 558457200, 576604800, 589906800, 608659200, 621961200, 640108800, 653410800, 671558400, 684860400 } + :intvector { 28800, 0, 28800, 3600, 30600, 0, 32400, 0 } + :bin { "0200030200010001000100010001000100" } + } //Z#234 +, /* Asia/Hong_Kong */ :array { + :intvector { -2056692996, -747981000, -728544600, -717049800, -694503000, -683785800, -668064600, -654755400, -636615000, -623305800, -605165400, -591856200, -573715800, -559801800, -542266200, -528352200, -510211800, -498112200, -478762200, -466662600, -446707800, -435213000, -415258200, -403158600, -383808600, -371709000, -352359000, -340259400, -320909400, -308809800, -288855000, -277360200, -257405400, -245910600, -225955800, -213856200, -194506200, -182406600, -163056600, -148537800, -132816600, -117088200, -101367000, -85638600, -69312600, -53584200, -37863000, -22134600, -6413400, 9315000, 25036200, 40764600, 56485800, 72214200, 88540200, 104268600, 119989800, 135718200, 151439400, 167167800, 182889000, 198617400, 214338600, 230067000, 245788200, 295385400, 309292200, 326835000, 340741800 } + :intvector { 28800, 0, 28800, 3600 } + :bin { "000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + :intvector { 235, 454 } + } //Z#235 +, /* Asia/Hovd */ :array { + :intvector { -2032927596, 252439200, 417978000, 433785600, 449600400, 465332400, 481057200, 496782000, 512506800, 528231600, 543956400, 559681200, 575406000, 591130800, 606855600, 622580400, 638305200, 654634800, 670359600, 686084400, 701809200, 717534000, 733258800, 748983600, 764708400, 780433200, 796158000, 811882800, 828212400, 843937200, 859662000, 875386800, 891111600, 906836400, 988398000, 1001700000 } + :intvector { 21600, 0, 25200, 0, 25200, 3600 } + :bin { "000102010201020102010201020102010201020102010201020102010201020102010201" } + "Mongol" + :intvector { 25200, 2002 } + } //Z#236 +, /* Asia/Irkutsk */ :array { + :intvector { -1575874640, -1247554800, 354902400, 370710000, 386438400, 402246000, 417974400, 433782000, 449596800, 465328800, 481053600, 496778400, 512503200, 528228000, 543952800, 559677600, 575402400, 591127200, 606852000, 622576800, 638301600, 654631200, 670356000, 686084400, 695761200, 701794800, 717516000, 733255200, 748980000, 764704800, 780429600, 796154400, 811879200 } + :intvector { 25200, 0, 25200, 3600, 28800, 0, 28800, 3600 } + :bin { "000203020302030203020302030203020302030203020100020302030203020302" } + "Russia" + :intvector { 28800, 1996 } + } //Z#237 +, /* Asia/Istanbul */ :int { 407 } //Z#238 +, /* Asia/Jakarta */ :array { + :intvector { -1451719200, -1172906400, -876641400, -770634000, -683883000, -620812800, -189415800 } + :intvector { 25200, 0, 26400, 0, 27000, 0, 28800, 0, 32400, 0 } + :bin { "01020402030200" } + } //Z#239 +, /* Asia/Jayapura */ :array { + :intvector { -1172913768, -820573200, -189423000 } + :intvector { 32400, 0, 34200, 0 } + :bin { "000100" } + } //Z#240 +, /* Asia/Jerusalem */ :array { + :intvector { -1641003640, -933645600, -857358000, -844300800, -825822000, -812685600, -794199600, -779853600, -762656400, -748310400, -731127600, -681962400, -673243200, -667962000, -652327200, -636426000, -622087200, -608947200, -591847200, -572486400, -558576000, -542851200, -527731200, -514425600, -490845600, -482986800, -459475200, -451537200, -428551200, -418262400, -400032000, -387428400, 142380000, 150843600, 167176800, 178664400, 482277600, 495579600, 516751200, 526424400, 545436000, 558478800, 576540000, 589237200, 609890400, 620773200, 638316000, 651618000, 669765600, 683672400, 701820000, 715726800, 733701600, 747176400, 765151200, 778021200, 796600800, 810075600, 826840800, 842821200, 858895200, 874184400, 890344800, 905029200, 923011200, 936313200, 955670400, 970783200, 986770800, 1001282400, 1017356400, 1033941600, 1048806000, 1065132000, 1081292400, 1095804000, 1112313600, 1128812400, 1143763200, 1159657200, 1175212800, 1189897200, 1206662400, 1223161200, 1238112000, 1254006000, 1269561600, 1284246000, 1301616000, 1317510000, 1333065600, 1348354800, 1364515200, 1378594800, 1395964800, 1411858800, 1427414400, 1442703600, 1459468800, 1475967600, 1490918400, 1506207600, 1522368000, 1537052400, 1553817600, 1570316400, 1585267200, 1601161200, 1616716800, 1631401200, 1648771200, 1664665200, 1680220800, 1695510000, 1711670400, 1728169200, 1743120000, 1759014000, 1774569600, 1789858800, 1806019200, 1823122800, 1838073600, 1853362800, 1869523200, 1884207600, 1900972800, 1917471600, 1932422400, 1947711600, 1963872000, 1978556400, 1995926400, 2011820400, 2027376000, 2042060400, 2058825600, 2075324400, 2090275200, 2106169200, 2121724800, 2136409200 } + :intvector { 7200, 0, 7200, 3600, 7200, 7200 } + :bin { "00010001000100010001000201000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + :intvector { 241, 281, 470 } + } //Z#241 +, /* Asia/Kabul */ :array { + :intvector { -788932800 } + :intvector { 16200, 0 } + :bin { "00" } + } //Z#242 +, /* Asia/Kamchatka */ :array { + :intvector { -1487759676, -1247569200, 354888000, 370695600, 386424000, 402231600, 417960000, 433767600, 449582400, 465314400, 481039200, 496764000, 512488800, 528213600, 543938400, 559663200, 575388000, 591112800, 606837600, 622562400, 638287200, 654616800, 670341600, 686070000, 695746800, 701780400, 717501600, 733240800, 748965600, 764690400, 780415200, 796140000, 811864800 } + :intvector { 39600, 0, 39600, 3600, 43200, 0, 43200, 3600 } + :bin { "000203020302030203020302030203020302030203020100020302030203020302" } + "Russia" + :intvector { 43200, 1996 } + } //Z#243 +, /* Asia/Karachi */ :array { + :intvector { -1988166492, -862637400, -764145000, -576135000, 38775600, 1018119660, 1033840860 } + :intvector { 18000, 0, 18000, 3600, 19800, 0, 19800, 3600 } + :bin { "02030200000100" } + :intvector { 244, 491 } + } //Z#244 +, /* Asia/Kashgar */ :array { + :intvector { -1325480636, -946791000, 325969200, 515520000, 527007600, 545155200, 558457200, 576604800, 589906800, 608659200, 621961200, 640108800, 653410800, 671558400, 684860400 } + :intvector { 18000, 0, 19800, 0, 28800, 0, 28800, 3600 } + :bin { "010002030203020302030203020302" } + } //Z#245 +, /* Asia/Katmandu */ :array { + :intvector { -1577943676, 504901800 } + :intvector { 19800, 0, 20700, 0 } + :bin { "0001" } + } //Z#246 +, /* Asia/Krasnoyarsk */ :array { + :intvector { -1577513480, -1247551200, 354906000, 370713600, 386442000, 402249600, 417978000, 433785600, 449600400, 465332400, 481057200, 496782000, 512506800, 528231600, 543956400, 559681200, 575406000, 591130800, 606855600, 622580400, 638305200, 654634800, 670359600, 686088000, 695764800, 701798400, 717519600, 733258800, 748983600, 764708400, 780433200, 796158000, 811882800 } + :intvector { 21600, 0, 21600, 3600, 25200, 0, 25200, 3600 } + :bin { "000203020302030203020302030203020302030203020100020302030203020302" } + "Russia" + :intvector { 25200, 1996 } + } //Z#247 +, /* Asia/Kuala_Lumpur */ :array { + :intvector { -2038200925, -1167634800, -1073028000, -894180000, -879665400, -767005200, 378664200 } + :intvector { 25200, 0, 25200, 1200, 26400, 0, 27000, 0, 28800, 0, 32400, 0 } + :bin { "00010203050304" } + } //Z#248 +, /* Asia/Kuching */ :array { + :intvector { -1383463280, -1167636600, -1082448000, -1074586800, -1050825600, -1042964400, -1019289600, -1011428400, -987753600, -979892400, -956217600, -948356400, -924595200, -916734000, -893059200, -885198000, -879667200, -767005200, 378662400 } + :intvector { 27000, 0, 28800, 0, 28800, 1200, 32400, 0 } + :bin { "00010201020102010201020102010201030101" } + } //Z#249 +, /* Asia/Kuwait */ :array { + :intvector { -631163516 } + :intvector { 10800, 0 } + :bin { "00" } + } //Z#250 +, /* Asia/Macao */ :int { 252 } //Z#251 +, /* Asia/Macau */ :array { + :intvector { -1830411260, -277360200, -257405400, -245910600, -225955800, -214473600, -194506200, -182406600, -163056600, -150969600, -131619600, -117088200, -101367000, -85638600, -69312600, -53584200, -37863000, -22134600, -6413400, 9315000, 25036200, 40764600, 56485800, 72201600, 87922800, 103651200, 119977200, 135705600, 151439400, 167167800, 182889000, 198617400, 214338600, 230067000, 245788200, 261504000, 277225200, 292953600, 309279600, 325008000, 340729200, 945619200 } + :intvector { 28800, 0, 28800, 3600 } + :bin { "000100010001000100010001000100010001000100010001000100010001000100010001000100010000" } + :intvector { 251, 252 } + } //Z#252 +, /* Asia/Magadan */ :array { + :intvector { -1441188192, -1247565600, 354891600, 370699200, 386427600, 402235200, 417963600, 433771200, 449586000, 465318000, 481042800, 496767600, 512492400, 528217200, 543942000, 559666800, 575391600, 591116400, 606841200, 622566000, 638290800, 654620400, 670345200, 686073600, 695750400, 701784000, 717505200, 733244400, 748969200, 764694000, 780418800, 796143600, 811868400 } + :intvector { 36000, 0, 36000, 3600, 39600, 0, 39600, 3600 } + :bin { "000203020302030203020302030203020302030203020100020302030203020302" } + "Russia" + :intvector { 39600, 1996 } + } //Z#253 +, /* Asia/Makassar */ :array { + :intvector { -1577951856, -1172908656, -880272000, -770634000 } + :intvector { 28656, 0, 28800, 0, 32400, 0 } + :bin { "00010201" } + :intvector { 254, 285 } + } //Z#254 +, /* Asia/Manila */ :array { + :intvector { -1046678400, -1038733200, -873273600, -794221200, -496224000, -489315600, 259344000, 275151600 } + :intvector { 28800, 0, 28800, 3600, 32400, 0 } + :bin { "0100020001000100" } + } //Z#255 +, /* Asia/Muscat */ :array { + :intvector { -1577937260 } + :intvector { 14400, 0 } + :bin { "00" } + } //Z#256 +, /* Asia/Nicosia */ :array { + :intvector { -1518920008, 166572000, 182293200, 200959200, 213829200, 228866400, 243982800, 260316000, 276123600, 291765600, 307486800, 323820000, 338936400, 354664800, 370386000, 386114400, 401835600, 417564000, 433285200, 449013600, 465339600, 481068000, 496789200, 512517600, 528238800, 543967200, 559688400, 575416800, 591138000, 606866400, 622587600, 638316000, 654642000, 670370400, 686091600, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000 } + :intvector { 7200, 0, 7200, 3600 } + :bin { "00010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + "EUAsia" + :intvector { 7200, 1996 } + :intvector { 257, 420 } + } //Z#257 +, /* Asia/Novosibirsk */ :array { + :intvector { -1579476700, -1247551200, 354906000, 370713600, 386442000, 402249600, 417978000, 433785600, 449600400, 465332400, 481057200, 496782000, 512506800, 528231600, 543956400, 559681200, 575406000, 591130800, 606855600, 622580400, 638305200, 654634800, 670359600, 686088000, 695764800, 701798400, 717519600, 733258800, 738086400, 748987200, 764712000, 780436800, 796161600, 811886400 } + :intvector { 21600, 0, 21600, 3600, 25200, 0, 25200, 3600 } + :bin { "00020302030203020302030203020302030203020302010002030203010001000100" } + "Russia" + :intvector { 21600, 1996 } + } //Z#258 +, /* Asia/Omsk */ :array { + :intvector { -1582088016, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 686091600, 695768400, 701802000, 717523200, 733262400, 748987200, 764712000, 780436800, 796161600, 811886400 } + :intvector { 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 } + :bin { "000203020302030203020302030203020302030203020100020302030203020302" } + "Russia" + :intvector { 21600, 1996 } + } //Z#259 +, /* Asia/Oral */ :array { + :intvector { -1441164324, -1247544000, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622591200, 638316000, 654645600, 662673600, 692827200, 701809200, 717530400, 733269600, 748994400, 764719200, 780444000, 796168800, 811893600 } + :intvector { 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } + :bin { "0002030403020302030203020302030203020100010000000100010001000100" } + "RussiaAsia" + :intvector { 14400, 1996 } + } //Z#260 +, /* Asia/Phnom_Penh */ :array { + :intvector { -2005973980, -1855983920, -1819954800, -1220428800 } + :intvector { 25200, 0, 25580, 0, 28800, 0 } + :bin { "01000200" } + } //Z#261 +, /* Asia/Pontianak */ :array { + :intvector { -1946186240, -1172906240, -881220600, -770634000, -683883000, -620812800, -189415800, 567964800 } + :intvector { 25200, 0, 26240, 0, 27000, 0, 28800, 0, 32400, 0 } + :bin { "0102040203020300" } + } //Z#262 +, /* Asia/Pyongyang */ :array { + :intvector { -2053931400, -1325494800, -1199262600, -498128400, -264931200 } + :intvector { 28800, 0, 30600, 0, 32400, 0 } + :bin { "0201020002" } + } //Z#263 +, /* Asia/Qatar */ :array { + :intvector { -1577935568, 76190400 } + :intvector { 10800, 0, 14400, 0 } + :bin { "0100" } + } //Z#264 +, /* Asia/Qyzylorda */ :array { + :intvector { -1441167712, -1247544000, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 662670000, 692823600, 695768400, 701802000, 717523200, 733262400, 748987200, 764712000, 780436800, 796161600, 811886400 } + :intvector { 14400, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 } + :bin { "000102030201020102010201020102010201020102010101030403040304030403" } + "RussiaAsia" + :intvector { 21600, 1996 } + } //Z#265 +, /* Asia/Rangoon */ :array { + :intvector { -1577946276, -873268200, -778410000 } + :intvector { 23400, 0, 32400, 0 } + :bin { "000100" } + } //Z#266 +, /* Asia/Riyadh */ :array { + :intvector { -631163212 } + :intvector { 10800, 0 } + :bin { "00" } + } //Z#267 +, /* Asia/Riyadh87 */ :array { + :intvector { 536489776, 536576206, 536662631, 536749061, 536835486, 536921916, 537008341, 537094766, 537181191, 537267616, 537354041, 537440466, 537526886, 537613311, 537699731, 537786151, 537872571, 537958991, 538045411, 538131831, 538218246, 538304666, 538391081, 538477496, 538563911, 538650326, 538736736, 538823151, 538909561, 538995971, 539082381, 539168791, 539255196, 539341606, 539428011, 539514416, 539600821, 539687226, 539860031, 540378426, 540551221, 540637616, 540724011, 540810406, 540896801, 540983191, 541069586, 541155976, 541242366, 541328756, 541415146, 541501536, 541587926, 541674316, 541760701, 541847091, 541933476, 542019861, 542106251, 542192636, 542279021, 542365406, 542451791, 542538171, 542624556, 542710941, 542797326, 542883706, 542970091, 543056471, 543142856, 543229236, 543315621, 543402001, 543488386, 543574766, 543661146, 543747531, 543833911, 543920291, 544006676, 544093056, 544179441, 544265821, 544352201, 544438586, 544524966, 544611351, 544697731, 544784116, 544870501, 544956881, 545043266, 545129651, 545216031, 545302416, 545388801, 545475186, 545561571, 545647961, 545734346, 545820731, 545907121, 545993506, 546079896, 546166281, 546252671, 546339061, 546425451, 546511841, 546598231, 546684621, 546771011, 546857406, 546943796, 547030191, 547116586, 547202981, 547289376, 547375771, 547462166, 547548561, 547721356, 548412561, 548585366, 548671771, 548758176, 548844581, 548930986, 549017391, 549103796, 549190206, 549276611, 549363021, 549449426, 549535836, 549622246, 549708656, 549795066, 549881476, 549967886, 550054296, 550140706, 550227121, 550313531, 550399946, 550486356, 550572766, 550659181, 550745591, 550832006, 550918421, 551004831, 551091246, 551177656, 551264071, 551350486, 551436896, 551523311, 551609721, 551696136, 551782546, 551868961, 551955371, 552041786, 552128196, 552214606, 552301021, 552387431, 552473841, 552560251, 552646661, 552733071, 552819481, 552905891, 552992296, 553078706, 553165116, 553251521, 553337926, 553424336, 553510741, 553597146, 553683551, 553856356, 553942761, 554201966, 554547561, 554806756, 554893151, 554979546, 555065941, 555152336, 555238731, 555325126, 555411516, 555497911, 555584301, 555670691, 555757081, 555843471, 555929861, 556016251, 556102641, 556189026, 556275416, 556361801, 556448186, 556534571, 556620956, 556707341, 556793726, 556880111, 556966496, 557052876, 557139261, 557225641, 557312026, 557398406, 557484786, 557571166, 557657551, 557743931, 557830311, 557916691, 558003071, 558089451, 558175826, 558262206, 558348586, 558434966, 558521346, 558607721, 558694101, 558780481, 558866861, 558953236, 559039616, 559125996, 559212371, 559298751, 559385131, 559471511, 559557891, 559644271, 559730646, 559817026, 559903406, 559989786, 560076166, 560162551, 560248931, 560335311, 560421691, 560508076, 560594456, 560680841, 560767221, 560853606, 560939991, 561026376, 561112761, 561199146, 561285531, 561371921, 561458306, 561544696, 561631081, 561717471, 561803861, 561890251, 561976641, 562063036, 562149426, 562235821, 562322211, 562408606, 562495001, 562667796, 562840591, 563186196, 563359001, 563445406, 563531811, 563618216, 563704621, 563791031, 563877436, 563963846, 564050256, 564136666, 564223081, 564309491, 564395906, 564482321, 564568736, 564655151, 564741566, 564827986, 564914406, 565000821, 565087241, 565173661, 565260086, 565346506, 565432926, 565519351, 565605776, 565692201, 565778626, 565865051, 565951476, 566037901, 566124326, 566210756, 566297181, 566383611, 566470041, 566556466, 566642896, 566729326, 566815756, 566902186, 566988616, 567075046, 567161476, 567247906, 567334336, 567420766, 567507196, 567593621, 567680051, 567766481, 567852911, 567939341, 567982541 } + :intvector { 11224, -855, 11224, -850, 11224, -845, 11224, -840, 11224, -835, 11224, -830, 11224, -825, 11224, -820, 11224, -815, 11224, -810, 11224, -805, 11224, -800, 11224, -795, 11224, -790, 11224, -785, 11224, -780, 11224, -775, 11224, -770, 11224, -760, 11224, -750, 11224, -740, 11224, -735, 11224, -725, 11224, -720, 11224, -715, 11224, -705, 11224, -700, 11224, -690, 11224, -685, 11224, -675, 11224, -670, 11224, -660, 11224, -655, 11224, -645, 11224, -635, 11224, -630, 11224, -615, 11224, -595, 11224, -580, 11224, -575, 11224, -565, 11224, -555, 11224, -550, 11224, -535, 11224, -530, 11224, -515, 11224, -510, 11224, -495, 11224, -490, 11224, -480, 11224, -465, 11224, -460, 11224, -445, 11224, -440, 11224, -425, 11224, -415, 11224, -410, 11224, -390, 11224, -385, 11224, -380, 11224, -375, 11224, -370, 11224, -365, 11224, -360, 11224, -355, 11224, -350, 11224, -345, 11224, -340, 11224, -335, 11224, -330, 11224, -325, 11224, -320, 11224, -315, 11224, -310, 11224, -305, 11224, -300, 11224, -295, 11224, -285, 11224, -280, 11224, -275, 11224, -265, 11224, -255, 11224, -250, 11224, -245, 11224, -240, 11224, -230, 11224, -225, 11224, -220, 11224, -210, 11224, -200, 11224, -195, 11224, -190, 11224, -185, 11224, -180, 11224, -175, 11224, -170, 11224, -165, 11224, -160, 11224, -155, 11224, -150, 11224, -145, 11224, -140, 11224, -135, 11224, -125, 11224, -120, 11224, -110, 11224, -105, 11224, -100, 11224, -95, 11224, -90, 11224, -85, 11224, -80, 11224, -75, 11224, -70, 11224, -65, 11224, -55, 11224, -50, 11224, -45, 11224, -40, 11224, -30, 11224, -25, 11224, -20, 11224, -15, 11224, -10, 11224, -5, 11224, 0, 11224, 5, 11224, 10, 11224, 15, 11224, 20, 11224, 25, 11224, 30, 11224, 40, 11224, 45, 11224, 55, 11224, 65, 11224, 70, 11224, 80, 11224, 85, 11224, 90, 11224, 95, 11224, 100, 11224, 105, 11224, 110, 11224, 115, 11224, 120, 11224, 125, 11224, 130, 11224, 135, 11224, 140, 11224, 145, 11224, 150, 11224, 155, 11224, 160, 11224, 165, 11224, 170, 11224, 180, 11224, 185, 11224, 190, 11224, 195, 11224, 200, 11224, 205, 11224, 210, 11224, 215, 11224, 220, 11224, 230, 11224, 250, 11224, 255, 11224, 275, 11224, 280, 11224, 295, 11224, 310, 11224, 315, 11224, 335, 11224, 340, 11224, 360, 11224, 365, 11224, 380, 11224, 395, 11224, 405, 11224, 420, 11224, 425, 11224, 445, 11224, 450, 11224, 465, 11224, 475, 11224, 485, 11224, 500, 11224, 505, 11224, 525, 11224, 530, 11224, 550, 11224, 570, 11224, 575, 11224, 590, 11224, 600, 11224, 610, 11224, 625, 11224, 645, 11224, 650, 11224, 665, 11224, 670, 11224, 685, 11224, 690, 11224, 700, 11224, 715, 11224, 720, 11224, 735, 11224, 755, 11224, 770, 11224, 785, 11224, 790, 11224, 800, 11224, 810, 11224, 815, 11224, 825, 11224, 830, 11224, 840, 11224, 845, 11224, 855, 11224, 870, 11224, 880, 11224, 885, 11224, 895, 11224, 905, 11224, 910, 11224, 915, 11224, 920, 11224, 925, 11224, 930, 11224, 935, 11224, 940, 11224, 945, 11224, 950, 11224, 955, 11224, 960, 11224, 965, 11224, 970, 11224, 975, 11224, 980, 11224, 985 } + :bin { "5955514d49433e39373532302e2b2927252422201e1b1917151312100e0c0a080705040302010001020304050608090b0d0f1112131416181a1c1d1f2123242526282a2c2d2f3133343638393d4044484b4e505356585b5e6265676a6d707376787b7e8083858688898c8e90929496989a9b9c9d9e9fa0a1a2a3a4a3a2a1a09f9e9d9c9b9a98979593918f8d8b8988868583817f7c7a777573716f6c69686664615f5c5a5857555351504f4d4c4a4847454342413f3e3d3c3b3a393a3b3c3d3e3f4041434446484a4c4d4f50525456585a5d606366686b6e7274777b7f8285878a8e92979b9ea2a5a7a8aaacaeafb1b3b5b6b8babcbebfc0c2c4c5c6c8cacccecfd0d1d2d4d6d8dadbdcdddfe0e2e4e6e7e9eaecedeeeff0efeeedecebeae8e7e5e3e1dfdedcdbd9d7d5d3d1d0cfcdcbc9c7c5c3c1bfbdbbb9b7b4b2b0adaba9a6a49e99938d88847f7975706a66607d" } + :intvector { 268, 483 } + } //Z#268 +, /* Asia/Riyadh88 */ :array { + :intvector { 568025771, 568112196, 568198626, 568285056, 568371481, 568457906, 568544336, 568630761, 568717186, 568803611, 568890036, 568976461, 569062881, 569149306, 569235726, 569322146, 569408566, 569494986, 569581406, 569667826, 569754241, 569840661, 569927076, 570013491, 570099906, 570186321, 570272736, 570359146, 570445556, 570531966, 570618376, 570704786, 570791196, 570877601, 570964011, 571050416, 571136821, 571223226, 571396031, 571914426, 572087221, 572173616, 572260011, 572346406, 572432801, 572519196, 572605586, 572691976, 572778371, 572864761, 572951151, 573037541, 573123926, 573210316, 573296706, 573383091, 573469481, 573555866, 573642251, 573728636, 573815021, 573901406, 573987791, 574074176, 574160561, 574246946, 574333326, 574419711, 574506096, 574592476, 574678861, 574765241, 574851626, 574938006, 575024386, 575110771, 575197151, 575283536, 575369916, 575456296, 575542681, 575629061, 575715441, 575801826, 575888206, 575974591, 576060971, 576147356, 576233736, 576320121, 576406501, 576492886, 576579271, 576665651, 576752036, 576838421, 576924806, 577011191, 577097576, 577183961, 577270346, 577356736, 577443121, 577529511, 577615896, 577702286, 577788671, 577875061, 577961451, 578047841, 578134231, 578220626, 578307016, 578393406, 578479801, 578566191, 578652586, 578738981, 578825376, 578911771, 578998166, 579084561, 579257356, 579948561, 580121366, 580207771, 580294176, 580380581, 580466986, 580553391, 580639796, 580726201, 580812611, 580899016, 580985426, 581071836, 581158246, 581244651, 581331061, 581417471, 581503886, 581590296, 581676706, 581763116, 581849531, 581935941, 582022351, 582108766, 582195176, 582281591, 582368001, 582454416, 582540831, 582627241, 582713656, 582800066, 582886481, 582972896, 583059306, 583145721, 583232131, 583318546, 583404956, 583491371, 583577781, 583664196, 583750606, 583837016, 583923426, 584009841, 584096251, 584182661, 584269071, 584355481, 584441886, 584528296, 584614706, 584701111, 584787521, 584873926, 584960331, 585046736, 585133141, 585219546, 585305951, 585392356, 585478761, 585737966, 586169961, 586342756, 586429151, 586601946, 586688341, 586774731, 586861126, 586947521, 587033911, 587120301, 587206696, 587293086, 587379476, 587465866, 587552251, 587638641, 587725031, 587811416, 587897806, 587984191, 588070576, 588156961, 588243346, 588329731, 588416116, 588502496, 588588881, 588675266, 588761646, 588848026, 588934411, 589020791, 589107171, 589193551, 589279936, 589366316, 589452696, 589539076, 589625456, 589711831, 589798211, 589884591, 589970971, 590057351, 590143726, 590230106, 590316486, 590402866, 590489241, 590575621, 590662001, 590748381, 590834756, 590921136, 591007516, 591093896, 591180276, 591266651, 591353031, 591439411, 591525791, 591612171, 591698551, 591784936, 591871316, 591957696, 592044081, 592130461, 592216846, 592303226, 592389611, 592475996, 592562381, 592648766, 592735151, 592821536, 592907921, 592994311, 593080696, 593167086, 593253476, 593339861, 593426256, 593512646, 593599036, 593685426, 593771821, 593858216, 593944611, 594031006, 594117401, 594203796, 594376591, 594722196, 594895001, 595067806, 595154216, 595240621, 595327026, 595413436, 595499846, 595586256, 595672666, 595759076, 595845491, 595931901, 596018316, 596104731, 596191146, 596277566, 596363981, 596450401, 596536816, 596623236, 596709656, 596796081, 596882501, 596968921, 597055346, 597141771, 597228191, 597314616, 597401041, 597487471, 597573896, 597660321, 597746751, 597833176, 597919606, 598006031, 598092461, 598178891, 598265321, 598351751, 598438176, 598524606, 598611036, 598697466, 598783896, 598870326, 598956756, 599043186, 599129616, 599216046, 599302476, 599388906, 599475331, 599561761, 599604961 } + :intvector { 11224, -855, 11224, -850, 11224, -845, 11224, -840, 11224, -835, 11224, -830, 11224, -825, 11224, -820, 11224, -810, 11224, -800, 11224, -795, 11224, -790, 11224, -785, 11224, -780, 11224, -775, 11224, -770, 11224, -765, 11224, -760, 11224, -750, 11224, -745, 11224, -740, 11224, -730, 11224, -715, 11224, -705, 11224, -700, 11224, -690, 11224, -685, 11224, -675, 11224, -665, 11224, -660, 11224, -650, 11224, -645, 11224, -630, 11224, -615, 11224, -610, 11224, -600, 11224, -590, 11224, -585, 11224, -570, 11224, -550, 11224, -535, 11224, -530, 11224, -520, 11224, -505, 11224, -500, 11224, -485, 11224, -465, 11224, -460, 11224, -450, 11224, -435, 11224, -430, 11224, -410, 11224, -395, 11224, -390, 11224, -385, 11224, -380, 11224, -375, 11224, -370, 11224, -365, 11224, -360, 11224, -355, 11224, -350, 11224, -345, 11224, -340, 11224, -335, 11224, -330, 11224, -325, 11224, -320, 11224, -310, 11224, -305, 11224, -300, 11224, -295, 11224, -290, 11224, -285, 11224, -280, 11224, -275, 11224, -265, 11224, -255, 11224, -250, 11224, -240, 11224, -230, 11224, -220, 11224, -215, 11224, -205, 11224, -200, 11224, -195, 11224, -185, 11224, -180, 11224, -170, 11224, -160, 11224, -155, 11224, -145, 11224, -140, 11224, -130, 11224, -125, 11224, -120, 11224, -110, 11224, -105, 11224, -100, 11224, -95, 11224, -90, 11224, -80, 11224, -75, 11224, -70, 11224, -65, 11224, -60, 11224, -55, 11224, -50, 11224, -45, 11224, -40, 11224, -35, 11224, -30, 11224, -25, 11224, -15, 11224, -10, 11224, 0, 11224, 5, 11224, 10, 11224, 15, 11224, 20, 11224, 25, 11224, 30, 11224, 35, 11224, 40, 11224, 45, 11224, 50, 11224, 55, 11224, 60, 11224, 65, 11224, 70, 11224, 80, 11224, 90, 11224, 100, 11224, 105, 11224, 110, 11224, 115, 11224, 120, 11224, 125, 11224, 130, 11224, 135, 11224, 140, 11224, 145, 11224, 150, 11224, 160, 11224, 165, 11224, 170, 11224, 175, 11224, 180, 11224, 185, 11224, 190, 11224, 195, 11224, 200, 11224, 205, 11224, 210, 11224, 215, 11224, 220, 11224, 225, 11224, 250, 11224, 255, 11224, 270, 11224, 285, 11224, 290, 11224, 310, 11224, 315, 11224, 335, 11224, 345, 11224, 355, 11224, 370, 11224, 375, 11224, 395, 11224, 400, 11224, 420, 11224, 425, 11224, 440, 11224, 455, 11224, 460, 11224, 480, 11224, 500, 11224, 505, 11224, 525, 11224, 535, 11224, 545, 11224, 560, 11224, 565, 11224, 585, 11224, 605, 11224, 625, 11224, 630, 11224, 640, 11224, 655, 11224, 660, 11224, 675, 11224, 680, 11224, 695, 11224, 715, 11224, 720, 11224, 730, 11224, 740, 11224, 750, 11224, 760, 11224, 765, 11224, 775, 11224, 780, 11224, 795, 11224, 810, 11224, 825, 11224, 830, 11224, 840, 11224, 845, 11224, 855, 11224, 860, 11224, 865, 11224, 875, 11224, 880, 11224, 885, 11224, 890, 11224, 900, 11224, 910, 11224, 915, 11224, 920, 11224, 930, 11224, 940, 11224, 950, 11224, 955, 11224, 960, 11224, 965, 11224, 970, 11224, 975, 11224, 980, 11224, 985 } + :bin { "55514e4a45413b3633312f2d2b2927262422201e1c1a18161513110f0d0b0908070604030201000102030405060708090a0c0e101214151617191b1d1f202123252627282a2c2d2e30323334383b3f4345494c4e50525557595b5e606366696c6f717376797b7e8082838587898b8d8e8f91929495969798999a9b9a9998979695949392908f8e8c8a8987858382817f7c7a78757371706d6a686564615f5d5b5a5857555351504f4e4c4b494745444341403e3d3c3b3a3938373635363738393a3c3d3e4042434446484b4c4d4f50525456585a5c5f6164676b6e7174787b7f8284888d9094989c9d9fa1a2a4a6a8a9abadafb0b1b3b5b7b8b9babcbec0c1c2c4c6c8cacbcccdcfd1d3d5d7d8dadbdcdddedfe0e1e2e3e4e5e4e3e2e0dfdedddcdbd9d8d6d4d2d0cecccbc9c7c5c3c1bfbdbbb9b8b6b4b2b0aeacaaa7a5a3a09e9c97918c86827d77726d67625d5a5673" } + :intvector { 269, 484 } + } //Z#269 +, /* Asia/Riyadh89 */ :array { + :intvector { 599648191, 599734621, 599821046, 599907476, 599993901, 600080326, 600166751, 600253181, 600339606, 600426031, 600512451, 600598876, 600685301, 600771721, 600858141, 600944561, 601030981, 601117401, 601203821, 601290241, 601376656, 601463071, 601549491, 601635906, 601722316, 601808731, 601895146, 601981556, 602067966, 602154376, 602240786, 602327196, 602413601, 602500011, 602586416, 602672821, 602759226, 602932031, 603104836, 603364031, 603536826, 603709621, 603796016, 603882411, 603968806, 604055196, 604141591, 604227981, 604314371, 604400761, 604487151, 604573541, 604659931, 604746321, 604832706, 604919096, 605005481, 605091871, 605178256, 605264641, 605351026, 605437411, 605523796, 605610181, 605696566, 605782946, 605869331, 605955716, 606042096, 606128481, 606214861, 606301246, 606387626, 606474011, 606560391, 606646771, 606733156, 606819536, 606905916, 606992301, 607078681, 607165066, 607251446, 607337826, 607424211, 607510591, 607596976, 607683356, 607769741, 607856121, 607942506, 608028886, 608115271, 608201656, 608288041, 608374426, 608460811, 608547196, 608633581, 608719966, 608806351, 608892736, 608979126, 609065511, 609151901, 609238286, 609324676, 609411066, 609497456, 609583846, 609670236, 609756626, 609843016, 609929411, 610015801, 610102196, 610188586, 610274981, 610361376, 610447771, 610534166, 610706961, 610879756, 611484561, 611657366, 611743771, 611916576, 612002981, 612089391, 612175796, 612262201, 612348611, 612435016, 612521426, 612607831, 612694241, 612780651, 612867061, 612953471, 613039881, 613126291, 613212701, 613299116, 613385526, 613471936, 613558351, 613644761, 613731176, 613817586, 613904001, 613990411, 614076826, 614163241, 614249651, 614336066, 614422476, 614508891, 614595306, 614681716, 614768131, 614854541, 614940956, 615027366, 615113781, 615200191, 615286601, 615373016, 615459426, 615545836, 615632246, 615718656, 615805066, 615891476, 615977886, 616064296, 616150701, 616237111, 616323516, 616409926, 616496331, 616582736, 616669141, 616755546, 616841951, 616928356, 617101161, 617273966, 617705961, 617878756, 618051551, 618137946, 618224341, 618310736, 618397126, 618483521, 618569911, 618656306, 618742696, 618829086, 618915476, 619001866, 619088256, 619174646, 619261031, 619347421, 619433806, 619520191, 619606581, 619692966, 619779351, 619865736, 619952116, 620038501, 620124886, 620211266, 620297651, 620384031, 620470416, 620556796, 620643176, 620729561, 620815941, 620902321, 620988701, 621075081, 621161461, 621247841, 621334216, 621420596, 621506976, 621593356, 621679736, 621766111, 621852491, 621938871, 622025251, 622111626, 622198006, 622284386, 622370766, 622457141, 622543521, 622629901, 622716281, 622802661, 622889041, 622975416, 623061796, 623148176, 623234561, 623320941, 623407321, 623493701, 623580086, 623666466, 623752846, 623839231, 623925616, 624011996, 624098381, 624184766, 624271151, 624357536, 624443926, 624530311, 624616696, 624703086, 624789476, 624875866, 624962256, 625048646, 625135036, 625221426, 625307821, 625394216, 625480606, 625567001, 625653396, 625826191, 626085386, 626171791, 626430996, 626517401, 626603806, 626690211, 626776616, 626863021, 626949431, 627035841, 627122251, 627208661, 627295071, 627381486, 627467896, 627554311, 627640726, 627727141, 627813561, 627899976, 627986396, 628072816, 628159231, 628245651, 628332076, 628418496, 628504916, 628591341, 628677766, 628764191, 628850611, 628937036, 629023466, 629109891, 629196316, 629282746, 629369171, 629455601, 629542026, 629628456, 629714886, 629801316, 629887741, 629974171, 630060601, 630147031, 630233461, 630319891, 630406321, 630492751, 630579181, 630665611, 630752041, 630838471, 630924896, 631011326, 631097756, 631140956 } + :intvector { 11224, -860, 11224, -855, 11224, -850, 11224, -845, 11224, -840, 11224, -835, 11224, -830, 11224, -825, 11224, -820, 11224, -815, 11224, -810, 11224, -805, 11224, -800, 11224, -795, 11224, -790, 11224, -785, 11224, -780, 11224, -775, 11224, -770, 11224, -765, 11224, -755, 11224, -745, 11224, -740, 11224, -730, 11224, -720, 11224, -715, 11224, -705, 11224, -695, 11224, -680, 11224, -665, 11224, -650, 11224, -645, 11224, -635, 11224, -625, 11224, -620, 11224, -605, 11224, -590, 11224, -585, 11224, -570, 11224, -565, 11224, -555, 11224, -545, 11224, -540, 11224, -525, 11224, -520, 11224, -505, 11224, -500, 11224, -485, 11224, -475, 11224, -470, 11224, -455, 11224, -450, 11224, -435, 11224, -430, 11224, -415, 11224, -405, 11224, -395, 11224, -390, 11224, -385, 11224, -380, 11224, -375, 11224, -370, 11224, -365, 11224, -360, 11224, -355, 11224, -350, 11224, -345, 11224, -340, 11224, -335, 11224, -330, 11224, -325, 11224, -320, 11224, -310, 11224, -305, 11224, -300, 11224, -290, 11224, -280, 11224, -270, 11224, -260, 11224, -255, 11224, -250, 11224, -245, 11224, -240, 11224, -235, 11224, -230, 11224, -225, 11224, -215, 11224, -205, 11224, -200, 11224, -190, 11224, -180, 11224, -175, 11224, -165, 11224, -160, 11224, -155, 11224, -150, 11224, -145, 11224, -140, 11224, -130, 11224, -125, 11224, -120, 11224, -115, 11224, -110, 11224, -100, 11224, -95, 11224, -90, 11224, -80, 11224, -75, 11224, -65, 11224, -55, 11224, -50, 11224, -40, 11224, -35, 11224, -25, 11224, -20, 11224, -10, 11224, -5, 11224, 0, 11224, 10, 11224, 15, 11224, 25, 11224, 35, 11224, 40, 11224, 50, 11224, 55, 11224, 60, 11224, 65, 11224, 75, 11224, 85, 11224, 90, 11224, 95, 11224, 100, 11224, 105, 11224, 110, 11224, 115, 11224, 120, 11224, 125, 11224, 130, 11224, 135, 11224, 140, 11224, 145, 11224, 150, 11224, 160, 11224, 165, 11224, 175, 11224, 180, 11224, 185, 11224, 190, 11224, 195, 11224, 200, 11224, 205, 11224, 210, 11224, 215, 11224, 220, 11224, 235, 11224, 240, 11224, 260, 11224, 265, 11224, 285, 11224, 290, 11224, 305, 11224, 320, 11224, 325, 11224, 350, 11224, 370, 11224, 375, 11224, 390, 11224, 405, 11224, 410, 11224, 430, 11224, 435, 11224, 455, 11224, 460, 11224, 475, 11224, 485, 11224, 495, 11224, 510, 11224, 515, 11224, 535, 11224, 540, 11224, 560, 11224, 565, 11224, 580, 11224, 585, 11224, 600, 11224, 610, 11224, 615, 11224, 635, 11224, 655, 11224, 660, 11224, 675, 11224, 680, 11224, 690, 11224, 700, 11224, 710, 11224, 725, 11224, 730, 11224, 745, 11224, 760, 11224, 780, 11224, 795, 11224, 800, 11224, 810, 11224, 815, 11224, 825, 11224, 835, 11224, 840, 11224, 850, 11224, 865, 11224, 880, 11224, 890, 11224, 900, 11224, 905, 11224, 910, 11224, 915, 11224, 920, 11224, 925, 11224, 930, 11224, 935, 11224, 940, 11224, 945, 11224, 950, 11224, 955, 11224, 960, 11224, 965, 11224, 970, 11224, 975, 11224, 980, 11224, 985, 11224, 990 } + :bin { "56514d4a46413c373532302e2b29272523211f1d1c1b1917161412100e0c0a080705040302010001020304050608090b0d0f1113141517181a1b1c1d1e2022232426282a2c2d2f31333436383b3f4346494b4d505356585a5c606266686a6c6e70727476787a7b7e7f81838587898b8d8e8f90919394959697989998979695949291908f8e8d8c8a88868482807f7d7b7a7877757371706e6c6b69676562615e5c5a5957565552504e4d4c4b4a484746444341403f3e3d3c3b3a393a3b3c3d3e3f4142444547484a4b4c4d4f51545657595b5d616366696b6d6f727577797c7f82868a8e9195999b9d9ea0a2a3a4a6a8aaabadafb1b2b4b6b8babbbcbec0c2c4c5c6c7c8cacccecfd0d1d2d3d5d7d9dbdddedfe1e2e3e4e5e4e3e2e1e0dfdedcdad8d6d4d2d1d0cfcdcbc9c7c6c5c3c1bfbdbbb9b7b5b3b0aeaca9a7a5a3a19f9c9a96908c86807c7874706c68645f5a75" } + :intvector { 270, 485 } + } //Z#270 +, /* Asia/Saigon */ :array { + :intvector { -2005974400, -1855983920, -1819954800, -1220428800 } + :intvector { 25200, 0, 25580, 0, 28800, 0 } + :bin { "01000200" } + :intvector { 271, 573 } + } //Z#271 +, /* Asia/Sakhalin */ :array { + :intvector { -2031039048, -1009875600, -768560400, 354891600, 370699200, 386427600, 402235200, 417963600, 433771200, 449586000, 465318000, 481042800, 496767600, 512492400, 528217200, 543942000, 559666800, 575391600, 591116400, 606841200, 622566000, 638290800, 654620400, 670345200, 686073600, 695750400, 701784000, 717505200, 733244400, 748969200, 764694000, 780418800, 796143600, 811868400 } + :intvector { 32400, 0, 36000, 0, 36000, 3600, 39600, 0, 39600, 3600 } + :bin { "00000304030403040304030403040304030403040304030201030403040304030403" } + "Russia" + :intvector { 36000, 1996 } + } //Z#272 +, /* Asia/Samarkand */ :array { + :intvector { -1441168032, -1247544000, 354913200, 370720800, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 683661600, 686091600, 694206000, 701805600, 717526800 } + :intvector { 14400, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 } + :bin { "00010203040304030403040304030403040304030403020201010201" } + } //Z#273 +, /* Asia/Seoul */ :array { + :intvector { -2053931400, -1325494800, -1199262600, -498128400, -303984000, -293533200, -264931200, -39515400, 547570800, 560872800, 579020400, 592322400 } + :intvector { 28800, 0, 28800, 3600, 30600, 0, 32400, 0, 32400, 3600 } + :bin { "030203000100020304030403" } + :intvector { 274, 540 } + } //Z#274 +, /* Asia/Shanghai */ :array { + :intvector { -1325491552, -933494400, -923130000, -908784000, -891594000, 515520000, 527007600, 545155200, 558457200, 576604800, 589906800, 608659200, 621961200, 640108800, 653410800, 671558400, 684860400 } + :intvector { 28800, 0, 28800, 3600 } + :bin { "0001000100010001000100010001000100" } + :intvector { 275, 337, 493 } + } //Z#275 +, /* Asia/Singapore */ :array { + :intvector { -2038200925, -1167634800, -1073028000, -894180000, -879665400, -767005200, -138785400, 378664200 } + :intvector { 25200, 0, 25200, 1200, 26400, 0, 27000, 0, 28800, 0, 32400, 0 } + :bin { "0001020305030304" } + :intvector { 276, 542 } + } //Z#276 +, /* Asia/Taipei */ :array { + :intvector { -778579200, -765363600, -747043200, -733827600, -715507200, -702291600, -683884800, -670669200, -652348800, -639133200, -620812800, -607597200, -589276800, -576061200, -562924800, -541760400, -528710400, -510224400, -497174400, -478688400, -465638400, -449830800, -434016000, -418208400, -402480000, -386672400, -370944000, -355136400, -339408000, -323600400, -302515200, -291978000, -270979200, -260442000, 133977600, 149785200, 165513600, 181321200, 331142400, 339087600 } + :intvector { 28800, 0, 28800, 3600 } + :bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100" } + :intvector { 277, 539 } + } //Z#277 +, /* Asia/Tashkent */ :array { + :intvector { -1441168632, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 683661600, 686091600, 694206000, 701805600, 717526800 } + :intvector { 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 } + :bin { "00020302030203020302030203020302030203020302010100000100" } + } //Z#278 +, /* Asia/Tbilisi */ :array { + :intvector { -1441162756, -405140400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622591200, 638316000, 654645600, 670370400, 671140800, 686098800, 694213200, 701816400, 717537600, 733266000, 748987200, 764715600, 780436800, 796161600, 811882800 } + :intvector { 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } + :bin { "00020302030203020302030203020302030203020302010100000100010001020302" } + "RussiaAsia" + :intvector { 10800, 1996 } + } //Z#279 +, /* Asia/Tehran */ :array { + :intvector { -1704165944, -757394744, 247177800, 259272000, 277758000, 283982400, 290809800, 306531000, 322432200, 338499000, 673216200, 685481400, 701209800, 717103800, 732745800, 748639800, 764281800, 780175800, 795817800, 811711800, 827353800, 843247800, 858976200, 874870200, 890512200, 906406200, 922048200, 937942200, 953584200, 969478200, 985206600, 1001100600, 1016742600, 1032636600, 1048278600, 1064172600, 1079814600, 1095708600, 1111437000, 1127331000, 1142973000, 1158867000, 1174509000, 1190403000, 1206045000, 1221939000, 1237667400, 1253561400, 1269203400, 1285097400, 1300739400, 1316633400, 1332275400, 1348169400, 1363897800, 1379791800, 1395433800, 1411327800, 1426969800, 1442863800, 1458505800, 1474399800, 1490128200, 1506022200, 1521664200, 1537558200, 1553200200, 1569094200, 1584736200, 1600630200, 1616358600, 1632252600, 1647894600, 1663788600, 1679430600, 1695324600, 1710966600, 1726860600, 1742502600, 1758396600, 1774125000, 1790019000, 1805661000, 1821555000, 1837197000, 1853091000, 1868733000, 1884627000, 1900355400, 1916249400, 1931891400, 1947785400, 1963427400, 1979321400, 1994963400, 2010857400, 2026585800, 2042479800, 2058121800, 2074015800, 2089657800, 2105551800, 2121193800, 2137087800 } + :intvector { 12344, 0, 12600, 0, 12600, 3600, 14400, 0, 14400, 3600 } + :bin { "0001030403010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + :intvector { 280, 469 } + } //Z#280 +, /* Asia/Tel_Aviv */ :int { 241 } //Z#281 +, /* Asia/Thimbu */ :int { 283 } //Z#282 +, /* Asia/Thimphu */ :array { + :intvector { -706341516, 560025000 } + :intvector { 19800, 0, 21600, 0 } + :bin { "0001" } + :intvector { 282, 283 } + } //Z#283 +, /* Asia/Tokyo */ :array { + :intvector { -1009875600 } + :intvector { 32400, 0 } + :bin { "00" } + :intvector { 284, 471, 473 } + } //Z#284 +, /* Asia/Ujung_Pandang */ :int { 254 } //Z#285 +, /* Asia/Ulaanbaatar */ :array { + :intvector { -2032931252, 252435600, 417974400, 433782000, 449596800, 465328800, 481053600, 496778400, 512503200, 528228000, 543952800, 559677600, 575402400, 591127200, 606852000, 622576800, 638301600, 654631200, 670356000, 686080800, 701805600, 717530400, 733255200, 748980000, 764704800, 780429600, 796154400, 811879200, 828208800, 843933600, 859658400, 875383200, 891108000, 906832800, 988394400, 1001696400 } + :intvector { 25200, 0, 28800, 0, 28800, 3600 } + :bin { "000102010201020102010201020102010201020102010201020102010201020102010201" } + "Mongol" + :intvector { 28800, 2002 } + :intvector { 286, 287 } + } //Z#286 +, /* Asia/Ulan_Bator */ :int { 286 } //Z#287 +, /* Asia/Urumqi */ :array { + :intvector { -1325483420, 325965600, 515520000, 527007600, 545155200, 558457200, 576604800, 589906800, 608659200, 621961200, 640108800, 653410800, 671558400, 684860400 } + :intvector { 21600, 0, 28800, 0, 28800, 3600 } + :bin { "0001020102010201020102010201" } + } //Z#288 +, /* Asia/Vientiane */ :array { + :intvector { -2005973424, -1855983920, -1819954800, -1220428800 } + :intvector { 25200, 0, 25580, 0, 28800, 0 } + :bin { "01000200" } + } //Z#289 +, /* Asia/Vladivostok */ :array { + :intvector { -1487321264, -1247562000, 354895200, 370702800, 386431200, 402238800, 417967200, 433774800, 449589600, 465321600, 481046400, 496771200, 512496000, 528220800, 543945600, 559670400, 575395200, 591120000, 606844800, 622569600, 638294400, 654624000, 670348800, 686077200, 695754000, 701787600, 717508800, 733248000, 748972800, 764697600, 780422400, 796147200, 811872000 } + :intvector { 32400, 0, 32400, 3600, 36000, 0, 36000, 3600 } + :bin { "000203020302030203020302030203020302030203020100020302030203020302" } + "Russia" + :intvector { 36000, 1996 } + } //Z#290 +, /* Asia/Yakutsk */ :array { + :intvector { -1579423120, -1247558400, 354898800, 370706400, 386434800, 402242400, 417970800, 433778400, 449593200, 465325200, 481050000, 496774800, 512499600, 528224400, 543949200, 559674000, 575398800, 591123600, 606848400, 622573200, 638298000, 654627600, 670352400, 686080800, 695757600, 701791200, 717512400, 733251600, 748976400, 764701200, 780426000, 796150800, 811875600 } + :intvector { 28800, 0, 28800, 3600, 32400, 0, 32400, 3600 } + :bin { "000203020302030203020302030203020302030203020100020302030203020302" } + "Russia" + :intvector { 32400, 1996 } + } //Z#291 +, /* Asia/Yekaterinburg */ :array { + :intvector { -1592611344, -1247544000, 354913200, 370720800, 386449200, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695772000, 701805600, 717526800, 733266000, 748990800, 764715600, 780440400, 796165200, 811890000 } + :intvector { 14400, 0, 14400, 3600, 18000, 0, 18000, 3600 } + :bin { "000203020302030203020302030203020302030203020100020302030203020302" } + "Russia" + :intvector { 18000, 1996 } + } //Z#292 +, /* Asia/Yerevan */ :array { + :intvector { -1441162680, -405140400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622591200, 638316000, 654645600, 670370400, 685569600, 686098800, 701812800, 717534000, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200 } + :intvector { 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } + :bin { "000203020302030203020302030203020302030203020101000100010001000102" } + "RussiaAsia" + :intvector { 14400, 1996 } + :intvector { 293, 486 } + } //Z#293 +, /* Atlantic/Azores */ :array { + :intvector { -1849557928, -1689548400, -1677794400, -1667430000, -1647730800, -1635807600, -1616194800, -1604358000, -1584658800, -1572735600, -1553036400, -1541199600, -1521500400, -1442444400, -1426806000, -1379286000, -1364770800, -1348441200, -1333321200, -1316386800, -1301266800, -1284332400, -1269817200, -1221433200, -1206918000, -1191193200, -1175468400, -1127689200, -1111964400, -1096844400, -1080514800, -1063580400, -1049065200, -1033340400, -1017615600, -1002495600, -986166000, -969231600, -950482800, -942015600, -922662000, -906937200, -891126000, -877302000, -873676800, -864000000, -857948400, -845852400, -842832000, -831340800, -825894000, -814402800, -810777600, -799891200, -794444400, -782953200, -779328000, -768441600, -762994800, -749084400, -733359600, -717624000, -701899200, -686174400, -670449600, -654724800, -639000000, -591825600, -575496000, -559771200, -544046400, -528321600, -512596800, -496872000, -481147200, -465422400, -449697600, -433972800, -417643200, -401918400, -386193600, -370468800, -354744000, -339019200, -323294400, -307569600, -291844800, -276120000, -260395200, -244670400, -228340800, -212616000, -196891200, -181166400, -165441600, -149716800, -133992000, -118267200, 228272400, 243997200, 260326800, 276051600, 291776400, 307504800, 323226000, 338954400, 354679200, 370404000, 386128800, 401853600, 417582000, 433303200, 449028000, 465357600, 481082400, 496807200, 512532000, 528256800, 543981600, 559706400, 575431200, 591156000, 606880800, 622605600, 638330400, 654660000, 670384800, 686109600, 701834400, 717559200, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { -7200, 0, -7200, 3600, -7200, 7200, -3600, 0, -3600, 3600, 0, 0 } + :bin { "00010001000100010001000100010001000100010001000100010001000100010001000100010001000100010201000102010001020100010201000100010001000100010001000100010001000100010001000100010001000100010001000100030403040304030403040304030403040304030403040304030403040304030405040304030403" } + "EU" + :intvector { -3600, 1996 } + } //Z#294 +, /* Atlantic/Bermuda */ :array { + :intvector { -1262281256, 136360800, 152082000, 167810400, 183531600, 199260000, 215586000, 230709600, 247035600, 262764000, 278485200, 294213600, 309934800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800 } + :intvector { -14400, 0, -14400, 3600 } + :bin { "000100010001000100010001000100010001000100010001000100" } + "Bahamas" + :intvector { -14400, 1987 } + } //Z#295 +, /* Atlantic/Canary */ :array { + :intvector { -1509663504, -733874400, 323827200, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { -3600, 0, 0, 0, 0, 3600 } + :bin { "00010201020102010201020102010201020102010201020102010201020102010201" } + "EU" + :intvector { 0, 1996 } + } //Z#296 +, /* Atlantic/Cape_Verde */ :array { + :intvector { -1988144756, -862610400, -764118000, 186120000 } + :intvector { -7200, 0, -7200, 3600, -3600, 0 } + :bin { "00010002" } + } //Z#297 +, /* Atlantic/Faeroe */ :array { + :intvector { -1955748776, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 0, 0, 0, 3600 } + :bin { "00010001000100010001000100010001000100010001000100010001000100" } + "EU" + :intvector { 0, 1996 } + } //Z#298 +, /* Atlantic/Jan_Mayen */ :int { 421 } //Z#299 +, /* Atlantic/Madeira */ :array { + :intvector { -1849560744, -1689552000, -1677798000, -1667433600, -1647734400, -1635811200, -1616198400, -1604361600, -1584662400, -1572739200, -1553040000, -1541203200, -1521504000, -1442448000, -1426809600, -1379289600, -1364774400, -1348444800, -1333324800, -1316390400, -1301270400, -1284336000, -1269820800, -1221436800, -1206921600, -1191196800, -1175472000, -1127692800, -1111968000, -1096848000, -1080518400, -1063584000, -1049068800, -1033344000, -1017619200, -1002499200, -986169600, -969235200, -950486400, -942019200, -922665600, -906940800, -891129600, -877305600, -873680400, -864003600, -857952000, -845856000, -842835600, -831344400, -825897600, -814406400, -810781200, -799894800, -794448000, -782956800, -779331600, -768445200, -762998400, -749088000, -733363200, -717627600, -701902800, -686178000, -670453200, -654728400, -639003600, -591829200, -575499600, -559774800, -544050000, -528325200, -512600400, -496875600, -481150800, -465426000, -449701200, -433976400, -417646800, -401922000, -386197200, -370472400, -354747600, -339022800, -323298000, -307573200, -291848400, -276123600, -260398800, -244674000, -228344400, -212619600, -196894800, -181170000, -165445200, -149720400, -133995600, -118270800, 228268800, 243993600, 260323200, 276048000, 291772800, 307501200, 323222400, 338950800, 354675600, 370400400, 386125200, 401850000, 417578400, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { -3600, 0, -3600, 3600, -3600, 7200, 0, 0, 0, 3600 } + :bin { "00010001000100010001000100010001000100010001000100010001000100010001000100010001000100010201000102010001020100010201000100010001000100010001000100010001000100010001000100010001000100010001000100030403040304030403040304030403040304030403040304030403040304030403040304030403" } + "EU" + :intvector { 0, 1996 } + } //Z#300 +, /* Atlantic/Reykjavik */ :array { + :intvector { -1956609132, -1668211200, -1647212400, -1636675200, -1613430000, -968025600, -949615200, -942008400, -920239200, -909957600, -888789600, -877903200, -857944800, -846453600, -826495200, -815004000, -795045600, -783554400, -762991200, -752104800, -731541600, -717631200, -700092000, -686181600, -668642400, -654732000, -636588000, -623282400, -605743200, -591832800, -573688800, -559778400, -542239200, -528328800, -510789600, -496879200, -479340000, -465429600, -447890400, -433980000, -415836000, -401925600, -384386400, -370476000, -352936800, -339026400, -321487200, -307576800, -290037600, -276127200, -258588000, -244677600, -226533600, -212623200, -195084000, -181173600, -163634400, -149724000, -132184800, -118274400, -100735200, -86824800, -68680800, -54770400 } + :intvector { -3600, 0, -3600, 3600, 0, 0 } + :bin { "00010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010002" } + :intvector { 301, 457 } + } //Z#301 +, /* Atlantic/South_Georgia */ :array { + :intvector { } + :intvector { -7200, 0 } + :bin { "" } + } //Z#302 +, /* Atlantic/St_Helena */ :array { + :intvector { -599614632 } + :intvector { 0, 0 } + :bin { "00" } + } //Z#303 +, /* Atlantic/Stanley */ :array { + :intvector { -1824235716, -1018209600, -1003093200, -986760000, -971643600, -954705600, -939589200, -923256000, -908139600, -891806400, -876690000, -860356800, -852066000, 420609600, 433306800, 452052000, 464151600, 483501600, 495601200, 514350000, 527054400, 545799600, 558504000, 577249200, 589953600, 608698800, 621403200, 640753200, 652852800, 672202800, 684907200, 703652400, 716356800, 735102000, 747806400, 766551600, 779256000, 798001200, 810705600, 830055600, 842760000, 861505200, 874209600, 892954800, 905659200, 924404400, 937108800, 955854000, 968558400 } + :intvector { -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } + :bin { "00010001000100010001000100020302030201000100010001000100010001000100010001000100010001000100010001" } + "Falk" + :intvector { -14400, 2001 } + } //Z#304 +, /* Australia/ACT */ :int { 321 } //Z#305 +, /* Australia/Adelaide */ :array { + :intvector { -1672565340, -1665390600, -883639800, -876126600, -860398200, -844677000, -828343800, -813227400, 57688200, 67969800, 89137800, 100024200, 120587400, 131473800, 152037000, 162923400, 183486600, 194977800, 215541000, 226427400, 246990600, 257877000, 278440200, 289326600, 309889800, 320776200, 341339400, 352225800, 372789000, 384280200, 404843400, 415729800, 436293000, 447179400, 467742600, 478629000, 499192200, 511288200, 530037000, 542737800, 562091400, 574792200, 594145800, 606241800, 625595400, 637691400, 657045000, 667931400, 688494600, 701195400, 719944200, 731435400, 751998600, 764094600, 783448200 } + :intvector { 34200, 0, 34200, 3600 } + :bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001" } + "AS" + :intvector { 34200, 1995 } + :intvector { 306, 320 } + } //Z#306 +, /* Australia/Brisbane */ :array { + :intvector { -1672567140, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, 57686400, 67968000, 625593600, 636480000, 657043200, 667929600, 688492800, 699379200 } + :intvector { 36000, 0, 36000, 3600 } + :bin { "01000100010001000100010001000100" } + :intvector { 307, 319 } + } //Z#307 +, /* Australia/Broken_Hill */ :array { + :intvector { -1672565340, -1665390600, -883639800, -876126600, -860398200, -844677000, -828343800, -813227400, 57688200, 67969800, 89137800, 100024200, 120587400, 131473800, 152037000, 162923400, 183486600, 194977800, 215541000, 226427400, 246990600, 257877000, 278440200, 289326600, 309889800, 320776200, 341339400, 352225800, 372789000, 386699400, 404843400, 415729800, 436293000, 447179400, 467742600, 478629000, 499192200, 511288200, 530037000, 542737800, 562091400, 574792200, 594145800, 606241800, 625595400, 636481800, 657045000, 667931400, 688494600, 699381000, 719944200, 731435400, 751998600, 762885000, 783448200 } + :intvector { 34200, 0, 34200, 3600 } + :bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001" } + "AS" + :intvector { 34200, 1995 } + :intvector { 308, 325 } + } //Z#308 +, /* Australia/Canberra */ :int { 321 } //Z#309 +, /* Australia/Darwin */ :array { + :intvector { -1672565340, -1665390600, -883639800, -876126600, -860398200, -844677000, -828343800, -813227400 } + :intvector { 34200, 0, 34200, 3600 } + :bin { "0100010001000100" } + :intvector { 0, 310, 317 } + } //Z#310 +, /* Australia/Hobart */ :array { + :intvector { -1680508800, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, -71136000, -55411200, -37267200, -25776000, -5817600, 5673600, 25632000, 37728000, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 386092800, 404841600, 417542400, 436291200, 447177600, 467740800, 478627200, 499190400, 510076800, 530035200, 542736000, 562089600, 574790400, 594144000, 606240000, 625593600, 637689600, 657043200, 670348800, 686678400, 701798400, 718128000, 733248000, 749577600, 764697600, 781027200, 796147200, 812476800, 828201600, 844531200, 859651200, 875980800, 891100800, 907430400, 922550400, 938880000, 954000000, 967305600 } + :intvector { 36000, 0, 36000, 3600 } + :bin { "010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001" } + "AT" + :intvector { 36000, 2001 } + :intvector { 311, 322 } + } //Z#311 +, /* Australia/LHI */ :int { 314 } //Z#312 +, /* Australia/Lindeman */ :array { + :intvector { -1672567140, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, 57686400, 67968000, 625593600, 636480000, 657043200, 667929600, 688492800, 699379200, 709912800, 719942400, 731433600, 751996800, 762883200 } + :intvector { 36000, 0, 36000, 3600 } + :bin { "010001000100010001000100010001000001000100" } + } //Z#313 +, /* Australia/Lord_Howe */ :array { + :intvector { 352216800, 372785400, 384273000, 404839800, 415722600, 436289400, 447172200, 467739000, 478621800, 499188600, 511282800, 530033400, 542732400, 562087800, 574786800, 594142200, 606236400, 625591800, 636476400, 657041400, 667926000, 688491000, 699375600, 719940600, 731430000, 751995000, 762879600, 783444600, 794329200, 814894200, 828198000, 846343800, 859647600, 877793400, 891097200, 909243000, 922546800, 941297400, 953996400, 967303800 } + :intvector { 37800, 0, 37800, 1800, 37800, 3600 } + :bin { "00020002000200020001000100010001000100010001000100010001000100010001000100010001" } + "LH" + :intvector { 37800, 2001 } + :intvector { 312, 314 } + } //Z#314 +, /* Australia/Melbourne */ :array { + :intvector { -1672567140, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 384278400, 404841600, 415728000, 436291200, 447177600, 467740800, 478627200, 499190400, 511286400, 530035200, 542736000, 561484800, 574790400, 594144000, 606240000, 625593600, 637689600, 657043200, 667929600, 688492800, 699379200, 719942400, 731433600, 751996800, 762883200, 783446400, 796147200, 814896000, 828201600, 846345600, 859651200, 877795200, 891100800, 909244800, 922550400, 941299200, 954000000, 967305600 } + :intvector { 36000, 0, 36000, 3600 } + :bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001" } + "AV" + :intvector { 36000, 2001 } + :intvector { 315, 323 } + } //Z#315 +, /* Australia/NSW */ :int { 321 } //Z#316 +, /* Australia/North */ :int { 310 } //Z#317 +, /* Australia/Perth */ :array { + :intvector { -1672559940, -1665385200, -883634400, -876121200, -860392800, -844671600, 152042400, 162928800, 436298400, 447184800, 690314400, 699386400 } + :intvector { 28800, 0, 28800, 3600 } + :bin { "010001000100010001000100" } + :intvector { 318, 324 } + } //Z#318 +, /* Australia/Queensland */ :int { 307 } //Z#319 +, /* Australia/South */ :int { 306 } //Z#320 +, /* Australia/Sydney */ :array { + :intvector { -1672567140, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 386697600, 404841600, 415728000, 436291200, 447177600, 467740800, 478627200, 499190400, 511286400, 530035200, 542736000, 562089600, 574790400, 594144000, 606240000, 625593600, 636480000, 657043200, 667929600, 688492800, 699379200, 719942400, 731433600, 751996800, 762883200, 783446400, 794332800, 814896000, 828201600, 846345600, 859651200, 877795200, 891100800, 909244800, 922550400, 941299200, 954000000, 967305600 } + :intvector { 36000, 0, 36000, 3600 } + :bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001" } + "AN" + :intvector { 36000, 2001 } + :intvector { 1, 305, 309, 316, 321 } + } //Z#321 +, /* Australia/Tasmania */ :int { 311 } //Z#322 +, /* Australia/Victoria */ :int { 315 } //Z#323 +, /* Australia/West */ :int { 318 } //Z#324 +, /* Australia/Yancowinna */ :int { 308 } //Z#325 +, /* BET */ :int { 175 } //Z#326 +, /* BST */ :int { 229 } //Z#327 +, /* Brazil/Acre */ :int { 171 } //Z#328 +, /* Brazil/DeNoronha */ :int { 156 } //Z#329 +, /* Brazil/East */ :int { 175 } //Z#330 +, /* Brazil/West */ :int { 140 } //Z#331 +, /* CAT */ :int { 28 } //Z#332 +, /* CET */ :array { + :intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 3600, 0, 3600, 3600 } + :bin { "0100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + "C-Eur" + :intvector { 3600, 1996 } + } //Z#333 +, /* CNT */ :int { 178 } //Z#334 +, /* CST */ :int { 91 } //Z#335 +, /* CST6CDT */ :int { 91 } //Z#336 +, /* CTT */ :int { 275 } //Z#337 +, /* Canada/Atlantic */ :int { 118 } //Z#338 +, /* Canada/Central */ :int { 193 } //Z#339 +, /* Canada/East-Saskatchewan */ :int { 170 } //Z#340 +, /* Canada/Eastern */ :int { 188 } //Z#341 +, /* Canada/Mountain */ :int { 103 } //Z#342 +, /* Canada/Newfoundland */ :int { 178 } //Z#343 +, /* Canada/Pacific */ :int { 190 } //Z#344 +, /* Canada/Saskatchewan */ :int { 170 } //Z#345 +, /* Canada/Yukon */ :int { 192 } //Z#346 +, /* Chile/Continental */ :int { 173 } //Z#347 +, /* Chile/EasterIsland */ :int { 500 } //Z#348 +, /* Cuba */ :int { 119 } //Z#349 +, /* EAT */ :int { 7 } //Z#350 +, /* ECT */ :int { 422 } //Z#351 +, /* EET */ :array { + :intvector { 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 7200, 0, 7200, 3600 } + :bin { "0100010001000100010001000100010001000100010001000100010001000100010001000100" } + "EU" + :intvector { 7200, 1996 } + } //Z#352 +, /* EST */ :int { 125 } //Z#353 +, /* EST5EDT */ :int { 153 } //Z#354 +, /* Egypt */ :int { 17 } //Z#355 +, /* Eire */ :int { 404 } //Z#356 +, /* Etc/GMT */ :array { + :intvector { } + :intvector { 0, 0 } + :bin { "" } + :intvector { 357, 358, 371, 386, 387, 448, 449, 450, 451, 452 } + } //Z#357 +, /* Etc/GMT+0 */ :int { 357 } //Z#358 +, /* Etc/GMT+1 */ :array { + :intvector { } + :intvector { -3600, 0 } + :bin { "" } + } //Z#359 +, /* Etc/GMT+10 */ :array { + :intvector { } + :intvector { -36000, 0 } + :bin { "" } + } //Z#360 +, /* Etc/GMT+11 */ :array { + :intvector { } + :intvector { -39600, 0 } + :bin { "" } + } //Z#361 +, /* Etc/GMT+12 */ :array { + :intvector { } + :intvector { -43200, 0 } + :bin { "" } + } //Z#362 +, /* Etc/GMT+2 */ :array { + :intvector { } + :intvector { -7200, 0 } + :bin { "" } + } //Z#363 +, /* Etc/GMT+3 */ :array { + :intvector { } + :intvector { -10800, 0 } + :bin { "" } + } //Z#364 +, /* Etc/GMT+4 */ :array { + :intvector { } + :intvector { -14400, 0 } + :bin { "" } + } //Z#365 +, /* Etc/GMT+5 */ :array { + :intvector { } + :intvector { -18000, 0 } + :bin { "" } + } //Z#366 +, /* Etc/GMT+6 */ :array { + :intvector { } + :intvector { -21600, 0 } + :bin { "" } + } //Z#367 +, /* Etc/GMT+7 */ :array { + :intvector { } + :intvector { -25200, 0 } + :bin { "" } + } //Z#368 +, /* Etc/GMT+8 */ :array { + :intvector { } + :intvector { -28800, 0 } + :bin { "" } + } //Z#369 +, /* Etc/GMT+9 */ :array { + :intvector { } + :intvector { -32400, 0 } + :bin { "" } + } //Z#370 +, /* Etc/GMT-0 */ :int { 357 } //Z#371 +, /* Etc/GMT-1 */ :array { + :intvector { } + :intvector { 3600, 0 } + :bin { "" } + } //Z#372 +, /* Etc/GMT-10 */ :array { + :intvector { } + :intvector { 36000, 0 } + :bin { "" } + } //Z#373 +, /* Etc/GMT-11 */ :array { + :intvector { } + :intvector { 39600, 0 } + :bin { "" } + } //Z#374 +, /* Etc/GMT-12 */ :array { + :intvector { } + :intvector { 43200, 0 } + :bin { "" } + } //Z#375 +, /* Etc/GMT-13 */ :array { + :intvector { } + :intvector { 46800, 0 } + :bin { "" } + } //Z#376 +, /* Etc/GMT-14 */ :array { + :intvector { } + :intvector { 50400, 0 } + :bin { "" } + } //Z#377 +, /* Etc/GMT-2 */ :array { + :intvector { } + :intvector { 7200, 0 } + :bin { "" } + } //Z#378 +, /* Etc/GMT-3 */ :array { + :intvector { } + :intvector { 10800, 0 } + :bin { "" } + } //Z#379 +, /* Etc/GMT-4 */ :array { + :intvector { } + :intvector { 14400, 0 } + :bin { "" } + } //Z#380 +, /* Etc/GMT-5 */ :array { + :intvector { } + :intvector { 18000, 0 } + :bin { "" } + } //Z#381 +, /* Etc/GMT-6 */ :array { + :intvector { } + :intvector { 21600, 0 } + :bin { "" } + } //Z#382 +, /* Etc/GMT-7 */ :array { + :intvector { } + :intvector { 25200, 0 } + :bin { "" } + } //Z#383 +, /* Etc/GMT-8 */ :array { + :intvector { } + :intvector { 28800, 0 } + :bin { "" } + } //Z#384 +, /* Etc/GMT-9 */ :array { + :intvector { } + :intvector { 32400, 0 } + :bin { "" } + } //Z#385 +, /* Etc/GMT0 */ :int { 357 } //Z#386 +, /* Etc/Greenwich */ :int { 357 } //Z#387 +, /* Etc/UCT */ :array { + :intvector { } + :intvector { 0, 0 } + :bin { "" } + :intvector { 388, 557 } + } //Z#388 +, /* Etc/UTC */ :array { + :intvector { } + :intvector { 0, 0 } + :bin { "" } + :intvector { 389, 390, 391, 571, 572, 576 } + } //Z#389 +, /* Etc/Universal */ :int { 389 } //Z#390 +, /* Etc/Zulu */ :int { 389 } //Z#391 +, /* Europe/Amsterdam */ :array { + :intvector { -1693700372, -1680484772, -1663453172, -1650147572, -1633213172, -1617488372, -1601158772, -1586038772, -1569709172, -1554589172, -1538259572, -1523139572, -1507501172, -1490566772, -1470176372, -1459117172, -1443997172, -1427667572, -1406672372, -1396217972, -1376950772, -1364768372, -1345414772, -1333318772, -1313792372, -1301264372, -1282256372, -1269814772, -1250720372, -1238365172, -1219184372, -1206915572, -1186957172, -1175465972, -1156025972, -1143411572, -1124489972, -1111961972, -1092953972, -1080512372, -1061331572, -1049062772, -1029190772, -1025745572, -1017613200, -998259600, -986163600, -966723600, -954109200, -935022000, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -766623600, 220921200, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 1172, 0, 1172, 3600, 1200, 0, 1200, 3600, 3600, 0, 3600, 3600 } + :bin { "010001000100010001000100010001000100010001000100010001000100010001000100010001000100010302030203020504050405040504040504050405040504050405040504050405040504050405040504050405040504050405040504" } + "EU" + :intvector { 3600, 1996 } + } //Z#392 +, /* Europe/Andorra */ :array { + :intvector { -733881600, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 3600, 0, 3600, 3600 } + :bin { "0001000100010001000100010001000100010001000100" } + "EU" + :intvector { 3600, 1996 } + } //Z#393 +, /* Europe/Athens */ :array { + :intvector { -1686101632, -1182996000, -1178161200, -906861600, -904878000, -857257200, -844477200, -828237600, -812422800, -552362400, -541652400, 166485600, 186184800, 198028800, 213753600, 228873600, 244080000, 260323200, 275446800, 291798000, 307407600, 323388000, 338936400, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 3600, 0, 3600, 3600, 7200, 0, 7200, 3600 } + :bin { "0203020301000100020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } + "EU" + :intvector { 7200, 1996 } + } //Z#394 +, /* Europe/Belfast */ :array { + :intvector { -1691962479, -1680471279, -1664143200, -1650146400, -1633903200, -1617487200, -1601848800, -1586037600, -1570399200, -1552168800, -1538344800, -1522533600, -1507500000, -1490565600, -1473631200, -1460930400, -1442786400, -1428876000, -1410732000, -1396216800, -1379282400, -1364767200, -1348437600, -1333317600, -1315778400, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1189980000, -1175464800, -1159135200, -1143410400, -1126476000, -1111960800, -1095631200, -1080511200, -1063576800, -1049061600, -1032127200, -1017612000, -1001282400, -986162400, -969228000, -950479200, -942012000, -904518000, -896050800, -875487600, -864601200, -844038000, -832546800, -812588400, -798073200, -781052400, -772066800, -764805600, -748476000, -733356000, -719445600, -717030000, -706748400, -699487200, -687996000, -668037600, -654732000, -636588000, -622072800, -605743200, -590623200, -574293600, -558568800, -542239200, -527119200, -512604000, -496274400, -481154400, -464220000, -449704800, -432165600, -417650400, -401320800, -386200800, -369266400, -354751200, -337816800, -323301600, -306972000, -291852000, -276732000, -257983200, -245282400, -226533600, -213228000, -195084000, -182383200, -163634400, -150933600, -132184800, -119484000, -100735200, -88034400, -68680800, -59004000, -37242000, 57722400, 69818400, 89172000, 101268000, 120621600, 132717600, 152071200, 164167200, 183520800, 196221600, 214970400, 227671200, 246420000, 259120800, 278474400, 290570400, 309924000, 322020000, 341373600, 354675600, 372819600, 386125200, 404269200, 417574800, 435718800, 449024400, 467773200, 481078800, 499222800, 512528400, 530672400, 543978000, 562122000, 575427600, 593571600, 606877200, 625626000, 638326800, 657075600, 670381200, 688525200, 701830800, 719974800, 733280400, 751424400, 764730000, 782874000, 796179600, 814323600 } + :intvector { -1521, 3600, 0, 0, 0, 3600, 0, 7200, 3600, 0 } + :bin { "00010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102030203020302030203020102010203020102010201020102010201020102010201020102010201020102010201020102010201020102010201020401020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + "EU" + :intvector { 0, 1996 } + } //Z#395 +, /* Europe/Belgrade */ :array { + :intvector { -905824800, -857257200, -844556400, -828226800, -812502000, -796777200, -777942000, -766623600, 407199600, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 3600, 0, 3600, 3600 } + :bin { "0100010001000100000100010001000100010001000100010001000100010001000100" } + "EU" + :intvector { 3600, 1996 } + :intvector { 396, 411, 428, 430, 442 } + } //Z#396 +, /* Europe/Berlin */ :array { + :intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -776563200, -765936000, -761180400, -748479600, -733273200, -717634800, -714610800, -710380800, -701910000, -684975600, -670460400, -654130800, -639010800, 315529200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 3600, 0, 3600, 3600, 3600, 7200 } + :bin { "0100010001000100010001000102010001000102010001000100000100010001000100010001000100010001000100010001000100010001000100" } + "EU" + :intvector { 3600, 1996 } + } //Z#397 +, /* Europe/Bratislava */ :int { 423 } //Z#398 +, /* Europe/Brussels */ :array { + :intvector { -1740355200, -1693702800, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -1613826000, -1604278800, -1585530000, -1574038800, -1552266000, -1539997200, -1520557200, -1507510800, -1490576400, -1473642000, -1459126800, -1444006800, -1427677200, -1411952400, -1396227600, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1191189600, -1175464800, -1160344800, -1143410400, -1127685600, -1111960800, -1096840800, -1080511200, -1063576800, -1049061600, -1033336800, -1017612000, -1002492000, -986162400, -969228000, -950479200, -942012000, -934668000, -857257200, -844556400, -828226800, -812502000, -799293600, -798073200, -781052400, -766623600, -745455600, -733273200, 220921200, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 0, 0, 0, 3600, 3600, 0, 3600, 3600 } + :bin { "0203020302030200010001000100010001000100010001000100010001000100010001000100010001000100010001000100010302030203030203020302020302030203020302030203020302030203020302030203020302030203020302030203020302" } + "EU" + :intvector { 3600, 1996 } + } //Z#399 +, /* Europe/Bucharest */ :array { + :intvector { -1213148664, -1187056800, -1175479200, -1159754400, -1144029600, -1127700000, -1111975200, -1096250400, -1080525600, -1064800800, -1049076000, -1033351200, -1017626400, -1001901600, -986176800, -970452000, -954727200, 296604000, 307486800, 323816400, 338940000, 354672000, 370396800, 386121600, 401846400, 417571200, 433296000, 449020800, 465350400, 481075200, 496800000, 512524800, 528249600, 543974400, 559699200, 575424000, 591148800, 606873600, 622598400, 638323200, 654652800, 662680800, 670370400, 686095200, 701820000, 717544800, 733269600, 748994400, 757375200, 764719200, 780440400, 796168800, 811890000 } + :intvector { 7200, 0, 7200, 3600 } + :bin { "0001000100010001000100010001000100010001000100010001000100010001000100010001000100000100010001000001000100" } + "EU" + :intvector { 7200, 1996 } + } //Z#400 +, /* Europe/Budapest */ :array { + :intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1640998800, -1633212000, -1617577200, -1600466400, -1587250800, -1569708000, -1554332400, -906937200, -857257200, -844556400, -828226800, -812502000, -796777200, -778471200, -762487200, -749689200, -733359600, -717634800, -701910000, -686185200, -670460400, -654130800, -639010800, -621990000, -605660400, -492656400, -481168800, -461120400, -449632800, -428547600, -418269600, -397094400, -386809200, 323827200, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 3600, 0, 3600, 3600 } + :bin { "010001000001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + "EU" + :intvector { 3600, 1996 } + } //Z#401 +, /* Europe/Chisinau */ :array { + :intvector { -1637114100, -1213148664, -1187056800, -1175479200, -1159754400, -1144029600, -1127700000, -1111975200, -1096250400, -1080525600, -1064800800, -1049076000, -1033351200, -1017626400, -1001901600, -986176800, -970452000, -954727200, -927165600, -898138800, -857257200, -844556400, -828226800, -812502000, -800157600, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 631141200, 641941200, 670377600, 686102400, 694216800, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000 } + :intvector { 3600, 0, 3600, 3600, 6264, 0, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } + :bin { "0203040304030403040304030403040304030401000100010506050605060506050605060506050605060505030403030403040304030403" } + "EU" + :intvector { 7200, 1996 } + :intvector { 402, 435 } + } //Z#402 +, /* Europe/Copenhagen */ :array { + :intvector { -1692496800, -1680490800, -935110800, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -769388400, -747010800, -736383600, -715215600, -706748400, -683161200, -675298800, 315529200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 3600, 0, 3600, 3600 } + :bin { "01000100010001000100010001000100000100010001000100010001000100010001000100010001000100010001000100" } + "EU" + :intvector { 3600, 1996 } + } //Z#403 +, /* Europe/Dublin */ :array { + :intvector { -1691962479, -1680471279, -1664143200, -1650146400, -1633903200, -1617487200, -1601848800, -1586037600, -1570399200, -1552168800, -1538344800, -1522533600, -1517011200, -1507500000, -1490565600, -1473631200, -1460930400, -1442786400, -1428876000, -1410732000, -1396216800, -1379282400, -1364767200, -1348437600, -1333317600, -1315778400, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1189980000, -1175464800, -1159135200, -1143410400, -1126476000, -1111960800, -1095631200, -1080511200, -1063576800, -1049061600, -1032127200, -1017612000, -1001282400, -986162400, -969228000, -950479200, -942012000, -733359600, -719445600, -699490800, -684972000, -668037600, -654732000, -636588000, -622072800, -605743200, -590623200, -574293600, -558568800, -542239200, -527119200, -512604000, -496274400, -481154400, -464220000, -449704800, -432165600, -417650400, -401320800, -386200800, -369266400, -354751200, -337816800, -323301600, -306972000, -291852000, -276732000, -257983200, -245282400, -226533600, -213228000, -195084000, -182383200, -163634400, -150933600, -132184800, -119484000, -100735200, -88034400, -68680800, -59004000, -37242000, 57722400, 69818400, 89172000, 101268000, 120621600, 132717600, 152071200, 164167200, 183520800, 196221600, 214970400, 227671200, 246420000, 259120800, 278474400, 290570400, 309924000, 322020000, 341373600, 354675600, 372819600, 386125200, 404269200, 417574800, 435718800, 449024400, 467773200, 481078800, 499222800, 512528400, 530672400, 543978000, 562122000, 575427600, 593571600, 606877200, 625626000, 638326800, 657075600, 670381200, 688525200, 701830800, 719974800, 733280400, 751424400, 764730000, 782874000, 796179600, 814323600 } + :intvector { -1521, 3600, 0, 0, 0, 3600, 3600, 0 } + :bin { "000102010201020102010201010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020301020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + "EU" + :intvector { 0, 1996 } + :intvector { 356, 404 } + } //Z#404 +, /* Europe/Gibraltar */ :array { + :intvector { -1691964000, -1680472800, -1664143200, -1650146400, -1633903200, -1617487200, -1601848800, -1586037600, -1570399200, -1552168800, -1538344800, -1522533600, -1507500000, -1490565600, -1473631200, -1460930400, -1442786400, -1428876000, -1410732000, -1396216800, -1379282400, -1364767200, -1348437600, -1333317600, -1315778400, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1189980000, -1175464800, -1159135200, -1143410400, -1126476000, -1111960800, -1095631200, -1080511200, -1063576800, -1049061600, -1032127200, -1017612000, -1001282400, -986162400, -969228000, -950479200, -942012000, -904518000, -896050800, -875487600, -864601200, -844038000, -832546800, -812588400, -798073200, -781052400, -772066800, -764805600, -748476000, -733356000, -719445600, -717030000, -706748400, -699487200, -687996000, -668037600, -654732000, -636588000, -622072800, -605743200, -590623200, -574293600, -558568800, -542239200, -527119200, -512604000, -496274400, -481154400, -464220000, -449704800, -432165600, -417650400, -401320800, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 0, 0, 0, 3600, 0, 7200, 3600, 0, 3600, 3600 } + :bin { "0100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000102010201020102010201000100010201000100010001000100010001000100010001000304030403040304030403040304030403040304030403040304030403" } + "EU" + :intvector { 3600, 1996 } + } //Z#405 +, /* Europe/Helsinki */ :array { + :intvector { -1535938792, -875671200, -859863600, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 7200, 0, 7200, 3600 } + :bin { "000100010001000100010001000100010001000100010001000100010001000100" } + "EU" + :intvector { 7200, 1996 } + :intvector { 406, 416 } + } //Z#406 +, /* Europe/Istanbul */ :array { + :intvector { -1869875816, -1693706400, -1680490800, -1570413600, -1552186800, -1538359200, -1522551600, -1507514400, -1490583600, -1440208800, -1428030000, -1409709600, -1396494000, -931140000, -922762800, -917834400, -892436400, -875844000, -857358000, -781063200, -764737200, -744343200, -733806000, -716436000, -701924400, -684986400, -670474800, -654141600, -639025200, -621828000, -606970800, -590032800, -575434800, -235620000, -228279600, -177732000, -165726000, 10533600, 23835600, 41983200, 55285200, 74037600, 87339600, 107910000, 121219200, 133920000, 152676000, 165362400, 183502800, 202428000, 215557200, 228866400, 245797200, 260316000, 277246800, 308779200, 323827200, 340228800, 354672000, 371678400, 386121600, 403128000, 428446800, 433886400, 482792400, 496702800, 512524800, 528249600, 543974400, 559699200, 575424000, 591148800, 606873600, 622598400, 638323200, 654652800, 662680800, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } + :bin { "000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001030203020302030203020100010001000100010001000001000100010001000100" } + "EU" + :intvector { 7200, 1996 } + :intvector { 238, 407, 556 } + } //Z#407 +, /* Europe/Kaliningrad */ :array { + :intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -788922000, -778730400, -762663600, -757389600, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 686102400, 701816400, 717537600, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800 } + :intvector { 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } + :bin { "01000100010001000100010002030204050405040504050405040504050405040504050403020302030203020302" } + "Russia" + :intvector { 7200, 1996 } + } //Z#408 +, /* Europe/Kiev */ :array { + :intvector { -1441159324, -1247536800, -892522800, -857257200, -844556400, -828226800, -825382800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 631141200, 646786800, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796179600, 811904400 } + :intvector { 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } + :bin { "0204010001000405040504050405040504050405040504050404020302030203020302" } + "EU" + :intvector { 7200, 1996 } + } //Z#409 +, /* Europe/Lisbon */ :array { + :intvector { -1830381808, -1689555600, -1677801600, -1667437200, -1647738000, -1635814800, -1616202000, -1604365200, -1584666000, -1572742800, -1553043600, -1541206800, -1521507600, -1442451600, -1426813200, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301274000, -1284339600, -1269824400, -1221440400, -1206925200, -1191200400, -1175475600, -1127696400, -1111971600, -1096851600, -1080522000, -1063587600, -1049072400, -1033347600, -1017622800, -1002502800, -986173200, -969238800, -950490000, -942022800, -922669200, -906944400, -891133200, -877309200, -873684000, -864007200, -857955600, -845859600, -842839200, -831348000, -825901200, -814410000, -810784800, -799898400, -794451600, -782960400, -779335200, -768448800, -763002000, -749091600, -733366800, -717631200, -701906400, -686181600, -670456800, -654732000, -639007200, -591832800, -575503200, -559778400, -544053600, -528328800, -512604000, -496879200, -481154400, -465429600, -449704800, -433980000, -417650400, -401925600, -386200800, -370476000, -354751200, -339026400, -323301600, -307576800, -291852000, -276127200, -260402400, -244677600, -228348000, -212623200, -196898400, -181173600, -165448800, -149724000, -133999200, -118274400, 212544000, 228268800, 243993600, 260323200, 276048000, 291772800, 307501200, 323222400, 338950800, 354675600, 370400400, 386125200, 401850000, 417578400, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 0, 0, 0, 3600, 0, 7200, 3600, 0, 3600, 3600 } + :bin { "0001000100010001000100010001000100010001000100010001000100010001000100010001000100010001020100010201000102010001020100010001000100010001000100010001000100010001000100010001000100010001000100010003000100010001000100010001000100010001000100010001000100010001000103040304030403" } + "EU" + :intvector { 0, 1996 } + :intvector { 410, 538 } + } //Z#410 +, /* Europe/Ljubljana */ :int { 396 } //Z#411 +, /* Europe/London */ :array { + :intvector { -1691964000, -1680472800, -1664143200, -1650146400, -1633903200, -1617487200, -1601848800, -1586037600, -1570399200, -1552168800, -1538344800, -1522533600, -1507500000, -1490565600, -1473631200, -1460930400, -1442786400, -1428876000, -1410732000, -1396216800, -1379282400, -1364767200, -1348437600, -1333317600, -1315778400, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1189980000, -1175464800, -1159135200, -1143410400, -1126476000, -1111960800, -1095631200, -1080511200, -1063576800, -1049061600, -1032127200, -1017612000, -1001282400, -986162400, -969228000, -950479200, -942012000, -904518000, -896050800, -875487600, -864601200, -844038000, -832546800, -812588400, -798073200, -781052400, -772066800, -764805600, -748476000, -733356000, -719445600, -717030000, -706748400, -699487200, -687996000, -668037600, -654732000, -636588000, -622072800, -605743200, -590623200, -574293600, -558568800, -542239200, -527119200, -512604000, -496274400, -481154400, -464220000, -449704800, -432165600, -417650400, -401320800, -386200800, -369266400, -354751200, -337816800, -323301600, -306972000, -291852000, -276732000, -257983200, -245282400, -226533600, -213228000, -195084000, -182383200, -163634400, -150933600, -132184800, -119484000, -100735200, -88034400, -68680800, -59004000, -37242000, 57722400, 69818400, 89172000, 101268000, 120621600, 132717600, 152071200, 164167200, 183520800, 196221600, 214970400, 227671200, 246420000, 259120800, 278474400, 290570400, 309924000, 322020000, 341373600, 354675600, 372819600, 386125200, 404269200, 417574800, 435718800, 449024400, 467773200, 481078800, 499222800, 512528400, 530672400, 543978000, 562122000, 575427600, 593571600, 606877200, 625626000, 638326800, 657075600, 670381200, 688525200, 701830800, 719974800, 733280400, 751424400, 764730000, 782874000, 796179600, 814323600 } + :intvector { 0, 0, 0, 3600, 0, 7200, 3600, 0 } + :bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001020102010201020102010001000102010001000100010001000100010001000100010001000100010001000100010001000100010001000100010300010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + "EU" + :intvector { 0, 1996 } + :intvector { 412, 446, 447 } + } //Z#412 +, /* Europe/Luxembourg */ :array { + :intvector { -2069713476, -1692496800, -1680483600, -1662343200, -1650157200, -1632006000, -1618700400, -1612659600, -1604278800, -1585519200, -1574038800, -1552258800, -1539997200, -1520550000, -1507510800, -1490572800, -1473642000, -1459119600, -1444006800, -1427673600, -1411866000, -1396224000, -1379293200, -1364774400, -1348448400, -1333324800, -1316394000, -1301270400, -1284339600, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1191189600, -1175464800, -1160344800, -1143410400, -1127685600, -1111960800, -1096840800, -1080511200, -1063576800, -1049061600, -1033336800, -1017612000, -1002492000, -986162400, -969228000, -950479200, -942012000, -935186400, -857257200, -844556400, -828226800, -812502000, -797986800, -781052400, -766623600, -745455600, -733273200, 220921200, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 0, 0, 0, 3600, 3600, 0, 3600, 3600 } + :bin { "02030203020302000100010001000100010001000100010001000100010001000100010001000100010001000100010001000103020302030203020302020302030203020302030203020302030203020302030203020302030203020302030203020302" } + "EU" + :intvector { 3600, 1996 } + } //Z#413 +, /* Europe/Madrid */ :array { + :intvector { -1661734800, -1648429200, -1631926800, -1616893200, -1601254800, -1585357200, -1442451600, -1427677200, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301274000, -1284339600, -1269824400, -1029114000, -1017622800, -1002848400, -986173200, -969238800, -954118800, -940208400, -873079200, -862538400, -842839200, -828237600, -811389600, -796010400, -779940000, -765421200, -748490400, -733888800, -652327200, -639190800, 135122400, 150246000, 167176800, 181695600, 196812000, 212540400, 228866400, 243990000, 260402400, 276044400, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 0, 0, 0, 3600, 0, 7200, 3600, 0, 3600, 3600 } + :bin { "01000100010001000100010001000100010001000100010201020102010201020304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403" } + "EU" + :intvector { 3600, 1996 } + } //Z#414 +, /* Europe/Malta */ :array { + :intvector { -1690851600, -1680483600, -1664758800, -1649034000, -1635123600, -1616979600, -1604278800, -1585530000, -1571014800, -1555290000, -932432400, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -766717200, -750898800, -733359600, -719456400, -701917200, -689209200, -670460400, -114051600, -103168800, -81997200, -71719200, -50547600, -40269600, -18493200, -8215200, 12956400, 23234400, 43801200, 54687600, 75855600, 86738400, 102380400, 118105200, 135730800, 148518000, 167187600, 180489600, 198637200, 211939200, 230086800, 243388800, 261536400, 274838400, 292986000, 306288000, 323312400, 338342400, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 3600, 0, 3600, 3600 } + :bin { "010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + "EU" + :intvector { 3600, 1996 } + } //Z#415 +, /* Europe/Mariehamn */ :int { 406 } //Z#416 +, /* Europe/Minsk */ :array { + :intvector { -1441158600, -1247536800, -899780400, -857257200, -844556400, -828226800, -812502000, -804650400, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 631141200, 670374000, 686102400, 701820000, 717544800, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800 } + :intvector { 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } + :bin { "02040100010001040504050405040504050405040504050405040403020302030203020302" } + "Russia" + :intvector { 7200, 1996 } + } //Z#417 +, /* Europe/Monaco */ :array { + :intvector { -1855958961, -1689814800, -1680397200, -1665363600, -1648342800, -1635123600, -1616893200, -1604278800, -1585443600, -1574038800, -1552266000, -1539997200, -1520557200, -1507510800, -1490576400, -1470618000, -1459126800, -1444006800, -1427677200, -1411952400, -1396227600, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301274000, -1284339600, -1269824400, -1253494800, -1238374800, -1221440400, -1206925200, -1191200400, -1175475600, -1160355600, -1143421200, -1127696400, -1111971600, -1096851600, -1080522000, -1063587600, -1049072400, -1033347600, -1017622800, -1002502800, -986173200, -969238800, -950490000, -942012000, -904438800, -891136800, -877827600, -857257200, -844556400, -828226800, -812502000, -796266000, -781052400, -766623600, 196819200, 212540400, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 0, 0, 0, 3600, 0, 7200, 3600, 0, 3600, 3600 } + :bin { "00010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010201020102010201020304030403040304030403040304030403040304030403040304030403040304030403040304030403" } + "EU" + :intvector { 3600, 1996 } + } //Z#418 +, /* Europe/Moscow */ :array { + :intvector { -1688265000, -1656819048, -1641353448, -1627965048, -1618716648, -1596429048, -1593829848, -1589860800, -1542427200, -1539493200, -1525323600, -1522728000, -1491188400, -1247536800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 686102400, 695779200, 701812800, 717534000, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200 } + :intvector { 7200, 0, 7200, 3600, 9048, 0, 9048, 3600, 9048, 7200, 10800, 0, 10800, 3600, 10800, 7200 } + :bin { "020302040304060506070605000506050605060506050605060506050605060506050100050605060506050605" } + "Russia" + :intvector { 10800, 1996 } + :intvector { 419, 574 } + } //Z#419 +, /* Europe/Nicosia */ :int { 257 } //Z#420 +, /* Europe/Oslo */ :array { + :intvector { -1691884800, -1680573600, -927511200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -765327600, -340844400, -324514800, -308790000, -293065200, -277340400, -261615600, -245890800, -230166000, -214441200, -198716400, -182991600, -166662000, -147913200, -135212400, 315529200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 3600, 0, 3600, 3600 } + :bin { "010001000100010001000100010001000100010001000100000100010001000100010001000100010001000100010001000100010001000100" } + "EU" + :intvector { 3600, 1996 } + :intvector { 206, 299, 421 } + } //Z#421 +, /* Europe/Paris */ :array { + :intvector { -1855958901, -1689814800, -1680397200, -1665363600, -1648342800, -1635123600, -1616893200, -1604278800, -1585443600, -1574038800, -1552266000, -1539997200, -1520557200, -1507510800, -1490576400, -1470618000, -1459126800, -1444006800, -1427677200, -1411952400, -1396227600, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301274000, -1284339600, -1269824400, -1253494800, -1238374800, -1221440400, -1206925200, -1191200400, -1175475600, -1160355600, -1143421200, -1127696400, -1111971600, -1096851600, -1080522000, -1063587600, -1049072400, -1033347600, -1017622800, -1002502800, -986173200, -969238800, -950490000, -942012000, -932436000, -857257200, -844556400, -828226800, -812502000, -800071200, -796266000, -781052400, -766623600, 196819200, 212540400, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 0, 0, 0, 3600, 0, 7200, 3600, 0, 3600, 3600 } + :bin { "000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000104030403040201020304030403040304030403040304030403040304030403040304030403040304030403040304030403" } + "EU" + :intvector { 3600, 1996 } + :intvector { 351, 422 } + } //Z#422 +, /* Europe/Prague */ :array { + :intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -798073200, -780534000, -761180400, -746578800, -733359600, -716425200, -701910000, -684975600, -670460400, -654217200, -639010800, 283993200, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 3600, 0, 3600, 3600 } + :bin { "010001000100010001000100010001000100010001000001000100010001000100010001000100010001000100010001000100010001000100" } + "EU" + :intvector { 3600, 1996 } + :intvector { 398, 423 } + } //Z#423 +, /* Europe/Riga */ :array { + :intvector { -1632008184, -1618702584, -1601681784, -1597275384, -1377308184, -928029600, -899521200, -857257200, -844556400, -828226800, -812502000, -796777200, -795834000, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622598400, 638323200, 654652800, 670377600, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800 } + :intvector { 3600, 0, 3600, 3600, 5784, 0, 5784, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } + :bin { "03020302040601000100010006070607060706070607060706070607060504050405040504050405040504" } + "EU" + :intvector { 7200, 1996 } + } //Z#424 +, /* Europe/Rome */ :array { + :intvector { -1690851600, -1680483600, -1664758800, -1649034000, -1635123600, -1616979600, -1604278800, -1585530000, -1571014800, -1555290000, -932432400, -857257200, -844556400, -828226800, -812502000, -804823200, -798080400, -781052400, -766717200, -750898800, -733359600, -719456400, -701917200, -689209200, -670460400, -114051600, -103168800, -81997200, -71719200, -50547600, -40269600, -18493200, -8215200, 12956400, 23234400, 43801200, 54687600, 75855600, 86738400, 107910000, 118188000, 138754800, 149637600, 170809200, 181090800, 202258800, 212540400, 233103600, 243990000, 265158000, 276044400, 296607600, 307494000, 315529200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 3600, 0, 3600, 3600 } + :bin { "0100010001000100010001000100010100010001000100010001000100010001000100010001000100010001000100010001000100000100010001000100010001000100010001000100010001000100010001000100" } + "EU" + :intvector { 3600, 1996 } + :intvector { 425, 427, 438 } + } //Z#425 +, /* Europe/Samara */ :array { + :intvector { -1593825636, -1247540400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622594800, 638319600, 654649200, 670374000, 686102400, 687916800, 701809200, 717530400, 733269600, 748994400, 764719200, 780444000, 796168800, 811893600 } + :intvector { 7200, 3600, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } + :bin { "010304030403040304030403040304030403020102010001030403040304030403" } + "Russia" + :intvector { 14400, 1996 } + } //Z#426 +, /* Europe/San_Marino */ :int { 425 } //Z#427 +, /* Europe/Sarajevo */ :int { 396 } //Z#428 +, /* Europe/Simferopol */ :array { + :intvector { -1441160160, -1247536800, -888894000, -857257200, -844556400, -828226800, -812502000, -811648800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 631141200, 646786800, 701820000, 717541200, 733269600, 748990800, 764719200, 767739600, 780436800, 796165200, 811886400 } + :intvector { 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } + :bin { "02040100010001040504050405040504050405040504050405040402030203020305040504" } + "EU" + :intvector { 7200, 1996 } + } //Z#429 +, /* Europe/Skopje */ :int { 396 } //Z#430 +, /* Europe/Sofia */ :array { + :intvector { -857257200, -844556400, -828226800, -812502000, -796777200, -781048800, 291762000, 307576800, 323816400, 339026400, 355266000, 370393200, 386715600, 401846400, 417571200, 433296000, 449020800, 465350400, 481075200, 496800000, 512524800, 528249600, 543974400, 559699200, 575424000, 591148800, 606873600, 622598400, 638323200, 654652800, 662680800, 670370400, 686091600, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000 } + :intvector { 3600, 0, 3600, 3600, 7200, 0, 7200, 3600 } + :bin { "0001000100020302030203020302030203020302030203020302030203020203020302030203020302" } + "EU" + :intvector { 7200, 1996 } + } //Z#431 +, /* Europe/Stockholm */ :array { + :intvector { -1692496800, -1680483600, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 3600, 0, 3600, 3600 } + :bin { "01000100010001000100010001000100010001000100010001000100010001000100" } + "EU" + :intvector { 3600, 1996 } + } //Z#432 +, /* Europe/Tallinn */ :array { + :intvector { -1638322740, -1632006000, -1618700400, -1593824400, -1535938740, -927943200, -892954800, -857257200, -844556400, -828226800, -812502000, -797652000, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622598400, 638323200, 654652800, 670377600, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800 } + :intvector { 3600, 0, 3600, 3600, 5940, 0, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } + :bin { "000100020305010001000105060506050605060506050605060506050403040304030403040304030403" } + "EU" + :intvector { 7200, 1996 } + } //Z#433 +, /* Europe/Tirane */ :array { + :intvector { -1767230360, -932346000, -857257200, -844556400, -843519600, 136854000, 149896800, 168130800, 181432800, 199839600, 213141600, 231894000, 244591200, 263257200, 276040800, 294706800, 307490400, 326156400, 339458400, 357087600, 370389600, 389142000, 402444000, 419468400, 433807200, 449622000, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 3600, 0, 3600, 3600 } + :bin { "00010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + "EU" + :intvector { 3600, 1996 } + } //Z#434 +, /* Europe/Tiraspol */ :int { 402 } //Z#435 +, /* Europe/Uzhgorod */ :array { + :intvector { -938905200, -857257200, -844556400, -828226800, -812502000, -796874400, -794714400, -773456400, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 631141200, 646786800, 670384800, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796179600, 811904400 } + :intvector { 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } + :bin { "01000100010100040504050405040504050405040504050405040400020302030203020302" } + "EU" + :intvector { 7200, 1996 } + } //Z#436 +, /* Europe/Vaduz */ :array { + :intvector { 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 3600, 0, 3600, 3600 } + :bin { "010001000100010001000100010001000100010001000100010001000100" } + "EU" + :intvector { 3600, 1996 } + } //Z#437 +, /* Europe/Vatican */ :int { 425 } //Z#438 +, /* Europe/Vienna */ :array { + :intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -1577926800, -1569711600, -1555801200, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -780188400, -757386000, -748479600, -733359600, -717634800, -701910000, -684975600, -670460400, 323823600, 338940000, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 3600, 0, 3600, 3600 } + :bin { "0100010001000001000100010001000100000100010001000100010001000100010001000100010001000100010001000100010001000100" } + "EU" + :intvector { 3600, 1996 } + } //Z#439 +, /* Europe/Vilnius */ :array { + :intvector { -1672536240, -1585100136, -1561251600, -1553565600, -928198800, -900126000, -857257200, -844556400, -828226800, -812502000, -802144800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800 } + :intvector { 3600, 0, 3600, 3600, 5736, 0, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } + :bin { "0200030005010001000105060506050605060506050605060506050605060504030403040304030403" } + "EU" + :intvector { 7200, 1996 } + } //Z#440 +, /* Europe/Warsaw */ :array { + :intvector { -1717032240, -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -1600473600, -1587168000, -1501725600, -931734000, -857257200, -844556400, -828226800, -812502000, -796874400, -778726800, -762660000, -748486800, -735876000, -715222800, -701920800, -684982800, -670471200, -397094400, -386812800, -371088000, -355363200, -334195200, -323308800, -307584000, -291859200, -271296000, -260409600, -239846400, -228960000, -208396800, -197510400, -176342400, -166060800, 228873600, 243993600, 260323200, 276048000, 291772800, 307497600, 323827200, 338947200, 354672000, 370396800, 386121600, 401846400, 417571200, 433296000, 449020800, 465350400, 481075200, 496800000, 512524800, 528249600, 543974400, 559699200, 575424000, 591148800, 606873600, 622598400, 638323200, 654652800, 670377600, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800 } + :intvector { 3600, 0, 3600, 3600, 7200, 0, 7200, 3600 } + :bin { "000100010001020302000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + "EU" + :intvector { 3600, 1996 } + :intvector { 441, 537 } + } //Z#441 +, /* Europe/Zagreb */ :int { 396 } //Z#442 +, /* Europe/Zaporozhye */ :array { + :intvector { -1441160400, -1247536800, -894769200, -857257200, -844556400, -828226800, -826419600, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 686091600, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796179600, 811904400 } + :intvector { 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } + :bin { "02040100010004050405040504050405040504050405040504050403020302030203020302" } + "EU" + :intvector { 7200, 1996 } + } //Z#443 +, /* Europe/Zurich */ :array { + :intvector { -920336400, -915242400, -904518000, -891223200, -873068400, -859773600, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 3600, 0, 3600, 3600 } + :bin { "010001000100010001000100010001000100010001000100010001000100010001000100" } + "EU" + :intvector { 3600, 1996 } + } //Z#444 +, /* Factory */ :array { + :intvector { } + :intvector { 0, 0 } + :bin { "" } + } //Z#445 +, /* GB */ :int { 412 } //Z#446 +, /* GB-Eire */ :int { 412 } //Z#447 +, /* GMT */ :int { 357 } //Z#448 +, /* GMT+0 */ :int { 357 } //Z#449 +, /* GMT-0 */ :int { 357 } //Z#450 +, /* GMT0 */ :int { 357 } //Z#451 +, /* Greenwich */ :int { 357 } //Z#452 +, /* HST */ :int { 510 } //Z#453 +, /* Hongkong */ :int { 235 } //Z#454 +, /* IET */ :int { 125 } //Z#455 +, /* IST */ :int { 222 } //Z#456 +, /* Iceland */ :int { 301 } //Z#457 +, /* Indian/Antananarivo */ :array { + :intvector { -1846293004, -499924800, -492062400 } + :intvector { 10800, 0, 10800, 3600 } + :bin { "000100" } + } //Z#458 +, /* Indian/Chagos */ :array { + :intvector { 820436400 } + :intvector { 21600, 0 } + :bin { "00" } + } //Z#459 +, /* Indian/Christmas */ :array { + :intvector { } + :intvector { 25200, 0 } + :bin { "" } + } //Z#460 +, /* Indian/Cocos */ :array { + :intvector { } + :intvector { 23400, 0 } + :bin { "" } + } //Z#461 +, /* Indian/Comoro */ :array { + :intvector { -1846291984 } + :intvector { 10800, 0 } + :bin { "00" } + } //Z#462 +, /* Indian/Kerguelen */ :array { + :intvector { -631152000 } + :intvector { 18000, 0 } + :bin { "00" } + } //Z#463 +, /* Indian/Mahe */ :array { + :intvector { -2006653308 } + :intvector { 14400, 0 } + :bin { "00" } + } //Z#464 +, /* Indian/Maldives */ :array { + :intvector { -315636840 } + :intvector { 18000, 0 } + :bin { "00" } + } //Z#465 +, /* Indian/Mauritius */ :array { + :intvector { -1988164200 } + :intvector { 14400, 0 } + :bin { "00" } + } //Z#466 +, /* Indian/Mayotte */ :array { + :intvector { -1846292456 } + :intvector { 10800, 0 } + :bin { "00" } + } //Z#467 +, /* Indian/Reunion */ :array { + :intvector { -1848886912 } + :intvector { 14400, 0 } + :bin { "00" } + } //Z#468 +, /* Iran */ :int { 280 } //Z#469 +, /* Israel */ :int { 241 } //Z#470 +, /* JST */ :int { 284 } //Z#471 +, /* Jamaica */ :int { 128 } //Z#472 +, /* Japan */ :int { 284 } //Z#473 +, /* Kwajalein */ :int { 514 } //Z#474 +, /* Libya */ :int { 54 } //Z#475 +, /* MET */ :array { + :intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 3600, 0, 3600, 3600 } + :bin { "0100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + "C-Eur" + :intvector { 3600, 1996 } + } //Z#476 +, /* MIT */ :int { 497 } //Z#477 +, /* MST */ :int { 161 } //Z#478 +, /* MST7MDT */ :int { 100 } //Z#479 +, /* Mexico/BajaNorte */ :int { 187 } //Z#480 +, /* Mexico/BajaSur */ :int { 142 } //Z#481 +, /* Mexico/General */ :int { 146 } //Z#482 +, /* Mideast/Riyadh87 */ :int { 268 } //Z#483 +, /* Mideast/Riyadh88 */ :int { 269 } //Z#484 +, /* Mideast/Riyadh89 */ :int { 270 } //Z#485 +, /* NET */ :int { 293 } //Z#486 +, /* NST */ :int { 498 } //Z#487 +, /* NZ */ :int { 498 } //Z#488 +, /* NZ-CHAT */ :int { 499 } //Z#489 +, /* Navajo */ :int { 100 } //Z#490 +, /* PLT */ :int { 244 } //Z#491 +, /* PNT */ :int { 161 } //Z#492 +, /* PRC */ :int { 275 } //Z#493 +, /* PRT */ :int { 166 } //Z#494 +, /* PST */ :int { 136 } //Z#495 +, /* PST8PDT */ :int { 136 } //Z#496 +, /* Pacific/Apia */ :array { + :intvector { -1861878784, -631110600 } + :intvector { -41400, 0, -39600, 0 } + :bin { "0001" } + :intvector { 477, 497 } + } //Z#497 +, /* Pacific/Auckland */ :array { + :intvector { -1330335000, -1320057000, -1300699800, -1287396000, -1269250200, -1255946400, -1237800600, -1224496800, -1206351000, -1192442400, -1174901400, -1160992800, -1143451800, -1125914400, -1112607000, -1094464800, -1081157400, -1063015200, -1049707800, -1031565600, -1018258200, -1000116000, -986808600, -968061600, -955359000, -936612000, -923304600, -757425600, 152632800, 162309600, 183477600, 194968800, 215532000, 226418400, 246981600, 257868000, 278431200, 289317600, 309880800, 320767200, 341330400, 352216800, 372780000, 384271200, 404834400, 415720800, 436284000, 447170400, 467733600, 478620000, 499183200, 510069600, 530632800, 541519200, 562082400, 573573600, 594136800, 605023200, 623772000 } + :intvector { 41400, 0, 41400, 1800, 41400, 3600, 43200, 0, 43200, 3600 } + :bin { "0200010001000100010001000100010001000100010001000100010304030403040304030403040304030403040304030403040304030403040304" } + "NZ" + :intvector { 43200, 1990 } + :intvector { 487, 488, 498 } + } //Z#498 +, /* Pacific/Chatham */ :array { + :intvector { -410271228, 152632800, 162309600, 183477600, 194968800, 215532000, 226418400, 246981600, 257868000, 278431200, 289317600, 309880800, 320767200, 341330400, 352216800, 372780000, 384271200, 404834400, 415720800, 436284000, 447170400, 467733600, 478620000, 499183200, 510069600, 530632800, 541519200, 562082400, 573573600, 594136800, 605023200, 623772000 } + :intvector { 45900, 0, 45900, 3600 } + :bin { "0001000100010001000100010001000100010001000100010001000100010001" } + "Chatham" + :intvector { 45900, 1990 } + :intvector { 489, 499 } + } //Z#499 +, /* Pacific/Easter */ :array { + :intvector { -1178124152, -101937600, -88635600, -69883200, -57186000, -38433600, -25736400, -6984000, 6318000, 24465600, 37767600, 55915200, 69217200, 87969600, 100666800, 119419200, 132116400, 150868800, 163566000, 182318400, 195620400, 213768000, 227070000, 245217600, 258519600, 277272000, 289969200, 308721600, 321418800, 340171200, 353473200, 371620800, 384922800, 384937200, 403070400, 416372400, 434520000, 447822000, 466574400, 479271600, 498024000, 510721200, 529473600, 542775600, 560923200, 574225200, 592372800, 605674800, 624427200, 637124400, 655876800, 668574000, 687326400, 700628400, 718776000, 732078000, 750225600, 763527600, 781675200, 794977200, 813729600, 826426800, 845179200, 857876400, 876628800, 889930800, 906868800, 923194800, 939528000 } + :intvector { -25200, 0, -25200, 3600, -21600, 0, -21600, 3600 } + :bin { "000100010001000100010001000100010001000100010001000100010001000100020302030203020302030203020302030203020302030203020302030203020302030203" } + "Chile" + :intvector { -21600, 2000 } + :intvector { 348, 500 } + } //Z#500 +, /* Pacific/Efate */ :array { + :intvector { -1829387596, 433256400, 448977600, 467298000, 480427200, 496760400, 511876800, 528210000, 543931200, 559659600, 575380800, 591109200, 606830400, 622558800, 638280000, 654008400, 669729600, 686062800, 696340800, 719931600, 727790400 } + :intvector { 39600, 0, 39600, 3600 } + :bin { "000100010001000100010001000100010001000100" } + } //Z#501 +, /* Pacific/Enderbury */ :array { + :intvector { 307627200, 788958000 } + :intvector { -39600, 0, 46800, 0 } + :bin { "0001" } + } //Z#502 +, /* Pacific/Fakaofo */ :array { + :intvector { } + :intvector { -36000, 0 } + :bin { "" } + } //Z#503 +, /* Pacific/Fiji */ :array { + :intvector { -1709985220, 909842400, 920124000, 941896800, 951573600 } + :intvector { 43200, 0, 43200, 3600 } + :bin { "0001000100" } + } //Z#504 +, /* Pacific/Funafuti */ :array { + :intvector { } + :intvector { 43200, 0 } + :bin { "" } + } //Z#505 +, /* Pacific/Galapagos */ :array { + :intvector { -1230746496, 504939600 } + :intvector { -21600, 0, -18000, 0 } + :bin { "0100" } + } //Z#506 +, /* Pacific/Gambier */ :array { + :intvector { -1806678012 } + :intvector { -32400, 0 } + :bin { "00" } + :intvector { 507, 554 } + } //Z#507 +, /* Pacific/Guadalcanal */ :array { + :intvector { -1806748788 } + :intvector { 39600, 0 } + :bin { "00" } + :intvector { 508, 541 } + } //Z#508 +, /* Pacific/Guam */ :array { + :intvector { 977493600 } + :intvector { 36000, 0 } + :bin { "00" } + } //Z#509 +, /* Pacific/Honolulu */ :array { + :intvector { -1157283000, -1155472200, -880198200, -769395600, -765376200, -712150200 } + :intvector { -37800, 0, -37800, 3600, -36000, 0 } + :bin { "010001010002" } + :intvector { 453, 510, 549, 564 } + } //Z#510 +, /* Pacific/Johnston */ :array { + :intvector { } + :intvector { -36000, 0 } + :bin { "" } + } //Z#511 +, /* Pacific/Kiritimati */ :array { + :intvector { 307622400, 788954400 } + :intvector { -36000, 0, 50400, 0 } + :bin { "0001" } + } //Z#512 +, /* Pacific/Kosrae */ :array { + :intvector { -7988400, 915105600 } + :intvector { 39600, 0, 43200, 0 } + :bin { "0100" } + } //Z#513 +, /* Pacific/Kwajalein */ :array { + :intvector { -7988400, 745848000 } + :intvector { -43200, 0, 43200, 0 } + :bin { "0001" } + :intvector { 474, 514 } + } //Z#514 +, /* Pacific/Majuro */ :array { + :intvector { -7988400 } + :intvector { 43200, 0 } + :bin { "00" } + } //Z#515 +, /* Pacific/Marquesas */ :array { + :intvector { -1806676920 } + :intvector { -34200, 0 } + :bin { "00" } + } //Z#516 +, /* Pacific/Midway */ :array { + :intvector { -428504400, -420645600, -86878800, 439038000 } + :intvector { -39600, 0, -39600, 3600 } + :bin { "01000000" } + } //Z#517 +, /* Pacific/Nauru */ :array { + :intvector { -1545131260, -877347000, -800960400, 294323400 } + :intvector { 32400, 0, 41400, 0, 43200, 0 } + :bin { "01000102" } + } //Z#518 +, /* Pacific/Niue */ :array { + :intvector { -599575200, 276089400 } + :intvector { -41400, 0, -39600, 0 } + :bin { "0001" } + } //Z#519 +, /* Pacific/Norfolk */ :array { + :intvector { -599656320 } + :intvector { 41400, 0 } + :bin { "00" } + } //Z#520 +, /* Pacific/Noumea */ :array { + :intvector { -1829387148, 250002000, 257342400, 281451600, 288878400, 849366000, 857228400 } + :intvector { 39600, 0, 39600, 3600 } + :bin { "00010001000100" } + } //Z#521 +, /* Pacific/Pago_Pago */ :array { + :intvector { -1861879032, -631110600, -86878800, 439038000 } + :intvector { -41400, 0, -39600, 0 } + :bin { "00010101" } + :intvector { 522, 529, 570 } + } //Z#522 +, /* Pacific/Palau */ :array { + :intvector { } + :intvector { 32400, 0 } + :bin { "" } + } //Z#523 +, /* Pacific/Pitcairn */ :array { + :intvector { 893665800 } + :intvector { -28800, 0 } + :bin { "00" } + :intvector { 524, 552 } + } //Z#524 +, /* Pacific/Ponape */ :array { + :intvector { } + :intvector { 39600, 0 } + :bin { "" } + } //Z#525 +, /* Pacific/Port_Moresby */ :array { + :intvector { } + :intvector { 36000, 0 } + :bin { "" } + } //Z#526 +, /* Pacific/Rarotonga */ :array { + :intvector { 279714600, 289387800, 309952800, 320837400, 341402400, 352287000, 372852000, 384341400, 404906400, 415791000, 436356000, 447240600, 467805600, 478690200, 499255200, 510139800, 530704800, 541589400, 562154400, 573643800, 594208800, 605093400, 625658400, 636543000, 657108000, 667992600 } + :intvector { -36000, 0, -36000, 1800 } + :bin { "0100010001000100010001000100010001000100010001000100" } + } //Z#527 +, /* Pacific/Saipan */ :array { + :intvector { -7981200, 977493600 } + :intvector { 36000, 0 } + :bin { "0000" } + } //Z#528 +, /* Pacific/Samoa */ :int { 522 } //Z#529 +, /* Pacific/Tahiti */ :array { + :intvector { -1806674504 } + :intvector { -36000, 0 } + :bin { "00" } + } //Z#530 +, /* Pacific/Tarawa */ :array { + :intvector { } + :intvector { 43200, 0 } + :bin { "" } + } //Z#531 +, /* Pacific/Tongatapu */ :array { + :intvector { -915193200, 939214800, 953384400, 973342800, 980596800, 1004792400, 1012046400 } + :intvector { 46800, 0, 46800, 3600 } + :bin { "00010001000100" } + } //Z#532 +, /* Pacific/Truk */ :array { + :intvector { } + :intvector { 36000, 0 } + :bin { "" } + } //Z#533 +, /* Pacific/Wake */ :array { + :intvector { } + :intvector { 43200, 0 } + :bin { "" } + } //Z#534 +, /* Pacific/Wallis */ :array { + :intvector { } + :intvector { 43200, 0 } + :bin { "" } + } //Z#535 +, /* Pacific/Yap */ :array { + :intvector { -7981200 } + :intvector { 36000, 0 } + :bin { "00" } + } //Z#536 +, /* Poland */ :int { 441 } //Z#537 +, /* Portugal */ :int { 410 } //Z#538 +, /* ROC */ :int { 277 } //Z#539 +, /* ROK */ :int { 274 } //Z#540 +, /* SST */ :int { 508 } //Z#541 +, /* Singapore */ :int { 276 } //Z#542 +, /* SystemV/AST4 */ :int { 166 } //Z#543 +, /* SystemV/AST4ADT */ :int { 118 } //Z#544 +, /* SystemV/CST6 */ :int { 170 } //Z#545 +, /* SystemV/CST6CDT */ :int { 91 } //Z#546 +, /* SystemV/EST5 */ :int { 125 } //Z#547 +, /* SystemV/EST5EDT */ :int { 153 } //Z#548 +, /* SystemV/HST10 */ :int { 510 } //Z#549 +, /* SystemV/MST7 */ :int { 161 } //Z#550 +, /* SystemV/MST7MDT */ :int { 100 } //Z#551 +, /* SystemV/PST8 */ :int { 524 } //Z#552 +, /* SystemV/PST8PDT */ :int { 136 } //Z#553 +, /* SystemV/YST9 */ :int { 507 } //Z#554 +, /* SystemV/YST9YDT */ :int { 58 } //Z#555 +, /* Turkey */ :int { 407 } //Z#556 +, /* UCT */ :int { 388 } //Z#557 +, /* US/Alaska */ :int { 58 } //Z#558 +, /* US/Aleutian */ :int { 57 } //Z#559 +, /* US/Arizona */ :int { 161 } //Z#560 +, /* US/Central */ :int { 91 } //Z#561 +, /* US/East-Indiana */ :int { 125 } //Z#562 +, /* US/Eastern */ :int { 153 } //Z#563 +, /* US/Hawaii */ :int { 510 } //Z#564 +, /* US/Indiana-Starke */ :int { 122 } //Z#565 +, /* US/Michigan */ :int { 101 } //Z#566 +, /* US/Mountain */ :int { 100 } //Z#567 +, /* US/Pacific */ :int { 136 } //Z#568 +, /* US/Pacific-New */ :int { 136 } //Z#569 +, /* US/Samoa */ :int { 522 } //Z#570 +, /* UTC */ :int { 389 } //Z#571 +, /* Universal */ :int { 389 } //Z#572 +, /* VST */ :int { 271 } //Z#573 +, /* W-SU */ :int { 419 } //Z#574 +, /* WET */ :array { + :intvector { 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400 } + :intvector { 0, 0, 0, 3600 } + :bin { "0100010001000100010001000100010001000100010001000100010001000100010001000100" } + "EU" + :intvector { 0, 1996 } + } //Z#575 +, /* Zulu */ :int { 389 } //Z#576 + } + Names { + "ACT","AET","AGT","ART","AST","Africa/Abidjan","Africa/Accra" // 6 + ,"Africa/Addis_Ababa","Africa/Algiers","Africa/Asmera" // 9 + ,"Africa/Bamako","Africa/Bangui","Africa/Banjul","Africa/Bissau" // 13 + ,"Africa/Blantyre","Africa/Brazzaville","Africa/Bujumbura" // 16 + ,"Africa/Cairo","Africa/Casablanca","Africa/Ceuta" // 19 + ,"Africa/Conakry","Africa/Dakar","Africa/Dar_es_Salaam" // 22 + ,"Africa/Djibouti","Africa/Douala","Africa/El_Aaiun" // 25 + ,"Africa/Freetown","Africa/Gaborone","Africa/Harare" // 28 + ,"Africa/Johannesburg","Africa/Kampala","Africa/Khartoum" // 31 + ,"Africa/Kigali","Africa/Kinshasa","Africa/Lagos","Africa/Libreville" // 35 + ,"Africa/Lome","Africa/Luanda","Africa/Lubumbashi" // 38 + ,"Africa/Lusaka","Africa/Malabo","Africa/Maputo","Africa/Maseru" // 42 + ,"Africa/Mbabane","Africa/Mogadishu","Africa/Monrovia" // 45 + ,"Africa/Nairobi","Africa/Ndjamena","Africa/Niamey" // 48 + ,"Africa/Nouakchott","Africa/Ouagadougou","Africa/Porto-Novo" // 51 + ,"Africa/Sao_Tome","Africa/Timbuktu","Africa/Tripoli" // 54 + ,"Africa/Tunis","Africa/Windhoek","America/Adak","America/Anchorage" // 58 + ,"America/Anguilla","America/Antigua","America/Araguaina" // 61 + ,"America/Argentina/Buenos_Aires","America/Argentina/Catamarca" // 63 + ,"America/Argentina/ComodRivadavia","America/Argentina/Cordoba" // 65 + ,"America/Argentina/Jujuy","America/Argentina/La_Rioja" // 67 + ,"America/Argentina/Mendoza","America/Argentina/Rio_Gallegos" // 69 + ,"America/Argentina/San_Juan","America/Argentina/Tucuman" // 71 + ,"America/Argentina/Ushuaia","America/Aruba","America/Asuncion" // 74 + ,"America/Atka","America/Bahia","America/Barbados" // 77 + ,"America/Belem","America/Belize","America/Boa_Vista" // 80 + ,"America/Bogota","America/Boise","America/Buenos_Aires" // 83 + ,"America/Cambridge_Bay","America/Campo_Grande","America/Cancun" // 86 + ,"America/Caracas","America/Catamarca","America/Cayenne" // 89 + ,"America/Cayman","America/Chicago","America/Chihuahua" // 92 + ,"America/Cordoba","America/Costa_Rica","America/Cuiaba" // 95 + ,"America/Curacao","America/Danmarkshavn","America/Dawson" // 98 + ,"America/Dawson_Creek","America/Denver","America/Detroit" // 101 + ,"America/Dominica","America/Edmonton","America/Eirunepe" // 104 + ,"America/El_Salvador","America/Ensenada","America/Fort_Wayne" // 107 + ,"America/Fortaleza","America/Glace_Bay","America/Godthab" // 110 + ,"America/Goose_Bay","America/Grand_Turk","America/Grenada" // 113 + ,"America/Guadeloupe","America/Guatemala","America/Guayaquil" // 116 + ,"America/Guyana","America/Halifax","America/Havana" // 119 + ,"America/Hermosillo","America/Indiana/Indianapolis" // 121 + ,"America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Vevay" // 124 + ,"America/Indianapolis","America/Inuvik","America/Iqaluit" // 127 + ,"America/Jamaica","America/Jujuy","America/Juneau" // 130 + ,"America/Kentucky/Louisville","America/Kentucky/Monticello" // 132 + ,"America/Knox_IN","America/La_Paz","America/Lima" // 135 + ,"America/Los_Angeles","America/Louisville","America/Maceio" // 138 + ,"America/Managua","America/Manaus","America/Martinique" // 141 + ,"America/Mazatlan","America/Mendoza","America/Menominee" // 144 + ,"America/Merida","America/Mexico_City","America/Miquelon" // 147 + ,"America/Monterrey","America/Montevideo","America/Montreal" // 150 + ,"America/Montserrat","America/Nassau","America/New_York" // 153 + ,"America/Nipigon","America/Nome","America/Noronha" // 156 + ,"America/North_Dakota/Center","America/Panama","America/Pangnirtung" // 159 + ,"America/Paramaribo","America/Phoenix","America/Port-au-Prince" // 162 + ,"America/Port_of_Spain","America/Porto_Acre","America/Porto_Velho" // 165 + ,"America/Puerto_Rico","America/Rainy_River","America/Rankin_Inlet" // 168 + ,"America/Recife","America/Regina","America/Rio_Branco" // 171 + ,"America/Rosario","America/Santiago","America/Santo_Domingo" // 174 + ,"America/Sao_Paulo","America/Scoresbysund","America/Shiprock" // 177 + ,"America/St_Johns","America/St_Kitts","America/St_Lucia" // 180 + ,"America/St_Thomas","America/St_Vincent","America/Swift_Current" // 183 + ,"America/Tegucigalpa","America/Thule","America/Thunder_Bay" // 186 + ,"America/Tijuana","America/Toronto","America/Tortola" // 189 + ,"America/Vancouver","America/Virgin","America/Whitehorse" // 192 + ,"America/Winnipeg","America/Yakutat","America/Yellowknife" // 195 + ,"Antarctica/Casey","Antarctica/Davis","Antarctica/DumontDUrville" // 198 + ,"Antarctica/Mawson","Antarctica/McMurdo","Antarctica/Palmer" // 201 + ,"Antarctica/Rothera","Antarctica/South_Pole","Antarctica/Syowa" // 204 + ,"Antarctica/Vostok","Arctic/Longyearbyen","Asia/Aden" // 207 + ,"Asia/Almaty","Asia/Amman","Asia/Anadyr","Asia/Aqtau" // 211 + ,"Asia/Aqtobe","Asia/Ashgabat","Asia/Ashkhabad","Asia/Baghdad" // 215 + ,"Asia/Bahrain","Asia/Baku","Asia/Bangkok","Asia/Beirut" // 219 + ,"Asia/Bishkek","Asia/Brunei","Asia/Calcutta","Asia/Choibalsan" // 223 + ,"Asia/Chongqing","Asia/Chungking","Asia/Colombo","Asia/Dacca" // 227 + ,"Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai" // 231 + ,"Asia/Dushanbe","Asia/Gaza","Asia/Harbin","Asia/Hong_Kong" // 235 + ,"Asia/Hovd","Asia/Irkutsk","Asia/Istanbul","Asia/Jakarta" // 239 + ,"Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka" // 243 + ,"Asia/Karachi","Asia/Kashgar","Asia/Katmandu","Asia/Krasnoyarsk" // 247 + ,"Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macao" // 251 + ,"Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila" // 255 + ,"Asia/Muscat","Asia/Nicosia","Asia/Novosibirsk","Asia/Omsk" // 259 + ,"Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak","Asia/Pyongyang" // 263 + ,"Asia/Qatar","Asia/Qyzylorda","Asia/Rangoon","Asia/Riyadh" // 267 + ,"Asia/Riyadh87","Asia/Riyadh88","Asia/Riyadh89","Asia/Saigon" // 271 + ,"Asia/Sakhalin","Asia/Samarkand","Asia/Seoul","Asia/Shanghai" // 275 + ,"Asia/Singapore","Asia/Taipei","Asia/Tashkent","Asia/Tbilisi" // 279 + ,"Asia/Tehran","Asia/Tel_Aviv","Asia/Thimbu","Asia/Thimphu" // 283 + ,"Asia/Tokyo","Asia/Ujung_Pandang","Asia/Ulaanbaatar" // 286 + ,"Asia/Ulan_Bator","Asia/Urumqi","Asia/Vientiane","Asia/Vladivostok" // 290 + ,"Asia/Yakutsk","Asia/Yekaterinburg","Asia/Yerevan" // 293 + ,"Atlantic/Azores","Atlantic/Bermuda","Atlantic/Canary" // 296 + ,"Atlantic/Cape_Verde","Atlantic/Faeroe","Atlantic/Jan_Mayen" // 299 + ,"Atlantic/Madeira","Atlantic/Reykjavik","Atlantic/South_Georgia" // 302 + ,"Atlantic/St_Helena","Atlantic/Stanley","Australia/ACT" // 305 + ,"Australia/Adelaide","Australia/Brisbane","Australia/Broken_Hill" // 308 + ,"Australia/Canberra","Australia/Darwin","Australia/Hobart" // 311 + ,"Australia/LHI","Australia/Lindeman","Australia/Lord_Howe" // 314 + ,"Australia/Melbourne","Australia/NSW","Australia/North" // 317 + ,"Australia/Perth","Australia/Queensland","Australia/South" // 320 + ,"Australia/Sydney","Australia/Tasmania","Australia/Victoria" // 323 + ,"Australia/West","Australia/Yancowinna","BET","BST" // 327 + ,"Brazil/Acre","Brazil/DeNoronha","Brazil/East","Brazil/West" // 331 + ,"CAT","CET","CNT","CST","CST6CDT","CTT","Canada/Atlantic" // 338 + ,"Canada/Central","Canada/East-Saskatchewan","Canada/Eastern" // 341 + ,"Canada/Mountain","Canada/Newfoundland","Canada/Pacific" // 344 + ,"Canada/Saskatchewan","Canada/Yukon","Chile/Continental" // 347 + ,"Chile/EasterIsland","Cuba","EAT","ECT","EET","EST" // 353 + ,"EST5EDT","Egypt","Eire","Etc/GMT","Etc/GMT+0","Etc/GMT+1" // 359 + ,"Etc/GMT+10","Etc/GMT+11","Etc/GMT+12","Etc/GMT+2" // 363 + ,"Etc/GMT+3","Etc/GMT+4","Etc/GMT+5","Etc/GMT+6","Etc/GMT+7" // 368 + ,"Etc/GMT+8","Etc/GMT+9","Etc/GMT-0","Etc/GMT-1","Etc/GMT-10" // 373 + ,"Etc/GMT-11","Etc/GMT-12","Etc/GMT-13","Etc/GMT-14" // 377 + ,"Etc/GMT-2","Etc/GMT-3","Etc/GMT-4","Etc/GMT-5","Etc/GMT-6" // 382 + ,"Etc/GMT-7","Etc/GMT-8","Etc/GMT-9","Etc/GMT0","Etc/Greenwich" // 387 + ,"Etc/UCT","Etc/UTC","Etc/Universal","Etc/Zulu","Europe/Amsterdam" // 392 + ,"Europe/Andorra","Europe/Athens","Europe/Belfast" // 395 + ,"Europe/Belgrade","Europe/Berlin","Europe/Bratislava" // 398 + ,"Europe/Brussels","Europe/Bucharest","Europe/Budapest" // 401 + ,"Europe/Chisinau","Europe/Copenhagen","Europe/Dublin" // 404 + ,"Europe/Gibraltar","Europe/Helsinki","Europe/Istanbul" // 407 + ,"Europe/Kaliningrad","Europe/Kiev","Europe/Lisbon" // 410 + ,"Europe/Ljubljana","Europe/London","Europe/Luxembourg" // 413 + ,"Europe/Madrid","Europe/Malta","Europe/Mariehamn" // 416 + ,"Europe/Minsk","Europe/Monaco","Europe/Moscow","Europe/Nicosia" // 420 + ,"Europe/Oslo","Europe/Paris","Europe/Prague","Europe/Riga" // 424 + ,"Europe/Rome","Europe/Samara","Europe/San_Marino" // 427 + ,"Europe/Sarajevo","Europe/Simferopol","Europe/Skopje" // 430 + ,"Europe/Sofia","Europe/Stockholm","Europe/Tallinn" // 433 + ,"Europe/Tirane","Europe/Tiraspol","Europe/Uzhgorod" // 436 + ,"Europe/Vaduz","Europe/Vatican","Europe/Vienna","Europe/Vilnius" // 440 + ,"Europe/Warsaw","Europe/Zagreb","Europe/Zaporozhye" // 443 + ,"Europe/Zurich","Factory","GB","GB-Eire","GMT","GMT+0" // 449 + ,"GMT-0","GMT0","Greenwich","HST","Hongkong","IET" // 455 + ,"IST","Iceland","Indian/Antananarivo","Indian/Chagos" // 459 + ,"Indian/Christmas","Indian/Cocos","Indian/Comoro" // 462 + ,"Indian/Kerguelen","Indian/Mahe","Indian/Maldives" // 465 + ,"Indian/Mauritius","Indian/Mayotte","Indian/Reunion" // 468 + ,"Iran","Israel","JST","Jamaica","Japan","Kwajalein" // 474 + ,"Libya","MET","MIT","MST","MST7MDT","Mexico/BajaNorte" // 480 + ,"Mexico/BajaSur","Mexico/General","Mideast/Riyadh87" // 483 + ,"Mideast/Riyadh88","Mideast/Riyadh89","NET","NST" // 487 + ,"NZ","NZ-CHAT","Navajo","PLT","PNT","PRC","PRT","PST" // 495 + ,"PST8PDT","Pacific/Apia","Pacific/Auckland","Pacific/Chatham" // 499 + ,"Pacific/Easter","Pacific/Efate","Pacific/Enderbury" // 502 + ,"Pacific/Fakaofo","Pacific/Fiji","Pacific/Funafuti" // 505 + ,"Pacific/Galapagos","Pacific/Gambier","Pacific/Guadalcanal" // 508 + ,"Pacific/Guam","Pacific/Honolulu","Pacific/Johnston" // 511 + ,"Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein" // 514 + ,"Pacific/Majuro","Pacific/Marquesas","Pacific/Midway" // 517 + ,"Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea" // 521 + ,"Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn" // 524 + ,"Pacific/Ponape","Pacific/Port_Moresby","Pacific/Rarotonga" // 527 + ,"Pacific/Saipan","Pacific/Samoa","Pacific/Tahiti" // 530 + ,"Pacific/Tarawa","Pacific/Tongatapu","Pacific/Truk" // 533 + ,"Pacific/Wake","Pacific/Wallis","Pacific/Yap","Poland" // 537 + ,"Portugal","ROC","ROK","SST","Singapore","SystemV/AST4" // 543 + ,"SystemV/AST4ADT","SystemV/CST6","SystemV/CST6CDT" // 546 + ,"SystemV/EST5","SystemV/EST5EDT","SystemV/HST10","SystemV/MST7" // 550 + ,"SystemV/MST7MDT","SystemV/PST8","SystemV/PST8PDT" // 553 + ,"SystemV/YST9","SystemV/YST9YDT","Turkey","UCT","US/Alaska" // 558 + ,"US/Aleutian","US/Arizona","US/Central","US/East-Indiana" // 562 + ,"US/Eastern","US/Hawaii","US/Indiana-Starke","US/Michigan" // 566 + ,"US/Mountain","US/Pacific","US/Pacific-New","US/Samoa" // 570 + ,"UTC","Universal","VST","W-SU","WET","Zulu" // 576 + } + Rules { + AN:intvector { + 9, -31, -1, 7200, 1, 2, -31, -1, 7200, 1, 3600 + } //_#0 + AS:intvector { + 9, -31, -1, 7200, 1, 2, -31, -1, 7200, 1, 3600 + } //_#1 + AT:intvector { + 9, 1, -1, 7200, 1, 2, -31, -1, 7200, 1, 3600 + } //_#2 + AV:intvector { + 9, -31, -1, 7200, 1, 2, -31, -1, 7200, 1, 3600 + } //_#3 + Azer:intvector { + 2, -31, -1, 3600, 0, 9, -31, -1, 3600, 0, 3600 + } //_#4 + Bahamas:intvector { + 3, 1, -1, 7200, 0, 9, -31, -1, 7200, 0, 3600 + } //_#5 + Brazil:intvector { + 9, 15, -1, 0, 0, 1, 15, -1, 0, 0, 3600 + } //_#6 + C-Eur:intvector { + 2, -31, -1, 7200, 1, 9, -31, -1, 7200, 1, 3600 + } //_#7 + Canada:intvector { + 3, 1, -1, 7200, 0, 9, -31, -1, 7200, 0, 3600 + } //_#8 + Chatham:intvector { + 9, 1, -1, 9900, 1, 2, 15, -1, 9900, 1, 3600 + } //_#9 + Chile:intvector { + 9, 9, -1, 14400, 2, 2, 9, -1, 10800, 2, 3600 + } //_#10 + ChileAQ:intvector { + 9, 9, -1, 0, 0, 2, 9, -1, 0, 0, 3600 + } //_#11 + Cuba:intvector { + 3, 1, -1, 0, 1, 9, -31, -1, 0, 1, 3600 + } //_#12 + EU:intvector { + 2, -31, -1, 3600, 2, 9, -31, -1, 3600, 2, 3600 + } //_#13 + EUAsia:intvector { + 2, -31, -1, 3600, 2, 9, -31, -1, 3600, 2, 3600 + } //_#14 + Edm:intvector { + 3, 1, -1, 7200, 0, 9, -31, -1, 7200, 0, 3600 + } //_#15 + Egypt:intvector { + 3, -30, -6, 0, 1, 8, -30, -5, 82800, 1, 3600 + } //_#16 + Falk:intvector { + 8, 1, -1, 7200, 0, 3, 15, -1, 7200, 0, 3600 + } //_#17 + Iraq:intvector { + 3, 1, 0, 10800, 1, 9, 1, 0, 10800, 1, 3600 + } //_#18 + Jordan:intvector { + 2, -31, -5, 0, 1, 8, -30, -5, 0, 1, 3600 + } //_#19 + Kirgiz:intvector { + 2, -31, -1, 9000, 0, 9, -31, -1, 9000, 0, 3600 + } //_#20 + LH:intvector { + 9, -31, -1, 7200, 0, 2, -31, -1, 7200, 0, 1800 + } //_#21 + Lebanon:intvector { + 2, -31, -1, 0, 0, 9, -31, -1, 0, 0, 3600 + } //_#22 + Mexico:intvector { + 3, 1, -1, 7200, 0, 9, -31, -1, 7200, 0, 3600 + } //_#23 + Mongol:intvector { + 2, -31, -7, 7200, 0, 8, -30, -7, 7200, 0, 3600 + } //_#24 + NT_YK:intvector { + 3, 1, -1, 7200, 0, 9, -31, -1, 7200, 0, 3600 + } //_#25 + NZ:intvector { + 9, 1, -1, 7200, 1, 2, 15, -1, 7200, 1, 3600 + } //_#26 + NZAQ:intvector { + 9, 1, -1, 7200, 1, 2, 15, -1, 7200, 1, 3600 + } //_#27 + Namibia:intvector { + 8, 1, -1, 7200, 0, 3, 1, -1, 7200, 0, 3600 + } //_#28 + Palestine:intvector { + 3, 15, -6, 0, 0, 9, 15, -6, 0, 0, 3600 + } //_#29 + Para:intvector { + 8, 1, -1, 0, 0, 3, 1, -1, 0, 0, 3600 + } //_#30 + Russia:intvector { + 2, -31, -1, 7200, 1, 9, -31, -1, 7200, 1, 3600 + } //_#31 + RussiaAsia:intvector { + 2, -31, -1, 7200, 1, 9, -31, -1, 7200, 1, 3600 + } //_#32 + StJohns:intvector { + 3, 1, -1, 60, 0, 9, -31, -1, 60, 0, 3600 + } //_#33 + Syria:intvector { + 3, 1, 0, 0, 0, 9, 1, 0, 0, 0, 3600 + } //_#34 + TC:intvector { + 3, 1, -1, 0, 0, 9, -31, -1, 0, 0, 3600 + } //_#35 + Thule:intvector { + 3, 1, -1, 7200, 0, 9, -31, -1, 7200, 0, 3600 + } //_#36 + US:intvector { + 3, 1, -1, 7200, 0, 9, -31, -1, 7200, 0, 3600 + } //_#37 + Vanc:intvector { + 3, 1, -1, 7200, 0, 9, -31, -1, 7200, 0, 3600 + } //_#38 + Winn:intvector { + 3, 1, -1, 7200, 0, 9, -31, -1, 7200, 1, 3600 + } //_#39 + } + Regions { + Default:intvector { 268, 269, 270, 333, 352, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 445, 448, 449, 450, 451, 452, 476, 483, 484, 485, 557, 571, 572, 575, 576 } //R#0 + AD:intvector { 393 } //R#1 + AE:intvector { 231 } //R#2 + AF:intvector { 242 } //R#3 + AG:intvector { 60 } //R#4 + AI:intvector { 59 } //R#5 + AL:intvector { 434 } //R#6 + AM:intvector { 293, 486 } //R#7 + AN:intvector { 96 } //R#8 + AO:intvector { 37 } //R#9 + AQ:intvector { 196, 197, 198, 199, 200, 201, 202, 203, 204, 205 } //R#10 + AR:intvector { 2, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 83, 88, 93, 129, 143, 172 } //R#11 + AS:intvector { 522, 529, 570 } //R#12 + AT:intvector { 439 } //R#13 + AU:intvector { 0, 1, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325 } //R#14 + AW:intvector { 73 } //R#15 + AX:intvector { 416 } //R#16 + AZ:intvector { 217 } //R#17 + BA:intvector { 428 } //R#18 + BB:intvector { 77 } //R#19 + BD:intvector { 227, 229, 327 } //R#20 + BE:intvector { 399 } //R#21 + BF:intvector { 50 } //R#22 + BG:intvector { 431 } //R#23 + BH:intvector { 216 } //R#24 + BI:intvector { 16 } //R#25 + BJ:intvector { 51 } //R#26 + BM:intvector { 295 } //R#27 + BN:intvector { 221 } //R#28 + BO:intvector { 134 } //R#29 + BR:intvector { 61, 76, 78, 80, 85, 95, 104, 108, 138, 140, 156, 164, 165, 169, 171, 175, 326, 328, 329, 330, 331 } //R#30 + BS:intvector { 152 } //R#31 + BT:intvector { 282, 283 } //R#32 + BW:intvector { 27 } //R#33 + BY:intvector { 417 } //R#34 + BZ:intvector { 79 } //R#35 + CA:intvector { 84, 98, 99, 103, 109, 111, 118, 126, 127, 150, 154, 159, 167, 168, 170, 178, 183, 186, 188, 190, 192, 193, 195, 334, 338, 339, 340, 341, 342, 343, 344, 345, 346, 544, 545 } //R#36 + CC:intvector { 461 } //R#37 + CD:intvector { 33, 38 } //R#38 + CF:intvector { 11 } //R#39 + CG:intvector { 15 } //R#40 + CH:intvector { 444 } //R#41 + CI:intvector { 5 } //R#42 + CK:intvector { 527 } //R#43 + CL:intvector { 173, 347, 348, 500 } //R#44 + CM:intvector { 24 } //R#45 + CN:intvector { 224, 225, 234, 245, 275, 288, 337, 493 } //R#46 + CO:intvector { 81 } //R#47 + CR:intvector { 94 } //R#48 + CS:intvector { 396 } //R#49 + CU:intvector { 119, 349 } //R#50 + CV:intvector { 297 } //R#51 + CX:intvector { 460 } //R#52 + CY:intvector { 257, 420 } //R#53 + CZ:intvector { 423 } //R#54 + DE:intvector { 397 } //R#55 + DJ:intvector { 23 } //R#56 + DK:intvector { 403 } //R#57 + DM:intvector { 102 } //R#58 + DO:intvector { 174 } //R#59 + DZ:intvector { 8 } //R#60 + EC:intvector { 116, 506 } //R#61 + EE:intvector { 433 } //R#62 + EG:intvector { 3, 17, 355 } //R#63 + EH:intvector { 25 } //R#64 + ER:intvector { 9 } //R#65 + ES:intvector { 19, 296, 414 } //R#66 + ET:intvector { 7, 350 } //R#67 + FI:intvector { 406 } //R#68 + FJ:intvector { 504 } //R#69 + FK:intvector { 304 } //R#70 + FM:intvector { 513, 525, 533, 536 } //R#71 + FO:intvector { 298 } //R#72 + FR:intvector { 351, 422 } //R#73 + GA:intvector { 35 } //R#74 + GB:intvector { 395, 412, 446, 447 } //R#75 + GD:intvector { 113 } //R#76 + GE:intvector { 279 } //R#77 + GF:intvector { 89 } //R#78 + GH:intvector { 6 } //R#79 + GI:intvector { 405 } //R#80 + GL:intvector { 97, 110, 176, 185 } //R#81 + GM:intvector { 12 } //R#82 + GN:intvector { 20 } //R#83 + GP:intvector { 114 } //R#84 + GQ:intvector { 40 } //R#85 + GR:intvector { 394 } //R#86 + GS:intvector { 302 } //R#87 + GT:intvector { 115 } //R#88 + GU:intvector { 509 } //R#89 + GW:intvector { 13 } //R#90 + GY:intvector { 117 } //R#91 + HK:intvector { 235, 454 } //R#92 + HN:intvector { 184 } //R#93 + HR:intvector { 442 } //R#94 + HT:intvector { 162 } //R#95 + HU:intvector { 401 } //R#96 + ID:intvector { 239, 240, 254, 262, 285 } //R#97 + IE:intvector { 356, 404 } //R#98 + IL:intvector { 241, 281, 470 } //R#99 + IN:intvector { 222, 456 } //R#100 + IO:intvector { 459 } //R#101 + IQ:intvector { 215 } //R#102 + IR:intvector { 280, 469 } //R#103 + IS:intvector { 301, 457 } //R#104 + IT:intvector { 425 } //R#105 + JM:intvector { 128, 472 } //R#106 + JO:intvector { 209 } //R#107 + JP:intvector { 284, 471, 473 } //R#108 + KE:intvector { 46 } //R#109 + KG:intvector { 220 } //R#110 + KH:intvector { 261 } //R#111 + KI:intvector { 502, 512, 531 } //R#112 + KM:intvector { 462 } //R#113 + KN:intvector { 179 } //R#114 + KP:intvector { 263 } //R#115 + KR:intvector { 274, 540 } //R#116 + KW:intvector { 250 } //R#117 + KY:intvector { 90 } //R#118 + KZ:intvector { 208, 211, 212, 260, 265 } //R#119 + LA:intvector { 289 } //R#120 + LB:intvector { 219 } //R#121 + LC:intvector { 180 } //R#122 + LI:intvector { 437 } //R#123 + LK:intvector { 226 } //R#124 + LR:intvector { 45 } //R#125 + LS:intvector { 42 } //R#126 + LT:intvector { 440 } //R#127 + LU:intvector { 413 } //R#128 + LV:intvector { 424 } //R#129 + LY:intvector { 54, 475 } //R#130 + MA:intvector { 18 } //R#131 + MC:intvector { 418 } //R#132 + MD:intvector { 402, 435 } //R#133 + MG:intvector { 458 } //R#134 + MH:intvector { 474, 514, 515 } //R#135 + MK:intvector { 430 } //R#136 + ML:intvector { 10, 53 } //R#137 + MM:intvector { 266 } //R#138 + MN:intvector { 223, 236, 286, 287 } //R#139 + MO:intvector { 251, 252 } //R#140 + MP:intvector { 528 } //R#141 + MQ:intvector { 141 } //R#142 + MR:intvector { 49 } //R#143 + MS:intvector { 151 } //R#144 + MT:intvector { 415 } //R#145 + MU:intvector { 466 } //R#146 + MV:intvector { 465 } //R#147 + MW:intvector { 14 } //R#148 + MX:intvector { 86, 92, 106, 120, 142, 145, 146, 148, 187, 480, 481, 482 } //R#149 + MY:intvector { 248, 249 } //R#150 + MZ:intvector { 41 } //R#151 + NA:intvector { 56 } //R#152 + NC:intvector { 521 } //R#153 + NE:intvector { 48 } //R#154 + NF:intvector { 520 } //R#155 + NG:intvector { 34 } //R#156 + NI:intvector { 139 } //R#157 + NL:intvector { 392 } //R#158 + NO:intvector { 421 } //R#159 + NP:intvector { 246 } //R#160 + NR:intvector { 518 } //R#161 + NU:intvector { 519 } //R#162 + NZ:intvector { 487, 488, 489, 498, 499 } //R#163 + OM:intvector { 256 } //R#164 + PA:intvector { 158 } //R#165 + PE:intvector { 135 } //R#166 + PF:intvector { 507, 516, 530, 554 } //R#167 + PG:intvector { 526 } //R#168 + PH:intvector { 255 } //R#169 + PK:intvector { 244, 491 } //R#170 + PL:intvector { 441, 537 } //R#171 + PM:intvector { 147 } //R#172 + PN:intvector { 524, 552 } //R#173 + PR:intvector { 166, 494, 543 } //R#174 + PS:intvector { 233 } //R#175 + PT:intvector { 294, 300, 410, 538 } //R#176 + PW:intvector { 523 } //R#177 + PY:intvector { 74 } //R#178 + QA:intvector { 264 } //R#179 + RE:intvector { 468 } //R#180 + RO:intvector { 400 } //R#181 + RU:intvector { 210, 237, 243, 247, 253, 258, 259, 272, 290, 291, 292, 408, 419, 426, 574 } //R#182 + RW:intvector { 32 } //R#183 + SA:intvector { 267 } //R#184 + SB:intvector { 508, 541 } //R#185 + SC:intvector { 464 } //R#186 + SD:intvector { 31 } //R#187 + SE:intvector { 432 } //R#188 + SG:intvector { 276, 542 } //R#189 + SH:intvector { 303 } //R#190 + SI:intvector { 411 } //R#191 + SJ:intvector { 206, 299 } //R#192 + SK:intvector { 398 } //R#193 + SL:intvector { 26 } //R#194 + SM:intvector { 427 } //R#195 + SN:intvector { 21 } //R#196 + SO:intvector { 44 } //R#197 + SR:intvector { 160 } //R#198 + ST:intvector { 52 } //R#199 + SV:intvector { 105 } //R#200 + SY:intvector { 228 } //R#201 + SZ:intvector { 43 } //R#202 + TC:intvector { 112 } //R#203 + TD:intvector { 47 } //R#204 + TF:intvector { 463 } //R#205 + TG:intvector { 36 } //R#206 + TH:intvector { 218 } //R#207 + TJ:intvector { 232 } //R#208 + TK:intvector { 503 } //R#209 + TL:intvector { 230 } //R#210 + TM:intvector { 213, 214 } //R#211 + TN:intvector { 55 } //R#212 + TO:intvector { 532 } //R#213 + TR:intvector { 238, 407, 556 } //R#214 + TT:intvector { 163 } //R#215 + TV:intvector { 505 } //R#216 + TW:intvector { 277, 539 } //R#217 + TZ:intvector { 22 } //R#218 + UA:intvector { 409, 429, 436, 443 } //R#219 + UG:intvector { 30 } //R#220 + UM:intvector { 511, 517, 534 } //R#221 + US:intvector { 4, 57, 58, 75, 82, 91, 100, 101, 107, 121, 122, 123, 124, 125, 130, 131, 132, 133, 136, 137, 144, 153, 155, 157, 161, 177, 194, 335, 336, 353, 354, 453, 455, 478, 479, 490, 492, 495, 496, 510, 546, 547, 548, 549, 550, 551, 553, 555, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569 } //R#222 + UY:intvector { 149 } //R#223 + UZ:intvector { 273, 278 } //R#224 + VA:intvector { 438 } //R#225 + VC:intvector { 182 } //R#226 + VE:intvector { 87 } //R#227 + VG:intvector { 189 } //R#228 + VI:intvector { 181, 191 } //R#229 + VN:intvector { 271, 573 } //R#230 + VU:intvector { 501 } //R#231 + WF:intvector { 535 } //R#232 + WS:intvector { 477, 497 } //R#233 + YE:intvector { 207 } //R#234 + YT:intvector { 467 } //R#235 + ZA:intvector { 29 } //R#236 + ZM:intvector { 39 } //R#237 + ZW:intvector { 28, 332 } //R#238 + } +} diff --git a/icuSources/data/mkdll.lk b/icuSources/data/mkdll.lk deleted file mode 100644 index 6bc6587f..00000000 --- a/icuSources/data/mkdll.lk +++ /dev/null @@ -1,4 +0,0 @@ -/DLL -/NOENTRY -/base:"0x4ad00000" -/comment:" Copyright (C) 1999 International Business Machines Corporation and others. All Rights Reserved. " diff --git a/icuSources/data/mkobj.cl b/icuSources/data/mkobj.cl deleted file mode 100644 index 9b322be3..00000000 --- a/icuSources/data/mkobj.cl +++ /dev/null @@ -1,3 +0,0 @@ -"/I..\..\include" -/GD -/c diff --git a/icuSources/data/rbnf/da.txt b/icuSources/data/rbnf/da.txt new file mode 100644 index 00000000..5b1d300c --- /dev/null +++ b/icuSources/data/rbnf/da.txt @@ -0,0 +1,34 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// + +da { + SpelloutRules { + "-x: minus >>;\n" + "nol; en; to; tre; fire; fem; seks; syv; otte; ni;\n" + "ti; elleve; tolv; tretten; fjorten; femten; seksten; sytten; atten; nitten;\n" + "20: [>>og]tvye;\n" + "30: [>>og]tredive;\n" + "40: [>>og]fyrre;\n" + "50: [>>og]femti;\n" + "60: [>>og]seksti;\n" + "70: [>>og]syvti;\n" + "80: [>>og]otteti;\n" + "90: [>>og]niti;\n" + "100: et hundrede[>>];\n" + "200: << hundrede[>>];\n" + "1000: et tusinde[ >>];\n" + "2000: << tusinde[ >>];\n" + "1,000,000: en million[ >>];\n" + "2,000,000: << million[ >>];\n" + "1,000,000,000: en milliarde[ >>];\n" + "2,000,000,000: << milliarde[ >>];\n" + "1,000,000,000,000: en billione[ >>];\n" + "2,000,000,000,000: << billione[ >>];\n" + "1,000,000,000,000,000: =#,##0=;" + } +} diff --git a/icuSources/data/rbnf/de.txt b/icuSources/data/rbnf/de.txt new file mode 100644 index 00000000..d0496497 --- /dev/null +++ b/icuSources/data/rbnf/de.txt @@ -0,0 +1,57 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// + +de { + // * RuleBasedNumberFormat data for German + + // again, I'm not 100% sure of these rules. I think both "hundert" and + // "einhundert" are correct or 100, but I'm not sure which is preferable + // in situations where this framework is likely to be used. Also, is it + // really true that numbers are run together into compound words all the + // time? + SpelloutRules { + // 1 is "eins" when by itself, but turns into "ein" in most + // combinations + "%alt-ones:\n" + "-x: minus >>;\n" + "x.x: << komma >>;\n" + "null; eins; =%%main=;\n" + "%%main:\n" + // words for numbers from 0 to 12. Notice that the values + // from 13 to 19 can derived algorithmically, unlike in most + // other languages + "null; ein; zwei; drei; vier; f\u00fcnf; sechs; sieben; acht; neun;\n" + "zehn; elf; zw\u00f6lf; >>zehn;\n" + // rules for the multiples of 10. Notice that the ones digit + // goes on the front + "20: [>>und]zwanzig;\n" + "30: [>>und]drei\u00dfig;\n" + "40: [>>und]vierzig;\n" + "50: [>>und]f\u00fcnfzig;\n" + "60: [>>und]sechzig;\n" + "70: [>>und]siebzig;\n" + "80: [>>und]achtzig;\n" + "90: [>>und]neunzig;\n" + "100: hundert[>%alt-ones>];\n" + "200: <%alt-ones>];\n" + "1000: tausend[>%alt-ones>];\n" + "2000: <%alt-ones>];\n" + "1,000,000: eine Million[ >%alt-ones>];\n" + "2,000,000: << Millionen[ >%alt-ones>];\n" + "1,000,000,000: eine Milliarde[ >%alt-ones>];\n" + "2,000,000,000: << Milliarden[ >%alt-ones>];\n" + "1,000,000,000,000: eine Billion[ >%alt-ones>];\n" + "2,000,000,000,000: << Billionen[ >%alt-ones>];\n" + "1,000,000,000,000,000: =#,##0=;" + "%%lenient-parse:\n" + "&\u0000 << ' ' << '-'\n" + "& ae , \u00e4 & ae , \u00c4\n" + "& oe , \u00f6 & oe , \u00d6\n" + "& ue , \u00fc & ue , \u00dc\n" + } +} diff --git a/icuSources/data/rbnf/el.txt b/icuSources/data/rbnf/el.txt new file mode 100644 index 00000000..f54d3a57 --- /dev/null +++ b/icuSources/data/rbnf/el.txt @@ -0,0 +1,57 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// + +el { +/* + * omit rules for Greek until we have complete and valid data. + + // * Spellout rules for Greek. Again in Greek we have to supply the words + // * for the multiples of 100 because they can't be derived algorithmically. + // * Also, the tens digit changes form when followed by a ones digit: an + // * accent mark disappears from the tens digit and moves to the ones digit. + // * Therefore, instead of using the [] notation, we actually have to use + // * two separate rules for each multiple of 10 to show the two forms of + // * the word. + + // Can someone supply me with information on negatives and decimals? + + SpelloutRules { + "\u03bc\u03b7\u03b4\u03ad\u03bd; \u03ad\u03bd\u03b1; \u03b4\u03cd\u03bf; \u03c4\u03c1\u03af\u03b1; " + "\u03c4\u03ad\u03c3\u03c3\u03b5\u03c1\u03b1; \u03c0\u03ad\u03bd\u03c4\u03b5; " + "\u03ad\u03be\u03b9; \u03b5\u03c0\u03c4\u03ac; \u03bf\u03ba\u03c4\u03ce; " + "\u03b5\u03bd\u03bd\u03ad\u03b1;\n" + "10: \u03b4\u03ad\u03ba\u03b1; " + "\u03ad\u03bd\u03c4\u03b5\u03ba\u03b1; \u03b4\u03ce\u03b4\u03b5\u03ba\u03b1; " + "\u03b4\u03b5\u03ba\u03b1>>;\n" + "20: \u03b5\u03af\u03ba\u03bf\u03c3\u03b9; \u03b5\u03b9\u03ba\u03bf\u03c3\u03b9>>;\n" + "30: \u03c4\u03c1\u03b9\u03ac\u03bd\u03c4\u03b1; \u03c4\u03c1\u03b9\u03b1\u03bd\u03c4\u03b1>>;\n" + "40: \u03c3\u03b1\u03c1\u03ac\u03bd\u03c4\u03b1; \u03c3\u03b1\u03c1\u03b1\u03bd\u03c4\u03b1>>;\n" + "50: \u03c0\u03b5\u03bd\u03ae\u03bd\u03c4\u03b1; \u03c0\u03b5\u03bd\u03b7\u03bd\u03c4\u03b1>>;\n" + "60: \u03b5\u03be\u03ae\u03bd\u03c4\u03b1; \u03b5\u03be\u03b7\u03bd\u03c4\u03b1>>;\n" + "70: \u03b5\u03b2\u03b4\u03bf\u03bc\u03ae\u03bd\u03c4\u03b1; " + "\u03b5\u03b2\u03b4\u03bf\u03bc\u03b7\u03bd\u03c4\u03b1>>;\n" + "80: \u03bf\u03b3\u03b4\u03cc\u03bd\u03c4\u03b1; \u03bf\u03b3\u03b4\u03bf\u03bd\u03c4\u03b1>>;\n" + "90: \u03b5\u03bd\u03bd\u03b5\u03bd\u03ae\u03bd\u03c4\u03b1; " + "\u03b5\u03bd\u03bd\u03b5\u03bd\u03b7\u03bd\u03c4\u03b1>>;\n" + "100: \u03b5\u03ba\u03b1\u03c4\u03cc[\u03bd >>];\n" + "200: \u03b4\u03b9\u03b1\u03ba\u03cc\u03c3\u03b9\u03b1[ >>];\n" + "300: \u03c4\u03c1\u03b9\u03b1\u03ba\u03cc\u03c3\u03b9\u03b1[ >>];\n" + "400: \u03c4\u03b5\u03c4\u03c1\u03b1\u03ba\u03cc\u03c3\u03b9\u03b1[ >>];\n" + "500: \u03c0\u03b5\u03bd\u03c4\u03b1\u03ba\u03cc\u03c3\u03b9\u03b1[ >>];\n" + "600: \u03b5\u03be\u03b1\u03ba\u03cc\u03c3\u03b9\u03b1[ >>];\n" + "700: \u03b5\u03c0\u03c4\u03b1\u03ba\u03cc\u03c3\u03b9\u03b1[ >>];\n" + "800: \u03bf\u03ba\u03c4\u03b1\u03ba\u03cc\u03c3\u03b9\u03b1[ >>];\n" + "900: \u03b5\u03bd\u03bd\u03b9\u03b1\u03ba\u03cc\u03c3\u03b9\u03b1[ >>];\n" + "1000: \u03c7\u03af\u03bb\u03b9\u03b1[ >>];\n" + "2000: << \u03c7\u03af\u03bb\u03b9\u03b1[ >>];\n" + "1,000,000: << \u03b5\u03ba\u03b1\u03c4\u03bf\u03bc\u03bc\u03cd\u03c1\u03b9\u03bf[ >>];\n" + "1,000,000,000: << \u03b4\u03b9\u03c3\u03b5\u03ba\u03b1\u03c4\u03bf\u03bc\u03bc\u03cd\u03c1\u03b9\u03bf[ >>];\n" + "1,000,000,000,000: =#,##0=" + } +*/ +} diff --git a/icuSources/data/rbnf/en.txt b/icuSources/data/rbnf/en.txt new file mode 100644 index 00000000..3cbcecb2 --- /dev/null +++ b/icuSources/data/rbnf/en.txt @@ -0,0 +1,219 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// + +en { + + + //------------------------------------------------------------ + // Rule Based Number Format Support + //------------------------------------------------------------ + + // * Spellout rules for U.S. English. This rule set has two variants: + // * %simplified is a set of rules showing the simple method of spelling + // * out numbers in English: 289 is formatted as "two hundred eighty-nine". + // * %default uses a more complicated algorithm to format + // * numbers in a more natural way: 289 is formatted as "two hundred AND + // * eighty-nine" and commas are inserted between the thousands groups for + // * values above 100,000. + + SpelloutRules { + // This rule set shows the normal simple formatting rules for English + "%simplified:\n" + // negative number rule. This rule is used to format negative + // numbers. The result of formatting the number's absolute + // value is placed where the >> is. + "-x: minus >>;\n" + // faction rule. This rule is used for formatting numbers + // with fractional parts. The result of formatting the + // number's integral part is substituted for the <<, and + // the result of formatting the number's fractional part + // (one digit at a time, e.g., 0.123 is "zero point one two + // three") replaces the >>. + "x.x: << point >>;\n" + // the rules for the values from 0 to 19 are simply the + // words for those numbers + "zero; one; two; three; four; five; six; seven; eight; nine;\n" + "ten; eleven; twelve; thirteen; fourteen; fifteen; sixteen;\n" + "seventeen; eighteen; nineteen;\n" + // beginning at 20, we use the >> to mark the position where + // the result of formatting the number's ones digit. Thus, + // we only need a new rule at every multiple of 10. Text in + // backets is omitted if the value being formatted is an + // even multiple of 10. + "20: twenty[->>];\n" + "30: thirty[->>];\n" + "40: forty[->>];\n" + "50: fifty[->>];\n" + "60: sixty[->>];\n" + "70: seventy[->>];\n" + "80: eighty[->>];\n" + "90: ninety[->>];\n" + // beginning at 100, we can use << to mark the position where + // the result of formatting the multiple of 100 is to be + // inserted. Notice also that the meaning of >> has shifted: + // here, it refers to both the ones place and the tens place. + // The meanings of the << and >> tokens depend on the base value + // of the rule. A rule's divisor is (usually) the highest + // power of 10 that is less than or equal to the rule's base + // value. The value being formatted is divided by the rule's + // divisor, and the integral quotient is used to get the text + // for <<, while the remainder is used to produce the text + // for >>. Again, text in brackets is omitted if the value + // being formatted is an even multiple of the rule's divisor + // (in this case, an even multiple of 100) + "100: << hundred[ >>];\n" + // The rules for the higher numbers work the same way as the + // rule for 100: Again, the << and >> tokens depend on the + // rule's divisor, which for all these rules is also the rule's + // base value. To group by thousand, we simply don't have any + // rules between 1,000 and 1,000,000. + "1000: << thousand[ >>];\n" + "1,000,000: << million[ >>];\n" + "1,000,000,000: << billion[ >>];\n" + "1,000,000,000,000: << trillion[ >>];\n" + // overflow rule. This rule specifies that values of a + // quadrillion or more are shown in numerals rather than words. + // The == token means to format (with new rules) the value + // being formatted by this rule and place the result where + // the == is. The #,##0 inside the == signs is a + // DecimalFormat pattern. It specifies that the value should + // be formatted with a DecimalFormat object, and that it + // should be formatted with no decimal places, at least one + // digit, and a thousands separator. + "1,000,000,000,000,000: =#,##0=;\n" + + // %default is a more elaborate form of %simplified; It is basically + // the same, except that it introduces "and" before the ones digit + // when appropriate (basically, between the tens and ones digits) and + // separates the thousands groups with commas in values over 100,000. + "%default:\n" + // negative-number and fraction rules. These are the same + // as those for %simplified, but have to be stated here too + // because this is an entry point + "-x: minus >>;\n" + "x.x: << point >>;\n" + // just use %simplified for values below 100 + "=%simplified=;\n" + // for values from 100 to 9,999 use %%and to decide whether or + // not to interpose the "and" + "100: << hundred[ >%%and>];\n" + "1000: << thousand[ >%%and>];\n" + // for values of 100,000 and up, use %%commas to interpose the + // commas in the right places (and also to interpose the "and") + "100,000>>: << thousand[>%%commas>];\n" + "1,000,000: << million[>%%commas>];\n" + "1,000,000,000: << billion[>%%commas>];\n" + "1,000,000,000,000: << trillion[>%%commas>];\n" + "1,000,000,000,000,000: =#,##0=;\n" + // if the value passed to this rule set is greater than 100, don't + // add the "and"; if it's less than 100, add "and" before the last + // digits + "%%and:\n" + "and =%default=;\n" + "100: =%default=;\n" + // this rule set is used to place the commas + "%%commas:\n" + // for values below 100, add "and" (the apostrophe at the + // beginning is ignored, but causes the space that follows it + // to be significant: this is necessary because the rules + // calling %%commas don't put a space before it) + "' and =%default=;\n" + // put a comma after the thousands (or whatever preceded the + // hundreds) + "100: , =%default=;\n" + // put a comma after the millions (or whatever precedes the + // thousands) + "1000: , <%default< thousand, >%default>;\n" + // and so on... + "1,000,000: , =%default=;" + // %%lenient-parse isn't really a set of number formatting rules; + // it's a set of collation rules. Lenient-parse mode uses a Collator + // object to compare fragments of the text being parsed to the text + // in the rules, allowing more leeway in the matching text. This set + // of rules tells the formatter to ignore commas when parsing (it + // already ignores spaces, which is why we refer to the space; it also + // ignores hyphens, making "twenty one" and "twenty-one" parse + // identically) + "%%lenient-parse:\n" + // "& ' ' , ',' ;\n" + " &\u0000 << ' ' << ',' << '-'; \n" + } + + +// * This rule set adds an English ordinal abbreviation to the end of a +// * number. For example, 2 is formatted as "2nd". Parsing doesn't work with +// * this rule set. To parse, use DecimalFormat on the numeral. + OrdinalRules { + // this rule set formats the numeral and calls %%abbrev to + // supply the abbreviation + "%main:\n" + "=#,##0==%%abbrev=;\n" + // this rule set supplies the abbreviation + "%%abbrev:\n" + // the abbreviations. Everything from 4 to 19 ends in "th" + "th; st; nd; rd; th;\n" + // at 20, we begin repeating the cycle every 10 (13 is "13th", + // but 23 and 33 are "23rd" and "33rd") We do this by + // ignoring all bug the ones digit in selecting the abbreviation + "20: >>;\n" + // at 100, we repeat the whole cycle by considering only the + // tens and ones digits in picking an abbreviation + "100: >>;\n" + } + +// * This rule set formats a number of seconds in sexagesimal notation +// * (i.e., hours, minutes, and seconds). %with-words formats it with +// * words (3,740 is "1 hour, 2 minutes, 20 seconds") and %in-numerals +// * formats it entirely in numerals (3,740 is "1:02:20"). + DurationRules { + // main rule set for formatting with words + "%with-words:\n" + // take care of singular and plural forms of "second" + "0 seconds; 1 second; =0= seconds;\n" + // use %%min to format values greater than 60 seconds + "60/60: <%%min<[, >>];\n" + // use %%hr to format values greater than 3,600 seconds + // (the ">>>" below causes us to see the number of minutes + // when when there are zero minutes) + "3600/60: <%%hr<[, >>>];\n" + // this rule set takes care of the singular and plural forms + // of "minute" + "%%min:\n" + "0 minutes; 1 minute; =0= minutes;\n" + // this rule set takes care of the singular and plural forms + // of "hour" + "%%hr:\n" + "0 hours; 1 hour; =0= hours;\n" + + // main rule set for formatting in numerals + "%in-numerals:\n" + // values below 60 seconds are shown with "sec." + "=0= sec.;\n" + // higher values are shown with colons: %%min-sec is used for + // values below 3,600 seconds... + "60: =%%min-sec=;\n" + // ...and %%hr-min-sec is used for values of 3,600 seconds + // and above + "3600: =%%hr-min-sec=;\n" + // this rule causes values of less than 10 minutes to show without + // a leading zero + "%%min-sec:\n" + "0: :=00=;\n" + "60/60: <0<>>;\n" + // this rule set is used for values of 3,600 or more. Minutes are always + // shown, and always shown with two digits + "%%hr-min-sec:\n" + "0: :=00=;\n" + "60/60: <00<>>;\n" + "3600/60: <#,##0<:>>>;\n" + // the lenient-parse rules allow several different characters to be used + // as delimiters between hours, minutes, and seconds + "%%lenient-parse:\n" + "& ':' = '.' = ' ' = '-';\n" + } +} diff --git a/icuSources/data/rbnf/en_GB.txt b/icuSources/data/rbnf/en_GB.txt new file mode 100644 index 00000000..18a5fdfc --- /dev/null +++ b/icuSources/data/rbnf/en_GB.txt @@ -0,0 +1,77 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// + +en_GB { + + //------------------------------------------------------------ + // Rule Based Number Format Support + //------------------------------------------------------------ + +// * Spellout rules for U.K. English. U.K. English has one significant +// * difference from U.S. English: the names for values of 1,000,000,000 +// * and higher. In American English, each successive "-illion" is 1,000 +// * times greater than the preceding one: 1,000,000,000 is "one billion" +// * and 1,000,000,000,000 is "one trillion." In British English, each +// * successive "-illion" is one million times greater than the one before: +// * "one billion" is 1,000,000,000,000 (or what Americans would call a +// * "trillion"), and "one trillion" is 1,000,000,000,000,000,000. +// * 1,000,000,000 in British English is "one thousand million." (This +// * value is sometimes called a "milliard," but this word seems to have +// * fallen into disuse.) + + // Could someone please correct me if I'm wrong about "milliard" falling + // into disuse, or have missed any other details of how large numbers + // are rendered. Also, could someone please provide me with information + // on which other English-speaking countries use which system? Right now, + // I'm assuming that the U.S. system is used in Canada and that all the + // other English-speaking countries follow the British system. Can + // someone out there confirm this? + + SpelloutRules { + "%simplified:\n" + "-x: minus >>;\n" + "x.x: << point >>;\n" + "zero; one; two; three; four; five; six; seven; eight; nine;\n" + "ten; eleven; twelve; thirteen; fourteen; fifteen; sixteen;\n" + " seventeen; eighteen; nineteen;\n" + "20: twenty[->>];\n" + "30: thirty[->>];\n" + "40: forty[->>];\n" + "50: fifty[->>];\n" + "60: sixty[->>];\n" + "70: seventy[->>];\n" + "80: eighty[->>];\n" + "90: ninety[->>];\n" + "100: << hundred[ >>];\n" + "1000: << thousand[ >>];\n" + "1,000,000: << million[ >>];\n" + "1,000,000,000,000: << billion[ >>];\n" + "1,000,000,000,000,000: =#,##0=;\n" + "%default:\n" + "-x: minus >>;\n" + "x.x: << point >>;\n" + "=%simplified=;\n" + "100: << hundred[ >%%and>];\n" + "1000: << thousand[ >%%and>];\n" + "100,000>>: << thousand[>%%commas>];\n" + "1,000,000: << million[>%%commas>];\n" + "1,000,000,000,000: << billion[>%%commas>];\n" + "1,000,000,000,000,000: =#,##0=;\n" + "%%and:\n" + "and =%default=;\n" + "100: =%default=;\n" + "%%commas:\n" + "' and =%default=;\n" + "100: , =%default=;\n" + "1000: , <%default< thousand, >%default>;\n" + "1,000,000: , =%default=;" + "%%lenient-parse:\n" + "& ' ' , ',' ;\n" + } + +} diff --git a/icuSources/data/rbnf/eo.txt b/icuSources/data/rbnf/eo.txt new file mode 100644 index 00000000..c15edc2b --- /dev/null +++ b/icuSources/data/rbnf/eo.txt @@ -0,0 +1,36 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// + +eo { + //------------------------------------------------------------ + // Rule Based Number Format Support + //------------------------------------------------------------ + +// data from 'Esperanto-programita 1' courtesy of Markus Scherer + + SpelloutRules { + "-x: minus >>;\n" + "x.x: << komo >>;\n" + "nulo; unu; du; tri; kvar; kvin; ses; sep; ok; na\u016d;\n" + "10: dek[ >>];\n" + "20: <>];\n" + "100: cent[ >>];\n" + "200: <>];\n" + "1000: mil[ >>];\n" + "2000: <>];\n" + "10000: dekmil[ >>];\n" + "11000>: << mil[ >>];\n" + "1,000,000: miliono[ >>];\n" + "2,000,000: << milionoj[ >>];\n" + "1,000,000,000: miliardo[ >>];\n" + "2,000,000,000: << miliardoj[ >>];\n" + "1,000,000,000,000: biliono[ >>];\n" + "2,000,000,000,000: << bilionoj[ >>];\n" + "1,000,000,000,000,000: =#,##0=;\n" + } +} diff --git a/icuSources/data/rbnf/es.txt b/icuSources/data/rbnf/es.txt new file mode 100644 index 00000000..41968911 --- /dev/null +++ b/icuSources/data/rbnf/es.txt @@ -0,0 +1,74 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// + +es { + //------------------------------------------------------------ + // Rule Based Number Format Support + //------------------------------------------------------------ + + // * Spellout rules for Spanish. The Spanish rules are quite similar to + // * the English rules, but there are some important differences: + // * First, we have to provide separate rules for most of the twenties + // * because the ones digit frequently picks up an accent mark that it + // * doesn't have when standing alone. Second, each multiple of 100 has + // * to be specified separately because the multiplier on 100 very often + // * changes form in the contraction: 500 is "quinientos," not + // * "cincocientos." In addition, the word for 100 is "cien" when + // * standing alone, but changes to "ciento" when followed by more digits. + // * There also some other differences. + + // The Spanish rules are incomplete. I'm missing information on negative + // numbers and numbers with fractional parts. I also don't have + // information on numbers higher than the millions. + + SpelloutRules { + // negative-number and fraction rules + "-x: menos >>;\n" + "x.x: << punto >>;\n" + // words for values from 0 to 19 + "cero; uno; dos; tres; cuatro; cinco; seis; siete; ocho; nueve;\n" + "diez; once; doce; trece; catorce; quince; diecis\u00e9is;\n" + " diecisiete; dieciocho; diecinueve;\n" + // words for values from 20 to 29 (necessary because the ones digit + // often picks up an accent mark it doesn't have when standing alone) + "veinte; veintiuno; veintid\u00f3s; veintitr\u00e9s; veinticuatro;\n" + " veinticinco; veintis\u00e9is; veintisiete; veintiocho;\n" + " veintinueve;\n" + // words for multiples of 10 (notice that the tens digit is separated + // from the ones digit by the word "y".) + "30: treinta[ y >>];\n" + "40: cuarenta[ y >>];\n" + "50: cincuenta[ y >>];\n" + "60: sesenta[ y >>];\n" + "70: setenta[ y >>];\n" + "80: ochenta[ y >>];\n" + "90: noventa[ y >>];\n" + // 100 by itself is "cien," but 100 followed by something is "cineto" + "100: cien;\n" + "101: ciento >>;\n" + // words for multiples of 100 (must be stated because they're + // rarely simple concatenations) + "200: doscientos[ >>];\n" + "300: trescientos[ >>];\n" + "400: cuatrocientos[ >>];\n" + "500: quinientos[ >>];\n" + "600: seiscientos[ >>];\n" + "700: setecientos[ >>];\n" + "800: ochocientos[ >>];\n" + "900: novecientos[ >>];\n" + // for 1,000, the multiplier on "mil" is omitted: 2,000 is "dos mil," + // but 1,000 is just "mil." + "1000: mil[ >>];\n" + "2000: << mil[ >>];\n" + // 1,000,000 is "un millon," not "uno millon" + "1,000,000: un mill\u00f3n[ >>];\n" + "2,000,000: << mill\u00f3n[ >>];\n" + // overflow rule + "1,000,000,000: =#,##0= (incomplete data);" + } +} diff --git a/icuSources/data/rbnf/fa.txt b/icuSources/data/rbnf/fa.txt new file mode 100644 index 00000000..407e81df --- /dev/null +++ b/icuSources/data/rbnf/fa.txt @@ -0,0 +1,39 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// + +fa { + SpelloutRules { + "%main:\n" + "-x: \u0645\u0646\u0641\u06cc >>;\n" + "x.x: << \u0645\u0645\u06cc\u0632 >>;\n" + "\u0635\u0641\u0631; \u06cc\u06a9; \u062f\u0648; \u0633\u0647; \u0686\u0647\u0627\u0631; \u067e\u0646\u062c; \u0634\u0634; \u0647\u0641\u062a; \u0647\u0634\u062a; \u0646\u0647;\n" + "\u062f\u0647; \u06cc\u0627\u0632\u062f\u0647; \u062f\u0648\u0627\u0632\u062f\u0647; \u0633\u06cc\u0632\u062f\u0647; \u0686\u0647\u0627\u0631\u062f\u0647; \u067e\u0627\u0646\u0632\u062f\u0647; \u0634\u0627\u0646\u0632\u062f\u0647;\n" + " \u0647\u0641\u062f\u0647; \u0647\u062c\u062f\u0647; \u0646\u0648\u0632\u062f\u0647;\n" + "20: \u0628\u06cc\u0633\u062a[ \u0648 >>];\n" + "30: \u0633\u06cc[ \u0648 >>];\n" + "40: \u0686\u0647\u0644[ \u0648 >>];\n" + "50: \u067e\u0646\u062c\u0627\u0647[ \u0648 >>];\n" + "60: \u0634\u0635\u062a[ \u0648 >>];\n" + "70: \u0647\u0641\u062a\u0627\u062f[ \u0648 >>];\n" + "80: \u0647\u0634\u062a\u0627\u062f[ \u0648 >>];\n" + "90: \u0646\u0648\u062f[ \u0648 >>];\n" + "100: \u0635\u062f[ \u0648 >>];\n" + "200: \u062f\u0648\u06cc\u0633\u062a[ \u0648 >>];\n" + "300: \u0633\u06cc\u0635\u062f[ \u0648 >>];\n" + "400: \u0686\u0647\u0627\u0631\u0635\u062f[ \u0648 >>];\n" + "500: \u067e\u0627\u0646\u0635\u062f[ \u0648 >>];\n" + "600: \u0634\u0634\u0635\u062f[ \u0648 >>];\n" + "700: \u0647\u0641\u062a\u0635\u062f[ \u0648 >>];\n" + "800: \u0647\u0634\u062a\u0635\u062f[ \u0648 >>];\n" + "900: \u0646\u0647\u0635\u062f[ \u0648 >>];\n" + "1000: << \u0647\u0632\u0627\u0631[ \u0648 >>];\n" + "1,000,000: << \u0645\u06cc\u0644\u06cc\u0648\u0646[ \u0648 >>];\n" + "1,000,000,000: << \u0645\u06cc\u0644\u06cc\u0627\u0631\u062f[ \u0648 >>];\n" + "1,000,000,000,000: =#,##0=;\n" + } +} diff --git a/icuSources/data/rbnf/fa_AF.txt b/icuSources/data/rbnf/fa_AF.txt new file mode 100644 index 00000000..2a4e9640 --- /dev/null +++ b/icuSources/data/rbnf/fa_AF.txt @@ -0,0 +1,39 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// + +fa_AF { + SpelloutRules { + "%main:\n" + "-x: \u0645\u0646\u0641\u06cc >>;\n" + "x.x: << \u0639\u0634\u0627\u0631\u06cc\u0647 >>;\n" + "\u0635\u0641\u0631; \u06cc\u06a9; \u062f\u0648; \u0633\u0647; \u0686\u0647\u0627\u0631; \u067e\u0646\u062c; \u0634\u0634; \u0647\u0641\u062a; \u0647\u0634\u062a; \u0646\u0647;\n" + "\u062f\u0647; \u06cc\u0627\u0632\u062f\u0647; \u062f\u0648\u0627\u0632\u062f\u0647; \u0633\u06cc\u0632\u062f\u0647; \u0686\u0647\u0627\u0631\u062f\u0647; \u067e\u0627\u0646\u0632\u062f\u0647; \u0634\u0627\u0646\u0632\u062f\u0647;\n" + " \u0647\u0641\u062f\u0647; \u0647\u062c\u062f\u0647; \u0646\u0632\u062f\u0647;\n" + "20: \u0628\u06cc\u0633\u062a[ \u0648 >>];\n" + "30: \u0633\u06cc[ \u0648 >>];\n" + "40: \u0686\u0647\u0644[ \u0648 >>];\n" + "50: \u067e\u0646\u062c\u0627\u0647[ \u0648 >>];\n" + "60: \u0634\u0635\u062a[ \u0648 >>];\n" + "70: \u0647\u0641\u062a\u0627\u062f[ \u0648 >>];\n" + "80: \u0647\u0634\u062a\u0627\u062f[ \u0648 >>];\n" + "90: \u0646\u0648\u062f[ \u0648 >>];\n" + "100: \u0635\u062f[ \u0648 >>];\n" + "200: \u062f\u0648\u0635\u062f[ \u0648 >>];\n" + "300: \u0633\u0647\u200c\u0635\u062f[ \u0648 >>];\n" + "400: \u0686\u0647\u0627\u0631\u0635\u062f[ \u0648 >>];\n" + "500: \u067e\u0646\u062c\u0635\u062f[ \u0648 >>];\n" + "600: \u0634\u0634\u0635\u062f[ \u0648 >>];\n" + "700: \u0647\u0641\u062a\u0635\u062f[ \u0648 >>];\n" + "800: \u0647\u0634\u062a\u0635\u062f[ \u0648 >>];\n" + "900: \u0646\u0647\u0635\u062f[ \u0648 >>];\n" + "1000: << \u0647\u0632\u0627\u0631[ \u0648 >>];\n" + "1,000,000: << \u0645\u06cc\u0644\u06cc\u0648\u0646[ \u0648 >>];\n" + "1,000,000,000: << \u0645\u06cc\u0644\u06cc\u0627\u0631\u062f[ \u0648 >>];\n" + "1,000,000,000,000: =#,##0=;\n" + } +} diff --git a/icuSources/data/rbnf/fr.txt b/icuSources/data/rbnf/fr.txt new file mode 100644 index 00000000..6d1fbd50 --- /dev/null +++ b/icuSources/data/rbnf/fr.txt @@ -0,0 +1,79 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// + +fr { + + //------------------------------------------------------------ + // Rule Based Number Format Support + //------------------------------------------------------------ + + // * Spellout rules for French. French adds some interesting quirks of its + // * own: 1) The word "et" is interposed between the tens and ones digits, + // * but only if the ones digit if 1: 20 is "vingt," and 2 is "vingt-deux," + // * but 21 is "vingt-et-un." 2) There are no words for 70, 80, or 90. + // * "quatre-vingts" ("four twenties") is used for 80, and values proceed + // * by score from 60 to 99 (e.g., 73 is "soixante-treize" ["sixty-thirteen"]). + // * Numbers from 1,100 to 1,199 are rendered as hundreds rather than + // * thousands: 1,100 is "onze cents" ("eleven hundred"), rather than + // * "mille cent" ("one thousand one hundred") + + SpelloutRules { + // the main rule set + "%main:\n" + "-x: moins >>;\n" + "x.x: << virgule >>;\n" + // words for numbers from 0 to 10 + "z\u00e9ro; un; deux; trois; quatre; cinq; six; sept; huit; neuf;\n" + "dix; onze; douze; treize; quatorze; quinze; seize;\n" + " dix-sept; dix-huit; dix-neuf;\n" + // ords for the multiples of 10: %%alt-ones inserts "et" + // when needed + "20: vingt[->%%alt-ones>];\n" + "30: trente[->%%alt-ones>];\n" + "40: quarante[->%%alt-ones>];\n" + "50: cinquante[->%%alt-ones>];\n" + // rule for 60. The /20 causes this rule's multiplier to be + // 20 rather than 10, allowinhg us to recurse for all values + // from 60 to 79... + "60/20: soixante[->%%alt-ones>];\n" + // ...except for 71, which must be special-cased + "71: soixante et onze;\n" + // at 72, we have to repeat the rule for 60 to get us to 79 + "72/20: soixante->%%alt-ones>;\n" + // at 80, we state a new rule with the phrase for 80. Since + // it changes form when there's a ones digit, we need a second + // rule at 81. This rule also includes "/20," allowing it to + // be used correctly for all values up to 99 + "80: quatre-vingts; 81/20: quatre-vingt->>;\n" + // "cent" becomes plural when preceded by a multiplier, and + // the multiplier is omitted from the singular form + "100: cent[ >>];\n" + "200: << cents[ >>];\n" + "1000: mille[ >>];\n" + // values from 1,100 to 1,199 are rendered as "onze cents..." + // instead of "mille cent..." The > after "1000" decreases + // the rule's exponent, causing its multiplier to be 100 instead + // of 1,000. This prevents us from getting "onze cents cent + // vingt-deux" ("eleven hundred one hundred twenty-two"). + "1100>: onze cents[ >>];\n" + // at 1,200, we go back to formating in thousands, so we + // repeat the rule for 1,000 + "1200: mille >>;\n" + // at 2,000, the multiplier is added + "2000: << mille[ >>];\n" + "1,000,000: << million[ >>];\n" + "1,000,000,000: << milliard[ >>];\n" + "1,000,000,000,000: << billion[ >>];\n" + "1,000,000,000,000,000: =#,##0=;\n" + // %%alt-ones is used to insert "et" when the ones digit is 1 + "%%alt-ones:\n" + "; et-un; =%main=;\n" + "%%lenient-parse:\n" + "&\u0000 << ' ' << ',' << '-';\n" + } +} diff --git a/icuSources/data/locales/en_IE_PREEURO.txt b/icuSources/data/rbnf/fr_BE.txt similarity index 50% rename from icuSources/data/locales/en_IE_PREEURO.txt rename to icuSources/data/rbnf/fr_BE.txt index be2be87e..280c20e1 100644 --- a/icuSources/data/locales/en_IE_PREEURO.txt +++ b/icuSources/data/rbnf/fr_BE.txt @@ -1,10 +1,14 @@ // *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines +// * Copyright (C) 2004, International Business Machines // * Corporation and others. All Rights Reserved. // * // *************************************************************************** +// -en_IE_PREEURO { - Version { "2.0" } +fr_BE { + // Reuse Swiss French spellout rules. Also for French in Zaire, + // but we've no locale for it yet. + + SpelloutRules:alias { "fr_CH" } } diff --git a/icuSources/data/rbnf/fr_CH.txt b/icuSources/data/rbnf/fr_CH.txt new file mode 100644 index 00000000..8164afde --- /dev/null +++ b/icuSources/data/rbnf/fr_CH.txt @@ -0,0 +1,57 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// + +fr_CH { + //------------------------------------------------------------ + // Rule Based Number Format Support + //------------------------------------------------------------ + +// * Spellout rules for Swiss French. Swiss French differs from French French +// * in that it does have words for 70, 80, and 90. This rule set shows them, +// * and is simpler as a result. + + // again, I'm missing information on negative numbers and decimals for + // these to rule sets. Also, I'm not 100% sure about Swiss French. Is + // this correct? Is "onze cents" commonly used for 1,100 in both France + // and Switzerland? Can someone fill me in on the rules for the other + // French-speaking countries? I've heard conflicting opinions on which + // version is used in Canada, and I understand there's an alternate set + // of words for 70, 80, and 90 that is used somewhere, but I don't know + // what those words are or where they're used. + + SpelloutRules { + "%main:\n" + "-x: moins >>;\n" + "x.x: << virgule >>;\n" + "z\u00e9ro; un; deux; trois; quatre; cinq; six; sept; huit; neuf;\n" + "dix; onze; douze; treize; quatorze; quinze; seize;\n" + " dix-sept; dix-huit; dix-neuf;\n" + "20: vingt[->%%alt-ones>];\n" + "30: trente[->%%alt-ones>];\n" + "40: quarante[->%%alt-ones>];\n" + "50: cinquante[->%%alt-ones>];\n" + "60: soixante[->%%alt-ones>];\n" + // notice new words for 70, 80, and 90 + "70: septante[->%%alt-ones>];\n" + "80: huitante[->%%alt-ones>];\n" + "90: nonante[->%%alt-ones>];\n" + "100: cent[ >>];\n" + "200: << cents[ >>];\n" + "1000: mille[ >>];\n" + "1100>: onze cents[ >>];\n" + "1200: mille >>;\n" + "2000: << mille[ >>];\n" + "1,000,000: << million[ >>];\n" + "1,000,000,000: << milliarde[ >>];\n" + "1,000,000,000,000: << billion[ >>];\n" + "1,000,000,000,000,000: =#,##0=;\n" + "%%alt-ones:\n" + "; et-un; =%main=;" + } + +} diff --git a/icuSources/data/rbnf/ga.txt b/icuSources/data/rbnf/ga.txt new file mode 100644 index 00000000..70b0e99b --- /dev/null +++ b/icuSources/data/rbnf/ga.txt @@ -0,0 +1,337 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// + +ga { + SpelloutRules { + + // Maoluimhreacha + "%default:\n" + "-x: míneas >>;\n" + "x.x: << pointe >>;\n" + "a náid; a haon; a dó; a trí; a ceathair; a cúig;\n" + "a sé; a seacht; a hocht; a naoi; a deich;\n" + "a haon déag; a dó dhéag;\n" + ">> déag;\n" + "20: fiche[ >>];\n" + "30: tríocha[ >>];\n" + "40: daichead[ >>];\n" + "50: caoga[ >>];\n" + "60: seasca[ >>];\n" + "70: seachtó[ >>];\n" + "80: ochtó[ >>];\n" + "90: nócha[ >>];\n" + "100: <%%hundreds<[ >%%hundreds_is>];\n" + "1,000: <%%thousands<[, >>];\n" + "1,000,000: <%%millions<[, >>];\n" + "1,000,000,000: <%%billions<[, >>];\n" + "1,000,000,000,000: <%%trillions<[, >>];\n" + "1,000,000,000,000,000: =#,##0=;\n" + + "%%cardwithnumber:" + " ; aon; dhá; trí; ceithre; cúig; sé; seacht; ocht; naoi; deich;\n" + " aon; dhá; trí; ceithre; cúig; sé; seacht; ocht; naoi;\n" + "20: fiche[ is >>];\n" + "30: tríocha[ is >>];\n" + "40: daichead[ is >>];\n" + "50: caoga[ is >>];\n" + "60: seasca[ is >>];\n" + "70: seachtó[ is >>];\n" + "80: ochtó[ is >>];\n" + "90: nócha[ is >>];\n" + "100: <%%hundreds<[ >%%hundreds_is>];\n" + "1,000: <%%thousands<[ >%%cardwithnumber>];\n" + "1,000,000: <%%millions<[ >%%cardwithnumber>];\n" + "1,000,000,000: <%%billions<[ >%%cardwithnumber>];\n" + "1,000,000,000: <%%trillions<[ >%%cardwithnumber>];\n" + "1,000,000,000,000,000: =#,##0=;\n" + + // rules to give hundreds value + "%%hundreds:\n" + "1: céad;\n" + "2: <%%cardwithnumber< chéad;\n" + "7: <%%cardwithnumber< gcéad;\n" + // Put in "is" after céad when a multiple of 10 + "%%hundreds_is:\n" + "0:;\n" + "=%default=;\n" + "20: is =%default=;\n" + "21: =%default=;\n" + "30: is =%default=;\n" + "31: =%default=;\n" + "40: is =%default=;\n" + "41: =%default=;\n" + "50: is =%default=;\n" + "51: =%default=;\n" + "60: is =%default=;\n" + "61: =%default=;\n" + "70: is =%default=;\n" + "71: =%default=;\n" + "80: is =%default=;\n" + "81: =%default=;\n" + "90: is =%default=;\n" + "91: =%default=;\n" + + // rules to give thousands value + "%%thousands:\n" + "0: míle;\n" + "2: <%%cardwithnumber< mhíle;\n" + "7: <%%cardwithnumber< míle;\n" + "11>: <%%cardwithnumber< mhíle dhéag;\n" + "17>: <%%cardwithnumber< míle dhéag;\n" + "20>: <%%cardwithnumber< míle;\n" + "21>: <%%cardwithnumber< mhíle;\n" + "27>: <%%cardwithnumber< míle;\n" + "31>: <%%cardwithnumber< mhíle;\n" + "37>: <%%cardwithnumber< míle;\n" + "41>: <%%cardwithnumber< mhíle;\n" + "47>: <%%cardwithnumber< míle;\n" + "51>: <%%cardwithnumber< mhíle;\n" + "57>: <%%cardwithnumber< míle;\n" + "61>: <%%cardwithnumber< mhíle;\n" + "67>: <%%cardwithnumber< míle;\n" + "71>: <%%cardwithnumber< mhíle;\n" + "77>: <%%cardwithnumber< míle;\n" + "81>: <%%cardwithnumber< mhíle;\n" + "87>: <%%cardwithnumber< míle;\n" + "91>: <%%cardwithnumber< mhíle;\n" + "97>: <%%cardwithnumber< míle;\n" + " 100: <%%hundreds< >%%thousands_is>;\n" + + // Put in "is" after míle when a multiple of 10 + "%%thousands_is:\n" + "0: míle;\n" + "1: is =%%cardwithnumber= mhíle;\n" + "7: is =%%cardwithnumber= míle;\n" + "11>: is <%%thousands<;\n" + "20: is =%%thousands=;\n" + "21: =%%thousands=;\n" + "30: is =%%thousands=;\n" + "31: =%%thousands=;\n" + "40: is =%%thousands=;\n" + "41: =%%thousands=;\n" + "50: is =%%thousands=;\n" + "51: =%%thousands=;\n" + "60: is =%%thousands=;\n" + "61: =%%thousands=;\n" + "70: is =%%thousands=;\n" + "71: =%%thousands=;\n" + "80: is =%%thousands=;\n" + "81: =%%thousands=;\n" + "90: is =%%thousands=;\n" + "91: =%%thousands=;\n" + + + // rules to give millions value + "%%millions:\n" + "1: milliún;\n" + "2: <%%cardwithnumber< mhilliún;\n" + "7: <%%cardwithnumber< milliún;\n" + "11>: <%%cardwithnumber< mhilliún déag;\n" + "17>: <%%cardwithnumber< milliún déag;\n" + "20>: <%%cardwithnumber< milliún;\n" + "21>: <%%cardwithnumber< mhilliún;\n" + "27>: <%%cardwithnumber< milliún;\n" + "31>: <%%cardwithnumber< mhilliún;\n" + "37>: <%%cardwithnumber< milliún;\n" + "41>: <%%cardwithnumber< mhilliún;\n" + "47>: <%%cardwithnumber< milliún;\n" + "51>: <%%cardwithnumber< mhilliún;\n" + "57>: <%%cardwithnumber< milliún;\n" + "61>: <%%cardwithnumber< mhilliún;\n" + "67>: <%%cardwithnumber< milliún;\n" + "71>: <%%cardwithnumber< mhilliún;\n" + "77>: <%%cardwithnumber< milliún;\n" + "81>: <%%cardwithnumber< mhilliún;\n" + "87>: <%%cardwithnumber< milliún;\n" + "91>: <%%cardwithnumber< mhilliún;\n" + "97>: <%%cardwithnumber< milliún;\n" + " 100: <%%hundreds< >%%millions_is>;\n" + + // Put in "is" after milliún when a multiple of 10 + "%%millions_is:\n" + "0: milliún;\n" + "1: is =%%cardwithnumber= mhilliún;\n" + "7: is =%%cardwithnumber= milliún;\n" + "11>: is <%%millions<;\n" + "20: is =%%millions=;\n" + "21: =%%millions=;\n" + "30: is =%%millions=;\n" + "31: =%%millions=;\n" + "40: is =%%millions=;\n" + "41: =%%millions=;\n" + "50: is =%%millions=;\n" + "51: =%%millions=;\n" + "60: is =%%millions=;\n" + "61: =%%millions=;\n" + "70: is =%%millions=;\n" + "71: =%%millions=;\n" + "80: is =%%millions=;\n" + "81: =%%millions=;\n" + "90: is =%%millions=;\n" + "91: =%%millions=;\n" + + + // rules to give billions value + // to avoid ambiguity, no eclipsis or aspiration! + "%%billions:\n" + "1: billiún; <%%cardwithnumber< billiún;\n" + "11>: <%%cardwithnumber< billiún déag;\n" + "20>: <%%cardwithnumber< billiún;\n" + "100: <%%hundreds< >%%billions_is>;\n" + + // Put in "is" after billiún when a multiple of 10 + "%%billions_is:\n" + "0: billiún;\n" + "1: is =%%cardwithnumber= billiún;\n" + "7: is =%%cardwithnumber= billiún;\n" + "11>: is <%%billions<;\n" + "20: is =%%billions=;\n" + "21: =%%billions=;\n" + "30: is =%%billions=;\n" + "31: =%%billions=;\n" + "40: is =%%billions=;\n" + "41: =%%billions=;\n" + "50: is =%%billions=;\n" + "51: =%%billions=;\n" + "60: is =%%billions=;\n" + "61: =%%billions=;\n" + "70: is =%%billions=;\n" + "71: =%%billions=;\n" + "80: is =%%billions=;\n" + "81: =%%billions=;\n" + "90: is =%%billions=;\n" + "91: =%%billions=;\n" + + // rules to give trillions value + "%%trillions:\n" + "1: milliún;\n" + "2: <%%cardwithnumber< thrilliún;\n" + "7: <%%cardwithnumber< dtrilliún;\n" + "11>: <%%cardwithnumber< thrilliún déag;\n" + "17>: <%%cardwithnumber< dtrilliún déag;\n" + "20>: <%%cardwithnumber< dtrilliún;\n" + "21>: <%%cardwithnumber< thrilliún;\n" + "27>: <%%cardwithnumber< dtrilliún;\n" + "31>: <%%cardwithnumber< thrilliún;\n" + "37>: <%%cardwithnumber< dtrilliún;\n" + "41>: <%%cardwithnumber< thrilliún;\n" + "47>: <%%cardwithnumber< dtrilliún;\n" + "51>: <%%cardwithnumber< thrilliún;\n" + "57>: <%%cardwithnumber< dtrilliún;\n" + "61>: <%%cardwithnumber< thrilliún;\n" + "67>: <%%cardwithnumber< dtrilliún;\n" + "71>: <%%cardwithnumber< thrilliún;\n" + "77>: <%%cardwithnumber< dtrilliún;\n" + "81>: <%%cardwithnumber< thrilliún;\n" + "87>: <%%cardwithnumber< dtrilliún;\n" + "91>: <%%cardwithnumber< thrilliún;\n" + "97>: <%%cardwithnumber< dtrilliún;\n" + " 100: <%%hundreds< >%%trillions_is;\n" + + // Put in "is" after trilliún when a multiple of 10 + "%%trillions_is:\n" + "0: trilliún;\n" + "1: is =%%cardwithnumber= thrilliún;\n" + "7: is =%%cardwithnumber= dtrilliún;\n" + "11>: is <%%trillions<;\n" + "20: is =%%trillions=;\n" + "21: =%%trillions=;\n" + "30: is =%%trillions=;\n" + "31: =%%trillions=;\n" + "40: is =%%trillions=;\n" + "41: =%%trillions=;\n" + "50: is =%%trillions=;\n" + "51: =%%trillions=;\n" + "60: is =%%trillions=;\n" + "61: =%%trillions=;\n" + "70: is =%%trillions=;\n" + "71: =%%trillions=;\n" + "80: is =%%trillions=;\n" + "81: =%%trillions=;\n" + "90: is =%%trillions=;\n" + "91: =%%trillions=;\n" + + "%%lenient-parse:\n" + "& ' ' , ',' ;\n" + } + + // This rule set formats a number of seconds in sexagesimal notation + // (i.e., hours, minutes, and seconds). %with-words formats it with + // words (3,740 is "1 uair, 2 nóiméad, 20 soicind") and %in-numerals + // formats it entirely in numerals (3,740 is "1:02:20"). + // (Based on en rules) + DurationRules { + // main rule set for formatting with words + "%with-words:\n" + // seconds + "=0= soicind;\n" + // use %%min to format values greater than 60 seconds + "60/60: <%%min<[, >>];\n" + // use %%hr to format values greater than 3,600 seconds + // (the ">>>" below causes us to see the number of minutes + // when when there are zero minutes) + "3600/60: <%%hr<[, >>>];\n" + // minutes + "%%min:\n" + "=0= nóiméad;\n" + // hours + "%%hr:\n" + // casta -- fch. l.40 Caighdeán Oifigiúil + "0: =0= uair;\n" + "3: =0= huaire;\n" + "5: =0= uaire;\n" + "6: =0= huaire;\n" + "7: =0= n-uaire;\n" + "10: =0= n-uair;\n" + "11: =0= >%%uaire>;\n" + // Tricky bit: next rule does numbers ending in 0; see Gillam's paper + // where it explains minor substitutions for 101 to understand. + "20: =0= uair; =0= >%%uaire>;\n" + + // "uaire", except after nos. ending in 1, 2 or 0 when "uair" + "%%uaire:\n" + "1: uair;\n" + "3: huaire;\n" + "5: uaire;\n" + "6: huaire;\n" + "7: n-uaire;\n" + + // rules giving hh:mm:ss with all fields shown always + "%hms:\n" + "0: :=00=;\n" + "60/60: :<00<>>>;\n" + "3600/60: <#,##0<>>>;\n" + + // main rule set for formatting in numerals + "%in-numerals:\n" + // values below 60 seconds are shown with "s" + "=0=s;\n" + // higher values are shown with colons: %%min-sec is used for + // values below 3,600 seconds... + "60: =%%min-sec=;\n" + // ...and %%hr-min-sec is used for values of 3,600 seconds + // and above + "3600: =%%hr-min-sec=;\n" + // this rule causes values of less than 10 minutes to show without + // a leading zero + "%%min-sec:\n" + "0: :=00=;\n" + "60/60: <0<>>;\n" + // this rule set is used for values of 3,600 or more. Minutes are always + // shown, and always shown with two digits + "%%hr-min-sec:\n" + "0: :=00=;\n" + "60/60: <00<>>;\n" + "3600/60: <#,##0<:>>>;\n" + // the lenient-parse rules allow several different characters to be used + // as delimiters between hours, minutes, and seconds + "%%lenient-parse:\n" + "& ':' = '.' = ' ' = '-';\n" + } + +} diff --git a/icuSources/data/rbnf/he.txt b/icuSources/data/rbnf/he.txt new file mode 100644 index 00000000..8345bc1c --- /dev/null +++ b/icuSources/data/rbnf/he.txt @@ -0,0 +1,580 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// + +he { + //------------------------------------------------------------ + // Rule Based Number Format Support + //------------------------------------------------------------ + + SpelloutRules { + "%masculine_singular_indefinite:\n" + "-x: =%%unwieldy=;\n" + "=%%unwieldy=;\n" + "\u05e8\u05d0\u05e9\u05d5\u05df;\n" + "\u05e9\u05e0\u05d9;\n" + "\u05e9\u05dc\u05d9\u05e9\u05d9;\n" + "\u05e8\u05d1\u05d9\u05e2\u05d9;\n" + "\u05d7\u05de\u05d9\u05e9\u05d9;\n" + "\u05e9\u05d9\u05e9\u05d9;\n" + "\u05e9\u05d1\u05d9\u05e2\u05d9;\n" + "\u05e9\u05de\u05d9\u05e0\u05d9;\n" + "\u05ea\u05e9\u05d9\u05e2\u05d9;\n" + "\u05e2\u05e9\u05d9\u05e8\u05d9;\n" + "11: =%masculine=;\n" + "1001: =%%unwieldy=;\n" + "%masculine_singular_definite:\n" + "-x: =%%unwieldy=;\n" + "=%%unwieldy=;\n" + "\u05d4\u05e8\u05d0\u05e9\u05d5\u05df;\n" + "\u05d4\u05e9\u05e0\u05d9;\n" + "\u05d4\u05e9\u05dc\u05d9\u05e9\u05d9;\n" + "\u05d4\u05e8\u05d1\u05d9\u05e2\u05d9;\n" + "\u05d4\u05d7\u05de\u05d9\u05e9\u05d9;\n" + "\u05d4\u05e9\u05d9\u05e9\u05d9;\n" + "\u05d4\u05e9\u05d1\u05d9\u05e2\u05d9;\n" + "\u05d4\u05e9\u05de\u05d9\u05e0\u05d9;\n" + "\u05d4\u05ea\u05e9\u05d9\u05e2\u05d9;\n" + "\u05d4\u05e2\u05e9\u05d9\u05e8\u05d9;\n" + "11: \u05d4=%masculine=;\n" + "1001: =%%unwieldy=;\n" + "%masculine_plural_indefinite:\n" + "-x: =%%unwieldy=;\n" + "=%%unwieldy=;\n" + "\u05e8\u05d0\u05e9\u05d5\u05e0\u05d9\u05dd;\n" + "\u05e9\u05e0\u05d9\u05d9\u05dd;\n" + "\u05e9\u05dc\u05d9\u05e9\u05d9\u05d9\u05dd;\n" + "\u05e8\u05d1\u05d9\u05e2\u05d9\u05d9\u05dd;\n" + "\u05d7\u05de\u05d9\u05e9\u05d9\u05d9\u05dd;\n" + "\u05e9\u05d9\u05e9\u05d9\u05d9\u05dd;\n" + "\u05e9\u05d1\u05d9\u05e2\u05d9\u05d9\u05dd;\n" + "\u05e9\u05de\u05d9\u05e0\u05d9\u05d9\u05dd;\n" + "\u05ea\u05e9\u05d9\u05e2\u05d9\u05d9\u05dd;\n" + "\u05e2\u05e9\u05d9\u05e8\u05d9\u05d9\u05dd;\n" + "11: =%masculine=;\n" + "1001: =%%unwieldy=;\n" + "%masculine_plural_definite:\n" + "-x: =%%unwieldy=;\n" + "=%%unwieldy=;\n" + "\u05d4\u05e8\u05d0\u05e9\u05d5\u05e0\u05d9\u05dd;\n" + "\u05d4\u05e9\u05e0\u05d9\u05d9\u05dd;\n" + "\u05d4\u05e9\u05dc\u05d9\u05e9\u05d9\u05d9\u05dd;\n" + "\u05d4\u05e8\u05d1\u05d9\u05e2\u05d9\u05d9\u05dd;\n" + "\u05d4\u05d7\u05de\u05d9\u05e9\u05d9\u05d9\u05dd;\n" + "\u05d4\u05e9\u05d9\u05e9\u05d9\u05d9\u05dd;\n" + "\u05d4\u05e9\u05d1\u05d9\u05e2\u05d9\u05d9\u05dd;\n" + "\u05d4\u05e9\u05de\u05d9\u05e0\u05d9\u05d9\u05dd;\n" + "\u05d4\u05ea\u05e9\u05d9\u05e2\u05d9\u05d9\u05dd;\n" + "\u05d4\u05e2\u05e9\u05d9\u05e8\u05d9\u05d9\u05dd;\n" + "11: \u05d4=%masculine=;\n" + "1001: =%%unwieldy=;\n" + "%feminine_singular_indefinite:\n" + "-x: =%%unwieldy=;\n" + "=%%unwieldy=;\n" + "\u05e8\u05d0\u05e9\u05d5\u05e0\u05d4;\n" + "\u05e9\u05e0\u05d9\u05d4;\n" + "\u05e9\u05dc\u05d9\u05e9\u05d9\u05ea;\n" + "\u05e8\u05d1\u05d9\u05e2\u05d9\u05ea;\n" + "\u05d7\u05de\u05d9\u05e9\u05d9\u05ea;\n" + "\u05e9\u05d9\u05e9\u05d9\u05ea;\n" + "\u05e9\u05d1\u05d9\u05e2\u05d9\u05ea;\n" + "\u05e9\u05de\u05d9\u05e0\u05d9\u05ea;\n" + "\u05ea\u05e9\u05d9\u05e2\u05d9\u05ea;\n" + "\u05e2\u05e9\u05d9\u05e8\u05d9\u05ea;\n" + "11: =%feminine=;\n" + "1001: =%%unwieldy=;\n" + "%feminine_singular_definite:\n" + "-x: =%%unwieldy=;\n" + "=%%unwieldy=;\n" + "\u05d4\u05e8\u05d0\u05e9\u05d5\u05e0\u05d4;\n" + "\u05d4\u05e9\u05e0\u05d9\u05d4;\n" + "\u05d4\u05e9\u05dc\u05d9\u05e9\u05d9\u05ea;\n" + "\u05d4\u05e8\u05d1\u05d9\u05e2\u05d9\u05ea;\n" + "\u05d4\u05d7\u05de\u05d9\u05e9\u05d9\u05ea;\n" + "\u05d4\u05e9\u05d9\u05e9\u05d9\u05ea;\n" + "\u05d4\u05e9\u05d1\u05d9\u05e2\u05d9\u05ea;\n" + "\u05d4\u05e9\u05de\u05d9\u05e0\u05d9\u05ea;\n" + "\u05d4\u05ea\u05e9\u05d9\u05e2\u05d9\u05ea;\n" + "\u05d4\u05e2\u05e9\u05d9\u05e8\u05d9\u05ea;\n" + "11: \u05d4=%feminine=;\n" + "1001: =%%unwieldy=;\n" + "%feminine_plural_indefinite:\n" + "-x: =%%unwieldy=;\n" + "=%%unwieldy=;\n" + "\u05e8\u05d0\u05e9\u05d5\u05e0\u05d5\u05ea;\n" + "\u05e9\u05e0\u05d9\u05d5\u05ea;\n" + "\u05e9\u05dc\u05d9\u05e9\u05d9\u05d5\u05ea;\n" + "\u05e8\u05d1\u05d9\u05e2\u05d9\u05d5\u05ea;\n" + "\u05d7\u05de\u05d9\u05e9\u05d9\u05d5\u05ea;\n" + "\u05e9\u05d9\u05e9\u05d9\u05d5\u05ea;\n" + "\u05e9\u05d1\u05d9\u05e2\u05d9\u05d5\u05ea;\n" + "\u05e9\u05de\u05d9\u05e0\u05d9\u05d5\u05ea;\n" + "\u05ea\u05e9\u05d9\u05e2\u05d9\u05d5\u05ea;\n" + "\u05e2\u05e9\u05d9\u05e8\u05d9\u05d5\u05ea;\n" + "11: =%feminine=;\n" + "1001: =%%unwieldy=;\n" + "%feminine_plural_definite:\n" + "-x: =%%unwieldy=;\n" + "=%%unwieldy=;\n" + "\u05d4\u05e8\u05d0\u05e9\u05d5\u05e0\u05d5\u05ea;\n" + "\u05d4\u05e9\u05e0\u05d9\u05d5\u05ea;\n" + "\u05d4\u05e9\u05dc\u05d9\u05e9\u05d9\u05d5\u05ea;\n" + "\u05d4\u05e8\u05d1\u05d9\u05e2\u05d9\u05d5\u05ea;\n" + "\u05d4\u05d7\u05de\u05d9\u05e9\u05d9\u05d5\u05ea;\n" + "\u05d4\u05e9\u05d9\u05e9\u05d9\u05d5\u05ea;\n" + "\u05d4\u05e9\u05d1\u05d9\u05e2\u05d9\u05d5\u05ea;\n" + "\u05d4\u05e9\u05de\u05d9\u05e0\u05d9\u05d5\u05ea;\n" + "\u05d4\u05ea\u05e9\u05d9\u05e2\u05d9\u05d5\u05ea;\n" + "\u05d4\u05e2\u05e9\u05d9\u05e8\u05d9\u05d5\u05ea;\n" + "11: \u05d4=%feminine=;\n" + "1001: =%%unwieldy=;\n" + "%%unwieldy:\n" + "\u05de\u05e1\u05e4\u05e8 =%feminine=;\n" + "%spellout_default:\n" + "=%feminine=;\n" + } + + SpelloutLocalizations { + { "%spellout_default", "%feminine", "%masculine", + } + { "he", + "\u05d1\u05e8\u05d9\u05e8\u05ea \u05de\u05d7\u05d3\u05dc", + "\u05e6\u05d5\u05e8\u05ea \u05e0\u05e7\u05d1\u05d4", "\u05e6\u05d5\u05e8\u05ea \u05d6\u05db\u05e8", + } + { "en", + "Default", "Feminine", "Masculine", + } + } + + OrdinalRules { + "%masculine_singular_indefinite:\n" + "-x: =%%unwieldy=;\n" + "=%%unwieldy=;\n" + "\u05e8\u05d0\u05e9\u05d5\u05df;\n" + "\u05e9\u05e0\u05d9;\n" + "\u05e9\u05dc\u05d9\u05e9\u05d9;\n" + "\u05e8\u05d1\u05d9\u05e2\u05d9;\n" + "\u05d7\u05de\u05d9\u05e9\u05d9;\n" + "\u05e9\u05d9\u05e9\u05d9;\n" + "\u05e9\u05d1\u05d9\u05e2\u05d9;\n" + "\u05e9\u05de\u05d9\u05e0\u05d9;\n" + "\u05ea\u05e9\u05d9\u05e2\u05d9;\n" + "\u05e2\u05e9\u05d9\u05e8\u05d9;\n" + "11: =%masculine=;\n" + "1001: =%%unwieldy=;\n" + "%masculine_singular_definite:\n" + "-x: =%%unwieldy=;\n" + "=%%unwieldy=;\n" + "\u05d4\u05e8\u05d0\u05e9\u05d5\u05df;\n" + "\u05d4\u05e9\u05e0\u05d9;\n" + "\u05d4\u05e9\u05dc\u05d9\u05e9\u05d9;\n" + "\u05d4\u05e8\u05d1\u05d9\u05e2\u05d9;\n" + "\u05d4\u05d7\u05de\u05d9\u05e9\u05d9;\n" + "\u05d4\u05e9\u05d9\u05e9\u05d9;\n" + "\u05d4\u05e9\u05d1\u05d9\u05e2\u05d9;\n" + "\u05d4\u05e9\u05de\u05d9\u05e0\u05d9;\n" + "\u05d4\u05ea\u05e9\u05d9\u05e2\u05d9;\n" + "\u05d4\u05e2\u05e9\u05d9\u05e8\u05d9;\n" + "11: \u05d4=%masculine=;\n" + "1001: =%%unwieldy=;\n" + "%masculine_plural_indefinite:\n" + "-x: =%%unwieldy=;\n" + "=%%unwieldy=;\n" + "\u05e8\u05d0\u05e9\u05d5\u05e0\u05d9\u05dd;\n" + "\u05e9\u05e0\u05d9\u05d9\u05dd;\n" + "\u05e9\u05dc\u05d9\u05e9\u05d9\u05d9\u05dd;\n" + "\u05e8\u05d1\u05d9\u05e2\u05d9\u05d9\u05dd;\n" + "\u05d7\u05de\u05d9\u05e9\u05d9\u05d9\u05dd;\n" + "\u05e9\u05d9\u05e9\u05d9\u05d9\u05dd;\n" + "\u05e9\u05d1\u05d9\u05e2\u05d9\u05d9\u05dd;\n" + "\u05e9\u05de\u05d9\u05e0\u05d9\u05d9\u05dd;\n" + "\u05ea\u05e9\u05d9\u05e2\u05d9\u05d9\u05dd;\n" + "\u05e2\u05e9\u05d9\u05e8\u05d9\u05d9\u05dd;\n" + "11: =%masculine=;\n" + "1001: =%%unwieldy=;\n" + "%masculine_plural_definite:\n" + "-x: =%%unwieldy=;\n" + "=%%unwieldy=;\n" + "\u05d4\u05e8\u05d0\u05e9\u05d5\u05e0\u05d9\u05dd;\n" + "\u05d4\u05e9\u05e0\u05d9\u05d9\u05dd;\n" + "\u05d4\u05e9\u05dc\u05d9\u05e9\u05d9\u05d9\u05dd;\n" + "\u05d4\u05e8\u05d1\u05d9\u05e2\u05d9\u05d9\u05dd;\n" + "\u05d4\u05d7\u05de\u05d9\u05e9\u05d9\u05d9\u05dd;\n" + "\u05d4\u05e9\u05d9\u05e9\u05d9\u05d9\u05dd;\n" + "\u05d4\u05e9\u05d1\u05d9\u05e2\u05d9\u05d9\u05dd;\n" + "\u05d4\u05e9\u05de\u05d9\u05e0\u05d9\u05d9\u05dd;\n" + "\u05d4\u05ea\u05e9\u05d9\u05e2\u05d9\u05d9\u05dd;\n" + "\u05d4\u05e2\u05e9\u05d9\u05e8\u05d9\u05d9\u05dd;\n" + "11: \u05d4=%masculine=;\n" + "1001: =%%unwieldy=;\n" + "%feminine_singular_indefinite:\n" + "-x: =%%unwieldy=;\n" + "=%%unwieldy=;\n" + "\u05e8\u05d0\u05e9\u05d5\u05e0\u05d4;\n" + "\u05e9\u05e0\u05d9\u05d4;\n" + "\u05e9\u05dc\u05d9\u05e9\u05d9\u05ea;\n" + "\u05e8\u05d1\u05d9\u05e2\u05d9\u05ea;\n" + "\u05d7\u05de\u05d9\u05e9\u05d9\u05ea;\n" + "\u05e9\u05d9\u05e9\u05d9\u05ea;\n" + "\u05e9\u05d1\u05d9\u05e2\u05d9\u05ea;\n" + "\u05e9\u05de\u05d9\u05e0\u05d9\u05ea;\n" + "\u05ea\u05e9\u05d9\u05e2\u05d9\u05ea;\n" + "\u05e2\u05e9\u05d9\u05e8\u05d9\u05ea;\n" + "11: =%feminine=;\n" + "1001: =%%unwieldy=;\n" + "%feminine_singular_definite:\n" + "-x: =%%unwieldy=;\n" + "=%%unwieldy=;\n" + "\u05d4\u05e8\u05d0\u05e9\u05d5\u05e0\u05d4;\n" + "\u05d4\u05e9\u05e0\u05d9\u05d4;\n" + "\u05d4\u05e9\u05dc\u05d9\u05e9\u05d9\u05ea;\n" + "\u05d4\u05e8\u05d1\u05d9\u05e2\u05d9\u05ea;\n" + "\u05d4\u05d7\u05de\u05d9\u05e9\u05d9\u05ea;\n" + "\u05d4\u05e9\u05d9\u05e9\u05d9\u05ea;\n" + "\u05d4\u05e9\u05d1\u05d9\u05e2\u05d9\u05ea;\n" + "\u05d4\u05e9\u05de\u05d9\u05e0\u05d9\u05ea;\n" + "\u05d4\u05ea\u05e9\u05d9\u05e2\u05d9\u05ea;\n" + "\u05d4\u05e2\u05e9\u05d9\u05e8\u05d9\u05ea;\n" + "11: \u05d4=%feminine=;\n" + "1001: =%%unwieldy=;\n" + "%feminine_plural_indefinite:\n" + "-x: =%%unwieldy=;\n" + "=%%unwieldy=;\n" + "\u05e8\u05d0\u05e9\u05d5\u05e0\u05d5\u05ea;\n" + "\u05e9\u05e0\u05d9\u05d5\u05ea;\n" + "\u05e9\u05dc\u05d9\u05e9\u05d9\u05d5\u05ea;\n" + "\u05e8\u05d1\u05d9\u05e2\u05d9\u05d5\u05ea;\n" + "\u05d7\u05de\u05d9\u05e9\u05d9\u05d5\u05ea;\n" + "\u05e9\u05d9\u05e9\u05d9\u05d5\u05ea;\n" + "\u05e9\u05d1\u05d9\u05e2\u05d9\u05d5\u05ea;\n" + "\u05e9\u05de\u05d9\u05e0\u05d9\u05d5\u05ea;\n" + "\u05ea\u05e9\u05d9\u05e2\u05d9\u05d5\u05ea;\n" + "\u05e2\u05e9\u05d9\u05e8\u05d9\u05d5\u05ea;\n" + "11: =%feminine=;\n" + "1001: =%%unwieldy=;\n" + "%feminine_plural_definite:\n" + "-x: =%%unwieldy=;\n" + "=%%unwieldy=;\n" + "\u05d4\u05e8\u05d0\u05e9\u05d5\u05e0\u05d5\u05ea;\n" + "\u05d4\u05e9\u05e0\u05d9\u05d5\u05ea;\n" + "\u05d4\u05e9\u05dc\u05d9\u05e9\u05d9\u05d5\u05ea;\n" + "\u05d4\u05e8\u05d1\u05d9\u05e2\u05d9\u05d5\u05ea;\n" + "\u05d4\u05d7\u05de\u05d9\u05e9\u05d9\u05d5\u05ea;\n" + "\u05d4\u05e9\u05d9\u05e9\u05d9\u05d5\u05ea;\n" + "\u05d4\u05e9\u05d1\u05d9\u05e2\u05d9\u05d5\u05ea;\n" + "\u05d4\u05e9\u05de\u05d9\u05e0\u05d9\u05d5\u05ea;\n" + "\u05d4\u05ea\u05e9\u05d9\u05e2\u05d9\u05d5\u05ea;\n" + "\u05d4\u05e2\u05e9\u05d9\u05e8\u05d9\u05d5\u05ea;\n" + "11: \u05d4=%feminine=;\n" + "1001: =%%unwieldy=;\n" + "%%unwieldy:\n" + "\u05de\u05e1\u05e4\u05e8 =%feminine=;\n" + + "%%tunits:\n" + "\u05d0\u05e4\u05e1;\n" + "\u05d0\u05d7\u05ea;\n" + "\u05e9\u05ea\u05d9\u05d9\u05dd;\n" + "\u05e9\u05dc\u05d5\u05e9\u05ea;\n" + "\u05d0\u05e8\u05d1\u05e2\u05ea;\n" + "\u05d7\u05de\u05e9\u05ea;\n" + "\u05e9\u05e9\u05ea;\n" + "\u05e9\u05d1\u05e2\u05ea;\n" + "\u05e9\u05de\u05d5\u05e0\u05ea;\n" + "\u05ea\u05e9\u05e2\u05ea;\n" + "\u05e2\u05e9\u05e8\u05ea;\n" + "=%masculine=;\n" + "%%txunits:\n" + "\u05d5\u05d0\u05e4\u05e1;\n" + "\u05d5\u05d0\u05d7\u05ea;\n" + "\u05d5\u05e9\u05ea\u05d9\u05d9\u05dd;\n" + "\u05d5\u05e9\u05dc\u05d5\u05e9\u05ea;\n" + "\u05d5\u05d0\u05e8\u05d1\u05e2\u05ea;\n" + "\u05d5\u05d7\u05de\u05e9\u05ea;\n" + "\u05d5\u05e9\u05e9\u05ea;\n" + "\u05d5\u05e9\u05d1\u05e2\u05ea;\n" + "\u05d5\u05e9\u05de\u05d5\u05e0\u05ea;\n" + "\u05d5\u05ea\u05e9\u05e2\u05ea;\n" + "\u05d5\u05e2\u05e9\u05e8\u05ea;\n" + "=%%mxunits=;\n" + "%masculine:\n" + "-x: \u05de\u05d9\u05e0\u05d5\u05e1 >>;\n" + "x.x: <%masculine< \u05e0\u05e7\u05d5\u05d3\u05d4 >%%fraction>;\n" + "\u05d0\u05e4\u05e1;\n" + "\u05d0\u05d7\u05d3;\n" + "\u05e9\u05e0\u05d9\u05d9\u05dd;\n" + "\u05e9\u05dc\u05d5\u05e9\u05d4;\n" + "\u05d0\u05e8\u05d1\u05e2\u05d4;\n" + "\u05d7\u05de\u05d9\u05e9\u05d4;\n" + "\u05e9\u05d9\u05e9\u05d4;\n" + "\u05e9\u05d1\u05e2\u05d4;\n" + "\u05e9\u05de\u05d5\u05e0\u05d4;\n" + "\u05ea\u05e9\u05e2\u05d4;\n" + "\u05e2\u05e9\u05e8\u05d4;\n" + "\u05d0\u05d7\u05d3\u0020\u05e2\u05e9\u05e8;\n" + "\u05e9\u05e0\u05d9\u05dd\u0020\u05e2\u05e9\u05e8;\n" + "\u05e9\u05dc\u05d5\u05e9\u05d4\u0020\u05e2\u05e9\u05e8;\n" + "\u05d0\u05e8\u05d1\u05e2\u05d4\u0020\u05e2\u05e9\u05e8;\n" + "\u05d7\u05de\u05d9\u05e9\u05d4\u0020\u05e2\u05e9\u05e8;\n" + "\u05e9\u05d9\u05e9\u05d4\u0020\u05e2\u05e9\u05e8;\n" + "\u05e9\u05d1\u05e2\u05d4\u0020\u05e2\u05e9\u05e8;\n" + "\u05e9\u05de\u05d5\u05e0\u05d4\u0020\u05e2\u05e9\u05e8;\n" + "\u05ea\u05e9\u05e2\u05d4\u0020\u05e2\u05e9\u05e8;\n" + "20: \u05e2\u05e9\u05e8\u05d9\u05dd[ \u05d5>>];\n" + "30: \u05e9\u05dc\u05d5\u05e9\u05d9\u05dd[ \u05d5>>];\n" + "40: \u05d0\u05e8\u05d1\u05e2\u05d9\u05dd[ \u05d5>>];\n" + "50: \u05d7\u05de\u05d9\u05e9\u05d9\u05dd[ \u05d5>>];\n" + "60: \u05e9\u05d9\u05e9\u05d9\u05dd[ \u05d5>>];\n" + "70: \u05e9\u05d1\u05e2\u05d9\u05dd[ \u05d5>>];\n" + "80: \u05e9\u05de\u05d5\u05e0\u05d9\u05dd[ \u05d5>>];\n" + "90: \u05ea\u05e9\u05e2\u05d9\u05dd[ \u05d5>>];\n" + "100: \u05de\u05d0\u05d4[ >%%mxunits>];\n" + "200: \u05de\u05d0\u05ea\u05d9\u05d9\u05dd[ >%%mxunits>];\n" + "300: <%feminine< \u05de\u05d0\u05d5\u05ea[ >%%mxunits>];\n" + "1000: \u05d0\u05dc\u05e3[ >%%mxunits>];\n" + "2000: \u05d0\u05dc\u05e4\u05d9\u05d9\u05dd[ >%%mxunits>];\n" + "3000: <%%tunits< \u05d0\u05dc\u05e4\u05d9\u05dd[ >%%mxunits>];\n" + "11000/1000: << \u05d0\u05dc\u05e3[ >%%mxunits>];\n" + + "1,000,000: \u05de\u05d9\u05dc\u05d9\u05d5\u05df[ >%%mxunits>];\n" + "2,000,000: \u05e9\u05e0\u05d9 \u05de\u05d9\u05dc\u05d9\u05d5\u05df[ >%%mxunits>];\n" + "3,000,000: << \u05de\u05d9\u05dc\u05d9\u05d5\u05df[ >%%mxunits>];\n" + "1,000,000,000: \u05de\u05d9\u05dc\u05d9\u05e8\u05d3[ >%%mxunits>];\n" + "2,000,000,000: \u05e9\u05e0\u05d9 \u05de\u05d9\u05dc\u05d9\u05e8\u05d3[ >%%mxunits>];\n" + "3,000,000,000: << \u05de\u05d9\u05dc\u05d9\u05e8\u05d3[ >%%mxunits>];\n" + "1,000,000,000,000: \u05d8\u05e8\u05d9\u05dc\u05d9\u05d5\u05df[ >%%mxunits>];\n" + "2,000,000,000,000: \u05e9\u05e0\u05d9 \u05d8\u05e8\u05d9\u05dc\u05d9\u05d5\u05df[ >%%mxunits>];\n" + "3,000,000,000,000: << \u05d8\u05e8\u05d9\u05dc\u05d9\u05d5\u05df[ >%%mxunits>];\n" + "1,000,000,000,000,000: =#,###.##=;\n" + "%%fraction:\n" + "10: <%feminine<<;\n" + "100: <%feminine<<;\n" + "1000: <%feminine<<;\n" + "10,000: <%feminine<<;\n" + "100,000: <%feminine<<;\n" + "1,000,000: <%feminine<<;\n" + "10,000,000: <%feminine<<;\n" + "100,000,000: <%feminine<<;\n" + "1,000,000,000: <%feminine<<;\n" + "10,000,000,000: <#,##0<;\n" + "%%mxunits:\n" + "0:;\n" + "\u05d5\u05d0\u05d7\u05d3;\n" + "\u05d5\u05e9\u05e0\u05d9\u05d9\u05dd;\n" + "\u05d5\u05e9\u05dc\u05d5\u05e9\u05d4;\n" + "\u05d5\u05d0\u05e8\u05d1\u05e2\u05d4;\n" + "\u05d5\u05d7\u05de\u05d9\u05e9\u05d4;\n" + "\u05d5\u05e9\u05d9\u05e9\u05d4;\n" + "\u05d5\u05e9\u05d1\u05e2\u05d4;\n" + "\u05d5\u05e9\u05de\u05d5\u05e0\u05d4;\n" + "\u05d5\u05ea\u05e9\u05e2\u05d4;\n" + "\u05d5\u05e2\u05e9\u05e8\u05d4;\n" + "\u05d5\u05d0\u05d7\u05d3\u0020\u05e2\u05e9\u05e8;\n" + "\u05d5\u05e9\u05e0\u05d9\u05dd\u0020\u05e2\u05e9\u05e8;\n" + "\u05d5\u05e9\u05dc\u05d5\u05e9\u05d4\u0020\u05e2\u05e9\u05e8;\n" + "\u05d5\u05d0\u05e8\u05d1\u05e2\u05d4\u0020\u05e2\u05e9\u05e8;\n" + "\u05d5\u05d7\u05de\u05d9\u05e9\u05d4\u0020\u05e2\u05e9\u05e8;\n" + "\u05d5\u05e9\u05d9\u05e9\u05d4\u0020\u05e2\u05e9\u05e8;\n" + "\u05d5\u05e9\u05d1\u05e2\u05d4\u0020\u05e2\u05e9\u05e8;\n" + "\u05d5\u05e9\u05de\u05d5\u05e0\u05d4\u0020\u05e2\u05e9\u05e8;\n" + "\u05d5\u05ea\u05e9\u05e2\u05d4\u0020\u05e2\u05e9\u05e8;\n" + "20: \u05d5\u05e2\u05e9\u05e8\u05d9\u05dd;\n" + "21: \u05e2\u05e9\u05e8\u05d9\u05dd >>;\n" + "30: \u05d5\u05e9\u05dc\u05d5\u05e9\u05d9\u05dd;\n" + "31: \u05e9\u05dc\u05d5\u05e9\u05d9\u05dd >>;\n" + "40: \u05d5\u05d0\u05e8\u05d1\u05e2\u05d9\u05dd;\n" + "41: \u05d0\u05e8\u05d1\u05e2\u05d9\u05dd >>;\n" + "50: \u05d5\u05d7\u05de\u05d9\u05e9\u05d9\u05dd;\n" + "51: \u05d7\u05de\u05d9\u05e9\u05d9\u05dd >>;\n" + "60: \u05d5\u05e9\u05d9\u05e9\u05d9\u05dd;\n" + "61: \u05e9\u05d9\u05e9\u05d9\u05dd >>;\n" + "70: \u05d5\u05e9\u05d1\u05e2\u05d9\u05dd;\n" + "71: \u05e9\u05d1\u05e2\u05d9\u05dd >>;\n" + "80: \u05d5\u05e9\u05de\u05d5\u05e0\u05d9\u05dd;\n" + "81: \u05e9\u05de\u05d5\u05e0\u05d9\u05dd >>;\n" + "90: \u05d5\u05ea\u05e9\u05e2\u05d9\u05dd;\n" + "91: \u05ea\u05e9\u05e2\u05d9\u05dd >>;\n" + "100: \u05d5\u05de\u05d0\u05d4;\n" + "101: \u05de\u05d0\u05d4 >>;\n" + "200: \u05d5\u05de\u05d0\u05ea\u05d9\u05d9\u05dd;\n" + "201: \u05de\u05d0\u05ea\u05d9\u05d9\u05dd >>;\n" + "300: \u05d5\u05e9\u05dc\u05d5\u05e9 \u05de\u05d0\u05d5\u05ea;\n" + "301: \u05e9\u05dc\u05d5\u05e9 \u05de\u05d0\u05d5\u05ea >>;\n" + "400: \u05d5\u05d0\u05e8\u05d1\u05e2 \u05de\u05d0\u05d5\u05ea;\n" + "401: \u05d0\u05e8\u05d1\u05e2 \u05de\u05d0\u05d5\u05ea >>;\n" + "500: \u05d5\u05d7\u05de\u05e9 \u05de\u05d0\u05d5\u05ea;\n" + "501: \u05d7\u05de\u05e9 \u05de\u05d0\u05d5\u05ea >>;\n" + "600: \u05d5\u05e9\u05e9 \u05de\u05d0\u05d5\u05ea;\n" + "601: \u05e9\u05e9 \u05de\u05d0\u05d5\u05ea >>;\n" + "700: \u05d5\u05e9\u05d1\u05e2 \u05de\u05d0\u05d5\u05ea;\n" + "701: \u05e9\u05d1\u05e2 \u05de\u05d0\u05d5\u05ea >>;\n" + "800: \u05d5\u05e9\u05de\u05d5\u05e0\u05d4 \u05de\u05d0\u05d5\u05ea;\n" + "801: \u05e9\u05de\u05d5\u05e0\u05d4 \u05de\u05d0\u05d5\u05ea >>;\n" + "900: \u05d5\u05ea\u05e9\u05e2 \u05de\u05d0\u05d5\u05ea;\n" + "901: \u05ea\u05e9\u05e2 \u05de\u05d0\u05d5\u05ea >>;\n" + "1000: \u05d5\u05d0\u05dc\u05e3[ >>];\n" + "2000: \u05d5\u05d0\u05dc\u05e4\u05d9\u05d9\u05dd[ >>];\n" + "3000: <%%txunits< \u05d0\u05dc\u05e4\u05d9\u05dd[ >>];\n" + "11000/1000: << \u05d0\u05dc\u05e3[ >>];\n" + "1,000,000: \u05d5\u05de\u05d9\u05dc\u05d9\u05d5\u05df[ >>];\n" + "2,000,000: \u05d5\u05e9\u05e0\u05d9 \u05de\u05d9\u05dc\u05d9\u05d5\u05df[ >>];\n" + "3,000,000: << \u05de\u05d9\u05dc\u05d9\u05d5\u05df[ >>];\n" + "1,000,000,000: \u05d5\u05de\u05d9\u05dc\u05d9\u05e8\u05d3[ >>];\n" + "2,000,000,000: \u05d5\u05e9\u05e0\u05d9 \u05de\u05d9\u05dc\u05d9\u05e8\u05d3[ >>];\n" + "3,000,000,000: << \u05de\u05d9\u05dc\u05d9\u05e8\u05d3[ >>];\n" + "1,000,000,000,000: \u05d5\u05d8\u05e8\u05d9\u05dc\u05d9\u05d5\u05df[ >>];\n" + "2,000,000,000,000: \u05d5\u05e9\u05e0\u05d9 \u05d8\u05e8\u05d9\u05dc\u05d9\u05d5\u05df[ >>];\n" + "3,000,000,000,000: << \u05d8\u05e8\u05d9\u05dc\u05d9\u05d5\u05df[ >>];\n" + "1,000,000,000,000,000: =#,###.##=;\n" + "%feminine:\n" + "-x: \u05de\u05d9\u05e0\u05d5\u05e1 >>;\n" + "x.x: <%feminine< \u05e0\u05e7\u05d5\u05d3\u05d4 >%%fraction>;\n" + "\u05d0\u05e4\u05e1;\n" + "\u05d0\u05d7\u05ea;\n" + "\u05e9\u05ea\u05d9\u05d9\u05dd;\n" + "\u05e9\u05dc\u05d5\u05e9;\n" + "\u05d0\u05e8\u05d1\u05e2;\n" + "\u05d7\u05de\u05e9;\n" + "\u05e9\u05e9;\n" + "\u05e9\u05d1\u05e2;\n" + "\u05e9\u05de\u05d5\u05e0\u05d4;\n" + "\u05ea\u05e9\u05e2;\n" + "\u05e2\u05e9\u05e8;\n" + "\u05d0\u05d7\u05ea\u0020\u05e2\u05e9\u05e8\u05d4;\n" + "\u05e9\u05ea\u05d9\u05dd\u0020\u05e2\u05e9\u05e8\u05d4;\n" + "\u05e9\u05dc\u05d5\u05e9\u0020\u05e2\u05e9\u05e8\u05d4;\n" + "\u05d0\u05e8\u05d1\u05e2\u0020\u05e2\u05e9\u05e8\u05d4;\n" + "\u05d7\u05de\u05e9\u0020\u05e2\u05e9\u05e8\u05d4;\n" + "\u05e9\u05e9\u0020\u05e2\u05e9\u05e8\u05d4;\n" + "\u05e9\u05d1\u05e2\u0020\u05e2\u05e9\u05e8\u05d4;\n" + "\u05e9\u05de\u05d5\u05e0\u05d4\u0020\u05e2\u05e9\u05e8\u05d4;\n" + "\u05ea\u05e9\u05e2\u0020\u05e2\u05e9\u05e8\u05d4;\n" + "20: \u05e2\u05e9\u05e8\u05d9\u05dd[ \u05d5>>];\n" + "30: \u05e9\u05dc\u05d5\u05e9\u05d9\u05dd[ \u05d5>>];\n" + "40: \u05d0\u05e8\u05d1\u05e2\u05d9\u05dd[ \u05d5>>];\n" + "50: \u05d7\u05de\u05d9\u05e9\u05d9\u05dd[ \u05d5>>];\n" + "60: \u05e9\u05d9\u05e9\u05d9\u05dd[ \u05d5>>];\n" + "70: \u05e9\u05d1\u05e2\u05d9\u05dd[ \u05d5>>];\n" + "80: \u05e9\u05de\u05d5\u05e0\u05d9\u05dd[ \u05d5>>];\n" + "90: \u05ea\u05e9\u05e2\u05d9\u05dd[ \u05d5>>];\n" + "100: \u05de\u05d0\u05d4[ >%%fxunits>];\n" + "200: \u05de\u05d0\u05ea\u05d9\u05d9\u05dd[ >%%fxunits>];\n" + "300: << \u05de\u05d0\u05d5\u05ea[ >%%fxunits>];\n" + "1000: \u05d0\u05dc\u05e3[ >%%fxunits>];\n" + "2000: \u05d0\u05dc\u05e4\u05d9\u05d9\u05dd[ >%%fxunits>];\n" + "3000: <%%tunits< \u05d0\u05dc\u05e4\u05d9\u05dd[ >%%fxunits>];\n" + "11000/1000: <%masculine< \u05d0\u05dc\u05e3[ >%%fxunits>];\n" + "1,000,000: \u05de\u05d9\u05dc\u05d9\u05d5\u05df[ >%%fxunits>];\n" + "2,000,000: \u05e9\u05e0\u05d9 \u05de\u05d9\u05dc\u05d9\u05d5\u05df[ >%%fxunits>];\n" + "3,000,000: <%masculine< \u05de\u05d9\u05dc\u05d9\u05d5\u05df[ >%%fxunits>];\n" + "1,000,000,000: \u05de\u05d9\u05dc\u05d9\u05e8\u05d3[ >%%fxunits>];\n" + "2,000,000,000: \u05e9\u05e0\u05d9 \u05de\u05d9\u05dc\u05d9\u05e8\u05d3[ >%%fxunits>];\n" + "3,000,000,000: <%masculine< \u05de\u05d9\u05dc\u05d9\u05e8\u05d3[ >%%fxunits>];\n" + "1,000,000,000,000: \u05d8\u05e8\u05d9\u05dc\u05d9\u05d5\u05df[ >%%fxunits>];\n" + "2,000,000,000,000: \u05e9\u05e0\u05d9 \u05d8\u05e8\u05d9\u05dc\u05d9\u05d5\u05df[ >%%fxunits>];\n" + "3,000,000,000,000: <%masculine< \u05d8\u05e8\u05d9\u05dc\u05d9\u05d5\u05df[ >%%fxunits>];\n" + "1,000,000,000,000,000: =#,###.##=;\n" + "%%fxunits:\n" + "0:;\n" + "\u05d5\u05d0\u05d7\u05ea;\n" + "\u05d5\u05e9\u05ea\u05d9\u05d9\u05dd;\n" + "\u05d5\u05e9\u05dc\u05d5\u05e9;\n" + "\u05d5\u05d0\u05e8\u05d1\u05e2;\n" + "\u05d5\u05d7\u05de\u05e9;\n" + "\u05d5\u05e9\u05e9;\n" + "\u05d5\u05e9\u05d1\u05e2;\n" + "\u05d5\u05e9\u05de\u05d5\u05e0\u05d4;\n" + "\u05d5\u05ea\u05e9\u05e2;\n" + "\u05d5\u05e2\u05e9\u05e8;\n" + "\u05d5\u05d0\u05d7\u05ea\u0020\u05e2\u05e9\u05e8\u05d4;\n" + "\u05d5\u05e9\u05ea\u05d9\u05dd\u0020\u05e2\u05e9\u05e8\u05d4;\n" + "\u05d5\u05e9\u05dc\u05d5\u05e9\u0020\u05e2\u05e9\u05e8\u05d4;\n" + "\u05d5\u05d0\u05e8\u05d1\u05e2\u0020\u05e2\u05e9\u05e8\u05d4;\n" + "\u05d5\u05d7\u05de\u05e9\u0020\u05e2\u05e9\u05e8\u05d4;\n" + "\u05d5\u05e9\u05e9\u0020\u05e2\u05e9\u05e8\u05d4;\n" + "\u05d5\u05e9\u05d1\u05e2\u0020\u05e2\u05e9\u05e8\u05d4;\n" + "\u05d5\u05e9\u05de\u05d5\u05e0\u05d4\u0020\u05e2\u05e9\u05e8\u05d4;\n" + "\u05d5\u05ea\u05e9\u05e2\u0020\u05e2\u05e9\u05e8\u05d4;\n" + "20: \u05d5\u05e2\u05e9\u05e8\u05d9\u05dd;\n" + "21: \u05e2\u05e9\u05e8\u05d9\u05dd >>;\n" + "30: \u05d5\u05e9\u05dc\u05d5\u05e9\u05d9\u05dd;\n" + "31: \u05e9\u05dc\u05d5\u05e9\u05d9\u05dd >>;\n" + "40: \u05d5\u05d0\u05e8\u05d1\u05e2\u05d9\u05dd;\n" + "41: \u05d0\u05e8\u05d1\u05e2\u05d9\u05dd >>;\n" + "50: \u05d5\u05d7\u05de\u05d9\u05e9\u05d9\u05dd;\n" + "51: \u05d7\u05de\u05d9\u05e9\u05d9\u05dd >>;\n" + "60: \u05d5\u05e9\u05d9\u05e9\u05d9\u05dd;\n" + "61: \u05e9\u05d9\u05e9\u05d9\u05dd >>;\n" + "70: \u05d5\u05e9\u05d1\u05e2\u05d9\u05dd;\n" + "71: \u05e9\u05d1\u05e2\u05d9\u05dd >>;\n" + "80: \u05d5\u05e9\u05de\u05d5\u05e0\u05d9\u05dd;\n" + "81: \u05e9\u05de\u05d5\u05e0\u05d9\u05dd >>;\n" + "90: \u05d5\u05ea\u05e9\u05e2\u05d9\u05dd;\n" + "91: \u05ea\u05e9\u05e2\u05d9\u05dd >>;\n" + "100: \u05d5\u05de\u05d0\u05d4;\n" + "101: \u05de\u05d0\u05d4 >>;\n" + "200: \u05d5\u05de\u05d0\u05ea\u05d9\u05d9\u05dd;\n" + "201: \u05de\u05d0\u05ea\u05d9\u05d9\u05dd >>;\n" + "300: \u05d5\u05e9\u05dc\u05d5\u05e9 \u05de\u05d0\u05d5\u05ea;\n" + "301: \u05e9\u05dc\u05d5\u05e9 \u05de\u05d0\u05d5\u05ea >>;\n" + "400: \u05d5\u05d0\u05e8\u05d1\u05e2 \u05de\u05d0\u05d5\u05ea;\n" + "401: \u05d0\u05e8\u05d1\u05e2 \u05de\u05d0\u05d5\u05ea >>;\n" + "500: \u05d5\u05d7\u05de\u05e9 \u05de\u05d0\u05d5\u05ea;\n" + "501: \u05d7\u05de\u05e9 \u05de\u05d0\u05d5\u05ea >>;\n" + "600: \u05d5\u05e9\u05e9 \u05de\u05d0\u05d5\u05ea;\n" + "601: \u05e9\u05e9 \u05de\u05d0\u05d5\u05ea >>;\n" + "700: \u05d5\u05e9\u05d1\u05e2 \u05de\u05d0\u05d5\u05ea;\n" + "701: \u05e9\u05d1\u05e2 \u05de\u05d0\u05d5\u05ea >>;\n" + "800: \u05d5\u05e9\u05de\u05d5\u05e0\u05d4 \u05de\u05d0\u05d5\u05ea;\n" + "801: \u05e9\u05de\u05d5\u05e0\u05d4 \u05de\u05d0\u05d5\u05ea >>;\n" + "900: \u05d5\u05ea\u05e9\u05e2 \u05de\u05d0\u05d5\u05ea;\n" + "901: \u05ea\u05e9\u05e2 \u05de\u05d0\u05d5\u05ea >>;\n" + "1000: \u05d5\u05d0\u05dc\u05e3[ >>];\n" + "2000: \u05d5\u05d0\u05dc\u05e4\u05d9\u05d9\u05dd[ >>];\n" + "3000: <%%txunits< \u05d0\u05dc\u05e4\u05d9\u05dd[ >>];\n" + "11000/1000: <%%mxunits< \u05d0\u05dc\u05e3[ >>];\n" + "1,000,000: \u05d5\u05de\u05d9\u05dc\u05d9\u05d5\u05df[ >>];\n" + "2,000,000: \u05d5\u05e9\u05e0\u05d9 \u05de\u05d9\u05dc\u05d9\u05d5\u05df[ >>];\n" + "3,000,000: <%%mxunits< \u05de\u05d9\u05dc\u05d9\u05d5\u05df[ >>];\n" + "1,000,000,000: \u05d5\u05de\u05d9\u05dc\u05d9\u05e8\u05d3[ >>];\n" + "2,000,000,000: \u05d5\u05e9\u05e0\u05d9 \u05de\u05d9\u05dc\u05d9\u05e8\u05d3[ >>];\n" + "3,000,000,000: <%%mxunits< \u05de\u05d9\u05dc\u05d9\u05e8\u05d3[ >>];\n" + "1,000,000,000,000: \u05d5\u05d8\u05e8\u05d9\u05dc\u05d9\u05d5\u05df[ >>];\n" + "2,000,000,000,000: \u05d5\u05e9\u05e0\u05d9 \u05d8\u05e8\u05d9\u05dc\u05d9\u05d5\u05df[ >>];\n" + "3,000,000,000,000: <%%mxunits< \u05d8\u05e8\u05d9\u05dc\u05d9\u05d5\u05df[ >>];\n" + "1,000,000,000,000,000: =#,###.##=;\n" + + "%ordinal_default:\n" + "=%masculine_singular_indefinite=;\n" + } + + OrdinalLocalizations { + { "%ordinal_default", + "%feminine_singular_definite", "%feminine_singular_indefinite", + "%feminine_plural_definite", "%feminine_plural_indefinite", + "%masculine_singular_definite", "%masculine_singular_indefinite", + "%masculine_plural_definite", "%masculine_plural_indefinite", + } + { "he", + "\u05d1\u05e8\u05d9\u05e8\u05ea \u05de\u05d7\u05d3\u05dc", + "\u05e0\u05e7\u05d1\u05d4 \u05d9\u05d7\u05d9\u05d3 \u05e2\u05dd \u05d4' \u05d4\u05d9\u05d3\u05d9\u05e2\u05d4", + "\u05e0\u05e7\u05d1\u05d4 \u05d9\u05d7\u05d9\u05d3 \u05d1\u05dc\u05d9 \u05d4' \u05d4\u05d9\u05d3\u05d9\u05e2\u05d4", + "\u05e0\u05e7\u05d1\u05d4 \u05e8\u05d1\u05d9\u05dd \u05e2\u05dd \u05d4' \u05d4\u05d9\u05d3\u05d9\u05e2\u05d4", + "\u05e0\u05e7\u05d1\u05d4 \u05e8\u05d1\u05d9\u05dd \u05d1\u05dc\u05d9 \u05d4' \u05d4\u05d9\u05d3\u05d9\u05e2\u05d4", + "\u05d6\u05db\u05e8 \u05d9\u05d7\u05d9\u05d3 \u05e2\u05dd \u05d4' \u05d4\u05d9\u05d3\u05d9\u05e2\u05d4", + "\u05d6\u05db\u05e8 \u05d9\u05d7\u05d9\u05d3 \u05d1\u05dc\u05d9 \u05d4' \u05d4\u05d9\u05d3\u05d9\u05e2\u05d4", + "\u05d6\u05db\u05e8 \u05e8\u05d1\u05d9\u05dd \u05e2\u05dd \u05d4' \u05d4\u05d9\u05d3\u05d9\u05e2\u05d4", + "\u05d6\u05db\u05e8 \u05e8\u05d1\u05d9\u05dd \u05d1\u05dc\u05d9 \u05d4' \u05d4\u05d9\u05d3\u05d9\u05e2\u05d4", + } + { "en", + "Default", + "Fem. Singular Definite", "Fem. Singular Indefinite", + "Fem. Plural Definite", "Fem. Plural Indefinite", + "Mas. Singular Definite", "Mas. Singular Indefinite", + "Mas. Plural Definite", "Mas. Plural Indefinite", + } + } +} diff --git a/icuSources/data/rbnf/it.txt b/icuSources/data/rbnf/it.txt new file mode 100644 index 00000000..201c4c95 --- /dev/null +++ b/icuSources/data/rbnf/it.txt @@ -0,0 +1,108 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// + +it { + //------------------------------------------------------------ + // Rule Based Number Format Support + //------------------------------------------------------------ + +// * Spellout rules for Italian. Like German, most Italian numbers are +// * written as single words. What makes these rules complicated is the rule +// * that says that when a word ending in a vowel and a word beginning with +// * a vowel are combined into a compound, the vowel is dropped from the +// * end of the first word: 180 is "centottanta," not "centoottanta." +// * The complexity of this rule set is to produce this behavior. + + // Can someone confirm that I did the vowel-eliding thing right? I'm + // not 100% sure I'm doing it in all the right places, or completely + // correctly. Also, I don't have information for negatives and decimals, + // and I lack words fror values from 1,000,000 on up. + + SpelloutRules { + // main rule set. Follows the patterns of the preceding rule sets, + // except that the final vowel is omitted from words ending in + // vowels when they are followed by another word; instead, we have + // separate rule sets that are identical to this one, except that + // all the words that don't begin with a vowel have a vowel tacked + // onto them at the front. A word ending in a vowel calls a + // substitution that will supply that vowel, unless that vowel is to + // be elided. + "%main:\n" + "-x: meno >>;\n" + "x.x: << virgola >>;\n" + "zero; uno; due; tre; quattro; cinque; sei; sette; otto; nove;\n" + "dieci; undici; dodici; tredici; quattordici; quindici; sedici;\n" + " diciasette; diciotto; diciannove;\n" + "20: venti; vent>%%with-i>;\n" + "30: trenta; trent>%%with-i>;\n" + "40: quaranta; quarant>%%with-a>;\n" + "50: cinquanta; cinquant>%%with-a>;\n" + "60: sessanta; sessant>%%with-a>;\n" + "70: settanta; settant>%%with-a>;\n" + "80: ottanta; ottant>%%with-a>;\n" + "90: novanta; novant>%%with-a>;\n" + "100: cento; cent[>%%with-o>];\n" + "200: <%%with-o>];\n" + "1000: mille; mill[>%%with-i>];\n" + "2000: <%%with-a>];\n" + "100,000>>: <>];\n" + "1,000,000: =#,##0= (incomplete data);\n" + "%%with-a:\n" + "azero; uno; adue; atre; aquattro; acinque; asei; asette; otto; anove;\n" + "adieci; undici; adodici; atredici; aquattordici; aquindici; asedici;\n" + " adiciasette; adiciotto; adiciannove;\n" + "20: aventi; avent>%%with-i>;\n" + "30: atrenta; atrent>%%with-i>;\n" + "40: aquaranta; aquarant>%%with-a>;\n" + "50: acinquanta; acinquant>%%with-a>;\n" + "60: asessanta; asessant>%%with-a>;\n" + "70: asettanta; asettant>%%with-a>;\n" + "80: ottanta; ottant>%%with-a>;\n" + "90: anovanta; anovant>%%with-a>;\n" + "100: acento; acent[>%%with-o>];\n" + "200: <%%with-a%%with-o>];\n" + "1000: amille; amill[>%%with-i>];\n" + "2000: <%%with-a%%with-a>];\n" + "100,000: =%main=;\n" + "%%with-i:\n" + "izero; uno; idue; itre; iquattro; icinque; isei; isette; otto; inove;\n" + "idieci; undici; idodici; itredici; iquattordici; iquindici; isedici;\n" + " idiciasette; idiciotto; idiciannove;\n" + "20: iventi; ivent>%%with-i>;\n" + "30: itrenta; itrent>%%with-i>;\n" + "40: iquaranta; iquarant>%%with-a>;\n" + "50: icinquanta; icinquant>%%with-a>;\n" + "60: isessanta; isessant>%%with-a>;\n" + "70: isettanta; isettant>%%with-a>;\n" + "80: ottanta; ottant>%%with-a>;\n" + "90: inovanta; inovant>%%with-a>;\n" + "100: icento; icent[>%%with-o>];\n" + "200: <%%with-i%%with-o>];\n" + "1000: imille; imill[>%%with-i>];\n" + "2000: <%%with-i%%with-a>];\n" + "100,000: =%main=;\n" + "%%with-o:\n" + "ozero; uno; odue; otre; oquattro; ocinque; osei; osette; otto; onove;\n" + "odieci; undici; ododici; otredici; oquattordici; oquindici; osedici;\n" + " odiciasette; odiciotto; odiciannove;\n" + "20: oventi; ovent>%%with-i>;\n" + "30: otrenta; otrent>%%with-i>;\n" + "40: oquaranta; oquarant>%%with-a>;\n" + "50: ocinquanta; ocinquant>%%with-a>;\n" + "60: osessanta; osessant>%%with-a>;\n" + "70: osettanta; osettant>%%with-a>;\n" + "80: ottanta; ottant>%%with-a>;\n" + "90: onovanta; onovant>%%with-a>;\n" + "100: ocento; ocent[>%%with-o>];\n" + "200: <%%with-o%%with-o>];\n" + "1000: omille; omill[>%%with-i>];\n" + "2000: <%%with-o%%with-a>];\n" + "100,000: =%main=;\n" + } + +} diff --git a/icuSources/data/rbnf/ja.txt b/icuSources/data/rbnf/ja.txt new file mode 100644 index 00000000..aaeabc16 --- /dev/null +++ b/icuSources/data/rbnf/ja.txt @@ -0,0 +1,54 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// + +ja { + + //------------------------------------------------------------ + // Rule Based Number Format Support + //------------------------------------------------------------ + +// * Spellout rules for Japanese. In Japanese, there really isn't any +// * distinction between a number written out in digits and a number +// * written out in words: the ideographic characters are both digits +// * and words. This rule set provides two variants: %traditional +// * uses the traditional CJK numerals (which are also used in China +// * and Korea). %financial uses alternate ideographs for many numbers +// * that are harder to alter than the traditional numerals (one could +// * fairly easily change a one to +// * a three just by adding two strokes, for example). This is also done in +// * the other countries using Chinese idographs, but different ideographs +// * are used in those places. + + // Can someone supply me with the right fraud-proof ideographs for + // Simplified and Traditional Chinese, and for Korean? Can someone + // supply me with information on negatives and decimals? + + SpelloutRules { + "%financial:\n" + "\u96f6; \u58f1; \u5f10; \u53c2; \u56db; \u4f0d; \u516d; \u4e03; \u516b; \u4e5d;\n" + "\u62fe[>>];\n" + "20: <<\u62fe[>>];\n" + "100: <<\u767e[>>];\n" + "1000: <<\u5343[>>];\n" + "10,000: <<\u4e07[>>];\n" + "100,000,000: <<\u5104[>>];\n" + "1,000,000,000,000: <<\u5146[>>];\n" + "10,000,000,000,000,000: =#,##0=;\n" + "%traditional:\n" + "\u96f6; \u4e00; \u4e8c; \u4e09; \u56db; \u4e94; \u516d; \u4e03; \u516b; \u4e5d;\n" + "\u5341[>>];\n" + "20: <<\u5341[>>];\n" + "100: <<\u767e[>>];\n" + "1000: <<\u5343[>>];\n" + "10,000: <<\u4e07[>>];\n" + "100,000,000: <<\u5104[>>];\n" + "1,000,000,000,000: <<\u5146[>>];\n" + "10,000,000,000,000,000: =#,##0=;" + } + +} diff --git a/icuSources/data/rbnf/mt.txt b/icuSources/data/rbnf/mt.txt new file mode 100644 index 00000000..2a56257f --- /dev/null +++ b/icuSources/data/rbnf/mt.txt @@ -0,0 +1,193 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// + +mt { +// Spellout rules. Experimental. + + SpelloutRules { + // This rule set shows the normal simple formatting rules for English + "%simplified:\n" + // negative number rule. This rule is used to format negative + // numbers. The result of formatting the number's absolute + // value is placed where the >> is. + "-x: minus >>;\n" + // faction rule. This rule is used for formatting numbers + // with fractional parts. The result of formatting the + // number's integral part is substituted for the <<, and + // the result of formatting the number's fractional part + // (one digit at a time, e.g., 0.123 is "zero punt one two + // three") replaces the >>. + "x.x: << punt >>;\n" + // the rules for the values from 0 to 19 are simply the + // words for those numbers + "żero; wieħed; tnejn; tlieta; erbgħa; ħamsa; sitta; sebgħa; tmienja; disgħa;\n" + "għaxra; ħdax; tnax; tlettax; erbatax; ħmistax; sittax;\n" + " sbatax; tmintax; dsatax;\n" + // beginning at 20, we use the >> to mark the position where + // the result of formatting the number's ones digit. Thus, + // we only need a new rule at every multiple of 10. Text in + // backets is omitted if the value being formatted is an + // even multiple of 10. + "20: [>> u ]għoxrin;\n" + "30: [>> u ]tletin;\n" + "40: [>> u ]erbgħin;\n" + "50: [>> u ]ħamsin;\n" + "60: [>> u ]sittin;\n" + "70: [>> u ]sebgħin;\n" + "80: [>> u ]tmenin;\n" + "90: [>> u ]disgħin;\n" + // beginning at 100, we can use << to mark the position where + // the result of formatting the multiple of 100 is to be + // inserted. Notice also that the meaning of >> has shifted: + // here, it refers to both the ones place and the tens place. + // The meanings of the << and >> tokens depend on the base value + // of the rule. A rule's divisor is (usually) the highest + // power of 10 that is less than or equal to the rule's base + // value. The value being formatted is divided by the rule's + // divisor, and the integral quotient is used to get the text + // for <<, while the remainder is used to produce the text + // for >>. Again, text in brackets is omitted if the value + // being formatted is an even multiple of the rule's divisor + // (in this case, an even multiple of 100) + "100: mija[ u >>];\n" + "200: mitejn[ u >>];\n" + // The rules for the higher numbers work the same way as the + // rule for 100: Again, the << and >> tokens depend on the + // rule's divisor, which for all these rules is also the rule's + // base value. To group by thousand, we simply don't have any + // rules between 1,000 and 1,000,000. + "1000: << elf[ u >>];\n" + "2000: << elfejn[ u >>];\n" + "3000: tliet elef [ u >>];\n" + "1,000,000: << miljun[ u >>];\n" + "1,000,000,000: << biljun[ >>];\n" + "1,000,000,000,000: << triljun[ >>];\n" + // overflow rule. This rule specifies that values of a + // quadrillion or more are shown in numerals rather than words. + // The == token means to format (with new rules) the value + // being formatted by this rule and place the result where + // the == is. The #,##0 inside the == signs is a + // DecimalFormat pattern. It specifies that the value should + // be formatted with a DecimalFormat object, and that it + // should be formatted with no decimal places, at least one + // digit, and a thousands separator. + "1,000,000,000,000,000: =#,##0=;\n" + + // %default is a more elaborate form of %simplified; It is basically + // the same, except that it introduces "and" before the ones digit + // when appropriate (basically, between the tens and ones digits) and + // separates the thousands groups with commas in values over 100,000. + "%default:\n" + // negative-number and fraction rules. These are the same + // as those for %simplified, but have to be stated here too + // because this is an entry point + "-x: minus >>;\n" + "x.x: << punt >>;\n" + // just use %simplified for values below 100 + "=%simplified=;\n" + // for values from 100 to 9,999 use %%and to decide whether or + // not to interpose the "and" + "100: mija[ >%%and>];\n" + "200: mitejn[ >%%and>];\n" + "300: tlett mija[ >%%and>];\n" + "400: erbgħa mija[ >%%and>];\n" + "500: ħames mija[ >%%and>];\n" + "600: sitt mija[ >%%and>];\n" + "700: sebgħa mija[ >%%and>];\n" + "800: tmin mija[ >%%and>];\n" + "900: disgħa mija[ >%%and>];\n" + "1000: << elf[ >%%and>];\n" + // for values of 100,000 and up, use %%commas to interpose the + // commas in the right places (and also to interpose the "and") + "100,000>>: << thousand[>%%commas>];\n" + "1,000,000: << million[>%%commas>];\n" + "1,000,000,000: << billion[>%%commas>];\n" + "1,000,000,000,000: << trillion[>%%commas>];\n" + "1,000,000,000,000,000: =#,##0=;\n" + // if the value passed to this rule set is greater than 100, don't + // add the "and"; if it's less than 100, add "and" before the last + // digits + "%%and:\n" + "u =%default=;\n" + "100: =%default=;\n" + // this rule set is used to place the commas + "%%commas:\n" + // for values below 100, add "and" (the apostrophe at the + // beginning is ignored, but causes the space that follows it + // to be significant: this is necessary because the rules + // calling %%commas don't put a space before it) + "' and =%default=;\n" + // put a comma after the thousands (or whatever preceded the + // hundreds) + "100: , =%default=;\n" + // put a comma after the millions (or whatever precedes the + // thousands) + "1000: , <%default< thousand, >%default>;\n" + // and so on... + "1,000,000: , =%default=;" + // %%lenient-parse isn't really a set of number formatting rules; + // it's a set of collation rules. Lenient-parse mode uses a Collator + // object to compare fragments of the text being parsed to the text + // in the rules, allowing more leeway in the matching text. This set + // of rules tells the formatter to ignore commas when parsing (it + // already ignores spaces, which is why we refer to the space; it also + // ignores hyphens, making "twenty one" and "twenty-one" parse + // identically) + "%%lenient-parse:\n" + // "& ' ' , ',' ;\n" + "&\u0000 << ' ' << ',' << '-'; \n" + } + + + DurationRules { + // main rule set for formatting with words + "%with-words:\n" + // take care of singular and plural forms of "second" + "0 sekondi; 1 sekonda; =0= sekondi;\n" + // use %%min to format values greater than 60 seconds + "60/60: <%%min<[, >>];\n" + // use %%hr to format values greater than 3,600 seconds + // (the ">>>" below causes us to see the number of minutes + // when when there are zero minutes) + "3600/60: <%%hr<[, >>>];\n" + // this rule set takes care of the singular and plural forms + // of "minute" + "%%min:\n" + "0 minuti; 1 minuta; =0= minuti;\n" + // this rule set takes care of the singular and plural forms + // of "hour" + "%%hr:\n" + "0 siegħat; 1 siegħa; =0= siegħat;\n" + + // main rule set for formatting in numerals + "%in-numerals:\n" + // values below 60 seconds are shown with "sec." + "=0= sek.;\n" + // higher values are shown with colons: %%min-sec is used for + // values below 3,600 seconds... + "60: =%%min-sec=;\n" + // ...and %%hr-min-sec is used for values of 3,600 seconds + // and above + "3600: =%%hr-min-sec=;\n" + // this rule causes values of less than 10 minutes to show without + // a leading zero + "%%min-sec:\n" + "0: :=00=;\n" + "60/60: <0<>>;\n" + // this rule set is used for values of 3,600 or more. Minutes are always + // shown, and always shown with two digits + "%%hr-min-sec:\n" + "0: :=00=;\n" + "60/60: <00<>>;\n" + "3600/60: <#,##0<:>>>;\n" + // the lenient-parse rules allow several different characters to be used + // as delimiters between hours, minutes, and seconds + "%%lenient-parse:\n" + "& ':' = '.' = ' ' = '-';\n" + } +} diff --git a/icuSources/data/rbnf/nl.txt b/icuSources/data/rbnf/nl.txt new file mode 100644 index 00000000..3f887f43 --- /dev/null +++ b/icuSources/data/rbnf/nl.txt @@ -0,0 +1,37 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// + +nl { + //------------------------------------------------------------ + // Rule Based Number Format Support + //------------------------------------------------------------ +// * Spellout rules for Dutch + // can someone supply me with information on negatives and decimals? + SpelloutRules { + "-x: min >>;\n" + "x.x: << komma >>;\n" + "nul; een; twee; drie; vier; vijf; zes; zeven; acht; negen;\n" + "tien; elf; twaalf; dertien; veertien; vijftien; zestien;\n" + "zeventien; achtien; negentien;\n" + "20: [>> en ]twintig;\n" + "30: [>> en ]dertig;\n" + "40: [>> en ]veertig;\n" + "50: [>> en ]vijftig;\n" + "60: [>> en ]zestig;\n" + "70: [>> en ]zeventig;\n" + "80: [>> en ]tachtig;\n" + "90: [>> en ]negentig;\n" + "100: << honderd[ >>];\n" + "1000: << duizend[ >>];\n" + "1,000,000: << miljoen[ >>];\n" + "1,000,000,000: << biljoen[ >>];\n" + "1,000,000,000,000: << triljoen[ >>];\n" + "1,000,000,000,000,000: =#,##0=" + } + +} diff --git a/icuSources/data/rbnf/pl.txt b/icuSources/data/rbnf/pl.txt new file mode 100644 index 00000000..af8c755e --- /dev/null +++ b/icuSources/data/rbnf/pl.txt @@ -0,0 +1,44 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// + +pl { + SpelloutRules { + "-x: minus >>;\n" + "zero; jeden; dwa; trzy; cztery; pi\u0119\u0107;\n" + "sze\u015B\u0107; siedem; osiem; dziewi\u0119\u0107; dziesi\u0119\u0107;\n" + "jedena\u015Bcie; dwana\u015Bcie; trzyna\u015Bcie; czterna\u015Bcie; pi\u0119tna\u015Bcie;\n" + "szesna\u015Bcie; siedemna\u015Bcie; osiemna\u015Bcie; dziewi\u0119tna\u015Bcie;\n" + "20: dwadzie\u015Bcia[ >>];\n" + "30: trzydzie\u015Bci[ >>];\n" + "40: czterdzie\u015Bci[ >>];\n" + "50: pi\u0119\u0107dziesi\u0105t[ >>];\n" + "60: sze\u015B\u0107dziesi\u0105t[ >>];\n" + "70: siedemdziesi\u0105t[ >>];\n" + "80: osiemdziesi\u0105t[ >>];\n" + "90: dziewi\u0119\u0107dziesi\u0105t[ >>];\n" + "100: sto[ >>];\n" + "200: dwie\u015Bcie[ >>];\n" + "300: trzysta[ >>];\n" + "400: czterysta[ >>];\n" + "500: pi\u0119\u0107set[ >>];\n" + "600: sze\u015B\u0107set[ >>];\n" + "700: siedemset[ >>];\n" + "800: osiemset[ >>];\n" + "900: dziewi\u0119\u0107set[ >>];\n" + "1000: tysi\u0105c[ >>];\n" + "2000: << tysi\u0105cy[ >>];\n" + "1,000,000: milion[ >>];\n" + "2,000,000: << miliony[ >>];\n" + "1,000,000,000: bilion[ >>];\n" + "2,000,000,000: << biliony[ >>];\n" + "1,000,000,000,000: trylion[ >>];\n" + "2,000,000,000,000: << tryliony[ >>];\n" + "1,000,000,000,000,000: =#,##0=;" + } + +} diff --git a/icuSources/data/rbnf/pt.txt b/icuSources/data/rbnf/pt.txt new file mode 100644 index 00000000..cd464a14 --- /dev/null +++ b/icuSources/data/rbnf/pt.txt @@ -0,0 +1,43 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// + +pt { + SpelloutRules { + "-x: menos >>;\n" + "x.x: << ponto >>;\n" + "zero; um; dois; tr\u00EAs; qtro; cinco; seis; sete; oito; nove;\n" + "dez; onze; doze; treze; catorze; quinze; dezasseis;" + " dezassete; dezoito; dezanove;\n" + "vinte; vinte e um; vinte e dois; vinte e tr\u00EAs; vete e quatro;" + " vinte cinco; vinte seis; vinte sete; vinte e oito;" + " vinte e nove;\n" + "30: trinta[ e >>];\n" + "40: cuarenta[ e >>];\n" + "50: cincuenta[ e >>];\n" + "60: sessenta[ e >>];\n" + "70: setenta[ e >>];\n" + "80: oitenta[ e >>];\n" + "90: noventa[ e >>];\n" + "100: cem;\n" + "200: doscentos[ >>];\n" + "300: tr\u00E8sentos[ >>];\n" + "400: cuatrocentos[ >>];\n" + "500: quinientos[ >>];\n" + "600: seiscentos[ >>];\n" + "700: setecentos[ >>];\n" + "800: oitocentos[ >>];\n" + "900: novecentos[ >>];\n" + "1000: mil[ >>];\n" + "2000: << mil[ >>];\n" + "1,000,000: um milh\u00E3o[ >>];\n" + "2,000,000: << milh\u00F5es[ >>];\n" + "1,000,000,000: um bilh\u00E3o[>>];\n" + "2,000,000,000: << bilh\u00F5es[>>];\n" + "1,000,000,000,000: =#,##0=;" + } +} diff --git a/icuSources/data/rbnf/rbnffiles.mk b/icuSources/data/rbnf/rbnffiles.mk new file mode 100644 index 00000000..61a44e0c --- /dev/null +++ b/icuSources/data/rbnf/rbnffiles.mk @@ -0,0 +1,55 @@ +# * Copyright (C) 1997-2004, International Business Machines +# * Corporation and others. All Rights Reserved. +# A list of txt's to build +# Note: +# +# If you are thinking of modifying this file, READ THIS. +# +# Instead of changing this file [unless you want to check it back in], +# you should consider creating a 'reslocal.mk' file in this same directory. +# Then, you can have your local changes remain even if you upgrade or +# reconfigure ICU. +# +# Example 'rbnflocal.mk' files: +# +# * To add an additional locale to the list: +# _____________________________________________________ +# | RBNF_SOURCE_LOCAL = myLocale.txt ... +# +# * To REPLACE the default list and only build with a few +# locale: +# _____________________________________________________ +# | RBNF_SOURCE = ar.txt ar_AE.txt en.txt de.txt zh.txt +# +# + + +# This is the list of locales that are built, but not considered installed in ICU. +# These are usually aliased locales or the root locale. +RBNF_ALIAS_SOURCE = + + +# Please try to keep this list in alphabetical order +RBNF_SOURCE = \ +da.txt \ +de.txt \ +en.txt en_GB.txt\ +eo.txt \ +es.txt \ +fa.txt fa_AF.txt \ +fr.txt fr_BE.txt fr_CH.txt \ +ga.txt \ +he.txt \ +it.txt \ +ja.txt \ +mt.txt \ +nl.txt \ +pl.txt \ +pt.txt \ +ru.txt \ +sv.txt \ +th.txt \ +uk.txt + +#These are not in use yet +# el.txt \ diff --git a/icuSources/data/rbnf/root.txt b/icuSources/data/rbnf/root.txt new file mode 100644 index 00000000..fc99d237 --- /dev/null +++ b/icuSources/data/rbnf/root.txt @@ -0,0 +1,27 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// + +root { + //------------------------------------------------------------ + // Rule Based Number Format Support + //------------------------------------------------------------ + + /* + * Default used to be English (US) rules, but now default just formats + * like DecimalFormat. The former default rules are now the _en rules. + */ + SpelloutRules { + "=#,##0.######=;\n" + } + OrdinalRules { + "=#,##0=;\n" + } + DurationRules { + "=#,##0=;\n" + } +} diff --git a/icuSources/data/rbnf/ru.txt b/icuSources/data/rbnf/ru.txt new file mode 100644 index 00000000..fd4d2241 --- /dev/null +++ b/icuSources/data/rbnf/ru.txt @@ -0,0 +1,51 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// + +ru { + //------------------------------------------------------------ + // Rule Based Number Format Support + //------------------------------------------------------------ + +// * Spellout rules for Russian. + + // TODO: Can someone supply me with information on decimals? + // How about words for billions and trillions? + + SpelloutRules { + "-x: \u043C\u0438\u043D\u0443\u0441 >>;\n" + "\u043d\u043e\u043b\u044c; \u043e\u0434\u0438\u043d; \u0434\u0432\u0430; \u0442\u0440\u0438; " + "\u0447\u0435\u0442\u044b\u0440\u0435; \u043f\u044f\u0442\u044C; \u0448\u0435\u0441\u0442\u044C; " + "\u0441\u0435\u043c\u044c; \u0432\u043e\u0441\u0435\u043c\u044c; \u0434\u0435\u0432\u044f\u0442\u044C;\n" + "10: \u0434\u0435\u0441\u044f\u0442\u044c; " + "\u043e\u0434\u0438\u043d\u043d\u0430\u0434\u0446\u0430\u0442\u044c;\n" + "\u0434\u0432\u0435\u043d\u043d\u0430\u0434\u0446\u0430\u0442\u044c; " + "\u0442\u0440\u0438\u043d\u0430\u0434\u0446\u0430\u0442\u044c; " + "\u0447\u0435\u0442\u044b\u0440\u043d\u0430\u0434\u0446\u0430\u0442\u044c;\n" + "15: \u043f\u044f\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u044c; " + "\u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u044c; " + "\u0441\u0435\u043c\u043d\u0430\u0434\u0446\u0430\u0442\u044c; " + "\u0432\u043e\u0441\u0435\u043c\u043d\u0430\u0434\u0446\u0430\u0442\u044c; " + "\u0434\u0435\u0432\u044f\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u044c;\n" + "20: \u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044c[ >>];\n" + "30: \u0442\u0440\u0438\u0434\u0446\u0430\u0442\u044c[ >>];\n" + "40: \u0441\u043e\u0440\u043e\u043a[ >>];\n" + "50: \u043f\u044f\u0442\u044c\u0434\u0435\u0441\u044f\u0442[ >>];\n" + "60: \u0448\u0435\u0441\u0442\u044c\u0434\u0435\u0441\u044f\u0442[ >>];\n" + "70: \u0441\u0435\u043c\u044c\u0434\u0435\u0441\u044f\u0442[ >>];\n" + "80: \u0432\u043e\u0441\u0435\u043c\u044c\u0434\u0435\u0441\u044f\u0442[ >>];\n" + "90: \u0434\u0435\u0432\u044f\u043d\u043e\u0441\u0442\u043e[ >>];\n" + "100: \u0441\u0442\u043e[ >>];\n" + "200: << \u0441\u0442\u043e[ >>];\n" + "1000: \u0442\u044b\u0441\u044f\u0447\u0430[ >>];\n" + "2000: << \u0442\u044b\u0441\u044f\u0447\u0430[ >>];\n" + "1,000,000: \u043c\u0438\u043b\u043b\u0438\u043e\u043d[ >>];\n" + "2,000,000: << \u043c\u0438\u043b\u043b\u0438\u043e\u043d[ >>];\n" + "1,000,000,000: =#,##0=;" + } + +} diff --git a/icuSources/data/rbnf/sv.txt b/icuSources/data/rbnf/sv.txt new file mode 100644 index 00000000..2a16566c --- /dev/null +++ b/icuSources/data/rbnf/sv.txt @@ -0,0 +1,95 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// + +sv { + //------------------------------------------------------------ + // Rule Based Number Format Support + //------------------------------------------------------------ + + // Spellout rules for Swedish. + // Thanks to Kent Karlsson for cleaning up these rules. + // (rapport inskickad till ICU 2001-11-03; ny version inskickad till Doug Felt 2001-11-07) + + SpelloutRules { + "%year:\n" + "=%neutrum=;\n" + "1000>: <%neutrum>];\n" + "10,000: =%neutrum=;\n" + // the same as default except we change the one's digit, wish there were a better way + "%neutrum:\n" + "-x: minus >>;\n" + "x.x: << komma >>;\n" + "noll; ett; tv\u00e5; tre; fyra; fem; sex; sju; \u00e5tta; nio;\n" + "tio; elva; tolv; tretton; fjorton; femton; sexton; sjutton; arton; nitton;\n" + "20: tjugo[>>];\n" + "30: trettio[>>];\n" + "40: fyrtio[>>];\n" + "50: femtio[>>];\n" + "60: sextio[>>];\n" + "70: sjuttio[>>];\n" + "80: \u00e5ttio[>>];\n" + "90: nittio[>>];\n" + "100: <>];\n" + "1000: ettusen[ >>];\n" + "2000: <%default<\u00adtusen[ >>];\n" + "1,000,000: en miljon[ >>];\n" + "2,000,000: <%default< miljoner[ >>];\n" + "1,000,000,000: en miljard[ >>];\n" + "2,000,000,000: <%default< miljarder[ >>];\n" + "1,000,000,000,000: en biljon[ >>];\n" + "2,000,000,000,000: <%default< biljoner[ >>];\n" + "1,000,000,000,000,000: en triljon[ >>];\n" + "2,000,000,000,000,000: <%default< triljoner[ >>];\n" + "1,000,000,000,000,000,000: =#,##0=;\n" + "%default:\n" + " -x: minus >>;\n" + "x.x: << komma >>;\n" + "noll; en; tv\u00e5; tre; fyra; fem; sex; sju; \u00e5tta; nio;\n" + "tio; elva; tolv; tretton; fjorton; femton; sexton; sjutton; arton; nitton;\n" + "20: tjugo[>>];\n" + "30: trettio[>>];\n" + "40: fyrtio[>>];\n" + "50: femtio[>>];\n" + "60: sextio[>>];\n" + "70: sjuttio[>>];\n" + "80: \u00e5ttio[>>];\n" + "90: nittio[>>];\n" + "100: etthundra[\u00ad>>];\n" + "200: <>];\n" + "1000: ettusen[ >>];\n" + "2000: <<\u00adtusen[ >>];\n" + "1,000,000: en miljon[ >>];\n" + "2,000,000: << miljoner[ >>];\n" + "1,000,000,000: en miljard[ >>];\n" + "2,000,000,000: << miljarder[ >>];\n" + "1,000,000,000,000: en biljon[ >>];\n" + "2,000,000,000,000: << biljoner[ >>];\n" + "1,000,000,000,000,000: en triljon[ >>];\n" + "2,000,000,000,000,000: << triljoner[ >>];\n" + "1,000,000,000,000,000,000: =#,##0=;\n" +/* + * Current (java) implementation can't handle these magnitudes + "1,000,000,000,000,000,000: en triljard[ >>];\n" + "2,000,000,000,000,000,000: << triljarder[ >>];\n" + * Current (c++) implmenatation can't handle these magnitudes + "1,000,000,000,000,000,000,000: en kvartiljon[ >>];\n" + "2,000,000,000,000,000,000,000: << kvartiljoner[ >>];\n" + "1,000,000,000,000,000,000,000,000: en kvartiljard[ >>];\n" + "2,000,000,000,000,000,000,000,000: << kvartiljarder[ >>];\n" + "1,000,000,000,000,000,000,000,000,000: en kvintiljon[ >>];\n" + "2,000,000,000,000,000,000,000,000,000: << kvintiljoner[ >>];\n" + "1,000,000,000,000,000,000,000,000,000,000: en kvintiljard[ >>];\n" + "2,000,000,000,000,000,000,000,000,000,000: << kvintiljarder[ >>];\n" + "1,000,000,000,000,000,000,000,000,000,000,000: en sextiljon[ >>];\n" + "2,000,000,000,000,000,000,000,000,000,000,000: << sextiljoner[ >>];\n" + "1,000,000,000,000,000,000,000,000,000,000,000,000: en sextiljard[ >>];\n" + "2,000,000,000,000,000,000,000,000,000,000,000,000: << sextiljarder[ >>];\n" + "1,000,000,000,000,000,000,000,000,000,000,000,000,000: =#,##0=" +*/ + } +} diff --git a/icuSources/data/rbnf/th.txt b/icuSources/data/rbnf/th.txt new file mode 100644 index 00000000..fff26cc5 --- /dev/null +++ b/icuSources/data/rbnf/th.txt @@ -0,0 +1,49 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// + +th { + //------------------------------------------------------------ + // Rule Based Number Format Support + //------------------------------------------------------------ + +// Spellout rules for Thai. Data from Suwit Srivilairith, IBM Thailand + + SpelloutRules { + "%default:\n" + "-x: \u0e25\u0e1a>>;\n" + "x.x: <<\u0e08\u0e38\u0e14>>>;\n" + "\u0e28\u0e39\u0e19\u0e22\u0e4c; \u0e2b\u0e19\u0e36\u0e48\u0e07; \u0e2a\u0e2d\u0e07; \u0e2a\u0e32\u0e21;\n" + "\u0e2a\u0e35\u0e48; \u0e2b\u0e49\u0e32; \u0e2b\u0e01; \u0e40\u0e08\u0e47\u0e14; \u0e41\u0e1b\u0e14;\n" + "\u0e40\u0e01\u0e49\u0e32; \u0e2a\u0e34\u0e1a; \u0e2a\u0e34\u0e1a\u0e40\u0e2d\u0e47\u0e14;\n" + "\u0e2a\u0e34\u0e1a\u0e2a\u0e2d\u0e07; \u0e2a\u0e34\u0e1a\u0e2a\u0e32\u0e21;\n" + "\u0e2a\u0e34\u0e1a\u0e2a\u0e35\u0e48; \u0e2a\u0e34\u0e1a\u0e2b\u0e49\u0e32;\n" + "\u0e2a\u0e34\u0e1a\u0e2b\u0e01; \u0e2a\u0e34\u0e1a\u0e40\u0e08\u0e47\u0e14;\n" + "\u0e2a\u0e34\u0e1a\u0e41\u0e1b\u0e14; \u0e2a\u0e34\u0e1a\u0e40\u0e01\u0e49\u0e32;\n" + "20: \u0e22\u0e35\u0e48\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" + "30: \u0e2a\u0e32\u0e21\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" + "40: \u0e2a\u0e35\u0e48\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" + "50: \u0e2b\u0e49\u0e32\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" + "60: \u0e2b\u0e01\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" + "70: \u0e40\u0e08\u0e47\u0e14\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" + "80: \u0e41\u0e1b\u0e14\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" + "90: \u0e40\u0e01\u0e49\u0e32\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" + "100: <<\u0e23\u0e49\u0e2d\u0e22[>>];\n" + "1000: <<\u0e1e\u0e31\u0e19[>>];\n" + "10000: <<\u0e2b\u0e21\u0e37\u0e48\u0e19[>>];\n" + "100000: <<\u0e41\u0e2a\u0e19[>>];\n" + "1,000,000: <<\u0e25\u0e49\u0e32\u0e19[>>];\n" + "1,000,000,000: <<\u0e1e\u0e31\u0e19\u0e25\u0e49\u0e32\u0e19[>>];\n" + "1,000,000,000,000: <<\u0e25\u0e49\u0e32\u0e19\u0e25\u0e49\u0e32\u0e19[>>];\n" + "1,000,000,000,000,000: =#,##0=;\n" + "%%alt-ones:\n" + "\u0e28\u0e39\u0e19\u0e22\u0e4c;\n" + "\u0e40\u0e2d\u0e47\u0e14;\n" + "=%default=;\n" + } + +} diff --git a/icuSources/data/rbnf/uk.txt b/icuSources/data/rbnf/uk.txt new file mode 100644 index 00000000..43718d24 --- /dev/null +++ b/icuSources/data/rbnf/uk.txt @@ -0,0 +1,53 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// + +uk { + // TODO: Can someone supply me with information on negatives and decimals? + // How about words for billions and trillions? + + SpelloutRules { + "\u043D\u0443\u043B\u044C; \u043E\u0434\u0438\u043D; \u0434\u0432\u0430; \u0442\u0440\u0438; " + "\u0447\u043E\u0442\u0438\u0440\u0438; \u043F\u02bc\u044F\u0442\u044C; \u0448\u0456\u0441\u0442\u044C; " + "\u0441\u0456\u043C; \u0432\u0456\u0441\u0456\u043C; \u0434\u0435\u0432\u02bc\u044F\u0442\u044C;\n" + "10: \u0434\u0435\u0441\u044F\u0442\u044C; " + "\u043E\u0434\u0438\u043D\u0430\u0434\u0446\u044F\u0442\u044C;\n" + "\u0434\u0432\u0430\u043D\u0430\u0434\u0446\u044F\u0442\u044C; " + "\u0442\u0440\u0438\u043D\u0430\u0434\u0446\u044F\u0442\u044C; " + "\u0447\u043E\u0442\u0438\u0440\u043D\u0430\u0434\u0446\u044F\u0442\u044C;\n" + "15: \u043F\u02bc\u044F\u0442\u043D\u0430\u0434\u0446\u044F\u0442\u044C; " + "\u0448\u0456\u0441\u0442\u043D\u0430\u0434\u0446\u044F\u0442\u044C; " + "\u0441\u0456\u043C\u043D\u0430\u0434\u0446\u044F\u0442\u044C; " + "\u0432\u0456\u0441\u0456\u043C\u043D\u0430\u0434\u0446\u044F\u0442\u044C; " + "\u0434\u0435\u0432\u02bc\u044F\u0442\u043D\u0430\u0434\u0446\u044F\u0442\u044C;\n" + "20: \u0434\u0432\u0430\u0434\u0446\u044F\u0442\u044C[ >>];\n" + "30: \u0442\u0440\u0438\u0434\u0446\u044F\u0442\u044C[ >>];\n" + "40: \u0441\u043E\u0440\u043E\u043A[ >>];\n" + "50: \u043F\u02bc\u044F\u0442\u0434\u0435\u0441\u044F\u0442[ >>];\n" + "60: \u0448\u0456\u0441\u0442\u0434\u0435\u0441\u044F\u0442[ >>];\n" + "70: \u0441\u0456\u043C\u0434\u0435\u0441\u044F\u0442[ >>];\n" + "80: \u0432\u0456\u0441\u0456\u043C\u0434\u0435\u0441\u044F\u0442[ >>];\n" + "90: \u0434\u0435\u0432\u02bc\u044F\u043D\u043E\u0441\u0442\u043E[ >>];\n" + "100: \u0441\u0442\u043E[ >>];\n" + "200: \u0434\u0432\u0456\u0441\u0442\u0456[ >>];\n" + "300: \u0442\u0440\u0438\u0441\u0442\u0430[ >>];\n" + "400: \u0447\u043E\u0442\u0438\u0440\u0438\u0441\u0442\u0430[ >>];\n" + "500: \u043F\u02bc\u044F\u0442\u0441\u043E\u0442[ >>];\n" + "600: \u0448\u0456\u0441\u0442\u0441\u043E\u0442[ >>];\n" + "700: \u0441\u0456\u043C\u0441\u043E\u0442[ >>];\n" + "800: \u0432\u0456\u0441\u0456\u043C\u0441\u043E\u0442[ >>];\n" + "900: \u0434\u0435\u0432\u02bc\u044F\u0442\u0441\u043E\u0442[ >>];\n" + "1000: \u0442\u0438\u0441\u044F\u0447\u0430[ >>];\n" + "2000: << \u0442\u0438\u0441\u044F\u0447\u0456[ >>];\n" + "5000: << \u0442\u0438\u0441\u044F\u0447[ >>];\n" + "1,000,000: \u043C\u0456\u043B\u044C\u0439\u043E\u043D[ >>];\n" + "2,000,000: << \u043C\u0456\u043B\u044C\u0439\u043E\u043D\u0438[ >>];\n" + "5,000,000: << \u043C\u0456\u043B\u044C\u0439\u043E\u043D\u0456\u0432[ >>];\n" + "1,000,000,000: << \u043C\u0456\u043B\u044C\u044F\u0440\u0434[ >>];" + } + +} diff --git a/icuSources/data/translit/Any_Accents.txt b/icuSources/data/translit/Any_Accents.txt new file mode 100644 index 00000000..fe26c690 --- /dev/null +++ b/icuSources/data/translit/Any_Accents.txt @@ -0,0 +1,290 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +:: NFD (NFC) ; + +# to do: make reversible + +# define special conversion characters. +# varients of this could use different characters, or set one or the other to null. + +$pre = \< ; +$post = \> ; + +# Provide keyboard equivalents for common diacritics used in transliteration + +$pre \` $post <> \u0300 ; # COMBINING GRAVE ACCENT +$pre \' $post <> \u0301 ; # COMBINING ACUTE ACCENT +$pre \^ $post <> \u0302 ; # COMBINING CIRCUMFLEX ACCENT +$pre \~ $post <> \u0303 ; # COMBINING TILDE +$pre \- $post <> \u0304 ; # COMBINING MACRON +$pre \" $post <> \u0308 ; # COMBINING DIAERESIS +$pre \* $post <> \u030A ; # COMBINING RING ABOVE +$pre \, $post <> \u0327 ; # COMBINING CEDILLA +$pre '/' $post <> \u0338 ; # COMBINING LONG SOLIDUS OVERLAY +$pre \. $post <> \u0323 ; # COMBINING DOT BELOW + +# Combine common characters + +$pre AE $post <> \u00C6 ; # LATIN CAPITAL LETTER AE +$pre ae $post <> \u00E6 ; # LATIN SMALL LETTER AE +$pre D $post <> \u00D0 ; # LATIN CAPITAL LETTER ETH +$pre d $post <> \u00F0 ; # LATIN SMALL LETTER ETH +$pre O'/' $post <> \u00D8 ; # LATIN CAPITAL LETTER O WITH STROKE +$pre o'/' $post <> \u00F8 ; # LATIN SMALL LETTER O WITH STROKE +$pre TH $post <> \u00DE ; # LATIN CAPITAL LETTER THORN +$pre th $post <> \u00FE ; # LATIN SMALL LETTER THORN +$pre OE $post <> \u0152 ; # LATIN CAPITAL LIGATURE OE +$pre oe $post <> \u0153 ; # LATIN SMALL LIGATURE OE + +$pre ss $post <> \u00DF ; # LATIN SMALL LETTER SHARP S + +$pre NG $post <> \u014A ; # LATIN CAPITAL LETTER ENG +$pre ng $post <> \u014B ; # LATIN SMALL LETTER ENG + +$pre T $post <> \u0398 ; # THETA +$pre t $post <> \u03B8 ; # THETA +$pre SH $post <> \u01A9 ; # LATIN CAPITAL LETTER ESH +$pre sh $post <> \u0283 ; # LATIN SMALL LETTER ESH +$pre ZH $post <> \u01B7 ; # LATIN CAPITAL LETTER EZH +$pre zh $post <> \u0292 ; # LATIN SMALL LETTER EZH + +$pre U $post <> \u01B1 ; # LATIN CAPITAL LETTER UPSILON +$pre u $post <> \u028A ; # LATIN SMALL LETTER UPSILON +$pre A $post <> \u018F ; # LATIN CAPITAL LETTER SCHWA +$pre a $post <> \u0259 ; # LATIN SMALL LETTER SCHWA +$pre O $post <> \u0186 ; # LATIN CAPITAL LETTER OPEN O +$pre o $post <> \u0254 ; # LATIN SMALL LETTER OPEN O +$pre E $post <> \u0190 ; # LATIN CAPITAL LETTER OPEN E +$pre e $post <> \u025B ; # LATIN SMALL LETTER OPEN E + +# three that don't have uppercases + +$pre '?' $post <> \u0294 ; # LATIN LETTER GLOTTAL STOP +$pre i $post <> \u026A ; # LATIN LETTER SMALL CAPITAL I +$pre v $post <> \u028C ; # LATIN SMALL LETTER TURNED V + +# Additional Characters that may be added in the future + +# $pre XXX $post <> \u0306 ; # COMBINING BREVE +# $pre XXX $post <> \u0307 ; # COMBINING DOT ABOVE +# $pre XXX $post <> \u0309 ; # COMBINING HOOK ABOVE +# $pre XXX $post <> \u030B ; # COMBINING DOUBLE ACUTE ACCENT +# $pre XXX $post <> \u030C ; # COMBINING CARON +# $pre XXX $post <> \u030F ; # COMBINING DOUBLE GRAVE ACCENT +# $pre XXX $post <> \u0311 ; # COMBINING INVERTED BREVE +# $pre XXX $post <> \u0313 ; # COMBINING COMMA ABOVE +# $pre XXX $post <> \u0314 ; # COMBINING REVERSED COMMA ABOVE +# $pre XXX $post <> \u031B ; # COMBINING HORN +# $pre XXX $post <> \u0324 ; # COMBINING DIAERESIS BELOW +# $pre XXX $post <> \u0325 ; # COMBINING RING BELOW +# $pre XXX $post <> \u0326 ; # COMBINING COMMA BELOW +# $pre XXX $post <> \u0328 ; # COMBINING OGONEK +# $pre XXX $post <> \u032D ; # COMBINING CIRCUMFLEX ACCENT BELOW +# $pre XXX $post <> \u032E ; # COMBINING BREVE BELOW +# $pre XXX $post <> \u0330 ; # COMBINING TILDE BELOW +# $pre XXX $post <> \u0331 ; # COMBINING MACRON BELOW + +# $pre YYY $post <> \u00AA ; # FEMININE ORDINAL INDICATOR +# $pre YYY $post <> \u00BA ; # MASCULINE ORDINAL INDICATOR +# $pre YYY $post <> \u0110 ; # LATIN CAPITAL LETTER D WITH STROKE +# $pre YYY $post <> \u0111 ; # LATIN SMALL LETTER D WITH STROKE +# $pre YYY $post <> \u0126 ; # LATIN CAPITAL LETTER H WITH STROKE +# $pre YYY $post <> \u0127 ; # LATIN SMALL LETTER H WITH STROKE +# $pre YYY $post <> \u0131 ; # LATIN SMALL LETTER DOTLESS I +# $pre YYY $post <> \u0138 ; # LATIN SMALL LETTER KRA +# $pre YYY $post <> \u013F ; # LATIN CAPITAL LETTER L WITH MIDDLE DOT +# $pre YYY $post <> \u0140 ; # LATIN SMALL LETTER L WITH MIDDLE DOT +# $pre YYY $post <> \u0141 ; # LATIN CAPITAL LETTER L WITH STROKE +# $pre YYY $post <> \u0142 ; # LATIN SMALL LETTER L WITH STROKE +# $pre YYY $post <> \u0149 ; # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +# $pre YYY $post <> \u0166 ; # LATIN CAPITAL LETTER T WITH STROKE +# $pre YYY $post <> \u0167 ; # LATIN SMALL LETTER T WITH STROKE +# $pre YYY $post <> \u017F ; # LATIN SMALL LETTER LONG S +# $pre YYY $post <> \u0180 ; # LATIN SMALL LETTER B WITH STROKE +# $pre YYY $post <> \u0181 ; # LATIN CAPITAL LETTER B WITH HOOK +# $pre YYY $post <> \u0182 ; # LATIN CAPITAL LETTER B WITH TOPBAR +# $pre YYY $post <> \u0183 ; # LATIN SMALL LETTER B WITH TOPBAR +# $pre YYY $post <> \u0184 ; # LATIN CAPITAL LETTER TONE SIX +# $pre YYY $post <> \u0185 ; # LATIN SMALL LETTER TONE SIX +# $pre YYY $post <> \u0187 ; # LATIN CAPITAL LETTER C WITH HOOK +# $pre YYY $post <> \u0188 ; # LATIN SMALL LETTER C WITH HOOK +# $pre YYY $post <> \u0189 ; # LATIN CAPITAL LETTER AFRICAN D +# $pre YYY $post <> \u018A ; # LATIN CAPITAL LETTER D WITH HOOK +# $pre YYY $post <> \u018B ; # LATIN CAPITAL LETTER D WITH TOPBAR +# $pre YYY $post <> \u018C ; # LATIN SMALL LETTER D WITH TOPBAR +# $pre YYY $post <> \u018D ; # LATIN SMALL LETTER TURNED DELTA +# $pre YYY $post <> \u018E ; # LATIN CAPITAL LETTER REVERSED E +# $pre YYY $post <> \u0191 ; # LATIN CAPITAL LETTER F WITH HOOK +# $pre YYY $post <> \u0192 ; # LATIN SMALL LETTER F WITH HOOK +# $pre YYY $post <> \u0193 ; # LATIN CAPITAL LETTER G WITH HOOK +# $pre YYY $post <> \u0194 ; # LATIN CAPITAL LETTER GAMMA +# $pre YYY $post <> \u0195 ; # LATIN SMALL LETTER HV +# $pre YYY $post <> \u0196 ; # LATIN CAPITAL LETTER IOTA +# $pre YYY $post <> \u0197 ; # LATIN CAPITAL LETTER I WITH STROKE +# $pre YYY $post <> \u0198 ; # LATIN CAPITAL LETTER K WITH HOOK +# $pre YYY $post <> \u0199 ; # LATIN SMALL LETTER K WITH HOOK +# $pre YYY $post <> \u019A ; # LATIN SMALL LETTER L WITH BAR +# $pre YYY $post <> \u019B ; # LATIN SMALL LETTER LAMBDA WITH STROKE +# $pre YYY $post <> \u019C ; # LATIN CAPITAL LETTER TURNED M +# $pre YYY $post <> \u019D ; # LATIN CAPITAL LETTER N WITH LEFT HOOK +# $pre YYY $post <> \u019E ; # LATIN SMALL LETTER N WITH LONG RIGHT LEG +# $pre YYY $post <> \u019F ; # LATIN CAPITAL LETTER O WITH MIDDLE TILDE +# $pre YYY $post <> \u01A2 ; # LATIN CAPITAL LETTER OI +# $pre YYY $post <> \u01A3 ; # LATIN SMALL LETTER OI +# $pre YYY $post <> \u01A4 ; # LATIN CAPITAL LETTER P WITH HOOK +# $pre YYY $post <> \u01A5 ; # LATIN SMALL LETTER P WITH HOOK +# $pre YYY $post <> \u01A6 ; # LATIN LETTER YR +# $pre YYY $post <> \u01A7 ; # LATIN CAPITAL LETTER TONE TWO +# $pre YYY $post <> \u01A8 ; # LATIN SMALL LETTER TONE TWO +# $pre YYY $post <> \u01AA ; # LATIN LETTER REVERSED ESH LOOP +# $pre YYY $post <> \u01AB ; # LATIN SMALL LETTER T WITH PALATAL HOOK +# $pre YYY $post <> \u01AC ; # LATIN CAPITAL LETTER T WITH HOOK +# $pre YYY $post <> \u01AD ; # LATIN SMALL LETTER T WITH HOOK +# $pre YYY $post <> \u01AE ; # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK +# $pre YYY $post <> \u01B2 ; # LATIN CAPITAL LETTER V WITH HOOK +# $pre YYY $post <> \u01B3 ; # LATIN CAPITAL LETTER Y WITH HOOK +# $pre YYY $post <> \u01B4 ; # LATIN SMALL LETTER Y WITH HOOK +# $pre YYY $post <> \u01B5 ; # LATIN CAPITAL LETTER Z WITH STROKE +# $pre YYY $post <> \u01B6 ; # LATIN SMALL LETTER Z WITH STROKE +# $pre YYY $post <> \u01B8 ; # LATIN CAPITAL LETTER EZH REVERSED +# $pre YYY $post <> \u01B9 ; # LATIN SMALL LETTER EZH REVERSED +# $pre YYY $post <> \u01BA ; # LATIN SMALL LETTER EZH WITH TAIL +# $pre YYY $post <> \u01BB ; # LATIN LETTER TWO WITH STROKE +# $pre YYY $post <> \u01BC ; # LATIN CAPITAL LETTER TONE FIVE +# $pre YYY $post <> \u01BD ; # LATIN SMALL LETTER TONE FIVE +# $pre YYY $post <> \u01BE ; # LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE +# $pre YYY $post <> \u01BF ; # LATIN LETTER WYNN +# $pre YYY $post <> \u01C0 ; # LATIN LETTER DENTAL CLICK +# $pre YYY $post <> \u01C1 ; # LATIN LETTER LATERAL CLICK +# $pre YYY $post <> \u01C2 ; # LATIN LETTER ALVEOLAR CLICK +# $pre YYY $post <> \u01C3 ; # LATIN LETTER RETROFLEX CLICK +# $pre YYY $post <> \u01C4 ; # LATIN CAPITAL LETTER DZ WITH CARON +# $pre YYY $post <> \u01C5 ; # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON +# $pre YYY $post <> \u01C6 ; # LATIN SMALL LETTER DZ WITH CARON +# $pre YYY $post <> \u01C7 ; # LATIN CAPITAL LETTER LJ +# $pre YYY $post <> \u01C8 ; # LATIN CAPITAL LETTER L WITH SMALL LETTER J +# $pre YYY $post <> \u01C9 ; # LATIN SMALL LETTER LJ +# $pre YYY $post <> \u01CA ; # LATIN CAPITAL LETTER NJ +# $pre YYY $post <> \u01CB ; # LATIN CAPITAL LETTER N WITH SMALL LETTER J +# $pre YYY $post <> \u01CC ; # LATIN SMALL LETTER NJ +# $pre YYY $post <> \u01DD ; # LATIN SMALL LETTER TURNED E +# $pre YYY $post <> \u01E4 ; # LATIN CAPITAL LETTER G WITH STROKE +# $pre YYY $post <> \u01E5 ; # LATIN SMALL LETTER G WITH STROKE +# $pre YYY $post <> \u01F1 ; # LATIN CAPITAL LETTER DZ +# $pre YYY $post <> \u01F2 ; # LATIN CAPITAL LETTER D WITH SMALL LETTER Z +# $pre YYY $post <> \u01F3 ; # LATIN SMALL LETTER DZ +# $pre YYY $post <> \u01F6 ; # LATIN CAPITAL LETTER HWAIR +# $pre YYY $post <> \u01F7 ; # LATIN CAPITAL LETTER WYNN +# $pre YYY $post <> \u021C ; # LATIN CAPITAL LETTER YOGH +# $pre YYY $post <> \u021D ; # LATIN SMALL LETTER YOGH +# $pre YYY $post <> \u0222 ; # LATIN CAPITAL LETTER OU +# $pre YYY $post <> \u0223 ; # LATIN SMALL LETTER OU +# $pre YYY $post <> \u0224 ; # LATIN CAPITAL LETTER Z WITH HOOK +# $pre YYY $post <> \u0225 ; # LATIN SMALL LETTER Z WITH HOOK +# $pre YYY $post <> \u0250 ; # LATIN SMALL LETTER TURNED A +# $pre YYY $post <> \u0251 ; # LATIN SMALL LETTER ALPHA +# $pre YYY $post <> \u0252 ; # LATIN SMALL LETTER TURNED ALPHA +# $pre YYY $post <> \u0253 ; # LATIN SMALL LETTER B WITH HOOK +# $pre YYY $post <> \u0255 ; # LATIN SMALL LETTER C WITH CURL +# $pre YYY $post <> \u0256 ; # LATIN SMALL LETTER D WITH TAIL +# $pre YYY $post <> \u0257 ; # LATIN SMALL LETTER D WITH HOOK +# $pre YYY $post <> \u0258 ; # LATIN SMALL LETTER REVERSED E +# $pre YYY $post <> \u025A ; # LATIN SMALL LETTER SCHWA WITH HOOK +# $pre YYY $post <> \u025C ; # LATIN SMALL LETTER REVERSED OPEN E +# $pre YYY $post <> \u025D ; # LATIN SMALL LETTER REVERSED OPEN E WITH HOOK +# $pre YYY $post <> \u025E ; # LATIN SMALL LETTER CLOSED REVERSED OPEN E +# $pre YYY $post <> \u025F ; # LATIN SMALL LETTER DOTLESS J WITH STROKE +# $pre YYY $post <> \u0260 ; # LATIN SMALL LETTER G WITH HOOK +# $pre YYY $post <> \u0261 ; # LATIN SMALL LETTER SCRIPT G +# $pre YYY $post <> \u0262 ; # LATIN LETTER SMALL CAPITAL G +# $pre YYY $post <> \u0263 ; # LATIN SMALL LETTER GAMMA +# $pre YYY $post <> \u0264 ; # LATIN SMALL LETTER RAMS HORN +# $pre YYY $post <> \u0265 ; # LATIN SMALL LETTER TURNED H +# $pre YYY $post <> \u0266 ; # LATIN SMALL LETTER H WITH HOOK +# $pre YYY $post <> \u0267 ; # LATIN SMALL LETTER HENG WITH HOOK +# $pre YYY $post <> \u0268 ; # LATIN SMALL LETTER I WITH STROKE +# $pre YYY $post <> \u0269 ; # LATIN SMALL LETTER IOTA +# $pre YYY $post <> \u026B ; # LATIN SMALL LETTER L WITH MIDDLE TILDE +# $pre YYY $post <> \u026C ; # LATIN SMALL LETTER L WITH BELT +# $pre YYY $post <> \u026D ; # LATIN SMALL LETTER L WITH RETROFLEX HOOK +# $pre YYY $post <> \u026E ; # LATIN SMALL LETTER LEZH +# $pre YYY $post <> \u026F ; # LATIN SMALL LETTER TURNED M +# $pre YYY $post <> \u0270 ; # LATIN SMALL LETTER TURNED M WITH LONG LEG +# $pre YYY $post <> \u0271 ; # LATIN SMALL LETTER M WITH HOOK +# $pre YYY $post <> \u0272 ; # LATIN SMALL LETTER N WITH LEFT HOOK +# $pre YYY $post <> \u0273 ; # LATIN SMALL LETTER N WITH RETROFLEX HOOK +# $pre YYY $post <> \u0274 ; # LATIN LETTER SMALL CAPITAL N +# $pre YYY $post <> \u0275 ; # LATIN SMALL LETTER BARRED O +# $pre YYY $post <> \u0276 ; # LATIN LETTER SMALL CAPITAL OE +# $pre YYY $post <> \u0277 ; # LATIN SMALL LETTER CLOSED OMEGA +# $pre YYY $post <> \u0278 ; # LATIN SMALL LETTER PHI +# $pre YYY $post <> \u0279 ; # LATIN SMALL LETTER TURNED R +# $pre YYY $post <> \u027A ; # LATIN SMALL LETTER TURNED R WITH LONG LEG +# $pre YYY $post <> \u027B ; # LATIN SMALL LETTER TURNED R WITH HOOK +# $pre YYY $post <> \u027C ; # LATIN SMALL LETTER R WITH LONG LEG +# $pre YYY $post <> \u027D ; # LATIN SMALL LETTER R WITH TAIL +# $pre YYY $post <> \u027E ; # LATIN SMALL LETTER R WITH FISHHOOK +# $pre YYY $post <> \u027F ; # LATIN SMALL LETTER REVERSED R WITH FISHHOOK +# $pre YYY $post <> \u0280 ; # LATIN LETTER SMALL CAPITAL R +# $pre YYY $post <> \u0281 ; # LATIN LETTER SMALL CAPITAL INVERTED R +# $pre YYY $post <> \u0282 ; # LATIN SMALL LETTER S WITH HOOK +# $pre YYY $post <> \u0284 ; # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK +# $pre YYY $post <> \u0285 ; # LATIN SMALL LETTER SQUAT REVERSED ESH +# $pre YYY $post <> \u0286 ; # LATIN SMALL LETTER ESH WITH CURL +# $pre YYY $post <> \u0287 ; # LATIN SMALL LETTER TURNED T +# $pre YYY $post <> \u0288 ; # LATIN SMALL LETTER T WITH RETROFLEX HOOK +# $pre YYY $post <> \u0289 ; # LATIN SMALL LETTER U BAR +# $pre YYY $post <> \u028B ; # LATIN SMALL LETTER V WITH HOOK +# $pre YYY $post <> \u028D ; # LATIN SMALL LETTER TURNED W +# $pre YYY $post <> \u028E ; # LATIN SMALL LETTER TURNED Y +# $pre YYY $post <> \u028F ; # LATIN LETTER SMALL CAPITAL Y +# $pre YYY $post <> \u0290 ; # LATIN SMALL LETTER Z WITH RETROFLEX HOOK +# $pre YYY $post <> \u0291 ; # LATIN SMALL LETTER Z WITH CURL +# $pre YYY $post <> \u0293 ; # LATIN SMALL LETTER EZH WITH CURL +# $pre YYY $post <> \u0294 ; # LATIN LETTER GLOTTAL STOP +# $pre YYY $post <> \u0295 ; # LATIN LETTER PHARYNGEAL VOICED FRICATIVE +# $pre YYY $post <> \u0296 ; # LATIN LETTER INVERTED GLOTTAL STOP +# $pre YYY $post <> \u0297 ; # LATIN LETTER STRETCHED C +# $pre YYY $post <> \u0298 ; # LATIN LETTER BILABIAL CLICK +# $pre YYY $post <> \u0299 ; # LATIN LETTER SMALL CAPITAL B +# $pre YYY $post <> \u029A ; # LATIN SMALL LETTER CLOSED OPEN E +# $pre YYY $post <> \u029B ; # LATIN LETTER SMALL CAPITAL G WITH HOOK +# $pre YYY $post <> \u029C ; # LATIN LETTER SMALL CAPITAL H +# $pre YYY $post <> \u029D ; # LATIN SMALL LETTER J WITH CROSSED-TAIL +# $pre YYY $post <> \u029E ; # LATIN SMALL LETTER TURNED K +# $pre YYY $post <> \u029F ; # LATIN LETTER SMALL CAPITAL L +# $pre YYY $post <> \u02A0 ; # LATIN SMALL LETTER Q WITH HOOK +# $pre YYY $post <> \u02A1 ; # LATIN LETTER GLOTTAL STOP WITH STROKE +# $pre YYY $post <> \u02A2 ; # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE +# $pre YYY $post <> \u02A3 ; # LATIN SMALL LETTER DZ DIGRAPH +# $pre YYY $post <> \u02A4 ; # LATIN SMALL LETTER DEZH DIGRAPH +# $pre YYY $post <> \u02A5 ; # LATIN SMALL LETTER DZ DIGRAPH WITH CURL +# $pre YYY $post <> \u02A6 ; # LATIN SMALL LETTER TS DIGRAPH +# $pre YYY $post <> \u02A7 ; # LATIN SMALL LETTER TESH DIGRAPH +# $pre YYY $post <> \u02A8 ; # LATIN SMALL LETTER TC DIGRAPH WITH CURL +# $pre YYY $post <> \u02A9 ; # LATIN SMALL LETTER FENG DIGRAPH +# $pre YYY $post <> \u02AA ; # LATIN SMALL LETTER LS DIGRAPH +# $pre YYY $post <> \u02AB ; # LATIN SMALL LETTER LZ DIGRAPH +# $pre YYY $post <> \u02AC ; # LATIN LETTER BILABIAL PERCUSSIVE +# $pre YYY $post <> \u02AD ; # LATIN LETTER BIDENTAL PERCUSSIVE +# $pre YYY $post <> \u02B0 ; # MODIFIER LETTER SMALL H +# $pre YYY $post <> \u02B1 ; # MODIFIER LETTER SMALL H WITH HOOK +# $pre YYY $post <> \u02B2 ; # MODIFIER LETTER SMALL J +# $pre YYY $post <> \u02B3 ; # MODIFIER LETTER SMALL R +# $pre YYY $post <> \u02B4 ; # MODIFIER LETTER SMALL TURNED R +# $pre YYY $post <> \u02B5 ; # MODIFIER LETTER SMALL TURNED R WITH HOOK +# $pre YYY $post <> \u02B6 ; # MODIFIER LETTER SMALL CAPITAL INVERTED R +# $pre YYY $post <> \u02B7 ; # MODIFIER LETTER SMALL W +# $pre YYY $post <> \u02B8 ; # MODIFIER LETTER SMALL Y +# $pre YYY $post <> \u02E0 ; # MODIFIER LETTER SMALL GAMMA +# $pre YYY $post <> \u02E1 ; # MODIFIER LETTER SMALL L +# $pre YYY $post <> \u02E2 ; # MODIFIER LETTER SMALL S +# $pre YYY $post <> \u02E3 ; # MODIFIER LETTER SMALL X +# $pre YYY $post <> \u02E4 ; # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +# $pre YYY $post <> \u1E9A ; # LATIN SMALL LETTER A WITH RIGHT HALF RING +# $pre YYY $post <> \u207F ; # SUPERSCRIPT LATIN SMALL LETTER N + +:: NFC (NFD) ; \ No newline at end of file diff --git a/icuSources/data/translit/Any_Publishing.txt b/icuSources/data/translit/Any_Publishing.txt new file mode 100644 index 00000000..5e3c36b2 --- /dev/null +++ b/icuSources/data/translit/Any_Publishing.txt @@ -0,0 +1,34 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# Test case +# "The" "(quick)" ('brown') `fox' ` jumped -- "over?" + +# Variables + +$single = \' ; +$space = ' ' ; +$double = \" ; +$back = \` ; +$tab = '\u0008' ; +$makeRight = [[:Z:][:Ps:][:Pi:]$] ; + +# fix UNIX quotes + +$back $back > “ ; +$back > ‘ ; + +# fix typewriter quotes, by context + +$makeRight {$double} <> “ ; +$double <> ” ; + +$makeRight {$single} <> ‘ ; +$single <> ’; + +# fix multiple spaces and hyphens + +$space {$space} > ; +'--' <> — ; diff --git a/icuSources/data/translit/Arabic_Latin.txt b/icuSources/data/translit/Arabic_Latin.txt new file mode 100644 index 00000000..3b8cdcf0 --- /dev/null +++ b/icuSources/data/translit/Arabic_Latin.txt @@ -0,0 +1,146 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# Generally follows UNGEGN +# Occasionally deviates in the direction of ISO 233 +# a) where required for disambiguation. +# b) with underdot instead of cedilla for letter like SAD, since +# those are explicitly in Unicode for transliteration. +# c) with extra non-Arabic-language letters, like PEH + +# Does *not* do assimilation of "al", nor hyphenation. +# While it could be done, we need to determine whether a prefix "al" could +# occur other than as the definite article (since no space is used). + +:: [[:Arabic:] [‎ⁿ\u060C\u061B\u061F\u0640\u064B-\u0655\u0660-\u066C\u06F0-\u06F9\uFDFC]] ; +:: NFKD (NFC); +$disambig = ̱ ; +$disambig2 = ̰ ; +$under = ̣ ; + +$notAbove = [[:^ccc=0:]&[:^ccc=230:]]; + +# non-letters + + ٫ <> '.' $disambig ; # ARABIC DECIMAL SEPARATOR + ٬ <> ',' $disambig ; # ARABIC THOUSANDS SEPARATOR +# ٭ <> ; # ARABIC FIVE POINTED STAR // no need to transliterate + +، <> ',' ; # ARABIC COMMA + ؛ <> ';' ; # ARABIC SEMICOLON + ؟ <> '?' ; # ARABIC QUESTION MARK + ٪ <> '%' ; # ARABIC PERCENT SIGN + + ۰ <> 0 $disambig ; # EXTENDED ARABIC-INDIC DIGIT ZERO + ۱ <> 1 $disambig ; # EXTENDED ARABIC-INDIC DIGIT ONE + ۲ <> 2 $disambig ; # EXTENDED ARABIC-INDIC DIGIT TWO + ۳ <> 3 $disambig ; # EXTENDED ARABIC-INDIC DIGIT THREE + ۴ <> 4 $disambig ; # EXTENDED ARABIC-INDIC DIGIT FOUR + ۵ <> 5 $disambig ; # EXTENDED ARABIC-INDIC DIGIT FIVE + ۶ <> 6 $disambig ; # EXTENDED ARABIC-INDIC DIGIT SIX + ۷ <> 7 $disambig ; # EXTENDED ARABIC-INDIC DIGIT SEVEN + ۸ <> 8 $disambig ; # EXTENDED ARABIC-INDIC DIGIT EIGHT + ۹ <> 9 $disambig ; # EXTENDED ARABIC-INDIC DIGIT NINE + + ٠ <> 0 ; # ARABIC-INDIC DIGIT ZERO + ١ <> 1 ; # ARABIC-INDIC DIGIT ONE + ٢ <> 2 ; # ARABIC-INDIC DIGIT TWO + ٣ <> 3 ; # ARABIC-INDIC DIGIT THREE + ٤ <> 4 ; # ARABIC-INDIC DIGIT FOUR + ٥ <> 5 ; # ARABIC-INDIC DIGIT FIVE + ٦ <> 6 ; # ARABIC-INDIC DIGIT SIX + ٧ <> 7 ; # ARABIC-INDIC DIGIT SEVEN + ٨ <> 8 ; # ARABIC-INDIC DIGIT EIGHT + ٩ <> 9 ; # ARABIC-INDIC DIGIT NINE + +# letters + +# long vowels + َا<> ā ; # ARABIC FATHA, ARABIC LETTER ALEF + ُو <> ū ; # ARABIC DAMMA, ARABIC LETTER WAW + ِي <> ī ; # ARABIC KASRA, ARABIC LETTER YEH + +# longer items moved here to prevent masking + ث <> t h $disambig ; # ARABIC LETTER THEH + ذ <> d h $disambig ; # ARABIC LETTER THAL + ش <> s h $disambig ; # ARABIC LETTER SHEEN + ص <> s $under ; # ARABIC LETTER SAD + ض <> d $under ; # ARABIC LETTER DAD + ط <> t $under ; # ARABIC LETTER TAH + ظ <> z $under ; # ARABIC LETTER ZAH + غ <> g h $disambig ; # ARABIC LETTER GHAIN + +# WARNING: special case +# will be canonically ordered as +# so on the return, we have to skip over (but preserve) the half-ring below (or others like it) +# ةٕ < ẗ̹ ; # LATIN SMALL LETTER T, COMBINING RIGHT HALF RING BELOW, COMBINING DIAERESIS + + ة <> t \u0308 ; # ARABIC LETTER TEH MARBUTA + ة | $1 < t ($notAbove+) \u0308 ; # ARABIC LETTER TEH MARBUTA + +# non-Arabic language + ژ <> z h $disambig ; # ARABIC LETTER JEH + ڭ <> n $disambig g ; # ARABIC LETTER NG + ۋ <> v $disambig ; # ARABIC LETTER VE + ی <> y $disambig2 ; # ARABIC LETTER FARSI YEH + +# Arabic language + + ء <> ʾ ; # ARABIC LETTER HAMZA + ا <> a $under; # ARABIC LETTER ALEF + ب <> b ; # ARABIC LETTER BEH + ت <> t ; # ARABIC LETTER TEH + ج <> j ; # ARABIC LETTER JEEM + ح <> h $under ; # ARABIC LETTER HAH + خ <> k h $disambig ; # ARABIC LETTER KHAH + د <> d ; # ARABIC LETTER DAL + ر <> r ; # ARABIC LETTER REH + ز <> z ; # ARABIC LETTER ZAIN + س <> s ; # ARABIC LETTER SEEN + ع <> ʿ ; # ARABIC LETTER AIN + ـ > ; # ARABIC TATWEEL + ف <> f ; # ARABIC LETTER FEH + ق <> q ; # ARABIC LETTER QAF + ك <> k ; # ARABIC LETTER KAF + ل <> l ; # ARABIC LETTER LAM + م <> m ; # ARABIC LETTER MEEM + ن <> n ; # ARABIC LETTER NOON + ه <> h ; # ARABIC LETTER HEH + و <> w ; # ARABIC LETTER WAW + ى <> y $disambig ; # ARABIC LETTER ALEF MAKSURA + ي <> y ; # ARABIC LETTER YEH + ً <> aⁿ ; # ARABIC FATHATAN + ٌ <> uⁿ ; # ARABIC DAMMATAN + ٍ <> iⁿ ; # ARABIC KASRATAN + َ <> a ; # ARABIC FATHA + ُ <> u ; # ARABIC DAMMA + ِ <> i ; # ARABIC KASRA + ّ <> ̃ ; # ARABIC SHADDA + ْ <> ̊ ; # ARABIC SUKUN + +# special combining marks + ٓ <> ̂ ; # ARABIC MADDAH ABOVE + ٔ <> ̉ ; # ARABIC HAMZA ABOVE + ٕ <> ̹ ; # ARABIC HAMZA BELOW + +# Some non-Arabic language (not in UNGEGN) + پ <> p ; # ARABIC LETTER PEH + چ <> c h $disambig ; # ARABIC LETTER TCHEH + ڤ <> v ; # ARABIC LETTER VEH +# ڥ <> v $disambig ; # ARABIC LETTER FEH WITH THREE DOTS BELOW +# ڢ <> f $disambig ; # ARABIC LETTER FEH WITH DOT MOVED BELOW + گ <> g ; # ARABIC LETTER GAF + +# fallbacks +| s < c } [eiy]; +| k < c ; +| i < e ; +| u < o ; +| ks < x ; +| n < ‎ⁿ; + +:: (lower) ; +::NFC (NFD); +:: ( [[:Latin:] [%,.0-9;?\u02BE-\u02BF\u0302-\u0304\u0308-\u030A\u0323\u0330-\u0331\u0339\u037E]] ); \ No newline at end of file diff --git a/icuSources/data/translit/Bengali_InterIndic.txt b/icuSources/data/translit/Bengali_InterIndic.txt new file mode 100644 index 00000000..fed1236a --- /dev/null +++ b/icuSources/data/translit/Bengali_InterIndic.txt @@ -0,0 +1,103 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# Bengali-InterIndic + +\u09C7\u09BE>\uE04B; # VOWEL SIGN O +\u09C7\u09D7>\uE04C; # VOWEL SIGN AU +\u0981>\uE001; # SIGN CANDRABINDU +\u0982>\uE002; # SIGN ANUSVARA +\u0983>\uE003; # SIGN VISARGA +\u0985>\uE005; # LETTER A +\u0986>\uE006; # LETTER AA +\u0987>\uE007; # LETTER I +\u0988>\uE008; # LETTER II +\u0989>\uE009; # LETTER U +\u098A>\uE00A; # LETTER UU +\u098B>\uE00B; # LETTER VOCALIC R +\u098C>\uE00C; # LETTER VOCALIC L +\u098F>\uE00F; # LETTER E +\u0990>\uE010; # LETTER AI +\u0993>\uE013; # LETTER O +\u0994>\uE014; # LETTER AU +\u0995>\uE015; # LETTER KA +\u0996>\uE016; # LETTER KHA +\u0997>\uE017; # LETTER GA +\u0998>\uE018; # LETTER GHA +\u0999>\uE019; # LETTER NGA +\u099A>\uE01A; # LETTER CA +\u099B>\uE01B; # LETTER CHA +\u099C>\uE01C; # LETTER JA +\u099D>\uE01D; # LETTER JHA +\u099E>\uE01E; # LETTER NYA +\u099F>\uE01F; # LETTER TTA +\u09A0>\uE020; # LETTER TTHA +\u09A1>\uE021; # LETTER DDA +\u09A2>\uE022; # LETTER DDHA +\u09A3>\uE023; # LETTER NNA +\u09A4>\uE024; # LETTER TA +\u09A5>\uE025; # LETTER THA +\u09A6>\uE026; # LETTER DA +\u09A7>\uE027; # LETTER DHA +\u09A8>\uE028; # LETTER NA +\u09AA>\uE02A; # LETTER PA +\u09AB>\uE02B; # LETTER PHA +\u09AC>\uE02C; # LETTER BA +\u09AD>\uE02D; # LETTER BHA +\u09AE>\uE02E; # LETTER MA +\u09AF>\uE02F; # LETTER YA +\u09B0>\uE030; # LETTER RA +\u09B2>\uE032; # LETTER LA +\u09B6>\uE036; # LETTER SHA +\u09B7>\uE037; # LETTER SSA +\u09B8>\uE038; # LETTER SA +\u09B9>\uE039; # LETTER HA +\u09BC>\uE03C; # SIGN NUKTA +\u09BD>\uE03D; # SIGN AVAGRAHA +\u09BE>\uE03E; # VOWEL SIGN AA +\u09BF>\uE03F; # VOWEL SIGN I +\u09C0>\uE040; # VOWEL SIGN II +\u09C1>\uE041; # VOWEL SIGN U +\u09C2>\uE042; # VOWEL SIGN UU +\u09C3>\uE043; # VOWEL SIGN VOCALIC R +\u09C4>\uE044; # VOWEL SIGN VOCALIC RR +\u09C7>\uE047; # VOWEL SIGN E +\u09C8>\uE048; # VOWEL SIGN AI +\u09CB>\uE04B; +\u09CC>\uE04C; +# +\u09CD>\uE04D; # SIGN VIRAMA +\u09D7>\uE057; # AU LENGTH MARK +# +\u09E0>\uE060; # LETTER VOCALIC RR +\u09E1>\uE061; # LETTER VOCALIC LL +\u09E2>\uE062; # VOWEL SIGN VOCALIC L +\u09E3>\uE063; # VOWEL SIGN VOCALIC LL +\u09E6>\uE066; # DIGIT ZERO +\u09E7>\uE067; # DIGIT ONE +\u09E8>\uE068; # DIGIT TWO +\u09E9>\uE069; # DIGIT THREE +\u09EA>\uE06A; # DIGIT FOUR +\u09EB>\uE06B; # DIGIT FIVE +\u09EC>\uE06C; # DIGIT SIX +\u09ED>\uE06D; # DIGIT SEVEN +\u09EE>\uE06E; # DIGIT EIGHT +\u09EF>\uE06F; # DIGIT NINE +\u09F0>\ue071; # Bengali-InterIndic: LETTER RA WITH MIDDLE DIAGONAL +\u09F1>\ue072; # Bengali-InterIndic: LETTER RA WITH LOWER DIAGONAL +\u09F2>\ue073; # Bengali-InterIndic: RUPEE MARK +\u09F3>\ue074; # Bengali-InterIndic: RUPEE SIGN +\u09F4>\ue075; # Bengali-InterIndic: CURRENCY NUMERATOR ONE +\u09F5>\ue076; # Bengali-InterIndic: CURRENCY NUMERATOR TWO +\u09F6>\ue077; # Bengali-InterIndic: CURRENCY NUMERATOR THREE +\u09F7>\ue078; # Bengali-InterIndic: CURRENCY NUMERATOR FOUR +\u09F8>\ue079; # Bengali-InterIndic: CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR +\u09F9>\ue07A; # Bengali-InterIndic: CURRENCY DENOMINATOR SIXTEEN +\u09FA>\ue07B; # ISSHAR + +\u0964>\ue064; # DANDA +\u0965>\ue065; # DOUBLE DANDA +# :: NFC (NFD) ; +# eof diff --git a/icuSources/data/translit/Cyrillic_Latin.txt b/icuSources/data/translit/Cyrillic_Latin.txt new file mode 100644 index 00000000..c50e9d68 --- /dev/null +++ b/icuSources/data/translit/Cyrillic_Latin.txt @@ -0,0 +1,306 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- +# TODO: add remaining characters +# Should add variants for Russian-English, Russian-German +# Those can use this as a base, and then remap cases +# like a $hat to ya or ja. + +# :: [\u0000-\u007E \u02B9 \u02BA [:Cyrillic:] [:Latin:] [:nonspacing mark:]] ; +### WARNING, \u0308 must be added to the generated filters, in both directions ### +# MINIMAL FILTER +:: [\u0308\u0102-\u0103\u0114-\u0115\u011E-\u011F\u012C-\u012D\u014E-\u014F\u016C-\u016D\u0306\u0400-\u045F\u0490-\u0495\u0498-\u0499\u04C1-\u04C2\u04D0-\u04DF\u04E2-\u04E7\u04EC-\u04F5\u04F8-\u04F9\u1E1C-\u1E1D\u1EAE-\u1EB7\u1FB0\u1FB8\u1FD0\u1FD8\u1FE0\u1FE8] ; +:: NFD (NFC) ; + +$modprime = \u02B9; +$modprime2 = \u02BA; + +$grave = \u0300; +$acute = \u0301; +$hat = \u0302; +$breve = \u0306 ; +$dot = \u0307 ; +$caron = \u030C ; +$comma = \u0326 ; +$under = \u0331 ; + +# move up so not masked + +я <> a $hat ; # CYRILLIC SMALL LETTER YA +Я <> A $hat ; # CYRILLIC CAPITAL LETTER YA + +ч <> c $caron ; # CYRILLIC SMALL LETTER CHE +Ч <> C $caron; # CYRILLIC CAPITAL LETTER CHE +# ҷ <> XXX ; # CYRILLIC SMALL LETTER CHE WITH DESCENDER +# Ҷ <> XXX ; # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER +# ӌ <> XXX ; # CYRILLIC SMALL LETTER KHAKASSIAN CHE +# Ӌ <> XXX ; # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE +# ҹ <> XXX ; # CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE +# Ҹ <> XXX ; # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE + +э <> e $acute; # CYRILLIC SMALL LETTER E +Э <> E $acute; # CYRILLIC CAPITAL LETTER E +є <> e $hat; # CYRILLIC SMALL LETTER UKRAINIAN IE +Є <> E $hat; # CYRILLIC CAPITAL LETTER UKRAINIAN IE + +ш <> s $caron ; # CYRILLIC SMALL LETTER SHA +Ш <> S $caron ; # CYRILLIC CAPITAL LETTER SHA +щ <> s $hat ; # CYRILLIC SMALL LETTER SHCHA +Щ <> S $hat; # CYRILLIC CAPITAL LETTER SHCHA + +ѕ <> z $hat ; # CYRILLIC SMALL LETTER DZE +Ѕ <> Z $hat; # CYRILLIC CAPITAL LETTER DZE +# ӡ <> XXX ; # CYRILLIC SMALL LETTER ABKHASIAN DZE +# Ӡ <> XXX ; # CYRILLIC CAPITAL LETTER ABKHASIAN DZE + +ю <> u $hat ; # CYRILLIC SMALL LETTER YU +Ю <> U $hat ; # CYRILLIC CAPITAL LETTER YU + +і <> i $acute; # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +І <> I $acute; # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +ј <> j $caron; # CYRILLIC SMALL LETTER JE +Ј <> J $caron; # CYRILLIC CAPITAL LETTER JE + +љ <> l $hat ; # CYRILLIC SMALL LETTER LJE +Љ <> L $hat ; # CYRILLIC CAPITAL LETTER LJE +њ <> n $hat ; # CYRILLIC SMALL LETTER NJE +Њ <> N $hat ; # CYRILLIC CAPITAL LETTER NJE + +ћ <> c $acute ; # CYRILLIC SMALL LETTER TSHE +Ћ <> C $acute ; # CYRILLIC CAPITAL LETTER TSHE + +џ <> d $hat ; # CYRILLIC SMALL LETTER DZHE +Џ <> D $hat ; # CYRILLIC CAPITAL LETTER DZHE + +# Normal order + +а <> a ; # CYRILLIC SMALL LETTER A +А <> A ; # CYRILLIC CAPITAL LETTER A +ә <> \u0259 ; # CYRILLIC SMALL LETTER SCHWA +Ә <> \u018F ; # CYRILLIC CAPITAL LETTER SCHWA +ӕ <> \u00E6 ; # CYRILLIC SMALL LIGATURE A IE +Ӕ <> \u00C6 ; # CYRILLIC CAPITAL LIGATURE A IE +б <> b ; # CYRILLIC SMALL LETTER BE +Б <> B ; # CYRILLIC CAPITAL LETTER BE +в <> v ; # CYRILLIC SMALL LETTER VE +В <> V ; # CYRILLIC CAPITAL LETTER VE + +ґ <> g $grave ; # CYRILLIC SMALL LETTER GHE WITH UPTURN +Ґ <> G $grave ; # CYRILLIC CAPITAL LETTER GHE WITH UPTURN +ғ <> g $dot ; # CYRILLIC SMALL LETTER GHE WITH STROKE +Ғ <> G $dot; # CYRILLIC CAPITAL LETTER GHE WITH STROKE +ҕ <> g $breve; # CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK +Ҕ <> G $breve; # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK +г <> g ; # CYRILLIC SMALL LETTER GHE +Г <> G ; # CYRILLIC CAPITAL LETTER GHE + +д <> d; # CYRILLIC SMALL LETTER DE +Д <> D; # CYRILLIC CAPITAL LETTER DE +ђ <> đ ; # CYRILLIC SMALL LETTER DJE +Ђ <> Đ ; # CYRILLIC CAPITAL LETTER DJE +ҙ <> z $comma ; # CYRILLIC SMALL LETTER ZE WITH DESCENDER +Ҙ <> Z $comma ; # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER +е <> e ; # CYRILLIC SMALL LETTER IE +Е <> E; # CYRILLIC CAPITAL LETTER IE + +ж <> z $caron; # CYRILLIC SMALL LETTER ZHE +Ж <> Z $caron; # CYRILLIC CAPITAL LETTER ZHE + +# җ <> XXX ; # CYRILLIC SMALL LETTER ZHE WITH DESCENDER +# Җ <> XXX ; # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER + +з <> z ; # CYRILLIC SMALL LETTER ZE +З <> Z; # CYRILLIC CAPITAL LETTER ZE + +й <> j ; # CYRILLIC SMALL LETTER I +Й <> J ; # CYRILLIC CAPITAL LETTER I +и <> i ; # CYRILLIC SMALL LETTER I +И <> I ; # CYRILLIC CAPITAL LETTER I + +к <> k ; # CYRILLIC SMALL LETTER KA +К <> K; # CYRILLIC CAPITAL LETTER KA + +# қ <> XXX ; # CYRILLIC SMALL LETTER KA WITH DESCENDER +# Қ <> XXX ; # CYRILLIC CAPITAL LETTER KA WITH DESCENDER +# ӄ <> XXX ; # CYRILLIC SMALL LETTER KA WITH HOOK +# Ӄ <> XXX ; # CYRILLIC CAPITAL LETTER KA WITH HOOK +# ҡ <> XXX ; # CYRILLIC SMALL LETTER BASHKIR KA +# Ҡ <> XXX ; # CYRILLIC CAPITAL LETTER BASHKIR KA +# ҟ <> XXX ; # CYRILLIC SMALL LETTER KA WITH STROKE +# Ҟ <> XXX ; # CYRILLIC CAPITAL LETTER KA WITH STROKE +# ҝ <> XXX ; # CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE +# Ҝ <> XXX ; # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE +л <> l ; # CYRILLIC SMALL LETTER EL +Л <> L; # CYRILLIC CAPITAL LETTER EL + +м <> m ; # CYRILLIC SMALL LETTER EM +М <> M ; # CYRILLIC CAPITAL LETTER EM +н <> n ; # CYRILLIC SMALL LETTER EN +Н <> N; # CYRILLIC CAPITAL LETTER EN +# ң <> XXX ; # CYRILLIC SMALL LETTER EN WITH DESCENDER +# Ң <> XXX ; # CYRILLIC CAPITAL LETTER EN WITH DESCENDER +# ӈ <> XXX ; # CYRILLIC SMALL LETTER EN WITH HOOK +# Ӈ <> XXX ; # CYRILLIC CAPITAL LETTER EN WITH HOOK +# ҥ <> XXX ; # CYRILLIC SMALL LIGATURE EN GHE +# Ҥ <> XXX ; # CYRILLIC CAPITAL LIGATURE EN GHE + +о <> o ; # CYRILLIC SMALL LETTER O +О <> O ; # CYRILLIC CAPITAL LETTER O +# ө <> XXX ; # CYRILLIC SMALL LETTER BARRED O +# Ө <> XXX ; # CYRILLIC CAPITAL LETTER BARRED O +п <> p ; # CYRILLIC SMALL LETTER PE +П <> P ; # CYRILLIC CAPITAL LETTER PE +# ҧ <> XXX ; # CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK +# Ҧ <> XXX ; # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK +# ҁ <> XXX ; # CYRILLIC SMALL LETTER KOPPA +# Ҁ <> XXX ; # CYRILLIC CAPITAL LETTER KOPPA +р <> r ; # CYRILLIC SMALL LETTER ER +Р <> R ; # CYRILLIC CAPITAL LETTER ER +# ҏ <> XXX ; # CYRILLIC SMALL LETTER ER WITH TICK +# Ҏ <> XXX ; # CYRILLIC CAPITAL LETTER ER WITH TICK +с <> s ; # CYRILLIC SMALL LETTER ES +С <> S ; # CYRILLIC CAPITAL LETTER ES +# ҫ <> XXX ; # CYRILLIC SMALL LETTER ES WITH DESCENDER +# Ҫ <> XXX ; # CYRILLIC CAPITAL LETTER ES WITH DESCENDER +т <> t ; # CYRILLIC SMALL LETTER TE +Т <> T ; # CYRILLIC CAPITAL LETTER TE +# ҭ <> XXX ; # CYRILLIC SMALL LETTER TE WITH DESCENDER +# Ҭ <> XXX ; # CYRILLIC CAPITAL LETTER TE WITH DESCENDER + +у <> u ; # CYRILLIC SMALL LETTER U +У <> U ; # CYRILLIC CAPITAL LETTER U +# ү <> XXX ; # CYRILLIC SMALL LETTER STRAIGHT U +# Ү <> XXX ; # CYRILLIC CAPITAL LETTER STRAIGHT U +# ұ <> XXX ; # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE +# Ұ <> XXX ; # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE +# ѹ <> XXX ; # CYRILLIC SMALL LETTER UK +# Ѹ <> XXX ; # CYRILLIC CAPITAL LETTER UK +ф <> f ; # CYRILLIC SMALL LETTER EF +Ф <> F ; # CYRILLIC CAPITAL LETTER EF +х <> h ; # CYRILLIC SMALL LETTER HA +Х <> H; # CYRILLIC CAPITAL LETTER HA +# ҳ <> XXX ; # CYRILLIC SMALL LETTER HA WITH DESCENDER +# Ҳ <> XXX ; # CYRILLIC CAPITAL LETTER HA WITH DESCENDER +# һ <> XXX ; # CYRILLIC SMALL LETTER SHHA +# Һ <> XXX ; # CYRILLIC CAPITAL LETTER SHHA +# ѡ <> XXX ; # CYRILLIC SMALL LETTER OMEGA +# Ѡ <> XXX ; # CYRILLIC CAPITAL LETTER OMEGA +# ѿ <> XXX ; # CYRILLIC SMALL LETTER OT +# Ѿ <> XXX ; # CYRILLIC CAPITAL LETTER OT +# ѽ <> XXX ; # CYRILLIC SMALL LETTER OMEGA WITH TITLO +# Ѽ <> XXX ; # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO +# ѻ <> XXX ; # CYRILLIC SMALL LETTER ROUND OMEGA +# Ѻ <> XXX ; # CYRILLIC CAPITAL LETTER ROUND OMEGA +ц <> c ; # CYRILLIC SMALL LETTER TSE +Ц <> C; # CYRILLIC CAPITAL LETTER TSE +# ҵ <> XXX ; # CYRILLIC SMALL LIGATURE TE TSE +# Ҵ <> XXX ; # CYRILLIC CAPITAL LIGATURE TE TSE + +# ҽ <> XXX ; # CYRILLIC SMALL LETTER ABKHASIAN CHE +# Ҽ <> XXX ; # CYRILLIC CAPITAL LETTER ABKHASIAN CHE +# ҿ <> XXX ; # CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER +# Ҿ <> XXX ; # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER + + +Ъ <> $modprime2 $under ; # CYRILLIC CAPITAL LETTER HARD SIGN +ъ <> $modprime2 ; # CYRILLIC SMALL LETTER HARD SIGN +Ь <> $modprime $under ; # CYRILLIC CAPITAL LETTER SOFT SIGN +ь <> $modprime ; # CYRILLIC SMALL LETTER SOFT SIGN + +ы <> y ; # CYRILLIC SMALL LETTER YERU +Ы <> Y ; # CYRILLIC CAPITAL LETTER YERU + +# ҍ <> XXX ; # CYRILLIC SMALL LETTER SEMISOFT SIGN +# Ҍ <> XXX ; # CYRILLIC CAPITAL LETTER SEMISOFT SIGN +# ѣ <> XXX ; # CYRILLIC SMALL LETTER YAT +# Ѣ <> XXX ; # CYRILLIC CAPITAL LETTER YAT + +# ѥ <> XXX ; # CYRILLIC SMALL LETTER IOTIFIED E +# Ѥ <> XXX ; # CYRILLIC CAPITAL LETTER IOTIFIED E +# ѧ <> XXX ; # CYRILLIC SMALL LETTER LITTLE YUS +# Ѧ <> XXX ; # CYRILLIC CAPITAL LETTER LITTLE YUS +# ѫ <> XXX ; # CYRILLIC SMALL LETTER BIG YUS +# Ѫ <> XXX ; # CYRILLIC CAPITAL LETTER BIG YUS +# ѩ <> XXX ; # CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS +# Ѩ <> XXX ; # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS +# ѭ <> XXX ; # CYRILLIC SMALL LETTER IOTIFIED BIG YUS +# Ѭ <> XXX ; # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS +# ѯ <> XXX ; # CYRILLIC SMALL LETTER KSI +# Ѯ <> XXX ; # CYRILLIC CAPITAL LETTER KSI +# ѱ <> XXX ; # CYRILLIC SMALL LETTER PSI +# Ѱ <> XXX ; # CYRILLIC CAPITAL LETTER PSI +# ѳ <> XXX ; # CYRILLIC SMALL LETTER FITA +# Ѳ <> XXX ; # CYRILLIC CAPITAL LETTER FITA +# ѵ <> XXX ; # CYRILLIC SMALL LETTER IZHITSA +# Ѵ <> XXX ; # CYRILLIC CAPITAL LETTER IZHITSA +# ҩ <> XXX ; # CYRILLIC SMALL LETTER ABKHASIAN HA +# Ҩ <> XXX ; # CYRILLIC CAPITAL LETTER ABKHASIAN HA +# Ӏ <> XXX ; # CYRILLIC LETTER PALOCHKA +### ӑ <> XXX ; # CYRILLIC SMALL LETTER A +### Ӑ <> XXX ; # CYRILLIC CAPITAL LETTER A +### ӓ <> XXX ; # CYRILLIC SMALL LETTER A +### Ӓ <> XXX ; # CYRILLIC CAPITAL LETTER A +### ӛ <> XXX ; # CYRILLIC SMALL LETTER SCHWA +### Ӛ <> XXX ; # CYRILLIC CAPITAL LETTER SCHWA +### ѓ <> XXX ; # CYRILLIC SMALL LETTER GHE +### Ѓ <> XXX ; # CYRILLIC CAPITAL LETTER GHE +### ѐ <> XXX ; # CYRILLIC SMALL LETTER IE +### Ѐ <> XXX ; # CYRILLIC CAPITAL LETTER IE +### ё <> XXX ; # CYRILLIC SMALL LETTER IE +### Ё <> XXX ; # CYRILLIC CAPITAL LETTER IE +### ӗ <> XXX ; # CYRILLIC SMALL LETTER IE +### Ӗ <> XXX ; # CYRILLIC CAPITAL LETTER IE +### ӂ <> XXX ; # CYRILLIC SMALL LETTER ZHE +### Ӂ <> XXX ; # CYRILLIC CAPITAL LETTER ZHE +### ӝ <> XXX ; # CYRILLIC SMALL LETTER ZHE +### Ӝ <> XXX ; # CYRILLIC CAPITAL LETTER ZHE +### ӟ <> XXX ; # CYRILLIC SMALL LETTER ZE +### Ӟ <> XXX ; # CYRILLIC CAPITAL LETTER ZE +### ѝ <> XXX ; # CYRILLIC SMALL LETTER I +### Ѝ <> XXX ; # CYRILLIC CAPITAL LETTER I +### ӣ <> XXX ; # CYRILLIC SMALL LETTER I +### Ӣ <> XXX ; # CYRILLIC CAPITAL LETTER I +### ӥ <> XXX ; # CYRILLIC SMALL LETTER I +### Ӥ <> XXX ; # CYRILLIC CAPITAL LETTER I +### ї <> XXX ; # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +### Ї <> XXX ; # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +### ӧ <> XXX ; # CYRILLIC SMALL LETTER O +### Ӧ <> XXX ; # CYRILLIC CAPITAL LETTER O +### ӫ <> XXX ; # CYRILLIC SMALL LETTER BARRED O +### Ӫ <> XXX ; # CYRILLIC CAPITAL LETTER BARRED O +### ќ <> XXX ; # CYRILLIC SMALL LETTER KA +### Ќ <> XXX ; # CYRILLIC CAPITAL LETTER KA +### ӯ <> XXX ; # CYRILLIC SMALL LETTER U +### Ӯ <> XXX ; # CYRILLIC CAPITAL LETTER U +### ў <> XXX ; # CYRILLIC SMALL LETTER U +### Ў <> XXX ; # CYRILLIC CAPITAL LETTER U +### ӱ <> XXX ; # CYRILLIC SMALL LETTER U +### Ӱ <> XXX ; # CYRILLIC CAPITAL LETTER U +### ӳ <> XXX ; # CYRILLIC SMALL LETTER U +### Ӳ <> XXX ; # CYRILLIC CAPITAL LETTER U +### ӵ <> XXX ; # CYRILLIC SMALL LETTER CHE +### Ӵ <> XXX ; # CYRILLIC CAPITAL LETTER CHE +### ӹ <> XXX ; # CYRILLIC SMALL LETTER YERU +### Ӹ <> XXX ; # CYRILLIC CAPITAL LETTER YERU +### ӭ <> XXX ; # CYRILLIC SMALL LETTER E +### Ӭ <> XXX ; # CYRILLIC CAPITAL LETTER E +### ѷ <> XXX ; # CYRILLIC SMALL LETTER IZHITSA +### Ѷ <> XXX ; # CYRILLIC CAPITAL LETTER IZHITSA + +# Completeness +$ignore = [[:Mark:]''] * ; +| k < q ; +| K < Q ; +| u < w ; +| U < W ; +| KS < X } $ignore [:UppercaseLetter:] ; +| KS < [:UppercaseLetter:] $ignore { X ; +| Ks < X ; +| ks < x ; + +:: NFC (NFD) ; +# note: a global filter is more efficient, but MUST include all source chars!! +# :: ([\u0000-\u007E \u02B9 \u02BA [:Cyrillic:] [:Latin:] [:nonspacing mark:]]); +# MINIMAL FILTER: Latin-Cyrillic +:: ( [\u0308A-Za-z\u00C0-\u00CF\u00D1-\u00D6\u00D9-\u00DD\u00E0-\u00EF\u00F1-\u00F6\u00F9-\u00FD\u00FF-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u018F\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E3\u01E6-\u01F0\u01F4-\u01F5\u01F8-\u021B\u021E-\u021F\u0226-\u0233\u0259\u02B9-\u02BA\u0300-\u0302\u0306-\u0307\u030C\u0326\u0331\u0340-\u0341\u0344\u0374\u0385-\u0386\u0388-\u038A\u038C\u038E-\u0390\u03AC-\u03B0\u03CC-\u03CE\u03D3\u0400\u0403\u040C-\u040E\u0419\u0439\u0450\u0453\u045C-\u045E\u04C1-\u04C2\u04D0-\u04D1\u04D6-\u04D7\u1E00-\u1E99\u1E9B\u1EA0-\u1EF9\u1F02-\u1F05\u1F0A-\u1F0D\u1F12-\u1F15\u1F1A-\u1F1D\u1F22-\u1F25\u1F2A-\u1F2D\u1F32-\u1F35\u1F3A-\u1F3D\u1F42-\u1F45\u1F4A-\u1F4D\u1F52-\u1F55\u1F5B\u1F5D\u1F62-\u1F65\u1F6A-\u1F6D\u1F70-\u1F7D\u1F82-\u1F85\u1F8A-\u1F8D\u1F92-\u1F95\u1F9A-\u1F9D\u1FA2-\u1FA5\u1FAA-\u1FAD\u1FB0\u1FB2\u1FB4\u1FB8\u1FBA-\u1FBB\u1FC2\u1FC4\u1FC8-\u1FCB\u1FCD-\u1FCE\u1FD0\u1FD2-\u1FD3\u1FD8\u1FDA-\u1FDB\u1FDD-\u1FDE\u1FE0\u1FE2-\u1FE3\u1FE8\u1FEA-\u1FEB\u1FED-\u1FEE\u1FF2\u1FF4\u1FF8-\u1FFB\u212A-\u212B] ) ; diff --git a/icuSources/data/translit/Devanagari_InterIndic.txt b/icuSources/data/translit/Devanagari_InterIndic.txt new file mode 100644 index 00000000..ebbe468e --- /dev/null +++ b/icuSources/data/translit/Devanagari_InterIndic.txt @@ -0,0 +1,117 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# Devanagari-InterIndic +# :: NFD; +#Rules for Decomposed characters + + + \u0901>\uE001; # SIGN CANDRABINDU + \u0902>\uE002; # SIGN ANUSVARA + \u0903>\uE003; # SIGN VISARGA + \u0904>\uE004; # SIGN SHORT A + \u0905>\uE005; # LETTER A + \u0906>\uE006; # LETTER AA + \u0907>\uE007; # LETTER I + \u0908>\uE008; # LETTER II + \u0909>\uE009; # LETTER U + \u090A>\uE00A; # LETTER UU + \u090B>\uE00B; # LETTER VOCALIC R + \u090C>\uE00C; # LETTER VOCALIC L + \u090D>\uE00D; # LETTER CANDRA E (For representing English sounds) + \u090E>\uE00E; # UNMAPPED LETTER SHORT E(For Southern Scripts) + \u090F>\uE00F; # LETTER E + \u0910>\uE010; # LETTER AI + \u0911>\uE011; # LETTER CANDRA O (For representing English sounds) + \u0912>\uE012; # UNMAPPED LETTER SHORT O (For Southern Scripts) + \u0913>\uE013; # LETTER O + \u0914>\uE014; # LETTER AU + \u0915>\uE015; # LETTER KA + \u0916>\uE016; # LETTER KHA + \u0917>\uE017; # LETTER GA + \u0918>\uE018; # LETTER GHA + \u0919>\uE019; # LETTER NGA + \u091A>\uE01A; # LETTER CA + \u091B>\uE01B; # LETTER CHA + \u091C>\uE01C; # LETTER JA + \u091D>\uE01D; # LETTER JHA + \u091E>\uE01E; # LETTER NYA + \u091F>\uE01F; # LETTER TTA + \u0920>\uE020; # LETTER TTHA + \u0921>\uE021; # LETTER DDA + \u0922>\uE022; # LETTER DDHA + \u0923>\uE023; # LETTER NNA + \u0924>\uE024; # LETTER TA + \u0925>\uE025; # LETTER THA + \u0926>\uE026; # LETTER DA + \u0927>\uE027; # LETTER DHA + \u0928>\uE028; # LETTER NA + \u0929>\uE029; + \u092A>\uE02A; # LETTER PA + \u092B>\uE02B; # LETTER PHA + \u092C>\uE02C; # LETTER BA + \u092D>\uE02D; # LETTER BHA + \u092E>\uE02E; # LETTER MA + \u092F>\uE02F; # LETTER YA + \u0930>\uE030; # LETTER RA + \u0931>\uE031; + \u0932>\uE032; # LETTER LA + \u0933>\uE033; # LETTER LLA + \u0934>\uE034; + + \u0935>\uE035; # LETTER VA + \u0936>\uE036; # LETTER SHA + \u0937>\uE037; # LETTER SSA + \u0938>\uE038; # LETTER SA + \u0939>\uE039; # LETTER HA + \u093C>\uE03C; # SIGN NUKTA + \u093D>\uE03D; # SIGN AVAGRAHA + \u093E>\uE03E; # VOWEL SIGN AA + \u093F>\uE03F; # VOWEL SIGN I + \u0940>\uE040; # VOWEL SIGN II + \u0941>\uE041; # VOWEL SIGN U + \u0942>\uE042; # VOWEL SIGN UU + \u0943>\uE043; # VOWEL SIGN VOCALIC R + \u0944>\uE044; # VOWEL SIGN VOCALIC RR + \u0945>\uE045; # VOWEL SIGN CANDRA E + \u0946>\uE046; # UNMAPPED VOWEL SIGN SHORT E + \u0947>\uE047; # VOWEL SIGN E + \u0948>\uE048; # VOWEL SIGN AI + \u0949>\uE049; # VOWEL SIGN CANDRA O + \u094A>\uE04A; # UNMAPPED VOWEL SIGN SHORT O + \u094B>\uE04B; # VOWEL SIGN O + \u094C>\uE04C; # VOWEL SIGN AU + \u094D>\uE04D; # SIGN VIRAMA + \u0950>\uE050; # OM + \u0951>\uE051; # UNMAPPED STRESS SIGN UDATTA + \u0952>\uE052; # UNMAPPED STRESS SIGN ANUDATTA + \u0953>\uE053; # UNMAPPED GRAVE ACCENT + \u0954>\uE054; # UNMAPPED ACUTE ACCENT + \u0958>\uE058; + \u0959>\uE059; + \u095A>\uE05a; + \u095B>\uE05b; + \u095C>\uE05c; + \u095D>\uE05d; + \u095E>\uE05e; + \u095F>\uE05f; + \u0960>\uE060; # LETTER VOCALIC RR + \u0961>\uE061; # LETTER VOCALIC LL + \u0962>\uE062; # VOWEL SIGN VOCALIC L + \u0963>\uE063; # VOWEL SIGN VOCALIC LL + \u0964>\ue064; # DANDA + \u0965>\ue065; # DOUBLE DANDA + \u0966>\uE066; # DIGIT ZERO + \u0967>\uE067; # DIGIT ONE + \u0968>\uE068; # DIGIT TWO + \u0969>\uE069; # DIGIT THREE + \u096A>\uE06A; # DIGIT FOUR + \u096B>\uE06B; # DIGIT FIVE + \u096C>\uE06C; # DIGIT SIX + \u096D>\uE06D; # DIGIT SEVEN + \u096E>\uE06E; # DIGIT EIGHT + \u096F>\uE06F; # DIGIT NINE + \u0970>\uE070; # Devanagari-InterIndic: ABBREVIATION SIGN +# :: NFC (NFD) ; diff --git a/icuSources/data/translit/Fullwidth_Halfwidth.txt b/icuSources/data/translit/Fullwidth_Halfwidth.txt new file mode 100644 index 00000000..03fdb9e6 --- /dev/null +++ b/icuSources/data/translit/Fullwidth_Halfwidth.txt @@ -0,0 +1,271 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# Fullwidth-Halfwidth + +# Mechanically generated from Unicode Character Database +# IDEOGRAPHIC SPACE then added, and +# FULLWIDTH MACRON changed to map to MACRON, not SPACE + COMBINING MACRON + +# multicharacter + +ガ<>ガ; # to KATAKANA LETTER GA +ギ<>ギ; # to KATAKANA LETTER GI +グ<>グ; # to KATAKANA LETTER GU +ゲ<>ゲ; # to KATAKANA LETTER GE +ゴ<>ゴ; # to KATAKANA LETTER GO +ザ<>ザ; # to KATAKANA LETTER ZA +ジ<>ジ; # to KATAKANA LETTER ZI +ズ<>ズ; # to KATAKANA LETTER ZU +ゼ<>ゼ; # to KATAKANA LETTER ZE +ゾ<>ゾ; # to KATAKANA LETTER ZO +ダ<>ダ; # to KATAKANA LETTER DA +ヂ<>ヂ; # to KATAKANA LETTER DI +ヅ<>ヅ; # to KATAKANA LETTER DU +デ<>デ; # to KATAKANA LETTER DE +ド<>ド; # to KATAKANA LETTER DO +バ<>バ; # to KATAKANA LETTER BA +パ<>パ; # to KATAKANA LETTER PA +ビ<>ビ; # to KATAKANA LETTER BI +ピ<>ピ; # to KATAKANA LETTER PI +ブ<>ブ; # to KATAKANA LETTER BU +プ<>プ; # to KATAKANA LETTER PU +ベ<>ベ; # to KATAKANA LETTER BE +ペ<>ペ; # to KATAKANA LETTER PE +ボ<>ボ; # to KATAKANA LETTER BO +ポ<>ポ; # to KATAKANA LETTER PO +ヴ<>ヴ; # to KATAKANA LETTER VU +ヷ<>ヷ; # to KATAKANA LETTER VA +ヺ<>ヺ; # to KATAKANA LETTER VO + +# single character + +!<>'!'; # from FULLWIDTH EXCLAMATION MARK +"<>'\"'; # from FULLWIDTH QUOTATION MARK +#<>'#'; # from FULLWIDTH NUMBER SIGN +$<>'$'; # from FULLWIDTH DOLLAR SIGN +%<>'%'; # from FULLWIDTH PERCENT SIGN +&<>'&'; # from FULLWIDTH AMPERSAND +'<>''; # from FULLWIDTH APOSTROPHE +(<>'('; # from FULLWIDTH LEFT PARENTHESIS +)<>')'; # from FULLWIDTH RIGHT PARENTHESIS +*<>'*'; # from FULLWIDTH ASTERISK ++<>'+'; # from FULLWIDTH PLUS SIGN +,<>','; # from FULLWIDTH COMMA +-<>'-'; # from FULLWIDTH HYPHEN-MINUS +.<>'.'; # from FULLWIDTH FULL STOP +/<>'/'; # from FULLWIDTH SOLIDUS +0<>'0'; # from FULLWIDTH DIGIT ZERO +1<>'1'; # from FULLWIDTH DIGIT ONE +2<>'2'; # from FULLWIDTH DIGIT TWO +3<>'3'; # from FULLWIDTH DIGIT THREE +4<>'4'; # from FULLWIDTH DIGIT FOUR +5<>'5'; # from FULLWIDTH DIGIT FIVE +6<>'6'; # from FULLWIDTH DIGIT SIX +7<>'7'; # from FULLWIDTH DIGIT SEVEN +8<>'8'; # from FULLWIDTH DIGIT EIGHT +9<>'9'; # from FULLWIDTH DIGIT NINE +:<>':'; # from FULLWIDTH COLON +;<>';'; # from FULLWIDTH SEMICOLON +<<>'<'; # from FULLWIDTH LESS-THAN SIGN +=<>'='; # from FULLWIDTH EQUALS SIGN +><>'>'; # from FULLWIDTH GREATER-THAN SIGN +?<>'?'; # from FULLWIDTH QUESTION MARK +@<>'@'; # from FULLWIDTH COMMERCIAL AT +A<>A; # from FULLWIDTH LATIN CAPITAL LETTER A +B<>B; # from FULLWIDTH LATIN CAPITAL LETTER B +C<>C; # from FULLWIDTH LATIN CAPITAL LETTER C +D<>D; # from FULLWIDTH LATIN CAPITAL LETTER D +E<>E; # from FULLWIDTH LATIN CAPITAL LETTER E +F<>F; # from FULLWIDTH LATIN CAPITAL LETTER F +G<>G; # from FULLWIDTH LATIN CAPITAL LETTER G +H<>H; # from FULLWIDTH LATIN CAPITAL LETTER H +I<>I; # from FULLWIDTH LATIN CAPITAL LETTER I +J<>J; # from FULLWIDTH LATIN CAPITAL LETTER J +K<>K; # from FULLWIDTH LATIN CAPITAL LETTER K +L<>L; # from FULLWIDTH LATIN CAPITAL LETTER L +M<>M; # from FULLWIDTH LATIN CAPITAL LETTER M +N<>N; # from FULLWIDTH LATIN CAPITAL LETTER N +O<>O; # from FULLWIDTH LATIN CAPITAL LETTER O +P<>P; # from FULLWIDTH LATIN CAPITAL LETTER P +Q<>Q; # from FULLWIDTH LATIN CAPITAL LETTER Q +R<>R; # from FULLWIDTH LATIN CAPITAL LETTER R +S<>S; # from FULLWIDTH LATIN CAPITAL LETTER S +T<>T; # from FULLWIDTH LATIN CAPITAL LETTER T +U<>U; # from FULLWIDTH LATIN CAPITAL LETTER U +V<>V; # from FULLWIDTH LATIN CAPITAL LETTER V +W<>W; # from FULLWIDTH LATIN CAPITAL LETTER W +X<>X; # from FULLWIDTH LATIN CAPITAL LETTER X +Y<>Y; # from FULLWIDTH LATIN CAPITAL LETTER Y +Z<>Z; # from FULLWIDTH LATIN CAPITAL LETTER Z +[<>'['; # from FULLWIDTH LEFT SQUARE BRACKET +\<>'\\'; # from FULLWIDTH REVERSE SOLIDUS {double escape - aliu} +]<>']'; # from FULLWIDTH RIGHT SQUARE BRACKET +^<>'^'; # from FULLWIDTH CIRCUMFLEX ACCENT +_<>'_'; # from FULLWIDTH LOW LINE +`<>'`'; # from FULLWIDTH GRAVE ACCENT +a<>a; # from FULLWIDTH LATIN SMALL LETTER A +b<>b; # from FULLWIDTH LATIN SMALL LETTER B +c<>c; # from FULLWIDTH LATIN SMALL LETTER C +d<>d; # from FULLWIDTH LATIN SMALL LETTER D +e<>e; # from FULLWIDTH LATIN SMALL LETTER E +f<>f; # from FULLWIDTH LATIN SMALL LETTER F +g<>g; # from FULLWIDTH LATIN SMALL LETTER G +h<>h; # from FULLWIDTH LATIN SMALL LETTER H +i<>i; # from FULLWIDTH LATIN SMALL LETTER I +j<>j; # from FULLWIDTH LATIN SMALL LETTER J +k<>k; # from FULLWIDTH LATIN SMALL LETTER K +l<>l; # from FULLWIDTH LATIN SMALL LETTER L +m<>m; # from FULLWIDTH LATIN SMALL LETTER M +n<>n; # from FULLWIDTH LATIN SMALL LETTER N +o<>o; # from FULLWIDTH LATIN SMALL LETTER O +p<>p; # from FULLWIDTH LATIN SMALL LETTER P +q<>q; # from FULLWIDTH LATIN SMALL LETTER Q +r<>r; # from FULLWIDTH LATIN SMALL LETTER R +s<>s; # from FULLWIDTH LATIN SMALL LETTER S +t<>t; # from FULLWIDTH LATIN SMALL LETTER T +u<>u; # from FULLWIDTH LATIN SMALL LETTER U +v<>v; # from FULLWIDTH LATIN SMALL LETTER V +w<>w; # from FULLWIDTH LATIN SMALL LETTER W +x<>x; # from FULLWIDTH LATIN SMALL LETTER X +y<>y; # from FULLWIDTH LATIN SMALL LETTER Y +z<>z; # from FULLWIDTH LATIN SMALL LETTER Z +{<>'{'; # from FULLWIDTH LEFT CURLY BRACKET +|<>'|'; # from FULLWIDTH VERTICAL LINE +}<>'}'; # from FULLWIDTH RIGHT CURLY BRACKET +~<>'~'; # from FULLWIDTH TILDE +。<>。; # to HALFWIDTH IDEOGRAPHIC FULL STOP +「<>「; # to HALFWIDTH LEFT CORNER BRACKET +」<>」; # to HALFWIDTH RIGHT CORNER BRACKET +、<>、; # to HALFWIDTH IDEOGRAPHIC COMMA +・<>・; # to HALFWIDTH KATAKANA MIDDLE DOT +ヲ<>ヲ; # to HALFWIDTH KATAKANA LETTER WO +ァ<>ァ; # to HALFWIDTH KATAKANA LETTER SMALL A +ィ<>ィ; # to HALFWIDTH KATAKANA LETTER SMALL I +ゥ<>ゥ; # to HALFWIDTH KATAKANA LETTER SMALL U +ェ<>ェ; # to HALFWIDTH KATAKANA LETTER SMALL E +ォ<>ォ; # to HALFWIDTH KATAKANA LETTER SMALL O +ャ<>ャ; # to HALFWIDTH KATAKANA LETTER SMALL YA +ュ<>ュ; # to HALFWIDTH KATAKANA LETTER SMALL YU +ョ<>ョ; # to HALFWIDTH KATAKANA LETTER SMALL YO +ッ<>ッ; # to HALFWIDTH KATAKANA LETTER SMALL TU +ー<>ー; # to HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +ア<>ア; # to HALFWIDTH KATAKANA LETTER A +イ<>イ; # to HALFWIDTH KATAKANA LETTER I +ウ<>ウ; # to HALFWIDTH KATAKANA LETTER U +エ<>エ; # to HALFWIDTH KATAKANA LETTER E +オ<>オ; # to HALFWIDTH KATAKANA LETTER O +カ<>カ; # to HALFWIDTH KATAKANA LETTER KA +キ<>キ; # to HALFWIDTH KATAKANA LETTER KI +ク<>ク; # to HALFWIDTH KATAKANA LETTER KU +ケ<>ケ; # to HALFWIDTH KATAKANA LETTER KE +コ<>コ; # to HALFWIDTH KATAKANA LETTER KO +サ<>サ; # to HALFWIDTH KATAKANA LETTER SA +シ<>シ; # to HALFWIDTH KATAKANA LETTER SI +ス<>ス; # to HALFWIDTH KATAKANA LETTER SU +セ<>セ; # to HALFWIDTH KATAKANA LETTER SE +ソ<>ソ; # to HALFWIDTH KATAKANA LETTER SO +タ<>タ; # to HALFWIDTH KATAKANA LETTER TA +チ<>チ; # to HALFWIDTH KATAKANA LETTER TI +ツ<>ツ; # to HALFWIDTH KATAKANA LETTER TU +テ<>テ; # to HALFWIDTH KATAKANA LETTER TE +ト<>ト; # to HALFWIDTH KATAKANA LETTER TO +ナ<>ナ; # to HALFWIDTH KATAKANA LETTER NA +ニ<>ニ; # to HALFWIDTH KATAKANA LETTER NI +ヌ<>ヌ; # to HALFWIDTH KATAKANA LETTER NU +ネ<>ネ; # to HALFWIDTH KATAKANA LETTER NE +ノ<>ノ; # to HALFWIDTH KATAKANA LETTER NO +ハ<>ハ; # to HALFWIDTH KATAKANA LETTER HA +ヒ<>ヒ; # to HALFWIDTH KATAKANA LETTER HI +フ<>フ; # to HALFWIDTH KATAKANA LETTER HU +ヘ<>ヘ; # to HALFWIDTH KATAKANA LETTER HE +ホ<>ホ; # to HALFWIDTH KATAKANA LETTER HO +マ<>マ; # to HALFWIDTH KATAKANA LETTER MA +ミ<>ミ; # to HALFWIDTH KATAKANA LETTER MI +ム<>ム; # to HALFWIDTH KATAKANA LETTER MU +メ<>メ; # to HALFWIDTH KATAKANA LETTER ME +モ<>モ; # to HALFWIDTH KATAKANA LETTER MO +ヤ<>ヤ; # to HALFWIDTH KATAKANA LETTER YA +ユ<>ユ; # to HALFWIDTH KATAKANA LETTER YU +ヨ<>ヨ; # to HALFWIDTH KATAKANA LETTER YO +ラ<>ラ; # to HALFWIDTH KATAKANA LETTER RA +リ<>リ; # to HALFWIDTH KATAKANA LETTER RI +ル<>ル; # to HALFWIDTH KATAKANA LETTER RU +レ<>レ; # to HALFWIDTH KATAKANA LETTER RE +ロ<>ロ; # to HALFWIDTH KATAKANA LETTER RO +ワ<>ワ; # to HALFWIDTH KATAKANA LETTER WA +ン<>ン; # to HALFWIDTH KATAKANA LETTER N +゙<>゙; # to HALFWIDTH KATAKANA VOICED SOUND MARK +゚<>゚; # to HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +ᅠ<>ᅠ; # to HALFWIDTH HANGUL FILLER +ᄀ<>ᄀ; # to HALFWIDTH HANGUL LETTER KIYEOK +ᄁ<>ᄁ; # to HALFWIDTH HANGUL LETTER SSANGKIYEOK +ᆪ<>ᆪ; # to HALFWIDTH HANGUL LETTER KIYEOK-SIOS +ᄂ<>ᄂ; # to HALFWIDTH HANGUL LETTER NIEUN +ᆬ<>ᆬ; # to HALFWIDTH HANGUL LETTER NIEUN-CIEUC +ᆭ<>ᆭ; # to HALFWIDTH HANGUL LETTER NIEUN-HIEUH +ᄃ<>ᄃ; # to HALFWIDTH HANGUL LETTER TIKEUT +ᄄ<>ᄄ; # to HALFWIDTH HANGUL LETTER SSANGTIKEUT +ᄅ<>ᄅ; # to HALFWIDTH HANGUL LETTER RIEUL +ᆰ<>ᆰ; # to HALFWIDTH HANGUL LETTER RIEUL-KIYEOK +ᆱ<>ᆱ; # to HALFWIDTH HANGUL LETTER RIEUL-MIEUM +ᆲ<>ᆲ; # to HALFWIDTH HANGUL LETTER RIEUL-PIEUP +ᆳ<>ᆳ; # to HALFWIDTH HANGUL LETTER RIEUL-SIOS +ᆴ<>ᆴ; # to HALFWIDTH HANGUL LETTER RIEUL-THIEUTH +ᆵ<>ᆵ; # to HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH +ᄚ<>ᄚ; # to HALFWIDTH HANGUL LETTER RIEUL-HIEUH +ᄆ<>ᄆ; # to HALFWIDTH HANGUL LETTER MIEUM +ᄇ<>ᄇ; # to HALFWIDTH HANGUL LETTER PIEUP +ᄈ<>ᄈ; # to HALFWIDTH HANGUL LETTER SSANGPIEUP +ᄡ<>ᄡ; # to HALFWIDTH HANGUL LETTER PIEUP-SIOS +ᄉ<>ᄉ; # to HALFWIDTH HANGUL LETTER SIOS +ᄊ<>ᄊ; # to HALFWIDTH HANGUL LETTER SSANGSIOS +ᄋ<>ᄋ; # to HALFWIDTH HANGUL LETTER IEUNG +ᄌ<>ᄌ; # to HALFWIDTH HANGUL LETTER CIEUC +ᄍ<>ᄍ; # to HALFWIDTH HANGUL LETTER SSANGCIEUC +ᄎ<>ᄎ; # to HALFWIDTH HANGUL LETTER CHIEUCH +ᄏ<>ᄏ; # to HALFWIDTH HANGUL LETTER KHIEUKH +ᄐ<>ᄐ; # to HALFWIDTH HANGUL LETTER THIEUTH +ᄑ<>ᄑ; # to HALFWIDTH HANGUL LETTER PHIEUPH +ᄒ<>ᄒ; # to HALFWIDTH HANGUL LETTER HIEUH +ᅡ<>ᅡ; # to HALFWIDTH HANGUL LETTER A +ᅢ<>ᅢ; # to HALFWIDTH HANGUL LETTER AE +ᅣ<>ᅣ; # to HALFWIDTH HANGUL LETTER YA +ᅤ<>ᅤ; # to HALFWIDTH HANGUL LETTER YAE +ᅥ<>ᅥ; # to HALFWIDTH HANGUL LETTER EO +ᅦ<>ᅦ; # to HALFWIDTH HANGUL LETTER E +ᅧ<>ᅧ; # to HALFWIDTH HANGUL LETTER YEO +ᅨ<>ᅨ; # to HALFWIDTH HANGUL LETTER YE +ᅩ<>ᅩ; # to HALFWIDTH HANGUL LETTER O +ᅪ<>ᅪ; # to HALFWIDTH HANGUL LETTER WA +ᅫ<>ᅫ; # to HALFWIDTH HANGUL LETTER WAE +ᅬ<>ᅬ; # to HALFWIDTH HANGUL LETTER OE +ᅭ<>ᅭ; # to HALFWIDTH HANGUL LETTER YO +ᅮ<>ᅮ; # to HALFWIDTH HANGUL LETTER U +ᅯ<>ᅯ; # to HALFWIDTH HANGUL LETTER WEO +ᅰ<>ᅰ; # to HALFWIDTH HANGUL LETTER WE +ᅱ<>ᅱ; # to HALFWIDTH HANGUL LETTER WI +ᅲ<>ᅲ; # to HALFWIDTH HANGUL LETTER YU +ᅳ<>ᅳ; # to HALFWIDTH HANGUL LETTER EU +ᅴ<>ᅴ; # to HALFWIDTH HANGUL LETTER YI +ᅵ<>ᅵ; # to HALFWIDTH HANGUL LETTER I +¢<>'¢'; # from FULLWIDTH CENT SIGN +£<>'£'; # from FULLWIDTH POUND SIGN +¬<>'¬'; # from FULLWIDTH NOT SIGN + ̄<>'¯'; # from FULLWIDTH MACRON +' '<>' '; # ideographic space (place this after MACRON) +¦<>'¦'; # from FULLWIDTH BROKEN BAR +¥<>'¥'; # from FULLWIDTH YEN SIGN +₩<>₩; # from FULLWIDTH WON SIGN +│<>│; # to HALFWIDTH FORMS LIGHT VERTICAL +'←'<>'←'; # to HALFWIDTH LEFTWARDS ARROW +↑<>↑; # to HALFWIDTH UPWARDS ARROW +'→'<>'→'; # to HALFWIDTH RIGHTWARDS ARROW +↓<>↓; # to HALFWIDTH DOWNWARDS ARROW +■<>■; # to HALFWIDTH BLACK SQUARE +○<>○; # to HALFWIDTH WHITE CIRCLE + +# eof + diff --git a/icuSources/data/translit/Greek_Latin.txt b/icuSources/data/translit/Greek_Latin.txt new file mode 100644 index 00000000..221e5d08 --- /dev/null +++ b/icuSources/data/translit/Greek_Latin.txt @@ -0,0 +1,345 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# Rules are predicated on running NFD first, and NFC afterwards +# :: [\u0000-\u007F \u0370-\u03FF [:Greek:] [:nonspacing mark:]] ; +# MINIMAL FILTER GENERATED FOR: Greek-Latin +:: [;\u00B5\u00B7\u00C4\u00CB\u00CF\u00D6\u00DC\u00E4\u00EB\u00EF\u00F6\u00FC\u00FF-\u0101\u0112-\u0113\u012A-\u012B\u014C-\u014D\u016A-\u016B\u0178\u01D5-\u01DC\u01DE-\u01E3\u01EC-\u01ED\u022A-\u022D\u0230-\u0233\u0304\u0308\u0313-\u0314\u0342-\u0345\u037A\u037E\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03CE\u03D0-\u03D7\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F5\u03F7-\u07FB\u0401\u0407\u0451\u0457\u04D2-\u04D3\u04DA-\u04DF\u04E2-\u04E7\u04EA-\u04F1\u04F4-\u04F5\u04F8-\u04F9\u1E14-\u1E17\u1E20-\u1E21\u1E26-\u1E27\u1E2E-\u1E2F\u1E38-\u1E39\u1E4E-\u1E53\u1E5C-\u1E5D\u1E7A-\u1E7B\u1E84-\u1E85\u1E8C-\u1E8D\u1E97\u1F00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC1-\u1FC4\u1FC6-\u1FCC\u1FCF-\u1FD3\u1FD6-\u1FDB\u1FDF-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2126\u03F9] ; + +:: NFD (NFC) ; + +# TEST CASES + +# Ὀλίγοι ἔμφονες πολλῶν ἀφρόνων φοβερώτεροι — Πλάτωνος +# ᾂ ᾒ ᾢ ᾃ ᾓ ᾣ +# ᾳ ῃ ῳ ὃ ὄ +# ὠς ὡς ὢς ὣς +# Ὠς Ὡς Ὢς Ὣς +# ὨΣ ὩΣ ὪΣ ὫΣ +# Ạ, ạ, Ẹ, ẹ, Ọ, ọ + +# Useful variables + +$lower = [[:latin:][:greek:] & [:Ll:]]; +$glower = [[:greek:] & [:Ll:]]; +$upper = [[:latin:][:greek:] & [:Lu:]] ; +$accent = [:M:] ; + +# NOTE: restrict to just the Greek & Latin accents that we care about +# TODO: broaden out once interation is fixed +$accentMinus = [ [\u0300-\u0345] & [:M:] - [\u0338]] ; + +$macron = \u0304 ; +$ddot = \u0308 ; +$ddotmac = [$ddot$macron]; + +$lcgvowel = [αεηιουω] ; +$ucgvowel = [ΑΕΗΙΟΥΩ] ; +$gvowel = [$lcgvowel $ucgvowel] ; +$lcgvowelC = [$lcgvowel $accent] ; + +$evowel = [aeiouyAEIOUY]; +$evowel2 = [iuyIUY]; +$vowel = [ $evowel $gvowel] ; + +$gammaLike = [ΓΚΞΧγκξχϰ] ; +$egammaLike = [GKXCgkxc] ; +$smooth = ̓ ; +$rough = ̔ ; +$iotasub = ͅ ; + +$evowel_i = [$evowel-[iI]] ; +$evowel2_i = [uyUY]; + +$underbar = \u0331; + +$afterLetter = [:L:] [[:M:]\']* ; +$beforeLetter = [[:M:]\']* [:L:] ; +$beforeLower = $accent * $lower ; + +$notLetter = [^[:L:][:M:]] ; +$under = ̱; + +# Fix punctuation +# preserve original +\: <> \: $under ; +\? <> \? $under ; + +\; <> \? ; +· <> \: ; + +# CIRCUMFLEX: convert greek circumflex to normal one. Could use tilde or inverted breve + +\u0342 <> \u0302 ; + +# IOTA: convert iota subscript to iota +# first make previous alpha long! + +$accent_minus = [[$accent]-[$iotasub$macron]]; + +Α } $accent_minus * $iotasub > | Α $macron ; +α } $accent_minus * $iotasub > | α $macron ; + +# now convert to uppercase if after uppercase, ow to lowercase + +$upper $accent * { $iotasub > I ; +$iotasub > i ; + +| $1 $iotasub < ($evowel $macron $accentMinus *) i ; +| $1 $iotasub < ($evowel $macron $accentMinus *) I ; + +# BREATHING + +# Convert rough breathing to h, and move before letters. + +# Make A ` x = > H a x + + Α ($macron?) $rough } $beforeLower > H | α $1; + Ε $rough } $beforeLower > H | ε; + Η $rough } $beforeLower > H | η ; + Ι ($ddot?) $rough } $beforeLower > H | ι $1; + Ο $rough } $beforeLower > H | ο ; + Υ $rough } $beforeLower > H | υ ; + Ω ($ddot?) $rough } $beforeLower > H | ω $1; + +# Make A x ` = > H a x + +Α ($glower $macron?) $rough > H | α $1 ; +Ε ($glower) $rough > H | ε $1 ; +Η ($glower) $rough > H | η $1 ; +Ι ($glower $ddot?) $rough > H | ι $1 ; +Ο ($glower) $rough > H | ο $1 ; +Υ ($glower) $rough > H | υ $1 ; +Ω ($glower $ddot?) $rough > H | ω $1 ; + +#Otherwise, make x ` into h x and X ` into H X + +($lcgvowel + $ddotmac? ) $rough > h | $1 ; +($gvowel + $ddotmac? ) $rough > H | $1 ; + +# Go backwards with H + +| $1 $rough < h ($evowel $macron $ddot? $evowel2_i $macron?) ; +| $1 $rough < h ($evowel $ddot? $evowel2 $macron?) ; +| $1 $rough < h ($evowel $macron? $ddot?) ; + +| $1 $rough < H ([AEIOUY] $macron $ddot? $evowel2_i $macron?) ; +| $1 $rough < H ([AEIOUY] $ddot? $evowel2 $macron?) ; +| $1 $rough < H ([AEIOUY] $macron? $ddot?) ; + +# titlecase, have to fix individually +# in the future, we should add &uppercase() to make this easier + +| A $1 $rough < H a ($macron $ddot? $evowel2_i $macron?) ; +| E $1 $rough < H e ($macron $ddot? $evowel2_i $macron?) ; +| I $1 $rough < H i ($macron $ddot? $evowel2_i $macron?) ; +| O $1 $rough < H o ($macron $ddot? $evowel2_i $macron?) ; +| U $1 $rough < H u ($macron $ddot? $evowel2_i $macron?) ; +| Y $1 $rough < H y ($macron $ddot? $evowel2_i $macron?) ; + +| A $1 $rough < H a ($ddot? $evowel2 $macron?) ; +| E $1 $rough < H e ($ddot? $evowel2 $macron?) ; +| I $1 $rough < H i ($ddot? $evowel2 $macron?) ; +| O $1 $rough < H o ($ddot? $evowel2 $macron?) ; +| U $1 $rough < H u ($ddot? $evowel2 $macron?) ; +| Y $1 $rough < H y ($ddot? $evowel2 $macron?) ; + +| A $1 $rough < H a ($macron? $ddot? ) ; +| E $1 $rough < H e ($macron? $ddot? ) ; +| I $1 $rough < H i ($macron? $ddot? ) ; +| O $1 $rough < H o ($macron? $ddot? ) ; +| U $1 $rough < H u ($macron? $ddot? ) ; +| Y $1 $rough < H y ($macron? $ddot? ) ; + +# Now do smooth + +#delete smooth breathing for Latin +$smooth > ; + +# insert in Greek +# the assumption is that all Marks are on letters. + + | $1 $smooth < $notLetter { ([rR]) } [^hH$smooth$rough] ; + | $1 $smooth < $notLetter { ($evowel $macron? $evowel2 $macron?) } [^$smooth$rough] ; + | $1 $smooth < $notLetter { ($evowel $macron?) } [^$evowel2$smooth$rough] ; + +# TODO: preserve smooth/rough breathing if not +# on initial vowel sequence + +# need to have these up here so the rules don't mask + +# remove now superfluous macron when returning + +Α < A $macron ; +α < a $macron ; + +η <> e $macron ; +Η <> E $macron ; + +φ <> ph ; +Ψ } $beforeLower <> Ps ; +Ψ <> PS ; + +Φ } $beforeLower <> Ph ; +Φ <> PH ; +ψ <> ps ; + +ω <> o $macron ; +Ω <> O $macron; + +# NORMAL + +α <> a ; +Α <> A ; + +β <> b ; +Β <> B ; + +γ } $gammaLike <> n } $egammaLike ; +γ <> g ; +Γ } $gammaLike <> N } $egammaLike ; +Γ <> G ; + +δ <> d ; +Δ <> D ; + +ε <> e ; +Ε <> E ; + +ζ <> z ; +Ζ <> Z ; + +θ <> th ; +Θ } $beforeLower <> Th ; +Θ <> TH ; + +ι <> i ; +Ι <> I ; + +κ <> k ; +Κ <> K ; + +λ <> l ; +Λ <> L ; + +μ <> m ; +Μ <> M ; + +ν } $gammaLike > n\' ; +ν <> n ; +Ν } $gammaLike <> N\' ; +Ν <> N ; + +ξ <> x ; +Ξ <> X ; + +ο <> o ; +Ο <> O ; + +π <> p ; +Π <> P ; + +ρ $rough <> rh; +Ρ $rough } $beforeLower <> Rh ; +Ρ $rough <> RH ; +ρ <> r ; +Ρ <> R ; + +# insert separator before things that turn into s + +[Pp] { } [ςσΣϷϸϺϻ] > \' ; + +# special S variants + +Ϸ <> Š ; # Ϸ GREEK CAPITAL LETTER SHO Uppercase_Letter Grek - L +ϸ <> š ; #ϸ GREEK SMALL LETTER SHO Lowercase_Letter Grek - L +Ϻ <> Ŝ ; # Ϻ GREEK CAPITAL LETTER SAN Uppercase_Letter Grek - L +ϻ <> ŝ ; # ϻ GREEK SMALL LETTER SAN Lowercase_Letter Grek - L + +# underbar means exception + +# before a letter, initial +ς } $beforeLetter <> s $underbar } $beforeLetter; +σ } $beforeLetter <> s } $beforeLetter; + +# otherwise, after a letter = final +$afterLetter { σ <> $afterLetter { s $underbar; +$afterLetter { ς <> $afterLetter { s ; + +# otherwise (isolated) = initial +ς <> s $underbar; +σ <> s ; + +# [Pp] { Σ <> \'S ; +Σ <> S ; + +τ <> t ; +Τ <> T ; + +$vowel {υ } <> u ; +υ <> y ; +$vowel { Υ <> U ; +Υ <> Y ; + +χ <> ch ; +Χ } $beforeLower <> Ch ; +Χ <> CH ; + +# Completeness for ASCII + +$ignore = [[:Mark:]''] * ; + +| k < c ; +| ph < f ; +| i < j ; +| k < q ; +| b < v } $vowel ; +| b < w } $vowel; +| u < v ; +| u < w; +| K < C ; +| Ph < F ; +| I < J ; +| K < Q ; +| B < V } $vowel ; +| B < W } $vowel ; +| U < V ; +| U < W ; + +$rough } $ignore [:UppercaseLetter:] > H ; +$ignore [:UppercaseLetter:] { $rough > H ; +$rough < H ; +$rough <> h ; + +# Completeness for Greek + +ϐ > | β ; +ϑ > | θ ; +ϒ > | Υ ; +ϕ > | φ ; +ϖ > | π ; + +ϰ > | κ ; +ϱ > | ρ ; +ϲ > | σ ; +Ϲ > | Σ; #U+03F9 GREEK CAPITAL LUNATE SIGMA SYMBOL +ϳ > j ; +ϴ > | Θ ; +ϵ > | ε ; + +µ > | μ ; + + ͺ > i; + +# delete any trailing ' marks used for roundtripping + + < [Ππ] { \' } [Ss] ; + < [Νν] { \' } $egammaLike ; + +::NFC (NFD) ; +# ([\u0000-\u007F [:Latin:] [:Greek:] [:nonspacing mark:]]) ; +# ([\u0000-\u007F \u00B7 [:Latin:] [:nonspacing mark:]]) ; +# MINIMAL FILTER GENERATED FOR: Latin-Greek BACKWARD +:: ( [':?A-Za-z\u00C0-\u00C5\u00C7-\u00CF\u00D1-\u00D6\u00D9-\u00DD\u00E0-\u00E5\u00E7-\u00EF\u00F1-\u00F6\u00F9-\u00FD\u00FF-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E3\u01E6-\u01F0\u01F4-\u01F5\u01F8-\u021B\u021E-\u021F\u0226-\u0233\u0300-\u0337\u0339-\u0345\u0385-\u0386\u0388-\u038A\u038C\u038E-\u0390\u03AA-\u03B0\u03CA-\u03CE\u03D3-\u03D4\u0400-\u0401\u0403\u0407\u040C-\u040E\u0419\u0439\u0450-\u0451\u0453\u0457\u045C-\u045E\u0476-\u0477\u04C1-\u04C2\u04D0-\u04D3\u04D6-\u04D7\u04DA-\u04DF\u04E2-\u04E7\u04EA-\u04F5\u04F8-\u04F9\u1E00-\u1E99\u1E9B\u1EA0-\u1EF9\u1F00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FC1-\u1FC4\u1FC6-\u1FD3\u1FD6-\u1FDB\u1FDD-\u1FEE\u1FF2-\u1FF4\u1FF6-\u1FFC\u212A-\u212B] ) ; diff --git a/icuSources/data/translit/Greek_Latin_UNGEGN.txt b/icuSources/data/translit/Greek_Latin_UNGEGN.txt new file mode 100644 index 00000000..a7ea7175 --- /dev/null +++ b/icuSources/data/translit/Greek_Latin_UNGEGN.txt @@ -0,0 +1,252 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- +# For modern Greek, based on UNGEGN rules. + +# Rules are predicated on running NFD first, and NFC afterwards +# MINIMAL FILTER GENERATED FOR: Greek-Latin/UNGEGN +# WARNING: need to add accents to both filters ### +# :: [́̄̆̈;µ·ÀÂÈÊÌÎÒÔÙÛàâèêìîòôùûĈ-ĉĜ-ĝĤ-ĥĴ-ĵŜ-ŝŴ-ŷǛ-ǜǸ-ǹ̀̂̓-̔̀͂-̓ͅͺ;Ά-ΊΌΎ-ΡΣ-ώϐ-ϖϰ-ϵЀЍѐѝḔ-ḕṐ-ṑẀ-ẁẐ-ẑẤ-ậẰ-ằẾ-ệỐ-ộỜ-ờỪ-ừỲ-ỳἀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼι῁-ῄῆ-῍῏-ΐῖ-Ί῝῟-῭ῲ-ῴῶ-ῼΩ\u03F7-\u07FB\u03F9] ; + +:: [[[:Greek:][:Mn:][:Me:]] [\:-;?\u00B7\u037E\u0387]] ; +::NFD (NFC) ; + +# Useful variables + +$lower = [[:latin:][:greek:] & [:Ll:]] ; +$upper = [[:latin:][:greek:] & [:Lu:]] ; +$accent = [[:Mn:][:Me:]] ; + +$macron = ̄ ; +$ddot = ̈ ; + +$lcgvowel = [αεηιουω] ; +$ucgvowel = [ΑΕΗΙΟΥΩ] ; +$gvowel = [$lcgvowel $ucgvowel] ; +$lcgvowelC = [$lcgvowel $accent] ; + +$evowel = [aeiouyAEIOUY]; +$vowel = [ $evowel $gvowel] ; + +$beforeLower = $accent * $lower ; + +$gammaLike = [ΓΚΞΧγκξχϰ] ; +$egammaLike = [GKXCgkxc] ; +$smooth = ̓ ; +$rough = ̔ ; +$iotasub = ͅ ; + +$softener = [βΒγΓδΔζΖλΛμΜνΝρΡ$gvowel] ; + +$under = ̱; + +$caron = ̌; + +$afterLetter = [:L:] [\'$accent]* ; +$beforeLetter = [\'$accent]* [:L:] ; + +# Fix punctuation + +# preserve orginal +\: <> \: $under ; +\? <> \? $under ; + +\; <> \? ; +· <> \: ; + +# Fix any ancient characters that creep in + +͂ > ́ ; +̂ > ́ ; +̀ > ́ ; +$smooth > ; +$rough > ; +$iotasub > ; +ͺ > ; + +# need to have these up here so the rules don't mask + +η <> i $under ; +Η <> I $under ; + +Ψ } $beforeLower <> Ps ; +Ψ <> PS ; +ψ <> ps ; + +ω <> o $under ; +Ω <> O $under; + +# at begining or end of word, convert mp to b + +[^[:L:]$accent] { μπ > b ; +μπ } [^[:L:]$accent] > b ; +[^[:L:]$accent] { [Μμ][Ππ] > B ; +[Μμ][Ππ] } [^[:L:]$accent] > B ; + +μπ < b ; +Μπ < B } $beforeLower ; +ΜΠ < B ; + +# handle diphthongs ending with upsilon + +ου <> ou ; +ΟΥ <> OU ; +Ου <> Ou ; +οΥ <> oU ; + +$fmaker = [aeiAEI] $under ? ; +$shiftForwardVowels = [[:Mn:]-[\u0308]]; # note: a diaeresis keeps the items separate + +$fmaker { υ ( $shiftForwardVowels )* } $softener > $1 v $under ; +υ $1 < ( $shiftForwardVowels )* v $under ; + +$fmaker { υ ( $shiftForwardVowels )* } > $1 f $under; +υ $1 < ( $shiftForwardVowels )* f $under ; + +$fmaker { Υ } $softener <> V $under ; +$fmaker { Υ <> U $under ; + +υ <> y ; +Υ <> Y ; + +# NORMAL + +α <> a ; +Α <> A ; + +β <> v ; +Β <> V ; + +γ } $gammaLike <> n } $egammaLike ; +γ <> g ; +Γ } $gammaLike <> N } $egammaLike ; +Γ <> G ; + +δ <> d ; +Δ <> D ; + +ε <> e ; +Ε <> E ; + +ζ <> z ; +Ζ <> Z ; + +θ <> th ; +Θ } $beforeLower <> Th ; +Θ <> TH ; + +ι <> i ; +Ι <> I ; + +κ <> k ; +Κ <> K ; + +λ <> l ; +Λ <> L ; + +μ <> m ; +Μ <> M ; + +ν } $gammaLike > n\' ; +ν <> n ; +Ν } $gammaLike <> N\' ; +Ν <> N ; + +ξ <> x ; +Ξ <> X ; + +ο <> o ; +Ο <> O ; + +π <> p ; +Π <> P ; + +ρ <> r ; +Ρ <> R ; + +# insert separator before things that turn into s +[Pp] { } [ςσΣϷϸϺϻ] > \' ; + +# special S variants + +Ϸ <> Š ; # Ϸ GREEK CAPITAL LETTER SHO Uppercase_Letter Grek - L +ϸ <> š ; #ϸ GREEK SMALL LETTER SHO Lowercase_Letter Grek - L +Ϻ <> Ŝ ; # Ϻ GREEK CAPITAL LETTER SAN Uppercase_Letter Grek - L +ϻ <> ŝ ; # ϻ GREEK SMALL LETTER SAN Lowercase_Letter Grek - L + +# Caron means exception + +# before a letter, initial +ς } $beforeLetter <> s $under } $beforeLetter; +σ } $beforeLetter <> s } $beforeLetter; + +# otherwise, after a letter = final +$afterLetter { σ <> $afterLetter { s $under; +$afterLetter { ς <> $afterLetter { s ; + +# otherwise (isolated) = initial +ς <> s $under; +σ <> s ; + +# [Pp] { Σ <> \'S ; +Σ <> S ; + +τ <> t ; +Τ <> T ; + +φ <> f ; +Φ <> F ; + +χ <> ch ; +Χ } $beforeLower <> Ch ; +Χ <> CH ; + +# Completeness for ASCII + +# $ignore = [[:Mark:]''] * ; + +| ch < h ; +| k < c ; +| i < j ; +| k < q ; +| b < u } $vowel ; +| b < w } $vowel ; +| y < u ; +| y < w ; + +| Ch < H ; +| K < C ; +| I < J ; +| K < Q ; +| B < W } $vowel ; +| B < U } $vowel ; +| Y < W ; +| Y < U ; + +# Completeness for Greek + +ϐ > | β ; +ϑ > | θ ; +ϒ > | Υ ; +ϕ > | φ ; +ϖ > | π ; + +ϰ > | κ ; +ϱ > | ρ ; +ϲ > | σ ; +Ϲ > | Σ; #U+03F9 GREEK CAPITAL LUNATE SIGMA SYMBOL +ϳ > j ; +ϴ > | Θ ; +ϵ > | ε ; +µ > | μ ; + +# delete any trailing ' marks used for roundtripping + + < [Ππ] { \' } [Ss] ; + < [Νν] { \' } $egammaLike ; + +::NFC (NFD) ; + +# MINIMAL FILTER GENERATED FOR: Latin-Greek/UNGEGN BACKWARD +:: ([[[:Latin:][:Mn:][:Me:]] ['\:?]]) ; diff --git a/icuSources/data/translit/Gujarati_InterIndic.txt b/icuSources/data/translit/Gujarati_InterIndic.txt new file mode 100644 index 00000000..20534276 --- /dev/null +++ b/icuSources/data/translit/Gujarati_InterIndic.txt @@ -0,0 +1,91 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# Gujarati-InterIndic +#:: NFD (NFC) ; +\u0a81>\ue001; # SIGN CANDRABINDU +\u0a82>\ue002; # SIGN ANUSVARA +\u0a83>\ue003; # SIGN VISARGA +\u0a85>\ue005; # LETTER A +\u0a86>\ue006; # LETTER AA +\u0a87>\ue007; # LETTER I +\u0a88>\ue008; # LETTER II +\u0a89>\ue009; # LETTER U +\u0a8a>\ue00a; # LETTER UU +\u0a8b>\ue00b; # LETTER VOCALIC R +\u0a8c>\ue00c; # LETTER VOCALLIC L +\u0a8d>\ue00d; # VOWEL CANDRA E +\u0a8f>\ue00f; # LETTER E +\u0a90>\ue010; # LETTER AI +\u0a91>\ue011; # VOWEL CANDRA O +\u0a93>\ue013; # LETTER O +\u0a94>\ue014; # LETTER AU +\u0a95>\ue015; # LETTER KA +\u0a96>\ue016; # LETTER KHA +\u0a97>\ue017; # LETTER GA +\u0a98>\ue018; # LETTER GHA +\u0a99>\ue019; # LETTER NGA +\u0a9a>\ue01a; # LETTER CA +\u0a9b>\ue01b; # LETTER CHA +\u0a9c>\ue01c; # LETTER JA +\u0a9d>\ue01d; # LETTER JHA +\u0a9e>\ue01e; # LETTER NYA +\u0a9f>\ue01f; # LETTER TTA +\u0aa0>\ue020; # LETTER TTHA +\u0aa1>\ue021; # LETTER DDA +\u0aa2>\ue022; # LETTER DDHA +\u0aa3>\ue023; # LETTER NNA +\u0aa4>\ue024; # LETTER TA +\u0aa5>\ue025; # LETTER THA +\u0aa6>\ue026; # LETTER DA +\u0aa7>\ue027; # LETTER DHA +\u0aa8>\ue028; # LETTER NA +\u0aaa>\ue02a; # LETTER PA +\u0aab>\ue02b; # LETTER PHA +\u0aac>\ue02c; # LETTER BA +\u0aad>\ue02d; # LETTER BHA +\u0aae>\ue02e; # LETTER MA +\u0aaf>\ue02f; # LETTER YA +\u0ab0>\ue030; # LETTER RA +\u0ab2>\ue032; # LETTER LA +\u0ab3>\ue033; # LETTER LLA +\u0ab5>\ue035; # LETTER VA +\u0ab6>\ue036; # LETTER SHA +\u0ab7>\ue037; # LETTER SSA +\u0ab8>\ue038; # LETTER SA +\u0ab9>\ue039; # LETTER HA +\u0abc>\ue03c; # SIGN NUKTA +\u0abd>\ue03d; # SIGN AVAGRAHA +\u0abe>\ue03e; # VOWEL SIGN AA +\u0abf>\ue03f; # VOWEL SIGN I +\u0ac0>\ue040; # VOWEL SIGN II +\u0ac1>\ue041; # VOWEL SIGN U +\u0ac2>\ue042; # VOWEL SIGN UU +\u0ac3>\ue043; # VOWEL SIGN VOCALIC R +\u0ac4>\ue044; # VOWEL SIGN VOCALIC RR +\u0ac5>\ue045; # VOWEL SIGN CANDRA E +\u0ac7>\ue047; # VOWEL SIGN E +\u0ac8>\ue048; # VOWEL SIGN AI +\u0ac9>\ue049; # VOWEL SIGN CANDRA O +\u0acb>\ue04b; # VOWEL SIGN O +\u0acc>\ue04c; # VOWEL SIGN AU +\u0acd>\ue04d; # SIGN VIRAMA +\u0ad0>\ue050; # OM +\u0ae0>\ue060; # LETTER VOCALIC RR +\u0ae1>\ue061; # LETTER VOCALIC LL +\u0ae6>\ue066; # DIGIT ZERO +\u0ae7>\ue067; # DIGIT ONE +\u0ae8>\ue068; # DIGIT TWO +\u0ae9>\ue069; # DIGIT THREE +\u0aea>\ue06a; # DIGIT FOUR +\u0aeb>\ue06b; # DIGIT FIVE +\u0aec>\ue06c; # DIGIT SIX +\u0aed>\ue06d; # DIGIT SEVEN +\u0aee>\ue06e; # DIGIT EIGHT +\u0aef>\ue06f; # DIGIT NINE +\u0964>\ue064; # DANDA +\u0965>\ue065; # DOUBLE DANDA +# :: NFC (NFD) ; +# eof diff --git a/icuSources/data/translit/Gurmukhi_InterIndic.txt b/icuSources/data/translit/Gurmukhi_InterIndic.txt new file mode 100644 index 00000000..2c937898 --- /dev/null +++ b/icuSources/data/translit/Gurmukhi_InterIndic.txt @@ -0,0 +1,95 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# Gurmukhi-InterIndic +#:: NFD (NFC) ; + +#\u0A16\u0A3C>\uE059; # LETTER KHHA +#\u0A17\u0A3C>\uE05A; # LETTER GHHA +#\u0A1C\u0A3C>\uE05B; # LETTER ZA +#\u0A38\u0A3C>\uE036; # LETTER SHA +#\u0A32\u0A3C>\uE033; # LETTER LLA +#\u0A2B\u0A3C>\uE05E; # LETTER FA +\u0A01>\ue001; # SIGN CHANDRABINDU +\u0A02>\uE002; # SIGN BINDI +\u0A05>\uE005; # LETTER A +\u0A06>\uE006; # LETTER AA +\u0A07>\uE007; # LETTER I +\u0A08>\uE008; # LETTER II +\u0A09>\uE009; # LETTER U +\u0A0A>\uE00A; # LETTER UU +\u0A0C>\uE032; # FALLBACK : VOCALLIC LA +\u0A0F>\uE00F; # LETTER EE +\u0A10>\uE010; # LETTER AI +\u0A13>\uE013; # LETTER OO +\u0A14>\uE014; # LETTER AU +\u0A15>\uE015; # LETTER KA +\u0A16>\uE016; # LETTER KHA +\u0A17>\uE017; # LETTER GA +\u0A18>\uE018; # LETTER GHA +\u0A19>\uE019; # LETTER NGA +\u0A1A>\uE01A; # LETTER CA +\u0A1B>\uE01B; # LETTER CHA +\u0A1C>\uE01C; # LETTER JA +\u0A1D>\uE01D; # LETTER JHA +\u0A1E>\uE01E; # LETTER NYA +\u0A1F>\uE01F; # LETTER TTA +\u0A20>\uE020; # LETTER TTHA +\u0A21>\uE021; # LETTER DDA +\u0A22>\uE022; # LETTER DDHA +\u0A23>\uE023; # LETTER NNA +\u0A24>\uE024; # LETTER TA +\u0A25>\uE025; # LETTER THA +\u0A26>\uE026; # LETTER DA +\u0A27>\uE027; # LETTER DHA +\u0A28>\uE028; # LETTER NA +\u0A2A>\uE02A; # LETTER PA +\u0A2B>\uE02B; # LETTER PHA +\u0A2C>\uE02C; # LETTER BA +\u0A2D>\uE02D; # LETTER BHA +\u0A2E>\uE02E; # LETTER MA +\u0A2F>\uE02F; # LETTER YA +\u0A30>\uE030; # LETTER RA +\u0A32>\uE032; # LETTER LA +\u0a33>\uE033; # FALLBACK +\u0A35>\uE035; # LETTER VA +\u0a36>\ue036; +\u0A38\0a3c>\ue036; # FALLBACK +\u0A38>\uE038; # LETTER SA +\u0A39>\uE039; # LETTER HA +\u0A3C>\uE03C; # SIGN NUKTA +\u0A3E>\uE03E; # VOWEL SIGN AA +\u0A3F>\uE03F; # VOWEL SIGN I +\u0A40>\uE040; # VOWEL SIGN II +\u0A41>\uE041; # VOWEL SIGN U +\u0A42>\uE042; # VOWEL SIGN UU +\u0A47>\uE047; # VOWEL SIGN EE +\u0A48>\uE048; # VOWEL SIGN AI +\u0A4B>\uE04B; # VOWEL SIGN OO +\u0A4C>\uE04C; # VOWEL SIGN AU +\u0A4D>\uE04D; # SIGN VIRAMA + +\u0A5C>\uE05C; # LETTER RRA + +\u0A66>\uE066; # DIGIT ZERO +\u0A67>\uE067; # DIGIT ONE +\u0A68>\uE068; # DIGIT TWO +\u0A69>\uE069; # DIGIT THREE +\u0A6A>\uE06A; # DIGIT FOUR +\u0A6B>\uE06B; # DIGIT FIVE +\u0A6C>\uE06C; # DIGIT SIX +\u0A6D>\uE06D; # DIGIT SEVEN +\u0A6E>\uE06E; # DIGIT EIGHT +\u0A6F>\uE06F; # DIGIT NINE +\u0A70>\uE07C; # TIPPI +\u0A71>\uE07D; # ADDAK +\u0A72>\uE07E; # IRI +\u0A73>\uE07F; # URA +\u0A74>\uE080; # EK ONKAR +\u0964>\ue064; # DANDA +\u0965>\ue065; # DOUBLE DANDA +# :: NFC (NFD) ; +# eof + diff --git a/icuSources/data/translit/Han_Latin.txt b/icuSources/data/translit/Han_Latin.txt new file mode 100644 index 00000000..4efac9bc --- /dev/null +++ b/icuSources/data/translit/Han_Latin.txt @@ -0,0 +1,1440 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# Warning: does not do round-trip mapping!! + +# Convert CJK characters +::Han-Spacedhan(); + +# Start RAW data for converting CJK characters +[吖呵錒锕阿]>ā; +嗄>á; +啊>a; +[哀哎唉埃挨銰鎄锿]>āi; +[㱯䠹䶣啀嘊嵦捱敱敳癌皑皚騃]>ái; +[㑸㗨㢊䑂䨠佁娾昹欸毐矮蔼藹躷霭靄馤]>ǎi; +[㕌㗒㘷㝶㤅㿄䀳䅬䔽䝽䬵伌僾叆嗳噯塧壒嫒嬡愛懓懝暧曖濭爱瑷璦皧瞹砨硋碍礙艾薆譪賹鑀隘靉鴱]>ài; +[侒媕安峎峖庵氨痷盦盫腌腤菴萻葊蓭誝諳谙銨铵鞌鞍馣鵪鶕鹌]>ān; +[䜙啽玵雸]>án; +[㜝㽢䁆䅖俺唵垵埯揞晻罯隌]>ǎn; +[㟁㱘㸩䅁䎏䎨䬓䮗䯥儑匎堓岸按暗案桉洝犴荌錌闇鮟黬黯]>àn; +骯>āng; +[㭿䀚䒢䩕䭹䭺卬岇昂昻]>áng; +[䍩軮雵]>ǎng; +[㦹㼜枊盎醠]>àng; +[凹柪梎軪]>āo; +[㟼㠂㿰䐿䚫䥝䦋䵅厫嗷嗸嶅廒摮敖滶熬爊獒獓璈磝翱翺聱蔜螯謷謸遨鏊鏖隞驁骜鰲鳌鷔鼇𦪈]>áo; +[㑃㤇䞝䯠䴈媪媼抝拗狕芺袄襖镺𥜌]>ǎo; +[㕭㘬㘭㜜㜩㠗㥿䁱䜒䫨䮯傲坳垇奡奥奧嫯岙嶴慠懊扷擙澳詏𩼈]>ào; +[仈八哵岜扒捌朳玐疤粑羓芭豝釟鲃]>bā; +[㔜㧊䟦䳁䳊叐坺墢妭抜拔炦犮秡胈茇菝詙跋軷鈸钹颰馛魃鼥]>bá; +[㞎把鈀钯靶]>bǎ; +[㖠㶚䃻䆉䇑䎬䎱䥯䩗䩻䰾䱝坝垻壩弝欛灞爸猈覇霸]>bà; +[叭吧巴笆罢罷]>ba; +掰>bāi; +[㼟㿟䳆白]>bái; +[㗗㼣䙓佰捭摆擺柏百矲粨絔襬]>bǎi; +[㗑㠔䒔䢙䴽庍拜拝敗稗粺蛽贁败]>bài; +[扳搬攽斑斒朌班瘢癍般虨螌褩辬頒颁]>bān; +[㩯㸞㺜䉽䬳坂岅昄板版粄舨蝂鈑钣闆阪]>bǎn; +[㚘㪵䕰伴办半姅怑拌湴瓣秚絆绊辦鉡靽]>bàn; +扮>ban; +[垹帮幇幚幫捠梆浜縍邦邫鞤]>bāng; +[㔙㮄䟺榜牓綁绑膀]>bǎng; +[㭋㯁㾦䂜䎧䖫䧛䰷傍塝棒磅稖艕蚌蜯謗谤鎊镑]>bàng; +[勹包孢笣胞苞蕔褒襃闁骲]>bāo; +[㵡㿺䈏䥤䨌䨔䪨嫑瓟窇薄雹]>báo; +[㙅㲏㻄䎂䭋䳈䳰䴐保堡堢宝宲寚寳寶怉珤緥葆褓褴賲靌飽饱駂鳵鴇鸨]>bǎo; +[㙸㫧㲒䤖儤勽報忁报抱暴曓煲爆犦菢虣袌豹趵鉋鑤铇鮑鲍鸔]>bào; +[伓卑岥庳悲揹杯桮椑盃碑禆綼萆藣錃鵯鹎]>bēi; +[㤳北鉳]>běi; +[㓈㔨㛝㣁㰆㶔㷶㸢㸬㸽㻗㼎㾱䁅䋳䔒䠙䡶䩀䰽俻倍偝偹備僃备孛悖惫愂憊昁梖焙牬犕狈狽珼琲糒紴背蓓被褙貝贝軰輩辈邶郥鄁鋇鐾钡鞴韛]>bèi; +[呗唄]>bei; +[奔泍渀犇錛锛]>bēn; +[㡷㮺夲奙本楍畚苯]>běn; +[㤓㨧㱵䬱倴坌捹撪桳笨輽逩]>bèn; +[伻嘣崩嵭祊綳閍]>bēng; +甭>béng; +[㑟䋽䙀䩬䭰䳞埲玤琫繃绷菶誁鞛]>běng; +[㱶㷯䨻塴搒槰泵蠯跰蹦迸逬鏰镚]>bèng; +[偪屄毴皀皕稫芘蓖螕豍逼颷]>bī; +[㮰䨆䵄荸魮鼻]>bí; +[㚰㠲㪏㻶䃾䇷䏢䘡䠋䣥佊俾匕吡啚夶妣彼朼柀比沘滗潷疕秕笔筆粃蚍貏鄙]>bǐ; +[㓖㗉㘠㘩㙄㡀㡙㢰㢶㢸㧙㪤㮿㯇㱸㳼㵥㵨㹃㻫㿫䀣䁹䄶䊧䋔䌟䎵䏶䕗䖩䟆䟤䦘䧗䩛䪐䫁䫾䬛䭮䮡䯗佖咇哔嗶坒堛壁奰妼婢嬖币幣庇廦弊弻弼彃必怭愊愎敝斃枈柲梐楅檘毕毖毙湢滭煏熚狴獘獙珌璧畀畢疪痹痺睤睥碧筚箄-箆篦篳粊縪罼聛腷臂苾荜蓽蔽薜蜌袐裨襞襣觱詖诐貱賁贔贲赑跸蹕躃躄避邲鄨鄪鉍鎞鏎鐴铋閇閉閟闭陛鞸韠飶饆馝駜驆骳髀魓鮅鰏鲾鵖鷝鷩鼊]>bì; +[煸牑猵甂砭稨笾箯籩糄編编蝙边辺邉邊鍽鞭鯾鯿鳊]>biān; +[㦚䁵匾惼扁碥窆藊褊貶贬]>biǎn; +[㝸㣐㭓㲢㳎㳒㴜㵷㺹㻞䉸䒪䛒䡢䪻便匥卞变変弁徧忭抃揙昪汳汴玣緶缏艑苄覍變辡辧-辩辫辮辯遍釆閞鴘]>biàn; +[儦墂幖彪标標滮瀌灬熛爂猋瘭磦穮脿臕謤贆鏢鑣镖镳颩颮飆飇飍飑飙飚驫骉髟麃麅]>biāo; +[㟽㠒㯱㯹䔸婊檦表裱褾諘錶飈]>biǎo; +[㧼䞄俵覅鰾鳔]>biào; +[憋虌鱉鳖鼈龞]>biē; +[䠥䭱別别莂蟞襒蹩]>bié; +[㿜瘪癟蛂]>biě; +[㢼䉲䋢䏟彆徶]>biè; +[宾彬斌椕槟檳汃滨濒濱瀕瑸璸矉繽缤蠙豩豳賓賔邠鑌镔霦顮馪驞]>bīn; +[䐔傧儐摈擯殡殯膑臏髌髕髩鬂鬓鬢]>bìn; +[仌兵冫冰掤栟梹氷絣]>bīng; +[㨀䋑䓑䴵丙偋怲抦昞昺柄炳眪禀秉稟窉苪蛃邴鉼陃鞞餅餠饼]>bǐng; +[䈂䗒並併倂傡寎并幷摒栤棅病竝鈵靐鮩]>bìng; +[剝剥哱嶓拨撥播柭波玻癶盋砵碆缽菠袚蹳鉢钵驋髉鮁鱍鲅]>bō; +[㗘㝿㟑㧳㩧㩭㪍㬍㬧㱟㴾㶿㹀䂍䊿䍨䍸䑈䒄䗚䙏䞳䟛䢌䢪䥬䪇䪬䫊䬪䭦䭯䮀䮂䯋䰊䶈亳伯侼僰勃博嚗壆嶏帛愽懪挬搏敀栢桲欂泺浡渤煿牔犻猼瓝礡礴箔簙簿糪胉脖舶艊苩葧蔔袯襏襮誖謈豰踄踣郣鉑鋍鎛鑮铂镈餑餺饽馎馞駁駮驳髆鮊鲌鵓鹁]>bó; +[箥簸蚾跛駊]>bǒ; +[㖕孹挀擘檗疈繴蘗譒]>bò; +[卜啵膊]>bo; +[峬庯晡逋餔鵏]>bū; +[㙛㨐䀯䋠䒈䪁䪔卟哺捕补補鳪]>bǔ; +[㘵㚴㳍㻉㾟䊇䍌䏽䑰䝵䬏䳝䴝䴺不佈吥咘埔埗埠布怖悑捗步歨歩篰荹蔀部郶鈽钚钸餢鮬]>bù; +[嚓擦]>cā; +礤>cǎ; +[䟃䵽囃]>cà; +猜>cāi; +[㒲䴭才材溨犲纔裁財财]>cái; +[㥒䌽䐆䣋倸婇彩採棌睬綵跴踩采]>cǎi; +[䌨䰂埰寀縩菜蔡]>cài; +[傪参-叅喰湌蓡謲飡餐驂骖]>cān; +[㥇㨻㱚㺑䍼䏼䑶䗝䗞䘉䙁䝳䣟䫮䳻嬠嬱惭慙慚残殘蚕蝅蠶蠺]>cán; +[㘔㜗㦧㿊䅟䬫惨慘憯朁黪黲]>cǎn; +[㛑㣓㻮㽩䛹澯灿燦璨粲薒]>càn; +[仓仺伧倉傖凔嵢沧滄舱艙苍蒼螥鶬鸧]>cāng; +[㵴㶓藏鑶]>cáng; +[䅮䢢賶]>càng; +[撡操糙鄵]>cāo; +[㜖㯥䄚䏆䐬嘈嶆曹曺槽漕艚蓸螬褿鏪]>cáo; +[䒑愺懆艸草騲]>cǎo; +[䒃肏襙]>cào; +[㥽㨲㩍䇲䈟䊂䔴䜺侧側冊册厕厠嫧廁恻惻憡拺敇测測畟矠笧策筞筴箣粣茦萗蓛遪頙]>cè; +[嵾梫]>cēn; +[㞥㻸䃡䅾䤁䨙䯔䲋埁岑梣橬涔笒]>cén; +曽>cēng; +[㬝䁬䉕层層嶒曾碀竲鄫]>céng; +[㣒蹭]>cèng; +[偛嗏嫅扠挿插揷杈槎疀肞臿艖銟靫餷馇]>chā; +[㢉㢒㪯㫅䁟䆛䑘䕓䤩䲦䶪垞察嵖搽查査檫痄碴秅茶詧鍤锸𦉆]>chá; +[䰈蹅鑔镲]>chǎ; +[㛳㢎㣾㤞䊬䒲䓭䟕䡨侘奼姹岔差汊紁衩訍詫诧]>chà; +叉>cha; +[拆芆釵钗]>chāi; +[㑪㾹䓱侪儕喍柴祡豺]>chái; +茝>chǎi; +[㳗䘍囆瘥虿蠆袃]>chài; +[幨惉搀攙梴袩裧襜辿鋓]>chān; +[㔆㙻㢆㶣㸥㺥䂁䜛䡪䡲䣑䤫䧯僝儃劖嚵婵嬋孱巉廛棎欃毚湹潹潺澶瀍瀺煘獑磛禪緾繵纏纒缠艬蝉蟬蟾誗讒谗躔鄽酁鋋鑱镵饞馋]>chán; +[㢟㦃㯆㹌㹽䊲䐮䑎䤘䥀䩶䴼䵐丳产冁刬剗剷囅嵼幝摌旵浐滻灛燀產産簅繟蒇蕆諂譂讇谄鏟铲閳闡阐驏骣]>chǎn; +[㙴㬄㵌䀡䠨䪜䱿儳忏懴懺硟羼韂顫颤]>chàn; +[伥倀娼昌晿淐猖琩菖裮錩锠閶阊鯧鲳鼚]>chāng; +[㙊㦂䗅䠆䯴仧偿償兏嘗嚐塲嫦尝常徜瑺瓺甞肠腸膓苌萇鋿鏛镸鱨鲿]>cháng; +[㫤䕋䠀僘厂厰场場廠昶氅鋹]>chǎng; +[䩨倡唱怅悵暢焻畅畼誯韔鬯]>chàng; +敞>chang; +[弨怊抄欩罺訬超鈔钞]>chāo; +[䄻䬤䰫嘲巢巣晁朝樔潮窲謿轈鄛鼂鼌]>cháo; +[㶤㷅䎐䏚吵巐炒煼眧麨]>chǎo; +[仦仯耖觘]>chào; +[伡俥唓砗硨莗蛼車车]>chē; +[㨋㵔䋲䞣䰩偖扯撦]>chě; +[㔭㥉㬚㯙㱌㵃㾝㿭䁤䑲䒆䚢䛸䜠䧪䨁勶坼屮彻徹掣撤澈烲爡瞮硩聅轍辙迠]>chè; +[棽琛瞋諃謓賝郴]>chēn; +[㕴㫳㲀㴴㽸䆣䒞䚘䜟䟢䢅䢈䢻䣅䤟塵宸尘屒忱愖敐曟樄沈沉煁臣茞莀莐蔯薼螴訦諶谌軙辰迧鈂陈陳霃鷐麎]>chén; +[䫖墋捵硶碜磣祳贂趻踸鍖]>chěn; +[㧱䞋儬儭嚫夦榇櫬疢藽衬襯讖谶趁趂齓齔龀]>chèn; +晨>chen; +[䞓偁噌埥憆撐撑棦橕檉泟浾爯琤瞠称稱穪竀緽蛏蟶赪赬鏿阷頳饓]>chēng; +[㞼㨃㲂㼩䁎䄇䆑䆵䆸䇸䔲䗊䧕䫆䮪丞乗乘呈城埕堘塍塖娍宬峸惩憕懲成承挰掁揨晟枨棖椉橙洆浈湞澂澄瀓珵珹程窚筬絾脀脭荿虰裎誠诚郕酲鋮铖騬]>chéng; +[侱塣庱徎悜睈逞騁骋]>chěng; +[㐼䀕牚秤靗]>chèng; +[吃哧喫嗤噄媸彨彲摛欫瓻痴癡眵瞝笞絺蚩螭訵誺郗骴魑黐齝]>chī; +[㓾㙜㞴㢮㮛䈕䐤䔟䙙䛂䜄䞾䪧䮈䶔䶵倁坻墀岻弛彽徥徲持歭池汦泜竾筂箈箎篪耛茌茬荎蚳謘貾赿趍踟迟遅遟遲馳驰]>chí; +[㘜㟂㢁㢋㱀㳏㶴䊼䑛䜵䜻侈叺呎垑姼尺恀恥拸搋欼歯粎耻蚇袳裭褫誃鉹齒齿]>chǐ; +[㒆㓼㔑㞿㡿㽚䇼䗖䟷䠠䤲䮻䰡䳵乿侙傺勅叱啻彳恜慗憏懘抶敕斥杘栻淔灻炽烾熾痓痸瘛眙翄翅翤觢赤趩跮踅遫鉓銐飭饎饬鶒鷘]>chì; +[充冲嘃徸忡憃憧摏沖浺珫舂茺衝蹖𢥞]>chōng; +[㓽㹐䌬䖝䳯崇崈漴痋翀虫蝩蟲褈隀]>chóng; +[埫宠寵]>chǒng; +[㧤揰銃铳𣀒]>chòng; +[婤怞抽搊犨犫瘳篘霌]>chōu; +[㐜㛶㤽㦞㨶㵞㿧䇺䊭䌧䌷䓓䛬䥒䲖仇俦儔嚋嬦帱幬惆愁懤栦椆焘燽燾畴疇皗稠筹籌紬絒綢绸菗薵裯詶讎讐踌躊酧醻雔雠]>chóu; +[䪮丑丒侴偢吜杻杽瞅矁醜魗]>chǒu; +[䔏殠簉臭臰霔]>chòu; +酬>chou; +[出初岀貙齣]>chū; +[㕏㕑㡡㶆㼥䅳䎝䎤䟞䠂䠧刍厨幮廚曯橱櫉櫥滁犓篨耝耡芻蒢蒭蕏藸蜍趎蹰躇躕鉏鋤锄除雏雛鶵𦷝]>chú; +[㹼䊰䖏䙘储儲処憷杵椘楮檚濋础礎褚齭齼]>chǔ; +[㔘㗰㙇㤕㤘䙕䜴䟣䦌䧁䮞亍俶傗儊处怵拀搐敊斣斶欪歜泏滀琡畜矗竌竐臅荲處触觸豖踀遚鄐閦黜]>chù; +楚>chu; +䫄>chuà; +揣>chuāi; +[㪓膗]>chuái; +㪜>chuǎi; +[䦟䦤䦷踹]>chuài; +[巛川氚瑏穿]>chuān; +[㯌㼷䁣伝传傳圌暷椽歂舩船諯輲遄]>chuán; +[㱛僢喘堾腨舛]>chuǎn; +[串汌賗釧钏]>chuàn; +[䆫刅戧摐牎牕疮瘡窓窗窻]>chuāng; +[㡖䃥䚒䡴䭚噇幢床橦牀疒]>chuáng; +[㵂䇬摤漺闖闯]>chuǎng; +[䎫创刱剏剙創怆愴獊]>chuàng; +[吹炊]>chuī; +[㓃㝽㥨㩾䄲䍋䳠倕垂埀捶搥棰槌湷箠篅腄菙錘鎚锤陲顀]>chuí; +䞼>chuǐ; +龡>chuì; +[媋旾春暙椿櫄膥萅鶞]>chūn; +[㝄㝇㵮㸪䏝䐇䓐䔚䣨䣩䥎䫃唇憌浱淳湻滣純纯脣莼蒓蓴醇醕陙鯙]>chún; +[㖺㿤䄝䏛䐏䞐䦮偆惷睶箺萶蠢踳]>chǔn; +[鶉鹑]>chun; +[戳鎈齹]>chuō; +犳>chuó; +[㚟㲋䂐䃗䄪䆯䇍䋘䍳䓎䮕啜嚽娖婥惙擉歠涰珿畷磭綽繛绰腏諁趠輟辍辵辶逴酫醊鑡齪龊]>chuò; +[偨庛疵薋蠀赼趀趑髊]>cī; +[㓨㘂㘹㤵䂣䆅䈘䖪䛐䧳䨏䭣䲿䳄垐嬨慈柌濨珁瓷甆磁礠祠糍茨詞词辝辞辤辭雌飺餈]>cí; +[㠿佌此泚玼皉紪跐]>cǐ; +[㞖㡹㢀㩞㹂䓧䗹䦻䯸䰍䳐伺佽刺刾朿次絘莿蚝蛓螆]>cì; +[匆囪囱忩怱悤憁暰枞棇樅樬樷漗焧燪瑽璁瞛篵緫繱聡聦聪聰苁葱蓯蔥蟌鍐鍯鏓鏦騘驄骢]>cōng; +[㼻䉘䕺䳷丛从叢婃孮従徖從悰慒淙漎潀灇爜琮誴賨賩錝]>cóng; +[欉藂謥]>còng; +㫶>cǒu; +[傶凑楱湊腠輳辏]>còu; +[粗觕麁麄麤]>cū; +[䓚䢐徂殂豠]>cú; +[㗤㰗䃚䎌䙯䛤䟟䠓䠞䥄䥘䬨促噈塶憱梀槭殧猝瘄瘯簇縬脨蔟趗踧蹙蹴醋鼀]>cù; +[撺攛汆蹿躥鋑]>cuān; +[㠝㭫䆘䰖劗巑櫕]>cuán; +[㵀㸑殩熶爨窜竄篡簒鑹镩]>cuàn; +[催嗺墔崔摧榱槯獕磪竴鏙]>cuī; +[凗慛]>cuí; +[㵏㷃䊫䧽漼璀皠趡]>cuǐ; +[㝮㥞㧘㯔㯜㱖㳃㷪䂱䃀䄟䆊伜倅啐啛忰悴毳淬焠琗疩瘁竁粋粹紣綷翆翠脃脆脺膬膵臎萃顇]>cuì; +[村澊皴邨]>cūn; +[存拵袸]>cún; +[刌忖]>cǔn; +[䍎吋寸籿]>cùn; +[搓撮睉磋蒫蹉遳]>cuō; +[㟇㽨䠡䣜䴾嵯嵳痤矬蔖虘醝鹺鹾]>cuó; +[䂳瑳縒脞]>cuǒ; +[䐣䟶䱜剉剒厝挫措歵莝莡蓌逪銼錯锉错齚齰]>cuò; +[哒噠墶搭撘耷荅褡]>dā; +[㜓㯚㾑㿯䃮䐊䑽䩢䳴䵣匒呾妲怛溚炟畗畣笪答繨荙薘蟽褟詚达迖逹達鐽靼鞑韃]>dá; +打>dǎ; +[大眔]>dà; +[㟷瘩]>da; +[呆呔懛獃]>dāi; +[䚞䚟傣歹歺逮]>dǎi; +[㐲㞭㫹㯂㶡㻖㿃䈆䒫代叇埭岱帒带帯帶廗待怠戴柋殆汏瀻玳瑇甙簤紿緿绐艜袋襶貸贷跢蹛軚軩迨霴靆黛黱]>dài; +[丹儋勯匰单単單噡妉媅担擔殚殫甔眈砃箪簞耼耽聃聸襌躭郸鄲酖頕黕]>dān; +[㔊㕪㽎䃫䉞䮰䱋亶伔刐掸撢撣澸玬瓭疸紞胆膽衴黵]>dǎn; +[㗖㡺㫜㱽㲷㵅㺗䄷䉷䨢䨵䩥䭛䳉但僤啖啗啿噉嚪帎弹弾彈惮憚憺旦暺柦氮沊淡潬澹狚疍瘅癉癚窞腅舕萏蛋蜑觛誕诞鉭钽霮饏馾駳髧鴠]>dàn; +[儅噹嵣当澢珰璫當筜簹艡蟷裆襠]>dāng; +[䣊䣣党挡擋攩欓灙譡讜谠黨]>dǎng; +[䑗䦒凼圵垱壋婸宕愓档檔氹潒璗瓽盪瞊砀碭礑簜荡菪蕩蘯趤逿闣雼]>dàng; +[鐺铛]>dang; +[刀刂幍忉朷氘舠釖魛鱽]>dāo; +[㠀㿒䆃䌦䲽壔导導岛島嶋嶌嶹捣捯搗擣祷禂禱蹈隝隯]>dǎo; +[䧂倒到噵悼檤瓙盗盜稲稻纛翿菿衜衟軇道]>dào; +[㝵㤫㥀㥁㯖䙷䙸嘚徳德恴惪淂鍀锝]>dé; +[地得的]>de; +[噔嬁灯燈璒登竳簦覴豋蹬鐙镫]>dēng; +[䒭戥朩等]>děng; +[䠬䮴僜凳墱嶝櫈瞪磴邓鄧隥霯]>dèng; +[仾低堤墑滴眡磾羝菂袛趆鍉鞮]>dī; +[㣙㰅㹍䊮䨀䨤䮤䯼䴞䵠仢唙啇嘀嚁嫡廸敌敵梑涤滌潪狄笛篴籴糴翟荻蔋蔐藡覿觌豴蹢迪鏑镝靮頔鸐]>dí; +[㡳㪆㭽䂡䍕䢑䣌䱃呧坘埞底弤抵拞掋柢氐牴砥聜苖茋菧觝詆诋軧邸阺骶]>dǐ; +[㢩㦅㼵䀸䀿䏑䑭䑯䞶䟡䧝䩘䩚䱱䶍偙僀哋啲坔埊墆墬奃娣嶳帝弟怟慸摕旳杕梊棣楴樀渧焍玓甋睇碲祶禘第締缔肑腣蒂蔕虳蝃螮諦谛踶軑轪递逓遞遰釱鉪馰]>dì; +嗲>diǎ; +[傎厧嵮巅巓巔掂攧敁槇槙滇甸瘨癫癲蹎顚顛颠齻]>diān; +䟍>dián; +[㚲㸃䍄䓦典嚸奌婰敟点琠痶碘蕇踮點]>diǎn; +[㓠㝪㞟㥆㵤㶘㼭䧃佃坫垫墊壂奠婝店惦扂橂殿淀澱玷琔电痁癜磹簟蜔鈿钿阽電靛]>diàn; +[凋刁叼奝彫扚殦汈琱瞗碉虭蛁貂雕鮉鯛鲷鳭鵰鼦]>diāo; +[㹿䉆屌釕钌]>diǎo; +[㒛㪕䂪䂽䔙䠼䵲伄吊弔掉瘹窎窵竨莜蓧藋訋調调釣銱鋽鑃钓铞魡]>diào; +[爹跌]>diē; +[㑙㥈㦶㩸㩹㫼㬪㭯㲲㲳㷸㻡䏲䘭䞇䞕䠟䪥䮢䲀䳀䴑叠喋垤堞峌嵽恎戜挕昳曡氎牃牒瓞畳疉疊眣眰碟絰绖聑胅臷艓苵蜨蝶褋褺詄諜谍趃跕蹀迭镻鰈鲽]>dié; +[惵耊耋]>diè; +[丁仃叮奵帄庰玎疔盯釘钉靪]>dīng; +婈>díng; +[㫀㴿㼗嵿檙濎薡酊鐤頂顶鼎鼑]>dǐng; +[㝎啶娗定忊椗矴碇碠磸腚訂订錠锭顁飣饤]>dìng; +[丟丢乣銩铥]>diū; +[东倲冬咚埬娻岽崠崬昸東氡氭涷笗苳菄蝀鯟鶇鸫鼕]>dōng; +[㖦㨂䂢䵔墥嬞懂箽董]>dǒng; +[㑈㓊㗢㜱㢥㼯䅍䍶䞒働冻凍动動垌戙挏栋棟洞眮胨胴腖霘駧]>dòng; +[兜兠吺唗橷篼蔸郖都]>dōu; +[㞳㪷䕱唞抖敨枓枡蚪阧陡]>dǒu; +[㛒㢄㷆䄈䕆䛠䬦斗梪毭浢痘窦竇脰荳豆逗鋀閗闘餖饾鬥鬦鬪鬬鬭]>dòu; +[厾嘟督醏闍阇都]>dū; +[㱩㸿㾄䓯䙱䢱䪅䫳䮷儥凟匵嬻椟櫝殰毒涜渎瀆牍牘犊犢独獨瓄皾碡蝳読讀讟读豄贕鑟韇韣韥騳髑黩黷]>dú; +[䀾䈞䐗堵帾暏琽睹笃篤裻覩賭赌錖]>dǔ; +[䄍䅊䟻䲧喥妒妬度杜殬渡秺簬簵肚荰螙蠧蠹鍍镀靯]>dù; +[偳剬媏端褍鍴]>duān; +短>duǎn; +[㫁㱭䠪塅断斷椴段毈煅瑖碫簖籪緞缎腶葮躖鍛锻]>duàn; +[垖堆塠嵟痽磓頧]>duī; +陮>duǐ; +[㙂㟋㠚㬣㳔㵽䇏䇤䔪䨴䨺䬈䬽䯟兊兌兑对対對怼憝憞懟濧瀩碓祋綐薱譈轛鐓鐜镦队隊]>duì; +[吨噸墩-墫弴惇撉撴敦犜礅蜳蹲蹾驐]>dūn; +[趸躉𣎴]>dǔn; +[㬿䤜伅囤崸庉扽沌潡燉盹盾砘踲逇遁遯鈍钝頓顿鶨]>dùn; +[剟咄哆嚉多夛崜]>duō; +[㣞䐾凙剫夺奪悳掇敓敚敠敪椯毲痥莌裰襗踱鈬鐸铎鮵]>duó; +[㔍㖼㙐㛆㛊㥩㻔䒳䙤䠤䤪䩣䫂䯬亸哚嚲垛垜埵奲憜挅挆朶痑綞缍趓躱躲鍺锗鬌]>duǒ; +[㧷㻧䅜䍴䑨䙃䙟䤻䩔刴剁堕墮墯尮嶞惰柁柮桗炧炨舵跥跺陊陏飿饳]>duò; +朵>duo; +[妸妿娿婀婐屙峉痾鈳钶]>ē; +[㼂㼰䄉䕏䖸䩹䱮䳗䳘俄吪娥峨峩枙涐珴皒睋硪磀莪蛾訛誐譌讹迗鈋隲頟額额騀魤鵝鵞鹅]>é; +[㼢噁]>ě; +[㓵㔩㕎㖾㗁㟧㠋㡋㦍㧖㩵㮙㱦㷈䆓䑥䑪䓊䔾䙳䛖䝈䞩䣞䫷䳬偔僫卾厄呃呝咢咹噩圔垩堊堨堮岋崿嶭恶悪惡愕戹扼掠搤搹櫮湂琧略砐硆胺腭苊萼蕚蚅蝁覨詻諤讍谔豟貖軛軶轭遌遏鄂鍔鑩锷閼阏阨阸頞顎颚餓餩饿魥鰐鱷鳄鶚鹗齶]>è; +[誒诶]>éi; +[奀恩煾蒽]>ēn; +䅰>ěn; +[䊐䬶䭓䭡摁]>èn; +[㖇㜨㧫㮕䋩䎟䎠䮘侕児唲栭檽洏而耏聏胹荋袻輀轜陑隭髵鮞鲕鴯鸸]>ér; +[㚷㢽䋙䌺尒-尔峏栮洱爾珥耳薾迩邇餌饵駬]>ěr; +[㒃㛅䎶䏪䣵二佴刵咡弍弐樲毦眲衈誀貮貳贰鉺铒]>èr; +[傠发彂橃沷発發瞂]>fā; +[㕹㘺䇅䣹乏伐垡姂栰疺砝筏罚罰罸茷藅閥阀]>fá; +[䂲佱法灋髮]>fǎ; +[㛲䒥珐琺蕟髪]>fà; +[僠噃嬏帆幡旙旛杋番笲籓繙翻轓飜鱕]>fān; +[㠶㸋㺕䀀䀟䉒䊩䋣䋦䌓䡊䪛䪤䫶䭵䮳凡-凣勫墦忛憣柉棥樊橎瀪瀿烦煩燔璠矾礬籵緐繁羳膰舧蕃薠藩蘩蠜襎蹯釩鐇钒颿鷭]>fán; +[䒠䛀反瓪軡返魬]>fǎn; +[㕨㝃㤆㴀㶗㼝㽹䉊䐪䒦䣲奿嬎梵氾汎泛滼犯畈盕笵範范訉販贩軓軬鄤飯飰饭飯]>fàn; +[匚方枋汸淓牥芳蚄邡鈁钫鴋]>fāng; +[㤃埅妨房肪防魴鰟鲂鳑]>fáng; +[㑂㕫㧍㯐䢍䦈䲱仿倣旊昉昘瓬眆紡纺舫訪访髣鶭]>fǎng; +[放趽]>fàng; +坊>fang; +[啡妃婓扉渄猆緋绯菲蜚裶霏非靟飛飝飞馡騑騛鯡鲱]>fēi; +[䈈淝肥腓萉蜰]>féi; +[㥱䕁䨽䨾匪奜悱斐朏棐榧篚翡蕜誹诽餥]>fěi; +[㔗㩌㭭㵒䆏䉬䑔䕠䚨䛍䠊䤵䰁俷剕厞吠屝废廃廢昲曊杮櫠沸濷狒疿痱癈砩肺胇芾蟦費费鐨镄靅鼣]>fèi; +[兝分吩岎帉昐朆氛燓砏紛纷翂芬衯訜酚鈖隫雰餴饙鳻𦐈]>fēn; +[㷊㸮䩿䯨䴅坆坟墳妢幩弅枌梤棻棼橨汾濆炃焚燌獖玢秎羒肦蒶蕡蚠蚡豮豶轒鐼馚馩魵黂鼖鼢]>fén; +[㥹粉羵黺]>fěn; +[㖹㮥㿎份偾僨坋奋奮忿愤憤瀵粪糞膹鱝鲼]>fèn; +[丰仹偑僼凨凬凮堼夆妦寷封峯峰崶捀枫桻楓檒沣灃烽熢犎猦疯瘋盽砜碸篈莑葑蘴蜂蠭豐鄷酆鋒鏠锋靊風飌风麷]>fēng; +[㦀㵯䏎䙜䩼冯堸摓沨浲渢漨綘艂逢馮]>féng; +[䟪唪覂諷讽]>fěng; +[㡝俸凤奉湗焨煈甮縫缝賵赗鳯鳳鴌]>fèng; +[仏坲]>fó; +[䳕剻哹紑裦]>fóu; +[否殕缶缹缻芣雬鴀]>fǒu; +[椱竎]>fòu; +[伕呋妋姇孵尃怤懯敷旉枹柎泭玞砆稃筟糐綒罦肤膚荴衭豧趺跗邞鄜鈇鳺麩麬麱麸]>fū; +[㚕㜑㟊㠅㤔㪄㫙䃽䋹䌿䍖䑧䒀䔰䕎䘠䞞䟮䡍䨗䪙䵗䵾乀伏佛俘冹凫刜匐咈嚩垘孚岪巿帗幅幞弗彿怫払扶拂服枎柫栿桴棴氟洑浮涪澓炥烰玸琈甶畉畐癁祓福符笰箙粰紱紼絥綍绂绋罘翇艀艴芙苻茀茯莩菔葍虙蚨蜉蝠諨踾輻辐郛鉘鉜韍韨颫髴鮄鳧鳬鴔鵩鶝福]>fú; +[㓡㕮䋨䌗䓛䗄䩉䫍䫝䯽乶俌俛俯呒嘸府弣抚拊捬撫斧暊滏焤盙秿簠腐腑莆蚥蜅輔辅郙釜釡頫鬴鯆黼]>fǔ; +[㙏㚆㤱㬼㳇㵗㽬㾈䂤䎅䒇䘀䘄䝾䞜䞯䞸䟔䠵䦣䧞䨱䭸䮛䯱付偩冨副圑坿复妇婏婦媍嬔富峊復榑父祔稪紨緮縛缚胕腹萯蕧蚹蛗蝜蝮袝複褔覆訃詂讣負賦賻负赋赙赴輹鍑鍢阜阝附陚馥駙驸鮒鰒鲋鳆黻𦱖]>fù; +[傅咐夫甫袱]>fu; +[嘎嘠]>gā; +[尜錷]>gá; +[尕玍𠁥]>gǎ; +尬>gà; +[侅垓姟峐晐畡祴胲荄該该豥賅赅郂陔隑]>gāi; +[䪱忋改絠]>gǎi; +[㕢㧉㮣䏗丐乢匃匄戤摡概槩槪溉漑瓂盖葢蓋賌鈣钙𩕭]>gài; +[乹乾亁凲坩尲尴尶尷嵅忓攼杆柑泔玕甘疳矸竿筸粓肝芉苷虷蜬迀鳱]>gān; +仠>gán; +[㺂䃭䇞䔈䤗䵟感擀敢桿橄澉灨皯盰秆稈衦贑赶趕鱤鳡]>gǎn; +[䯎䲺倝凎干幹旰榦檊汵涻淦簳紺绀詌贛赣骭]>gàn; +[冈冮刚剛堈堽岡掆杠棡牨犅碙笐綱纲缸罁罓罡肛舡鋼鎠钢]>gāng; +[㟠㟵㽘䴚岗崗港]>gǎng; +[戅-戇槓焵筻]>gàng; +[槔槹橰櫜滜皋皐睾篙糕羔羙膏臯餻高髙鷎鼛𦤎]>gāo; +[㚏㚖㾸䗣夰搞暠杲槁檺稾稿筶縞缟菒藁藳]>gǎo; +[叝吿告煰祮祰禞誥诰郜鋯锆鯌]>gào; +[割咯哥圪戈戓戨搁擱歌渮滒牁牫牱疙肐胳謌鎶鴚鴿鸽麧𪃿]>gē; +[㗆㝓㠷㦴㨰㪾㵧㷴䆟䈓䐙䕻䗘䘁䛋䛿䢔䨣䩐䪂䪺䫦佮匌呄嗝噶塥愅挌搿敋格槅獦膈臵茖蛒裓觡諽輵轕郃鎘镉閣閤阁阖隔革鞷韐韚骼鮯鰪齃]>gé; +[哿擖笴舸葛]>gě; +[䧄个個各嗰箇虼鉻铬]>gè; +[給给]>gěi; +[刯剆根跟]>gēn; +哏>gén; +䫀>gěn; +[㫔㮓亘亙艮茛]>gèn; +[庚揯搄浭畊秔稉粳絙絚緪縆羮羹耕菮賡赓鶊鹒]>gēng; +[㾘䋁䌄哽埂峺挭梗綆绠耿莄郠骾鯁鲠]>gěng; +[䱍䱎䱭䱴堩更]>gèng; +[供公功匑厷塨宫宮工幊弓恭愩攻杛玜疘碽篢糼肱觥觵躬躳釭魟龏龔龚]>gōng; +[㤨㧬㫒㭟㺬㼦䂬䡗巩拱拲栱汞珙穬蛬銾鋛鞏]>gǒng; +[㓋㔶㯯䇨䢚共廾羾貢贡]>gòng; +蚣>gong; +[勾沟溝篝緱缑耩芶褠鈎鉤钩鞲韝]>gōu; +[㺃岣枸狗玽笱耇-耉苟茩蚼豿]>gǒu; +[㗕㜌㝅㝤㨌㳶䃓䝭䞀傋冓坸垢够夠姤媾彀搆撀构構煹覯觏訽詬诟購购遘雊骺]>gòu; +[估呱夃姑嫴孤柧橭沽泒痼笟箍箛罛苽菰蛄觚軱辜酤鈲鮕鴣鸪]>gū; +[䜼䮩鶻鹘]>gú; +[㒴㚉㯏㼋㾶䀇䀜䀦䀰䅽䊺䍍䐨䡩䵻古唂唃嘏尳愲扢杚榖毂淈濲瀔焸牯狜皷皼盬瞽穀糓縎罟羖股脵臌蓇薣蛊蛌蠱詁诂谷轂鈷钴餶馉骨鼓鼔]>gǔ; +[㧽㽽䍛䓢䶜僱凅固堌崓崮怘故梏棝榾牿祻稒錮锢雇頋顧顾鯝鲴鶮]>gù; +[咕菇]>gu; +[刮劀懖栝桰煱瓜瘑筈緺聒胍脶腡葀趏踻銽頢颳騧鴰鸹]>guā; +[㒷䈑冎剐剮叧寡]>guǎ; +[卦啩坬挂掛絓罣罫褂詿诖髺]>guà; +乖>guāi; +[拐枴柺箉]>guǎi; +[㧔㷇㽇䂯䊽叏夬怪恠旝癐]>guài; +[倌关冠官棺瘝癏蒄覌観觀观関闗關鱞]>guān; +[䏓䗆䘾䦎䩪䪀䲘琯痯筦管脘舘輨錧館馆鳤館]>guǎn; +[㮡㴦䌯䎚䗰䙛䙮䝺丱悹悺惯慣掼摜樌毌泴涫潅灌爟瓘盥矔礶祼罆罐謴貫贯遦鏆鑵雚鱹鸛鹳]>guàn; +[侊僙光咣垙姯洸灮炗炛烡珖胱茪輄銧黆]>guāng; +[广広廣犷獷]>guǎng; +[㫛桄櫎臦臩逛]>guàng; +[亀傀圭妫媯嫢嬀帰归摫椝槻槼歸溈珪瑰璝瓌皈硅窐膭袿規规邽郌閨闺鬶鬹鮭鲑龜龟]>guī; +潙>guí; +[㔳㧪㨳㩻㲹㸵䁛䍯䞈䞨䣀䤥佹匦匭厬垝姽宄庋庪恑攱晷氿癸祪簋蛫蟡觤詭诡軌轨陒鬼]>guǐ; +[㙺㪈䇈䌆䍷䐴䖯䙆䝿䠩䯣䰎䳏刽刿劊劌匮匱嶡巜攰昋暩柜桂櫃溎炔筀蓕襘貴贵跪鞼鱥]>guì; +裩>gūn; +[㙥㫎㯻䃂䎾䜇丨掍滚滾磙緄绲蓘蔉衮袞袬輥辊鮌鯀鲧]>gǔn; +[䵪棍璭睴]>gùn; +[埚堝墎崞濄蝈蟈郭鈛鍋锅]>guō; +[㕵㖪㚍㶁䂸䆐䐸䤋䬎囯囶囻国圀國帼幗慖掴摑漍簂聝腘膕虢馘]>guó; +[㞅䙨䴹惈果椁槨淉猓粿綶菓蜾裹輠鐹餜馃]>guǒ; +[㳀腂过過]>guò; +[啯嘓]>guo; +[哈𠀀]>hā; +蛤>há; +[咍咳嗨]>hāi; +[㜾㨟䠽䯐䱺孩还還頦颏骸]>hái; +[海烸酼醢]>hǎi; +[㤥㦟㧡㺔䇋亥嗐害氦餀饚駭骇𠀅𥩲]>hài; +[唅嫨憨炶甝蚶谽酣頇顸馠魽鼾]>hān; +[㖤㙈㙔㟏㟔㮀㶰㼨䈄䗙䤴䥁䨡䮧䶃佄函凾含圅娢寒崡晗梒涵焓琀筨肣邗邯鋡韓韩]>hán; +[㘎㘕㘚㙳㵎㸁㺖㽉䍐䍑䓍䓿䛞厈喊浫罕蔊豃鬫]>hǎn; +[㑵㒈㜦㢨㨔㪋㲦㵄㽳䁔䌍䎯䏷䐄䕿䖔䘶䧲䫲傼哻垾娨屽悍憾扞捍撼攌旱晘晥暵汉汗浛涆淊漢澏瀚焊熯猂皔睅翰莟菡蛿蜭螒譀豻貋釬銲鋎閈闬雗頷顄颌颔馯駻鶾]>hàn; +夯>hāng; +[㤚䀪䘕䲳斻杭桁沆肮航苀蚢貥迒頏颃魧]>háng; +[汻酐]>hǎng; +[䟘䣈䦳䴂]>hàng; +[侾嚆蒿薅]>hāo; +[㕺㠙㩝㬔䝥䧫儫勂嗥嘷噑嚎壕椃毫濠獆獋獔籇蠔諕譹豪]>háo; +[好恏郝]>hǎo; +[㘪㙱㚪㝀㞻㬶㵆䒵䚽䝞䧚䪽䬉䯫傐号哠峼悎昊昦晧暤暭曍浩淏滈澔瀥灏灝皓皜皞皡皥秏耗聕薃號鄗鎬镐顥颢鰝]>hào; +[喝嗬峆抲訶诃]>hē; +[㓭㔠㕡㥺㪉㭘㭱㮝㮫㹇㿣䃒䅂䒩䕣䞦䢗䫘䳚䶅何劾厒合咊和哬啝姀廅惒敆曷柇核楁毼河涸滆澕熆狢盇盉盍盒礉禾秴篕紇纥翮耠荷菏萂蒚蚵蝎螛覈訸詥貈貉釛鉌閡闔阂鞨頜餲魺鲄鶡鹖齕龁龢]>hé; +[㕰㦦㬞㵑㷎㷤䎋䓼䚂䪚䳽䴳䵱佫俰嗃壑暍焃煂熇爀癋皬碋翯蠚袔褐賀贺赫隺靎靏鶴鸖鹤鶴]>hè; +[嘿潶黑黒]>hēi; +[㯊拫痕鞎]>hén; +[䓳佷很狠詪]>hěn; +恨>hèn; +[亨哼悙脝諻]>hēng; +[㔰㶇䄓䒛䬖䬝䯒姮恆恒揘楻横橫珩蘅衡誙鐄鑅韹鴴鸻黉黌]>héng; +[啈撔澋絎绗]>hèng; +[叿呍哄揈渹烘焢薨訇谾軣輷轟轰鍧顭鬨]>hōng; +[㖓㢬䂫䃔䆖䉺䍔䜫䞑䡌䡏䧆䨎䩑䪦䫹䫺䲨仜吰垬妅娂宏宖峵嵤弘彋汯泓洪浤渱潂灴玒硔硡竑竤篊粠紅紘紭綋红纮翃翝耾舼苰荭葒葓虹訌讧谹谼鈜鉷鋐閎闳霟鞃鴻鸿]>hóng; +[㬴䀧唝嗊晎]>hǒng; +[㶹澒蕻鍙閧]>hòng; +[㗋㤧㬋㮢㺅䂉䗔䙈䫛䳧侯喉帿猴瘊睺矦篌糇翭葔銗鍭餱鯸齁]>hóu; +[㖃㸸吼犼]>hǒu; +[㕈㫗䞧䪷厚后垕堠後洉缿豞逅郈鄇鮜鱟鲎鲘]>hòu; +候>hou; +[匢匫呼唿啒嘑垀寣峘幠忽惚昒曶欻歑泘滹烀烼苸虍虖軤轷雐]>hū; +[㗅㪶㯛㹱㾰㿥䁫䈸䉉䉿䊀䎁䔯䚛䞱䠒䧼䩴䭅䭌䭍䮸喖嘝囫壶壷壺媩弧抇搰斛楜槲湖瀫焀煳狐猢瑚瓳箶絗縠胡葫蔛蝴螜衚觳醐鍸頶餬鬍魱鰗鵠鶘鶦鹄鹕]>hú; +[䗂乕浒滸琥萀虎虝]>hǔ; +[㕆㦿㨭㸦㺉䇘䍓䕶䛎䨥䨼䪝䲵互冱冴嚛婟嫭嫮岵帍弖怙戶-戸戽扈护摢擭昈枑楛槴沍沪滬熩瓠祜笏簄綔蔰謼護鄠頀鳸]>hù; +[乎唬糊]>hu; +[哗嘩花芲錵鷨𢄶]>huā; +[㕲㟆㠏㦊㭉㮯䅿䏦䔢䱻䶤华嬅崋滑狯猾磆華蕐螖譁釫鏵铧驊骅]>huá; +蘳>huǎ; +[㓰㕦㕷㚌㠢㦎㩇䛡䠉划劃化婳嫿摦杹桦槬樺澅画畫畵繣舙觟話諣譮话]>huà; +竵>huāi; +[㜳䃶䈭䴜佪徊怀懐懷槐櫰淮瀤耲褢褱踝]>huái; +[咶坏壊壞孬蘹蘾諙]>huài; +[嚾懽歓犿獾讙貛酄驩鴅鵍]>huān; +[㡲㦥㵹㶎㿪䍺䝠䥧䦡䭴䮝䴟嬛寏寰懁捖桓梡洹澴狟环環瓛糫繯缳羦肒荁萈萑豲貆鍰鐶锾镮闤阛雈鬟]>huán; +[㣪㬊䈠唍嵈睆緩缓藧輐]>huǎn; +[㓉㕕㪱㬇㹖㼫䀓䀨䆠䯘唤喚喛垸奂奐宦幻患愌换換擐梙槵涣渙漶烉焕煥瑍痪瘓豢轘逭鰀]>huàn; +[欢歡]>huan; +[嚝塃巟慌朚肓荒衁]>huāng; +[㞷㾠㾮䅣䊗䊣䍿䐵䑟䞹䪄䮲䳨偟兤凰喤堭墴媓崲徨惶撗湟潢煌熿獚瑝璜癀皇磺穔篁簧艎葟蝗蟥趪遑鍠锽隍餭騜鰉鱑鳇鷬黃黄𪏙]>huáng; +[㤺㬻䁜䌙䐠宺幌怳恍愰晄榥滉炾熀皝詤謊谎鎤𣄙]>huǎng; +[㨪曂皩軦]>huàng; +晃>huang; +[咴噅噕婎幑徽恢悝拻挥揮撝晖暉洃瀈灰烣煇禈翚翬袆褘詼诙豗輝辉隓隳顪鰴麾]>huī; +[囘回囬廻廽恛洄痐茴蚘蛔蛕蜖迴逥鮰]>huí; +[㩓㷐䃣䏨䛼悔檓毀毁毇烠燬芔虺蝰譭𠧩]>huǐ; +[㑰㑹㒑㜇㞧㤬㥣㨤㨹㩨㬩㰥㱱㷄㻅䂕䅏䇻䌇䕇䙌䙡䛛䜋䤧䧥䩈䫭会僡儶匯卉喙嘒噧嚖圚嬇寭廆彗彙彚恚恵惠慧憓晦暳會槥橞櫘殨汇泋湏滙潓濊烩燴獩璯瞺秽穢篲絵繐繢繪绘缋翙翽荟蔧蕙薈藱螝蟪詯誨諱譓譿讳诲賄贿鏸鐬闠阓靧韢頮颒餯饖]>huì; +[婚惛惽昏昬棔殙涽睧睯荤葷閽阍]>hūn; +[㑮㨡䛰䫟䰟䴷堚忶棞楎浑渾珲琿繉轋顐餛餫馄魂鼲]>hún; +[睔鯶]>hǔn; +[㥵䅙䅱䚠䧰俒倱圂慁混溷焝觨諢诨]>hùn; +[劐豁鍃锪]>huō; +[䄆䄑䣶䯏佸活秮秳萿鈥钬]>huó; +[伙夥火邩]>huǒ; +[㗲㘞㦜㦯㨯㯉㸌䁨䂄䄀䉟䋭䦚䰥剨咟嗀嚄嚯嚿奯彟彠惑或捇掝攉旤曤楇檴沎湱濩瀖獲瓁癨眓矆矐矱砉礊祸禍穫耯臒臛艧获蓃藿蠖謋讗貨货鑊镬閄雘霍霩靃韄騞鱯鳠鸌鹱嗀]>huò; +硧>iǒng; +[䤠丌乩僟击刉刏剞勣叽咭唧喞嗘嘰圾基墼姫姬尐屐峜嵆嵇擊朞机枅樍機櫅毄激犄玑璣畸畿矶磯禨积稘稽積笄筓箕簊績绩羁羇羈耭聻肌虀虮蛣襀覉覊觭諅譏譤讥賫賷赍跡跻蹟躋躸迹銈鐖鑇鑙隮雞鞿韲飢饑饥鰿鳮鶏鷄鸡麡齎齏齑𠼻]>jī; +[㔕㖢㗊㗱㘍㙫㞃㠍㠎㡇㡮㤂㥛㧀㭲㮟㮨㱞㲺㴕㻷㽺㾊䁒䐕䐚䚐䞘䟌䣢䩯䯂䲯䳭亟亼伋佶偮卙即卽及吉堲塉姞嫉岌嵴嶯庴彶忣急愱戢揤撃擮极棘楫極槉橶檝殛汲湒漃潗濈焏狤疾瘠皍礏禝笈箿籍級级耤脊膌芨莋蒺蓻蕀蕺蝍螏襋觙踖蹐轚郆鈒銡鍓鏶钑集雦雧霵鞊鴶鶺鸄鹡]>jí; +[㚡㞆㞛㞦㦸㨈㴉䍤䢳䤒丮几妀己幾戟挤掎撠擠泲犱玘穖蟣踦鈘魕魢鱾麂]>jǐ; +[㑧㒫㙨㠖㠱㡭㡶㥍㭰㰟㲅㳵㸄㹄㻑㾒㾵䋟䐀䒁䓫䓽䗁䜞䝸䠏䢋䦇䨖䮺䰏䶓䶩伎兾冀剂剤劑哜嚌坖垍塈妓季寂寄彐彑忌悸惎懻技旡-旣暨曁梞檕檵洎济済漈濟瀱猤璾痵瘈癠瞡祭稩稷穄穊穧紀継繼纪继罽臮芰茍茤葪蓟蔇薊蘎蘮蘻裚褀覬觊計記誋计记跽际際霁霽驥骥髻鬾魝鮆鯚鯽鰶鱀鱭鲚鲫鵋齌𡜱]>jì; +[輯辑]>ji; +[乫伽佳傢加嘉夹夾家幏拁枷毠泇犌猳珈痂笳耞腵茄葭袈豭貑跏迦鉫鎵镓鴐麚]>jiā; +[㪴㮖㼪㿓䀫䀹䕛䛟䩡唊圿埉恝戛戞扴梜浃浹硈舺荚莢蛱蛺袷裌跲郏郟鉿鋏铗铪鞂鞈頬頰颊餄饸鵊]>jiá; +[㕅䑝仮假叚婽岬徦斚斝椵榎槚檟玾甲瘕胛賈贾鉀钾]>jiǎ; +[䁍价価價嫁架榢駕驾]>jià; +稼>jia; +[偂兼冿囏坚堅奸姦姧尖惤戋戔揃搛椷樫櫼歼殲湔瀐瀸煎熞熸牋犍猏玪监監睷碊礛笺箋篯籛緘縑缄缣肩艰艱菅菺葌蒹蕑蕳虃豜豣鑯間间靬鞬鞯韀韉顅餰馢騝鬋魐鰜鰹鲣鳒鳽鵳鶼鹣麉]>jiān; +[㔓㨵㳨㶕䄯䅐䉍䛳䟰䩆䭠䮿䯛䯡䵡䵤䶠俭倹儉减剪囝堿寋弿戩戬拣挸捡揀撿暕柬检検檢減湕瀽瑐睑瞼硷碱笕筧简簡絸繭翦茧藆蠒裥襇襺謇謭譾谫趼蹇鐗鐧锏鰔鹸鹻鹼]>jiǎn; +[㓺㔋㣤㦗㨴㯺㰄㺝䇟䟅䤔䥜䧖䬻䭈䭕䵖䵛件侟俴俿健僣僭剑剣剱劍劎劒劔建徤擶旔枧栫梘楗榗毽洊涧渐溅漸澗濺瀳牮珔磵箭糋繝腱臶舰艦荐蔪薦螹襉見覵覸见諌諓諫譼谏賎賤贱趝践踐踺釼鉴鋻鍳鍵鏩鑑鑒鑬鑳键餞饯鰎]>jiàn; +[僵壃姜将將摪橿殭江浆漿瓨畕畺疅疆礓繮缰翞茳葁薑螀螿豇韁鱂鳉𤕭]>jiāng; +[㢡㯍䁰䉃䋌䒂䙹奖奨奬桨槳滰獎膙蒋蔣襁講讲顜]>jiǎng; +[䞪匞夅嵹弜弶摾洚犟糡糨絳绛蔃袶謽酱醤醬降𢘸]>jiàng; +匠>jiang; +[䴔交僬嘄姣娇嬌峧嶕憍憿椒浇澆焦燋礁穚胶膠膲芁茭茮蕉蛟蟂蟭詨跤郊鐎驕骄鱎鴵鵁鷍鷦鷮鹪𨺹]>jiāo; +嫶>jiáo; +[㩰㭂㳅㽱㽲䀊䁶䘨䚩䠛䥞䴛佼侥僥儌剿劋勦孂徺挢捁搅摷撟撹攪敽敿晈暞曒湬漅灚烄煍狡璬皎皦矫矯筊絞繳绞缴脚腳臫虠蟜角譑賋踋鉸铰餃饺鮫鲛]>jiǎo; +[㠐㬭㰾䂃䆗䣤䪒叫呌嘂嘦噍噭嬓峤嶠徼挍敎教敫斠滘漖潐珓皭窌窖訆譥較轎轿较酵醮醶釂]>jiào; +[喈嗟堦巀接掲揭擑椄湝瑎皆秸稭腉菨薢蝔街謯阶階鶛]>jiē; +[㓗㓤㔾㘶㛃㝌㞯㦢㨗㨩㮞㮮㸅䀷䂒䂝䂶䅥䌖䕙䗻䣠䥛䲙倢偈偼傑刦刧刼劫劼卩卪喼婕孑岊崨嵥幯截拮捷搩擳昅杰栉栨桀楬楶榤櫛櫭洁滐潔瀄犵疖癤睫碣竭節結结羯脻节莭葜蓵蜐蠘蠞蠽衱袺訐詰誱讦诘趌踕迼鉣鍻鐑頡颉騔鮚鲒]>jié; +[媎檞解觧飷]>jiě; +[㑘㝏㠹㾏㿍䁓䇒䔿䛺䯰䰺䱄䲸丯介借吤唶堺屆届岕庎徣悈戒楐犗玠琾界畍疥砎紒繲艥芥藉蚧褯誡诫躤鎅魀魪𡽱]>jiè; +姐>jie; +[今埐嶜巾惍斤津珒瑧矜祲筋紟荕菳衿襟觔金钅鹶黅]>jīn; +[㝻㬐㯸㹏䐶䒺䤐䥆䭙仅侭僅儘卺堇尽巹慬槿殣漌瑾盡紧緊菫覲觐謹谨錦锦饉馑]>jǐn; +[㨷㬜㯲㰹㱈㴆㶦㶳䀆䆮䋮䌝䑤䖐䗯䝲䫴䶖伒僸凚劤劲勁噤嚍墐妗嫤嬧搢晉晋暜枃歏浕浸溍濅濜烬燼琎瑨璡璶瘽禁縉缙肵荩蓳藎賮贐赆近进進靳齽]>jìn; +[䴖京亰兢坕坙婛巠惊旌旍晶泾涇猄箐精経經经聙腈茎荆荊莖菁葏驚鯨鲸鵛鶁鶄麖麠黥鼱精]>jīng; +[㘫䜘丼井儆刭剄宑憬憼景暻汬烃烴燛璟璥穽肼蟼警阱頚頸颈]>jǐng; +[㕋㢣㣏㬌㵾㹵䔔䡖䵞俓倞傹净凈境妌婙婧弪弳径徑擏敬曔桱梷浄淨濪瀞獍痉痙竞竟竧竫競竸胫脛葝誩踁迳逕鏡镜靓靖静靚靜靖]>jìng; +睛>jing; +[冂冋坰垧埛扃蘏蘔駉駫]>jiōng; +[㓏㖥㢠㤯㷗㷡䌹䐃䢛侰僒冏囧幜泂炅炯烱煚煛熲皛窘絅綗褧迥逈顈颎]>jiǒng; +[㑋澃]>jiòng; +[丩勼啾揂揪揫朻樛湫牞究糺糾纠萛觓轇醔阄鬏鬮鳩鸠]>jiū; +㺵>jiú; +[㡱久乆九奺灸玖紤舏赳酒镹韭韮]>jiǔ; +[㠇㧕㩆㲃㶭㺩䅢䆒䊆䊘䓘䛮䡂䳎䳔僦匓匛匶厩咎媨就廄廏廐慦捄救旧柩柾桕疚臼舅舊鯦鷲鹫麔齨]>jiù; +[㞐凥刟娵居岨崌抅拘椐檋沮涺狙琚疽眗罝腒艍苴菹葅蜛裾趄跔踙陱雎鞠駒驹鮈鴡鶋]>jū; +[㘲㥌㩴㮂㽤䋰䏱䕮䗇䜯䡞䤎䪕䰬䱡䴗侷匊婅局巈挶掬桔梮椈橘毩毱泦淗焗犑狊箤粷菊蘜諊趜跼踘蹫躹輂郹鄓鋦锔閰鞫駶驧鵙鵴鶪鼳]>jú; +[䃊䄔䅓䈮䢹䶥举咀弆挙擧椇榉榘櫸欅竘筥舉莒蒟蝺袓跙踽齟龃]>jǔ; +[㘌㜘㞫㠪㨿㩀㬬㳥䆽䛯䣰䱟䵕䶙俱倨倶具冣剧劇勮句埧埾壉姖寠屦屨岠巨怇怚惧愳懼拒拠据據昛歫泃洰澽炬焣犋秬窭窶簴粔絇耟聚苣虡蚷詎讵貗距踞躆遽邭醵鉅鋸鐻钜锯颶飓駏鮔]>jù; +矩>ju; +[剶姢娟捐朘涓蠲裐鎸鐫镌鵑鹃]>juān; +[㷷卷埢捲臇菤𩜇]>juǎn; +[㢧㢾㪻㯞䄅䌸䖭䚈䡓䳪倦劵勌勬巻帣慻桊淃狷獧瓹眷睊睠絹绢罥羂鄄錈锩韏飬鬳]>juàn; +[噘屩撅]>juē; +[㓸㔃㔢㟲㤜㩱㭈㭾㰐㵐㷾㸕㹟㻕䀗䁷䆕䆢䇶䋉䍊䏐䏣䐘䖼䘿䙠䝌䞷䠇䡈䦆䦼亅倔傕僪决刔劂勪厥噱嚼孒孓屫崛崫嵑嶥弡彏憠憰戄抉挗捔掘撧攫斍柽桷橛橜欔欮殌氒決潏焆焳熦爑爝爴爵獗玃玦玨珏瑴疦瘚矍矡砄絕絶绝臄芵蕝蕨蚗蟨蟩蠼覐覚覺觉觖觼訣譎诀谲谻貜赽趹蹶蹷躩逫鈌鐍鐝钁镢鱊鱖鳜鴃鷢龣𧽸𩪗]>jué; +[䞵䟾]>juě; +[鴂𠢤]>juè; +[军君均姰桾汮皲皸皹碅莙菌蚐袀覠軍鈞銁銞钧頵鮶鲪麇麏麕]>jūn; +蜠>jǔn; +[㑺㒞㓴㕙㝦㴫㻒㽙䇹䕑䜭䝍俊儁呁寯峻懏捃攈攟晙殾浚濬焌珺畯睃竣箘箟葰蔨郡隽雋餕馂駿骏鵘]>jùn; +咖>kā; +[佧卡咔胩鉲]>kǎ; +髂>kà; +[奒开揩痎鐦锎開]>kāi; +[㡁䁗䐩䒓凯凱剀剴嘅垲塏恺愷慨暟楷蒈輆鍇鎧铠锴闓闿颽]>kǎi; +[㲉䡷勓忾愒愾欬炌炏烗礚]>kài; +[刊勘堪嵁戡栞龕龛]>kān; +[㸝䶫侃偘冚坎埳塪崁惂槛檻欿歁歞砍莰輡轗顑]>kǎn; +[䀍䘓墈看瞰矙磡竷衎闞阚]>kàn; +[嫝康忼慷槺漮穅粇糠躿鏮鱇]>kāng; +[扛摃]>káng; +䡉>kǎng; +[㰠亢伉匟囥抗炕犺砊邟鈧钪閌闶]>kàng; +[尻髛鷱]>kāo; +攷>káo; +[䯪丂拷栲槀洘烤燺稁考薧鮳鲓𥬯]>kǎo; +[䐧犒銬铐靠]>kào; +[峇柯棵樖犐珂疴瞌磕科稞窠簻胢苛萪薖蝌趷軻轲顆颗髁]>kē; +[壳殼]>ké; +[㞹㪃㪙㪡㪼㰤㵣可坷岢嶱敤渇渴炣礍]>kě; +[㕉㤩㾧䙐䶗克刻剋勀勊喀嗑垎堁娔客尅恪愘愙揢搕榼氪溘碦緙缂衉課课醘騍骒]>kè; +[啃垦墾恳懇肎肯肻豤錹齗齦龂龈]>kěn; +[㸧掯珢硍裉褃]>kèn; +[劥吭坈坑奟妔挳摼牼硁硜硻銵鍞鏗铿阬]>kēng; +䡰>kěng; +[倥埪崆悾涳硿空箜錓鵼]>kōng; +[㤟孔恐]>kǒng; +[㸜控鞚]>kòng; +[剾彄抠摳芤袧]>kōu; +[㔚劶口]>kǒu; +[㓂㰯㲄㽛䳟䳹佝冦叩宼寇怐扣敂滱瞉窛筘簆蔲蔻釦鷇𦶲]>kòu; +[刳哭圐堀扝枯桍窟胐跍軲轱郀顝骷]>kū; +[䇢苦]>kǔ; +[㒂㠸俈喾嚳库庫焅瘔矻秙絝绔袴裤褲趶酷]>kù; +[侉咵夸姱荂誇]>kuā; +[垮恗銙錁锞]>kuǎ; +[㐄䋀挎胯跨骻]>kuà; +呙>kuāi; +[㧟䓒擓蒯]>kuǎi; +[㔞㙕㙗㟴㬮㱮䈛䭝䯤䶐侩儈凷哙噲块塊墤廥快桧檜欳浍澮獪禬筷糩脍膾郐鄶駃鬠鱠鲙]>kuài; +[宽寛寬臗髋髖]>kuān; +[㯘䕀䥗䲌欵款歀窾]>kuǎn; +䤭>kuàn; +[劻匡匩哐恇框洭硄筐誆诓軭邼]>kuāng; +[㤮抂狂誑诳鵟]>kuáng; +[俇夼黋]>kuǎng; +[䊯䵃儣况卝圹壙岲懬懭旷昿曠況爌眖眶矌矿礦絖纊纩貺贶躀邝鄺鉱鑛]>kuàng; +[亏刲岿巋盔窥窺茥藈蘬虧鍷闚]>kuī; +[㙓㚝㨒䕫䟸䤆䧶䯓䳫喹夔奎戣揆晆暌楏楑櫆湀犪睽聧葵蘷虁躨逵鄈鍨頯馗騤骙魁]>kuí; +[㛻䠑䦱䫥煃跬蹞頍]>kuǐ; +[㕟䈐䍪䕚喟嘳媿尯愦愧憒撌槶樻溃潰瞆瞶篑簣籄聩聭聵腃蒉蔮蕢鐀鑎餽饋馈騩]>kuì; +[坤堃婫崐崑惃昆晜焜猑琨瑻菎蜫裈褌貇醌錕锟騉髠髡髨鯤鲲鵾鹍]>kūn; +[㩲䠅壸壼悃捆梱硱祵稇稛綑裍閫閸阃齫]>kǔn; +[㫻困涃睏]>kùn; +擃>kuǒ; +[㗥䟯䦢䯺姡廓彉彍扩拡括挄擴漷濶蛞闊阔鞟鞹]>kuò; +[嚹垃拉柆磖翋菈]>lā; +[㕇揦邋]>lá; +[䟑喇藞]>lǎ; +[㸊㻋㻝䂰䃳䏀䓥䗶䝓䪉䱫䶛剌揧攋楋爉瓎瘌腊臈臘蜡蝋蝲蠟辢辣鑞镴鬎鯻癩]>là; +[啦鞡]>la; +[㚓㥎䅘䋱䚅䠭䧒來俫倈婡孻崃崍庲徕徠来梾棶涞淶猍琜筙箂莱萊逨郲錸铼騋鯠鶆麳]>lái; +[䂾唻]>lǎi; +[㠣㾢䄤䓶䲚勑娕櫴濑瀨瀬癞癩睐睞籁籟藾襰賚賴赉赖頼顂鵣]>lài; +[㑣㘓㞩㦨㳕䆾䍀䑌䦨䪍䰐䳿儖兰厱啉囒婪岚嵐幱懢拦攔斓斕栏欄欗澜瀾灆灡燣燷璼礷篮籃籣糷繿葻蓝藍蘫蘭襕襤襴譋讕谰躝钄闌阑韊]>lán; +[㛦㨫㩜㰖䊖䌫壈嬾孄孏懒懶揽擥攬榄欖浨漤灠覧覽览醂顲𡒄]>lǎn; +[㜮㱫䃹嚂壏滥濫烂燗爁爛爤瓓纜缆鑭镧]>làn; +啷>lāng; +[㝗㟍㢃㱢㾿䆡䡙䯖䱶俍勆嫏廊桹榔樃欴狼琅瑯稂筤艆莨蓈蓢蜋螂踉躴郎郞鋃锒]>láng; +[㓪㙟㫰㮾㾗䀶䁁塱朖朗朤烺硠誏閬阆]>lǎng; +[䍚䕞埌崀浪蒗]>làng; +[捞撈]>lāo; +[㗦㞠㟉㟹㨓䃕䜎䝁䲏僗劳労勞哰唠嘮崂嶗憥浶牢痨癆磱窂簩蟧醪鐒铹]>láo; +[㟙㧯䇭䕩䝤䳓䵏佬咾恅栳橑狫老荖轑銠铑]>lǎo; +[嫪憦橯涝澇耢耮軂髝]>lào; +[㔹㖀㦡乐仂叻哷忇扐捋楽樂氻泐玏砳竻簕肋艻阞韷頱鰳鳓]>lè; +[了餎饹]>le; +勒>lēi; +[㒍㔣㵢㹎䉓䍣䐯䨓壨嫘擂檑欙瓃畾縲纍纝缧罍羸蘲虆蠝鐳鑘镭雷靁鼺]>léi; +[㑍㒦㙼㡞㶟㼍㿔䉂䛶䣂䴎傫儡儽厽垒壘樏櫐櫑洡漯灅瘣癗磊磥礨絫耒蕌蕾藟蘽誄讄诔轠鑸頛鸓]>lěi; +[㭩㲕㴃䉪䍥䒹䢮䣦䮑埒攂泪涙淚礌礧禷类累纇蘱酹銇錑頪類颣𩔗]>lèi; +嘞>lei; +[䉄䬋倰塄崚棱楞稜薐]>léng; +冷>lěng; +[䚏䮚堎愣踜]>lèng; +唎>lī; +[㒿㓯㠟㦒㰀㰚㴝㷰㹈㿛䄜䅻䉫䊍䋥䍠䍦䔆䔣䔧䖥䖽䖿䙰䣓䣫䱘䴻䵓䵩刕剓剺劙厘喱嚟囄嫠孋孷廲悡攡梨梩梸棃樆氂漓漦灕犁犂璃瓈睝离穲篱籬粍粚糎縭缡罹艃菞蓠蔾藜蘺蜊蟍褵謧貍邌醨釐鋫錅鏫鑗離騹驪骊鯬鱺鲡鵹鸝鹂黎黧]>lí; +[㸚㾖䗍䤚䧉俚兣娌峛峢峲欐欚浬澧理盠礼禮粴蟸蠡裏豊逦邐醴里鋰锂鯉鱧鲤鳢礼]>lǐ; +[㑦㒧㔏㕸㗚㘑㟳㡂㤡㤦㧰㬏㮚㯤㱹㺡㻎㻺㼖㽁㽝㾐㿨䁻䃯䅄䇐䊪䍽䓞䔁䔉䘈䚕䟏䟐䡃䤙䥶䬅䬆䮋䮥䰛䰜䲞䴄䴡䶘丽例俐俪傈儮儷凓利力励勵历厉厤厯厲吏呖唳嚦囇坜塛壢婯屴岦巁悧悷慄戻戾搮攊攦攭斄暦曆曞朸枥栎栗栛栵棙櫔櫟櫪歴歷沥沴涖溧濿瀝爄爏犡猁珕琍瑮瓅瓑瓥疠疬痢癘癧皪盭矋砅砬砺砾磿礪礫礰禲秝立笠筣篥粒粝糲綟纅脷苈苙茘荔莅莉蒞藶蚸蛎蛠蜧蝷蠇蠣蠫詈讈赲跞躒轢轣轹郦酈鉝隶-隸雳雴靂靋鬁鬲鱱鱳鳨鴗鷅鷑麗麜𥝢]>lì; +[哩李狸裡]>li; +[俩倆]>liǎ; +[㓎㜕㝺㟀㡘㢘㥕㦁㶌㺦㼓㾾䁠䃛䆂䏈䙺䥥䨬䭑亷僆劆匲匳嗹噒奁奩奱嫾帘廉怜慩憐梿槤櫣涟溓漣濂濓熑燫琏璉磏稴簾籢籨縺翴联聫聮聯臁莲蓮薕螊蠊裢褳覝謰譧蹥连連鄻鎌鐮镰鬑鰱鲢𢅏]>lián; +[㦑㪘㯬㰈㰸䇜䌞嬚摙羷脸膦臉莶薟]>liǎn; +[㜃㜻㪝㱨㶑㼑堜媡恋戀敛斂楝歛殓殮浰湅潋澰瀲炼煉瑓練纞练萰蔹蘝蘞裣襝錬鍊鏈链鰊]>liàn; +[㹁䝶䣼䭪凉墚梁椋樑涼粮粱糧綡良輬辌駺]>liáng; +[㒳㔝䓣䠃䩫両两兩唡啢掚緉脼蜽裲魉魎]>liǎng; +[亮哴喨悢晾湸諒谅輌輛辆量鍄]>liàng; +[撩蹽]>liāo; +[㙩㝋㵳䜍䜮䝀䨅僚嘹嫽寥寮屪嵺嶚嶛廫憀摎敹暸漻潦熮獠璙疗療窷簝繚缭聊膋膫蟟豂賿蹘辽遼鐐镣顟飂飉髎鷚鷯鹨鹩]>liáo; +[㶫䄦䑠䩍憭瞭蓼鄝镽]>liǎo; +[㡻㺒䉼䍡䎆䢧尞尥尦廖撂料炓燎爒]>liào; +巤>liē; +䟩>liě; +[㤠㧜㬯㭞㯿㲱㸹㼲㽟䁽䅀䉭䓟䜲䟹䴕儠冽列劣劽埓姴挒捩擸洌浖烈煭犣猎獵睙聗脟茢蛚蛶裂趔躐迾颲鬛鬣鮤鱲鴷]>liè; +咧>lie; +[㔂㝝㷠䚬䢯䫐䮼临亃厸壣嶙惏斴晽暽林淋潾瀶燐獜琳璘甐疄痳瞵矝碄磷箖粼綝繗罧翷臨轔辚遴邻鄰鏻隣霖驎鱗鳞麐麟]>lín; +[㐭㨆䕲僯凛凜廩廪懍懔撛檁檩澟癛癝菻]>lǐn; +[㖁䉮䗲䫰吝恡悋橉焛粦蔺藺蹸躏躙躪轥閵]>lìn; +[拎昤]>līng; +[㖫㡵㥄㦭㪮㬡㯪㱥㲆㸳㻏㾉䄥䈊䉁䉖䉹䌢䍅䔖䕘䖅䙥䚖䠲䡼䡿䧙䨩䯍䰱䴇䴒䴫凌刢囹坽夌姈孁岺朎柃棂櫺欞泠淩澪灵燯爧狑玲琌瓴皊睖砱碐祾秢竛笭紷綾绫羚翎聆舲苓菱蔆蕶蘦蛉衑裬詅跉軨輘酃醽鈴錂铃閝陵零霊霛霝靈駖魿鯪鲮鴒鸰鹷麢齡齢龄龗]>líng; +[呤岭嶺彾袊阾領领]>lǐng; +[令另掕炩]>lìng; +伶>ling; +㶈>liǒng; +[溜熘蹓]>liū; +[㐬㽞䉧䋷䗜䚧䬟䭷䰘䱖䱞䶉刘劉嚠媹嵧懰旈旒榴橊沠流浏瀏琉瑠瑬璢畄留畱疁瘤癅硫蒥蓅藰蟉裗遛鎏鎦鏐镏镠飀飅飗駠駵騮驑骝鰡鶹鹠麍]>liú; +[嬼柳栁桺橮珋綹绺罶羀鉚鋶铆锍飹]>liǔ; +[㙀㨨㶯㽌䄂六坴塯廇澑畂磂翏鐂雡霤餾馏鬸]>liù; +[㚅㝫㡣㦕㰍䃧䆍䏊䙪䥢䪊咙嚨屸嶐巃巄昽曨朧栊櫳泷湰滝漋瀧爖珑瓏癃眬矓砻礱礲竜笼篭簼籠聋聾胧茏蕯蘢蠪蠬襱豅躘鏧鑨隆霳靇鸗龍龒龓龙]>lóng; +[㙙㴳䡁儱垄垅壟壠拢攏竉陇隴]>lǒng; +[㑝㛞㟖㢅哢徿挵梇硦衖贚]>lòng; +窿>long; +[䁖瞜]>lōu; +[㟺㥪㲎㺏䄛䅹䝏䣚䫫䮫䱾剅娄婁廔慺楼樓熡耧耬艛蒌蔞蝼螻謱軁遱鞻髅髏鷜]>lóu; +[㪹塿嵝嶁搂摟甊篓簍]>lǒu; +[㔷屚漏瘺鏤镂陋]>lòu; +[喽嘍]>lou; +[噜嚕]>lū; +[㠠㢳㪭㭔㱺㿖䡎䮉䰕卢嚧垆壚庐廬攎曥栌櫨泸瀘炉爐獹玈璷瓐盧矑籚纑罏胪臚艫芦蘆蠦轤轳鑪顱颅髗魲鱸鲈鸕鸬黸]>lú; +[㔪㢚㯭䕡䲐卤塷掳撸擄擼樐橹櫓滷瀂硵磠舻艣艪蓾虏虜鏀鐪鑥镥魯鲁鹵]>lǔ; +[㓐㖨㛬㜙㟤㦇㪐㪖㫽㯝㯟㼾䃙䌒䎑䎼䐂䘵䚄䟿䡜䩮䱚䴪侓僇剹勎勠圥垏娽峍廘彔录戮摝椂樚淕淥渌漉潞熝琭璐甪盝睩硉碌磟祿禄稑穋箓簏簶籙粶膔菉蔍蕗虂螰觮觻賂赂趢路踛蹗輅轆辂辘逯醁錄録錴鏕鏴陆陸露騄騼鯥鵦鵱鷺鹭鹿麓]>lù; +[榈櫖櫚氀爈瘘瘻膢藘閭闾馿驢驴]>lǘ; +[㭚㻲㾔侣侶偻僂儢吕呂屡屢履挔捛旅梠溇漊祣稆穞穭絽縷缕膂膐褛褸郘鋁铝]>lǚ; +[㔧㠥㲶䔞䢖䥨勴寽嵂律慮氯滤濾率箻綠緑绿膟葎虑鑢]>lǜ; +[㝈㡩㱍䖂䜌圝圞娈孌孪孿峦巒挛曫栾欒滦灓灤癵羉脔臠虊銮鑾鵉鸞鸾]>luán; +卵>luǎn; +[乱亂薍釠]>luàn; +[攣癴]>lüán; +㨼>luè; +[㑼㔀䂮䌎䛚䤣圙擽畧稤鋝鋢锊]>lüè; +[抡掄]>lūn; +[㖮㷍䈁䑳仑伦侖倫囵圇婨崘崙惀沦淪溣綸纶腀菕蜦踚輪轮錀陯鯩]>lún; +[埨稐耣]>lǔn; +[碖論论]>lùn; +絯>lǜn; +[啰囉罗]>luō; +[㑩㼈㽋䊨䯁儸摞椤欏氇氌猡玀箩籮羅萝蔂蘿螺覙覶覼逻邏鏍鑼锣镙饠騾驘骡鸁]>luó; +[㒩㦬㩡㰁㱻倮攞曪瘰癳砢臝蓏蠃裸躶鎯]>luǒ; +[㓢㴖㿚䀩䇔䈷䌱䌴嗠峈洛濼烙犖珞硌笿絡纙络荦落袼酪雒駱骆鮥鴼鵅]>luò; +[妈媽嬤嬷]>mā; +[㦄䗫䳸犘痲蔴蟇麻]>má; +[㐷䣕䣖溤玛瑪码碼蚂螞鎷馬马鰢鷌]>mǎ; +[㑻㜫㨸㾺䯦傌唛嘜帓杩榪犸獁睰祃禡罵閁駡骂]>mà; +[吗嗎嘛蟆]>ma; +[㜥㼮䁲䚑䨪埋薶霾]>mái; +[买嘪荬蕒買鷶]>mǎi; +[䈿䘑䜕䨫䮮佅劢勱卖売眿脈脉蝐賣迈邁霢麥麦]>mài; +[㒼㗄㙢䅼䊡䐽䑱䛲䟂䯶䰋姏悗慲摱槾璊瞒瞞蛮蠻謾谩蹒蹣顢颟饅馒鬘鰻鳗]>mán; +[㛧䜱屘満满滿矕螨蟎襔鏋鮸]>mǎn; +[㗈㡢㬅㵘䕕䝡䝢䡬僈墁嫚幔慢曼漫澫澷熳獌縵缦蔄蔓鏝镘鬗]>màn; +[㝑㟌㟿㡛㻊䀮䅒䈍䟥䵨吂哤娏尨忙恾杗杧氓汒浝牤牻狵痝盲盳硭笀芒茫蘉蛖邙釯鋩铓駹鼆]>máng; +[㙁㟐㬒䁳䒎䖟壾漭硥茻莽莾蟒蠎]>mǎng; +[猫貓]>māo; +[㝟㲠䅦兞堥媌嫹旄枆毛渵牦犛矛罞茅蝥蟊覒軞酕錨锚髦髳鶜]>máo; +[㚹㧇冇卯夘峁戼昴泖笷茆]>mǎo; +[㒵㒻㡌㧌㪞㫯㮘㴘㺺㿞䀤䋃䓮䡚䫉冐冒媢帽懋暓柕楙毷瑁皃眊瞐耄艒芼茂萺蓩袤貌貿贸鄮]>mào; +[么麼]>me; +[㶬㺳䊈䍙䒽䤂呅堳塺媒嵋徾攗枚栂梅楣楳槑沒没湄湈煤猸玫珻瑂眉睂禖篃脄脢腜苺莓葿郿酶鋂鎇镅霉鶥鹛黴𪃏]>méi; +[䆀䓺䜸凂媄媺嬍嵄挴毎每浼渼燘美鎂镁黣]>měi; +[㭑䀛䉋䊊䰨䰪䵢妹媚寐抺昧沬煝痗眛睸祙蝞袂跊韎鬽魅]>mèi; +[㡈㨺䊟䝧䫒扪捫樠穈菛虋鍆钔門閅门]>mén; +暪>měn; +[㥃㦖㱪㵍悶懑懣焖燜闷]>mèn; +[们們]>men; +[㙹㠓㩚䀄䇇䉚䑃䑅䒐䓝䗈䙦䙩䤓䰒䲛䴌䴿䵆儚冡幪懞懵曚朦橗檬氋濛獴甍甿盟瞢矇矒礞艨苎莔萌萠蒙蕄虻蝱鄳鄸雺靀饛鯍鸏鹲]>méng; +[㚞䏵勐猛瓾艋蜢蠓錳锰鯭]>měng; +[㜴㝱䠢䥂䥰夢夣孟懜梦溕霥霿]>mèng; +[咪嘧眯瞇]>mī; +[㜷㟜㠧㣆㩢㸏䊳䋛䌕䌘䍘䕳䕷䛧䤍䥸䪾䴢冞弥彌戂擟攠檷瀰爢猕獼瓕祢籋糜縻罙蒾蘪蘼詸謎谜迷醚醾醿釄镾鸍麊麋麛𨢥]>mí; +[㝥㥝㰽㳽䭧䱊侎孊弭敉沵洣渳濔灖眫米脒葞蔝銤靡]>mǐ; +[㜆㨠㫘㳴㴵㵋㸓䁇䉾䌏䌐䌩䖑䛉䛑䣾䤉䭩䮭冖冪塓宓宻密峚幂幎幦榓樒櫁汨泌淧淿滵漞濗熐祕秘簚糸羃蔤藌蜜蠠覓覔覛觅謐谧鼏]>mì; +[㒙㝰㬆㮌㰃䃇䏃䫵䰓婂媔嬵宀棉檰櫋眠矈矊矏綿緜绵臱芇蝒醎]>mián; +[㛯㤁㻰䀎䤄丏偭免冕勉勔喕娩愐汅沔湎眄絻緬缅腼葂麪麫]>miǎn; +[㴐糆面靣麵麺]>miàn; +喵>miāo; +[㑤㠺䁧䖢描瞄緢苗鱙鶓鹋]>miáo; +[㦝䅺劰杪淼渺眇秒篎緲缈藐邈]>miǎo; +[妙庙庿廟玅竗]>miào; +[乜吀咩哶孭羋芈]>miē; +[㒝䁾䈼䘊䩏幭懱搣櫗滅灭礣篾蔑薎蠛衊覕鑖鱴鴓]>miè; +[㟩㟭㢯䁕䂥䃉䋋䟨䡑䡻䪸䲄姄岷崏忞忟怋捪敯旻旼民珉琘瑉痻盿砇碈緍緡缗罠苠鈱錉鍲閺]>mín; +[㞶㥸㨉䡅僶冺刡勄悯愍慜憫抿敃敏暋泯渑湣潣澠皿笢簢閔閩闵闽鰵鳘黽黾]>mǐn; +榠>mīng; +[㝠䄙䆨䆩䊅䫤佲冥名嫇明暝朙洺溟猽眀瞑蓂螟覭鄍酩銘铭鳴鸣]>míng; +[㟰㫥凕姳慏眳茗]>mǐng; +[䒌命詺]>mìng; +[謬谬]>miù; +摸>mō; +[䃺䉑䯢劘嚤嚰嫫摩摹擵模橅磨糢膜蘑謨谟饃饝馍髍魔]>mó; +[䩋懡抹]>mǒ; +[㱄㱳㷬㷵㹮䁼䁿䏞䒬䘃䜆䬴䮬䱅䳮䴲嗼嚜圽塻墨妺嫼寞帞慔昩暯末枺歾歿殁沫洦湐漠瀎爅瘼皌眜眽瞙砞礳秣粖絈縸纆耱茉莈莫蓦藦蛨蟔衇袹謩貃貊貘鄚銆鏌镆陌霡靺驀鬕魩默黙]>mò; +[庅麽]>mo; +哞>mōu; +[㭌䏬䗋䥐䱕侔劺洠牟眸瞴繆缪蛑蟱謀谋鉾鍪鴾麰]>móu; +[䍒某踇]>mǒu; +[愗瞀]>mòu; +[䱯恈毪氁獏譕]>mú; +[䥈亩姆姥峔母牡牳畆畒畝畞畮砪胟鉧]>mǔ; +[㒇㜈㣎㧅㾇䀲䊾䑵䧔仫募坶墓幕幙慕暮木楘毣沐炑牧狇目睦穆苜莯蚞鉬钼雮霂鞪鶩鹜]>mù; +拇>mu; +嗯>ń; +㐻>ň; +[䏧䛔䫱嗱拏拿誽鎿镎]>ná; +[乸哪雫]>nǎ; +[㗙㨥㴸䀑䅞䇣䇱䈫䎎䖓䖧䟜䪏䱹妠捺笝納纳肭蒳衲袦豽貀軜那鈉钠靹魶]>nà; +[㾍䍲䘅䯮摨熋釢]>nái; +[乃奶妳嬭廼氖疓艿迺]>nǎi; +[㮈㮏㲡倷奈柰榒渿耐萘螚褦錼鼐]>nài; +囡>nān; +[㓓㽖䔜䕼䛁䶲侽南喃奻娚暔枏枬柟楠男畘莮萳諵难難]>nán; +[㫱䁪䈒䔳戁揇湳罱腩蝻赧]>nǎn; +婻>nàn; +[乪囔]>nāng; +[䂇嚢囊欜]>náng; +[㶞攮曩灢饢馕]>nǎng; +[㒄儾齉]>nàng; +[㞪㺀䃩䄩䑋䛝䫸䴃呶夒峱嶩巎巙怓憹挠撓桡橈猱獶獿硇繷詉譊鐃铙髐𥑪]>náo; +[㑎㛴㺁䜀䜧匘垴堖嫐恼悩惱瑙碯脑腦]>nǎo; +[淖閙闹鬧]>nào; +[䎪䭆訥讷]>nè; +[吶呐呢]>ne; +[㼏䲎娞脮腇餒馁鮾鯘]>něi; +[㕯㖏㘨㨅䡾䳖內内氝]>nèi; +黁>nēn; +齳>něn; +[㜛㯎㶧嫩嫰]>nèn; +[㴰䏻嬣能薴]>néng; +㲌>nèng; +㕶>ng̀; +妮>nī; +[㞾㪒㹸䘦䘽䛏䝚倪坭埿婗尼屔怩泥淣狋猊秜籾臡蚭蜺觬貎跜輗郳霓鯓鯢鲵麑齯]>ní; +[㣇㵫䕥䦵䧇䭲䰯伱伲你儗儞孴抳拟擬旎柅狔禰苨薿鈮鉨铌隬馜]>nǐ; +[㠜㥾㦐㲻䁥䘌䵑䵒匿堄嫟嬺屰嶷惄愵昵暱氼溺痆睨糑縌胒腻膩迡逆鷁鷊鹝鹢]>nì; +[䄭䄹䩞䬯年拈秊秥鮎鯰鲇鲶黏]>nián; +[㘝㞋䚓捻撚撵攆碾簐跈蹨躎輦辇]>niǎn; +[㲽卄唸埝姩廿念涊淰艌鼰齞]>niàn; +[嬢孃]>niáng; +[䖆酿醸釀]>niàng; +娘>niang; +[㒟㜵㠡㭤䃵䐁䙚䦊䮍嫋嬝嬲樢茑蔦袅裊褭鳥鸟𢶑𢸣]>niǎo; +[㞙㳮尿脲]>niào; +[惗捏揑踗鈢鉩錜鑈]>niē; +[㡪苶]>nié; +[㖖㘿㙞㚔㜸㩶㮆㴪㸎䂼䄒䌜䜓䯀䯅䯵啮喦嗫噛嚙囁囓圼孼孽嵲帇摰敜枿棿槸櫱涅湼疌篞糱糵聂聶臬臲菍蘖蠥踂蹑躡鎳鑷钀镊镍闑陧隉顳颞齧]>niè; +[㤛䋻䚾䛘囜您]>nín; +拰>nǐn; +[㝕㲰䗿䭢儜凝咛嚀宁寍寕寗寜寧拧擰柠檸狞獰甯聍聹鑏鬡鸋]>níng; +[橣矃]>nǐng; +[㣷㿦䔭佞侫泞濘]>nìng; +妞>niū; +[䀔䒜牛]>niú; +[㺲䏔忸扭炄狃紐纽莥鈕钮靵]>niǔ; +[䋴衂]>niù; +[㶶䁸䢉侬儂农哝噥檂欁浓濃癑禯秾穠脓膿蕽襛農辳醲鬞齈]>nóng; +䵜>nǒng; +[弄挊]>nòng; +[㝹䨲羺譨]>nóu; +[䅶䘫䰭啂槈獳耨譳鎒鐞]>nòu; +[㚢伮奴孥笯蒘駑驽鴑]>nú; +[努弩砮胬]>nǔ; +[䢞怒抐搙]>nù; +[女籹釹钕]>nǚ; +[㵖䖡䘐䚼䶊恧朒衄]>nǜ; +[㬉䎡䙇暖渜煖煗餪]>nuǎn; +偄>nuàn; +[䖈䖋硸]>nuè; +[䨋疟瘧虐謔谑]>nüè; +[㑚㔮㰙傩儺娜挪捼梛郍]>nuó; +[㛂㡅橠砈砹]>nuǒ; +[㐡䚥愞懦懧挼掿搦搻稬穤糥糯諾诺蹃逽]>nuò; +[喔噢]>ō; +哦>ó; +[呕嘔櫙欧歐殴毆熰瓯甌眍瞘謳讴鏂鴎鷗鸥]>ōu; +[吽齵]>óu; +[㒖㼴䚆䯚偶吘塸耦腢蕅藕]>ǒu; +[㛏䌂䌔怄慪沤漚]>òu; +[啪夿妑皅舥葩蚆趴]>pā; +[䯲䶕杷潖爬琶筢耙跁]>pá; +[帊帕怕袙]>pà; +拍>pāi; +[㵺俳徘排棑牌猅篺簰簲輫]>pái; +俖>pǎi; +[㭛䖰哌汖派湃蒎鎃]>pài; +[㐴攀潘畨眅砙]>pān; +[䃑䃲䈲䰉䰔媻幋搫柈槃瀊盘盤磐磻縏蒰蟠跘鎜鞶]>pán; +[坢奤]>pǎn; +[㳪冸判叛拚沜泮溿炍牉畔盼袢襻詊鋬鑻頄頖]>pàn; +[乓滂膖]>pāng; +[㤶㥬㫄䅭䨦䮾厐厖嫎庞庬彷徬旁篣胮舽蒡螃逄雱霶騯髈龎龐]>páng; +[䒍嗙耪覫]>pǎng; +[㜊炐肨胖]>pàng; +[抛拋脬]>pāo; +[㚿䛌䩝刨匏咆垉庖炰爮狍袍軳鞄齙龅]>páo; +跑>pǎo; +[㘐㯡䶌奅泡炮疱皰砲礟礮靤髱麭]>pào; +[呸垺妚娝岯怌柸肧胚衃醅]>pēi; +[㟝䣙䪹䫠䲹培毰碚裴裵賠赔邳阫陪陫]>péi; +[昢琣]>pěi; +[㤄㧩㫲㳈䊃伂佩姵帔斾旆沛浿珮笩苝轡辔配霈馷]>pèi; +[呠喯喷噴]>pēn; +[湓瓫盆葐]>pén; +[翉翸]>pěn; +歕>pèn; +[匉嘭怦恲抨梈漰澎烹砰硑磞軯閛駍]>pēng; +[㛔㥊䄘䡫䰃䴶倗傰埄堋塜塳弸彭憉挷朋棚椖樥淜痭硼稝竼纄膨芃蓬蟚蟛輣錋鑝韸韼驡髼鬅鬔鵬鹏]>péng; +[捧淎皏]>pěng; +[㼞掽椪甏碰踫]>pèng; +篷>peng; +[丕伾劈噼坯怶悂憵批披抷旇炋狉狓砒磇礕秛秠翍耚豾釽鈈鈹鉟銔铍霹髬髲鮍鲏鴄]>pī; +[㔥㯅啤埤壀朇枇毗毘焷犤玭琵疲皮笓紕纰罴羆肶脾腗膍蚽蜱螷豼貔郫鈚錍阰陴駓魾鼙]>pí; +[㨽䏘䚰䚹䤏䫌䰦仳匹噽嚭圮崥庀疋痞癖脴苉苤諀銢隦]>pǐ; +[㿙䑀䑄䠘䡟䤨䴙僻媲嫓屁揊擗淠渒潎澼濞甓礔譬辟闢鷿鸊]>pì; +[偏囨媥犏篇翩萹頨鶣]>piān; +[㛹㼐䮁楄楩胼腁諚諞谝賆蹁輧駢騈骈骿]>pián; +[覑貵]>piǎn; +[㓲㸤䏒片騗騙骗]>piàn; +[嘌彯旚翲薸螵飃飄飘魒]>piāo; +[㼼䕯䴩淲瓢竂蚫闝]>piáo; +[㩠㵱㹾摽殍犥皫瞟縹缥膘蔈藨醥]>piǎo; +[㬓㺓䏇僄剽勡嫖徱慓漂票篻顠驃骠]>piào; +[撆暼氕瞥]>piē; +[䥕丿撇鐅]>piě; +嫳>piè; +[姘拼涄礗]>pīn; +[㰋嚬娦嫔嬪獱琕薲貧贫頻顰频颦]>pín; +[品榀]>pǐn; +[䀻牝聘]>pìn; +[乒俜娉焩砯頩]>pīng; +[㺸㻂䍈䶄凭凴呯坪屏屛帡帲幈平慿憑枰泙洴玶瓶甁甹竮箳簈缾聠胓艵苹荓萍蓱蘋蚲蛢評评軿郱鮃鲆鵧𦚓]>píng; +[坡泊溌癹鉕鏺钷陂頗颇]>pō; +[㨇㰴嘙婆櫇皤蔢鄱]>pó; +[叵尀笸]>pǒ; +[㛘䄸䎊䞟䣪䣮䨰䪖䯙岶廹炇烞狛珀破砶粕蒪迫酦醗醱釙钋魄]>pò; +[泼潑]>po; +剖>pōu; +[㧵抔抙捊掊裒錇锫]>póu; +[㕻勏哣婄廍棓犃瓿]>pǒu; +咅>pòu; +[仆噗墣扑抪撲擈攴濮痡醭陠]>pū; +[㒒㯷㲫㺪䈬䈻䑑䔕䗱䧤䴆僕匍樸毞獛璞瞨穙箁纀脯菐菩葡蒱蒲襆襥蹼轐酺鏷镤]>pú; +[㹒䲕圃圤普朴檏氆浦溥潽烳誧諩譜谱鐠镨]>pǔ; +[㬥曝瀑舖舗鋪铺]>pù; +[七倛僛凄唭嘁墄妻娸悽慼慽攲期柒栖桤桼棲榿欺沏淒漆磎磩粞緀萋諆郪霋顣魌鶈鸂𠀁]>qī; +[㜎㟓㟚㟢㩽㯦䄢䅲䉻䐡䑴䓅䞚䟚䡋䧘䧵䩓䭶䭼䰇䱈䲬䳢䶒䶞亓亝其剘圻埼墘奇岐岓崎帺忯愭懠掑斉斊旂旗棊棋檱櫀歧淇濝猉玂琦琪璂畁畦疷碁碕祁祈祺禥竒粸綦綨纃翗耆脐臍艩芪荠萁萕蕲薺藄蘄蚑蚔蚚蛴蜝蜞蠐衹跂踑軝迉鄿釮錡錤锜頎颀騎騏骐骑鬐鬿鮨鯕鰭鲯鳍鵸鶀麒齊齐]>qí; +[㒅㞓㥓㩩㫓㾨䄎䄫䉝䋯䎢䏿䒻䔇䛴䡔䭫䭬乞企启呇唘啓啔啟婍屺岂敧晵杞棨槣盀綮綺绮芑芞裿諬豈起邔闙]>qǐ; +[㓞㞚㣬㮑㼤䀈䀙䁈䁉䅤䌌䏅䏌䏠䒗䙄䚉䚍䟄䢀䫔䬣䰴呮咠噐器夡契弃徛忔憇憩摖暣栔棄气気氣汔汽泣湆湇炁甈盵矵砌碛碶磜磧礘綥緝缉罊葺蟿訖諿讫迄鏚鼜]>qì; +戚>qi; +掐>qiā; +䠍>qiá; +[跒酠]>qiǎ; +[㓣㡊㤉䜑䨐䯊䶝匼圶帢恰殎洽]>qià; +[㡨仟佥僉兛千圱圲奷婜孯岍幵悭愆慳扦拪掔搴撁攐攑攓杄檶櫏欦汘汧牵牽签簽籤粁縴羟羥肷膁臤芊蚈褰諐謙譣谦谸迁遷釺鉛鋟鐱钎铅锓阡韆顩騫骞鬜鬝鵮鹐]>qiān; +[㦮㨜㩮㸫䁮䈤䍉䕭䖍䨿仱前媊岒忴扲拑掮揵榩歬漧潛潜濳灊燂箝葥虔鈐鉗銭錢钤钱钳雂騚鬵鰬黔黚]>qián; +[㧄䪈䭤嵰撖槏浅淺繾缱蜸譴谴遣]>qiǎn; +[㐸㜞㟻㪠㯠䈴䊴䥅䦲䫡倩傔儙刋堑塹壍嵌悓慊棈椠槧欠歉皘篏篟綪芡茜蒨蔳輤]>qiàn; +[呛嗆嶈戕戗斨枪椌槍溬牄猐玱瑲矼篬羌羗羫腔蜣謒跄蹌蹡錆鎗鏘鏹锖锵镪]>qiāng; +[㩖丬墙墻嫱嬙廧強强彊樯檣漒爿牆蔷薔蘠軖]>qiáng; +[㛨䅚傸勥墏抢搶磢繈繦]>qiǎng; +[䵁唴炝熗羻]>qiàng; +[劁墝墽嵪幧悄敲橇硗磽繑跷踍蹺蹻郻鄡鄥鍫鍬鏒鐰锹鞒頝骹髜]>qiāo; +[㚁㝯䀉䎗䩌䱁乔侨僑喬嘺嶣憔桥樵橋燆癄瞧硚礄簥荞蕎藮譙谯趫趬鐈鞽顦]>qiáo; +[㚽㡑㤍䲾巧愀釥]>qiǎo; +[㢗㪣㴥䃝䆻䇌俏僺峭帩撬撽窍竅翘翹誚诮躈陗鞘韒髚]>qiào; +[㚗䦧癿]>qié; +且>qiě; +[㓶㗫㛍㛙㤲㥦㫸㰰㰼㹤㾀㾜䟙䤿䬊切匧妾怯悏惬愜挈朅洯淁穕窃竊笡箧篋緁藒蛪踥鍥锲鯜]>qiè; +[亲侵媇嵚嶔欽瀙綅衾親誛钦顉駸骎鮼]>qīn; +[㘦㢙㩒㪁㮗䔷䖌䦦勤厪嗪噙嫀庈廑懃懄捦擒斳檎澿珡琴琹禽秦耹芩芹菦蚙螓蠄赺鈙靲鳹鵭]>qín; +[㝲㾛䠴坅寑寝寢昑曋螼赾]>qǐn; +[㞬㤈䈜吢吣唚寖寴抋揿搇撳沁菣]>qìn; +[倾傾卿啨圊寈氢氫氰淸清狅蜻軽輕轻郬靑青鯖鲭]>qīng; +[㯳䝼䞍䲔剠勍夝情擎晴暒樈檠殑甠晴]>qíng; +[㷫䔛䯧庼廎檾請请頃顷]>qǐng; +[䋜䌠凊庆慶掅殸汫漀碃磘磬罄謦鑋靘]>qìng; +[匔焪穹芎銎]>qiōng; +[㒌㧭㮪㷀㼇䅃䆳䊄䓖䛪䠻儝卭宆惸桏棾橩焭煢琼璚瓊睘瞏穷窮竆笻筇茕藑藭蛩赹跫輁邛]>qióng; +苘>qiǒng; +[㐀䆋丘丠坵媝恘楸秋秌穐篍緧萩蓲蚯蝵蟗蠤趥邱鞦鞧鰍鱃鳅鶖鹙龝𠀉𩝠]>qiū; +[㐤㕤㞗㟈㤹㥢㧨㭝㷕㺫䊵䎿䜪䟵䣇䤛俅厹叴唒囚崷巯巰扏朹梂毬求汓泅浗渞煪犰玌球璆皳盚紌絿肍脙艽苬莍虬虯蛷蝤裘觩訄訅賕赇逎逑遒酋釓釚銶钆鮂鯄鰌鰽鼽]>qiú; +[㼒䞭搝糗]>qiǔ; +[䟬䠗殏螑]>qiù; +[㠊伹佉凵匤区區呿坥屈岖岴嶇憈抾敺曲瞿砠祛胠蛆蛐袪誳趋趨躯軀镼阹駆駈驅驱髷魼鰸鱋鶌黢]>qū; +[㖆㜹㣄㯫㲘䀠䂂䋧䝣䞤䟊䵶佢劬匷忂懅戵斪朐欋氍淭渠灈璖璩痀癯磲籧翑翵胊臞菃葋蕖蘧螶蟝蠷衢豦躣軥鑺鴝鸜鸲麯麴麹鼩𪍸]>qú; +[䶚取娶浀竬筁紶詓齲龋]>qǔ; +[㧁㫢㰦䁦䒧䠐刞厺去湨覰覷覻觑詘诎趣閴闃阒麮鼁]>qù; +[圈圏姾弮悛棬箞絟鐉]>quān; +[㒰㟨㟫䀬䑏䟒䠰佺全啳婘孉峑巏恮惓拳搼权権權泉洤湶牷犈瑔痊硂筌荃葲蜷蠸觠詮诠踡輇辁醛銓铨顴颧駩騡鬈鰁鳈鷤齤]>quán; +[䊎呟奆汱犬琄甽畎綣縓绻虇詃]>quǎn; +[䄐券劝勧勸烇牶玔絭荈]>quàn; +[缺蒛𩨭]>quē; +瘸>qué; +[㕁㩁㰌㱋㱿㴶㾡䇎䦬䧿却卻咑埆塙墧寉崅悫愨慤搉榷殻毃灍燩琷皵硞确碏確碻礐礭舭趞闋闕阕阙雀]>què; +[鵲鹊]>que; +[囷夋峮杶踆輴逡鰆]>qūn; +[㪊㿏䭽宭帬漘羣群裙裠錞]>qún; +蝽>qǔn; +[儿兒]>r; +[㜣㲯㸐㾆䑙䖄䫇嘫然燃繎肰蚦蚺蛅衻袇袡髥髯𤡮]>rán; +[㚩㯗㿵䎃䒣䣸䤡冄冉呥姌媣染橪珃苒]>rǎn; +[㚂䉴儴勷攘瀼獽瓤禳穣穰蘘躟鬤]>ráng; +[嚷壌壤爙]>rǎng; +[懹譲讓让]>ràng; +[㹛䫞荛蕘蛲蟯襓饒饶]>ráo; +[㑱娆嬈扰擾]>rǎo; +[繞绕遶隢顤]>rào; +[喏惹]>rě; +[渃热熱]>rè; +[䌾䴦人亻仁壬忈忎朲秂紝絍纴芢鈓銋魜鴹]>rén; +[㣼䏕䏰䭃忍栠栣棯秹稔腍荏荵]>rěn; +[㠴㶵㸾䀼䇮䋕仞仭任刃刄妊姙屻恁扨杒梕牣紉纫肕衽袵訒認认讱賃赁軔軠轫靭靱韌韧飪餁饪鵀]>rèn; +扔>rēng; +[㭁㺱䄧䚮仍礽辸陾]>réng; +芿>rèng; +[䒤囸日氜衵釰鈤馹驲]>rì; +茸>rōng; +[㘇㝐㣑㭜㲓㲨㺎㼸䇀䇯䈶䘬䠜䡆䡥䤊䩸媶容嵘嶸戎曧栄榕榮榵毧溶烿熔爃狨瑢穁絨縙绒羢肜茙荣蓉蝾融螎蠑褣鎔镕駥髶鰫鷛]>róng; +[㲝䢇傇冗宂搑氄軵]>rǒng; +鴧>ròng; +[㖻㽥䐓䧷䰆媃揉柔楺沑渘瑈瓇禸脜腬葇蝚蹂輮鍒鍕鞣韖騥鰇鶔]>róu; +[煣粈糅]>rǒu; +[䄾宍肉]>ròu; +[㨎㹘䋈䰰儒嚅如孺帤挐曘桇渪濡燸筎臑茹蕠薷蠕袽襦邚醹顬颥鱬鴽]>rú; +[㦺乳侞擩汝肗辱銣铷]>rǔ; +[傉入嗕媷洳溽縟缛蓐褥鄏]>rù; +[䓴堧壖撋]>ruán; +[㼱㽭䞂䪭媆朊瑌瓀盶碝礝緛耎腝蝡軟輭软阮]>ruǎn; +[㮃䅑甤緌蕤]>ruí; +[惢桵橤繠蕊蕋蘂蘃]>ruǐ; +[㓹㛱㪫㲊䌼䓲叡壡枘汭瑞睿芮蚋蜹銳鋭锐]>ruì; +[犉瞤]>rún; +[㠈䦞橍润潤膶閏閠闰]>rùn; +[䐞偌叒婼弱楉焫爇箬篛若蒻鄀鰙鰯鶸]>ruò; +[仨撒]>sā; +[㒎䊛洒灑靸]>sǎ; +[㪪㳐㽂䘮䙣䬃卅摋攃櫒脎萨薩趿鎝颯飒馺]>sà; +[塞愢揌毢腮顋鰓鳃]>sāi; +[㗷䈢]>sǎi; +[僿嗮簺賽赛]>sài; +噻>sai; +[三叁嘇弎攕毵毿犙糁糝鬖]>sān; +[㧲䀐䉈䊉䫩仐伞傘糂糣糤繖鏾饊馓]>sǎn; +[㤾㪔㪚䫅俕散潵閐]>sàn; +[桑桒]>sāng; +[䡦䫙嗓搡磉褬鎟顙颡]>sǎng; +[丧喪]>sàng; +[慅掻搔溞瘙繅缫臊颾騒騷骚鰠鰺鱢鳋]>sāo; +[㛮䕅嫂扫掃]>sǎo; +[㿋䐹䖣喿埽氉矂]>sào; +[㒊㥶㮦㱇㴔㻭䉢䔼䨛啬嗇懎歮歰涩澀澁濇瀒瑟璱穑穡繬翜色譅趇轖銫铯雭飋]>sè; +[曑森椮槮甧穼篸蔘襂]>sēn; +[僧鬙]>sēng; +[乷刹剎唦帴杀桬榝樧殺沙煞猀痧砂硰粆紗纱莎蔱裟鎩铩髿魦鮻鯊鯋鲨]>shā; +[傻儍訯]>shǎ; +[㚫㛼㰱䈉䝊䮜䵘䶎倽厦唼啑啥喢帹廈歃箑翣萐閯霎]>shà; +[筛篩]>shāi; +繺>shǎi; +[㬠晒曬閷]>shài; +[删刪剼姍姗山幓彡挻搧杉檆潸澘烻煽狦珊穇笘縿羴羶脠舢芟苫衫跚軕邖]>shān; +[㚒㣣㨛㪎㶒䠾晱睒覢醦閃闪陕陝陿]>shǎn; +[㣌㪨䄠䆄䚲䥇䦂䦅䱇䱉䴮傓僐善墠墡嬗扇掞摲擅汕灗熌疝磰禅繕缮膳蟮蟺訕謆譱讪贍赡赸鄯釤銏鐥钐饍騸骟鱓鱔鳝]>shàn; +[伤傷商墒慯殇殤滳漡熵蔏螪觞觴謪鬺]>shāng; +[䬕扄晌賞赏]>shǎng; +[丄上姠尙尚蠰銄鑜]>shàng; +裳>shang; +[弰捎旓梢烧焼燒稍筲艄莦蛸輎髾]>shāo; +[㲈㸛勺杓牊玿竰韶]>sháo; +[㪢䒚䔠少]>shǎo; +[㷹䏴䙼䬰佋劭卲哨娋潲睄紹綤绍袑邵颵]>shào; +[奢檨譇賒賖赊輋]>shē; +[㭙㰒䁋䂠䞌佘揲舌虵蛇蛥鉈鍦铊]>shé; +[䬷捨舍騇]>shě; +[㒤㢵㴇䀅䁯䄕䌰䠶䤮䵥厍厙射弽慑慴懾摂摄攝欇涉渉滠灄猞社蔎蠂設设赦韘麝]>shè; +[伸侁兟呻妽姺娠屾峷扟柛氠深燊珅申砷籶籸紳绅胂葠薓裑訷詵诜身鉮駪鯵鲹鵢]>shēn; +[䰠什甚神神]>shén; +[㔤㜤㰂㵊㾕吲哂婶嬸审宷審弞渖瀋瞫矤矧覾訠諗讅谂谉邥頣頥魫]>shěn; +[㥲㰮㵕䆦侺愼慎抻昚椹涁渗滲瘆瘎瘮眒眘肾脤腎葚蜃鋠]>shèn; +[升呏声斘昇殅泩湦焺牲狌珄生甡甥笙聲苼鉎阩陞鵿鼪]>shēng; +[䱆憴晠溗畻繩绳譝鱦]>shéng; +[㗂㼳㾪䁞䚇䪿偗省眚箵]>shěng; +[䎴䞉剩剰勝圣墭嵊榺琞盛聖胜蕂貹賸]>shèng; +[䴓呞失尸屍师師施浉湤湿溮溼濕狮獅箷絁葹蒒蓍虱蝨褷襹詩诗邿釶鈟鉇鯴鰤鲺鳲鳾鶳鸤]>shī; +[㖷㫑㵓䂖䖨䦹䶡乭十埘塒实実寔實峕时旹時榯湁湜溡炻石祏莳蒔蚀蝕遈鉐食飠饣鰣鲥鼫鼭]>shí; +[㕜㹬㹷䒨䦠乨使兘史始宩屎矢笶豕鉂駛驶]>shǐ; +[㒾㔺㮶㱁㸷㹝䁺䊓䏡䛈䟗䤱䩃䭄䰄世丗亊事仕似侍冟势勢卋卶叓呩嗜噬士奭嬕室崼市式弑弒忕恃戠戺拭揓是昰枾柹柿氏澨烒眂眎睗示筮簭翨舐舓襫視视試誓諟諡謚试谥豉貰贳軾轼适逝適遾釈释釋鈰鉃鉽銴铈飾餙餝饰鯷鳀齛𠀍]>shì; +[匙拾識识]>shi; +[収收荍]>shōu; +[㝊䭭垨守手掱艏首]>shǒu; +[㖟㥅䛵兽受售壽夀寿授涭狩獸璹痩瘦綬绶鏉]>shòu; +[书倏倐儵叔姝抒摅摴攄書杸枢梳樗樞橾殊殳疎疏紓綀纾舒蔬踈軗輸输陎鵨]>shū; +[䃞䝪䴰埱塾孰尗掓淑焂熟秫菽虪襡贖赎跾鸀]>shú; +[㒔㟬㯮㳆㻿䑕䞖䠱䩳婌属屬暑潻癙盨署薥薯藷蜀襩钃黍鼠鼡]>shǔ; +[㛸㜐㣽㶖㷂㽰㾁䆝䉀䎉䘤䜹䝂䢤䩱侸凁墅尌庶庻恕戍数數曙朮术束树樜樹沭漱潄澍濖竖竪絉荗蒁術袕裋豎述鉥錰鏣鮛鶐]>shù; +[刷唰]>shuā; +耍>shuǎ; +誜>shuà; +[孈摔縗缞衰]>shuāi; +甩>shuǎi; +[䢦卛咰帅帥繂蟀]>shuài; +[拴栓閂闩]>shuān; +[䧠涮]>shuàn; +[双孀孇欆礵艭雙霜驦骦鷞鸘鹴]>shuāng; +[㼽䗮䫪塽慡樉爽縔騻]>shuǎng; +[㦼䡯灀]>shuàng; +[誰谁]>shuí; +水>shuǐ; +[㽷䭨娷帨涗涚睡瞓祱稅税蛻蜕裞]>shuì; +[吮揗楯賰]>shǔn; +[㥧䀢䀵䑞橓瞚瞬舜蕣順顺鬊]>shùn; +[哾說説说]>shuō; +[䀥䈾䌃妁揱搠朔槊欶洬烁爍獡矟硕碩芍蒴鎙鑠铄]>shuò; +[丝偲凘厮厶司咝嘶噝媤廝思撕斯楒榹泀澌燍磃禗禠私簛籭糹絲緦纟缌罳蕬虒蛳蜤螄蟖蟴覗鉰鋖鐁颸飔騦鷥鸶]>sī; +𥐘>sí; +死>sǐ; +[㐌㕽㚶㣈㭒㸻㹑㾅䇃䎣䏤䦙亖佀俟儩兕嗣四姒娰孠寺巳杫柶汜泗泤洍涘瀃牭祀禩竢笥耜肂肆蕼貄賜赐釲鈻飤飼饲駟驷飼]>sì; +[倯凇娀崧嵩庺憽松枀柗梥檧淞濍硹菘蜙鍶锶鬆]>sōng; +[㧐㨦㩳䉥䜬傱嵷怂悚愯慫捒楤竦耸聳駷]>sǒng; +[㕬㮸䛦䢠宋訟誦讼诵送頌颂餸]>sòng; +[嗖廀廋捜搜摉溲獀艘蒐螋鄋醙鎪锼颼飕餿馊騪]>sōu; +[㖩㛐䈹䉤䏂䮟傁叜叟嗾擞擻櫢滫瞍籔薮藪]>sǒu; +[㵻瘶膄]>sòu; +嗽>sou; +[囌櫯甦稣穌苏蘇蘓酥]>sū; +俗>sú; +[㑉㑛㓘㔄㕖㜚㝛㨞㩋㪩㬘㯈㴋㴑㴼䃤䅇䌚䎘䏋䑿䔎䘻䛾䥔傃僳嗉塐塑夙嫊宿愫愬憟栜榡樕橚殐泝涑溯溸溹潥玊珟璛碿窣簌粛粟素縤肃肅膆蓿蔌藗蜶觫誎謖谡趚速遡遬鋉餗驌骕鱐鷫鹔]>sù; +[訴诉]>su; +[狻痠酸]>suān; +[㔯匴]>suǎn; +[祘笇筭算蒜]>suàn; +[倠哸夊攵毸浽滖濉熣眭睢綏绥芕荽荾虽雖鞖]>suī; +[㵦㻟䜔䢫遀隋随隨]>suí; +[䭉䯝巂瀡膸髄髓]>suǐ; +[㒸㞸㴚㻪㻽䅗䉌䍁䔹䠔䡵䥙亗埣嬘岁嵗旞檅檖歲歳澻煫燧璲瓍睟砕碎祟禭穂穗穟繀繸襚誶譢谇賥遂邃鐆鐩隧𡑞]>suì; +[孙孫搎槂狲猻荪蓀蕵薞飧飱]>sūn; +[㔼㡄㦏䁚损損榫笋筍箰簨鎨]>sǔn; +愻>sùn; +[傞唆嗍娑挱挲摍桫梭樎簑簔縮缩莏蓑趖蹜]>suō; +[㪽䂹䅴䈗䐝䖛䗢䞆䞽䣔䵀唢嗩所摵擌暛洓溑琐瑣璅瘷索褨鎍鎖鎻鏁鏼锁]>suǒ; +逤>suò; +嗦>suo; +[他嚃塌她它祂禢]>tā; +[㗳㺚塔墖榙]>tǎ; +[㒓㛥㣛㣵㧺㭼㯓㳠㳫㹺㿹䂿䈋䈳䌈䍇䍝䎓䑜䓠䜚䵬䶀䶁亣嗒嚺崉挞搨撻榻橽毾沓涾溻澾濌狧獭獺羍誻譶跶踏蹋蹹躂躢遝遢錔鎉鑉闒闥闼阘鞜鞳鮙鰨鳎龖龘]>tà; +[囼孡胎]>tāi; +[㒗㘆㙵㣍㬃㷘㸀䈚䑓䢰儓冭台坮嬯抬擡旲檯炱炲籉臺苔菭薹跆邰颱駘骀鮐鲐]>tái; +[㑷㥭䣭太夳忲态態曃汰泰溙燤肽舦酞鈦钛]>tài; +[啴嘽坍怹抩摊擹攤橝滩灘瘫癱緂舑舚譠貪贪]>tān; +[㲜㷋㽑䃪䉡䊤䕊倓嘾坛墰墵壇壜婒惔憛昙曇榃檀潭痰罈罎艢藫覃談譚谈谭貚郯醈醰錟鐔锬镡餤驔]>tán; +[㲭䆱䏙䞡䦔嗿坦忐憳憻毯璮禫膻菼袒襢贉醓黮]>tǎn; +[䐺䜖傝僋叹嘆埮探歎湠炭碳賧赕]>tàn; +[劏嘡坣汤湯羰蝪蹚鏜镗鼞]>tāng; +[㑽㙶㜍㭻㲥㼺䅯䉎䌅䣘䧜傏唐啺堂塘搪摚棠榶樘橖溏漟煻瑭磄禟篖糃糖糛膅膛蓎薚螗螳赯踼鄌醣鎕闛隚餹饄鶶]>táng; +[㒉㿩伖倘偒傥儻帑惝戃曭淌爣矘耥躺鎲钂镋𢠵]>tǎng; +[䟖摥烫燙趟鐋铴]>tàng; +[叨嫍弢慆掏搯槄洮涛滔濤瑫絛縚縧绦翢蜪詜謟轁鞱韜韬飸饕]>tāo; +[㹗䬞匋咷啕桃梼檮淘祹綯绹萄裪迯逃醄鋾錭陶鞀鞉饀駣騊鼗]>táo; +[䚯䚵䵚討讨]>tǎo; +[㚐套]>tào; +[㥂㧹忑忒慝棏特脦蚮蟘貣鋱铽鴏]>tè; +[膯鼟]>tēng; +[䒅䕨䠮䲍䲢儯幐滕漛疼籐籘縢腾蕛藤螣誊謄邆駦騰驣鰧]>téng; +[䴘剔梯踢鷈鷉]>tī; +[㖒㡗㣢䅠䔶䚣䛱䝰䣡䨑䬾偍厗啼嗁媂媞崹惿提漽珶瑅碮禔禵稊綈緹绨缇罤荑蝭褆謕趧蹄蹏遆醍鍗隄題题騠鮷鵜鶗鶙鹈鼶]>tí; +[䌡䣽䪆䶏体挮躰軆骵體]>tǐ; +[㗣㬱㯩䎮䙗䧅䯜䶑俤倜剃嚏嚔悌悐惕惖掦揥替歒殢涕睼籊薙褅趯迏逖逷銻鐟锑髢髰鬀鬄]>tì; +[屉屜]>ti; +[倎兲天婖沗添酟靔靝黇]>tiān; +[㧂䑚䟧䡒䡘䥖嗔塡填屇恬搷沺湉璳甛甜田畋畑盷窴胋菾闐阗鷆鷏]>tián; +[㐁㖭㙉㥏䄼䄽䐌䠄䣯䩄唺忝悿晪殄淟睓腆舔覥觍賟錪鍩锘靦餂]>tiǎn; +[㮇㶺掭煔]>tiàn; +[頲颋]>tian; +[佻庣恌挑旫祧聎蓨鮡]>tiāo; +[㑿㟘䎄䒒䖺䟭䩦䯾䱔䳂岧岹条條樤祒笤芀苕萔蜩趒迢鋚鎥鞗髫鰷鲦齠龆]>tiáo; +[㸠䠷嬥宨晀窕誂]>tiǎo; +[朓眺窱粜糶絩脁覜跳]>tiào; +[呫帖怗萜貼贴]>tiē; +[䥫鉄銕鋨鐡鐵铁锇驖鴩]>tiě; +[䴴䵿蛈飻餮]>tiè; +[厅厛听圢庁廰廳桯汀綎耓耵聴聼聽艼鞓]>tīng; +[㹶䗴䱓亭停婷嵉庭廷朾楟榳渟筳聤莛葶蜓蝏諪邒閮霆鯅鼮]>tíng; +[䋼䦐䵺侹挺梃涏烶珽町甼脡艇誔鋌铤]>tǐng; +[嗵恫樋炵熥狪痌蓪通]>tōng; +[㠉㠽㣚㣠㤏㮔㸗㼧㼿䂈䆚䮵䳋䴀䶱仝佟侗僮勭同哃峂峒峝庝彤晍曈朣桐氃浵潼烔燑爞犝獞瞳砼硐秱穜童筩粡絧罿膧艟茼蕫蚒詷迵酮鉖鉵銅铜餇鮦鲖鼨]>tóng; +[㛚㪌䆹姛捅桶筒統綂统]>tǒng; +[恸慟憅痛蘣衕]>tòng; +[偷偸婾媮鍮]>tōu; +[㓱㡏㢏䵉亠匬坄头投牏酘頭骰]>tóu; +[㪗䱏妵斢紏鈄钭黈]>tǒu; +[㖣䞬䟝透]>tòu; +[凸堗嶀廜捸涋痜禿秃突鋵]>tū; +[㭸㻌㻠㻬㻯䅷䖘䠈䣄䣝䤅䳜凃図图圖圗塗宊屠峹嵞庩徒怢捈揬梌湥潳瑹瘏稌筡腯荼葖蒤跿途酴鈯鍎馟駼鵚鶟鷋鷵鼵]>tú; +[吐唋土圡芏釷钍]>tǔ; +[兎兔堍菟鵵]>tù; +涂>tu; +[湍煓猯貒]>tuān; +[㩛䊜剸团団團慱抟摶槫漙糰鏄鷻]>tuán; +[䜝䵯畽疃黗]>tuǎn; +[彖褖]>tuàn; +[推蓷藬]>tuī; +[㢈㢑㾯㾽㿉㿗䀃䅪䍾䫋尵弚橔穨蘈蹪隤頹頺頽颓魋]>tuí; +[㞂㱣㾼俀僓腿蹆骽]>tuǐ; +[㦌㷟娧煺退駾]>tuì; +[吞呑啍噋旽暾朜涒炖焞]>tūn; +[㞘㩔㹠㼊坉屯忳臀臋芚訰豘豚軘霕飩饨魨鲀]>tún; +[㖔氽]>tǔn; +褪>tùn; +[仛佗侂侻咃托扥拕拖挩捝杔汑沰涶牠矺脫脱託讬飥饦馲驝]>tuō; +[㸰㸱㼠㾃䍫䡐䪑䭾䰿䴱坨堶岮沱沲狏砣砤碢紽袉詑跎迱酡阤陀陁鞁馱駄駞騨驒驮魠鮀鴕鸵鼉鼍鼧]>tuó; +[㟎䓕䲊妥媠嫷庹彵撱椭楕橢軃鰖鵎]>tuǒ; +[唾拓柝槖橐毤毻箨籜萚蘀跅]>tuò; +[駝驼]>tuo; +[劸嗗娲媧徍挖搲攨洼溛漥畖穵窊窪聉蛙鼃]>wā; +[㰪娃]>wá; +[㧚㼘佤咓瓦邷]>wǎ; +[䎳䚴䠚嗢婠淴腽膃袜襪韈韤]>wà; +哇>wa; +[㖞咼喎歪]>wāi; +[䠿外懀]>wài; +[剜帵弯彎湾潫灣蜿豌]>wān; +[㝴䯈丸刓完抏汍烷玩琓紈纨芄頑顽]>wán; +[㜶㽜㿸䂺䅋䖤䗕䘼䛷䝹䩊䳃倇埦婉宛惋挽晚晩晼梚椀浣澣琬畹皖盌睌睕碗綩綰绾脕莞菀萖踠輓鋄鋔錽鞔鯇鲩]>wǎn; +[㸘䥑万仴卍卐忨捥綄翫腕萬蟃貦贎鎫]>wàn; +[㑌尢尣尩-尫汪]>wāng; +[亡亾仼兦彺王莣蚟]>wáng; +[㓁㲿㳹㴏䋄䋞䰣往徃忹惘暀棢瀇網网罒罔菵蛧蝄誷輞辋迬魍]>wǎng; +[䛃䤑妄忘旺望朢迋]>wàng; +枉>wang; +[倭偎危喴威媁媙崴巍微愄揋椳楲渨溾烓煨燰碨萎葨葳蝛覣詴逶隇隈鰃鰄鳂]>wēi; +[㕒㣲㧑䉠䑊䔺䜅䝐䥩䧦唯囗囲围圍圩壝峗峞嵬帏帷幃惟桅欈沩洈涠湋溦潍潿濰瀢琟癓矀維维蒍蔿薇覹违違鄬醀鍏闈闱霺韋韦鮠]>wéi; +[㖐㞇㞑㟪㠕㢻㨊㬙㭏㱬䃬䈧䞔䪘䬐䬿䵋亹伟伪偉偽僞儰喡委娓寪尾崣嵔徫愇斖暐梶椲洧浘濻炜煒猥玮瑋痏痿硊磈緯纬腲艉芛苇荱葦蓶薳蘤蜲諉诿踓鍡隗韑韙韡韪頠颹骩-骫鮪鲔]>wěi; +[㥜㦣㷉䗽䘙䙿䜜䡺䪋䬑䭳䮹䲁䵳为位卫叞味喂媦嬒尉徻慰未渭為煟熭爲犚犩畏硙磑緭罻胃苿菋蔚薉藯蘶蜼螱衛衞褽謂讆讏谓贀躗躛軎轊錗鏏霨餧餵魏鮇鳚]>wèi; +[猬蝟]>wei; +[塭昷殟温溫瑥瘟瞃豱輼轀辒馧鰛鰮鳁]>wēn; +[䎹䎽䘇䰚彣文炆玟珳琝瘒紋纹聞芠蚉蚊螡蟁閿闅闦闻阌雯馼魰鳼鴍鴖鼤]>wén; +[㒚㖧㗃㝧㳷刎吻呡桽稳穏穩肳脗]>wěn; +[伆問妏抆揾搵汶渂熓璺紊莬问]>wèn; +[嗡嵡翁螉鎓霐鶲鹟]>wēng; +[㘢㜲䐥䤰勜塕奣暡浻滃瞈聬蓊]>wěng; +[瓮甕罋齆𦧅]>wèng; +[唩涡涹渦猧窝窩莴萵蜗蝸踒]>wō; +[㦱㧴䰀婑我捰]>wǒ; +[㠛㱧䁊䠎偓卧幄捾握斡楃沃涴渥濣焥肟臥蒦齷龌]>wò; +[乌剭呜嗚圬媉屋巫弙杇歍汙汚污洿烏瑦窏箼腛螐誣诬邬鄔鰞鴮鼿]>wū; +[㷻㹳㻍䍢䦜䫓䮏吳吴吾呉唔娪无梧毋洖浯無牾珸璑祦禑膴芜茣莁蕪蜈誈郚鋘鋙铻鯃鵐鷡鹀麌鼯]>wú; +[㐅㑄㬳㵲䒉䟼䡧䳇五仵侮倵儛午啎墲妩娒娬嫵嵨庑廡忤怃憮捂摀旿橆武潕玝珷甒碔舞躌鵡鹉]>wǔ; +[㐳㡔㽾䃖䎸䑁䛩䦍䳱俉兀勿卼坞垭塢奦婺寤屼岉嵍忢悞悟悮戊扤敄晤杌沕溩焐熃物痦矹窹粅芴蘁誤误迕逜遻鋈鎢钨阢隖雾霚霧靰騖骛齀兀]>wù; +[伍务務]>wu; +[䂀俙傒僁僖兮凞卥厀吸唏唽嘻噏夕奚娭媐嬆嬉屖嵠嶲巇希徆徯忚怷怸恓悉悕惁惜扱扸捿擕晞晰曦析桸榽樨橀欷歖氥浠淅溪潝烯焈煕熄熈熙熹-熻燨爔牺犀犧琋瓗皙睎睳瞦硒禧稀窸糦縘繥羲肹膝舾莃菥蒵蜥螅螇蟋蠵覀觹觽觿譆谿豀豨豯貕蹊酅醯錫鏭鑴锡隵雟騱驨鵗黊鼷凞𥋟]>xī; +[㔒㠄㤴㦻㩗㳧㵿㽯㿇䀘䏮䫣习媳嶍席昔棤椺槢檄欯漝焟焬獥瘜習蒠蓆薂袭裼襲覡觋謵趘郋鎴钖隰霫飁騽鰼鳛]>xí; +[䢄匸喜囍壐屣徙憘憙敼暿枲洗漇狶玺璽矖簁縰纚葈葸蓰蟢諰蹝躧酾釃霼鱚]>xǐ; +[㑶㙾㚛㞒㣟㤸㥡㭡㸍㹫䈪䊠䐼䓇䙽䚷䛥䜁䧍䨳䩤䮎䲪係卌呬咥喺嚊嚱墍屃屓屭忥怬恄戏戯戱戲晳椞歙汐滊潟澙熂犔盻矽磶禊稧穸系細綌繋繫细绤翕翖肸舃舄蕮虩衋覤謑赥赩郄郤鄎釳釸鎎闟阋隙隟餼饩鬩黖齂]>xì; +[息西]>xi; +[傄呷煆煵疨瞎虾蝦谺鍜閕颬]>xiā; +[㗇㘡㰺㽠䖎䖖䘥䛅䦖䪗䫗侠俠冾匣峡峽搳敮暇柙炠烚狎狭狹珨瑕硖硤碬磍祫笚筪縀縖翈舝蕸赮轄辖遐鎋陜霞騢魻鰕黠]>xiá; +閜>xiǎ; +[㗿㙤丅下吓嚇夏夓懗欱疜睱罅芐鏬鶷]>xià; +[仚僊先嘕奾嬐孅屳廯忺憸掀掺摻暹杴枮氙澖珗祅祆秈籼纎纖纤苮蓒蘐褼襳訮跹蹮躚酰銛鍁铦锨韯韱馦鮮鱻鲜]>xiān; +[㘅㘋㛾㡉㢺㭹㮭㳄㳭㵪䒸䕔䝨䦥䲗䶢咸唌啣嗛娴娹婱嫌嫺嫻弦憪涎燅甉痃痫癇癎瞯瞷礥絃羬胘舷葴藖蚿蛝衔衘諴賢贒贤輱銜閑閒闲鷳鷴鷼鹇鹹]>xián; +[㜪㧋㧥㫫㬎㭠㯀㶍㿅䉳䗾䘆䚚䜢䢾䥪䧋䧮冼尟尠崄嶮幰搟攇显櫶毨灦烍燹狝猃獫獮玁癣癬礆禒筅箲藓蘚赻跣銑鍌铣险険險韅顕顯鼸齴]>xiǎn; +[㔵㡾㦓㩈㪇㬗㺌䀏䁂䃱䃸䉯䏹䞁䤼䧟䨘䨷䱤䵇䶟伣俔僩僴县咞哯垷姭娊宪岘峴憲撊晛橌涀瀗献獻现現県睍粯糮絤綫線縣线缐羡羨腺臔臽苋莧蚬蜆袨誢豏轞鋧錎限陥陷霰餡馅麲𠜎]>xiàn; +仙>xian; +[㐮乡厢啌廂忀欀湘瓖相箱緗纕缃膷芗葙薌襄郷鄉鄊鄕鑲镶香驤骧麘]>xiāng; +[㟄䔗䜶佭庠栙祥絴翔詳详跭祥]>xiáng; +[㗽䊑䖮享亯响奛嶑想晑響飨餉饗饟饷鮝鯗鱶鲞]>xiǎng; +[㟟䐟䢽像向嚮塂巷恦曏橡珦萫蚃蟓蠁襐象鐌闀闂項项鱌]>xiàng; +[呺哓哮啋嘋嘐嘵嚣嚻囂婋宯宵庨彇憢撨枭枵梟櫹歊毊消潇潚瀟灱灲烋焇獢痚痟硝硣穘窙箫箾簘簫綃绡翛膮萧萷蕭藃虈虓蟏蟰蠨踃逍銷销霄驍骁髇魈鮹鴞鸮]>xiāo; +[㑾㚣㬵䒝洨笅訤誵郩]>xiáo; +[䒕䥵小晓暁曉皢筱筿篠謏]>xiǎo; +[㔅㗛㤊㹲䊥䕧俲傚効咲啸嘨嘯娎孝恔效敩斅斆校歗涍熽笑肖藠誟鞩]>xiào; +[些歇猲薛蠍褉]>xiē; +[㖿㙝㥟㨙㩉㩦㩪㭨䔑䕵䙎䡡䭎偕劦勰协協嗋垥奊恊愶慀拹挟挾搚携撷擷攜斜旪熁燲籺絜綊緳纈缬翓胁脅脇脥膎蝢衺襭諧谐邪鋣鞋鞵龤𩋘𩋧]>xié; +[㕐㝍䥱䥾写冩寫藛躠]>xiě; +[㒠㓔㔎㖑㙰㞕㣯㣰㦪㨝㰔㰡㳦㳿㴬㴮㴽㸉㽊䉏䉣䊝䕈䙊䙝䚳䚸䢡䦏䦑䩧䲒䵦亵伳偰卨卸塮妎媟屑屟屧嶰廨徢懈揳斺暬械楔榍榭泄泻洩渫澥瀉瀣灺焎燮爕獬疶祄禼糏紲絏絬緤绁缷薤蟹蠏衸褻謝谢躞邂鞢韰駴骱齘齥]>xiè; +[䜣俽兓噷妡廞心忻惞新昕杺欣歆炘盺芯莘薪訢辛鈊鋅鑫锌馨騂骍]>xīn; +[㚯䰼攳樳襑鄩]>xín; +伈>xǐn; +[㐰㛛㭄䒖䚱䛨䜗伩信卂囟孞焮煡脪舋衅訫軐釁阠顖馸]>xìn; +[垶惺星曐煋猩瑆皨篂腥蛵觪觲鍟馫鮏鯹]>xīng; +[㐩㓝㣜㼛䣆䤯侀刑坓型娙形洐濴烆硎筕胻行邢郉鈃鉶銒鋞钘铏陉陘雽餳饧]>xíng; +[㝭㨘㮐䳙擤渻睲醒]>xǐng; +[㓑㼬䁄䂔䓷䛭䰢倖兴姓婞嬹幸性悻杏涬緈臖興荇莕]>xìng; +[㐫兄兇凶匈哅忷恟汹洶胷胸訩詾讻賯]>xiōng; +[䧺熊赨雄]>xióng; +[夐敻詗诇]>xiòng; +[休俢修咻庥樇烌羞脩臹茠蓚貅銝鎀鏅饈馐髤髹鵂鸺]>xiū; +[㱙朽糔綇]>xiǔ; +[㗜㾋嗅嘼岫峀溴珛琇秀綉繍繡绣袖褎褏銹鏥鏽锈齅]>xiù; +[偦吁呴嘘噓墟媭嬃嬬幁戌揟旴晇楈欨欰歔歘疞盱稰籲縃繻胥蕦虗虚虛蝑訏譃鑐需須须驉鬚魖]>xū; +[䍱俆徐蒣]>xú; +[㑔㑯㞰㥠䅡䔓冔喣姁昫栩湑煦珝糈許詡諝许诩谞鄦醑]>xǔ; +[㐨㕛㖅㗵㘧㚜㜅㜿㞊㤢㦽㰲㵰㷦㺷㾥䂆䋶䘏䙒䛙䜡䢕䣱䣴䦗䦽䬔䱛䳳伵侐勖勗卹叙垿壻婿序怴恤慉敍敘旭-旯朂槒殈汿沀洫溆漵潊烅珬盢瞁瞲稸窢絮緒緖續绪续聟芧蓄藇藚訹賉酗銊頊顼魆魣鱮]>xù; +[佡儇吅咺塇媗宣弲愃愋揎昍晅暄梋煊瑄睻矎禤翧翾萱蕿藼蝖蠉諠諼譞谖軒轩鋗鍹鶱]>xuān; +[㘣㳬㹡䁢䗠䮄䲂䲻䴉䴋伭妶嫙悬懸旋暶檈漩玄玹琁璇璿蜁誸鹮]>xuán; +[㾌䍻䠣喧暅烜选選]>xuǎn; +[㧦㳙䍗䘩䝮䧎䩙䩰埍怰昡楥楦泫渲潠炫眩眴碹絢縼繏绚蔙衒讂贙鉉鏇铉镟鞙颴駽]>xuàn; +[削吙屵蒆辥靴鞾]>xuē; +[㖸㧒㶅㿱䫻䱑乴学學峃嶨斈泶澩燢茓觷雤鷽鸴𥄴]>xué; +[㡜䨮雪鱈鳕]>xuě; +[㞽䎀䤕䫼䬂䭥吷坹岤桖泬烕穴血謞趐]>xuè; +[勋勛勲勳坃埙塤壎壦曛焄熏燻獯矄纁臐蔒薫薰蘍醺𤑕]>xūn; +[㜄㝁㨚㰊㰬㽦䋸䖲䙉偱噚寻尋峋巡廵循恂挦撏旬杊枔栒桪槆橁毥洵浔潃潯灥燖珣璕畃紃荀荨蕁蟳詢询郇馴駨驯鱏鱘鲟]>xún; +[㢲䛜䞊䭀伨侚噀埈奞巺巽徇殉汛爋狥蕈訊訙讯賐迅迿逊遜鑂陖韗顨鵔鵕]>xùn; +[訓训]>xun; +[丫劜压圧壓孲庘押椏鴉鴨鵶鸦鸭]>yā; +[㧎䄰䊦伢厓堐岈崕崖枒桠涯漄牙犽猚笌芽蚜衙齖]>yá; +[㿿䪵厊哑唖啞庌痖瘂蕥雃雅]>yǎ; +[㝞㰳䅉䝟䢝䦪䯉䰲䵝亚亜亞俹嚈圠埡娅婭挜掗揠氩氬猰玡砑稏窫聐襾訝讶軋轧迓錏鐚铔齾]>yà; +呀>ya; +睚>yái; +[偣剦啱嫣嬮崦懕懨淹漹烟焉煙猒珚篶胭臙菸蔫鄢酀醃閹阉黭]>yān; +[㗴㘖㘙㫟㳂㶄㿕㿼䀋䀽䂴䇾䊙䌪䓂䕾䖗䗡䢥䤷䱲䶮严厳嚴埏塩壛壧妍姸娫娮孍岩嵒嵓巌巖巗延揅昖楌檐櫩沿湺炎狿琂盐研硏碞礹筵簷綖莚葕蔅虤蜒言詽讠郔鈆閻阎顃顏顔颜鹽麙麣]>yán; +[㓧㕣㚧㢂㫃㭺䁙䄋䊻䎦䗺䣍䲓乵俨偃儼兖兗剡匽厣厴噞夵奄姶嵃嶖巘巚弇愝戭扊抁掩揜曮棪椼檿沇渰渷演琰甗眼硽罨萒蝘衍裺褗躽遃郾酓隒験魇魘鰋鶠黡黤黶鼴鼹龑]>yǎn; +[㛪㢛㦔㬫㷔㷳㷼䂩䅧䑍䜩䢭䨄䭘䳛䳺䴏偐傿厌厭咽唁喭嚥堰墕妟姲婩嬊嬿宴彥彦恹敥晏暥曣椻滟灎灔灧灩焔焰焱燄燕爓牪砚硯艳艶艷覎觃觾諺讌讞谚谳豓豔贋贗赝酽醼釅閆闫隁雁餍饜騐騴驗驠验鳫鴈鴳鷃鷰]>yàn; +[佒咉央姎柍殃泱眏秧紻胦鉠鴦鸯]>yāng; +[㟅㬕䁑䖹䬗佯劷垟崵徉扬揚敭旸昜暘杨楊洋炀烊煬玚珜瑒疡瘍眻禓羊羏蛘諹輰鍚鐊阦阳陽霷颺飏鰑鸉]>yáng; +[㔦䇦䑆䒋䬬仰傟养勨坱岟慃懩抰攁氧氱炴痒癢蝆鞅養餋駚]>yǎng; +[㨾㺊㿮䬺䭐䵮怏恙样様樣漾瀁羕詇]>yàng; +[吆喓妖幺枖楆腰葽訞邀]>yāo; +[㨱㮁䂚䆙䉰䋂䌊䌛䍃䔄䖴䚺䚻䢣䬙倄傜嗂垚堯姚媱尧尭峣崤嶢嶤徭愮揺搖摇暚榣殽淆烑爻猇猺珧瑤瑶窑窯窰肴蘨謠謡谣軺轺遙遥邎銚铫颻飖餆餚鰩鳐𨍳]>yáo; +[㟱㢓㫏㫐㴭䁏䁘䆞䴠䶧仸偠咬夭婹宎岆崾抭杳柼榚殀溔眑窅窈窔舀苭蓔闄騕鷕鼼齩]>yǎo; +[㔽㝔㞁㵸㿑㿢䋤䑬䙅曜熎燿獟矅穾筄耀艞药葯薬藥袎要覞讑趭鑰钥靿鷂鹞]>yào; +[倻噎晔蠮]>yē; +[䓉䥺峫捓揶擨椰琊瑘耶釾鎁铘]>yé; +[㙒也冶吔嘢埜壄漜野]>yě; +[㐖㖡㖶㗼㙪㝣㥷㩎㪑㱉㸣䈎䤳䤶䥟䥡䧨䭟䲜业亱偞僷叶啘墷夜嶪嶫忦擛擪擫曄曅曗曵枼枽楪業殗殜液澲烨煠燁爗皣瞱瞸葉謁譺谒邺鄴鍱鎑鐷靥靨頁页餣饁馌驜鵺鸈]>yè; +[爷爺]>ye; +[㘈一伊依医吚咿噫壱壹夁嫛弌悘揖檹欹毉泆洢溰漪燚猗瑿祎禕稦繄蛜衣譩郼醫陭餏饻鷖鹥黟黳𣘦]>yī; +[㚦㝖㞔㥴㦾㰘㺿䄬䇵䐅䐖䖊䞅䩟䬁䬮䮊䱌䲑䴊乁仪侇儀冝凒匜咦圯夷姨宐宧寲峓嶬巸弬彛-彞怡恞扅暆杝枱柂桋椸歋沂沶洟熪珆瓵疑痍眤眱移簃羠胰苐萓蛦螔袘袲觺訑詒謻讉诒貤貽贻跠迻遗遺酏鈶鏔頉頤顊颐飴饴鮧鴺鸃]>yí; +[㕥㠯㩘㫊㰝㰻䝝䧧䰙乙以倚偯崺已庡扆扡掜攺旑旖晲栘椅檥矣礒笖肔胣舣艤苡苢蚁螘蟻衪輢轙迆迤逘釔鉯銥钇铱顗鳦齮]>yǐ; +[㐹㑊㑜㑥㓷㔴㖂㘁㘊㙠㙯㚤㛕㜋㜒㡫㡼㢞㣂㣻㦉㦤㱅㱲㲼㳑㴁㴒㵝㵩㶠㹓㹭㽈䄁䄿䆿䇩䉨䋚䋵䌻䎈䓃䓈䓹䔬䕍䖁䗑䗟䗷䘝䘸䝘䝯䢃䣧䦴䬥䭂䭇䭞䭿䯆䱒䴬乂义亄亦亿仡伇伿佚佾俋億兿刈劓劮勚勩呓呭呹唈嗌囈圛垼埶埸墿奕嫕嬑嬟寱屹峄嶧帟帠幆廙异弈弋役忆怈怿悒悥意憶懌懿抑抴挹捙掖撎敡斁易晹曀曎曳杙枍枻栧棭榏槷檍欭歝殔殪殹毅洂浂浥浳湙溢潩澺瀷炈焲熠熤熼燡燱獈玴異疫痬瘗瘞瘱癔益睪瞖秇穓竩緆縊繶繹绎缢羛義羿翊翌翳翼肄肊腋膉臆艗艺芅苅蓺薏藙藝蘙虉蛡蜴螠袣裔裛褹襼訲訳詍詣誼譯議讛议译诣谊豙豛豷跇軼轶逸邑醳醷釴鈠鎰鐿镒镱阣隿霬靾鞥顡饐駅驛驿骮鯣鶂鶃鷧鷾黓齸益逸𥜥]>yì; +宜>yi; +曕>yiàn; +鴁>yiāo; +[侌凐喑噾囙因垔堙姻婣峾廕愔慇摿歅殷氤洇洕湮溵瘖禋秵筃絪緸茵蒑裀諲銦铟闉阥阴陰陻隂霒霠鞇音韽韾駰骃黫]>yīn; +[㕂㖗㙬㝙㞤㸒㹜㹞䓄䖜䪩冘吟唫噖嚚圁垠夤婬寅崟崯斦檭殥泿淫滛烎犾狺璌碒苂荶蔩蟫訔訚訡誾鄞釿鈝銀银霪鰥鳏鷣]>yín; +[㐆㡥㥯㥼㦩㧈㱃㾙䇙䌥䒡䤺䨸乚尹嶾廴引檃櫽淾濦瘾癮磤紖縯纼蘟蚓螾讔趛鈏隐隠隱靷飮飲饮馻]>yǐn; +[㣧㪦㴈㼉䕃䚿䡛䤃䲟印垽堷慭憖憗懚朄檼湚濥猌癊窨胤茚荫蔭酳鮣]>yìn; +[偀嘤嚶婴媖嫈嬰孆孾应応應撄攖朠桜楧樱櫻渶煐瑛璎瓔甇甖碤礯緓纓绬缨罂罃罌膺英莺蘡蝧蠳褮譻鍈鑍锳霙韺鴬鶧鶯鷪鷹鸎鸚鹦鹰]>yīng; +[㢍㨕㴄㵬㹙㹚㿘䁝䃷䑉䕦䪯僌営塋嬴巆廮攍楹櫿溁滎潆濙濚瀛瀠瀯熒營瑩盁盈籝籯縈茔荥荧莹萤-萦萾藀蛍蝿螢覮謍贏赢迎]>yíng; +[㯋㲟䀴䨍䭊䭗巊影梬浧潁瀴璄瘿癭矨穎郢頴颍颕颖]>yǐng; +[㑞䁐䙬䤝噟媵摬映暎滢瀅硬膡蓥譍賏鎣鐛鞕]>yìng; +[蝇蠅]>ying; +[哟唷喲]>yō; +[㐯傭嗈噰墉壅庸廱慵拥擁澭瀜灉痈癕癰蕹邕郺鄘鏞镛雍雝饔𠆌]>yōng; +[㝘䗤喁嫆嫞槦滽牅顒颙鱅鳙]>yóng; +[㙲㦷㷏㽫䞻俑傛勇勈咏埇塎嵱彮恿悀惥愑愹慂搈柡栐永泳涌湧甬禜臃蛹詠踊踴鯒鲬]>yǒng; +[㞲㶲佣用苚醟]>yòng; +[优優呦嚘幽忧怮悠憂攸櫌瀀纋耰鄾麀]>yōu; +[㒡㕱㘥㚭㛜㫍㳺㻀㽕䑻䖻䚃䢊䢟囮尤峳怣斿楢櫾沋油浟游滺犹猶猷由疣秞肬莤莸蕕蚰蝣訧輏輶逌逰遊邮郵鈾铀駀魷鮋鯈鱿鲉]>yóu; +[㮋㰶㾞䅎䒴䬀䱂䳑丣偤卣唀岰庮懮有栯梄槱泑湵牖禉羐羑聈苃莠蚴蜏酉銪铕黝]>yǒu; +[㓜㕗㤑㹨㺠䀁䆜䛻䞥亴佑侑又右囿姷宥峟幼柚牰狖祐糿誘诱貁迶酭釉鴢鼬]>yòu; +友>you; +[唹扜毹毺淤瘀盓穻箊紆纡虶迂迃陓]>yū; +[㒜㚥㤤㥔㥚㥥㦛㪀㬂㬰㳛㶛㷒㺞㺮㼶䁩䂛䃋䄏䄨䍂䏸䐳䔡䗨䜽䢓䩒䰻䱷䲣于亐伃余俞兪堣堬妤娛娯娱媀嬩崳嵎嵛愉愚扵揄於旟杅桙楡楰榆欤歈歟歶渔渝湡漁澞狳玗玙瑜璵畬畭畲盂睮硢禺窬竽籅緰羭腧腴臾舁舆艅茰萸蕍蘛虞蝓螸衧褕覦觎諛謣谀踰輿轝逾邘鄃釪鍝隃隅雓雩餘馀骬髃魚鮽鰅鱼鵌鷠鸆鸒]>yú; +[㑨㒁㔱㙑㝢㠘㡰㣃㲾㺄㼌䣁䥏䨞与予伛俁俣偊傴噳圄圉宇寙屿峿嶼庾懙敔斔斞楀瑀瘐祤禹窳篽羽聥與萭蓹蘌螤語语貐鄅酑雨齬龉羽]>yǔ; +[㠨㳚㽣䁌䂊䆷䈅䉛䋖䍞䖇䘘䘱䛕䢩䨒䬄䮇䮙䴁䵫俼哊喅喐喩喻噊圫域堉墺妪嫗寓峪嶎庽彧御忬悆悇惐愈慾戫昱棛棜棫櫲欎欝欥欲毓汩浴淢淯滪澦灪焴煜燏燠爩狱獄獝玉琙瘉癒矞砡硲礇礖礜禦秗稢稶穥籞緎繘罭聿肀育芋芌茟萮蒮蓣蕷薁蜟蜮裕誉諭譽谕豫軉輍逳遇遹郁醧鈺銉鋊錥鐭钰閾阈隩霱預预飫饇饫馭騟驈驭鬰鬱鬻魊鳿鴥鴪鵒鷸鹆鹬黦龥]>yù; +[冤剈噮囦嬽寃悁惌棩淵渁渆渊渕灁眢箢肙葾蒬蜎蜵裷鋺駌鳶鴛鵷鸢鸳鹓鼘鼝]>yuān; +[㟶㥳㹉䖠䬧䲮䳒䳣元原厡厵员員园圆圎園圓圜垣塬妧媴嫄岏援杬榞榬橼櫞沅湲源溒爰猨猭猿獂笎緣縁缘羱芫萲蒝薗蚖蝝蝯螈袁貟贠轅辕邍邧鎱騵魭鶢鶰黿鼋]>yuán; +[䛄䛇䩩妴远逺遠]>yuǎn; +[㤪㥐㭇䅈䏍䬇䬼傆夗媛怨愿掾瑗禐苑衏裫褑褤謜院願]>yuàn; +[曰曱箹約约]>yuē; +[哕噦]>yuě; +[㜧㜰㬦㰛㹊䋐䖃䟠䠯䡇䢁䢲䤦䥃䶳刖妜岄岳嶽恱悅悦戉抈捳月枂樾泧瀹爚狘玥礿禴篗籆籥籰粤粵蘥蚎蚏越跀跃躍軏鈅鉞钺閱閲阅鸑鸙龠]>yuè; +[奫晕暈氲氳煴緼縕缊蒀蒕蝹贇赟]>yūn; +[㚃㜏䉙䢵云勻匀妘愪昀榅榲橒沄涢溳澐熅熉畇眃秐筠筼篔紜縜纭耘耺芸荺蒷蕓郧鄖鋆雲饂]>yún; +[䆬䇖䞫䡝䤞䦾䨶䪳傊允喗抎殒殞狁玧磒褞賱輑鈗阭陨隕霣]>yǔn; +[㚺㞌㟦䚋䩵䲰䵴囩夽孕恽惲愠慍枟熨緷腪蕰蕴薀藴蘊运運郓鄆酝醖醞韞韫韵韻鶤]>yùn; +[匝咂帀抸沞迊鉔]>zā; +[䕹䞙䪞偺囐嶻杂砸磼襍雑雜雥韴魳]>zá; +[咋鮺鲝]>zǎ; +[哉栽渽災灾烖賳𢦏]>zāi; +[㞨㱰㴓䏁䣬䮨宰崽縡]>zǎi; +[䵧侢傤儎再在扗載载酨]>zài; +[兂簪簮鐕]>zān; +[倃咱喒糌]>zán; +[㤰儧儹噆寁拶撍攅攒攢昝桚沯礸禶趱趲]>zǎn; +[㜺㟛㣅囋暂暫欑濽灒瓉瓒瓚穳襸讃讚賛贊赞鄼酂酇錾鏨]>zàn; +[匨牂羘臜臢蔵賍賘贓贜赃髒]>zāng; +臧>záng; +[駔驵]>zǎng; +[㘸塟奘弉脏臓臟葬銺]>zàng; +[傮糟蹧遭]>zāo; +[䥣凿醩鑿]>záo; +[䲃早枣棗澡璪繰缲薻藻蚤]>zǎo; +[㲧㿷䜊唕唣噪慥梍灶燥皁皂竃竈艁譟趮躁造髞]>zào; +[㖽㣱㳻䃎䇥䕉䕪䰹䶦则則啧嘖崱帻幘択择捑擇沢泽溭澤皟瞔笮箦簀耫舴荝萴蠈蠌諎謮責賾责赜迮鰂鲗]>zé; +[㳁仄夨庂昃昗汄稄]>zè; +[戝賊贼鱡]>zéi; +怎>zěn; +[䫈譖譛谮]>zèn; +[増增憎橧熷璔矰磳繒缯罾譄驓]>zēng; +㽪>zěng; +[䙢䰝甑贈赠]>zèng; +[偧剳哳喳扎抯挓揸摣柤楂樝渣猹皶皻觰齄齇]>zhā; +[㱜㴙䥷䵵劄札牐甴箚紥紮蚻蠿譗鍘铡閘闸霅]>zhá; +[㒀㡸㷢䋾䕢䛽䵙厏眨苲鮓鲊]>zhǎ; +[䖳䞢乍吒咤奓宱搾柵栅榨溠灹炸砟簎膪蚱詐诈醡]>zhà; +[捚摘斋斎榸齋]>zhāi; +[㡯宅礋]>zhái; +[窄鉙飵]>zhǎi; +[㩟债債寨瘵砦]>zhài; +[厃嶦旃旜栴毡氈氊沾瞻粘覘觇詀詹譫讝谵趈邅鉆霑飦饘驙鱣鳣鸇鹯]>zhān; +薝>zhán; +[㞡㠭䁴䎒䟋䡀䩅䱼嫸展崭嶃嶄拃搌斩斬椫榐樿橏琖皽盏盞蹍輾辗醆颭飐魙]>zhǎn; +[㟞㺘㻵䋎䗃䘺䪌䱠佔偡占嶘战戦戰栈桟棧椾湛站綻绽菚蘸虥虦覱蹔輚轏]>zhàn; +[傽墇嫜张張彰慞暲樟漳獐璋章粻蔁蟑遧鄣餦騿鱆麞]>zhāng; +[仉掌涨漲礃绱長长鞝]>zhǎng; +[㕩㙣㽴丈仗嶂帐帳幛扙杖涱痮瘬瘴瞕緔胀脹賬账障]>zhàng; +[妱巶招昭柖盄窼釗鉊鍣钊駋]>zhāo; +[㕚㺐䈃䝖找沼爪瑵菬]>zhǎo; +[㡽㨄㷖䃍䈇䍜䍮䮓兆召垗旐曌枛櫂炤照燳狣瞾笊箌罩羄肁肇肈詔诏赵趙雿鵫]>zhào; +[嗻嫬晢晣螫遮]>zhē; +[㞏㪿㯰䊞䎲䐑䐲䓆䝃䝕乇厇哲啠喆嚞埑悊折摺歽瓋砓磔籷耴虴蜇褶襵詟謫謺讁讋讘谪輒輙辄銸鮿鸅]>zhé; +[啫禇者赭踷]>zhě; +[䂞䏳䗪䠦䩾䵭柘檡浙烢蟅这這鷓鹧]>zhè; +[着著蔗]>zhe; +[侦偵堻媜嫃寊帪揁搸斟栕桢桭楨榛樼溱潧澵獉珍珎瑊甄眞真砧碪磌祯禎禛箴籈縝缜胗臻蒖蒧蓁薽貞贞轃遉酙針鉁錱鍼针靕駗鱵]>zhēn; +[㐱㪛䂦䂧䑐䪴䫬弫抌抮昣晸枕畛疹眕稹笉紾絼縥聄袗裖診诊軫轸辴鬒黰]>zhěn; +[㓄㣀㮳㯢㴨䊶䏖䝩䟴䨯䲴䳲侲圳塦挋振揕敒敶朕栚瑱眹蜄誫賑赈鎭鎮镇阵陣震鴆鸩]>zhèn; +[争佂埩姃峥崝崢征徰徴徵怔挣掙炡烝爭狰猙癥眐睁睜筝箏篜聇蒸諍诤踭鉦錚鏳钲铮鬇]>zhēng; +[䡕愸抍拯掟撜整氶糽]>zhěng; +[㡠㡧㱏㽀䂻䈣䛫䥌䥭䦛䦶帧幀政正症証證证郑鄭鋥锃鴊𠔻]>zhèng; +[之卮吱坧墌嬂巵搘支枝枳栀梔椥榰汁汥疧知祇祗祬秓秖秪綕織织肢胑胝脂芝蜘衼跖隻馶鳷鴟鴲鵄鸱鼅]>zhī; +[㙷㜼㨁䐈䟈䱥䵂侄値值儨劕埴執妷姪慹懫执摭擿柣桎植樴殖漐犆瓆瓡直禃秷稙絷縶聀职職膱蘵蛰蟄蟙褁貭踯蹠躑軄釞馽]>zhí; +[㧻㮹㲛䅩䇛䌤䎺䛗䳅劧厎只咫址坁夂帋恉扺抧指旨晊栺止沚洔淽滍疻砋祉紙纸芷藢襧訨趾軹轵酯阯黹]>zhǐ; +[㕄㗌㗧㘉㛿㝂㣥㨖㴛䄺䆈䇽䉅䉜䏄䏯䐭䑇䓌䕌䚦䝷䞃䡹䥍䦯䫕䬹䭁䱨偫傂制厔垁娡寘峙崻帙帜幟庢庤廌彘徏徝志忮憄懥挃挚掷搱摯擲旘智梽楖櫍治洷淛滞滯潌炙熫狾猘璏畤疐痔痣礩祑秩秲稚稺穉窒筫紩緻置翐胵腟膣至致臸芖蛭螲袟袠製覟觗觯觶誌豑豒豸質贄质贽跱踬躓輊轾迣郅銍鋕鑕铚锧陟雉駤騭騺驇骘鯯鴙鷙鸷]>zhì; +[中伀刣妐幒彸忠忪柊汷泈潨炂煄盅籦終终舯蔠螽衳衷蹱鈡銿鍾鐘钟锺鴤]>zhōng; +[㣫冢喠塚尰歱瘇种種肿腫踵塚]>zhǒng; +[㐺㲴䱰乑仲众偅堹妕媑湩狆眾祌筗緟茽蚛衆衶諥重]>zhòng; +[侜周啁喌州徟洀洲淍烐珘盩矪粥脽舟譸诪賙赒輈輖辀週銂騆鵃鸼]>zhōu; +[㛩妯軸轴]>zhóu; +[䎻䖞晭疛睭箒肘菷鯞]>zhǒu; +[㑇㑳㔌㥮㼙㾭䇠䈙䋓䐍䛆䩜䶇伷僽冑呪咒咮噣宙昼晝甃皱皺籀籒籕粙紂縐繇纣绉胄荮葤詋酎駎驟骤𤏲]>zhòu; +帚>zhou; +[侏劯朱株槠橥櫧櫫洙潴瀦猪珠硃祩秼絑茱蛛蝫蠩袾誅諸诛诸豬跦邾銖铢鮢鯺鴸鼄猪諸]>zhū; +[㔉䌵䕽䘚䟉䥮䮱劚灟炢烛燭爥窋竹竺笁笜築篫舳茿蓫蠋蠾趉躅逐鱁]>zhú; +[㵭䘢䰞丶主嘱囑壴孎宔拄斸欘渚濐煑煮瘃瞩矚砫罜詝貯贮陼麈]>zhǔ; +[㑏㝉㤖㧣㫂㹥㺛㾻㿾䇡䇧䍆䎷䐢䝒䝬䬡䭖伫佇住助坾嵀杼柱柷樦殶注炷疰眝祝竚筑筯箸紵紸纻羜翥苧莇蛀註諔跓軴鉒鋳鑄铸飳馵駐驻麆]>zhù; +[抓挝撾檛膼髽]>zhuā; +拽>zhuāi; +[跩𨋯]>zhuǎi; +[专叀塼嫥専專瑼甎砖磚篿耑膞蟤跧鄟顓颛鱄鷒]>zhuān; +[䡱孨竱転轉转]>zhuǎn; +[䉵僎啭囀堟撰灷瑑篆篹籑縳腞蒃襈譔賺贃赚饌馔]>zhuàn; +[妆妝娤庄桩梉樁粧糚荘莊装裝]>zhuāng; +[壮壯壵撞焋状狀]>zhuàng; +[娺椎追錐锥隹騅骓鴭鵻]>zhuī; +沝>zhuǐ; +[䄌坠墜惴桘甀硾礈窡笍縋缒膇諈譵贅赘鑆餟鵽]>zhuì; +[綴缀]>zhui; +[宒棆窀肫衠諄谆迍]>zhūn; +[准埻準綧隼鶽]>zhǔn; +稕>zhùn; +[㑁倬卓捉桌棹穛穱𠭴]>zhuō; +[㣿㪬㭬㺟䅵䕴䶂剢叕啄啅圴妰彴拙撯擆擢斀斫斮斱斲斵晫梲棁棳椓槕櫡汋泎浊浞涿濁濯灂灼炪烵焯琸硺禚篧籗籱絀绌罬茁蠗諑謶诼踔酌鋜錣鐯鐲镯鷟]>zhuó; +丵>zhuǒ; +劅>zhuò; +[兹呲咨嗞姕姿孖孜孳孶嵫栥椔淄湽滋澬玆甾禌秶稵粢紎緇缁茊茲菑葘諮谘貲資赀资趦輜輺辎鄑鈭錙鍿鎡锱镃頾頿髭鯔鲻鴜鶅鶿鷀鹚鼒齍齜龇]>zī; +[㜽㧗㺭䔂䘣仔吇呰啙姉姊杍梓榟滓矷秄秭笫籽紫耔胏芓茈虸訾訿釨]>zǐ; +[㰣㰷㱴䅆䐉倳剚字恣扻渍漬牸眥眦胔胾自茡]>zì; +子>zi; +[倧堫宗嵏嵕嵸惾朡棕椶熧猣磫稯綜緃緵综翪腙艐葼蝬豵踨踪蹤鑁騌騣骔鬃鬉鬷鯮鯼]>zōng; +[㢔㷓㹅䰌偬傯总惣愡捴揔搃摠熜総縂總蓗]>zǒng; +[䍟䝋倊昮猔疭瘲碂粽糉糭縦縱纵]>zòng; +[媰掫棷棸箃緅菆諏謅诌诹邹郰鄒鄹陬騶驺鯫鲰黀齱齺]>zōu; +[走赱]>zǒu; +[㔿㵵䠫奏揍]>zòu; +[租蒩]>zū; +[㞺㰵㲞䅸䚝䯿䱣卆卒哫崒崪捽族稡足踤踿蹵鎐鏃镞]>zú; +[䔃䖕俎爼珇祖組组詛诅阻靻]>zǔ; +[躜躦鑽钻]>zuān; +[䂎䌣籫繤纂纉纘缵]>zuǎn; +[䤸揝攥鑚饡]>zuàn; +[厜嶉樶纗羧脧蟕]>zuī; +[䮔嘴噿嶊嶵洅濢璻觜]>zuǐ; +[㝡㠑㰎䘹晬最栬槜檇檌祽絊罪蕞襊辠酔酻醉鋷錊]>zuì; +[尊嶟樽繜罇遵鐏鷷]>zūn; +[僔噂壿撙譐]>zǔn; +[捘燇銌鱒鳟]>zùn; +嘬>zuō; +[㸲䎰䝫䞰昨椊琢秨稓筰葃鈼]>zuó; +[㝾佐咗唨左毑繓]>zuǒ; +[㑅㘀㘴㛗㭮䋏䔘作侳做唑坐夎岝岞座怍柞祚糳胙葄袏酢阼]>zuò; +# End RAW data for converting CJK characters + +# fallbacks + +## | yi < i; +## | wu < u; +## | bi < b; +## | ci < c; +## | di < d; +## | fu < f; +## | gu < g; +## | he < h; +## | ji < j; +## | ku < k; +## | li < l; +## | mi < m; +## | pi < p; +## | qi < q; +## | l < r; +## | si < s; +## | ti < t; +## | f < v; +## | wa < w; +## | xi < x; +## | yi < y; +## | zi < z; + +# filter out the half-width hangul +# :: [^\uFFBE-\uFFEE] fullwidth-halfwidth (); +## :: (lower) ; diff --git a/icuSources/data/translit/Han_Spacedhan.txt b/icuSources/data/translit/Han_Spacedhan.txt new file mode 100644 index 00000000..85607b58 --- /dev/null +++ b/icuSources/data/translit/Han_Spacedhan.txt @@ -0,0 +1,24 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# Only intended for internal use +:: fullwidth-halfwidth; + +。 > '.'; + +$terminalPunct = [\.\,\:\;\?\!.,:?!。、;[:Pe:][:Pf:]]; +$initialPunct = [:Ps:][:Pi:]; + +# add space between any Han or terminal punctuation and letters, and +# between letters and Han or initial punct + +[[:Ideographic:] $terminalPunct] {} [:Letter:] > ' ' ; +[:Letter:] [:Mark:]* {} [[:Ideographic:] $initialPunct] > ' ' ; + +# remove spacing between ideographs and other letters + + < [:Ideographic:] { ' ' } [:Letter:] ; + < [:Letter:] [:Mark:]* { ' ' } [:Ideographic:] ; + diff --git a/icuSources/data/translit/Hebrew_Latin.txt b/icuSources/data/translit/Hebrew_Latin.txt new file mode 100644 index 00000000..4e0635cc --- /dev/null +++ b/icuSources/data/translit/Hebrew_Latin.txt @@ -0,0 +1,109 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# Transliteration table for Hebrew +# Based on the UNGEGN table at: +# http://www.eki.ee/wgrs/rom1_he.pdf +# +# Exceptions: +# - Accents are added to disambiguate letters +# - Combinations of dagesh, shin/sin dot that produce different +# letters are not yet encoded. +# +# To test, open: +# http://oss.software.ibm.com/cgi-bin/icu/tr +# Click Edit, paste in this file, Save As hebrew-latin/XXX +# (where XXX is a username) +# Now go back to the main window, and try it out. +# Use hebrew-latin/XXX for Output 1, and (Inverse) for Output 2 +# Paste in hebrew text in Input, and hit Transliterate. +# +# For more information, see" +# http://oss.software.ibm.com/icu/userguide/Transliteration.html + +:: [[:Hebrew:] [:^ccc=0:] [\u05B0-\u05B9\u05BB-\u05BC\u05C1-\u05C2\u2135-\u2138̄\u05BF] - [\u05BD]] ; +:: nfkd (nfc) ; +$letterAfter = [:M:]* [:L:] ; + +# move longer items here to avoid masking + +ח <> ẖ ; +צ <> ẕ } $letterAfter; +ץ <> ẕ ; +ש <> ş ; +ת <> ţ ; + +א <> ʼ ; +ב <> b ; +ג <> g ; +ד <> d ; +ה <> h ; +ו <> w ; +ז <> z ; +ט <> t ; +י <> y ; +כ <> k } $letterAfter; +ך <> k ; +ל <> l ; +מ <> m } $letterAfter; +ם <> m ; +נ <> n } $letterAfter; +ן <> n ; +ס <> s ; +ע <> ʻ ; +פ <> p } $letterAfter; +ף <> p ; +ק <> q ; +ר <> r ; + + װ > | וו; # HEBREW LIGATURE YIDDISH DOUBLE VAV + ױ > | וי; # HEBREW LIGATURE YIDDISH VAV YOD + ײ > | יי ; # HEBREW LIGATURE YIDDISH DOUBLE YOD + + +ּ <> ̇ ; # dagesh just goes to overdot for now +ׁ <> ̌ ; # shin dot -> sh +ׂ <> ̂ ; # sin dot -> s + +# points +$above = [^[:ccc=0:][:ccc=230:]]*; + +‎ֲ‎ > à ; +‎ֲ‎ $1< a ($above) ̀; + +‎ָ‎ > á ; +‎ָ‎ $1 < a ($above) ́; + +‎ֱ‎ > è ; +‎ֱ‎ $1 < e ($above) ̀; + +‎ֵ‎ > é ; +‎ֵ‎ $1 < e ($above) ́; + +‎ְ‎ > e ̆ ; +‎ְ‎ $1 < e ($above) ̆; + +‎ֹ‎ > ò ; +‎ֹ‎ $1 < o ($above) ̀; + +ִ <> i ; +ֻ <> u ; +ַ <> a ; +ֶ <> e ; +ֳ <> o ; + +\u05BF <> ̄ ; + +# fallbacks +ק < c ; +פ < f } $letterAfter; +ף < f ; +ז < j ; +ו < v ; +כס < x ; + +:: (lower); +:: nfc (nfd) ; +:: ([[:Latin:] [:^ccc=0:] [\u02BB-\u02BC\u0300-\u0302\u0307\u030C\u0327\u0331\u0340-\u0341 ̄ ]]); \ No newline at end of file diff --git a/icuSources/data/translit/Hiragana_Katakana.txt b/icuSources/data/translit/Hiragana_Katakana.txt new file mode 100644 index 00000000..019a342b --- /dev/null +++ b/icuSources/data/translit/Hiragana_Katakana.txt @@ -0,0 +1,207 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# note: a global filter is more efficient, but MUST include all source chars +:: [\u0000-\u007E \u3001\u3002 \u3099-\u309C \u30A1-\u30FC \uFF61-\uFF9Fー[:Hiragana:] [:Katakana:] [:nonspacing mark:]] ; +:: NFKC (); + +# Hiragana-Katakana + +# This is largely a one-to-one mapping, but it has a +# few kinks: + +# 1. The Katakana va/vi/ve/vo (30F7-30FA) have no +# Hiragana equivalents. We use Hiragana wa/wi/we/wo +# (308F-3092) with a voicing mark (3099), which is +# semantically equivalent. However, this is a non- +# roundtripping transformation. + +# 2. The Katakana small ka/ke (30F5,30F6) have no +# Hiragana equiavlents. We convert them to normal +# Hiragana ka/ke (304B,3051). This is a one-way +# information-losing transformation and precludes +# round-tripping of 30F5 and 30F6. + +# 3. The combining marks 3099-309C are in the Hiragana +# block, but they apply to Katakana as well, so we +# leave them untouched. + +# 4. The Katakana prolonged sound mark 30FC doubles the +# preceding vowel. This is a one-way information- +# losing transformation from Katakana to Hiragana. + +# 5. The Katakana middle dot separates words in foreign +# expressions; we leave this unmodified. + +# The above points preclude successful round-trip +# transformations of arbitrary input text. However, +# they provide naturalistic results that should conform +# to user expectations. + + +# Combining equivalents va/vi/ve/vo +わ゙ <> ヷ; +ゐ゙ <> ヸ; +ゑ゙ <> ヹ; +を゙ <> ヺ; + +# One-to-one mappings, main block +# 3041:3094 <> 30A1:30F4 +# 309D,E <> 30FD,E +ぁ <> ァ; +あ <> ア; +ぃ <> ィ; +い <> イ; +ぅ <> ゥ; +う <> ウ; +ぇ <> ェ; +え <> エ; +ぉ <> ォ; +お <> オ; +か <> カ; +が <> ガ; +き <> キ; +ぎ <> ギ; +く <> ク; +ぐ <> グ; +け <> ケ; +げ <> ゲ; +こ <> コ; +ご <> ゴ; +さ <> サ; +ざ <> ザ; +し <> シ; +じ <> ジ; +す <> ス; +ず <> ズ; +せ <> セ; +ぜ <> ゼ; +そ <> ソ; +ぞ <> ゾ; +た <> タ; +だ <> ダ; +ち <> チ; +ぢ <> ヂ; +っ <> ッ; +つ <> ツ; +づ <> ヅ; +て <> テ; +で <> デ; +と <> ト; +ど <> ド; +な <> ナ; +に <> ニ; +ぬ <> ヌ; +ね <> ネ; +の <> ノ; +は <> ハ; +ば <> バ; +ぱ <> パ; +ひ <> ヒ; +び <> ビ; +ぴ <> ピ; +ふ <> フ; +ぶ <> ブ; +ぷ <> プ; +へ <> ヘ; +べ <> ベ; +ぺ <> ペ; +ほ <> ホ; +ぼ <> ボ; +ぽ <> ポ; +ま <> マ; +み <> ミ; +む <> ム; +め <> メ; +も <> モ; +ゃ <> ャ; +や <> ヤ; +ゅ <> ュ; +ゆ <> ユ; +ょ <> ョ; +よ <> ヨ; +ら <> ラ; +り <> リ; +る <> ル; +れ <> レ; +ろ <> ロ; +ゎ <> ヮ; +わ <> ワ; +ゐ <> ヰ; +ゑ <> ヱ; +を <> ヲ; +ん <> ン; +ゔ <> ヴ; +ゝ <> ヽ; +ゞ <> ヾ; + +# One-way Katakana-Hiragana xform of small K ka/ke to +# normal H ka/ke. +か < ヵ; +け < ヶ; + +# Katakana followed by a prolonged sound mark 30FC has +# its final vowel doubled. This is a Katakana-Hiragana +# one-way information-losing transformation. We +# include the small Katakana (e.g., small A 3041) and +# do not distinguish them from their large +# counterparts. It doesn't make sense to double a +# small counterpart vowel as a small Hiragana vowel, so +# we don't do so. In natural text this should never +# occur anyway. If a 30FC is seen without a preceding +# vowel sound (e.g., after n 30F3) we do not change it. + +### $long = ー; + +# The following categories are Hiragana, not Katakana +# as might be expected, since by the time we get to the +# 30FC, the preceding character will have already been +# transformed to Hiragana. + +# {The following mechanically generated from the +# Unicode 3.0 data:} + +$xa = [ \ +ぁ あ か が さ ざ \ +た だ な は ば ぱ \ +ま ゃ や ら ゎ わ \ +]; + +$xi = [ \ +ぃ い き ぎ し じ \ +ち ぢ に ひ び ぴ \ +み り ゐ \ +]; + +$xu = [ \ +ぅ う く ぐ す ず \ +っ つ づ ぬ ふ ぶ \ +ぷ む ゅ ゆ る ゔ \ +]; + +$xe = [ \ +ぇ え け げ せ ぜ \ +て で ね へ べ ぺ \ +め れ ゑ \ +]; + +$xo = [ \ +ぉ お こ ご そ ぞ \ +と ど の ほ ぼ ぽ \ +も ょ よ ろ を \ +]; + +あ < $xa {ー}; +い < $xi {ー}; +う < $xu {ー}; +え < $xe {ー}; +お < $xo {ー}; + +:: (NFKC) ; + +# note: a global filter is more efficient, but MUST include all source chars!! +:: ([\u0000-\u007E \u3001\u3002 \u3099-\u309C \u30A1-\u30FC \uFF61-\uFF9Fー[:Hiragana:] [:Katakana:] [:nonspacing mark:]]); + +# eof diff --git a/icuSources/data/translit/Hiragana_Latin.txt b/icuSources/data/translit/Hiragana_Latin.txt new file mode 100644 index 00000000..ed068817 --- /dev/null +++ b/icuSources/data/translit/Hiragana_Latin.txt @@ -0,0 +1,14 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +:: [\u3041-\u3094\u3099\u309D-\u309E\u30AC\u30AE\u30B0\u30B2\u30B4\u30B6\u30B8\u30BA\u30BC\u30BE\u30C0\u30C2\u30C5\u30C7\u30C9\u30D0\u30D3\u30D6\u30D9\u30DC\u30F4\u30F7-\u30FA\u30FE] ; +:: NFD ; + +:: Hiragana-Katakana; +:: Katakana-Latin; + +:: NFC ; +:: (Lower) ; +:: ([',.A-Za-z~\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E3\u01E6-\u01ED\u01F0\u01F4-\u01F5\u01F8-\u021B\u021E-\u021F\u0226-\u0233\u0304\u04E2-\u04E3\u04EE-\u04EF\u1E00-\u1E99\u1EA0-\u1EF9\u1FB1\u1FB9\u1FD1\u1FD9\u1FE1\u1FE9\u212A-\u212B]) ; diff --git a/icuSources/data/translit/InterIndic_Bengali.txt b/icuSources/data/translit/InterIndic_Bengali.txt new file mode 100644 index 00000000..5f31228b --- /dev/null +++ b/icuSources/data/translit/InterIndic_Bengali.txt @@ -0,0 +1,147 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# InterIndic-Bengali +#:: NFD (NFC) ; +\uE001>\u0981; # SIGN CANDRABINDU +\uE002>\u0982; # SIGN ANUSVARA +\uE003>\u0983; # SIGN VISARGA +\uE004>\u0985; # FALLBACK TO LETTER A +\uE005>\u0985; # LETTER A +\uE006>\u0986; # LETTER AA +\uE007>\u0987; # LETTER I +\uE008>\u0988; # LETTER II +\uE009>\u0989; # LETTER U +\uE00A>\u098A; # LETTER UU +\uE00B>\u098B; # LETTER VOCALIC R +\uE00C>\u098C; # LETTER VOCALIC L +\uE00D>\u098F; # FALLBACK +\uE00E>\u098F; # FALLBACK +\uE00F>\u098F; # LETTER E +\uE010>\u0990; # LETTER AI +\uE011>\u0993; # FALLBACK +\uE012>\u0993; # FALLBACK +\uE013>\u0993; # LETTER O +\uE014>\u0994; # LETTER AU +\uE015>\u0995; # LETTER KA +\uE016>\u0996; # LETTER KHA +\uE017>\u0997; # LETTER GA +\uE018>\u0998; # LETTER GHA +\uE019>\u0999; # LETTER NGA +\uE01A>\u099A; # LETTER CA +\uE01B>\u099B; # LETTER CHA +\uE01C>\u099C; # LETTER JA +\uE01D>\u099D; # LETTER JHA +\uE01E>\u099E; # LETTER NYA +\uE01F>\u099F; # LETTER TTA +\uE020>\u09A0; # LETTER TTHA +\uE021>\u09A1; # LETTER DDA +\uE022>\u09A2; # LETTER DDHA +\uE023>\u09A3; # LETTER NNA +\uE024>\u09A4; # LETTER TA +\uE025>\u09A5; # LETTER THA +\uE026>\u09A6; # LETTER DA +\uE027>\u09A7; # LETTER DHA +\uE028>\u09A8; # LETTER NA +\uE029>\u09A8\u09BC; # REMAP (indicExceptions.txt): \u09a9>\u09a8 = LETTER NNNA>LETTER NA +\uE02A>\u09AA; # LETTER PA +\uE02B>\u09AB; # LETTER PHA +\uE02C>\u09AC; # LETTER BA +\uE02D>\u09AD; # LETTER BHA +\uE02E>\u09AE; # LETTER MA +\uE02F>\u09AF; # LETTER YA +\uE030>\u09B0; # LETTER RA +\uE031>\u09B0\u09BC; # FALLBACK to RA +\uE032>\u09B2; # LETTER LA +\uE033>\u09B2; # REMAP (indicExceptions.txt): \u09b3>\u09b2 = LETTER LLA>LETTER LA +\uE034>\u09B2; # REMAP (indicExceptions.txt): \u09b4>\u09b2 = LETTER LLLA>LETTER LA +\uE035>\u09AC; # REMAP (indicExceptions.txt): \u09b5>\u09ac = LETTER VA>LETTER BA +\uE036>\u09B6; # LETTER SHA +\uE037>\u09B7; # LETTER SSA +\uE038>\u09B8; # LETTER SA +\uE039>\u09B9; # LETTER HA +\uE03C>\u09BC; # SIGN NUKTA +\uE03D>\u09bd; # SIGN AVAGRAHA +\uE03E>\u09BE; # VOWEL SIGN AA +\uE03F>\u09BF; # VOWEL SIGN I +\uE040>\u09C0; # VOWEL SIGN II +\uE041>\u09C1; # VOWEL SIGN U +\uE042>\u09C2; # VOWEL SIGN UU +\uE043>\u09C3; # VOWEL SIGN VOCALIC R +\uE044>\u09C4; # VOWEL SIGN VOCALIC RR +\uE045>\u09C7; # REMAP (indicExceptions.txt): \u09c5>\u09c7 = VOWEL SIGN CANDRA E>VOWEL SIGN E +\uE046>\u09C7; # FALLBACK +\uE047>\u09C7; # VOWEL SIGN E +\uE048>\u09C8; # VOWEL SIGN AI +\uE049>\u09C7\u09BE; # REMAP (indicExceptions.txt): \u09c9>\u09cb = VOWEL SIGN CANDRA O>VOWEL SIGN O +\uE04A>\u09C7\u09BE; # FALLBACK +\uE04B>\u09C7\u09BE; # VOWEL SIGN O +\uE04C>\u09C7\u09D7; # VOWEL SIGN AU +\uE04D>\u09CD; # SIGN VIRAMA +\uE050>\u0993\u0982; # InterIndic-Bengali: OM +\ue051>; +\ue052>; +\ue053>; +\ue054>; +\uE055>; # LENGTH MARK +\uE056>\u09C8; # REMAP (indicExceptions.txt): \u09d6>\u09c8 = AI LENGTH MARK>VOWEL SIGN AI +\uE057>\u09D7; # AU LENGTH MARK +\uE058>\u0995\u09BC; # FALLBACK +\uE059>\u0996\u09BC; # REMAP (indicExceptions.txt): \u09d9>\u0996 = LETTER KHHA>LETTER KHA +\uE05A>\u0997\u09BC; # REMAP (indicExceptions.txt): \u09da>\u0997 = LETTER GHHA>LETTER GA +\uE05B>\u099C\u09BC; # REMAP (indicExceptions.txt): \u09db>\u099c = LETTER ZA>LETTER JA +\uE05C>\u09A1\u09BC; # FALLBACK +\uE05D>\u09A2\u09BC; # LETTER RHA +\uE05E>\u09AB\u09BC; # REMAP (indicExceptions.txt): \u09de>\u09ab = LETTER FA>LETTER PHA +\uE05F>\u09AF\u09BC; # LETTER YYA +\uE060>\u09E0; # LETTER VOCALIC RR +\uE061>\u09E1; # LETTER VOCALIC LL +\uE062>\u09E2; # VOWEL SIGN VOCALIC L +\uE063>\u09E3; # VOWEL SIGN VOCALIC LL +\uE064>\u0964; # DANDA +\uE065>\u0965; # DOUBLE DANDA +\uE066>\u09E6; # DIGIT ZERO +\uE067>\u09E7; # DIGIT ONE +\uE068>\u09E8; # DIGIT TWO +\uE069>\u09E9; # DIGIT THREE +\uE06A>\u09EA; # DIGIT FOUR +\uE06B>\u09EB; # DIGIT FIVE +\uE06C>\u09EC; # DIGIT SIX +\uE06D>\u09ED; # DIGIT SEVEN +\uE06E>\u09EE; # DIGIT EIGHT +\uE06F>\u09EF; # DIGIT NINE +\ue070>; # ABBREVIATION SIGN +\ue071>\u09F0; # LETTER RA WITH MIDDLE DIAGONAL +\ue072>\u09F1; # LETTER RA WITH LOWER DIAGONAL +\ue073>\u09F2; # RUPEE MARK +\ue074>\u09F3; # RUPEE SIGN +\ue075>\u09F4; # CURRENCY NUMERATOR ONE +\ue076>\u09F5; # CURRENCY NUMERATOR TWO +\ue077>\u09F6; # CURRENCY NUMERATOR THREE +\ue078>\u09F7; # CURRENCY NUMERATOR FOUR +\ue079>\u09F8; # CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR +\ue07A>\u09F9; # CURRENCY DENOMINATOR SIXTEEN +\ue07B>\u09FA; # ISSHAR +\uE07C>; # TIPPI +\uE07D>; # ADDAK +\uE07E>; # IRI +\uE07F>; # URA +\uE080>; # EK ONKAR +\uE081>\u09AC; # FALLBACK FOR ORIYA LETTER WA +0 > \u09E6; # FALLBACK FOR TAMIL +1 > \u09E7; + + + + + + + + + + + +# :: NFC (NFD) ; +# eof diff --git a/icuSources/data/translit/InterIndic_Devanagari.txt b/icuSources/data/translit/InterIndic_Devanagari.txt new file mode 100644 index 00000000..5b921c4f --- /dev/null +++ b/icuSources/data/translit/InterIndic_Devanagari.txt @@ -0,0 +1,158 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# InterIndic-Devanagari +#:: NFD (NFC) ; +#Rules for Decomposed characters + \ue028\ue03c > \u0929; #\ue029 + \ue030\ue03c > \u0931; #\ue031 + \ue033\ue03c > \u0934; #\ue034 + \ue015\ue03c > \u0958; #\ue058 LETTER QA (For Urdu) + \ue016\ue03c > \u0959; #\ue059 LETTER KHHA (For Urdu) + \ue017\ue03c > \u095a; #\ue05a LETTER GHHA (For Urdu) + \ue01c\ue03c > \u095b; #\ue05b LETTER ZA (For Urdu) + \ue021\ue03c > \u095c; #\ue05c LETTER DDDHA (pronounced RRA) + \ue022\ue03c > \u095d; #\ue05d LETTER RHA (pronounced RRHA) + \ue02b\ue03c > \u095e; #\ue05e LETTER FA + \ue02f\ue03c > \u095f; #\ue05f LETTER YYA + + #Decomposed compatibility transliterations + \ue012\ue057>\u0914; # FALLBACK FOR TAMIL AU + 0 > \u0966; # FALLBACK FOR TAMIL + 1 > \u0967; + + \ue055>; # FALLBACK BLOW AWAY KANNADA AND TELUGU LENGTH MARK + \ue056>; # FALLBACK BLOW AWAY KANNADA AND TELUGU AI LENGTH MARK + \ue057>; # FALLBACK BLOW AWAY TAMIL AU LENGTH MARK + + \ue001 > \u0901; # SIGN CANDRABINDU + \ue002 > \u0902; # SIGN ANUSVARA + \ue003 > \u0903; # SIGN VISARGA + \ue004 > \u0904; # SIGN SHORT A + \ue005 > \u0905; # LETTER A + \ue006 > \u0906; # LETTER AA + \ue007 > \u0907; # LETTER I + \ue008 > \u0908; # LETTER II + \ue009 > \u0909; # LETTER U + \ue00a > \u090a; # LETTER UU + \ue00b > \u090b; # LETTER VOCALIC R + \ue00c > \u090c; # LETTER VOCALIC L + \ue00d > \u090d; # LETTER CANDRA E (For representing English sounds) + \ue00e > \u090e; # LETTER SHORT E(For Southern Scripts) + \ue00f > \u090f; # LETTER E + \ue010 > \u0910; # LETTER AI + \ue011 > \u0911; # LETTER CANDRA O (For representing English sounds) + \ue012 > \u0912; # LETTER SHORT O (For Southern Scripts) + \ue013 > \u0913; # LETTER O + \ue014 > \u0914; # LETTER AU + \ue015 > \u0915; # LETTER KA + \ue016 > \u0916; # LETTER KHA + \ue017 > \u0917; # LETTER GA + \ue018 > \u0918; # LETTER GHA + \ue019 > \u0919; # LETTER NGA + \ue01a > \u091a; # LETTER CA + \ue01b > \u091b; # LETTER CHA + \ue01c > \u091c; # LETTER JA + \ue01d > \u091d; # LETTER JHA + \ue01e > \u091e; # LETTER NYA + \ue01f > \u091f; # LETTER TTA + \ue020 > \u0920; # LETTER TTHA + \ue021 > \u0921; # LETTER DDA + \ue022 > \u0922; # LETTER DDHA + \ue023 > \u0923; # LETTER NNA + \ue024 > \u0924; # LETTER TA + \ue025 > \u0925; # LETTER THA + \ue026 > \u0926; # LETTER DA + \ue027 > \u0927; # LETTER DHA + \ue028 > \u0928; # LETTER NA + \ue029 > \u0929; # LETTER NNNA + \ue02a > \u092a; # LETTER PA + \ue02b > \u092b; # LETTER PHA + \ue02c > \u092c; # LETTER BA + \ue02d > \u092d; # LETTER BHA + \ue02e > \u092e; # LETTER MA + \ue02f > \u092f; # LETTER YA + \ue030 > \u0930; # LETTER RA + \ue031 > \u0931; # LETTER RRA (Eyelash RA for Southern scripts) + #\ue031 > \u0930; + \ue032 > \u0932; # LETTER LA + \ue033 > \u0933; # LETTER LLA + \ue034 > \u0934; # LETTER LLLA (LLLA for Southern scripts) + #\ue034 > \u0933; + \ue035 > \u0935; # LETTER VA + \ue036 > \u0936; # LETTER SHA + \ue037 > \u0937; # LETTER SSA + \ue038 > \u0938; # LETTER SA + \ue039 > \u0939; # LETTER HA + \ue03c > \u093c; # SIGN NUKTA + \ue03d > \u093d; # SIGN AVAGRAHA + \ue03e > \u093e; # VOWEL SIGN AA + \ue03f > \u093f; # VOWEL SIGN I + \ue040 > \u0940; # VOWEL SIGN II + \ue041 > \u0941; # VOWEL SIGN U + \ue042 > \u0942; # VOWEL SIGN UU + \ue043 > \u0943; # VOWEL SIGN VOCALIC R + \ue044 > \u0944; # VOWEL SIGN VOCALIC RR + \ue045 > \u0945; # VOWEL SIGN CANDRA E + \ue046 > \u0946; # VOWEL SIGN SHORT E + \ue047 > \u0947; # VOWEL SIGN E + \ue048 > \u0948; # VOWEL SIGN AI + \ue049 > \u0949; # VOWEL SIGN CANDRA O + \ue04a > \u094a; # VOWEL SIGN SHORT O + \ue04b > \u094b; # VOWEL SIGN O + \ue04c > \u094c; # VOWEL SIGN AU + \ue04d > \u094d; # SIGN VIRAMA + \ue050 > \u0950; # OM + \ue051 > \u0951; # STRESS SIGN UDATTA + \ue052 > \u0952; # STRESS SIGN ANUDATTA + \ue053 > \u0953; # GRAVE ACCENT + \ue054 > \u0954; # ACUTE ACCENT + \ue058 > \u0958; # LETTER QA (For Urdu) + \ue059 > \u0959; # LETTER KHHA (For Urdu) + \ue05a > \u095a; # LETTER GHHA (For Urdu) + \ue05b > \u095b; # LETTER ZA (For Urdu) + \ue05c > \u095c; # LETTER DDDHA (pronounced RRA) + \ue05d > \u095d; # LETTER RHA (pronounced RRHA) + \ue05e > \u095e; # LETTER FA + \ue05f > \u095f; # LETTER YYA + \ue060 > \u0960; # LETTER VOCALIC RR + \ue061 > \u0961; # LETTER VOCALIC LL + \ue062 > \u0962; # VOWEL SIGN VOCALIC L + \ue063 > \u0963; # VOWEL SIGN VOCALIC LL + \ue064 > \u0964; # DANDA + \ue065 > \u0965; # DOUBLE DANDA + \ue066 > \u0966; # DIGIT ZERO + \ue067 > \u0967; # DIGIT ONE + \ue068 > \u0968; # DIGIT TWO + \ue069 > \u0969; # DIGIT THREE + \ue06a > \u096a; # DIGIT FOUR + \ue06b > \u096b; # DIGIT FIVE + \ue06c > \u096c; # DIGIT SIX + \ue06d > \u096d; # DIGIT SEVEN + \ue06e > \u096e; # DIGIT EIGHT + \ue06f > \u096f; # DIGIT NINE + + \ue070>\u0970; # ABBREVIATION SIGN + \ue071>\u0930; # LETTER RA WITH MIDDLE DIAGONAL + \ue072>\u0930; # LETTER RA WITH LOWER DIAGONAL + \ue073>; # RUPEE MARK + \ue074>\u0930\u0942; # RUPEE SIGN + \ue075>; # CURRENCY NUMERATOR ONE + \ue076>; # CURRENCY NUMERATOR TWO + \ue077>; # CURRENCY NUMERATOR THREE + \ue078>; # CURRENCY NUMERATOR FOUR + \ue079>; # CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR + \ue07A>; # CURRENCY DENOMINATOR SIXTEEN + \ue07B>; # ISSHAR + \uE07C>; # TIPPI + \uE07D>; # ADDAK + \uE07E>; # IRI + \uE07F>; # URA + \uE080>; # EK ONKAR + \uE081>\u0935; # FALLBACK FOR ORIYA LETTER WA + +# \u0970 # UNMAPPED Devanagari-InterIndic: ABBREVIATION SIGN +# :: NFC; +# eof diff --git a/icuSources/data/translit/InterIndic_Gujarati.txt b/icuSources/data/translit/InterIndic_Gujarati.txt new file mode 100644 index 00000000..92382453 --- /dev/null +++ b/icuSources/data/translit/InterIndic_Gujarati.txt @@ -0,0 +1,138 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# InterIndic-Gujarati +#:: NFD (NFC) ; +\ue001>\u0a81; # SIGN CANDRABINDU +\ue002>\u0a82; # SIGN ANUSVARA +\ue003>\u0a83; # SIGN VISARGA +\uE004>\u0a85; # FALLBACK TO LETTER A +\ue005>\u0a85; # LETTER A +\ue006>\u0a86; # LETTER AA +\ue007>\u0a87; # LETTER I +\ue008>\u0a88; # LETTER II +\ue009>\u0a89; # LETTER U +\ue00a>\u0a8a; # LETTER UU +\ue00b>\u0a8b; # LETTER VOCALIC R +\ue00c>\u0a8c; # LETTER VOCALIC L +\ue00d>\u0a8d; # GUJARATI VOWEL CANDRA E +\ue00e>\u0a8f; # FALLBACK +\ue00f>\u0a8f; # InterIndic-Gujarati: LETTER EE (\u0a8f = LETTER E) +\ue010>\u0a90; # LETTER AI +\ue011>\u0a91; # FALLBACK +\ue012>\u0a93; # FALLBACK +\ue013>\u0a93; # UNMAPPED InterIndic-Gujarati: LETTER OO (\u0a93 = LETTER O) +\ue014>\u0a94; # LETTER AU +\ue015>\u0a95; # LETTER KA +\ue016>\u0a96; # LETTER KHA +\ue017>\u0a97; # LETTER GA +\ue018>\u0a98; # LETTER GHA +\ue019>\u0a99; # LETTER NGA +\ue01a>\u0a9a; # LETTER CA +\ue01b>\u0a9b; # LETTER CHA +\ue01c>\u0a9c; # LETTER JA +\ue01d>\u0a9d; # LETTER JHA +\ue01e>\u0a9e; # LETTER NYA +\ue01f>\u0a9f; # LETTER TTA +\ue020>\u0aa0; # LETTER TTHA +\ue021>\u0aa1; # LETTER DDA +\ue022>\u0aa2; # LETTER DDHA +\ue023>\u0aa3; # LETTER NNA +\ue024>\u0aa4; # LETTER TA +\ue025>\u0aa5; # LETTER THA +\ue026>\u0aa6; # LETTER DA +\ue027>\u0aa7; # LETTER DHA +\ue028>\u0aa8; # LETTER NA +\ue029>\u0aa8\u0abc; # FALLBACK to NA+NUKTA +\ue02a>\u0aaa; # LETTER PA +\ue02b>\u0aab; # LETTER PHA +\ue02c>\u0aac; # LETTER BA +\ue02d>\u0aad; # LETTER BHA +\ue02e>\u0aae; # LETTER MA +\ue02f>\u0aaf; # LETTER YA +\ue030>\u0ab0; # LETTER RA +\ue031>\u0ab0\u0abc; # FALLBACK +\ue032>\u0ab2; # LETTER LA +\ue033>\u0ab3; # LETTER LLA +\ue034>\u0ab3\u0abc; # LETTER LLLA>LETTER LLA+NUKTA +\ue035>\u0ab5; # LETTER VA +\ue036>\u0ab6; # LETTER SHA +\ue037>\u0ab7; # LETTER SSA +\ue038>\u0ab8; # LETTER SA +\ue039>\u0ab9; # LETTER HA +\ue03c>\u0abc; # SIGN NUKTA +\ue03d>\u0abd; # SIGN AVAGRAHA +\ue03e>\u0abe; # VOWEL SIGN AA +\ue03f>\u0abf; # VOWEL SIGN I +\ue040>\u0ac0; # VOWEL SIGN II +\ue041>\u0ac1; # VOWEL SIGN U +\ue042>\u0ac2; # VOWEL SIGN UU +\ue043>\u0ac3; # VOWEL SIGN VOCALIC R +\ue044>\u0ac4; # VOWEL SIGN VOCALIC RR +\ue045>\u0ac5; # VOWEL SIGN CANDRA E +\ue046>\u0ac7; # FALLBACK +\ue047>\u0ac7; # InterIndic-Gujarati: VOWEL SIGN EE (\u0ac7 = VOWEL SIGN E) +\ue048>\u0ac8; # VOWEL SIGN AI +\ue049>\u0ac9; # VOWEL SIGN CANDRA O +\ue04a>\u0acb; # FALLBACK +\ue04b>\u0acb; # UNMAPPED InterIndic-Gujarati: VOWEL SIGN OO (\u0acb = VOWEL SIGN O) +\ue04c>\u0acc; # VOWEL SIGN AU +\ue04d>\u0acd; # SIGN VIRAMA +\ue050>\u0ad0; # OM +\ue051>; +\ue052>; +\ue053>; +\ue054>; +\ue055>; # UNMAPPED InterIndic-Gujarati: LENGTH MARK +\ue056>\u0ac8; # REMAP (indicExceptions.txt): \u0ad6>\u0ac8 = AI LENGTH MARK>VOWEL SIGN AI +\ue057>\u0acc; # REMAP (indicExceptions.txt): \u0ad7>\u0acc = AU LENGTH MARK>VOWEL SIGN AU +\ue058>\u0a95\u0abc; # FALLBACK +\ue059>\u0a96\u0abc; # REMAP (indicExceptions.txt): \u0ad9>\u0a96\u0abc = LETTER KHHA>LETTER KHA.SIGN NUKTA +\ue05a>\u0a97\u0abc; # REMAP (indicExceptions.txt): \u0ada>\u0a97\u0abc = LETTER GHHA>LETTER GA.SIGN NUKTA +\ue05b>\u0a9c\u0abc; # REMAP (indicExceptions.txt): \u0adb>\u0a9c\u0abc = LETTER ZA>LETTER JA.SIGN NUKTA +\ue05c>\u0aa1\u0abc; # FALLBACK +\ue05d>\u0aa2\u0abc; # REMAP (indicExceptions.txt): \u0add>\u0aa2\u0abc = LETTER RHA>LETTER DDHA.SIGN NUKTA +\ue05e>\u0aab\u0abc; # REMAP (indicExceptions.txt): \u0ade>\u0aab\u0abc = LETTER FA>LETTER PHA.SIGN NUKTA +\ue05f>\u0aaf\u0abc; # REMAP (indicExceptions.txt): \u0adf>\u0aaf\u0abc = LETTER YYA>LETTER YA.SIGN NUKTA +\ue060>\u0ae0; # LETTER VOCALIC RR +\ue061>\u0ae1; # LETTER VOCALIC LL +\ue062>\u0abf\u0abc; # REMAP (indicExceptions.txt): \u0ae2>\u0abf\u0abc = VOWEL SIGN VOCALIC L>VOWEL SIGN I.SIGN NUKTA +\ue063>\u0ac0\u0abc; # REMAP (indicExceptions.txt): \u0ae3>\u0ac0\u0abc = VOWEL SIGN VOCALIC LL>VOWEL SIGN II.SIGN NUKTA +\uE064>\u0964; # DANDA +\uE065>\u0965; # DOUBLE DANDA +\ue066>\u0ae6; # DIGIT ZERO +\ue067>\u0ae7; # DIGIT ONE +\ue068>\u0ae8; # DIGIT TWO +\ue069>\u0ae9; # DIGIT THREE +\ue06a>\u0aea; # DIGIT FOUR +\ue06b>\u0aeb; # DIGIT FIVE +\ue06c>\u0aec; # DIGIT SIX +\ue06d>\u0aed; # DIGIT SEVEN +\ue06e>\u0aee; # DIGIT EIGHT +\ue06f>\u0aef; # DIGIT NINE +\ue070>; # ABBREVIATION SIGN +\ue071>\u0ab0; # LETTER RA WITH MIDDLE DIAGONAL +\ue072>\u0ab0; # LETTER RA WITH LOWER DIAGONAL +\ue073>; # RUPEE MARK +\ue074>; # RUPEE SIGN +\ue075>; # CURRENCY NUMERATOR ONE +\ue076>; # CURRENCY NUMERATOR TWO +\ue077>; # CURRENCY NUMERATOR THREE +\ue078>; # CURRENCY NUMERATOR FOUR +\ue079>; # CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR +\ue07A>; # CURRENCY DENOMINATOR SIXTEEN +\ue07B>; # ISSHAR +\uE07C>; # TIPPI +\uE07D>; # ADDAK +\uE07E>; # IRI +\uE07F>; # URA +\uE080>; # EK ONKAR +\uE081>\u0ab5; # FALLBACK FOR ORIYA LETTER WA +0 > \u0ae6; # FALLBACK FOR TAMIL +1 > \u0ae7; + +#\ue080>; # UNMAPPED InterIndic-Gujarati: ISSHAR +# :: NFC (NFD) ; +# eof diff --git a/icuSources/data/translit/InterIndic_Gurmukhi.txt b/icuSources/data/translit/InterIndic_Gurmukhi.txt new file mode 100644 index 00000000..a2236da9 --- /dev/null +++ b/icuSources/data/translit/InterIndic_Gurmukhi.txt @@ -0,0 +1,147 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# InterIndic-Gurmukhi +#:: NFD (NFC) ; +$vowel = [\u0A05-\u0A14 \u0A3e-\u0A4D]; +$consonant = [\u0A15-\u0A39]; + +\ue001>\u0a01; # SIGN CHANDRABINDU +#rules for BINDI + +# Anusvara is equivalent to BINDI when preceeded by a vowel +$vowel{\ue002>\u0a02; # SIGN ANUSVARA (\u0a02 = SIGN BINDI) +# else is equivalent to TIPPI +$consonant{\ue002>\u0a70; # SIGN TIPPI +\ue002>\u0a02; + +\ue003>; # FALLBACK BLOW AWAY SIGN VISARGA +\uE004>\u0a05; # FALLBACK TO LETTER A +\ue005>\u0a05; # LETTER A +\ue006>\u0a06; # LETTER AA +\ue007>\u0a07; # LETTER I +\ue008>\u0a08; # LETTER II +\ue009>\u0a09; # LETTER U +\ue00a>\u0a0a; # LETTER UU +\ue00b>\u0a30\u0a3f; # REMAP (indicExceptions.txt): \u0a0b>\u0a30\u0a3f = LETTER VOCALIC R>LETTER RA.VOWEL SIGN I +\ue00c>\u0a33; # FALLBACK +\ue00d>\u0a0f; # FALLBACK +\ue00e>\u0a0f; # FALLBACK +\ue00f>\u0a0f; # LETTER EE +\ue010>\u0a10; # LETTER AI +\ue011>\u0a13; # FALLBACK +\ue012>\u0a13; # FALLBACK +\ue013>\u0a13; # LETTER OO +\ue014>\u0a14; # LETTER AU +\ue015>\u0a15; # LETTER KA +\ue016>\u0a16; # LETTER KHA +\ue017>\u0a17; # LETTER GA +\ue018>\u0a18; # LETTER GHA +\ue019>\u0a19; # LETTER NGA +\ue01a>\u0a1a; # LETTER CA +\ue01b>\u0a1b; # LETTER CHA +\ue01c>\u0a1c; # LETTER JA +\ue01d>\u0a1d; # LETTER JHA +\ue01e>\u0a1e; # LETTER NYA +\ue01f>\u0a1f; # LETTER TTA +\ue020>\u0a20; # LETTER TTHA +\ue021>\u0a21; # LETTER DDA +\ue022>\u0a22; # LETTER DDHA +\ue023>\u0a23; # LETTER NNA +\ue024>\u0a24; # LETTER TA +\ue025>\u0a25; # LETTER THA +\ue026>\u0a26; # LETTER DA +\ue027>\u0a27; # LETTER DHA +\ue028>\u0a28; # LETTER NA +\ue029>\u0a28\u0a3c; # REMAP (indicExceptions.txt): \u0a29>\u0a28 = LETTER NNNA>LETTER NA +\ue02a>\u0a2a; # LETTER PA +\ue02b>\u0a2b; # LETTER PHA +\ue02c>\u0a2c; # LETTER BA +\ue02d>\u0a2d; # LETTER BHA +\ue02e>\u0a2e; # LETTER MA +\ue02f>\u0a2f; # LETTER YA +\ue030>\u0a30; # LETTER RA +\ue031>\u0a30\u0a3c; # FALLBACK LETTER RA+NUKTA +\ue032>\u0a32; # LETTER LA +\ue033>\u0a33; # LETTER LLA +\ue034>\u0a33; # REMAP (indicExceptions.txt): \u0a34>\u0a33 = LETTER LLLA>LETTER LLA +\ue035>\u0a35; # LETTER VA +\ue036>\u0a36; # LETTER SHA +\ue037>\u0a36; # REMAP (indicExceptions.txt): \u0a37>\u0a36 = LETTER SSA>LETTER SHA +\ue038>\u0a38; # LETTER SA +\ue039>\u0a39; # LETTER HA +\ue03c>\u0a3c; # SIGN NUKTA +\ue03d>; # FALLBACK BLOW AWAY SIGN AVAGRAHA +\ue03e>\u0a3e; # VOWEL SIGN AA +\ue03f>\u0a3f; # VOWEL SIGN I +\ue040>\u0a40; # VOWEL SIGN II +\ue041>\u0a41; # VOWEL SIGN U +\ue042>\u0a42; # VOWEL SIGN UU +\ue043>; # FALLBACK BLOW AWAY VOWEL SIGN VOCALIC R +\ue044>; # FALLBACK BLOW AWAY VOWEL SIGN VOCALIC RR +\ue045>\u0a48; # REMAP (indicExceptions.txt): \u0a45>\u0a48 = VOWEL SIGN CANDRA E>VOWEL SIGN AI +\ue046>\u0a47; # FALLABCK +\ue047>\u0a47; # VOWEL SIGN EE +\ue048>\u0a48; # VOWEL SIGN AI +\ue049>\u0a4c; # REMAP (indicExceptions.txt): \u0a49>\u0a4c = VOWEL SIGN CANDRA O>VOWEL SIGN AU +\ue04a>\u0a4b; # FALLBACK +\ue04b>\u0a4b; # VOWEL SIGN OO +\ue04c>\u0a4c; # VOWEL SIGN AU +\ue04d>\u0a4d; # SIGN VIRAMA +\ue050>\u0a0f\u0a02; # FALLBACK to OO+BINDI : OM +\ue051>; +\ue052>; +\ue053>; +\ue054>; +\ue055>; # FALLBACK BLOW AWAY LENGTH MARK +\ue056>\u0a48; # REMAP (indicExceptions.txt): \u0a56>\u0a48 = AI LENGTH MARK>VOWEL SIGN AI +\ue057>\u0a4c; # REMAP (indicExceptions.txt): \u0a57>\u0a4c = AU LENGTH MARK>VOWEL SIGN AU +\ue058>\u0a15\u0a3c; # FALLBACK RA+ NUKTA +\ue059>\u0a59; # LETTER KHHA +\ue05a>\u0a5a; # LETTER GHHA +\ue05b>\u0a5b; # LETTER ZA +\ue05c>\u0a5c; # LETTER RRA +\ue05d>\u0a22\u0a3c; # REMAP (indicExceptions.txt): \u0a5d>\u0a22\u0a3c = LETTER RHA>LETTER DDHA.SIGN NUKTA +\ue05e>\u0a5e; # LETTER FA +\ue05f>\u0a2f\u0a3c; # REMAP (indicExceptions.txt): \u0a5f>\u0a2f = LETTER YYA>LETTER YA +\ue060>\u0a30\u0a3f; # REMAP (indicExceptions.txt): \u0a60>\u0a30\u0a3f = LETTER VOCALIC RR>LETTER RA.VOWEL SIGN I +\ue061>\u0a32\u0a3c; # +\ue062>\u0a3f\u0a3c; # REMAP (indicExceptions.txt): \u0a62>\u0a3f\u0a3c = VOWEL SIGN VOCALIC L>VOWEL SIGN I.SIGN NUKTA +\ue063>\u0a40\u0a3c; # REMAP (indicExceptions.txt): \u0a63>\u0a40\u0a3c = VOWEL SIGN VOCALIC LL>VOWEL SIGN II.SIGN NUKTA +\uE064>\u0964; # DANDA +\uE065>\u0965; # DOUBLE DANDA +\ue066>\u0a66; # DIGIT ZERO +\ue067>\u0a67; # DIGIT ONE +\ue068>\u0a68; # DIGIT TWO +\ue069>\u0a69; # DIGIT THREE +\ue06a>\u0a6a; # DIGIT FOUR +\ue06b>\u0a6b; # DIGIT FIVE +\ue06c>\u0a6c; # DIGIT SIX +\ue06d>\u0a6d; # DIGIT SEVEN +\ue06e>\u0a6e; # DIGIT EIGHT +\ue06f>\u0a6f; # DIGIT NINE +\ue070>; # ABBREVIATION SIGN +\ue071>\u0a30; # LETTER RA WITH MIDDLE DIAGONAL +\ue072>\u0a30; # LETTER RA WITH LOWER DIAGONAL +\ue073>; # RUPEE MARK +\ue074>; # RUPEE SIGN +\ue075>; # CURRENCY NUMERATOR ONE +\ue076>; # CURRENCY NUMERATOR TWO +\ue077>; # CURRENCY NUMERATOR THREE +\ue078>; # CURRENCY NUMERATOR FOUR +\ue079>; # CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR +\ue07A>; # CURRENCY DENOMINATOR SIXTEEN +\ue07B>; # ISSHAR +\uE07C>\u0a70; # TIPPI +\uE07D>\u0a71; # ADDAK +\uE07E>\u0a72; # IRI +\uE07F>\u0a73; # URA +\uE080>\u0a74; # EK ONKAR +\uE081>\u0a35; # FALLBACK FOR ORIYA LETTER WA + +0 > \u0a66; # FALLBACK FOR TAMIL +1 > \u0a67; +# :: NFC (NFD) ; +# eof diff --git a/icuSources/data/translit/InterIndic_Kannada.txt b/icuSources/data/translit/InterIndic_Kannada.txt new file mode 100644 index 00000000..18ea84ae --- /dev/null +++ b/icuSources/data/translit/InterIndic_Kannada.txt @@ -0,0 +1,141 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# InterIndic-Kannada +#:: NFD (NFC) ; +\ue033\ue03c>\u0cde; # LETTER FA +\ue001>\u0c82; # REMAP (indicExceptions.txt): \u0c81>\u0c82 = SIGN CANDRABINDU>SIGN ANUSVARA +\ue002>\u0c82; # SIGN ANUSVARA +\ue003>\u0c83; # SIGN VISARGA +\uE004>\u0c85; # FALLBACK TO LETTER A +\ue005>\u0c85; # LETTER A +\ue006>\u0c86; # LETTER AA +\ue007>\u0c87; # LETTER I +\ue008>\u0c88; # LETTER II +\ue009>\u0c89; # LETTER U +\ue00a>\u0c8a; # LETTER UU +\ue00b>\u0c8b; # LETTER VOCALIC R +\ue00c>\u0c8c; # LETTER VOCALIC L +\ue00d>\u0c8e; # LETTER E +\ue00e>\u0c8e; # FALLBACK +\ue00f>\u0c8f; # LETTER EE +\ue010>\u0c90; # LETTER AI +\ue011>\u0c92; # FALLBACK +\ue012>\u0c92; # LETTER O +\ue013>\u0c93; # LETTER OO +\ue014>\u0c94; # LETTER AU +\ue015>\u0c95; # LETTER KA +\ue016>\u0c96; # LETTER KHA +\ue017>\u0c97; # LETTER GA +\ue018>\u0c98; # LETTER GHA +\ue019>\u0c99; # LETTER NGA +\ue01a>\u0c9a; # LETTER CA +\ue01b>\u0c9b; # LETTER CHA +\ue01c>\u0c9c; # LETTER JA +\ue01d>\u0c9d; # LETTER JHA +\ue01e>\u0c9e; # LETTER NYA +\ue01f>\u0c9f; # LETTER TTA +\ue020>\u0ca0; # LETTER TTHA +\ue021>\u0ca1; # LETTER DDA +\ue022>\u0ca2; # LETTER DDHA +\ue023>\u0ca3; # LETTER NNA +\ue024>\u0ca4; # LETTER TA +\ue025>\u0ca5; # LETTER THA +\ue026>\u0ca6; # LETTER DA +\ue027>\u0ca7; # LETTER DHA +\ue028>\u0ca8; # LETTER NA +\ue029>\u0ca8; # REMAP (indicExceptions.txt): \u0ca9>\u0ca8 = LETTER NNNA>LETTER NA +\ue02a>\u0caa; # LETTER PA +\ue02b>\u0cab; # LETTER PHA +\ue02c>\u0cac; # LETTER BA +\ue02d>\u0cad; # LETTER BHA +\ue02e>\u0cae; # LETTER MA +\ue02f>\u0caf; # LETTER YA +\ue030\ue03c>\u0cb1; +\ue030>\u0cb0; # LETTER RA +\ue031>\u0cb1; # LETTER RRA +\ue032>\u0cb2; # LETTER LA +\ue033>\u0cb3; # LETTER LLA +\ue034>\u0cde; # REMAP (indicExceptions.txt): \u0cb4>\u0cb3 = LETTER LLLA>LETTER LLA +\ue035>\u0cb5; # LETTER VA +\ue036>\u0cb6; # LETTER SHA +\ue037>\u0cb7; # LETTER SSA +\ue038>\u0cb8; # LETTER SA +\ue039>\u0cb9; # LETTER HA + +\ue03c>\u0cbc; # NUKTA +\ue03d>\u0cbd; # AVAGRAHA + +\ue03e>\u0cbe; # VOWEL SIGN AA +\ue03f>\u0cbf; # VOWEL SIGN I +\ue040>\u0cc0; # VOWEL SIGN II +\ue041>\u0cc1; # VOWEL SIGN U +\ue042>\u0cc2; # VOWEL SIGN UU +\ue043>\u0cc3; # VOWEL SIGN VOCALIC R +\ue044>\u0cc4; # VOWEL SIGN VOCALIC RR +\ue045>\u0cc6; # REMAP (indicExceptions.txt): \u0cc5>\u0cc6 = VOWEL SIGN CANDRA E>VOWEL SIGN E +\ue046>\u0cc6; # VOWEL SIGN E +\ue047>\u0cc7; # VOWEL SIGN EE +\ue048>\u0cc8; # VOWEL SIGN AI +\ue049>\u0cca; # REMAP (indicExceptions.txt): \u0cc9>\u0cca = VOWEL SIGN CANDRA O>VOWEL SIGN O +\ue04a>\u0cca; # VOWEL SIGN O +\ue04b>\u0ccb; # VOWEL SIGN OO +\ue04c>\u0ccc; # VOWEL SIGN AU +\ue04d>\u0ccd; # SIGN VIRAMA +\ue050>\u0c93\u0c82; # REMAP (indicExceptions.txt): \u0cd0>\u0c93\u0c82 = OM>LETTER OO.SIGN ANUSVARA +\ue051>; +\ue052>; +\ue053>; +\ue054>; +\ue055>\u0cd5; # LENGTH MARK +\ue056>\u0cd6; # AI LENGTH MARK +\ue057>\u0ccc; # REMAP (indicExceptions.txt): \u0cd7>\u0ccc = AU LENGTH MARK>VOWEL SIGN AU +\ue058>\u0c95; # FALLBACK +\ue059>\u0c96; # REMAP (indicExceptions.txt): \u0cd9>\u0c96 = LETTER KHHA>LETTER KHA +\ue05a>\u0c97; # REMAP (indicExceptions.txt): \u0cda>\u0c97 = LETTER GHHA>LETTER GA +\ue05b>\u0c9c; # REMAP (indicExceptions.txt): \u0cdb>\u0c9c = LETTER ZA>LETTER JA +\ue05c>\u0ca2; # FALLBACK +\ue05d>\u0ca2; # REMAP (indicExceptions.txt): \u0cdd>\u0ca2 = LETTER RHA>LETTER DDHA +\ue05e>\u0cde; # LETTER FA +\ue05f>\u0caf; # REMAP (indicExceptions.txt): \u0cdf>\u0caf = LETTER YYA>LETTER YA +\ue060>\u0ce0; # LETTER VOCALIC RR +\ue061>\u0ce1; # LETTER VOCALIC LL +\ue062>\u0cbf; # REMAP (indicExceptions.txt): \u0ce2>\u0cbf = VOWEL SIGN VOCALIC L>VOWEL SIGN I +\ue063>\u0cc0; # REMAP (indicExceptions.txt): \u0ce3>\u0cc0 = VOWEL SIGN VOCALIC LL>VOWEL SIGN II +\ue064>'.' ; # FALLBACK FOR DANDA +\ue065>'.' ; # FALLBACK FOR DOUBLE DANDA +\ue066>\u0ce6; # DIGIT ZERO +\ue067>\u0ce7; # DIGIT ONE +\ue068>\u0ce8; # DIGIT TWO +\ue069>\u0ce9; # DIGIT THREE +\ue06a>\u0cea; # DIGIT FOUR +\ue06b>\u0ceb; # DIGIT FIVE +\ue06c>\u0cec; # DIGIT SIX +\ue06d>\u0ced; # DIGIT SEVEN +\ue06e>\u0cee; # DIGIT EIGHT +\ue06f>\u0cef; # DIGIT NINE +\ue070>; # ABBREVIATION SIGN +\ue071>\u0cb0; # LETTER RA WITH MIDDLE DIAGONAL +\ue072>\u0cb0; # LETTER RA WITH LOWER DIAGONAL +\ue073>; # RUPEE MARK +\ue074>; # RUPEE SIGN +\ue075>; # CURRENCY NUMERATOR ONE +\ue076>; # CURRENCY NUMERATOR TWO +\ue077>; # CURRENCY NUMERATOR THREE +\ue078>; # CURRENCY NUMERATOR FOUR +\ue079>; # CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR +\ue07A>; # CURRENCY DENOMINATOR SIXTEEN +\ue07B>; # ISSHAR +\uE07C>; # TIPPI +\uE07D>; # ADDAK +\uE07E>; # IRI +\uE07F>; # URA +\uE080>; # EK ONKAR +\uE081>\u0cb5; # FALLBACK FOR ORIYA LETTER WA +0 > \u0ce6; # FALLBACK FOR TAMIL +1 > \u0ce7; + +# :: NFC (NFD) ; +# eof diff --git a/icuSources/data/translit/InterIndic_Latin.txt b/icuSources/data/translit/InterIndic_Latin.txt new file mode 100644 index 00000000..f734a0db --- /dev/null +++ b/icuSources/data/translit/InterIndic_Latin.txt @@ -0,0 +1,529 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# InterIndic-Latin + #\u0e00 reserved + #consonants + $chandrabindu=\ue001; + $anusvara=\ue002; + $visarga=\ue003; + #\u0e004 reserved + # w represents the stand-alone form + $wa=\ue005; + $waa=\ue006; + $wi=\ue007; + $wii=\ue008; + $wu=\ue009; + $wuu=\ue00a; + $wr=\ue00b; + $wl=\ue00c; + $wce=\ue00d; # LETTER CANDRA E + $wse=\ue00e; # LETTER SHORT E + $we=\ue00f; # \u090f LETTER E + $wai=\ue010; + $wco=\ue011; # LETTER CANDRA O + $wso=\ue012; # LETTER SHORT O + $wo=\ue013; # \u0913 LETTER O + $wau=\ue014; + $ka=\ue015; + $kha=\ue016; + $ga=\ue017; + $gha=\ue018; + $nga=\ue019; + $ca=\ue01a; + $cha=\ue01b; + $ja=\ue01c; + $jha=\ue01d; + $nya=\ue01e; + $tta=\ue01f; + $ttha=\ue020; + $dda=\ue021; + $ddha=\ue022; + $nna=\ue023; + $ta=\ue024; + $tha=\ue025; + $da=\ue026; + $dha=\ue027; + $na=\ue028; + $ena=\ue029; #compatibility + $pa=\ue02a; + $pha=\ue02b; + $ba=\ue02c; + $bha=\ue02d; + $ma=\ue02e; + $ya=\ue02f; + $ra=\ue030; + $vva=\ue081; + $rra=\ue031; + $la=\ue032; + $lla=\ue033; + $ela=\ue034; #compatibility + $va=\ue035; + $sha=\ue036; + $ssa=\ue037; + $sa=\ue038; + $ha=\ue039; +#\u093a Reserved +#\u093b Reserved + $nukta=\ue03c; + $avagraha=\ue03d; # SIGN AVAGRAHA + # represents the dependent form + $aa=\ue03e; + $i=\ue03f; + $ii=\ue040; + $u=\ue041; + $uu=\ue042; + $rh=\ue043; + $lh=\ue044; + $ce=\ue045; #VOWEL SIGN CANDRA E + $se=\ue046; #VOWEL SIGN SHORT E + $e=\ue047; + $ai=\ue048; + $co=\ue049; # VOWEL SIGN CANDRA O + $so=\ue04a; # VOWEL SIGN SHORT O + $o=\ue04b; # \u094b + $au=\ue04c; + $virama=\ue04d; +# \u094e Reserved +# \u094f Reserved + $om=\ue050; # OM + \ue051>; # UNMAPPED STRESS SIGN UDATTA + \ue052>; # UNMAPPED STRESS SIGN ANUDATTA + \ue053>; # UNMAPPED GRAVE ACCENT + \ue054>; # UNMAPPED ACUTE ACCENT + $lm = \ue055;# Telugu Length Mark + $ailm=\ue056;# AI Length Mark + $aulm=\ue057;# AU Length Mark + #urdu compatibity forms + $uka=\ue058; + $ukha=\ue059; + $ugha=\ue05a; + $ujha=\ue05b; + $uddha=\ue05c; + $udha=\ue05d; + $ufa=\ue05e; + $uya=\ue05f; + $wrr=\ue060; + $wll=\ue061; + $rrh=\ue062; + $llh=\ue063; + $danda=\ue064; + $doubleDanda=\ue065; + $zero=\ue066; # DIGIT ZERO + $one=\ue067; # DIGIT ONE + $two=\ue068; # DIGIT TWO + $three=\ue069; # DIGIT THREE + $four=\ue06a; # DIGIT FOUR + $five=\ue06b; # DIGIT FIVE + $six=\ue06c; # DIGIT SIX + $seven=\ue06d; # DIGIT SEVEN + $eight=\ue06e; # DIGIT EIGHT + $nine=\ue06f; # DIGIT NINE + +# \u0970>; # UNMAPPED ABBREVIATION SIGN + $depVowelAbove=[\ue03e-\ue040\ue045-\ue04c]; + $depVowelBelow=[\ue041-\ue044]; + # $x was originally called '&'; $z was '%' + $x=[$aa$ai$au$ii$i$uu$u$rrh$rh$lh$llh$e$o$se$ce$so$co]; + $z=[bcdfghjklmnpqrstvwxyz]; + $vowels=[aeiour\u0304\u0325\u0306]; + $forceIndependentMatra = [^[[:L:][\u0300-\u034c]]]; + ###################################################################### + # convert from Native letters to Latin letters + ###################################################################### + #transliterations for anusvara + $anusvara} [$ka$kha$ga$gha$nga] > n\u0307; + $anusvara} [$ca$cha$ja$jha$nya] > n\u0304; + $anusvara} [$tta$ttha$dda$ddha$nna] > n\u0323; + $anusvara} [$ta$tha$da$dha$na] > n ; + $anusvara} [$pa$pha$ba$bha$ma] > m ; + $anusvara} [$ya$ra$lla$la$va$ssa$sha$sa$ha] > n ; + $anusvara> m\u0307; + + # Urdu compatibility + $ya$nukta}$x > y\u0307 ; + $ya$nukta$virama > y\u0307 ; + $ya$nukta > y\u0307a ; + + $la$nukta }$x > l\u0331 ; + $la$nukta$virama > l\u0331 ; + $la$nukta > l\u0331a ; + + $na$nukta }$x > n\u0331 ; + $na$nukta$virama > n\u0331 ; + $na$nukta > n\u0331a ; + + $ena }$x > n\u0331 ; + $ena$virama > n\u0331 ; + $ena > n\u0331a ; + $uka > qa ; + $ka$nukta }$x > q ; + $ka$nukta$virama > q ; + $ka$nukta > qa ; + $kha$nukta }$x > k\u0331h\u0331 ; + $kha$nukta$virama > k\u0331h\u0331 ; + $kha$nukta > k\u0331h\u0331a ; + $ukha$virama > k\u0331h\u0331; + $ukha > k\u0331h\u0331a; + $ugha > g\u0307a ; + $ga$nukta }$x > g\u0307 ; + $ga$nukta$virama > g\u0307 ; + $ga$nukta > g\u0307a ; + + $ujha > za ; + $ja$nukta }$x > z ; + $ja$nukta$virama > z ; + $ja$nukta > za ; + $ddha$nukta}$x > r\u0323h ; + $ddha$nukta$virama > r\u0323h ; + $ddha$nukta > r\u0323ha; + + $uddha}$x > r\u0323 ; + $uddha$virama > r\u0323 ; + $uddha > r\u0323a; + + $udha > r\u0323a ; + $dda$nukta}$x > r\u0323 ; + $dda$nukta$virama > r\u0323 ; + $dda$nukta > r\u0323a ; + $pha$nukta }$x > f ; + $pha$nukta$virama > f ; + $pha$nukta > fa ; + $ufa }$x > f ; + $ufa$virama > f ; + $ufa > fa ; + + $ra$nukta}$x > r\u0331; + $ra$nukta$virama > r\u0331; + $ra$nukta > r\u0331a; + $lla$nukta}$x > l\u0331; + $lla$nukta$virama > l\u0331; + $lla$nukta > l\u0331a; + + $ela}$x > l\u0331; + $ela$virama > l\u0331; + $ela > l\u0331a; + + $uya}$x > y\u0307; + $uya$virama > y\u0307; + $uya > y\u0307a; + + + # normal consonants + $ka$virama}$ha>k''; + $ka}$x>k; + $ka$virama>k; + $ka>ka; + $kha}$x>kh; + $kha$virama>kh; + $kha>kha; + $ga$virama}$ha>g''; + $ga}$x>g; + $ga$virama>g; + $ga>ga; + + $gha}$x>gh; + $gha$virama>gh; + $gha>gha; + + $nga}$x>n\u0307; + $nga$virama>n\u0307; + $nga>n\u0307a ; + $ca$virama}$ha>c''; + $ca}$x>c; + $ca$virama>c; + $ca>ca; + + $cha}$x>ch; + $cha$virama>ch; + $cha>cha; + $ja$virama}$ha>j''; + $ja}$x>j; + $ja$virama>j; + $ja>ja; + + $jha}$x>jh; + $jha$virama>jh; + $jha>jha; + + $nya }$x>n\u0303 ; + $nya$virama>n\u0303; + $nya > n\u0303a ; + + + $tta$virama}$ha>t\u0323''; + $tta}$x>t\u0323; + $tta$virama>t\u0323; + $tta>t\u0323a; + + $ttha}$x>t\u0323h; + $ttha$virama>t\u0323h; + $ttha>t\u0323ha; + $dda}$x$ha>d\u0323''; + $dda}$x>d\u0323; + $dda$virama>d\u0323; + $dda>d\u0323a; + + $ddha}$x>d\u0323h; + $ddha$virama>d\u0323h; + $ddha>d\u0323ha; + + $nna}$x>n\u0323 ; + $nna$virama>n\u0323; + $nna>n\u0323a ; + + + $ta$virama}$ha>t''; + $ta$virama}$ttha>t''; + $ta$virama}$tta>t''; + $ta$virama}$tha>t''; + $ta}$x>t; + $ta$virama>t; + $ta>ta; + $tha}$x>th; + $tha$virama>th; + $tha>tha; + + $da$virama}$ha>d''; + $da$virama}$ddha>d''; + $da$virama}$dda>d''; + $da$virama}$dha>d''; + $da}$x>d; + $da$virama>d; + $da>da; + $dha}$x>dh; + $dha$virama>dh; + $dha>dha; + $na$virama}$ga>n''; + $na$virama}$ya>n''; + $na}$x>n; + $na$virama>n; + $na>na; + + + $pa$virama}$ha>p''; + $pa}$x>p; + $pa$virama>p; + $pa>pa; + $pha}$x>ph; + $pha$virama>ph; + $pha>pha; + $ba$virama}$ha>b''; + $ba}$x>b; + $ba$virama>b; + $ba>ba; + + $bha}$x>bh; + $bha$virama>bh; + $bha>bha; + + $ma$virama}$ma>m''; + $ma}$x>m; + $ma$virama>m; + $ma>ma; + + $ya}$x>y; + $ya$virama>y; + $ya>ya; + $ra$virama}$ha>r''; + $ra}$x>r; + $ra$virama>r; + $ra>ra; + $vva$virama}$ha>w\u0307''; + $vva}$x>w\u0307; + $vva$virama>w\u0307; + $vva>w\u0307a; + $rra$virama}$ha>r\u0331''; + $rra}$x>r\u0331; + $rra$virama>r\u0331; + $rra>r\u0331a; + $la$virama}$ha>l''; + $la}$x>l; + $la$virama>l; + $la>la; + $lla$virama}$ha>l\u0323''; + $lla}$x>l\u0323; + $lla$virama>l\u0323; + $lla>l\u0323a; + $va}$x>v; + $va$virama>v; + $va>va; + $sa$virama}$ha>s''; + $sa$virama}$sha>s''; + $sa$virama}$ssa>s''; + $sa$virama}$sa>s''; + $sa}$x>s; + $sa$virama>s; + + #for gurmukhi + $sa$nukta}$x>s\u0301; + $sa$nukta$virama>s\u0301; + $sa$nukta>s\u0301a; + $sa>sa; + + $sha}$x>s\u0301; + $sha$virama>s\u0301; + $sha>s\u0301a; + + $ssa}$x>s\u0323; + $ssa$virama>s\u0323; + $ssa>s\u0323a; + $ha}$x>h; + $ha$virama>h; + $ha>ha; + + # dependent vowels (should never occur except following consonants) + $forceIndependentMatra{$aa > \u0314a\u0304 ; + $forceIndependentMatra{$ai > \u0314ai ; + $forceIndependentMatra{$au > \u0314au ; + $forceIndependentMatra{$ii > \u0314i\u0304 ; + $forceIndependentMatra{$i > \u0314i ; + $forceIndependentMatra{$uu > \u0314u\u0304 ; + $forceIndependentMatra{$u > \u0314u ; + $forceIndependentMatra{$rrh > \u0314r\u0325\u0304 ; + $forceIndependentMatra{$rh > \u0314r\u0325 ; + $forceIndependentMatra{$llh > \u0314l\u0325\u0304 ; + $forceIndependentMatra{$lh > \u0314l\u0325 ; + $forceIndependentMatra{$e > \u0314e\u0304 ; + $forceIndependentMatra{$o > \u0314o\u0304 ; + #extra vowels + $forceIndependentMatra{$ce > \u0314e\u0306 ; + $forceIndependentMatra{$co > \u0314o\u0306 ; + $forceIndependentMatra{$se > \u0314e ; + $forceIndependentMatra{$so > \u0314o ; + $forceIndependentMatra{$nukta >; # Nukta cannot appear independently or as first character + $forceIndependentMatra{$virama >; # Virama cannot appear independently or as first character + $aa > a\u0304 ; + $ai > ai ; + $au > au ; + $ii > i\u0304 ; + $i > i ; + $uu > u\u0304 ; + $u > u ; + $rrh > r\u0325\u0304 ; + $rh > r\u0325 ; + $llh > l\u0325\u0304 ; + $lh > l\u0325 ; + $e > e\u0304 ; + $o > o\u0304 ; + #extra vowels + $ce > e\u0306 ; + $co > o\u0306 ; + $se > e ; + $so > o ; + #dependent vowels when following independent vowels. Generally Illegal only for roundtripping + $waa} $x > a\u0304\u0314 ; + $wai} $x > ai\u0314 ; + $wau} $x > au\u0314 ; + $wii} $x > i\u0304\u0314 ; + $wi } $x > i\u0314 ; + $wuu} $x > u\u0304\u0314 ; + $wu } $x > u\u0314 ; + $wrr} $x > r\u0325\u0304\u0314 ; + $wr } $x > r\u0325\u0314 ; + $wll} $x > l\u0325\u0304\u0314 ; + $wl } $x > l\u0325\u0314 ; + $we } $x > e\u0304\u0314 ; + $wo } $x > o\u0304\u0314 ; + $wa } $x > a\u0314 ; + #extra vowels + $wce} $x > e\u0306\u0314 ; + $wco} $x > o\u0306\u0314 ; + $wse} $x > e\u0314 ; + $wso} $x > o\u0314 ; + $om} $x > ''om\u0314 ; + + # independent vowels when preceeded by vowels + $vowels{$waa > ''a\u0304 ; + $vowels{$wai > ''ai ; + $vowels{$wau > ''au ; + $vowels{$wii > ''i\u0304 ; + $vowels{$wi > ''i ; + $vowels{$wuu > ''u\u0304 ; + $vowels{$wu > ''u ; + $vowels{$wrr > ''r\u0325\u0304 ; + $vowels{$wr > ''r\u0325 ; + $vowels{$wll > ''l\u0325\u0304 ; + $vowels{$wl > ''l\u0325 ; + $vowels{$we > ''e\u0304 ; + $vowels{$wo > ''o\u0304 ; + $vowels{$wa > ''a ; + #extra vowels + $vowels{$wce > ''e\u0306 ; + $vowels{$wco > ''o\u0306 ; + $vowels{$wse > ''e ; + $vowels{$wso > ''o ; + + # independent vowels (otherwise) + $waa > a\u0304 ; + $wai > ai ; + $wau > au ; + $wii > i\u0304 ; + $wi > i ; + $wuu > u\u0304 ; + $wu > u ; + $wrr > r\u0325\u0304 ; + $wr > r\u0325 ; + $wll > l\u0325\u0304 ; + $wl > l\u0325 ; + $we > e\u0304 ; + $wo > o\u0304 ; + $wa > a ; + #extra vowels + $wce > e\u0306 ; + $wco > o\u0306 ; + $wse > e ; + $wso > o ; + $om > ''om ; + + #stress marks + $avagraha > \u0315; + $chandrabindu$anusvara>\u0303; + $chandrabindu > m\u0310; + $visarga>h\u0323; + #numbers + $zero > 0; + $one > 1; + $two > 2; + $three > 3; + $four > 4; + $five > 5; + $six > 6; + $seven > 7; + $eight > 8; + $nine > 9; + $lm >; + $ailm >; + $aulm >; + + $danda>'.'; + $doubleDanda>'.'; + + \ue070>; # ABBREVIATION SIGN + # LETTER RA WITH MIDDLE DIAGONAL + \ue071}$x>ra; + \ue071$virama>r; + \ue071>ra; + # LETTER RA WITH LOWER DIAGONAL + \ue072}$x>ra; + \ue072$virama>r; + \ue072>ra; + + \ue073>; # RUPEE MARK + \ue074>; # RUPEE SIGN + \ue075>; # CURRENCY NUMERATOR ONE + \ue076>; # CURRENCY NUMERATOR TWO + \ue077>; # CURRENCY NUMERATOR THREE + \ue078>; # CURRENCY NUMERATOR FOUR + \ue079>; # CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR + \ue07A>; # CURRENCY DENOMINATOR SIXTEEN + \ue07B>; # ISSHAR + \uE07C>; # TIPPI + \uE07D>; # ADDAK + \uE07E>; # IRI + \uE07F>; # URA + \uE080>; # EK ONKAR + \uE004>; # DEVANAGARI VOWEL SIGN SHORT A + \ No newline at end of file diff --git a/icuSources/data/translit/InterIndic_Malayalam.txt b/icuSources/data/translit/InterIndic_Malayalam.txt new file mode 100644 index 00000000..7b8c7732 --- /dev/null +++ b/icuSources/data/translit/InterIndic_Malayalam.txt @@ -0,0 +1,141 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# InterIndic-Malayalam +#:: NFD (NFC) ; +\ue001>\u0d02; # REMAP (indicExceptions.txt): \u0d01>\u0d02 = SIGN CANDRABINDU>SIGN ANUSVARA +\ue002>\u0d02; # SIGN ANUSVARA +\ue003>\u0d03; # SIGN VISARGA +\uE004>\u0d05; # FALLBACK TO LETTER A +\ue005>\u0d05; # LETTER A +\ue006>\u0d06; # LETTER AA +\ue007>\u0d07; # LETTER I +\ue008>\u0d08; # LETTER II +\ue009>\u0d09; # LETTER U +\ue00a>\u0d0a; # LETTER UU +\ue00b>\u0d0b; # LETTER VOCALIC R +\ue00c>\u0d0c; # LETTER VOCALIC L +\ue00d>\u0d0e; # FALLLBACK LETTER E +\ue00e>\u0d0e; # LETTER E +\ue00f>\u0d0f; # LETTER EE +\ue010>\u0d10; # LETTER AI +\ue011>\u0d12; # FALLBACK TO O +\ue012>\u0d12; # LETTER O +\ue013>\u0d13; # LETTER OO +\ue014>\u0d14; # LETTER AU +\ue015>\u0d15; # LETTER KA +\ue016>\u0d16; # LETTER KHA +\ue017>\u0d17; # LETTER GA +\ue018>\u0d18; # LETTER GHA +\ue019>\u0d19; # LETTER NGA +\ue01a>\u0d1a; # LETTER CA +\ue01b>\u0d1b; # LETTER CHA +\ue01c>\u0d1c; # LETTER JA +\ue01d>\u0d1d; # LETTER JHA +\ue01e>\u0d1e; # LETTER NYA +\ue01f>\u0d1f; # LETTER TTA +\ue020>\u0d20; # LETTER TTHA +\ue021>\u0d21; # LETTER DDA +\ue022>\u0d22; # LETTER DDHA +\ue023>\u0d23; # LETTER NNA +\ue024>\u0d24; # LETTER TA +\ue025>\u0d25; # LETTER THA +\ue026>\u0d26; # LETTER DA +\ue027>\u0d27; # LETTER DHA +\ue028>\u0d28; # LETTER NA +\ue029>\u0d28; # REMAP (indicExceptions.txt): \u0d29>\u0d28 = LETTER NNNA>LETTER NA +\ue02a>\u0d2a; # LETTER PA +\ue02b>\u0d2b; # LETTER PHA +\ue02c>\u0d2c; # LETTER BA +\ue02d>\u0d2d; # LETTER BHA +\ue02e>\u0d2e; # LETTER MA +\ue02f>\u0d2f; # LETTER YA +\ue030\ue03c>\u0d31; +\ue030>\u0d30; # LETTER RA +\ue031>\u0d31; # LETTER RRA +\ue032>\u0d32; # LETTER LA +\ue033\ue03c>\u0d34; +\ue033>\u0d33; # LETTER LLA +\ue034>\u0d34; # LETTER LLLA +\ue035>\u0d35; # LETTER VA +\ue036>\u0d36; # LETTER SHA +\ue037>\u0d37; # LETTER SSA +\ue038>\u0d38; # LETTER SA +\ue039>\u0d39; # LETTER HA + +\ue03c>; # FALLBACK BLOW AWAY NUKTA +\ue03d>; # FALLBACK BLOW AWAY AVAGRAHA + +\ue03e>\u0d3e; # VOWEL SIGN AA +\ue03f>\u0d3f; # VOWEL SIGN I +\ue040>\u0d40; # VOWEL SIGN II +\ue041>\u0d41; # VOWEL SIGN U +\ue042>\u0d42; # VOWEL SIGN UU +\ue043>\u0d43; # VOWEL SIGN VOCALIC R +\ue044>; # FALLBACK BLOW AWAY VOWEL SIGN VOCALIC RR +\ue045>\u0d3e; # REMAP (indicExceptions.txt): \u0d45>\u0d3e = VOWEL SIGN CANDRA E>VOWEL SIGN AA +\ue046>\u0d46; # VOWEL SIGN E +\ue047>\u0d47; # VOWEL SIGN EE +\ue048>\u0d48; # VOWEL SIGN AI +\ue049>\u0d4b; # REMAP (indicExceptions.txt): \u0d49>\u0d4b = VOWEL SIGN CANDRA O>VOWEL SIGN OO +\ue04a>\u0d4a; # VOWEL SIGN O +\ue04b>\u0d4b; # VOWEL SIGN OO +\ue04c>\u0d4c; # VOWEL SIGN AU +\ue04d>\u0d4d; # SIGN VIRAMA +\ue050>\u0d13\u0d02; # UNMAPPED InterIndic-Malayalam: OM +\ue051>; +\ue052>; +\ue053>; +\ue054>; +\ue055>; # FALLBACK BLOW AWAY LENGTH MARK +\ue056>\u0d48; # REMAP (indicExceptions.txt): \u0d56>\u0d48 = AI LENGTH MARK>VOWEL SIGN AI +\ue057>\u0d57; # AU LENGTH MARK +\ue058>\u0d15; # FALLBACK +\ue059>\u0d16; # REMAP (indicExceptions.txt): \u0d59>\u0d16 = LETTER KHHA>LETTER KHA +\ue05a>\u0d17; # REMAP (indicExceptions.txt): \u0d5a>\u0d17 = LETTER GHHA>LETTER GA +\ue05b>\u0d1c; # REMAP (indicExceptions.txt): \u0d5b>\u0d1c = LETTER ZA>LETTER JA +\ue05d>\u0d22; # REMAP (indicExceptions.txt): \u0d5d>\u0d22 = LETTER RHA>LETTER DDHA +\ue05c>\u0d21; # FALLBACK +\ue05e>\u0d2b; # REMAP (indicExceptions.txt): \u0d5e>\u0d2b = LETTER FA>LETTER PHA +\ue05f>\u0d2f; # REMAP (indicExceptions.txt): \u0d5f>\u0d2f = LETTER YYA>LETTER YA +\ue060>\u0d60; # LETTER VOCALIC RR +\ue061>\u0d61; # LETTER VOCALIC LL +\ue062>; # FALLBACK BLOW AWAY VOWEL SIGN VOCALIC L +\ue063>; # FALLBACK BLOW AWAY VOWEL SIGN VOCALIC LL +\ue064>'.' ; # FALLBACK FOR DANDA +\ue065>'.' ; # FALLBACK FOR DOUBLE DANDA +\ue066>\u0d66; # DIGIT ZERO +\ue067>\u0d67; # DIGIT ONE +\ue068>\u0d68; # DIGIT TWO +\ue069>\u0d69; # DIGIT THREE +\ue06a>\u0d6a; # DIGIT FOUR +\ue06b>\u0d6b; # DIGIT FIVE +\ue06c>\u0d6c; # DIGIT SIX +\ue06d>\u0d6d; # DIGIT SEVEN +\ue06e>\u0d6e; # DIGIT EIGHT +\ue06f>\u0d6f; # DIGIT NINE +\ue070>; # ABBREVIATION SIGN +\ue071>\u0d30; # LETTER RA WITH MIDDLE DIAGONAL +\ue072>\u0d30; # LETTER RA WITH LOWER DIAGONAL +\ue073>; # RUPEE MARK +\ue074>; # RUPEE SIGN +\ue075>; # CURRENCY NUMERATOR ONE +\ue076>; # CURRENCY NUMERATOR TWO +\ue077>; # CURRENCY NUMERATOR THREE +\ue078>; # CURRENCY NUMERATOR FOUR +\ue079>; # CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR +\ue07A>; # CURRENCY DENOMINATOR SIXTEEN +\ue07B>; # ISSHAR +\uE07C>; # TIPPI +\uE07D>; # ADDAK +\uE07E>; # IRI +\uE07F>; # URA +\uE080>; # EK ONKAR +\uE081>\u0d35; # FALLBACK FOR ORIYA LETTER WA +0 > \u0d66; # FALLBACK FOR TAMIL +1 > \u0d67; + +# :: NFC (NFD) ; +# eof diff --git a/icuSources/data/translit/InterIndic_Oriya.txt b/icuSources/data/translit/InterIndic_Oriya.txt new file mode 100644 index 00000000..0726e279 --- /dev/null +++ b/icuSources/data/translit/InterIndic_Oriya.txt @@ -0,0 +1,137 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# InterIndic-Oriya +#:: NFD (NFC) ; +\ue001>\u0b01; # SIGN CANDRABINDU +\ue002>\u0b02; # SIGN ANUSVARA +\ue003>\u0b03; # SIGN VISARGA +\uE004>\u0b05; # FALLBACK TO LETTER A +\ue005>\u0b05; # LETTER A +\ue006>\u0b06; # LETTER AA +\ue007>\u0b07; # LETTER I +\ue008>\u0b08; # LETTER II +\ue009>\u0b09; # LETTER U +\ue00a>\u0b0a; # LETTER UU +\ue00b>\u0b0b; # LETTER VOCALIC R +\ue00c>\u0b0c; # LETTER VOCALIC L +\ue00d>\u0b0f; # FALLBACK +\ue00e>\u0b0f; # FALLBACK +\ue00f>\u0b0f; # LETTER E +\ue010>\u0b10; # LETTER AI +\ue011>\u0b13; # FALLBACK +\ue012>\u0b13; # FALLBACK +\ue013>\u0b13; # FALLBACK LETTER OO (\u0b13 = LETTER O) +\ue014>\u0b14; # LETTER AU +\ue015>\u0b15; # LETTER KA +\ue016>\u0b16; # LETTER KHA +\ue017>\u0b17; # LETTER GA +\ue018>\u0b18; # LETTER GHA +\ue019>\u0b19; # LETTER NGA +\ue01a>\u0b1a; # LETTER CA +\ue01b>\u0b1b; # LETTER CHA +\ue01c>\u0b1c; # LETTER JA +\ue01d>\u0b1d; # LETTER JHA +\ue01e>\u0b1e; # LETTER NYA +\ue01f>\u0b1f; # LETTER TTA +\ue020>\u0b20; # LETTER TTHA +\ue021>\u0b21; # LETTER DDA +\ue022>\u0b22; # LETTER DDHA +\ue023>\u0b23; # LETTER NNA +\ue024>\u0b24; # LETTER TA +\ue025>\u0b25; # LETTER THA +\ue026>\u0b26; # LETTER DA +\ue027>\u0b27; # LETTER DHA +\ue028>\u0b28; # LETTER NA +\ue029>\u0b28\u0b3c; # FALLBACK \u0b29>\u0b28 = LETTER NNNA>LETTER NA +\ue02a>\u0b2a; # LETTER PA +\ue02b>\u0b2b; # LETTER PHA +\ue02c>\u0b2c; # LETTER BA +\ue02d>\u0b2d; # LETTER BHA +\ue02e>\u0b2e; # LETTER MA +\ue02f>\u0b2f; # LETTER YA +\ue030>\u0b30; # LETTER RA +\ue031>\u0b5c; # LETTER RRA +\ue032>\u0b32; # LETTER LA +\ue033>\u0b33; # LETTER LLA +\ue034>\u0b33\u0b3c; # FALLBACK LETTER LLLA>LETTER LLA +\ue035>\u0b35; # LETTER VA +\ue036>\u0b36; # LETTER SHA +\ue037>\u0b37; # LETTER SSA +\ue038>\u0b38; # LETTER SA +\ue039>\u0b39; # LETTER HA +\ue03c>\u0b3c; # SIGN NUKTA +\ue03d>\u0b3d; # SIGN AVAGRAHA +\ue03e>\u0b3e; # VOWEL SIGN AA +\ue03f>\u0b3f; # VOWEL SIGN I +\ue040>\u0b40; # VOWEL SIGN II +\ue041>\u0b41; # VOWEL SIGN U +\ue042>\u0b42; # VOWEL SIGN UU +\ue043>\u0b43; # VOWEL SIGN VOCALIC R +\ue044>\u0b43\u0b3c; # FALLBACK \u0b44>\u0b43\u0b3c = VOWEL SIGN VOCALIC RR>VOWEL SIGN VOCALIC R.SIGN NUKTA +\ue045>\u0b47; # FALLBACK +\ue046>\u0b47; # FALLBACK +\ue047>\u0b47; # VOWEL SIGN E +\ue048>\u0b48; # VOWEL SIGN AI +\ue049>\u0b4b; # FALLBACK +\ue04a>\u0b4b; # FALLBACK +\ue04b>\u0b4b; # VOWEL SIGN E +\ue04c>\u0b4c; # VOWEL SIGN AU +\ue04d>\u0b4d; # SIGN VIRAMA +\ue050>\u0b13\u0b01; # FALLBACK \u0b50>\u0b13\u0b01 = OM>LETTER O.SIGN CANDRABINDU +\ue051>; +\ue052>; +\ue053>; +\ue054>; +\ue055>; # UNMAPPED InterIndic-Oriya: LENGTH MARK +\ue056>\u0b56; # AI LENGTH MARK +\ue057>\u0b57; # AU LENGTH MARK +\ue059>\u0b16\u0b3c; # FALLBACK \u0b59>\u0b16\u0b3c = LETTER KHHA>LETTER KHA.SIGN NUKTA +\ue058>\u0b15\u0b3c; # FALLBACK +\ue05a>\u0b17\u0b3c; # FALLBACK \u0b5a>\u0b17\u0b3c = LETTER GHHA>LETTER GA.SIGN NUKTA +\ue05b>\u0b1c\u0b3c; # FALLBACK \u0b5b>\u0b1c\u0b3c = LETTER ZA>LETTER JA.SIGN NUKTA +\ue05c>\u0b21\u0b3c; # FALLBACK +\ue05d>\u0b5d; # LETTER RHA +\ue05e>\u0b2b\u0b3c; # FALLBACK \u0b5e>\u0b2b\u0b3c = LETTER FA>LETTER PHA.SIGN NUKTA +\ue05f>\u0b5f; # LETTER YYA +\ue060>\u0b60; # LETTER VOCALIC RR +\ue061>\u0b61; # LETTER VOCALIC LL +\ue062>\u0b56\u0b3c; # FALLBACK \u0b62>\u0b56\u0b3c = VOWEL SIGN VOCALIC L>AI LENGTH MARK.SIGN NUKTA +\ue063>\u0b57\u0b3c; # FALLBACK \u0b63>\u0b57\u0b3c = VOWEL SIGN VOCALIC LL>AU LENGTH MARK.SIGN NUKTA +\uE064>\u0964; # DANDA +\uE065>\u0965; # DOUBLE DANDA +\ue066>\u0b66; # DIGIT ZERO +\ue067>\u0b67; # DIGIT ONE +\ue068>\u0b68; # DIGIT TWO +\ue069>\u0b69; # DIGIT THREE +\ue06a>\u0b6a; # DIGIT FOUR +\ue06b>\u0b6b; # DIGIT FIVE +\ue06c>\u0b6c; # DIGIT SIX +\ue06d>\u0b6d; # DIGIT SEVEN +\ue06e>\u0b6e; # DIGIT EIGHT +\ue06f>\u0b6f; # DIGIT NINE +\ue070>; # ABBREVIATION SIGN +\ue071>\u0b30; # LETTER RA WITH MIDDLE DIAGONAL +\ue072>\u0b30; # LETTER RA WITH LOWER DIAGONAL +\ue073>; # RUPEE MARK +\ue074>; # RUPEE SIGN +\ue075>; # CURRENCY NUMERATOR ONE +\ue076>; # CURRENCY NUMERATOR TWO +\ue077>; # CURRENCY NUMERATOR THREE +\ue078>; # CURRENCY NUMERATOR FOUR +\ue079>; # CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR +\ue07A>; # CURRENCY DENOMINATOR SIXTEEN +\ue07B>\u0B70; # ISSHAR +\uE07C>; # TIPPI +\uE07D>; # ADDAK +\uE07E>; # IRI +\uE07F>; # URA +\uE080>; # EK ONKAR +\uE081>\u0B71; # LETTER WA +0 > \u0b66; # FALLBACK FOR TAMIL +1 > \u0b67; + +# :: NFC (NFD) ; +# eof diff --git a/icuSources/data/translit/InterIndic_Tamil.txt b/icuSources/data/translit/InterIndic_Tamil.txt new file mode 100644 index 00000000..08889cba --- /dev/null +++ b/icuSources/data/translit/InterIndic_Tamil.txt @@ -0,0 +1,151 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# InterIndic-Tamil +#:: NFD (NFC) ; +\ue001>\u0b82; # FALLBACK SIGN CANDRABINDU +\ue002>\u0b82; # SIGN ANUSVARA +\ue003>\u0b83; # SIGN VISARGA +\uE004>\u0b85; # FALLBACK TO LETTER A +\ue005>\u0b85; # LETTER A +\ue006>\u0b86; # LETTER AA +\ue007>\u0b87; # LETTER I +\ue008>\u0b88; # LETTER II +\ue009>\u0b89; # LETTER U +\ue00a>\u0b8a; # LETTER UU +\ue00b>\u0bb0\u0bbf; # REMAP (indicExceptions.txt): \u0b8b>\u0bb0\u0bbf = LETTER VOCALIC R>LETTER RA.VOWEL SIGN I +\ue00c>\u0bb2; # FALLBACK LETTER LA +\ue00d>\u0b8f; # FALLBACK +\ue00e>\u0b8e; # LETTER E +\ue00f>\u0b8f; # LETTER EE +\ue010>\u0b90; # LETTER AI +\ue011>\u0b92; # FALLBACK +\ue012>\u0b92; # LETTER O +\ue013>\u0b93; # LETTER OO +\ue014>\u0b94; # LETTER AU +\ue015>\u0b95; # LETTER KA +\ue016>\u0b95; # REMAP (indicExceptions.txt): \u0b96>\u0b95 = LETTER KHA>LETTER KA +\ue017>\u0b95; # REMAP (indicExceptions.txt): \u0b97>\u0b95 = LETTER GA>LETTER KA +\ue018>\u0b95; # REMAP (indicExceptions.txt): \u0b98>\u0b95 = LETTER GHA>LETTER KA +\ue019>\u0b99; # LETTER NGA +\ue01a>\u0b9a; # LETTER CA +\ue01b>\u0b9a; # REMAP (indicExceptions.txt): \u0b9b>\u0b9a = LETTER CHA>LETTER CA +\ue01c>\u0b9c; # LETTER JA +\ue01d>\u0b9a; # REMAP (indicExceptions.txt): \u0b9d>\u0b9a = LETTER JHA>LETTER CA +\ue01e>\u0b9e; # LETTER NYA +\ue01f>\u0b9f; # LETTER TTA +\ue020>\u0b9f; # REMAP (indicExceptions.txt): \u0ba0>\u0b9f = LETTER TTHA>LETTER TTA +\ue021>\u0b9f; # REMAP (indicExceptions.txt): \u0ba1>\u0b9f = LETTER DDA>LETTER TTA +\ue022>\u0b9f; # REMAP (indicExceptions.txt): \u0ba2>\u0b9f = LETTER DDHA>LETTER TTA +\ue023>\u0ba3; # LETTER NNA +\ue024>\u0ba4; # LETTER TA +\ue025>\u0ba4; # REMAP (indicExceptions.txt): \u0ba5>\u0ba4 = LETTER THA>LETTER TA +\ue026>\u0ba4; # REMAP (indicExceptions.txt): \u0ba6>\u0ba4 = LETTER DA>LETTER TA +\ue027>\u0ba4; # REMAP (indicExceptions.txt): \u0ba7>\u0ba4 = LETTER DHA>LETTER TA +\ue028\ue03c>\u0ba9; +\ue028>\u0ba8; # LETTER NA +\ue029>\u0ba9; # LETTER NNNA +\ue02a>\u0baa; # LETTER PA +\ue02b>\u0baa; # REMAP (indicExceptions.txt): \u0bab>\u0baa = LETTER PHA>LETTER PA +\ue02c>\u0baa; # REMAP (indicExceptions.txt): \u0bac>\u0baa = LETTER BA>LETTER PA +\ue02d>\u0baa; # REMAP (indicExceptions.txt): \u0bad>\u0baa = LETTER BHA>LETTER PA +\ue02e>\u0bae; # LETTER MA +\ue02f>\u0baf; # LETTER YA +\ue030\ue03c>\u0bb1; +\ue030>\u0bb0; # LETTER RA +\ue031>\u0bb1; # LETTER RRA +\ue032>\u0bb2; # LETTER LA +\ue033\ue03c>\u0bb4; +\ue033>\u0bb3; # LETTER LLA +\ue034>\u0bb4; # LETTER LLLA +\ue035>\u0bb5; # LETTER VA +\ue036>\u0bb7; # REMAP (indicExceptions.txt): \u0bb6>\u0bb7 = LETTER SHA>LETTER SSA +\ue037>\u0bb7; # LETTER SSA +\ue038>\u0bb8; # LETTER SA +\ue039>\u0bb9; # LETTER HA + +\ue03c>; # FALLBACK BLOW AWAY NUKTA +\ue03d>; # FALLBACK BLOW AWAY AVAGRAHA + +\ue03e>\u0bbe; # VOWEL SIGN AA +\ue03f>\u0bbf; # VOWEL SIGN I +\ue040>\u0bc0; # VOWEL SIGN II +\ue041>\u0bc1; # VOWEL SIGN U +\ue042>\u0bc2; # VOWEL SIGN UU +\ue043>\u0bcd\u0bb0\u0bbf; # REMAP (indicExceptions.txt): \u0bc3>\u0bcd\u0bb0\u0bbf = VOWEL SIGN VOCALIC R>SIGN VIRAMA.LETTER RA.VOWEL SIGN I +\ue044>\u0bcd\u0bb0\u0bbf; # REMAP (indicExceptions.txt): \u0bc4>\u0bcd\u0bb0\u0bbf = VOWEL SIGN VOCALIC RR>SIGN VIRAMA.LETTER RA.VOWEL SIGN I +\ue045>\u0bbe; # REMAP (indicExceptions.txt): \u0bc5>\u0bbe = VOWEL SIGN CANDRA E>VOWEL SIGN AA +\ue046>\u0bc6; # VOWEL SIGN E +\ue047>\u0bc7; # VOWEL SIGN EE +\ue048>\u0bc8; # VOWEL SIGN AI +\ue049>\u0bbe; # REMAP (indicExceptions.txt): \u0bc9>\u0bbe = VOWEL SIGN CANDRA O>VOWEL SIGN AA +\ue04a>\u0bca; # VOWEL SIGN O +\ue04b>\u0bcb; # VOWEL SIGN OO +\ue04c>\u0bcc; # VOWEL SIGN AU +\ue04d>\u0bcd; # SIGN VIRAMA +\ue050>\u0b93\u0bae\u0bcd; # REMAP (indicExceptions.txt): \u0bd0>\u0b93\u0bae\u0bcd = OM>LETTER OO.LETTER MA.SIGN VIRAMA +\ue051>; +\ue052>; +\ue053>; +\ue054>; +\ue055>; # UNMAPPED InterIndic-Tamil: LENGTH MARK +\ue056>\u0bc8; # REMAP (indicExceptions.txt): \u0bd6>\u0bc8 = AI LENGTH MARK>VOWEL SIGN AI +\ue057>\u0bd7; # AU LENGTH MARK +\ue058>\u0b95; # FALLBACK +\ue059>\u0b95; # REMAP (indicExceptions.txt): \u0bd9>\u0b95 = LETTER KHHA>LETTER KA +\ue05a>\u0b95; # REMAP (indicExceptions.txt): \u0bda>\u0b95 = LETTER GHHA>LETTER KA +\ue05b>\u0b9c; # REMAP (indicExceptions.txt): \u0bdb>\u0b9c = LETTER ZA>LETTER JA +\ue05c>\u0ba4; # FALLBACK +\ue05d>\u0b9f; # REMAP (indicExceptions.txt): \u0bdd>\u0b9f = LETTER RHA>LETTER TTA +\ue05e>\u0baa; # REMAP (indicExceptions.txt): \u0bde>\u0baa = LETTER FA>LETTER PA +\ue05f>\u0baf; # REMAP (indicExceptions.txt): \u0bdf>\u0baf = LETTER YYA>LETTER YA +\ue060>\u0bb0\u0bbf; # REMAP (indicExceptions.txt): \u0be0>\u0bb0\u0bbf = LETTER VOCALIC RR>LETTER RA.VOWEL SIGN I +\ue061>\u0bb3; # FALLBACK LETTER LLA +\ue062>\u0bbf; # FALLBACK VOWEL SIGN VOCALIC L +\ue063>\u0bc0; # FALLBACK VOWEL SIGN VOCALIC LL +\ue064>'.' ; # FALLBACK FOR DANDA +\ue065>'.' ; # FALLBACK FOR DOUBLE DANDA + +\ue066>\u0030; # FALLBACK DIGIT ZERO + +\ue067\ue066\ue066\ue066>\u0bF2; +\ue067\ue066\ue066>\u0bf1; +\ue067\ue066>\u0bF0; + +\ue067>\u0be7; # DIGIT ONE +\ue068>\u0be8; # DIGIT TWO +\ue069>\u0be9; # DIGIT THREE +\ue06a>\u0bea; # DIGIT FOUR +\ue06b>\u0beb; # DIGIT FIVE +\ue06c>\u0bec; # DIGIT SIX +\ue06d>\u0bed; # DIGIT SEVEN +\ue06e>\u0bee; # DIGIT EIGHT +\ue06f>\u0bef; # DIGIT NINE + +\ue070>; # ABBREVIATION SIGN +\ue071>\u0bc0; # LETTER RA WITH MIDDLE DIAGONAL +\ue072>\u0bc0; # LETTER RA WITH LOWER DIAGONAL +\ue073>; # RUPEE MARK +\ue074>; # RUPEE SIGN +\ue075>; # CURRENCY NUMERATOR ONE +\ue076>; # CURRENCY NUMERATOR TWO +\ue077>; # CURRENCY NUMERATOR THREE +\ue078>; # CURRENCY NUMERATOR FOUR +\ue079>; # CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR +\ue07A>; # CURRENCY DENOMINATOR SIXTEEN +\ue07B>; # ISSHAR +\uE07C>; # TIPPI +\uE07D>; # ADDAK +\uE07E>; # IRI +\uE07F>; # URA +\uE080>; # EK ONKAR +\uE081>\u0bb5; # FALLBACK FOR ORIYA LETTER WA + +1000 >\u0BF2; # NUMBER ONE THOUSAND +100 >\u0BF1; # NUMBER ONE HUNDRED +10 >\u0BF0; # NUMBER TEN + +# :: NFC (NFD) ; +# eof diff --git a/icuSources/data/translit/InterIndic_Telugu.txt b/icuSources/data/translit/InterIndic_Telugu.txt new file mode 100644 index 00000000..026cd209 --- /dev/null +++ b/icuSources/data/translit/InterIndic_Telugu.txt @@ -0,0 +1,141 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# InterIndic-Telugu +#:: NFD (NFC) ; +\ue001>\u0c01; # SIGN CANDRABINDU +\ue002>\u0c02; # SIGN ANUSVARA +\ue003>\u0c03; # SIGN VISARGA +\uE004>\u0c05; # FALLBACK TO LETTER A +\ue005>\u0c05; # LETTER A +\ue006>\u0c06; # LETTER AA +\ue007>\u0c07; # LETTER I +\ue008>\u0c08; # LETTER II +\ue009>\u0c09; # LETTER U +\ue00a>\u0c0a; # LETTER UU +\ue00b>\u0c0b; # LETTER VOCALIC R +\ue00c>\u0c0c; # LETTER VOCALIC L +\ue00d>\u0c0E; # FALLBACK MAPPING +\ue00e>\u0c0E; # LETTER E +\ue00f>\u0c0f; # LETTER EE +\ue010>\u0c10; # LETTER AI +\ue011>\u0c12; # FALBACK MAPPING +\ue012>\u0c12; # LETTER O +\ue013>\u0c13; # LETTER OO +\ue014>\u0c14; # LETTER AU +\ue015>\u0c15; # LETTER KA +\ue016>\u0c16; # LETTER KHA +\ue017>\u0c17; # LETTER GA +\ue018>\u0c18; # LETTER GHA +\ue019>\u0c19; # LETTER NGA +\ue01a>\u0c1a; # LETTER CA +\ue01b>\u0c1b; # LETTER CHA +\ue01c>\u0c1c; # LETTER JA +\ue01d>\u0c1d; # LETTER JHA +\ue01e>\u0c1e; # LETTER NYA +\ue01f>\u0c1f; # LETTER TTA +\ue020>\u0c20; # LETTER TTHA +\ue021>\u0c21; # LETTER DDA +\ue022>\u0c22; # LETTER DDHA +\ue023>\u0c23; # LETTER NNA +\ue024>\u0c24; # LETTER TA +\ue025>\u0c25; # LETTER THA +\ue026>\u0c26; # LETTER DA +\ue027>\u0c27; # LETTER DHA +\ue028>\u0c28; # LETTER NA +\ue029>\u0c28; # REMAP (indicExceptions.txt): \u0c29>\u0c28 = LETTER NNNA>LETTER NA +\ue02a>\u0c2a; # LETTER PA +\ue02b>\u0c2b; # LETTER PHA +\ue02c>\u0c2c; # LETTER BA +\ue02d>\u0c2d; # LETTER BHA +\ue02e>\u0c2e; # LETTER MA +\ue02f>\u0c2f; # LETTER YA +\ue030\ue03c>\u0c31; +\ue030>\u0c30; # LETTER RA +\ue031>\u0c31; # LETTER RRA +\ue032>\u0c32; # LETTER LA +\ue033>\u0c33; # LETTER LLA +\ue034>\u0c33; # REMAP (indicExceptions.txt): \u0c34>\u0c33 = LETTER LLLA>LETTER LLA +\ue035>\u0c35; # LETTER VA +\ue036>\u0c36; # LETTER SHA +\ue037>\u0c37; # LETTER SSA +\ue038>\u0c38; # LETTER SA +\ue039>\u0c39; # LETTER HA + +\ue03c>; # FALLBACK BLOW AWAY NUKTA +\ue03d>; # FALLBACK BLOW AWAY AVAGRAHA + +\ue03e>\u0c3e; # VOWEL SIGN AA +\ue03f>\u0c3f; # VOWEL SIGN I +\ue040>\u0c40; # VOWEL SIGN II +\ue041>\u0c41; # VOWEL SIGN U +\ue042>\u0c42; # VOWEL SIGN UU +\ue043>\u0c43; # VOWEL SIGN VOCALIC R +\ue044>\u0c44; # VOWEL SIGN VOCALIC RR +\ue045>\u0c46; # VOWEL SIGN CANDRA E>VOWEL SIGN E +\ue046>\u0c46; # VOWEL SIGN E +\ue047>\u0c47; # VOWEL SIGN EE +\ue048>\u0c48; # VOWEL SIGN AI +\ue049>\u0c4a; # REMAP (indicExceptions.txt): \u0c49>\u0c4a = VOWEL SIGN CANDRA O>VOWEL SIGN O +\ue04a>\u0c4a; # VOWEL SIGN O +\ue04b>\u0c4b; # VOWEL SIGN OO +\ue04c>\u0c4c; # VOWEL SIGN AU +\ue04d>\u0c4d; # SIGN VIRAMA +\ue050>\u0c13\u0c02; # REMAP (indicExceptions.txt): \u0c50>\u0c13\u0c02 = OM>LETTER OO.SIGN ANUSVARA +\ue051>; +\ue052>; +\ue053>; +\ue054>; +\ue055>\u0c55; # LENGTH MARK +\ue056>\u0c56; # AI LENGTH MARK +\ue057>\u0c4c; # REMAP (indicExceptions.txt): \u0c57>\u0c4c = AU LENGTH MARK>VOWEL SIGN AU +\ue058>\u0c15; # REMAP +\ue059>\u0c16; # REMAP (indicExceptions.txt): \u0c59>\u0c16 = LETTER KHHA>LETTER KHA +\ue05a>\u0c17; # REMAP (indicExceptions.txt): \u0c5a>\u0c17 = LETTER GHHA>LETTER GA +\ue05b>\u0c1c; # REMAP (indicExceptions.txt): \u0c5b>\u0c1c = LETTER ZA>LETTER JA +\ue05c>\u0c22; # REMAP +\ue05d>\u0c22; # REMAP (indicExceptions.txt): \u0c5d>\u0c22 = LETTER RHA>LETTER DDHA +\ue05e>\u0c2b; # REMAP (indicExceptions.txt): \u0c5e>\u0c2b = LETTER FA>LETTER PHA +\ue05f>\u0c2f; # REMAP (indicExceptions.txt): \u0c5f>\u0c2f = LETTER YYA>LETTER YA +\ue060>\u0c60; # LETTER VOCALIC RR +\ue061>\u0c61; # LETTER VOCALIC LL +\ue062>\u0c3f; # REMAP (indicExceptions.txt): \u0c62>\u0c3f = VOWEL SIGN VOCALIC L>VOWEL SIGN I +\ue063>\u0c40; # REMAP (indicExceptions.txt): \u0c63>\u0c40 = VOWEL SIGN VOCALIC LL>VOWEL SIGN II +\ue064>'.' ; # FALLBACK FOR DANDA +\ue065>'.' ; # FALLBACK FOR DOUBLE DANDA +\ue066>\u0c66; # DIGIT ZERO +\ue067>\u0c67; # DIGIT ONE +\ue068>\u0c68; # DIGIT TWO +\ue069>\u0c69; # DIGIT THREE +\ue06a>\u0c6a; # DIGIT FOUR +\ue06b>\u0c6b; # DIGIT FIVE +\ue06c>\u0c6c; # DIGIT SIX +\ue06d>\u0c6d; # DIGIT SEVEN +\ue06e>\u0c6e; # DIGIT EIGHT +\ue06f>\u0c6f; # DIGIT NINE + +\ue070>; # ABBREVIATION SIGN +\ue071>\u0c30; # LETTER RA WITH MIDDLE DIAGONAL +\ue072>\u0c30; # LETTER RA WITH LOWER DIAGONAL +\ue073>; # RUPEE MARK +\ue074>; # RUPEE SIGN +\ue075>; # CURRENCY NUMERATOR ONE +\ue076>; # CURRENCY NUMERATOR TWO +\ue077>; # CURRENCY NUMERATOR THREE +\ue078>; # CURRENCY NUMERATOR FOUR +\ue079>; # CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR +\ue07A>; # CURRENCY DENOMINATOR SIXTEEN +\ue07B>; # ISSHAR +\uE07C>; # TIPPI +\uE07D>; # ADDAK +\uE07E>; # IRI +\uE07F>; # URA +\uE080>; # EK ONKAR +\uE081>\u0c35; # FALLBACK FOR ORIYA LETTER WA +0 > \u0c66; # FALLBACK FOR TAMIL +1 > \u0c67; + +# :: NFC (NFD) ; +# eof diff --git a/icuSources/data/translit/Kannada_InterIndic.txt b/icuSources/data/translit/Kannada_InterIndic.txt new file mode 100644 index 00000000..bc42c7ca --- /dev/null +++ b/icuSources/data/translit/Kannada_InterIndic.txt @@ -0,0 +1,92 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# Kannada-InterIndic +\u0CC6\u0CD5>\uE047; # VOWEL SIGN EE +\u0CC6\u0CCD\u0CD6>\uE048\ue04d; # VOWEL SIGN AI +\u0CC6\u0CD6>\uE048; # VOWEL SIGN AI +\u0CC6\u0CC2\u0CD5>\uE04B; # VOWEL SIGN OO +\u0CC6\u0CC2>\uE04A; # VOWEL SIGN O +\u0CBF\u0CD5>\uE040; # VOWEL SIGN II + +\u0C82>\uE002; # SIGN ANUSVARA +\u0C83>\uE003; # SIGN VISARGA +\u0C85>\uE005; # LETTER A +\u0C86>\uE006; # LETTER AA +\u0C87>\uE007; # LETTER I +\u0C88>\uE008; # LETTER II +\u0C89>\uE009; # LETTER U +\u0C8A>\uE00A; # LETTER UU +\u0C8B>\uE00B; # LETTER VOCALIC R +\u0C8C>\uE00C; # LETTER VOCALIC L +\u0C8E>\uE00E; # LETTER E +\u0C8F>\uE00F; # LETTER EE +\u0C90>\uE010; # LETTER AI +\u0C92>\uE012; # LETTER O +\u0C93>\uE013; # LETTER OO +\u0C94>\uE014; # LETTER AU +\u0C95>\uE015; # LETTER KA +\u0C96>\uE016; # LETTER KHA +\u0C97>\uE017; # LETTER GA +\u0C98>\uE018; # LETTER GHA +\u0C99>\uE019; # LETTER NGA +\u0C9A>\uE01A; # LETTER CA +\u0C9B>\uE01B; # LETTER CHA +\u0C9C>\uE01C; # LETTER JA +\u0C9D>\uE01D; # LETTER JHA +\u0C9E>\uE01E; # LETTER NYA +\u0C9F>\uE01F; # LETTER TTA +\u0CA0>\uE020; # LETTER TTHA +\u0CA1>\uE021; # LETTER DDA +\u0CA2>\uE022; # LETTER DDHA +\u0CA3>\uE023; # LETTER NNA +\u0CA4>\uE024; # LETTER TA +\u0CA5>\uE025; # LETTER THA +\u0CA6>\uE026; # LETTER DA +\u0CA7>\uE027; # LETTER DHA +\u0CA8>\uE028; # LETTER NA +\u0CAA>\uE02A; # LETTER PA +\u0CAB>\uE02B; # LETTER PHA +\u0CAC>\uE02C; # LETTER BA +\u0CAD>\uE02D; # LETTER BHA +\u0CAE>\uE02E; # LETTER MA +\u0CAF>\uE02F; # LETTER YA +\u0CB0>\uE030; # LETTER RA +\u0CB1>\uE031; # LETTER RRA +\u0CB2>\uE032; # LETTER LA +\u0CB3>\uE033; # LETTER LLA +\u0CB5>\uE035; # LETTER VA +\u0CB6>\uE036; # LETTER SHA +\u0CB7>\uE037; # LETTER SSA +\u0CB8>\uE038; # LETTER SA +\u0CB9>\uE039; # LETTER HA +\u0CBC>\uE03C; # SIGN NUKTA +\u0CBD>\uE03D; # AVAGRAHA +\u0CBE>\uE03E; # VOWEL SIGN AA +\u0CBF>\uE03F; # VOWEL SIGN I +\u0CC1>\uE041; # VOWEL SIGN U +\u0CC2>\uE042; # VOWEL SIGN UU +\u0CC3>\uE043; # VOWEL SIGN VOCALIC R +\u0CC4>\uE044; # VOWEL SIGN VOCALIC RR +\u0CC6>\uE046; # VOWEL SIGN E +\u0CCC>\uE04C; # VOWEL SIGN AU +\u0CCD>\uE04D; # SIGN VIRAMA +\u0CD5>\uE055; # LENGTH MARK +\u0CD6>\uE056; # AI LENGTH MARK +\u0CDE>\uE034; # LETTER LLLA +\u0CE0>\uE060; # LETTER VOCALIC RR +\u0CE1>\uE061; # LETTER VOCALIC LL +\u0CE6>\uE066; # DIGIT ZERO +\u0CE7>\uE067; # DIGIT ONE +\u0CE8>\uE068; # DIGIT TWO +\u0CE9>\uE069; # DIGIT THREE +\u0CEA>\uE06A; # DIGIT FOUR +\u0CEB>\uE06B; # DIGIT FIVE +\u0CEC>\uE06C; # DIGIT SIX +\u0CED>\uE06D; # DIGIT SEVEN +\u0CEE>\uE06E; # DIGIT EIGHT +\u0CEF>\uE06F; # DIGIT NINE + +# eof diff --git a/icuSources/data/translit/Latin_InterIndic.txt b/icuSources/data/translit/Latin_InterIndic.txt new file mode 100644 index 00000000..d8bfbdd9 --- /dev/null +++ b/icuSources/data/translit/Latin_InterIndic.txt @@ -0,0 +1,383 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# Latin-InterIndic + #:: NFD; + #\u0e00 reserved + #consonants + $chandrabindu=\ue001; + $anusvara=\ue002; + $visarga=\ue003; + #\u0e004 reserved + # w represents the stand-alone form + $wa=\ue005; + $waa=\ue006; + $wi=\ue007; + $wii=\ue008; + $wu=\ue009; + $wuu=\ue00a; + $wr=\ue00b; + $wl=\ue00c; + $wce=\ue00d; # LETTER CANDRA E + $wse=\ue00e; # LETTER SHORT E + $we=\ue00f; # \u090f LETTER E + $wai=\ue010; + $wco=\ue011; # LETTER CANDRA O + $wso=\ue012; # LETTER SHORT O + $wo=\ue013; # \u0913 LETTER O + $wau=\ue014; + $ka=\ue015; + $kha=\ue016; + $ga=\ue017; + $gha=\ue018; + $nga=\ue019; + $ca=\ue01a; + $cha=\ue01b; + $ja=\ue01c; + $jha=\ue01d; + $nya=\ue01e; + $tta=\ue01f; + $ttha=\ue020; + $dda=\ue021; + $ddha=\ue022; + $nna=\ue023; + $ta=\ue024; + $tha=\ue025; + $da=\ue026; + $dha=\ue027; + $na=\ue028; + $ena=\ue029; #compatibility + $pa=\ue02a; + $pha=\ue02b; + $ba=\ue02c; + $bha=\ue02d; + $ma=\ue02e; + $ya=\ue02f; + $ra=\ue030; + $rra=\ue031; + $la=\ue032; + $lla=\ue033; + $ela=\ue034; #compatibility + $va=\ue035; + $vva=\ue081; + $sha=\ue036; + $ssa=\ue037; + $sa=\ue038; + $ha=\ue039; +#\u093a Reserved +#\u093b Reserved + $nukta=\ue03c; + $avagraha=\ue03d; # SIGN AVAGRAHA + # represents the dependent form + $aa=\ue03e; + $i=\ue03f; + $ii=\ue040; + $u=\ue041; + $uu=\ue042; + $rh=\ue043; + $lh=\ue044; + $ce=\ue045; #VOWEL SIGN CANDRA E + $se=\ue046; #VOWEL SIGN SHORT E + $e=\ue047; + $ai=\ue048; + $co=\ue049; # VOWEL SIGN CANDRA O + $so=\ue04a; # VOWEL SIGN SHORT O + $o=\ue04b; # \u094b + $au=\ue04c; + $virama=\ue04d; +# \u094e Reserved +# \u094f Reserved + $om = \ue050; # OM +# \u0951>; # UNMAPPED STRESS SIGN UDATTA +# \u0952>; # UNMAPPED STRESS SIGN ANUDATTA +# \u0953>; # UNMAPPED GRAVE ACCENT +# \u0954>; # UNMAPPED ACUTE ACCENT + $lm = \ue055;# Telugu Length Mark + $ailm=\ue056;# AI Length Mark + $aulm=\ue057;# AU Length Mark + #urdu compatibity forms + $uka=\ue058; + $ukha=\ue059; + $ugha=\ue05a; + $ujha=\ue05b; + $uddha=\ue05c; + $udha=\ue05d; + $ufa=\ue05e; + $uya=\ue05f; + $wrr=\ue060; + $wll=\ue061; + $rrh=\ue062; + $llh=\ue063; + $danda=\ue064; + $doubleDanda=\ue065; + $zero=\ue066; # DIGIT ZERO + $one=\ue067; # DIGIT ONE + $two=\ue068; # DIGIT TWO + $three=\ue069; # DIGIT THREE + $four=\ue06a; # DIGIT FOUR + $five=\ue06b; # DIGIT FIVE + $six=\ue06c; # DIGIT SIX + $seven=\ue06d; # DIGIT SEVEN + $eight=\ue06e; # DIGIT EIGHT + $nine=\ue06f; # DIGIT NINE + # For all other scripts + $ecp0=\ue070; + $ecp1=\ue071; + $ecp2=\ue072; + $ecp3=\ue073; + $ecp4=\ue074; + $ecp5=\ue075; + $ecp6=\ue076; + $ecp7=\ue077; + $ecp8=\ue078; + $ecp9=\ue079; + $ecpA=\ue07a; + $ecpB=\ue07b; + $ecpC=\ue07c; + $ecpD=\ue07d; + $ecpE=\ue07e; + $ecpF=\ue07f; +# \u0970>; # UNMAPPED ABBREVIATION SIGN + $depVowelAbove=[\ue03e-\ue040\ue045-\ue04c]; + $depVowelBelow=[\ue041-\ue044]; + $endThing=[$danda$doubleDanda]; + # $x was originally called '&'; $z was '%' + $x=[$virama$aa$ai$au$ii$i$uu$u$rrh$rh$lh$e$o$se$ce$so$co]; + $z=[bcdfghjklmnpqrstvwxyz]; + $consonants=[[$ka-$ha]$z[\u0915-\u0939][\u0995-\u09b9][\u0a15-\u0a39][\u0a95-\u0ab9][\u0b15-\u0b39][\u0b95-\u0bb9][\u0c15-\u0c39][\u0c95-\u0cb9][\u0d15-\u0d39]]; + \u0315 > $avagraha; + \u0303>$chandrabindu$anusvara; + m\u0310>$chandrabindu; + h\u0323>$visarga; + x>$ka$virama$sa; +# convert to independent forms at start of word or syllable: +# dependent forms for roundtrip + \u0314a\u0304>$aa; + \u0314ai>$ai; + \u0314au>$au; + \u0314ii>$ii; + \u0314i\u0304>$ii; + \u0314i>$i; + \u0314u\u0304>$uu; + \u0314u>$u; + \u0314r\u0325\u0304>$rrh; + \u0314r\u0325>$rh; + \u0314l\u0325\u0304>$llh; + \u0314lh>$lh; + \u0314l\u0325>$lh; + \u0314e\u0304>$e; + \u0314o\u0304>$o; + \u0314a>; + \u0314e\u0306>$ce; + \u0314o\u0306>$co; + \u0314e>$se; + \u0314o>$so; + +# preceeded by consonants + $consonants{ a\u0304>$aa; + $consonants{ ai>$ai; + $consonants{ au>$au; + $consonants{ ii>$ii; + $consonants{ i\u0304>$ii; + $consonants{ i>$i; + $consonants{ u\u0304>$uu; + $consonants{ u>$u; + $consonants{ r\u0325\u0304>$rrh; + $consonants{ r\u0325a>$rh; + $consonants{ r\u0325>$rh; + $consonants{ l\u0325\u0304>$llh; + $consonants{ lh>$lh; + $consonants{ l\u0325>$lh; + $consonants{ e\u0304>$e; + $consonants{ o\u0304>$o; + $consonants{ e\u0306>$ce; + $consonants{ o\u0306>$co; + $consonants{ e>$se; + $consonants{ o>$so; + +# e.g. keai -> {ka}{e}{wai}; k'ai -> {ka}{wai}; (ai) -> ({wai}) + a\u0304>$waa; + ai>$wai; + au>$wau; + i\u0304>$wii; + i>$wi; + u\u0304>$wuu; + u>$wu; + r\u0325\u0304>$wrr; + r\u0325>$wr; + l\u0325\u0304>$wll; + lh>$wl; + l\u0325>$wl; + e\u0304>$we; + o\u0304>$wo; + a>$wa; + e\u0306>$wce; + o\u0306>$wco; + e>$wse; + ''om>$om; + o>$wso; + + # rules for anusvara + n}r\u0325 > $na|$virama; + n}l\u0325 > $na|$virama; + n}na > $na|$virama; + n\u0307}[kg] > $anusvara; + n\u0307}n\u0307 > $anusvara; + n\u0304}[cj] > $anusvara; + n\u0304}n\u0303 > $anusvara; + n\u0323}[tdn]\u0323 > $anusvara; + n}[tdn] > $anusvara; + m}[pbm] > $anusvara; + n}[ylvshr] > $anusvara; + m\u0307 > $anusvara; + + #urdu compatibility + q>$uka|$virama; + k\u0331h\u0331>$ukha |$virama; + g\u0307> $ugha | $virama; + z > $ujha |$virama; + f > $ufa|$virama; + + # dev + y\u0307>$uya|$virama; + l\u0331>$ela|$virama; + n\u0331>$ena|$virama; + n\u0307>$nga|$virama; + n\u0303>$nya|$virama; + n\u0323>$nna|$virama; + t\u0323h>$ttha|$virama; + t\u0323>$tta|$virama; + r\u0323h>$udha|$virama; + r\u0323>$uddha|$virama; + d\u0323h>$ddha|$virama; + d\u0323>$dda|$virama; + kh>$kha|$virama; + k>$ka|$virama; + gh>$gha|$virama; + g>$ga|$virama; + ch>$cha|$virama; + c>$ca|$virama; + jh>$jha|$virama; + j>$ja|$virama; + ny>$nya|$virama; + tth>$ttha|$virama; + ddh>$ddha|$virama; + th>$tha|$virama; + t>$ta|$virama; + dh>$dha|$virama; + d>$da|$virama; + n>$na|$virama; + ph>$pha|$virama; + p>$pa|$virama; + bh>$bha|$virama; + b>$ba|$virama; + m>$ma|$virama; + y>$ya|$virama; + r\u0331>$rra|$virama; + r>$ra|$virama; + l\u0323>$lla|$virama; + l>$la|$virama; + v>$va|$virama; + w\u0307>$vva|$virama; + w>$va|$virama; + sh>$sha|$virama; + ss>$ssa|$virama; + s\u0323>$ssa|$virama; + s\u0301>$sha|$virama; + s>$sa|$virama; + h>$ha|$virama; + '.'>$danda; + $danda'.'>$doubleDanda; + $depVowelAbove{'~'>$anusvara; + $depVowelBelow{'~'>$chandrabindu; +# convert to dependent forms after consonant with no vowel: +# e.g. kai -> {ka}{virama}ai -> {ka}{ai} + #$virama aa>$aa; + $virama a\u0304>$aa; + $virama ai>$ai; + $virama au>$au; + $virama ii>$ii; + $virama i\u0304>$ii; + $virama i>$i; + #$virama uu>$uu; + $virama u\u0304>$uu; + $virama u>$u; + #$virama rrh>$rrh; + $virama r\u0325\u0304>$rrh; + #$virama rh>$rh; + $virama r\u0325a>$rh; + $virama r\u0325>$rh; + $virama l\u0325\u0304>$llh; + $virama lh>$lh; + $virama l\u0325>$lh; + $virama e\u0304>$e; + $virama o\u0304>$o; + $virama a>; + $virama e\u0306>$ce; + $virama o\u0306>$co; + $virama e>$se; + $virama o>$so; + + +# otherwise convert independent forms when separated by ': k'ai -> {ka}{virama}{wai} + #$virama''aa>$waa; + $virama''a\u0304>$waa; + $virama''ai>$wai; + $virama''au>$wau; + #$virama''ii>$wii; + $virama''i\u0304>$wii; + $virama''i>$wi; + #$virama''uu>$wuu; + $virama''u\u0304>$wuu; + $virama''u>$wu; + #$virama''rrh>$wrr; + $virama''r\u0325\u0304>$wrr; + #$virama''rh>$wr; + $virama''r\u0325>$wr; + $virama''l\u0325\u0304>$wll; + #$virama''lh>$wl; + $virama''l\u0325>$wl; + $virama''e\u0304>$we; + $virama''o\u0304>$wo; + $virama''a>$wa; + $virama''e\u0306>$wce; + $virama''o\u0306>$wco; + $virama''e>$wse; + $virama''o>$wso; +# no virama + ''a\u0304>$waa; + ''ai>$wai; + ''au>$wau; + ''i\u0304>$wii; + ''i>$wi; + ''u\u0304>$wuu; + ''u>$wu; + ''r\u0325\u0304>$wrr; + ''r\u0325>$wr; + ''l\u0325\u0304>$wll; + ''l\u0325>$wl; + ''e\u0304>$we; + ''o\u0304>$wo; + ''a>$wa; + ''e\u0306>$wce; + ''o\u0306>$wco; + ''e>$wse; + ''o>$wso; + + $virama } [$z] > $virama; + $virama } ' ' > $virama ; + $virama}$endThing>; + 0>$zero; + 1>$one; + 2>$two; + 3>$three; + 4>$four; + 5>$five; + 6>$six; + 7>$seven; + 8>$eight; + 9>$nine; + ''>; + #:: NFC (NFD) ; diff --git a/icuSources/data/translit/Latin_Jamo.txt b/icuSources/data/translit/Latin_Jamo.txt new file mode 100644 index 00000000..9d6591d7 --- /dev/null +++ b/icuSources/data/translit/Latin_Jamo.txt @@ -0,0 +1,522 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +#- N.B. DO NOT put any filters, NFD, etc. here -- those are aliased in +#- the INDEX file. This transliterator is, by itself, not +#- instantiated. It is used as a part of Latin-Jamo, Latin-Hangul, or +#- inverses thereof. + +# Transliteration from Latin characters to Korean script is done in +# two steps: Latin to Jamo, then Jamo to Hangul. The Jamo-Hangul +# transliteration is done algorithmically following Unicode 3.0 +# section 3.11. This file implements the Latin to Jamo +# transliteration using rules. + +# Jamo occupy the block 1100-11FF. Within this block there are three +# groups of characters: initial consonants or choseong (I), medial +# vowels or jungseong (M), and trailing consonants or jongseong (F). +# Standard Korean syllables are of the form I+M+F*. + +# Section 3.11 describes the use of 'filler' jamo to convert +# nonstandard syllables to standard form: the choseong filler 115F and +# the junseong filler 1160. In this transliterator, we will not use +# 115F or 1160. + +# We will, however, insert two 'null' jamo to make foreign words +# conform to Korean syllable structure. These are the null initial +# consonant 110B (IEUNG) and the null vowel 1173 (EU). In Latin text, +# we will use the separator in order to disambiguate strings, +# e.g. "kan-ggan" (initial GG) vs. "kanggan" (final NG + initial G). + +# We will not use all of the characters in the jamo block. We will +# only use the 19 initials, 21 medials, and 27 finals possessing a +# jamo short name as defined in section 4.4 of the Unicode book. + +# Rules of thumb. These guidelines provide the basic framework +# for the rules. They are phrased in terms of Latin-Jamo transliteration. +# The Jamo-Latin rules derive from these, since the Jamo-Latin rules are +# just context-free transliteration of jamo to corresponding short names, +# with the addition of separators to maintain round-trip integrity +# in the context of the Latin-Jamo rules. + +# A sequence of vowels: +# - Take the longest sequence you can. If there are too many, or you don't +# have a starting consonant, introduce a 110B necessary. + +# A sequence of consonants. +# - First join the double consonants: G + G -> GG +# - In the remaining list, +# -- If there is no preceding vowel, take the first consonant, and insert EU +# after it. Continue with the rest of the consonants. +# -- If there is one consonant, attach to the following vowel +# -- If there are two consonants and a following vowel, attach one to the +# preceeding vowel, and one to the following vowel. +# -- If there are more than two consonants, join the first two together if you +# can: L + G => LG +# -- If you still end up with more than 2 consonants, insert EU after the +# first one, and continue with the rest of the consonants. + +#---------------------------------------------------------------------- +# Variables + +# Some latin consonants or consonant pairs only occur as initials, and +# some only as finals, but some occur as both. This makes some jamo +# consonants ambiguous when transliterated into latin. +# Initial only: IEUNG BB DD JJ R +# Final only: BS GS L LB LG LH LM LP LS LT NG NH NJ +# Initial and Final: B C D G GG H J K M N P S SS T + + $Gi = \u1100; + $GGi = \u1101; + $Ni = \u1102; + $Di = \u1103; + $DD = \u1104; + $R = \u1105; + $Mi = \u1106; + $Bi = \u1107; + $BB = \u1108; + $Si = \u1109; + $SSi = \u110A; + $IEUNG = \u110B; # null initial, inserted during Latin-Jamo + $Ji = \u110C; + $JJ = \u110D; + $Ci = \u110E; + $Ki = \u110F; + $Ti = \u1110; + $Pi = \u1111; + $Hi = \u1112; + + $A = \u1161; + $AE = \u1162; + $YA = \u1163; + $YAE = \u1164; + $EO = \u1165; + $E = \u1166; + $YEO = \u1167; + $YE = \u1168; + $O = \u1169; + $WA = \u116A; + $WAE = \u116B; + $OE = \u116C; + $YO = \u116D; + $U = \u116E; + $WEO = \u116F; + $WE = \u1170; + $WI = \u1171; + $YU = \u1172; + $EU = \u1173; # null medial, inserted during Latin-Jamo + $YI = \u1174; + $I = \u1175; + + $Gf = \u11A8; + $GGf = \u11A9; + $GS = \u11AA; + $Nf = \u11AB; + $NJ = \u11AC; + $NH = \u11AD; + $Df = \u11AE; + $L = \u11AF; + $LG = \u11B0; + $LM = \u11B1; + $LB = \u11B2; + $LS = \u11B3; + $LT = \u11B4; + $LP = \u11B5; + $LH = \u11B6; + $Mf = \u11B7; + $Bf = \u11B8; + $BS = \u11B9; + $Sf = \u11BA; + $SSf = \u11BB; + $NG = \u11BC; + $Jf = \u11BD; + $Cf = \u11BE; + $Kf = \u11BF; + $Tf = \u11C0; + $Pf = \u11C1; + $Hf = \u11C2; + + $jamoInitial = [\u1100-\u1112]; + + $jamoMedial = [\u1161-\u1175]; + + $latinInitial = [bcdghjkmnprst]; + + # Any character in the latin transliteration of a medial + $latinMedial = [aeiouwy]; + + # The last character of the latin transliteration of a medial + $latinMedialEnd = [aeiou]; + + # Disambiguation separator + $sep = \'; + +#---------------------------------------------------------------------- +# Jamo-Latin + +# Jamo to latin is relatively simple, since it is the latin that is +# ambiguous. Most rules are straightforward, and we encode them below +# as simple add-on back rule, e.g.: + +# $jamoMedial {bs} > $BS; + +# becomes + +# $jamoMedial {bs} <> $BS; + +# Furthermore, we don't care about the ordering for Jamo-Latin because +# we are going from single characters, so we can very easily piggyback +# on the Latin-Jamo. + +# The main issue with Jamo-Latin is when to insert separators. +# Separators are inserted to obtain correct round trip behavior. For +# example, the sequence Ki A Gf Gi E, if transliterated to "kagge", +# would then round trip to Ki A GGi E. To prevent this, we insert a +# separator: "kag-ge". IMPORTANT: The need for separators depends +# very specifically on the behavior of the Latin-Jamo rules. A change +# in the Latin-Jamo behavior can completely change the way the +# separator insertion must be done. + +# First try to preserve actual separators in the jamo text by doubling +# them. This fixes problems like: +# (Di)(A)(Ji)(U)(NG)-(IEUNG)(YEO)(Nf)(Gi)(YEO)(L) => dajung-yeongyeol +# => (Di)(A)(Ji)(U)(NG)(IEUNG)(YEO)(Nf)(Gi)(YEO)(L). This is optional +# -- if we don't care about losing separators in the jamo, we can delete +# this rule. + + $sep $sep <> $sep; + +# Triple consonants. For three consonants "axxx" we insert a +# separator between the first and second "x" if XXf, Xf, and Xi all +# exist, and we have A Xf XXi. This prevents the reverse +# transliteration to A XXf Xi. + + $sep < $latinMedialEnd g {} $GGi; + $sep < $latinMedialEnd s {} $SSi; + +# For vowels the rule is similar. If there is a vowel "ae" such that +# "a" by itself and "e" by itself are vowels, then we want to map A E +# to "a-e" so as not to round trip to AE. However, in the text Ki EO +# IEUNG E we don't need to map to "keo-e". "keoe" suffices. For +# vowels of the form "aei", both "ae" + "i" and "a" + "ei" must be +# tested. NOTE: These rules used to have a left context of +# $latinInitial instead of [^$latinMedial]. The problem with this is +# sequences where an initial IEUNG is transliterated away: +# (IEUNG)(A)(IEUNG)(EO) => aeo => (IEUNG)(AE)(IEUNG)(O) + + $sep < [^$latinMedial] [y w] e {} [$O $OE]; + $sep < [^$latinMedial] e {} [$O $OE $U]; + $sep < [^$latinMedial] [o a] {} [$E $EO $EU]; + $sep < [^$latinMedial] [w y] a {} [$E $EO $EU]; + +# Similar to the above, but with an intervening $IEUNG. + + $sep < [^$latinMedial] [y w] e {} $IEUNG [$O $OE]; + $sep < [^$latinMedial] e {} $IEUNG [$O $OE $U]; + $sep < [^$latinMedial] [o a] {} $IEUNG [$E $EO $EU]; + $sep < [^$latinMedial] [w y] a {} $IEUNG [$E $EO $EU]; + +# Single finals followed by IEUNG. The jamo sequence A Xf IEUNG E, +# where Xi also exists, must be transliterated as "ax-e" to prevent +# the round trip conversion to A Xi E. + + $sep < $latinMedialEnd b {} $IEUNG $jamoMedial; + $sep < $latinMedialEnd c {} $IEUNG $jamoMedial; + $sep < $latinMedialEnd d {} $IEUNG $jamoMedial; + $sep < $latinMedialEnd g {} $IEUNG $jamoMedial; + $sep < $latinMedialEnd h {} $IEUNG $jamoMedial; + $sep < $latinMedialEnd j {} $IEUNG $jamoMedial; + $sep < $latinMedialEnd k {} $IEUNG $jamoMedial; + $sep < $latinMedialEnd m {} $IEUNG $jamoMedial; + $sep < $latinMedialEnd n {} $IEUNG $jamoMedial; + $sep < $latinMedialEnd p {} $IEUNG $jamoMedial; + $sep < $latinMedialEnd s {} $IEUNG $jamoMedial; + $sep < $latinMedialEnd t {} $IEUNG $jamoMedial; + +# Double finals followed by IEUNG. Similar to the single finals +# followed by IEUNG. Any latin consonant pair X Y, between medials, +# that we would split by Latin-Jamo, we must handle when it occurs as +# part of A XYf IEUNG E, to prevent round trip conversion to A Xf Yi +# E. + + $sep < $latinMedialEnd b s {} $IEUNG $jamoMedial; + $sep < $latinMedialEnd g g {} $IEUNG $jamoMedial; + $sep < $latinMedialEnd g s {} $IEUNG $jamoMedial; + $sep < $latinMedialEnd l b {} $IEUNG $jamoMedial; + $sep < $latinMedialEnd l g {} $IEUNG $jamoMedial; + $sep < $latinMedialEnd l h {} $IEUNG $jamoMedial; + $sep < $latinMedialEnd l m {} $IEUNG $jamoMedial; + $sep < $latinMedialEnd l p {} $IEUNG $jamoMedial; + $sep < $latinMedialEnd l s {} $IEUNG $jamoMedial; + $sep < $latinMedialEnd l t {} $IEUNG $jamoMedial; + $sep < $latinMedialEnd n g {} $IEUNG $jamoMedial; + $sep < $latinMedialEnd n h {} $IEUNG $jamoMedial; + $sep < $latinMedialEnd n j {} $IEUNG $jamoMedial; + $sep < $latinMedialEnd s s {} $IEUNG $jamoMedial; + +# Split doubles. Text of the form A Xi Xf E, where XXi also occurs, +# we transliterate as "ax-xe" to prevent round trip transliteration as +# A XXi E. + + $sep < $latinMedialEnd b {} $Bi $jamoMedial; + $sep < $latinMedialEnd d {} $Di $jamoMedial; + $sep < $latinMedialEnd j {} $Ji $jamoMedial; + $sep < $latinMedialEnd g {} $Gi $jamoMedial; + $sep < $latinMedialEnd s {} $Si $jamoMedial; + +# XYY. This corresponds to the XYY rule in Latin-Jamo. By default +# Latin-Jamo maps "xyy" to Xf YYi, to keep YY together. As a result, +# "xyy" forms that correspond to XYf Yi must be transliterated as +# "xy-y". + + $sep < $latinMedialEnd b s {} [$Si $SSi]; + $sep < $latinMedialEnd g s {} [$Si $SSi]; + $sep < $latinMedialEnd l b {} [$Bi $BB]; + $sep < $latinMedialEnd l g {} [$Gi $GGi]; + $sep < $latinMedialEnd l s {} [$Si $SSi]; + $sep < $latinMedialEnd n g {} [$Gi $GGi]; + $sep < $latinMedialEnd n j {} [$Ji $JJ]; + +# Deletion of IEUNG is handled below. + +#---------------------------------------------------------------------- +# Latin-Jamo + +# [Basic, context-free Jamo-Latin rules are embedded here too. See +# above.] + +# Split digraphs: Text of the form 'axye', where 'xy' is a final +# digraph, 'x' is a final (by itself), 'y' is an initial, and 'a' and +# 'e' are medials, we want to transliterate this as A Xf Yi E rather +# than A XYf IEUNG E. We do NOT include text of the form "axxe", +# since that is handled differently below. These rules are generated +# programmatically from the jamo data. + + $jamoMedial {b s} $latinMedial > $Bf $Si; + $jamoMedial {g s} $latinMedial > $Gf $Si; + $jamoMedial {l b} $latinMedial > $L $Bi; + $jamoMedial {l g} $latinMedial > $L $Gi; + $jamoMedial {l h} $latinMedial > $L $Hi; + $jamoMedial {l m} $latinMedial > $L $Mi; + $jamoMedial {l p} $latinMedial > $L $Pi; + $jamoMedial {l s} $latinMedial > $L $Si; + $jamoMedial {l t} $latinMedial > $L $Ti; + $jamoMedial {n g} $latinMedial > $Nf $Gi; + $jamoMedial {n h} $latinMedial > $Nf $Hi; + $jamoMedial {n j} $latinMedial > $Nf $Ji; + +# Single consonants are initials: Text of the form 'axe', where 'x' +# can be an initial or a final, and 'a' and 'e' are medials, we want +# to transliterate as A Xi E rather than A Xf IEUNG E. + + $jamoMedial {b} $latinMedial > $Bi; + $jamoMedial {c} $latinMedial > $Ci; + $jamoMedial {d} $latinMedial > $Di; + $jamoMedial {g} $latinMedial > $Gi; + $jamoMedial {h} $latinMedial > $Hi; + $jamoMedial {j} $latinMedial > $Ji; + $jamoMedial {k} $latinMedial > $Ki; + $jamoMedial {m} $latinMedial > $Mi; + $jamoMedial {n} $latinMedial > $Ni; + $jamoMedial {p} $latinMedial > $Pi; + $jamoMedial {s} $latinMedial > $Si; + $jamoMedial {t} $latinMedial > $Ti; + +# Doubled initials. The sequence "axxe", where XX exists as an initial +# (XXi), and also Xi and Xf exist (true of all digraphs XX), we want +# to transliterate as A XXi E, rather than split to A Xf Xi E. + + $jamoMedial {b b} $latinMedial > $BB; + $jamoMedial {d d} $latinMedial > $DD; + $jamoMedial {j j} $latinMedial > $JJ; + $jamoMedial {g g} $latinMedial > $GGi; + $jamoMedial {s s} $latinMedial > $SSi; + +# XYY. Because doubled consonants bind more strongly than XY +# consonants, we must handle the sequence "axyy" specially. Here XYf +# and YYi must exist. In these cases, we map to Xf YYi rather than +# XYf. + + $jamoMedial {b} s s > $Bf; + $jamoMedial {g} s s > $Gf; + $jamoMedial {l} b b > $L; + $jamoMedial {l} g g > $L; + $jamoMedial {l} s s > $L; + $jamoMedial {n} g g > $Nf; + $jamoMedial {n} j j > $Nf; + +# Finals: Attach consonant with preceding medial to preceding medial. +# Do this BEFORE mapping consonants to initials. Longer keys must +# precede shorter keys that they start with, e.g., the rule for 'bs' +# must precede 'b'. + +# [BASIC Jamo-Latin FINALS handled here. Order irrelevant within this +# block for Jamo-Latin.] + + $jamoMedial {bs} <> $BS; + $jamoMedial {b} <> $Bf; + $jamoMedial {c} <> $Cf; + $jamoMedial {d} <> $Df; + $jamoMedial {gg} <> $GGf; + $jamoMedial {gs} <> $GS; + $jamoMedial {g} <> $Gf; + $jamoMedial {h} <> $Hf; + $jamoMedial {j} <> $Jf; + $jamoMedial {k} <> $Kf; + $jamoMedial {lb} <> $LB; $jamoMedial {lg} <> $LG; + $jamoMedial {lh} <> $LH; + $jamoMedial {lm} <> $LM; + $jamoMedial {lp} <> $LP; + $jamoMedial {ls} <> $LS; + $jamoMedial {lt} <> $LT; + $jamoMedial {l} <> $L; + $jamoMedial {m} <> $Mf; + $jamoMedial {ng} <> $NG; + $jamoMedial {nh} <> $NH; + $jamoMedial {nj} <> $NJ; + $jamoMedial {n} <> $Nf; + $jamoMedial {p} <> $Pf; + $jamoMedial {ss} <> $SSf; + $jamoMedial {s} <> $Sf; + $jamoMedial {t} <> $Tf; + +# Initials: Attach single consonant to following medial. Do this +# AFTER mapping finals. Longer keys must precede shorter keys that +# they start with, e.g., the rule for 'gg' must precede 'g'. + +# [BASIC Jamo-Latin INITIALS handled here. Order irrelevant within +# this block for Jamo-Latin.] + + {gg} $latinMedial <> $GGi; + {g} $latinMedial <> $Gi; + {n} $latinMedial <> $Ni; + {dd} $latinMedial <> $DD; + {d} $latinMedial <> $Di; + {r} $latinMedial <> $R; + {m} $latinMedial <> $Mi; + {bb} $latinMedial <> $BB; + {b} $latinMedial <> $Bi; + {ss} $latinMedial <> $SSi; + {s} $latinMedial <> $Si; + {jj} $latinMedial <> $JJ; + {j} $latinMedial <> $Ji; + {c} $latinMedial <> $Ci; + {k} $latinMedial <> $Ki; + {t} $latinMedial <> $Ti; + {p} $latinMedial <> $Pi; + {h} $latinMedial <> $Hi; + +# 'r' in final position. Because of the equivalency of the 'l' and +# 'r' jamo (the glyphs are the same), we try to provide the same +# equivalency in Latin-Jamo. The 'l' to 'r' conversion is handled +# below. If we see an 'r' in an apparent final position, treat it +# like 'l'. For example, "karka" => Ki A R EU Ki A without this rule. +# Instead, we want Ki A L Ki A. + + $jamoMedial {r} $latinInitial > | l; + +# Initial + Final: If we match the next rule, we have initial then +# final consonant with no intervening medial. We insert the null +# vowel BEFORE it to create a well-formed syllable. (In the next rule +# we insert a null vowel AFTER an anomalous initial.) + + $jamoInitial {} [bcdghjklmnpst] > $EU; + +# Initial + X: This block matches an initial consonant not followed by +# a medial. We insert the null vowel after it. We handle double +# initials explicitly here; for single initial consonants we insert EU +# (as Latin) after them and let standard rules do the rest. + +# BREAKS ROUND TRIP INTEGRITY + + gg > $GGi $EU; + dd > $DD $EU; + bb > $BB $EU; + ss > $SSi $EU; + jj > $JJ $EU; + + ([bcdghjkmnprst]) > | $1 eu; + +# X + Final: Finally we have to deal with a consonant that can only be +# interpreted as a final (not an initial) and which is preceded +# neither by an initial nor a medial. It is the start of the +# syllable, but cannot be. Most of these will already be handled by +# the above rules. 'bs' splits into Bi EU Sf. Similar for 'gs' 'ng' +# 'nh' 'nj'. The only problem is 'l' and digraphs starting with 'l'. +# For this isolated case, we could add a null initial and medial, +# which would give "la" => IEUNG EU L IEUNG A, for example. A more +# economical solution is to transliterate isolated "l" (that is, +# initial "l") to "r". (Other similar conversions of consonants that +# occur neither as initials nor as finals are handled below.) + + l > | r; + +# Medials. If a medial is preceded by an initial, then we proceed +# normally. As usual, longer keys must precede shorter ones. + +# [BASIC Jamo-Latin MEDIALS handled here. Order irrelevant within +# this block for Jamo-Latin.] + + $jamoInitial {ae} <> $AE; + $jamoInitial {a} <> $A; + $jamoInitial {eo} <> $EO; + $jamoInitial {eu} <> $EU; + $jamoInitial {e} <> $E; + $jamoInitial {i} <> $I; + $jamoInitial {oe} <> $OE; + $jamoInitial {o} <> $O; + $jamoInitial {u} <> $U; + $jamoInitial {wae} <> $WAE; + $jamoInitial {wa} <> $WA; + $jamoInitial {weo} <> $WEO; + $jamoInitial {we} <> $WE; + $jamoInitial {wi} <> $WI; + $jamoInitial {yae} <> $YAE; + $jamoInitial {ya} <> $YA; + $jamoInitial {yeo} <> $YEO; + $jamoInitial {ye} <> $YE; + $jamoInitial {yi} <> $YI; + $jamoInitial {yo} <> $YO; + $jamoInitial {yu} <> $YU; + +# We may see an anomalous isolated 'w' or 'y'. In that case, we +# interpret it as 'wi' and 'yu', respectively. + +# BREAKS ROUND TRIP INTEGRITY + + $jamoInitial {w} > | wi; + $jamoInitial {y} > | yu; + +# Otherwise, insert a null consonant IEUNG before the medial (which is +# still an untransliterated latin vowel). + + ($latinMedial) > $IEUNG | $1; + +# Convert non-jamo latin consonants to equivalents. These occur as +# neither initials nor finals in jamo. 'l' occurs as a final, but not +# an initial; it is handled above. The following letters (left hand +# side) will never be output by Jamo-Latin. + + f > | p; + q > | k; + v > | b; + x > | ks; + z > | s; + +# Delete separators (Latin-Jamo). + + $sep > ; + +# Delete null consonants (Jamo-Latin). Do NOT delete null EU vowels, +# since these may also occur in text. + + < $IEUNG; + +#- N.B. DO NOT put any filters, NFD, etc. here -- those are aliased in +#- the INDEX file. This transliterator is, by itself, not +#- instantiated. It is used as a part of Latin-Jamo, Latin-Hangul, or +#- inverses thereof. + +# eof diff --git a/icuSources/data/translit/Latin_Katakana.txt b/icuSources/data/translit/Latin_Katakana.txt new file mode 100644 index 00000000..5b7fc176 --- /dev/null +++ b/icuSources/data/translit/Latin_Katakana.txt @@ -0,0 +1,495 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# note: a global filter is more efficient, but MUST include all source chars +#:: [\u0000-\u007E \u3001\u3002 \u3099-\u309C \u30A1-\u30FC \uFF61-\uFF9F [:Latin:][:Katakana:] [:nonspacing mark:]] ; +# MINIMAL FILTER GENERATED FOR: Latin-Katakana +### WARNING -- must add width filter, both here and below!!! ### +:: [[\u1100-\u1112\u111A\u1121\u1160-\u1175\u11AA\u11AC-\u11AD\u11B0-\u11B5\u2190-\u2193\u2502\u25A0\u25CB\u3000-\u3002\u300C-\u300D\u3099-\u309A\u30A1-\u30ED\u30EF\u30F2-\u30F4\u30F7\u30FA-\u30FC\uFF01-\uFF5E\uFFE0-\uFFE6][',.A-Za-z~\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E3\u01E6-\u01ED\u01F0\u01F4-\u01F5\u01F8-\u021B\u021E-\u021F\u0226-\u0233\u0304\u04E2-\u04E3\u04EE-\u04EF\u1E00-\u1E99\u1EA0-\u1EF9\u1FB1\u1FB9\u1FD1\u1FD9\u1FE1\u1FE9\u212A-\u212B]] ; + +:: [:Latin:] fullwidth-halfwidth (); +:: NFD (NFC); +:: Lower (); # whenever transliterating from cased to uncased script, include this +# :: NFD () ; # this would catch the odd cases where a lowercase is not in NFD, but none are important for Japanese + +# Uses modified Hepburn. Small changes to make unambiguous. + +# | Kunrei-shiki: Hepburn/MHepburn +# | ------------------------------ +# | si: shi +# | si ~ya: sha +# | si ~yu: shu +# | si ~yo: sho +# | zi: ji +# | zi ~ya: ja +# | zi ~yu: ju +# | zi ~yo: jo +# | ti: chi +# | ti ~ya: cha +# | ti ~yu: chu +# | ti ~yu: cho +# | tu: tsu +# | di: ji/dji +# | du: zu/dzu +# | hu: fu + +# | For foreign words: +# | ----------------- +# | se ~i si +# | si ~e she +# | +# | ze ~i zi +# | zi ~e je +# | +# | te ~i ti +# | ti ~e che +# | te ~u tu +# | +# | de ~i di +# | de ~u du +# | de ~i di +# | +# | he ~u: hu +# | hu ~a fa +# | hu ~i fi +# | hu ~e he +# | hu ~o ho + +# Most small forms are generated, but if necessary +# explicit small forms are given with ~a, ~ya, etc. + +#------------------------------------------------------ +# Variables + +$vowel = [aeiou] ; +$consonant = [bcdfghjklmnpqrstvwxyz] ; +$macron = \u0304 ; + +# Variables used for doubled-consonants with tsu + +$kana = [\u3041-\u3094] ; + +$voice = [\u3099\u309B]; +$semivoice = [\u309A\u309C]; + +$k_start = [カキクケコかきくけこ] ; + +$s_start = [サシスセソさしすせそ] ; + +$j_start = [シし] $voice ; + +$t_start = [タチツテトたちつてと] ; + +$n_start = [ナニヌネノンなにぬねの] ; + +$h_start = [ハヒヘホはひへほ] ; +$f_start = [フふ] ; + +$m_start = [マミムメモまみむめも] ; + +$y_start = [ヤユヨやゆよ] ; + +$r_start = [ラリルレロらりるれろ] ; + +$w_start = [ワヰヱヲわゐゑを] ; + +$v_start = [ワヰヱヲ]゙ ; + +# if ン is followed by $n_quoter, then it needs an +# apostrophe after its romaji form to disambiguate it. +# e.g., ン ア ! = ナ, so represent as "n'a", not "na". + +$n_quoter = [ア イ ウ エ オ ナ ニ ヌ ネ ノ ヤ ユ ヨ ン] ; + +$small_y = [ャィュェョ] ; + +$iteration = \u309D ; + +#------------------------------------------------------ +# katakana rules + +# Punctuation + +'.' <> 。; +',' <> 、; +# ' ' } [a-z] > ; # delete spaces before latin +# ' ' < [^' '\u30A0-\u30ff] {} ['\u30A0-\u30ff] ; #insert spaces before hiragana + +# Iteration Mark +# Copy previous letter & marks + +# TODO +# | $1 $1 < ($kana [[:M:]$voice$semivoice]?) $iteration + +# Specials for katakana -- not shared with hiragana + +va <> ヷ ; +vi <> ヸ ; +ve <> ヹ ; +vo <> ヺ ; +'~ka' <> ヵ ; +'~ke' <> ヶ ; + +# ~~~ begin shared rules ~~~ + +#special + +ya < '~'ャ; +yi < '~'ィ ; +yu < '~'ュ; +ye < '~'ェ; +yo < '~'ョ; + +#normal + +a <> ア ; + +b | '~' < ヒ ゙} $small_y ; +by } $vowel > ビ | '~y' ; + +ba <> バ ; +bi <> ビ ; +bu <> ブ ; +be <> ベ ; +bo <> ボ ; + +c } i > | s ; +c } e > | s ; + +da <> ダ ; +di <> ディ ; +du <> デゥ ; +de <> デ ; +do <> ド ; +dzu <> ヅ ; +dja < ヂャ ; +dji'~i' < ヂィ ; # liu +dju < ヂュ ; +dje < ヂェ ; +djo < ヂョ ; +dji <> ヂ ; +dj } $vowel > ヂ | '~y' ; + +# TODO: QUESTION: use ĵĴżŻ instead of dj, dz + +cha < チャ ; +chi'~i' < チィ ; # liu +chu < チュ ; +che < チェ ; +cho < チョ ; +chi <> チ ; +ch } $vowel > チ | '~y' ; + +e <> エ ; + +g | '~' < ギ} $small_y ; +gy } $vowel > ギ | '~y' ; + +ga <> ガ ; +gi <> ギ ; +gu <> グ ; +ge <> ゲ ; +go <> ゴ ; + +i <> イ ; + +# j } $vowel > ジ | '~y' ; + +ja <> ジャ ; +ji'~i' < ジィ ; # liu +ju <> ジュ ; +je <> ジェ ; +jo <> ジョ ; +ji <> ジ ; + +k | '~' < キ} $small_y ; +ky } $vowel > キ | '~y' ; + +ka <> カ ; +ki <> キ ; +ku <> ク ; +ke <> ケ ; +ko <> コ ; + +m | '~' < ミ} $small_y ; +my } $vowel > ミ | '~y' ; + +ma <> マ ; +mi <> ミ ; +mu <> ム ; +me <> メ ; +mo <> モ ; + +m } [pbfv] > ン ; + +n | '~' < ニ } $small_y ; +ny } $vowel > ニ | '~y' ; + +na <> ナ ; +ni <> ニ ; +nu <> ヌ ; +ne <> ネ ; +no <> ノ ; + +o <> オ ; + +p | '~' < ピ } $small_y ; +py } $vowel > ピ | '~y' ; + +pa <> パ ; +pi <> ピ ; +pu <> プ ; +pe <> ペ ; +po <> ポ ; + +h | '~' < ヒ } $small_y ; +hy } $vowel > ヒ | '~y' ; + +ha <> ハ ; +hi <> ヒ ; +hu <> ヘゥ ; +he <> ヘ ; +ho <> ホ ; + +# f | '~' < フ } $small_y ; +# f } $vowel > フ | '~' ; + +fa <> ファ ; +fi <> フィ ; +fe <> フェ ; +fo <> フォ ; +fu <> フ ; + +r | '~' < リ } $small_y ; +ry } $vowel > リ | '~y' ; + +ra <> ラ ; +ri <> リ ; +ru <> ル ; +re <> レ ; +ro <> ロ ; + +za <> ザ ; +zi <> ゼィ ; +zu <> ズ ; +ze <> ゼ ; +zo <> ゾ ; + +sa <> サ ; +si <> セィ ; +su <> ス ; +se <> セ ; +so <> ソ ; + +sha < シャ ; +shi'~i' < シィ ; # liu +shu < シュ ; +she < シェ ; +sho < ショ ; +shi <> シ ; +sh } $vowel > シ | '~y' ; + +ta <> タ ; +ti <> ティ ; +tu <> テゥ ; +te <> テ ; +to <> ト ; + +tsu <> ツ ; + +# v } $vowel > ヴ | '~' ; + +#'v~a' < ヴァ ; # liu +#'v~i' < ヴィ ; # liu +#'v~e' < ヴェ ; # liu +#'v~o' < ヴォ ; # liu +vu <> ヴ ; + +u <> ウ ; + +# w } $vowel > ウ | '~' ; + +wa <> ワ ; +wi <> ヰ ; +wu > ウ ; +we <> ヱ ; +wo <> ヲ ; + +ya <> ヤ ; +yi > イ ; +yu <> ユ ; +ye > エ ; +yo <> ヨ ; + +# double consonants + +#specials +s } sh > ッ ; +t } ch > ッ ; + +#voiced + +j } j <> ッ } $j_start ; +b } b <> ッ } [$h_start$f_start] $voice; +d } d <> ッ } $t_start $voice; +g } g <> ッ } $k_start $voice; +p } p <> ッ } [$h_start$f_start] $semivoice; +# v } v <> ッ } [ワヰウヱヲう] $voice ; +z } z <> ッ } $s_start $voice; +v } v <> ッ } $v_start; + +# normal + +k } k <> ッ } $k_start ; +m } m <> ッ } $m_start ; +n } n <> ッ } $n_start ; +h } h <> ッ } $h_start ; +f } f <> ッ } $f_start ; +r } r <> ッ } $r_start ; +t } t <> ッ } $t_start ; +s } s <> ッ } $s_start ; + +w } w <> ッ } $w_start; +y } y <> ッ } $y_start; + +# completeness +x } x > ッ ; +c } k > ッ ; +c } c > ッ ; +c } q > ッ ; +l } l > ッ ; +q } q > ッ ; +# y } y > ッ ; +# w } w > ッ ; + +# prolonged vowel mark. this indicates a doubling of +# the preceding vowel sound + +#a < a { ー ; # liu +#e < e { ー ; # liu +#i < i { ー ; # liu +#o < o { ー ; # liu +#u < u { ー ; # liu + +$macron <> ー ; + +# small forms + +'~a' <> ァ ; +'~i' <> ィ ; +'~u' <> ゥ ; +'~e' <> ェ ; +'~o' <> ォ ; +'~tsu' <> ッ ; +'~wa' <> ヮ ; +'~ya' <> ャ ; +'~yi' > ィ ; +'~yu' <> ュ ; +'~ye' > ェ ; +'~yo' <> ョ ; + +# iteration marks +# TODO: make more accurate + +j $1 < sh (y* $vowel) {ヽ$voice ; +dj $1 < ch (y* $vowel) {ヽ$voice ; +dz $1 < ts (y* $vowel) {ヽ$voice ; + +g $1 < k (y* $vowel) {ヽ$voice ; +z $1 < s (y* $vowel) {ヽ$voice ; +d $1 < t (y* $vowel) {ヽ$voice ; +h $1 < b (y* $vowel) {ヽ$voice ; +v $1 < w (y* $vowel) {ヽ$voice ; + +sh $1 < sh (y* $vowel) {ヽ$voice ; +j $1 < j (y* $vowel) {ヽ$voice ; +ch $1 < ch (y* $vowel) {ヽ$voice ; +dj $1 < dj(y* $vowel) {ヽ$voice ; +ts $1 < ts (y* $vowel) {ヽ$voice ; +dz $1 < dz (y* $vowel) {ヽ$voice ; + +$1 < ($consonant y* $vowel) {ヽ$voice? ; +$1 < (.) {ヽ $voice? ; # otherwise repeat last character + < ヽ $voice? ; # delete if no characters found + +# h- rule: lengthens vowel if not followed by a vowel + +[aeiou] } h > ー ; + +# one-way latin- > kana rules. these do not occur in +# well-formed romaji representing actual japanese text. +# their purpose is to make all romaji map to kana of +# some sort. + +# the following are not really necessary, but produce +# slightly more natural results. + +cy > セィ ; +dy > ディ ; +hy > ヒ ; +sy > セィ ; +ty > ティ ; +zy > ゼィ ; + +h > ヘ ; + +# isolated consonants listed here so as not to mask +# longer rules above. + +ch > チ; +sh > シ ; +dz > ヅ ; +dj > ヂ; + +b > ブ ; +d > デ ; +g > グ ; +k > ク ; +m > ム ; +n'' < ン } $n_quoter ; +n <> ン ; +p > プ ; +r > ル ; +s > ス ; +t > テ ; +y > イ ; +z > ズ ; +v > ヴ ; + +f > フ; +j > ジ; +w > ウ; + +ß > | ss ; +æ > | e ; +ð > | d ; +ø > | u ; +þ > | th ; + +# simple substitutions using backup + +c > | k ; +l > | r ; +q > | k ; +x > | ks ; + +# ~~~ END shared rules ~~~ + +#------------------------------------------------------ +# Final cleanup + +'~' > ; # delete stray tildes between letters +[:Katakana:] { '' } [:Latin:] > ; # delete stray quotes between letters +# [\u02BE[:Nonspacing Mark:]-[\u3099-\u309C]] > ; # delete any non-spacing marks that we didn't use + +:: NFC (NFD) ; +:: ([:Katakana:] halfwidth-fullwidth); + +# note: a global filter is more efficient, but MUST include all source chars!! +#:: ([\u0000-\u007E \u3001\u3002 \u3099-\u309C \u30A1-\u30FC \uFF61-\uFF9F [:Latin:][:Katakana:] [:nonspacing mark:]]); +# MINIMAL FILTER GENERATED FOR: Latin-Katakana BACKWARD +:: ( [[\ -~\u00A2-\u00A3\u00A5-\u00A6\u00AC\u0304\u20A9\uFF61-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC\uFFE8-\uFFEE][~\u3001-\u3002\u304C\u304E\u3050\u3052\u3054\u3056\u3058\u305A\u305C\u305E\u3060\u3062\u3065\u3067\u3069\u3070-\u3071\u3073-\u3074\u3076-\u3077\u3079-\u307A\u307C-\u307D\u3094\u3099-\u309B\u309E\u30A1-\u30FA\u30FC-\u30FE]] ) ; + +# eof diff --git a/icuSources/data/translit/Latin_NumericPinyin.txt b/icuSources/data/translit/Latin_NumericPinyin.txt new file mode 100644 index 00000000..c1bfda85 --- /dev/null +++ b/icuSources/data/translit/Latin_NumericPinyin.txt @@ -0,0 +1,41 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# According to the pinyin definitions I've been able to find: +# 'a', 'e' are the preferred bases +# otherwise 'o' +# otherwise last vowel + +# The trailing form of syllables are the following: +# "a", "ai", "ao", "an", "ang", +# "o", "ou", "ong", +# "e", "ei", "er", "en", "eng", +# "i", "ia", "iao", "ie", "iu", "ian", "in", "iang", "ing", "iong", +# "u", "ua", "uo", "uai", "ui", "uan", "un", "uang", "ueng", +# "ü", "üe", "üan", "ün" +# so the letters the tone will 'hop' are: + +::NFD (NFC); +$tone = [\u0304\u0301\u030C\u0300\u0306] ; + +# Move the tone to the end of a syllable, and convert to number +e {($tone) r} > r &tone-digit($1); +($tone) ( [i o n u {o n} {n g}]) > $2 &tone-digit($1); +($tone) > &tone-digit($1); + +# The following backs up until it finds the right vowel, then deposits the tone + +$vowel = [aAeEiIoOuUüÜ]; +$consonant = [[a-z A-Z] - [$vowel]]; +$digit = [1-5]; +$1 &digit-tone($3) $2 < ([aAeE]) ($vowel* $consonant*) ($digit); +$1 &digit-tone($3) $2 < ([oO]) ([$vowel-[aeAE]]* $consonant*) ($digit); +$1 &digit-tone($3) $2 < ($vowel) ($consonant*) ($digit); +&digit-tone($1) < [:letter:] {($digit)}; + +::NFC (NFD); + + + diff --git a/icuSources/data/translit/Malayalam_InterIndic.txt b/icuSources/data/translit/Malayalam_InterIndic.txt new file mode 100644 index 00000000..3fd42e08 --- /dev/null +++ b/icuSources/data/translit/Malayalam_InterIndic.txt @@ -0,0 +1,85 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# Malayalam-InterIndic +#:: NFD (NFC) ; + +\u0D02>\uE002; # SIGN ANUSVARA +\u0D03>\uE003; # SIGN VISARGA +\u0D05>\uE005; # LETTER A +\u0D06>\uE006; # LETTER AA +\u0D07>\uE007; # LETTER I +\u0D08>\uE008; # LETTER II +\u0D09>\uE009; # LETTER U +\u0D0A>\uE00A; # LETTER UU +\u0D0B>\uE00B; # LETTER VOCALIC R +\u0D0C>\uE00C; # LETTER VOCALIC L +\u0D0E>\uE00E; # LETTER E +\u0D0F>\uE00F; # LETTER EE +\u0D10>\uE010; # LETTER AI +\u0D12>\uE012; # LETTER O +\u0D13>\uE013; # LETTER OO +\u0D14>\uE014; # LETTER AU +\u0D15>\uE015; # LETTER KA +\u0D16>\uE016; # LETTER KHA +\u0D17>\uE017; # LETTER GA +\u0D18>\uE018; # LETTER GHA +\u0D19>\uE019; # LETTER NGA +\u0D1A>\uE01A; # LETTER CA +\u0D1B>\uE01B; # LETTER CHA +\u0D1C>\uE01C; # LETTER JA +\u0D1D>\uE01D; # LETTER JHA +\u0D1E>\uE01E; # LETTER NYA +\u0D1F>\uE01F; # LETTER TTA +\u0D20>\uE020; # LETTER TTHA +\u0D21>\uE021; # LETTER DDA +\u0D22>\uE022; # LETTER DDHA +\u0D23>\uE023; # LETTER NNA +\u0D24>\uE024; # LETTER TA +\u0D25>\uE025; # LETTER THA +\u0D26>\uE026; # LETTER DA +\u0D27>\uE027; # LETTER DHA +\u0D28>\uE028; # LETTER NA +\u0D2A>\uE02A; # LETTER PA +\u0D2B>\uE02B; # LETTER PHA +\u0D2C>\uE02C; # LETTER BA +\u0D2D>\uE02D; # LETTER BHA +\u0D2E>\uE02E; # LETTER MA +\u0D2F>\uE02F; # LETTER YA +\u0D30>\uE030; # LETTER RA +\u0D31>\uE031; # LETTER RRA +\u0D32>\uE032; # LETTER LA +\u0D33>\uE033; # LETTER LLA +\u0D34>\uE034; # LETTER LLLA +\u0D35>\uE035; # LETTER VA +\u0D36>\uE036; # LETTER SHA +\u0D37>\uE037; # LETTER SSA +\u0D38>\uE038; # LETTER SA +\u0D39>\uE039; # LETTER HA +\u0D3E>\uE03E; # VOWEL SIGN AA +\u0D3F>\uE03F; # VOWEL SIGN I +\u0D40>\uE040; # VOWEL SIGN II +\u0D41>\uE041; # VOWEL SIGN U +\u0D42>\uE042; # VOWEL SIGN UU +\u0D43>\uE043; # VOWEL SIGN VOCALIC R +\u0D46>\uE046; # VOWEL SIGN E +\u0D47>\uE047; # VOWEL SIGN EE +\u0D48>\uE048; # VOWEL SIGN AI +\u0D4D>\uE04D; # SIGN VIRAMA +\u0D57>\uE057; # AU LENGTH MARK +\u0D60>\uE060; # LETTER VOCALIC RR +\u0D61>\uE061; # LETTER VOCALIC LL +\u0D66>\uE066; # DIGIT ZERO +\u0D67>\uE067; # DIGIT ONE +\u0D68>\uE068; # DIGIT TWO +\u0D69>\uE069; # DIGIT THREE +\u0D6A>\uE06A; # DIGIT FOUR +\u0D6B>\uE06B; # DIGIT FIVE +\u0D6C>\uE06C; # DIGIT SIX +\u0D6D>\uE06D; # DIGIT SEVEN +\u0D6E>\uE06E; # DIGIT EIGHT +\u0D6F>\uE06F; # DIGIT NINE +# :: NFC (NFD) ; +# eof diff --git a/icuSources/data/translit/Oriya_InterIndic.txt b/icuSources/data/translit/Oriya_InterIndic.txt new file mode 100644 index 00000000..937d919c --- /dev/null +++ b/icuSources/data/translit/Oriya_InterIndic.txt @@ -0,0 +1,95 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# Oriya-InterIndic +#:: NFD (NFC) ; +#\u0B21\u0B3C>\uE05C;# LETTER RRA +#\u0B22\u0B3C>\uE05D;# LETTER RHA +\u0B47\u0B56>\uE048;# VOWEL SIGN AI +\u0B47\u0B3E>\uE04B;# VOWEL SIGN O +\u0B47\u0B57>\uE04C;# VOWEL SIGN AU + +\u0B01>\uE001; # SIGN CANDRABINDU +\u0B02>\uE002; # SIGN ANUSVARA +\u0B03>\uE003; # SIGN VISARGA +\u0B05>\uE005; # LETTER A +\u0B06>\uE006; # LETTER AA +\u0B07>\uE007; # LETTER I +\u0B08>\uE008; # LETTER II +\u0B09>\uE009; # LETTER U +\u0B0A>\uE00A; # LETTER UU +\u0B0B>\uE00B; # LETTER VOCALIC R +\u0B0C>\uE00C; # LETTER VOCALIC L +\u0B0F>\uE00F; # LETTER E +\u0B10>\uE010; # LETTER AI +\u0B13>\uE013; # LETTER O +\u0B14>\uE014; # LETTER AU +\u0B15>\uE015; # LETTER KA +\u0B16>\uE016; # LETTER KHA +\u0B17>\uE017; # LETTER GA +\u0B18>\uE018; # LETTER GHA +\u0B19>\uE019; # LETTER NGA +\u0B1A>\uE01A; # LETTER CA +\u0B1B>\uE01B; # LETTER CHA +\u0B1C>\uE01C; # LETTER JA +\u0B1D>\uE01D; # LETTER JHA +\u0B1E>\uE01E; # LETTER NYA +\u0B1F>\uE01F; # LETTER TTA +\u0B20>\uE020; # LETTER TTHA +\u0B21>\uE021; # LETTER DDA +\u0B22>\uE022; # LETTER DDHA +\u0B23>\uE023; # LETTER NNA +\u0B24>\uE024; # LETTER TA +\u0B25>\uE025; # LETTER THA +\u0B26>\uE026; # LETTER DA +\u0B27>\uE027; # LETTER DHA +\u0B28>\uE028; # LETTER NA +\u0B2A>\uE02A; # LETTER PA +\u0B2B>\uE02B; # LETTER PHA +\u0B2C>\uE02C; # LETTER BA +\u0B2D>\uE02D; # LETTER BHA +\u0B2E>\uE02E; # LETTER MA +\u0B2F>\uE02F; # LETTER YA +\u0B30>\uE030; # LETTER RA +\u0B32>\uE032; # LETTER LA +\u0B33>\uE033; # LETTER LLA +\u0B35>\uE035; # LETTER VA +\u0B36>\uE036; # LETTER SHA +\u0B37>\uE037; # LETTER SSA +\u0B38>\uE038; # LETTER SA +\u0B39>\uE039; # LETTER HA +\u0B3C>\uE03C; # SIGN NUKTA +\u0B3D>\uE03D; # SIGN AVAGRAHA +\u0B3E>\uE03E; # VOWEL SIGN AA +\u0B3F>\uE03F; # VOWEL SIGN I +\u0B40>\uE040; # VOWEL SIGN II +\u0B41>\uE041; # VOWEL SIGN U +\u0B42>\uE042; # VOWEL SIGN UU +\u0B43>\uE043; # VOWEL SIGN VOCALIC R +\u0B47>\uE047; # VOWEL SIGN E +# +\u0B4D>\uE04D; # SIGN VIRAMA +\u0B56>\uE056; # AI LENGTH MARK +\u0B57>\uE057; # AU LENGTH MARK +\u0964>\ue064; # DANDA +\u0965>\ue065; # DOUBLE DANDA +# +\u0B5F>\uE05F; # LETTER YYA +\u0B60>\uE060; # LETTER VOCALIC RR +\u0B61>\uE061; # LETTER VOCALIC LL +\u0B66>\uE066; # DIGIT ZERO +\u0B67>\uE067; # DIGIT ONE +\u0B68>\uE068; # DIGIT TWO +\u0B69>\uE069; # DIGIT THREE +\u0B6A>\uE06A; # DIGIT FOUR +\u0B6B>\uE06B; # DIGIT FIVE +\u0B6C>\uE06C; # DIGIT SIX +\u0B6D>\uE06D; # DIGIT SEVEN +\u0B6E>\uE06E; # DIGIT EIGHT +\u0B6F>\uE06F; # DIGIT NINE +\u0B70>\ue07B; # ISSHAR +\u0B71>\ue081; # LETTER WA +# :: NFC (NFD) ; +# eof diff --git a/icuSources/data/translit/Tamil_InterIndic.txt b/icuSources/data/translit/Tamil_InterIndic.txt new file mode 100644 index 00000000..1fb92631 --- /dev/null +++ b/icuSources/data/translit/Tamil_InterIndic.txt @@ -0,0 +1,76 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# Tamil-InterIndic +#:: NFD (NFC) ; + +\u0BC6\u0BBE>\uE04A;# VOWEL SIGN O +\u0BC7\u0BBE>\uE04B;# VOWEL SIGN OO +\u0BC6\u0BD7>\uE04C;# VOWEL SIGN AU +\u0B92\u0BD7>\uE014;# LETTER AU + +\u0B82>\uE002; # SIGN ANUSVARA +\u0B83>\uE003; # SIGN VISARGA +\u0B85>\uE005; # LETTER A +\u0B86>\uE006; # LETTER AA +\u0B87>\uE007; # LETTER I +\u0B88>\uE008; # LETTER II +\u0B89>\uE009; # LETTER U +\u0B8A>\uE00A; # LETTER UU +\u0B8E>\uE00E; # LETTER E +\u0B8F>\uE00F; # LETTER EE +\u0B90>\uE010; # LETTER AI +\u0B92>\uE012; # LETTER O +\u0B93>\uE013; # LETTER OO +\u0B94>\uE014; # LETTER AU +\u0B95>\uE015; # LETTER KA +\u0B99>\uE019; # LETTER NGA +\u0B9A>\uE01A; # LETTER CA +\u0B9C>\uE01C; # LETTER JA +\u0B9E>\uE01E; # LETTER NYA +\u0B9F>\uE01F; # LETTER TTA +\u0BA3>\uE023; # LETTER NNA +\u0BA4>\uE024; # LETTER TA +\u0BA8>\uE028; # LETTER NA +\u0BA9>\uE029; # LETTER NNNA +\u0BAA>\uE02A; # LETTER PA +\u0BAE>\uE02E; # LETTER MA +\u0BAF>\uE02F; # LETTER YA +\u0BB0>\uE030; # LETTER RA +\u0BB1>\uE031; # LETTER RRA +\u0BB2>\uE032; # LETTER LA +\u0BB3>\uE033; # LETTER LLA +\u0BB4>\uE034; # LETTER LLLA +\u0BB5>\uE035; # LETTER VA +\u0BB7>\uE037; # LETTER SSA +\u0BB8>\uE038; # LETTER SA +\u0BB9>\uE039; # LETTER HA +\u0BBE>\uE03E; # VOWEL SIGN AA +\u0BBF>\uE03F; # VOWEL SIGN I +\u0BC0>\uE040; # VOWEL SIGN II +\u0BC1>\uE041; # VOWEL SIGN U +\u0BC2>\uE042; # VOWEL SIGN UU +\u0BC6>\uE046; # VOWEL SIGN E +\u0BC7>\uE047; # VOWEL SIGN EE +\u0BC8>\uE048; # VOWEL SIGN AI + +\u0BCD>\uE04D; # SIGN VIRAMA +\u0BD7>\uE057; # AU LENGTH MARK +\u0BE7>\uE067; # DIGIT ONE +\u0BE8>\uE068; # DIGIT TWO +\u0BE9>\uE069; # DIGIT THREE +\u0BEA>\uE06A; # DIGIT FOUR +\u0BEB>\uE06B; # DIGIT FIVE +\u0BEC>\uE06C; # DIGIT SIX +\u0BED>\uE06D; # DIGIT SEVEN +\u0BEE>\uE06E; # DIGIT EIGHT +\u0BEF>\uE06F; # DIGIT NINE +\u0BF0>\uE067\uE066; # UNMAPPED Tamil-InterIndic: NUMBER TEN +\u0BF1>\uE067\uE066\uE066; # UNMAPPED Tamil-InterIndic: NUMBER ONE HUNDRED +\u0BF2>\uE067\uE066\uE066\uE066;# UNMAPPED Tamil-InterIndic: NUMBER ONE THOUSAND +0>\ue066; + +# :: NFC (NFD) ; +# eof diff --git a/icuSources/data/translit/Telugu_InterIndic.txt b/icuSources/data/translit/Telugu_InterIndic.txt new file mode 100644 index 00000000..b8ce5306 --- /dev/null +++ b/icuSources/data/translit/Telugu_InterIndic.txt @@ -0,0 +1,90 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# Telugu-InterIndic +#:: NFD (NFC) ; +\u0c46\u0c4d\u0c56>\ue048\ue04d; +\u0C46\u0C56>\uE048;# VOWEL SIGN AI +\u0C01>\uE001; # SIGN CANDRABINDU +\u0C02>\uE002; # SIGN ANUSVARA +\u0C03>\uE003; # SIGN VISARGA +\u0C05>\uE005; # LETTER A +\u0C06>\uE006; # LETTER AA +\u0C07>\uE007; # LETTER I +\u0C08>\uE008; # LETTER II +\u0C09>\uE009; # LETTER U +\u0C0A>\uE00A; # LETTER UU +\u0C0B>\uE00B; # LETTER VOCALIC R +\u0C0C>\uE00C; # LETTER VOCALIC L +\u0C0E>\uE00E; # LETTER E +\u0C0F>\uE00F; # LETTER EE +\u0C10>\uE010; # LETTER AI +\u0C12>\uE012; # LETTER O +\u0C13>\uE013; # LETTER OO +\u0C14>\uE014; # LETTER AU +\u0C15>\uE015; # LETTER KA +\u0C16>\uE016; # LETTER KHA +\u0C17>\uE017; # LETTER GA +\u0C18>\uE018; # LETTER GHA +\u0C19>\uE019; # LETTER NGA +\u0C1A>\uE01A; # LETTER CA +\u0C1B>\uE01B; # LETTER CHA +\u0C1C>\uE01C; # LETTER JA +\u0C1D>\uE01D; # LETTER JHA +\u0C1E>\uE01E; # LETTER NYA +\u0C1F>\uE01F; # LETTER TTA +\u0C20>\uE020; # LETTER TTHA +\u0C21>\uE021; # LETTER DDA +\u0C22>\uE022; # LETTER DDHA +\u0C23>\uE023; # LETTER NNA +\u0C24>\uE024; # LETTER TA +\u0C25>\uE025; # LETTER THA +\u0C26>\uE026; # LETTER DA +\u0C27>\uE027; # LETTER DHA +\u0C28>\uE028; # LETTER NA +\u0C2A>\uE02A; # LETTER PA +\u0C2B>\uE02B; # LETTER PHA +\u0C2C>\uE02C; # LETTER BA +\u0C2D>\uE02D; # LETTER BHA +\u0C2E>\uE02E; # LETTER MA +\u0C2F>\uE02F; # LETTER YA +\u0C30>\uE030; # LETTER RA +\u0C31>\uE031; # LETTER RRA +\u0C32>\uE032; # LETTER LA +\u0C33>\uE033; # LETTER LLA +\u0C35>\uE035; # LETTER VA +\u0C36>\uE036; # LETTER SHA +\u0C37>\uE037; # LETTER SSA +\u0C38>\uE038; # LETTER SA +\u0C39>\uE039; # LETTER HA +\u0C3E>\uE03E; # VOWEL SIGN AA +\u0C3F>\uE03F; # VOWEL SIGN I +\u0C40>\uE040; # VOWEL SIGN II +\u0C41>\uE041; # VOWEL SIGN U +\u0C42>\uE042; # VOWEL SIGN UU +\u0C43>\uE043; # VOWEL SIGN VOCALIC R +\u0C44>\uE044; # VOWEL SIGN VOCALIC RR +\u0C46>\uE046; # VOWEL SIGN E +\u0C47>\uE047; # VOWEL SIGN EE +\u0C4A>\uE04A; # VOWEL SIGN O +\u0C4B>\uE04B; # VOWEL SIGN OO +\u0C4C>\uE04C; # VOWEL SIGN AU +\u0C4D>\uE04D; # SIGN VIRAMA +\u0C55>\uE055; # LENGTH MARK +\u0C56>\uE056; # AI LENGTH MARK +\u0C60>\uE060; # LETTER VOCALIC RR +\u0C61>\uE061; # LETTER VOCALIC LL +\u0C66>\uE066; # DIGIT ZERO +\u0C67>\uE067; # DIGIT ONE +\u0C68>\uE068; # DIGIT TWO +\u0C69>\uE069; # DIGIT THREE +\u0C6A>\uE06A; # DIGIT FOUR +\u0C6B>\uE06B; # DIGIT FIVE +\u0C6C>\uE06C; # DIGIT SIX +\u0C6D>\uE06D; # DIGIT SEVEN +\u0C6E>\uE06E; # DIGIT EIGHT +\u0C6F>\uE06F; # DIGIT NINE +# :: NFC (NFD) ; +# eof diff --git a/icuSources/data/translit/ThaiLogical_Latin.txt b/icuSources/data/translit/ThaiLogical_Latin.txt new file mode 100644 index 00000000..558fd84a --- /dev/null +++ b/icuSources/data/translit/ThaiLogical_Latin.txt @@ -0,0 +1,187 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# Thai-Latin +# This set of rules follows ISO 11940 +# see http://homepage.mac.com/sirbinks/pdf/Thai.r2.pdf +# except that that does not mention an implicit vowel, so we use ọ +# +# The transcription is fairly ugly, so we ought to also do the UNGEGN version +# see: http://www.eki.ee/wgrs/rom1_th.pdf +# and probably make that the main variant. + +# Note: this is an internal file. The NFD/NFC is handled externally, in the index +# The insertion of spaces between words, the reversal of the vowels +# and the conversion of space to semicolon are done *outside* of these rules. +# So as far as these rules are concerned, the vowels are in logical order! + +# insert implicit vowel (and remove it going the other way) +# COMMENTED out: the implicit vowel positions cannot be predicted algorithmically +#$consonant = [ก-ฮ]; +#$vowel = [ะ-ฺเ-ไ็]; + +#{ ( $consonant ) } [^$vowel ] > | $1  ; +# > ọ ; +# < ọ ; + +$notAbove = [^\p{ccc=0}\p{ccc=above}] ; +$notBelow = [^\p{ccc=0}\p{ccc=below}] ; + +# Consonants +# Warning: the 'h's need to be handled carefully! +# What we really want to say is the following, but we can't +# $notHAccent = !($notAbove* ̄ | $notBelow* ̣) ; + +# Since the only accents we care about that could cause problems are free-standing accents below, we use instead: +$freeStandingBelow = [\u0325 ]; +$hAccent = [ ̄ ̣]; +$notHAccent0 = [^$freeStandingBelow$hAccent]; +$notHAccent1 = $freeStandingBelow [^$hAccent]; + +ห > h̄ ; # THAI CHARACTER HO HIP + ห | $1 < h ($notAbove*) ̄; # backward case, account for reordering +ฮ <> ḥ ; # THAI CHARACTER HO NOKHUK + +ข <> k̄h ; # THAI CHARACTER KHO KHAI +ฃ <> ḳ̄h ; # THAI CHARACTER KHO KHUAT +ฅ <> kʹh ; # THAI CHARACTER KHO KHON +ฆ <> ḳh ; # THAI CHARACTER KHO RAKHANG +ค < kh } $notHAccent1 ; # THAI CHARACTER KHO KHWAI +ค <> kh } $notHAccent0 ; # THAI CHARACTER KHO KHWAI +ก <> k ; # THAI CHARACTER KO KAI + +ภ <> p̣h ; # THAI CHARACTER PHO SAMPHAO +ผ <> p̄h ; # THAI CHARACTER PHO PHUNG +พ < ph } $notHAccent1 ; # THAI CHARACTER PHO PHAN +พ <> ph } $notHAccent0 ; # THAI CHARACTER PHO PHAN +ป <> p ; # THAI CHARACTER PO PLA + +ฉ <> c̄h ; # THAI CHARACTER CHO CHING +ฌ <> c̣h ; # THAI CHARACTER CHO CHOE +ช < ch } $notHAccent1 ; # THAI CHARACTER CHO CHANG +ช <> ch } $notHAccent0 ; # THAI CHARACTER CHO CHANG +จ <> c ; # THAI CHARACTER CHO CHAN + +ฐ <> ṭ̄h ; # THAI CHARACTER THO THAN +ฑ <> ṯh ; # THAI CHARACTER THO NANGMONTHO +ฒ <> tʹh ; # THAI CHARACTER THO PHUTHAO +ถ <> t̄h ; # THAI CHARACTER THO THUNG +ธ <> ṭh ; # THAI CHARACTER THO THONG +ท < th } $notHAccent1 ; # THAI CHARACTER THO THAHAN +ท <> th } $notHAccent0 ; # THAI CHARACTER THO THAHAN +#Note: TO PATAK deviates from ISO since t-dotunder + h would be ambigous. So it uses vertical tick. +ฏ <> t̩ ; # THAI CHARACTER TO PATAK +ต <> t ; # THAI CHARACTER TO TAO + +# since there is no singleton g (generated), don't worry about that. +ง <> ng ; # THAI CHARACTER NGO NGU +ณ <> ṇ ; # THAI CHARACTER NO NEN +น <> n ; # THAI CHARACTER NO NU + +ญ <> ỵ ; # THAI CHARACTER YO YING +ฎ <> ḍ ; # THAI CHARACTER DO CHADA +ด <> d ; # THAI CHARACTER DO DEK + +บ <> b ; # THAI CHARACTER BO BAIMAI +ฝ <> f̄ ; # THAI CHARACTER FO FA + ฝ | $1 < f ($notAbove*) ̄; # backward case, account for reordering + +ม <> m ; # THAI CHARACTER MO MA +ย <> y ; # THAI CHARACTER YO YAK +ร <> r ; # THAI CHARACTER RO RUA +ฤ <> v ; # THAI CHARACTER RU +ฦ <> ł ; # THAI CHARACTER LU +ว <> w ; # THAI CHARACTER WO WAEN + +ศ <> ṣ̄ ; # THAI CHARACTER SO SALA*** + ศ | $1 < s ̣ ($notAbove*) ̄; # backward case, account for reordering +ษ <> s̄ʹ ; # THAI CHARACTER SO RUSI +ส > s̄ ; # THAI CHARACTER SO SUA*** + ส | $1 < s ($notAbove*) ̄; # backward case, account for reordering + +ฬ <> ḷ ; # THAI CHARACTER LO CHULA +ล <> l ; # THAI CHARACTER LO LING +ฟ <> f ; # THAI CHARACTER FO FAN + +อ <> x ; # THAI CHARACTER O ANG +ซ <> s ; # THAI CHARACTER SO SO + +# vowels + + ั <> ạ ; # THAI CHARACTER MAI HAN-AKAT + +า > ā ; # THAI CHARACTER SARA AA + า | $1 < a ($notAbove*) ̄; # backward case, account for reordering + +# We deviate from ISO for SARA AM for disambiguation +ำ > a ̉; # THAI CHARACTER SARA AM + ำ | $1 < a ($notAbove*) ̉ ; # backward case, account for reordering + +ะ <> a ; # THAI CHARACTER SARA A + ี <> ī ; # THAI CHARACTER SARA II + ี | $1 < i ($notAbove*) ̄ ; # backward case, account for reordering + + ื <> ụ̄ ; # THAI CHARACTER SARA UEE + ื | $1 < u ̣ ($notAbove*) ̄ ; # backward case, account for reordering + + ึ <> ụ ; # THAI CHARACTER SARA UE + ู <> ū ; # THAI CHARACTER SARA UU + ู | $1 < u ($notAbove*) ̄ ; # backward case, account for reordering + + ุ <> u ; # THAI CHARACTER SARA U + +ฯ <> ‡ ; # THAI CHARACTER PAIYANNOI + +# ฿ <> XXX ; # THAI CURRENCY SYMBOL BAHT + +เ <> e ; # THAI CHARACTER SARA E +แ <> æ ; # THAI CHARACTER SARA AE +โ <> o ; # THAI CHARACTER SARA O +ใ <> ı ; # THAI CHARACTER SARA AI MAIMUAN +ไ <> ị ; # THAI CHARACTER SARA AI MAIMALAI +ๅ <> ɨ ; # THAI CHARACTER LAKKHANGYAO + ็ <> ̆ ; # THAI CHARACTER MAITAIKHU + ่ <> ̀ ; # THAI CHARACTER MAI EK + ้ <> ̂ ; # THAI CHARACTER MAI THO + ๊ <> ́ ; # THAI CHARACTER MAI TRI + ๋ <> ̌ ; # THAI CHARACTER MAI CHATTAWA + ์ <> ̒ ; # THAI CHARACTER THANTHAKHAT + ๎ <> '~' ; # THAI CHARACTER YAMAKKAN + +# We deviate from ISO for disambiguation + ํ <> ̊ ; # THAI CHARACTER NIKHAHIT + +๏ <> § ; # THAI CHARACTER FONGMAN + +๐ <> 0 ; # THAI DIGIT ZERO +๑ <> 1 ; # THAI DIGIT ONE +๒ <> 2 ; # THAI DIGIT TWO +๓ <> 3 ; # THAI DIGIT THREE +๔ <> 4 ; # THAI DIGIT FOUR +๕ <> 5 ; # THAI DIGIT FIVE +๖ <> 6 ; # THAI DIGIT SIX +๗ <> 7 ; # THAI DIGIT SEVEN +๘ <> 8 ; # THAI DIGIT EIGHT +๙ <> 9 ; # THAI DIGIT NINE + +๚ <> '||' ; # THAI CHARACTER ANGKHANKHU + +๛ <> » ; # THAI CHARACTER KHOMUT +ๆ <> « ; # THAI CHARACTER MAIYAMOK + +# moved down to make shorter first +#Note: PHINTHU deviates from ISO since underring causes canonical problems. So it uses spacing tick below. + ฺ <> ˌ ; # THAI CHARACTER PHINTHU + ิ <> i ; # THAI CHARACTER SARA I + +# fallbacks + +| k < g ; +| k < h ; +| c < j ; +| k < q ; +| s < z ; + +:: (lower); diff --git a/icuSources/data/translit/Thai_ThaiLogical.txt b/icuSources/data/translit/Thai_ThaiLogical.txt new file mode 100644 index 00000000..52764c55 --- /dev/null +++ b/icuSources/data/translit/Thai_ThaiLogical.txt @@ -0,0 +1,26 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# This reverses the Thai LogicalOrderException vowels, and does (part of) spaces +# The rules that convert space into semicolon are in another file; +# since they have to come BEFORE the break iterator + +$thai = [[:thai:] \u0E01-\u0E3A\u0E40-\u0E5B] ; + +# First convert the semicolon back + +' ' < $thai { '; ' } $thai; + +# Remove any other spaces between thai letters + +< $thai { ' ' } $thai; + +# Now vowels +$thai_reversing = [[:Logical_Order_Exception:] & $thai]; +$thai_non_reversing = [$thai - $thai_reversing ]; + +( $thai_reversing ) ( $thai_non_reversing ) > $2 $1; +# other direction +$2 $1 < ( $thai_non_reversing ) ( $thai_reversing ) ; \ No newline at end of file diff --git a/icuSources/data/translit/Thai_ThaiSemi.txt b/icuSources/data/translit/Thai_ThaiSemi.txt new file mode 100644 index 00000000..ce1f3ff0 --- /dev/null +++ b/icuSources/data/translit/Thai_ThaiSemi.txt @@ -0,0 +1,11 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# The rules that convert space into semicolon are in this file; +# since they have to come BEFORE the break iterator. + +$thai = [[:thai:] \u0E01-\u0E3A\u0E40-\u0E5B] ; + +$thai { ' ' } $thai > '; ' ; \ No newline at end of file diff --git a/icuSources/data/translit/Tone_Digit.txt b/icuSources/data/translit/Tone_Digit.txt new file mode 100644 index 00000000..489d79f1 --- /dev/null +++ b/icuSources/data/translit/Tone_Digit.txt @@ -0,0 +1,11 @@ +#-------------------------------------------------------------------- +# Copyright (c) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#-------------------------------------------------------------------- + +# Only intended for internal use +\u0304 <> 1; +\u0301 <> 2; +\u030C <> 3; +\u0300 <> 4; + < 5; \ No newline at end of file diff --git a/icuSources/data/locales/de_DE_PREEURO.txt b/icuSources/data/translit/el.txt similarity index 59% rename from icuSources/data/locales/de_DE_PREEURO.txt rename to icuSources/data/translit/el.txt index 49d10bb4..23cc342e 100644 --- a/icuSources/data/locales/de_DE_PREEURO.txt +++ b/icuSources/data/translit/el.txt @@ -1,10 +1,16 @@ // *************************************************************************** // * -// * Copyright (C) 1997-2003, International Business Machines +// * Copyright (C) 2004, International Business Machines // * Corporation and others. All Rights Reserved. // * // *************************************************************************** +// -de_DE_PREEURO { - Version { "2.0" } +el{ + + TransliterateLATIN { + "UNGEGN", + "::Greek-Latin/UNGEGN;" + } } + \ No newline at end of file diff --git a/icuSources/data/translit/en.txt b/icuSources/data/translit/en.txt new file mode 100644 index 00000000..6c6ccd63 --- /dev/null +++ b/icuSources/data/translit/en.txt @@ -0,0 +1,22 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// + +en{ + + // Format for the display name of a Transliterator. + // This is the English form of this resource. + TransliteratorNamePattern { "{0,choice,0#|1#{1}|2#{1} to {2}}" } + + // Transliterator display names + // This is the English form of this resource. + // This list is currently incomplete, and care should be taken to translate these identifiers. + // TODO: Reorganize this data like Country, Currencies and Language tables. + "%Translit%Hex" { "Hex Escape" } + "%Translit%UnicodeName" { "Unicode Name" } + "%Translit%UnicodeChar" { "Unicode Character" } +} \ No newline at end of file diff --git a/icuSources/data/translit/root.txt b/icuSources/data/translit/root.txt new file mode 100644 index 00000000..96e9f48d --- /dev/null +++ b/icuSources/data/translit/root.txt @@ -0,0 +1,778 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004, International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// + +root{ + + RuleBasedTransliteratorIDs{ +//-------------------------------------------------------------------- +//-------------------------------------------------------------------- +// +// TRANSLITERATOR INDEX FILE. This file lists the non-algorithmic +// system transliterators. It allows arbitrary mappings between +// transliterator IDs and file names, and also allows the system to +// define aliases for transliterators, so that "Latin-Hangul", for +// example, can be implemented transparently as the compound +// "Latin-Jamo;Jamo-Hangul". Internal IDs may also be defined; these +// are invisible to the user, but can be composed together by the +// system to create visible transliterators. +// +// Blank lines and lines beginning with '#' are ignored. +// +// Lines in this file have one of the following forms (text not +// enclosed by <> is literal): +// +// :file::: +// :internal::: +// :alias: +// +// is the ID of the system transliterator being defined. These +// are public IDs enumerated by Transliterator.getAvailableIDs(), +// unless the second field is "internal". +// +// is a ResourceReader resource name. Currently these refer +// to file names under com/ibm/text/resources. This string is passed +// directly to ResourceReader, together with . +// +// is the character encoding to use when reading ; +// passed directly to ResourceReader. E.g., "UTF8". +// +// is either "FORWARD" or "REVERSE". +// +// is a string to be passed directly to +// Transliterator.getInstance(). The returned Transliterator object +// then has its ID changed to and is returned. + + +// Bidirectional rule files + + Fullwidth-Halfwidth { + file { + resource:include{"Fullwidth_Halfwidth.txt"} + direction{"FORWARD"} + } + } + Halfwidth-Fullwidth { + file { + resource:include{"Fullwidth_Halfwidth.txt"} + direction{"REVERSE"} + } + } + + Latin-Cyrillic { + file { + resource:include{"Cyrillic_Latin.txt"} + direction{"REVERSE"} + } + } + Cyrillic-Latin { + file { + resource:include{"Cyrillic_Latin.txt"} + direction{"FORWARD"} + } + } + + Latin-Hebrew { + file { + resource:include{"Hebrew_Latin.txt"} + direction{"REVERSE"} + } + } + Hebrew-Latin { + file { + resource:include{"Hebrew_Latin.txt"} + direction{"FORWARD"} + } + } + + Latin-Arabic { + file { + resource:include{"Arabic_Latin.txt"} + direction{"REVERSE"} + } + } + Arabic-Latin { + file { + resource:include{"Arabic_Latin.txt"} + direction{"FORWARD"} + } + } + + Tone-Digit { + internal { + resource:include{"Tone_Digit.txt"} + direction{"FORWARD"} + } + } + Digit-Tone { + internal { + resource:include{"Tone_Digit.txt"} + direction{"REVERSE"} + } + } + + Latin-NumericPinyin { + file { + resource:include{"Latin_NumericPinyin.txt"} + direction{"FORWARD"} + } + } + NumericPinyin-Latin { + file { + resource:include{"Latin_NumericPinyin.txt"} + direction{"REVERSE"} + } + } + + Han-Spacedhan { + internal { + resource:include{"Han_Spacedhan.txt"} + direction{"FORWARD"} + } + } + Spacedhan-Han { + alias {"null"} + } + + Han-Latin { + file { + resource:include{"Han_Latin.txt"} + direction{"FORWARD"} + } + } +//Latin-Han:file:Transliterator_Han_Latin.txt:UTF8:REVERSE # no round trip! + Latin-Han { + alias {"null"} + } + +// Comment these out; they are only for testing +// Latin-Han/definition:file:Transliterator_Han_Latin_Definition.txt:UTF8:REVERSE +// Han-Latin/definition:file:Transliterator_Han_Latin_Definition.txt:UTF8:FORWARD + +//Latin-Han/EDICT:file:Transliterator_Han_Latin_EDICT.txt:UTF8:REVERSE +//Han-Latin/EDICT:file:Transliterator_Han_Latin_EDICT.txt:UTF8:FORWARD + + Latin-Greek { + file { + resource:include{"Greek_Latin.txt"} + direction{"REVERSE"} + } + } + Greek-Latin { + file { + resource:include{"Greek_Latin.txt"} + direction{"FORWARD"} + } + } + + Latin-Greek/UNGEGN { + file { + resource:include{"Greek_Latin_UNGEGN.txt"} + direction{"REVERSE"} + } + } + Greek-Latin/UNGEGN { + file { + resource:include{"Greek_Latin_UNGEGN.txt"} + direction{"FORWARD"} + } + } + + Latin-Katakana { + file { + resource:include{"Latin_Katakana.txt"} + direction{"FORWARD"} + } + } + Katakana-Latin { + file { + resource:include{"Latin_Katakana.txt"} + direction{"REVERSE"} + } + } + + Latin-Hiragana { + file { + resource:include{"Hiragana_Latin.txt"} + direction{"REVERSE"} + } + } + Hiragana-Latin { + file { + resource:include{"Hiragana_Latin.txt"} + direction{"FORWARD"} + } + } + +//Thai Stuff: will change if we get \b into Transliterator + + Thai-ThaiSemi { + internal { + resource:include{"Thai_ThaiSemi.txt"} + direction{"FORWARD"} + } + } + + Thai-ThaiLogical { + internal { + resource:include{"Thai_ThaiLogical.txt"} + direction{"FORWARD"} + } + } + ThaiLogical-Thai { + internal { + resource:include{"Thai_ThaiLogical.txt"} + direction{"REVERSE"} + } + } + + ThaiLogical-Latin { + internal { + resource:include{"ThaiLogical_Latin.txt"} + direction{"FORWARD"} + } + } + Latin-ThaiLogical { + internal { + resource:include{"ThaiLogical_Latin.txt"} + direction{"REVERSE"} + } + } + +// Must use the order below! +// We need two separate passes because of the Thai vowel reversal +// Thai-Logical also converts spaces to semicolons. That has to be done before we insert latin spaces + + Thai-Latin { + alias {"[[:thai:] \u0E01-\u0E3A\u0E40-\u0E5B];NFD;Thai-ThaiSemi;Any-BreakInternal;Thai-ThaiLogical;ThaiLogical-Latin;NFC"} + } + Latin-Thai { + alias {"[[:Latin:][:Mn:][:Me:] \\u0020 \;0-9|~\u00A7\u00AB\u00BB\u02B9\u0374\u2021\u02CC];NFD;Latin-ThaiLogical;ThaiLogical-Thai;NFC"} + } + +// end of Thai Stuff + + Hiragana-Katakana { + file { + resource:include{"Hiragana_Katakana.txt"} + direction{"FORWARD"} + } + } + Katakana-Hiragana { + file { + resource:include{"Hiragana_Katakana.txt"} + direction{"REVERSE"} + } + } + + Any-Accents { + file { + resource:include{"Any_Accents.txt"} + direction{"FORWARD"} + } + } + Accents-Any { + file { + resource:include{"Any_Accents.txt"} + direction{"REVERSE"} + } + } + + Any-Publishing { + file { + resource:include{"Any_Publishing.txt"} + direction{"FORWARD"} + } + } + Publishing-Any { + file { + resource:include{"Any_Publishing.txt"} + direction{"REVERSE"} + } + } + +// Korean +// N.B. Don't end Latin-Jamo with NFC; that produces Hangul. For +// Hangul output use Latin-Hangul. + + LowerLatin-Jamo { + internal { + resource:include{"Latin_Jamo.txt"} + direction{"FORWARD"} + } + } + Jamo-LowerLatin { + internal { + resource:include{"Latin_Jamo.txt"} + direction{"REVERSE"} + } + } + Latin-Jamo { + alias {"['A-Za-z\u00C0-\u00C5\u00C7-\u00CF\u00D1-\u00D6\u00D9-\u00DD\u00E0-\u00E5\u00E7-\u00EF\u00F1-\u00F6\u00F9-\u00FD\u00FF-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E1\u01E6-\u01ED\u01F0\u01F4-\u01F5\u01F8-\u01FB\u0200-\u021B\u021E-\u021F\u0226-\u0233\u1E00-\u1E99\u1EA0-\u1EF9\u212A-\u212B];NFD;Lower;LowerLatin-Jamo"} + } + Jamo-Latin { + alias {"['\u1100-\u1112\u1161-\u1175\u11A8-\u11C2\uAC00-\uD7A3];NFD;Jamo-LowerLatin;NFC"} + } + Latin-Hangul { + alias {"['A-Za-z\u00C0-\u00C5\u00C7-\u00CF\u00D1-\u00D6\u00D9-\u00DD\u00E0-\u00E5\u00E7-\u00EF\u00F1-\u00F6\u00F9-\u00FD\u00FF-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E1\u01E6-\u01ED\u01F0\u01F4-\u01F5\u01F8-\u01FB\u0200-\u021B\u021E-\u021F\u0226-\u0233\u1E00-\u1E99\u1EA0-\u1EF9\u212A-\u212B];NFD;Lower;LowerLatin-Jamo;NFC"} + } + Hangul-Latin { + alias {"['\u1100-\u1112\u1161-\u1175\u11A8-\u11C2\u3131-\u313F\u3141-\u3143\u3145-\u3163\u3200-\u321C\u3260-\u327B\uAC00-\uD7A3\uFF07\uFFA1-\uFFAF\uFFB1-\uFFB3\uFFB5-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC];NFKD;Jamo-LowerLatin;NFC"} + } + +// Inter-Indic composed rules + Latin-InterIndic { + internal { + resource:include{"Latin_InterIndic.txt"} + direction{"FORWARD"} + } + } + Devanagari-InterIndic { + internal { + resource:include{"Devanagari_InterIndic.txt"} + direction{"FORWARD"} + } + } + Bengali-InterIndic { + internal { + resource:include{"Bengali_InterIndic.txt"} + direction{"FORWARD"} + } + } + Gurmukhi-InterIndic { + internal { + resource:include{"Gurmukhi_InterIndic.txt"} + direction{"FORWARD"} + } + } + Gujarati-InterIndic { + internal { + resource:include{"Gujarati_InterIndic.txt"} + direction{"FORWARD"} + } + } + Oriya-InterIndic { + internal { + resource:include{"Oriya_InterIndic.txt"} + direction{"FORWARD"} + } + } + Tamil-InterIndic { + internal { + resource:include{"Tamil_InterIndic.txt"} + direction{"FORWARD"} + } + } + Telugu-InterIndic { + internal { + resource:include{"Telugu_InterIndic.txt"} + direction{"FORWARD"} + } + } + Kannada-InterIndic { + internal { + resource:include{"Kannada_InterIndic.txt"} + direction{"FORWARD"} + } + } + Malayalam-InterIndic { + internal { + resource:include{"Malayalam_InterIndic.txt"} + direction{"FORWARD"} + } + } + + InterIndic-Latin { + internal { + resource:include{"InterIndic_Latin.txt"} + direction{"FORWARD"} + } + } + InterIndic-Devanagari { + internal { + resource:include{"InterIndic_Devanagari.txt"} + direction{"FORWARD"} + } + } + InterIndic-Bengali { + internal { + resource:include{"InterIndic_Bengali.txt"} + direction{"FORWARD"} + } + } + InterIndic-Gurmukhi { + internal { + resource:include{"InterIndic_Gurmukhi.txt"} + direction{"FORWARD"} + } + } + InterIndic-Gujarati { + internal { + resource:include{"InterIndic_Gujarati.txt"} + direction{"FORWARD"} + } + } + InterIndic-Oriya { + internal { + resource:include{"InterIndic_Oriya.txt"} + direction{"FORWARD"} + } + } + InterIndic-Tamil { + internal { + resource:include{"InterIndic_Tamil.txt"} + direction{"FORWARD"} + } + } + InterIndic-Telugu { + internal { + resource:include{"InterIndic_Telugu.txt"} + direction{"FORWARD"} + } + } + InterIndic-Kannada { + internal { + resource:include{"InterIndic_Kannada.txt"} + direction{"FORWARD"} + } + } + InterIndic-Malayalam { + internal { + resource:include{"InterIndic_Malayalam.txt"} + direction{"FORWARD"} + } + } + +//Latin-Indic transliterators + Latin-Devanagari { + alias {"['.0-9A-Za-z~\u00C0-\u00C5\u00C7-\u00CF\u00D1-\u00D6\u00D9-\u00DD\u00E0-\u00E5\u00E7-\u00EF\u00F1-\u00F6\u00F9-\u00FD\u00FF-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E3\u01E6-\u01ED\u01F0\u01F4-\u01F5\u01F8-\u021B\u021E-\u021F\u0226-\u0233\u0301\u0303-\u0304\u0306-\u0307\u0310\u0314-\u0315\u0323\u0325\u0331\u0341\u0344\u0385-\u0386\u0388-\u038A\u038C\u038E-\u0390\u03AC-\u03B0\u03CC-\u03CE\u03D3\u0403\u040C\u040E\u0419\u0439\u0453\u045C\u045E\u04C1-\u04C2\u04D0-\u04D1\u04D6-\u04D7\u04E2-\u04E3\u04EE-\u04EF\u1E00-\u1E99\u1EA0-\u1EF9\u1F01\u1F03-\u1F05\u1F07\u1F09\u1F0B-\u1F0D\u1F0F\u1F11\u1F13-\u1F15\u1F19\u1F1B-\u1F1D\u1F21\u1F23-\u1F25\u1F27\u1F29\u1F2B-\u1F2D\u1F2F\u1F31\u1F33-\u1F35\u1F37\u1F39\u1F3B-\u1F3D\u1F3F\u1F41\u1F43-\u1F45\u1F49\u1F4B-\u1F4D\u1F51\u1F53-\u1F55\u1F57\u1F59\u1F5B\u1F5D\u1F5F\u1F61\u1F63-\u1F65\u1F67\u1F69\u1F6B-\u1F6D\u1F6F\u1F71\u1F73\u1F75\u1F77\u1F79\u1F7B\u1F7D\u1F81\u1F83-\u1F85\u1F87\u1F89\u1F8B-\u1F8D\u1F8F\u1F91\u1F93-\u1F95\u1F97\u1F99\u1F9B-\u1F9D\u1F9F\u1FA1\u1FA3-\u1FA5\u1FA7\u1FA9\u1FAB-\u1FAD\u1FAF-\u1FB1\u1FB4\u1FB8-\u1FB9\u1FBB\u1FC4\u1FC9\u1FCB\u1FCE\u1FD0-\u1FD1\u1FD3\u1FD8-\u1FD9\u1FDB\u1FDE\u1FE0-\u1FE1\u1FE3\u1FE5\u1FE8-\u1FE9\u1FEB-\u1FEC\u1FEE\u1FF4\u1FF9\u1FFB\u212A-\u212B\uE04D\uE064];NFD;Lower;Latin-InterIndic;InterIndic-Devanagari;NFC"} + } + Latin-Bengali { + alias {"['.0-9A-Za-z~\u00C0-\u00C5\u00C7-\u00CF\u00D1-\u00D6\u00D9-\u00DD\u00E0-\u00E5\u00E7-\u00EF\u00F1-\u00F6\u00F9-\u00FD\u00FF-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E3\u01E6-\u01ED\u01F0\u01F4-\u01F5\u01F8-\u021B\u021E-\u021F\u0226-\u0233\u0301\u0303-\u0304\u0306-\u0307\u0310\u0314-\u0315\u0323\u0325\u0331\u0341\u0344\u0385-\u0386\u0388-\u038A\u038C\u038E-\u0390\u03AC-\u03B0\u03CC-\u03CE\u03D3\u0403\u040C\u040E\u0419\u0439\u0453\u045C\u045E\u04C1-\u04C2\u04D0-\u04D1\u04D6-\u04D7\u04E2-\u04E3\u04EE-\u04EF\u1E00-\u1E99\u1EA0-\u1EF9\u1F01\u1F03-\u1F05\u1F07\u1F09\u1F0B-\u1F0D\u1F0F\u1F11\u1F13-\u1F15\u1F19\u1F1B-\u1F1D\u1F21\u1F23-\u1F25\u1F27\u1F29\u1F2B-\u1F2D\u1F2F\u1F31\u1F33-\u1F35\u1F37\u1F39\u1F3B-\u1F3D\u1F3F\u1F41\u1F43-\u1F45\u1F49\u1F4B-\u1F4D\u1F51\u1F53-\u1F55\u1F57\u1F59\u1F5B\u1F5D\u1F5F\u1F61\u1F63-\u1F65\u1F67\u1F69\u1F6B-\u1F6D\u1F6F\u1F71\u1F73\u1F75\u1F77\u1F79\u1F7B\u1F7D\u1F81\u1F83-\u1F85\u1F87\u1F89\u1F8B-\u1F8D\u1F8F\u1F91\u1F93-\u1F95\u1F97\u1F99\u1F9B-\u1F9D\u1F9F\u1FA1\u1FA3-\u1FA5\u1FA7\u1FA9\u1FAB-\u1FAD\u1FAF-\u1FB1\u1FB4\u1FB8-\u1FB9\u1FBB\u1FC4\u1FC9\u1FCB\u1FCE\u1FD0-\u1FD1\u1FD3\u1FD8-\u1FD9\u1FDB\u1FDE\u1FE0-\u1FE1\u1FE3\u1FE5\u1FE8-\u1FE9\u1FEB-\u1FEC\u1FEE\u1FF4\u1FF9\u1FFB\u212A-\u212B\uE04D\uE064];NFD;Lower;Latin-InterIndic;InterIndic-Bengali;NFC"} + } + Latin-Gurmukhi { + alias {"['.0-9A-Za-z~\u00C0-\u00C5\u00C7-\u00CF\u00D1-\u00D6\u00D9-\u00DD\u00E0-\u00E5\u00E7-\u00EF\u00F1-\u00F6\u00F9-\u00FD\u00FF-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E3\u01E6-\u01ED\u01F0\u01F4-\u01F5\u01F8-\u021B\u021E-\u021F\u0226-\u0233\u0301\u0303-\u0304\u0306-\u0307\u0310\u0314-\u0315\u0323\u0325\u0331\u0341\u0344\u0385-\u0386\u0388-\u038A\u038C\u038E-\u0390\u03AC-\u03B0\u03CC-\u03CE\u03D3\u0403\u040C\u040E\u0419\u0439\u0453\u045C\u045E\u04C1-\u04C2\u04D0-\u04D1\u04D6-\u04D7\u04E2-\u04E3\u04EE-\u04EF\u1E00-\u1E99\u1EA0-\u1EF9\u1F01\u1F03-\u1F05\u1F07\u1F09\u1F0B-\u1F0D\u1F0F\u1F11\u1F13-\u1F15\u1F19\u1F1B-\u1F1D\u1F21\u1F23-\u1F25\u1F27\u1F29\u1F2B-\u1F2D\u1F2F\u1F31\u1F33-\u1F35\u1F37\u1F39\u1F3B-\u1F3D\u1F3F\u1F41\u1F43-\u1F45\u1F49\u1F4B-\u1F4D\u1F51\u1F53-\u1F55\u1F57\u1F59\u1F5B\u1F5D\u1F5F\u1F61\u1F63-\u1F65\u1F67\u1F69\u1F6B-\u1F6D\u1F6F\u1F71\u1F73\u1F75\u1F77\u1F79\u1F7B\u1F7D\u1F81\u1F83-\u1F85\u1F87\u1F89\u1F8B-\u1F8D\u1F8F\u1F91\u1F93-\u1F95\u1F97\u1F99\u1F9B-\u1F9D\u1F9F\u1FA1\u1FA3-\u1FA5\u1FA7\u1FA9\u1FAB-\u1FAD\u1FAF-\u1FB1\u1FB4\u1FB8-\u1FB9\u1FBB\u1FC4\u1FC9\u1FCB\u1FCE\u1FD0-\u1FD1\u1FD3\u1FD8-\u1FD9\u1FDB\u1FDE\u1FE0-\u1FE1\u1FE3\u1FE5\u1FE8-\u1FE9\u1FEB-\u1FEC\u1FEE\u1FF4\u1FF9\u1FFB\u212A-\u212B\uE04D\uE064];NFD;Lower;Latin-InterIndic;InterIndic-Gurmukhi;NFC"} + } + Latin-Gujarati { + alias {"['.0-9A-Za-z~\u00C0-\u00C5\u00C7-\u00CF\u00D1-\u00D6\u00D9-\u00DD\u00E0-\u00E5\u00E7-\u00EF\u00F1-\u00F6\u00F9-\u00FD\u00FF-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E3\u01E6-\u01ED\u01F0\u01F4-\u01F5\u01F8-\u021B\u021E-\u021F\u0226-\u0233\u0301\u0303-\u0304\u0306-\u0307\u0310\u0314-\u0315\u0323\u0325\u0331\u0341\u0344\u0385-\u0386\u0388-\u038A\u038C\u038E-\u0390\u03AC-\u03B0\u03CC-\u03CE\u03D3\u0403\u040C\u040E\u0419\u0439\u0453\u045C\u045E\u04C1-\u04C2\u04D0-\u04D1\u04D6-\u04D7\u04E2-\u04E3\u04EE-\u04EF\u1E00-\u1E99\u1EA0-\u1EF9\u1F01\u1F03-\u1F05\u1F07\u1F09\u1F0B-\u1F0D\u1F0F\u1F11\u1F13-\u1F15\u1F19\u1F1B-\u1F1D\u1F21\u1F23-\u1F25\u1F27\u1F29\u1F2B-\u1F2D\u1F2F\u1F31\u1F33-\u1F35\u1F37\u1F39\u1F3B-\u1F3D\u1F3F\u1F41\u1F43-\u1F45\u1F49\u1F4B-\u1F4D\u1F51\u1F53-\u1F55\u1F57\u1F59\u1F5B\u1F5D\u1F5F\u1F61\u1F63-\u1F65\u1F67\u1F69\u1F6B-\u1F6D\u1F6F\u1F71\u1F73\u1F75\u1F77\u1F79\u1F7B\u1F7D\u1F81\u1F83-\u1F85\u1F87\u1F89\u1F8B-\u1F8D\u1F8F\u1F91\u1F93-\u1F95\u1F97\u1F99\u1F9B-\u1F9D\u1F9F\u1FA1\u1FA3-\u1FA5\u1FA7\u1FA9\u1FAB-\u1FAD\u1FAF-\u1FB1\u1FB4\u1FB8-\u1FB9\u1FBB\u1FC4\u1FC9\u1FCB\u1FCE\u1FD0-\u1FD1\u1FD3\u1FD8-\u1FD9\u1FDB\u1FDE\u1FE0-\u1FE1\u1FE3\u1FE5\u1FE8-\u1FE9\u1FEB-\u1FEC\u1FEE\u1FF4\u1FF9\u1FFB\u212A-\u212B\uE04D\uE064];NFD;Lower;Latin-InterIndic;InterIndic-Gujarati;NFC"} + } + Latin-Oriya { + alias {"['.0-9A-Za-z~\u00C0-\u00C5\u00C7-\u00CF\u00D1-\u00D6\u00D9-\u00DD\u00E0-\u00E5\u00E7-\u00EF\u00F1-\u00F6\u00F9-\u00FD\u00FF-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E3\u01E6-\u01ED\u01F0\u01F4-\u01F5\u01F8-\u021B\u021E-\u021F\u0226-\u0233\u0301\u0303-\u0304\u0306-\u0307\u0310\u0314-\u0315\u0323\u0325\u0331\u0341\u0344\u0385-\u0386\u0388-\u038A\u038C\u038E-\u0390\u03AC-\u03B0\u03CC-\u03CE\u03D3\u0403\u040C\u040E\u0419\u0439\u0453\u045C\u045E\u04C1-\u04C2\u04D0-\u04D1\u04D6-\u04D7\u04E2-\u04E3\u04EE-\u04EF\u1E00-\u1E99\u1EA0-\u1EF9\u1F01\u1F03-\u1F05\u1F07\u1F09\u1F0B-\u1F0D\u1F0F\u1F11\u1F13-\u1F15\u1F19\u1F1B-\u1F1D\u1F21\u1F23-\u1F25\u1F27\u1F29\u1F2B-\u1F2D\u1F2F\u1F31\u1F33-\u1F35\u1F37\u1F39\u1F3B-\u1F3D\u1F3F\u1F41\u1F43-\u1F45\u1F49\u1F4B-\u1F4D\u1F51\u1F53-\u1F55\u1F57\u1F59\u1F5B\u1F5D\u1F5F\u1F61\u1F63-\u1F65\u1F67\u1F69\u1F6B-\u1F6D\u1F6F\u1F71\u1F73\u1F75\u1F77\u1F79\u1F7B\u1F7D\u1F81\u1F83-\u1F85\u1F87\u1F89\u1F8B-\u1F8D\u1F8F\u1F91\u1F93-\u1F95\u1F97\u1F99\u1F9B-\u1F9D\u1F9F\u1FA1\u1FA3-\u1FA5\u1FA7\u1FA9\u1FAB-\u1FAD\u1FAF-\u1FB1\u1FB4\u1FB8-\u1FB9\u1FBB\u1FC4\u1FC9\u1FCB\u1FCE\u1FD0-\u1FD1\u1FD3\u1FD8-\u1FD9\u1FDB\u1FDE\u1FE0-\u1FE1\u1FE3\u1FE5\u1FE8-\u1FE9\u1FEB-\u1FEC\u1FEE\u1FF4\u1FF9\u1FFB\u212A-\u212B\uE04D\uE064];NFD;Lower;Latin-InterIndic;InterIndic-Oriya;NFC"} + } + Latin-Tamil { + alias {"['.0-9A-Za-z~\u00C0-\u00C5\u00C7-\u00CF\u00D1-\u00D6\u00D9-\u00DD\u00E0-\u00E5\u00E7-\u00EF\u00F1-\u00F6\u00F9-\u00FD\u00FF-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E3\u01E6-\u01ED\u01F0\u01F4-\u01F5\u01F8-\u021B\u021E-\u021F\u0226-\u0233\u0301\u0303-\u0304\u0306-\u0307\u0310\u0314-\u0315\u0323\u0325\u0331\u0341\u0344\u0385-\u0386\u0388-\u038A\u038C\u038E-\u0390\u03AC-\u03B0\u03CC-\u03CE\u03D3\u0403\u040C\u040E\u0419\u0439\u0453\u045C\u045E\u04C1-\u04C2\u04D0-\u04D1\u04D6-\u04D7\u04E2-\u04E3\u04EE-\u04EF\u1E00-\u1E99\u1EA0-\u1EF9\u1F01\u1F03-\u1F05\u1F07\u1F09\u1F0B-\u1F0D\u1F0F\u1F11\u1F13-\u1F15\u1F19\u1F1B-\u1F1D\u1F21\u1F23-\u1F25\u1F27\u1F29\u1F2B-\u1F2D\u1F2F\u1F31\u1F33-\u1F35\u1F37\u1F39\u1F3B-\u1F3D\u1F3F\u1F41\u1F43-\u1F45\u1F49\u1F4B-\u1F4D\u1F51\u1F53-\u1F55\u1F57\u1F59\u1F5B\u1F5D\u1F5F\u1F61\u1F63-\u1F65\u1F67\u1F69\u1F6B-\u1F6D\u1F6F\u1F71\u1F73\u1F75\u1F77\u1F79\u1F7B\u1F7D\u1F81\u1F83-\u1F85\u1F87\u1F89\u1F8B-\u1F8D\u1F8F\u1F91\u1F93-\u1F95\u1F97\u1F99\u1F9B-\u1F9D\u1F9F\u1FA1\u1FA3-\u1FA5\u1FA7\u1FA9\u1FAB-\u1FAD\u1FAF-\u1FB1\u1FB4\u1FB8-\u1FB9\u1FBB\u1FC4\u1FC9\u1FCB\u1FCE\u1FD0-\u1FD1\u1FD3\u1FD8-\u1FD9\u1FDB\u1FDE\u1FE0-\u1FE1\u1FE3\u1FE5\u1FE8-\u1FE9\u1FEB-\u1FEC\u1FEE\u1FF4\u1FF9\u1FFB\u212A-\u212B\uE04D\uE064];NFD;Lower;Latin-InterIndic;InterIndic-Tamil;NFC"} + } + Latin-Telugu { + alias {"['.0-9A-Za-z~\u00C0-\u00C5\u00C7-\u00CF\u00D1-\u00D6\u00D9-\u00DD\u00E0-\u00E5\u00E7-\u00EF\u00F1-\u00F6\u00F9-\u00FD\u00FF-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E3\u01E6-\u01ED\u01F0\u01F4-\u01F5\u01F8-\u021B\u021E-\u021F\u0226-\u0233\u0301\u0303-\u0304\u0306-\u0307\u0310\u0314-\u0315\u0323\u0325\u0331\u0341\u0344\u0385-\u0386\u0388-\u038A\u038C\u038E-\u0390\u03AC-\u03B0\u03CC-\u03CE\u03D3\u0403\u040C\u040E\u0419\u0439\u0453\u045C\u045E\u04C1-\u04C2\u04D0-\u04D1\u04D6-\u04D7\u04E2-\u04E3\u04EE-\u04EF\u1E00-\u1E99\u1EA0-\u1EF9\u1F01\u1F03-\u1F05\u1F07\u1F09\u1F0B-\u1F0D\u1F0F\u1F11\u1F13-\u1F15\u1F19\u1F1B-\u1F1D\u1F21\u1F23-\u1F25\u1F27\u1F29\u1F2B-\u1F2D\u1F2F\u1F31\u1F33-\u1F35\u1F37\u1F39\u1F3B-\u1F3D\u1F3F\u1F41\u1F43-\u1F45\u1F49\u1F4B-\u1F4D\u1F51\u1F53-\u1F55\u1F57\u1F59\u1F5B\u1F5D\u1F5F\u1F61\u1F63-\u1F65\u1F67\u1F69\u1F6B-\u1F6D\u1F6F\u1F71\u1F73\u1F75\u1F77\u1F79\u1F7B\u1F7D\u1F81\u1F83-\u1F85\u1F87\u1F89\u1F8B-\u1F8D\u1F8F\u1F91\u1F93-\u1F95\u1F97\u1F99\u1F9B-\u1F9D\u1F9F\u1FA1\u1FA3-\u1FA5\u1FA7\u1FA9\u1FAB-\u1FAD\u1FAF-\u1FB1\u1FB4\u1FB8-\u1FB9\u1FBB\u1FC4\u1FC9\u1FCB\u1FCE\u1FD0-\u1FD1\u1FD3\u1FD8-\u1FD9\u1FDB\u1FDE\u1FE0-\u1FE1\u1FE3\u1FE5\u1FE8-\u1FE9\u1FEB-\u1FEC\u1FEE\u1FF4\u1FF9\u1FFB\u212A-\u212B\uE04D\uE064];NFD;Lower;Latin-InterIndic;InterIndic-Telugu;NFC"} + } + Latin-Kannada { + alias {"['.0-9A-Za-z~\u00C0-\u00C5\u00C7-\u00CF\u00D1-\u00D6\u00D9-\u00DD\u00E0-\u00E5\u00E7-\u00EF\u00F1-\u00F6\u00F9-\u00FD\u00FF-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E3\u01E6-\u01ED\u01F0\u01F4-\u01F5\u01F8-\u021B\u021E-\u021F\u0226-\u0233\u0301\u0303-\u0304\u0306-\u0307\u0310\u0314-\u0315\u0323\u0325\u0331\u0341\u0344\u0385-\u0386\u0388-\u038A\u038C\u038E-\u0390\u03AC-\u03B0\u03CC-\u03CE\u03D3\u0403\u040C\u040E\u0419\u0439\u0453\u045C\u045E\u04C1-\u04C2\u04D0-\u04D1\u04D6-\u04D7\u04E2-\u04E3\u04EE-\u04EF\u1E00-\u1E99\u1EA0-\u1EF9\u1F01\u1F03-\u1F05\u1F07\u1F09\u1F0B-\u1F0D\u1F0F\u1F11\u1F13-\u1F15\u1F19\u1F1B-\u1F1D\u1F21\u1F23-\u1F25\u1F27\u1F29\u1F2B-\u1F2D\u1F2F\u1F31\u1F33-\u1F35\u1F37\u1F39\u1F3B-\u1F3D\u1F3F\u1F41\u1F43-\u1F45\u1F49\u1F4B-\u1F4D\u1F51\u1F53-\u1F55\u1F57\u1F59\u1F5B\u1F5D\u1F5F\u1F61\u1F63-\u1F65\u1F67\u1F69\u1F6B-\u1F6D\u1F6F\u1F71\u1F73\u1F75\u1F77\u1F79\u1F7B\u1F7D\u1F81\u1F83-\u1F85\u1F87\u1F89\u1F8B-\u1F8D\u1F8F\u1F91\u1F93-\u1F95\u1F97\u1F99\u1F9B-\u1F9D\u1F9F\u1FA1\u1FA3-\u1FA5\u1FA7\u1FA9\u1FAB-\u1FAD\u1FAF-\u1FB1\u1FB4\u1FB8-\u1FB9\u1FBB\u1FC4\u1FC9\u1FCB\u1FCE\u1FD0-\u1FD1\u1FD3\u1FD8-\u1FD9\u1FDB\u1FDE\u1FE0-\u1FE1\u1FE3\u1FE5\u1FE8-\u1FE9\u1FEB-\u1FEC\u1FEE\u1FF4\u1FF9\u1FFB\u212A-\u212B\uE04D\uE064];NFD;Lower;Latin-InterIndic;InterIndic-Kannada;NFC"} + } + Latin-Malayalam { + alias {"['.0-9A-Za-z~\u00C0-\u00C5\u00C7-\u00CF\u00D1-\u00D6\u00D9-\u00DD\u00E0-\u00E5\u00E7-\u00EF\u00F1-\u00F6\u00F9-\u00FD\u00FF-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E3\u01E6-\u01ED\u01F0\u01F4-\u01F5\u01F8-\u021B\u021E-\u021F\u0226-\u0233\u0301\u0303-\u0304\u0306-\u0307\u0310\u0314-\u0315\u0323\u0325\u0331\u0341\u0344\u0385-\u0386\u0388-\u038A\u038C\u038E-\u0390\u03AC-\u03B0\u03CC-\u03CE\u03D3\u0403\u040C\u040E\u0419\u0439\u0453\u045C\u045E\u04C1-\u04C2\u04D0-\u04D1\u04D6-\u04D7\u04E2-\u04E3\u04EE-\u04EF\u1E00-\u1E99\u1EA0-\u1EF9\u1F01\u1F03-\u1F05\u1F07\u1F09\u1F0B-\u1F0D\u1F0F\u1F11\u1F13-\u1F15\u1F19\u1F1B-\u1F1D\u1F21\u1F23-\u1F25\u1F27\u1F29\u1F2B-\u1F2D\u1F2F\u1F31\u1F33-\u1F35\u1F37\u1F39\u1F3B-\u1F3D\u1F3F\u1F41\u1F43-\u1F45\u1F49\u1F4B-\u1F4D\u1F51\u1F53-\u1F55\u1F57\u1F59\u1F5B\u1F5D\u1F5F\u1F61\u1F63-\u1F65\u1F67\u1F69\u1F6B-\u1F6D\u1F6F\u1F71\u1F73\u1F75\u1F77\u1F79\u1F7B\u1F7D\u1F81\u1F83-\u1F85\u1F87\u1F89\u1F8B-\u1F8D\u1F8F\u1F91\u1F93-\u1F95\u1F97\u1F99\u1F9B-\u1F9D\u1F9F\u1FA1\u1FA3-\u1FA5\u1FA7\u1FA9\u1FAB-\u1FAD\u1FAF-\u1FB1\u1FB4\u1FB8-\u1FB9\u1FBB\u1FC4\u1FC9\u1FCB\u1FCE\u1FD0-\u1FD1\u1FD3\u1FD8-\u1FD9\u1FDB\u1FDE\u1FE0-\u1FE1\u1FE3\u1FE5\u1FE8-\u1FE9\u1FEB-\u1FEC\u1FEE\u1FF4\u1FF9\u1FFB\u212A-\u212B\uE04D\uE064];NFD;Lower;Latin-InterIndic;InterIndic-Malayalam;NFC"} + } + +//Indic-Latin transliterators + Devanagari-Latin { + alias {"[\u0901-\u0903\u0904\u0905-\u0939\u093C-\u094D\u0950-\u0954\u0958-\u096F];NFD;Devanagari-InterIndic;InterIndic-Latin;NFC"} + } + Bengali-Latin { + alias {"[\u0964-\u0965\u0981-\u0983\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7-\u09C8\u09CB-\u09CD\u09D7\u09DC-\u09DD\u09DF-\u09E3\u09E6-\u09FA];NFD;Bengali-InterIndic;InterIndic-Latin;NFC"} + } + Gurmukhi-Latin { + alias {"[\u0964-\u0965\u0A01\u0A02\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A3C\u0A3E-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A59-\u0A5C\u0A5E\u0A66-\u0A74];NFD;Gurmukhi-InterIndic;InterIndic-Latin;NFC"} + } + Gujarati-Latin { + alias {"[\u0964-\u0965\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF];NFD;Gujarati-InterIndic;InterIndic-Latin;NFC"} + } + Oriya-Latin { + alias {"[\u0964-\u0965\u0B01-\u0B03\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35\u0B36-\u0B39\u0B3C-\u0B43\u0B47-\u0B48\u0B4B-\u0B4D\u0B56-\u0B57\u0B5C-\u0B5D\u0B5F-\u0B61\u0B66-\u0B70\u0B71];NFD;Oriya-InterIndic;InterIndic-Latin;NFC"} + } + Tamil-Latin { + alias {"[0\u0B82-\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0BE7-\u0BF2];NFD;Tamil-InterIndic;InterIndic-Latin;NFC"} + } + Telugu-Latin { + alias {"[\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C60-\u0C61\u0C66-\u0C6F];NFD;Telugu-InterIndic;InterIndic-Latin;NFC"} + } + Kannada-Latin { + alias {"[\u0C82-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5-\u0CD6\u0CDE\u0CE0-\u0CE1\u0CE6-\u0CEF];NFD;Kannada-InterIndic;InterIndic-Latin;NFC"} + } + Malayalam-Latin { + alias {"[\u0D02-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D3E-\u0D43\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D60-\u0D61\u0D66-\u0D6F];NFD;Malayalam-InterIndic;InterIndic-Latin;NFC"} + } + + Devanagari-Bengali { + alias {"[\u0901-\u0903\u0904\u0905-\u0939\u093C-\u094D\u0950-\u0954\u0958-\u096F];NFD;Devanagari-InterIndic;InterIndic-Bengali;NFC"} + } + Devanagari-Gurmukhi { + alias {"[\u0901-\u0903\u0904\u0905-\u0939\u093C-\u094D\u0950-\u0954\u0958-\u096F];NFD;Devanagari-InterIndic;InterIndic-Gurmukhi;NFC"} + } + Devanagari-Gujarati { + alias {"[\u0901-\u0903\u0904\u0905-\u0939\u093C-\u094D\u0950-\u0954\u0958-\u096F];NFD;Devanagari-InterIndic;InterIndic-Gujarati;NFC"} + } + Devanagari-Oriya { + alias {"[\u0901-\u0903\u0904\u0905-\u0939\u093C-\u094D\u0950-\u0954\u0958-\u096F];NFD;Devanagari-InterIndic;InterIndic-Oriya;NFC"} + } + Devanagari-Tamil { + alias {"[\u0901-\u0903\u0904\u0905-\u0939\u093C-\u094D\u0950-\u0954\u0958-\u096F];NFD;Devanagari-InterIndic;InterIndic-Tamil;NFC"} + } + Devanagari-Telugu { + alias {"[\u0901-\u0903\u0904\u0905-\u0939\u093C-\u094D\u0950-\u0954\u0958-\u096F];NFD;Devanagari-InterIndic;InterIndic-Telugu;NFC"} + } + Devanagari-Kannada { + alias {"[\u0901-\u0903\u0904\u0905-\u0939\u093C-\u094D\u0950-\u0954\u0958-\u096F];NFD;Devanagari-InterIndic;InterIndic-Kannada;NFC"} + } + Devanagari-Malayalam { + alias {"[\u0901-\u0903\u0904\u0905-\u0939\u093C-\u094D\u0950-\u0954\u0958-\u096F];NFD;Devanagari-InterIndic;InterIndic-Malayalam;NFC"} + } + + Bengali-Devanagari { + alias {"[\u0964-\u0965\u0981-\u0983\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7-\u09C8\u09CB-\u09CD\u09D7\u09DC-\u09DD\u09DF-\u09E3\u09E6-\u09FA];NFD;Bengali-InterIndic;InterIndic-Devanagari;NFC"} + } + Bengali-Gurmukhi { + alias {"[\u0964-\u0965\u0981-\u0983\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7-\u09C8\u09CB-\u09CD\u09D7\u09DC-\u09DD\u09DF-\u09E3\u09E6-\u09FA];NFD;Bengali-InterIndic;InterIndic-Gurmukhi;NFC"} + } + Bengali-Gujarati { + alias {"[\u0964-\u0965\u0981-\u0983\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7-\u09C8\u09CB-\u09CD\u09D7\u09DC-\u09DD\u09DF-\u09E3\u09E6-\u09FA];NFD;Bengali-InterIndic;InterIndic-Gujarati;NFC"} + } + Bengali-Oriya { + alias {"[\u0964-\u0965\u0981-\u0983\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7-\u09C8\u09CB-\u09CD\u09D7\u09DC-\u09DD\u09DF-\u09E3\u09E6-\u09FA];NFD;Bengali-InterIndic;InterIndic-Oriya;NFC"} + } + Bengali-Tamil { + alias {"[\u0964-\u0965\u0981-\u0983\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7-\u09C8\u09CB-\u09CD\u09D7\u09DC-\u09DD\u09DF-\u09E3\u09E6-\u09FA];NFD;Bengali-InterIndic;InterIndic-Tamil;NFC"} + } + Bengali-Telugu { + alias {"[\u0964-\u0965\u0981-\u0983\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7-\u09C8\u09CB-\u09CD\u09D7\u09DC-\u09DD\u09DF-\u09E3\u09E6-\u09FA];NFD;Bengali-InterIndic;InterIndic-Telugu;NFC"} + } + Bengali-Kannada { + alias {"[\u0964-\u0965\u0981-\u0983\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7-\u09C8\u09CB-\u09CD\u09D7\u09DC-\u09DD\u09DF-\u09E3\u09E6-\u09FA];NFD;Bengali-InterIndic;InterIndic-Kannada;NFC"} + } + Bengali-Malayalam { + alias {"[\u0964-\u0965\u0981-\u0983\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7-\u09C8\u09CB-\u09CD\u09D7\u09DC-\u09DD\u09DF-\u09E3\u09E6-\u09FA];NFD;Bengali-InterIndic;InterIndic-Malayalam;NFC"} + } + + Gurmukhi-Devanagari { + alias {"[\u0964-\u0965\u0A01\u0A02\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A3C\u0A3E-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A59-\u0A5C\u0A5E\u0A66-\u0A74];NFD;Gurmukhi-InterIndic;InterIndic-Devanagari;NFC"} + } + Gurmukhi-Bengali { + alias {"[\u0964-\u0965\u0A01\u0A02\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A3C\u0A3E-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A59-\u0A5C\u0A5E\u0A66-\u0A74];NFD;Gurmukhi-InterIndic;InterIndic-Bengali;NFC"} + } + Gurmukhi-Gujarati { + alias {"[\u0964-\u0965\u0A01\u0A02\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A3C\u0A3E-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A59-\u0A5C\u0A5E\u0A66-\u0A74];NFD;Gurmukhi-InterIndic;InterIndic-Gujarati;NFC"} + } + Gurmukhi-Oriya { + alias {"[\u0964-\u0965\u0A01\u0A02\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A3C\u0A3E-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A59-\u0A5C\u0A5E\u0A66-\u0A74];NFD;Gurmukhi-InterIndic;InterIndic-Oriya;NFC"} + } + Gurmukhi-Tamil { + alias {"[\u0964-\u0965\u0A01\u0A02\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A3C\u0A3E-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A59-\u0A5C\u0A5E\u0A66-\u0A74];NFD;Gurmukhi-InterIndic;InterIndic-Tamil;NFC"} + } + Gurmukhi-Telugu { + alias {"[\u0964-\u0965\u0A01\u0A02\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A3C\u0A3E-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A59-\u0A5C\u0A5E\u0A66-\u0A74];NFD;Gurmukhi-InterIndic;InterIndic-Telugu;NFC"} + } + Gurmukhi-Kannada { + alias {"[\u0964-\u0965\u0A01\u0A02\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A3C\u0A3E-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A59-\u0A5C\u0A5E\u0A66-\u0A74];NFD;Gurmukhi-InterIndic;InterIndic-Kannada;NFC"} + } + Gurmukhi-Malayalam { + alias {"[\u0964-\u0965\u0A01\u0A02\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A3C\u0A3E-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A59-\u0A5C\u0A5E\u0A66-\u0A74];NFD;Gurmukhi-InterIndic;InterIndic-Malayalam;NFC"} + } + + Gujarati-Devanagari { + alias {"[\u0964-\u0965\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF];NFD;Gujarati-InterIndic;InterIndic-Devanagari;NFC"} + } + Gujarati-Bengali { + alias {"[\u0964-\u0965\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF];NFD;Gujarati-InterIndic;InterIndic-Bengali;NFC"} + } + Gujarati-Gurmukhi { + alias {"[\u0964-\u0965\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF];NFD;Gujarati-InterIndic;InterIndic-Gurmukhi;NFC"} + } + Gujarati-Oriya { + alias {"[\u0964-\u0965\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF];NFD;Gujarati-InterIndic;InterIndic-Oriya;NFC"} + } + Gujarati-Tamil { + alias {"[\u0964-\u0965\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF];NFD;Gujarati-InterIndic;InterIndic-Tamil;NFC"} + } + Gujarati-Telugu { + alias {"[\u0964-\u0965\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF];NFD;Gujarati-InterIndic;InterIndic-Telugu;NFC"} + } + Gujarati-Kannada { + alias {"[\u0964-\u0965\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF];NFD;Gujarati-InterIndic;InterIndic-Kannada;NFC"} + } + Gujarati-Malayalam { + alias {"[\u0964-\u0965\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF];NFD;Gujarati-InterIndic;InterIndic-Malayalam;NFC"} + } + + Oriya-Devanagari { + alias {"[\u0B01-\u0B03\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3C-\u0B43\u0B47-\u0B48\u0B4B-\u0B4D\u0B56-\u0B57\u0B5C-\u0B5D\u0B5F-\u0B61\u0B66-\u0B71];NFD;Oriya-InterIndic;InterIndic-Devanagari;NFC"} + } + Oriya-Bengali { + alias {"[\u0B01-\u0B03\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3C-\u0B43\u0B47-\u0B48\u0B4B-\u0B4D\u0B56-\u0B57\u0B5C-\u0B5D\u0B5F-\u0B61\u0B66-\u0B71];NFD;Oriya-InterIndic;InterIndic-Bengali;NFC"} + } + Oriya-Gurmukhi { + alias {"[\u0B01-\u0B03\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3C-\u0B43\u0B47-\u0B48\u0B4B-\u0B4D\u0B56-\u0B57\u0B5C-\u0B5D\u0B5F-\u0B61\u0B66-\u0B71];NFD;Oriya-InterIndic;InterIndic-Gurmukhi;NFC"} + } + Oriya-Gujarati { + alias {"[\u0B01-\u0B03\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3C-\u0B43\u0B47-\u0B48\u0B4B-\u0B4D\u0B56-\u0B57\u0B5C-\u0B5D\u0B5F-\u0B61\u0B66-\u0B71];NFD;Oriya-InterIndic;InterIndic-Gujarati;NFC"} + } + Oriya-Tamil { + alias {"[\u0B01-\u0B03\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3C-\u0B43\u0B47-\u0B48\u0B4B-\u0B4D\u0B56-\u0B57\u0B5C-\u0B5D\u0B5F-\u0B61\u0B66-\u0B71];NFD;Oriya-InterIndic;InterIndic-Tamil;NFC"} + } + Oriya-Telugu { + alias {"[\u0B01-\u0B03\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3C-\u0B43\u0B47-\u0B48\u0B4B-\u0B4D\u0B56-\u0B57\u0B5C-\u0B5D\u0B5F-\u0B61\u0B66-\u0B71];NFD;Oriya-InterIndic;InterIndic-Telugu;NFC"} + } + Oriya-Kannada { + alias {"[\u0B01-\u0B03\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3C-\u0B43\u0B47-\u0B48\u0B4B-\u0B4D\u0B56-\u0B57\u0B5C-\u0B5D\u0B5F-\u0B61\u0B66-\u0B71];NFD;Oriya-InterIndic;InterIndic-Kannada;NFC"} + } + Oriya-Malayalam { + alias {"[\u0B01-\u0B03\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3C-\u0B43\u0B47-\u0B48\u0B4B-\u0B4D\u0B56-\u0B57\u0B5C-\u0B5D\u0B5F-\u0B61\u0B66-\u0B71];NFD;Oriya-InterIndic;InterIndic-Malayalam;NFC"} + } + + Tamil-Devanagari { + alias {"[0\u0B82-\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0BE7-\u0BF2];NFD;Tamil-InterIndic;InterIndic-Devanagari;NFC"} + } + Tamil-Bengali { + alias {"[0\u0B82-\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0BE7-\u0BF2];NFD;Tamil-InterIndic;InterIndic-Bengali;NFC"} + } + Tamil-Gurmukhi { + alias {"[0\u0B82-\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0BE7-\u0BF2];NFD;Tamil-InterIndic;InterIndic-Gurmukhi;NFC"} + } + Tamil-Gujarati { + alias {"[0\u0B82-\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0BE7-\u0BF2];NFD;Tamil-InterIndic;InterIndic-Gujarati;NFC"} + } + Tamil-Oriya { + alias {"[0\u0B82-\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0BE7-\u0BF2];NFD;Tamil-InterIndic;InterIndic-Oriya;NFC"} + } + Tamil-Telugu { + alias {"[0\u0B82-\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0BE7-\u0BF2];NFD;Tamil-InterIndic;InterIndic-Telugu;NFC"} + } + Tamil-Kannada { + alias {"[0\u0B82-\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0BE7-\u0BF2];NFD;Tamil-InterIndic;InterIndic-Kannada;NFC"} + } + Tamil-Malayalam { + alias {"[0\u0B82-\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0BE7-\u0BF2];NFD;Tamil-InterIndic;InterIndic-Malayalam;NFC"} + } + + Telugu-Devanagari { + alias {"[\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C60-\u0C61\u0C66-\u0C6F];NFD;Telugu-InterIndic;InterIndic-Devanagari;NFC"} + } + Telugu-Bengali { + alias {"[\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C60-\u0C61\u0C66-\u0C6F];NFD;Telugu-InterIndic;InterIndic-Bengali;NFC"} + } + Telugu-Gurmukhi { + alias {"[\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C60-\u0C61\u0C66-\u0C6F];NFD;Telugu-InterIndic;InterIndic-Gurmukhi;NFC"} + } + Telugu-Gujarati { + alias {"[\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C60-\u0C61\u0C66-\u0C6F];NFD;Telugu-InterIndic;InterIndic-Gujarati;NFC"} + } + Telugu-Oriya { + alias {"[\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C60-\u0C61\u0C66-\u0C6F];NFD;Telugu-InterIndic;InterIndic-Oriya;NFC"} + } + Telugu-Tamil { + alias {"[\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C60-\u0C61\u0C66-\u0C6F];NFD;Telugu-InterIndic;InterIndic-Tamil;NFC"} + } + Telugu-Kannada { + alias {"[\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C60-\u0C61\u0C66-\u0C6F];NFD;Telugu-InterIndic;InterIndic-Kannada;NFC"} + } + Telugu-Malayalam { + alias {"[\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C60-\u0C61\u0C66-\u0C6F];NFD;Telugu-InterIndic;InterIndic-Malayalam;NFC"} + } + + Kannada-Devanagari { + alias {"[\u0C82-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC\u0CBD\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5-\u0CD6\u0CDE\u0CE0-\u0CE1\u0CE6-\u0CEF];NFD;Kannada-InterIndic;InterIndic-Devanagari;NFC"} + } + Kannada-Bengali { + alias {"[\u0C82-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC\u0CBD\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5-\u0CD6\u0CDE\u0CE0-\u0CE1\u0CE6-\u0CEF];NFD;Kannada-InterIndic;InterIndic-Bengali;NFC"} + } + Kannada-Gurmukhi { + alias {"[\u0C82-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC\u0CBD\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5-\u0CD6\u0CDE\u0CE0-\u0CE1\u0CE6-\u0CEF];NFD;Kannada-InterIndic;InterIndic-Gurmukhi;NFC"} + } + Kannada-Gujarati { + alias {"[\u0C82-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC\u0CBD\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5-\u0CD6\u0CDE\u0CE0-\u0CE1\u0CE6-\u0CEF];NFD;Kannada-InterIndic;InterIndic-Gujarati;NFC"} + } + Kannada-Oriya { + alias {"[\u0C82-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC\u0CBD\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5-\u0CD6\u0CDE\u0CE0-\u0CE1\u0CE6-\u0CEF];NFD;Kannada-InterIndic;InterIndic-Oriya;NFC"} + } + Kannada-Tamil { + alias {"[\u0C82-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC\u0CBD\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5-\u0CD6\u0CDE\u0CE0-\u0CE1\u0CE6-\u0CEF];NFD;Kannada-InterIndic;InterIndic-Tamil;NFC"} + } + Kannada-Telugu { + alias {"[\u0C82-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC\u0CBD\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5-\u0CD6\u0CDE\u0CE0-\u0CE1\u0CE6-\u0CEF];NFD;Kannada-InterIndic;InterIndic-Telugu;NFC"} + } + Kannada-Malayalam { + alias {"[\u0C82-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC\u0CBD\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5-\u0CD6\u0CDE\u0CE0-\u0CE1\u0CE6-\u0CEF];NFD;Kannada-InterIndic;InterIndic-Malayalam;NFC"} + } + + Malayalam-Devanagari { + alias {"[\u0D02-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D3E-\u0D43\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D60-\u0D61\u0D66-\u0D6F];NFD;Malayalam-InterIndic;InterIndic-Devanagari;NFC"} + } + Malayalam-Bengali { + alias {"[\u0D02-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D3E-\u0D43\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D60-\u0D61\u0D66-\u0D6F];NFD;Malayalam-InterIndic;InterIndic-Bengali;NFC"} + } + Malayalam-Gurmukhi { + alias {"[\u0D02-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D3E-\u0D43\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D60-\u0D61\u0D66-\u0D6F];NFD;Malayalam-InterIndic;InterIndic-Gurmukhi;NFC"} + } + Malayalam-Gujarati { + alias {"[\u0D02-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D3E-\u0D43\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D60-\u0D61\u0D66-\u0D6F];NFD;Malayalam-InterIndic;InterIndic-Gujarati;NFC"} + } + Malayalam-Oriya { + alias {"[\u0D02-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D3E-\u0D43\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D60-\u0D61\u0D66-\u0D6F];NFD;Malayalam-InterIndic;InterIndic-Oriya;NFC"} + } + Malayalam-Tamil { + alias {"[\u0D02-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D3E-\u0D43\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D60-\u0D61\u0D66-\u0D6F];NFD;Malayalam-InterIndic;InterIndic-Tamil;NFC"} + } + Malayalam-Telugu { + alias {"[\u0D02-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D3E-\u0D43\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D60-\u0D61\u0D66-\u0D6F];NFD;Malayalam-InterIndic;InterIndic-Telugu;NFC"} + } + Malayalam-Kannada { + alias {"[\u0D02-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D3E-\u0D43\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D60-\u0D61\u0D66-\u0D6F];NFD;Malayalam-InterIndic;InterIndic-Kannada;NFC"} + } + /* + # Comment these out; they are only for testing + Latin-Han/definition{ + file { + resource:include{"Han_Latin_Definition.txt"} + direction{"REVERSE"} + } + } + Han-Latin/definition{ + file { + resource:include{"Han_Latin_Definition.txt"} + direction{"FORWARD"} + } + } + Latin-Han/EDICT{ + file { + resource:include{"Han_Latin_EDICT.txt"} + direction{"REVERSE"} + } + } + Han-Latin/EDICT{ + file { + resource:include{"Han_Latin_EDICT.txt"} + direction{"FORWARD"} + } + } + */ +// eof + } + TransliteratorNamePattern { + // Format for the display name of a Transliterator. + // This is the language-neutral form of this resource. + "{0,choice,0#|1#{1}|2#{1}-{2}}" // Display name + } + + // Transliterator display names + // This is the English form of this resource. + "%Translit%Hex" { "%Translit%Hex" } + "%Translit%UnicodeName" { "%Translit%UnicodeName" } + "%Translit%UnicodeChar" { "%Translit%UnicodeChar" } + + TransliterateLATIN{ + "", + "" + } + +} diff --git a/icuSources/data/translit/t_Any_Accents.txt b/icuSources/data/translit/t_Any_Accents.txt deleted file mode 100644 index d2dc7fc5..00000000 --- a/icuSources/data/translit/t_Any_Accents.txt +++ /dev/null @@ -1,306 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_Any_Accents.txt -// Date: Sat Jul 27 10:31:01 2002 -//-------------------------------------------------------------------- - -// Any_Accents - -t_Any_Accents { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -":: NFD (NFC) ;" - -// to do: make reversible - -// define special conversion characters. -// varients of this could use different characters, or set one or the other to null. - -"$pre = \\\< ;" -"$post = \\\> ;" - -// Provide keyboard equivalents for common diacritics used in transliteration - -"$pre \\\` $post <> \u0300 ;" // COMBINING GRAVE ACCENT -"$pre \\\' $post <> \u0301 ;" // COMBINING ACUTE ACCENT -"$pre \\\^ $post <> \u0302 ;" // COMBINING CIRCUMFLEX ACCENT -"$pre \\\~ $post <> \u0303 ;" // COMBINING TILDE -"$pre \\\- $post <> \u0304 ;" // COMBINING MACRON -"$pre \\\" $post <> \u0308 ;" // COMBINING DIAERESIS -"$pre \\\* $post <> \u030A ;" // COMBINING RING ABOVE -"$pre \\\, $post <> \u0327 ;" // COMBINING CEDILLA -"$pre '/' $post <> \u0338 ;" // COMBINING LONG SOLIDUS OVERLAY -"$pre \\\. $post <> \u0323 ;" // COMBINING DOT BELOW - -// Combine common characters - -"$pre AE $post <> \u00C6 ;" // LATIN CAPITAL LETTER AE -"$pre ae $post <> \u00E6 ;" // LATIN SMALL LETTER AE -"$pre D $post <> \u00D0 ;" // LATIN CAPITAL LETTER ETH -"$pre d $post <> \u00F0 ;" // LATIN SMALL LETTER ETH -"$pre O'/' $post <> \u00D8 ;" // LATIN CAPITAL LETTER O WITH STROKE -"$pre o'/' $post <> \u00F8 ;" // LATIN SMALL LETTER O WITH STROKE -"$pre TH $post <> \u00DE ;" // LATIN CAPITAL LETTER THORN -"$pre th $post <> \u00FE ;" // LATIN SMALL LETTER THORN -"$pre OE $post <> \u0152 ;" // LATIN CAPITAL LIGATURE OE -"$pre oe $post <> \u0153 ;" // LATIN SMALL LIGATURE OE - -"$pre ss $post <> \u00DF ;" // LATIN SMALL LETTER SHARP S - -"$pre NG $post <> \u014A ;" // LATIN CAPITAL LETTER ENG -"$pre ng $post <> \u014B ;" // LATIN SMALL LETTER ENG - -"$pre T $post <> \u0398 ;" // THETA -"$pre t $post <> \u03B8 ;" // THETA -"$pre SH $post <> \u01A9 ;" // LATIN CAPITAL LETTER ESH -"$pre sh $post <> \u0283 ;" // LATIN SMALL LETTER ESH -"$pre ZH $post <> \u01B7 ;" // LATIN CAPITAL LETTER EZH -"$pre zh $post <> \u0292 ;" // LATIN SMALL LETTER EZH - -"$pre U $post <> \u01B1 ;" // LATIN CAPITAL LETTER UPSILON -"$pre u $post <> \u028A ;" // LATIN SMALL LETTER UPSILON -"$pre A $post <> \u018F ;" // LATIN CAPITAL LETTER SCHWA -"$pre a $post <> \u0259 ;" // LATIN SMALL LETTER SCHWA -"$pre O $post <> \u0186 ;" // LATIN CAPITAL LETTER OPEN O -"$pre o $post <> \u0254 ;" // LATIN SMALL LETTER OPEN O -"$pre E $post <> \u0190 ;" // LATIN CAPITAL LETTER OPEN E -"$pre e $post <> \u025B ;" // LATIN SMALL LETTER OPEN E - -// three that don't have uppercases - -"$pre '?' $post <> \u0294 ;" // LATIN LETTER GLOTTAL STOP -"$pre i $post <> \u026A ;" // LATIN LETTER SMALL CAPITAL I -"$pre v $post <> \u028C ;" // LATIN SMALL LETTER TURNED V - -// Additional Characters that may be added in the future - -// $pre XXX $post <> \u0306 ; # COMBINING BREVE -// $pre XXX $post <> \u0307 ; # COMBINING DOT ABOVE -// $pre XXX $post <> \u0309 ; # COMBINING HOOK ABOVE -// $pre XXX $post <> \u030B ; # COMBINING DOUBLE ACUTE ACCENT -// $pre XXX $post <> \u030C ; # COMBINING CARON -// $pre XXX $post <> \u030F ; # COMBINING DOUBLE GRAVE ACCENT -// $pre XXX $post <> \u0311 ; # COMBINING INVERTED BREVE -// $pre XXX $post <> \u0313 ; # COMBINING COMMA ABOVE -// $pre XXX $post <> \u0314 ; # COMBINING REVERSED COMMA ABOVE -// $pre XXX $post <> \u031B ; # COMBINING HORN -// $pre XXX $post <> \u0324 ; # COMBINING DIAERESIS BELOW -// $pre XXX $post <> \u0325 ; # COMBINING RING BELOW -// $pre XXX $post <> \u0326 ; # COMBINING COMMA BELOW -// $pre XXX $post <> \u0328 ; # COMBINING OGONEK -// $pre XXX $post <> \u032D ; # COMBINING CIRCUMFLEX ACCENT BELOW -// $pre XXX $post <> \u032E ; # COMBINING BREVE BELOW -// $pre XXX $post <> \u0330 ; # COMBINING TILDE BELOW -// $pre XXX $post <> \u0331 ; # COMBINING MACRON BELOW - -// $pre YYY $post <> \u00AA ; # FEMININE ORDINAL INDICATOR -// $pre YYY $post <> \u00BA ; # MASCULINE ORDINAL INDICATOR -// $pre YYY $post <> \u0110 ; # LATIN CAPITAL LETTER D WITH STROKE -// $pre YYY $post <> \u0111 ; # LATIN SMALL LETTER D WITH STROKE -// $pre YYY $post <> \u0126 ; # LATIN CAPITAL LETTER H WITH STROKE -// $pre YYY $post <> \u0127 ; # LATIN SMALL LETTER H WITH STROKE -// $pre YYY $post <> \u0131 ; # LATIN SMALL LETTER DOTLESS I -// $pre YYY $post <> \u0138 ; # LATIN SMALL LETTER KRA -// $pre YYY $post <> \u013F ; # LATIN CAPITAL LETTER L WITH MIDDLE DOT -// $pre YYY $post <> \u0140 ; # LATIN SMALL LETTER L WITH MIDDLE DOT -// $pre YYY $post <> \u0141 ; # LATIN CAPITAL LETTER L WITH STROKE -// $pre YYY $post <> \u0142 ; # LATIN SMALL LETTER L WITH STROKE -// $pre YYY $post <> \u0149 ; # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE -// $pre YYY $post <> \u0166 ; # LATIN CAPITAL LETTER T WITH STROKE -// $pre YYY $post <> \u0167 ; # LATIN SMALL LETTER T WITH STROKE -// $pre YYY $post <> \u017F ; # LATIN SMALL LETTER LONG S -// $pre YYY $post <> \u0180 ; # LATIN SMALL LETTER B WITH STROKE -// $pre YYY $post <> \u0181 ; # LATIN CAPITAL LETTER B WITH HOOK -// $pre YYY $post <> \u0182 ; # LATIN CAPITAL LETTER B WITH TOPBAR -// $pre YYY $post <> \u0183 ; # LATIN SMALL LETTER B WITH TOPBAR -// $pre YYY $post <> \u0184 ; # LATIN CAPITAL LETTER TONE SIX -// $pre YYY $post <> \u0185 ; # LATIN SMALL LETTER TONE SIX -// $pre YYY $post <> \u0187 ; # LATIN CAPITAL LETTER C WITH HOOK -// $pre YYY $post <> \u0188 ; # LATIN SMALL LETTER C WITH HOOK -// $pre YYY $post <> \u0189 ; # LATIN CAPITAL LETTER AFRICAN D -// $pre YYY $post <> \u018A ; # LATIN CAPITAL LETTER D WITH HOOK -// $pre YYY $post <> \u018B ; # LATIN CAPITAL LETTER D WITH TOPBAR -// $pre YYY $post <> \u018C ; # LATIN SMALL LETTER D WITH TOPBAR -// $pre YYY $post <> \u018D ; # LATIN SMALL LETTER TURNED DELTA -// $pre YYY $post <> \u018E ; # LATIN CAPITAL LETTER REVERSED E -// $pre YYY $post <> \u0191 ; # LATIN CAPITAL LETTER F WITH HOOK -// $pre YYY $post <> \u0192 ; # LATIN SMALL LETTER F WITH HOOK -// $pre YYY $post <> \u0193 ; # LATIN CAPITAL LETTER G WITH HOOK -// $pre YYY $post <> \u0194 ; # LATIN CAPITAL LETTER GAMMA -// $pre YYY $post <> \u0195 ; # LATIN SMALL LETTER HV -// $pre YYY $post <> \u0196 ; # LATIN CAPITAL LETTER IOTA -// $pre YYY $post <> \u0197 ; # LATIN CAPITAL LETTER I WITH STROKE -// $pre YYY $post <> \u0198 ; # LATIN CAPITAL LETTER K WITH HOOK -// $pre YYY $post <> \u0199 ; # LATIN SMALL LETTER K WITH HOOK -// $pre YYY $post <> \u019A ; # LATIN SMALL LETTER L WITH BAR -// $pre YYY $post <> \u019B ; # LATIN SMALL LETTER LAMBDA WITH STROKE -// $pre YYY $post <> \u019C ; # LATIN CAPITAL LETTER TURNED M -// $pre YYY $post <> \u019D ; # LATIN CAPITAL LETTER N WITH LEFT HOOK -// $pre YYY $post <> \u019E ; # LATIN SMALL LETTER N WITH LONG RIGHT LEG -// $pre YYY $post <> \u019F ; # LATIN CAPITAL LETTER O WITH MIDDLE TILDE -// $pre YYY $post <> \u01A2 ; # LATIN CAPITAL LETTER OI -// $pre YYY $post <> \u01A3 ; # LATIN SMALL LETTER OI -// $pre YYY $post <> \u01A4 ; # LATIN CAPITAL LETTER P WITH HOOK -// $pre YYY $post <> \u01A5 ; # LATIN SMALL LETTER P WITH HOOK -// $pre YYY $post <> \u01A6 ; # LATIN LETTER YR -// $pre YYY $post <> \u01A7 ; # LATIN CAPITAL LETTER TONE TWO -// $pre YYY $post <> \u01A8 ; # LATIN SMALL LETTER TONE TWO -// $pre YYY $post <> \u01AA ; # LATIN LETTER REVERSED ESH LOOP -// $pre YYY $post <> \u01AB ; # LATIN SMALL LETTER T WITH PALATAL HOOK -// $pre YYY $post <> \u01AC ; # LATIN CAPITAL LETTER T WITH HOOK -// $pre YYY $post <> \u01AD ; # LATIN SMALL LETTER T WITH HOOK -// $pre YYY $post <> \u01AE ; # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK -// $pre YYY $post <> \u01B2 ; # LATIN CAPITAL LETTER V WITH HOOK -// $pre YYY $post <> \u01B3 ; # LATIN CAPITAL LETTER Y WITH HOOK -// $pre YYY $post <> \u01B4 ; # LATIN SMALL LETTER Y WITH HOOK -// $pre YYY $post <> \u01B5 ; # LATIN CAPITAL LETTER Z WITH STROKE -// $pre YYY $post <> \u01B6 ; # LATIN SMALL LETTER Z WITH STROKE -// $pre YYY $post <> \u01B8 ; # LATIN CAPITAL LETTER EZH REVERSED -// $pre YYY $post <> \u01B9 ; # LATIN SMALL LETTER EZH REVERSED -// $pre YYY $post <> \u01BA ; # LATIN SMALL LETTER EZH WITH TAIL -// $pre YYY $post <> \u01BB ; # LATIN LETTER TWO WITH STROKE -// $pre YYY $post <> \u01BC ; # LATIN CAPITAL LETTER TONE FIVE -// $pre YYY $post <> \u01BD ; # LATIN SMALL LETTER TONE FIVE -// $pre YYY $post <> \u01BE ; # LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE -// $pre YYY $post <> \u01BF ; # LATIN LETTER WYNN -// $pre YYY $post <> \u01C0 ; # LATIN LETTER DENTAL CLICK -// $pre YYY $post <> \u01C1 ; # LATIN LETTER LATERAL CLICK -// $pre YYY $post <> \u01C2 ; # LATIN LETTER ALVEOLAR CLICK -// $pre YYY $post <> \u01C3 ; # LATIN LETTER RETROFLEX CLICK -// $pre YYY $post <> \u01C4 ; # LATIN CAPITAL LETTER DZ WITH CARON -// $pre YYY $post <> \u01C5 ; # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON -// $pre YYY $post <> \u01C6 ; # LATIN SMALL LETTER DZ WITH CARON -// $pre YYY $post <> \u01C7 ; # LATIN CAPITAL LETTER LJ -// $pre YYY $post <> \u01C8 ; # LATIN CAPITAL LETTER L WITH SMALL LETTER J -// $pre YYY $post <> \u01C9 ; # LATIN SMALL LETTER LJ -// $pre YYY $post <> \u01CA ; # LATIN CAPITAL LETTER NJ -// $pre YYY $post <> \u01CB ; # LATIN CAPITAL LETTER N WITH SMALL LETTER J -// $pre YYY $post <> \u01CC ; # LATIN SMALL LETTER NJ -// $pre YYY $post <> \u01DD ; # LATIN SMALL LETTER TURNED E -// $pre YYY $post <> \u01E4 ; # LATIN CAPITAL LETTER G WITH STROKE -// $pre YYY $post <> \u01E5 ; # LATIN SMALL LETTER G WITH STROKE -// $pre YYY $post <> \u01F1 ; # LATIN CAPITAL LETTER DZ -// $pre YYY $post <> \u01F2 ; # LATIN CAPITAL LETTER D WITH SMALL LETTER Z -// $pre YYY $post <> \u01F3 ; # LATIN SMALL LETTER DZ -// $pre YYY $post <> \u01F6 ; # LATIN CAPITAL LETTER HWAIR -// $pre YYY $post <> \u01F7 ; # LATIN CAPITAL LETTER WYNN -// $pre YYY $post <> \u021C ; # LATIN CAPITAL LETTER YOGH -// $pre YYY $post <> \u021D ; # LATIN SMALL LETTER YOGH -// $pre YYY $post <> \u0222 ; # LATIN CAPITAL LETTER OU -// $pre YYY $post <> \u0223 ; # LATIN SMALL LETTER OU -// $pre YYY $post <> \u0224 ; # LATIN CAPITAL LETTER Z WITH HOOK -// $pre YYY $post <> \u0225 ; # LATIN SMALL LETTER Z WITH HOOK -// $pre YYY $post <> \u0250 ; # LATIN SMALL LETTER TURNED A -// $pre YYY $post <> \u0251 ; # LATIN SMALL LETTER ALPHA -// $pre YYY $post <> \u0252 ; # LATIN SMALL LETTER TURNED ALPHA -// $pre YYY $post <> \u0253 ; # LATIN SMALL LETTER B WITH HOOK -// $pre YYY $post <> \u0255 ; # LATIN SMALL LETTER C WITH CURL -// $pre YYY $post <> \u0256 ; # LATIN SMALL LETTER D WITH TAIL -// $pre YYY $post <> \u0257 ; # LATIN SMALL LETTER D WITH HOOK -// $pre YYY $post <> \u0258 ; # LATIN SMALL LETTER REVERSED E -// $pre YYY $post <> \u025A ; # LATIN SMALL LETTER SCHWA WITH HOOK -// $pre YYY $post <> \u025C ; # LATIN SMALL LETTER REVERSED OPEN E -// $pre YYY $post <> \u025D ; # LATIN SMALL LETTER REVERSED OPEN E WITH HOOK -// $pre YYY $post <> \u025E ; # LATIN SMALL LETTER CLOSED REVERSED OPEN E -// $pre YYY $post <> \u025F ; # LATIN SMALL LETTER DOTLESS J WITH STROKE -// $pre YYY $post <> \u0260 ; # LATIN SMALL LETTER G WITH HOOK -// $pre YYY $post <> \u0261 ; # LATIN SMALL LETTER SCRIPT G -// $pre YYY $post <> \u0262 ; # LATIN LETTER SMALL CAPITAL G -// $pre YYY $post <> \u0263 ; # LATIN SMALL LETTER GAMMA -// $pre YYY $post <> \u0264 ; # LATIN SMALL LETTER RAMS HORN -// $pre YYY $post <> \u0265 ; # LATIN SMALL LETTER TURNED H -// $pre YYY $post <> \u0266 ; # LATIN SMALL LETTER H WITH HOOK -// $pre YYY $post <> \u0267 ; # LATIN SMALL LETTER HENG WITH HOOK -// $pre YYY $post <> \u0268 ; # LATIN SMALL LETTER I WITH STROKE -// $pre YYY $post <> \u0269 ; # LATIN SMALL LETTER IOTA -// $pre YYY $post <> \u026B ; # LATIN SMALL LETTER L WITH MIDDLE TILDE -// $pre YYY $post <> \u026C ; # LATIN SMALL LETTER L WITH BELT -// $pre YYY $post <> \u026D ; # LATIN SMALL LETTER L WITH RETROFLEX HOOK -// $pre YYY $post <> \u026E ; # LATIN SMALL LETTER LEZH -// $pre YYY $post <> \u026F ; # LATIN SMALL LETTER TURNED M -// $pre YYY $post <> \u0270 ; # LATIN SMALL LETTER TURNED M WITH LONG LEG -// $pre YYY $post <> \u0271 ; # LATIN SMALL LETTER M WITH HOOK -// $pre YYY $post <> \u0272 ; # LATIN SMALL LETTER N WITH LEFT HOOK -// $pre YYY $post <> \u0273 ; # LATIN SMALL LETTER N WITH RETROFLEX HOOK -// $pre YYY $post <> \u0274 ; # LATIN LETTER SMALL CAPITAL N -// $pre YYY $post <> \u0275 ; # LATIN SMALL LETTER BARRED O -// $pre YYY $post <> \u0276 ; # LATIN LETTER SMALL CAPITAL OE -// $pre YYY $post <> \u0277 ; # LATIN SMALL LETTER CLOSED OMEGA -// $pre YYY $post <> \u0278 ; # LATIN SMALL LETTER PHI -// $pre YYY $post <> \u0279 ; # LATIN SMALL LETTER TURNED R -// $pre YYY $post <> \u027A ; # LATIN SMALL LETTER TURNED R WITH LONG LEG -// $pre YYY $post <> \u027B ; # LATIN SMALL LETTER TURNED R WITH HOOK -// $pre YYY $post <> \u027C ; # LATIN SMALL LETTER R WITH LONG LEG -// $pre YYY $post <> \u027D ; # LATIN SMALL LETTER R WITH TAIL -// $pre YYY $post <> \u027E ; # LATIN SMALL LETTER R WITH FISHHOOK -// $pre YYY $post <> \u027F ; # LATIN SMALL LETTER REVERSED R WITH FISHHOOK -// $pre YYY $post <> \u0280 ; # LATIN LETTER SMALL CAPITAL R -// $pre YYY $post <> \u0281 ; # LATIN LETTER SMALL CAPITAL INVERTED R -// $pre YYY $post <> \u0282 ; # LATIN SMALL LETTER S WITH HOOK -// $pre YYY $post <> \u0284 ; # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK -// $pre YYY $post <> \u0285 ; # LATIN SMALL LETTER SQUAT REVERSED ESH -// $pre YYY $post <> \u0286 ; # LATIN SMALL LETTER ESH WITH CURL -// $pre YYY $post <> \u0287 ; # LATIN SMALL LETTER TURNED T -// $pre YYY $post <> \u0288 ; # LATIN SMALL LETTER T WITH RETROFLEX HOOK -// $pre YYY $post <> \u0289 ; # LATIN SMALL LETTER U BAR -// $pre YYY $post <> \u028B ; # LATIN SMALL LETTER V WITH HOOK -// $pre YYY $post <> \u028D ; # LATIN SMALL LETTER TURNED W -// $pre YYY $post <> \u028E ; # LATIN SMALL LETTER TURNED Y -// $pre YYY $post <> \u028F ; # LATIN LETTER SMALL CAPITAL Y -// $pre YYY $post <> \u0290 ; # LATIN SMALL LETTER Z WITH RETROFLEX HOOK -// $pre YYY $post <> \u0291 ; # LATIN SMALL LETTER Z WITH CURL -// $pre YYY $post <> \u0293 ; # LATIN SMALL LETTER EZH WITH CURL -// $pre YYY $post <> \u0294 ; # LATIN LETTER GLOTTAL STOP -// $pre YYY $post <> \u0295 ; # LATIN LETTER PHARYNGEAL VOICED FRICATIVE -// $pre YYY $post <> \u0296 ; # LATIN LETTER INVERTED GLOTTAL STOP -// $pre YYY $post <> \u0297 ; # LATIN LETTER STRETCHED C -// $pre YYY $post <> \u0298 ; # LATIN LETTER BILABIAL CLICK -// $pre YYY $post <> \u0299 ; # LATIN LETTER SMALL CAPITAL B -// $pre YYY $post <> \u029A ; # LATIN SMALL LETTER CLOSED OPEN E -// $pre YYY $post <> \u029B ; # LATIN LETTER SMALL CAPITAL G WITH HOOK -// $pre YYY $post <> \u029C ; # LATIN LETTER SMALL CAPITAL H -// $pre YYY $post <> \u029D ; # LATIN SMALL LETTER J WITH CROSSED-TAIL -// $pre YYY $post <> \u029E ; # LATIN SMALL LETTER TURNED K -// $pre YYY $post <> \u029F ; # LATIN LETTER SMALL CAPITAL L -// $pre YYY $post <> \u02A0 ; # LATIN SMALL LETTER Q WITH HOOK -// $pre YYY $post <> \u02A1 ; # LATIN LETTER GLOTTAL STOP WITH STROKE -// $pre YYY $post <> \u02A2 ; # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE -// $pre YYY $post <> \u02A3 ; # LATIN SMALL LETTER DZ DIGRAPH -// $pre YYY $post <> \u02A4 ; # LATIN SMALL LETTER DEZH DIGRAPH -// $pre YYY $post <> \u02A5 ; # LATIN SMALL LETTER DZ DIGRAPH WITH CURL -// $pre YYY $post <> \u02A6 ; # LATIN SMALL LETTER TS DIGRAPH -// $pre YYY $post <> \u02A7 ; # LATIN SMALL LETTER TESH DIGRAPH -// $pre YYY $post <> \u02A8 ; # LATIN SMALL LETTER TC DIGRAPH WITH CURL -// $pre YYY $post <> \u02A9 ; # LATIN SMALL LETTER FENG DIGRAPH -// $pre YYY $post <> \u02AA ; # LATIN SMALL LETTER LS DIGRAPH -// $pre YYY $post <> \u02AB ; # LATIN SMALL LETTER LZ DIGRAPH -// $pre YYY $post <> \u02AC ; # LATIN LETTER BILABIAL PERCUSSIVE -// $pre YYY $post <> \u02AD ; # LATIN LETTER BIDENTAL PERCUSSIVE -// $pre YYY $post <> \u02B0 ; # MODIFIER LETTER SMALL H -// $pre YYY $post <> \u02B1 ; # MODIFIER LETTER SMALL H WITH HOOK -// $pre YYY $post <> \u02B2 ; # MODIFIER LETTER SMALL J -// $pre YYY $post <> \u02B3 ; # MODIFIER LETTER SMALL R -// $pre YYY $post <> \u02B4 ; # MODIFIER LETTER SMALL TURNED R -// $pre YYY $post <> \u02B5 ; # MODIFIER LETTER SMALL TURNED R WITH HOOK -// $pre YYY $post <> \u02B6 ; # MODIFIER LETTER SMALL CAPITAL INVERTED R -// $pre YYY $post <> \u02B7 ; # MODIFIER LETTER SMALL W -// $pre YYY $post <> \u02B8 ; # MODIFIER LETTER SMALL Y -// $pre YYY $post <> \u02E0 ; # MODIFIER LETTER SMALL GAMMA -// $pre YYY $post <> \u02E1 ; # MODIFIER LETTER SMALL L -// $pre YYY $post <> \u02E2 ; # MODIFIER LETTER SMALL S -// $pre YYY $post <> \u02E3 ; # MODIFIER LETTER SMALL X -// $pre YYY $post <> \u02E4 ; # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP -// $pre YYY $post <> \u1E9A ; # LATIN SMALL LETTER A WITH RIGHT HALF RING -// $pre YYY $post <> \u207F ; # SUPERSCRIPT LATIN SMALL LETTER N - -":: NFC (NFD) ;" - } -} diff --git a/icuSources/data/translit/t_Any_Publishing.txt b/icuSources/data/translit/t_Any_Publishing.txt deleted file mode 100644 index c14c27a6..00000000 --- a/icuSources/data/translit/t_Any_Publishing.txt +++ /dev/null @@ -1,50 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_Any_Publishing.txt -// Date: Sat Jul 27 10:31:01 2002 -//-------------------------------------------------------------------- - -// Any_Publishing - -t_Any_Publishing { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// Test case -// "The" "(quick)" ('brown') `fox' ` jumped -- "over?" - -// Variables - -"$single = \\\' ;" -"$space = ' ' ;" -"$double = \\\" ;" -"$back = \\\` ;" -"$tab = '\u0008' ;" -"$makeRight = [[:Z:][:Ps:][:Pi:]$] ;" - -// fix UNIX quotes - -"$back $back > “ ;" -"$back > ‘ ;" - -// fix typewriter quotes, by context - -"$makeRight {$double} <> “ ;" -"$double <> ” ;" - -"$makeRight {$single} <> ‘ ;" -"$single <> ’;" - -// fix multiple spaces and hyphens - -"$space {$space} > ;" -"'--' <> — ;" - } -} diff --git a/icuSources/data/translit/t_Arab_Latn.txt b/icuSources/data/translit/t_Arab_Latn.txt deleted file mode 100644 index 13d6c590..00000000 --- a/icuSources/data/translit/t_Arab_Latn.txt +++ /dev/null @@ -1,162 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_Arabic_Latin.txt -// Date: Sat Jul 27 10:31:01 2002 -//-------------------------------------------------------------------- - -// Arabic_Latin - -t_Arab_Latn { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// Generally follows UNGEGN -// Occasionally deviates in the direction of ISO 233 -// a) where required for disambiguation. -// b) with underdot instead of cedilla for letter like SAD, since -// those are explicitly in Unicode for transliteration. -// c) with extra non-Arabic-language letters, like PEH - -// Does *not* do assimilation of "al", nor hyphenation. -// While it could be done, we need to determine whether a prefix "al" could -// occur other than as the definite article (since no space is used). - -":: [[:Arabic:] [‎ⁿ\u060C\u061B\u061F\u0640\u064B-\u0655\u0660-\u066C\u06F0-\u06F9\uFDFC]] ;" -":: NFKD (NFC);" -"$disambig = ̱ ;" -"$disambig2 = ̰ ;" -"$under = ̣ ;" - -"$notAbove = [[:^ccc=0:]&[:^ccc=230:]];" - -// non-letters - - "٫ <> '.' $disambig ;" // ARABIC DECIMAL SEPARATOR - "٬ <> ',' $disambig ;" // ARABIC THOUSANDS SEPARATOR -// ٭ <> ; # ARABIC FIVE POINTED STAR // no need to transliterate - -"، <> ',' ;" // ARABIC COMMA - "؛ <> ';' ;" // ARABIC SEMICOLON - "؟ <> '?' ;" // ARABIC QUESTION MARK - "٪ <> '%' ;" // ARABIC PERCENT SIGN - - "۰ <> 0 $disambig ;" // EXTENDED ARABIC-INDIC DIGIT ZERO - "۱ <> 1 $disambig ;" // EXTENDED ARABIC-INDIC DIGIT ONE - "۲ <> 2 $disambig ;" // EXTENDED ARABIC-INDIC DIGIT TWO - "۳ <> 3 $disambig ;" // EXTENDED ARABIC-INDIC DIGIT THREE - "۴ <> 4 $disambig ;" // EXTENDED ARABIC-INDIC DIGIT FOUR - "۵ <> 5 $disambig ;" // EXTENDED ARABIC-INDIC DIGIT FIVE - "۶ <> 6 $disambig ;" // EXTENDED ARABIC-INDIC DIGIT SIX - "۷ <> 7 $disambig ;" // EXTENDED ARABIC-INDIC DIGIT SEVEN - "۸ <> 8 $disambig ;" // EXTENDED ARABIC-INDIC DIGIT EIGHT - "۹ <> 9 $disambig ;" // EXTENDED ARABIC-INDIC DIGIT NINE - - "٠ <> 0 ;" // ARABIC-INDIC DIGIT ZERO - "١ <> 1 ;" // ARABIC-INDIC DIGIT ONE - "٢ <> 2 ;" // ARABIC-INDIC DIGIT TWO - "٣ <> 3 ;" // ARABIC-INDIC DIGIT THREE - "٤ <> 4 ;" // ARABIC-INDIC DIGIT FOUR - "٥ <> 5 ;" // ARABIC-INDIC DIGIT FIVE - "٦ <> 6 ;" // ARABIC-INDIC DIGIT SIX - "٧ <> 7 ;" // ARABIC-INDIC DIGIT SEVEN - "٨ <> 8 ;" // ARABIC-INDIC DIGIT EIGHT - "٩ <> 9 ;" // ARABIC-INDIC DIGIT NINE - -// letters - -// long vowels - "َا<> ā ;" // ARABIC FATHA, ARABIC LETTER ALEF - "ُو <> ū ;" // ARABIC DAMMA, ARABIC LETTER WAW - "ِي <> ī ;" // ARABIC KASRA, ARABIC LETTER YEH - -// longer items moved here to prevent masking - "ث <> t h $disambig ;" // ARABIC LETTER THEH - "ذ <> d h $disambig ;" // ARABIC LETTER THAL - "ش <> s h $disambig ;" // ARABIC LETTER SHEEN - "ص <> s $under ;" // ARABIC LETTER SAD - "ض <> d $under ;" // ARABIC LETTER DAD - "ط <> t $under ;" // ARABIC LETTER TAH - "ظ <> z $under ;" // ARABIC LETTER ZAH - "غ <> g h $disambig ;" // ARABIC LETTER GHAIN - -// WARNING: special case -// will be canonically ordered as -// so on the return, we have to skip over (but preserve) the half-ring below (or others like it) -// ةٕ < ẗ̹ ; # LATIN SMALL LETTER T, COMBINING RIGHT HALF RING BELOW, COMBINING DIAERESIS - - "ة <> t \u0308 ;" // ARABIC LETTER TEH MARBUTA - "ة | $1 < t ($notAbove+) \u0308 ;" // ARABIC LETTER TEH MARBUTA - -// non-Arabic language - "ژ <> z h $disambig ;" // ARABIC LETTER JEH - "ڭ <> n $disambig g ;" // ARABIC LETTER NG - "ۋ <> v $disambig ;" // ARABIC LETTER VE - "ی <> y $disambig2 ;" // ARABIC LETTER FARSI YEH - -// Arabic language - - "ء <> ʾ ;" // ARABIC LETTER HAMZA - "ا <> a $under;" // ARABIC LETTER ALEF - "ب <> b ;" // ARABIC LETTER BEH - "ت <> t ;" // ARABIC LETTER TEH - "ج <> j ;" // ARABIC LETTER JEEM - "ح <> h $under ;" // ARABIC LETTER HAH - "خ <> k h $disambig ;" // ARABIC LETTER KHAH - "د <> d ;" // ARABIC LETTER DAL - "ر <> r ;" // ARABIC LETTER REH - "ز <> z ;" // ARABIC LETTER ZAIN - "س <> s ;" // ARABIC LETTER SEEN - "ع <> ʿ ;" // ARABIC LETTER AIN - "ـ > ;" // ARABIC TATWEEL - "ف <> f ;" // ARABIC LETTER FEH - "ق <> q ;" // ARABIC LETTER QAF - "ك <> k ;" // ARABIC LETTER KAF - "ل <> l ;" // ARABIC LETTER LAM - "م <> m ;" // ARABIC LETTER MEEM - "ن <> n ;" // ARABIC LETTER NOON - "ه <> h ;" // ARABIC LETTER HEH - "و <> w ;" // ARABIC LETTER WAW - "ى <> y $disambig ;" // ARABIC LETTER ALEF MAKSURA - "ي <> y ;" // ARABIC LETTER YEH - "ً <> aⁿ ;" // ARABIC FATHATAN - "ٌ <> uⁿ ;" // ARABIC DAMMATAN - "ٍ <> iⁿ ;" // ARABIC KASRATAN - "َ <> a ;" // ARABIC FATHA - "ُ <> u ;" // ARABIC DAMMA - "ِ <> i ;" // ARABIC KASRA - "ّ <> ̃ ;" // ARABIC SHADDA - "ْ <> ̊ ;" // ARABIC SUKUN - -// special combining marks - "ٓ <> ̂ ;" // ARABIC MADDAH ABOVE - "ٔ <> ̉ ;" // ARABIC HAMZA ABOVE - "ٕ <> ̹ ;" // ARABIC HAMZA BELOW - -// Some non-Arabic language (not in UNGEGN) - "پ <> p ;" // ARABIC LETTER PEH - "چ <> c h $disambig ;" // ARABIC LETTER TCHEH - "ڤ <> v ;" // ARABIC LETTER VEH -// ڥ <> v $disambig ; # ARABIC LETTER FEH WITH THREE DOTS BELOW -// ڢ <> f $disambig ; # ARABIC LETTER FEH WITH DOT MOVED BELOW - "گ <> g ;" // ARABIC LETTER GAF - -// fallbacks -"| s < c } [eiy];" -"| k < c ;" -"| i < e ;" -"| u < o ;" -"| ks < x ;" -"| n < ‎ⁿ;" - -":: (lower) ;" -"::NFC (NFD);" -":: ( [[:Latin:] [%,.0-9;?\u02BE-\u02BF\u0302-\u0304\u0308-\u030A\u0323\u0330-\u0331\u0339\u037E]] );" - } -} diff --git a/icuSources/data/translit/t_Beng_InterIndic.txt b/icuSources/data/translit/t_Beng_InterIndic.txt deleted file mode 100644 index 9d6967d3..00000000 --- a/icuSources/data/translit/t_Beng_InterIndic.txt +++ /dev/null @@ -1,117 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_Bengali_InterIndic.txt -// Date: Sat Jul 27 10:31:01 2002 -//-------------------------------------------------------------------- - -// Bengali_InterIndic - -t_Beng_InterIndic { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// Bengali-InterIndic - -"\u09C7\u09BE>\uE04B;" // VOWEL SIGN O -"\u09C7\u09D7>\uE04C;" // VOWEL SIGN AU -"\u0981>\uE001;" // SIGN CANDRABINDU -"\u0982>\uE002;" // SIGN ANUSVARA -"\u0983>\uE003;" // SIGN VISARGA -"\u0985>\uE005;" // LETTER A -"\u0986>\uE006;" // LETTER AA -"\u0987>\uE007;" // LETTER I -"\u0988>\uE008;" // LETTER II -"\u0989>\uE009;" // LETTER U -"\u098A>\uE00A;" // LETTER UU -"\u098B>\uE00B;" // LETTER VOCALIC R -"\u098C>\uE00C;" // LETTER VOCALIC L -"\u098F>\uE00F;" // LETTER E -"\u0990>\uE010;" // LETTER AI -"\u0993>\uE013;" // LETTER O -"\u0994>\uE014;" // LETTER AU -"\u0995>\uE015;" // LETTER KA -"\u0996>\uE016;" // LETTER KHA -"\u0997>\uE017;" // LETTER GA -"\u0998>\uE018;" // LETTER GHA -"\u0999>\uE019;" // LETTER NGA -"\u099A>\uE01A;" // LETTER CA -"\u099B>\uE01B;" // LETTER CHA -"\u099C>\uE01C;" // LETTER JA -"\u099D>\uE01D;" // LETTER JHA -"\u099E>\uE01E;" // LETTER NYA -"\u099F>\uE01F;" // LETTER TTA -"\u09A0>\uE020;" // LETTER TTHA -"\u09A1>\uE021;" // LETTER DDA -"\u09A2>\uE022;" // LETTER DDHA -"\u09A3>\uE023;" // LETTER NNA -"\u09A4>\uE024;" // LETTER TA -"\u09A5>\uE025;" // LETTER THA -"\u09A6>\uE026;" // LETTER DA -"\u09A7>\uE027;" // LETTER DHA -"\u09A8>\uE028;" // LETTER NA -"\u09AA>\uE02A;" // LETTER PA -"\u09AB>\uE02B;" // LETTER PHA -"\u09AC>\uE02C;" // LETTER BA -"\u09AD>\uE02D;" // LETTER BHA -"\u09AE>\uE02E;" // LETTER MA -"\u09AF>\uE02F;" // LETTER YA -"\u09B0>\uE030;" // LETTER RA -"\u09B2>\uE032;" // LETTER LA -"\u09B6>\uE036;" // LETTER SHA -"\u09B7>\uE037;" // LETTER SSA -"\u09B8>\uE038;" // LETTER SA -"\u09B9>\uE039;" // LETTER HA -"\u09BC>\uE03C;" // SIGN NUKTA -"\u09BE>\uE03E;" // VOWEL SIGN AA -"\u09BF>\uE03F;" // VOWEL SIGN I -"\u09C0>\uE040;" // VOWEL SIGN II -"\u09C1>\uE041;" // VOWEL SIGN U -"\u09C2>\uE042;" // VOWEL SIGN UU -"\u09C3>\uE043;" // VOWEL SIGN VOCALIC R -"\u09C4>\uE044;" // VOWEL SIGN VOCALIC RR -"\u09C7>\uE047;" // VOWEL SIGN E -"\u09C8>\uE048;" // VOWEL SIGN AI -"\u09CB>\uE04B;" -"\u09CC>\uE04C;" -// -"\u09CD>\uE04D;" // SIGN VIRAMA -"\u09D7>\uE057;" // AU LENGTH MARK -// -"\u09E0>\uE060;" // LETTER VOCALIC RR -"\u09E1>\uE061;" // LETTER VOCALIC LL -"\u09E2>\uE062;" // VOWEL SIGN VOCALIC L -"\u09E3>\uE063;" // VOWEL SIGN VOCALIC LL -"\u09E6>\uE066;" // DIGIT ZERO -"\u09E7>\uE067;" // DIGIT ONE -"\u09E8>\uE068;" // DIGIT TWO -"\u09E9>\uE069;" // DIGIT THREE -"\u09EA>\uE06A;" // DIGIT FOUR -"\u09EB>\uE06B;" // DIGIT FIVE -"\u09EC>\uE06C;" // DIGIT SIX -"\u09ED>\uE06D;" // DIGIT SEVEN -"\u09EE>\uE06E;" // DIGIT EIGHT -"\u09EF>\uE06F;" // DIGIT NINE -"\u09F0>;" // UNMAPPED Bengali-InterIndic: LETTER RA WITH MIDDLE DIAGONAL -"\u09F1>;" // UNMAPPED Bengali-InterIndic: LETTER RA WITH LOWER DIAGONAL -"\u09F2>;" // UNMAPPED Bengali-InterIndic: RUPEE MARK -"\u09F3>;" // UNMAPPED Bengali-InterIndic: RUPEE SIGN -"\u09F4>;" // UNMAPPED Bengali-InterIndic: CURRENCY NUMERATOR ONE -"\u09F5>;" // UNMAPPED Bengali-InterIndic: CURRENCY NUMERATOR TWO -"\u09F6>;" // UNMAPPED Bengali-InterIndic: CURRENCY NUMERATOR THREE -"\u09F7>;" // UNMAPPED Bengali-InterIndic: CURRENCY NUMERATOR FOUR -"\u09F8>;" // UNMAPPED Bengali-InterIndic: CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR -"\u09F9>;" // UNMAPPED Bengali-InterIndic: CURRENCY DENOMINATOR SIXTEEN -"\u09FA>;" // ISSHAR -"\u0964>\ue064;" // DANDA -"\u0965>\ue065;" // DOUBLE DANDA -// :: NFC (NFD) ; -// eof - } -} diff --git a/icuSources/data/translit/t_Cyrl_Latn.txt b/icuSources/data/translit/t_Cyrl_Latn.txt deleted file mode 100644 index 9d6dd1c8..00000000 --- a/icuSources/data/translit/t_Cyrl_Latn.txt +++ /dev/null @@ -1,322 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_Cyrillic_Latin.txt -// Date: Sat Jul 27 10:31:01 2002 -//-------------------------------------------------------------------- - -// Cyrillic_Latin - -t_Cyrl_Latn { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -// TODO: add remaining characters -// Should add variants for Russian-English, Russian-German -// Those can use this as a base, and then remap cases -// like a $hat to ya or ja. - -// :: [\\u0000-\u007E \u02B9 \u02BA [:Cyrillic:] [:Latin:] [:nonspacing mark:]] ; -//## WARNING, \u0308 must be added to the generated filters, in both directions ### -// MINIMAL FILTER -":: [\u0308\u0102-\u0103\u0114-\u0115\u011E-\u011F\u012C-\u012D\u014E-\u014F\u016C-\u016D\u0306\u0400-\u045F\u0490-\u0495\u0498-\u0499\u04C1-\u04C2\u04D0-\u04DF\u04E2-\u04E7\u04EC-\u04F5\u04F8-\u04F9\u1E1C-\u1E1D\u1EAE-\u1EB7\u1FB0\u1FB8\u1FD0\u1FD8\u1FE0\u1FE8] ;" -":: NFD (NFC) ;" - -"$modprime = \u02B9;" -"$modprime2 = \u02BA;" - -"$grave = \u0300;" -"$acute = \u0301;" -"$hat = \u0302;" -"$breve = \u0306 ;" -"$dot = \u0307 ;" -"$caron = \u030C ;" -"$comma = \u0326 ;" -"$under = \u0331 ;" - -// move up so not masked - -"я <> a $hat ;" // CYRILLIC SMALL LETTER YA -"Я <> A $hat ;" // CYRILLIC CAPITAL LETTER YA - -"ч <> c $caron ;" // CYRILLIC SMALL LETTER CHE -"Ч <> C $caron;" // CYRILLIC CAPITAL LETTER CHE -// ҷ <> XXX ; # CYRILLIC SMALL LETTER CHE WITH DESCENDER -// Ҷ <> XXX ; # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER -// ӌ <> XXX ; # CYRILLIC SMALL LETTER KHAKASSIAN CHE -// Ӌ <> XXX ; # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE -// ҹ <> XXX ; # CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE -// Ҹ <> XXX ; # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE - -"э <> e $acute;" // CYRILLIC SMALL LETTER E -"Э <> E $acute;" // CYRILLIC CAPITAL LETTER E -"є <> e $hat;" // CYRILLIC SMALL LETTER UKRAINIAN IE -"Є <> E $hat;" // CYRILLIC CAPITAL LETTER UKRAINIAN IE - -"ш <> s $caron ;" // CYRILLIC SMALL LETTER SHA -"Ш <> S $caron ;" // CYRILLIC CAPITAL LETTER SHA -"щ <> s $hat ;" // CYRILLIC SMALL LETTER SHCHA -"Щ <> S $hat;" // CYRILLIC CAPITAL LETTER SHCHA - -"ѕ <> z $hat ;" // CYRILLIC SMALL LETTER DZE -"Ѕ <> Z $hat;" // CYRILLIC CAPITAL LETTER DZE -// ӡ <> XXX ; # CYRILLIC SMALL LETTER ABKHASIAN DZE -// Ӡ <> XXX ; # CYRILLIC CAPITAL LETTER ABKHASIAN DZE - -"ю <> u $hat ;" // CYRILLIC SMALL LETTER YU -"Ю <> U $hat ;" // CYRILLIC CAPITAL LETTER YU - -"і <> i $acute;" // CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I -"І <> I $acute;" // CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I -"ј <> j $caron;" // CYRILLIC SMALL LETTER JE -"Ј <> J $caron;" // CYRILLIC CAPITAL LETTER JE - -"љ <> l $hat ;" // CYRILLIC SMALL LETTER LJE -"Љ <> L $hat ;" // CYRILLIC CAPITAL LETTER LJE -"њ <> n $hat ;" // CYRILLIC SMALL LETTER NJE -"Њ <> N $hat ;" // CYRILLIC CAPITAL LETTER NJE - -"ћ <> c $acute ;" // CYRILLIC SMALL LETTER TSHE -"Ћ <> C $acute ;" // CYRILLIC CAPITAL LETTER TSHE - -"џ <> d $hat ;" // CYRILLIC SMALL LETTER DZHE -"Џ <> D $hat ;" // CYRILLIC CAPITAL LETTER DZHE - -// Normal order - -"а <> a ;" // CYRILLIC SMALL LETTER A -"А <> A ;" // CYRILLIC CAPITAL LETTER A -"ә <> \u0259 ;" // CYRILLIC SMALL LETTER SCHWA -"Ә <> \u018F ;" // CYRILLIC CAPITAL LETTER SCHWA -"ӕ <> \u00E6 ;" // CYRILLIC SMALL LIGATURE A IE -"Ӕ <> \u00C6 ;" // CYRILLIC CAPITAL LIGATURE A IE -"б <> b ;" // CYRILLIC SMALL LETTER BE -"Б <> B ;" // CYRILLIC CAPITAL LETTER BE -"в <> v ;" // CYRILLIC SMALL LETTER VE -"В <> V ;" // CYRILLIC CAPITAL LETTER VE - -"ґ <> g $grave ;" // CYRILLIC SMALL LETTER GHE WITH UPTURN -"Ґ <> G $grave ;" // CYRILLIC CAPITAL LETTER GHE WITH UPTURN -"ғ <> g $dot ;" // CYRILLIC SMALL LETTER GHE WITH STROKE -"Ғ <> G $dot;" // CYRILLIC CAPITAL LETTER GHE WITH STROKE -"ҕ <> g $breve;" // CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK -"Ҕ <> G $breve;" // CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK -"г <> g ;" // CYRILLIC SMALL LETTER GHE -"Г <> G ;" // CYRILLIC CAPITAL LETTER GHE - -"д <> d;" // CYRILLIC SMALL LETTER DE -"Д <> D;" // CYRILLIC CAPITAL LETTER DE -"ђ <> đ ;" // CYRILLIC SMALL LETTER DJE -"Ђ <> Đ ;" // CYRILLIC CAPITAL LETTER DJE -"ҙ <> z $comma ;" // CYRILLIC SMALL LETTER ZE WITH DESCENDER -"Ҙ <> Z $comma ;" // CYRILLIC CAPITAL LETTER ZE WITH DESCENDER -"е <> e ;" // CYRILLIC SMALL LETTER IE -"Е <> E;" // CYRILLIC CAPITAL LETTER IE - -"ж <> z $caron;" // CYRILLIC SMALL LETTER ZHE -"Ж <> Z $caron;" // CYRILLIC CAPITAL LETTER ZHE - -// җ <> XXX ; # CYRILLIC SMALL LETTER ZHE WITH DESCENDER -// Җ <> XXX ; # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER - -"з <> z ;" // CYRILLIC SMALL LETTER ZE -"З <> Z;" // CYRILLIC CAPITAL LETTER ZE - -"й <> j ;" // CYRILLIC SMALL LETTER I -"Й <> J ;" // CYRILLIC CAPITAL LETTER I -"и <> i ;" // CYRILLIC SMALL LETTER I -"И <> I ;" // CYRILLIC CAPITAL LETTER I - -"к <> k ;" // CYRILLIC SMALL LETTER KA -"К <> K;" // CYRILLIC CAPITAL LETTER KA - -// қ <> XXX ; # CYRILLIC SMALL LETTER KA WITH DESCENDER -// Қ <> XXX ; # CYRILLIC CAPITAL LETTER KA WITH DESCENDER -// ӄ <> XXX ; # CYRILLIC SMALL LETTER KA WITH HOOK -// Ӄ <> XXX ; # CYRILLIC CAPITAL LETTER KA WITH HOOK -// ҡ <> XXX ; # CYRILLIC SMALL LETTER BASHKIR KA -// Ҡ <> XXX ; # CYRILLIC CAPITAL LETTER BASHKIR KA -// ҟ <> XXX ; # CYRILLIC SMALL LETTER KA WITH STROKE -// Ҟ <> XXX ; # CYRILLIC CAPITAL LETTER KA WITH STROKE -// ҝ <> XXX ; # CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE -// Ҝ <> XXX ; # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE -"л <> l ;" // CYRILLIC SMALL LETTER EL -"Л <> L;" // CYRILLIC CAPITAL LETTER EL - -"м <> m ;" // CYRILLIC SMALL LETTER EM -"М <> M ;" // CYRILLIC CAPITAL LETTER EM -"н <> n ;" // CYRILLIC SMALL LETTER EN -"Н <> N;" // CYRILLIC CAPITAL LETTER EN -// ң <> XXX ; # CYRILLIC SMALL LETTER EN WITH DESCENDER -// Ң <> XXX ; # CYRILLIC CAPITAL LETTER EN WITH DESCENDER -// ӈ <> XXX ; # CYRILLIC SMALL LETTER EN WITH HOOK -// Ӈ <> XXX ; # CYRILLIC CAPITAL LETTER EN WITH HOOK -// ҥ <> XXX ; # CYRILLIC SMALL LIGATURE EN GHE -// Ҥ <> XXX ; # CYRILLIC CAPITAL LIGATURE EN GHE - -"о <> o ;" // CYRILLIC SMALL LETTER O -"О <> O ;" // CYRILLIC CAPITAL LETTER O -// ө <> XXX ; # CYRILLIC SMALL LETTER BARRED O -// Ө <> XXX ; # CYRILLIC CAPITAL LETTER BARRED O -"п <> p ;" // CYRILLIC SMALL LETTER PE -"П <> P ;" // CYRILLIC CAPITAL LETTER PE -// ҧ <> XXX ; # CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK -// Ҧ <> XXX ; # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK -// ҁ <> XXX ; # CYRILLIC SMALL LETTER KOPPA -// Ҁ <> XXX ; # CYRILLIC CAPITAL LETTER KOPPA -"р <> r ;" // CYRILLIC SMALL LETTER ER -"Р <> R ;" // CYRILLIC CAPITAL LETTER ER -// ҏ <> XXX ; # CYRILLIC SMALL LETTER ER WITH TICK -// Ҏ <> XXX ; # CYRILLIC CAPITAL LETTER ER WITH TICK -"с <> s ;" // CYRILLIC SMALL LETTER ES -"С <> S ;" // CYRILLIC CAPITAL LETTER ES -// ҫ <> XXX ; # CYRILLIC SMALL LETTER ES WITH DESCENDER -// Ҫ <> XXX ; # CYRILLIC CAPITAL LETTER ES WITH DESCENDER -"т <> t ;" // CYRILLIC SMALL LETTER TE -"Т <> T ;" // CYRILLIC CAPITAL LETTER TE -// ҭ <> XXX ; # CYRILLIC SMALL LETTER TE WITH DESCENDER -// Ҭ <> XXX ; # CYRILLIC CAPITAL LETTER TE WITH DESCENDER - -"у <> u ;" // CYRILLIC SMALL LETTER U -"У <> U ;" // CYRILLIC CAPITAL LETTER U -// ү <> XXX ; # CYRILLIC SMALL LETTER STRAIGHT U -// Ү <> XXX ; # CYRILLIC CAPITAL LETTER STRAIGHT U -// ұ <> XXX ; # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE -// Ұ <> XXX ; # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE -// ѹ <> XXX ; # CYRILLIC SMALL LETTER UK -// Ѹ <> XXX ; # CYRILLIC CAPITAL LETTER UK -"ф <> f ;" // CYRILLIC SMALL LETTER EF -"Ф <> F ;" // CYRILLIC CAPITAL LETTER EF -"х <> h ;" // CYRILLIC SMALL LETTER HA -"Х <> H;" // CYRILLIC CAPITAL LETTER HA -// ҳ <> XXX ; # CYRILLIC SMALL LETTER HA WITH DESCENDER -// Ҳ <> XXX ; # CYRILLIC CAPITAL LETTER HA WITH DESCENDER -// һ <> XXX ; # CYRILLIC SMALL LETTER SHHA -// Һ <> XXX ; # CYRILLIC CAPITAL LETTER SHHA -// ѡ <> XXX ; # CYRILLIC SMALL LETTER OMEGA -// Ѡ <> XXX ; # CYRILLIC CAPITAL LETTER OMEGA -// ѿ <> XXX ; # CYRILLIC SMALL LETTER OT -// Ѿ <> XXX ; # CYRILLIC CAPITAL LETTER OT -// ѽ <> XXX ; # CYRILLIC SMALL LETTER OMEGA WITH TITLO -// Ѽ <> XXX ; # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO -// ѻ <> XXX ; # CYRILLIC SMALL LETTER ROUND OMEGA -// Ѻ <> XXX ; # CYRILLIC CAPITAL LETTER ROUND OMEGA -"ц <> c ;" // CYRILLIC SMALL LETTER TSE -"Ц <> C;" // CYRILLIC CAPITAL LETTER TSE -// ҵ <> XXX ; # CYRILLIC SMALL LIGATURE TE TSE -// Ҵ <> XXX ; # CYRILLIC CAPITAL LIGATURE TE TSE - -// ҽ <> XXX ; # CYRILLIC SMALL LETTER ABKHASIAN CHE -// Ҽ <> XXX ; # CYRILLIC CAPITAL LETTER ABKHASIAN CHE -// ҿ <> XXX ; # CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER -// Ҿ <> XXX ; # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER - - -"Ъ <> $modprime2 $under ;" // CYRILLIC CAPITAL LETTER HARD SIGN -"ъ <> $modprime2 ;" // CYRILLIC SMALL LETTER HARD SIGN -"Ь <> $modprime $under ;" // CYRILLIC CAPITAL LETTER SOFT SIGN -"ь <> $modprime ;" // CYRILLIC SMALL LETTER SOFT SIGN - -"ы <> y ;" // CYRILLIC SMALL LETTER YERU -"Ы <> Y ;" // CYRILLIC CAPITAL LETTER YERU - -// ҍ <> XXX ; # CYRILLIC SMALL LETTER SEMISOFT SIGN -// Ҍ <> XXX ; # CYRILLIC CAPITAL LETTER SEMISOFT SIGN -// ѣ <> XXX ; # CYRILLIC SMALL LETTER YAT -// Ѣ <> XXX ; # CYRILLIC CAPITAL LETTER YAT - -// ѥ <> XXX ; # CYRILLIC SMALL LETTER IOTIFIED E -// Ѥ <> XXX ; # CYRILLIC CAPITAL LETTER IOTIFIED E -// ѧ <> XXX ; # CYRILLIC SMALL LETTER LITTLE YUS -// Ѧ <> XXX ; # CYRILLIC CAPITAL LETTER LITTLE YUS -// ѫ <> XXX ; # CYRILLIC SMALL LETTER BIG YUS -// Ѫ <> XXX ; # CYRILLIC CAPITAL LETTER BIG YUS -// ѩ <> XXX ; # CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS -// Ѩ <> XXX ; # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS -// ѭ <> XXX ; # CYRILLIC SMALL LETTER IOTIFIED BIG YUS -// Ѭ <> XXX ; # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS -// ѯ <> XXX ; # CYRILLIC SMALL LETTER KSI -// Ѯ <> XXX ; # CYRILLIC CAPITAL LETTER KSI -// ѱ <> XXX ; # CYRILLIC SMALL LETTER PSI -// Ѱ <> XXX ; # CYRILLIC CAPITAL LETTER PSI -// ѳ <> XXX ; # CYRILLIC SMALL LETTER FITA -// Ѳ <> XXX ; # CYRILLIC CAPITAL LETTER FITA -// ѵ <> XXX ; # CYRILLIC SMALL LETTER IZHITSA -// Ѵ <> XXX ; # CYRILLIC CAPITAL LETTER IZHITSA -// ҩ <> XXX ; # CYRILLIC SMALL LETTER ABKHASIAN HA -// Ҩ <> XXX ; # CYRILLIC CAPITAL LETTER ABKHASIAN HA -// Ӏ <> XXX ; # CYRILLIC LETTER PALOCHKA -//## ӑ <> XXX ; # CYRILLIC SMALL LETTER A -//## Ӑ <> XXX ; # CYRILLIC CAPITAL LETTER A -//## ӓ <> XXX ; # CYRILLIC SMALL LETTER A -//## Ӓ <> XXX ; # CYRILLIC CAPITAL LETTER A -//## ӛ <> XXX ; # CYRILLIC SMALL LETTER SCHWA -//## Ӛ <> XXX ; # CYRILLIC CAPITAL LETTER SCHWA -//## ѓ <> XXX ; # CYRILLIC SMALL LETTER GHE -//## Ѓ <> XXX ; # CYRILLIC CAPITAL LETTER GHE -//## ѐ <> XXX ; # CYRILLIC SMALL LETTER IE -//## Ѐ <> XXX ; # CYRILLIC CAPITAL LETTER IE -//## ё <> XXX ; # CYRILLIC SMALL LETTER IE -//## Ё <> XXX ; # CYRILLIC CAPITAL LETTER IE -//## ӗ <> XXX ; # CYRILLIC SMALL LETTER IE -//## Ӗ <> XXX ; # CYRILLIC CAPITAL LETTER IE -//## ӂ <> XXX ; # CYRILLIC SMALL LETTER ZHE -//## Ӂ <> XXX ; # CYRILLIC CAPITAL LETTER ZHE -//## ӝ <> XXX ; # CYRILLIC SMALL LETTER ZHE -//## Ӝ <> XXX ; # CYRILLIC CAPITAL LETTER ZHE -//## ӟ <> XXX ; # CYRILLIC SMALL LETTER ZE -//## Ӟ <> XXX ; # CYRILLIC CAPITAL LETTER ZE -//## ѝ <> XXX ; # CYRILLIC SMALL LETTER I -//## Ѝ <> XXX ; # CYRILLIC CAPITAL LETTER I -//## ӣ <> XXX ; # CYRILLIC SMALL LETTER I -//## Ӣ <> XXX ; # CYRILLIC CAPITAL LETTER I -//## ӥ <> XXX ; # CYRILLIC SMALL LETTER I -//## Ӥ <> XXX ; # CYRILLIC CAPITAL LETTER I -//## ї <> XXX ; # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I -//## Ї <> XXX ; # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I -//## ӧ <> XXX ; # CYRILLIC SMALL LETTER O -//## Ӧ <> XXX ; # CYRILLIC CAPITAL LETTER O -//## ӫ <> XXX ; # CYRILLIC SMALL LETTER BARRED O -//## Ӫ <> XXX ; # CYRILLIC CAPITAL LETTER BARRED O -//## ќ <> XXX ; # CYRILLIC SMALL LETTER KA -//## Ќ <> XXX ; # CYRILLIC CAPITAL LETTER KA -//## ӯ <> XXX ; # CYRILLIC SMALL LETTER U -//## Ӯ <> XXX ; # CYRILLIC CAPITAL LETTER U -//## ў <> XXX ; # CYRILLIC SMALL LETTER U -//## Ў <> XXX ; # CYRILLIC CAPITAL LETTER U -//## ӱ <> XXX ; # CYRILLIC SMALL LETTER U -//## Ӱ <> XXX ; # CYRILLIC CAPITAL LETTER U -//## ӳ <> XXX ; # CYRILLIC SMALL LETTER U -//## Ӳ <> XXX ; # CYRILLIC CAPITAL LETTER U -//## ӵ <> XXX ; # CYRILLIC SMALL LETTER CHE -//## Ӵ <> XXX ; # CYRILLIC CAPITAL LETTER CHE -//## ӹ <> XXX ; # CYRILLIC SMALL LETTER YERU -//## Ӹ <> XXX ; # CYRILLIC CAPITAL LETTER YERU -//## ӭ <> XXX ; # CYRILLIC SMALL LETTER E -//## Ӭ <> XXX ; # CYRILLIC CAPITAL LETTER E -//## ѷ <> XXX ; # CYRILLIC SMALL LETTER IZHITSA -//## Ѷ <> XXX ; # CYRILLIC CAPITAL LETTER IZHITSA - -// Completeness -"$ignore = [[:Mark:]''] * ;" -"| k < q ;" -"| K < Q ;" -"| u < w ;" -"| U < W ;" -"| KS < X } $ignore [:UppercaseLetter:] ;" -"| KS < [:UppercaseLetter:] $ignore { X ;" -"| Ks < X ;" -"| ks < x ;" - -":: NFC (NFD) ;" -// note: a global filter is more efficient, but MUST include all source chars!! -// :: ([\\u0000-\u007E \u02B9 \u02BA [:Cyrillic:] [:Latin:] [:nonspacing mark:]]); -// MINIMAL FILTER: Latin-Cyrillic -":: ( [\u0308A-Za-z\u00C0-\u00CF\u00D1-\u00D6\u00D9-\u00DD\u00E0-\u00EF\u00F1-\u00F6\u00F9-\u00FD\u00FF-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u018F\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E3\u01E6-\u01F0\u01F4-\u01F5\u01F8-\u021B\u021E-\u021F\u0226-\u0233\u0259\u02B9-\u02BA\u0300-\u0302\u0306-\u0307\u030C\u0326\u0331\u0340-\u0341\u0344\u0374\u0385-\u0386\u0388-\u038A\u038C\u038E-\u0390\u03AC-\u03B0\u03CC-\u03CE\u03D3\u0400\u0403\u040C-\u040E\u0419\u0439\u0450\u0453\u045C-\u045E\u04C1-\u04C2\u04D0-\u04D1\u04D6-\u04D7\u1E00-\u1E99\u1E9B\u1EA0-\u1EF9\u1F02-\u1F05\u1F0A-\u1F0D\u1F12-\u1F15\u1F1A-\u1F1D\u1F22-\u1F25\u1F2A-\u1F2D\u1F32-\u1F35\u1F3A-\u1F3D\u1F42-\u1F45\u1F4A-\u1F4D\u1F52-\u1F55\u1F5B\u1F5D\u1F62-\u1F65\u1F6A-\u1F6D\u1F70-\u1F7D\u1F82-\u1F85\u1F8A-\u1F8D\u1F92-\u1F95\u1F9A-\u1F9D\u1FA2-\u1FA5\u1FAA-\u1FAD\u1FB0\u1FB2\u1FB4\u1FB8\u1FBA-\u1FBB\u1FC2\u1FC4\u1FC8-\u1FCB\u1FCD-\u1FCE\u1FD0\u1FD2-\u1FD3\u1FD8\u1FDA-\u1FDB\u1FDD-\u1FDE\u1FE0\u1FE2-\u1FE3\u1FE8\u1FEA-\u1FEB\u1FED-\u1FEE\u1FF2\u1FF4\u1FF8-\u1FFB\u212A-\u212B] ) ;" - } -} diff --git a/icuSources/data/translit/t_Deva_InterIndic.txt b/icuSources/data/translit/t_Deva_InterIndic.txt deleted file mode 100644 index 229263a9..00000000 --- a/icuSources/data/translit/t_Deva_InterIndic.txt +++ /dev/null @@ -1,132 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_Devanagari_InterIndic.txt -// Date: Sat Jul 27 10:31:01 2002 -//-------------------------------------------------------------------- - -// Devanagari_InterIndic - -t_Deva_InterIndic { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// Devanagari-InterIndic -// :: NFD; -//Rules for Decomposed characters - - - "\u0901>\uE001;" // SIGN CANDRABINDU - "\u0902>\uE002;" // SIGN ANUSVARA - "\u0903>\uE003;" // SIGN VISARGA - "\u0905>\uE005;" // LETTER A - "\u0906>\uE006;" // LETTER AA - "\u0907>\uE007;" // LETTER I - "\u0908>\uE008;" // LETTER II - "\u0909>\uE009;" // LETTER U - "\u090A>\uE00A;" // LETTER UU - "\u090B>\uE00B;" // LETTER VOCALIC R - "\u090C>\uE00C;" // LETTER VOCALIC L - "\u090D>\uE00D;" // LETTER CANDRA E (For representing English sounds) - "\u090E>\uE00E;" // UNMAPPED LETTER SHORT E(For Southern Scripts) - "\u090F>\uE00F;" // LETTER E - "\u0910>\uE010;" // LETTER AI - "\u0911>\uE011;" // LETTER CANDRA O (For representing English sounds) - "\u0912>\uE012;" // UNMAPPED LETTER SHORT O (For Southern Scripts) - "\u0913>\uE013;" // LETTER O - "\u0914>\uE014;" // LETTER AU - "\u0915>\uE015;" // LETTER KA - "\u0916>\uE016;" // LETTER KHA - "\u0917>\uE017;" // LETTER GA - "\u0918>\uE018;" // LETTER GHA - "\u0919>\uE019;" // LETTER NGA - "\u091A>\uE01A;" // LETTER CA - "\u091B>\uE01B;" // LETTER CHA - "\u091C>\uE01C;" // LETTER JA - "\u091D>\uE01D;" // LETTER JHA - "\u091E>\uE01E;" // LETTER NYA - "\u091F>\uE01F;" // LETTER TTA - "\u0920>\uE020;" // LETTER TTHA - "\u0921>\uE021;" // LETTER DDA - "\u0922>\uE022;" // LETTER DDHA - "\u0923>\uE023;" // LETTER NNA - "\u0924>\uE024;" // LETTER TA - "\u0925>\uE025;" // LETTER THA - "\u0926>\uE026;" // LETTER DA - "\u0927>\uE027;" // LETTER DHA - "\u0928>\uE028;" // LETTER NA - "\u0929>\uE029;" - "\u092A>\uE02A;" // LETTER PA - "\u092B>\uE02B;" // LETTER PHA - "\u092C>\uE02C;" // LETTER BA - "\u092D>\uE02D;" // LETTER BHA - "\u092E>\uE02E;" // LETTER MA - "\u092F>\uE02F;" // LETTER YA - "\u0930>\uE030;" // LETTER RA - "\u0931>\uE031;" - "\u0932>\uE032;" // LETTER LA - "\u0933>\uE033;" // LETTER LLA - "\u0934>\uE034;" - - "\u0935>\uE035;" // LETTER VA - "\u0936>\uE036;" // LETTER SHA - "\u0937>\uE037;" // LETTER SSA - "\u0938>\uE038;" // LETTER SA - "\u0939>\uE039;" // LETTER HA - "\u093C>\uE03C;" // SIGN NUKTA - "\u093D>\uE03D;" // SIGN AVAGRAHA - "\u093E>\uE03E;" // VOWEL SIGN AA - "\u093F>\uE03F;" // VOWEL SIGN I - "\u0940>\uE040;" // VOWEL SIGN II - "\u0941>\uE041;" // VOWEL SIGN U - "\u0942>\uE042;" // VOWEL SIGN UU - "\u0943>\uE043;" // VOWEL SIGN VOCALIC R - "\u0944>\uE044;" // VOWEL SIGN VOCALIC RR - "\u0945>\uE045;" // VOWEL SIGN CANDRA E - "\u0946>\uE046;" // UNMAPPED VOWEL SIGN SHORT E - "\u0947>\uE047;" // VOWEL SIGN E - "\u0948>\uE048;" // VOWEL SIGN AI - "\u0949>\uE049;" // VOWEL SIGN CANDRA O - "\u094A>\uE04A;" // UNMAPPED VOWEL SIGN SHORT O - "\u094B>\uE04B;" // VOWEL SIGN O - "\u094C>\uE04C;" // VOWEL SIGN AU - "\u094D>\uE04D;" // SIGN VIRAMA - "\u0950>\uE050;" // OM - "\u0951>\uE051;" // UNMAPPED STRESS SIGN UDATTA - "\u0952>\uE052;" // UNMAPPED STRESS SIGN ANUDATTA - "\u0953>\uE053;" // UNMAPPED GRAVE ACCENT - "\u0954>\uE054;" // UNMAPPED ACUTE ACCENT - "\u0958>\uE058;" - "\u0959>\uE059;" - "\u095A>\uE05a;" - "\u095B>\uE05b;" - "\u095C>\uE05c;" - "\u095D>\uE05d;" - "\u095E>\uE05e;" - "\u095F>\uE05f;" - "\u0960>\uE060;" // LETTER VOCALIC RR - "\u0961>\uE061;" // LETTER VOCALIC LL - "\u0962>\uE062;" // VOWEL SIGN VOCALIC L - "\u0963>\uE063;" // VOWEL SIGN VOCALIC LL - "\u0964>\ue064;" // DANDA - "\u0965>\ue065;" // DOUBLE DANDA - "\u0966>\uE066;" // DIGIT ZERO - "\u0967>\uE067;" // DIGIT ONE - "\u0968>\uE068;" // DIGIT TWO - "\u0969>\uE069;" // DIGIT THREE - "\u096A>\uE06A;" // DIGIT FOUR - "\u096B>\uE06B;" // DIGIT FIVE - "\u096C>\uE06C;" // DIGIT SIX - "\u096D>\uE06D;" // DIGIT SEVEN - "\u096E>\uE06E;" // DIGIT EIGHT - "\u096F>\uE06F;" // DIGIT NINE -// \u0970>; # UNMAPPED Devanagari-InterIndic: ABBREVIATION SIGN -// :: NFC (NFD) ; - } -} diff --git a/icuSources/data/translit/t_FWidth_HWidth.txt b/icuSources/data/translit/t_FWidth_HWidth.txt deleted file mode 100644 index 5653b3fb..00000000 --- a/icuSources/data/translit/t_FWidth_HWidth.txt +++ /dev/null @@ -1,287 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2003, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_Fullwidth_Halfwidth.txt -// Date: Sat Jul 27 10:31:01 2002 -//-------------------------------------------------------------------- - -// Fullwidth_Halfwidth - -t_FWidth_HWidth { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// Fullwidth-Halfwidth - -// Mechanically generated from Unicode Character Database -// IDEOGRAPHIC SPACE then added, and -// FULLWIDTH MACRON changed to map to MACRON, not SPACE + COMBINING MACRON - -// multicharacter - -"ガ<>ガ;" // to KATAKANA LETTER GA -"ギ<>ギ;" // to KATAKANA LETTER GI -"グ<>グ;" // to KATAKANA LETTER GU -"ゲ<>ゲ;" // to KATAKANA LETTER GE -"ゴ<>ゴ;" // to KATAKANA LETTER GO -"ザ<>ザ;" // to KATAKANA LETTER ZA -"ジ<>ジ;" // to KATAKANA LETTER ZI -"ズ<>ズ;" // to KATAKANA LETTER ZU -"ゼ<>ゼ;" // to KATAKANA LETTER ZE -"ゾ<>ゾ;" // to KATAKANA LETTER ZO -"ダ<>ダ;" // to KATAKANA LETTER DA -"ヂ<>ヂ;" // to KATAKANA LETTER DI -"ヅ<>ヅ;" // to KATAKANA LETTER DU -"デ<>デ;" // to KATAKANA LETTER DE -"ド<>ド;" // to KATAKANA LETTER DO -"バ<>バ;" // to KATAKANA LETTER BA -"パ<>パ;" // to KATAKANA LETTER PA -"ビ<>ビ;" // to KATAKANA LETTER BI -"ピ<>ピ;" // to KATAKANA LETTER PI -"ブ<>ブ;" // to KATAKANA LETTER BU -"プ<>プ;" // to KATAKANA LETTER PU -"ベ<>ベ;" // to KATAKANA LETTER BE -"ペ<>ペ;" // to KATAKANA LETTER PE -"ボ<>ボ;" // to KATAKANA LETTER BO -"ポ<>ポ;" // to KATAKANA LETTER PO -"ヴ<>ヴ;" // to KATAKANA LETTER VU -"ヷ<>ヷ;" // to KATAKANA LETTER VA -"ヺ<>ヺ;" // to KATAKANA LETTER VO - -// single character - -"!<>'!';" // from FULLWIDTH EXCLAMATION MARK -""<>'\\\"';" // from FULLWIDTH QUOTATION MARK -"#<>'#';" // from FULLWIDTH NUMBER SIGN -"$<>'$';" // from FULLWIDTH DOLLAR SIGN -"%<>'%';" // from FULLWIDTH PERCENT SIGN -"&<>'&';" // from FULLWIDTH AMPERSAND -"'<>'';" // from FULLWIDTH APOSTROPHE -"(<>'(';" // from FULLWIDTH LEFT PARENTHESIS -")<>')';" // from FULLWIDTH RIGHT PARENTHESIS -"*<>'*';" // from FULLWIDTH ASTERISK -"+<>'+';" // from FULLWIDTH PLUS SIGN -",<>',';" // from FULLWIDTH COMMA -"-<>'-';" // from FULLWIDTH HYPHEN-MINUS -".<>'.';" // from FULLWIDTH FULL STOP -"/<>'/';" // from FULLWIDTH SOLIDUS -"0<>'0';" // from FULLWIDTH DIGIT ZERO -"1<>'1';" // from FULLWIDTH DIGIT ONE -"2<>'2';" // from FULLWIDTH DIGIT TWO -"3<>'3';" // from FULLWIDTH DIGIT THREE -"4<>'4';" // from FULLWIDTH DIGIT FOUR -"5<>'5';" // from FULLWIDTH DIGIT FIVE -"6<>'6';" // from FULLWIDTH DIGIT SIX -"7<>'7';" // from FULLWIDTH DIGIT SEVEN -"8<>'8';" // from FULLWIDTH DIGIT EIGHT -"9<>'9';" // from FULLWIDTH DIGIT NINE -":<>':';" // from FULLWIDTH COLON -";<>';';" // from FULLWIDTH SEMICOLON -"<<>'<';" // from FULLWIDTH LESS-THAN SIGN -"=<>'=';" // from FULLWIDTH EQUALS SIGN -"><>'>';" // from FULLWIDTH GREATER-THAN SIGN -"?<>'?';" // from FULLWIDTH QUESTION MARK -"@<>'@';" // from FULLWIDTH COMMERCIAL AT -"A<>A;" // from FULLWIDTH LATIN CAPITAL LETTER A -"B<>B;" // from FULLWIDTH LATIN CAPITAL LETTER B -"C<>C;" // from FULLWIDTH LATIN CAPITAL LETTER C -"D<>D;" // from FULLWIDTH LATIN CAPITAL LETTER D -"E<>E;" // from FULLWIDTH LATIN CAPITAL LETTER E -"F<>F;" // from FULLWIDTH LATIN CAPITAL LETTER F -"G<>G;" // from FULLWIDTH LATIN CAPITAL LETTER G -"H<>H;" // from FULLWIDTH LATIN CAPITAL LETTER H -"I<>I;" // from FULLWIDTH LATIN CAPITAL LETTER I -"J<>J;" // from FULLWIDTH LATIN CAPITAL LETTER J -"K<>K;" // from FULLWIDTH LATIN CAPITAL LETTER K -"L<>L;" // from FULLWIDTH LATIN CAPITAL LETTER L -"M<>M;" // from FULLWIDTH LATIN CAPITAL LETTER M -"N<>N;" // from FULLWIDTH LATIN CAPITAL LETTER N -"O<>O;" // from FULLWIDTH LATIN CAPITAL LETTER O -"P<>P;" // from FULLWIDTH LATIN CAPITAL LETTER P -"Q<>Q;" // from FULLWIDTH LATIN CAPITAL LETTER Q -"R<>R;" // from FULLWIDTH LATIN CAPITAL LETTER R -"S<>S;" // from FULLWIDTH LATIN CAPITAL LETTER S -"T<>T;" // from FULLWIDTH LATIN CAPITAL LETTER T -"U<>U;" // from FULLWIDTH LATIN CAPITAL LETTER U -"V<>V;" // from FULLWIDTH LATIN CAPITAL LETTER V -"W<>W;" // from FULLWIDTH LATIN CAPITAL LETTER W -"X<>X;" // from FULLWIDTH LATIN CAPITAL LETTER X -"Y<>Y;" // from FULLWIDTH LATIN CAPITAL LETTER Y -"Z<>Z;" // from FULLWIDTH LATIN CAPITAL LETTER Z -"[<>'[';" // from FULLWIDTH LEFT SQUARE BRACKET -"\<>'\\';" // from FULLWIDTH REVERSE SOLIDUS {double escape - aliu} -"]<>']';" // from FULLWIDTH RIGHT SQUARE BRACKET -"^<>'^';" // from FULLWIDTH CIRCUMFLEX ACCENT -"_<>'_';" // from FULLWIDTH LOW LINE -"`<>'`';" // from FULLWIDTH GRAVE ACCENT -"a<>a;" // from FULLWIDTH LATIN SMALL LETTER A -"b<>b;" // from FULLWIDTH LATIN SMALL LETTER B -"c<>c;" // from FULLWIDTH LATIN SMALL LETTER C -"d<>d;" // from FULLWIDTH LATIN SMALL LETTER D -"e<>e;" // from FULLWIDTH LATIN SMALL LETTER E -"f<>f;" // from FULLWIDTH LATIN SMALL LETTER F -"g<>g;" // from FULLWIDTH LATIN SMALL LETTER G -"h<>h;" // from FULLWIDTH LATIN SMALL LETTER H -"i<>i;" // from FULLWIDTH LATIN SMALL LETTER I -"j<>j;" // from FULLWIDTH LATIN SMALL LETTER J -"k<>k;" // from FULLWIDTH LATIN SMALL LETTER K -"l<>l;" // from FULLWIDTH LATIN SMALL LETTER L -"m<>m;" // from FULLWIDTH LATIN SMALL LETTER M -"n<>n;" // from FULLWIDTH LATIN SMALL LETTER N -"o<>o;" // from FULLWIDTH LATIN SMALL LETTER O -"p<>p;" // from FULLWIDTH LATIN SMALL LETTER P -"q<>q;" // from FULLWIDTH LATIN SMALL LETTER Q -"r<>r;" // from FULLWIDTH LATIN SMALL LETTER R -"s<>s;" // from FULLWIDTH LATIN SMALL LETTER S -"t<>t;" // from FULLWIDTH LATIN SMALL LETTER T -"u<>u;" // from FULLWIDTH LATIN SMALL LETTER U -"v<>v;" // from FULLWIDTH LATIN SMALL LETTER V -"w<>w;" // from FULLWIDTH LATIN SMALL LETTER W -"x<>x;" // from FULLWIDTH LATIN SMALL LETTER X -"y<>y;" // from FULLWIDTH LATIN SMALL LETTER Y -"z<>z;" // from FULLWIDTH LATIN SMALL LETTER Z -"{<>'{';" // from FULLWIDTH LEFT CURLY BRACKET -"|<>'|';" // from FULLWIDTH VERTICAL LINE -"}<>'}';" // from FULLWIDTH RIGHT CURLY BRACKET -"~<>'~';" // from FULLWIDTH TILDE -"。<>。;" // to HALFWIDTH IDEOGRAPHIC FULL STOP -"「<>「;" // to HALFWIDTH LEFT CORNER BRACKET -"」<>」;" // to HALFWIDTH RIGHT CORNER BRACKET -"、<>、;" // to HALFWIDTH IDEOGRAPHIC COMMA -"・<>・;" // to HALFWIDTH KATAKANA MIDDLE DOT -"ヲ<>ヲ;" // to HALFWIDTH KATAKANA LETTER WO -"ァ<>ァ;" // to HALFWIDTH KATAKANA LETTER SMALL A -"ィ<>ィ;" // to HALFWIDTH KATAKANA LETTER SMALL I -"ゥ<>ゥ;" // to HALFWIDTH KATAKANA LETTER SMALL U -"ェ<>ェ;" // to HALFWIDTH KATAKANA LETTER SMALL E -"ォ<>ォ;" // to HALFWIDTH KATAKANA LETTER SMALL O -"ャ<>ャ;" // to HALFWIDTH KATAKANA LETTER SMALL YA -"ュ<>ュ;" // to HALFWIDTH KATAKANA LETTER SMALL YU -"ョ<>ョ;" // to HALFWIDTH KATAKANA LETTER SMALL YO -"ッ<>ッ;" // to HALFWIDTH KATAKANA LETTER SMALL TU -"ー<>ー;" // to HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK -"ア<>ア;" // to HALFWIDTH KATAKANA LETTER A -"イ<>イ;" // to HALFWIDTH KATAKANA LETTER I -"ウ<>ウ;" // to HALFWIDTH KATAKANA LETTER U -"エ<>エ;" // to HALFWIDTH KATAKANA LETTER E -"オ<>オ;" // to HALFWIDTH KATAKANA LETTER O -"カ<>カ;" // to HALFWIDTH KATAKANA LETTER KA -"キ<>キ;" // to HALFWIDTH KATAKANA LETTER KI -"ク<>ク;" // to HALFWIDTH KATAKANA LETTER KU -"ケ<>ケ;" // to HALFWIDTH KATAKANA LETTER KE -"コ<>コ;" // to HALFWIDTH KATAKANA LETTER KO -"サ<>サ;" // to HALFWIDTH KATAKANA LETTER SA -"シ<>シ;" // to HALFWIDTH KATAKANA LETTER SI -"ス<>ス;" // to HALFWIDTH KATAKANA LETTER SU -"セ<>セ;" // to HALFWIDTH KATAKANA LETTER SE -"ソ<>ソ;" // to HALFWIDTH KATAKANA LETTER SO -"タ<>タ;" // to HALFWIDTH KATAKANA LETTER TA -"チ<>チ;" // to HALFWIDTH KATAKANA LETTER TI -"ツ<>ツ;" // to HALFWIDTH KATAKANA LETTER TU -"テ<>テ;" // to HALFWIDTH KATAKANA LETTER TE -"ト<>ト;" // to HALFWIDTH KATAKANA LETTER TO -"ナ<>ナ;" // to HALFWIDTH KATAKANA LETTER NA -"ニ<>ニ;" // to HALFWIDTH KATAKANA LETTER NI -"ヌ<>ヌ;" // to HALFWIDTH KATAKANA LETTER NU -"ネ<>ネ;" // to HALFWIDTH KATAKANA LETTER NE -"ノ<>ノ;" // to HALFWIDTH KATAKANA LETTER NO -"ハ<>ハ;" // to HALFWIDTH KATAKANA LETTER HA -"ヒ<>ヒ;" // to HALFWIDTH KATAKANA LETTER HI -"フ<>フ;" // to HALFWIDTH KATAKANA LETTER HU -"ヘ<>ヘ;" // to HALFWIDTH KATAKANA LETTER HE -"ホ<>ホ;" // to HALFWIDTH KATAKANA LETTER HO -"マ<>マ;" // to HALFWIDTH KATAKANA LETTER MA -"ミ<>ミ;" // to HALFWIDTH KATAKANA LETTER MI -"ム<>ム;" // to HALFWIDTH KATAKANA LETTER MU -"メ<>メ;" // to HALFWIDTH KATAKANA LETTER ME -"モ<>モ;" // to HALFWIDTH KATAKANA LETTER MO -"ヤ<>ヤ;" // to HALFWIDTH KATAKANA LETTER YA -"ユ<>ユ;" // to HALFWIDTH KATAKANA LETTER YU -"ヨ<>ヨ;" // to HALFWIDTH KATAKANA LETTER YO -"ラ<>ラ;" // to HALFWIDTH KATAKANA LETTER RA -"リ<>リ;" // to HALFWIDTH KATAKANA LETTER RI -"ル<>ル;" // to HALFWIDTH KATAKANA LETTER RU -"レ<>レ;" // to HALFWIDTH KATAKANA LETTER RE -"ロ<>ロ;" // to HALFWIDTH KATAKANA LETTER RO -"ワ<>ワ;" // to HALFWIDTH KATAKANA LETTER WA -"ン<>ン;" // to HALFWIDTH KATAKANA LETTER N -"゙<>゙;" // to HALFWIDTH KATAKANA VOICED SOUND MARK -"゚<>゚;" // to HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK -"ᅠ<>ᅠ;" // to HALFWIDTH HANGUL FILLER -"ᄀ<>ᄀ;" // to HALFWIDTH HANGUL LETTER KIYEOK -"ᄁ<>ᄁ;" // to HALFWIDTH HANGUL LETTER SSANGKIYEOK -"ᆪ<>ᆪ;" // to HALFWIDTH HANGUL LETTER KIYEOK-SIOS -"ᄂ<>ᄂ;" // to HALFWIDTH HANGUL LETTER NIEUN -"ᆬ<>ᆬ;" // to HALFWIDTH HANGUL LETTER NIEUN-CIEUC -"ᆭ<>ᆭ;" // to HALFWIDTH HANGUL LETTER NIEUN-HIEUH -"ᄃ<>ᄃ;" // to HALFWIDTH HANGUL LETTER TIKEUT -"ᄄ<>ᄄ;" // to HALFWIDTH HANGUL LETTER SSANGTIKEUT -"ᄅ<>ᄅ;" // to HALFWIDTH HANGUL LETTER RIEUL -"ᆰ<>ᆰ;" // to HALFWIDTH HANGUL LETTER RIEUL-KIYEOK -"ᆱ<>ᆱ;" // to HALFWIDTH HANGUL LETTER RIEUL-MIEUM -"ᆲ<>ᆲ;" // to HALFWIDTH HANGUL LETTER RIEUL-PIEUP -"ᆳ<>ᆳ;" // to HALFWIDTH HANGUL LETTER RIEUL-SIOS -"ᆴ<>ᆴ;" // to HALFWIDTH HANGUL LETTER RIEUL-THIEUTH -"ᆵ<>ᆵ;" // to HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH -"ᄚ<>ᄚ;" // to HALFWIDTH HANGUL LETTER RIEUL-HIEUH -"ᄆ<>ᄆ;" // to HALFWIDTH HANGUL LETTER MIEUM -"ᄇ<>ᄇ;" // to HALFWIDTH HANGUL LETTER PIEUP -"ᄈ<>ᄈ;" // to HALFWIDTH HANGUL LETTER SSANGPIEUP -"ᄡ<>ᄡ;" // to HALFWIDTH HANGUL LETTER PIEUP-SIOS -"ᄉ<>ᄉ;" // to HALFWIDTH HANGUL LETTER SIOS -"ᄊ<>ᄊ;" // to HALFWIDTH HANGUL LETTER SSANGSIOS -"ᄋ<>ᄋ;" // to HALFWIDTH HANGUL LETTER IEUNG -"ᄌ<>ᄌ;" // to HALFWIDTH HANGUL LETTER CIEUC -"ᄍ<>ᄍ;" // to HALFWIDTH HANGUL LETTER SSANGCIEUC -"ᄎ<>ᄎ;" // to HALFWIDTH HANGUL LETTER CHIEUCH -"ᄏ<>ᄏ;" // to HALFWIDTH HANGUL LETTER KHIEUKH -"ᄐ<>ᄐ;" // to HALFWIDTH HANGUL LETTER THIEUTH -"ᄑ<>ᄑ;" // to HALFWIDTH HANGUL LETTER PHIEUPH -"ᄒ<>ᄒ;" // to HALFWIDTH HANGUL LETTER HIEUH -"ᅡ<>ᅡ;" // to HALFWIDTH HANGUL LETTER A -"ᅢ<>ᅢ;" // to HALFWIDTH HANGUL LETTER AE -"ᅣ<>ᅣ;" // to HALFWIDTH HANGUL LETTER YA -"ᅤ<>ᅤ;" // to HALFWIDTH HANGUL LETTER YAE -"ᅥ<>ᅥ;" // to HALFWIDTH HANGUL LETTER EO -"ᅦ<>ᅦ;" // to HALFWIDTH HANGUL LETTER E -"ᅧ<>ᅧ;" // to HALFWIDTH HANGUL LETTER YEO -"ᅨ<>ᅨ;" // to HALFWIDTH HANGUL LETTER YE -"ᅩ<>ᅩ;" // to HALFWIDTH HANGUL LETTER O -"ᅪ<>ᅪ;" // to HALFWIDTH HANGUL LETTER WA -"ᅫ<>ᅫ;" // to HALFWIDTH HANGUL LETTER WAE -"ᅬ<>ᅬ;" // to HALFWIDTH HANGUL LETTER OE -"ᅭ<>ᅭ;" // to HALFWIDTH HANGUL LETTER YO -"ᅮ<>ᅮ;" // to HALFWIDTH HANGUL LETTER U -"ᅯ<>ᅯ;" // to HALFWIDTH HANGUL LETTER WEO -"ᅰ<>ᅰ;" // to HALFWIDTH HANGUL LETTER WE -"ᅱ<>ᅱ;" // to HALFWIDTH HANGUL LETTER WI -"ᅲ<>ᅲ;" // to HALFWIDTH HANGUL LETTER YU -"ᅳ<>ᅳ;" // to HALFWIDTH HANGUL LETTER EU -"ᅴ<>ᅴ;" // to HALFWIDTH HANGUL LETTER YI -"ᅵ<>ᅵ;" // to HALFWIDTH HANGUL LETTER I -"¢<>'¢';" // from FULLWIDTH CENT SIGN -"£<>'£';" // from FULLWIDTH POUND SIGN -"¬<>'¬';" // from FULLWIDTH NOT SIGN -" ̄<>'¯';" // from FULLWIDTH MACRON -"' '<>' ';" // ideographic space (place this after MACRON) -"¦<>'¦';" // from FULLWIDTH BROKEN BAR -"¥<>'¥';" // from FULLWIDTH YEN SIGN -"₩<>₩;" // from FULLWIDTH WON SIGN -"│<>│;" // to HALFWIDTH FORMS LIGHT VERTICAL -"'←'<>'←';" // to HALFWIDTH LEFTWARDS ARROW -"↑<>↑;" // to HALFWIDTH UPWARDS ARROW -"'→'<>'→';" // to HALFWIDTH RIGHTWARDS ARROW -"↓<>↓;" // to HALFWIDTH DOWNWARDS ARROW -"■<>■;" // to HALFWIDTH BLACK SQUARE -"○<>○;" // to HALFWIDTH WHITE CIRCLE - -// eof - - } -} diff --git a/icuSources/data/translit/t_Grek_Latn.txt b/icuSources/data/translit/t_Grek_Latn.txt deleted file mode 100644 index f8deb377..00000000 --- a/icuSources/data/translit/t_Grek_Latn.txt +++ /dev/null @@ -1,354 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_Greek_Latin.txt -// Date: Sat Jul 27 10:31:01 2002 -//-------------------------------------------------------------------- - -// Greek_Latin - -t_Grek_Latn { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// Rules are predicated on running NFD first, and NFC afterwards -// :: [\\u0000-\u007F \u0370-\u03FF [:Greek:] [:nonspacing mark:]] ; -// MINIMAL FILTER GENERATED FOR: Greek-Latin -":: [;\u00B5\u00B7\u00C4\u00CB\u00CF\u00D6\u00DC\u00E4\u00EB\u00EF\u00F6\u00FC\u00FF-\u0101\u0112-\u0113\u012A-\u012B\u014C-\u014D\u016A-\u016B\u0178\u01D5-\u01DC\u01DE-\u01E3\u01EC-\u01ED\u022A-\u022D\u0230-\u0233\u0304\u0308\u0313-\u0314\u0342-\u0345\u037A\u037E\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03CE\u03D0-\u03D7\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F5\u0401\u0407\u0451\u0457\u04D2-\u04D3\u04DA-\u04DF\u04E2-\u04E7\u04EA-\u04F1\u04F4-\u04F5\u04F8-\u04F9\u1E14-\u1E17\u1E20-\u1E21\u1E26-\u1E27\u1E2E-\u1E2F\u1E38-\u1E39\u1E4E-\u1E53\u1E5C-\u1E5D\u1E7A-\u1E7B\u1E84-\u1E85\u1E8C-\u1E8D\u1E97\u1F00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC1-\u1FC4\u1FC6-\u1FCC\u1FCF-\u1FD3\u1FD6-\u1FDB\u1FDF-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2126] ;" - -":: NFD (NFC) ;" - -// TEST CASES - -// Ὀλίγοι ἔμφονες πολλῶν ἀφρόνων φοβερώτεροι — Πλάτωνος -// ᾂ ᾒ ᾢ ᾃ ᾓ ᾣ -// ᾳ ῃ ῳ ὃ ὄ -// ὠς ὡς ὢς ὣς -// Ὠς Ὡς Ὢς Ὣς -// ὨΣ ὩΣ ὪΣ ὫΣ -// Ạ, ạ, Ẹ, ẹ, Ọ, ọ - -// Useful variables - -"$lower = [[:latin:][:greek:] & [:Ll:]];" -"$glower = [[:greek:] & [:Ll:]];" -"$upper = [[:latin:][:greek:] & [:Lu:]] ;" -"$accent = [:M:] ;" - -// NOTE: restrict to just the Greek & Latin accents that we care about -// TODO: broaden out once interation is fixed -"$accentMinus = [ [\u0300-\u0345] & [:M:] - [\u0338]] ;" - -"$macron = \u0304 ;" -"$ddot = \u0308 ;" -"$ddotmac = [$ddot$macron];" - -"$lcgvowel = [αεηιουω] ;" -"$ucgvowel = [ΑΕΗΙΟΥΩ] ;" -"$gvowel = [$lcgvowel $ucgvowel] ;" -"$lcgvowelC = [$lcgvowel $accent] ;" - -"$evowel = [aeiouyAEIOUY];" -"$evowel2 = [iuyIUY];" -"$vowel = [ $evowel $gvowel] ;" - -"$gammaLike = [ΓΚΞΧγκξχϰ] ;" -"$egammaLike = [GKXCgkxc] ;" -"$smooth = ̓ ;" -"$rough = ̔ ;" -"$iotasub = ͅ ;" - -"$evowel_i = [$evowel-[iI]] ;" -"$evowel2_i = [uyUY];" - -"$underbar = \u0331;" - -"$afterLetter = [:L:] [[:M:]\\\']* ;" -"$beforeLetter = [[:M:]\\\']* [:L:] ;" -"$beforeLower = $accent * $lower ;" - -"$notLetter = [^[:L:][:M:]] ;" -"$under = ̱;" - -// Fix punctuation -// preserve original -"\\\: <> \\\: $under ;" -"\\\? <> \\\? $under ;" - -"\\\; <> \\\? ;" -"· <> \\\: ;" - -// CIRCUMFLEX: convert greek circumflex to normal one. Could use tilde or inverted breve - -"\u0342 <> \u0302 ;" - -// IOTA: convert iota subscript to iota -// first make previous alpha long! - -"$accent_minus = [[$accent]-[$iotasub$macron]];" - -"Α } $accent_minus * $iotasub > | Α $macron ;" -"α } $accent_minus * $iotasub > | α $macron ;" - -// now convert to uppercase if after uppercase, ow to lowercase - -"$upper $accent * { $iotasub > I ;" -"$iotasub > i ;" - -"| $1 $iotasub < ($evowel $macron $accentMinus *) i ;" -"| $1 $iotasub < ($evowel $macron $accentMinus *) I ;" - -// BREATHING - -// Convert rough breathing to h, and move before letters. - -// Make A ` x = > H a x - - "Α ($macron?) $rough } $beforeLower > H | α $1;" - "Ε $rough } $beforeLower > H | ε;" - "Η $rough } $beforeLower > H | η ;" - "Ι ($ddot?) $rough } $beforeLower > H | ι $1;" - "Ο $rough } $beforeLower > H | ο ;" - "Υ $rough } $beforeLower > H | υ ;" - "Ω ($ddot?) $rough } $beforeLower > H | ω $1;" - -// Make A x ` = > H a x - -"Α ($glower $macron?) $rough > H | α $1 ;" -"Ε ($glower) $rough > H | ε $1 ;" -"Η ($glower) $rough > H | η $1 ;" -"Ι ($glower $ddot?) $rough > H | ι $1 ;" -"Ο ($glower) $rough > H | ο $1 ;" -"Υ ($glower) $rough > H | υ $1 ;" -"Ω ($glower $ddot?) $rough > H | ω $1 ;" - -//Otherwise, make x ` into h x and X ` into H X - -"($lcgvowel + $ddotmac? ) $rough > h | $1 ;" -"($gvowel + $ddotmac? ) $rough > H | $1 ;" - -// Go backwards with H - -"| $1 $rough < h ($evowel $macron $ddot? $evowel2_i $macron?) ;" -"| $1 $rough < h ($evowel $ddot? $evowel2 $macron?) ;" -"| $1 $rough < h ($evowel $macron? $ddot?) ;" - -"| $1 $rough < H ([AEIOUY] $macron $ddot? $evowel2_i $macron?) ;" -"| $1 $rough < H ([AEIOUY] $ddot? $evowel2 $macron?) ;" -"| $1 $rough < H ([AEIOUY] $macron? $ddot?) ;" - -// titlecase, have to fix individually -// in the future, we should add &uppercase() to make this easier - -"| A $1 $rough < H a ($macron $ddot? $evowel2_i $macron?) ;" -"| E $1 $rough < H e ($macron $ddot? $evowel2_i $macron?) ;" -"| I $1 $rough < H i ($macron $ddot? $evowel2_i $macron?) ;" -"| O $1 $rough < H o ($macron $ddot? $evowel2_i $macron?) ;" -"| U $1 $rough < H u ($macron $ddot? $evowel2_i $macron?) ;" -"| Y $1 $rough < H y ($macron $ddot? $evowel2_i $macron?) ;" - -"| A $1 $rough < H a ($ddot? $evowel2 $macron?) ;" -"| E $1 $rough < H e ($ddot? $evowel2 $macron?) ;" -"| I $1 $rough < H i ($ddot? $evowel2 $macron?) ;" -"| O $1 $rough < H o ($ddot? $evowel2 $macron?) ;" -"| U $1 $rough < H u ($ddot? $evowel2 $macron?) ;" -"| Y $1 $rough < H y ($ddot? $evowel2 $macron?) ;" - -"| A $1 $rough < H a ($macron? $ddot? ) ;" -"| E $1 $rough < H e ($macron? $ddot? ) ;" -"| I $1 $rough < H i ($macron? $ddot? ) ;" -"| O $1 $rough < H o ($macron? $ddot? ) ;" -"| U $1 $rough < H u ($macron? $ddot? ) ;" -"| Y $1 $rough < H y ($macron? $ddot? ) ;" - -// Now do smooth - -//delete smooth breathing for Latin -"$smooth > ;" - -// insert in Greek -// the assumption is that all Marks are on letters. - - "| $1 $smooth < $notLetter { ([rR]) } [^hH$smooth$rough] ;" - "| $1 $smooth < $notLetter { ($evowel $macron? $evowel2 $macron?) } [^$smooth$rough] ;" - "| $1 $smooth < $notLetter { ($evowel $macron?) } [^$evowel2$smooth$rough] ;" - -// TODO: preserve smooth/rough breathing if not -// on initial vowel sequence - -// need to have these up here so the rules don't mask - -// remove now superfluous macron when returning - -"Α < A $macron ;" -"α < a $macron ;" - -"η <> e $macron ;" -"Η <> E $macron ;" - -"φ <> ph ;" -"Ψ } $beforeLower <> Ps ;" -"Ψ <> PS ;" - -"Φ } $beforeLower <> Ph ;" -"Φ <> PH ;" -"ψ <> ps ;" - -"ω <> o $macron ;" -"Ω <> O $macron;" - -// NORMAL - -"α <> a ;" -"Α <> A ;" - -"β <> b ;" -"Β <> B ;" - -"γ } $gammaLike <> n } $egammaLike ;" -"γ <> g ;" -"Γ } $gammaLike <> N } $egammaLike ;" -"Γ <> G ;" - -"δ <> d ;" -"Δ <> D ;" - -"ε <> e ;" -"Ε <> E ;" - -"ζ <> z ;" -"Ζ <> Z ;" - -"θ <> th ;" -"Θ } $beforeLower <> Th ;" -"Θ <> TH ;" - -"ι <> i ;" -"Ι <> I ;" - -"κ <> k ;" -"Κ <> K ;" - -"λ <> l ;" -"Λ <> L ;" - -"μ <> m ;" -"Μ <> M ;" - -"ν } $gammaLike > n\\\' ;" -"ν <> n ;" -"Ν } $gammaLike <> N\\\' ;" -"Ν <> N ;" - -"ξ <> x ;" -"Ξ <> X ;" - -"ο <> o ;" -"Ο <> O ;" - -"π <> p ;" -"Π <> P ;" - -"ρ $rough <> rh;" -"Ρ $rough } $beforeLower <> Rh ;" -"Ρ $rough <> RH ;" -"ρ <> r ;" -"Ρ <> R ;" - -// insert separator - -"[Pp] { } ς > \\\' ;" -"[Pp] { } σ > \\\' ;" - -// underbar means exception - -// before a letter, initial -"ς } $beforeLetter <> s $underbar } $beforeLetter;" -"σ } $beforeLetter <> s } $beforeLetter;" - -// otherwise, after a letter = final -"$afterLetter { σ <> $afterLetter { s $underbar;" -"$afterLetter { ς <> $afterLetter { s ;" - -// otherwise (isolated) = initial -"ς <> s $underbar;" -"σ <> s ;" - -"[Pp] { Σ <> \\\'S ;" -"Σ <> S ;" - -"τ <> t ;" -"Τ <> T ;" - -"$vowel {υ } <> u ;" -"υ <> y ;" -"$vowel { Υ <> U ;" -"Υ <> Y ;" - -"χ <> ch ;" -"Χ } $beforeLower <> Ch ;" -"Χ <> CH ;" - -// Completeness for ASCII - -"$ignore = [[:Mark:]''] * ;" - -"| k < c ;" -"| ph < f ;" -"| i < j ;" -"| k < q ;" -"| b < v } $vowel ;" -"| b < w } $vowel;" -"| u < v ;" -"| u < w;" -"| K < C ;" -"| Ph < F ;" -"| I < J ;" -"| K < Q ;" -"| B < V } $vowel ;" -"| B < W } $vowel ;" -"| U < V ;" -"| U < W ;" - -"$rough } $ignore [:UppercaseLetter:] > H ;" -"$ignore [:UppercaseLetter:] { $rough > H ;" -"$rough < H ;" -"$rough <> h ;" - -// Completeness for Greek - -"ϐ > | β ;" -"ϑ > | θ ;" -"ϒ > | Υ ;" -"ϕ > | φ ;" -"ϖ > | π ;" - -"ϰ > | κ ;" -"ϱ > | ρ ;" -"ϲ > | σ ;" -"ϳ > j ;" -"ϴ > | Θ ;" -"ϵ > | ε ;" - -"µ > | μ ;" - - "ͺ > i;" - -// delete any trailing ' marks used for roundtripping - - "< [Ππ] { \\\' } [Ss] ;" - "< [Νν] { \\\' } $egammaLike ;" - -"::NFC (NFD) ;" -// ([\\u0000-\u007F [:Latin:] [:Greek:] [:nonspacing mark:]]) ; -// ([\\u0000-\u007F \u00B7 [:Latin:] [:nonspacing mark:]]) ; -// MINIMAL FILTER GENERATED FOR: Latin-Greek BACKWARD -":: ( [':?A-Za-z\u00C0-\u00C5\u00C7-\u00CF\u00D1-\u00D6\u00D9-\u00DD\u00E0-\u00E5\u00E7-\u00EF\u00F1-\u00F6\u00F9-\u00FD\u00FF-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E3\u01E6-\u01F0\u01F4-\u01F5\u01F8-\u021B\u021E-\u021F\u0226-\u0233\u0300-\u0337\u0339-\u0345\u0385-\u0386\u0388-\u038A\u038C\u038E-\u0390\u03AA-\u03B0\u03CA-\u03CE\u03D3-\u03D4\u0400-\u0401\u0403\u0407\u040C-\u040E\u0419\u0439\u0450-\u0451\u0453\u0457\u045C-\u045E\u0476-\u0477\u04C1-\u04C2\u04D0-\u04D3\u04D6-\u04D7\u04DA-\u04DF\u04E2-\u04E7\u04EA-\u04F5\u04F8-\u04F9\u1E00-\u1E99\u1E9B\u1EA0-\u1EF9\u1F00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FC1-\u1FC4\u1FC6-\u1FD3\u1FD6-\u1FDB\u1FDD-\u1FEE\u1FF2-\u1FF4\u1FF6-\u1FFC\u212A-\u212B] ) ;" - } -} diff --git a/icuSources/data/translit/t_Grek_Latn_UNGEGN.txt b/icuSources/data/translit/t_Grek_Latn_UNGEGN.txt deleted file mode 100644 index 52e43b06..00000000 --- a/icuSources/data/translit/t_Grek_Latn_UNGEGN.txt +++ /dev/null @@ -1,260 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_Greek_Latin_UNGEGN.txt -// Date: Sat Jul 27 10:31:01 2002 -//-------------------------------------------------------------------- - -// Greek_Latin_UNGEGN - -t_Grek_Latn_UNGEGN { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -// For modern Greek, based on UNGEGN rules. - -// Rules are predicated on running NFD first, and NFC afterwards -// MINIMAL FILTER GENERATED FOR: Greek-Latin/UNGEGN -// WARNING: need to add accents to both filters ### -// :: [́̄̆̈;µ·ÀÂÈÊÌÎÒÔÙÛàâèêìîòôùûĈ-ĉĜ-ĝĤ-ĥĴ-ĵŜ-ŝŴ-ŷǛ-ǜǸ-ǹ̀̂̓-̔̀͂-̓ͅͺ;Ά-ΊΌΎ-ΡΣ-ώϐ-ϖϰ-ϵЀЍѐѝḔ-ḕṐ-ṑẀ-ẁẐ-ẑẤ-ậẰ-ằẾ-ệỐ-ộỜ-ờỪ-ừỲ-ỳἀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼι῁-ῄῆ-῍῏-ΐῖ-Ί῝῟-῭ῲ-ῴῶ-ῼΩ] ; - -":: [[[:Greek:][:Mn:][:Me:]] [\\\:-;?\u00B7\u037E\u0387]] ;" -"::NFD (NFC) ;" - -// Useful variables - -"$lower = [[:latin:][:greek:] & [:Ll:]] ;" -"$upper = [[:latin:][:greek:] & [:Lu:]] ;" -"$accent = [[:Mn:][:Me:]] ;" - -"$macron = ̄ ;" -"$ddot = ̈ ;" - -"$lcgvowel = [αεηιουω] ;" -"$ucgvowel = [ΑΕΗΙΟΥΩ] ;" -"$gvowel = [$lcgvowel $ucgvowel] ;" -"$lcgvowelC = [$lcgvowel $accent] ;" - -"$evowel = [aeiouyAEIOUY];" -"$vowel = [ $evowel $gvowel] ;" - -"$beforeLower = $accent * $lower ;" - -"$gammaLike = [ΓΚΞΧγκξχϰ] ;" -"$egammaLike = [GKXCgkxc] ;" -"$smooth = ̓ ;" -"$rough = ̔ ;" -"$iotasub = ͅ ;" - -"$softener = [βΒγΓδΔζΖλΛμΜνΝρΡ$gvowel] ;" - -"$under = ̱;" - -"$caron = ̌;" - -"$afterLetter = [:L:] [\\\'$accent]* ;" -"$beforeLetter = [\\\'$accent]* [:L:] ;" - -// Fix punctuation - -// preserve orginal -"\\\: <> \\\: $under ;" -"\\\? <> \\\? $under ;" - -"\\\; <> \\\? ;" -"· <> \\\: ;" - -// Fix any ancient characters that creep in - -"͂ > ́ ;" -"̂ > ́ ;" -"̀ > ́ ;" -"$smooth > ;" -"$rough > ;" -"$iotasub > ;" -"ͺ > ;" - -// need to have these up here so the rules don't mask - -"η <> i $under ;" -"Η <> I $under ;" - -"Ψ } $beforeLower <> Ps ;" -"Ψ <> PS ;" -"ψ <> ps ;" - -"ω <> o $under ;" -"Ω <> O $under;" - -// at begining or end of word, convert mp to b - -"[^[:L:]$accent] { μπ > b ;" -"μπ } [^[:L:]$accent] > b ;" -"[^[:L:]$accent] { [Μμ][Ππ] > B ;" -"[Μμ][Ππ] } [^[:L:]$accent] > B ;" - -"μπ < b ;" -"Μπ < B } $beforeLower ;" -"ΜΠ < B ;" - -// handle diphthongs ending with upsilon - -"ου <> ou ;" -"ΟΥ <> OU ;" -"Ου <> Ou ;" -"οΥ <> oU ;" - -"$fmaker = [aeiAEI] $under ? ;" -"$shiftForwardVowels = [[:Mn:]-[\u0308]];" // note: a diaeresis keeps the items separate - -"$fmaker { υ ( $shiftForwardVowels )* } $softener > $1 v $under ;" -"υ $1 < ( $shiftForwardVowels )* v $under ;" - -"$fmaker { υ ( $shiftForwardVowels )* } > $1 f $under;" -"υ $1 < ( $shiftForwardVowels )* f $under ;" - -"$fmaker { Υ } $softener <> V $under ;" -"$fmaker { Υ <> U $under ;" - -"υ <> y ;" -"Υ <> Y ;" - -// NORMAL - -"α <> a ;" -"Α <> A ;" - -"β <> v ;" -"Β <> V ;" - -"γ } $gammaLike <> n } $egammaLike ;" -"γ <> g ;" -"Γ } $gammaLike <> N } $egammaLike ;" -"Γ <> G ;" - -"δ <> d ;" -"Δ <> D ;" - -"ε <> e ;" -"Ε <> E ;" - -"ζ <> z ;" -"Ζ <> Z ;" - -"θ <> th ;" -"Θ } $beforeLower <> Th ;" -"Θ <> TH ;" - -"ι <> i ;" -"Ι <> I ;" - -"κ <> k ;" -"Κ <> K ;" - -"λ <> l ;" -"Λ <> L ;" - -"μ <> m ;" -"Μ <> M ;" - -"ν } $gammaLike > n\\\' ;" -"ν <> n ;" -"Ν } $gammaLike <> N\\\' ;" -"Ν <> N ;" - -"ξ <> x ;" -"Ξ <> X ;" - -"ο <> o ;" -"Ο <> O ;" - -"π <> p ;" -"Π <> P ;" - -"ρ <> r ;" -"Ρ <> R ;" - -"[Pp] { } ς > \\\' ;" -"[Pp] { } σ > \\\' ;" - -// Caron means exception - -// before a letter, initial -"ς } $beforeLetter <> s $under } $beforeLetter;" -"σ } $beforeLetter <> s } $beforeLetter;" - -// otherwise, after a letter = final -"$afterLetter { σ <> $afterLetter { s $under;" -"$afterLetter { ς <> $afterLetter { s ;" - -// otherwise (isolated) = initial -"ς <> s $under;" -"σ <> s ;" - -"[Pp] { Σ <> \\\'S ;" -"Σ <> S ;" - -"τ <> t ;" -"Τ <> T ;" - -"φ <> f ;" -"Φ <> F ;" - -"χ <> ch ;" -"Χ } $beforeLower <> Ch ;" -"Χ <> CH ;" - -// Completeness for ASCII - -// $ignore = [[:Mark:]''] * ; - -"| ch < h ;" -"| k < c ;" -"| i < j ;" -"| k < q ;" -"| b < u } $vowel ;" -"| b < w } $vowel ;" -"| y < u ;" -"| y < w ;" - -"| Ch < H ;" -"| K < C ;" -"| I < J ;" -"| K < Q ;" -"| B < W } $vowel ;" -"| B < U } $vowel ;" -"| Y < W ;" -"| Y < U ;" - -// Completeness for Greek - -"ϐ > | β ;" -"ϑ > | θ ;" -"ϒ > | Υ ;" -"ϕ > | φ ;" -"ϖ > | π ;" - -"ϰ > | κ ;" -"ϱ > | ρ ;" -"ϲ > | σ ;" -"ϳ > j ;" -"ϴ > | Θ ;" -"ϵ > | ε ;" -"µ > | μ ;" - -// delete any trailing ' marks used for roundtripping - - "< [Ππ] { \\\' } [Ss] ;" - "< [Νν] { \\\' } $egammaLike ;" - -"::NFC (NFD) ;" - -// MINIMAL FILTER GENERATED FOR: Latin-Greek/UNGEGN BACKWARD -":: ([[[:Latin:][:Mn:][:Me:]] ['\\\:?]]) ;" - } -} diff --git a/icuSources/data/translit/t_Gujr_InterIndic.txt b/icuSources/data/translit/t_Gujr_InterIndic.txt deleted file mode 100644 index a1d83719..00000000 --- a/icuSources/data/translit/t_Gujr_InterIndic.txt +++ /dev/null @@ -1,105 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_Gujarati_InterIndic.txt -// Date: Sat Jul 27 10:31:01 2002 -//-------------------------------------------------------------------- - -// Gujarati_InterIndic - -t_Gujr_InterIndic { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// Gujarati-InterIndic -//:: NFD (NFC) ; -"\u0a81>\ue001;" // SIGN CANDRABINDU -"\u0a82>\ue002;" // SIGN ANUSVARA -"\u0a83>\ue003;" // SIGN VISARGA -"\u0a85>\ue005;" // LETTER A -"\u0a86>\ue006;" // LETTER AA -"\u0a87>\ue007;" // LETTER I -"\u0a88>\ue008;" // LETTER II -"\u0a89>\ue009;" // LETTER U -"\u0a8a>\ue00a;" // LETTER UU -"\u0a8b>\ue00b;" // LETTER VOCALIC R -"\u0a8d>\ue00d;" // UNMAPPED Gujarati-InterIndic: VOWEL CANDRA E -"\u0a8f>\ue00f;" // LETTER E -"\u0a90>\ue010;" // LETTER AI -"\u0a91>\ue011;" // UNMAPPED Gujarati-InterIndic: VOWEL CANDRA O -"\u0a93>\ue013;" // LETTER O -"\u0a94>\ue014;" // LETTER AU -"\u0a95>\ue015;" // LETTER KA -"\u0a96>\ue016;" // LETTER KHA -"\u0a97>\ue017;" // LETTER GA -"\u0a98>\ue018;" // LETTER GHA -"\u0a99>\ue019;" // LETTER NGA -"\u0a9a>\ue01a;" // LETTER CA -"\u0a9b>\ue01b;" // LETTER CHA -"\u0a9c>\ue01c;" // LETTER JA -"\u0a9d>\ue01d;" // LETTER JHA -"\u0a9e>\ue01e;" // LETTER NYA -"\u0a9f>\ue01f;" // LETTER TTA -"\u0aa0>\ue020;" // LETTER TTHA -"\u0aa1>\ue021;" // LETTER DDA -"\u0aa2>\ue022;" // LETTER DDHA -"\u0aa3>\ue023;" // LETTER NNA -"\u0aa4>\ue024;" // LETTER TA -"\u0aa5>\ue025;" // LETTER THA -"\u0aa6>\ue026;" // LETTER DA -"\u0aa7>\ue027;" // LETTER DHA -"\u0aa8>\ue028;" // LETTER NA -"\u0aaa>\ue02a;" // LETTER PA -"\u0aab>\ue02b;" // LETTER PHA -"\u0aac>\ue02c;" // LETTER BA -"\u0aad>\ue02d;" // LETTER BHA -"\u0aae>\ue02e;" // LETTER MA -"\u0aaf>\ue02f;" // LETTER YA -"\u0ab0>\ue030;" // LETTER RA -"\u0ab2>\ue032;" // LETTER LA -"\u0ab3>\ue033;" // LETTER LLA -"\u0ab5>\ue035;" // LETTER VA -"\u0ab6>\ue036;" // LETTER SHA -"\u0ab7>\ue037;" // LETTER SSA -"\u0ab8>\ue038;" // LETTER SA -"\u0ab9>\ue039;" // LETTER HA -"\u0abc>\ue03c;" // SIGN NUKTA -"\u0abd>\ue03d;" // SIGN AVAGRAHA -"\u0abe>\ue03e;" // VOWEL SIGN AA -"\u0abf>\ue03f;" // VOWEL SIGN I -"\u0ac0>\ue040;" // VOWEL SIGN II -"\u0ac1>\ue041;" // VOWEL SIGN U -"\u0ac2>\ue042;" // VOWEL SIGN UU -"\u0ac3>\ue043;" // VOWEL SIGN VOCALIC R -"\u0ac4>\ue044;" // VOWEL SIGN VOCALIC RR -"\u0ac5>\ue045;" // VOWEL SIGN CANDRA E -"\u0ac7>\ue047;" // VOWEL SIGN E -"\u0ac8>\ue048;" // VOWEL SIGN AI -"\u0ac9>\ue049;" // VOWEL SIGN CANDRA O -"\u0acb>\ue04b;" // VOWEL SIGN O -"\u0acc>\ue04c;" // VOWEL SIGN AU -"\u0acd>\ue04d;" // SIGN VIRAMA -"\u0ad0>\ue050;" // OM -"\u0ae0>\ue060;" // LETTER VOCALIC RR -"\u0ae6>\ue066;" // DIGIT ZERO -"\u0ae7>\ue067;" // DIGIT ONE -"\u0ae8>\ue068;" // DIGIT TWO -"\u0ae9>\ue069;" // DIGIT THREE -"\u0aea>\ue06a;" // DIGIT FOUR -"\u0aeb>\ue06b;" // DIGIT FIVE -"\u0aec>\ue06c;" // DIGIT SIX -"\u0aed>\ue06d;" // DIGIT SEVEN -"\u0aee>\ue06e;" // DIGIT EIGHT -"\u0aef>\ue06f;" // DIGIT NINE -"\u0964>\ue064;" // DANDA -"\u0965>\ue065;" // DOUBLE DANDA -// :: NFC (NFD) ; -// eof - } -} diff --git a/icuSources/data/translit/t_Guru_InterIndic.txt b/icuSources/data/translit/t_Guru_InterIndic.txt deleted file mode 100644 index 57de65e7..00000000 --- a/icuSources/data/translit/t_Guru_InterIndic.txt +++ /dev/null @@ -1,112 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_Gurmukhi_InterIndic.txt -// Date: Sat Jul 27 10:31:01 2002 -//-------------------------------------------------------------------- - -// Gurmukhi_InterIndic - -t_Guru_InterIndic { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// Gurmukhi-InterIndic -//:: NFD (NFC) ; - -//\u0A16\u0A3C>\uE059; # LETTER KHHA -//\u0A17\u0A3C>\uE05A; # LETTER GHHA -//\u0A1C\u0A3C>\uE05B; # LETTER ZA -//\u0A38\u0A3C>\uE036; # LETTER SHA -//\u0A32\u0A3C>\uE033; # LETTER LLA -//\u0A2B\u0A3C>\uE05E; # LETTER FA - -"\u0A02>\uE002;" // SIGN BINDI -"\u0A05>\uE005;" // LETTER A -"\u0A06>\uE006;" // LETTER AA -"\u0A07>\uE007;" // LETTER I -"\u0A08>\uE008;" // LETTER II -"\u0A09>\uE009;" // LETTER U -"\u0A0A>\uE00A;" // LETTER UU -"\u0A0C>;" // UNMAPPED -"\u0A0F>\uE00F;" // LETTER EE -"\u0A10>\uE010;" // LETTER AI -"\u0A13>\uE013;" // LETTER OO -"\u0A14>\uE014;" // LETTER AU -"\u0A15>\uE015;" // LETTER KA -"\u0A16>\uE016;" // LETTER KHA -"\u0A17>\uE017;" // LETTER GA -"\u0A18>\uE018;" // LETTER GHA -"\u0A19>\uE019;" // LETTER NGA -"\u0A1A>\uE01A;" // LETTER CA -"\u0A1B>\uE01B;" // LETTER CHA -"\u0A1C>\uE01C;" // LETTER JA -"\u0A1D>\uE01D;" // LETTER JHA -"\u0A1E>\uE01E;" // LETTER NYA -"\u0A1F>\uE01F;" // LETTER TTA -"\u0A20>\uE020;" // LETTER TTHA -"\u0A21>\uE021;" // LETTER DDA -"\u0A22>\uE022;" // LETTER DDHA -"\u0A23>\uE023;" // LETTER NNA -"\u0A24>\uE024;" // LETTER TA -"\u0A25>\uE025;" // LETTER THA -"\u0A26>\uE026;" // LETTER DA -"\u0A27>\uE027;" // LETTER DHA -"\u0A28>\uE028;" // LETTER NA -"\u0A2A>\uE02A;" // LETTER PA -"\u0A2B>\uE02B;" // LETTER PHA -"\u0A2C>\uE02C;" // LETTER BA -"\u0A2D>\uE02D;" // LETTER BHA -"\u0A2E>\uE02E;" // LETTER MA -"\u0A2F>\uE02F;" // LETTER YA -"\u0A30>\uE030;" // LETTER RA -"\u0A32>\uE032;" // LETTER LA -"\u0a33>\uE033;" // FALLBACK -"\u0A35>\uE035;" // LETTER VA -"\u0a36>\ue036;" -"\u0A38\\\0a3c>\ue036;" -"\u0A37>\uE036;" -"\u0A38>\uE038;" // LETTER SA -"\u0A39>\uE039;" // LETTER HA -"\u0A3C>\uE03C;" // SIGN NUKTA -"\u0A3E>\uE03E;" // VOWEL SIGN AA -"\u0A3F>\uE03F;" // VOWEL SIGN I -"\u0A40>\uE040;" // VOWEL SIGN II -"\u0A41>\uE041;" // VOWEL SIGN U -"\u0A42>\uE042;" // VOWEL SIGN UU -"\u0A47>\uE047;" // VOWEL SIGN EE -"\u0A48>\uE048;" // VOWEL SIGN AI -"\u0A4B>\uE04B;" // VOWEL SIGN OO -"\u0A4C>\uE04C;" // VOWEL SIGN AU -"\u0A4D>\uE04D;" // SIGN VIRAMA - -"\u0A5C>\uE05C;" // LETTER RRA - -"\u0A66>\uE066;" // DIGIT ZERO -"\u0A67>\uE067;" // DIGIT ONE -"\u0A68>\uE068;" // DIGIT TWO -"\u0A69>\uE069;" // DIGIT THREE -"\u0A6A>\uE06A;" // DIGIT FOUR -"\u0A6B>\uE06B;" // DIGIT FIVE -"\u0A6C>\uE06C;" // DIGIT SIX -"\u0A6D>\uE06D;" // DIGIT SEVEN -"\u0A6E>\uE06E;" // DIGIT EIGHT -"\u0A6F>\uE06F;" // DIGIT NINE -"\u0A70>\uE070;" // TIPPI -"\u0A71>\uE071;" // ADDAK -"\u0A72>\uE072;" // IRI -"\u0A73>\uE073;" // URA -"\u0A74>\uE074;" // EK ONKAR -"\u0964>\ue064;" // DANDA -"\u0965>\ue065;" // DOUBLE DANDA -// :: NFC (NFD) ; -// eof - - } -} diff --git a/icuSources/data/translit/t_Hani_Latn.txt b/icuSources/data/translit/t_Hani_Latn.txt deleted file mode 100644 index a1e60b82..00000000 --- a/icuSources/data/translit/t_Hani_Latn.txt +++ /dev/null @@ -1,25439 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_Han_Latin.txt -// Date: Thu Dec 12 13:02:47 2002 -//-------------------------------------------------------------------- - -// Han_Latin - -t_Hani_Latn { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// Warning: does not do round-trip mapping!! - -// Convert CJK characters -//# :: (halfwidth-fullwidth); - -"$terminalPunct = [\\\.\\\,\\\:\\\;\\\?\\\!.,:?!。、;[:Pe:][:Pf:]];" -"$initialPunct = [:Ps:][:Pi:];" - -// add space between any terminal punctuation and letters, and -// between letters and Han or initial punct - -"$terminalPunct { } [:L:] > ' ';" -"[:L:] { } [[:Han:] $initialPunct] > ' ';" - -// below, the rules add space after ideographs. Remove that space before terminals -"{ ' ' } $terminalPunct > ;" - -// remove all spaces going backwards -//# < ' '; - -// Start RAW data for converting CJK characters -"双>shuāng|\\\ ;" -"装>zhuāng|\\\ ;" -"创>chuàng|\\\ ;" -"窗>chuāng|\\\ ;" -"状>zhuàng|\\\ ;" -"床>chuáng|\\\ ;" -"庄>zhuāng|\\\ ;" -"撞>zhuàng|\\\ ;" -"壮>zhuàng|\\\ ;" -"闯>chuǎng|\\\ ;" -"爽>shuǎng|\\\ ;" -"妆>zhuāng|\\\ ;" -"桩>zhuāng|\\\ ;" -"霜>shuāng|\\\ ;" -"幢>chuáng|\\\ ;" -"疮>chuāng|\\\ ;" -"怆>chuàng|\\\ ;" -"孀>shuāng|\\\ ;" -"泶>shuāng|\\\ ;" -"疒>chuáng|\\\ ;" -"㡖>chuáng|\\\ ;" -"㦼>shuàng|\\\ ;" -"㵂>chuǎng|\\\ ;" -"㼽>shuǎng|\\\ ;" -"䃥>chuáng|\\\ ;" -"䇬>chuǎng|\\\ ;" -"䎫>chuàng|\\\ ;" -"䗮>shuǎng|\\\ ;" -"䚒>chuáng|\\\ ;" -"䡯>shuàng|\\\ ;" -"䡴>chuáng|\\\ ;" -"䫪>shuǎng|\\\ ;" -"䭚>chuáng|\\\ ;" -"刅>chuāng|\\\ ;" -"刓>chuāng|\\\ ;" -"刱>chuàng|\\\ ;" -"剏>chuāng|\\\ ;" -"剙>chuàng|\\\ ;" -"剭>chuāng|\\\ ;" -"創>chuàng|\\\ ;" -"噇>chuáng|\\\ ;" -"塽>shuǎng|\\\ ;" -"壯>zhuàng|\\\ ;" -"壵>zhuàng|\\\ ;" -"妝>zhuāng|\\\ ;" -"娤>zhuāng|\\\ ;" -"孇>shuāng|\\\ ;" -"愴>chuàng|\\\ ;" -"慡>shuǎng|\\\ ;" -"戇>zhuàng|\\\ ;" -"戧>chuāng|\\\ ;" -"摐>chuāng|\\\ ;" -"摤>chuǎng|\\\ ;" -"撝>chuáng|\\\ ;" -"梉>zhuāng|\\\ ;" -"樁>zhuāng|\\\ ;" -"樉>shuǎng|\\\ ;" -"橦>chuáng|\\\ ;" -"欆>shuāng|\\\ ;" -"漺>chuǎng|\\\ ;" -"灀>shuàng|\\\ ;" -"焋>zhuàng|\\\ ;" -"爼>shuāng|\\\ ;" -"牀>chuáng|\\\ ;" -"牎>chuāng|\\\ ;" -"牕>chuāng|\\\ ;" -"狀>zhuàng|\\\ ;" -"獊>chuàng|\\\ ;" -"瘡>chuāng|\\\ ;" -"礵>shuāng|\\\ ;" -"窓>chuāng|\\\ ;" -"窻>chuāng|\\\ ;" -"粧>zhuāng|\\\ ;" -"糚>zhuāng|\\\ ;" -"縔>shuǎng|\\\ ;" -"艭>shuāng|\\\ ;" -"荘>zhuāng|\\\ ;" -"莊>zhuāng|\\\ ;" -"裝>zhuāng|\\\ ;" -"闖>chuǎng|\\\ ;" -"雙>shuāng|\\\ ;" -"騺>shuāng|\\\ ;" -"騻>shuǎng|\\\ ;" -"驦>shuāng|\\\ ;" -"骦>shuāng|\\\ ;" -"鷞>shuāng|\\\ ;" -"鸘>shuāng|\\\ ;" -"鹴>shuāng|\\\ ;" -"中>zhōng|\\\ ;" -"上>shàng|\\\ ;" -"生>shēng|\\\ ;" -"成>chéng|\\\ ;" -"想>xiǎng|\\\ ;" -"两>liǎng|\\\ ;" -"长>cháng|\\\ ;" -"将>jiāng|\\\ ;" -"种>zhǒng|\\\ ;" -"声>shēng|\\\ ;" -"向>xiàng|\\\ ;" -"正>zhèng|\\\ ;" -"重>chóng|\\\ ;" -"相>xiāng|\\\ ;" -"政>zhèng|\\\ ;" -"场>cháng|\\\ ;" -"张>zhāng|\\\ ;" -"常>cháng|\\\ ;" -"光>guāng|\\\ ;" -"象>xiàng|\\\ ;" -"传>chuán|\\\ ;" -"城>chéng|\\\ ;" -"强>qiáng|\\\ ;" -"转>zhuǎn|\\\ ;" -"量>liáng|\\\ ;" -"众>zhòng|\\\ ;" -"程>chéng|\\\ ;" -"江>jiāng|\\\ ;" -"黄>huáng|\\\ ;" -"商>shāng|\\\ ;" -"像>xiàng|\\\ ;" -"广>guǎng|\\\ ;" -"香>xiāng|\\\ ;" -"专>zhuān|\\\ ;" -"争>zhēng|\\\ ;" -"讲>jiǎng|\\\ ;" -"终>zhōng|\\\ ;" -"冲>chōng|\\\ ;" -"证>zhèng|\\\ ;" -"响>xiǎng|\\\ ;" -"称>chēng|\\\ ;" -"整>zhěng|\\\ ;" -"伤>shāng|\\\ ;" -"掌>zhǎng|\\\ ;" -"省>shěng|\\\ ;" -"况>kuàng|\\\ ;" -"娘>niáng|\\\ ;" -"项>xiàng|\\\ ;" -"章>zhāng|\\\ ;" -"兄>xiōng|\\\ ;" -"承>chéng|\\\ ;" -"乡>xiāng|\\\ ;" -"穿>chuān|\\\ ;" -"胜>shèng|\\\ ;" -"皇>huáng|\\\ ;" -"亮>liàng|\\\ ;" -"雄>xióng|\\\ ;" -"奖>jiǎng|\\\ ;" -"船>chuán|\\\ ;" -"尚>shàng|\\\ ;" -"钟>zhōng|\\\ ;" -"厂>chǎng|\\\ ;" -"充>chōng|\\\ ;" -"良>liáng|\\\ ;" -"丈>zhàng|\\\ ;" -"枪>qiāng|\\\ ;" -"降>jiàng|\\\ ;" -"升>shēng|\\\ ;" -"唱>chàng|\\\ ;" -"征>zhēng|\\\ ;" -"墙>qiáng|\\\ ;" -"圣>shèng|\\\ ;" -"抢>qiǎng|\\\ ;" -"胸>xiōng|\\\ ;" -"乘>chéng|\\\ ;" -"盛>shèng|\\\ ;" -"诚>chéng|\\\ ;" -"狂>kuáng|\\\ ;" -"川>chuān|\\\ ;" -"粮>liáng|\\\ ;" -"辆>liàng|\\\ ;" -"享>xiǎng|\\\ ;" -"穷>qióng|\\\ ;" -"梁>liáng|\\\ ;" -"赏>shǎng|\\\ ;" -"凉>liáng|\\\ ;" -"荒>huāng|\\\ ;" -"忠>zhōng|\\\ ;" -"箱>xiāng|\\\ ;" -"帐>zhàng|\\\ ;" -"郑>zhèng|\\\ ;" -"剩>shèng|\\\ ;" -"晃>huàng|\\\ ;" -"凶>xiōng|\\\ ;" -"崇>chóng|\\\ ;" -"详>xiáng|\\\ ;" -"挣>zhēng|\\\ ;" -"蒋>jiǎng|\\\ ;" -"祥>xiáng|\\\ ;" -"摔>shuāi|\\\ ;" -"仗>zhàng|\\\ ;" -"障>zhàng|\\\ ;" -"熊>xióng|\\\ ;" -"尝>cháng|\\\ ;" -"盗>chéng|\\\ ;" -"慌>huāng|\\\ ;" -"牲>shēng|\\\ ;" -"串>chuàn|\\\ ;" -"偿>cháng|\\\ ;" -"昌>chāng|\\\ ;" -"怔>zhēng|\\\ ;" -"疆>jiāng|\\\ ;" -"虫>chóng|\\\ ;" -"绳>shéng|\\\ ;" -"涨>zhǎng|\\\ ;" -"矿>kuàng|\\\ ;" -"畅>chàng|\\\ ;" -"仲>zhòng|\\\ ;" -"撑>chēng|\\\ ;" -"谅>liàng|\\\ ;" -"杖>zhàng|\\\ ;" -"肠>cháng|\\\ ;" -"赚>zhuàn|\\\ ;" -"迈>guǎng|\\\ ;" -"呈>chéng|\\\ ;" -"衷>zhōng|\\\ ;" -"症>zhēng|\\\ ;" -"砖>zhuān|\\\ ;" -"襄>xiāng|\\\ ;" -"帅>shuài|\\\ ;" -"惶>huáng|\\\ ;" -"喘>chuǎn|\\\ ;" -"腔>qiāng|\\\ ;" -"匠>jiàng|\\\ ;" -"湘>xiāng|\\\ ;" -"煌>huáng|\\\ ;" -"巷>xiàng|\\\ ;" -"谎>huǎng|\\\ ;" -"厢>xiāng|\\\ ;" -"肿>zhǒng|\\\ ;" -"胀>zhàng|\\\ ;" -"琼>qióng|\\\ ;" -"姜>jiāng|\\\ ;" -"倡>chàng|\\\ ;" -"晌>shǎng|\\\ ;" -"僵>jiāng|\\\ ;" -"恍>huǎng|\\\ ;" -"惩>chéng|\\\ ;" -"宠>chǒng|\\\ ;" -"甩>shuǎi|\\\ ;" -"澄>chéng|\\\ ;" -"酱>jiàng|\\\ ;" -"账>zhàng|\\\ ;" -"撰>zhuàn|\\\ ;" -"蒸>zhēng|\\\ ;" -"旷>kuàng|\\\ ;" -"框>kuàng|\\\ ;" -"逛>guàng|\\\ ;" -"匈>xiōng|\\\ ;" -"铮>zhēng|\\\ ;" -"浆>jiāng|\\\ ;" -"酿>niàng|\\\ ;" -"敞>chǎng|\\\ ;" -"翔>xiáng|\\\ ;" -"揣>chuǎi|\\\ ;" -"汹>xiōng|\\\ ;" -"裳>cháng|\\\ ;" -"笙>shēng|\\\ ;" -"眶>kuàng|\\\ ;" -"锺>zhōng|\\\ ;" -"筝>zhēng|\\\ ;" -"镶>xiāng|\\\ ;" -"怅>chàng|\\\ ;" -"窘>jiǒng|\\\ ;" -"彰>zhāng|\\\ ;" -"橡>xiàng|\\\ ;" -"呛>qiàng|\\\ ;" -"炯>jiǒng|\\\ ;" -"凰>huáng|\\\ ;" -"逞>chěng|\\\ ;" -"璋>zhāng|\\\ ;" -"筐>kuāng|\\\ ;" -"踉>liàng|\\\ ;" -"拽>zhuài|\\\ ;" -"跄>qiāng|\\\ ;" -"桨>jiǎng|\\\ ;" -"幌>huǎng|\\\ ;" -"粱>liáng|\\\ ;" -"拴>shuān|\\\ ;" -"璜>huáng|\\\ ;" -"缰>jiāng|\\\ ;" -"忡>chōng|\\\ ;" -"娼>chāng|\\\ ;" -"拯>zhěng|\\\ ;" -"猖>chāng|\\\ ;" -"闩>shuān|\\\ ;" -"憧>chōng|\\\ ;" -"徵>zhēng|\\\ ;" -"甥>shēng|\\\ ;" -"秤>chèng|\\\ ;" -"涮>shuàn|\\\ ;" -"晾>liàng|\\\ ;" -"踹>chuài|\\\ ;" -"殇>shāng|\\\ ;" -"帧>zhèng|\\\ ;" -"骋>chěng|\\\ ;" -"匡>kuāng|\\\ ;" -"踵>zhǒng|\\\ ;" -"穹>qióng|\\\ ;" -"篆>zhuàn|\\\ ;" -"狰>zhēng|\\\ ;" -"橙>chéng|\\\ ;" -"簧>huáng|\\\ ;" -"徨>huáng|\\\ ;" -"丞>chéng|\\\ ;" -"栓>shuān|\\\ ;" -"迥>jiǒng|\\\ ;" -"盅>zhōng|\\\ ;" -"蝗>huáng|\\\ ;" -"锵>qiāng|\\\ ;" -"绛>jiàng|\\\ ;" -"茧>chóng|\\\ ;" -"漳>zhāng|\\\ ;" -"瞠>chēng|\\\ ;" -"羌>qiāng|\\\ ;" -"饷>xiǎng|\\\ ;" -"蟀>shuài|\\\ ;" -"幛>zhàng|\\\ ;" -"飨>xiǎng|\\\ ;" -"潢>huáng|\\\ ;" -"冢>zhǒng|\\\ ;" -"瘴>zhàng|\\\ ;" -"峥>zhēng|\\\ ;" -"蔷>qiáng|\\\ ;" -"哐>kuāng|\\\ ;" -"戕>qiāng|\\\ ;" -"磺>huáng|\\\ ;" -"犟>jiàng|\\\ ;" -"犷>guǎng|\\\ ;" -"咣>guāng|\\\ ;" -"忪>zhōng|\\\ ;" -"樟>zhāng|\\\ ;" -"邝>kuàng|\\\ ;" -"嫦>cháng|\\\ ;" -"锃>zhèng|\\\ ;" -"遑>huáng|\\\ ;" -"獐>zhāng|\\\ ;" -"徜>cháng|\\\ ;" -"湟>huáng|\\\ ;" -"隍>huáng|\\\ ;" -"嶂>zhàng|\\\ ;" -"椽>chuán|\\\ ;" -"胱>guāng|\\\ ;" -"爿>qiáng|\\\ ;" -"诳>kuáng|\\\ ;" -"蟑>zhāng|\\\ ;" -"襁>qiǎng|\\\ ;" -"肓>huāng|\\\ ;" -"铳>chòng|\\\ ;" -"伥>chāng|\\\ ;" -"觞>shāng|\\\ ;" -"舂>chōng|\\\ ;" -"诤>zhēng|\\\ ;" -"熵>shāng|\\\ ;" -"氅>chǎng|\\\ ;" -"骧>xiāng|\\\ ;" -"诮>kuàng|\\\ ;" -"篁>huáng|\\\ ;" -"舛>chuǎn|\\\ ;" -"啭>zhuàn|\\\ ;" -"馔>zhuàn|\\\ ;" -"钏>chuàn|\\\ ;" -"戗>qiāng|\\\ ;" -"墒>shāng|\\\ ;" -"诓>kuāng|\\\ ;" -"茕>qióng|\\\ ;" -"蟥>huáng|\\\ ;" -"晟>shèng|\\\ ;" -"圹>kuàng|\\\ ;" -"炝>qiàng|\\\ ;" -"嵊>shèng|\\\ ;" -"缃>xiāng|\\\ ;" -"遄>chuán|\\\ ;" -"鲞>xiǎng|\\\ ;" -"豇>jiāng|\\\ ;" -"镪>qiāng|\\\ ;" -"魉>liǎng|\\\ ;" -"蛩>qióng|\\\ ;" -"菖>chāng|\\\ ;" -"嫱>qiáng|\\\ ;" -"邛>qióng|\\\ ;" -"颛>zhuān|\\\ ;" -"裎>chéng|\\\ ;" -"昶>chǎng|\\\ ;" -"蜣>qiāng|\\\ ;" -"蛏>chēng|\\\ ;" -"耩>jiǎng|\\\ ;" -"鲳>chāng|\\\ ;" -"贶>kuàng|\\\ ;" -"庠>xiáng|\\\ ;" -"芗>xiāng|\\\ ;" -"埕>chéng|\\\ ;" -"螽>zhōng|\\\ ;" -"锖>qiāng|\\\ ;" -"椋>liáng|\\\ ;" -"鬯>chàng|\\\ ;" -"跫>qióng|\\\ ;" -"塍>chéng|\\\ ;" -"氚>chuān|\\\ ;" -"垧>jiōng|\\\ ;" -"鄣>zhāng|\\\ ;" -"眚>shěng|\\\ ;" -"浈>chéng|\\\ ;" -"阊>chāng|\\\ ;" -"芎>qiōng|\\\ ;" -"銎>qiōng|\\\ ;" -"礓>jiāng|\\\ ;" -"扃>jiōng|\\\ ;" -"桄>guāng|\\\ ;" -"嫜>zhāng|\\\ ;" -"仉>zhǎng|\\\ ;" -"㐺>zhòng|\\\ ;" -"㐼>chèng|\\\ ;" -"㑋>jiòng|\\\ ;" -"㒌>qióng|\\\ ;" -"㒳>liǎng|\\\ ;" -"㓏>jiǒng|\\\ ;" -"㓽>chóng|\\\ ;" -"㔝>liǎng|\\\ ;" -"㕩>zhàng|\\\ ;" -"㖥>jiǒng|\\\ ;" -"㗂>shěng|\\\ ;" -"㗽>xiǎng|\\\ ;" -"㙊>cháng|\\\ ;" -"㙣>zhàng|\\\ ;" -"㛨>qiǎng|\\\ ;" -"㞷>huáng|\\\ ;" -"㞼>chéng|\\\ ;" -"㟄>xiáng|\\\ ;" -"㟟>xiàng|\\\ ;" -"㡠>zhèng|\\\ ;" -"㡧>zhèng|\\\ ;" -"㢠>jiǒng|\\\ ;" -"㢡>jiǎng|\\\ ;" -"㣫>zhǒng|\\\ ;" -"㤮>kuáng|\\\ ;" -"㤯>jiǒng|\\\ ;" -"㤺>huǎng|\\\ ;" -"㦂>cháng|\\\ ;" -"㧤>chòng|\\\ ;" -"㧭>qióng|\\\ ;" -"㨃>chéng|\\\ ;" -"㨪>huàng|\\\ ;" -"㩖>qiáng|\\\ ;" -"㪓>chuái|\\\ ;" -"㪜>chuǎi|\\\ ;" -"㫛>guàng|\\\ ;" -"㫤>chǎng|\\\ ;" -"㬻>huǎng|\\\ ;" -"㮪>qióng|\\\ ;" -"㯌>chuán|\\\ ;" -"㯍>jiǎng|\\\ ;" -"㱏>zhèng|\\\ ;" -"㱛>chuǎn|\\\ ;" -"㲂>chéng|\\\ ;" -"㲴>zhòng|\\\ ;" -"㶈>liǎng|\\\ ;" -"㷀>qióng|\\\ ;" -"㷗>jiǒng|\\\ ;" -"㷡>jiǒng|\\\ ;" -"㹁>liáng|\\\ ;" -"㹐>chóng|\\\ ;" -"㼇>qióng|\\\ ;" -"㼩>chéng|\\\ ;" -"㼳>shěng|\\\ ;" -"㼷>chuán|\\\ ;" -"㽀>zhèng|\\\ ;" -"㽴>zhàng|\\\ ;" -"㾠>huáng|\\\ ;" -"㾪>shěng|\\\ ;" -"㾮>huáng|\\\ ;" -"䀕>chèng|\\\ ;" -"䁎>chéng|\\\ ;" -"䁜>huǎng|\\\ ;" -"䁞>shěng|\\\ ;" -"䁣>chuán|\\\ ;" -"䁰>jiǎng|\\\ ;" -"䂻>zhèng|\\\ ;" -"䄇>chéng|\\\ ;" -"䅃>qióng|\\\ ;" -"䅚>qiǎng|\\\ ;" -"䅣>huáng|\\\ ;" -"䆑>chéng|\\\ ;" -"䆳>qióng|\\\ ;" -"䆵>chéng|\\\ ;" -"䆸>chéng|\\\ ;" -"䇸>chéng|\\\ ;" -"䈣>zhèng|\\\ ;" -"䉃>jiǎng|\\\ ;" -"䉵>zhuàn|\\\ ;" -"䊄>qióng|\\\ ;" -"䊑>xiǎng|\\\ ;" -"䊗>huáng|\\\ ;" -"䊣>huáng|\\\ ;" -"䊯>kuàng|\\\ ;" -"䋌>jiǎng|\\\ ;" -"䌙>huǎng|\\\ ;" -"䌬>chóng|\\\ ;" -"䌹>jiǒng|\\\ ;" -"䍿>huáng|\\\ ;" -"䎴>shèng|\\\ ;" -"䐃>jiǒng|\\\ ;" -"䐟>xiàng|\\\ ;" -"䐠>huǎng|\\\ ;" -"䐵>huáng|\\\ ;" -"䑟>huáng|\\\ ;" -"䒂>jiǎng|\\\ ;" -"䓖>qióng|\\\ ;" -"䓣>liǎng|\\\ ;" -"䔗>xiáng|\\\ ;" -"䔲>chéng|\\\ ;" -"䕋>chǎng|\\\ ;" -"䖆>niàng|\\\ ;" -"䖝>chóng|\\\ ;" -"䖮>xiǎng|\\\ ;" -"䗅>cháng|\\\ ;" -"䗊>chéng|\\\ ;" -"䙹>jiǎng|\\\ ;" -"䚇>shěng|\\\ ;" -"䛪>qióng|\\\ ;" -"䛫>zhèng|\\\ ;" -"䜶>xiáng|\\\ ;" -"䝶>liáng|\\\ ;" -"䞉>shèng|\\\ ;" -"䞪>jiàng|\\\ ;" -"䞹>huáng|\\\ ;" -"䠀>chǎng|\\\ ;" -"䠃>liǎng|\\\ ;" -"䠆>cháng|\\\ ;" -"䠻>qióng|\\\ ;" -"䡕>zhěng|\\\ ;" -"䡱>zhuǎn|\\\ ;" -"䢛>jiǒng|\\\ ;" -"䢦>shuài|\\\ ;" -"䢽>xiàng|\\\ ;" -"䣼>liáng|\\\ ;" -"䥌>zhèng|\\\ ;" -"䥭>zhèng|\\\ ;" -"䦛>zhèng|\\\ ;" -"䦟>chuài|\\\ ;" -"䦤>chuài|\\\ ;" -"䦶>zhèng|\\\ ;" -"䦷>chuài|\\\ ;" -"䧕>chéng|\\\ ;" -"䧠>shuàn|\\\ ;" -"䧺>xióng|\\\ ;" -"䩨>chàng|\\\ ;" -"䩫>liǎng|\\\ ;" -"䪄>huáng|\\\ ;" -"䪿>shěng|\\\ ;" -"䫄>chuài|\\\ ;" -"䫆>chéng|\\\ ;" -"䬕>shǎng|\\\ ;" -"䭪>liáng|\\\ ;" -"䮪>chéng|\\\ ;" -"䮲>huáng|\\\ ;" -"䯴>cháng|\\\ ;" -"䱆>shéng|\\\ ;" -"䱰>zhòng|\\\ ;" -"䳨>huáng|\\\ ;" -"䳯>chóng|\\\ ;" -"䵁>qiàng|\\\ ;" -"䵃>kuàng|\\\ ;" -"丄>shàng|\\\ ;" -"両>liǎng|\\\ ;" -"丬>qiáng|\\\ ;" -"乑>shèng|\\\ ;" -"乗>chéng|\\\ ;" -"亯>xiǎng|\\\ ;" -"仧>cháng|\\\ ;" -"伀>zhōng|\\\ ;" -"伝>chuán|\\\ ;" -"佂>zhēng|\\\ ;" -"佭>xiáng|\\\ ;" -"侊>guāng|\\\ ;" -"侱>chěng|\\\ ;" -"俇>kuǎng|\\\ ;" -"倀>chāng|\\\ ;" -"倆>liǎng|\\\ ;" -"偁>chēng|\\\ ;" -"偅>zhòng|\\\ ;" -"偗>shěng|\\\ ;" -"偟>huáng|\\\ ;" -"傳>chuán|\\\ ;" -"傷>shāng|\\\ ;" -"傸>qiǎng|\\\ ;" -"傽>zhāng|\\\ ;" -"僎>zhuàn|\\\ ;" -"僒>jiǒng|\\\ ;" -"僘>chǎng|\\\ ;" -"僙>guāng|\\\ ;" -"僢>chuǎn|\\\ ;" -"儝>qióng|\\\ ;" -"償>cháng|\\\ ;" -"儣>kuàng|\\\ ;" -"兇>xiōng|\\\ ;" -"兏>cháng|\\\ ;" -"兤>huáng|\\\ ;" -"兩>liǎng|\\\ ;" -"冂>jiōng|\\\ ;" -"冋>jiōng|\\\ ;" -"冏>jiǒng|\\\ ;" -"刣>zhōng|\\\ ;" -"剰>shèng|\\\ ;" -"劻>kuāng|\\\ ;" -"勝>shèng|\\\ ;" -"勥>qiǎng|\\\ ;" -"匔>qiōng|\\\ ;" -"匞>jiàng|\\\ ;" -"卛>shuài|\\\ ;" -"卝>kuàng|\\\ ;" -"卭>qióng|\\\ ;" -"厰>chǎng|\\\ ;" -"呏>shēng|\\\ ;" -"咰>shuài|\\\ ;" -"哅>xiōng|\\\ ;" -"哴>liàng|\\\ ;" -"唡>liǎng|\\\ ;" -"唴>qiàng|\\\ ;" -"啌>xiāng|\\\ ;" -"啢>liǎng|\\\ ;" -"喠>zhǒng|\\\ ;" -"喤>huáng|\\\ ;" -"喨>liàng|\\\ ;" -"嗆>qiàng|\\\ ;" -"嘃>chōng|\\\ ;" -"嘗>cháng|\\\ ;" -"嚐>cháng|\\\ ;" -"嚝>huāng|\\\ ;" -"嚮>xiàng|\\\ ;" -"囀>zhuàn|\\\ ;" -"囧>jiǒng|\\\ ;" -"圱>chǎng|\\\ ;" -"坰>jiōng|\\\ ;" -"垙>guāng|\\\ ;" -"埛>jiōng|\\\ ;" -"埥>chēng|\\\ ;" -"埩>zhēng|\\\ ;" -"埫>chǒng|\\\ ;" -"堘>chéng|\\\ ;" -"堟>zhuàn|\\\ ;" -"堩>chǎng|\\\ ;" -"堭>huáng|\\\ ;" -"場>chǎng|\\\ ;" -"堹>zhòng|\\\ ;" -"堾>chuǎn|\\\ ;" -"塂>xiàng|\\\ ;" -"塃>huāng|\\\ ;" -"塖>chéng|\\\ ;" -"塚>zhǒng|\\\ ;" -"塣>chěng|\\\ ;" -"塲>cháng|\\\ ;" -"塼>zhuān|\\\ ;" -"墇>zhāng|\\\ ;" -"墏>qiǎng|\\\ ;" -"墚>liáng|\\\ ;" -"墭>shèng|\\\ ;" -"墴>huáng|\\\ ;" -"墻>qiáng|\\\ ;" -"壃>jiāng|\\\ ;" -"壙>kuàng|\\\ ;" -"夅>jiàng|\\\ ;" -"夼>kuǎng|\\\ ;" -"奨>jiǎng|\\\ ;" -"奬>jiǎng|\\\ ;" -"妐>zhōng|\\\ ;" -"妕>zhòng|\\\ ;" -"姃>zhēng|\\\ ;" -"姠>shàng|\\\ ;" -"姯>guāng|\\\ ;" -"娍>chéng|\\\ ;" -"媑>zhòng|\\\ ;" -"媓>huáng|\\\ ;" -"嫥>zhuān|\\\ ;" -"嬙>qiáng|\\\ ;" -"嬢>niáng|\\\ ;" -"孃>niáng|\\\ ;" -"孈>shuāi|\\\ ;" -"孨>zhuǎn|\\\ ;" -"宆>qióng|\\\ ;" -"宬>chéng|\\\ ;" -"宺>huǎng|\\\ ;" -"寵>chǒng|\\\ ;" -"専>zhuān|\\\ ;" -"將>jiāng|\\\ ;" -"專>zhuān|\\\ ;" -"尙>shàng|\\\ ;" -"岲>kuàng|\\\ ;" -"峸>chéng|\\\ ;" -"崈>chóng|\\\ ;" -"崝>zhēng|\\\ ;" -"崢>zhēng|\\\ ;" -"崲>huáng|\\\ ;" -"嵹>jiàng|\\\ ;" -"嶈>qiāng|\\\ ;" -"嶑>xiǎng|\\\ ;" -"巛>chuān|\\\ ;" -"巟>huāng|\\\ ;" -"帥>shuài|\\\ ;" -"帳>zhàng|\\\ ;" -"幀>zhèng|\\\ ;" -"幒>zhōng|\\\ ;" -"幜>jiǒng|\\\ ;" -"広>guǎng|\\\ ;" -"庱>chěng|\\\ ;" -"廂>xiāng|\\\ ;" -"廠>chǎng|\\\ ;" -"廣>guǎng|\\\ ;" -"廧>qiáng|\\\ ;" -"弜>jiàng|\\\ ;" -"張>zhāng|\\\ ;" -"弶>jiàng|\\\ ;" -"強>qiáng|\\\ ;" -"彉>jiāng|\\\ ;" -"彊>jiāng|\\\ ;" -"徎>chěng|\\\ ;" -"徴>zhēng|\\\ ;" -"徸>chōng|\\\ ;" -"忀>xiāng|\\\ ;" -"忷>xiōng|\\\ ;" -"怳>huǎng|\\\ ;" -"恇>kuāng|\\\ ;" -"恟>xiōng|\\\ ;" -"恦>xiàng|\\\ ;" -"悜>chěng|\\\ ;" -"悢>liàng|\\\ ;" -"悵>chàng|\\\ ;" -"惸>qióng|\\\ ;" -"愰>huǎng|\\\ ;" -"愸>zhěng|\\\ ;" -"慯>shāng|\\\ ;" -"憃>chōng|\\\ ;" -"憆>chēng|\\\ ;" -"憕>chéng|\\\ ;" -"憴>shéng|\\\ ;" -"懬>kuàng|\\\ ;" -"懭>kuàng|\\\ ;" -"懲>chéng|\\\ ;" -"扙>zhàng|\\\ ;" -"抂>kuáng|\\\ ;" -"挰>chéng|\\\ ;" -"掁>chéng|\\\ ;" -"掙>zhēng|\\\ ;" -"掚>liǎng|\\\ ;" -"揗>chuāi|\\\ ;" -"揨>chéng|\\\ ;" -"揰>chòng|\\\ ;" -"搶>qiǎng|\\\ ;" -"摏>chōng|\\\ ;" -"摪>jiāng|\\\ ;" -"摾>jiàng|\\\ ;" -"撐>chēng|\\\ ;" -"撗>chéng|\\\ ;" -"撜>zhěng|\\\ ;" -"敻>xiòng|\\\ ;" -"斨>qiāng|\\\ ;" -"昇>shēng|\\\ ;" -"昿>kuàng|\\\ ;" -"晄>huǎng|\\\ ;" -"晑>xiǎng|\\\ ;" -"晠>shéng|\\\ ;" -"晿>chāng|\\\ ;" -"暢>chàng|\\\ ;" -"暲>zhāng|\\\ ;" -"暷>chuán|\\\ ;" -"曂>huàng|\\\ ;" -"曏>xiàng|\\\ ;" -"曠>kuàng|\\\ ;" -"朚>huāng|\\\ ;" -"枨>chēng|\\\ ;" -"柊>zhōng|\\\ ;" -"柼>chēng|\\\ ;" -"梬>chěng|\\\ ;" -"棖>chéng|\\\ ;" -"棦>chēng|\\\ ;" -"棾>qióng|\\\ ;" -"椉>chéng|\\\ ;" -"椌>qiāng|\\\ ;" -"榝>huàng|\\\ ;" -"榥>huǎng|\\\ ;" -"榺>shèng|\\\ ;" -"槍>qiāng|\\\ ;" -"槳>jiǎng|\\\ ;" -"樀>chōng|\\\ ;" -"樑>liáng|\\\ ;" -"樕>chēng|\\\ ;" -"樤>guāng|\\\ ;" -"橕>chēng|\\\ ;" -"橣>chōng|\\\ ;" -"橩>qióng|\\\ ;" -"橿>jiāng|\\\ ;" -"檉>chēng|\\\ ;" -"檣>qiáng|\\\ ;" -"檾>jiǒng|\\\ ;" -"櫎>guàng|\\\ ;" -"欀>xiāng|\\\ ;" -"欻>chuài|\\\ ;" -"歂>chuán|\\\ ;" -"歖>chuài|\\\ ;" -"殅>shēng|\\\ ;" -"殤>shāng|\\\ ;" -"殭>jiāng|\\\ ;" -"氶>zhěng|\\\ ;" -"汌>chuàn|\\\ ;" -"汑>shuàn|\\\ ;" -"沖>chōng|\\\ ;" -"況>kuàng|\\\ ;" -"泂>jiǒng|\\\ ;" -"泈>zhōng|\\\ ;" -"泟>chēng|\\\ ;" -"泩>shēng|\\\ ;" -"洆>chéng|\\\ ;" -"洚>jiàng|\\\ ;" -"洭>kuāng|\\\ ;" -"洶>xiōng|\\\ ;" -"洸>guāng|\\\ ;" -"浄>jiàng|\\\ ;" -"浺>chōng|\\\ ;" -"浾>chēng|\\\ ;" -"涋>chōng|\\\ ;" -"涱>zhàng|\\\ ;" -"涹>liàng|\\\ ;" -"涼>liáng|\\\ ;" -"淐>chāng|\\\ ;" -"湞>chéng|\\\ ;" -"湦>shēng|\\\ ;" -"湸>liàng|\\\ ;" -"溗>shéng|\\\ ;" -"溬>qiāng|\\\ ;" -"滉>huǎng|\\\ ;" -"滰>jiǎng|\\\ ;" -"滳>shāng|\\\ ;" -"漒>qiáng|\\\ ;" -"漡>shāng|\\\ ;" -"漲>zhǎng|\\\ ;" -"漴>chóng|\\\ ;" -"漿>jiāng|\\\ ;" -"潨>zhōng|\\\ ;" -"澂>chéng|\\\ ;" -"澃>jiòng|\\\ ;" -"澠>shéng|\\\ ;" -"瀂>jiōng|\\\ ;" -"瀓>chéng|\\\ ;" -"灮>guāng|\\\ ;" -"灷>zhuàn|\\\ ;" -"炂>zhōng|\\\ ;" -"炗>guāng|\\\ ;" -"炚>guāng|\\\ ;" -"炛>guāng|\\\ ;" -"炡>zhēng|\\\ ;" -"炾>huǎng|\\\ ;" -"烝>zhēng|\\\ ;" -"烡>guāng|\\\ ;" -"烱>jiǒng|\\\ ;" -"焪>qiōng|\\\ ;" -"焭>qióng|\\\ ;" -"焺>shēng|\\\ ;" -"焻>chàng|\\\ ;" -"煄>zhōng|\\\ ;" -"煚>jiǒng|\\\ ;" -"煛>jiǒng|\\\ ;" -"煢>qióng|\\\ ;" -"熀>huǎng|\\\ ;" -"熍>qiōng|\\\ ;" -"熐>jiǒng|\\\ ;" -"熗>qiàng|\\\ ;" -"熲>jiǒng|\\\ ;" -"熿>huáng|\\\ ;" -"爌>huàng|\\\ ;" -"爞>chóng|\\\ ;" -"爭>zhēng|\\\ ;" -"爯>chēng|\\\ ;" -"牄>qiāng|\\\ ;" -"牆>qiáng|\\\ ;" -"牚>chēng|\\\ ;" -"狆>zhòng|\\\ ;" -"狌>shēng|\\\ ;" -"猐>qiāng|\\\ ;" -"猙>zhēng|\\\ ;" -"獎>jiǎng|\\\ ;" -"獚>huáng|\\\ ;" -"獷>guǎng|\\\ ;" -"玌>chuàn|\\\ ;" -"玔>chuàn|\\\ ;" -"玙>chàng|\\\ ;" -"玱>qiāng|\\\ ;" -"珄>shēng|\\\ ;" -"珖>guāng|\\\ ;" -"珦>xiàng|\\\ ;" -"珫>chōng|\\\ ;" -"珵>chéng|\\\ ;" -"珹>chéng|\\\ ;" -"琞>shèng|\\\ ;" -"琤>chēng|\\\ ;" -"琩>chāng|\\\ ;" -"瑏>chuān|\\\ ;" -"瑑>zhuàn|\\\ ;" -"瑝>huáng|\\\ ;" -"瑲>qiāng|\\\ ;" -"瑺>cháng|\\\ ;" -"瑼>zhuān|\\\ ;" -"瓊>qióng|\\\ ;" -"瓖>xiāng|\\\ ;" -"瓺>cháng|\\\ ;" -"甎>zhuān|\\\ ;" -"甞>cháng|\\\ ;" -"畕>jiāng|\\\ ;" -"畺>jiāng|\\\ ;" -"畻>shéng|\\\ ;" -"畼>chàng|\\\ ;" -"疅>jiāng|\\\ ;" -"痋>chóng|\\\ ;" -"痮>zhàng|\\\ ;" -"瘇>zhǒng|\\\ ;" -"瘬>zhàng|\\\ ;" -"癀>huáng|\\\ ;" -"癥>zhēng|\\\ ;" -"皛>jiǒng|\\\ ;" -"皩>huàng|\\\ ;" -"眐>zhēng|\\\ ;" -"眖>kuàng|\\\ ;" -"眾>zhòng|\\\ ;" -"睈>chěng|\\\ ;" -"睘>qióng|\\\ ;" -"睜>zhēng|\\\ ;" -"瞏>qióng|\\\ ;" -"瞕>zhàng|\\\ ;" -"矌>kuàng|\\\ ;" -"矼>jiāng|\\\ ;" -"硄>kuāng|\\\ ;" -"磚>zhuān|\\\ ;" -"磢>qiǎng|\\\ ;" -"礃>zhǎng|\\\ ;" -"礦>kuàng|\\\ ;" -"祌>zhòng|\\\ ;" -"稦>chóng|\\\ ;" -"種>zhǒng|\\\ ;" -"穔>huáng|\\\ ;" -"穞>kuàng|\\\ ;" -"穪>chēng|\\\ ;" -"窚>chéng|\\\ ;" -"窮>qióng|\\\ ;" -"竀>chēng|\\\ ;" -"竆>qióng|\\\ ;" -"竱>zhuǎn|\\\ ;" -"笻>qióng|\\\ ;" -"筇>qióng|\\\ ;" -"筗>zhòng|\\\ ;" -"筬>chéng|\\\ ;" -"箏>zhēng|\\\ ;" -"箵>shěng|\\\ ;" -"篜>zhēng|\\\ ;" -"篬>qiāng|\\\ ;" -"篹>zhuàn|\\\ ;" -"篿>zhuān|\\\ ;" -"籑>zhuàn|\\\ ;" -"籦>zhōng|\\\ ;" -"粻>zhāng|\\\ ;" -"糡>jiàng|\\\ ;" -"糧>liáng|\\\ ;" -"糨>jiàng|\\\ ;" -"糽>zhěng|\\\ ;" -"終>zhōng|\\\ ;" -"絅>jiǒng|\\\ ;" -"絖>kuàng|\\\ ;" -"絳>jiàng|\\\ ;" -"絴>xiáng|\\\ ;" -"絾>chéng|\\\ ;" -"綗>jiǒng|\\\ ;" -"緉>liǎng|\\\ ;" -"緔>zhàng|\\\ ;" -"緗>xiāng|\\\ ;" -"緟>zhòng|\\\ ;" -"緽>chēng|\\\ ;" -"縳>zhuàn|\\\ ;" -"繈>qiǎng|\\\ ;" -"繦>qiǎng|\\\ ;" -"繩>shéng|\\\ ;" -"繮>jiāng|\\\ ;" -"纊>kuàng|\\\ ;" -"纕>xiāng|\\\ ;" -"纩>kuàng|\\\ ;" -"羗>qiāng|\\\ ;" -"羥>qiǎng|\\\ ;" -"羫>qiāng|\\\ ;" -"羻>qiàng|\\\ ;" -"羾>chōng|\\\ ;" -"翀>chōng|\\\ ;" -"翞>jiāng|\\\ ;" -"耑>zhuān|\\\ ;" -"聇>zhēng|\\\ ;" -"聖>shèng|\\\ ;" -"聲>shēng|\\\ ;" -"胘>shēng|\\\ ;" -"脀>chéng|\\\ ;" -"脭>chéng|\\\ ;" -"脷>cháng|\\\ ;" -"脹>zhàng|\\\ ;" -"脼>liǎng|\\\ ;" -"腄>chuái|\\\ ;" -"腨>chuǎn|\\\ ;" -"腫>zhǒng|\\\ ;" -"腸>cháng|\\\ ;" -"膓>cháng|\\\ ;" -"膗>chuái|\\\ ;" -"膙>jiǎng|\\\ ;" -"膞>zhuān|\\\ ;" -"膷>xiāng|\\\ ;" -"臦>guàng|\\\ ;" -"臩>guàng|\\\ ;" -"舩>chuán|\\\ ;" -"舯>zhōng|\\\ ;" -"艎>huáng|\\\ ;" -"芖>xiǎng|\\\ ;" -"苘>qiǒng|\\\ ;" -"茪>guāng|\\\ ;" -"茳>jiāng|\\\ ;" -"茺>chōng|\\\ ;" -"茽>zhòng|\\\ ;" -"荈>chuǎn|\\\ ;" -"荿>chéng|\\\ ;" -"萇>cháng|\\\ ;" -"萫>xiàng|\\\ ;" -"葁>jiāng|\\\ ;" -"葙>xiāng|\\\ ;" -"葟>huáng|\\\ ;" -"蒃>zhuàn|\\\ ;" -"蔃>jiàng|\\\ ;" -"蔏>shāng|\\\ ;" -"蔢>jiāng|\\\ ;" -"蔣>jiǎng|\\\ ;" -"薌>xiāng|\\\ ;" -"薑>jiāng|\\\ ;" -"薔>qiáng|\\\ ;" -"藭>qióng|\\\ ;" -"蘌>jiǒng|\\\ ;" -"蘏>jiōng|\\\ ;" -"蘔>jiōng|\\\ ;" -"蘠>qiáng|\\\ ;" -"虰>chéng|\\\ ;" -"蚃>xiǎng|\\\ ;" -"蚛>zhòng|\\\ ;" -"蜽>liǎng|\\\ ;" -"蝩>chóng|\\\ ;" -"螀>jiāng|\\\ ;" -"螪>shāng|\\\ ;" -"螿>jiāng|\\\ ;" -"蟲>chóng|\\\ ;" -"蟶>chēng|\\\ ;" -"蠁>xiàng|\\\ ;" -"蠰>shàng|\\\ ;" -"衁>huāng|\\\ ;" -"衆>zhòng|\\\ ;" -"衝>chōng|\\\ ;" -"衳>zhōng|\\\ ;" -"衶>chōng|\\\ ;" -"袶>jiàng|\\\ ;" -"裮>chāng|\\\ ;" -"裲>liǎng|\\\ ;" -"裿>chōng|\\\ ;" -"褈>chóng|\\\ ;" -"褧>jiǒng|\\\ ;" -"褼>qiǎng|\\\ ;" -"襈>zhuàn|\\\ ;" -"襐>xiàng|\\\ ;" -"觴>shāng|\\\ ;" -"訩>xiōng|\\\ ;" -"証>zhèng|\\\ ;" -"詗>xiòng|\\\ ;" -"詤>huǎng|\\\ ;" -"詳>xiáng|\\\ ;" -"詾>xiōng|\\\ ;" -"誆>kuāng|\\\ ;" -"誑>kuáng|\\\ ;" -"誠>chéng|\\\ ;" -"誯>chàng|\\\ ;" -"諍>zhēng|\\\ ;" -"諐>liáng|\\\ ;" -"諒>liàng|\\\ ;" -"諥>zhòng|\\\ ;" -"諯>chuán|\\\ ;" -"謊>huǎng|\\\ ;" -"謒>qiāng|\\\ ;" -"講>jiǎng|\\\ ;" -"謪>shāng|\\\ ;" -"謽>jiàng|\\\ ;" -"證>zhèng|\\\ ;" -"譔>zhuàn|\\\ ;" -"譝>shéng|\\\ ;" -"讻>xiōng|\\\ ;" -"诇>xiòng|\\\ ;" -"貺>kuàng|\\\ ;" -"賗>chuàn|\\\ ;" -"賞>shǎng|\\\ ;" -"賬>zhàng|\\\ ;" -"賯>xiōng|\\\ ;" -"賸>shèng|\\\ ;" -"賺>zhuàn|\\\ ;" -"贃>zhuàn|\\\ ;" -"赨>xióng|\\\ ;" -"赪>chēng|\\\ ;" -"赬>chēng|\\\ ;" -"赹>qióng|\\\ ;" -"趚>chēng|\\\ ;" -"趪>huáng|\\\ ;" -"跩>zhuǎi|\\\ ;" -"踭>zhēng|\\\ ;" -"蹌>qiàng|\\\ ;" -"蹖>chōng|\\\ ;" -"蹡>qiāng|\\\ ;" -"蹱>zhōng|\\\ ;" -"躀>kuàng|\\\ ;" -"軖>qiáng|\\\ ;" -"転>zhuǎn|\\\ ;" -"軭>kuāng|\\\ ;" -"輁>qióng|\\\ ;" -"輄>guāng|\\\ ;" -"輌>liàng|\\\ ;" -"輛>liàng|\\\ ;" -"輬>liáng|\\\ ;" -"輲>chuán|\\\ ;" -"轉>zhuǎi|\\\ ;" -"辌>liáng|\\\ ;" -"逈>jiǒng|\\\ ;" -"遧>zhāng|\\\ ;" -"邼>kuāng|\\\ ;" -"郕>chéng|\\\ ;" -"郷>xiāng|\\\ ;" -"鄉>xiāng|\\\ ;" -"鄕>xiāng|\\\ ;" -"鄟>zhuān|\\\ ;" -"鄭>zhèng|\\\ ;" -"鄺>kuàng|\\\ ;" -"酫>chóng|\\\ ;" -"酲>chéng|\\\ ;" -"醎>chéng|\\\ ;" -"醤>jiàng|\\\ ;" -"醬>jiàng|\\\ ;" -"醸>niàng|\\\ ;" -"釀>niàng|\\\ ;" -"釧>chuàn|\\\ ;" -"鈡>zhōng|\\\ ;" -"鉦>zhēng|\\\ ;" -"鉱>kuàng|\\\ ;" -"銃>chòng|\\\ ;" -"銄>shàng|\\\ ;" -"銧>guāng|\\\ ;" -"銿>zhōng|\\\ ;" -"鋮>chéng|\\\ ;" -"鋹>chǎng|\\\ ;" -"鋿>cháng|\\\ ;" -"錆>qiāng|\\\ ;" -"錚>zhēng|\\\ ;" -"錩>chāng|\\\ ;" -"鍠>huáng|\\\ ;" -"鍾>zhōng|\\\ ;" -"鎑>chēng|\\\ ;" -"鎗>qiāng|\\\ ;" -"鎣>jiǒng|\\\ ;" -"鎤>huǎng|\\\ ;" -"鏘>qiāng|\\\ ;" -"鏛>cháng|\\\ ;" -"鏳>zhēng|\\\ ;" -"鏹>qiāng|\\\ ;" -"鏿>chēng|\\\ ;" -"鐘>zhōng|\\\ ;" -"鐺>chēng|\\\ ;" -"鑛>kuàng|\\\ ;" -"鑜>shàng|\\\ ;" -"鑲>xiāng|\\\ ;" -"铖>chéng|\\\ ;" -"锠>chāng|\\\ ;" -"锽>huáng|\\\ ;" -"長>cháng|\\\ ;" -"閂>shuān|\\\ ;" -"閶>chāng|\\\ ;" -"闀>xiàng|\\\ ;" -"闂>xiàng|\\\ ;" -"闛>chāng|\\\ ;" -"阷>chēng|\\\ ;" -"陞>shēng|\\\ ;" -"陹>shēng|\\\ ;" -"靗>chèng|\\\ ;" -"鞝>zhǎng|\\\ ;" -"韁>jiāng|\\\ ;" -"韔>chàng|\\\ ;" -"韹>huáng|\\\ ;" -"響>xiǎng|\\\ ;" -"項>xiàng|\\\ ;" -"頳>chēng|\\\ ;" -"顈>jiǒng|\\\ ;" -"顓>zhuān|\\\ ;" -"顜>jiǎng|\\\ ;" -"颎>jiǒng|\\\ ;" -"餉>xiǎng|\\\ ;" -"餦>zhāng|\\\ ;" -"餭>huáng|\\\ ;" -"饌>zhuàn|\\\ ;" -"饓>chēng|\\\ ;" -"饗>xiǎng|\\\ ;" -"饟>xiǎng|\\\ ;" -"駉>jiǒng|\\\ ;" -"駫>jiōng|\\\ ;" -"駺>liáng|\\\ ;" -"騁>chěng|\\\ ;" -"騜>huáng|\\\ ;" -"騬>chéng|\\\ ;" -"騿>zhāng|\\\ ;" -"驤>xiāng|\\\ ;" -"鬇>zhēng|\\\ ;" -"鬺>shāng|\\\ ;" -"魎>liǎng|\\\ ;" -"鮝>xiǎng|\\\ ;" -"鯗>xiǎng|\\\ ;" -"鯧>chāng|\\\ ;" -"鰉>huáng|\\\ ;" -"鱂>jiāng|\\\ ;" -"鱄>zhuān|\\\ ;" -"鱆>zhāng|\\\ ;" -"鱌>xiàng|\\\ ;" -"鱑>huáng|\\\ ;" -"鱦>shéng|\\\ ;" -"鱨>cháng|\\\ ;" -"鱶>xiǎng|\\\ ;" -"鲿>cháng|\\\ ;" -"鳇>huáng|\\\ ;" -"鳉>jiāng|\\\ ;" -"鴤>zhōng|\\\ ;" -"鵟>kuáng|\\\ ;" -"鵿>shēng|\\\ ;" -"鷒>zhuān|\\\ ;" -"鷬>huáng|\\\ ;" -"麞>zhāng|\\\ ;" -"黃>huáng|\\\ ;" -"黆>guāng|\\\ ;" -"黊>kuàng|\\\ ;" -"黋>kuǎng|\\\ ;" -"鼚>chāng|\\\ ;" -"鼪>shēng|\\\ ;" -"𢘸>jiàng|\\\ ;" -"𢥞>chōng|\\\ ;" -"说>shuō|\\\ ;" -"年>nián|\\\ ;" -"着>zháo|\\\ ;" -"小>xiǎo|\\\ ;" -"天>tiān|\\\ ;" -"能>néng|\\\ ;" -"还>huán|\\\ ;" -"当>dāng|\\\ ;" -"手>shǒu|\\\ ;" -"用>yòng|\\\ ;" -"行>háng|\\\ ;" -"方>fāng|\\\ ;" -"前>qián|\\\ ;" -"见>jiàn|\\\ ;" -"经>jīng|\\\ ;" -"面>miàn|\\\ ;" -"公>gōng|\\\ ;" -"同>tóng|\\\ ;" -"从>cóng|\\\ ;" -"动>dòng|\\\ ;" -"样>yáng|\\\ ;" -"现>xiàn|\\\ ;" -"身>shēn|\\\ ;" -"点>diǎn|\\\ ;" -"明>míng|\\\ ;" -"全>quán|\\\ ;" -"工>gōng|\\\ ;" -"情>qíng|\\\ ;" -"名>míng|\\\ ;" -"定>dìng|\\\ ;" -"等>děng|\\\ ;" -"间>jiān|\\\ ;" -"便>biàn|\\\ ;" -"电>diàn|\\\ ;" -"东>dōng|\\\ ;" -"教>jiāo|\\\ ;" -"平>píng|\\\ ;" -"真>zhēn|\\\ ;" -"听>tīng|\\\ ;" -"少>shǎo|\\\ ;" -"关>guān|\\\ ;" -"并>bìng|\\\ ;" -"产>chǎn|\\\ ;" -"先>xiān|\\\ ;" -"山>shān|\\\ ;" -"水>shuǐ|\\\ ;" -"总>zǒng|\\\ ;" -"员>yuán|\\\ ;" -"笑>xiào|\\\ ;" -"性>xìng|\\\ ;" -"通>tōng|\\\ ;" -"命>mìng|\\\ ;" -"神>shén|\\\ ;" -"件>jiàn|\\\ ;" -"表>biǎo|\\\ ;" -"原>yuán|\\\ ;" -"应>yìng|\\\ ;" -"叫>jiào|\\\ ;" -"更>gèng|\\\ ;" -"放>fàng|\\\ ;" -"受>shòu|\\\ ;" -"王>wáng|\\\ ;" -"京>jīng|\\\ ;" -"清>qīng|\\\ ;" -"边>biān|\\\ ;" -"共>gòng|\\\ ;" -"风>fēng|\\\ ;" -"战>zhàn|\\\ ;" -"望>wàng|\\\ ;" -"建>jiàn|\\\ ;" -"统>tǒng|\\\ ;" -"请>qǐng|\\\ ;" -"交>jiāo|\\\ ;" -"让>ràng|\\\ ;" -"算>suàn|\\\ ;" -"元>yuán|\\\ ;" -"功>gōng|\\\ ;" -"青>qīng|\\\ ;" -"管>guǎn|\\\ ;" -"连>lián|\\\ ;" -"远>yuǎn|\\\ ;" -"快>kuài|\\\ ;" -"条>tiáo|\\\ ;" -"院>yuàn|\\\ ;" -"变>biàn|\\\ ;" -"联>lián|\\\ ;" -"权>quán|\\\ ;" -"往>wǎng|\\\ ;" -"展>zhǎn|\\\ ;" -"领>lǐng|\\\ ;" -"红>hóng|\\\ ;" -"周>zhōu|\\\ ;" -"深>shēn|\\\ ;" -"空>kōng|\\\ ;" -"甚>shèn|\\\ ;" -"轻>qīng|\\\ ;" -"英>yīng|\\\ ;" -"令>lìng|\\\ ;" -"收>shōu|\\\ ;" -"脸>liǎn|\\\ ;" -"钱>qián|\\\ ;" -"党>dǎng|\\\ ;" -"千>qiān|\\\ ;" -"片>piàn|\\\ ;" -"容>róng|\\\ ;" -"找>zhǎo|\\\ ;" -"站>zhàn|\\\ ;" -"形>xíng|\\\ ;" -"房>fáng|\\\ ;" -"首>shǒu|\\\ ;" -"影>yǐng|\\\ ;" -"网>wǎng|\\\ ;" -"兵>bīng|\\\ ;" -"谁>shuí|\\\ ;" -"校>xiào|\\\ ;" -"观>guān|\\\ ;" -"编>biān|\\\ ;" -"剑>jiàn|\\\ ;" -"调>diào|\\\ ;" -"曾>céng|\\\ ;" -"准>zhǔn|\\\ ;" -"团>tuán|\\\ ;" -"段>duàn|\\\ ;" -"精>jīng|\\\ ;" -"官>guān|\\\ ;" -"竟>jìng|\\\ ;" -"照>zhào|\\\ ;" -"招>zhāo|\\\ ;" -"兴>xīng|\\\ ;" -"阳>yáng|\\\ ;" -"惊>jīng|\\\ ;" -"选>xuǎn|\\\ ;" -"欢>huān|\\\ ;" -"另>lìng|\\\ ;" -"港>gǎng|\\\ ;" -"星>xīng|\\\ ;" -"断>duàn|\\\ ;" -"陈>chén|\\\ ;" -"农>nóng|\\\ ;" -"念>niàn|\\\ ;" -"刚>gāng|\\\ ;" -"显>xiǎn|\\\ ;" -"消>xiāo|\\\ ;" -"送>sòng|\\\ ;" -"帮>bāng|\\\ ;" -"线>xiàn|\\\ ;" -"愿>yuàn|\\\ ;" -"增>zēng|\\\ ;" -"杨>yáng|\\\ ;" -"料>liào|\\\ ;" -"州>zhōu|\\\ ;" -"仍>réng|\\\ ;" -"脚>jiǎo|\\\ ;" -"标>biāo|\\\ ;" -"病>bìng|\\\ ;" -"境>jìng|\\\ ;" -"软>ruǎn|\\\ ;" -"朝>cháo|\\\ ;" -"朋>péng|\\\ ;" -"供>gòng|\\\ ;" -"乱>luàn|\\\ ;" -"龙>lóng|\\\ ;" -"春>chūn|\\\ ;" -"忙>máng|\\\ ;" -"痛>tòng|\\\ ;" -"沉>chén|\\\ ;" -"灵>líng|\\\ ;" -"停>tíng|\\\ ;" -"块>kuài|\\\ ;" -"冷>lěng|\\\ ;" -"怪>guài|\\\ ;" -"静>jìng|\\\ ;" -"旁>páng|\\\ ;" -"园>yuán|\\\ ;" -"登>dēng|\\\ ;" -"较>jiào|\\\ ;" -"宣>xuān|\\\ ;" -"堂>táng|\\\ ;" -"央>yāng|\\\ ;" -"怀>huái|\\\ ;" -"营>yíng|\\\ ;" -"姓>xìng|\\\ ;" -"养>yǎng|\\\ ;" -"景>jǐng|\\\ ;" -"渐>jiàn|\\\ ;" -"藏>cáng|\\\ ;" -"摘>zhāi|\\\ ;" -"角>jiǎo|\\\ ;" -"瞧>qiáo|\\\ ;" -"阵>zhèn|\\\ ;" -"层>céng|\\\ ;" -"馆>guǎn|\\\ ;" -"田>tián|\\\ ;" -"简>jiǎn|\\\ ;" -"免>miǎn|\\\ ;" -"型>xíng|\\\ ;" -"换>huàn|\\\ ;" -"洋>yáng|\\\ ;" -"睡>shuì|\\\ ;" -"康>kāng|\\\ ;" -"评>píng|\\\ ;" -"追>zhuī|\\\ ;" -"店>diàn|\\\ ;" -"环>huán|\\\ ;" -"超>chāo|\\\ ;" -"占>zhān|\\\ ;" -"永>yǒng|\\\ ;" -"源>yuán|\\\ ;" -"险>xiǎn|\\\ ;" -"访>fǎng|\\\ ;" -"伸>shēn|\\\ ;" -"限>xiàn|\\\ ;" -"跳>tiào|\\\ ;" -"练>liàn|\\\ ;" -"幸>xìng|\\\ ;" -"效>xiào|\\\ ;" -"封>fēng|\\\ ;" -"攻>gōng|\\\ ;" -"顶>dǐng|\\\ ;" -"宁>níng|\\\ ;" -"防>fáng|\\\ ;" -"抓>zhuā|\\\ ;" -"顺>shùn|\\\ ;" -"警>jǐng|\\\ ;" -"梦>mèng|\\\ ;" -"善>shàn|\\\ ;" -"蒙>méng|\\\ ;" -"票>piào|\\\ ;" -"坚>jiān|\\\ ;" -"端>duān|\\\ ;" -"掉>diào|\\\ ;" -"授>shòu|\\\ ;" -"守>shǒu|\\\ ;" -"县>xiàn|\\\ ;" -"庭>tíng|\\\ ;" -"扬>yáng|\\\ ;" -"忘>wàng|\\\ ;" -"洲>zhōu|\\\ ;" -"松>sōng|\\\ ;" -"坏>huài|\\\ ;" -"邓>dèng|\\\ ;" -"鲜>xiān|\\\ ;" -"短>duǎn|\\\ ;" -"抗>kàng|\\\ ;" -"睛>jīng|\\\ ;" -"销>xiāo|\\\ ;" -"宗>zōng|\\\ ;" -"赵>zhào|\\\ ;" -"灯>dēng|\\\ ;" -"峰>fēng|\\\ ;" -"款>kuǎn|\\\ ;" -"洪>hóng|\\\ ;" -"订>dìng|\\\ ;" -"镇>zhèn|\\\ ;" -"靖>jìng|\\\ ;" -"申>shēn|\\\ ;" -"迎>yíng|\\\ ;" -"丁>dīng|\\\ ;" -"审>shěn|\\\ ;" -"遍>biàn|\\\ ;" -"桌>zhuō|\\\ ;" -"晓>xiǎo|\\\ ;" -"弄>nòng|\\\ ;" -"亡>wáng|\\\ ;" -"桥>qiáo|\\\ ;" -"闪>shǎn|\\\ ;" -"劲>jìng|\\\ ;" -"恐>kǒng|\\\ ;" -"敬>jìng|\\\ ;" -"监>jiān|\\\ ;" -"厅>tīng|\\\ ;" -"震>zhèn|\\\ ;" -"冰>bīng|\\\ ;" -"醒>xǐng|\\\ ;" -"庆>qìng|\\\ ;" -"硬>yìng|\\\ ;" -"售>shòu|\\\ ;" -"童>tóng|\\\ ;" -"缓>huǎn|\\\ ;" -"烧>shāo|\\\ ;" -"控>kòng|\\\ ;" -"篇>piān|\\\ ;" -"洞>dòng|\\\ ;" -"荣>róng|\\\ ;" -"懂>dǒng|\\\ ;" -"拥>yǒng|\\\ ;" -"献>xiàn|\\\ ;" -"横>héng|\\\ ;" -"健>jiàn|\\\ ;" -"签>qiān|\\\ ;" -"蓉>róng|\\\ ;" -"潮>cháo|\\\ ;" -"圆>yuán|\\\ ;" -"卷>juǎn|\\\ ;" -"妙>miào|\\\ ;" -"浪>làng|\\\ ;" -"抽>chōu|\\\ ;" -"偏>piān|\\\ ;" -"纵>zòng|\\\ ;" -"航>háng|\\\ ;" -"拳>quán|\\\ ;" -"唐>táng|\\\ ;" -"检>jiǎn|\\\ ;" -"宫>gōng|\\\ ;" -"袁>yuán|\\\ ;" -"召>zhāo|\\\ ;" -"猛>měng|\\\ ;" -"宽>kuān|\\\ ;" -"绍>shào|\\\ ;" -"典>diǎn|\\\ ;" -"圈>quān|\\\ ;" -"丰>fēng|\\\ ;" -"挑>tiāo|\\\ ;" -"肩>jiān|\\\ ;" -"减>jiǎn|\\\ ;" -"针>zhēn|\\\ ;" -"竞>jìng|\\\ ;" -"挺>tǐng|\\\ ;" -"宋>sòng|\\\ ;" -"钢>gāng|\\\ ;" -"悄>qiǎo|\\\ ;" -"乔>qiáo|\\\ ;" -"仇>chóu|\\\ ;" -"吹>chuī|\\\ ;" -"融>róng|\\\ ;" -"净>jìng|\\\ ;" -"仙>xiān|\\\ ;" -"巧>qiǎo|\\\ ;" -"零>líng|\\\ ;" -"荡>dàng|\\\ ;" -"珍>zhēn|\\\ ;" -"勇>yǒng|\\\ ;" -"税>shuì|\\\ ;" -"僧>sēng|\\\ ;" -"锋>fēng|\\\ ;" -"惯>guàn|\\\ ;" -"凭>píng|\\\ ;" -"冠>guàn|\\\ ;" -"碰>pèng|\\\ ;" -"倾>qīng|\\\ ;" -"尖>jiān|\\\ ;" -"仿>fǎng|\\\ ;" -"飘>piāo|\\\ ;" -"晨>chén|\\\ ;" -"纯>chún|\\\ ;" -"缘>yuán|\\\ ;" -"冬>dōng|\\\ ;" -"郎>láng|\\\ ;" -"闲>xián|\\\ ;" -"镜>jìng|\\\ ;" -"羊>yáng|\\\ ;" -"萍>píng|\\\ ;" -"刑>xíng|\\\ ;" -"凤>fèng|\\\ ;" -"孔>kǒng|\\\ ;" -"触>hóng|\\\ ;" -"恋>liàn|\\\ ;" -"隆>lóng|\\\ ;" -"萧>xiāo|\\\ ;" -"怨>yuàn|\\\ ;" -"龄>líng|\\\ ;" -"径>jìng|\\\ ;" -"仰>yǎng|\\\ ;" -"映>yìng|\\\ ;" -"腾>téng|\\\ ;" -"稍>shāo|\\\ ;" -"岗>gǎng|\\\ ;" -"挡>dǎng|\\\ ;" -"奉>fèng|\\\ ;" -"朗>lǎng|\\\ ;" -"兼>jiān|\\\ ;" -"劝>quàn|\\\ ;" -"盈>yíng|\\\ ;" -"陷>xiàn|\\\ ;" -"鸣>míng|\\\ ;" -"倘>tǎng|\\\ ;" -"振>zhèn|\\\ ;" -"丧>sàng|\\\ ;" -"焦>jiāo|\\\ ;" -"凌>líng|\\\ ;" -"骗>piàn|\\\ ;" -"疗>liáo|\\\ ;" -"尘>chén|\\\ ;" -"躺>tǎng|\\\ ;" -"彪>biāo|\\\ ;" -"井>jǐng|\\\ ;" -"汪>wāng|\\\ ;" -"漂>piǎo|\\\ ;" -"聊>liáo|\\\ ;" -"凝>níng|\\\ ;" -"彭>péng|\\\ ;" -"匆>cōng|\\\ ;" -"描>miáo|\\\ ;" -"愁>chóu|\\\ ;" -"涌>yǒng|\\\ ;" -"汤>tāng|\\\ ;" -"玄>xuán|\\\ ;" -"轰>hōng|\\\ ;" -"奸>jiān|\\\ ;" -"怜>lián|\\\ ;" -"鸟>niǎo|\\\ ;" -"邦>bāng|\\\ ;" -"聪>cōng|\\\ ;" -"辩>biàn|\\\ ;" -"瓶>píng|\\\ ;" -"沈>shěn|\\\ ;" -"枫>fēng|\\\ ;" -"臣>chén|\\\ ;" -"援>yuán|\\\ ;" -"酸>suān|\\\ ;" -"盟>méng|\\\ ;" -"胖>pàng|\\\ ;" -"哼>hēng|\\\ ;" -"瘦>shòu|\\\ ;" -"箭>jiàn|\\\ ;" -"潜>qián|\\\ ;" -"鸿>hóng|\\\ ;" -"亭>tíng|\\\ ;" -"狼>láng|\\\ ;" -"舰>jiàn|\\\ ;" -"牵>qiān|\\\ ;" -"疯>fēng|\\\ ;" -"颤>zhàn|\\\ ;" -"衫>shān|\\\ ;" -"艰>jiān|\\\ ;" -"苍>cāng|\\\ ;" -"旋>xuán|\\\ ;" -"桑>sāng|\\\ ;" -"莲>lián|\\\ ;" -"钻>zuān|\\\ ;" -"宏>hóng|\\\ ;" -"幻>huàn|\\\ ;" -"辽>liáo|\\\ ;" -"患>huàn|\\\ ;" -"衡>héng|\\\ ;" -"丑>chǒu|\\\ ;" -"暖>nuǎn|\\\ ;" -"浓>nóng|\\\ ;" -"键>jiàn|\\\ ;" -"臭>chòu|\\\ ;" -"芳>fāng|\\\ ;" -"垂>chuí|\\\ ;" -"捉>zhuō|\\\ ;" -"恭>gōng|\\\ ;" -"泉>quán|\\\ ;" -"脏>zāng|\\\ ;" -"疼>téng|\\\ ;" -"铜>tóng|\\\ ;" -"档>dǎng|\\\ ;" -"苗>miáo|\\\ ;" -"柄>bǐng|\\\ ;" -"舟>zhōu|\\\ ;" -"禅>shàn|\\\ ;" -"敲>qiāo|\\\ ;" -"筹>chóu|\\\ ;" -"浅>qiǎn|\\\ ;" -"柴>chái|\\\ ;" -"雕>diāo|\\\ ;" -"寿>shòu|\\\ ;" -"董>dǒng|\\\ ;" -"鉴>jiàn|\\\ ;" -"刷>shuā|\\\ ;" -"捐>juān|\\\ ;" -"贯>guàn|\\\ ;" -"殿>diàn|\\\ ;" -"迁>qiān|\\\ ;" -"鞭>biān|\\\ ;" -"茫>máng|\\\ ;" -"逢>féng|\\\ ;" -"圳>zhèn|\\\ ;" -"踪>chuò|\\\ ;" -"丛>cóng|\\\ ;" -"吵>chǎo|\\\ ;" -"贡>gòng|\\\ ;" -"赢>gòng|\\\ ;" -"棒>bàng|\\\ ;" -"恒>héng|\\\ ;" -"贤>xián|\\\ ;" -"拆>chāi|\\\ ;" -"缠>chán|\\\ ;" -"缝>féng|\\\ ;" -"肖>xiào|\\\ ;" -"炼>liàn|\\\ ;" -"宪>xiàn|\\\ ;" -"庙>miào|\\\ ;" -"冯>féng|\\\ ;" -"唤>huàn|\\\ ;" -"甜>tián|\\\ ;" -"庸>yōng|\\\ ;" -"鹏>péng|\\\ ;" -"玲>líng|\\\ ;" -"综>zòng|\\\ ;" -"嫌>xián|\\\ ;" -"扔>rēng|\\\ ;" -"悬>xuán|\\\ ;" -"廷>tíng|\\\ ;" -"笼>lóng|\\\ ;" -"颠>diān|\\\ ;" -"扇>shàn|\\\ ;" -"唇>chún|\\\ ;" -"捧>pěng|\\\ ;" -"冤>yuān|\\\ ;" -"皱>zhòu|\\\ ;" -"遣>qiǎn|\\\ ;" -"翁>wēng|\\\ ;" -"镖>biāo|\\\ ;" -"屏>píng|\\\ ;" -"棉>mián|\\\ ;" -"孟>mèng|\\\ ;" -"葬>zàng|\\\ ;" -"添>tiān|\\\ ;" -"兆>zhào|\\\ ;" -"欠>qiàn|\\\ ;" -"钓>diào|\\\ ;" -"吊>diào|\\\ ;" -"填>tián|\\\ ;" -"抄>chāo|\\\ ;" -"瞪>dèng|\\\ ;" -"剪>jiǎn|\\\ ;" -"债>zhài|\\\ ;" -"晶>jīng|\\\ ;" -"卓>zhuó|\\\ ;" -"糖>táng|\\\ ;" -"绵>mián|\\\ ;" -"妨>fáng|\\\ ;" -"珊>shān|\\\ ;" -"嚷>rǎng|\\\ ;" -"盲>máng|\\\ ;" -"辨>biàn|\\\ ;" -"泳>yǒng|\\\ ;" -"宅>zhái|\\\ ;" -"膀>bǎng|\\\ ;" -"颈>gěng|\\\ ;" -"践>jiàn|\\\ ;" -"轿>jiào|\\\ ;" -"娇>jiāo|\\\ ;" -"潇>xiāo|\\\ ;" -"颂>róng|\\\ ;" -"杭>háng|\\\ ;" -"瞬>shùn|\\\ ;" -"乖>guāi|\\\ ;" -"炒>chǎo|\\\ ;" -"饼>bǐng|\\\ ;" -"钉>dīng|\\\ ;" -"赠>zèng|\\\ ;" -"哄>hōng|\\\ ;" -"铃>líng|\\\ ;" -"鹰>yīng|\\\ ;" -"歉>qiàn|\\\ ;" -"盯>dīng|\\\ ;" -"兽>shòu|\\\ ;" -"罩>zhào|\\\ ;" -"嵩>sōng|\\\ ;" -"陵>líng|\\\ ;" -"蜂>fēng|\\\ ;" -"廉>lián|\\\ ;" -"骄>jiāo|\\\ ;" -"辰>chén|\\\ ;" -"坑>kēng|\\\ ;" -"眠>mián|\\\ ;" -"孝>xiào|\\\ ;" -"虹>hóng|\\\ ;" -"勉>miǎn|\\\ ;" -"慎>shèn|\\\ ;" -"斩>zhǎn|\\\ ;" -"郊>jiāo|\\\ ;" -"鼎>dǐng|\\\ ;" -"冻>dòng|\\\ ;" -"桐>tóng|\\\ ;" -"艇>tǐng|\\\ ;" -"谦>qiān|\\\ ;" -"岭>líng|\\\ ;" -"桶>tǒng|\\\ ;" -"嗓>sǎng|\\\ ;" -"帘>lián|\\\ ;" -"仓>cāng|\\\ ;" -"拐>guǎi|\\\ ;" -"绑>bǎng|\\\ ;" -"荐>jiàn|\\\ ;" -"廊>láng|\\\ ;" -"诊>zhěn|\\\ ;" -"棚>péng|\\\ ;" -"掀>xiān|\\\ ;" -"筒>tǒng|\\\ ;" -"秒>miǎo|\\\ ;" -"沾>zhān|\\\ ;" -"庞>páng|\\\ ;" -"券>quàn|\\\ ;" -"趟>tàng|\\\ ;" -"灌>guàn|\\\ ;" -"妄>wàng|\\\ ;" -"宙>zhòu|\\\ ;" -"侨>qiáo|\\\ ;" -"啸>xiào|\\\ ;" -"罐>guàn|\\\ ;" -"趁>chèn|\\\ ;" -"婴>yīng|\\\ ;" -"躬>gōng|\\\ ;" -"叮>dīng|\\\ ;" -"晴>qíng|\\\ ;" -"淮>huái|\\\ ;" -"旺>wàng|\\\ ;" -"窜>cuàn|\\\ ;" -"寨>zhài|\\\ ;" -"尿>niào|\\\ ;" -"昭>zhāo|\\\ ;" -"囊>náng|\\\ ;" -"蓬>péng|\\\ ;" -"贱>jiàn|\\\ ;" -"嘲>cháo|\\\ ;" -"傍>bàng|\\\ ;" -"纲>gāng|\\\ ;" -"耕>gēng|\\\ ;" -"舱>cāng|\\\ ;" -"砰>pēng|\\\ ;" -"塘>táng|\\\ ;" -"纤>xiān|\\\ ;" -"链>liàn|\\\ ;" -"拱>gǒng|\\\ ;" -"铭>míng|\\\ ;" -"淳>chún|\\\ ;" -"榜>bǎng|\\\ ;" -"渊>yuān|\\\ ;" -"羡>xiàn|\\\ ;" -"卿>qīng|\\\ ;" -"喧>xuān|\\\ ;" -"枉>wǎng|\\\ ;" -"衬>chèn|\\\ ;" -"凳>dèng|\\\ ;" -"缅>miǎn|\\\ ;" -"弦>xián|\\\ ;" -"倦>juàn|\\\ ;" -"酬>chóu|\\\ ;" -"咒>zhòu|\\\ ;" -"崩>bēng|\\\ ;" -"顷>qǐng|\\\ ;" -"侦>zhēn|\\\ ;" -"陕>shǎn|\\\ ;" -"耸>sǒng|\\\ ;" -"窄>zhǎi|\\\ ;" -"痒>yǎng|\\\ ;" -"沧>cāng|\\\ ;" -"贞>zhēn|\\\ ;" -"蠢>chǔn|\\\ ;" -"逍>xiāo|\\\ ;" -"僚>liáo|\\\ ;" -"耍>shuǎ|\\\ ;" -"枕>zhěn|\\\ ;" -"捡>jiǎn|\\\ ;" -"朦>méng|\\\ ;" -"筷>kuài|\\\ ;" -"缸>gāng|\\\ ;" -"弓>gōng|\\\ ;" -"爪>zhuǎ|\\\ ;" -"芒>máng|\\\ ;" -"缴>jiǎo|\\\ ;" -"哨>shào|\\\ ;" -"颖>yǐng|\\\ ;" -"淀>diàn|\\\ ;" -"骤>zhòu|\\\ ;" -"苹>píng|\\\ ;" -"晒>shài|\\\ ;" -"拢>lǒng|\\\ ;" -"胧>lóng|\\\ ;" -"胶>jiāo|\\\ ;" -"乒>pīng|\\\ ;" -"讽>fěng|\\\ ;" -"戳>chuō|\\\ ;" -"拣>jiǎn|\\\ ;" -"耿>gěng|\\\ ;" -"廿>niàn|\\\ ;" -"棺>guān|\\\ ;" -"坠>zhuì|\\\ ;" -"诵>sòng|\\\ ;" -"冈>gāng|\\\ ;" -"莹>yíng|\\\ ;" -"衔>xián|\\\ ;" -"甸>diàn|\\\ ;" -"贬>biǎn|\\\ ;" -"愣>lèng|\\\ ;" -"搅>jiǎo|\\\ ;" -"炕>kàng|\\\ ;" -"腥>xīng|\\\ ;" -"藤>téng|\\\ ;" -"歼>jiān|\\\ ;" -"莽>mǎng|\\\ ;" -"烫>tàng|\\\ ;" -"钞>chāo|\\\ ;" -"坊>fāng|\\\ ;" -"箫>xiāo|\\\ ;" -"嗡>wēng|\\\ ;" -"溅>jiàn|\\\ ;" -"栋>dòng|\\\ ;" -"禀>bǐng|\\\ ;" -"烁>shuò|\\\ ;" -"粘>nián|\\\ ;" -"朔>shuò|\\\ ;" -"咸>xián|\\\ ;" -"纺>fǎng|\\\ ;" -"锤>chuí|\\\ ;" -"娴>xián|\\\ ;" -"辫>biàn|\\\ ;" -"犬>quǎn|\\\ ;" -"冥>míng|\\\ ;" -"盏>zhǎn|\\\ ;" -"焕>huàn|\\\ ;" -"弘>hóng|\\\ ;" -"擅>shàn|\\\ ;" -"氓>máng|\\\ ;" -"怦>pēng|\\\ ;" -"詹>zhān|\\\ ;" -"扁>biǎn|\\\ ;" -"慷>kāng|\\\ ;" -"篷>péng|\\\ ;" -"荆>jīng|\\\ ;" -"绸>chóu|\\\ ;" -"寥>liáo|\\\ ;" -"浇>jiāo|\\\ ;" -"垫>diàn|\\\ ;" -"乓>pāng|\\\ ;" -"膛>táng|\\\ ;" -"琢>zhuó|\\\ ;" -"阮>ruǎn|\\\ ;" -"俏>qiào|\\\ ;" -"绽>zhàn|\\\ ;" -"楞>léng|\\\ ;" -"拙>zhuó|\\\ ;" -"奠>diàn|\\\ ;" -"肘>zhǒu|\\\ ;" -"膨>péng|\\\ ;" -"壤>rǎng|\\\ ;" -"渗>shèn|\\\ ;" -"轩>xuān|\\\ ;" -"苑>yuàn|\\\ ;" -"葱>cōng|\\\ ;" -"巩>gǒng|\\\ ;" -"粥>zhōu|\\\ ;" -"斋>zhāi|\\\ ;" -"斟>zhēn|\\\ ;" -"梢>shāo|\\\ ;" -"铅>qiān|\\\ ;" -"绒>róng|\\\ ;" -"锻>duàn|\\\ ;" -"谴>qiǎn|\\\ ;" -"沅>yuán|\\\ ;" -"宵>xiāo|\\\ ;" -"珑>lóng|\\\ ;" -"咚>dōng|\\\ ;" -"亨>hēng|\\\ ;" -"淌>tǎng|\\\ ;" -"扛>káng|\\\ ;" -"杉>shān|\\\ ;" -"彤>tóng|\\\ ;" -"氧>yǎng|\\\ ;" -"狡>jiǎo|\\\ ;" -"婷>tíng|\\\ ;" -"渺>miǎo|\\\ ;" -"嵌>qiàn|\\\ ;" -"鞘>qiào|\\\ ;" -"吭>kēng|\\\ ;" -"绰>chuò|\\\ ;" -"蝇>yíng|\\\ ;" -"绞>jiǎo|\\\ ;" -"轴>zhóu|\\\ ;" -"邵>shào|\\\ ;" -"憎>zēng|\\\ ;" -"窍>qiào|\\\ ;" -"坪>píng|\\\ ;" -"佣>yòng|\\\ ;" -"卵>luǎn|\\\ ;" -"琅>láng|\\\ ;" -"昼>zhòu|\\\ ;" -"兢>jīng|\\\ ;" -"煎>jiān|\\\ ;" -"瞅>chǒu|\\\ ;" -"熔>róng|\\\ ;" -"绅>shēn|\\\ ;" -"蹦>bèng|\\\ ;" -"聋>lóng|\\\ ;" -"垄>lǒng|\\\ ;" -"煽>shān|\\\ ;" -"呻>shēn|\\\ ;" -"翘>qiáo|\\\ ;" -"杏>xìng|\\\ ;" -"虔>qián|\\\ ;" -"拧>níng|\\\ ;" -"烘>hōng|\\\ ;" -"删>shān|\\\ ;" -"霄>xiāo|\\\ ;" -"拎>līng|\\\ ;" -"眷>juàn|\\\ ;" -"阐>chǎn|\\\ ;" -"讼>sòng|\\\ ;" -"崭>zhǎn|\\\ ;" -"伶>líng|\\\ ;" -"巢>cháo|\\\ ;" -"啷>lāng|\\\ ;" -"俭>jiǎn|\\\ ;" -"溶>róng|\\\ ;" -"湛>zhàn|\\\ ;" -"翩>piān|\\\ ;" -"嚣>xiāo|\\\ ;" -"琛>chēn|\\\ ;" -"浊>zhuó|\\\ ;" -"杠>gàng|\\\ ;" -"瞄>miáo|\\\ ;" -"撩>liáo|\\\ ;" -"猿>yuán|\\\ ;" -"灼>zhuó|\\\ ;" -"椒>jiāo|\\\ ;" -"廖>liào|\\\ ;" -"甭>béng|\\\ ;" -"迢>tiáo|\\\ ;" -"攘>rǎng|\\\ ;" -"缎>duàn|\\\ ;" -"矫>jiǎo|\\\ ;" -"徊>huái|\\\ ;" -"瑛>yīng|\\\ ;" -"猩>xīng|\\\ ;" -"咙>lóng|\\\ ;" -"嗔>chēn|\\\ ;" -"踌>chóu|\\\ ;" -"绷>bēng|\\\ ;" -"缀>zhuì|\\\ ;" -"婶>shěn|\\\ ;" -"蹬>dèng|\\\ ;" -"勺>sháo|\\\ ;" -"瞻>zhān|\\\ ;" -"踊>yǒng|\\\ ;" -"眩>xuàn|\\\ ;" -"迸>bèng|\\\ ;" -"丙>bǐng|\\\ ;" -"饺>jiǎo|\\\ ;" -"铲>chǎn|\\\ ;" -"敛>liàn|\\\ ;" -"捅>tǒng|\\\ ;" -"滕>téng|\\\ ;" -"眺>tiào|\\\ ;" -"棕>zōng|\\\ ;" -"绢>juàn|\\\ ;" -"娟>juān|\\\ ;" -"萌>méng|\\\ ;" -"哽>gěng|\\\ ;" -"烹>pēng|\\\ ;" -"炊>chuī|\\\ ;" -"剿>jiǎo|\\\ ;" -"炫>xuàn|\\\ ;" -"锥>zhuī|\\\ ;" -"刁>diāo|\\\ ;" -"亢>kàng|\\\ ;" -"冕>miǎn|\\\ ;" -"瀛>yíng|\\\ ;" -"庚>gēng|\\\ ;" -"峭>qiào|\\\ ;" -"磅>bàng|\\\ ;" -"雍>yōng|\\\ ;" -"咏>yǒng|\\\ ;" -"倩>qiàn|\\\ ;" -"蒜>suàn|\\\ ;" -"炳>bǐng|\\\ ;" -"惘>wǎng|\\\ ;" -"赃>zāng|\\\ ;" -"槐>huái|\\\ ;" -"婊>biǎo|\\\ ;" -"辗>zhǎn|\\\ ;" -"秉>bǐng|\\\ ;" -"侥>jiǎo|\\\ ;" -"馅>xiàn|\\\ ;" -"袅>niǎo|\\\ ;" -"彷>páng|\\\ ;" -"臻>zhēn|\\\ ;" -"樱>yīng|\\\ ;" -"忏>chàn|\\\ ;" -"窖>jiào|\\\ ;" -"碾>niǎn|\\\ ;" -"馋>chán|\\\ ;" -"漾>yàng|\\\ ;" -"秧>yāng|\\\ ;" -"讪>shàn|\\\ ;" -"醇>chún|\\\ ;" -"憔>qiáo|\\\ ;" -"硝>xiāo|\\\ ;" -"蹭>cèng|\\\ ;" -"龚>gōng|\\\ ;" -"狞>níng|\\\ ;" -"缭>liáo|\\\ ;" -"搀>chān|\\\ ;" -"祯>zhēn|\\\ ;" -"舜>shùn|\\\ ;" -"邢>xíng|\\\ ;" -"槛>jiàn|\\\ ;" -"畴>chóu|\\\ ;" -"舔>tiǎn|\\\ ;" -"惺>xīng|\\\ ;" -"瞟>piǎo|\\\ ;" -"蝉>chán|\\\ ;" -"毡>zhān|\\\ ;" -"抨>pēng|\\\ ;" -"惴>zhuì|\\\ ;" -"擎>qíng|\\\ ;" -"蕉>jiāo|\\\ ;" -"泓>hóng|\\\ ;" -"捎>shāo|\\\ ;" -"澎>péng|\\\ ;" -"捶>chuí|\\\ ;" -"滇>diān|\\\ ;" -"诏>zhào|\\\ ;" -"肾>shèn|\\\ ;" -"鸳>yuān|\\\ ;" -"戎>róng|\\\ ;" -"锭>dìng|\\\ ;" -"攥>zuàn|\\\ ;" -"拈>nián|\\\ ;" -"柬>jiǎn|\\\ ;" -"痪>huàn|\\\ ;" -"恙>yàng|\\\ ;" -"貂>diāo|\\\ ;" -"茸>róng|\\\ ;" -"垣>yuán|\\\ ;" -"棱>léng|\\\ ;" -"聆>líng|\\\ ;" -"癫>diān|\\\ ;" -"梗>gěng|\\\ ;" -"惆>chóu|\\\ ;" -"肇>zhào|\\\ ;" -"菱>líng|\\\ ;" -"礁>jiāo|\\\ ;" -"帚>zhǒu|\\\ ;" -"撵>niǎn|\\\ ;" -"殃>yāng|\\\ ;" -"恬>tián|\\\ ;" -"涟>lián|\\\ ;" -"镑>bàng|\\\ ;" -"鸯>yāng|\\\ ;" -"嫖>piáo|\\\ ;" -"舷>xián|\\\ ;" -"桓>huán|\\\ ;" -"椎>zhuī|\\\ ;" -"镣>liáo|\\\ ;" -"酌>zhuó|\\\ ;" -"荧>yíng|\\\ ;" -"羹>gēng|\\\ ;" -"蘸>zhàn|\\\ ;" -"惦>diàn|\\\ ;" -"谤>bàng|\\\ ;" -"筛>shāi|\\\ ;" -"撂>liào|\\\ ;" -"膺>yīng|\\\ ;" -"憬>jǐng|\\\ ;" -"钳>qián|\\\ ;" -"篡>cuàn|\\\ ;" -"痊>quán|\\\ ;" -"阱>jǐng|\\\ ;" -"悚>sǒng|\\\ ;" -"跷>qiāo|\\\ ;" -"姗>shān|\\\ ;" -"钗>chāi|\\\ ;" -"棠>táng|\\\ ;" -"吮>shǔn|\\\ ;" -"渲>xuàn|\\\ ;" -"匾>biǎn|\\\ ;" -"囔>nāng|\\\ ;" -"藐>miǎo|\\\ ;" -"巅>diān|\\\ ;" -"凋>diāo|\\\ ;" -"跤>jiāo|\\\ ;" -"懵>měng|\\\ ;" -"鲸>jīng|\\\ ;" -"笺>jiān|\\\ ;" -"汀>tīng|\\\ ;" -"膳>shàn|\\\ ;" -"粽>zòng|\\\ ;" -"酵>xiào|\\\ ;" -"蜷>quán|\\\ ;" -"稠>chóu|\\\ ;" -"跚>shān|\\\ ;" -"沼>zhǎo|\\\ ;" -"碱>jiǎn|\\\ ;" -"镰>lián|\\\ ;" -"悻>xìng|\\\ ;" -"腆>tiǎn|\\\ ;" -"涎>xián|\\\ ;" -"瓢>piáo|\\\ ;" -"窿>lóng|\\\ ;" -"荃>quán|\\\ ;" -"掂>diān|\\\ ;" -"萦>yíng|\\\ ;" -"叼>diāo|\\\ ;" -"甬>yǒng|\\\ ;" -"莺>yīng|\\\ ;" -"樵>qiáo|\\\ ;" -"赓>gēng|\\\ ;" -"枭>xiāo|\\\ ;" -"僮>tóng|\\\ ;" -"赘>zhuì|\\\ ;" -"椿>chūn|\\\ ;" -"钊>zhāo|\\\ ;" -"涧>jiàn|\\\ ;" -"绚>xuàn|\\\ ;" -"腺>xiàn|\\\ ;" -"氢>qīng|\\\ ;" -"汕>shàn|\\\ ;" -"蝙>biān|\\\ ;" -"哮>xiāo|\\\ ;" -"峒>tóng|\\\ ;" -"脓>nóng|\\\ ;" -"崆>kōng|\\\ ;" -"谏>jiàn|\\\ ;" -"佯>yáng|\\\ ;" -"宦>huàn|\\\ ;" -"璇>xuán|\\\ ;" -"潺>chán|\\\ ;" -"俑>yǒng|\\\ ;" -"忱>chén|\\\ ;" -"腼>miǎn|\\\ ;" -"萤>yíng|\\\ ;" -"瓮>wèng|\\\ ;" -"栈>zhàn|\\\ ;" -"虻>méng|\\\ ;" -"蚌>bàng|\\\ ;" -"捻>niǎn|\\\ ;" -"佼>jiǎo|\\\ ;" -"谆>zhūn|\\\ ;" -"哝>nóng|\\\ ;" -"韶>sháo|\\\ ;" -"蚣>gōng|\\\ ;" -"暄>xuān|\\\ ;" -"螃>páng|\\\ ;" -"寰>huán|\\\ ;" -"朕>zhèn|\\\ ;" -"搪>táng|\\\ ;" -"峦>luán|\\\ ;" -"骁>xiāo|\\\ ;" -"茗>míng|\\\ ;" -"蟾>chán|\\\ ;" -"镯>zhuó|\\\ ;" -"鬟>huán|\\\ ;" -"罂>yīng|\\\ ;" -"泞>nìng|\\\ ;" -"陇>lǒng|\\\ ;" -"霆>tíng|\\\ ;" -"焘>chóu|\\\ ;" -"缈>miǎo|\\\ ;" -"撬>qiào|\\\ ;" -"啄>zhuó|\\\ ;" -"蹿>cuān|\\\ ;" -"铿>kēng|\\\ ;" -"缥>piǎo|\\\ ;" -"侬>nóng|\\\ ;" -"冗>rǒng|\\\ ;" -"榕>róng|\\\ ;" -"肪>fáng|\\\ ;" -"甄>zhēn|\\\ ;" -"糠>kāng|\\\ ;" -"啜>chuò|\\\ ;" -"梆>bāng|\\\ ;" -"翎>líng|\\\ ;" -"踝>huái|\\\ ;" -"裆>dāng|\\\ ;" -"玷>diàn|\\\ ;" -"燎>liáo|\\\ ;" -"蟒>mǎng|\\\ ;" -"辕>yuán|\\\ ;" -"鹃>juān|\\\ ;" -"铛>dāng|\\\ ;" -"迳>jìng|\\\ ;" -"茎>jīng|\\\ ;" -"埂>gěng|\\\ ;" -"嘭>péng|\\\ ;" -"恸>tòng|\\\ ;" -"瞳>tóng|\\\ ;" -"鹪>jiāo|\\\ ;" -"膻>shān|\\\ ;" -"怂>sǒng|\\\ ;" -"瞑>míng|\\\ ;" -"赈>zhèn|\\\ ;" -"诠>quán|\\\ ;" -"恿>yǒng|\\\ ;" -"烽>fēng|\\\ ;" -"蒯>kuǎi|\\\ ;" -"缨>yīng|\\\ ;" -"舫>fǎng|\\\ ;" -"掸>chán|\\\ ;" -"嘤>yīng|\\\ ;" -"蜕>shuì|\\\ ;" -"蛟>jiāo|\\\ ;" -"桢>zhēn|\\\ ;" -"涓>juān|\\\ ;" -"唰>shuā|\\\ ;" -"佃>diàn|\\\ ;" -"囱>cōng|\\\ ;" -"鳝>shàn|\\\ ;" -"黏>nián|\\\ ;" -"佟>tóng|\\\ ;" -"缄>jiān|\\\ ;" -"隽>juàn|\\\ ;" -"漩>xuán|\\\ ;" -"狩>shòu|\\\ ;" -"茜>qiàn|\\\ ;" -"黔>qián|\\\ ;" -"槌>chuí|\\\ ;" -"斫>zhuó|\\\ ;" -"炀>yáng|\\\ ;" -"辍>chuò|\\\ ;" -"咛>níng|\\\ ;" -"怏>yàng|\\\ ;" -"胄>zhòu|\\\ ;" -"剽>piāo|\\\ ;" -"蜓>tíng|\\\ ;" -"皎>jiǎo|\\\ ;" -"琏>lián|\\\ ;" -"嘹>liáo|\\\ ;" -"痉>jìng|\\\ ;" -"搡>sǎng|\\\ ;" -"孪>luán|\\\ ;" -"挛>luán|\\\ ;" -"旌>jīng|\\\ ;" -"羚>líng|\\\ ;" -"泱>yāng|\\\ ;" -"泾>jìng|\\\ ;" -"蜻>qīng|\\\ ;" -"嵘>róng|\\\ ;" -"倌>guān|\\\ ;" -"螂>láng|\\\ ;" -"苓>líng|\\\ ;" -"蔫>niān|\\\ ;" -"汴>biàn|\\\ ;" -"摒>bìng|\\\ ;" -"恫>dòng|\\\ ;" -"绌>zhuó|\\\ ;" -"踮>diǎn|\\\ ;" -"媛>yuán|\\\ ;" -"豺>chái|\\\ ;" -"箴>zhēn|\\\ ;" -"俸>fèng|\\\ ;" -"罔>wǎng|\\\ ;" -"湍>tuān|\\\ ;" -"仃>dīng|\\\ ;" -"鹦>yīng|\\\ ;" -"脍>kuài|\\\ ;" -"胫>jìng|\\\ ;" -"硷>jiǎn|\\\ ;" -"绉>zhòu|\\\ ;" -"涣>huàn|\\\ ;" -"闳>hóng|\\\ ;" -"臃>yōng|\\\ ;" -"寮>liáo|\\\ ;" -"缮>shàn|\\\ ;" -"颧>quán|\\\ ;" -"碉>diāo|\\\ ;" -"泵>bèng|\\\ ;" -"赡>shàn|\\\ ;" -"宕>dàng|\\\ ;" -"沔>miǎn|\\\ ;" -"堑>qiàn|\\\ ;" -"罡>gāng|\\\ ;" -"芍>sháo|\\\ ;" -"靓>jìng|\\\ ;" -"镌>juān|\\\ ;" -"潼>tóng|\\\ ;" -"垸>huàn|\\\ ;" -"谄>chǎn|\\\ ;" -"掼>guàn|\\\ ;" -"儆>jǐng|\\\ ;" -"纂>zuǎn|\\\ ;" -"玎>dīng|\\\ ;" -"檬>méng|\\\ ;" -"盥>guàn|\\\ ;" -"噔>dēng|\\\ ;" -"疹>zhěn|\\\ ;" -"淙>cóng|\\\ ;" -"橇>qiāo|\\\ ;" -"柠>níng|\\\ ;" -"艄>shāo|\\\ ;" -"阆>lǎng|\\\ ;" -"疡>yáng|\\\ ;" -"饯>jiàn|\\\ ;" -"鬃>zōng|\\\ ;" -"殓>liàn|\\\ ;" -"菁>jīng|\\\ ;" -"濯>zhuó|\\\ ;" -"隼>zhǔn|\\\ ;" -"翦>jiǎn|\\\ ;" -"淞>sōng|\\\ ;" -"桧>kuài|\\\ ;" -"潸>shān|\\\ ;" -"龊>chuò|\\\ ;" -"愆>qiān|\\\ ;" -"姣>jiāo|\\\ ;" -"膘>biāo|\\\ ;" -"卞>biàn|\\\ ;" -"鸾>luán|\\\ ;" -"镗>tāng|\\\ ;" -"娩>miǎn|\\\ ;" -"筱>xiǎo|\\\ ;" -"裱>biǎo|\\\ ;" -"溟>míng|\\\ ;" -"陲>chuí|\\\ ;" -"窕>tiǎo|\\\ ;" -"锏>jiǎn|\\\ ;" -"町>tǐng|\\\ ;" -"纣>zhòu|\\\ ;" -"谶>chèn|\\\ ;" -"镳>biāo|\\\ ;" -"徉>yáng|\\\ ;" -"谪>jiàn|\\\ ;" -"佻>tiāo|\\\ ;" -"飙>biāo|\\\ ;" -"掮>qián|\\\ ;" -"伉>kàng|\\\ ;" -"锨>xiān|\\\ ;" -"磬>qìng|\\\ ;" -"瑭>táng|\\\ ;" -"孱>chán|\\\ ;" -"骞>qiān|\\\ ;" -"镫>dèng|\\\ ;" -"臧>zāng|\\\ ;" -"傥>tǎng|\\\ ;" -"慵>yōng|\\\ ;" -"濂>lián|\\\ ;" -"囹>líng|\\\ ;" -"嬴>yíng|\\\ ;" -"侩>kuài|\\\ ;" -"枰>píng|\\\ ;" -"滂>pāng|\\\ ;" -"芫>yuán|\\\ ;" -"铤>tǐng|\\\ ;" -"棂>líng|\\\ ;" -"伧>cāng|\\\ ;" -"谗>chán|\\\ ;" -"螳>táng|\\\ ;" -"锷>chāi|\\\ ;" -"绫>líng|\\\ ;" -"茁>zhuó|\\\ ;" -"蜃>shèn|\\\ ;" -"铄>shuò|\\\ ;" -"缜>zhēn|\\\ ;" -"逄>páng|\\\ ;" -"辶>chuò|\\\ ;" -"舢>shān|\\\ ;" -"淼>miǎo|\\\ ;" -"罄>qìng|\\\ ;" -"碜>chěn|\\\ ;" -"甏>pèng|\\\ ;" -"泠>líng|\\\ ;" -"僭>jiàn|\\\ ;" -"碘>diǎn|\\\ ;" -"殍>piǎo|\\\ ;" -"擤>xǐng|\\\ ;" -"荞>qiáo|\\\ ;" -"阡>qiān|\\\ ;" -"汞>gǒng|\\\ ;" -"婵>chán|\\\ ;" -"嘣>bēng|\\\ ;" -"娉>pīng|\\\ ;" -"讧>hóng|\\\ ;" -"砧>zhēn|\\\ ;" -"骈>pián|\\\ ;" -"邈>miǎo|\\\ ;" -"肛>gāng|\\\ ;" -"獠>liáo|\\\ ;" -"哂>shěn|\\\ ;" -"榔>láng|\\\ ;" -"绶>shòu|\\\ ;" -"噌>cēng|\\\ ;" -"誊>téng|\\\ ;" -"宸>chén|\\\ ;" -"佞>nìng|\\\ ;" -"邕>yōng|\\\ ;" -"俦>chóu|\\\ ;" -"鸢>yuān|\\\ ;" -"湎>miǎn|\\\ ;" -"喵>miāo|\\\ ;" -"挝>zhuā|\\\ ;" -"飚>biāo|\\\ ;" -"琮>cóng|\\\ ;" -"鞅>yāng|\\\ ;" -"镛>yōng|\\\ ;" -"钿>diàn|\\\ ;" -"抻>shèn|\\\ ;" -"滦>luán|\\\ ;" -"楹>yíng|\\\ ;" -"涿>zhuó|\\\ ;" -"氰>qīng|\\\ ;" -"鬈>quán|\\\ ;" -"珩>héng|\\\ ;" -"呤>líng|\\\ ;" -"夯>hāng|\\\ ;" -"跹>xiān|\\\ ;" -"睑>jiǎn|\\\ ;" -"晁>cháo|\\\ ;" -"嬗>shàn|\\\ ;" -"忝>tiǎn|\\\ ;" -"墉>yōng|\\\ ;" -"凇>sòng|\\\ ;" -"鲠>gěng|\\\ ;" -"醮>jiào|\\\ ;" -"穰>ráng|\\\ ;" -"楝>liàn|\\\ ;" -"栾>luán|\\\ ;" -"暹>xiān|\\\ ;" -"沣>fēng|\\\ ;" -"茏>lóng|\\\ ;" -"芡>qiàn|\\\ ;" -"鳏>guān|\\\ ;" -"殄>tiǎn|\\\ ;" -"桁>héng|\\\ ;" -"缒>zhuì|\\\ ;" -"骠>piào|\\\ ;" -"菅>jiān|\\\ ;" -"茔>yíng|\\\ ;" -"蝼>bǎng|\\\ ;" -"烊>yáng|\\\ ;" -"绻>quǎn|\\\ ;" -"劭>shào|\\\ ;" -"蛹>yǒng|\\\ ;" -"豢>huàn|\\\ ;" -"侗>tóng|\\\ ;" -"酩>míng|\\\ ;" -"撺>cuān|\\\ ;" -"癣>xiǎn|\\\ ;" -"眇>miǎo|\\\ ;" -"妯>zhóu|\\\ ;" -"奘>zàng|\\\ ;" -"萱>xuān|\\\ ;" -"锰>měng|\\\ ;" -"铉>xuàn|\\\ ;" -"蹇>jiǎn|\\\ ;" -"悭>qiān|\\\ ;" -"弁>biàn|\\\ ;" -"酮>tóng|\\\ ;" -"钎>qiān|\\\ ;" -"鸩>zhèn|\\\ ;" -"腚>dìng|\\\ ;" -"胴>dòng|\\\ ;" -"骢>cōng|\\\ ;" -"勐>měng|\\\ ;" -"訇>hōng|\\\ ;" -"侪>chái|\\\ ;" -"烃>jǐng|\\\ ;" -"酊>dǐng|\\\ ;" -"铨>quán|\\\ ;" -"砭>biān|\\\ ;" -"骓>zhuī|\\\ ;" -"藓>xiǎn|\\\ ;" -"銮>luán|\\\ ;" -"鼋>yuán|\\\ ;" -"缱>qiǎn|\\\ ;" -"泫>xuàn|\\\ ;" -"嗵>tōng|\\\ ;" -"奂>huàn|\\\ ;" -"佥>qiān|\\\ ;" -"腱>jiàn|\\\ ;" -"崧>sōng|\\\ ;" -"圜>yuán|\\\ ;" -"壅>yōng|\\\ ;" -"冼>xiǎn|\\\ ;" -"粳>gēng|\\\ ;" -"郴>chēn|\\\ ;" -"龉>lǒng|\\\ ;" -"笊>zhào|\\\ ;" -"锒>láng|\\\ ;" -"暝>míng|\\\ ;" -"澶>chán|\\\ ;" -"搠>shuò|\\\ ;" -"茭>jiāo|\\\ ;" -"苕>tiáo|\\\ ;" -"娠>shēn|\\\ ;" -"砷>shēn|\\\ ;" -"觥>gōng|\\\ ;" -"戆>gàng|\\\ ;" -"煊>jiǎn|\\\ ;" -"杓>sháo|\\\ ;" -"谌>chén|\\\ ;" -"瓤>ráng|\\\ ;" -"爨>cuàn|\\\ ;" -"缵>guàn|\\\ ;" -"渖>shěn|\\\ ;" -"囝>jiǎn|\\\ ;" -"笤>tiáo|\\\ ;" -"痫>xián|\\\ ;" -"鹑>chún|\\\ ;" -"棹>zhuō|\\\ ;" -"苋>xiàn|\\\ ;" -"垅>lǒng|\\\ ;" -"鹳>guàn|\\\ ;" -"钤>qián|\\\ ;" -"樯>cóng|\\\ ;" -"骟>shàn|\\\ ;" -"挢>jiǎo|\\\ ;" -"抟>tuán|\\\ ;" -"燹>xiǎn|\\\ ;" -"湫>jiǎo|\\\ ;" -"啁>zhōu|\\\ ;" -"塬>yuán|\\\ ;" -"鲇>nián|\\\ ;" -"箝>qián|\\\ ;" -"瓴>líng|\\\ ;" -"沆>háng|\\\ ;" -"愀>qiǎo|\\\ ;" -"擢>zhuó|\\\ ;" -"铣>xiǎn|\\\ ;" -"仟>qiān|\\\ ;" -"犍>jiān|\\\ ;" -"娈>luán|\\\ ;" -"妁>shuò|\\\ ;" -"羼>chàn|\\\ ;" -"倥>kōng|\\\ ;" -"籼>xiān|\\\ ;" -"蜢>měng|\\\ ;" -"裢>lián|\\\ ;" -"竦>sǒng|\\\ ;" -"绡>xiāo|\\\ ;" -"洹>huán|\\\ ;" -"廛>chán|\\\ ;" -"撄>yīng|\\\ ;" -"尥>liào|\\\ ;" -"谯>qiáo|\\\ ;" -"铰>jiǎo|\\\ ;" -"髋>kuān|\\\ ;" -"鲦>tiáo|\\\ ;" -"肱>gōng|\\\ ;" -"嶝>dèng|\\\ ;" -"芊>qiān|\\\ ;" -"偬>zǒng|\\\ ;" -"倬>zhuō|\\\ ;" -"硼>péng|\\\ ;" -"靛>diàn|\\\ ;" -"霰>xiàn|\\\ ;" -"簟>diàn|\\\ ;" -"疔>dīng|\\\ ;" -"稹>zhěn|\\\ ;" -"碇>dìng|\\\ ;" -"煅>duàn|\\\ ;" -"旃>zhān|\\\ ;" -"肫>zhūn|\\\ ;" -"甑>zèng|\\\ ;" -"瑗>yuàn|\\\ ;" -"猃>xiǎn|\\\ ;" -"哙>kuài|\\\ ;" -"蓊>wěng|\\\ ;" -"荥>qián|\\\ ;" -"酰>xiān|\\\ ;" -"羟>qiān|\\\ ;" -"蠓>měng|\\\ ;" -"裣>liàn|\\\ ;" -"毽>jiàn|\\\ ;" -"戋>jiān|\\\ ;" -"橼>yuán|\\\ ;" -"榛>zhēn|\\\ ;" -"珙>gǒng|\\\ ;" -"溏>táng|\\\ ;" -"郢>yǐng|\\\ ;" -"谵>zhān|\\\ ;" -"苫>shān|\\\ ;" -"扦>qiān|\\\ ;" -"魍>wǎng|\\\ ;" -"煸>biān|\\\ ;" -"焯>chāo|\\\ ;" -"胼>pián|\\\ ;" -"爰>yuán|\\\ ;" -"犏>piān|\\\ ;" -"棰>chuí|\\\ ;" -"绠>gěng|\\\ ;" -"浞>zhuó|\\\ ;" -"悛>quān|\\\ ;" -"狷>juàn|\\\ ;" -"峤>jiào|\\\ ;" -"嘌>piāo|\\\ ;" -"哓>xiāo|\\\ ;" -"蒹>jiān|\\\ ;" -"塄>léng|\\\ ;" -"鄄>juàn|\\\ ;" -"鞯>jiān|\\\ ;" -"鲢>lián|\\\ ;" -"躜>zuān|\\\ ;" -"蹁>pián|\\\ ;" -"砻>lóng|\\\ ;" -"砀>dàng|\\\ ;" -"腈>jīng|\\\ ;" -"脘>guǎn|\\\ ;" -"辇>niǎn|\\\ ;" -"椹>shèn|\\\ ;" -"璎>yīng|\\\ ;" -"谠>dǎng|\\\ ;" -"劁>qiāo|\\\ ;" -"螟>míng|\\\ ;" -"跣>xiǎn|\\\ ;" -"籀>zhòu|\\\ ;" -"癜>diàn|\\\ ;" -"砦>zhài|\\\ ;" -"枋>fāng|\\\ ;" -"潋>liàn|\\\ ;" -"饧>xíng|\\\ ;" -"掾>yuàn|\\\ ;" -"蕻>hòng|\\\ ;" -"莼>chún|\\\ ;" -"莨>làng|\\\ ;" -"谝>pián|\\\ ;" -"鲛>jiǎo|\\\ ;" -"謦>qìng|\\\ ;" -"艏>shǒu|\\\ ;" -"笕>jiǎn|\\\ ;" -"蛉>líng|\\\ ;" -"铫>tiáo|\\\ ;" -"蠲>juān|\\\ ;" -"眄>miǎn|\\\ ;" -"磴>dèng|\\\ ;" -"媵>yìng|\\\ ;" -"胗>zhēn|\\\ ;" -"轸>zhěn|\\\ ;" -"梃>tǐng|\\\ ;" -"馕>náng|\\\ ;" -"獾>huān|\\\ ;" -"魈>xiāo|\\\ ;" -"鲮>líng|\\\ ;" -"黾>méng|\\\ ;" -"疝>shàn|\\\ ;" -"戬>jiǎn|\\\ ;" -"謇>jiǎn|\\\ ;" -"漶>huàn|\\\ ;" -"帑>tǎng|\\\ ;" -"揎>xuān|\\\ ;" -"蒗>làng|\\\ ;" -"酃>líng|\\\ ;" -"陉>jìng|\\\ ;" -"剡>shàn|\\\ ;" -"鲂>fáng|\\\ ;" -"粜>tiào|\\\ ;" -"筲>shāo|\\\ ;" -"螈>yuán|\\\ ;" -"颃>gāng|\\\ ;" -"褊>biǎn|\\\ ;" -"钍>shān|\\\ ;" -"畛>zhěn|\\\ ;" -"曩>nǎng|\\\ ;" -"辋>wǎng|\\\ ;" -"溱>zhēn|\\\ ;" -"忭>biàn|\\\ ;" -"攮>nǎng|\\\ ;" -"荇>xìng|\\\ ;" -"苎>méng|\\\ ;" -"邡>fāng|\\\ ;" -"谖>xuān|\\\ ;" -"醛>quán|\\\ ;" -"耪>pǎng|\\\ ;" -"黥>qíng|\\\ ;" -"髫>tiáo|\\\ ;" -"鞒>qiāo|\\\ ;" -"鳔>biào|\\\ ;" -"踔>zhuó|\\\ ;" -"箜>kōng|\\\ ;" -"筌>quán|\\\ ;" -"蟮>shàn|\\\ ;" -"颡>chàn|\\\ ;" -"聍>níng|\\\ ;" -"耵>tīng|\\\ ;" -"裥>jiǎn|\\\ ;" -"砼>tóng|\\\ ;" -"禳>ráng|\\\ ;" -"觇>zhān|\\\ ;" -"槊>shuò|\\\ ;" -"缳>huán|\\\ ;" -"婧>jìng|\\\ ;" -"潲>shào|\\\ ;" -"滢>yíng|\\\ ;" -"浍>kuài|\\\ ;" -"啶>dìng|\\\ ;" -"薨>hōng|\\\ ;" -"瞢>méng|\\\ ;" -"蓼>liǎo|\\\ ;" -"蓁>zhēn|\\\ ;" -"菘>sōng|\\\ ;" -"茑>niǎo|\\\ ;" -"邙>máng|\\\ ;" -"饔>yōng|\\\ ;" -"鲷>diāo|\\\ ;" -"隹>zhuī|\\\ ;" -"艨>méng|\\\ ;" -"艟>tóng|\\\ ;" -"舡>gāng|\\\ ;" -"鹇>xián|\\\ ;" -"锶>sōng|\\\ ;" -"钇>dìng|\\\ ;" -"硎>xíng|\\\ ;" -"祧>tiāo|\\\ ;" -"敫>jiào|\\\ ;" -"楦>xuàn|\\\ ;" -"椴>duàn|\\\ ;" -"缯>zēng|\\\ ;" -"嬲>niǎo|\\\ ;" -"惝>tǎng|\\\ ;" -"噍>jiāo|\\\ ;" -"唪>fěng|\\\ ;" -"萑>huán|\\\ ;" -"芟>shān|\\\ ;" -"苌>cǎng|\\\ ;" -"埝>niàn|\\\ ;" -"鄯>shàn|\\\ ;" -"脔>luán|\\\ ;" -"汆>cuān|\\\ ;" -"儇>xuān|\\\ ;" -"刭>jǐng|\\\ ;" -"鲶>nián|\\\ ;" -"鲣>jiān|\\\ ;" -"龀>chèn|\\\ ;" -"羰>tāng|\\\ ;" -"艋>měng|\\\ ;" -"簦>dēng|\\\ ;" -"蠊>lián|\\\ ;" -"螵>piāo|\\\ ;" -"螗>táng|\\\ ;" -"蝾>róng|\\\ ;" -"蜩>tiáo|\\\ ;" -"蛸>shāo|\\\ ;" -"蚬>xiàn|\\\ ;" -"瘿>yǐng|\\\ ;" -"瘥>chài|\\\ ;" -"鸫>dōng|\\\ ;" -"稂>láng|\\\ ;" -"锾>huán|\\\ ;" -"锩>juàn|\\\ ;" -"硐>tóng|\\\ ;" -"肜>róng|\\\ ;" -"氡>dōng|\\\ ;" -"榇>chèn|\\\ ;" -"枵>xiāo|\\\ ;" -"枞>cōng|\\\ ;" -"杪>miǎo|\\\ ;" -"缬>céng|\\\ ;" -"彖>tuàn|\\\ ;" -"湔>jiān|\\\ ;" -"渑>miǎn|\\\ ;" -"泷>lóng|\\\ ;" -"慊>qiàn|\\\ ;" -"圉>chuí|\\\ ;" -"尢>wāng|\\\ ;" -"蘅>héng|\\\ ;" -"蒡>bàng|\\\ ;" -"苄>biàn|\\\ ;" -"郐>kuài|\\\ ;" -"诼>shéi|\\\ ;" -"髟>biāo|\\\ ;" -"鳙>yóng|\\\ ;" -"鳊>biān|\\\ ;" -"鲭>qīng|\\\ ;" -"龆>tiáo|\\\ ;" -"趼>jiǎn|\\\ ;" -"醣>táng|\\\ ;" -"簖>duàn|\\\ ;" -"箐>jīng|\\\ ;" -"蛘>yáng|\\\ ;" -"虿>chài|\\\ ;" -"颥>fěng|\\\ ;" -"瘳>chōu|\\\ ;" -"鹩>liáo|\\\ ;" -"矧>shěn|\\\ ;" -"铞>diào|\\\ ;" -"钪>kàng|\\\ ;" -"钫>fāng|\\\ ;" -"钐>shàn|\\\ ;" -"罾>zēng|\\\ ;" -"畎>quǎn|\\\ ;" -"磉>sǎng|\\\ ;" -"硗>qiāo|\\\ ;" -"硭>máng|\\\ ;" -"祆>xiān|\\\ ;" -"胂>shèn|\\\ ;" -"胨>dòng|\\\ ;" -"氙>xiān|\\\ ;" -"辁>quán|\\\ ;" -"檠>qíng|\\\ ;" -"楗>jiàn|\\\ ;" -"椠>qiàn|\\\ ;" -"栊>lóng|\\\ ;" -"璁>cōng|\\\ ;" -"缣>jiān|\\\ ;" -"缏>biàn|\\\ ;" -"绗>hèng|\\\ ;" -"逭>huàn|\\\ ;" -"搴>qiān|\\\ ;" -"宀>mián|\\\ ;" -"闶>kàng|\\\ ;" -"獍>jìng|\\\ ;" -"徼>jiǎo|\\\ ;" -"蕹>yōng|\\\ ;" -"甍>méng|\\\ ;" -"蓥>yìng|\\\ ;" -"艽>jiāo|\\\ ;" -"垌>dòng|\\\ ;" -"酆>fēng|\\\ ;" -"阽>diàn|\\\ ;" -"诜>shēn|\\\ ;" -"仝>tóng|\\\ ;" -"俜>pīng|\\\ ;" -"㐁>tiǎn|\\\ ;" -"㐜>chóu|\\\ ;" -"㐩>xíng|\\\ ;" -"㐱>zhěn|\\\ ;" -"㐸>qiàn|\\\ ;" -"㑂>fǎng|\\\ ;" -"㑇>zhòu|\\\ ;" -"㑈>dòng|\\\ ;" -"㑝>lòng|\\\ ;" -"㑞>yìng|\\\ ;" -"㑟>běng|\\\ ;" -"㑤>miáo|\\\ ;" -"㑪>chái|\\\ ;" -"㑳>zhòu|\\\ ;" -"㑽>táng|\\\ ;" -"㑾>xiáo|\\\ ;" -"㑿>tiáo|\\\ ;" -"㒄>nàng|\\\ ;" -"㒉>tǎng|\\\ ;" -"㒙>mián|\\\ ;" -"㒛>diào|\\\ ;" -"㒟>niǎo|\\\ ;" -"㒰>quán|\\\ ;" -"㓁>wǎng|\\\ ;" -"㓃>chuí|\\\ ;" -"㓄>zhèn|\\\ ;" -"㓉>huàn|\\\ ;" -"㓊>dòng|\\\ ;" -"㓋>gòng|\\\ ;" -"㓎>lián|\\\ ;" -"㓑>xìng|\\\ ;" -"㓝>xíng|\\\ ;" -"㓠>diàn|\\\ ;" -"㓪>lǎng|\\\ ;" -"㓲>piàn|\\\ ;" -"㓺>jiàn|\\\ ;" -"㔅>xiào|\\\ ;" -"㔆>chán|\\\ ;" -"㔋>jiàn|\\\ ;" -"㔌>zhòu|\\\ ;" -"㔓>jiǎn|\\\ ;" -"㔙>bǎng|\\\ ;" -"㔞>kuài|\\\ ;" -"㔤>shěn|\\\ ;" -"㔦>yǎng|\\\ ;" -"㔯>suǎn|\\\ ;" -"㔰>héng|\\\ ;" -"㔵>xiàn|\\\ ;" -"㔶>gòng|\\\ ;" -"㕋>jìng|\\\ ;" -"㕕>huàn|\\\ ;" -"㕚>zhǎo|\\\ ;" -"㕫>fǎng|\\\ ;" -"㕬>sòng|\\\ ;" -"㕴>chén|\\\ ;" -"㖓>hóng|\\\ ;" -"㖟>shòu|\\\ ;" -"㖦>dǒng|\\\ ;" -"㖫>líng|\\\ ;" -"㖭>tiǎn|\\\ ;" -"㖺>chǔn|\\\ ;" -"㗛>xiào|\\\ ;" -"㗢>dòng|\\\ ;" -"㘅>xián|\\\ ;" -"㘇>róng|\\\ ;" -"㘋>xián|\\\ ;" -"㘝>niǎn|\\\ ;" -"㘢>wěng|\\\ ;" -"㘣>xuán|\\\ ;" -"㘫>jǐng|\\\ ;" -"㘸>zàng|\\\ ;" -"㙁>mǎng|\\\ ;" -"㙉>tiǎn|\\\ ;" -"㙕>kuài|\\\ ;" -"㙗>kuài|\\\ ;" -"㙙>lǒng|\\\ ;" -"㙟>lǎng|\\\ ;" -"㙩>liáo|\\\ ;" -"㙲>yǒng|\\\ ;" -"㙴>chàn|\\\ ;" -"㙶>táng|\\\ ;" -"㙹>méng|\\\ ;" -"㙻>chán|\\\ ;" -"㚁>qiáo|\\\ ;" -"㚂>ráng|\\\ ;" -"㚅>lóng|\\\ ;" -"㚒>shǎn|\\\ ;" -"㚞>měng|\\\ ;" -"㚟>chuò|\\\ ;" -"㚣>xiáo|\\\ ;" -"㚲>diǎn|\\\ ;" -"㚽>qiǎo|\\\ ;" -"㛔>péng|\\\ ;" -"㛚>tǒng|\\\ ;" -"㛞>lòng|\\\ ;" -"㛩>zhóu|\\\ ;" -"㛯>miǎn|\\\ ;" -"㛶>chóu|\\\ ;" -"㛹>pián|\\\ ;" -"㛾>xián|\\\ ;" -"㜃>liàn|\\\ ;" -"㜊>pàng|\\\ ;" -"㜍>táng|\\\ ;" -"㜕>lián|\\\ ;" -"㜞>qiàn|\\\ ;" -"㜤>shěn|\\\ ;" -"㜪>xiǎn|\\\ ;" -"㜱>dòng|\\\ ;" -"㜲>wěng|\\\ ;" -"㜳>huái|\\\ ;" -"㜴>mèng|\\\ ;" -"㜵>niǎo|\\\ ;" -"㜻>liàn|\\\ ;" -"㝄>chún|\\\ ;" -"㝇>chún|\\\ ;" -"㝈>luán|\\\ ;" -"㝊>shǒu|\\\ ;" -"㝋>liáo|\\\ ;" -"㝎>dìng|\\\ ;" -"㝐>róng|\\\ ;" -"㝑>máng|\\\ ;" -"㝕>níng|\\\ ;" -"㝗>láng|\\\ ;" -"㝘>yóng|\\\ ;" -"㝠>míng|\\\ ;" -"㝪>diàn|\\\ ;" -"㝫>lóng|\\\ ;" -"㝭>xǐng|\\\ ;" -"㝯>qiáo|\\\ ;" -"㝰>mián|\\\ ;" -"㝱>mèng|\\\ ;" -"㝸>biàn|\\\ ;" -"㝺>lián|\\\ ;" -"㝽>chuí|\\\ ;" -"㞋>niǎn|\\\ ;" -"㞙>niào|\\\ ;" -"㞟>diàn|\\\ ;" -"㞡>zhǎn|\\\ ;" -"㞲>yòng|\\\ ;" -"㟀>lián|\\\ ;" -"㟅>yáng|\\\ ;" -"㟌>máng|\\\ ;" -"㟍>láng|\\\ ;" -"㟐>mǎng|\\\ ;" -"㟖>lòng|\\\ ;" -"㟘>tiáo|\\\ ;" -"㟞>zhàn|\\\ ;" -"㟠>gǎng|\\\ ;" -"㟨>quán|\\\ ;" -"㟫>quán|\\\ ;" -"㟰>mǐng|\\\ ;" -"㟴>kuài|\\\ ;" -"㟵>gǎng|\\\ ;" -"㟶>yuán|\\\ ;" -"㟻>qiàn|\\\ ;" -"㟽>biǎo|\\\ ;" -"㟿>máng|\\\ ;" -"㠉>tóng|\\\ ;" -"㠐>jiào|\\\ ;" -"㠒>biǎo|\\\ ;" -"㠓>méng|\\\ ;" -"㠝>cuán|\\\ ;" -"㠡>niǎo|\\\ ;" -"㠭>zhǎn|\\\ ;" -"㠺>miáo|\\\ ;" -"㠽>tóng|\\\ ;" -"㡉>xián|\\\ ;" -"㡑>qiǎo|\\\ ;" -"㡘>lián|\\\ ;" -"㡛>máng|\\\ ;" -"㡝>fèng|\\\ ;" -"㡣>lóng|\\\ ;" -"㡨>qiān|\\\ ;" -"㡩>luán|\\\ ;" -"㡯>zhái|\\\ ;" -"㡲>huán|\\\ ;" -"㡵>líng|\\\ ;" -"㡻>liào|\\\ ;" -"㡽>zhào|\\\ ;" -"㡾>xiàn|\\\ ;" -"㢃>láng|\\\ ;" -"㢅>lòng|\\\ ;" -"㢆>chán|\\\ ;" -"㢍>yíng|\\\ ;" -"㢔>zǒng|\\\ ;" -"㢗>qiào|\\\ ;" -"㢘>lián|\\\ ;" -"㢟>chǎn|\\\ ;" -"㢣>jìng|\\\ ;" -"㢥>dòng|\\\ ;" -"㢧>juàn|\\\ ;" -"㢬>hóng|\\\ ;" -"㢺>xián|\\\ ;" -"㢾>juàn|\\\ ;" -"㣀>zhèn|\\\ ;" -"㣌>shàn|\\\ ;" -"㣏>jìng|\\\ ;" -"㣐>biàn|\\\ ;" -"㣑>róng|\\\ ;" -"㣒>cèng|\\\ ;" -"㣚>tóng|\\\ ;" -"㣜>xíng|\\\ ;" -"㣠>tóng|\\\ ;" -"㣣>shǎn|\\\ ;" -"㣤>jiàn|\\\ ;" -"㣪>huǎn|\\\ ;" -"㣷>nìng|\\\ ;" -"㣿>zhuó|\\\ ;" -"㤁>miǎn|\\\ ;" -"㤃>fáng|\\\ ;" -"㤊>xiào|\\\ ;" -"㤍>qiǎo|\\\ ;" -"㤏>tóng|\\\ ;" -"㤚>háng|\\\ ;" -"㤟>kǒng|\\\ ;" -"㤨>gǒng|\\\ ;" -"㤪>yuàn|\\\ ;" -"㤶>páng|\\\ ;" -"㤽>chóu|\\\ ;" -"㥄>líng|\\\ ;" -"㥅>shòu|\\\ ;" -"㥆>diàn|\\\ ;" -"㥊>péng|\\\ ;" -"㥏>tiǎn|\\\ ;" -"㥐>yuàn|\\\ ;" -"㥕>lián|\\\ ;" -"㥧>shùn|\\\ ;" -"㥨>chuí|\\\ ;" -"㥬>páng|\\\ ;" -"㥮>zhòu|\\\ ;" -"㥲>shèn|\\\ ;" -"㥳>yuán|\\\ ;" -"㦀>féng|\\\ ;" -"㦁>lián|\\\ ;" -"㦃>chǎn|\\\ ;" -"㦑>liǎn|\\\ ;" -"㦓>xiàn|\\\ ;" -"㦕>lóng|\\\ ;" -"㦗>jiàn|\\\ ;" -"㦚>biǎn|\\\ ;" -"㦝>miǎo|\\\ ;" -"㦞>chóu|\\\ ;" -"㦥>huán|\\\ ;" -"㦭>líng|\\\ ;" -"㦮>qián|\\\ ;" -"㦷>yǒng|\\\ ;" -"㧂>tián|\\\ ;" -"㧄>qiǎn|\\\ ;" -"㧋>xiǎn|\\\ ;" -"㧍>fǎng|\\\ ;" -"㧐>sǒng|\\\ ;" -"㧔>guài|\\\ ;" -"㧟>kuǎi|\\\ ;" -"㧥>xiǎn|\\\ ;" -"㧦>xuàn|\\\ ;" -"㧬>gǒng|\\\ ;" -"㧱>chèn|\\\ ;" -"㧼>biào|\\\ ;" -"㨀>bǐng|\\\ ;" -"㨂>dǒng|\\\ ;" -"㨄>zhào|\\\ ;" -"㨕>yíng|\\\ ;" -"㨘>xǐng|\\\ ;" -"㨛>shǎn|\\\ ;" -"㨜>qián|\\\ ;" -"㨦>sǒng|\\\ ;" -"㨴>jiàn|\\\ ;" -"㨵>jiǎn|\\\ ;" -"㨶>chóu|\\\ ;" -"㨾>yàng|\\\ ;" -"㩈>xiàn|\\\ ;" -"㩚>méng|\\\ ;" -"㩛>tuán|\\\ ;" -"㩟>zhài|\\\ ;" -"㩠>piǎo|\\\ ;" -"㩮>qián|\\\ ;" -"㩰>jiǎo|\\\ ;" -"㩳>sǒng|\\\ ;" -"㩾>chuí|\\\ ;" -"㪇>xiàn|\\\ ;" -"㪌>tǒng|\\\ ;" -"㪎>shǎn|\\\ ;" -"㪕>diào|\\\ ;" -"㪘>liǎn|\\\ ;" -"㪛>zhěn|\\\ ;" -"㪝>liàn|\\\ ;" -"㪠>qiàn|\\\ ;" -"㪢>shǎo|\\\ ;" -"㪣>qiào|\\\ ;" -"㪨>shàn|\\\ ;" -"㪬>zhuó|\\\ ;" -"㪮>líng|\\\ ;" -"㪱>huàn|\\\ ;" -"㪻>juàn|\\\ ;" -"㫀>dǐng|\\\ ;" -"㫁>duàn|\\\ ;" -"㫄>páng|\\\ ;" -"㫒>gǒng|\\\ ;" -"㫥>mǐng|\\\ ;" -"㫫>xiǎn|\\\ ;" -"㫰>lǎng|\\\ ;" -"㫳>chén|\\\ ;" -"㬄>chàn|\\\ ;" -"㬆>mián|\\\ ;" -"㬇>huàn|\\\ ;" -"㬉>nuǎn|\\\ ;" -"㬊>huǎn|\\\ ;" -"㬌>jìng|\\\ ;" -"㬎>xiǎn|\\\ ;" -"㬒>mǎng|\\\ ;" -"㬓>piào|\\\ ;" -"㬕>yáng|\\\ ;" -"㬗>xiàn|\\\ ;" -"㬝>céng|\\\ ;" -"㬠>shài|\\\ ;" -"㬡>líng|\\\ ;" -"㬭>jiào|\\\ ;" -"㬮>kuài|\\\ ;" -"㬴>hǒng|\\\ ;" -"㬵>xiáo|\\\ ;" -"㭁>réng|\\\ ;" -"㭂>jiǎo|\\\ ;" -"㭇>yuàn|\\\ ;" -"㭋>bàng|\\\ ;" -"㭓>biàn|\\\ ;" -"㭜>róng|\\\ ;" -"㭟>gǒng|\\\ ;" -"㭠>xiǎn|\\\ ;" -"㭤>niǎo|\\\ ;" -"㭫>cuán|\\\ ;" -"㭬>zhuó|\\\ ;" -"㭹>xián|\\\ ;" -"㭻>táng|\\\ ;" -"㮄>bǎng|\\\ ;" -"㮇>tiàn|\\\ ;" -"㮌>mián|\\\ ;" -"㮐>xǐng|\\\ ;" -"㮔>tóng|\\\ ;" -"㮡>guàn|\\\ ;" -"㮭>xián|\\\ ;" -"㮳>zhèn|\\\ ;" -"㮸>sòng|\\\ ;" -"㮾>lǎng|\\\ ;" -"㯀>xiǎn|\\\ ;" -"㯁>bàng|\\\ ;" -"㯆>chǎn|\\\ ;" -"㯋>yǐng|\\\ ;" -"㯐>fǎng|\\\ ;" -"㯘>kuǎn|\\\ ;" -"㯞>juàn|\\\ ;" -"㯠>qiàn|\\\ ;" -"㯢>zhèn|\\\ ;" -"㯪>líng|\\\ ;" -"㯬>liǎn|\\\ ;" -"㯯>gòng|\\\ ;" -"㯱>biǎo|\\\ ;" -"㯳>qíng|\\\ ;" -"㯹>biǎo|\\\ ;" -"㯺>jiàn|\\\ ;" -"㰂>shěn|\\\ ;" -"㰃>mián|\\\ ;" -"㰄>jiàn|\\\ ;" -"㰈>liǎn|\\\ ;" -"㰍>lóng|\\\ ;" -"㰠>kàng|\\\ ;" -"㰮>shèn|\\\ ;" -"㰸>liǎn|\\\ ;" -"㰾>jiào|\\\ ;" -"㱍>luán|\\\ ;" -"㱢>láng|\\\ ;" -"㱥>líng|\\\ ;" -"㱨>liàn|\\\ ;" -"㱭>duàn|\\\ ;" -"㱮>kuài|\\\ ;" -"㱶>bèng|\\\ ;" -"㲀>chén|\\\ ;" -"㲆>líng|\\\ ;" -"㲈>sháo|\\\ ;" -"㲋>chuò|\\\ ;" -"㲌>nèng|\\\ ;" -"㲓>róng|\\\ ;" -"㲝>rǒng|\\\ ;" -"㲟>yǐng|\\\ ;" -"㲢>biàn|\\\ ;" -"㲥>táng|\\\ ;" -"㲨>róng|\\\ ;" -"㲰>níng|\\\ ;" -"㲽>niàn|\\\ ;" -"㲿>wǎng|\\\ ;" -"㳄>xián|\\\ ;" -"㳅>jiǎo|\\\ ;" -"㳎>biàn|\\\ ;" -"㳒>biàn|\\\ ;" -"㳗>chài|\\\ ;" -"㳙>xuàn|\\\ ;" -"㳨>jiǎn|\\\ ;" -"㳬>xuán|\\\ ;" -"㳭>xián|\\\ ;" -"㳮>niào|\\\ ;" -"㳹>wǎng|\\\ ;" -"㴄>yíng|\\\ ;" -"㴏>wǎng|\\\ ;" -"㴐>miàn|\\\ ;" -"㴜>biàn|\\\ ;" -"㴥>qiào|\\\ ;" -"㴦>guàn|\\\ ;" -"㴨>zhèn|\\\ ;" -"㴰>néng|\\\ ;" -"㴳>lǒng|\\\ ;" -"㴴>chén|\\\ ;" -"㴿>dǐng|\\\ ;" -"㵀>cuàn|\\\ ;" -"㵊>shěn|\\\ ;" -"㵌>chàn|\\\ ;" -"㵕>shèn|\\\ ;" -"㵞>chóu|\\\ ;" -"㵤>diàn|\\\ ;" -"㵪>xián|\\\ ;" -"㵬>yíng|\\\ ;" -"㵮>chún|\\\ ;" -"㵯>féng|\\\ ;" -"㵱>piǎo|\\\ ;" -"㵳>liáo|\\\ ;" -"㵴>cáng|\\\ ;" -"㵷>biàn|\\\ ;" -"㵹>huán|\\\ ;" -"㵾>jìng|\\\ ;" -"㶇>héng|\\\ ;" -"㶌>lián|\\\ ;" -"㶍>xiǎn|\\\ ;" -"㶎>huán|\\\ ;" -"㶑>liàn|\\\ ;" -"㶒>shǎn|\\\ ;" -"㶓>cáng|\\\ ;" -"㶕>jiǎn|\\\ ;" -"㶘>diàn|\\\ ;" -"㶞>nǎng|\\\ ;" -"㶣>chán|\\\ ;" -"㶤>chǎo|\\\ ;" -"㶫>liǎo|\\\ ;" -"㶲>yòng|\\\ ;" -"㶶>nóng|\\\ ;" -"㶹>hòng|\\\ ;" -"㶺>tiàn|\\\ ;" -"㷅>chǎo|\\\ ;" -"㷇>guài|\\\ ;" -"㷏>yǒng|\\\ ;" -"㷓>zǒng|\\\ ;" -"㷖>zhào|\\\ ;" -"㷫>qǐng|\\\ ;" -"㷯>bèng|\\\ ;" -"㷷>juǎn|\\\ ;" -"㷹>shào|\\\ ;" -"㸃>diǎn|\\\ ;" -"㸑>cuàn|\\\ ;" -"㸗>tóng|\\\ ;" -"㸛>sháo|\\\ ;" -"㸜>kòng|\\\ ;" -"㸠>tiǎo|\\\ ;" -"㸤>piàn|\\\ ;" -"㸥>chán|\\\ ;" -"㸪>chún|\\\ ;" -"㸫>qián|\\\ ;" -"㸳>líng|\\\ ;" -"㹅>zǒng|\\\ ;" -"㹉>yuán|\\\ ;" -"㹌>chǎn|\\\ ;" -"㹖>huàn|\\\ ;" -"㹙>yíng|\\\ ;" -"㹚>yíng|\\\ ;" -"㹡>xuán|\\\ ;" -"㹲>xiào|\\\ ;" -"㹵>jìng|\\\ ;" -"㹶>tíng|\\\ ;" -"㹽>chǎn|\\\ ;" -"㹾>piǎo|\\\ ;" -"㹿>diǎo|\\\ ;" -"㺊>yàng|\\\ ;" -"㺌>xiàn|\\\ ;" -"㺎>róng|\\\ ;" -"㺐>zhǎo|\\\ ;" -"㺒>liào|\\\ ;" -"㺓>piào|\\\ ;" -"㺘>zhàn|\\\ ;" -"㺝>jiàn|\\\ ;" -"㺟>zhuó|\\\ ;" -"㺥>chán|\\\ ;" -"㺦>lián|\\\ ;" -"㺬>gǒng|\\\ ;" -"㺱>réng|\\\ ;" -"㺸>píng|\\\ ;" -"㺹>biàn|\\\ ;" -"㻂>píng|\\\ ;" -"㻊>máng|\\\ ;" -"㻏>líng|\\\ ;" -"㻞>biàn|\\\ ;" -"㻰>miǎn|\\\ ;" -"㻵>zhàn|\\\ ;" -"㼐>pián|\\\ ;" -"㼑>liàn|\\\ ;" -"㼓>lián|\\\ ;" -"㼗>dǐng|\\\ ;" -"㼙>zhòu|\\\ ;" -"㼛>xíng|\\\ ;" -"㼞>pèng|\\\ ;" -"㼦>gǒng|\\\ ;" -"㼧>tóng|\\\ ;" -"㼫>huàn|\\\ ;" -"㼬>xìng|\\\ ;" -"㼭>diàn|\\\ ;" -"㼯>dòng|\\\ ;" -"㼱>ruǎn|\\\ ;" -"㼸>róng|\\\ ;" -"㼺>táng|\\\ ;" -"㼻>cóng|\\\ ;" -"㼼>piáo|\\\ ;" -"㼿>tóng|\\\ ;" -"㽇>guài|\\\ ;" -"㽘>gǎng|\\\ ;" -"㽪>zěng|\\\ ;" -"㽫>yǒng|\\\ ;" -"㽭>ruǎn|\\\ ;" -"㽱>jiǎo|\\\ ;" -"㽲>jiǎo|\\\ ;" -"㽷>shuì|\\\ ;" -"㽸>chén|\\\ ;" -"㾉>líng|\\\ ;" -"㾌>xuǎn|\\\ ;" -"㾕>shěn|\\\ ;" -"㾗>lǎng|\\\ ;" -"㾘>gěng|\\\ ;" -"㾦>bàng|\\\ ;" -"㾭>zhòu|\\\ ;" -"㾹>chái|\\\ ;" -"㾾>lián|\\\ ;" -"㾿>láng|\\\ ;" -"㿅>xiǎn|\\\ ;" -"㿘>yíng|\\\ ;" -"㿤>chǔn|\\\ ;" -"㿦>nìng|\\\ ;" -"㿧>chóu|\\\ ;" -"㿩>tǎng|\\\ ;" -"㿪>huán|\\\ ;" -"㿮>yàng|\\\ ;" -"䀄>méng|\\\ ;" -"䀉>qiáo|\\\ ;" -"䀊>jiǎo|\\\ ;" -"䀎>miǎn|\\\ ;" -"䀏>xiàn|\\\ ;" -"䀓>huàn|\\\ ;" -"䀡>chàn|\\\ ;" -"䀢>shùn|\\\ ;" -"䀥>shuò|\\\ ;" -"䀧>hǒng|\\\ ;" -"䀨>huàn|\\\ ;" -"䀪>háng|\\\ ;" -"䀬>quán|\\\ ;" -"䀮>máng|\\\ ;" -"䀴>yǐng|\\\ ;" -"䀵>shùn|\\\ ;" -"䀶>lǎng|\\\ ;" -"䁁>lǎng|\\\ ;" -"䁂>xiàn|\\\ ;" -"䁄>xìng|\\\ ;" -"䁐>yìng|\\\ ;" -"䁑>yáng|\\\ ;" -"䁝>yíng|\\\ ;" -"䁠>lián|\\\ ;" -"䁢>xuán|\\\ ;" -"䁧>miáo|\\\ ;" -"䁬>céng|\\\ ;" -"䁮>qián|\\\ ;" -"䁳>mǎng|\\\ ;" -"䁴>zhǎn|\\\ ;" -"䁵>biǎn|\\\ ;" -"䁶>jiǎo|\\\ ;" -"䁸>nóng|\\\ ;" -"䂁>chán|\\\ ;" -"䂃>jiào|\\\ ;" -"䂇>náng|\\\ ;" -"䂈>tóng|\\\ ;" -"䂎>zuǎn|\\\ ;" -"䂐>chuò|\\\ ;" -"䂔>xìng|\\\ ;" -"䂜>bàng|\\\ ;" -"䂢>dǒng|\\\ ;" -"䂦>zhěn|\\\ ;" -"䂧>zhěn|\\\ ;" -"䂪>diào|\\\ ;" -"䂫>hóng|\\\ ;" -"䂬>gǒng|\\\ ;" -"䂯>guài|\\\ ;" -"䂽>diào|\\\ ;" -"䃇>mián|\\\ ;" -"䃍>zhào|\\\ ;" -"䃔>hóng|\\\ ;" -"䃗>chuò|\\\ ;" -"䃛>lián|\\\ ;" -"䃝>qiào|\\\ ;" -"䃧>lóng|\\\ ;" -"䃱>xiàn|\\\ ;" -"䃵>niǎo|\\\ ;" -"䃶>huái|\\\ ;" -"䃷>yíng|\\\ ;" -"䃸>xiàn|\\\ ;" -"䄅>juàn|\\\ ;" -"䄌>zhuì|\\\ ;" -"䄐>quàn|\\\ ;" -"䄓>héng|\\\ ;" -"䄘>péng|\\\ ;" -"䄙>míng|\\\ ;" -"䄝>chǔn|\\\ ;" -"䄠>shàn|\\\ ;" -"䄥>líng|\\\ ;" -"䄦>liǎo|\\\ ;" -"䄧>réng|\\\ ;" -"䄪>chuò|\\\ ;" -"䄭>nián|\\\ ;" -"䄯>jiǎn|\\\ ;" -"䄲>chuí|\\\ ;" -"䄹>nián|\\\ ;" -"䄻>cháo|\\\ ;" -"䄼>tiǎn|\\\ ;" -"䄽>tiǎn|\\\ ;" -"䅈>yuàn|\\\ ;" -"䅍>dòng|\\\ ;" -"䅐>jiǎn|\\\ ;" -"䅒>máng|\\\ ;" -"䅭>páng|\\\ ;" -"䅮>càng|\\\ ;" -"䅯>táng|\\\ ;" -"䅵>zhuó|\\\ ;" -"䅺>miǎo|\\\ ;" -"䆂>lián|\\\ ;" -"䆄>shàn|\\\ ;" -"䆍>lóng|\\\ ;" -"䆖>hóng|\\\ ;" -"䆗>jiào|\\\ ;" -"䆘>cuán|\\\ ;" -"䆚>tóng|\\\ ;" -"䆠>huàn|\\\ ;" -"䆡>láng|\\\ ;" -"䆣>chén|\\\ ;" -"䆦>shèn|\\\ ;" -"䆨>míng|\\\ ;" -"䆩>míng|\\\ ;" -"䆯>chuò|\\\ ;" -"䆹>tǒng|\\\ ;" -"䆻>qiào|\\\ ;" -"䇀>róng|\\\ ;" -"䇇>méng|\\\ ;" -"䇌>qiào|\\\ ;" -"䇍>chuò|\\\ ;" -"䇜>liǎn|\\\ ;" -"䇟>jiàn|\\\ ;" -"䇠>zhòu|\\\ ;" -"䇦>yǎng|\\\ ;" -"䇨>gòng|\\\ ;" -"䇯>róng|\\\ ;" -"䇺>chóu|\\\ ;" -"䈂>bìng|\\\ ;" -"䈃>zhǎo|\\\ ;" -"䈇>zhào|\\\ ;" -"䈊>líng|\\\ ;" -"䈍>máng|\\\ ;" -"䈙>zhòu|\\\ ;" -"䈛>kuài|\\\ ;" -"䈠>huǎn|\\\ ;" -"䈤>qián|\\\ ;" -"䈭>huái|\\\ ;" -"䈴>qiàn|\\\ ;" -"䈶>róng|\\\ ;" -"䈾>shuò|\\\ ;" -"䉁>líng|\\\ ;" -"䉄>léng|\\\ ;" -"䉆>diǎo|\\\ ;" -"䉍>jiǎn|\\\ ;" -"䉎>táng|\\\ ;" -"䉕>céng|\\\ ;" -"䉖>líng|\\\ ;" -"䉘>cóng|\\\ ;" -"䉚>méng|\\\ ;" -"䉥>sǒng|\\\ ;" -"䉯>xiàn|\\\ ;" -"䉳>xiǎn|\\\ ;" -"䉴>ráng|\\\ ;" -"䉸>biàn|\\\ ;" -"䉹>líng|\\\ ;" -"䉺>hóng|\\\ ;" -"䉼>liào|\\\ ;" -"䊅>míng|\\\ ;" -"䊎>quǎn|\\\ ;" -"䊜>tuán|\\\ ;" -"䊥>xiào|\\\ ;" -"䊭>chóu|\\\ ;" -"䊲>chǎn|\\\ ;" -"䊴>qiàn|\\\ ;" -"䊶>zhèn|\\\ ;" -"䊽>guài|\\\ ;" -"䋁>gěng|\\\ ;" -"䋄>wǎng|\\\ ;" -"䋎>zhàn|\\\ ;" -"䋑>bǐng|\\\ ;" -"䋓>zhòu|\\\ ;" -"䋘>chuò|\\\ ;" -"䋜>qìng|\\\ ;" -"䋞>wǎng|\\\ ;" -"䋼>tǐng|\\\ ;" -"䋽>běng|\\\ ;" -"䌃>shuò|\\\ ;" -"䌄>gěng|\\\ ;" -"䌅>táng|\\\ ;" -"䌞>liǎn|\\\ ;" -"䌠>qìng|\\\ ;" -"䌢>líng|\\\ ;" -"䌣>zuǎn|\\\ ;" -"䌧>chóu|\\\ ;" -"䌯>guàn|\\\ ;" -"䌸>juàn|\\\ ;" -"䍄>diǎn|\\\ ;" -"䍅>líng|\\\ ;" -"䍈>píng|\\\ ;" -"䍉>qián|\\\ ;" -"䍋>chuí|\\\ ;" -"䍔>hóng|\\\ ;" -"䍗>xuàn|\\\ ;" -"䍚>làng|\\\ ;" -"䍜>zhào|\\\ ;" -"䍟>zòng|\\\ ;" -"䍡>liào|\\\ ;" -"䍮>zhào|\\\ ;" -"䍳>chuò|\\\ ;" -"䍶>dòng|\\\ ;" -"䍺>huán|\\\ ;" -"䍻>xuǎn|\\\ ;" -"䎄>tiáo|\\\ ;" -"䎆>liào|\\\ ;" -"䎐>chǎo|\\\ ;" -"䎒>zhǎn|\\\ ;" -"䎗>qiáo|\\\ ;" -"䎚>guàn|\\\ ;" -"䎡>nuǎn|\\\ ;" -"䎧>bàng|\\\ ;" -"䎻>zhǒu|\\\ ;" -"䏃>mián|\\\ ;" -"䏇>piào|\\\ ;" -"䏈>lián|\\\ ;" -"䏊>lóng|\\\ ;" -"䏍>yuàn|\\\ ;" -"䏎>féng|\\\ ;" -"䏒>piàn|\\\ ;" -"䏓>guǎn|\\\ ;" -"䏖>zhèn|\\\ ;" -"䏚>chǎo|\\\ ;" -"䏛>chǔn|\\\ ;" -"䏝>chún|\\\ ;" -"䏴>shào|\\\ ;" -"䏵>měng|\\\ ;" -"䏹>xiàn|\\\ ;" -"䏻>néng|\\\ ;" -"䐁>niǎo|\\\ ;" -"䐇>chún|\\\ ;" -"䐌>tiǎn|\\\ ;" -"䐍>zhòu|\\\ ;" -"䐏>chǔn|\\\ ;" -"䐥>wěng|\\\ ;" -"䐮>chǎn|\\\ ;" -"䑃>méng|\\\ ;" -"䑅>méng|\\\ ;" -"䑆>yǎng|\\\ ;" -"䑉>yíng|\\\ ;" -"䑎>chǎn|\\\ ;" -"䑏>quán|\\\ ;" -"䑐>zhěn|\\\ ;" -"䑗>dàng|\\\ ;" -"䑚>tián|\\\ ;" -"䑞>shùn|\\\ ;" -"䑠>liǎo|\\\ ;" -"䒅>téng|\\\ ;" -"䒋>yǎng|\\\ ;" -"䒌>mìng|\\\ ;" -"䒍>pǎng|\\\ ;" -"䒎>mǎng|\\\ ;" -"䒐>méng|\\\ ;" -"䒒>tiáo|\\\ ;" -"䒕>xiǎo|\\\ ;" -"䒚>shǎo|\\\ ;" -"䒛>héng|\\\ ;" -"䒝>xiáo|\\\ ;" -"䒞>chén|\\\ ;" -"䒪>biàn|\\\ ;" -"䒭>děng|\\\ ;" -"䒸>xián|\\\ ;" -"䓎>chuò|\\\ ;" -"䓐>chún|\\\ ;" -"䓑>bǐng|\\\ ;" -"䓒>kuǎi|\\\ ;" -"䓓>chóu|\\\ ;" -"䓝>méng|\\\ ;" -"䓦>diǎn|\\\ ;" -"䓱>chái|\\\ ;" -"䓴>ruán|\\\ ;" -"䓷>xìng|\\\ ;" -"䔏>chòu|\\\ ;" -"䔔>jìng|\\\ ;" -"䔖>líng|\\\ ;" -"䔙>diào|\\\ ;" -"䔚>chún|\\\ ;" -"䔛>qǐng|\\\ ;" -"䔠>shǎo|\\\ ;" -"䔭>nìng|\\\ ;" -"䔸>biǎo|\\\ ;" -"䕀>kuǎn|\\\ ;" -"䕔>xián|\\\ ;" -"䕘>líng|\\\ ;" -"䕞>làng|\\\ ;" -"䕦>yíng|\\\ ;" -"䕧>xiào|\\\ ;" -"䕨>téng|\\\ ;" -"䕭>qián|\\\ ;" -"䕯>piáo|\\\ ;" -"䕴>zhuó|\\\ ;" -"䕺>cóng|\\\ ;" -"䖂>luán|\\\ ;" -"䖅>líng|\\\ ;" -"䖍>qián|\\\ ;" -"䖞>zhǒu|\\\ ;" -"䖟>mǎng|\\\ ;" -"䖠>yuán|\\\ ;" -"䖢>miáo|\\\ ;" -"䖫>bàng|\\\ ;" -"䖭>juàn|\\\ ;" -"䖹>yáng|\\\ ;" -"䖺>tiáo|\\\ ;" -"䗃>zhàn|\\\ ;" -"䗆>guǎn|\\\ ;" -"䗈>méng|\\\ ;" -"䗒>bìng|\\\ ;" -"䗠>xuán|\\\ ;" -"䗤>yóng|\\\ ;" -"䗰>guàn|\\\ ;" -"䗴>tíng|\\\ ;" -"䗾>xiǎn|\\\ ;" -"䗿>níng|\\\ ;" -"䘆>xiǎn|\\\ ;" -"䘍>chài|\\\ ;" -"䘕>háng|\\\ ;" -"䘨>jiǎo|\\\ ;" -"䘩>xuàn|\\\ ;" -"䘬>róng|\\\ ;" -"䘺>zhàn|\\\ ;" -"䘾>guǎn|\\\ ;" -"䙀>běng|\\\ ;" -"䙇>nuǎn|\\\ ;" -"䙚>niǎo|\\\ ;" -"䙛>guàn|\\\ ;" -"䙜>féng|\\\ ;" -"䙢>zèng|\\\ ;" -"䙥>líng|\\\ ;" -"䙦>méng|\\\ ;" -"䙩>méng|\\\ ;" -"䙪>lóng|\\\ ;" -"䙬>yìng|\\\ ;" -"䙮>guàn|\\\ ;" -"䙺>lián|\\\ ;" -"䙼>shào|\\\ ;" -"䚈>juàn|\\\ ;" -"䚏>lèng|\\\ ;" -"䚓>niǎn|\\\ ;" -"䚖>líng|\\\ ;" -"䚘>chén|\\\ ;" -"䚚>xiǎn|\\\ ;" -"䚩>jiǎo|\\\ ;" -"䚮>réng|\\\ ;" -"䚲>shàn|\\\ ;" -"䛃>wàng|\\\ ;" -"䛄>yuǎn|\\\ ;" -"䛆>zhòu|\\\ ;" -"䛇>yuǎn|\\\ ;" -"䛒>biàn|\\\ ;" -"䛦>sòng|\\\ ;" -"䛬>chóu|\\\ ;" -"䛭>xìng|\\\ ;" -"䛳>jiǎn|\\\ ;" -"䛵>shòu|\\\ ;" -"䜌>luán|\\\ ;" -"䜍>liáo|\\\ ;" -"䜘>jǐng|\\\ ;" -"䜛>chán|\\\ ;" -"䜝>tuǎn|\\\ ;" -"䜟>chén|\\\ ;" -"䜢>xiǎn|\\\ ;" -"䜫>hóng|\\\ ;" -"䜬>sǒng|\\\ ;" -"䜮>liáo|\\\ ;" -"䝀>liáo|\\\ ;" -"䝋>zòng|\\\ ;" -"䝖>zhǎo|\\\ ;" -"䝠>huán|\\\ ;" -"䝨>xián|\\\ ;" -"䝩>zhèn|\\\ ;" -"䝮>xuàn|\\\ ;" -"䝺>guàn|\\\ ;" -"䝼>qíng|\\\ ;" -"䞁>xiàn|\\\ ;" -"䞂>ruǎn|\\\ ;" -"䞄>biào|\\\ ;" -"䞋>chèn|\\\ ;" -"䞍>qíng|\\\ ;" -"䞐>chǔn|\\\ ;" -"䞑>hóng|\\\ ;" -"䞒>dòng|\\\ ;" -"䞻>yǒng|\\\ ;" -"䞼>chuǐ|\\\ ;" -"䟅>jiàn|\\\ ;" -"䟋>zhǎn|\\\ ;" -"䟍>dián|\\\ ;" -"䟒>quán|\\\ ;" -"䟖>tàng|\\\ ;" -"䟘>hàng|\\\ ;" -"䟢>chén|\\\ ;" -"䟥>máng|\\\ ;" -"䟧>tián|\\\ ;" -"䟪>fěng|\\\ ;" -"䟭>tiáo|\\\ ;" -"䟰>jiǎn|\\\ ;" -"䟴>zhèn|\\\ ;" -"䟺>bǎng|\\\ ;" -"䠄>tiǎn|\\\ ;" -"䠛>jiǎo|\\\ ;" -"䠜>róng|\\\ ;" -"䠢>mèng|\\\ ;" -"䠣>xuǎn|\\\ ;" -"䠨>chàn|\\\ ;" -"䠪>duàn|\\\ ;" -"䠬>dèng|\\\ ;" -"䠮>téng|\\\ ;" -"䠰>quán|\\\ ;" -"䠲>líng|\\\ ;" -"䠷>tiǎo|\\\ ;" -"䠼>diào|\\\ ;" -"䠾>shǎn|\\\ ;" -"䡀>zhǎn|\\\ ;" -"䡁>lǒng|\\\ ;" -"䡆>róng|\\\ ;" -"䡉>kǎng|\\\ ;" -"䡌>hóng|\\\ ;" -"䡏>hóng|\\\ ;" -"䡒>tián|\\\ ;" -"䡓>juàn|\\\ ;" -"䡖>jìng|\\\ ;" -"䡗>gǒng|\\\ ;" -"䡘>tián|\\\ ;" -"䡙>láng|\\\ ;" -"䡢>biàn|\\\ ;" -"䡥>róng|\\\ ;" -"䡦>sǎng|\\\ ;" -"䡪>chán|\\\ ;" -"䡫>péng|\\\ ;" -"䡰>kěng|\\\ ;" -"䡲>chán|\\\ ;" -"䡼>líng|\\\ ;" -"䡿>líng|\\\ ;" -"䢅>chén|\\\ ;" -"䢇>rǒng|\\\ ;" -"䢈>chén|\\\ ;" -"䢉>nóng|\\\ ;" -"䢍>fǎng|\\\ ;" -"䢚>gòng|\\\ ;" -"䢠>sòng|\\\ ;" -"䢢>càng|\\\ ;" -"䢧>liào|\\\ ;" -"䢻>chén|\\\ ;" -"䢾>xiǎn|\\\ ;" -"䣅>chén|\\\ ;" -"䣆>xíng|\\\ ;" -"䣈>hàng|\\\ ;" -"䣊>dǎng|\\\ ;" -"䣑>chán|\\\ ;" -"䣘>táng|\\\ ;" -"䣣>dǎng|\\\ ;" -"䣤>jiào|\\\ ;" -"䣨>chún|\\\ ;" -"䣩>chún|\\\ ;" -"䤄>miǎn|\\\ ;" -"䤊>róng|\\\ ;" -"䤑>wàng|\\\ ;" -"䤓>méng|\\\ ;" -"䤔>jiàn|\\\ ;" -"䤘>chǎn|\\\ ;" -"䤝>yìng|\\\ ;" -"䤟>chén|\\\ ;" -"䤫>chán|\\\ ;" -"䤭>kuàn|\\\ ;" -"䤯>xíng|\\\ ;" -"䤰>wěng|\\\ ;" -"䤸>zuàn|\\\ ;" -"䤼>xiàn|\\\ ;" -"䥀>chǎn|\\\ ;" -"䥂>mèng|\\\ ;" -"䥅>qiàn|\\\ ;" -"䥇>shàn|\\\ ;" -"䥎>chún|\\\ ;" -"䥒>chóu|\\\ ;" -"䥖>tián|\\\ ;" -"䥗>kuǎn|\\\ ;" -"䥜>jiàn|\\\ ;" -"䥞>jiǎo|\\\ ;" -"䥢>lóng|\\\ ;" -"䥥>lián|\\\ ;" -"䥧>huán|\\\ ;" -"䥪>xiǎn|\\\ ;" -"䥰>mèng|\\\ ;" -"䥵>xiǎo|\\\ ;" -"䦂>shàn|\\\ ;" -"䦅>shàn|\\\ ;" -"䦈>fǎng|\\\ ;" -"䦊>niǎo|\\\ ;" -"䦎>guǎn|\\\ ;" -"䦐>tǐng|\\\ ;" -"䦒>dàng|\\\ ;" -"䦡>huán|\\\ ;" -"䦥>xián|\\\ ;" -"䦮>chǔn|\\\ ;" -"䦲>qiàn|\\\ ;" -"䦳>hàng|\\\ ;" -"䧃>diàn|\\\ ;" -"䧆>hóng|\\\ ;" -"䧋>xiǎn|\\\ ;" -"䧎>xuàn|\\\ ;" -"䧖>jiàn|\\\ ;" -"䧙>líng|\\\ ;" -"䧛>bàng|\\\ ;" -"䧜>táng|\\\ ;" -"䧟>xiàn|\\\ ;" -"䧮>xiǎn|\\\ ;" -"䧯>chán|\\\ ;" -"䨅>liáo|\\\ ;" -"䨍>yǐng|\\\ ;" -"䨎>hóng|\\\ ;" -"䨘>xiàn|\\\ ;" -"䨦>páng|\\\ ;" -"䨩>líng|\\\ ;" -"䨬>lián|\\\ ;" -"䨯>zhèn|\\\ ;" -"䨷>xiàn|\\\ ;" -"䨻>bèng|\\\ ;" -"䨿>qián|\\\ ;" -"䩄>tiǎn|\\\ ;" -"䩅>zhǎn|\\\ ;" -"䩆>jiǎn|\\\ ;" -"䩌>qiáo|\\\ ;" -"䩍>liǎo|\\\ ;" -"䩑>hóng|\\\ ;" -"䩙>xuàn|\\\ ;" -"䩜>zhòu|\\\ ;" -"䩞>nián|\\\ ;" -"䩦>tiáo|\\\ ;" -"䩩>yuǎn|\\\ ;" -"䩪>guǎn|\\\ ;" -"䩬>běng|\\\ ;" -"䩰>xuàn|\\\ ;" -"䩶>chǎn|\\\ ;" -"䩸>róng|\\\ ;" -"䩼>féng|\\\ ;" -"䪀>guǎn|\\\ ;" -"䪈>qiǎn|\\\ ;" -"䪊>lóng|\\\ ;" -"䪌>zhàn|\\\ ;" -"䪒>jiào|\\\ ;" -"䪜>chàn|\\\ ;" -"䪦>hóng|\\\ ;" -"䪭>ruǎn|\\\ ;" -"䪮>chǒu|\\\ ;" -"䪯>yíng|\\\ ;" -"䪴>zhěn|\\\ ;" -"䪻>biàn|\\\ ;" -"䫃>chún|\\\ ;" -"䫖>chěn|\\\ ;" -"䫙>sǎng|\\\ ;" -"䫡>qiàn|\\\ ;" -"䫤>míng|\\\ ;" -"䫬>zhěn|\\\ ;" -"䫵>mián|\\\ ;" -"䫹>hóng|\\\ ;" -"䫺>hóng|\\\ ;" -"䬇>yuàn|\\\ ;" -"䬋>léng|\\\ ;" -"䬖>héng|\\\ ;" -"䬗>yáng|\\\ ;" -"䬝>héng|\\\ ;" -"䬤>cháo|\\\ ;" -"䬧>yuán|\\\ ;" -"䬬>yǎng|\\\ ;" -"䬯>nián|\\\ ;" -"䬰>shào|\\\ ;" -"䬺>yàng|\\\ ;" -"䬻>jiàn|\\\ ;" -"䬼>yuàn|\\\ ;" -"䭈>jiàn|\\\ ;" -"䭊>yǐng|\\\ ;" -"䭐>yàng|\\\ ;" -"䭑>lián|\\\ ;" -"䭕>jiàn|\\\ ;" -"䭗>yǐng|\\\ ;" -"䭝>kuài|\\\ ;" -"䭠>jiǎn|\\\ ;" -"䭢>níng|\\\ ;" -"䭤>qiǎn|\\\ ;" -"䭨>shuì|\\\ ;" -"䭭>shǒu|\\\ ;" -"䭰>běng|\\\ ;" -"䭴>huán|\\\ ;" -"䮁>pián|\\\ ;" -"䮄>xuán|\\\ ;" -"䮍>niǎo|\\\ ;" -"䮓>zhào|\\\ ;" -"䮕>chuò|\\\ ;" -"䮚>lèng|\\\ ;" -"䮝>huán|\\\ ;" -"䮴>dèng|\\\ ;" -"䮵>tóng|\\\ ;" -"䮾>páng|\\\ ;" -"䮿>jiǎn|\\\ ;" -"䯍>líng|\\\ ;" -"䯒>héng|\\\ ;" -"䯖>láng|\\\ ;" -"䯘>huàn|\\\ ;" -"䯛>jiǎn|\\\ ;" -"䯡>jiǎn|\\\ ;" -"䯤>kuài|\\\ ;" -"䯧>qǐng|\\\ ;" -"䯾>tiáo|\\\ ;" -"䰃>péng|\\\ ;" -"䰌>zǒng|\\\ ;" -"䰒>méng|\\\ ;" -"䰓>mián|\\\ ;" -"䰖>cuán|\\\ ;" -"䰝>zèng|\\\ ;" -"䰠>shén|\\\ ;" -"䰢>xìng|\\\ ;" -"䰣>wǎng|\\\ ;" -"䰫>cháo|\\\ ;" -"䰱>líng|\\\ ;" -"䰷>bàng|\\\ ;" -"䱁>qiáo|\\\ ;" -"䱇>shàn|\\\ ;" -"䱉>shàn|\\\ ;" -"䱍>gèng|\\\ ;" -"䱎>gèng|\\\ ;" -"䱓>tíng|\\\ ;" -"䱔>tiáo|\\\ ;" -"䱠>zhàn|\\\ ;" -"䱤>xiàn|\\\ ;" -"䱭>gèng|\\\ ;" -"䱴>gèng|\\\ ;" -"䱶>láng|\\\ ;" -"䱼>zhǎn|\\\ ;" -"䱿>chàn|\\\ ;" -"䲂>xuán|\\\ ;" -"䲌>kuǎn|\\\ ;" -"䲍>téng|\\\ ;" -"䲔>qíng|\\\ ;" -"䲖>chóu|\\\ ;" -"䲗>xián|\\\ ;" -"䲘>guǎn|\\\ ;" -"䲛>méng|\\\ ;" -"䲢>téng|\\\ ;" -"䲨>hóng|\\\ ;" -"䲮>yuán|\\\ ;" -"䲱>fǎng|\\\ ;" -"䲳>háng|\\\ ;" -"䲴>zhèn|\\\ ;" -"䲻>xuán|\\\ ;" -"䲾>qiǎo|\\\ ;" -"䳂>tiáo|\\\ ;" -"䳋>tóng|\\\ ;" -"䳒>yuán|\\\ ;" -"䳙>xǐng|\\\ ;" -"䳞>běng|\\\ ;" -"䳠>chuí|\\\ ;" -"䳣>yuán|\\\ ;" -"䳪>juàn|\\\ ;" -"䳲>zhèn|\\\ ;" -"䳷>cóng|\\\ ;" -"䴀>tóng|\\\ ;" -"䴂>hàng|\\\ ;" -"䴇>líng|\\\ ;" -"䴉>xuán|\\\ ;" -"䴋>xuán|\\\ ;" -"䴌>méng|\\\ ;" -"䴒>líng|\\\ ;" -"䴚>gǎng|\\\ ;" -"䴛>jiǎo|\\\ ;" -"䴜>huái|\\\ ;" -"䴟>huán|\\\ ;" -"䴩>piáo|\\\ ;" -"䴫>líng|\\\ ;" -"䴮>shàn|\\\ ;" -"䴵>bǐng|\\\ ;" -"䴶>péng|\\\ ;" -"䴼>chǎn|\\\ ;" -"䴿>méng|\\\ ;" -"䵆>méng|\\\ ;" -"䵇>xiàn|\\\ ;" -"䵐>chǎn|\\\ ;" -"䵔>dǒng|\\\ ;" -"䵖>jiàn|\\\ ;" -"䵛>jiàn|\\\ ;" -"䵜>nǒng|\\\ ;" -"䵞>jìng|\\\ ;" -"䵡>jiǎn|\\\ ;" -"䵤>jiǎn|\\\ ;" -"䵨>máng|\\\ ;" -"䵮>yàng|\\\ ;" -"䵯>tuǎn|\\\ ;" -"䵲>diào|\\\ ;" -"䵺>tǐng|\\\ ;" -"䶂>zhuó|\\\ ;" -"䶄>píng|\\\ ;" -"䶇>zhòu|\\\ ;" -"䶐>kuài|\\\ ;" -"䶟>xiàn|\\\ ;" -"䶠>jiǎn|\\\ ;" -"䶢>xián|\\\ ;" -"䶱>tóng|\\\ ;" -"丏>miǎn|\\\ ;" -"丒>chǒu|\\\ ;" -"並>bìng|\\\ ;" -"丮>guàn|\\\ ;" -"丱>guàn|\\\ ;" -"丳>chǎn|\\\ ;" -"丼>jǐng|\\\ ;" -"乪>nāng|\\\ ;" -"亂>luàn|\\\ ;" -"亐>gèng|\\\ ;" -"亣>pēng|\\\ ;" -"亰>jīng|\\\ ;" -"亷>lián|\\\ ;" -"亾>wáng|\\\ ;" -"仌>bīng|\\\ ;" -"仚>xiān|\\\ ;" -"仜>hóng|\\\ ;" -"仦>chào|\\\ ;" -"仹>fēng|\\\ ;" -"仺>cāng|\\\ ;" -"伄>diào|\\\ ;" -"伖>tǎng|\\\ ;" -"伣>xiàn|\\\ ;" -"伭>xuán|\\\ ;" -"伷>zhòu|\\\ ;" -"伻>bēng|\\\ ;" -"佋>shào|\\\ ;" -"佒>yāng|\\\ ;" -"佔>zhàn|\\\ ;" -"佡>xuān|\\\ ;" -"佲>míng|\\\ ;" -"併>bìng|\\\ ;" -"佺>quán|\\\ ;" -"侀>xíng|\\\ ;" -"侁>shēn|\\\ ;" -"侜>zhōu|\\\ ;" -"侟>jiàn|\\\ ;" -"侫>nìng|\\\ ;" -"侲>zhèn|\\\ ;" -"侴>chǒu|\\\ ;" -"侹>tǐng|\\\ ;" -"侺>shèn|\\\ ;" -"俍>láng|\\\ ;" -"俓>jìng|\\\ ;" -"俔>xiàn|\\\ ;" -"俛>miǎn|\\\ ;" -"俲>xiào|\\\ ;" -"俴>jiàn|\\\ ;" -"俵>biǎo|\\\ ;" -"俿>jiàn|\\\ ;" -"倂>bìng|\\\ ;" -"倉>cāng|\\\ ;" -"倊>zòng|\\\ ;" -"倎>tiān|\\\ ;" -"倕>chuí|\\\ ;" -"倖>xìng|\\\ ;" -"倗>péng|\\\ ;" -"倞>jìng|\\\ ;" -"倣>fǎng|\\\ ;" -"倧>zōng|\\\ ;" -"倯>sōng|\\\ ;" -"倰>léng|\\\ ;" -"倲>dōng|\\\ ;" -"倹>jiǎn|\\\ ;" -"偀>yīng|\\\ ;" -"偂>jiān|\\\ ;" -"偄>nuàn|\\\ ;" -"偆>chǔn|\\\ ;" -"偋>bǐng|\\\ ;" -"偑>fēng|\\\ ;" -"偒>tǎng|\\\ ;" -"偡>zhàn|\\\ ;" -"偢>chǒu|\\\ ;" -"偭>miǎn|\\\ ;" -"偳>duān|\\\ ;" -"偵>zhēn|\\\ ;" -"傆>yuàn|\\\ ;" -"傇>rǒng|\\\ ;" -"傎>diān|\\\ ;" -"傏>táng|\\\ ;" -"傓>shàn|\\\ ;" -"傔>qiàn|\\\ ;" -"傖>cāng|\\\ ;" -"傚>xiào|\\\ ;" -"傛>yǒng|\\\ ;" -"傟>yǎng|\\\ ;" -"傡>bìng|\\\ ;" -"傭>yōng|\\\ ;" -"傯>zǒng|\\\ ;" -"傰>péng|\\\ ;" -"傱>sǒng|\\\ ;" -"債>zhài|\\\ ;" -"傹>jìng|\\\ ;" -"傾>qīng|\\\ ;" -"僄>piào|\\\ ;" -"僆>lián|\\\ ;" -"僉>qiān|\\\ ;" -"僊>xiān|\\\ ;" -"僌>yíng|\\\ ;" -"働>dòng|\\\ ;" -"僐>shàn|\\\ ;" -"僑>qiáo|\\\ ;" -"僜>dèng|\\\ ;" -"僝>chán|\\\ ;" -"僣>jiàn|\\\ ;" -"僥>jiǎo|\\\ ;" -"僩>xiàn|\\\ ;" -"僬>jiāo|\\\ ;" -"僴>xiàn|\\\ ;" -"僺>qiào|\\\ ;" -"僼>fēng|\\\ ;" -"僽>zhòu|\\\ ;" -"儂>nóng|\\\ ;" -"儃>chán|\\\ ;" -"儅>dāng|\\\ ;" -"儈>kuài|\\\ ;" -"儉>jiǎn|\\\ ;" -"儌>jiǎo|\\\ ;" -"儔>chóu|\\\ ;" -"儕>chái|\\\ ;" -"儙>qiàn|\\\ ;" -"儚>méng|\\\ ;" -"儜>níng|\\\ ;" -"儦>biāo|\\\ ;" -"儬>chèn|\\\ ;" -"儭>chèn|\\\ ;" -"儯>téng|\\\ ;" -"儱>lǒng|\\\ ;" -"儳>chàn|\\\ ;" -"儴>ráng|\\\ ;" -"儻>tǎng|\\\ ;" -"儾>nàng|\\\ ;" -"兛>qiān|\\\ ;" -"兟>shēn|\\\ ;" -"兦>wáng|\\\ ;" -"兲>tiān|\\\ ;" -"冁>chǎn|\\\ ;" -"円>yuān|\\\ ;" -"冑>zhòu|\\\ ;" -"冡>méng|\\\ ;" -"冫>bīng|\\\ ;" -"冮>gāng|\\\ ;" -"冿>jiān|\\\ ;" -"凈>jìng|\\\ ;" -"凊>qíng|\\\ ;" -"凍>dòng|\\\ ;" -"凔>cāng|\\\ ;" -"凕>mǐng|\\\ ;" -"凖>zhǔn|\\\ ;" -"凨>fēng|\\\ ;" -"凬>fēng|\\\ ;" -"凮>fēng|\\\ ;" -"凴>píng|\\\ ;" -"凷>kuài|\\\ ;" -"凼>dàng|\\\ ;" -"刋>qiàn|\\\ ;" -"刢>líng|\\\ ;" -"刪>shān|\\\ ;" -"刬>chǎn|\\\ ;" -"剄>jǐng|\\\ ;" -"剈>yuān|\\\ ;" -"剗>chǎn|\\\ ;" -"剛>gāng|\\\ ;" -"剠>qíng|\\\ ;" -"剢>zhuó|\\\ ;" -"剣>jiàn|\\\ ;" -"剬>duān|\\\ ;" -"剱>jiàn|\\\ ;" -"剶>juān|\\\ ;" -"剷>chǎn|\\\ ;" -"剸>tuán|\\\ ;" -"剹>chāo|\\\ ;" -"剼>shān|\\\ ;" -"劆>lián|\\\ ;" -"劋>jiǎo|\\\ ;" -"劍>jiàn|\\\ ;" -"劎>jiàn|\\\ ;" -"劏>tāng|\\\ ;" -"劒>jiàn|\\\ ;" -"劔>jiàn|\\\ ;" -"劖>chán|\\\ ;" -"劗>cuán|\\\ ;" -"劥>kēng|\\\ ;" -"劰>miǎo|\\\ ;" -"劵>juàn|\\\ ;" -"劷>yáng|\\\ ;" -"効>xiào|\\\ ;" -"勆>láng|\\\ ;" -"勈>yǒng|\\\ ;" -"勌>juàn|\\\ ;" -"勍>qíng|\\\ ;" -"勔>miǎn|\\\ ;" -"動>dòng|\\\ ;" -"勜>wěng|\\\ ;" -"勡>piào|\\\ ;" -"勦>chāo|\\\ ;" -"勧>quàn|\\\ ;" -"勨>yǎng|\\\ ;" -"勬>juàn|\\\ ;" -"勭>tóng|\\\ ;" -"勷>ráng|\\\ ;" -"勸>quàn|\\\ ;" -"匉>pēng|\\\ ;" -"匑>gōng|\\\ ;" -"匚>fāng|\\\ ;" -"匟>kàng|\\\ ;" -"匥>biàn|\\\ ;" -"匨>zāng|\\\ ;" -"匲>lián|\\\ ;" -"匳>lián|\\\ ;" -"匴>suǎn|\\\ ;" -"卄>niàn|\\\ ;" -"卲>shào|\\\ ;" -"厐>páng|\\\ ;" -"厖>páng|\\\ ;" -"厛>tīng|\\\ ;" -"厡>yuán|\\\ ;" -"厵>yuán|\\\ ;" -"厷>gōng|\\\ ;" -"収>shōu|\\\ ;" -"叏>guài|\\\ ;" -"叕>zhuó|\\\ ;" -"叢>cóng|\\\ ;" -"叿>hōng|\\\ ;" -"吂>máng|\\\ ;" -"吅>xuān|\\\ ;" -"吜>chǒu|\\\ ;" -"吰>hóng|\\\ ;" -"吷>chuī|\\\ ;" -"吽>hōng|\\\ ;" -"呌>jiào|\\\ ;" -"呍>hōng|\\\ ;" -"呟>quǎn|\\\ ;" -"呪>zhòu|\\\ ;" -"呯>píng|\\\ ;" -"呺>xiāo|\\\ ;" -"咉>yāng|\\\ ;" -"咞>xiàn|\\\ ;" -"咮>zhòu|\\\ ;" -"咲>xiào|\\\ ;" -"咶>huài|\\\ ;" -"咺>xuǎn|\\\ ;" -"哃>tóng|\\\ ;" -"員>yuán|\\\ ;" -"哢>lòng|\\\ ;" -"哤>máng|\\\ ;" -"哯>xiàn|\\\ ;" -"哾>shuō|\\\ ;" -"唌>xián|\\\ ;" -"唍>huǎn|\\\ ;" -"唕>gòng|\\\ ;" -"唝>hǒng|\\\ ;" -"唸>niàn|\\\ ;" -"唺>tiǎn|\\\ ;" -"啅>zhuó|\\\ ;" -"啈>hèng|\\\ ;" -"啋>xiāo|\\\ ;" -"啣>xián|\\\ ;" -"啨>qīng|\\\ ;" -"啳>quán|\\\ ;" -"啴>chǎn|\\\ ;" -"啺>táng|\\\ ;" -"喌>zhōu|\\\ ;" -"喍>chái|\\\ ;" -"喕>miǎn|\\\ ;" -"喚>huàn|\\\ ;" -"喛>huàn|\\\ ;" -"喪>sāng|\\\ ;" -"喬>qiáo|\\\ ;" -"営>yíng|\\\ ;" -"嗈>yōng|\\\ ;" -"嗊>hǒng|\\\ ;" -"嗙>pǎng|\\\ ;" -"嗛>xián|\\\ ;" -"嗹>lián|\\\ ;" -"嘂>jiào|\\\ ;" -"嘄>jiāo|\\\ ;" -"嘋>xiāo|\\\ ;" -"嘐>xiāo|\\\ ;" -"嘕>xiān|\\\ ;" -"嘡>tāng|\\\ ;" -"嘦>jiào|\\\ ;" -"嘨>xiào|\\\ ;" -"嘯>xiào|\\\ ;" -"嘵>xiāo|\\\ ;" -"嘺>qiáo|\\\ ;" -"噒>lián|\\\ ;" -"噟>yìng|\\\ ;" -"噣>zhuó|\\\ ;" -"噥>nóng|\\\ ;" -"噭>jiào|\\\ ;" -"噮>yuān|\\\ ;" -"噰>yōng|\\\ ;" -"噲>kuài|\\\ ;" -"噹>dāng|\\\ ;" -"嚀>níng|\\\ ;" -"嚋>chóu|\\\ ;" -"嚢>náng|\\\ ;" -"嚨>lóng|\\\ ;" -"嚪>rāng|\\\ ;" -"嚫>chèn|\\\ ;" -"嚵>chán|\\\ ;" -"嚶>yīng|\\\ ;" -"嚸>diǎn|\\\ ;" -"嚻>xiāo|\\\ ;" -"嚽>chuò|\\\ ;" -"嚾>huān|\\\ ;" -"囂>xiāo|\\\ ;" -"囅>chǎn|\\\ ;" -"囆>chài|\\\ ;" -"囏>jiān|\\\ ;" -"団>tuán|\\\ ;" -"囥>kàng|\\\ ;" -"囦>yuān|\\\ ;" -"囨>piān|\\\ ;" -"囪>cōng|\\\ ;" -"囲>tōng|\\\ ;" -"図>juàn|\\\ ;" -"圊>qīng|\\\ ;" -"圌>chuí|\\\ ;" -"圎>yuán|\\\ ;" -"圏>quān|\\\ ;" -"園>yuán|\\\ ;" -"圓>yuán|\\\ ;" -"團>tuán|\\\ ;" -"圝>luán|\\\ ;" -"圞>luán|\\\ ;" -"圢>tīng|\\\ ;" -"圲>qiān|\\\ ;" -"圴>zhuó|\\\ ;" -"圵>dàng|\\\ ;" -"坈>fáng|\\\ ;" -"坓>xíng|\\\ ;" -"坕>jīng|\\\ ;" -"坙>jīng|\\\ ;" -"坫>diàn|\\\ ;" -"坱>yāng|\\\ ;" -"坽>líng|\\\ ;" -"垗>zhào|\\\ ;" -"垟>yáng|\\\ ;" -"垨>shǒu|\\\ ;" -"垬>hóng|\\\ ;" -"垱>dàng|\\\ ;" -"垶>xīng|\\\ ;" -"垷>xiàn|\\\ ;" -"垹>bāng|\\\ ;" -"埀>chuí|\\\ ;" -"埄>péng|\\\ ;" -"埅>fáng|\\\ ;" -"埇>yǒng|\\\ ;" -"埌>làng|\\\ ;" -"埍>xuàn|\\\ ;" -"埢>juǎn|\\\ ;" -"埪>kōng|\\\ ;" -"埬>dōng|\\\ ;" -"埲>běng|\\\ ;" -"埻>zhǔn|\\\ ;" -"堅>jiān|\\\ ;" -"堈>gāng|\\\ ;" -"堋>péng|\\\ ;" -"堎>líng|\\\ ;" -"堜>liàn|\\\ ;" -"堧>ruán|\\\ ;" -"堫>zōng|\\\ ;" -"堸>féng|\\\ ;" -"堻>zhēn|\\\ ;" -"堼>fēng|\\\ ;" -"堽>gāng|\\\ ;" -"堿>jiǎn|\\\ ;" -"塅>duàn|\\\ ;" -"塇>xuān|\\\ ;" -"塊>kuài|\\\ ;" -"塋>yíng|\\\ ;" -"塎>yǒng|\\\ ;" -"塕>wěng|\\\ ;" -"塜>péng|\\\ ;" -"塝>bàng|\\\ ;" -"塟>zàng|\\\ ;" -"塡>tián|\\\ ;" -"塦>zhèn|\\\ ;" -"塨>gōng|\\\ ;" -"塱>lǎng|\\\ ;" -"塳>péng|\\\ ;" -"塴>bèng|\\\ ;" -"塵>chén|\\\ ;" -"塹>qiàn|\\\ ;" -"墂>biāo|\\\ ;" -"墊>diàn|\\\ ;" -"墋>chěn|\\\ ;" -"増>zēng|\\\ ;" -"墜>zhuì|\\\ ;" -"墝>qiāo|\\\ ;" -"墠>shàn|\\\ ;" -"墡>shàn|\\\ ;" -"墥>dǒng|\\\ ;" -"墱>dèng|\\\ ;" -"墽>qiāo|\\\ ;" -"壂>diàn|\\\ ;" -"壆>xuān|\\\ ;" -"壊>huài|\\\ ;" -"壋>dàng|\\\ ;" -"壌>rǎng|\\\ ;" -"壍>qiàn|\\\ ;" -"壖>ruán|\\\ ;" -"壞>huài|\\\ ;" -"壟>lǒng|\\\ ;" -"壠>lǒng|\\\ ;" -"壽>shòu|\\\ ;" -"壾>mǎng|\\\ ;" -"夀>shòu|\\\ ;" -"夆>fēng|\\\ ;" -"変>biàn|\\\ ;" -"夌>líng|\\\ ;" -"夗>yuàn|\\\ ;" -"夝>qíng|\\\ ;" -"夢>mèng|\\\ ;" -"夦>chèn|\\\ ;" -"夬>guài|\\\ ;" -"奆>quǎn|\\\ ;" -"奌>diǎn|\\\ ;" -"奐>huàn|\\\ ;" -"奝>diāo|\\\ ;" -"奟>kēng|\\\ ;" -"奣>wěng|\\\ ;" -"奩>lián|\\\ ;" -"奱>lián|\\\ ;" -"奵>dīng|\\\ ;" -"奷>qiān|\\\ ;" -"奾>xiān|\\\ ;" -"妅>hóng|\\\ ;" -"妌>jìng|\\\ ;" -"妔>kēng|\\\ ;" -"妦>fēng|\\\ ;" -"妧>yuán|\\\ ;" -"妱>zhāo|\\\ ;" -"妶>xuán|\\\ ;" -"妽>shēn|\\\ ;" -"姈>líng|\\\ ;" -"姍>shān|\\\ ;" -"姎>yāng|\\\ ;" -"姕>jiǎo|\\\ ;" -"姛>tǒng|\\\ ;" -"姢>juān|\\\ ;" -"姦>jiān|\\\ ;" -"姧>jiān|\\\ ;" -"姩>niàn|\\\ ;" -"姭>xiàn|\\\ ;" -"姮>héng|\\\ ;" -"姳>mǐng|\\\ ;" -"姺>shēn|\\\ ;" -"姾>quān|\\\ ;" -"娀>sōng|\\\ ;" -"娂>hóng|\\\ ;" -"娊>xiàn|\\\ ;" -"娋>shào|\\\ ;" -"娎>xiào|\\\ ;" -"娏>máng|\\\ ;" -"娖>chuò|\\\ ;" -"娗>dìng|\\\ ;" -"娙>xíng|\\\ ;" -"娷>shuì|\\\ ;" -"娹>xián|\\\ ;" -"娺>zhuī|\\\ ;" -"娻>dōng|\\\ ;" -"婂>mián|\\\ ;" -"婃>cóng|\\\ ;" -"婈>díng|\\\ ;" -"婋>xiāo|\\\ ;" -"婑>juàn|\\\ ;" -"婖>tiān|\\\ ;" -"婘>quán|\\\ ;" -"婙>jìng|\\\ ;" -"婛>jīng|\\\ ;" -"婜>qiān|\\\ ;" -"婝>diàn|\\\ ;" -"婞>xìng|\\\ ;" -"婡>chuò|\\\ ;" -"婤>chōu|\\\ ;" -"婥>chuò|\\\ ;" -"婰>diǎn|\\\ ;" -"婱>xián|\\\ ;" -"婸>dàng|\\\ ;" -"媆>ruǎn|\\\ ;" -"媊>qián|\\\ ;" -"媋>chūn|\\\ ;" -"媏>duān|\\\ ;" -"媔>mián|\\\ ;" -"媖>yīng|\\\ ;" -"媗>xuān|\\\ ;" -"媜>zhēn|\\\ ;" -"媡>liàn|\\\ ;" -"媥>piān|\\\ ;" -"媴>yuán|\\\ ;" -"媶>róng|\\\ ;" -"嫃>zhēn|\\\ ;" -"嫄>yuán|\\\ ;" -"嫆>yóng|\\\ ;" -"嫇>míng|\\\ ;" -"嫈>yīng|\\\ ;" -"嫋>niǎo|\\\ ;" -"嫎>páng|\\\ ;" -"嫏>láng|\\\ ;" -"嫙>xuán|\\\ ;" -"嫝>kāng|\\\ ;" -"嫞>yóng|\\\ ;" -"嫶>jiáo|\\\ ;" -"嫸>zhǎn|\\\ ;" -"嫺>xián|\\\ ;" -"嫻>xián|\\\ ;" -"嫽>liáo|\\\ ;" -"嫾>lián|\\\ ;" -"嬁>dēng|\\\ ;" -"嬋>chán|\\\ ;" -"嬌>jiāo|\\\ ;" -"嬐>xiān|\\\ ;" -"嬓>jiào|\\\ ;" -"嬚>liǎn|\\\ ;" -"嬛>huán|\\\ ;" -"嬝>niǎo|\\\ ;" -"嬞>dǒng|\\\ ;" -"嬣>néng|\\\ ;" -"嬥>tiǎo|\\\ ;" -"嬦>chóu|\\\ ;" -"嬫>yōng|\\\ ;" -"嬯>niǎo|\\\ ;" -"嬰>yīng|\\\ ;" -"嬵>mián|\\\ ;" -"嬸>shěn|\\\ ;" -"嬹>xìng|\\\ ;" -"嬽>yuān|\\\ ;" -"孁>líng|\\\ ;" -"孂>jiǎo|\\\ ;" -"孅>xiān|\\\ ;" -"孆>yīng|\\\ ;" -"孉>quán|\\\ ;" -"孌>luán|\\\ ;" -"孮>cóng|\\\ ;" -"孯>qiān|\\\ ;" -"孾>yīng|\\\ ;" -"孿>luán|\\\ ;" -"宑>jǐng|\\\ ;" -"宒>zhūn|\\\ ;" -"宔>yuān|\\\ ;" -"宖>hóng|\\\ ;" -"宨>tiǎo|\\\ ;" -"宮>gōng|\\\ ;" -"宯>xiāo|\\\ ;" -"寃>yuān|\\\ ;" -"寈>qīng|\\\ ;" -"寊>zhēn|\\\ ;" -"寋>jiǎn|\\\ ;" -"寍>níng|\\\ ;" -"寎>bìng|\\\ ;" -"寏>huán|\\\ ;" -"寕>níng|\\\ ;" -"寗>níng|\\\ ;" -"寛>kuān|\\\ ;" -"寜>níng|\\\ ;" -"寧>níng|\\\ ;" -"審>shěn|\\\ ;" -"寬>kuān|\\\ ;" -"寷>fēng|\\\ ;" -"尞>liào|\\\ ;" -"尟>xiǎn|\\\ ;" -"尠>xiǎn|\\\ ;" -"尣>méng|\\\ ;" -"尦>liào|\\\ ;" -"尨>máng|\\\ ;" -"尪>wāng|\\\ ;" -"尫>wāng|\\\ ;" -"屇>tián|\\\ ;" -"屌>diǎo|\\\ ;" -"屒>chén|\\\ ;" -"屛>píng|\\\ ;" -"層>céng|\\\ ;" -"屪>liáo|\\\ ;" -"屳>xiān|\\\ ;" -"屸>lóng|\\\ ;" -"屾>shēn|\\\ ;" -"岍>qiān|\\\ ;" -"岏>yuán|\\\ ;" -"岒>qián|\\\ ;" -"岟>yǎng|\\\ ;" -"岡>gāng|\\\ ;" -"岧>tiáo|\\\ ;" -"岹>tiáo|\\\ ;" -"岺>líng|\\\ ;" -"岽>dōng|\\\ ;" -"峂>tóng|\\\ ;" -"峑>quán|\\\ ;" -"峚>dòng|\\\ ;" -"峝>tóng|\\\ ;" -"峞>qiáo|\\\ ;" -"峧>jiāo|\\\ ;" -"峯>fēng|\\\ ;" -"峴>xiàn|\\\ ;" -"峵>hóng|\\\ ;" -"峷>shēn|\\\ ;" -"峺>gěng|\\\ ;" -"崀>làng|\\\ ;" -"崄>xiǎn|\\\ ;" -"崗>gāng|\\\ ;" -"崚>léng|\\\ ;" -"崠>dōng|\\\ ;" -"崬>dōng|\\\ ;" -"崵>yáng|\\\ ;" -"崶>fēng|\\\ ;" -"嵈>huǎn|\\\ ;" -"嵉>tíng|\\\ ;" -"嵏>zōng|\\\ ;" -"嵢>cāng|\\\ ;" -"嵣>dāng|\\\ ;" -"嵤>hóng|\\\ ;" -"嵪>qiāo|\\\ ;" -"嵭>bēng|\\\ ;" -"嵮>diān|\\\ ;" -"嵱>yǒng|\\\ ;" -"嵷>sǒng|\\\ ;" -"嵸>zōng|\\\ ;" -"嵻>kāng|\\\ ;" -"嵼>chǎn|\\\ ;" -"嵿>dǐng|\\\ ;" -"嶃>zhǎn|\\\ ;" -"嶄>zhǎn|\\\ ;" -"嶐>lóng|\\\ ;" -"嶒>céng|\\\ ;" -"嶕>jiāo|\\\ ;" -"嶘>zhàn|\\\ ;" -"嶚>liáo|\\\ ;" -"嶛>liáo|\\\ ;" -"嶠>jiào|\\\ ;" -"嶣>qiáo|\\\ ;" -"嶦>zhān|\\\ ;" -"嶮>xiǎn|\\\ ;" -"嶸>róng|\\\ ;" -"嶺>lǐng|\\\ ;" -"巃>lóng|\\\ ;" -"巄>lóng|\\\ ;" -"巆>yíng|\\\ ;" -"巉>chán|\\\ ;" -"巊>yǐng|\\\ ;" -"巏>quán|\\\ ;" -"巐>chǎo|\\\ ;" -"巑>cuán|\\\ ;" -"巒>luán|\\\ ;" -"巓>diān|\\\ ;" -"巔>diān|\\\ ;" -"巠>jīng|\\\ ;" -"巣>cháo|\\\ ;" -"巶>zhāo|\\\ ;" -"巸>juǎn|\\\ ;" -"巻>juàn|\\\ ;" -"帄>dīng|\\\ ;" -"帡>píng|\\\ ;" -"帣>juàn|\\\ ;" -"帨>shuì|\\\ ;" -"帩>qiào|\\\ ;" -"帪>zhēn|\\\ ;" -"帱>chóu|\\\ ;" -"帲>jiān|\\\ ;" -"幇>bāng|\\\ ;" -"幈>píng|\\\ ;" -"幊>gōng|\\\ ;" -"幐>jǐng|\\\ ;" -"幓>shān|\\\ ;" -"幖>biāo|\\\ ;" -"幚>bāng|\\\ ;" -"幝>chǎn|\\\ ;" -"幧>qiāo|\\\ ;" -"幨>chān|\\\ ;" -"幪>méng|\\\ ;" -"幫>bāng|\\\ ;" -"幬>chóu|\\\ ;" -"幰>xiǎn|\\\ ;" -"幵>qiān|\\\ ;" -"幷>bìng|\\\ ;" -"庁>tīng|\\\ ;" -"庝>tóng|\\\ ;" -"庣>tiāo|\\\ ;" -"庨>xiāo|\\\ ;" -"庬>páng|\\\ ;" -"庰>dīng|\\\ ;" -"庺>sōng|\\\ ;" -"庿>miào|\\\ ;" -"廌>jiàn|\\\ ;" -"廎>qǐng|\\\ ;" -"廟>miào|\\\ ;" -"廥>kuài|\\\ ;" -"廩>bǐng|\\\ ;" -"廫>liáo|\\\ ;" -"廮>yíng|\\\ ;" -"廯>xiān|\\\ ;" -"廰>tīng|\\\ ;" -"廱>yōng|\\\ ;" -"廳>tīng|\\\ ;" -"廾>gǒng|\\\ ;" -"弉>zàng|\\\ ;" -"弔>diào|\\\ ;" -"弞>shěn|\\\ ;" -"弨>chāo|\\\ ;" -"弪>jìng|\\\ ;" -"弫>zhěn|\\\ ;" -"弮>quān|\\\ ;" -"弰>shāo|\\\ ;" -"弲>xuān|\\\ ;" -"弳>jìng|\\\ ;" -"弸>bēng|\\\ ;" -"弿>jiǎn|\\\ ;" -"彇>xiāo|\\\ ;" -"彋>hóng|\\\ ;" -"彡>shān|\\\ ;" -"彫>diāo|\\\ ;" -"彮>yǒng|\\\ ;" -"彯>piāo|\\\ ;" -"彴>zhuó|\\\ ;" -"彸>wàng|\\\ ;" -"彺>wáng|\\\ ;" -"彾>lǐng|\\\ ;" -"徃>wǎng|\\\ ;" -"徑>jìng|\\\ ;" -"従>cóng|\\\ ;" -"徖>cóng|\\\ ;" -"從>cōng|\\\ ;" -"徤>jiàn|\\\ ;" -"徧>biàn|\\\ ;" -"徬>páng|\\\ ;" -"徰>biāo|\\\ ;" -"徱>piào|\\\ ;" -"徺>jiǎo|\\\ ;" -"徿>lòng|\\\ ;" -"忊>dìng|\\\ ;" -"応>yīng|\\\ ;" -"忩>cōng|\\\ ;" -"忺>xiān|\\\ ;" -"忼>kāng|\\\ ;" -"怊>chāo|\\\ ;" -"怞>chōu|\\\ ;" -"怰>xuàn|\\\ ;" -"怱>cōng|\\\ ;" -"怲>bǐng|\\\ ;" -"恆>héng|\\\ ;" -"恌>tiāo|\\\ ;" -"恔>xiào|\\\ ;" -"恠>guài|\\\ ;" -"恮>quán|\\\ ;" -"恲>pēng|\\\ ;" -"恾>máng|\\\ ;" -"悀>yǒng|\\\ ;" -"悁>juān|\\\ ;" -"悓>qiàn|\\\ ;" -"悙>hēng|\\\ ;" -"悤>cōng|\\\ ;" -"悰>cóng|\\\ ;" -"悹>guàn|\\\ ;" -"悺>guàn|\\\ ;" -"悾>kōng|\\\ ;" -"悿>tiǎn|\\\ ;" -"惉>chān|\\\ ;" -"惌>yuān|\\\ ;" -"惓>quán|\\\ ;" -"惙>chuò|\\\ ;" -"惤>jiān|\\\ ;" -"惥>yǒng|\\\ ;" -"惷>chǔn|\\\ ;" -"惼>biǎn|\\\ ;" -"惾>zōng|\\\ ;" -"愃>xuān|\\\ ;" -"愋>xuān|\\\ ;" -"愌>huàn|\\\ ;" -"愐>miǎn|\\\ ;" -"愑>yǒng|\\\ ;" -"愓>dàng|\\\ ;" -"愖>chén|\\\ ;" -"愡>lèng|\\\ ;" -"愩>gōng|\\\ ;" -"愯>sǒng|\\\ ;" -"愹>yǒng|\\\ ;" -"愼>shèn|\\\ ;" -"慂>yǒng|\\\ ;" -"慃>yǎng|\\\ ;" -"慏>mǐng|\\\ ;" -"慒>cóng|\\\ ;" -"慓>piào|\\\ ;" -"慟>tòng|\\\ ;" -"慣>guàn|\\\ ;" -"慩>lián|\\\ ;" -"慫>sǒng|\\\ ;" -"慱>tuán|\\\ ;" -"慳>qiān|\\\ ;" -"慶>qìng|\\\ ;" -"慻>juàn|\\\ ;" -"慿>píng|\\\ ;" -"憀>liáo|\\\ ;" -"憁>cōng|\\\ ;" -"憅>tòng|\\\ ;" -"憉>péng|\\\ ;" -"憌>chún|\\\ ;" -"憍>jiāo|\\\ ;" -"憐>lián|\\\ ;" -"憑>píng|\\\ ;" -"憢>xiāo|\\\ ;" -"憪>xián|\\\ ;" -"憭>liǎo|\\\ ;" -"憲>xiàn|\\\ ;" -"憸>xiān|\\\ ;" -"憼>jǐng|\\\ ;" -"憽>sōng|\\\ ;" -"憿>jiāo|\\\ ;" -"懁>huán|\\\ ;" -"應>yīng|\\\ ;" -"懐>huái|\\\ ;" -"懜>mèng|\\\ ;" -"懞>méng|\\\ ;" -"懤>chóu|\\\ ;" -"懩>yǎng|\\\ ;" -"懴>chàn|\\\ ;" -"懷>huái|\\\ ;" -"懸>xuán|\\\ ;" -"懹>ràng|\\\ ;" -"懺>chàn|\\\ ;" -"懽>huān|\\\ ;" -"戀>liàn|\\\ ;" -"戃>tǎng|\\\ ;" -"戅>gàng|\\\ ;" -"戔>jiān|\\\ ;" -"戙>dòng|\\\ ;" -"戥>děng|\\\ ;" -"戦>zhàn|\\\ ;" -"戩>jiǎn|\\\ ;" -"戰>zhàn|\\\ ;" -"扂>diàn|\\\ ;" -"扄>shān|\\\ ;" -"扚>diāo|\\\ ;" -"扟>shēn|\\\ ;" -"扲>qián|\\\ ;" -"抃>biàn|\\\ ;" -"抌>zhěn|\\\ ;" -"抦>bǐng|\\\ ;" -"抮>zhěn|\\\ ;" -"抰>yǎng|\\\ ;" -"抺>chēn|\\\ ;" -"拑>qián|\\\ ;" -"拲>gǒng|\\\ ;" -"挊>nòng|\\\ ;" -"挋>zhèn|\\\ ;" -"挍>jiào|\\\ ;" -"挏>dòng|\\\ ;" -"挩>shuì|\\\ ;" -"挭>gěng|\\\ ;" -"挳>kēng|\\\ ;" -"挵>lòng|\\\ ;" -"挷>péng|\\\ ;" -"挸>jiǎn|\\\ ;" -"挻>shān|\\\ ;" -"捀>fēng|\\\ ;" -"捁>jiǎo|\\\ ;" -"捒>sǒng|\\\ ;" -"捖>huán|\\\ ;" -"捚>zhāi|\\\ ;" -"捠>bāng|\\\ ;" -"捰>quán|\\\ ;" -"捲>juǎn|\\\ ;" -"捳>chēn|\\\ ;" -"捴>zǒng|\\\ ;" -"捵>chěn|\\\ ;" -"掆>gāng|\\\ ;" -"掔>qiān|\\\ ;" -"掕>lìng|\\\ ;" -"掞>shàn|\\\ ;" -"掤>bīng|\\\ ;" -"掱>shǒu|\\\ ;" -"掽>pèng|\\\ ;" -"揀>jiǎn|\\\ ;" -"揁>zhēn|\\\ ;" -"揃>jiān|\\\ ;" -"揈>hōng|\\\ ;" -"揔>zǒng|\\\ ;" -"揕>zhèn|\\\ ;" -"揘>héng|\\\ ;" -"揙>biàn|\\\ ;" -"揚>yáng|\\\ ;" -"換>huàn|\\\ ;" -"揝>zuàn|\\\ ;" -"揯>gēng|\\\ ;" -"揱>shuò|\\\ ;" -"揵>qián|\\\ ;" -"搃>zǒng|\\\ ;" -"搄>gēng|\\\ ;" -"搈>yǒng|\\\ ;" -"搊>chōu|\\\ ;" -"搌>zhǎn|\\\ ;" -"搑>bàng|\\\ ;" -"搒>bèng|\\\ ;" -"搛>jiān|\\\ ;" -"搟>xiǎn|\\\ ;" -"搥>chuí|\\\ ;" -"搧>shān|\\\ ;" -"搷>shēn|\\\ ;" -"搼>quán|\\\ ;" -"摃>gāng|\\\ ;" -"摌>chǎn|\\\ ;" -"摎>liáo|\\\ ;" -"摓>féng|\\\ ;" -"摚>táng|\\\ ;" -"摜>guàn|\\\ ;" -"摠>zǒng|\\\ ;" -"摥>tàng|\\\ ;" -"摬>yìng|\\\ ;" -"摲>shàn|\\\ ;" -"摶>tuán|\\\ ;" -"摷>jiǎo|\\\ ;" -"摻>chān|\\\ ;" -"摼>biāo|\\\ ;" -"摽>biāo|\\\ ;" -"撁>qiān|\\\ ;" -"撊>xiàn|\\\ ;" -"撋>ruán|\\\ ;" -"撍>xián|\\\ ;" -"撔>hèng|\\\ ;" -"撚>niǎn|\\\ ;" -"撟>jiǎo|\\\ ;" -"撨>liāo|\\\ ;" -"撯>suàn|\\\ ;" -"撹>jiǎo|\\\ ;" -"撽>qiào|\\\ ;" -"撾>zhuā|\\\ ;" -"撿>jiǎn|\\\ ;" -"擁>yōng|\\\ ;" -"擆>zhuó|\\\ ;" -"擉>chuō|\\\ ;" -"擋>dǎng|\\\ ;" -"擏>jìng|\\\ ;" -"擐>huàn|\\\ ;" -"擓>kuǎi|\\\ ;" -"擰>níng|\\\ ;" -"擶>jiàn|\\\ ;" -"攁>yǎng|\\\ ;" -"攆>niǎn|\\\ ;" -"攇>xiǎn|\\\ ;" -"攊>huǎn|\\\ ;" -"攍>xiān|\\\ ;" -"攏>lǒng|\\\ ;" -"攐>qiān|\\\ ;" -"攑>qiān|\\\ ;" -"攓>qiān|\\\ ;" -"攖>yīng|\\\ ;" -"攙>chān|\\\ ;" -"攛>cuān|\\\ ;" -"攢>cuán|\\\ ;" -"攣>luán|\\\ ;" -"攧>diān|\\\ ;" -"攨>tǎng|\\\ ;" -"攩>dǎng|\\\ ;" -"攪>jiǎo|\\\ ;" -"敁>diān|\\\ ;" -"敎>jiào|\\\ ;" -"敐>chén|\\\ ;" -"敒>zhèn|\\\ ;" -"敟>diǎn|\\\ ;" -"敤>diāo|\\\ ;" -"敧>jiǎo|\\\ ;" -"敩>xiào|\\\ ;" -"敭>yáng|\\\ ;" -"敶>zhèn|\\\ ;" -"敹>liáo|\\\ ;" -"敽>jiǎo|\\\ ;" -"敿>jiǎo|\\\ ;" -"斀>zhuó|\\\ ;" -"斂>liǎn|\\\ ;" -"斅>jiǎo|\\\ ;" -"斆>jiǎo|\\\ ;" -"斎>zhāi|\\\ ;" -"斘>liáo|\\\ ;" -"斠>jiào|\\\ ;" -"斬>zhǎn|\\\ ;" -"斮>zhuó|\\\ ;" -"斱>zhuó|\\\ ;" -"斲>zhuó|\\\ ;" -"斵>zhuó|\\\ ;" -"斷>duàn|\\\ ;" -"斻>háng|\\\ ;" -"旊>fǎng|\\\ ;" -"旍>jīng|\\\ ;" -"旐>zhào|\\\ ;" -"旓>shāo|\\\ ;" -"旔>jiàn|\\\ ;" -"旚>piāo|\\\ ;" -"旜>zhān|\\\ ;" -"旝>guài|\\\ ;" -"旫>tiāo|\\\ ;" -"旵>chǎn|\\\ ;" -"旸>yáng|\\\ ;" -"旾>chūn|\\\ ;" -"昉>fǎng|\\\ ;" -"昍>xuān|\\\ ;" -"昘>fǎng|\\\ ;" -"昚>shèn|\\\ ;" -"昜>yáng|\\\ ;" -"昞>bǐng|\\\ ;" -"昡>xuàn|\\\ ;" -"昣>chǔn|\\\ ;" -"昤>līng|\\\ ;" -"昪>biàn|\\\ ;" -"昮>zòng|\\\ ;" -"昸>dōng|\\\ ;" -"昺>bǐng|\\\ ;" -"昽>lóng|\\\ ;" -"晀>tiǎo|\\\ ;" -"晅>xuān|\\\ ;" -"晈>jiǎo|\\\ ;" -"晍>tóng|\\\ ;" -"晎>hǒng|\\\ ;" -"晛>xiàn|\\\ ;" -"晝>zhòu|\\\ ;" -"晪>tiǎn|\\\ ;" -"晫>zhuó|\\\ ;" -"晭>zhǒu|\\\ ;" -"晱>shǎn|\\\ ;" -"晸>zhěn|\\\ ;" -"暀>wǎng|\\\ ;" -"暁>gěng|\\\ ;" -"暅>xuǎn|\\\ ;" -"暒>qíng|\\\ ;" -"暕>jiǎn|\\\ ;" -"暘>yáng|\\\ ;" -"暙>chūn|\\\ ;" -"暰>cōng|\\\ ;" -"暶>xuán|\\\ ;" -"暸>liáo|\\\ ;" -"暻>jǐng|\\\ ;" -"曈>tóng|\\\ ;" -"曉>xiǎo|\\\ ;" -"曌>zhào|\\\ ;" -"曒>jiǎo|\\\ ;" -"曔>jìng|\\\ ;" -"曚>méng|\\\ ;" -"曟>chén|\\\ ;" -"曧>róng|\\\ ;" -"曨>lóng|\\\ ;" -"曫>luán|\\\ ;" -"曬>shài|\\\ ;" -"曭>tǎng|\\\ ;" -"曽>cēng|\\\ ;" -"朊>ruǎn|\\\ ;" -"朎>líng|\\\ ;" -"朓>tiào|\\\ ;" -"朖>lǎng|\\\ ;" -"朘>juān|\\\ ;" -"朙>míng|\\\ ;" -"朠>lǒng|\\\ ;" -"朡>zōng|\\\ ;" -"朢>wàng|\\\ ;" -"朣>tóng|\\\ ;" -"朤>lǎng|\\\ ;" -"朧>lóng|\\\ ;" -"朩>děng|\\\ ;" -"朲>piáo|\\\ ;" -"朾>tíng|\\\ ;" -"杄>qiān|\\\ ;" -"杊>biāo|\\\ ;" -"杗>máng|\\\ ;" -"杛>gōng|\\\ ;" -"杬>yuán|\\\ ;" -"東>dōng|\\\ ;" -"杴>xiān|\\\ ;" -"杶>chūn|\\\ ;" -"杻>chǒu|\\\ ;" -"杽>chǒu|\\\ ;" -"枀>sōng|\\\ ;" -"枛>zhào|\\\ ;" -"枧>jiàn|\\\ ;" -"枮>xiān|\\\ ;" -"柃>líng|\\\ ;" -"柍>yāng|\\\ ;" -"柖>zhāo|\\\ ;" -"柗>sōng|\\\ ;" -"柡>yǒng|\\\ ;" -"柺>guǎi|\\\ ;" -"栄>róng|\\\ ;" -"栕>zhēn|\\\ ;" -"栚>zhèn|\\\ ;" -"栟>bīng|\\\ ;" -"栠>jiǎo|\\\ ;" -"栤>bìng|\\\ ;" -"栦>chóu|\\\ ;" -"栫>jiàn|\\\ ;" -"栱>gǒng|\\\ ;" -"栴>zhān|\\\ ;" -"桊>juàn|\\\ ;" -"桒>sāng|\\\ ;" -"桘>chuí|\\\ ;" -"桜>yīng|\\\ ;" -"桟>zhàn|\\\ ;" -"桭>zhēn|\\\ ;" -"桯>tīng|\\\ ;" -"桱>jìng|\\\ ;" -"桹>láng|\\\ ;" -"桻>fēng|\\\ ;" -"梇>lòng|\\\ ;" -"梈>pēng|\\\ ;" -"梋>xuān|\\\ ;" -"梘>jiàn|\\\ ;" -"梙>huàn|\\\ ;" -"條>tiáo|\\\ ;" -"梟>xiāo|\\\ ;" -"梡>kuǎn|\\\ ;" -"梥>sōng|\\\ ;" -"梲>zhuó|\\\ ;" -"梴>chān|\\\ ;" -"梷>jìng|\\\ ;" -"梹>bīng|\\\ ;" -"梿>lián|\\\ ;" -"棁>zhuó|\\\ ;" -"棅>bìng|\\\ ;" -"棆>zhūn|\\\ ;" -"棇>cōng|\\\ ;" -"棈>qiàn|\\\ ;" -"棟>dòng|\\\ ;" -"棡>gāng|\\\ ;" -"棢>wǎng|\\\ ;" -"棤>quàn|\\\ ;" -"棧>zhàn|\\\ ;" -"棩>yuān|\\\ ;" -"棬>quān|\\\ ;" -"棭>niàn|\\\ ;" -"棽>chēn|\\\ ;" -"椆>chóu|\\\ ;" -"椊>chuí|\\\ ;" -"椓>zhuó|\\\ ;" -"椖>péng|\\\ ;" -"椗>dìng|\\\ ;" -"検>jiǎn|\\\ ;" -"椪>pèng|\\\ ;" -"椫>zhǎn|\\\ ;" -"椷>jiān|\\\ ;" -"椺>jiān|\\\ ;" -"椾>zhàn|\\\ ;" -"楄>pián|\\\ ;" -"楊>yáng|\\\ ;" -"楓>fēng|\\\ ;" -"楟>tíng|\\\ ;" -"楤>sǒng|\\\ ;" -"楥>xuàn|\\\ ;" -"楧>yīng|\\\ ;" -"楨>zhēn|\\\ ;" -"楩>pián|\\\ ;" -"楯>shǔn|\\\ ;" -"楻>héng|\\\ ;" -"榐>zhǎn|\\\ ;" -"榒>lǎng|\\\ ;" -"榗>jiàn|\\\ ;" -"榞>yuán|\\\ ;" -"榠>míng|\\\ ;" -"榩>qián|\\\ ;" -"榬>yuán|\\\ ;" -"榮>róng|\\\ ;" -"榳>tíng|\\\ ;" -"榵>róng|\\\ ;" -"榶>táng|\\\ ;" -"榸>zhāi|\\\ ;" -"槇>diān|\\\ ;" -"槓>gàng|\\\ ;" -"槕>zhuó|\\\ ;" -"槙>diān|\\\ ;" -"槜>bīng|\\\ ;" -"槤>lián|\\\ ;" -"槦>yóng|\\\ ;" -"槧>qiàn|\\\ ;" -"槫>tuán|\\\ ;" -"槰>bèng|\\\ ;" -"槵>huàn|\\\ ;" -"槺>kāng|\\\ ;" -"樃>láng|\\\ ;" -"樄>chén|\\\ ;" -"樅>cōng|\\\ ;" -"樈>qíng|\\\ ;" -"樌>guàn|\\\ ;" -"樔>cháo|\\\ ;" -"樘>táng|\\\ ;" -"標>biāo|\\\ ;" -"樢>niǎo|\\\ ;" -"樣>yàng|\\\ ;" -"樥>péng|\\\ ;" -"権>quán|\\\ ;" -"樫>jiān|\\\ ;" -"樬>cōng|\\\ ;" -"樷>cōng|\\\ ;" -"樼>zhēn|\\\ ;" -"樿>zhǎn|\\\ ;" -"橀>chūn|\\\ ;" -"橂>diàn|\\\ ;" -"橋>qiáo|\\\ ;" -"橌>xiàn|\\\ ;" -"橏>zhǎn|\\\ ;" -"橒>chén|\\\ ;" -"橓>shùn|\\\ ;" -"橖>táng|\\\ ;" -"橗>méng|\\\ ;" -"橧>zēng|\\\ ;" -"橫>héng|\\\ ;" -"檂>nóng|\\\ ;" -"檆>shān|\\\ ;" -"檈>xuán|\\\ ;" -"檒>dàng|\\\ ;" -"檔>dàng|\\\ ;" -"檙>dǐng|\\\ ;" -"檛>zhuā|\\\ ;" -"檢>jiǎn|\\\ ;" -"檦>biǎo|\\\ ;" -"檧>sōng|\\\ ;" -"檰>mián|\\\ ;" -"檲>bīng|\\\ ;" -"檸>níng|\\\ ;" -"檻>jiàn|\\\ ;" -"櫂>zhào|\\\ ;" -"櫄>chūn|\\\ ;" -"櫈>dèng|\\\ ;" -"櫋>mián|\\\ ;" -"櫕>cuán|\\\ ;" -"櫞>yuán|\\\ ;" -"櫡>zhuó|\\\ ;" -"櫢>guàn|\\\ ;" -"櫣>lián|\\\ ;" -"櫬>chèn|\\\ ;" -"櫰>huái|\\\ ;" -"櫳>lóng|\\\ ;" -"櫶>xiǎn|\\\ ;" -"櫹>xiāo|\\\ ;" -"櫺>líng|\\\ ;" -"櫻>yīng|\\\ ;" -"櫼>jiān|\\\ ;" -"櫿>liàn|\\\ ;" -"欁>nóng|\\\ ;" -"欃>chán|\\\ ;" -"欉>còng|\\\ ;" -"權>quán|\\\ ;" -"欒>luán|\\\ ;" -"欓>dǎng|\\\ ;" -"欜>náng|\\\ ;" -"欞>líng|\\\ ;" -"欦>qiān|\\\ ;" -"欩>chāo|\\\ ;" -"欳>kuài|\\\ ;" -"欴>láng|\\\ ;" -"欵>kuǎn|\\\ ;" -"欶>shuò|\\\ ;" -"歀>kuǎn|\\\ ;" -"歊>xiāo|\\\ ;" -"歓>huān|\\\ ;" -"歗>xiào|\\\ ;" -"歛>liǎn|\\\ ;" -"歠>chuò|\\\ ;" -"歡>huān|\\\ ;" -"歬>qián|\\\ ;" -"殎>jìng|\\\ ;" -"殑>qíng|\\\ ;" -"殝>zhēn|\\\ ;" -"殠>chòu|\\\ ;" -"殦>diāo|\\\ ;" -"殩>cuàn|\\\ ;" -"殮>liàn|\\\ ;" -"殲>jiān|\\\ ;" -"殸>qìng|\\\ ;" -"毈>duàn|\\\ ;" -"毊>xiāo|\\\ ;" -"毌>guàn|\\\ ;" -"毚>chán|\\\ ;" -"毧>róng|\\\ ;" -"毨>xiǎn|\\\ ;" -"氃>bǎng|\\\ ;" -"氄>rǒng|\\\ ;" -"氈>zhān|\\\ ;" -"氊>zhān|\\\ ;" -"氋>méng|\\\ ;" -"氠>shēn|\\\ ;" -"氫>qīng|\\\ ;" -"氭>dōng|\\\ ;" -"氱>niào|\\\ ;" -"氷>bīng|\\\ ;" -"氹>dàng|\\\ ;" -"汅>miǎn|\\\ ;" -"汈>diāo|\\\ ;" -"汋>zhuó|\\\ ;" -"汒>máng|\\\ ;" -"汘>qiān|\\\ ;" -"汧>qiān|\\\ ;" -"汬>jǐng|\\\ ;" -"汯>hóng|\\\ ;" -"汱>quǎn|\\\ ;" -"汳>biàn|\\\ ;" -"汸>fāng|\\\ ;" -"汻>hǎng|\\\ ;" -"沗>tiān|\\\ ;" -"沝>zhuǐ|\\\ ;" -"沨>féng|\\\ ;" -"泎>zhuó|\\\ ;" -"泙>píng|\\\ ;" -"泴>guàn|\\\ ;" -"洀>zhōu|\\\ ;" -"洊>jiàn|\\\ ;" -"洐>xíng|\\\ ;" -"洘>hóng|\\\ ;" -"洤>quán|\\\ ;" -"洨>xiáo|\\\ ;" -"洴>píng|\\\ ;" -"洺>míng|\\\ ;" -"浐>chǎn|\\\ ;" -"浤>hóng|\\\ ;" -"浧>yǐng|\\\ ;" -"浭>gēng|\\\ ;" -"浱>chún|\\\ ;" -"浲>féng|\\\ ;" -"浵>tóng|\\\ ;" -"浻>wěng|\\\ ;" -"涀>xiàn|\\\ ;" -"涁>shèn|\\\ ;" -"涇>jīng|\\\ ;" -"涊>niǎn|\\\ ;" -"涍>diàn|\\\ ;" -"涗>shuì|\\\ ;" -"涚>shuì|\\\ ;" -"涫>guàn|\\\ ;" -"涬>xìng|\\\ ;" -"涭>shòu|\\\ ;" -"涰>chuò|\\\ ;" -"涳>kōng|\\\ ;" -"涶>dòng|\\\ ;" -"涷>dōng|\\\ ;" -"淃>juàn|\\\ ;" -"淎>pěng|\\\ ;" -"淓>fāng|\\\ ;" -"淜>péng|\\\ ;" -"淟>tiǎn|\\\ ;" -"淣>guān|\\\ ;" -"淨>jìng|\\\ ;" -"淩>líng|\\\ ;" -"淭>liǎn|\\\ ;" -"淰>niǎn|\\\ ;" -"淲>piáo|\\\ ;" -"淵>yuān|\\\ ;" -"淸>qīng|\\\ ;" -"淺>qiǎn|\\\ ;" -"渁>yuān|\\\ ;" -"渕>yuān|\\\ ;" -"渙>huàn|\\\ ;" -"減>jiǎn|\\\ ;" -"渜>nuǎn|\\\ ;" -"渟>tíng|\\\ ;" -"渢>féng|\\\ ;" -"渶>yīng|\\\ ;" -"渹>hōng|\\\ ;" -"渻>xǐng|\\\ ;" -"湅>liàn|\\\ ;" -"湉>tián|\\\ ;" -"湕>chén|\\\ ;" -"湗>fèng|\\\ ;" -"湧>yǒng|\\\ ;" -"湩>dòng|\\\ ;" -"湪>jiǎo|\\\ ;" -"湬>jiǎo|\\\ ;" -"湯>tāng|\\\ ;" -"湰>lóng|\\\ ;" -"湲>yuán|\\\ ;" -"湶>quán|\\\ ;" -"湷>chuí|\\\ ;" -"湹>chán|\\\ ;" -"湻>chún|\\\ ;" -"満>jiān|\\\ ;" -"溁>yíng|\\\ ;" -"溌>liǎn|\\\ ;" -"溒>yuán|\\\ ;" -"溓>lián|\\\ ;" -"溕>mèng|\\\ ;" -"準>zhǔn|\\\ ;" -"滃>wěng|\\\ ;" -"滄>cāng|\\\ ;" -"滎>xíng|\\\ ;" -"滘>jiào|\\\ ;" -"滝>lóng|\\\ ;" -"滣>chún|\\\ ;" -"滮>biāo|\\\ ;" -"滲>shèn|\\\ ;" -"滻>chǎn|\\\ ;" -"滽>yóng|\\\ ;" -"漀>biāo|\\\ ;" -"漅>jiǎo|\\\ ;" -"漋>lóng|\\\ ;" -"漎>cóng|\\\ ;" -"漖>chún|\\\ ;" -"漗>cōng|\\\ ;" -"漘>chún|\\\ ;" -"漙>tuán|\\\ ;" -"漟>táng|\\\ ;" -"漣>lián|\\\ ;" -"漧>qián|\\\ ;" -"漨>féng|\\\ ;" -"漭>mǎng|\\\ ;" -"漮>kāng|\\\ ;" -"漰>pēng|\\\ ;" -"漸>jiān|\\\ ;" -"漻>liáo|\\\ ;" -"潀>cóng|\\\ ;" -"潁>yǐng|\\\ ;" -"潂>hóng|\\\ ;" -"潅>guàn|\\\ ;" -"潚>xiāo|\\\ ;" -"潛>qián|\\\ ;" -"潧>shàn|\\\ ;" -"潹>chán|\\\ ;" -"潽>dèng|\\\ ;" -"澆>jiāo|\\\ ;" -"澋>hèng|\\\ ;" -"澒>hòng|\\\ ;" -"澖>xiān|\\\ ;" -"澗>jiàn|\\\ ;" -"澘>shān|\\\ ;" -"澢>dāng|\\\ ;" -"澣>huǎn|\\\ ;" -"澭>yōng|\\\ ;" -"澮>kuài|\\\ ;" -"澰>liàn|\\\ ;" -"澱>diàn|\\\ ;" -"澴>huán|\\\ ;" -"澵>zhēn|\\\ ;" -"澺>jiāo|\\\ ;" -"濁>zhuó|\\\ ;" -"濃>nóng|\\\ ;" -"濍>sōng|\\\ ;" -"濎>dǐng|\\\ ;" -"濓>lián|\\\ ;" -"濘>nìng|\\\ ;" -"濙>yíng|\\\ ;" -"濛>méng|\\\ ;" -"濢>cháo|\\\ ;" -"濪>jiàn|\\\ ;" -"濳>qián|\\\ ;" -"濴>xíng|\\\ ;" -"濶>jiān|\\\ ;" -"濺>jiàn|\\\ ;" -"濽>cuán|\\\ ;" -"瀁>yàng|\\\ ;" -"瀅>yíng|\\\ ;" -"瀇>chèn|\\\ ;" -"瀋>shěn|\\\ ;" -"瀌>biāo|\\\ ;" -"瀍>chán|\\\ ;" -"瀗>xiàn|\\\ ;" -"瀜>yōng|\\\ ;" -"瀞>jìng|\\\ ;" -"瀟>xiāo|\\\ ;" -"瀠>yíng|\\\ ;" -"瀤>huái|\\\ ;" -"瀧>lóng|\\\ ;" -"瀯>yíng|\\\ ;" -"瀲>liàn|\\\ ;" -"瀳>jiàn|\\\ ;" -"瀴>yǐng|\\\ ;" -"瀸>jiān|\\\ ;" -"瀺>chán|\\\ ;" -"瀼>ráng|\\\ ;" -"瀽>jiǎn|\\\ ;" -"灁>yuān|\\\ ;" -"灂>zhuó|\\\ ;" -"灃>fēng|\\\ ;" -"灅>huàn|\\\ ;" -"灇>cóng|\\\ ;" -"灉>yōng|\\\ ;" -"灊>qián|\\\ ;" -"灓>luán|\\\ ;" -"灗>shàn|\\\ ;" -"灙>dǎng|\\\ ;" -"灚>jiǎo|\\\ ;" -"灛>chǎn|\\\ ;" -"灢>nǎng|\\\ ;" -"灤>luán|\\\ ;" -"灦>xiǎn|\\\ ;" -"灱>xiāo|\\\ ;" -"灲>xiāo|\\\ ;" -"灴>hóng|\\\ ;" -"炁>gěng|\\\ ;" -"炏>gěng|\\\ ;" -"炐>pàng|\\\ ;" -"炓>liào|\\\ ;" -"炤>zhào|\\\ ;" -"炩>lìng|\\\ ;" -"炪>zhuó|\\\ ;" -"炴>yǎng|\\\ ;" -"炵>tōng|\\\ ;" -"烄>jiǎo|\\\ ;" -"烆>xíng|\\\ ;" -"烇>quàn|\\\ ;" -"烉>huàn|\\\ ;" -"烋>xiāo|\\\ ;" -"烍>xiǎn|\\\ ;" -"烔>tóng|\\\ ;" -"烜>xuǎn|\\\ ;" -"烴>tīng|\\\ ;" -"烵>shán|\\\ ;" -"烶>tǐng|\\\ ;" -"烺>lǎng|\\\ ;" -"烻>shān|\\\ ;" -"烿>róng|\\\ ;" -"焇>xiāo|\\\ ;" -"焢>hōng|\\\ ;" -"焧>cōng|\\\ ;" -"焨>fèng|\\\ ;" -"焩>pīng|\\\ ;" -"焲>jiāo|\\\ ;" -"焴>shén|\\\ ;" -"焵>gàng|\\\ ;" -"焼>shāo|\\\ ;" -"煁>chén|\\\ ;" -"煈>fèng|\\\ ;" -"煉>liàn|\\\ ;" -"煋>xīng|\\\ ;" -"煍>jiǎo|\\\ ;" -"煐>yīng|\\\ ;" -"煓>qián|\\\ ;" -"煔>tiàn|\\\ ;" -"煖>nuǎn|\\\ ;" -"煘>chán|\\\ ;" -"煥>huàn|\\\ ;" -"煬>yáng|\\\ ;" -"煵>shàn|\\\ ;" -"煻>táng|\\\ ;" -"煼>chǎo|\\\ ;" -"熌>shàn|\\\ ;" -"熑>lián|\\\ ;" -"熒>yíng|\\\ ;" -"熛>biāo|\\\ ;" -"熜>zǒng|\\\ ;" -"熞>jiān|\\\ ;" -"熢>fēng|\\\ ;" -"熥>tōng|\\\ ;" -"熧>zōng|\\\ ;" -"熮>liáo|\\\ ;" -"熶>cuàn|\\\ ;" -"熷>zēng|\\\ ;" -"熸>jiān|\\\ ;" -"熽>xiào|\\\ ;" -"燀>chǎn|\\\ ;" -"燂>qián|\\\ ;" -"燅>xián|\\\ ;" -"燈>dēng|\\\ ;" -"燊>shēn|\\\ ;" -"燋>jiāo|\\\ ;" -"燍>liáo|\\\ ;" -"燑>tóng|\\\ ;" -"燒>shāo|\\\ ;" -"燗>dàng|\\\ ;" -"燙>tàng|\\\ ;" -"燛>jǐng|\\\ ;" -"營>yíng|\\\ ;" -"燪>cōng|\\\ ;" -"燫>lián|\\\ ;" -"燯>líng|\\\ ;" -"燳>zhào|\\\ ;" -"燽>chóu|\\\ ;" -"爂>biāo|\\\ ;" -"爃>róng|\\\ ;" -"爍>shuò|\\\ ;" -"爒>liào|\\\ ;" -"爔>shuò|\\\ ;" -"爖>lóng|\\\ ;" -"爙>rǎng|\\\ ;" -"爜>cóng|\\\ ;" -"爟>guàn|\\\ ;" -"爣>tǎng|\\\ ;" -"爧>líng|\\\ ;" -"牂>zāng|\\\ ;" -"牅>yóng|\\\ ;" -"牊>sháo|\\\ ;" -"牋>jiān|\\\ ;" -"牐>cōng|\\\ ;" -"牑>biān|\\\ ;" -"牓>bǎng|\\\ ;" -"牤>máng|\\\ ;" -"牥>fāng|\\\ ;" -"牨>gāng|\\\ ;" -"牮>jiàn|\\\ ;" -"牶>quàn|\\\ ;" -"牷>quán|\\\ ;" -"牻>máng|\\\ ;" -"牼>kēng|\\\ ;" -"牽>qiān|\\\ ;" -"犅>gāng|\\\ ;" -"犈>quán|\\\ ;" -"犎>fēng|\\\ ;" -"犝>tóng|\\\ ;" -"犨>chōu|\\\ ;" -"犪>chái|\\\ ;" -"犫>chōu|\\\ ;" -"犺>kàng|\\\ ;" -"犿>huān|\\\ ;" -"狅>qīng|\\\ ;" -"狑>líng|\\\ ;" -"狝>xiǎn|\\\ ;" -"狟>huán|\\\ ;" -"狣>zhào|\\\ ;" -"狦>kuài|\\\ ;" -"狨>róng|\\\ ;" -"狪>tōng|\\\ ;" -"狵>máng|\\\ ;" -"狻>suān|\\\ ;" -"猄>jīng|\\\ ;" -"猋>biāo|\\\ ;" -"猏>jiān|\\\ ;" -"猣>zōng|\\\ ;" -"猦>fēng|\\\ ;" -"猨>yuán|\\\ ;" -"猭>yuán|\\\ ;" -"猯>tuān|\\\ ;" -"猵>biān|\\\ ;" -"獂>huán|\\\ ;" -"獉>zhēn|\\\ ;" -"獑>chán|\\\ ;" -"獞>tóng|\\\ ;" -"獧>juàn|\\\ ;" -"獪>kuài|\\\ ;" -"獫>xiǎn|\\\ ;" -"獮>xiǎn|\\\ ;" -"獰>níng|\\\ ;" -"獴>méng|\\\ ;" -"獸>shòu|\\\ ;" -"獻>xiàn|\\\ ;" -"獽>ráng|\\\ ;" -"玁>xiǎn|\\\ ;" -"玅>miào|\\\ ;" -"玒>hóng|\\\ ;" -"玚>yáng|\\\ ;" -"玜>gōng|\\\ ;" -"玣>bàng|\\\ ;" -"玤>bàng|\\\ ;" -"玪>jiān|\\\ ;" -"玶>píng|\\\ ;" -"玹>xuán|\\\ ;" -"玿>sháo|\\\ ;" -"珅>shēn|\\\ ;" -"珎>zhēn|\\\ ;" -"珓>jiào|\\\ ;" -"珔>jiàn|\\\ ;" -"珗>xiān|\\\ ;" -"珘>zhōu|\\\ ;" -"珜>yáng|\\\ ;" -"珰>dāng|\\\ ;" -"珽>tǐng|\\\ ;" -"現>xiàn|\\\ ;" -"珿>chuò|\\\ ;" -"琁>xuān|\\\ ;" -"琂>juān|\\\ ;" -"琄>quǎn|\\\ ;" -"琌>líng|\\\ ;" -"琔>diàn|\\\ ;" -"琖>zhǎn|\\\ ;" -"琠>diǎn|\\\ ;" -"琫>běng|\\\ ;" -"琯>guǎn|\\\ ;" -"琱>diāo|\\\ ;" -"琸>zhuó|\\\ ;" -"瑃>chūn|\\\ ;" -"瑄>xuān|\\\ ;" -"瑆>xīng|\\\ ;" -"瑊>zhēn|\\\ ;" -"瑌>ruǎn|\\\ ;" -"瑍>huàn|\\\ ;" -"瑐>jiǎn|\\\ ;" -"瑒>yáng|\\\ ;" -"瑓>huán|\\\ ;" -"瑔>quán|\\\ ;" -"瑖>duàn|\\\ ;" -"瑢>róng|\\\ ;" -"瑩>yíng|\\\ ;" -"瑯>láng|\\\ ;" -"瑱>tiàn|\\\ ;" -"瑵>zhǎo|\\\ ;" -"瑽>cōng|\\\ ;" -"璄>liǎn|\\\ ;" -"璉>lián|\\\ ;" -"璒>dēng|\\\ ;" -"璔>zēng|\\\ ;" -"璗>dàng|\\\ ;" -"璙>liáo|\\\ ;" -"璟>jǐng|\\\ ;" -"璢>huàn|\\\ ;" -"璥>jǐng|\\\ ;" -"璫>dāng|\\\ ;" -"璬>jiǎo|\\\ ;" -"環>huán|\\\ ;" -"璳>tián|\\\ ;" -"璹>shòu|\\\ ;" -"璿>xuán|\\\ ;" -"瓀>ruǎn|\\\ ;" -"瓏>lóng|\\\ ;" -"瓔>yīng|\\\ ;" -"瓘>guàn|\\\ ;" -"瓛>huán|\\\ ;" -"瓨>hóng|\\\ ;" -"瓩>qiān|\\\ ;" -"瓬>fǎng|\\\ ;" -"瓹>juàn|\\\ ;" -"瓽>dàng|\\\ ;" -"瓾>měng|\\\ ;" -"甀>zhuì|\\\ ;" -"甁>píng|\\\ ;" -"甂>biān|\\\ ;" -"甃>zhòu|\\\ ;" -"甇>yīng|\\\ ;" -"甉>xián|\\\ ;" -"甕>wèng|\\\ ;" -"甖>yīng|\\\ ;" -"甠>qíng|\\\ ;" -"甡>shēn|\\\ ;" -"產>chǎn|\\\ ;" -"産>chǎn|\\\ ;" -"甮>fèng|\\\ ;" -"甯>níng|\\\ ;" -"甹>pīng|\\\ ;" -"甼>tǐng|\\\ ;" -"甽>quǎn|\\\ ;" -"甿>méng|\\\ ;" -"畊>gēng|\\\ ;" -"畋>tián|\\\ ;" -"畑>tián|\\\ ;" -"畳>dàng|\\\ ;" -"當>dāng|\\\ ;" -"畷>chuò|\\\ ;" -"畽>tuǎn|\\\ ;" -"疃>tuǎn|\\\ ;" -"疇>chóu|\\\ ;" -"疘>gāng|\\\ ;" -"疛>zhǒu|\\\ ;" -"疢>chèn|\\\ ;" -"疭>zòng|\\\ ;" -"痁>diàn|\\\ ;" -"痃>xián|\\\ ;" -"痌>tōng|\\\ ;" -"痙>jìng|\\\ ;" -"痚>xiāo|\\\ ;" -"痝>máng|\\\ ;" -"痟>xiāo|\\\ ;" -"痠>suān|\\\ ;" -"痩>shòu|\\\ ;" -"痭>péng|\\\ ;" -"痯>guǎn|\\\ ;" -"痶>diǎn|\\\ ;" -"瘆>shèn|\\\ ;" -"瘋>fēng|\\\ ;" -"瘍>yáng|\\\ ;" -"瘎>shèn|\\\ ;" -"瘓>huàn|\\\ ;" -"瘝>guān|\\\ ;" -"瘨>diān|\\\ ;" -"瘭>biāo|\\\ ;" -"瘮>shēn|\\\ ;" -"瘲>zòng|\\\ ;" -"瘵>zhài|\\\ ;" -"瘹>diào|\\\ ;" -"療>liáo|\\\ ;" -"癃>lóng|\\\ ;" -"癄>qiáo|\\\ ;" -"癇>xián|\\\ ;" -"癎>xián|\\\ ;" -"癏>guān|\\\ ;" -"癐>guài|\\\ ;" -"癑>nóng|\\\ ;" -"癕>yōng|\\\ ;" -"癢>yǎng|\\\ ;" -"癬>xuǎn|\\\ ;" -"癭>yǐng|\\\ ;" -"癰>yōng|\\\ ;" -"癲>diān|\\\ ;" -"癴>luán|\\\ ;" -"癵>luán|\\\ ;" -"皊>líng|\\\ ;" -"皏>pěng|\\\ ;" -"皗>chóu|\\\ ;" -"皘>qiàn|\\\ ;" -"皢>xiǎo|\\\ ;" -"皦>jiǎo|\\\ ;" -"皨>xīng|\\\ ;" -"皫>piǎo|\\\ ;" -"皭>jiào|\\\ ;" -"皺>zhòu|\\\ ;" -"皻>mǐng|\\\ ;" -"皽>zhǎn|\\\ ;" -"盀>diào|\\\ ;" -"盁>yíng|\\\ ;" -"盄>zhāo|\\\ ;" -"盞>zhǎn|\\\ ;" -"盢>jiàn|\\\ ;" -"監>jiān|\\\ ;" -"盩>zhōu|\\\ ;" -"盪>dàng|\\\ ;" -"盳>máng|\\\ ;" -"盶>ruǎn|\\\ ;" -"盷>tián|\\\ ;" -"盽>fēng|\\\ ;" -"眀>míng|\\\ ;" -"眂>miào|\\\ ;" -"眆>fǎng|\\\ ;" -"県>dèng|\\\ ;" -"眏>yāng|\\\ ;" -"眒>shèn|\\\ ;" -"眕>zhěn|\\\ ;" -"眘>shèn|\\\ ;" -"眝>miǎn|\\\ ;" -"眞>zhēn|\\\ ;" -"眢>yuān|\\\ ;" -"眧>chǎo|\\\ ;" -"眪>bǐng|\\\ ;" -"眬>lóng|\\\ ;" -"眮>dòng|\\\ ;" -"眳>míng|\\\ ;" -"眴>xuàn|\\\ ;" -"眹>zhèn|\\\ ;" -"眻>yáng|\\\ ;" -"睄>shào|\\\ ;" -"睆>huǎn|\\\ ;" -"睊>juàn|\\\ ;" -"睍>xiàn|\\\ ;" -"睒>shǎn|\\\ ;" -"睓>tiǎn|\\\ ;" -"睖>lèng|\\\ ;" -"睠>juàn|\\\ ;" -"睭>zhǒu|\\\ ;" -"睶>chǔn|\\\ ;" -"睷>jiān|\\\ ;" -"睻>xuān|\\\ ;" -"瞈>wěng|\\\ ;" -"瞊>dàng|\\\ ;" -"瞋>chēn|\\\ ;" -"瞗>diāo|\\\ ;" -"瞚>shùn|\\\ ;" -"瞛>cōng|\\\ ;" -"瞦>liào|\\\ ;" -"瞫>shěn|\\\ ;" -"瞭>liǎo|\\\ ;" -"瞯>xián|\\\ ;" -"瞷>jiàn|\\\ ;" -"瞼>jiǎn|\\\ ;" -"瞾>zhào|\\\ ;" -"矁>chǒu|\\\ ;" -"矃>nǐng|\\\ ;" -"矇>mēng|\\\ ;" -"矈>mián|\\\ ;" -"矊>máng|\\\ ;" -"矎>xuān|\\\ ;" -"矏>mián|\\\ ;" -"矒>méng|\\\ ;" -"矓>lóng|\\\ ;" -"矔>guàn|\\\ ;" -"矘>tǎng|\\\ ;" -"矟>shuò|\\\ ;" -"矤>shěn|\\\ ;" -"矨>yǐng|\\\ ;" -"矪>zhōu|\\\ ;" -"矯>jiǎo|\\\ ;" -"矰>zēng|\\\ ;" -"矴>dìng|\\\ ;" -"砊>kāng|\\\ ;" -"砜>fēng|\\\ ;" -"砯>pīng|\\\ ;" -"硁>kēng|\\\ ;" -"硂>quán|\\\ ;" -"硑>pēng|\\\ ;" -"硔>hóng|\\\ ;" -"硚>qiáo|\\\ ;" -"硜>kēng|\\\ ;" -"硞>láng|\\\ ;" -"硟>chàn|\\\ ;" -"硠>lǎng|\\\ ;" -"硡>hōng|\\\ ;" -"硣>xiāo|\\\ ;" -"硥>mǎng|\\\ ;" -"硦>lòng|\\\ ;" -"硧>yǒng|\\\ ;" -"硶>chěn|\\\ ;" -"硹>sōng|\\\ ;" -"硺>zhuó|\\\ ;" -"硻>kēng|\\\ ;" -"硾>zhuì|\\\ ;" -"硿>kōng|\\\ ;" -"碀>céng|\\\ ;" -"碂>zòng|\\\ ;" -"碃>qìng|\\\ ;" -"碊>jiān|\\\ ;" -"碐>líng|\\\ ;" -"碙>gāng|\\\ ;" -"碝>ruǎn|\\\ ;" -"碠>dìng|\\\ ;" -"碥>biǎn|\\\ ;" -"碩>shuò|\\\ ;" -"碪>zhēn|\\\ ;" -"碫>duàn|\\\ ;" -"碭>dàng|\\\ ;" -"碸>fēng|\\\ ;" -"碹>xuàn|\\\ ;" -"碽>gōng|\\\ ;" -"碿>pāng|\\\ ;" -"磄>táng|\\\ ;" -"磌>zhēn|\\\ ;" -"磘>qìng|\\\ ;" -"磛>chán|\\\ ;" -"磞>pēng|\\\ ;" -"磦>biāo|\\\ ;" -"磫>zōng|\\\ ;" -"磭>chuò|\\\ ;" -"磰>shàn|\\\ ;" -"磳>zēng|\\\ ;" -"磵>jiàn|\\\ ;" -"磸>dìng|\\\ ;" -"磹>diàn|\\\ ;" -"磽>qiāo|\\\ ;" -"礄>qiáo|\\\ ;" -"礆>xiǎn|\\\ ;" -"礈>zhuì|\\\ ;" -"礋>zhái|\\\ ;" -"礑>dàng|\\\ ;" -"礛>jiān|\\\ ;" -"礝>ruǎn|\\\ ;" -"礞>méng|\\\ ;" -"礥>xián|\\\ ;" -"礯>yīng|\\\ ;" -"礱>lóng|\\\ ;" -"礲>lóng|\\\ ;" -"礶>guàn|\\\ ;" -"礽>réng|\\\ ;" -"祊>bēng|\\\ ;" -"祒>tiáo|\\\ ;" -"祘>suàn|\\\ ;" -"祡>chái|\\\ ;" -"祩>zhài|\\\ ;" -"祱>shuì|\\\ ;" -"祳>chěn|\\\ ;" -"祼>guàn|\\\ ;" -"祾>líng|\\\ ;" -"禂>chán|\\\ ;" -"禈>chǎo|\\\ ;" -"禎>zhēn|\\\ ;" -"禐>yuàn|\\\ ;" -"禒>xiǎn|\\\ ;" -"禓>yáng|\\\ ;" -"禚>zhuó|\\\ ;" -"禛>zhēn|\\\ ;" -"禜>yǒng|\\\ ;" -"禟>táng|\\\ ;" -"禤>xuān|\\\ ;" -"禩>shàn|\\\ ;" -"禪>chán|\\\ ;" -"禯>nóng|\\\ ;" -"秈>xiān|\\\ ;" -"秊>nián|\\\ ;" -"秔>gēng|\\\ ;" -"秢>líng|\\\ ;" -"秥>nián|\\\ ;" -"秾>nóng|\\\ ;" -"稄>tuàn|\\\ ;" -"稅>shuì|\\\ ;" -"稆>jīng|\\\ ;" -"稉>gēng|\\\ ;" -"稏>lèng|\\\ ;" -"稕>zhùn|\\\ ;" -"稖>bàng|\\\ ;" -"稜>léng|\\\ ;" -"稟>bǐng|\\\ ;" -"稨>biān|\\\ ;" -"稯>chèn|\\\ ;" -"稱>chèn|\\\ ;" -"稴>lián|\\\ ;" -"稸>biān|\\\ ;" -"穅>kāng|\\\ ;" -"穇>shān|\\\ ;" -"穎>yǐng|\\\ ;" -"穘>xiāo|\\\ ;" -"穚>jiāo|\\\ ;" -"穛>zhuō|\\\ ;" -"穜>tóng|\\\ ;" -"穠>nóng|\\\ ;" -"穣>ráng|\\\ ;" -"穬>gǒng|\\\ ;" -"穮>biāo|\\\ ;" -"穽>jǐng|\\\ ;" -"窀>zhūn|\\\ ;" -"窆>biǎn|\\\ ;" -"窉>bǐng|\\\ ;" -"窌>jiào|\\\ ;" -"窎>diào|\\\ ;" -"窙>xiāo|\\\ ;" -"窡>zhuì|\\\ ;" -"窤>guān|\\\ ;" -"窱>tiào|\\\ ;" -"窲>cháo|\\\ ;" -"窴>tián|\\\ ;" -"窵>diào|\\\ ;" -"窼>zhāo|\\\ ;" -"窾>kuǎn|\\\ ;" -"竂>piáo|\\\ ;" -"竄>cuàn|\\\ ;" -"竅>qiào|\\\ ;" -"竉>lǒng|\\\ ;" -"竏>qiān|\\\ ;" -"竑>hóng|\\\ ;" -"竓>qiān|\\\ ;" -"竔>gōng|\\\ ;" -"竗>miào|\\\ ;" -"竚>bàng|\\\ ;" -"竛>líng|\\\ ;" -"竜>lóng|\\\ ;" -"竝>bìng|\\\ ;" -"竤>hóng|\\\ ;" -"竧>jìng|\\\ ;" -"竨>diào|\\\ ;" -"竫>jìng|\\\ ;" -"竮>píng|\\\ ;" -"竰>sháo|\\\ ;" -"竲>céng|\\\ ;" -"竳>dēng|\\\ ;" -"竵>huāi|\\\ ;" -"競>jìng|\\\ ;" -"竸>jìng|\\\ ;" -"竼>péng|\\\ ;" -"笀>máng|\\\ ;" -"笅>xiáo|\\\ ;" -"笇>suàn|\\\ ;" -"笉>zhěn|\\\ ;" -"笍>zhuì|\\\ ;" -"笎>yuán|\\\ ;" -"笐>gāng|\\\ ;" -"笗>dōng|\\\ ;" -"笘>shān|\\\ ;" -"笭>líng|\\\ ;" -"笾>biān|\\\ ;" -"筅>xiǎn|\\\ ;" -"筊>jiǎo|\\\ ;" -"筕>háng|\\\ ;" -"筜>dāng|\\\ ;" -"筡>jiàn|\\\ ;" -"筤>láng|\\\ ;" -"筦>guǎn|\\\ ;" -"筧>jiǎn|\\\ ;" -"筩>tǒng|\\\ ;" -"筭>suàn|\\\ ;" -"筳>tíng|\\\ ;" -"筻>gàng|\\\ ;" -"筿>xiǎo|\\\ ;" -"箉>guǎi|\\\ ;" -"箋>jiān|\\\ ;" -"箌>zhào|\\\ ;" -"箞>quān|\\\ ;" -"箠>chuí|\\\ ;" -"箢>yuān|\\\ ;" -"箮>xuān|\\\ ;" -"箯>biān|\\\ ;" -"箲>xiǎn|\\\ ;" -"箳>píng|\\\ ;" -"箹>shuò|\\\ ;" -"箺>chǔn|\\\ ;" -"箽>dǒng|\\\ ;" -"箾>shuò|\\\ ;" -"篂>xīng|\\\ ;" -"篅>chuí|\\\ ;" -"篈>fēng|\\\ ;" -"篊>hóng|\\\ ;" -"篎>miǎo|\\\ ;" -"篏>qiàn|\\\ ;" -"篖>táng|\\\ ;" -"篘>chōu|\\\ ;" -"篟>qiàn|\\\ ;" -"篠>xiǎo|\\\ ;" -"篢>gōng|\\\ ;" -"篣>páng|\\\ ;" -"篧>zhuó|\\\ ;" -"篩>shāi|\\\ ;" -"篭>lóng|\\\ ;" -"篯>jiān|\\\ ;" -"篵>cōng|\\\ ;" -"篻>piào|\\\ ;" -"簁>chuò|\\\ ;" -"簅>chǎn|\\\ ;" -"簈>píng|\\\ ;" -"簉>chòu|\\\ ;" -"簎>xiǎo|\\\ ;" -"簐>niǎn|\\\ ;" -"簒>cuàn|\\\ ;" -"簘>xiāo|\\\ ;" -"簜>dàng|\\\ ;" -"簝>liáo|\\\ ;" -"簡>jiǎn|\\\ ;" -"簥>jiāo|\\\ ;" -"簫>xiāo|\\\ ;" -"簹>dāng|\\\ ;" -"簽>qiān|\\\ ;" -"簾>lián|\\\ ;" -"籈>zhēn|\\\ ;" -"籌>chóu|\\\ ;" -"籐>téng|\\\ ;" -"籕>lǒng|\\\ ;" -"籗>zhuó|\\\ ;" -"籘>téng|\\\ ;" -"籛>jiān|\\\ ;" -"籝>yíng|\\\ ;" -"籠>lóng|\\\ ;" -"籤>qiān|\\\ ;" -"籨>lián|\\\ ;" -"籩>biān|\\\ ;" -"籪>duàn|\\\ ;" -"籫>zuǎn|\\\ ;" -"籯>yíng|\\\ ;" -"籱>zhuó|\\\ ;" -"籶>shēn|\\\ ;" -"籸>shēn|\\\ ;" -"粁>qiān|\\\ ;" -"粇>kāng|\\\ ;" -"粠>hóng|\\\ ;" -"粡>tóng|\\\ ;" -"粯>xiàn|\\\ ;" -"糃>táng|\\\ ;" -"糄>biān|\\\ ;" -"糉>zòng|\\\ ;" -"糋>jiàn|\\\ ;" -"糛>táng|\\\ ;" -"糩>kuài|\\\ ;" -"糫>huán|\\\ ;" -"糭>zòng|\\\ ;" -"糮>xiàn|\\\ ;" -"糰>tuán|\\\ ;" -"糶>tiào|\\\ ;" -"糼>gōng|\\\ ;" -"紂>zhòu|\\\ ;" -"紅>hóng|\\\ ;" -"純>chún|\\\ ;" -"紘>hóng|\\\ ;" -"紡>fǎng|\\\ ;" -"紬>chóu|\\\ ;" -"紭>hóng|\\\ ;" -"紳>shēn|\\\ ;" -"紷>líng|\\\ ;" -"紹>shào|\\\ ;" -"紻>yāng|\\\ ;" -"紾>zhěn|\\\ ;" -"絃>xián|\\\ ;" -"経>jīng|\\\ ;" -"絎>háng|\\\ ;" -"絑>gèng|\\\ ;" -"絒>chóu|\\\ ;" -"絙>gēng|\\\ ;" -"絚>gēng|\\\ ;" -"絞>jiǎo|\\\ ;" -"絢>xuàn|\\\ ;" -"絣>bēng|\\\ ;" -"絧>juàn|\\\ ;" -"絨>róng|\\\ ;" -"絩>tiào|\\\ ;" -"絭>quàn|\\\ ;" -"統>tǒng|\\\ ;" -"絸>jiǎn|\\\ ;" -"絹>juàn|\\\ ;" -"絻>miǎn|\\\ ;" -"絼>zhěn|\\\ ;" -"綁>bǎng|\\\ ;" -"綂>tǒng|\\\ ;" -"綃>xiāo|\\\ ;" -"綄>huǎn|\\\ ;" -"綆>gěng|\\\ ;" -"綊>tíng|\\\ ;" -"綋>hóng|\\\ ;" -"綎>tīng|\\\ ;" -"經>jīng|\\\ ;" -"綘>féng|\\\ ;" -"綜>zōng|\\\ ;" -"綝>chēn|\\\ ;" -"綡>diào|\\\ ;" -"綢>chóu|\\\ ;" -"綣>quǎn|\\\ ;" -"綤>shào|\\\ ;" -"綧>zhǔn|\\\ ;" -"綪>qiàn|\\\ ;" -"綫>xiàn|\\\ ;" -"綬>shòu|\\\ ;" -"綱>gāng|\\\ ;" -"網>wǎng|\\\ ;" -"綳>bēng|\\\ ;" -"綴>chuò|\\\ ;" -"綻>zhàn|\\\ ;" -"綽>chuò|\\\ ;" -"綾>líng|\\\ ;" -"綿>mián|\\\ ;" -"緈>xìng|\\\ ;" -"総>zǒng|\\\ ;" -"緓>yīng|\\\ ;" -"緘>jiān|\\\ ;" -"線>xiàn|\\\ ;" -"緛>ruǎn|\\\ ;" -"緜>mián|\\\ ;" -"緞>duàn|\\\ ;" -"緢>miáo|\\\ ;" -"緣>yuán|\\\ ;" -"緤>biǎn|\\\ ;" -"編>biān|\\\ ;" -"緩>huǎn|\\\ ;" -"緪>gēng|\\\ ;" -"緫>cōng|\\\ ;" -"緬>miǎn|\\\ ;" -"緲>miǎo|\\\ ;" -"練>liàn|\\\ ;" -"緵>zōng|\\\ ;" -"緶>biàn|\\\ ;" -"緾>chán|\\\ ;" -"縁>yuán|\\\ ;" -"縂>zǒng|\\\ ;" -"縆>gēng|\\\ ;" -"縈>yíng|\\\ ;" -"縋>zhuì|\\\ ;" -"縍>bāng|\\\ ;" -"縐>zhòu|\\\ ;" -"縑>jiān|\\\ ;" -"縓>quǎn|\\\ ;" -"縘>chēn|\\\ ;" -"縙>róng|\\\ ;" -"縝>zhěn|\\\ ;" -"縢>téng|\\\ ;" -"縣>xiàn|\\\ ;" -"縤>cóng|\\\ ;" -"縥>zhěn|\\\ ;" -"縦>zòng|\\\ ;" -"縧>fèng|\\\ ;" -"縫>féng|\\\ ;" -"縰>cóng|\\\ ;" -"縱>zōng|\\\ ;" -"縴>qiàn|\\\ ;" -"縹>piǎo|\\\ ;" -"縺>lián|\\\ ;" -"縼>xuàn|\\\ ;" -"總>zǒng|\\\ ;" -"縿>shān|\\\ ;" -"繂>běng|\\\ ;" -"繃>bēng|\\\ ;" -"繆>miào|\\\ ;" -"繏>xuàn|\\\ ;" -"繑>céng|\\\ ;" -"繒>zēng|\\\ ;" -"繕>shàn|\\\ ;" -"繚>liáo|\\\ ;" -"繛>chāo|\\\ ;" -"繝>jiàn|\\\ ;" -"繟>chǎn|\\\ ;" -"繤>zuǎn|\\\ ;" -"繬>huàn|\\\ ;" -"繭>jiǎn|\\\ ;" -"繯>huán|\\\ ;" -"繰>qiāo|\\\ ;" -"繱>cōng|\\\ ;" -"繳>jiǎo|\\\ ;" -"繵>chán|\\\ ;" -"繾>qiǎn|\\\ ;" -"纄>péng|\\\ ;" -"纉>zuǎn|\\\ ;" -"纎>ráng|\\\ ;" -"纏>chán|\\\ ;" -"纒>chán|\\\ ;" -"纓>yīng|\\\ ;" -"纖>xiān|\\\ ;" -"纘>zuǎn|\\\ ;" -"纜>jiǎo|\\\ ;" -"纞>liàn|\\\ ;" -"纮>hóng|\\\ ;" -"纻>zhèn|\\\ ;" -"缐>biàn|\\\ ;" -"缾>píng|\\\ ;" -"罁>gāng|\\\ ;" -"罃>yīng|\\\ ;" -"罆>guàn|\\\ ;" -"罋>wèng|\\\ ;" -"罌>yīng|\\\ ;" -"罒>wǎng|\\\ ;" -"罓>gāng|\\\ ;" -"罥>juàn|\\\ ;" -"罺>chāo|\\\ ;" -"罿>tóng|\\\ ;" -"羂>juàn|\\\ ;" -"羄>zhào|\\\ ;" -"羉>luán|\\\ ;" -"羏>yáng|\\\ ;" -"羕>yàng|\\\ ;" -"羘>zāng|\\\ ;" -"羠>xiàn|\\\ ;" -"羢>róng|\\\ ;" -"羦>huán|\\\ ;" -"羨>xiàn|\\\ ;" -"羬>xián|\\\ ;" -"羮>gēng|\\\ ;" -"羱>yuán|\\\ ;" -"羴>shān|\\\ ;" -"羶>shān|\\\ ;" -"羷>liǎn|\\\ ;" -"翃>hóng|\\\ ;" -"翐>qiào|\\\ ;" -"翝>hóng|\\\ ;" -"翧>xuān|\\\ ;" -"翪>zōng|\\\ ;" -"翲>piāo|\\\ ;" -"翴>lián|\\\ ;" -"翹>qiáo|\\\ ;" -"翾>xuān|\\\ ;" -"耎>ruǎn|\\\ ;" -"耓>tīng|\\\ ;" -"耖>chào|\\\ ;" -"耲>huái|\\\ ;" -"耴>dīng|\\\ ;" -"耾>hóng|\\\ ;" -"聄>zhěn|\\\ ;" -"聙>jīng|\\\ ;" -"聠>píng|\\\ ;" -"聡>cōng|\\\ ;" -"聤>tíng|\\\ ;" -"聦>cōng|\\\ ;" -"聫>lián|\\\ ;" -"聬>wěng|\\\ ;" -"聮>lián|\\\ ;" -"聯>lián|\\\ ;" -"聰>cōng|\\\ ;" -"聳>sǒng|\\\ ;" -"聴>tīng|\\\ ;" -"聹>níng|\\\ ;" -"聼>tīng|\\\ ;" -"聽>tīng|\\\ ;" -"聾>lóng|\\\ ;" -"肁>zhào|\\\ ;" -"肈>zhào|\\\ ;" -"肒>huán|\\\ ;" -"肙>yuān|\\\ ;" -"肨>pàng|\\\ ;" -"肷>qiān|\\\ ;" -"肻>chēn|\\\ ;" -"肼>jǐng|\\\ ;" -"胋>tián|\\\ ;" -"胓>píng|\\\ ;" -"胦>kēng|\\\ ;" -"胮>páng|\\\ ;" -"胻>héng|\\\ ;" -"脁>tiǎo|\\\ ;" -"脛>jìng|\\\ ;" -"脝>hēng|\\\ ;" -"脠>chān|\\\ ;" -"脡>tǐng|\\\ ;" -"脣>chún|\\\ ;" -"脤>shèn|\\\ ;" -"脥>qiǎn|\\\ ;" -"脧>juān|\\\ ;" -"脲>niào|\\\ ;" -"脽>zhōu|\\\ ;" -"脿>biāo|\\\ ;" -"腀>juàn|\\\ ;" -"腁>pián|\\\ ;" -"腎>shèn|\\\ ;" -"腏>chuò|\\\ ;" -"腖>dòng|\\\ ;" -"腙>zōng|\\\ ;" -"腝>ruǎn|\\\ ;" -"腳>jiǎo|\\\ ;" -"腶>duàn|\\\ ;" -"膁>lián|\\\ ;" -"膅>táng|\\\ ;" -"膇>zhuì|\\\ ;" -"膋>liáo|\\\ ;" -"膐>biāo|\\\ ;" -"膖>pāng|\\\ ;" -"膠>jiāo|\\\ ;" -"膥>chūn|\\\ ;" -"膧>pèng|\\\ ;" -"膫>liáo|\\\ ;" -"膮>xiāo|\\\ ;" -"膯>tēng|\\\ ;" -"膾>kuài|\\\ ;" -"膿>nóng|\\\ ;" -"臁>lián|\\\ ;" -"臇>juǎn|\\\ ;" -"臉>liǎn|\\\ ;" -"臓>zàng|\\\ ;" -"臔>xiàn|\\\ ;" -"臕>biāo|\\\ ;" -"臗>kuān|\\\ ;" -"臜>zāng|\\\ ;" -"臟>zàng|\\\ ;" -"臠>luán|\\\ ;" -"臢>zāng|\\\ ;" -"臤>qiān|\\\ ;" -"臫>jiǎo|\\\ ;" -"臰>chòu|\\\ ;" -"臱>mián|\\\ ;" -"臶>jiàn|\\\ ;" -"臽>xiàn|\\\ ;" -"舃>qiǎo|\\\ ;" -"興>xīng|\\\ ;" -"舘>guǎn|\\\ ;" -"舲>líng|\\\ ;" -"舼>hóng|\\\ ;" -"舽>páng|\\\ ;" -"艂>féng|\\\ ;" -"艆>láng|\\\ ;" -"艌>niàn|\\\ ;" -"艐>zōng|\\\ ;" -"艑>biàn|\\\ ;" -"艕>bàng|\\\ ;" -"艙>cāng|\\\ ;" -"艡>dāng|\\\ ;" -"艦>jiàn|\\\ ;" -"艬>chán|\\\ ;" -"艱>jiān|\\\ ;" -"艵>píng|\\\ ;" -"艼>dǐng|\\\ ;" -"芁>jiāo|\\\ ;" -"芃>chāi|\\\ ;" -"芆>chāi|\\\ ;" -"芿>huán|\\\ ;" -"苀>háng|\\\ ;" -"苁>cōng|\\\ ;" -"苖>miáo|\\\ ;" -"苚>yòng|\\\ ;" -"苨>chān|\\\ ;" -"苪>bǐng|\\\ ;" -"苮>xiān|\\\ ;" -"苰>hóng|\\\ ;" -"苳>dōng|\\\ ;" -"茘>jiàn|\\\ ;" -"茙>róng|\\\ ;" -"茝>chǎi|\\\ ;" -"茞>chén|\\\ ;" -"茻>mǎng|\\\ ;" -"茼>tóng|\\\ ;" -"荁>huán|\\\ ;" -"荊>jīng|\\\ ;" -"荍>shōu|\\\ ;" -"荓>pīng|\\\ ;" -"荭>hóng|\\\ ;" -"荮>zhòu|\\\ ;" -"莀>chén|\\\ ;" -"莄>gěng|\\\ ;" -"莐>chén|\\\ ;" -"莑>fēng|\\\ ;" -"莔>méng|\\\ ;" -"莕>xìng|\\\ ;" -"莖>jīng|\\\ ;" -"莛>tíng|\\\ ;" -"莣>wáng|\\\ ;" -"莦>shāo|\\\ ;" -"莧>xiàn|\\\ ;" -"莬>miǎn|\\\ ;" -"莶>liǎn|\\\ ;" -"莾>mǎng|\\\ ;" -"菃>guān|\\\ ;" -"菄>dōng|\\\ ;" -"菗>chóu|\\\ ;" -"菙>chuí|\\\ ;" -"菚>zhàn|\\\ ;" -"菤>juǎn|\\\ ;" -"菪>dàng|\\\ ;" -"菮>gēng|\\\ ;" -"菵>péng|\\\ ;" -"菶>běng|\\\ ;" -"菺>jiān|\\\ ;" -"菾>tián|\\\ ;" -"萂>chǔn|\\\ ;" -"萅>chūn|\\\ ;" -"萈>huán|\\\ ;" -"萔>tiáo|\\\ ;" -"萠>méng|\\\ ;" -"萮>xuān|\\\ ;" -"萰>liàn|\\\ ;" -"萲>yuán|\\\ ;" -"萶>chǔn|\\\ ;" -"萷>xiāo|\\\ ;" -"萹>piān|\\\ ;" -"萾>yíng|\\\ ;" -"葂>miǎn|\\\ ;" -"葌>jiān|\\\ ;" -"葏>jīng|\\\ ;" -"葑>fēng|\\\ ;" -"葒>hóng|\\\ ;" -"葓>hóng|\\\ ;" -"葠>shēn|\\\ ;" -"葥>qián|\\\ ;" -"葮>duàn|\\\ ;" -"葲>quán|\\\ ;" -"葴>zhēn|\\\ ;" -"葶>tíng|\\\ ;" -"葼>zōng|\\\ ;" -"葾>yuān|\\\ ;" -"蒄>guān|\\\ ;" -"蒇>chǎn|\\\ ;" -"蒓>chún|\\\ ;" -"蒕>máng|\\\ ;" -"蒖>zhēn|\\\ ;" -"蒝>yuán|\\\ ;" -"蒧>diǎn|\\\ ;" -"蒨>qiàn|\\\ ;" -"蒬>yuān|\\\ ;" -"蒴>shuò|\\\ ;" -"蒶>cǎng|\\\ ;" -"蒼>cāng|\\\ ;" -"蓈>láng|\\\ ;" -"蓎>táng|\\\ ;" -"蓢>láng|\\\ ;" -"蓧>diào|\\\ ;" -"蓨>tiāo|\\\ ;" -"蓪>tōng|\\\ ;" -"蓮>lián|\\\ ;" -"蓯>cōng|\\\ ;" -"蓱>píng|\\\ ;" -"蓴>chún|\\\ ;" -"蔆>líng|\\\ ;" -"蔈>biāo|\\\ ;" -"蔙>xuàn|\\\ ;" -"蔥>cōng|\\\ ;" -"蔦>niǎo|\\\ ;" -"蔪>jiàn|\\\ ;" -"蔮>cáng|\\\ ;" -"蔯>chén|\\\ ;" -"蔳>qiàn|\\\ ;" -"蔵>zāng|\\\ ;" -"蔹>liàn|\\\ ;" -"蕄>méng|\\\ ;" -"蕆>chǎn|\\\ ;" -"蕇>diǎn|\\\ ;" -"蕋>jiāo|\\\ ;" -"蕎>qiáo|\\\ ;" -"蕑>jiān|\\\ ;" -"蕛>téng|\\\ ;" -"蕠>kuài|\\\ ;" -"蕣>shùn|\\\ ;" -"蕩>dàng|\\\ ;" -"蕫>dǒng|\\\ ;" -"蕭>xiāo|\\\ ;" -"蕯>lóng|\\\ ;" -"蕳>jiān|\\\ ;" -"蕶>líng|\\\ ;" -"蕽>nóng|\\\ ;" -"蕿>xuān|\\\ ;" -"薍>luàn|\\\ ;" -"薐>léng|\\\ ;" -"薓>shēn|\\\ ;" -"薕>lián|\\\ ;" -"薗>yuán|\\\ ;" -"薚>táng|\\\ ;" -"薟>liǎn|\\\ ;" -"薡>dǐng|\\\ ;" -"薦>jiàn|\\\ ;" -"薴>néng|\\\ ;" -"薵>chóu|\\\ ;" -"薸>piāo|\\\ ;" -"薻>cóng|\\\ ;" -"薼>chén|\\\ ;" -"薽>zhēn|\\\ ;" -"藀>yíng|\\\ ;" -"藂>còng|\\\ ;" -"藆>jiǎn|\\\ ;" -"藊>biǎn|\\\ ;" -"藋>diào|\\\ ;" -"藑>jiào|\\\ ;" -"藖>xián|\\\ ;" -"藠>xiào|\\\ ;" -"藧>biāo|\\\ ;" -"藨>biāo|\\\ ;" -"藮>qiáo|\\\ ;" -"藼>xuān|\\\ ;" -"藽>chèn|\\\ ;" -"蘉>máng|\\\ ;" -"蘐>xiān|\\\ ;" -"蘘>ráng|\\\ ;" -"蘚>xiǎn|\\\ ;" -"蘝>liàn|\\\ ;" -"蘞>lián|\\\ ;" -"蘟>lǒng|\\\ ;" -"蘡>yīng|\\\ ;" -"蘢>lóng|\\\ ;" -"蘦>líng|\\\ ;" -"蘨>huái|\\\ ;" -"蘯>dàng|\\\ ;" -"蘴>fēng|\\\ ;" -"蘹>huài|\\\ ;" -"蘾>huài|\\\ ;" -"虃>jiān|\\\ ;" -"虇>quǎn|\\\ ;" -"虈>xiāo|\\\ ;" -"虊>luán|\\\ ;" -"虓>xiāo|\\\ ;" -"虠>jiǎo|\\\ ;" -"虥>zhàn|\\\ ;" -"虦>zhàn|\\\ ;" -"虭>diāo|\\\ ;" -"虸>gòng|\\\ ;" -"蚄>bèng|\\\ ;" -"蚈>qiān|\\\ ;" -"蚟>wáng|\\\ ;" -"蚢>háng|\\\ ;" -"蚫>piáo|\\\ ;" -"蚲>píng|\\\ ;" -"蚿>xián|\\\ ;" -"蛁>diāo|\\\ ;" -"蛃>bǐng|\\\ ;" -"蛍>yíng|\\\ ;" -"蛖>máng|\\\ ;" -"蛝>xián|\\\ ;" -"蛢>píng|\\\ ;" -"蛥>gǒng|\\\ ;" -"蛧>wǎng|\\\ ;" -"蛬>gǒng|\\\ ;" -"蛵>xīng|\\\ ;" -"蜁>xuán|\\\ ;" -"蜄>zhèn|\\\ ;" -"蜆>xiǎn|\\\ ;" -"蜋>láng|\\\ ;" -"蜎>yuān|\\\ ;" -"蜔>diàn|\\\ ;" -"蜙>sōng|\\\ ;" -"蜯>bàng|\\\ ;" -"蜵>juǎn|\\\ ;" -"蜸>jīng|\\\ ;" -"蝀>dōng|\\\ ;" -"蝄>wǎng|\\\ ;" -"蝆>yǎng|\\\ ;" -"蝏>tíng|\\\ ;" -"蝒>mián|\\\ ;" -"蝖>xuān|\\\ ;" -"蝝>yuán|\\\ ;" -"蝡>ruǎn|\\\ ;" -"蝪>tāng|\\\ ;" -"蝬>zōng|\\\ ;" -"蝯>yuán|\\\ ;" -"蝿>yíng|\\\ ;" -"螉>wēng|\\\ ;" -"螊>lián|\\\ ;" -"螎>róng|\\\ ;" -"螢>yíng|\\\ ;" -"螣>téng|\\\ ;" -"螥>cāng|\\\ ;" -"螴>chén|\\\ ;" -"螶>bèng|\\\ ;" -"螸>chán|\\\ ;" -"螹>jiàn|\\\ ;" -"蟂>jiāo|\\\ ;" -"蟉>liào|\\\ ;" -"蟌>cōng|\\\ ;" -"蟏>xiāo|\\\ ;" -"蟚>péng|\\\ ;" -"蟛>péng|\\\ ;" -"蟜>jiǎo|\\\ ;" -"蟟>liáo|\\\ ;" -"蟬>chán|\\\ ;" -"蟭>jiāo|\\\ ;" -"蟷>dāng|\\\ ;" -"蟺>shàn|\\\ ;" -"蠄>měng|\\\ ;" -"蠅>yíng|\\\ ;" -"蠆>chài|\\\ ;" -"蠉>xuān|\\\ ;" -"蠎>mǎng|\\\ ;" -"蠑>róng|\\\ ;" -"蠒>jiǎn|\\\ ;" -"蠗>zhuó|\\\ ;" -"蠨>xiāo|\\\ ;" -"蠪>lóng|\\\ ;" -"蠬>lóng|\\\ ;" -"蠭>fēng|\\\ ;" -"蠯>bèng|\\\ ;" -"蠳>yīng|\\\ ;" -"蠸>quán|\\\ ;" -"衉>háng|\\\ ;" -"衏>yuàn|\\\ ;" -"衑>líng|\\\ ;" -"衒>xuàn|\\\ ;" -"衕>tòng|\\\ ;" -"衖>lòng|\\\ ;" -"衘>xián|\\\ ;" -"衠>zhūn|\\\ ;" -"袊>lǐng|\\\ ;" -"袑>shào|\\\ ;" -"袗>zhěn|\\\ ;" -"袨>xiàn|\\\ ;" -"裊>niǎo|\\\ ;" -"裐>juān|\\\ ;" -"裑>shēn|\\\ ;" -"裖>zhěn|\\\ ;" -"裗>liǎn|\\\ ;" -"裞>shuì|\\\ ;" -"裧>chān|\\\ ;" -"裫>yuàn|\\\ ;" -"裬>líng|\\\ ;" -"裯>chóu|\\\ ;" -"裷>yuān|\\\ ;" -"褉>piān|\\\ ;" -"褍>duān|\\\ ;" -"褑>yuàn|\\\ ;" -"褖>tuàn|\\\ ;" -"褢>huái|\\\ ;" -"褣>róng|\\\ ;" -"褤>yuàn|\\\ ;" -"褬>sǎng|\\\ ;" -"褭>niǎo|\\\ ;" -"褮>yīng|\\\ ;" -"褰>qiān|\\\ ;" -"褱>huái|\\\ ;" -"褳>lián|\\\ ;" -"褾>biǎo|\\\ ;" -"襇>jiǎn|\\\ ;" -"襉>jiàn|\\\ ;" -"襘>chān|\\\ ;" -"襛>nóng|\\\ ;" -"襜>chān|\\\ ;" -"襝>liàn|\\\ ;" -"襠>dāng|\\\ ;" -"襯>chèn|\\\ ;" -"襱>lóng|\\\ ;" -"襳>xiān|\\\ ;" -"襺>jiǎn|\\\ ;" -"覂>fěng|\\\ ;" -"覅>biào|\\\ ;" -"見>jiàn|\\\ ;" -"覌>guān|\\\ ;" -"覍>biàn|\\\ ;" -"覐>jiào|\\\ ;" -"覑>piǎn|\\\ ;" -"覘>zhān|\\\ ;" -"覜>tiào|\\\ ;" -"覝>lián|\\\ ;" -"覢>shǎn|\\\ ;" -"覥>tiǎn|\\\ ;" -"覭>míng|\\\ ;" -"覮>yíng|\\\ ;" -"覱>zhàn|\\\ ;" -"観>guān|\\\ ;" -"覴>dēng|\\\ ;" -"覵>jiàn|\\\ ;" -"覸>jiàn|\\\ ;" -"覹>jiào|\\\ ;" -"觀>guān|\\\ ;" -"觍>tiǎn|\\\ ;" -"觘>chào|\\\ ;" -"觪>xīng|\\\ ;" -"觲>xīng|\\\ ;" -"觵>gōng|\\\ ;" -"訁>hēng|\\\ ;" -"訂>dìng|\\\ ;" -"訆>jiào|\\\ ;" -"訋>diào|\\\ ;" -"訌>hóng|\\\ ;" -"訕>shàn|\\\ ;" -"訟>sòng|\\\ ;" -"訤>xiáo|\\\ ;" -"訦>chén|\\\ ;" -"訪>fǎng|\\\ ;" -"訬>chāo|\\\ ;" -"訮>xiān|\\\ ;" -"訷>shēn|\\\ ;" -"診>zhěn|\\\ ;" -"詃>quǎn|\\\ ;" -"詅>líng|\\\ ;" -"詋>zhòu|\\\ ;" -"詔>zhào|\\\ ;" -"評>píng|\\\ ;" -"詠>yǒng|\\\ ;" -"詨>jiāo|\\\ ;" -"詮>quán|\\\ ;" -"詵>shēn|\\\ ;" -"詶>chóu|\\\ ;" -"誁>běng|\\\ ;" -"誂>tiǎo|\\\ ;" -"誏>lǎng|\\\ ;" -"誔>tǐng|\\\ ;" -"誗>chán|\\\ ;" -"誙>héng|\\\ ;" -"誚>qiào|\\\ ;" -"誜>shuà|\\\ ;" -"誢>xiàn|\\\ ;" -"誦>sòng|\\\ ;" -"誩>jìng|\\\ ;" -"說>shuō|\\\ ;" -"誫>shuì|\\\ ;" -"説>shuō|\\\ ;" -"誰>shéi|\\\ ;" -"誴>cóng|\\\ ;" -"誵>xiáo|\\\ ;" -"誷>wǎng|\\\ ;" -"誸>xuán|\\\ ;" -"調>diào|\\\ ;" -"諁>chuò|\\\ ;" -"諂>chǎn|\\\ ;" -"諃>chēn|\\\ ;" -"諄>zhūn|\\\ ;" -"諈>zhuì|\\\ ;" -"請>qǐng|\\\ ;" -"諌>dǒng|\\\ ;" -"諑>zhuó|\\\ ;" -"諓>jiàn|\\\ ;" -"諗>shěn|\\\ ;" -"諘>biǎo|\\\ ;" -"諙>huài|\\\ ;" -"諚>pián|\\\ ;" -"諞>piǎn|\\\ ;" -"諠>xuān|\\\ ;" -"諪>tíng|\\\ ;" -"諫>jiàn|\\\ ;" -"諴>xián|\\\ ;" -"諶>chén|\\\ ;" -"諷>fèng|\\\ ;" -"諹>chǎo|\\\ ;" -"諻>hēng|\\\ ;" -"諼>xuān|\\\ ;" -"謄>téng|\\\ ;" -"謆>shàn|\\\ ;" -"謍>yíng|\\\ ;" -"謓>chēn|\\\ ;" -"謕>qiàn|\\\ ;" -"謗>bàng|\\\ ;" -"謙>qiān|\\\ ;" -"謜>yuàn|\\\ ;" -"謟>qǐng|\\\ ;" -"謤>biāo|\\\ ;" -"謥>còng|\\\ ;" -"謭>jiǎn|\\\ ;" -"謰>lián|\\\ ;" -"謶>zhuó|\\\ ;" -"謿>cháo|\\\ ;" -"譂>chǎn|\\\ ;" -"譄>zēng|\\\ ;" -"譍>yìng|\\\ ;" -"譑>jiǎo|\\\ ;" -"譙>qiáo|\\\ ;" -"譞>xuān|\\\ ;" -"譡>dǎng|\\\ ;" -"譣>qiān|\\\ ;" -"譥>jiào|\\\ ;" -"譧>lián|\\\ ;" -"譫>zhān|\\\ ;" -"譱>shàn|\\\ ;" -"譲>ràng|\\\ ;" -"譴>qiǎn|\\\ ;" -"譵>zhuì|\\\ ;" -"譸>zhōu|\\\ ;" -"譺>jiān|\\\ ;" -"譻>yīng|\\\ ;" -"譼>jiàn|\\\ ;" -"譾>jiǎn|\\\ ;" -"讂>xuàn|\\\ ;" -"讅>shěn|\\\ ;" -"讇>chǎn|\\\ ;" -"變>biàn|\\\ ;" -"讎>chóu|\\\ ;" -"讐>chóu|\\\ ;" -"讒>chán|\\\ ;" -"讓>ràng|\\\ ;" -"讖>chèn|\\\ ;" -"讙>huān|\\\ ;" -"讜>dǎng|\\\ ;" -"讝>hòng|\\\ ;" -"诪>zhōu|\\\ ;" -"谂>shěn|\\\ ;" -"谉>shěn|\\\ ;" -"谫>jiǎn|\\\ ;" -"谹>hóng|\\\ ;" -"谼>hóng|\\\ ;" -"谾>hōng|\\\ ;" -"豅>lóng|\\\ ;" -"豊>fēng|\\\ ;" -"豋>dēng|\\\ ;" -"豏>xiàn|\\\ ;" -"豐>fēng|\\\ ;" -"豜>jiān|\\\ ;" -"豣>jiān|\\\ ;" -"豲>huán|\\\ ;" -"豵>zōng|\\\ ;" -"豼>huān|\\\ ;" -"貆>huán|\\\ ;" -"貒>tuān|\\\ ;" -"貛>huān|\\\ ;" -"貞>zhēn|\\\ ;" -"貟>yuán|\\\ ;" -"貢>gòng|\\\ ;" -"貥>háng|\\\ ;" -"貫>guàn|\\\ ;" -"貵>piǎn|\\\ ;" -"貶>biǎn|\\\ ;" -"賆>pián|\\\ ;" -"賎>jiàn|\\\ ;" -"賏>yìng|\\\ ;" -"賑>zhèn|\\\ ;" -"賘>zāng|\\\ ;" -"賙>zhōu|\\\ ;" -"賝>chēn|\\\ ;" -"賟>tiǎn|\\\ ;" -"賡>gēng|\\\ ;" -"賢>xián|\\\ ;" -"賤>jiàn|\\\ ;" -"賨>cóng|\\\ ;" -"賩>cóng|\\\ ;" -"賵>fèng|\\\ ;" -"賶>càng|\\\ ;" -"賿>liáo|\\\ ;" -"贂>chěn|\\\ ;" -"贅>zhuì|\\\ ;" -"贆>biāo|\\\ ;" -"贈>zèng|\\\ ;" -"贍>shàn|\\\ ;" -"贏>yíng|\\\ ;" -"贓>zāng|\\\ ;" -"贙>xuàn|\\\ ;" -"贚>lòng|\\\ ;" -"贠>yuán|\\\ ;" -"赒>zhōu|\\\ ;" -"赗>fèng|\\\ ;" -"赯>táng|\\\ ;" -"赸>shàn|\\\ ;" -"赻>xiǎn|\\\ ;" -"趀>chén|\\\ ;" -"趂>chèn|\\\ ;" -"趈>zhān|\\\ ;" -"趒>diào|\\\ ;" -"趙>zhào|\\\ ;" -"趝>jiàn|\\\ ;" -"趠>chào|\\\ ;" -"趫>qiáo|\\\ ;" -"趬>qiáo|\\\ ;" -"趭>jiào|\\\ ;" -"趻>chěn|\\\ ;" -"趽>fàng|\\\ ;" -"跈>niǎn|\\\ ;" -"跧>quán|\\\ ;" -"跰>bèng|\\\ ;" -"踁>jìng|\\\ ;" -"踃>xiāo|\\\ ;" -"踇>làng|\\\ ;" -"踋>jiǎo|\\\ ;" -"踍>qiāo|\\\ ;" -"踐>jiàn|\\\ ;" -"踒>chuō|\\\ ;" -"踜>lèng|\\\ ;" -"踡>quán|\\\ ;" -"踫>pèng|\\\ ;" -"踳>chǔn|\\\ ;" -"踴>yǒng|\\\ ;" -"踷>duàn|\\\ ;" -"踸>chěn|\\\ ;" -"踺>jiàn|\\\ ;" -"踼>táng|\\\ ;" -"蹍>niǎn|\\\ ;" -"蹎>diān|\\\ ;" -"蹘>liáo|\\\ ;" -"蹚>tāng|\\\ ;" -"蹤>zōng|\\\ ;" -"蹥>lián|\\\ ;" -"蹨>niǎn|\\\ ;" -"蹺>qiāo|\\\ ;" -"蹻>qiāo|\\\ ;" -"躆>chuò|\\\ ;" -"躈>qiào|\\\ ;" -"躊>chóu|\\\ ;" -"躔>chán|\\\ ;" -"躖>duàn|\\\ ;" -"躘>lóng|\\\ ;" -"躚>xiān|\\\ ;" -"躟>ráng|\\\ ;" -"躥>cuān|\\\ ;" -"躦>zuān|\\\ ;" -"躳>gōng|\\\ ;" -"躴>láng|\\\ ;" -"躿>kāng|\\\ ;" -"軒>xuān|\\\ ;" -"軕>shān|\\\ ;" -"軙>chén|\\\ ;" -"軟>ruǎn|\\\ ;" -"軣>hōng|\\\ ;" -"軨>líng|\\\ ;" -"軫>zhěn|\\\ ;" -"軵>rǒng|\\\ ;" -"軸>zhóu|\\\ ;" -"軽>pēng|\\\ ;" -"軿>píng|\\\ ;" -"較>jiào|\\\ ;" -"輆>chūn|\\\ ;" -"輇>quán|\\\ ;" -"輈>zhōu|\\\ ;" -"輎>shāo|\\\ ;" -"輐>huǎn|\\\ ;" -"輑>qìng|\\\ ;" -"輕>qīng|\\\ ;" -"輖>léng|\\\ ;" -"輘>líng|\\\ ;" -"輚>zhàn|\\\ ;" -"輞>wǎng|\\\ ;" -"輟>chuò|\\\ ;" -"輣>péng|\\\ ;" -"輤>qiàn|\\\ ;" -"輦>niǎn|\\\ ;" -"輧>pián|\\\ ;" -"輨>guǎn|\\\ ;" -"輭>ruǎn|\\\ ;" -"輰>yáng|\\\ ;" -"輱>xián|\\\ ;" -"輴>chūn|\\\ ;" -"輷>hōng|\\\ ;" -"輾>zhǎn|\\\ ;" -"轅>yuán|\\\ ;" -"轈>cháo|\\\ ;" -"轎>jiào|\\\ ;" -"轏>zhàn|\\\ ;" -"轘>huàn|\\\ ;" -"轞>xiàn|\\\ ;" -"轟>hōng|\\\ ;" -"辀>zhōu|\\\ ;" -"辡>biàn|\\\ ;" -"辧>biàn|\\\ ;" -"辮>biàn|\\\ ;" -"辯>biàn|\\\ ;" -"農>nóng|\\\ ;" -"辳>nóng|\\\ ;" -"辴>zhěn|\\\ ;" -"辵>chuò|\\\ ;" -"辸>réng|\\\ ;" -"辺>biān|\\\ ;" -"辿>chān|\\\ ;" -"迋>wàng|\\\ ;" -"迍>zhūn|\\\ ;" -"迒>háng|\\\ ;" -"迧>chén|\\\ ;" -"迬>wǎng|\\\ ;" -"迵>tóng|\\\ ;" -"逕>jìng|\\\ ;" -"連>lián|\\\ ;" -"逬>bèng|\\\ ;" -"週>zhōu|\\\ ;" -"逴>chuò|\\\ ;" -"逺>yuǎn|\\\ ;" -"逿>dàng|\\\ ;" -"遉>zhēn|\\\ ;" -"遠>yuǎn|\\\ ;" -"遡>qiàn|\\\ ;" -"遦>guàn|\\\ ;" -"遷>qiān|\\\ ;" -"選>xuǎn|\\\ ;" -"遼>liáo|\\\ ;" -"邅>zhān|\\\ ;" -"邆>téng|\\\ ;" -"邉>biān|\\\ ;" -"邊>biān|\\\ ;" -"邍>yuán|\\\ ;" -"邖>káng|\\\ ;" -"邟>kàng|\\\ ;" -"邥>shěn|\\\ ;" -"邧>yuán|\\\ ;" -"邫>bāng|\\\ ;" -"邴>bǐng|\\\ ;" -"郆>huán|\\\ ;" -"郉>xíng|\\\ ;" -"郞>láng|\\\ ;" -"郠>gěng|\\\ ;" -"郬>qīng|\\\ ;" -"郮>zhōu|\\\ ;" -"郱>píng|\\\ ;" -"郺>yōng|\\\ ;" -"郻>qiāo|\\\ ;" -"鄌>táng|\\\ ;" -"鄍>míng|\\\ ;" -"鄘>yōng|\\\ ;" -"鄛>cháo|\\\ ;" -"鄝>liǎo|\\\ ;" -"鄡>qiāo|\\\ ;" -"鄥>qiāo|\\\ ;" -"鄧>dèng|\\\ ;" -"鄫>céng|\\\ ;" -"鄶>kuài|\\\ ;" -"鄷>fēng|\\\ ;" -"鄸>méng|\\\ ;" -"鄻>liǎn|\\\ ;" -"鄽>chán|\\\ ;" -"酁>chán|\\\ ;" -"酄>huān|\\\ ;" -"酎>zhòu|\\\ ;" -"酙>zhēn|\\\ ;" -"酟>tiān|\\\ ;" -"酧>chóu|\\\ ;" -"醆>zhǎn|\\\ ;" -"醊>chuò|\\\ ;" -"醕>chún|\\\ ;" -"醜>chǒu|\\\ ;" -"醟>yòng|\\\ ;" -"醥>piǎo|\\\ ;" -"醦>shǎn|\\\ ;" -"醲>nóng|\\\ ;" -"醶>jiào|\\\ ;" -"醻>chóu|\\\ ;" -"醽>líng|\\\ ;" -"釂>jiào|\\\ ;" -"釆>biàn|\\\ ;" -"釕>liǎo|\\\ ;" -"釗>zhāo|\\\ ;" -"釘>dīng|\\\ ;" -"針>zhēn|\\\ ;" -"釠>luàn|\\\ ;" -"釣>diào|\\\ ;" -"釤>shān|\\\ ;" -"釭>gāng|\\\ ;" -"釯>máng|\\\ ;" -"釵>chāi|\\\ ;" -"釺>qiān|\\\ ;" -"釼>jiàn|\\\ ;" -"鈁>fāng|\\\ ;" -"鈂>chén|\\\ ;" -"鈃>xíng|\\\ ;" -"鈐>qián|\\\ ;" -"鈓>chǎo|\\\ ;" -"鈔>chāo|\\\ ;" -"鈜>hóng|\\\ ;" -"鈧>kàng|\\\ ;" -"鈴>líng|\\\ ;" -"鈵>bìng|\\\ ;" -"鈿>diàn|\\\ ;" -"鉆>zuān|\\\ ;" -"鉊>zhāo|\\\ ;" -"鉗>qián|\\\ ;" -"鉙>zhǎi|\\\ ;" -"鉛>qiān|\\\ ;" -"鉠>yāng|\\\ ;" -"鉮>shēn|\\\ ;" -"鉵>tóng|\\\ ;" -"鉶>xíng|\\\ ;" -"鉷>hóng|\\\ ;" -"鉸>jiǎo|\\\ ;" -"鉼>bǐng|\\\ ;" -"銂>zhōu|\\\ ;" -"銅>tóng|\\\ ;" -"銏>shàn|\\\ ;" -"銑>xiǎn|\\\ ;" -"銒>xíng|\\\ ;" -"銓>quán|\\\ ;" -"銘>míng|\\\ ;" -"銚>diào|\\\ ;" -"銛>xiān|\\\ ;" -"銜>xián|\\\ ;" -"銭>qián|\\\ ;" -"銱>diào|\\\ ;" -"銵>kēng|\\\ ;" -"銷>xiāo|\\\ ;" -"銺>zàng|\\\ ;" -"銾>gǒng|\\\ ;" -"鋃>láng|\\\ ;" -"鋋>chán|\\\ ;" -"鋌>dìng|\\\ ;" -"鋐>hóng|\\\ ;" -"鋑>cuān|\\\ ;" -"鋒>fēng|\\\ ;" -"鋓>chān|\\\ ;" -"鋗>xuān|\\\ ;" -"鋛>gǒng|\\\ ;" -"鋜>zhuó|\\\ ;" -"鋞>xíng|\\\ ;" -"鋟>qiān|\\\ ;" -"鋠>shèn|\\\ ;" -"鋥>zèng|\\\ ;" -"鋩>máng|\\\ ;" -"鋺>yuān|\\\ ;" -"鋻>jiàn|\\\ ;" -"鋼>gāng|\\\ ;" -"鋽>diào|\\\ ;" -"錈>bèng|\\\ ;" -"錋>péng|\\\ ;" -"錐>zhuī|\\\ ;" -"錘>chuí|\\\ ;" -"錝>chún|\\\ ;" -"錞>chún|\\\ ;" -"錠>dìng|\\\ ;" -"錢>qián|\\\ ;" -"錣>zhuì|\\\ ;" -"錧>guǎn|\\\ ;" -"錪>tiǎn|\\\ ;" -"錬>diāo|\\\ ;" -"錱>zhēn|\\\ ;" -"錳>měng|\\\ ;" -"錶>biǎo|\\\ ;" -"鍁>xiān|\\\ ;" -"鍊>liàn|\\\ ;" -"鍌>xiǎn|\\\ ;" -"鍐>cōng|\\\ ;" -"鍖>chěn|\\\ ;" -"鍙>hòng|\\\ ;" -"鍚>yáng|\\\ ;" -"鍛>duàn|\\\ ;" -"鍞>kēng|\\\ ;" -"鍟>xīng|\\\ ;" -"鍣>zhāo|\\\ ;" -"鍧>hōng|\\\ ;" -"鍩>tiǎn|\\\ ;" -"鍫>qiāo|\\\ ;" -"鍬>qiāo|\\\ ;" -"鍯>cōng|\\\ ;" -"鍰>huán|\\\ ;" -"鍳>jiàn|\\\ ;" -"鍴>duān|\\\ ;" -"鍵>jiàn|\\\ ;" -"鍹>xuān|\\\ ;" -"鍼>zhēn|\\\ ;" -"鍽>biān|\\\ ;" -"鎈>chuō|\\\ ;" -"鎊>bàng|\\\ ;" -"鎌>lián|\\\ ;" -"鎓>wēng|\\\ ;" -"鎔>róng|\\\ ;" -"鎕>táng|\\\ ;" -"鎚>chuí|\\\ ;" -"鎟>sǎng|\\\ ;" -"鎠>gāng|\\\ ;" -"鎥>tiáo|\\\ ;" -"鎪>jiǎn|\\\ ;" -"鎭>tián|\\\ ;" -"鎮>zhèn|\\\ ;" -"鎯>láng|\\\ ;" -"鎱>yuán|\\\ ;" -"鎲>tǎng|\\\ ;" -"鎸>juān|\\\ ;" -"鏄>tuán|\\\ ;" -"鏆>guàn|\\\ ;" -"鏇>xuàn|\\\ ;" -"鏈>liàn|\\\ ;" -"鏒>qiāo|\\\ ;" -"鏓>cōng|\\\ ;" -"鏔>biāo|\\\ ;" -"鏗>kēng|\\\ ;" -"鏜>tāng|\\\ ;" -"鏞>yōng|\\\ ;" -"鏟>chǎn|\\\ ;" -"鏠>fēng|\\\ ;" -"鏡>jìng|\\\ ;" -"鏢>biāo|\\\ ;" -"鏥>jiàn|\\\ ;" -"鏦>cōng|\\\ ;" -"鏧>lóng|\\\ ;" -"鏩>jiàn|\\\ ;" -"鏮>kāng|\\\ ;" -"鏰>bèng|\\\ ;" -"鐄>héng|\\\ ;" -"鐈>qiáo|\\\ ;" -"鐉>quān|\\\ ;" -"鐊>yáng|\\\ ;" -"鐋>tàng|\\\ ;" -"鐌>liào|\\\ ;" -"鐎>jiāo|\\\ ;" -"鐐>liáo|\\\ ;" -"鐕>dèng|\\\ ;" -"鐗>jiǎn|\\\ ;" -"鐙>dèng|\\\ ;" -"鐛>yìng|\\\ ;" -"鐤>dǐng|\\\ ;" -"鐥>jiān|\\\ ;" -"鐧>jiǎn|\\\ ;" -"鐫>juān|\\\ ;" -"鐮>lián|\\\ ;" -"鐯>zhuó|\\\ ;" -"鐰>qiāo|\\\ ;" -"鐱>qiān|\\\ ;" -"鐲>zhuó|\\\ ;" -"鐶>huán|\\\ ;" -"鑁>zōng|\\\ ;" -"鑃>diào|\\\ ;" -"鑅>héng|\\\ ;" -"鑆>zhuì|\\\ ;" -"鑋>qìng|\\\ ;" -"鑍>yīng|\\\ ;" -"鑏>níng|\\\ ;" -"鑑>jiàn|\\\ ;" -"鑒>jiàn|\\\ ;" -"鑚>zuàn|\\\ ;" -"鑝>péng|\\\ ;" -"鑠>shuò|\\\ ;" -"鑡>chuò|\\\ ;" -"鑣>biāo|\\\ ;" -"鑨>lóng|\\\ ;" -"鑬>jiàn|\\\ ;" -"鑯>jiān|\\\ ;" -"鑱>chán|\\\ ;" -"鑵>guàn|\\\ ;" -"鑶>cáng|\\\ ;" -"鑹>cuàn|\\\ ;" -"鑽>zuān|\\\ ;" -"鑾>luán|\\\ ;" -"钂>tǎng|\\\ ;" -"钌>diǎo|\\\ ;" -"钘>xíng|\\\ ;" -"铏>xíng|\\\ ;" -"铓>máng|\\\ ;" -"铦>xiān|\\\ ;" -"铴>tàng|\\\ ;" -"锓>qiān|\\\ ;" -"锳>yīng|\\\ ;" -"镋>tǎng|\\\ ;" -"镕>róng|\\\ ;" -"镚>bèng|\\\ ;" -"镟>xuàn|\\\ ;" -"镨>cuān|\\\ ;" -"镩>cuàn|\\\ ;" -"镮>huán|\\\ ;" -"镵>chán|\\\ ;" -"镽>liǎo|\\\ ;" -"閃>shǎn|\\\ ;" -"閌>kàng|\\\ ;" -"閍>bēng|\\\ ;" -"閎>hóng|\\\ ;" -"閑>xián|\\\ ;" -"閒>jiàn|\\\ ;" -"間>jiān|\\\ ;" -"閚>jiān|\\\ ;" -"閛>pēng|\\\ ;" -"閞>biàn|\\\ ;" -"関>guān|\\\ ;" -"閧>hòng|\\\ ;" -"閬>lǎng|\\\ ;" -"閮>tíng|\\\ ;" -"閳>chǎn|\\\ ;" -"闐>tián|\\\ ;" -"闗>guān|\\\ ;" -"關>guān|\\\ ;" -"闝>piáo|\\\ ;" -"闡>chǎn|\\\ ;" -"闣>dàng|\\\ ;" -"闤>huán|\\\ ;" -"阛>huán|\\\ ;" -"阬>kēng|\\\ ;" -"阭>juàn|\\\ ;" -"陃>bǐng|\\\ ;" -"陗>qiào|\\\ ;" -"陘>xíng|\\\ ;" -"陙>chún|\\\ ;" -"陜>shǎn|\\\ ;" -"陝>shǎn|\\\ ;" -"陣>zhèn|\\\ ;" -"陥>xiàn|\\\ ;" -"陳>chén|\\\ ;" -"険>xiǎn|\\\ ;" -"陽>yáng|\\\ ;" -"陾>réng|\\\ ;" -"陿>shǎn|\\\ ;" -"隚>táng|\\\ ;" -"隥>dèng|\\\ ;" -"險>xiǎn|\\\ ;" -"隴>lǒng|\\\ ;" -"隿>qiāo|\\\ ;" -"雈>huán|\\\ ;" -"雔>chóu|\\\ ;" -"雚>guàn|\\\ ;" -"雝>yōng|\\\ ;" -"雱>páng|\\\ ;" -"雺>méng|\\\ ;" -"電>diàn|\\\ ;" -"雼>dàng|\\\ ;" -"雽>xíng|\\\ ;" -"雿>zhào|\\\ ;" -"霃>chén|\\\ ;" -"霊>líng|\\\ ;" -"霌>chōu|\\\ ;" -"霐>wēng|\\\ ;" -"霑>zhān|\\\ ;" -"霔>chòu|\\\ ;" -"霘>dòng|\\\ ;" -"霙>yīng|\\\ ;" -"霛>líng|\\\ ;" -"霝>líng|\\\ ;" -"霟>hóng|\\\ ;" -"霥>mèng|\\\ ;" -"霯>dèng|\\\ ;" -"霳>lóng|\\\ ;" -"霶>páng|\\\ ;" -"霿>méng|\\\ ;" -"靇>lóng|\\\ ;" -"靈>líng|\\\ ;" -"靊>fēng|\\\ ;" -"靐>bìng|\\\ ;" -"靑>qīng|\\\ ;" -"靔>tiān|\\\ ;" -"靕>zhēn|\\\ ;" -"靘>qìng|\\\ ;" -"靚>jìng|\\\ ;" -"靜>jìng|\\\ ;" -"靝>tiān|\\\ ;" -"靣>miàn|\\\ ;" -"靦>miǎn|\\\ ;" -"靪>chāi|\\\ ;" -"靬>jiān|\\\ ;" -"鞃>hóng|\\\ ;" -"鞏>gǒng|\\\ ;" -"鞓>tīng|\\\ ;" -"鞕>shāo|\\\ ;" -"鞗>tiáo|\\\ ;" -"鞙>juān|\\\ ;" -"鞚>kòng|\\\ ;" -"鞛>běng|\\\ ;" -"鞞>bǐng|\\\ ;" -"鞤>bāng|\\\ ;" -"鞬>jiān|\\\ ;" -"鞺>tāng|\\\ ;" -"鞽>qiáo|\\\ ;" -"韀>jiān|\\\ ;" -"韂>chàn|\\\ ;" -"韅>xiǎn|\\\ ;" -"韆>qiān|\\\ ;" -"韉>jiān|\\\ ;" -"韏>juàn|\\\ ;" -"韒>qiào|\\\ ;" -"韯>xiān|\\\ ;" -"韱>xiān|\\\ ;" -"韸>péng|\\\ ;" -"韺>yīng|\\\ ;" -"韼>péng|\\\ ;" -"頂>dǐng|\\\ ;" -"頃>qǐng|\\\ ;" -"順>shùn|\\\ ;" -"頌>sòng|\\\ ;" -"頏>háng|\\\ ;" -"領>lǐng|\\\ ;" -"頚>jǐng|\\\ ;" -"頣>shěn|\\\ ;" -"頥>shěn|\\\ ;" -"頨>piān|\\\ ;" -"頩>pīng|\\\ ;" -"頲>tǐng|\\\ ;" -"頴>yǐng|\\\ ;" -"頶>gěng|\\\ ;" -"頸>gěng|\\\ ;" -"顀>chuí|\\\ ;" -"顁>dìng|\\\ ;" -"顅>jiān|\\\ ;" -"顒>yóng|\\\ ;" -"顕>tián|\\\ ;" -"願>yuàn|\\\ ;" -"顙>sǎng|\\\ ;" -"顚>diān|\\\ ;" -"顛>diān|\\\ ;" -"顟>liáo|\\\ ;" -"顠>piào|\\\ ;" -"顦>qiáo|\\\ ;" -"顩>qiān|\\\ ;" -"顫>zhàn|\\\ ;" -"顭>hōng|\\\ ;" -"顯>xiǎn|\\\ ;" -"顴>quán|\\\ ;" -"颋>tian|\\\ ;" -"颕>yǐng|\\\ ;" -"風>fēng|\\\ ;" -"颩>biāo|\\\ ;" -"颭>zhǎn|\\\ ;" -"颮>biāo|\\\ ;" -"颴>xuàn|\\\ ;" -"颵>shào|\\\ ;" -"颺>yáng|\\\ ;" -"飂>liáo|\\\ ;" -"飃>biāo|\\\ ;" -"飄>piāo|\\\ ;" -"飆>biāo|\\\ ;" -"飇>biāo|\\\ ;" -"飈>biǎo|\\\ ;" -"飉>liáo|\\\ ;" -"飌>fēng|\\\ ;" -"飍>biāo|\\\ ;" -"飐>zhǎn|\\\ ;" -"飑>biāo|\\\ ;" -"飣>dìng|\\\ ;" -"飦>zhān|\\\ ;" -"飬>juàn|\\\ ;" -"飵>zhǎi|\\\ ;" -"餂>tiǎn|\\\ ;" -"餃>jiǎo|\\\ ;" -"餅>bǐng|\\\ ;" -"餇>tóng|\\\ ;" -"養>yǎng|\\\ ;" -"餞>jiàn|\\\ ;" -"餟>zhuì|\\\ ;" -"餠>bǐng|\\\ ;" -"餡>xiàn|\\\ ;" -"館>guǎn|\\\ ;" -"餪>nuǎn|\\\ ;" -"餰>jiān|\\\ ;" -"餳>táng|\\\ ;" -"餸>sòng|\\\ ;" -"餹>táng|\\\ ;" -"饄>táng|\\\ ;" -"饍>shàn|\\\ ;" -"饘>zhān|\\\ ;" -"饛>méng|\\\ ;" -"饞>chán|\\\ ;" -"饡>zuàn|\\\ ;" -"饢>náng|\\\ ;" -"饤>dìng|\\\ ;" -"馢>jiān|\\\ ;" -"馦>xiān|\\\ ;" -"馫>xīng|\\\ ;" -"馮>féng|\\\ ;" -"駃>kuài|\\\ ;" -"駋>zhāo|\\\ ;" -"駌>yuān|\\\ ;" -"駍>pēng|\\\ ;" -"駎>zhòu|\\\ ;" -"駔>zǎng|\\\ ;" -"駗>zhēn|\\\ ;" -"駚>yǎng|\\\ ;" -"駢>pián|\\\ ;" -"駥>róng|\\\ ;" -"駧>dòng|\\\ ;" -"駩>quán|\\\ ;" -"駪>shēn|\\\ ;" -"駷>sǒng|\\\ ;" -"駹>máng|\\\ ;" -"駽>xuàn|\\\ ;" -"騂>xīng|\\\ ;" -"騅>zhuī|\\\ ;" -"騆>zhōu|\\\ ;" -"騌>zōng|\\\ ;" -"騗>piàn|\\\ ;" -"騘>cōng|\\\ ;" -"騙>piàn|\\\ ;" -"騚>qián|\\\ ;" -"騝>jiān|\\\ ;" -"騡>quán|\\\ ;" -"騣>zōng|\\\ ;" -"騫>qiān|\\\ ;" -"騯>páng|\\\ ;" -"騰>téng|\\\ ;" -"騵>yuán|\\\ ;" -"騸>shàn|\\\ ;" -"驃>piào|\\\ ;" -"驄>cōng|\\\ ;" -"驍>xiāo|\\\ ;" -"驏>chǎn|\\\ ;" -"驐>diàn|\\\ ;" -"驓>zēng|\\\ ;" -"驕>jiāo|\\\ ;" -"驙>zhān|\\\ ;" -"驚>jīng|\\\ ;" -"驡>péng|\\\ ;" -"驣>téng|\\\ ;" -"驩>huān|\\\ ;" -"驫>biāo|\\\ ;" -"驵>zǎng|\\\ ;" -"骉>biāo|\\\ ;" -"骔>zōng|\\\ ;" -"骣>chǎn|\\\ ;" -"骩>kǎng|\\\ ;" -"骹>qiāo|\\\ ;" -"骾>gěng|\\\ ;" -"骿>pián|\\\ ;" -"髃>bǎng|\\\ ;" -"髇>xiāo|\\\ ;" -"髈>páng|\\\ ;" -"髎>liáo|\\\ ;" -"髒>zāng|\\\ ;" -"髖>kuān|\\\ ;" -"髚>qiào|\\\ ;" -"髜>qiāo|\\\ ;" -"髣>fǎng|\\\ ;" -"髬>pēng|\\\ ;" -"髶>róng|\\\ ;" -"髸>gōng|\\\ ;" -"髼>péng|\\\ ;" -"髽>zhuā|\\\ ;" -"髾>shāo|\\\ ;" -"鬅>péng|\\\ ;" -"鬆>sōng|\\\ ;" -"鬉>zōng|\\\ ;" -"鬊>shùn|\\\ ;" -"鬋>jiān|\\\ ;" -"鬑>lián|\\\ ;" -"鬒>zhěn|\\\ ;" -"鬔>péng|\\\ ;" -"鬙>sēng|\\\ ;" -"鬜>qiān|\\\ ;" -"鬝>qiān|\\\ ;" -"鬞>nóng|\\\ ;" -"鬠>kuài|\\\ ;" -"鬡>hǒng|\\\ ;" -"鬤>ráng|\\\ ;" -"鬨>hòng|\\\ ;" -"鬳>juàn|\\\ ;" -"鬵>qián|\\\ ;" -"鬷>zōng|\\\ ;" -"魐>chóu|\\\ ;" -"魒>piāo|\\\ ;" -"魗>chǒu|\\\ ;" -"魙>zhǎn|\\\ ;" -"魟>gōng|\\\ ;" -"魡>diào|\\\ ;" -"魧>háng|\\\ ;" -"魫>shěn|\\\ ;" -"魴>fáng|\\\ ;" -"鮃>píng|\\\ ;" -"鮉>diāo|\\\ ;" -"鮏>xīng|\\\ ;" -"鮡>tiāo|\\\ ;" -"鮢>zhòu|\\\ ;" -"鮦>tóng|\\\ ;" -"鮩>bìng|\\\ ;" -"鮫>jiāo|\\\ ;" -"鮮>xiān|\\\ ;" -"鮸>miǎn|\\\ ;" -"鮹>shān|\\\ ;" -"鯁>gěng|\\\ ;" -"鯅>tíng|\\\ ;" -"鯇>huàn|\\\ ;" -"鯈>chóu|\\\ ;" -"鯍>méng|\\\ ;" -"鯒>yǒng|\\\ ;" -"鯖>qīng|\\\ ;" -"鯙>chún|\\\ ;" -"鯛>diāo|\\\ ;" -"鯞>zhǒu|\\\ ;" -"鯟>dōng|\\\ ;" -"鯨>jīng|\\\ ;" -"鯩>huàn|\\\ ;" -"鯪>líng|\\\ ;" -"鯭>měng|\\\ ;" -"鯮>zōng|\\\ ;" -"鯰>nián|\\\ ;" -"鯵>shēn|\\\ ;" -"鯹>xīng|\\\ ;" -"鯼>zōng|\\\ ;" -"鯾>biān|\\\ ;" -"鯿>biān|\\\ ;" -"鰀>huàn|\\\ ;" -"鰁>quán|\\\ ;" -"鰆>chūn|\\\ ;" -"鰊>liàn|\\\ ;" -"鰎>jiàn|\\\ ;" -"鰑>yáng|\\\ ;" -"鰔>jiǎn|\\\ ;" -"鰜>jiān|\\\ ;" -"鰟>fáng|\\\ ;" -"鰠>guān|\\\ ;" -"鰥>guān|\\\ ;" -"鰫>róng|\\\ ;" -"鰱>lián|\\\ ;" -"鰷>tiáo|\\\ ;" -"鰹>jiān|\\\ ;" -"鰾>biào|\\\ ;" -"鱅>yōng|\\\ ;" -"鱇>kāng|\\\ ;" -"鱎>jiǎo|\\\ ;" -"鱓>shàn|\\\ ;" -"鱔>shàn|\\\ ;" -"鱙>miáo|\\\ ;" -"鱞>guān|\\\ ;" -"鱠>kuài|\\\ ;" -"鱣>zhān|\\\ ;" -"鱵>zhēn|\\\ ;" -"鱹>guàn|\\\ ;" -"鲆>píng|\\\ ;" -"鲖>tóng|\\\ ;" -"鲗>jiāo|\\\ ;" -"鲙>kuài|\\\ ;" -"鲝>huàn|\\\ ;" -"鲬>yǒng|\\\ ;" -"鳈>quán|\\\ ;" -"鳑>fáng|\\\ ;" -"鳒>jiān|\\\ ;" -"鳣>zhān|\\\ ;" -"鳥>niǎo|\\\ ;" -"鳭>diāo|\\\ ;" -"鳯>fèng|\\\ ;" -"鳳>fèng|\\\ ;" -"鳴>míng|\\\ ;" -"鳶>yuān|\\\ ;" -"鳽>jiān|\\\ ;" -"鴅>huān|\\\ ;" -"鴆>zhèn|\\\ ;" -"鴋>fāng|\\\ ;" -"鴌>fèng|\\\ ;" -"鴒>líng|\\\ ;" -"鴘>biàn|\\\ ;" -"鴛>yuān|\\\ ;" -"鴞>xiāo|\\\ ;" -"鴦>yāng|\\\ ;" -"鴧>ròng|\\\ ;" -"鴪>háng|\\\ ;" -"鴬>yīng|\\\ ;" -"鴭>zhuī|\\\ ;" -"鴴>héng|\\\ ;" -"鴵>hòng|\\\ ;" -"鴻>hóng|\\\ ;" -"鵁>jiāo|\\\ ;" -"鵃>zhōu|\\\ ;" -"鵉>luán|\\\ ;" -"鵑>juān|\\\ ;" -"鵛>jīng|\\\ ;" -"鵢>shēn|\\\ ;" -"鵦>bìng|\\\ ;" -"鵧>píng|\\\ ;" -"鵫>fèng|\\\ ;" -"鵬>péng|\\\ ;" -"鵮>qiān|\\\ ;" -"鵰>diāo|\\\ ;" -"鵳>jiān|\\\ ;" -"鵷>yuān|\\\ ;" -"鵻>zhuī|\\\ ;" -"鵼>kōng|\\\ ;" -"鵽>zhuì|\\\ ;" -"鶁>jīng|\\\ ;" -"鶄>jīng|\\\ ;" -"鶇>dōng|\\\ ;" -"鶉>chún|\\\ ;" -"鶊>gēng|\\\ ;" -"鶓>miáo|\\\ ;" -"鶞>chūn|\\\ ;" -"鶣>piān|\\\ ;" -"鶧>yīng|\\\ ;" -"鶬>cāng|\\\ ;" -"鶭>fǎng|\\\ ;" -"鶯>yīng|\\\ ;" -"鶰>yuán|\\\ ;" -"鶱>xuān|\\\ ;" -"鶲>wēng|\\\ ;" -"鶶>táng|\\\ ;" -"鶼>jiān|\\\ ;" -"鷆>tián|\\\ ;" -"鷍>jiāo|\\\ ;" -"鷏>tián|\\\ ;" -"鷐>chén|\\\ ;" -"鷚>liáo|\\\ ;" -"鷛>róng|\\\ ;" -"鷟>zhuó|\\\ ;" -"鷤>quán|\\\ ;" -"鷦>jiāo|\\\ ;" -"鷮>jiāo|\\\ ;" -"鷯>liáo|\\\ ;" -"鷳>xián|\\\ ;" -"鷴>xián|\\\ ;" -"鷹>yīng|\\\ ;" -"鷻>tuán|\\\ ;" -"鷼>xián|\\\ ;" -"鸇>zhān|\\\ ;" -"鸉>yáng|\\\ ;" -"鸎>yīng|\\\ ;" -"鸏>méng|\\\ ;" -"鸗>lóng|\\\ ;" -"鸚>yīng|\\\ ;" -"鸛>guàn|\\\ ;" -"鸜>diǎo|\\\ ;" -"鸞>luán|\\\ ;" -"鸧>cāng|\\\ ;" -"鸮>xiāo|\\\ ;" -"鸰>líng|\\\ ;" -"鸻>héng|\\\ ;" -"鸼>zhāo|\\\ ;" -"鹋>miáo|\\\ ;" -"鹐>qiān|\\\ ;" -"鹒>gēng|\\\ ;" -"鹓>yuān|\\\ ;" -"鹟>wēng|\\\ ;" -"鹨>liáo|\\\ ;" -"鹮>xuán|\\\ ;" -"鹯>zhān|\\\ ;" -"鹲>méng|\\\ ;" -"鹷>líng|\\\ ;" -"鹸>jiǎn|\\\ ;" -"鹹>xián|\\\ ;" -"鹻>jiǎn|\\\ ;" -"鹼>jiǎn|\\\ ;" -"麃>biāo|\\\ ;" -"麅>biāo|\\\ ;" -"麉>jiān|\\\ ;" -"麎>chén|\\\ ;" -"麖>jīng|\\\ ;" -"麠>jīng|\\\ ;" -"麢>líng|\\\ ;" -"麨>chǎo|\\\ ;" -"麪>miǎn|\\\ ;" -"麫>miǎn|\\\ ;" -"麲>xiàn|\\\ ;" -"麵>miàn|\\\ ;" -"麷>fēng|\\\ ;" -"麺>miàn|\\\ ;" -"黇>tiān|\\\ ;" -"黉>héng|\\\ ;" -"黌>héng|\\\ ;" -"黗>tuǎn|\\\ ;" -"黚>qián|\\\ ;" -"點>diǎn|\\\ ;" -"黨>dǎng|\\\ ;" -"黰>zhěn|\\\ ;" -"黿>yuán|\\\ ;" -"鼂>cháo|\\\ ;" -"鼃>měng|\\\ ;" -"鼆>máng|\\\ ;" -"鼌>cháo|\\\ ;" -"鼑>dǐng|\\\ ;" -"鼕>dōng|\\\ ;" -"鼘>yuān|\\\ ;" -"鼝>yuān|\\\ ;" -"鼞>tāng|\\\ ;" -"鼟>tēng|\\\ ;" -"鼦>diāo|\\\ ;" -"鼨>tóng|\\\ ;" -"鼮>tíng|\\\ ;" -"鼰>niàn|\\\ ;" -"鼱>jīng|\\\ ;" -"齆>wèng|\\\ ;" -"齈>nóng|\\\ ;" -"齉>nàng|\\\ ;" -"齋>zhāi|\\\ ;" -"齓>chèn|\\\ ;" -"齔>chèn|\\\ ;" -"齛>chái|\\\ ;" -"齞>niàn|\\\ ;" -"齠>tiáo|\\\ ;" -"齡>líng|\\\ ;" -"齢>líng|\\\ ;" -"齤>quán|\\\ ;" -"齪>chuò|\\\ ;" -"齱>chuò|\\\ ;" -"齴>xiǎn|\\\ ;" -"齹>chuō|\\\ ;" -"齻>diān|\\\ ;" -"龍>lóng|\\\ ;" -"龏>gōng|\\\ ;" -"龐>páng|\\\ ;" -"龒>lóng|\\\ ;" -"龓>lóng|\\\ ;" -"龔>gōng|\\\ ;" -"龖>lǒng|\\\ ;" -"龗>líng|\\\ ;" -"龡>chuì|\\\ ;" -"𨺹>jiāo|\\\ ;" -"是>shì|\\\ ;" -"人>rén|\\\ ;" -"在>zài|\\\ ;" -"有>yǒu|\\\ ;" -"这>zhè|\\\ ;" -"来>lái|\\\ ;" -"国>guó|\\\ ;" -"到>dào|\\\ ;" -"们>men|\\\ ;" -"为>wèi|\\\ ;" -"出>chū|\\\ ;" -"道>dào|\\\ ;" -"时>shí|\\\ ;" -"就>jiù|\\\ ;" -"要>yào|\\\ ;" -"下>xià|\\\ ;" -"会>huì|\\\ ;" -"之>zhī|\\\ ;" -"过>guō|\\\ ;" -"家>jiā|\\\ ;" -"学>xué|\\\ ;" -"对>duì|\\\ ;" -"后>hòu|\\\ ;" -"心>xīn|\\\ ;" -"多>duō|\\\ ;" -"好>hǎo|\\\ ;" -"都>dōu|\\\ ;" -"然>rán|\\\ ;" -"没>méi|\\\ ;" -"事>shì|\\\ ;" -"只>zhī|\\\ ;" -"作>zuò|\\\ ;" -"看>kàn|\\\ ;" -"文>wén|\\\ ;" -"开>kāi|\\\ ;" -"十>shí|\\\ ;" -"主>zhǔ|\\\ ;" -"又>yòu|\\\ ;" -"所>suǒ|\\\ ;" -"本>běn|\\\ ;" -"头>tóu|\\\ ;" -"三>sān|\\\ ;" -"老>lǎo|\\\ ;" -"知>zhī|\\\ ;" -"民>mín|\\\ ;" -"分>fēn|\\\ ;" -"外>wài|\\\ ;" -"但>dàn|\\\ ;" -"些>xiē|\\\ ;" -"高>gāo|\\\ ;" -"进>jìn|\\\ ;" -"实>shí|\\\ ;" -"回>huí|\\\ ;" -"美>měi|\\\ ;" -"月>yuè|\\\ ;" -"话>huà|\\\ ;" -"者>zhě|\\\ ;" -"问>wèn|\\\ ;" -"给>gěi|\\\ ;" -"很>hěn|\\\ ;" -"最>zuì|\\\ ;" -"新>xīn|\\\ ;" -"什>shí|\\\ ;" -"位>wèi|\\\ ;" -"因>yīn|\\\ ;" -"被>bèi|\\\ ;" -"走>zǒu|\\\ ;" -"门>mén|\\\ ;" -"海>hǎi|\\\ ;" -"口>kǒu|\\\ ;" -"使>shǐ|\\\ ;" -"再>zài|\\\ ;" -"世>shì|\\\ ;" -"信>xìn|\\\ ;" -"北>běi|\\\ ;" -"内>nèi|\\\ ;" -"加>jiā|\\\ ;" -"化>huà|\\\ ;" -"由>yóu|\\\ ;" -"却>què|\\\ ;" -"代>dài|\\\ ;" -"军>jūn|\\\ ;" -"太>tài|\\\ ;" -"万>wàn|\\\ ;" -"市>shì|\\\ ;" -"眼>yǎn|\\\ ;" -"别>bié|\\\ ;" -"处>chù|\\\ ;" -"才>cái|\\\ ;" -"师>shī|\\\ ;" -"书>shū|\\\ ;" -"住>zhù|\\\ ;" -"九>jiǔ|\\\ ;" -"华>huá|\\\ ;" -"报>bào|\\\ ;" -"活>huó|\\\ ;" -"难>nán|\\\ ;" -"数>shù|\\\ ;" -"车>chē|\\\ ;" -"白>bái|\\\ ;" -"感>gǎn|\\\ ;" -"金>jīn|\\\ ;" -"反>fǎn|\\\ ;" -"做>zuò|\\\ ;" -"或>huò|\\\ ;" -"果>guǒ|\\\ ;" -"亲>qīn|\\\ ;" -"界>jiè|\\\ ;" -"今>jīn|\\\ ;" -"制>zhì|\\\ ;" -"解>jiě|\\\ ;" -"任>rèn|\\\ ;" -"至>zhì|\\\ ;" -"台>tái|\\\ ;" -"干>gàn|\\\ ;" -"接>jiē|\\\ ;" -"觉>jué|\\\ ;" -"直>zhí|\\\ ;" -"毛>máo|\\\ ;" -"林>lín|\\\ ;" -"南>nán|\\\ ;" -"认>rèn|\\\ ;" -"论>lùn|\\\ ;" -"百>bǎi|\\\ ;" -"吃>chī|\\\ ;" -"怎>zěn|\\\ ;" -"社>shè|\\\ ;" -"术>shù|\\\ ;" -"结>jié|\\\ ;" -"六>liù|\\\ ;" -"指>zhǐ|\\\ ;" -"非>fēi|\\\ ;" -"流>liú|\\\ ;" -"每>měi|\\\ ;" -"队>duì|\\\ ;" -"跟>gēn|\\\ ;" -"带>dài|\\\ ;" -"花>huā|\\\ ;" -"言>yán|\\\ ;" -"该>gāi|\\\ ;" -"近>jìn|\\\ ;" -"留>liú|\\\ ;" -"治>zhì|\\\ ;" -"决>jué|\\\ ;" -"保>bǎo|\\\ ;" -"办>bàn|\\\ ;" -"运>yùn|\\\ ;" -"半>bàn|\\\ ;" -"候>hòu|\\\ ;" -"完>wán|\\\ ;" -"求>qiú|\\\ ;" -"品>pǐn|\\\ ;" -"士>shì|\\\ ;" -"告>gào|\\\ ;" -"派>pài|\\\ ;" -"满>mǎn|\\\ ;" -"式>shì|\\\ ;" -"写>xiě|\\\ ;" -"识>shì|\\\ ;" -"倒>dǎo|\\\ ;" -"未>wèi|\\\ ;" -"持>chí|\\\ ;" -"设>shè|\\\ ;" -"始>shǐ|\\\ ;" -"版>bǎn|\\\ ;" -"越>yuè|\\\ ;" -"史>shǐ|\\\ ;" -"研>yán|\\\ ;" -"友>yǒu|\\\ ;" -"孩>hái|\\\ ;" -"改>gǎi|\\\ ;" -"委>wěi|\\\ ;" -"早>zǎo|\\\ ;" -"音>yīn|\\\ ;" -"火>huǒ|\\\ ;" -"单>dān|\\\ ;" -"导>dǎo|\\\ ;" -"失>shī|\\\ ;" -"石>shí|\\\ ;" -"若>ruò|\\\ ;" -"志>zhì|\\\ ;" -"飞>fēi|\\\ ;" -"究>jiū|\\\ ;" -"包>bāo|\\\ ;" -"造>zào|\\\ ;" -"落>luò|\\\ ;" -"视>shì|\\\ ;" -"虽>suī|\\\ ;" -"坐>zuò|\\\ ;" -"宝>bǎo|\\\ ;" -"谈>tán|\\\ ;" -"黑>hēi|\\\ ;" -"且>qiě|\\\ ;" -"随>suí|\\\ ;" -"尽>jǐn|\\\ ;" -"杀>shā|\\\ ;" -"微>wēi|\\\ ;" -"根>gēn|\\\ ;" -"切>qiē|\\\ ;" -"示>shì|\\\ ;" -"男>nán|\\\ ;" -"注>zhù|\\\ ;" -"费>fèi|\\\ ;" -"群>qún|\\\ ;" -"推>tuī|\\\ ;" -"晚>wǎn|\\\ ;" -"待>dāi|\\\ ;" -"约>yuē|\\\ ;" -"支>zhī|\\\ ;" -"号>háo|\\\ ;" -"绝>jué|\\\ ;" -"参>cān|\\\ ;" -"刊>kān|\\\ ;" -"类>lèi|\\\ ;" -"备>bèi|\\\ ;" -"势>shì|\\\ ;" -"般>bān|\\\ ;" -"价>jià|\\\ ;" -"脑>nǎo|\\\ ;" -"规>guī|\\\ ;" -"确>què|\\\ ;" -"紧>jǐn|\\\ ;" -"存>cún|\\\ ;" -"害>hài|\\\ ;" -"节>jié|\\\ ;" -"左>zuǒ|\\\ ;" -"著>zhù|\\\ ;" -"久>jiǔ|\\\ ;" -"岁>suì|\\\ ;" -"酒>jiǔ|\\\ ;" -"初>chū|\\\ ;" -"游>yóu|\\\ ;" -"严>yán|\\\ ;" -"铁>tiě|\\\ ;" -"除>chú|\\\ ;" -"份>fèn|\\\ ;" -"敢>gǎn|\\\ ;" -"血>xiě|\\\ ;" -"投>tóu|\\\ ;" -"闻>wén|\\\ ;" -"斗>dòu|\\\ ;" -"右>yòu|\\\ ;" -"饭>fàn|\\\ ;" -"云>yún|\\\ ;" -"考>kǎo|\\\ ;" -"村>cūn|\\\ ;" -"刀>dāo|\\\ ;" -"仅>jǐn|\\\ ;" -"查>chá|\\\ ;" -"引>yǐn|\\\ ;" -"罗>luó|\\\ ;" -"买>mǎi|\\\ ;" -"背>bèi|\\\ ;" -"卫>wèi|\\\ ;" -"列>liè|\\\ ;" -"室>shì|\\\ ;" -"刘>liú|\\\ ;" -"咱>zán|\\\ ;" -"错>cuò|\\\ ;" -"排>pái|\\\ ;" -"树>shù|\\\ ;" -"职>zhí|\\\ ;" -"态>tài|\\\ ;" -"印>yìn|\\\ ;" -"夏>xià|\\\ ;" -"助>zhù|\\\ ;" -"球>qiú|\\\ ;" -"划>huá|\\\ ;" -"质>zhí|\\\ ;" -"致>zhì|\\\ ;" -"湾>wān|\\\ ;" -"演>yǎn|\\\ ;" -"韦>wéi|\\\ ;" -"围>wéi|\\\ ;" -"否>fǒu|\\\ ;" -"采>cǎi|\\\ ;" -"食>shí|\\\ ;" -"够>gòu|\\\ ;" -"赛>sài|\\\ ;" -"假>jiǎ|\\\ ;" -"姐>jiě|\\\ ;" -"楼>lóu|\\\ ;" -"获>huò|\\\ ;" -"孙>sūn|\\\ ;" -"诗>shī|\\\ ;" -"试>shì|\\\ ;" -"谢>xiè|\\\ ;" -"验>yàn|\\\ ;" -"止>zhǐ|\\\ ;" -"属>shǔ|\\\ ;" -"郭>guō|\\\ ;" -"威>wēi|\\\ ;" -"慢>màn|\\\ ;" -"座>zuò|\\\ ;" -"罪>zuì|\\\ ;" -"维>wéi|\\\ ;" -"街>jiē|\\\ ;" -"施>shī|\\\ ;" -"草>cǎo|\\\ ;" -"某>mǒu|\\\ ;" -"银>yín|\\\ ;" -"值>zhí|\\\ ;" -"班>bān|\\\ ;" -"修>xiū|\\\ ;" -"差>chà|\\\ ;" -"味>wèi|\\\ ;" -"织>zhī|\\\ ;" -"药>yào|\\\ ;" -"归>guī|\\\ ;" -"救>jiù|\\\ ;" -"退>tuì|\\\ ;" -"劳>láo|\\\ ;" -"婚>hūn|\\\ ;" -"络>luò|\\\ ;" -"翻>fān|\\\ ;" -"跑>pǎo|\\\ ;" -"叶>xié|\\\ ;" -"均>jūn|\\\ ;" -"烈>liè|\\\ ;" -"赶>gǎn|\\\ ;" -"兰>lán|\\\ ;" -"画>huà|\\\ ;" -"顿>dùn|\\\ ;" -"判>pàn|\\\ ;" -"嘴>zuǐ|\\\ ;" -"察>chá|\\\ ;" -"优>yōu|\\\ ;" -"您>nín|\\\ ;" -"烟>yān|\\\ ;" -"阶>jiē|\\\ ;" -"担>dàn|\\\ ;" -"散>sǎn|\\\ ;" -"板>bǎn|\\\ ;" -"妹>mèi|\\\ ;" -"讨>tǎo|\\\ ;" -"临>lín|\\\ ;" -"摇>yáo|\\\ ;" -"构>gōu|\\\ ;" -"玩>wán|\\\ ;" -"犯>fàn|\\\ ;" -"肯>kěn|\\\ ;" -"协>xié|\\\ ;" -"挥>huī|\\\ ;" -"温>wēn|\\\ ;" -"肉>ròu|\\\ ;" -"纸>zhǐ|\\\ ;" -"寻>xún|\\\ ;" -"沙>shā|\\\ ;" -"卖>mài|\\\ ;" -"范>fàn|\\\ ;" -"靠>kào|\\\ ;" -"贵>guì|\\\ ;" -"稿>gǎo|\\\ ;" -"拍>pāi|\\\ ;" -"旧>jiù|\\\ ;" -"油>yóu|\\\ ;" -"雪>xuě|\\\ ;" -"菜>cài|\\\ ;" -"牌>pái|\\\ ;" -"牛>niú|\\\ ;" -"脱>tuō|\\\ ;" -"弹>dàn|\\\ ;" -"置>zhì|\\\ ;" -"楚>chǔ|\\\ ;" -"略>lüè|\\\ ;" -"智>zhì|\\\ ;" -"岛>dǎo|\\\ ;" -"抱>bào|\\\ ;" -"载>zài|\\\ ;" -"败>bài|\\\ ;" -"适>shì|\\\ ;" -"爹>diē|\\\ ;" -"纷>fēn|\\\ ;" -"介>jiè|\\\ ;" -"括>kuò|\\\ ;" -"奔>bēn|\\\ ;" -"忍>rěn|\\\ ;" -"盘>pán|\\\ ;" -"讯>xùn|\\\ ;" -"配>pèi|\\\ ;" -"禁>jìn|\\\ ;" -"索>suǒ|\\\ ;" -"架>jià|\\\ ;" -"托>tuō|\\\ ;" -"伙>huǒ|\\\ ;" -"毫>háo|\\\ ;" -"套>tào|\\\ ;" -"逃>táo|\\\ ;" -"输>shū|\\\ ;" -"困>kùn|\\\ ;" -"泪>lèi|\\\ ;" -"熟>shú|\\\ ;" -"财>cái|\\\ ;" -"鬼>guǐ|\\\ ;" -"秋>qiū|\\\ ;" -"秀>xiù|\\\ ;" -"搞>gǎo|\\\ ;" -"朱>zhū|\\\ ;" -"跃>yuè|\\\ ;" -"执>zhí|\\\ ;" -"悲>bēi|\\\ ;" -"辈>bèi|\\\ ;" -"隐>yǐn|\\\ ;" -"闹>nào|\\\ ;" -"材>cái|\\\ ;" -"腿>tuǐ|\\\ ;" -"述>shù|\\\ ;" -"尊>zūn|\\\ ;" -"借>jiè|\\\ ;" -"折>zhé|\\\ ;" -"暴>bào|\\\ ;" -"缺>quē|\\\ ;" -"探>tàn|\\\ ;" -"货>huò|\\\ ;" -"伟>wěi|\\\ ;" -"君>jūn|\\\ ;" -"凡>fán|\\\ ;" -"危>wēi|\\\ ;" -"彩>cǎi|\\\ ;" -"束>shù|\\\ ;" -"谓>wèi|\\\ ;" -"概>gài|\\\ ;" -"射>shè|\\\ ;" -"杯>bēi|\\\ ;" -"透>tòu|\\\ ;" -"邮>yóu|\\\ ;" -"休>xiū|\\\ ;" -"叹>tàn|\\\ ;" -"狗>gǒu|\\\ ;" -"偷>tōu|\\\ ;" -"阴>yīn|\\\ ;" -"拜>bài|\\\ ;" -"厚>hòu|\\\ ;" -"丹>dān|\\\ ;" -"洛>luò|\\\ ;" -"喊>hǎn|\\\ ;" -"轮>lún|\\\ ;" -"奶>nǎi|\\\ ;" -"淡>dàn|\\\ ;" -"训>xùn|\\\ ;" -"释>shì|\\\ ;" -"诸>zhū|\\\ ;" -"唯>wéi|\\\ ;" -"夺>duó|\\\ ;" -"逐>zhú|\\\ ;" -"燕>yàn|\\\ ;" -"呆>dāi|\\\ ;" -"盖>gài|\\\ ;" -"阅>yuè|\\\ ;" -"购>gòu|\\\ ;" -"挂>guà|\\\ ;" -"恨>hèn|\\\ ;" -"舍>shě|\\\ ;" -"竹>zhú|\\\ ;" -"弱>ruò|\\\ ;" -"含>hán|\\\ ;" -"址>zhǐ|\\\ ;" -"摆>bǎi|\\\ ;" -"番>fān|\\\ ;" -"混>hún|\\\ ;" -"灭>miè|\\\ ;" -"袋>dài|\\\ ;" -"赞>zàn|\\\ ;" -"茶>chá|\\\ ;" -"稳>wěn|\\\ ;" -"汇>huì|\\\ ;" -"届>jiè|\\\ ;" -"雷>léi|\\\ ;" -"寒>hán|\\\ ;" -"遭>zāo|\\\ ;" -"柔>róu|\\\ ;" -"戴>dài|\\\ ;" -"豪>háo|\\\ ;" -"瑞>ruì|\\\ ;" -"操>cāo|\\\ ;" -"腰>yāo|\\\ ;" -"梅>méi|\\\ ;" -"伦>lún|\\\ ;" -"诺>nuò|\\\ ;" -"残>cán|\\\ ;" -"延>yán|\\\ ;" -"迅>xùn|\\\ ;" -"灾>zāi|\\\ ;" -"岳>yuè|\\\ ;" -"珠>zhū|\\\ ;" -"叔>shū|\\\ ;" -"谋>móu|\\\ ;" -"础>chǔ|\\\ ;" -"仁>rén|\\\ ;" -"损>sǔn|\\\ ;" -"敏>mǐn|\\\ ;" -"累>lèi|\\\ ;" -"伴>bàn|\\\ ;" -"奋>fèn|\\\ ;" -"胆>dǎn|\\\ ;" -"烦>fán|\\\ ;" -"犹>yóu|\\\ ;" -"培>péi|\\\ ;" -"乃>nǎi|\\\ ;" -"遥>yáo|\\\ ;" -"坦>tǎn|\\\ ;" -"後>hòu|\\\ ;" -"眉>méi|\\\ ;" -"餐>cān|\\\ ;" -"抬>tái|\\\ ;" -"冒>mào|\\\ ;" -"汗>hàn|\\\ ;" -"灰>huī|\\\ ;" -"韩>hán|\\\ ;" -"贸>mào|\\\ ;" -"漫>màn|\\\ ;" -"沿>yán|\\\ ;" -"袖>xiù|\\\ ;" -"旦>dàn|\\\ ;" -"扫>sǎo|\\\ ;" -"尤>yóu|\\\ ;" -"炮>pào|\\\ ;" -"碗>wǎn|\\\ ;" -"贴>tiē|\\\ ;" -"插>chā|\\\ ;" -"滚>gǔn|\\\ ;" -"贝>bèi|\\\ ;" -"润>rùn|\\\ ;" -"氏>shì|\\\ ;" -"扩>kuò|\\\ ;" -"栏>lán|\\\ ;" -"哲>zhé|\\\ ;" -"吓>xià|\\\ ;" -"堆>duī|\\\ ;" -"俩>liǎ|\\\ ;" -"蓝>lán|\\\ ;" -"辛>xīn|\\\ ;" -"陪>péi|\\\ ;" -"蛋>dàn|\\\ ;" -"颜>yán|\\\ ;" -"贫>pín|\\\ ;" -"驻>zhù|\\\ ;" -"杰>jié|\\\ ;" -"忧>yōu|\\\ ;" -"貌>mào|\\\ ;" -"塞>sài|\\\ ;" -"森>sēn|\\\ ;" -"繁>fán|\\\ ;" -"碎>suì|\\\ ;" -"津>jīn|\\\ ;" -"侠>xiá|\\\ ;" -"迟>chí|\\\ ;" -"辉>huī|\\\ ;" -"狠>hěn|\\\ ;" -"缩>suō|\\\ ;" -"穴>xuè|\\\ ;" -"赖>lài|\\\ ;" -"愤>fèn|\\\ ;" -"询>xún|\\\ ;" -"惨>cǎn|\\\ ;" -"麦>mài|\\\ ;" -"倍>bèi|\\\ ;" -"截>jié|\\\ ;" -"染>rǎn|\\\ ;" -"柳>liǔ|\\\ ;" -"涉>shè|\\\ ;" -"躲>duǒ|\\\ ;" -"裁>cái|\\\ ;" -"霞>xiá|\\\ ;" -"猪>zhū|\\\ ;" -"扎>zhā|\\\ ;" -"筑>zhú|\\\ ;" -"俊>jùn|\\\ ;" -"鞋>xié|\\\ ;" -"侵>qīn|\\\ ;" -"欣>xīn|\\\ ;" -"媒>méi|\\\ ;" -"魂>hún|\\\ ;" -"洁>jié|\\\ ;" -"枝>zhī|\\\ ;" -"甲>jiǎ|\\\ ;" -"拖>tuō|\\\ ;" -"舒>shū|\\\ ;" -"惠>huì|\\\ ;" -"昏>hūn|\\\ ;" -"戒>jiè|\\\ ;" -"慧>huì|\\\ ;" -"桃>táo|\\\ ;" -"赤>chì|\\\ ;" -"烂>làn|\\\ ;" -"措>cuò|\\\ ;" -"泰>tài|\\\ ;" -"尸>shī|\\\ ;" -"殊>shū|\\\ ;" -"慰>wèi|\\\ ;" -"坛>tán|\\\ ;" -"甘>gān|\\\ ;" -"咬>yǎo|\\\ ;" -"炸>zhà|\\\ ;" -"饮>yǐn|\\\ ;" -"祝>zhù|\\\ ;" -"牢>láo|\\\ ;" -"桂>guì|\\\ ;" -"尾>wěi|\\\ ;" -"恰>qià|\\\ ;" -"矛>máo|\\\ ;" -"宾>bīn|\\\ ;" -"粉>fěn|\\\ ;" -"贼>zéi|\\\ ;" -"盾>dùn|\\\ ;" -"斜>xié|\\\ ;" -"裂>liè|\\\ ;" -"滑>huá|\\\ ;" -"斐>fěi|\\\ ;" -"废>fèi|\\\ ;" -"彻>chè|\\\ ;" -"斤>jīn|\\\ ;" -"朵>duǒ|\\\ ;" -"佳>jiā|\\\ ;" -"皆>jiē|\\\ ;" -"毁>huǐ|\\\ ;" -"蛇>shé|\\\ ;" -"搬>bān|\\\ ;" -"舅>jiù|\\\ ;" -"幽>yōu|\\\ ;" -"琴>qín|\\\ ;" -"聘>pìn|\\\ ;" -"弯>wān|\\\ ;" -"返>fǎn|\\\ ;" -"违>wéi|\\\ ;" -"亏>kuī|\\\ ;" -"丢>diū|\\\ ;" -"魏>wèi|\\\ ;" -"耐>nài|\\\ ;" -"佩>pèi|\\\ ;" -"傻>shǎ|\\\ ;" -"绕>rào|\\\ ;" -"秦>qín|\\\ ;" -"昨>zuó|\\\ ;" -"暂>zàn|\\\ ;" -"署>shǔ|\\\ ;" -"猜>cāi|\\\ ;" -"耀>yào|\\\ ;" -"豆>dòu|\\\ ;" -"闷>mèn|\\\ ;" -"泛>fàn|\\\ ;" -"悔>huǐ|\\\ ;" -"爆>bào|\\\ ;" -"幼>yòu|\\\ ;" -"夹>jiā|\\\ ;" -"邀>yāo|\\\ ;" -"允>yǔn|\\\ ;" -"恼>nǎo|\\\ ;" -"尺>chǐ|\\\ ;" -"侍>shì|\\\ ;" -"扭>niǔ|\\\ ;" -"菲>fēi|\\\ ;" -"奏>zòu|\\\ ;" -"殷>yīn|\\\ ;" -"埋>mái|\\\ ;" -"盼>pàn|\\\ ;" -"吟>yín|\\\ ;" -"跨>kuà|\\\ ;" -"醉>zuì|\\\ ;" -"掩>yǎn|\\\ ;" -"揭>jiē|\\\ ;" -"刃>rèn|\\\ ;" -"峡>xiá|\\\ ;" -"凯>kǎi|\\\ ;" -"丐>gài|\\\ ;" -"猫>māo|\\\ ;" -"涛>tāo|\\\ ;" -"溜>liū|\\\ ;" -"锅>guō|\\\ ;" -"奈>nài|\\\ ;" -"拾>shí|\\\ ;" -"脉>mài|\\\ ;" -"锁>suǒ|\\\ ;" -"邻>lín|\\\ ;" -"恢>huī|\\\ ;" -"砍>kǎn|\\\ ;" -"驾>jià|\\\ ;" -"祸>huò|\\\ ;" -"曹>cáo|\\\ ;" -"抖>dǒu|\\\ ;" -"览>lǎn|\\\ ;" -"羞>xiū|\\\ ;" -"抛>pāo|\\\ ;" -"惑>huò|\\\ ;" -"肥>féi|\\\ ;" -"胞>bāo|\\\ ;" -"阔>kuò|\\\ ;" -"勤>qín|\\\ ;" -"帽>mào|\\\ ;" -"撤>chè|\\\ ;" -"频>pín|\\\ ;" -"莱>lái|\\\ ;" -"堪>kān|\\\ ;" -"寸>cùn|\\\ ;" -"巡>xún|\\\ ;" -"扣>kòu|\\\ ;" -"池>chí|\\\ ;" -"嫁>jià|\\\ ;" -"枚>méi|\\\ ;" -"瓜>guā|\\\ ;" -"跌>diē|\\\ ;" -"扯>chě|\\\ ;" -"锦>jǐn|\\\ ;" -"逊>shū|\\\ ;" -"赔>péi|\\\ ;" -"昆>kūn|\\\ ;" -"柏>bǎi|\\\ ;" -"驶>shǐ|\\\ ;" -"植>zhí|\\\ ;" -"纽>niǔ|\\\ ;" -"捷>jié|\\\ ;" -"锐>duì|\\\ ;" -"乾>gān|\\\ ;" -"霍>huò|\\\ ;" -"湿>shī|\\\ ;" -"睁>suō|\\\ ;" -"悠>yōu|\\\ ;" -"沟>gōu|\\\ ;" -"陶>táo|\\\ ;" -"浑>hún|\\\ ;" -"驰>chí|\\\ ;" -"拼>pīn|\\\ ;" -"邪>xié|\\\ ;" -"脆>cuì|\\\ ;" -"糟>zāo|\\\ ;" -"扮>bàn|\\\ ;" -"饰>shì|\\\ ;" -"摄>niè|\\\ ;" -"嘿>hēi|\\\ ;" -"旨>zhǐ|\\\ ;" -"翠>cuì|\\\ ;" -"饱>bǎo|\\\ ;" -"劫>jié|\\\ ;" -"叛>pàn|\\\ ;" -"储>chǔ|\\\ ;" -"贪>tān|\\\ ;" -"扰>rǎo|\\\ ;" -"胁>xié|\\\ ;" -"跪>guì|\\\ ;" -"碑>bēi|\\\ ;" -"莎>shā|\\\ ;" -"娜>nuó|\\\ ;" -"侯>hóu|\\\ ;" -"丘>qiū|\\\ ;" -"晕>yūn|\\\ ;" -"拦>lán|\\\ ;" -"燃>rán|\\\ ;" -"吞>tūn|\\\ ;" -"舌>shé|\\\ ;" -"琳>lín|\\\ ;" -"曼>màn|\\\ ;" -"耻>chǐ|\\\ ;" -"柜>guì|\\\ ;" -"摊>tān|\\\ ;" -"削>xuē|\\\ ;" -"杆>gǎn|\\\ ;" -"岩>yán|\\\ ;" -"喂>wèi|\\\ ;" -"逝>shì|\\\ ;" -"诞>dàn|\\\ ;" -"崔>cuī|\\\ ;" -"凑>còu|\\\ ;" -"痴>chī|\\\ ;" -"盆>pén|\\\ ;" -"姥>lǎo|\\\ ;" -"姻>yīn|\\\ ;" -"愧>kuì|\\\ ;" -"芬>fēn|\\\ ;" -"掷>zhí|\\\ ;" -"芯>xīn|\\\ ;" -"鼠>shǔ|\\\ ;" -"纠>jiū|\\\ ;" -"曰>yuē|\\\ ;" -"袍>páo|\\\ ;" -"勾>gōu|\\\ ;" -"慨>kǎi|\\\ ;" -"筋>jīn|\\\ ;" -"柱>zhù|\\\ ;" -"卑>bēi|\\\ ;" -"咽>yān|\\\ ;" -"吨>dūn|\\\ ;" -"厨>chú|\\\ ;" -"饶>ráo|\\\ ;" -"煤>méi|\\\ ;" -"腕>wǎn|\\\ ;" -"喷>pēn|\\\ ;" -"浩>hào|\\\ ;" -"吩>fēn|\\\ ;" -"泄>xiè|\\\ ;" -"搜>sōu|\\\ ;" -"遵>zūn|\\\ ;" -"伪>wěi|\\\ ;" -"炎>yán|\\\ ;" -"氛>fēn|\\\ ;" -"瞎>xiā|\\\ ;" -"誓>shì|\\\ ;" -"泡>pāo|\\\ ;" -"嘉>jiā|\\\ ;" -"烛>zhú|\\\ ;" -"厦>shà|\\\ ;" -"衰>cuī|\\\ ;" -"薛>xuē|\\\ ;" -"齿>chǐ|\\\ ;" -"谨>jǐn|\\\ ;" -"昂>áng|\\\ ;" -"疏>shū|\\\ ;" -"耗>hào|\\\ ;" -"斥>chì|\\\ ;" -"夸>kuā|\\\ ;" -"痕>hén|\\\ ;" -"姚>yáo|\\\ ;" -"妥>tuǒ|\\\ ;" -"掏>tāo|\\\ ;" -"刹>chà|\\\ ;" -"拓>tuò|\\\ ;" -"钦>qīn|\\\ ;" -"诱>yòu|\\\ ;" -"歇>xiē|\\\ ;" -"棍>gùn|\\\ ;" -"晋>jìn|\\\ ;" -"淋>lìn|\\\ ;" -"悦>yuè|\\\ ;" -"敦>dūn|\\\ ;" -"罕>hǎn|\\\ ;" -"贷>dài|\\\ ;" -"捏>niē|\\\ ;" -"贾>jiǎ|\\\ ;" -"堡>bǎo|\\\ ;" -"浙>zhè|\\\ ;" -"劣>liè|\\\ ;" -"陀>tuó|\\\ ;" -"坟>fén|\\\ ;" -"漏>lòu|\\\ ;" -"茅>máo|\\\ ;" -"滩>tān|\\\ ;" -"顽>wán|\\\ ;" -"殖>zhí|\\\ ;" -"蔡>cài|\\\ ;" -"催>cuī|\\\ ;" -"彬>bīn|\\\ ;" -"拚>pàn|\\\ ;" -"轨>dài|\\\ ;" -"硕>shí|\\\ ;" -"憾>hàn|\\\ ;" -"懒>lǎn|\\\ ;" -"盐>yán|\\\ ;" -"喉>hóu|\\\ ;" -"宴>yàn|\\\ ;" -"翰>hàn|\\\ ;" -"逻>luó|\\\ ;" -"裹>guǒ|\\\ ;" -"贩>fàn|\\\ ;" -"绘>huì|\\\ ;" -"遮>zhē|\\\ ;" -"擒>qín|\\\ ;" -"蛮>mán|\\\ ;" -"芷>zhǐ|\\\ ;" -"挽>wǎn|\\\ ;" -"吻>wěn|\\\ ;" -"粹>cuì|\\\ ;" -"竭>jié|\\\ ;" -"歪>wāi|\\\ ;" -"械>xiè|\\\ ;" -"斑>bān|\\\ ;" -"寡>guǎ|\\\ ;" -"循>xún|\\\ ;" -"掠>lüè|\\\ ;" -"爵>jué|\\\ ;" -"徽>huī|\\\ ;" -"谭>tán|\\\ ;" -"嫂>sǎo|\\\ ;" -"婉>wǎn|\\\ ;" -"骆>luò|\\\ ;" -"畏>wèi|\\\ ;" -"鲍>bào|\\\ ;" -"啥>shà|\\\ ;" -"纹>wén|\\\ ;" -"蹲>dūn|\\\ ;" -"骚>sāo|\\\ ;" -"艘>sōu|\\\ ;" -"芝>zhī|\\\ ;" -"哗>huá|\\\ ;" -"巾>jīn|\\\ ;" -"淫>yín|\\\ ;" -"篮>lán|\\\ ;" -"侄>zhí|\\\ ;" -"叉>chā|\\\ ;" -"宰>zǎi|\\\ ;" -"瞒>mán|\\\ ;" -"吼>hǒu|\\\ ;" -"叠>dié|\\\ ;" -"裙>qún|\\\ ;" -"恳>kěn|\\\ ;" -"颁>bān|\\\ ;" -"薪>xīn|\\\ ;" -"颊>jiá|\\\ ;" -"逮>dǎi|\\\ ;" -"浸>jìn|\\\ ;" -"刮>guā|\\\ ;" -"宛>wǎn|\\\ ;" -"嘱>zhǔ|\\\ ;" -"挪>nuó|\\\ ;" -"兜>dōu|\\\ ;" -"喃>nán|\\\ ;" -"舵>duò|\\\ ;" -"糕>gāo|\\\ ;" -"秩>zhì|\\\ ;" -"钩>gōu|\\\ ;" -"煮>zhǔ|\\\ ;" -"竖>shù|\\\ ;" -"株>zhū|\\\ ;" -"绣>xiù|\\\ ;" -"妖>yāo|\\\ ;" -"胎>tāi|\\\ ;" -"滨>bīn|\\\ ;" -"嗤>chī|\\\ ;" -"匪>fěi|\\\ ;" -"胃>wèi|\\\ ;" -"躁>zào|\\\ ;" -"狮>shī|\\\ ;" -"凛>lǐn|\\\ ;" -"龟>guī|\\\ ;" -"裸>luǒ|\\\ ;" -"嫣>yān|\\\ ;" -"窑>yáo|\\\ ;" -"尹>yǐn|\\\ ;" -"掘>jué|\\\ ;" -"狭>xiá|\\\ ;" -"馨>xīn|\\\ ;" -"潘>pān|\\\ ;" -"猴>hóu|\\\ ;" -"畔>pàn|\\\ ;" -"畜>chù|\\\ ;" -"搂>lǒu|\\\ ;" -"旬>xún|\\\ ;" -"骇>hài|\\\ ;" -"灿>càn|\\\ ;" -"雁>yàn|\\\ ;" -"韵>yùn|\\\ ;" -"媚>mèi|\\\ ;" -"攀>pān|\\\ ;" -"窃>qiè|\\\ ;" -"裘>qiú|\\\ ;" -"嫩>nèn|\\\ ;" -"遂>suì|\\\ ;" -"陋>lòu|\\\ ;" -"笨>bèn|\\\ ;" -"匙>chí|\\\ ;" -"踩>cǎi|\\\ ;" -"啡>fēi|\\\ ;" -"黛>dài|\\\ ;" -"霉>méi|\\\ ;" -"坤>kūn|\\\ ;" -"帖>tiě|\\\ ;" -"焰>yàn|\\\ ;" -"囚>qiú|\\\ ;" -"侃>kǎn|\\\ ;" -"佐>zuǒ|\\\ ;" -"雀>què|\\\ ;" -"帆>fān|\\\ ;" -"惭>cán|\\\ ;" -"涵>hán|\\\ ;" -"逗>dòu|\\\ ;" -"澡>zǎo|\\\ ;" -"粪>fèn|\\\ ;" -"魁>kuí|\\\ ;" -"捆>kǔn|\\\ ;" -"肝>gān|\\\ ;" -"滥>làn|\\\ ;" -"驼>tuó|\\\ ;" -"溃>kuì|\\\ ;" -"烤>kǎo|\\\ ;" -"潭>tán|\\\ ;" -"诀>jué|\\\ ;" -"峻>jùn|\\\ ;" -"郡>jùn|\\\ ;" -"怯>qiè|\\\ ;" -"茂>mào|\\\ ;" -"肢>zhī|\\\ ;" -"尴>gān|\\\ ;" -"稻>dào|\\\ ;" -"栽>zāi|\\\ ;" -"豹>bào|\\\ ;" -"蹈>dǎo|\\\ ;" -"佑>yòu|\\\ ;" -"淹>yān|\\\ ;" -"嚼>jué|\\\ ;" -"耽>dān|\\\ ;" -"暑>shǔ|\\\ ;" -"襟>jīn|\\\ ;" -"诧>chà|\\\ ;" -"揪>jiū|\\\ ;" -"翅>chì|\\\ ;" -"辖>xiá|\\\ ;" -"悼>dào|\\\ ;" -"阎>yán|\\\ ;" -"昧>mèi|\\\ ;" -"函>hán|\\\ ;" -"哉>zāi|\\\ ;" -"祷>dǎo|\\\ ;" -"抒>shū|\\\ ;" -"歹>dǎi|\\\ ;" -"旱>hàn|\\\ ;" -"惟>wéi|\\\ ;" -"谣>yáo|\\\ ;" -"滞>zhì|\\\ ;" -"孕>yùn|\\\ ;" -"梳>shū|\\\ ;" -"肺>fèi|\\\ ;" -"丸>wán|\\\ ;" -"汁>zhī|\\\ ;" -"纱>shā|\\\ ;" -"诡>guǐ|\\\ ;" -"坎>kǎn|\\\ ;" -"稼>jià|\\\ ;" -"脂>zhī|\\\ ;" -"萄>táo|\\\ ;" -"捞>lāo|\\\ ;" -"屑>xiè|\\\ ;" -"伞>sǎn|\\\ ;" -"蝶>dié|\\\ ;" -"铸>zhù|\\\ ;" -"稚>zhì|\\\ ;" -"聂>niè|\\\ ;" -"陡>dǒu|\\\ ;" -"仑>lún|\\\ ;" -"焉>yān|\\\ ;" -"淘>táo|\\\ ;" -"垮>kuǎ|\\\ ;" -"尉>wèi|\\\ ;" -"滔>tāo|\\\ ;" -"捣>dǎo|\\\ ;" -"瑰>guī|\\\ ;" -"缆>làn|\\\ ;" -"浏>liú|\\\ ;" -"玫>méi|\\\ ;" -"楣>méi|\\\ ;" -"诈>zhà|\\\ ;" -"挟>xié|\\\ ;" -"煞>shà|\\\ ;" -"焚>fén|\\\ ;" -"霎>shà|\\\ ;" -"摧>cuī|\\\ ;" -"毯>tǎn|\\\ ;" -"挫>cuō|\\\ ;" -"迦>jiā|\\\ ;" -"朽>xiǔ|\\\ ;" -"虐>nüè|\\\ ;" -"兑>duì|\\\ ;" -"魅>mèi|\\\ ;" -"嗽>sòu|\\\ ;" -"堕>duò|\\\ ;" -"谐>xié|\\\ ;" -"蔑>miè|\\\ ;" -"豁>huò|\\\ ;" -"沸>fèi|\\\ ;" -"藉>jiè|\\\ ;" -"屎>shǐ|\\\ ;" -"卸>xiè|\\\ ;" -"钥>yào|\\\ ;" -"炭>tàn|\\\ ;" -"眨>zhǎ|\\\ ;" -"瞥>piē|\\\ ;" -"叨>dāo|\\\ ;" -"蔬>shū|\\\ ;" -"瘾>yǐn|\\\ ;" -"邱>qiū|\\\ ;" -"膏>gāo|\\\ ;" -"闵>mǐn|\\\ ;" -"萃>cuì|\\\ ;" -"妞>niū|\\\ ;" -"孽>niè|\\\ ;" -"淑>shú|\\\ ;" -"灶>zào|\\\ ;" -"斌>bīn|\\\ ;" -"寇>kòu|\\\ ;" -"沛>pèi|\\\ ;" -"屯>tún|\\\ ;" -"恕>shù|\\\ ;" -"妃>fēi|\\\ ;" -"鸠>jiū|\\\ ;" -"沦>lún|\\\ ;" -"暇>xiá|\\\ ;" -"揉>róu|\\\ ;" -"萝>luó|\\\ ;" -"澜>lán|\\\ ;" -"吱>zhī|\\\ ;" -"蛛>zhū|\\\ ;" -"揽>lǎn|\\\ ;" -"荫>yìn|\\\ ;" -"岱>dài|\\\ ;" -"睬>cǎi|\\\ ;" -"枣>zǎo|\\\ ;" -"撇>piě|\\\ ;" -"奢>shē|\\\ ;" -"帜>zhì|\\\ ;" -"菌>jūn|\\\ ;" -"寅>yín|\\\ ;" -"蕾>lěi|\\\ ;" -"贿>huì|\\\ ;" -"钧>jūn|\\\ ;" -"讳>huì|\\\ ;" -"窥>kuī|\\\ ;" -"衍>yǎn|\\\ ;" -"锣>luó|\\\ ;" -"撼>hàn|\\\ ;" -"赎>shú|\\\ ;" -"岔>chà|\\\ ;" -"熏>xūn|\\\ ;" -"绥>suī|\\\ ;" -"咧>liē|\\\ ;" -"倏>shū|\\\ ;" -"琐>suǒ|\\\ ;" -"燥>zào|\\\ ;" -"髦>máo|\\\ ;" -"匀>yún|\\\ ;" -"碟>dié|\\\ ;" -"剖>pōu|\\\ ;" -"搓>cuō|\\\ ;" -"嵋>méi|\\\ ;" -"嗦>suō|\\\ ;" -"垒>lěi|\\\ ;" -"噪>zào|\\\ ;" -"蕴>yùn|\\\ ;" -"迭>dié|\\\ ;" -"凿>záo|\\\ ;" -"仞>rèn|\\\ ;" -"扳>bān|\\\ ;" -"瘫>tān|\\\ ;" -"墅>shù|\\\ ;" -"憋>biē|\\\ ;" -"奎>kuí|\\\ ;" -"秽>huì|\\\ ;" -"卦>guà|\\\ ;" -"佬>lǎo|\\\ ;" -"蔚>wèi|\\\ ;" -"洽>qià|\\\ ;" -"蚀>shí|\\\ ;" -"吆>yāo|\\\ ;" -"虾>xiā|\\\ ;" -"唾>tuò|\\\ ;" -"谬>miù|\\\ ;" -"蚕>cán|\\\ ;" -"赦>shè|\\\ ;" -"狈>bèi|\\\ ;" -"邹>zōu|\\\ ;" -"寝>qǐn|\\\ ;" -"苟>gǒu|\\\ ;" -"瑶>yáo|\\\ ;" -"梭>suō|\\\ ;" -"彦>yàn|\\\ ;" -"悍>hàn|\\\ ;" -"挚>zhì|\\\ ;" -"悯>mǐn|\\\ ;" -"薇>wéi|\\\ ;" -"厥>jué|\\\ ;" -"瞩>zhǔ|\\\ ;" -"郝>hǎo|\\\ ;" -"檐>yán|\\\ ;" -"牟>móu|\\\ ;" -"嗅>xiù|\\\ ;" -"崛>jué|\\\ ;" -"枢>shū|\\\ ;" -"磊>lěi|\\\ ;" -"泻>xiè|\\\ ;" -"忿>fèn|\\\ ;" -"乍>zhà|\\\ ;" -"疚>jiù|\\\ ;" -"隋>suí|\\\ ;" -"勘>kān|\\\ ;" -"晦>huì|\\\ ;" -"诫>jiè|\\\ ;" -"螺>luó|\\\ ;" -"墩>dūn|\\\ ;" -"槽>cáo|\\\ ;" -"惫>bèi|\\\ ;" -"禽>qín|\\\ ;" -"蚊>wén|\\\ ;" -"巍>wēi|\\\ ;" -"攒>zǎn|\\\ ;" -"祟>suì|\\\ ;" -"尧>yáo|\\\ ;" -"挠>náo|\\\ ;" -"绊>bàn|\\\ ;" -"懈>xiè|\\\ ;" -"崽>zǎi|\\\ ;" -"蔓>màn|\\\ ;" -"藩>fān|\\\ ;" -"勋>xūn|\\\ ;" -"萎>wěi|\\\ ;" -"叩>kòu|\\\ ;" -"靴>xuē|\\\ ;" -"皂>zào|\\\ ;" -"蟹>xiè|\\\ ;" -"惮>dàn|\\\ ;" -"搔>sāo|\\\ ;" -"冉>rǎn|\\\ ;" -"馒>mán|\\\ ;" -"闺>guī|\\\ ;" -"嚎>háo|\\\ ;" -"骏>jùn|\\\ ;" -"瓣>bàn|\\\ ;" -"腮>sāi|\\\ ;" -"涅>niè|\\\ ;" -"铐>kào|\\\ ;" -"橱>chú|\\\ ;" -"圭>guī|\\\ ;" -"黝>yǒu|\\\ ;" -"撮>cuō|\\\ ;" -"躇>chú|\\\ ;" -"踱>duò|\\\ ;" -"哆>duō|\\\ ;" -"夭>yāo|\\\ ;" -"樊>fán|\\\ ;" -"徘>pái|\\\ ;" -"亥>hài|\\\ ;" -"褚>chǔ|\\\ ;" -"猬>wèi|\\\ ;" -"苔>tái|\\\ ;" -"恃>shì|\\\ ;" -"酣>hān|\\\ ;" -"怠>dài|\\\ ;" -"殉>xùn|\\\ ;" -"揍>zòu|\\\ ;" -"擂>lèi|\\\ ;" -"拗>niù|\\\ ;" -"霖>lín|\\\ ;" -"锄>chú|\\\ ;" -"麟>lín|\\\ ;" -"茵>yīn|\\\ ;" -"肴>yáo|\\\ ;" -"骰>tóu|\\\ ;" -"褂>guà|\\\ ;" -"芸>yún|\\\ ;" -"竿>gān|\\\ ;" -"糙>cāo|\\\ ;" -"砚>yàn|\\\ ;" -"砂>shā|\\\ ;" -"闸>zhá|\\\ ;" -"捍>hàn|\\\ ;" -"肮>āng|\\\ ;" -"咄>duō|\\\ ;" -"唠>láo|\\\ ;" -"颓>tuí|\\\ ;" -"榴>liú|\\\ ;" -"汰>tài|\\\ ;" -"辙>chè|\\\ ;" -"苇>wěi|\\\ ;" -"帷>wéi|\\\ ;" -"谍>dié|\\\ ;" -"臀>tún|\\\ ;" -"啃>kěn|\\\ ;" -"羔>gāo|\\\ ;" -"芹>qín|\\\ ;" -"拌>bàn|\\\ ;" -"蜀>shǔ|\\\ ;" -"诛>zhū|\\\ ;" -"锈>xiù|\\\ ;" -"钝>dùn|\\\ ;" -"栅>zhà|\\\ ;" -"峙>zhì|\\\ ;" -"韧>rèn|\\\ ;" -"曙>shù|\\\ ;" -"廓>kuò|\\\ ;" -"茄>qié|\\\ ;" -"呸>pēi|\\\ ;" -"仕>shì|\\\ ;" -"渭>wèi|\\\ ;" -"妾>qiè|\\\ ;" -"肋>lèi|\\\ ;" -"猾>huá|\\\ ;" -"窒>zhì|\\\ ;" -"皓>hào|\\\ ;" -"掐>qiā|\\\ ;" -"懦>nuò|\\\ ;" -"倔>jué|\\\ ;" -"奄>yǎn|\\\ ;" -"腓>féi|\\\ ;" -"渣>zhā|\\\ ;" -"瘤>liú|\\\ ;" -"薯>shǔ|\\\ ;" -"楷>kǎi|\\\ ;" -"慑>shè|\\\ ;" -"闽>mǐn|\\\ ;" -"汛>xùn|\\\ ;" -"嘈>cáo|\\\ ;" -"梵>fàn|\\\ ;" -"鳞>lín|\\\ ;" -"拷>kǎo|\\\ ;" -"蓓>bèi|\\\ ;" -"拭>shì|\\\ ;" -"晖>huī|\\\ ;" -"瑾>jǐn|\\\ ;" -"骸>hái|\\\ ;" -"骡>luó|\\\ ;" -"硅>guī|\\\ ;" -"侈>chǐ|\\\ ;" -"夥>huǒ|\\\ ;" -"穗>suì|\\\ ;" -"沁>qìn|\\\ ;" -"悴>cuì|\\\ ;" -"琉>liú|\\\ ;" -"驯>xún|\\\ ;" -"纬>wěi|\\\ ;" -"粤>yuè|\\\ ;" -"嗜>shì|\\\ ;" -"隧>suì|\\\ ;" -"澈>chè|\\\ ;" -"钮>niǔ|\\\ ;" -"哧>chī|\\\ ;" -"掺>càn|\\\ ;" -"忖>cǔn|\\\ ;" -"漱>shù|\\\ ;" -"烙>lào|\\\ ;" -"盔>kuī|\\\ ;" -"瘪>biē|\\\ ;" -"眸>móu|\\\ ;" -"蕃>fán|\\\ ;" -"唆>suō|\\\ ;" -"磋>cuō|\\\ ;" -"伽>jiā|\\\ ;" -"垢>gòu|\\\ ;" -"褪>tùn|\\\ ;" -"瘸>qué|\\\ ;" -"岚>lán|\\\ ;" -"喳>chā|\\\ ;" -"柿>shì|\\\ ;" -"叱>chì|\\\ ;" -"匣>xiá|\\\ ;" -"惋>wǎn|\\\ ;" -"痰>tán|\\\ ;" -"桦>huà|\\\ ;" -"咎>jiù|\\\ ;" -"憨>hān|\\\ ;" -"髓>suǐ|\\\ ;" -"趾>zhǐ|\\\ ;" -"炽>chì|\\\ ;" -"孰>shú|\\\ ;" -"揩>kāi|\\\ ;" -"窦>dòu|\\\ ;" -"矢>shǐ|\\\ ;" -"酝>yùn|\\\ ;" -"潦>lǎo|\\\ ;" -"刨>páo|\\\ ;" -"鬓>bìn|\\\ ;" -"札>zhá|\\\ ;" -"亵>xiè|\\\ ;" -"俨>yǎn|\\\ ;" -"跺>duò|\\\ ;" -"贮>zhǔ|\\\ ;" -"悖>bèi|\\\ ;" -"茬>chá|\\\ ;" -"炙>zhì|\\\ ;" -"濒>bīn|\\\ ;" -"睐>lài|\\\ ;" -"偎>wēi|\\\ ;" -"蝎>xiē|\\\ ;" -"杵>chǔ|\\\ ;" -"衅>xìn|\\\ ;" -"楠>nán|\\\ ;" -"韬>tāo|\\\ ;" -"抿>mǐn|\\\ ;" -"垦>kěn|\\\ ;" -"筵>yán|\\\ ;" -"瘟>wēn|\\\ ;" -"婪>lán|\\\ ;" -"葵>kuí|\\\ ;" -"飕>sōu|\\\ ;" -"蹑>niè|\\\ ;" -"竺>zhú|\\\ ;" -"吝>lìn|\\\ ;" -"睫>jié|\\\ ;" -"鹊>què|\\\ ;" -"卉>huì|\\\ ;" -"遁>dùn|\\\ ;" -"庶>shù|\\\ ;" -"蕊>ruǐ|\\\ ;" -"诲>huì|\\\ ;" -"缪>miù|\\\ ;" -"鑫>xīn|\\\ ;" -"睽>kuí|\\\ ;" -"赣>gàn|\\\ ;" -"喽>lou|\\\ ;" -"竣>jùn|\\\ ;" -"馈>kuì|\\\ ;" -"喋>dié|\\\ ;" -"偌>ruò|\\\ ;" -"玮>wěi|\\\ ;" -"碳>tàn|\\\ ;" -"檀>tán|\\\ ;" -"殆>dài|\\\ ;" -"褒>bāo|\\\ ;" -"辄>zhé|\\\ ;" -"嗨>hāi|\\\ ;" -"诘>jié|\\\ ;" -"抡>lún|\\\ ;" -"鹫>jiù|\\\ ;" -"晗>hán|\\\ ;" -"沌>dùn|\\\ ;" -"荤>hūn|\\\ ;" -"硫>liú|\\\ ;" -"寐>mèi|\\\ ;" -"橄>gǎn|\\\ ;" -"榄>lǎn|\\\ ;" -"笋>sǔn|\\\ ;" -"鼾>hān|\\\ ;" -"噬>shì|\\\ ;" -"雯>wén|\\\ ;" -"蟠>pán|\\\ ;" -"阉>yān|\\\ ;" -"桅>wéi|\\\ ;" -"壕>háo|\\\ ;" -"莞>wǎn|\\\ ;" -"锚>máo|\\\ ;" -"赁>rèn|\\\ ;" -"剁>duò|\\\ ;" -"腌>yān|\\\ ;" -"缤>bīn|\\\ ;" -"嗖>sōu|\\\ ;" -"蜒>yán|\\\ ;" -"淆>yáo|\\\ ;" -"睿>ruì|\\\ ;" -"豚>tún|\\\ ;" -"雏>chú|\\\ ;" -"遐>xiá|\\\ ;" -"薰>xūn|\\\ ;" -"篓>lǒu|\\\ ;" -"葆>bǎo|\\\ ;" -"弛>chí|\\\ ;" -"垛>duǒ|\\\ ;" -"撅>juē|\\\ ;" -"吠>fèi|\\\ ;" -"馄>hún|\\\ ;" -"饨>tún|\\\ ;" -"枷>jiā|\\\ ;" -"胯>kuà|\\\ ;" -"呗>bài|\\\ ;" -"矜>jīn|\\\ ;" -"炖>dùn|\\\ ;" -"闫>yàn|\\\ ;" -"蹒>mán|\\\ ;" -"泯>mǐn|\\\ ;" -"袒>tǎn|\\\ ;" -"蜘>zhī|\\\ ;" -"抠>kōu|\\\ ;" -"矗>chù|\\\ ;" -"鳖>biē|\\\ ;" -"耘>yún|\\\ ;" -"醺>xūn|\\\ ;" -"烬>jìn|\\\ ;" -"噤>jìn|\\\ ;" -"髯>rán|\\\ ;" -"蜿>wān|\\\ ;" -"抉>jué|\\\ ;" -"籁>lài|\\\ ;" -"卯>mǎo|\\\ ;" -"裴>péi|\\\ ;" -"盎>àng|\\\ ;" -"掰>bāi|\\\ ;" -"阪>bǎn|\\\ ;" -"阑>lán|\\\ ;" -"啐>cuì|\\\ ;" -"湃>pài|\\\ ;" -"啕>táo|\\\ ;" -"诽>fěi|\\\ ;" -"斓>lán|\\\ ;" -"娓>wěi|\\\ ;" -"摞>luò|\\\ ;" -"刎>wěn|\\\ ;" -"癞>lài|\\\ ;" -"刽>guì|\\\ ;" -"榨>zhà|\\\ ;" -"胭>yān|\\\ ;" -"伫>zhù|\\\ ;" -"藻>zǎo|\\\ ;" -"剐>guǎ|\\\ ;" -"驮>tuó|\\\ ;" -"胚>pēi|\\\ ;" -"惰>duò|\\\ ;" -"髅>lóu|\\\ ;" -"嗫>niè|\\\ ;" -"燔>fán|\\\ ;" -"臊>sào|\\\ ;" -"涝>lào|\\\ ;" -"舀>yǎo|\\\ ;" -"咆>páo|\\\ ;" -"闰>rùn|\\\ ;" -"拄>zhǔ|\\\ ;" -"昊>hào|\\\ ;" -"偕>jiē|\\\ ;" -"佗>tuó|\\\ ;" -"赳>jiǔ|\\\ ;" -"侏>zhū|\\\ ;" -"躏>lìn|\\\ ;" -"紊>wèn|\\\ ;" -"箩>luó|\\\ ;" -"咫>zhǐ|\\\ ;" -"靳>jìn|\\\ ;" -"鲨>shā|\\\ ;" -"邃>suì|\\\ ;" -"褴>bǎo|\\\ ;" -"坍>tān|\\\ ;" -"扉>fēi|\\\ ;" -"阙>què|\\\ ;" -"涔>cén|\\\ ;" -"皿>mǐn|\\\ ;" -"傣>dǎi|\\\ ;" -"蹂>róu|\\\ ;" -"瀚>hàn|\\\ ;" -"皖>wǎn|\\\ ;" -"眈>dān|\\\ ;" -"酋>qiú|\\\ ;" -"雹>báo|\\\ ;" -"忐>tǎn|\\\ ;" -"殡>bìn|\\\ ;" -"猥>wěi|\\\ ;" -"亘>gèn|\\\ ;" -"瘁>cuì|\\\ ;" -"瑕>xiá|\\\ ;" -"磷>lín|\\\ ;" -"獗>jué|\\\ ;" -"酉>yǒu|\\\ ;" -"镐>gǎo|\\\ ;" -"虬>qiú|\\\ ;" -"堰>yàn|\\\ ;" -"芥>jiè|\\\ ;" -"翡>fěi|\\\ ;" -"盹>dǔn|\\\ ;" -"簪>zān|\\\ ;" -"惬>qiè|\\\ ;" -"糯>nuò|\\\ ;" -"唁>yàn|\\\ ;" -"谚>yàn|\\\ ;" -"幺>yāo|\\\ ;" -"虱>shī|\\\ ;" -"炜>wěi|\\\ ;" -"瑙>nǎo|\\\ ;" -"纭>yún|\\\ ;" -"遛>liú|\\\ ;" -"莘>xīn|\\\ ;" -"骅>huá|\\\ ;" -"恺>kǎi|\\\ ;" -"匮>guì|\\\ ;" -"擞>sǒu|\\\ ;" -"幡>fān|\\\ ;" -"塾>shú|\\\ ;" -"磐>pán|\\\ ;" -"焊>hàn|\\\ ;" -"敕>chì|\\\ ;" -"馁>něi|\\\ ;" -"汾>fén|\\\ ;" -"晏>yàn|\\\ ;" -"逅>hòu|\\\ ;" -"崂>láo|\\\ ;" -"娄>lóu|\\\ ;" -"掣>chè|\\\ ;" -"邂>xiè|\\\ ;" -"叟>sǒu|\\\ ;" -"臼>jiù|\\\ ;" -"篾>miè|\\\ ;" -"搐>chù|\\\ ;" -"蚪>dǒu|\\\ ;" -"淦>gàn|\\\ ;" -"痘>dòu|\\\ ;" -"苞>bāo|\\\ ;" -"戛>jiá|\\\ ;" -"槟>bīn|\\\ ;" -"攫>jué|\\\ ;" -"灸>jiǔ|\\\ ;" -"纫>rèn|\\\ ;" -"溉>gài|\\\ ;" -"谑>nüè|\\\ ;" -"冽>liè|\\\ ;" -"诌>zōu|\\\ ;" -"椭>tuǒ|\\\ ;" -"韭>jiǔ|\\\ ;" -"麾>huī|\\\ ;" -"裟>shā|\\\ ;" -"恁>móu|\\\ ;" -"汶>wèn|\\\ ;" -"戍>shù|\\\ ;" -"秸>jiē|\\\ ;" -"碴>chá|\\\ ;" -"榭>xiè|\\\ ;" -"纨>wán|\\\ ;" -"酪>lào|\\\ ;" -"粼>lín|\\\ ;" -"璀>cuǐ|\\\ ;" -"儡>lěi|\\\ ;" -"傀>kuǐ|\\\ ;" -"皈>guī|\\\ ;" -"铀>yóu|\\\ ;" -"摺>zhé|\\\ ;" -"袈>jiā|\\\ ;" -"叁>sān|\\\ ;" -"浜>bīn|\\\ ;" -"镁>měi|\\\ ;" -"忸>niǔ|\\\ ;" -"瞰>kàn|\\\ ;" -"珞>luò|\\\ ;" -"傩>nuó|\\\ ;" -"钅>jīn|\\\ ;" -"桀>jié|\\\ ;" -"绯>fēi|\\\ ;" -"湮>yān|\\\ ;" -"颏>hái|\\\ ;" -"铎>duó|\\\ ;" -"攸>bīn|\\\ ;" -"鸨>bǎo|\\\ ;" -"垠>yín|\\\ ;" -"蜗>guā|\\\ ;" -"蚤>zǎo|\\\ ;" -"篙>gāo|\\\ ;" -"氮>dàn|\\\ ;" -"黠>xiá|\\\ ;" -"痣>zhì|\\\ ;" -"榷>què|\\\ ;" -"谩>mán|\\\ ;" -"艮>gèn|\\\ ;" -"轼>shì|\\\ ;" -"馑>jǐn|\\\ ;" -"馊>sōu|\\\ ;" -"饪>rèn|\\\ ;" -"衩>chǎ|\\\ ;" -"熨>yùn|\\\ ;" -"剜>wān|\\\ ;" -"浚>jùn|\\\ ;" -"钙>gài|\\\ ;" -"镬>huò|\\\ ;" -"愠>yùn|\\\ ;" -"噙>qín|\\\ ;" -"岑>cén|\\\ ;" -"纶>lún|\\\ ;" -"搽>chá|\\\ ;" -"碣>jié|\\\ ;" -"扪>mén|\\\ ;" -"啾>jiū|\\\ ;" -"呷>xiā|\\\ ;" -"衮>gǔn|\\\ ;" -"忾>kài|\\\ ;" -"蒿>hāo|\\\ ;" -"酶>méi|\\\ ;" -"蚯>qiū|\\\ ;" -"杳>yǎo|\\\ ;" -"芮>ruì|\\\ ;" -"陨>yǔn|\\\ ;" -"篝>gōu|\\\ ;" -"璨>càn|\\\ ;" -"嶙>lín|\\\ ;" -"蜚>fěi|\\\ ;" -"莓>méi|\\\ ;" -"豌>wān|\\\ ;" -"蓑>suō|\\\ ;" -"娑>suō|\\\ ;" -"仨>fǎn|\\\ ;" -"蹶>jué|\\\ ;" -"蚓>yǐn|\\\ ;" -"魇>yǎn|\\\ ;" -"褶>zhé|\\\ ;" -"蛰>zhí|\\\ ;" -"蹩>bié|\\\ ;" -"怵>chù|\\\ ;" -"亻>rén|\\\ ;" -"癸>guǐ|\\\ ;" -"舐>shì|\\\ ;" -"袂>mèi|\\\ ;" -"拮>jié|\\\ ;" -"牒>dié|\\\ ;" -"嗟>jiē|\\\ ;" -"疟>nüè|\\\ ;" -"姘>pīn|\\\ ;" -"浣>wǎn|\\\ ;" -"沱>tuó|\\\ ;" -"嗥>háo|\\\ ;" -"嗲>diǎ|\\\ ;" -"咤>zhà|\\\ ;" -"厩>jiù|\\\ ;" -"昙>tán|\\\ ;" -"楂>chá|\\\ ;" -"擀>gǎn|\\\ ;" -"垓>gāi|\\\ ;" -"蔗>zhè|\\\ ;" -"窈>yǎo|\\\ ;" -"徕>lái|\\\ ;" -"幔>màn|\\\ ;" -"啻>chì|\\\ ;" -"槁>gǎo|\\\ ;" -"妍>yán|\\\ ;" -"邯>hán|\\\ ;" -"挲>suō|\\\ ;" -"遴>lín|\\\ ;" -"峋>xún|\\\ ;" -"诙>huī|\\\ ;" -"偃>yǎn|\\\ ;" -"壬>rén|\\\ ;" -"掇>duó|\\\ ;" -"囤>tún|\\\ ;" -"耨>nòu|\\\ ;" -"绺>liǔ|\\\ ;" -"揿>qìn|\\\ ;" -"袤>mào|\\\ ;" -"釉>yòu|\\\ ;" -"麝>shè|\\\ ;" -"彗>huì|\\\ ;" -"囡>nān|\\\ ;" -"辔>pèi|\\\ ;" -"荟>huì|\\\ ;" -"霏>fēi|\\\ ;" -"胤>yìn|\\\ ;" -"鸵>tuó|\\\ ;" -"皋>gāo|\\\ ;" -"祗>zhī|\\\ ;" -"栉>jié|\\\ ;" -"姝>shū|\\\ ;" -"佘>shé|\\\ ;" -"蛀>zhù|\\\ ;" -"趔>liè|\\\ ;" -"颔>hàn|\\\ ;" -"懑>mèn|\\\ ;" -"孬>nāo|\\\ ;" -"啮>niè|\\\ ;" -"漕>cáo|\\\ ;" -"蔻>kòu|\\\ ;" -"偻>lóu|\\\ ;" -"郸>dān|\\\ ;" -"佰>bǎi|\\\ ;" -"龛>kān|\\\ ;" -"琨>kūn|\\\ ;" -"玳>dài|\\\ ;" -"邰>tái|\\\ ;" -"钾>jiǎ|\\\ ;" -"鲥>shí|\\\ ;" -"孑>jié|\\\ ;" -"逵>kuí|\\\ ;" -"喟>kuì|\\\ ;" -"纛>dào|\\\ ;" -"炷>zhù|\\\ ;" -"犒>kào|\\\ ;" -"珈>jiā|\\\ ;" -"呦>yōu|\\\ ;" -"镂>lòu|\\\ ;" -"煲>bǎo|\\\ ;" -"岷>mín|\\\ ;" -"喑>yīn|\\\ ;" -"鱿>yóu|\\\ ;" -"箸>zhù|\\\ ;" -"铠>kǎi|\\\ ;" -"娆>rǎo|\\\ ;" -"佝>gōu|\\\ ;" -"鳅>qiū|\\\ ;" -"蚱>zhà|\\\ ;" -"痨>láo|\\\ ;" -"锲>qiè|\\\ ;" -"祚>zuò|\\\ ;" -"柚>yòu|\\\ ;" -"狯>huá|\\\ ;" -"赊>shē|\\\ ;" -"秆>gǎn|\\\ ;" -"黜>chù|\\\ ;" -"褓>bǎo|\\\ ;" -"柩>jiù|\\\ ;" -"遒>qiú|\\\ ;" -"弑>shì|\\\ ;" -"谲>jué|\\\ ;" -"黍>shǔ|\\\ ;" -"烩>huì|\\\ ;" -"诿>wěi|\\\ ;" -"摈>bìn|\\\ ;" -"螫>shì|\\\ ;" -"颦>pín|\\\ ;" -"覃>tán|\\\ ;" -"昕>xīn|\\\ ;" -"淖>nào|\\\ ;" -"筠>yún|\\\ ;" -"恚>huì|\\\ ;" -"莠>yǒu|\\\ ;" -"睾>gāo|\\\ ;" -"荚>jiá|\\\ ;" -"锉>cuò|\\\ ;" -"橛>jué|\\\ ;" -"阕>què|\\\ ;" -"阄>jiū|\\\ ;" -"峁>mǎo|\\\ ;" -"咻>xiū|\\\ ;" -"锌>xīn|\\\ ;" -"潍>wéi|\\\ ;" -"馏>liù|\\\ ;" -"苯>běn|\\\ ;" -"桎>zhì|\\\ ;" -"芾>fèi|\\\ ;" -"矍>jué|\\\ ;" -"忻>xīn|\\\ ;" -"篑>kuì|\\\ ;" -"镢>jué|\\\ ;" -"钛>tài|\\\ ;" -"祉>zhǐ|\\\ ;" -"氤>yīn|\\\ ;" -"狲>sūn|\\\ ;" -"夔>kuí|\\\ ;" -"镔>bīn|\\\ ;" -"氲>yūn|\\\ ;" -"杈>chā|\\\ ;" -"荀>xún|\\\ ;" -"钺>yuè|\\\ ;" -"浃>jiá|\\\ ;" -"痔>zhì|\\\ ;" -"衽>rèn|\\\ ;" -"燧>suì|\\\ ;" -"囿>yòu|\\\ ;" -"喙>huì|\\\ ;" -"柑>gān|\\\ ;" -"蜍>chú|\\\ ;" -"缙>jìn|\\\ ;" -"咩>miē|\\\ ;" -"霾>mái|\\\ ;" -"稔>rěn|\\\ ;" -"锛>bēn|\\\ ;" -"砣>tuó|\\\ ;" -"珉>mín|\\\ ;" -"嫔>pín|\\\ ;" -"囵>lún|\\\ ;" -"蹉>cuō|\\\ ;" -"笞>chī|\\\ ;" -"颉>jiá|\\\ ;" -"铢>zhū|\\\ ;" -"懋>mào|\\\ ;" -"猱>náo|\\\ ;" -"噱>jué|\\\ ;" -"镍>niè|\\\ ;" -"衾>qīn|\\\ ;" -"眙>chì|\\\ ;" -"胛>jiǎ|\\\ ;" -"耄>mào|\\\ ;" -"橐>tuó|\\\ ;" -"洙>zhū|\\\ ;" -"恹>yàn|\\\ ;" -"乜>miē|\\\ ;" -"蛭>zhì|\\\ ;" -"韪>wěi|\\\ ;" -"诨>hùn|\\\ ;" -"赝>yàn|\\\ ;" -"岿>kuī|\\\ ;" -"畹>wǎn|\\\ ;" -"彀>gòu|\\\ ;" -"怫>fèi|\\\ ;" -"荏>rěn|\\\ ;" -"蛔>huí|\\\ ;" -"跎>tuó|\\\ ;" -"聒>guā|\\\ ;" -"鹞>yáo|\\\ ;" -"逡>qūn|\\\ ;" -"楔>xiē|\\\ ;" -"玖>jiǔ|\\\ ;" -"赭>zhě|\\\ ;" -"羯>jié|\\\ ;" -"蝈>guō|\\\ ;" -"聩>kuì|\\\ ;" -"痂>jiā|\\\ ;" -"殒>yǔn|\\\ ;" -"逶>wēi|\\\ ;" -"宥>yòu|\\\ ;" -"啖>dàn|\\\ ;" -"燮>xiè|\\\ ;" -"粲>càn|\\\ ;" -"觐>jǐn|\\\ ;" -"沭>shù|\\\ ;" -"帼>guó|\\\ ;" -"煨>wēi|\\\ ;" -"膑>bìn|\\\ ;" -"辚>lín|\\\ ;" -"樽>zūn|\\\ ;" -"媾>gòu|\\\ ;" -"姹>chà|\\\ ;" -"徇>xùn|\\\ ;" -"薮>sǒu|\\\ ;" -"坂>bǎn|\\\ ;" -"庖>páo|\\\ ;" -"鲟>xún|\\\ ;" -"铧>huá|\\\ ;" -"焖>mèn|\\\ ;" -"肽>tài|\\\ ;" -"牦>máo|\\\ ;" -"猷>yóu|\\\ ;" -"婕>jié|\\\ ;" -"哞>mōu|\\\ ;" -"吒>zhà|\\\ ;" -"谥>shì|\\\ ;" -"铡>zhá|\\\ ;" -"焙>bèi|\\\ ;" -"榫>sǔn|\\\ ;" -"洇>yīn|\\\ ;" -"饕>tāo|\\\ ;" -"殚>dān|\\\ ;" -"绾>wǎn|\\\ ;" -"闱>wéi|\\\ ;" -"噘>juē|\\\ ;" -"唣>zào|\\\ ;" -"葳>wēi|\\\ ;" -"诟>gòu|\\\ ;" -"镭>léi|\\\ ;" -"礅>dūn|\\\ ;" -"湄>méi|\\\ ;" -"狎>xiá|\\\ ;" -"撷>xié|\\\ ;" -"诰>gào|\\\ ;" -"豸>zhì|\\\ ;" -"赧>nǎn|\\\ ;" -"舨>bǎn|\\\ ;" -"蜇>zhé|\\\ ;" -"硌>luò|\\\ ;" -"滟>yàn|\\\ ;" -"洵>xún|\\\ ;" -"嗄>shà|\\\ ;" -"刍>chú|\\\ ;" -"兖>yǎn|\\\ ;" -"巽>xùn|\\\ ;" -"铆>mǎo|\\\ ;" -"虢>guó|\\\ ;" -"濠>háo|\\\ ;" -"渚>zhǔ|\\\ ;" -"氵>sān|\\\ ;" -"呶>náo|\\\ ;" -"荪>sūn|\\\ ;" -"圩>wéi|\\\ ;" -"羸>léi|\\\ ;" -"绦>tāo|\\\ ;" -"疥>jiè|\\\ ;" -"鲧>gǔn|\\\ ;" -"瘢>bān|\\\ ;" -"歃>shà|\\\ ;" -"觏>gòu|\\\ ;" -"瑁>mào|\\\ ;" -"珲>hún|\\\ ;" -"澹>dàn|\\\ ;" -"阗>jué|\\\ ;" -"猡>luó|\\\ ;" -"馗>kuí|\\\ ;" -"泅>qiú|\\\ ;" -"矾>fán|\\\ ;" -"淬>cuì|\\\ ;" -"稗>bài|\\\ ;" -"躅>zhú|\\\ ;" -"踯>zhí|\\\ ;" -"蚩>chī|\\\ ;" -"颀>kěn|\\\ ;" -"疸>dǎn|\\\ ;" -"鸷>zhì|\\\ ;" -"柘>zhè|\\\ ;" -"杼>zhù|\\\ ;" -"缟>gǎo|\\\ ;" -"孢>bāo|\\\ ;" -"洮>táo|\\\ ;" -"岬>jiǎ|\\\ ;" -"嘬>zuō|\\\ ;" -"鲲>kūn|\\\ ;" -"耋>diè|\\\ ;" -"铊>shé|\\\ ;" -"苒>rǎn|\\\ ;" -"柞>zuò|\\\ ;" -"烷>wán|\\\ ;" -"秫>shú|\\\ ;" -"雉>zhì|\\\ ;" -"矸>gān|\\\ ;" -"焱>yàn|\\\ ;" -"赅>gāi|\\\ ;" -"晷>guǐ|\\\ ;" -"椁>guǒ|\\\ ;" -"澍>shù|\\\ ;" -"芩>qín|\\\ ;" -"妊>rèn|\\\ ;" -"酽>yàn|\\\ ;" -"颢>hào|\\\ ;" -"痱>fèi|\\\ ;" -"牝>pìn|\\\ ;" -"曜>yào|\\\ ;" -"逑>qiú|\\\ ;" -"饬>chì|\\\ ;" -"岫>xiù|\\\ ;" -"帏>wéi|\\\ ;" -"哏>hěn|\\\ ;" -"坨>tuó|\\\ ;" -"讦>jié|\\\ ;" -"痈>liē|\\\ ;" -"踅>chì|\\\ ;" -"豕>shǐ|\\\ ;" -"疱>pào|\\\ ;" -"磔>zhé|\\\ ;" -"悱>fěi|\\\ ;" -"揆>kuí|\\\ ;" -"蕨>jué|\\\ ;" -"酚>fēn|\\\ ;" -"鳗>mán|\\\ ;" -"罅>xià|\\\ ;" -"鹧>zhè|\\\ ;" -"畈>fàn|\\\ ;" -"瓒>zàn|\\\ ;" -"夤>yín|\\\ ;" -"囗>wéi|\\\ ;" -"茱>zhū|\\\ ;" -"餮>tiè|\\\ ;" -"酡>tuó|\\\ ;" -"暌>kuí|\\\ ;" -"栀>zhī|\\\ ;" -"濑>lài|\\\ ;" -"庥>xiū|\\\ ;" -"掴>guó|\\\ ;" -"郗>chī|\\\ ;" -"厝>cuò|\\\ ;" -"笳>jiā|\\\ ;" -"痧>shā|\\\ ;" -"铩>shā|\\\ ;" -"睃>jùn|\\\ ;" -"珏>jué|\\\ ;" -"汊>chà|\\\ ;" -"恽>yùn|\\\ ;" -"恂>xún|\\\ ;" -"忄>shù|\\\ ;" -"氦>hài|\\\ ;" -"鬣>liè|\\\ ;" -"鞣>róu|\\\ ;" -"颟>mán|\\\ ;" -"怼>duì|\\\ ;" -"焐>tāo|\\\ ;" -"韫>yùn|\\\ ;" -"崴>wēi|\\\ ;" -"餍>yàn|\\\ ;" -"踟>chí|\\\ ;" -"皴>cūn|\\\ ;" -"衤>chǎ|\\\ ;" -"旄>máo|\\\ ;" -"缦>màn|\\\ ;" -"缗>mín|\\\ ;" -"廪>lǐn|\\\ ;" -"趸>dǔn|\\\ ;" -"豉>chǐ|\\\ ;" -"痿>wěi|\\\ ;" -"睢>suī|\\\ ;" -"瀣>xiè|\\\ ;" -"淝>féi|\\\ ;" -"怍>zuò|\\\ ;" -"馐>xiū|\\\ ;" -"徭>yáo|\\\ ;" -"嚯>huò|\\\ ;" -"攉>huò|\\\ ;" -"蕙>huì|\\\ ;" -"邳>péi|\\\ ;" -"貉>háo|\\\ ;" -"滁>chú|\\\ ;" -"龈>kěn|\\\ ;" -"繇>yáo|\\\ ;" -"疖>jié|\\\ ;" -"歆>xīn|\\\ ;" -"赉>lài|\\\ ;" -"琰>yǎn|\\\ ;" -"纾>shū|\\\ ;" -"迨>dài|\\\ ;" -"狺>yín|\\\ ;" -"帔>pèi|\\\ ;" -"帙>zhì|\\\ ;" -"咴>huá|\\\ ;" -"薅>hāo|\\\ ;" -"麈>zhǔ|\\\ ;" -"鲑>guī|\\\ ;" -"蹰>chú|\\\ ;" -"糌>zán|\\\ ;" -"褫>chǐ|\\\ ;" -"楮>chǔ|\\\ ;" -"灏>hào|\\\ ;" -"捭>bǎi|\\\ ;" -"蕤>ruí|\\\ ;" -"葭>jiā|\\\ ;" -"葚>rèn|\\\ ;" -"荨>xún|\\\ ;" -"郅>zhì|\\\ ;" -"锗>duǒ|\\\ ;" -"鳃>sāi|\\\ ;" -"镊>niè|\\\ ;" -"鎏>liú|\\\ ;" -"趵>bào|\\\ ;" -"酹>lèi|\\\ ;" -"箪>dān|\\\ ;" -"蚶>hān|\\\ ;" -"镅>méi|\\\ ;" -"畲>shē|\\\ ;" -"桡>náo|\\\ ;" -"枸>gǒu|\\\ ;" -"溴>xiù|\\\ ;" -"浔>xún|\\\ ;" -"狒>fèi|\\\ ;" -"狁>yǔn|\\\ ;" -"揸>zhā|\\\ ;" -"茴>huí|\\\ ;" -"傧>bìn|\\\ ;" -"郧>pǒu|\\\ ;" -"辊>gǔn|\\\ ;" -"钒>fán|\\\ ;" -"麇>jūn|\\\ ;" -"酢>zuò|\\\ ;" -"臬>niè|\\\ ;" -"衿>jīn|\\\ ;" -"瘙>sāo|\\\ ;" -"毵>sān|\\\ ;" -"轫>rèn|\\\ ;" -"琬>wǎn|\\\ ;" -"孓>jué|\\\ ;" -"洌>liè|\\\ ;" -"阚>kàn|\\\ ;" -"闼>kāi|\\\ ;" -"苷>gān|\\\ ;" -"堞>dié|\\\ ;" -"坌>bèn|\\\ ;" -"勰>xié|\\\ ;" -"耒>lěi|\\\ ;" -"睚>yái|\\\ ;" -"昀>yún|\\\ ;" -"椤>luó|\\\ ;" -"绀>gàn|\\\ ;" -"妗>jìn|\\\ ;" -"悝>kuī|\\\ ;" -"嵯>cuó|\\\ ;" -"嘞>lei|\\\ ;" -"氽>tǔn|\\\ ;" -"錾>huò|\\\ ;" -"酯>zhǐ|\\\ ;" -"箧>qiè|\\\ ;" -"疣>yóu|\\\ ;" -"镓>jiā|\\\ ;" -"锸>chá|\\\ ;" -"胝>zhī|\\\ ;" -"檩>lǐn|\\\ ;" -"槎>chá|\\\ ;" -"枳>zhǐ|\\\ ;" -"尻>kāo|\\\ ;" -"沩>huì|\\\ ;" -"悃>kǔn|\\\ ;" -"蕞>zuì|\\\ ;" -"荽>suī|\\\ ;" -"墁>màn|\\\ ;" -"畚>běn|\\\ ;" -"俅>qiú|\\\ ;" -"镏>liú|\\\ ;" -"碓>duì|\\\ ;" -"礻>shì|\\\ ;" -"挈>qiè|\\\ ;" -"杲>gǎo|\\\ ;" -"楸>qiū|\\\ ;" -"桕>gāo|\\\ ;" -"溷>hùn|\\\ ;" -"泔>gān|\\\ ;" -"愦>kuì|\\\ ;" -"崤>yáo|\\\ ;" -"菽>shú|\\\ ;" -"俳>pái|\\\ ;" -"雠>chī|\\\ ;" -"趱>zǎn|\\\ ;" -"翥>zhù|\\\ ;" -"筮>shì|\\\ ;" -"颞>niè|\\\ ;" -"鸱>zhī|\\\ ;" -"锴>kǎi|\\\ ;" -"脬>pāo|\\\ ;" -"戡>kān|\\\ ;" -"缫>sāo|\\\ ;" -"骖>cān|\\\ ;" -"妫>guī|\\\ ;" -"涞>guō|\\\ ;" -"洄>huí|\\\ ;" -"獯>xūn|\\\ ;" -"狍>páo|\\\ ;" -"嵬>wéi|\\\ ;" -"呔>dāi|\\\ ;" -"墀>chí|\\\ ;" -"鄢>yān|\\\ ;" -"郯>tán|\\\ ;" -"鼐>nài|\\\ ;" -"谰>lán|\\\ ;" -"鼹>yǎn|\\\ ;" -"魑>chī|\\\ ;" -"鳕>xuě|\\\ ;" -"跆>tái|\\\ ;" -"袢>pàn|\\\ ;" -"矬>cuó|\\\ ;" -"镞>xín|\\\ ;" -"碚>bèi|\\\ ;" -"愍>mǐn|\\\ ;" -"歙>shè|\\\ ;" -"暾>tūn|\\\ ;" -"濉>suī|\\\ ;" -"溲>sōu|\\\ ;" -"飧>sūn|\\\ ;" -"犭>fǎn|\\\ ;" -"喈>jiē|\\\ ;" -"捩>liè|\\\ ;" -"菀>wǎn|\\\ ;" -"荦>luò|\\\ ;" -"埙>xūn|\\\ ;" -"陟>zhì|\\\ ;" -"侉>kuā|\\\ ;" -"氖>nǎi|\\\ ;" -"骱>xiè|\\\ ;" -"鳟>zùn|\\\ ;" -"霈>pèi|\\\ ;" -"蠖>huò|\\\ ;" -"皲>jūn|\\\ ;" -"瘊>hóu|\\\ ;" -"鸹>guā|\\\ ;" -"铙>náo|\\\ ;" -"腩>nǎn|\\\ ;" -"刖>yuè|\\\ ;" -"氘>dāo|\\\ ;" -"曛>xūn|\\\ ;" -"槿>jǐn|\\\ ;" -"榧>fěi|\\\ ;" -"骘>zhì|\\\ ;" -"潴>zhū|\\\ ;" -"泮>pàn|\\\ ;" -"搦>nuò|\\\ ;" -"堇>jǐn|\\\ ;" -"莳>shí|\\\ ;" -"堙>yīn|\\\ ;" -"垴>nǎo|\\\ ;" -"隗>wěi|\\\ ;" -"厣>yǎn|\\\ ;" -"囟>xìn|\\\ ;" -"丿>piě|\\\ ;" -"鼬>yòu|\\\ ;" -"骺>gòu|\\\ ;" -"鍪>móu|\\\ ;" -"跏>jiā|\\\ ;" -"跖>zhí|\\\ ;" -"醪>láo|\\\ ;" -"糅>rǒu|\\\ ;" -"蚋>ruì|\\\ ;" -"袷>jiá|\\\ ;" -"癍>bān|\\\ ;" -"镧>làn|\\\ ;" -"铗>jiá|\\\ ;" -"辏>còu|\\\ ;" -"橥>zhū|\\\ ;" -"桫>suō|\\\ ;" -"骝>liú|\\\ ;" -"骀>tái|\\\ ;" -"嫘>léi|\\\ ;" -"懔>lǐn|\\\ ;" -"憷>chǔ|\\\ ;" -"猞>shè|\\\ ;" -"嵝>lǒu|\\\ ;" -"摭>zhí|\\\ ;" -"藿>huò|\\\ ;" -"蒌>liǔ|\\\ ;" -"埒>lèi|\\\ ;" -"鄞>yín|\\\ ;" -"郜>gào|\\\ ;" -"儋>dān|\\\ ;" -"卣>yǒu|\\\ ;" -"爻>yáo|\\\ ;" -"炔>quē|\\\ ;" -"雒>luò|\\\ ;" -"霪>yín|\\\ ;" -"糗>qiǔ|\\\ ;" -"箬>ruò|\\\ ;" -"痤>cuó|\\\ ;" -"镲>chǎ|\\\ ;" -"锟>kūn|\\\ ;" -"眭>suī|\\\ ;" -"旒>liú|\\\ ;" -"旆>pèi|\\\ ;" -"旰>gàn|\\\ ;" -"樾>yuè|\\\ ;" -"枘>ruì|\\\ ;" -"阍>hūn|\\\ ;" -"忉>dāo|\\\ ;" -"廨>xiè|\\\ ;" -"彳>chì|\\\ ;" -"岣>gǒu|\\\ ;" -"嗾>sǒu|\\\ ;" -"哚>duǒ|\\\ ;" -"掊>póu|\\\ ;" -"拶>zǎn|\\\ ;" -"蓍>shī|\\\ ;" -"芪>chí|\\\ ;" -"艹>cǎo|\\\ ;" -"坩>gān|\\\ ;" -"郇>xún|\\\ ;" -"隈>wēi|\\\ ;" -"谳>yàn|\\\ ;" -"讠>yán|\\\ ;" -"侑>yòu|\\\ ;" -"亍>chù|\\\ ;" -"躐>liè|\\\ ;" -"蹯>fán|\\\ ;" -"踬>zhì|\\\ ;" -"糁>sān|\\\ ;" -"篚>fěi|\\\ ;" -"篌>hóu|\\\ ;" -"蛱>jiá|\\\ ;" -"裰>duō|\\\ ;" -"镙>luó|\\\ ;" -"锇>tiě|\\\ ;" -"钽>dàn|\\\ ;" -"钣>bǎn|\\\ ;" -"砘>dùn|\\\ ;" -"砗>chē|\\\ ;" -"熘>liū|\\\ ;" -"胙>zuò|\\\ ;" -"毳>cuì|\\\ ;" -"樗>chū|\\\ ;" -"柰>nài|\\\ ;" -"玢>bīn|\\\ ;" -"缧>léi|\\\ ;" -"绐>dài|\\\ ;" -"绁>xiè|\\\ ;" -"潆>piē|\\\ ;" -"阃>kǔn|\\\ ;" -"崃>lái|\\\ ;" -"噻>sai|\\\ ;" -"撙>zǔn|\\\ ;" -"蔸>dōu|\\\ ;" -"菡>hàn|\\\ ;" -"郓>yùn|\\\ ;" -"陧>niè|\\\ ;" -"诔>lěi|\\\ ;" -"龠>yuè|\\\ ;" -"偾>fèn|\\\ ;" -"剀>kǎi|\\\ ;" -"卮>zhī|\\\ ;" -"钡>bèi|\\\ ;" -"髡>kūn|\\\ ;" -"鳜>jué|\\\ ;" -"鼍>tuó|\\\ ;" -"蹀>dié|\\\ ;" -"螭>chī|\\\ ;" -"蝤>qiú|\\\ ;" -"蝣>yóu|\\\ ;" -"蚧>jiè|\\\ ;" -"虺>huī|\\\ ;" -"襻>pàn|\\\ ;" -"褙>bèi|\\\ ;" -"窨>xūn|\\\ ;" -"锎>kāi|\\\ ;" -"铈>shì|\\\ ;" -"钔>mén|\\\ ;" -"砉>huò|\\\ ;" -"煺>tuì|\\\ ;" -"栲>kǎo|\\\ ;" -"柝>tuò|\\\ ;" -"甾>zāi|\\\ ;" -"浼>měi|\\\ ;" -"唑>zuò|\\\ ;" -"蕈>xùn|\\\ ;" -"菸>yān|\\\ ;" -"埭>dài|\\\ ;" -"埽>sào|\\\ ;" -"埴>zhí|\\\ ;" -"坼>chè|\\\ ;" -"劢>mài|\\\ ;" -"郏>dòu|\\\ ;" -"诖>guà|\\\ ;" -"蠃>luǒ|\\\ ;" -"厍>shè|\\\ ;" -"鬏>jiū|\\\ ;" -"髹>xiū|\\\ ;" -"鲱>fēi|\\\ ;" -"鲩>wǎn|\\\ ;" -"鲒>jié|\\\ ;" -"觖>jué|\\\ ;" -"貅>xiū|\\\ ;" -"躞>xiè|\\\ ;" -"醢>hǎi|\\\ ;" -"醅>pēi|\\\ ;" -"艉>wěi|\\\ ;" -"舳>zhú|\\\ ;" -"筘>kòu|\\\ ;" -"笱>gǒu|\\\ ;" -"缶>fǒu|\\\ ;" -"蟪>huì|\\\ ;" -"蟊>máo|\\\ ;" -"螓>qín|\\\ ;" -"蜾>guǒ|\\\ ;" -"蚰>yóu|\\\ ;" -"聃>dān|\\\ ;" -"瓞>dié|\\\ ;" -"锞>kuǎ|\\\ ;" -"铟>yīn|\\\ ;" -"铕>yǒu|\\\ ;" -"瞀>mào|\\\ ;" -"眵>chī|\\\ ;" -"憝>duì|\\\ ;" -"爝>jué|\\\ ;" -"熳>màn|\\\ ;" -"焓>hán|\\\ ;" -"殳>shū|\\\ ;" -"腧>shù|\\\ ;" -"胍>guā|\\\ ;" -"牖>yǒu|\\\ ;" -"赆>jìn|\\\ ;" -"昴>mǎo|\\\ ;" -"昝>zǎn|\\\ ;" -"炅>guì|\\\ ;" -"瓿>pǒu|\\\ ;" -"桷>jué|\\\ ;" -"柽>jué|\\\ ;" -"柙>xiá|\\\ ;" -"缑>gōu|\\\ ;" -"驺>zōu|\\\ ;" -"彘>zhì|\\\ ;" -"遘>gòu|\\\ ;" -"隳>huī|\\\ ;" -"廑>jǐn|\\\ ;" -"庹>tuǒ|\\\ ;" -"馓>sǎn|\\\ ;" -"狃>niǔ|\\\ ;" -"豳>bīn|\\\ ;" -"崞>guō|\\\ ;" -"唼>shà|\\\ ;" -"哳>zhā|\\\ ;" -"摅>jiū|\\\ ;" -"揲>shé|\\\ ;" -"匏>páo|\\\ ;" -"蘩>fán|\\\ ;" -"藁>gǎo|\\\ ;" -"荬>mǎi|\\\ ;" -"荩>jìn|\\\ ;" -"茛>gèn|\\\ ;" -"茌>chí|\\\ ;" -"艿>nǎi|\\\ ;" -"垲>kǎi|\\\ ;" -"垤>dié|\\\ ;" -"邗>hán|\\\ ;" -"陔>gāi|\\\ ;" -"卺>jǐn|\\\ ;" -"侔>móu|\\\ ;" -"刿>guì|\\\ ;" -"嘏>jiǎ|\\\ ;" -"鼢>fén|\\\ ;" -"髌>bìn|\\\ ;" -"鳘>mǐn|\\\ ;" -"鲽>dié|\\\ ;" -"鲔>wěi|\\\ ;" -"鲐>tái|\\\ ;" -"龅>páo|\\\ ;" -"觯>zhì|\\\ ;" -"酐>gān|\\\ ;" -"絷>zhí|\\\ ;" -"糇>hóu|\\\ ;" -"艚>cáo|\\\ ;" -"簋>guǐ|\\\ ;" -"篼>dōu|\\\ ;" -"螨>mǎn|\\\ ;" -"蛑>móu|\\\ ;" -"蛞>kuò|\\\ ;" -"蛲>ráo|\\\ ;" -"蚺>rán|\\\ ;" -"裉>kèn|\\\ ;" -"袼>luò|\\\ ;" -"瘕>jiǎ|\\\ ;" -"疳>gān|\\\ ;" -"镤>lán|\\\ ;" -"镘>màn|\\\ ;" -"镄>fèi|\\\ ;" -"铹>láo|\\\ ;" -"钆>qiú|\\\ ;" -"罨>yǎn|\\\ ;" -"磙>gǔn|\\\ ;" -"硇>náo|\\\ ;" -"砩>fèi|\\\ ;" -"悫>què|\\\ ;" -"炱>tái|\\\ ;" -"炻>luò|\\\ ;" -"膦>lìn|\\\ ;" -"膪>zhà|\\\ ;" -"脞>cuǒ|\\\ ;" -"毹>shū|\\\ ;" -"赇>qiú|\\\ ;" -"轺>yáo|\\\ ;" -"轵>dié|\\\ ;" -"檫>chá|\\\ ;" -"榍>xiè|\\\ ;" -"榀>pǐn|\\\ ;" -"棼>fén|\\\ ;" -"栝>guā|\\\ ;" -"栳>lǎo|\\\ ;" -"绲>gǔn|\\\ ;" -"媸>chī|\\\ ;" -"宄>guǐ|\\\ ;" -"漤>gān|\\\ ;" -"滠>shè|\\\ ;" -"阌>wén|\\\ ;" -"庋>guǐ|\\\ ;" -"馇>chā|\\\ ;" -"饣>shí|\\\ ;" -"夂>chǔ|\\\ ;" -"獬>xiè|\\\ ;" -"崦>yān|\\\ ;" -"嚆>hāo|\\\ ;" -"吲>yǐn|\\\ ;" -"甙>dài|\\\ ;" -"撖>hàn|\\\ ;" -"薹>tái|\\\ ;" -"薤>xiè|\\\ ;" -"萏>dàn|\\\ ;" -"莰>kǎn|\\\ ;" -"茆>mǎo|\\\ ;" -"堠>hòu|\\\ ;" -"埘>shí|\\\ ;" -"埏>yán|\\\ ;" -"郾>yǎn|\\\ ;" -"郄>què|\\\ ;" -"卩>jié|\\\ ;" -"谮>zèn|\\\ ;" -"谇>suì|\\\ ;" -"僦>jiù|\\\ ;" -"倮>luǒ|\\\ ;" -"匦>guǐ|\\\ ;" -"乇>zhé|\\\ ;" -"酞>tài|\\\ ;" -"㐆>yǐn|\\\ ;" -"㐡>nuò|\\\ ;" -"㐤>qiú|\\\ ;" -"㐬>liú|\\\ ;" -"㐭>lǐn|\\\ ;" -"㐰>xìn|\\\ ;" -"㐲>dài|\\\ ;" -"㑅>zuò|\\\ ;" -"㑍>lěi|\\\ ;" -"㑎>nǎo|\\\ ;" -"㑏>zhù|\\\ ;" -"㑘>jiè|\\\ ;" -"㑙>dié|\\\ ;" -"㑚>nuó|\\\ ;" -"㑣>lán|\\\ ;" -"㑩>luó|\\\ ;" -"㑮>hún|\\\ ;" -"㑰>huì|\\\ ;" -"㑱>rǎo|\\\ ;" -"㑵>hàn|\\\ ;" -"㑷>tài|\\\ ;" -"㑹>huì|\\\ ;" -"㑺>jùn|\\\ ;" -"㑼>liù|\\\ ;" -"㒀>zhǎ|\\\ ;" -"㒆>chì|\\\ ;" -"㒈>hàn|\\\ ;" -"㒍>léi|\\\ ;" -"㒑>huì|\\\ ;" -"㒔>shǔ|\\\ ;" -"㒗>tái|\\\ ;" -"㒚>wěn|\\\ ;" -"㒝>miè|\\\ ;" -"㒞>jùn|\\\ ;" -"㒠>xiè|\\\ ;" -"㒡>yóu|\\\ ;" -"㒤>shè|\\\ ;" -"㒦>lěi|\\\ ;" -"㒩>luǒ|\\\ ;" -"㒲>cái|\\\ ;" -"㒵>mào|\\\ ;" -"㒷>guǎ|\\\ ;" -"㒸>suì|\\\ ;" -"㒻>mào|\\\ ;" -"㒼>mán|\\\ ;" -"㒾>shì|\\\ ;" -"㓂>kòu|\\\ ;" -"㓈>bèi|\\\ ;" -"㓓>nán|\\\ ;" -"㓔>xiè|\\\ ;" -"㓗>jié|\\\ ;" -"㓜>yòu|\\\ ;" -"㓢>luò|\\\ ;" -"㓣>qià|\\\ ;" -"㓤>jié|\\\ ;" -"㓧>yǎn|\\\ ;" -"㓰>huà|\\\ ;" -"㓱>tóu|\\\ ;" -"㓴>jùn|\\\ ;" -"㓶>qiè|\\\ ;" -"㓸>jué|\\\ ;" -"㓹>ruì|\\\ ;" -"㓼>chì|\\\ ;" -"㓾>chí|\\\ ;" -"㔀>lüè|\\\ ;" -"㔂>lín|\\\ ;" -"㔃>jué|\\\ ;" -"㔉>zhú|\\\ ;" -"㔊>dǎn|\\\ ;" -"㔍>duǒ|\\\ ;" -"㔎>xiè|\\\ ;" -"㔑>chì|\\\ ;" -"㔗>fèi|\\\ ;" -"㔘>chù|\\\ ;" -"㔚>kǒu|\\\ ;" -"㔢>jué|\\\ ;" -"㔣>léi|\\\ ;" -"㔧>liù|\\\ ;" -"㔨>bèi|\\\ ;" -"㔭>chè|\\\ ;" -"㔮>nuó|\\\ ;" -"㔳>guǐ|\\\ ;" -"㔷>lòu|\\\ ;" -"㔺>shì|\\\ ;" -"㔼>sǔn|\\\ ;" -"㔽>yào|\\\ ;" -"㔾>jié|\\\ ;" -"㔿>zòu|\\\ ;" -"㕁>què|\\\ ;" -"㕂>yín|\\\ ;" -"㕄>zhì|\\\ ;" -"㕅>jiǎ|\\\ ;" -"㕈>hòu|\\\ ;" -"㕏>chú|\\\ ;" -"㕐>xiě|\\\ ;" -"㕑>chú|\\\ ;" -"㕒>wéi|\\\ ;" -"㕗>yòu|\\\ ;" -"㕙>jùn|\\\ ;" -"㕜>shǐ|\\\ ;" -"㕟>kuì|\\\ ;" -"㕢>gài|\\\ ;" -"㕣>yǎn|\\\ ;" -"㕤>qiú|\\\ ;" -"㕦>huà|\\\ ;" -"㕨>fàn|\\\ ;" -"㕪>dǎn|\\\ ;" -"㕯>nèi|\\\ ;" -"㕱>yóu|\\\ ;" -"㕲>huá|\\\ ;" -"㕵>guó|\\\ ;" -"㕶>ng̀|\\\ ;" -"㕷>huà|\\\ ;" -"㕺>háo|\\\ ;" -"㕻>pǒu|\\\ ;" -"㖁>lìn|\\\ ;" -"㖃>hǒu|\\\ ;" -"㖏>nèi|\\\ ;" -"㖐>wěi|\\\ ;" -"㖑>xiè|\\\ ;" -"㖔>tǔn|\\\ ;" -"㖖>niè|\\\ ;" -"㖗>yín|\\\ ;" -"㖣>tòu|\\\ ;" -"㖤>hán|\\\ ;" -"㖧>wěn|\\\ ;" -"㖩>sǒu|\\\ ;" -"㖪>guó|\\\ ;" -"㖮>lún|\\\ ;" -"㖷>shí|\\\ ;" -"㖸>xué|\\\ ;" -"㖹>fèn|\\\ ;" -"㖻>róu|\\\ ;" -"㖼>duǒ|\\\ ;" -"㖿>xié|\\\ ;" -"㗃>wěn|\\\ ;" -"㗄>mán|\\\ ;" -"㗇>xiá|\\\ ;" -"㗈>màn|\\\ ;" -"㗋>hóu|\\\ ;" -"㗌>zhì|\\\ ;" -"㗑>bài|\\\ ;" -"㗕>gòu|\\\ ;" -"㗖>dàn|\\\ ;" -"㗗>bǎi|\\\ ;" -"㗜>xiù|\\\ ;" -"㗥>kuò|\\\ ;" -"㗦>láo|\\\ ;" -"㗧>zhì|\\\ ;" -"㗫>qiè|\\\ ;" -"㗰>chù|\\\ ;" -"㗲>huò|\\\ ;" -"㗴>yán|\\\ ;" -"㗷>sǎi|\\\ ;" -"㗿>xià|\\\ ;" -"㘀>zuò|\\\ ;" -"㘆>tái|\\\ ;" -"㘉>zhì|\\\ ;" -"㘎>hǎn|\\\ ;" -"㘐>pào|\\\ ;" -"㘓>lán|\\\ ;" -"㘔>cǎn|\\\ ;" -"㘕>hǎn|\\\ ;" -"㘖>yán|\\\ ;" -"㘙>yán|\\\ ;" -"㘚>hǎn|\\\ ;" -"㘜>chǐ|\\\ ;" -"㘞>huò|\\\ ;" -"㘡>xiá|\\\ ;" -"㘥>yóu|\\\ ;" -"㘦>qín|\\\ ;" -"㘨>nèi|\\\ ;" -"㘪>hào|\\\ ;" -"㘴>zuò|\\\ ;" -"㘶>jié|\\\ ;" -"㘿>niè|\\\ ;" -"㙀>liù|\\\ ;" -"㙂>duì|\\\ ;" -"㙅>bǎo|\\\ ;" -"㙇>chù|\\\ ;" -"㙈>hán|\\\ ;" -"㙐>duǒ|\\\ ;" -"㙓>kuí|\\\ ;" -"㙔>hán|\\\ ;" -"㙜>chí|\\\ ;" -"㙝>xié|\\\ ;" -"㙞>niè|\\\ ;" -"㙢>mán|\\\ ;" -"㙤>xià|\\\ ;" -"㙥>gǔn|\\\ ;" -"㙬>yín|\\\ ;" -"㙰>xiè|\\\ ;" -"㙱>hào|\\\ ;" -"㙳>hǎn|\\\ ;" -"㙵>tái|\\\ ;" -"㙷>zhí|\\\ ;" -"㙸>bào|\\\ ;" -"㙺>guì|\\\ ;" -"㙼>lěi|\\\ ;" -"㚃>yún|\\\ ;" -"㚌>huà|\\\ ;" -"㚍>guó|\\\ ;" -"㚏>gǎo|\\\ ;" -"㚐>tào|\\\ ;" -"㚓>lái|\\\ ;" -"㚔>niè|\\\ ;" -"㚖>gǎo|\\\ ;" -"㚗>qié|\\\ ;" -"㚘>bàn|\\\ ;" -"㚝>kuí|\\\ ;" -"㚧>yǎn|\\\ ;" -"㚩>rǎn|\\\ ;" -"㚪>hào|\\\ ;" -"㚫>shà|\\\ ;" -"㚭>yóu|\\\ ;" -"㚯>xín|\\\ ;" -"㚹>mǎo|\\\ ;" -"㚺>yùn|\\\ ;" -"㚿>páo|\\\ ;" -"㛂>nuǒ|\\\ ;" -"㛃>jié|\\\ ;" -"㛆>duǒ|\\\ ;" -"㛊>duǒ|\\\ ;" -"㛍>qiè|\\\ ;" -"㛐>sǒu|\\\ ;" -"㛑>càn|\\\ ;" -"㛒>dòu|\\\ ;" -"㛗>zuò|\\\ ;" -"㛙>qiè|\\\ ;" -"㛛>xìn|\\\ ;" -"㛜>yóu|\\\ ;" -"㛝>bèi|\\\ ;" -"㛦>lǎn|\\\ ;" -"㛧>mǎn|\\\ ;" -"㛪>yàn|\\\ ;" -"㛮>sǎo|\\\ ;" -"㛱>ruì|\\\ ;" -"㛳>chà|\\\ ;" -"㛴>nǎo|\\\ ;" -"㛸>shù|\\\ ;" -"㛻>kuǐ|\\\ ;" -"㛼>shà|\\\ ;" -"㛿>zhì|\\\ ;" -"㜄>xún|\\\ ;" -"㜇>huì|\\\ ;" -"㜌>gòu|\\\ ;" -"㜏>yún|\\\ ;" -"㜐>shù|\\\ ;" -"㜖>cáo|\\\ ;" -"㜗>cǎn|\\\ ;" -"㜛>nèn|\\\ ;" -"㜣>rán|\\\ ;" -"㜥>mái|\\\ ;" -"㜦>hàn|\\\ ;" -"㜧>yuè|\\\ ;" -"㜮>làn|\\\ ;" -"㜰>yuè|\\\ ;" -"㜶>wǎn|\\\ ;" -"㜸>niè|\\\ ;" -"㜺>zàn|\\\ ;" -"㜼>zhí|\\\ ;" -"㜾>hái|\\\ ;" -"㝀>hào|\\\ ;" -"㝁>xún|\\\ ;" -"㝂>zhì|\\\ ;" -"㝃>fàn|\\\ ;" -"㝅>gòu|\\\ ;" -"㝉>zhù|\\\ ;" -"㝌>jié|\\\ ;" -"㝍>xiě|\\\ ;" -"㝏>jiè|\\\ ;" -"㝔>yào|\\\ ;" -"㝙>yín|\\\ ;" -"㝝>lín|\\\ ;" -"㝟>máo|\\\ ;" -"㝡>zuì|\\\ ;" -"㝤>gòu|\\\ ;" -"㝦>jùn|\\\ ;" -"㝧>wěn|\\\ ;" -"㝮>cuì|\\\ ;" -"㝲>qǐn|\\\ ;" -"㝴>wán|\\\ ;" -"㝹>nóu|\\\ ;" -"㝻>jǐn|\\\ ;" -"㝾>zuǒ|\\\ ;" -"㞁>yào|\\\ ;" -"㞂>tuǐ|\\\ ;" -"㞅>guǒ|\\\ ;" -"㞇>wěi|\\\ ;" -"㞌>yùn|\\\ ;" -"㞏>zhé|\\\ ;" -"㞑>wěi|\\\ ;" -"㞕>xiè|\\\ ;" -"㞗>qiú|\\\ ;" -"㞘>tún|\\\ ;" -"㞠>láo|\\\ ;" -"㞤>yín|\\\ ;" -"㞥>cén|\\\ ;" -"㞧>huì|\\\ ;" -"㞨>zǎi|\\\ ;" -"㞩>lán|\\\ ;" -"㞪>náo|\\\ ;" -"㞬>qìn|\\\ ;" -"㞭>dài|\\\ ;" -"㞯>jié|\\\ ;" -"㞳>dǒu|\\\ ;" -"㞴>chí|\\\ ;" -"㞶>mǐn|\\\ ;" -"㞸>suì|\\\ ;" -"㞻>hào|\\\ ;" -"㞽>xuè|\\\ ;" -"㞿>chì|\\\ ;" -"㟂>chǐ|\\\ ;" -"㟆>huá|\\\ ;" -"㟇>cuó|\\\ ;" -"㟈>qiú|\\\ ;" -"㟉>láo|\\\ ;" -"㟋>duì|\\\ ;" -"㟎>tuǒ|\\\ ;" -"㟏>hán|\\\ ;" -"㟔>hán|\\\ ;" -"㟙>lǎo|\\\ ;" -"㟛>zàn|\\\ ;" -"㟝>péi|\\\ ;" -"㟦>yùn|\\\ ;" -"㟩>mín|\\\ ;" -"㟪>wěi|\\\ ;" -"㟬>shǔ|\\\ ;" -"㟭>mín|\\\ ;" -"㟱>yǎo|\\\ ;" -"㟲>jué|\\\ ;" -"㟹>láo|\\\ ;" -"㟺>lóu|\\\ ;" -"㠀>dǎo|\\\ ;" -"㠇>jiù|\\\ ;" -"㠈>rùn|\\\ ;" -"㠏>huá|\\\ ;" -"㠑>zuì|\\\ ;" -"㠔>bài|\\\ ;" -"㠕>wěi|\\\ ;" -"㠙>háo|\\\ ;" -"㠚>duì|\\\ ;" -"㠢>huà|\\\ ;" -"㠣>lài|\\\ ;" -"㠴>rèn|\\\ ;" -"㠶>fán|\\\ ;" -"㠹>jiè|\\\ ;" -"㡁>kǎi|\\\ ;" -"㡄>sǔn|\\\ ;" -"㡅>nuǒ|\\\ ;" -"㡈>mén|\\\ ;" -"㡊>qià|\\\ ;" -"㡌>mào|\\\ ;" -"㡏>tóu|\\\ ;" -"㡜>xuě|\\\ ;" -"㡞>lěi|\\\ ;" -"㡡>chú|\\\ ;" -"㡢>màn|\\\ ;" -"㡥>yǐn|\\\ ;" -"㡪>nié|\\\ ;" -"㡱>jiǔ|\\\ ;" -"㡷>běn|\\\ ;" -"㡸>zhǎ|\\\ ;" -"㡺>dàn|\\\ ;" -"㡿>chì|\\\ ;" -"㢁>chǐ|\\\ ;" -"㢂>yǎn|\\\ ;" -"㢄>dòu|\\\ ;" -"㢈>tuí|\\\ ;" -"㢉>chá|\\\ ;" -"㢋>chǐ|\\\ ;" -"㢎>chà|\\\ ;" -"㢏>tóu|\\\ ;" -"㢑>tuí|\\\ ;" -"㢒>chá|\\\ ;" -"㢓>yǎo|\\\ ;" -"㢙>qín|\\\ ;" -"㢛>yàn|\\\ ;" -"㢨>hàn|\\\ ;" -"㢮>chí|\\\ ;" -"㢯>mín|\\\ ;" -"㢲>xùn|\\\ ;" -"㢵>shè|\\\ ;" -"㢻>wěi|\\\ ;" -"㢼>biè|\\\ ;" -"㣁>bèi|\\\ ;" -"㣅>zàn|\\\ ;" -"㣍>tái|\\\ ;" -"㣓>càn|\\\ ;" -"㣞>duó|\\\ ;" -"㣥>zhì|\\\ ;" -"㣧>yìn|\\\ ;" -"㣯>xiè|\\\ ;" -"㣰>xiè|\\\ ;" -"㣲>wéi|\\\ ;" -"㣼>rěn|\\\ ;" -"㣽>shù|\\\ ;" -"㣾>chà|\\\ ;" -"㤄>pèi|\\\ ;" -"㤆>fàn|\\\ ;" -"㤈>qìn|\\\ ;" -"㤉>qià|\\\ ;" -"㤑>yòu|\\\ ;" -"㤓>bèn|\\\ ;" -"㤕>chù|\\\ ;" -"㤖>zhù|\\\ ;" -"㤘>chù|\\\ ;" -"㤛>nín|\\\ ;" -"㤜>jué|\\\ ;" -"㤞>chà|\\\ ;" -"㤠>liè|\\\ ;" -"㤥>hài|\\\ ;" -"㤧>hóu|\\\ ;" -"㤬>huì|\\\ ;" -"㤰>zǎn|\\\ ;" -"㤲>qiè|\\\ ;" -"㤳>běi|\\\ ;" -"㤹>qiú|\\\ ;" -"㤾>sàn|\\\ ;" -"㥃>mèn|\\\ ;" -"㥇>cán|\\\ ;" -"㥈>dié|\\\ ;" -"㥉>chè|\\\ ;" -"㥎>lái|\\\ ;" -"㥒>cǎi|\\\ ;" -"㥜>wèi|\\\ ;" -"㥞>cuì|\\\ ;" -"㥟>xié|\\\ ;" -"㥢>qiú|\\\ ;" -"㥣>huì|\\\ ;" -"㥦>qiè|\\\ ;" -"㥩>duǒ|\\\ ;" -"㥪>lóu|\\\ ;" -"㥭>tài|\\\ ;" -"㥯>yǐn|\\\ ;" -"㥱>fěi|\\\ ;" -"㥵>hùn|\\\ ;" -"㥸>mǐn|\\\ ;" -"㥹>fěn|\\\ ;" -"㥼>yǐn|\\\ ;" -"㦊>huá|\\\ ;" -"㦌>tuì|\\\ ;" -"㦎>huà|\\\ ;" -"㦏>sǔn|\\\ ;" -"㦔>yàn|\\\ ;" -"㦖>mèn|\\\ ;" -"㦜>huò|\\\ ;" -"㦟>hài|\\\ ;" -"㦢>jié|\\\ ;" -"㦣>wèi|\\\ ;" -"㦧>cǎn|\\\ ;" -"㦨>lán|\\\ ;" -"㦩>yǐn|\\\ ;" -"㦪>xiè|\\\ ;" -"㦬>luǒ|\\\ ;" -"㦯>huò|\\\ ;" -"㦶>dié|\\\ ;" -"㦹>àng|\\\ ;" -"㧇>mǎo|\\\ ;" -"㧈>yǐn|\\\ ;" -"㧉>gài|\\\ ;" -"㧌>mào|\\\ ;" -"㧑>wéi|\\\ ;" -"㧒>xué|\\\ ;" -"㧕>jiù|\\\ ;" -"㧘>cuì|\\\ ;" -"㧜>liè|\\\ ;" -"㧡>hài|\\\ ;" -"㧣>zhù|\\\ ;" -"㧨>qiú|\\\ ;" -"㧩>pèi|\\\ ;" -"㧪>guǐ|\\\ ;" -"㧯>lǎo|\\\ ;" -"㧲>sǎn|\\\ ;" -"㧵>póu|\\\ ;" -"㧷>duò|\\\ ;" -"㧻>zhǐ|\\\ ;" -"㨁>zhí|\\\ ;" -"㨅>nèi|\\\ ;" -"㨆>lǐn|\\\ ;" -"㨉>mǐn|\\\ ;" -"㨊>wěi|\\\ ;" -"㨋>chě|\\\ ;" -"㨌>gòu|\\\ ;" -"㨒>kuí|\\\ ;" -"㨓>láo|\\\ ;" -"㨔>hàn|\\\ ;" -"㨖>zhì|\\\ ;" -"㨗>jié|\\\ ;" -"㨙>xié|\\\ ;" -"㨚>xún|\\\ ;" -"㨝>xiè|\\\ ;" -"㨟>hái|\\\ ;" -"㨡>hún|\\\ ;" -"㨤>huì|\\\ ;" -"㨧>bèn|\\\ ;" -"㨨>liù|\\\ ;" -"㨩>jié|\\\ ;" -"㨫>lǎn|\\\ ;" -"㨯>huò|\\\ ;" -"㨱>yáo|\\\ ;" -"㨳>guǐ|\\\ ;" -"㨷>jìn|\\\ ;" -"㨹>huì|\\\ ;" -"㨺>mén|\\\ ;" -"㨻>cán|\\\ ;" -"㨼>lüè|\\\ ;" -"㩁>què|\\\ ;" -"㩆>jiù|\\\ ;" -"㩇>huà|\\\ ;" -"㩉>xié|\\\ ;" -"㩌>fèi|\\\ ;" -"㩒>qín|\\\ ;" -"㩓>huǐ|\\\ ;" -"㩔>tún|\\\ ;" -"㩜>lǎn|\\\ ;" -"㩝>háo|\\\ ;" -"㩡>luǒ|\\\ ;" -"㩦>xié|\\\ ;" -"㩨>huì|\\\ ;" -"㩪>xié|\\\ ;" -"㩯>bǎn|\\\ ;" -"㩱>jué|\\\ ;" -"㩲>kǔn|\\\ ;" -"㩶>niè|\\\ ;" -"㩸>dié|\\\ ;" -"㩹>dié|\\\ ;" -"㩻>guǐ|\\\ ;" -"㪁>qín|\\\ ;" -"㪈>guì|\\\ ;" -"㪊>qún|\\\ ;" -"㪋>hàn|\\\ ;" -"㪔>sàn|\\\ ;" -"㪗>tǒu|\\\ ;" -"㪚>sàn|\\\ ;" -"㪞>mào|\\\ ;" -"㪦>yìn|\\\ ;" -"㪫>ruì|\\\ ;" -"㪯>chá|\\\ ;" -"㪴>jiá|\\\ ;" -"㪵>bàn|\\\ ;" -"㪷>dǒu|\\\ ;" -"㪹>lǒu|\\\ ;" -"㪽>suǒ|\\\ ;" -"㪿>zhé|\\\ ;" -"㫂>zhù|\\\ ;" -"㫃>yǎn|\\\ ;" -"㫅>chá|\\\ ;" -"㫍>yóu|\\\ ;" -"㫎>gǔn|\\\ ;" -"㫏>yǎo|\\\ ;" -"㫐>yǎo|\\\ ;" -"㫑>shí|\\\ ;" -"㫔>gèn|\\\ ;" -"㫗>hòu|\\\ ;" -"㫜>dàn|\\\ ;" -"㫟>yán|\\\ ;" -"㫧>bào|\\\ ;" -"㫯>mào|\\\ ;" -"㫱>nǎn|\\\ ;" -"㫲>pèi|\\\ ;" -"㫶>cǒu|\\\ ;" -"㫸>qiè|\\\ ;" -"㫹>dài|\\\ ;" -"㫻>kùn|\\\ ;" -"㫼>dié|\\\ ;" -"㬃>tái|\\\ ;" -"㬅>màn|\\\ ;" -"㬋>hóu|\\\ ;" -"㬐>jǐn|\\\ ;" -"㬔>háo|\\\ ;" -"㬙>wěi|\\\ ;" -"㬚>chè|\\\ ;" -"㬜>jìn|\\\ ;" -"㬣>duì|\\\ ;" -"㬦>yuè|\\\ ;" -"㬩>huì|\\\ ;" -"㬪>dié|\\\ ;" -"㬫>yàn|\\\ ;" -"㬯>liè|\\\ ;" -"㬶>hào|\\\ ;" -"㬿>dùn|\\\ ;" -"㭄>xìn|\\\ ;" -"㭈>jué|\\\ ;" -"㭉>huá|\\\ ;" -"㭌>móu|\\\ ;" -"㭏>wěi|\\\ ;" -"㭑>mèi|\\\ ;" -"㭙>shé|\\\ ;" -"㭛>pài|\\\ ;" -"㭝>qiú|\\\ ;" -"㭞>liè|\\\ ;" -"㭨>xié|\\\ ;" -"㭩>lèi|\\\ ;" -"㭭>fèi|\\\ ;" -"㭮>zuò|\\\ ;" -"㭯>dié|\\\ ;" -"㭺>yǎn|\\\ ;" -"㭾>jué|\\\ ;" -"㭿>áng|\\\ ;" -"㮀>hán|\\\ ;" -"㮁>yáo|\\\ ;" -"㮃>ruí|\\\ ;" -"㮆>niè|\\\ ;" -"㮈>nài|\\\ ;" -"㮋>yǒu|\\\ ;" -"㮏>nài|\\\ ;" -"㮓>gèn|\\\ ;" -"㮖>jiá|\\\ ;" -"㮗>qín|\\\ ;" -"㮘>mào|\\\ ;" -"㮛>chí|\\\ ;" -"㮞>jié|\\\ ;" -"㮢>hóu|\\\ ;" -"㮣>gài|\\\ ;" -"㮥>fèn|\\\ ;" -"㮮>jié|\\\ ;" -"㮯>huá|\\\ ;" -"㮶>shì|\\\ ;" -"㮹>zhǐ|\\\ ;" -"㮺>běn|\\\ ;" -"㯂>dài|\\\ ;" -"㯉>huò|\\\ ;" -"㯊>hén|\\\ ;" -"㯎>nèn|\\\ ;" -"㯔>cuì|\\\ ;" -"㯗>rǎn|\\\ ;" -"㯙>chè|\\\ ;" -"㯜>cuì|\\\ ;" -"㯡>pào|\\\ ;" -"㯥>cáo|\\\ ;" -"㯮>shǔ|\\\ ;" -"㯰>zhé|\\\ ;" -"㯲>jìn|\\\ ;" -"㯸>jǐn|\\\ ;" -"㯻>gǔn|\\\ ;" -"㯿>liè|\\\ ;" -"㰁>luǒ|\\\ ;" -"㰆>bèi|\\\ ;" -"㰊>xún|\\\ ;" -"㰋>pín|\\\ ;" -"㰌>què|\\\ ;" -"㰎>zuì|\\\ ;" -"㰐>jué|\\\ ;" -"㰒>shé|\\\ ;" -"㰔>xiè|\\\ ;" -"㰖>lǎn|\\\ ;" -"㰙>nuó|\\\ ;" -"㰛>yuè|\\\ ;" -"㰡>xiè|\\\ ;" -"㰥>huì|\\\ ;" -"㰬>xún|\\\ ;" -"㰯>kòu|\\\ ;" -"㰰>qiè|\\\ ;" -"㰱>shà|\\\ ;" -"㰶>yǒu|\\\ ;" -"㰹>jìn|\\\ ;" -"㰺>xiá|\\\ ;" -"㰼>qiè|\\\ ;" -"㱀>chǐ|\\\ ;" -"㱁>shì|\\\ ;" -"㱃>yǐn|\\\ ;" -"㱈>jìn|\\\ ;" -"㱋>què|\\\ ;" -"㱌>chè|\\\ ;" -"㱖>cuì|\\\ ;" -"㱙>xiǔ|\\\ ;" -"㱚>cán|\\\ ;" -"㱜>zhá|\\\ ;" -"㱣>tuǐ|\\\ ;" -"㱪>mèn|\\\ ;" -"㱫>làn|\\\ ;" -"㱬>wěi|\\\ ;" -"㱰>zǎi|\\\ ;" -"㱱>huì|\\\ ;" -"㱵>bèn|\\\ ;" -"㱻>luǒ|\\\ ;" -"㱽>dàn|\\\ ;" -"㱿>què|\\\ ;" -"㲃>jiù|\\\ ;" -"㲄>kòu|\\\ ;" -"㲉>kài|\\\ ;" -"㲊>ruì|\\\ ;" -"㲎>lóu|\\\ ;" -"㲏>bǎo|\\\ ;" -"㲒>bào|\\\ ;" -"㲕>lèi|\\\ ;" -"㲛>zhǐ|\\\ ;" -"㲜>tán|\\\ ;" -"㲠>máo|\\\ ;" -"㲡>nài|\\\ ;" -"㲦>hàn|\\\ ;" -"㲧>zào|\\\ ;" -"㲭>tǎn|\\\ ;" -"㲯>rán|\\\ ;" -"㲱>liè|\\\ ;" -"㲲>dié|\\\ ;" -"㲳>dié|\\\ ;" -"㲷>dàn|\\\ ;" -"㲹>guǐ|\\\ ;" -"㳀>guò|\\\ ;" -"㳂>yán|\\\ ;" -"㳃>cuì|\\\ ;" -"㳆>shǔ|\\\ ;" -"㳈>pèi|\\\ ;" -"㳏>chǐ|\\\ ;" -"㳔>duì|\\\ ;" -"㳕>lán|\\\ ;" -"㳦>xiè|\\\ ;" -"㳪>pàn|\\\ ;" -"㳶>gòu|\\\ ;" -"㳷>wěn|\\\ ;" -"㳺>yóu|\\\ ;" -"㳿>xiè|\\\ ;" -"㴀>fàn|\\\ ;" -"㴃>lèi|\\\ ;" -"㴆>jìn|\\\ ;" -"㴇>shè|\\\ ;" -"㴈>yìn|\\\ ;" -"㴓>zǎi|\\\ ;" -"㴖>luò|\\\ ;" -"㴘>mào|\\\ ;" -"㴙>zhá|\\\ ;" -"㴚>suì|\\\ ;" -"㴛>zhì|\\\ ;" -"㴪>niè|\\\ ;" -"㴫>jùn|\\\ ;" -"㴬>xiè|\\\ ;" -"㴭>yǎo|\\\ ;" -"㴮>xiè|\\\ ;" -"㴶>què|\\\ ;" -"㴽>xiè|\\\ ;" -"㵃>chè|\\\ ;" -"㵄>hàn|\\\ ;" -"㵅>dàn|\\\ ;" -"㵆>hào|\\\ ;" -"㵍>mèn|\\\ ;" -"㵎>hǎn|\\\ ;" -"㵏>cuǐ|\\\ ;" -"㵐>jué|\\\ ;" -"㵒>fèi|\\\ ;" -"㵓>shí|\\\ ;" -"㵔>chě|\\\ ;" -"㵘>màn|\\\ ;" -"㵡>báo|\\\ ;" -"㵢>léi|\\\ ;" -"㵦>suí|\\\ ;" -"㵭>zhǔ|\\\ ;" -"㵵>zòu|\\\ ;" -"㵸>yào|\\\ ;" -"㵺>pái|\\\ ;" -"㵻>sòu|\\\ ;" -"㵽>duì|\\\ ;" -"㶁>guó|\\\ ;" -"㶄>yán|\\\ ;" -"㶅>xué|\\\ ;" -"㶆>chú|\\\ ;" -"㶔>bèi|\\\ ;" -"㶖>shù|\\\ ;" -"㶗>fàn|\\\ ;" -"㶟>lěi|\\\ ;" -"㶡>dài|\\\ ;" -"㶦>jìn|\\\ ;" -"㶧>nèn|\\\ ;" -"㶬>méi|\\\ ;" -"㶭>jiù|\\\ ;" -"㶯>liù|\\\ ;" -"㶰>hán|\\\ ;" -"㶳>jìn|\\\ ;" -"㶴>chǐ|\\\ ;" -"㶵>rèn|\\\ ;" -"㷂>shù|\\\ ;" -"㷃>cuǐ|\\\ ;" -"㷄>huì|\\\ ;" -"㷆>dòu|\\\ ;" -"㷉>wèi|\\\ ;" -"㷊>fén|\\\ ;" -"㷋>tán|\\\ ;" -"㷍>lún|\\\ ;" -"㷐>huǐ|\\\ ;" -"㷔>yàn|\\\ ;" -"㷕>qiú|\\\ ;" -"㷘>tái|\\\ ;" -"㷟>tuì|\\\ ;" -"㷠>lín|\\\ ;" -"㷢>zhǎ|\\\ ;" -"㷪>cuì|\\\ ;" -"㷳>yàn|\\\ ;" -"㷶>bèi|\\\ ;" -"㷸>dié|\\\ ;" -"㷼>yàn|\\\ ;" -"㷾>jué|\\\ ;" -"㸀>tái|\\\ ;" -"㸁>hǎn|\\\ ;" -"㸅>jié|\\\ ;" -"㸉>xiè|\\\ ;" -"㸋>fán|\\\ ;" -"㸌>huò|\\\ ;" -"㸎>niè|\\\ ;" -"㸐>rán|\\\ ;" -"㸒>yín|\\\ ;" -"㸕>jué|\\\ ;" -"㸘>wàn|\\\ ;" -"㸝>kǎn|\\\ ;" -"㸞>bǎn|\\\ ;" -"㸢>bèi|\\\ ;" -"㸧>kèn|\\\ ;" -"㸬>bèi|\\\ ;" -"㸮>fén|\\\ ;" -"㸰>tuó|\\\ ;" -"㸱>tuó|\\\ ;" -"㸲>zuó|\\\ ;" -"㸵>guǐ|\\\ ;" -"㸷>shì|\\\ ;" -"㸸>hǒu|\\\ ;" -"㸹>liè|\\\ ;" -"㸽>bèi|\\\ ;" -"㸾>rèn|\\\ ;" -"㹊>yuè|\\\ ;" -"㹎>léi|\\\ ;" -"㹏>jǐn|\\\ ;" -"㹗>táo|\\\ ;" -"㹛>ráo|\\\ ;" -"㹜>yín|\\\ ;" -"㹝>shì|\\\ ;" -"㹞>yín|\\\ ;" -"㹟>jué|\\\ ;" -"㹠>tún|\\\ ;" -"㹤>qiè|\\\ ;" -"㹥>zhù|\\\ ;" -"㹨>yòu|\\\ ;" -"㹬>shǐ|\\\ ;" -"㹷>shǐ|\\\ ;" -"㹼>chǔ|\\\ ;" -"㺀>náo|\\\ ;" -"㺁>nǎo|\\\ ;" -"㺂>gǎn|\\\ ;" -"㺃>gǒu|\\\ ;" -"㺅>hóu|\\\ ;" -"㺏>lóu|\\\ ;" -"㺑>cán|\\\ ;" -"㺔>hài|\\\ ;" -"㺕>fán|\\\ ;" -"㺖>hǎn|\\\ ;" -"㺗>dàn|\\\ ;" -"㺛>zhù|\\\ ;" -"㺜>bǎn|\\\ ;" -"㺠>yòu|\\\ ;" -"㺩>jiù|\\\ ;" -"㺫>qiú|\\\ ;" -"㺲>niǔ|\\\ ;" -"㺳>méi|\\\ ;" -"㺵>jiú|\\\ ;" -"㺺>mào|\\\ ;" -"㻀>yóu|\\\ ;" -"㻄>bǎo|\\\ ;" -"㻅>huì|\\\ ;" -"㻒>jùn|\\\ ;" -"㻔>duǒ|\\\ ;" -"㻕>jué|\\\ ;" -"㻖>dài|\\\ ;" -"㻗>bèi|\\\ ;" -"㻟>suí|\\\ ;" -"㻡>dié|\\\ ;" -"㻧>duò|\\\ ;" -"㻪>suì|\\\ ;" -"㻮>càn|\\\ ;" -"㻸>cén|\\\ ;" -"㻽>suì|\\\ ;" -"㻿>shǔ|\\\ ;" -"㼈>luó|\\\ ;" -"㼉>yìn|\\\ ;" -"㼊>tún|\\\ ;" -"㼍>lěi|\\\ ;" -"㼎>bèi|\\\ ;" -"㼏>něi|\\\ ;" -"㼒>qiǔ|\\\ ;" -"㼜>àng|\\\ ;" -"㼝>fàn|\\\ ;" -"㼟>bái|\\\ ;" -"㼠>tuó|\\\ ;" -"㼣>bǎi|\\\ ;" -"㼥>chú|\\\ ;" -"㼨>hán|\\\ ;" -"㼪>jiá|\\\ ;" -"㼮>mái|\\\ ;" -"㼲>liè|\\\ ;" -"㽉>hǎn|\\\ ;" -"㽊>xiè|\\\ ;" -"㽋>luó|\\\ ;" -"㽌>liù|\\\ ;" -"㽎>dǎn|\\\ ;" -"㽑>tán|\\\ ;" -"㽕>yóu|\\\ ;" -"㽖>nán|\\\ ;" -"㽙>jùn|\\\ ;" -"㽚>chì|\\\ ;" -"㽛>kòu|\\\ ;" -"㽜>wǎn|\\\ ;" -"㽞>liú|\\\ ;" -"㽟>liè|\\\ ;" -"㽠>xiá|\\\ ;" -"㽥>róu|\\\ ;" -"㽦>xún|\\\ ;" -"㽨>cuó|\\\ ;" -"㽩>càn|\\\ ;" -"㽰>shù|\\\ ;" -"㽳>hàn|\\\ ;" -"㽹>fàn|\\\ ;" -"㾀>qiè|\\\ ;" -"㾁>shù|\\\ ;" -"㾃>tuó|\\\ ;" -"㾆>rán|\\\ ;" -"㾋>xiù|\\\ ;" -"㾍>nái|\\\ ;" -"㾏>jiè|\\\ ;" -"㾙>yǐn|\\\ ;" -"㾛>qǐn|\\\ ;" -"㾜>qiè|\\\ ;" -"㾝>chè|\\\ ;" -"㾞>yǒu|\\\ ;" -"㾡>què|\\\ ;" -"㾢>lài|\\\ ;" -"㾯>tuí|\\\ ;" -"㾱>bèi|\\\ ;" -"㾸>gǎo|\\\ ;" -"㾻>zhù|\\\ ;" -"㾼>tuǐ|\\\ ;" -"㾽>tuí|\\\ ;" -"㿃>dài|\\\ ;" -"㿉>tuí|\\\ ;" -"㿊>cǎn|\\\ ;" -"㿋>sào|\\\ ;" -"㿍>jiè|\\\ ;" -"㿎>fèn|\\\ ;" -"㿏>qún|\\\ ;" -"㿑>yào|\\\ ;" -"㿒>dǎo|\\\ ;" -"㿓>jiá|\\\ ;" -"㿔>lěi|\\\ ;" -"㿕>yán|\\\ ;" -"㿗>tuí|\\\ ;" -"㿚>luò|\\\ ;" -"㿜>biě|\\\ ;" -"㿞>mào|\\\ ;" -"㿟>bái|\\\ ;" -"㿢>yào|\\\ ;" -"㿭>chè|\\\ ;" -"㿱>xué|\\\ ;" -"㿵>rǎn|\\\ ;" -"㿷>zào|\\\ ;" -"㿸>wǎn|\\\ ;" -"㿺>báo|\\\ ;" -"㿼>yán|\\\ ;" -"㿾>zhù|\\\ ;" -"䀀>fán|\\\ ;" -"䀁>yòu|\\\ ;" -"䀃>tuí|\\\ ;" -"䀅>shè|\\\ ;" -"䀆>jìn|\\\ ;" -"䀋>yán|\\\ ;" -"䀍>kàn|\\\ ;" -"䀐>sǎn|\\\ ;" -"䀔>niú|\\\ ;" -"䀗>jué|\\\ ;" -"䀚>áng|\\\ ;" -"䀛>mèi|\\\ ;" -"䀟>fán|\\\ ;" -"䀤>mào|\\\ ;" -"䀩>luò|\\\ ;" -"䀫>jiá|\\\ ;" -"䀷>jié|\\\ ;" -"䀹>jiá|\\\ ;" -"䀻>pìn|\\\ ;" -"䀼>rèn|\\\ ;" -"䀽>yán|\\\ ;" -"䁅>bèi|\\\ ;" -"䁋>shé|\\\ ;" -"䁍>jià|\\\ ;" -"䁏>yǎo|\\\ ;" -"䁓>jiè|\\\ ;" -"䁔>hàn|\\\ ;" -"䁕>mín|\\\ ;" -"䁗>kǎi|\\\ ;" -"䁘>yǎo|\\\ ;" -"䁙>yǎn|\\\ ;" -"䁚>sǔn|\\\ ;" -"䁛>guǐ|\\\ ;" -"䁟>chá|\\\ ;" -"䁤>chè|\\\ ;" -"䁨>huò|\\\ ;" -"䁪>nǎn|\\\ ;" -"䁯>shè|\\\ ;" -"䁲>mái|\\\ ;" -"䁷>jué|\\\ ;" -"䁺>shì|\\\ ;" -"䁽>liè|\\\ ;" -"䁾>miè|\\\ ;" -"䂄>huò|\\\ ;" -"䂉>hóu|\\\ ;" -"䂒>jié|\\\ ;" -"䂕>huì|\\\ ;" -"䂖>shí|\\\ ;" -"䂚>yáo|\\\ ;" -"䂝>jié|\\\ ;" -"䂞>zhè|\\\ ;" -"䂠>shé|\\\ ;" -"䂥>mín|\\\ ;" -"䂩>yàn|\\\ ;" -"䂮>lüè|\\\ ;" -"䂱>cuì|\\\ ;" -"䂳>cuǒ|\\\ ;" -"䂴>yán|\\\ ;" -"䂶>jié|\\\ ;" -"䂸>guó|\\\ ;" -"䂹>suǒ|\\\ ;" -"䂺>wǎn|\\\ ;" -"䂼>niè|\\\ ;" -"䂾>lǎi|\\\ ;" -"䃀>cuì|\\\ ;" -"䃂>gǔn|\\\ ;" -"䃉>mín|\\\ ;" -"䃑>pán|\\\ ;" -"䃓>gòu|\\\ ;" -"䃕>láo|\\\ ;" -"䃞>shú|\\\ ;" -"䃡>cén|\\\ ;" -"䃣>huǐ|\\\ ;" -"䃩>náo|\\\ ;" -"䃪>tán|\\\ ;" -"䃫>dǎn|\\\ ;" -"䃬>wěi|\\\ ;" -"䃭>gǎn|\\\ ;" -"䃲>pán|\\\ ;" -"䃹>làn|\\\ ;" -"䄀>huò|\\\ ;" -"䄂>liù|\\\ ;" -"䄆>huó|\\\ ;" -"䄈>dòu|\\\ ;" -"䄋>yǎn|\\\ ;" -"䄑>huó|\\\ ;" -"䄒>niè|\\\ ;" -"䄕>shè|\\\ ;" -"䄚>cáo|\\\ ;" -"䄛>lóu|\\\ ;" -"䄟>cuì|\\\ ;" -"䄤>lài|\\\ ;" -"䄩>náo|\\\ ;" -"䄷>dàn|\\\ ;" -"䄺>zhì|\\\ ;" -"䄾>ròu|\\\ ;" -"䅀>liè|\\\ ;" -"䅋>wǎn|\\\ ;" -"䅎>yǒu|\\\ ;" -"䅏>huì|\\\ ;" -"䅑>ruí|\\\ ;" -"䅗>suì|\\\ ;" -"䅘>lái|\\\ ;" -"䅙>hùn|\\\ ;" -"䅜>duò|\\\ ;" -"䅟>cǎn|\\\ ;" -"䅢>jiù|\\\ ;" -"䅥>jié|\\\ ;" -"䅦>máo|\\\ ;" -"䅧>yàn|\\\ ;" -"䅩>zhǐ|\\\ ;" -"䅪>tuí|\\\ ;" -"䅱>hùn|\\\ ;" -"䅳>chú|\\\ ;" -"䅴>suǒ|\\\ ;" -"䅶>nòu|\\\ ;" -"䅹>lóu|\\\ ;" -"䅼>mán|\\\ ;" -"䅾>cén|\\\ ;" -"䅿>huá|\\\ ;" -"䆀>měi|\\\ ;" -"䆃>dǎo|\\\ ;" -"䆈>zhì|\\\ ;" -"䆊>cuì|\\\ ;" -"䆏>fèi|\\\ ;" -"䆐>guó|\\\ ;" -"䆒>jiù|\\\ ;" -"䆕>jué|\\\ ;" -"䆙>yáo|\\\ ;" -"䆛>chá|\\\ ;" -"䆜>yòu|\\\ ;" -"䆝>shù|\\\ ;" -"䆞>yǎo|\\\ ;" -"䆢>jué|\\\ ;" -"䆬>yǔn|\\\ ;" -"䆮>jìn|\\\ ;" -"䆱>tǎn|\\\ ;" -"䆾>lán|\\\ ;" -"䇈>guì|\\\ ;" -"䇋>hài|\\\ ;" -"䇎>què|\\\ ;" -"䇏>duì|\\\ ;" -"䇒>jiè|\\\ ;" -"䇔>luò|\\\ ;" -"䇖>yǔn|\\\ ;" -"䇙>yǐn|\\\ ;" -"䇛>zhǐ|\\\ ;" -"䇞>gǎn|\\\ ;" -"䇡>zhù|\\\ ;" -"䇤>duì|\\\ ;" -"䇧>zhù|\\\ ;" -"䇭>lǎo|\\\ ;" -"䇮>rèn|\\\ ;" -"䇶>jué|\\\ ;" -"䇹>jùn|\\\ ;" -"䇻>huì|\\\ ;" -"䇼>chì|\\\ ;" -"䇽>zhì|\\\ ;" -"䇾>yán|\\\ ;" -"䈁>lún|\\\ ;" -"䈄>hán|\\\ ;" -"䈆>dài|\\\ ;" -"䈈>féi|\\\ ;" -"䈉>shà|\\\ ;" -"䈏>báo|\\\ ;" -"䈐>kuì|\\\ ;" -"䈑>guǎ|\\\ ;" -"䈒>nǎn|\\\ ;" -"䈕>chí|\\\ ;" -"䈗>suǒ|\\\ ;" -"䈚>tái|\\\ ;" -"䈜>qìn|\\\ ;" -"䈢>sǎi|\\\ ;" -"䈧>wěi|\\\ ;" -"䈲>pán|\\\ ;" -"䈷>luò|\\\ ;" -"䈹>sǒu|\\\ ;" -"䈼>miè|\\\ ;" -"䈿>mài|\\\ ;" -"䉀>shù|\\\ ;" -"䉂>lěi|\\\ ;" -"䉅>zhì|\\\ ;" -"䉈>sǎn|\\\ ;" -"䉊>fàn|\\\ ;" -"䉋>mèi|\\\ ;" -"䉌>suì|\\\ ;" -"䉏>xiè|\\\ ;" -"䉒>fán|\\\ ;" -"䉓>léi|\\\ ;" -"䉙>yún|\\\ ;" -"䉜>zhì|\\\ ;" -"䉞>dǎn|\\\ ;" -"䉟>huò|\\\ ;" -"䉠>wéi|\\\ ;" -"䉡>tán|\\\ ;" -"䉣>xiè|\\\ ;" -"䉤>sǒu|\\\ ;" -"䉧>liú|\\\ ;" -"䉪>lèi|\\\ ;" -"䉬>fèi|\\\ ;" -"䉭>liè|\\\ ;" -"䉮>lìn|\\\ ;" -"䉰>yáo|\\\ ;" -"䉲>biè|\\\ ;" -"䉷>dàn|\\\ ;" -"䉽>bǎn|\\\ ;" -"䊃>pèi|\\\ ;" -"䊆>jiù|\\\ ;" -"䊈>méi|\\\ ;" -"䊉>sǎn|\\\ ;" -"䊊>mèi|\\\ ;" -"䊓>shì|\\\ ;" -"䊖>lǎn|\\\ ;" -"䊘>jiù|\\\ ;" -"䊙>yán|\\\ ;" -"䊝>xiè|\\\ ;" -"䊞>zhé|\\\ ;" -"䊟>mén|\\\ ;" -"䊡>mán|\\\ ;" -"䊤>tán|\\\ ;" -"䊨>luó|\\\ ;" -"䊩>fán|\\\ ;" -"䊫>cuǐ|\\\ ;" -"䊬>chà|\\\ ;" -"䊰>chǔ|\\\ ;" -"䊵>qiú|\\\ ;" -"䊻>yǎn|\\\ ;" -"䊼>chǐ|\\\ ;" -"䋀>kuà|\\\ ;" -"䋂>yáo|\\\ ;" -"䋃>mào|\\\ ;" -"䋉>jué|\\\ ;" -"䋋>mín|\\\ ;" -"䋏>zuò|\\\ ;" -"䋐>yuè|\\\ ;" -"䋕>rèn|\\\ ;" -"䋢>biè|\\\ ;" -"䋣>fán|\\\ ;" -"䋤>yào|\\\ ;" -"䋦>fán|\\\ ;" -"䋭>huò|\\\ ;" -"䋮>jìn|\\\ ;" -"䋱>lái|\\\ ;" -"䋲>chě|\\\ ;" -"䋳>bèi|\\\ ;" -"䋴>niù|\\\ ;" -"䋷>liú|\\\ ;" -"䋸>xún|\\\ ;" -"䋻>nín|\\\ ;" -"䋾>zhǎ|\\\ ;" -"䌆>guì|\\\ ;" -"䌇>huì|\\\ ;" -"䌊>yáo|\\\ ;" -"䌍>hàn|\\\ ;" -"䌎>lüè|\\\ ;" -"䌓>fán|\\\ ;" -"䌖>jié|\\\ ;" -"䌛>yáo|\\\ ;" -"䌜>niè|\\\ ;" -"䌝>jìn|\\\ ;" -"䌤>zhǐ|\\\ ;" -"䌥>yǐn|\\\ ;" -"䌦>dǎo|\\\ ;" -"䌨>cài|\\\ ;" -"䌪>yán|\\\ ;" -"䌫>lǎn|\\\ ;" -"䌰>shè|\\\ ;" -"䌱>luò|\\\ ;" -"䌴>luò|\\\ ;" -"䌵>zhú|\\\ ;" -"䌼>ruì|\\\ ;" -"䌽>cǎi|\\\ ;" -"䌾>rén|\\\ ;" -"䍀>lán|\\\ ;" -"䍁>suì|\\\ ;" -"䍃>yáo|\\\ ;" -"䍆>zhù|\\\ ;" -"䍊>jué|\\\ ;" -"䍎>cùn|\\\ ;" -"䍐>hǎn|\\\ ;" -"䍑>hǎn|\\\ ;" -"䍒>mǒu|\\\ ;" -"䍙>méi|\\\ ;" -"䍣>léi|\\\ ;" -"䍥>lèi|\\\ ;" -"䍩>ǎng|\\\ ;" -"䍪>kuì|\\\ ;" -"䍫>tuó|\\\ ;" -"䍯>guǐ|\\\ ;" -"䍲>nái|\\\ ;" -"䍴>duò|\\\ ;" -"䍷>guì|\\\ ;" -"䍼>cán|\\\ ;" -"䍾>tuí|\\\ ;" -"䎀>xuè|\\\ ;" -"䎂>bǎo|\\\ ;" -"䎃>rǎn|\\\ ;" -"䎉>shù|\\\ ;" -"䎝>chú|\\\ ;" -"䎤>chú|\\\ ;" -"䎦>yǎn|\\\ ;" -"䎯>hàn|\\\ ;" -"䎰>zuó|\\\ ;" -"䎲>zhé|\\\ ;" -"䎷>zhù|\\\ ;" -"䎹>wén|\\\ ;" -"䎺>zhǐ|\\\ ;" -"䎽>wén|\\\ ;" -"䎾>gǔn|\\\ ;" -"䎿>qiú|\\\ ;" -"䏁>zǎi|\\\ ;" -"䏂>sǒu|\\\ ;" -"䏄>zhì|\\\ ;" -"䏆>cáo|\\\ ;" -"䏐>jué|\\\ ;" -"䏔>niǔ|\\\ ;" -"䏕>rěn|\\\ ;" -"䏗>gài|\\\ ;" -"䏙>tǎn|\\\ ;" -"䏟>biè|\\\ ;" -"䏡>shì|\\\ ;" -"䏣>jué|\\\ ;" -"䏦>huá|\\\ ;" -"䏨>huǐ|\\\ ;" -"䏬>móu|\\\ ;" -"䏯>zhì|\\\ ;" -"䏰>rěn|\\\ ;" -"䏲>dié|\\\ ;" -"䏳>zhè|\\\ ;" -"䏷>hàn|\\\ ;" -"䏼>cán|\\\ ;" -"䐄>hàn|\\\ ;" -"䐆>cǎi|\\\ ;" -"䐈>zhí|\\\ ;" -"䐑>zhé|\\\ ;" -"䐓>róu|\\\ ;" -"䐔>bìn|\\\ ;" -"䐘>jué|\\\ ;" -"䐝>suǒ|\\\ ;" -"䐞>ruò|\\\ ;" -"䐢>zhù|\\\ ;" -"䐣>cuò|\\\ ;" -"䐤>chí|\\\ ;" -"䐧>kào|\\\ ;" -"䐩>kǎi|\\\ ;" -"䐪>fàn|\\\ ;" -"䐬>cáo|\\\ ;" -"䐭>zhì|\\\ ;" -"䐯>léi|\\\ ;" -"䐲>zhé|\\\ ;" -"䐴>guì|\\\ ;" -"䐶>jǐn|\\\ ;" -"䐸>guó|\\\ ;" -"䐹>sào|\\\ ;" -"䐺>tàn|\\\ ;" -"䐽>mán|\\\ ;" -"䐾>duó|\\\ ;" -"䑇>zhì|\\\ ;" -"䑊>wéi|\\\ ;" -"䑋>náo|\\\ ;" -"䑌>lán|\\\ ;" -"䑍>yàn|\\\ ;" -"䑓>tái|\\\ ;" -"䑔>fèi|\\\ ;" -"䑕>shǔ|\\\ ;" -"䑘>chá|\\\ ;" -"䑙>rán|\\\ ;" -"䑛>chǐ|\\\ ;" -"䑝>jiǎ|\\\ ;" -"䑤>jìn|\\\ ;" -"䑨>duò|\\\ ;" -"䑬>yào|\\\ ;" -"䑱>mán|\\\ ;" -"䑲>chè|\\\ ;" -"䑳>lún|\\\ ;" -"䑶>cán|\\\ ;" -"䑻>yóu|\\\ ;" -"䒃>cào|\\\ ;" -"䒆>chè|\\\ ;" -"䒑>cǎo|\\\ ;" -"䒓>kǎi|\\\ ;" -"䒔>bài|\\\ ;" -"䒖>xìn|\\\ ;" -"䒜>niú|\\\ ;" -"䒠>fǎn|\\\ ;" -"䒡>yǐn|\\\ ;" -"䒢>áng|\\\ ;" -"䒣>rǎn|\\\ ;" -"䒦>fàn|\\\ ;" -"䒨>shǐ|\\\ ;" -"䒫>dài|\\\ ;" -"䒲>chà|\\\ ;" -"䒳>duǒ|\\\ ;" -"䒴>yǒu|\\\ ;" -"䒵>hào|\\\ ;" -"䒹>lèi|\\\ ;" -"䒺>jǐn|\\\ ;" -"䒽>méi|\\\ ;" -"䓂>yán|\\\ ;" -"䓄>yín|\\\ ;" -"䓆>zhé|\\\ ;" -"䓌>zhì|\\\ ;" -"䓍>hǎn|\\\ ;" -"䓕>tuǒ|\\\ ;" -"䓘>jiù|\\\ ;" -"䓟>liè|\\\ ;" -"䓭>chà|\\\ ;" -"䓮>mào|\\\ ;" -"䓲>ruì|\\\ ;" -"䓳>hěn|\\\ ;" -"䓶>lài|\\\ ;" -"䓺>měi|\\\ ;" -"䓿>hǎn|\\\ ;" -"䔄>yáo|\\\ ;" -"䔈>gǎn|\\\ ;" -"䔑>xié|\\\ ;" -"䔒>bèi|\\\ ;" -"䔘>zuò|\\\ ;" -"䔜>nán|\\\ ;" -"䔟>chí|\\\ ;" -"䔢>huá|\\\ ;" -"䔪>duì|\\\ ;" -"䔳>nǎn|\\\ ;" -"䔷>qín|\\\ ;" -"䔹>suì|\\\ ;" -"䔺>wéi|\\\ ;" -"䔿>jiè|\\\ ;" -"䕁>fěi|\\\ ;" -"䕃>yìn|\\\ ;" -"䕅>sǎo|\\\ ;" -"䕆>dòu|\\\ ;" -"䕇>huì|\\\ ;" -"䕈>xiè|\\\ ;" -"䕊>tán|\\\ ;" -"䕌>zhì|\\\ ;" -"䕑>jùn|\\\ ;" -"䕓>chá|\\\ ;" -"䕕>màn|\\\ ;" -"䕙>jié|\\\ ;" -"䕚>kuì|\\\ ;" -"䕛>jiá|\\\ ;" -"䕠>fèi|\\\ ;" -"䕢>zhǎ|\\\ ;" -"䕩>lǎo|\\\ ;" -"䕫>kuí|\\\ ;" -"䕰>bàn|\\\ ;" -"䕱>dǒu|\\\ ;" -"䕲>lǐn|\\\ ;" -"䕵>xié|\\\ ;" -"䕼>nán|\\\ ;" -"䕽>zhú|\\\ ;" -"䕾>yán|\\\ ;" -"䕿>hàn|\\\ ;" -"䖃>yuè|\\\ ;" -"䖄>rán|\\\ ;" -"䖈>nüè|\\\ ;" -"䖋>nüè|\\\ ;" -"䖌>qín|\\\ ;" -"䖎>xiá|\\\ ;" -"䖏>chǔ|\\\ ;" -"䖐>jìn|\\\ ;" -"䖔>hàn|\\\ ;" -"䖖>xiá|\\\ ;" -"䖗>yán|\\\ ;" -"䖛>suǒ|\\\ ;" -"䖜>yín|\\\ ;" -"䖣>sào|\\\ ;" -"䖤>wǎn|\\\ ;" -"䖨>shí|\\\ ;" -"䖯>guì|\\\ ;" -"䖰>pài|\\\ ;" -"䖲>xún|\\\ ;" -"䖳>zhà|\\\ ;" -"䖴>yáo|\\\ ;" -"䖻>yóu|\\\ ;" -"䖼>jué|\\\ ;" -"䗋>móu|\\\ ;" -"䗔>hóu|\\\ ;" -"䗕>wǎn|\\\ ;" -"䗖>chì|\\\ ;" -"䗙>hán|\\\ ;" -"䗜>liú|\\\ ;" -"䗝>cán|\\\ ;" -"䗞>cán|\\\ ;" -"䗡>yán|\\\ ;" -"䗢>suǒ|\\\ ;" -"䗣>gǎo|\\\ ;" -"䗪>zhè|\\\ ;" -"䗯>jìn|\\\ ;" -"䗲>lìn|\\\ ;" -"䗺>yǎn|\\\ ;" -"䗻>jié|\\\ ;" -"䗽>wèi|\\\ ;" -"䘅>nái|\\\ ;" -"䘇>wén|\\\ ;" -"䘉>cán|\\\ ;" -"䘊>miè|\\\ ;" -"䘑>mài|\\\ ;" -"䘓>kàn|\\\ ;" -"䘙>wèi|\\\ ;" -"䘚>zhú|\\\ ;" -"䘢>zhǔ|\\\ ;" -"䘤>shù|\\\ ;" -"䘥>xiá|\\\ ;" -"䘫>nòu|\\\ ;" -"䘭>dié|\\\ ;" -"䘶>hàn|\\\ ;" -"䘹>zuì|\\\ ;" -"䘼>wǎn|\\\ ;" -"䘿>jué|\\\ ;" -"䙁>cán|\\\ ;" -"䙃>duò|\\\ ;" -"䙅>yào|\\\ ;" -"䙆>guì|\\\ ;" -"䙈>hóu|\\\ ;" -"䙉>xún|\\\ ;" -"䙊>xiè|\\\ ;" -"䙌>huì|\\\ ;" -"䙎>xié|\\\ ;" -"䙓>bǎi|\\\ ;" -"䙕>chù|\\\ ;" -"䙘>chǔ|\\\ ;" -"䙙>chí|\\\ ;" -"䙝>xiè|\\\ ;" -"䙟>duò|\\\ ;" -"䙠>jué|\\\ ;" -"䙡>huì|\\\ ;" -"䙤>duǒ|\\\ ;" -"䙨>guǒ|\\\ ;" -"䙿>wèi|\\\ ;" -"䚃>yóu|\\\ ;" -"䚅>lái|\\\ ;" -"䚋>yùn|\\\ ;" -"䚑>mái|\\\ ;" -"䚞>dǎi|\\\ ;" -"䚟>dǎi|\\\ ;" -"䚠>hùn|\\\ ;" -"䚢>chè|\\\ ;" -"䚥>nuò|\\\ ;" -"䚦>zhì|\\\ ;" -"䚧>liú|\\\ ;" -"䚨>fèi|\\\ ;" -"䚬>lín|\\\ ;" -"䚯>tǎo|\\\ ;" -"䚱>xìn|\\\ ;" -"䚳>xiè|\\\ ;" -"䚵>tǎo|\\\ ;" -"䚸>xiè|\\\ ;" -"䚺>yáo|\\\ ;" -"䚻>yáo|\\\ ;" -"䚽>hào|\\\ ;" -"䚾>nín|\\\ ;" -"䚿>yìn|\\\ ;" -"䛀>fǎn|\\\ ;" -"䛁>nán|\\\ ;" -"䛂>chí|\\\ ;" -"䛅>xiá|\\\ ;" -"䛈>shì|\\\ ;" -"䛌>páo|\\\ ;" -"䛍>fèi|\\\ ;" -"䛗>zhǐ|\\\ ;" -"䛘>nín|\\\ ;" -"䛚>lüè|\\\ ;" -"䛛>huì|\\\ ;" -"䛜>xùn|\\\ ;" -"䛝>náo|\\\ ;" -"䛞>hǎn|\\\ ;" -"䛟>jiá|\\\ ;" -"䛠>dòu|\\\ ;" -"䛡>huà|\\\ ;" -"䛨>xìn|\\\ ;" -"䛮>jiù|\\\ ;" -"䛰>hún|\\\ ;" -"䛲>mán|\\\ ;" -"䛶>lěi|\\\ ;" -"䛷>wǎn|\\\ ;" -"䛸>chè|\\\ ;" -"䛹>càn|\\\ ;" -"䛺>jiè|\\\ ;" -"䛻>yòu|\\\ ;" -"䛼>huǐ|\\\ ;" -"䛽>zhǎ|\\\ ;" -"䜀>nǎo|\\\ ;" -"䜄>chí|\\\ ;" -"䜅>wéi|\\\ ;" -"䜇>gǔn|\\\ ;" -"䜊>zào|\\\ ;" -"䜋>huì|\\\ ;" -"䜎>láo|\\\ ;" -"䜑>qià|\\\ ;" -"䜓>niè|\\\ ;" -"䜔>suí|\\\ ;" -"䜕>mài|\\\ ;" -"䜖>tàn|\\\ ;" -"䜗>xìn|\\\ ;" -"䜜>wèi|\\\ ;" -"䜠>chè|\\\ ;" -"䜧>nǎo|\\\ ;" -"䜩>yàn|\\\ ;" -"䜪>qiú|\\\ ;" -"䜭>jùn|\\\ ;" -"䜱>mǎn|\\\ ;" -"䜲>liè|\\\ ;" -"䜴>chù|\\\ ;" -"䜵>chǐ|\\\ ;" -"䜸>měi|\\\ ;" -"䜹>shù|\\\ ;" -"䜻>chǐ|\\\ ;" -"䝁>láo|\\\ ;" -"䝂>shù|\\\ ;" -"䝃>zhé|\\\ ;" -"䝊>shà|\\\ ;" -"䝌>jué|\\\ ;" -"䝍>jùn|\\\ ;" -"䝏>lóu|\\\ ;" -"䝐>wéi|\\\ ;" -"䝒>zhù|\\\ ;" -"䝕>zhé|\\\ ;" -"䝞>hào|\\\ ;" -"䝡>màn|\\\ ;" -"䝢>màn|\\\ ;" -"䝤>lǎo|\\\ ;" -"䝥>háo|\\\ ;" -"䝧>mén|\\\ ;" -"䝪>shú|\\\ ;" -"䝫>zuó|\\\ ;" -"䝬>zhù|\\\ ;" -"䝭>gòu|\\\ ;" -"䝲>jìn|\\\ ;" -"䝳>cán|\\\ ;" -"䝷>zhì|\\\ ;" -"䝹>wǎn|\\\ ;" -"䝿>guì|\\\ ;" -"䞀>gòu|\\\ ;" -"䞃>zhì|\\\ ;" -"䞆>suǒ|\\\ ;" -"䞇>dié|\\\ ;" -"䞈>guǐ|\\\ ;" -"䞊>xùn|\\\ ;" -"䞌>shé|\\\ ;" -"䞔>wěi|\\\ ;" -"䞕>dié|\\\ ;" -"䞖>shǔ|\\\ ;" -"䞡>tǎn|\\\ ;" -"䞢>zhà|\\\ ;" -"䞣>chě|\\\ ;" -"䞥>yòu|\\\ ;" -"䞧>hòu|\\\ ;" -"䞨>guǐ|\\\ ;" -"䞫>yǔn|\\\ ;" -"䞬>tòu|\\\ ;" -"䞭>qiǔ|\\\ ;" -"䞰>zuó|\\\ ;" -"䞵>juě|\\\ ;" -"䞷>jué|\\\ ;" -"䞽>suǒ|\\\ ;" -"䞾>chí|\\\ ;" -"䟂>mán|\\\ ;" -"䟈>zhí|\\\ ;" -"䟉>zhú|\\\ ;" -"䟕>chà|\\\ ;" -"䟗>shì|\\\ ;" -"䟙>qiè|\\\ ;" -"䟝>tòu|\\\ ;" -"䟞>chú|\\\ ;" -"䟠>yuè|\\\ ;" -"䟣>chù|\\\ ;" -"䟨>mín|\\\ ;" -"䟩>liě|\\\ ;" -"䟬>qiù|\\\ ;" -"䟯>kuò|\\\ ;" -"䟵>qiú|\\\ ;" -"䟶>cuò|\\\ ;" -"䟷>chì|\\\ ;" -"䟸>kuí|\\\ ;" -"䟹>liè|\\\ ;" -"䟾>juě|\\\ ;" -"䠂>chú|\\\ ;" -"䠅>kǔn|\\\ ;" -"䠇>jué|\\\ ;" -"䠉>huà|\\\ ;" -"䠊>fèi|\\\ ;" -"䠍>qiá|\\\ ;" -"䠑>kuǐ|\\\ ;" -"䠔>suì|\\\ ;" -"䠗>qiù|\\\ ;" -"䠙>bèi|\\\ ;" -"䠟>dié|\\\ ;" -"䠠>chì|\\\ ;" -"䠡>cuó|\\\ ;" -"䠤>duǒ|\\\ ;" -"䠥>bié|\\\ ;" -"䠦>zhè|\\\ ;" -"䠧>chú|\\\ ;" -"䠩>guì|\\\ ;" -"䠫>zòu|\\\ ;" -"䠭>lái|\\\ ;" -"䠯>yuè|\\\ ;" -"䠱>shǔ|\\\ ;" -"䠴>qǐn|\\\ ;" -"䠶>shè|\\\ ;" -"䠽>hái|\\\ ;" -"䠿>wài|\\\ ;" -"䡂>jiù|\\\ ;" -"䡅>mǐn|\\\ ;" -"䡇>yuè|\\\ ;" -"䡈>jué|\\\ ;" -"䡊>fán|\\\ ;" -"䡐>tuó|\\\ ;" -"䡑>mín|\\\ ;" -"䡚>mào|\\\ ;" -"䡛>yìn|\\\ ;" -"䡝>yǔn|\\\ ;" -"䡡>xié|\\\ ;" -"䡨>chà|\\\ ;" -"䡬>màn|\\\ ;" -"䡵>suì|\\\ ;" -"䡶>bèi|\\\ ;" -"䡷>kài|\\\ ;" -"䡹>zhì|\\\ ;" -"䡺>wèi|\\\ ;" -"䡻>mín|\\\ ;" -"䡾>nèi|\\\ ;" -"䢁>yuè|\\\ ;" -"䢊>yóu|\\\ ;" -"䢙>bài|\\\ ;" -"䢟>yóu|\\\ ;" -"䢡>xiè|\\\ ;" -"䢣>yáo|\\\ ;" -"䢤>shù|\\\ ;" -"䢥>yán|\\\ ;" -"䢫>suí|\\\ ;" -"䢭>yàn|\\\ ;" -"䢮>lèi|\\\ ;" -"䢯>lín|\\\ ;" -"䢰>tái|\\\ ;" -"䢲>yuè|\\\ ;" -"䢵>yún|\\\ ;" -"䣀>guǐ|\\\ ;" -"䣂>lěi|\\\ ;" -"䣇>qiú|\\\ ;" -"䣋>cǎi|\\\ ;" -"䣍>yǎn|\\\ ;" -"䣔>suǒ|\\\ ;" -"䣙>péi|\\\ ;" -"䣚>lóu|\\\ ;" -"䣜>cuó|\\\ ;" -"䣟>cán|\\\ ;" -"䣠>jié|\\\ ;" -"䣦>lèi|\\\ ;" -"䣬>zǎi|\\\ ;" -"䣭>tài|\\\ ;" -"䣲>fàn|\\\ ;" -"䣶>huó|\\\ ;" -"䣸>rǎn|\\\ ;" -"䤁>cén|\\\ ;" -"䤂>méi|\\\ ;" -"䤃>yìn|\\\ ;" -"䤆>kuí|\\\ ;" -"䤋>guó|\\\ ;" -"䤐>jǐn|\\\ ;" -"䤕>xuè|\\\ ;" -"䤖>bào|\\\ ;" -"䤗>gǎn|\\\ ;" -"䤛>qiú|\\\ ;" -"䤜>dùn|\\\ ;" -"䤞>yǔn|\\\ ;" -"䤡>rǎn|\\\ ;" -"䤣>lüè|\\\ ;" -"䤥>guǐ|\\\ ;" -"䤦>yuè|\\\ ;" -"䤧>huì|\\\ ;" -"䤩>chá|\\\ ;" -"䤪>duǒ|\\\ ;" -"䤮>shè|\\\ ;" -"䤱>shì|\\\ ;" -"䤲>chì|\\\ ;" -"䤴>hán|\\\ ;" -"䤵>fèi|\\\ ;" -"䤷>yán|\\\ ;" -"䤺>yǐn|\\\ ;" -"䤻>duò|\\\ ;" -"䤿>qiè|\\\ ;" -"䥁>hán|\\\ ;" -"䥃>yuè|\\\ ;" -"䥆>jǐn|\\\ ;" -"䥍>zhì|\\\ ;" -"䥐>móu|\\\ ;" -"䥑>wàn|\\\ ;" -"䥕>piě|\\\ ;" -"䥙>suì|\\\ ;" -"䥛>jié|\\\ ;" -"䥣>záo|\\\ ;" -"䥤>báo|\\\ ;" -"䥩>wéi|\\\ ;" -"䥫>tiě|\\\ ;" -"䥮>zhú|\\\ ;" -"䥱>xiě|\\\ ;" -"䥷>zhá|\\\ ;" -"䥾>xiě|\\\ ;" -"䦆>jué|\\\ ;" -"䦌>chù|\\\ ;" -"䦏>xiè|\\\ ;" -"䦑>xiè|\\\ ;" -"䦔>tǎn|\\\ ;" -"䦖>xiá|\\\ ;" -"䦚>huò|\\\ ;" -"䦞>rùn|\\\ ;" -"䦠>shǐ|\\\ ;" -"䦢>kuò|\\\ ;" -"䦦>qín|\\\ ;" -"䦧>qié|\\\ ;" -"䦨>lán|\\\ ;" -"䦬>què|\\\ ;" -"䦯>zhì|\\\ ;" -"䦱>kuǐ|\\\ ;" -"䦹>shí|\\\ ;" -"䦼>jué|\\\ ;" -"䦾>yǔn|\\\ ;" -"䧁>chù|\\\ ;" -"䧂>dào|\\\ ;" -"䧒>lái|\\\ ;" -"䧚>hào|\\\ ;" -"䧥>huì|\\\ ;" -"䧦>wéi|\\\ ;" -"䧪>chè|\\\ ;" -"䧫>háo|\\\ ;" -"䧰>hùn|\\\ ;" -"䧲>hàn|\\\ ;" -"䧶>kuí|\\\ ;" -"䧷>róu|\\\ ;" -"䧽>cuǐ|\\\ ;" -"䧿>què|\\\ ;" -"䨁>chè|\\\ ;" -"䨄>yàn|\\\ ;" -"䨋>nüè|\\\ ;" -"䨌>báo|\\\ ;" -"䨐>qià|\\\ ;" -"䨓>léi|\\\ ;" -"䨔>báo|\\\ ;" -"䨙>cén|\\\ ;" -"䨡>hán|\\\ ;" -"䨢>dàn|\\\ ;" -"䨪>mái|\\\ ;" -"䨫>mài|\\\ ;" -"䨮>xuě|\\\ ;" -"䨲>nóu|\\\ ;" -"䨴>duì|\\\ ;" -"䨵>dàn|\\\ ;" -"䨶>yǔn|\\\ ;" -"䨸>yǐn|\\\ ;" -"䨺>duì|\\\ ;" -"䨽>fěi|\\\ ;" -"䨾>fěi|\\\ ;" -"䩀>bèi|\\\ ;" -"䩃>shì|\\\ ;" -"䩈>huì|\\\ ;" -"䩊>wǎn|\\\ ;" -"䩏>miè|\\\ ;" -"䩔>duò|\\\ ;" -"䩕>áng|\\\ ;" -"䩝>páo|\\\ ;" -"䩡>jiá|\\\ ;" -"䩣>duǒ|\\\ ;" -"䩥>dàn|\\\ ;" -"䩧>xiè|\\\ ;" -"䩱>shù|\\\ ;" -"䩳>shǔ|\\\ ;" -"䩵>yùn|\\\ ;" -"䩾>zhè|\\\ ;" -"䩿>fén|\\\ ;" -"䪋>wèi|\\\ ;" -"䪍>lán|\\\ ;" -"䪑>tuó|\\\ ;" -"䪗>xiá|\\\ ;" -"䪘>wěi|\\\ ;" -"䪛>fán|\\\ ;" -"䪤>fán|\\\ ;" -"䪥>dié|\\\ ;" -"䪧>chí|\\\ ;" -"䪨>báo|\\\ ;" -"䪩>yín|\\\ ;" -"䪱>gǎi|\\\ ;" -"䪳>yǔn|\\\ ;" -"䪷>hòu|\\\ ;" -"䪸>mín|\\\ ;" -"䪹>péi|\\\ ;" -"䪽>hào|\\\ ;" -"䫀>gěn|\\\ ;" -"䫂>duǒ|\\\ ;" -"䫅>sàn|\\\ ;" -"䫇>rán|\\\ ;" -"䫈>zèn|\\\ ;" -"䫉>mào|\\\ ;" -"䫋>tuí|\\\ ;" -"䫐>lín|\\\ ;" -"䫒>mén|\\\ ;" -"䫕>zhì|\\\ ;" -"䫗>xiá|\\\ ;" -"䫛>hóu|\\\ ;" -"䫞>ráo|\\\ ;" -"䫟>hún|\\\ ;" -"䫠>péi|\\\ ;" -"䫥>kuǐ|\\\ ;" -"䫩>sǎn|\\\ ;" -"䫫>lóu|\\\ ;" -"䫭>huì|\\\ ;" -"䫮>cán|\\\ ;" -"䫰>lìn|\\\ ;" -"䫲>hàn|\\\ ;" -"䫴>jìn|\\\ ;" -"䫶>fán|\\\ ;" -"䫸>náo|\\\ ;" -"䫻>xué|\\\ ;" -"䫼>xuè|\\\ ;" -"䬀>yǒu|\\\ ;" -"䬂>xuè|\\\ ;" -"䬈>duì|\\\ ;" -"䬉>hào|\\\ ;" -"䬊>qiè|\\\ ;" -"䬎>guó|\\\ ;" -"䬐>wěi|\\\ ;" -"䬑>wèi|\\\ ;" -"䬙>yáo|\\\ ;" -"䬞>táo|\\\ ;" -"䬟>liú|\\\ ;" -"䬡>zhù|\\\ ;" -"䬦>dòu|\\\ ;" -"䬫>cǎn|\\\ ;" -"䬱>bèn|\\\ ;" -"䬳>bǎn|\\\ ;" -"䬷>shě|\\\ ;" -"䬹>zhì|\\\ ;" -"䬽>duì|\\\ ;" -"䬿>wěi|\\\ ;" -"䭀>xùn|\\\ ;" -"䭁>zhì|\\\ ;" -"䭃>rěn|\\\ ;" -"䭄>shì|\\\ ;" -"䭉>suǐ|\\\ ;" -"䭋>bǎo|\\\ ;" -"䭎>xié|\\\ ;" -"䭖>zhù|\\\ ;" -"䭘>yàn|\\\ ;" -"䭙>jǐn|\\\ ;" -"䭛>dàn|\\\ ;" -"䭥>xuè|\\\ ;" -"䭱>bié|\\\ ;" -"䭳>wèi|\\\ ;" -"䭵>fán|\\\ ;" -"䭷>liú|\\\ ;" -"䭹>áng|\\\ ;" -"䭺>áng|\\\ ;" -"䭽>qún|\\\ ;" -"䭾>tuó|\\\ ;" -"䮈>chí|\\\ ;" -"䮑>lèi|\\\ ;" -"䮔>zuǐ|\\\ ;" -"䮜>shà|\\\ ;" -"䮞>chù|\\\ ;" -"䮟>sǒu|\\\ ;" -"䮢>dié|\\\ ;" -"䮧>hán|\\\ ;" -"䮨>zǎi|\\\ ;" -"䮫>lóu|\\\ ;" -"䮮>mài|\\\ ;" -"䮰>dǎn|\\\ ;" -"䮱>zhú|\\\ ;" -"䮳>fán|\\\ ;" -"䮹>wèi|\\\ ;" -"䮻>chì|\\\ ;" -"䮼>lín|\\\ ;" -"䯀>niè|\\\ ;" -"䯁>luó|\\\ ;" -"䯅>niè|\\\ ;" -"䯈>wán|\\\ ;" -"䯊>qià|\\\ ;" -"䯎>gàn|\\\ ;" -"䯏>huó|\\\ ;" -"䯐>hái|\\\ ;" -"䯓>kuí|\\\ ;" -"䯔>cén|\\\ ;" -"䯝>suǐ|\\\ ;" -"䯟>duì|\\\ ;" -"䯣>guì|\\\ ;" -"䯨>fén|\\\ ;" -"䯪>kǎo|\\\ ;" -"䯫>hào|\\\ ;" -"䯬>duǒ|\\\ ;" -"䯮>nái|\\\ ;" -"䯰>jiè|\\\ ;" -"䯵>niè|\\\ ;" -"䯶>mán|\\\ ;" -"䯺>kuò|\\\ ;" -"䰁>fèi|\\\ ;" -"䰂>cài|\\\ ;" -"䰄>shì|\\\ ;" -"䰆>róu|\\\ ;" -"䰈>chǎ|\\\ ;" -"䰉>pán|\\\ ;" -"䰋>mán|\\\ ;" -"䰎>guì|\\\ ;" -"䰐>lán|\\\ ;" -"䰔>pán|\\\ ;" -"䰘>liú|\\\ ;" -"䰚>wén|\\\ ;" -"䰞>zhǔ|\\\ ;" -"䰟>hún|\\\ ;" -"䰡>chì|\\\ ;" -"䰥>huò|\\\ ;" -"䰨>mèi|\\\ ;" -"䰩>chě|\\\ ;" -"䰪>mèi|\\\ ;" -"䰭>nòu|\\\ ;" -"䰺>jiè|\\\ ;" -"䰼>xín|\\\ ;" -"䰽>bèi|\\\ ;" -"䰿>tuó|\\\ ;" -"䱂>yǒu|\\\ ;" -"䱄>jiè|\\\ ;" -"䱋>dǎn|\\\ ;" -"䱏>tǒu|\\\ ;" -"䱑>xué|\\\ ;" -"䱕>móu|\\\ ;" -"䱖>liú|\\\ ;" -"䱜>cuò|\\\ ;" -"䱞>liú|\\\ ;" -"䱥>zhí|\\\ ;" -"䱨>zhì|\\\ ;" -"䱲>yán|\\\ ;" -"䱺>hái|\\\ ;" -"䱻>huá|\\\ ;" -"䱾>lóu|\\\ ;" -"䲀>dié|\\\ ;" -"䲁>wèi|\\\ ;" -"䲃>zǎo|\\\ ;" -"䲄>mín|\\\ ;" -"䲊>tuǒ|\\\ ;" -"䲋>cén|\\\ ;" -"䲎>něi|\\\ ;" -"䲏>láo|\\\ ;" -"䲒>xiè|\\\ ;" -"䲓>yǎn|\\\ ;" -"䲙>jié|\\\ ;" -"䲚>lài|\\\ ;" -"䲟>yìn|\\\ ;" -"䲦>chá|\\\ ;" -"䲰>yùn|\\\ ;" -"䲸>jiè|\\\ ;" -"䲹>péi|\\\ ;" -"䲺>gàn|\\\ ;" -"䲽>dǎo|\\\ ;" -"䳀>dié|\\\ ;" -"䳃>wǎn|\\\ ;" -"䳅>zhǐ|\\\ ;" -"䳆>bái|\\\ ;" -"䳈>bǎo|\\\ ;" -"䳉>dàn|\\\ ;" -"䳎>jiù|\\\ ;" -"䳏>guì|\\\ ;" -"䳑>yǒu|\\\ ;" -"䳓>lǎo|\\\ ;" -"䳔>jiù|\\\ ;" -"䳕>fóu|\\\ ;" -"䳖>nèi|\\\ ;" -"䳛>yàn|\\\ ;" -"䳟>kòu|\\\ ;" -"䳧>hóu|\\\ ;" -"䳫>kuí|\\\ ;" -"䳰>bǎo|\\\ ;" -"䳵>chì|\\\ ;" -"䳹>kòu|\\\ ;" -"䳺>yàn|\\\ ;" -"䳻>cán|\\\ ;" -"䳿>lán|\\\ ;" -"䴃>náo|\\\ ;" -"䴅>fén|\\\ ;" -"䴎>lěi|\\\ ;" -"䴏>yàn|\\\ ;" -"䴐>bǎo|\\\ ;" -"䴑>dié|\\\ ;" -"䴕>liè|\\\ ;" -"䴠>yǎo|\\\ ;" -"䴦>rén|\\\ ;" -"䴭>cái|\\\ ;" -"䴰>shú|\\\ ;" -"䴱>tuó|\\\ ;" -"䴴>tiè|\\\ ;" -"䴷>hún|\\\ ;" -"䴹>guǒ|\\\ ;" -"䴽>bài|\\\ ;" -"䴾>cuó|\\\ ;" -"䵀>suǒ|\\\ ;" -"䵂>zhí|\\\ ;" -"䵉>tóu|\\\ ;" -"䵋>wěi|\\\ ;" -"䵏>lǎo|\\\ ;" -"䵘>shà|\\\ ;" -"䵙>zhǎ|\\\ ;" -"䵚>tǎo|\\\ ;" -"䵟>gǎn|\\\ ;" -"䵢>mèi|\\\ ;" -"䵥>shè|\\\ ;" -"䵦>xiè|\\\ ;" -"䵧>zài|\\\ ;" -"䵪>gùn|\\\ ;" -"䵭>zhè|\\\ ;" -"䵳>wèi|\\\ ;" -"䵴>yùn|\\\ ;" -"䵵>zhá|\\\ ;" -"䵿>tiè|\\\ ;" -"䶃>hán|\\\ ;" -"䶉>liú|\\\ ;" -"䶌>pào|\\\ ;" -"䶎>shà|\\\ ;" -"䶔>chí|\\\ ;" -"䶖>jìn|\\\ ;" -"䶝>qià|\\\ ;" -"䶡>shí|\\\ ;" -"䶤>huá|\\\ ;" -"䶧>yǎo|\\\ ;" -"䶪>chá|\\\ ;" -"䶫>kǎn|\\\ ;" -"䶮>yán|\\\ ;" -"䶲>nán|\\\ ;" -"䶳>yuè|\\\ ;" -"䶵>chí|\\\ ;" -"丂>kǎo|\\\ ;" -"丅>wàn|\\\ ;" -"丗>shì|\\\ ;" -"丟>diū|\\\ ;" -"丠>qiū|\\\ ;" -"丣>yǒu|\\\ ;" -"丩>jiū|\\\ ;" -"丯>jiè|\\\ ;" -"丵>wéi|\\\ ;" -"丶>zhǔ|\\\ ;" -"乆>jiǔ|\\\ ;" -"乚>yǐn|\\\ ;" -"乢>gài|\\\ ;" -"乣>diū|\\\ ;" -"乨>shǐ|\\\ ;" -"乫>jiā|\\\ ;" -"乭>shí|\\\ ;" -"乴>xué|\\\ ;" -"乵>yǎn|\\\ ;" -"乷>shā|\\\ ;" -"乹>gān|\\\ ;" -"亀>guī|\\\ ;" -"亁>gān|\\\ ;" -"亃>lín|\\\ ;" -"亅>jué|\\\ ;" -"亊>shì|\\\ ;" -"亗>suì|\\\ ;" -"亙>gèn|\\\ ;" -"亠>tóu|\\\ ;" -"亴>yòu|\\\ ;" -"亶>dǎn|\\\ ;" -"亸>duǒ|\\\ ;" -"亹>wěi|\\\ ;" -"仐>sǎn|\\\ ;" -"仛>tuō|\\\ ;" -"仠>gán|\\\ ;" -"仭>rèn|\\\ ;" -"仮>jiǎ|\\\ ;" -"仯>áng|\\\ ;" -"仴>jià|\\\ ;" -"仸>rén|\\\ ;" -"仼>bīn|\\\ ;" -"伂>pèi|\\\ ;" -"伅>dùn|\\\ ;" -"伆>wèn|\\\ ;" -"伈>xǐn|\\\ ;" -"伒>jìn|\\\ ;" -"伓>bēi|\\\ ;" -"伔>dǎn|\\\ ;" -"伜>cuì|\\\ ;" -"伡>chē|\\\ ;" -"伨>wèi|\\\ ;" -"伩>xìn|\\\ ;" -"伳>pàn|\\\ ;" -"佄>bèn|\\\ ;" -"佅>mài|\\\ ;" -"佇>zhù|\\\ ;" -"佪>huí|\\\ ;" -"佷>hěn|\\\ ;" -"佸>huó|\\\ ;" -"佹>guǐ|\\\ ;" -"侂>tuō|\\\ ;" -"侅>gāi|\\\ ;" -"來>lái|\\\ ;" -"侌>yīn|\\\ ;" -"侖>lún|\\\ ;" -"侘>chà|\\\ ;" -"侙>chì|\\\ ;" -"侚>xùn|\\\ ;" -"価>jià|\\\ ;" -"侢>zài|\\\ ;" -"侭>jǐn|\\\ ;" -"侰>cuò|\\\ ;" -"侳>zuò|\\\ ;" -"侸>shù|\\\ ;" -"侻>tuō|\\\ ;" -"侽>nán|\\\ ;" -"侾>hāo|\\\ ;" -"俀>shū|\\\ ;" -"俒>hùn|\\\ ;" -"俕>sàn|\\\ ;" -"俖>pǎi|\\\ ;" -"俠>xiá|\\\ ;" -"俢>xiū|\\\ ;" -"俥>chē|\\\ ;" -"俫>lái|\\\ ;" -"俶>chù|\\\ ;" -"俷>fèi|\\\ ;" -"俻>bèi|\\\ ;" -"俽>xīn|\\\ ;" -"倁>chí|\\\ ;" -"倃>zán|\\\ ;" -"倄>yáo|\\\ ;" -"倅>cuì|\\\ ;" -"倇>wǎn|\\\ ;" -"倈>lái|\\\ ;" -"倐>shū|\\\ ;" -"們>men|\\\ ;" -"倓>juè|\\\ ;" -"倝>gàn|\\\ ;" -"倠>suī|\\\ ;" -"倢>jié|\\\ ;" -"値>zhí|\\\ ;" -"倫>lún|\\\ ;" -"倱>hùn|\\\ ;" -"倴>bèn|\\\ ;" -"倷>nài|\\\ ;" -"倸>cǎi|\\\ ;" -"倽>xiá|\\\ ;" -"偉>wěi|\\\ ;" -"偐>yàn|\\\ ;" -"偖>chě|\\\ ;" -"偘>kǎn|\\\ ;" -"偛>chā|\\\ ;" -"偝>bèi|\\\ ;" -"偠>yǎo|\\\ ;" -"偣>yān|\\\ ;" -"偤>yǒu|\\\ ;" -"偧>zhā|\\\ ;" -"偫>zhì|\\\ ;" -"偰>xiè|\\\ ;" -"偱>xún|\\\ ;" -"偸>tōu|\\\ ;" -"偹>bèi|\\\ ;" -"偼>jié|\\\ ;" -"偽>wěi|\\\ ;" -"傁>sǒu|\\\ ;" -"傂>zhì|\\\ ;" -"傄>xiā|\\\ ;" -"傊>yǔn|\\\ ;" -"傋>gòu|\\\ ;" -"傐>hào|\\\ ;" -"傑>jié|\\\ ;" -"傕>jué|\\\ ;" -"傗>chù|\\\ ;" -"傘>sǎn|\\\ ;" -"備>bèi|\\\ ;" -"傜>yáo|\\\ ;" -"傝>tàn|\\\ ;" -"傞>suō|\\\ ;" -"傢>jiā|\\\ ;" -"傤>zài|\\\ ;" -"傪>cān|\\\ ;" -"傫>lěi|\\\ ;" -"傮>cáo|\\\ ;" -"傶>còu|\\\ ;" -"傺>chì|\\\ ;" -"傼>hàn|\\\ ;" -"傿>yàn|\\\ ;" -"僂>lóu|\\\ ;" -"僃>bèi|\\\ ;" -"僅>jǐn|\\\ ;" -"僈>màn|\\\ ;" -"僋>tàn|\\\ ;" -"僓>tuǐ|\\\ ;" -"僔>zǔn|\\\ ;" -"僗>láo|\\\ ;" -"僞>wěi|\\\ ;" -"僠>fān|\\\ ;" -"僡>huì|\\\ ;" -"僤>dàn|\\\ ;" -"僨>fèn|\\\ ;" -"僪>jué|\\\ ;" -"僯>lǐn|\\\ ;" -"僶>mǐn|\\\ ;" -"僸>jìn|\\\ ;" -"價>jià|\\\ ;" -"僿>sài|\\\ ;" -"儁>jùn|\\\ ;" -"儊>chù|\\\ ;" -"儍>shǎ|\\\ ;" -"儎>zài|\\\ ;" -"儐>bīn|\\\ ;" -"儓>tái|\\\ ;" -"儖>lán|\\\ ;" -"儘>jǐn|\\\ ;" -"儠>liè|\\\ ;" -"儤>bào|\\\ ;" -"儧>zǎn|\\\ ;" -"儨>zhí|\\\ ;" -"優>yōu|\\\ ;" -"儫>háo|\\\ ;" -"儰>wěi|\\\ ;" -"儲>chǔ|\\\ ;" -"儵>shū|\\\ ;" -"儶>huì|\\\ ;" -"儸>luó|\\\ ;" -"儹>zǎn|\\\ ;" -"儺>nuó|\\\ ;" -"儼>yǎn|\\\ ;" -"儽>lěi|\\\ ;" -"兂>zān|\\\ ;" -"兊>duì|\\\ ;" -"兌>duì|\\\ ;" -"兗>yǎn|\\\ ;" -"兘>shǐ|\\\ ;" -"兙>shí|\\\ ;" -"兝>fēn|\\\ ;" -"兞>máo|\\\ ;" -"兠>dōu|\\\ ;" -"兡>bǎi|\\\ ;" -"內>nèi|\\\ ;" -"冃>māo|\\\ ;" -"冄>rǎn|\\\ ;" -"冇>mǎo|\\\ ;" -"冎>guǎ|\\\ ;" -"冐>mào|\\\ ;" -"冓>gòu|\\\ ;" -"冘>yín|\\\ ;" -"冚>kǎn|\\\ ;" -"冟>shì|\\\ ;" -"冦>kòu|\\\ ;" -"冩>xiě|\\\ ;" -"冭>tái|\\\ ;" -"冸>pàn|\\\ ;" -"冺>mǐn|\\\ ;" -"冾>xiá|\\\ ;" -"凁>shù|\\\ ;" -"凂>měi|\\\ ;" -"凎>gàn|\\\ ;" -"凐>yīn|\\\ ;" -"凗>cuí|\\\ ;" -"凙>duó|\\\ ;" -"凚>jìn|\\\ ;" -"凜>lǐn|\\\ ;" -"凢>fán|\\\ ;" -"凣>fán|\\\ ;" -"処>chǔ|\\\ ;" -"凱>kǎi|\\\ ;" -"凲>gān|\\\ ;" -"凾>hán|\\\ ;" -"刂>dāo|\\\ ;" -"刄>rèn|\\\ ;" -"刌>cǔn|\\\ ;" -"刐>dǎn|\\\ ;" -"刔>jué|\\\ ;" -"刡>mǐn|\\\ ;" -"別>bié|\\\ ;" -"刦>jié|\\\ ;" -"刧>jié|\\\ ;" -"刯>gēn|\\\ ;" -"刲>kuī|\\\ ;" -"刴>duò|\\\ ;" -"刼>jié|\\\ ;" -"剅>lóu|\\\ ;" -"剆>gēn|\\\ ;" -"剉>cuò|\\\ ;" -"剎>shà|\\\ ;" -"剒>cuò|\\\ ;" -"剕>fèi|\\\ ;" -"剟>duō|\\\ ;" -"剦>yān|\\\ ;" -"剨>huò|\\\ ;" -"剫>duó|\\\ ;" -"剮>guǎ|\\\ ;" -"剳>zhā|\\\ ;" -"剴>kǎi|\\\ ;" -"剻>fóu|\\\ ;" -"剾>kōu|\\\ ;" -"劀>guā|\\\ ;" -"劂>jué|\\\ ;" -"劃>huà|\\\ ;" -"劄>zhá|\\\ ;" -"劉>liú|\\\ ;" -"劊>guì|\\\ ;" -"劌>guì|\\\ ;" -"劐>huō|\\\ ;" -"劕>zhí|\\\ ;" -"劚>zhú|\\\ ;" -"劤>jìn|\\\ ;" -"劦>xié|\\\ ;" -"劧>zhǐ|\\\ ;" -"劯>zhū|\\\ ;" -"労>láo|\\\ ;" -"劶>jìn|\\\ ;" -"劺>móu|\\\ ;" -"劼>jié|\\\ ;" -"劽>liè|\\\ ;" -"勁>jìn|\\\ ;" -"勂>háo|\\\ ;" -"勄>mǐn|\\\ ;" -"勅>chì|\\\ ;" -"勏>pǒu|\\\ ;" -"勑>lài|\\\ ;" -"勓>kài|\\\ ;" -"勛>xūn|\\\ ;" -"勞>láo|\\\ ;" -"勢>shì|\\\ ;" -"勪>jué|\\\ ;" -"勫>fán|\\\ ;" -"勯>dān|\\\ ;" -"勱>mài|\\\ ;" -"勲>xūn|\\\ ;" -"勳>xūn|\\\ ;" -"勶>chè|\\\ ;" -"勹>bāo|\\\ ;" -"勻>yún|\\\ ;" -"勼>jiū|\\\ ;" -"勽>bào|\\\ ;" -"匃>gài|\\\ ;" -"匄>gài|\\\ ;" -"匋>táo|\\\ ;" -"匓>jiù|\\\ ;" -"匘>nǎo|\\\ ;" -"匛>jiù|\\\ ;" -"匧>qiè|\\\ ;" -"匩>fēi|\\\ ;" -"匬>tóu|\\\ ;" -"匭>guǐ|\\\ ;" -"匯>huì|\\\ ;" -"匰>dān|\\\ ;" -"匱>kuì|\\\ ;" -"匶>jiù|\\\ ;" -"匽>yǎn|\\\ ;" -"卂>xìn|\\\ ;" -"卋>shì|\\\ ;" -"卍>wàn|\\\ ;" -"卐>wàn|\\\ ;" -"協>xié|\\\ ;" -"単>dān|\\\ ;" -"卨>xiè|\\\ ;" -"卪>jié|\\\ ;" -"卬>áng|\\\ ;" -"卶>shì|\\\ ;" -"卻>què|\\\ ;" -"厇>zhé|\\\ ;" -"厈>hǎn|\\\ ;" -"厎>zhǐ|\\\ ;" -"厏>zhǎ|\\\ ;" -"厔>zhì|\\\ ;" -"厙>shè|\\\ ;" -"厜>zuī|\\\ ;" -"厞>fèi|\\\ ;" -"厧>jǐn|\\\ ;" -"厪>qín|\\\ ;" -"厬>guǐ|\\\ ;" -"厭>yàn|\\\ ;" -"厱>lán|\\\ ;" -"厳>yán|\\\ ;" -"厴>yǎn|\\\ ;" -"厸>lín|\\\ ;" -"厹>qiú|\\\ ;" -"厽>lěi|\\\ ;" -"叀>huì|\\\ ;" -"參>cān|\\\ ;" -"叄>cān|\\\ ;" -"叅>cān|\\\ ;" -"叇>dài|\\\ ;" -"叓>shì|\\\ ;" -"叚>jiǎ|\\\ ;" -"叜>sǒu|\\\ ;" -"叝>gào|\\\ ;" -"叞>wèi|\\\ ;" -"叡>ruì|\\\ ;" -"叧>guǎ|\\\ ;" -"叴>qiú|\\\ ;" -"叺>chǐ|\\\ ;" -"吀>miē|\\\ ;" -"吋>cùn|\\\ ;" -"吙>xuē|\\\ ;" -"吢>qìn|\\\ ;" -"吣>qìn|\\\ ;" -"吤>jiè|\\\ ;" -"吺>dōu|\\\ ;" -"吿>gào|\\\ ;" -"呁>jùn|\\\ ;" -"呅>méi|\\\ ;" -"呎>chǐ|\\\ ;" -"呑>tūn|\\\ ;" -"呙>guō|\\\ ;" -"呞>shī|\\\ ;" -"呠>pēn|\\\ ;" -"呡>wěn|\\\ ;" -"呥>rǎn|\\\ ;" -"呩>shì|\\\ ;" -"呫>tiē|\\\ ;" -"咁>gàn|\\\ ;" -"咃>tuō|\\\ ;" -"咅>pòu|\\\ ;" -"咍>hāi|\\\ ;" -"咑>què|\\\ ;" -"咗>zuǒ|\\\ ;" -"咟>chà|\\\ ;" -"咥>dié|\\\ ;" -"咵>kuā|\\\ ;" -"咷>táo|\\\ ;" -"咼>guō|\\\ ;" -"咾>lǎo|\\\ ;" -"哌>pài|\\\ ;" -"哕>yuě|\\\ ;" -"哠>hào|\\\ ;" -"哣>pǒu|\\\ ;" -"哰>láo|\\\ ;" -"哶>miē|\\\ ;" -"哸>suī|\\\ ;" -"哹>fóu|\\\ ;" -"哻>hàn|\\\ ;" -"唀>yǒu|\\\ ;" -"唄>bài|\\\ ;" -"唅>hān|\\\ ;" -"唊>jiá|\\\ ;" -"唒>qiú|\\\ ;" -"唓>chē|\\\ ;" -"唗>dōu|\\\ ;" -"唚>qìn|\\\ ;" -"唞>dǒu|\\\ ;" -"唦>shā|\\\ ;" -"唫>yín|\\\ ;" -"唶>jiè|\\\ ;" -"唻>lǎi|\\\ ;" -"啂>nòu|\\\ ;" -"啉>lán|\\\ ;" -"啍>tūn|\\\ ;" -"問>wèn|\\\ ;" -"啑>shà|\\\ ;" -"啗>dàn|\\\ ;" -"啛>cuì|\\\ ;" -"啠>zhé|\\\ ;" -"啩>guà|\\\ ;" -"啫>zhě|\\\ ;" -"啯>guo|\\\ ;" -"啰>luō|\\\ ;" -"啱>jué|\\\ ;" -"啿>dàn|\\\ ;" -"喆>zhé|\\\ ;" -"喎>wāi|\\\ ;" -"喐>yìn|\\\ ;" -"喒>zán|\\\ ;" -"喓>yāo|\\\ ;" -"喗>yǔn|\\\ ;" -"喡>wěi|\\\ ;" -"喢>shà|\\\ ;" -"喦>niè|\\\ ;" -"喫>chī|\\\ ;" -"喭>yàn|\\\ ;" -"單>dān|\\\ ;" -"喯>pēn|\\\ ;" -"喰>cān|\\\ ;" -"喴>wēi|\\\ ;" -"喹>kuí|\\\ ;" -"喼>jié|\\\ ;" -"喿>sào|\\\ ;" -"嗀>huò|\\\ ;" -"嗂>yáo|\\\ ;" -"嗏>chā|\\\ ;" -"嗐>hài|\\\ ;" -"嗠>luò|\\\ ;" -"嗧>jiā|\\\ ;" -"嗩>suǒ|\\\ ;" -"嗪>qín|\\\ ;" -"嗮>sài|\\\ ;" -"嗺>cuī|\\\ ;" -"嗻>zhē|\\\ ;" -"嗿>tǎn|\\\ ;" -"嘅>kǎi|\\\ ;" -"嘆>tàn|\\\ ;" -"嘇>sān|\\\ ;" -"嘍>lóu|\\\ ;" -"嘒>huì|\\\ ;" -"嘓>guō|\\\ ;" -"嘩>huā|\\\ ;" -"嘪>mǎi|\\\ ;" -"嘫>rán|\\\ ;" -"嘮>láo|\\\ ;" -"嘳>kuì|\\\ ;" -"嘷>háo|\\\ ;" -"嘼>xiù|\\\ ;" -"嘽>tān|\\\ ;" -"嘾>tán|\\\ ;" -"噀>xùn|\\\ ;" -"噂>zǔn|\\\ ;" -"噃>fān|\\\ ;" -"噄>chī|\\\ ;" -"噅>huī|\\\ ;" -"噆>zǎn|\\\ ;" -"噉>dàn|\\\ ;" -"噋>tūn|\\\ ;" -"噑>háo|\\\ ;" -"噕>huī|\\\ ;" -"噖>yín|\\\ ;" -"噚>xún|\\\ ;" -"噛>niè|\\\ ;" -"噞>yǎn|\\\ ;" -"噡>dān|\\\ ;" -"噦>yuě|\\\ ;" -"噴>pēn|\\\ ;" -"噵>dào|\\\ ;" -"噷>hēn|\\\ ;" -"噸>dùn|\\\ ;" -"噾>yīn|\\\ ;" -"噿>zuǐ|\\\ ;" -"嚂>làn|\\\ ;" -"嚄>huò|\\\ ;" -"嚇>xià|\\\ ;" -"嚉>duō|\\\ ;" -"嚍>jìn|\\\ ;" -"嚖>huì|\\\ ;" -"嚘>yōu|\\\ ;" -"嚙>niè|\\\ ;" -"嚚>yín|\\\ ;" -"嚞>zhé|\\\ ;" -"嚠>liú|\\\ ;" -"嚥>yàn|\\\ ;" -"嚬>pín|\\\ ;" -"嚲>duǒ|\\\ ;" -"嚴>yán|\\\ ;" -"嚿>huò|\\\ ;" -"囁>niè|\\\ ;" -"囉>luō|\\\ ;" -"囋>zàn|\\\ ;" -"囑>zhǔ|\\\ ;" -"囒>lán|\\\ ;" -"囓>niè|\\\ ;" -"囘>huí|\\\ ;" -"囙>yīn|\\\ ;" -"囜>nín|\\\ ;" -"囩>yùn|\\\ ;" -"囬>huí|\\\ ;" -"囯>guó|\\\ ;" -"囶>guó|\\\ ;" -"囷>qūn|\\\ ;" -"囻>guó|\\\ ;" -"囼>tāi|\\\ ;" -"圀>guó|\\\ ;" -"圁>yín|\\\ ;" -"圂>hùn|\\\ ;" -"圅>hán|\\\ ;" -"圇>lún|\\\ ;" -"國>guó|\\\ ;" -"圍>wéi|\\\ ;" -"圙>lüè|\\\ ;" -"圚>huì|\\\ ;" -"圶>qià|\\\ ;" -"圿>jiá|\\\ ;" -"坁>zhǐ|\\\ ;" -"坃>xūn|\\\ ;" -"坄>tóu|\\\ ;" -"坅>qǐn|\\\ ;" -"坆>fén|\\\ ;" -"坉>tún|\\\ ;" -"坋>fèn|\\\ ;" -"坢>pǎn|\\\ ;" -"坧>zhī|\\\ ;" -"坬>guà|\\\ ;" -"坮>tái|\\\ ;" -"坵>qiū|\\\ ;" -"坹>xuè|\\\ ;" -"坾>zhù|\\\ ;" -"垁>zhì|\\\ ;" -"垉>páo|\\\ ;" -"垑>chǐ|\\\ ;" -"垔>yīn|\\\ ;" -"垕>hòu|\\\ ;" -"垖>duī|\\\ ;" -"垚>yáo|\\\ ;" -"垜>duǒ|\\\ ;" -"垝>guǐ|\\\ ;" -"垞>chá|\\\ ;" -"垥>xié|\\\ ;" -"垺>pēi|\\\ ;" -"垽>yìn|\\\ ;" -"垾>hàn|\\\ ;" -"埁>cén|\\\ ;" -"埆>què|\\\ ;" -"埈>xùn|\\\ ;" -"埉>jiá|\\\ ;" -"埐>jīn|\\\ ;" -"埑>zhé|\\\ ;" -"埓>liè|\\\ ;" -"埣>suì|\\\ ;" -"埦>wǎn|\\\ ;" -"埨>lǔn|\\\ ;" -"埮>tàn|\\\ ;" -"埰>cài|\\\ ;" -"埱>shú|\\\ ;" -"埳>kǎn|\\\ ;" -"埵>duǒ|\\\ ;" -"執>zhí|\\\ ;" -"堃>kūn|\\\ ;" -"堖>nǎo|\\\ ;" -"堚>hún|\\\ ;" -"堝>guō|\\\ ;" -"堢>bǎo|\\\ ;" -"堦>jiē|\\\ ;" -"堯>yáo|\\\ ;" -"報>bào|\\\ ;" -"堳>méi|\\\ ;" -"堶>tuó|\\\ ;" -"堷>yìn|\\\ ;" -"堺>jiè|\\\ ;" -"塏>kǎi|\\\ ;" -"塒>shí|\\\ ;" -"塙>què|\\\ ;" -"塠>duī|\\\ ;" -"塤>xūn|\\\ ;" -"塩>yán|\\\ ;" -"塪>kǎn|\\\ ;" -"塭>wēn|\\\ ;" -"塮>xiè|\\\ ;" -"塯>liù|\\\ ;" -"塺>méi|\\\ ;" -"塿>lǒu|\\\ ;" -"墈>kàn|\\\ ;" -"墌>zhī|\\\ ;" -"墎>guō|\\\ ;" -"墐>jǐn|\\\ ;" -"墔>cuī|\\\ ;" -"墕>yàn|\\\ ;" -"墤>tuí|\\\ ;" -"墦>fán|\\\ ;" -"墧>què|\\\ ;" -"墪>dūn|\\\ ;" -"墫>zūn|\\\ ;" -"墮>duò|\\\ ;" -"墯>duò|\\\ ;" -"墰>tán|\\\ ;" -"墳>fén|\\\ ;" -"墵>tán|\\\ ;" -"墾>kěn|\\\ ;" -"壇>tán|\\\ ;" -"壈>lǎn|\\\ ;" -"壎>xūn|\\\ ;" -"壏>hǎn|\\\ ;" -"壔>dǎo|\\\ ;" -"壘>lěi|\\\ ;" -"壛>yán|\\\ ;" -"壜>tán|\\\ ;" -"壝>wéi|\\\ ;" -"壡>ruì|\\\ ;" -"壣>lín|\\\ ;" -"壦>xūn|\\\ ;" -"壧>yán|\\\ ;" -"壨>léi|\\\ ;" -"売>mài|\\\ ;" -"壸>kǔn|\\\ ;" -"壼>kǔn|\\\ ;" -"壿>zūn|\\\ ;" -"夊>suī|\\\ ;" -"夋>qūn|\\\ ;" -"夎>jiǎ|\\\ ;" -"夒>náo|\\\ ;" -"夓>xià|\\\ ;" -"夘>mǎo|\\\ ;" -"夛>duō|\\\ ;" -"夠>gòu|\\\ ;" -"夣>dài|\\\ ;" -"夰>gǎo|\\\ ;" -"夲>běn|\\\ ;" -"夳>tài|\\\ ;" -"夵>jiá|\\\ ;" -"夽>yùn|\\\ ;" -"夾>jiá|\\\ ;" -"奊>xié|\\\ ;" -"奒>kāi|\\\ ;" -"奓>shē|\\\ ;" -"奙>běn|\\\ ;" -"奜>fěi|\\\ ;" -"奞>xùn|\\\ ;" -"奤>pǎn|\\\ ;" -"奪>duó|\\\ ;" -"奫>yūn|\\\ ;" -"奭>shì|\\\ ;" -"奮>fèn|\\\ ;" -"奯>huò|\\\ ;" -"奲>duǒ|\\\ ;" -"奺>jiǔ|\\\ ;" -"奻>nán|\\\ ;" -"奼>chà|\\\ ;" -"奿>fàn|\\\ ;" -"妉>dān|\\\ ;" -"妎>xiè|\\\ ;" -"妏>wèn|\\\ ;" -"妘>yún|\\\ ;" -"妚>pēi|\\\ ;" -"妜>yuè|\\\ ;" -"妟>yàn|\\\ ;" -"妡>xīn|\\\ ;" -"妢>fén|\\\ ;" -"妳>nǎi|\\\ ;" -"妵>tǒu|\\\ ;" -"妷>zhí|\\\ ;" -"姄>mín|\\\ ;" -"姅>bàn|\\\ ;" -"姌>rǎn|\\\ ;" -"姏>mán|\\\ ;" -"姙>rèn|\\\ ;" -"姟>gāi|\\\ ;" -"姡>kuò|\\\ ;" -"姤>gòu|\\\ ;" -"姪>zhí|\\\ ;" -"姰>jūn|\\\ ;" -"姱>kuā|\\\ ;" -"姲>yàn|\\\ ;" -"姴>liè|\\\ ;" -"姵>pèi|\\\ ;" -"姶>yǎn|\\\ ;" -"姷>yòu|\\\ ;" -"姸>yán|\\\ ;" -"姼>chǐ|\\\ ;" -"姽>guǐ|\\\ ;" -"娕>lài|\\\ ;" -"娚>nán|\\\ ;" -"娝>pēi|\\\ ;" -"娞>něi|\\\ ;" -"娡>zhì|\\\ ;" -"娢>hán|\\\ ;" -"娦>pín|\\\ ;" -"娧>tuì|\\\ ;" -"娨>hàn|\\\ ;" -"娫>yán|\\\ ;" -"娮>yán|\\\ ;" -"婁>lóu|\\\ ;" -"婄>pǒu|\\\ ;" -"婇>cǎi|\\\ ;" -"婌>shǔ|\\\ ;" -"婎>huī|\\\ ;" -"婒>tán|\\\ ;" -"婓>fēi|\\\ ;" -"婔>wēi|\\\ ;" -"婣>yīn|\\\ ;" -"婨>lún|\\\ ;" -"婩>yàn|\\\ ;" -"婫>kūn|\\\ ;" -"婬>yín|\\\ ;" -"婳>huà|\\\ ;" -"婹>yǎo|\\\ ;" -"婻>nàn|\\\ ;" -"婼>ruò|\\\ ;" -"婽>jiǎ|\\\ ;" -"婾>tōu|\\\ ;" -"媁>wēi|\\\ ;" -"媃>róu|\\\ ;" -"媄>měi|\\\ ;" -"媅>dān|\\\ ;" -"媇>qīn|\\\ ;" -"媈>huī|\\\ ;" -"媌>máo|\\\ ;" -"媎>jiě|\\\ ;" -"媘>jiē|\\\ ;" -"媙>wēi|\\\ ;" -"媝>qiū|\\\ ;" -"媟>xiè|\\\ ;" -"媠>tuǒ|\\\ ;" -"媢>mào|\\\ ;" -"媣>rǎn|\\\ ;" -"媦>wèi|\\\ ;" -"媨>jiù|\\\ ;" -"媬>bǎo|\\\ ;" -"媮>tōu|\\\ ;" -"媯>guǐ|\\\ ;" -"媰>zōu|\\\ ;" -"媱>yáo|\\\ ;" -"媹>liú|\\\ ;" -"媺>měi|\\\ ;" -"媻>pán|\\\ ;" -"媿>kuì|\\\ ;" -"嫀>qín|\\\ ;" -"嫅>chā|\\\ ;" -"嫍>tāo|\\\ ;" -"嫐>nǎo|\\\ ;" -"嫑>báo|\\\ ;" -"嫚>màn|\\\ ;" -"嫢>guī|\\\ ;" -"嫤>jìn|\\\ ;" -"嫨>hān|\\\ ;" -"嫪>lào|\\\ ;" -"嫬>zhē|\\\ ;" -"嫰>nèn|\\\ ;" -"嫳>piè|\\\ ;" -"嫷>tuǒ|\\\ ;" -"嫹>máo|\\\ ;" -"嫿>huà|\\\ ;" -"嬀>guī|\\\ ;" -"嬂>zhī|\\\ ;" -"嬅>huá|\\\ ;" -"嬇>huì|\\\ ;" -"嬈>ráo|\\\ ;" -"嬊>yàn|\\\ ;" -"嬍>měi|\\\ ;" -"嬎>fàn|\\\ ;" -"嬏>fān|\\\ ;" -"嬒>wèi|\\\ ;" -"嬕>shì|\\\ ;" -"嬘>suì|\\\ ;" -"嬜>xīn|\\\ ;" -"嬠>cán|\\\ ;" -"嬧>jìn|\\\ ;" -"嬪>pín|\\\ ;" -"嬭>nǎi|\\\ ;" -"嬮>yān|\\\ ;" -"嬱>cán|\\\ ;" -"嬼>liǔ|\\\ ;" -"嬾>lǎn|\\\ ;" -"嬿>yàn|\\\ ;" -"孄>lǎn|\\\ ;" -"孍>yán|\\\ ;" -"孎>zhǔ|\\\ ;" -"孏>lǎn|\\\ ;" -"孒>jué|\\\ ;" -"孞>xìn|\\\ ;" -"孡>tāi|\\\ ;" -"孫>sūn|\\\ ;" -"孭>càn|\\\ ;" -"學>xué|\\\ ;" -"孻>lái|\\\ ;" -"孼>niè|\\\ ;" -"宂>tāi|\\\ ;" -"宍>ròu|\\\ ;" -"宎>yǎo|\\\ ;" -"実>shí|\\\ ;" -"宩>shǐ|\\\ ;" -"宭>qún|\\\ ;" -"宱>zhà|\\\ ;" -"宲>bǎo|\\\ ;" -"宷>bìn|\\\ ;" -"宼>kòu|\\\ ;" -"寀>cài|\\\ ;" -"寁>zǎn|\\\ ;" -"寉>què|\\\ ;" -"寑>qǐn|\\\ ;" -"寔>shí|\\\ ;" -"寖>qìn|\\\ ;" -"寘>zhì|\\\ ;" -"寚>bǎo|\\\ ;" -"寢>qǐn|\\\ ;" -"實>shí|\\\ ;" -"寪>wěi|\\\ ;" -"寫>xiě|\\\ ;" -"寭>huì|\\\ ;" -"寯>jùn|\\\ ;" -"寳>bǎo|\\\ ;" -"寴>qìn|\\\ ;" -"寶>bǎo|\\\ ;" -"対>duì|\\\ ;" -"尋>xún|\\\ ;" -"尌>dào|\\\ ;" -"對>duì|\\\ ;" -"導>dǎo|\\\ ;" -"尗>shú|\\\ ;" -"尩>kuǐ|\\\ ;" -"尭>yáo|\\\ ;" -"尮>duò|\\\ ;" -"尯>kuì|\\\ ;" -"尰>chě|\\\ ;" -"尲>gān|\\\ ;" -"尵>tuí|\\\ ;" -"尶>gān|\\\ ;" -"尷>gān|\\\ ;" -"屆>jiè|\\\ ;" -"屍>shī|\\\ ;" -"屘>mǎn|\\\ ;" -"屚>lòu|\\\ ;" -"屝>fèi|\\\ ;" -"屟>xiè|\\\ ;" -"屧>xiè|\\\ ;" -"屩>jué|\\\ ;" -"屫>jué|\\\ ;" -"屬>shǔ|\\\ ;" -"屮>chè|\\\ ;" -"屻>rèn|\\\ ;" -"屽>hàn|\\\ ;" -"岀>chū|\\\ ;" -"岄>yuè|\\\ ;" -"岅>bǎn|\\\ ;" -"岆>yǎo|\\\ ;" -"岇>áng|\\\ ;" -"岊>jié|\\\ ;" -"岎>fēn|\\\ ;" -"岕>jiè|\\\ ;" -"岝>zuò|\\\ ;" -"岞>zuò|\\\ ;" -"岤>xuè|\\\ ;" -"岥>bēi|\\\ ;" -"岮>tuó|\\\ ;" -"岯>pēi|\\\ ;" -"岰>yǒu|\\\ ;" -"岻>chí|\\\ ;" -"峀>xiù|\\\ ;" -"峃>xué|\\\ ;" -"峈>luò|\\\ ;" -"峌>dié|\\\ ;" -"峐>gāi|\\\ ;" -"峕>shí|\\\ ;" -"峗>wéi|\\\ ;" -"峟>yòu|\\\ ;" -"峣>yáo|\\\ ;" -"峮>qūn|\\\ ;" -"峱>náo|\\\ ;" -"峳>yóu|\\\ ;" -"島>dǎo|\\\ ;" -"峼>hào|\\\ ;" -"峽>xiá|\\\ ;" -"峾>yīn|\\\ ;" -"崁>kǎn|\\\ ;" -"崅>què|\\\ ;" -"崊>līn|\\\ ;" -"崋>huá|\\\ ;" -"崍>lái|\\\ ;" -"崏>mín|\\\ ;" -"崐>kūn|\\\ ;" -"崑>kūn|\\\ ;" -"崘>lún|\\\ ;" -"崙>lún|\\\ ;" -"崜>duō|\\\ ;" -"崟>yín|\\\ ;" -"崡>hán|\\\ ;" -"崣>wěi|\\\ ;" -"崨>jié|\\\ ;" -"崫>jué|\\\ ;" -"崯>yín|\\\ ;" -"崷>qiú|\\\ ;" -"崸>dùn|\\\ ;" -"崻>zhì|\\\ ;" -"崼>shì|\\\ ;" -"崾>yǎo|\\\ ;" -"嵀>zhù|\\\ ;" -"嵁>kān|\\\ ;" -"嵃>yǎn|\\\ ;" -"嵄>měi|\\\ ;" -"嵅>gān|\\\ ;" -"嵐>lán|\\\ ;" -"嵑>jué|\\\ ;" -"嵒>yán|\\\ ;" -"嵓>yán|\\\ ;" -"嵔>wěi|\\\ ;" -"嵖>chá|\\\ ;" -"嵗>suì|\\\ ;" -"嵚>qīn|\\\ ;" -"嵟>duī|\\\ ;" -"嵥>jié|\\\ ;" -"嵧>liú|\\\ ;" -"嵲>niè|\\\ ;" -"嵳>cuó|\\\ ;" -"嵽>dié|\\\ ;" -"嵾>cēn|\\\ ;" -"嶁>lǒu|\\\ ;" -"嶆>cáo|\\\ ;" -"嶉>zuī|\\\ ;" -"嶊>zuǐ|\\\ ;" -"嶋>dǎo|\\\ ;" -"嶌>dǎo|\\\ ;" -"嶔>qīn|\\\ ;" -"嶖>yǎn|\\\ ;" -"嶗>láo|\\\ ;" -"嶜>jīn|\\\ ;" -"嶞>duò|\\\ ;" -"嶟>zūn|\\\ ;" -"嶡>guì|\\\ ;" -"嶢>yáo|\\\ ;" -"嶤>yáo|\\\ ;" -"嶥>jué|\\\ ;" -"嶨>xué|\\\ ;" -"嶩>náo|\\\ ;" -"嶰>xiè|\\\ ;" -"嶵>zuǐ|\\\ ;" -"嶹>dǎo|\\\ ;" -"嶽>yuè|\\\ ;" -"嶾>yǐn|\\\ ;" -"巀>jiē|\\\ ;" -"巂>suǐ|\\\ ;" -"巋>kuī|\\\ ;" -"巌>yán|\\\ ;" -"巎>kūn|\\\ ;" -"巖>yán|\\\ ;" -"巗>yán|\\\ ;" -"巘>yǎn|\\\ ;" -"巙>náo|\\\ ;" -"巚>yǎn|\\\ ;" -"巜>guì|\\\ ;" -"巤>liē|\\\ ;" -"巯>qiú|\\\ ;" -"巰>qiú|\\\ ;" -"巵>zhī|\\\ ;" -"巹>jǐn|\\\ ;" -"巺>xùn|\\\ ;" -"帇>niè|\\\ ;" -"帉>fēn|\\\ ;" -"帋>zhǐ|\\\ ;" -"帎>dàn|\\\ ;" -"帒>dài|\\\ ;" -"帢>qià|\\\ ;" -"師>shī|\\\ ;" -"帬>qún|\\\ ;" -"帯>dài|\\\ ;" -"帰>guī|\\\ ;" -"帴>shā|\\\ ;" -"帵>jià|\\\ ;" -"帶>dài|\\\ ;" -"帹>shà|\\\ ;" -"帿>hóu|\\\ ;" -"幃>wéi|\\\ ;" -"幋>pán|\\\ ;" -"幍>dāo|\\\ ;" -"幏>jiā|\\\ ;" -"幑>huī|\\\ ;" -"幗>guó|\\\ ;" -"幟>zhì|\\\ ;" -"幩>fén|\\\ ;" -"幭>miè|\\\ ;" -"幮>chú|\\\ ;" -"幯>jié|\\\ ;" -"幱>lán|\\\ ;" -"幹>gàn|\\\ ;" -"庈>qín|\\\ ;" -"庉>dùn|\\\ ;" -"庍>bài|\\\ ;" -"庎>jiè|\\\ ;" -"庢>zhì|\\\ ;" -"庤>zhì|\\\ ;" -"庪>guǐ|\\\ ;" -"庮>yóu|\\\ ;" -"庲>lái|\\\ ;" -"庻>shù|\\\ ;" -"廀>sōu|\\\ ;" -"廃>fèi|\\\ ;" -"廄>jiù|\\\ ;" -"廆>huì|\\\ ;" -"廇>liù|\\\ ;" -"廈>shà|\\\ ;" -"廋>sōu|\\\ ;" -"廍>jǐn|\\\ ;" -"廏>jiù|\\\ ;" -"廐>jiù|\\\ ;" -"廔>lóu|\\\ ;" -"廕>yìn|\\\ ;" -"廗>dài|\\\ ;" -"廚>chú|\\\ ;" -"廞>xīn|\\\ ;" -"廢>fèi|\\\ ;" -"廴>yǐn|\\\ ;" -"廵>xún|\\\ ;" -"廻>huí|\\\ ;" -"廼>nǎi|\\\ ;" -"廽>huí|\\\ ;" -"弅>fén|\\\ ;" -"弇>yǎn|\\\ ;" -"弎>sān|\\\ ;" -"弒>shì|\\\ ;" -"弚>tuí|\\\ ;" -"弡>jué|\\\ ;" -"弢>tāo|\\\ ;" -"弴>dūn|\\\ ;" -"弽>shè|\\\ ;" -"弾>dàn|\\\ ;" -"彄>kōu|\\\ ;" -"彆>biè|\\\ ;" -"彈>dàn|\\\ ;" -"彍>kuò|\\\ ;" -"彎>wān|\\\ ;" -"彏>jué|\\\ ;" -"彙>huì|\\\ ;" -"彚>huì|\\\ ;" -"彟>huò|\\\ ;" -"彠>huò|\\\ ;" -"彣>wén|\\\ ;" -"彥>yàn|\\\ ;" -"彨>chī|\\\ ;" -"彲>chī|\\\ ;" -"彵>tuǒ|\\\ ;" -"彽>chí|\\\ ;" -"徏>zhì|\\\ ;" -"徝>zhì|\\\ ;" -"徟>lái|\\\ ;" -"徠>lái|\\\ ;" -"徢>fòu|\\\ ;" -"徣>jiè|\\\ ;" -"徥>chí|\\\ ;" -"徦>jiǎ|\\\ ;" -"徫>wěi|\\\ ;" -"徲>chí|\\\ ;" -"徶>biè|\\\ ;" -"徹>chè|\\\ ;" -"徻>wèi|\\\ ;" -"徾>méi|\\\ ;" -"忁>bào|\\\ ;" -"忈>rén|\\\ ;" -"忋>gǎi|\\\ ;" -"忎>rén|\\\ ;" -"忓>gān|\\\ ;" -"忕>shì|\\\ ;" -"忛>fán|\\\ ;" -"忞>mín|\\\ ;" -"忟>mín|\\\ ;" -"忨>wàn|\\\ ;" -"忮>zhì|\\\ ;" -"忰>cuì|\\\ ;" -"忲>tài|\\\ ;" -"忳>tún|\\\ ;" -"忴>niǔ|\\\ ;" -"忶>hún|\\\ ;" -"忹>sāi|\\\ ;" -"怉>bǎo|\\\ ;" -"怋>mín|\\\ ;" -"怌>pēi|\\\ ;" -"怐>kòu|\\\ ;" -"怑>bàn|\\\ ;" -"怓>náo|\\\ ;" -"怗>tiē|\\\ ;" -"怣>yóu|\\\ ;" -"怮>yōu|\\\ ;" -"怹>tān|\\\ ;" -"恀>chǐ|\\\ ;" -"恅>lǎo|\\\ ;" -"恉>zhǐ|\\\ ;" -"恊>xié|\\\ ;" -"恎>dié|\\\ ;" -"恏>hǎo|\\\ ;" -"恑>guǐ|\\\ ;" -"恗>kuǎ|\\\ ;" -"恘>qiū|\\\ ;" -"恛>huí|\\\ ;" -"恜>chì|\\\ ;" -"恝>jiá|\\\ ;" -"恡>lìn|\\\ ;" -"恥>chǐ|\\\ ;" -"恱>yuè|\\\ ;" -"恵>huì|\\\ ;" -"悅>yuè|\\\ ;" -"悈>jiè|\\\ ;" -"悊>zhé|\\\ ;" -"悋>lìn|\\\ ;" -"悎>hào|\\\ ;" -"悏>qiè|\\\ ;" -"悗>mán|\\\ ;" -"悘>huī|\\\ ;" -"悩>nǎo|\\\ ;" -"悳>duó|\\\ ;" -"悶>mēn|\\\ ;" -"惀>lún|\\\ ;" -"惂>kǎn|\\\ ;" -"惃>kūn|\\\ ;" -"惇>dūn|\\\ ;" -"惈>guǒ|\\\ ;" -"惍>jīn|\\\ ;" -"惏>lín|\\\ ;" -"惐>dàn|\\\ ;" -"惔>tán|\\\ ;" -"惗>niē|\\\ ;" -"惛>hūn|\\\ ;" -"惞>xīn|\\\ ;" -"惢>ruǐ|\\\ ;" -"惣>běi|\\\ ;" -"惱>nǎo|\\\ ;" -"惲>yùn|\\\ ;" -"惵>diè|\\\ ;" -"惽>hūn|\\\ ;" -"愂>bèi|\\\ ;" -"愄>tōu|\\\ ;" -"愇>wěi|\\\ ;" -"愒>kài|\\\ ;" -"愔>yīn|\\\ ;" -"愗>mòu|\\\ ;" -"愜>qiè|\\\ ;" -"愝>yǎn|\\\ ;" -"愞>nuò|\\\ ;" -"愢>sāi|\\\ ;" -"愨>què|\\\ ;" -"愪>yún|\\\ ;" -"愮>yáo|\\\ ;" -"愶>xié|\\\ ;" -"愷>kǎi|\\\ ;" -"愺>cǎo|\\\ ;" -"愻>sùn|\\\ ;" -"愾>kài|\\\ ;" -"慀>xié|\\\ ;" -"慁>hùn|\\\ ;" -"慅>sāo|\\\ ;" -"慆>tāo|\\\ ;" -"慇>yīn|\\\ ;" -"態>tài|\\\ ;" -"慍>yùn|\\\ ;" -"慖>guó|\\\ ;" -"慗>chì|\\\ ;" -"慘>cǎn|\\\ ;" -"慙>cán|\\\ ;" -"慚>cán|\\\ ;" -"慛>cuí|\\\ ;" -"慜>mǐn|\\\ ;" -"慞>cào|\\\ ;" -"慤>què|\\\ ;" -"慥>zào|\\\ ;" -"慦>jìn|\\\ ;" -"慬>jǐn|\\\ ;" -"慭>yìn|\\\ ;" -"慲>mán|\\\ ;" -"慴>zhé|\\\ ;" -"慹>zhí|\\\ ;" -"慺>lóu|\\\ ;" -"憂>yōu|\\\ ;" -"憄>zhì|\\\ ;" -"憇>fān|\\\ ;" -"憊>bèi|\\\ ;" -"憏>chì|\\\ ;" -"憒>kuì|\\\ ;" -"憓>huì|\\\ ;" -"憖>yìn|\\\ ;" -"憗>yìn|\\\ ;" -"憚>dàn|\\\ ;" -"憛>tán|\\\ ;" -"憜>duǒ|\\\ ;" -"憞>duì|\\\ ;" -"憠>jué|\\\ ;" -"憣>fán|\\\ ;" -"憤>fèn|\\\ ;" -"憥>láo|\\\ ;" -"憦>lào|\\\ ;" -"憫>mǐn|\\\ ;" -"憯>cǎn|\\\ ;" -"憰>jué|\\\ ;" -"憳>tǎn|\\\ ;" -"憹>náo|\\\ ;" -"憺>dàn|\\\ ;" -"憻>tǎn|\\\ ;" -"懀>wài|\\\ ;" -"懃>qín|\\\ ;" -"懄>qín|\\\ ;" -"懆>cǎo|\\\ ;" -"懇>kěn|\\\ ;" -"懍>lǐn|\\\ ;" -"懏>jùn|\\\ ;" -"懕>yān|\\\ ;" -"懖>guā|\\\ ;" -"懗>xià|\\\ ;" -"懘>chì|\\\ ;" -"懚>yìn|\\\ ;" -"懛>dāi|\\\ ;" -"懟>duì|\\\ ;" -"懢>lán|\\\ ;" -"懣>mèn|\\\ ;" -"懥>zhì|\\\ ;" -"懧>nuò|\\\ ;" -"懨>yān|\\\ ;" -"懫>zhí|\\\ ;" -"懮>yǒu|\\\ ;" -"懰>liú|\\\ ;" -"懱>miè|\\\ ;" -"懶>lǎn|\\\ ;" -"懾>shè|\\\ ;" -"戁>nǎn|\\\ ;" -"戄>jué|\\\ ;" -"戉>yuè|\\\ ;" -"戜>dié|\\\ ;" -"戝>zéi|\\\ ;" -"戞>jiá|\\\ ;" -"戠>shì|\\\ ;" -"戣>kuí|\\\ ;" -"戤>gài|\\\ ;" -"戭>yǎn|\\\ ;" -"戺>shì|\\\ ;" -"戼>mǎo|\\\ ;" -"扊>yǎn|\\\ ;" -"扗>zài|\\\ ;" -"扞>gǎn|\\\ ;" -"扠>chā|\\\ ;" -"扡>chǐ|\\\ ;" -"扥>tuō|\\\ ;" -"扨>rèn|\\\ ;" -"扴>jiá|\\\ ;" -"扺>zhǐ|\\\ ;" -"扽>dùn|\\\ ;" -"抁>yǎn|\\\ ;" -"抆>wèn|\\\ ;" -"抋>qìn|\\\ ;" -"抍>wàn|\\\ ;" -"抎>yǔn|\\\ ;" -"抏>wán|\\\ ;" -"抔>póu|\\\ ;" -"抧>zhǐ|\\\ ;" -"抩>tān|\\\ ;" -"抭>yǎo|\\\ ;" -"抯>zhā|\\\ ;" -"抶>chì|\\\ ;" -"拀>chù|\\\ ;" -"拁>jiā|\\\ ;" -"拃>zhà|\\\ ;" -"拋>pāo|\\\ ;" -"拕>niù|\\\ ;" -"拝>bài|\\\ ;" -"拡>kuò|\\\ ;" -"拪>kuò|\\\ ;" -"拫>hén|\\\ ;" -"拰>nǐn|\\\ ;" -"拵>cún|\\\ ;" -"拸>chǐ|\\\ ;" -"拹>xié|\\\ ;" -"拻>huī|\\\ ;" -"挃>zhì|\\\ ;" -"挄>kuò|\\\ ;" -"挅>duǒ|\\\ ;" -"挆>duǒ|\\\ ;" -"挒>liè|\\\ ;" -"挓>zhā|\\\ ;" -"挕>dié|\\\ ;" -"挗>jué|\\\ ;" -"挦>xún|\\\ ;" -"挱>suō|\\\ ;" -"挴>měi|\\\ ;" -"挼>nuò|\\\ ;" -"挾>jiā|\\\ ;" -"挿>chā|\\\ ;" -"捃>jùn|\\\ ;" -"捄>jiù|\\\ ;" -"捇>huò|\\\ ;" -"捊>póu|\\\ ;" -"捑>guā|\\\ ;" -"捔>jué|\\\ ;" -"捘>zùn|\\\ ;" -"捜>sōu|\\\ ;" -"捝>tuō|\\\ ;" -"捥>wàn|\\\ ;" -"捦>qín|\\\ ;" -"捨>shě|\\\ ;" -"捫>mén|\\\ ;" -"捯>dáo|\\\ ;" -"捸>niē|\\\ ;" -"捹>bèn|\\\ ;" -"捼>nuó|\\\ ;" -"捾>sào|\\\ ;" -"掃>sǎo|\\\ ;" -"掄>lún|\\\ ;" -"掅>duō|\\\ ;" -"掍>gǔn|\\\ ;" -"掓>shú|\\\ ;" -"掛>guà|\\\ ;" -"掝>huò|\\\ ;" -"掟>lüě|\\\ ;" -"採>cǎi|\\\ ;" -"掫>zōu|\\\ ;" -"掯>kèn|\\\ ;" -"掲>jiē|\\\ ;" -"掻>sāo|\\\ ;" -"掿>nuò|\\\ ;" -"揂>jiū|\\\ ;" -"揅>yán|\\\ ;" -"揇>nǎn|\\\ ;" -"揋>wēi|\\\ ;" -"揌>sāi|\\\ ;" -"揑>niē|\\\ ;" -"揓>shì|\\\ ;" -"揜>yǎn|\\\ ;" -"揫>jiū|\\\ ;" -"揮>huī|\\\ ;" -"揳>xiē|\\\ ;" -"揷>chā|\\\ ;" -"揹>bēi|\\\ ;" -"揺>yáo|\\\ ;" -"揾>wèn|\\\ ;" -"搆>gòu|\\\ ;" -"搇>qìn|\\\ ;" -"搉>què|\\\ ;" -"搋>chǐ|\\\ ;" -"損>sǔn|\\\ ;" -"搎>sūn|\\\ ;" -"搖>yáo|\\\ ;" -"搗>dǎo|\\\ ;" -"搘>zhī|\\\ ;" -"搚>xié|\\\ ;" -"搝>qiǔ|\\\ ;" -"搢>jìn|\\\ ;" -"搣>miè|\\\ ;" -"搩>jié|\\\ ;" -"搫>pán|\\\ ;" -"搯>tāo|\\\ ;" -"搱>huá|\\\ ;" -"搳>xiá|\\\ ;" -"搵>wèn|\\\ ;" -"搻>niè|\\\ ;" -"搾>zhà|\\\ ;" -"摂>shè|\\\ ;" -"摉>sōu|\\\ ;" -"摍>suō|\\\ ;" -"摑>guó|\\\ ;" -"摗>sōu|\\\ ;" -"摛>chī|\\\ ;" -"摟>lōu|\\\ ;" -"摡>gài|\\\ ;" -"摣>zhā|\\\ ;" -"摦>huà|\\\ ;" -"摫>guī|\\\ ;" -"摯>zhì|\\\ ;" -"摰>niè|\\\ ;" -"摱>mán|\\\ ;" -"摳>kōu|\\\ ;" -"摴>shū|\\\ ;" -"摵>suǒ|\\\ ;" -"摿>yīn|\\\ ;" -"撀>gòu|\\\ ;" -"撃>guì|\\\ ;" -"撆>piē|\\\ ;" -"撈>lāo|\\\ ;" -"撉>dūn|\\\ ;" -"撌>guì|\\\ ;" -"撏>xún|\\\ ;" -"撓>náo|\\\ ;" -"撛>lǐn|\\\ ;" -"撡>cāo|\\\ ;" -"撢>dǎn|\\\ ;" -"撣>dǎn|\\\ ;" -"撦>chě|\\\ ;" -"撧>jué|\\\ ;" -"撪>bèn|\\\ ;" -"撱>tuǒ|\\\ ;" -"撳>qìn|\\\ ;" -"撴>dūn|\\\ ;" -"擃>kuǒ|\\\ ;" -"擌>cào|\\\ ;" -"擑>chā|\\\ ;" -"擔>dān|\\\ ;" -"擡>tái|\\\ ;" -"擣>dǎo|\\\ ;" -"擥>lǎn|\\\ ;" -"擪>huò|\\\ ;" -"擭>huò|\\\ ;" -"擯>bìn|\\\ ;" -"擲>zhì|\\\ ;" -"擳>jié|\\\ ;" -"擴>kuò|\\\ ;" -"擷>xié|\\\ ;" -"擸>liè|\\\ ;" -"擹>sòu|\\\ ;" -"擺>bǎi|\\\ ;" -"擻>sǒu|\\\ ;" -"擽>lüè|\\\ ;" -"擾>rǎo|\\\ ;" -"攂>lèi|\\\ ;" -"攃>huō|\\\ ;" -"攄>shū|\\\ ;" -"攅>zǎn|\\\ ;" -"攈>jùn|\\\ ;" -"攌>hàn|\\\ ;" -"攔>lán|\\\ ;" -"攕>sān|\\\ ;" -"攗>méi|\\\ ;" -"攜>xié|\\\ ;" -"攝>shè|\\\ ;" -"攞>luō|\\\ ;" -"攟>jùn|\\\ ;" -"攡>chī|\\\ ;" -"攤>tān|\\\ ;" -"攬>lǎn|\\\ ;" -"攰>guì|\\\ ;" -"攱>guǐ|\\\ ;" -"攵>kǎo|\\\ ;" -"攷>kǎo|\\\ ;" -"攼>gān|\\\ ;" -"攽>bān|\\\ ;" -"敂>kòu|\\\ ;" -"敃>mǐn|\\\ ;" -"敆>guó|\\\ ;" -"敊>chù|\\\ ;" -"敓>duó|\\\ ;" -"敗>bài|\\\ ;" -"敚>duó|\\\ ;" -"敜>niè|\\\ ;" -"敠>duó|\\\ ;" -"敥>yàn|\\\ ;" -"敨>dǒu|\\\ ;" -"敪>duó|\\\ ;" -"敮>xiá|\\\ ;" -"敯>hūn|\\\ ;" -"數>shǔ|\\\ ;" -"斈>fēi|\\\ ;" -"斍>jué|\\\ ;" -"斒>bān|\\\ ;" -"斕>lán|\\\ ;" -"斖>wěi|\\\ ;" -"斚>jiǎ|\\\ ;" -"斝>jiǎ|\\\ ;" -"斢>tǒu|\\\ ;" -"斣>chù|\\\ ;" -"斦>yín|\\\ ;" -"斳>qín|\\\ ;" -"斴>lín|\\\ ;" -"斶>chù|\\\ ;" -"斸>zhǔ|\\\ ;" -"斾>liú|\\\ ;" -"斿>yóu|\\\ ;" -"旈>liú|\\\ ;" -"旘>zhì|\\\ ;" -"旙>fān|\\\ ;" -"旛>fān|\\\ ;" -"旤>huò|\\\ ;" -"旪>xié|\\\ ;" -"旲>tái|\\\ ;" -"旹>shí|\\\ ;" -"旻>mín|\\\ ;" -"旼>mín|\\\ ;" -"旽>tūn|\\\ ;" -"旿>hùn|\\\ ;" -"昁>bèi|\\\ ;" -"昄>bǎn|\\\ ;" -"昅>jié|\\\ ;" -"昋>guì|\\\ ;" -"昐>cuò|\\\ ;" -"昑>qǐn|\\\ ;" -"昖>yán|\\\ ;" -"昢>pěi|\\\ ;" -"昦>hào|\\\ ;" -"昬>hūn|\\\ ;" -"昰>shì|\\\ ;" -"昲>fèi|\\\ ;" -"昳>dié|\\\ ;" -"昷>wēn|\\\ ;" -"昻>áng|\\\ ;" -"時>shí|\\\ ;" -"晆>kuā|\\\ ;" -"晉>jìn|\\\ ;" -"晊>zhǐ|\\\ ;" -"晐>gāi|\\\ ;" -"晘>hàn|\\\ ;" -"晙>jùn|\\\ ;" -"晜>kūn|\\\ ;" -"晢>zhé|\\\ ;" -"晣>zhē|\\\ ;" -"晥>hàn|\\\ ;" -"晧>hào|\\\ ;" -"晩>wǎn|\\\ ;" -"晬>zuì|\\\ ;" -"晼>wǎn|\\\ ;" -"晽>lín|\\\ ;" -"暆>xià|\\\ ;" -"暈>yūn|\\\ ;" -"暉>huī|\\\ ;" -"暋>mǐn|\\\ ;" -"暎>lán|\\\ ;" -"暐>wěi|\\\ ;" -"暓>mào|\\\ ;" -"暔>nán|\\\ ;" -"暚>yáo|\\\ ;" -"暛>suǒ|\\\ ;" -"暜>jìn|\\\ ;" -"暞>hào|\\\ ;" -"暟>kǎi|\\\ ;" -"暠>gǎo|\\\ ;" -"暤>hào|\\\ ;" -"暥>yàn|\\\ ;" -"暩>guì|\\\ ;" -"暪>měn|\\\ ;" -"暫>zàn|\\\ ;" -"暬>xiè|\\\ ;" -"暭>hào|\\\ ;" -"暳>huì|\\\ ;" -"暵>hàn|\\\ ;" -"暺>dàn|\\\ ;" -"暼>piē|\\\ ;" -"暽>lín|\\\ ;" -"曃>tài|\\\ ;" -"曇>tán|\\\ ;" -"曊>fèi|\\\ ;" -"曋>qǐn|\\\ ;" -"曍>hào|\\\ ;" -"曑>sēn|\\\ ;" -"曓>bào|\\\ ;" -"曕>yàn|\\\ ;" -"曡>dié|\\\ ;" -"曣>yàn|\\\ ;" -"曤>huò|\\\ ;" -"曪>luǒ|\\\ ;" -"曮>yǎn|\\\ ;" -"曯>chú|\\\ ;" -"曱>yuē|\\\ ;" -"書>shū|\\\ ;" -"曺>cáo|\\\ ;" -"朁>cǎn|\\\ ;" -"會>huì|\\\ ;" -"朄>yǐn|\\\ ;" -"朅>qiè|\\\ ;" -"朆>fēn|\\\ ;" -"朌>bān|\\\ ;" -"朏>fěi|\\\ ;" -"朜>tūn|\\\ ;" -"朮>shù|\\\ ;" -"朶>duǒ|\\\ ;" -"朷>dāo|\\\ ;" -"朹>guǐ|\\\ ;" -"朻>jiū|\\\ ;" -"杋>fān|\\\ ;" -"杒>rèn|\\\ ;" -"杔>duò|\\\ ;" -"杘>chì|\\\ ;" -"杮>bèi|\\\ ;" -"杸>niǔ|\\\ ;" -"杹>huà|\\\ ;" -"杺>xīn|\\\ ;" -"枂>yuè|\\\ ;" -"枃>jìn|\\\ ;" -"枊>àng|\\\ ;" -"枌>fén|\\\ ;" -"枏>nán|\\\ ;" -"枓>dǒu|\\\ ;" -"枔>xún|\\\ ;" -"枟>yún|\\\ ;" -"枡>dǒu|\\\ ;" -"枬>nán|\\\ ;" -"枴>gōu|\\\ ;" -"枺>duò|\\\ ;" -"枾>shì|\\\ ;" -"枿>niè|\\\ ;" -"柁>tuó|\\\ ;" -"柈>pán|\\\ ;" -"柉>fán|\\\ ;" -"柋>dài|\\\ ;" -"柕>mào|\\\ ;" -"柛>guì|\\\ ;" -"柟>nán|\\\ ;" -"柣>zhí|\\\ ;" -"柤>zhā|\\\ ;" -"柦>dàn|\\\ ;" -"柮>duò|\\\ ;" -"柵>zhà|\\\ ;" -"柷>zhù|\\\ ;" -"柸>pēi|\\\ ;" -"柹>shì|\\\ ;" -"査>chá|\\\ ;" -"栁>liǔ|\\\ ;" -"栂>méi|\\\ ;" -"栐>sǔn|\\\ ;" -"栒>xún|\\\ ;" -"栙>shè|\\\ ;" -"栞>bēn|\\\ ;" -"栢>bǎi|\\\ ;" -"栣>rěn|\\\ ;" -"栨>jié|\\\ ;" -"栬>zuì|\\\ ;" -"栯>yǒu|\\\ ;" -"栶>yīn|\\\ ;" -"栺>zhǐ|\\\ ;" -"栻>shì|\\\ ;" -"桖>duǒ|\\\ ;" -"桗>duò|\\\ ;" -"桙>móu|\\\ ;" -"桚>ráo|\\\ ;" -"桪>xín|\\\ ;" -"桬>shā|\\\ ;" -"桮>bēi|\\\ ;" -"桰>guā|\\\ ;" -"桳>bèn|\\\ ;" -"桵>ruǐ|\\\ ;" -"桺>liǔ|\\\ ;" -"桽>wěn|\\\ ;" -"桾>jūn|\\\ ;" -"桿>gǎn|\\\ ;" -"梂>qiú|\\\ ;" -"梄>yǒu|\\\ ;" -"梍>zào|\\\ ;" -"梒>hán|\\\ ;" -"梔>zhī|\\\ ;" -"梕>rèn|\\\ ;" -"梖>bèi|\\\ ;" -"梚>wǎn|\\\ ;" -"梛>nuó|\\\ ;" -"梜>jiá|\\\ ;" -"梣>cén|\\\ ;" -"梤>fén|\\\ ;" -"梪>dòu|\\\ ;" -"梫>cēn|\\\ ;" -"梱>kǔn|\\\ ;" -"梶>wěi|\\\ ;" -"梼>dǎo|\\\ ;" -"梽>tuō|\\\ ;" -"梾>lái|\\\ ;" -"棎>bài|\\\ ;" -"棐>fěi|\\\ ;" -"棑>pái|\\\ ;" -"棓>pǒu|\\\ ;" -"棔>dài|\\\ ;" -"棗>zǎo|\\\ ;" -"棞>hún|\\\ ;" -"棥>fán|\\\ ;" -"棪>yǎn|\\\ ;" -"棯>rěn|\\\ ;" -"棶>lái|\\\ ;" -"棷>zōu|\\\ ;" -"棸>zōu|\\\ ;" -"棻>fēn|\\\ ;" -"棿>niè|\\\ ;" -"椀>wǎn|\\\ ;" -"椃>háo|\\\ ;" -"椄>jiē|\\\ ;" -"椑>bēi|\\\ ;" -"椕>bīn|\\\ ;" -"椘>chǔ|\\\ ;" -"椝>guī|\\\ ;" -"椥>zhī|\\\ ;" -"椮>sēn|\\\ ;" -"椯>duó|\\\ ;" -"椱>fòu|\\\ ;" -"椲>wěi|\\\ ;" -"椳>wēi|\\\ ;" -"椵>jiǎ|\\\ ;" -"椶>hán|\\\ ;" -"椻>yàn|\\\ ;" -"椼>yǎn|\\\ ;" -"楁>chā|\\\ ;" -"楃>huī|\\\ ;" -"楆>yāo|\\\ ;" -"楇>huò|\\\ ;" -"楉>ruò|\\\ ;" -"楌>yán|\\\ ;" -"楍>běn|\\\ ;" -"楎>hún|\\\ ;" -"楏>kuí|\\\ ;" -"楐>jiè|\\\ ;" -"楑>kuí|\\\ ;" -"楖>zhì|\\\ ;" -"楙>mào|\\\ ;" -"楢>yóu|\\\ ;" -"楬>jié|\\\ ;" -"楱>còu|\\\ ;" -"楲>jiē|\\\ ;" -"楳>méi|\\\ ;" -"楶>jié|\\\ ;" -"楺>róu|\\\ ;" -"榅>yún|\\\ ;" -"榎>jiǎ|\\\ ;" -"榚>yǎo|\\\ ;" -"榢>jià|\\\ ;" -"榣>yáo|\\\ ;" -"榤>jié|\\\ ;" -"榦>gàn|\\\ ;" -"榯>shí|\\\ ;" -"榰>zhī|\\\ ;" -"榱>cuī|\\\ ;" -"榲>yún|\\\ ;" -"榿>gǎo|\\\ ;" -"槀>kǎo|\\\ ;" -"槃>pán|\\\ ;" -"槄>tāo|\\\ ;" -"槆>duī|\\\ ;" -"槈>nòu|\\\ ;" -"構>gòu|\\\ ;" -"槏>chù|\\\ ;" -"槑>méi|\\\ ;" -"槔>gāo|\\\ ;" -"槖>tuó|\\\ ;" -"様>kǎn|\\\ ;" -"槚>jiǎ|\\\ ;" -"槥>huì|\\\ ;" -"槨>guǒ|\\\ ;" -"槩>gài|\\\ ;" -"槪>gài|\\\ ;" -"槬>huà|\\\ ;" -"槮>sēn|\\\ ;" -"槯>cuī|\\\ ;" -"槱>yǒu|\\\ ;" -"槶>kuì|\\\ ;" -"槸>niè|\\\ ;" -"槹>gāo|\\\ ;" -"槻>guī|\\\ ;" -"槼>guī|\\\ ;" -"槾>mán|\\\ ;" -"樆>fàn|\\\ ;" -"樇>xiū|\\\ ;" -"樋>léi|\\\ ;" -"樎>suō|\\\ ;" -"樏>lěi|\\\ ;" -"樓>lóu|\\\ ;" -"樛>jiū|\\\ ;" -"樜>shù|\\\ ;" -"樝>zhā|\\\ ;" -"樞>shū|\\\ ;" -"樠>mén|\\\ ;" -"樦>zhù|\\\ ;" -"樧>shā|\\\ ;" -"樳>xín|\\\ ;" -"樴>zhí|\\\ ;" -"樶>zuī|\\\ ;" -"樹>shù|\\\ ;" -"樺>huà|\\\ ;" -"樻>kuì|\\\ ;" -"橁>xún|\\\ ;" -"橆>cuì|\\\ ;" -"橈>náo|\\\ ;" -"橉>lìn|\\\ ;" -"橊>liú|\\\ ;" -"橍>rùn|\\\ ;" -"橎>fán|\\\ ;" -"橑>lǎo|\\\ ;" -"橔>tuí|\\\ ;" -"橜>jué|\\\ ;" -"橝>tān|\\\ ;" -"橞>duǒ|\\\ ;" -"橠>nuǒ|\\\ ;" -"橢>tuǒ|\\\ ;" -"橤>ruǐ|\\\ ;" -"橨>fén|\\\ ;" -"橪>rǎn|\\\ ;" -"橬>cén|\\\ ;" -"橮>liǔ|\\\ ;" -"橯>lào|\\\ ;" -"橰>gāo|\\\ ;" -"橷>dōu|\\\ ;" -"橾>shū|\\\ ;" -"檁>lǐn|\\\ ;" -"檃>yǐn|\\\ ;" -"檅>suì|\\\ ;" -"檇>zuì|\\\ ;" -"檊>gàn|\\\ ;" -"檎>qín|\\\ ;" -"檑>léi|\\\ ;" -"檓>huǐ|\\\ ;" -"檖>suì|\\\ ;" -"檚>chǔ|\\\ ;" -"檜>guì|\\\ ;" -"檞>jiě|\\\ ;" -"檟>jiǎ|\\\ ;" -"檡>shì|\\\ ;" -"檤>dào|\\\ ;" -"檨>shē|\\\ ;" -"檭>yín|\\\ ;" -"檮>táo|\\\ ;" -"檯>tái|\\\ ;" -"檳>bīn|\\\ ;" -"檴>huò|\\\ ;" -"檶>kǎn|\\\ ;" -"檺>gǎo|\\\ ;" -"檼>yǐn|\\\ ;" -"檿>yǎn|\\\ ;" -"櫃>guì|\\\ ;" -"櫆>kuí|\\\ ;" -"櫉>chú|\\\ ;" -"櫌>yōu|\\\ ;" -"櫍>zhì|\\\ ;" -"櫏>léi|\\\ ;" -"櫐>lěi|\\\ ;" -"櫑>lěi|\\\ ;" -"櫗>miè|\\\ ;" -"櫘>huì|\\\ ;" -"櫛>jié|\\\ ;" -"櫜>gāo|\\\ ;" -"櫠>fèi|\\\ ;" -"櫥>chú|\\\ ;" -"櫧>zhū|\\\ ;" -"櫩>yán|\\\ ;" -"櫫>zhū|\\\ ;" -"櫱>niè|\\\ ;" -"櫴>lài|\\\ ;" -"櫽>yǐn|\\\ ;" -"櫾>yóu|\\\ ;" -"欄>lán|\\\ ;" -"欇>shè|\\\ ;" -"欈>wéi|\\\ ;" -"欏>luó|\\\ ;" -"欑>zàn|\\\ ;" -"欔>jué|\\\ ;" -"欖>lǎn|\\\ ;" -"欗>lán|\\\ ;" -"欘>zhǔ|\\\ ;" -"欙>léi|\\\ ;" -"欪>chù|\\\ ;" -"欫>chī|\\\ ;" -"欬>kài|\\\ ;" -"欮>jué|\\\ ;" -"欱>xià|\\\ ;" -"欼>chǐ|\\\ ;" -"欽>qīn|\\\ ;" -"欿>kǎn|\\\ ;" -"歁>kǎn|\\\ ;" -"歄>guā|\\\ ;" -"歅>yīn|\\\ ;" -"歎>tàn|\\\ ;" -"歏>jìn|\\\ ;" -"歕>pēn|\\\ ;" -"歜>chù|\\\ ;" -"歞>kǎn|\\\ ;" -"歭>chí|\\\ ;" -"歯>chǐ|\\\ ;" -"歱>kuì|\\\ ;" -"歲>suì|\\\ ;" -"歳>suì|\\\ ;" -"歵>cuò|\\\ ;" -"歸>guī|\\\ ;" -"歺>dǎi|\\\ ;" -"歽>zhé|\\\ ;" -"殀>yǎo|\\\ ;" -"殌>jué|\\\ ;" -"殏>qiù|\\\ ;" -"殕>fǒu|\\\ ;" -"殗>dié|\\\ ;" -"殘>cán|\\\ ;" -"殙>hūn|\\\ ;" -"殞>yǔn|\\\ ;" -"殟>wēn|\\\ ;" -"殣>jìn|\\\ ;" -"殥>yín|\\\ ;" -"殨>huì|\\\ ;" -"殫>dān|\\\ ;" -"殯>bìn|\\\ ;" -"殶>zhù|\\\ ;" -"殺>shā|\\\ ;" -"殽>yáo|\\\ ;" -"殾>huì|\\\ ;" -"毀>huǐ|\\\ ;" -"毃>què|\\\ ;" -"毇>huǐ|\\\ ;" -"毎>měi|\\\ ;" -"毑>zuǒ|\\\ ;" -"毞>mào|\\\ ;" -"毠>jiā|\\\ ;" -"毢>sāi|\\\ ;" -"毥>xún|\\\ ;" -"毬>qiú|\\\ ;" -"毭>dòu|\\\ ;" -"毰>péi|\\\ ;" -"毲>duó|\\\ ;" -"毷>mào|\\\ ;" -"毸>suī|\\\ ;" -"毺>máo|\\\ ;" -"毻>tuò|\\\ ;" -"毿>sān|\\\ ;" -"氂>máo|\\\ ;" -"氉>sào|\\\ ;" -"氌>luó|\\\ ;" -"氎>dié|\\\ ;" -"氒>jué|\\\ ;" -"氕>piē|\\\ ;" -"氝>nèi|\\\ ;" -"氳>yūn|\\\ ;" -"氾>fàn|\\\ ;" -"氿>guǐ|\\\ ;" -"汃>bīn|\\\ ;" -"汄>hàn|\\\ ;" -"汍>wán|\\\ ;" -"汎>fàn|\\\ ;" -"汓>qiú|\\\ ;" -"汖>gān|\\\ ;" -"汦>chí|\\\ ;" -"汫>mén|\\\ ;" -"汭>ruì|\\\ ;" -"汮>jūn|\\\ ;" -"汵>gàn|\\\ ;" -"汷>gāi|\\\ ;" -"決>jué|\\\ ;" -"汼>niū|\\\ ;" -"沄>yún|\\\ ;" -"沇>yǎn|\\\ ;" -"沊>dàn|\\\ ;" -"沋>yóu|\\\ ;" -"沎>huò|\\\ ;" -"沑>róu|\\\ ;" -"沒>méi|\\\ ;" -"沚>zhǐ|\\\ ;" -"沜>pàn|\\\ ;" -"沠>liú|\\\ ;" -"沬>mèi|\\\ ;" -"沯>chí|\\\ ;" -"沰>tuō|\\\ ;" -"沲>duò|\\\ ;" -"沺>chí|\\\ ;" -"泇>jiā|\\\ ;" -"泍>bēn|\\\ ;" -"泏>chù|\\\ ;" -"泑>yǒu|\\\ ;" -"泖>mǎo|\\\ ;" -"泜>chí|\\\ ;" -"泧>yuè|\\\ ;" -"泬>jué|\\\ ;" -"泿>yín|\\\ ;" -"洂>huì|\\\ ;" -"洃>huī|\\\ ;" -"洅>yān|\\\ ;" -"洈>wéi|\\\ ;" -"洉>hòu|\\\ ;" -"洓>suǒ|\\\ ;" -"洔>zhǐ|\\\ ;" -"洕>yīn|\\\ ;" -"洡>lěi|\\\ ;" -"洧>wěi|\\\ ;" -"洩>xiè|\\\ ;" -"洬>dào|\\\ ;" -"洯>jié|\\\ ;" -"洷>zhì|\\\ ;" -"浉>shī|\\\ ;" -"浕>jìn|\\\ ;" -"浖>liè|\\\ ;" -"浗>qiú|\\\ ;" -"浘>wěi|\\\ ;" -"浛>hán|\\\ ;" -"浟>yóu|\\\ ;" -"浢>dòu|\\\ ;" -"浨>lǎn|\\\ ;" -"浫>hǎi|\\\ ;" -"浶>láo|\\\ ;" -"浹>jiā|\\\ ;" -"浽>suī|\\\ ;" -"浿>pèi|\\\ ;" -"涃>kùn|\\\ ;" -"涄>pīn|\\\ ;" -"涆>hàn|\\\ ;" -"涏>shù|\\\ ;" -"涒>tūn|\\\ ;" -"涙>lèi|\\\ ;" -"涠>wéi|\\\ ;" -"涢>yún|\\\ ;" -"涻>gàn|\\\ ;" -"涽>hūn|\\\ ;" -"淁>qiè|\\\ ;" -"淉>guǒ|\\\ ;" -"淊>yān|\\\ ;" -"淍>chù|\\\ ;" -"淏>hào|\\\ ;" -"淔>chì|\\\ ;" -"淚>lèi|\\\ ;" -"淛>zhè|\\\ ;" -"淪>lún|\\\ ;" -"淶>lái|\\\ ;" -"淽>zhǐ|\\\ ;" -"淾>yǐn|\\\ ;" -"渀>bēn|\\\ ;" -"渂>wèn|\\\ ;" -"渄>fēi|\\\ ;" -"渆>dié|\\\ ;" -"渉>shè|\\\ ;" -"渘>huì|\\\ ;" -"渞>qiú|\\\ ;" -"渦>guō|\\\ ;" -"渨>wēi|\\\ ;" -"渪>dié|\\\ ;" -"渫>xiè|\\\ ;" -"渰>yān|\\\ ;" -"渵>liú|\\\ ;" -"渷>yǎn|\\\ ;" -"渼>měi|\\\ ;" -"渽>zāi|\\\ ;" -"渾>hún|\\\ ;" -"湀>kuí|\\\ ;" -"湁>shí|\\\ ;" -"湈>méi|\\\ ;" -"湊>còu|\\\ ;" -"湋>wéi|\\\ ;" -"湌>cān|\\\ ;" -"湏>huì|\\\ ;" -"湓>pén|\\\ ;" -"湚>yìn|\\\ ;" -"湜>shí|\\\ ;" -"湝>jiē|\\\ ;" -"湠>hūn|\\\ ;" -"湣>mǐn|\\\ ;" -"湭>qiú|\\\ ;" -"湱>huò|\\\ ;" -"湳>nǎn|\\\ ;" -"湴>bàn|\\\ ;" -"湵>yǒu|\\\ ;" -"湺>yán|\\\ ;" -"湼>niè|\\\ ;" -"溈>guī|\\\ ;" -"溍>jìn|\\\ ;" -"溎>guì|\\\ ;" -"溑>suǒ|\\\ ;" -"溔>kài|\\\ ;" -"溙>liú|\\\ ;" -"溝>gōu|\\\ ;" -"溠>zhà|\\\ ;" -"溣>lún|\\\ ;" -"溨>cái|\\\ ;" -"溫>wēn|\\\ ;" -"溮>shī|\\\ ;" -"溰>qín|\\\ ;" -"溳>hún|\\\ ;" -"溵>yīn|\\\ ;" -"溼>shī|\\\ ;" -"溾>wēi|\\\ ;" -"溿>pàn|\\\ ;" -"滀>chù|\\\ ;" -"滅>miè|\\\ ;" -"滈>hào|\\\ ;" -"滍>zhǐ|\\\ ;" -"滐>jié|\\\ ;" -"滖>suī|\\\ ;" -"滙>huì|\\\ ;" -"滛>yín|\\\ ;" -"滜>gāo|\\\ ;" -"滫>xiū|\\\ ;" -"滯>zhì|\\\ ;" -"滱>kòu|\\\ ;" -"滼>fàn|\\\ ;" -"滾>gǔn|\\\ ;" -"滿>mǎn|\\\ ;" -"漌>jǐn|\\\ ;" -"漍>guó|\\\ ;" -"漐>yàn|\\\ ;" -"漑>gài|\\\ ;" -"漛>tān|\\\ ;" -"漢>hàn|\\\ ;" -"漷>kuò|\\\ ;" -"漹>liú|\\\ ;" -"漼>cuǐ|\\\ ;" -"潃>xún|\\\ ;" -"潄>shù|\\\ ;" -"潌>zhì|\\\ ;" -"潏>jué|\\\ ;" -"潓>huì|\\\ ;" -"潔>jié|\\\ ;" -"潙>guī|\\\ ;" -"潠>xùn|\\\ ;" -"潡>dùn|\\\ ;" -"潣>láo|\\\ ;" -"潤>rùn|\\\ ;" -"潫>wān|\\\ ;" -"潬>dàn|\\\ ;" -"潯>xún|\\\ ;" -"潰>kuì|\\\ ;" -"潵>sàn|\\\ ;" -"潻>shǔ|\\\ ;" -"潾>lín|\\\ ;" -"潿>wéi|\\\ ;" -"澇>lào|\\\ ;" -"澉>gǎn|\\\ ;" -"澊>cūn|\\\ ;" -"澏>hàn|\\\ ;" -"澐>yún|\\\ ;" -"澑>liù|\\\ ;" -"澔>hào|\\\ ;" -"澟>lǐn|\\\ ;" -"澥>xiè|\\\ ;" -"澨>shì|\\\ ;" -"澩>xué|\\\ ;" -"澪>huá|\\\ ;" -"澫>màn|\\\ ;" -"澯>càn|\\\ ;" -"澷>dān|\\\ ;" -"澸>dǎn|\\\ ;" -"澻>suì|\\\ ;" -"澿>qín|\\\ ;" -"濄>guō|\\\ ;" -"濅>fèn|\\\ ;" -"濆>fén|\\\ ;" -"濊>huì|\\\ ;" -"濋>chǔ|\\\ ;" -"濕>shī|\\\ ;" -"濜>jìn|\\\ ;" -"濤>tāo|\\\ ;" -"濦>yǐn|\\\ ;" -"濧>duì|\\\ ;" -"濩>huò|\\\ ;" -"濫>làn|\\\ ;" -"濬>jùn|\\\ ;" -"濰>wéi|\\\ ;" -"濱>bīn|\\\ ;" -"濷>fèi|\\\ ;" -"濻>duì|\\\ ;" -"濼>luò|\\\ ;" -"瀀>yōu|\\\ ;" -"瀄>jié|\\\ ;" -"瀈>huī|\\\ ;" -"瀉>xiè|\\\ ;" -"瀊>pán|\\\ ;" -"瀏>liú|\\\ ;" -"瀐>bào|\\\ ;" -"瀒>qìn|\\\ ;" -"瀕>bīn|\\\ ;" -"瀖>huò|\\\ ;" -"瀙>qīn|\\\ ;" -"瀡>suǐ|\\\ ;" -"瀢>wéi|\\\ ;" -"瀥>hào|\\\ ;" -"瀦>zhū|\\\ ;" -"瀨>lài|\\\ ;" -"瀩>duì|\\\ ;" -"瀪>fán|\\\ ;" -"瀬>lài|\\\ ;" -"瀵>fèn|\\\ ;" -"瀶>lín|\\\ ;" -"瀹>yuè|\\\ ;" -"瀻>dài|\\\ ;" -"瀾>lán|\\\ ;" -"瀿>fán|\\\ ;" -"灄>shè|\\\ ;" -"灆>lán|\\\ ;" -"灎>yàn|\\\ ;" -"灒>hàn|\\\ ;" -"灔>yàn|\\\ ;" -"灘>tān|\\\ ;" -"灝>hào|\\\ ;" -"灟>zhú|\\\ ;" -"灠>lǎn|\\\ ;" -"灡>lán|\\\ ;" -"灣>wān|\\\ ;" -"灥>xún|\\\ ;" -"灧>yàn|\\\ ;" -"灨>gǎn|\\\ ;" -"灩>yàn|\\\ ;" -"灳>huī|\\\ ;" -"灹>zhà|\\\ ;" -"灺>xiè|\\\ ;" -"灻>chì|\\\ ;" -"災>zāi|\\\ ;" -"炃>fén|\\\ ;" -"炄>niǔ|\\\ ;" -"炆>wén|\\\ ;" -"炌>kài|\\\ ;" -"炍>pàn|\\\ ;" -"炘>xīn|\\\ ;" -"炠>xiá|\\\ ;" -"炢>zhú|\\\ ;" -"炧>duò|\\\ ;" -"炨>bāo|\\\ ;" -"炰>páo|\\\ ;" -"炲>tái|\\\ ;" -"炶>hān|\\\ ;" -"為>wèi|\\\ ;" -"烎>yín|\\\ ;" -"烐>miè|\\\ ;" -"烑>yáo|\\\ ;" -"烒>shì|\\\ ;" -"烓>wēi|\\\ ;" -"烕>xuè|\\\ ;" -"烗>kài|\\\ ;" -"烚>huǐ|\\\ ;" -"烠>huǐ|\\\ ;" -"烢>zhè|\\\ ;" -"烣>huī|\\\ ;" -"烲>chè|\\\ ;" -"烸>hǎi|\\\ ;" -"烾>chì|\\\ ;" -"焂>shú|\\\ ;" -"焄>xūn|\\\ ;" -"焆>jué|\\\ ;" -"焌>jùn|\\\ ;" -"焎>xiè|\\\ ;" -"焔>yàn|\\\ ;" -"焛>hǔn|\\\ ;" -"焜>kūn|\\\ ;" -"焝>hùn|\\\ ;" -"焞>tūn|\\\ ;" -"焠>cuì|\\\ ;" -"焫>ruò|\\\ ;" -"焮>xìn|\\\ ;" -"焳>jué|\\\ ;" -"煃>kuǐ|\\\ ;" -"煆>xiā|\\\ ;" -"煇>huī|\\\ ;" -"煑>zhǔ|\\\ ;" -"煒>wěi|\\\ ;" -"煗>méi|\\\ ;" -"煙>yān|\\\ ;" -"煝>mèi|\\\ ;" -"煟>wèi|\\\ ;" -"煡>xìn|\\\ ;" -"煣>rǒu|\\\ ;" -"煩>fán|\\\ ;" -"煪>qiú|\\\ ;" -"煫>suì|\\\ ;" -"煭>bāo|\\\ ;" -"煯>jiē|\\\ ;" -"煰>gào|\\\ ;" -"煱>guā|\\\ ;" -"煴>yūn|\\\ ;" -"煹>gòu|\\\ ;" -"熁>xié|\\\ ;" -"熅>yùn|\\\ ;" -"熇>kǎo|\\\ ;" -"熉>yún|\\\ ;" -"熋>nái|\\\ ;" -"熎>yào|\\\ ;" -"熓>liù|\\\ ;" -"熡>lóu|\\\ ;" -"熣>suī|\\\ ;" -"熦>jué|\\\ ;" -"熫>zhì|\\\ ;" -"熭>dǎn|\\\ ;" -"熯>hàn|\\\ ;" -"熾>chì|\\\ ;" -"燄>yàn|\\\ ;" -"燆>dūn|\\\ ;" -"燇>zùn|\\\ ;" -"燉>dùn|\\\ ;" -"燌>bèn|\\\ ;" -"燐>lín|\\\ ;" -"燓>fēn|\\\ ;" -"燖>xún|\\\ ;" -"燘>měi|\\\ ;" -"燚>cuō|\\\ ;" -"燜>mèn|\\\ ;" -"燢>xué|\\\ ;" -"燣>lán|\\\ ;" -"燤>tài|\\\ ;" -"燦>càn|\\\ ;" -"燩>què|\\\ ;" -"燬>huǐ|\\\ ;" -"燭>zhú|\\\ ;" -"燰>wēi|\\\ ;" -"燲>xié|\\\ ;" -"燴>huì|\\\ ;" -"燷>lán|\\\ ;" -"燺>dào|\\\ ;" -"燻>xūn|\\\ ;" -"燼>jìn|\\\ ;" -"燾>dào|\\\ ;" -"燿>yào|\\\ ;" -"爁>làn|\\\ ;" -"爈>liè|\\\ ;" -"爋>xūn|\\\ ;" -"爑>jué|\\\ ;" -"爓>yàn|\\\ ;" -"爕>xiè|\\\ ;" -"爚>yuè|\\\ ;" -"爛>làn|\\\ ;" -"爡>chè|\\\ ;" -"爤>làn|\\\ ;" -"爥>zhú|\\\ ;" -"爮>páo|\\\ ;" -"爲>wèi|\\\ ;" -"牃>dié|\\\ ;" -"牉>pàn|\\\ ;" -"牏>tóu|\\\ ;" -"牞>jiū|\\\ ;" -"牣>rèn|\\\ ;" -"牪>yàn|\\\ ;" -"牬>bèi|\\\ ;" -"牰>yòu|\\\ ;" -"犃>pǒu|\\\ ;" -"犇>bēn|\\\ ;" -"犉>rún|\\\ ;" -"犌>jiā|\\\ ;" -"犓>chú|\\\ ;" -"犕>bèi|\\\ ;" -"犖>luò|\\\ ;" -"犗>jiè|\\\ ;" -"犙>sān|\\\ ;" -"犚>wèi|\\\ ;" -"犜>bēi|\\\ ;" -"犣>liè|\\\ ;" -"犦>bào|\\\ ;" -"犩>wèi|\\\ ;" -"犰>qiú|\\\ ;" -"犲>cái|\\\ ;" -"犼>hǒu|\\\ ;" -"犾>yín|\\\ ;" -"狏>tuó|\\\ ;" -"狖>yòu|\\\ ;" -"狘>yuè|\\\ ;" -"狚>dàn|\\\ ;" -"狥>xùn|\\\ ;" -"狫>lǎo|\\\ ;" -"狹>xiá|\\\ ;" -"狽>bèi|\\\ ;" -"狾>zhì|\\\ ;" -"狿>yán|\\\ ;" -"猀>shā|\\\ ;" -"猂>hàn|\\\ ;" -"猅>pái|\\\ ;" -"猆>fēi|\\\ ;" -"猇>yáo|\\\ ;" -"猌>yìn|\\\ ;" -"猍>lái|\\\ ;" -"猑>kūn|\\\ ;" -"猒>yān|\\\ ;" -"猓>guǒ|\\\ ;" -"猘>zhì|\\\ ;" -"猳>jiā|\\\ ;" -"猶>yóu|\\\ ;" -"猸>méi|\\\ ;" -"猹>zhā|\\\ ;" -"猺>yáo|\\\ ;" -"猻>sūn|\\\ ;" -"獀>sōu|\\\ ;" -"獃>dāi|\\\ ;" -"獅>shī|\\\ ;" -"獆>háo|\\\ ;" -"獋>háo|\\\ ;" -"獌>màn|\\\ ;" -"獔>háo|\\\ ;" -"獕>cuī|\\\ ;" -"獖>fén|\\\ ;" -"獜>lín|\\\ ;" -"獟>yào|\\\ ;" -"獡>què|\\\ ;" -"獢>huá|\\\ ;" -"獩>huì|\\\ ;" -"獱>pín|\\\ ;" -"獲>huò|\\\ ;" -"獳>nòu|\\\ ;" -"獵>liè|\\\ ;" -"獶>náo|\\\ ;" -"玀>luó|\\\ ;" -"玃>jué|\\\ ;" -"玕>gān|\\\ ;" -"玟>mín|\\\ ;" -"玠>jiè|\\\ ;" -"玥>yuè|\\\ ;" -"玦>jué|\\\ ;" -"玧>yǔn|\\\ ;" -"玨>jué|\\\ ;" -"玬>dǎn|\\\ ;" -"玽>gǒu|\\\ ;" -"玾>jiǎ|\\\ ;" -"珃>rǎn|\\\ ;" -"珋>liǔ|\\\ ;" -"珒>jīn|\\\ ;" -"珚>yān|\\\ ;" -"珛>xiù|\\\ ;" -"珡>qín|\\\ ;" -"珢>kèn|\\\ ;" -"珣>xún|\\\ ;" -"珤>bǎo|\\\ ;" -"珧>yáo|\\\ ;" -"珨>xiá|\\\ ;" -"珪>guī|\\\ ;" -"珮>pèi|\\\ ;" -"珳>hàn|\\\ ;" -"珺>jùn|\\\ ;" -"珻>méi|\\\ ;" -"珼>bèi|\\\ ;" -"琀>hán|\\\ ;" -"琇>xiù|\\\ ;" -"琎>jīn|\\\ ;" -"琓>wán|\\\ ;" -"琕>pín|\\\ ;" -"琗>cuì|\\\ ;" -"琘>mín|\\\ ;" -"琜>lái|\\\ ;" -"琝>wén|\\\ ;" -"琟>wéi|\\\ ;" -"琡>chù|\\\ ;" -"琣>huī|\\\ ;" -"琲>bèi|\\\ ;" -"琷>què|\\\ ;" -"琹>qín|\\\ ;" -"琾>jiè|\\\ ;" -"琿>hún|\\\ ;" -"瑂>méi|\\\ ;" -"瑇>dài|\\\ ;" -"瑈>róu|\\\ ;" -"瑉>mín|\\\ ;" -"瑋>wěi|\\\ ;" -"瑎>jiē|\\\ ;" -"瑠>liú|\\\ ;" -"瑡>shī|\\\ ;" -"瑣>suǒ|\\\ ;" -"瑤>yáo|\\\ ;" -"瑥>wēn|\\\ ;" -"瑧>jīn|\\\ ;" -"瑨>jìn|\\\ ;" -"瑫>tāo|\\\ ;" -"瑬>liú|\\\ ;" -"瑳>cuǒ|\\\ ;" -"瑴>jìn|\\\ ;" -"瑸>bīn|\\\ ;" -"瑻>kūn|\\\ ;" -"璅>suǒ|\\\ ;" -"璆>qiú|\\\ ;" -"璊>mén|\\\ ;" -"璌>yín|\\\ ;" -"璏>zhì|\\\ ;" -"璓>xiù|\\\ ;" -"璕>xún|\\\ ;" -"璘>lín|\\\ ;" -"璚>jué|\\\ ;" -"璛>jīn|\\\ ;" -"璝>guī|\\\ ;" -"璠>fán|\\\ ;" -"璡>jìn|\\\ ;" -"璪>zǎo|\\\ ;" -"璭>gùn|\\\ ;" -"璮>tǎn|\\\ ;" -"璯>huì|\\\ ;" -"璲>suì|\\\ ;" -"璶>jìn|\\\ ;" -"璸>bīn|\\\ ;" -"璺>wèn|\\\ ;" -"璻>zuǐ|\\\ ;" -"璼>lán|\\\ ;" -"瓁>huò|\\\ ;" -"瓂>gài|\\\ ;" -"瓃>léi|\\\ ;" -"瓆>zhí|\\\ ;" -"瓇>róu|\\\ ;" -"瓉>zàn|\\\ ;" -"瓌>guī|\\\ ;" -"瓍>suì|\\\ ;" -"瓓>làn|\\\ ;" -"瓙>dào|\\\ ;" -"瓚>zàn|\\\ ;" -"瓟>báo|\\\ ;" -"瓫>pén|\\\ ;" -"瓭>dǎn|\\\ ;" -"瓻>chī|\\\ ;" -"甊>lǒu|\\\ ;" -"甐>lín|\\\ ;" -"甔>dān|\\\ ;" -"甗>yǎn|\\\ ;" -"甛>hán|\\\ ;" -"甝>hān|\\\ ;" -"甤>ruí|\\\ ;" -"甧>sēn|\\\ ;" -"甴>zhá|\\\ ;" -"畂>jiù|\\\ ;" -"畃>wēi|\\\ ;" -"畄>liú|\\\ ;" -"畇>yún|\\\ ;" -"畍>jiè|\\\ ;" -"畘>liǔ|\\\ ;" -"畡>gāi|\\\ ;" -"畤>zhì|\\\ ;" -"畧>fān|\\\ ;" -"畨>pān|\\\ ;" -"畫>huà|\\\ ;" -"畭>liǔ|\\\ ;" -"畯>jùn|\\\ ;" -"畱>liú|\\\ ;" -"畵>huà|\\\ ;" -"畾>léi|\\\ ;" -"疀>chā|\\\ ;" -"疁>liú|\\\ ;" -"疄>lín|\\\ ;" -"疉>dié|\\\ ;" -"疊>dié|\\\ ;" -"疌>niè|\\\ ;" -"疍>dàn|\\\ ;" -"疎>shū|\\\ ;" -"疐>zhì|\\\ ;" -"疓>nǎi|\\\ ;" -"疜>xià|\\\ ;" -"疦>jué|\\\ ;" -"疧>zhī|\\\ ;" -"疨>xiā|\\\ ;" -"疩>cuì|\\\ ;" -"疰>zhù|\\\ ;" -"疶>xiè|\\\ ;" -"疻>zhǐ|\\\ ;" -"疿>fèi|\\\ ;" -"痀>gōu|\\\ ;" -"痄>zhà|\\\ ;" -"痎>kāi|\\\ ;" -"痏>wěi|\\\ ;" -"痐>huí|\\\ ;" -"痑>duǒ|\\\ ;" -"痓>chì|\\\ ;" -"痗>mèi|\\\ ;" -"痥>duó|\\\ ;" -"痳>lín|\\\ ;" -"痸>chì|\\\ ;" -"痻>mín|\\\ ;" -"痽>duī|\\\ ;" -"瘃>zhú|\\\ ;" -"瘅>dàn|\\\ ;" -"瘑>guā|\\\ ;" -"瘒>wén|\\\ ;" -"瘖>yīn|\\\ ;" -"瘚>jué|\\\ ;" -"瘛>chì|\\\ ;" -"瘣>lěi|\\\ ;" -"瘧>nüè|\\\ ;" -"瘰>luǒ|\\\ ;" -"瘶>lòu|\\\ ;" -"瘷>suǒ|\\\ ;" -"瘺>lòu|\\\ ;" -"瘽>jìn|\\\ ;" -"癅>liú|\\\ ;" -"癆>láo|\\\ ;" -"癈>fèi|\\\ ;" -"癉>dān|\\\ ;" -"癓>wéi|\\\ ;" -"癗>lěi|\\\ ;" -"癙>shǔ|\\\ ;" -"癚>dàn|\\\ ;" -"癛>lǐn|\\\ ;" -"癝>lǐn|\\\ ;" -"癟>biě|\\\ ;" -"癡>chī|\\\ ;" -"癤>jié|\\\ ;" -"癨>huò|\\\ ;" -"癩>lài|\\\ ;" -"癮>yǐn|\\\ ;" -"癱>tān|\\\ ;" -"癳>luǒ|\\\ ;" -"皃>mào|\\\ ;" -"皌>huī|\\\ ;" -"皐>gāo|\\\ ;" -"皔>hàn|\\\ ;" -"皜>hào|\\\ ;" -"皝>cuì|\\\ ;" -"皞>hào|\\\ ;" -"皠>cuǐ|\\\ ;" -"皡>hào|\\\ ;" -"皥>hào|\\\ ;" -"皯>gǎn|\\\ ;" -"皰>pào|\\\ ;" -"皳>qiú|\\\ ;" -"皵>què|\\\ ;" -"皶>zhā|\\\ ;" -"皸>jūn|\\\ ;" -"皹>jūn|\\\ ;" -"盃>bēi|\\\ ;" -"盌>wǎn|\\\ ;" -"盕>fàn|\\\ ;" -"盚>qiú|\\\ ;" -"盜>dào|\\\ ;" -"盠>jǐn|\\\ ;" -"盡>jìn|\\\ ;" -"盤>pán|\\\ ;" -"盨>shǔ|\\\ ;" -"盰>gǎn|\\\ ;" -"盺>fén|\\\ ;" -"盿>mín|\\\ ;" -"眃>yún|\\\ ;" -"眅>pān|\\\ ;" -"眊>mào|\\\ ;" -"眎>shì|\\\ ;" -"眑>yǎo|\\\ ;" -"眓>huò|\\\ ;" -"眛>mèi|\\\ ;" -"眣>dié|\\\ ;" -"眰>dié|\\\ ;" -"眿>mài|\\\ ;" -"睂>méi|\\\ ;" -"睅>hàn|\\\ ;" -"睉>cuō|\\\ ;" -"睌>wǎn|\\\ ;" -"睏>kùn|\\\ ;" -"睔>hǔn|\\\ ;" -"睕>wān|\\\ ;" -"睗>shì|\\\ ;" -"睙>liè|\\\ ;" -"睞>lài|\\\ ;" -"睟>suì|\\\ ;" -"睧>hūn|\\\ ;" -"睯>hūn|\\\ ;" -"睱>xià|\\\ ;" -"睴>gùn|\\\ ;" -"睵>cāi|\\\ ;" -"睸>mèi|\\\ ;" -"睺>hóu|\\\ ;" -"瞃>guì|\\\ ;" -"瞆>kuì|\\\ ;" -"瞉>kòu|\\\ ;" -"瞍>sǒu|\\\ ;" -"瞐>mào|\\\ ;" -"瞓>mén|\\\ ;" -"瞜>lōu|\\\ ;" -"瞝>chī|\\\ ;" -"瞞>mán|\\\ ;" -"瞮>chè|\\\ ;" -"瞴>móu|\\\ ;" -"瞵>lín|\\\ ;" -"瞶>guì|\\\ ;" -"瞺>huì|\\\ ;" -"矀>wéi|\\\ ;" -"矂>sào|\\\ ;" -"矄>xūn|\\\ ;" -"矅>yào|\\\ ;" -"矆>huò|\\\ ;" -"矉>bīn|\\\ ;" -"矐>huò|\\\ ;" -"矕>mǎn|\\\ ;" -"矙>kàn|\\\ ;" -"矚>zhǔ|\\\ ;" -"矝>jué|\\\ ;" -"矡>jué|\\\ ;" -"矦>hóu|\\\ ;" -"矱>huò|\\\ ;" -"矲>bǎi|\\\ ;" -"矺>tuō|\\\ ;" -"砃>dān|\\\ ;" -"砄>jué|\\\ ;" -"砇>mín|\\\ ;" -"砈>nuǒ|\\\ ;" -"砋>qiè|\\\ ;" -"砎>jiè|\\\ ;" -"砏>fēn|\\\ ;" -"砓>zhé|\\\ ;" -"砕>suì|\\\ ;" -"砙>pān|\\\ ;" -"砟>zhǎ|\\\ ;" -"砢>luǒ|\\\ ;" -"砤>tuó|\\\ ;" -"砫>zhǔ|\\\ ;" -"砲>pào|\\\ ;" -"砹>nuǒ|\\\ ;" -"硃>zhū|\\\ ;" -"硈>jiá|\\\ ;" -"硊>wěi|\\\ ;" -"硍>kèn|\\\ ;" -"硏>yán|\\\ ;" -"硙>wèi|\\\ ;" -"硤>xiá|\\\ ;" -"硨>chē|\\\ ;" -"硩>chè|\\\ ;" -"硯>yàn|\\\ ;" -"硰>shā|\\\ ;" -"硱>kǔn|\\\ ;" -"硸>nüè|\\\ ;" -"硽>liù|\\\ ;" -"碄>lín|\\\ ;" -"碅>jūn|\\\ ;" -"碈>mín|\\\ ;" -"碏>què|\\\ ;" -"碒>yín|\\\ ;" -"碖>lùn|\\\ ;" -"碞>yán|\\\ ;" -"碤>wěi|\\\ ;" -"碨>wēi|\\\ ;" -"碬>xiá|\\\ ;" -"碯>nǎo|\\\ ;" -"確>què|\\\ ;" -"碻>què|\\\ ;" -"磂>liù|\\\ ;" -"磆>huá|\\\ ;" -"磈>wěi|\\\ ;" -"磑>wèi|\\\ ;" -"磓>duī|\\\ ;" -"磡>kàn|\\\ ;" -"磤>yīn|\\\ ;" -"磥>lěi|\\\ ;" -"磪>cuī|\\\ ;" -"磱>láo|\\\ ;" -"磻>pán|\\\ ;" -"礊>huò|\\\ ;" -"礌>léi|\\\ ;" -"礎>chǔ|\\\ ;" -"礐>què|\\\ ;" -"礗>pīn|\\\ ;" -"礚>kài|\\\ ;" -"礜>léi|\\\ ;" -"礟>pào|\\\ ;" -"礣>miè|\\\ ;" -"礧>lèi|\\\ ;" -"礨>lěi|\\\ ;" -"礩>zhì|\\\ ;" -"礬>fán|\\\ ;" -"礭>què|\\\ ;" -"礮>pào|\\\ ;" -"礷>lán|\\\ ;" -"礸>zǎn|\\\ ;" -"礹>yán|\\\ ;" -"礿>yuè|\\\ ;" -"祄>xiè|\\\ ;" -"祅>yāo|\\\ ;" -"祋>duì|\\\ ;" -"祎>fèi|\\\ ;" -"祏>shí|\\\ ;" -"祐>yòu|\\\ ;" -"祑>zhì|\\\ ;" -"祙>mèi|\\\ ;" -"祪>guǐ|\\\ ;" -"祫>xiá|\\\ ;" -"祬>zhī|\\\ ;" -"祮>gào|\\\ ;" -"祰>gào|\\\ ;" -"祲>jīn|\\\ ;" -"祴>gāi|\\\ ;" -"祵>kǔn|\\\ ;" -"祶>bǐn|\\\ ;" -"祹>táo|\\\ ;" -"祽>zuì|\\\ ;" -"禃>zhí|\\\ ;" -"禆>bēi|\\\ ;" -"禇>zhě|\\\ ;" -"禉>yǒu|\\\ ;" -"禋>yīn|\\\ ;" -"禍>huò|\\\ ;" -"禖>méi|\\\ ;" -"禞>gào|\\\ ;" -"禫>tǎn|\\\ ;" -"禬>guì|\\\ ;" -"禱>dǎo|\\\ ;" -"禴>yuè|\\\ ;" -"禶>zǎn|\\\ ;" -"禷>lèi|\\\ ;" -"禸>róu|\\\ ;" -"禼>xiè|\\\ ;" -"秂>rén|\\\ ;" -"秅>chá|\\\ ;" -"秌>qiū|\\\ ;" -"秎>fén|\\\ ;" -"秏>hào|\\\ ;" -"秐>yún|\\\ ;" -"秓>zhī|\\\ ;" -"秖>zhī|\\\ ;" -"秚>bàn|\\\ ;" -"秞>yóu|\\\ ;" -"秨>zuó|\\\ ;" -"秪>zhī|\\\ ;" -"秮>huó|\\\ ;" -"秲>zhì|\\\ ;" -"秳>huó|\\\ ;" -"秵>yīn|\\\ ;" -"秷>zhí|\\\ ;" -"秹>chǐ|\\\ ;" -"秼>gào|\\\ ;" -"稁>kǎo|\\\ ;" -"稇>kǔn|\\\ ;" -"稈>gǎn|\\\ ;" -"稐>lǔn|\\\ ;" -"稓>zuó|\\\ ;" -"稙>zhí|\\\ ;" -"稛>kǔn|\\\ ;" -"稝>huà|\\\ ;" -"稡>lüě|\\\ ;" -"稤>lüè|\\\ ;" -"稬>nuò|\\\ ;" -"稭>jiē|\\\ ;" -"稲>dào|\\\ ;" -"稾>gǎo|\\\ ;" -"穁>cǎn|\\\ ;" -"穂>suì|\\\ ;" -"穈>mén|\\\ ;" -"穉>zhì|\\\ ;" -"穏>wěn|\\\ ;" -"穐>qiū|\\\ ;" -"穕>qiè|\\\ ;" -"穟>suì|\\\ ;" -"穢>huì|\\\ ;" -"穤>nuò|\\\ ;" -"穦>bīn|\\\ ;" -"穨>tuí|\\\ ;" -"穩>wěn|\\\ ;" -"穫>huò|\\\ ;" -"穱>jué|\\\ ;" -"穳>zàn|\\\ ;" -"穻>tún|\\\ ;" -"穼>sēn|\\\ ;" -"穾>yào|\\\ ;" -"窂>láo|\\\ ;" -"窅>yǎo|\\\ ;" -"窇>báo|\\\ ;" -"窋>zhú|\\\ ;" -"窐>guī|\\\ ;" -"窔>yǎo|\\\ ;" -"窛>kòu|\\\ ;" -"窞>dàn|\\\ ;" -"窯>yáo|\\\ ;" -"窰>yáo|\\\ ;" -"窷>kuǐ|\\\ ;" -"窺>kuī|\\\ ;" -"竁>cuì|\\\ ;" -"竃>zào|\\\ ;" -"竇>dòu|\\\ ;" -"竈>wèi|\\\ ;" -"竊>qiè|\\\ ;" -"竌>chù|\\\ ;" -"竍>shí|\\\ ;" -"竎>fòu|\\\ ;" -"竐>chù|\\\ ;" -"竕>shí|\\\ ;" -"竪>shù|\\\ ;" -"竴>cuī|\\\ ;" -"竷>kàn|\\\ ;" -"竻>gǎn|\\\ ;" -"竾>chí|\\\ ;" -"笁>zhú|\\\ ;" -"笒>cén|\\\ ;" -"笚>xiá|\\\ ;" -"笜>zhú|\\\ ;" -"笡>qiè|\\\ ;" -"笢>mǐn|\\\ ;" -"笣>bāo|\\\ ;" -"笩>pèi|\\\ ;" -"笯>fán|\\\ ;" -"笲>fán|\\\ ;" -"笵>fàn|\\\ ;" -"笶>shǐ|\\\ ;" -"笷>mǎo|\\\ ;" -"笿>luò|\\\ ;" -"筀>guì|\\\ ;" -"筂>chí|\\\ ;" -"筃>yīn|\\\ ;" -"筄>yào|\\\ ;" -"筈>guā|\\\ ;" -"筍>sǔn|\\\ ;" -"筙>lái|\\\ ;" -"筨>hán|\\\ ;" -"筪>jiā|\\\ ;" -"筫>zhì|\\\ ;" -"筯>zhù|\\\ ;" -"筰>zuó|\\\ ;" -"筶>gǎo|\\\ ;" -"筸>gān|\\\ ;" -"筼>yún|\\\ ;" -"箂>lái|\\\ ;" -"箃>zōu|\\\ ;" -"箈>chí|\\\ ;" -"箎>chí|\\\ ;" -"箑>shà|\\\ ;" -"箖>lín|\\\ ;" -"箘>jùn|\\\ ;" -"箚>zhá|\\\ ;" -"箟>jùn|\\\ ;" -"箨>tuò|\\\ ;" -"箰>sǔn|\\\ ;" -"箷>shī|\\\ ;" -"節>jié|\\\ ;" -"篃>méi|\\\ ;" -"範>fàn|\\\ ;" -"築>zhú|\\\ ;" -"篋>qiè|\\\ ;" -"篍>qiū|\\\ ;" -"篔>yún|\\\ ;" -"篗>yuè|\\\ ;" -"篛>ruò|\\\ ;" -"篞>niè|\\\ ;" -"篨>chú|\\\ ;" -"篪>chí|\\\ ;" -"篫>zhú|\\\ ;" -"篲>huì|\\\ ;" -"篶>yān|\\\ ;" -"篸>sēn|\\\ ;" -"篺>pái|\\\ ;" -"簂>guó|\\\ ;" -"簆>kòu|\\\ ;" -"簍>lǒu|\\\ ;" -"簑>suō|\\\ ;" -"簔>suō|\\\ ;" -"簞>dān|\\\ ;" -"簢>mǐn|\\\ ;" -"簣>kuì|\\\ ;" -"簤>dài|\\\ ;" -"簨>sǔn|\\\ ;" -"簩>láo|\\\ ;" -"簭>shì|\\\ ;" -"簮>zān|\\\ ;" -"簰>pái|\\\ ;" -"簲>gǎn|\\\ ;" -"簳>gàn|\\\ ;" -"簷>yán|\\\ ;" -"簺>sài|\\\ ;" -"籃>lán|\\\ ;" -"籄>kuì|\\\ ;" -"籆>yuè|\\\ ;" -"籇>háo|\\\ ;" -"籉>tái|\\\ ;" -"籒>fán|\\\ ;" -"籓>fān|\\\ ;" -"籔>sǒu|\\\ ;" -"籜>tuò|\\\ ;" -"籟>lài|\\\ ;" -"籣>lán|\\\ ;" -"籥>yuè|\\\ ;" -"籮>luó|\\\ ;" -"籰>yuè|\\\ ;" -"籵>fán|\\\ ;" -"籷>zhé|\\\ ;" -"籺>xié|\\\ ;" -"籿>cùn|\\\ ;" -"粄>bǎn|\\\ ;" -"粆>shā|\\\ ;" -"粈>rǒu|\\\ ;" -"粋>cuì|\\\ ;" -"粎>chǐ|\\\ ;" -"粓>gān|\\\ ;" -"粦>lín|\\\ ;" -"粨>bǎi|\\\ ;" -"粵>yuè|\\\ ;" -"粺>bài|\\\ ;" -"粿>guǒ|\\\ ;" -"糂>róu|\\\ ;" -"糏>xiè|\\\ ;" -"糒>bèi|\\\ ;" -"糔>xiǔ|\\\ ;" -"糝>sǎn|\\\ ;" -"糞>fèn|\\\ ;" -"糣>sǎn|\\\ ;" -"糤>chì|\\\ ;" -"糥>nuò|\\\ ;" -"糱>niè|\\\ ;" -"糳>zuò|\\\ ;" -"糵>niè|\\\ ;" -"糷>lán|\\\ ;" -"糺>jiū|\\\ ;" -"糾>jiū|\\\ ;" -"紁>chà|\\\ ;" -"紃>xún|\\\ ;" -"約>yāo|\\\ ;" -"紈>wán|\\\ ;" -"紉>rèn|\\\ ;" -"紋>wén|\\\ ;" -"紏>tǒu|\\\ ;" -"紐>niǔ|\\\ ;" -"紑>fóu|\\\ ;" -"紒>jiè|\\\ ;" -"紓>shū|\\\ ;" -"紖>yǐn|\\\ ;" -"紗>shā|\\\ ;" -"紙>zhǐ|\\\ ;" -"紛>fēn|\\\ ;" -"紜>yún|\\\ ;" -"紝>rèn|\\\ ;" -"紞>dǎn|\\\ ;" -"紟>jīn|\\\ ;" -"紣>cuì|\\\ ;" -"紤>jiǔ|\\\ ;" -"紥>zhá|\\\ ;" -"紩>zhì|\\\ ;" -"紲>xiè|\\\ ;" -"紴>bèi|\\\ ;" -"紵>zhù|\\\ ;" -"紸>zhù|\\\ ;" -"紺>gàn|\\\ ;" -"紽>tuó|\\\ ;" -"紿>dài|\\\ ;" -"絀>chù|\\\ ;" -"絆>bàn|\\\ ;" -"絉>shù|\\\ ;" -"絊>zuì|\\\ ;" -"絍>rén|\\\ ;" -"絏>xiè|\\\ ;" -"結>jiē|\\\ ;" -"絓>guà|\\\ ;" -"絔>bǎi|\\\ ;" -"絕>jué|\\\ ;" -"絛>tāo|\\\ ;" -"絜>jié|\\\ ;" -"絟>lào|\\\ ;" -"絠>gǎi|\\\ ;" -"絡>lào|\\\ ;" -"絤>bèi|\\\ ;" -"給>gěi|\\\ ;" -"絪>yīn|\\\ ;" -"絫>lěi|\\\ ;" -"絬>xiè|\\\ ;" -"絯>gāi|\\\ ;" -"絰>dié|\\\ ;" -"絵>huì|\\\ ;" -"絶>jué|\\\ ;" -"絺>chī|\\\ ;" -"絿>qiú|\\\ ;" -"綀>shū|\\\ ;" -"綅>qīn|\\\ ;" -"綉>tòu|\\\ ;" -"綏>suí|\\\ ;" -"綐>duì|\\\ ;" -"綑>kǔn|\\\ ;" -"綕>zhī|\\\ ;" -"綖>yán|\\\ ;" -"綞>duǒ|\\\ ;" -"綩>wǎn|\\\ ;" -"維>wéi|\\\ ;" -"綯>táo|\\\ ;" -"綰>wǎn|\\\ ;" -"綵>cǎi|\\\ ;" -"綶>guǒ|\\\ ;" -"綷>cuì|\\\ ;" -"綸>lún|\\\ ;" -"綹>liǔ|\\\ ;" -"綼>bēi|\\\ ;" -"緁>qiè|\\\ ;" -"緂>tān|\\\ ;" -"緃>hún|\\\ ;" -"緄>gǔn|\\\ ;" -"緅>zōu|\\\ ;" -"緊>jǐn|\\\ ;" -"緋>fēi|\\\ ;" -"緌>ruí|\\\ ;" -"緍>mín|\\\ ;" -"緐>fán|\\\ ;" -"緡>mín|\\\ ;" -"緥>bǎo|\\\ ;" -"緧>qiū|\\\ ;" -"緭>wèi|\\\ ;" -"緯>wěi|\\\ ;" -"緱>gōu|\\\ ;" -"緳>xié|\\\ ;" -"緷>guō|\\\ ;" -"緸>yīn|\\\ ;" -"緺>guā|\\\ ;" -"緻>zhì|\\\ ;" -"緼>yūn|\\\ ;" -"緿>dài|\\\ ;" -"縀>xiá|\\\ ;" -"縉>jìn|\\\ ;" -"縏>pán|\\\ ;" -"縒>cuǒ|\\\ ;" -"縕>yūn|\\\ ;" -"縖>cuī|\\\ ;" -"縗>cuī|\\\ ;" -"縚>tāo|\\\ ;" -"縜>yún|\\\ ;" -"縞>gǎo|\\\ ;" -"縡>zǎi|\\\ ;" -"縩>cài|\\\ ;" -"縮>suō|\\\ ;" -"縯>yǎn|\\\ ;" -"縲>léi|\\\ ;" -"縵>màn|\\\ ;" -"縶>zhí|\\\ ;" -"繀>suì|\\\ ;" -"繅>sāo|\\\ ;" -"繉>hún|\\\ ;" -"繍>xiù|\\\ ;" -"繎>rán|\\\ ;" -"繐>suì|\\\ ;" -"繓>zhì|\\\ ;" -"織>zhī|\\\ ;" -"繖>sǎn|\\\ ;" -"繗>lín|\\\ ;" -"繙>fān|\\\ ;" -"繜>zūn|\\\ ;" -"繞>rào|\\\ ;" -"繠>ruǐ|\\\ ;" -"繡>xiù|\\\ ;" -"繢>huì|\\\ ;" -"繣>huà|\\\ ;" -"繪>huì|\\\ ;" -"繲>jiè|\\\ ;" -"繷>náo|\\\ ;" -"繸>suì|\\\ ;" -"繽>bīn|\\\ ;" -"繿>lán|\\\ ;" -"纁>xūn|\\\ ;" -"纃>lěi|\\\ ;" -"纇>lèi|\\\ ;" -"纈>xié|\\\ ;" -"纋>yōu|\\\ ;" -"纍>léi|\\\ ;" -"纔>cái|\\\ ;" -"纙>luò|\\\ ;" -"纝>léi|\\\ ;" -"纴>rén|\\\ ;" -"纼>yǐn|\\\ ;" -"绖>dié|\\\ ;" -"绱>mǐn|\\\ ;" -"绹>táo|\\\ ;" -"缊>wēn|\\\ ;" -"缋>huì|\\\ ;" -"缍>duǒ|\\\ ;" -"缞>cuī|\\\ ;" -"缲>zǎo|\\\ ;" -"缷>xiè|\\\ ;" -"缹>fǒu|\\\ ;" -"缻>fǒu|\\\ ;" -"缿>hòu|\\\ ;" -"罇>zūn|\\\ ;" -"罈>tán|\\\ ;" -"罍>léi|\\\ ;" -"罎>tán|\\\ ;" -"罜>jiē|\\\ ;" -"罠>mín|\\\ ;" -"罣>guà|\\\ ;" -"罧>lín|\\\ ;" -"罫>guà|\\\ ;" -"罬>lǎn|\\\ ;" -"罱>nǎn|\\\ ;" -"罶>liǔ|\\\ ;" -"罻>wèi|\\\ ;" -"羀>liǔ|\\\ ;" -"羅>luó|\\\ ;" -"羐>yǒu|\\\ ;" -"羑>yǒu|\\\ ;" -"羒>fén|\\\ ;" -"羙>gāo|\\\ ;" -"羜>zhù|\\\ ;" -"羣>qún|\\\ ;" -"羧>suō|\\\ ;" -"羳>fán|\\\ ;" -"羵>fěn|\\\ ;" -"翂>fēn|\\\ ;" -"翄>chì|\\\ ;" -"翆>cuì|\\\ ;" -"翈>xiá|\\\ ;" -"翉>pěn|\\\ ;" -"翏>liù|\\\ ;" -"翓>xié|\\\ ;" -"翙>huì|\\\ ;" -"翚>huī|\\\ ;" -"翛>shù|\\\ ;" -"翢>tāo|\\\ ;" -"翣>shà|\\\ ;" -"翤>chì|\\\ ;" -"翨>shì|\\\ ;" -"翫>wàn|\\\ ;" -"翬>huī|\\\ ;" -"翭>hóu|\\\ ;" -"翷>lín|\\\ ;" -"翸>pěn|\\\ ;" -"翽>huì|\\\ ;" -"翿>dào|\\\ ;" -"耇>gǒu|\\\ ;" -"耈>gǒu|\\\ ;" -"耉>gǒu|\\\ ;" -"耊>diè|\\\ ;" -"耚>huō|\\\ ;" -"耛>chí|\\\ ;" -"耝>chú|\\\ ;" -"耞>jiā|\\\ ;" -"耡>chú|\\\ ;" -"耢>lào|\\\ ;" -"耣>lǔn|\\\ ;" -"耥>lǒu|\\\ ;" -"耧>lóu|\\\ ;" -"耬>lóu|\\\ ;" -"耮>lào|\\\ ;" -"耯>huò|\\\ ;" -"耰>yōu|\\\ ;" -"耹>qín|\\\ ;" -"耺>yún|\\\ ;" -"耼>dān|\\\ ;" -"聀>zhí|\\\ ;" -"聅>chè|\\\ ;" -"聈>yǒu|\\\ ;" -"聎>guō|\\\ ;" -"聑>dié|\\\ ;" -"聕>hào|\\\ ;" -"聗>liè|\\\ ;" -"聝>guó|\\\ ;" -"聞>wén|\\\ ;" -"聧>kuí|\\\ ;" -"聭>kuì|\\\ ;" -"聵>kuì|\\\ ;" -"聶>niè|\\\ ;" -"職>zhí|\\\ ;" -"聸>dān|\\\ ;" -"聺>qiē|\\\ ;" -"肊>jīn|\\\ ;" -"肍>qiú|\\\ ;" -"肎>kěn|\\\ ;" -"肏>cào|\\\ ;" -"肕>rèn|\\\ ;" -"肞>chā|\\\ ;" -"肦>bān|\\\ ;" -"肧>pēi|\\\ ;" -"肰>rán|\\\ ;" -"肵>jìn|\\\ ;" -"胅>dié|\\\ ;" -"胇>bēi|\\\ ;" -"胑>zhī|\\\ ;" -"胟>chǐ|\\\ ;" -"胲>hǎi|\\\ ;" -"胵>zhì|\\\ ;" -"胿>guī|\\\ ;" -"脃>cuì|\\\ ;" -"脄>méi|\\\ ;" -"脅>xié|\\\ ;" -"脇>xié|\\\ ;" -"脈>mài|\\\ ;" -"脕>wǎn|\\\ ;" -"脗>wěn|\\\ ;" -"脙>jué|\\\ ;" -"脜>qiē|\\\ ;" -"脢>méi|\\\ ;" -"脩>xiū|\\\ ;" -"脪>tuì|\\\ ;" -"脫>tuō|\\\ ;" -"脮>něi|\\\ ;" -"脰>dòu|\\\ ;" -"脶>guā|\\\ ;" -"脺>cuì|\\\ ;" -"脻>jié|\\\ ;" -"腂>guò|\\\ ;" -"腃>kuì|\\\ ;" -"腅>dàn|\\\ ;" -"腇>něi|\\\ ;" -"腉>jiē|\\\ ;" -"腍>rěn|\\\ ;" -"腜>méi|\\\ ;" -"腞>dùn|\\\ ;" -"腟>luó|\\\ ;" -"腠>còu|\\\ ;" -"腡>guā|\\\ ;" -"腢>nào|\\\ ;" -"腦>nǎo|\\\ ;" -"腪>yùn|\\\ ;" -"腬>róu|\\\ ;" -"腲>jué|\\\ ;" -"腵>jiā|\\\ ;" -"膄>sòu|\\\ ;" -"膎>xié|\\\ ;" -"膕>guó|\\\ ;" -"膡>liú|\\\ ;" -"膣>lìn|\\\ ;" -"膬>cuì|\\\ ;" -"膭>guī|\\\ ;" -"膰>fán|\\\ ;" -"膱>zhí|\\\ ;" -"膵>cuì|\\\ ;" -"膶>rùn|\\\ ;" -"膸>suǐ|\\\ ;" -"膹>fèn|\\\ ;" -"膼>bèi|\\\ ;" -"膽>dǎn|\\\ ;" -"臄>jué|\\\ ;" -"臅>chù|\\\ ;" -"臎>cuì|\\\ ;" -"臏>bìn|\\\ ;" -"臐>xūn|\\\ ;" -"臒>huò|\\\ ;" -"臙>yān|\\\ ;" -"臛>huò|\\\ ;" -"臝>luǒ|\\\ ;" -"臨>lín|\\\ ;" -"臮>dié|\\\ ;" -"臯>gāo|\\\ ;" -"臲>niè|\\\ ;" -"臷>dié|\\\ ;" -"臸>zhì|\\\ ;" -"臹>xiū|\\\ ;" -"臺>tái|\\\ ;" -"臿>chā|\\\ ;" -"舊>jiù|\\\ ;" -"舋>xìn|\\\ ;" -"舏>jiǔ|\\\ ;" -"舑>tān|\\\ ;" -"舓>shì|\\\ ;" -"舕>dàn|\\\ ;" -"舙>huà|\\\ ;" -"舚>tān|\\\ ;" -"舝>xiá|\\\ ;" -"舠>dāo|\\\ ;" -"舦>tài|\\\ ;" -"舧>fán|\\\ ;" -"舺>xiá|\\\ ;" -"艁>zào|\\\ ;" -"艒>mào|\\\ ;" -"艓>dié|\\\ ;" -"艖>chā|\\\ ;" -"艛>lóu|\\\ ;" -"艜>dài|\\\ ;" -"艞>yào|\\\ ;" -"艢>tán|\\\ ;" -"艥>jiè|\\\ ;" -"艧>huò|\\\ ;" -"艶>yàn|\\\ ;" -"艷>yàn|\\\ ;" -"艸>cǎo|\\\ ;" -"芀>jiē|\\\ ;" -"芄>wán|\\\ ;" -"芈>miē|\\\ ;" -"芉>gān|\\\ ;" -"芔>huǐ|\\\ ;" -"芕>suī|\\\ ;" -"芚>tún|\\\ ;" -"芛>wěi|\\\ ;" -"芠>fóu|\\\ ;" -"芢>rén|\\\ ;" -"芣>fóu|\\\ ;" -"芤>kōu|\\\ ;" -"芲>huā|\\\ ;" -"芵>jué|\\\ ;" -"芶>gōu|\\\ ;" -"芻>chú|\\\ ;" -"芼>mào|\\\ ;" -"苂>yín|\\\ ;" -"苃>yǒu|\\\ ;" -"苝>pèi|\\\ ;" -"苠>mín|\\\ ;" -"苤>piě|\\\ ;" -"苧>zhù|\\\ ;" -"苬>qiú|\\\ ;" -"苭>yǎo|\\\ ;" -"苲>zhǎ|\\\ ;" -"苵>dié|\\\ ;" -"苶>nié|\\\ ;" -"苺>méi|\\\ ;" -"苿>wèi|\\\ ;" -"茍>gǒu|\\\ ;" -"茓>xué|\\\ ;" -"茚>yìn|\\\ ;" -"茠>xiū|\\\ ;" -"茡>duō|\\\ ;" -"茢>liè|\\\ ;" -"茥>guī|\\\ ;" -"茩>gǒu|\\\ ;" -"茿>zhú|\\\ ;" -"荂>kuā|\\\ ;" -"荄>gāi|\\\ ;" -"荎>chí|\\\ ;" -"荕>jīn|\\\ ;" -"荖>lǎo|\\\ ;" -"荗>shù|\\\ ;" -"荛>ráo|\\\ ;" -"荱>wěi|\\\ ;" -"荲>chù|\\\ ;" -"荳>dòu|\\\ ;" -"荵>rěn|\\\ ;" -"荶>yín|\\\ ;" -"荺>yún|\\\ ;" -"莂>bié|\\\ ;" -"莇>chí|\\\ ;" -"莌>duó|\\\ ;" -"莍>qiú|\\\ ;" -"莏>mèi|\\\ ;" -"莗>chē|\\\ ;" -"莙>jūn|\\\ ;" -"莚>yán|\\\ ;" -"莝>cuò|\\\ ;" -"莟>hàn|\\\ ;" -"莡>cuò|\\\ ;" -"莢>jiá|\\\ ;" -"莤>yóu|\\\ ;" -"莥>niǔ|\\\ ;" -"莭>jié|\\\ ;" -"莮>nán|\\\ ;" -"莸>yóu|\\\ ;" -"菆>zōu|\\\ ;" -"菋>wèi|\\\ ;" -"菍>jùn|\\\ ;" -"菎>kūn|\\\ ;" -"菓>guǒ|\\\ ;" -"菕>lún|\\\ ;" -"菛>mén|\\\ ;" -"菢>bào|\\\ ;" -"菣>qìn|\\\ ;" -"菦>bèi|\\\ ;" -"菨>jiē|\\\ ;" -"菫>jǐn|\\\ ;" -"菬>huā|\\\ ;" -"菭>tái|\\\ ;" -"華>huá|\\\ ;" -"菻>lǐn|\\\ ;" -"菼>tǎn|\\\ ;" -"菿>dào|\\\ ;" -"萉>féi|\\\ ;" -"萊>lái|\\\ ;" -"萐>shà|\\\ ;" -"萖>wǎn|\\\ ;" -"萘>nài|\\\ ;" -"萚>tuò|\\\ ;" -"萛>jiū|\\\ ;" -"萜>tiē|\\\ ;" -"萩>qiū|\\\ ;" -"萬>wàn|\\\ ;" -"萿>huó|\\\ ;" -"葀>guā|\\\ ;" -"葃>zuó|\\\ ;" -"葄>zuò|\\\ ;" -"葇>róu|\\\ ;" -"葐>pén|\\\ ;" -"葔>hóu|\\\ ;" -"葕>yán|\\\ ;" -"葘>rèn|\\\ ;" -"葜>jié|\\\ ;" -"葝>bèi|\\\ ;" -"葢>gài|\\\ ;" -"葤>jiè|\\\ ;" -"葦>wěi|\\\ ;" -"葨>wēi|\\\ ;" -"葯>yào|\\\ ;" -"葰>jùn|\\\ ;" -"葷>hūn|\\\ ;" -"葹>shī|\\\ ;" -"葻>lán|\\\ ;" -"葽>yāo|\\\ ;" -"葿>méi|\\\ ;" -"蒀>yūn|\\\ ;" -"蒁>shù|\\\ ;" -"蒆>xuē|\\\ ;" -"蒈>kǎi|\\\ ;" -"蒉>kuì|\\\ ;" -"蒍>wéi|\\\ ;" -"蒎>pài|\\\ ;" -"蒐>sōu|\\\ ;" -"蒑>yīn|\\\ ;" -"蒒>shī|\\\ ;" -"蒔>shí|\\\ ;" -"蒛>quē|\\\ ;" -"蒢>chú|\\\ ;" -"蒥>liú|\\\ ;" -"蒫>cuō|\\\ ;" -"蒭>chú|\\\ ;" -"蒷>yún|\\\ ;" -"蒻>ruò|\\\ ;" -"蓀>sūn|\\\ ;" -"蓂>huò|\\\ ;" -"蓃>sōu|\\\ ;" -"蓅>liú|\\\ ;" -"蓋>gài|\\\ ;" -"蓌>cuò|\\\ ;" -"蓏>luǒ|\\\ ;" -"蓔>yǎo|\\\ ;" -"蓕>guì|\\\ ;" -"蓘>gǔn|\\\ ;" -"蓚>xiū|\\\ ;" -"蓡>cān|\\\ ;" -"蓩>mào|\\\ ;" -"蓫>zhú|\\\ ;" -"蓲>qiū|\\\ ;" -"蓳>jìn|\\\ ;" -"蓵>jié|\\\ ;" -"蓶>wěi|\\\ ;" -"蓷>tuī|\\\ ;" -"蓸>cáo|\\\ ;" -"蔂>luó|\\\ ;" -"蔄>màn|\\\ ;" -"蔅>yán|\\\ ;" -"蔉>gǔn|\\\ ;" -"蔊>hǎn|\\\ ;" -"蔎>shè|\\\ ;" -"蔒>xūn|\\\ ;" -"蔖>cuó|\\\ ;" -"蔘>sēn|\\\ ;" -"蔞>lóu|\\\ ;" -"蔧>huì|\\\ ;" -"蔨>jùn|\\\ ;" -"蔩>yín|\\\ ;" -"蔭>yìn|\\\ ;" -"蔱>shā|\\\ ;" -"蔲>kòu|\\\ ;" -"蔿>wéi|\\\ ;" -"蕁>xún|\\\ ;" -"蕌>lěi|\\\ ;" -"蕏>chú|\\\ ;" -"蕐>huá|\\\ ;" -"蕒>mǎi|\\\ ;" -"蕓>yún|\\\ ;" -"蕔>bāo|\\\ ;" -"蕕>yóu|\\\ ;" -"蕘>ráo|\\\ ;" -"蕜>fěi|\\\ ;" -"蕝>jué|\\\ ;" -"蕡>fén|\\\ ;" -"蕢>kuì|\\\ ;" -"蕰>yùn|\\\ ;" -"蕵>sūn|\\\ ;" -"蕸>xiá|\\\ ;" -"蕼>hǎo|\\\ ;" -"薀>yùn|\\\ ;" -"薃>hào|\\\ ;" -"薈>huì|\\\ ;" -"薉>wèi|\\\ ;" -"薎>miè|\\\ ;" -"薒>càn|\\\ ;" -"薝>kàn|\\\ ;" -"薞>sūn|\\\ ;" -"薠>fán|\\\ ;" -"薢>jiē|\\\ ;" -"薥>shǔ|\\\ ;" -"薧>kǎo|\\\ ;" -"薫>xūn|\\\ ;" -"薬>yào|\\\ ;" -"薱>duì|\\\ ;" -"薲>pín|\\\ ;" -"薳>wěi|\\\ ;" -"藃>hào|\\\ ;" -"藍>lán|\\\ ;" -"藎>jìn|\\\ ;" -"藒>qiè|\\\ ;" -"藛>xiě|\\\ ;" -"藟>lěi|\\\ ;" -"藢>zhǐ|\\\ ;" -"藣>bēi|\\\ ;" -"藥>yào|\\\ ;" -"藪>sǒu|\\\ ;" -"藫>huí|\\\ ;" -"藬>tuī|\\\ ;" -"藯>wèi|\\\ ;" -"藰>liú|\\\ ;" -"藱>huì|\\\ ;" -"藳>gǎo|\\\ ;" -"藴>yùn|\\\ ;" -"藷>shǔ|\\\ ;" -"藸>chú|\\\ ;" -"藺>lìn|\\\ ;" -"藾>lài|\\\ ;" -"蘀>tuò|\\\ ;" -"蘃>ruǐ|\\\ ;" -"蘈>tuí|\\\ ;" -"蘊>yùn|\\\ ;" -"蘋>pín|\\\ ;" -"蘍>xūn|\\\ ;" -"蘗>niè|\\\ ;" -"蘣>huā|\\\ ;" -"蘤>wěi|\\\ ;" -"蘫>lán|\\\ ;" -"蘬>kuī|\\\ ;" -"蘭>lán|\\\ ;" -"蘱>lèi|\\\ ;" -"蘲>léi|\\\ ;" -"蘳>huǎ|\\\ ;" -"蘵>zhí|\\\ ;" -"蘶>wèi|\\\ ;" -"蘷>kuí|\\\ ;" -"蘽>lěi|\\\ ;" -"蘿>luó|\\\ ;" -"虁>kuí|\\\ ;" -"虆>léi|\\\ ;" -"虋>mén|\\\ ;" -"虌>biē|\\\ ;" -"處>chǔ|\\\ ;" -"虘>cuó|\\\ ;" -"號>háo|\\\ ;" -"虣>bào|\\\ ;" -"虤>yán|\\\ ;" -"虧>kuī|\\\ ;" -"虨>bān|\\\ ;" -"虪>shú|\\\ ;" -"虯>qiú|\\\ ;" -"虴>zhé|\\\ ;" -"虵>shé|\\\ ;" -"虶>hán|\\\ ;" -"虷>gān|\\\ ;" -"蚇>chǐ|\\\ ;" -"蚉>wén|\\\ ;" -"蚎>cán|\\\ ;" -"蚏>yuè|\\\ ;" -"蚐>jūn|\\\ ;" -"蚒>rán|\\\ ;" -"蚖>háo|\\\ ;" -"蚗>jué|\\\ ;" -"蚘>huí|\\\ ;" -"蚙>qín|\\\ ;" -"蚠>fén|\\\ ;" -"蚡>fén|\\\ ;" -"蚦>rán|\\\ ;" -"蚳>chí|\\\ ;" -"蚴>yòu|\\\ ;" -"蚻>zhá|\\\ ;" -"蚼>gǒu|\\\ ;" -"蛂>biě|\\\ ;" -"蛅>rán|\\\ ;" -"蛈>tiè|\\\ ;" -"蛕>huí|\\\ ;" -"蛚>liè|\\\ ;" -"蛣>jié|\\\ ;" -"蛪>qiè|\\\ ;" -"蛫>guǐ|\\\ ;" -"蛶>liè|\\\ ;" -"蛷>qiú|\\\ ;" -"蛺>jiá|\\\ ;" -"蛻>tuì|\\\ ;" -"蛼>chē|\\\ ;" -"蛽>bài|\\\ ;" -"蛿>hàn|\\\ ;" -"蜏>dàn|\\\ ;" -"蜐>jié|\\\ ;" -"蜑>dàn|\\\ ;" -"蜖>huí|\\\ ;" -"蜠>jǔn|\\\ ;" -"蜦>lún|\\\ ;" -"蜨>dié|\\\ ;" -"蜪>guō|\\\ ;" -"蜫>kūn|\\\ ;" -"蜬>gān|\\\ ;" -"蜭>hàn|\\\ ;" -"蜰>féi|\\\ ;" -"蜲>wěi|\\\ ;" -"蜳>dūn|\\\ ;" -"蜹>ruì|\\\ ;" -"蜼>wěi|\\\ ;" -"蝂>bǎn|\\\ ;" -"蝅>cán|\\\ ;" -"蝐>mài|\\\ ;" -"蝔>jiē|\\\ ;" -"蝕>shí|\\\ ;" -"蝘>yǎn|\\\ ;" -"蝚>róu|\\\ ;" -"蝛>wēi|\\\ ;" -"蝞>mèi|\\\ ;" -"蝟>wèi|\\\ ;" -"蝢>jiū|\\\ ;" -"蝥>máo|\\\ ;" -"蝦>xiā|\\\ ;" -"蝧>kuí|\\\ ;" -"蝨>shī|\\\ ;" -"蝫>zhū|\\\ ;" -"蝰>huǐ|\\\ ;" -"蝱>dài|\\\ ;" -"蝵>qiū|\\\ ;" -"蝷>guǒ|\\\ ;" -"蝸>guā|\\\ ;" -"蝻>nǎn|\\\ ;" -"蝽>qǔn|\\\ ;" -"螋>pán|\\\ ;" -"螌>bān|\\\ ;" -"螑>qiù|\\\ ;" -"螒>hàn|\\\ ;" -"螖>huá|\\\ ;" -"螚>nài|\\\ ;" -"螝>huì|\\\ ;" -"螡>wén|\\\ ;" -"螤>shì|\\\ ;" -"螬>cáo|\\\ ;" -"螱>wèi|\\\ ;" -"螲>zhì|\\\ ;" -"螻>lóu|\\\ ;" -"螼>qǐn|\\\ ;" -"螾>yǐn|\\\ ;" -"蟁>wén|\\\ ;" -"蟃>wàn|\\\ ;" -"蟄>zhé|\\\ ;" -"蟈>guō|\\\ ;" -"蟎>mǎn|\\\ ;" -"蟓>fán|\\\ ;" -"蟕>zuī|\\\ ;" -"蟗>qiū|\\\ ;" -"蟙>zhí|\\\ ;" -"蟞>bié|\\\ ;" -"蟡>guǐ|\\\ ;" -"蟤>bēn|\\\ ;" -"蟦>fèi|\\\ ;" -"蟧>láo|\\\ ;" -"蟨>jué|\\\ ;" -"蟩>jué|\\\ ;" -"蟫>yín|\\\ ;" -"蟯>ráo|\\\ ;" -"蟱>móu|\\\ ;" -"蟳>xún|\\\ ;" -"蠂>shè|\\\ ;" -"蠋>zhú|\\\ ;" -"蠍>xiē|\\\ ;" -"蠔>háo|\\\ ;" -"蠘>jié|\\\ ;" -"蠙>bīn|\\\ ;" -"蠛>miè|\\\ ;" -"蠜>fán|\\\ ;" -"蠝>léi|\\\ ;" -"蠞>jié|\\\ ;" -"蠤>qiū|\\\ ;" -"蠥>niè|\\\ ;" -"蠩>zhū|\\\ ;" -"蠶>cán|\\\ ;" -"蠺>cán|\\\ ;" -"蠻>mán|\\\ ;" -"蠼>jué|\\\ ;" -"蠽>jié|\\\ ;" -"蠾>zhú|\\\ ;" -"蠿>zhá|\\\ ;" -"衂>niù|\\\ ;" -"衃>mài|\\\ ;" -"衊>miè|\\\ ;" -"衎>kàn|\\\ ;" -"術>shù|\\\ ;" -"衛>wèi|\\\ ;" -"衜>dào|\\\ ;" -"衞>wèi|\\\ ;" -"衟>dào|\\\ ;" -"衦>gǎn|\\\ ;" -"衯>fēn|\\\ ;" -"衱>jié|\\\ ;" -"衴>dǎn|\\\ ;" -"衸>xiè|\\\ ;" -"衺>qìn|\\\ ;" -"衻>rán|\\\ ;" -"衼>zhī|\\\ ;" -"袀>jūn|\\\ ;" -"袃>bào|\\\ ;" -"袆>huī|\\\ ;" -"袇>rán|\\\ ;" -"袉>tuó|\\\ ;" -"袌>bào|\\\ ;" -"袎>yào|\\\ ;" -"袏>zuò|\\\ ;" -"袕>shù|\\\ ;" -"袝>fán|\\\ ;" -"袞>gǔn|\\\ ;" -"袟>zhì|\\\ ;" -"袠>zhì|\\\ ;" -"袡>rán|\\\ ;" -"袣>móu|\\\ ;" -"袥>tuō|\\\ ;" -"袧>kōu|\\\ ;" -"袬>duǒ|\\\ ;" -"袳>chǐ|\\\ ;" -"袴>jié|\\\ ;" -"袵>rèn|\\\ ;" -"袸>cún|\\\ ;" -"袺>jié|\\\ ;" -"袾>zhū|\\\ ;" -"袿>guī|\\\ ;" -"裀>yīn|\\\ ;" -"裈>kūn|\\\ ;" -"裋>shù|\\\ ;" -"裌>jiá|\\\ ;" -"裍>kǔn|\\\ ;" -"裏>bāo|\\\ ;" -"裒>póu|\\\ ;" -"裠>qún|\\\ ;" -"裦>fóu|\\\ ;" -"裩>dāo|\\\ ;" -"裪>táo|\\\ ;" -"裭>chǐ|\\\ ;" -"裵>gǔn|\\\ ;" -"裶>fēi|\\\ ;" -"裺>yǎn|\\\ ;" -"製>zhì|\\\ ;" -"褁>zhí|\\\ ;" -"褃>kèn|\\\ ;" -"褋>dié|\\\ ;" -"褌>huī|\\\ ;" -"褎>xiù|\\\ ;" -"褏>xiù|\\\ ;" -"褗>yǎn|\\\ ;" -"褘>huī|\\\ ;" -"褞>yǔn|\\\ ;" -"褠>gōu|\\\ ;" -"褦>nài|\\\ ;" -"褨>suǒ|\\\ ;" -"褩>bān|\\\ ;" -"褯>jiè|\\\ ;" -"褷>dié|\\\ ;" -"褺>dié|\\\ ;" -"褻>xiè|\\\ ;" -"褽>wèi|\\\ ;" -"褿>cáo|\\\ ;" -"襂>sēn|\\\ ;" -"襃>bāo|\\\ ;" -"襊>zuì|\\\ ;" -"襌>dān|\\\ ;" -"襎>fán|\\\ ;" -"襑>xín|\\\ ;" -"襒>bié|\\\ ;" -"襓>ráo|\\\ ;" -"襔>mǎn|\\\ ;" -"襕>lán|\\\ ;" -"襗>duó|\\\ ;" -"襙>cào|\\\ ;" -"襚>suì|\\\ ;" -"襡>shú|\\\ ;" -"襢>tǎn|\\\ ;" -"襤>lán|\\\ ;" -"襧>zhǐ|\\\ ;" -"襩>shǔ|\\\ ;" -"襫>shì|\\\ ;" -"襬>bǎi|\\\ ;" -"襭>xié|\\\ ;" -"襰>lài|\\\ ;" -"襴>lán|\\\ ;" -"襵>zhé|\\\ ;" -"襶>dài|\\\ ;" -"襸>zàn|\\\ ;" -"襹>shī|\\\ ;" -"覎>guì|\\\ ;" -"規>guī|\\\ ;" -"覒>máo|\\\ ;" -"覕>miè|\\\ ;" -"視>shì|\\\ ;" -"覙>luó|\\\ ;" -"覚>jué|\\\ ;" -"覞>yào|\\\ ;" -"覟>zhì|\\\ ;" -"覠>jūn|\\\ ;" -"覣>wēi|\\\ ;" -"覧>lǎn|\\\ ;" -"親>qīn|\\\ ;" -"覫>jìn|\\\ ;" -"覯>gòu|\\\ ;" -"覲>jǐn|\\\ ;" -"覶>luó|\\\ ;" -"覺>jué|\\\ ;" -"覻>làn|\\\ ;" -"覼>luó|\\\ ;" -"覽>lǎn|\\\ ;" -"觃>kuī|\\\ ;" -"觓>jiū|\\\ ;" -"觔>jīn|\\\ ;" -"觗>fán|\\\ ;" -"觛>dàn|\\\ ;" -"觟>huà|\\\ ;" -"觠>jiè|\\\ ;" -"觢>chì|\\\ ;" -"觤>chù|\\\ ;" -"觧>jiě|\\\ ;" -"觨>hùn|\\\ ;" -"觩>qiú|\\\ ;" -"觶>zhì|\\\ ;" -"觷>xué|\\\ ;" -"觸>chù|\\\ ;" -"觺>yàn|\\\ ;" -"觼>jué|\\\ ;" -"觾>yàn|\\\ ;" -"訄>qiú|\\\ ;" -"訅>qiú|\\\ ;" -"訉>fàn|\\\ ;" -"訊>xùn|\\\ ;" -"訍>chà|\\\ ;" -"討>tǎo|\\\ ;" -"訐>jié|\\\ ;" -"訒>rèn|\\\ ;" -"訓>xùn|\\\ ;" -"訔>yín|\\\ ;" -"託>tuō|\\\ ;" -"訙>xùn|\\\ ;" -"訚>yín|\\\ ;" -"訜>fēn|\\\ ;" -"訞>yāo|\\\ ;" -"訠>jìn|\\\ ;" -"訡>yín|\\\ ;" -"訢>xīn|\\\ ;" -"訣>jué|\\\ ;" -"訧>yóu|\\\ ;" -"訨>zhǐ|\\\ ;" -"訫>xìn|\\\ ;" -"設>shè|\\\ ;" -"訯>shǎ|\\\ ;" -"訰>tún|\\\ ;" -"訵>chī|\\\ ;" -"註>zhù|\\\ ;" -"訽>gòu|\\\ ;" -"詀>chè|\\\ ;" -"詄>dié|\\\ ;" -"詇>dài|\\\ ;" -"詉>náo|\\\ ;" -"詊>pàn|\\\ ;" -"詌>gàn|\\\ ;" -"詐>zhà|\\\ ;" -"詑>tuó|\\\ ;" -"詜>tāo|\\\ ;" -"詝>zhǔ|\\\ ;" -"詟>zhé|\\\ ;" -"詢>xún|\\\ ;" -"試>shì|\\\ ;" -"詧>chá|\\\ ;" -"詩>shī|\\\ ;" -"詪>hěn|\\\ ;" -"詫>chà|\\\ ;" -"詬>gòu|\\\ ;" -"詭>guǐ|\\\ ;" -"詯>huì|\\\ ;" -"詰>jié|\\\ ;" -"話>huà|\\\ ;" -"該>gāi|\\\ ;" -"詴>wēi|\\\ ;" -"詷>dàn|\\\ ;" -"詺>luò|\\\ ;" -"詼>huī|\\\ ;" -"詽>yán|\\\ ;" -"詿>guà|\\\ ;" -"誃>chǐ|\\\ ;" -"誄>lěi|\\\ ;" -"誅>zhū|\\\ ;" -"誇>kuā|\\\ ;" -"誌>zhì|\\\ ;" -"認>rèn|\\\ ;" -"誕>dàn|\\\ ;" -"誘>yòu|\\\ ;" -"誛>qīn|\\\ ;" -"誡>jiè|\\\ ;" -"誥>gào|\\\ ;" -"誨>huì|\\\ ;" -"誱>jié|\\\ ;" -"誶>suì|\\\ ;" -"誹>fěi|\\\ ;" -"誺>chī|\\\ ;" -"誾>yín|\\\ ;" -"談>tán|\\\ ;" -"諉>wěi|\\\ ;" -"諏>zōu|\\\ ;" -"諔>zhù|\\\ ;" -"諕>háo|\\\ ;" -"論>lùn|\\\ ;" -"諜>dié|\\\ ;" -"諟>shì|\\\ ;" -"諡>shì|\\\ ;" -"諢>hùn|\\\ ;" -"諣>huà|\\\ ;" -"諧>xié|\\\ ;" -"諱>huì|\\\ ;" -"諲>yīn|\\\ ;" -"諵>nán|\\\ ;" -"諸>zhū|\\\ ;" -"諺>yàn|\\\ ;" -"諾>nuò|\\\ ;" -"謀>móu|\\\ ;" -"謂>wèi|\\\ ;" -"謅>zōu|\\\ ;" -"謉>kuì|\\\ ;" -"謋>huò|\\\ ;" -"謏>sǒu|\\\ ;" -"謔>nüè|\\\ ;" -"謘>chí|\\\ ;" -"謚>shì|\\\ ;" -"謝>xiè|\\\ ;" -"謞>xuè|\\\ ;" -"謠>yáo|\\\ ;" -"謡>yáo|\\\ ;" -"謫>zhé|\\\ ;" -"謬>miù|\\\ ;" -"謯>jiē|\\\ ;" -"謱>lóu|\\\ ;" -"謲>cān|\\\ ;" -"謹>jǐn|\\\ ;" -"謺>zhé|\\\ ;" -"謾>mán|\\\ ;" -"譀>hàn|\\\ ;" -"譁>huá|\\\ ;" -"譇>shē|\\\ ;" -"譈>duì|\\\ ;" -"譊>náo|\\\ ;" -"譋>lán|\\\ ;" -"譎>jué|\\\ ;" -"譐>zǔn|\\\ ;" -"譓>huì|\\\ ;" -"譖>zèn|\\\ ;" -"譗>shí|\\\ ;" -"識>shí|\\\ ;" -"譚>tán|\\\ ;" -"譛>zèn|\\\ ;" -"譟>zào|\\\ ;" -"譠>tān|\\\ ;" -"譢>suì|\\\ ;" -"譨>nóu|\\\ ;" -"譩>xià|\\\ ;" -"譭>huǐ|\\\ ;" -"譮>huà|\\\ ;" -"譳>nòu|\\\ ;" -"譹>háo|\\\ ;" -"譿>huì|\\\ ;" -"讁>shè|\\\ ;" -"讃>zàn|\\\ ;" -"讄>lěi|\\\ ;" -"讆>wèi|\\\ ;" -"讋>zhé|\\\ ;" -"讌>yàn|\\\ ;" -"讏>wèi|\\\ ;" -"讑>yào|\\\ ;" -"讔>yǐn|\\\ ;" -"讕>lán|\\\ ;" -"讗>huò|\\\ ;" -"讘>zhé|\\\ ;" -"讚>zàn|\\\ ;" -"讞>yàn|\\\ ;" -"讬>tuō|\\\ ;" -"讱>rèn|\\\ ;" -"诹>zōu|\\\ ;" -"谺>xiā|\\\ ;" -"谻>jué|\\\ ;" -"谽>hān|\\\ ;" -"豂>kǎi|\\\ ;" -"豃>hǎn|\\\ ;" -"豎>shù|\\\ ;" -"豑>zhì|\\\ ;" -"豒>zhì|\\\ ;" -"豓>yàn|\\\ ;" -"豔>yàn|\\\ ;" -"豖>chù|\\\ ;" -"豗>huī|\\\ ;" -"豘>tún|\\\ ;" -"豛>yàn|\\\ ;" -"豞>hòu|\\\ ;" -"豤>kěn|\\\ ;" -"豥>gāi|\\\ ;" -"豩>bīn|\\\ ;" -"豬>zhū|\\\ ;" -"豭>jiā|\\\ ;" -"豱>wēn|\\\ ;" -"豶>fén|\\\ ;" -"豿>gǒu|\\\ ;" -"貁>yòu|\\\ ;" -"貇>háo|\\\ ;" -"貋>hàn|\\\ ;" -"貑>jiā|\\\ ;" -"貓>māo|\\\ ;" -"貙>chū|\\\ ;" -"貚>tán|\\\ ;" -"貜>jué|\\\ ;" -"貝>bèi|\\\ ;" -"財>cái|\\\ ;" -"貦>wàn|\\\ ;" -"貧>pín|\\\ ;" -"貨>huò|\\\ ;" -"販>fàn|\\\ ;" -"貪>tān|\\\ ;" -"貭>zhì|\\\ ;" -"貯>zhǔ|\\\ ;" -"貰>shì|\\\ ;" -"貴>guì|\\\ ;" -"買>mǎi|\\\ ;" -"貸>dài|\\\ ;" -"費>fèi|\\\ ;" -"貼>tiē|\\\ ;" -"貾>chí|\\\ ;" -"貿>mào|\\\ ;" -"賁>bēn|\\\ ;" -"賃>lìn|\\\ ;" -"賄>huì|\\\ ;" -"賅>gāi|\\\ ;" -"賊>zéi|\\\ ;" -"賋>gāi|\\\ ;" -"賌>gài|\\\ ;" -"賍>shā|\\\ ;" -"賐>xùn|\\\ ;" -"賒>shē|\\\ ;" -"賓>bīn|\\\ ;" -"賔>bīn|\\\ ;" -"賕>qiú|\\\ ;" -"賖>shē|\\\ ;" -"賚>lài|\\\ ;" -"賛>zàn|\\\ ;" -"賠>péi|\\\ ;" -"賣>mài|\\\ ;" -"賥>suì|\\\ ;" -"賧>tàn|\\\ ;" -"質>zhì|\\\ ;" -"賮>jìn|\\\ ;" -"賱>yǔn|\\\ ;" -"賲>bǎo|\\\ ;" -"賳>zāi|\\\ ;" -"賴>lài|\\\ ;" -"購>gòu|\\\ ;" -"賽>sài|\\\ ;" -"贀>wèi|\\\ ;" -"贁>bài|\\\ ;" -"贄>zhì|\\\ ;" -"贇>yūn|\\\ ;" -"贉>tǎn|\\\ ;" -"贊>zàn|\\\ ;" -"贋>yàn|\\\ ;" -"贎>gàn|\\\ ;" -"贐>jìn|\\\ ;" -"贑>gǎn|\\\ ;" -"贒>shù|\\\ ;" -"贖>shú|\\\ ;" -"贗>yàn|\\\ ;" -"贛>gàn|\\\ ;" -"贜>yún|\\\ ;" -"贳>shì|\\\ ;" -"赕>tàn|\\\ ;" -"赟>yūn|\\\ ;" -"赩>shì|\\\ ;" -"赮>xiá|\\\ ;" -"赱>zǒu|\\\ ;" -"赺>qín|\\\ ;" -"赽>jué|\\\ ;" -"赾>qǐn|\\\ ;" -"赿>chí|\\\ ;" -"趃>dié|\\\ ;" -"趉>zhú|\\\ ;" -"趌>jié|\\\ ;" -"趍>chí|\\\ ;" -"趎>chú|\\\ ;" -"趏>guā|\\\ ;" -"趐>xuè|\\\ ;" -"趓>duǒ|\\\ ;" -"趕>gǎn|\\\ ;" -"趖>suō|\\\ ;" -"趛>yǐn|\\\ ;" -"趞>què|\\\ ;" -"趡>cuǐ|\\\ ;" -"趤>cǒu|\\\ ;" -"趥>qiū|\\\ ;" -"趩>chì|\\\ ;" -"趮>yuè|\\\ ;" -"趲>zǎn|\\\ ;" -"趶>guì|\\\ ;" -"趹>jué|\\\ ;" -"跀>yuè|\\\ ;" -"跅>tuò|\\\ ;" -"跉>bèi|\\\ ;" -"跊>mèi|\\\ ;" -"跍>cǎi|\\\ ;" -"跒>qiǎ|\\\ ;" -"跓>zhù|\\\ ;" -"跕>dié|\\\ ;" -"跘>pán|\\\ ;" -"跜>luò|\\\ ;" -"跢>dài|\\\ ;" -"跥>duò|\\\ ;" -"跦>zhū|\\\ ;" -"跬>kuǐ|\\\ ;" -"跭>dié|\\\ ;" -"跮>chì|\\\ ;" -"跱>zhì|\\\ ;" -"跲>jiá|\\\ ;" -"跴>cǎi|\\\ ;" -"跾>shú|\\\ ;" -"踀>chù|\\\ ;" -"踂>niè|\\\ ;" -"踆>cūn|\\\ ;" -"踈>shū|\\\ ;" -"踓>wěi|\\\ ;" -"踕>jié|\\\ ;" -"踗>niē|\\\ ;" -"踙>huà|\\\ ;" -"踚>lún|\\\ ;" -"踠>wǎn|\\\ ;" -"踨>kuí|\\\ ;" -"踲>dùn|\\\ ;" -"踻>guā|\\\ ;" -"蹅>chǎ|\\\ ;" -"蹆>tuǐ|\\\ ;" -"蹓>liù|\\\ ;" -"蹔>zàn|\\\ ;" -"蹛>dài|\\\ ;" -"蹞>kuǐ|\\\ ;" -"蹠>zhí|\\\ ;" -"蹣>pán|\\\ ;" -"蹧>zāo|\\\ ;" -"蹪>tuí|\\\ ;" -"蹮>fān|\\\ ;" -"蹷>jué|\\\ ;" -"蹸>lìn|\\\ ;" -"蹾>dūn|\\\ ;" -"躉>dǔn|\\\ ;" -"躍>yuè|\\\ ;" -"躎>luò|\\\ ;" -"躑>zhí|\\\ ;" -"躓>zhì|\\\ ;" -"躕>chú|\\\ ;" -"躗>wèi|\\\ ;" -"躙>lìn|\\\ ;" -"躛>wèi|\\\ ;" -"躝>lán|\\\ ;" -"躠>xiě|\\\ ;" -"躡>niè|\\\ ;" -"躤>jiè|\\\ ;" -"躧>lìn|\\\ ;" -"躨>kuí|\\\ ;" -"躩>jué|\\\ ;" -"躪>lìn|\\\ ;" -"躭>dān|\\\ ;" -"躱>duǒ|\\\ ;" -"躶>luǒ|\\\ ;" -"躽>yǎn|\\\ ;" -"軁>lóu|\\\ ;" -"軂>lào|\\\ ;" -"軃>tuǒ|\\\ ;" -"軇>dào|\\\ ;" -"車>chē|\\\ ;" -"軌>guǐ|\\\ ;" -"軍>jūn|\\\ ;" -"軎>wèi|\\\ ;" -"軏>yuè|\\\ ;" -"軐>xìn|\\\ ;" -"軑>dài|\\\ ;" -"軓>fàn|\\\ ;" -"軔>rèn|\\\ ;" -"軗>shū|\\\ ;" -"軘>tún|\\\ ;" -"軚>dài|\\\ ;" -"軞>máo|\\\ ;" -"軠>rèn|\\\ ;" -"軡>fǎn|\\\ ;" -"軦>bèn|\\\ ;" -"軩>dài|\\\ ;" -"軬>fàn|\\\ ;" -"軮>ǎng|\\\ ;" -"軰>bèi|\\\ ;" -"軳>páo|\\\ ;" -"軴>zhù|\\\ ;" -"軹>zhǐ|\\\ ;" -"軺>yáo|\\\ ;" -"軾>shì|\\\ ;" -"載>zǎi|\\\ ;" -"輊>zhì|\\\ ;" -"輋>shē|\\\ ;" -"輏>yóu|\\\ ;" -"輒>zhé|\\\ ;" -"輓>wǎn|\\\ ;" -"輙>zhé|\\\ ;" -"輝>huī|\\\ ;" -"輠>guǒ|\\\ ;" -"輡>kǎn|\\\ ;" -"輥>gǔn|\\\ ;" -"輩>bèi|\\\ ;" -"輪>lún|\\\ ;" -"輫>pái|\\\ ;" -"輮>róu|\\\ ;" -"輳>còu|\\\ ;" -"輶>yóu|\\\ ;" -"輸>shū|\\\ ;" -"輼>wēn|\\\ ;" -"輽>bèn|\\\ ;" -"轀>wēn|\\\ ;" -"轁>tāo|\\\ ;" -"轄>xiá|\\\ ;" -"轇>jiū|\\\ ;" -"轊>wèi|\\\ ;" -"轋>hún|\\\ ;" -"轍>chè|\\\ ;" -"轑>lǎo|\\\ ;" -"轒>fén|\\\ ;" -"轓>fān|\\\ ;" -"轔>lín|\\\ ;" -"轗>kǎn|\\\ ;" -"轙>léi|\\\ ;" -"轛>duì|\\\ ;" -"轠>lěi|\\\ ;" -"轡>pèi|\\\ ;" -"轥>lìn|\\\ ;" -"辒>wēn|\\\ ;" -"辠>bān|\\\ ;" -"辥>xuē|\\\ ;" -"辦>bàn|\\\ ;" -"辬>bān|\\\ ;" -"迀>gān|\\\ ;" -"迌>jiā|\\\ ;" -"迠>chè|\\\ ;" -"迣>zhì|\\\ ;" -"迯>mèi|\\\ ;" -"迱>tuó|\\\ ;" -"迴>huí|\\\ ;" -"迶>yòu|\\\ ;" -"迺>nǎi|\\\ ;" -"迼>jié|\\\ ;" -"迾>kuò|\\\ ;" -"迿>xùn|\\\ ;" -"逇>dùn|\\\ ;" -"逌>yóu|\\\ ;" -"逎>qiú|\\\ ;" -"逘>yàn|\\\ ;" -"這>zhè|\\\ ;" -"逤>bēn|\\\ ;" -"逥>huí|\\\ ;" -"逨>lái|\\\ ;" -"逩>bèn|\\\ ;" -"逪>cuò|\\\ ;" -"逫>jué|\\\ ;" -"逰>yóu|\\\ ;" -"進>jìn|\\\ ;" -"逽>nuò|\\\ ;" -"遀>qūn|\\\ ;" -"遃>yǎn|\\\ ;" -"遅>chí|\\\ ;" -"遈>shí|\\\ ;" -"遊>yóu|\\\ ;" -"運>yùn|\\\ ;" -"過>guò|\\\ ;" -"違>wéi|\\\ ;" -"遙>yáo|\\\ ;" -"遚>chù|\\\ ;" -"遜>xùn|\\\ ;" -"遟>chí|\\\ ;" -"適>shì|\\\ ;" -"遯>dùn|\\\ ;" -"遱>lóu|\\\ ;" -"遲>chí|\\\ ;" -"遳>cuō|\\\ ;" -"遶>rào|\\\ ;" -"遾>hái|\\\ ;" -"邁>mài|\\\ ;" -"還>hái|\\\ ;" -"邎>yáo|\\\ ;" -"邏>luó|\\\ ;" -"邠>bīn|\\\ ;" -"邤>xīn|\\\ ;" -"邨>cūn|\\\ ;" -"邩>huǒ|\\\ ;" -"邶>bèi|\\\ ;" -"邽>guī|\\\ ;" -"邾>zhū|\\\ ;" -"邿>shī|\\\ ;" -"郂>gāi|\\\ ;" -"郈>hòu|\\\ ;" -"郌>guī|\\\ ;" -"郍>nuó|\\\ ;" -"郔>yán|\\\ ;" -"郖>dōu|\\\ ;" -"郟>jiá|\\\ ;" -"郥>bèi|\\\ ;" -"郰>zōu|\\\ ;" -"郲>lái|\\\ ;" -"郵>yóu|\\\ ;" -"郿>méi|\\\ ;" -"鄀>ruò|\\\ ;" -"鄁>bèi|\\\ ;" -"鄆>yùn|\\\ ;" -"鄇>hòu|\\\ ;" -"鄈>kuí|\\\ ;" -"鄋>sōu|\\\ ;" -"鄐>chù|\\\ ;" -"鄒>zōu|\\\ ;" -"鄖>yún|\\\ ;" -"鄗>hào|\\\ ;" -"鄤>màn|\\\ ;" -"鄩>xín|\\\ ;" -"鄬>lìn|\\\ ;" -"鄮>mào|\\\ ;" -"鄰>lín|\\\ ;" -"鄲>dān|\\\ ;" -"鄳>cào|\\\ ;" -"鄵>cāo|\\\ ;" -"鄹>zōu|\\\ ;" -"鄼>zàn|\\\ ;" -"鄾>yōu|\\\ ;" -"酀>yān|\\\ ;" -"酂>zàn|\\\ ;" -"酇>zàn|\\\ ;" -"酓>yǎn|\\\ ;" -"酔>zuì|\\\ ;" -"酕>máo|\\\ ;" -"酖>dān|\\\ ;" -"酘>tóu|\\\ ;" -"酠>qiǎ|\\\ ;" -"酨>zài|\\\ ;" -"酭>yòu|\\\ ;" -"酳>yìn|\\\ ;" -"酻>zuì|\\\ ;" -"酼>hǎi|\\\ ;" -"醀>wéi|\\\ ;" -"醂>lǎn|\\\ ;" -"醃>yān|\\\ ;" -"醄>táo|\\\ ;" -"醈>tán|\\\ ;" -"醌>kūn|\\\ ;" -"醓>tǎn|\\\ ;" -"醔>jiū|\\\ ;" -"醖>yùn|\\\ ;" -"醙>sōu|\\\ ;" -"醝>cuó|\\\ ;" -"醞>yùn|\\\ ;" -"醠>àng|\\\ ;" -"醡>zhà|\\\ ;" -"醩>záo|\\\ ;" -"醰>tán|\\\ ;" -"醼>yàn|\\\ ;" -"釁>xìn|\\\ ;" -"釄>cǎi|\\\ ;" -"釅>yàn|\\\ ;" -"釈>shì|\\\ ;" -"釋>shì|\\\ ;" -"釖>dāo|\\\ ;" -"釚>qiú|\\\ ;" -"釞>zhí|\\\ ;" -"釢>nái|\\\ ;" -"釥>fǎn|\\\ ;" -"釦>kòu|\\\ ;" -"釩>fán|\\\ ;" -"釪>gān|\\\ ;" -"釫>huá|\\\ ;" -"釬>hàn|\\\ ;" -"釮>dài|\\\ ;" -"釲>chā|\\\ ;" -"釶>shé|\\\ ;" -"釾>jīn|\\\ ;" -"釿>yín|\\\ ;" -"鈄>dǒu|\\\ ;" -"鈅>yuè|\\\ ;" -"鈆>yán|\\\ ;" -"鈊>xīn|\\\ ;" -"鈌>jué|\\\ ;" -"鈍>dùn|\\\ ;" -"鈎>gōu|\\\ ;" -"鈏>yǐn|\\\ ;" -"鈑>bǎn|\\\ ;" -"鈕>niǔ|\\\ ;" -"鈖>fēn|\\\ ;" -"鈗>yǔn|\\\ ;" -"鈙>qín|\\\ ;" -"鈛>guō|\\\ ;" -"鈝>yín|\\\ ;" -"鈞>jūn|\\\ ;" -"鈟>shī|\\\ ;" -"鈢>niē|\\\ ;" -"鈣>gài|\\\ ;" -"鈥>huǒ|\\\ ;" -"鈦>tài|\\\ ;" -"鈬>duó|\\\ ;" -"鈰>shì|\\\ ;" -"鈱>mín|\\\ ;" -"鈼>zuó|\\\ ;" -"鈾>yóu|\\\ ;" -"鉀>jiǎ|\\\ ;" -"鉁>shé|\\\ ;" -"鉂>shǐ|\\\ ;" -"鉃>shì|\\\ ;" -"鉄>tiě|\\\ ;" -"鉇>shī|\\\ ;" -"鉉>páo|\\\ ;" -"鉋>bào|\\\ ;" -"鉏>chú|\\\ ;" -"鉒>zhù|\\\ ;" -"鉓>chì|\\\ ;" -"鉚>mǎo|\\\ ;" -"鉞>yuè|\\\ ;" -"鉟>gòu|\\\ ;" -"鉡>bàn|\\\ ;" -"鉣>jié|\\\ ;" -"鉤>gōu|\\\ ;" -"鉥>shù|\\\ ;" -"鉩>niē|\\\ ;" -"鉫>jiā|\\\ ;" -"鉭>dàn|\\\ ;" -"鉳>běi|\\\ ;" -"鉹>chǐ|\\\ ;" -"鉽>shì|\\\ ;" -"鉾>móu|\\\ ;" -"銀>yín|\\\ ;" -"銁>jūn|\\\ ;" -"銇>lèi|\\\ ;" -"銋>rén|\\\ ;" -"銌>zùn|\\\ ;" -"銍>zhì|\\\ ;" -"銐>chì|\\\ ;" -"銕>tiě|\\\ ;" -"銖>zhū|\\\ ;" -"銗>hóu|\\\ ;" -"銙>kuǎ|\\\ ;" -"銝>xiū|\\\ ;" -"銞>jūn|\\\ ;" -"銟>chā|\\\ ;" -"銠>lǎo|\\\ ;" -"銦>yīn|\\\ ;" -"銩>diū|\\\ ;" -"銪>yǒu|\\\ ;" -"銬>kào|\\\ ;" -"銲>hàn|\\\ ;" -"銳>ruì|\\\ ;" -"銴>shì|\\\ ;" -"銶>qiú|\\\ ;" -"銸>zhé|\\\ ;" -"銹>xiù|\\\ ;" -"銼>cuò|\\\ ;" -"銽>guā|\\\ ;" -"鋀>dòu|\\\ ;" -"鋂>méi|\\\ ;" -"鋄>wǎn|\\\ ;" -"鋅>xīn|\\\ ;" -"鋆>yún|\\\ ;" -"鋇>bèi|\\\ ;" -"鋎>hàn|\\\ ;" -"鋏>jiá|\\\ ;" -"鋔>wǎn|\\\ ;" -"鋕>zhì|\\\ ;" -"鋚>jìn|\\\ ;" -"鋝>lüè|\\\ ;" -"鋡>hán|\\\ ;" -"鋢>lüè|\\\ ;" -"鋣>xié|\\\ ;" -"鋤>chú|\\\ ;" -"鋫>duì|\\\ ;" -"鋬>pàn|\\\ ;" -"鋭>ruì|\\\ ;" -"鋯>gào|\\\ ;" -"鋳>zhù|\\\ ;" -"鋶>liǔ|\\\ ;" -"鋷>zuì|\\\ ;" -"鋾>táo|\\\ ;" -"錀>lún|\\\ ;" -"錃>bēi|\\\ ;" -"錇>póu|\\\ ;" -"錉>mín|\\\ ;" -"錊>zuì|\\\ ;" -"錑>lèi|\\\ ;" -"錓>gǔn|\\\ ;" -"錕>kūn|\\\ ;" -"錗>wèi|\\\ ;" -"錛>bēn|\\\ ;" -"錜>niē|\\\ ;" -"錟>tán|\\\ ;" -"錦>jǐn|\\\ ;" -"錨>máo|\\\ ;" -"錭>táo|\\\ ;" -"錯>cuò|\\\ ;" -"錵>huā|\\\ ;" -"錸>lái|\\\ ;" -"錹>kěn|\\\ ;" -"錼>nài|\\\ ;" -"錽>wǎn|\\\ ;" -"鍃>huō|\\\ ;" -"鍄>jiē|\\\ ;" -"鍆>mén|\\\ ;" -"鍇>kǎi|\\\ ;" -"鍈>chí|\\\ ;" -"鍋>guō|\\\ ;" -"鍏>wéi|\\\ ;" -"鍒>róu|\\\ ;" -"鍕>róu|\\\ ;" -"鍘>zhá|\\\ ;" -"鍜>xiā|\\\ ;" -"鍝>chā|\\\ ;" -"鍡>wěi|\\\ ;" -"鍤>chá|\\\ ;" -"鍥>qiè|\\\ ;" -"鍦>shé|\\\ ;" -"鍨>kuí|\\\ ;" -"鍭>hóu|\\\ ;" -"鍮>tōu|\\\ ;" -"鍲>mín|\\\ ;" -"鍺>zhě|\\\ ;" -"鍻>jié|\\\ ;" -"鎀>xiū|\\\ ;" -"鎂>měi|\\\ ;" -"鎃>pài|\\\ ;" -"鎅>jiè|\\\ ;" -"鎇>méi|\\\ ;" -"鎋>xiá|\\\ ;" -"鎍>suǒ|\\\ ;" -"鎒>nòu|\\\ ;" -"鎖>suǒ|\\\ ;" -"鎜>pán|\\\ ;" -"鎦>liú|\\\ ;" -"鎧>kǎi|\\\ ;" -"鎨>sǔn|\\\ ;" -"鎩>shā|\\\ ;" -"鎫>wàn|\\\ ;" -"鎬>gǎo|\\\ ;" -"鎳>niè|\\\ ;" -"鎵>jiā|\\\ ;" -"鎻>suǒ|\\\ ;" -"鏁>suǒ|\\\ ;" -"鏅>xiū|\\\ ;" -"鏍>luó|\\\ ;" -"鏏>wèi|\\\ ;" -"鏐>liú|\\\ ;" -"鏙>cuī|\\\ ;" -"鏝>màn|\\\ ;" -"鏣>shù|\\\ ;" -"鏤>lòu|\\\ ;" -"鏨>zàn|\\\ ;" -"鏪>cáo|\\\ ;" -"鏬>xià|\\\ ;" -"鏵>huá|\\\ ;" -"鏸>huì|\\\ ;" -"鏻>lín|\\\ ;" -"鏼>suǒ|\\\ ;" -"鏽>xiù|\\\ ;" -"鏾>sǎn|\\\ ;" -"鐀>kuì|\\\ ;" -"鐁>liú|\\\ ;" -"鐂>liù|\\\ ;" -"鐃>náo|\\\ ;" -"鐅>piě|\\\ ;" -"鐆>suì|\\\ ;" -"鐇>fán|\\\ ;" -"鐍>jué|\\\ ;" -"鐏>zūn|\\\ ;" -"鐑>duī|\\\ ;" -"鐒>láo|\\\ ;" -"鐓>dūn|\\\ ;" -"鐔>tán|\\\ ;" -"鐜>duì|\\\ ;" -"鐝>jué|\\\ ;" -"鐞>nòu|\\\ ;" -"鐡>tiě|\\\ ;" -"鐦>kāi|\\\ ;" -"鐨>fèi|\\\ ;" -"鐩>suì|\\\ ;" -"鐬>huì|\\\ ;" -"鐳>léi|\\\ ;" -"鐵>tiě|\\\ ;" -"鐸>duó|\\\ ;" -"鐹>guǒ|\\\ ;" -"鐼>bēn|\\\ ;" -"鐾>bèi|\\\ ;" -"鑂>xùn|\\\ ;" -"鑄>zhù|\\\ ;" -"鑈>niē|\\\ ;" -"鑊>huò|\\\ ;" -"鑌>bīn|\\\ ;" -"鑎>kuì|\\\ ;" -"鑔>chǎ|\\\ ;" -"鑕>zhì|\\\ ;" -"鑖>miè|\\\ ;" -"鑘>léi|\\\ ;" -"鑤>bào|\\\ ;" -"鑭>lán|\\\ ;" -"鑰>yào|\\\ ;" -"鑳>huī|\\\ ;" -"鑷>niè|\\\ ;" -"鑸>lěi|\\\ ;" -"鑻>pàn|\\\ ;" -"鑼>luó|\\\ ;" -"鑿>záo|\\\ ;" -"钀>niè|\\\ ;" -"钁>jué|\\\ ;" -"钃>shǔ|\\\ ;" -"钬>huó|\\\ ;" -"铇>bào|\\\ ;" -"铑>lǎo|\\\ ;" -"铚>zhì|\\\ ;" -"铥>diū|\\\ ;" -"铪>jiá|\\\ ;" -"铼>lái|\\\ ;" -"锆>gào|\\\ ;" -"锊>lüè|\\\ ;" -"锍>liǔ|\\\ ;" -"锘>nuò|\\\ ;" -"锧>zhì|\\\ ;" -"锪>huō|\\\ ;" -"锫>péi|\\\ ;" -"锬>tán|\\\ ;" -"锼>sōu|\\\ ;" -"镠>liú|\\\ ;" -"镡>tán|\\\ ;" -"镦>duì|\\\ ;" -"镹>jiǔ|\\\ ;" -"镻>dié|\\\ ;" -"門>mén|\\\ ;" -"閄>huò|\\\ ;" -"閅>mén|\\\ ;" -"閆>yán|\\\ ;" -"閈>hàn|\\\ ;" -"開>kāi|\\\ ;" -"閏>rùn|\\\ ;" -"閐>sàn|\\\ ;" -"閔>mǐn|\\\ ;" -"閕>xiā|\\\ ;" -"閗>dòu|\\\ ;" -"閘>zhá|\\\ ;" -"閙>nào|\\\ ;" -"閜>xiǎ|\\\ ;" -"閠>rùn|\\\ ;" -"閦>chù|\\\ ;" -"閨>guī|\\\ ;" -"閩>mǐn|\\\ ;" -"閫>kǔn|\\\ ;" -"閯>shà|\\\ ;" -"閱>yuè|\\\ ;" -"閲>yuè|\\\ ;" -"閵>lìn|\\\ ;" -"閷>shā|\\\ ;" -"閸>kǔn|\\\ ;" -"閹>yān|\\\ ;" -"閺>wén|\\\ ;" -"閻>yán|\\\ ;" -"閽>hūn|\\\ ;" -"閿>wén|\\\ ;" -"闁>bāo|\\\ ;" -"闄>yǎo|\\\ ;" -"闅>wén|\\\ ;" -"闆>bǎn|\\\ ;" -"闈>wéi|\\\ ;" -"闉>yīn|\\\ ;" -"闊>kuò|\\\ ;" -"闋>què|\\\ ;" -"闌>lán|\\\ ;" -"闑>niè|\\\ ;" -"闓>kǎi|\\\ ;" -"闕>quē|\\\ ;" -"闘>dòu|\\\ ;" -"闚>kuī|\\\ ;" -"闞>kàn|\\\ ;" -"闠>huì|\\\ ;" -"闦>wén|\\\ ;" -"闬>hàn|\\\ ;" -"闿>kǎi|\\\ ;" -"阓>huì|\\\ ;" -"阠>wèi|\\\ ;" -"阤>tuó|\\\ ;" -"阧>dǒu|\\\ ;" -"阩>pēi|\\\ ;" -"阫>péi|\\\ ;" -"阯>zhǐ|\\\ ;" -"阼>zuò|\\\ ;" -"陁>tuó|\\\ ;" -"陊>duò|\\\ ;" -"陎>shū|\\\ ;" -"陏>duò|\\\ ;" -"陒>guǐ|\\\ ;" -"陖>xùn|\\\ ;" -"陫>péi|\\\ ;" -"陬>zōu|\\\ ;" -"陯>lún|\\\ ;" -"陰>yīn|\\\ ;" -"陻>yīn|\\\ ;" -"陼>zhǔ|\\\ ;" -"隁>yàn|\\\ ;" -"隂>yīn|\\\ ;" -"隇>suì|\\\ ;" -"隉>niè|\\\ ;" -"隊>duì|\\\ ;" -"階>jiē|\\\ ;" -"隑>gāi|\\\ ;" -"隓>huī|\\\ ;" -"隕>yǔn|\\\ ;" -"隖>guī|\\\ ;" -"隝>dǎo|\\\ ;" -"隠>yǐn|\\\ ;" -"隢>rào|\\\ ;" -"隣>lín|\\\ ;" -"隤>tuí|\\\ ;" -"隨>suí|\\\ ;" -"隫>fēn|\\\ ;" -"隯>dǎo|\\\ ;" -"隱>yǐn|\\\ ;" -"隲>dài|\\\ ;" -"隷>cuī|\\\ ;" -"隻>zhī|\\\ ;" -"雂>qín|\\\ ;" -"雊>gòu|\\\ ;" -"雋>jùn|\\\ ;" -"雖>suī|\\\ ;" -"雗>hàn|\\\ ;" -"雘>huò|\\\ ;" -"雛>chú|\\\ ;" -"雡>liù|\\\ ;" -"難>nán|\\\ ;" -"雤>xué|\\\ ;" -"雬>fǒu|\\\ ;" -"雰>fēn|\\\ ;" -"雲>yún|\\\ ;" -"雵>ǎng|\\\ ;" -"霅>zhá|\\\ ;" -"霒>yīn|\\\ ;" -"霕>tún|\\\ ;" -"霠>yīn|\\\ ;" -"霣>yǔn|\\\ ;" -"霤>liù|\\\ ;" -"霦>bīn|\\\ ;" -"霨>wèi|\\\ ;" -"霩>huò|\\\ ;" -"霮>dàn|\\\ ;" -"霴>dài|\\\ ;" -"霺>wéi|\\\ ;" -"靀>lèi|\\\ ;" -"靁>léi|\\\ ;" -"靃>huò|\\\ ;" -"靅>fèi|\\\ ;" -"靆>dài|\\\ ;" -"靌>bǎo|\\\ ;" -"靟>fēi|\\\ ;" -"靤>pào|\\\ ;" -"靧>huì|\\\ ;" -"靫>chā|\\\ ;" -"靭>rèn|\\\ ;" -"靱>rèn|\\\ ;" -"靲>qín|\\\ ;" -"靵>niǔ|\\\ ;" -"靷>yǐn|\\\ ;" -"靽>bàn|\\\ ;" -"靿>bèi|\\\ ;" -"鞀>táo|\\\ ;" -"鞁>tuó|\\\ ;" -"鞂>bào|\\\ ;" -"鞄>páo|\\\ ;" -"鞈>jiá|\\\ ;" -"鞉>táo|\\\ ;" -"鞎>hén|\\\ ;" -"鞔>wǎn|\\\ ;" -"鞖>suī|\\\ ;" -"鞡>ēng|\\\ ;" -"鞢>xiè|\\\ ;" -"鞦>qiū|\\\ ;" -"鞧>qiū|\\\ ;" -"鞩>móu|\\\ ;" -"鞱>tāo|\\\ ;" -"鞲>gōu|\\\ ;" -"鞴>bèi|\\\ ;" -"鞶>pán|\\\ ;" -"鞹>kuò|\\\ ;" -"鞻>lóu|\\\ ;" -"鞼>guì|\\\ ;" -"鞾>xuē|\\\ ;" -"韊>lán|\\\ ;" -"韋>wéi|\\\ ;" -"韌>rèn|\\\ ;" -"韎>mèi|\\\ ;" -"韑>wěi|\\\ ;" -"韓>hán|\\\ ;" -"韖>róu|\\\ ;" -"韗>xùn|\\\ ;" -"韘>shè|\\\ ;" -"韙>wěi|\\\ ;" -"韛>bèi|\\\ ;" -"韜>tāo|\\\ ;" -"韝>gōu|\\\ ;" -"韞>yùn|\\\ ;" -"韡>wěi|\\\ ;" -"韢>huì|\\\ ;" -"韮>jiǔ|\\\ ;" -"韰>xiè|\\\ ;" -"韻>yùn|\\\ ;" -"韽>yīn|\\\ ;" -"韾>huò|\\\ ;" -"頄>qiú|\\\ ;" -"頇>hān|\\\ ;" -"頍>kuǐ|\\\ ;" -"頑>wán|\\\ ;" -"頒>bān|\\\ ;" -"頓>dùn|\\\ ;" -"頕>dān|\\\ ;" -"頖>pàn|\\\ ;" -"頛>lěi|\\\ ;" -"頝>jiá|\\\ ;" -"頠>wěi|\\\ ;" -"頡>xié|\\\ ;" -"頢>guā|\\\ ;" -"頧>duī|\\\ ;" -"頪>lèi|\\\ ;" -"頬>jiá|\\\ ;" -"頭>tóu|\\\ ;" -"頮>huì|\\\ ;" -"頯>kuí|\\\ ;" -"頰>jiá|\\\ ;" -"頵>jūn|\\\ ;" -"頷>hàn|\\\ ;" -"頹>tuí|\\\ ;" -"頺>tuí|\\\ ;" -"頻>pín|\\\ ;" -"頽>tuí|\\\ ;" -"顂>lài|\\\ ;" -"顃>yán|\\\ ;" -"顄>hàn|\\\ ;" -"顇>cuì|\\\ ;" -"顉>qīn|\\\ ;" -"顋>sāi|\\\ ;" -"顏>yán|\\\ ;" -"顐>hún|\\\ ;" -"顑>kǎn|\\\ ;" -"顔>yán|\\\ ;" -"顖>xìn|\\\ ;" -"類>lèi|\\\ ;" -"顡>mān|\\\ ;" -"顢>mān|\\\ ;" -"顤>qīn|\\\ ;" -"顥>hào|\\\ ;" -"顨>xùn|\\\ ;" -"顪>huī|\\\ ;" -"顬>kuǐ|\\\ ;" -"顮>bīn|\\\ ;" -"顰>pín|\\\ ;" -"顲>lǎn|\\\ ;" -"顳>niè|\\\ ;" -"颒>huì|\\\ ;" -"颙>mān|\\\ ;" -"颣>lèi|\\\ ;" -"颬>xiā|\\\ ;" -"颱>tái|\\\ ;" -"颲>liè|\\\ ;" -"颳>guā|\\\ ;" -"颹>wěi|\\\ ;" -"颻>yáo|\\\ ;" -"颼>sōu|\\\ ;" -"颽>kǎi|\\\ ;" -"颾>sāo|\\\ ;" -"颿>fán|\\\ ;" -"飀>liú|\\\ ;" -"飅>liú|\\\ ;" -"飖>yáo|\\\ ;" -"飗>liú|\\\ ;" -"飛>fēi|\\\ ;" -"飜>fān|\\\ ;" -"飝>fēi|\\\ ;" -"飠>shí|\\\ ;" -"飡>cān|\\\ ;" -"飥>tuō|\\\ ;" -"飩>tún|\\\ ;" -"飪>rèn|\\\ ;" -"飭>chì|\\\ ;" -"飮>yǐn|\\\ ;" -"飯>fàn|\\\ ;" -"飰>fàn|\\\ ;" -"飱>sūn|\\\ ;" -"飲>yǐn|\\\ ;" -"飷>jiě|\\\ ;" -"飸>tāo|\\\ ;" -"飹>liǔ|\\\ ;" -"飻>tiè|\\\ ;" -"飽>bǎo|\\\ ;" -"飾>shì|\\\ ;" -"飿>duò|\\\ ;" -"餀>hài|\\\ ;" -"餁>rèn|\\\ ;" -"餆>yáo|\\\ ;" -"餋>sùn|\\\ ;" -"餒>něi|\\\ ;" -"餕>jùn|\\\ ;" -"餖>dòu|\\\ ;" -"餙>kūn|\\\ ;" -"餚>yáo|\\\ ;" -"餛>hún|\\\ ;" -"餜>guǒ|\\\ ;" -"餝>shì|\\\ ;" -"餤>tán|\\\ ;" -"餥>fěi|\\\ ;" -"餧>wèi|\\\ ;" -"餫>hún|\\\ ;" -"餯>huì|\\\ ;" -"餱>hóu|\\\ ;" -"餴>fēn|\\\ ;" -"餵>wèi|\\\ ;" -"餷>chā|\\\ ;" -"餻>gāo|\\\ ;" -"餽>kuì|\\\ ;" -"餾>liù|\\\ ;" -"餿>sōu|\\\ ;" -"饀>táo|\\\ ;" -"饂>yún|\\\ ;" -"饅>mán|\\\ ;" -"饈>xiū|\\\ ;" -"饉>jǐn|\\\ ;" -"饊>sǎn|\\\ ;" -"饋>kuì|\\\ ;" -"饎>chì|\\\ ;" -"饏>dàn|\\\ ;" -"饒>ráo|\\\ ;" -"饖>huì|\\\ ;" -"饙>fēn|\\\ ;" -"饚>hài|\\\ ;" -"饜>yàn|\\\ ;" -"饠>luó|\\\ ;" -"饦>tuō|\\\ ;" -"饳>duò|\\\ ;" -"饸>jiá|\\\ ;" -"饾>dòu|\\\ ;" -"馂>jùn|\\\ ;" -"馃>guǒ|\\\ ;" -"馘>guó|\\\ ;" -"馚>fén|\\\ ;" -"馠>hān|\\\ ;" -"馡>fēi|\\\ ;" -"馣>yǎn|\\\ ;" -"馧>wēn|\\\ ;" -"馩>fén|\\\ ;" -"馪>bīn|\\\ ;" -"馯>hán|\\\ ;" -"馰>dài|\\\ ;" -"馱>duò|\\\ ;" -"馲>tuō|\\\ ;" -"馳>chí|\\\ ;" -"馴>xún|\\\ ;" -"馵>zhù|\\\ ;" -"馶>zhī|\\\ ;" -"馷>pèi|\\\ ;" -"馸>xìn|\\\ ;" -"馻>yǐn|\\\ ;" -"馼>wén|\\\ ;" -"馽>zhí|\\\ ;" -"馾>dàn|\\\ ;" -"駀>yóu|\\\ ;" -"駂>bǎo|\\\ ;" -"駐>zhù|\\\ ;" -"駕>jià|\\\ ;" -"駖>dài|\\\ ;" -"駘>tái|\\\ ;" -"駛>shǐ|\\\ ;" -"駝>tuó|\\\ ;" -"駞>tuó|\\\ ;" -"駠>liú|\\\ ;" -"駣>táo|\\\ ;" -"駤>zhì|\\\ ;" -"駦>jià|\\\ ;" -"駨>xún|\\\ ;" -"駭>hài|\\\ ;" -"駯>zhū|\\\ ;" -"駰>yīn|\\\ ;" -"駱>luò|\\\ ;" -"駳>dàn|\\\ ;" -"駴>xiè|\\\ ;" -"駵>liú|\\\ ;" -"駸>qīn|\\\ ;" -"駻>hàn|\\\ ;" -"駾>tuì|\\\ ;" -"駿>jùn|\\\ ;" -"騇>shě|\\\ ;" -"騉>kūn|\\\ ;" -"騊>táo|\\\ ;" -"騋>lái|\\\ ;" -"騐>yàn|\\\ ;" -"騑>fēi|\\\ ;" -"騒>sāo|\\\ ;" -"験>yǎn|\\\ ;" -"騔>jié|\\\ ;" -"騕>yǎo|\\\ ;" -"騛>fēi|\\\ ;" -"騞>huò|\\\ ;" -"騟>guī|\\\ ;" -"騢>xiá|\\\ ;" -"騤>kuí|\\\ ;" -"騥>róu|\\\ ;" -"騧>guā|\\\ ;" -"騨>tuó|\\\ ;" -"騩>kuì|\\\ ;" -"騪>sōu|\\\ ;" -"騭>zhì|\\\ ;" -"騮>liú|\\\ ;" -"騲>cǎo|\\\ ;" -"騴>yàn|\\\ ;" -"騶>zōu|\\\ ;" -"騷>sāo|\\\ ;" -"騾>luó|\\\ ;" -"驂>cān|\\\ ;" -"驇>zhì|\\\ ;" -"驊>huá|\\\ ;" -"驎>lín|\\\ ;" -"驑>liú|\\\ ;" -"驒>tuó|\\\ ;" -"驔>tán|\\\ ;" -"驖>tiě|\\\ ;" -"驗>yàn|\\\ ;" -"驘>luó|\\\ ;" -"驝>tuō|\\\ ;" -"驞>bīn|\\\ ;" -"驟>zòu|\\\ ;" -"驠>chí|\\\ ;" -"骃>yīn|\\\ ;" -"骍>xīn|\\\ ;" -"骎>qīn|\\\ ;" -"骙>kuí|\\\ ;" -"骪>wěi|\\\ ;" -"骫>wěi|\\\ ;" -"骭>gàn|\\\ ;" -"骯>āng|\\\ ;" -"骲>bāo|\\\ ;" -"骴>chī|\\\ ;" -"骻>kuà|\\\ ;" -"骽>tuǐ|\\\ ;" -"髄>suǐ|\\\ ;" -"髏>lóu|\\\ ;" -"髐>náo|\\\ ;" -"髕>bìn|\\\ ;" -"髙>gāo|\\\ ;" -"髛>kāo|\\\ ;" -"髝>lào|\\\ ;" -"髞>zào|\\\ ;" -"髤>xiū|\\\ ;" -"髥>rán|\\\ ;" -"髧>dàn|\\\ ;" -"髨>kūn|\\\ ;" -"髩>bìn|\\\ ;" -"髱>pào|\\\ ;" -"髳>máo|\\\ ;" -"髺>guà|\\\ ;" -"髿>shā|\\\ ;" -"鬂>bìn|\\\ ;" -"鬌>duǒ|\\\ ;" -"鬖>sān|\\\ ;" -"鬗>màn|\\\ ;" -"鬘>mán|\\\ ;" -"鬛>liè|\\\ ;" -"鬢>bìn|\\\ ;" -"鬥>dòu|\\\ ;" -"鬦>dòu|\\\ ;" -"鬧>nào|\\\ ;" -"鬪>dòu|\\\ ;" -"鬫>hǎn|\\\ ;" -"鬬>dòu|\\\ ;" -"鬭>dòu|\\\ ;" -"鬮>jiū|\\\ ;" -"鬶>guī|\\\ ;" -"鬸>liù|\\\ ;" -"鬹>guī|\\\ ;" -"鬽>mèi|\\\ ;" -"魀>jiè|\\\ ;" -"魋>tuí|\\\ ;" -"魘>yǎn|\\\ ;" -"魛>dāo|\\\ ;" -"魜>rén|\\\ ;" -"魠>tuō|\\\ ;" -"魤>bǎn|\\\ ;" -"魦>shā|\\\ ;" -"魨>tún|\\\ ;" -"魪>jiè|\\\ ;" -"魬>fǎn|\\\ ;" -"魭>wǎn|\\\ ;" -"魰>wén|\\\ ;" -"魵>fén|\\\ ;" -"魷>yóu|\\\ ;" -"魻>xiá|\\\ ;" -"魽>hān|\\\ ;" -"鮀>tuó|\\\ ;" -"鮇>wèi|\\\ ;" -"鮌>gǔn|\\\ ;" -"鮎>bāo|\\\ ;" -"鮐>tái|\\\ ;" -"鮑>bào|\\\ ;" -"鮓>zhǎ|\\\ ;" -"鮚>jié|\\\ ;" -"鮛>shū|\\\ ;" -"鮜>hòu|\\\ ;" -"鮠>wéi|\\\ ;" -"鮣>yìn|\\\ ;" -"鮤>liè|\\\ ;" -"鮥>luò|\\\ ;" -"鮪>wěi|\\\ ;" -"鮭>guī|\\\ ;" -"鮰>huí|\\\ ;" -"鮳>kǎo|\\\ ;" -"鮵>duó|\\\ ;" -"鮶>jūn|\\\ ;" -"鮻>shā|\\\ ;" -"鮼>qīn|\\\ ;" -"鮾>něi|\\\ ;" -"鮿>zhé|\\\ ;" -"鯀>gǔn|\\\ ;" -"鯄>qiú|\\\ ;" -"鯊>shā|\\\ ;" -"鯋>shā|\\\ ;" -"鯌>gào|\\\ ;" -"鯘>něi|\\\ ;" -"鯜>qiè|\\\ ;" -"鯠>lái|\\\ ;" -"鯡>fēi|\\\ ;" -"鯤>kūn|\\\ ;" -"鯦>jiù|\\\ ;" -"鯫>zōu|\\\ ;" -"鯯>zhì|\\\ ;" -"鯴>shī|\\\ ;" -"鯶>hǔn|\\\ ;" -"鯷>shì|\\\ ;" -"鯸>hóu|\\\ ;" -"鯺>zéi|\\\ ;" -"鰃>wēi|\\\ ;" -"鰄>wēi|\\\ ;" -"鰇>qiè|\\\ ;" -"鰈>dié|\\\ ;" -"鰋>yǎn|\\\ ;" -"鰌>qiú|\\\ ;" -"鰍>qiū|\\\ ;" -"鰓>sāi|\\\ ;" -"鰕>xiá|\\\ ;" -"鰖>tuǒ|\\\ ;" -"鰙>ruò|\\\ ;" -"鰛>wēn|\\\ ;" -"鰝>hào|\\\ ;" -"鰡>liú|\\\ ;" -"鰣>shí|\\\ ;" -"鰤>shī|\\\ ;" -"鰧>dié|\\\ ;" -"鰩>yáo|\\\ ;" -"鰬>cān|\\\ ;" -"鰮>wēn|\\\ ;" -"鰯>ruò|\\\ ;" -"鰴>huī|\\\ ;" -"鰵>mǐn|\\\ ;" -"鰺>sāo|\\\ ;" -"鰻>mán|\\\ ;" -"鰽>qiú|\\\ ;" -"鱁>zhú|\\\ ;" -"鱃>qiū|\\\ ;" -"鱈>xuě|\\\ ;" -"鱉>biē|\\\ ;" -"鱊>jué|\\\ ;" -"鱏>xún|\\\ ;" -"鱒>zùn|\\\ ;" -"鱕>fān|\\\ ;" -"鱖>guì|\\\ ;" -"鱗>lín|\\\ ;" -"鱘>xún|\\\ ;" -"鱝>fèn|\\\ ;" -"鱟>hòu|\\\ ;" -"鱡>zéi|\\\ ;" -"鱢>sāo|\\\ ;" -"鱤>gǎn|\\\ ;" -"鱥>guì|\\\ ;" -"鱯>huò|\\\ ;" -"鱲>liè|\\\ ;" -"鱴>miè|\\\ ;" -"鱽>dāo|\\\ ;" -"鲀>tún|\\\ ;" -"鲉>yóu|\\\ ;" -"鲊>zhǎ|\\\ ;" -"鲎>hòu|\\\ ;" -"鲓>kǎo|\\\ ;" -"鲘>hòu|\\\ ;" -"鲪>jūn|\\\ ;" -"鲰>zōu|\\\ ;" -"鲺>shī|\\\ ;" -"鲼>fèn|\\\ ;" -"鳀>shì|\\\ ;" -"鳁>wēn|\\\ ;" -"鳂>wēi|\\\ ;" -"鳋>sāo|\\\ ;" -"鳐>yáo|\\\ ;" -"鳚>guì|\\\ ;" -"鳡>gǎn|\\\ ;" -"鳤>dǎo|\\\ ;" -"鳩>jiū|\\\ ;" -"鳫>yàn|\\\ ;" -"鳮>hàn|\\\ ;" -"鳱>gān|\\\ ;" -"鳲>shī|\\\ ;" -"鳵>bǎo|\\\ ;" -"鳷>zhī|\\\ ;" -"鳹>qín|\\\ ;" -"鳻>fēn|\\\ ;" -"鳼>wén|\\\ ;" -"鳾>shī|\\\ ;" -"鴀>fǒu|\\\ ;" -"鴁>jué|\\\ ;" -"鴂>juè|\\\ ;" -"鴃>jué|\\\ ;" -"鴇>bǎo|\\\ ;" -"鴈>yàn|\\\ ;" -"鴊>jiā|\\\ ;" -"鴍>wén|\\\ ;" -"鴐>jiā|\\\ ;" -"鴓>miè|\\\ ;" -"鴕>tuó|\\\ ;" -"鴖>wén|\\\ ;" -"鴙>zhì|\\\ ;" -"鴟>chī|\\\ ;" -"鴠>dàn|\\\ ;" -"鴢>yòu|\\\ ;" -"鴩>tiě|\\\ ;" -"鴰>guā|\\\ ;" -"鴲>zhī|\\\ ;" -"鴳>yàn|\\\ ;" -"鴷>liè|\\\ ;" -"鴸>zhū|\\\ ;" -"鴹>rén|\\\ ;" -"鴼>luò|\\\ ;" -"鴾>móu|\\\ ;" -"鵀>rèn|\\\ ;" -"鵂>xiū|\\\ ;" -"鵄>chī|\\\ ;" -"鵅>luò|\\\ ;" -"鵊>jiá|\\\ ;" -"鵎>tuǒ|\\\ ;" -"鵐>jùn|\\\ ;" -"鵔>xùn|\\\ ;" -"鵘>jùn|\\\ ;" -"鵣>lài|\\\ ;" -"鵨>shū|\\\ ;" -"鵭>duò|\\\ ;" -"鵯>bēi|\\\ ;" -"鵲>què|\\\ ;" -"鵾>kūn|\\\ ;" -"鶆>lái|\\\ ;" -"鶐>shù|\\\ ;" -"鶒>chì|\\\ ;" -"鶔>róu|\\\ ;" -"鶖>qiū|\\\ ;" -"鶛>jiē|\\\ ;" -"鶜>máo|\\\ ;" -"鶠>yǎn|\\\ ;" -"鶢>kūn|\\\ ;" -"鶤>yùn|\\\ ;" -"鶥>méi|\\\ ;" -"鶨>dùn|\\\ ;" -"鶳>shī|\\\ ;" -"鶵>chú|\\\ ;" -"鶷>xià|\\\ ;" -"鶸>ruò|\\\ ;" -"鶹>liú|\\\ ;" -"鶽>sǔn|\\\ ;" -"鷂>yào|\\\ ;" -"鷃>yàn|\\\ ;" -"鷇>kòu|\\\ ;" -"鷎>gāo|\\\ ;" -"鷓>zhè|\\\ ;" -"鷕>yǎo|\\\ ;" -"鷘>chì|\\\ ;" -"鷙>zhì|\\\ ;" -"鷜>lóu|\\\ ;" -"鷢>jué|\\\ ;" -"鷣>yín|\\\ ;" -"鷨>huā|\\\ ;" -"鷪>yān|\\\ ;" -"鷭>fán|\\\ ;" -"鷰>yàn|\\\ ;" -"鷱>kāo|\\\ ;" -"鷲>jiù|\\\ ;" -"鷶>mǎi|\\\ ;" -"鷷>zūn|\\\ ;" -"鷽>xué|\\\ ;" -"鸀>shú|\\\ ;" -"鸁>luó|\\\ ;" -"鸅>zhé|\\\ ;" -"鸌>huò|\\\ ;" -"鸑>yuè|\\\ ;" -"鸓>lěi|\\\ ;" -"鸔>bào|\\\ ;" -"鸙>yuè|\\\ ;" -"鸤>shī|\\\ ;" -"鸴>xué|\\\ ;" -"鸺>xiū|\\\ ;" -"鹍>kūn|\\\ ;" -"鹎>bēi|\\\ ;" -"鹛>méi|\\\ ;" -"鹠>liú|\\\ ;" -"鹱>huò|\\\ ;" -"鹶>jīn|\\\ ;" -"鹺>cuó|\\\ ;" -"鹽>yán|\\\ ;" -"鹾>cuó|\\\ ;" -"麀>yōu|\\\ ;" -"麆>chú|\\\ ;" -"麍>liú|\\\ ;" -"麏>jūn|\\\ ;" -"麐>lín|\\\ ;" -"麔>jiù|\\\ ;" -"麕>jūn|\\\ ;" -"麙>yán|\\\ ;" -"麚>jiā|\\\ ;" -"麣>yán|\\\ ;" -"麥>mài|\\\ ;" -"麭>pào|\\\ ;" -"麰>móu|\\\ ;" -"麳>lái|\\\ ;" -"黀>zōu|\\\ ;" -"黁>nēn|\\\ ;" -"黂>fén|\\\ ;" -"黅>jīn|\\\ ;" -"黈>tǒu|\\\ ;" -"黐>chī|\\\ ;" -"黒>hēi|\\\ ;" -"黕>dān|\\\ ;" -"黡>yǎn|\\\ ;" -"黣>měi|\\\ ;" -"黤>yǎn|\\\ ;" -"黪>cǎn|\\\ ;" -"黫>yīn|\\\ ;" -"黭>yān|\\\ ;" -"黮>dǎn|\\\ ;" -"黱>dài|\\\ ;" -"黲>cǎn|\\\ ;" -"黴>méi|\\\ ;" -"黵>dǎn|\\\ ;" -"黶>yǎn|\\\ ;" -"黹>zhǐ|\\\ ;" -"黺>fěn|\\\ ;" -"黽>mǐn|\\\ ;" -"鼄>zhū|\\\ ;" -"鼅>zhī|\\\ ;" -"鼈>biē|\\\ ;" -"鼉>tuó|\\\ ;" -"鼖>fén|\\\ ;" -"鼗>táo|\\\ ;" -"鼛>gāo|\\\ ;" -"鼡>shǔ|\\\ ;" -"鼣>fèi|\\\ ;" -"鼤>wén|\\\ ;" -"鼧>tuó|\\\ ;" -"鼫>shí|\\\ ;" -"鼭>shí|\\\ ;" -"鼲>hún|\\\ ;" -"鼴>yǎn|\\\ ;" -"鼸>hōu|\\\ ;" -"鼺>léi|\\\ ;" -"鼼>yǎo|\\\ ;" -"鼽>qiú|\\\ ;" -"齁>hōu|\\\ ;" -"齅>xiù|\\\ ;" -"齇>zhā|\\\ ;" -"齒>chǐ|\\\ ;" -"齗>kěn|\\\ ;" -"齘>xiè|\\\ ;" -"齙>páo|\\\ ;" -"齚>cuò|\\\ ;" -"齝>chī|\\\ ;" -"齣>chū|\\\ ;" -"齥>xiè|\\\ ;" -"齦>yín|\\\ ;" -"齧>niè|\\\ ;" -"齨>jiù|\\\ ;" -"齩>yǎo|\\\ ;" -"齫>kǔn|\\\ ;" -"齭>chǔ|\\\ ;" -"齰>cuò|\\\ ;" -"齳>něn|\\\ ;" -"齺>zōu|\\\ ;" -"齼>chǔ|\\\ ;" -"齽>jìn|\\\ ;" -"龂>kěn|\\\ ;" -"龑>yǎn|\\\ ;" -"龕>kān|\\\ ;" -"龜>guī|\\\ ;" -"龝>jūn|\\\ ;" -"龞>biē|\\\ ;" -"龣>dōu|\\\ ;" -"龤>xié|\\\ ;" -"𠀅>hài|\\\ ;" -"𠀉>qiū|\\\ ;" -"𠀍>shì|\\\ ;" -"𡽱>jiè|\\\ ;" -"𢦏>zāi|\\\ ;" -"𣎴>dǔn|\\\ ;" -"𦉆>chá|\\\ ;" -"的>dē|\\\ ;" -"一>yī|\\\ ;" -"不>bù|\\\ ;" -"了>lē|\\\ ;" -"我>wǒ|\\\ ;" -"他>tā|\\\ ;" -"大>dà|\\\ ;" -"个>gè|\\\ ;" -"子>zǐ|\\\ ;" -"和>hé|\\\ ;" -"你>nǐ|\\\ ;" -"地>dē|\\\ ;" -"也>yě|\\\ ;" -"得>dé|\\\ ;" -"那>nà|\\\ ;" -"以>yǐ|\\\ ;" -"自>zì|\\\ ;" -"去>qù|\\\ ;" -"可>kě|\\\ ;" -"她>tā|\\\ ;" -"里>lǐ|\\\ ;" -"么>mē|\\\ ;" -"而>ér|\\\ ;" -"日>rì|\\\ ;" -"于>yú|\\\ ;" -"起>qǐ|\\\ ;" -"发>fā|\\\ ;" -"无>wú|\\\ ;" -"如>rú|\\\ ;" -"已>yǐ|\\\ ;" -"与>yú|\\\ ;" -"意>yì|\\\ ;" -"把>bǎ|\\\ ;" -"法>fǎ|\\\ ;" -"此>cǐ|\\\ ;" -"二>èr|\\\ ;" -"理>lǐ|\\\ ;" -"其>qí|\\\ ;" -"己>jǐ|\\\ ;" -"儿>ér|\\\ ;" -"部>bù|\\\ ;" -"女>nǚ|\\\ ;" -"力>lì|\\\ ;" -"机>jī|\\\ ;" -"几>jǐ|\\\ ;" -"业>yè|\\\ ;" -"打>dǎ|\\\ ;" -"四>sì|\\\ ;" -"第>dì|\\\ ;" -"次>cì|\\\ ;" -"西>xī|\\\ ;" -"气>qì|\\\ ;" -"入>rù|\\\ ;" -"五>wǔ|\\\ ;" -"体>tǐ|\\\ ;" -"比>bǐ|\\\ ;" -"目>mù|\\\ ;" -"立>lì|\\\ ;" -"马>mǎ|\\\ ;" -"安>ān|\\\ ;" -"路>lù|\\\ ;" -"期>qī|\\\ ;" -"死>sǐ|\\\ ;" -"提>tí|\\\ ;" -"何>hé|\\\ ;" -"合>hé|\\\ ;" -"系>xì|\\\ ;" -"计>jì|\\\ ;" -"司>sī|\\\ ;" -"利>lì|\\\ ;" -"及>jí|\\\ ;" -"务>wù|\\\ ;" -"各>gè|\\\ ;" -"物>wù|\\\ ;" -"记>jì|\\\ ;" -"它>tā|\\\ ;" -"许>xǔ|\\\ ;" -"八>bā|\\\ ;" -"特>tè|\\\ ;" -"服>fú|\\\ ;" -"题>tí|\\\ ;" -"度>dù|\\\ ;" -"色>sè|\\\ ;" -"字>zì|\\\ ;" -"爱>ài|\\\ ;" -"义>wù|\\\ ;" -"科>kē|\\\ ;" -"思>sī|\\\ ;" -"夫>fū|\\\ ;" -"资>zī|\\\ ;" -"达>dá|\\\ ;" -"武>wǔ|\\\ ;" -"七>qī|\\\ ;" -"必>bì|\\\ ;" -"父>fù|\\\ ;" -"步>bù|\\\ ;" -"革>gé|\\\ ;" -"区>qū|\\\ ;" -"即>jí|\\\ ;" -"技>jī|\\\ ;" -"语>yǔ|\\\ ;" -"基>jī|\\\ ;" -"李>lǐ|\\\ ;" -"息>xī|\\\ ;" -"呢>nē|\\\ ;" -"极>jí|\\\ ;" -"德>dé|\\\ ;" -"取>qǔ|\\\ ;" -"历>lì|\\\ ;" -"议>yì|\\\ ;" -"际>jì|\\\ ;" -"则>zé|\\\ ;" -"据>jù|\\\ ;" -"拿>ná|\\\ ;" -"似>sì|\\\ ;" -"斯>sī|\\\ ;" -"弟>dì|\\\ ;" -"读>dú|\\\ ;" -"组>zǔ|\\\ ;" -"济>jì|\\\ ;" -"喜>xǐ|\\\ ;" -"离>lí|\\\ ;" -"集>jí|\\\ ;" -"府>fǔ|\\\ ;" -"拉>lā|\\\ ;" -"格>gé|\\\ ;" -"布>bù|\\\ ;" -"怕>pà|\\\ ;" -"母>mǔ|\\\ ;" -"局>jú|\\\ ;" -"乐>lè|\\\ ;" -"级>jí|\\\ ;" -"克>kè|\\\ ;" -"哪>nǎ|\\\ ;" -"乎>hū|\\\ ;" -"举>jǔ|\\\ ;" -"客>kè|\\\ ;" -"苦>kǔ|\\\ ;" -"足>zú|\\\ ;" -"尔>ěr|\\\ ;" -"热>rè|\\\ ;" -"哥>gē|\\\ ;" -"吗>ma|\\\ ;" -"古>gǔ|\\\ ;" -"汉>yì|\\\ ;" -"突>tū|\\\ ;" -"吧>bā|\\\ ;" -"亚>yà|\\\ ;" -"复>fù|\\\ ;" -"刻>kè|\\\ ;" -"夜>yè|\\\ ;" -"底>dǐ|\\\ ;" -"故>gù|\\\ ;" -"妈>mā|\\\ ;" -"句>jù|\\\ ;" -"衣>yī|\\\ ;" -"陆>lù|\\\ ;" -"器>qì|\\\ ;" -"破>pò|\\\ ;" -"具>jù|\\\ ;" -"居>jū|\\\ ;" -"批>pī|\\\ ;" -"泽>zé|\\\ ;" -"奇>qí|\\\ ;" -"易>yì|\\\ ;" -"急>jí|\\\ ;" -"低>dī|\\\ ;" -"需>xū|\\\ ;" -"河>hé|\\\ ;" -"族>zú|\\\ ;" -"胡>hú|\\\ ;" -"企>qǐ|\\\ ;" -"纪>jì|\\\ ;" -"苏>sū|\\\ ;" -"医>yī|\\\ ;" -"答>dá|\\\ ;" -"土>tǔ|\\\ ;" -"击>jí|\\\ ;" -"育>yù|\\\ ;" -"续>xù|\\\ ;" -"独>dú|\\\ ;" -"户>hù|\\\ ;" -"护>hù|\\\ ;" -"喝>hē|\\\ ;" -"责>zé|\\\ ;" -"余>yú|\\\ ;" -"希>xī|\\\ ;" -"图>tú|\\\ ;" -"爷>yé|\\\ ;" -"席>xí|\\\ ;" -"暗>àn|\\\ ;" -"须>xū|\\\ ;" -"案>àn|\\\ ;" -"呼>hū|\\\ ;" -"细>xì|\\\ ;" -"诉>sù|\\\ ;" -"笔>bǐ|\\\ ;" -"福>fú|\\\ ;" -"姑>gū|\\\ ;" -"既>jì|\\\ ;" -"巴>bā|\\\ ;" -"木>mù|\\\ ;" -"副>fù|\\\ ;" -"辑>jí|\\\ ;" -"米>mǐ|\\\ ;" -"歌>gē|\\\ ;" -"速>sù|\\\ ;" -"忽>hū|\\\ ;" -"敌>dí|\\\ ;" -"顾>gù|\\\ ;" -"丽>lì|\\\ ;" -"依>yī|\\\ ;" -"按>àn|\\\ ;" -"激>jī|\\\ ;" -"异>yì|\\\ ;" -"负>fù|\\\ ;" -"模>mó|\\\ ;" -"露>lù|\\\ ;" -"密>mì|\\\ ;" -"律>lǜ|\\\ ;" -"习>xí|\\\ ;" -"毒>dú|\\\ ;" -"波>bō|\\\ ;" -"屋>wū|\\\ ;" -"寄>jì|\\\ ;" -"帝>dì|\\\ ;" -"丝>sī|\\\ ;" -"湖>hú|\\\ ;" -"妇>fù|\\\ ;" -"伯>bó|\\\ ;" -"尼>ní|\\\ ;" -"皮>pí|\\\ ;" -"祖>zǔ|\\\ ;" -"哈>hā|\\\ ;" -"礼>lǐ|\\\ ;" -"压>yā|\\\ ;" -"婆>pó|\\\ ;" -"富>fù|\\\ ;" -"录>lù|\\\ ;" -"遇>yù|\\\ ;" -"艺>yì|\\\ ;" -"普>pǔ|\\\ ;" -"亿>yì|\\\ ;" -"素>sù|\\\ ;" -"继>jì|\\\ ;" -"雨>yǔ|\\\ ;" -"佛>fú|\\\ ;" -"吴>wú|\\\ ;" -"曲>qǔ|\\\ ;" -"玉>yù|\\\ ;" -"齐>qí|\\\ ;" -"疑>yí|\\\ ;" -"策>cè|\\\ ;" -"例>lì|\\\ ;" -"股>gǔ|\\\ ;" -"剧>jù|\\\ ;" -"杂>zá|\\\ ;" -"怒>nù|\\\ ;" -"率>lǜ|\\\ ;" -"啦>lā|\\\ ;" -"莫>mò|\\\ ;" -"恩>ēn|\\\ ;" -"积>jī|\\\ ;" -"益>yì|\\\ ;" -"哭>kū|\\\ ;" -"罢>bà|\\\ ;" -"午>wǔ|\\\ ;" -"卡>kǎ|\\\ ;" -"博>bó|\\\ ;" -"毕>bì|\\\ ;" -"欧>ōu|\\\ ;" -"妻>qī|\\\ ;" -"虚>xū|\\\ ;" -"预>yù|\\\ ;" -"刺>cì|\\\ ;" -"鱼>yú|\\\ ;" -"耳>ěr|\\\ ;" -"野>yě|\\\ ;" -"默>mò|\\\ ;" -"徒>tú|\\\ ;" -"移>yí|\\\ ;" -"爸>bà|\\\ ;" -"狐>hú|\\\ ;" -"互>hù|\\\ ;" -"旅>lǚ|\\\ ;" -"骂>mà|\\\ ;" -"秘>mì|\\\ ;" -"词>cí|\\\ ;" -"骨>gǔ|\\\ ;" -"欲>yù|\\\ ;" -"私>sī|\\\ ;" -"舞>wǔ|\\\ ;" -"巨>jù|\\\ ;" -"吸>xī|\\\ ;" -"避>bì|\\\ ;" -"忌>jì|\\\ ;" -"域>yù|\\\ ;" -"呀>yā|\\\ ;" -"付>fù|\\\ ;" -"库>kù|\\\ ;" -"绿>lǜ|\\\ ;" -"徐>xú|\\\ ;" -"误>wù|\\\ ;" -"纳>nà|\\\ ;" -"遗>yí|\\\ ;" -"迷>mí|\\\ ;" -"鲁>lǔ|\\\ ;" -"戏>xì|\\\ ;" -"趣>qù|\\\ ;" -"课>kè|\\\ ;" -"麻>má|\\\ ;" -"洗>xǐ|\\\ ;" -"迫>pò|\\\ ;" -"汽>qì|\\\ ;" -"鼓>gǔ|\\\ ;" -"岸>àn|\\\ ;" -"测>cè|\\\ ;" -"途>tú|\\\ ;" -"耶>yē|\\\ ;" -"摸>mō|\\\ ;" -"择>zé|\\\ ;" -"誉>yù|\\\ ;" -"仪>yí|\\\ ;" -"旗>qí|\\\ ;" -"奥>ào|\\\ ;" -"握>wò|\\\ ;" -"牙>yá|\\\ ;" -"虑>lǜ|\\\ ;" -"核>hé|\\\ ;" -"补>bǔ|\\\ ;" -"雅>yǎ|\\\ ;" -"吉>jí|\\\ ;" -"亦>yì|\\\ ;" -"谷>gǔ|\\\ ;" -"厉>lì|\\\ ;" -"迹>jì|\\\ ;" -"序>xù|\\\ ;" -"附>fù|\\\ ;" -"鸡>jī|\\\ ;" -"忆>yì|\\\ ;" -"惜>xī|\\\ ;" -"隔>gé|\\\ ;" -"播>bō|\\\ ;" -"麽>mā|\\\ ;" -"棋>qí|\\\ ;" -"臂>bì|\\\ ;" -"替>tì|\\\ ;" -"固>gù|\\\ ;" -"虎>hǔ|\\\ ;" -"季>jì|\\\ ;" -"聚>jù|\\\ ;" -"译>yì|\\\ ;" -"伊>yī|\\\ ;" -"末>mò|\\\ ;" -"弃>qì|\\\ ;" -"糊>hú|\\\ ;" -"抵>dǐ|\\\ ;" -"摩>mó|\\\ ;" -"币>bì|\\\ ;" -"启>qǐ|\\\ ;" -"码>mǎ|\\\ ;" -"俗>sú|\\\ ;" -"督>dū|\\\ ;" -"颇>pǒ|\\\ ;" -"孤>gū|\\\ ;" -"予>yǔ|\\\ ;" -"紫>zǐ|\\\ ;" -"侧>cè|\\\ ;" -"拔>bá|\\\ ;" -"幕>mù|\\\ ;" -"壁>bì|\\\ ;" -"闭>bì|\\\ ;" -"寺>sì|\\\ ;" -"逼>bī|\\\ ;" -"骑>qí|\\\ ;" -"促>cù|\\\ ;" -"宜>yí|\\\ ;" -"嘛>ma|\\\ ;" -"幅>fú|\\\ ;" -"污>wū|\\\ ;" -"扑>pū|\\\ ;" -"萨>sà|\\\ ;" -"狱>yù|\\\ ;" -"岂>qǐ|\\\ ;" -"析>xī|\\\ ;" -"磨>mó|\\\ ;" -"伏>fú|\\\ ;" -"辞>cí|\\\ ;" -"泥>ní|\\\ ;" -"鼻>bí|\\\ ;" -"慕>mù|\\\ ;" -"宿>sù|\\\ ;" -"粗>cū|\\\ ;" -"乌>wū|\\\ ;" -"愈>yù|\\\ ;" -"铺>pū|\\\ ;" -"疾>jí|\\\ ;" -"踏>tà|\\\ ;" -"伍>wǔ|\\\ ;" -"籍>jí|\\\ ;" -"努>nǔ|\\\ ;" -"彼>bǐ|\\\ ;" -"悉>xī|\\\ ;" -"薄>bó|\\\ ;" -"距>jù|\\\ ;" -"挤>jǐ|\\\ ;" -"吐>tǔ|\\\ ;" -"阻>zǔ|\\\ ;" -"颗>kē|\\\ ;" -"爬>pá|\\\ ;" -"偶>ǒu|\\\ ;" -"页>yè|\\\ ;" -"坡>pō|\\\ ;" -"勒>lè|\\\ ;" -"塔>tǎ|\\\ ;" -"拒>jù|\\\ ;" -"撒>sǎ|\\\ ;" -"於>yú|\\\ ;" -"绪>xù|\\\ ;" -"肚>dù|\\\ ;" -"乏>fá|\\\ ;" -"寂>jì|\\\ ;" -"扶>fú|\\\ ;" -"捕>bǔ|\\\ ;" -"魔>mó|\\\ ;" -"墓>mù|\\\ ;" -"欺>qī|\\\ ;" -"悟>wù|\\\ ;" -"赫>hè|\\\ ;" -"屈>qū|\\\ ;" -"辱>rǔ|\\\ ;" -"赴>fù|\\\ ;" -"递>dì|\\\ ;" -"绩>jì|\\\ ;" -"涂>tú|\\\ ;" -"割>gē|\\\ ;" -"励>lì|\\\ ;" -"宇>yǔ|\\\ ;" -"搭>dā|\\\ ;" -"浮>fú|\\\ ;" -"符>fú|\\\ ;" -"肃>sù|\\\ ;" -"奴>nú|\\\ ;" -"姊>zǐ|\\\ ;" -"租>zū|\\\ ;" -"椅>yǐ|\\\ ;" -"腐>fǔ|\\\ ;" -"瓦>wǎ|\\\ ;" -"擦>cā|\\\ ;" -"辣>là|\\\ ;" -"渡>dù|\\\ ;" -"荷>hé|\\\ ;" -"娃>wá|\\\ ;" -"罚>fá|\\\ ;" -"姆>mǔ|\\\ ;" -"挨>āi|\\\ ;" -"慈>cí|\\\ ;" -"澳>ào|\\\ ;" -"驱>qū|\\\ ;" -"窝>wō|\\\ ;" -"裤>kù|\\\ ;" -"估>gū|\\\ ;" -"杜>dù|\\\ ;" -"玛>mǎ|\\\ ;" -"柯>kē|\\\ ;" -"哀>āi|\\\ ;" -"腹>fù|\\\ ;" -"勃>bó|\\\ ;" -"埃>āi|\\\ ;" -"稀>xī|\\\ ;" -"厌>yā|\\\ ;" -"趋>cù|\\\ ;" -"傲>ào|\\\ ;" -"拨>bō|\\\ ;" -"踢>tī|\\\ ;" -"姿>zī|\\\ ;" -"黎>lí|\\\ ;" -"祭>jì|\\\ ;" -"滴>dī|\\\ ;" -"袭>xí|\\\ ;" -"屠>tú|\\\ ;" -"咐>fù|\\\ ;" -"惧>jù|\\\ ;" -"漠>mò|\\\ ;" -"喇>lā|\\\ ;" -"仔>zī|\\\ ;" -"墨>mò|\\\ ;" -"俱>jù|\\\ ;" -"屁>pì|\\\ ;" -"匹>pī|\\\ ;" -"拟>nǐ|\\\ ;" -"滋>zī|\\\ ;" -"贺>hè|\\\ ;" -"抚>fǔ|\\\ ;" -"挖>wā|\\\ ;" -"册>cè|\\\ ;" -"熙>xī|\\\ ;" -"碧>bì|\\\ ;" -"盒>hé|\\\ ;" -"谊>yí|\\\ ;" -"卧>wò|\\\ ;" -"翼>yì|\\\ ;" -"呵>hē|\\\ ;" -"洒>sǎ|\\\ ;" -"谱>pǔ|\\\ ;" -"阁>gé|\\\ ;" -"覆>fù|\\\ ;" -"抹>mǒ|\\\ ;" -"卢>lú|\\\ ;" -"碍>ài|\\\ ;" -"狄>dí|\\\ ;" -"押>yā|\\\ ;" -"雾>wù|\\\ ;" -"戚>qī|\\\ ;" -"御>yù|\\\ ;" -"酷>kù|\\\ ;" -"艾>ài|\\\ ;" -"唉>āi|\\\ ;" -"携>xī|\\\ ;" -"穆>mù|\\\ ;" -"郁>yù|\\\ ;" -"傅>fù|\\\ ;" -"稣>sū|\\\ ;" -"牧>mù|\\\ ;" -"儒>rú|\\\ ;" -"疲>pí|\\\ ;" -"赌>dǔ|\\\ ;" -"咨>zī|\\\ ;" -"嘻>xī|\\\ ;" -"炉>lú|\\\ ;" -"迪>dí|\\\ ;" -"披>pī|\\\ ;" -"剥>bō|\\\ ;" -"役>yì|\\\ ;" -"逆>nì|\\\ ;" -"矮>ǎi|\\\ ;" -"夕>xì|\\\ ;" -"液>yè|\\\ ;" -"仆>pū|\\\ ;" -"弥>mí|\\\ ;" -"渴>kě|\\\ ;" -"梯>tī|\\\ ;" -"蒂>dì|\\\ ;" -"娶>qǔ|\\\ ;" -"弗>fú|\\\ ;" -"璃>lí|\\\ ;" -"肤>fū|\\\ ;" -"鹿>lù|\\\ ;" -"哩>lī|\\\ ;" -"枯>kū|\\\ ;" -"塑>sù|\\\ ;" -"豫>yù|\\\ ;" -"抑>yì|\\\ ;" -"艳>bó|\\\ ;" -"玻>bō|\\\ ;" -"砸>zá|\\\ ;" -"葛>gé|\\\ ;" -"矩>jǔ|\\\ ;" -"脖>bó|\\\ ;" -"脾>pí|\\\ ;" -"赐>sì|\\\ ;" -"蓄>xù|\\\ ;" -"鹤>hè|\\\ ;" -"辟>bì|\\\ ;" -"渔>yú|\\\ ;" -"霸>bà|\\\ ;" -"哑>yǎ|\\\ ;" -"浦>pǔ|\\\ ;" -"牺>xī|\\\ ;" -"吁>yù|\\\ ;" -"锡>xí|\\\ ;" -"芙>fú|\\\ ;" -"哟>yo|\\\ ;" -"惹>rě|\\\ ;" -"契>qì|\\\ ;" -"愚>yú|\\\ ;" -"姨>yí|\\\ ;" -"陌>mò|\\\ ;" -"猎>xí|\\\ ;" -"饥>jī|\\\ ;" -"凄>qī|\\\ ;" -"膝>xī|\\\ ;" -"劈>pī|\\\ ;" -"崖>yá|\\\ ;" -"涯>yá|\\\ ;" -"戈>gē|\\\ ;" -"堵>dǔ|\\\ ;" -"雇>gù|\\\ ;" -"泊>bó|\\\ ;" -"撕>sī|\\\ ;" -"叙>xù|\\\ ;" -"棵>kē|\\\ ;" -"朴>pò|\\\ ;" -"溪>xī|\\\ ;" -"莉>lì|\\\ ;" -"磕>kē|\\\ ;" -"吕>lǚ|\\\ ;" -"昔>xī|\\\ ;" -"磁>cí|\\\ ;" -"俯>fǔ|\\\ ;" -"拂>fú|\\\ ;" -"俺>ǎn|\\\ ;" -"帕>pà|\\\ ;" -"嗯>ēn|\\\ ;" -"泼>pō|\\\ ;" -"妓>jì|\\\ ;" -"菩>pú|\\\ ;" -"厕>cè|\\\ ;" -"俘>fú|\\\ ;" -"毅>yì|\\\ ;" -"丫>yā|\\\ ;" -"粒>lì|\\\ ;" -"秃>tū|\\\ ;" -"腊>là|\\\ ;" -"倪>ní|\\\ ;" -"瑟>sè|\\\ ;" -"鸭>yā|\\\ ;" -"蜜>mì|\\\ ;" -"媳>xí|\\\ ;" -"歧>qí|\\\ ;" -"亩>mǔ|\\\ ;" -"寞>mò|\\\ ;" -"搁>gē|\\\ ;" -"俞>yú|\\\ ;" -"伐>fá|\\\ ;" -"漆>qī|\\\ ;" -"怖>bù|\\\ ;" -"吾>wú|\\\ ;" -"肆>sì|\\\ ;" -"泣>qì|\\\ ;" -"赋>fù|\\\ ;" -"熬>áo|\\\ ;" -"咳>ké|\\\ ;" -"愉>yú|\\\ ;" -"辜>gū|\\\ ;" -"肌>jī|\\\ ;" -"羽>yǔ|\\\ ;" -"毙>bì|\\\ ;" -"拘>jū|\\\ ;" -"哇>wā|\\\ ;" -"谜>mí|\\\ ;" -"逸>yì|\\\ ;" -"呜>wū|\\\ ;" -"卜>bō|\\\ ;" -"寓>yù|\\\ ;" -"驳>bó|\\\ ;" -"浴>yù|\\\ ;" -"咕>gū|\\\ ;" -"搏>bó|\\\ ;" -"渠>qú|\\\ ;" -"夷>yí|\\\ ;" -"沪>hù|\\\ ;" -"魄>pò|\\\ ;" -"晰>xī|\\\ ;" -"裔>yì|\\\ ;" -"倚>yǐ|\\\ ;" -"塌>tā|\\\ ;" -"裕>yù|\\\ ;" -"乳>rǔ|\\\ ;" -"勿>wù|\\\ ;" -"睹>dǔ|\\\ ;" -"讶>yà|\\\ ;" -"咖>kā|\\\ ;" -"娱>yú|\\\ ;" -"鸦>yā|\\\ ;" -"妮>nī|\\\ ;" -"甫>fǔ|\\\ ;" -"坝>bà|\\\ ;" -"沐>mù|\\\ ;" -"侮>wǔ|\\\ ;" -"兀>wù|\\\ ;" -"履>lǚ|\\\ ;" -"粞>xī|\\\ ;" -"溢>yì|\\\ ;" -"乞>qǐ|\\\ ;" -"缚>fú|\\\ ;" -"舆>yú|\\\ ;" -"堤>dī|\\\ ;" -"蹄>tí|\\\ ;" -"沫>mò|\\\ ;" -"壶>hú|\\\ ;" -"碌>lù|\\\ ;" -"驴>lǘ|\\\ ;" -"鄙>bǐ|\\\ ;" -"壳>ké|\\\ ;" -"芦>lú|\\\ ;" -"胳>gē|\\\ ;" -"矣>yǐ|\\\ ;" -"脊>jí|\\\ ;" -"辅>fǔ|\\\ ;" -"膊>bó|\\\ ;" -"垃>lā|\\\ ;" -"隶>lì|\\\ ;" -"哎>āi|\\\ ;" -"兔>tù|\\\ ;" -"圾>jí|\\\ ;" -"喻>yù|\\\ ;" -"尬>gà|\\\ ;" -"呐>nè|\\\ ;" -"菊>jú|\\\ ;" -"喀>kā|\\\ ;" -"瓷>cí|\\\ ;" -"屡>lǚ|\\\ ;" -"蜡>là|\\\ ;" -"剂>jì|\\\ ;" -"庐>lú|\\\ ;" -"奚>xī|\\\ ;" -"葡>pú|\\\ ;" -"蓦>mò|\\\ ;" -"乙>yǐ|\\\ ;" -"祁>qí|\\\ ;" -"暮>mù|\\\ ;" -"腻>nì|\\\ ;" -"啤>pí|\\\ ;" -"禾>hé|\\\ ;" -"躯>qū|\\\ ;" -"馀>yú|\\\ ;" -"梨>lí|\\\ ;" -"琪>qí|\\\ ;" -"僻>pì|\\\ ;" -"匕>bì|\\\ ;" -"隙>xì|\\\ ;" -"兹>zī|\\\ ;" -"怡>yí|\\\ ;" -"珂>kē|\\\ ;" -"涩>sè|\\\ ;" -"癌>ái|\\\ ;" -"厮>sī|\\\ ;" -"膜>mó|\\\ ;" -"茨>cí|\\\ ;" -"疫>yì|\\\ ;" -"汝>rǔ|\\\ ;" -"鞑>dá|\\\ ;" -"窟>kū|\\\ ;" -"笛>dí|\\\ ;" -"觅>mì|\\\ ;" -"蔽>bì|\\\ ;" -"卒>zú|\\\ ;" -"熄>xí|\\\ ;" -"绮>qǐ|\\\ ;" -"吏>lì|\\\ ;" -"譬>pì|\\\ ;" -"婿>xù|\\\ ;" -"逾>yú|\\\ ;" -"妒>dù|\\\ ;" -"咪>mī|\\\ ;" -"祈>qǐ|\\\ ;" -"黯>àn|\\\ ;" -"禹>yǔ|\\\ ;" -"鞍>ān|\\\ ;" -"啪>pā|\\\ ;" -"叭>bā|\\\ ;" -"嘶>sī|\\\ ;" -"弊>bì|\\\ ;" -"啼>tí|\\\ ;" -"醋>cù|\\\ ;" -"眯>mǐ|\\\ ;" -"稽>jī|\\\ ;" -"嘟>dū|\\\ ;" -"缕>lǚ|\\\ ;" -"袜>wà|\\\ ;" -"冶>yě|\\\ ;" -"惕>tì|\\\ ;" -"栗>lì|\\\ ;" -"斧>fǔ|\\\ ;" -"讥>jī|\\\ ;" -"迄>qì|\\\ ;" -"侣>lǚ|\\\ ;" -"漓>lí|\\\ ;" -"兮>xī|\\\ ;" -"敷>fū|\\\ ;" -"毓>yù|\\\ ;" -"瑜>yú|\\\ ;" -"梓>zǐ|\\\ ;" -"敝>bì|\\\ ;" -"袱>fú|\\\ ;" -"虏>lǔ|\\\ ;" -"剃>tì|\\\ ;" -"鳌>áo|\\\ ;" -"沃>wò|\\\ ;" -"梧>wú|\\\ ;" -"姬>jī|\\\ ;" -"霓>ní|\\\ ;" -"葫>hú|\\\ ;" -"涕>tì|\\\ ;" -"笃>dǔ|\\\ ;" -"咋>zǎ|\\\ ;" -"呕>ōu|\\\ ;" -"咦>yí|\\\ ;" -"旭>xù|\\\ ;" -"捂>wǔ|\\\ ;" -"巫>wū|\\\ ;" -"坞>wù|\\\ ;" -"嫉>jí|\\\ ;" -"禄>lù|\\\ ;" -"嘘>xū|\\\ ;" -"诬>wú|\\\ ;" -"募>mù|\\\ ;" -"芭>bā|\\\ ;" -"叽>jī|\\\ ;" -"趴>pā|\\\ ;" -"漪>yī|\\\ ;" -"疤>bā|\\\ ;" -"蚁>yǐ|\\\ ;" -"娅>yà|\\\ ;" -"粟>sù|\\\ ;" -"颐>yí|\\\ ;" -"伺>cì|\\\ ;" -"觑>qù|\\\ ;" -"噜>lū|\\\ ;" -"蒲>pú|\\\ ;" -"凸>tū|\\\ ;" -"嬉>xī|\\\ ;" -"栖>qī|\\\ ;" -"跋>bá|\\\ ;" -"沮>jǔ|\\\ ;" -"嘎>gā|\\\ ;" -"咯>gē|\\\ ;" -"瀑>pù|\\\ ;" -"扒>bā|\\\ ;" -"圪>gē|\\\ ;" -"驹>jū|\\\ ;" -"暨>jì|\\\ ;" -"絮>xù|\\\ ;" -"蝴>hú|\\\ ;" -"鸽>gē|\\\ ;" -"凹>āo|\\\ ;" -"惚>hū|\\\ ;" -"渝>yú|\\\ ;" -"钰>yù|\\\ ;" -"靡>mí|\\\ ;" -"揖>yī|\\\ ;" -"殴>ōu|\\\ ;" -"嘀>dí|\\\ ;" -"噗>pū|\\\ ;" -"缉>qì|\\\ ;" -"矶>jī|\\\ ;" -"簇>cù|\\\ ;" -"芽>yá|\\\ ;" -"懊>ào|\\\ ;" -"饲>sì|\\\ ;" -"阀>fá|\\\ ;" -"谕>yù|\\\ ;" -"缔>dì|\\\ ;" -"庇>bì|\\\ ;" -"拇>mǔ|\\\ ;" -"匿>nì|\\\ ;" -"厘>lí|\\\ ;" -"袄>ǎo|\\\ ;" -"蚂>mǎ|\\\ ;" -"剔>tī|\\\ ;" -"屿>yǔ|\\\ ;" -"庵>ān|\\\ ;" -"俐>lì|\\\ ;" -"孜>zī|\\\ ;" -"溯>sù|\\\ ;" -"禧>xǐ|\\\ ;" -"衙>yá|\\\ ;" -"鞠>jū|\\\ ;" -"冀>jì|\\\ ;" -"晤>wù|\\\ ;" -"奕>yì|\\\ ;" -"屉>tì|\\\ ;" -"诣>yì|\\\ ;" -"祠>cí|\\\ ;" -"簌>sù|\\\ ;" -"棘>jí|\\\ ;" -"掳>lǔ|\\\ ;" -"狸>lí|\\\ ;" -"苛>kē|\\\ ;" -"簿>bù|\\\ ;" -"屹>yì|\\\ ;" -"砌>qì|\\\ ;" -"衲>nà|\\\ ;" -"洼>wā|\\\ ;" -"榻>tà|\\\ ;" -"虞>yú|\\\ ;" -"蛙>wā|\\\ ;" -"锯>jù|\\\ ;" -"瞿>qú|\\\ ;" -"啧>zé|\\\ ;" -"唬>hǔ|\\\ ;" -"脯>pú|\\\ ;" -"诅>zǔ|\\\ ;" -"牡>mǔ|\\\ ;" -"嗒>tà|\\\ ;" -"辐>fú|\\\ ;" -"墟>xū|\\\ ;" -"恤>xù|\\\ ;" -"褥>rù|\\\ ;" -"疙>gē|\\\ ;" -"涡>wō|\\\ ;" -"婢>bì|\\\ ;" -"漉>lù|\\\ ;" -"馍>mó|\\\ ;" -"犁>lí|\\\ ;" -"沂>yí|\\\ ;" -"曳>yè|\\\ ;" -"酥>sū|\\\ ;" -"桔>jú|\\\ ;" -"颅>lú|\\\ ;" -"钵>bō|\\\ ;" -"蛤>gé|\\\ ;" -"隘>ài|\\\ ;" -"瘩>dā|\\\ ;" -"戮>lù|\\\ ;" -"渥>wò|\\\ ;" -"蹋>tà|\\\ ;" -"睦>mù|\\\ ;" -"雌>cí|\\\ ;" -"轧>gá|\\\ ;" -"埔>pǔ|\\\ ;" -"溺>nì|\\\ ;" -"蝠>fú|\\\ ;" -"噎>yē|\\\ ;" -"芜>wú|\\\ ;" -"羁>jī|\\\ ;" -"咀>jǔ|\\\ ;" -"阜>fù|\\\ ;" -"靶>bǎ|\\\ ;" -"呱>gū|\\\ ;" -"弧>hú|\\\ ;" -"腑>fǔ|\\\ ;" -"谛>dì|\\\ ;" -"炬>jù|\\\ ;" -"噶>gá|\\\ ;" -"蔼>ǎi|\\\ ;" -"舶>bó|\\\ ;" -"渎>dú|\\\ ;" -"痞>pǐ|\\\ ;" -"捺>nà|\\\ ;" -"毋>wú|\\\ ;" -"簸>bǒ|\\\ ;" -"戊>wù|\\\ ;" -"茹>rú|\\\ ;" -"蛐>qū|\\\ ;" -"陛>bì|\\\ ;" -"璧>bì|\\\ ;" -"唔>wú|\\\ ;" -"篱>lí|\\\ ;" -"迂>yū|\\\ ;" -"腋>yè|\\\ ;" -"浒>hǔ|\\\ ;" -"崎>qí|\\\ ;" -"恪>kè|\\\ ;" -"轶>yì|\\\ ;" -"琶>pá|\\\ ;" -"剌>lá|\\\ ;" -"赂>lù|\\\ ;" -"敖>áo|\\\ ;" -"琵>pí|\\\ ;" -"仄>zè|\\\ ;" -"涤>dí|\\\ ;" -"邬>wū|\\\ ;" -"沥>lì|\\\ ;" -"坷>kě|\\\ ;" -"麓>lù|\\\ ;" -"褐>hè|\\\ ;" -"嚓>cā|\\\ ;" -"绎>yì|\\\ ;" -"哺>bǔ|\\\ ;" -"卅>sà|\\\ ;" -"渍>zì|\\\ ;" -"戟>jǐ|\\\ ;" -"跛>bǒ|\\\ ;" -"蟆>má|\\\ ;" -"邑>yì|\\\ ;" -"璐>lù|\\\ ;" -"忒>tè|\\\ ;" -"隅>yú|\\\ ;" -"埠>bù|\\\ ;" -"笈>jí|\\\ ;" -"栩>xǔ|\\\ ;" -"悸>jì|\\\ ;" -"汲>jí|\\\ ;" -"睨>nì|\\\ ;" -"淤>yū|\\\ ;" -"箍>gū|\\\ ;" -"嗣>sì|\\\ ;" -"挎>kū|\\\ ;" -"踞>jù|\\\ ;" -"恻>cè|\\\ ;" -"唷>yō|\\\ ;" -"蠕>rú|\\\ ;" -"霹>pī|\\\ ;" -"蹊>xī|\\\ ;" -"璞>pú|\\\ ;" -"笠>lì|\\\ ;" -"唧>jī|\\\ ;" -"祺>qí|\\\ ;" -"钠>nà|\\\ ;" -"菇>gū|\\\ ;" -"鸥>ōu|\\\ ;" -"雳>lì|\\\ ;" -"榆>yú|\\\ ;" -"摹>mó|\\\ ;" -"沓>tà|\\\ ;" -"猝>cù|\\\ ;" -"弩>nǔ|\\\ ;" -"曝>pù|\\\ ;" -"伎>jì|\\\ ;" -"犀>xī|\\\ ;" -"曦>xī|\\\ ;" -"蛊>gǔ|\\\ ;" -"驸>fù|\\\ ;" -"癖>pǐ|\\\ ;" -"讷>nè|\\\ ;" -"渤>bó|\\\ ;" -"烨>yè|\\\ ;" -"辘>lù|\\\ ;" -"琦>qí|\\\ ;" -"藕>ǒu|\\\ ;" -"嗷>áo|\\\ ;" -"铝>lǚ|\\\ ;" -"跻>jī|\\\ ;" -"哒>dā|\\\ ;" -"戌>xū|\\\ ;" -"捋>lǚ|\\\ ;" -"釜>fǔ|\\\ ;" -"荼>tú|\\\ ;" -"畸>jī|\\\ ;" -"羲>xī|\\\ ;" -"暧>ài|\\\ ;" -"翌>yì|\\\ ;" -"蜈>wú|\\\ ;" -"弈>yì|\\\ ;" -"贻>yí|\\\ ;" -"祀>sì|\\\ ;" -"瞌>kē|\\\ ;" -"孚>fú|\\\ ;" -"亟>jí|\\\ ;" -"愫>sù|\\\ ;" -"谙>ān|\\\ ;" -"聿>yù|\\\ ;" -"熹>xī|\\\ ;" -"嚅>rú|\\\ ;" -"镀>dù|\\\ ;" -"卤>lǔ|\\\ ;" -"皑>ái|\\\ ;" -"娣>dì|\\\ ;" -"咔>kǎ|\\\ ;" -"筏>fá|\\\ ;" -"飒>sà|\\\ ;" -"樨>xī|\\\ ;" -"滤>lǜ|\\\ ;" -"蹙>cù|\\\ ;" -"胥>xū|\\\ ;" -"籽>zǐ|\\\ ;" -"徙>xǐ|\\\ ;" -"唏>xī|\\\ ;" -"荔>lì|\\\ ;" -"犊>dú|\\\ ;" -"煦>xǔ|\\\ ;" -"汩>gǔ|\\\ ;" -"毗>pí|\\\ ;" -"坳>ào|\\\ ;" -"脐>jī|\\\ ;" -"圃>pǔ|\\\ ;" -"熠>yì|\\\ ;" -"鲤>lǐ|\\\ ;" -"帛>bó|\\\ ;" -"骷>kū|\\\ ;" -"髻>jì|\\\ ;" -"蠡>lí|\\\ ;" -"丕>pǐ|\\\ ;" -"喔>wō|\\\ ;" -"坯>pī|\\\ ;" -"氯>lǜ|\\\ ;" -"妩>wǔ|\\\ ;" -"嫡>dí|\\\ ;" -"沽>gū|\\\ ;" -"驭>yù|\\\ ;" -"斡>wò|\\\ ;" -"啬>sè|\\\ ;" -"芋>yù|\\\ ;" -"蘑>mó|\\\ ;" -"忑>tè|\\\ ;" -"珥>ěr|\\\ ;" -"喏>rě|\\\ ;" -"咂>zā|\\\ ;" -"邸>dǐ|\\\ ;" -"掬>jú|\\\ ;" -"笆>bā|\\\ ;" -"倭>wō|\\\ ;" -"壑>hè|\\\ ;" -"臆>yì|\\\ ;" -"孺>rú|\\\ ;" -"馥>fù|\\\ ;" -"咿>yī|\\\ ;" -"俾>bǐ|\\\ ;" -"泌>bì|\\\ ;" -"霭>ǎi|\\\ ;" -"骥>jì|\\\ ;" -"昵>nì|\\\ ;" -"驿>yì|\\\ ;" -"嵇>jī|\\\ ;" -"阂>hé|\\\ ;" -"骼>gé|\\\ ;" -"牯>gǔ|\\\ ;" -"鄱>pó|\\\ ;" -"沏>qī|\\\ ;" -"稷>jì|\\\ ;" -"劾>hé|\\\ ;" -"谧>mì|\\\ ;" -"褛>lǚ|\\\ ;" -"玑>jī|\\\ ;" -"俟>sì|\\\ ;" -"峪>yù|\\\ ;" -"嚏>tì|\\\ ;" -"砾>lì|\\\ ;" -"箕>jī|\\\ ;" -"弼>bì|\\\ ;" -"耙>pá|\\\ ;" -"锢>gù|\\\ ;" -"岜>bā|\\\ ;" -"耷>dā|\\\ ;" -"菠>bō|\\\ ;" -"噼>pī|\\\ ;" -"诃>hē|\\\ ;" -"孵>fū|\\\ ;" -"饵>ěr|\\\ ;" -"濡>rú|\\\ ;" -"禺>yú|\\\ ;" -"蝌>kē|\\\ ;" -"涸>hé|\\\ ;" -"痹>bì|\\\ ;" -"氨>ān|\\\ ;" -"扈>hù|\\\ ;" -"淅>xī|\\\ ;" -"阖>gé|\\\ ;" -"巳>sì|\\\ ;" -"媲>pì|\\\ ;" -"闾>lǘ|\\\ ;" -"泗>sì|\\\ ;" -"驷>sì|\\\ ;" -"锹>lì|\\\ ;" -"怩>ní|\\\ ;" -"彝>yí|\\\ ;" -"掖>yē|\\\ ;" -"淇>qí|\\\ ;" -"诋>dǐ|\\\ ;" -"岖>qū|\\\ ;" -"憩>qì|\\\ ;" -"戾>lì|\\\ ;" -"嗬>hē|\\\ ;" -"蟋>xī|\\\ ;" -"瘠>jí|\\\ ;" -"膂>lǚ|\\\ ;" -"橘>jú|\\\ ;" -"溥>pǔ|\\\ ;" -"谒>tí|\\\ ;" -"恣>zì|\\\ ;" -"觎>yú|\\\ ;" -"橹>lǔ|\\\ ;" -"呓>yì|\\\ ;" -"椰>yé|\\\ ;" -"砺>lì|\\\ ;" -"觊>gǔ|\\\ ;" -"嗝>gé|\\\ ;" -"唢>jī|\\\ ;" -"匝>zā|\\\ ;" -"谀>yú|\\\ ;" -"痢>lì|\\\ ;" -"睇>dì|\\\ ;" -"牍>dú|\\\ ;" -"叵>pǒ|\\\ ;" -"糜>mí|\\\ ;" -"嗑>kè|\\\ ;" -"嗳>ài|\\\ ;" -"瑚>hú|\\\ ;" -"皙>xī|\\\ ;" -"捱>ái|\\\ ;" -"盂>yú|\\\ ;" -"壹>yī|\\\ ;" -"衢>qú|\\\ ;" -"杞>qǐ|\\\ ;" -"翱>áo|\\\ ;" -"珀>pò|\\\ ;" -"岌>jí|\\\ ;" -"偈>jì|\\\ ;" -"诩>xǔ|\\\ ;" -"耆>qí|\\\ ;" -"玺>xǐ|\\\ ;" -"疵>cī|\\\ ;" -"迤>yí|\\\ ;" -"翟>dí|\\\ ;" -"榈>lǘ|\\\ ;" -"遢>tà|\\\ ;" -"茉>mò|\\\ ;" -"酗>xù|\\\ ;" -"棣>dì|\\\ ;" -"纥>gē|\\\ ;" -"藜>lí|\\\ ;" -"礴>bó|\\\ ;" -"滓>zǐ|\\\ ;" -"霁>jì|\\\ ;" -"鹂>lí|\\\ ;" -"罹>lí|\\\ ;" -"妪>yù|\\\ ;" -"夙>sù|\\\ ;" -"岐>qí|\\\ ;" -"唿>hū|\\\ ;" -"咝>sī|\\\ ;" -"靥>yè|\\\ ;" -"鹘>gú|\\\ ;" -"揄>yú|\\\ ;" -"鹉>wǔ|\\\ ;" -"狙>jū|\\\ ;" -"粑>bā|\\\ ;" -"圻>qí|\\\ ;" -"妲>dá|\\\ ;" -"郦>lì|\\\ ;" -"讴>ōu|\\\ ;" -"忤>wǔ|\\\ ;" -"龌>wò|\\\ ;" -"鹭>lù|\\\ ;" -"咭>jī|\\\ ;" -"佚>yì|\\\ ;" -"蹴>cù|\\\ ;" -"趄>jū|\\\ ;" -"邋>lá|\\\ ;" -"宓>mì|\\\ ;" -"揶>yé|\\\ ;" -"粕>pò|\\\ ;" -"遨>áo|\\\ ;" -"匍>pú|\\\ ;" -"孛>bó|\\\ ;" -"迩>ěr|\\\ ;" -"噫>yī|\\\ ;" -"弋>yì|\\\ ;" -"俎>zǔ|\\\ ;" -"铂>bó|\\\ ;" -"骛>ào|\\\ ;" -"嘁>qī|\\\ ;" -"轲>kē|\\\ ;" -"俚>lǐ|\\\ ;" -"钹>bá|\\\ ;" -"靼>dá|\\\ ;" -"腴>yú|\\\ ;" -"檄>xí|\\\ ;" -"莆>pú|\\\ ;" -"汨>mì|\\\ ;" -"懿>yì|\\\ ;" -"倜>tì|\\\ ;" -"俪>lì|\\\ ;" -"挞>tà|\\\ ;" -"蛆>qū|\\\ ;" -"铬>gé|\\\ ;" -"颌>hé|\\\ ;" -"贲>bì|\\\ ;" -"蓟>jì|\\\ ;" -"鹜>mù|\\\ ;" -"辎>zī|\\\ ;" -"胰>yí|\\\ ;" -"臾>yú|\\\ ;" -"泸>lú|\\\ ;" -"鏖>áo|\\\ ;" -"圄>yǔ|\\\ ;" -"飓>jù|\\\ ;" -"遽>jù|\\\ ;" -"汐>xī|\\\ ;" -"贰>èr|\\\ ;" -"饽>bó|\\\ ;" -"呲>zī|\\\ ;" -"倨>jù|\\\ ;" -"讣>fù|\\\ ;" -"梏>gù|\\\ ;" -"祛>qū|\\\ ;" -"旎>nǐ|\\\ ;" -"桠>yá|\\\ ;" -"淄>zī|\\\ ;" -"畦>qí|\\\ ;" -"裾>jū|\\\ ;" -"屐>jī|\\\ ;" -"摁>èn|\\\ ;" -"荻>dí|\\\ ;" -"洱>ěr|\\\ ;" -"裨>bì|\\\ ;" -"猢>hú|\\\ ;" -"蒺>jí|\\\ ;" -"烯>xī|\\\ ;" -"趿>sà|\\\ ;" -"旖>yǐ|\\\ ;" -"荠>qí|\\\ ;" -"匐>fú|\\\ ;" -"鲫>jì|\\\ ;" -"翕>xì|\\\ ;" -"缢>yì|\\\ ;" -"骊>lí|\\\ ;" -"囫>hú|\\\ ;" -"柢>dǐ|\\\ ;" -"畿>jī|\\\ ;" -"铱>yǐ|\\\ ;" -"縻>mí|\\\ ;" -"龇>zī|\\\ ;" -"踽>jǔ|\\\ ;" -"褡>dā|\\\ ;" -"窠>kē|\\\ ;" -"菏>hé|\\\ ;" -"舸>gě|\\\ ;" -"盱>xū|\\\ ;" -"煜>yù|\\\ ;" -"杷>pá|\\\ ;" -"喁>yú|\\\ ;" -"葩>pā|\\\ ;" -"胺>àn|\\\ ;" -"髭>zī|\\\ ;" -"鸪>gū|\\\ ;" -"旯>lá|\\\ ;" -"旮>xù|\\\ ;" -"琥>hǔ|\\\ ;" -"麒>qí|\\\ ;" -"砥>dǐ|\\\ ;" -"蝮>fù|\\\ ;" -"瘀>yū|\\\ ;" -"萸>yú|\\\ ;" -"蚝>cì|\\\ ;" -"枇>pí|\\\ ;" -"哔>bì|\\\ ;" -"挹>yì|\\\ ;" -"斛>hú|\\\ ;" -"秣>mò|\\\ ;" -"祜>hù|\\\ ;" -"擘>bò|\\\ ;" -"犄>jī|\\\ ;" -"轱>kū|\\\ ;" -"愎>bì|\\\ ;" -"唳>lì|\\\ ;" -"氐>dī|\\\ ;" -"砒>pī|\\\ ;" -"沤>òu|\\\ ;" -"氟>fú|\\\ ;" -"麋>mí|\\\ ;" -"痍>yí|\\\ ;" -"邺>yè|\\\ ;" -"獭>tǎ|\\\ ;" -"黢>qū|\\\ ;" -"潞>lù|\\\ ;" -"昱>yù|\\\ ;" -"轳>lú|\\\ ;" -"娲>wā|\\\ ;" -"萋>qī|\\\ ;" -"谘>zī|\\\ ;" -"籴>dí|\\\ ;" -"疽>jū|\\\ ;" -"颍>kē|\\\ ;" -"硒>xī|\\\ ;" -"鳍>qí|\\\ ;" -"涪>fú|\\\ ;" -"箔>bó|\\\ ;" -"鹄>hú|\\\ ;" -"胪>lú|\\\ ;" -"桤>qī|\\\ ;" -"弭>mǐ|\\\ ;" -"怄>òu|\\\ ;" -"茯>fú|\\\ ;" -"醍>tí|\\\ ;" -"锂>lǐ|\\\ ;" -"睥>bì|\\\ ;" -"瓯>ōu|\\\ ;" -"莅>lì|\\\ ;" -"谟>mó|\\\ ;" -"讫>qì|\\\ ;" -"翳>yì|\\\ ;" -"癯>qú|\\\ ;" -"钸>bó|\\\ ;" -"眦>zì|\\\ ;" -"楫>jí|\\\ ;" -"娌>lǐ|\\\ ;" -"逦>lǐ|\\\ ;" -"幄>wò|\\\ ;" -"亳>bó|\\\ ;" -"肄>yì|\\\ ;" -"砝>fá|\\\ ;" -"骜>áo|\\\ ;" -"卟>bǔ|\\\ ;" -"佶>jí|\\\ ;" -"龃>jǔ|\\\ ;" -"蜮>yù|\\\ ;" -"欹>yī|\\\ ;" -"晔>yē|\\\ ;" -"缛>rù|\\\ ;" -"蔺>fù|\\\ ;" -"诂>gǔ|\\\ ;" -"羿>yì|\\\ ;" -"蛎>lì|\\\ ;" -"榘>jǔ|\\\ ;" -"纰>bǐ|\\\ ;" -"逋>bū|\\\ ;" -"凫>fú|\\\ ;" -"龋>qǔ|\\\ ;" -"蜥>xī|\\\ ;" -"痼>gù|\\\ ;" -"鬻>yù|\\\ ;" -"濮>pú|\\\ ;" -"溧>lì|\\\ ;" -"阒>qù|\\\ ;" -"黩>dú|\\\ ;" -"醐>hú|\\\ ;" -"蠹>dù|\\\ ;" -"悌>tì|\\\ ;" -"饴>yí|\\\ ;" -"撸>lǔ|\\\ ;" -"蜴>yì|\\\ ;" -"钜>jù|\\\ ;" -"澧>lǐ|\\\ ;" -"悒>yì|\\\ ;" -"猕>mí|\\\ ;" -"葺>qì|\\\ ;" -"糍>cí|\\\ ;" -"疴>kē|\\\ ;" -"绔>kù|\\\ ;" -"怃>wǔ|\\\ ;" -"呒>fǔ|\\\ ;" -"訾>zī|\\\ ;" -"顸>dú|\\\ ;" -"嬷>mā|\\\ ;" -"漯>tà|\\\ ;" -"溘>kè|\\\ ;" -"蓿>sù|\\\ ;" -"苻>fú|\\\ ;" -"圮>pǐ|\\\ ;" -"诒>yí|\\\ ;" -"伢>yá|\\\ ;" -"鲈>lú|\\\ ;" -"竽>yú|\\\ ;" -"蛳>sī|\\\ ;" -"曷>hé|\\\ ;" -"尕>gǎ|\\\ ;" -"怛>dá|\\\ ;" -"怙>hù|\\\ ;" -"拊>fǔ|\\\ ;" -"陂>pí|\\\ ;" -"瘌>là|\\\ ;" -"鹌>ān|\\\ ;" -"钚>bù|\\\ ;" -"瑷>ài|\\\ ;" -"庾>yǔ|\\\ ;" -"喱>lí|\\\ ;" -"蓖>bì|\\\ ;" -"耦>ǒu|\\\ ;" -"鸶>sī|\\\ ;" -"钴>gū|\\\ ;" -"妣>bǐ|\\\ ;" -"崮>gù|\\\ ;" -"岙>ào|\\\ ;" -"呖>lì|\\\ ;" -"醚>mí|\\\ ;" -"篦>bì|\\\ ;" -"螯>áo|\\\ ;" -"蜉>fú|\\\ ;" -"蜊>lí|\\\ ;" -"痖>pī|\\\ ;" -"膈>gé|\\\ ;" -"轾>yà|\\\ ;" -"殁>mò|\\\ ;" -"獒>áo|\\\ ;" -"枥>lì|\\\ ;" -"莴>wō|\\\ ;" -"觚>gū|\\\ ;" -"綦>qí|\\\ ;" -"鹬>yù|\\\ ;" -"稞>kē|\\\ ;" -"瞽>gǔ|\\\ ;" -"赀>zī|\\\ ;" -"贽>gǔ|\\\ ;" -"妤>yú|\\\ ;" -"傈>lì|\\\ ;" -"毖>bì|\\\ ;" -"麂>jǐ|\\\ ;" -"醴>lǐ|\\\ ;" -"锱>zī|\\\ ;" -"辂>lù|\\\ ;" -"驽>nú|\\\ ;" -"媪>ǎo|\\\ ;" -"迓>yà|\\\ ;" -"灞>bà|\\\ ;" -"蘼>mí|\\\ ;" -"仵>wǔ|\\\ ;" -"瓠>hù|\\\ ;" -"欤>yú|\\\ ;" -"屣>xǐ|\\\ ;" -"渌>lù|\\\ ;" -"岘>pí|\\\ ;" -"薏>yì|\\\ ;" -"苜>mù|\\\ ;" -"芨>jī|\\\ ;" -"厶>sī|\\\ ;" -"珐>fà|\\\ ;" -"黧>lí|\\\ ;" -"蹼>pú|\\\ ;" -"跸>bì|\\\ ;" -"笸>pǒ|\\\ ;" -"笏>hù|\\\ ;" -"蛄>gū|\\\ ;" -"蚍>bǐ|\\\ ;" -"詈>lì|\\\ ;" -"碡>dú|\\\ ;" -"祢>mí|\\\ ;" -"煳>hú|\\\ ;" -"齑>jī|\\\ ;" -"毂>gǔ|\\\ ;" -"牾>wú|\\\ ;" -"缁>jī|\\\ ;" -"孳>zī|\\\ ;" -"阋>xì|\\\ ;" -"薜>bì|\\\ ;" -"苣>jù|\\\ ;" -"讵>jù|\\\ ;" -"乩>jī|\\\ ;" -"钨>wù|\\\ ;" -"趺>fū|\\\ ;" -"瘗>yì|\\\ ;" -"穑>sè|\\\ ;" -"铋>bì|\\\ ;" -"碛>qì|\\\ ;" -"戽>hù|\\\ ;" -"桴>fú|\\\ ;" -"桉>ān|\\\ ;" -"寤>wù|\\\ ;" -"浠>xī|\\\ ;" -"奁>dī|\\\ ;" -"荸>bí|\\\ ;" -"圯>yí|\\\ ;" -"矽>xī|\\\ ;" -"翊>yì|\\\ ;" -"罴>pí|\\\ ;" -"赍>jī|\\\ ;" -"殛>jí|\\\ ;" -"椐>jū|\\\ ;" -"猗>yī|\\\ ;" -"嶷>yí|\\\ ;" -"啵>bō|\\\ ;" -"莒>jǔ|\\\ ;" -"鼙>pí|\\\ ;" -"埸>yì|\\\ ;" -"僖>xī|\\\ ;" -"佤>wǎ|\\\ ;" -"鬲>gé|\\\ ;" -"僳>sù|\\\ ;" -"髀>bì|\\\ ;" -"鏊>áo|\\\ ;" -"麸>fū|\\\ ;" -"蜞>qí|\\\ ;" -"瘐>yǔ|\\\ ;" -"纡>yū|\\\ ;" -"嫒>ài|\\\ ;" -"阈>yù|\\\ ;" -"蘖>bì|\\\ ;" -"蓠>lí|\\\ ;" -"勖>xù|\\\ ;" -"伛>yǔ|\\\ ;" -"麴>qú|\\\ ;" -"窳>yǔ|\\\ ;" -"癔>yì|\\\ ;" -"鹚>zī|\\\ ;" -"秭>zǐ|\\\ ;" -"镒>yì|\\\ ;" -"黻>fú|\\\ ;" -"顼>xù|\\\ ;" -"洎>jì|\\\ ;" -"岈>yá|\\\ ;" -"吡>bǐ|\\\ ;" -"菰>gū|\\\ ;" -"萁>qí|\\\ ;" -"莜>dí|\\\ ;" -"圬>wū|\\\ ;" -"刳>kū|\\\ ;" -"捌>bā|\\\ ;" -"雎>jū|\\\ ;" -"羝>dī|\\\ ;" -"笥>sì|\\\ ;" -"鹈>tí|\\\ ;" -"燠>yù|\\\ ;" -"戢>jí|\\\ ;" -"殂>cú|\\\ ;" -"椟>dú|\\\ ;" -"骐>qí|\\\ ;" -"婺>wù|\\\ ;" -"庑>wǔ|\\\ ;" -"堍>tù|\\\ ;" -"坻>dǐ|\\\ ;" -"劬>qú|\\\ ;" -"郫>pí|\\\ ;" -"阝>fù|\\\ ;" -"刈>yì|\\\ ;" -"觫>sù|\\\ ;" -"筚>bì|\\\ ;" -"笄>jī|\\\ ;" -"痦>wù|\\\ ;" -"镉>gé|\\\ ;" -"铵>ān|\\\ ;" -"氩>yà|\\\ ;" -"骒>kè|\\\ ;" -"嬖>bì|\\\ ;" -"姒>sì|\\\ ;" -"濞>pì|\\\ ;" -"汔>qì|\\\ ;" -"徂>cú|\\\ ;" -"嗉>sù|\\\ ;" -"揠>yà|\\\ ;" -"蓰>xǐ|\\\ ;" -"葸>xǐ|\\\ ;" -"菟>tù|\\\ ;" -"垭>wù|\\\ ;" -"垡>fá|\\\ ;" -"谡>sù|\\\ ;" -"蚜>yá|\\\ ;" -"趑>cī|\\\ ;" -"糸>mì|\\\ ;" -"疋>pǐ|\\\ ;" -"疠>lì|\\\ ;" -"鹕>hú|\\\ ;" -"鸬>lú|\\\ ;" -"镱>yì|\\\ ;" -"钕>nǚ|\\\ ;" -"硖>ái|\\\ ;" -"氪>kè|\\\ ;" -"栌>lú|\\\ ;" -"琊>yé|\\\ ;" -"纟>sī|\\\ ;" -"孥>nú|\\\ ;" -"迮>zé|\\\ ;" -"滹>hū|\\\ ;" -"溽>rù|\\\ ;" -"怿>yì|\\\ ;" -"莩>fú|\\\ ;" -"荜>bì|\\\ ;" -"苴>jū|\\\ ;" -"垆>lú|\\\ ;" -"劓>yì|\\\ ;" -"锑>tī|\\\ ;" -"髑>dú|\\\ ;" -"觜>zī|\\\ ;" -"跽>jì|\\\ ;" -"醯>xī|\\\ ;" -"酤>gū|\\\ ;" -"粝>lì|\\\ ;" -"敉>mǐ|\\\ ;" -"簏>lù|\\\ ;" -"筢>pá|\\\ ;" -"蚨>fú|\\\ ;" -"虮>jī|\\\ ;" -"秕>bǐ|\\\ ;" -"镝>dí|\\\ ;" -"钯>bǎ|\\\ ;" -"盍>hé|\\\ ;" -"碲>dì|\\\ ;" -"烀>hū|\\\ ;" -"欷>xī|\\\ ;" -"臌>gǔ|\\\ ;" -"朐>qú|\\\ ;" -"檗>bò|\\\ ;" -"榉>jǔ|\\\ ;" -"栎>lì|\\\ ;" -"璩>qú|\\\ ;" -"琚>jū|\\\ ;" -"绂>fú|\\\ ;" -"嫫>mó|\\\ ;" -"溆>xù|\\\ ;" -"浯>wú|\\\ ;" -"饫>yù|\\\ ;" -"猁>lì|\\\ ;" -"嗍>má|\\\ ;" -"蕲>qí|\\\ ;" -"蔌>sù|\\\ ;" -"荑>tí|\\\ ;" -"堀>kū|\\\ ;" -"诶>āi|\\\ ;" -"鲵>ní|\\\ ;" -"貔>pí|\\\ ;" -"跗>fū|\\\ ;" -"綮>qǐ|\\\ ;" -"翮>hé|\\\ ;" -"笫>zǐ|\\\ ;" -"螅>xī|\\\ ;" -"聱>áo|\\\ ;" -"窬>yú|\\\ ;" -"疬>lì|\\\ ;" -"铒>èr|\\\ ;" -"罘>fú|\\\ ;" -"磲>qú|\\\ ;" -"觳>hú|\\\ ;" -"氆>pǔ|\\\ ;" -"氇>lǔ|\\\ ;" -"犋>jù|\\\ ;" -"觌>dí|\\\ ;" -"昃>zè|\\\ ;" -"槠>qī|\\\ ;" -"杌>wù|\\\ ;" -"缡>lí|\\\ ;" -"绨>tí|\\\ ;" -"溻>tā|\\\ ;" -"涑>sù|\\\ ;" -"泺>bó|\\\ ;" -"汜>sì|\\\ ;" -"犸>mà|\\\ ;" -"嵫>zī|\\\ ;" -"嗌>yì|\\\ ;" -"擗>pǐ|\\\ ;" -"蔟>cù|\\\ ;" -"苡>yǐ|\\\ ;" -"芰>jì|\\\ ;" -"郛>fú|\\\ ;" -"俣>yǔ|\\\ ;" -"伲>nǐ|\\\ ;" -"仳>pǐ|\\\ ;" -"鼯>wú|\\\ ;" -"魃>bá|\\\ ;" -"髂>gé|\\\ ;" -"鲴>gù|\\\ ;" -"鲅>bō|\\\ ;" -"雩>yú|\\\ ;" -"貊>mò|\\\ ;" -"踣>bó|\\\ ;" -"醵>jù|\\\ ;" -"粢>zī|\\\ ;" -"襞>bì|\\\ ;" -"舄>xì|\\\ ;" -"舁>yú|\\\ ;" -"笪>dá|\\\ ;" -"蛴>qí|\\\ ;" -"耜>sì|\\\ ;" -"裼>tì|\\\ ;" -"穸>xì|\\\ ;" -"皤>pó|\\\ ;" -"镆>mò|\\\ ;" -"锔>jū|\\\ ;" -"铷>rǔ|\\\ ;" -"铍>pī|\\\ ;" -"铌>nǐ|\\\ ;" -"钼>mù|\\\ ;" -"钋>pò|\\\ ;" -"畀>bì|\\\ ;" -"眍>ōu|\\\ ;" -"黼>fǔ|\\\ ;" -"砑>yà|\\\ ;" -"慝>tè|\\\ ;" -"脒>mǐ|\\\ ;" -"牿>gù|\\\ ;" -"甓>pì|\\\ ;" -"槭>cù|\\\ ;" -"屦>jù|\\\ ;" -"逖>tì|\\\ ;" -"迕>wù|\\\ ;" -"滗>bǐ|\\\ ;" -"洳>rù|\\\ ;" -"洫>xù|\\\ ;" -"庳>bì|\\\ ;" -"屺>qǐ|\\\ ;" -"幞>fú|\\\ ;" -"帻>zé|\\\ ;" -"哜>jì|\\\ ;" -"揞>ǎn|\\\ ;" -"蕖>qú|\\\ ;" -"蓐>rù|\\\ ;" -"菹>jū|\\\ ;" -"埯>ǎn|\\\ ;" -"埚>bù|\\\ ;" -"隰>xí|\\\ ;" -"阢>wù|\\\ ;" -"佾>yì|\\\ ;" -"柒>qī|\\\ ;" -"幂>mì|\\\ ;" -"骶>dǐ|\\\ ;" -"鳎>tà|\\\ ;" -"鳆>fù|\\\ ;" -"鲻>zī|\\\ ;" -"鲡>lí|\\\ ;" -"鋈>wù|\\\ ;" -"舾>xī|\\\ ;" -"舭>bǐ|\\\ ;" -"舣>yǐ|\\\ ;" -"衄>nǜ|\\\ ;" -"箦>zé|\\\ ;" -"虼>gè|\\\ ;" -"虍>hū|\\\ ;" -"耱>mò|\\\ ;" -"瘘>lǘ|\\\ ;" -"鸸>ér|\\\ ;" -"镎>ná|\\\ ;" -"钲>gú|\\\ ;" -"钭>pá|\\\ ;" -"恧>nǜ|\\\ ;" -"祓>fú|\\\ ;" -"觋>xí|\\\ ;" -"晡>bū|\\\ ;" -"轹>lì|\\\ ;" -"殪>yì|\\\ ;" -"缂>kè|\\\ ;" -"嫠>lí|\\\ ;" -"艴>fú|\\\ ;" -"逯>lù|\\\ ;" -"澌>sī|\\\ ;" -"滏>fǔ|\\\ ;" -"廒>áo|\\\ ;" -"庀>pǐ|\\\ ;" -"猊>ní|\\\ ;" -"狴>bì|\\\ ;" -"犴>àn|\\\ ;" -"峄>yì|\\\ ;" -"岵>hù|\\\ ;" -"嘧>mì|\\\ ;" -"呋>fū|\\\ ;" -"蘧>qú|\\\ ;" -"菔>fú|\\\ ;" -"芴>wù|\\\ ;" -"塥>gé|\\\ ;" -"埤>pí|\\\ ;" -"坭>ní|\\\ ;" -"凵>qū|\\\ ;" -"哿>gě|\\\ ;" -"诎>qù|\\\ ;" -"兕>sì|\\\ ;" -"仡>yì|\\\ ;" -"赜>zé|\\\ ;" -"㐅>wǔ|\\\ ;" -"㐌>sì|\\\ ;" -"㐖>yè|\\\ ;" -"㐨>xù|\\\ ;" -"㐳>wù|\\\ ;" -"㐷>mǎ|\\\ ;" -"㐹>yì|\\\ ;" -"㑃>ǎo|\\\ ;" -"㑄>wǔ|\\\ ;" -"㑉>sù|\\\ ;" -"㑊>yì|\\\ ;" -"㑔>xǔ|\\\ ;" -"㑛>sù|\\\ ;" -"㑜>yì|\\\ ;" -"㑥>yì|\\\ ;" -"㑦>lì|\\\ ;" -"㑧>jì|\\\ ;" -"㑨>yǔ|\\\ ;" -"㑯>xǔ|\\\ ;" -"㑶>xì|\\\ ;" -"㑸>ǎi|\\\ ;" -"㑻>mà|\\\ ;" -"㒁>yǔ|\\\ ;" -"㒂>kù|\\\ ;" -"㒃>èr|\\\ ;" -"㒅>qǐ|\\\ ;" -"㒇>mù|\\\ ;" -"㒊>sè|\\\ ;" -"㒎>sǎ|\\\ ;" -"㒒>pú|\\\ ;" -"㒓>tà|\\\ ;" -"㒖>ǒu|\\\ ;" -"㒜>yú|\\\ ;" -"㒧>lì|\\\ ;" -"㒫>jì|\\\ ;" -"㒴>gǔ|\\\ ;" -"㒿>lí|\\\ ;" -"㓐>lù|\\\ ;" -"㓖>bì|\\\ ;" -"㓘>sù|\\\ ;" -"㓞>qì|\\\ ;" -"㓡>fǔ|\\\ ;" -"㓨>cí|\\\ ;" -"㓭>hé|\\\ ;" -"㓯>lí|\\\ ;" -"㓷>yì|\\\ ;" -"㔄>sù|\\\ ;" -"㔏>lì|\\\ ;" -"㔒>xí|\\\ ;" -"㔕>jí|\\\ ;" -"㔜>bá|\\\ ;" -"㔠>hé|\\\ ;" -"㔥>pí|\\\ ;" -"㔪>lǔ|\\\ ;" -"㔱>yǔ|\\\ ;" -"㔴>yì|\\\ ;" -"㔹>lè|\\\ ;" -"㕆>hù|\\\ ;" -"㕇>lá|\\\ ;" -"㕉>kè|\\\ ;" -"㕌>ài|\\\ ;" -"㕖>sù|\\\ ;" -"㕛>xù|\\\ ;" -"㕡>hé|\\\ ;" -"㕥>yǐ|\\\ ;" -"㕭>ào|\\\ ;" -"㕮>fǔ|\\\ ;" -"㕰>hè|\\\ ;" -"㕸>lì|\\\ ;" -"㕹>fá|\\\ ;" -"㕽>sì|\\\ ;" -"㖀>lè|\\\ ;" -"㖂>yì|\\\ ;" -"㖅>xù|\\\ ;" -"㖆>qú|\\\ ;" -"㖇>ér|\\\ ;" -"㖒>tí|\\\ ;" -"㖕>bò|\\\ ;" -"㖠>bà|\\\ ;" -"㖡>yè|\\\ ;" -"㖢>jí|\\\ ;" -"㖨>lù|\\\ ;" -"㖶>yè|\\\ ;" -"㖽>zé|\\\ ;" -"㗅>hú|\\\ ;" -"㗆>gé|\\\ ;" -"㗉>bì|\\\ ;" -"㗊>jí|\\\ ;" -"㗒>ài|\\\ ;" -"㗘>bó|\\\ ;" -"㗙>nà|\\\ ;" -"㗚>lì|\\\ ;" -"㗣>tì|\\\ ;" -"㗤>cù|\\\ ;" -"㗨>ǎi|\\\ ;" -"㗱>jí|\\\ ;" -"㗳>tǎ|\\\ ;" -"㗵>xù|\\\ ;" -"㗼>yè|\\\ ;" -"㘁>yì|\\\ ;" -"㘂>cí|\\\ ;" -"㘈>yī|\\\ ;" -"㘊>yì|\\\ ;" -"㘌>jù|\\\ ;" -"㘍>jí|\\\ ;" -"㘑>lì|\\\ ;" -"㘠>bì|\\\ ;" -"㘧>xù|\\\ ;" -"㘩>bì|\\\ ;" -"㘬>ào|\\\ ;" -"㘭>ào|\\\ ;" -"㘲>jú|\\\ ;" -"㘵>bù|\\\ ;" -"㘷>ài|\\\ ;" -"㘹>cí|\\\ ;" -"㘺>fá|\\\ ;" -"㙄>bì|\\\ ;" -"㙏>fù|\\\ ;" -"㙑>yǔ|\\\ ;" -"㙒>yě|\\\ ;" -"㙛>bǔ|\\\ ;" -"㙠>yì|\\\ ;" -"㙨>jì|\\\ ;" -"㙪>yè|\\\ ;" -"㙫>jí|\\\ ;" -"㙯>yì|\\\ ;" -"㙾>xì|\\\ ;" -"㚆>fù|\\\ ;" -"㚉>gǔ|\\\ ;" -"㚕>fú|\\\ ;" -"㚛>xì|\\\ ;" -"㚜>xù|\\\ ;" -"㚡>jǐ|\\\ ;" -"㚢>nú|\\\ ;" -"㚤>yì|\\\ ;" -"㚥>yú|\\\ ;" -"㚦>yí|\\\ ;" -"㚰>bǐ|\\\ ;" -"㚴>bù|\\\ ;" -"㚶>sì|\\\ ;" -"㚷>ěr|\\\ ;" -"㛅>èr|\\\ ;" -"㛏>òu|\\\ ;" -"㛕>yì|\\\ ;" -"㛘>pò|\\\ ;" -"㛥>tà|\\\ ;" -"㛬>lù|\\\ ;" -"㛲>fà|\\\ ;" -"㜅>xù|\\\ ;" -"㜆>mì|\\\ ;" -"㜈>mù|\\\ ;" -"㜋>yì|\\\ ;" -"㜎>qí|\\\ ;" -"㜑>fú|\\\ ;" -"㜒>yì|\\\ ;" -"㜓>dá|\\\ ;" -"㜘>jù|\\\ ;" -"㜙>lù|\\\ ;" -"㜚>sù|\\\ ;" -"㜜>ào|\\\ ;" -"㜝>ǎn|\\\ ;" -"㜨>ér|\\\ ;" -"㜩>ào|\\\ ;" -"㜫>mà|\\\ ;" -"㜷>mí|\\\ ;" -"㜹>qú|\\\ ;" -"㜽>zǐ|\\\ ;" -"㜿>xù|\\\ ;" -"㝓>gé|\\\ ;" -"㝖>yí|\\\ ;" -"㝛>sù|\\\ ;" -"㝞>yà|\\\ ;" -"㝢>yǔ|\\\ ;" -"㝣>yè|\\\ ;" -"㝥>mǐ|\\\ ;" -"㝵>dé|\\\ ;" -"㝶>ài|\\\ ;" -"㝿>bó|\\\ ;" -"㞃>jí|\\\ ;" -"㞆>jǐ|\\\ ;" -"㞊>xù|\\\ ;" -"㞎>bǎ|\\\ ;" -"㞐>jū|\\\ ;" -"㞒>xì|\\\ ;" -"㞓>qǐ|\\\ ;" -"㞔>yí|\\\ ;" -"㞖>cì|\\\ ;" -"㞚>qì|\\\ ;" -"㞛>jǐ|\\\ ;" -"㞦>jǐ|\\\ ;" -"㞫>jù|\\\ ;" -"㞰>xǔ|\\\ ;" -"㞹>kě|\\\ ;" -"㞺>zú|\\\ ;" -"㞾>ní|\\\ ;" -"㟁>àn|\\\ ;" -"㟊>fú|\\\ ;" -"㟑>bó|\\\ ;" -"㟓>qí|\\\ ;" -"㟚>qí|\\\ ;" -"㟜>mí|\\\ ;" -"㟢>qí|\\\ ;" -"㟤>lù|\\\ ;" -"㟳>lì|\\\ ;" -"㟷>dā|\\\ ;" -"㟼>áo|\\\ ;" -"㠂>áo|\\\ ;" -"㠄>xí|\\\ ;" -"㠅>fú|\\\ ;" -"㠍>jí|\\\ ;" -"㠎>jí|\\\ ;" -"㠖>jì|\\\ ;" -"㠗>ào|\\\ ;" -"㠘>yǔ|\\\ ;" -"㠛>wò|\\\ ;" -"㠜>nì|\\\ ;" -"㠟>lí|\\\ ;" -"㠠>lú|\\\ ;" -"㠥>lǜ|\\\ ;" -"㠧>mí|\\\ ;" -"㠨>yù|\\\ ;" -"㠪>jù|\\\ ;" -"㠯>yǐ|\\\ ;" -"㠱>jì|\\\ ;" -"㠲>bǐ|\\\ ;" -"㠷>gé|\\\ ;" -"㠸>kù|\\\ ;" -"㠿>cǐ|\\\ ;" -"㡀>bì|\\\ ;" -"㡂>lì|\\\ ;" -"㡇>jí|\\\ ;" -"㡔>wù|\\\ ;" -"㡗>tí|\\\ ;" -"㡙>bì|\\\ ;" -"㡫>yì|\\\ ;" -"㡭>jì|\\\ ;" -"㡮>jí|\\\ ;" -"㡰>yǔ|\\\ ;" -"㡳>dǐ|\\\ ;" -"㡶>jì|\\\ ;" -"㡹>cì|\\\ ;" -"㡼>yì|\\\ ;" -"㢀>cì|\\\ ;" -"㢊>ǎi|\\\ ;" -"㢚>lǔ|\\\ ;" -"㢞>yì|\\\ ;" -"㢩>dì|\\\ ;" -"㢰>bì|\\\ ;" -"㢳>lú|\\\ ;" -"㢶>bì|\\\ ;" -"㢸>bì|\\\ ;" -"㢽>ěr|\\\ ;" -"㣂>yì|\\\ ;" -"㣃>yǔ|\\\ ;" -"㣄>qú|\\\ ;" -"㣆>mí|\\\ ;" -"㣇>nǐ|\\\ ;" -"㣈>sì|\\\ ;" -"㣎>mù|\\\ ;" -"㣙>dí|\\\ ;" -"㣛>tà|\\\ ;" -"㣟>xì|\\\ ;" -"㣢>tí|\\\ ;" -"㣬>qì|\\\ ;" -"㣱>zé|\\\ ;" -"㣵>tà|\\\ ;" -"㣻>yì|\\\ ;" -"㤂>jí|\\\ ;" -"㤅>ài|\\\ ;" -"㤇>ǎo|\\\ ;" -"㤔>fú|\\\ ;" -"㤡>lì|\\\ ;" -"㤢>xù|\\\ ;" -"㤤>yú|\\\ ;" -"㤦>lì|\\\ ;" -"㤩>kè|\\\ ;" -"㤫>dé|\\\ ;" -"㤱>fù|\\\ ;" -"㤴>xí|\\\ ;" -"㤵>cí|\\\ ;" -"㤸>xì|\\\ ;" -"㥀>dé|\\\ ;" -"㥁>dé|\\\ ;" -"㥂>tè|\\\ ;" -"㥌>jú|\\\ ;" -"㥍>jì|\\\ ;" -"㥓>qǐ|\\\ ;" -"㥔>yú|\\\ ;" -"㥚>yú|\\\ ;" -"㥛>jí|\\\ ;" -"㥝>mǐ|\\\ ;" -"㥠>xǔ|\\\ ;" -"㥡>xì|\\\ ;" -"㥥>yú|\\\ ;" -"㥴>yí|\\\ ;" -"㥶>sè|\\\ ;" -"㥷>yè|\\\ ;" -"㥺>hé|\\\ ;" -"㥽>cè|\\\ ;" -"㥾>nì|\\\ ;" -"㥿>ào|\\\ ;" -"㦄>má|\\\ ;" -"㦅>dì|\\\ ;" -"㦇>lù|\\\ ;" -"㦉>yì|\\\ ;" -"㦐>nì|\\\ ;" -"㦒>lí|\\\ ;" -"㦛>yú|\\\ ;" -"㦡>lè|\\\ ;" -"㦤>yì|\\\ ;" -"㦦>hè|\\\ ;" -"㦱>wǒ|\\\ ;" -"㦴>gé|\\\ ;" -"㦸>jǐ|\\\ ;" -"㦺>rǔ|\\\ ;" -"㦻>xí|\\\ ;" -"㦽>xù|\\\ ;" -"㦾>yí|\\\ ;" -"㦿>hù|\\\ ;" -"㧀>jí|\\\ ;" -"㧁>qù|\\\ ;" -"㧅>mù|\\\ ;" -"㧊>bá|\\\ ;" -"㧎>yá|\\\ ;" -"㧗>zǐ|\\\ ;" -"㧙>bì|\\\ ;" -"㧚>wǎ|\\\ ;" -"㧫>ér|\\\ ;" -"㧰>lì|\\\ ;" -"㧳>bó|\\\ ;" -"㧴>wǒ|\\\ ;" -"㧹>tè|\\\ ;" -"㧺>tà|\\\ ;" -"㧽>gù|\\\ ;" -"㨇>pó|\\\ ;" -"㨈>jǐ|\\\ ;" -"㨎>rú|\\\ ;" -"㨐>bǔ|\\\ ;" -"㨞>sù|\\\ ;" -"㨠>mì|\\\ ;" -"㨥>nà|\\\ ;" -"㨭>hù|\\\ ;" -"㨰>gé|\\\ ;" -"㨲>cè|\\\ ;" -"㨸>mà|\\\ ;" -"㨽>pǐ|\\\ ;" -"㨿>jù|\\\ ;" -"㩀>jù|\\\ ;" -"㩋>sù|\\\ ;" -"㩍>cè|\\\ ;" -"㩎>yè|\\\ ;" -"㩗>xí|\\\ ;" -"㩘>yǐ|\\\ ;" -"㩞>cì|\\\ ;" -"㩢>mí|\\\ ;" -"㩧>bó|\\\ ;" -"㩩>qǐ|\\\ ;" -"㩭>bó|\\\ ;" -"㩴>jú|\\\ ;" -"㩽>qí|\\\ ;" -"㪀>yú|\\\ ;" -"㪃>kě|\\\ ;" -"㪄>fú|\\\ ;" -"㪆>dǐ|\\\ ;" -"㪉>hé|\\\ ;" -"㪍>bó|\\\ ;" -"㪏>bǐ|\\\ ;" -"㪐>lù|\\\ ;" -"㪑>yè|\\\ ;" -"㪒>ní|\\\ ;" -"㪖>lù|\\\ ;" -"㪙>kě|\\\ ;" -"㪡>kě|\\\ ;" -"㪤>bì|\\\ ;" -"㪩>sù|\\\ ;" -"㪪>sà|\\\ ;" -"㪭>lú|\\\ ;" -"㪶>hú|\\\ ;" -"㪼>kě|\\\ ;" -"㪾>gé|\\\ ;" -"㫊>yǐ|\\\ ;" -"㫓>qǐ|\\\ ;" -"㫘>mì|\\\ ;" -"㫙>fú|\\\ ;" -"㫢>qù|\\\ ;" -"㫽>lù|\\\ ;" -"㬂>yú|\\\ ;" -"㬍>bó|\\\ ;" -"㬏>lì|\\\ ;" -"㬘>sù|\\\ ;" -"㬞>hè|\\\ ;" -"㬥>pù|\\\ ;" -"㬧>bó|\\\ ;" -"㬬>jù|\\\ ;" -"㬰>yú|\\\ ;" -"㬱>tì|\\\ ;" -"㬳>wǔ|\\\ ;" -"㬼>fù|\\\ ;" -"㭒>sì|\\\ ;" -"㭔>lú|\\\ ;" -"㭘>hé|\\\ ;" -"㭚>lǚ|\\\ ;" -"㭡>xì|\\\ ;" -"㭰>jì|\\\ ;" -"㭱>hé|\\\ ;" -"㭲>jí|\\\ ;" -"㭸>tú|\\\ ;" -"㭼>tà|\\\ ;" -"㭽>dǐ|\\\ ;" -"㮂>jú|\\\ ;" -"㮑>qì|\\\ ;" -"㮕>ér|\\\ ;" -"㮚>lì|\\\ ;" -"㮝>hé|\\\ ;" -"㮟>jí|\\\ ;" -"㮦>sè|\\\ ;" -"㮨>jí|\\\ ;" -"㮫>hé|\\\ ;" -"㮰>bí|\\\ ;" -"㮿>bì|\\\ ;" -"㯅>pí|\\\ ;" -"㯇>bì|\\\ ;" -"㯈>sù|\\\ ;" -"㯏>gǔ|\\\ ;" -"㯓>tà|\\\ ;" -"㯖>dé|\\\ ;" -"㯚>dá|\\\ ;" -"㯛>hú|\\\ ;" -"㯝>lù|\\\ ;" -"㯟>lù|\\\ ;" -"㯤>lì|\\\ ;" -"㯦>qí|\\\ ;" -"㯩>tì|\\\ ;" -"㯫>qú|\\\ ;" -"㯭>lǔ|\\\ ;" -"㯷>pú|\\\ ;" -"㰀>lí|\\\ ;" -"㰅>dí|\\\ ;" -"㰗>cù|\\\ ;" -"㰘>yí|\\\ ;" -"㰚>lí|\\\ ;" -"㰝>yǐ|\\\ ;" -"㰟>jì|\\\ ;" -"㰣>zì|\\\ ;" -"㰤>kě|\\\ ;" -"㰦>qù|\\\ ;" -"㰪>wá|\\\ ;" -"㰲>xù|\\\ ;" -"㰳>yà|\\\ ;" -"㰴>pó|\\\ ;" -"㰵>zú|\\\ ;" -"㰷>zì|\\\ ;" -"㰻>yǐ|\\\ ;" -"㰽>mǐ|\\\ ;" -"㱄>mò|\\\ ;" -"㱅>yì|\\\ ;" -"㱇>sè|\\\ ;" -"㱉>yè|\\\ ;" -"㱘>àn|\\\ ;" -"㱞>jí|\\\ ;" -"㱟>bó|\\\ ;" -"㱧>wò|\\\ ;" -"㱩>dú|\\\ ;" -"㱯>ái|\\\ ;" -"㱲>yì|\\\ ;" -"㱳>mò|\\\ ;" -"㱴>zì|\\\ ;" -"㱸>bì|\\\ ;" -"㱹>lì|\\\ ;" -"㱺>lú|\\\ ;" -"㲅>jì|\\\ ;" -"㲘>qú|\\\ ;" -"㲞>zú|\\\ ;" -"㲫>pú|\\\ ;" -"㲶>lǜ|\\\ ;" -"㲺>jí|\\\ ;" -"㲻>nì|\\\ ;" -"㲼>yì|\\\ ;" -"㲾>yǔ|\\\ ;" -"㳁>zè|\\\ ;" -"㳇>fù|\\\ ;" -"㳍>bù|\\\ ;" -"㳐>sà|\\\ ;" -"㳑>yì|\\\ ;" -"㳚>yù|\\\ ;" -"㳛>yú|\\\ ;" -"㳠>tà|\\\ ;" -"㳥>jù|\\\ ;" -"㳧>xí|\\\ ;" -"㳫>tà|\\\ ;" -"㳴>mì|\\\ ;" -"㳵>jì|\\\ ;" -"㳻>zé|\\\ ;" -"㳼>bì|\\\ ;" -"㳽>mǐ|\\\ ;" -"㴁>yì|\\\ ;" -"㴉>jǐ|\\\ ;" -"㴋>sù|\\\ ;" -"㴑>sù|\\\ ;" -"㴒>yì|\\\ ;" -"㴔>sè|\\\ ;" -"㴕>jí|\\\ ;" -"㴝>lí|\\\ ;" -"㴵>mì|\\\ ;" -"㴸>nà|\\\ ;" -"㴼>sù|\\\ ;" -"㴾>bó|\\\ ;" -"㵋>mì|\\\ ;" -"㵑>hè|\\\ ;" -"㵖>nǜ|\\\ ;" -"㵗>fù|\\\ ;" -"㵝>yì|\\\ ;" -"㵣>kě|\\\ ;" -"㵥>bì|\\\ ;" -"㵧>gé|\\\ ;" -"㵨>bì|\\\ ;" -"㵩>yì|\\\ ;" -"㵫>nǐ|\\\ ;" -"㵰>xù|\\\ ;" -"㵲>wǔ|\\\ ;" -"㵿>xí|\\\ ;" -"㶚>bà|\\\ ;" -"㶛>yú|\\\ ;" -"㶠>yì|\\\ ;" -"㶿>bó|\\\ ;" -"㷎>hè|\\\ ;" -"㷒>yú|\\\ ;" -"㷤>hè|\\\ ;" -"㷦>xù|\\\ ;" -"㷬>mò|\\\ ;" -"㷰>lí|\\\ ;" -"㷴>gé|\\\ ;" -"㷵>mò|\\\ ;" -"㷻>wú|\\\ ;" -"㸄>jì|\\\ ;" -"㸊>là|\\\ ;" -"㸍>xì|\\\ ;" -"㸏>mí|\\\ ;" -"㸓>mì|\\\ ;" -"㸚>lǐ|\\\ ;" -"㸣>yè|\\\ ;" -"㸦>hù|\\\ ;" -"㸩>àn|\\\ ;" -"㸻>sì|\\\ ;" -"㸿>dú|\\\ ;" -"㹀>bó|\\\ ;" -"㹂>cì|\\\ ;" -"㹃>bì|\\\ ;" -"㹄>jì|\\\ ;" -"㹇>hé|\\\ ;" -"㹈>lí|\\\ ;" -"㹍>dí|\\\ ;" -"㹑>sì|\\\ ;" -"㹒>pǔ|\\\ ;" -"㹓>yì|\\\ ;" -"㹘>rú|\\\ ;" -"㹫>xì|\\\ ;" -"㹭>yì|\\\ ;" -"㹮>mò|\\\ ;" -"㹱>hú|\\\ ;" -"㹳>wú|\\\ ;" -"㹸>ní|\\\ ;" -"㹺>tà|\\\ ;" -"㺄>yǔ|\\\ ;" -"㺉>hù|\\\ ;" -"㺚>tǎ|\\\ ;" -"㺞>yú|\\\ ;" -"㺡>lì|\\\ ;" -"㺪>pú|\\\ ;" -"㺭>zǐ|\\\ ;" -"㺮>yú|\\\ ;" -"㺷>xù|\\\ ;" -"㺿>yí|\\\ ;" -"㻉>bù|\\\ ;" -"㻋>là|\\\ ;" -"㻌>tú|\\\ ;" -"㻍>wú|\\\ ;" -"㻎>lì|\\\ ;" -"㻑>jì|\\\ ;" -"㻝>là|\\\ ;" -"㻠>tú|\\\ ;" -"㻫>bì|\\\ ;" -"㻬>tú|\\\ ;" -"㻭>sè|\\\ ;" -"㻯>tú|\\\ ;" -"㻲>lǚ|\\\ ;" -"㻶>bǐ|\\\ ;" -"㻷>jí|\\\ ;" -"㻺>lì|\\\ ;" -"㼋>gǔ|\\\ ;" -"㼌>yǔ|\\\ ;" -"㼖>lì|\\\ ;" -"㼘>wǎ|\\\ ;" -"㼤>qì|\\\ ;" -"㼴>ǒu|\\\ ;" -"㼵>dì|\\\ ;" -"㼶>yú|\\\ ;" -"㼾>lù|\\\ ;" -"㽁>lì|\\\ ;" -"㽂>sà|\\\ ;" -"㽈>yì|\\\ ;" -"㽝>lì|\\\ ;" -"㽢>ǎn|\\\ ;" -"㽣>yù|\\\ ;" -"㽤>jú|\\\ ;" -"㽬>fù|\\\ ;" -"㽯>xí|\\\ ;" -"㽺>jí|\\\ ;" -"㽽>gù|\\\ ;" -"㽾>wù|\\\ ;" -"㾄>dú|\\\ ;" -"㾅>sì|\\\ ;" -"㾇>mù|\\\ ;" -"㾈>fù|\\\ ;" -"㾊>jí|\\\ ;" -"㾐>lì|\\\ ;" -"㾑>dá|\\\ ;" -"㾒>jì|\\\ ;" -"㾔>lǚ|\\\ ;" -"㾖>lǐ|\\\ ;" -"㾟>bù|\\\ ;" -"㾥>xù|\\\ ;" -"㾧>kè|\\\ ;" -"㾨>qǐ|\\\ ;" -"㾰>hú|\\\ ;" -"㾵>jì|\\\ ;" -"㾶>gǔ|\\\ ;" -"㾺>mà|\\\ ;" -"㿄>ài|\\\ ;" -"㿇>xí|\\\ ;" -"㿖>lú|\\\ ;" -"㿙>pì|\\\ ;" -"㿛>lí|\\\ ;" -"㿣>hé|\\\ ;" -"㿥>hú|\\\ ;" -"㿨>lì|\\\ ;" -"㿫>bì|\\\ ;" -"㿯>dá|\\\ ;" -"㿰>áo|\\\ ;" -"㿹>tà|\\\ ;" -"㿿>yǎ|\\\ ;" -"䀇>gǔ|\\\ ;" -"䀈>qì|\\\ ;" -"䀑>nà|\\\ ;" -"䀘>xí|\\\ ;" -"䀙>qì|\\\ ;" -"䀜>gǔ|\\\ ;" -"䀠>qú|\\\ ;" -"䀣>bì|\\\ ;" -"䀦>gǔ|\\\ ;" -"䀯>bǔ|\\\ ;" -"䀰>gǔ|\\\ ;" -"䀲>mù|\\\ ;" -"䀳>ài|\\\ ;" -"䀸>dì|\\\ ;" -"䀾>dǔ|\\\ ;" -"䀿>dì|\\\ ;" -"䁆>ǎn|\\\ ;" -"䁇>mì|\\\ ;" -"䁈>qì|\\\ ;" -"䁉>qì|\\\ ;" -"䁊>wò|\\\ ;" -"䁌>yù|\\\ ;" -"䁒>jí|\\\ ;" -"䁥>nì|\\\ ;" -"䁦>qù|\\\ ;" -"䁩>yú|\\\ ;" -"䁫>hú|\\\ ;" -"䁱>ào|\\\ ;" -"䁹>bì|\\\ ;" -"䁻>lì|\\\ ;" -"䁼>mò|\\\ ;" -"䁿>mò|\\\ ;" -"䂂>qú|\\\ ;" -"䂆>xù|\\\ ;" -"䂊>yù|\\\ ;" -"䂍>bó|\\\ ;" -"䂛>yú|\\\ ;" -"䂡>dǐ|\\\ ;" -"䂣>cí|\\\ ;" -"䂤>fù|\\\ ;" -"䂰>là|\\\ ;" -"䂲>fǎ|\\\ ;" -"䂿>tà|\\\ ;" -"䃊>jǔ|\\\ ;" -"䃋>yú|\\\ ;" -"䃎>zé|\\\ ;" -"䃒>hé|\\\ ;" -"䃖>wù|\\\ ;" -"䃙>lù|\\\ ;" -"䃚>cù|\\\ ;" -"䃤>sù|\\\ ;" -"䃮>dá|\\\ ;" -"䃯>lì|\\\ ;" -"䃳>là|\\\ ;" -"䃺>mó|\\\ ;" -"䃻>bà|\\\ ;" -"䃽>fú|\\\ ;" -"䃾>bǐ|\\\ ;" -"䄁>yì|\\\ ;" -"䄍>dù|\\\ ;" -"䄎>qǐ|\\\ ;" -"䄏>yú|\\\ ;" -"䄔>jǔ|\\\ ;" -"䄜>lí|\\\ ;" -"䄢>qí|\\\ ;" -"䄨>yú|\\\ ;" -"䄫>qǐ|\\\ ;" -"䄬>yí|\\\ ;" -"䄰>yá|\\\ ;" -"䄶>bì|\\\ ;" -"䄸>pò|\\\ ;" -"䄿>yì|\\\ ;" -"䅁>àn|\\\ ;" -"䅂>hé|\\\ ;" -"䅄>lì|\\\ ;" -"䅆>zì|\\\ ;" -"䅇>sù|\\\ ;" -"䅉>yà|\\\ ;" -"䅊>dù|\\\ ;" -"䅓>jǔ|\\\ ;" -"䅖>ǎn|\\\ ;" -"䅞>nà|\\\ ;" -"䅠>tí|\\\ ;" -"䅡>xǔ|\\\ ;" -"䅤>qì|\\\ ;" -"䅬>ài|\\\ ;" -"䅰>ěn|\\\ ;" -"䅲>qí|\\\ ;" -"䅷>tú|\\\ ;" -"䅸>zú|\\\ ;" -"䅻>lí|\\\ ;" -"䅽>gǔ|\\\ ;" -"䆅>cí|\\\ ;" -"䆉>bà|\\\ ;" -"䆟>gé|\\\ ;" -"䆷>yù|\\\ ;" -"䆽>jù|\\\ ;" -"䆿>yì|\\\ ;" -"䇃>sì|\\\ ;" -"䇅>fá|\\\ ;" -"䇐>lì|\\\ ;" -"䇑>bà|\\\ ;" -"䇘>hù|\\\ ;" -"䇢>kǔ|\\\ ;" -"䇣>nà|\\\ ;" -"䇥>zé|\\\ ;" -"䇩>yì|\\\ ;" -"䇱>nà|\\\ ;" -"䇵>yí|\\\ ;" -"䇷>bǐ|\\\ ;" -"䈅>yù|\\\ ;" -"䈋>tà|\\\ ;" -"䈎>yè|\\\ ;" -"䈓>gé|\\\ ;" -"䈘>cí|\\\ ;" -"䈞>dǔ|\\\ ;" -"䈟>cè|\\\ ;" -"䈪>xì|\\\ ;" -"䈫>nà|\\\ ;" -"䈬>pú|\\\ ;" -"䈮>jǔ|\\\ ;" -"䈳>tà|\\\ ;" -"䈸>hú|\\\ ;" -"䈻>pú|\\\ ;" -"䉉>hú|\\\ ;" -"䉑>mó|\\\ ;" -"䉛>yù|\\\ ;" -"䉝>qǐ|\\\ ;" -"䉢>sè|\\\ ;" -"䉨>yì|\\\ ;" -"䉫>lí|\\\ ;" -"䉻>qí|\\\ ;" -"䉾>mì|\\\ ;" -"䉿>hú|\\\ ;" -"䊀>hú|\\\ ;" -"䊂>cè|\\\ ;" -"䊇>bù|\\\ ;" -"䊍>lí|\\\ ;" -"䊐>èn|\\\ ;" -"䊛>sǎ|\\\ ;" -"䊠>xì|\\\ ;" -"䊦>yá|\\\ ;" -"䊧>bì|\\\ ;" -"䊪>lì|\\\ ;" -"䊮>dí|\\\ ;" -"䊳>mí|\\\ ;" -"䊺>gǔ|\\\ ;" -"䊾>mù|\\\ ;" -"䊿>bó|\\\ ;" -"䋈>rú|\\\ ;" -"䋔>bì|\\\ ;" -"䋖>yù|\\\ ;" -"䋙>ěr|\\\ ;" -"䋚>yì|\\\ ;" -"䋛>mí|\\\ ;" -"䋟>jì|\\\ ;" -"䋠>bǔ|\\\ ;" -"䋥>lí|\\\ ;" -"䋧>qú|\\\ ;" -"䋨>fǔ|\\\ ;" -"䋩>ér|\\\ ;" -"䋯>qǐ|\\\ ;" -"䋰>jú|\\\ ;" -"䋵>yì|\\\ ;" -"䋶>xù|\\\ ;" -"䋹>fú|\\\ ;" -"䌂>òu|\\\ ;" -"䌈>tà|\\\ ;" -"䌌>qì|\\\ ;" -"䌏>mì|\\\ ;" -"䌐>mì|\\\ ;" -"䌒>lù|\\\ ;" -"䌔>òu|\\\ ;" -"䌕>mí|\\\ ;" -"䌗>fǔ|\\\ ;" -"䌘>mí|\\\ ;" -"䌚>sù|\\\ ;" -"䌟>bì|\\\ ;" -"䌡>tǐ|\\\ ;" -"䌩>mì|\\\ ;" -"䌺>ěr|\\\ ;" -"䌻>yì|\\\ ;" -"䌿>fú|\\\ ;" -"䍂>yú|\\\ ;" -"䍇>tà|\\\ ;" -"䍌>bù|\\\ ;" -"䍍>gǔ|\\\ ;" -"䍓>hù|\\\ ;" -"䍕>dǐ|\\\ ;" -"䍖>fú|\\\ ;" -"䍘>mí|\\\ ;" -"䍛>gù|\\\ ;" -"䍝>tà|\\\ ;" -"䍞>yù|\\\ ;" -"䍠>lí|\\\ ;" -"䍢>wú|\\\ ;" -"䍤>jǐ|\\\ ;" -"䍦>lí|\\\ ;" -"䍨>bó|\\\ ;" -"䍱>xú|\\\ ;" -"䍸>bó|\\\ ;" -"䍽>lì|\\\ ;" -"䎁>hú|\\\ ;" -"䎅>fù|\\\ ;" -"䎈>yì|\\\ ;" -"䎊>pò|\\\ ;" -"䎋>hè|\\\ ;" -"䎌>cù|\\\ ;" -"䎎>nà|\\\ ;" -"䎏>àn|\\\ ;" -"䎑>lù|\\\ ;" -"䎓>tà|\\\ ;" -"䎘>sù|\\\ ;" -"䎟>ér|\\\ ;" -"䎠>ér|\\\ ;" -"䎢>qǐ|\\\ ;" -"䎣>sì|\\\ ;" -"䎨>àn|\\\ ;" -"䎪>nè|\\\ ;" -"䎬>bà|\\\ ;" -"䎮>tì|\\\ ;" -"䎱>bà|\\\ ;" -"䎳>wà|\\\ ;" -"䎵>bì|\\\ ;" -"䎶>èr|\\\ ;" -"䎸>wù|\\\ ;" -"䎼>lù|\\\ ;" -"䏀>là|\\\ ;" -"䏅>qì|\\\ ;" -"䏋>sù|\\\ ;" -"䏌>qì|\\\ ;" -"䏑>dì|\\\ ;" -"䏘>pǐ|\\\ ;" -"䏞>mò|\\\ ;" -"䏠>qì|\\\ ;" -"䏢>bǐ|\\\ ;" -"䏤>sì|\\\ ;" -"䏧>ná|\\\ ;" -"䏪>èr|\\\ ;" -"䏮>xí|\\\ ;" -"䏱>jú|\\\ ;" -"䏶>bì|\\\ ;" -"䏸>yú|\\\ ;" -"䏽>bù|\\\ ;" -"䏿>qǐ|\\\ ;" -"䐀>jì|\\\ ;" -"䐂>lù|\\\ ;" -"䐅>yí|\\\ ;" -"䐉>zì|\\\ ;" -"䐊>dá|\\\ ;" -"䐕>jí|\\\ ;" -"䐖>yí|\\\ ;" -"䐗>dǔ|\\\ ;" -"䐙>gé|\\\ ;" -"䐚>jí|\\\ ;" -"䐡>qí|\\\ ;" -"䐨>gǔ|\\\ ;" -"䐳>yú|\\\ ;" -"䐼>xì|\\\ ;" -"䐿>áo|\\\ ;" -"䑀>pì|\\\ ;" -"䑁>wù|\\\ ;" -"䑂>ǎi|\\\ ;" -"䑄>pì|\\\ ;" -"䑈>bó|\\\ ;" -"䑑>pú|\\\ ;" -"䑜>tà|\\\ ;" -"䑧>fú|\\\ ;" -"䑭>dì|\\\ ;" -"䑯>dì|\\\ ;" -"䑰>bù|\\\ ;" -"䑴>qí|\\\ ;" -"䑵>mù|\\\ ;" -"䑽>dá|\\\ ;" -"䑿>sù|\\\ ;" -"䒀>fú|\\\ ;" -"䒁>jì|\\\ ;" -"䒄>bó|\\\ ;" -"䒇>fù|\\\ ;" -"䒈>bǔ|\\\ ;" -"䒉>wǔ|\\\ ;" -"䒗>qì|\\\ ;" -"䒤>rì|\\\ ;" -"䒥>fà|\\\ ;" -"䒧>qù|\\\ ;" -"䒩>hé|\\\ ;" -"䒬>mò|\\\ ;" -"䒻>qǐ|\\\ ;" -"䓃>yì|\\\ ;" -"䓅>qí|\\\ ;" -"䓇>xì|\\\ ;" -"䓈>yì|\\\ ;" -"䓉>yé|\\\ ;" -"䓚>cú|\\\ ;" -"䓛>fǔ|\\\ ;" -"䓞>lì|\\\ ;" -"䓠>tà|\\\ ;" -"䓢>gù|\\\ ;" -"䓥>là|\\\ ;" -"䓧>cì|\\\ ;" -"䓫>jì|\\\ ;" -"䓯>dú|\\\ ;" -"䓹>yì|\\\ ;" -"䓼>hè|\\\ ;" -"䓽>jì|\\\ ;" -"䔁>lì|\\\ ;" -"䔂>zǐ|\\\ ;" -"䔃>zǔ|\\\ ;" -"䔆>lí|\\\ ;" -"䔇>qǐ|\\\ ;" -"䔉>lì|\\\ ;" -"䔎>sù|\\\ ;" -"䔓>xǔ|\\\ ;" -"䔕>pú|\\\ ;" -"䔞>lǜ|\\\ ;" -"䔡>yú|\\\ ;" -"䔣>lí|\\\ ;" -"䔧>lí|\\\ ;" -"䔬>yì|\\\ ;" -"䔯>hú|\\\ ;" -"䔰>fú|\\\ ;" -"䔴>cè|\\\ ;" -"䔶>tí|\\\ ;" -"䔼>sè|\\\ ;" -"䔽>ài|\\\ ;" -"䕉>zé|\\\ ;" -"䕍>yì|\\\ ;" -"䕎>fú|\\\ ;" -"䕗>bì|\\\ ;" -"䕡>lǔ|\\\ ;" -"䕣>hé|\\\ ;" -"䕥>nǐ|\\\ ;" -"䕪>zé|\\\ ;" -"䕮>jú|\\\ ;" -"䕳>mí|\\\ ;" -"䕶>hù|\\\ ;" -"䕷>mí|\\\ ;" -"䕹>zá|\\\ ;" -"䕻>gé|\\\ ;" -"䖁>yì|\\\ ;" -"䖇>yù|\\\ ;" -"䖊>yí|\\\ ;" -"䖑>mì|\\\ ;" -"䖓>nà|\\\ ;" -"䖕>zǔ|\\\ ;" -"䖘>tú|\\\ ;" -"䖡>nǜ|\\\ ;" -"䖥>lí|\\\ ;" -"䖧>nà|\\\ ;" -"䖩>bì|\\\ ;" -"䖪>cí|\\\ ;" -"䖽>lí|\\\ ;" -"䖿>lí|\\\ ;" -"䗁>jì|\\\ ;" -"䗂>hǔ|\\\ ;" -"䗄>fǔ|\\\ ;" -"䗇>jú|\\\ ;" -"䗍>lǐ|\\\ ;" -"䗑>yì|\\\ ;" -"䗘>gé|\\\ ;" -"䗚>bó|\\\ ;" -"䗟>yì|\\\ ;" -"䗨>yú|\\\ ;" -"䗫>má|\\\ ;" -"䗱>pú|\\\ ;" -"䗶>là|\\\ ;" -"䗷>yì|\\\ ;" -"䗹>cì|\\\ ;" -"䘀>fù|\\\ ;" -"䘁>gé|\\\ ;" -"䘃>mò|\\\ ;" -"䘄>fù|\\\ ;" -"䘈>lì|\\\ ;" -"䘌>nì|\\\ ;" -"䘏>xù|\\\ ;" -"䘐>nǜ|\\\ ;" -"䘘>yù|\\\ ;" -"䘝>yì|\\\ ;" -"䘠>fú|\\\ ;" -"䘡>bǐ|\\\ ;" -"䘣>zǐ|\\\ ;" -"䘦>ní|\\\ ;" -"䘮>sà|\\\ ;" -"䘱>yù|\\\ ;" -"䘵>lù|\\\ ;" -"䘸>yì|\\\ ;" -"䘻>sù|\\\ ;" -"䘽>ní|\\\ ;" -"䙄>qì|\\\ ;" -"䙏>bó|\\\ ;" -"䙐>kè|\\\ ;" -"䙒>xù|\\\ ;" -"䙗>tì|\\\ ;" -"䙣>sà|\\\ ;" -"䙯>cù|\\\ ;" -"䙰>lí|\\\ ;" -"䙱>dú|\\\ ;" -"䙷>dé|\\\ ;" -"䙸>dé|\\\ ;" -"䙽>xì|\\\ ;" -"䚂>hè|\\\ ;" -"䚄>lù|\\\ ;" -"䚆>ǒu|\\\ ;" -"䚉>qì|\\\ ;" -"䚍>qì|\\\ ;" -"䚐>jí|\\\ ;" -"䚕>lì|\\\ ;" -"䚛>hú|\\\ ;" -"䚝>zú|\\\ ;" -"䚣>tí|\\\ ;" -"䚫>áo|\\\ ;" -"䚰>pǐ|\\\ ;" -"䚴>wà|\\\ ;" -"䚷>xì|\\\ ;" -"䚹>pǐ|\\\ ;" -"䚼>nǜ|\\\ ;" -"䛉>mì|\\\ ;" -"䛋>gé|\\\ ;" -"䛎>hù|\\\ ;" -"䛏>ní|\\\ ;" -"䛐>cí|\\\ ;" -"䛑>mì|\\\ ;" -"䛔>ná|\\\ ;" -"䛕>yù|\\\ ;" -"䛙>xù|\\\ ;" -"䛤>cù|\\\ ;" -"䛥>xì|\\\ ;" -"䛧>mí|\\\ ;" -"䛩>wù|\\\ ;" -"䛯>jù|\\\ ;" -"䛱>tí|\\\ ;" -"䛴>qǐ|\\\ ;" -"䛾>sù|\\\ ;" -"䛿>gé|\\\ ;" -"䜁>xì|\\\ ;" -"䜆>mò|\\\ ;" -"䜒>ào|\\\ ;" -"䜙>án|\\\ ;" -"䜚>tà|\\\ ;" -"䜞>jì|\\\ ;" -"䜡>xù|\\\ ;" -"䜯>jú|\\\ ;" -"䜺>cè|\\\ ;" -"䜼>gú|\\\ ;" -"䜽>yú|\\\ ;" -"䝓>là|\\\ ;" -"䝘>yì|\\\ ;" -"䝚>ní|\\\ ;" -"䝝>yǐ|\\\ ;" -"䝟>yà|\\\ ;" -"䝣>qú|\\\ ;" -"䝯>yì|\\\ ;" -"䝰>tí|\\\ ;" -"䝵>bù|\\\ ;" -"䝸>jì|\\\ ;" -"䝽>ài|\\\ ;" -"䝾>fù|\\\ ;" -"䞅>yí|\\\ ;" -"䞘>jí|\\\ ;" -"䞙>zá|\\\ ;" -"䞚>qí|\\\ ;" -"䞜>fù|\\\ ;" -"䞝>ǎo|\\\ ;" -"䞞>fú|\\\ ;" -"䞟>pò|\\\ ;" -"䞤>qú|\\\ ;" -"䞦>hé|\\\ ;" -"䞯>fù|\\\ ;" -"䞱>hú|\\\ ;" -"䞳>bó|\\\ ;" -"䞶>dì|\\\ ;" -"䞸>fù|\\\ ;" -"䟃>cà|\\\ ;" -"䟄>qì|\\\ ;" -"䟆>bì|\\\ ;" -"䟊>qú|\\\ ;" -"䟌>jí|\\\ ;" -"䟏>lì|\\\ ;" -"䟐>lì|\\\ ;" -"䟑>lǎ|\\\ ;" -"䟔>fù|\\\ ;" -"䟚>qí|\\\ ;" -"䟛>bó|\\\ ;" -"䟜>nà|\\\ ;" -"䟟>cù|\\\ ;" -"䟡>dì|\\\ ;" -"䟤>bì|\\\ ;" -"䟦>bá|\\\ ;" -"䟮>fú|\\\ ;" -"䟻>dù|\\\ ;" -"䟼>wǔ|\\\ ;" -"䟿>lù|\\\ ;" -"䠈>tú|\\\ ;" -"䠋>bǐ|\\\ ;" -"䠎>wò|\\\ ;" -"䠏>jì|\\\ ;" -"䠐>qù|\\\ ;" -"䠒>hú|\\\ ;" -"䠓>cù|\\\ ;" -"䠘>pì|\\\ ;" -"䠚>wà|\\\ ;" -"䠞>cù|\\\ ;" -"䠵>fù|\\\ ;" -"䠹>ái|\\\ ;" -"䡃>lì|\\\ ;" -"䡋>qí|\\\ ;" -"䡍>fú|\\\ ;" -"䡎>lú|\\\ ;" -"䡔>qǐ|\\\ ;" -"䡜>lù|\\\ ;" -"䡞>jú|\\\ ;" -"䡟>pì|\\\ ;" -"䡧>wǔ|\\\ ;" -"䡩>gǔ|\\\ ;" -"䢀>qì|\\\ ;" -"䢃>yì|\\\ ;" -"䢄>xǐ|\\\ ;" -"䢋>jì|\\\ ;" -"䢌>bó|\\\ ;" -"䢐>cú|\\\ ;" -"䢑>dǐ|\\\ ;" -"䢓>yú|\\\ ;" -"䢔>gé|\\\ ;" -"䢕>xù|\\\ ;" -"䢖>lǜ|\\\ ;" -"䢗>hé|\\\ ;" -"䢝>yà|\\\ ;" -"䢞>nù|\\\ ;" -"䢩>yù|\\\ ;" -"䢪>bó|\\\ ;" -"䢱>dú|\\\ ;" -"䢳>jǐ|\\\ ;" -"䢹>jǔ|\\\ ;" -"䣁>yǔ|\\\ ;" -"䣄>tú|\\\ ;" -"䣌>dǐ|\\\ ;" -"䣓>lí|\\\ ;" -"䣕>mǎ|\\\ ;" -"䣖>mǎ|\\\ ;" -"䣝>tú|\\\ ;" -"䣡>tí|\\\ ;" -"䣢>jí|\\\ ;" -"䣥>bǐ|\\\ ;" -"䣧>yì|\\\ ;" -"䣪>pò|\\\ ;" -"䣫>lí|\\\ ;" -"䣮>pò|\\\ ;" -"䣰>jù|\\\ ;" -"䣱>xù|\\\ ;" -"䣴>xù|\\\ ;" -"䣵>èr|\\\ ;" -"䣹>fá|\\\ ;" -"䣽>tǐ|\\\ ;" -"䣾>mì|\\\ ;" -"䤅>tú|\\\ ;" -"䤉>mì|\\\ ;" -"䤍>mí|\\\ ;" -"䤎>jú|\\\ ;" -"䤏>pǐ|\\\ ;" -"䤒>jǐ|\\\ ;" -"䤙>lì|\\\ ;" -"䤚>lǐ|\\\ ;" -"䤠>jī|\\\ ;" -"䤨>pì|\\\ ;" -"䤳>yè|\\\ ;" -"䤶>yè|\\\ ;" -"䥄>cù|\\\ ;" -"䥈>mǔ|\\\ ;" -"䥏>yǔ|\\\ ;" -"䥔>sù|\\\ ;" -"䥘>cù|\\\ ;" -"䥝>áo|\\\ ;" -"䥟>yè|\\\ ;" -"䥡>yè|\\\ ;" -"䥨>lǜ|\\\ ;" -"䥬>bó|\\\ ;" -"䥯>bà|\\\ ;" -"䥶>lì|\\\ ;" -"䥸>mí|\\\ ;" -"䥺>yé|\\\ ;" -"䦇>jì|\\\ ;" -"䦋>áo|\\\ ;" -"䦍>wù|\\\ ;" -"䦗>xù|\\\ ;" -"䦘>bì|\\\ ;" -"䦙>sì|\\\ ;" -"䦜>wú|\\\ ;" -"䦣>fù|\\\ ;" -"䦪>yà|\\\ ;" -"䦴>yì|\\\ ;" -"䦵>nǐ|\\\ ;" -"䦻>cì|\\\ ;" -"䦽>xù|\\\ ;" -"䧄>gè|\\\ ;" -"䧅>tì|\\\ ;" -"䧇>nǐ|\\\ ;" -"䧉>lǐ|\\\ ;" -"䧍>xì|\\\ ;" -"䧔>mù|\\\ ;" -"䧗>bì|\\\ ;" -"䧘>qí|\\\ ;" -"䧝>dì|\\\ ;" -"䧞>fù|\\\ ;" -"䧤>pú|\\\ ;" -"䧧>yǐ|\\\ ;" -"䧨>yè|\\\ ;" -"䧳>cí|\\\ ;" -"䧵>qí|\\\ ;" -"䧼>hú|\\\ ;" -"䨀>dí|\\\ ;" -"䨆>bí|\\\ ;" -"䨏>cí|\\\ ;" -"䨑>tí|\\\ ;" -"䨒>yù|\\\ ;" -"䨖>jì|\\\ ;" -"䨗>fú|\\\ ;" -"䨛>sè|\\\ ;" -"䨞>yǔ|\\\ ;" -"䨠>ǎi|\\\ ;" -"䨣>gé|\\\ ;" -"䨤>dí|\\\ ;" -"䨥>hù|\\\ ;" -"䨰>pò|\\\ ;" -"䨱>fù|\\\ ;" -"䨳>xì|\\\ ;" -"䨼>hù|\\\ ;" -"䩉>fǔ|\\\ ;" -"䩋>mǒ|\\\ ;" -"䩐>gé|\\\ ;" -"䩒>yú|\\\ ;" -"䩓>qí|\\\ ;" -"䩗>bà|\\\ ;" -"䩘>dì|\\\ ;" -"䩚>dì|\\\ ;" -"䩛>bì|\\\ ;" -"䩟>yí|\\\ ;" -"䩢>dá|\\\ ;" -"䩤>xì|\\\ ;" -"䩮>lù|\\\ ;" -"䩯>jí|\\\ ;" -"䩴>hú|\\\ ;" -"䩻>bà|\\\ ;" -"䪁>bǔ|\\\ ;" -"䪂>gé|\\\ ;" -"䪅>dú|\\\ ;" -"䪆>tǐ|\\\ ;" -"䪇>bó|\\\ ;" -"䪉>là|\\\ ;" -"䪏>nà|\\\ ;" -"䪐>bì|\\\ ;" -"䪔>bǔ|\\\ ;" -"䪕>jú|\\\ ;" -"䪖>pò|\\\ ;" -"䪙>fú|\\\ ;" -"䪚>hè|\\\ ;" -"䪝>hù|\\\ ;" -"䪞>zá|\\\ ;" -"䪬>bó|\\\ ;" -"䪵>yǎ|\\\ ;" -"䪺>gé|\\\ ;" -"䪾>mí|\\\ ;" -"䫁>bì|\\\ ;" -"䫊>bó|\\\ ;" -"䫌>pǐ|\\\ ;" -"䫍>fǔ|\\\ ;" -"䫓>wú|\\\ ;" -"䫔>qì|\\\ ;" -"䫘>hé|\\\ ;" -"䫝>fǔ|\\\ ;" -"䫣>xí|\\\ ;" -"䫦>gé|\\\ ;" -"䫨>ào|\\\ ;" -"䫱>ná|\\\ ;" -"䫳>dú|\\\ ;" -"䫾>bì|\\\ ;" -"䬁>yí|\\\ ;" -"䬃>sà|\\\ ;" -"䬄>yù|\\\ ;" -"䬅>lì|\\\ ;" -"䬆>lì|\\\ ;" -"䬏>bù|\\\ ;" -"䬓>àn|\\\ ;" -"䬔>xù|\\\ ;" -"䬛>bì|\\\ ;" -"䬣>qì|\\\ ;" -"䬥>yì|\\\ ;" -"䬨>cù|\\\ ;" -"䬪>bó|\\\ ;" -"䬮>yí|\\\ ;" -"䬴>mò|\\\ ;" -"䬵>ài|\\\ ;" -"䬶>èn|\\\ ;" -"䬾>tí|\\\ ;" -"䭂>yì|\\\ ;" -"䭅>hú|\\\ ;" -"䭆>nè|\\\ ;" -"䭇>yì|\\\ ;" -"䭌>hú|\\\ ;" -"䭍>hú|\\\ ;" -"䭓>èn|\\\ ;" -"䭞>yì|\\\ ;" -"䭟>yè|\\\ ;" -"䭡>èn|\\\ ;" -"䭣>cí|\\\ ;" -"䭦>bó|\\\ ;" -"䭧>mǐ|\\\ ;" -"䭩>mì|\\\ ;" -"䭫>qǐ|\\\ ;" -"䭬>qǐ|\\\ ;" -"䭮>bì|\\\ ;" -"䭯>bó|\\\ ;" -"䭲>nǐ|\\\ ;" -"䭶>qí|\\\ ;" -"䭸>fù|\\\ ;" -"䭼>qí|\\\ ;" -"䭿>yì|\\\ ;" -"䮀>bó|\\\ ;" -"䮂>bó|\\\ ;" -"䮇>yù|\\\ ;" -"䮉>lú|\\\ ;" -"䮊>yí|\\\ ;" -"䮋>lì|\\\ ;" -"䮎>xì|\\\ ;" -"䮏>wú|\\\ ;" -"䮗>àn|\\\ ;" -"䮘>ér|\\\ ;" -"䮙>yù|\\\ ;" -"䮛>fù|\\\ ;" -"䮡>bì|\\\ ;" -"䮤>dí|\\\ ;" -"䮥>lì|\\\ ;" -"䮩>gú|\\\ ;" -"䮬>mò|\\\ ;" -"䮭>mì|\\\ ;" -"䮯>ào|\\\ ;" -"䮷>dú|\\\ ;" -"䮸>hú|\\\ ;" -"䮺>jì|\\\ ;" -"䯂>jí|\\\ ;" -"䯆>yì|\\\ ;" -"䯉>yà|\\\ ;" -"䯋>bó|\\\ ;" -"䯗>bì|\\\ ;" -"䯙>pò|\\\ ;" -"䯚>ǒu|\\\ ;" -"䯜>tì|\\\ ;" -"䯠>ǎo|\\\ ;" -"䯢>mó|\\\ ;" -"䯥>àn|\\\ ;" -"䯦>mà|\\\ ;" -"䯱>fù|\\\ ;" -"䯲>pá|\\\ ;" -"䯸>cì|\\\ ;" -"䯼>dí|\\\ ;" -"䯽>fǔ|\\\ ;" -"䯿>zú|\\\ ;" -"䰀>wǒ|\\\ ;" -"䰇>qí|\\\ ;" -"䰊>bó|\\\ ;" -"䰍>cì|\\\ ;" -"䰏>jì|\\\ ;" -"䰕>lú|\\\ ;" -"䰙>yǐ|\\\ ;" -"䰛>lì|\\\ ;" -"䰜>lì|\\\ ;" -"䰦>pǐ|\\\ ;" -"䰬>jú|\\\ ;" -"䰯>nǐ|\\\ ;" -"䰰>rú|\\\ ;" -"䰲>yà|\\\ ;" -"䰴>qì|\\\ ;" -"䰹>zé|\\\ ;" -"䰻>yú|\\\ ;" -"䰾>bà|\\\ ;" -"䱃>dǐ|\\\ ;" -"䱅>mò|\\\ ;" -"䱈>qí|\\\ ;" -"䱊>mǐ|\\\ ;" -"䱌>yí|\\\ ;" -"䱒>yì|\\\ ;" -"䱘>lí|\\\ ;" -"䱚>lù|\\\ ;" -"䱛>xù|\\\ ;" -"䱝>bà|\\\ ;" -"䱟>jù|\\\ ;" -"䱡>jú|\\\ ;" -"䱣>zú|\\\ ;" -"䱫>là|\\\ ;" -"䱯>mú|\\\ ;" -"䱱>dì|\\\ ;" -"䱷>yú|\\\ ;" -"䱹>nà|\\\ ;" -"䲐>lǔ|\\\ ;" -"䲑>yí|\\\ ;" -"䲕>pǔ|\\\ ;" -"䲜>yè|\\\ ;" -"䲞>lì|\\\ ;" -"䲣>yú|\\\ ;" -"䲧>dù|\\\ ;" -"䲪>xì|\\\ ;" -"䲬>qí|\\\ ;" -"䲯>jí|\\\ ;" -"䲵>hù|\\\ ;" -"䲿>cí|\\\ ;" -"䳁>bá|\\\ ;" -"䳄>cí|\\\ ;" -"䳇>wǔ|\\\ ;" -"䳊>bá|\\\ ;" -"䳐>cì|\\\ ;" -"䳚>hé|\\\ ;" -"䳜>tú|\\\ ;" -"䳝>bù|\\\ ;" -"䳢>qí|\\\ ;" -"䳭>jí|\\\ ;" -"䳮>mò|\\\ ;" -"䳱>wù|\\\ ;" -"䳳>xù|\\\ ;" -"䳴>dá|\\\ ;" -"䳸>má|\\\ ;" -"䳽>hè|\\\ ;" -"䴁>yù|\\\ ;" -"䴄>lì|\\\ ;" -"䴆>pú|\\\ ;" -"䴈>ǎo|\\\ ;" -"䴊>yí|\\\ ;" -"䴗>jú|\\\ ;" -"䴙>pì|\\\ ;" -"䴝>bù|\\\ ;" -"䴞>dí|\\\ ;" -"䴡>lì|\\\ ;" -"䴢>mí|\\\ ;" -"䴪>lù|\\\ ;" -"䴬>yì|\\\ ;" -"䴲>mò|\\\ ;" -"䴳>hè|\\\ ;" -"䴺>bù|\\\ ;" -"䴻>lí|\\\ ;" -"䵄>bí|\\\ ;" -"䵅>áo|\\\ ;" -"䵑>nì|\\\ ;" -"䵒>nì|\\\ ;" -"䵓>lí|\\\ ;" -"䵕>jù|\\\ ;" -"䵗>fú|\\\ ;" -"䵝>yà|\\\ ;" -"䵠>dí|\\\ ;" -"䵣>dá|\\\ ;" -"䵩>lí|\\\ ;" -"䵫>yù|\\\ ;" -"䵬>tà|\\\ ;" -"䵱>hè|\\\ ;" -"䵶>qú|\\\ ;" -"䵻>gǔ|\\\ ;" -"䵽>cà|\\\ ;" -"䵾>fú|\\\ ;" -"䶀>tà|\\\ ;" -"䶁>tà|\\\ ;" -"䶅>hé|\\\ ;" -"䶈>bó|\\\ ;" -"䶊>nǜ|\\\ ;" -"䶍>dì|\\\ ;" -"䶏>tǐ|\\\ ;" -"䶑>tì|\\\ ;" -"䶒>qí|\\\ ;" -"䶓>jì|\\\ ;" -"䶕>pá|\\\ ;" -"䶗>kè|\\\ ;" -"䶘>lì|\\\ ;" -"䶙>jù|\\\ ;" -"䶚>qǔ|\\\ ;" -"䶛>là|\\\ ;" -"䶜>gù|\\\ ;" -"䶞>qí|\\\ ;" -"䶣>ái|\\\ ;" -"䶥>jǔ|\\\ ;" -"䶦>zé|\\\ ;" -"䶩>jì|\\\ ;" -"丌>jī|\\\ ;" -"丨>gě|\\\ ;" -"乀>fú|\\\ ;" -"乁>yí|\\\ ;" -"乂>ài|\\\ ;" -"乕>hǔ|\\\ ;" -"乶>fǔ|\\\ ;" -"乸>nǎ|\\\ ;" -"乿>lē|\\\ ;" -"亄>yì|\\\ ;" -"亓>qí|\\\ ;" -"亖>sì|\\\ ;" -"亜>yà|\\\ ;" -"亝>qí|\\\ ;" -"亞>yà|\\\ ;" -"亱>yè|\\\ ;" -"亼>jí|\\\ ;" -"仂>lè|\\\ ;" -"仈>bā|\\\ ;" -"仏>fó|\\\ ;" -"仢>dí|\\\ ;" -"仫>mù|\\\ ;" -"仱>pí|\\\ ;" -"仾>dī|\\\ ;" -"伃>yú|\\\ ;" -"伇>yì|\\\ ;" -"伋>jí|\\\ ;" -"伌>ài|\\\ ;" -"伕>fū|\\\ ;" -"伮>nú|\\\ ;" -"伱>nǐ|\\\ ;" -"伵>cì|\\\ ;" -"伹>qū|\\\ ;" -"伾>pī|\\\ ;" -"伿>yì|\\\ ;" -"佀>sì|\\\ ;" -"佁>ǎi|\\\ ;" -"佈>bù|\\\ ;" -"佉>qū|\\\ ;" -"佊>bǐ|\\\ ;" -"佌>cǐ|\\\ ;" -"佖>bì|\\\ ;" -"佢>qú|\\\ ;" -"佧>kǎ|\\\ ;" -"佫>hè|\\\ ;" -"佮>gé|\\\ ;" -"佱>fǎ|\\\ ;" -"佴>èr|\\\ ;" -"佽>cì|\\\ ;" -"侇>yí|\\\ ;" -"侎>mǐ|\\\ ;" -"侐>xù|\\\ ;" -"侒>ān|\\\ ;" -"侓>lù|\\\ ;" -"侕>ér|\\\ ;" -"侞>rǔ|\\\ ;" -"侶>lǚ|\\\ ;" -"侷>jú|\\\ ;" -"侼>bó|\\\ ;" -"俁>yǔ|\\\ ;" -"係>xì|\\\ ;" -"俆>xú|\\\ ;" -"俈>kù|\\\ ;" -"俉>wù|\\\ ;" -"俋>yì|\\\ ;" -"俌>fǔ|\\\ ;" -"俙>xī|\\\ ;" -"俤>tì|\\\ ;" -"俰>hè|\\\ ;" -"俹>yà|\\\ ;" -"俼>yù|\\\ ;" -"個>gè|\\\ ;" -"倛>qī|\\\ ;" -"倳>zì|\\\ ;" -"倵>wǔ|\\\ ;" -"倶>jù|\\\ ;" -"倻>yē|\\\ ;" -"偊>yǔ|\\\ ;" -"偍>tí|\\\ ;" -"偓>wò|\\\ ;" -"偙>dì|\\\ ;" -"偞>yè|\\\ ;" -"偦>xū|\\\ ;" -"偨>cī|\\\ ;" -"偩>fù|\\\ ;" -"偪>bī|\\\ ;" -"偮>jí|\\\ ;" -"偯>yǐ|\\\ ;" -"偲>sī|\\\ ;" -"側>cè|\\\ ;" -"偺>zá|\\\ ;" -"傃>sù|\\\ ;" -"傉>rù|\\\ ;" -"傌>mà|\\\ ;" -"傒>xī|\\\ ;" -"傠>fā|\\\ ;" -"傴>yǔ|\\\ ;" -"僀>dì|\\\ ;" -"僁>xī|\\\ ;" -"僇>lù|\\\ ;" -"僕>pú|\\\ ;" -"僛>qī|\\\ ;" -"僟>jī|\\\ ;" -"僰>bó|\\\ ;" -"僱>gù|\\\ ;" -"僷>yè|\\\ ;" -"僾>ài|\\\ ;" -"儀>yí|\\\ ;" -"億>yì|\\\ ;" -"儑>àn|\\\ ;" -"儗>nǐ|\\\ ;" -"儛>wǔ|\\\ ;" -"儞>nǐ|\\\ ;" -"儢>lǚ|\\\ ;" -"儥>dú|\\\ ;" -"儩>sì|\\\ ;" -"儮>lì|\\\ ;" -"儷>lì|\\\ ;" -"兎>tù|\\\ ;" -"児>ér|\\\ ;" -"兒>ér|\\\ ;" -"兓>kè|\\\ ;" -"兣>lǐ|\\\ ;" -"兪>yú|\\\ ;" -"兾>jì|\\\ ;" -"兿>yì|\\\ ;" -"冊>cè|\\\ ;" -"冔>xǔ|\\\ ;" -"冖>mì|\\\ ;" -"冝>yí|\\\ ;" -"冞>mí|\\\ ;" -"冣>jù|\\\ ;" -"冨>fù|\\\ ;" -"冪>mì|\\\ ;" -"冱>hù|\\\ ;" -"冴>hù|\\\ ;" -"冹>fú|\\\ ;" -"凃>tú|\\\ ;" -"凅>gù|\\\ ;" -"凒>yí|\\\ ;" -"凓>lì|\\\ ;" -"凘>sī|\\\ ;" -"凞>xī|\\\ ;" -"凟>dú|\\\ ;" -"凥>jū|\\\ ;" -"刉>jī|\\\ ;" -"刏>jī|\\\ ;" -"刕>lí|\\\ ;" -"刜>fú|\\\ ;" -"刞>qù|\\\ ;" -"刟>jū|\\\ ;" -"刵>èr|\\\ ;" -"刾>cì|\\\ ;" -"則>zé|\\\ ;" -"剋>kè|\\\ ;" -"剓>lí|\\\ ;" -"剘>qí|\\\ ;" -"剚>zì|\\\ ;" -"剝>bō|\\\ ;" -"剞>jī|\\\ ;" -"剤>jì|\\\ ;" -"剺>lí|\\\ ;" -"劅>pǐ|\\\ ;" -"劇>jù|\\\ ;" -"劑>jì|\\\ ;" -"劘>mó|\\\ ;" -"劙>lí|\\\ ;" -"劜>yā|\\\ ;" -"劮>yì|\\\ ;" -"劸>wā|\\\ ;" -"勀>kè|\\\ ;" -"勊>kè|\\\ ;" -"勎>lù|\\\ ;" -"勗>xù|\\\ ;" -"務>wù|\\\ ;" -"勚>yì|\\\ ;" -"勠>lù|\\\ ;" -"勣>jī|\\\ ;" -"勩>yì|\\\ ;" -"勮>jù|\\\ ;" -"勴>lǜ|\\\ ;" -"勵>lì|\\\ ;" -"匊>jú|\\\ ;" -"匌>gé|\\\ ;" -"匎>àn|\\\ ;" -"匒>dá|\\\ ;" -"匜>yí|\\\ ;" -"匢>hū|\\\ ;" -"匤>qū|\\\ ;" -"匫>hū|\\\ ;" -"匵>dú|\\\ ;" -"匷>qú|\\\ ;" -"匸>xǐ|\\\ ;" -"匼>ǎn|\\\ ;" -"區>qū|\\\ ;" -"卆>zú|\\\ ;" -"卌>xì|\\\ ;" -"卙>jí|\\\ ;" -"卥>xī|\\\ ;" -"卹>xù|\\\ ;" -"卼>wù|\\\ ;" -"卽>jí|\\\ ;" -"厀>xī|\\\ ;" -"厃>àn|\\\ ;" -"厊>yǎ|\\\ ;" -"厒>hé|\\\ ;" -"厓>yá|\\\ ;" -"厗>tí|\\\ ;" -"厠>cè|\\\ ;" -"厤>lì|\\\ ;" -"厫>áo|\\\ ;" -"厯>lì|\\\ ;" -"厲>lì|\\\ ;" -"厺>qù|\\\ ;" -"厾>dū|\\\ ;" -"叆>ài|\\\ ;" -"叐>bá|\\\ ;" -"叒>lì|\\\ ;" -"叻>lè|\\\ ;" -"吇>zǐ|\\\ ;" -"吔>yě|\\\ ;" -"吘>ǒu|\\\ ;" -"吚>yī|\\\ ;" -"吥>bù|\\\ ;" -"吳>wú|\\\ ;" -"吶>nà|\\\ ;" -"呂>lǚ|\\\ ;" -"呄>gé|\\\ ;" -"呇>nà|\\\ ;" -"呉>wú|\\\ ;" -"呧>dǐ|\\\ ;" -"呬>xì|\\\ ;" -"呭>yì|\\\ ;" -"呮>qì|\\\ ;" -"呰>zǐ|\\\ ;" -"呴>xū|\\\ ;" -"呹>yì|\\\ ;" -"呾>dá|\\\ ;" -"呿>qū|\\\ ;" -"咇>bì|\\\ ;" -"咈>fú|\\\ ;" -"咊>hé|\\\ ;" -"咓>wǎ|\\\ ;" -"咘>bù|\\\ ;" -"咠>qì|\\\ ;" -"咡>èr|\\\ ;" -"哊>yù|\\\ ;" -"哋>dì|\\\ ;" -"哫>zú|\\\ ;" -"哬>hé|\\\ ;" -"哱>bō|\\\ ;" -"哵>bā|\\\ ;" -"哷>lè|\\\ ;" -"唂>gǔ|\\\ ;" -"唃>gǔ|\\\ ;" -"唈>yì|\\\ ;" -"唋>tǔ|\\\ ;" -"唎>lì|\\\ ;" -"唖>yǎ|\\\ ;" -"唘>qǐ|\\\ ;" -"唙>dí|\\\ ;" -"唛>mà|\\\ ;" -"唨>zǔ|\\\ ;" -"唩>wō|\\\ ;" -"唭>qī|\\\ ;" -"唲>ér|\\\ ;" -"唵>ǎn|\\\ ;" -"唹>yū|\\\ ;" -"唽>xī|\\\ ;" -"啀>ái|\\\ ;" -"啇>dí|\\\ ;" -"啎>wǔ|\\\ ;" -"啒>wā|\\\ ;" -"啓>qǐ|\\\ ;" -"啔>qǐ|\\\ ;" -"啘>yè|\\\ ;" -"啙>zǐ|\\\ ;" -"啚>bǐ|\\\ ;" -"啝>hé|\\\ ;" -"啞>yǎ|\\\ ;" -"啟>qǐ|\\\ ;" -"啲>dì|\\\ ;" -"啽>án|\\\ ;" -"喅>yù|\\\ ;" -"喖>hú|\\\ ;" -"喞>jī|\\\ ;" -"喣>xǔ|\\\ ;" -"喥>dù|\\\ ;" -"喩>yù|\\\ ;" -"喲>yo|\\\ ;" -"喺>xì|\\\ ;" -"喾>kù|\\\ ;" -"嗁>tí|\\\ ;" -"嗃>hè|\\\ ;" -"嗇>sè|\\\ ;" -"嗋>ài|\\\ ;" -"嗎>mǎ|\\\ ;" -"嗕>rù|\\\ ;" -"嗗>wā|\\\ ;" -"嗘>jī|\\\ ;" -"嗚>wū|\\\ ;" -"嗞>zī|\\\ ;" -"嗢>wà|\\\ ;" -"嗰>gè|\\\ ;" -"嗱>ná|\\\ ;" -"嗶>bì|\\\ ;" -"嗸>áo|\\\ ;" -"嗼>mò|\\\ ;" -"嘊>ái|\\\ ;" -"嘑>hū|\\\ ;" -"嘔>ǒu|\\\ ;" -"嘖>zé|\\\ ;" -"嘙>pó|\\\ ;" -"嘚>dé|\\\ ;" -"嘜>mà|\\\ ;" -"嘝>hú|\\\ ;" -"嘠>gā|\\\ ;" -"嘢>yě|\\\ ;" -"嘰>jī|\\\ ;" -"嘸>fǔ|\\\ ;" -"噈>cù|\\\ ;" -"噊>yù|\\\ ;" -"噏>xī|\\\ ;" -"噐>qì|\\\ ;" -"噓>xū|\\\ ;" -"噝>sī|\\\ ;" -"噠>dā|\\\ ;" -"噧>āi|\\\ ;" -"噯>ǎi|\\\ ;" -"噳>yǔ|\\\ ;" -"噽>pǐ|\\\ ;" -"嚁>dí|\\\ ;" -"嚃>tà|\\\ ;" -"嚈>yà|\\\ ;" -"嚊>xì|\\\ ;" -"嚌>jì|\\\ ;" -"嚔>tì|\\\ ;" -"嚕>lū|\\\ ;" -"嚗>bó|\\\ ;" -"嚛>hù|\\\ ;" -"嚜>mò|\\\ ;" -"嚟>lí|\\\ ;" -"嚤>mó|\\\ ;" -"嚦>lì|\\\ ;" -"嚧>lú|\\\ ;" -"嚩>fú|\\\ ;" -"嚭>pǐ|\\\ ;" -"嚰>mó|\\\ ;" -"嚱>xì|\\\ ;" -"嚳>kù|\\\ ;" -"嚹>lā|\\\ ;" -"嚺>tà|\\\ ;" -"囃>cà|\\\ ;" -"囄>lí|\\\ ;" -"囇>lì|\\\ ;" -"囈>yì|\\\ ;" -"囌>sū|\\\ ;" -"囍>xǐ|\\\ ;" -"囐>zá|\\\ ;" -"囸>rì|\\\ ;" -"圐>kū|\\\ ;" -"圑>fù|\\\ ;" -"圕>tú|\\\ ;" -"圖>tú|\\\ ;" -"圗>tú|\\\ ;" -"圛>yì|\\\ ;" -"圠>yà|\\\ ;" -"圡>tǔ|\\\ ;" -"圤>pú|\\\ ;" -"圥>lù|\\\ ;" -"圧>yā|\\\ ;" -"圫>yù|\\\ ;" -"圼>jī|\\\ ;" -"圽>mò|\\\ ;" -"坒>bì|\\\ ;" -"坔>dì|\\\ ;" -"坖>jì|\\\ ;" -"坘>dǐ|\\\ ;" -"坜>lì|\\\ ;" -"坣>nì|\\\ ;" -"坥>qū|\\\ ;" -"坲>fó|\\\ ;" -"坴>kē|\\\ ;" -"坶>mù|\\\ ;" -"坸>bō|\\\ ;" -"坺>bá|\\\ ;" -"坿>fù|\\\ ;" -"垀>hū|\\\ ;" -"垇>ào|\\\ ;" -"垍>jì|\\\ ;" -"垎>kè|\\\ ;" -"垏>lù|\\\ ;" -"垐>cí|\\\ ;" -"垘>fú|\\\ ;" -"垵>ǎn|\\\ ;" -"垻>bà|\\\ ;" -"垼>yì|\\\ ;" -"垿>xù|\\\ ;" -"埊>dì|\\\ ;" -"埗>bù|\\\ ;" -"埜>yě|\\\ ;" -"埞>dǐ|\\\ ;" -"埡>yà|\\\ ;" -"埧>jù|\\\ ;" -"埶>yì|\\\ ;" -"埼>qí|\\\ ;" -"埾>jù|\\\ ;" -"埿>ní|\\\ ;" -"堁>kè|\\\ ;" -"堄>nì|\\\ ;" -"堉>yù|\\\ ;" -"堌>gù|\\\ ;" -"堐>yá|\\\ ;" -"堓>àn|\\\ ;" -"堗>tū|\\\ ;" -"堛>bì|\\\ ;" -"堣>yú|\\\ ;" -"堥>ài|\\\ ;" -"堬>yú|\\\ ;" -"堲>jí|\\\ ;" -"塈>jì|\\\ ;" -"塉>jí|\\\ ;" -"塐>sù|\\\ ;" -"塓>mì|\\\ ;" -"塗>tú|\\\ ;" -"塛>lì|\\\ ;" -"塢>wù|\\\ ;" -"塧>ài|\\\ ;" -"塶>cù|\\\ ;" -"塷>lǔ|\\\ ;" -"塸>ǒu|\\\ ;" -"塻>mò|\\\ ;" -"墄>qī|\\\ ;" -"墆>dì|\\\ ;" -"墍>xì|\\\ ;" -"墑>dī|\\\ ;" -"墖>tǎ|\\\ ;" -"墘>qí|\\\ ;" -"墢>bá|\\\ ;" -"墣>pū|\\\ ;" -"墬>dē|\\\ ;" -"墲>wǔ|\\\ ;" -"墶>dā|\\\ ;" -"墷>ào|\\\ ;" -"墺>ào|\\\ ;" -"墼>jī|\\\ ;" -"墿>yì|\\\ ;" -"壀>pí|\\\ ;" -"壄>yě|\\\ ;" -"壉>jù|\\\ ;" -"壐>xǐ|\\\ ;" -"壒>ài|\\\ ;" -"壓>yā|\\\ ;" -"壚>lú|\\\ ;" -"壢>lì|\\\ ;" -"壩>bà|\\\ ;" -"壱>yī|\\\ ;" -"壴>yì|\\\ ;" -"壷>hú|\\\ ;" -"壺>hú|\\\ ;" -"壻>xù|\\\ ;" -"夁>yī|\\\ ;" -"夃>gū|\\\ ;" -"夐>xì|\\\ ;" -"夡>qì|\\\ ;" -"夨>fú|\\\ ;" -"夶>bǐ|\\\ ;" -"夿>bā|\\\ ;" -"奀>ēn|\\\ ;" -"奃>dì|\\\ ;" -"奅>jī|\\\ ;" -"奛>hǎ|\\\ ;" -"奡>ào|\\\ ;" -"奦>wù|\\\ ;" -"奧>ào|\\\ ;" -"奰>bì|\\\ ;" -"妀>jǐ|\\\ ;" -"妋>fū|\\\ ;" -"妑>pā|\\\ ;" -"妠>nà|\\\ ;" -"妬>dù|\\\ ;" -"妭>bá|\\\ ;" -"妰>nǐ|\\\ ;" -"妴>qī|\\\ ;" -"妺>mò|\\\ ;" -"妼>bì|\\\ ;" -"姀>hé|\\\ ;" -"姁>xǔ|\\\ ;" -"姂>fá|\\\ ;" -"姇>fū|\\\ ;" -"姉>zǐ|\\\ ;" -"姖>jù|\\\ ;" -"姞>jí|\\\ ;" -"姫>jī|\\\ ;" -"娐>fū|\\\ ;" -"娒>wǔ|\\\ ;" -"娔>kè|\\\ ;" -"娛>yú|\\\ ;" -"娪>wú|\\\ ;" -"娬>wǔ|\\\ ;" -"娭>xī|\\\ ;" -"娯>yú|\\\ ;" -"娰>sì|\\\ ;" -"娵>jū|\\\ ;" -"娸>qí|\\\ ;" -"娽>lù|\\\ ;" -"娾>ǎi|\\\ ;" -"婅>jú|\\\ ;" -"婍>qǐ|\\\ ;" -"婏>fù|\\\ ;" -"婗>ní|\\\ ;" -"婟>hù|\\\ ;" -"婠>wà|\\\ ;" -"婦>fù|\\\ ;" -"婭>yà|\\\ ;" -"婮>jū|\\\ ;" -"婯>lì|\\\ ;" -"媀>yú|\\\ ;" -"媂>tí|\\\ ;" -"媉>wū|\\\ ;" -"媍>fù|\\\ ;" -"媐>xī|\\\ ;" -"媕>ān|\\\ ;" -"媞>tí|\\\ ;" -"媤>sī|\\\ ;" -"媧>wā|\\\ ;" -"媩>hú|\\\ ;" -"媭>xū|\\\ ;" -"媷>rù|\\\ ;" -"媼>ǎo|\\\ ;" -"媽>mā|\\\ ;" -"嫊>sù|\\\ ;" -"嫓>pì|\\\ ;" -"嫕>yì|\\\ ;" -"嫗>yù|\\\ ;" -"嫛>yī|\\\ ;" -"嫟>nì|\\\ ;" -"嫧>cè|\\\ ;" -"嫭>hù|\\\ ;" -"嫮>hù|\\\ ;" -"嫯>ào|\\\ ;" -"嫴>gū|\\\ ;" -"嫵>wǔ|\\\ ;" -"嫼>mò|\\\ ;" -"嬃>xū|\\\ ;" -"嬄>yī|\\\ ;" -"嬆>xī|\\\ ;" -"嬑>yì|\\\ ;" -"嬔>fù|\\\ ;" -"嬟>yì|\\\ ;" -"嬡>ài|\\\ ;" -"嬤>mā|\\\ ;" -"嬨>cí|\\\ ;" -"嬩>yú|\\\ ;" -"嬬>xū|\\\ ;" -"嬳>wō|\\\ ;" -"嬺>nì|\\\ ;" -"嬻>dú|\\\ ;" -"孊>mǐ|\\\ ;" -"孋>lí|\\\ ;" -"孖>zī|\\\ ;" -"孠>sì|\\\ ;" -"孲>yā|\\\ ;" -"孴>nǐ|\\\ ;" -"孶>zī|\\\ ;" -"孷>lí|\\\ ;" -"孹>bò|\\\ ;" -"宊>tú|\\\ ;" -"宐>yí|\\\ ;" -"宧>yí|\\\ ;" -"宻>mì|\\\ ;" -"寙>yǔ|\\\ ;" -"寠>jù|\\\ ;" -"寣>hū|\\\ ;" -"寱>yì|\\\ ;" -"寲>yí|\\\ ;" -"寽>lǜ|\\\ ;" -"尀>pǒ|\\\ ;" -"尃>fū|\\\ ;" -"尅>kè|\\\ ;" -"尐>jī|\\\ ;" -"尒>ěr|\\\ ;" -"尓>ěr|\\\ ;" -"尛>mō|\\\ ;" -"尜>gá|\\\ ;" -"尳>gǔ|\\\ ;" -"屃>xì|\\\ ;" -"屄>bī|\\\ ;" -"屓>xì|\\\ ;" -"屔>ní|\\\ ;" -"屖>xī|\\\ ;" -"屜>tì|\\\ ;" -"屢>lǚ|\\\ ;" -"屨>jù|\\\ ;" -"屭>xì|\\\ ;" -"屰>lè|\\\ ;" -"屴>lì|\\\ ;" -"屵>xù|\\\ ;" -"屼>wù|\\\ ;" -"岉>wù|\\\ ;" -"岓>qí|\\\ ;" -"岠>jù|\\\ ;" -"岢>kě|\\\ ;" -"岦>jǔ|\\\ ;" -"岨>qū|\\\ ;" -"岪>fú|\\\ ;" -"岴>qū|\\\ ;" -"岶>pò|\\\ ;" -"峆>hē|\\\ ;" -"峇>kē|\\\ ;" -"峊>fù|\\\ ;" -"峍>lù|\\\ ;" -"峎>ān|\\\ ;" -"峏>ěr|\\\ ;" -"峓>yí|\\\ ;" -"峔>mǔ|\\\ ;" -"峖>ān|\\\ ;" -"峘>hū|\\\ ;" -"峛>lǐ|\\\ ;" -"峜>jī|\\\ ;" -"峢>lǐ|\\\ ;" -"峫>yé|\\\ ;" -"峬>bū|\\\ ;" -"峲>lǐ|\\\ ;" -"峹>tú|\\\ ;" -"峿>wú|\\\ ;" -"崉>tà|\\\ ;" -"崌>jū|\\\ ;" -"崒>zú|\\\ ;" -"崓>gù|\\\ ;" -"崕>yá|\\\ ;" -"崥>pǐ|\\\ ;" -"崪>zú|\\\ ;" -"崱>zé|\\\ ;" -"崳>yú|\\\ ;" -"崹>tí|\\\ ;" -"崺>yǐ|\\\ ;" -"嵂>lǜ|\\\ ;" -"嵆>jī|\\\ ;" -"嵍>hé|\\\ ;" -"嵎>yú|\\\ ;" -"嵕>lǚ|\\\ ;" -"嵛>yú|\\\ ;" -"嵞>jī|\\\ ;" -"嵠>xī|\\\ ;" -"嵡>cī|\\\ ;" -"嵦>ái|\\\ ;" -"嵨>wǔ|\\\ ;" -"嵰>cī|\\\ ;" -"嵴>jí|\\\ ;" -"嵺>dì|\\\ ;" -"嶀>tū|\\\ ;" -"嶅>áo|\\\ ;" -"嶇>qū|\\\ ;" -"嶍>xí|\\\ ;" -"嶎>yù|\\\ ;" -"嶏>bó|\\\ ;" -"嶓>bō|\\\ ;" -"嶧>yì|\\\ ;" -"嶪>yè|\\\ ;" -"嶫>yè|\\\ ;" -"嶬>yí|\\\ ;" -"嶯>jí|\\\ ;" -"嶱>kě|\\\ ;" -"嶲>xī|\\\ ;" -"嶳>dì|\\\ ;" -"嶴>ào|\\\ ;" -"嶻>zá|\\\ ;" -"嶼>yǔ|\\\ ;" -"巁>lì|\\\ ;" -"巇>xī|\\\ ;" -"巈>jú|\\\ ;" -"巿>fú|\\\ ;" -"帀>zā|\\\ ;" -"帊>pà|\\\ ;" -"帍>hù|\\\ ;" -"帓>mà|\\\ ;" -"帗>fú|\\\ ;" -"帞>mò|\\\ ;" -"帟>yì|\\\ ;" -"帠>yì|\\\ ;" -"帤>rú|\\\ ;" -"帺>qí|\\\ ;" -"帾>dǔ|\\\ ;" -"幁>xū|\\\ ;" -"幆>yì|\\\ ;" -"幎>mì|\\\ ;" -"幘>zé|\\\ ;" -"幙>mù|\\\ ;" -"幠>hū|\\\ ;" -"幣>bì|\\\ ;" -"幦>mì|\\\ ;" -"幾>jǐ|\\\ ;" -"庂>zè|\\\ ;" -"庅>mo|\\\ ;" -"庌>yǎ|\\\ ;" -"庘>yā|\\\ ;" -"庛>cī|\\\ ;" -"庡>yǐ|\\\ ;" -"庩>tú|\\\ ;" -"庫>kù|\\\ ;" -"庯>bǐ|\\\ ;" -"庴>jí|\\\ ;" -"庼>cè|\\\ ;" -"庽>yù|\\\ ;" -"廁>cè|\\\ ;" -"廅>hé|\\\ ;" -"廘>lù|\\\ ;" -"廙>yì|\\\ ;" -"廜>tū|\\\ ;" -"廝>sī|\\\ ;" -"廡>wǔ|\\\ ;" -"廦>bì|\\\ ;" -"廬>lú|\\\ ;" -"廲>lí|\\\ ;" -"廸>dí|\\\ ;" -"廹>pò|\\\ ;" -"弆>jǔ|\\\ ;" -"弌>yī|\\\ ;" -"弍>èr|\\\ ;" -"弐>èr|\\\ ;" -"弖>hù|\\\ ;" -"弙>wū|\\\ ;" -"弝>bà|\\\ ;" -"弣>fǔ|\\\ ;" -"弤>dǐ|\\\ ;" -"弬>yí|\\\ ;" -"弻>bì|\\\ ;" -"彂>fā|\\\ ;" -"彃>bì|\\\ ;" -"彌>mí|\\\ ;" -"彐>jì|\\\ ;" -"彑>jì|\\\ ;" -"彔>lù|\\\ ;" -"彛>yí|\\\ ;" -"彜>yí|\\\ ;" -"彞>yí|\\\ ;" -"彧>yù|\\\ ;" -"彶>jí|\\\ ;" -"彿>fú|\\\ ;" -"徆>xī|\\\ ;" -"徍>wā|\\\ ;" -"徛>qì|\\\ ;" -"復>fù|\\\ ;" -"徯>xī|\\\ ;" -"徳>dé|\\\ ;" -"忂>qú|\\\ ;" -"忇>lè|\\\ ;" -"忔>qì|\\\ ;" -"忚>xī|\\\ ;" -"忢>wù|\\\ ;" -"忣>jí|\\\ ;" -"忥>xì|\\\ ;" -"忦>yè|\\\ ;" -"忬>yù|\\\ ;" -"忯>qí|\\\ ;" -"怇>jù|\\\ ;" -"怈>yì|\\\ ;" -"怘>gù|\\\ ;" -"怚>jù|\\\ ;" -"怟>dì|\\\ ;" -"怢>tú|\\\ ;" -"怤>fū|\\\ ;" -"怬>xì|\\\ ;" -"怭>bì|\\\ ;" -"怴>xù|\\\ ;" -"怶>pī|\\\ ;" -"怷>xī|\\\ ;" -"怸>xī|\\\ ;" -"恄>xì|\\\ ;" -"恈>mú|\\\ ;" -"恓>xī|\\\ ;" -"恖>sī|\\\ ;" -"恞>yí|\\\ ;" -"恴>dé|\\\ ;" -"悂>pī|\\\ ;" -"悆>yù|\\\ ;" -"悇>yù|\\\ ;" -"悐>tì|\\\ ;" -"悑>bù|\\\ ;" -"悕>xī|\\\ ;" -"悞>wù|\\\ ;" -"悡>lí|\\\ ;" -"悥>yì|\\\ ;" -"悧>lì|\\\ ;" -"悮>wù|\\\ ;" -"悷>lì|\\\ ;" -"悽>qī|\\\ ;" -"惁>xī|\\\ ;" -"惄>nì|\\\ ;" -"惎>jì|\\\ ;" -"惒>hé|\\\ ;" -"惖>tì|\\\ ;" -"惪>dé|\\\ ;" -"惻>cè|\\\ ;" -"惿>tí|\\\ ;" -"愅>gé|\\\ ;" -"愊>bì|\\\ ;" -"愘>kè|\\\ ;" -"愙>kè|\\\ ;" -"愛>ài|\\\ ;" -"愬>sù|\\\ ;" -"愭>qí|\\\ ;" -"愱>jí|\\\ ;" -"愲>gǔ|\\\ ;" -"愳>jù|\\\ ;" -"愵>nì|\\\ ;" -"愽>bó|\\\ ;" -"慄>lì|\\\ ;" -"慉>xù|\\\ ;" -"慔>mò|\\\ ;" -"慠>ào|\\\ ;" -"慪>òu|\\\ ;" -"慮>lǜ|\\\ ;" -"慸>dì|\\\ ;" -"慼>qī|\\\ ;" -"慽>qī|\\\ ;" -"慾>yù|\\\ ;" -"憈>qū|\\\ ;" -"憘>xǐ|\\\ ;" -"憙>xǐ|\\\ ;" -"憟>sù|\\\ ;" -"憡>cè|\\\ ;" -"憮>wǔ|\\\ ;" -"憱>cù|\\\ ;" -"憵>pī|\\\ ;" -"憶>yì|\\\ ;" -"懅>qú|\\\ ;" -"懌>yì|\\\ ;" -"懎>sè|\\\ ;" -"懓>ài|\\\ ;" -"懙>yǔ|\\\ ;" -"懝>ài|\\\ ;" -"懠>qí|\\\ ;" -"懡>mǒ|\\\ ;" -"懪>bó|\\\ ;" -"懯>fū|\\\ ;" -"懻>jì|\\\ ;" -"懼>jù|\\\ ;" -"戂>mí|\\\ ;" -"戓>gē|\\\ ;" -"戨>gē|\\\ ;" -"戫>yù|\\\ ;" -"戯>xì|\\\ ;" -"戱>xì|\\\ ;" -"戲>xì|\\\ ;" -"戵>qú|\\\ ;" -"戶>hù|\\\ ;" -"戸>hù|\\\ ;" -"戻>lì|\\\ ;" -"扅>yí|\\\ ;" -"扆>yǐ|\\\ ;" -"扏>pū|\\\ ;" -"扐>lè|\\\ ;" -"払>fú|\\\ ;" -"扜>wū|\\\ ;" -"扝>kū|\\\ ;" -"扢>gǔ|\\\ ;" -"扤>wù|\\\ ;" -"扱>xī|\\\ ;" -"扵>yú|\\\ ;" -"扷>ào|\\\ ;" -"扸>xī|\\\ ;" -"扻>zì|\\\ ;" -"抅>jū|\\\ ;" -"抇>gǔ|\\\ ;" -"抈>bà|\\\ ;" -"抐>nù|\\\ ;" -"抙>fū|\\\ ;" -"抜>bá|\\\ ;" -"抝>ǎo|\\\ ;" -"択>zé|\\\ ;" -"抪>pū|\\\ ;" -"抲>hē|\\\ ;" -"抳>nǐ|\\\ ;" -"抴>yì|\\\ ;" -"抷>pī|\\\ ;" -"抸>zā|\\\ ;" -"抾>qū|\\\ ;" -"拏>ná|\\\ ;" -"拞>dǐ|\\\ ;" -"拠>jù|\\\ ;" -"拺>cè|\\\ ;" -"挀>bò|\\\ ;" -"挌>gé|\\\ ;" -"挐>ná|\\\ ;" -"挔>lǚ|\\\ ;" -"挙>jǔ|\\\ ;" -"挜>yà|\\\ ;" -"挬>bó|\\\ ;" -"挮>tǐ|\\\ ;" -"挶>jú|\\\ ;" -"捈>tú|\\\ ;" -"捓>yé|\\\ ;" -"捗>bù|\\\ ;" -"捙>yì|\\\ ;" -"捛>lǚ|\\\ ;" -"捪>jū|\\\ ;" -"捬>fǔ|\\\ ;" -"捽>zú|\\\ ;" -"捿>xī|\\\ ;" -"掋>dǐ|\\\ ;" -"掎>jǐ|\\\ ;" -"掑>qí|\\\ ;" -"掗>yà|\\\ ;" -"掜>yǐ|\\\ ;" -"掦>tì|\\\ ;" -"掭>pá|\\\ ;" -"揊>pì|\\\ ;" -"揟>xū|\\\ ;" -"揢>kè|\\\ ;" -"揤>jí|\\\ ;" -"揥>tì|\\\ ;" -"揦>lá|\\\ ;" -"揧>là|\\\ ;" -"揬>tú|\\\ ;" -"搕>kè|\\\ ;" -"搙>nù|\\\ ;" -"搨>tà|\\\ ;" -"搮>gǔ|\\\ ;" -"搰>hú|\\\ ;" -"搲>wā|\\\ ;" -"搸>xí|\\\ ;" -"搿>gé|\\\ ;" -"摀>wǔ|\\\ ;" -"摋>sà|\\\ ;" -"摕>dì|\\\ ;" -"摖>qì|\\\ ;" -"摙>lí|\\\ ;" -"摝>lù|\\\ ;" -"摢>hù|\\\ ;" -"摨>mā|\\\ ;" -"摮>áo|\\\ ;" -"撎>yì|\\\ ;" -"撘>dā|\\\ ;" -"撠>jǐ|\\\ ;" -"撥>bō|\\\ ;" -"撫>fǔ|\\\ ;" -"撲>pū|\\\ ;" -"撻>tà|\\\ ;" -"擄>lǔ|\\\ ;" -"擇>zé|\\\ ;" -"擈>bǔ|\\\ ;" -"擊>jī|\\\ ;" -"擕>xī|\\\ ;" -"擖>gě|\\\ ;" -"擙>ào|\\\ ;" -"據>jù|\\\ ;" -"擛>yè|\\\ ;" -"擟>mí|\\\ ;" -"擠>jǐ|\\\ ;" -"擧>jǔ|\\\ ;" -"擨>yé|\\\ ;" -"擩>rǔ|\\\ ;" -"擫>yè|\\\ ;" -"擬>nǐ|\\\ ;" -"擮>jí|\\\ ;" -"擱>gē|\\\ ;" -"擵>mó|\\\ ;" -"擼>lì|\\\ ;" -"擿>tì|\\\ ;" -"攋>là|\\\ ;" -"攎>lú|\\\ ;" -"攠>mí|\\\ ;" -"攦>lì|\\\ ;" -"攭>lì|\\\ ;" -"攲>qī|\\\ ;" -"攳>pō|\\\ ;" -"攴>pū|\\\ ;" -"攺>yǐ|\\\ ;" -"敀>bó|\\\ ;" -"敄>wù|\\\ ;" -"敇>cè|\\\ ;" -"敋>gé|\\\ ;" -"敍>xù|\\\ ;" -"敔>yǔ|\\\ ;" -"敘>xù|\\\ ;" -"敡>yì|\\\ ;" -"敱>ái|\\\ ;" -"敳>ái|\\\ ;" -"敵>dí|\\\ ;" -"敺>qū|\\\ ;" -"敼>xǐ|\\\ ;" -"斁>yì|\\\ ;" -"斃>bì|\\\ ;" -"斄>lì|\\\ ;" -"斉>qí|\\\ ;" -"斊>qí|\\\ ;" -"斔>yǔ|\\\ ;" -"斞>yǔ|\\\ ;" -"斪>qú|\\\ ;" -"斺>wū|\\\ ;" -"旂>qí|\\\ ;" -"旇>pī|\\\ ;" -"旉>fū|\\\ ;" -"旑>yǐ|\\\ ;" -"旞>mó|\\\ ;" -"旟>yú|\\\ ;" -"旡>jì|\\\ ;" -"旣>jī|\\\ ;" -"旳>dì|\\\ ;" -"旴>xū|\\\ ;" -"昈>hù|\\\ ;" -"昒>hū|\\\ ;" -"昗>zè|\\\ ;" -"昛>jù|\\\ ;" -"昩>mò|\\\ ;" -"昫>xǔ|\\\ ;" -"昹>ǎi|\\\ ;" -"晇>xū|\\\ ;" -"晞>xī|\\\ ;" -"晲>yǐ|\\\ ;" -"晳>xī|\\\ ;" -"晵>qǐ|\\\ ;" -"晹>yì|\\\ ;" -"晻>ǎn|\\\ ;" -"暊>fǔ|\\\ ;" -"暍>hè|\\\ ;" -"暏>dǔ|\\\ ;" -"暡>bó|\\\ ;" -"暣>qì|\\\ ;" -"暦>lì|\\\ ;" -"暯>mò|\\\ ;" -"暱>nì|\\\ ;" -"暿>xǐ|\\\ ;" -"曀>yì|\\\ ;" -"曁>jì|\\\ ;" -"曄>yè|\\\ ;" -"曅>yè|\\\ ;" -"曆>lì|\\\ ;" -"曎>yì|\\\ ;" -"曐>bó|\\\ ;" -"曖>ài|\\\ ;" -"曗>yè|\\\ ;" -"曘>rú|\\\ ;" -"曞>lì|\\\ ;" -"曥>lú|\\\ ;" -"曵>yè|\\\ ;" -"曶>hū|\\\ ;" -"朂>xù|\\\ ;" -"朇>pí|\\\ ;" -"朒>nǜ|\\\ ;" -"朞>jī|\\\ ;" -"朳>bā|\\\ ;" -"朸>lì|\\\ ;" -"朼>bǐ|\\\ ;" -"朿>cì|\\\ ;" -"杅>yú|\\\ ;" -"杇>wū|\\\ ;" -"杍>zǐ|\\\ ;" -"杕>dì|\\\ ;" -"杙>yì|\\\ ;" -"杚>gǔ|\\\ ;" -"杝>yí|\\\ ;" -"杧>mǎ|\\\ ;" -"杩>mà|\\\ ;" -"杫>sì|\\\ ;" -"枅>jī|\\\ ;" -"枆>bǐ|\\\ ;" -"枈>bì|\\\ ;" -"枍>yì|\\\ ;" -"枎>fú|\\\ ;" -"枑>hù|\\\ ;" -"枒>yá|\\\ ;" -"枖>kè|\\\ ;" -"枱>yí|\\\ ;" -"枲>xǐ|\\\ ;" -"枹>fū|\\\ ;" -"枻>yì|\\\ ;" -"枼>yè|\\\ ;" -"枽>yè|\\\ ;" -"柀>bǐ|\\\ ;" -"柂>yí|\\\ ;" -"柅>nǐ|\\\ ;" -"柆>lā|\\\ ;" -"柇>hé|\\\ ;" -"柌>cí|\\\ ;" -"柎>fū|\\\ ;" -"柧>gū|\\\ ;" -"柨>pū|\\\ ;" -"柪>āo|\\\ ;" -"柫>fú|\\\ ;" -"柭>bō|\\\ ;" -"柲>bì|\\\ ;" -"柶>sì|\\\ ;" -"柾>cè|\\\ ;" -"栔>qì|\\\ ;" -"栘>yǐ|\\\ ;" -"栛>lì|\\\ ;" -"栜>sù|\\\ ;" -"栥>zī|\\\ ;" -"栧>yì|\\\ ;" -"栭>ér|\\\ ;" -"栮>ěr|\\\ ;" -"栰>fá|\\\ ;" -"栵>lì|\\\ ;" -"栿>fú|\\\ ;" -"桇>ān|\\\ ;" -"桋>yí|\\\ ;" -"桍>kū|\\\ ;" -"桏>jú|\\\ ;" -"桲>bó|\\\ ;" -"桸>xī|\\\ ;" -"桼>qī|\\\ ;" -"梀>cù|\\\ ;" -"梊>dì|\\\ ;" -"梌>tú|\\\ ;" -"梎>āo|\\\ ;" -"梐>bì|\\\ ;" -"梑>dí|\\\ ;" -"梞>jì|\\\ ;" -"梠>lǚ|\\\ ;" -"梩>lí|\\\ ;" -"梮>jú|\\\ ;" -"梸>lí|\\\ ;" -"棃>lí|\\\ ;" -"棄>qì|\\\ ;" -"棊>qí|\\\ ;" -"棌>āo|\\\ ;" -"棏>tè|\\\ ;" -"棙>lì|\\\ ;" -"棛>yù|\\\ ;" -"棜>yù|\\\ ;" -"棝>gù|\\\ ;" -"棨>qǐ|\\\ ;" -"棫>yù|\\\ ;" -"棲>qī|\\\ ;" -"棳>kě|\\\ ;" -"棴>fú|\\\ ;" -"椂>lù|\\\ ;" -"椇>jǔ|\\\ ;" -"椈>jú|\\\ ;" -"椏>yā|\\\ ;" -"椔>zī|\\\ ;" -"椞>xì|\\\ ;" -"椸>yí|\\\ ;" -"楀>yǔ|\\\ ;" -"楅>bì|\\\ ;" -"楈>xū|\\\ ;" -"楋>là|\\\ ;" -"楒>sī|\\\ ;" -"楕>jí|\\\ ;" -"楘>mù|\\\ ;" -"楛>hù|\\\ ;" -"楜>hú|\\\ ;" -"楡>yú|\\\ ;" -"楪>yè|\\\ ;" -"業>yè|\\\ ;" -"楰>yú|\\\ ;" -"楴>dì|\\\ ;" -"極>jí|\\\ ;" -"楽>lè|\\\ ;" -"榃>fú|\\\ ;" -"榏>yì|\\\ ;" -"榑>fù|\\\ ;" -"榓>mì|\\\ ;" -"榖>gǔ|\\\ ;" -"榙>tǎ|\\\ ;" -"榟>zǐ|\\\ ;" -"榡>sù|\\\ ;" -"榪>mà|\\\ ;" -"榹>sī|\\\ ;" -"榼>kè|\\\ ;" -"榽>xī|\\\ ;" -"榾>gǔ|\\\ ;" -"槂>hé|\\\ ;" -"槅>gé|\\\ ;" -"槉>jí|\\\ ;" -"槒>xù|\\\ ;" -"槢>xí|\\\ ;" -"槣>qǐ|\\\ ;" -"槲>hú|\\\ ;" -"槴>hù|\\\ ;" -"槷>yì|\\\ ;" -"樂>lè|\\\ ;" -"樍>jī|\\\ ;" -"樐>lǔ|\\\ ;" -"樒>mì|\\\ ;" -"樖>kē|\\\ ;" -"樚>lù|\\\ ;" -"樲>èr|\\\ ;" -"樸>pú|\\\ ;" -"橃>fā|\\\ ;" -"橅>mó|\\\ ;" -"橚>sù|\\\ ;" -"機>jī|\\\ ;" -"橭>gū|\\\ ;" -"橶>jí|\\\ ;" -"橽>tà|\\\ ;" -"檋>jū|\\\ ;" -"檌>pú|\\\ ;" -"檍>yì|\\\ ;" -"檏>pǔ|\\\ ;" -"檕>jì|\\\ ;" -"檘>bì|\\\ ;" -"檝>jí|\\\ ;" -"檥>yǐ|\\\ ;" -"檱>qí|\\\ ;" -"檵>jì|\\\ ;" -"檷>mí|\\\ ;" -"檹>yī|\\\ ;" -"檽>ér|\\\ ;" -"櫀>qí|\\\ ;" -"櫁>mì|\\\ ;" -"櫅>jī|\\\ ;" -"櫇>pó|\\\ ;" -"櫒>sà|\\\ ;" -"櫓>lǔ|\\\ ;" -"櫔>lì|\\\ ;" -"櫖>lǘ|\\\ ;" -"櫙>ōu|\\\ ;" -"櫚>lǘ|\\\ ;" -"櫝>dú|\\\ ;" -"櫟>lì|\\\ ;" -"櫨>lú|\\\ ;" -"櫪>lì|\\\ ;" -"櫭>jì|\\\ ;" -"櫯>sū|\\\ ;" -"櫲>yù|\\\ ;" -"櫸>jǔ|\\\ ;" -"欂>bó|\\\ ;" -"欅>jǔ|\\\ ;" -"欋>qú|\\\ ;" -"欎>yù|\\\ ;" -"欐>lǐ|\\\ ;" -"欚>lǐ|\\\ ;" -"欛>bà|\\\ ;" -"欝>yù|\\\ ;" -"欥>yù|\\\ ;" -"欨>ké|\\\ ;" -"欭>hē|\\\ ;" -"欯>xí|\\\ ;" -"欰>xū|\\\ ;" -"欸>ǎi|\\\ ;" -"歈>ǒu|\\\ ;" -"歋>yí|\\\ ;" -"歍>wū|\\\ ;" -"歐>ōu|\\\ ;" -"歑>hū|\\\ ;" -"歒>tì|\\\ ;" -"歔>xū|\\\ ;" -"歘>xū|\\\ ;" -"歝>yì|\\\ ;" -"歟>yú|\\\ ;" -"歨>bù|\\\ ;" -"歩>bù|\\\ ;" -"歫>jù|\\\ ;" -"歮>sè|\\\ ;" -"歰>sè|\\\ ;" -"歴>lì|\\\ ;" -"歶>yú|\\\ ;" -"歷>lì|\\\ ;" -"歾>mò|\\\ ;" -"歿>mò|\\\ ;" -"殈>xù|\\\ ;" -"殐>sù|\\\ ;" -"殔>yì|\\\ ;" -"殜>yè|\\\ ;" -"殢>tì|\\\ ;" -"殧>cù|\\\ ;" -"殬>dù|\\\ ;" -"殰>dú|\\\ ;" -"殹>yì|\\\ ;" -"殻>ké|\\\ ;" -"殼>ké|\\\ ;" -"毄>jī|\\\ ;" -"毆>ōu|\\\ ;" -"毉>yī|\\\ ;" -"毐>ǎi|\\\ ;" -"毘>pí|\\\ ;" -"毣>mù|\\\ ;" -"毤>ěr|\\\ ;" -"毦>èr|\\\ ;" -"毩>jú|\\\ ;" -"毪>mú|\\\ ;" -"毱>jú|\\\ ;" -"毴>bī|\\\ ;" -"毼>hé|\\\ ;" -"毾>tà|\\\ ;" -"氀>lǘ|\\\ ;" -"氁>mú|\\\ ;" -"氍>qú|\\\ ;" -"気>qì|\\\ ;" -"氜>rì|\\\ ;" -"氣>qì|\\\ ;" -"氥>xī|\\\ ;" -"氬>yà|\\\ ;" -"氻>lè|\\\ ;" -"氼>nì|\\\ ;" -"汏>dà|\\\ ;" -"汙>wū|\\\ ;" -"汚>wā|\\\ ;" -"汥>gǔ|\\\ ;" -"汿>xù|\\\ ;" -"沀>xù|\\\ ;" -"沍>hù|\\\ ;" -"沕>wù|\\\ ;" -"沘>bǐ|\\\ ;" -"沞>zā|\\\ ;" -"沢>ōu|\\\ ;" -"沴>lì|\\\ ;" -"沵>mǐ|\\\ ;" -"沶>fú|\\\ ;" -"沷>fā|\\\ ;" -"泀>jū|\\\ ;" -"泃>jù|\\\ ;" -"泆>yī|\\\ ;" -"泋>bì|\\\ ;" -"泐>lè|\\\ ;" -"泒>gū|\\\ ;" -"泘>hū|\\\ ;" -"泚>cǐ|\\\ ;" -"泝>sù|\\\ ;" -"泤>nǐ|\\\ ;" -"泦>jú|\\\ ;" -"泭>fū|\\\ ;" -"泲>jǐ|\\\ ;" -"洍>sì|\\\ ;" -"洏>ér|\\\ ;" -"洑>fú|\\\ ;" -"洖>wú|\\\ ;" -"洝>àn|\\\ ;" -"洟>yí|\\\ ;" -"洠>wū|\\\ ;" -"洢>yī|\\\ ;" -"洣>mǐ|\\\ ;" -"洦>mò|\\\ ;" -"洰>jù|\\\ ;" -"洿>wū|\\\ ;" -"浀>qǔ|\\\ ;" -"浂>yì|\\\ ;" -"浝>dí|\\\ ;" -"浡>bó|\\\ ;" -"浥>yì|\\\ ;" -"浬>lǐ|\\\ ;" -"浰>lì|\\\ ;" -"浳>yì|\\\ ;" -"涖>lì|\\\ ;" -"涘>sì|\\\ ;" -"涜>dú|\\\ ;" -"涴>wò|\\\ ;" -"涺>jū|\\\ ;" -"涾>tà|\\\ ;" -"淂>dé|\\\ ;" -"淈>gǔ|\\\ ;" -"淒>qī|\\\ ;" -"淕>lù|\\\ ;" -"淗>jú|\\\ ;" -"淠>pì|\\\ ;" -"淢>yù|\\\ ;" -"淥>lù|\\\ ;" -"淧>mì|\\\ ;" -"淯>yù|\\\ ;" -"淴>hū|\\\ ;" -"淿>mì|\\\ ;" -"渃>rè|\\\ ;" -"渇>kě|\\\ ;" -"済>jì|\\\ ;" -"渒>pì|\\\ ;" -"渧>dì|\\\ ;" -"測>cè|\\\ ;" -"渮>gē|\\\ ;" -"渱>ěr|\\\ ;" -"渳>mǐ|\\\ ;" -"渿>bá|\\\ ;" -"湆>qì|\\\ ;" -"湇>qì|\\\ ;" -"湐>mò|\\\ ;" -"湑>xǔ|\\\ ;" -"湒>jí|\\\ ;" -"湙>yì|\\\ ;" -"湡>yú|\\\ ;" -"湢>bì|\\\ ;" -"湤>jú|\\\ ;" -"湥>tú|\\\ ;" -"湨>qù|\\\ ;" -"湽>zī|\\\ ;" -"溇>lǚ|\\\ ;" -"溚>dá|\\\ ;" -"溛>wā|\\\ ;" -"溞>mì|\\\ ;" -"溡>bó|\\\ ;" -"溤>mǎ|\\\ ;" -"溦>qī|\\\ ;" -"溩>wù|\\\ ;" -"溭>zé|\\\ ;" -"溸>sù|\\\ ;" -"溹>sù|\\\ ;" -"滆>hé|\\\ ;" -"滊>cí|\\\ ;" -"滌>dí|\\\ ;" -"滒>bì|\\\ ;" -"滪>yù|\\\ ;" -"滬>hù|\\\ ;" -"滭>bì|\\\ ;" -"滵>mì|\\\ ;" -"滶>áo|\\\ ;" -"滷>lǔ|\\\ ;" -"滸>hǔ|\\\ ;" -"滺>dí|\\\ ;" -"漁>yú|\\\ ;" -"漃>jí|\\\ ;" -"漄>yá|\\\ ;" -"漇>xǐ|\\\ ;" -"漈>jì|\\\ ;" -"漊>lǚ|\\\ ;" -"漚>ōu|\\\ ;" -"漜>yě|\\\ ;" -"漝>xí|\\\ ;" -"漞>mì|\\\ ;" -"漥>wā|\\\ ;" -"漦>lí|\\\ ;" -"漬>zì|\\\ ;" -"漵>xù|\\\ ;" -"漽>tí|\\\ ;" -"潊>xù|\\\ ;" -"潎>pì|\\\ ;" -"潐>bō|\\\ ;" -"潑>pō|\\\ ;" -"潒>bō|\\\ ;" -"潕>wǔ|\\\ ;" -"潖>pá|\\\ ;" -"潗>jí|\\\ ;" -"潝>xī|\\\ ;" -"潟>xì|\\\ ;" -"潥>sù|\\\ ;" -"潩>yì|\\\ ;" -"潪>dí|\\\ ;" -"潱>yē|\\\ ;" -"潳>tú|\\\ ;" -"潶>bì|\\\ ;" -"潷>bǐ|\\\ ;" -"澀>sè|\\\ ;" -"澁>sè|\\\ ;" -"澅>ào|\\\ ;" -"澓>fú|\\\ ;" -"澕>hé|\\\ ;" -"澙>xì|\\\ ;" -"澞>yú|\\\ ;" -"澤>zé|\\\ ;" -"澦>yù|\\\ ;" -"澬>zī|\\\ ;" -"澲>yè|\\\ ;" -"澼>pì|\\\ ;" -"澽>jù|\\\ ;" -"澾>tà|\\\ ;" -"濇>sè|\\\ ;" -"濈>jí|\\\ ;" -"濌>tà|\\\ ;" -"濐>mí|\\\ ;" -"濔>mǐ|\\\ ;" -"濖>nì|\\\ ;" -"濗>mì|\\\ ;" -"濚>bì|\\\ ;" -"濝>qí|\\\ ;" -"濟>jì|\\\ ;" -"濣>wò|\\\ ;" -"濥>xī|\\\ ;" -"濨>cí|\\\ ;" -"濭>ài|\\\ ;" -"濲>gǔ|\\\ ;" -"濾>lǜ|\\\ ;" -"濿>lì|\\\ ;" -"瀃>sì|\\\ ;" -"瀆>dú|\\\ ;" -"瀎>mò|\\\ ;" -"瀔>gǔ|\\\ ;" -"瀘>lú|\\\ ;" -"瀝>lì|\\\ ;" -"瀫>hú|\\\ ;" -"瀰>mí|\\\ ;" -"瀱>jì|\\\ ;" -"瀷>yì|\\\ ;" -"灈>qú|\\\ ;" -"灋>fǎ|\\\ ;" -"灍>lí|\\\ ;" -"灑>sǎ|\\\ ;" -"灕>lí|\\\ ;" -"灖>mǐ|\\\ ;" -"灪>yù|\\\ ;" -"炇>pò|\\\ ;" -"炈>yì|\\\ ;" -"炋>pī|\\\ ;" -"炑>mù|\\\ ;" -"炟>dá|\\\ ;" -"炣>kě|\\\ ;" -"炥>fú|\\\ ;" -"炦>bá|\\\ ;" -"烅>xù|\\\ ;" -"烌>wù|\\\ ;" -"烏>wū|\\\ ;" -"烖>gé|\\\ ;" -"烞>pò|\\\ ;" -"烰>fú|\\\ ;" -"烳>pǔ|\\\ ;" -"烼>hū|\\\ ;" -"焀>hú|\\\ ;" -"焁>xī|\\\ ;" -"焃>hè|\\\ ;" -"焅>kù|\\\ ;" -"焈>xī|\\\ ;" -"焍>dì|\\\ ;" -"焏>jí|\\\ ;" -"焗>jú|\\\ ;" -"焟>xí|\\\ ;" -"無>wú|\\\ ;" -"焣>jù|\\\ ;" -"焤>fǔ|\\\ ;" -"焥>wò|\\\ ;" -"焬>xí|\\\ ;" -"焷>pí|\\\ ;" -"焸>gǔ|\\\ ;" -"煂>hè|\\\ ;" -"煏>bì|\\\ ;" -"煕>xī|\\\ ;" -"煠>yè|\\\ ;" -"煾>n̄|\\\ ;" -"煿>bó|\\\ ;" -"熂>xì|\\\ ;" -"熃>wù|\\\ ;" -"熆>hé|\\\ ;" -"熈>xī|\\\ ;" -"熚>bì|\\\ ;" -"熝>lù|\\\ ;" -"熤>yì|\\\ ;" -"熩>āo|\\\ ;" -"熪>yí|\\\ ;" -"熰>ōu|\\\ ;" -"熱>rè|\\\ ;" -"熺>xī|\\\ ;" -"熻>xī|\\\ ;" -"熼>yì|\\\ ;" -"燁>yè|\\\ ;" -"燏>yù|\\\ ;" -"燡>yì|\\\ ;" -"燨>xī|\\\ ;" -"燱>yì|\\\ ;" -"燸>rú|\\\ ;" -"爀>bó|\\\ ;" -"爄>lì|\\\ ;" -"爅>mò|\\\ ;" -"爇>rè|\\\ ;" -"爉>là|\\\ ;" -"爊>āo|\\\ ;" -"爏>lì|\\\ ;" -"爐>lú|\\\ ;" -"爗>yè|\\\ ;" -"爢>mí|\\\ ;" -"爩>yù|\\\ ;" -"爴>fǔ|\\\ ;" -"爺>yé|\\\ ;" -"爾>ěr|\\\ ;" -"牁>gē|\\\ ;" -"牔>bó|\\\ ;" -"牘>dú|\\\ ;" -"牠>tā|\\\ ;" -"牫>gē|\\\ ;" -"牭>sì|\\\ ;" -"牱>gē|\\\ ;" -"牳>mǔ|\\\ ;" -"牴>dǐ|\\\ ;" -"牸>zì|\\\ ;" -"犂>lí|\\\ ;" -"犆>tè|\\\ ;" -"犐>kē|\\\ ;" -"犑>jú|\\\ ;" -"犔>xì|\\\ ;" -"犘>má|\\\ ;" -"犛>lí|\\\ ;" -"犡>lì|\\\ ;" -"犢>dú|\\\ ;" -"犤>pí|\\\ ;" -"犥>bó|\\\ ;" -"犧>xī|\\\ ;" -"犮>bá|\\\ ;" -"犱>jǐ|\\\ ;" -"犳>án|\\\ ;" -"犵>qì|\\\ ;" -"犻>bó|\\\ ;" -"犽>yá|\\\ ;" -"狇>mù|\\\ ;" -"狉>pī|\\\ ;" -"狊>jú|\\\ ;" -"狋>ní|\\\ ;" -"狓>pī|\\\ ;" -"狔>nǐ|\\\ ;" -"狕>ǎo|\\\ ;" -"狛>pò|\\\ ;" -"狜>gǔ|\\\ ;" -"狢>hé|\\\ ;" -"狤>jí|\\\ ;" -"狧>tà|\\\ ;" -"狳>yú|\\\ ;" -"狶>xǐ|\\\ ;" -"猈>bà|\\\ ;" -"猉>qí|\\\ ;" -"猚>yá|\\\ ;" -"猤>jì|\\\ ;" -"猧>wō|\\\ ;" -"猰>yà|\\\ ;" -"猲>hè|\\\ ;" -"猼>bó|\\\ ;" -"猽>mǎ|\\\ ;" -"獁>mà|\\\ ;" -"獄>yù|\\\ ;" -"獈>yì|\\\ ;" -"獏>mú|\\\ ;" -"獓>áo|\\\ ;" -"獘>bì|\\\ ;" -"獙>bì|\\\ ;" -"獛>pú|\\\ ;" -"獝>yù|\\\ ;" -"獥>xí|\\\ ;" -"獦>gé|\\\ ;" -"獨>dú|\\\ ;" -"獹>lú|\\\ ;" -"獺>tǎ|\\\ ;" -"獼>mí|\\\ ;" -"玂>qí|\\\ ;" -"玆>zī|\\\ ;" -"玈>lú|\\\ ;" -"玊>sù|\\\ ;" -"玍>gǎ|\\\ ;" -"玏>lè|\\\ ;" -"玐>bā|\\\ ;" -"玓>dì|\\\ ;" -"玗>yú|\\\ ;" -"玘>jǐ|\\\ ;" -"玝>wǔ|\\\ ;" -"玞>fū|\\\ ;" -"玡>yà|\\\ ;" -"玭>pí|\\\ ;" -"玴>yì|\\\ ;" -"玵>án|\\\ ;" -"玸>cī|\\\ ;" -"玼>cǐ|\\\ ;" -"珁>cí|\\\ ;" -"珆>yí|\\\ ;" -"珇>zǔ|\\\ ;" -"珌>bì|\\\ ;" -"珕>lì|\\\ ;" -"珝>xǔ|\\\ ;" -"珟>sù|\\\ ;" -"珬>xù|\\\ ;" -"珶>dì|\\\ ;" -"珷>wǔ|\\\ ;" -"珸>wú|\\\ ;" -"琈>fú|\\\ ;" -"琋>lí|\\\ ;" -"琍>lì|\\\ ;" -"琙>yù|\\\ ;" -"琭>lù|\\\ ;" -"琺>fà|\\\ ;" -"琽>dǔ|\\\ ;" -"瑀>yǔ|\\\ ;" -"瑅>tí|\\\ ;" -"瑘>yé|\\\ ;" -"瑦>wū|\\\ ;" -"瑪>mǎ|\\\ ;" -"瑮>lì|\\\ ;" -"瑹>tú|\\\ ;" -"瑿>lī|\\\ ;" -"璂>qí|\\\ ;" -"璈>áo|\\\ ;" -"璑>wú|\\\ ;" -"璖>qú|\\\ ;" -"璣>jī|\\\ ;" -"璦>ài|\\\ ;" -"璱>sè|\\\ ;" -"璵>yú|\\\ ;" -"璷>lú|\\\ ;" -"璽>xǐ|\\\ ;" -"璾>jì|\\\ ;" -"瓄>dú|\\\ ;" -"瓅>lì|\\\ ;" -"瓈>lí|\\\ ;" -"瓋>bó|\\\ ;" -"瓎>là|\\\ ;" -"瓐>lú|\\\ ;" -"瓑>lì|\\\ ;" -"瓕>mí|\\\ ;" -"瓗>xī|\\\ ;" -"瓝>bó|\\\ ;" -"瓡>wà|\\\ ;" -"瓥>lì|\\\ ;" -"瓪>bù|\\\ ;" -"瓳>hú|\\\ ;" -"瓵>yí|\\\ ;" -"甆>cí|\\\ ;" -"甈>qì|\\\ ;" -"甋>dì|\\\ ;" -"甌>ōu|\\\ ;" -"甒>wǔ|\\\ ;" -"甦>sū|\\\ ;" -"甪>lù|\\\ ;" -"甶>fú|\\\ ;" -"畁>qí|\\\ ;" -"畆>mǔ|\\\ ;" -"畉>fú|\\\ ;" -"畐>fú|\\\ ;" -"畒>mǔ|\\\ ;" -"畖>wā|\\\ ;" -"畗>dá|\\\ ;" -"畝>mǔ|\\\ ;" -"畞>mǔ|\\\ ;" -"畟>cè|\\\ ;" -"畢>bì|\\\ ;" -"畣>dá|\\\ ;" -"畬>yú|\\\ ;" -"畮>mǔ|\\\ ;" -"異>yì|\\\ ;" -"疈>bò|\\\ ;" -"疕>bǐ|\\\ ;" -"疞>xū|\\\ ;" -"疪>bì|\\\ ;" -"疷>qí|\\\ ;" -"疺>fá|\\\ ;" -"痆>nì|\\\ ;" -"痜>tū|\\\ ;" -"痡>pū|\\\ ;" -"痬>yì|\\\ ;" -"痲>má|\\\ ;" -"痵>jì|\\\ ;" -"痷>ān|\\\ ;" -"痺>bì|\\\ ;" -"瘂>yǎ|\\\ ;" -"瘄>cù|\\\ ;" -"瘈>jì|\\\ ;" -"瘉>yù|\\\ ;" -"瘏>tú|\\\ ;" -"瘔>kù|\\\ ;" -"瘜>xí|\\\ ;" -"瘞>yì|\\\ ;" -"瘯>cù|\\\ ;" -"瘱>yì|\\\ ;" -"瘻>lǘ|\\\ ;" -"瘼>mò|\\\ ;" -"癁>fú|\\\ ;" -"癊>ái|\\\ ;" -"癋>hè|\\\ ;" -"癒>yù|\\\ ;" -"癘>lì|\\\ ;" -"癠>jì|\\\ ;" -"癧>lì|\\\ ;" -"癶>bō|\\\ ;" -"癹>pō|\\\ ;" -"発>fā|\\\ ;" -"發>fā|\\\ ;" -"癿>jí|\\\ ;" -"皀>bī|\\\ ;" -"皁>dí|\\\ ;" -"皅>pā|\\\ ;" -"皉>cǐ|\\\ ;" -"皍>jí|\\\ ;" -"皕>bī|\\\ ;" -"皚>ái|\\\ ;" -"皟>zé|\\\ ;" -"皣>yè|\\\ ;" -"皧>ài|\\\ ;" -"皪>lì|\\\ ;" -"皬>hè|\\\ ;" -"皷>gǔ|\\\ ;" -"皼>gǔ|\\\ ;" -"皾>dú|\\\ ;" -"盇>hé|\\\ ;" -"盉>hé|\\\ ;" -"盋>bō|\\\ ;" -"盓>gě|\\\ ;" -"盙>fǔ|\\\ ;" -"盝>lù|\\\ ;" -"盦>ān|\\\ ;" -"盧>lú|\\\ ;" -"盫>ān|\\\ ;" -"盬>gǔ|\\\ ;" -"盭>lì|\\\ ;" -"盵>qì|\\\ ;" -"盻>xì|\\\ ;" -"眔>dà|\\\ ;" -"眗>jū|\\\ ;" -"眜>mò|\\\ ;" -"眡>dī|\\\ ;" -"眤>yí|\\\ ;" -"眥>zì|\\\ ;" -"眫>mǐ|\\\ ;" -"眱>yí|\\\ ;" -"眲>èr|\\\ ;" -"眽>mò|\\\ ;" -"睎>xī|\\\ ;" -"睝>lí|\\\ ;" -"睤>bì|\\\ ;" -"睩>lù|\\\ ;" -"睪>yì|\\\ ;" -"睮>yú|\\\ ;" -"睰>mà|\\\ ;" -"睲>jì|\\\ ;" -"睳>xī|\\\ ;" -"睼>tì|\\\ ;" -"瞁>fá|\\\ ;" -"瞂>fā|\\\ ;" -"瞇>mī|\\\ ;" -"瞔>zé|\\\ ;" -"瞖>yì|\\\ ;" -"瞘>ōu|\\\ ;" -"瞙>mò|\\\ ;" -"瞡>jì|\\\ ;" -"瞤>bì|\\\ ;" -"瞨>pú|\\\ ;" -"瞱>yè|\\\ ;" -"瞲>xù|\\\ ;" -"瞸>jí|\\\ ;" -"瞹>ài|\\\ ;" -"矋>lì|\\\ ;" -"矑>lú|\\\ ;" -"矖>xǐ|\\\ ;" -"矞>yù|\\\ ;" -"矠>cè|\\\ ;" -"矵>qì|\\\ ;" -"矷>zǐ|\\\ ;" -"矹>kū|\\\ ;" -"矻>kù|\\\ ;" -"砅>lì|\\\ ;" -"砆>fū|\\\ ;" -"砞>mò|\\\ ;" -"砠>qū|\\\ ;" -"砡>kē|\\\ ;" -"砨>ài|\\\ ;" -"砪>mǔ|\\\ ;" -"砬>lá|\\\ ;" -"砮>nǔ|\\\ ;" -"砱>ài|\\\ ;" -"砳>lè|\\\ ;" -"砵>bō|\\\ ;" -"砶>pò|\\\ ;" -"硉>lù|\\\ ;" -"硋>ài|\\\ ;" -"硢>wò|\\\ ;" -"硲>yù|\\\ ;" -"硵>lǔ|\\\ ;" -"碁>qí|\\\ ;" -"碆>bō|\\\ ;" -"碋>hè|\\\ ;" -"碔>wǔ|\\\ ;" -"碕>qí|\\\ ;" -"碢>kè|\\\ ;" -"碦>kè|\\\ ;" -"碮>tí|\\\ ;" -"碶>qì|\\\ ;" -"碼>mǎ|\\\ ;" -"磃>sī|\\\ ;" -"磇>pī|\\\ ;" -"磍>xī|\\\ ;" -"磎>qī|\\\ ;" -"磏>ái|\\\ ;" -"磒>kě|\\\ ;" -"磖>lā|\\\ ;" -"磜>qì|\\\ ;" -"磝>áo|\\\ ;" -"磟>lù|\\\ ;" -"磠>lǔ|\\\ ;" -"磣>cà|\\\ ;" -"磧>qì|\\\ ;" -"磩>qī|\\\ ;" -"磯>jī|\\\ ;" -"磶>xì|\\\ ;" -"磼>áo|\\\ ;" -"磾>dī|\\\ ;" -"磿>lì|\\\ ;" -"礇>yù|\\\ ;" -"礉>hé|\\\ ;" -"礍>kē|\\\ ;" -"礏>jí|\\\ ;" -"礒>yǐ|\\\ ;" -"礔>pì|\\\ ;" -"礕>pī|\\\ ;" -"礖>yù|\\\ ;" -"礘>qì|\\\ ;" -"礙>ài|\\\ ;" -"礠>cí|\\\ ;" -"礡>bó|\\\ ;" -"礤>cǎ|\\\ ;" -"礪>lì|\\\ ;" -"礫>lì|\\\ ;" -"礰>lì|\\\ ;" -"礳>mò|\\\ ;" -"祂>tā|\\\ ;" -"祃>mà|\\\ ;" -"祇>qí|\\\ ;" -"祔>fù|\\\ ;" -"祕>mì|\\\ ;" -"祣>lǚ|\\\ ;" -"祤>yǔ|\\\ ;" -"祦>wú|\\\ ;" -"祻>gù|\\\ ;" -"祿>lù|\\\ ;" -"禊>xì|\\\ ;" -"禌>zī|\\\ ;" -"禑>wú|\\\ ;" -"禔>tí|\\\ ;" -"禕>yī|\\\ ;" -"禗>sī|\\\ ;" -"禘>dì|\\\ ;" -"禝>jí|\\\ ;" -"禠>sī|\\\ ;" -"禡>mà|\\\ ;" -"禢>tā|\\\ ;" -"禥>qí|\\\ ;" -"禦>yù|\\\ ;" -"禨>jī|\\\ ;" -"禭>mí|\\\ ;" -"禮>lǐ|\\\ ;" -"禰>mí|\\\ ;" -"禲>lì|\\\ ;" -"禵>tí|\\\ ;" -"禿>tū|\\\ ;" -"秄>zǐ|\\\ ;" -"秇>yì|\\\ ;" -"秗>bì|\\\ ;" -"秙>kù|\\\ ;" -"秛>pī|\\\ ;" -"秜>ní|\\\ ;" -"秝>jū|\\\ ;" -"秠>pī|\\\ ;" -"秡>bá|\\\ ;" -"秬>jù|\\\ ;" -"秱>cí|\\\ ;" -"秴>hé|\\\ ;" -"秶>zī|\\\ ;" -"秺>dù|\\\ ;" -"秿>fǔ|\\\ ;" -"稃>fū|\\\ ;" -"稊>tí|\\\ ;" -"稌>tú|\\\ ;" -"稑>lù|\\\ ;" -"稒>gù|\\\ ;" -"稘>jī|\\\ ;" -"稢>yù|\\\ ;" -"稧>xì|\\\ ;" -"稩>jì|\\\ ;" -"稪>fù|\\\ ;" -"稫>bī|\\\ ;" -"稰>xū|\\\ ;" -"稵>zī|\\\ ;" -"稶>yù|\\\ ;" -"稺>qǐ|\\\ ;" -"穀>gǔ|\\\ ;" -"穄>jì|\\\ ;" -"穊>jì|\\\ ;" -"穋>lù|\\\ ;" -"穌>sū|\\\ ;" -"積>jī|\\\ ;" -"穓>yì|\\\ ;" -"穖>jǐ|\\\ ;" -"穙>pú|\\\ ;" -"穡>sè|\\\ ;" -"穥>yù|\\\ ;" -"穧>jì|\\\ ;" -"穭>lǚ|\\\ ;" -"穲>lí|\\\ ;" -"穵>wā|\\\ ;" -"窊>wā|\\\ ;" -"窏>wū|\\\ ;" -"窢>xù|\\\ ;" -"窣>sù|\\\ ;" -"窩>wō|\\\ ;" -"窪>wā|\\\ ;" -"窫>yà|\\\ ;" -"窭>jù|\\\ ;" -"窶>jù|\\\ ;" -"窸>xī|\\\ ;" -"窹>wù|\\\ ;" -"竒>qí|\\\ ;" -"竘>jǔ|\\\ ;" -"竡>yī|\\\ ;" -"竢>sì|\\\ ;" -"竩>yì|\\\ ;" -"竬>qǔ|\\\ ;" -"笌>yá|\\\ ;" -"笓>pí|\\\ ;" -"笖>yǐ|\\\ ;" -"笝>nà|\\\ ;" -"笟>gū|\\\ ;" -"笧>cè|\\\ ;" -"笮>zé|\\\ ;" -"笰>fú|\\\ ;" -"笴>gě|\\\ ;" -"筁>qǔ|\\\ ;" -"筆>bǐ|\\\ ;" -"筎>rú|\\\ ;" -"筓>dā|\\\ ;" -"筞>cè|\\\ ;" -"筟>fū|\\\ ;" -"筣>lì|\\\ ;" -"筥>jǔ|\\\ ;" -"筴>cè|\\\ ;" -"箁>pú|\\\ ;" -"箄>bì|\\\ ;" -"箅>bì|\\\ ;" -"箆>bì|\\\ ;" -"箇>gè|\\\ ;" -"箊>yū|\\\ ;" -"箒>dá|\\\ ;" -"箓>lù|\\\ ;" -"箙>fú|\\\ ;" -"箛>gū|\\\ ;" -"箣>cè|\\\ ;" -"箤>jú|\\\ ;" -"箥>bǒ|\\\ ;" -"箶>hú|\\\ ;" -"箻>lǜ|\\\ ;" -"箼>wū|\\\ ;" -"箿>jí|\\\ ;" -"篕>hé|\\\ ;" -"篤>dǔ|\\\ ;" -"篥>lì|\\\ ;" -"篰>bù|\\\ ;" -"篳>bì|\\\ ;" -"篴>dí|\\\ ;" -"篽>yǔ|\\\ ;" -"簀>zé|\\\ ;" -"簃>yí|\\\ ;" -"簄>hù|\\\ ;" -"簊>jī|\\\ ;" -"簕>lè|\\\ ;" -"簙>bó|\\\ ;" -"簚>mì|\\\ ;" -"簛>sī|\\\ ;" -"簠>fǔ|\\\ ;" -"簬>lù|\\\ ;" -"簴>jù|\\\ ;" -"簵>dù|\\\ ;" -"簶>bǒ|\\\ ;" -"簻>kē|\\\ ;" -"簼>bù|\\\ ;" -"籅>yú|\\\ ;" -"籊>tì|\\\ ;" -"籋>mí|\\\ ;" -"籙>lù|\\\ ;" -"籚>lú|\\\ ;" -"籞>yù|\\\ ;" -"籢>jǔ|\\\ ;" -"籧>qú|\\\ ;" -"籬>lí|\\\ ;" -"籭>sī|\\\ ;" -"籲>yù|\\\ ;" -"籹>nǚ|\\\ ;" -"籾>ní|\\\ ;" -"粃>bǐ|\\\ ;" -"粅>wù|\\\ ;" -"粊>bì|\\\ ;" -"粍>lí|\\\ ;" -"粔>jù|\\\ ;" -"粖>mò|\\\ ;" -"粙>xī|\\\ ;" -"粚>lí|\\\ ;" -"粛>sù|\\\ ;" -"粣>cè|\\\ ;" -"粰>fú|\\\ ;" -"粴>lǐ|\\\ ;" -"粶>lù|\\\ ;" -"粷>jú|\\\ ;" -"粸>qí|\\\ ;" -"糆>hū|\\\ ;" -"糈>xǔ|\\\ ;" -"糎>lí|\\\ ;" -"糐>fū|\\\ ;" -"糑>nì|\\\ ;" -"糓>gǔ|\\\ ;" -"糢>mó|\\\ ;" -"糦>xī|\\\ ;" -"糪>bó|\\\ ;" -"糲>lì|\\\ ;" -"糴>dí|\\\ ;" -"糹>sī|\\\ ;" -"糿>jǐ|\\\ ;" -"紀>jì|\\\ ;" -"紆>yū|\\\ ;" -"紇>gē|\\\ ;" -"紌>jì|\\\ ;" -"納>nà|\\\ ;" -"紎>zī|\\\ ;" -"紕>pī|\\\ ;" -"級>jí|\\\ ;" -"紨>fù|\\\ ;" -"紪>cǐ|\\\ ;" -"紮>zā|\\\ ;" -"細>xì|\\\ ;" -"紱>fú|\\\ ;" -"紶>qǔ|\\\ ;" -"紼>fú|\\\ ;" -"絁>qū|\\\ ;" -"組>zǔ|\\\ ;" -"絇>jù|\\\ ;" -"絈>mò|\\\ ;" -"絗>hú|\\\ ;" -"絘>cì|\\\ ;" -"絝>kù|\\\ ;" -"絥>fú|\\\ ;" -"絲>sī|\\\ ;" -"絽>lǚ|\\\ ;" -"綇>tì|\\\ ;" -"綈>tí|\\\ ;" -"綌>xì|\\\ ;" -"綍>fú|\\\ ;" -"綒>fū|\\\ ;" -"綔>hù|\\\ ;" -"継>jì|\\\ ;" -"綟>lì|\\\ ;" -"綠>lǜ|\\\ ;" -"綥>qì|\\\ ;" -"綨>qí|\\\ ;" -"綺>qǐ|\\\ ;" -"緀>qī|\\\ ;" -"緆>yì|\\\ ;" -"緇>zī|\\\ ;" -"緎>yù|\\\ ;" -"緑>jī|\\\ ;" -"緒>xù|\\\ ;" -"緖>xù|\\\ ;" -"緙>kè|\\\ ;" -"緝>qī|\\\ ;" -"締>dì|\\\ ;" -"緦>sī|\\\ ;" -"緮>fù|\\\ ;" -"緰>yú|\\\ ;" -"緹>tí|\\\ ;" -"縃>xū|\\\ ;" -"縊>yì|\\\ ;" -"縌>nì|\\\ ;" -"縎>gǔ|\\\ ;" -"縛>fú|\\\ ;" -"縟>rù|\\\ ;" -"縠>hú|\\\ ;" -"縪>bì|\\\ ;" -"縬>cù|\\\ ;" -"縭>lí|\\\ ;" -"縷>lǚ|\\\ ;" -"縸>mò|\\\ ;" -"績>jī|\\\ ;" -"繄>yī|\\\ ;" -"繋>xì|\\\ ;" -"繘>yù|\\\ ;" -"繥>xī|\\\ ;" -"繨>dá|\\\ ;" -"繫>xì|\\\ ;" -"繴>bì|\\\ ;" -"繶>yì|\\\ ;" -"繹>yì|\\\ ;" -"繺>rú|\\\ ;" -"繻>xū|\\\ ;" -"繼>jì|\\\ ;" -"纀>pú|\\\ ;" -"纅>lì|\\\ ;" -"纆>mò|\\\ ;" -"續>xù|\\\ ;" -"纑>lú|\\\ ;" -"纗>lí|\\\ ;" -"纚>xǐ|\\\ ;" -"绋>fú|\\\ ;" -"绤>xì|\\\ ;" -"缇>tí|\\\ ;" -"缌>sī|\\\ ;" -"缽>bō|\\\ ;" -"罊>qì|\\\ ;" -"罏>lú|\\\ ;" -"罙>mí|\\\ ;" -"罛>gū|\\\ ;" -"罝>jū|\\\ ;" -"罞>bā|\\\ ;" -"罟>gǔ|\\\ ;" -"罤>tí|\\\ ;" -"罦>fú|\\\ ;" -"罭>yù|\\\ ;" -"罯>ǎn|\\\ ;" -"罰>fá|\\\ ;" -"罳>sī|\\\ ;" -"罵>mà|\\\ ;" -"罷>bà|\\\ ;" -"罸>fá|\\\ ;" -"罼>bì|\\\ ;" -"罽>jì|\\\ ;" -"羃>mì|\\\ ;" -"羆>pí|\\\ ;" -"羇>jī|\\\ ;" -"羈>jī|\\\ ;" -"羋>mǐ|\\\ ;" -"羍>tà|\\\ ;" -"羓>bā|\\\ ;" -"羖>gǔ|\\\ ;" -"羛>yì|\\\ ;" -"義>yì|\\\ ;" -"羭>yú|\\\ ;" -"羺>hù|\\\ ;" -"翇>fú|\\\ ;" -"翋>lā|\\\ ;" -"翍>pī|\\\ ;" -"翑>qú|\\\ ;" -"習>xí|\\\ ;" -"翖>xì|\\\ ;" -"翗>qí|\\\ ;" -"翜>sè|\\\ ;" -"翯>hè|\\\ ;" -"翵>qú|\\\ ;" -"翺>áo|\\\ ;" -"耏>ér|\\\ ;" -"耔>zǐ|\\\ ;" -"耟>jù|\\\ ;" -"耠>hé|\\\ ;" -"耤>jí|\\\ ;" -"耫>zé|\\\ ;" -"耭>jī|\\\ ;" -"聉>wā|\\\ ;" -"聏>ér|\\\ ;" -"聐>yà|\\\ ;" -"聛>bì|\\\ ;" -"聜>dǐ|\\\ ;" -"聟>xù|\\\ ;" -"聥>yǔ|\\\ ;" -"聻>jī|\\\ ;" -"肀>yù|\\\ ;" -"肂>sì|\\\ ;" -"肅>sù|\\\ ;" -"肐>gē|\\\ ;" -"肑>dì|\\\ ;" -"肔>yǐ|\\\ ;" -"肗>dǔ|\\\ ;" -"肟>wò|\\\ ;" -"肣>bǐ|\\\ ;" -"肬>nǜ|\\\ ;" -"肭>nà|\\\ ;" -"肳>qí|\\\ ;" -"肶>pí|\\\ ;" -"肸>xì|\\\ ;" -"肹>bì|\\\ ;" -"胈>bá|\\\ ;" -"胉>bó|\\\ ;" -"胊>qú|\\\ ;" -"胏>zǐ|\\\ ;" -"胐>kū|\\\ ;" -"胒>fū|\\\ ;" -"胔>zì|\\\ ;" -"胕>fù|\\\ ;" -"胠>qū|\\\ ;" -"胢>kē|\\\ ;" -"胣>yǐ|\\\ ;" -"胩>kǎ|\\\ ;" -"胬>nú|\\\ ;" -"胷>àn|\\\ ;" -"胹>ér|\\\ ;" -"胾>zì|\\\ ;" -"脎>sà|\\\ ;" -"脟>lè|\\\ ;" -"脦>dē|\\\ ;" -"脨>cù|\\\ ;" -"脴>pǐ|\\\ ;" -"脵>gǔ|\\\ ;" -"腒>jū|\\\ ;" -"腗>pí|\\\ ;" -"腘>ér|\\\ ;" -"腛>wū|\\\ ;" -"腣>dì|\\\ ;" -"腤>ān|\\\ ;" -"腯>tú|\\\ ;" -"腷>bì|\\\ ;" -"腽>wà|\\\ ;" -"膃>wà|\\\ ;" -"膆>sù|\\\ ;" -"膉>yì|\\\ ;" -"膌>jí|\\\ ;" -"膍>pí|\\\ ;" -"膒>ōu|\\\ ;" -"膔>lù|\\\ ;" -"膚>fū|\\\ ;" -"膟>lǜ|\\\ ;" -"膢>lǘ|\\\ ;" -"膩>nì|\\\ ;" -"膲>hū|\\\ ;" -"膴>hū|\\\ ;" -"臈>là|\\\ ;" -"臋>ér|\\\ ;" -"臍>qí|\\\ ;" -"臑>rú|\\\ ;" -"臖>lǚ|\\\ ;" -"臘>là|\\\ ;" -"臚>lú|\\\ ;" -"臞>qú|\\\ ;" -"臡>ní|\\\ ;" -"臥>wò|\\\ ;" -"臵>gé|\\\ ;" -"與>yú|\\\ ;" -"舉>jǔ|\\\ ;" -"舖>pù|\\\ ;" -"舗>pū|\\\ ;" -"舥>pā|\\\ ;" -"舴>zé|\\\ ;" -"舻>lú|\\\ ;" -"艀>fú|\\\ ;" -"艃>lí|\\\ ;" -"艅>mù|\\\ ;" -"艊>bó|\\\ ;" -"艍>jū|\\\ ;" -"艗>yì|\\\ ;" -"艣>lǔ|\\\ ;" -"艤>yǐ|\\\ ;" -"艩>qí|\\\ ;" -"艪>lǔ|\\\ ;" -"艫>lú|\\\ ;" -"艻>lè|\\\ ;" -"芅>yì|\\\ ;" -"芇>mǐ|\\\ ;" -"芌>xū|\\\ ;" -"芏>dù|\\\ ;" -"芐>hù|\\\ ;" -"芑>qǐ|\\\ ;" -"芓>zǐ|\\\ ;" -"芘>pí|\\\ ;" -"芞>qǐ|\\\ ;" -"芧>xù|\\\ ;" -"芺>ǎo|\\\ ;" -"苅>yì|\\\ ;" -"苈>lì|\\\ ;" -"苉>pǐ|\\\ ;" -"苐>yí|\\\ ;" -"苙>lì|\\\ ;" -"苢>qǔ|\\\ ;" -"苩>bó|\\\ ;" -"苸>hū|\\\ ;" -"苼>bó|\\\ ;" -"苽>gū|\\\ ;" -"苾>bì|\\\ ;" -"茀>fú|\\\ ;" -"茇>bá|\\\ ;" -"茈>cí|\\\ ;" -"茊>zī|\\\ ;" -"茋>dǐ|\\\ ;" -"茖>gé|\\\ ;" -"茟>yù|\\\ ;" -"茣>wú|\\\ ;" -"茤>jì|\\\ ;" -"茦>cè|\\\ ;" -"茮>cī|\\\ ;" -"茰>yú|\\\ ;" -"茲>zī|\\\ ;" -"茷>fá|\\\ ;" -"荅>dā|\\\ ;" -"荋>ér|\\\ ;" -"荌>àn|\\\ ;" -"荙>dá|\\\ ;" -"荝>zé|\\\ ;" -"荰>dù|\\\ ;" -"荴>fū|\\\ ;" -"荹>bù|\\\ ;" -"荾>pú|\\\ ;" -"莁>wú|\\\ ;" -"莃>xī|\\\ ;" -"莈>mò|\\\ ;" -"莋>jí|\\\ ;" -"莯>mù|\\\ ;" -"莿>cì|\\\ ;" -"菂>dī|\\\ ;" -"菈>lā|\\\ ;" -"菉>lù|\\\ ;" -"菐>pú|\\\ ;" -"菑>zī|\\\ ;" -"菒>bó|\\\ ;" -"菝>bá|\\\ ;" -"菞>lí|\\\ ;" -"菥>xī|\\\ ;" -"菧>dǐ|\\\ ;" -"菳>ǎn|\\\ ;" -"菴>ān|\\\ ;" -"菷>yū|\\\ ;" -"萀>hǔ|\\\ ;" -"萆>bì|\\\ ;" -"萒>jǔ|\\\ ;" -"萓>yí|\\\ ;" -"萕>qí|\\\ ;" -"萗>cè|\\\ ;" -"萪>kē|\\\ ;" -"萭>yǔ|\\\ ;" -"萯>fù|\\\ ;" -"萳>cè|\\\ ;" -"萴>zé|\\\ ;" -"萵>wō|\\\ ;" -"萺>là|\\\ ;" -"萻>ān|\\\ ;" -"葅>jū|\\\ ;" -"葈>xǐ|\\\ ;" -"葉>yè|\\\ ;" -"葊>ān|\\\ ;" -"葋>qú|\\\ ;" -"葍>fú|\\\ ;" -"葎>lǜ|\\\ ;" -"葖>tú|\\\ ;" -"葞>mǐ|\\\ ;" -"葧>bó|\\\ ;" -"葪>jì|\\\ ;" -"蒘>nú|\\\ ;" -"蒚>hé|\\\ ;" -"蒞>lì|\\\ ;" -"蒟>jǔ|\\\ ;" -"蒠>xí|\\\ ;" -"蒣>xú|\\\ ;" -"蒤>tú|\\\ ;" -"蒦>wò|\\\ ;" -"蒩>zū|\\\ ;" -"蒪>pò|\\\ ;" -"蒮>yù|\\\ ;" -"蒰>bó|\\\ ;" -"蒱>pú|\\\ ;" -"蒳>nà|\\\ ;" -"蒵>xī|\\\ ;" -"蒽>ēn|\\\ ;" -"蒾>mí|\\\ ;" -"蓆>xí|\\\ ;" -"蓇>gǔ|\\\ ;" -"蓒>bì|\\\ ;" -"蓗>lā|\\\ ;" -"蓛>cè|\\\ ;" -"蓣>yù|\\\ ;" -"蓭>ān|\\\ ;" -"蓹>yǔ|\\\ ;" -"蓺>yì|\\\ ;" -"蓻>jí|\\\ ;" -"蓽>bì|\\\ ;" -"蓾>lǔ|\\\ ;" -"蔀>bù|\\\ ;" -"蔁>xì|\\\ ;" -"蔇>jì|\\\ ;" -"蔋>dí|\\\ ;" -"蔍>lù|\\\ ;" -"蔐>dí|\\\ ;" -"蔔>bō|\\\ ;" -"蔕>dì|\\\ ;" -"蔛>hú|\\\ ;" -"蔜>áo|\\\ ;" -"蔝>mǐ|\\\ ;" -"蔠>cā|\\\ ;" -"蔤>mì|\\\ ;" -"蔰>hù|\\\ ;" -"蔴>má|\\\ ;" -"蔾>lí|\\\ ;" -"蕀>jí|\\\ ;" -"蕂>bō|\\\ ;" -"蕅>ǒu|\\\ ;" -"蕍>yú|\\\ ;" -"蕗>lù|\\\ ;" -"蕟>fà|\\\ ;" -"蕥>yǎ|\\\ ;" -"蕦>xū|\\\ ;" -"蕧>fù|\\\ ;" -"蕪>wú|\\\ ;" -"蕬>sī|\\\ ;" -"蕮>xì|\\\ ;" -"蕷>yù|\\\ ;" -"蕺>jí|\\\ ;" -"薁>yù|\\\ ;" -"薂>xí|\\\ ;" -"薆>ài|\\\ ;" -"薊>jì|\\\ ;" -"薋>cī|\\\ ;" -"薖>kē|\\\ ;" -"薘>dá|\\\ ;" -"薙>tì|\\\ ;" -"薣>gǔ|\\\ ;" -"薩>sà|\\\ ;" -"薶>lí|\\\ ;" -"薷>rú|\\\ ;" -"薺>jì|\\\ ;" -"薾>ěr|\\\ ;" -"薿>nǐ|\\\ ;" -"藄>qí|\\\ ;" -"藅>fá|\\\ ;" -"藇>xù|\\\ ;" -"藈>jí|\\\ ;" -"藌>lā|\\\ ;" -"藗>sù|\\\ ;" -"藘>lǘ|\\\ ;" -"藙>yì|\\\ ;" -"藚>xù|\\\ ;" -"藝>yì|\\\ ;" -"藞>lǎ|\\\ ;" -"藡>dí|\\\ ;" -"藦>mó|\\\ ;" -"藶>lì|\\\ ;" -"藹>ǎi|\\\ ;" -"蘁>wù|\\\ ;" -"蘂>jī|\\\ ;" -"蘄>qí|\\\ ;" -"蘆>lú|\\\ ;" -"蘇>sū|\\\ ;" -"蘎>jì|\\\ ;" -"蘓>sū|\\\ ;" -"蘙>yì|\\\ ;" -"蘛>yú|\\\ ;" -"蘜>jú|\\\ ;" -"蘥>qù|\\\ ;" -"蘪>mí|\\\ ;" -"蘮>jì|\\\ ;" -"蘺>lí|\\\ ;" -"蘻>jì|\\\ ;" -"虀>jī|\\\ ;" -"虂>lù|\\\ ;" -"虉>yì|\\\ ;" -"虒>sī|\\\ ;" -"虖>hū|\\\ ;" -"虗>qū|\\\ ;" -"虙>fú|\\\ ;" -"虛>xū|\\\ ;" -"虜>lǔ|\\\ ;" -"虝>hǔ|\\\ ;" -"虡>jù|\\\ ;" -"虩>xì|\\\ ;" -"虳>dì|\\\ ;" -"蚆>pā|\\\ ;" -"蚑>qí|\\\ ;" -"蚔>qí|\\\ ;" -"蚚>qí|\\\ ;" -"蚞>mù|\\\ ;" -"蚥>fǔ|\\\ ;" -"蚭>ní|\\\ ;" -"蚮>tè|\\\ ;" -"蚷>jù|\\\ ;" -"蚸>lì|\\\ ;" -"蚹>fù|\\\ ;" -"蚽>pí|\\\ ;" -"蚾>bǒ|\\\ ;" -"蛌>gǔ|\\\ ;" -"蛒>gé|\\\ ;" -"蛓>cì|\\\ ;" -"蛗>fù|\\\ ;" -"蛜>yī|\\\ ;" -"蛠>lì|\\\ ;" -"蛡>yì|\\\ ;" -"蛦>yí|\\\ ;" -"蛨>mò|\\\ ;" -"蜅>fǔ|\\\ ;" -"蜌>bì|\\\ ;" -"蜛>jū|\\\ ;" -"蜝>qí|\\\ ;" -"蜟>yù|\\\ ;" -"蜤>sī|\\\ ;" -"蜧>lì|\\\ ;" -"蜱>pí|\\\ ;" -"蜶>sù|\\\ ;" -"蜺>ní|\\\ ;" -"蝃>dì|\\\ ;" -"蝋>là|\\\ ;" -"蝍>jí|\\\ ;" -"蝑>lì|\\\ ;" -"蝓>yú|\\\ ;" -"蝜>fù|\\\ ;" -"蝭>tí|\\\ ;" -"蝲>là|\\\ ;" -"蝳>dú|\\\ ;" -"蝹>án|\\\ ;" -"蝺>jǔ|\\\ ;" -"螄>sī|\\\ ;" -"螆>cì|\\\ ;" -"螇>xī|\\\ ;" -"螏>jí|\\\ ;" -"螐>wū|\\\ ;" -"螔>yí|\\\ ;" -"螕>bī|\\\ ;" -"螘>yǐ|\\\ ;" -"螙>dù|\\\ ;" -"螛>hé|\\\ ;" -"螜>hú|\\\ ;" -"螞>mā|\\\ ;" -"螠>yì|\\\ ;" -"螮>dì|\\\ ;" -"螰>lù|\\\ ;" -"螷>pí|\\\ ;" -"蟅>mò|\\\ ;" -"蟇>má|\\\ ;" -"蟍>lí|\\\ ;" -"蟔>mò|\\\ ;" -"蟖>sī|\\\ ;" -"蟘>tè|\\\ ;" -"蟝>qú|\\\ ;" -"蟢>xǐ|\\\ ;" -"蟣>jǐ|\\\ ;" -"蟰>lí|\\\ ;" -"蟴>sī|\\\ ;" -"蟸>lǐ|\\\ ;" -"蟻>yǐ|\\\ ;" -"蟼>jì|\\\ ;" -"蟽>dá|\\\ ;" -"蟿>qì|\\\ ;" -"蠀>cī|\\\ ;" -"蠇>lì|\\\ ;" -"蠈>zé|\\\ ;" -"蠌>zé|\\\ ;" -"蠏>rú|\\\ ;" -"蠐>qí|\\\ ;" -"蠚>hē|\\\ ;" -"蠟>là|\\\ ;" -"蠠>mì|\\\ ;" -"蠣>lì|\\\ ;" -"蠦>lú|\\\ ;" -"蠧>dù|\\\ ;" -"蠫>lì|\\\ ;" -"蠮>yē|\\\ ;" -"蠱>gǔ|\\\ ;" -"蠵>xī|\\\ ;" -"蠷>qú|\\\ ;" -"衇>mò|\\\ ;" -"衈>ěr|\\\ ;" -"衋>xì|\\\ ;" -"衚>hú|\\\ ;" -"衧>yú|\\\ ;" -"衪>yǐ|\\\ ;" -"衭>fū|\\\ ;" -"衵>nì|\\\ ;" -"衹>qí|\\\ ;" -"袐>bì|\\\ ;" -"袓>jǔ|\\\ ;" -"袔>hè|\\\ ;" -"袘>yí|\\\ ;" -"袙>mò|\\\ ;" -"袚>fú|\\\ ;" -"袛>dī|\\\ ;" -"袦>nà|\\\ ;" -"袩>bì|\\\ ;" -"袪>qū|\\\ ;" -"袯>bó|\\\ ;" -"袲>yí|\\\ ;" -"袹>mò|\\\ ;" -"袻>ér|\\\ ;" -"袽>rú|\\\ ;" -"裓>gé|\\\ ;" -"裚>jì|\\\ ;" -"裛>yì|\\\ ;" -"補>bǔ|\\\ ;" -"裡>lǐ|\\\ ;" -"裻>dǔ|\\\ ;" -"褀>jì|\\\ ;" -"褅>tì|\\\ ;" -"褆>tí|\\\ ;" -"複>fù|\\\ ;" -"褔>fù|\\\ ;" -"褕>yú|\\\ ;" -"褟>dá|\\\ ;" -"褲>kù|\\\ ;" -"褵>lí|\\\ ;" -"褸>lǚ|\\\ ;" -"褹>yì|\\\ ;" -"襀>jī|\\\ ;" -"襆>pú|\\\ ;" -"襋>jí|\\\ ;" -"襍>zá|\\\ ;" -"襏>bó|\\\ ;" -"襖>ǎo|\\\ ;" -"襣>bí|\\\ ;" -"襥>pú|\\\ ;" -"襦>rú|\\\ ;" -"襪>wà|\\\ ;" -"襮>bó|\\\ ;" -"襲>xí|\\\ ;" -"襼>yì|\\\ ;" -"襾>yà|\\\ ;" -"覀>xī|\\\ ;" -"覇>bà|\\\ ;" -"覈>hé|\\\ ;" -"覉>jī|\\\ ;" -"覊>jī|\\\ ;" -"覓>mì|\\\ ;" -"覔>mì|\\\ ;" -"覗>sī|\\\ ;" -"覛>mì|\\\ ;" -"覡>xí|\\\ ;" -"覤>xì|\\\ ;" -"覦>yú|\\\ ;" -"覩>dǔ|\\\ ;" -"覬>jì|\\\ ;" -"覰>qù|\\\ ;" -"覷>qù|\\\ ;" -"覾>jí|\\\ ;" -"覿>dí|\\\ ;" -"觕>cū|\\\ ;" -"觙>jí|\\\ ;" -"觝>dǐ|\\\ ;" -"觡>gé|\\\ ;" -"觬>ní|\\\ ;" -"觭>jī|\\\ ;" -"觮>lù|\\\ ;" -"觰>dǎ|\\\ ;" -"觱>bì|\\\ ;" -"觹>xī|\\\ ;" -"觻>lù|\\\ ;" -"觽>xī|\\\ ;" -"觿>xī|\\\ ;" -"訃>fù|\\\ ;" -"計>jì|\\\ ;" -"訏>xū|\\\ ;" -"訑>yí|\\\ ;" -"訖>qì|\\\ ;" -"記>jì|\\\ ;" -"訝>yà|\\\ ;" -"訥>nè|\\\ ;" -"許>xǔ|\\\ ;" -"訲>cī|\\\ ;" -"訳>yì|\\\ ;" -"訴>sù|\\\ ;" -"訶>hē|\\\ ;" -"訸>hé|\\\ ;" -"訹>xù|\\\ ;" -"訿>zī|\\\ ;" -"詁>gǔ|\\\ ;" -"詂>fù|\\\ ;" -"詆>dǐ|\\\ ;" -"詍>yì|\\\ ;" -"詎>jù|\\\ ;" -"詏>ào|\\\ ;" -"詒>yí|\\\ ;" -"詓>qǔ|\\\ ;" -"詖>bì|\\\ ;" -"詘>qū|\\\ ;" -"詙>bá|\\\ ;" -"詚>dá|\\\ ;" -"詛>zǔ|\\\ ;" -"詞>cí|\\\ ;" -"詡>xǔ|\\\ ;" -"詣>yì|\\\ ;" -"詥>hé|\\\ ;" -"詸>mí|\\\ ;" -"誀>èr|\\\ ;" -"誈>wú|\\\ ;" -"誋>jì|\\\ ;" -"誎>sù|\\\ ;" -"誒>āi|\\\ ;" -"誖>bó|\\\ ;" -"誝>ān|\\\ ;" -"語>yǔ|\\\ ;" -"誟>wū|\\\ ;" -"誣>wū|\\\ ;" -"誤>wù|\\\ ;" -"誧>pǔ|\\\ ;" -"読>dú|\\\ ;" -"課>kè|\\\ ;" -"誳>qū|\\\ ;" -"誻>tà|\\\ ;" -"誼>yì|\\\ ;" -"誽>ná|\\\ ;" -"諀>pǐ|\\\ ;" -"諅>jī|\\\ ;" -"諆>qī|\\\ ;" -"諊>jú|\\\ ;" -"諎>zé|\\\ ;" -"諛>yú|\\\ ;" -"諝>xǔ|\\\ ;" -"諦>dì|\\\ ;" -"諨>fú|\\\ ;" -"諩>pǔ|\\\ ;" -"諬>qǐ|\\\ ;" -"諭>yù|\\\ ;" -"諮>zī|\\\ ;" -"諰>xǐ|\\\ ;" -"諳>ān|\\\ ;" -"諽>gé|\\\ ;" -"諿>qì|\\\ ;" -"謁>yè|\\\ ;" -"謈>bó|\\\ ;" -"謌>gē|\\\ ;" -"謎>mí|\\\ ;" -"謐>mì|\\\ ;" -"謑>xì|\\\ ;" -"謖>sù|\\\ ;" -"謣>yú|\\\ ;" -"謧>lí|\\\ ;" -"謨>mó|\\\ ;" -"謩>mò|\\\ ;" -"謮>zé|\\\ ;" -"謳>ōu|\\\ ;" -"謴>ào|\\\ ;" -"謵>xí|\\\ ;" -"謷>áo|\\\ ;" -"謸>áo|\\\ ;" -"謻>yí|\\\ ;" -"謼>hū|\\\ ;" -"譃>xū|\\\ ;" -"譅>sè|\\\ ;" -"譆>xī|\\\ ;" -"譏>jī|\\\ ;" -"譒>bò|\\\ ;" -"譕>mú|\\\ ;" -"譜>pǔ|\\\ ;" -"譤>jī|\\\ ;" -"譪>ài|\\\ ;" -"譯>yì|\\\ ;" -"議>yì|\\\ ;" -"譶>tà|\\\ ;" -"護>hù|\\\ ;" -"譽>yù|\\\ ;" -"讀>dú|\\\ ;" -"讈>lì|\\\ ;" -"讉>yí|\\\ ;" -"讛>yì|\\\ ;" -"讟>dú|\\\ ;" -"诐>bì|\\\ ;" -"谞>xū|\\\ ;" -"谸>qī|\\\ ;" -"谿>qī|\\\ ;" -"豀>xī|\\\ ;" -"豄>dú|\\\ ;" -"豈>qǐ|\\\ ;" -"豍>bī|\\\ ;" -"豙>yì|\\\ ;" -"豝>bā|\\\ ;" -"豠>cú|\\\ ;" -"豦>qú|\\\ ;" -"豧>fū|\\\ ;" -"豨>xī|\\\ ;" -"豯>xī|\\\ ;" -"豰>bó|\\\ ;" -"豴>dí|\\\ ;" -"豷>yì|\\\ ;" -"豻>àn|\\\ ;" -"豽>nà|\\\ ;" -"豾>pī|\\\ ;" -"貀>nà|\\\ ;" -"貃>mò|\\\ ;" -"貄>sì|\\\ ;" -"貈>hé|\\\ ;" -"貍>lí|\\\ ;" -"貎>ní|\\\ ;" -"貏>bǐ|\\\ ;" -"貐>yǔ|\\\ ;" -"貕>xī|\\\ ;" -"貗>jù|\\\ ;" -"貘>mò|\\\ ;" -"負>fù|\\\ ;" -"貣>tè|\\\ ;" -"貤>yí|\\\ ;" -"責>zé|\\\ ;" -"貮>èr|\\\ ;" -"貱>bì|\\\ ;" -"貲>zī|\\\ ;" -"貳>èr|\\\ ;" -"貹>bì|\\\ ;" -"貽>yí|\\\ ;" -"賀>hè|\\\ ;" -"賂>lù|\\\ ;" -"資>zī|\\\ ;" -"賈>gǔ|\\\ ;" -"賉>xù|\\\ ;" -"賜>cì|\\\ ;" -"賦>fù|\\\ ;" -"賫>jī|\\\ ;" -"賭>dǔ|\\\ ;" -"賰>qí|\\\ ;" -"賷>jī|\\\ ;" -"賹>ài|\\\ ;" -"賻>fù|\\\ ;" -"賾>zé|\\\ ;" -"贔>bì|\\\ ;" -"贕>dú|\\\ ;" -"赑>bì|\\\ ;" -"赙>fù|\\\ ;" -"赥>xì|\\\ ;" -"赲>lì|\\\ ;" -"赼>cī|\\\ ;" -"趆>dī|\\\ ;" -"趇>sè|\\\ ;" -"趗>cù|\\\ ;" -"趘>xí|\\\ ;" -"趜>jú|\\\ ;" -"趢>lù|\\\ ;" -"趦>zī|\\\ ;" -"趧>tí|\\\ ;" -"趨>qū|\\\ ;" -"趯>tì|\\\ ;" -"趷>kē|\\\ ;" -"跁>pá|\\\ ;" -"跂>qí|\\\ ;" -"跇>yì|\\\ ;" -"跐>cǐ|\\\ ;" -"跔>jū|\\\ ;" -"跙>jǔ|\\\ ;" -"跞>lì|\\\ ;" -"跠>yí|\\\ ;" -"跡>jī|\\\ ;" -"跶>tà|\\\ ;" -"跼>jú|\\\ ;" -"跿>tú|\\\ ;" -"踄>bó|\\\ ;" -"踑>qí|\\\ ;" -"踖>jí|\\\ ;" -"踘>jú|\\\ ;" -"踛>lù|\\\ ;" -"踤>cù|\\\ ;" -"踥>jī|\\\ ;" -"踦>jǐ|\\\ ;" -"踧>cù|\\\ ;" -"踰>yú|\\\ ;" -"踶>dì|\\\ ;" -"踾>fú|\\\ ;" -"踿>zú|\\\ ;" -"蹃>dì|\\\ ;" -"蹏>tí|\\\ ;" -"蹐>jí|\\\ ;" -"蹕>bì|\\\ ;" -"蹗>lù|\\\ ;" -"蹜>sù|\\\ ;" -"蹝>xǐ|\\\ ;" -"蹟>jī|\\\ ;" -"蹢>dí|\\\ ;" -"蹫>jú|\\\ ;" -"蹳>bō|\\\ ;" -"蹵>cù|\\\ ;" -"蹹>tà|\\\ ;" -"蹽>dā|\\\ ;" -"躂>tà|\\\ ;" -"躃>bì|\\\ ;" -"躄>bì|\\\ ;" -"躋>jī|\\\ ;" -"躌>wǔ|\\\ ;" -"躒>lì|\\\ ;" -"躢>tà|\\\ ;" -"躣>qú|\\\ ;" -"躰>tǐ|\\\ ;" -"躷>ǎi|\\\ ;" -"躸>jī|\\\ ;" -"躹>jú|\\\ ;" -"軀>qū|\\\ ;" -"軄>jū|\\\ ;" -"軆>tǐ|\\\ ;" -"軉>yù|\\\ ;" -"軋>yà|\\\ ;" -"軜>nà|\\\ ;" -"軝>qí|\\\ ;" -"軤>hū|\\\ ;" -"軥>qú|\\\ ;" -"軧>dǐ|\\\ ;" -"軪>āo|\\\ ;" -"軯>fǔ|\\\ ;" -"軱>gū|\\\ ;" -"軲>kū|\\\ ;" -"軷>bá|\\\ ;" -"軻>kē|\\\ ;" -"軼>yì|\\\ ;" -"輀>ér|\\\ ;" -"輂>jú|\\\ ;" -"輅>lù|\\\ ;" -"輍>yù|\\\ ;" -"輔>fǔ|\\\ ;" -"輗>ní|\\\ ;" -"輜>zī|\\\ ;" -"輢>yǐ|\\\ ;" -"輯>jí|\\\ ;" -"輵>gé|\\\ ;" -"輹>fù|\\\ ;" -"輺>zī|\\\ ;" -"輻>fú|\\\ ;" -"輿>yú|\\\ ;" -"轂>gū|\\\ ;" -"轃>hé|\\\ ;" -"轆>lù|\\\ ;" -"轐>pú|\\\ ;" -"轕>gé|\\\ ;" -"轖>sè|\\\ ;" -"轚>jí|\\\ ;" -"轜>ér|\\\ ;" -"轝>yú|\\\ ;" -"轢>lì|\\\ ;" -"轣>lì|\\\ ;" -"轤>lú|\\\ ;" -"轪>dì|\\\ ;" -"轷>hū|\\\ ;" -"辝>cí|\\\ ;" -"辢>là|\\\ ;" -"辤>cí|\\\ ;" -"辭>cí|\\\ ;" -"迃>yí|\\\ ;" -"迆>yǐ|\\\ ;" -"迉>qí|\\\ ;" -"迊>zā|\\\ ;" -"迏>jì|\\\ ;" -"迖>dá|\\\ ;" -"迡>nì|\\\ ;" -"迻>yí|\\\ ;" -"逓>dì|\\\ ;" -"逜>wù|\\\ ;" -"逳>yù|\\\ ;" -"逷>tì|\\\ ;" -"逹>dá|\\\ ;" -"遆>tí|\\\ ;" -"達>dá|\\\ ;" -"遝>tà|\\\ ;" -"遞>dì|\\\ ;" -"遪>cè|\\\ ;" -"遫>sù|\\\ ;" -"遬>sù|\\\ ;" -"遰>dì|\\\ ;" -"遹>yù|\\\ ;" -"遺>yí|\\\ ;" -"遻>wù|\\\ ;" -"邇>ěr|\\\ ;" -"邌>lí|\\\ ;" -"邐>lǐ|\\\ ;" -"邒>jì|\\\ ;" -"邔>qǐ|\\\ ;" -"邘>yú|\\\ ;" -"邚>rú|\\\ ;" -"邞>fū|\\\ ;" -"邭>jù|\\\ ;" -"邲>bì|\\\ ;" -"邷>wǎ|\\\ ;" -"郀>kū|\\\ ;" -"郃>hé|\\\ ;" -"郋>xí|\\\ ;" -"郘>lǚ|\\\ ;" -"郙>fǔ|\\\ ;" -"郚>wú|\\\ ;" -"郣>bó|\\\ ;" -"郤>xì|\\\ ;" -"郩>cī|\\\ ;" -"郪>qī|\\\ ;" -"郳>ní|\\\ ;" -"郶>bù|\\\ ;" -"郹>jú|\\\ ;" -"郼>yī|\\\ ;" -"鄃>yú|\\\ ;" -"鄅>yǔ|\\\ ;" -"鄊>rǔ|\\\ ;" -"鄎>xì|\\\ ;" -"鄏>rù|\\\ ;" -"鄑>zī|\\\ ;" -"鄓>jú|\\\ ;" -"鄔>wū|\\\ ;" -"鄚>mò|\\\ ;" -"鄜>fū|\\\ ;" -"鄠>hù|\\\ ;" -"鄦>xǔ|\\\ ;" -"鄨>bì|\\\ ;" -"鄪>bì|\\\ ;" -"鄴>yè|\\\ ;" -"鄿>qí|\\\ ;" -"酅>xī|\\\ ;" -"酈>lì|\\\ ;" -"酏>yí|\\\ ;" -"酑>yǔ|\\\ ;" -"酦>pò|\\\ ;" -"酴>tú|\\\ ;" -"酺>pú|\\\ ;" -"酾>xǐ|\\\ ;" -"醁>lù|\\\ ;" -"醏>dū|\\\ ;" -"醑>xǔ|\\\ ;" -"醗>pò|\\\ ;" -"醘>kè|\\\ ;" -"醧>yù|\\\ ;" -"醨>lí|\\\ ;" -"醫>yī|\\\ ;" -"醭>bú|\\\ ;" -"醱>pò|\\\ ;" -"醳>yì|\\\ ;" -"醷>yì|\\\ ;" -"醹>rú|\\\ ;" -"醾>mí|\\\ ;" -"醿>mí|\\\ ;" -"釃>xǐ|\\\ ;" -"釐>lí|\\\ ;" -"釒>gá|\\\ ;" -"釓>gá|\\\ ;" -"釔>yǐ|\\\ ;" -"釙>pō|\\\ ;" -"釛>hé|\\\ ;" -"釟>bā|\\\ ;" -"釡>fǔ|\\\ ;" -"釨>zǐ|\\\ ;" -"釰>rì|\\\ ;" -"釱>dì|\\\ ;" -"釳>xì|\\\ ;" -"釴>yì|\\\ ;" -"釷>tǔ|\\\ ;" -"釸>xì|\\\ ;" -"釹>nǚ|\\\ ;" -"釽>pī|\\\ ;" -"鈀>bǎ|\\\ ;" -"鈇>fū|\\\ ;" -"鈈>bù|\\\ ;" -"鈉>nà|\\\ ;" -"鈒>jí|\\\ ;" -"鈘>jǐ|\\\ ;" -"鈚>pí|\\\ ;" -"鈠>yì|\\\ ;" -"鈤>rì|\\\ ;" -"鈭>zī|\\\ ;" -"鈮>ní|\\\ ;" -"鈯>kē|\\\ ;" -"鈲>gū|\\\ ;" -"鈳>kē|\\\ ;" -"鈶>yí|\\\ ;" -"鈷>gǔ|\\\ ;" -"鈸>bó|\\\ ;" -"鈹>pí|\\\ ;" -"鈺>yù|\\\ ;" -"鈻>sì|\\\ ;" -"鈽>bù|\\\ ;" -"鉅>jù|\\\ ;" -"鉈>tā|\\\ ;" -"鉌>hé|\\\ ;" -"鉍>bì|\\\ ;" -"鉎>jǔ|\\\ ;" -"鉐>pǒ|\\\ ;" -"鉑>bó|\\\ ;" -"鉔>zā|\\\ ;" -"鉕>pō|\\\ ;" -"鉖>ān|\\\ ;" -"鉘>fú|\\\ ;" -"鉜>fú|\\\ ;" -"鉝>lì|\\\ ;" -"鉢>bō|\\\ ;" -"鉧>mǔ|\\\ ;" -"鉨>nǐ|\\\ ;" -"鉪>dì|\\\ ;" -"鉬>mù|\\\ ;" -"鉯>ěr|\\\ ;" -"鉰>sī|\\\ ;" -"鉲>kǎ|\\\ ;" -"鉺>ěr|\\\ ;" -"鉻>gè|\\\ ;" -"鉿>hā|\\\ ;" -"銆>mò|\\\ ;" -"銈>jī|\\\ ;" -"銉>yù|\\\ ;" -"銊>xù|\\\ ;" -"銔>pī|\\\ ;" -"銡>jí|\\\ ;" -"銢>pǐ|\\\ ;" -"銣>rú|\\\ ;" -"銤>mǐ|\\\ ;" -"銥>yī|\\\ ;" -"銨>ǎn|\\\ ;" -"銫>sè|\\\ ;" -"銰>āi|\\\ ;" -"銻>tī|\\\ ;" -"鋁>lǚ|\\\ ;" -"鋉>sù|\\\ ;" -"鋊>yù|\\\ ;" -"鋍>bó|\\\ ;" -"鋖>sī|\\\ ;" -"鋘>wú|\\\ ;" -"鋙>wú|\\\ ;" -"鋦>jū|\\\ ;" -"鋪>pū|\\\ ;" -"鋰>lǐ|\\\ ;" -"鋱>tè|\\\ ;" -"鋵>tū|\\\ ;" -"鋸>jū|\\\ ;" -"錁>kè|\\\ ;" -"錂>fú|\\\ ;" -"錄>lù|\\\ ;" -"錅>lí|\\\ ;" -"錌>àn|\\\ ;" -"錍>pí|\\\ ;" -"錎>kē|\\\ ;" -"錏>yà|\\\ ;" -"錔>tà|\\\ ;" -"錖>dǔ|\\\ ;" -"錙>zī|\\\ ;" -"錡>qí|\\\ ;" -"錤>jī|\\\ ;" -"錥>tì|\\\ ;" -"錫>xí|\\\ ;" -"錮>gù|\\\ ;" -"錰>lǜ|\\\ ;" -"録>lù|\\\ ;" -"錴>lù|\\\ ;" -"錷>gá|\\\ ;" -"鍀>dé|\\\ ;" -"鍉>dī|\\\ ;" -"鍍>dù|\\\ ;" -"鍎>tú|\\\ ;" -"鍑>fù|\\\ ;" -"鍓>jí|\\\ ;" -"鍗>tí|\\\ ;" -"鍢>fù|\\\ ;" -"鍱>yè|\\\ ;" -"鍶>sī|\\\ ;" -"鍷>dǔ|\\\ ;" -"鍸>hú|\\\ ;" -"鍿>zī|\\\ ;" -"鎁>yé|\\\ ;" -"鎄>āi|\\\ ;" -"鎉>tà|\\\ ;" -"鎎>xì|\\\ ;" -"鎐>zú|\\\ ;" -"鎘>gé|\\\ ;" -"鎙>dā|\\\ ;" -"鎛>bó|\\\ ;" -"鎝>sà|\\\ ;" -"鎞>bī|\\\ ;" -"鎡>zī|\\\ ;" -"鎢>wū|\\\ ;" -"鎰>yì|\\\ ;" -"鎴>xí|\\\ ;" -"鎶>gē|\\\ ;" -"鎷>mǎ|\\\ ;" -"鎿>ná|\\\ ;" -"鏀>lǔ|\\\ ;" -"鏂>ōu|\\\ ;" -"鏃>zú|\\\ ;" -"鏉>ào|\\\ ;" -"鏋>dī|\\\ ;" -"鏌>mò|\\\ ;" -"鏎>bì|\\\ ;" -"鏑>dī|\\\ ;" -"鏕>lù|\\\ ;" -"鏚>qì|\\\ ;" -"鏫>lí|\\\ ;" -"鏭>xī|\\\ ;" -"鏴>lù|\\\ ;" -"鏶>jí|\\\ ;" -"鏷>pú|\\\ ;" -"鏺>pō|\\\ ;" -"鐖>jī|\\\ ;" -"鐚>yà|\\\ ;" -"鐟>tì|\\\ ;" -"鐠>pǔ|\\\ ;" -"鐪>lǔ|\\\ ;" -"鐭>yù|\\\ ;" -"鐴>bì|\\\ ;" -"鐷>yè|\\\ ;" -"鐻>jù|\\\ ;" -"鐽>bì|\\\ ;" -"鐿>yì|\\\ ;" -"鑀>ài|\\\ ;" -"鑇>jī|\\\ ;" -"鑉>tà|\\\ ;" -"鑐>xū|\\\ ;" -"鑗>lí|\\\ ;" -"鑙>jī|\\\ ;" -"鑞>là|\\\ ;" -"鑟>dú|\\\ ;" -"鑢>lǜ|\\\ ;" -"鑥>lǔ|\\\ ;" -"鑪>lú|\\\ ;" -"鑮>bó|\\\ ;" -"鑴>xī|\\\ ;" -"鑺>qú|\\\ ;" -"钄>gá|\\\ ;" -"钑>jí|\\\ ;" -"钖>xí|\\\ ;" -"钷>pō|\\\ ;" -"铔>yà|\\\ ;" -"铘>yé|\\\ ;" -"铯>sè|\\\ ;" -"铻>wú|\\\ ;" -"铽>tè|\\\ ;" -"锜>qí|\\\ ;" -"锝>dé|\\\ ;" -"锿>āi|\\\ ;" -"镃>zī|\\\ ;" -"镈>bó|\\\ ;" -"镥>lǔ|\\\ ;" -"镴>là|\\\ ;" -"镸>ào|\\\ ;" -"镺>ǎo|\\\ ;" -"镼>qū|\\\ ;" -"镾>mí|\\\ ;" -"閁>mà|\\\ ;" -"閇>bì|\\\ ;" -"閉>bì|\\\ ;" -"閝>ài|\\\ ;" -"閟>bì|\\\ ;" -"閡>hé|\\\ ;" -"閣>gé|\\\ ;" -"閤>gé|\\\ ;" -"閥>fá|\\\ ;" -"閭>lǘ|\\\ ;" -"閰>jú|\\\ ;" -"閴>qù|\\\ ;" -"閾>yù|\\\ ;" -"闃>qù|\\\ ;" -"闇>àn|\\\ ;" -"闍>dū|\\\ ;" -"闒>tà|\\\ ;" -"闔>hé|\\\ ;" -"闙>qǐ|\\\ ;" -"闟>sà|\\\ ;" -"闢>bì|\\\ ;" -"闥>tà|\\\ ;" -"阇>dū|\\\ ;" -"阘>tà|\\\ ;" -"阞>lè|\\\ ;" -"阣>yǐ|\\\ ;" -"阥>ān|\\\ ;" -"阦>ài|\\\ ;" -"阰>pí|\\\ ;" -"阹>qū|\\\ ;" -"阺>dǐ|\\\ ;" -"陑>ér|\\\ ;" -"陓>yū|\\\ ;" -"陚>fù|\\\ ;" -"陠>pū|\\\ ;" -"陭>qī|\\\ ;" -"陮>ān|\\\ ;" -"陱>jū|\\\ ;" -"陴>pí|\\\ ;" -"陸>lù|\\\ ;" -"隀>ān|\\\ ;" -"隃>yú|\\\ ;" -"隄>dī|\\\ ;" -"隌>ǎn|\\\ ;" -"隒>jī|\\\ ;" -"際>jì|\\\ ;" -"隞>áo|\\\ ;" -"隟>xì|\\\ ;" -"隦>pǐ|\\\ ;" -"隩>yù|\\\ ;" -"隬>nǐ|\\\ ;" -"隭>ér|\\\ ;" -"隮>jī|\\\ ;" -"隵>xī|\\\ ;" -"隸>lì|\\\ ;" -"隺>hè|\\\ ;" -"雃>yǎ|\\\ ;" -"雐>hū|\\\ ;" -"雑>zá|\\\ ;" -"雓>yú|\\\ ;" -"雜>zá|\\\ ;" -"雞>jī|\\\ ;" -"雟>xī|\\\ ;" -"離>lí|\\\ ;" -"雥>zá|\\\ ;" -"雦>jí|\\\ ;" -"雧>jí|\\\ ;" -"雫>nǎ|\\\ ;" -"雭>sè|\\\ ;" -"雮>mù|\\\ ;" -"雴>lì|\\\ ;" -"雸>án|\\\ ;" -"霂>mù|\\\ ;" -"霋>qī|\\\ ;" -"霚>wù|\\\ ;" -"霡>mò|\\\ ;" -"霢>mò|\\\ ;" -"霧>wù|\\\ ;" -"霫>xí|\\\ ;" -"霬>yì|\\\ ;" -"霱>yù|\\\ ;" -"霵>jí|\\\ ;" -"霷>pò|\\\ ;" -"霼>xǐ|\\\ ;" -"霽>jì|\\\ ;" -"靂>lì|\\\ ;" -"靄>ǎi|\\\ ;" -"靉>ài|\\\ ;" -"靋>lì|\\\ ;" -"靎>hè|\\\ ;" -"靏>hè|\\\ ;" -"靨>yè|\\\ ;" -"靮>dí|\\\ ;" -"靯>dù|\\\ ;" -"靰>wù|\\\ ;" -"靸>sǎ|\\\ ;" -"靹>nà|\\\ ;" -"靺>mò|\\\ ;" -"靻>zǔ|\\\ ;" -"靾>yì|\\\ ;" -"鞇>gé|\\\ ;" -"鞊>jí|\\\ ;" -"鞌>ān|\\\ ;" -"鞜>tà|\\\ ;" -"鞟>jū|\\\ ;" -"鞥>yì|\\\ ;" -"鞨>hé|\\\ ;" -"鞪>mù|\\\ ;" -"鞫>jū|\\\ ;" -"鞮>dī|\\\ ;" -"鞳>tà|\\\ ;" -"鞵>lǚ|\\\ ;" -"鞷>gé|\\\ ;" -"鞸>bì|\\\ ;" -"鞿>jī|\\\ ;" -"韃>dá|\\\ ;" -"韄>hù|\\\ ;" -"韇>dú|\\\ ;" -"韈>wà|\\\ ;" -"韍>fú|\\\ ;" -"韐>gé|\\\ ;" -"韚>gé|\\\ ;" -"韠>bì|\\\ ;" -"韣>dú|\\\ ;" -"韤>wà|\\\ ;" -"韥>dú|\\\ ;" -"韨>fú|\\\ ;" -"韲>jī|\\\ ;" -"韴>ān|\\\ ;" -"韷>lè|\\\ ;" -"頀>hù|\\\ ;" -"頁>yè|\\\ ;" -"須>xū|\\\ ;" -"頉>yí|\\\ ;" -"頊>xù|\\\ ;" -"頋>gù|\\\ ;" -"頎>qí|\\\ ;" -"預>yù|\\\ ;" -"頔>dí|\\\ ;" -"頗>pǒ|\\\ ;" -"頙>cè|\\\ ;" -"頜>hé|\\\ ;" -"頤>yí|\\\ ;" -"頦>kē|\\\ ;" -"頫>fǔ|\\\ ;" -"頱>lè|\\\ ;" -"頼>kě|\\\ ;" -"頾>zī|\\\ ;" -"頿>zī|\\\ ;" -"顆>kē|\\\ ;" -"顊>dì|\\\ ;" -"題>tí|\\\ ;" -"顗>yǐ|\\\ ;" -"顝>kū|\\\ ;" -"顣>cù|\\\ ;" -"顧>gù|\\\ ;" -"顱>lú|\\\ ;" -"颫>fú|\\\ ;" -"颯>sà|\\\ ;" -"颰>bá|\\\ ;" -"颶>jù|\\\ ;" -"颷>bī|\\\ ;" -"颸>sī|\\\ ;" -"飁>xí|\\\ ;" -"飋>sè|\\\ ;" -"飏>sì|\\\ ;" -"飔>sī|\\\ ;" -"飢>jī|\\\ ;" -"飤>sì|\\\ ;" -"飫>yù|\\\ ;" -"飳>sì|\\\ ;" -"飴>yí|\\\ ;" -"飶>bì|\\\ ;" -"飺>cí|\\\ ;" -"飼>sì|\\\ ;" -"餄>hé|\\\ ;" -"餈>cí|\\\ ;" -"餌>ěr|\\\ ;" -"餎>le|\\\ ;" -"餏>yī|\\\ ;" -"餑>bō|\\\ ;" -"餔>bū|\\\ ;" -"餗>sù|\\\ ;" -"餘>yú|\\\ ;" -"餢>bù|\\\ ;" -"餣>yè|\\\ ;" -"餬>hú|\\\ ;" -"餲>hé|\\\ ;" -"餶>gǔ|\\\ ;" -"餺>bó|\\\ ;" -"餼>xì|\\\ ;" -"饁>yè|\\\ ;" -"饃>mó|\\\ ;" -"饆>bì|\\\ ;" -"饇>yù|\\\ ;" -"饐>yì|\\\ ;" -"饑>jī|\\\ ;" -"饝>mó|\\\ ;" -"饩>xì|\\\ ;" -"饹>bō|\\\ ;" -"饻>yī|\\\ ;" -"馉>gǔ|\\\ ;" -"馌>yè|\\\ ;" -"馎>bó|\\\ ;" -"馛>bá|\\\ ;" -"馜>nǐ|\\\ ;" -"馝>bì|\\\ ;" -"馞>bó|\\\ ;" -"馟>tú|\\\ ;" -"馤>ǎi|\\\ ;" -"馬>mǎ|\\\ ;" -"馭>yù|\\\ ;" -"馹>rì|\\\ ;" -"馺>sà|\\\ ;" -"馿>lǘ|\\\ ;" -"駁>bó|\\\ ;" -"駄>pǒ|\\\ ;" -"駅>yì|\\\ ;" -"駆>qū|\\\ ;" -"駈>qū|\\\ ;" -"駊>bǒ|\\\ ;" -"駏>jù|\\\ ;" -"駑>nú|\\\ ;" -"駒>jū|\\\ ;" -"駓>pī|\\\ ;" -"駙>fù|\\\ ;" -"駜>bì|\\\ ;" -"駟>sì|\\\ ;" -"駡>mà|\\\ ;" -"駬>ěr|\\\ ;" -"駮>bó|\\\ ;" -"駶>jú|\\\ ;" -"駼>tú|\\\ ;" -"騃>ái|\\\ ;" -"騄>lù|\\\ ;" -"騈>jì|\\\ ;" -"騍>kè|\\\ ;" -"騎>qí|\\\ ;" -"騏>qí|\\\ ;" -"騖>wù|\\\ ;" -"騠>tí|\\\ ;" -"騦>sī|\\\ ;" -"騱>xī|\\\ ;" -"騳>dú|\\\ ;" -"騹>lí|\\\ ;" -"騼>lù|\\\ ;" -"騽>xí|\\\ ;" -"驀>mò|\\\ ;" -"驁>ào|\\\ ;" -"驅>qū|\\\ ;" -"驆>bì|\\\ ;" -"驈>yù|\\\ ;" -"驉>xū|\\\ ;" -"驋>bō|\\\ ;" -"驌>sù|\\\ ;" -"驛>yì|\\\ ;" -"驜>yè|\\\ ;" -"驢>lǘ|\\\ ;" -"驥>jì|\\\ ;" -"驧>jú|\\\ ;" -"驨>xī|\\\ ;" -"驪>lí|\\\ ;" -"驲>rì|\\\ ;" -"骕>sù|\\\ ;" -"骬>yú|\\\ ;" -"骮>yì|\\\ ;" -"骳>bì|\\\ ;" -"骵>tī|\\\ ;" -"髁>kē|\\\ ;" -"髆>bó|\\\ ;" -"髉>bō|\\\ ;" -"髊>cī|\\\ ;" -"髍>mó|\\\ ;" -"體>tǐ|\\\ ;" -"髗>lú|\\\ ;" -"髠>dí|\\\ ;" -"髢>tì|\\\ ;" -"髪>fà|\\\ ;" -"髮>fà|\\\ ;" -"髰>tì|\\\ ;" -"髲>pī|\\\ ;" -"髴>fú|\\\ ;" -"髵>ér|\\\ ;" -"髷>qū|\\\ ;" -"鬀>dí|\\\ ;" -"鬁>lì|\\\ ;" -"鬄>tì|\\\ ;" -"鬍>hú|\\\ ;" -"鬎>là|\\\ ;" -"鬐>qí|\\\ ;" -"鬕>mò|\\\ ;" -"鬚>xū|\\\ ;" -"鬩>hè|\\\ ;" -"鬰>yù|\\\ ;" -"鬱>yù|\\\ ;" -"鬴>fǔ|\\\ ;" -"鬾>jì|\\\ ;" -"鬿>qí|\\\ ;" -"魆>xù|\\\ ;" -"魊>yù|\\\ ;" -"魌>qī|\\\ ;" -"魓>bì|\\\ ;" -"魕>jǐ|\\\ ;" -"魖>xū|\\\ ;" -"魚>yú|\\\ ;" -"魝>jì|\\\ ;" -"魢>jǐ|\\\ ;" -"魣>xù|\\\ ;" -"魩>mò|\\\ ;" -"魮>bí|\\\ ;" -"魯>lǔ|\\\ ;" -"魱>hú|\\\ ;" -"魲>lú|\\\ ;" -"魳>zá|\\\ ;" -"魶>nà|\\\ ;" -"魺>hé|\\\ ;" -"魼>qū|\\\ ;" -"魾>pí|\\\ ;" -"魿>bà|\\\ ;" -"鮁>bō|\\\ ;" -"鮂>bà|\\\ ;" -"鮄>fú|\\\ ;" -"鮅>bì|\\\ ;" -"鮆>jì|\\\ ;" -"鮈>jū|\\\ ;" -"鮊>bó|\\\ ;" -"鮋>pí|\\\ ;" -"鮍>pī|\\\ ;" -"鮒>fù|\\\ ;" -"鮔>jù|\\\ ;" -"鮕>gū|\\\ ;" -"鮙>tà|\\\ ;" -"鮞>ér|\\\ ;" -"鮟>àn|\\\ ;" -"鮧>tí|\\\ ;" -"鮨>qí|\\\ ;" -"鮬>bù|\\\ ;" -"鮯>gé|\\\ ;" -"鮷>tí|\\\ ;" -"鮺>zǎ|\\\ ;" -"鮽>yú|\\\ ;" -"鯂>sū|\\\ ;" -"鯃>wú|\\\ ;" -"鯆>fǔ|\\\ ;" -"鯉>lǐ|\\\ ;" -"鯓>ní|\\\ ;" -"鯔>zī|\\\ ;" -"鯕>qí|\\\ ;" -"鯚>jì|\\\ ;" -"鯝>gù|\\\ ;" -"鯢>ní|\\\ ;" -"鯣>yì|\\\ ;" -"鯥>lù|\\\ ;" -"鯬>lí|\\\ ;" -"鯻>là|\\\ ;" -"鯽>jì|\\\ ;" -"鰂>zé|\\\ ;" -"鰅>yú|\\\ ;" -"鰏>bì|\\\ ;" -"鰒>fù|\\\ ;" -"鰗>hú|\\\ ;" -"鰞>wū|\\\ ;" -"鰢>mǎ|\\\ ;" -"鰨>tà|\\\ ;" -"鰪>gé|\\\ ;" -"鰭>qí|\\\ ;" -"鰲>áo|\\\ ;" -"鰳>lè|\\\ ;" -"鰶>jì|\\\ ;" -"鰸>qū|\\\ ;" -"鰼>xí|\\\ ;" -"鰿>jī|\\\ ;" -"鱀>jì|\\\ ;" -"鱋>qū|\\\ ;" -"鱍>bō|\\\ ;" -"鱐>sù|\\\ ;" -"鱚>xǐ|\\\ ;" -"鱧>lǐ|\\\ ;" -"鱬>rú|\\\ ;" -"鱭>jì|\\\ ;" -"鱮>xù|\\\ ;" -"鱱>lǐ|\\\ ;" -"鱳>lì|\\\ ;" -"鱸>lú|\\\ ;" -"鱺>lí|\\\ ;" -"鱻>bà|\\\ ;" -"鱾>jǐ|\\\ ;" -"鲃>bā|\\\ ;" -"鲄>bà|\\\ ;" -"鲋>bà|\\\ ;" -"鲌>bó|\\\ ;" -"鲏>pī|\\\ ;" -"鲕>ér|\\\ ;" -"鲚>jì|\\\ ;" -"鲯>qí|\\\ ;" -"鲹>bī|\\\ ;" -"鲾>bì|\\\ ;" -"鳓>lè|\\\ ;" -"鳛>xí|\\\ ;" -"鳠>hù|\\\ ;" -"鳢>lǐ|\\\ ;" -"鳦>yǐ|\\\ ;" -"鳧>fú|\\\ ;" -"鳨>lì|\\\ ;" -"鳪>bǔ|\\\ ;" -"鳬>fú|\\\ ;" -"鳸>hù|\\\ ;" -"鳺>fū|\\\ ;" -"鳿>yù|\\\ ;" -"鴄>pī|\\\ ;" -"鴉>yā|\\\ ;" -"鴎>ōu|\\\ ;" -"鴏>tè|\\\ ;" -"鴑>nú|\\\ ;" -"鴔>fú|\\\ ;" -"鴗>lì|\\\ ;" -"鴚>gē|\\\ ;" -"鴜>zī|\\\ ;" -"鴝>qú|\\\ ;" -"鴡>jū|\\\ ;" -"鴣>gū|\\\ ;" -"鴥>yù|\\\ ;" -"鴨>yā|\\\ ;" -"鴮>wū|\\\ ;" -"鴯>ér|\\\ ;" -"鴱>ài|\\\ ;" -"鴶>jí|\\\ ;" -"鴺>yí|\\\ ;" -"鴽>rú|\\\ ;" -"鴿>gē|\\\ ;" -"鵋>jì|\\\ ;" -"鵌>yú|\\\ ;" -"鵍>bǔ|\\\ ;" -"鵏>bū|\\\ ;" -"鵒>yù|\\\ ;" -"鵓>bó|\\\ ;" -"鵕>bī|\\\ ;" -"鵖>bì|\\\ ;" -"鵗>tī|\\\ ;" -"鵙>jú|\\\ ;" -"鵚>tú|\\\ ;" -"鵜>tí|\\\ ;" -"鵠>gǔ|\\\ ;" -"鵡>wǔ|\\\ ;" -"鵩>fú|\\\ ;" -"鵪>ān|\\\ ;" -"鵱>lù|\\\ ;" -"鵴>jú|\\\ ;" -"鵵>tù|\\\ ;" -"鵶>yā|\\\ ;" -"鵸>qí|\\\ ;" -"鵹>lí|\\\ ;" -"鵺>yè|\\\ ;" -"鶀>qí|\\\ ;" -"鶂>yì|\\\ ;" -"鶃>yì|\\\ ;" -"鶅>zī|\\\ ;" -"鶈>qī|\\\ ;" -"鶋>jū|\\\ ;" -"鶌>qū|\\\ ;" -"鶏>jī|\\\ ;" -"鶕>ān|\\\ ;" -"鶗>tí|\\\ ;" -"鶘>hú|\\\ ;" -"鶙>tí|\\\ ;" -"鶝>fú|\\\ ;" -"鶟>tú|\\\ ;" -"鶡>hé|\\\ ;" -"鶦>hú|\\\ ;" -"鶩>wù|\\\ ;" -"鶪>jú|\\\ ;" -"鶮>gù|\\\ ;" -"鶴>hè|\\\ ;" -"鶺>jí|\\\ ;" -"鶻>hú|\\\ ;" -"鶾>cí|\\\ ;" -"鶿>zī|\\\ ;" -"鷀>cí|\\\ ;" -"鷁>nì|\\\ ;" -"鷄>jī|\\\ ;" -"鷅>lì|\\\ ;" -"鷈>tī|\\\ ;" -"鷉>tī|\\\ ;" -"鷊>nì|\\\ ;" -"鷋>tú|\\\ ;" -"鷌>mǎ|\\\ ;" -"鷑>lì|\\\ ;" -"鷔>áo|\\\ ;" -"鷖>yī|\\\ ;" -"鷗>ōu|\\\ ;" -"鷝>bì|\\\ ;" -"鷠>yú|\\\ ;" -"鷡>wú|\\\ ;" -"鷥>sī|\\\ ;" -"鷧>yì|\\\ ;" -"鷩>bì|\\\ ;" -"鷫>sù|\\\ ;" -"鷵>tú|\\\ ;" -"鷸>yù|\\\ ;" -"鷺>lù|\\\ ;" -"鷾>yì|\\\ ;" -"鷿>pì|\\\ ;" -"鸂>qī|\\\ ;" -"鸃>bì|\\\ ;" -"鸄>jí|\\\ ;" -"鸆>yú|\\\ ;" -"鸈>yè|\\\ ;" -"鸊>pì|\\\ ;" -"鸋>hù|\\\ ;" -"鸍>mí|\\\ ;" -"鸐>dí|\\\ ;" -"鸒>yú|\\\ ;" -"鸕>lú|\\\ ;" -"鸖>hè|\\\ ;" -"鸝>lí|\\\ ;" -"鸲>qú|\\\ ;" -"鹀>wú|\\\ ;" -"鹁>bó|\\\ ;" -"鹆>yù|\\\ ;" -"鹔>sù|\\\ ;" -"鹖>hé|\\\ ;" -"鹙>cí|\\\ ;" -"鹝>nì|\\\ ;" -"鹡>jí|\\\ ;" -"鹢>nì|\\\ ;" -"鹣>hù|\\\ ;" -"鹥>yī|\\\ ;" -"鹵>lǔ|\\\ ;" -"麁>cū|\\\ ;" -"麄>cū|\\\ ;" -"麊>mí|\\\ ;" -"麌>wú|\\\ ;" -"麑>ní|\\\ ;" -"麗>lì|\\\ ;" -"麘>hé|\\\ ;" -"麛>mí|\\\ ;" -"麜>lì|\\\ ;" -"麡>jī|\\\ ;" -"麤>cū|\\\ ;" -"麧>gē|\\\ ;" -"麩>fū|\\\ ;" -"麬>fū|\\\ ;" -"麮>qù|\\\ ;" -"麯>qú|\\\ ;" -"麱>fū|\\\ ;" -"麹>qú|\\\ ;" -"麼>mā|\\\ ;" -"黓>yì|\\\ ;" -"黖>xì|\\\ ;" -"黙>mò|\\\ ;" -"黟>yī|\\\ ;" -"黦>yù|\\\ ;" -"黬>àn|\\\ ;" -"黳>yī|\\\ ;" -"黷>dú|\\\ ;" -"黸>lú|\\\ ;" -"鼀>cù|\\\ ;" -"鼁>qù|\\\ ;" -"鼇>áo|\\\ ;" -"鼊>bì|\\\ ;" -"鼏>mì|\\\ ;" -"鼒>zī|\\\ ;" -"鼔>gǔ|\\\ ;" -"鼜>qì|\\\ ;" -"鼥>bá|\\\ ;" -"鼩>qú|\\\ ;" -"鼳>jú|\\\ ;" -"鼵>tú|\\\ ;" -"鼶>sī|\\\ ;" -"鼷>xī|\\\ ;" -"鼿>wū|\\\ ;" -"齀>wù|\\\ ;" -"齃>gé|\\\ ;" -"齄>jī|\\\ ;" -"齊>qí|\\\ ;" -"齌>jì|\\\ ;" -"齍>qí|\\\ ;" -"齎>jī|\\\ ;" -"齏>jī|\\\ ;" -"齕>hé|\\\ ;" -"齖>yá|\\\ ;" -"齜>zī|\\\ ;" -"齟>jǔ|\\\ ;" -"齬>yǔ|\\\ ;" -"齮>yǐ|\\\ ;" -"齯>ní|\\\ ;" -"齲>qǔ|\\\ ;" -"齵>óu|\\\ ;" -"齷>wò|\\\ ;" -"齸>yì|\\\ ;" -"齾>yà|\\\ ;" -"龁>hé|\\\ ;" -"龎>kè|\\\ ;" -"龘>tà|\\\ ;" -"龢>hé|\\\ ;" -"龥>yù|\\\ ;" -"𠀀>hā|\\\ ;" -"𠀁>qī|\\\ ;" -"𠁥>gǎ|\\\ ;" -"𠼻>jī|\\\ ;" -"𡜱>jì|\\\ ;" -"𥜌>ǎo|\\\ ;" -"阿>ā|\\\ ;" -"啊>ā|\\\ ;" -"恶>è|\\\ ;" -"额>é|\\\ ;" -"俄>é|\\\ ;" -"饿>è|\\\ ;" -"哦>ō|\\\ ;" -"鹅>é|\\\ ;" -"娥>é|\\\ ;" -"噢>ō|\\\ ;" -"峨>é|\\\ ;" -"鳄>è|\\\ ;" -"愕>è|\\\ ;" -"遏>è|\\\ ;" -"厄>è|\\\ ;" -"扼>è|\\\ ;" -"萼>è|\\\ ;" -"噩>è|\\\ ;" -"鄂>è|\\\ ;" -"蛾>é|\\\ ;" -"讹>é|\\\ ;" -"呃>è|\\\ ;" -"鹗>è|\\\ ;" -"婀>ē|\\\ ;" -"颚>è|\\\ ;" -"屙>ē|\\\ ;" -"轭>è|\\\ ;" -"谔>è|\\\ ;" -"垩>è|\\\ ;" -"腭>è|\\\ ;" -"阏>è|\\\ ;" -"莪>é|\\\ ;" -"蚵>é|\\\ ;" -"㐻>ň|\\\ ;" -"㓵>è|\\\ ;" -"㔩>è|\\\ ;" -"㕎>è|\\\ ;" -"㖾>è|\\\ ;" -"㗁>è|\\\ ;" -"㟧>è|\\\ ;" -"㠋>è|\\\ ;" -"㡋>è|\\\ ;" -"㦍>è|\\\ ;" -"㧖>è|\\\ ;" -"㩵>è|\\\ ;" -"㮙>è|\\\ ;" -"㱦>è|\\\ ;" -"㷈>è|\\\ ;" -"㼂>é|\\\ ;" -"㼢>ě|\\\ ;" -"㼰>é|\\\ ;" -"䄉>é|\\\ ;" -"䆓>è|\\\ ;" -"䑥>è|\\\ ;" -"䑪>è|\\\ ;" -"䓊>è|\\\ ;" -"䔾>è|\\\ ;" -"䕏>é|\\\ ;" -"䖸>é|\\\ ;" -"䙳>è|\\\ ;" -"䛖>è|\\\ ;" -"䝈>è|\\\ ;" -"䞩>è|\\\ ;" -"䣞>è|\\\ ;" -"䩹>é|\\\ ;" -"䫷>è|\\\ ;" -"䱮>é|\\\ ;" -"䳗>é|\\\ ;" -"䳘>é|\\\ ;" -"䳬>è|\\\ ;" -"偔>è|\\\ ;" -"僫>è|\\\ ;" -"卾>è|\\\ ;" -"吖>ā|\\\ ;" -"吪>é|\\\ ;" -"呝>è|\\\ ;" -"呣>ḿ|\\\ ;" -"咢>è|\\\ ;" -"咹>è|\\\ ;" -"噁>ě|\\\ ;" -"囮>é|\\\ ;" -"圔>è|\\\ ;" -"堊>è|\\\ ;" -"堨>è|\\\ ;" -"堮>è|\\\ ;" -"妸>ē|\\\ ;" -"妿>ē|\\\ ;" -"娿>ē|\\\ ;" -"婐>ē|\\\ ;" -"岋>è|\\\ ;" -"峉>ē|\\\ ;" -"峩>é|\\\ ;" -"崿>è|\\\ ;" -"嶭>è|\\\ ;" -"悪>è|\\\ ;" -"惡>è|\\\ ;" -"戹>è|\\\ ;" -"搤>è|\\\ ;" -"搹>è|\\\ ;" -"枙>è|\\\ ;" -"櫮>è|\\\ ;" -"涐>é|\\\ ;" -"湂>è|\\\ ;" -"猔>ē|\\\ ;" -"獿>ě|\\\ ;" -"珴>é|\\\ ;" -"琧>è|\\\ ;" -"痾>ē|\\\ ;" -"皒>é|\\\ ;" -"睋>é|\\\ ;" -"砐>è|\\\ ;" -"硆>è|\\\ ;" -"硪>é|\\\ ;" -"磀>é|\\\ ;" -"苊>è|\\\ ;" -"蕚>è|\\\ ;" -"蚅>è|\\\ ;" -"蝁>è|\\\ ;" -"覨>è|\\\ ;" -"訛>é|\\\ ;" -"詻>è|\\\ ;" -"誐>é|\\\ ;" -"諤>è|\\\ ;" -"譌>é|\\\ ;" -"讍>è|\\\ ;" -"豟>è|\\\ ;" -"貖>è|\\\ ;" -"軛>è|\\\ ;" -"軶>è|\\\ ;" -"迗>é|\\\ ;" -"遌>è|\\\ ;" -"鈋>é|\\\ ;" -"鋧>é|\\\ ;" -"鋨>é|\\\ ;" -"錒>ā|\\\ ;" -"鍔>è|\\\ ;" -"鑩>è|\\\ ;" -"钶>ē|\\\ ;" -"锕>ā|\\\ ;" -"閼>è|\\\ ;" -"阨>è|\\\ ;" -"阸>è|\\\ ;" -"阾>ǎ|\\\ ;" -"頞>è|\\\ ;" -"頟>é|\\\ ;" -"額>é|\\\ ;" -"顎>è|\\\ ;" -"餓>è|\\\ ;" -"餩>è|\\\ ;" -"騀>é|\\\ ;" -"魥>è|\\\ ;" -"鰐>è|\\\ ;" -"鱷>è|\\\ ;" -"鵝>é|\\\ ;" -"鵞>é|\\\ ;" -"鶚>è|\\\ ;" -"齂>è|\\\ ;" -"齶>è|\\\ ;" -"。 <> '.';" -// End RAW data for converting CJK characters - -// fallbacks - -//# | yi < i; -//# | wu < u; -//# | bi < b; -//# | ci < c; -//# | di < d; -//# | fu < f; -//# | gu < g; -//# | he < h; -//# | ji < j; -//# | ku < k; -//# | li < l; -//# | mi < m; -//# | pi < p; -//# | qi < q; -//# | l < r; -//# | si < s; -//# | ti < t; -//# | f < v; -//# | wa < w; -//# | xi < x; -//# | yi < y; -//# | zi < z; - -// filter out the half-width hangul -":: [^\uFFBE-\uFFEE] fullwidth-halfwidth ();" -//# :: (lower) ; - } -} diff --git a/icuSources/data/translit/t_Hebr_Latn.txt b/icuSources/data/translit/t_Hebr_Latn.txt deleted file mode 100644 index 580a574d..00000000 --- a/icuSources/data/translit/t_Hebr_Latn.txt +++ /dev/null @@ -1,112 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_Hebrew_Latin.txt -// Date: Sat Jul 27 10:31:07 2002 -//-------------------------------------------------------------------- - -// Hebrew_Latin - -t_Hebr_Latn { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// Transliteration table for Hebrew -// Based on the UNGEGN table at: -// http://www.eki.ee/wgrs/rom1_he.pdf -// -// Exceptions: -// - Accents are added to disambiguate letters -// - Combinations of dagesh, shin/sin dot that produce different -// letters are not yet encoded. -// -// To test, open: -// http://oss.software.ibm.com/cgi-bin/icu/tr -// Click Edit, paste in this file, Save As hebrew-latin/XXX -// (where XXX is a username) -// Now go back to the main window, and try it out. -// Use hebrew-latin/XXX for Output 1, and (Inverse) for Output 2 -// Paste in hebrew text in Input, and hit Transliterate. -// -// For more information, see" -// http://oss.software.ibm.com/icu/userguide/Transliteration.html - -":: [[:Hebrew:] [\u05B0-\u05B9\u05BB-\u05BC\u05C1-\u05C2\u2135-\u2138̄\u05BF]] ;" -":: nfkd (nfc) ;" -"$letterAfter = [:M:]* [:L:] ;" - -// move longer items here to avoid masking - -"ח <> ẖ ;" -"צ <> ẕ } $letterAfter;" -"ץ <> ẕ ;" -"ש <> ş ;" -"ת <> ţ ;" - -"א <> ʼ ;" -"ב <> b ;" -"ג <> g ;" -"ד <> d ;" -"ה <> h ;" -"ו <> w ;" -"ז <> z ;" -"ט <> t ;" -"י <> y ;" -"כ <> k } $letterAfter;" -"ך <> k ;" -"ל <> l ;" -"מ <> m } $letterAfter;" -"ם <> m ;" -"נ <> n } $letterAfter;" -"ן <> n ;" -"ס <> s ;" -"ע <> ʻ ;" -"פ <> p } $letterAfter;" -"ף <> p ;" -"ק <> q ;" -"ר <> r ;" - - "װ > | וו;" // HEBREW LIGATURE YIDDISH DOUBLE VAV - "ױ > | וי;" // HEBREW LIGATURE YIDDISH VAV YOD - "ײ > | יי ;" // HEBREW LIGATURE YIDDISH DOUBLE YOD - - -"ּ <> ̇ ;" // dagesh just goes to overdot for now -"ׁ <> ̌ ;" // shin dot -> sh -"ׂ <> ̂ ;" // sin dot -> s - -// points -"ֲ <> à ;" -"ָ <> á ;" -"ֱ <> è ;" -"ֵ <> é ;" -"ְ <> ê ;" -"ִ <> i ;" -"ֹ <> ò ;" -"ֻ <> u ;" - -"ַ <> a ;" -"ֶ <> e ;" -"ֳ <> o ;" - -"\u05BF <> ̄ ;" - -// fallbacks -"ק < c ;" -"פ < f } $letterAfter;" -"ף < f ;" -"ז < j ;" -"ו < v ;" -"כס < x ;" - -":: (lower);" -":: nfc (nfd) ;" -":: ([[:Latin:] [\u02BB-\u02BC\u0300-\u0302\u0307\u030C\u0327\u0331\u0340-\u0341 ̄ ]]);" - } -} diff --git a/icuSources/data/translit/t_Hira_Kana.txt b/icuSources/data/translit/t_Hira_Kana.txt deleted file mode 100644 index 7d39db14..00000000 --- a/icuSources/data/translit/t_Hira_Kana.txt +++ /dev/null @@ -1,223 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_Hiragana_Katakana.txt -// Date: Sat Jul 27 10:31:07 2002 -//-------------------------------------------------------------------- - -// Hiragana_Katakana - -t_Hira_Kana { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// note: a global filter is more efficient, but MUST include all source chars -":: [\\u0000-\u007E \u3001\u3002 \u3099-\u309C \u30A1-\u30FC \uFF61-\uFF9Fー[:Hiragana:] [:Katakana:] [:nonspacing mark:]] ;" -":: NFKC ();" - -// Hiragana-Katakana - -// This is largely a one-to-one mapping, but it has a -// few kinks: - -// 1. The Katakana va/vi/ve/vo (30F7-30FA) have no -// Hiragana equivalents. We use Hiragana wa/wi/we/wo -// (308F-3092) with a voicing mark (3099), which is -// semantically equivalent. However, this is a non- -// roundtripping transformation. - -// 2. The Katakana small ka/ke (30F5,30F6) have no -// Hiragana equiavlents. We convert them to normal -// Hiragana ka/ke (304B,3051). This is a one-way -// information-losing transformation and precludes -// round-tripping of 30F5 and 30F6. - -// 3. The combining marks 3099-309C are in the Hiragana -// block, but they apply to Katakana as well, so we -// leave them untouched. - -// 4. The Katakana prolonged sound mark 30FC doubles the -// preceding vowel. This is a one-way information- -// losing transformation from Katakana to Hiragana. - -// 5. The Katakana middle dot separates words in foreign -// expressions; we leave this unmodified. - -// The above points preclude successful round-trip -// transformations of arbitrary input text. However, -// they provide naturalistic results that should conform -// to user expectations. - - -// Combining equivalents va/vi/ve/vo -"わ゙ <> ヷ;" -"ゐ゙ <> ヸ;" -"ゑ゙ <> ヹ;" -"を゙ <> ヺ;" - -// One-to-one mappings, main block -// 3041:3094 <> 30A1:30F4 -// 309D,E <> 30FD,E -"ぁ <> ァ;" -"あ <> ア;" -"ぃ <> ィ;" -"い <> イ;" -"ぅ <> ゥ;" -"う <> ウ;" -"ぇ <> ェ;" -"え <> エ;" -"ぉ <> ォ;" -"お <> オ;" -"か <> カ;" -"が <> ガ;" -"き <> キ;" -"ぎ <> ギ;" -"く <> ク;" -"ぐ <> グ;" -"け <> ケ;" -"げ <> ゲ;" -"こ <> コ;" -"ご <> ゴ;" -"さ <> サ;" -"ざ <> ザ;" -"し <> シ;" -"じ <> ジ;" -"す <> ス;" -"ず <> ズ;" -"せ <> セ;" -"ぜ <> ゼ;" -"そ <> ソ;" -"ぞ <> ゾ;" -"た <> タ;" -"だ <> ダ;" -"ち <> チ;" -"ぢ <> ヂ;" -"っ <> ッ;" -"つ <> ツ;" -"づ <> ヅ;" -"て <> テ;" -"で <> デ;" -"と <> ト;" -"ど <> ド;" -"な <> ナ;" -"に <> ニ;" -"ぬ <> ヌ;" -"ね <> ネ;" -"の <> ノ;" -"は <> ハ;" -"ば <> バ;" -"ぱ <> パ;" -"ひ <> ヒ;" -"び <> ビ;" -"ぴ <> ピ;" -"ふ <> フ;" -"ぶ <> ブ;" -"ぷ <> プ;" -"へ <> ヘ;" -"べ <> ベ;" -"ぺ <> ペ;" -"ほ <> ホ;" -"ぼ <> ボ;" -"ぽ <> ポ;" -"ま <> マ;" -"み <> ミ;" -"む <> ム;" -"め <> メ;" -"も <> モ;" -"ゃ <> ャ;" -"や <> ヤ;" -"ゅ <> ュ;" -"ゆ <> ユ;" -"ょ <> ョ;" -"よ <> ヨ;" -"ら <> ラ;" -"り <> リ;" -"る <> ル;" -"れ <> レ;" -"ろ <> ロ;" -"ゎ <> ヮ;" -"わ <> ワ;" -"ゐ <> ヰ;" -"ゑ <> ヱ;" -"を <> ヲ;" -"ん <> ン;" -"ゔ <> ヴ;" -"ゝ <> ヽ;" -"ゞ <> ヾ;" - -// One-way Katakana-Hiragana xform of small K ka/ke to -// normal H ka/ke. -"か < ヵ;" -"け < ヶ;" - -// Katakana followed by a prolonged sound mark 30FC has -// its final vowel doubled. This is a Katakana-Hiragana -// one-way information-losing transformation. We -// include the small Katakana (e.g., small A 3041) and -// do not distinguish them from their large -// counterparts. It doesn't make sense to double a -// small counterpart vowel as a small Hiragana vowel, so -// we don't do so. In natural text this should never -// occur anyway. If a 30FC is seen without a preceding -// vowel sound (e.g., after n 30F3) we do not change it. - -//## $long = ー; - -// The following categories are Hiragana, not Katakana -// as might be expected, since by the time we get to the -// 30FC, the preceding character will have already been -// transformed to Hiragana. - -// {The following mechanically generated from the -// Unicode 3.0 data:} - -"$xa = [" -"ぁ あ か が さ ざ" -"た だ な は ば ぱ" -"ま ゃ や ら ゎ わ" -"];" - -"$xi = [" -"ぃ い き ぎ し じ" -"ち ぢ に ひ び ぴ" -"み り ゐ" -"];" - -"$xu = [" -"ぅ う く ぐ す ず" -"っ つ づ ぬ ふ ぶ" -"ぷ む ゅ ゆ る ゔ" -"];" - -"$xe = [" -"ぇ え け げ せ ぜ" -"て で ね へ べ ぺ" -"め れ ゑ" -"];" - -"$xo = [" -"ぉ お こ ご そ ぞ" -"と ど の ほ ぼ ぽ" -"も ょ よ ろ を" -"];" - -"あ < $xa {ー};" -"い < $xi {ー};" -"う < $xu {ー};" -"え < $xe {ー};" -"お < $xo {ー};" - -":: (NFKC) ;" - -// note: a global filter is more efficient, but MUST include all source chars!! -":: ([\\u0000-\u007E \u3001\u3002 \u3099-\u309C \u30A1-\u30FC \uFF61-\uFF9Fー[:Hiragana:] [:Katakana:] [:nonspacing mark:]]);" - -// eof - } -} diff --git a/icuSources/data/translit/t_Hira_Latn.txt b/icuSources/data/translit/t_Hira_Latn.txt deleted file mode 100644 index 77ad80cd..00000000 --- a/icuSources/data/translit/t_Hira_Latn.txt +++ /dev/null @@ -1,30 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_Hiragana_Latin.txt -// Date: Sat Jul 27 10:31:07 2002 -//-------------------------------------------------------------------- - -// Hiragana_Latin - -t_Hira_Latn { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -":: [\u3041-\u3094\u3099\u309D-\u309E\u30AC\u30AE\u30B0\u30B2\u30B4\u30B6\u30B8\u30BA\u30BC\u30BE\u30C0\u30C2\u30C5\u30C7\u30C9\u30D0\u30D3\u30D6\u30D9\u30DC\u30F4\u30F7-\u30FA\u30FE] ;" -":: NFD ;" - -":: Hiragana-Katakana;" -":: Katakana-Latin;" - -":: NFC ;" -":: (Lower) ;" -":: ([',.A-Za-z~\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E3\u01E6-\u01ED\u01F0\u01F4-\u01F5\u01F8-\u021B\u021E-\u021F\u0226-\u0233\u0304\u04E2-\u04E3\u04EE-\u04EF\u1E00-\u1E99\u1EA0-\u1EF9\u1FB1\u1FB9\u1FD1\u1FD9\u1FE1\u1FE9\u212A-\u212B]) ;" - } -} diff --git a/icuSources/data/translit/t_InterIndic_Beng.txt b/icuSources/data/translit/t_InterIndic_Beng.txt deleted file mode 100644 index 4f1cf522..00000000 --- a/icuSources/data/translit/t_InterIndic_Beng.txt +++ /dev/null @@ -1,146 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_InterIndic_Bengali.txt -// Date: Sat Jul 27 10:31:07 2002 -//-------------------------------------------------------------------- - -// InterIndic_Bengali - -t_InterIndic_Beng { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// InterIndic-Bengali -//:: NFD (NFC) ; -"\uE001>\u0981;" // SIGN CANDRABINDU -"\uE002>\u0982;" // SIGN ANUSVARA -"\uE003>\u0983;" // SIGN VISARGA -"\uE005>\u0985;" // LETTER A -"\uE006>\u0986;" // LETTER AA -"\uE007>\u0987;" // LETTER I -"\uE008>\u0988;" // LETTER II -"\uE009>\u0989;" // LETTER U -"\uE00A>\u098A;" // LETTER UU -"\uE00B>\u098B;" // LETTER VOCALIC R -"\uE00C>\u098C;" // LETTER VOCALIC L -"\uE00D>\u098F;" // FALLBACK -"\uE00E>\u098F;" // FALLBACK -"\uE00F>\u098F;" // LETTER E -"\uE010>\u0990;" // LETTER AI -"\uE011>\u0993;" // FALLBACK -"\uE012>\u0993;" // FALLBACK -"\uE013>\u0993;" // LETTER O -"\uE014>\u0994;" // LETTER AU -"\uE015>\u0995;" // LETTER KA -"\uE016>\u0996;" // LETTER KHA -"\uE017>\u0997;" // LETTER GA -"\uE018>\u0998;" // LETTER GHA -"\uE019>\u0999;" // LETTER NGA -"\uE01A>\u099A;" // LETTER CA -"\uE01B>\u099B;" // LETTER CHA -"\uE01C>\u099C;" // LETTER JA -"\uE01D>\u099D;" // LETTER JHA -"\uE01E>\u099E;" // LETTER NYA -"\uE01F>\u099F;" // LETTER TTA -"\uE020>\u09A0;" // LETTER TTHA -"\uE021>\u09A1;" // LETTER DDA -"\uE022>\u09A2;" // LETTER DDHA -"\uE023>\u09A3;" // LETTER NNA -"\uE024>\u09A4;" // LETTER TA -"\uE025>\u09A5;" // LETTER THA -"\uE026>\u09A6;" // LETTER DA -"\uE027>\u09A7;" // LETTER DHA -"\uE028>\u09A8;" // LETTER NA -"\uE029>\u09A8\u09BC;" // REMAP (indicExceptions.txt): \u09a9>\u09a8 = LETTER NNNA>LETTER NA -"\uE02A>\u09AA;" // LETTER PA -"\uE02B>\u09AB;" // LETTER PHA -"\uE02C>\u09AC;" // LETTER BA -"\uE02D>\u09AD;" // LETTER BHA -"\uE02E>\u09AE;" // LETTER MA -"\uE02F>\u09AF;" // LETTER YA -"\uE030>\u09B0;" // LETTER RA -"\uE031>\u09B0\u09BC;" // FALLBACK to RA -"\uE032>\u09B2;" // LETTER LA -"\uE033>\u09B2;" // REMAP (indicExceptions.txt): \u09b3>\u09b2 = LETTER LLA>LETTER LA -"\uE034>\u09B2;" // REMAP (indicExceptions.txt): \u09b4>\u09b2 = LETTER LLLA>LETTER LA -"\uE035>\u09AC;" // REMAP (indicExceptions.txt): \u09b5>\u09ac = LETTER VA>LETTER BA -"\uE036>\u09B6;" // LETTER SHA -"\uE037>\u09B7;" // LETTER SSA -"\uE038>\u09B8;" // LETTER SA -"\uE039>\u09B9;" // LETTER HA -"\uE03C>\u09BC;" // SIGN NUKTA -"\uE03D>;" // FALLBACK BLOW AWAY AVAGRAHA -"\uE03E>\u09BE;" // VOWEL SIGN AA -"\uE03F>\u09BF;" // VOWEL SIGN I -"\uE040>\u09C0;" // VOWEL SIGN II -"\uE041>\u09C1;" // VOWEL SIGN U -"\uE042>\u09C2;" // VOWEL SIGN UU -"\uE043>\u09C3;" // VOWEL SIGN VOCALIC R -"\uE044>\u09C4;" // VOWEL SIGN VOCALIC RR -"\uE045>\u09C7;" // REMAP (indicExceptions.txt): \u09c5>\u09c7 = VOWEL SIGN CANDRA E>VOWEL SIGN E -"\uE046>\u09C7;" // FALLBACK -"\uE047>\u09C7;" // VOWEL SIGN E -"\uE048>\u09C8;" // VOWEL SIGN AI -"\uE049>\u09C7\u09BE;" // REMAP (indicExceptions.txt): \u09c9>\u09cb = VOWEL SIGN CANDRA O>VOWEL SIGN O -"\uE04A>\u09C7\u09BE;" // FALLBACK -"\uE04B>\u09C7\u09BE;" // VOWEL SIGN O -"\uE04C>\u09C7\u09D7;" // VOWEL SIGN AU -"\uE04D>\u09CD;" // SIGN VIRAMA -"\uE050>\u0993\u0982;" // InterIndic-Bengali: OM -"\ue051>;" -"\ue052>;" -"\ue053>;" -"\ue054>;" -"\uE055>;" // UNMAPPED InterIndic-Bengali: LENGTH MARK -"\uE056>\u09C8;" // REMAP (indicExceptions.txt): \u09d6>\u09c8 = AI LENGTH MARK>VOWEL SIGN AI -"\uE057>\u09D7;" // AU LENGTH MARK -"\uE058>\u0995\u09BC;" // FALLBACK -"\uE059>\u0996\u09BC;" // REMAP (indicExceptions.txt): \u09d9>\u0996 = LETTER KHHA>LETTER KHA -"\uE05A>\u0997\u09BC;" // REMAP (indicExceptions.txt): \u09da>\u0997 = LETTER GHHA>LETTER GA -"\uE05B>\u099C\u09BC;" // REMAP (indicExceptions.txt): \u09db>\u099c = LETTER ZA>LETTER JA -"\uE05C>\u09A1\u09BC;" // FALLBACK -"\uE05D>\u09A2\u09BC;" // LETTER RHA -"\uE05E>\u09AB\u09BC;" // REMAP (indicExceptions.txt): \u09de>\u09ab = LETTER FA>LETTER PHA -"\uE05F>\u09AF\u09BC;" // LETTER YYA -"\uE060>\u09E0;" // LETTER VOCALIC RR -"\uE061>\u09E1;" // LETTER VOCALIC LL -"\uE062>\u09E2;" // VOWEL SIGN VOCALIC L -"\uE063>\u09E3;" // VOWEL SIGN VOCALIC LL -"\uE064>\u0964;" // DANDA -"\uE065>\u0965;" // DOUBLE DANDA -"\uE066>\u09E6;" // DIGIT ZERO -"\uE067>\u09E7;" // DIGIT ONE -"\uE068>\u09E8;" // DIGIT TWO -"\uE069>\u09E9;" // DIGIT THREE -"\uE06A>\u09EA;" // DIGIT FOUR -"\uE06B>\u09EB;" // DIGIT FIVE -"\uE06C>\u09EC;" // DIGIT SIX -"\uE06D>\u09ED;" // DIGIT SEVEN -"\uE06E>\u09EE;" // DIGIT EIGHT -"\uE06F>\u09EF;" // DIGIT NINE -"\uE070>\u09F0;" // UNMAPPED Bengali-InterIndic: LETTER RA WITH MIDDLE DIAGONAL -"\uE071>;" -"0 > \u09E6;" // FALLBACK FOR TAMIL -"1 > \u09E7;" -"\ue072>;" -"\ue073>;" -"\ue074>;" - -"\ue075>\u09F5;" -"\ue076>\u09F6;" -"\ue077>\u09F7;" -"\ue078>\u09F8;" -"\ue079>\u09F9;" -"\ue07A>\u09FA;" // ISSHAR - -// :: NFC (NFD) ; -// eof - } -} diff --git a/icuSources/data/translit/t_InterIndic_Deva.txt b/icuSources/data/translit/t_InterIndic_Deva.txt deleted file mode 100644 index 5aede4ad..00000000 --- a/icuSources/data/translit/t_InterIndic_Deva.txt +++ /dev/null @@ -1,173 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_InterIndic_Devanagari.txt -// Date: Sat Jul 27 10:31:07 2002 -//-------------------------------------------------------------------- - -// InterIndic_Devanagari - -t_InterIndic_Deva { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// InterIndic-Devanagari -//:: NFD (NFC) ; -//Rules for Decomposed characters - "\ue028\ue03c > \u0929;" //\ue029 - "\ue030\ue03c > \u0931;" //\ue031 - "\ue033\ue03c > \u0934;" //\ue034 - "\ue015\ue03c > \u0958;" //\ue058 LETTER QA (For Urdu) - "\ue016\ue03c > \u0959;" //\ue059 LETTER KHHA (For Urdu) - "\ue017\ue03c > \u095a;" //\ue05a LETTER GHHA (For Urdu) - "\ue01c\ue03c > \u095b;" //\ue05b LETTER ZA (For Urdu) - "\ue021\ue03c > \u095c;" //\ue05c LETTER DDDHA (pronounced RRA) - "\ue022\ue03c > \u095d;" //\ue05d LETTER RHA (pronounced RRHA) - "\ue02b\ue03c > \u095e;" //\ue05e LETTER FA - "\ue02f\ue03c > \u095f;" //\ue05f LETTER YYA - - //Decomposed compatibility transliterations - "\ue012\ue057>\u0914;" // FALLBACK FOR TAMIL AU - "0 > \u0966;" // FALLBACK FOR TAMIL - "1 > \u0967;" - - "\ue055>;" // FALLBACK BLOW AWAY KANNADA AND TELUGU LENGTH MARK - "\ue056>;" // FALLBACK BLOW AWAY KANNADA AND TELUGU AI LENGTH MARK - "\ue057>;" // FALLBACK BLOW AWAY TAMIL AU LENGTH MARK - "\ue070>;" // FALLBACK BLOW AWAY GURMUKHI - "\ue071>;" // FALLBACK BLOW AWAY GURMUKHI - "\ue072>;" // FALLBACK BLOW AWAY GURMUKHI - "\ue073>;" // FALLBACK BLOW AWAY GURMUKHI - "\ue074>;" // FALLBACK BLOW AWAY GURMUKHI - - - "\ue001 > \u0901;" // SIGN CANDRABINDU - "\ue002 > \u0902;" // SIGN ANUSVARA - "\ue003 > \u0903;" // SIGN VISARGA - "\ue005 > \u0905;" // LETTER A - "\ue006 > \u0906;" // LETTER AA - "\ue007 > \u0907;" // LETTER I - "\ue008 > \u0908;" // LETTER II - "\ue009 > \u0909;" // LETTER U - "\ue00a > \u090a;" // LETTER UU - "\ue00b > \u090b;" // LETTER VOCALIC R - "\ue00c > \u090c;" // LETTER VOCALIC L - "\ue00d > \u090d;" // LETTER CANDRA E (For representing English sounds) - "\ue00e > \u090e;" // UNMAPPED LETTER SHORT E(For Southern Scripts) - //\ue00e > \u090f; - "\ue00f > \u090f;" // LETTER E - "\ue010 > \u0910;" // LETTER AI - "\ue011 > \u0911;" // LETTER CANDRA O (For representing English sounds) - "\ue012 > \u0912;" // UNMAPPED LETTER SHORT O (For Southern Scripts) - //\ue012 > \u0913; - "\ue013 > \u0913;" // LETTER O - "\ue014 > \u0914;" // LETTER AU - "\ue015 > \u0915;" // LETTER KA - "\ue016 > \u0916;" // LETTER KHA - "\ue017 > \u0917;" // LETTER GA - "\ue018 > \u0918;" // LETTER GHA - "\ue019 > \u0919;" // LETTER NGA - "\ue01a > \u091a;" // LETTER CA - "\ue01b > \u091b;" // LETTER CHA - "\ue01c > \u091c;" // LETTER JA - "\ue01d > \u091d;" // LETTER JHA - "\ue01e > \u091e;" // LETTER NYA - "\ue01f > \u091f;" // LETTER TTA - "\ue020 > \u0920;" // LETTER TTHA - "\ue021 > \u0921;" // LETTER DDA - "\ue022 > \u0922;" // LETTER DDHA - "\ue023 > \u0923;" // LETTER NNA - "\ue024 > \u0924;" // LETTER TA - "\ue025 > \u0925;" // LETTER THA - "\ue026 > \u0926;" // LETTER DA - "\ue027 > \u0927;" // LETTER DHA - "\ue028 > \u0928;" // LETTER NA - "\ue029 > \u0929;" // LETTER NNNA - "\ue02a > \u092a;" // LETTER PA - "\ue02b > \u092b;" // LETTER PHA - "\ue02c > \u092c;" // LETTER BA - "\ue02d > \u092d;" // LETTER BHA - "\ue02e > \u092e;" // LETTER MA - "\ue02f > \u092f;" // LETTER YA - "\ue030 > \u0930;" // LETTER RA - "\ue031 > \u0931;" // LETTER RRA (Eyelash RA for Southern scripts) - //\ue031 > \u0930; - "\ue032 > \u0932;" // LETTER LA - "\ue033 > \u0933;" // LETTER LLA - "\ue034 > \u0934;" // LETTER LLLA (LLLA for Southern scripts) - //\ue034 > \u0933; - "\ue035 > \u0935;" // LETTER VA - "\ue036 > \u0936;" // LETTER SHA - "\ue037 > \u0937;" // LETTER SSA - "\ue038 > \u0938;" // LETTER SA - "\ue039 > \u0939;" // LETTER HA - "\ue03c > \u093c;" // SIGN NUKTA - "\ue03d > \u093d;" // SIGN AVAGRAHA - "\ue03e > \u093e;" // VOWEL SIGN AA - "\ue03f > \u093f;" // VOWEL SIGN I - "\ue040 > \u0940;" // VOWEL SIGN II - "\ue041 > \u0941;" // VOWEL SIGN U - "\ue042 > \u0942;" // VOWEL SIGN UU - "\ue043 > \u0943;" // VOWEL SIGN VOCALIC R - "\ue044 > \u0944;" // VOWEL SIGN VOCALIC RR - "\ue045 > \u0945;" // VOWEL SIGN CANDRA E - "\ue046 > \u0946;" // UNMAPPED VOWEL SIGN SHORT E - //\ue046 > \u0947; - "\ue047 > \u0947;" // VOWEL SIGN E - "\ue048 > \u0948;" // VOWEL SIGN AI - "\ue049 > \u0949;" // VOWEL SIGN CANDRA O - "\ue04a > \u094a;" // UNMAPPED VOWEL SIGN SHORT O - //\ue04a > \u094b; - "\ue04b > \u094b;" // VOWEL SIGN O - "\ue04c > \u094c;" // VOWEL SIGN AU - "\ue04d > \u094d;" // SIGN VIRAMA - "\ue050 > \u0950;" // OM - "\ue051 > \u0951;" // UNMAPPED STRESS SIGN UDATTA - "\ue052 > \u0952;" // UNMAPPED STRESS SIGN ANUDATTA - "\ue053 > \u0953;" // UNMAPPED GRAVE ACCENT - "\ue054 > \u0954;" // UNMAPPED ACUTE ACCENT - "\ue058 > \u0958;" // LETTER QA (For Urdu) - "\ue059 > \u0959;" // LETTER KHHA (For Urdu) - "\ue05a > \u095a;" // LETTER GHHA (For Urdu) - "\ue05b > \u095b;" // LETTER ZA (For Urdu) - "\ue05c > \u095c;" // LETTER DDDHA (pronounced RRA) - "\ue05d > \u095d;" // LETTER RHA (pronounced RRHA) - "\ue05e > \u095e;" // LETTER FA - "\ue05f > \u095f;" // LETTER YYA - "\ue060 > \u0960;" // LETTER VOCALIC RR - "\ue061 > \u0961;" // LETTER VOCALIC LL - "\ue062 > \u0962;" // VOWEL SIGN VOCALIC L - "\ue063 > \u0963;" // VOWEL SIGN VOCALIC LL - "\ue064 > \u0964;" // UNMAPPED Devanagari-InterIndic: DANDA - "\ue065 > \u0965;" // UNMAPPED Devanagari-InterIndic: DOUBLE DANDA - "\ue066 > \u0966;" // DIGIT ZERO - "\ue067 > \u0967;" // DIGIT ONE - "\ue068 > \u0968;" // DIGIT TWO - "\ue069 > \u0969;" // DIGIT THREE - "\ue06a > \u096a;" // DIGIT FOUR - "\ue06b > \u096b;" // DIGIT FIVE - "\ue06c > \u096c;" // DIGIT SIX - "\ue06d > \u096d;" // DIGIT SEVEN - "\ue06e > \u096e;" // DIGIT EIGHT - "\ue06f > \u096f;" // DIGIT NINE - "\ue0f0 > \u0930;" // FALLBACK RA - "\ue0f1 > \u0930;" // FALLBACK RA - -"\ue075>;" -"\ue076>;" -"\ue077>;" -"\ue078>;" -"\ue079>;" -"\ue07A>;" - -// \u0970 # UNMAPPED Devanagari-InterIndic: ABBREVIATION SIGN -// :: NFC; -// eof - } -} diff --git a/icuSources/data/translit/t_InterIndic_Gujr.txt b/icuSources/data/translit/t_InterIndic_Gujr.txt deleted file mode 100644 index 8875ef2e..00000000 --- a/icuSources/data/translit/t_InterIndic_Gujr.txt +++ /dev/null @@ -1,147 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_InterIndic_Gujarati.txt -// Date: Sat Jul 27 10:31:07 2002 -//-------------------------------------------------------------------- - -// InterIndic_Gujarati - -t_InterIndic_Gujr { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// InterIndic-Gujarati -//:: NFD (NFC) ; -"\ue001>\u0a81;" // SIGN CANDRABINDU -"\ue002>\u0a82;" // SIGN ANUSVARA -"\ue003>\u0a83;" // SIGN VISARGA -"\ue005>\u0a85;" // LETTER A -"\ue006>\u0a86;" // LETTER AA -"\ue007>\u0a87;" // LETTER I -"\ue008>\u0a88;" // LETTER II -"\ue009>\u0a89;" // LETTER U -"\ue00a>\u0a8a;" // LETTER UU -"\ue00b>\u0a8b;" // LETTER VOCALIC R -"\ue00c>\u0ab2\u0ac3;" // REMAP (indicExceptions.txt): \u0a8c>\u0ab2\u0ac3 = LETTER VOCALIC L>LETTER LA.VOWEL SIGN VOCALIC R -"\ue00d>\u0a8d;" // GUJARATI VOWEL CANDRA E -"\ue00e>\u0a8f;" // FALLBACK -"\ue00f>\u0a8f;" // InterIndic-Gujarati: LETTER EE (\u0a8f = LETTER E) -"\ue010>\u0a90;" // LETTER AI -"\ue011>\u0a91;" // FALLBACK -"\ue012>\u0a93;" // FALLBACK -"\ue013>\u0a93;" // UNMAPPED InterIndic-Gujarati: LETTER OO (\u0a93 = LETTER O) -"\ue014>\u0a94;" // LETTER AU -"\ue015>\u0a95;" // LETTER KA -"\ue016>\u0a96;" // LETTER KHA -"\ue017>\u0a97;" // LETTER GA -"\ue018>\u0a98;" // LETTER GHA -"\ue019>\u0a99;" // LETTER NGA -"\ue01a>\u0a9a;" // LETTER CA -"\ue01b>\u0a9b;" // LETTER CHA -"\ue01c>\u0a9c;" // LETTER JA -"\ue01d>\u0a9d;" // LETTER JHA -"\ue01e>\u0a9e;" // LETTER NYA -"\ue01f>\u0a9f;" // LETTER TTA -"\ue020>\u0aa0;" // LETTER TTHA -"\ue021>\u0aa1;" // LETTER DDA -"\ue022>\u0aa2;" // LETTER DDHA -"\ue023>\u0aa3;" // LETTER NNA -"\ue024>\u0aa4;" // LETTER TA -"\ue025>\u0aa5;" // LETTER THA -"\ue026>\u0aa6;" // LETTER DA -"\ue027>\u0aa7;" // LETTER DHA -"\ue028>\u0aa8;" // LETTER NA -"\ue029>\u0aa8\u0abc;" // FALLBACK to NA+NUKTA -"\ue02a>\u0aaa;" // LETTER PA -"\ue02b>\u0aab;" // LETTER PHA -"\ue02c>\u0aac;" // LETTER BA -"\ue02d>\u0aad;" // LETTER BHA -"\ue02e>\u0aae;" // LETTER MA -"\ue02f>\u0aaf;" // LETTER YA -"\ue030>\u0ab0;" // LETTER RA -"\ue031>\u0ab0\u0abc;" // FALLBACK -"\ue032>\u0ab2;" // LETTER LA -"\ue033>\u0ab3;" // LETTER LLA -"\ue034>\u0ab3\u0abc;" // LETTER LLLA>LETTER LLA+NUKTA -"\ue035>\u0ab5;" // LETTER VA -"\ue036>\u0ab6;" // LETTER SHA -"\ue037>\u0ab7;" // LETTER SSA -"\ue038>\u0ab8;" // LETTER SA -"\ue039>\u0ab9;" // LETTER HA -"\ue03c>\u0abc;" // SIGN NUKTA -"\ue03d>\u0abd;" // SIGN AVAGRAHA -"\ue03e>\u0abe;" // VOWEL SIGN AA -"\ue03f>\u0abf;" // VOWEL SIGN I -"\ue040>\u0ac0;" // VOWEL SIGN II -"\ue041>\u0ac1;" // VOWEL SIGN U -"\ue042>\u0ac2;" // VOWEL SIGN UU -"\ue043>\u0ac3;" // VOWEL SIGN VOCALIC R -"\ue044>\u0ac4;" // VOWEL SIGN VOCALIC RR -"\ue045>\u0ac5;" // VOWEL SIGN CANDRA E -"\ue046>\u0ac7;" // FALLBACK -"\ue047>\u0ac7;" // InterIndic-Gujarati: VOWEL SIGN EE (\u0ac7 = VOWEL SIGN E) -"\ue048>\u0ac8;" // VOWEL SIGN AI -"\ue049>\u0ac9;" // VOWEL SIGN CANDRA O -"\ue04a>\u0acb;" // FALLBACK -"\ue04b>\u0acb;" // UNMAPPED InterIndic-Gujarati: VOWEL SIGN OO (\u0acb = VOWEL SIGN O) -"\ue04c>\u0acc;" // VOWEL SIGN AU -"\ue04d>\u0acd;" // SIGN VIRAMA -"\ue050>\u0ad0;" // OM -"\ue051>;" -"\ue052>;" -"\ue053>;" -"\ue054>;" -"\ue055>;" // UNMAPPED InterIndic-Gujarati: LENGTH MARK -"\ue056>\u0ac8;" // REMAP (indicExceptions.txt): \u0ad6>\u0ac8 = AI LENGTH MARK>VOWEL SIGN AI -"\ue057>\u0acc;" // REMAP (indicExceptions.txt): \u0ad7>\u0acc = AU LENGTH MARK>VOWEL SIGN AU -"\ue058>\u0a95\u0abc;" // FALLBACK -"\ue059>\u0a96\u0abc;" // REMAP (indicExceptions.txt): \u0ad9>\u0a96\u0abc = LETTER KHHA>LETTER KHA.SIGN NUKTA -"\ue05a>\u0a97\u0abc;" // REMAP (indicExceptions.txt): \u0ada>\u0a97\u0abc = LETTER GHHA>LETTER GA.SIGN NUKTA -"\ue05b>\u0a9c\u0abc;" // REMAP (indicExceptions.txt): \u0adb>\u0a9c\u0abc = LETTER ZA>LETTER JA.SIGN NUKTA -"\ue05c>\u0aa1\u0abc;" // FALLBACK -"\ue05d>\u0aa2\u0abc;" // REMAP (indicExceptions.txt): \u0add>\u0aa2\u0abc = LETTER RHA>LETTER DDHA.SIGN NUKTA -"\ue05e>\u0aab\u0abc;" // REMAP (indicExceptions.txt): \u0ade>\u0aab\u0abc = LETTER FA>LETTER PHA.SIGN NUKTA -"\ue05f>\u0aaf\u0abc;" // REMAP (indicExceptions.txt): \u0adf>\u0aaf\u0abc = LETTER YYA>LETTER YA.SIGN NUKTA -"\ue060>\u0ae0;" // LETTER VOCALIC RR -"\ue061>\u0ab2\u0ac3;" // REMAP (indicExceptions.txt): \u0ae1>\u0ab2\u0ac3 = LETTER VOCALIC LL>LETTER LA.VOWEL SIGN VOCALIC R -"\ue062>\u0abf\u0abc;" // REMAP (indicExceptions.txt): \u0ae2>\u0abf\u0abc = VOWEL SIGN VOCALIC L>VOWEL SIGN I.SIGN NUKTA -"\ue063>\u0ac0\u0abc;" // REMAP (indicExceptions.txt): \u0ae3>\u0ac0\u0abc = VOWEL SIGN VOCALIC LL>VOWEL SIGN II.SIGN NUKTA -"\uE064>\u0964;" // DANDA -"\uE065>\u0965;" // DOUBLE DANDA -"\ue066>\u0ae6;" // DIGIT ZERO -"\ue067>\u0ae7;" // DIGIT ONE -"\ue068>\u0ae8;" // DIGIT TWO -"\ue069>\u0ae9;" // DIGIT THREE -"\ue06a>\u0aea;" // DIGIT FOUR -"\ue06b>\u0aeb;" // DIGIT FIVE -"\ue06c>\u0aec;" // DIGIT SIX -"\ue06d>\u0aed;" // DIGIT SEVEN -"\ue06e>\u0aee;" // DIGIT EIGHT -"\ue06f>\u0aef;" // DIGIT NINE -"\ue070>;" -"\ue071>;" -"\ue072>;" -"\ue073>;" -"\ue074>;" -"\ue075>;" -"\ue076>;" -"\ue077>;" -"\ue078>;" -"\ue079>;" -"\ue07A>;" -"0 > \u0ae6;" // FALLBACK FOR TAMIL -"1 > \u0ae7;" -"\ue0f0 > \u0ab0;" // FALLBACK RA -"\ue0f1 > \u0ab0;" // FALLBACK RA -//\ue080>; # UNMAPPED InterIndic-Gujarati: ISSHAR -// :: NFC (NFD) ; -// eof - } -} diff --git a/icuSources/data/translit/t_InterIndic_Guru.txt b/icuSources/data/translit/t_InterIndic_Guru.txt deleted file mode 100644 index 5308f823..00000000 --- a/icuSources/data/translit/t_InterIndic_Guru.txt +++ /dev/null @@ -1,162 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_InterIndic_Gurmukhi.txt -// Date: Sat Jul 27 10:31:07 2002 -//-------------------------------------------------------------------- - -// InterIndic_Gurmukhi - -t_InterIndic_Guru { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// InterIndic-Gurmukhi -//:: NFD (NFC) ; -"$vowel = [\u0A05-\u0A14 \u0A3e-\u0A4D];" -"$consonant = [\u0A15-\u0A39];" - -"\ue001>;" // FALLBACK BLOW AWAY SIGN CHANDRABINDU -//rules for BINDI - -// Anusvara is equivalent to BINDI when preceeded by a vowel -"$vowel{\ue002>\u0a02;" // SIGN ANUSVARA (\u0a02 = SIGN BINDI) -// else is equivalent to TIPPI -"$consonant{\ue002>\u0a70;" // SIGN TIPPI -"\ue002>\u0a02;" - -"\ue003>;" // FALLBACK BLOW AWAY SIGN VISARGA -"\ue005>\u0a05;" // LETTER A -"\ue006>\u0a06;" // LETTER AA -"\ue007>\u0a07;" // LETTER I -"\ue008>\u0a08;" // LETTER II -"\ue009>\u0a09;" // LETTER U -"\ue00a>\u0a0a;" // LETTER UU -"\ue00b>\u0a30\u0a3f;" // REMAP (indicExceptions.txt): \u0a0b>\u0a30\u0a3f = LETTER VOCALIC R>LETTER RA.VOWEL SIGN I -"\ue00c>\u0a33;" // FALLBACK -"\ue00d>\u0a0f;" // FALLBACK -"\ue00e>\u0a0f;" // FALLBACK -"\ue00f>\u0a0f;" // LETTER EE -"\ue010>\u0a10;" // LETTER AI -"\ue011>\u0a13;" // FALLBACK -"\ue012>\u0a13;" // FALLBACK -"\ue013>\u0a13;" // LETTER OO -"\ue014>\u0a14;" // LETTER AU -"\ue015>\u0a15;" // LETTER KA -"\ue016>\u0a16;" // LETTER KHA -"\ue017>\u0a17;" // LETTER GA -"\ue018>\u0a18;" // LETTER GHA -"\ue019>\u0a19;" // LETTER NGA -"\ue01a>\u0a1a;" // LETTER CA -"\ue01b>\u0a1b;" // LETTER CHA -"\ue01c>\u0a1c;" // LETTER JA -"\ue01d>\u0a1d;" // LETTER JHA -"\ue01e>\u0a1e;" // LETTER NYA -"\ue01f>\u0a1f;" // LETTER TTA -"\ue020>\u0a20;" // LETTER TTHA -"\ue021>\u0a21;" // LETTER DDA -"\ue022>\u0a22;" // LETTER DDHA -"\ue023>\u0a23;" // LETTER NNA -"\ue024>\u0a24;" // LETTER TA -"\ue025>\u0a25;" // LETTER THA -"\ue026>\u0a26;" // LETTER DA -"\ue027>\u0a27;" // LETTER DHA -"\ue028>\u0a28;" // LETTER NA -"\ue029>\u0a28\u0a3c;" // REMAP (indicExceptions.txt): \u0a29>\u0a28 = LETTER NNNA>LETTER NA -"\ue02a>\u0a2a;" // LETTER PA -"\ue02b>\u0a2b;" // LETTER PHA -"\ue02c>\u0a2c;" // LETTER BA -"\ue02d>\u0a2d;" // LETTER BHA -"\ue02e>\u0a2e;" // LETTER MA -"\ue02f>\u0a2f;" // LETTER YA -"\ue030>\u0a30;" // LETTER RA -"\ue031>\u0a30\u0a3c;" // FALLBACK LETTER RA+NUKTA -"\ue032>\u0a32;" // LETTER LA -"\ue033>\u0a33;" // LETTER LLA -"\ue034>\u0a33;" // REMAP (indicExceptions.txt): \u0a34>\u0a33 = LETTER LLLA>LETTER LLA -"\ue035>\u0a35;" // LETTER VA -"\ue036>\u0a36;" // LETTER SHA -"\ue037>\u0a36;" // REMAP (indicExceptions.txt): \u0a37>\u0a36 = LETTER SSA>LETTER SHA -"\ue038>\u0a38;" // LETTER SA -"\ue039>\u0a39;" // LETTER HA -"\ue03c>\u0a3c;" // SIGN NUKTA -"\ue03d>;" // FALLBACK BLOW AWAY SIGN AVAGRAHA -"\ue03e>\u0a3e;" // VOWEL SIGN AA -"\ue03f>\u0a3f;" // VOWEL SIGN I -"\ue040>\u0a40;" // VOWEL SIGN II -"\ue041>\u0a41;" // VOWEL SIGN U -"\ue042>\u0a42;" // VOWEL SIGN UU -"\ue043>;" // FALLBACK BLOW AWAY VOWEL SIGN VOCALIC R -"\ue044>;" // FALLBACK BLOW AWAY VOWEL SIGN VOCALIC RR -"\ue045>\u0a48;" // REMAP (indicExceptions.txt): \u0a45>\u0a48 = VOWEL SIGN CANDRA E>VOWEL SIGN AI -"\ue046>\u0a47;" // FALLABCK -"\ue047>\u0a47;" // VOWEL SIGN EE -"\ue048>\u0a48;" // VOWEL SIGN AI -"\ue049>\u0a4c;" // REMAP (indicExceptions.txt): \u0a49>\u0a4c = VOWEL SIGN CANDRA O>VOWEL SIGN AU -"\ue04a>\u0a4b;" // FALLBACK -"\ue04b>\u0a4b;" // VOWEL SIGN OO -"\ue04c>\u0a4c;" // VOWEL SIGN AU -"\ue04d>\u0a4d;" // SIGN VIRAMA -"\ue050>\u0a0f\u0a02;" // FALLBACK to OO+BINDI : OM -"\ue051>;" -"\ue052>;" -"\ue053>;" -"\ue054>;" -"\ue055>;" // FALLBACK BLOW AWAY LENGTH MARK -"\ue056>\u0a48;" // REMAP (indicExceptions.txt): \u0a56>\u0a48 = AI LENGTH MARK>VOWEL SIGN AI -"\ue057>\u0a4c;" // REMAP (indicExceptions.txt): \u0a57>\u0a4c = AU LENGTH MARK>VOWEL SIGN AU -"\ue058>\u0a15\u0a3c;" // FALLBACK RA+ NUKTA -"\ue059>\u0a59;" // LETTER KHHA -"\ue05a>\u0a5a;" // LETTER GHHA -"\ue05b>\u0a5b;" // LETTER ZA -"\ue05c>\u0a5c;" // LETTER RRA -"\ue05d>\u0a22\u0a3c;" // REMAP (indicExceptions.txt): \u0a5d>\u0a22\u0a3c = LETTER RHA>LETTER DDHA.SIGN NUKTA -"\ue05e>\u0a5e;" // LETTER FA -"\ue05f>\u0a2f\u0a3c;" // REMAP (indicExceptions.txt): \u0a5f>\u0a2f = LETTER YYA>LETTER YA -"\ue060>\u0a30\u0a3f;" // REMAP (indicExceptions.txt): \u0a60>\u0a30\u0a3f = LETTER VOCALIC RR>LETTER RA.VOWEL SIGN I -"\ue061>\u0a33\u0a3c;" // -"\ue062>\u0a3f\u0a3c;" // REMAP (indicExceptions.txt): \u0a62>\u0a3f\u0a3c = VOWEL SIGN VOCALIC L>VOWEL SIGN I.SIGN NUKTA -"\ue063>\u0a40\u0a3c;" // REMAP (indicExceptions.txt): \u0a63>\u0a40\u0a3c = VOWEL SIGN VOCALIC LL>VOWEL SIGN II.SIGN NUKTA -"\uE064>\u0964;" // DANDA -"\uE065>\u0965;" // DOUBLE DANDA -"\ue066>\u0a66;" // DIGIT ZERO -"\ue067>\u0a67;" // DIGIT ONE -"\ue068>\u0a68;" // DIGIT TWO -"\ue069>\u0a69;" // DIGIT THREE -"\ue06a>\u0a6a;" // DIGIT FOUR -"\ue06b>\u0a6b;" // DIGIT FIVE -"\ue06c>\u0a6c;" // DIGIT SIX -"\ue06d>\u0a6d;" // DIGIT SEVEN -"\ue06e>\u0a6e;" // DIGIT EIGHT -"\ue06f>\u0a6f;" // DIGIT NINE -"\ue070>;" // TIPPI -"\ue071>;" // ADDAK -"\ue072>;" // IRI -"\ue073>;" // URA -"\ue074>;" // EK ONKAR -"\ue075>;" -"\ue076>;" -"\ue077>;" -"\ue078>;" -"\ue079>;" -"\ue07A>;" -"\ue080>;" // FALLBACK BLOW AWAY ISSHAR -"\ue081>;" // FALLBACK BLOW AWAY LETTER E -"\ue082>;" // FALLBACK BLOW AWAY LETTER O (\u0a02 = SIGN BINDI) -"\ue084>;" // FALLBACK BLOW AWAY VOWEL SIGN E -"\ue085>;" // FALLBACK BLOW AWAY VOWEL SIGN O (\u0a05 = LETTER A) - -"0 > \u0a66;" // FALLBACK FOR TAMIL -"1 > \u0a67;" -"\ue0f0 > \u0a30;" // FALLBACK RA -"\ue0f1 > \u0a30;" // FALLBACK RA -// :: NFC (NFD) ; -// eof - } -} diff --git a/icuSources/data/translit/t_InterIndic_Knda.txt b/icuSources/data/translit/t_InterIndic_Knda.txt deleted file mode 100644 index 9d5913f2..00000000 --- a/icuSources/data/translit/t_InterIndic_Knda.txt +++ /dev/null @@ -1,151 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_InterIndic_Kannada.txt -// Date: Sat Jul 27 10:31:07 2002 -//-------------------------------------------------------------------- - -// InterIndic_Kannada - -t_InterIndic_Knda { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// InterIndic-Kannada -//:: NFD (NFC) ; -"\ue02b\ue03c>\u0cde;" // LETTER FA -"\ue001>\u0c82;" // REMAP (indicExceptions.txt): \u0c81>\u0c82 = SIGN CANDRABINDU>SIGN ANUSVARA -"\ue002>\u0c82;" // SIGN ANUSVARA -"\ue003>\u0c83;" // SIGN VISARGA -"\ue005>\u0c85;" // LETTER A -"\ue006>\u0c86;" // LETTER AA -"\ue007>\u0c87;" // LETTER I -"\ue008>\u0c88;" // LETTER II -"\ue009>\u0c89;" // LETTER U -"\ue00a>\u0c8a;" // LETTER UU -"\ue00b>\u0c8b;" // LETTER VOCALIC R -"\ue00c>\u0c8c;" // LETTER VOCALIC L -"\ue00d>\u0c8e;" // LETTER E -"\ue00e>\u0c8e;" // FALLBACK -"\ue00f>\u0c8f;" // LETTER EE -"\ue010>\u0c90;" // LETTER AI -"\ue011>\u0c92;" // FALLBACK -"\ue012>\u0c92;" // LETTER O -"\ue013>\u0c93;" // LETTER OO -"\ue014>\u0c94;" // LETTER AU -"\ue015>\u0c95;" // LETTER KA -"\ue016>\u0c96;" // LETTER KHA -"\ue017>\u0c97;" // LETTER GA -"\ue018>\u0c98;" // LETTER GHA -"\ue019>\u0c99;" // LETTER NGA -"\ue01a>\u0c9a;" // LETTER CA -"\ue01b>\u0c9b;" // LETTER CHA -"\ue01c>\u0c9c;" // LETTER JA -"\ue01d>\u0c9d;" // LETTER JHA -"\ue01e>\u0c9e;" // LETTER NYA -"\ue01f>\u0c9f;" // LETTER TTA -"\ue020>\u0ca0;" // LETTER TTHA -"\ue021>\u0ca1;" // LETTER DDA -"\ue022>\u0ca2;" // LETTER DDHA -"\ue023>\u0ca3;" // LETTER NNA -"\ue024>\u0ca4;" // LETTER TA -"\ue025>\u0ca5;" // LETTER THA -"\ue026>\u0ca6;" // LETTER DA -"\ue027>\u0ca7;" // LETTER DHA -"\ue028>\u0ca8;" // LETTER NA -"\ue029>\u0ca8;" // REMAP (indicExceptions.txt): \u0ca9>\u0ca8 = LETTER NNNA>LETTER NA -"\ue02a>\u0caa;" // LETTER PA -"\ue02b>\u0cab;" // LETTER PHA -"\ue02c>\u0cac;" // LETTER BA -"\ue02d>\u0cad;" // LETTER BHA -"\ue02e>\u0cae;" // LETTER MA -"\ue02f>\u0caf;" // LETTER YA -"\ue030\ue03c>\u0cb1;" -"\ue030>\u0cb0;" // LETTER RA -"\ue031>\u0cb1;" // LETTER RRA -"\ue032>\u0cb2;" // LETTER LA -"\ue033>\u0cb3;" // LETTER LLA -"\ue034>\u0cb3;" // REMAP (indicExceptions.txt): \u0cb4>\u0cb3 = LETTER LLLA>LETTER LLA -"\ue035>\u0cb5;" // LETTER VA -"\ue036>\u0cb6;" // LETTER SHA -"\ue037>\u0cb7;" // LETTER SSA -"\ue038>\u0cb8;" // LETTER SA -"\ue039>\u0cb9;" // LETTER HA - -"\ue03c>;" // FALLBACK BLOW AWAY NUKTA -"\ue03d>;" // FALLBACK BLOW AWAY AVAGRAHA - -"\ue03e>\u0cbe;" // VOWEL SIGN AA -"\ue03f>\u0cbf;" // VOWEL SIGN I -"\ue040>\u0cc0;" // VOWEL SIGN II -"\ue041>\u0cc1;" // VOWEL SIGN U -"\ue042>\u0cc2;" // VOWEL SIGN UU -"\ue043>\u0cc3;" // VOWEL SIGN VOCALIC R -"\ue044>\u0cc4;" // VOWEL SIGN VOCALIC RR -"\ue045>\u0cc6;" // REMAP (indicExceptions.txt): \u0cc5>\u0cc6 = VOWEL SIGN CANDRA E>VOWEL SIGN E -"\ue046>\u0cc6;" // VOWEL SIGN E -"\ue047>\u0cc7;" // VOWEL SIGN EE -"\ue048>\u0cc8;" // VOWEL SIGN AI -"\ue049>\u0cca;" // REMAP (indicExceptions.txt): \u0cc9>\u0cca = VOWEL SIGN CANDRA O>VOWEL SIGN O -"\ue04a>\u0cca;" // VOWEL SIGN O -"\ue04b>\u0ccb;" // VOWEL SIGN OO -"\ue04c>\u0ccc;" // VOWEL SIGN AU -"\ue04d>\u0ccd;" // SIGN VIRAMA -"\ue050>\u0c93\u0c82;" // REMAP (indicExceptions.txt): \u0cd0>\u0c93\u0c82 = OM>LETTER OO.SIGN ANUSVARA -"\ue051>;" -"\ue052>;" -"\ue053>;" -"\ue054>;" -"\ue055>\u0cd5;" // LENGTH MARK -"\ue056>\u0cd6;" // AI LENGTH MARK -"\ue057>\u0ccc;" // REMAP (indicExceptions.txt): \u0cd7>\u0ccc = AU LENGTH MARK>VOWEL SIGN AU -"\ue058>\u0c95;" // FALLBACK -"\ue059>\u0c96;" // REMAP (indicExceptions.txt): \u0cd9>\u0c96 = LETTER KHHA>LETTER KHA -"\ue05a>\u0c97;" // REMAP (indicExceptions.txt): \u0cda>\u0c97 = LETTER GHHA>LETTER GA -"\ue05b>\u0c9c;" // REMAP (indicExceptions.txt): \u0cdb>\u0c9c = LETTER ZA>LETTER JA -"\ue05c>\u0ca2;" // FALLBACK -"\ue05d>\u0ca2;" // REMAP (indicExceptions.txt): \u0cdd>\u0ca2 = LETTER RHA>LETTER DDHA -"\ue05e>\u0cde;" // LETTER FA -"\ue05f>\u0caf;" // REMAP (indicExceptions.txt): \u0cdf>\u0caf = LETTER YYA>LETTER YA -"\ue060>\u0ce0;" // LETTER VOCALIC RR -"\ue061>\u0ce1;" // LETTER VOCALIC LL -"\ue062>\u0cbf;" // REMAP (indicExceptions.txt): \u0ce2>\u0cbf = VOWEL SIGN VOCALIC L>VOWEL SIGN I -"\ue063>\u0cc0;" // REMAP (indicExceptions.txt): \u0ce3>\u0cc0 = VOWEL SIGN VOCALIC LL>VOWEL SIGN II -"\ue064>'.' ;" // FALLBACK FOR DANDA -"\ue065>'.' ;" // FALLBACK FOR DOUBLE DANDA -"\ue066>\u0ce6;" // DIGIT ZERO -"\ue067>\u0ce7;" // DIGIT ONE -"\ue068>\u0ce8;" // DIGIT TWO -"\ue069>\u0ce9;" // DIGIT THREE -"\ue06a>\u0cea;" // DIGIT FOUR -"\ue06b>\u0ceb;" // DIGIT FIVE -"\ue06c>\u0cec;" // DIGIT SIX -"\ue06d>\u0ced;" // DIGIT SEVEN -"\ue06e>\u0cee;" // DIGIT EIGHT -"\ue06f>\u0cef;" // DIGIT NINE -"\ue080>;" // UNMAPPED InterIndic-Kannada: ISSHAR -"\ue070>;" -"\ue071>;" -"\ue072>;" -"\ue073>;" -"\ue074>;" -"\ue075>;" -"\ue076>;" -"\ue077>;" -"\ue078>;" -"\ue079>;" -"\ue07A>;" -"0 > \u0ce6;" // FALLBACK FOR TAMIL -"1 > \u0ce7;" -"\ue0f0 > \u0cb0;" // FALLBACK RA -"\ue0f1 > \u0cb0;" // FALLBACK RA -// :: NFC (NFD) ; -// eof - } -} diff --git a/icuSources/data/translit/t_InterIndic_Latn.txt b/icuSources/data/translit/t_InterIndic_Latn.txt deleted file mode 100644 index b1b4f90e..00000000 --- a/icuSources/data/translit/t_InterIndic_Latn.txt +++ /dev/null @@ -1,544 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_InterIndic_Latin.txt -// Date: Sat Jul 27 10:31:07 2002 -//-------------------------------------------------------------------- - -// InterIndic_Latin - -t_InterIndic_Latn { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// InterIndic-Latin - //\u0e00 reserved - //consonants - "$chandrabindu=\ue001;" - "$anusvara=\ue002;" - "$visarga=\ue003;" - //\u0e004 reserved - // w represents the stand-alone form - "$wa=\ue005;" - "$waa=\ue006;" - "$wi=\ue007;" - "$wii=\ue008;" - "$wu=\ue009;" - "$wuu=\ue00a;" - "$wr=\ue00b;" - "$wl=\ue00c;" - "$wce=\ue00d;" // LETTER CANDRA E - "$wse=\ue00e;" // LETTER SHORT E - "$we=\ue00f;" // \u090f LETTER E - "$wai=\ue010;" - "$wco=\ue011;" // LETTER CANDRA O - "$wso=\ue012;" // LETTER SHORT O - "$wo=\ue013;" // \u0913 LETTER O - "$wau=\ue014;" - "$ka=\ue015;" - "$kha=\ue016;" - "$ga=\ue017;" - "$gha=\ue018;" - "$nga=\ue019;" - "$ca=\ue01a;" - "$cha=\ue01b;" - "$ja=\ue01c;" - "$jha=\ue01d;" - "$nya=\ue01e;" - "$tta=\ue01f;" - "$ttha=\ue020;" - "$dda=\ue021;" - "$ddha=\ue022;" - "$nna=\ue023;" - "$ta=\ue024;" - "$tha=\ue025;" - "$da=\ue026;" - "$dha=\ue027;" - "$na=\ue028;" - "$ena=\ue029;" //compatibility - "$pa=\ue02a;" - "$pha=\ue02b;" - "$ba=\ue02c;" - "$bha=\ue02d;" - "$ma=\ue02e;" - "$ya=\ue02f;" - "$ra=\ue030;" - "$rra=\ue031;" - "$la=\ue032;" - "$lla=\ue033;" - "$ela=\ue034;" //compatibility - "$va=\ue035;" - "$sha=\ue036;" - "$ssa=\ue037;" - "$sa=\ue038;" - "$ha=\ue039;" -//\u093a Reserved -//\u093b Reserved - "$nukta=\ue03c;" - "$avagraha=\ue03d;" // SIGN AVAGRAHA - // represents the dependent form - "$aa=\ue03e;" - "$i=\ue03f;" - "$ii=\ue040;" - "$u=\ue041;" - "$uu=\ue042;" - "$rh=\ue043;" - "$lh=\ue044;" - "$ce=\ue045;" //VOWEL SIGN CANDRA E - "$se=\ue046;" //VOWEL SIGN SHORT E - "$e=\ue047;" - "$ai=\ue048;" - "$co=\ue049;" // VOWEL SIGN CANDRA O - "$so=\ue04a;" // VOWEL SIGN SHORT O - "$o=\ue04b;" // \u094b - "$au=\ue04c;" - "$virama=\ue04d;" -// \u094e Reserved -// \u094f Reserved - "$om=\ue050;" // OM - "\ue051>;" // UNMAPPED STRESS SIGN UDATTA - "\ue052>;" // UNMAPPED STRESS SIGN ANUDATTA - "\ue053>;" // UNMAPPED GRAVE ACCENT - "\ue054>;" // UNMAPPED ACUTE ACCENT - "$lm = \ue055;"// Telugu Length Mark - "$ailm=\ue056;"// AI Length Mark - "$aulm=\ue057;"// AU Length Mark - //urdu compatibity forms - "$uka=\ue058;" - "$ukha=\ue059;" - "$ugha=\ue05a;" - "$ujha=\ue05b;" - "$uddha=\ue05c;" - "$udha=\ue05d;" - "$ufa=\ue05e;" - "$uya=\ue05f;" - "$wrr=\ue060;" - "$wll=\ue061;" - "$rrh=\ue062;" - "$llh=\ue063;" - "$danda=\ue064;" - "$doubleDanda=\ue065;" - "$zero=\ue066;" // DIGIT ZERO - "$one=\ue067;" // DIGIT ONE - "$two=\ue068;" // DIGIT TWO - "$three=\ue069;" // DIGIT THREE - "$four=\ue06a;" // DIGIT FOUR - "$five=\ue06b;" // DIGIT FIVE - "$six=\ue06c;" // DIGIT SIX - "$seven=\ue06d;" // DIGIT SEVEN - "$eight=\ue06e;" // DIGIT EIGHT - "$nine=\ue06f;" // DIGIT NINE - // For all other scripts - "$ecp0=\ue070;" - "$ecp1=\ue071;" - "$ecp2=\ue072;" - "$ecp3=\ue073;" - "$ecp4=\ue074;" - "$ecp5=\ue075;" - "$ecp6=\ue076;" - "$ecp7=\ue077;" - "$ecp8=\ue078;" - "$ecp9=\ue079;" - "$ecpA=\ue07a;" - "$ecpB=\ue07b;" - "$ecpC=\ue07c;" - "$ecpD=\ue07d;" - "$ecpE=\ue07e;" - "$ecpF=\ue07f;" -// \u0970>; # UNMAPPED ABBREVIATION SIGN - "$depVowelAbove=[\ue03e-\ue040\ue045-\ue04c];" - "$depVowelBelow=[\ue041-\ue044];" - // $x was originally called '&'; $z was '%' - "$x=[$aa$ai$au$ii$i$uu$u$rrh$rh$lh$llh$e$o$se$ce$so$co];" - "$z=[bcdfghjklmnpqrstvwxyz];" - "$vowels=[aeiour\u0304\u0325\u0306];" - "$forceIndependentMatra = [^[[:L:][\u0300-\u034c]]];" - //##################################################################### - // convert from Native letters to Latin letters - //##################################################################### - //transliterations for anusvara - "$anusvara} [$ka$kha$ga$gha$nga] > n\u0307;" - "$anusvara} [$ca$cha$ja$jha$nya] > n\u0304;" - "$anusvara} [$tta$ttha$dda$ddha$nna] > n\u0323;" - "$anusvara} [$ta$tha$da$dha$na] > n ;" - "$anusvara} [$pa$pha$ba$bha$ma] > m ;" - "$anusvara} [$ya$ra$lla$la$va$ssa$sha$sa$ha] > n ;" - "$anusvara> m\u0307;" - - // Urdu compatibility - "$ya$nukta}$x > y\u0307 ;" - "$ya$nukta$virama > y\u0307 ;" - "$ya$nukta > y\u0307a ;" - - "$la$nukta }$x > l\u0331 ;" - "$la$nukta$virama > l\u0331 ;" - "$la$nukta > l\u0331a ;" - - "$na$nukta }$x > n\u0331 ;" - "$na$nukta$virama > n\u0331 ;" - "$na$nukta > n\u0331a ;" - - "$ena }$x > n\u0331 ;" - "$ena$virama > n\u0331 ;" - "$ena > n\u0331a ;" - "$uka > qa ;" - "$ka$nukta }$x > q ;" - "$ka$nukta$virama > q ;" - "$ka$nukta > qa ;" - "$kha$nukta }$x > k\u0331h\u0331 ;" - "$kha$nukta$virama > k\u0331h\u0331 ;" - "$kha$nukta > k\u0331h\u0331a ;" - "$ukha$virama > k\u0331h\u0331;" - "$ukha > k\u0331h\u0331a;" - "$ugha > g\u0307a ;" - "$ga$nukta }$x > g\u0307 ;" - "$ga$nukta$virama > g\u0307 ;" - "$ga$nukta > g\u0307a ;" - - "$ujha > za ;" - "$ja$nukta }$x > z ;" - "$ja$nukta$virama > z ;" - "$ja$nukta > za ;" - "$ddha$nukta}$x > r\u0323h ;" - "$ddha$nukta$virama > r\u0323h ;" - "$ddha$nukta > r\u0323ha;" - - "$uddha}$x > r\u0323 ;" - "$uddha$virama > r\u0323 ;" - "$uddha > r\u0323a;" - - "$udha > r\u0323a ;" - "$dda$nukta}$x > r\u0323 ;" - "$dda$nukta$virama > r\u0323 ;" - "$dda$nukta > r\u0323a ;" - "$pha$nukta }$x > f ;" - "$pha$nukta$virama > f ;" - "$pha$nukta > fa ;" - "$ufa }$x > f ;" - "$ufa$virama > f ;" - "$ufa > fa ;" - - "$ra$nukta}$x > r\u0331;" - "$ra$nukta$virama > r\u0331;" - "$ra$nukta > r\u0331a;" - "$lla$nukta}$x > l\u0331;" - "$lla$nukta$virama > l\u0331;" - "$lla$nukta > l\u0331a;" - - "$ela}$x > l\u0331;" - "$ela$virama > l\u0331;" - "$ela > l\u0331a;" - - "$uya}$x > y\u0307;" - "$uya$virama > y\u0307;" - "$uya > y\u0307a;" - - - // normal consonants - "$ka$virama}$ha>k'';" - "$ka}$x>k;" - "$ka$virama>k;" - "$ka>ka;" - "$kha}$x>kh;" - "$kha$virama>kh;" - "$kha>kha;" - "$ga$virama}$ha>g'';" - "$ga}$x>g;" - "$ga$virama>g;" - "$ga>ga;" - - "$gha}$x>gh;" - "$gha$virama>gh;" - "$gha>gha;" - - "$nga}$x>n\u0307;" - "$nga$virama>n\u0307;" - "$nga>n\u0307a ;" - "$ca$virama}$ha>c'';" - "$ca}$x>c;" - "$ca$virama>c;" - "$ca>ca;" - - "$cha}$x>ch;" - "$cha$virama>ch;" - "$cha>cha;" - "$ja$virama}$ha>j'';" - "$ja}$x>j;" - "$ja$virama>j;" - "$ja>ja;" - - "$jha}$x>jh;" - "$jha$virama>jh;" - "$jha>jha;" - - "$nya }$x>n\u0303 ;" - "$nya$virama>n\u0303;" - "$nya > n\u0303a ;" - - - "$tta$virama}$ha>t\u0323'';" - "$tta}$x>t\u0323;" - "$tta$virama>t\u0323;" - "$tta>t\u0323a;" - - "$ttha}$x>t\u0323h;" - "$ttha$virama>t\u0323h;" - "$ttha>t\u0323ha;" - "$dda}$x$ha>d\u0323'';" - "$dda}$x>d\u0323;" - "$dda$virama>d\u0323;" - "$dda>d\u0323a;" - - "$ddha}$x>d\u0323h;" - "$ddha$virama>d\u0323h;" - "$ddha>d\u0323ha;" - - "$nna}$x>n\u0323 ;" - "$nna$virama>n\u0323;" - "$nna>n\u0323a ;" - - - "$ta$virama}$ha>t'';" - "$ta$virama}$ttha>t'';" - "$ta$virama}$tta>t'';" - "$ta$virama}$tha>t'';" - "$ta}$x>t;" - "$ta$virama>t;" - "$ta>ta;" - "$tha}$x>th;" - "$tha$virama>th;" - "$tha>tha;" - - "$da$virama}$ha>d'';" - "$da$virama}$ddha>d'';" - "$da$virama}$dda>d'';" - "$da$virama}$dha>d'';" - "$da}$x>d;" - "$da$virama>d;" - "$da>da;" - "$dha}$x>dh;" - "$dha$virama>dh;" - "$dha>dha;" - "$na$virama}$ga>n'';" - "$na$virama}$ya>n'';" - "$na}$x>n;" - "$na$virama>n;" - "$na>na;" - - - "$pa$virama}$ha>p'';" - "$pa}$x>p;" - "$pa$virama>p;" - "$pa>pa;" - "$pha}$x>ph;" - "$pha$virama>ph;" - "$pha>pha;" - "$ba$virama}$ha>b'';" - "$ba}$x>b;" - "$ba$virama>b;" - "$ba>ba;" - - "$bha}$x>bh;" - "$bha$virama>bh;" - "$bha>bha;" - - "$ma$virama}$ma>m'';" - "$ma}$x>m;" - "$ma$virama>m;" - "$ma>ma;" - - "$ya}$x>y;" - "$ya$virama>y;" - "$ya>ya;" - "$ra$virama}$ha>r'';" - "$ra}$x>r;" - "$ra$virama>r;" - "$ra>ra;" - "$rra$virama}$ha>r\u0331'';" - "$rra}$x>r\u0331;" - "$rra$virama>r\u0331;" - "$rra>r\u0331a;" - "$la$virama}$ha>l'';" - "$la}$x>l;" - "$la$virama>l;" - "$la>la;" - "$lla$virama}$ha>l\u0323'';" - "$lla}$x>l\u0323;" - "$lla$virama>l\u0323;" - "$lla>l\u0323a;" - "$va}$x>v;" - "$va$virama>v;" - "$va>va;" - "$sa$virama}$ha>s'';" - "$sa$virama}$sha>s'';" - "$sa$virama}$ssa>s'';" - "$sa$virama}$sa>s'';" - "$sa}$x>s;" - "$sa$virama>s;" - - //for gurmukhi - "$sa$nukta}$x>s\u0301;" - "$sa$nukta$virama>s\u0301;" - "$sa$nukta>s\u0301a;" - "$sa>sa;" - - "$sha}$x>s\u0301;" - "$sha$virama>s\u0301;" - "$sha>s\u0301a;" - - "$ssa}$x>s\u0323;" - "$ssa$virama>s\u0323;" - "$ssa>s\u0323a;" - "$ha}$x>h;" - "$ha$virama>h;" - "$ha>ha;" - - // dependent vowels (should never occur except following consonants) - "$forceIndependentMatra{$aa > \u0314a\u0304 ;" - "$forceIndependentMatra{$ai > \u0314ai ;" - "$forceIndependentMatra{$au > \u0314au ;" - "$forceIndependentMatra{$ii > \u0314i\u0304 ;" - "$forceIndependentMatra{$i > \u0314i ;" - "$forceIndependentMatra{$uu > \u0314u\u0304 ;" - "$forceIndependentMatra{$u > \u0314u ;" - "$forceIndependentMatra{$rrh > \u0314r\u0325\u0304 ;" - "$forceIndependentMatra{$rh > \u0314r\u0325 ;" - "$forceIndependentMatra{$llh > \u0314l\u0325\u0304 ;" - "$forceIndependentMatra{$lh > \u0314l\u0325 ;" - "$forceIndependentMatra{$e > \u0314e\u0304 ;" - "$forceIndependentMatra{$o > \u0314o\u0304 ;" - //extra vowels - "$forceIndependentMatra{$ce > \u0314e\u0306 ;" - "$forceIndependentMatra{$co > \u0314o\u0306 ;" - "$forceIndependentMatra{$se > \u0314e ;" - "$forceIndependentMatra{$so > \u0314o ;" - "$forceIndependentMatra{$nukta >;" // Nukta cannot appear independently or as first character - "$forceIndependentMatra{$virama >;" // Virama cannot appear independently or as first character - "$aa > a\u0304 ;" - "$ai > ai ;" - "$au > au ;" - "$ii > i\u0304 ;" - "$i > i ;" - "$uu > u\u0304 ;" - "$u > u ;" - "$rrh > r\u0325\u0304 ;" - "$rh > r\u0325 ;" - "$llh > l\u0325\u0304 ;" - "$lh > l\u0325 ;" - "$e > e\u0304 ;" - "$o > o\u0304 ;" - //extra vowels - "$ce > e\u0306 ;" - "$co > o\u0306 ;" - "$se > e ;" - "$so > o ;" - //dependent vowels when following independent vowels. Generally Illegal only for roundtripping - "$waa} $x > a\u0304\u0314 ;" - "$wai} $x > ai\u0314 ;" - "$wau} $x > au\u0314 ;" - "$wii} $x > i\u0304\u0314 ;" - "$wi } $x > i\u0314 ;" - "$wuu} $x > u\u0304\u0314 ;" - "$wu } $x > u\u0314 ;" - "$wrr} $x > r\u0325\u0304\u0314 ;" - "$wr } $x > r\u0325\u0314 ;" - "$wll} $x > l\u0325\u0304\u0314 ;" - "$wl } $x > l\u0325\u0314 ;" - "$we } $x > e\u0304\u0314 ;" - "$wo } $x > o\u0304\u0314 ;" - "$wa } $x > a\u0314 ;" - //extra vowels - "$wce} $x > e\u0306\u0314 ;" - "$wco} $x > o\u0306\u0314 ;" - "$wse} $x > e\u0314 ;" - "$wso} $x > o\u0314 ;" - "$om} $x > ''om\u0314 ;" - - // independent vowels when preceeded by vowels - "$vowels{$waa > ''a\u0304 ;" - "$vowels{$wai > ''ai ;" - "$vowels{$wau > ''au ;" - "$vowels{$wii > ''i\u0304 ;" - "$vowels{$wi > ''i ;" - "$vowels{$wuu > ''u\u0304 ;" - "$vowels{$wu > ''u ;" - "$vowels{$wrr > ''r\u0325\u0304 ;" - "$vowels{$wr > ''r\u0325 ;" - "$vowels{$wll > ''l\u0325\u0304 ;" - "$vowels{$wl > ''l\u0325 ;" - "$vowels{$we > ''e\u0304 ;" - "$vowels{$wo > ''o\u0304 ;" - "$vowels{$wa > ''a ;" - //extra vowels - "$vowels{$wce > ''e\u0306 ;" - "$vowels{$wco > ''o\u0306 ;" - "$vowels{$wse > ''e ;" - "$vowels{$wso > ''o ;" - - // independent vowels (otherwise) - "$waa > a\u0304 ;" - "$wai > ai ;" - "$wau > au ;" - "$wii > i\u0304 ;" - "$wi > i ;" - "$wuu > u\u0304 ;" - "$wu > u ;" - "$wrr > r\u0325\u0304 ;" - "$wr > r\u0325 ;" - "$wll > l\u0325\u0304 ;" - "$wl > l\u0325 ;" - "$we > e\u0304 ;" - "$wo > o\u0304 ;" - "$wa > a ;" - //extra vowels - "$wce > e\u0306 ;" - "$wco > o\u0306 ;" - "$wse > e ;" - "$wso > o ;" - "$om > ''om ;" - - //stress marks - "$avagraha > \u0315;" - "$chandrabindu$anusvara>\u0303;" - "$chandrabindu > m\u0310;" - "$visarga>h\u0323;" - //numbers - "$zero > 0;" - "$one > 1;" - "$two > 2;" - "$three > 3;" - "$four > 4;" - "$five > 5;" - "$six > 6;" - "$seven > 7;" - "$eight > 8;" - "$nine > 9;" - "$lm >;" - "$ailm >;" - "$aulm >;" - "$ecp0 >;" - "$ecp1 >;" - "$ecp2 >;" - "$ecp3 >;" - "$ecp4 >;" - "$ecp5 >;" - "$ecp6 >;" - "$ecp7 >;" - "$ecp8 >;" - "$ecp9 >;" - "$ecpA >;" - "$ecpB >;" - "$ecpC >;" - "$ecpD >;" - "$ecpE >;" - "$ecpF >;" - "$danda>'.';" - "$doubleDanda>'.';" - } -} diff --git a/icuSources/data/translit/t_InterIndic_Mlym.txt b/icuSources/data/translit/t_InterIndic_Mlym.txt deleted file mode 100644 index 8adb3aee..00000000 --- a/icuSources/data/translit/t_InterIndic_Mlym.txt +++ /dev/null @@ -1,153 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_InterIndic_Malayalam.txt -// Date: Sat Jul 27 10:31:07 2002 -//-------------------------------------------------------------------- - -// InterIndic_Malayalam - -t_InterIndic_Mlym { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// InterIndic-Malayalam -//:: NFD (NFC) ; -"\ue001>\u0d02;" // REMAP (indicExceptions.txt): \u0d01>\u0d02 = SIGN CANDRABINDU>SIGN ANUSVARA -"\ue002>\u0d02;" // SIGN ANUSVARA -"\ue003>\u0d03;" // SIGN VISARGA -"\ue005>\u0d05;" // LETTER A -"\ue006>\u0d06;" // LETTER AA -"\ue007>\u0d07;" // LETTER I -"\ue008>\u0d08;" // LETTER II -"\ue009>\u0d09;" // LETTER U -"\ue00a>\u0d0a;" // LETTER UU -"\ue00b>\u0d0b;" // LETTER VOCALIC R -"\ue00c>\u0d0c;" // LETTER VOCALIC L -"\ue00d>\u0d0e;" // FALLLBACK LETTER E -"\ue00e>\u0d0e;" // LETTER E -"\ue00f>\u0d0f;" // LETTER EE -"\ue010>\u0d10;" // LETTER AI -"\ue011>\u0d12;" // FALLBACK TO O -"\ue012>\u0d12;" // LETTER O -"\ue013>\u0d13;" // LETTER OO -"\ue014>\u0d14;" // LETTER AU -"\ue015>\u0d15;" // LETTER KA -"\ue016>\u0d16;" // LETTER KHA -"\ue017>\u0d17;" // LETTER GA -"\ue018>\u0d18;" // LETTER GHA -"\ue019>\u0d19;" // LETTER NGA -"\ue01a>\u0d1a;" // LETTER CA -"\ue01b>\u0d1b;" // LETTER CHA -"\ue01c>\u0d1c;" // LETTER JA -"\ue01d>\u0d1d;" // LETTER JHA -"\ue01e>\u0d1e;" // LETTER NYA -"\ue01f>\u0d1f;" // LETTER TTA -"\ue020>\u0d20;" // LETTER TTHA -"\ue021>\u0d21;" // LETTER DDA -"\ue022>\u0d22;" // LETTER DDHA -"\ue023>\u0d23;" // LETTER NNA -"\ue024>\u0d24;" // LETTER TA -"\ue025>\u0d25;" // LETTER THA -"\ue026>\u0d26;" // LETTER DA -"\ue027>\u0d27;" // LETTER DHA -"\ue028>\u0d28;" // LETTER NA -"\ue029>\u0d28;" // REMAP (indicExceptions.txt): \u0d29>\u0d28 = LETTER NNNA>LETTER NA -"\ue02a>\u0d2a;" // LETTER PA -"\ue02b>\u0d2b;" // LETTER PHA -"\ue02c>\u0d2c;" // LETTER BA -"\ue02d>\u0d2d;" // LETTER BHA -"\ue02e>\u0d2e;" // LETTER MA -"\ue02f>\u0d2f;" // LETTER YA -"\ue030\ue03c>\u0d31;" -"\ue030>\u0d30;" // LETTER RA -"\ue031>\u0d31;" // LETTER RRA -"\ue032>\u0d32;" // LETTER LA -"\ue033\ue03c>\u0d34;" -"\ue033>\u0d33;" // LETTER LLA -"\ue034>\u0d34;" // LETTER LLLA -"\ue035>\u0d35;" // LETTER VA -"\ue036>\u0d36;" // LETTER SHA -"\ue037>\u0d37;" // LETTER SSA -"\ue038>\u0d38;" // LETTER SA -"\ue039>\u0d39;" // LETTER HA - -"\ue03c>;" // FALLBACK BLOW AWAY NUKTA -"\ue03d>;" // FALLBACK BLOW AWAY AVAGRAHA - -"\ue03e>\u0d3e;" // VOWEL SIGN AA -"\ue03f>\u0d3f;" // VOWEL SIGN I -"\ue040>\u0d40;" // VOWEL SIGN II -"\ue041>\u0d41;" // VOWEL SIGN U -"\ue042>\u0d42;" // VOWEL SIGN UU -"\ue043>\u0d43;" // VOWEL SIGN VOCALIC R -"\ue044>;" // FALLBACK BLOW AWAY VOWEL SIGN VOCALIC RR -"\ue045>\u0d3e;" // REMAP (indicExceptions.txt): \u0d45>\u0d3e = VOWEL SIGN CANDRA E>VOWEL SIGN AA -"\ue046>\u0d46;" // VOWEL SIGN E -"\ue047>\u0d47;" // VOWEL SIGN EE -"\ue048>\u0d48;" // VOWEL SIGN AI -"\ue049>\u0d4b;" // REMAP (indicExceptions.txt): \u0d49>\u0d4b = VOWEL SIGN CANDRA O>VOWEL SIGN OO -"\ue04a>\u0d4a;" // VOWEL SIGN O -"\ue04b>\u0d4b;" // VOWEL SIGN OO -"\ue04c>\u0d4c;" // VOWEL SIGN AU -"\ue04d>\u0d4d;" // SIGN VIRAMA -"\ue050>\u0d13\u0d02;" // UNMAPPED InterIndic-Malayalam: OM -"\ue051>;" -"\ue052>;" -"\ue053>;" -"\ue054>;" -"\ue055>;" // FALLBACK BLOW AWAY LENGTH MARK -"\ue056>\u0d48;" // REMAP (indicExceptions.txt): \u0d56>\u0d48 = AI LENGTH MARK>VOWEL SIGN AI -"\ue057>\u0d57;" // AU LENGTH MARK -"\ue058>\u0d15;" // FALLBACK -"\ue059>\u0d16;" // REMAP (indicExceptions.txt): \u0d59>\u0d16 = LETTER KHHA>LETTER KHA -"\ue05a>\u0d17;" // REMAP (indicExceptions.txt): \u0d5a>\u0d17 = LETTER GHHA>LETTER GA -"\ue05b>\u0d1c;" // REMAP (indicExceptions.txt): \u0d5b>\u0d1c = LETTER ZA>LETTER JA -"\ue05d>\u0d22;" // REMAP (indicExceptions.txt): \u0d5d>\u0d22 = LETTER RHA>LETTER DDHA -"\ue05c>\u0d21;" // FALLBACK -"\ue05e>\u0d2b;" // REMAP (indicExceptions.txt): \u0d5e>\u0d2b = LETTER FA>LETTER PHA -"\ue05f>\u0d2f;" // REMAP (indicExceptions.txt): \u0d5f>\u0d2f = LETTER YYA>LETTER YA -"\ue060>\u0d60;" // LETTER VOCALIC RR -"\ue061>\u0d61;" // LETTER VOCALIC LL -"\ue062>;" // FALLBACK BLOW AWAY VOWEL SIGN VOCALIC L -"\ue063>;" // FALLBACK BLOW AWAY VOWEL SIGN VOCALIC LL -"\ue064>'.' ;" // FALLBACK FOR DANDA -"\ue065>'.' ;" // FALLBACK FOR DOUBLE DANDA -"\ue066>\u0d66;" // DIGIT ZERO -"\ue067>\u0d67;" // DIGIT ONE -"\ue068>\u0d68;" // DIGIT TWO -"\ue069>\u0d69;" // DIGIT THREE -"\ue06a>\u0d6a;" // DIGIT FOUR -"\ue06b>\u0d6b;" // DIGIT FIVE -"\ue06c>\u0d6c;" // DIGIT SIX -"\ue06d>\u0d6d;" // DIGIT SEVEN -"\ue06e>\u0d6e;" // DIGIT EIGHT -"\ue06f>\u0d6f;" // DIGIT NINE -"\ue080>;" // UNMAPPED InterIndic-Malayalam: ISSHAR -"\ue070>;" -"\ue071>;" -"\ue072>;" -"\ue073>;" -"\ue074>;" -"\ue075>;" -"\ue076>;" -"\ue077>;" -"\ue078>;" -"\ue079>;" -"\ue07A>;" -"0 > \u0d66;" // FALLBACK FOR TAMIL -"1 > \u0d67;" -"\ue0f0 > \u0d30;" // FALLBACK RA -"\ue0f1 > \u0d30;" // FALLBACK RA - - -// :: NFC (NFD) ; -// eof - } -} diff --git a/icuSources/data/translit/t_InterIndic_Orya.txt b/icuSources/data/translit/t_InterIndic_Orya.txt deleted file mode 100644 index caa1d38a..00000000 --- a/icuSources/data/translit/t_InterIndic_Orya.txt +++ /dev/null @@ -1,146 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_InterIndic_Oriya.txt -// Date: Sat Jul 27 10:31:07 2002 -//-------------------------------------------------------------------- - -// InterIndic_Oriya - -t_InterIndic_Orya { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// InterIndic-Oriya -//:: NFD (NFC) ; -"\ue001>\u0b01;" // SIGN CANDRABINDU -"\ue002>\u0b02;" // SIGN ANUSVARA -"\ue003>\u0b03;" // SIGN VISARGA -"\ue005>\u0b05;" // LETTER A -"\ue006>\u0b06;" // LETTER AA -"\ue007>\u0b07;" // LETTER I -"\ue008>\u0b08;" // LETTER II -"\ue009>\u0b09;" // LETTER U -"\ue00a>\u0b0a;" // LETTER UU -"\ue00b>\u0b0b;" // LETTER VOCALIC R -"\ue00c>\u0b0c;" // LETTER VOCALIC L -"\ue00d>\u0b0f;" // FALLBACK -"\ue00e>\u0b0f;" // FALLBACK -"\ue00f>\u0b0f;" // LETTER E -"\ue010>\u0b10;" // LETTER AI -"\ue011>\u0b13;" // FALLBACK -"\ue012>\u0b13;" // FALLBACK -"\ue013>\u0b13;" // UNMAPPED InterIndic-Oriya: LETTER OO (\u0b13 = LETTER O) -"\ue014>\u0b14;" // LETTER AU -"\ue015>\u0b15;" // LETTER KA -"\ue016>\u0b16;" // LETTER KHA -"\ue017>\u0b17;" // LETTER GA -"\ue018>\u0b18;" // LETTER GHA -"\ue019>\u0b19;" // LETTER NGA -"\ue01a>\u0b1a;" // LETTER CA -"\ue01b>\u0b1b;" // LETTER CHA -"\ue01c>\u0b1c;" // LETTER JA -"\ue01d>\u0b1d;" // LETTER JHA -"\ue01e>\u0b1e;" // LETTER NYA -"\ue01f>\u0b1f;" // LETTER TTA -"\ue020>\u0b20;" // LETTER TTHA -"\ue021>\u0b21;" // LETTER DDA -"\ue022>\u0b22;" // LETTER DDHA -"\ue023>\u0b23;" // LETTER NNA -"\ue024>\u0b24;" // LETTER TA -"\ue025>\u0b25;" // LETTER THA -"\ue026>\u0b26;" // LETTER DA -"\ue027>\u0b27;" // LETTER DHA -"\ue028>\u0b28;" // LETTER NA -"\ue029>\u0b28\u0b3c;" // REMAP (indicExceptions.txt): \u0b29>\u0b28 = LETTER NNNA>LETTER NA -"\ue02a>\u0b2a;" // LETTER PA -"\ue02b>\u0b2b;" // LETTER PHA -"\ue02c>\u0b2c;" // LETTER BA -"\ue02d>\u0b2d;" // LETTER BHA -"\ue02e>\u0b2e;" // LETTER MA -"\ue02f>\u0b2f;" // LETTER YA -"\ue030>\u0b30;" // LETTER RA -"\ue031>\u0b5c;" // LETTER RRA -"\ue032>\u0b32;" // LETTER LA -"\ue033>\u0b33;" // LETTER LLA -"\ue034>\u0b33\u0b3c;" // REMAP (indicExceptions.txt): \u0b34>\u0b33 = LETTER LLLA>LETTER LLA -"\ue035>\u0b2c;" // REMAP (indicExceptions.txt): \u0b35>\u0b2c = LETTER VA>LETTER BA -"\ue036>\u0b36;" // LETTER SHA -"\ue037>\u0b37;" // LETTER SSA -"\ue038>\u0b38;" // LETTER SA -"\ue039>\u0b39;" // LETTER HA -"\ue03c>\u0b3c;" // SIGN NUKTA -"\ue03d>\u0b3d;" // SIGN AVAGRAHA -"\ue03e>\u0b3e;" // VOWEL SIGN AA -"\ue03f>\u0b3f;" // VOWEL SIGN I -"\ue040>\u0b40;" // VOWEL SIGN II -"\ue041>\u0b41;" // VOWEL SIGN U -"\ue042>\u0b42;" // VOWEL SIGN UU -"\ue043>\u0b43;" // VOWEL SIGN VOCALIC R -"\ue044>\u0b43\u0b3c;" // REMAP (indicExceptions.txt): \u0b44>\u0b43\u0b3c = VOWEL SIGN VOCALIC RR>VOWEL SIGN VOCALIC R.SIGN NUKTA -"\ue045>\u0b47;" // FALLBACK -"\ue046>\u0b47;" // FALLBACK -"\ue047>\u0b47;" // VOWEL SIGN E -"\ue048>\u0b48;" // VOWEL SIGN AI -"\ue049>\u0b4b;" // FALLBACK -"\ue04a>\u0b4b;" // FALLBACK -"\ue04b>\u0b4b;" // VOWEL SIGN E -"\ue04c>\u0b4c;" // VOWEL SIGN AU -"\ue04d>\u0b4d;" // SIGN VIRAMA -"\ue050>\u0b13\u0b01;" // REMAP (indicExceptions.txt): \u0b50>\u0b13\u0b01 = OM>LETTER O.SIGN CANDRABINDU -"\ue051>;" -"\ue052>;" -"\ue053>;" -"\ue054>;" -"\ue055>;" // UNMAPPED InterIndic-Oriya: LENGTH MARK -"\ue056>\u0b56;" // AI LENGTH MARK -"\ue057>\u0b57;" // AU LENGTH MARK -"\ue059>\u0b16\u0b3c;" // REMAP (indicExceptions.txt): \u0b59>\u0b16\u0b3c = LETTER KHHA>LETTER KHA.SIGN NUKTA -"\ue058>\u0b15\u0b3c;" // FALLBACK -"\ue05a>\u0b17\u0b3c;" // REMAP (indicExceptions.txt): \u0b5a>\u0b17\u0b3c = LETTER GHHA>LETTER GA.SIGN NUKTA -"\ue05b>\u0b1c\u0b3c;" // REMAP (indicExceptions.txt): \u0b5b>\u0b1c\u0b3c = LETTER ZA>LETTER JA.SIGN NUKTA -"\ue05c>\u0b21\u0b3c;" // FALLBACK -"\ue05d>\u0b5d;" // LETTER RHA -"\ue05e>\u0b2b\u0b3c;" // REMAP (indicExceptions.txt): \u0b5e>\u0b2b\u0b3c = LETTER FA>LETTER PHA.SIGN NUKTA -"\ue05f>\u0b5f;" // LETTER YYA -"\ue060>\u0b60;" // LETTER VOCALIC RR -"\ue061>\u0b61;" // LETTER VOCALIC LL -"\ue062>\u0b56\u0b3c;" // REMAP (indicExceptions.txt): \u0b62>\u0b56\u0b3c = VOWEL SIGN VOCALIC L>AI LENGTH MARK.SIGN NUKTA -"\ue063>\u0b57\u0b3c;" // REMAP (indicExceptions.txt): \u0b63>\u0b57\u0b3c = VOWEL SIGN VOCALIC LL>AU LENGTH MARK.SIGN NUKTA -"\uE064>\u0964;" // DANDA -"\uE065>\u0965;" // DOUBLE DANDA -"\ue066>\u0b66;" // DIGIT ZERO -"\ue067>\u0b67;" // DIGIT ONE -"\ue068>\u0b68;" // DIGIT TWO -"\ue069>\u0b69;" // DIGIT THREE -"\ue06a>\u0b6a;" // DIGIT FOUR -"\ue06b>\u0b6b;" // DIGIT FIVE -"\ue06c>\u0b6c;" // DIGIT SIX -"\ue06d>\u0b6d;" // DIGIT SEVEN -"\ue06e>\u0b6e;" // DIGIT EIGHT -"\ue06f>\u0b6f;" // DIGIT NINE -"\ue070>;" // ISSHAR -"\ue071>;" -"\ue072>;" -"\ue073>;" -"\ue074>;" -"\ue075>;" -"\ue076>;" -"\ue077>;" -"\ue078>;" -"\ue079>;" -"\ue07A>;" -"0 > \u0b66;" // FALLBACK FOR TAMIL -"1 > \u0b67;" -"\ue0f0 > \u0b30;" // FALLBACK RA -"\ue0f1 > \u0b30;" // FALLBACK RA -// :: NFC (NFD) ; -// eof - } -} diff --git a/icuSources/data/translit/t_InterIndic_Taml.txt b/icuSources/data/translit/t_InterIndic_Taml.txt deleted file mode 100644 index 95b65b72..00000000 --- a/icuSources/data/translit/t_InterIndic_Taml.txt +++ /dev/null @@ -1,163 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_InterIndic_Tamil.txt -// Date: Sat Jul 27 10:31:07 2002 -//-------------------------------------------------------------------- - -// InterIndic_Tamil - -t_InterIndic_Taml { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// InterIndic-Tamil -//:: NFD (NFC) ; -"\ue001>\u0b82;" // FALLBACK SIGN CANDRABINDU -"\ue002>\u0b82;" // SIGN ANUSVARA -"\ue003>\u0b83;" // SIGN VISARGA -"\ue005>\u0b85;" // LETTER A -"\ue006>\u0b86;" // LETTER AA -"\ue007>\u0b87;" // LETTER I -"\ue008>\u0b88;" // LETTER II -"\ue009>\u0b89;" // LETTER U -"\ue00a>\u0b8a;" // LETTER UU -"\ue00b>\u0bb0\u0bbf;" // REMAP (indicExceptions.txt): \u0b8b>\u0bb0\u0bbf = LETTER VOCALIC R>LETTER RA.VOWEL SIGN I -"\ue00c>\u0b87;" // REMAP (indicExceptions.txt): \u0b8c>\u0b87 = LETTER VOCALIC L>LETTER I -"\ue00d>\u0b8f;" // FALLBACK -"\ue00e>\u0b8e;" // LETTER E -"\ue00f>\u0b8f;" // LETTER EE -"\ue010>\u0b90;" // LETTER AI -"\ue011>\u0b92;" // FALLBACK -"\ue012>\u0b92;" // LETTER O -"\ue013>\u0b93;" // LETTER OO -"\ue014>\u0b94;" // LETTER AU -"\ue015>\u0b95;" // LETTER KA -"\ue016>\u0b95;" // REMAP (indicExceptions.txt): \u0b96>\u0b95 = LETTER KHA>LETTER KA -"\ue017>\u0b95;" // REMAP (indicExceptions.txt): \u0b97>\u0b95 = LETTER GA>LETTER KA -"\ue018>\u0b95;" // REMAP (indicExceptions.txt): \u0b98>\u0b95 = LETTER GHA>LETTER KA -"\ue019>\u0b99;" // LETTER NGA -"\ue01a>\u0b9a;" // LETTER CA -"\ue01b>\u0b9a;" // REMAP (indicExceptions.txt): \u0b9b>\u0b9a = LETTER CHA>LETTER CA -"\ue01c>\u0b9c;" // LETTER JA -"\ue01d>\u0b9a;" // REMAP (indicExceptions.txt): \u0b9d>\u0b9a = LETTER JHA>LETTER CA -"\ue01e>\u0b9e;" // LETTER NYA -"\ue01f>\u0b9f;" // LETTER TTA -"\ue020>\u0b9f;" // REMAP (indicExceptions.txt): \u0ba0>\u0b9f = LETTER TTHA>LETTER TTA -"\ue021>\u0b9f;" // REMAP (indicExceptions.txt): \u0ba1>\u0b9f = LETTER DDA>LETTER TTA -"\ue022>\u0b9f;" // REMAP (indicExceptions.txt): \u0ba2>\u0b9f = LETTER DDHA>LETTER TTA -"\ue023>\u0ba3;" // LETTER NNA -"\ue024>\u0ba4;" // LETTER TA -"\ue025>\u0ba4;" // REMAP (indicExceptions.txt): \u0ba5>\u0ba4 = LETTER THA>LETTER TA -"\ue026>\u0ba4;" // REMAP (indicExceptions.txt): \u0ba6>\u0ba4 = LETTER DA>LETTER TA -"\ue027>\u0ba4;" // REMAP (indicExceptions.txt): \u0ba7>\u0ba4 = LETTER DHA>LETTER TA -"\ue028\ue03c>\u0ba9;" -"\ue028>\u0ba8;" // LETTER NA -"\ue029>\u0ba9;" // LETTER NNNA -"\ue02a>\u0baa;" // LETTER PA -"\ue02b>\u0baa;" // REMAP (indicExceptions.txt): \u0bab>\u0baa = LETTER PHA>LETTER PA -"\ue02c>\u0baa;" // REMAP (indicExceptions.txt): \u0bac>\u0baa = LETTER BA>LETTER PA -"\ue02d>\u0baa;" // REMAP (indicExceptions.txt): \u0bad>\u0baa = LETTER BHA>LETTER PA -"\ue02e>\u0bae;" // LETTER MA -"\ue02f>\u0baf;" // LETTER YA -"\ue030\ue03c>\u0bb1;" -"\ue030>\u0bb0;" // LETTER RA -"\ue031>\u0bb1;" // LETTER RRA -"\ue032>\u0bb2;" // LETTER LA -"\ue033\ue03c>\u0bb4;" -"\ue033>\u0bb3;" // LETTER LLA -"\ue034>\u0bb4;" // LETTER LLLA -"\ue035>\u0bb5;" // LETTER VA -"\ue036>\u0bb7;" // REMAP (indicExceptions.txt): \u0bb6>\u0bb7 = LETTER SHA>LETTER SSA -"\ue037>\u0bb7;" // LETTER SSA -"\ue038>\u0bb8;" // LETTER SA -"\ue039>\u0bb9;" // LETTER HA - -"\ue03c>;" // FALLBACK BLOW AWAY NUKTA -"\ue03d>;" // FALLBACK BLOW AWAY AVAGRAHA - -"\ue03e>\u0bbe;" // VOWEL SIGN AA -"\ue03f>\u0bbf;" // VOWEL SIGN I -"\ue040>\u0bc0;" // VOWEL SIGN II -"\ue041>\u0bc1;" // VOWEL SIGN U -"\ue042>\u0bc2;" // VOWEL SIGN UU -"\ue043>\u0bcd\u0bb0\u0bbf;" // REMAP (indicExceptions.txt): \u0bc3>\u0bcd\u0bb0\u0bbf = VOWEL SIGN VOCALIC R>SIGN VIRAMA.LETTER RA.VOWEL SIGN I -"\ue044>\u0bcd\u0bb0\u0bbf;" // REMAP (indicExceptions.txt): \u0bc4>\u0bcd\u0bb0\u0bbf = VOWEL SIGN VOCALIC RR>SIGN VIRAMA.LETTER RA.VOWEL SIGN I -"\ue045>\u0bbe;" // REMAP (indicExceptions.txt): \u0bc5>\u0bbe = VOWEL SIGN CANDRA E>VOWEL SIGN AA -"\ue046>\u0bc6;" // VOWEL SIGN E -"\ue047>\u0bc7;" // VOWEL SIGN EE -"\ue048>\u0bc8;" // VOWEL SIGN AI -"\ue049>\u0bbe;" // REMAP (indicExceptions.txt): \u0bc9>\u0bbe = VOWEL SIGN CANDRA O>VOWEL SIGN AA -"\ue04a>\u0bca;" // VOWEL SIGN O -"\ue04b>\u0bcb;" // VOWEL SIGN OO -"\ue04c>\u0bcc;" // VOWEL SIGN AU -"\ue04d>\u0bcd;" // SIGN VIRAMA -"\ue050>\u0b93\u0bae\u0bcd;" // REMAP (indicExceptions.txt): \u0bd0>\u0b93\u0bae\u0bcd = OM>LETTER OO.LETTER MA.SIGN VIRAMA -"\ue051>;" -"\ue052>;" -"\ue053>;" -"\ue054>;" -"\ue055>;" // UNMAPPED InterIndic-Tamil: LENGTH MARK -"\ue056>\u0bc8;" // REMAP (indicExceptions.txt): \u0bd6>\u0bc8 = AI LENGTH MARK>VOWEL SIGN AI -"\ue057>\u0bd7;" // AU LENGTH MARK -"\ue058>\u0b95;" // FALLBACK -"\ue059>\u0b95;" // REMAP (indicExceptions.txt): \u0bd9>\u0b95 = LETTER KHHA>LETTER KA -"\ue05a>\u0b95;" // REMAP (indicExceptions.txt): \u0bda>\u0b95 = LETTER GHHA>LETTER KA -"\ue05b>\u0b9c;" // REMAP (indicExceptions.txt): \u0bdb>\u0b9c = LETTER ZA>LETTER JA -"\ue05c>\u0ba4;" // FALLBACK -"\ue05d>\u0b9f;" // REMAP (indicExceptions.txt): \u0bdd>\u0b9f = LETTER RHA>LETTER TTA -"\ue05e>\u0baa;" // REMAP (indicExceptions.txt): \u0bde>\u0baa = LETTER FA>LETTER PA -"\ue05f>\u0baf;" // REMAP (indicExceptions.txt): \u0bdf>\u0baf = LETTER YYA>LETTER YA -"\ue060>\u0bb0\u0bbf;" // REMAP (indicExceptions.txt): \u0be0>\u0bb0\u0bbf = LETTER VOCALIC RR>LETTER RA.VOWEL SIGN I -"\ue061>\u0b88;" // REMAP (indicExceptions.txt): \u0be1>\u0b88 = LETTER VOCALIC LL>LETTER II -"\ue062>\u0bbf;"// FALLBACK VOWEL SIGN VOCALIC L -"\ue063>\u0bc0;"// FALLBACK VOWEL SIGN VOCALIC LL -"\ue064>'.' ;" // FALLBACK FOR DANDA -"\ue065>'.' ;" // FALLBACK FOR DOUBLE DANDA - -"\ue066>\u0030;" // FALLBACK DIGIT ZERO - -"\ue067\ue066\ue066\ue066>\u0bF2;" -"\ue067\ue066\ue066>\u0bf1;" -"\ue067\ue066>\u0bF0;" - -"\ue067>\u0be7;" // DIGIT ONE -"\ue068>\u0be8;" // DIGIT TWO -"\ue069>\u0be9;" // DIGIT THREE -"\ue06a>\u0bea;" // DIGIT FOUR -"\ue06b>\u0beb;" // DIGIT FIVE -"\ue06c>\u0bec;" // DIGIT SIX -"\ue06d>\u0bed;" // DIGIT SEVEN -"\ue06e>\u0bee;" // DIGIT EIGHT -"\ue06f>\u0bef;" // DIGIT NINE - -"1000 >\u0BF2;" // UNMAPPED Tamil-InterIndic: NUMBER ONE THOUSAND -"100 >\u0BF1;" // UNMAPPED Tamil-InterIndic: NUMBER ONE HUNDRED -"10 >\u0BF0;" // UNMAPPED Tamil-InterIndic: NUMBER TEN - - - -"\ue080>;" // UNMAPPED InterIndic-Tamil: ISSHAR -"\ue070>\u0BF0;" -"\ue071>\u0BF2;" -"\ue072>\u0BF1;" -"\ue073>;" -"\ue074>;" -"\ue075>;" -"\ue076>;" -"\ue077>;" -"\ue078>;" -"\ue079>;" -"\ue07A>;" -"\ue0f0 > \u0bb0;" // FALLBACK RA -"\ue0f1 > \u0bb0;" // FALLBACK RA -// :: NFC (NFD) ; -// eof - } -} diff --git a/icuSources/data/translit/t_InterIndic_Telu.txt b/icuSources/data/translit/t_InterIndic_Telu.txt deleted file mode 100644 index cd0e8ce9..00000000 --- a/icuSources/data/translit/t_InterIndic_Telu.txt +++ /dev/null @@ -1,153 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_InterIndic_Telugu.txt -// Date: Sat Jul 27 10:31:07 2002 -//-------------------------------------------------------------------- - -// InterIndic_Telugu - -t_InterIndic_Telu { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// InterIndic-Telugu -//:: NFD (NFC) ; -"\ue001>\u0c01;" // SIGN CANDRABINDU -"\ue002>\u0c02;" // SIGN ANUSVARA -"\ue003>\u0c03;" // SIGN VISARGA -"\ue005>\u0c05;" // LETTER A -"\ue006>\u0c06;" // LETTER AA -"\ue007>\u0c07;" // LETTER I -"\ue008>\u0c08;" // LETTER II -"\ue009>\u0c09;" // LETTER U -"\ue00a>\u0c0a;" // LETTER UU -"\ue00b>\u0c0b;" // LETTER VOCALIC R -"\ue00c>\u0c0c;" // LETTER VOCALIC L -"\ue00d>\u0c0E;" // FALLBACK MAPPING -"\ue00e>\u0c0E;" // LETTER E -"\ue00f>\u0c0f;" // LETTER EE -"\ue010>\u0c10;" // LETTER AI -"\ue011>\u0c12;" // FALBACK MAPPING -"\ue012>\u0c12;" // LETTER O -"\ue013>\u0c13;" // LETTER OO -"\ue014>\u0c14;" // LETTER AU -"\ue015>\u0c15;" // LETTER KA -"\ue016>\u0c16;" // LETTER KHA -"\ue017>\u0c17;" // LETTER GA -"\ue018>\u0c18;" // LETTER GHA -"\ue019>\u0c19;" // LETTER NGA -"\ue01a>\u0c1a;" // LETTER CA -"\ue01b>\u0c1b;" // LETTER CHA -"\ue01c>\u0c1c;" // LETTER JA -"\ue01d>\u0c1d;" // LETTER JHA -"\ue01e>\u0c1e;" // LETTER NYA -"\ue01f>\u0c1f;" // LETTER TTA -"\ue020>\u0c20;" // LETTER TTHA -"\ue021>\u0c21;" // LETTER DDA -"\ue022>\u0c22;" // LETTER DDHA -"\ue023>\u0c23;" // LETTER NNA -"\ue024>\u0c24;" // LETTER TA -"\ue025>\u0c25;" // LETTER THA -"\ue026>\u0c26;" // LETTER DA -"\ue027>\u0c27;" // LETTER DHA -"\ue028>\u0c28;" // LETTER NA -"\ue029>\u0c28;" // REMAP (indicExceptions.txt): \u0c29>\u0c28 = LETTER NNNA>LETTER NA -"\ue02a>\u0c2a;" // LETTER PA -"\ue02b>\u0c2b;" // LETTER PHA -"\ue02c>\u0c2c;" // LETTER BA -"\ue02d>\u0c2d;" // LETTER BHA -"\ue02e>\u0c2e;" // LETTER MA -"\ue02f>\u0c2f;" // LETTER YA -"\ue030\ue03c>\u0c31;" -"\ue030>\u0c30;" // LETTER RA -"\ue031>\u0c31;" // LETTER RRA -"\ue032>\u0c32;" // LETTER LA -"\ue033>\u0c33;" // LETTER LLA -"\ue034>\u0c33;" // REMAP (indicExceptions.txt): \u0c34>\u0c33 = LETTER LLLA>LETTER LLA -"\ue035>\u0c35;" // LETTER VA -"\ue036>\u0c36;" // LETTER SHA -"\ue037>\u0c37;" // LETTER SSA -"\ue038>\u0c38;" // LETTER SA -"\ue039>\u0c39;" // LETTER HA - -"\ue03c>;" // FALLBACK BLOW AWAY NUKTA -"\ue03d>;" // FALLBACK BLOW AWAY AVAGRAHA - -"\ue03e>\u0c3e;" // VOWEL SIGN AA -"\ue03f>\u0c3f;" // VOWEL SIGN I -"\ue040>\u0c40;" // VOWEL SIGN II -"\ue041>\u0c41;" // VOWEL SIGN U -"\ue042>\u0c42;" // VOWEL SIGN UU -"\ue043>\u0c43;" // VOWEL SIGN VOCALIC R -"\ue044>\u0c44;" // VOWEL SIGN VOCALIC RR -"\ue045>\u0c46;" // VOWEL SIGN CANDRA E>VOWEL SIGN E -"\ue047>\u0c47;" // VOWEL SIGN EE -"\ue048>\u0c48;" // VOWEL SIGN AI -"\ue049>\u0c4a;" // REMAP (indicExceptions.txt): \u0c49>\u0c4a = VOWEL SIGN CANDRA O>VOWEL SIGN O -"\ue04b>\u0c4b;" // VOWEL SIGN OO -"\ue04c>\u0c4c;" // VOWEL SIGN AU -"\ue04d>\u0c4d;" // SIGN VIRAMA -"\ue050>\u0c13\u0c02;" // REMAP (indicExceptions.txt): \u0c50>\u0c13\u0c02 = OM>LETTER OO.SIGN ANUSVARA -"\ue051>;" -"\ue052>;" -"\ue053>;" -"\ue054>;" -"\ue055>\u0c55;" // LENGTH MARK -"\ue056>\u0c56;" // AI LENGTH MARK -"\ue057>\u0c4c;" // REMAP (indicExceptions.txt): \u0c57>\u0c4c = AU LENGTH MARK>VOWEL SIGN AU -"\ue058>\u0c15;" // REMAP -"\ue059>\u0c16;" // REMAP (indicExceptions.txt): \u0c59>\u0c16 = LETTER KHHA>LETTER KHA -"\ue05a>\u0c17;" // REMAP (indicExceptions.txt): \u0c5a>\u0c17 = LETTER GHHA>LETTER GA -"\ue05b>\u0c1c;" // REMAP (indicExceptions.txt): \u0c5b>\u0c1c = LETTER ZA>LETTER JA -"\ue05c>\u0c22;" // REMAP -"\ue05d>\u0c22;" // REMAP (indicExceptions.txt): \u0c5d>\u0c22 = LETTER RHA>LETTER DDHA -"\ue05e>\u0c2b;" // REMAP (indicExceptions.txt): \u0c5e>\u0c2b = LETTER FA>LETTER PHA -"\ue05f>\u0c2f;" // REMAP (indicExceptions.txt): \u0c5f>\u0c2f = LETTER YYA>LETTER YA -"\ue060>\u0c60;" // LETTER VOCALIC RR -"\ue061>\u0c61;" // LETTER VOCALIC LL -"\ue062>\u0c3f;" // REMAP (indicExceptions.txt): \u0c62>\u0c3f = VOWEL SIGN VOCALIC L>VOWEL SIGN I -"\ue063>\u0c40;" // REMAP (indicExceptions.txt): \u0c63>\u0c40 = VOWEL SIGN VOCALIC LL>VOWEL SIGN II -"\ue064>'.' ;" // FALLBACK FOR DANDA -"\ue065>'.' ;" // FALLBACK FOR DOUBLE DANDA -"\ue066>\u0c66;" // DIGIT ZERO -"\ue067>\u0c67;" // DIGIT ONE -"\ue068>\u0c68;" // DIGIT TWO -"\ue069>\u0c69;" // DIGIT THREE -"\ue06a>\u0c6a;" // DIGIT FOUR -"\ue06b>\u0c6b;" // DIGIT FIVE -"\ue06c>\u0c6c;" // DIGIT SIX -"\ue06d>\u0c6d;" // DIGIT SEVEN -"\ue06e>\u0c6e;" // DIGIT EIGHT -"\ue06f>\u0c6f;" // DIGIT NINE -// \ue080>; # UNMAPPED InterIndic-Telugu: ISSHAR - - -"\ue046>\u0c46;" // VOWEL SIGN E -"\ue04a>\u0c4a;" // VOWEL SIGN O -"\ue070>;" -"\ue071>;" -"\ue072>;" -"\ue073>;" -"\ue074>;" -"\ue075>;" -"\ue076>;" -"\ue077>;" -"\ue078>;" -"\ue079>;" -"\ue07A>;" - -"0 > \u0c66;" // FALLBACK FOR TAMIL -"1 > \u0c67;" -"\ue0f0 > \u0c30;" // FALLBACK RA -"\ue0f1 > \u0c30;" // FALLBACK RA -// :: NFC (NFD) ; -// eof - } -} diff --git a/icuSources/data/translit/t_Knda_InterIndic.txt b/icuSources/data/translit/t_Knda_InterIndic.txt deleted file mode 100644 index a7fb4cfa..00000000 --- a/icuSources/data/translit/t_Knda_InterIndic.txt +++ /dev/null @@ -1,106 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_Kannada_InterIndic.txt -// Date: Sat Jul 27 10:31:07 2002 -//-------------------------------------------------------------------- - -// Kannada_InterIndic - -t_Knda_InterIndic { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// Kannada-InterIndic -"\u0CC6\u0CD5>\uE047;" // VOWEL SIGN EE -"\u0CC6\u0CCD\u0CD6>\uE048\ue04d;" // VOWEL SIGN AI -"\u0CC6\u0CD6>\uE048;" // VOWEL SIGN AI -"\u0CC6\u0CC2\u0CD5>\uE04B;" // VOWEL SIGN OO -"\u0CC6\u0CC2>\uE04A;" // VOWEL SIGN O -"\u0CBF\u0CD5>\uE040;" // VOWEL SIGN II - -"\u0C82>\uE002;" // SIGN ANUSVARA -"\u0C83>\uE003;" // SIGN VISARGA -"\u0C85>\uE005;" // LETTER A -"\u0C86>\uE006;" // LETTER AA -"\u0C87>\uE007;" // LETTER I -"\u0C88>\uE008;" // LETTER II -"\u0C89>\uE009;" // LETTER U -"\u0C8A>\uE00A;" // LETTER UU -"\u0C8B>\uE00B;" // LETTER VOCALIC R -"\u0C8C>\uE00C;" // LETTER VOCALIC L -"\u0C8E>\uE00E;" // LETTER E -"\u0C8F>\uE00F;" // LETTER EE -"\u0C90>\uE010;" // LETTER AI -"\u0C92>\uE012;" // LETTER O -"\u0C93>\uE013;" // LETTER OO -"\u0C94>\uE014;" // LETTER AU -"\u0C95>\uE015;" // LETTER KA -"\u0C96>\uE016;" // LETTER KHA -"\u0C97>\uE017;" // LETTER GA -"\u0C98>\uE018;" // LETTER GHA -"\u0C99>\uE019;" // LETTER NGA -"\u0C9A>\uE01A;" // LETTER CA -"\u0C9B>\uE01B;" // LETTER CHA -"\u0C9C>\uE01C;" // LETTER JA -"\u0C9D>\uE01D;" // LETTER JHA -"\u0C9E>\uE01E;" // LETTER NYA -"\u0C9F>\uE01F;" // LETTER TTA -"\u0CA0>\uE020;" // LETTER TTHA -"\u0CA1>\uE021;" // LETTER DDA -"\u0CA2>\uE022;" // LETTER DDHA -"\u0CA3>\uE023;" // LETTER NNA -"\u0CA4>\uE024;" // LETTER TA -"\u0CA5>\uE025;" // LETTER THA -"\u0CA6>\uE026;" // LETTER DA -"\u0CA7>\uE027;" // LETTER DHA -"\u0CA8>\uE028;" // LETTER NA -"\u0CAA>\uE02A;" // LETTER PA -"\u0CAB>\uE02B;" // LETTER PHA -"\u0CAC>\uE02C;" // LETTER BA -"\u0CAD>\uE02D;" // LETTER BHA -"\u0CAE>\uE02E;" // LETTER MA -"\u0CAF>\uE02F;" // LETTER YA -"\u0CB0>\uE030;" // LETTER RA -"\u0CB1>\uE031;" // LETTER RRA -"\u0CB2>\uE032;" // LETTER LA -"\u0CB3>\uE033;" // LETTER LLA -"\u0CB5>\uE035;" // LETTER VA -"\u0CB6>\uE036;" // LETTER SHA -"\u0CB7>\uE037;" // LETTER SSA -"\u0CB8>\uE038;" // LETTER SA -"\u0CB9>\uE039;" // LETTER HA -"\u0CBE>\uE03E;" // VOWEL SIGN AA -"\u0CBF>\uE03F;" // VOWEL SIGN I -"\u0CC1>\uE041;" // VOWEL SIGN U -"\u0CC2>\uE042;" // VOWEL SIGN UU -"\u0CC3>\uE043;" // VOWEL SIGN VOCALIC R -"\u0CC4>\uE044;" // VOWEL SIGN VOCALIC RR -"\u0CC6>\uE046;" // VOWEL SIGN E -"\u0CCC>\uE04C;" // VOWEL SIGN AU -"\u0CCD>\uE04D;" // SIGN VIRAMA -"\u0CD5>\uE055;" // LENGTH MARK -"\u0CD6>\uE056;" // AI LENGTH MARK -"\u0CDE>\uE05E;" // LETTER FA -"\u0CE0>\uE060;" // LETTER VOCALIC RR -"\u0CE1>\uE061;" // LETTER VOCALIC LL -"\u0CE6>\uE066;" // DIGIT ZERO -"\u0CE7>\uE067;" // DIGIT ONE -"\u0CE8>\uE068;" // DIGIT TWO -"\u0CE9>\uE069;" // DIGIT THREE -"\u0CEA>\uE06A;" // DIGIT FOUR -"\u0CEB>\uE06B;" // DIGIT FIVE -"\u0CEC>\uE06C;" // DIGIT SIX -"\u0CED>\uE06D;" // DIGIT SEVEN -"\u0CEE>\uE06E;" // DIGIT EIGHT -"\u0CEF>\uE06F;" // DIGIT NINE - -// eof - } -} diff --git a/icuSources/data/translit/t_Latn_InterIndic.txt b/icuSources/data/translit/t_Latn_InterIndic.txt deleted file mode 100644 index bf9cef1f..00000000 --- a/icuSources/data/translit/t_Latn_InterIndic.txt +++ /dev/null @@ -1,397 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_Latin_InterIndic.txt -// Date: Sat Jul 27 10:31:07 2002 -//-------------------------------------------------------------------- - -// Latin_InterIndic - -t_Latn_InterIndic { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// Latin-InterIndic - //:: NFD; - //\u0e00 reserved - //consonants - "$chandrabindu=\ue001;" - "$anusvara=\ue002;" - "$visarga=\ue003;" - //\u0e004 reserved - // w represents the stand-alone form - "$wa=\ue005;" - "$waa=\ue006;" - "$wi=\ue007;" - "$wii=\ue008;" - "$wu=\ue009;" - "$wuu=\ue00a;" - "$wr=\ue00b;" - "$wl=\ue00c;" - "$wce=\ue00d;" // LETTER CANDRA E - "$wse=\ue00e;" // LETTER SHORT E - "$we=\ue00f;" // \u090f LETTER E - "$wai=\ue010;" - "$wco=\ue011;" // LETTER CANDRA O - "$wso=\ue012;" // LETTER SHORT O - "$wo=\ue013;" // \u0913 LETTER O - "$wau=\ue014;" - "$ka=\ue015;" - "$kha=\ue016;" - "$ga=\ue017;" - "$gha=\ue018;" - "$nga=\ue019;" - "$ca=\ue01a;" - "$cha=\ue01b;" - "$ja=\ue01c;" - "$jha=\ue01d;" - "$nya=\ue01e;" - "$tta=\ue01f;" - "$ttha=\ue020;" - "$dda=\ue021;" - "$ddha=\ue022;" - "$nna=\ue023;" - "$ta=\ue024;" - "$tha=\ue025;" - "$da=\ue026;" - "$dha=\ue027;" - "$na=\ue028;" - "$ena=\ue029;" //compatibility - "$pa=\ue02a;" - "$pha=\ue02b;" - "$ba=\ue02c;" - "$bha=\ue02d;" - "$ma=\ue02e;" - "$ya=\ue02f;" - "$ra=\ue030;" - "$rra=\ue031;" - "$la=\ue032;" - "$lla=\ue033;" - "$ela=\ue034;" //compatibility - "$va=\ue035;" - "$sha=\ue036;" - "$ssa=\ue037;" - "$sa=\ue038;" - "$ha=\ue039;" -//\u093a Reserved -//\u093b Reserved - "$nukta=\ue03c;" - "$avagraha=\ue03d;" // SIGN AVAGRAHA - // represents the dependent form - "$aa=\ue03e;" - "$i=\ue03f;" - "$ii=\ue040;" - "$u=\ue041;" - "$uu=\ue042;" - "$rh=\ue043;" - "$lh=\ue044;" - "$ce=\ue045;" //VOWEL SIGN CANDRA E - "$se=\ue046;" //VOWEL SIGN SHORT E - "$e=\ue047;" - "$ai=\ue048;" - "$co=\ue049;" // VOWEL SIGN CANDRA O - "$so=\ue04a;" // VOWEL SIGN SHORT O - "$o=\ue04b;" // \u094b - "$au=\ue04c;" - "$virama=\ue04d;" -// \u094e Reserved -// \u094f Reserved - "$om = \ue050;" // OM -// \u0951>; # UNMAPPED STRESS SIGN UDATTA -// \u0952>; # UNMAPPED STRESS SIGN ANUDATTA -// \u0953>; # UNMAPPED GRAVE ACCENT -// \u0954>; # UNMAPPED ACUTE ACCENT - "$lm = \ue055;"// Telugu Length Mark - "$ailm=\ue056;"// AI Length Mark - "$aulm=\ue057;"// AU Length Mark - //urdu compatibity forms - "$uka=\ue058;" - "$ukha=\ue059;" - "$ugha=\ue05a;" - "$ujha=\ue05b;" - "$uddha=\ue05c;" - "$udha=\ue05d;" - "$ufa=\ue05e;" - "$uya=\ue05f;" - "$wrr=\ue060;" - "$wll=\ue061;" - "$rrh=\ue062;" - "$llh=\ue063;" - "$danda=\ue064;" - "$doubleDanda=\ue065;" - "$zero=\ue066;" // DIGIT ZERO - "$one=\ue067;" // DIGIT ONE - "$two=\ue068;" // DIGIT TWO - "$three=\ue069;" // DIGIT THREE - "$four=\ue06a;" // DIGIT FOUR - "$five=\ue06b;" // DIGIT FIVE - "$six=\ue06c;" // DIGIT SIX - "$seven=\ue06d;" // DIGIT SEVEN - "$eight=\ue06e;" // DIGIT EIGHT - "$nine=\ue06f;" // DIGIT NINE - // For all other scripts - "$ecp0=\ue070;" - "$ecp1=\ue071;" - "$ecp2=\ue072;" - "$ecp3=\ue073;" - "$ecp4=\ue074;" - "$ecp5=\ue075;" - "$ecp6=\ue076;" - "$ecp7=\ue077;" - "$ecp8=\ue078;" - "$ecp9=\ue079;" - "$ecpA=\ue07a;" - "$ecpB=\ue07b;" - "$ecpC=\ue07c;" - "$ecpD=\ue07d;" - "$ecpE=\ue07e;" - "$ecpF=\ue07f;" -// \u0970>; # UNMAPPED ABBREVIATION SIGN - "$depVowelAbove=[\ue03e-\ue040\ue045-\ue04c];" - "$depVowelBelow=[\ue041-\ue044];" - "$endThing=[$danda$doubleDanda];" - // $x was originally called '&'; $z was '%' - "$x=[$virama$aa$ai$au$ii$i$uu$u$rrh$rh$lh$e$o$se$ce$so$co];" - "$z=[bcdfghjklmnpqrstvwxyz];" - "$consonants=[[$ka-$ha]$z[\u0915-\u0939][\u0995-\u09b9][\u0a15-\u0a39][\u0a95-\u0ab9][\u0b15-\u0b39][\u0b95-\u0bb9][\u0c15-\u0c39][\u0c95-\u0cb9][\u0d15-\u0d39]];" - "\u0315 > $avagraha;" - "\u0303>$chandrabindu$anusvara;" - "m\u0310>$chandrabindu;" - "h\u0323>$visarga;" - "x>$ka$virama$sa;" -// convert to independent forms at start of word or syllable: -// dependent forms for roundtrip - "\u0314a\u0304>$aa;" - "\u0314ai>$ai;" - "\u0314au>$au;" - "\u0314ii>$ii;" - "\u0314i\u0304>$ii;" - "\u0314i>$i;" - "\u0314u\u0304>$uu;" - "\u0314u>$u;" - "\u0314r\u0325\u0304>$rrh;" - "\u0314r\u0325>$rh;" - "\u0314l\u0325\u0304>$llh;" - "\u0314lh>$lh;" - "\u0314l\u0325>$lh;" - "\u0314e\u0304>$e;" - "\u0314o\u0304>$o;" - "\u0314a>;" - "\u0314e\u0306>$ce;" - "\u0314o\u0306>$co;" - "\u0314e>$se;" - "\u0314o>$so;" - -// preceeded by consonants - "$consonants{ a\u0304>$aa;" - "$consonants{ ai>$ai;" - "$consonants{ au>$au;" - "$consonants{ ii>$ii;" - "$consonants{ i\u0304>$ii;" - "$consonants{ i>$i;" - "$consonants{ u\u0304>$uu;" - "$consonants{ u>$u;" - "$consonants{ r\u0325\u0304>$rrh;" - "$consonants{ r\u0325a>$rh;" - "$consonants{ r\u0325>$rh;" - "$consonants{ l\u0325\u0304>$llh;" - "$consonants{ lh>$lh;" - "$consonants{ l\u0325>$lh;" - "$consonants{ e\u0304>$e;" - "$consonants{ o\u0304>$o;" - "$consonants{ e\u0306>$ce;" - "$consonants{ o\u0306>$co;" - "$consonants{ e>$se;" - "$consonants{ o>$so;" - -// e.g. keai -> {ka}{e}{wai}; k'ai -> {ka}{wai}; (ai) -> ({wai}) - "a\u0304>$waa;" - "ai>$wai;" - "au>$wau;" - "i\u0304>$wii;" - "i>$wi;" - "u\u0304>$wuu;" - "u>$wu;" - "r\u0325\u0304>$wrr;" - "r\u0325>$wr;" - "l\u0325\u0304>$wll;" - "lh>$wl;" - "l\u0325>$wl;" - "e\u0304>$we;" - "o\u0304>$wo;" - "a>$wa;" - "e\u0306>$wce;" - "o\u0306>$wco;" - "e>$wse;" - "''om>$om;" - "o>$wso;" - - // rules for anusvara - "n}r\u0325 > $na|$virama;" - "n}l\u0325 > $na|$virama;" - "n}na > $na|$virama;" - "n\u0307}[kg] > $anusvara;" - "n\u0307}n\u0307 > $anusvara;" - "n\u0304}[cj] > $anusvara;" - "n\u0304}n\u0303 > $anusvara;" - "n\u0323}[tdn]\u0323 > $anusvara;" - "n}[tdn] > $anusvara;" - "m}[pbm] > $anusvara;" - "n}[ylvshr] > $anusvara;" - "m\u0307 > $anusvara;" - - //urdu compatibility - "q>$uka|$virama;" - "k\u0331h\u0331>$ukha |$virama;" - "g\u0307> $ugha | $virama;" - "z > $ujha |$virama;" - "f > $ufa|$virama;" - - // dev - "y\u0307>$uya|$virama;" - "l\u0331>$ela|$virama;" - "n\u0331>$ena|$virama;" - "n\u0307>$nga|$virama;" - "n\u0303>$nya|$virama;" - "n\u0323>$nna|$virama;" - "t\u0323h>$ttha|$virama;" - "t\u0323>$tta|$virama;" - "r\u0323h>$udha|$virama;" - "r\u0323>$uddha|$virama;" - "d\u0323h>$ddha|$virama;" - "d\u0323>$dda|$virama;" - "kh>$kha|$virama;" - "k>$ka|$virama;" - "gh>$gha|$virama;" - "g>$ga|$virama;" - "ch>$cha|$virama;" - "c>$ca|$virama;" - "jh>$jha|$virama;" - "j>$ja|$virama;" - "ny>$nya|$virama;" - "tth>$ttha|$virama;" - "ddh>$ddha|$virama;" - "th>$tha|$virama;" - "t>$ta|$virama;" - "dh>$dha|$virama;" - "d>$da|$virama;" - "n>$na|$virama;" - "ph>$pha|$virama;" - "p>$pa|$virama;" - "bh>$bha|$virama;" - "b>$ba|$virama;" - "m>$ma|$virama;" - "y>$ya|$virama;" - "r\u0331>$rra|$virama;" - "r>$ra|$virama;" - "l\u0323>$lla|$virama;" - "l>$la|$virama;" - "v>$va|$virama;" - "w>$va|$virama;" - "sh>$sha|$virama;" - "ss>$ssa|$virama;" - "s\u0323>$ssa|$virama;" - "s\u0301>$sha|$virama;" - "s>$sa|$virama;" - "h>$ha|$virama;" - "'.'>$danda;" - "$danda'.'>$doubleDanda;" - "$depVowelAbove{'~'>$anusvara;" - "$depVowelBelow{'~'>$chandrabindu;" -// convert to dependent forms after consonant with no vowel: -// e.g. kai -> {ka}{virama}ai -> {ka}{ai} - //$virama aa>$aa; - "$virama a\u0304>$aa;" - "$virama ai>$ai;" - "$virama au>$au;" - "$virama ii>$ii;" - "$virama i\u0304>$ii;" - "$virama i>$i;" - //$virama uu>$uu; - "$virama u\u0304>$uu;" - "$virama u>$u;" - //$virama rrh>$rrh; - "$virama r\u0325\u0304>$rrh;" - //$virama rh>$rh; - "$virama r\u0325a>$rh;" - "$virama r\u0325>$rh;" - "$virama l\u0325\u0304>$llh;" - "$virama lh>$lh;" - "$virama l\u0325>$lh;" - "$virama e\u0304>$e;" - "$virama o\u0304>$o;" - "$virama a>;" - "$virama e\u0306>$ce;" - "$virama o\u0306>$co;" - "$virama e>$se;" - "$virama o>$so;" - - -// otherwise convert independent forms when separated by ': k'ai -> {ka}{virama}{wai} - //$virama''aa>$waa; - "$virama''a\u0304>$waa;" - "$virama''ai>$wai;" - "$virama''au>$wau;" - //$virama''ii>$wii; - "$virama''i\u0304>$wii;" - "$virama''i>$wi;" - //$virama''uu>$wuu; - "$virama''u\u0304>$wuu;" - "$virama''u>$wu;" - //$virama''rrh>$wrr; - "$virama''r\u0325\u0304>$wrr;" - //$virama''rh>$wr; - "$virama''r\u0325>$wr;" - "$virama''l\u0325\u0304>$wll;" - //$virama''lh>$wl; - "$virama''l\u0325>$wl;" - "$virama''e\u0304>$we;" - "$virama''o\u0304>$wo;" - "$virama''a>$wa;" - "$virama''e\u0306>$wce;" - "$virama''o\u0306>$wco;" - "$virama''e>$wse;" - "$virama''o>$wso;" -// no virama - "''a\u0304>$waa;" - "''ai>$wai;" - "''au>$wau;" - "''i\u0304>$wii;" - "''i>$wi;" - "''u\u0304>$wuu;" - "''u>$wu;" - "''r\u0325\u0304>$wrr;" - "''r\u0325>$wr;" - "''l\u0325\u0304>$wll;" - "''l\u0325>$wl;" - "''e\u0304>$we;" - "''o\u0304>$wo;" - "''a>$wa;" - "''e\u0306>$wce;" - "''o\u0306>$wco;" - "''e>$wse;" - "''o>$wso;" - - "$virama } [$z] > $virama;" - "$virama } ' ' > $virama ;" - "$virama}$endThing>;" - "0>$zero;" - "1>$one;" - "2>$two;" - "3>$three;" - "4>$four;" - "5>$five;" - "6>$six;" - "7>$seven;" - "8>$eight;" - "9>$nine;" - "''>;" - //:: NFC (NFD) ; - } -} diff --git a/icuSources/data/translit/t_Latn_Jamo.txt b/icuSources/data/translit/t_Latn_Jamo.txt deleted file mode 100644 index 949665ad..00000000 --- a/icuSources/data/translit/t_Latn_Jamo.txt +++ /dev/null @@ -1,538 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_Latin_Jamo.txt -// Date: Sat Jul 27 10:31:07 2002 -//-------------------------------------------------------------------- - -// Latin_Jamo - -t_Latn_Jamo { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -//- N.B. DO NOT put any filters, NFD, etc. here -- those are aliased in -//- the INDEX file. This transliterator is, by itself, not -//- instantiated. It is used as a part of Latin-Jamo, Latin-Hangul, or -//- inverses thereof. - -// Transliteration from Latin characters to Korean script is done in -// two steps: Latin to Jamo, then Jamo to Hangul. The Jamo-Hangul -// transliteration is done algorithmically following Unicode 3.0 -// section 3.11. This file implements the Latin to Jamo -// transliteration using rules. - -// Jamo occupy the block 1100-11FF. Within this block there are three -// groups of characters: initial consonants or choseong (I), medial -// vowels or jungseong (M), and trailing consonants or jongseong (F). -// Standard Korean syllables are of the form I+M+F*. - -// Section 3.11 describes the use of 'filler' jamo to convert -// nonstandard syllables to standard form: the choseong filler 115F and -// the junseong filler 1160. In this transliterator, we will not use -// 115F or 1160. - -// We will, however, insert two 'null' jamo to make foreign words -// conform to Korean syllable structure. These are the null initial -// consonant 110B (IEUNG) and the null vowel 1173 (EU). In Latin text, -// we will use the separator in order to disambiguate strings, -// e.g. "kan-ggan" (initial GG) vs. "kanggan" (final NG + initial G). - -// We will not use all of the characters in the jamo block. We will -// only use the 19 initials, 21 medials, and 27 finals possessing a -// jamo short name as defined in section 4.4 of the Unicode book. - -// Rules of thumb. These guidelines provide the basic framework -// for the rules. They are phrased in terms of Latin-Jamo transliteration. -// The Jamo-Latin rules derive from these, since the Jamo-Latin rules are -// just context-free transliteration of jamo to corresponding short names, -// with the addition of separators to maintain round-trip integrity -// in the context of the Latin-Jamo rules. - -// A sequence of vowels: -// - Take the longest sequence you can. If there are too many, or you don't -// have a starting consonant, introduce a 110B necessary. - -// A sequence of consonants. -// - First join the double consonants: G + G -> GG -// - In the remaining list, -// -- If there is no preceding vowel, take the first consonant, and insert EU -// after it. Continue with the rest of the consonants. -// -- If there is one consonant, attach to the following vowel -// -- If there are two consonants and a following vowel, attach one to the -// preceeding vowel, and one to the following vowel. -// -- If there are more than two consonants, join the first two together if you -// can: L + G => LG -// -- If you still end up with more than 2 consonants, insert EU after the -// first one, and continue with the rest of the consonants. - -//---------------------------------------------------------------------- -// Variables - -// Some latin consonants or consonant pairs only occur as initials, and -// some only as finals, but some occur as both. This makes some jamo -// consonants ambiguous when transliterated into latin. -// Initial only: IEUNG BB DD JJ R -// Final only: BS GS L LB LG LH LM LP LS LT NG NH NJ -// Initial and Final: B C D G GG H J K M N P S SS T - - "$Gi = \u1100;" - "$GGi = \u1101;" - "$Ni = \u1102;" - "$Di = \u1103;" - "$DD = \u1104;" - "$R = \u1105;" - "$Mi = \u1106;" - "$Bi = \u1107;" - "$BB = \u1108;" - "$Si = \u1109;" - "$SSi = \u110A;" - "$IEUNG = \u110B;" // null initial, inserted during Latin-Jamo - "$Ji = \u110C;" - "$JJ = \u110D;" - "$Ci = \u110E;" - "$Ki = \u110F;" - "$Ti = \u1110;" - "$Pi = \u1111;" - "$Hi = \u1112;" - - "$A = \u1161;" - "$AE = \u1162;" - "$YA = \u1163;" - "$YAE = \u1164;" - "$EO = \u1165;" - "$E = \u1166;" - "$YEO = \u1167;" - "$YE = \u1168;" - "$O = \u1169;" - "$WA = \u116A;" - "$WAE = \u116B;" - "$OE = \u116C;" - "$YO = \u116D;" - "$U = \u116E;" - "$WEO = \u116F;" - "$WE = \u1170;" - "$WI = \u1171;" - "$YU = \u1172;" - "$EU = \u1173;" // null medial, inserted during Latin-Jamo - "$YI = \u1174;" - "$I = \u1175;" - - "$Gf = \u11A8;" - "$GGf = \u11A9;" - "$GS = \u11AA;" - "$Nf = \u11AB;" - "$NJ = \u11AC;" - "$NH = \u11AD;" - "$Df = \u11AE;" - "$L = \u11AF;" - "$LG = \u11B0;" - "$LM = \u11B1;" - "$LB = \u11B2;" - "$LS = \u11B3;" - "$LT = \u11B4;" - "$LP = \u11B5;" - "$LH = \u11B6;" - "$Mf = \u11B7;" - "$Bf = \u11B8;" - "$BS = \u11B9;" - "$Sf = \u11BA;" - "$SSf = \u11BB;" - "$NG = \u11BC;" - "$Jf = \u11BD;" - "$Cf = \u11BE;" - "$Kf = \u11BF;" - "$Tf = \u11C0;" - "$Pf = \u11C1;" - "$Hf = \u11C2;" - - "$jamoInitial = [\u1100-\u1112];" - - "$jamoMedial = [\u1161-\u1175];" - - "$latinInitial = [bcdghjkmnprst];" - - // Any character in the latin transliteration of a medial - "$latinMedial = [aeiouwy];" - - // The last character of the latin transliteration of a medial - "$latinMedialEnd = [aeiou];" - - // Disambiguation separator - "$sep = \\\';" - -//---------------------------------------------------------------------- -// Jamo-Latin - -// Jamo to latin is relatively simple, since it is the latin that is -// ambiguous. Most rules are straightforward, and we encode them below -// as simple add-on back rule, e.g.: - -// $jamoMedial {bs} > $BS; - -// becomes - -// $jamoMedial {bs} <> $BS; - -// Furthermore, we don't care about the ordering for Jamo-Latin because -// we are going from single characters, so we can very easily piggyback -// on the Latin-Jamo. - -// The main issue with Jamo-Latin is when to insert separators. -// Separators are inserted to obtain correct round trip behavior. For -// example, the sequence Ki A Gf Gi E, if transliterated to "kagge", -// would then round trip to Ki A GGi E. To prevent this, we insert a -// separator: "kag-ge". IMPORTANT: The need for separators depends -// very specifically on the behavior of the Latin-Jamo rules. A change -// in the Latin-Jamo behavior can completely change the way the -// separator insertion must be done. - -// First try to preserve actual separators in the jamo text by doubling -// them. This fixes problems like: -// (Di)(A)(Ji)(U)(NG)-(IEUNG)(YEO)(Nf)(Gi)(YEO)(L) => dajung-yeongyeol -// => (Di)(A)(Ji)(U)(NG)(IEUNG)(YEO)(Nf)(Gi)(YEO)(L). This is optional -// -- if we don't care about losing separators in the jamo, we can delete -// this rule. - - "$sep $sep <> $sep;" - -// Triple consonants. For three consonants "axxx" we insert a -// separator between the first and second "x" if XXf, Xf, and Xi all -// exist, and we have A Xf XXi. This prevents the reverse -// transliteration to A XXf Xi. - - "$sep < $latinMedialEnd g {} $GGi;" - "$sep < $latinMedialEnd s {} $SSi;" - -// For vowels the rule is similar. If there is a vowel "ae" such that -// "a" by itself and "e" by itself are vowels, then we want to map A E -// to "a-e" so as not to round trip to AE. However, in the text Ki EO -// IEUNG E we don't need to map to "keo-e". "keoe" suffices. For -// vowels of the form "aei", both "ae" + "i" and "a" + "ei" must be -// tested. NOTE: These rules used to have a left context of -// $latinInitial instead of [^$latinMedial]. The problem with this is -// sequences where an initial IEUNG is transliterated away: -// (IEUNG)(A)(IEUNG)(EO) => aeo => (IEUNG)(AE)(IEUNG)(O) - - "$sep < [^$latinMedial] [y w] e {} [$O $OE];" - "$sep < [^$latinMedial] e {} [$O $OE $U];" - "$sep < [^$latinMedial] [o a] {} [$E $EO $EU];" - "$sep < [^$latinMedial] [w y] a {} [$E $EO $EU];" - -// Similar to the above, but with an intervening $IEUNG. - - "$sep < [^$latinMedial] [y w] e {} $IEUNG [$O $OE];" - "$sep < [^$latinMedial] e {} $IEUNG [$O $OE $U];" - "$sep < [^$latinMedial] [o a] {} $IEUNG [$E $EO $EU];" - "$sep < [^$latinMedial] [w y] a {} $IEUNG [$E $EO $EU];" - -// Single finals followed by IEUNG. The jamo sequence A Xf IEUNG E, -// where Xi also exists, must be transliterated as "ax-e" to prevent -// the round trip conversion to A Xi E. - - "$sep < $latinMedialEnd b {} $IEUNG $jamoMedial;" - "$sep < $latinMedialEnd c {} $IEUNG $jamoMedial;" - "$sep < $latinMedialEnd d {} $IEUNG $jamoMedial;" - "$sep < $latinMedialEnd g {} $IEUNG $jamoMedial;" - "$sep < $latinMedialEnd h {} $IEUNG $jamoMedial;" - "$sep < $latinMedialEnd j {} $IEUNG $jamoMedial;" - "$sep < $latinMedialEnd k {} $IEUNG $jamoMedial;" - "$sep < $latinMedialEnd m {} $IEUNG $jamoMedial;" - "$sep < $latinMedialEnd n {} $IEUNG $jamoMedial;" - "$sep < $latinMedialEnd p {} $IEUNG $jamoMedial;" - "$sep < $latinMedialEnd s {} $IEUNG $jamoMedial;" - "$sep < $latinMedialEnd t {} $IEUNG $jamoMedial;" - -// Double finals followed by IEUNG. Similar to the single finals -// followed by IEUNG. Any latin consonant pair X Y, between medials, -// that we would split by Latin-Jamo, we must handle when it occurs as -// part of A XYf IEUNG E, to prevent round trip conversion to A Xf Yi -// E. - - "$sep < $latinMedialEnd b s {} $IEUNG $jamoMedial;" - "$sep < $latinMedialEnd g g {} $IEUNG $jamoMedial;" - "$sep < $latinMedialEnd g s {} $IEUNG $jamoMedial;" - "$sep < $latinMedialEnd l b {} $IEUNG $jamoMedial;" - "$sep < $latinMedialEnd l g {} $IEUNG $jamoMedial;" - "$sep < $latinMedialEnd l h {} $IEUNG $jamoMedial;" - "$sep < $latinMedialEnd l m {} $IEUNG $jamoMedial;" - "$sep < $latinMedialEnd l p {} $IEUNG $jamoMedial;" - "$sep < $latinMedialEnd l s {} $IEUNG $jamoMedial;" - "$sep < $latinMedialEnd l t {} $IEUNG $jamoMedial;" - "$sep < $latinMedialEnd n g {} $IEUNG $jamoMedial;" - "$sep < $latinMedialEnd n h {} $IEUNG $jamoMedial;" - "$sep < $latinMedialEnd n j {} $IEUNG $jamoMedial;" - "$sep < $latinMedialEnd s s {} $IEUNG $jamoMedial;" - -// Split doubles. Text of the form A Xi Xf E, where XXi also occurs, -// we transliterate as "ax-xe" to prevent round trip transliteration as -// A XXi E. - - "$sep < $latinMedialEnd b {} $Bi $jamoMedial;" - "$sep < $latinMedialEnd d {} $Di $jamoMedial;" - "$sep < $latinMedialEnd j {} $Ji $jamoMedial;" - "$sep < $latinMedialEnd g {} $Gi $jamoMedial;" - "$sep < $latinMedialEnd s {} $Si $jamoMedial;" - -// XYY. This corresponds to the XYY rule in Latin-Jamo. By default -// Latin-Jamo maps "xyy" to Xf YYi, to keep YY together. As a result, -// "xyy" forms that correspond to XYf Yi must be transliterated as -// "xy-y". - - "$sep < $latinMedialEnd b s {} [$Si $SSi];" - "$sep < $latinMedialEnd g s {} [$Si $SSi];" - "$sep < $latinMedialEnd l b {} [$Bi $BB];" - "$sep < $latinMedialEnd l g {} [$Gi $GGi];" - "$sep < $latinMedialEnd l s {} [$Si $SSi];" - "$sep < $latinMedialEnd n g {} [$Gi $GGi];" - "$sep < $latinMedialEnd n j {} [$Ji $JJ];" - -// Deletion of IEUNG is handled below. - -//---------------------------------------------------------------------- -// Latin-Jamo - -// [Basic, context-free Jamo-Latin rules are embedded here too. See -// above.] - -// Split digraphs: Text of the form 'axye', where 'xy' is a final -// digraph, 'x' is a final (by itself), 'y' is an initial, and 'a' and -// 'e' are medials, we want to transliterate this as A Xf Yi E rather -// than A XYf IEUNG E. We do NOT include text of the form "axxe", -// since that is handled differently below. These rules are generated -// programmatically from the jamo data. - - "$jamoMedial {b s} $latinMedial > $Bf $Si;" - "$jamoMedial {g s} $latinMedial > $Gf $Si;" - "$jamoMedial {l b} $latinMedial > $L $Bi;" - "$jamoMedial {l g} $latinMedial > $L $Gi;" - "$jamoMedial {l h} $latinMedial > $L $Hi;" - "$jamoMedial {l m} $latinMedial > $L $Mi;" - "$jamoMedial {l p} $latinMedial > $L $Pi;" - "$jamoMedial {l s} $latinMedial > $L $Si;" - "$jamoMedial {l t} $latinMedial > $L $Ti;" - "$jamoMedial {n g} $latinMedial > $Nf $Gi;" - "$jamoMedial {n h} $latinMedial > $Nf $Hi;" - "$jamoMedial {n j} $latinMedial > $Nf $Ji;" - -// Single consonants are initials: Text of the form 'axe', where 'x' -// can be an initial or a final, and 'a' and 'e' are medials, we want -// to transliterate as A Xi E rather than A Xf IEUNG E. - - "$jamoMedial {b} $latinMedial > $Bi;" - "$jamoMedial {c} $latinMedial > $Ci;" - "$jamoMedial {d} $latinMedial > $Di;" - "$jamoMedial {g} $latinMedial > $Gi;" - "$jamoMedial {h} $latinMedial > $Hi;" - "$jamoMedial {j} $latinMedial > $Ji;" - "$jamoMedial {k} $latinMedial > $Ki;" - "$jamoMedial {m} $latinMedial > $Mi;" - "$jamoMedial {n} $latinMedial > $Ni;" - "$jamoMedial {p} $latinMedial > $Pi;" - "$jamoMedial {s} $latinMedial > $Si;" - "$jamoMedial {t} $latinMedial > $Ti;" - -// Doubled initials. The sequence "axxe", where XX exists as an initial -// (XXi), and also Xi and Xf exist (true of all digraphs XX), we want -// to transliterate as A XXi E, rather than split to A Xf Xi E. - - "$jamoMedial {b b} $latinMedial > $BB;" - "$jamoMedial {d d} $latinMedial > $DD;" - "$jamoMedial {j j} $latinMedial > $JJ;" - "$jamoMedial {g g} $latinMedial > $GGi;" - "$jamoMedial {s s} $latinMedial > $SSi;" - -// XYY. Because doubled consonants bind more strongly than XY -// consonants, we must handle the sequence "axyy" specially. Here XYf -// and YYi must exist. In these cases, we map to Xf YYi rather than -// XYf. - - "$jamoMedial {b} s s > $Bf;" - "$jamoMedial {g} s s > $Gf;" - "$jamoMedial {l} b b > $L;" - "$jamoMedial {l} g g > $L;" - "$jamoMedial {l} s s > $L;" - "$jamoMedial {n} g g > $Nf;" - "$jamoMedial {n} j j > $Nf;" - -// Finals: Attach consonant with preceding medial to preceding medial. -// Do this BEFORE mapping consonants to initials. Longer keys must -// precede shorter keys that they start with, e.g., the rule for 'bs' -// must precede 'b'. - -// [BASIC Jamo-Latin FINALS handled here. Order irrelevant within this -// block for Jamo-Latin.] - - "$jamoMedial {bs} <> $BS;" - "$jamoMedial {b} <> $Bf;" - "$jamoMedial {c} <> $Cf;" - "$jamoMedial {d} <> $Df;" - "$jamoMedial {gg} <> $GGf;" - "$jamoMedial {gs} <> $GS;" - "$jamoMedial {g} <> $Gf;" - "$jamoMedial {h} <> $Hf;" - "$jamoMedial {j} <> $Jf;" - "$jamoMedial {k} <> $Kf;" - "$jamoMedial {lb} <> $LB; $jamoMedial {lg} <> $LG;" - "$jamoMedial {lh} <> $LH;" - "$jamoMedial {lm} <> $LM;" - "$jamoMedial {lp} <> $LP;" - "$jamoMedial {ls} <> $LS;" - "$jamoMedial {lt} <> $LT;" - "$jamoMedial {l} <> $L;" - "$jamoMedial {m} <> $Mf;" - "$jamoMedial {ng} <> $NG;" - "$jamoMedial {nh} <> $NH;" - "$jamoMedial {nj} <> $NJ;" - "$jamoMedial {n} <> $Nf;" - "$jamoMedial {p} <> $Pf;" - "$jamoMedial {ss} <> $SSf;" - "$jamoMedial {s} <> $Sf;" - "$jamoMedial {t} <> $Tf;" - -// Initials: Attach single consonant to following medial. Do this -// AFTER mapping finals. Longer keys must precede shorter keys that -// they start with, e.g., the rule for 'gg' must precede 'g'. - -// [BASIC Jamo-Latin INITIALS handled here. Order irrelevant within -// this block for Jamo-Latin.] - - "{gg} $latinMedial <> $GGi;" - "{g} $latinMedial <> $Gi;" - "{n} $latinMedial <> $Ni;" - "{dd} $latinMedial <> $DD;" - "{d} $latinMedial <> $Di;" - "{r} $latinMedial <> $R;" - "{m} $latinMedial <> $Mi;" - "{bb} $latinMedial <> $BB;" - "{b} $latinMedial <> $Bi;" - "{ss} $latinMedial <> $SSi;" - "{s} $latinMedial <> $Si;" - "{jj} $latinMedial <> $JJ;" - "{j} $latinMedial <> $Ji;" - "{c} $latinMedial <> $Ci;" - "{k} $latinMedial <> $Ki;" - "{t} $latinMedial <> $Ti;" - "{p} $latinMedial <> $Pi;" - "{h} $latinMedial <> $Hi;" - -// 'r' in final position. Because of the equivalency of the 'l' and -// 'r' jamo (the glyphs are the same), we try to provide the same -// equivalency in Latin-Jamo. The 'l' to 'r' conversion is handled -// below. If we see an 'r' in an apparent final position, treat it -// like 'l'. For example, "karka" => Ki A R EU Ki A without this rule. -// Instead, we want Ki A L Ki A. - - "$jamoMedial {r} $latinInitial > | l;" - -// Initial + Final: If we match the next rule, we have initial then -// final consonant with no intervening medial. We insert the null -// vowel BEFORE it to create a well-formed syllable. (In the next rule -// we insert a null vowel AFTER an anomalous initial.) - - "$jamoInitial {} [bcdghjklmnpst] > $EU;" - -// Initial + X: This block matches an initial consonant not followed by -// a medial. We insert the null vowel after it. We handle double -// initials explicitly here; for single initial consonants we insert EU -// (as Latin) after them and let standard rules do the rest. - -// BREAKS ROUND TRIP INTEGRITY - - "gg > $GGi $EU;" - "dd > $DD $EU;" - "bb > $BB $EU;" - "ss > $SSi $EU;" - "jj > $JJ $EU;" - - "([bcdghjkmnprst]) > | $1 eu;" - -// X + Final: Finally we have to deal with a consonant that can only be -// interpreted as a final (not an initial) and which is preceded -// neither by an initial nor a medial. It is the start of the -// syllable, but cannot be. Most of these will already be handled by -// the above rules. 'bs' splits into Bi EU Sf. Similar for 'gs' 'ng' -// 'nh' 'nj'. The only problem is 'l' and digraphs starting with 'l'. -// For this isolated case, we could add a null initial and medial, -// which would give "la" => IEUNG EU L IEUNG A, for example. A more -// economical solution is to transliterate isolated "l" (that is, -// initial "l") to "r". (Other similar conversions of consonants that -// occur neither as initials nor as finals are handled below.) - - "l > | r;" - -// Medials. If a medial is preceded by an initial, then we proceed -// normally. As usual, longer keys must precede shorter ones. - -// [BASIC Jamo-Latin MEDIALS handled here. Order irrelevant within -// this block for Jamo-Latin.] - - "$jamoInitial {ae} <> $AE;" - "$jamoInitial {a} <> $A;" - "$jamoInitial {eo} <> $EO;" - "$jamoInitial {eu} <> $EU;" - "$jamoInitial {e} <> $E;" - "$jamoInitial {i} <> $I;" - "$jamoInitial {oe} <> $OE;" - "$jamoInitial {o} <> $O;" - "$jamoInitial {u} <> $U;" - "$jamoInitial {wae} <> $WAE;" - "$jamoInitial {wa} <> $WA;" - "$jamoInitial {weo} <> $WEO;" - "$jamoInitial {we} <> $WE;" - "$jamoInitial {wi} <> $WI;" - "$jamoInitial {yae} <> $YAE;" - "$jamoInitial {ya} <> $YA;" - "$jamoInitial {yeo} <> $YEO;" - "$jamoInitial {ye} <> $YE;" - "$jamoInitial {yi} <> $YI;" - "$jamoInitial {yo} <> $YO;" - "$jamoInitial {yu} <> $YU;" - -// We may see an anomalous isolated 'w' or 'y'. In that case, we -// interpret it as 'wi' and 'yu', respectively. - -// BREAKS ROUND TRIP INTEGRITY - - "$jamoInitial {w} > | wi;" - "$jamoInitial {y} > | yu;" - -// Otherwise, insert a null consonant IEUNG before the medial (which is -// still an untransliterated latin vowel). - - "($latinMedial) > $IEUNG | $1;" - -// Convert non-jamo latin consonants to equivalents. These occur as -// neither initials nor finals in jamo. 'l' occurs as a final, but not -// an initial; it is handled above. The following letters (left hand -// side) will never be output by Jamo-Latin. - - "f > | p;" - "q > | k;" - "v > | b;" - "x > | ks;" - "z > | s;" - -// Delete separators (Latin-Jamo). - - "$sep > ;" - -// Delete null consonants (Jamo-Latin). Do NOT delete null EU vowels, -// since these may also occur in text. - - "< $IEUNG;" - -//- N.B. DO NOT put any filters, NFD, etc. here -- those are aliased in -//- the INDEX file. This transliterator is, by itself, not -//- instantiated. It is used as a part of Latin-Jamo, Latin-Hangul, or -//- inverses thereof. - -// eof - } -} diff --git a/icuSources/data/translit/t_Latn_Kana.txt b/icuSources/data/translit/t_Latn_Kana.txt deleted file mode 100644 index ea2e28a2..00000000 --- a/icuSources/data/translit/t_Latn_Kana.txt +++ /dev/null @@ -1,511 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_Latin_Katakana.txt -// Date: Sat Jul 27 10:31:07 2002 -//-------------------------------------------------------------------- - -// Latin_Katakana - -t_Latn_Kana { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// note: a global filter is more efficient, but MUST include all source chars -//:: [\\u0000-\u007E \u3001\u3002 \u3099-\u309C \u30A1-\u30FC \uFF61-\uFF9F [:Latin:][:Katakana:] [:nonspacing mark:]] ; -// MINIMAL FILTER GENERATED FOR: Latin-Katakana -//## WARNING -- must add width filter, both here and below!!! ### -":: [[\u1100-\u1112\u111A\u1121\u1160-\u1175\u11AA\u11AC-\u11AD\u11B0-\u11B5\u2190-\u2193\u2502\u25A0\u25CB\u3000-\u3002\u300C-\u300D\u3099-\u309A\u30A1-\u30ED\u30EF\u30F2-\u30F4\u30F7\u30FA-\u30FC\uFF01-\uFF5E\uFFE0-\uFFE6][',.A-Za-z~\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E3\u01E6-\u01ED\u01F0\u01F4-\u01F5\u01F8-\u021B\u021E-\u021F\u0226-\u0233\u0304\u04E2-\u04E3\u04EE-\u04EF\u1E00-\u1E99\u1EA0-\u1EF9\u1FB1\u1FB9\u1FD1\u1FD9\u1FE1\u1FE9\u212A-\u212B]] ;" - -":: [:Latin:] fullwidth-halfwidth ();" -":: NFD (NFC);" -":: Lower ();" // whenever transliterating from cased to uncased script, include this -// :: NFD () ; # this would catch the odd cases where a lowercase is not in NFD, but none are important for Japanese - -// Uses modified Hepburn. Small changes to make unambiguous. - -// | Kunrei-shiki: Hepburn/MHepburn -// | ------------------------------ -// | si: shi -// | si ~ya: sha -// | si ~yu: shu -// | si ~yo: sho -// | zi: ji -// | zi ~ya: ja -// | zi ~yu: ju -// | zi ~yo: jo -// | ti: chi -// | ti ~ya: cha -// | ti ~yu: chu -// | ti ~yu: cho -// | tu: tsu -// | di: ji/dji -// | du: zu/dzu -// | hu: fu - -// | For foreign words: -// | ----------------- -// | se ~i si -// | si ~e she -// | -// | ze ~i zi -// | zi ~e je -// | -// | te ~i ti -// | ti ~e che -// | te ~u tu -// | -// | de ~i di -// | de ~u du -// | de ~i di -// | -// | he ~u: hu -// | hu ~a fa -// | hu ~i fi -// | hu ~e he -// | hu ~o ho - -// Most small forms are generated, but if necessary -// explicit small forms are given with ~a, ~ya, etc. - -//------------------------------------------------------ -// Variables - -"$vowel = [aeiou] ;" -"$consonant = [bcdfghjklmnpqrstvwxyz] ;" -"$macron = \u0304 ;" - -// Variables used for doubled-consonants with tsu - -"$kana = [\u3041-\u3094] ;" - -"$voice = [\u3099\u309B];" -"$semivoice = [\u309A\u309C];" - -"$k_start = [カキクケコかきくけこ] ;" - -"$s_start = [サシスセソさしすせそ] ;" - -"$j_start = [シし] $voice ;" - -"$t_start = [タチツテトたちつてと] ;" - -"$n_start = [ナニヌネノンなにぬねの] ;" - -"$h_start = [ハヒヘホはひへほ] ;" -"$f_start = [フふ] ;" - -"$m_start = [マミムメモまみむめも] ;" - -"$y_start = [ヤユヨやゆよ] ;" - -"$r_start = [ラリルレロらりるれろ] ;" - -"$w_start = [ワヰヱヲわゐゑを] ;" - -"$v_start = [ワヰヱヲ]゙ ;" - -// if ン is followed by $n_quoter, then it needs an -// apostrophe after its romaji form to disambiguate it. -// e.g., ン ア ! = ナ, so represent as "n'a", not "na". - -"$n_quoter = [ア イ ウ エ オ ナ ニ ヌ ネ ノ ヤ ユ ヨ ン] ;" - -"$small_y = [ャィュェョ] ;" - -"$iteration = \u309D ;" - -//------------------------------------------------------ -// katakana rules - -// Punctuation - -"'.' <> 。;" -"',' <> 、;" -// ' ' } [a-z] > ; # delete spaces before latin -// ' ' < [^' '\u30A0-\u30ff] {} ['\u30A0-\u30ff] ; #insert spaces before hiragana - -// Iteration Mark -// Copy previous letter & marks - -// TODO -// | $1 $1 < ($kana [[:M:]$voice$semivoice]?) $iteration - -// Specials for katakana -- not shared with hiragana - -"va <> ヷ ;" -"vi <> ヸ ;" -"ve <> ヹ ;" -"vo <> ヺ ;" -"'~ka' <> ヵ ;" -"'~ke' <> ヶ ;" - -// ~~~ begin shared rules ~~~ - -//special - -"ya < '~'ャ;" -"yi < '~'ィ ;" -"yu < '~'ュ;" -"ye < '~'ェ;" -"yo < '~'ョ;" - -//normal - -"a <> ア ;" - -"b | '~' < ヒ ゙} $small_y ;" -"by } $vowel > ビ | '~y' ;" - -"ba <> バ ;" -"bi <> ビ ;" -"bu <> ブ ;" -"be <> ベ ;" -"bo <> ボ ;" - -"c } i > | s ;" -"c } e > | s ;" - -"da <> ダ ;" -"di <> ディ ;" -"du <> デゥ ;" -"de <> デ ;" -"do <> ド ;" -"dzu <> ヅ ;" -"dja < ヂャ ;" -"dji'~i' < ヂィ ;" // liu -"dju < ヂュ ;" -"dje < ヂェ ;" -"djo < ヂョ ;" -"dji <> ヂ ;" -"dj } $vowel > ヂ | '~y' ;" - -// TODO: QUESTION: use ĵĴżŻ instead of dj, dz - -"cha < チャ ;" -"chi'~i' < チィ ;" // liu -"chu < チュ ;" -"che < チェ ;" -"cho < チョ ;" -"chi <> チ ;" -"ch } $vowel > チ | '~y' ;" - -"e <> エ ;" - -"g | '~' < ギ} $small_y ;" -"gy } $vowel > ギ | '~y' ;" - -"ga <> ガ ;" -"gi <> ギ ;" -"gu <> グ ;" -"ge <> ゲ ;" -"go <> ゴ ;" - -"i <> イ ;" - -// j } $vowel > ジ | '~y' ; - -"ja <> ジャ ;" -"ji'~i' < ジィ ;" // liu -"ju <> ジュ ;" -"je <> ジェ ;" -"jo <> ジョ ;" -"ji <> ジ ;" - -"k | '~' < キ} $small_y ;" -"ky } $vowel > キ | '~y' ;" - -"ka <> カ ;" -"ki <> キ ;" -"ku <> ク ;" -"ke <> ケ ;" -"ko <> コ ;" - -"m | '~' < ミ} $small_y ;" -"my } $vowel > ミ | '~y' ;" - -"ma <> マ ;" -"mi <> ミ ;" -"mu <> ム ;" -"me <> メ ;" -"mo <> モ ;" - -"m } [pbfv] > ン ;" - -"n | '~' < ニ } $small_y ;" -"ny } $vowel > ニ | '~y' ;" - -"na <> ナ ;" -"ni <> ニ ;" -"nu <> ヌ ;" -"ne <> ネ ;" -"no <> ノ ;" - -"o <> オ ;" - -"p | '~' < ピ } $small_y ;" -"py } $vowel > ピ | '~y' ;" - -"pa <> パ ;" -"pi <> ピ ;" -"pu <> プ ;" -"pe <> ペ ;" -"po <> ポ ;" - -"h | '~' < ヒ } $small_y ;" -"hy } $vowel > ヒ | '~y' ;" - -"ha <> ハ ;" -"hi <> ヒ ;" -"hu <> ヘゥ ;" -"he <> ヘ ;" -"ho <> ホ ;" - -// f | '~' < フ } $small_y ; -// f } $vowel > フ | '~' ; - -"fa <> ファ ;" -"fi <> フィ ;" -"fe <> フェ ;" -"fo <> フォ ;" -"fu <> フ ;" - -"r | '~' < リ } $small_y ;" -"ry } $vowel > リ | '~y' ;" - -"ra <> ラ ;" -"ri <> リ ;" -"ru <> ル ;" -"re <> レ ;" -"ro <> ロ ;" - -"za <> ザ ;" -"zi <> ゼィ ;" -"zu <> ズ ;" -"ze <> ゼ ;" -"zo <> ゾ ;" - -"sa <> サ ;" -"si <> セィ ;" -"su <> ス ;" -"se <> セ ;" -"so <> ソ ;" - -"sha < シャ ;" -"shi'~i' < シィ ;" // liu -"shu < シュ ;" -"she < シェ ;" -"sho < ショ ;" -"shi <> シ ;" -"sh } $vowel > シ | '~y' ;" - -"ta <> タ ;" -"ti <> ティ ;" -"tu <> テゥ ;" -"te <> テ ;" -"to <> ト ;" - -"tsu <> ツ ;" - -// v } $vowel > ヴ | '~' ; - -//'v~a' < ヴァ ; # liu -//'v~i' < ヴィ ; # liu -//'v~e' < ヴェ ; # liu -//'v~o' < ヴォ ; # liu -"vu <> ヴ ;" - -"u <> ウ ;" - -// w } $vowel > ウ | '~' ; - -"wa <> ワ ;" -"wi <> ヰ ;" -"wu > ウ ;" -"we <> ヱ ;" -"wo <> ヲ ;" - -"ya <> ヤ ;" -"yi > イ ;" -"yu <> ユ ;" -"ye > エ ;" -"yo <> ヨ ;" - -// double consonants - -//specials -"s } sh > ッ ;" -"t } ch > ッ ;" - -//voiced - -"j } j <> ッ } $j_start ;" -"b } b <> ッ } [$h_start$f_start] $voice;" -"d } d <> ッ } $t_start $voice;" -"g } g <> ッ } $k_start $voice;" -"p } p <> ッ } [$h_start$f_start] $semivoice;" -// v } v <> ッ } [ワヰウヱヲう] $voice ; -"z } z <> ッ } $s_start $voice;" -"v } v <> ッ } $v_start;" - -// normal - -"k } k <> ッ } $k_start ;" -"m } m <> ッ } $m_start ;" -"n } n <> ッ } $n_start ;" -"h } h <> ッ } $h_start ;" -"f } f <> ッ } $f_start ;" -"r } r <> ッ } $r_start ;" -"t } t <> ッ } $t_start ;" -"s } s <> ッ } $s_start ;" - -"w } w <> ッ } $w_start;" -"y } y <> ッ } $y_start;" - -// completeness -"x } x > ッ ;" -"c } k > ッ ;" -"c } c > ッ ;" -"c } q > ッ ;" -"l } l > ッ ;" -"q } q > ッ ;" -// y } y > ッ ; -// w } w > ッ ; - -// prolonged vowel mark. this indicates a doubling of -// the preceding vowel sound - -//a < a { ー ; # liu -//e < e { ー ; # liu -//i < i { ー ; # liu -//o < o { ー ; # liu -//u < u { ー ; # liu - -"$macron <> ー ;" - -// small forms - -"'~a' <> ァ ;" -"'~i' <> ィ ;" -"'~u' <> ゥ ;" -"'~e' <> ェ ;" -"'~o' <> ォ ;" -"'~tsu' <> ッ ;" -"'~wa' <> ヮ ;" -"'~ya' <> ャ ;" -"'~yi' > ィ ;" -"'~yu' <> ュ ;" -"'~ye' > ェ ;" -"'~yo' <> ョ ;" - -// iteration marks -// TODO: make more accurate - -"j $1 < sh (y* $vowel) {ヽ$voice ;" -"dj $1 < ch (y* $vowel) {ヽ$voice ;" -"dz $1 < ts (y* $vowel) {ヽ$voice ;" - -"g $1 < k (y* $vowel) {ヽ$voice ;" -"z $1 < s (y* $vowel) {ヽ$voice ;" -"d $1 < t (y* $vowel) {ヽ$voice ;" -"h $1 < b (y* $vowel) {ヽ$voice ;" -"v $1 < w (y* $vowel) {ヽ$voice ;" - -"sh $1 < sh (y* $vowel) {ヽ$voice ;" -"j $1 < j (y* $vowel) {ヽ$voice ;" -"ch $1 < ch (y* $vowel) {ヽ$voice ;" -"dj $1 < dj(y* $vowel) {ヽ$voice ;" -"ts $1 < ts (y* $vowel) {ヽ$voice ;" -"dz $1 < dz (y* $vowel) {ヽ$voice ;" - -"$1 < ($consonant y* $vowel) {ヽ$voice? ;" -"$1 < (.) {ヽ $voice? ;" // otherwise repeat last character - "< ヽ $voice? ;" // delete if no characters found - -// h- rule: lengthens vowel if not followed by a vowel - -"[aeiou] } h > ー ;" - -// one-way latin- > kana rules. these do not occur in -// well-formed romaji representing actual japanese text. -// their purpose is to make all romaji map to kana of -// some sort. - -// the following are not really necessary, but produce -// slightly more natural results. - -"cy > セィ ;" -"dy > ディ ;" -"hy > ヒ ;" -"sy > セィ ;" -"ty > ティ ;" -"zy > ゼィ ;" - -"h > ヘ ;" - -// isolated consonants listed here so as not to mask -// longer rules above. - -"ch > チ;" -"sh > シ ;" -"dz > ヅ ;" -"dj > ヂ;" - -"b > ブ ;" -"d > デ ;" -"g > グ ;" -"k > ク ;" -"m > ム ;" -"n'' < ン } $n_quoter ;" -"n <> ン ;" -"p > プ ;" -"r > ル ;" -"s > ス ;" -"t > テ ;" -"y > イ ;" -"z > ズ ;" -"v > ヴ ;" - -"f > フ;" -"j > ジ;" -"w > ウ;" - -"ß > | ss ;" -"æ > | e ;" -"ð > | d ;" -"ø > | u ;" -"þ > | th ;" - -// simple substitutions using backup - -"c > | k ;" -"l > | r ;" -"q > | k ;" -"x > | ks ;" - -// ~~~ END shared rules ~~~ - -//------------------------------------------------------ -// Final cleanup - -"'~' > ;" // delete stray tildes between letters -"[:Katakana:] { '' } [:Latin:] > ;" // delete stray quotes between letters -// [\u02BE[:Nonspacing Mark:]-[\u3099-\u309C]] > ; # delete any non-spacing marks that we didn't use - -":: NFC (NFD) ;" -":: ([:Katakana:] halfwidth-fullwidth);" - -// note: a global filter is more efficient, but MUST include all source chars!! -//:: ([\\u0000-\u007E \u3001\u3002 \u3099-\u309C \u30A1-\u30FC \uFF61-\uFF9F [:Latin:][:Katakana:] [:nonspacing mark:]]); -// MINIMAL FILTER GENERATED FOR: Latin-Katakana BACKWARD -":: ( [[\\\ -~\u00A2-\u00A3\u00A5-\u00A6\u00AC\u0304\u20A9\uFF61-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC\uFFE8-\uFFEE][~\u3001-\u3002\u304C\u304E\u3050\u3052\u3054\u3056\u3058\u305A\u305C\u305E\u3060\u3062\u3065\u3067\u3069\u3070-\u3071\u3073-\u3074\u3076-\u3077\u3079-\u307A\u307C-\u307D\u3094\u3099-\u309B\u309E\u30A1-\u30FA\u30FC-\u30FE]] ) ;" - -// eof - } -} diff --git a/icuSources/data/translit/t_Mlym_InterIndic.txt b/icuSources/data/translit/t_Mlym_InterIndic.txt deleted file mode 100644 index f75222d6..00000000 --- a/icuSources/data/translit/t_Mlym_InterIndic.txt +++ /dev/null @@ -1,101 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_Malayalam_InterIndic.txt -// Date: Sat Jul 27 10:31:07 2002 -//-------------------------------------------------------------------- - -// Malayalam_InterIndic - -t_Mlym_InterIndic { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// Malayalam-InterIndic -//:: NFD (NFC) ; - -"\u0D02>\uE002;" // SIGN ANUSVARA -"\u0D03>\uE003;" // SIGN VISARGA -"\u0D05>\uE005;" // LETTER A -"\u0D06>\uE006;" // LETTER AA -"\u0D07>\uE007;" // LETTER I -"\u0D08>\uE008;" // LETTER II -"\u0D09>\uE009;" // LETTER U -"\u0D0A>\uE00A;" // LETTER UU -"\u0D0B>\uE00B;" // LETTER VOCALIC R -"\u0D0C>\uE00C;" // LETTER VOCALIC L -"\u0D0E>\uE00E;" // LETTER E -"\u0D0F>\uE00F;" // LETTER EE -"\u0D10>\uE010;" // LETTER AI -"\u0D12>\uE012;" // LETTER O -"\u0D13>\uE013;" // LETTER OO -"\u0D14>\uE014;" // LETTER AU -"\u0D15>\uE015;" // LETTER KA -"\u0D16>\uE016;" // LETTER KHA -"\u0D17>\uE017;" // LETTER GA -"\u0D18>\uE018;" // LETTER GHA -"\u0D19>\uE019;" // LETTER NGA -"\u0D1A>\uE01A;" // LETTER CA -"\u0D1B>\uE01B;" // LETTER CHA -"\u0D1C>\uE01C;" // LETTER JA -"\u0D1D>\uE01D;" // LETTER JHA -"\u0D1E>\uE01E;" // LETTER NYA -"\u0D1F>\uE01F;" // LETTER TTA -"\u0D20>\uE020;" // LETTER TTHA -"\u0D21>\uE021;" // LETTER DDA -"\u0D22>\uE022;" // LETTER DDHA -"\u0D23>\uE023;" // LETTER NNA -"\u0D24>\uE024;" // LETTER TA -"\u0D25>\uE025;" // LETTER THA -"\u0D26>\uE026;" // LETTER DA -"\u0D27>\uE027;" // LETTER DHA -"\u0D28>\uE028;" // LETTER NA -"\u0D2A>\uE02A;" // LETTER PA -"\u0D2B>\uE02B;" // LETTER PHA -"\u0D2C>\uE02C;" // LETTER BA -"\u0D2D>\uE02D;" // LETTER BHA -"\u0D2E>\uE02E;" // LETTER MA -"\u0D2F>\uE02F;" // LETTER YA -"\u0D30>\uE030;" // LETTER RA -"\u0D31>\uE031;" // LETTER RRA -"\u0D32>\uE032;" // LETTER LA -"\u0D33>\uE033;" // LETTER LLA -"\u0D34>\uE034;" // LETTER LLLA -"\u0D35>\uE035;" // LETTER VA -"\u0D36>\uE036;" // LETTER SHA -"\u0D37>\uE037;" // LETTER SSA -"\u0D38>\uE038;" // LETTER SA -"\u0D39>\uE039;" // LETTER HA -"\u0D3E>\uE03E;" // VOWEL SIGN AA -"\u0D3F>\uE03F;" // VOWEL SIGN I -"\u0D40>\uE040;" // VOWEL SIGN II -"\u0D41>\uE041;" // VOWEL SIGN U -"\u0D42>\uE042;" // VOWEL SIGN UU -"\u0D43>\uE043;" // VOWEL SIGN VOCALIC R -"\u0D46>\uE046;" // VOWEL SIGN E -"\u0D47>\uE047;" // VOWEL SIGN EE -"\u0D48>\uE048;" // VOWEL SIGN AI -"\u0D4D>\uE04D;" // SIGN VIRAMA -"\u0D57>\uE057;" // AU LENGTH MARK -"\u0D60>\uE060;" // LETTER VOCALIC RR -"\u0D61>\uE061;" // LETTER VOCALIC LL -"\u0D66>\uE066;" // DIGIT ZERO -"\u0D67>\uE067;" // DIGIT ONE -"\u0D68>\uE068;" // DIGIT TWO -"\u0D69>\uE069;" // DIGIT THREE -"\u0D6A>\uE06A;" // DIGIT FOUR -"\u0D6B>\uE06B;" // DIGIT FIVE -"\u0D6C>\uE06C;" // DIGIT SIX -"\u0D6D>\uE06D;" // DIGIT SEVEN -"\u0D6E>\uE06E;" // DIGIT EIGHT -"\u0D6F>\uE06F;" // DIGIT NINE -// :: NFC (NFD) ; -// eof - } -} diff --git a/icuSources/data/translit/t_Orya_InterIndic.txt b/icuSources/data/translit/t_Orya_InterIndic.txt deleted file mode 100644 index 40c1b78a..00000000 --- a/icuSources/data/translit/t_Orya_InterIndic.txt +++ /dev/null @@ -1,107 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_Oriya_InterIndic.txt -// Date: Sat Jul 27 10:31:07 2002 -//-------------------------------------------------------------------- - -// Oriya_InterIndic - -t_Orya_InterIndic { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// Oriya-InterIndic -//:: NFD (NFC) ; -//\u0B21\u0B3C>\uE05C;# LETTER RRA -//\u0B22\u0B3C>\uE05D;# LETTER RHA -"\u0B47\u0B56>\uE048;"// VOWEL SIGN AI -"\u0B47\u0B3E>\uE04B;"// VOWEL SIGN O -"\u0B47\u0B57>\uE04C;"// VOWEL SIGN AU - -"\u0B01>\uE001;" // SIGN CANDRABINDU -"\u0B02>\uE002;" // SIGN ANUSVARA -"\u0B03>\uE003;" // SIGN VISARGA -"\u0B05>\uE005;" // LETTER A -"\u0B06>\uE006;" // LETTER AA -"\u0B07>\uE007;" // LETTER I -"\u0B08>\uE008;" // LETTER II -"\u0B09>\uE009;" // LETTER U -"\u0B0A>\uE00A;" // LETTER UU -"\u0B0B>\uE00B;" // LETTER VOCALIC R -"\u0B0C>\uE00C;" // LETTER VOCALIC L -"\u0B0F>\uE00F;" // LETTER E -"\u0B10>\uE010;" // LETTER AI -"\u0B13>\uE013;" // LETTER O -"\u0B14>\uE014;" // LETTER AU -"\u0B15>\uE015;" // LETTER KA -"\u0B16>\uE016;" // LETTER KHA -"\u0B17>\uE017;" // LETTER GA -"\u0B18>\uE018;" // LETTER GHA -"\u0B19>\uE019;" // LETTER NGA -"\u0B1A>\uE01A;" // LETTER CA -"\u0B1B>\uE01B;" // LETTER CHA -"\u0B1C>\uE01C;" // LETTER JA -"\u0B1D>\uE01D;" // LETTER JHA -"\u0B1E>\uE01E;" // LETTER NYA -"\u0B1F>\uE01F;" // LETTER TTA -"\u0B20>\uE020;" // LETTER TTHA -"\u0B21>\uE021;" // LETTER DDA -"\u0B22>\uE022;" // LETTER DDHA -"\u0B23>\uE023;" // LETTER NNA -"\u0B24>\uE024;" // LETTER TA -"\u0B25>\uE025;" // LETTER THA -"\u0B26>\uE026;" // LETTER DA -"\u0B27>\uE027;" // LETTER DHA -"\u0B28>\uE028;" // LETTER NA -"\u0B2A>\uE02A;" // LETTER PA -"\u0B2B>\uE02B;" // LETTER PHA -"\u0B2C>\uE02C;" // LETTER BA -"\u0B2D>\uE02D;" // LETTER BHA -"\u0B2E>\uE02E;" // LETTER MA -"\u0B2F>\uE02F;" // LETTER YA -"\u0B30>\uE030;" // LETTER RA -"\u0B32>\uE032;" // LETTER LA -"\u0B33>\uE033;" // LETTER LLA -"\u0B36>\uE036;" // LETTER SHA -"\u0B37>\uE037;" // LETTER SSA -"\u0B38>\uE038;" // LETTER SA -"\u0B39>\uE039;" // LETTER HA -"\u0B3C>\uE03C;" // SIGN NUKTA -"\u0B3D>\uE03D;" // SIGN AVAGRAHA -"\u0B3E>\uE03E;" // VOWEL SIGN AA -"\u0B3F>\uE03F;" // VOWEL SIGN I -"\u0B40>\uE040;" // VOWEL SIGN II -"\u0B41>\uE041;" // VOWEL SIGN U -"\u0B42>\uE042;" // VOWEL SIGN UU -"\u0B43>\uE043;" // VOWEL SIGN VOCALIC R -"\u0B47>\uE047;" // VOWEL SIGN E -// -"\u0B4D>\uE04D;" // SIGN VIRAMA -"\u0B56>\uE056;" // AI LENGTH MARK -"\u0B57>\uE057;" // AU LENGTH MARK -// -"\u0B5F>\uE05F;" // LETTER YYA -"\u0B60>\uE060;" // LETTER VOCALIC RR -"\u0B61>\uE061;" // LETTER VOCALIC LL -"\u0B66>\uE066;" // DIGIT ZERO -"\u0B67>\uE067;" // DIGIT ONE -"\u0B68>\uE068;" // DIGIT TWO -"\u0B69>\uE069;" // DIGIT THREE -"\u0B6A>\uE06A;" // DIGIT FOUR -"\u0B6B>\uE06B;" // DIGIT FIVE -"\u0B6C>\uE06C;" // DIGIT SIX -"\u0B6D>\uE06D;" // DIGIT SEVEN -"\u0B6E>\uE06E;" // DIGIT EIGHT -"\u0B6F>\uE06F;" // DIGIT NINE -"\u0B70>\uE070;" // ISSHAR -// :: NFC (NFD) ; -// eof - } -} diff --git a/icuSources/data/translit/t_Taml_InterIndic.txt b/icuSources/data/translit/t_Taml_InterIndic.txt deleted file mode 100644 index 95fd52cf..00000000 --- a/icuSources/data/translit/t_Taml_InterIndic.txt +++ /dev/null @@ -1,92 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_Tamil_InterIndic.txt -// Date: Sat Jul 27 10:31:07 2002 -//-------------------------------------------------------------------- - -// Tamil_InterIndic - -t_Taml_InterIndic { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// Tamil-InterIndic -//:: NFD (NFC) ; - -"\u0BC6\u0BBE>\uE04A;"// VOWEL SIGN O -"\u0BC7\u0BBE>\uE04B;"// VOWEL SIGN OO -"\u0BC6\u0BD7>\uE04C;"// VOWEL SIGN AU -"\u0B92\u0BD7>\uE014;"// LETTER AU - -"\u0B82>\uE002;" // SIGN ANUSVARA -"\u0B83>\uE003;" // SIGN VISARGA -"\u0B85>\uE005;" // LETTER A -"\u0B86>\uE006;" // LETTER AA -"\u0B87>\uE007;" // LETTER I -"\u0B88>\uE008;" // LETTER II -"\u0B89>\uE009;" // LETTER U -"\u0B8A>\uE00A;" // LETTER UU -"\u0B8E>\uE00E;" // LETTER E -"\u0B8F>\uE00F;" // LETTER EE -"\u0B90>\uE010;" // LETTER AI -"\u0B92>\uE012;" // LETTER O -"\u0B93>\uE013;" // LETTER OO -"\u0B94>\uE014;" // LETTER AU -"\u0B95>\uE015;" // LETTER KA -"\u0B99>\uE019;" // LETTER NGA -"\u0B9A>\uE01A;" // LETTER CA -"\u0B9C>\uE01C;" // LETTER JA -"\u0B9E>\uE01E;" // LETTER NYA -"\u0B9F>\uE01F;" // LETTER TTA -"\u0BA3>\uE023;" // LETTER NNA -"\u0BA4>\uE024;" // LETTER TA -"\u0BA8>\uE028;" // LETTER NA -"\u0BA9>\uE029;" // LETTER NNNA -"\u0BAA>\uE02A;" // LETTER PA -"\u0BAE>\uE02E;" // LETTER MA -"\u0BAF>\uE02F;" // LETTER YA -"\u0BB0>\uE030;" // LETTER RA -"\u0BB1>\uE031;" // LETTER RRA -"\u0BB2>\uE032;" // LETTER LA -"\u0BB3>\uE033;" // LETTER LLA -"\u0BB4>\uE034;" // LETTER LLLA -"\u0BB5>\uE035;" // LETTER VA -"\u0BB7>\uE037;" // LETTER SSA -"\u0BB8>\uE038;" // LETTER SA -"\u0BB9>\uE039;" // LETTER HA -"\u0BBE>\uE03E;" // VOWEL SIGN AA -"\u0BBF>\uE03F;" // VOWEL SIGN I -"\u0BC0>\uE040;" // VOWEL SIGN II -"\u0BC1>\uE041;" // VOWEL SIGN U -"\u0BC2>\uE042;" // VOWEL SIGN UU -"\u0BC6>\uE046;" // VOWEL SIGN E -"\u0BC7>\uE047;" // VOWEL SIGN EE -"\u0BC8>\uE048;" // VOWEL SIGN AI - -"\u0BCD>\uE04D;" // SIGN VIRAMA -"\u0BD7>\uE057;" // AU LENGTH MARK -"\u0BE7>\uE067;" // DIGIT ONE -"\u0BE8>\uE068;" // DIGIT TWO -"\u0BE9>\uE069;" // DIGIT THREE -"\u0BEA>\uE06A;" // DIGIT FOUR -"\u0BEB>\uE06B;" // DIGIT FIVE -"\u0BEC>\uE06C;" // DIGIT SIX -"\u0BED>\uE06D;" // DIGIT SEVEN -"\u0BEE>\uE06E;" // DIGIT EIGHT -"\u0BEF>\uE06F;" // DIGIT NINE -"\u0BF0>\uE067\uE066;" // UNMAPPED Tamil-InterIndic: NUMBER TEN -"\u0BF1>\uE067\uE066\uE066;" // UNMAPPED Tamil-InterIndic: NUMBER ONE HUNDRED -"\u0BF2>\uE067\uE066\uE066\uE066;"// UNMAPPED Tamil-InterIndic: NUMBER ONE THOUSAND -"0>\ue066;" - -// :: NFC (NFD) ; -// eof - } -} diff --git a/icuSources/data/translit/t_Telu_InterIndic.txt b/icuSources/data/translit/t_Telu_InterIndic.txt deleted file mode 100644 index 84049988..00000000 --- a/icuSources/data/translit/t_Telu_InterIndic.txt +++ /dev/null @@ -1,108 +0,0 @@ - // -*- Coding: utf-8; -*- -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: ../../../impl/data/Transliterator_Telugu_InterIndic.txt -// Date: Sat Jul 27 10:31:07 2002 -//-------------------------------------------------------------------- - -// Telugu_InterIndic - -t_Telu_InterIndic { - Rule { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- - -// Telugu-InterIndic -//:: NFD (NFC) ; -"\u0c46\u0c4d\u0c56>\ue048\ue04d;" -"\u0C46\u0C56>\uE048;"// VOWEL SIGN AI -"\u0C01>\uE001;" // SIGN CANDRABINDU -"\u0C02>\uE002;" // SIGN ANUSVARA -"\u0C03>\uE003;" // SIGN VISARGA -"\u0C05>\uE005;" // LETTER A -"\u0C06>\uE006;" // LETTER AA -"\u0C07>\uE007;" // LETTER I -"\u0C08>\uE008;" // LETTER II -"\u0C09>\uE009;" // LETTER U -"\u0C0A>\uE00A;" // LETTER UU -"\u0C0B>\uE00B;" // LETTER VOCALIC R -"\u0C0C>\uE00C;" // LETTER VOCALIC L -"\u0C0E>\uE00E;" // LETTER E -"\u0C0F>\uE00F;" // LETTER EE -"\u0C10>\uE010;" // LETTER AI -"\u0C12>\uE012;" // LETTER O -"\u0C13>\uE013;" // LETTER OO -"\u0C14>\uE014;" // LETTER AU -"\u0C15>\uE015;" // LETTER KA -"\u0C16>\uE016;" // LETTER KHA -"\u0C17>\uE017;" // LETTER GA -"\u0C18>\uE018;" // LETTER GHA -"\u0C19>\uE019;" // LETTER NGA -"\u0C1A>\uE01A;" // LETTER CA -"\u0C1B>\uE01B;" // LETTER CHA -"\u0C1C>\uE01C;" // LETTER JA -"\u0C1D>\uE01D;" // LETTER JHA -"\u0C1E>\uE01E;" // LETTER NYA -"\u0C1F>\uE01F;" // LETTER TTA -"\u0C20>\uE020;" // LETTER TTHA -"\u0C21>\uE021;" // LETTER DDA -"\u0C22>\uE022;" // LETTER DDHA -"\u0C23>\uE023;" // LETTER NNA -"\u0C24>\uE024;" // LETTER TA -"\u0C25>\uE025;" // LETTER THA -"\u0C26>\uE026;" // LETTER DA -"\u0C27>\uE027;" // LETTER DHA -"\u0C28>\uE028;" // LETTER NA -"\u0C2A>\uE02A;" // LETTER PA -"\u0C2B>\uE02B;" // LETTER PHA -"\u0C2C>\uE02C;" // LETTER BA -"\u0C2D>\uE02D;" // LETTER BHA -"\u0C2E>\uE02E;" // LETTER MA -"\u0C2F>\uE02F;" // LETTER YA -"\u0C30>\uE030;" // LETTER RA -"\u0C31>\uE031;" // LETTER RRA -"\u0C32>\uE032;" // LETTER LA -"\u0C33>\uE033;" // LETTER LLA -"\u0C35>\uE035;" // LETTER VA -"\u0C36>\uE036;" // LETTER SHA -"\u0C37>\uE037;" // LETTER SSA -"\u0C38>\uE038;" // LETTER SA -"\u0C39>\uE039;" // LETTER HA -"\u0C3E>\uE03E;" // VOWEL SIGN AA -"\u0C3F>\uE03F;" // VOWEL SIGN I -"\u0C40>\uE040;" // VOWEL SIGN II -"\u0C41>\uE041;" // VOWEL SIGN U -"\u0C42>\uE042;" // VOWEL SIGN UU -"\u0C43>\uE043;" // VOWEL SIGN VOCALIC R -"\u0C44>\uE044;" // VOWEL SIGN VOCALIC RR -"\u0C46>\uE046;" // VOWEL SIGN E -"\u0C47>\uE047;" // VOWEL SIGN EE -"\u0C4A>\uE04A;" // VOWEL SIGN O -"\u0C4B>\uE04B;" // VOWEL SIGN OO -"\u0C4C>\uE04C;" // VOWEL SIGN AU -"\u0C4D>\uE04D;" // SIGN VIRAMA -"\u0C55>\uE055;" // LENGTH MARK -"\u0C56>\uE056;" // AI LENGTH MARK -"\u0C60>\uE060;" // LETTER VOCALIC RR -"\u0C61>\uE061;" // LETTER VOCALIC LL -"\u0C64>\uE064;" -"\u0C65>\uE065;" -"\u0C66>\uE066;" // DIGIT ZERO -"\u0C67>\uE067;" // DIGIT ONE -"\u0C68>\uE068;" // DIGIT TWO -"\u0C69>\uE069;" // DIGIT THREE -"\u0C6A>\uE06A;" // DIGIT FOUR -"\u0C6B>\uE06B;" // DIGIT FIVE -"\u0C6C>\uE06C;" // DIGIT SIX -"\u0C6D>\uE06D;" // DIGIT SEVEN -"\u0C6E>\uE06E;" // DIGIT EIGHT -"\u0C6F>\uE06F;" // DIGIT NINE -// :: NFC (NFD) ; -// eof - } -} diff --git a/icuSources/data/translit/translit_index.txt b/icuSources/data/translit/translit_index.txt deleted file mode 100644 index c128a00b..00000000 --- a/icuSources/data/translit/translit_index.txt +++ /dev/null @@ -1,266 +0,0 @@ -//-------------------------------------------------------------------- -// Copyright (c) 1999-2002, International Business Machines -// Corporation and others. All Rights Reserved. -//-------------------------------------------------------------------- -// THIS IS A MACHINE-GENERATED FILE -// Tool: dumpicurules.bat -// Source: Transliterator_index.txt -// Date: Sat Jul 27 10:31:01 2002 -//-------------------------------------------------------------------- - -//-------------------------------------------------------------------- -// N.B.: This file has been generated mechanically from the -// corresponding ICU4J file, which is the master file that receives -// primary updates. The colon-delimited fields have been split into -// separate strings. For 'file' and 'internal' lines, the encoding -// field has been deleted, since the encoding is processed at build -// time in ICU4C. Certain large rule sets not intended for general -// use have been commented out with the notation "Java only". -//-------------------------------------------------------------------- - -translit_index { - RuleBasedTransliteratorIDs { -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -//-------------------------------------------------------------------- -// -// TRANSLITERATOR INDEX FILE. This file lists the non-algorithmic -// system transliterators. It allows arbitrary mappings between -// transliterator IDs and file names, and also allows the system to -// define aliases for transliterators, so that "Latin-Hangul", for -// example, can be implemented transparently as the compound -// "Latin-Jamo;Jamo-Hangul". Internal IDs may also be defined; these -// are invisible to the user, but can be composed together by the -// system to create visible transliterators. -// -// Blank lines and lines beginning with '#' are ignored. -// -// Lines in this file have one of the following forms (text not -// enclosed by <> is literal): -// -// :file::: -// :internal::: -// :alias: -// -// is the ID of the system transliterator being defined. These -// are public IDs enumerated by Transliterator.getAvailableIDs(), -// unless the second field is "internal". -// -// is a ResourceReader resource name. Currently these refer -// to file names under com/ibm/text/resources. This string is passed -// directly to ResourceReader, together with . -// -// is the character encoding to use when reading ; -// passed directly to ResourceReader. E.g., "UTF8". -// -// is either "FORWARD" or "REVERSE". -// -// is a string to be passed directly to -// Transliterator.getInstance(). The returned Transliterator object -// then has its ID changed to and is returned. - - -// Bidirectional rule files - -{ "Fullwidth-Halfwidth", "file", "t_FWidth_HWidth", "FORWARD" }, -{ "Halfwidth-Fullwidth", "file", "t_FWidth_HWidth", "REVERSE" }, - -{ "Latin-Cyrillic", "file", "t_Cyrl_Latn", "REVERSE" }, -{ "Cyrillic-Latin", "file", "t_Cyrl_Latn", "FORWARD" }, - -{ "Latin-Hebrew", "file", "t_Hebr_Latn", "REVERSE" }, -{ "Hebrew-Latin", "file", "t_Hebr_Latn", "FORWARD" }, - -{ "Latin-Arabic", "file", "t_Arab_Latn", "REVERSE" }, -{ "Arabic-Latin", "file", "t_Arab_Latn", "FORWARD" }, - -{ "Latin-Han", "file", "t_Hani_Latn", "REVERSE" }, -{ "Han-Latin", "file", "t_Hani_Latn", "FORWARD" }, - -// Comment these out; they are only for testing -// Latin-Han/definition:file:Transliterator_Han_Latin_Definition.txt:UTF8:REVERSE -// Han-Latin/definition:file:Transliterator_Han_Latin_Definition.txt:UTF8:FORWARD - -//Latin-Han/EDICT:file:Transliterator_Han_Latin_EDICT.txt:UTF8:REVERSE -//Han-Latin/EDICT:file:Transliterator_Han_Latin_EDICT.txt:UTF8:FORWARD - -{ "Latin-Greek", "file", "t_Grek_Latn", "REVERSE" }, -{ "Greek-Latin", "file", "t_Grek_Latn", "FORWARD" }, - -{ "Latin-Greek/UNGEGN", "file", "t_Grek_Latn_UNGEGN", "REVERSE" }, -{ "Greek-Latin/UNGEGN", "file", "t_Grek_Latn_UNGEGN", "FORWARD" }, - -{ "Latin-Katakana", "file", "t_Latn_Kana", "FORWARD" }, -{ "Katakana-Latin", "file", "t_Latn_Kana", "REVERSE" }, - -{ "Latin-Hiragana", "file", "t_Hira_Latn", "REVERSE" }, -{ "Hiragana-Latin", "file", "t_Hira_Latn", "FORWARD" }, - -//Thai Stuff: will change if we get \b into Transliterator - -// Java only: { "Thai-ThaiSemi", "internal", "-", "FORWARD" }, - -// Java only: { "Thai-ThaiLogical", "internal", "-", "FORWARD" }, -// Java only: { "ThaiLogical-Thai", "internal", "-", "REVERSE" }, - -// Java only: { "ThaiLogical-Latin", "internal", "-", "FORWARD" }, -// Java only: { "Latin-ThaiLogical", "internal", "-", "REVERSE" }, - -// Must use the order below! -// We need two separate passes because of the Thai vowel reversal -// Thai-Logical also converts spaces to semicolons. That has to be done before we insert latin spaces - -{ "Thai-Latin", "alias", "[[", "thai", "] \u0E01-\u0E3A\u0E40-\u0E5B];NFD;Thai-ThaiSemi;Any-BreakInternal;Thai-ThaiLogical;ThaiLogical-Latin;NFC", "" }, -{ "Latin-Thai", "alias", "[[", "Latin", "][", "Mn", "][", "Me", "] \ \;0-9|~\u00A7\u00AB\u00BB\u02B9\u0374\u2021];NFD;Latin-ThaiLogical;ThaiLogical-Thai;NFC", "" }, - -// end of Thai Stuff - -{ "Hiragana-Katakana", "file", "t_Hira_Kana", "FORWARD" }, -{ "Katakana-Hiragana", "file", "t_Hira_Kana", "REVERSE" }, - -{ "Any-Accents", "file", "t_Any_Accents", "FORWARD" }, -{ "Accents-Any", "file", "t_Any_Accents", "REVERSE" }, - -{ "Any-Publishing", "file", "t_Any_Publishing", "FORWARD" }, -{ "Publishing-Any", "file", "t_Any_Publishing", "REVERSE" }, - -// Korean -// N.B. Don't end Latin-Jamo with NFC; that produces Hangul. For -// Hangul output use Latin-Hangul. - -{ "LowerLatin-Jamo", "internal", "t_Latn_Jamo", "FORWARD" }, -{ "Jamo-LowerLatin", "internal", "t_Latn_Jamo", "REVERSE" }, -{ "Latin-Jamo", "alias", "['A-Za-z\u00C0-\u00C5\u00C7-\u00CF\u00D1-\u00D6\u00D9-\u00DD\u00E0-\u00E5\u00E7-\u00EF\u00F1-\u00F6\u00F9-\u00FD\u00FF-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E1\u01E6-\u01ED\u01F0\u01F4-\u01F5\u01F8-\u01FB\u0200-\u021B\u021E-\u021F\u0226-\u0233\u1E00-\u1E99\u1EA0-\u1EF9\u212A-\u212B];NFD;Lower;LowerLatin-Jamo", "" }, -{ "Jamo-Latin", "alias", "['\u1100-\u1112\u1161-\u1175\u11A8-\u11C2\uAC00-\uD7A3];NFD;Jamo-LowerLatin;NFC", "" }, -{ "Latin-Hangul", "alias", "['A-Za-z\u00C0-\u00C5\u00C7-\u00CF\u00D1-\u00D6\u00D9-\u00DD\u00E0-\u00E5\u00E7-\u00EF\u00F1-\u00F6\u00F9-\u00FD\u00FF-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E1\u01E6-\u01ED\u01F0\u01F4-\u01F5\u01F8-\u01FB\u0200-\u021B\u021E-\u021F\u0226-\u0233\u1E00-\u1E99\u1EA0-\u1EF9\u212A-\u212B];NFD;Lower;LowerLatin-Jamo;NFC", "" }, -{ "Hangul-Latin", "alias", "['\u1100-\u1112\u1161-\u1175\u11A8-\u11C2\u3131-\u313F\u3141-\u3143\u3145-\u3163\u3200-\u321C\u3260-\u327B\uAC00-\uD7A3\uFF07\uFFA1-\uFFAF\uFFB1-\uFFB3\uFFB5-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC];NFKD;Jamo-LowerLatin;NFC", "" }, - -// Inter-Indic composed rules -{ "Latin-InterIndic", "internal", "t_Latn_InterIndic", "FORWARD" }, -{ "Devanagari-InterIndic", "internal", "t_Deva_InterIndic", "FORWARD" }, -{ "Bengali-InterIndic", "internal", "t_Beng_InterIndic", "FORWARD" }, -{ "Gurmukhi-InterIndic", "internal", "t_Guru_InterIndic", "FORWARD" }, -{ "Gujarati-InterIndic", "internal", "t_Gujr_InterIndic", "FORWARD" }, -{ "Oriya-InterIndic", "internal", "t_Orya_InterIndic", "FORWARD" }, -{ "Tamil-InterIndic", "internal", "t_Taml_InterIndic", "FORWARD" }, -{ "Telugu-InterIndic", "internal", "t_Telu_InterIndic", "FORWARD" }, -{ "Kannada-InterIndic", "internal", "t_Knda_InterIndic", "FORWARD" }, -{ "Malayalam-InterIndic", "internal", "t_Mlym_InterIndic", "FORWARD" }, - -{ "InterIndic-Latin", "internal", "t_InterIndic_Latn", "FORWARD" }, -{ "InterIndic-Devanagari", "internal", "t_InterIndic_Deva", "FORWARD" }, -{ "InterIndic-Bengali", "internal", "t_InterIndic_Beng", "FORWARD" }, -{ "InterIndic-Gurmukhi", "internal", "t_InterIndic_Guru", "FORWARD" }, -{ "InterIndic-Gujarati", "internal", "t_InterIndic_Gujr", "FORWARD" }, -{ "InterIndic-Oriya", "internal", "t_InterIndic_Orya", "FORWARD" }, -{ "InterIndic-Tamil", "internal", "t_InterIndic_Taml", "FORWARD" }, -{ "InterIndic-Telugu", "internal", "t_InterIndic_Telu", "FORWARD" }, -{ "InterIndic-Kannada", "internal", "t_InterIndic_Knda", "FORWARD" }, -{ "InterIndic-Malayalam", "internal", "t_InterIndic_Mlym", "FORWARD" }, - -//Latin-Indic transliterators -{ "Latin-Devanagari", "alias", "['.0-9A-Za-z~\u00C0-\u00C5\u00C7-\u00CF\u00D1-\u00D6\u00D9-\u00DD\u00E0-\u00E5\u00E7-\u00EF\u00F1-\u00F6\u00F9-\u00FD\u00FF-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E3\u01E6-\u01ED\u01F0\u01F4-\u01F5\u01F8-\u021B\u021E-\u021F\u0226-\u0233\u0301\u0303-\u0304\u0306-\u0307\u0310\u0314-\u0315\u0323\u0325\u0331\u0341\u0344\u0385-\u0386\u0388-\u038A\u038C\u038E-\u0390\u03AC-\u03B0\u03CC-\u03CE\u03D3\u0403\u040C\u040E\u0419\u0439\u0453\u045C\u045E\u04C1-\u04C2\u04D0-\u04D1\u04D6-\u04D7\u04E2-\u04E3\u04EE-\u04EF\u1E00-\u1E99\u1EA0-\u1EF9\u1F01\u1F03-\u1F05\u1F07\u1F09\u1F0B-\u1F0D\u1F0F\u1F11\u1F13-\u1F15\u1F19\u1F1B-\u1F1D\u1F21\u1F23-\u1F25\u1F27\u1F29\u1F2B-\u1F2D\u1F2F\u1F31\u1F33-\u1F35\u1F37\u1F39\u1F3B-\u1F3D\u1F3F\u1F41\u1F43-\u1F45\u1F49\u1F4B-\u1F4D\u1F51\u1F53-\u1F55\u1F57\u1F59\u1F5B\u1F5D\u1F5F\u1F61\u1F63-\u1F65\u1F67\u1F69\u1F6B-\u1F6D\u1F6F\u1F71\u1F73\u1F75\u1F77\u1F79\u1F7B\u1F7D\u1F81\u1F83-\u1F85\u1F87\u1F89\u1F8B-\u1F8D\u1F8F\u1F91\u1F93-\u1F95\u1F97\u1F99\u1F9B-\u1F9D\u1F9F\u1FA1\u1FA3-\u1FA5\u1FA7\u1FA9\u1FAB-\u1FAD\u1FAF-\u1FB1\u1FB4\u1FB8-\u1FB9\u1FBB\u1FC4\u1FC9\u1FCB\u1FCE\u1FD0-\u1FD1\u1FD3\u1FD8-\u1FD9\u1FDB\u1FDE\u1FE0-\u1FE1\u1FE3\u1FE5\u1FE8-\u1FE9\u1FEB-\u1FEC\u1FEE\u1FF4\u1FF9\u1FFB\u212A-\u212B\uE04D\uE064];NFD;Lower;Latin-InterIndic;InterIndic-Devanagari;NFC", "" }, -{ "Latin-Bengali", "alias", "['.0-9A-Za-z~\u00C0-\u00C5\u00C7-\u00CF\u00D1-\u00D6\u00D9-\u00DD\u00E0-\u00E5\u00E7-\u00EF\u00F1-\u00F6\u00F9-\u00FD\u00FF-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E3\u01E6-\u01ED\u01F0\u01F4-\u01F5\u01F8-\u021B\u021E-\u021F\u0226-\u0233\u0301\u0303-\u0304\u0306-\u0307\u0310\u0314-\u0315\u0323\u0325\u0331\u0341\u0344\u0385-\u0386\u0388-\u038A\u038C\u038E-\u0390\u03AC-\u03B0\u03CC-\u03CE\u03D3\u0403\u040C\u040E\u0419\u0439\u0453\u045C\u045E\u04C1-\u04C2\u04D0-\u04D1\u04D6-\u04D7\u04E2-\u04E3\u04EE-\u04EF\u1E00-\u1E99\u1EA0-\u1EF9\u1F01\u1F03-\u1F05\u1F07\u1F09\u1F0B-\u1F0D\u1F0F\u1F11\u1F13-\u1F15\u1F19\u1F1B-\u1F1D\u1F21\u1F23-\u1F25\u1F27\u1F29\u1F2B-\u1F2D\u1F2F\u1F31\u1F33-\u1F35\u1F37\u1F39\u1F3B-\u1F3D\u1F3F\u1F41\u1F43-\u1F45\u1F49\u1F4B-\u1F4D\u1F51\u1F53-\u1F55\u1F57\u1F59\u1F5B\u1F5D\u1F5F\u1F61\u1F63-\u1F65\u1F67\u1F69\u1F6B-\u1F6D\u1F6F\u1F71\u1F73\u1F75\u1F77\u1F79\u1F7B\u1F7D\u1F81\u1F83-\u1F85\u1F87\u1F89\u1F8B-\u1F8D\u1F8F\u1F91\u1F93-\u1F95\u1F97\u1F99\u1F9B-\u1F9D\u1F9F\u1FA1\u1FA3-\u1FA5\u1FA7\u1FA9\u1FAB-\u1FAD\u1FAF-\u1FB1\u1FB4\u1FB8-\u1FB9\u1FBB\u1FC4\u1FC9\u1FCB\u1FCE\u1FD0-\u1FD1\u1FD3\u1FD8-\u1FD9\u1FDB\u1FDE\u1FE0-\u1FE1\u1FE3\u1FE5\u1FE8-\u1FE9\u1FEB-\u1FEC\u1FEE\u1FF4\u1FF9\u1FFB\u212A-\u212B\uE04D\uE064];NFD;Lower;Latin-InterIndic;InterIndic-Bengali;NFC", "" }, -{ "Latin-Gurmukhi", "alias", "['.0-9A-Za-z~\u00C0-\u00C5\u00C7-\u00CF\u00D1-\u00D6\u00D9-\u00DD\u00E0-\u00E5\u00E7-\u00EF\u00F1-\u00F6\u00F9-\u00FD\u00FF-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E3\u01E6-\u01ED\u01F0\u01F4-\u01F5\u01F8-\u021B\u021E-\u021F\u0226-\u0233\u0301\u0303-\u0304\u0306-\u0307\u0310\u0314-\u0315\u0323\u0325\u0331\u0341\u0344\u0385-\u0386\u0388-\u038A\u038C\u038E-\u0390\u03AC-\u03B0\u03CC-\u03CE\u03D3\u0403\u040C\u040E\u0419\u0439\u0453\u045C\u045E\u04C1-\u04C2\u04D0-\u04D1\u04D6-\u04D7\u04E2-\u04E3\u04EE-\u04EF\u1E00-\u1E99\u1EA0-\u1EF9\u1F01\u1F03-\u1F05\u1F07\u1F09\u1F0B-\u1F0D\u1F0F\u1F11\u1F13-\u1F15\u1F19\u1F1B-\u1F1D\u1F21\u1F23-\u1F25\u1F27\u1F29\u1F2B-\u1F2D\u1F2F\u1F31\u1F33-\u1F35\u1F37\u1F39\u1F3B-\u1F3D\u1F3F\u1F41\u1F43-\u1F45\u1F49\u1F4B-\u1F4D\u1F51\u1F53-\u1F55\u1F57\u1F59\u1F5B\u1F5D\u1F5F\u1F61\u1F63-\u1F65\u1F67\u1F69\u1F6B-\u1F6D\u1F6F\u1F71\u1F73\u1F75\u1F77\u1F79\u1F7B\u1F7D\u1F81\u1F83-\u1F85\u1F87\u1F89\u1F8B-\u1F8D\u1F8F\u1F91\u1F93-\u1F95\u1F97\u1F99\u1F9B-\u1F9D\u1F9F\u1FA1\u1FA3-\u1FA5\u1FA7\u1FA9\u1FAB-\u1FAD\u1FAF-\u1FB1\u1FB4\u1FB8-\u1FB9\u1FBB\u1FC4\u1FC9\u1FCB\u1FCE\u1FD0-\u1FD1\u1FD3\u1FD8-\u1FD9\u1FDB\u1FDE\u1FE0-\u1FE1\u1FE3\u1FE5\u1FE8-\u1FE9\u1FEB-\u1FEC\u1FEE\u1FF4\u1FF9\u1FFB\u212A-\u212B\uE04D\uE064];NFD;Lower;Latin-InterIndic;InterIndic-Gurmukhi;NFC", "" }, -{ "Latin-Gujarati", "alias", "['.0-9A-Za-z~\u00C0-\u00C5\u00C7-\u00CF\u00D1-\u00D6\u00D9-\u00DD\u00E0-\u00E5\u00E7-\u00EF\u00F1-\u00F6\u00F9-\u00FD\u00FF-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E3\u01E6-\u01ED\u01F0\u01F4-\u01F5\u01F8-\u021B\u021E-\u021F\u0226-\u0233\u0301\u0303-\u0304\u0306-\u0307\u0310\u0314-\u0315\u0323\u0325\u0331\u0341\u0344\u0385-\u0386\u0388-\u038A\u038C\u038E-\u0390\u03AC-\u03B0\u03CC-\u03CE\u03D3\u0403\u040C\u040E\u0419\u0439\u0453\u045C\u045E\u04C1-\u04C2\u04D0-\u04D1\u04D6-\u04D7\u04E2-\u04E3\u04EE-\u04EF\u1E00-\u1E99\u1EA0-\u1EF9\u1F01\u1F03-\u1F05\u1F07\u1F09\u1F0B-\u1F0D\u1F0F\u1F11\u1F13-\u1F15\u1F19\u1F1B-\u1F1D\u1F21\u1F23-\u1F25\u1F27\u1F29\u1F2B-\u1F2D\u1F2F\u1F31\u1F33-\u1F35\u1F37\u1F39\u1F3B-\u1F3D\u1F3F\u1F41\u1F43-\u1F45\u1F49\u1F4B-\u1F4D\u1F51\u1F53-\u1F55\u1F57\u1F59\u1F5B\u1F5D\u1F5F\u1F61\u1F63-\u1F65\u1F67\u1F69\u1F6B-\u1F6D\u1F6F\u1F71\u1F73\u1F75\u1F77\u1F79\u1F7B\u1F7D\u1F81\u1F83-\u1F85\u1F87\u1F89\u1F8B-\u1F8D\u1F8F\u1F91\u1F93-\u1F95\u1F97\u1F99\u1F9B-\u1F9D\u1F9F\u1FA1\u1FA3-\u1FA5\u1FA7\u1FA9\u1FAB-\u1FAD\u1FAF-\u1FB1\u1FB4\u1FB8-\u1FB9\u1FBB\u1FC4\u1FC9\u1FCB\u1FCE\u1FD0-\u1FD1\u1FD3\u1FD8-\u1FD9\u1FDB\u1FDE\u1FE0-\u1FE1\u1FE3\u1FE5\u1FE8-\u1FE9\u1FEB-\u1FEC\u1FEE\u1FF4\u1FF9\u1FFB\u212A-\u212B\uE04D\uE064];NFD;Lower;Latin-InterIndic;InterIndic-Gujarati;NFC", "" }, -{ "Latin-Oriya", "alias", "['.0-9A-Za-z~\u00C0-\u00C5\u00C7-\u00CF\u00D1-\u00D6\u00D9-\u00DD\u00E0-\u00E5\u00E7-\u00EF\u00F1-\u00F6\u00F9-\u00FD\u00FF-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E3\u01E6-\u01ED\u01F0\u01F4-\u01F5\u01F8-\u021B\u021E-\u021F\u0226-\u0233\u0301\u0303-\u0304\u0306-\u0307\u0310\u0314-\u0315\u0323\u0325\u0331\u0341\u0344\u0385-\u0386\u0388-\u038A\u038C\u038E-\u0390\u03AC-\u03B0\u03CC-\u03CE\u03D3\u0403\u040C\u040E\u0419\u0439\u0453\u045C\u045E\u04C1-\u04C2\u04D0-\u04D1\u04D6-\u04D7\u04E2-\u04E3\u04EE-\u04EF\u1E00-\u1E99\u1EA0-\u1EF9\u1F01\u1F03-\u1F05\u1F07\u1F09\u1F0B-\u1F0D\u1F0F\u1F11\u1F13-\u1F15\u1F19\u1F1B-\u1F1D\u1F21\u1F23-\u1F25\u1F27\u1F29\u1F2B-\u1F2D\u1F2F\u1F31\u1F33-\u1F35\u1F37\u1F39\u1F3B-\u1F3D\u1F3F\u1F41\u1F43-\u1F45\u1F49\u1F4B-\u1F4D\u1F51\u1F53-\u1F55\u1F57\u1F59\u1F5B\u1F5D\u1F5F\u1F61\u1F63-\u1F65\u1F67\u1F69\u1F6B-\u1F6D\u1F6F\u1F71\u1F73\u1F75\u1F77\u1F79\u1F7B\u1F7D\u1F81\u1F83-\u1F85\u1F87\u1F89\u1F8B-\u1F8D\u1F8F\u1F91\u1F93-\u1F95\u1F97\u1F99\u1F9B-\u1F9D\u1F9F\u1FA1\u1FA3-\u1FA5\u1FA7\u1FA9\u1FAB-\u1FAD\u1FAF-\u1FB1\u1FB4\u1FB8-\u1FB9\u1FBB\u1FC4\u1FC9\u1FCB\u1FCE\u1FD0-\u1FD1\u1FD3\u1FD8-\u1FD9\u1FDB\u1FDE\u1FE0-\u1FE1\u1FE3\u1FE5\u1FE8-\u1FE9\u1FEB-\u1FEC\u1FEE\u1FF4\u1FF9\u1FFB\u212A-\u212B\uE04D\uE064];NFD;Lower;Latin-InterIndic;InterIndic-Oriya;NFC", "" }, -{ "Latin-Tamil", "alias", "['.0-9A-Za-z~\u00C0-\u00C5\u00C7-\u00CF\u00D1-\u00D6\u00D9-\u00DD\u00E0-\u00E5\u00E7-\u00EF\u00F1-\u00F6\u00F9-\u00FD\u00FF-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E3\u01E6-\u01ED\u01F0\u01F4-\u01F5\u01F8-\u021B\u021E-\u021F\u0226-\u0233\u0301\u0303-\u0304\u0306-\u0307\u0310\u0314-\u0315\u0323\u0325\u0331\u0341\u0344\u0385-\u0386\u0388-\u038A\u038C\u038E-\u0390\u03AC-\u03B0\u03CC-\u03CE\u03D3\u0403\u040C\u040E\u0419\u0439\u0453\u045C\u045E\u04C1-\u04C2\u04D0-\u04D1\u04D6-\u04D7\u04E2-\u04E3\u04EE-\u04EF\u1E00-\u1E99\u1EA0-\u1EF9\u1F01\u1F03-\u1F05\u1F07\u1F09\u1F0B-\u1F0D\u1F0F\u1F11\u1F13-\u1F15\u1F19\u1F1B-\u1F1D\u1F21\u1F23-\u1F25\u1F27\u1F29\u1F2B-\u1F2D\u1F2F\u1F31\u1F33-\u1F35\u1F37\u1F39\u1F3B-\u1F3D\u1F3F\u1F41\u1F43-\u1F45\u1F49\u1F4B-\u1F4D\u1F51\u1F53-\u1F55\u1F57\u1F59\u1F5B\u1F5D\u1F5F\u1F61\u1F63-\u1F65\u1F67\u1F69\u1F6B-\u1F6D\u1F6F\u1F71\u1F73\u1F75\u1F77\u1F79\u1F7B\u1F7D\u1F81\u1F83-\u1F85\u1F87\u1F89\u1F8B-\u1F8D\u1F8F\u1F91\u1F93-\u1F95\u1F97\u1F99\u1F9B-\u1F9D\u1F9F\u1FA1\u1FA3-\u1FA5\u1FA7\u1FA9\u1FAB-\u1FAD\u1FAF-\u1FB1\u1FB4\u1FB8-\u1FB9\u1FBB\u1FC4\u1FC9\u1FCB\u1FCE\u1FD0-\u1FD1\u1FD3\u1FD8-\u1FD9\u1FDB\u1FDE\u1FE0-\u1FE1\u1FE3\u1FE5\u1FE8-\u1FE9\u1FEB-\u1FEC\u1FEE\u1FF4\u1FF9\u1FFB\u212A-\u212B\uE04D\uE064];NFD;Lower;Latin-InterIndic;InterIndic-Tamil;NFC", "" }, -{ "Latin-Telugu", "alias", "['.0-9A-Za-z~\u00C0-\u00C5\u00C7-\u00CF\u00D1-\u00D6\u00D9-\u00DD\u00E0-\u00E5\u00E7-\u00EF\u00F1-\u00F6\u00F9-\u00FD\u00FF-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E3\u01E6-\u01ED\u01F0\u01F4-\u01F5\u01F8-\u021B\u021E-\u021F\u0226-\u0233\u0301\u0303-\u0304\u0306-\u0307\u0310\u0314-\u0315\u0323\u0325\u0331\u0341\u0344\u0385-\u0386\u0388-\u038A\u038C\u038E-\u0390\u03AC-\u03B0\u03CC-\u03CE\u03D3\u0403\u040C\u040E\u0419\u0439\u0453\u045C\u045E\u04C1-\u04C2\u04D0-\u04D1\u04D6-\u04D7\u04E2-\u04E3\u04EE-\u04EF\u1E00-\u1E99\u1EA0-\u1EF9\u1F01\u1F03-\u1F05\u1F07\u1F09\u1F0B-\u1F0D\u1F0F\u1F11\u1F13-\u1F15\u1F19\u1F1B-\u1F1D\u1F21\u1F23-\u1F25\u1F27\u1F29\u1F2B-\u1F2D\u1F2F\u1F31\u1F33-\u1F35\u1F37\u1F39\u1F3B-\u1F3D\u1F3F\u1F41\u1F43-\u1F45\u1F49\u1F4B-\u1F4D\u1F51\u1F53-\u1F55\u1F57\u1F59\u1F5B\u1F5D\u1F5F\u1F61\u1F63-\u1F65\u1F67\u1F69\u1F6B-\u1F6D\u1F6F\u1F71\u1F73\u1F75\u1F77\u1F79\u1F7B\u1F7D\u1F81\u1F83-\u1F85\u1F87\u1F89\u1F8B-\u1F8D\u1F8F\u1F91\u1F93-\u1F95\u1F97\u1F99\u1F9B-\u1F9D\u1F9F\u1FA1\u1FA3-\u1FA5\u1FA7\u1FA9\u1FAB-\u1FAD\u1FAF-\u1FB1\u1FB4\u1FB8-\u1FB9\u1FBB\u1FC4\u1FC9\u1FCB\u1FCE\u1FD0-\u1FD1\u1FD3\u1FD8-\u1FD9\u1FDB\u1FDE\u1FE0-\u1FE1\u1FE3\u1FE5\u1FE8-\u1FE9\u1FEB-\u1FEC\u1FEE\u1FF4\u1FF9\u1FFB\u212A-\u212B\uE04D\uE064];NFD;Lower;Latin-InterIndic;InterIndic-Telugu;NFC", "" }, -{ "Latin-Kannada", "alias", "['.0-9A-Za-z~\u00C0-\u00C5\u00C7-\u00CF\u00D1-\u00D6\u00D9-\u00DD\u00E0-\u00E5\u00E7-\u00EF\u00F1-\u00F6\u00F9-\u00FD\u00FF-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E3\u01E6-\u01ED\u01F0\u01F4-\u01F5\u01F8-\u021B\u021E-\u021F\u0226-\u0233\u0301\u0303-\u0304\u0306-\u0307\u0310\u0314-\u0315\u0323\u0325\u0331\u0341\u0344\u0385-\u0386\u0388-\u038A\u038C\u038E-\u0390\u03AC-\u03B0\u03CC-\u03CE\u03D3\u0403\u040C\u040E\u0419\u0439\u0453\u045C\u045E\u04C1-\u04C2\u04D0-\u04D1\u04D6-\u04D7\u04E2-\u04E3\u04EE-\u04EF\u1E00-\u1E99\u1EA0-\u1EF9\u1F01\u1F03-\u1F05\u1F07\u1F09\u1F0B-\u1F0D\u1F0F\u1F11\u1F13-\u1F15\u1F19\u1F1B-\u1F1D\u1F21\u1F23-\u1F25\u1F27\u1F29\u1F2B-\u1F2D\u1F2F\u1F31\u1F33-\u1F35\u1F37\u1F39\u1F3B-\u1F3D\u1F3F\u1F41\u1F43-\u1F45\u1F49\u1F4B-\u1F4D\u1F51\u1F53-\u1F55\u1F57\u1F59\u1F5B\u1F5D\u1F5F\u1F61\u1F63-\u1F65\u1F67\u1F69\u1F6B-\u1F6D\u1F6F\u1F71\u1F73\u1F75\u1F77\u1F79\u1F7B\u1F7D\u1F81\u1F83-\u1F85\u1F87\u1F89\u1F8B-\u1F8D\u1F8F\u1F91\u1F93-\u1F95\u1F97\u1F99\u1F9B-\u1F9D\u1F9F\u1FA1\u1FA3-\u1FA5\u1FA7\u1FA9\u1FAB-\u1FAD\u1FAF-\u1FB1\u1FB4\u1FB8-\u1FB9\u1FBB\u1FC4\u1FC9\u1FCB\u1FCE\u1FD0-\u1FD1\u1FD3\u1FD8-\u1FD9\u1FDB\u1FDE\u1FE0-\u1FE1\u1FE3\u1FE5\u1FE8-\u1FE9\u1FEB-\u1FEC\u1FEE\u1FF4\u1FF9\u1FFB\u212A-\u212B\uE04D\uE064];NFD;Lower;Latin-InterIndic;InterIndic-Kannada;NFC", "" }, -{ "Latin-Malayalam", "alias", "['.0-9A-Za-z~\u00C0-\u00C5\u00C7-\u00CF\u00D1-\u00D6\u00D9-\u00DD\u00E0-\u00E5\u00E7-\u00EF\u00F1-\u00F6\u00F9-\u00FD\u00FF-\u010F\u0112-\u0125\u0128-\u0130\u0134-\u0137\u0139-\u013E\u0143-\u0148\u014C-\u0151\u0154-\u0165\u0168-\u017E\u01A0-\u01A1\u01AF-\u01B0\u01CD-\u01DC\u01DE-\u01E3\u01E6-\u01ED\u01F0\u01F4-\u01F5\u01F8-\u021B\u021E-\u021F\u0226-\u0233\u0301\u0303-\u0304\u0306-\u0307\u0310\u0314-\u0315\u0323\u0325\u0331\u0341\u0344\u0385-\u0386\u0388-\u038A\u038C\u038E-\u0390\u03AC-\u03B0\u03CC-\u03CE\u03D3\u0403\u040C\u040E\u0419\u0439\u0453\u045C\u045E\u04C1-\u04C2\u04D0-\u04D1\u04D6-\u04D7\u04E2-\u04E3\u04EE-\u04EF\u1E00-\u1E99\u1EA0-\u1EF9\u1F01\u1F03-\u1F05\u1F07\u1F09\u1F0B-\u1F0D\u1F0F\u1F11\u1F13-\u1F15\u1F19\u1F1B-\u1F1D\u1F21\u1F23-\u1F25\u1F27\u1F29\u1F2B-\u1F2D\u1F2F\u1F31\u1F33-\u1F35\u1F37\u1F39\u1F3B-\u1F3D\u1F3F\u1F41\u1F43-\u1F45\u1F49\u1F4B-\u1F4D\u1F51\u1F53-\u1F55\u1F57\u1F59\u1F5B\u1F5D\u1F5F\u1F61\u1F63-\u1F65\u1F67\u1F69\u1F6B-\u1F6D\u1F6F\u1F71\u1F73\u1F75\u1F77\u1F79\u1F7B\u1F7D\u1F81\u1F83-\u1F85\u1F87\u1F89\u1F8B-\u1F8D\u1F8F\u1F91\u1F93-\u1F95\u1F97\u1F99\u1F9B-\u1F9D\u1F9F\u1FA1\u1FA3-\u1FA5\u1FA7\u1FA9\u1FAB-\u1FAD\u1FAF-\u1FB1\u1FB4\u1FB8-\u1FB9\u1FBB\u1FC4\u1FC9\u1FCB\u1FCE\u1FD0-\u1FD1\u1FD3\u1FD8-\u1FD9\u1FDB\u1FDE\u1FE0-\u1FE1\u1FE3\u1FE5\u1FE8-\u1FE9\u1FEB-\u1FEC\u1FEE\u1FF4\u1FF9\u1FFB\u212A-\u212B\uE04D\uE064];NFD;Lower;Latin-InterIndic;InterIndic-Malayalam;NFC", "" }, - -//Indic-Latin transliterators -{ "Devanagari-Latin", "alias", "[\u0901-\u0903\u0905-\u0939\u093C-\u094D\u0950-\u0954\u0958-\u096F];NFD;Devanagari-InterIndic;InterIndic-Latin;NFC", "" }, -{ "Bengali-Latin", "alias", "[\u0964-\u0965\u0981-\u0983\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC\u09BE-\u09C4\u09C7-\u09C8\u09CB-\u09CD\u09D7\u09DC-\u09DD\u09DF-\u09E3\u09E6-\u09FA];NFD;Bengali-InterIndic;InterIndic-Latin;NFC", "" }, -{ "Gurmukhi-Latin", "alias", "[\u0964-\u0965\u0A02\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A3C\u0A3E-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A59-\u0A5C\u0A5E\u0A66-\u0A74];NFD;Gurmukhi-InterIndic;InterIndic-Latin;NFC", "" }, -{ "Gujarati-Latin", "alias", "[\u0964-\u0965\u0A81-\u0A83\u0A85-\u0A8B\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0\u0AE6-\u0AEF];NFD;Gujarati-InterIndic;InterIndic-Latin;NFC", "" }, -{ "Oriya-Latin", "alias", "[\u0B01-\u0B03\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B36-\u0B39\u0B3C-\u0B43\u0B47-\u0B48\u0B4B-\u0B4D\u0B56-\u0B57\u0B5C-\u0B5D\u0B5F-\u0B61\u0B66-\u0B70];NFD;Oriya-InterIndic;InterIndic-Latin;NFC", "" }, -{ "Tamil-Latin", "alias", "[0\u0B82-\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0BE7-\u0BF2];NFD;Tamil-InterIndic;InterIndic-Latin;NFC", "" }, -{ "Telugu-Latin", "alias", "[\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C60-\u0C61\u0C66-\u0C6F];NFD;Telugu-InterIndic;InterIndic-Latin;NFC", "" }, -{ "Kannada-Latin", "alias", "[\u0C82-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5-\u0CD6\u0CDE\u0CE0-\u0CE1\u0CE6-\u0CEF];NFD;Kannada-InterIndic;InterIndic-Latin;NFC", "" }, -{ "Malayalam-Latin", "alias", "[\u0D02-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D3E-\u0D43\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D60-\u0D61\u0D66-\u0D6F];NFD;Malayalam-InterIndic;InterIndic-Latin;NFC", "" }, - -{ "Devanagari-Bengali", "alias", "[\u0901-\u0903\u0905-\u0939\u093C-\u094D\u0950-\u0954\u0958-\u096F];NFD;Devanagari-InterIndic;InterIndic-Bengali;NFC", "" }, -{ "Devanagari-Gurmukhi", "alias", "[\u0901-\u0903\u0905-\u0939\u093C-\u094D\u0950-\u0954\u0958-\u096F];NFD;Devanagari-InterIndic;InterIndic-Gurmukhi;NFC", "" }, -{ "Devanagari-Gujarati", "alias", "[\u0901-\u0903\u0905-\u0939\u093C-\u094D\u0950-\u0954\u0958-\u096F];NFD;Devanagari-InterIndic;InterIndic-Gujarati;NFC", "" }, -{ "Devanagari-Oriya", "alias", "[\u0901-\u0903\u0905-\u0939\u093C-\u094D\u0950-\u0954\u0958-\u096F];NFD;Devanagari-InterIndic;InterIndic-Oriya;NFC", "" }, -{ "Devanagari-Tamil", "alias", "[\u0901-\u0903\u0905-\u0939\u093C-\u094D\u0950-\u0954\u0958-\u096F];NFD;Devanagari-InterIndic;InterIndic-Tamil;NFC", "" }, -{ "Devanagari-Telugu", "alias", "[\u0901-\u0903\u0905-\u0939\u093C-\u094D\u0950-\u0954\u0958-\u096F];NFD;Devanagari-InterIndic;InterIndic-Telugu;NFC", "" }, -{ "Devanagari-Kannada", "alias", "[\u0901-\u0903\u0905-\u0939\u093C-\u094D\u0950-\u0954\u0958-\u096F];NFD;Devanagari-InterIndic;InterIndic-Kannada;NFC", "" }, -{ "Devanagari-Malayalam", "alias", "[\u0901-\u0903\u0905-\u0939\u093C-\u094D\u0950-\u0954\u0958-\u096F];NFD;Devanagari-InterIndic;InterIndic-Malayalam;NFC", "" }, - -{ "Bengali-Devanagari", "alias", "[\u0964-\u0965\u0981-\u0983\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC\u09BE-\u09C4\u09C7-\u09C8\u09CB-\u09CD\u09D7\u09DC-\u09DD\u09DF-\u09E3\u09E6-\u09FA];NFD;Bengali-InterIndic;InterIndic-Devanagari;NFC", "" }, -{ "Bengali-Gurmukhi", "alias", "[\u0964-\u0965\u0981-\u0983\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC\u09BE-\u09C4\u09C7-\u09C8\u09CB-\u09CD\u09D7\u09DC-\u09DD\u09DF-\u09E3\u09E6-\u09FA];NFD;Bengali-InterIndic;InterIndic-Gurmukhi;NFC", "" }, -{ "Bengali-Gujarati", "alias", "[\u0964-\u0965\u0981-\u0983\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC\u09BE-\u09C4\u09C7-\u09C8\u09CB-\u09CD\u09D7\u09DC-\u09DD\u09DF-\u09E3\u09E6-\u09FA];NFD;Bengali-InterIndic;InterIndic-Gujarati;NFC", "" }, -{ "Bengali-Oriya", "alias", "[\u0964-\u0965\u0981-\u0983\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC\u09BE-\u09C4\u09C7-\u09C8\u09CB-\u09CD\u09D7\u09DC-\u09DD\u09DF-\u09E3\u09E6-\u09FA];NFD;Bengali-InterIndic;InterIndic-Oriya;NFC", "" }, -{ "Bengali-Tamil", "alias", "[\u0964-\u0965\u0981-\u0983\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC\u09BE-\u09C4\u09C7-\u09C8\u09CB-\u09CD\u09D7\u09DC-\u09DD\u09DF-\u09E3\u09E6-\u09FA];NFD;Bengali-InterIndic;InterIndic-Tamil;NFC", "" }, -{ "Bengali-Telugu", "alias", "[\u0964-\u0965\u0981-\u0983\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC\u09BE-\u09C4\u09C7-\u09C8\u09CB-\u09CD\u09D7\u09DC-\u09DD\u09DF-\u09E3\u09E6-\u09FA];NFD;Bengali-InterIndic;InterIndic-Telugu;NFC", "" }, -{ "Bengali-Kannada", "alias", "[\u0964-\u0965\u0981-\u0983\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC\u09BE-\u09C4\u09C7-\u09C8\u09CB-\u09CD\u09D7\u09DC-\u09DD\u09DF-\u09E3\u09E6-\u09FA];NFD;Bengali-InterIndic;InterIndic-Kannada;NFC", "" }, -{ "Bengali-Malayalam", "alias", "[\u0964-\u0965\u0981-\u0983\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC\u09BE-\u09C4\u09C7-\u09C8\u09CB-\u09CD\u09D7\u09DC-\u09DD\u09DF-\u09E3\u09E6-\u09FA];NFD;Bengali-InterIndic;InterIndic-Malayalam;NFC", "" }, - -{ "Gurmukhi-Devanagari", "alias", "[\u0964-\u0965\u0A02\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A3C\u0A3E-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A59-\u0A5C\u0A5E\u0A66-\u0A74];NFD;Gurmukhi-InterIndic;InterIndic-Devanagari;NFC", "" }, -{ "Gurmukhi-Bengali", "alias", "[\u0964-\u0965\u0A02\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A3C\u0A3E-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A59-\u0A5C\u0A5E\u0A66-\u0A74];NFD;Gurmukhi-InterIndic;InterIndic-Bengali;NFC", "" }, -{ "Gurmukhi-Gujarati", "alias", "[\u0964-\u0965\u0A02\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A3C\u0A3E-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A59-\u0A5C\u0A5E\u0A66-\u0A74];NFD;Gurmukhi-InterIndic;InterIndic-Gujarati;NFC", "" }, -{ "Gurmukhi-Oriya", "alias", "[\u0964-\u0965\u0A02\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A3C\u0A3E-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A59-\u0A5C\u0A5E\u0A66-\u0A74];NFD;Gurmukhi-InterIndic;InterIndic-Oriya;NFC", "" }, -{ "Gurmukhi-Tamil", "alias", "[\u0964-\u0965\u0A02\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A3C\u0A3E-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A59-\u0A5C\u0A5E\u0A66-\u0A74];NFD;Gurmukhi-InterIndic;InterIndic-Tamil;NFC", "" }, -{ "Gurmukhi-Telugu", "alias", "[\u0964-\u0965\u0A02\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A3C\u0A3E-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A59-\u0A5C\u0A5E\u0A66-\u0A74];NFD;Gurmukhi-InterIndic;InterIndic-Telugu;NFC", "" }, -{ "Gurmukhi-Kannada", "alias", "[\u0964-\u0965\u0A02\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A3C\u0A3E-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A59-\u0A5C\u0A5E\u0A66-\u0A74];NFD;Gurmukhi-InterIndic;InterIndic-Kannada;NFC", "" }, -{ "Gurmukhi-Malayalam", "alias", "[\u0964-\u0965\u0A02\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A3C\u0A3E-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A59-\u0A5C\u0A5E\u0A66-\u0A74];NFD;Gurmukhi-InterIndic;InterIndic-Malayalam;NFC", "" }, - -{ "Gujarati-Devanagari", "alias", "[\u0964-\u0965\u0A81-\u0A83\u0A85-\u0A8B\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0\u0AE6-\u0AEF];NFD;Gujarati-InterIndic;InterIndic-Devanagari;NFC", "" }, -{ "Gujarati-Bengali", "alias", "[\u0964-\u0965\u0A81-\u0A83\u0A85-\u0A8B\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0\u0AE6-\u0AEF];NFD;Gujarati-InterIndic;InterIndic-Bengali;NFC", "" }, -{ "Gujarati-Gurmukhi", "alias", "[\u0964-\u0965\u0A81-\u0A83\u0A85-\u0A8B\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0\u0AE6-\u0AEF];NFD;Gujarati-InterIndic;InterIndic-Gurmukhi;NFC", "" }, -{ "Gujarati-Oriya", "alias", "[\u0964-\u0965\u0A81-\u0A83\u0A85-\u0A8B\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0\u0AE6-\u0AEF];NFD;Gujarati-InterIndic;InterIndic-Oriya;NFC", "" }, -{ "Gujarati-Tamil", "alias", "[\u0964-\u0965\u0A81-\u0A83\u0A85-\u0A8B\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0\u0AE6-\u0AEF];NFD;Gujarati-InterIndic;InterIndic-Tamil;NFC", "" }, -{ "Gujarati-Telugu", "alias", "[\u0964-\u0965\u0A81-\u0A83\u0A85-\u0A8B\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0\u0AE6-\u0AEF];NFD;Gujarati-InterIndic;InterIndic-Telugu;NFC", "" }, -{ "Gujarati-Kannada", "alias", "[\u0964-\u0965\u0A81-\u0A83\u0A85-\u0A8B\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0\u0AE6-\u0AEF];NFD;Gujarati-InterIndic;InterIndic-Kannada;NFC", "" }, -{ "Gujarati-Malayalam", "alias", "[\u0964-\u0965\u0A81-\u0A83\u0A85-\u0A8B\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0\u0AE6-\u0AEF];NFD;Gujarati-InterIndic;InterIndic-Malayalam;NFC", "" }, - -{ "Oriya-Devanagari", "alias", "[\u0B01-\u0B03\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B36-\u0B39\u0B3C-\u0B43\u0B47-\u0B48\u0B4B-\u0B4D\u0B56-\u0B57\u0B5C-\u0B5D\u0B5F-\u0B61\u0B66-\u0B70];NFD;Oriya-InterIndic;InterIndic-Devanagari;NFC", "" }, -{ "Oriya-Bengali", "alias", "[\u0B01-\u0B03\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B36-\u0B39\u0B3C-\u0B43\u0B47-\u0B48\u0B4B-\u0B4D\u0B56-\u0B57\u0B5C-\u0B5D\u0B5F-\u0B61\u0B66-\u0B70];NFD;Oriya-InterIndic;InterIndic-Bengali;NFC", "" }, -{ "Oriya-Gurmukhi", "alias", "[\u0B01-\u0B03\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B36-\u0B39\u0B3C-\u0B43\u0B47-\u0B48\u0B4B-\u0B4D\u0B56-\u0B57\u0B5C-\u0B5D\u0B5F-\u0B61\u0B66-\u0B70];NFD;Oriya-InterIndic;InterIndic-Gurmukhi;NFC", "" }, -{ "Oriya-Gujarati", "alias", "[\u0B01-\u0B03\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B36-\u0B39\u0B3C-\u0B43\u0B47-\u0B48\u0B4B-\u0B4D\u0B56-\u0B57\u0B5C-\u0B5D\u0B5F-\u0B61\u0B66-\u0B70];NFD;Oriya-InterIndic;InterIndic-Gujarati;NFC", "" }, -{ "Oriya-Tamil", "alias", "[\u0B01-\u0B03\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B36-\u0B39\u0B3C-\u0B43\u0B47-\u0B48\u0B4B-\u0B4D\u0B56-\u0B57\u0B5C-\u0B5D\u0B5F-\u0B61\u0B66-\u0B70];NFD;Oriya-InterIndic;InterIndic-Tamil;NFC", "" }, -{ "Oriya-Telugu", "alias", "[\u0B01-\u0B03\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B36-\u0B39\u0B3C-\u0B43\u0B47-\u0B48\u0B4B-\u0B4D\u0B56-\u0B57\u0B5C-\u0B5D\u0B5F-\u0B61\u0B66-\u0B70];NFD;Oriya-InterIndic;InterIndic-Telugu;NFC", "" }, -{ "Oriya-Kannada", "alias", "[\u0B01-\u0B03\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B36-\u0B39\u0B3C-\u0B43\u0B47-\u0B48\u0B4B-\u0B4D\u0B56-\u0B57\u0B5C-\u0B5D\u0B5F-\u0B61\u0B66-\u0B70];NFD;Oriya-InterIndic;InterIndic-Kannada;NFC", "" }, -{ "Oriya-Malayalam", "alias", "[\u0B01-\u0B03\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B36-\u0B39\u0B3C-\u0B43\u0B47-\u0B48\u0B4B-\u0B4D\u0B56-\u0B57\u0B5C-\u0B5D\u0B5F-\u0B61\u0B66-\u0B70];NFD;Oriya-InterIndic;InterIndic-Malayalam;NFC", "" }, - -{ "Tamil-Devanagari", "alias", "[0\u0B82-\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0BE7-\u0BF2];NFD;Tamil-InterIndic;InterIndic-Devanagari;NFC", "" }, -{ "Tamil-Bengali", "alias", "[0\u0B82-\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0BE7-\u0BF2];NFD;Tamil-InterIndic;InterIndic-Bengali;NFC", "" }, -{ "Tamil-Gurmukhi", "alias", "[0\u0B82-\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0BE7-\u0BF2];NFD;Tamil-InterIndic;InterIndic-Gurmukhi;NFC", "" }, -{ "Tamil-Gujarati", "alias", "[0\u0B82-\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0BE7-\u0BF2];NFD;Tamil-InterIndic;InterIndic-Gujarati;NFC", "" }, -{ "Tamil-Oriya", "alias", "[0\u0B82-\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0BE7-\u0BF2];NFD;Tamil-InterIndic;InterIndic-Oriya;NFC", "" }, -{ "Tamil-Telugu", "alias", "[0\u0B82-\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0BE7-\u0BF2];NFD;Tamil-InterIndic;InterIndic-Telugu;NFC", "" }, -{ "Tamil-Kannada", "alias", "[0\u0B82-\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0BE7-\u0BF2];NFD;Tamil-InterIndic;InterIndic-Kannada;NFC", "" }, -{ "Tamil-Malayalam", "alias", "[0\u0B82-\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0BE7-\u0BF2];NFD;Tamil-InterIndic;InterIndic-Malayalam;NFC", "" }, - -{ "Telugu-Devanagari", "alias", "[\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C60-\u0C61\u0C66-\u0C6F];NFD;Telugu-InterIndic;InterIndic-Devanagari;NFC", "" }, -{ "Telugu-Bengali", "alias", "[\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C60-\u0C61\u0C66-\u0C6F];NFD;Telugu-InterIndic;InterIndic-Bengali;NFC", "" }, -{ "Telugu-Gurmukhi", "alias", "[\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C60-\u0C61\u0C66-\u0C6F];NFD;Telugu-InterIndic;InterIndic-Gurmukhi;NFC", "" }, -{ "Telugu-Gujarati", "alias", "[\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C60-\u0C61\u0C66-\u0C6F];NFD;Telugu-InterIndic;InterIndic-Gujarati;NFC", "" }, -{ "Telugu-Oriya", "alias", "[\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C60-\u0C61\u0C66-\u0C6F];NFD;Telugu-InterIndic;InterIndic-Oriya;NFC", "" }, -{ "Telugu-Tamil", "alias", "[\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C60-\u0C61\u0C66-\u0C6F];NFD;Telugu-InterIndic;InterIndic-Tamil;NFC", "" }, -{ "Telugu-Kannada", "alias", "[\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C60-\u0C61\u0C66-\u0C6F];NFD;Telugu-InterIndic;InterIndic-Kannada;NFC", "" }, -{ "Telugu-Malayalam", "alias", "[\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C60-\u0C61\u0C66-\u0C6F];NFD;Telugu-InterIndic;InterIndic-Malayalam;NFC", "" }, - -{ "Kannada-Devanagari", "alias", "[\u0C82-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5-\u0CD6\u0CDE\u0CE0-\u0CE1\u0CE6-\u0CEF];NFD;Kannada-InterIndic;InterIndic-Devanagari;NFC", "" }, -{ "Kannada-Bengali", "alias", "[\u0C82-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5-\u0CD6\u0CDE\u0CE0-\u0CE1\u0CE6-\u0CEF];NFD;Kannada-InterIndic;InterIndic-Bengali;NFC", "" }, -{ "Kannada-Gurmukhi", "alias", "[\u0C82-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5-\u0CD6\u0CDE\u0CE0-\u0CE1\u0CE6-\u0CEF];NFD;Kannada-InterIndic;InterIndic-Gurmukhi;NFC", "" }, -{ "Kannada-Gujarati", "alias", "[\u0C82-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5-\u0CD6\u0CDE\u0CE0-\u0CE1\u0CE6-\u0CEF];NFD;Kannada-InterIndic;InterIndic-Gujarati;NFC", "" }, -{ "Kannada-Oriya", "alias", "[\u0C82-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5-\u0CD6\u0CDE\u0CE0-\u0CE1\u0CE6-\u0CEF];NFD;Kannada-InterIndic;InterIndic-Oriya;NFC", "" }, -{ "Kannada-Tamil", "alias", "[\u0C82-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5-\u0CD6\u0CDE\u0CE0-\u0CE1\u0CE6-\u0CEF];NFD;Kannada-InterIndic;InterIndic-Tamil;NFC", "" }, -{ "Kannada-Telugu", "alias", "[\u0C82-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5-\u0CD6\u0CDE\u0CE0-\u0CE1\u0CE6-\u0CEF];NFD;Kannada-InterIndic;InterIndic-Telugu;NFC", "" }, -{ "Kannada-Malayalam", "alias", "[\u0C82-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5-\u0CD6\u0CDE\u0CE0-\u0CE1\u0CE6-\u0CEF];NFD;Kannada-InterIndic;InterIndic-Malayalam;NFC", "" }, - -{ "Malayalam-Devanagari", "alias", "[\u0D02-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D3E-\u0D43\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D60-\u0D61\u0D66-\u0D6F];NFD;Malayalam-InterIndic;InterIndic-Devanagari;NFC", "" }, -{ "Malayalam-Bengali", "alias", "[\u0D02-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D3E-\u0D43\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D60-\u0D61\u0D66-\u0D6F];NFD;Malayalam-InterIndic;InterIndic-Bengali;NFC", "" }, -{ "Malayalam-Gurmukhi", "alias", "[\u0D02-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D3E-\u0D43\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D60-\u0D61\u0D66-\u0D6F];NFD;Malayalam-InterIndic;InterIndic-Gurmukhi;NFC", "" }, -{ "Malayalam-Gujarati", "alias", "[\u0D02-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D3E-\u0D43\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D60-\u0D61\u0D66-\u0D6F];NFD;Malayalam-InterIndic;InterIndic-Gujarati;NFC", "" }, -{ "Malayalam-Oriya", "alias", "[\u0D02-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D3E-\u0D43\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D60-\u0D61\u0D66-\u0D6F];NFD;Malayalam-InterIndic;InterIndic-Oriya;NFC", "" }, -{ "Malayalam-Tamil", "alias", "[\u0D02-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D3E-\u0D43\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D60-\u0D61\u0D66-\u0D6F];NFD;Malayalam-InterIndic;InterIndic-Tamil;NFC", "" }, -{ "Malayalam-Telugu", "alias", "[\u0D02-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D3E-\u0D43\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D60-\u0D61\u0D66-\u0D6F];NFD;Malayalam-InterIndic;InterIndic-Telugu;NFC", "" }, -{ "Malayalam-Kannada", "alias", "[\u0D02-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D3E-\u0D43\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D60-\u0D61\u0D66-\u0D6F];NFD;Malayalam-InterIndic;InterIndic-Kannada;NFC", "" }, - -// eof - } -} diff --git a/icuSources/data/translit/trnsfiles.mk b/icuSources/data/translit/trnsfiles.mk index a21b5e0c..05285d7f 100644 --- a/icuSources/data/translit/trnsfiles.mk +++ b/icuSources/data/translit/trnsfiles.mk @@ -1,4 +1,4 @@ -# * Copyright (C) 1997-2001, International Business Machines +# * Copyright (C) 1997-2004, International Business Machines # * Corporation and others. All Rights Reserved. # A list of txt's to build # Note: @@ -19,41 +19,8 @@ # * To REPLACE the default list and only build with a few # transliterators: # _____________________________________________________ -# | TRANLIST_SOURCE = translit_index.txt translit_Any_Publishing.txt +# | TRANLIST_SOURCE = el.txt th.txt # # -TRANSLIT_SOURCE=t_Any_Accents.txt\ -t_Any_Publishing.txt\ -t_Arab_Latn.txt\ -t_Beng_InterIndic.txt\ -t_Cyrl_Latn.txt\ -t_Deva_InterIndic.txt\ -t_FWidth_HWidth.txt\ -t_Grek_Latn.txt\ -t_Grek_Latn_UNGEGN.txt\ -t_Gujr_InterIndic.txt\ -t_Guru_InterIndic.txt\ -t_Hani_Latn.txt\ -t_Hebr_Latn.txt\ -t_Hira_Kana.txt\ -t_Hira_Latn.txt\ -t_InterIndic_Beng.txt\ -t_InterIndic_Deva.txt\ -t_InterIndic_Gujr.txt\ -t_InterIndic_Guru.txt\ -t_InterIndic_Knda.txt\ -t_InterIndic_Latn.txt\ -t_InterIndic_Mlym.txt\ -t_InterIndic_Orya.txt\ -t_InterIndic_Taml.txt\ -t_InterIndic_Telu.txt\ -t_Knda_InterIndic.txt\ -t_Latn_InterIndic.txt\ -t_Latn_Jamo.txt\ -t_Latn_Kana.txt\ -t_Mlym_InterIndic.txt\ -t_Orya_InterIndic.txt\ -t_Taml_InterIndic.txt\ -t_Telu_InterIndic.txt\ -translit_index.txt +TRANSLIT_SOURCE=el.txt en.txt diff --git a/icuSources/data/unidata/Blocks.txt b/icuSources/data/unidata/Blocks.txt index 6dc2bd2f..aeed970a 100644 --- a/icuSources/data/unidata/Blocks.txt +++ b/icuSources/data/unidata/Blocks.txt @@ -1,11 +1,25 @@ -# Blocks-4.0.0.txt -# Correlated with Unicode 4.0 -# Note: The casing of block names is not normative. -# For example, "Basic Latin" and "BASIC LATIN" are equivalent. +# Blocks-4.0.1.txt +# Date: 2004-03-01, 15:52 [KW] # -# Code points not explicitly listed in this file are given the value No_Block. +# Unicode Character Database +# Copyright (c) 1991-2004 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# For documentation, see UCD.html +# +# Note: When comparing block names, casing, whitespace, hyphens, +# and underbars are ignored. +# For example, "Latin Extended-A" and "latin extended a" are equivalent. +# For more information on the comparison of property values, +# see UCD.html. # +# Code points not explicitly listed in this file are given the value No_Block. +# Format: # Start Code..End Code; Block Name + +# ================================================ + +# Property: Block + 0000..007F; Basic Latin 0080..00FF; Latin-1 Supplement 0100..017F; Latin Extended-A @@ -15,7 +29,7 @@ 0300..036F; Combining Diacritical Marks 0370..03FF; Greek and Coptic 0400..04FF; Cyrillic -0500..052F; Cyrillic Supplementary +0500..052F; Cyrillic Supplement 0530..058F; Armenian 0590..05FF; Hebrew 0600..06FF; Arabic diff --git a/icuSources/data/unidata/CaseFolding.txt b/icuSources/data/unidata/CaseFolding.txt index 8d9b44ac..65f78ffd 100644 --- a/icuSources/data/unidata/CaseFolding.txt +++ b/icuSources/data/unidata/CaseFolding.txt @@ -1,6 +1,10 @@ -# CaseFolding-4.0.0.txt -# Date: 2003-03-14, 20:22:08 GMT [MD] +# CaseFolding-4.0.1.txt +# Date: 2004-03-02, 02:41:24 GMT [MD] # +# Unicode Character Database +# Copyright (c) 1991-2004 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# For documentation, see UCD.html # Case Folding Properties # # This file is a supplement to the UnicodeData file. diff --git a/icuSources/data/unidata/DerivedAge.txt b/icuSources/data/unidata/DerivedAge.txt index 969995db..e74462ca 100644 --- a/icuSources/data/unidata/DerivedAge.txt +++ b/icuSources/data/unidata/DerivedAge.txt @@ -1,29 +1,58 @@ -# DerivedAge-4.0.0.txt -# Date: 2003-02-20,17:14:45 GMT [MD] +# DerivedAge-4.0.1.txt +# Date: 2004-03-02, 02:41:24 GMT [MD] +# +# Unicode Character Database +# Copyright (c) 1991-2004 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# For documentation, see UCD.html # # Unicode Character Database: Derived Property Data -# This file shows when various code points were designated in Unicode +# This file shows when various code points were first assigned in Unicode. +# +# Caution: When using the Age *property*, all assigned code points +# in each version are included, not just the newly assigned code points. +# For more information, see http://www.unicode.org/reports/tr18/ +# # Notes: -# - The term 'designated' means that a previously reserved code point was specified -# to be a noncharacter or surrogate, or assigned as a character, -# control or format code. +# +# - The term 'assigned' means that a previously reserved code point was assigned +# to be a character (graphic, format, control, or private-use); +# a noncharacter code point; or a surrogate code point. +# For more information, see The Unicode Standard Section 2.4 +# # - Versions are only tracked from 1.1 onwards, since version 1.0 # predated changes required by the ISO 10646 merger. +# # - The Hangul Syllables that were removed from 2.0 are not included in the 1.1 listing. +# # - The supplementary private use code points and the non-character code points -# were designated in version 2.0, but not specifically listed in the UCD +# were assigned in version 2.0, but not specifically listed in the UCD # until versions 3.0 and 3.1 respectively. # +# - Contiguous ranges are broken into separate lines where they would cross code point +# types: graphic, format, control, private-use, surrogate, noncharacter +# # For details on the contents of each version, see # http://www.unicode.org/versions/enumeratedversions.html. + # ================================================ -# Designated as of 1.1 [excluding removed Hangul Syllables] +# Property: Age -0000..001F ; 1.1 # [32] .. +# All code points not explicitly listed for Age +# have the value unassigned. + +# ================================================ + +# Assigned as of Unicode 1.1.0 (June, 1993) +# [excluding removed Hangul Syllables] + +0000..001F ; 1.1 # [32] .. 0020..007E ; 1.1 # [95] SPACE..TILDE -007F..009F ; 1.1 # [33] .. -00A0..01F5 ; 1.1 # [342] NO-BREAK SPACE..LATIN SMALL LETTER G WITH ACUTE +007F..009F ; 1.1 # [33] .. +00A0..00AC ; 1.1 # [13] NO-BREAK SPACE..NOT SIGN +00AD ; 1.1 # SOFT HYPHEN +00AE..01F5 ; 1.1 # [328] REGISTERED SIGN..LATIN SMALL LETTER G WITH ACUTE 01FA..0217 ; 1.1 # [30] LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE..LATIN SMALL LETTER U WITH INVERTED BREVE 0250..02A8 ; 1.1 # [89] LATIN SMALL LETTER TURNED A..LATIN SMALL LETTER TC DIGRAPH WITH CURL 02B0..02DE ; 1.1 # [47] MODIFIER LETTER SMALL H..MODIFIER LETTER RHOTIC HOOK @@ -70,7 +99,9 @@ 0670..06B7 ; 1.1 # [72] ARABIC LETTER SUPERSCRIPT ALEF..ARABIC LETTER LAM WITH THREE DOTS ABOVE 06BA..06BE ; 1.1 # [5] ARABIC LETTER NOON GHUNNA..ARABIC LETTER HEH DOACHASHMEE 06C0..06CE ; 1.1 # [15] ARABIC LETTER HEH WITH YEH ABOVE..ARABIC LETTER YEH WITH SMALL V -06D0..06ED ; 1.1 # [30] ARABIC LETTER E..ARABIC SMALL LOW MEEM +06D0..06DC ; 1.1 # [13] ARABIC LETTER E..ARABIC SMALL HIGH SEEN +06DD ; 1.1 # ARABIC END OF AYAH +06DE..06ED ; 1.1 # [16] ARABIC START OF RUB EL HIZB..ARABIC SMALL LOW MEEM 06F0..06F9 ; 1.1 # [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE 0901..0903 ; 1.1 # [3] DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN VISARGA 0905..0939 ; 1.1 # [53] DEVANAGARI LETTER A..DEVANAGARI LETTER HA @@ -231,10 +262,10 @@ 1FDD..1FEF ; 1.1 # [19] GREEK DASIA AND VARIA..GREEK VARIA 1FF2..1FF4 ; 1.1 # [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI 1FF6..1FFE ; 1.1 # [9] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK DASIA -2000..200B ; 1.1 # [12] EN QUAD..ZERO WIDTH SPACE -200C..200F ; 1.1 # [4] ZERO WIDTH NON-JOINER..RIGHT-TO-LEFT MARK -2010..2029 ; 1.1 # [26] HYPHEN..PARAGRAPH SEPARATOR -202A..202E ; 1.1 # [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE +2000..200A ; 1.1 # [11] EN QUAD..HAIR SPACE +200B..200F ; 1.1 # [5] ZERO WIDTH SPACE..RIGHT-TO-LEFT MARK +2010..2027 ; 1.1 # [24] HYPHEN..HYPHENATION POINT +2028..202E ; 1.1 # [7] LINE SEPARATOR..RIGHT-TO-LEFT OVERRIDE 2030..2046 ; 1.1 # [23] PER MILLE SIGN..RIGHT SQUARE BRACKET WITH QUILL 206A..206F ; 1.1 # [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES 2070 ; 1.1 # SUPERSCRIPT ZERO @@ -284,7 +315,7 @@ 337B..33DD ; 1.1 # [99] SQUARE ERA NAME HEISEI..SQUARE WB 33E0..33FE ; 1.1 # [31] IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE..IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE 4E00..9FA5 ; 1.1 # [20902] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FA5 -E000..F8FF ; 1.1 # [6400] .. +E000..F8FF ; 1.1 # [6400] .. F900..FA2D ; 1.1 # [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D FB00..FB06 ; 1.1 # [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST FB13..FB17 ; 1.1 # [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH @@ -322,7 +353,7 @@ FFFE..FFFF ; 1.1 # [2] .. # ================================================ -# Differences between 2.0 and 1.1 +# Newly assigned in Unicode 2.0.0 (July, 1996) 0591..05A1 ; 2.0 # [17] HEBREW ACCENT ETNAHTA..HEBREW ACCENT PAZER 05A3..05AF ; 2.0 # [13] HEBREW ACCENT MUNAH..HEBREW MARK MASORA CIRCLE @@ -353,16 +384,16 @@ BFFFE..BFFFF ; 2.0 # [2] .. CFFFE..CFFFF ; 2.0 # [2] .. DFFFE..DFFFF ; 2.0 # [2] .. EFFFE..EFFFF ; 2.0 # [2] .. -F0000..FFFFD ; 2.0 # [65534] .. +F0000..FFFFD ; 2.0 # [65534] .. FFFFE..FFFFF ; 2.0 # [2] .. -100000..10FFFD; 2.0 # [65534] .. +100000..10FFFD; 2.0 # [65534] .. 10FFFE..10FFFF; 2.0 # [2] .. # Total code points: 144521 # ================================================ -# Differences between 2.1 and 2.0 +# Newly assigned in Unicode 2.1.2 (May, 1998) 20AC ; 2.1 # EURO SIGN FFFC ; 2.1 # OBJECT REPLACEMENT CHARACTER @@ -371,7 +402,7 @@ FFFC ; 2.1 # OBJECT REPLACEMENT CHARACTER # ================================================ -# Differences between 3.0 and 2.1 +# Newly assigned in Unicode 3.0.0 (September, 1999) 01F6..01F9 ; 3.0 # [4] LATIN CAPITAL LETTER HWAIR..LATIN SMALL LETTER N WITH GRAVE 0218..021F ; 3.0 # [8] LATIN CAPITAL LETTER S WITH COMMA BELOW..LATIN SMALL LETTER H WITH CARON @@ -458,10 +489,11 @@ FFFC ; 2.1 # OBJECT REPLACEMENT CHARACTER 1401..1676 ; 3.0 # [630] CANADIAN SYLLABICS E..CANADIAN SYLLABICS NNGAA 1680..169C ; 3.0 # [29] OGHAM SPACE MARK..OGHAM REVERSED FEATHER MARK 16A0..16F0 ; 3.0 # [81] RUNIC LETTER FEHU FEOH FE F..RUNIC BELGTHOR SYMBOL -1780..17DC ; 3.0 # [93] KHMER LETTER KA..KHMER SIGN AVAKRAHASANYA +1780..17B3 ; 3.0 # [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU +17B4..17B5 ; 3.0 # [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA +17B6..17DC ; 3.0 # [39] KHMER VOWEL SIGN AA..KHMER SIGN AVAKRAHASANYA 17E0..17E9 ; 3.0 # [10] KHMER DIGIT ZERO..KHMER DIGIT NINE -1800..180A ; 3.0 # [11] MONGOLIAN BIRGA..MONGOLIAN NIRUGU -180B..180E ; 3.0 # [4] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN VOWEL SEPARATOR +1800..180E ; 3.0 # [15] MONGOLIAN BIRGA..MONGOLIAN VOWEL SEPARATOR 1810..1819 ; 3.0 # [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE 1820..1877 ; 3.0 # [88] MONGOLIAN LETTER A..MONGOLIAN LETTER MANCHU ZHA 1880..18A9 ; 3.0 # [42] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI DAGALGA @@ -501,7 +533,7 @@ FFF9..FFFB ; 3.0 # [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATIO # ================================================ -# Differences between 3.1 and 3.0 +# Newly assigned in Unicode 3.1.0 (March, 2001) 03F4..03F5 ; 3.1 # [2] GREEK CAPITAL THETA SYMBOL..GREEK LUNATE EPSILON SYMBOL FDD0..FDEF ; 3.1 # [32] .. @@ -546,7 +578,7 @@ E0020..E007F ; 3.1 # [96] TAG SPACE..CANCEL TAG # ================================================ -# Differences between 3.2 and 3.1 +# Newly assigned in Unicode 3.2.0 (March, 2002) 0220 ; 3.2 # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG 034F ; 3.2 # COMBINING GRAPHEME JOINER @@ -613,7 +645,7 @@ FF5F..FF60 ; 3.2 # [2] FULLWIDTH LEFT WHITE PARENTHESIS..FULLWIDTH RIGHT WH # ================================================ -# Differences between 4.0 and 3.2 +# Newly assigned in Unicode 4.0.0 (April, 2003) 0221 ; 4.0 # LATIN SMALL LETTER D WITH CURL 0234..0236 ; 4.0 # [3] LATIN SMALL LETTER L WITH CURL..LATIN SMALL LETTER T WITH CURL @@ -694,4 +726,3 @@ FE47..FE48 ; 4.0 # [2] PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET.. E0100..E01EF ; 4.0 # [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 # Total code points: 1226 - diff --git a/icuSources/data/unidata/DerivedBidiClass.txt b/icuSources/data/unidata/DerivedBidiClass.txt index d71b314e..e876bd31 100644 --- a/icuSources/data/unidata/DerivedBidiClass.txt +++ b/icuSources/data/unidata/DerivedBidiClass.txt @@ -1,20 +1,22 @@ -# DerivedBidiClass-4.0.0.txt -# Date: 2003-03-20, 20:08:10 GMT [MD] +# DerivedBidiClass-4.0.1.txt +# Date: 2004-03-11, 18:33:24 GMT [MD] # -# Unicode Character Database: Derived Property Data -# Generated algorithmically from the Unicode Character Database +# Unicode Character Database +# Copyright (c) 1991-2004 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html # For documentation, see UCD.html -# Note: Unassigned and Noncharacter codepoints may be omitted -# if they have default property values. -# ================================================ - # ================================================ + # Bidi Class (listing UnicodeData.txt, field 4: see UCD.html) -# All code points not explicitly listed in this file have the property -# value: L. + +# All code points not explicitly listed for Bidi_Class +# have the value Left_To_Right (L). + # ================================================ +# Bidi_Class=Left_To_Right + 0041..005A ; L # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z 0061..007A ; L # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z 00AA ; L # L& FEMININE ORDINAL INDICATOR @@ -361,6 +363,7 @@ 2336..237A ; L # So [69] APL FUNCTIONAL SYMBOL I-BEAM..APL FUNCTIONAL SYMBOL ALPHA 2395 ; L # So APL FUNCTIONAL SYMBOL QUAD 249C..24E9 ; L # So [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z +2800..28FF ; L # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 3005 ; L # Lm IDEOGRAPHIC ITERATION MARK 3006 ; L # Lo IDEOGRAPHIC CLOSING MARK 3007 ; L # Nl IDEOGRAPHIC NUMBER ZERO @@ -398,8 +401,7 @@ 4E00..9FA5 ; L # Lo [20902] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FA5 A000..A48C ; L # Lo [1165] YI SYLLABLE IT..YI SYLLABLE YYR AC00..D7A3 ; L # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH -D800..DFFF ; L # Cs [2048] -E000..F8FF ; L # Co [6400] +E000..F801 ; L # Co [6146] .. F900..FA2D ; L # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D FA30..FA6A ; L # Lo [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A FB00..FB06 ; L # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST @@ -486,57 +488,62 @@ FFDA..FFDC ; L # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER 1D7C4..1D7C9 ; L # L& [6] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL 20000..2A6D6 ; L # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 2F800..2FA1D ; L # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D -F0000..FFFFD ; L # Co [65534] -100000..10FFFD; L # Co [65534] +F0000..FFFFD ; L # Co [65534] .. +100000..10FFFD; L # Co [65534] .. -# Total code points: 230579 +# The above property value applies to 873851 code points not listed here. +# Total code points: 1102638 # ================================================ -0590 ; R # Cn -05A2 ; R # Cn -05BA ; R # Cn +# Bidi_Class=Right_To_Left + +0590 ; R # Cn +05A2 ; R # Cn +05BA ; R # Cn 05BE ; R # Po HEBREW PUNCTUATION MAQAF 05C0 ; R # Po HEBREW PUNCTUATION PASEQ 05C3 ; R # Po HEBREW PUNCTUATION SOF PASUQ -05C5..05CF ; R # Cn [11] +05C5..05CF ; R # Cn [11] .. 05D0..05EA ; R # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV -05EB..05EF ; R # Cn [5] +05EB..05EF ; R # Cn [5] .. 05F0..05F2 ; R # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD 05F3..05F4 ; R # Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM -05F5..05FF ; R # Cn [11] -07C0..08FF ; R # Cn [320] +05F5..05FF ; R # Cn [11] .. +07C0..08FF ; R # Cn [320] .. 200F ; R # Cf RIGHT-TO-LEFT MARK FB1D ; R # Lo HEBREW LETTER YOD WITH HIRIQ FB1F..FB28 ; R # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV FB2A..FB36 ; R # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH -FB37 ; R # Cn +FB37 ; R # Cn FB38..FB3C ; R # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH -FB3D ; R # Cn +FB3D ; R # Cn FB3E ; R # Lo HEBREW LETTER MEM WITH DAGESH -FB3F ; R # Cn +FB3F ; R # Cn FB40..FB41 ; R # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH -FB42 ; R # Cn +FB42 ; R # Cn FB43..FB44 ; R # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH -FB45 ; R # Cn +FB45 ; R # Cn FB46..FB4F ; R # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED 10800..10805 ; R # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA -10806..10807 ; R # Cn [2] +10806..10807 ; R # Cn [2] .. 10808 ; R # Lo CYPRIOT SYLLABLE JO -10809 ; R # Cn +10809 ; R # Cn 1080A..10835 ; R # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO -10836 ; R # Cn +10836 ; R # Cn 10837..10838 ; R # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE -10839..1083B ; R # Cn [3] +10839..1083B ; R # Cn [3] .. 1083C ; R # Lo CYPRIOT SYLLABLE ZA -1083D..1083E ; R # Cn [2] +1083D..1083E ; R # Cn [2] .. 1083F ; R # Lo CYPRIOT SYLLABLE ZO -10840..10FFF ; R # Cn [1984] +10840..10FFF ; R # Cn [1984] .. # Total code points: 2483 # ================================================ +# Bidi_Class=European_Number + 0030..0039 ; EN # Nd [10] DIGIT ZERO..DIGIT NINE 00B2..00B3 ; EN # No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE 00B9 ; EN # No SUPERSCRIPT ONE @@ -544,27 +551,29 @@ FB46..FB4F ; R # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE AL 2070 ; EN # No SUPERSCRIPT ZERO 2074..2079 ; EN # No [6] SUPERSCRIPT FOUR..SUPERSCRIPT NINE 2080..2089 ; EN # No [10] SUBSCRIPT ZERO..SUBSCRIPT NINE -2460..249B ; EN # No [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP -24EA ; EN # No CIRCLED DIGIT ZERO +2488..249B ; EN # No [20] DIGIT ONE FULL STOP..NUMBER TWENTY FULL STOP FF10..FF19 ; EN # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE 1D7CE..1D7FF ; EN # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE -# Total code points: 161 +# Total code points: 120 # ================================================ -002F ; ES # Po SOLIDUS +# Bidi_Class=European_Separator + +002B ; ES # Sm PLUS SIGN +002D ; ES # Pd HYPHEN-MINUS FF0F ; ES # Po FULLWIDTH SOLIDUS -# Total code points: 2 +# Total code points: 3 # ================================================ +# Bidi_Class=European_Terminator + 0023 ; ET # Po NUMBER SIGN 0024 ; ET # Sc DOLLAR SIGN 0025 ; ET # Po PERCENT SIGN -002B ; ET # Sm PLUS SIGN -002D ; ET # Pd HYPHEN-MINUS 00A2..00A5 ; ET # Sc [4] CENT SIGN..YEN SIGN 00B0 ; ET # So DEGREE SIGN 00B1 ; ET # Sm PLUS-MINUS SIGN @@ -594,10 +603,12 @@ FF0D ; ET # Pd FULLWIDTH HYPHEN-MINUS FFE0..FFE1 ; ET # Sc [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN FFE5..FFE6 ; ET # Sc [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN -# Total code points: 63 +# Total code points: 61 # ================================================ +# Bidi_Class=Arabic_Number + 0660..0669 ; AN # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE 066B..066C ; AN # Po [2] ARABIC DECIMAL SEPARATOR..ARABIC THOUSANDS SEPARATOR @@ -605,11 +616,14 @@ FFE5..FFE6 ; ET # Sc [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN # ================================================ +# Bidi_Class=Common_Separator + 002C ; CS # Po COMMA -002E ; CS # Po FULL STOP +002E..002F ; CS # Po [2] FULL STOP..SOLIDUS 003A ; CS # Po COLON 00A0 ; CS # Zs NO-BREAK SPACE 060C ; CS # Po ARABIC COMMA +2044 ; CS # Sm FRACTION SLASH FE50 ; CS # Po SMALL COMMA FE52 ; CS # Po SMALL FULL STOP FE55 ; CS # Po SMALL COLON @@ -617,29 +631,35 @@ FF0C ; CS # Po FULLWIDTH COMMA FF0E ; CS # Po FULLWIDTH FULL STOP FF1A ; CS # Po FULLWIDTH COLON -# Total code points: 11 +# Total code points: 13 # ================================================ -000A ; B # Cc -000D ; B # Cc -001C..001E ; B # Cc [3] .. -0085 ; B # Cc +# Bidi_Class=Paragraph_Separator + +000A ; B # Cc +000D ; B # Cc +001C..001E ; B # Cc [3] .. +0085 ; B # Cc 2029 ; B # Zp PARAGRAPH SEPARATOR # Total code points: 7 # ================================================ -0009 ; S # Cc -000B ; S # Cc -001F ; S # Cc +# Bidi_Class=Segment_Separator + +0009 ; S # Cc +000B ; S # Cc +001F ; S # Cc # Total code points: 3 # ================================================ -000C ; WS # Cc +# Bidi_Class=White_Space + +000C ; WS # Cc 0020 ; WS # Zs SPACE 1680 ; WS # Zs OGHAM SPACE MARK 180E ; WS # Zs MONGOLIAN VOWEL SEPARATOR @@ -653,6 +673,8 @@ FF1A ; CS # Po FULLWIDTH COLON # ================================================ +# Bidi_Class=Other_Neutral + 0021..0022 ; ON # Po [2] EXCLAMATION MARK..QUOTATION MARK 0026..0027 ; ON # Po [2] AMPERSAND..APOSTROPHE 0028 ; ON # Ps LEFT PARENTHESIS @@ -677,7 +699,6 @@ FF1A ; CS # Po FULLWIDTH COLON 00A9 ; ON # So COPYRIGHT SIGN 00AB ; ON # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK 00AC ; ON # Sm NOT SIGN -00AD ; ON # Cf SOFT HYPHEN 00AE ; ON # So REGISTERED SIGN 00AF ; ON # Sk MACRON 00B4 ; ON # Sk ACUTE ACCENT @@ -740,7 +761,6 @@ FF1A ; CS # Po FULLWIDTH COLON 203B..203E ; ON # Po [4] REFERENCE MARK..OVERLINE 203F..2040 ; ON # Pc [2] UNDERTIE..CHARACTER TIE 2041..2043 ; ON # Po [3] CARET INSERTION POINT..HYPHEN BULLET -2044 ; ON # Sm FRACTION SLASH 2045 ; ON # Ps LEFT SQUARE BRACKET WITH QUILL 2046 ; ON # Pe RIGHT SQUARE BRACKET WITH QUILL 2047..2051 ; ON # Po [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY @@ -808,7 +828,8 @@ FF1A ; CS # Po FULLWIDTH COLON 23B7..23D0 ; ON # So [26] RADICAL SYMBOL BOTTOM..VERTICAL LINE EXTENSION 2400..2426 ; ON # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO 2440..244A ; ON # So [11] OCR HOOK..OCR DOUBLE BACKSLASH -24EB..24FF ; ON # No [21] NEGATIVE CIRCLED NUMBER ELEVEN..NEGATIVE CIRCLED DIGIT ZERO +2460..2487 ; ON # No [40] CIRCLED DIGIT ONE..PARENTHESIZED NUMBER TWENTY +24EA..24FF ; ON # No [22] CIRCLED DIGIT ZERO..NEGATIVE CIRCLED DIGIT ZERO 2500..25B6 ; ON # So [183] BOX DRAWINGS LIGHT HORIZONTAL..BLACK RIGHT-POINTING TRIANGLE 25B7 ; ON # Sm WHITE RIGHT-POINTING TRIANGLE 25B8..25C0 ; ON # So [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE @@ -856,7 +877,6 @@ FF1A ; CS # Po FULLWIDTH COLON 27EA ; ON # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET 27EB ; ON # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET 27F0..27FF ; ON # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW -2800..28FF ; ON # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 2900..2982 ; ON # Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON 2983 ; ON # Ps LEFT WHITE CURLY BRACKET 2984 ; ON # Pe RIGHT WHITE CURLY BRACKET @@ -937,6 +957,8 @@ FF1A ; CS # Po FULLWIDTH COLON 33FF ; ON # So SQUARE GAL 4DC0..4DFF ; ON # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION A490..A4C6 ; ON # So [55] YI RADICAL QOT..YI RADICAL KE +F802..F86F ; ON # So [110] .. +F880..F8FF ; ON # So [128] .. FD3E ; ON # Ps ORNATE LEFT PARENTHESIS FD3F ; ON # Pe ORNATE RIGHT PARENTHESIS FDFD ; ON # So ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM @@ -1009,33 +1031,60 @@ FFE4 ; ON # So FULLWIDTH BROKEN BAR FFE8 ; ON # So HALFWIDTH FORMS LIGHT VERTICAL FFE9..FFEC ; ON # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW FFED..FFEE ; ON # So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE +FFF9..FFFB ; ON # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR FFFC..FFFD ; ON # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER 10101 ; ON # Po AEGEAN WORD SEPARATOR DOT 1D300..1D356 ; ON # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING -# Total code points: 3007 +# Total code points: 2793 # ================================================ -0000..0008 ; BN # Cc [9] .. -000E..001B ; BN # Cc [14] .. -007F..0084 ; BN # Cc [6] .. -0086..009F ; BN # Cc [26] .. +# Bidi_Class=Boundary_Neutral + +0000..0008 ; BN # Cc [9] .. +000E..001B ; BN # Cc [14] .. +007F..0084 ; BN # Cc [6] .. +0086..009F ; BN # Cc [26] .. +00AD ; BN # Cf SOFT HYPHEN 070F ; BN # Cf SYRIAC ABBREVIATION MARK -200B ; BN # Zs ZERO WIDTH SPACE -200C..200D ; BN # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER +200B..200D ; BN # Cf [3] ZERO WIDTH SPACE..ZERO WIDTH JOINER 2060..2063 ; BN # Cf [4] WORD JOINER..INVISIBLE SEPARATOR +2064..2069 ; BN # Cn [6] .. 206A..206F ; BN # Cf [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES +FDD0..FDEF ; BN # Cn [32] .. FEFF ; BN # Cf ZERO WIDTH NO-BREAK SPACE -FFF9..FFFB ; BN # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR +FFF0..FFF8 ; BN # Cn [9] .. +FFFE..FFFF ; BN # Cn [2] .. 1D173..1D17A ; BN # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE +1FFFE..1FFFF ; BN # Cn [2] .. +2FFFE..2FFFF ; BN # Cn [2] .. +3FFFE..3FFFF ; BN # Cn [2] .. +4FFFE..4FFFF ; BN # Cn [2] .. +5FFFE..5FFFF ; BN # Cn [2] .. +6FFFE..6FFFF ; BN # Cn [2] .. +7FFFE..7FFFF ; BN # Cn [2] .. +8FFFE..8FFFF ; BN # Cn [2] .. +9FFFE..9FFFF ; BN # Cn [2] .. +AFFFE..AFFFF ; BN # Cn [2] .. +BFFFE..BFFFF ; BN # Cn [2] .. +CFFFE..CFFFF ; BN # Cn [2] .. +DFFFE..E0000 ; BN # Cn [3] .. E0001 ; BN # Cf LANGUAGE TAG +E0002..E001F ; BN # Cn [30] .. E0020..E007F ; BN # Cf [96] TAG SPACE..CANCEL TAG +E0080..E00FF ; BN # Cn [128] .. +E01F0..E0FFF ; BN # Cn [3600] .. +EFFFE..EFFFF ; BN # Cn [2] .. +FFFFE..FFFFF ; BN # Cn [2] .. +10FFFE..10FFFF; BN # Cn [2] .. -# Total code points: 178 +# Total code points: 4016 # ================================================ +# Bidi_Class=Nonspacing_Mark + 0300..0357 ; NSM # Mn [88] COMBINING GRAVE ACCENT..COMBINING RIGHT HALF RING ABOVE 035D..036F ; NSM # Mn [19] COMBINING DOUBLE BREVE..COMBINING LATIN SMALL LETTER X 0483..0486 ; NSM # Mn [4] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC PSILI PNEUMATA @@ -1144,6 +1193,7 @@ E0020..E007F ; BN # Cf [96] TAG SPACE..CANCEL TAG 20E5..20EA ; NSM # Mn [6] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING LEFTWARDS ARROW OVERLAY 302A..302F ; NSM # Mn [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK 3099..309A ; NSM # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +F870..F87F ; NSM # Mn [16] .. FB1E ; NSM # Mn HEBREW POINT JUDEO-SPANISH VARIKA FE00..FE0F ; NSM # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 FE20..FE23 ; NSM # Mn [4] COMBINING LIGATURE LEFT HALF..COMBINING DOUBLE TILDE RIGHT HALF @@ -1157,19 +1207,21 @@ E0100..E01EF ; NSM # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 # ================================================ +# Bidi_Class=Arabic_Letter + 0600..0603 ; AL # Cf [4] ARABIC NUMBER SIGN..ARABIC SIGN SAFHA -0604..060B ; AL # Cn [8] +0604..060B ; AL # Cn [8] .. 060D ; AL # Po ARABIC DATE SEPARATOR -0616..061A ; AL # Cn [5] +0616..061A ; AL # Cn [5] .. 061B ; AL # Po ARABIC SEMICOLON -061C..061E ; AL # Cn [3] +061C..061E ; AL # Cn [3] .. 061F ; AL # Po ARABIC QUESTION MARK -0620 ; AL # Cn +0620 ; AL # Cn 0621..063A ; AL # Lo [26] ARABIC LETTER HAMZA..ARABIC LETTER GHAIN -063B..063F ; AL # Cn [5] +063B..063F ; AL # Cn [5] .. 0640 ; AL # Lm ARABIC TATWEEL 0641..064A ; AL # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH -0659..065F ; AL # Cn [7] +0659..065F ; AL # Cn [7] .. 066D ; AL # Po ARABIC FIVE POINTED STAR 066E..066F ; AL # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF 0671..06D3 ; AL # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE @@ -1182,60 +1234,69 @@ E0100..E01EF ; NSM # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 06FD..06FE ; AL # So [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN 06FF ; AL # Lo ARABIC LETTER HEH WITH INVERTED V 0700..070D ; AL # Po [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS -070E ; AL # Cn +070E ; AL # Cn 0710 ; AL # Lo SYRIAC LETTER ALAPH 0712..072F ; AL # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH -074B..074C ; AL # Cn [2] +074B..074C ; AL # Cn [2] .. 074D..074F ; AL # Lo [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE -0750..077F ; AL # Cn [48] +0750..077F ; AL # Cn [48] .. 0780..07A5 ; AL # Lo [38] THAANA LETTER HAA..THAANA LETTER WAAVU 07B1 ; AL # Lo THAANA LETTER NAA -07B2..07BF ; AL # Cn [14] +07B2..07BF ; AL # Cn [14] .. FB50..FBB1 ; AL # Lo [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM -FBB2..FBD2 ; AL # Cn [33] +FBB2..FBD2 ; AL # Cn [33] .. FBD3..FD3D ; AL # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM -FD40..FD4F ; AL # Cn [16] +FD40..FD4F ; AL # Cn [16] .. FD50..FD8F ; AL # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM -FD90..FD91 ; AL # Cn [2] +FD90..FD91 ; AL # Cn [2] .. FD92..FDC7 ; AL # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM -FDC8..FDCF ; AL # Cn [8] +FDC8..FDCF ; AL # Cn [8] .. FDF0..FDFB ; AL # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU FDFC ; AL # Sc RIAL SIGN -FDFE..FDFF ; AL # Cn [2] +FDFE..FDFF ; AL # Cn [2] .. FE70..FE74 ; AL # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM -FE75 ; AL # Cn +FE75 ; AL # Cn FE76..FEFC ; AL # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM -FEFD..FEFE ; AL # Cn [2] +FEFD..FEFE ; AL # Cn [2] .. # Total code points: 1136 # ================================================ +# Bidi_Class=Left_To_Right_Override + 202D ; LRO # Cf LEFT-TO-RIGHT OVERRIDE # Total code points: 1 # ================================================ +# Bidi_Class=Right_To_Left_Override + 202E ; RLO # Cf RIGHT-TO-LEFT OVERRIDE # Total code points: 1 # ================================================ +# Bidi_Class=Left_To_Right_Embedding + 202A ; LRE # Cf LEFT-TO-RIGHT EMBEDDING # Total code points: 1 # ================================================ +# Bidi_Class=Right_To_Left_Embedding + 202B ; RLE # Cf RIGHT-TO-LEFT EMBEDDING # Total code points: 1 # ================================================ +# Bidi_Class=Pop_Directional_Format + 202C ; PDF # Cf POP DIRECTIONAL FORMATTING # Total code points: 1 - diff --git a/icuSources/data/unidata/DerivedCoreProperties.txt b/icuSources/data/unidata/DerivedCoreProperties.txt index d9fb00c9..20b94d25 100644 --- a/icuSources/data/unidata/DerivedCoreProperties.txt +++ b/icuSources/data/unidata/DerivedCoreProperties.txt @@ -1,648 +1,664 @@ -# DerivedCoreProperties-4.0.0.txt -# Date: 2003-03-20, 20:07:28 GMT [MD] +# DerivedCoreProperties-4.0.1.txt +# Date: 2004-03-11, 18:55:03 GMT [MD] +# Mod Date: 2004-03-16, 16:45 PST [KW] # -# Unicode Character Database: Derived Property Data -# Generated algorithmically from the Unicode Character Database +# Unicode Character Database +# Copyright (c) 1991-2004 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html # For documentation, see UCD.html -# Note: Unassigned and Noncharacter codepoints may be omitted -# if they have default property values. -# ================================================ # ================================================ # Derived Property: Math # Generated from: Sm + Other_Math -0028 ; Math # Ps LEFT PARENTHESIS -0029 ; Math # Pe RIGHT PARENTHESIS -002A ; Math # Po ASTERISK -002B ; Math # Sm PLUS SIGN -002D ; Math # Pd HYPHEN-MINUS -002F ; Math # Po SOLIDUS -003C..003E ; Math # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN -005B ; Math # Ps LEFT SQUARE BRACKET -005C ; Math # Po REVERSE SOLIDUS -005D ; Math # Pe RIGHT SQUARE BRACKET -005E ; Math # Sk CIRCUMFLEX ACCENT -007B ; Math # Ps LEFT CURLY BRACKET -007C ; Math # Sm VERTICAL LINE -007D ; Math # Pe RIGHT CURLY BRACKET -007E ; Math # Sm TILDE -00AC ; Math # Sm NOT SIGN -00B1 ; Math # Sm PLUS-MINUS SIGN -00D7 ; Math # Sm MULTIPLICATION SIGN -00F7 ; Math # Sm DIVISION SIGN -03F6 ; Math # Sm GREEK REVERSED LUNATE EPSILON SYMBOL -2016 ; Math # Po DOUBLE VERTICAL LINE -2032..2034 ; Math # Po [3] PRIME..TRIPLE PRIME -2044 ; Math # Sm FRACTION SLASH -2052 ; Math # Sm COMMERCIAL MINUS SIGN -207A..207C ; Math # Sm [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN -207D ; Math # Ps SUPERSCRIPT LEFT PARENTHESIS -207E ; Math # Pe SUPERSCRIPT RIGHT PARENTHESIS -208A..208C ; Math # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN -208D ; Math # Ps SUBSCRIPT LEFT PARENTHESIS -208E ; Math # Pe SUBSCRIPT RIGHT PARENTHESIS -20D0..20DC ; Math # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE -20E1 ; Math # Mn COMBINING LEFT RIGHT ARROW ABOVE -2102 ; Math # L& DOUBLE-STRUCK CAPITAL C -210A..2113 ; Math # L& [10] SCRIPT SMALL G..SCRIPT SMALL L -2115 ; Math # L& DOUBLE-STRUCK CAPITAL N -2119..211D ; Math # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R -2124 ; Math # L& DOUBLE-STRUCK CAPITAL Z -2128 ; Math # L& BLACK-LETTER CAPITAL Z -212C..212D ; Math # L& [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C -212F..2131 ; Math # L& [3] SCRIPT SMALL E..SCRIPT CAPITAL F -2133..2134 ; Math # L& [2] SCRIPT CAPITAL M..SCRIPT SMALL O -2135..2138 ; Math # Lo [4] ALEF SYMBOL..DALET SYMBOL -2140..2144 ; Math # Sm [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y -214B ; Math # Sm TURNED AMPERSAND -2190..2194 ; Math # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW -219A..219B ; Math # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE -21A0 ; Math # Sm RIGHTWARDS TWO HEADED ARROW -21A3 ; Math # Sm RIGHTWARDS ARROW WITH TAIL -21A6 ; Math # Sm RIGHTWARDS ARROW FROM BAR -21AE ; Math # Sm LEFT RIGHT ARROW WITH STROKE -21CE..21CF ; Math # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE -21D2 ; Math # Sm RIGHTWARDS DOUBLE ARROW -21D4 ; Math # Sm LEFT RIGHT DOUBLE ARROW -21F4..22FF ; Math # Sm [268] RIGHT ARROW WITH SMALL CIRCLE..Z NOTATION BAG MEMBERSHIP -2308..230B ; Math # Sm [4] LEFT CEILING..RIGHT FLOOR -2320..2321 ; Math # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL -237C ; Math # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW -239B..23B3 ; Math # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM -25B7 ; Math # Sm WHITE RIGHT-POINTING TRIANGLE -25C1 ; Math # Sm WHITE LEFT-POINTING TRIANGLE -25F8..25FF ; Math # Sm [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE -266F ; Math # Sm MUSIC SHARP SIGN -27D0..27E5 ; Math # Sm [22] WHITE DIAMOND WITH CENTRED DOT..WHITE SQUARE WITH RIGHTWARDS TICK -27F0..27FF ; Math # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW -2900..2982 ; Math # Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON -2999..29D7 ; Math # Sm [63] DOTTED FENCE..BLACK HOURGLASS -29DC..29FB ; Math # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS -29FE..2AFF ; Math # Sm [258] TINY..N-ARY WHITE VERTICAL BAR -FB29 ; Math # Sm HEBREW LETTER ALTERNATIVE PLUS SIGN -FE35 ; Math # Ps PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS -FE36 ; Math # Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS -FE37 ; Math # Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET -FE38 ; Math # Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET -FE47 ; Math # Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET -FE48 ; Math # Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET -FE59 ; Math # Ps SMALL LEFT PARENTHESIS -FE5A ; Math # Pe SMALL RIGHT PARENTHESIS -FE5B ; Math # Ps SMALL LEFT CURLY BRACKET -FE5C ; Math # Pe SMALL RIGHT CURLY BRACKET -FE61 ; Math # Po SMALL ASTERISK -FE62 ; Math # Sm SMALL PLUS SIGN -FE63 ; Math # Pd SMALL HYPHEN-MINUS -FE64..FE66 ; Math # Sm [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN -FE68 ; Math # Po SMALL REVERSE SOLIDUS -FF08 ; Math # Ps FULLWIDTH LEFT PARENTHESIS -FF09 ; Math # Pe FULLWIDTH RIGHT PARENTHESIS -FF0A ; Math # Po FULLWIDTH ASTERISK -FF0B ; Math # Sm FULLWIDTH PLUS SIGN -FF0D ; Math # Pd FULLWIDTH HYPHEN-MINUS -FF0F ; Math # Po FULLWIDTH SOLIDUS -FF1C..FF1E ; Math # Sm [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN -FF3B ; Math # Ps FULLWIDTH LEFT SQUARE BRACKET -FF3C ; Math # Po FULLWIDTH REVERSE SOLIDUS -FF3D ; Math # Pe FULLWIDTH RIGHT SQUARE BRACKET -FF3E ; Math # Sk FULLWIDTH CIRCUMFLEX ACCENT -FF5B ; Math # Ps FULLWIDTH LEFT CURLY BRACKET -FF5C ; Math # Sm FULLWIDTH VERTICAL LINE -FF5D ; Math # Pe FULLWIDTH RIGHT CURLY BRACKET -FF5E ; Math # Sm FULLWIDTH TILDE -FFE2 ; Math # Sm FULLWIDTH NOT SIGN -FFE9..FFEC ; Math # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW -1D400..1D454 ; Math # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G -1D456..1D49C ; Math # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A -1D49E..1D49F ; Math # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D -1D4A2 ; Math # L& MATHEMATICAL SCRIPT CAPITAL G -1D4A5..1D4A6 ; Math # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K -1D4A9..1D4AC ; Math # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q -1D4AE..1D4B9 ; Math # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D -1D4BB ; Math # L& MATHEMATICAL SCRIPT SMALL F -1D4BD..1D4C3 ; Math # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N -1D4C5..1D505 ; Math # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B -1D507..1D50A ; Math # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G -1D50D..1D514 ; Math # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q -1D516..1D51C ; Math # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y -1D51E..1D539 ; Math # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B -1D53B..1D53E ; Math # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G -1D540..1D544 ; Math # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M -1D546 ; Math # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O -1D54A..1D550 ; Math # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y -1D552..1D6A3 ; Math # L& [338] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL MONOSPACE SMALL Z -1D6A8..1D6C0 ; Math # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA -1D6C1 ; Math # Sm MATHEMATICAL BOLD NABLA -1D6C2..1D6DA ; Math # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA -1D6DB ; Math # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL -1D6DC..1D6FA ; Math # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA -1D6FB ; Math # Sm MATHEMATICAL ITALIC NABLA -1D6FC..1D714 ; Math # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA -1D715 ; Math # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL -1D716..1D734 ; Math # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA -1D735 ; Math # Sm MATHEMATICAL BOLD ITALIC NABLA -1D736..1D74E ; Math # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA -1D74F ; Math # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL -1D750..1D76E ; Math # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA -1D76F ; Math # Sm MATHEMATICAL SANS-SERIF BOLD NABLA -1D770..1D788 ; Math # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA -1D789 ; Math # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL -1D78A..1D7A8 ; Math # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA -1D7A9 ; Math # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA -1D7AA..1D7C2 ; Math # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA -1D7C3 ; Math # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL -1D7C4..1D7C9 ; Math # L& [6] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL -1D7CE..1D7FF ; Math # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE +002B ; Math +003C..003E ; Math +005E ; Math +007C ; Math +007E ; Math +00AC ; Math +00B1 ; Math +00D7 ; Math +00F7 ; Math +03D0..03D2 ; Math +03D5 ; Math +03F0..03F1 ; Math +03F4..03F5 ; Math +03F6 ; Math +2016 ; Math +2032..2034 ; Math +2040 ; Math +2044 ; Math +2052 ; Math +2061..2063 ; Math +207A..207C ; Math +207D ; Math +207E ; Math +208A..208C ; Math +208D ; Math +208E ; Math +20D0..20DC ; Math +20E1 ; Math +20E5..20E6 ; Math +2102 ; Math +210A..2113 ; Math +2115 ; Math +2119..211D ; Math +2124 ; Math +2128 ; Math +2129 ; Math +212C..212D ; Math +212F..2131 ; Math +2133..2134 ; Math +2135..2138 ; Math +213D..213F ; Math +2140..2144 ; Math +2145..2149 ; Math +214B ; Math +2190..2194 ; Math +219A..219B ; Math +21A0 ; Math +21A3 ; Math +21A6 ; Math +21AE ; Math +21CE..21CF ; Math +21D2 ; Math +21D4 ; Math +21F4..22FF ; Math +2308..230B ; Math +2320..2321 ; Math +237C ; Math +239B..23B3 ; Math +23B7 ; Math +23D0 ; Math +25B7 ; Math +25C1 ; Math +25F8..25FF ; Math +266F ; Math +27D0..27E5 ; Math +27E6 ; Math +27E7 ; Math +27E8 ; Math +27E9 ; Math +27EA ; Math +27EB ; Math +27F0..27FF ; Math +2900..2982 ; Math +2983 ; Math +2984 ; Math +2985 ; Math +2986 ; Math +2987 ; Math +2988 ; Math +2989 ; Math +298A ; Math +298B ; Math +298C ; Math +298D ; Math +298E ; Math +298F ; Math +2990 ; Math +2991 ; Math +2992 ; Math +2993 ; Math +2994 ; Math +2995 ; Math +2996 ; Math +2997 ; Math +2998 ; Math +2999..29D7 ; Math +29D8 ; Math +29D9 ; Math +29DA ; Math +29DB ; Math +29DC..29FB ; Math +29FC ; Math +29FD ; Math +29FE..2AFF ; Math +FB29 ; Math +FE61 ; Math +FE62 ; Math +FE63 ; Math +FE64..FE66 ; Math +FE68 ; Math +FF0B ; Math +FF1C..FF1E ; Math +FF3C ; Math +FF3E ; Math +FF5C ; Math +FF5E ; Math +FFE2 ; Math +FFE9..FFEC ; Math +1D400..1D454 ; Math +1D456..1D49C ; Math +1D49E..1D49F ; Math +1D4A2 ; Math +1D4A5..1D4A6 ; Math +1D4A9..1D4AC ; Math +1D4AE..1D4B9 ; Math +1D4BB ; Math +1D4BD..1D4C3 ; Math +1D4C5..1D505 ; Math +1D507..1D50A ; Math +1D50D..1D514 ; Math +1D516..1D51C ; Math +1D51E..1D539 ; Math +1D53B..1D53E ; Math +1D540..1D544 ; Math +1D546 ; Math +1D54A..1D550 ; Math +1D552..1D6A3 ; Math +1D6A8..1D6C0 ; Math +1D6C1 ; Math +1D6C2..1D6DA ; Math +1D6DB ; Math +1D6DC..1D6FA ; Math +1D6FB ; Math +1D6FC..1D714 ; Math +1D715 ; Math +1D716..1D734 ; Math +1D735 ; Math +1D736..1D74E ; Math +1D74F ; Math +1D750..1D76E ; Math +1D76F ; Math +1D770..1D788 ; Math +1D789 ; Math +1D78A..1D7A8 ; Math +1D7A9 ; Math +1D7AA..1D7C2 ; Math +1D7C3 ; Math +1D7C4..1D7C9 ; Math +1D7CE..1D7FF ; Math -# Total code points: 1968 +# Total code points: 1998 # ================================================ # Derived Property: Alphabetic # Generated from: Lu+Ll+Lt+Lm+Lo+Nl + Other_Alphabetic -0041..005A ; Alphabetic # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z -0061..007A ; Alphabetic # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z -00AA ; Alphabetic # L& FEMININE ORDINAL INDICATOR -00B5 ; Alphabetic # L& MICRO SIGN -00BA ; Alphabetic # L& MASCULINE ORDINAL INDICATOR -00C0..00D6 ; Alphabetic # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS -00D8..00F6 ; Alphabetic # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS -00F8..01BA ; Alphabetic # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL -01BB ; Alphabetic # Lo LATIN LETTER TWO WITH STROKE -01BC..01BF ; Alphabetic # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN -01C0..01C3 ; Alphabetic # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK -01C4..0236 ; Alphabetic # L& [115] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER T WITH CURL -0250..02AF ; Alphabetic # L& [96] LATIN SMALL LETTER TURNED A..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL -02B0..02C1 ; Alphabetic # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP -02C6..02D1 ; Alphabetic # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON -02E0..02E4 ; Alphabetic # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP -02EE ; Alphabetic # Lm MODIFIER LETTER DOUBLE APOSTROPHE -0345 ; Alphabetic # Mn COMBINING GREEK YPOGEGRAMMENI -037A ; Alphabetic # Lm GREEK YPOGEGRAMMENI -0386 ; Alphabetic # L& GREEK CAPITAL LETTER ALPHA WITH TONOS -0388..038A ; Alphabetic # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS -038C ; Alphabetic # L& GREEK CAPITAL LETTER OMICRON WITH TONOS -038E..03A1 ; Alphabetic # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO -03A3..03CE ; Alphabetic # L& [44] GREEK CAPITAL LETTER SIGMA..GREEK SMALL LETTER OMEGA WITH TONOS -03D0..03F5 ; Alphabetic # L& [38] GREEK BETA SYMBOL..GREEK LUNATE EPSILON SYMBOL -03F7..03FB ; Alphabetic # L& [5] GREEK CAPITAL LETTER SHO..GREEK SMALL LETTER SAN -0400..0481 ; Alphabetic # L& [130] CYRILLIC CAPITAL LETTER IE WITH GRAVE..CYRILLIC SMALL LETTER KOPPA -048A..04CE ; Alphabetic # L& [69] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EM WITH TAIL -04D0..04F5 ; Alphabetic # L& [38] CYRILLIC CAPITAL LETTER A WITH BREVE..CYRILLIC SMALL LETTER CHE WITH DIAERESIS -04F8..04F9 ; Alphabetic # L& [2] CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS..CYRILLIC SMALL LETTER YERU WITH DIAERESIS -0500..050F ; Alphabetic # L& [16] CYRILLIC CAPITAL LETTER KOMI DE..CYRILLIC SMALL LETTER KOMI TJE -0531..0556 ; Alphabetic # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH -0559 ; Alphabetic # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING -0561..0587 ; Alphabetic # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN -05B0..05B9 ; Alphabetic # Mn [10] HEBREW POINT SHEVA..HEBREW POINT HOLAM -05BB..05BD ; Alphabetic # Mn [3] HEBREW POINT QUBUTS..HEBREW POINT METEG -05BF ; Alphabetic # Mn HEBREW POINT RAFE -05C1..05C2 ; Alphabetic # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT -05C4 ; Alphabetic # Mn HEBREW MARK UPPER DOT -05D0..05EA ; Alphabetic # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV -05F0..05F2 ; Alphabetic # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD -0610..0615 ; Alphabetic # Mn [6] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL HIGH TAH -0621..063A ; Alphabetic # Lo [26] ARABIC LETTER HAMZA..ARABIC LETTER GHAIN -0640 ; Alphabetic # Lm ARABIC TATWEEL -0641..064A ; Alphabetic # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH -064B..0657 ; Alphabetic # Mn [13] ARABIC FATHATAN..ARABIC INVERTED DAMMA -066E..066F ; Alphabetic # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF -0670 ; Alphabetic # Mn ARABIC LETTER SUPERSCRIPT ALEF -0671..06D3 ; Alphabetic # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE -06D5 ; Alphabetic # Lo ARABIC LETTER AE -06D6..06DC ; Alphabetic # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN -06E1..06E4 ; Alphabetic # Mn [4] ARABIC SMALL HIGH DOTLESS HEAD OF KHAH..ARABIC SMALL HIGH MADDA -06E5..06E6 ; Alphabetic # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH -06E7..06E8 ; Alphabetic # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON -06ED ; Alphabetic # Mn ARABIC SMALL LOW MEEM -06EE..06EF ; Alphabetic # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V -06FA..06FC ; Alphabetic # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW -06FF ; Alphabetic # Lo ARABIC LETTER HEH WITH INVERTED V -0710 ; Alphabetic # Lo SYRIAC LETTER ALAPH -0711 ; Alphabetic # Mn SYRIAC LETTER SUPERSCRIPT ALAPH -0712..072F ; Alphabetic # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH -0730..073F ; Alphabetic # Mn [16] SYRIAC PTHAHA ABOVE..SYRIAC RWAHA -074D..074F ; Alphabetic # Lo [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE -0780..07A5 ; Alphabetic # Lo [38] THAANA LETTER HAA..THAANA LETTER WAAVU -07A6..07B0 ; Alphabetic # Mn [11] THAANA ABAFILI..THAANA SUKUN -07B1 ; Alphabetic # Lo THAANA LETTER NAA -0901..0902 ; Alphabetic # Mn [2] DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN ANUSVARA -0903 ; Alphabetic # Mc DEVANAGARI SIGN VISARGA -0904..0939 ; Alphabetic # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA -093D ; Alphabetic # Lo DEVANAGARI SIGN AVAGRAHA -093E..0940 ; Alphabetic # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II -0941..0948 ; Alphabetic # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI -0949..094C ; Alphabetic # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU -0950 ; Alphabetic # Lo DEVANAGARI OM -0958..0961 ; Alphabetic # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL -0962..0963 ; Alphabetic # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL -0981 ; Alphabetic # Mn BENGALI SIGN CANDRABINDU -0982..0983 ; Alphabetic # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA -0985..098C ; Alphabetic # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L -098F..0990 ; Alphabetic # Lo [2] BENGALI LETTER E..BENGALI LETTER AI -0993..09A8 ; Alphabetic # Lo [22] BENGALI LETTER O..BENGALI LETTER NA -09AA..09B0 ; Alphabetic # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA -09B2 ; Alphabetic # Lo BENGALI LETTER LA -09B6..09B9 ; Alphabetic # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA -09BD ; Alphabetic # Lo BENGALI SIGN AVAGRAHA -09BE..09C0 ; Alphabetic # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II -09C1..09C4 ; Alphabetic # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR -09C7..09C8 ; Alphabetic # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI -09CB..09CC ; Alphabetic # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU -09D7 ; Alphabetic # Mc BENGALI AU LENGTH MARK -09DC..09DD ; Alphabetic # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA -09DF..09E1 ; Alphabetic # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL -09E2..09E3 ; Alphabetic # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL -09F0..09F1 ; Alphabetic # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL -0A01..0A02 ; Alphabetic # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI -0A03 ; Alphabetic # Mc GURMUKHI SIGN VISARGA -0A05..0A0A ; Alphabetic # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU -0A0F..0A10 ; Alphabetic # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI -0A13..0A28 ; Alphabetic # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA -0A2A..0A30 ; Alphabetic # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA -0A32..0A33 ; Alphabetic # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA -0A35..0A36 ; Alphabetic # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA -0A38..0A39 ; Alphabetic # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA -0A3E..0A40 ; Alphabetic # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II -0A41..0A42 ; Alphabetic # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU -0A47..0A48 ; Alphabetic # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI -0A4B..0A4C ; Alphabetic # Mn [2] GURMUKHI VOWEL SIGN OO..GURMUKHI VOWEL SIGN AU -0A59..0A5C ; Alphabetic # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA -0A5E ; Alphabetic # Lo GURMUKHI LETTER FA -0A70..0A71 ; Alphabetic # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK -0A72..0A74 ; Alphabetic # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR -0A81..0A82 ; Alphabetic # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA -0A83 ; Alphabetic # Mc GUJARATI SIGN VISARGA -0A85..0A8D ; Alphabetic # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E -0A8F..0A91 ; Alphabetic # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O -0A93..0AA8 ; Alphabetic # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA -0AAA..0AB0 ; Alphabetic # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA -0AB2..0AB3 ; Alphabetic # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA -0AB5..0AB9 ; Alphabetic # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA -0ABD ; Alphabetic # Lo GUJARATI SIGN AVAGRAHA -0ABE..0AC0 ; Alphabetic # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II -0AC1..0AC5 ; Alphabetic # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E -0AC7..0AC8 ; Alphabetic # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI -0AC9 ; Alphabetic # Mc GUJARATI VOWEL SIGN CANDRA O -0ACB..0ACC ; Alphabetic # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU -0AD0 ; Alphabetic # Lo GUJARATI OM -0AE0..0AE1 ; Alphabetic # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL -0AE2..0AE3 ; Alphabetic # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL -0B01 ; Alphabetic # Mn ORIYA SIGN CANDRABINDU -0B02..0B03 ; Alphabetic # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA -0B05..0B0C ; Alphabetic # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L -0B0F..0B10 ; Alphabetic # Lo [2] ORIYA LETTER E..ORIYA LETTER AI -0B13..0B28 ; Alphabetic # Lo [22] ORIYA LETTER O..ORIYA LETTER NA -0B2A..0B30 ; Alphabetic # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA -0B32..0B33 ; Alphabetic # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA -0B35..0B39 ; Alphabetic # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA -0B3D ; Alphabetic # Lo ORIYA SIGN AVAGRAHA -0B3E ; Alphabetic # Mc ORIYA VOWEL SIGN AA -0B3F ; Alphabetic # Mn ORIYA VOWEL SIGN I -0B40 ; Alphabetic # Mc ORIYA VOWEL SIGN II -0B41..0B43 ; Alphabetic # Mn [3] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC R -0B47..0B48 ; Alphabetic # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI -0B4B..0B4C ; Alphabetic # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU -0B56 ; Alphabetic # Mn ORIYA AI LENGTH MARK -0B57 ; Alphabetic # Mc ORIYA AU LENGTH MARK -0B5C..0B5D ; Alphabetic # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA -0B5F..0B61 ; Alphabetic # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL -0B71 ; Alphabetic # Lo ORIYA LETTER WA -0B82 ; Alphabetic # Mn TAMIL SIGN ANUSVARA -0B83 ; Alphabetic # Lo TAMIL SIGN VISARGA -0B85..0B8A ; Alphabetic # Lo [6] TAMIL LETTER A..TAMIL LETTER UU -0B8E..0B90 ; Alphabetic # Lo [3] TAMIL LETTER E..TAMIL LETTER AI -0B92..0B95 ; Alphabetic # Lo [4] TAMIL LETTER O..TAMIL LETTER KA -0B99..0B9A ; Alphabetic # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA -0B9C ; Alphabetic # Lo TAMIL LETTER JA -0B9E..0B9F ; Alphabetic # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA -0BA3..0BA4 ; Alphabetic # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA -0BA8..0BAA ; Alphabetic # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA -0BAE..0BB5 ; Alphabetic # Lo [8] TAMIL LETTER MA..TAMIL LETTER VA -0BB7..0BB9 ; Alphabetic # Lo [3] TAMIL LETTER SSA..TAMIL LETTER HA -0BBE..0BBF ; Alphabetic # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I -0BC0 ; Alphabetic # Mn TAMIL VOWEL SIGN II -0BC1..0BC2 ; Alphabetic # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU -0BC6..0BC8 ; Alphabetic # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI -0BCA..0BCC ; Alphabetic # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU -0BD7 ; Alphabetic # Mc TAMIL AU LENGTH MARK -0C01..0C03 ; Alphabetic # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA -0C05..0C0C ; Alphabetic # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L -0C0E..0C10 ; Alphabetic # Lo [3] TELUGU LETTER E..TELUGU LETTER AI -0C12..0C28 ; Alphabetic # Lo [23] TELUGU LETTER O..TELUGU LETTER NA -0C2A..0C33 ; Alphabetic # Lo [10] TELUGU LETTER PA..TELUGU LETTER LLA -0C35..0C39 ; Alphabetic # Lo [5] TELUGU LETTER VA..TELUGU LETTER HA -0C3E..0C40 ; Alphabetic # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II -0C41..0C44 ; Alphabetic # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR -0C46..0C48 ; Alphabetic # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI -0C4A..0C4C ; Alphabetic # Mn [3] TELUGU VOWEL SIGN O..TELUGU VOWEL SIGN AU -0C55..0C56 ; Alphabetic # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK -0C60..0C61 ; Alphabetic # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL -0C82..0C83 ; Alphabetic # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA -0C85..0C8C ; Alphabetic # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L -0C8E..0C90 ; Alphabetic # Lo [3] KANNADA LETTER E..KANNADA LETTER AI -0C92..0CA8 ; Alphabetic # Lo [23] KANNADA LETTER O..KANNADA LETTER NA -0CAA..0CB3 ; Alphabetic # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA -0CB5..0CB9 ; Alphabetic # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA -0CBD ; Alphabetic # Lo KANNADA SIGN AVAGRAHA -0CBE ; Alphabetic # Mc KANNADA VOWEL SIGN AA -0CBF ; Alphabetic # Mn KANNADA VOWEL SIGN I -0CC0..0CC4 ; Alphabetic # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR -0CC6 ; Alphabetic # Mn KANNADA VOWEL SIGN E -0CC7..0CC8 ; Alphabetic # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI -0CCA..0CCB ; Alphabetic # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO -0CCC ; Alphabetic # Mn KANNADA VOWEL SIGN AU -0CD5..0CD6 ; Alphabetic # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK -0CDE ; Alphabetic # Lo KANNADA LETTER FA -0CE0..0CE1 ; Alphabetic # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL -0D02..0D03 ; Alphabetic # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA -0D05..0D0C ; Alphabetic # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L -0D0E..0D10 ; Alphabetic # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI -0D12..0D28 ; Alphabetic # Lo [23] MALAYALAM LETTER O..MALAYALAM LETTER NA -0D2A..0D39 ; Alphabetic # Lo [16] MALAYALAM LETTER PA..MALAYALAM LETTER HA -0D3E..0D40 ; Alphabetic # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II -0D41..0D43 ; Alphabetic # Mn [3] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC R -0D46..0D48 ; Alphabetic # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI -0D4A..0D4C ; Alphabetic # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU -0D57 ; Alphabetic # Mc MALAYALAM AU LENGTH MARK -0D60..0D61 ; Alphabetic # Lo [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL -0D82..0D83 ; Alphabetic # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA -0D85..0D96 ; Alphabetic # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA -0D9A..0DB1 ; Alphabetic # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA -0DB3..0DBB ; Alphabetic # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA -0DBD ; Alphabetic # Lo SINHALA LETTER DANTAJA LAYANNA -0DC0..0DC6 ; Alphabetic # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA -0DCF..0DD1 ; Alphabetic # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA -0DD2..0DD4 ; Alphabetic # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA -0DD6 ; Alphabetic # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA -0DD8..0DDF ; Alphabetic # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA -0DF2..0DF3 ; Alphabetic # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA -0E01..0E30 ; Alphabetic # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A -0E31 ; Alphabetic # Mn THAI CHARACTER MAI HAN-AKAT -0E32..0E33 ; Alphabetic # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM -0E34..0E3A ; Alphabetic # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU -0E40..0E45 ; Alphabetic # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO -0E46 ; Alphabetic # Lm THAI CHARACTER MAIYAMOK -0E4D ; Alphabetic # Mn THAI CHARACTER NIKHAHIT -0E81..0E82 ; Alphabetic # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG -0E84 ; Alphabetic # Lo LAO LETTER KHO TAM -0E87..0E88 ; Alphabetic # Lo [2] LAO LETTER NGO..LAO LETTER CO -0E8A ; Alphabetic # Lo LAO LETTER SO TAM -0E8D ; Alphabetic # Lo LAO LETTER NYO -0E94..0E97 ; Alphabetic # Lo [4] LAO LETTER DO..LAO LETTER THO TAM -0E99..0E9F ; Alphabetic # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG -0EA1..0EA3 ; Alphabetic # Lo [3] LAO LETTER MO..LAO LETTER LO LING -0EA5 ; Alphabetic # Lo LAO LETTER LO LOOT -0EA7 ; Alphabetic # Lo LAO LETTER WO -0EAA..0EAB ; Alphabetic # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG -0EAD..0EB0 ; Alphabetic # Lo [4] LAO LETTER O..LAO VOWEL SIGN A -0EB1 ; Alphabetic # Mn LAO VOWEL SIGN MAI KAN -0EB2..0EB3 ; Alphabetic # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM -0EB4..0EB9 ; Alphabetic # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU -0EBB..0EBC ; Alphabetic # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO -0EBD ; Alphabetic # Lo LAO SEMIVOWEL SIGN NYO -0EC0..0EC4 ; Alphabetic # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI -0EC6 ; Alphabetic # Lm LAO KO LA -0ECD ; Alphabetic # Mn LAO NIGGAHITA -0EDC..0EDD ; Alphabetic # Lo [2] LAO HO NO..LAO HO MO -0F00 ; Alphabetic # Lo TIBETAN SYLLABLE OM -0F40..0F47 ; Alphabetic # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA -0F49..0F6A ; Alphabetic # Lo [34] TIBETAN LETTER NYA..TIBETAN LETTER FIXED-FORM RA -0F71..0F7E ; Alphabetic # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO -0F7F ; Alphabetic # Mc TIBETAN SIGN RNAM BCAD -0F80..0F81 ; Alphabetic # Mn [2] TIBETAN VOWEL SIGN REVERSED I..TIBETAN VOWEL SIGN REVERSED II -0F88..0F8B ; Alphabetic # Lo [4] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN GRU MED RGYINGS -0F90..0F97 ; Alphabetic # Mn [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA -0F99..0FBC ; Alphabetic # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA -1000..1021 ; Alphabetic # Lo [34] MYANMAR LETTER KA..MYANMAR LETTER A -1023..1027 ; Alphabetic # Lo [5] MYANMAR LETTER I..MYANMAR LETTER E -1029..102A ; Alphabetic # Lo [2] MYANMAR LETTER O..MYANMAR LETTER AU -102C ; Alphabetic # Mc MYANMAR VOWEL SIGN AA -102D..1030 ; Alphabetic # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU -1031 ; Alphabetic # Mc MYANMAR VOWEL SIGN E -1032 ; Alphabetic # Mn MYANMAR VOWEL SIGN AI -1036 ; Alphabetic # Mn MYANMAR SIGN ANUSVARA -1038 ; Alphabetic # Mc MYANMAR SIGN VISARGA -1050..1055 ; Alphabetic # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL -1056..1057 ; Alphabetic # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR -1058..1059 ; Alphabetic # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL -10A0..10C5 ; Alphabetic # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE -10D0..10F8 ; Alphabetic # Lo [41] GEORGIAN LETTER AN..GEORGIAN LETTER ELIFI -1100..1159 ; Alphabetic # Lo [90] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH -115F..11A2 ; Alphabetic # Lo [68] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG SSANGARAEA -11A8..11F9 ; Alphabetic # Lo [82] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH -1200..1206 ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE HO -1208..1246 ; Alphabetic # Lo [63] ETHIOPIC SYLLABLE LA..ETHIOPIC SYLLABLE QO -1248 ; Alphabetic # Lo ETHIOPIC SYLLABLE QWA -124A..124D ; Alphabetic # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE -1250..1256 ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO -1258 ; Alphabetic # Lo ETHIOPIC SYLLABLE QHWA -125A..125D ; Alphabetic # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE -1260..1286 ; Alphabetic # Lo [39] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XO -1288 ; Alphabetic # Lo ETHIOPIC SYLLABLE XWA -128A..128D ; Alphabetic # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE -1290..12AE ; Alphabetic # Lo [31] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KO -12B0 ; Alphabetic # Lo ETHIOPIC SYLLABLE KWA -12B2..12B5 ; Alphabetic # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE -12B8..12BE ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO -12C0 ; Alphabetic # Lo ETHIOPIC SYLLABLE KXWA -12C2..12C5 ; Alphabetic # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE -12C8..12CE ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE WO -12D0..12D6 ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE PHARYNGEAL A..ETHIOPIC SYLLABLE PHARYNGEAL O -12D8..12EE ; Alphabetic # Lo [23] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE YO -12F0..130E ; Alphabetic # Lo [31] ETHIOPIC SYLLABLE DA..ETHIOPIC SYLLABLE GO -1310 ; Alphabetic # Lo ETHIOPIC SYLLABLE GWA -1312..1315 ; Alphabetic # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE -1318..131E ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE GGO -1320..1346 ; Alphabetic # Lo [39] ETHIOPIC SYLLABLE THA..ETHIOPIC SYLLABLE TZO -1348..135A ; Alphabetic # Lo [19] ETHIOPIC SYLLABLE FA..ETHIOPIC SYLLABLE FYA -13A0..13F4 ; Alphabetic # Lo [85] CHEROKEE LETTER A..CHEROKEE LETTER YV -1401..166C ; Alphabetic # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA -166F..1676 ; Alphabetic # Lo [8] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS NNGAA -1681..169A ; Alphabetic # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH -16A0..16EA ; Alphabetic # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X -16EE..16F0 ; Alphabetic # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL -1700..170C ; Alphabetic # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA -170E..1711 ; Alphabetic # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA -1712..1713 ; Alphabetic # Mn [2] TAGALOG VOWEL SIGN I..TAGALOG VOWEL SIGN U -1720..1731 ; Alphabetic # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA -1732..1733 ; Alphabetic # Mn [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U -1740..1751 ; Alphabetic # Lo [18] BUHID LETTER A..BUHID LETTER HA -1752..1753 ; Alphabetic # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U -1760..176C ; Alphabetic # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA -176E..1770 ; Alphabetic # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA -1772..1773 ; Alphabetic # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U -1780..17B3 ; Alphabetic # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU -17B6 ; Alphabetic # Mc KHMER VOWEL SIGN AA -17B7..17BD ; Alphabetic # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA -17BE..17C5 ; Alphabetic # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU -17C6 ; Alphabetic # Mn KHMER SIGN NIKAHIT -17C7..17C8 ; Alphabetic # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU -17D7 ; Alphabetic # Lm KHMER SIGN LEK TOO -17DC ; Alphabetic # Lo KHMER SIGN AVAKRAHASANYA -1820..1842 ; Alphabetic # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI -1843 ; Alphabetic # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN -1844..1877 ; Alphabetic # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA -1880..18A8 ; Alphabetic # Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA -18A9 ; Alphabetic # Mn MONGOLIAN LETTER ALI GALI DAGALGA -1900..191C ; Alphabetic # Lo [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA -1920..1922 ; Alphabetic # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U -1923..1926 ; Alphabetic # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU -1927..1928 ; Alphabetic # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O -1929..192B ; Alphabetic # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA -1930..1931 ; Alphabetic # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA -1932 ; Alphabetic # Mn LIMBU SMALL LETTER ANUSVARA -1933..1938 ; Alphabetic # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA -1950..196D ; Alphabetic # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI -1970..1974 ; Alphabetic # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 -1D00..1D2B ; Alphabetic # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL -1D2C..1D61 ; Alphabetic # Lm [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI -1D62..1D6B ; Alphabetic # L& [10] LATIN SUBSCRIPT SMALL LETTER I..LATIN SMALL LETTER UE -1E00..1E9B ; Alphabetic # L& [156] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER LONG S WITH DOT ABOVE -1EA0..1EF9 ; Alphabetic # L& [90] LATIN CAPITAL LETTER A WITH DOT BELOW..LATIN SMALL LETTER Y WITH TILDE -1F00..1F15 ; Alphabetic # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA -1F18..1F1D ; Alphabetic # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA -1F20..1F45 ; Alphabetic # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA -1F48..1F4D ; Alphabetic # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA -1F50..1F57 ; Alphabetic # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI -1F59 ; Alphabetic # L& GREEK CAPITAL LETTER UPSILON WITH DASIA -1F5B ; Alphabetic # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA -1F5D ; Alphabetic # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA -1F5F..1F7D ; Alphabetic # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA -1F80..1FB4 ; Alphabetic # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI -1FB6..1FBC ; Alphabetic # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI -1FBE ; Alphabetic # L& GREEK PROSGEGRAMMENI -1FC2..1FC4 ; Alphabetic # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI -1FC6..1FCC ; Alphabetic # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI -1FD0..1FD3 ; Alphabetic # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA -1FD6..1FDB ; Alphabetic # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA -1FE0..1FEC ; Alphabetic # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA -1FF2..1FF4 ; Alphabetic # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI -1FF6..1FFC ; Alphabetic # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI -2071 ; Alphabetic # L& SUPERSCRIPT LATIN SMALL LETTER I -207F ; Alphabetic # L& SUPERSCRIPT LATIN SMALL LETTER N -2102 ; Alphabetic # L& DOUBLE-STRUCK CAPITAL C -2107 ; Alphabetic # L& EULER CONSTANT -210A..2113 ; Alphabetic # L& [10] SCRIPT SMALL G..SCRIPT SMALL L -2115 ; Alphabetic # L& DOUBLE-STRUCK CAPITAL N -2119..211D ; Alphabetic # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R -2124 ; Alphabetic # L& DOUBLE-STRUCK CAPITAL Z -2126 ; Alphabetic # L& OHM SIGN -2128 ; Alphabetic # L& BLACK-LETTER CAPITAL Z -212A..212D ; Alphabetic # L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C -212F..2131 ; Alphabetic # L& [3] SCRIPT SMALL E..SCRIPT CAPITAL F -2133..2134 ; Alphabetic # L& [2] SCRIPT CAPITAL M..SCRIPT SMALL O -2135..2138 ; Alphabetic # Lo [4] ALEF SYMBOL..DALET SYMBOL -2139 ; Alphabetic # L& INFORMATION SOURCE -213D..213F ; Alphabetic # L& [3] DOUBLE-STRUCK SMALL GAMMA..DOUBLE-STRUCK CAPITAL PI -2145..2149 ; Alphabetic # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J -2160..2183 ; Alphabetic # Nl [36] ROMAN NUMERAL ONE..ROMAN NUMERAL REVERSED ONE HUNDRED -3005 ; Alphabetic # Lm IDEOGRAPHIC ITERATION MARK -3006 ; Alphabetic # Lo IDEOGRAPHIC CLOSING MARK -3007 ; Alphabetic # Nl IDEOGRAPHIC NUMBER ZERO -3021..3029 ; Alphabetic # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE -3031..3035 ; Alphabetic # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF -3038..303A ; Alphabetic # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY -303B ; Alphabetic # Lm VERTICAL IDEOGRAPHIC ITERATION MARK -303C ; Alphabetic # Lo MASU MARK -3041..3096 ; Alphabetic # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE -309D..309E ; Alphabetic # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK -309F ; Alphabetic # Lo HIRAGANA DIGRAPH YORI -30A1..30FA ; Alphabetic # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO -30FC..30FE ; Alphabetic # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK -30FF ; Alphabetic # Lo KATAKANA DIGRAPH KOTO -3105..312C ; Alphabetic # Lo [40] BOPOMOFO LETTER B..BOPOMOFO LETTER GN -3131..318E ; Alphabetic # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE -31A0..31B7 ; Alphabetic # Lo [24] BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H -31F0..31FF ; Alphabetic # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO -3400..4DB5 ; Alphabetic # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 -4E00..9FA5 ; Alphabetic # Lo [20902] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FA5 -A000..A48C ; Alphabetic # Lo [1165] YI SYLLABLE IT..YI SYLLABLE YYR -AC00..D7A3 ; Alphabetic # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH -F900..FA2D ; Alphabetic # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D -FA30..FA6A ; Alphabetic # Lo [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A -FB00..FB06 ; Alphabetic # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST -FB13..FB17 ; Alphabetic # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH -FB1D ; Alphabetic # Lo HEBREW LETTER YOD WITH HIRIQ -FB1E ; Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA -FB1F..FB28 ; Alphabetic # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV -FB2A..FB36 ; Alphabetic # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH -FB38..FB3C ; Alphabetic # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH -FB3E ; Alphabetic # Lo HEBREW LETTER MEM WITH DAGESH -FB40..FB41 ; Alphabetic # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH -FB43..FB44 ; Alphabetic # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH -FB46..FBB1 ; Alphabetic # Lo [108] HEBREW LETTER TSADI WITH DAGESH..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM -FBD3..FD3D ; Alphabetic # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM -FD50..FD8F ; Alphabetic # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM -FD92..FDC7 ; Alphabetic # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM -FDF0..FDFB ; Alphabetic # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU -FE70..FE74 ; Alphabetic # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM -FE76..FEFC ; Alphabetic # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM -FF21..FF3A ; Alphabetic # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z -FF41..FF5A ; Alphabetic # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z -FF66..FF6F ; Alphabetic # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU -FF70 ; Alphabetic # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK -FF71..FF9D ; Alphabetic # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N -FF9E..FF9F ; Alphabetic # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK -FFA0..FFBE ; Alphabetic # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH -FFC2..FFC7 ; Alphabetic # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E -FFCA..FFCF ; Alphabetic # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE -FFD2..FFD7 ; Alphabetic # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU -FFDA..FFDC ; Alphabetic # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I -10000..1000B ; Alphabetic # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE -1000D..10026 ; Alphabetic # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO -10028..1003A ; Alphabetic # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO -1003C..1003D ; Alphabetic # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE -1003F..1004D ; Alphabetic # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO -10050..1005D ; Alphabetic # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 -10080..100FA ; Alphabetic # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 -10300..1031E ; Alphabetic # Lo [31] OLD ITALIC LETTER A..OLD ITALIC LETTER UU -10330..10349 ; Alphabetic # Lo [26] GOTHIC LETTER AHSA..GOTHIC LETTER OTHAL -1034A ; Alphabetic # Nl GOTHIC LETTER NINE HUNDRED -10380..1039D ; Alphabetic # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU -10400..1044F ; Alphabetic # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW -10450..1049D ; Alphabetic # Lo [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO -10800..10805 ; Alphabetic # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA -10808 ; Alphabetic # Lo CYPRIOT SYLLABLE JO -1080A..10835 ; Alphabetic # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO -10837..10838 ; Alphabetic # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE -1083C ; Alphabetic # Lo CYPRIOT SYLLABLE ZA -1083F ; Alphabetic # Lo CYPRIOT SYLLABLE ZO -1D400..1D454 ; Alphabetic # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G -1D456..1D49C ; Alphabetic # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A -1D49E..1D49F ; Alphabetic # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D -1D4A2 ; Alphabetic # L& MATHEMATICAL SCRIPT CAPITAL G -1D4A5..1D4A6 ; Alphabetic # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K -1D4A9..1D4AC ; Alphabetic # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q -1D4AE..1D4B9 ; Alphabetic # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D -1D4BB ; Alphabetic # L& MATHEMATICAL SCRIPT SMALL F -1D4BD..1D4C3 ; Alphabetic # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N -1D4C5..1D505 ; Alphabetic # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B -1D507..1D50A ; Alphabetic # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G -1D50D..1D514 ; Alphabetic # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q -1D516..1D51C ; Alphabetic # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y -1D51E..1D539 ; Alphabetic # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B -1D53B..1D53E ; Alphabetic # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G -1D540..1D544 ; Alphabetic # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M -1D546 ; Alphabetic # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O -1D54A..1D550 ; Alphabetic # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y -1D552..1D6A3 ; Alphabetic # L& [338] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL MONOSPACE SMALL Z -1D6A8..1D6C0 ; Alphabetic # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA -1D6C2..1D6DA ; Alphabetic # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA -1D6DC..1D6FA ; Alphabetic # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA -1D6FC..1D714 ; Alphabetic # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA -1D716..1D734 ; Alphabetic # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA -1D736..1D74E ; Alphabetic # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA -1D750..1D76E ; Alphabetic # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA -1D770..1D788 ; Alphabetic # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA -1D78A..1D7A8 ; Alphabetic # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA -1D7AA..1D7C2 ; Alphabetic # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA -1D7C4..1D7C9 ; Alphabetic # L& [6] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL -20000..2A6D6 ; Alphabetic # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 -2F800..2FA1D ; Alphabetic # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D +0041..005A ; Alphabetic +0061..007A ; Alphabetic +00AA ; Alphabetic +00B5 ; Alphabetic +00BA ; Alphabetic +00C0..00D6 ; Alphabetic +00D8..00F6 ; Alphabetic +00F8..01BA ; Alphabetic +01BB ; Alphabetic +01BC..01BF ; Alphabetic +01C0..01C3 ; Alphabetic +01C4..0236 ; Alphabetic +0250..02AF ; Alphabetic +02B0..02C1 ; Alphabetic +02C6..02D1 ; Alphabetic +02E0..02E4 ; Alphabetic +02EE ; Alphabetic +0345 ; Alphabetic +037A ; Alphabetic +0386 ; Alphabetic +0388..038A ; Alphabetic +038C ; Alphabetic +038E..03A1 ; Alphabetic +03A3..03CE ; Alphabetic +03D0..03F5 ; Alphabetic +03F7..03FB ; Alphabetic +0400..0481 ; Alphabetic +048A..04CE ; Alphabetic +04D0..04F5 ; Alphabetic +04F8..04F9 ; Alphabetic +0500..050F ; Alphabetic +0531..0556 ; Alphabetic +0559 ; Alphabetic +0561..0587 ; Alphabetic +05B0..05B9 ; Alphabetic +05BB..05BD ; Alphabetic +05BF ; Alphabetic +05C1..05C2 ; Alphabetic +05C4 ; Alphabetic +05D0..05EA ; Alphabetic +05F0..05F2 ; Alphabetic +0610..0615 ; Alphabetic +0621..063A ; Alphabetic +0640 ; Alphabetic +0641..064A ; Alphabetic +064B..0657 ; Alphabetic +066E..066F ; Alphabetic +0670 ; Alphabetic +0671..06D3 ; Alphabetic +06D5 ; Alphabetic +06D6..06DC ; Alphabetic +06E1..06E4 ; Alphabetic +06E5..06E6 ; Alphabetic +06E7..06E8 ; Alphabetic +06ED ; Alphabetic +06EE..06EF ; Alphabetic +06FA..06FC ; Alphabetic +06FF ; Alphabetic +0710 ; Alphabetic +0711 ; Alphabetic +0712..072F ; Alphabetic +0730..073F ; Alphabetic +074D..074F ; Alphabetic +0780..07A5 ; Alphabetic +07A6..07B0 ; Alphabetic +07B1 ; Alphabetic +0901..0902 ; Alphabetic +0903 ; Alphabetic +0904..0939 ; Alphabetic +093D ; Alphabetic +093E..0940 ; Alphabetic +0941..0948 ; Alphabetic +0949..094C ; Alphabetic +0950 ; Alphabetic +0958..0961 ; Alphabetic +0962..0963 ; Alphabetic +0981 ; Alphabetic +0982..0983 ; Alphabetic +0985..098C ; Alphabetic +098F..0990 ; Alphabetic +0993..09A8 ; Alphabetic +09AA..09B0 ; Alphabetic +09B2 ; Alphabetic +09B6..09B9 ; Alphabetic +09BD ; Alphabetic +09BE..09C0 ; Alphabetic +09C1..09C4 ; Alphabetic +09C7..09C8 ; Alphabetic +09CB..09CC ; Alphabetic +09D7 ; Alphabetic +09DC..09DD ; Alphabetic +09DF..09E1 ; Alphabetic +09E2..09E3 ; Alphabetic +09F0..09F1 ; Alphabetic +0A01..0A02 ; Alphabetic +0A03 ; Alphabetic +0A05..0A0A ; Alphabetic +0A0F..0A10 ; Alphabetic +0A13..0A28 ; Alphabetic +0A2A..0A30 ; Alphabetic +0A32..0A33 ; Alphabetic +0A35..0A36 ; Alphabetic +0A38..0A39 ; Alphabetic +0A3E..0A40 ; Alphabetic +0A41..0A42 ; Alphabetic +0A47..0A48 ; Alphabetic +0A4B..0A4C ; Alphabetic +0A59..0A5C ; Alphabetic +0A5E ; Alphabetic +0A70..0A71 ; Alphabetic +0A72..0A74 ; Alphabetic +0A81..0A82 ; Alphabetic +0A83 ; Alphabetic +0A85..0A8D ; Alphabetic +0A8F..0A91 ; Alphabetic +0A93..0AA8 ; Alphabetic +0AAA..0AB0 ; Alphabetic +0AB2..0AB3 ; Alphabetic +0AB5..0AB9 ; Alphabetic +0ABD ; Alphabetic +0ABE..0AC0 ; Alphabetic +0AC1..0AC5 ; Alphabetic +0AC7..0AC8 ; Alphabetic +0AC9 ; Alphabetic +0ACB..0ACC ; Alphabetic +0AD0 ; Alphabetic +0AE0..0AE1 ; Alphabetic +0AE2..0AE3 ; Alphabetic +0B01 ; Alphabetic +0B02..0B03 ; Alphabetic +0B05..0B0C ; Alphabetic +0B0F..0B10 ; Alphabetic +0B13..0B28 ; Alphabetic +0B2A..0B30 ; Alphabetic +0B32..0B33 ; Alphabetic +0B35..0B39 ; Alphabetic +0B3D ; Alphabetic +0B3E ; Alphabetic +0B3F ; Alphabetic +0B40 ; Alphabetic +0B41..0B43 ; Alphabetic +0B47..0B48 ; Alphabetic +0B4B..0B4C ; Alphabetic +0B56 ; Alphabetic +0B57 ; Alphabetic +0B5C..0B5D ; Alphabetic +0B5F..0B61 ; Alphabetic +0B71 ; Alphabetic +0B82 ; Alphabetic +0B83 ; Alphabetic +0B85..0B8A ; Alphabetic +0B8E..0B90 ; Alphabetic +0B92..0B95 ; Alphabetic +0B99..0B9A ; Alphabetic +0B9C ; Alphabetic +0B9E..0B9F ; Alphabetic +0BA3..0BA4 ; Alphabetic +0BA8..0BAA ; Alphabetic +0BAE..0BB5 ; Alphabetic +0BB7..0BB9 ; Alphabetic +0BBE..0BBF ; Alphabetic +0BC0 ; Alphabetic +0BC1..0BC2 ; Alphabetic +0BC6..0BC8 ; Alphabetic +0BCA..0BCC ; Alphabetic +0BD7 ; Alphabetic +0C01..0C03 ; Alphabetic +0C05..0C0C ; Alphabetic +0C0E..0C10 ; Alphabetic +0C12..0C28 ; Alphabetic +0C2A..0C33 ; Alphabetic +0C35..0C39 ; Alphabetic +0C3E..0C40 ; Alphabetic +0C41..0C44 ; Alphabetic +0C46..0C48 ; Alphabetic +0C4A..0C4C ; Alphabetic +0C55..0C56 ; Alphabetic +0C60..0C61 ; Alphabetic +0C82..0C83 ; Alphabetic +0C85..0C8C ; Alphabetic +0C8E..0C90 ; Alphabetic +0C92..0CA8 ; Alphabetic +0CAA..0CB3 ; Alphabetic +0CB5..0CB9 ; Alphabetic +0CBD ; Alphabetic +0CBE ; Alphabetic +0CBF ; Alphabetic +0CC0..0CC4 ; Alphabetic +0CC6 ; Alphabetic +0CC7..0CC8 ; Alphabetic +0CCA..0CCB ; Alphabetic +0CCC ; Alphabetic +0CD5..0CD6 ; Alphabetic +0CDE ; Alphabetic +0CE0..0CE1 ; Alphabetic +0D02..0D03 ; Alphabetic +0D05..0D0C ; Alphabetic +0D0E..0D10 ; Alphabetic +0D12..0D28 ; Alphabetic +0D2A..0D39 ; Alphabetic +0D3E..0D40 ; Alphabetic +0D41..0D43 ; Alphabetic +0D46..0D48 ; Alphabetic +0D4A..0D4C ; Alphabetic +0D57 ; Alphabetic +0D60..0D61 ; Alphabetic +0D82..0D83 ; Alphabetic +0D85..0D96 ; Alphabetic +0D9A..0DB1 ; Alphabetic +0DB3..0DBB ; Alphabetic +0DBD ; Alphabetic +0DC0..0DC6 ; Alphabetic +0DCF..0DD1 ; Alphabetic +0DD2..0DD4 ; Alphabetic +0DD6 ; Alphabetic +0DD8..0DDF ; Alphabetic +0DF2..0DF3 ; Alphabetic +0E01..0E30 ; Alphabetic +0E31 ; Alphabetic +0E32..0E33 ; Alphabetic +0E34..0E3A ; Alphabetic +0E40..0E45 ; Alphabetic +0E46 ; Alphabetic +0E4D ; Alphabetic +0E81..0E82 ; Alphabetic +0E84 ; Alphabetic +0E87..0E88 ; Alphabetic +0E8A ; Alphabetic +0E8D ; Alphabetic +0E94..0E97 ; Alphabetic +0E99..0E9F ; Alphabetic +0EA1..0EA3 ; Alphabetic +0EA5 ; Alphabetic +0EA7 ; Alphabetic +0EAA..0EAB ; Alphabetic +0EAD..0EB0 ; Alphabetic +0EB1 ; Alphabetic +0EB2..0EB3 ; Alphabetic +0EB4..0EB9 ; Alphabetic +0EBB..0EBC ; Alphabetic +0EBD ; Alphabetic +0EC0..0EC4 ; Alphabetic +0EC6 ; Alphabetic +0ECD ; Alphabetic +0EDC..0EDD ; Alphabetic +0F00 ; Alphabetic +0F40..0F47 ; Alphabetic +0F49..0F6A ; Alphabetic +0F71..0F7E ; Alphabetic +0F7F ; Alphabetic +0F80..0F81 ; Alphabetic +0F88..0F8B ; Alphabetic +0F90..0F97 ; Alphabetic +0F99..0FBC ; Alphabetic +1000..1021 ; Alphabetic +1023..1027 ; Alphabetic +1029..102A ; Alphabetic +102C ; Alphabetic +102D..1030 ; Alphabetic +1031 ; Alphabetic +1032 ; Alphabetic +1036 ; Alphabetic +1038 ; Alphabetic +1050..1055 ; Alphabetic +1056..1057 ; Alphabetic +1058..1059 ; Alphabetic +10A0..10C5 ; Alphabetic +10D0..10F8 ; Alphabetic +1100..1159 ; Alphabetic +115F..11A2 ; Alphabetic +11A8..11F9 ; Alphabetic +1200..1206 ; Alphabetic +1208..1246 ; Alphabetic +1248 ; Alphabetic +124A..124D ; Alphabetic +1250..1256 ; Alphabetic +1258 ; Alphabetic +125A..125D ; Alphabetic +1260..1286 ; Alphabetic +1288 ; Alphabetic +128A..128D ; Alphabetic +1290..12AE ; Alphabetic +12B0 ; Alphabetic +12B2..12B5 ; Alphabetic +12B8..12BE ; Alphabetic +12C0 ; Alphabetic +12C2..12C5 ; Alphabetic +12C8..12CE ; Alphabetic +12D0..12D6 ; Alphabetic +12D8..12EE ; Alphabetic +12F0..130E ; Alphabetic +1310 ; Alphabetic +1312..1315 ; Alphabetic +1318..131E ; Alphabetic +1320..1346 ; Alphabetic +1348..135A ; Alphabetic +13A0..13F4 ; Alphabetic +1401..166C ; Alphabetic +166F..1676 ; Alphabetic +1681..169A ; Alphabetic +16A0..16EA ; Alphabetic +16EE..16F0 ; Alphabetic +1700..170C ; Alphabetic +170E..1711 ; Alphabetic +1712..1713 ; Alphabetic +1720..1731 ; Alphabetic +1732..1733 ; Alphabetic +1740..1751 ; Alphabetic +1752..1753 ; Alphabetic +1760..176C ; Alphabetic +176E..1770 ; Alphabetic +1772..1773 ; Alphabetic +1780..17B3 ; Alphabetic +17B6 ; Alphabetic +17B7..17BD ; Alphabetic +17BE..17C5 ; Alphabetic +17C6 ; Alphabetic +17C7..17C8 ; Alphabetic +17D7 ; Alphabetic +17DC ; Alphabetic +1820..1842 ; Alphabetic +1843 ; Alphabetic +1844..1877 ; Alphabetic +1880..18A8 ; Alphabetic +18A9 ; Alphabetic +1900..191C ; Alphabetic +1920..1922 ; Alphabetic +1923..1926 ; Alphabetic +1927..1928 ; Alphabetic +1929..192B ; Alphabetic +1930..1931 ; Alphabetic +1932 ; Alphabetic +1933..1938 ; Alphabetic +1950..196D ; Alphabetic +1970..1974 ; Alphabetic +1D00..1D2B ; Alphabetic +1D2C..1D61 ; Alphabetic +1D62..1D6B ; Alphabetic +1E00..1E9B ; Alphabetic +1EA0..1EF9 ; Alphabetic +1F00..1F15 ; Alphabetic +1F18..1F1D ; Alphabetic +1F20..1F45 ; Alphabetic +1F48..1F4D ; Alphabetic +1F50..1F57 ; Alphabetic +1F59 ; Alphabetic +1F5B ; Alphabetic +1F5D ; Alphabetic +1F5F..1F7D ; Alphabetic +1F80..1FB4 ; Alphabetic +1FB6..1FBC ; Alphabetic +1FBE ; Alphabetic +1FC2..1FC4 ; Alphabetic +1FC6..1FCC ; Alphabetic +1FD0..1FD3 ; Alphabetic +1FD6..1FDB ; Alphabetic +1FE0..1FEC ; Alphabetic +1FF2..1FF4 ; Alphabetic +1FF6..1FFC ; Alphabetic +2071 ; Alphabetic +207F ; Alphabetic +2102 ; Alphabetic +2107 ; Alphabetic +210A..2113 ; Alphabetic +2115 ; Alphabetic +2119..211D ; Alphabetic +2124 ; Alphabetic +2126 ; Alphabetic +2128 ; Alphabetic +212A..212D ; Alphabetic +212F..2131 ; Alphabetic +2133..2134 ; Alphabetic +2135..2138 ; Alphabetic +2139 ; Alphabetic +213D..213F ; Alphabetic +2145..2149 ; Alphabetic +2160..2183 ; Alphabetic +3005 ; Alphabetic +3006 ; Alphabetic +3007 ; Alphabetic +3021..3029 ; Alphabetic +3031..3035 ; Alphabetic +3038..303A ; Alphabetic +303B ; Alphabetic +303C ; Alphabetic +3041..3096 ; Alphabetic +309D..309E ; Alphabetic +309F ; Alphabetic +30A1..30FA ; Alphabetic +30FC..30FE ; Alphabetic +30FF ; Alphabetic +3105..312C ; Alphabetic +3131..318E ; Alphabetic +31A0..31B7 ; Alphabetic +31F0..31FF ; Alphabetic +3400..4DB5 ; Alphabetic +4E00..9FA5 ; Alphabetic +A000..A48C ; Alphabetic +AC00..D7A3 ; Alphabetic +F900..FA2D ; Alphabetic +FA30..FA6A ; Alphabetic +FB00..FB06 ; Alphabetic +FB13..FB17 ; Alphabetic +FB1D ; Alphabetic +FB1E ; Alphabetic +FB1F..FB28 ; Alphabetic +FB2A..FB36 ; Alphabetic +FB38..FB3C ; Alphabetic +FB3E ; Alphabetic +FB40..FB41 ; Alphabetic +FB43..FB44 ; Alphabetic +FB46..FBB1 ; Alphabetic +FBD3..FD3D ; Alphabetic +FD50..FD8F ; Alphabetic +FD92..FDC7 ; Alphabetic +FDF0..FDFB ; Alphabetic +FE70..FE74 ; Alphabetic +FE76..FEFC ; Alphabetic +FF21..FF3A ; Alphabetic +FF41..FF5A ; Alphabetic +FF66..FF6F ; Alphabetic +FF70 ; Alphabetic +FF71..FF9D ; Alphabetic +FF9E..FF9F ; Alphabetic +FFA0..FFBE ; Alphabetic +FFC2..FFC7 ; Alphabetic +FFCA..FFCF ; Alphabetic +FFD2..FFD7 ; Alphabetic +FFDA..FFDC ; Alphabetic +10000..1000B ; Alphabetic +1000D..10026 ; Alphabetic +10028..1003A ; Alphabetic +1003C..1003D ; Alphabetic +1003F..1004D ; Alphabetic +10050..1005D ; Alphabetic +10080..100FA ; Alphabetic +10300..1031E ; Alphabetic +10330..10349 ; Alphabetic +1034A ; Alphabetic +10380..1039D ; Alphabetic +10400..1044F ; Alphabetic +10450..1049D ; Alphabetic +10800..10805 ; Alphabetic +10808 ; Alphabetic +1080A..10835 ; Alphabetic +10837..10838 ; Alphabetic +1083C ; Alphabetic +1083F ; Alphabetic +1D400..1D454 ; Alphabetic +1D456..1D49C ; Alphabetic +1D49E..1D49F ; Alphabetic +1D4A2 ; Alphabetic +1D4A5..1D4A6 ; Alphabetic +1D4A9..1D4AC ; Alphabetic +1D4AE..1D4B9 ; Alphabetic +1D4BB ; Alphabetic +1D4BD..1D4C3 ; Alphabetic +1D4C5..1D505 ; Alphabetic +1D507..1D50A ; Alphabetic +1D50D..1D514 ; Alphabetic +1D516..1D51C ; Alphabetic +1D51E..1D539 ; Alphabetic +1D53B..1D53E ; Alphabetic +1D540..1D544 ; Alphabetic +1D546 ; Alphabetic +1D54A..1D550 ; Alphabetic +1D552..1D6A3 ; Alphabetic +1D6A8..1D6C0 ; Alphabetic +1D6C2..1D6DA ; Alphabetic +1D6DC..1D6FA ; Alphabetic +1D6FC..1D714 ; Alphabetic +1D716..1D734 ; Alphabetic +1D736..1D74E ; Alphabetic +1D750..1D76E ; Alphabetic +1D770..1D788 ; Alphabetic +1D78A..1D7A8 ; Alphabetic +1D7AA..1D7C2 ; Alphabetic +1D7C4..1D7C9 ; Alphabetic +20000..2A6D6 ; Alphabetic +2F800..2FA1D ; Alphabetic # Total code points: 90989 @@ -651,438 +667,438 @@ FFDA..FFDC ; Alphabetic # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANG # Derived Property: Lowercase # Generated from: Ll + Other_Lowercase -0061..007A ; Lowercase # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z -00AA ; Lowercase # L& FEMININE ORDINAL INDICATOR -00B5 ; Lowercase # L& MICRO SIGN -00BA ; Lowercase # L& MASCULINE ORDINAL INDICATOR -00DF..00F6 ; Lowercase # L& [24] LATIN SMALL LETTER SHARP S..LATIN SMALL LETTER O WITH DIAERESIS -00F8..00FF ; Lowercase # L& [8] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER Y WITH DIAERESIS -0101 ; Lowercase # L& LATIN SMALL LETTER A WITH MACRON -0103 ; Lowercase # L& LATIN SMALL LETTER A WITH BREVE -0105 ; Lowercase # L& LATIN SMALL LETTER A WITH OGONEK -0107 ; Lowercase # L& LATIN SMALL LETTER C WITH ACUTE -0109 ; Lowercase # L& LATIN SMALL LETTER C WITH CIRCUMFLEX -010B ; Lowercase # L& LATIN SMALL LETTER C WITH DOT ABOVE -010D ; Lowercase # L& LATIN SMALL LETTER C WITH CARON -010F ; Lowercase # L& LATIN SMALL LETTER D WITH CARON -0111 ; Lowercase # L& LATIN SMALL LETTER D WITH STROKE -0113 ; Lowercase # L& LATIN SMALL LETTER E WITH MACRON -0115 ; Lowercase # L& LATIN SMALL LETTER E WITH BREVE -0117 ; Lowercase # L& LATIN SMALL LETTER E WITH DOT ABOVE -0119 ; Lowercase # L& LATIN SMALL LETTER E WITH OGONEK -011B ; Lowercase # L& LATIN SMALL LETTER E WITH CARON -011D ; Lowercase # L& LATIN SMALL LETTER G WITH CIRCUMFLEX -011F ; Lowercase # L& LATIN SMALL LETTER G WITH BREVE -0121 ; Lowercase # L& LATIN SMALL LETTER G WITH DOT ABOVE -0123 ; Lowercase # L& LATIN SMALL LETTER G WITH CEDILLA -0125 ; Lowercase # L& LATIN SMALL LETTER H WITH CIRCUMFLEX -0127 ; Lowercase # L& LATIN SMALL LETTER H WITH STROKE -0129 ; Lowercase # L& LATIN SMALL LETTER I WITH TILDE -012B ; Lowercase # L& LATIN SMALL LETTER I WITH MACRON -012D ; Lowercase # L& LATIN SMALL LETTER I WITH BREVE -012F ; Lowercase # L& LATIN SMALL LETTER I WITH OGONEK -0131 ; Lowercase # L& LATIN SMALL LETTER DOTLESS I -0133 ; Lowercase # L& LATIN SMALL LIGATURE IJ -0135 ; Lowercase # L& LATIN SMALL LETTER J WITH CIRCUMFLEX -0137..0138 ; Lowercase # L& [2] LATIN SMALL LETTER K WITH CEDILLA..LATIN SMALL LETTER KRA -013A ; Lowercase # L& LATIN SMALL LETTER L WITH ACUTE -013C ; Lowercase # L& LATIN SMALL LETTER L WITH CEDILLA -013E ; Lowercase # L& LATIN SMALL LETTER L WITH CARON -0140 ; Lowercase # L& LATIN SMALL LETTER L WITH MIDDLE DOT -0142 ; Lowercase # L& LATIN SMALL LETTER L WITH STROKE -0144 ; Lowercase # L& LATIN SMALL LETTER N WITH ACUTE -0146 ; Lowercase # L& LATIN SMALL LETTER N WITH CEDILLA -0148..0149 ; Lowercase # L& [2] LATIN SMALL LETTER N WITH CARON..LATIN SMALL LETTER N PRECEDED BY APOSTROPHE -014B ; Lowercase # L& LATIN SMALL LETTER ENG -014D ; Lowercase # L& LATIN SMALL LETTER O WITH MACRON -014F ; Lowercase # L& LATIN SMALL LETTER O WITH BREVE -0151 ; Lowercase # L& LATIN SMALL LETTER O WITH DOUBLE ACUTE -0153 ; Lowercase # L& LATIN SMALL LIGATURE OE -0155 ; Lowercase # L& LATIN SMALL LETTER R WITH ACUTE -0157 ; Lowercase # L& LATIN SMALL LETTER R WITH CEDILLA -0159 ; Lowercase # L& LATIN SMALL LETTER R WITH CARON -015B ; Lowercase # L& LATIN SMALL LETTER S WITH ACUTE -015D ; Lowercase # L& LATIN SMALL LETTER S WITH CIRCUMFLEX -015F ; Lowercase # L& LATIN SMALL LETTER S WITH CEDILLA -0161 ; Lowercase # L& LATIN SMALL LETTER S WITH CARON -0163 ; Lowercase # L& LATIN SMALL LETTER T WITH CEDILLA -0165 ; Lowercase # L& LATIN SMALL LETTER T WITH CARON -0167 ; Lowercase # L& LATIN SMALL LETTER T WITH STROKE -0169 ; Lowercase # L& LATIN SMALL LETTER U WITH TILDE -016B ; Lowercase # L& LATIN SMALL LETTER U WITH MACRON -016D ; Lowercase # L& LATIN SMALL LETTER U WITH BREVE -016F ; Lowercase # L& LATIN SMALL LETTER U WITH RING ABOVE -0171 ; Lowercase # L& LATIN SMALL LETTER U WITH DOUBLE ACUTE -0173 ; Lowercase # L& LATIN SMALL LETTER U WITH OGONEK -0175 ; Lowercase # L& LATIN SMALL LETTER W WITH CIRCUMFLEX -0177 ; Lowercase # L& LATIN SMALL LETTER Y WITH CIRCUMFLEX -017A ; Lowercase # L& LATIN SMALL LETTER Z WITH ACUTE -017C ; Lowercase # L& LATIN SMALL LETTER Z WITH DOT ABOVE -017E..0180 ; Lowercase # L& [3] LATIN SMALL LETTER Z WITH CARON..LATIN SMALL LETTER B WITH STROKE -0183 ; Lowercase # L& LATIN SMALL LETTER B WITH TOPBAR -0185 ; Lowercase # L& LATIN SMALL LETTER TONE SIX -0188 ; Lowercase # L& LATIN SMALL LETTER C WITH HOOK -018C..018D ; Lowercase # L& [2] LATIN SMALL LETTER D WITH TOPBAR..LATIN SMALL LETTER TURNED DELTA -0192 ; Lowercase # L& LATIN SMALL LETTER F WITH HOOK -0195 ; Lowercase # L& LATIN SMALL LETTER HV -0199..019B ; Lowercase # L& [3] LATIN SMALL LETTER K WITH HOOK..LATIN SMALL LETTER LAMBDA WITH STROKE -019E ; Lowercase # L& LATIN SMALL LETTER N WITH LONG RIGHT LEG -01A1 ; Lowercase # L& LATIN SMALL LETTER O WITH HORN -01A3 ; Lowercase # L& LATIN SMALL LETTER OI -01A5 ; Lowercase # L& LATIN SMALL LETTER P WITH HOOK -01A8 ; Lowercase # L& LATIN SMALL LETTER TONE TWO -01AA..01AB ; Lowercase # L& [2] LATIN LETTER REVERSED ESH LOOP..LATIN SMALL LETTER T WITH PALATAL HOOK -01AD ; Lowercase # L& LATIN SMALL LETTER T WITH HOOK -01B0 ; Lowercase # L& LATIN SMALL LETTER U WITH HORN -01B4 ; Lowercase # L& LATIN SMALL LETTER Y WITH HOOK -01B6 ; Lowercase # L& LATIN SMALL LETTER Z WITH STROKE -01B9..01BA ; Lowercase # L& [2] LATIN SMALL LETTER EZH REVERSED..LATIN SMALL LETTER EZH WITH TAIL -01BD..01BF ; Lowercase # L& [3] LATIN SMALL LETTER TONE FIVE..LATIN LETTER WYNN -01C6 ; Lowercase # L& LATIN SMALL LETTER DZ WITH CARON -01C9 ; Lowercase # L& LATIN SMALL LETTER LJ -01CC ; Lowercase # L& LATIN SMALL LETTER NJ -01CE ; Lowercase # L& LATIN SMALL LETTER A WITH CARON -01D0 ; Lowercase # L& LATIN SMALL LETTER I WITH CARON -01D2 ; Lowercase # L& LATIN SMALL LETTER O WITH CARON -01D4 ; Lowercase # L& LATIN SMALL LETTER U WITH CARON -01D6 ; Lowercase # L& LATIN SMALL LETTER U WITH DIAERESIS AND MACRON -01D8 ; Lowercase # L& LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE -01DA ; Lowercase # L& LATIN SMALL LETTER U WITH DIAERESIS AND CARON -01DC..01DD ; Lowercase # L& [2] LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE..LATIN SMALL LETTER TURNED E -01DF ; Lowercase # L& LATIN SMALL LETTER A WITH DIAERESIS AND MACRON -01E1 ; Lowercase # L& LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON -01E3 ; Lowercase # L& LATIN SMALL LETTER AE WITH MACRON -01E5 ; Lowercase # L& LATIN SMALL LETTER G WITH STROKE -01E7 ; Lowercase # L& LATIN SMALL LETTER G WITH CARON -01E9 ; Lowercase # L& LATIN SMALL LETTER K WITH CARON -01EB ; Lowercase # L& LATIN SMALL LETTER O WITH OGONEK -01ED ; Lowercase # L& LATIN SMALL LETTER O WITH OGONEK AND MACRON -01EF..01F0 ; Lowercase # L& [2] LATIN SMALL LETTER EZH WITH CARON..LATIN SMALL LETTER J WITH CARON -01F3 ; Lowercase # L& LATIN SMALL LETTER DZ -01F5 ; Lowercase # L& LATIN SMALL LETTER G WITH ACUTE -01F9 ; Lowercase # L& LATIN SMALL LETTER N WITH GRAVE -01FB ; Lowercase # L& LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE -01FD ; Lowercase # L& LATIN SMALL LETTER AE WITH ACUTE -01FF ; Lowercase # L& LATIN SMALL LETTER O WITH STROKE AND ACUTE -0201 ; Lowercase # L& LATIN SMALL LETTER A WITH DOUBLE GRAVE -0203 ; Lowercase # L& LATIN SMALL LETTER A WITH INVERTED BREVE -0205 ; Lowercase # L& LATIN SMALL LETTER E WITH DOUBLE GRAVE -0207 ; Lowercase # L& LATIN SMALL LETTER E WITH INVERTED BREVE -0209 ; Lowercase # L& LATIN SMALL LETTER I WITH DOUBLE GRAVE -020B ; Lowercase # L& LATIN SMALL LETTER I WITH INVERTED BREVE -020D ; Lowercase # L& LATIN SMALL LETTER O WITH DOUBLE GRAVE -020F ; Lowercase # L& LATIN SMALL LETTER O WITH INVERTED BREVE -0211 ; Lowercase # L& LATIN SMALL LETTER R WITH DOUBLE GRAVE -0213 ; Lowercase # L& LATIN SMALL LETTER R WITH INVERTED BREVE -0215 ; Lowercase # L& LATIN SMALL LETTER U WITH DOUBLE GRAVE -0217 ; Lowercase # L& LATIN SMALL LETTER U WITH INVERTED BREVE -0219 ; Lowercase # L& LATIN SMALL LETTER S WITH COMMA BELOW -021B ; Lowercase # L& LATIN SMALL LETTER T WITH COMMA BELOW -021D ; Lowercase # L& LATIN SMALL LETTER YOGH -021F ; Lowercase # L& LATIN SMALL LETTER H WITH CARON -0221 ; Lowercase # L& LATIN SMALL LETTER D WITH CURL -0223 ; Lowercase # L& LATIN SMALL LETTER OU -0225 ; Lowercase # L& LATIN SMALL LETTER Z WITH HOOK -0227 ; Lowercase # L& LATIN SMALL LETTER A WITH DOT ABOVE -0229 ; Lowercase # L& LATIN SMALL LETTER E WITH CEDILLA -022B ; Lowercase # L& LATIN SMALL LETTER O WITH DIAERESIS AND MACRON -022D ; Lowercase # L& LATIN SMALL LETTER O WITH TILDE AND MACRON -022F ; Lowercase # L& LATIN SMALL LETTER O WITH DOT ABOVE -0231 ; Lowercase # L& LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON -0233..0236 ; Lowercase # L& [4] LATIN SMALL LETTER Y WITH MACRON..LATIN SMALL LETTER T WITH CURL -0250..02AF ; Lowercase # L& [96] LATIN SMALL LETTER TURNED A..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL -02B0..02B8 ; Lowercase # Lm [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y -02C0..02C1 ; Lowercase # Lm [2] MODIFIER LETTER GLOTTAL STOP..MODIFIER LETTER REVERSED GLOTTAL STOP -02E0..02E4 ; Lowercase # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP -0345 ; Lowercase # Mn COMBINING GREEK YPOGEGRAMMENI -037A ; Lowercase # Lm GREEK YPOGEGRAMMENI -0390 ; Lowercase # L& GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS -03AC..03CE ; Lowercase # L& [35] GREEK SMALL LETTER ALPHA WITH TONOS..GREEK SMALL LETTER OMEGA WITH TONOS -03D0..03D1 ; Lowercase # L& [2] GREEK BETA SYMBOL..GREEK THETA SYMBOL -03D5..03D7 ; Lowercase # L& [3] GREEK PHI SYMBOL..GREEK KAI SYMBOL -03D9 ; Lowercase # L& GREEK SMALL LETTER ARCHAIC KOPPA -03DB ; Lowercase # L& GREEK SMALL LETTER STIGMA -03DD ; Lowercase # L& GREEK SMALL LETTER DIGAMMA -03DF ; Lowercase # L& GREEK SMALL LETTER KOPPA -03E1 ; Lowercase # L& GREEK SMALL LETTER SAMPI -03E3 ; Lowercase # L& COPTIC SMALL LETTER SHEI -03E5 ; Lowercase # L& COPTIC SMALL LETTER FEI -03E7 ; Lowercase # L& COPTIC SMALL LETTER KHEI -03E9 ; Lowercase # L& COPTIC SMALL LETTER HORI -03EB ; Lowercase # L& COPTIC SMALL LETTER GANGIA -03ED ; Lowercase # L& COPTIC SMALL LETTER SHIMA -03EF..03F3 ; Lowercase # L& [5] COPTIC SMALL LETTER DEI..GREEK LETTER YOT -03F5 ; Lowercase # L& GREEK LUNATE EPSILON SYMBOL -03F8 ; Lowercase # L& GREEK SMALL LETTER SHO -03FB ; Lowercase # L& GREEK SMALL LETTER SAN -0430..045F ; Lowercase # L& [48] CYRILLIC SMALL LETTER A..CYRILLIC SMALL LETTER DZHE -0461 ; Lowercase # L& CYRILLIC SMALL LETTER OMEGA -0463 ; Lowercase # L& CYRILLIC SMALL LETTER YAT -0465 ; Lowercase # L& CYRILLIC SMALL LETTER IOTIFIED E -0467 ; Lowercase # L& CYRILLIC SMALL LETTER LITTLE YUS -0469 ; Lowercase # L& CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS -046B ; Lowercase # L& CYRILLIC SMALL LETTER BIG YUS -046D ; Lowercase # L& CYRILLIC SMALL LETTER IOTIFIED BIG YUS -046F ; Lowercase # L& CYRILLIC SMALL LETTER KSI -0471 ; Lowercase # L& CYRILLIC SMALL LETTER PSI -0473 ; Lowercase # L& CYRILLIC SMALL LETTER FITA -0475 ; Lowercase # L& CYRILLIC SMALL LETTER IZHITSA -0477 ; Lowercase # L& CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT -0479 ; Lowercase # L& CYRILLIC SMALL LETTER UK -047B ; Lowercase # L& CYRILLIC SMALL LETTER ROUND OMEGA -047D ; Lowercase # L& CYRILLIC SMALL LETTER OMEGA WITH TITLO -047F ; Lowercase # L& CYRILLIC SMALL LETTER OT -0481 ; Lowercase # L& CYRILLIC SMALL LETTER KOPPA -048B ; Lowercase # L& CYRILLIC SMALL LETTER SHORT I WITH TAIL -048D ; Lowercase # L& CYRILLIC SMALL LETTER SEMISOFT SIGN -048F ; Lowercase # L& CYRILLIC SMALL LETTER ER WITH TICK -0491 ; Lowercase # L& CYRILLIC SMALL LETTER GHE WITH UPTURN -0493 ; Lowercase # L& CYRILLIC SMALL LETTER GHE WITH STROKE -0495 ; Lowercase # L& CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK -0497 ; Lowercase # L& CYRILLIC SMALL LETTER ZHE WITH DESCENDER -0499 ; Lowercase # L& CYRILLIC SMALL LETTER ZE WITH DESCENDER -049B ; Lowercase # L& CYRILLIC SMALL LETTER KA WITH DESCENDER -049D ; Lowercase # L& CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE -049F ; Lowercase # L& CYRILLIC SMALL LETTER KA WITH STROKE -04A1 ; Lowercase # L& CYRILLIC SMALL LETTER BASHKIR KA -04A3 ; Lowercase # L& CYRILLIC SMALL LETTER EN WITH DESCENDER -04A5 ; Lowercase # L& CYRILLIC SMALL LIGATURE EN GHE -04A7 ; Lowercase # L& CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK -04A9 ; Lowercase # L& CYRILLIC SMALL LETTER ABKHASIAN HA -04AB ; Lowercase # L& CYRILLIC SMALL LETTER ES WITH DESCENDER -04AD ; Lowercase # L& CYRILLIC SMALL LETTER TE WITH DESCENDER -04AF ; Lowercase # L& CYRILLIC SMALL LETTER STRAIGHT U -04B1 ; Lowercase # L& CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE -04B3 ; Lowercase # L& CYRILLIC SMALL LETTER HA WITH DESCENDER -04B5 ; Lowercase # L& CYRILLIC SMALL LIGATURE TE TSE -04B7 ; Lowercase # L& CYRILLIC SMALL LETTER CHE WITH DESCENDER -04B9 ; Lowercase # L& CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE -04BB ; Lowercase # L& CYRILLIC SMALL LETTER SHHA -04BD ; Lowercase # L& CYRILLIC SMALL LETTER ABKHASIAN CHE -04BF ; Lowercase # L& CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER -04C2 ; Lowercase # L& CYRILLIC SMALL LETTER ZHE WITH BREVE -04C4 ; Lowercase # L& CYRILLIC SMALL LETTER KA WITH HOOK -04C6 ; Lowercase # L& CYRILLIC SMALL LETTER EL WITH TAIL -04C8 ; Lowercase # L& CYRILLIC SMALL LETTER EN WITH HOOK -04CA ; Lowercase # L& CYRILLIC SMALL LETTER EN WITH TAIL -04CC ; Lowercase # L& CYRILLIC SMALL LETTER KHAKASSIAN CHE -04CE ; Lowercase # L& CYRILLIC SMALL LETTER EM WITH TAIL -04D1 ; Lowercase # L& CYRILLIC SMALL LETTER A WITH BREVE -04D3 ; Lowercase # L& CYRILLIC SMALL LETTER A WITH DIAERESIS -04D5 ; Lowercase # L& CYRILLIC SMALL LIGATURE A IE -04D7 ; Lowercase # L& CYRILLIC SMALL LETTER IE WITH BREVE -04D9 ; Lowercase # L& CYRILLIC SMALL LETTER SCHWA -04DB ; Lowercase # L& CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS -04DD ; Lowercase # L& CYRILLIC SMALL LETTER ZHE WITH DIAERESIS -04DF ; Lowercase # L& CYRILLIC SMALL LETTER ZE WITH DIAERESIS -04E1 ; Lowercase # L& CYRILLIC SMALL LETTER ABKHASIAN DZE -04E3 ; Lowercase # L& CYRILLIC SMALL LETTER I WITH MACRON -04E5 ; Lowercase # L& CYRILLIC SMALL LETTER I WITH DIAERESIS -04E7 ; Lowercase # L& CYRILLIC SMALL LETTER O WITH DIAERESIS -04E9 ; Lowercase # L& CYRILLIC SMALL LETTER BARRED O -04EB ; Lowercase # L& CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS -04ED ; Lowercase # L& CYRILLIC SMALL LETTER E WITH DIAERESIS -04EF ; Lowercase # L& CYRILLIC SMALL LETTER U WITH MACRON -04F1 ; Lowercase # L& CYRILLIC SMALL LETTER U WITH DIAERESIS -04F3 ; Lowercase # L& CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE -04F5 ; Lowercase # L& CYRILLIC SMALL LETTER CHE WITH DIAERESIS -04F9 ; Lowercase # L& CYRILLIC SMALL LETTER YERU WITH DIAERESIS -0501 ; Lowercase # L& CYRILLIC SMALL LETTER KOMI DE -0503 ; Lowercase # L& CYRILLIC SMALL LETTER KOMI DJE -0505 ; Lowercase # L& CYRILLIC SMALL LETTER KOMI ZJE -0507 ; Lowercase # L& CYRILLIC SMALL LETTER KOMI DZJE -0509 ; Lowercase # L& CYRILLIC SMALL LETTER KOMI LJE -050B ; Lowercase # L& CYRILLIC SMALL LETTER KOMI NJE -050D ; Lowercase # L& CYRILLIC SMALL LETTER KOMI SJE -050F ; Lowercase # L& CYRILLIC SMALL LETTER KOMI TJE -0561..0587 ; Lowercase # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN -1D00..1D2B ; Lowercase # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL -1D2C..1D61 ; Lowercase # Lm [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI -1D62..1D6B ; Lowercase # L& [10] LATIN SUBSCRIPT SMALL LETTER I..LATIN SMALL LETTER UE -1E01 ; Lowercase # L& LATIN SMALL LETTER A WITH RING BELOW -1E03 ; Lowercase # L& LATIN SMALL LETTER B WITH DOT ABOVE -1E05 ; Lowercase # L& LATIN SMALL LETTER B WITH DOT BELOW -1E07 ; Lowercase # L& LATIN SMALL LETTER B WITH LINE BELOW -1E09 ; Lowercase # L& LATIN SMALL LETTER C WITH CEDILLA AND ACUTE -1E0B ; Lowercase # L& LATIN SMALL LETTER D WITH DOT ABOVE -1E0D ; Lowercase # L& LATIN SMALL LETTER D WITH DOT BELOW -1E0F ; Lowercase # L& LATIN SMALL LETTER D WITH LINE BELOW -1E11 ; Lowercase # L& LATIN SMALL LETTER D WITH CEDILLA -1E13 ; Lowercase # L& LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW -1E15 ; Lowercase # L& LATIN SMALL LETTER E WITH MACRON AND GRAVE -1E17 ; Lowercase # L& LATIN SMALL LETTER E WITH MACRON AND ACUTE -1E19 ; Lowercase # L& LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW -1E1B ; Lowercase # L& LATIN SMALL LETTER E WITH TILDE BELOW -1E1D ; Lowercase # L& LATIN SMALL LETTER E WITH CEDILLA AND BREVE -1E1F ; Lowercase # L& LATIN SMALL LETTER F WITH DOT ABOVE -1E21 ; Lowercase # L& LATIN SMALL LETTER G WITH MACRON -1E23 ; Lowercase # L& LATIN SMALL LETTER H WITH DOT ABOVE -1E25 ; Lowercase # L& LATIN SMALL LETTER H WITH DOT BELOW -1E27 ; Lowercase # L& LATIN SMALL LETTER H WITH DIAERESIS -1E29 ; Lowercase # L& LATIN SMALL LETTER H WITH CEDILLA -1E2B ; Lowercase # L& LATIN SMALL LETTER H WITH BREVE BELOW -1E2D ; Lowercase # L& LATIN SMALL LETTER I WITH TILDE BELOW -1E2F ; Lowercase # L& LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE -1E31 ; Lowercase # L& LATIN SMALL LETTER K WITH ACUTE -1E33 ; Lowercase # L& LATIN SMALL LETTER K WITH DOT BELOW -1E35 ; Lowercase # L& LATIN SMALL LETTER K WITH LINE BELOW -1E37 ; Lowercase # L& LATIN SMALL LETTER L WITH DOT BELOW -1E39 ; Lowercase # L& LATIN SMALL LETTER L WITH DOT BELOW AND MACRON -1E3B ; Lowercase # L& LATIN SMALL LETTER L WITH LINE BELOW -1E3D ; Lowercase # L& LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW -1E3F ; Lowercase # L& LATIN SMALL LETTER M WITH ACUTE -1E41 ; Lowercase # L& LATIN SMALL LETTER M WITH DOT ABOVE -1E43 ; Lowercase # L& LATIN SMALL LETTER M WITH DOT BELOW -1E45 ; Lowercase # L& LATIN SMALL LETTER N WITH DOT ABOVE -1E47 ; Lowercase # L& LATIN SMALL LETTER N WITH DOT BELOW -1E49 ; Lowercase # L& LATIN SMALL LETTER N WITH LINE BELOW -1E4B ; Lowercase # L& LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW -1E4D ; Lowercase # L& LATIN SMALL LETTER O WITH TILDE AND ACUTE -1E4F ; Lowercase # L& LATIN SMALL LETTER O WITH TILDE AND DIAERESIS -1E51 ; Lowercase # L& LATIN SMALL LETTER O WITH MACRON AND GRAVE -1E53 ; Lowercase # L& LATIN SMALL LETTER O WITH MACRON AND ACUTE -1E55 ; Lowercase # L& LATIN SMALL LETTER P WITH ACUTE -1E57 ; Lowercase # L& LATIN SMALL LETTER P WITH DOT ABOVE -1E59 ; Lowercase # L& LATIN SMALL LETTER R WITH DOT ABOVE -1E5B ; Lowercase # L& LATIN SMALL LETTER R WITH DOT BELOW -1E5D ; Lowercase # L& LATIN SMALL LETTER R WITH DOT BELOW AND MACRON -1E5F ; Lowercase # L& LATIN SMALL LETTER R WITH LINE BELOW -1E61 ; Lowercase # L& LATIN SMALL LETTER S WITH DOT ABOVE -1E63 ; Lowercase # L& LATIN SMALL LETTER S WITH DOT BELOW -1E65 ; Lowercase # L& LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE -1E67 ; Lowercase # L& LATIN SMALL LETTER S WITH CARON AND DOT ABOVE -1E69 ; Lowercase # L& LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE -1E6B ; Lowercase # L& LATIN SMALL LETTER T WITH DOT ABOVE -1E6D ; Lowercase # L& LATIN SMALL LETTER T WITH DOT BELOW -1E6F ; Lowercase # L& LATIN SMALL LETTER T WITH LINE BELOW -1E71 ; Lowercase # L& LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW -1E73 ; Lowercase # L& LATIN SMALL LETTER U WITH DIAERESIS BELOW -1E75 ; Lowercase # L& LATIN SMALL LETTER U WITH TILDE BELOW -1E77 ; Lowercase # L& LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW -1E79 ; Lowercase # L& LATIN SMALL LETTER U WITH TILDE AND ACUTE -1E7B ; Lowercase # L& LATIN SMALL LETTER U WITH MACRON AND DIAERESIS -1E7D ; Lowercase # L& LATIN SMALL LETTER V WITH TILDE -1E7F ; Lowercase # L& LATIN SMALL LETTER V WITH DOT BELOW -1E81 ; Lowercase # L& LATIN SMALL LETTER W WITH GRAVE -1E83 ; Lowercase # L& LATIN SMALL LETTER W WITH ACUTE -1E85 ; Lowercase # L& LATIN SMALL LETTER W WITH DIAERESIS -1E87 ; Lowercase # L& LATIN SMALL LETTER W WITH DOT ABOVE -1E89 ; Lowercase # L& LATIN SMALL LETTER W WITH DOT BELOW -1E8B ; Lowercase # L& LATIN SMALL LETTER X WITH DOT ABOVE -1E8D ; Lowercase # L& LATIN SMALL LETTER X WITH DIAERESIS -1E8F ; Lowercase # L& LATIN SMALL LETTER Y WITH DOT ABOVE -1E91 ; Lowercase # L& LATIN SMALL LETTER Z WITH CIRCUMFLEX -1E93 ; Lowercase # L& LATIN SMALL LETTER Z WITH DOT BELOW -1E95..1E9B ; Lowercase # L& [7] LATIN SMALL LETTER Z WITH LINE BELOW..LATIN SMALL LETTER LONG S WITH DOT ABOVE -1EA1 ; Lowercase # L& LATIN SMALL LETTER A WITH DOT BELOW -1EA3 ; Lowercase # L& LATIN SMALL LETTER A WITH HOOK ABOVE -1EA5 ; Lowercase # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE -1EA7 ; Lowercase # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE -1EA9 ; Lowercase # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE -1EAB ; Lowercase # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE -1EAD ; Lowercase # L& LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW -1EAF ; Lowercase # L& LATIN SMALL LETTER A WITH BREVE AND ACUTE -1EB1 ; Lowercase # L& LATIN SMALL LETTER A WITH BREVE AND GRAVE -1EB3 ; Lowercase # L& LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE -1EB5 ; Lowercase # L& LATIN SMALL LETTER A WITH BREVE AND TILDE -1EB7 ; Lowercase # L& LATIN SMALL LETTER A WITH BREVE AND DOT BELOW -1EB9 ; Lowercase # L& LATIN SMALL LETTER E WITH DOT BELOW -1EBB ; Lowercase # L& LATIN SMALL LETTER E WITH HOOK ABOVE -1EBD ; Lowercase # L& LATIN SMALL LETTER E WITH TILDE -1EBF ; Lowercase # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE -1EC1 ; Lowercase # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE -1EC3 ; Lowercase # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE -1EC5 ; Lowercase # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE -1EC7 ; Lowercase # L& LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW -1EC9 ; Lowercase # L& LATIN SMALL LETTER I WITH HOOK ABOVE -1ECB ; Lowercase # L& LATIN SMALL LETTER I WITH DOT BELOW -1ECD ; Lowercase # L& LATIN SMALL LETTER O WITH DOT BELOW -1ECF ; Lowercase # L& LATIN SMALL LETTER O WITH HOOK ABOVE -1ED1 ; Lowercase # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE -1ED3 ; Lowercase # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE -1ED5 ; Lowercase # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE -1ED7 ; Lowercase # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE -1ED9 ; Lowercase # L& LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW -1EDB ; Lowercase # L& LATIN SMALL LETTER O WITH HORN AND ACUTE -1EDD ; Lowercase # L& LATIN SMALL LETTER O WITH HORN AND GRAVE -1EDF ; Lowercase # L& LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE -1EE1 ; Lowercase # L& LATIN SMALL LETTER O WITH HORN AND TILDE -1EE3 ; Lowercase # L& LATIN SMALL LETTER O WITH HORN AND DOT BELOW -1EE5 ; Lowercase # L& LATIN SMALL LETTER U WITH DOT BELOW -1EE7 ; Lowercase # L& LATIN SMALL LETTER U WITH HOOK ABOVE -1EE9 ; Lowercase # L& LATIN SMALL LETTER U WITH HORN AND ACUTE -1EEB ; Lowercase # L& LATIN SMALL LETTER U WITH HORN AND GRAVE -1EED ; Lowercase # L& LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE -1EEF ; Lowercase # L& LATIN SMALL LETTER U WITH HORN AND TILDE -1EF1 ; Lowercase # L& LATIN SMALL LETTER U WITH HORN AND DOT BELOW -1EF3 ; Lowercase # L& LATIN SMALL LETTER Y WITH GRAVE -1EF5 ; Lowercase # L& LATIN SMALL LETTER Y WITH DOT BELOW -1EF7 ; Lowercase # L& LATIN SMALL LETTER Y WITH HOOK ABOVE -1EF9 ; Lowercase # L& LATIN SMALL LETTER Y WITH TILDE -1F00..1F07 ; Lowercase # L& [8] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI -1F10..1F15 ; Lowercase # L& [6] GREEK SMALL LETTER EPSILON WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA -1F20..1F27 ; Lowercase # L& [8] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI -1F30..1F37 ; Lowercase # L& [8] GREEK SMALL LETTER IOTA WITH PSILI..GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI -1F40..1F45 ; Lowercase # L& [6] GREEK SMALL LETTER OMICRON WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA -1F50..1F57 ; Lowercase # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI -1F60..1F67 ; Lowercase # L& [8] GREEK SMALL LETTER OMEGA WITH PSILI..GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI -1F70..1F7D ; Lowercase # L& [14] GREEK SMALL LETTER ALPHA WITH VARIA..GREEK SMALL LETTER OMEGA WITH OXIA -1F80..1F87 ; Lowercase # L& [8] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI -1F90..1F97 ; Lowercase # L& [8] GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI -1FA0..1FA7 ; Lowercase # L& [8] GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI -1FB0..1FB4 ; Lowercase # L& [5] GREEK SMALL LETTER ALPHA WITH VRACHY..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI -1FB6..1FB7 ; Lowercase # L& [2] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI -1FBE ; Lowercase # L& GREEK PROSGEGRAMMENI -1FC2..1FC4 ; Lowercase # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI -1FC6..1FC7 ; Lowercase # L& [2] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI -1FD0..1FD3 ; Lowercase # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA -1FD6..1FD7 ; Lowercase # L& [2] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI -1FE0..1FE7 ; Lowercase # L& [8] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI -1FF2..1FF4 ; Lowercase # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI -1FF6..1FF7 ; Lowercase # L& [2] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI -2071 ; Lowercase # L& SUPERSCRIPT LATIN SMALL LETTER I -207F ; Lowercase # L& SUPERSCRIPT LATIN SMALL LETTER N -210A ; Lowercase # L& SCRIPT SMALL G -210E..210F ; Lowercase # L& [2] PLANCK CONSTANT..PLANCK CONSTANT OVER TWO PI -2113 ; Lowercase # L& SCRIPT SMALL L -212F ; Lowercase # L& SCRIPT SMALL E -2134 ; Lowercase # L& SCRIPT SMALL O -2139 ; Lowercase # L& INFORMATION SOURCE -213D ; Lowercase # L& DOUBLE-STRUCK SMALL GAMMA -2146..2149 ; Lowercase # L& [4] DOUBLE-STRUCK ITALIC SMALL D..DOUBLE-STRUCK ITALIC SMALL J -2170..217F ; Lowercase # Nl [16] SMALL ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL ONE THOUSAND -24D0..24E9 ; Lowercase # So [26] CIRCLED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z -FB00..FB06 ; Lowercase # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST -FB13..FB17 ; Lowercase # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH -FF41..FF5A ; Lowercase # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z -10428..1044F ; Lowercase # L& [40] DESERET SMALL LETTER LONG I..DESERET SMALL LETTER EW -1D41A..1D433 ; Lowercase # L& [26] MATHEMATICAL BOLD SMALL A..MATHEMATICAL BOLD SMALL Z -1D44E..1D454 ; Lowercase # L& [7] MATHEMATICAL ITALIC SMALL A..MATHEMATICAL ITALIC SMALL G -1D456..1D467 ; Lowercase # L& [18] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL ITALIC SMALL Z -1D482..1D49B ; Lowercase # L& [26] MATHEMATICAL BOLD ITALIC SMALL A..MATHEMATICAL BOLD ITALIC SMALL Z -1D4B6..1D4B9 ; Lowercase # L& [4] MATHEMATICAL SCRIPT SMALL A..MATHEMATICAL SCRIPT SMALL D -1D4BB ; Lowercase # L& MATHEMATICAL SCRIPT SMALL F -1D4BD..1D4C3 ; Lowercase # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N -1D4C5..1D4CF ; Lowercase # L& [11] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL SCRIPT SMALL Z -1D4EA..1D503 ; Lowercase # L& [26] MATHEMATICAL BOLD SCRIPT SMALL A..MATHEMATICAL BOLD SCRIPT SMALL Z -1D51E..1D537 ; Lowercase # L& [26] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL FRAKTUR SMALL Z -1D552..1D56B ; Lowercase # L& [26] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL DOUBLE-STRUCK SMALL Z -1D586..1D59F ; Lowercase # L& [26] MATHEMATICAL BOLD FRAKTUR SMALL A..MATHEMATICAL BOLD FRAKTUR SMALL Z -1D5BA..1D5D3 ; Lowercase # L& [26] MATHEMATICAL SANS-SERIF SMALL A..MATHEMATICAL SANS-SERIF SMALL Z -1D5EE..1D607 ; Lowercase # L& [26] MATHEMATICAL SANS-SERIF BOLD SMALL A..MATHEMATICAL SANS-SERIF BOLD SMALL Z -1D622..1D63B ; Lowercase # L& [26] MATHEMATICAL SANS-SERIF ITALIC SMALL A..MATHEMATICAL SANS-SERIF ITALIC SMALL Z -1D656..1D66F ; Lowercase # L& [26] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z -1D68A..1D6A3 ; Lowercase # L& [26] MATHEMATICAL MONOSPACE SMALL A..MATHEMATICAL MONOSPACE SMALL Z -1D6C2..1D6DA ; Lowercase # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA -1D6DC..1D6E1 ; Lowercase # L& [6] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL BOLD PI SYMBOL -1D6FC..1D714 ; Lowercase # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA -1D716..1D71B ; Lowercase # L& [6] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL ITALIC PI SYMBOL -1D736..1D74E ; Lowercase # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA -1D750..1D755 ; Lowercase # L& [6] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC PI SYMBOL -1D770..1D788 ; Lowercase # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA -1D78A..1D78F ; Lowercase # L& [6] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD PI SYMBOL -1D7AA..1D7C2 ; Lowercase # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA -1D7C4..1D7C9 ; Lowercase # L& [6] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL +0061..007A ; Lowercase +00AA ; Lowercase +00B5 ; Lowercase +00BA ; Lowercase +00DF..00F6 ; Lowercase +00F8..00FF ; Lowercase +0101 ; Lowercase +0103 ; Lowercase +0105 ; Lowercase +0107 ; Lowercase +0109 ; Lowercase +010B ; Lowercase +010D ; Lowercase +010F ; Lowercase +0111 ; Lowercase +0113 ; Lowercase +0115 ; Lowercase +0117 ; Lowercase +0119 ; Lowercase +011B ; Lowercase +011D ; Lowercase +011F ; Lowercase +0121 ; Lowercase +0123 ; Lowercase +0125 ; Lowercase +0127 ; Lowercase +0129 ; Lowercase +012B ; Lowercase +012D ; Lowercase +012F ; Lowercase +0131 ; Lowercase +0133 ; Lowercase +0135 ; Lowercase +0137..0138 ; Lowercase +013A ; Lowercase +013C ; Lowercase +013E ; Lowercase +0140 ; Lowercase +0142 ; Lowercase +0144 ; Lowercase +0146 ; Lowercase +0148..0149 ; Lowercase +014B ; Lowercase +014D ; Lowercase +014F ; Lowercase +0151 ; Lowercase +0153 ; Lowercase +0155 ; Lowercase +0157 ; Lowercase +0159 ; Lowercase +015B ; Lowercase +015D ; Lowercase +015F ; Lowercase +0161 ; Lowercase +0163 ; Lowercase +0165 ; Lowercase +0167 ; Lowercase +0169 ; Lowercase +016B ; Lowercase +016D ; Lowercase +016F ; Lowercase +0171 ; Lowercase +0173 ; Lowercase +0175 ; Lowercase +0177 ; Lowercase +017A ; Lowercase +017C ; Lowercase +017E..0180 ; Lowercase +0183 ; Lowercase +0185 ; Lowercase +0188 ; Lowercase +018C..018D ; Lowercase +0192 ; Lowercase +0195 ; Lowercase +0199..019B ; Lowercase +019E ; Lowercase +01A1 ; Lowercase +01A3 ; Lowercase +01A5 ; Lowercase +01A8 ; Lowercase +01AA..01AB ; Lowercase +01AD ; Lowercase +01B0 ; Lowercase +01B4 ; Lowercase +01B6 ; Lowercase +01B9..01BA ; Lowercase +01BD..01BF ; Lowercase +01C6 ; Lowercase +01C9 ; Lowercase +01CC ; Lowercase +01CE ; Lowercase +01D0 ; Lowercase +01D2 ; Lowercase +01D4 ; Lowercase +01D6 ; Lowercase +01D8 ; Lowercase +01DA ; Lowercase +01DC..01DD ; Lowercase +01DF ; Lowercase +01E1 ; Lowercase +01E3 ; Lowercase +01E5 ; Lowercase +01E7 ; Lowercase +01E9 ; Lowercase +01EB ; Lowercase +01ED ; Lowercase +01EF..01F0 ; Lowercase +01F3 ; Lowercase +01F5 ; Lowercase +01F9 ; Lowercase +01FB ; Lowercase +01FD ; Lowercase +01FF ; Lowercase +0201 ; Lowercase +0203 ; Lowercase +0205 ; Lowercase +0207 ; Lowercase +0209 ; Lowercase +020B ; Lowercase +020D ; Lowercase +020F ; Lowercase +0211 ; Lowercase +0213 ; Lowercase +0215 ; Lowercase +0217 ; Lowercase +0219 ; Lowercase +021B ; Lowercase +021D ; Lowercase +021F ; Lowercase +0221 ; Lowercase +0223 ; Lowercase +0225 ; Lowercase +0227 ; Lowercase +0229 ; Lowercase +022B ; Lowercase +022D ; Lowercase +022F ; Lowercase +0231 ; Lowercase +0233..0236 ; Lowercase +0250..02AF ; Lowercase +02B0..02B8 ; Lowercase +02C0..02C1 ; Lowercase +02E0..02E4 ; Lowercase +0345 ; Lowercase +037A ; Lowercase +0390 ; Lowercase +03AC..03CE ; Lowercase +03D0..03D1 ; Lowercase +03D5..03D7 ; Lowercase +03D9 ; Lowercase +03DB ; Lowercase +03DD ; Lowercase +03DF ; Lowercase +03E1 ; Lowercase +03E3 ; Lowercase +03E5 ; Lowercase +03E7 ; Lowercase +03E9 ; Lowercase +03EB ; Lowercase +03ED ; Lowercase +03EF..03F3 ; Lowercase +03F5 ; Lowercase +03F8 ; Lowercase +03FB ; Lowercase +0430..045F ; Lowercase +0461 ; Lowercase +0463 ; Lowercase +0465 ; Lowercase +0467 ; Lowercase +0469 ; Lowercase +046B ; Lowercase +046D ; Lowercase +046F ; Lowercase +0471 ; Lowercase +0473 ; Lowercase +0475 ; Lowercase +0477 ; Lowercase +0479 ; Lowercase +047B ; Lowercase +047D ; Lowercase +047F ; Lowercase +0481 ; Lowercase +048B ; Lowercase +048D ; Lowercase +048F ; Lowercase +0491 ; Lowercase +0493 ; Lowercase +0495 ; Lowercase +0497 ; Lowercase +0499 ; Lowercase +049B ; Lowercase +049D ; Lowercase +049F ; Lowercase +04A1 ; Lowercase +04A3 ; Lowercase +04A5 ; Lowercase +04A7 ; Lowercase +04A9 ; Lowercase +04AB ; Lowercase +04AD ; Lowercase +04AF ; Lowercase +04B1 ; Lowercase +04B3 ; Lowercase +04B5 ; Lowercase +04B7 ; Lowercase +04B9 ; Lowercase +04BB ; Lowercase +04BD ; Lowercase +04BF ; Lowercase +04C2 ; Lowercase +04C4 ; Lowercase +04C6 ; Lowercase +04C8 ; Lowercase +04CA ; Lowercase +04CC ; Lowercase +04CE ; Lowercase +04D1 ; Lowercase +04D3 ; Lowercase +04D5 ; Lowercase +04D7 ; Lowercase +04D9 ; Lowercase +04DB ; Lowercase +04DD ; Lowercase +04DF ; Lowercase +04E1 ; Lowercase +04E3 ; Lowercase +04E5 ; Lowercase +04E7 ; Lowercase +04E9 ; Lowercase +04EB ; Lowercase +04ED ; Lowercase +04EF ; Lowercase +04F1 ; Lowercase +04F3 ; Lowercase +04F5 ; Lowercase +04F9 ; Lowercase +0501 ; Lowercase +0503 ; Lowercase +0505 ; Lowercase +0507 ; Lowercase +0509 ; Lowercase +050B ; Lowercase +050D ; Lowercase +050F ; Lowercase +0561..0587 ; Lowercase +1D00..1D2B ; Lowercase +1D2C..1D61 ; Lowercase +1D62..1D6B ; Lowercase +1E01 ; Lowercase +1E03 ; Lowercase +1E05 ; Lowercase +1E07 ; Lowercase +1E09 ; Lowercase +1E0B ; Lowercase +1E0D ; Lowercase +1E0F ; Lowercase +1E11 ; Lowercase +1E13 ; Lowercase +1E15 ; Lowercase +1E17 ; Lowercase +1E19 ; Lowercase +1E1B ; Lowercase +1E1D ; Lowercase +1E1F ; Lowercase +1E21 ; Lowercase +1E23 ; Lowercase +1E25 ; Lowercase +1E27 ; Lowercase +1E29 ; Lowercase +1E2B ; Lowercase +1E2D ; Lowercase +1E2F ; Lowercase +1E31 ; Lowercase +1E33 ; Lowercase +1E35 ; Lowercase +1E37 ; Lowercase +1E39 ; Lowercase +1E3B ; Lowercase +1E3D ; Lowercase +1E3F ; Lowercase +1E41 ; Lowercase +1E43 ; Lowercase +1E45 ; Lowercase +1E47 ; Lowercase +1E49 ; Lowercase +1E4B ; Lowercase +1E4D ; Lowercase +1E4F ; Lowercase +1E51 ; Lowercase +1E53 ; Lowercase +1E55 ; Lowercase +1E57 ; Lowercase +1E59 ; Lowercase +1E5B ; Lowercase +1E5D ; Lowercase +1E5F ; Lowercase +1E61 ; Lowercase +1E63 ; Lowercase +1E65 ; Lowercase +1E67 ; Lowercase +1E69 ; Lowercase +1E6B ; Lowercase +1E6D ; Lowercase +1E6F ; Lowercase +1E71 ; Lowercase +1E73 ; Lowercase +1E75 ; Lowercase +1E77 ; Lowercase +1E79 ; Lowercase +1E7B ; Lowercase +1E7D ; Lowercase +1E7F ; Lowercase +1E81 ; Lowercase +1E83 ; Lowercase +1E85 ; Lowercase +1E87 ; Lowercase +1E89 ; Lowercase +1E8B ; Lowercase +1E8D ; Lowercase +1E8F ; Lowercase +1E91 ; Lowercase +1E93 ; Lowercase +1E95..1E9B ; Lowercase +1EA1 ; Lowercase +1EA3 ; Lowercase +1EA5 ; Lowercase +1EA7 ; Lowercase +1EA9 ; Lowercase +1EAB ; Lowercase +1EAD ; Lowercase +1EAF ; Lowercase +1EB1 ; Lowercase +1EB3 ; Lowercase +1EB5 ; Lowercase +1EB7 ; Lowercase +1EB9 ; Lowercase +1EBB ; Lowercase +1EBD ; Lowercase +1EBF ; Lowercase +1EC1 ; Lowercase +1EC3 ; Lowercase +1EC5 ; Lowercase +1EC7 ; Lowercase +1EC9 ; Lowercase +1ECB ; Lowercase +1ECD ; Lowercase +1ECF ; Lowercase +1ED1 ; Lowercase +1ED3 ; Lowercase +1ED5 ; Lowercase +1ED7 ; Lowercase +1ED9 ; Lowercase +1EDB ; Lowercase +1EDD ; Lowercase +1EDF ; Lowercase +1EE1 ; Lowercase +1EE3 ; Lowercase +1EE5 ; Lowercase +1EE7 ; Lowercase +1EE9 ; Lowercase +1EEB ; Lowercase +1EED ; Lowercase +1EEF ; Lowercase +1EF1 ; Lowercase +1EF3 ; Lowercase +1EF5 ; Lowercase +1EF7 ; Lowercase +1EF9 ; Lowercase +1F00..1F07 ; Lowercase +1F10..1F15 ; Lowercase +1F20..1F27 ; Lowercase +1F30..1F37 ; Lowercase +1F40..1F45 ; Lowercase +1F50..1F57 ; Lowercase +1F60..1F67 ; Lowercase +1F70..1F7D ; Lowercase +1F80..1F87 ; Lowercase +1F90..1F97 ; Lowercase +1FA0..1FA7 ; Lowercase +1FB0..1FB4 ; Lowercase +1FB6..1FB7 ; Lowercase +1FBE ; Lowercase +1FC2..1FC4 ; Lowercase +1FC6..1FC7 ; Lowercase +1FD0..1FD3 ; Lowercase +1FD6..1FD7 ; Lowercase +1FE0..1FE7 ; Lowercase +1FF2..1FF4 ; Lowercase +1FF6..1FF7 ; Lowercase +2071 ; Lowercase +207F ; Lowercase +210A ; Lowercase +210E..210F ; Lowercase +2113 ; Lowercase +212F ; Lowercase +2134 ; Lowercase +2139 ; Lowercase +213D ; Lowercase +2146..2149 ; Lowercase +2170..217F ; Lowercase +24D0..24E9 ; Lowercase +FB00..FB06 ; Lowercase +FB13..FB17 ; Lowercase +FF41..FF5A ; Lowercase +10428..1044F ; Lowercase +1D41A..1D433 ; Lowercase +1D44E..1D454 ; Lowercase +1D456..1D467 ; Lowercase +1D482..1D49B ; Lowercase +1D4B6..1D4B9 ; Lowercase +1D4BB ; Lowercase +1D4BD..1D4C3 ; Lowercase +1D4C5..1D4CF ; Lowercase +1D4EA..1D503 ; Lowercase +1D51E..1D537 ; Lowercase +1D552..1D56B ; Lowercase +1D586..1D59F ; Lowercase +1D5BA..1D5D3 ; Lowercase +1D5EE..1D607 ; Lowercase +1D622..1D63B ; Lowercase +1D656..1D66F ; Lowercase +1D68A..1D6A3 ; Lowercase +1D6C2..1D6DA ; Lowercase +1D6DC..1D6E1 ; Lowercase +1D6FC..1D714 ; Lowercase +1D716..1D71B ; Lowercase +1D736..1D74E ; Lowercase +1D750..1D755 ; Lowercase +1D770..1D788 ; Lowercase +1D78A..1D78F ; Lowercase +1D7AA..1D7C2 ; Lowercase +1D7C4..1D7C9 ; Lowercase # Total code points: 1529 @@ -1091,429 +1107,429 @@ FF41..FF5A ; Lowercase # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH L # Derived Property: Uppercase # Generated from: Lu + Other_Uppercase -0041..005A ; Uppercase # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z -00C0..00D6 ; Uppercase # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS -00D8..00DE ; Uppercase # L& [7] LATIN CAPITAL LETTER O WITH STROKE..LATIN CAPITAL LETTER THORN -0100 ; Uppercase # L& LATIN CAPITAL LETTER A WITH MACRON -0102 ; Uppercase # L& LATIN CAPITAL LETTER A WITH BREVE -0104 ; Uppercase # L& LATIN CAPITAL LETTER A WITH OGONEK -0106 ; Uppercase # L& LATIN CAPITAL LETTER C WITH ACUTE -0108 ; Uppercase # L& LATIN CAPITAL LETTER C WITH CIRCUMFLEX -010A ; Uppercase # L& LATIN CAPITAL LETTER C WITH DOT ABOVE -010C ; Uppercase # L& LATIN CAPITAL LETTER C WITH CARON -010E ; Uppercase # L& LATIN CAPITAL LETTER D WITH CARON -0110 ; Uppercase # L& LATIN CAPITAL LETTER D WITH STROKE -0112 ; Uppercase # L& LATIN CAPITAL LETTER E WITH MACRON -0114 ; Uppercase # L& LATIN CAPITAL LETTER E WITH BREVE -0116 ; Uppercase # L& LATIN CAPITAL LETTER E WITH DOT ABOVE -0118 ; Uppercase # L& LATIN CAPITAL LETTER E WITH OGONEK -011A ; Uppercase # L& LATIN CAPITAL LETTER E WITH CARON -011C ; Uppercase # L& LATIN CAPITAL LETTER G WITH CIRCUMFLEX -011E ; Uppercase # L& LATIN CAPITAL LETTER G WITH BREVE -0120 ; Uppercase # L& LATIN CAPITAL LETTER G WITH DOT ABOVE -0122 ; Uppercase # L& LATIN CAPITAL LETTER G WITH CEDILLA -0124 ; Uppercase # L& LATIN CAPITAL LETTER H WITH CIRCUMFLEX -0126 ; Uppercase # L& LATIN CAPITAL LETTER H WITH STROKE -0128 ; Uppercase # L& LATIN CAPITAL LETTER I WITH TILDE -012A ; Uppercase # L& LATIN CAPITAL LETTER I WITH MACRON -012C ; Uppercase # L& LATIN CAPITAL LETTER I WITH BREVE -012E ; Uppercase # L& LATIN CAPITAL LETTER I WITH OGONEK -0130 ; Uppercase # L& LATIN CAPITAL LETTER I WITH DOT ABOVE -0132 ; Uppercase # L& LATIN CAPITAL LIGATURE IJ -0134 ; Uppercase # L& LATIN CAPITAL LETTER J WITH CIRCUMFLEX -0136 ; Uppercase # L& LATIN CAPITAL LETTER K WITH CEDILLA -0139 ; Uppercase # L& LATIN CAPITAL LETTER L WITH ACUTE -013B ; Uppercase # L& LATIN CAPITAL LETTER L WITH CEDILLA -013D ; Uppercase # L& LATIN CAPITAL LETTER L WITH CARON -013F ; Uppercase # L& LATIN CAPITAL LETTER L WITH MIDDLE DOT -0141 ; Uppercase # L& LATIN CAPITAL LETTER L WITH STROKE -0143 ; Uppercase # L& LATIN CAPITAL LETTER N WITH ACUTE -0145 ; Uppercase # L& LATIN CAPITAL LETTER N WITH CEDILLA -0147 ; Uppercase # L& LATIN CAPITAL LETTER N WITH CARON -014A ; Uppercase # L& LATIN CAPITAL LETTER ENG -014C ; Uppercase # L& LATIN CAPITAL LETTER O WITH MACRON -014E ; Uppercase # L& LATIN CAPITAL LETTER O WITH BREVE -0150 ; Uppercase # L& LATIN CAPITAL LETTER O WITH DOUBLE ACUTE -0152 ; Uppercase # L& LATIN CAPITAL LIGATURE OE -0154 ; Uppercase # L& LATIN CAPITAL LETTER R WITH ACUTE -0156 ; Uppercase # L& LATIN CAPITAL LETTER R WITH CEDILLA -0158 ; Uppercase # L& LATIN CAPITAL LETTER R WITH CARON -015A ; Uppercase # L& LATIN CAPITAL LETTER S WITH ACUTE -015C ; Uppercase # L& LATIN CAPITAL LETTER S WITH CIRCUMFLEX -015E ; Uppercase # L& LATIN CAPITAL LETTER S WITH CEDILLA -0160 ; Uppercase # L& LATIN CAPITAL LETTER S WITH CARON -0162 ; Uppercase # L& LATIN CAPITAL LETTER T WITH CEDILLA -0164 ; Uppercase # L& LATIN CAPITAL LETTER T WITH CARON -0166 ; Uppercase # L& LATIN CAPITAL LETTER T WITH STROKE -0168 ; Uppercase # L& LATIN CAPITAL LETTER U WITH TILDE -016A ; Uppercase # L& LATIN CAPITAL LETTER U WITH MACRON -016C ; Uppercase # L& LATIN CAPITAL LETTER U WITH BREVE -016E ; Uppercase # L& LATIN CAPITAL LETTER U WITH RING ABOVE -0170 ; Uppercase # L& LATIN CAPITAL LETTER U WITH DOUBLE ACUTE -0172 ; Uppercase # L& LATIN CAPITAL LETTER U WITH OGONEK -0174 ; Uppercase # L& LATIN CAPITAL LETTER W WITH CIRCUMFLEX -0176 ; Uppercase # L& LATIN CAPITAL LETTER Y WITH CIRCUMFLEX -0178..0179 ; Uppercase # L& [2] LATIN CAPITAL LETTER Y WITH DIAERESIS..LATIN CAPITAL LETTER Z WITH ACUTE -017B ; Uppercase # L& LATIN CAPITAL LETTER Z WITH DOT ABOVE -017D ; Uppercase # L& LATIN CAPITAL LETTER Z WITH CARON -0181..0182 ; Uppercase # L& [2] LATIN CAPITAL LETTER B WITH HOOK..LATIN CAPITAL LETTER B WITH TOPBAR -0184 ; Uppercase # L& LATIN CAPITAL LETTER TONE SIX -0186..0187 ; Uppercase # L& [2] LATIN CAPITAL LETTER OPEN O..LATIN CAPITAL LETTER C WITH HOOK -0189..018B ; Uppercase # L& [3] LATIN CAPITAL LETTER AFRICAN D..LATIN CAPITAL LETTER D WITH TOPBAR -018E..0191 ; Uppercase # L& [4] LATIN CAPITAL LETTER REVERSED E..LATIN CAPITAL LETTER F WITH HOOK -0193..0194 ; Uppercase # L& [2] LATIN CAPITAL LETTER G WITH HOOK..LATIN CAPITAL LETTER GAMMA -0196..0198 ; Uppercase # L& [3] LATIN CAPITAL LETTER IOTA..LATIN CAPITAL LETTER K WITH HOOK -019C..019D ; Uppercase # L& [2] LATIN CAPITAL LETTER TURNED M..LATIN CAPITAL LETTER N WITH LEFT HOOK -019F..01A0 ; Uppercase # L& [2] LATIN CAPITAL LETTER O WITH MIDDLE TILDE..LATIN CAPITAL LETTER O WITH HORN -01A2 ; Uppercase # L& LATIN CAPITAL LETTER OI -01A4 ; Uppercase # L& LATIN CAPITAL LETTER P WITH HOOK -01A6..01A7 ; Uppercase # L& [2] LATIN LETTER YR..LATIN CAPITAL LETTER TONE TWO -01A9 ; Uppercase # L& LATIN CAPITAL LETTER ESH -01AC ; Uppercase # L& LATIN CAPITAL LETTER T WITH HOOK -01AE..01AF ; Uppercase # L& [2] LATIN CAPITAL LETTER T WITH RETROFLEX HOOK..LATIN CAPITAL LETTER U WITH HORN -01B1..01B3 ; Uppercase # L& [3] LATIN CAPITAL LETTER UPSILON..LATIN CAPITAL LETTER Y WITH HOOK -01B5 ; Uppercase # L& LATIN CAPITAL LETTER Z WITH STROKE -01B7..01B8 ; Uppercase # L& [2] LATIN CAPITAL LETTER EZH..LATIN CAPITAL LETTER EZH REVERSED -01BC ; Uppercase # L& LATIN CAPITAL LETTER TONE FIVE -01C4 ; Uppercase # L& LATIN CAPITAL LETTER DZ WITH CARON -01C7 ; Uppercase # L& LATIN CAPITAL LETTER LJ -01CA ; Uppercase # L& LATIN CAPITAL LETTER NJ -01CD ; Uppercase # L& LATIN CAPITAL LETTER A WITH CARON -01CF ; Uppercase # L& LATIN CAPITAL LETTER I WITH CARON -01D1 ; Uppercase # L& LATIN CAPITAL LETTER O WITH CARON -01D3 ; Uppercase # L& LATIN CAPITAL LETTER U WITH CARON -01D5 ; Uppercase # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON -01D7 ; Uppercase # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE -01D9 ; Uppercase # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON -01DB ; Uppercase # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE -01DE ; Uppercase # L& LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON -01E0 ; Uppercase # L& LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON -01E2 ; Uppercase # L& LATIN CAPITAL LETTER AE WITH MACRON -01E4 ; Uppercase # L& LATIN CAPITAL LETTER G WITH STROKE -01E6 ; Uppercase # L& LATIN CAPITAL LETTER G WITH CARON -01E8 ; Uppercase # L& LATIN CAPITAL LETTER K WITH CARON -01EA ; Uppercase # L& LATIN CAPITAL LETTER O WITH OGONEK -01EC ; Uppercase # L& LATIN CAPITAL LETTER O WITH OGONEK AND MACRON -01EE ; Uppercase # L& LATIN CAPITAL LETTER EZH WITH CARON -01F1 ; Uppercase # L& LATIN CAPITAL LETTER DZ -01F4 ; Uppercase # L& LATIN CAPITAL LETTER G WITH ACUTE -01F6..01F8 ; Uppercase # L& [3] LATIN CAPITAL LETTER HWAIR..LATIN CAPITAL LETTER N WITH GRAVE -01FA ; Uppercase # L& LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE -01FC ; Uppercase # L& LATIN CAPITAL LETTER AE WITH ACUTE -01FE ; Uppercase # L& LATIN CAPITAL LETTER O WITH STROKE AND ACUTE -0200 ; Uppercase # L& LATIN CAPITAL LETTER A WITH DOUBLE GRAVE -0202 ; Uppercase # L& LATIN CAPITAL LETTER A WITH INVERTED BREVE -0204 ; Uppercase # L& LATIN CAPITAL LETTER E WITH DOUBLE GRAVE -0206 ; Uppercase # L& LATIN CAPITAL LETTER E WITH INVERTED BREVE -0208 ; Uppercase # L& LATIN CAPITAL LETTER I WITH DOUBLE GRAVE -020A ; Uppercase # L& LATIN CAPITAL LETTER I WITH INVERTED BREVE -020C ; Uppercase # L& LATIN CAPITAL LETTER O WITH DOUBLE GRAVE -020E ; Uppercase # L& LATIN CAPITAL LETTER O WITH INVERTED BREVE -0210 ; Uppercase # L& LATIN CAPITAL LETTER R WITH DOUBLE GRAVE -0212 ; Uppercase # L& LATIN CAPITAL LETTER R WITH INVERTED BREVE -0214 ; Uppercase # L& LATIN CAPITAL LETTER U WITH DOUBLE GRAVE -0216 ; Uppercase # L& LATIN CAPITAL LETTER U WITH INVERTED BREVE -0218 ; Uppercase # L& LATIN CAPITAL LETTER S WITH COMMA BELOW -021A ; Uppercase # L& LATIN CAPITAL LETTER T WITH COMMA BELOW -021C ; Uppercase # L& LATIN CAPITAL LETTER YOGH -021E ; Uppercase # L& LATIN CAPITAL LETTER H WITH CARON -0220 ; Uppercase # L& LATIN CAPITAL LETTER N WITH LONG RIGHT LEG -0222 ; Uppercase # L& LATIN CAPITAL LETTER OU -0224 ; Uppercase # L& LATIN CAPITAL LETTER Z WITH HOOK -0226 ; Uppercase # L& LATIN CAPITAL LETTER A WITH DOT ABOVE -0228 ; Uppercase # L& LATIN CAPITAL LETTER E WITH CEDILLA -022A ; Uppercase # L& LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON -022C ; Uppercase # L& LATIN CAPITAL LETTER O WITH TILDE AND MACRON -022E ; Uppercase # L& LATIN CAPITAL LETTER O WITH DOT ABOVE -0230 ; Uppercase # L& LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON -0232 ; Uppercase # L& LATIN CAPITAL LETTER Y WITH MACRON -0386 ; Uppercase # L& GREEK CAPITAL LETTER ALPHA WITH TONOS -0388..038A ; Uppercase # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS -038C ; Uppercase # L& GREEK CAPITAL LETTER OMICRON WITH TONOS -038E..038F ; Uppercase # L& [2] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER OMEGA WITH TONOS -0391..03A1 ; Uppercase # L& [17] GREEK CAPITAL LETTER ALPHA..GREEK CAPITAL LETTER RHO -03A3..03AB ; Uppercase # L& [9] GREEK CAPITAL LETTER SIGMA..GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA -03D2..03D4 ; Uppercase # L& [3] GREEK UPSILON WITH HOOK SYMBOL..GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL -03D8 ; Uppercase # L& GREEK LETTER ARCHAIC KOPPA -03DA ; Uppercase # L& GREEK LETTER STIGMA -03DC ; Uppercase # L& GREEK LETTER DIGAMMA -03DE ; Uppercase # L& GREEK LETTER KOPPA -03E0 ; Uppercase # L& GREEK LETTER SAMPI -03E2 ; Uppercase # L& COPTIC CAPITAL LETTER SHEI -03E4 ; Uppercase # L& COPTIC CAPITAL LETTER FEI -03E6 ; Uppercase # L& COPTIC CAPITAL LETTER KHEI -03E8 ; Uppercase # L& COPTIC CAPITAL LETTER HORI -03EA ; Uppercase # L& COPTIC CAPITAL LETTER GANGIA -03EC ; Uppercase # L& COPTIC CAPITAL LETTER SHIMA -03EE ; Uppercase # L& COPTIC CAPITAL LETTER DEI -03F4 ; Uppercase # L& GREEK CAPITAL THETA SYMBOL -03F7 ; Uppercase # L& GREEK CAPITAL LETTER SHO -03F9..03FA ; Uppercase # L& [2] GREEK CAPITAL LUNATE SIGMA SYMBOL..GREEK CAPITAL LETTER SAN -0400..042F ; Uppercase # L& [48] CYRILLIC CAPITAL LETTER IE WITH GRAVE..CYRILLIC CAPITAL LETTER YA -0460 ; Uppercase # L& CYRILLIC CAPITAL LETTER OMEGA -0462 ; Uppercase # L& CYRILLIC CAPITAL LETTER YAT -0464 ; Uppercase # L& CYRILLIC CAPITAL LETTER IOTIFIED E -0466 ; Uppercase # L& CYRILLIC CAPITAL LETTER LITTLE YUS -0468 ; Uppercase # L& CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS -046A ; Uppercase # L& CYRILLIC CAPITAL LETTER BIG YUS -046C ; Uppercase # L& CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS -046E ; Uppercase # L& CYRILLIC CAPITAL LETTER KSI -0470 ; Uppercase # L& CYRILLIC CAPITAL LETTER PSI -0472 ; Uppercase # L& CYRILLIC CAPITAL LETTER FITA -0474 ; Uppercase # L& CYRILLIC CAPITAL LETTER IZHITSA -0476 ; Uppercase # L& CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT -0478 ; Uppercase # L& CYRILLIC CAPITAL LETTER UK -047A ; Uppercase # L& CYRILLIC CAPITAL LETTER ROUND OMEGA -047C ; Uppercase # L& CYRILLIC CAPITAL LETTER OMEGA WITH TITLO -047E ; Uppercase # L& CYRILLIC CAPITAL LETTER OT -0480 ; Uppercase # L& CYRILLIC CAPITAL LETTER KOPPA -048A ; Uppercase # L& CYRILLIC CAPITAL LETTER SHORT I WITH TAIL -048C ; Uppercase # L& CYRILLIC CAPITAL LETTER SEMISOFT SIGN -048E ; Uppercase # L& CYRILLIC CAPITAL LETTER ER WITH TICK -0490 ; Uppercase # L& CYRILLIC CAPITAL LETTER GHE WITH UPTURN -0492 ; Uppercase # L& CYRILLIC CAPITAL LETTER GHE WITH STROKE -0494 ; Uppercase # L& CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK -0496 ; Uppercase # L& CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER -0498 ; Uppercase # L& CYRILLIC CAPITAL LETTER ZE WITH DESCENDER -049A ; Uppercase # L& CYRILLIC CAPITAL LETTER KA WITH DESCENDER -049C ; Uppercase # L& CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE -049E ; Uppercase # L& CYRILLIC CAPITAL LETTER KA WITH STROKE -04A0 ; Uppercase # L& CYRILLIC CAPITAL LETTER BASHKIR KA -04A2 ; Uppercase # L& CYRILLIC CAPITAL LETTER EN WITH DESCENDER -04A4 ; Uppercase # L& CYRILLIC CAPITAL LIGATURE EN GHE -04A6 ; Uppercase # L& CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK -04A8 ; Uppercase # L& CYRILLIC CAPITAL LETTER ABKHASIAN HA -04AA ; Uppercase # L& CYRILLIC CAPITAL LETTER ES WITH DESCENDER -04AC ; Uppercase # L& CYRILLIC CAPITAL LETTER TE WITH DESCENDER -04AE ; Uppercase # L& CYRILLIC CAPITAL LETTER STRAIGHT U -04B0 ; Uppercase # L& CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE -04B2 ; Uppercase # L& CYRILLIC CAPITAL LETTER HA WITH DESCENDER -04B4 ; Uppercase # L& CYRILLIC CAPITAL LIGATURE TE TSE -04B6 ; Uppercase # L& CYRILLIC CAPITAL LETTER CHE WITH DESCENDER -04B8 ; Uppercase # L& CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE -04BA ; Uppercase # L& CYRILLIC CAPITAL LETTER SHHA -04BC ; Uppercase # L& CYRILLIC CAPITAL LETTER ABKHASIAN CHE -04BE ; Uppercase # L& CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER -04C0..04C1 ; Uppercase # L& [2] CYRILLIC LETTER PALOCHKA..CYRILLIC CAPITAL LETTER ZHE WITH BREVE -04C3 ; Uppercase # L& CYRILLIC CAPITAL LETTER KA WITH HOOK -04C5 ; Uppercase # L& CYRILLIC CAPITAL LETTER EL WITH TAIL -04C7 ; Uppercase # L& CYRILLIC CAPITAL LETTER EN WITH HOOK -04C9 ; Uppercase # L& CYRILLIC CAPITAL LETTER EN WITH TAIL -04CB ; Uppercase # L& CYRILLIC CAPITAL LETTER KHAKASSIAN CHE -04CD ; Uppercase # L& CYRILLIC CAPITAL LETTER EM WITH TAIL -04D0 ; Uppercase # L& CYRILLIC CAPITAL LETTER A WITH BREVE -04D2 ; Uppercase # L& CYRILLIC CAPITAL LETTER A WITH DIAERESIS -04D4 ; Uppercase # L& CYRILLIC CAPITAL LIGATURE A IE -04D6 ; Uppercase # L& CYRILLIC CAPITAL LETTER IE WITH BREVE -04D8 ; Uppercase # L& CYRILLIC CAPITAL LETTER SCHWA -04DA ; Uppercase # L& CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS -04DC ; Uppercase # L& CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS -04DE ; Uppercase # L& CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS -04E0 ; Uppercase # L& CYRILLIC CAPITAL LETTER ABKHASIAN DZE -04E2 ; Uppercase # L& CYRILLIC CAPITAL LETTER I WITH MACRON -04E4 ; Uppercase # L& CYRILLIC CAPITAL LETTER I WITH DIAERESIS -04E6 ; Uppercase # L& CYRILLIC CAPITAL LETTER O WITH DIAERESIS -04E8 ; Uppercase # L& CYRILLIC CAPITAL LETTER BARRED O -04EA ; Uppercase # L& CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS -04EC ; Uppercase # L& CYRILLIC CAPITAL LETTER E WITH DIAERESIS -04EE ; Uppercase # L& CYRILLIC CAPITAL LETTER U WITH MACRON -04F0 ; Uppercase # L& CYRILLIC CAPITAL LETTER U WITH DIAERESIS -04F2 ; Uppercase # L& CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE -04F4 ; Uppercase # L& CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS -04F8 ; Uppercase # L& CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS -0500 ; Uppercase # L& CYRILLIC CAPITAL LETTER KOMI DE -0502 ; Uppercase # L& CYRILLIC CAPITAL LETTER KOMI DJE -0504 ; Uppercase # L& CYRILLIC CAPITAL LETTER KOMI ZJE -0506 ; Uppercase # L& CYRILLIC CAPITAL LETTER KOMI DZJE -0508 ; Uppercase # L& CYRILLIC CAPITAL LETTER KOMI LJE -050A ; Uppercase # L& CYRILLIC CAPITAL LETTER KOMI NJE -050C ; Uppercase # L& CYRILLIC CAPITAL LETTER KOMI SJE -050E ; Uppercase # L& CYRILLIC CAPITAL LETTER KOMI TJE -0531..0556 ; Uppercase # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH -10A0..10C5 ; Uppercase # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE -1E00 ; Uppercase # L& LATIN CAPITAL LETTER A WITH RING BELOW -1E02 ; Uppercase # L& LATIN CAPITAL LETTER B WITH DOT ABOVE -1E04 ; Uppercase # L& LATIN CAPITAL LETTER B WITH DOT BELOW -1E06 ; Uppercase # L& LATIN CAPITAL LETTER B WITH LINE BELOW -1E08 ; Uppercase # L& LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE -1E0A ; Uppercase # L& LATIN CAPITAL LETTER D WITH DOT ABOVE -1E0C ; Uppercase # L& LATIN CAPITAL LETTER D WITH DOT BELOW -1E0E ; Uppercase # L& LATIN CAPITAL LETTER D WITH LINE BELOW -1E10 ; Uppercase # L& LATIN CAPITAL LETTER D WITH CEDILLA -1E12 ; Uppercase # L& LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW -1E14 ; Uppercase # L& LATIN CAPITAL LETTER E WITH MACRON AND GRAVE -1E16 ; Uppercase # L& LATIN CAPITAL LETTER E WITH MACRON AND ACUTE -1E18 ; Uppercase # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW -1E1A ; Uppercase # L& LATIN CAPITAL LETTER E WITH TILDE BELOW -1E1C ; Uppercase # L& LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE -1E1E ; Uppercase # L& LATIN CAPITAL LETTER F WITH DOT ABOVE -1E20 ; Uppercase # L& LATIN CAPITAL LETTER G WITH MACRON -1E22 ; Uppercase # L& LATIN CAPITAL LETTER H WITH DOT ABOVE -1E24 ; Uppercase # L& LATIN CAPITAL LETTER H WITH DOT BELOW -1E26 ; Uppercase # L& LATIN CAPITAL LETTER H WITH DIAERESIS -1E28 ; Uppercase # L& LATIN CAPITAL LETTER H WITH CEDILLA -1E2A ; Uppercase # L& LATIN CAPITAL LETTER H WITH BREVE BELOW -1E2C ; Uppercase # L& LATIN CAPITAL LETTER I WITH TILDE BELOW -1E2E ; Uppercase # L& LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE -1E30 ; Uppercase # L& LATIN CAPITAL LETTER K WITH ACUTE -1E32 ; Uppercase # L& LATIN CAPITAL LETTER K WITH DOT BELOW -1E34 ; Uppercase # L& LATIN CAPITAL LETTER K WITH LINE BELOW -1E36 ; Uppercase # L& LATIN CAPITAL LETTER L WITH DOT BELOW -1E38 ; Uppercase # L& LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON -1E3A ; Uppercase # L& LATIN CAPITAL LETTER L WITH LINE BELOW -1E3C ; Uppercase # L& LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW -1E3E ; Uppercase # L& LATIN CAPITAL LETTER M WITH ACUTE -1E40 ; Uppercase # L& LATIN CAPITAL LETTER M WITH DOT ABOVE -1E42 ; Uppercase # L& LATIN CAPITAL LETTER M WITH DOT BELOW -1E44 ; Uppercase # L& LATIN CAPITAL LETTER N WITH DOT ABOVE -1E46 ; Uppercase # L& LATIN CAPITAL LETTER N WITH DOT BELOW -1E48 ; Uppercase # L& LATIN CAPITAL LETTER N WITH LINE BELOW -1E4A ; Uppercase # L& LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW -1E4C ; Uppercase # L& LATIN CAPITAL LETTER O WITH TILDE AND ACUTE -1E4E ; Uppercase # L& LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS -1E50 ; Uppercase # L& LATIN CAPITAL LETTER O WITH MACRON AND GRAVE -1E52 ; Uppercase # L& LATIN CAPITAL LETTER O WITH MACRON AND ACUTE -1E54 ; Uppercase # L& LATIN CAPITAL LETTER P WITH ACUTE -1E56 ; Uppercase # L& LATIN CAPITAL LETTER P WITH DOT ABOVE -1E58 ; Uppercase # L& LATIN CAPITAL LETTER R WITH DOT ABOVE -1E5A ; Uppercase # L& LATIN CAPITAL LETTER R WITH DOT BELOW -1E5C ; Uppercase # L& LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON -1E5E ; Uppercase # L& LATIN CAPITAL LETTER R WITH LINE BELOW -1E60 ; Uppercase # L& LATIN CAPITAL LETTER S WITH DOT ABOVE -1E62 ; Uppercase # L& LATIN CAPITAL LETTER S WITH DOT BELOW -1E64 ; Uppercase # L& LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE -1E66 ; Uppercase # L& LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE -1E68 ; Uppercase # L& LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE -1E6A ; Uppercase # L& LATIN CAPITAL LETTER T WITH DOT ABOVE -1E6C ; Uppercase # L& LATIN CAPITAL LETTER T WITH DOT BELOW -1E6E ; Uppercase # L& LATIN CAPITAL LETTER T WITH LINE BELOW -1E70 ; Uppercase # L& LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW -1E72 ; Uppercase # L& LATIN CAPITAL LETTER U WITH DIAERESIS BELOW -1E74 ; Uppercase # L& LATIN CAPITAL LETTER U WITH TILDE BELOW -1E76 ; Uppercase # L& LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW -1E78 ; Uppercase # L& LATIN CAPITAL LETTER U WITH TILDE AND ACUTE -1E7A ; Uppercase # L& LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS -1E7C ; Uppercase # L& LATIN CAPITAL LETTER V WITH TILDE -1E7E ; Uppercase # L& LATIN CAPITAL LETTER V WITH DOT BELOW -1E80 ; Uppercase # L& LATIN CAPITAL LETTER W WITH GRAVE -1E82 ; Uppercase # L& LATIN CAPITAL LETTER W WITH ACUTE -1E84 ; Uppercase # L& LATIN CAPITAL LETTER W WITH DIAERESIS -1E86 ; Uppercase # L& LATIN CAPITAL LETTER W WITH DOT ABOVE -1E88 ; Uppercase # L& LATIN CAPITAL LETTER W WITH DOT BELOW -1E8A ; Uppercase # L& LATIN CAPITAL LETTER X WITH DOT ABOVE -1E8C ; Uppercase # L& LATIN CAPITAL LETTER X WITH DIAERESIS -1E8E ; Uppercase # L& LATIN CAPITAL LETTER Y WITH DOT ABOVE -1E90 ; Uppercase # L& LATIN CAPITAL LETTER Z WITH CIRCUMFLEX -1E92 ; Uppercase # L& LATIN CAPITAL LETTER Z WITH DOT BELOW -1E94 ; Uppercase # L& LATIN CAPITAL LETTER Z WITH LINE BELOW -1EA0 ; Uppercase # L& LATIN CAPITAL LETTER A WITH DOT BELOW -1EA2 ; Uppercase # L& LATIN CAPITAL LETTER A WITH HOOK ABOVE -1EA4 ; Uppercase # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE -1EA6 ; Uppercase # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE -1EA8 ; Uppercase # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE -1EAA ; Uppercase # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE -1EAC ; Uppercase # L& LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW -1EAE ; Uppercase # L& LATIN CAPITAL LETTER A WITH BREVE AND ACUTE -1EB0 ; Uppercase # L& LATIN CAPITAL LETTER A WITH BREVE AND GRAVE -1EB2 ; Uppercase # L& LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE -1EB4 ; Uppercase # L& LATIN CAPITAL LETTER A WITH BREVE AND TILDE -1EB6 ; Uppercase # L& LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW -1EB8 ; Uppercase # L& LATIN CAPITAL LETTER E WITH DOT BELOW -1EBA ; Uppercase # L& LATIN CAPITAL LETTER E WITH HOOK ABOVE -1EBC ; Uppercase # L& LATIN CAPITAL LETTER E WITH TILDE -1EBE ; Uppercase # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE -1EC0 ; Uppercase # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE -1EC2 ; Uppercase # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE -1EC4 ; Uppercase # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE -1EC6 ; Uppercase # L& LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW -1EC8 ; Uppercase # L& LATIN CAPITAL LETTER I WITH HOOK ABOVE -1ECA ; Uppercase # L& LATIN CAPITAL LETTER I WITH DOT BELOW -1ECC ; Uppercase # L& LATIN CAPITAL LETTER O WITH DOT BELOW -1ECE ; Uppercase # L& LATIN CAPITAL LETTER O WITH HOOK ABOVE -1ED0 ; Uppercase # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE -1ED2 ; Uppercase # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE -1ED4 ; Uppercase # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE -1ED6 ; Uppercase # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE -1ED8 ; Uppercase # L& LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW -1EDA ; Uppercase # L& LATIN CAPITAL LETTER O WITH HORN AND ACUTE -1EDC ; Uppercase # L& LATIN CAPITAL LETTER O WITH HORN AND GRAVE -1EDE ; Uppercase # L& LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE -1EE0 ; Uppercase # L& LATIN CAPITAL LETTER O WITH HORN AND TILDE -1EE2 ; Uppercase # L& LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW -1EE4 ; Uppercase # L& LATIN CAPITAL LETTER U WITH DOT BELOW -1EE6 ; Uppercase # L& LATIN CAPITAL LETTER U WITH HOOK ABOVE -1EE8 ; Uppercase # L& LATIN CAPITAL LETTER U WITH HORN AND ACUTE -1EEA ; Uppercase # L& LATIN CAPITAL LETTER U WITH HORN AND GRAVE -1EEC ; Uppercase # L& LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE -1EEE ; Uppercase # L& LATIN CAPITAL LETTER U WITH HORN AND TILDE -1EF0 ; Uppercase # L& LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW -1EF2 ; Uppercase # L& LATIN CAPITAL LETTER Y WITH GRAVE -1EF4 ; Uppercase # L& LATIN CAPITAL LETTER Y WITH DOT BELOW -1EF6 ; Uppercase # L& LATIN CAPITAL LETTER Y WITH HOOK ABOVE -1EF8 ; Uppercase # L& LATIN CAPITAL LETTER Y WITH TILDE -1F08..1F0F ; Uppercase # L& [8] GREEK CAPITAL LETTER ALPHA WITH PSILI..GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI -1F18..1F1D ; Uppercase # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA -1F28..1F2F ; Uppercase # L& [8] GREEK CAPITAL LETTER ETA WITH PSILI..GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI -1F38..1F3F ; Uppercase # L& [8] GREEK CAPITAL LETTER IOTA WITH PSILI..GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI -1F48..1F4D ; Uppercase # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA -1F59 ; Uppercase # L& GREEK CAPITAL LETTER UPSILON WITH DASIA -1F5B ; Uppercase # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA -1F5D ; Uppercase # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA -1F5F ; Uppercase # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI -1F68..1F6F ; Uppercase # L& [8] GREEK CAPITAL LETTER OMEGA WITH PSILI..GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI -1FB8..1FBB ; Uppercase # L& [4] GREEK CAPITAL LETTER ALPHA WITH VRACHY..GREEK CAPITAL LETTER ALPHA WITH OXIA -1FC8..1FCB ; Uppercase # L& [4] GREEK CAPITAL LETTER EPSILON WITH VARIA..GREEK CAPITAL LETTER ETA WITH OXIA -1FD8..1FDB ; Uppercase # L& [4] GREEK CAPITAL LETTER IOTA WITH VRACHY..GREEK CAPITAL LETTER IOTA WITH OXIA -1FE8..1FEC ; Uppercase # L& [5] GREEK CAPITAL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA -1FF8..1FFB ; Uppercase # L& [4] GREEK CAPITAL LETTER OMICRON WITH VARIA..GREEK CAPITAL LETTER OMEGA WITH OXIA -2102 ; Uppercase # L& DOUBLE-STRUCK CAPITAL C -2107 ; Uppercase # L& EULER CONSTANT -210B..210D ; Uppercase # L& [3] SCRIPT CAPITAL H..DOUBLE-STRUCK CAPITAL H -2110..2112 ; Uppercase # L& [3] SCRIPT CAPITAL I..SCRIPT CAPITAL L -2115 ; Uppercase # L& DOUBLE-STRUCK CAPITAL N -2119..211D ; Uppercase # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R -2124 ; Uppercase # L& DOUBLE-STRUCK CAPITAL Z -2126 ; Uppercase # L& OHM SIGN -2128 ; Uppercase # L& BLACK-LETTER CAPITAL Z -212A..212D ; Uppercase # L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C -2130..2131 ; Uppercase # L& [2] SCRIPT CAPITAL E..SCRIPT CAPITAL F -2133 ; Uppercase # L& SCRIPT CAPITAL M -213E..213F ; Uppercase # L& [2] DOUBLE-STRUCK CAPITAL GAMMA..DOUBLE-STRUCK CAPITAL PI -2145 ; Uppercase # L& DOUBLE-STRUCK ITALIC CAPITAL D -2160..216F ; Uppercase # Nl [16] ROMAN NUMERAL ONE..ROMAN NUMERAL ONE THOUSAND -24B6..24CF ; Uppercase # So [26] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN CAPITAL LETTER Z -FF21..FF3A ; Uppercase # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z -10400..10427 ; Uppercase # L& [40] DESERET CAPITAL LETTER LONG I..DESERET CAPITAL LETTER EW -1D400..1D419 ; Uppercase # L& [26] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL BOLD CAPITAL Z -1D434..1D44D ; Uppercase # L& [26] MATHEMATICAL ITALIC CAPITAL A..MATHEMATICAL ITALIC CAPITAL Z -1D468..1D481 ; Uppercase # L& [26] MATHEMATICAL BOLD ITALIC CAPITAL A..MATHEMATICAL BOLD ITALIC CAPITAL Z -1D49C ; Uppercase # L& MATHEMATICAL SCRIPT CAPITAL A -1D49E..1D49F ; Uppercase # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D -1D4A2 ; Uppercase # L& MATHEMATICAL SCRIPT CAPITAL G -1D4A5..1D4A6 ; Uppercase # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K -1D4A9..1D4AC ; Uppercase # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q -1D4AE..1D4B5 ; Uppercase # L& [8] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT CAPITAL Z -1D4D0..1D4E9 ; Uppercase # L& [26] MATHEMATICAL BOLD SCRIPT CAPITAL A..MATHEMATICAL BOLD SCRIPT CAPITAL Z -1D504..1D505 ; Uppercase # L& [2] MATHEMATICAL FRAKTUR CAPITAL A..MATHEMATICAL FRAKTUR CAPITAL B -1D507..1D50A ; Uppercase # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G -1D50D..1D514 ; Uppercase # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q -1D516..1D51C ; Uppercase # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y -1D538..1D539 ; Uppercase # L& [2] MATHEMATICAL DOUBLE-STRUCK CAPITAL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B -1D53B..1D53E ; Uppercase # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G -1D540..1D544 ; Uppercase # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M -1D546 ; Uppercase # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O -1D54A..1D550 ; Uppercase # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y -1D56C..1D585 ; Uppercase # L& [26] MATHEMATICAL BOLD FRAKTUR CAPITAL A..MATHEMATICAL BOLD FRAKTUR CAPITAL Z -1D5A0..1D5B9 ; Uppercase # L& [26] MATHEMATICAL SANS-SERIF CAPITAL A..MATHEMATICAL SANS-SERIF CAPITAL Z -1D5D4..1D5ED ; Uppercase # L& [26] MATHEMATICAL SANS-SERIF BOLD CAPITAL A..MATHEMATICAL SANS-SERIF BOLD CAPITAL Z -1D608..1D621 ; Uppercase # L& [26] MATHEMATICAL SANS-SERIF ITALIC CAPITAL A..MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z -1D63C..1D655 ; Uppercase # L& [26] MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z -1D670..1D689 ; Uppercase # L& [26] MATHEMATICAL MONOSPACE CAPITAL A..MATHEMATICAL MONOSPACE CAPITAL Z -1D6A8..1D6C0 ; Uppercase # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA -1D6E2..1D6FA ; Uppercase # L& [25] MATHEMATICAL ITALIC CAPITAL ALPHA..MATHEMATICAL ITALIC CAPITAL OMEGA -1D71C..1D734 ; Uppercase # L& [25] MATHEMATICAL BOLD ITALIC CAPITAL ALPHA..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA -1D756..1D76E ; Uppercase # L& [25] MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA -1D790..1D7A8 ; Uppercase # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +0041..005A ; Uppercase +00C0..00D6 ; Uppercase +00D8..00DE ; Uppercase +0100 ; Uppercase +0102 ; Uppercase +0104 ; Uppercase +0106 ; Uppercase +0108 ; Uppercase +010A ; Uppercase +010C ; Uppercase +010E ; Uppercase +0110 ; Uppercase +0112 ; Uppercase +0114 ; Uppercase +0116 ; Uppercase +0118 ; Uppercase +011A ; Uppercase +011C ; Uppercase +011E ; Uppercase +0120 ; Uppercase +0122 ; Uppercase +0124 ; Uppercase +0126 ; Uppercase +0128 ; Uppercase +012A ; Uppercase +012C ; Uppercase +012E ; Uppercase +0130 ; Uppercase +0132 ; Uppercase +0134 ; Uppercase +0136 ; Uppercase +0139 ; Uppercase +013B ; Uppercase +013D ; Uppercase +013F ; Uppercase +0141 ; Uppercase +0143 ; Uppercase +0145 ; Uppercase +0147 ; Uppercase +014A ; Uppercase +014C ; Uppercase +014E ; Uppercase +0150 ; Uppercase +0152 ; Uppercase +0154 ; Uppercase +0156 ; Uppercase +0158 ; Uppercase +015A ; Uppercase +015C ; Uppercase +015E ; Uppercase +0160 ; Uppercase +0162 ; Uppercase +0164 ; Uppercase +0166 ; Uppercase +0168 ; Uppercase +016A ; Uppercase +016C ; Uppercase +016E ; Uppercase +0170 ; Uppercase +0172 ; Uppercase +0174 ; Uppercase +0176 ; Uppercase +0178..0179 ; Uppercase +017B ; Uppercase +017D ; Uppercase +0181..0182 ; Uppercase +0184 ; Uppercase +0186..0187 ; Uppercase +0189..018B ; Uppercase +018E..0191 ; Uppercase +0193..0194 ; Uppercase +0196..0198 ; Uppercase +019C..019D ; Uppercase +019F..01A0 ; Uppercase +01A2 ; Uppercase +01A4 ; Uppercase +01A6..01A7 ; Uppercase +01A9 ; Uppercase +01AC ; Uppercase +01AE..01AF ; Uppercase +01B1..01B3 ; Uppercase +01B5 ; Uppercase +01B7..01B8 ; Uppercase +01BC ; Uppercase +01C4 ; Uppercase +01C7 ; Uppercase +01CA ; Uppercase +01CD ; Uppercase +01CF ; Uppercase +01D1 ; Uppercase +01D3 ; Uppercase +01D5 ; Uppercase +01D7 ; Uppercase +01D9 ; Uppercase +01DB ; Uppercase +01DE ; Uppercase +01E0 ; Uppercase +01E2 ; Uppercase +01E4 ; Uppercase +01E6 ; Uppercase +01E8 ; Uppercase +01EA ; Uppercase +01EC ; Uppercase +01EE ; Uppercase +01F1 ; Uppercase +01F4 ; Uppercase +01F6..01F8 ; Uppercase +01FA ; Uppercase +01FC ; Uppercase +01FE ; Uppercase +0200 ; Uppercase +0202 ; Uppercase +0204 ; Uppercase +0206 ; Uppercase +0208 ; Uppercase +020A ; Uppercase +020C ; Uppercase +020E ; Uppercase +0210 ; Uppercase +0212 ; Uppercase +0214 ; Uppercase +0216 ; Uppercase +0218 ; Uppercase +021A ; Uppercase +021C ; Uppercase +021E ; Uppercase +0220 ; Uppercase +0222 ; Uppercase +0224 ; Uppercase +0226 ; Uppercase +0228 ; Uppercase +022A ; Uppercase +022C ; Uppercase +022E ; Uppercase +0230 ; Uppercase +0232 ; Uppercase +0386 ; Uppercase +0388..038A ; Uppercase +038C ; Uppercase +038E..038F ; Uppercase +0391..03A1 ; Uppercase +03A3..03AB ; Uppercase +03D2..03D4 ; Uppercase +03D8 ; Uppercase +03DA ; Uppercase +03DC ; Uppercase +03DE ; Uppercase +03E0 ; Uppercase +03E2 ; Uppercase +03E4 ; Uppercase +03E6 ; Uppercase +03E8 ; Uppercase +03EA ; Uppercase +03EC ; Uppercase +03EE ; Uppercase +03F4 ; Uppercase +03F7 ; Uppercase +03F9..03FA ; Uppercase +0400..042F ; Uppercase +0460 ; Uppercase +0462 ; Uppercase +0464 ; Uppercase +0466 ; Uppercase +0468 ; Uppercase +046A ; Uppercase +046C ; Uppercase +046E ; Uppercase +0470 ; Uppercase +0472 ; Uppercase +0474 ; Uppercase +0476 ; Uppercase +0478 ; Uppercase +047A ; Uppercase +047C ; Uppercase +047E ; Uppercase +0480 ; Uppercase +048A ; Uppercase +048C ; Uppercase +048E ; Uppercase +0490 ; Uppercase +0492 ; Uppercase +0494 ; Uppercase +0496 ; Uppercase +0498 ; Uppercase +049A ; Uppercase +049C ; Uppercase +049E ; Uppercase +04A0 ; Uppercase +04A2 ; Uppercase +04A4 ; Uppercase +04A6 ; Uppercase +04A8 ; Uppercase +04AA ; Uppercase +04AC ; Uppercase +04AE ; Uppercase +04B0 ; Uppercase +04B2 ; Uppercase +04B4 ; Uppercase +04B6 ; Uppercase +04B8 ; Uppercase +04BA ; Uppercase +04BC ; Uppercase +04BE ; Uppercase +04C0..04C1 ; Uppercase +04C3 ; Uppercase +04C5 ; Uppercase +04C7 ; Uppercase +04C9 ; Uppercase +04CB ; Uppercase +04CD ; Uppercase +04D0 ; Uppercase +04D2 ; Uppercase +04D4 ; Uppercase +04D6 ; Uppercase +04D8 ; Uppercase +04DA ; Uppercase +04DC ; Uppercase +04DE ; Uppercase +04E0 ; Uppercase +04E2 ; Uppercase +04E4 ; Uppercase +04E6 ; Uppercase +04E8 ; Uppercase +04EA ; Uppercase +04EC ; Uppercase +04EE ; Uppercase +04F0 ; Uppercase +04F2 ; Uppercase +04F4 ; Uppercase +04F8 ; Uppercase +0500 ; Uppercase +0502 ; Uppercase +0504 ; Uppercase +0506 ; Uppercase +0508 ; Uppercase +050A ; Uppercase +050C ; Uppercase +050E ; Uppercase +0531..0556 ; Uppercase +10A0..10C5 ; Uppercase +1E00 ; Uppercase +1E02 ; Uppercase +1E04 ; Uppercase +1E06 ; Uppercase +1E08 ; Uppercase +1E0A ; Uppercase +1E0C ; Uppercase +1E0E ; Uppercase +1E10 ; Uppercase +1E12 ; Uppercase +1E14 ; Uppercase +1E16 ; Uppercase +1E18 ; Uppercase +1E1A ; Uppercase +1E1C ; Uppercase +1E1E ; Uppercase +1E20 ; Uppercase +1E22 ; Uppercase +1E24 ; Uppercase +1E26 ; Uppercase +1E28 ; Uppercase +1E2A ; Uppercase +1E2C ; Uppercase +1E2E ; Uppercase +1E30 ; Uppercase +1E32 ; Uppercase +1E34 ; Uppercase +1E36 ; Uppercase +1E38 ; Uppercase +1E3A ; Uppercase +1E3C ; Uppercase +1E3E ; Uppercase +1E40 ; Uppercase +1E42 ; Uppercase +1E44 ; Uppercase +1E46 ; Uppercase +1E48 ; Uppercase +1E4A ; Uppercase +1E4C ; Uppercase +1E4E ; Uppercase +1E50 ; Uppercase +1E52 ; Uppercase +1E54 ; Uppercase +1E56 ; Uppercase +1E58 ; Uppercase +1E5A ; Uppercase +1E5C ; Uppercase +1E5E ; Uppercase +1E60 ; Uppercase +1E62 ; Uppercase +1E64 ; Uppercase +1E66 ; Uppercase +1E68 ; Uppercase +1E6A ; Uppercase +1E6C ; Uppercase +1E6E ; Uppercase +1E70 ; Uppercase +1E72 ; Uppercase +1E74 ; Uppercase +1E76 ; Uppercase +1E78 ; Uppercase +1E7A ; Uppercase +1E7C ; Uppercase +1E7E ; Uppercase +1E80 ; Uppercase +1E82 ; Uppercase +1E84 ; Uppercase +1E86 ; Uppercase +1E88 ; Uppercase +1E8A ; Uppercase +1E8C ; Uppercase +1E8E ; Uppercase +1E90 ; Uppercase +1E92 ; Uppercase +1E94 ; Uppercase +1EA0 ; Uppercase +1EA2 ; Uppercase +1EA4 ; Uppercase +1EA6 ; Uppercase +1EA8 ; Uppercase +1EAA ; Uppercase +1EAC ; Uppercase +1EAE ; Uppercase +1EB0 ; Uppercase +1EB2 ; Uppercase +1EB4 ; Uppercase +1EB6 ; Uppercase +1EB8 ; Uppercase +1EBA ; Uppercase +1EBC ; Uppercase +1EBE ; Uppercase +1EC0 ; Uppercase +1EC2 ; Uppercase +1EC4 ; Uppercase +1EC6 ; Uppercase +1EC8 ; Uppercase +1ECA ; Uppercase +1ECC ; Uppercase +1ECE ; Uppercase +1ED0 ; Uppercase +1ED2 ; Uppercase +1ED4 ; Uppercase +1ED6 ; Uppercase +1ED8 ; Uppercase +1EDA ; Uppercase +1EDC ; Uppercase +1EDE ; Uppercase +1EE0 ; Uppercase +1EE2 ; Uppercase +1EE4 ; Uppercase +1EE6 ; Uppercase +1EE8 ; Uppercase +1EEA ; Uppercase +1EEC ; Uppercase +1EEE ; Uppercase +1EF0 ; Uppercase +1EF2 ; Uppercase +1EF4 ; Uppercase +1EF6 ; Uppercase +1EF8 ; Uppercase +1F08..1F0F ; Uppercase +1F18..1F1D ; Uppercase +1F28..1F2F ; Uppercase +1F38..1F3F ; Uppercase +1F48..1F4D ; Uppercase +1F59 ; Uppercase +1F5B ; Uppercase +1F5D ; Uppercase +1F5F ; Uppercase +1F68..1F6F ; Uppercase +1FB8..1FBB ; Uppercase +1FC8..1FCB ; Uppercase +1FD8..1FDB ; Uppercase +1FE8..1FEC ; Uppercase +1FF8..1FFB ; Uppercase +2102 ; Uppercase +2107 ; Uppercase +210B..210D ; Uppercase +2110..2112 ; Uppercase +2115 ; Uppercase +2119..211D ; Uppercase +2124 ; Uppercase +2126 ; Uppercase +2128 ; Uppercase +212A..212D ; Uppercase +2130..2131 ; Uppercase +2133 ; Uppercase +213E..213F ; Uppercase +2145 ; Uppercase +2160..216F ; Uppercase +24B6..24CF ; Uppercase +FF21..FF3A ; Uppercase +10400..10427 ; Uppercase +1D400..1D419 ; Uppercase +1D434..1D44D ; Uppercase +1D468..1D481 ; Uppercase +1D49C ; Uppercase +1D49E..1D49F ; Uppercase +1D4A2 ; Uppercase +1D4A5..1D4A6 ; Uppercase +1D4A9..1D4AC ; Uppercase +1D4AE..1D4B5 ; Uppercase +1D4D0..1D4E9 ; Uppercase +1D504..1D505 ; Uppercase +1D507..1D50A ; Uppercase +1D50D..1D514 ; Uppercase +1D516..1D51C ; Uppercase +1D538..1D539 ; Uppercase +1D53B..1D53E ; Uppercase +1D540..1D544 ; Uppercase +1D546 ; Uppercase +1D54A..1D550 ; Uppercase +1D56C..1D585 ; Uppercase +1D5A0..1D5B9 ; Uppercase +1D5D4..1D5ED ; Uppercase +1D608..1D621 ; Uppercase +1D63C..1D655 ; Uppercase +1D670..1D689 ; Uppercase +1D6A8..1D6C0 ; Uppercase +1D6E2..1D6FA ; Uppercase +1D71C..1D734 ; Uppercase +1D756..1D76E ; Uppercase +1D790..1D7A8 ; Uppercase # Total code points: 1232 @@ -1523,362 +1539,362 @@ FF21..FF3A ; Uppercase # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH # Characters that can start an identifier. # Generated from Lu+Ll+Lt+Lm+Lo+Nl+Other_ID_Start -0041..005A ; ID_Start # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z -0061..007A ; ID_Start # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z -00AA ; ID_Start # L& FEMININE ORDINAL INDICATOR -00B5 ; ID_Start # L& MICRO SIGN -00BA ; ID_Start # L& MASCULINE ORDINAL INDICATOR -00C0..00D6 ; ID_Start # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS -00D8..00F6 ; ID_Start # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS -00F8..01BA ; ID_Start # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL -01BB ; ID_Start # Lo LATIN LETTER TWO WITH STROKE -01BC..01BF ; ID_Start # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN -01C0..01C3 ; ID_Start # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK -01C4..0236 ; ID_Start # L& [115] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER T WITH CURL -0250..02AF ; ID_Start # L& [96] LATIN SMALL LETTER TURNED A..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL -02B0..02C1 ; ID_Start # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP -02C6..02D1 ; ID_Start # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON -02E0..02E4 ; ID_Start # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP -02EE ; ID_Start # Lm MODIFIER LETTER DOUBLE APOSTROPHE -037A ; ID_Start # Lm GREEK YPOGEGRAMMENI -0386 ; ID_Start # L& GREEK CAPITAL LETTER ALPHA WITH TONOS -0388..038A ; ID_Start # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS -038C ; ID_Start # L& GREEK CAPITAL LETTER OMICRON WITH TONOS -038E..03A1 ; ID_Start # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO -03A3..03CE ; ID_Start # L& [44] GREEK CAPITAL LETTER SIGMA..GREEK SMALL LETTER OMEGA WITH TONOS -03D0..03F5 ; ID_Start # L& [38] GREEK BETA SYMBOL..GREEK LUNATE EPSILON SYMBOL -03F7..03FB ; ID_Start # L& [5] GREEK CAPITAL LETTER SHO..GREEK SMALL LETTER SAN -0400..0481 ; ID_Start # L& [130] CYRILLIC CAPITAL LETTER IE WITH GRAVE..CYRILLIC SMALL LETTER KOPPA -048A..04CE ; ID_Start # L& [69] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EM WITH TAIL -04D0..04F5 ; ID_Start # L& [38] CYRILLIC CAPITAL LETTER A WITH BREVE..CYRILLIC SMALL LETTER CHE WITH DIAERESIS -04F8..04F9 ; ID_Start # L& [2] CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS..CYRILLIC SMALL LETTER YERU WITH DIAERESIS -0500..050F ; ID_Start # L& [16] CYRILLIC CAPITAL LETTER KOMI DE..CYRILLIC SMALL LETTER KOMI TJE -0531..0556 ; ID_Start # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH -0559 ; ID_Start # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING -0561..0587 ; ID_Start # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN -05D0..05EA ; ID_Start # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV -05F0..05F2 ; ID_Start # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD -0621..063A ; ID_Start # Lo [26] ARABIC LETTER HAMZA..ARABIC LETTER GHAIN -0640 ; ID_Start # Lm ARABIC TATWEEL -0641..064A ; ID_Start # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH -066E..066F ; ID_Start # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF -0671..06D3 ; ID_Start # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE -06D5 ; ID_Start # Lo ARABIC LETTER AE -06E5..06E6 ; ID_Start # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH -06EE..06EF ; ID_Start # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V -06FA..06FC ; ID_Start # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW -06FF ; ID_Start # Lo ARABIC LETTER HEH WITH INVERTED V -0710 ; ID_Start # Lo SYRIAC LETTER ALAPH -0712..072F ; ID_Start # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH -074D..074F ; ID_Start # Lo [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE -0780..07A5 ; ID_Start # Lo [38] THAANA LETTER HAA..THAANA LETTER WAAVU -07B1 ; ID_Start # Lo THAANA LETTER NAA -0904..0939 ; ID_Start # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA -093D ; ID_Start # Lo DEVANAGARI SIGN AVAGRAHA -0950 ; ID_Start # Lo DEVANAGARI OM -0958..0961 ; ID_Start # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL -0985..098C ; ID_Start # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L -098F..0990 ; ID_Start # Lo [2] BENGALI LETTER E..BENGALI LETTER AI -0993..09A8 ; ID_Start # Lo [22] BENGALI LETTER O..BENGALI LETTER NA -09AA..09B0 ; ID_Start # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA -09B2 ; ID_Start # Lo BENGALI LETTER LA -09B6..09B9 ; ID_Start # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA -09BD ; ID_Start # Lo BENGALI SIGN AVAGRAHA -09DC..09DD ; ID_Start # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA -09DF..09E1 ; ID_Start # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL -09F0..09F1 ; ID_Start # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL -0A05..0A0A ; ID_Start # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU -0A0F..0A10 ; ID_Start # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI -0A13..0A28 ; ID_Start # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA -0A2A..0A30 ; ID_Start # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA -0A32..0A33 ; ID_Start # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA -0A35..0A36 ; ID_Start # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA -0A38..0A39 ; ID_Start # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA -0A59..0A5C ; ID_Start # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA -0A5E ; ID_Start # Lo GURMUKHI LETTER FA -0A72..0A74 ; ID_Start # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR -0A85..0A8D ; ID_Start # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E -0A8F..0A91 ; ID_Start # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O -0A93..0AA8 ; ID_Start # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA -0AAA..0AB0 ; ID_Start # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA -0AB2..0AB3 ; ID_Start # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA -0AB5..0AB9 ; ID_Start # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA -0ABD ; ID_Start # Lo GUJARATI SIGN AVAGRAHA -0AD0 ; ID_Start # Lo GUJARATI OM -0AE0..0AE1 ; ID_Start # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL -0B05..0B0C ; ID_Start # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L -0B0F..0B10 ; ID_Start # Lo [2] ORIYA LETTER E..ORIYA LETTER AI -0B13..0B28 ; ID_Start # Lo [22] ORIYA LETTER O..ORIYA LETTER NA -0B2A..0B30 ; ID_Start # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA -0B32..0B33 ; ID_Start # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA -0B35..0B39 ; ID_Start # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA -0B3D ; ID_Start # Lo ORIYA SIGN AVAGRAHA -0B5C..0B5D ; ID_Start # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA -0B5F..0B61 ; ID_Start # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL -0B71 ; ID_Start # Lo ORIYA LETTER WA -0B83 ; ID_Start # Lo TAMIL SIGN VISARGA -0B85..0B8A ; ID_Start # Lo [6] TAMIL LETTER A..TAMIL LETTER UU -0B8E..0B90 ; ID_Start # Lo [3] TAMIL LETTER E..TAMIL LETTER AI -0B92..0B95 ; ID_Start # Lo [4] TAMIL LETTER O..TAMIL LETTER KA -0B99..0B9A ; ID_Start # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA -0B9C ; ID_Start # Lo TAMIL LETTER JA -0B9E..0B9F ; ID_Start # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA -0BA3..0BA4 ; ID_Start # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA -0BA8..0BAA ; ID_Start # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA -0BAE..0BB5 ; ID_Start # Lo [8] TAMIL LETTER MA..TAMIL LETTER VA -0BB7..0BB9 ; ID_Start # Lo [3] TAMIL LETTER SSA..TAMIL LETTER HA -0C05..0C0C ; ID_Start # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L -0C0E..0C10 ; ID_Start # Lo [3] TELUGU LETTER E..TELUGU LETTER AI -0C12..0C28 ; ID_Start # Lo [23] TELUGU LETTER O..TELUGU LETTER NA -0C2A..0C33 ; ID_Start # Lo [10] TELUGU LETTER PA..TELUGU LETTER LLA -0C35..0C39 ; ID_Start # Lo [5] TELUGU LETTER VA..TELUGU LETTER HA -0C60..0C61 ; ID_Start # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL -0C85..0C8C ; ID_Start # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L -0C8E..0C90 ; ID_Start # Lo [3] KANNADA LETTER E..KANNADA LETTER AI -0C92..0CA8 ; ID_Start # Lo [23] KANNADA LETTER O..KANNADA LETTER NA -0CAA..0CB3 ; ID_Start # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA -0CB5..0CB9 ; ID_Start # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA -0CBD ; ID_Start # Lo KANNADA SIGN AVAGRAHA -0CDE ; ID_Start # Lo KANNADA LETTER FA -0CE0..0CE1 ; ID_Start # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL -0D05..0D0C ; ID_Start # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L -0D0E..0D10 ; ID_Start # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI -0D12..0D28 ; ID_Start # Lo [23] MALAYALAM LETTER O..MALAYALAM LETTER NA -0D2A..0D39 ; ID_Start # Lo [16] MALAYALAM LETTER PA..MALAYALAM LETTER HA -0D60..0D61 ; ID_Start # Lo [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL -0D85..0D96 ; ID_Start # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA -0D9A..0DB1 ; ID_Start # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA -0DB3..0DBB ; ID_Start # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA -0DBD ; ID_Start # Lo SINHALA LETTER DANTAJA LAYANNA -0DC0..0DC6 ; ID_Start # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA -0E01..0E30 ; ID_Start # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A -0E32..0E33 ; ID_Start # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM -0E40..0E45 ; ID_Start # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO -0E46 ; ID_Start # Lm THAI CHARACTER MAIYAMOK -0E81..0E82 ; ID_Start # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG -0E84 ; ID_Start # Lo LAO LETTER KHO TAM -0E87..0E88 ; ID_Start # Lo [2] LAO LETTER NGO..LAO LETTER CO -0E8A ; ID_Start # Lo LAO LETTER SO TAM -0E8D ; ID_Start # Lo LAO LETTER NYO -0E94..0E97 ; ID_Start # Lo [4] LAO LETTER DO..LAO LETTER THO TAM -0E99..0E9F ; ID_Start # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG -0EA1..0EA3 ; ID_Start # Lo [3] LAO LETTER MO..LAO LETTER LO LING -0EA5 ; ID_Start # Lo LAO LETTER LO LOOT -0EA7 ; ID_Start # Lo LAO LETTER WO -0EAA..0EAB ; ID_Start # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG -0EAD..0EB0 ; ID_Start # Lo [4] LAO LETTER O..LAO VOWEL SIGN A -0EB2..0EB3 ; ID_Start # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM -0EBD ; ID_Start # Lo LAO SEMIVOWEL SIGN NYO -0EC0..0EC4 ; ID_Start # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI -0EC6 ; ID_Start # Lm LAO KO LA -0EDC..0EDD ; ID_Start # Lo [2] LAO HO NO..LAO HO MO -0F00 ; ID_Start # Lo TIBETAN SYLLABLE OM -0F40..0F47 ; ID_Start # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA -0F49..0F6A ; ID_Start # Lo [34] TIBETAN LETTER NYA..TIBETAN LETTER FIXED-FORM RA -0F88..0F8B ; ID_Start # Lo [4] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN GRU MED RGYINGS -1000..1021 ; ID_Start # Lo [34] MYANMAR LETTER KA..MYANMAR LETTER A -1023..1027 ; ID_Start # Lo [5] MYANMAR LETTER I..MYANMAR LETTER E -1029..102A ; ID_Start # Lo [2] MYANMAR LETTER O..MYANMAR LETTER AU -1050..1055 ; ID_Start # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL -10A0..10C5 ; ID_Start # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE -10D0..10F8 ; ID_Start # Lo [41] GEORGIAN LETTER AN..GEORGIAN LETTER ELIFI -1100..1159 ; ID_Start # Lo [90] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH -115F..11A2 ; ID_Start # Lo [68] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG SSANGARAEA -11A8..11F9 ; ID_Start # Lo [82] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH -1200..1206 ; ID_Start # Lo [7] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE HO -1208..1246 ; ID_Start # Lo [63] ETHIOPIC SYLLABLE LA..ETHIOPIC SYLLABLE QO -1248 ; ID_Start # Lo ETHIOPIC SYLLABLE QWA -124A..124D ; ID_Start # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE -1250..1256 ; ID_Start # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO -1258 ; ID_Start # Lo ETHIOPIC SYLLABLE QHWA -125A..125D ; ID_Start # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE -1260..1286 ; ID_Start # Lo [39] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XO -1288 ; ID_Start # Lo ETHIOPIC SYLLABLE XWA -128A..128D ; ID_Start # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE -1290..12AE ; ID_Start # Lo [31] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KO -12B0 ; ID_Start # Lo ETHIOPIC SYLLABLE KWA -12B2..12B5 ; ID_Start # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE -12B8..12BE ; ID_Start # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO -12C0 ; ID_Start # Lo ETHIOPIC SYLLABLE KXWA -12C2..12C5 ; ID_Start # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE -12C8..12CE ; ID_Start # Lo [7] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE WO -12D0..12D6 ; ID_Start # Lo [7] ETHIOPIC SYLLABLE PHARYNGEAL A..ETHIOPIC SYLLABLE PHARYNGEAL O -12D8..12EE ; ID_Start # Lo [23] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE YO -12F0..130E ; ID_Start # Lo [31] ETHIOPIC SYLLABLE DA..ETHIOPIC SYLLABLE GO -1310 ; ID_Start # Lo ETHIOPIC SYLLABLE GWA -1312..1315 ; ID_Start # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE -1318..131E ; ID_Start # Lo [7] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE GGO -1320..1346 ; ID_Start # Lo [39] ETHIOPIC SYLLABLE THA..ETHIOPIC SYLLABLE TZO -1348..135A ; ID_Start # Lo [19] ETHIOPIC SYLLABLE FA..ETHIOPIC SYLLABLE FYA -13A0..13F4 ; ID_Start # Lo [85] CHEROKEE LETTER A..CHEROKEE LETTER YV -1401..166C ; ID_Start # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA -166F..1676 ; ID_Start # Lo [8] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS NNGAA -1681..169A ; ID_Start # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH -16A0..16EA ; ID_Start # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X -16EE..16F0 ; ID_Start # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL -1700..170C ; ID_Start # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA -170E..1711 ; ID_Start # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA -1720..1731 ; ID_Start # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA -1740..1751 ; ID_Start # Lo [18] BUHID LETTER A..BUHID LETTER HA -1760..176C ; ID_Start # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA -176E..1770 ; ID_Start # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA -1780..17B3 ; ID_Start # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU -17D7 ; ID_Start # Lm KHMER SIGN LEK TOO -17DC ; ID_Start # Lo KHMER SIGN AVAKRAHASANYA -1820..1842 ; ID_Start # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI -1843 ; ID_Start # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN -1844..1877 ; ID_Start # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA -1880..18A8 ; ID_Start # Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA -1900..191C ; ID_Start # Lo [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA -1950..196D ; ID_Start # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI -1970..1974 ; ID_Start # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 -1D00..1D2B ; ID_Start # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL -1D2C..1D61 ; ID_Start # Lm [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI -1D62..1D6B ; ID_Start # L& [10] LATIN SUBSCRIPT SMALL LETTER I..LATIN SMALL LETTER UE -1E00..1E9B ; ID_Start # L& [156] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER LONG S WITH DOT ABOVE -1EA0..1EF9 ; ID_Start # L& [90] LATIN CAPITAL LETTER A WITH DOT BELOW..LATIN SMALL LETTER Y WITH TILDE -1F00..1F15 ; ID_Start # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA -1F18..1F1D ; ID_Start # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA -1F20..1F45 ; ID_Start # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA -1F48..1F4D ; ID_Start # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA -1F50..1F57 ; ID_Start # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI -1F59 ; ID_Start # L& GREEK CAPITAL LETTER UPSILON WITH DASIA -1F5B ; ID_Start # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA -1F5D ; ID_Start # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA -1F5F..1F7D ; ID_Start # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA -1F80..1FB4 ; ID_Start # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI -1FB6..1FBC ; ID_Start # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI -1FBE ; ID_Start # L& GREEK PROSGEGRAMMENI -1FC2..1FC4 ; ID_Start # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI -1FC6..1FCC ; ID_Start # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI -1FD0..1FD3 ; ID_Start # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA -1FD6..1FDB ; ID_Start # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA -1FE0..1FEC ; ID_Start # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA -1FF2..1FF4 ; ID_Start # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI -1FF6..1FFC ; ID_Start # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI -2071 ; ID_Start # L& SUPERSCRIPT LATIN SMALL LETTER I -207F ; ID_Start # L& SUPERSCRIPT LATIN SMALL LETTER N -2102 ; ID_Start # L& DOUBLE-STRUCK CAPITAL C -2107 ; ID_Start # L& EULER CONSTANT -210A..2113 ; ID_Start # L& [10] SCRIPT SMALL G..SCRIPT SMALL L -2115 ; ID_Start # L& DOUBLE-STRUCK CAPITAL N -2118 ; ID_Start # So SCRIPT CAPITAL P -2119..211D ; ID_Start # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R -2124 ; ID_Start # L& DOUBLE-STRUCK CAPITAL Z -2126 ; ID_Start # L& OHM SIGN -2128 ; ID_Start # L& BLACK-LETTER CAPITAL Z -212A..212D ; ID_Start # L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C -212E ; ID_Start # So ESTIMATED SYMBOL -212F..2131 ; ID_Start # L& [3] SCRIPT SMALL E..SCRIPT CAPITAL F -2133..2134 ; ID_Start # L& [2] SCRIPT CAPITAL M..SCRIPT SMALL O -2135..2138 ; ID_Start # Lo [4] ALEF SYMBOL..DALET SYMBOL -2139 ; ID_Start # L& INFORMATION SOURCE -213D..213F ; ID_Start # L& [3] DOUBLE-STRUCK SMALL GAMMA..DOUBLE-STRUCK CAPITAL PI -2145..2149 ; ID_Start # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J -2160..2183 ; ID_Start # Nl [36] ROMAN NUMERAL ONE..ROMAN NUMERAL REVERSED ONE HUNDRED -3005 ; ID_Start # Lm IDEOGRAPHIC ITERATION MARK -3006 ; ID_Start # Lo IDEOGRAPHIC CLOSING MARK -3007 ; ID_Start # Nl IDEOGRAPHIC NUMBER ZERO -3021..3029 ; ID_Start # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE -3031..3035 ; ID_Start # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF -3038..303A ; ID_Start # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY -303B ; ID_Start # Lm VERTICAL IDEOGRAPHIC ITERATION MARK -303C ; ID_Start # Lo MASU MARK -3041..3096 ; ID_Start # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE -309B..309C ; ID_Start # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK -309D..309E ; ID_Start # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK -309F ; ID_Start # Lo HIRAGANA DIGRAPH YORI -30A1..30FA ; ID_Start # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO -30FC..30FE ; ID_Start # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK -30FF ; ID_Start # Lo KATAKANA DIGRAPH KOTO -3105..312C ; ID_Start # Lo [40] BOPOMOFO LETTER B..BOPOMOFO LETTER GN -3131..318E ; ID_Start # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE -31A0..31B7 ; ID_Start # Lo [24] BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H -31F0..31FF ; ID_Start # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO -3400..4DB5 ; ID_Start # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 -4E00..9FA5 ; ID_Start # Lo [20902] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FA5 -A000..A48C ; ID_Start # Lo [1165] YI SYLLABLE IT..YI SYLLABLE YYR -AC00..D7A3 ; ID_Start # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH -F900..FA2D ; ID_Start # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D -FA30..FA6A ; ID_Start # Lo [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A -FB00..FB06 ; ID_Start # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST -FB13..FB17 ; ID_Start # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH -FB1D ; ID_Start # Lo HEBREW LETTER YOD WITH HIRIQ -FB1F..FB28 ; ID_Start # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV -FB2A..FB36 ; ID_Start # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH -FB38..FB3C ; ID_Start # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH -FB3E ; ID_Start # Lo HEBREW LETTER MEM WITH DAGESH -FB40..FB41 ; ID_Start # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH -FB43..FB44 ; ID_Start # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH -FB46..FBB1 ; ID_Start # Lo [108] HEBREW LETTER TSADI WITH DAGESH..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM -FBD3..FD3D ; ID_Start # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM -FD50..FD8F ; ID_Start # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM -FD92..FDC7 ; ID_Start # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM -FDF0..FDFB ; ID_Start # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU -FE70..FE74 ; ID_Start # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM -FE76..FEFC ; ID_Start # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM -FF21..FF3A ; ID_Start # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z -FF41..FF5A ; ID_Start # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z -FF66..FF6F ; ID_Start # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU -FF70 ; ID_Start # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK -FF71..FF9D ; ID_Start # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N -FF9E..FF9F ; ID_Start # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK -FFA0..FFBE ; ID_Start # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH -FFC2..FFC7 ; ID_Start # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E -FFCA..FFCF ; ID_Start # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE -FFD2..FFD7 ; ID_Start # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU -FFDA..FFDC ; ID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I -10000..1000B ; ID_Start # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE -1000D..10026 ; ID_Start # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO -10028..1003A ; ID_Start # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO -1003C..1003D ; ID_Start # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE -1003F..1004D ; ID_Start # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO -10050..1005D ; ID_Start # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 -10080..100FA ; ID_Start # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 -10300..1031E ; ID_Start # Lo [31] OLD ITALIC LETTER A..OLD ITALIC LETTER UU -10330..10349 ; ID_Start # Lo [26] GOTHIC LETTER AHSA..GOTHIC LETTER OTHAL -1034A ; ID_Start # Nl GOTHIC LETTER NINE HUNDRED -10380..1039D ; ID_Start # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU -10400..1044F ; ID_Start # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW -10450..1049D ; ID_Start # Lo [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO -10800..10805 ; ID_Start # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA -10808 ; ID_Start # Lo CYPRIOT SYLLABLE JO -1080A..10835 ; ID_Start # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO -10837..10838 ; ID_Start # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE -1083C ; ID_Start # Lo CYPRIOT SYLLABLE ZA -1083F ; ID_Start # Lo CYPRIOT SYLLABLE ZO -1D400..1D454 ; ID_Start # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G -1D456..1D49C ; ID_Start # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A -1D49E..1D49F ; ID_Start # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D -1D4A2 ; ID_Start # L& MATHEMATICAL SCRIPT CAPITAL G -1D4A5..1D4A6 ; ID_Start # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K -1D4A9..1D4AC ; ID_Start # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q -1D4AE..1D4B9 ; ID_Start # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D -1D4BB ; ID_Start # L& MATHEMATICAL SCRIPT SMALL F -1D4BD..1D4C3 ; ID_Start # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N -1D4C5..1D505 ; ID_Start # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B -1D507..1D50A ; ID_Start # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G -1D50D..1D514 ; ID_Start # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q -1D516..1D51C ; ID_Start # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y -1D51E..1D539 ; ID_Start # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B -1D53B..1D53E ; ID_Start # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G -1D540..1D544 ; ID_Start # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M -1D546 ; ID_Start # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O -1D54A..1D550 ; ID_Start # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y -1D552..1D6A3 ; ID_Start # L& [338] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL MONOSPACE SMALL Z -1D6A8..1D6C0 ; ID_Start # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA -1D6C2..1D6DA ; ID_Start # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA -1D6DC..1D6FA ; ID_Start # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA -1D6FC..1D714 ; ID_Start # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA -1D716..1D734 ; ID_Start # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA -1D736..1D74E ; ID_Start # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA -1D750..1D76E ; ID_Start # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA -1D770..1D788 ; ID_Start # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA -1D78A..1D7A8 ; ID_Start # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA -1D7AA..1D7C2 ; ID_Start # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA -1D7C4..1D7C9 ; ID_Start # L& [6] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL -20000..2A6D6 ; ID_Start # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 -2F800..2FA1D ; ID_Start # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D +0041..005A ; ID_Start +0061..007A ; ID_Start +00AA ; ID_Start +00B5 ; ID_Start +00BA ; ID_Start +00C0..00D6 ; ID_Start +00D8..00F6 ; ID_Start +00F8..01BA ; ID_Start +01BB ; ID_Start +01BC..01BF ; ID_Start +01C0..01C3 ; ID_Start +01C4..0236 ; ID_Start +0250..02AF ; ID_Start +02B0..02C1 ; ID_Start +02C6..02D1 ; ID_Start +02E0..02E4 ; ID_Start +02EE ; ID_Start +037A ; ID_Start +0386 ; ID_Start +0388..038A ; ID_Start +038C ; ID_Start +038E..03A1 ; ID_Start +03A3..03CE ; ID_Start +03D0..03F5 ; ID_Start +03F7..03FB ; ID_Start +0400..0481 ; ID_Start +048A..04CE ; ID_Start +04D0..04F5 ; ID_Start +04F8..04F9 ; ID_Start +0500..050F ; ID_Start +0531..0556 ; ID_Start +0559 ; ID_Start +0561..0587 ; ID_Start +05D0..05EA ; ID_Start +05F0..05F2 ; ID_Start +0621..063A ; ID_Start +0640 ; ID_Start +0641..064A ; ID_Start +066E..066F ; ID_Start +0671..06D3 ; ID_Start +06D5 ; ID_Start +06E5..06E6 ; ID_Start +06EE..06EF ; ID_Start +06FA..06FC ; ID_Start +06FF ; ID_Start +0710 ; ID_Start +0712..072F ; ID_Start +074D..074F ; ID_Start +0780..07A5 ; ID_Start +07B1 ; ID_Start +0904..0939 ; ID_Start +093D ; ID_Start +0950 ; ID_Start +0958..0961 ; ID_Start +0985..098C ; ID_Start +098F..0990 ; ID_Start +0993..09A8 ; ID_Start +09AA..09B0 ; ID_Start +09B2 ; ID_Start +09B6..09B9 ; ID_Start +09BD ; ID_Start +09DC..09DD ; ID_Start +09DF..09E1 ; ID_Start +09F0..09F1 ; ID_Start +0A05..0A0A ; ID_Start +0A0F..0A10 ; ID_Start +0A13..0A28 ; ID_Start +0A2A..0A30 ; ID_Start +0A32..0A33 ; ID_Start +0A35..0A36 ; ID_Start +0A38..0A39 ; ID_Start +0A59..0A5C ; ID_Start +0A5E ; ID_Start +0A72..0A74 ; ID_Start +0A85..0A8D ; ID_Start +0A8F..0A91 ; ID_Start +0A93..0AA8 ; ID_Start +0AAA..0AB0 ; ID_Start +0AB2..0AB3 ; ID_Start +0AB5..0AB9 ; ID_Start +0ABD ; ID_Start +0AD0 ; ID_Start +0AE0..0AE1 ; ID_Start +0B05..0B0C ; ID_Start +0B0F..0B10 ; ID_Start +0B13..0B28 ; ID_Start +0B2A..0B30 ; ID_Start +0B32..0B33 ; ID_Start +0B35..0B39 ; ID_Start +0B3D ; ID_Start +0B5C..0B5D ; ID_Start +0B5F..0B61 ; ID_Start +0B71 ; ID_Start +0B83 ; ID_Start +0B85..0B8A ; ID_Start +0B8E..0B90 ; ID_Start +0B92..0B95 ; ID_Start +0B99..0B9A ; ID_Start +0B9C ; ID_Start +0B9E..0B9F ; ID_Start +0BA3..0BA4 ; ID_Start +0BA8..0BAA ; ID_Start +0BAE..0BB5 ; ID_Start +0BB7..0BB9 ; ID_Start +0C05..0C0C ; ID_Start +0C0E..0C10 ; ID_Start +0C12..0C28 ; ID_Start +0C2A..0C33 ; ID_Start +0C35..0C39 ; ID_Start +0C60..0C61 ; ID_Start +0C85..0C8C ; ID_Start +0C8E..0C90 ; ID_Start +0C92..0CA8 ; ID_Start +0CAA..0CB3 ; ID_Start +0CB5..0CB9 ; ID_Start +0CBD ; ID_Start +0CDE ; ID_Start +0CE0..0CE1 ; ID_Start +0D05..0D0C ; ID_Start +0D0E..0D10 ; ID_Start +0D12..0D28 ; ID_Start +0D2A..0D39 ; ID_Start +0D60..0D61 ; ID_Start +0D85..0D96 ; ID_Start +0D9A..0DB1 ; ID_Start +0DB3..0DBB ; ID_Start +0DBD ; ID_Start +0DC0..0DC6 ; ID_Start +0E01..0E30 ; ID_Start +0E32..0E33 ; ID_Start +0E40..0E45 ; ID_Start +0E46 ; ID_Start +0E81..0E82 ; ID_Start +0E84 ; ID_Start +0E87..0E88 ; ID_Start +0E8A ; ID_Start +0E8D ; ID_Start +0E94..0E97 ; ID_Start +0E99..0E9F ; ID_Start +0EA1..0EA3 ; ID_Start +0EA5 ; ID_Start +0EA7 ; ID_Start +0EAA..0EAB ; ID_Start +0EAD..0EB0 ; ID_Start +0EB2..0EB3 ; ID_Start +0EBD ; ID_Start +0EC0..0EC4 ; ID_Start +0EC6 ; ID_Start +0EDC..0EDD ; ID_Start +0F00 ; ID_Start +0F40..0F47 ; ID_Start +0F49..0F6A ; ID_Start +0F88..0F8B ; ID_Start +1000..1021 ; ID_Start +1023..1027 ; ID_Start +1029..102A ; ID_Start +1050..1055 ; ID_Start +10A0..10C5 ; ID_Start +10D0..10F8 ; ID_Start +1100..1159 ; ID_Start +115F..11A2 ; ID_Start +11A8..11F9 ; ID_Start +1200..1206 ; ID_Start +1208..1246 ; ID_Start +1248 ; ID_Start +124A..124D ; ID_Start +1250..1256 ; ID_Start +1258 ; ID_Start +125A..125D ; ID_Start +1260..1286 ; ID_Start +1288 ; ID_Start +128A..128D ; ID_Start +1290..12AE ; ID_Start +12B0 ; ID_Start +12B2..12B5 ; ID_Start +12B8..12BE ; ID_Start +12C0 ; ID_Start +12C2..12C5 ; ID_Start +12C8..12CE ; ID_Start +12D0..12D6 ; ID_Start +12D8..12EE ; ID_Start +12F0..130E ; ID_Start +1310 ; ID_Start +1312..1315 ; ID_Start +1318..131E ; ID_Start +1320..1346 ; ID_Start +1348..135A ; ID_Start +13A0..13F4 ; ID_Start +1401..166C ; ID_Start +166F..1676 ; ID_Start +1681..169A ; ID_Start +16A0..16EA ; ID_Start +16EE..16F0 ; ID_Start +1700..170C ; ID_Start +170E..1711 ; ID_Start +1720..1731 ; ID_Start +1740..1751 ; ID_Start +1760..176C ; ID_Start +176E..1770 ; ID_Start +1780..17B3 ; ID_Start +17D7 ; ID_Start +17DC ; ID_Start +1820..1842 ; ID_Start +1843 ; ID_Start +1844..1877 ; ID_Start +1880..18A8 ; ID_Start +1900..191C ; ID_Start +1950..196D ; ID_Start +1970..1974 ; ID_Start +1D00..1D2B ; ID_Start +1D2C..1D61 ; ID_Start +1D62..1D6B ; ID_Start +1E00..1E9B ; ID_Start +1EA0..1EF9 ; ID_Start +1F00..1F15 ; ID_Start +1F18..1F1D ; ID_Start +1F20..1F45 ; ID_Start +1F48..1F4D ; ID_Start +1F50..1F57 ; ID_Start +1F59 ; ID_Start +1F5B ; ID_Start +1F5D ; ID_Start +1F5F..1F7D ; ID_Start +1F80..1FB4 ; ID_Start +1FB6..1FBC ; ID_Start +1FBE ; ID_Start +1FC2..1FC4 ; ID_Start +1FC6..1FCC ; ID_Start +1FD0..1FD3 ; ID_Start +1FD6..1FDB ; ID_Start +1FE0..1FEC ; ID_Start +1FF2..1FF4 ; ID_Start +1FF6..1FFC ; ID_Start +2071 ; ID_Start +207F ; ID_Start +2102 ; ID_Start +2107 ; ID_Start +210A..2113 ; ID_Start +2115 ; ID_Start +2118 ; ID_Start +2119..211D ; ID_Start +2124 ; ID_Start +2126 ; ID_Start +2128 ; ID_Start +212A..212D ; ID_Start +212E ; ID_Start +212F..2131 ; ID_Start +2133..2134 ; ID_Start +2135..2138 ; ID_Start +2139 ; ID_Start +213D..213F ; ID_Start +2145..2149 ; ID_Start +2160..2183 ; ID_Start +3005 ; ID_Start +3006 ; ID_Start +3007 ; ID_Start +3021..3029 ; ID_Start +3031..3035 ; ID_Start +3038..303A ; ID_Start +303B ; ID_Start +303C ; ID_Start +3041..3096 ; ID_Start +309B..309C ; ID_Start +309D..309E ; ID_Start +309F ; ID_Start +30A1..30FA ; ID_Start +30FC..30FE ; ID_Start +30FF ; ID_Start +3105..312C ; ID_Start +3131..318E ; ID_Start +31A0..31B7 ; ID_Start +31F0..31FF ; ID_Start +3400..4DB5 ; ID_Start +4E00..9FA5 ; ID_Start +A000..A48C ; ID_Start +AC00..D7A3 ; ID_Start +F900..FA2D ; ID_Start +FA30..FA6A ; ID_Start +FB00..FB06 ; ID_Start +FB13..FB17 ; ID_Start +FB1D ; ID_Start +FB1F..FB28 ; ID_Start +FB2A..FB36 ; ID_Start +FB38..FB3C ; ID_Start +FB3E ; ID_Start +FB40..FB41 ; ID_Start +FB43..FB44 ; ID_Start +FB46..FBB1 ; ID_Start +FBD3..FD3D ; ID_Start +FD50..FD8F ; ID_Start +FD92..FDC7 ; ID_Start +FDF0..FDFB ; ID_Start +FE70..FE74 ; ID_Start +FE76..FEFC ; ID_Start +FF21..FF3A ; ID_Start +FF41..FF5A ; ID_Start +FF66..FF6F ; ID_Start +FF70 ; ID_Start +FF71..FF9D ; ID_Start +FF9E..FF9F ; ID_Start +FFA0..FFBE ; ID_Start +FFC2..FFC7 ; ID_Start +FFCA..FFCF ; ID_Start +FFD2..FFD7 ; ID_Start +FFDA..FFDC ; ID_Start +10000..1000B ; ID_Start +1000D..10026 ; ID_Start +10028..1003A ; ID_Start +1003C..1003D ; ID_Start +1003F..1004D ; ID_Start +10050..1005D ; ID_Start +10080..100FA ; ID_Start +10300..1031E ; ID_Start +10330..10349 ; ID_Start +1034A ; ID_Start +10380..1039D ; ID_Start +10400..1044F ; ID_Start +10450..1049D ; ID_Start +10800..10805 ; ID_Start +10808 ; ID_Start +1080A..10835 ; ID_Start +10837..10838 ; ID_Start +1083C ; ID_Start +1083F ; ID_Start +1D400..1D454 ; ID_Start +1D456..1D49C ; ID_Start +1D49E..1D49F ; ID_Start +1D4A2 ; ID_Start +1D4A5..1D4A6 ; ID_Start +1D4A9..1D4AC ; ID_Start +1D4AE..1D4B9 ; ID_Start +1D4BB ; ID_Start +1D4BD..1D4C3 ; ID_Start +1D4C5..1D505 ; ID_Start +1D507..1D50A ; ID_Start +1D50D..1D514 ; ID_Start +1D516..1D51C ; ID_Start +1D51E..1D539 ; ID_Start +1D53B..1D53E ; ID_Start +1D540..1D544 ; ID_Start +1D546 ; ID_Start +1D54A..1D550 ; ID_Start +1D552..1D6A3 ; ID_Start +1D6A8..1D6C0 ; ID_Start +1D6C2..1D6DA ; ID_Start +1D6DC..1D6FA ; ID_Start +1D6FC..1D714 ; ID_Start +1D716..1D734 ; ID_Start +1D736..1D74E ; ID_Start +1D750..1D76E ; ID_Start +1D770..1D788 ; ID_Start +1D78A..1D7A8 ; ID_Start +1D7AA..1D7C2 ; ID_Start +1D7C4..1D7C9 ; ID_Start +20000..2A6D6 ; ID_Start +2F800..2FA1D ; ID_Start # Total code points: 90604 @@ -1889,563 +1905,563 @@ FFDA..FFDC ; ID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL # Generated from: ID_Start + Mn+Mc+Nd+Pc # NOTE: Cf characters should be filtered out. -0030..0039 ; ID_Continue # Nd [10] DIGIT ZERO..DIGIT NINE -0041..005A ; ID_Continue # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z -005F ; ID_Continue # Pc LOW LINE -0061..007A ; ID_Continue # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z -00AA ; ID_Continue # L& FEMININE ORDINAL INDICATOR -00B5 ; ID_Continue # L& MICRO SIGN -00BA ; ID_Continue # L& MASCULINE ORDINAL INDICATOR -00C0..00D6 ; ID_Continue # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS -00D8..00F6 ; ID_Continue # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS -00F8..01BA ; ID_Continue # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL -01BB ; ID_Continue # Lo LATIN LETTER TWO WITH STROKE -01BC..01BF ; ID_Continue # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN -01C0..01C3 ; ID_Continue # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK -01C4..0236 ; ID_Continue # L& [115] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER T WITH CURL -0250..02AF ; ID_Continue # L& [96] LATIN SMALL LETTER TURNED A..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL -02B0..02C1 ; ID_Continue # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP -02C6..02D1 ; ID_Continue # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON -02E0..02E4 ; ID_Continue # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP -02EE ; ID_Continue # Lm MODIFIER LETTER DOUBLE APOSTROPHE -0300..0357 ; ID_Continue # Mn [88] COMBINING GRAVE ACCENT..COMBINING RIGHT HALF RING ABOVE -035D..036F ; ID_Continue # Mn [19] COMBINING DOUBLE BREVE..COMBINING LATIN SMALL LETTER X -037A ; ID_Continue # Lm GREEK YPOGEGRAMMENI -0386 ; ID_Continue # L& GREEK CAPITAL LETTER ALPHA WITH TONOS -0388..038A ; ID_Continue # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS -038C ; ID_Continue # L& GREEK CAPITAL LETTER OMICRON WITH TONOS -038E..03A1 ; ID_Continue # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO -03A3..03CE ; ID_Continue # L& [44] GREEK CAPITAL LETTER SIGMA..GREEK SMALL LETTER OMEGA WITH TONOS -03D0..03F5 ; ID_Continue # L& [38] GREEK BETA SYMBOL..GREEK LUNATE EPSILON SYMBOL -03F7..03FB ; ID_Continue # L& [5] GREEK CAPITAL LETTER SHO..GREEK SMALL LETTER SAN -0400..0481 ; ID_Continue # L& [130] CYRILLIC CAPITAL LETTER IE WITH GRAVE..CYRILLIC SMALL LETTER KOPPA -0483..0486 ; ID_Continue # Mn [4] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC PSILI PNEUMATA -048A..04CE ; ID_Continue # L& [69] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EM WITH TAIL -04D0..04F5 ; ID_Continue # L& [38] CYRILLIC CAPITAL LETTER A WITH BREVE..CYRILLIC SMALL LETTER CHE WITH DIAERESIS -04F8..04F9 ; ID_Continue # L& [2] CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS..CYRILLIC SMALL LETTER YERU WITH DIAERESIS -0500..050F ; ID_Continue # L& [16] CYRILLIC CAPITAL LETTER KOMI DE..CYRILLIC SMALL LETTER KOMI TJE -0531..0556 ; ID_Continue # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH -0559 ; ID_Continue # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING -0561..0587 ; ID_Continue # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN -0591..05A1 ; ID_Continue # Mn [17] HEBREW ACCENT ETNAHTA..HEBREW ACCENT PAZER -05A3..05B9 ; ID_Continue # Mn [23] HEBREW ACCENT MUNAH..HEBREW POINT HOLAM -05BB..05BD ; ID_Continue # Mn [3] HEBREW POINT QUBUTS..HEBREW POINT METEG -05BF ; ID_Continue # Mn HEBREW POINT RAFE -05C1..05C2 ; ID_Continue # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT -05C4 ; ID_Continue # Mn HEBREW MARK UPPER DOT -05D0..05EA ; ID_Continue # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV -05F0..05F2 ; ID_Continue # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD -0610..0615 ; ID_Continue # Mn [6] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL HIGH TAH -0621..063A ; ID_Continue # Lo [26] ARABIC LETTER HAMZA..ARABIC LETTER GHAIN -0640 ; ID_Continue # Lm ARABIC TATWEEL -0641..064A ; ID_Continue # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH -064B..0658 ; ID_Continue # Mn [14] ARABIC FATHATAN..ARABIC MARK NOON GHUNNA -0660..0669 ; ID_Continue # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE -066E..066F ; ID_Continue # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF -0670 ; ID_Continue # Mn ARABIC LETTER SUPERSCRIPT ALEF -0671..06D3 ; ID_Continue # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE -06D5 ; ID_Continue # Lo ARABIC LETTER AE -06D6..06DC ; ID_Continue # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN -06DF..06E4 ; ID_Continue # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA -06E5..06E6 ; ID_Continue # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH -06E7..06E8 ; ID_Continue # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON -06EA..06ED ; ID_Continue # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM -06EE..06EF ; ID_Continue # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V -06F0..06F9 ; ID_Continue # Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE -06FA..06FC ; ID_Continue # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW -06FF ; ID_Continue # Lo ARABIC LETTER HEH WITH INVERTED V -0710 ; ID_Continue # Lo SYRIAC LETTER ALAPH -0711 ; ID_Continue # Mn SYRIAC LETTER SUPERSCRIPT ALAPH -0712..072F ; ID_Continue # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH -0730..074A ; ID_Continue # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH -074D..074F ; ID_Continue # Lo [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE -0780..07A5 ; ID_Continue # Lo [38] THAANA LETTER HAA..THAANA LETTER WAAVU -07A6..07B0 ; ID_Continue # Mn [11] THAANA ABAFILI..THAANA SUKUN -07B1 ; ID_Continue # Lo THAANA LETTER NAA -0901..0902 ; ID_Continue # Mn [2] DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN ANUSVARA -0903 ; ID_Continue # Mc DEVANAGARI SIGN VISARGA -0904..0939 ; ID_Continue # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA -093C ; ID_Continue # Mn DEVANAGARI SIGN NUKTA -093D ; ID_Continue # Lo DEVANAGARI SIGN AVAGRAHA -093E..0940 ; ID_Continue # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II -0941..0948 ; ID_Continue # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI -0949..094C ; ID_Continue # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU -094D ; ID_Continue # Mn DEVANAGARI SIGN VIRAMA -0950 ; ID_Continue # Lo DEVANAGARI OM -0951..0954 ; ID_Continue # Mn [4] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI ACUTE ACCENT -0958..0961 ; ID_Continue # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL -0962..0963 ; ID_Continue # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL -0966..096F ; ID_Continue # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE -0981 ; ID_Continue # Mn BENGALI SIGN CANDRABINDU -0982..0983 ; ID_Continue # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA -0985..098C ; ID_Continue # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L -098F..0990 ; ID_Continue # Lo [2] BENGALI LETTER E..BENGALI LETTER AI -0993..09A8 ; ID_Continue # Lo [22] BENGALI LETTER O..BENGALI LETTER NA -09AA..09B0 ; ID_Continue # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA -09B2 ; ID_Continue # Lo BENGALI LETTER LA -09B6..09B9 ; ID_Continue # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA -09BC ; ID_Continue # Mn BENGALI SIGN NUKTA -09BD ; ID_Continue # Lo BENGALI SIGN AVAGRAHA -09BE..09C0 ; ID_Continue # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II -09C1..09C4 ; ID_Continue # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR -09C7..09C8 ; ID_Continue # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI -09CB..09CC ; ID_Continue # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU -09CD ; ID_Continue # Mn BENGALI SIGN VIRAMA -09D7 ; ID_Continue # Mc BENGALI AU LENGTH MARK -09DC..09DD ; ID_Continue # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA -09DF..09E1 ; ID_Continue # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL -09E2..09E3 ; ID_Continue # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL -09E6..09EF ; ID_Continue # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE -09F0..09F1 ; ID_Continue # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL -0A01..0A02 ; ID_Continue # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI -0A03 ; ID_Continue # Mc GURMUKHI SIGN VISARGA -0A05..0A0A ; ID_Continue # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU -0A0F..0A10 ; ID_Continue # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI -0A13..0A28 ; ID_Continue # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA -0A2A..0A30 ; ID_Continue # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA -0A32..0A33 ; ID_Continue # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA -0A35..0A36 ; ID_Continue # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA -0A38..0A39 ; ID_Continue # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA -0A3C ; ID_Continue # Mn GURMUKHI SIGN NUKTA -0A3E..0A40 ; ID_Continue # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II -0A41..0A42 ; ID_Continue # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU -0A47..0A48 ; ID_Continue # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI -0A4B..0A4D ; ID_Continue # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA -0A59..0A5C ; ID_Continue # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA -0A5E ; ID_Continue # Lo GURMUKHI LETTER FA -0A66..0A6F ; ID_Continue # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE -0A70..0A71 ; ID_Continue # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK -0A72..0A74 ; ID_Continue # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR -0A81..0A82 ; ID_Continue # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA -0A83 ; ID_Continue # Mc GUJARATI SIGN VISARGA -0A85..0A8D ; ID_Continue # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E -0A8F..0A91 ; ID_Continue # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O -0A93..0AA8 ; ID_Continue # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA -0AAA..0AB0 ; ID_Continue # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA -0AB2..0AB3 ; ID_Continue # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA -0AB5..0AB9 ; ID_Continue # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA -0ABC ; ID_Continue # Mn GUJARATI SIGN NUKTA -0ABD ; ID_Continue # Lo GUJARATI SIGN AVAGRAHA -0ABE..0AC0 ; ID_Continue # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II -0AC1..0AC5 ; ID_Continue # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E -0AC7..0AC8 ; ID_Continue # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI -0AC9 ; ID_Continue # Mc GUJARATI VOWEL SIGN CANDRA O -0ACB..0ACC ; ID_Continue # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU -0ACD ; ID_Continue # Mn GUJARATI SIGN VIRAMA -0AD0 ; ID_Continue # Lo GUJARATI OM -0AE0..0AE1 ; ID_Continue # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL -0AE2..0AE3 ; ID_Continue # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL -0AE6..0AEF ; ID_Continue # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE -0B01 ; ID_Continue # Mn ORIYA SIGN CANDRABINDU -0B02..0B03 ; ID_Continue # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA -0B05..0B0C ; ID_Continue # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L -0B0F..0B10 ; ID_Continue # Lo [2] ORIYA LETTER E..ORIYA LETTER AI -0B13..0B28 ; ID_Continue # Lo [22] ORIYA LETTER O..ORIYA LETTER NA -0B2A..0B30 ; ID_Continue # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA -0B32..0B33 ; ID_Continue # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA -0B35..0B39 ; ID_Continue # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA -0B3C ; ID_Continue # Mn ORIYA SIGN NUKTA -0B3D ; ID_Continue # Lo ORIYA SIGN AVAGRAHA -0B3E ; ID_Continue # Mc ORIYA VOWEL SIGN AA -0B3F ; ID_Continue # Mn ORIYA VOWEL SIGN I -0B40 ; ID_Continue # Mc ORIYA VOWEL SIGN II -0B41..0B43 ; ID_Continue # Mn [3] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC R -0B47..0B48 ; ID_Continue # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI -0B4B..0B4C ; ID_Continue # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU -0B4D ; ID_Continue # Mn ORIYA SIGN VIRAMA -0B56 ; ID_Continue # Mn ORIYA AI LENGTH MARK -0B57 ; ID_Continue # Mc ORIYA AU LENGTH MARK -0B5C..0B5D ; ID_Continue # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA -0B5F..0B61 ; ID_Continue # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL -0B66..0B6F ; ID_Continue # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE -0B71 ; ID_Continue # Lo ORIYA LETTER WA -0B82 ; ID_Continue # Mn TAMIL SIGN ANUSVARA -0B83 ; ID_Continue # Lo TAMIL SIGN VISARGA -0B85..0B8A ; ID_Continue # Lo [6] TAMIL LETTER A..TAMIL LETTER UU -0B8E..0B90 ; ID_Continue # Lo [3] TAMIL LETTER E..TAMIL LETTER AI -0B92..0B95 ; ID_Continue # Lo [4] TAMIL LETTER O..TAMIL LETTER KA -0B99..0B9A ; ID_Continue # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA -0B9C ; ID_Continue # Lo TAMIL LETTER JA -0B9E..0B9F ; ID_Continue # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA -0BA3..0BA4 ; ID_Continue # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA -0BA8..0BAA ; ID_Continue # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA -0BAE..0BB5 ; ID_Continue # Lo [8] TAMIL LETTER MA..TAMIL LETTER VA -0BB7..0BB9 ; ID_Continue # Lo [3] TAMIL LETTER SSA..TAMIL LETTER HA -0BBE..0BBF ; ID_Continue # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I -0BC0 ; ID_Continue # Mn TAMIL VOWEL SIGN II -0BC1..0BC2 ; ID_Continue # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU -0BC6..0BC8 ; ID_Continue # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI -0BCA..0BCC ; ID_Continue # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU -0BCD ; ID_Continue # Mn TAMIL SIGN VIRAMA -0BD7 ; ID_Continue # Mc TAMIL AU LENGTH MARK -0BE7..0BEF ; ID_Continue # Nd [9] TAMIL DIGIT ONE..TAMIL DIGIT NINE -0C01..0C03 ; ID_Continue # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA -0C05..0C0C ; ID_Continue # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L -0C0E..0C10 ; ID_Continue # Lo [3] TELUGU LETTER E..TELUGU LETTER AI -0C12..0C28 ; ID_Continue # Lo [23] TELUGU LETTER O..TELUGU LETTER NA -0C2A..0C33 ; ID_Continue # Lo [10] TELUGU LETTER PA..TELUGU LETTER LLA -0C35..0C39 ; ID_Continue # Lo [5] TELUGU LETTER VA..TELUGU LETTER HA -0C3E..0C40 ; ID_Continue # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II -0C41..0C44 ; ID_Continue # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR -0C46..0C48 ; ID_Continue # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI -0C4A..0C4D ; ID_Continue # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA -0C55..0C56 ; ID_Continue # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK -0C60..0C61 ; ID_Continue # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL -0C66..0C6F ; ID_Continue # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE -0C82..0C83 ; ID_Continue # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA -0C85..0C8C ; ID_Continue # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L -0C8E..0C90 ; ID_Continue # Lo [3] KANNADA LETTER E..KANNADA LETTER AI -0C92..0CA8 ; ID_Continue # Lo [23] KANNADA LETTER O..KANNADA LETTER NA -0CAA..0CB3 ; ID_Continue # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA -0CB5..0CB9 ; ID_Continue # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA -0CBC ; ID_Continue # Mn KANNADA SIGN NUKTA -0CBD ; ID_Continue # Lo KANNADA SIGN AVAGRAHA -0CBE ; ID_Continue # Mc KANNADA VOWEL SIGN AA -0CBF ; ID_Continue # Mn KANNADA VOWEL SIGN I -0CC0..0CC4 ; ID_Continue # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR -0CC6 ; ID_Continue # Mn KANNADA VOWEL SIGN E -0CC7..0CC8 ; ID_Continue # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI -0CCA..0CCB ; ID_Continue # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO -0CCC..0CCD ; ID_Continue # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA -0CD5..0CD6 ; ID_Continue # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK -0CDE ; ID_Continue # Lo KANNADA LETTER FA -0CE0..0CE1 ; ID_Continue # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL -0CE6..0CEF ; ID_Continue # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE -0D02..0D03 ; ID_Continue # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA -0D05..0D0C ; ID_Continue # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L -0D0E..0D10 ; ID_Continue # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI -0D12..0D28 ; ID_Continue # Lo [23] MALAYALAM LETTER O..MALAYALAM LETTER NA -0D2A..0D39 ; ID_Continue # Lo [16] MALAYALAM LETTER PA..MALAYALAM LETTER HA -0D3E..0D40 ; ID_Continue # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II -0D41..0D43 ; ID_Continue # Mn [3] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC R -0D46..0D48 ; ID_Continue # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI -0D4A..0D4C ; ID_Continue # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU -0D4D ; ID_Continue # Mn MALAYALAM SIGN VIRAMA -0D57 ; ID_Continue # Mc MALAYALAM AU LENGTH MARK -0D60..0D61 ; ID_Continue # Lo [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL -0D66..0D6F ; ID_Continue # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE -0D82..0D83 ; ID_Continue # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA -0D85..0D96 ; ID_Continue # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA -0D9A..0DB1 ; ID_Continue # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA -0DB3..0DBB ; ID_Continue # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA -0DBD ; ID_Continue # Lo SINHALA LETTER DANTAJA LAYANNA -0DC0..0DC6 ; ID_Continue # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA -0DCA ; ID_Continue # Mn SINHALA SIGN AL-LAKUNA -0DCF..0DD1 ; ID_Continue # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA -0DD2..0DD4 ; ID_Continue # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA -0DD6 ; ID_Continue # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA -0DD8..0DDF ; ID_Continue # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA -0DF2..0DF3 ; ID_Continue # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA -0E01..0E30 ; ID_Continue # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A -0E31 ; ID_Continue # Mn THAI CHARACTER MAI HAN-AKAT -0E32..0E33 ; ID_Continue # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM -0E34..0E3A ; ID_Continue # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU -0E40..0E45 ; ID_Continue # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO -0E46 ; ID_Continue # Lm THAI CHARACTER MAIYAMOK -0E47..0E4E ; ID_Continue # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN -0E50..0E59 ; ID_Continue # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE -0E81..0E82 ; ID_Continue # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG -0E84 ; ID_Continue # Lo LAO LETTER KHO TAM -0E87..0E88 ; ID_Continue # Lo [2] LAO LETTER NGO..LAO LETTER CO -0E8A ; ID_Continue # Lo LAO LETTER SO TAM -0E8D ; ID_Continue # Lo LAO LETTER NYO -0E94..0E97 ; ID_Continue # Lo [4] LAO LETTER DO..LAO LETTER THO TAM -0E99..0E9F ; ID_Continue # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG -0EA1..0EA3 ; ID_Continue # Lo [3] LAO LETTER MO..LAO LETTER LO LING -0EA5 ; ID_Continue # Lo LAO LETTER LO LOOT -0EA7 ; ID_Continue # Lo LAO LETTER WO -0EAA..0EAB ; ID_Continue # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG -0EAD..0EB0 ; ID_Continue # Lo [4] LAO LETTER O..LAO VOWEL SIGN A -0EB1 ; ID_Continue # Mn LAO VOWEL SIGN MAI KAN -0EB2..0EB3 ; ID_Continue # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM -0EB4..0EB9 ; ID_Continue # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU -0EBB..0EBC ; ID_Continue # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO -0EBD ; ID_Continue # Lo LAO SEMIVOWEL SIGN NYO -0EC0..0EC4 ; ID_Continue # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI -0EC6 ; ID_Continue # Lm LAO KO LA -0EC8..0ECD ; ID_Continue # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA -0ED0..0ED9 ; ID_Continue # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE -0EDC..0EDD ; ID_Continue # Lo [2] LAO HO NO..LAO HO MO -0F00 ; ID_Continue # Lo TIBETAN SYLLABLE OM -0F18..0F19 ; ID_Continue # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS -0F20..0F29 ; ID_Continue # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE -0F35 ; ID_Continue # Mn TIBETAN MARK NGAS BZUNG NYI ZLA -0F37 ; ID_Continue # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS -0F39 ; ID_Continue # Mn TIBETAN MARK TSA -PHRU -0F3E..0F3F ; ID_Continue # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES -0F40..0F47 ; ID_Continue # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA -0F49..0F6A ; ID_Continue # Lo [34] TIBETAN LETTER NYA..TIBETAN LETTER FIXED-FORM RA -0F71..0F7E ; ID_Continue # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO -0F7F ; ID_Continue # Mc TIBETAN SIGN RNAM BCAD -0F80..0F84 ; ID_Continue # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA -0F86..0F87 ; ID_Continue # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS -0F88..0F8B ; ID_Continue # Lo [4] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN GRU MED RGYINGS -0F90..0F97 ; ID_Continue # Mn [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA -0F99..0FBC ; ID_Continue # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA -0FC6 ; ID_Continue # Mn TIBETAN SYMBOL PADMA GDAN -1000..1021 ; ID_Continue # Lo [34] MYANMAR LETTER KA..MYANMAR LETTER A -1023..1027 ; ID_Continue # Lo [5] MYANMAR LETTER I..MYANMAR LETTER E -1029..102A ; ID_Continue # Lo [2] MYANMAR LETTER O..MYANMAR LETTER AU -102C ; ID_Continue # Mc MYANMAR VOWEL SIGN AA -102D..1030 ; ID_Continue # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU -1031 ; ID_Continue # Mc MYANMAR VOWEL SIGN E -1032 ; ID_Continue # Mn MYANMAR VOWEL SIGN AI -1036..1037 ; ID_Continue # Mn [2] MYANMAR SIGN ANUSVARA..MYANMAR SIGN DOT BELOW -1038 ; ID_Continue # Mc MYANMAR SIGN VISARGA -1039 ; ID_Continue # Mn MYANMAR SIGN VIRAMA -1040..1049 ; ID_Continue # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE -1050..1055 ; ID_Continue # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL -1056..1057 ; ID_Continue # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR -1058..1059 ; ID_Continue # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL -10A0..10C5 ; ID_Continue # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE -10D0..10F8 ; ID_Continue # Lo [41] GEORGIAN LETTER AN..GEORGIAN LETTER ELIFI -1100..1159 ; ID_Continue # Lo [90] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH -115F..11A2 ; ID_Continue # Lo [68] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG SSANGARAEA -11A8..11F9 ; ID_Continue # Lo [82] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH -1200..1206 ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE HO -1208..1246 ; ID_Continue # Lo [63] ETHIOPIC SYLLABLE LA..ETHIOPIC SYLLABLE QO -1248 ; ID_Continue # Lo ETHIOPIC SYLLABLE QWA -124A..124D ; ID_Continue # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE -1250..1256 ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO -1258 ; ID_Continue # Lo ETHIOPIC SYLLABLE QHWA -125A..125D ; ID_Continue # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE -1260..1286 ; ID_Continue # Lo [39] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XO -1288 ; ID_Continue # Lo ETHIOPIC SYLLABLE XWA -128A..128D ; ID_Continue # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE -1290..12AE ; ID_Continue # Lo [31] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KO -12B0 ; ID_Continue # Lo ETHIOPIC SYLLABLE KWA -12B2..12B5 ; ID_Continue # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE -12B8..12BE ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO -12C0 ; ID_Continue # Lo ETHIOPIC SYLLABLE KXWA -12C2..12C5 ; ID_Continue # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE -12C8..12CE ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE WO -12D0..12D6 ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE PHARYNGEAL A..ETHIOPIC SYLLABLE PHARYNGEAL O -12D8..12EE ; ID_Continue # Lo [23] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE YO -12F0..130E ; ID_Continue # Lo [31] ETHIOPIC SYLLABLE DA..ETHIOPIC SYLLABLE GO -1310 ; ID_Continue # Lo ETHIOPIC SYLLABLE GWA -1312..1315 ; ID_Continue # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE -1318..131E ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE GGO -1320..1346 ; ID_Continue # Lo [39] ETHIOPIC SYLLABLE THA..ETHIOPIC SYLLABLE TZO -1348..135A ; ID_Continue # Lo [19] ETHIOPIC SYLLABLE FA..ETHIOPIC SYLLABLE FYA -1369..1371 ; ID_Continue # Nd [9] ETHIOPIC DIGIT ONE..ETHIOPIC DIGIT NINE -13A0..13F4 ; ID_Continue # Lo [85] CHEROKEE LETTER A..CHEROKEE LETTER YV -1401..166C ; ID_Continue # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA -166F..1676 ; ID_Continue # Lo [8] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS NNGAA -1681..169A ; ID_Continue # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH -16A0..16EA ; ID_Continue # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X -16EE..16F0 ; ID_Continue # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL -1700..170C ; ID_Continue # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA -170E..1711 ; ID_Continue # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA -1712..1714 ; ID_Continue # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA -1720..1731 ; ID_Continue # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA -1732..1734 ; ID_Continue # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD -1740..1751 ; ID_Continue # Lo [18] BUHID LETTER A..BUHID LETTER HA -1752..1753 ; ID_Continue # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U -1760..176C ; ID_Continue # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA -176E..1770 ; ID_Continue # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA -1772..1773 ; ID_Continue # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U -1780..17B3 ; ID_Continue # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU -17B6 ; ID_Continue # Mc KHMER VOWEL SIGN AA -17B7..17BD ; ID_Continue # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA -17BE..17C5 ; ID_Continue # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU -17C6 ; ID_Continue # Mn KHMER SIGN NIKAHIT -17C7..17C8 ; ID_Continue # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU -17C9..17D3 ; ID_Continue # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT -17D7 ; ID_Continue # Lm KHMER SIGN LEK TOO -17DC ; ID_Continue # Lo KHMER SIGN AVAKRAHASANYA -17DD ; ID_Continue # Mn KHMER SIGN ATTHACAN -17E0..17E9 ; ID_Continue # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE -180B..180D ; ID_Continue # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE -1810..1819 ; ID_Continue # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE -1820..1842 ; ID_Continue # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI -1843 ; ID_Continue # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN -1844..1877 ; ID_Continue # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA -1880..18A8 ; ID_Continue # Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA -18A9 ; ID_Continue # Mn MONGOLIAN LETTER ALI GALI DAGALGA -1900..191C ; ID_Continue # Lo [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA -1920..1922 ; ID_Continue # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U -1923..1926 ; ID_Continue # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU -1927..1928 ; ID_Continue # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O -1929..192B ; ID_Continue # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA -1930..1931 ; ID_Continue # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA -1932 ; ID_Continue # Mn LIMBU SMALL LETTER ANUSVARA -1933..1938 ; ID_Continue # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA -1939..193B ; ID_Continue # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I -1946..194F ; ID_Continue # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE -1950..196D ; ID_Continue # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI -1970..1974 ; ID_Continue # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 -1D00..1D2B ; ID_Continue # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL -1D2C..1D61 ; ID_Continue # Lm [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI -1D62..1D6B ; ID_Continue # L& [10] LATIN SUBSCRIPT SMALL LETTER I..LATIN SMALL LETTER UE -1E00..1E9B ; ID_Continue # L& [156] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER LONG S WITH DOT ABOVE -1EA0..1EF9 ; ID_Continue # L& [90] LATIN CAPITAL LETTER A WITH DOT BELOW..LATIN SMALL LETTER Y WITH TILDE -1F00..1F15 ; ID_Continue # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA -1F18..1F1D ; ID_Continue # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA -1F20..1F45 ; ID_Continue # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA -1F48..1F4D ; ID_Continue # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA -1F50..1F57 ; ID_Continue # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI -1F59 ; ID_Continue # L& GREEK CAPITAL LETTER UPSILON WITH DASIA -1F5B ; ID_Continue # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA -1F5D ; ID_Continue # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA -1F5F..1F7D ; ID_Continue # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA -1F80..1FB4 ; ID_Continue # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI -1FB6..1FBC ; ID_Continue # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI -1FBE ; ID_Continue # L& GREEK PROSGEGRAMMENI -1FC2..1FC4 ; ID_Continue # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI -1FC6..1FCC ; ID_Continue # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI -1FD0..1FD3 ; ID_Continue # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA -1FD6..1FDB ; ID_Continue # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA -1FE0..1FEC ; ID_Continue # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA -1FF2..1FF4 ; ID_Continue # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI -1FF6..1FFC ; ID_Continue # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI -203F..2040 ; ID_Continue # Pc [2] UNDERTIE..CHARACTER TIE -2054 ; ID_Continue # Pc INVERTED UNDERTIE -2071 ; ID_Continue # L& SUPERSCRIPT LATIN SMALL LETTER I -207F ; ID_Continue # L& SUPERSCRIPT LATIN SMALL LETTER N -20D0..20DC ; ID_Continue # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE -20E1 ; ID_Continue # Mn COMBINING LEFT RIGHT ARROW ABOVE -20E5..20EA ; ID_Continue # Mn [6] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING LEFTWARDS ARROW OVERLAY -2102 ; ID_Continue # L& DOUBLE-STRUCK CAPITAL C -2107 ; ID_Continue # L& EULER CONSTANT -210A..2113 ; ID_Continue # L& [10] SCRIPT SMALL G..SCRIPT SMALL L -2115 ; ID_Continue # L& DOUBLE-STRUCK CAPITAL N -2118 ; ID_Continue # So SCRIPT CAPITAL P -2119..211D ; ID_Continue # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R -2124 ; ID_Continue # L& DOUBLE-STRUCK CAPITAL Z -2126 ; ID_Continue # L& OHM SIGN -2128 ; ID_Continue # L& BLACK-LETTER CAPITAL Z -212A..212D ; ID_Continue # L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C -212E ; ID_Continue # So ESTIMATED SYMBOL -212F..2131 ; ID_Continue # L& [3] SCRIPT SMALL E..SCRIPT CAPITAL F -2133..2134 ; ID_Continue # L& [2] SCRIPT CAPITAL M..SCRIPT SMALL O -2135..2138 ; ID_Continue # Lo [4] ALEF SYMBOL..DALET SYMBOL -2139 ; ID_Continue # L& INFORMATION SOURCE -213D..213F ; ID_Continue # L& [3] DOUBLE-STRUCK SMALL GAMMA..DOUBLE-STRUCK CAPITAL PI -2145..2149 ; ID_Continue # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J -2160..2183 ; ID_Continue # Nl [36] ROMAN NUMERAL ONE..ROMAN NUMERAL REVERSED ONE HUNDRED -3005 ; ID_Continue # Lm IDEOGRAPHIC ITERATION MARK -3006 ; ID_Continue # Lo IDEOGRAPHIC CLOSING MARK -3007 ; ID_Continue # Nl IDEOGRAPHIC NUMBER ZERO -3021..3029 ; ID_Continue # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE -302A..302F ; ID_Continue # Mn [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK -3031..3035 ; ID_Continue # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF -3038..303A ; ID_Continue # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY -303B ; ID_Continue # Lm VERTICAL IDEOGRAPHIC ITERATION MARK -303C ; ID_Continue # Lo MASU MARK -3041..3096 ; ID_Continue # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE -3099..309A ; ID_Continue # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK -309B..309C ; ID_Continue # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK -309D..309E ; ID_Continue # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK -309F ; ID_Continue # Lo HIRAGANA DIGRAPH YORI -30A1..30FA ; ID_Continue # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO -30FB ; ID_Continue # Pc KATAKANA MIDDLE DOT -30FC..30FE ; ID_Continue # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK -30FF ; ID_Continue # Lo KATAKANA DIGRAPH KOTO -3105..312C ; ID_Continue # Lo [40] BOPOMOFO LETTER B..BOPOMOFO LETTER GN -3131..318E ; ID_Continue # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE -31A0..31B7 ; ID_Continue # Lo [24] BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H -31F0..31FF ; ID_Continue # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO -3400..4DB5 ; ID_Continue # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 -4E00..9FA5 ; ID_Continue # Lo [20902] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FA5 -A000..A48C ; ID_Continue # Lo [1165] YI SYLLABLE IT..YI SYLLABLE YYR -AC00..D7A3 ; ID_Continue # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH -F900..FA2D ; ID_Continue # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D -FA30..FA6A ; ID_Continue # Lo [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A -FB00..FB06 ; ID_Continue # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST -FB13..FB17 ; ID_Continue # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH -FB1D ; ID_Continue # Lo HEBREW LETTER YOD WITH HIRIQ -FB1E ; ID_Continue # Mn HEBREW POINT JUDEO-SPANISH VARIKA -FB1F..FB28 ; ID_Continue # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV -FB2A..FB36 ; ID_Continue # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH -FB38..FB3C ; ID_Continue # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH -FB3E ; ID_Continue # Lo HEBREW LETTER MEM WITH DAGESH -FB40..FB41 ; ID_Continue # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH -FB43..FB44 ; ID_Continue # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH -FB46..FBB1 ; ID_Continue # Lo [108] HEBREW LETTER TSADI WITH DAGESH..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM -FBD3..FD3D ; ID_Continue # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM -FD50..FD8F ; ID_Continue # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM -FD92..FDC7 ; ID_Continue # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM -FDF0..FDFB ; ID_Continue # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU -FE00..FE0F ; ID_Continue # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 -FE20..FE23 ; ID_Continue # Mn [4] COMBINING LIGATURE LEFT HALF..COMBINING DOUBLE TILDE RIGHT HALF -FE33..FE34 ; ID_Continue # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE -FE4D..FE4F ; ID_Continue # Pc [3] DASHED LOW LINE..WAVY LOW LINE -FE70..FE74 ; ID_Continue # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM -FE76..FEFC ; ID_Continue # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM -FF10..FF19 ; ID_Continue # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE -FF21..FF3A ; ID_Continue # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z -FF3F ; ID_Continue # Pc FULLWIDTH LOW LINE -FF41..FF5A ; ID_Continue # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z -FF65 ; ID_Continue # Pc HALFWIDTH KATAKANA MIDDLE DOT -FF66..FF6F ; ID_Continue # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU -FF70 ; ID_Continue # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK -FF71..FF9D ; ID_Continue # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N -FF9E..FF9F ; ID_Continue # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK -FFA0..FFBE ; ID_Continue # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH -FFC2..FFC7 ; ID_Continue # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E -FFCA..FFCF ; ID_Continue # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE -FFD2..FFD7 ; ID_Continue # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU -FFDA..FFDC ; ID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I -10000..1000B ; ID_Continue # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE -1000D..10026 ; ID_Continue # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO -10028..1003A ; ID_Continue # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO -1003C..1003D ; ID_Continue # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE -1003F..1004D ; ID_Continue # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO -10050..1005D ; ID_Continue # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 -10080..100FA ; ID_Continue # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 -10300..1031E ; ID_Continue # Lo [31] OLD ITALIC LETTER A..OLD ITALIC LETTER UU -10330..10349 ; ID_Continue # Lo [26] GOTHIC LETTER AHSA..GOTHIC LETTER OTHAL -1034A ; ID_Continue # Nl GOTHIC LETTER NINE HUNDRED -10380..1039D ; ID_Continue # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU -10400..1044F ; ID_Continue # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW -10450..1049D ; ID_Continue # Lo [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO -104A0..104A9 ; ID_Continue # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE -10800..10805 ; ID_Continue # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA -10808 ; ID_Continue # Lo CYPRIOT SYLLABLE JO -1080A..10835 ; ID_Continue # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO -10837..10838 ; ID_Continue # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE -1083C ; ID_Continue # Lo CYPRIOT SYLLABLE ZA -1083F ; ID_Continue # Lo CYPRIOT SYLLABLE ZO -1D165..1D166 ; ID_Continue # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM -1D167..1D169 ; ID_Continue # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 -1D16D..1D172 ; ID_Continue # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 -1D17B..1D182 ; ID_Continue # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE -1D185..1D18B ; ID_Continue # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE -1D1AA..1D1AD ; ID_Continue # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO -1D400..1D454 ; ID_Continue # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G -1D456..1D49C ; ID_Continue # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A -1D49E..1D49F ; ID_Continue # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D -1D4A2 ; ID_Continue # L& MATHEMATICAL SCRIPT CAPITAL G -1D4A5..1D4A6 ; ID_Continue # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K -1D4A9..1D4AC ; ID_Continue # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q -1D4AE..1D4B9 ; ID_Continue # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D -1D4BB ; ID_Continue # L& MATHEMATICAL SCRIPT SMALL F -1D4BD..1D4C3 ; ID_Continue # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N -1D4C5..1D505 ; ID_Continue # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B -1D507..1D50A ; ID_Continue # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G -1D50D..1D514 ; ID_Continue # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q -1D516..1D51C ; ID_Continue # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y -1D51E..1D539 ; ID_Continue # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B -1D53B..1D53E ; ID_Continue # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G -1D540..1D544 ; ID_Continue # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M -1D546 ; ID_Continue # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O -1D54A..1D550 ; ID_Continue # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y -1D552..1D6A3 ; ID_Continue # L& [338] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL MONOSPACE SMALL Z -1D6A8..1D6C0 ; ID_Continue # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA -1D6C2..1D6DA ; ID_Continue # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA -1D6DC..1D6FA ; ID_Continue # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA -1D6FC..1D714 ; ID_Continue # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA -1D716..1D734 ; ID_Continue # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA -1D736..1D74E ; ID_Continue # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA -1D750..1D76E ; ID_Continue # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA -1D770..1D788 ; ID_Continue # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA -1D78A..1D7A8 ; ID_Continue # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA -1D7AA..1D7C2 ; ID_Continue # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA -1D7C4..1D7C9 ; ID_Continue # L& [6] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL -1D7CE..1D7FF ; ID_Continue # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE -20000..2A6D6 ; ID_Continue # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 -2F800..2FA1D ; ID_Continue # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D -E0100..E01EF ; ID_Continue # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 +0030..0039 ; ID_Continue +0041..005A ; ID_Continue +005F ; ID_Continue +0061..007A ; ID_Continue +00AA ; ID_Continue +00B5 ; ID_Continue +00BA ; ID_Continue +00C0..00D6 ; ID_Continue +00D8..00F6 ; ID_Continue +00F8..01BA ; ID_Continue +01BB ; ID_Continue +01BC..01BF ; ID_Continue +01C0..01C3 ; ID_Continue +01C4..0236 ; ID_Continue +0250..02AF ; ID_Continue +02B0..02C1 ; ID_Continue +02C6..02D1 ; ID_Continue +02E0..02E4 ; ID_Continue +02EE ; ID_Continue +0300..0357 ; ID_Continue +035D..036F ; ID_Continue +037A ; ID_Continue +0386 ; ID_Continue +0388..038A ; ID_Continue +038C ; ID_Continue +038E..03A1 ; ID_Continue +03A3..03CE ; ID_Continue +03D0..03F5 ; ID_Continue +03F7..03FB ; ID_Continue +0400..0481 ; ID_Continue +0483..0486 ; ID_Continue +048A..04CE ; ID_Continue +04D0..04F5 ; ID_Continue +04F8..04F9 ; ID_Continue +0500..050F ; ID_Continue +0531..0556 ; ID_Continue +0559 ; ID_Continue +0561..0587 ; ID_Continue +0591..05A1 ; ID_Continue +05A3..05B9 ; ID_Continue +05BB..05BD ; ID_Continue +05BF ; ID_Continue +05C1..05C2 ; ID_Continue +05C4 ; ID_Continue +05D0..05EA ; ID_Continue +05F0..05F2 ; ID_Continue +0610..0615 ; ID_Continue +0621..063A ; ID_Continue +0640 ; ID_Continue +0641..064A ; ID_Continue +064B..0658 ; ID_Continue +0660..0669 ; ID_Continue +066E..066F ; ID_Continue +0670 ; ID_Continue +0671..06D3 ; ID_Continue +06D5 ; ID_Continue +06D6..06DC ; ID_Continue +06DF..06E4 ; ID_Continue +06E5..06E6 ; ID_Continue +06E7..06E8 ; ID_Continue +06EA..06ED ; ID_Continue +06EE..06EF ; ID_Continue +06F0..06F9 ; ID_Continue +06FA..06FC ; ID_Continue +06FF ; ID_Continue +0710 ; ID_Continue +0711 ; ID_Continue +0712..072F ; ID_Continue +0730..074A ; ID_Continue +074D..074F ; ID_Continue +0780..07A5 ; ID_Continue +07A6..07B0 ; ID_Continue +07B1 ; ID_Continue +0901..0902 ; ID_Continue +0903 ; ID_Continue +0904..0939 ; ID_Continue +093C ; ID_Continue +093D ; ID_Continue +093E..0940 ; ID_Continue +0941..0948 ; ID_Continue +0949..094C ; ID_Continue +094D ; ID_Continue +0950 ; ID_Continue +0951..0954 ; ID_Continue +0958..0961 ; ID_Continue +0962..0963 ; ID_Continue +0966..096F ; ID_Continue +0981 ; ID_Continue +0982..0983 ; ID_Continue +0985..098C ; ID_Continue +098F..0990 ; ID_Continue +0993..09A8 ; ID_Continue +09AA..09B0 ; ID_Continue +09B2 ; ID_Continue +09B6..09B9 ; ID_Continue +09BC ; ID_Continue +09BD ; ID_Continue +09BE..09C0 ; ID_Continue +09C1..09C4 ; ID_Continue +09C7..09C8 ; ID_Continue +09CB..09CC ; ID_Continue +09CD ; ID_Continue +09D7 ; ID_Continue +09DC..09DD ; ID_Continue +09DF..09E1 ; ID_Continue +09E2..09E3 ; ID_Continue +09E6..09EF ; ID_Continue +09F0..09F1 ; ID_Continue +0A01..0A02 ; ID_Continue +0A03 ; ID_Continue +0A05..0A0A ; ID_Continue +0A0F..0A10 ; ID_Continue +0A13..0A28 ; ID_Continue +0A2A..0A30 ; ID_Continue +0A32..0A33 ; ID_Continue +0A35..0A36 ; ID_Continue +0A38..0A39 ; ID_Continue +0A3C ; ID_Continue +0A3E..0A40 ; ID_Continue +0A41..0A42 ; ID_Continue +0A47..0A48 ; ID_Continue +0A4B..0A4D ; ID_Continue +0A59..0A5C ; ID_Continue +0A5E ; ID_Continue +0A66..0A6F ; ID_Continue +0A70..0A71 ; ID_Continue +0A72..0A74 ; ID_Continue +0A81..0A82 ; ID_Continue +0A83 ; ID_Continue +0A85..0A8D ; ID_Continue +0A8F..0A91 ; ID_Continue +0A93..0AA8 ; ID_Continue +0AAA..0AB0 ; ID_Continue +0AB2..0AB3 ; ID_Continue +0AB5..0AB9 ; ID_Continue +0ABC ; ID_Continue +0ABD ; ID_Continue +0ABE..0AC0 ; ID_Continue +0AC1..0AC5 ; ID_Continue +0AC7..0AC8 ; ID_Continue +0AC9 ; ID_Continue +0ACB..0ACC ; ID_Continue +0ACD ; ID_Continue +0AD0 ; ID_Continue +0AE0..0AE1 ; ID_Continue +0AE2..0AE3 ; ID_Continue +0AE6..0AEF ; ID_Continue +0B01 ; ID_Continue +0B02..0B03 ; ID_Continue +0B05..0B0C ; ID_Continue +0B0F..0B10 ; ID_Continue +0B13..0B28 ; ID_Continue +0B2A..0B30 ; ID_Continue +0B32..0B33 ; ID_Continue +0B35..0B39 ; ID_Continue +0B3C ; ID_Continue +0B3D ; ID_Continue +0B3E ; ID_Continue +0B3F ; ID_Continue +0B40 ; ID_Continue +0B41..0B43 ; ID_Continue +0B47..0B48 ; ID_Continue +0B4B..0B4C ; ID_Continue +0B4D ; ID_Continue +0B56 ; ID_Continue +0B57 ; ID_Continue +0B5C..0B5D ; ID_Continue +0B5F..0B61 ; ID_Continue +0B66..0B6F ; ID_Continue +0B71 ; ID_Continue +0B82 ; ID_Continue +0B83 ; ID_Continue +0B85..0B8A ; ID_Continue +0B8E..0B90 ; ID_Continue +0B92..0B95 ; ID_Continue +0B99..0B9A ; ID_Continue +0B9C ; ID_Continue +0B9E..0B9F ; ID_Continue +0BA3..0BA4 ; ID_Continue +0BA8..0BAA ; ID_Continue +0BAE..0BB5 ; ID_Continue +0BB7..0BB9 ; ID_Continue +0BBE..0BBF ; ID_Continue +0BC0 ; ID_Continue +0BC1..0BC2 ; ID_Continue +0BC6..0BC8 ; ID_Continue +0BCA..0BCC ; ID_Continue +0BCD ; ID_Continue +0BD7 ; ID_Continue +0BE7..0BEF ; ID_Continue +0C01..0C03 ; ID_Continue +0C05..0C0C ; ID_Continue +0C0E..0C10 ; ID_Continue +0C12..0C28 ; ID_Continue +0C2A..0C33 ; ID_Continue +0C35..0C39 ; ID_Continue +0C3E..0C40 ; ID_Continue +0C41..0C44 ; ID_Continue +0C46..0C48 ; ID_Continue +0C4A..0C4D ; ID_Continue +0C55..0C56 ; ID_Continue +0C60..0C61 ; ID_Continue +0C66..0C6F ; ID_Continue +0C82..0C83 ; ID_Continue +0C85..0C8C ; ID_Continue +0C8E..0C90 ; ID_Continue +0C92..0CA8 ; ID_Continue +0CAA..0CB3 ; ID_Continue +0CB5..0CB9 ; ID_Continue +0CBC ; ID_Continue +0CBD ; ID_Continue +0CBE ; ID_Continue +0CBF ; ID_Continue +0CC0..0CC4 ; ID_Continue +0CC6 ; ID_Continue +0CC7..0CC8 ; ID_Continue +0CCA..0CCB ; ID_Continue +0CCC..0CCD ; ID_Continue +0CD5..0CD6 ; ID_Continue +0CDE ; ID_Continue +0CE0..0CE1 ; ID_Continue +0CE6..0CEF ; ID_Continue +0D02..0D03 ; ID_Continue +0D05..0D0C ; ID_Continue +0D0E..0D10 ; ID_Continue +0D12..0D28 ; ID_Continue +0D2A..0D39 ; ID_Continue +0D3E..0D40 ; ID_Continue +0D41..0D43 ; ID_Continue +0D46..0D48 ; ID_Continue +0D4A..0D4C ; ID_Continue +0D4D ; ID_Continue +0D57 ; ID_Continue +0D60..0D61 ; ID_Continue +0D66..0D6F ; ID_Continue +0D82..0D83 ; ID_Continue +0D85..0D96 ; ID_Continue +0D9A..0DB1 ; ID_Continue +0DB3..0DBB ; ID_Continue +0DBD ; ID_Continue +0DC0..0DC6 ; ID_Continue +0DCA ; ID_Continue +0DCF..0DD1 ; ID_Continue +0DD2..0DD4 ; ID_Continue +0DD6 ; ID_Continue +0DD8..0DDF ; ID_Continue +0DF2..0DF3 ; ID_Continue +0E01..0E30 ; ID_Continue +0E31 ; ID_Continue +0E32..0E33 ; ID_Continue +0E34..0E3A ; ID_Continue +0E40..0E45 ; ID_Continue +0E46 ; ID_Continue +0E47..0E4E ; ID_Continue +0E50..0E59 ; ID_Continue +0E81..0E82 ; ID_Continue +0E84 ; ID_Continue +0E87..0E88 ; ID_Continue +0E8A ; ID_Continue +0E8D ; ID_Continue +0E94..0E97 ; ID_Continue +0E99..0E9F ; ID_Continue +0EA1..0EA3 ; ID_Continue +0EA5 ; ID_Continue +0EA7 ; ID_Continue +0EAA..0EAB ; ID_Continue +0EAD..0EB0 ; ID_Continue +0EB1 ; ID_Continue +0EB2..0EB3 ; ID_Continue +0EB4..0EB9 ; ID_Continue +0EBB..0EBC ; ID_Continue +0EBD ; ID_Continue +0EC0..0EC4 ; ID_Continue +0EC6 ; ID_Continue +0EC8..0ECD ; ID_Continue +0ED0..0ED9 ; ID_Continue +0EDC..0EDD ; ID_Continue +0F00 ; ID_Continue +0F18..0F19 ; ID_Continue +0F20..0F29 ; ID_Continue +0F35 ; ID_Continue +0F37 ; ID_Continue +0F39 ; ID_Continue +0F3E..0F3F ; ID_Continue +0F40..0F47 ; ID_Continue +0F49..0F6A ; ID_Continue +0F71..0F7E ; ID_Continue +0F7F ; ID_Continue +0F80..0F84 ; ID_Continue +0F86..0F87 ; ID_Continue +0F88..0F8B ; ID_Continue +0F90..0F97 ; ID_Continue +0F99..0FBC ; ID_Continue +0FC6 ; ID_Continue +1000..1021 ; ID_Continue +1023..1027 ; ID_Continue +1029..102A ; ID_Continue +102C ; ID_Continue +102D..1030 ; ID_Continue +1031 ; ID_Continue +1032 ; ID_Continue +1036..1037 ; ID_Continue +1038 ; ID_Continue +1039 ; ID_Continue +1040..1049 ; ID_Continue +1050..1055 ; ID_Continue +1056..1057 ; ID_Continue +1058..1059 ; ID_Continue +10A0..10C5 ; ID_Continue +10D0..10F8 ; ID_Continue +1100..1159 ; ID_Continue +115F..11A2 ; ID_Continue +11A8..11F9 ; ID_Continue +1200..1206 ; ID_Continue +1208..1246 ; ID_Continue +1248 ; ID_Continue +124A..124D ; ID_Continue +1250..1256 ; ID_Continue +1258 ; ID_Continue +125A..125D ; ID_Continue +1260..1286 ; ID_Continue +1288 ; ID_Continue +128A..128D ; ID_Continue +1290..12AE ; ID_Continue +12B0 ; ID_Continue +12B2..12B5 ; ID_Continue +12B8..12BE ; ID_Continue +12C0 ; ID_Continue +12C2..12C5 ; ID_Continue +12C8..12CE ; ID_Continue +12D0..12D6 ; ID_Continue +12D8..12EE ; ID_Continue +12F0..130E ; ID_Continue +1310 ; ID_Continue +1312..1315 ; ID_Continue +1318..131E ; ID_Continue +1320..1346 ; ID_Continue +1348..135A ; ID_Continue +1369..1371 ; ID_Continue +13A0..13F4 ; ID_Continue +1401..166C ; ID_Continue +166F..1676 ; ID_Continue +1681..169A ; ID_Continue +16A0..16EA ; ID_Continue +16EE..16F0 ; ID_Continue +1700..170C ; ID_Continue +170E..1711 ; ID_Continue +1712..1714 ; ID_Continue +1720..1731 ; ID_Continue +1732..1734 ; ID_Continue +1740..1751 ; ID_Continue +1752..1753 ; ID_Continue +1760..176C ; ID_Continue +176E..1770 ; ID_Continue +1772..1773 ; ID_Continue +1780..17B3 ; ID_Continue +17B6 ; ID_Continue +17B7..17BD ; ID_Continue +17BE..17C5 ; ID_Continue +17C6 ; ID_Continue +17C7..17C8 ; ID_Continue +17C9..17D3 ; ID_Continue +17D7 ; ID_Continue +17DC ; ID_Continue +17DD ; ID_Continue +17E0..17E9 ; ID_Continue +180B..180D ; ID_Continue +1810..1819 ; ID_Continue +1820..1842 ; ID_Continue +1843 ; ID_Continue +1844..1877 ; ID_Continue +1880..18A8 ; ID_Continue +18A9 ; ID_Continue +1900..191C ; ID_Continue +1920..1922 ; ID_Continue +1923..1926 ; ID_Continue +1927..1928 ; ID_Continue +1929..192B ; ID_Continue +1930..1931 ; ID_Continue +1932 ; ID_Continue +1933..1938 ; ID_Continue +1939..193B ; ID_Continue +1946..194F ; ID_Continue +1950..196D ; ID_Continue +1970..1974 ; ID_Continue +1D00..1D2B ; ID_Continue +1D2C..1D61 ; ID_Continue +1D62..1D6B ; ID_Continue +1E00..1E9B ; ID_Continue +1EA0..1EF9 ; ID_Continue +1F00..1F15 ; ID_Continue +1F18..1F1D ; ID_Continue +1F20..1F45 ; ID_Continue +1F48..1F4D ; ID_Continue +1F50..1F57 ; ID_Continue +1F59 ; ID_Continue +1F5B ; ID_Continue +1F5D ; ID_Continue +1F5F..1F7D ; ID_Continue +1F80..1FB4 ; ID_Continue +1FB6..1FBC ; ID_Continue +1FBE ; ID_Continue +1FC2..1FC4 ; ID_Continue +1FC6..1FCC ; ID_Continue +1FD0..1FD3 ; ID_Continue +1FD6..1FDB ; ID_Continue +1FE0..1FEC ; ID_Continue +1FF2..1FF4 ; ID_Continue +1FF6..1FFC ; ID_Continue +203F..2040 ; ID_Continue +2054 ; ID_Continue +2071 ; ID_Continue +207F ; ID_Continue +20D0..20DC ; ID_Continue +20E1 ; ID_Continue +20E5..20EA ; ID_Continue +2102 ; ID_Continue +2107 ; ID_Continue +210A..2113 ; ID_Continue +2115 ; ID_Continue +2118 ; ID_Continue +2119..211D ; ID_Continue +2124 ; ID_Continue +2126 ; ID_Continue +2128 ; ID_Continue +212A..212D ; ID_Continue +212E ; ID_Continue +212F..2131 ; ID_Continue +2133..2134 ; ID_Continue +2135..2138 ; ID_Continue +2139 ; ID_Continue +213D..213F ; ID_Continue +2145..2149 ; ID_Continue +2160..2183 ; ID_Continue +3005 ; ID_Continue +3006 ; ID_Continue +3007 ; ID_Continue +3021..3029 ; ID_Continue +302A..302F ; ID_Continue +3031..3035 ; ID_Continue +3038..303A ; ID_Continue +303B ; ID_Continue +303C ; ID_Continue +3041..3096 ; ID_Continue +3099..309A ; ID_Continue +309B..309C ; ID_Continue +309D..309E ; ID_Continue +309F ; ID_Continue +30A1..30FA ; ID_Continue +30FB ; ID_Continue +30FC..30FE ; ID_Continue +30FF ; ID_Continue +3105..312C ; ID_Continue +3131..318E ; ID_Continue +31A0..31B7 ; ID_Continue +31F0..31FF ; ID_Continue +3400..4DB5 ; ID_Continue +4E00..9FA5 ; ID_Continue +A000..A48C ; ID_Continue +AC00..D7A3 ; ID_Continue +F900..FA2D ; ID_Continue +FA30..FA6A ; ID_Continue +FB00..FB06 ; ID_Continue +FB13..FB17 ; ID_Continue +FB1D ; ID_Continue +FB1E ; ID_Continue +FB1F..FB28 ; ID_Continue +FB2A..FB36 ; ID_Continue +FB38..FB3C ; ID_Continue +FB3E ; ID_Continue +FB40..FB41 ; ID_Continue +FB43..FB44 ; ID_Continue +FB46..FBB1 ; ID_Continue +FBD3..FD3D ; ID_Continue +FD50..FD8F ; ID_Continue +FD92..FDC7 ; ID_Continue +FDF0..FDFB ; ID_Continue +FE00..FE0F ; ID_Continue +FE20..FE23 ; ID_Continue +FE33..FE34 ; ID_Continue +FE4D..FE4F ; ID_Continue +FE70..FE74 ; ID_Continue +FE76..FEFC ; ID_Continue +FF10..FF19 ; ID_Continue +FF21..FF3A ; ID_Continue +FF3F ; ID_Continue +FF41..FF5A ; ID_Continue +FF65 ; ID_Continue +FF66..FF6F ; ID_Continue +FF70 ; ID_Continue +FF71..FF9D ; ID_Continue +FF9E..FF9F ; ID_Continue +FFA0..FFBE ; ID_Continue +FFC2..FFC7 ; ID_Continue +FFCA..FFCF ; ID_Continue +FFD2..FFD7 ; ID_Continue +FFDA..FFDC ; ID_Continue +10000..1000B ; ID_Continue +1000D..10026 ; ID_Continue +10028..1003A ; ID_Continue +1003C..1003D ; ID_Continue +1003F..1004D ; ID_Continue +10050..1005D ; ID_Continue +10080..100FA ; ID_Continue +10300..1031E ; ID_Continue +10330..10349 ; ID_Continue +1034A ; ID_Continue +10380..1039D ; ID_Continue +10400..1044F ; ID_Continue +10450..1049D ; ID_Continue +104A0..104A9 ; ID_Continue +10800..10805 ; ID_Continue +10808 ; ID_Continue +1080A..10835 ; ID_Continue +10837..10838 ; ID_Continue +1083C ; ID_Continue +1083F ; ID_Continue +1D165..1D166 ; ID_Continue +1D167..1D169 ; ID_Continue +1D16D..1D172 ; ID_Continue +1D17B..1D182 ; ID_Continue +1D185..1D18B ; ID_Continue +1D1AA..1D1AD ; ID_Continue +1D400..1D454 ; ID_Continue +1D456..1D49C ; ID_Continue +1D49E..1D49F ; ID_Continue +1D4A2 ; ID_Continue +1D4A5..1D4A6 ; ID_Continue +1D4A9..1D4AC ; ID_Continue +1D4AE..1D4B9 ; ID_Continue +1D4BB ; ID_Continue +1D4BD..1D4C3 ; ID_Continue +1D4C5..1D505 ; ID_Continue +1D507..1D50A ; ID_Continue +1D50D..1D514 ; ID_Continue +1D516..1D51C ; ID_Continue +1D51E..1D539 ; ID_Continue +1D53B..1D53E ; ID_Continue +1D540..1D544 ; ID_Continue +1D546 ; ID_Continue +1D54A..1D550 ; ID_Continue +1D552..1D6A3 ; ID_Continue +1D6A8..1D6C0 ; ID_Continue +1D6C2..1D6DA ; ID_Continue +1D6DC..1D6FA ; ID_Continue +1D6FC..1D714 ; ID_Continue +1D716..1D734 ; ID_Continue +1D736..1D74E ; ID_Continue +1D750..1D76E ; ID_Continue +1D770..1D788 ; ID_Continue +1D78A..1D7A8 ; ID_Continue +1D7AA..1D7C2 ; ID_Continue +1D7C4..1D7C9 ; ID_Continue +1D7CE..1D7FF ; ID_Continue +20000..2A6D6 ; ID_Continue +2F800..2FA1D ; ID_Continue +E0100..E01EF ; ID_Continue # Total code points: 91815 @@ -2457,365 +2473,365 @@ E0100..E01EF ; ID_Continue # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR # NOTE: Does NOT remove the non-NFKx characters. # Merely ensures that if isIdentifer(string) then isIdentifier(NFKx(string)) -0041..005A ; XID_Start # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z -0061..007A ; XID_Start # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z -00AA ; XID_Start # L& FEMININE ORDINAL INDICATOR -00B5 ; XID_Start # L& MICRO SIGN -00BA ; XID_Start # L& MASCULINE ORDINAL INDICATOR -00C0..00D6 ; XID_Start # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS -00D8..00F6 ; XID_Start # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS -00F8..01BA ; XID_Start # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL -01BB ; XID_Start # Lo LATIN LETTER TWO WITH STROKE -01BC..01BF ; XID_Start # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN -01C0..01C3 ; XID_Start # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK -01C4..0236 ; XID_Start # L& [115] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER T WITH CURL -0250..02AF ; XID_Start # L& [96] LATIN SMALL LETTER TURNED A..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL -02B0..02C1 ; XID_Start # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP -02C6..02D1 ; XID_Start # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON -02E0..02E4 ; XID_Start # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP -02EE ; XID_Start # Lm MODIFIER LETTER DOUBLE APOSTROPHE -0386 ; XID_Start # L& GREEK CAPITAL LETTER ALPHA WITH TONOS -0388..038A ; XID_Start # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS -038C ; XID_Start # L& GREEK CAPITAL LETTER OMICRON WITH TONOS -038E..03A1 ; XID_Start # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO -03A3..03CE ; XID_Start # L& [44] GREEK CAPITAL LETTER SIGMA..GREEK SMALL LETTER OMEGA WITH TONOS -03D0..03F5 ; XID_Start # L& [38] GREEK BETA SYMBOL..GREEK LUNATE EPSILON SYMBOL -03F7..03FB ; XID_Start # L& [5] GREEK CAPITAL LETTER SHO..GREEK SMALL LETTER SAN -0400..0481 ; XID_Start # L& [130] CYRILLIC CAPITAL LETTER IE WITH GRAVE..CYRILLIC SMALL LETTER KOPPA -048A..04CE ; XID_Start # L& [69] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EM WITH TAIL -04D0..04F5 ; XID_Start # L& [38] CYRILLIC CAPITAL LETTER A WITH BREVE..CYRILLIC SMALL LETTER CHE WITH DIAERESIS -04F8..04F9 ; XID_Start # L& [2] CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS..CYRILLIC SMALL LETTER YERU WITH DIAERESIS -0500..050F ; XID_Start # L& [16] CYRILLIC CAPITAL LETTER KOMI DE..CYRILLIC SMALL LETTER KOMI TJE -0531..0556 ; XID_Start # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH -0559 ; XID_Start # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING -0561..0587 ; XID_Start # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN -05D0..05EA ; XID_Start # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV -05F0..05F2 ; XID_Start # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD -0621..063A ; XID_Start # Lo [26] ARABIC LETTER HAMZA..ARABIC LETTER GHAIN -0640 ; XID_Start # Lm ARABIC TATWEEL -0641..064A ; XID_Start # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH -066E..066F ; XID_Start # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF -0671..06D3 ; XID_Start # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE -06D5 ; XID_Start # Lo ARABIC LETTER AE -06E5..06E6 ; XID_Start # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH -06EE..06EF ; XID_Start # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V -06FA..06FC ; XID_Start # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW -06FF ; XID_Start # Lo ARABIC LETTER HEH WITH INVERTED V -0710 ; XID_Start # Lo SYRIAC LETTER ALAPH -0712..072F ; XID_Start # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH -074D..074F ; XID_Start # Lo [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE -0780..07A5 ; XID_Start # Lo [38] THAANA LETTER HAA..THAANA LETTER WAAVU -07B1 ; XID_Start # Lo THAANA LETTER NAA -0904..0939 ; XID_Start # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA -093D ; XID_Start # Lo DEVANAGARI SIGN AVAGRAHA -0950 ; XID_Start # Lo DEVANAGARI OM -0958..0961 ; XID_Start # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL -0985..098C ; XID_Start # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L -098F..0990 ; XID_Start # Lo [2] BENGALI LETTER E..BENGALI LETTER AI -0993..09A8 ; XID_Start # Lo [22] BENGALI LETTER O..BENGALI LETTER NA -09AA..09B0 ; XID_Start # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA -09B2 ; XID_Start # Lo BENGALI LETTER LA -09B6..09B9 ; XID_Start # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA -09BD ; XID_Start # Lo BENGALI SIGN AVAGRAHA -09DC..09DD ; XID_Start # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA -09DF..09E1 ; XID_Start # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL -09F0..09F1 ; XID_Start # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL -0A05..0A0A ; XID_Start # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU -0A0F..0A10 ; XID_Start # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI -0A13..0A28 ; XID_Start # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA -0A2A..0A30 ; XID_Start # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA -0A32..0A33 ; XID_Start # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA -0A35..0A36 ; XID_Start # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA -0A38..0A39 ; XID_Start # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA -0A59..0A5C ; XID_Start # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA -0A5E ; XID_Start # Lo GURMUKHI LETTER FA -0A72..0A74 ; XID_Start # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR -0A85..0A8D ; XID_Start # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E -0A8F..0A91 ; XID_Start # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O -0A93..0AA8 ; XID_Start # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA -0AAA..0AB0 ; XID_Start # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA -0AB2..0AB3 ; XID_Start # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA -0AB5..0AB9 ; XID_Start # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA -0ABD ; XID_Start # Lo GUJARATI SIGN AVAGRAHA -0AD0 ; XID_Start # Lo GUJARATI OM -0AE0..0AE1 ; XID_Start # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL -0B05..0B0C ; XID_Start # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L -0B0F..0B10 ; XID_Start # Lo [2] ORIYA LETTER E..ORIYA LETTER AI -0B13..0B28 ; XID_Start # Lo [22] ORIYA LETTER O..ORIYA LETTER NA -0B2A..0B30 ; XID_Start # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA -0B32..0B33 ; XID_Start # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA -0B35..0B39 ; XID_Start # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA -0B3D ; XID_Start # Lo ORIYA SIGN AVAGRAHA -0B5C..0B5D ; XID_Start # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA -0B5F..0B61 ; XID_Start # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL -0B71 ; XID_Start # Lo ORIYA LETTER WA -0B83 ; XID_Start # Lo TAMIL SIGN VISARGA -0B85..0B8A ; XID_Start # Lo [6] TAMIL LETTER A..TAMIL LETTER UU -0B8E..0B90 ; XID_Start # Lo [3] TAMIL LETTER E..TAMIL LETTER AI -0B92..0B95 ; XID_Start # Lo [4] TAMIL LETTER O..TAMIL LETTER KA -0B99..0B9A ; XID_Start # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA -0B9C ; XID_Start # Lo TAMIL LETTER JA -0B9E..0B9F ; XID_Start # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA -0BA3..0BA4 ; XID_Start # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA -0BA8..0BAA ; XID_Start # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA -0BAE..0BB5 ; XID_Start # Lo [8] TAMIL LETTER MA..TAMIL LETTER VA -0BB7..0BB9 ; XID_Start # Lo [3] TAMIL LETTER SSA..TAMIL LETTER HA -0C05..0C0C ; XID_Start # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L -0C0E..0C10 ; XID_Start # Lo [3] TELUGU LETTER E..TELUGU LETTER AI -0C12..0C28 ; XID_Start # Lo [23] TELUGU LETTER O..TELUGU LETTER NA -0C2A..0C33 ; XID_Start # Lo [10] TELUGU LETTER PA..TELUGU LETTER LLA -0C35..0C39 ; XID_Start # Lo [5] TELUGU LETTER VA..TELUGU LETTER HA -0C60..0C61 ; XID_Start # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL -0C85..0C8C ; XID_Start # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L -0C8E..0C90 ; XID_Start # Lo [3] KANNADA LETTER E..KANNADA LETTER AI -0C92..0CA8 ; XID_Start # Lo [23] KANNADA LETTER O..KANNADA LETTER NA -0CAA..0CB3 ; XID_Start # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA -0CB5..0CB9 ; XID_Start # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA -0CBD ; XID_Start # Lo KANNADA SIGN AVAGRAHA -0CDE ; XID_Start # Lo KANNADA LETTER FA -0CE0..0CE1 ; XID_Start # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL -0D05..0D0C ; XID_Start # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L -0D0E..0D10 ; XID_Start # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI -0D12..0D28 ; XID_Start # Lo [23] MALAYALAM LETTER O..MALAYALAM LETTER NA -0D2A..0D39 ; XID_Start # Lo [16] MALAYALAM LETTER PA..MALAYALAM LETTER HA -0D60..0D61 ; XID_Start # Lo [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL -0D85..0D96 ; XID_Start # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA -0D9A..0DB1 ; XID_Start # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA -0DB3..0DBB ; XID_Start # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA -0DBD ; XID_Start # Lo SINHALA LETTER DANTAJA LAYANNA -0DC0..0DC6 ; XID_Start # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA -0E01..0E30 ; XID_Start # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A -0E32 ; XID_Start # Lo THAI CHARACTER SARA AA -0E40..0E45 ; XID_Start # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO -0E46 ; XID_Start # Lm THAI CHARACTER MAIYAMOK -0E81..0E82 ; XID_Start # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG -0E84 ; XID_Start # Lo LAO LETTER KHO TAM -0E87..0E88 ; XID_Start # Lo [2] LAO LETTER NGO..LAO LETTER CO -0E8A ; XID_Start # Lo LAO LETTER SO TAM -0E8D ; XID_Start # Lo LAO LETTER NYO -0E94..0E97 ; XID_Start # Lo [4] LAO LETTER DO..LAO LETTER THO TAM -0E99..0E9F ; XID_Start # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG -0EA1..0EA3 ; XID_Start # Lo [3] LAO LETTER MO..LAO LETTER LO LING -0EA5 ; XID_Start # Lo LAO LETTER LO LOOT -0EA7 ; XID_Start # Lo LAO LETTER WO -0EAA..0EAB ; XID_Start # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG -0EAD..0EB0 ; XID_Start # Lo [4] LAO LETTER O..LAO VOWEL SIGN A -0EB2 ; XID_Start # Lo LAO VOWEL SIGN AA -0EBD ; XID_Start # Lo LAO SEMIVOWEL SIGN NYO -0EC0..0EC4 ; XID_Start # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI -0EC6 ; XID_Start # Lm LAO KO LA -0EDC..0EDD ; XID_Start # Lo [2] LAO HO NO..LAO HO MO -0F00 ; XID_Start # Lo TIBETAN SYLLABLE OM -0F40..0F47 ; XID_Start # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA -0F49..0F6A ; XID_Start # Lo [34] TIBETAN LETTER NYA..TIBETAN LETTER FIXED-FORM RA -0F88..0F8B ; XID_Start # Lo [4] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN GRU MED RGYINGS -1000..1021 ; XID_Start # Lo [34] MYANMAR LETTER KA..MYANMAR LETTER A -1023..1027 ; XID_Start # Lo [5] MYANMAR LETTER I..MYANMAR LETTER E -1029..102A ; XID_Start # Lo [2] MYANMAR LETTER O..MYANMAR LETTER AU -1050..1055 ; XID_Start # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL -10A0..10C5 ; XID_Start # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE -10D0..10F8 ; XID_Start # Lo [41] GEORGIAN LETTER AN..GEORGIAN LETTER ELIFI -1100..1159 ; XID_Start # Lo [90] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH -115F..11A2 ; XID_Start # Lo [68] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG SSANGARAEA -11A8..11F9 ; XID_Start # Lo [82] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH -1200..1206 ; XID_Start # Lo [7] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE HO -1208..1246 ; XID_Start # Lo [63] ETHIOPIC SYLLABLE LA..ETHIOPIC SYLLABLE QO -1248 ; XID_Start # Lo ETHIOPIC SYLLABLE QWA -124A..124D ; XID_Start # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE -1250..1256 ; XID_Start # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO -1258 ; XID_Start # Lo ETHIOPIC SYLLABLE QHWA -125A..125D ; XID_Start # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE -1260..1286 ; XID_Start # Lo [39] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XO -1288 ; XID_Start # Lo ETHIOPIC SYLLABLE XWA -128A..128D ; XID_Start # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE -1290..12AE ; XID_Start # Lo [31] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KO -12B0 ; XID_Start # Lo ETHIOPIC SYLLABLE KWA -12B2..12B5 ; XID_Start # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE -12B8..12BE ; XID_Start # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO -12C0 ; XID_Start # Lo ETHIOPIC SYLLABLE KXWA -12C2..12C5 ; XID_Start # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE -12C8..12CE ; XID_Start # Lo [7] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE WO -12D0..12D6 ; XID_Start # Lo [7] ETHIOPIC SYLLABLE PHARYNGEAL A..ETHIOPIC SYLLABLE PHARYNGEAL O -12D8..12EE ; XID_Start # Lo [23] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE YO -12F0..130E ; XID_Start # Lo [31] ETHIOPIC SYLLABLE DA..ETHIOPIC SYLLABLE GO -1310 ; XID_Start # Lo ETHIOPIC SYLLABLE GWA -1312..1315 ; XID_Start # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE -1318..131E ; XID_Start # Lo [7] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE GGO -1320..1346 ; XID_Start # Lo [39] ETHIOPIC SYLLABLE THA..ETHIOPIC SYLLABLE TZO -1348..135A ; XID_Start # Lo [19] ETHIOPIC SYLLABLE FA..ETHIOPIC SYLLABLE FYA -13A0..13F4 ; XID_Start # Lo [85] CHEROKEE LETTER A..CHEROKEE LETTER YV -1401..166C ; XID_Start # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA -166F..1676 ; XID_Start # Lo [8] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS NNGAA -1681..169A ; XID_Start # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH -16A0..16EA ; XID_Start # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X -16EE..16F0 ; XID_Start # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL -1700..170C ; XID_Start # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA -170E..1711 ; XID_Start # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA -1720..1731 ; XID_Start # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA -1740..1751 ; XID_Start # Lo [18] BUHID LETTER A..BUHID LETTER HA -1760..176C ; XID_Start # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA -176E..1770 ; XID_Start # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA -1780..17B3 ; XID_Start # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU -17D7 ; XID_Start # Lm KHMER SIGN LEK TOO -17DC ; XID_Start # Lo KHMER SIGN AVAKRAHASANYA -1820..1842 ; XID_Start # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI -1843 ; XID_Start # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN -1844..1877 ; XID_Start # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA -1880..18A8 ; XID_Start # Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA -1900..191C ; XID_Start # Lo [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA -1950..196D ; XID_Start # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI -1970..1974 ; XID_Start # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 -1D00..1D2B ; XID_Start # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL -1D2C..1D61 ; XID_Start # Lm [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI -1D62..1D6B ; XID_Start # L& [10] LATIN SUBSCRIPT SMALL LETTER I..LATIN SMALL LETTER UE -1E00..1E9B ; XID_Start # L& [156] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER LONG S WITH DOT ABOVE -1EA0..1EF9 ; XID_Start # L& [90] LATIN CAPITAL LETTER A WITH DOT BELOW..LATIN SMALL LETTER Y WITH TILDE -1F00..1F15 ; XID_Start # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA -1F18..1F1D ; XID_Start # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA -1F20..1F45 ; XID_Start # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA -1F48..1F4D ; XID_Start # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA -1F50..1F57 ; XID_Start # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI -1F59 ; XID_Start # L& GREEK CAPITAL LETTER UPSILON WITH DASIA -1F5B ; XID_Start # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA -1F5D ; XID_Start # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA -1F5F..1F7D ; XID_Start # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA -1F80..1FB4 ; XID_Start # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI -1FB6..1FBC ; XID_Start # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI -1FBE ; XID_Start # L& GREEK PROSGEGRAMMENI -1FC2..1FC4 ; XID_Start # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI -1FC6..1FCC ; XID_Start # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI -1FD0..1FD3 ; XID_Start # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA -1FD6..1FDB ; XID_Start # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA -1FE0..1FEC ; XID_Start # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA -1FF2..1FF4 ; XID_Start # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI -1FF6..1FFC ; XID_Start # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI -2071 ; XID_Start # L& SUPERSCRIPT LATIN SMALL LETTER I -207F ; XID_Start # L& SUPERSCRIPT LATIN SMALL LETTER N -2102 ; XID_Start # L& DOUBLE-STRUCK CAPITAL C -2107 ; XID_Start # L& EULER CONSTANT -210A..2113 ; XID_Start # L& [10] SCRIPT SMALL G..SCRIPT SMALL L -2115 ; XID_Start # L& DOUBLE-STRUCK CAPITAL N -2118 ; XID_Start # So SCRIPT CAPITAL P -2119..211D ; XID_Start # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R -2124 ; XID_Start # L& DOUBLE-STRUCK CAPITAL Z -2126 ; XID_Start # L& OHM SIGN -2128 ; XID_Start # L& BLACK-LETTER CAPITAL Z -212A..212D ; XID_Start # L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C -212E ; XID_Start # So ESTIMATED SYMBOL -212F..2131 ; XID_Start # L& [3] SCRIPT SMALL E..SCRIPT CAPITAL F -2133..2134 ; XID_Start # L& [2] SCRIPT CAPITAL M..SCRIPT SMALL O -2135..2138 ; XID_Start # Lo [4] ALEF SYMBOL..DALET SYMBOL -2139 ; XID_Start # L& INFORMATION SOURCE -213D..213F ; XID_Start # L& [3] DOUBLE-STRUCK SMALL GAMMA..DOUBLE-STRUCK CAPITAL PI -2145..2149 ; XID_Start # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J -2160..2183 ; XID_Start # Nl [36] ROMAN NUMERAL ONE..ROMAN NUMERAL REVERSED ONE HUNDRED -3005 ; XID_Start # Lm IDEOGRAPHIC ITERATION MARK -3006 ; XID_Start # Lo IDEOGRAPHIC CLOSING MARK -3007 ; XID_Start # Nl IDEOGRAPHIC NUMBER ZERO -3021..3029 ; XID_Start # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE -3031..3035 ; XID_Start # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF -3038..303A ; XID_Start # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY -303B ; XID_Start # Lm VERTICAL IDEOGRAPHIC ITERATION MARK -303C ; XID_Start # Lo MASU MARK -3041..3096 ; XID_Start # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE -309D..309E ; XID_Start # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK -309F ; XID_Start # Lo HIRAGANA DIGRAPH YORI -30A1..30FA ; XID_Start # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO -30FC..30FE ; XID_Start # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK -30FF ; XID_Start # Lo KATAKANA DIGRAPH KOTO -3105..312C ; XID_Start # Lo [40] BOPOMOFO LETTER B..BOPOMOFO LETTER GN -3131..318E ; XID_Start # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE -31A0..31B7 ; XID_Start # Lo [24] BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H -31F0..31FF ; XID_Start # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO -3400..4DB5 ; XID_Start # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 -4E00..9FA5 ; XID_Start # Lo [20902] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FA5 -A000..A48C ; XID_Start # Lo [1165] YI SYLLABLE IT..YI SYLLABLE YYR -AC00..D7A3 ; XID_Start # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH -F900..FA2D ; XID_Start # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D -FA30..FA6A ; XID_Start # Lo [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A -FB00..FB06 ; XID_Start # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST -FB13..FB17 ; XID_Start # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH -FB1D ; XID_Start # Lo HEBREW LETTER YOD WITH HIRIQ -FB1F..FB28 ; XID_Start # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV -FB2A..FB36 ; XID_Start # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH -FB38..FB3C ; XID_Start # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH -FB3E ; XID_Start # Lo HEBREW LETTER MEM WITH DAGESH -FB40..FB41 ; XID_Start # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH -FB43..FB44 ; XID_Start # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH -FB46..FBB1 ; XID_Start # Lo [108] HEBREW LETTER TSADI WITH DAGESH..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM -FBD3..FC5D ; XID_Start # Lo [139] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM -FC64..FD3D ; XID_Start # Lo [218] ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM -FD50..FD8F ; XID_Start # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM -FD92..FDC7 ; XID_Start # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM -FDF0..FDF9 ; XID_Start # Lo [10] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE SALLA ISOLATED FORM -FE71 ; XID_Start # Lo ARABIC TATWEEL WITH FATHATAN ABOVE -FE73 ; XID_Start # Lo ARABIC TAIL FRAGMENT -FE77 ; XID_Start # Lo ARABIC FATHA MEDIAL FORM -FE79 ; XID_Start # Lo ARABIC DAMMA MEDIAL FORM -FE7B ; XID_Start # Lo ARABIC KASRA MEDIAL FORM -FE7D ; XID_Start # Lo ARABIC SHADDA MEDIAL FORM -FE7F..FEFC ; XID_Start # Lo [126] ARABIC SUKUN MEDIAL FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM -FF21..FF3A ; XID_Start # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z -FF41..FF5A ; XID_Start # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z -FF66..FF6F ; XID_Start # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU -FF70 ; XID_Start # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK -FF71..FF9D ; XID_Start # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N -FFA0..FFBE ; XID_Start # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH -FFC2..FFC7 ; XID_Start # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E -FFCA..FFCF ; XID_Start # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE -FFD2..FFD7 ; XID_Start # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU -FFDA..FFDC ; XID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I -10000..1000B ; XID_Start # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE -1000D..10026 ; XID_Start # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO -10028..1003A ; XID_Start # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO -1003C..1003D ; XID_Start # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE -1003F..1004D ; XID_Start # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO -10050..1005D ; XID_Start # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 -10080..100FA ; XID_Start # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 -10300..1031E ; XID_Start # Lo [31] OLD ITALIC LETTER A..OLD ITALIC LETTER UU -10330..10349 ; XID_Start # Lo [26] GOTHIC LETTER AHSA..GOTHIC LETTER OTHAL -1034A ; XID_Start # Nl GOTHIC LETTER NINE HUNDRED -10380..1039D ; XID_Start # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU -10400..1044F ; XID_Start # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW -10450..1049D ; XID_Start # Lo [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO -10800..10805 ; XID_Start # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA -10808 ; XID_Start # Lo CYPRIOT SYLLABLE JO -1080A..10835 ; XID_Start # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO -10837..10838 ; XID_Start # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE -1083C ; XID_Start # Lo CYPRIOT SYLLABLE ZA -1083F ; XID_Start # Lo CYPRIOT SYLLABLE ZO -1D400..1D454 ; XID_Start # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G -1D456..1D49C ; XID_Start # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A -1D49E..1D49F ; XID_Start # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D -1D4A2 ; XID_Start # L& MATHEMATICAL SCRIPT CAPITAL G -1D4A5..1D4A6 ; XID_Start # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K -1D4A9..1D4AC ; XID_Start # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q -1D4AE..1D4B9 ; XID_Start # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D -1D4BB ; XID_Start # L& MATHEMATICAL SCRIPT SMALL F -1D4BD..1D4C3 ; XID_Start # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N -1D4C5..1D505 ; XID_Start # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B -1D507..1D50A ; XID_Start # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G -1D50D..1D514 ; XID_Start # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q -1D516..1D51C ; XID_Start # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y -1D51E..1D539 ; XID_Start # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B -1D53B..1D53E ; XID_Start # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G -1D540..1D544 ; XID_Start # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M -1D546 ; XID_Start # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O -1D54A..1D550 ; XID_Start # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y -1D552..1D6A3 ; XID_Start # L& [338] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL MONOSPACE SMALL Z -1D6A8..1D6C0 ; XID_Start # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA -1D6C2..1D6DA ; XID_Start # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA -1D6DC..1D6FA ; XID_Start # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA -1D6FC..1D714 ; XID_Start # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA -1D716..1D734 ; XID_Start # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA -1D736..1D74E ; XID_Start # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA -1D750..1D76E ; XID_Start # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA -1D770..1D788 ; XID_Start # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA -1D78A..1D7A8 ; XID_Start # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA -1D7AA..1D7C2 ; XID_Start # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA -1D7C4..1D7C9 ; XID_Start # L& [6] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL -20000..2A6D6 ; XID_Start # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 -2F800..2FA1D ; XID_Start # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D +0041..005A ; XID_Start +0061..007A ; XID_Start +00AA ; XID_Start +00B5 ; XID_Start +00BA ; XID_Start +00C0..00D6 ; XID_Start +00D8..00F6 ; XID_Start +00F8..01BA ; XID_Start +01BB ; XID_Start +01BC..01BF ; XID_Start +01C0..01C3 ; XID_Start +01C4..0236 ; XID_Start +0250..02AF ; XID_Start +02B0..02C1 ; XID_Start +02C6..02D1 ; XID_Start +02E0..02E4 ; XID_Start +02EE ; XID_Start +0386 ; XID_Start +0388..038A ; XID_Start +038C ; XID_Start +038E..03A1 ; XID_Start +03A3..03CE ; XID_Start +03D0..03F5 ; XID_Start +03F7..03FB ; XID_Start +0400..0481 ; XID_Start +048A..04CE ; XID_Start +04D0..04F5 ; XID_Start +04F8..04F9 ; XID_Start +0500..050F ; XID_Start +0531..0556 ; XID_Start +0559 ; XID_Start +0561..0587 ; XID_Start +05D0..05EA ; XID_Start +05F0..05F2 ; XID_Start +0621..063A ; XID_Start +0640 ; XID_Start +0641..064A ; XID_Start +066E..066F ; XID_Start +0671..06D3 ; XID_Start +06D5 ; XID_Start +06E5..06E6 ; XID_Start +06EE..06EF ; XID_Start +06FA..06FC ; XID_Start +06FF ; XID_Start +0710 ; XID_Start +0712..072F ; XID_Start +074D..074F ; XID_Start +0780..07A5 ; XID_Start +07B1 ; XID_Start +0904..0939 ; XID_Start +093D ; XID_Start +0950 ; XID_Start +0958..0961 ; XID_Start +0985..098C ; XID_Start +098F..0990 ; XID_Start +0993..09A8 ; XID_Start +09AA..09B0 ; XID_Start +09B2 ; XID_Start +09B6..09B9 ; XID_Start +09BD ; XID_Start +09DC..09DD ; XID_Start +09DF..09E1 ; XID_Start +09F0..09F1 ; XID_Start +0A05..0A0A ; XID_Start +0A0F..0A10 ; XID_Start +0A13..0A28 ; XID_Start +0A2A..0A30 ; XID_Start +0A32..0A33 ; XID_Start +0A35..0A36 ; XID_Start +0A38..0A39 ; XID_Start +0A59..0A5C ; XID_Start +0A5E ; XID_Start +0A72..0A74 ; XID_Start +0A85..0A8D ; XID_Start +0A8F..0A91 ; XID_Start +0A93..0AA8 ; XID_Start +0AAA..0AB0 ; XID_Start +0AB2..0AB3 ; XID_Start +0AB5..0AB9 ; XID_Start +0ABD ; XID_Start +0AD0 ; XID_Start +0AE0..0AE1 ; XID_Start +0B05..0B0C ; XID_Start +0B0F..0B10 ; XID_Start +0B13..0B28 ; XID_Start +0B2A..0B30 ; XID_Start +0B32..0B33 ; XID_Start +0B35..0B39 ; XID_Start +0B3D ; XID_Start +0B5C..0B5D ; XID_Start +0B5F..0B61 ; XID_Start +0B71 ; XID_Start +0B83 ; XID_Start +0B85..0B8A ; XID_Start +0B8E..0B90 ; XID_Start +0B92..0B95 ; XID_Start +0B99..0B9A ; XID_Start +0B9C ; XID_Start +0B9E..0B9F ; XID_Start +0BA3..0BA4 ; XID_Start +0BA8..0BAA ; XID_Start +0BAE..0BB5 ; XID_Start +0BB7..0BB9 ; XID_Start +0C05..0C0C ; XID_Start +0C0E..0C10 ; XID_Start +0C12..0C28 ; XID_Start +0C2A..0C33 ; XID_Start +0C35..0C39 ; XID_Start +0C60..0C61 ; XID_Start +0C85..0C8C ; XID_Start +0C8E..0C90 ; XID_Start +0C92..0CA8 ; XID_Start +0CAA..0CB3 ; XID_Start +0CB5..0CB9 ; XID_Start +0CBD ; XID_Start +0CDE ; XID_Start +0CE0..0CE1 ; XID_Start +0D05..0D0C ; XID_Start +0D0E..0D10 ; XID_Start +0D12..0D28 ; XID_Start +0D2A..0D39 ; XID_Start +0D60..0D61 ; XID_Start +0D85..0D96 ; XID_Start +0D9A..0DB1 ; XID_Start +0DB3..0DBB ; XID_Start +0DBD ; XID_Start +0DC0..0DC6 ; XID_Start +0E01..0E30 ; XID_Start +0E32 ; XID_Start +0E40..0E45 ; XID_Start +0E46 ; XID_Start +0E81..0E82 ; XID_Start +0E84 ; XID_Start +0E87..0E88 ; XID_Start +0E8A ; XID_Start +0E8D ; XID_Start +0E94..0E97 ; XID_Start +0E99..0E9F ; XID_Start +0EA1..0EA3 ; XID_Start +0EA5 ; XID_Start +0EA7 ; XID_Start +0EAA..0EAB ; XID_Start +0EAD..0EB0 ; XID_Start +0EB2 ; XID_Start +0EBD ; XID_Start +0EC0..0EC4 ; XID_Start +0EC6 ; XID_Start +0EDC..0EDD ; XID_Start +0F00 ; XID_Start +0F40..0F47 ; XID_Start +0F49..0F6A ; XID_Start +0F88..0F8B ; XID_Start +1000..1021 ; XID_Start +1023..1027 ; XID_Start +1029..102A ; XID_Start +1050..1055 ; XID_Start +10A0..10C5 ; XID_Start +10D0..10F8 ; XID_Start +1100..1159 ; XID_Start +115F..11A2 ; XID_Start +11A8..11F9 ; XID_Start +1200..1206 ; XID_Start +1208..1246 ; XID_Start +1248 ; XID_Start +124A..124D ; XID_Start +1250..1256 ; XID_Start +1258 ; XID_Start +125A..125D ; XID_Start +1260..1286 ; XID_Start +1288 ; XID_Start +128A..128D ; XID_Start +1290..12AE ; XID_Start +12B0 ; XID_Start +12B2..12B5 ; XID_Start +12B8..12BE ; XID_Start +12C0 ; XID_Start +12C2..12C5 ; XID_Start +12C8..12CE ; XID_Start +12D0..12D6 ; XID_Start +12D8..12EE ; XID_Start +12F0..130E ; XID_Start +1310 ; XID_Start +1312..1315 ; XID_Start +1318..131E ; XID_Start +1320..1346 ; XID_Start +1348..135A ; XID_Start +13A0..13F4 ; XID_Start +1401..166C ; XID_Start +166F..1676 ; XID_Start +1681..169A ; XID_Start +16A0..16EA ; XID_Start +16EE..16F0 ; XID_Start +1700..170C ; XID_Start +170E..1711 ; XID_Start +1720..1731 ; XID_Start +1740..1751 ; XID_Start +1760..176C ; XID_Start +176E..1770 ; XID_Start +1780..17B3 ; XID_Start +17D7 ; XID_Start +17DC ; XID_Start +1820..1842 ; XID_Start +1843 ; XID_Start +1844..1877 ; XID_Start +1880..18A8 ; XID_Start +1900..191C ; XID_Start +1950..196D ; XID_Start +1970..1974 ; XID_Start +1D00..1D2B ; XID_Start +1D2C..1D61 ; XID_Start +1D62..1D6B ; XID_Start +1E00..1E9B ; XID_Start +1EA0..1EF9 ; XID_Start +1F00..1F15 ; XID_Start +1F18..1F1D ; XID_Start +1F20..1F45 ; XID_Start +1F48..1F4D ; XID_Start +1F50..1F57 ; XID_Start +1F59 ; XID_Start +1F5B ; XID_Start +1F5D ; XID_Start +1F5F..1F7D ; XID_Start +1F80..1FB4 ; XID_Start +1FB6..1FBC ; XID_Start +1FBE ; XID_Start +1FC2..1FC4 ; XID_Start +1FC6..1FCC ; XID_Start +1FD0..1FD3 ; XID_Start +1FD6..1FDB ; XID_Start +1FE0..1FEC ; XID_Start +1FF2..1FF4 ; XID_Start +1FF6..1FFC ; XID_Start +2071 ; XID_Start +207F ; XID_Start +2102 ; XID_Start +2107 ; XID_Start +210A..2113 ; XID_Start +2115 ; XID_Start +2118 ; XID_Start +2119..211D ; XID_Start +2124 ; XID_Start +2126 ; XID_Start +2128 ; XID_Start +212A..212D ; XID_Start +212E ; XID_Start +212F..2131 ; XID_Start +2133..2134 ; XID_Start +2135..2138 ; XID_Start +2139 ; XID_Start +213D..213F ; XID_Start +2145..2149 ; XID_Start +2160..2183 ; XID_Start +3005 ; XID_Start +3006 ; XID_Start +3007 ; XID_Start +3021..3029 ; XID_Start +3031..3035 ; XID_Start +3038..303A ; XID_Start +303B ; XID_Start +303C ; XID_Start +3041..3096 ; XID_Start +309D..309E ; XID_Start +309F ; XID_Start +30A1..30FA ; XID_Start +30FC..30FE ; XID_Start +30FF ; XID_Start +3105..312C ; XID_Start +3131..318E ; XID_Start +31A0..31B7 ; XID_Start +31F0..31FF ; XID_Start +3400..4DB5 ; XID_Start +4E00..9FA5 ; XID_Start +A000..A48C ; XID_Start +AC00..D7A3 ; XID_Start +F900..FA2D ; XID_Start +FA30..FA6A ; XID_Start +FB00..FB06 ; XID_Start +FB13..FB17 ; XID_Start +FB1D ; XID_Start +FB1F..FB28 ; XID_Start +FB2A..FB36 ; XID_Start +FB38..FB3C ; XID_Start +FB3E ; XID_Start +FB40..FB41 ; XID_Start +FB43..FB44 ; XID_Start +FB46..FBB1 ; XID_Start +FBD3..FC5D ; XID_Start +FC64..FD3D ; XID_Start +FD50..FD8F ; XID_Start +FD92..FDC7 ; XID_Start +FDF0..FDF9 ; XID_Start +FE71 ; XID_Start +FE73 ; XID_Start +FE77 ; XID_Start +FE79 ; XID_Start +FE7B ; XID_Start +FE7D ; XID_Start +FE7F..FEFC ; XID_Start +FF21..FF3A ; XID_Start +FF41..FF5A ; XID_Start +FF66..FF6F ; XID_Start +FF70 ; XID_Start +FF71..FF9D ; XID_Start +FFA0..FFBE ; XID_Start +FFC2..FFC7 ; XID_Start +FFCA..FFCF ; XID_Start +FFD2..FFD7 ; XID_Start +FFDA..FFDC ; XID_Start +10000..1000B ; XID_Start +1000D..10026 ; XID_Start +10028..1003A ; XID_Start +1003C..1003D ; XID_Start +1003F..1004D ; XID_Start +10050..1005D ; XID_Start +10080..100FA ; XID_Start +10300..1031E ; XID_Start +10330..10349 ; XID_Start +1034A ; XID_Start +10380..1039D ; XID_Start +10400..1044F ; XID_Start +10450..1049D ; XID_Start +10800..10805 ; XID_Start +10808 ; XID_Start +1080A..10835 ; XID_Start +10837..10838 ; XID_Start +1083C ; XID_Start +1083F ; XID_Start +1D400..1D454 ; XID_Start +1D456..1D49C ; XID_Start +1D49E..1D49F ; XID_Start +1D4A2 ; XID_Start +1D4A5..1D4A6 ; XID_Start +1D4A9..1D4AC ; XID_Start +1D4AE..1D4B9 ; XID_Start +1D4BB ; XID_Start +1D4BD..1D4C3 ; XID_Start +1D4C5..1D505 ; XID_Start +1D507..1D50A ; XID_Start +1D50D..1D514 ; XID_Start +1D516..1D51C ; XID_Start +1D51E..1D539 ; XID_Start +1D53B..1D53E ; XID_Start +1D540..1D544 ; XID_Start +1D546 ; XID_Start +1D54A..1D550 ; XID_Start +1D552..1D6A3 ; XID_Start +1D6A8..1D6C0 ; XID_Start +1D6C2..1D6DA ; XID_Start +1D6DC..1D6FA ; XID_Start +1D6FC..1D714 ; XID_Start +1D716..1D734 ; XID_Start +1D736..1D74E ; XID_Start +1D750..1D76E ; XID_Start +1D770..1D788 ; XID_Start +1D78A..1D7A8 ; XID_Start +1D7AA..1D7C2 ; XID_Start +1D7C4..1D7C9 ; XID_Start +20000..2A6D6 ; XID_Start +2F800..2FA1D ; XID_Start # Total code points: 90581 @@ -2828,611 +2844,626 @@ FFDA..FFDC ; XID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGU # NOTE: Does NOT remove the non-NFKx characters. # Merely ensures that if isIdentifer(string) then isIdentifier(NFKx(string)) -0030..0039 ; XID_Continue # Nd [10] DIGIT ZERO..DIGIT NINE -0041..005A ; XID_Continue # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z -005F ; XID_Continue # Pc LOW LINE -0061..007A ; XID_Continue # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z -00AA ; XID_Continue # L& FEMININE ORDINAL INDICATOR -00B5 ; XID_Continue # L& MICRO SIGN -00B7 ; XID_Continue # Po MIDDLE DOT -00BA ; XID_Continue # L& MASCULINE ORDINAL INDICATOR -00C0..00D6 ; XID_Continue # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS -00D8..00F6 ; XID_Continue # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS -00F8..01BA ; XID_Continue # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL -01BB ; XID_Continue # Lo LATIN LETTER TWO WITH STROKE -01BC..01BF ; XID_Continue # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN -01C0..01C3 ; XID_Continue # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK -01C4..0236 ; XID_Continue # L& [115] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER T WITH CURL -0250..02AF ; XID_Continue # L& [96] LATIN SMALL LETTER TURNED A..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL -02B0..02C1 ; XID_Continue # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP -02C6..02D1 ; XID_Continue # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON -02E0..02E4 ; XID_Continue # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP -02EE ; XID_Continue # Lm MODIFIER LETTER DOUBLE APOSTROPHE -0300..0357 ; XID_Continue # Mn [88] COMBINING GRAVE ACCENT..COMBINING RIGHT HALF RING ABOVE -035D..036F ; XID_Continue # Mn [19] COMBINING DOUBLE BREVE..COMBINING LATIN SMALL LETTER X -0386 ; XID_Continue # L& GREEK CAPITAL LETTER ALPHA WITH TONOS -0388..038A ; XID_Continue # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS -038C ; XID_Continue # L& GREEK CAPITAL LETTER OMICRON WITH TONOS -038E..03A1 ; XID_Continue # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO -03A3..03CE ; XID_Continue # L& [44] GREEK CAPITAL LETTER SIGMA..GREEK SMALL LETTER OMEGA WITH TONOS -03D0..03F5 ; XID_Continue # L& [38] GREEK BETA SYMBOL..GREEK LUNATE EPSILON SYMBOL -03F7..03FB ; XID_Continue # L& [5] GREEK CAPITAL LETTER SHO..GREEK SMALL LETTER SAN -0400..0481 ; XID_Continue # L& [130] CYRILLIC CAPITAL LETTER IE WITH GRAVE..CYRILLIC SMALL LETTER KOPPA -0483..0486 ; XID_Continue # Mn [4] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC PSILI PNEUMATA -048A..04CE ; XID_Continue # L& [69] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EM WITH TAIL -04D0..04F5 ; XID_Continue # L& [38] CYRILLIC CAPITAL LETTER A WITH BREVE..CYRILLIC SMALL LETTER CHE WITH DIAERESIS -04F8..04F9 ; XID_Continue # L& [2] CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS..CYRILLIC SMALL LETTER YERU WITH DIAERESIS -0500..050F ; XID_Continue # L& [16] CYRILLIC CAPITAL LETTER KOMI DE..CYRILLIC SMALL LETTER KOMI TJE -0531..0556 ; XID_Continue # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH -0559 ; XID_Continue # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING -0561..0587 ; XID_Continue # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN -0591..05A1 ; XID_Continue # Mn [17] HEBREW ACCENT ETNAHTA..HEBREW ACCENT PAZER -05A3..05B9 ; XID_Continue # Mn [23] HEBREW ACCENT MUNAH..HEBREW POINT HOLAM -05BB..05BD ; XID_Continue # Mn [3] HEBREW POINT QUBUTS..HEBREW POINT METEG -05BF ; XID_Continue # Mn HEBREW POINT RAFE -05C1..05C2 ; XID_Continue # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT -05C4 ; XID_Continue # Mn HEBREW MARK UPPER DOT -05D0..05EA ; XID_Continue # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV -05F0..05F2 ; XID_Continue # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD -0610..0615 ; XID_Continue # Mn [6] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL HIGH TAH -0621..063A ; XID_Continue # Lo [26] ARABIC LETTER HAMZA..ARABIC LETTER GHAIN -0640 ; XID_Continue # Lm ARABIC TATWEEL -0641..064A ; XID_Continue # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH -064B..0658 ; XID_Continue # Mn [14] ARABIC FATHATAN..ARABIC MARK NOON GHUNNA -0660..0669 ; XID_Continue # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE -066E..066F ; XID_Continue # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF -0670 ; XID_Continue # Mn ARABIC LETTER SUPERSCRIPT ALEF -0671..06D3 ; XID_Continue # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE -06D5 ; XID_Continue # Lo ARABIC LETTER AE -06D6..06DC ; XID_Continue # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN -06DF..06E4 ; XID_Continue # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA -06E5..06E6 ; XID_Continue # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH -06E7..06E8 ; XID_Continue # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON -06EA..06ED ; XID_Continue # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM -06EE..06EF ; XID_Continue # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V -06F0..06F9 ; XID_Continue # Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE -06FA..06FC ; XID_Continue # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW -06FF ; XID_Continue # Lo ARABIC LETTER HEH WITH INVERTED V -0710 ; XID_Continue # Lo SYRIAC LETTER ALAPH -0711 ; XID_Continue # Mn SYRIAC LETTER SUPERSCRIPT ALAPH -0712..072F ; XID_Continue # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH -0730..074A ; XID_Continue # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH -074D..074F ; XID_Continue # Lo [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE -0780..07A5 ; XID_Continue # Lo [38] THAANA LETTER HAA..THAANA LETTER WAAVU -07A6..07B0 ; XID_Continue # Mn [11] THAANA ABAFILI..THAANA SUKUN -07B1 ; XID_Continue # Lo THAANA LETTER NAA -0901..0902 ; XID_Continue # Mn [2] DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN ANUSVARA -0903 ; XID_Continue # Mc DEVANAGARI SIGN VISARGA -0904..0939 ; XID_Continue # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA -093C ; XID_Continue # Mn DEVANAGARI SIGN NUKTA -093D ; XID_Continue # Lo DEVANAGARI SIGN AVAGRAHA -093E..0940 ; XID_Continue # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II -0941..0948 ; XID_Continue # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI -0949..094C ; XID_Continue # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU -094D ; XID_Continue # Mn DEVANAGARI SIGN VIRAMA -0950 ; XID_Continue # Lo DEVANAGARI OM -0951..0954 ; XID_Continue # Mn [4] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI ACUTE ACCENT -0958..0961 ; XID_Continue # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL -0962..0963 ; XID_Continue # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL -0966..096F ; XID_Continue # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE -0981 ; XID_Continue # Mn BENGALI SIGN CANDRABINDU -0982..0983 ; XID_Continue # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA -0985..098C ; XID_Continue # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L -098F..0990 ; XID_Continue # Lo [2] BENGALI LETTER E..BENGALI LETTER AI -0993..09A8 ; XID_Continue # Lo [22] BENGALI LETTER O..BENGALI LETTER NA -09AA..09B0 ; XID_Continue # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA -09B2 ; XID_Continue # Lo BENGALI LETTER LA -09B6..09B9 ; XID_Continue # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA -09BC ; XID_Continue # Mn BENGALI SIGN NUKTA -09BD ; XID_Continue # Lo BENGALI SIGN AVAGRAHA -09BE..09C0 ; XID_Continue # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II -09C1..09C4 ; XID_Continue # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR -09C7..09C8 ; XID_Continue # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI -09CB..09CC ; XID_Continue # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU -09CD ; XID_Continue # Mn BENGALI SIGN VIRAMA -09D7 ; XID_Continue # Mc BENGALI AU LENGTH MARK -09DC..09DD ; XID_Continue # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA -09DF..09E1 ; XID_Continue # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL -09E2..09E3 ; XID_Continue # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL -09E6..09EF ; XID_Continue # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE -09F0..09F1 ; XID_Continue # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL -0A01..0A02 ; XID_Continue # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI -0A03 ; XID_Continue # Mc GURMUKHI SIGN VISARGA -0A05..0A0A ; XID_Continue # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU -0A0F..0A10 ; XID_Continue # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI -0A13..0A28 ; XID_Continue # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA -0A2A..0A30 ; XID_Continue # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA -0A32..0A33 ; XID_Continue # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA -0A35..0A36 ; XID_Continue # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA -0A38..0A39 ; XID_Continue # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA -0A3C ; XID_Continue # Mn GURMUKHI SIGN NUKTA -0A3E..0A40 ; XID_Continue # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II -0A41..0A42 ; XID_Continue # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU -0A47..0A48 ; XID_Continue # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI -0A4B..0A4D ; XID_Continue # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA -0A59..0A5C ; XID_Continue # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA -0A5E ; XID_Continue # Lo GURMUKHI LETTER FA -0A66..0A6F ; XID_Continue # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE -0A70..0A71 ; XID_Continue # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK -0A72..0A74 ; XID_Continue # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR -0A81..0A82 ; XID_Continue # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA -0A83 ; XID_Continue # Mc GUJARATI SIGN VISARGA -0A85..0A8D ; XID_Continue # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E -0A8F..0A91 ; XID_Continue # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O -0A93..0AA8 ; XID_Continue # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA -0AAA..0AB0 ; XID_Continue # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA -0AB2..0AB3 ; XID_Continue # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA -0AB5..0AB9 ; XID_Continue # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA -0ABC ; XID_Continue # Mn GUJARATI SIGN NUKTA -0ABD ; XID_Continue # Lo GUJARATI SIGN AVAGRAHA -0ABE..0AC0 ; XID_Continue # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II -0AC1..0AC5 ; XID_Continue # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E -0AC7..0AC8 ; XID_Continue # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI -0AC9 ; XID_Continue # Mc GUJARATI VOWEL SIGN CANDRA O -0ACB..0ACC ; XID_Continue # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU -0ACD ; XID_Continue # Mn GUJARATI SIGN VIRAMA -0AD0 ; XID_Continue # Lo GUJARATI OM -0AE0..0AE1 ; XID_Continue # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL -0AE2..0AE3 ; XID_Continue # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL -0AE6..0AEF ; XID_Continue # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE -0B01 ; XID_Continue # Mn ORIYA SIGN CANDRABINDU -0B02..0B03 ; XID_Continue # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA -0B05..0B0C ; XID_Continue # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L -0B0F..0B10 ; XID_Continue # Lo [2] ORIYA LETTER E..ORIYA LETTER AI -0B13..0B28 ; XID_Continue # Lo [22] ORIYA LETTER O..ORIYA LETTER NA -0B2A..0B30 ; XID_Continue # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA -0B32..0B33 ; XID_Continue # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA -0B35..0B39 ; XID_Continue # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA -0B3C ; XID_Continue # Mn ORIYA SIGN NUKTA -0B3D ; XID_Continue # Lo ORIYA SIGN AVAGRAHA -0B3E ; XID_Continue # Mc ORIYA VOWEL SIGN AA -0B3F ; XID_Continue # Mn ORIYA VOWEL SIGN I -0B40 ; XID_Continue # Mc ORIYA VOWEL SIGN II -0B41..0B43 ; XID_Continue # Mn [3] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC R -0B47..0B48 ; XID_Continue # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI -0B4B..0B4C ; XID_Continue # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU -0B4D ; XID_Continue # Mn ORIYA SIGN VIRAMA -0B56 ; XID_Continue # Mn ORIYA AI LENGTH MARK -0B57 ; XID_Continue # Mc ORIYA AU LENGTH MARK -0B5C..0B5D ; XID_Continue # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA -0B5F..0B61 ; XID_Continue # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL -0B66..0B6F ; XID_Continue # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE -0B71 ; XID_Continue # Lo ORIYA LETTER WA -0B82 ; XID_Continue # Mn TAMIL SIGN ANUSVARA -0B83 ; XID_Continue # Lo TAMIL SIGN VISARGA -0B85..0B8A ; XID_Continue # Lo [6] TAMIL LETTER A..TAMIL LETTER UU -0B8E..0B90 ; XID_Continue # Lo [3] TAMIL LETTER E..TAMIL LETTER AI -0B92..0B95 ; XID_Continue # Lo [4] TAMIL LETTER O..TAMIL LETTER KA -0B99..0B9A ; XID_Continue # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA -0B9C ; XID_Continue # Lo TAMIL LETTER JA -0B9E..0B9F ; XID_Continue # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA -0BA3..0BA4 ; XID_Continue # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA -0BA8..0BAA ; XID_Continue # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA -0BAE..0BB5 ; XID_Continue # Lo [8] TAMIL LETTER MA..TAMIL LETTER VA -0BB7..0BB9 ; XID_Continue # Lo [3] TAMIL LETTER SSA..TAMIL LETTER HA -0BBE..0BBF ; XID_Continue # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I -0BC0 ; XID_Continue # Mn TAMIL VOWEL SIGN II -0BC1..0BC2 ; XID_Continue # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU -0BC6..0BC8 ; XID_Continue # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI -0BCA..0BCC ; XID_Continue # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU -0BCD ; XID_Continue # Mn TAMIL SIGN VIRAMA -0BD7 ; XID_Continue # Mc TAMIL AU LENGTH MARK -0BE7..0BEF ; XID_Continue # Nd [9] TAMIL DIGIT ONE..TAMIL DIGIT NINE -0C01..0C03 ; XID_Continue # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA -0C05..0C0C ; XID_Continue # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L -0C0E..0C10 ; XID_Continue # Lo [3] TELUGU LETTER E..TELUGU LETTER AI -0C12..0C28 ; XID_Continue # Lo [23] TELUGU LETTER O..TELUGU LETTER NA -0C2A..0C33 ; XID_Continue # Lo [10] TELUGU LETTER PA..TELUGU LETTER LLA -0C35..0C39 ; XID_Continue # Lo [5] TELUGU LETTER VA..TELUGU LETTER HA -0C3E..0C40 ; XID_Continue # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II -0C41..0C44 ; XID_Continue # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR -0C46..0C48 ; XID_Continue # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI -0C4A..0C4D ; XID_Continue # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA -0C55..0C56 ; XID_Continue # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK -0C60..0C61 ; XID_Continue # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL -0C66..0C6F ; XID_Continue # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE -0C82..0C83 ; XID_Continue # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA -0C85..0C8C ; XID_Continue # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L -0C8E..0C90 ; XID_Continue # Lo [3] KANNADA LETTER E..KANNADA LETTER AI -0C92..0CA8 ; XID_Continue # Lo [23] KANNADA LETTER O..KANNADA LETTER NA -0CAA..0CB3 ; XID_Continue # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA -0CB5..0CB9 ; XID_Continue # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA -0CBC ; XID_Continue # Mn KANNADA SIGN NUKTA -0CBD ; XID_Continue # Lo KANNADA SIGN AVAGRAHA -0CBE ; XID_Continue # Mc KANNADA VOWEL SIGN AA -0CBF ; XID_Continue # Mn KANNADA VOWEL SIGN I -0CC0..0CC4 ; XID_Continue # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR -0CC6 ; XID_Continue # Mn KANNADA VOWEL SIGN E -0CC7..0CC8 ; XID_Continue # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI -0CCA..0CCB ; XID_Continue # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO -0CCC..0CCD ; XID_Continue # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA -0CD5..0CD6 ; XID_Continue # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK -0CDE ; XID_Continue # Lo KANNADA LETTER FA -0CE0..0CE1 ; XID_Continue # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL -0CE6..0CEF ; XID_Continue # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE -0D02..0D03 ; XID_Continue # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA -0D05..0D0C ; XID_Continue # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L -0D0E..0D10 ; XID_Continue # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI -0D12..0D28 ; XID_Continue # Lo [23] MALAYALAM LETTER O..MALAYALAM LETTER NA -0D2A..0D39 ; XID_Continue # Lo [16] MALAYALAM LETTER PA..MALAYALAM LETTER HA -0D3E..0D40 ; XID_Continue # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II -0D41..0D43 ; XID_Continue # Mn [3] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC R -0D46..0D48 ; XID_Continue # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI -0D4A..0D4C ; XID_Continue # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU -0D4D ; XID_Continue # Mn MALAYALAM SIGN VIRAMA -0D57 ; XID_Continue # Mc MALAYALAM AU LENGTH MARK -0D60..0D61 ; XID_Continue # Lo [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL -0D66..0D6F ; XID_Continue # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE -0D82..0D83 ; XID_Continue # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA -0D85..0D96 ; XID_Continue # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA -0D9A..0DB1 ; XID_Continue # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA -0DB3..0DBB ; XID_Continue # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA -0DBD ; XID_Continue # Lo SINHALA LETTER DANTAJA LAYANNA -0DC0..0DC6 ; XID_Continue # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA -0DCA ; XID_Continue # Mn SINHALA SIGN AL-LAKUNA -0DCF..0DD1 ; XID_Continue # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA -0DD2..0DD4 ; XID_Continue # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA -0DD6 ; XID_Continue # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA -0DD8..0DDF ; XID_Continue # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA -0DF2..0DF3 ; XID_Continue # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA -0E01..0E30 ; XID_Continue # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A -0E31 ; XID_Continue # Mn THAI CHARACTER MAI HAN-AKAT -0E32..0E33 ; XID_Continue # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM -0E34..0E3A ; XID_Continue # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU -0E40..0E45 ; XID_Continue # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO -0E46 ; XID_Continue # Lm THAI CHARACTER MAIYAMOK -0E47..0E4E ; XID_Continue # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN -0E50..0E59 ; XID_Continue # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE -0E81..0E82 ; XID_Continue # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG -0E84 ; XID_Continue # Lo LAO LETTER KHO TAM -0E87..0E88 ; XID_Continue # Lo [2] LAO LETTER NGO..LAO LETTER CO -0E8A ; XID_Continue # Lo LAO LETTER SO TAM -0E8D ; XID_Continue # Lo LAO LETTER NYO -0E94..0E97 ; XID_Continue # Lo [4] LAO LETTER DO..LAO LETTER THO TAM -0E99..0E9F ; XID_Continue # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG -0EA1..0EA3 ; XID_Continue # Lo [3] LAO LETTER MO..LAO LETTER LO LING -0EA5 ; XID_Continue # Lo LAO LETTER LO LOOT -0EA7 ; XID_Continue # Lo LAO LETTER WO -0EAA..0EAB ; XID_Continue # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG -0EAD..0EB0 ; XID_Continue # Lo [4] LAO LETTER O..LAO VOWEL SIGN A -0EB1 ; XID_Continue # Mn LAO VOWEL SIGN MAI KAN -0EB2..0EB3 ; XID_Continue # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM -0EB4..0EB9 ; XID_Continue # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU -0EBB..0EBC ; XID_Continue # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO -0EBD ; XID_Continue # Lo LAO SEMIVOWEL SIGN NYO -0EC0..0EC4 ; XID_Continue # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI -0EC6 ; XID_Continue # Lm LAO KO LA -0EC8..0ECD ; XID_Continue # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA -0ED0..0ED9 ; XID_Continue # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE -0EDC..0EDD ; XID_Continue # Lo [2] LAO HO NO..LAO HO MO -0F00 ; XID_Continue # Lo TIBETAN SYLLABLE OM -0F18..0F19 ; XID_Continue # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS -0F20..0F29 ; XID_Continue # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE -0F35 ; XID_Continue # Mn TIBETAN MARK NGAS BZUNG NYI ZLA -0F37 ; XID_Continue # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS -0F39 ; XID_Continue # Mn TIBETAN MARK TSA -PHRU -0F3E..0F3F ; XID_Continue # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES -0F40..0F47 ; XID_Continue # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA -0F49..0F6A ; XID_Continue # Lo [34] TIBETAN LETTER NYA..TIBETAN LETTER FIXED-FORM RA -0F71..0F7E ; XID_Continue # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO -0F7F ; XID_Continue # Mc TIBETAN SIGN RNAM BCAD -0F80..0F84 ; XID_Continue # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA -0F86..0F87 ; XID_Continue # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS -0F88..0F8B ; XID_Continue # Lo [4] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN GRU MED RGYINGS -0F90..0F97 ; XID_Continue # Mn [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA -0F99..0FBC ; XID_Continue # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA -0FC6 ; XID_Continue # Mn TIBETAN SYMBOL PADMA GDAN -1000..1021 ; XID_Continue # Lo [34] MYANMAR LETTER KA..MYANMAR LETTER A -1023..1027 ; XID_Continue # Lo [5] MYANMAR LETTER I..MYANMAR LETTER E -1029..102A ; XID_Continue # Lo [2] MYANMAR LETTER O..MYANMAR LETTER AU -102C ; XID_Continue # Mc MYANMAR VOWEL SIGN AA -102D..1030 ; XID_Continue # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU -1031 ; XID_Continue # Mc MYANMAR VOWEL SIGN E -1032 ; XID_Continue # Mn MYANMAR VOWEL SIGN AI -1036..1037 ; XID_Continue # Mn [2] MYANMAR SIGN ANUSVARA..MYANMAR SIGN DOT BELOW -1038 ; XID_Continue # Mc MYANMAR SIGN VISARGA -1039 ; XID_Continue # Mn MYANMAR SIGN VIRAMA -1040..1049 ; XID_Continue # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE -1050..1055 ; XID_Continue # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL -1056..1057 ; XID_Continue # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR -1058..1059 ; XID_Continue # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL -10A0..10C5 ; XID_Continue # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE -10D0..10F8 ; XID_Continue # Lo [41] GEORGIAN LETTER AN..GEORGIAN LETTER ELIFI -1100..1159 ; XID_Continue # Lo [90] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH -115F..11A2 ; XID_Continue # Lo [68] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG SSANGARAEA -11A8..11F9 ; XID_Continue # Lo [82] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH -1200..1206 ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE HO -1208..1246 ; XID_Continue # Lo [63] ETHIOPIC SYLLABLE LA..ETHIOPIC SYLLABLE QO -1248 ; XID_Continue # Lo ETHIOPIC SYLLABLE QWA -124A..124D ; XID_Continue # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE -1250..1256 ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO -1258 ; XID_Continue # Lo ETHIOPIC SYLLABLE QHWA -125A..125D ; XID_Continue # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE -1260..1286 ; XID_Continue # Lo [39] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XO -1288 ; XID_Continue # Lo ETHIOPIC SYLLABLE XWA -128A..128D ; XID_Continue # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE -1290..12AE ; XID_Continue # Lo [31] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KO -12B0 ; XID_Continue # Lo ETHIOPIC SYLLABLE KWA -12B2..12B5 ; XID_Continue # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE -12B8..12BE ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO -12C0 ; XID_Continue # Lo ETHIOPIC SYLLABLE KXWA -12C2..12C5 ; XID_Continue # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE -12C8..12CE ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE WO -12D0..12D6 ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE PHARYNGEAL A..ETHIOPIC SYLLABLE PHARYNGEAL O -12D8..12EE ; XID_Continue # Lo [23] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE YO -12F0..130E ; XID_Continue # Lo [31] ETHIOPIC SYLLABLE DA..ETHIOPIC SYLLABLE GO -1310 ; XID_Continue # Lo ETHIOPIC SYLLABLE GWA -1312..1315 ; XID_Continue # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE -1318..131E ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE GGO -1320..1346 ; XID_Continue # Lo [39] ETHIOPIC SYLLABLE THA..ETHIOPIC SYLLABLE TZO -1348..135A ; XID_Continue # Lo [19] ETHIOPIC SYLLABLE FA..ETHIOPIC SYLLABLE FYA -1369..1371 ; XID_Continue # Nd [9] ETHIOPIC DIGIT ONE..ETHIOPIC DIGIT NINE -13A0..13F4 ; XID_Continue # Lo [85] CHEROKEE LETTER A..CHEROKEE LETTER YV -1401..166C ; XID_Continue # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA -166F..1676 ; XID_Continue # Lo [8] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS NNGAA -1681..169A ; XID_Continue # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH -16A0..16EA ; XID_Continue # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X -16EE..16F0 ; XID_Continue # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL -1700..170C ; XID_Continue # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA -170E..1711 ; XID_Continue # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA -1712..1714 ; XID_Continue # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA -1720..1731 ; XID_Continue # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA -1732..1734 ; XID_Continue # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD -1740..1751 ; XID_Continue # Lo [18] BUHID LETTER A..BUHID LETTER HA -1752..1753 ; XID_Continue # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U -1760..176C ; XID_Continue # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA -176E..1770 ; XID_Continue # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA -1772..1773 ; XID_Continue # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U -1780..17B3 ; XID_Continue # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU -17B6 ; XID_Continue # Mc KHMER VOWEL SIGN AA -17B7..17BD ; XID_Continue # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA -17BE..17C5 ; XID_Continue # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU -17C6 ; XID_Continue # Mn KHMER SIGN NIKAHIT -17C7..17C8 ; XID_Continue # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU -17C9..17D3 ; XID_Continue # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT -17D7 ; XID_Continue # Lm KHMER SIGN LEK TOO -17DC ; XID_Continue # Lo KHMER SIGN AVAKRAHASANYA -17DD ; XID_Continue # Mn KHMER SIGN ATTHACAN -17E0..17E9 ; XID_Continue # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE -180B..180D ; XID_Continue # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE -1810..1819 ; XID_Continue # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE -1820..1842 ; XID_Continue # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI -1843 ; XID_Continue # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN -1844..1877 ; XID_Continue # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA -1880..18A8 ; XID_Continue # Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA -18A9 ; XID_Continue # Mn MONGOLIAN LETTER ALI GALI DAGALGA -1900..191C ; XID_Continue # Lo [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA -1920..1922 ; XID_Continue # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U -1923..1926 ; XID_Continue # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU -1927..1928 ; XID_Continue # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O -1929..192B ; XID_Continue # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA -1930..1931 ; XID_Continue # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA -1932 ; XID_Continue # Mn LIMBU SMALL LETTER ANUSVARA -1933..1938 ; XID_Continue # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA -1939..193B ; XID_Continue # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I -1946..194F ; XID_Continue # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE -1950..196D ; XID_Continue # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI -1970..1974 ; XID_Continue # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 -1D00..1D2B ; XID_Continue # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL -1D2C..1D61 ; XID_Continue # Lm [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI -1D62..1D6B ; XID_Continue # L& [10] LATIN SUBSCRIPT SMALL LETTER I..LATIN SMALL LETTER UE -1E00..1E9B ; XID_Continue # L& [156] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER LONG S WITH DOT ABOVE -1EA0..1EF9 ; XID_Continue # L& [90] LATIN CAPITAL LETTER A WITH DOT BELOW..LATIN SMALL LETTER Y WITH TILDE -1F00..1F15 ; XID_Continue # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA -1F18..1F1D ; XID_Continue # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA -1F20..1F45 ; XID_Continue # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA -1F48..1F4D ; XID_Continue # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA -1F50..1F57 ; XID_Continue # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI -1F59 ; XID_Continue # L& GREEK CAPITAL LETTER UPSILON WITH DASIA -1F5B ; XID_Continue # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA -1F5D ; XID_Continue # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA -1F5F..1F7D ; XID_Continue # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA -1F80..1FB4 ; XID_Continue # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI -1FB6..1FBC ; XID_Continue # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI -1FBE ; XID_Continue # L& GREEK PROSGEGRAMMENI -1FC2..1FC4 ; XID_Continue # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI -1FC6..1FCC ; XID_Continue # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI -1FD0..1FD3 ; XID_Continue # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA -1FD6..1FDB ; XID_Continue # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA -1FE0..1FEC ; XID_Continue # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA -1FF2..1FF4 ; XID_Continue # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI -1FF6..1FFC ; XID_Continue # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI -203F..2040 ; XID_Continue # Pc [2] UNDERTIE..CHARACTER TIE -2054 ; XID_Continue # Pc INVERTED UNDERTIE -2071 ; XID_Continue # L& SUPERSCRIPT LATIN SMALL LETTER I -207F ; XID_Continue # L& SUPERSCRIPT LATIN SMALL LETTER N -20D0..20DC ; XID_Continue # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE -20E1 ; XID_Continue # Mn COMBINING LEFT RIGHT ARROW ABOVE -20E5..20EA ; XID_Continue # Mn [6] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING LEFTWARDS ARROW OVERLAY -2102 ; XID_Continue # L& DOUBLE-STRUCK CAPITAL C -2107 ; XID_Continue # L& EULER CONSTANT -210A..2113 ; XID_Continue # L& [10] SCRIPT SMALL G..SCRIPT SMALL L -2115 ; XID_Continue # L& DOUBLE-STRUCK CAPITAL N -2118 ; XID_Continue # So SCRIPT CAPITAL P -2119..211D ; XID_Continue # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R -2124 ; XID_Continue # L& DOUBLE-STRUCK CAPITAL Z -2126 ; XID_Continue # L& OHM SIGN -2128 ; XID_Continue # L& BLACK-LETTER CAPITAL Z -212A..212D ; XID_Continue # L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C -212E ; XID_Continue # So ESTIMATED SYMBOL -212F..2131 ; XID_Continue # L& [3] SCRIPT SMALL E..SCRIPT CAPITAL F -2133..2134 ; XID_Continue # L& [2] SCRIPT CAPITAL M..SCRIPT SMALL O -2135..2138 ; XID_Continue # Lo [4] ALEF SYMBOL..DALET SYMBOL -2139 ; XID_Continue # L& INFORMATION SOURCE -213D..213F ; XID_Continue # L& [3] DOUBLE-STRUCK SMALL GAMMA..DOUBLE-STRUCK CAPITAL PI -2145..2149 ; XID_Continue # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J -2160..2183 ; XID_Continue # Nl [36] ROMAN NUMERAL ONE..ROMAN NUMERAL REVERSED ONE HUNDRED -3005 ; XID_Continue # Lm IDEOGRAPHIC ITERATION MARK -3006 ; XID_Continue # Lo IDEOGRAPHIC CLOSING MARK -3007 ; XID_Continue # Nl IDEOGRAPHIC NUMBER ZERO -3021..3029 ; XID_Continue # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE -302A..302F ; XID_Continue # Mn [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK -3031..3035 ; XID_Continue # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF -3038..303A ; XID_Continue # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY -303B ; XID_Continue # Lm VERTICAL IDEOGRAPHIC ITERATION MARK -303C ; XID_Continue # Lo MASU MARK -3041..3096 ; XID_Continue # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE -3099..309A ; XID_Continue # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK -309D..309E ; XID_Continue # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK -309F ; XID_Continue # Lo HIRAGANA DIGRAPH YORI -30A1..30FA ; XID_Continue # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO -30FB ; XID_Continue # Pc KATAKANA MIDDLE DOT -30FC..30FE ; XID_Continue # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK -30FF ; XID_Continue # Lo KATAKANA DIGRAPH KOTO -3105..312C ; XID_Continue # Lo [40] BOPOMOFO LETTER B..BOPOMOFO LETTER GN -3131..318E ; XID_Continue # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE -31A0..31B7 ; XID_Continue # Lo [24] BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H -31F0..31FF ; XID_Continue # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO -3400..4DB5 ; XID_Continue # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 -4E00..9FA5 ; XID_Continue # Lo [20902] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FA5 -A000..A48C ; XID_Continue # Lo [1165] YI SYLLABLE IT..YI SYLLABLE YYR -AC00..D7A3 ; XID_Continue # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH -F900..FA2D ; XID_Continue # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D -FA30..FA6A ; XID_Continue # Lo [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A -FB00..FB06 ; XID_Continue # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST -FB13..FB17 ; XID_Continue # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH -FB1D ; XID_Continue # Lo HEBREW LETTER YOD WITH HIRIQ -FB1E ; XID_Continue # Mn HEBREW POINT JUDEO-SPANISH VARIKA -FB1F..FB28 ; XID_Continue # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV -FB2A..FB36 ; XID_Continue # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH -FB38..FB3C ; XID_Continue # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH -FB3E ; XID_Continue # Lo HEBREW LETTER MEM WITH DAGESH -FB40..FB41 ; XID_Continue # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH -FB43..FB44 ; XID_Continue # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH -FB46..FBB1 ; XID_Continue # Lo [108] HEBREW LETTER TSADI WITH DAGESH..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM -FBD3..FC5D ; XID_Continue # Lo [139] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM -FC64..FD3D ; XID_Continue # Lo [218] ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM -FD50..FD8F ; XID_Continue # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM -FD92..FDC7 ; XID_Continue # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM -FDF0..FDF9 ; XID_Continue # Lo [10] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE SALLA ISOLATED FORM -FE00..FE0F ; XID_Continue # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 -FE20..FE23 ; XID_Continue # Mn [4] COMBINING LIGATURE LEFT HALF..COMBINING DOUBLE TILDE RIGHT HALF -FE33..FE34 ; XID_Continue # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE -FE4D..FE4F ; XID_Continue # Pc [3] DASHED LOW LINE..WAVY LOW LINE -FE71 ; XID_Continue # Lo ARABIC TATWEEL WITH FATHATAN ABOVE -FE73 ; XID_Continue # Lo ARABIC TAIL FRAGMENT -FE77 ; XID_Continue # Lo ARABIC FATHA MEDIAL FORM -FE79 ; XID_Continue # Lo ARABIC DAMMA MEDIAL FORM -FE7B ; XID_Continue # Lo ARABIC KASRA MEDIAL FORM -FE7D ; XID_Continue # Lo ARABIC SHADDA MEDIAL FORM -FE7F..FEFC ; XID_Continue # Lo [126] ARABIC SUKUN MEDIAL FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM -FF10..FF19 ; XID_Continue # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE -FF21..FF3A ; XID_Continue # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z -FF3F ; XID_Continue # Pc FULLWIDTH LOW LINE -FF41..FF5A ; XID_Continue # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z -FF65 ; XID_Continue # Pc HALFWIDTH KATAKANA MIDDLE DOT -FF66..FF6F ; XID_Continue # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU -FF70 ; XID_Continue # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK -FF71..FF9D ; XID_Continue # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N -FF9E..FF9F ; XID_Continue # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK -FFA0..FFBE ; XID_Continue # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH -FFC2..FFC7 ; XID_Continue # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E -FFCA..FFCF ; XID_Continue # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE -FFD2..FFD7 ; XID_Continue # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU -FFDA..FFDC ; XID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I -10000..1000B ; XID_Continue # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE -1000D..10026 ; XID_Continue # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO -10028..1003A ; XID_Continue # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO -1003C..1003D ; XID_Continue # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE -1003F..1004D ; XID_Continue # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO -10050..1005D ; XID_Continue # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 -10080..100FA ; XID_Continue # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 -10300..1031E ; XID_Continue # Lo [31] OLD ITALIC LETTER A..OLD ITALIC LETTER UU -10330..10349 ; XID_Continue # Lo [26] GOTHIC LETTER AHSA..GOTHIC LETTER OTHAL -1034A ; XID_Continue # Nl GOTHIC LETTER NINE HUNDRED -10380..1039D ; XID_Continue # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU -10400..1044F ; XID_Continue # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW -10450..1049D ; XID_Continue # Lo [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO -104A0..104A9 ; XID_Continue # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE -10800..10805 ; XID_Continue # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA -10808 ; XID_Continue # Lo CYPRIOT SYLLABLE JO -1080A..10835 ; XID_Continue # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO -10837..10838 ; XID_Continue # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE -1083C ; XID_Continue # Lo CYPRIOT SYLLABLE ZA -1083F ; XID_Continue # Lo CYPRIOT SYLLABLE ZO -1D165..1D166 ; XID_Continue # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM -1D167..1D169 ; XID_Continue # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 -1D16D..1D172 ; XID_Continue # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 -1D17B..1D182 ; XID_Continue # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE -1D185..1D18B ; XID_Continue # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE -1D1AA..1D1AD ; XID_Continue # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO -1D400..1D454 ; XID_Continue # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G -1D456..1D49C ; XID_Continue # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A -1D49E..1D49F ; XID_Continue # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D -1D4A2 ; XID_Continue # L& MATHEMATICAL SCRIPT CAPITAL G -1D4A5..1D4A6 ; XID_Continue # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K -1D4A9..1D4AC ; XID_Continue # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q -1D4AE..1D4B9 ; XID_Continue # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D -1D4BB ; XID_Continue # L& MATHEMATICAL SCRIPT SMALL F -1D4BD..1D4C3 ; XID_Continue # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N -1D4C5..1D505 ; XID_Continue # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B -1D507..1D50A ; XID_Continue # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G -1D50D..1D514 ; XID_Continue # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q -1D516..1D51C ; XID_Continue # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y -1D51E..1D539 ; XID_Continue # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B -1D53B..1D53E ; XID_Continue # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G -1D540..1D544 ; XID_Continue # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M -1D546 ; XID_Continue # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O -1D54A..1D550 ; XID_Continue # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y -1D552..1D6A3 ; XID_Continue # L& [338] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL MONOSPACE SMALL Z -1D6A8..1D6C0 ; XID_Continue # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA -1D6C2..1D6DA ; XID_Continue # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA -1D6DC..1D6FA ; XID_Continue # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA -1D6FC..1D714 ; XID_Continue # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA -1D716..1D734 ; XID_Continue # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA -1D736..1D74E ; XID_Continue # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA -1D750..1D76E ; XID_Continue # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA -1D770..1D788 ; XID_Continue # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA -1D78A..1D7A8 ; XID_Continue # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA -1D7AA..1D7C2 ; XID_Continue # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA -1D7C4..1D7C9 ; XID_Continue # L& [6] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL -1D7CE..1D7FF ; XID_Continue # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE -20000..2A6D6 ; XID_Continue # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 -2F800..2FA1D ; XID_Continue # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D -E0100..E01EF ; XID_Continue # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 +0030..0039 ; XID_Continue +0041..005A ; XID_Continue +005F ; XID_Continue +0061..007A ; XID_Continue +00AA ; XID_Continue +00B5 ; XID_Continue +00B7 ; XID_Continue +00BA ; XID_Continue +00C0..00D6 ; XID_Continue +00D8..00F6 ; XID_Continue +00F8..01BA ; XID_Continue +01BB ; XID_Continue +01BC..01BF ; XID_Continue +01C0..01C3 ; XID_Continue +01C4..0236 ; XID_Continue +0250..02AF ; XID_Continue +02B0..02C1 ; XID_Continue +02C6..02D1 ; XID_Continue +02E0..02E4 ; XID_Continue +02EE ; XID_Continue +0300..0357 ; XID_Continue +035D..036F ; XID_Continue +0386 ; XID_Continue +0388..038A ; XID_Continue +038C ; XID_Continue +038E..03A1 ; XID_Continue +03A3..03CE ; XID_Continue +03D0..03F5 ; XID_Continue +03F7..03FB ; XID_Continue +0400..0481 ; XID_Continue +0483..0486 ; XID_Continue +048A..04CE ; XID_Continue +04D0..04F5 ; XID_Continue +04F8..04F9 ; XID_Continue +0500..050F ; XID_Continue +0531..0556 ; XID_Continue +0559 ; XID_Continue +0561..0587 ; XID_Continue +0591..05A1 ; XID_Continue +05A3..05B9 ; XID_Continue +05BB..05BD ; XID_Continue +05BF ; XID_Continue +05C1..05C2 ; XID_Continue +05C4 ; XID_Continue +05D0..05EA ; XID_Continue +05F0..05F2 ; XID_Continue +0610..0615 ; XID_Continue +0621..063A ; XID_Continue +0640 ; XID_Continue +0641..064A ; XID_Continue +064B..0658 ; XID_Continue +0660..0669 ; XID_Continue +066E..066F ; XID_Continue +0670 ; XID_Continue +0671..06D3 ; XID_Continue +06D5 ; XID_Continue +06D6..06DC ; XID_Continue +06DF..06E4 ; XID_Continue +06E5..06E6 ; XID_Continue +06E7..06E8 ; XID_Continue +06EA..06ED ; XID_Continue +06EE..06EF ; XID_Continue +06F0..06F9 ; XID_Continue +06FA..06FC ; XID_Continue +06FF ; XID_Continue +0710 ; XID_Continue +0711 ; XID_Continue +0712..072F ; XID_Continue +0730..074A ; XID_Continue +074D..074F ; XID_Continue +0780..07A5 ; XID_Continue +07A6..07B0 ; XID_Continue +07B1 ; XID_Continue +0901..0902 ; XID_Continue +0903 ; XID_Continue +0904..0939 ; XID_Continue +093C ; XID_Continue +093D ; XID_Continue +093E..0940 ; XID_Continue +0941..0948 ; XID_Continue +0949..094C ; XID_Continue +094D ; XID_Continue +0950 ; XID_Continue +0951..0954 ; XID_Continue +0958..0961 ; XID_Continue +0962..0963 ; XID_Continue +0966..096F ; XID_Continue +0981 ; XID_Continue +0982..0983 ; XID_Continue +0985..098C ; XID_Continue +098F..0990 ; XID_Continue +0993..09A8 ; XID_Continue +09AA..09B0 ; XID_Continue +09B2 ; XID_Continue +09B6..09B9 ; XID_Continue +09BC ; XID_Continue +09BD ; XID_Continue +09BE..09C0 ; XID_Continue +09C1..09C4 ; XID_Continue +09C7..09C8 ; XID_Continue +09CB..09CC ; XID_Continue +09CD ; XID_Continue +09D7 ; XID_Continue +09DC..09DD ; XID_Continue +09DF..09E1 ; XID_Continue +09E2..09E3 ; XID_Continue +09E6..09EF ; XID_Continue +09F0..09F1 ; XID_Continue +0A01..0A02 ; XID_Continue +0A03 ; XID_Continue +0A05..0A0A ; XID_Continue +0A0F..0A10 ; XID_Continue +0A13..0A28 ; XID_Continue +0A2A..0A30 ; XID_Continue +0A32..0A33 ; XID_Continue +0A35..0A36 ; XID_Continue +0A38..0A39 ; XID_Continue +0A3C ; XID_Continue +0A3E..0A40 ; XID_Continue +0A41..0A42 ; XID_Continue +0A47..0A48 ; XID_Continue +0A4B..0A4D ; XID_Continue +0A59..0A5C ; XID_Continue +0A5E ; XID_Continue +0A66..0A6F ; XID_Continue +0A70..0A71 ; XID_Continue +0A72..0A74 ; XID_Continue +0A81..0A82 ; XID_Continue +0A83 ; XID_Continue +0A85..0A8D ; XID_Continue +0A8F..0A91 ; XID_Continue +0A93..0AA8 ; XID_Continue +0AAA..0AB0 ; XID_Continue +0AB2..0AB3 ; XID_Continue +0AB5..0AB9 ; XID_Continue +0ABC ; XID_Continue +0ABD ; XID_Continue +0ABE..0AC0 ; XID_Continue +0AC1..0AC5 ; XID_Continue +0AC7..0AC8 ; XID_Continue +0AC9 ; XID_Continue +0ACB..0ACC ; XID_Continue +0ACD ; XID_Continue +0AD0 ; XID_Continue +0AE0..0AE1 ; XID_Continue +0AE2..0AE3 ; XID_Continue +0AE6..0AEF ; XID_Continue +0B01 ; XID_Continue +0B02..0B03 ; XID_Continue +0B05..0B0C ; XID_Continue +0B0F..0B10 ; XID_Continue +0B13..0B28 ; XID_Continue +0B2A..0B30 ; XID_Continue +0B32..0B33 ; XID_Continue +0B35..0B39 ; XID_Continue +0B3C ; XID_Continue +0B3D ; XID_Continue +0B3E ; XID_Continue +0B3F ; XID_Continue +0B40 ; XID_Continue +0B41..0B43 ; XID_Continue +0B47..0B48 ; XID_Continue +0B4B..0B4C ; XID_Continue +0B4D ; XID_Continue +0B56 ; XID_Continue +0B57 ; XID_Continue +0B5C..0B5D ; XID_Continue +0B5F..0B61 ; XID_Continue +0B66..0B6F ; XID_Continue +0B71 ; XID_Continue +0B82 ; XID_Continue +0B83 ; XID_Continue +0B85..0B8A ; XID_Continue +0B8E..0B90 ; XID_Continue +0B92..0B95 ; XID_Continue +0B99..0B9A ; XID_Continue +0B9C ; XID_Continue +0B9E..0B9F ; XID_Continue +0BA3..0BA4 ; XID_Continue +0BA8..0BAA ; XID_Continue +0BAE..0BB5 ; XID_Continue +0BB7..0BB9 ; XID_Continue +0BBE..0BBF ; XID_Continue +0BC0 ; XID_Continue +0BC1..0BC2 ; XID_Continue +0BC6..0BC8 ; XID_Continue +0BCA..0BCC ; XID_Continue +0BCD ; XID_Continue +0BD7 ; XID_Continue +0BE7..0BEF ; XID_Continue +0C01..0C03 ; XID_Continue +0C05..0C0C ; XID_Continue +0C0E..0C10 ; XID_Continue +0C12..0C28 ; XID_Continue +0C2A..0C33 ; XID_Continue +0C35..0C39 ; XID_Continue +0C3E..0C40 ; XID_Continue +0C41..0C44 ; XID_Continue +0C46..0C48 ; XID_Continue +0C4A..0C4D ; XID_Continue +0C55..0C56 ; XID_Continue +0C60..0C61 ; XID_Continue +0C66..0C6F ; XID_Continue +0C82..0C83 ; XID_Continue +0C85..0C8C ; XID_Continue +0C8E..0C90 ; XID_Continue +0C92..0CA8 ; XID_Continue +0CAA..0CB3 ; XID_Continue +0CB5..0CB9 ; XID_Continue +0CBC ; XID_Continue +0CBD ; XID_Continue +0CBE ; XID_Continue +0CBF ; XID_Continue +0CC0..0CC4 ; XID_Continue +0CC6 ; XID_Continue +0CC7..0CC8 ; XID_Continue +0CCA..0CCB ; XID_Continue +0CCC..0CCD ; XID_Continue +0CD5..0CD6 ; XID_Continue +0CDE ; XID_Continue +0CE0..0CE1 ; XID_Continue +0CE6..0CEF ; XID_Continue +0D02..0D03 ; XID_Continue +0D05..0D0C ; XID_Continue +0D0E..0D10 ; XID_Continue +0D12..0D28 ; XID_Continue +0D2A..0D39 ; XID_Continue +0D3E..0D40 ; XID_Continue +0D41..0D43 ; XID_Continue +0D46..0D48 ; XID_Continue +0D4A..0D4C ; XID_Continue +0D4D ; XID_Continue +0D57 ; XID_Continue +0D60..0D61 ; XID_Continue +0D66..0D6F ; XID_Continue +0D82..0D83 ; XID_Continue +0D85..0D96 ; XID_Continue +0D9A..0DB1 ; XID_Continue +0DB3..0DBB ; XID_Continue +0DBD ; XID_Continue +0DC0..0DC6 ; XID_Continue +0DCA ; XID_Continue +0DCF..0DD1 ; XID_Continue +0DD2..0DD4 ; XID_Continue +0DD6 ; XID_Continue +0DD8..0DDF ; XID_Continue +0DF2..0DF3 ; XID_Continue +0E01..0E30 ; XID_Continue +0E31 ; XID_Continue +0E32..0E33 ; XID_Continue +0E34..0E3A ; XID_Continue +0E40..0E45 ; XID_Continue +0E46 ; XID_Continue +0E47..0E4E ; XID_Continue +0E50..0E59 ; XID_Continue +0E81..0E82 ; XID_Continue +0E84 ; XID_Continue +0E87..0E88 ; XID_Continue +0E8A ; XID_Continue +0E8D ; XID_Continue +0E94..0E97 ; XID_Continue +0E99..0E9F ; XID_Continue +0EA1..0EA3 ; XID_Continue +0EA5 ; XID_Continue +0EA7 ; XID_Continue +0EAA..0EAB ; XID_Continue +0EAD..0EB0 ; XID_Continue +0EB1 ; XID_Continue +0EB2..0EB3 ; XID_Continue +0EB4..0EB9 ; XID_Continue +0EBB..0EBC ; XID_Continue +0EBD ; XID_Continue +0EC0..0EC4 ; XID_Continue +0EC6 ; XID_Continue +0EC8..0ECD ; XID_Continue +0ED0..0ED9 ; XID_Continue +0EDC..0EDD ; XID_Continue +0F00 ; XID_Continue +0F18..0F19 ; XID_Continue +0F20..0F29 ; XID_Continue +0F35 ; XID_Continue +0F37 ; XID_Continue +0F39 ; XID_Continue +0F3E..0F3F ; XID_Continue +0F40..0F47 ; XID_Continue +0F49..0F6A ; XID_Continue +0F71..0F7E ; XID_Continue +0F7F ; XID_Continue +0F80..0F84 ; XID_Continue +0F86..0F87 ; XID_Continue +0F88..0F8B ; XID_Continue +0F90..0F97 ; XID_Continue +0F99..0FBC ; XID_Continue +0FC6 ; XID_Continue +1000..1021 ; XID_Continue +1023..1027 ; XID_Continue +1029..102A ; XID_Continue +102C ; XID_Continue +102D..1030 ; XID_Continue +1031 ; XID_Continue +1032 ; XID_Continue +1036..1037 ; XID_Continue +1038 ; XID_Continue +1039 ; XID_Continue +1040..1049 ; XID_Continue +1050..1055 ; XID_Continue +1056..1057 ; XID_Continue +1058..1059 ; XID_Continue +10A0..10C5 ; XID_Continue +10D0..10F8 ; XID_Continue +1100..1159 ; XID_Continue +115F..11A2 ; XID_Continue +11A8..11F9 ; XID_Continue +1200..1206 ; XID_Continue +1208..1246 ; XID_Continue +1248 ; XID_Continue +124A..124D ; XID_Continue +1250..1256 ; XID_Continue +1258 ; XID_Continue +125A..125D ; XID_Continue +1260..1286 ; XID_Continue +1288 ; XID_Continue +128A..128D ; XID_Continue +1290..12AE ; XID_Continue +12B0 ; XID_Continue +12B2..12B5 ; XID_Continue +12B8..12BE ; XID_Continue +12C0 ; XID_Continue +12C2..12C5 ; XID_Continue +12C8..12CE ; XID_Continue +12D0..12D6 ; XID_Continue +12D8..12EE ; XID_Continue +12F0..130E ; XID_Continue +1310 ; XID_Continue +1312..1315 ; XID_Continue +1318..131E ; XID_Continue +1320..1346 ; XID_Continue +1348..135A ; XID_Continue +1369..1371 ; XID_Continue +13A0..13F4 ; XID_Continue +1401..166C ; XID_Continue +166F..1676 ; XID_Continue +1681..169A ; XID_Continue +16A0..16EA ; XID_Continue +16EE..16F0 ; XID_Continue +1700..170C ; XID_Continue +170E..1711 ; XID_Continue +1712..1714 ; XID_Continue +1720..1731 ; XID_Continue +1732..1734 ; XID_Continue +1740..1751 ; XID_Continue +1752..1753 ; XID_Continue +1760..176C ; XID_Continue +176E..1770 ; XID_Continue +1772..1773 ; XID_Continue +1780..17B3 ; XID_Continue +17B6 ; XID_Continue +17B7..17BD ; XID_Continue +17BE..17C5 ; XID_Continue +17C6 ; XID_Continue +17C7..17C8 ; XID_Continue +17C9..17D3 ; XID_Continue +17D7 ; XID_Continue +17DC ; XID_Continue +17DD ; XID_Continue +17E0..17E9 ; XID_Continue +180B..180D ; XID_Continue +1810..1819 ; XID_Continue +1820..1842 ; XID_Continue +1843 ; XID_Continue +1844..1877 ; XID_Continue +1880..18A8 ; XID_Continue +18A9 ; XID_Continue +1900..191C ; XID_Continue +1920..1922 ; XID_Continue +1923..1926 ; XID_Continue +1927..1928 ; XID_Continue +1929..192B ; XID_Continue +1930..1931 ; XID_Continue +1932 ; XID_Continue +1933..1938 ; XID_Continue +1939..193B ; XID_Continue +1946..194F ; XID_Continue +1950..196D ; XID_Continue +1970..1974 ; XID_Continue +1D00..1D2B ; XID_Continue +1D2C..1D61 ; XID_Continue +1D62..1D6B ; XID_Continue +1E00..1E9B ; XID_Continue +1EA0..1EF9 ; XID_Continue +1F00..1F15 ; XID_Continue +1F18..1F1D ; XID_Continue +1F20..1F45 ; XID_Continue +1F48..1F4D ; XID_Continue +1F50..1F57 ; XID_Continue +1F59 ; XID_Continue +1F5B ; XID_Continue +1F5D ; XID_Continue +1F5F..1F7D ; XID_Continue +1F80..1FB4 ; XID_Continue +1FB6..1FBC ; XID_Continue +1FBE ; XID_Continue +1FC2..1FC4 ; XID_Continue +1FC6..1FCC ; XID_Continue +1FD0..1FD3 ; XID_Continue +1FD6..1FDB ; XID_Continue +1FE0..1FEC ; XID_Continue +1FF2..1FF4 ; XID_Continue +1FF6..1FFC ; XID_Continue +203F..2040 ; XID_Continue +2054 ; XID_Continue +2071 ; XID_Continue +207F ; XID_Continue +20D0..20DC ; XID_Continue +20E1 ; XID_Continue +20E5..20EA ; XID_Continue +2102 ; XID_Continue +2107 ; XID_Continue +210A..2113 ; XID_Continue +2115 ; XID_Continue +2118 ; XID_Continue +2119..211D ; XID_Continue +2124 ; XID_Continue +2126 ; XID_Continue +2128 ; XID_Continue +212A..212D ; XID_Continue +212E ; XID_Continue +212F..2131 ; XID_Continue +2133..2134 ; XID_Continue +2135..2138 ; XID_Continue +2139 ; XID_Continue +213D..213F ; XID_Continue +2145..2149 ; XID_Continue +2160..2183 ; XID_Continue +3005 ; XID_Continue +3006 ; XID_Continue +3007 ; XID_Continue +3021..3029 ; XID_Continue +302A..302F ; XID_Continue +3031..3035 ; XID_Continue +3038..303A ; XID_Continue +303B ; XID_Continue +303C ; XID_Continue +3041..3096 ; XID_Continue +3099..309A ; XID_Continue +309D..309E ; XID_Continue +309F ; XID_Continue +30A1..30FA ; XID_Continue +30FB ; XID_Continue +30FC..30FE ; XID_Continue +30FF ; XID_Continue +3105..312C ; XID_Continue +3131..318E ; XID_Continue +31A0..31B7 ; XID_Continue +31F0..31FF ; XID_Continue +3400..4DB5 ; XID_Continue +4E00..9FA5 ; XID_Continue +A000..A48C ; XID_Continue +AC00..D7A3 ; XID_Continue +F900..FA2D ; XID_Continue +FA30..FA6A ; XID_Continue +FB00..FB06 ; XID_Continue +FB13..FB17 ; XID_Continue +FB1D ; XID_Continue +FB1E ; XID_Continue +FB1F..FB28 ; XID_Continue +FB2A..FB36 ; XID_Continue +FB38..FB3C ; XID_Continue +FB3E ; XID_Continue +FB40..FB41 ; XID_Continue +FB43..FB44 ; XID_Continue +FB46..FBB1 ; XID_Continue +FBD3..FC5D ; XID_Continue +FC64..FD3D ; XID_Continue +FD50..FD8F ; XID_Continue +FD92..FDC7 ; XID_Continue +FDF0..FDF9 ; XID_Continue +FE00..FE0F ; XID_Continue +FE20..FE23 ; XID_Continue +FE33..FE34 ; XID_Continue +FE4D..FE4F ; XID_Continue +FE71 ; XID_Continue +FE73 ; XID_Continue +FE77 ; XID_Continue +FE79 ; XID_Continue +FE7B ; XID_Continue +FE7D ; XID_Continue +FE7F..FEFC ; XID_Continue +FF10..FF19 ; XID_Continue +FF21..FF3A ; XID_Continue +FF3F ; XID_Continue +FF41..FF5A ; XID_Continue +FF65 ; XID_Continue +FF66..FF6F ; XID_Continue +FF70 ; XID_Continue +FF71..FF9D ; XID_Continue +FF9E..FF9F ; XID_Continue +FFA0..FFBE ; XID_Continue +FFC2..FFC7 ; XID_Continue +FFCA..FFCF ; XID_Continue +FFD2..FFD7 ; XID_Continue +FFDA..FFDC ; XID_Continue +10000..1000B ; XID_Continue +1000D..10026 ; XID_Continue +10028..1003A ; XID_Continue +1003C..1003D ; XID_Continue +1003F..1004D ; XID_Continue +10050..1005D ; XID_Continue +10080..100FA ; XID_Continue +10300..1031E ; XID_Continue +10330..10349 ; XID_Continue +1034A ; XID_Continue +10380..1039D ; XID_Continue +10400..1044F ; XID_Continue +10450..1049D ; XID_Continue +104A0..104A9 ; XID_Continue +10800..10805 ; XID_Continue +10808 ; XID_Continue +1080A..10835 ; XID_Continue +10837..10838 ; XID_Continue +1083C ; XID_Continue +1083F ; XID_Continue +1D165..1D166 ; XID_Continue +1D167..1D169 ; XID_Continue +1D16D..1D172 ; XID_Continue +1D17B..1D182 ; XID_Continue +1D185..1D18B ; XID_Continue +1D1AA..1D1AD ; XID_Continue +1D400..1D454 ; XID_Continue +1D456..1D49C ; XID_Continue +1D49E..1D49F ; XID_Continue +1D4A2 ; XID_Continue +1D4A5..1D4A6 ; XID_Continue +1D4A9..1D4AC ; XID_Continue +1D4AE..1D4B9 ; XID_Continue +1D4BB ; XID_Continue +1D4BD..1D4C3 ; XID_Continue +1D4C5..1D505 ; XID_Continue +1D507..1D50A ; XID_Continue +1D50D..1D514 ; XID_Continue +1D516..1D51C ; XID_Continue +1D51E..1D539 ; XID_Continue +1D53B..1D53E ; XID_Continue +1D540..1D544 ; XID_Continue +1D546 ; XID_Continue +1D54A..1D550 ; XID_Continue +1D552..1D6A3 ; XID_Continue +1D6A8..1D6C0 ; XID_Continue +1D6C2..1D6DA ; XID_Continue +1D6DC..1D6FA ; XID_Continue +1D6FC..1D714 ; XID_Continue +1D716..1D734 ; XID_Continue +1D736..1D74E ; XID_Continue +1D750..1D76E ; XID_Continue +1D770..1D788 ; XID_Continue +1D78A..1D7A8 ; XID_Continue +1D7AA..1D7C2 ; XID_Continue +1D7C4..1D7C9 ; XID_Continue +1D7CE..1D7FF ; XID_Continue +20000..2A6D6 ; XID_Continue +2F800..2FA1D ; XID_Continue +E0100..E01EF ; XID_Continue # Total code points: 91797 # ================================================ # Derived Property: Default_Ignorable_Code_Point -# Generated from Other_Default_Ignorable_Code_Point + Cf + Cc + Cs - White_Space +# Generated from Other_Default_Ignorable_Code_Point + Cf + Cc + Cs + Noncharacters - White_Space - Annotation_characters -0000..0008 ; Default_Ignorable_Code_Point # Cc [9] .. -000E..001F ; Default_Ignorable_Code_Point # Cc [18] .. -007F..0084 ; Default_Ignorable_Code_Point # Cc [6] .. -0086..009F ; Default_Ignorable_Code_Point # Cc [26] .. -00AD ; Default_Ignorable_Code_Point # Cf SOFT HYPHEN -034F ; Default_Ignorable_Code_Point # Mn COMBINING GRAPHEME JOINER -0600..0603 ; Default_Ignorable_Code_Point # Cf [4] ARABIC NUMBER SIGN..ARABIC SIGN SAFHA -06DD ; Default_Ignorable_Code_Point # Cf ARABIC END OF AYAH -070F ; Default_Ignorable_Code_Point # Cf SYRIAC ABBREVIATION MARK -115F..1160 ; Default_Ignorable_Code_Point # Lo [2] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG FILLER -17B4..17B5 ; Default_Ignorable_Code_Point # Cf [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA -180B..180D ; Default_Ignorable_Code_Point # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE -200B ; Default_Ignorable_Code_Point # Zs ZERO WIDTH SPACE -200C..200F ; Default_Ignorable_Code_Point # Cf [4] ZERO WIDTH NON-JOINER..RIGHT-TO-LEFT MARK -202A..202E ; Default_Ignorable_Code_Point # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE -2060..2063 ; Default_Ignorable_Code_Point # Cf [4] WORD JOINER..INVISIBLE SEPARATOR -2064..2069 ; Default_Ignorable_Code_Point # Cn [6] -206A..206F ; Default_Ignorable_Code_Point # Cf [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES -3164 ; Default_Ignorable_Code_Point # Lo HANGUL FILLER -D800..DFFF ; Default_Ignorable_Code_Point # Cs [2048] -FE00..FE0F ; Default_Ignorable_Code_Point # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 -FEFF ; Default_Ignorable_Code_Point # Cf ZERO WIDTH NO-BREAK SPACE -FFA0 ; Default_Ignorable_Code_Point # Lo HALFWIDTH HANGUL FILLER -FFF0..FFF8 ; Default_Ignorable_Code_Point # Cn [9] -FFF9..FFFB ; Default_Ignorable_Code_Point # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR -1D173..1D17A ; Default_Ignorable_Code_Point # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE -E0000 ; Default_Ignorable_Code_Point # Cn -E0001 ; Default_Ignorable_Code_Point # Cf LANGUAGE TAG -E0002..E001F ; Default_Ignorable_Code_Point # Cn [30] -E0020..E007F ; Default_Ignorable_Code_Point # Cf [96] TAG SPACE..CANCEL TAG -E0080..E00FF ; Default_Ignorable_Code_Point # Cn [128] -E0100..E01EF ; Default_Ignorable_Code_Point # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -E01F0..E0FFF ; Default_Ignorable_Code_Point # Cn [3600] +0000..0008 ; Default_Ignorable_Code_Point +000E..001F ; Default_Ignorable_Code_Point +007F..0084 ; Default_Ignorable_Code_Point +0086..009F ; Default_Ignorable_Code_Point +00AD ; Default_Ignorable_Code_Point +034F ; Default_Ignorable_Code_Point +0600..0603 ; Default_Ignorable_Code_Point +06DD ; Default_Ignorable_Code_Point +070F ; Default_Ignorable_Code_Point +115F..1160 ; Default_Ignorable_Code_Point +17B4..17B5 ; Default_Ignorable_Code_Point +180B..180D ; Default_Ignorable_Code_Point +200B..200F ; Default_Ignorable_Code_Point +202A..202E ; Default_Ignorable_Code_Point +2060..2063 ; Default_Ignorable_Code_Point +2064..2069 ; Default_Ignorable_Code_Point +206A..206F ; Default_Ignorable_Code_Point +3164 ; Default_Ignorable_Code_Point +D800..DFFF ; Default_Ignorable_Code_Point +FDD0..FDEF ; Default_Ignorable_Code_Point +FE00..FE0F ; Default_Ignorable_Code_Point +FEFF ; Default_Ignorable_Code_Point +FFA0 ; Default_Ignorable_Code_Point +FFF0..FFF8 ; Default_Ignorable_Code_Point +FFFE..FFFF ; Default_Ignorable_Code_Point +1D173..1D17A ; Default_Ignorable_Code_Point +1FFFE..1FFFF ; Default_Ignorable_Code_Point +2FFFE..2FFFF ; Default_Ignorable_Code_Point +3FFFE..3FFFF ; Default_Ignorable_Code_Point +4FFFE..4FFFF ; Default_Ignorable_Code_Point +5FFFE..5FFFF ; Default_Ignorable_Code_Point +6FFFE..6FFFF ; Default_Ignorable_Code_Point +7FFFE..7FFFF ; Default_Ignorable_Code_Point +8FFFE..8FFFF ; Default_Ignorable_Code_Point +9FFFE..9FFFF ; Default_Ignorable_Code_Point +AFFFE..AFFFF ; Default_Ignorable_Code_Point +BFFFE..BFFFF ; Default_Ignorable_Code_Point +CFFFE..CFFFF ; Default_Ignorable_Code_Point +DFFFE..E0000 ; Default_Ignorable_Code_Point +E0001 ; Default_Ignorable_Code_Point +E0002..E001F ; Default_Ignorable_Code_Point +E0020..E007F ; Default_Ignorable_Code_Point +E0080..E00FF ; Default_Ignorable_Code_Point +E0100..E01EF ; Default_Ignorable_Code_Point +E01F0..E0FFF ; Default_Ignorable_Code_Point +EFFFE..EFFFF ; Default_Ignorable_Code_Point +FFFFE..FFFFF ; Default_Ignorable_Code_Point +10FFFE..10FFFF; Default_Ignorable_Code_Point -# Total code points: 6283 +# Total code points: 6346 # ================================================ @@ -3441,139 +3472,141 @@ E01F0..E0FFF ; Default_Ignorable_Code_Point # Cn [3600] # Note: depending on an application's interpretation of Co (private use), # they may be either in Grapheme_Base, or in Grapheme_Extend, or in neither. -0300..0357 ; Grapheme_Extend # Mn [88] COMBINING GRAVE ACCENT..COMBINING RIGHT HALF RING ABOVE -035D..036F ; Grapheme_Extend # Mn [19] COMBINING DOUBLE BREVE..COMBINING LATIN SMALL LETTER X -0483..0486 ; Grapheme_Extend # Mn [4] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC PSILI PNEUMATA -0488..0489 ; Grapheme_Extend # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN -0591..05A1 ; Grapheme_Extend # Mn [17] HEBREW ACCENT ETNAHTA..HEBREW ACCENT PAZER -05A3..05B9 ; Grapheme_Extend # Mn [23] HEBREW ACCENT MUNAH..HEBREW POINT HOLAM -05BB..05BD ; Grapheme_Extend # Mn [3] HEBREW POINT QUBUTS..HEBREW POINT METEG -05BF ; Grapheme_Extend # Mn HEBREW POINT RAFE -05C1..05C2 ; Grapheme_Extend # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT -05C4 ; Grapheme_Extend # Mn HEBREW MARK UPPER DOT -0610..0615 ; Grapheme_Extend # Mn [6] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL HIGH TAH -064B..0658 ; Grapheme_Extend # Mn [14] ARABIC FATHATAN..ARABIC MARK NOON GHUNNA -0670 ; Grapheme_Extend # Mn ARABIC LETTER SUPERSCRIPT ALEF -06D6..06DC ; Grapheme_Extend # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN -06DE ; Grapheme_Extend # Me ARABIC START OF RUB EL HIZB -06DF..06E4 ; Grapheme_Extend # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA -06E7..06E8 ; Grapheme_Extend # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON -06EA..06ED ; Grapheme_Extend # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM -0711 ; Grapheme_Extend # Mn SYRIAC LETTER SUPERSCRIPT ALAPH -0730..074A ; Grapheme_Extend # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH -07A6..07B0 ; Grapheme_Extend # Mn [11] THAANA ABAFILI..THAANA SUKUN -0901..0902 ; Grapheme_Extend # Mn [2] DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN ANUSVARA -093C ; Grapheme_Extend # Mn DEVANAGARI SIGN NUKTA -0941..0948 ; Grapheme_Extend # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI -094D ; Grapheme_Extend # Mn DEVANAGARI SIGN VIRAMA -0951..0954 ; Grapheme_Extend # Mn [4] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI ACUTE ACCENT -0962..0963 ; Grapheme_Extend # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL -0981 ; Grapheme_Extend # Mn BENGALI SIGN CANDRABINDU -09BC ; Grapheme_Extend # Mn BENGALI SIGN NUKTA -09BE ; Grapheme_Extend # Mc BENGALI VOWEL SIGN AA -09C1..09C4 ; Grapheme_Extend # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR -09CD ; Grapheme_Extend # Mn BENGALI SIGN VIRAMA -09D7 ; Grapheme_Extend # Mc BENGALI AU LENGTH MARK -09E2..09E3 ; Grapheme_Extend # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL -0A01..0A02 ; Grapheme_Extend # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI -0A3C ; Grapheme_Extend # Mn GURMUKHI SIGN NUKTA -0A41..0A42 ; Grapheme_Extend # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU -0A47..0A48 ; Grapheme_Extend # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI -0A4B..0A4D ; Grapheme_Extend # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA -0A70..0A71 ; Grapheme_Extend # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK -0A81..0A82 ; Grapheme_Extend # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA -0ABC ; Grapheme_Extend # Mn GUJARATI SIGN NUKTA -0AC1..0AC5 ; Grapheme_Extend # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E -0AC7..0AC8 ; Grapheme_Extend # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI -0ACD ; Grapheme_Extend # Mn GUJARATI SIGN VIRAMA -0AE2..0AE3 ; Grapheme_Extend # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL -0B01 ; Grapheme_Extend # Mn ORIYA SIGN CANDRABINDU -0B3C ; Grapheme_Extend # Mn ORIYA SIGN NUKTA -0B3E ; Grapheme_Extend # Mc ORIYA VOWEL SIGN AA -0B3F ; Grapheme_Extend # Mn ORIYA VOWEL SIGN I -0B41..0B43 ; Grapheme_Extend # Mn [3] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC R -0B4D ; Grapheme_Extend # Mn ORIYA SIGN VIRAMA -0B56 ; Grapheme_Extend # Mn ORIYA AI LENGTH MARK -0B57 ; Grapheme_Extend # Mc ORIYA AU LENGTH MARK -0B82 ; Grapheme_Extend # Mn TAMIL SIGN ANUSVARA -0BBE ; Grapheme_Extend # Mc TAMIL VOWEL SIGN AA -0BC0 ; Grapheme_Extend # Mn TAMIL VOWEL SIGN II -0BCD ; Grapheme_Extend # Mn TAMIL SIGN VIRAMA -0BD7 ; Grapheme_Extend # Mc TAMIL AU LENGTH MARK -0C3E..0C40 ; Grapheme_Extend # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II -0C46..0C48 ; Grapheme_Extend # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI -0C4A..0C4D ; Grapheme_Extend # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA -0C55..0C56 ; Grapheme_Extend # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK -0CBC ; Grapheme_Extend # Mn KANNADA SIGN NUKTA -0CBF ; Grapheme_Extend # Mn KANNADA VOWEL SIGN I -0CC2 ; Grapheme_Extend # Mc KANNADA VOWEL SIGN UU -0CC6 ; Grapheme_Extend # Mn KANNADA VOWEL SIGN E -0CCC..0CCD ; Grapheme_Extend # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA -0CD5..0CD6 ; Grapheme_Extend # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK -0D3E ; Grapheme_Extend # Mc MALAYALAM VOWEL SIGN AA -0D41..0D43 ; Grapheme_Extend # Mn [3] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC R -0D4D ; Grapheme_Extend # Mn MALAYALAM SIGN VIRAMA -0D57 ; Grapheme_Extend # Mc MALAYALAM AU LENGTH MARK -0DCA ; Grapheme_Extend # Mn SINHALA SIGN AL-LAKUNA -0DCF ; Grapheme_Extend # Mc SINHALA VOWEL SIGN AELA-PILLA -0DD2..0DD4 ; Grapheme_Extend # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA -0DD6 ; Grapheme_Extend # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA -0DDF ; Grapheme_Extend # Mc SINHALA VOWEL SIGN GAYANUKITTA -0E31 ; Grapheme_Extend # Mn THAI CHARACTER MAI HAN-AKAT -0E34..0E3A ; Grapheme_Extend # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU -0E47..0E4E ; Grapheme_Extend # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN -0EB1 ; Grapheme_Extend # Mn LAO VOWEL SIGN MAI KAN -0EB4..0EB9 ; Grapheme_Extend # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU -0EBB..0EBC ; Grapheme_Extend # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO -0EC8..0ECD ; Grapheme_Extend # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA -0F18..0F19 ; Grapheme_Extend # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS -0F35 ; Grapheme_Extend # Mn TIBETAN MARK NGAS BZUNG NYI ZLA -0F37 ; Grapheme_Extend # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS -0F39 ; Grapheme_Extend # Mn TIBETAN MARK TSA -PHRU -0F71..0F7E ; Grapheme_Extend # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO -0F80..0F84 ; Grapheme_Extend # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA -0F86..0F87 ; Grapheme_Extend # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS -0F90..0F97 ; Grapheme_Extend # Mn [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA -0F99..0FBC ; Grapheme_Extend # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA -0FC6 ; Grapheme_Extend # Mn TIBETAN SYMBOL PADMA GDAN -102D..1030 ; Grapheme_Extend # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU -1032 ; Grapheme_Extend # Mn MYANMAR VOWEL SIGN AI -1036..1037 ; Grapheme_Extend # Mn [2] MYANMAR SIGN ANUSVARA..MYANMAR SIGN DOT BELOW -1039 ; Grapheme_Extend # Mn MYANMAR SIGN VIRAMA -1058..1059 ; Grapheme_Extend # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL -1712..1714 ; Grapheme_Extend # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA -1732..1734 ; Grapheme_Extend # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD -1752..1753 ; Grapheme_Extend # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U -1772..1773 ; Grapheme_Extend # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U -17B7..17BD ; Grapheme_Extend # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA -17C6 ; Grapheme_Extend # Mn KHMER SIGN NIKAHIT -17C9..17D3 ; Grapheme_Extend # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT -17DD ; Grapheme_Extend # Mn KHMER SIGN ATTHACAN -180B..180D ; Grapheme_Extend # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE -18A9 ; Grapheme_Extend # Mn MONGOLIAN LETTER ALI GALI DAGALGA -1920..1922 ; Grapheme_Extend # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U -1927..1928 ; Grapheme_Extend # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O -1932 ; Grapheme_Extend # Mn LIMBU SMALL LETTER ANUSVARA -1939..193B ; Grapheme_Extend # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I -20D0..20DC ; Grapheme_Extend # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE -20DD..20E0 ; Grapheme_Extend # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH -20E1 ; Grapheme_Extend # Mn COMBINING LEFT RIGHT ARROW ABOVE -20E2..20E4 ; Grapheme_Extend # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE -20E5..20EA ; Grapheme_Extend # Mn [6] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING LEFTWARDS ARROW OVERLAY -302A..302F ; Grapheme_Extend # Mn [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK -3099..309A ; Grapheme_Extend # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK -FB1E ; Grapheme_Extend # Mn HEBREW POINT JUDEO-SPANISH VARIKA -FE00..FE0F ; Grapheme_Extend # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 -FE20..FE23 ; Grapheme_Extend # Mn [4] COMBINING LIGATURE LEFT HALF..COMBINING DOUBLE TILDE RIGHT HALF -1D165 ; Grapheme_Extend # Mc MUSICAL SYMBOL COMBINING STEM -1D167..1D169 ; Grapheme_Extend # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 -1D16E..1D16F ; Grapheme_Extend # Mc [2] MUSICAL SYMBOL COMBINING FLAG-1..MUSICAL SYMBOL COMBINING FLAG-2 -1D17B..1D182 ; Grapheme_Extend # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE -1D185..1D18B ; Grapheme_Extend # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE -1D1AA..1D1AD ; Grapheme_Extend # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO -E0100..E01EF ; Grapheme_Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 +0300..0357 ; Grapheme_Extend +035D..036F ; Grapheme_Extend +0483..0486 ; Grapheme_Extend +0488..0489 ; Grapheme_Extend +0591..05A1 ; Grapheme_Extend +05A3..05B9 ; Grapheme_Extend +05BB..05BD ; Grapheme_Extend +05BF ; Grapheme_Extend +05C1..05C2 ; Grapheme_Extend +05C4 ; Grapheme_Extend +0610..0615 ; Grapheme_Extend +064B..0658 ; Grapheme_Extend +0670 ; Grapheme_Extend +06D6..06DC ; Grapheme_Extend +06DE ; Grapheme_Extend +06DF..06E4 ; Grapheme_Extend +06E7..06E8 ; Grapheme_Extend +06EA..06ED ; Grapheme_Extend +0711 ; Grapheme_Extend +0730..074A ; Grapheme_Extend +07A6..07B0 ; Grapheme_Extend +0901..0902 ; Grapheme_Extend +093C ; Grapheme_Extend +0941..0948 ; Grapheme_Extend +094D ; Grapheme_Extend +0951..0954 ; Grapheme_Extend +0962..0963 ; Grapheme_Extend +0981 ; Grapheme_Extend +09BC ; Grapheme_Extend +09BE ; Grapheme_Extend +09C1..09C4 ; Grapheme_Extend +09CD ; Grapheme_Extend +09D7 ; Grapheme_Extend +09E2..09E3 ; Grapheme_Extend +0A01..0A02 ; Grapheme_Extend +0A3C ; Grapheme_Extend +0A41..0A42 ; Grapheme_Extend +0A47..0A48 ; Grapheme_Extend +0A4B..0A4D ; Grapheme_Extend +0A70..0A71 ; Grapheme_Extend +0A81..0A82 ; Grapheme_Extend +0ABC ; Grapheme_Extend +0AC1..0AC5 ; Grapheme_Extend +0AC7..0AC8 ; Grapheme_Extend +0ACD ; Grapheme_Extend +0AE2..0AE3 ; Grapheme_Extend +0B01 ; Grapheme_Extend +0B3C ; Grapheme_Extend +0B3E ; Grapheme_Extend +0B3F ; Grapheme_Extend +0B41..0B43 ; Grapheme_Extend +0B4D ; Grapheme_Extend +0B56 ; Grapheme_Extend +0B57 ; Grapheme_Extend +0B82 ; Grapheme_Extend +0BBE ; Grapheme_Extend +0BC0 ; Grapheme_Extend +0BCD ; Grapheme_Extend +0BD7 ; Grapheme_Extend +0C3E..0C40 ; Grapheme_Extend +0C46..0C48 ; Grapheme_Extend +0C4A..0C4D ; Grapheme_Extend +0C55..0C56 ; Grapheme_Extend +0CBC ; Grapheme_Extend +0CBF ; Grapheme_Extend +0CC2 ; Grapheme_Extend +0CC6 ; Grapheme_Extend +0CCC..0CCD ; Grapheme_Extend +0CD5..0CD6 ; Grapheme_Extend +0D3E ; Grapheme_Extend +0D41..0D43 ; Grapheme_Extend +0D4D ; Grapheme_Extend +0D57 ; Grapheme_Extend +0DCA ; Grapheme_Extend +0DCF ; Grapheme_Extend +0DD2..0DD4 ; Grapheme_Extend +0DD6 ; Grapheme_Extend +0DDF ; Grapheme_Extend +0E31 ; Grapheme_Extend +0E34..0E3A ; Grapheme_Extend +0E47..0E4E ; Grapheme_Extend +0EB1 ; Grapheme_Extend +0EB4..0EB9 ; Grapheme_Extend +0EBB..0EBC ; Grapheme_Extend +0EC8..0ECD ; Grapheme_Extend +0F18..0F19 ; Grapheme_Extend +0F35 ; Grapheme_Extend +0F37 ; Grapheme_Extend +0F39 ; Grapheme_Extend +0F71..0F7E ; Grapheme_Extend +0F80..0F84 ; Grapheme_Extend +0F86..0F87 ; Grapheme_Extend +0F90..0F97 ; Grapheme_Extend +0F99..0FBC ; Grapheme_Extend +0FC6 ; Grapheme_Extend +102D..1030 ; Grapheme_Extend +1032 ; Grapheme_Extend +1036..1037 ; Grapheme_Extend +1039 ; Grapheme_Extend +1058..1059 ; Grapheme_Extend +1712..1714 ; Grapheme_Extend +1732..1734 ; Grapheme_Extend +1752..1753 ; Grapheme_Extend +1772..1773 ; Grapheme_Extend +17B7..17BD ; Grapheme_Extend +17C6 ; Grapheme_Extend +17C9..17D3 ; Grapheme_Extend +17DD ; Grapheme_Extend +180B..180D ; Grapheme_Extend +18A9 ; Grapheme_Extend +1920..1922 ; Grapheme_Extend +1927..1928 ; Grapheme_Extend +1932 ; Grapheme_Extend +1939..193B ; Grapheme_Extend +200C..200D ; Grapheme_Extend +20D0..20DC ; Grapheme_Extend +20DD..20E0 ; Grapheme_Extend +20E1 ; Grapheme_Extend +20E2..20E4 ; Grapheme_Extend +20E5..20EA ; Grapheme_Extend +302A..302F ; Grapheme_Extend +3099..309A ; Grapheme_Extend +F870..F87F ; Grapheme_Extend +FB1E ; Grapheme_Extend +FE00..FE0F ; Grapheme_Extend +FE20..FE23 ; Grapheme_Extend +1D165 ; Grapheme_Extend +1D167..1D169 ; Grapheme_Extend +1D16E..1D16F ; Grapheme_Extend +1D17B..1D182 ; Grapheme_Extend +1D185..1D18B ; Grapheme_Extend +1D1AA..1D1AD ; Grapheme_Extend +E0100..E01EF ; Grapheme_Extend -# Total code points: 818 +# Total code points: 820 # ================================================ @@ -3582,901 +3615,900 @@ E0100..E01EF ; Grapheme_Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELE # Note: depending on an application's interpretation of Co (private use), # they may be either in Grapheme_Base, or in Grapheme_Extend, or in neither. -0020 ; Grapheme_Base # Zs SPACE -0021..0023 ; Grapheme_Base # Po [3] EXCLAMATION MARK..NUMBER SIGN -0024 ; Grapheme_Base # Sc DOLLAR SIGN -0025..0027 ; Grapheme_Base # Po [3] PERCENT SIGN..APOSTROPHE -0028 ; Grapheme_Base # Ps LEFT PARENTHESIS -0029 ; Grapheme_Base # Pe RIGHT PARENTHESIS -002A ; Grapheme_Base # Po ASTERISK -002B ; Grapheme_Base # Sm PLUS SIGN -002C ; Grapheme_Base # Po COMMA -002D ; Grapheme_Base # Pd HYPHEN-MINUS -002E..002F ; Grapheme_Base # Po [2] FULL STOP..SOLIDUS -0030..0039 ; Grapheme_Base # Nd [10] DIGIT ZERO..DIGIT NINE -003A..003B ; Grapheme_Base # Po [2] COLON..SEMICOLON -003C..003E ; Grapheme_Base # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN -003F..0040 ; Grapheme_Base # Po [2] QUESTION MARK..COMMERCIAL AT -0041..005A ; Grapheme_Base # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z -005B ; Grapheme_Base # Ps LEFT SQUARE BRACKET -005C ; Grapheme_Base # Po REVERSE SOLIDUS -005D ; Grapheme_Base # Pe RIGHT SQUARE BRACKET -005E ; Grapheme_Base # Sk CIRCUMFLEX ACCENT -005F ; Grapheme_Base # Pc LOW LINE -0060 ; Grapheme_Base # Sk GRAVE ACCENT -0061..007A ; Grapheme_Base # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z -007B ; Grapheme_Base # Ps LEFT CURLY BRACKET -007C ; Grapheme_Base # Sm VERTICAL LINE -007D ; Grapheme_Base # Pe RIGHT CURLY BRACKET -007E ; Grapheme_Base # Sm TILDE -00A0 ; Grapheme_Base # Zs NO-BREAK SPACE -00A1 ; Grapheme_Base # Po INVERTED EXCLAMATION MARK -00A2..00A5 ; Grapheme_Base # Sc [4] CENT SIGN..YEN SIGN -00A6..00A7 ; Grapheme_Base # So [2] BROKEN BAR..SECTION SIGN -00A8 ; Grapheme_Base # Sk DIAERESIS -00A9 ; Grapheme_Base # So COPYRIGHT SIGN -00AA ; Grapheme_Base # L& FEMININE ORDINAL INDICATOR -00AB ; Grapheme_Base # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -00AC ; Grapheme_Base # Sm NOT SIGN -00AE ; Grapheme_Base # So REGISTERED SIGN -00AF ; Grapheme_Base # Sk MACRON -00B0 ; Grapheme_Base # So DEGREE SIGN -00B1 ; Grapheme_Base # Sm PLUS-MINUS SIGN -00B2..00B3 ; Grapheme_Base # No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE -00B4 ; Grapheme_Base # Sk ACUTE ACCENT -00B5 ; Grapheme_Base # L& MICRO SIGN -00B6 ; Grapheme_Base # So PILCROW SIGN -00B7 ; Grapheme_Base # Po MIDDLE DOT -00B8 ; Grapheme_Base # Sk CEDILLA -00B9 ; Grapheme_Base # No SUPERSCRIPT ONE -00BA ; Grapheme_Base # L& MASCULINE ORDINAL INDICATOR -00BB ; Grapheme_Base # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -00BC..00BE ; Grapheme_Base # No [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS -00BF ; Grapheme_Base # Po INVERTED QUESTION MARK -00C0..00D6 ; Grapheme_Base # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS -00D7 ; Grapheme_Base # Sm MULTIPLICATION SIGN -00D8..00F6 ; Grapheme_Base # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS -00F7 ; Grapheme_Base # Sm DIVISION SIGN -00F8..01BA ; Grapheme_Base # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL -01BB ; Grapheme_Base # Lo LATIN LETTER TWO WITH STROKE -01BC..01BF ; Grapheme_Base # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN -01C0..01C3 ; Grapheme_Base # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK -01C4..0236 ; Grapheme_Base # L& [115] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER T WITH CURL -0250..02AF ; Grapheme_Base # L& [96] LATIN SMALL LETTER TURNED A..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL -02B0..02C1 ; Grapheme_Base # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP -02C2..02C5 ; Grapheme_Base # Sk [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD -02C6..02D1 ; Grapheme_Base # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON -02D2..02DF ; Grapheme_Base # Sk [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT -02E0..02E4 ; Grapheme_Base # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP -02E5..02ED ; Grapheme_Base # Sk [9] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER UNASPIRATED -02EE ; Grapheme_Base # Lm MODIFIER LETTER DOUBLE APOSTROPHE -02EF..02FF ; Grapheme_Base # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW -0374..0375 ; Grapheme_Base # Sk [2] GREEK NUMERAL SIGN..GREEK LOWER NUMERAL SIGN -037A ; Grapheme_Base # Lm GREEK YPOGEGRAMMENI -037E ; Grapheme_Base # Po GREEK QUESTION MARK -0384..0385 ; Grapheme_Base # Sk [2] GREEK TONOS..GREEK DIALYTIKA TONOS -0386 ; Grapheme_Base # L& GREEK CAPITAL LETTER ALPHA WITH TONOS -0387 ; Grapheme_Base # Po GREEK ANO TELEIA -0388..038A ; Grapheme_Base # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS -038C ; Grapheme_Base # L& GREEK CAPITAL LETTER OMICRON WITH TONOS -038E..03A1 ; Grapheme_Base # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO -03A3..03CE ; Grapheme_Base # L& [44] GREEK CAPITAL LETTER SIGMA..GREEK SMALL LETTER OMEGA WITH TONOS -03D0..03F5 ; Grapheme_Base # L& [38] GREEK BETA SYMBOL..GREEK LUNATE EPSILON SYMBOL -03F6 ; Grapheme_Base # Sm GREEK REVERSED LUNATE EPSILON SYMBOL -03F7..03FB ; Grapheme_Base # L& [5] GREEK CAPITAL LETTER SHO..GREEK SMALL LETTER SAN -0400..0481 ; Grapheme_Base # L& [130] CYRILLIC CAPITAL LETTER IE WITH GRAVE..CYRILLIC SMALL LETTER KOPPA -0482 ; Grapheme_Base # So CYRILLIC THOUSANDS SIGN -048A..04CE ; Grapheme_Base # L& [69] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EM WITH TAIL -04D0..04F5 ; Grapheme_Base # L& [38] CYRILLIC CAPITAL LETTER A WITH BREVE..CYRILLIC SMALL LETTER CHE WITH DIAERESIS -04F8..04F9 ; Grapheme_Base # L& [2] CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS..CYRILLIC SMALL LETTER YERU WITH DIAERESIS -0500..050F ; Grapheme_Base # L& [16] CYRILLIC CAPITAL LETTER KOMI DE..CYRILLIC SMALL LETTER KOMI TJE -0531..0556 ; Grapheme_Base # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH -0559 ; Grapheme_Base # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING -055A..055F ; Grapheme_Base # Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK -0561..0587 ; Grapheme_Base # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN -0589 ; Grapheme_Base # Po ARMENIAN FULL STOP -058A ; Grapheme_Base # Pd ARMENIAN HYPHEN -05BE ; Grapheme_Base # Po HEBREW PUNCTUATION MAQAF -05C0 ; Grapheme_Base # Po HEBREW PUNCTUATION PASEQ -05C3 ; Grapheme_Base # Po HEBREW PUNCTUATION SOF PASUQ -05D0..05EA ; Grapheme_Base # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV -05F0..05F2 ; Grapheme_Base # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD -05F3..05F4 ; Grapheme_Base # Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM -060C..060D ; Grapheme_Base # Po [2] ARABIC COMMA..ARABIC DATE SEPARATOR -060E..060F ; Grapheme_Base # So [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA -061B ; Grapheme_Base # Po ARABIC SEMICOLON -061F ; Grapheme_Base # Po ARABIC QUESTION MARK -0621..063A ; Grapheme_Base # Lo [26] ARABIC LETTER HAMZA..ARABIC LETTER GHAIN -0640 ; Grapheme_Base # Lm ARABIC TATWEEL -0641..064A ; Grapheme_Base # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH -0660..0669 ; Grapheme_Base # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE -066A..066D ; Grapheme_Base # Po [4] ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR -066E..066F ; Grapheme_Base # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF -0671..06D3 ; Grapheme_Base # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE -06D4 ; Grapheme_Base # Po ARABIC FULL STOP -06D5 ; Grapheme_Base # Lo ARABIC LETTER AE -06E5..06E6 ; Grapheme_Base # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH -06E9 ; Grapheme_Base # So ARABIC PLACE OF SAJDAH -06EE..06EF ; Grapheme_Base # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V -06F0..06F9 ; Grapheme_Base # Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE -06FA..06FC ; Grapheme_Base # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW -06FD..06FE ; Grapheme_Base # So [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN -06FF ; Grapheme_Base # Lo ARABIC LETTER HEH WITH INVERTED V -0700..070D ; Grapheme_Base # Po [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS -0710 ; Grapheme_Base # Lo SYRIAC LETTER ALAPH -0712..072F ; Grapheme_Base # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH -074D..074F ; Grapheme_Base # Lo [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE -0780..07A5 ; Grapheme_Base # Lo [38] THAANA LETTER HAA..THAANA LETTER WAAVU -07B1 ; Grapheme_Base # Lo THAANA LETTER NAA -0903 ; Grapheme_Base # Mc DEVANAGARI SIGN VISARGA -0904..0939 ; Grapheme_Base # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA -093D ; Grapheme_Base # Lo DEVANAGARI SIGN AVAGRAHA -093E..0940 ; Grapheme_Base # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II -0949..094C ; Grapheme_Base # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU -0950 ; Grapheme_Base # Lo DEVANAGARI OM -0958..0961 ; Grapheme_Base # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL -0964..0965 ; Grapheme_Base # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA -0966..096F ; Grapheme_Base # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE -0970 ; Grapheme_Base # Po DEVANAGARI ABBREVIATION SIGN -0982..0983 ; Grapheme_Base # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA -0985..098C ; Grapheme_Base # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L -098F..0990 ; Grapheme_Base # Lo [2] BENGALI LETTER E..BENGALI LETTER AI -0993..09A8 ; Grapheme_Base # Lo [22] BENGALI LETTER O..BENGALI LETTER NA -09AA..09B0 ; Grapheme_Base # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA -09B2 ; Grapheme_Base # Lo BENGALI LETTER LA -09B6..09B9 ; Grapheme_Base # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA -09BD ; Grapheme_Base # Lo BENGALI SIGN AVAGRAHA -09BF..09C0 ; Grapheme_Base # Mc [2] BENGALI VOWEL SIGN I..BENGALI VOWEL SIGN II -09C7..09C8 ; Grapheme_Base # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI -09CB..09CC ; Grapheme_Base # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU -09DC..09DD ; Grapheme_Base # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA -09DF..09E1 ; Grapheme_Base # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL -09E6..09EF ; Grapheme_Base # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE -09F0..09F1 ; Grapheme_Base # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL -09F2..09F3 ; Grapheme_Base # Sc [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN -09F4..09F9 ; Grapheme_Base # No [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN -09FA ; Grapheme_Base # So BENGALI ISSHAR -0A03 ; Grapheme_Base # Mc GURMUKHI SIGN VISARGA -0A05..0A0A ; Grapheme_Base # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU -0A0F..0A10 ; Grapheme_Base # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI -0A13..0A28 ; Grapheme_Base # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA -0A2A..0A30 ; Grapheme_Base # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA -0A32..0A33 ; Grapheme_Base # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA -0A35..0A36 ; Grapheme_Base # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA -0A38..0A39 ; Grapheme_Base # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA -0A3E..0A40 ; Grapheme_Base # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II -0A59..0A5C ; Grapheme_Base # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA -0A5E ; Grapheme_Base # Lo GURMUKHI LETTER FA -0A66..0A6F ; Grapheme_Base # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE -0A72..0A74 ; Grapheme_Base # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR -0A83 ; Grapheme_Base # Mc GUJARATI SIGN VISARGA -0A85..0A8D ; Grapheme_Base # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E -0A8F..0A91 ; Grapheme_Base # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O -0A93..0AA8 ; Grapheme_Base # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA -0AAA..0AB0 ; Grapheme_Base # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA -0AB2..0AB3 ; Grapheme_Base # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA -0AB5..0AB9 ; Grapheme_Base # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA -0ABD ; Grapheme_Base # Lo GUJARATI SIGN AVAGRAHA -0ABE..0AC0 ; Grapheme_Base # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II -0AC9 ; Grapheme_Base # Mc GUJARATI VOWEL SIGN CANDRA O -0ACB..0ACC ; Grapheme_Base # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU -0AD0 ; Grapheme_Base # Lo GUJARATI OM -0AE0..0AE1 ; Grapheme_Base # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL -0AE6..0AEF ; Grapheme_Base # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE -0AF1 ; Grapheme_Base # Sc GUJARATI RUPEE SIGN -0B02..0B03 ; Grapheme_Base # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA -0B05..0B0C ; Grapheme_Base # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L -0B0F..0B10 ; Grapheme_Base # Lo [2] ORIYA LETTER E..ORIYA LETTER AI -0B13..0B28 ; Grapheme_Base # Lo [22] ORIYA LETTER O..ORIYA LETTER NA -0B2A..0B30 ; Grapheme_Base # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA -0B32..0B33 ; Grapheme_Base # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA -0B35..0B39 ; Grapheme_Base # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA -0B3D ; Grapheme_Base # Lo ORIYA SIGN AVAGRAHA -0B40 ; Grapheme_Base # Mc ORIYA VOWEL SIGN II -0B47..0B48 ; Grapheme_Base # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI -0B4B..0B4C ; Grapheme_Base # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU -0B5C..0B5D ; Grapheme_Base # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA -0B5F..0B61 ; Grapheme_Base # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL -0B66..0B6F ; Grapheme_Base # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE -0B70 ; Grapheme_Base # So ORIYA ISSHAR -0B71 ; Grapheme_Base # Lo ORIYA LETTER WA -0B83 ; Grapheme_Base # Lo TAMIL SIGN VISARGA -0B85..0B8A ; Grapheme_Base # Lo [6] TAMIL LETTER A..TAMIL LETTER UU -0B8E..0B90 ; Grapheme_Base # Lo [3] TAMIL LETTER E..TAMIL LETTER AI -0B92..0B95 ; Grapheme_Base # Lo [4] TAMIL LETTER O..TAMIL LETTER KA -0B99..0B9A ; Grapheme_Base # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA -0B9C ; Grapheme_Base # Lo TAMIL LETTER JA -0B9E..0B9F ; Grapheme_Base # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA -0BA3..0BA4 ; Grapheme_Base # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA -0BA8..0BAA ; Grapheme_Base # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA -0BAE..0BB5 ; Grapheme_Base # Lo [8] TAMIL LETTER MA..TAMIL LETTER VA -0BB7..0BB9 ; Grapheme_Base # Lo [3] TAMIL LETTER SSA..TAMIL LETTER HA -0BBF ; Grapheme_Base # Mc TAMIL VOWEL SIGN I -0BC1..0BC2 ; Grapheme_Base # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU -0BC6..0BC8 ; Grapheme_Base # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI -0BCA..0BCC ; Grapheme_Base # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU -0BE7..0BEF ; Grapheme_Base # Nd [9] TAMIL DIGIT ONE..TAMIL DIGIT NINE -0BF0..0BF2 ; Grapheme_Base # No [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND -0BF3..0BF8 ; Grapheme_Base # So [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN -0BF9 ; Grapheme_Base # Sc TAMIL RUPEE SIGN -0BFA ; Grapheme_Base # So TAMIL NUMBER SIGN -0C01..0C03 ; Grapheme_Base # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA -0C05..0C0C ; Grapheme_Base # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L -0C0E..0C10 ; Grapheme_Base # Lo [3] TELUGU LETTER E..TELUGU LETTER AI -0C12..0C28 ; Grapheme_Base # Lo [23] TELUGU LETTER O..TELUGU LETTER NA -0C2A..0C33 ; Grapheme_Base # Lo [10] TELUGU LETTER PA..TELUGU LETTER LLA -0C35..0C39 ; Grapheme_Base # Lo [5] TELUGU LETTER VA..TELUGU LETTER HA -0C41..0C44 ; Grapheme_Base # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR -0C60..0C61 ; Grapheme_Base # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL -0C66..0C6F ; Grapheme_Base # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE -0C82..0C83 ; Grapheme_Base # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA -0C85..0C8C ; Grapheme_Base # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L -0C8E..0C90 ; Grapheme_Base # Lo [3] KANNADA LETTER E..KANNADA LETTER AI -0C92..0CA8 ; Grapheme_Base # Lo [23] KANNADA LETTER O..KANNADA LETTER NA -0CAA..0CB3 ; Grapheme_Base # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA -0CB5..0CB9 ; Grapheme_Base # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA -0CBD ; Grapheme_Base # Lo KANNADA SIGN AVAGRAHA -0CBE ; Grapheme_Base # Mc KANNADA VOWEL SIGN AA -0CC0..0CC1 ; Grapheme_Base # Mc [2] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN U -0CC3..0CC4 ; Grapheme_Base # Mc [2] KANNADA VOWEL SIGN VOCALIC R..KANNADA VOWEL SIGN VOCALIC RR -0CC7..0CC8 ; Grapheme_Base # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI -0CCA..0CCB ; Grapheme_Base # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO -0CDE ; Grapheme_Base # Lo KANNADA LETTER FA -0CE0..0CE1 ; Grapheme_Base # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL -0CE6..0CEF ; Grapheme_Base # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE -0D02..0D03 ; Grapheme_Base # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA -0D05..0D0C ; Grapheme_Base # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L -0D0E..0D10 ; Grapheme_Base # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI -0D12..0D28 ; Grapheme_Base # Lo [23] MALAYALAM LETTER O..MALAYALAM LETTER NA -0D2A..0D39 ; Grapheme_Base # Lo [16] MALAYALAM LETTER PA..MALAYALAM LETTER HA -0D3F..0D40 ; Grapheme_Base # Mc [2] MALAYALAM VOWEL SIGN I..MALAYALAM VOWEL SIGN II -0D46..0D48 ; Grapheme_Base # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI -0D4A..0D4C ; Grapheme_Base # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU -0D60..0D61 ; Grapheme_Base # Lo [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL -0D66..0D6F ; Grapheme_Base # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE -0D82..0D83 ; Grapheme_Base # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA -0D85..0D96 ; Grapheme_Base # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA -0D9A..0DB1 ; Grapheme_Base # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA -0DB3..0DBB ; Grapheme_Base # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA -0DBD ; Grapheme_Base # Lo SINHALA LETTER DANTAJA LAYANNA -0DC0..0DC6 ; Grapheme_Base # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA -0DD0..0DD1 ; Grapheme_Base # Mc [2] SINHALA VOWEL SIGN KETTI AEDA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA -0DD8..0DDE ; Grapheme_Base # Mc [7] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA -0DF2..0DF3 ; Grapheme_Base # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA -0DF4 ; Grapheme_Base # Po SINHALA PUNCTUATION KUNDDALIYA -0E01..0E30 ; Grapheme_Base # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A -0E32..0E33 ; Grapheme_Base # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM -0E3F ; Grapheme_Base # Sc THAI CURRENCY SYMBOL BAHT -0E40..0E45 ; Grapheme_Base # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO -0E46 ; Grapheme_Base # Lm THAI CHARACTER MAIYAMOK -0E4F ; Grapheme_Base # Po THAI CHARACTER FONGMAN -0E50..0E59 ; Grapheme_Base # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE -0E5A..0E5B ; Grapheme_Base # Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT -0E81..0E82 ; Grapheme_Base # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG -0E84 ; Grapheme_Base # Lo LAO LETTER KHO TAM -0E87..0E88 ; Grapheme_Base # Lo [2] LAO LETTER NGO..LAO LETTER CO -0E8A ; Grapheme_Base # Lo LAO LETTER SO TAM -0E8D ; Grapheme_Base # Lo LAO LETTER NYO -0E94..0E97 ; Grapheme_Base # Lo [4] LAO LETTER DO..LAO LETTER THO TAM -0E99..0E9F ; Grapheme_Base # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG -0EA1..0EA3 ; Grapheme_Base # Lo [3] LAO LETTER MO..LAO LETTER LO LING -0EA5 ; Grapheme_Base # Lo LAO LETTER LO LOOT -0EA7 ; Grapheme_Base # Lo LAO LETTER WO -0EAA..0EAB ; Grapheme_Base # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG -0EAD..0EB0 ; Grapheme_Base # Lo [4] LAO LETTER O..LAO VOWEL SIGN A -0EB2..0EB3 ; Grapheme_Base # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM -0EBD ; Grapheme_Base # Lo LAO SEMIVOWEL SIGN NYO -0EC0..0EC4 ; Grapheme_Base # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI -0EC6 ; Grapheme_Base # Lm LAO KO LA -0ED0..0ED9 ; Grapheme_Base # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE -0EDC..0EDD ; Grapheme_Base # Lo [2] LAO HO NO..LAO HO MO -0F00 ; Grapheme_Base # Lo TIBETAN SYLLABLE OM -0F01..0F03 ; Grapheme_Base # So [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA -0F04..0F12 ; Grapheme_Base # Po [15] TIBETAN MARK INITIAL YIG MGO MDUN MA..TIBETAN MARK RGYA GRAM SHAD -0F13..0F17 ; Grapheme_Base # So [5] TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS -0F1A..0F1F ; Grapheme_Base # So [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG -0F20..0F29 ; Grapheme_Base # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE -0F2A..0F33 ; Grapheme_Base # No [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO -0F34 ; Grapheme_Base # So TIBETAN MARK BSDUS RTAGS -0F36 ; Grapheme_Base # So TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN -0F38 ; Grapheme_Base # So TIBETAN MARK CHE MGO -0F3A ; Grapheme_Base # Ps TIBETAN MARK GUG RTAGS GYON -0F3B ; Grapheme_Base # Pe TIBETAN MARK GUG RTAGS GYAS -0F3C ; Grapheme_Base # Ps TIBETAN MARK ANG KHANG GYON -0F3D ; Grapheme_Base # Pe TIBETAN MARK ANG KHANG GYAS -0F3E..0F3F ; Grapheme_Base # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES -0F40..0F47 ; Grapheme_Base # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA -0F49..0F6A ; Grapheme_Base # Lo [34] TIBETAN LETTER NYA..TIBETAN LETTER FIXED-FORM RA -0F7F ; Grapheme_Base # Mc TIBETAN SIGN RNAM BCAD -0F85 ; Grapheme_Base # Po TIBETAN MARK PALUTA -0F88..0F8B ; Grapheme_Base # Lo [4] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN GRU MED RGYINGS -0FBE..0FC5 ; Grapheme_Base # So [8] TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE -0FC7..0FCC ; Grapheme_Base # So [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL -0FCF ; Grapheme_Base # So TIBETAN SIGN RDEL NAG GSUM -1000..1021 ; Grapheme_Base # Lo [34] MYANMAR LETTER KA..MYANMAR LETTER A -1023..1027 ; Grapheme_Base # Lo [5] MYANMAR LETTER I..MYANMAR LETTER E -1029..102A ; Grapheme_Base # Lo [2] MYANMAR LETTER O..MYANMAR LETTER AU -102C ; Grapheme_Base # Mc MYANMAR VOWEL SIGN AA -1031 ; Grapheme_Base # Mc MYANMAR VOWEL SIGN E -1038 ; Grapheme_Base # Mc MYANMAR SIGN VISARGA -1040..1049 ; Grapheme_Base # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE -104A..104F ; Grapheme_Base # Po [6] MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE -1050..1055 ; Grapheme_Base # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL -1056..1057 ; Grapheme_Base # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR -10A0..10C5 ; Grapheme_Base # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE -10D0..10F8 ; Grapheme_Base # Lo [41] GEORGIAN LETTER AN..GEORGIAN LETTER ELIFI -10FB ; Grapheme_Base # Po GEORGIAN PARAGRAPH SEPARATOR -1100..1159 ; Grapheme_Base # Lo [90] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH -115F..11A2 ; Grapheme_Base # Lo [68] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG SSANGARAEA -11A8..11F9 ; Grapheme_Base # Lo [82] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH -1200..1206 ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE HO -1208..1246 ; Grapheme_Base # Lo [63] ETHIOPIC SYLLABLE LA..ETHIOPIC SYLLABLE QO -1248 ; Grapheme_Base # Lo ETHIOPIC SYLLABLE QWA -124A..124D ; Grapheme_Base # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE -1250..1256 ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO -1258 ; Grapheme_Base # Lo ETHIOPIC SYLLABLE QHWA -125A..125D ; Grapheme_Base # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE -1260..1286 ; Grapheme_Base # Lo [39] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XO -1288 ; Grapheme_Base # Lo ETHIOPIC SYLLABLE XWA -128A..128D ; Grapheme_Base # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE -1290..12AE ; Grapheme_Base # Lo [31] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KO -12B0 ; Grapheme_Base # Lo ETHIOPIC SYLLABLE KWA -12B2..12B5 ; Grapheme_Base # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE -12B8..12BE ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO -12C0 ; Grapheme_Base # Lo ETHIOPIC SYLLABLE KXWA -12C2..12C5 ; Grapheme_Base # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE -12C8..12CE ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE WO -12D0..12D6 ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE PHARYNGEAL A..ETHIOPIC SYLLABLE PHARYNGEAL O -12D8..12EE ; Grapheme_Base # Lo [23] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE YO -12F0..130E ; Grapheme_Base # Lo [31] ETHIOPIC SYLLABLE DA..ETHIOPIC SYLLABLE GO -1310 ; Grapheme_Base # Lo ETHIOPIC SYLLABLE GWA -1312..1315 ; Grapheme_Base # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE -1318..131E ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE GGO -1320..1346 ; Grapheme_Base # Lo [39] ETHIOPIC SYLLABLE THA..ETHIOPIC SYLLABLE TZO -1348..135A ; Grapheme_Base # Lo [19] ETHIOPIC SYLLABLE FA..ETHIOPIC SYLLABLE FYA -1361..1368 ; Grapheme_Base # Po [8] ETHIOPIC WORDSPACE..ETHIOPIC PARAGRAPH SEPARATOR -1369..1371 ; Grapheme_Base # Nd [9] ETHIOPIC DIGIT ONE..ETHIOPIC DIGIT NINE -1372..137C ; Grapheme_Base # No [11] ETHIOPIC NUMBER TEN..ETHIOPIC NUMBER TEN THOUSAND -13A0..13F4 ; Grapheme_Base # Lo [85] CHEROKEE LETTER A..CHEROKEE LETTER YV -1401..166C ; Grapheme_Base # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA -166D..166E ; Grapheme_Base # Po [2] CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP -166F..1676 ; Grapheme_Base # Lo [8] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS NNGAA -1680 ; Grapheme_Base # Zs OGHAM SPACE MARK -1681..169A ; Grapheme_Base # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH -169B ; Grapheme_Base # Ps OGHAM FEATHER MARK -169C ; Grapheme_Base # Pe OGHAM REVERSED FEATHER MARK -16A0..16EA ; Grapheme_Base # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X -16EB..16ED ; Grapheme_Base # Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION -16EE..16F0 ; Grapheme_Base # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL -1700..170C ; Grapheme_Base # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA -170E..1711 ; Grapheme_Base # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA -1720..1731 ; Grapheme_Base # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA -1735..1736 ; Grapheme_Base # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION -1740..1751 ; Grapheme_Base # Lo [18] BUHID LETTER A..BUHID LETTER HA -1760..176C ; Grapheme_Base # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA -176E..1770 ; Grapheme_Base # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA -1780..17B3 ; Grapheme_Base # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU -17B6 ; Grapheme_Base # Mc KHMER VOWEL SIGN AA -17BE..17C5 ; Grapheme_Base # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU -17C7..17C8 ; Grapheme_Base # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU -17D4..17D6 ; Grapheme_Base # Po [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH -17D7 ; Grapheme_Base # Lm KHMER SIGN LEK TOO -17D8..17DA ; Grapheme_Base # Po [3] KHMER SIGN BEYYAL..KHMER SIGN KOOMUUT -17DB ; Grapheme_Base # Sc KHMER CURRENCY SYMBOL RIEL -17DC ; Grapheme_Base # Lo KHMER SIGN AVAKRAHASANYA -17E0..17E9 ; Grapheme_Base # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE -17F0..17F9 ; Grapheme_Base # No [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON -1800..1805 ; Grapheme_Base # Po [6] MONGOLIAN BIRGA..MONGOLIAN FOUR DOTS -1806 ; Grapheme_Base # Pd MONGOLIAN TODO SOFT HYPHEN -1807..180A ; Grapheme_Base # Po [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU -180E ; Grapheme_Base # Zs MONGOLIAN VOWEL SEPARATOR -1810..1819 ; Grapheme_Base # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE -1820..1842 ; Grapheme_Base # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI -1843 ; Grapheme_Base # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN -1844..1877 ; Grapheme_Base # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA -1880..18A8 ; Grapheme_Base # Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA -1900..191C ; Grapheme_Base # Lo [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA -1923..1926 ; Grapheme_Base # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU -1929..192B ; Grapheme_Base # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA -1930..1931 ; Grapheme_Base # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA -1933..1938 ; Grapheme_Base # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA -1940 ; Grapheme_Base # So LIMBU SIGN LOO -1944..1945 ; Grapheme_Base # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK -1946..194F ; Grapheme_Base # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE -1950..196D ; Grapheme_Base # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI -1970..1974 ; Grapheme_Base # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 -19E0..19FF ; Grapheme_Base # So [32] KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC -1D00..1D2B ; Grapheme_Base # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL -1D2C..1D61 ; Grapheme_Base # Lm [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI -1D62..1D6B ; Grapheme_Base # L& [10] LATIN SUBSCRIPT SMALL LETTER I..LATIN SMALL LETTER UE -1E00..1E9B ; Grapheme_Base # L& [156] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER LONG S WITH DOT ABOVE -1EA0..1EF9 ; Grapheme_Base # L& [90] LATIN CAPITAL LETTER A WITH DOT BELOW..LATIN SMALL LETTER Y WITH TILDE -1F00..1F15 ; Grapheme_Base # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA -1F18..1F1D ; Grapheme_Base # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA -1F20..1F45 ; Grapheme_Base # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA -1F48..1F4D ; Grapheme_Base # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA -1F50..1F57 ; Grapheme_Base # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI -1F59 ; Grapheme_Base # L& GREEK CAPITAL LETTER UPSILON WITH DASIA -1F5B ; Grapheme_Base # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA -1F5D ; Grapheme_Base # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA -1F5F..1F7D ; Grapheme_Base # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA -1F80..1FB4 ; Grapheme_Base # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI -1FB6..1FBC ; Grapheme_Base # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI -1FBD ; Grapheme_Base # Sk GREEK KORONIS -1FBE ; Grapheme_Base # L& GREEK PROSGEGRAMMENI -1FBF..1FC1 ; Grapheme_Base # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI -1FC2..1FC4 ; Grapheme_Base # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI -1FC6..1FCC ; Grapheme_Base # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI -1FCD..1FCF ; Grapheme_Base # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI -1FD0..1FD3 ; Grapheme_Base # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA -1FD6..1FDB ; Grapheme_Base # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA -1FDD..1FDF ; Grapheme_Base # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI -1FE0..1FEC ; Grapheme_Base # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA -1FED..1FEF ; Grapheme_Base # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA -1FF2..1FF4 ; Grapheme_Base # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI -1FF6..1FFC ; Grapheme_Base # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI -1FFD..1FFE ; Grapheme_Base # Sk [2] GREEK OXIA..GREEK DASIA -2000..200B ; Grapheme_Base # Zs [12] EN QUAD..ZERO WIDTH SPACE -2010..2015 ; Grapheme_Base # Pd [6] HYPHEN..HORIZONTAL BAR -2016..2017 ; Grapheme_Base # Po [2] DOUBLE VERTICAL LINE..DOUBLE LOW LINE -2018 ; Grapheme_Base # Pi LEFT SINGLE QUOTATION MARK -2019 ; Grapheme_Base # Pf RIGHT SINGLE QUOTATION MARK -201A ; Grapheme_Base # Ps SINGLE LOW-9 QUOTATION MARK -201B..201C ; Grapheme_Base # Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK -201D ; Grapheme_Base # Pf RIGHT DOUBLE QUOTATION MARK -201E ; Grapheme_Base # Ps DOUBLE LOW-9 QUOTATION MARK -201F ; Grapheme_Base # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK -2020..2027 ; Grapheme_Base # Po [8] DAGGER..HYPHENATION POINT -202F ; Grapheme_Base # Zs NARROW NO-BREAK SPACE -2030..2038 ; Grapheme_Base # Po [9] PER MILLE SIGN..CARET -2039 ; Grapheme_Base # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK -203A ; Grapheme_Base # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -203B..203E ; Grapheme_Base # Po [4] REFERENCE MARK..OVERLINE -203F..2040 ; Grapheme_Base # Pc [2] UNDERTIE..CHARACTER TIE -2041..2043 ; Grapheme_Base # Po [3] CARET INSERTION POINT..HYPHEN BULLET -2044 ; Grapheme_Base # Sm FRACTION SLASH -2045 ; Grapheme_Base # Ps LEFT SQUARE BRACKET WITH QUILL -2046 ; Grapheme_Base # Pe RIGHT SQUARE BRACKET WITH QUILL -2047..2051 ; Grapheme_Base # Po [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY -2052 ; Grapheme_Base # Sm COMMERCIAL MINUS SIGN -2053 ; Grapheme_Base # Po SWUNG DASH -2054 ; Grapheme_Base # Pc INVERTED UNDERTIE -2057 ; Grapheme_Base # Po QUADRUPLE PRIME -205F ; Grapheme_Base # Zs MEDIUM MATHEMATICAL SPACE -2070 ; Grapheme_Base # No SUPERSCRIPT ZERO -2071 ; Grapheme_Base # L& SUPERSCRIPT LATIN SMALL LETTER I -2074..2079 ; Grapheme_Base # No [6] SUPERSCRIPT FOUR..SUPERSCRIPT NINE -207A..207C ; Grapheme_Base # Sm [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN -207D ; Grapheme_Base # Ps SUPERSCRIPT LEFT PARENTHESIS -207E ; Grapheme_Base # Pe SUPERSCRIPT RIGHT PARENTHESIS -207F ; Grapheme_Base # L& SUPERSCRIPT LATIN SMALL LETTER N -2080..2089 ; Grapheme_Base # No [10] SUBSCRIPT ZERO..SUBSCRIPT NINE -208A..208C ; Grapheme_Base # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN -208D ; Grapheme_Base # Ps SUBSCRIPT LEFT PARENTHESIS -208E ; Grapheme_Base # Pe SUBSCRIPT RIGHT PARENTHESIS -20A0..20B1 ; Grapheme_Base # Sc [18] EURO-CURRENCY SIGN..PESO SIGN -2100..2101 ; Grapheme_Base # So [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT -2102 ; Grapheme_Base # L& DOUBLE-STRUCK CAPITAL C -2103..2106 ; Grapheme_Base # So [4] DEGREE CELSIUS..CADA UNA -2107 ; Grapheme_Base # L& EULER CONSTANT -2108..2109 ; Grapheme_Base # So [2] SCRUPLE..DEGREE FAHRENHEIT -210A..2113 ; Grapheme_Base # L& [10] SCRIPT SMALL G..SCRIPT SMALL L -2114 ; Grapheme_Base # So L B BAR SYMBOL -2115 ; Grapheme_Base # L& DOUBLE-STRUCK CAPITAL N -2116..2118 ; Grapheme_Base # So [3] NUMERO SIGN..SCRIPT CAPITAL P -2119..211D ; Grapheme_Base # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R -211E..2123 ; Grapheme_Base # So [6] PRESCRIPTION TAKE..VERSICLE -2124 ; Grapheme_Base # L& DOUBLE-STRUCK CAPITAL Z -2125 ; Grapheme_Base # So OUNCE SIGN -2126 ; Grapheme_Base # L& OHM SIGN -2127 ; Grapheme_Base # So INVERTED OHM SIGN -2128 ; Grapheme_Base # L& BLACK-LETTER CAPITAL Z -2129 ; Grapheme_Base # So TURNED GREEK SMALL LETTER IOTA -212A..212D ; Grapheme_Base # L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C -212E ; Grapheme_Base # So ESTIMATED SYMBOL -212F..2131 ; Grapheme_Base # L& [3] SCRIPT SMALL E..SCRIPT CAPITAL F -2132 ; Grapheme_Base # So TURNED CAPITAL F -2133..2134 ; Grapheme_Base # L& [2] SCRIPT CAPITAL M..SCRIPT SMALL O -2135..2138 ; Grapheme_Base # Lo [4] ALEF SYMBOL..DALET SYMBOL -2139 ; Grapheme_Base # L& INFORMATION SOURCE -213A..213B ; Grapheme_Base # So [2] ROTATED CAPITAL Q..FACSIMILE SIGN -213D..213F ; Grapheme_Base # L& [3] DOUBLE-STRUCK SMALL GAMMA..DOUBLE-STRUCK CAPITAL PI -2140..2144 ; Grapheme_Base # Sm [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y -2145..2149 ; Grapheme_Base # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J -214A ; Grapheme_Base # So PROPERTY LINE -214B ; Grapheme_Base # Sm TURNED AMPERSAND -2153..215F ; Grapheme_Base # No [13] VULGAR FRACTION ONE THIRD..FRACTION NUMERATOR ONE -2160..2183 ; Grapheme_Base # Nl [36] ROMAN NUMERAL ONE..ROMAN NUMERAL REVERSED ONE HUNDRED -2190..2194 ; Grapheme_Base # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW -2195..2199 ; Grapheme_Base # So [5] UP DOWN ARROW..SOUTH WEST ARROW -219A..219B ; Grapheme_Base # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE -219C..219F ; Grapheme_Base # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW -21A0 ; Grapheme_Base # Sm RIGHTWARDS TWO HEADED ARROW -21A1..21A2 ; Grapheme_Base # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL -21A3 ; Grapheme_Base # Sm RIGHTWARDS ARROW WITH TAIL -21A4..21A5 ; Grapheme_Base # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR -21A6 ; Grapheme_Base # Sm RIGHTWARDS ARROW FROM BAR -21A7..21AD ; Grapheme_Base # So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW -21AE ; Grapheme_Base # Sm LEFT RIGHT ARROW WITH STROKE -21AF..21CD ; Grapheme_Base # So [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE -21CE..21CF ; Grapheme_Base # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE -21D0..21D1 ; Grapheme_Base # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW -21D2 ; Grapheme_Base # Sm RIGHTWARDS DOUBLE ARROW -21D3 ; Grapheme_Base # So DOWNWARDS DOUBLE ARROW -21D4 ; Grapheme_Base # Sm LEFT RIGHT DOUBLE ARROW -21D5..21F3 ; Grapheme_Base # So [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW -21F4..22FF ; Grapheme_Base # Sm [268] RIGHT ARROW WITH SMALL CIRCLE..Z NOTATION BAG MEMBERSHIP -2300..2307 ; Grapheme_Base # So [8] DIAMETER SIGN..WAVY LINE -2308..230B ; Grapheme_Base # Sm [4] LEFT CEILING..RIGHT FLOOR -230C..231F ; Grapheme_Base # So [20] BOTTOM RIGHT CROP..BOTTOM RIGHT CORNER -2320..2321 ; Grapheme_Base # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL -2322..2328 ; Grapheme_Base # So [7] FROWN..KEYBOARD -2329 ; Grapheme_Base # Ps LEFT-POINTING ANGLE BRACKET -232A ; Grapheme_Base # Pe RIGHT-POINTING ANGLE BRACKET -232B..237B ; Grapheme_Base # So [81] ERASE TO THE LEFT..NOT CHECK MARK -237C ; Grapheme_Base # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW -237D..239A ; Grapheme_Base # So [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL -239B..23B3 ; Grapheme_Base # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM -23B4 ; Grapheme_Base # Ps TOP SQUARE BRACKET -23B5 ; Grapheme_Base # Pe BOTTOM SQUARE BRACKET -23B6 ; Grapheme_Base # Po BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET -23B7..23D0 ; Grapheme_Base # So [26] RADICAL SYMBOL BOTTOM..VERTICAL LINE EXTENSION -2400..2426 ; Grapheme_Base # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO -2440..244A ; Grapheme_Base # So [11] OCR HOOK..OCR DOUBLE BACKSLASH -2460..249B ; Grapheme_Base # No [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP -249C..24E9 ; Grapheme_Base # So [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z -24EA..24FF ; Grapheme_Base # No [22] CIRCLED DIGIT ZERO..NEGATIVE CIRCLED DIGIT ZERO -2500..25B6 ; Grapheme_Base # So [183] BOX DRAWINGS LIGHT HORIZONTAL..BLACK RIGHT-POINTING TRIANGLE -25B7 ; Grapheme_Base # Sm WHITE RIGHT-POINTING TRIANGLE -25B8..25C0 ; Grapheme_Base # So [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE -25C1 ; Grapheme_Base # Sm WHITE LEFT-POINTING TRIANGLE -25C2..25F7 ; Grapheme_Base # So [54] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE CIRCLE WITH UPPER RIGHT QUADRANT -25F8..25FF ; Grapheme_Base # Sm [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE -2600..2617 ; Grapheme_Base # So [24] BLACK SUN WITH RAYS..BLACK SHOGI PIECE -2619..266E ; Grapheme_Base # So [86] REVERSED ROTATED FLORAL HEART BULLET..MUSIC NATURAL SIGN -266F ; Grapheme_Base # Sm MUSIC SHARP SIGN -2670..267D ; Grapheme_Base # So [14] WEST SYRIAC CROSS..PARTIALLY-RECYCLED PAPER SYMBOL -2680..2691 ; Grapheme_Base # So [18] DIE FACE-1..BLACK FLAG -26A0..26A1 ; Grapheme_Base # So [2] WARNING SIGN..HIGH VOLTAGE SIGN -2701..2704 ; Grapheme_Base # So [4] UPPER BLADE SCISSORS..WHITE SCISSORS -2706..2709 ; Grapheme_Base # So [4] TELEPHONE LOCATION SIGN..ENVELOPE -270C..2727 ; Grapheme_Base # So [28] VICTORY HAND..WHITE FOUR POINTED STAR -2729..274B ; Grapheme_Base # So [35] STRESS OUTLINED WHITE STAR..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK -274D ; Grapheme_Base # So SHADOWED WHITE CIRCLE -274F..2752 ; Grapheme_Base # So [4] LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE -2756 ; Grapheme_Base # So BLACK DIAMOND MINUS WHITE X -2758..275E ; Grapheme_Base # So [7] LIGHT VERTICAL BAR..HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT -2761..2767 ; Grapheme_Base # So [7] CURVED STEM PARAGRAPH SIGN ORNAMENT..ROTATED FLORAL HEART BULLET -2768 ; Grapheme_Base # Ps MEDIUM LEFT PARENTHESIS ORNAMENT -2769 ; Grapheme_Base # Pe MEDIUM RIGHT PARENTHESIS ORNAMENT -276A ; Grapheme_Base # Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT -276B ; Grapheme_Base # Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT -276C ; Grapheme_Base # Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT -276D ; Grapheme_Base # Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT -276E ; Grapheme_Base # Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT -276F ; Grapheme_Base # Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT -2770 ; Grapheme_Base # Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT -2771 ; Grapheme_Base # Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT -2772 ; Grapheme_Base # Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT -2773 ; Grapheme_Base # Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT -2774 ; Grapheme_Base # Ps MEDIUM LEFT CURLY BRACKET ORNAMENT -2775 ; Grapheme_Base # Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT -2776..2793 ; Grapheme_Base # No [30] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN -2794 ; Grapheme_Base # So HEAVY WIDE-HEADED RIGHTWARDS ARROW -2798..27AF ; Grapheme_Base # So [24] HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW -27B1..27BE ; Grapheme_Base # So [14] NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW -27D0..27E5 ; Grapheme_Base # Sm [22] WHITE DIAMOND WITH CENTRED DOT..WHITE SQUARE WITH RIGHTWARDS TICK -27E6 ; Grapheme_Base # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET -27E7 ; Grapheme_Base # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET -27E8 ; Grapheme_Base # Ps MATHEMATICAL LEFT ANGLE BRACKET -27E9 ; Grapheme_Base # Pe MATHEMATICAL RIGHT ANGLE BRACKET -27EA ; Grapheme_Base # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET -27EB ; Grapheme_Base # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET -27F0..27FF ; Grapheme_Base # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW -2800..28FF ; Grapheme_Base # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 -2900..2982 ; Grapheme_Base # Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON -2983 ; Grapheme_Base # Ps LEFT WHITE CURLY BRACKET -2984 ; Grapheme_Base # Pe RIGHT WHITE CURLY BRACKET -2985 ; Grapheme_Base # Ps LEFT WHITE PARENTHESIS -2986 ; Grapheme_Base # Pe RIGHT WHITE PARENTHESIS -2987 ; Grapheme_Base # Ps Z NOTATION LEFT IMAGE BRACKET -2988 ; Grapheme_Base # Pe Z NOTATION RIGHT IMAGE BRACKET -2989 ; Grapheme_Base # Ps Z NOTATION LEFT BINDING BRACKET -298A ; Grapheme_Base # Pe Z NOTATION RIGHT BINDING BRACKET -298B ; Grapheme_Base # Ps LEFT SQUARE BRACKET WITH UNDERBAR -298C ; Grapheme_Base # Pe RIGHT SQUARE BRACKET WITH UNDERBAR -298D ; Grapheme_Base # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER -298E ; Grapheme_Base # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER -298F ; Grapheme_Base # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER -2990 ; Grapheme_Base # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER -2991 ; Grapheme_Base # Ps LEFT ANGLE BRACKET WITH DOT -2992 ; Grapheme_Base # Pe RIGHT ANGLE BRACKET WITH DOT -2993 ; Grapheme_Base # Ps LEFT ARC LESS-THAN BRACKET -2994 ; Grapheme_Base # Pe RIGHT ARC GREATER-THAN BRACKET -2995 ; Grapheme_Base # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET -2996 ; Grapheme_Base # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET -2997 ; Grapheme_Base # Ps LEFT BLACK TORTOISE SHELL BRACKET -2998 ; Grapheme_Base # Pe RIGHT BLACK TORTOISE SHELL BRACKET -2999..29D7 ; Grapheme_Base # Sm [63] DOTTED FENCE..BLACK HOURGLASS -29D8 ; Grapheme_Base # Ps LEFT WIGGLY FENCE -29D9 ; Grapheme_Base # Pe RIGHT WIGGLY FENCE -29DA ; Grapheme_Base # Ps LEFT DOUBLE WIGGLY FENCE -29DB ; Grapheme_Base # Pe RIGHT DOUBLE WIGGLY FENCE -29DC..29FB ; Grapheme_Base # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS -29FC ; Grapheme_Base # Ps LEFT-POINTING CURVED ANGLE BRACKET -29FD ; Grapheme_Base # Pe RIGHT-POINTING CURVED ANGLE BRACKET -29FE..2AFF ; Grapheme_Base # Sm [258] TINY..N-ARY WHITE VERTICAL BAR -2B00..2B0D ; Grapheme_Base # So [14] NORTH EAST WHITE ARROW..UP DOWN BLACK ARROW -2E80..2E99 ; Grapheme_Base # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP -2E9B..2EF3 ; Grapheme_Base # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE -2F00..2FD5 ; Grapheme_Base # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE -2FF0..2FFB ; Grapheme_Base # So [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID -3000 ; Grapheme_Base # Zs IDEOGRAPHIC SPACE -3001..3003 ; Grapheme_Base # Po [3] IDEOGRAPHIC COMMA..DITTO MARK -3004 ; Grapheme_Base # So JAPANESE INDUSTRIAL STANDARD SYMBOL -3005 ; Grapheme_Base # Lm IDEOGRAPHIC ITERATION MARK -3006 ; Grapheme_Base # Lo IDEOGRAPHIC CLOSING MARK -3007 ; Grapheme_Base # Nl IDEOGRAPHIC NUMBER ZERO -3008 ; Grapheme_Base # Ps LEFT ANGLE BRACKET -3009 ; Grapheme_Base # Pe RIGHT ANGLE BRACKET -300A ; Grapheme_Base # Ps LEFT DOUBLE ANGLE BRACKET -300B ; Grapheme_Base # Pe RIGHT DOUBLE ANGLE BRACKET -300C ; Grapheme_Base # Ps LEFT CORNER BRACKET -300D ; Grapheme_Base # Pe RIGHT CORNER BRACKET -300E ; Grapheme_Base # Ps LEFT WHITE CORNER BRACKET -300F ; Grapheme_Base # Pe RIGHT WHITE CORNER BRACKET -3010 ; Grapheme_Base # Ps LEFT BLACK LENTICULAR BRACKET -3011 ; Grapheme_Base # Pe RIGHT BLACK LENTICULAR BRACKET -3012..3013 ; Grapheme_Base # So [2] POSTAL MARK..GETA MARK -3014 ; Grapheme_Base # Ps LEFT TORTOISE SHELL BRACKET -3015 ; Grapheme_Base # Pe RIGHT TORTOISE SHELL BRACKET -3016 ; Grapheme_Base # Ps LEFT WHITE LENTICULAR BRACKET -3017 ; Grapheme_Base # Pe RIGHT WHITE LENTICULAR BRACKET -3018 ; Grapheme_Base # Ps LEFT WHITE TORTOISE SHELL BRACKET -3019 ; Grapheme_Base # Pe RIGHT WHITE TORTOISE SHELL BRACKET -301A ; Grapheme_Base # Ps LEFT WHITE SQUARE BRACKET -301B ; Grapheme_Base # Pe RIGHT WHITE SQUARE BRACKET -301C ; Grapheme_Base # Pd WAVE DASH -301D ; Grapheme_Base # Ps REVERSED DOUBLE PRIME QUOTATION MARK -301E..301F ; Grapheme_Base # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK -3020 ; Grapheme_Base # So POSTAL MARK FACE -3021..3029 ; Grapheme_Base # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE -3030 ; Grapheme_Base # Pd WAVY DASH -3031..3035 ; Grapheme_Base # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF -3036..3037 ; Grapheme_Base # So [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL -3038..303A ; Grapheme_Base # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY -303B ; Grapheme_Base # Lm VERTICAL IDEOGRAPHIC ITERATION MARK -303C ; Grapheme_Base # Lo MASU MARK -303D ; Grapheme_Base # Po PART ALTERNATION MARK -303E..303F ; Grapheme_Base # So [2] IDEOGRAPHIC VARIATION INDICATOR..IDEOGRAPHIC HALF FILL SPACE -3041..3096 ; Grapheme_Base # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE -309B..309C ; Grapheme_Base # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK -309D..309E ; Grapheme_Base # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK -309F ; Grapheme_Base # Lo HIRAGANA DIGRAPH YORI -30A0 ; Grapheme_Base # Pd KATAKANA-HIRAGANA DOUBLE HYPHEN -30A1..30FA ; Grapheme_Base # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO -30FB ; Grapheme_Base # Pc KATAKANA MIDDLE DOT -30FC..30FE ; Grapheme_Base # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK -30FF ; Grapheme_Base # Lo KATAKANA DIGRAPH KOTO -3105..312C ; Grapheme_Base # Lo [40] BOPOMOFO LETTER B..BOPOMOFO LETTER GN -3131..318E ; Grapheme_Base # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE -3190..3191 ; Grapheme_Base # So [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK -3192..3195 ; Grapheme_Base # No [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK -3196..319F ; Grapheme_Base # So [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK -31A0..31B7 ; Grapheme_Base # Lo [24] BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H -31F0..31FF ; Grapheme_Base # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO -3200..321E ; Grapheme_Base # So [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU -3220..3229 ; Grapheme_Base # No [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN -322A..3243 ; Grapheme_Base # So [26] PARENTHESIZED IDEOGRAPH MOON..PARENTHESIZED IDEOGRAPH REACH -3250 ; Grapheme_Base # So PARTNERSHIP SIGN -3251..325F ; Grapheme_Base # No [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE -3260..327D ; Grapheme_Base # So [30] CIRCLED HANGUL KIYEOK..CIRCLED KOREAN CHARACTER JUEUI -327F ; Grapheme_Base # So KOREAN STANDARD SYMBOL -3280..3289 ; Grapheme_Base # No [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN -328A..32B0 ; Grapheme_Base # So [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT -32B1..32BF ; Grapheme_Base # No [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY -32C0..32FE ; Grapheme_Base # So [63] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..CIRCLED KATAKANA WO -3300..33FF ; Grapheme_Base # So [256] SQUARE APAATO..SQUARE GAL -3400..4DB5 ; Grapheme_Base # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 -4DC0..4DFF ; Grapheme_Base # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION -4E00..9FA5 ; Grapheme_Base # Lo [20902] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FA5 -A000..A48C ; Grapheme_Base # Lo [1165] YI SYLLABLE IT..YI SYLLABLE YYR -A490..A4C6 ; Grapheme_Base # So [55] YI RADICAL QOT..YI RADICAL KE -AC00..D7A3 ; Grapheme_Base # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH -F900..FA2D ; Grapheme_Base # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D -FA30..FA6A ; Grapheme_Base # Lo [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A -FB00..FB06 ; Grapheme_Base # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST -FB13..FB17 ; Grapheme_Base # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH -FB1D ; Grapheme_Base # Lo HEBREW LETTER YOD WITH HIRIQ -FB1F..FB28 ; Grapheme_Base # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV -FB29 ; Grapheme_Base # Sm HEBREW LETTER ALTERNATIVE PLUS SIGN -FB2A..FB36 ; Grapheme_Base # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH -FB38..FB3C ; Grapheme_Base # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH -FB3E ; Grapheme_Base # Lo HEBREW LETTER MEM WITH DAGESH -FB40..FB41 ; Grapheme_Base # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH -FB43..FB44 ; Grapheme_Base # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH -FB46..FBB1 ; Grapheme_Base # Lo [108] HEBREW LETTER TSADI WITH DAGESH..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM -FBD3..FD3D ; Grapheme_Base # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM -FD3E ; Grapheme_Base # Ps ORNATE LEFT PARENTHESIS -FD3F ; Grapheme_Base # Pe ORNATE RIGHT PARENTHESIS -FD50..FD8F ; Grapheme_Base # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM -FD92..FDC7 ; Grapheme_Base # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM -FDF0..FDFB ; Grapheme_Base # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU -FDFC ; Grapheme_Base # Sc RIAL SIGN -FDFD ; Grapheme_Base # So ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM -FE30 ; Grapheme_Base # Po PRESENTATION FORM FOR VERTICAL TWO DOT LEADER -FE31..FE32 ; Grapheme_Base # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH -FE33..FE34 ; Grapheme_Base # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE -FE35 ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS -FE36 ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS -FE37 ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET -FE38 ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET -FE39 ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET -FE3A ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET -FE3B ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET -FE3C ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET -FE3D ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET -FE3E ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET -FE3F ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET -FE40 ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET -FE41 ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET -FE42 ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET -FE43 ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET -FE44 ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET -FE45..FE46 ; Grapheme_Base # Po [2] SESAME DOT..WHITE SESAME DOT -FE47 ; Grapheme_Base # Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET -FE48 ; Grapheme_Base # Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET -FE49..FE4C ; Grapheme_Base # Po [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE -FE4D..FE4F ; Grapheme_Base # Pc [3] DASHED LOW LINE..WAVY LOW LINE -FE50..FE52 ; Grapheme_Base # Po [3] SMALL COMMA..SMALL FULL STOP -FE54..FE57 ; Grapheme_Base # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK -FE58 ; Grapheme_Base # Pd SMALL EM DASH -FE59 ; Grapheme_Base # Ps SMALL LEFT PARENTHESIS -FE5A ; Grapheme_Base # Pe SMALL RIGHT PARENTHESIS -FE5B ; Grapheme_Base # Ps SMALL LEFT CURLY BRACKET -FE5C ; Grapheme_Base # Pe SMALL RIGHT CURLY BRACKET -FE5D ; Grapheme_Base # Ps SMALL LEFT TORTOISE SHELL BRACKET -FE5E ; Grapheme_Base # Pe SMALL RIGHT TORTOISE SHELL BRACKET -FE5F..FE61 ; Grapheme_Base # Po [3] SMALL NUMBER SIGN..SMALL ASTERISK -FE62 ; Grapheme_Base # Sm SMALL PLUS SIGN -FE63 ; Grapheme_Base # Pd SMALL HYPHEN-MINUS -FE64..FE66 ; Grapheme_Base # Sm [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN -FE68 ; Grapheme_Base # Po SMALL REVERSE SOLIDUS -FE69 ; Grapheme_Base # Sc SMALL DOLLAR SIGN -FE6A..FE6B ; Grapheme_Base # Po [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT -FE70..FE74 ; Grapheme_Base # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM -FE76..FEFC ; Grapheme_Base # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM -FF01..FF03 ; Grapheme_Base # Po [3] FULLWIDTH EXCLAMATION MARK..FULLWIDTH NUMBER SIGN -FF04 ; Grapheme_Base # Sc FULLWIDTH DOLLAR SIGN -FF05..FF07 ; Grapheme_Base # Po [3] FULLWIDTH PERCENT SIGN..FULLWIDTH APOSTROPHE -FF08 ; Grapheme_Base # Ps FULLWIDTH LEFT PARENTHESIS -FF09 ; Grapheme_Base # Pe FULLWIDTH RIGHT PARENTHESIS -FF0A ; Grapheme_Base # Po FULLWIDTH ASTERISK -FF0B ; Grapheme_Base # Sm FULLWIDTH PLUS SIGN -FF0C ; Grapheme_Base # Po FULLWIDTH COMMA -FF0D ; Grapheme_Base # Pd FULLWIDTH HYPHEN-MINUS -FF0E..FF0F ; Grapheme_Base # Po [2] FULLWIDTH FULL STOP..FULLWIDTH SOLIDUS -FF10..FF19 ; Grapheme_Base # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE -FF1A..FF1B ; Grapheme_Base # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON -FF1C..FF1E ; Grapheme_Base # Sm [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN -FF1F..FF20 ; Grapheme_Base # Po [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT -FF21..FF3A ; Grapheme_Base # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z -FF3B ; Grapheme_Base # Ps FULLWIDTH LEFT SQUARE BRACKET -FF3C ; Grapheme_Base # Po FULLWIDTH REVERSE SOLIDUS -FF3D ; Grapheme_Base # Pe FULLWIDTH RIGHT SQUARE BRACKET -FF3E ; Grapheme_Base # Sk FULLWIDTH CIRCUMFLEX ACCENT -FF3F ; Grapheme_Base # Pc FULLWIDTH LOW LINE -FF40 ; Grapheme_Base # Sk FULLWIDTH GRAVE ACCENT -FF41..FF5A ; Grapheme_Base # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z -FF5B ; Grapheme_Base # Ps FULLWIDTH LEFT CURLY BRACKET -FF5C ; Grapheme_Base # Sm FULLWIDTH VERTICAL LINE -FF5D ; Grapheme_Base # Pe FULLWIDTH RIGHT CURLY BRACKET -FF5E ; Grapheme_Base # Sm FULLWIDTH TILDE -FF5F ; Grapheme_Base # Ps FULLWIDTH LEFT WHITE PARENTHESIS -FF60 ; Grapheme_Base # Pe FULLWIDTH RIGHT WHITE PARENTHESIS -FF61 ; Grapheme_Base # Po HALFWIDTH IDEOGRAPHIC FULL STOP -FF62 ; Grapheme_Base # Ps HALFWIDTH LEFT CORNER BRACKET -FF63 ; Grapheme_Base # Pe HALFWIDTH RIGHT CORNER BRACKET -FF64 ; Grapheme_Base # Po HALFWIDTH IDEOGRAPHIC COMMA -FF65 ; Grapheme_Base # Pc HALFWIDTH KATAKANA MIDDLE DOT -FF66..FF6F ; Grapheme_Base # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU -FF70 ; Grapheme_Base # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK -FF71..FF9D ; Grapheme_Base # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N -FF9E..FF9F ; Grapheme_Base # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK -FFA0..FFBE ; Grapheme_Base # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH -FFC2..FFC7 ; Grapheme_Base # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E -FFCA..FFCF ; Grapheme_Base # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE -FFD2..FFD7 ; Grapheme_Base # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU -FFDA..FFDC ; Grapheme_Base # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I -FFE0..FFE1 ; Grapheme_Base # Sc [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN -FFE2 ; Grapheme_Base # Sm FULLWIDTH NOT SIGN -FFE3 ; Grapheme_Base # Sk FULLWIDTH MACRON -FFE4 ; Grapheme_Base # So FULLWIDTH BROKEN BAR -FFE5..FFE6 ; Grapheme_Base # Sc [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN -FFE8 ; Grapheme_Base # So HALFWIDTH FORMS LIGHT VERTICAL -FFE9..FFEC ; Grapheme_Base # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW -FFED..FFEE ; Grapheme_Base # So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE -FFFC..FFFD ; Grapheme_Base # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER -10000..1000B ; Grapheme_Base # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE -1000D..10026 ; Grapheme_Base # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO -10028..1003A ; Grapheme_Base # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO -1003C..1003D ; Grapheme_Base # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE -1003F..1004D ; Grapheme_Base # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO -10050..1005D ; Grapheme_Base # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 -10080..100FA ; Grapheme_Base # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 -10100..10101 ; Grapheme_Base # Po [2] AEGEAN WORD SEPARATOR LINE..AEGEAN WORD SEPARATOR DOT -10102 ; Grapheme_Base # So AEGEAN CHECK MARK -10107..10133 ; Grapheme_Base # No [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND -10137..1013F ; Grapheme_Base # So [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT -10300..1031E ; Grapheme_Base # Lo [31] OLD ITALIC LETTER A..OLD ITALIC LETTER UU -10320..10323 ; Grapheme_Base # No [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY -10330..10349 ; Grapheme_Base # Lo [26] GOTHIC LETTER AHSA..GOTHIC LETTER OTHAL -1034A ; Grapheme_Base # Nl GOTHIC LETTER NINE HUNDRED -10380..1039D ; Grapheme_Base # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU -1039F ; Grapheme_Base # Po UGARITIC WORD DIVIDER -10400..1044F ; Grapheme_Base # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW -10450..1049D ; Grapheme_Base # Lo [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO -104A0..104A9 ; Grapheme_Base # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE -10800..10805 ; Grapheme_Base # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA -10808 ; Grapheme_Base # Lo CYPRIOT SYLLABLE JO -1080A..10835 ; Grapheme_Base # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO -10837..10838 ; Grapheme_Base # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE -1083C ; Grapheme_Base # Lo CYPRIOT SYLLABLE ZA -1083F ; Grapheme_Base # Lo CYPRIOT SYLLABLE ZO -1D000..1D0F5 ; Grapheme_Base # So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO -1D100..1D126 ; Grapheme_Base # So [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2 -1D12A..1D164 ; Grapheme_Base # So [59] MUSICAL SYMBOL DOUBLE SHARP..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE -1D166 ; Grapheme_Base # Mc MUSICAL SYMBOL COMBINING SPRECHGESANG STEM -1D16A..1D16C ; Grapheme_Base # So [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3 -1D16D ; Grapheme_Base # Mc MUSICAL SYMBOL COMBINING AUGMENTATION DOT -1D170..1D172 ; Grapheme_Base # Mc [3] MUSICAL SYMBOL COMBINING FLAG-3..MUSICAL SYMBOL COMBINING FLAG-5 -1D183..1D184 ; Grapheme_Base # So [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN -1D18C..1D1A9 ; Grapheme_Base # So [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH -1D1AE..1D1DD ; Grapheme_Base # So [48] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL PES SUBPUNCTIS -1D300..1D356 ; Grapheme_Base # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING -1D400..1D454 ; Grapheme_Base # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G -1D456..1D49C ; Grapheme_Base # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A -1D49E..1D49F ; Grapheme_Base # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D -1D4A2 ; Grapheme_Base # L& MATHEMATICAL SCRIPT CAPITAL G -1D4A5..1D4A6 ; Grapheme_Base # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K -1D4A9..1D4AC ; Grapheme_Base # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q -1D4AE..1D4B9 ; Grapheme_Base # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D -1D4BB ; Grapheme_Base # L& MATHEMATICAL SCRIPT SMALL F -1D4BD..1D4C3 ; Grapheme_Base # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N -1D4C5..1D505 ; Grapheme_Base # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B -1D507..1D50A ; Grapheme_Base # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G -1D50D..1D514 ; Grapheme_Base # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q -1D516..1D51C ; Grapheme_Base # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y -1D51E..1D539 ; Grapheme_Base # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B -1D53B..1D53E ; Grapheme_Base # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G -1D540..1D544 ; Grapheme_Base # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M -1D546 ; Grapheme_Base # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O -1D54A..1D550 ; Grapheme_Base # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y -1D552..1D6A3 ; Grapheme_Base # L& [338] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL MONOSPACE SMALL Z -1D6A8..1D6C0 ; Grapheme_Base # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA -1D6C1 ; Grapheme_Base # Sm MATHEMATICAL BOLD NABLA -1D6C2..1D6DA ; Grapheme_Base # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA -1D6DB ; Grapheme_Base # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL -1D6DC..1D6FA ; Grapheme_Base # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA -1D6FB ; Grapheme_Base # Sm MATHEMATICAL ITALIC NABLA -1D6FC..1D714 ; Grapheme_Base # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA -1D715 ; Grapheme_Base # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL -1D716..1D734 ; Grapheme_Base # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA -1D735 ; Grapheme_Base # Sm MATHEMATICAL BOLD ITALIC NABLA -1D736..1D74E ; Grapheme_Base # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA -1D74F ; Grapheme_Base # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL -1D750..1D76E ; Grapheme_Base # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA -1D76F ; Grapheme_Base # Sm MATHEMATICAL SANS-SERIF BOLD NABLA -1D770..1D788 ; Grapheme_Base # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA -1D789 ; Grapheme_Base # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL -1D78A..1D7A8 ; Grapheme_Base # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA -1D7A9 ; Grapheme_Base # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA -1D7AA..1D7C2 ; Grapheme_Base # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA -1D7C3 ; Grapheme_Base # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL -1D7C4..1D7C9 ; Grapheme_Base # L& [6] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL -1D7CE..1D7FF ; Grapheme_Base # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE -20000..2A6D6 ; Grapheme_Base # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 -2F800..2FA1D ; Grapheme_Base # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D - -# Total code points: 95425 +0020 ; Grapheme_Base +0021..0023 ; Grapheme_Base +0024 ; Grapheme_Base +0025..0027 ; Grapheme_Base +0028 ; Grapheme_Base +0029 ; Grapheme_Base +002A ; Grapheme_Base +002B ; Grapheme_Base +002C ; Grapheme_Base +002D ; Grapheme_Base +002E..002F ; Grapheme_Base +0030..0039 ; Grapheme_Base +003A..003B ; Grapheme_Base +003C..003E ; Grapheme_Base +003F..0040 ; Grapheme_Base +0041..005A ; Grapheme_Base +005B ; Grapheme_Base +005C ; Grapheme_Base +005D ; Grapheme_Base +005E ; Grapheme_Base +005F ; Grapheme_Base +0060 ; Grapheme_Base +0061..007A ; Grapheme_Base +007B ; Grapheme_Base +007C ; Grapheme_Base +007D ; Grapheme_Base +007E ; Grapheme_Base +00A0 ; Grapheme_Base +00A1 ; Grapheme_Base +00A2..00A5 ; Grapheme_Base +00A6..00A7 ; Grapheme_Base +00A8 ; Grapheme_Base +00A9 ; Grapheme_Base +00AA ; Grapheme_Base +00AB ; Grapheme_Base +00AC ; Grapheme_Base +00AE ; Grapheme_Base +00AF ; Grapheme_Base +00B0 ; Grapheme_Base +00B1 ; Grapheme_Base +00B2..00B3 ; Grapheme_Base +00B4 ; Grapheme_Base +00B5 ; Grapheme_Base +00B6 ; Grapheme_Base +00B7 ; Grapheme_Base +00B8 ; Grapheme_Base +00B9 ; Grapheme_Base +00BA ; Grapheme_Base +00BB ; Grapheme_Base +00BC..00BE ; Grapheme_Base +00BF ; Grapheme_Base +00C0..00D6 ; Grapheme_Base +00D7 ; Grapheme_Base +00D8..00F6 ; Grapheme_Base +00F7 ; Grapheme_Base +00F8..01BA ; Grapheme_Base +01BB ; Grapheme_Base +01BC..01BF ; Grapheme_Base +01C0..01C3 ; Grapheme_Base +01C4..0236 ; Grapheme_Base +0250..02AF ; Grapheme_Base +02B0..02C1 ; Grapheme_Base +02C2..02C5 ; Grapheme_Base +02C6..02D1 ; Grapheme_Base +02D2..02DF ; Grapheme_Base +02E0..02E4 ; Grapheme_Base +02E5..02ED ; Grapheme_Base +02EE ; Grapheme_Base +02EF..02FF ; Grapheme_Base +0374..0375 ; Grapheme_Base +037A ; Grapheme_Base +037E ; Grapheme_Base +0384..0385 ; Grapheme_Base +0386 ; Grapheme_Base +0387 ; Grapheme_Base +0388..038A ; Grapheme_Base +038C ; Grapheme_Base +038E..03A1 ; Grapheme_Base +03A3..03CE ; Grapheme_Base +03D0..03F5 ; Grapheme_Base +03F6 ; Grapheme_Base +03F7..03FB ; Grapheme_Base +0400..0481 ; Grapheme_Base +0482 ; Grapheme_Base +048A..04CE ; Grapheme_Base +04D0..04F5 ; Grapheme_Base +04F8..04F9 ; Grapheme_Base +0500..050F ; Grapheme_Base +0531..0556 ; Grapheme_Base +0559 ; Grapheme_Base +055A..055F ; Grapheme_Base +0561..0587 ; Grapheme_Base +0589 ; Grapheme_Base +058A ; Grapheme_Base +05BE ; Grapheme_Base +05C0 ; Grapheme_Base +05C3 ; Grapheme_Base +05D0..05EA ; Grapheme_Base +05F0..05F2 ; Grapheme_Base +05F3..05F4 ; Grapheme_Base +060C..060D ; Grapheme_Base +060E..060F ; Grapheme_Base +061B ; Grapheme_Base +061F ; Grapheme_Base +0621..063A ; Grapheme_Base +0640 ; Grapheme_Base +0641..064A ; Grapheme_Base +0660..0669 ; Grapheme_Base +066A..066D ; Grapheme_Base +066E..066F ; Grapheme_Base +0671..06D3 ; Grapheme_Base +06D4 ; Grapheme_Base +06D5 ; Grapheme_Base +06E5..06E6 ; Grapheme_Base +06E9 ; Grapheme_Base +06EE..06EF ; Grapheme_Base +06F0..06F9 ; Grapheme_Base +06FA..06FC ; Grapheme_Base +06FD..06FE ; Grapheme_Base +06FF ; Grapheme_Base +0700..070D ; Grapheme_Base +0710 ; Grapheme_Base +0712..072F ; Grapheme_Base +074D..074F ; Grapheme_Base +0780..07A5 ; Grapheme_Base +07B1 ; Grapheme_Base +0903 ; Grapheme_Base +0904..0939 ; Grapheme_Base +093D ; Grapheme_Base +093E..0940 ; Grapheme_Base +0949..094C ; Grapheme_Base +0950 ; Grapheme_Base +0958..0961 ; Grapheme_Base +0964..0965 ; Grapheme_Base +0966..096F ; Grapheme_Base +0970 ; Grapheme_Base +0982..0983 ; Grapheme_Base +0985..098C ; Grapheme_Base +098F..0990 ; Grapheme_Base +0993..09A8 ; Grapheme_Base +09AA..09B0 ; Grapheme_Base +09B2 ; Grapheme_Base +09B6..09B9 ; Grapheme_Base +09BD ; Grapheme_Base +09BF..09C0 ; Grapheme_Base +09C7..09C8 ; Grapheme_Base +09CB..09CC ; Grapheme_Base +09DC..09DD ; Grapheme_Base +09DF..09E1 ; Grapheme_Base +09E6..09EF ; Grapheme_Base +09F0..09F1 ; Grapheme_Base +09F2..09F3 ; Grapheme_Base +09F4..09F9 ; Grapheme_Base +09FA ; Grapheme_Base +0A03 ; Grapheme_Base +0A05..0A0A ; Grapheme_Base +0A0F..0A10 ; Grapheme_Base +0A13..0A28 ; Grapheme_Base +0A2A..0A30 ; Grapheme_Base +0A32..0A33 ; Grapheme_Base +0A35..0A36 ; Grapheme_Base +0A38..0A39 ; Grapheme_Base +0A3E..0A40 ; Grapheme_Base +0A59..0A5C ; Grapheme_Base +0A5E ; Grapheme_Base +0A66..0A6F ; Grapheme_Base +0A72..0A74 ; Grapheme_Base +0A83 ; Grapheme_Base +0A85..0A8D ; Grapheme_Base +0A8F..0A91 ; Grapheme_Base +0A93..0AA8 ; Grapheme_Base +0AAA..0AB0 ; Grapheme_Base +0AB2..0AB3 ; Grapheme_Base +0AB5..0AB9 ; Grapheme_Base +0ABD ; Grapheme_Base +0ABE..0AC0 ; Grapheme_Base +0AC9 ; Grapheme_Base +0ACB..0ACC ; Grapheme_Base +0AD0 ; Grapheme_Base +0AE0..0AE1 ; Grapheme_Base +0AE6..0AEF ; Grapheme_Base +0AF1 ; Grapheme_Base +0B02..0B03 ; Grapheme_Base +0B05..0B0C ; Grapheme_Base +0B0F..0B10 ; Grapheme_Base +0B13..0B28 ; Grapheme_Base +0B2A..0B30 ; Grapheme_Base +0B32..0B33 ; Grapheme_Base +0B35..0B39 ; Grapheme_Base +0B3D ; Grapheme_Base +0B40 ; Grapheme_Base +0B47..0B48 ; Grapheme_Base +0B4B..0B4C ; Grapheme_Base +0B5C..0B5D ; Grapheme_Base +0B5F..0B61 ; Grapheme_Base +0B66..0B6F ; Grapheme_Base +0B70 ; Grapheme_Base +0B71 ; Grapheme_Base +0B83 ; Grapheme_Base +0B85..0B8A ; Grapheme_Base +0B8E..0B90 ; Grapheme_Base +0B92..0B95 ; Grapheme_Base +0B99..0B9A ; Grapheme_Base +0B9C ; Grapheme_Base +0B9E..0B9F ; Grapheme_Base +0BA3..0BA4 ; Grapheme_Base +0BA8..0BAA ; Grapheme_Base +0BAE..0BB5 ; Grapheme_Base +0BB7..0BB9 ; Grapheme_Base +0BBF ; Grapheme_Base +0BC1..0BC2 ; Grapheme_Base +0BC6..0BC8 ; Grapheme_Base +0BCA..0BCC ; Grapheme_Base +0BE7..0BEF ; Grapheme_Base +0BF0..0BF2 ; Grapheme_Base +0BF3..0BF8 ; Grapheme_Base +0BF9 ; Grapheme_Base +0BFA ; Grapheme_Base +0C01..0C03 ; Grapheme_Base +0C05..0C0C ; Grapheme_Base +0C0E..0C10 ; Grapheme_Base +0C12..0C28 ; Grapheme_Base +0C2A..0C33 ; Grapheme_Base +0C35..0C39 ; Grapheme_Base +0C41..0C44 ; Grapheme_Base +0C60..0C61 ; Grapheme_Base +0C66..0C6F ; Grapheme_Base +0C82..0C83 ; Grapheme_Base +0C85..0C8C ; Grapheme_Base +0C8E..0C90 ; Grapheme_Base +0C92..0CA8 ; Grapheme_Base +0CAA..0CB3 ; Grapheme_Base +0CB5..0CB9 ; Grapheme_Base +0CBD ; Grapheme_Base +0CBE ; Grapheme_Base +0CC0..0CC1 ; Grapheme_Base +0CC3..0CC4 ; Grapheme_Base +0CC7..0CC8 ; Grapheme_Base +0CCA..0CCB ; Grapheme_Base +0CDE ; Grapheme_Base +0CE0..0CE1 ; Grapheme_Base +0CE6..0CEF ; Grapheme_Base +0D02..0D03 ; Grapheme_Base +0D05..0D0C ; Grapheme_Base +0D0E..0D10 ; Grapheme_Base +0D12..0D28 ; Grapheme_Base +0D2A..0D39 ; Grapheme_Base +0D3F..0D40 ; Grapheme_Base +0D46..0D48 ; Grapheme_Base +0D4A..0D4C ; Grapheme_Base +0D60..0D61 ; Grapheme_Base +0D66..0D6F ; Grapheme_Base +0D82..0D83 ; Grapheme_Base +0D85..0D96 ; Grapheme_Base +0D9A..0DB1 ; Grapheme_Base +0DB3..0DBB ; Grapheme_Base +0DBD ; Grapheme_Base +0DC0..0DC6 ; Grapheme_Base +0DD0..0DD1 ; Grapheme_Base +0DD8..0DDE ; Grapheme_Base +0DF2..0DF3 ; Grapheme_Base +0DF4 ; Grapheme_Base +0E01..0E30 ; Grapheme_Base +0E32..0E33 ; Grapheme_Base +0E3F ; Grapheme_Base +0E40..0E45 ; Grapheme_Base +0E46 ; Grapheme_Base +0E4F ; Grapheme_Base +0E50..0E59 ; Grapheme_Base +0E5A..0E5B ; Grapheme_Base +0E81..0E82 ; Grapheme_Base +0E84 ; Grapheme_Base +0E87..0E88 ; Grapheme_Base +0E8A ; Grapheme_Base +0E8D ; Grapheme_Base +0E94..0E97 ; Grapheme_Base +0E99..0E9F ; Grapheme_Base +0EA1..0EA3 ; Grapheme_Base +0EA5 ; Grapheme_Base +0EA7 ; Grapheme_Base +0EAA..0EAB ; Grapheme_Base +0EAD..0EB0 ; Grapheme_Base +0EB2..0EB3 ; Grapheme_Base +0EBD ; Grapheme_Base +0EC0..0EC4 ; Grapheme_Base +0EC6 ; Grapheme_Base +0ED0..0ED9 ; Grapheme_Base +0EDC..0EDD ; Grapheme_Base +0F00 ; Grapheme_Base +0F01..0F03 ; Grapheme_Base +0F04..0F12 ; Grapheme_Base +0F13..0F17 ; Grapheme_Base +0F1A..0F1F ; Grapheme_Base +0F20..0F29 ; Grapheme_Base +0F2A..0F33 ; Grapheme_Base +0F34 ; Grapheme_Base +0F36 ; Grapheme_Base +0F38 ; Grapheme_Base +0F3A ; Grapheme_Base +0F3B ; Grapheme_Base +0F3C ; Grapheme_Base +0F3D ; Grapheme_Base +0F3E..0F3F ; Grapheme_Base +0F40..0F47 ; Grapheme_Base +0F49..0F6A ; Grapheme_Base +0F7F ; Grapheme_Base +0F85 ; Grapheme_Base +0F88..0F8B ; Grapheme_Base +0FBE..0FC5 ; Grapheme_Base +0FC7..0FCC ; Grapheme_Base +0FCF ; Grapheme_Base +1000..1021 ; Grapheme_Base +1023..1027 ; Grapheme_Base +1029..102A ; Grapheme_Base +102C ; Grapheme_Base +1031 ; Grapheme_Base +1038 ; Grapheme_Base +1040..1049 ; Grapheme_Base +104A..104F ; Grapheme_Base +1050..1055 ; Grapheme_Base +1056..1057 ; Grapheme_Base +10A0..10C5 ; Grapheme_Base +10D0..10F8 ; Grapheme_Base +10FB ; Grapheme_Base +1100..1159 ; Grapheme_Base +115F..11A2 ; Grapheme_Base +11A8..11F9 ; Grapheme_Base +1200..1206 ; Grapheme_Base +1208..1246 ; Grapheme_Base +1248 ; Grapheme_Base +124A..124D ; Grapheme_Base +1250..1256 ; Grapheme_Base +1258 ; Grapheme_Base +125A..125D ; Grapheme_Base +1260..1286 ; Grapheme_Base +1288 ; Grapheme_Base +128A..128D ; Grapheme_Base +1290..12AE ; Grapheme_Base +12B0 ; Grapheme_Base +12B2..12B5 ; Grapheme_Base +12B8..12BE ; Grapheme_Base +12C0 ; Grapheme_Base +12C2..12C5 ; Grapheme_Base +12C8..12CE ; Grapheme_Base +12D0..12D6 ; Grapheme_Base +12D8..12EE ; Grapheme_Base +12F0..130E ; Grapheme_Base +1310 ; Grapheme_Base +1312..1315 ; Grapheme_Base +1318..131E ; Grapheme_Base +1320..1346 ; Grapheme_Base +1348..135A ; Grapheme_Base +1361..1368 ; Grapheme_Base +1369..1371 ; Grapheme_Base +1372..137C ; Grapheme_Base +13A0..13F4 ; Grapheme_Base +1401..166C ; Grapheme_Base +166D..166E ; Grapheme_Base +166F..1676 ; Grapheme_Base +1680 ; Grapheme_Base +1681..169A ; Grapheme_Base +169B ; Grapheme_Base +169C ; Grapheme_Base +16A0..16EA ; Grapheme_Base +16EB..16ED ; Grapheme_Base +16EE..16F0 ; Grapheme_Base +1700..170C ; Grapheme_Base +170E..1711 ; Grapheme_Base +1720..1731 ; Grapheme_Base +1735..1736 ; Grapheme_Base +1740..1751 ; Grapheme_Base +1760..176C ; Grapheme_Base +176E..1770 ; Grapheme_Base +1780..17B3 ; Grapheme_Base +17B6 ; Grapheme_Base +17BE..17C5 ; Grapheme_Base +17C7..17C8 ; Grapheme_Base +17D4..17D6 ; Grapheme_Base +17D7 ; Grapheme_Base +17D8..17DA ; Grapheme_Base +17DB ; Grapheme_Base +17DC ; Grapheme_Base +17E0..17E9 ; Grapheme_Base +17F0..17F9 ; Grapheme_Base +1800..1805 ; Grapheme_Base +1806 ; Grapheme_Base +1807..180A ; Grapheme_Base +180E ; Grapheme_Base +1810..1819 ; Grapheme_Base +1820..1842 ; Grapheme_Base +1843 ; Grapheme_Base +1844..1877 ; Grapheme_Base +1880..18A8 ; Grapheme_Base +1900..191C ; Grapheme_Base +1923..1926 ; Grapheme_Base +1929..192B ; Grapheme_Base +1930..1931 ; Grapheme_Base +1933..1938 ; Grapheme_Base +1940 ; Grapheme_Base +1944..1945 ; Grapheme_Base +1946..194F ; Grapheme_Base +1950..196D ; Grapheme_Base +1970..1974 ; Grapheme_Base +19E0..19FF ; Grapheme_Base +1D00..1D2B ; Grapheme_Base +1D2C..1D61 ; Grapheme_Base +1D62..1D6B ; Grapheme_Base +1E00..1E9B ; Grapheme_Base +1EA0..1EF9 ; Grapheme_Base +1F00..1F15 ; Grapheme_Base +1F18..1F1D ; Grapheme_Base +1F20..1F45 ; Grapheme_Base +1F48..1F4D ; Grapheme_Base +1F50..1F57 ; Grapheme_Base +1F59 ; Grapheme_Base +1F5B ; Grapheme_Base +1F5D ; Grapheme_Base +1F5F..1F7D ; Grapheme_Base +1F80..1FB4 ; Grapheme_Base +1FB6..1FBC ; Grapheme_Base +1FBD ; Grapheme_Base +1FBE ; Grapheme_Base +1FBF..1FC1 ; Grapheme_Base +1FC2..1FC4 ; Grapheme_Base +1FC6..1FCC ; Grapheme_Base +1FCD..1FCF ; Grapheme_Base +1FD0..1FD3 ; Grapheme_Base +1FD6..1FDB ; Grapheme_Base +1FDD..1FDF ; Grapheme_Base +1FE0..1FEC ; Grapheme_Base +1FED..1FEF ; Grapheme_Base +1FF2..1FF4 ; Grapheme_Base +1FF6..1FFC ; Grapheme_Base +1FFD..1FFE ; Grapheme_Base +2000..200A ; Grapheme_Base +2010..2015 ; Grapheme_Base +2016..2017 ; Grapheme_Base +2018 ; Grapheme_Base +2019 ; Grapheme_Base +201A ; Grapheme_Base +201B..201C ; Grapheme_Base +201D ; Grapheme_Base +201E ; Grapheme_Base +201F ; Grapheme_Base +2020..2027 ; Grapheme_Base +202F ; Grapheme_Base +2030..2038 ; Grapheme_Base +2039 ; Grapheme_Base +203A ; Grapheme_Base +203B..203E ; Grapheme_Base +203F..2040 ; Grapheme_Base +2041..2043 ; Grapheme_Base +2044 ; Grapheme_Base +2045 ; Grapheme_Base +2046 ; Grapheme_Base +2047..2051 ; Grapheme_Base +2052 ; Grapheme_Base +2053 ; Grapheme_Base +2054 ; Grapheme_Base +2057 ; Grapheme_Base +205F ; Grapheme_Base +2070 ; Grapheme_Base +2071 ; Grapheme_Base +2074..2079 ; Grapheme_Base +207A..207C ; Grapheme_Base +207D ; Grapheme_Base +207E ; Grapheme_Base +207F ; Grapheme_Base +2080..2089 ; Grapheme_Base +208A..208C ; Grapheme_Base +208D ; Grapheme_Base +208E ; Grapheme_Base +20A0..20B1 ; Grapheme_Base +2100..2101 ; Grapheme_Base +2102 ; Grapheme_Base +2103..2106 ; Grapheme_Base +2107 ; Grapheme_Base +2108..2109 ; Grapheme_Base +210A..2113 ; Grapheme_Base +2114 ; Grapheme_Base +2115 ; Grapheme_Base +2116..2118 ; Grapheme_Base +2119..211D ; Grapheme_Base +211E..2123 ; Grapheme_Base +2124 ; Grapheme_Base +2125 ; Grapheme_Base +2126 ; Grapheme_Base +2127 ; Grapheme_Base +2128 ; Grapheme_Base +2129 ; Grapheme_Base +212A..212D ; Grapheme_Base +212E ; Grapheme_Base +212F..2131 ; Grapheme_Base +2132 ; Grapheme_Base +2133..2134 ; Grapheme_Base +2135..2138 ; Grapheme_Base +2139 ; Grapheme_Base +213A..213B ; Grapheme_Base +213D..213F ; Grapheme_Base +2140..2144 ; Grapheme_Base +2145..2149 ; Grapheme_Base +214A ; Grapheme_Base +214B ; Grapheme_Base +2153..215F ; Grapheme_Base +2160..2183 ; Grapheme_Base +2190..2194 ; Grapheme_Base +2195..2199 ; Grapheme_Base +219A..219B ; Grapheme_Base +219C..219F ; Grapheme_Base +21A0 ; Grapheme_Base +21A1..21A2 ; Grapheme_Base +21A3 ; Grapheme_Base +21A4..21A5 ; Grapheme_Base +21A6 ; Grapheme_Base +21A7..21AD ; Grapheme_Base +21AE ; Grapheme_Base +21AF..21CD ; Grapheme_Base +21CE..21CF ; Grapheme_Base +21D0..21D1 ; Grapheme_Base +21D2 ; Grapheme_Base +21D3 ; Grapheme_Base +21D4 ; Grapheme_Base +21D5..21F3 ; Grapheme_Base +21F4..22FF ; Grapheme_Base +2300..2307 ; Grapheme_Base +2308..230B ; Grapheme_Base +230C..231F ; Grapheme_Base +2320..2321 ; Grapheme_Base +2322..2328 ; Grapheme_Base +2329 ; Grapheme_Base +232A ; Grapheme_Base +232B..237B ; Grapheme_Base +237C ; Grapheme_Base +237D..239A ; Grapheme_Base +239B..23B3 ; Grapheme_Base +23B4 ; Grapheme_Base +23B5 ; Grapheme_Base +23B6 ; Grapheme_Base +23B7..23D0 ; Grapheme_Base +2400..2426 ; Grapheme_Base +2440..244A ; Grapheme_Base +2460..249B ; Grapheme_Base +249C..24E9 ; Grapheme_Base +24EA..24FF ; Grapheme_Base +2500..25B6 ; Grapheme_Base +25B7 ; Grapheme_Base +25B8..25C0 ; Grapheme_Base +25C1 ; Grapheme_Base +25C2..25F7 ; Grapheme_Base +25F8..25FF ; Grapheme_Base +2600..2617 ; Grapheme_Base +2619..266E ; Grapheme_Base +266F ; Grapheme_Base +2670..267D ; Grapheme_Base +2680..2691 ; Grapheme_Base +26A0..26A1 ; Grapheme_Base +2701..2704 ; Grapheme_Base +2706..2709 ; Grapheme_Base +270C..2727 ; Grapheme_Base +2729..274B ; Grapheme_Base +274D ; Grapheme_Base +274F..2752 ; Grapheme_Base +2756 ; Grapheme_Base +2758..275E ; Grapheme_Base +2761..2767 ; Grapheme_Base +2768 ; Grapheme_Base +2769 ; Grapheme_Base +276A ; Grapheme_Base +276B ; Grapheme_Base +276C ; Grapheme_Base +276D ; Grapheme_Base +276E ; Grapheme_Base +276F ; Grapheme_Base +2770 ; Grapheme_Base +2771 ; Grapheme_Base +2772 ; Grapheme_Base +2773 ; Grapheme_Base +2774 ; Grapheme_Base +2775 ; Grapheme_Base +2776..2793 ; Grapheme_Base +2794 ; Grapheme_Base +2798..27AF ; Grapheme_Base +27B1..27BE ; Grapheme_Base +27D0..27E5 ; Grapheme_Base +27E6 ; Grapheme_Base +27E7 ; Grapheme_Base +27E8 ; Grapheme_Base +27E9 ; Grapheme_Base +27EA ; Grapheme_Base +27EB ; Grapheme_Base +27F0..27FF ; Grapheme_Base +2800..28FF ; Grapheme_Base +2900..2982 ; Grapheme_Base +2983 ; Grapheme_Base +2984 ; Grapheme_Base +2985 ; Grapheme_Base +2986 ; Grapheme_Base +2987 ; Grapheme_Base +2988 ; Grapheme_Base +2989 ; Grapheme_Base +298A ; Grapheme_Base +298B ; Grapheme_Base +298C ; Grapheme_Base +298D ; Grapheme_Base +298E ; Grapheme_Base +298F ; Grapheme_Base +2990 ; Grapheme_Base +2991 ; Grapheme_Base +2992 ; Grapheme_Base +2993 ; Grapheme_Base +2994 ; Grapheme_Base +2995 ; Grapheme_Base +2996 ; Grapheme_Base +2997 ; Grapheme_Base +2998 ; Grapheme_Base +2999..29D7 ; Grapheme_Base +29D8 ; Grapheme_Base +29D9 ; Grapheme_Base +29DA ; Grapheme_Base +29DB ; Grapheme_Base +29DC..29FB ; Grapheme_Base +29FC ; Grapheme_Base +29FD ; Grapheme_Base +29FE..2AFF ; Grapheme_Base +2B00..2B0D ; Grapheme_Base +2E80..2E99 ; Grapheme_Base +2E9B..2EF3 ; Grapheme_Base +2F00..2FD5 ; Grapheme_Base +2FF0..2FFB ; Grapheme_Base +3000 ; Grapheme_Base +3001..3003 ; Grapheme_Base +3004 ; Grapheme_Base +3005 ; Grapheme_Base +3006 ; Grapheme_Base +3007 ; Grapheme_Base +3008 ; Grapheme_Base +3009 ; Grapheme_Base +300A ; Grapheme_Base +300B ; Grapheme_Base +300C ; Grapheme_Base +300D ; Grapheme_Base +300E ; Grapheme_Base +300F ; Grapheme_Base +3010 ; Grapheme_Base +3011 ; Grapheme_Base +3012..3013 ; Grapheme_Base +3014 ; Grapheme_Base +3015 ; Grapheme_Base +3016 ; Grapheme_Base +3017 ; Grapheme_Base +3018 ; Grapheme_Base +3019 ; Grapheme_Base +301A ; Grapheme_Base +301B ; Grapheme_Base +301C ; Grapheme_Base +301D ; Grapheme_Base +301E..301F ; Grapheme_Base +3020 ; Grapheme_Base +3021..3029 ; Grapheme_Base +3030 ; Grapheme_Base +3031..3035 ; Grapheme_Base +3036..3037 ; Grapheme_Base +3038..303A ; Grapheme_Base +303B ; Grapheme_Base +303C ; Grapheme_Base +303D ; Grapheme_Base +303E..303F ; Grapheme_Base +3041..3096 ; Grapheme_Base +309B..309C ; Grapheme_Base +309D..309E ; Grapheme_Base +309F ; Grapheme_Base +30A0 ; Grapheme_Base +30A1..30FA ; Grapheme_Base +30FB ; Grapheme_Base +30FC..30FE ; Grapheme_Base +30FF ; Grapheme_Base +3105..312C ; Grapheme_Base +3131..318E ; Grapheme_Base +3190..3191 ; Grapheme_Base +3192..3195 ; Grapheme_Base +3196..319F ; Grapheme_Base +31A0..31B7 ; Grapheme_Base +31F0..31FF ; Grapheme_Base +3200..321E ; Grapheme_Base +3220..3229 ; Grapheme_Base +322A..3243 ; Grapheme_Base +3250 ; Grapheme_Base +3251..325F ; Grapheme_Base +3260..327D ; Grapheme_Base +327F ; Grapheme_Base +3280..3289 ; Grapheme_Base +328A..32B0 ; Grapheme_Base +32B1..32BF ; Grapheme_Base +32C0..32FE ; Grapheme_Base +3300..33FF ; Grapheme_Base +3400..4DB5 ; Grapheme_Base +4DC0..4DFF ; Grapheme_Base +4E00..9FA5 ; Grapheme_Base +A000..A48C ; Grapheme_Base +A490..A4C6 ; Grapheme_Base +AC00..D7A3 ; Grapheme_Base +F900..FA2D ; Grapheme_Base +FA30..FA6A ; Grapheme_Base +FB00..FB06 ; Grapheme_Base +FB13..FB17 ; Grapheme_Base +FB1D ; Grapheme_Base +FB1F..FB28 ; Grapheme_Base +FB29 ; Grapheme_Base +FB2A..FB36 ; Grapheme_Base +FB38..FB3C ; Grapheme_Base +FB3E ; Grapheme_Base +FB40..FB41 ; Grapheme_Base +FB43..FB44 ; Grapheme_Base +FB46..FBB1 ; Grapheme_Base +FBD3..FD3D ; Grapheme_Base +FD3E ; Grapheme_Base +FD3F ; Grapheme_Base +FD50..FD8F ; Grapheme_Base +FD92..FDC7 ; Grapheme_Base +FDF0..FDFB ; Grapheme_Base +FDFC ; Grapheme_Base +FDFD ; Grapheme_Base +FE30 ; Grapheme_Base +FE31..FE32 ; Grapheme_Base +FE33..FE34 ; Grapheme_Base +FE35 ; Grapheme_Base +FE36 ; Grapheme_Base +FE37 ; Grapheme_Base +FE38 ; Grapheme_Base +FE39 ; Grapheme_Base +FE3A ; Grapheme_Base +FE3B ; Grapheme_Base +FE3C ; Grapheme_Base +FE3D ; Grapheme_Base +FE3E ; Grapheme_Base +FE3F ; Grapheme_Base +FE40 ; Grapheme_Base +FE41 ; Grapheme_Base +FE42 ; Grapheme_Base +FE43 ; Grapheme_Base +FE44 ; Grapheme_Base +FE45..FE46 ; Grapheme_Base +FE47 ; Grapheme_Base +FE48 ; Grapheme_Base +FE49..FE4C ; Grapheme_Base +FE4D..FE4F ; Grapheme_Base +FE50..FE52 ; Grapheme_Base +FE54..FE57 ; Grapheme_Base +FE58 ; Grapheme_Base +FE59 ; Grapheme_Base +FE5A ; Grapheme_Base +FE5B ; Grapheme_Base +FE5C ; Grapheme_Base +FE5D ; Grapheme_Base +FE5E ; Grapheme_Base +FE5F..FE61 ; Grapheme_Base +FE62 ; Grapheme_Base +FE63 ; Grapheme_Base +FE64..FE66 ; Grapheme_Base +FE68 ; Grapheme_Base +FE69 ; Grapheme_Base +FE6A..FE6B ; Grapheme_Base +FE70..FE74 ; Grapheme_Base +FE76..FEFC ; Grapheme_Base +FF01..FF03 ; Grapheme_Base +FF04 ; Grapheme_Base +FF05..FF07 ; Grapheme_Base +FF08 ; Grapheme_Base +FF09 ; Grapheme_Base +FF0A ; Grapheme_Base +FF0B ; Grapheme_Base +FF0C ; Grapheme_Base +FF0D ; Grapheme_Base +FF0E..FF0F ; Grapheme_Base +FF10..FF19 ; Grapheme_Base +FF1A..FF1B ; Grapheme_Base +FF1C..FF1E ; Grapheme_Base +FF1F..FF20 ; Grapheme_Base +FF21..FF3A ; Grapheme_Base +FF3B ; Grapheme_Base +FF3C ; Grapheme_Base +FF3D ; Grapheme_Base +FF3E ; Grapheme_Base +FF3F ; Grapheme_Base +FF40 ; Grapheme_Base +FF41..FF5A ; Grapheme_Base +FF5B ; Grapheme_Base +FF5C ; Grapheme_Base +FF5D ; Grapheme_Base +FF5E ; Grapheme_Base +FF5F ; Grapheme_Base +FF60 ; Grapheme_Base +FF61 ; Grapheme_Base +FF62 ; Grapheme_Base +FF63 ; Grapheme_Base +FF64 ; Grapheme_Base +FF65 ; Grapheme_Base +FF66..FF6F ; Grapheme_Base +FF70 ; Grapheme_Base +FF71..FF9D ; Grapheme_Base +FF9E..FF9F ; Grapheme_Base +FFA0..FFBE ; Grapheme_Base +FFC2..FFC7 ; Grapheme_Base +FFCA..FFCF ; Grapheme_Base +FFD2..FFD7 ; Grapheme_Base +FFDA..FFDC ; Grapheme_Base +FFE0..FFE1 ; Grapheme_Base +FFE2 ; Grapheme_Base +FFE3 ; Grapheme_Base +FFE4 ; Grapheme_Base +FFE5..FFE6 ; Grapheme_Base +FFE8 ; Grapheme_Base +FFE9..FFEC ; Grapheme_Base +FFED..FFEE ; Grapheme_Base +FFFC..FFFD ; Grapheme_Base +10000..1000B ; Grapheme_Base +1000D..10026 ; Grapheme_Base +10028..1003A ; Grapheme_Base +1003C..1003D ; Grapheme_Base +1003F..1004D ; Grapheme_Base +10050..1005D ; Grapheme_Base +10080..100FA ; Grapheme_Base +10100..10101 ; Grapheme_Base +10102 ; Grapheme_Base +10107..10133 ; Grapheme_Base +10137..1013F ; Grapheme_Base +10300..1031E ; Grapheme_Base +10320..10323 ; Grapheme_Base +10330..10349 ; Grapheme_Base +1034A ; Grapheme_Base +10380..1039D ; Grapheme_Base +1039F ; Grapheme_Base +10400..1044F ; Grapheme_Base +10450..1049D ; Grapheme_Base +104A0..104A9 ; Grapheme_Base +10800..10805 ; Grapheme_Base +10808 ; Grapheme_Base +1080A..10835 ; Grapheme_Base +10837..10838 ; Grapheme_Base +1083C ; Grapheme_Base +1083F ; Grapheme_Base +1D000..1D0F5 ; Grapheme_Base +1D100..1D126 ; Grapheme_Base +1D12A..1D164 ; Grapheme_Base +1D166 ; Grapheme_Base +1D16A..1D16C ; Grapheme_Base +1D16D ; Grapheme_Base +1D170..1D172 ; Grapheme_Base +1D183..1D184 ; Grapheme_Base +1D18C..1D1A9 ; Grapheme_Base +1D1AE..1D1DD ; Grapheme_Base +1D300..1D356 ; Grapheme_Base +1D400..1D454 ; Grapheme_Base +1D456..1D49C ; Grapheme_Base +1D49E..1D49F ; Grapheme_Base +1D4A2 ; Grapheme_Base +1D4A5..1D4A6 ; Grapheme_Base +1D4A9..1D4AC ; Grapheme_Base +1D4AE..1D4B9 ; Grapheme_Base +1D4BB ; Grapheme_Base +1D4BD..1D4C3 ; Grapheme_Base +1D4C5..1D505 ; Grapheme_Base +1D507..1D50A ; Grapheme_Base +1D50D..1D514 ; Grapheme_Base +1D516..1D51C ; Grapheme_Base +1D51E..1D539 ; Grapheme_Base +1D53B..1D53E ; Grapheme_Base +1D540..1D544 ; Grapheme_Base +1D546 ; Grapheme_Base +1D54A..1D550 ; Grapheme_Base +1D552..1D6A3 ; Grapheme_Base +1D6A8..1D6C0 ; Grapheme_Base +1D6C1 ; Grapheme_Base +1D6C2..1D6DA ; Grapheme_Base +1D6DB ; Grapheme_Base +1D6DC..1D6FA ; Grapheme_Base +1D6FB ; Grapheme_Base +1D6FC..1D714 ; Grapheme_Base +1D715 ; Grapheme_Base +1D716..1D734 ; Grapheme_Base +1D735 ; Grapheme_Base +1D736..1D74E ; Grapheme_Base +1D74F ; Grapheme_Base +1D750..1D76E ; Grapheme_Base +1D76F ; Grapheme_Base +1D770..1D788 ; Grapheme_Base +1D789 ; Grapheme_Base +1D78A..1D7A8 ; Grapheme_Base +1D7A9 ; Grapheme_Base +1D7AA..1D7C2 ; Grapheme_Base +1D7C3 ; Grapheme_Base +1D7C4..1D7C9 ; Grapheme_Base +1D7CE..1D7FF ; Grapheme_Base +20000..2A6D6 ; Grapheme_Base +2F800..2FA1D ; Grapheme_Base +# Total code points: 95424 diff --git a/icuSources/data/unidata/DerivedJoiningGroup.txt b/icuSources/data/unidata/DerivedJoiningGroup.txt index 85326cc0..b12a7a41 100644 --- a/icuSources/data/unidata/DerivedJoiningGroup.txt +++ b/icuSources/data/unidata/DerivedJoiningGroup.txt @@ -1,71 +1,71 @@ -# DerivedJoiningGroup-4.0.0.txt -# Date: 2003-04-05, 02:41:45 GMT [MD] +# DerivedJoiningGroup-4.0.1.txt +# Date: 2004-03-02, 02:42:04 GMT [MD] # -# Unicode Character Database: Derived Property Data -# Generated algorithmically from the Unicode Character Database +# Unicode Character Database +# Copyright (c) 1991-2004 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html # For documentation, see UCD.html -# Note: Unassigned and Noncharacter codepoints may be omitted -# if they have default property values. -# ================================================ - # ================================================ + # Joining Group (listing ArabicShaping.txt, field 3) -# All code points not explicitly listed in this file have the property -# value: NO_JOINING_GROUP. + +# All code points not explicitly listed for Joining_Group +# have the value No_Joining_Group. + # ================================================ -0639..063A ; AIN # Lo [2] ARABIC LETTER AIN..ARABIC LETTER GHAIN -06A0 ; AIN # Lo ARABIC LETTER AIN WITH THREE DOTS ABOVE -06FC ; AIN # Lo ARABIC LETTER GHAIN WITH DOT BELOW +0639..063A ; Ain # Lo [2] ARABIC LETTER AIN..ARABIC LETTER GHAIN +06A0 ; Ain # Lo ARABIC LETTER AIN WITH THREE DOTS ABOVE +06FC ; Ain # Lo ARABIC LETTER GHAIN WITH DOT BELOW # Total code points: 4 # ================================================ -0710 ; ALAPH # Lo SYRIAC LETTER ALAPH +0710 ; Alaph # Lo SYRIAC LETTER ALAPH # Total code points: 1 # ================================================ -0622..0623 ; ALEF # Lo [2] ARABIC LETTER ALEF WITH MADDA ABOVE..ARABIC LETTER ALEF WITH HAMZA ABOVE -0625 ; ALEF # Lo ARABIC LETTER ALEF WITH HAMZA BELOW -0627 ; ALEF # Lo ARABIC LETTER ALEF -0671..0673 ; ALEF # Lo [3] ARABIC LETTER ALEF WASLA..ARABIC LETTER ALEF WITH WAVY HAMZA BELOW -0675 ; ALEF # Lo ARABIC LETTER HIGH HAMZA ALEF +0622..0623 ; Alef # Lo [2] ARABIC LETTER ALEF WITH MADDA ABOVE..ARABIC LETTER ALEF WITH HAMZA ABOVE +0625 ; Alef # Lo ARABIC LETTER ALEF WITH HAMZA BELOW +0627 ; Alef # Lo ARABIC LETTER ALEF +0671..0673 ; Alef # Lo [3] ARABIC LETTER ALEF WASLA..ARABIC LETTER ALEF WITH WAVY HAMZA BELOW +0675 ; Alef # Lo ARABIC LETTER HIGH HAMZA ALEF # Total code points: 8 # ================================================ -0628 ; BEH # Lo ARABIC LETTER BEH -062A..062B ; BEH # Lo [2] ARABIC LETTER TEH..ARABIC LETTER THEH -066E ; BEH # Lo ARABIC LETTER DOTLESS BEH -0679..0680 ; BEH # Lo [8] ARABIC LETTER TTEH..ARABIC LETTER BEHEH +0628 ; Beh # Lo ARABIC LETTER BEH +062A..062B ; Beh # Lo [2] ARABIC LETTER TEH..ARABIC LETTER THEH +066E ; Beh # Lo ARABIC LETTER DOTLESS BEH +0679..0680 ; Beh # Lo [8] ARABIC LETTER TTEH..ARABIC LETTER BEHEH # Total code points: 12 # ================================================ -0712 ; BETH # Lo SYRIAC LETTER BETH -072D ; BETH # Lo SYRIAC LETTER PERSIAN BHETH +0712 ; Beth # Lo SYRIAC LETTER BETH +072D ; Beth # Lo SYRIAC LETTER PERSIAN BHETH # Total code points: 2 # ================================================ -062F..0630 ; DAL # Lo [2] ARABIC LETTER DAL..ARABIC LETTER THAL -0688..0690 ; DAL # Lo [9] ARABIC LETTER DDAL..ARABIC LETTER DAL WITH FOUR DOTS ABOVE -06EE ; DAL # Lo ARABIC LETTER DAL WITH INVERTED V +062F..0630 ; Dal # Lo [2] ARABIC LETTER DAL..ARABIC LETTER THAL +0688..0690 ; Dal # Lo [9] ARABIC LETTER DDAL..ARABIC LETTER DAL WITH FOUR DOTS ABOVE +06EE ; Dal # Lo ARABIC LETTER DAL WITH INVERTED V # Total code points: 12 # ================================================ -0715..0716 ; DALATH_RISH # Lo [2] SYRIAC LETTER DALATH..SYRIAC LETTER DOTLESS DALATH RISH -072A ; DALATH_RISH # Lo SYRIAC LETTER RISH -072F ; DALATH_RISH # Lo SYRIAC LETTER PERSIAN DHALATH +0715..0716 ; Dalath_Rish # Lo [2] SYRIAC LETTER DALATH..SYRIAC LETTER DOTLESS DALATH RISH +072A ; Dalath_Rish # Lo SYRIAC LETTER RISH +072F ; Dalath_Rish # Lo SYRIAC LETTER PERSIAN DHALATH # Total code points: 4 @@ -77,301 +77,300 @@ # ================================================ -0641 ; FEH # Lo ARABIC LETTER FEH -06A1..06A6 ; FEH # Lo [6] ARABIC LETTER DOTLESS FEH..ARABIC LETTER PEHEH +0641 ; Feh # Lo ARABIC LETTER FEH +06A1..06A6 ; Feh # Lo [6] ARABIC LETTER DOTLESS FEH..ARABIC LETTER PEHEH # Total code points: 7 # ================================================ -0724 ; FINAL_SEMKATH # Lo SYRIAC LETTER FINAL SEMKATH +0724 ; Final_Semkath # Lo SYRIAC LETTER FINAL SEMKATH # Total code points: 1 # ================================================ -06A9 ; GAF # Lo ARABIC LETTER KEHEH -06AB ; GAF # Lo ARABIC LETTER KAF WITH RING -06AF..06B4 ; GAF # Lo [6] ARABIC LETTER GAF..ARABIC LETTER GAF WITH THREE DOTS ABOVE +06A9 ; Gaf # Lo ARABIC LETTER KEHEH +06AB ; Gaf # Lo ARABIC LETTER KAF WITH RING +06AF..06B4 ; Gaf # Lo [6] ARABIC LETTER GAF..ARABIC LETTER GAF WITH THREE DOTS ABOVE # Total code points: 8 # ================================================ -0713..0714 ; GAMAL # Lo [2] SYRIAC LETTER GAMAL..SYRIAC LETTER GAMAL GARSHUNI -072E ; GAMAL # Lo SYRIAC LETTER PERSIAN GHAMAL +0713..0714 ; Gamal # Lo [2] SYRIAC LETTER GAMAL..SYRIAC LETTER GAMAL GARSHUNI +072E ; Gamal # Lo SYRIAC LETTER PERSIAN GHAMAL # Total code points: 3 # ================================================ -062C..062E ; HAH # Lo [3] ARABIC LETTER JEEM..ARABIC LETTER KHAH -0681..0687 ; HAH # Lo [7] ARABIC LETTER HAH WITH HAMZA ABOVE..ARABIC LETTER TCHEHEH -06BF ; HAH # Lo ARABIC LETTER TCHEH WITH DOT ABOVE +062C..062E ; Hah # Lo [3] ARABIC LETTER JEEM..ARABIC LETTER KHAH +0681..0687 ; Hah # Lo [7] ARABIC LETTER HAH WITH HAMZA ABOVE..ARABIC LETTER TCHEHEH +06BF ; Hah # Lo ARABIC LETTER TCHEH WITH DOT ABOVE # Total code points: 11 # ================================================ -06C2..06C3 ; HAMZA_ON_HEH_GOAL # Lo [2] ARABIC LETTER HEH GOAL WITH HAMZA ABOVE..ARABIC LETTER TEH MARBUTA GOAL +06C2..06C3 ; Hamza_On_Heh_Goal # Lo [2] ARABIC LETTER HEH GOAL WITH HAMZA ABOVE..ARABIC LETTER TEH MARBUTA GOAL # Total code points: 2 # ================================================ -0717 ; HE # Lo SYRIAC LETTER HE +0717 ; He # Lo SYRIAC LETTER HE # Total code points: 1 # ================================================ -0647 ; HEH # Lo ARABIC LETTER HEH +0647 ; Heh # Lo ARABIC LETTER HEH # Total code points: 1 # ================================================ -06C1 ; HEH_GOAL # Lo ARABIC LETTER HEH GOAL +06C1 ; Heh_Goal # Lo ARABIC LETTER HEH GOAL # Total code points: 1 # ================================================ -071A ; HETH # Lo SYRIAC LETTER HETH +071A ; Heth # Lo SYRIAC LETTER HETH # Total code points: 1 # ================================================ -0643 ; KAF # Lo ARABIC LETTER KAF -06AC..06AE ; KAF # Lo [3] ARABIC LETTER KAF WITH DOT ABOVE..ARABIC LETTER KAF WITH THREE DOTS BELOW +0643 ; Kaf # Lo ARABIC LETTER KAF +06AC..06AE ; Kaf # Lo [3] ARABIC LETTER KAF WITH DOT ABOVE..ARABIC LETTER KAF WITH THREE DOTS BELOW # Total code points: 4 # ================================================ -071F ; KAPH # Lo SYRIAC LETTER KAPH +071F ; Kaph # Lo SYRIAC LETTER KAPH # Total code points: 1 # ================================================ -06BE ; KNOTTED_HEH # Lo ARABIC LETTER HEH DOACHASHMEE -06FF ; KNOTTED_HEH # Lo ARABIC LETTER HEH WITH INVERTED V +06BE ; Knotted_Heh # Lo ARABIC LETTER HEH DOACHASHMEE +06FF ; Knotted_Heh # Lo ARABIC LETTER HEH WITH INVERTED V # Total code points: 2 # ================================================ -0644 ; LAM # Lo ARABIC LETTER LAM -06B5..06B8 ; LAM # Lo [4] ARABIC LETTER LAM WITH SMALL V..ARABIC LETTER LAM WITH THREE DOTS BELOW +0644 ; Lam # Lo ARABIC LETTER LAM +06B5..06B8 ; Lam # Lo [4] ARABIC LETTER LAM WITH SMALL V..ARABIC LETTER LAM WITH THREE DOTS BELOW # Total code points: 5 # ================================================ -0720 ; LAMADH # Lo SYRIAC LETTER LAMADH +0720 ; Lamadh # Lo SYRIAC LETTER LAMADH # Total code points: 1 # ================================================ -0645 ; MEEM # Lo ARABIC LETTER MEEM +0645 ; Meem # Lo ARABIC LETTER MEEM # Total code points: 1 # ================================================ -0721 ; MIM # Lo SYRIAC LETTER MIM +0721 ; Mim # Lo SYRIAC LETTER MIM # Total code points: 1 # ================================================ -0646 ; NOON # Lo ARABIC LETTER NOON -06B9..06BD ; NOON # Lo [5] ARABIC LETTER NOON WITH DOT BELOW..ARABIC LETTER NOON WITH THREE DOTS ABOVE +0646 ; Noon # Lo ARABIC LETTER NOON +06B9..06BD ; Noon # Lo [5] ARABIC LETTER NOON WITH DOT BELOW..ARABIC LETTER NOON WITH THREE DOTS ABOVE # Total code points: 6 # ================================================ -0722 ; NUN # Lo SYRIAC LETTER NUN +0722 ; Nun # Lo SYRIAC LETTER NUN # Total code points: 1 # ================================================ -0726 ; PE # Lo SYRIAC LETTER PE +0726 ; Pe # Lo SYRIAC LETTER PE # Total code points: 1 # ================================================ -0642 ; QAF # Lo ARABIC LETTER QAF -066F ; QAF # Lo ARABIC LETTER DOTLESS QAF -06A7..06A8 ; QAF # Lo [2] ARABIC LETTER QAF WITH DOT ABOVE..ARABIC LETTER QAF WITH THREE DOTS ABOVE +0642 ; Qaf # Lo ARABIC LETTER QAF +066F ; Qaf # Lo ARABIC LETTER DOTLESS QAF +06A7..06A8 ; Qaf # Lo [2] ARABIC LETTER QAF WITH DOT ABOVE..ARABIC LETTER QAF WITH THREE DOTS ABOVE # Total code points: 4 # ================================================ -0729 ; QAPH # Lo SYRIAC LETTER QAPH +0729 ; Qaph # Lo SYRIAC LETTER QAPH # Total code points: 1 # ================================================ -0631..0632 ; REH # Lo [2] ARABIC LETTER REH..ARABIC LETTER ZAIN -0691..0699 ; REH # Lo [9] ARABIC LETTER RREH..ARABIC LETTER REH WITH FOUR DOTS ABOVE -06EF ; REH # Lo ARABIC LETTER REH WITH INVERTED V +0631..0632 ; Reh # Lo [2] ARABIC LETTER REH..ARABIC LETTER ZAIN +0691..0699 ; Reh # Lo [9] ARABIC LETTER RREH..ARABIC LETTER REH WITH FOUR DOTS ABOVE +06EF ; Reh # Lo ARABIC LETTER REH WITH INVERTED V # Total code points: 12 # ================================================ -0727 ; REVERSED_PE # Lo SYRIAC LETTER REVERSED PE +0727 ; Reversed_Pe # Lo SYRIAC LETTER REVERSED PE # Total code points: 1 # ================================================ -0635..0636 ; SAD # Lo [2] ARABIC LETTER SAD..ARABIC LETTER DAD -069D..069E ; SAD # Lo [2] ARABIC LETTER SAD WITH TWO DOTS BELOW..ARABIC LETTER SAD WITH THREE DOTS ABOVE -06FB ; SAD # Lo ARABIC LETTER DAD WITH DOT BELOW +0635..0636 ; Sad # Lo [2] ARABIC LETTER SAD..ARABIC LETTER DAD +069D..069E ; Sad # Lo [2] ARABIC LETTER SAD WITH TWO DOTS BELOW..ARABIC LETTER SAD WITH THREE DOTS ABOVE +06FB ; Sad # Lo ARABIC LETTER DAD WITH DOT BELOW # Total code points: 5 # ================================================ -0728 ; SADHE # Lo SYRIAC LETTER SADHE +0728 ; Sadhe # Lo SYRIAC LETTER SADHE # Total code points: 1 # ================================================ -0633..0634 ; SEEN # Lo [2] ARABIC LETTER SEEN..ARABIC LETTER SHEEN -069A..069C ; SEEN # Lo [3] ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE..ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE -06FA ; SEEN # Lo ARABIC LETTER SHEEN WITH DOT BELOW +0633..0634 ; Seen # Lo [2] ARABIC LETTER SEEN..ARABIC LETTER SHEEN +069A..069C ; Seen # Lo [3] ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE..ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE +06FA ; Seen # Lo ARABIC LETTER SHEEN WITH DOT BELOW # Total code points: 6 # ================================================ -0723 ; SEMKATH # Lo SYRIAC LETTER SEMKATH +0723 ; Semkath # Lo SYRIAC LETTER SEMKATH # Total code points: 1 # ================================================ -072B ; SHIN # Lo SYRIAC LETTER SHIN +072B ; Shin # Lo SYRIAC LETTER SHIN # Total code points: 1 # ================================================ -06AA ; SWASH_KAF # Lo ARABIC LETTER SWASH KAF +06AA ; Swash_Kaf # Lo ARABIC LETTER SWASH KAF # Total code points: 1 # ================================================ -0637..0638 ; TAH # Lo [2] ARABIC LETTER TAH..ARABIC LETTER ZAH -069F ; TAH # Lo ARABIC LETTER TAH WITH THREE DOTS ABOVE +0637..0638 ; Tah # Lo [2] ARABIC LETTER TAH..ARABIC LETTER ZAH +069F ; Tah # Lo ARABIC LETTER TAH WITH THREE DOTS ABOVE # Total code points: 3 # ================================================ -072C ; TAW # Lo SYRIAC LETTER TAW +072C ; Taw # Lo SYRIAC LETTER TAW # Total code points: 1 # ================================================ -0629 ; TEH_MARBUTA # Lo ARABIC LETTER TEH MARBUTA -06C0 ; TEH_MARBUTA # Lo ARABIC LETTER HEH WITH YEH ABOVE -06D5 ; TEH_MARBUTA # Lo ARABIC LETTER AE +0629 ; Teh_Marbuta # Lo ARABIC LETTER TEH MARBUTA +06C0 ; Teh_Marbuta # Lo ARABIC LETTER HEH WITH YEH ABOVE +06D5 ; Teh_Marbuta # Lo ARABIC LETTER AE # Total code points: 3 # ================================================ -071B..071C ; TETH # Lo [2] SYRIAC LETTER TETH..SYRIAC LETTER TETH GARSHUNI +071B..071C ; Teth # Lo [2] SYRIAC LETTER TETH..SYRIAC LETTER TETH GARSHUNI # Total code points: 2 # ================================================ -0624 ; WAW # Lo ARABIC LETTER WAW WITH HAMZA ABOVE -0648 ; WAW # Lo ARABIC LETTER WAW -0676..0677 ; WAW # Lo [2] ARABIC LETTER HIGH HAMZA WAW..ARABIC LETTER U WITH HAMZA ABOVE -06C4..06CB ; WAW # Lo [8] ARABIC LETTER WAW WITH RING..ARABIC LETTER VE -06CF ; WAW # Lo ARABIC LETTER WAW WITH DOT ABOVE +0624 ; Waw # Lo ARABIC LETTER WAW WITH HAMZA ABOVE +0648 ; Waw # Lo ARABIC LETTER WAW +0676..0677 ; Waw # Lo [2] ARABIC LETTER HIGH HAMZA WAW..ARABIC LETTER U WITH HAMZA ABOVE +06C4..06CB ; Waw # Lo [8] ARABIC LETTER WAW WITH RING..ARABIC LETTER VE +06CF ; Waw # Lo ARABIC LETTER WAW WITH DOT ABOVE # Total code points: 13 # ================================================ -0718 ; SYRIAC_WAW # Lo SYRIAC LETTER WAW +0718 ; Syriac_Waw # Lo SYRIAC LETTER WAW # Total code points: 1 # ================================================ -0626 ; YEH # Lo ARABIC LETTER YEH WITH HAMZA ABOVE -0649..064A ; YEH # Lo [2] ARABIC LETTER ALEF MAKSURA..ARABIC LETTER YEH -0678 ; YEH # Lo ARABIC LETTER HIGH HAMZA YEH -06CC ; YEH # Lo ARABIC LETTER FARSI YEH -06CE ; YEH # Lo ARABIC LETTER YEH WITH SMALL V -06D0..06D1 ; YEH # Lo [2] ARABIC LETTER E..ARABIC LETTER YEH WITH THREE DOTS BELOW +0626 ; Yeh # Lo ARABIC LETTER YEH WITH HAMZA ABOVE +0649..064A ; Yeh # Lo [2] ARABIC LETTER ALEF MAKSURA..ARABIC LETTER YEH +0678 ; Yeh # Lo ARABIC LETTER HIGH HAMZA YEH +06CC ; Yeh # Lo ARABIC LETTER FARSI YEH +06CE ; Yeh # Lo ARABIC LETTER YEH WITH SMALL V +06D0..06D1 ; Yeh # Lo [2] ARABIC LETTER E..ARABIC LETTER YEH WITH THREE DOTS BELOW # Total code points: 8 # ================================================ -06D2..06D3 ; YEH_BARREE # Lo [2] ARABIC LETTER YEH BARREE..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +06D2..06D3 ; Yeh_Barree # Lo [2] ARABIC LETTER YEH BARREE..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE # Total code points: 2 # ================================================ -06CD ; YEH_WITH_TAIL # Lo ARABIC LETTER YEH WITH TAIL +06CD ; Yeh_With_Tail # Lo ARABIC LETTER YEH WITH TAIL # Total code points: 1 # ================================================ -071D ; YUDH # Lo SYRIAC LETTER YUDH +071D ; Yudh # Lo SYRIAC LETTER YUDH # Total code points: 1 # ================================================ -071E ; YUDH_HE # Lo SYRIAC LETTER YUDH HE +071E ; Yudh_He # Lo SYRIAC LETTER YUDH HE # Total code points: 1 # ================================================ -0719 ; ZAIN # Lo SYRIAC LETTER ZAIN +0719 ; Zain # Lo SYRIAC LETTER ZAIN # Total code points: 1 # ================================================ -074D ; ZHAIN # Lo SYRIAC LETTER SOGDIAN ZHAIN +074D ; Zhain # Lo SYRIAC LETTER SOGDIAN ZHAIN # Total code points: 1 # ================================================ -074E ; KHAPH # Lo SYRIAC LETTER SOGDIAN KHAPH +074E ; Khaph # Lo SYRIAC LETTER SOGDIAN KHAPH # Total code points: 1 # ================================================ -074F ; FE # Lo SYRIAC LETTER SOGDIAN FE +074F ; Fe # Lo SYRIAC LETTER SOGDIAN FE # Total code points: 1 - diff --git a/icuSources/data/unidata/DerivedJoiningType.txt b/icuSources/data/unidata/DerivedJoiningType.txt index 34ebb52b..57e560a4 100644 --- a/icuSources/data/unidata/DerivedJoiningType.txt +++ b/icuSources/data/unidata/DerivedJoiningType.txt @@ -1,21 +1,22 @@ -# DerivedJoiningType-4.0.0.txt -# Date: 2003-04-05, 02:42:00 GMT [MD] +# DerivedJoiningType-4.0.1.txt +# Date: 2004-03-02, 02:42:08 GMT [MD] # -# Unicode Character Database: Derived Property Data -# Generated algorithmically from the Unicode Character Database +# Unicode Character Database +# Copyright (c) 1991-2004 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html # For documentation, see UCD.html -# Note: Unassigned and Noncharacter codepoints may be omitted -# if they have default property values. -# ================================================ - # ================================================ -# Joining Type (listing ArabicShaping.txt, field 2). + # Type T is derived, as described in ArabicShaping.txt -# All code points not explicitly listed in this file have the property -# value: U. + +# All code points not explicitly listed for Joining_Type +# have the value Non_Joining (U). + # ================================================ +# Joining_Type=Join_Causing + 0640 ; C # Lm ARABIC TATWEEL 200D ; C # Cf ZERO WIDTH JOINER @@ -23,6 +24,8 @@ # ================================================ +# Joining_Type=Dual_Joining + 0626 ; D # Lo ARABIC LETTER YEH WITH HAMZA ABOVE 0628 ; D # Lo ARABIC LETTER BEH 062A..062E ; D # Lo [5] ARABIC LETTER TEH..ARABIC LETTER KHAH @@ -50,6 +53,8 @@ # ================================================ +# Joining_Type=Right_Joining + 0622..0625 ; R # Lo [4] ARABIC LETTER ALEF WITH MADDA ABOVE..ARABIC LETTER ALEF WITH HAMZA BELOW 0627 ; R # Lo ARABIC LETTER ALEF 0629 ; R # Lo ARABIC LETTER TEH MARBUTA @@ -78,11 +83,7 @@ # ================================================ -# No values for L - -# Total code points: 0 - -# ================================================ +# Joining_Type=Transparent 00AD ; T # Cf SOFT HYPHEN 0300..0357 ; T # Mn [88] COMBINING GRAVE ACCENT..COMBINING RIGHT HALF RING ABOVE @@ -187,6 +188,7 @@ 1927..1928 ; T # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O 1932 ; T # Mn LIMBU SMALL LETTER ANUSVARA 1939..193B ; T # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I +200B ; T # Cf ZERO WIDTH SPACE 200E..200F ; T # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK 202A..202E ; T # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE 2060..2063 ; T # Cf [4] WORD JOINER..INVISIBLE SEPARATOR @@ -210,5 +212,4 @@ E0001 ; T # Cf LANGUAGE TAG E0020..E007F ; T # Cf [96] TAG SPACE..CANCEL TAG E0100..E01EF ; T # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -# Total code points: 922 - +# Total code points: 923 diff --git a/icuSources/data/unidata/DerivedNormalizationProps.txt b/icuSources/data/unidata/DerivedNormalizationProps.txt index bbd05a53..d13d4c57 100644 --- a/icuSources/data/unidata/DerivedNormalizationProps.txt +++ b/icuSources/data/unidata/DerivedNormalizationProps.txt @@ -1,12 +1,10 @@ -# DerivedNormalizationProps-4.0.0.txt -# Date: 2003-03-20, 20:07:31 GMT [MD] +# DerivedNormalizationProps-4.0.1.txt +# Date: 2004-03-02, 02:42:17 GMT [MD] # -# Unicode Character Database: Derived Property Data -# Generated algorithmically from the Unicode Character Database +# Unicode Character Database +# Copyright (c) 1991-2004 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html # For documentation, see UCD.html -# Note: Unassigned and Noncharacter codepoints may be omitted -# if they have default property values. -# ================================================ # ================================================ @@ -16,570 +14,570 @@ # mappings that constitute the FC_NFKC_Closure list # Uses the full case folding from CaseFolding.txt, without the T option. -037A ; FNC; 0020 03B9 -03D2 ; FNC; 03C5 -03D3 ; FNC; 03CD -03D4 ; FNC; 03CB -03F2 ; FNC; 03C3 -03F9 ; FNC; 03C3 -1D2C ; FNC; 0061 -1D2D ; FNC; 00E6 -1D2E ; FNC; 0062 -1D30 ; FNC; 0064 -1D31 ; FNC; 0065 -1D32 ; FNC; 01DD -1D33 ; FNC; 0067 -1D34 ; FNC; 0068 -1D35 ; FNC; 0069 -1D36 ; FNC; 006A -1D37 ; FNC; 006B -1D38 ; FNC; 006C -1D39 ; FNC; 006D -1D3A ; FNC; 006E -1D3C ; FNC; 006F -1D3D ; FNC; 0223 -1D3E ; FNC; 0070 -1D3F ; FNC; 0072 -1D40 ; FNC; 0074 -1D41 ; FNC; 0075 -1D42 ; FNC; 0077 -20A8 ; FNC; 0072 0073 -2102 ; FNC; 0063 -2103 ; FNC; 00B0 0063 -2107 ; FNC; 025B -2109 ; FNC; 00B0 0066 -210B ; FNC; 0068 -210C ; FNC; 0068 -210D ; FNC; 0068 -2110 ; FNC; 0069 -2111 ; FNC; 0069 -2112 ; FNC; 006C -2115 ; FNC; 006E -2116 ; FNC; 006E 006F -2119 ; FNC; 0070 -211A ; FNC; 0071 -211B ; FNC; 0072 -211C ; FNC; 0072 -211D ; FNC; 0072 -2120 ; FNC; 0073 006D -2121 ; FNC; 0074 0065 006C -2122 ; FNC; 0074 006D -2124 ; FNC; 007A -2128 ; FNC; 007A -212C ; FNC; 0062 -212D ; FNC; 0063 -2130 ; FNC; 0065 -2131 ; FNC; 0066 -2133 ; FNC; 006D -213B ; FNC; 0066 0061 0078 -213E ; FNC; 03B3 -213F ; FNC; 03C0 -2145 ; FNC; 0064 -3250 ; FNC; 0070 0074 0065 -32CC ; FNC; 0068 0067 -32CE ; FNC; 0065 0076 -32CF ; FNC; 006C 0074 0064 -3371 ; FNC; 0068 0070 0061 -3373 ; FNC; 0061 0075 -3375 ; FNC; 006F 0076 -337A ; FNC; 0069 0075 -3380 ; FNC; 0070 0061 -3381 ; FNC; 006E 0061 -3382 ; FNC; 03BC 0061 -3383 ; FNC; 006D 0061 -3384 ; FNC; 006B 0061 -3385 ; FNC; 006B 0062 -3386 ; FNC; 006D 0062 -3387 ; FNC; 0067 0062 -338A ; FNC; 0070 0066 -338B ; FNC; 006E 0066 -338C ; FNC; 03BC 0066 -3390 ; FNC; 0068 007A -3391 ; FNC; 006B 0068 007A -3392 ; FNC; 006D 0068 007A -3393 ; FNC; 0067 0068 007A -3394 ; FNC; 0074 0068 007A -33A9 ; FNC; 0070 0061 -33AA ; FNC; 006B 0070 0061 -33AB ; FNC; 006D 0070 0061 -33AC ; FNC; 0067 0070 0061 -33B4 ; FNC; 0070 0076 -33B5 ; FNC; 006E 0076 -33B6 ; FNC; 03BC 0076 -33B7 ; FNC; 006D 0076 -33B8 ; FNC; 006B 0076 -33B9 ; FNC; 006D 0076 -33BA ; FNC; 0070 0077 -33BB ; FNC; 006E 0077 -33BC ; FNC; 03BC 0077 -33BD ; FNC; 006D 0077 -33BE ; FNC; 006B 0077 -33BF ; FNC; 006D 0077 -33C0 ; FNC; 006B 03C9 -33C1 ; FNC; 006D 03C9 -33C3 ; FNC; 0062 0071 -33C6 ; FNC; 0063 2215 006B 0067 -33C7 ; FNC; 0063 006F 002E -33C8 ; FNC; 0064 0062 -33C9 ; FNC; 0067 0079 -33CB ; FNC; 0068 0070 -33CD ; FNC; 006B 006B -33CE ; FNC; 006B 006D -33D7 ; FNC; 0070 0068 -33D9 ; FNC; 0070 0070 006D -33DA ; FNC; 0070 0072 -33DC ; FNC; 0073 0076 -33DD ; FNC; 0077 0062 -33DE ; FNC; 0076 2215 006D -33DF ; FNC; 0061 2215 006D -1D400 ; FNC; 0061 -1D401 ; FNC; 0062 -1D402 ; FNC; 0063 -1D403 ; FNC; 0064 -1D404 ; FNC; 0065 -1D405 ; FNC; 0066 -1D406 ; FNC; 0067 -1D407 ; FNC; 0068 -1D408 ; FNC; 0069 -1D409 ; FNC; 006A -1D40A ; FNC; 006B -1D40B ; FNC; 006C -1D40C ; FNC; 006D -1D40D ; FNC; 006E -1D40E ; FNC; 006F -1D40F ; FNC; 0070 -1D410 ; FNC; 0071 -1D411 ; FNC; 0072 -1D412 ; FNC; 0073 -1D413 ; FNC; 0074 -1D414 ; FNC; 0075 -1D415 ; FNC; 0076 -1D416 ; FNC; 0077 -1D417 ; FNC; 0078 -1D418 ; FNC; 0079 -1D419 ; FNC; 007A -1D434 ; FNC; 0061 -1D435 ; FNC; 0062 -1D436 ; FNC; 0063 -1D437 ; FNC; 0064 -1D438 ; FNC; 0065 -1D439 ; FNC; 0066 -1D43A ; FNC; 0067 -1D43B ; FNC; 0068 -1D43C ; FNC; 0069 -1D43D ; FNC; 006A -1D43E ; FNC; 006B -1D43F ; FNC; 006C -1D440 ; FNC; 006D -1D441 ; FNC; 006E -1D442 ; FNC; 006F -1D443 ; FNC; 0070 -1D444 ; FNC; 0071 -1D445 ; FNC; 0072 -1D446 ; FNC; 0073 -1D447 ; FNC; 0074 -1D448 ; FNC; 0075 -1D449 ; FNC; 0076 -1D44A ; FNC; 0077 -1D44B ; FNC; 0078 -1D44C ; FNC; 0079 -1D44D ; FNC; 007A -1D468 ; FNC; 0061 -1D469 ; FNC; 0062 -1D46A ; FNC; 0063 -1D46B ; FNC; 0064 -1D46C ; FNC; 0065 -1D46D ; FNC; 0066 -1D46E ; FNC; 0067 -1D46F ; FNC; 0068 -1D470 ; FNC; 0069 -1D471 ; FNC; 006A -1D472 ; FNC; 006B -1D473 ; FNC; 006C -1D474 ; FNC; 006D -1D475 ; FNC; 006E -1D476 ; FNC; 006F -1D477 ; FNC; 0070 -1D478 ; FNC; 0071 -1D479 ; FNC; 0072 -1D47A ; FNC; 0073 -1D47B ; FNC; 0074 -1D47C ; FNC; 0075 -1D47D ; FNC; 0076 -1D47E ; FNC; 0077 -1D47F ; FNC; 0078 -1D480 ; FNC; 0079 -1D481 ; FNC; 007A -1D49C ; FNC; 0061 -1D49E ; FNC; 0063 -1D49F ; FNC; 0064 -1D4A2 ; FNC; 0067 -1D4A5 ; FNC; 006A -1D4A6 ; FNC; 006B -1D4A9 ; FNC; 006E -1D4AA ; FNC; 006F -1D4AB ; FNC; 0070 -1D4AC ; FNC; 0071 -1D4AE ; FNC; 0073 -1D4AF ; FNC; 0074 -1D4B0 ; FNC; 0075 -1D4B1 ; FNC; 0076 -1D4B2 ; FNC; 0077 -1D4B3 ; FNC; 0078 -1D4B4 ; FNC; 0079 -1D4B5 ; FNC; 007A -1D4D0 ; FNC; 0061 -1D4D1 ; FNC; 0062 -1D4D2 ; FNC; 0063 -1D4D3 ; FNC; 0064 -1D4D4 ; FNC; 0065 -1D4D5 ; FNC; 0066 -1D4D6 ; FNC; 0067 -1D4D7 ; FNC; 0068 -1D4D8 ; FNC; 0069 -1D4D9 ; FNC; 006A -1D4DA ; FNC; 006B -1D4DB ; FNC; 006C -1D4DC ; FNC; 006D -1D4DD ; FNC; 006E -1D4DE ; FNC; 006F -1D4DF ; FNC; 0070 -1D4E0 ; FNC; 0071 -1D4E1 ; FNC; 0072 -1D4E2 ; FNC; 0073 -1D4E3 ; FNC; 0074 -1D4E4 ; FNC; 0075 -1D4E5 ; FNC; 0076 -1D4E6 ; FNC; 0077 -1D4E7 ; FNC; 0078 -1D4E8 ; FNC; 0079 -1D4E9 ; FNC; 007A -1D504 ; FNC; 0061 -1D505 ; FNC; 0062 -1D507 ; FNC; 0064 -1D508 ; FNC; 0065 -1D509 ; FNC; 0066 -1D50A ; FNC; 0067 -1D50D ; FNC; 006A -1D50E ; FNC; 006B -1D50F ; FNC; 006C -1D510 ; FNC; 006D -1D511 ; FNC; 006E -1D512 ; FNC; 006F -1D513 ; FNC; 0070 -1D514 ; FNC; 0071 -1D516 ; FNC; 0073 -1D517 ; FNC; 0074 -1D518 ; FNC; 0075 -1D519 ; FNC; 0076 -1D51A ; FNC; 0077 -1D51B ; FNC; 0078 -1D51C ; FNC; 0079 -1D538 ; FNC; 0061 -1D539 ; FNC; 0062 -1D53B ; FNC; 0064 -1D53C ; FNC; 0065 -1D53D ; FNC; 0066 -1D53E ; FNC; 0067 -1D540 ; FNC; 0069 -1D541 ; FNC; 006A -1D542 ; FNC; 006B -1D543 ; FNC; 006C -1D544 ; FNC; 006D -1D546 ; FNC; 006F -1D54A ; FNC; 0073 -1D54B ; FNC; 0074 -1D54C ; FNC; 0075 -1D54D ; FNC; 0076 -1D54E ; FNC; 0077 -1D54F ; FNC; 0078 -1D550 ; FNC; 0079 -1D56C ; FNC; 0061 -1D56D ; FNC; 0062 -1D56E ; FNC; 0063 -1D56F ; FNC; 0064 -1D570 ; FNC; 0065 -1D571 ; FNC; 0066 -1D572 ; FNC; 0067 -1D573 ; FNC; 0068 -1D574 ; FNC; 0069 -1D575 ; FNC; 006A -1D576 ; FNC; 006B -1D577 ; FNC; 006C -1D578 ; FNC; 006D -1D579 ; FNC; 006E -1D57A ; FNC; 006F -1D57B ; FNC; 0070 -1D57C ; FNC; 0071 -1D57D ; FNC; 0072 -1D57E ; FNC; 0073 -1D57F ; FNC; 0074 -1D580 ; FNC; 0075 -1D581 ; FNC; 0076 -1D582 ; FNC; 0077 -1D583 ; FNC; 0078 -1D584 ; FNC; 0079 -1D585 ; FNC; 007A -1D5A0 ; FNC; 0061 -1D5A1 ; FNC; 0062 -1D5A2 ; FNC; 0063 -1D5A3 ; FNC; 0064 -1D5A4 ; FNC; 0065 -1D5A5 ; FNC; 0066 -1D5A6 ; FNC; 0067 -1D5A7 ; FNC; 0068 -1D5A8 ; FNC; 0069 -1D5A9 ; FNC; 006A -1D5AA ; FNC; 006B -1D5AB ; FNC; 006C -1D5AC ; FNC; 006D -1D5AD ; FNC; 006E -1D5AE ; FNC; 006F -1D5AF ; FNC; 0070 -1D5B0 ; FNC; 0071 -1D5B1 ; FNC; 0072 -1D5B2 ; FNC; 0073 -1D5B3 ; FNC; 0074 -1D5B4 ; FNC; 0075 -1D5B5 ; FNC; 0076 -1D5B6 ; FNC; 0077 -1D5B7 ; FNC; 0078 -1D5B8 ; FNC; 0079 -1D5B9 ; FNC; 007A -1D5D4 ; FNC; 0061 -1D5D5 ; FNC; 0062 -1D5D6 ; FNC; 0063 -1D5D7 ; FNC; 0064 -1D5D8 ; FNC; 0065 -1D5D9 ; FNC; 0066 -1D5DA ; FNC; 0067 -1D5DB ; FNC; 0068 -1D5DC ; FNC; 0069 -1D5DD ; FNC; 006A -1D5DE ; FNC; 006B -1D5DF ; FNC; 006C -1D5E0 ; FNC; 006D -1D5E1 ; FNC; 006E -1D5E2 ; FNC; 006F -1D5E3 ; FNC; 0070 -1D5E4 ; FNC; 0071 -1D5E5 ; FNC; 0072 -1D5E6 ; FNC; 0073 -1D5E7 ; FNC; 0074 -1D5E8 ; FNC; 0075 -1D5E9 ; FNC; 0076 -1D5EA ; FNC; 0077 -1D5EB ; FNC; 0078 -1D5EC ; FNC; 0079 -1D5ED ; FNC; 007A -1D608 ; FNC; 0061 -1D609 ; FNC; 0062 -1D60A ; FNC; 0063 -1D60B ; FNC; 0064 -1D60C ; FNC; 0065 -1D60D ; FNC; 0066 -1D60E ; FNC; 0067 -1D60F ; FNC; 0068 -1D610 ; FNC; 0069 -1D611 ; FNC; 006A -1D612 ; FNC; 006B -1D613 ; FNC; 006C -1D614 ; FNC; 006D -1D615 ; FNC; 006E -1D616 ; FNC; 006F -1D617 ; FNC; 0070 -1D618 ; FNC; 0071 -1D619 ; FNC; 0072 -1D61A ; FNC; 0073 -1D61B ; FNC; 0074 -1D61C ; FNC; 0075 -1D61D ; FNC; 0076 -1D61E ; FNC; 0077 -1D61F ; FNC; 0078 -1D620 ; FNC; 0079 -1D621 ; FNC; 007A -1D63C ; FNC; 0061 -1D63D ; FNC; 0062 -1D63E ; FNC; 0063 -1D63F ; FNC; 0064 -1D640 ; FNC; 0065 -1D641 ; FNC; 0066 -1D642 ; FNC; 0067 -1D643 ; FNC; 0068 -1D644 ; FNC; 0069 -1D645 ; FNC; 006A -1D646 ; FNC; 006B -1D647 ; FNC; 006C -1D648 ; FNC; 006D -1D649 ; FNC; 006E -1D64A ; FNC; 006F -1D64B ; FNC; 0070 -1D64C ; FNC; 0071 -1D64D ; FNC; 0072 -1D64E ; FNC; 0073 -1D64F ; FNC; 0074 -1D650 ; FNC; 0075 -1D651 ; FNC; 0076 -1D652 ; FNC; 0077 -1D653 ; FNC; 0078 -1D654 ; FNC; 0079 -1D655 ; FNC; 007A -1D670 ; FNC; 0061 -1D671 ; FNC; 0062 -1D672 ; FNC; 0063 -1D673 ; FNC; 0064 -1D674 ; FNC; 0065 -1D675 ; FNC; 0066 -1D676 ; FNC; 0067 -1D677 ; FNC; 0068 -1D678 ; FNC; 0069 -1D679 ; FNC; 006A -1D67A ; FNC; 006B -1D67B ; FNC; 006C -1D67C ; FNC; 006D -1D67D ; FNC; 006E -1D67E ; FNC; 006F -1D67F ; FNC; 0070 -1D680 ; FNC; 0071 -1D681 ; FNC; 0072 -1D682 ; FNC; 0073 -1D683 ; FNC; 0074 -1D684 ; FNC; 0075 -1D685 ; FNC; 0076 -1D686 ; FNC; 0077 -1D687 ; FNC; 0078 -1D688 ; FNC; 0079 -1D689 ; FNC; 007A -1D6A8 ; FNC; 03B1 -1D6A9 ; FNC; 03B2 -1D6AA ; FNC; 03B3 -1D6AB ; FNC; 03B4 -1D6AC ; FNC; 03B5 -1D6AD ; FNC; 03B6 -1D6AE ; FNC; 03B7 -1D6AF ; FNC; 03B8 -1D6B0 ; FNC; 03B9 -1D6B1 ; FNC; 03BA -1D6B2 ; FNC; 03BB -1D6B3 ; FNC; 03BC -1D6B4 ; FNC; 03BD -1D6B5 ; FNC; 03BE -1D6B6 ; FNC; 03BF -1D6B7 ; FNC; 03C0 -1D6B8 ; FNC; 03C1 -1D6B9 ; FNC; 03B8 -1D6BA ; FNC; 03C3 -1D6BB ; FNC; 03C4 -1D6BC ; FNC; 03C5 -1D6BD ; FNC; 03C6 -1D6BE ; FNC; 03C7 -1D6BF ; FNC; 03C8 -1D6C0 ; FNC; 03C9 -1D6D3 ; FNC; 03C3 -1D6E2 ; FNC; 03B1 -1D6E3 ; FNC; 03B2 -1D6E4 ; FNC; 03B3 -1D6E5 ; FNC; 03B4 -1D6E6 ; FNC; 03B5 -1D6E7 ; FNC; 03B6 -1D6E8 ; FNC; 03B7 -1D6E9 ; FNC; 03B8 -1D6EA ; FNC; 03B9 -1D6EB ; FNC; 03BA -1D6EC ; FNC; 03BB -1D6ED ; FNC; 03BC -1D6EE ; FNC; 03BD -1D6EF ; FNC; 03BE -1D6F0 ; FNC; 03BF -1D6F1 ; FNC; 03C0 -1D6F2 ; FNC; 03C1 -1D6F3 ; FNC; 03B8 -1D6F4 ; FNC; 03C3 -1D6F5 ; FNC; 03C4 -1D6F6 ; FNC; 03C5 -1D6F7 ; FNC; 03C6 -1D6F8 ; FNC; 03C7 -1D6F9 ; FNC; 03C8 -1D6FA ; FNC; 03C9 -1D70D ; FNC; 03C3 -1D71C ; FNC; 03B1 -1D71D ; FNC; 03B2 -1D71E ; FNC; 03B3 -1D71F ; FNC; 03B4 -1D720 ; FNC; 03B5 -1D721 ; FNC; 03B6 -1D722 ; FNC; 03B7 -1D723 ; FNC; 03B8 -1D724 ; FNC; 03B9 -1D725 ; FNC; 03BA -1D726 ; FNC; 03BB -1D727 ; FNC; 03BC -1D728 ; FNC; 03BD -1D729 ; FNC; 03BE -1D72A ; FNC; 03BF -1D72B ; FNC; 03C0 -1D72C ; FNC; 03C1 -1D72D ; FNC; 03B8 -1D72E ; FNC; 03C3 -1D72F ; FNC; 03C4 -1D730 ; FNC; 03C5 -1D731 ; FNC; 03C6 -1D732 ; FNC; 03C7 -1D733 ; FNC; 03C8 -1D734 ; FNC; 03C9 -1D747 ; FNC; 03C3 -1D756 ; FNC; 03B1 -1D757 ; FNC; 03B2 -1D758 ; FNC; 03B3 -1D759 ; FNC; 03B4 -1D75A ; FNC; 03B5 -1D75B ; FNC; 03B6 -1D75C ; FNC; 03B7 -1D75D ; FNC; 03B8 -1D75E ; FNC; 03B9 -1D75F ; FNC; 03BA -1D760 ; FNC; 03BB -1D761 ; FNC; 03BC -1D762 ; FNC; 03BD -1D763 ; FNC; 03BE -1D764 ; FNC; 03BF -1D765 ; FNC; 03C0 -1D766 ; FNC; 03C1 -1D767 ; FNC; 03B8 -1D768 ; FNC; 03C3 -1D769 ; FNC; 03C4 -1D76A ; FNC; 03C5 -1D76B ; FNC; 03C6 -1D76C ; FNC; 03C7 -1D76D ; FNC; 03C8 -1D76E ; FNC; 03C9 -1D781 ; FNC; 03C3 -1D790 ; FNC; 03B1 -1D791 ; FNC; 03B2 -1D792 ; FNC; 03B3 -1D793 ; FNC; 03B4 -1D794 ; FNC; 03B5 -1D795 ; FNC; 03B6 -1D796 ; FNC; 03B7 -1D797 ; FNC; 03B8 -1D798 ; FNC; 03B9 -1D799 ; FNC; 03BA -1D79A ; FNC; 03BB -1D79B ; FNC; 03BC -1D79C ; FNC; 03BD -1D79D ; FNC; 03BE -1D79E ; FNC; 03BF -1D79F ; FNC; 03C0 -1D7A0 ; FNC; 03C1 -1D7A1 ; FNC; 03B8 -1D7A2 ; FNC; 03C3 -1D7A3 ; FNC; 03C4 -1D7A4 ; FNC; 03C5 -1D7A5 ; FNC; 03C6 -1D7A6 ; FNC; 03C7 -1D7A7 ; FNC; 03C8 -1D7A8 ; FNC; 03C9 -1D7BB ; FNC; 03C3 +037A ; FC_NFKC; 0020 03B9 +03D2 ; FC_NFKC; 03C5 +03D3 ; FC_NFKC; 03CD +03D4 ; FC_NFKC; 03CB +03F2 ; FC_NFKC; 03C3 +03F9 ; FC_NFKC; 03C3 +1D2C ; FC_NFKC; 0061 +1D2D ; FC_NFKC; 00E6 +1D2E ; FC_NFKC; 0062 +1D30 ; FC_NFKC; 0064 +1D31 ; FC_NFKC; 0065 +1D32 ; FC_NFKC; 01DD +1D33 ; FC_NFKC; 0067 +1D34 ; FC_NFKC; 0068 +1D35 ; FC_NFKC; 0069 +1D36 ; FC_NFKC; 006A +1D37 ; FC_NFKC; 006B +1D38 ; FC_NFKC; 006C +1D39 ; FC_NFKC; 006D +1D3A ; FC_NFKC; 006E +1D3C ; FC_NFKC; 006F +1D3D ; FC_NFKC; 0223 +1D3E ; FC_NFKC; 0070 +1D3F ; FC_NFKC; 0072 +1D40 ; FC_NFKC; 0074 +1D41 ; FC_NFKC; 0075 +1D42 ; FC_NFKC; 0077 +20A8 ; FC_NFKC; 0072 0073 +2102 ; FC_NFKC; 0063 +2103 ; FC_NFKC; 00B0 0063 +2107 ; FC_NFKC; 025B +2109 ; FC_NFKC; 00B0 0066 +210B ; FC_NFKC; 0068 +210C ; FC_NFKC; 0068 +210D ; FC_NFKC; 0068 +2110 ; FC_NFKC; 0069 +2111 ; FC_NFKC; 0069 +2112 ; FC_NFKC; 006C +2115 ; FC_NFKC; 006E +2116 ; FC_NFKC; 006E 006F +2119 ; FC_NFKC; 0070 +211A ; FC_NFKC; 0071 +211B ; FC_NFKC; 0072 +211C ; FC_NFKC; 0072 +211D ; FC_NFKC; 0072 +2120 ; FC_NFKC; 0073 006D +2121 ; FC_NFKC; 0074 0065 006C +2122 ; FC_NFKC; 0074 006D +2124 ; FC_NFKC; 007A +2128 ; FC_NFKC; 007A +212C ; FC_NFKC; 0062 +212D ; FC_NFKC; 0063 +2130 ; FC_NFKC; 0065 +2131 ; FC_NFKC; 0066 +2133 ; FC_NFKC; 006D +213B ; FC_NFKC; 0066 0061 0078 +213E ; FC_NFKC; 03B3 +213F ; FC_NFKC; 03C0 +2145 ; FC_NFKC; 0064 +3250 ; FC_NFKC; 0070 0074 0065 +32CC ; FC_NFKC; 0068 0067 +32CE ; FC_NFKC; 0065 0076 +32CF ; FC_NFKC; 006C 0074 0064 +3371 ; FC_NFKC; 0068 0070 0061 +3373 ; FC_NFKC; 0061 0075 +3375 ; FC_NFKC; 006F 0076 +337A ; FC_NFKC; 0069 0075 +3380 ; FC_NFKC; 0070 0061 +3381 ; FC_NFKC; 006E 0061 +3382 ; FC_NFKC; 03BC 0061 +3383 ; FC_NFKC; 006D 0061 +3384 ; FC_NFKC; 006B 0061 +3385 ; FC_NFKC; 006B 0062 +3386 ; FC_NFKC; 006D 0062 +3387 ; FC_NFKC; 0067 0062 +338A ; FC_NFKC; 0070 0066 +338B ; FC_NFKC; 006E 0066 +338C ; FC_NFKC; 03BC 0066 +3390 ; FC_NFKC; 0068 007A +3391 ; FC_NFKC; 006B 0068 007A +3392 ; FC_NFKC; 006D 0068 007A +3393 ; FC_NFKC; 0067 0068 007A +3394 ; FC_NFKC; 0074 0068 007A +33A9 ; FC_NFKC; 0070 0061 +33AA ; FC_NFKC; 006B 0070 0061 +33AB ; FC_NFKC; 006D 0070 0061 +33AC ; FC_NFKC; 0067 0070 0061 +33B4 ; FC_NFKC; 0070 0076 +33B5 ; FC_NFKC; 006E 0076 +33B6 ; FC_NFKC; 03BC 0076 +33B7 ; FC_NFKC; 006D 0076 +33B8 ; FC_NFKC; 006B 0076 +33B9 ; FC_NFKC; 006D 0076 +33BA ; FC_NFKC; 0070 0077 +33BB ; FC_NFKC; 006E 0077 +33BC ; FC_NFKC; 03BC 0077 +33BD ; FC_NFKC; 006D 0077 +33BE ; FC_NFKC; 006B 0077 +33BF ; FC_NFKC; 006D 0077 +33C0 ; FC_NFKC; 006B 03C9 +33C1 ; FC_NFKC; 006D 03C9 +33C3 ; FC_NFKC; 0062 0071 +33C6 ; FC_NFKC; 0063 2215 006B 0067 +33C7 ; FC_NFKC; 0063 006F 002E +33C8 ; FC_NFKC; 0064 0062 +33C9 ; FC_NFKC; 0067 0079 +33CB ; FC_NFKC; 0068 0070 +33CD ; FC_NFKC; 006B 006B +33CE ; FC_NFKC; 006B 006D +33D7 ; FC_NFKC; 0070 0068 +33D9 ; FC_NFKC; 0070 0070 006D +33DA ; FC_NFKC; 0070 0072 +33DC ; FC_NFKC; 0073 0076 +33DD ; FC_NFKC; 0077 0062 +33DE ; FC_NFKC; 0076 2215 006D +33DF ; FC_NFKC; 0061 2215 006D +1D400 ; FC_NFKC; 0061 +1D401 ; FC_NFKC; 0062 +1D402 ; FC_NFKC; 0063 +1D403 ; FC_NFKC; 0064 +1D404 ; FC_NFKC; 0065 +1D405 ; FC_NFKC; 0066 +1D406 ; FC_NFKC; 0067 +1D407 ; FC_NFKC; 0068 +1D408 ; FC_NFKC; 0069 +1D409 ; FC_NFKC; 006A +1D40A ; FC_NFKC; 006B +1D40B ; FC_NFKC; 006C +1D40C ; FC_NFKC; 006D +1D40D ; FC_NFKC; 006E +1D40E ; FC_NFKC; 006F +1D40F ; FC_NFKC; 0070 +1D410 ; FC_NFKC; 0071 +1D411 ; FC_NFKC; 0072 +1D412 ; FC_NFKC; 0073 +1D413 ; FC_NFKC; 0074 +1D414 ; FC_NFKC; 0075 +1D415 ; FC_NFKC; 0076 +1D416 ; FC_NFKC; 0077 +1D417 ; FC_NFKC; 0078 +1D418 ; FC_NFKC; 0079 +1D419 ; FC_NFKC; 007A +1D434 ; FC_NFKC; 0061 +1D435 ; FC_NFKC; 0062 +1D436 ; FC_NFKC; 0063 +1D437 ; FC_NFKC; 0064 +1D438 ; FC_NFKC; 0065 +1D439 ; FC_NFKC; 0066 +1D43A ; FC_NFKC; 0067 +1D43B ; FC_NFKC; 0068 +1D43C ; FC_NFKC; 0069 +1D43D ; FC_NFKC; 006A +1D43E ; FC_NFKC; 006B +1D43F ; FC_NFKC; 006C +1D440 ; FC_NFKC; 006D +1D441 ; FC_NFKC; 006E +1D442 ; FC_NFKC; 006F +1D443 ; FC_NFKC; 0070 +1D444 ; FC_NFKC; 0071 +1D445 ; FC_NFKC; 0072 +1D446 ; FC_NFKC; 0073 +1D447 ; FC_NFKC; 0074 +1D448 ; FC_NFKC; 0075 +1D449 ; FC_NFKC; 0076 +1D44A ; FC_NFKC; 0077 +1D44B ; FC_NFKC; 0078 +1D44C ; FC_NFKC; 0079 +1D44D ; FC_NFKC; 007A +1D468 ; FC_NFKC; 0061 +1D469 ; FC_NFKC; 0062 +1D46A ; FC_NFKC; 0063 +1D46B ; FC_NFKC; 0064 +1D46C ; FC_NFKC; 0065 +1D46D ; FC_NFKC; 0066 +1D46E ; FC_NFKC; 0067 +1D46F ; FC_NFKC; 0068 +1D470 ; FC_NFKC; 0069 +1D471 ; FC_NFKC; 006A +1D472 ; FC_NFKC; 006B +1D473 ; FC_NFKC; 006C +1D474 ; FC_NFKC; 006D +1D475 ; FC_NFKC; 006E +1D476 ; FC_NFKC; 006F +1D477 ; FC_NFKC; 0070 +1D478 ; FC_NFKC; 0071 +1D479 ; FC_NFKC; 0072 +1D47A ; FC_NFKC; 0073 +1D47B ; FC_NFKC; 0074 +1D47C ; FC_NFKC; 0075 +1D47D ; FC_NFKC; 0076 +1D47E ; FC_NFKC; 0077 +1D47F ; FC_NFKC; 0078 +1D480 ; FC_NFKC; 0079 +1D481 ; FC_NFKC; 007A +1D49C ; FC_NFKC; 0061 +1D49E ; FC_NFKC; 0063 +1D49F ; FC_NFKC; 0064 +1D4A2 ; FC_NFKC; 0067 +1D4A5 ; FC_NFKC; 006A +1D4A6 ; FC_NFKC; 006B +1D4A9 ; FC_NFKC; 006E +1D4AA ; FC_NFKC; 006F +1D4AB ; FC_NFKC; 0070 +1D4AC ; FC_NFKC; 0071 +1D4AE ; FC_NFKC; 0073 +1D4AF ; FC_NFKC; 0074 +1D4B0 ; FC_NFKC; 0075 +1D4B1 ; FC_NFKC; 0076 +1D4B2 ; FC_NFKC; 0077 +1D4B3 ; FC_NFKC; 0078 +1D4B4 ; FC_NFKC; 0079 +1D4B5 ; FC_NFKC; 007A +1D4D0 ; FC_NFKC; 0061 +1D4D1 ; FC_NFKC; 0062 +1D4D2 ; FC_NFKC; 0063 +1D4D3 ; FC_NFKC; 0064 +1D4D4 ; FC_NFKC; 0065 +1D4D5 ; FC_NFKC; 0066 +1D4D6 ; FC_NFKC; 0067 +1D4D7 ; FC_NFKC; 0068 +1D4D8 ; FC_NFKC; 0069 +1D4D9 ; FC_NFKC; 006A +1D4DA ; FC_NFKC; 006B +1D4DB ; FC_NFKC; 006C +1D4DC ; FC_NFKC; 006D +1D4DD ; FC_NFKC; 006E +1D4DE ; FC_NFKC; 006F +1D4DF ; FC_NFKC; 0070 +1D4E0 ; FC_NFKC; 0071 +1D4E1 ; FC_NFKC; 0072 +1D4E2 ; FC_NFKC; 0073 +1D4E3 ; FC_NFKC; 0074 +1D4E4 ; FC_NFKC; 0075 +1D4E5 ; FC_NFKC; 0076 +1D4E6 ; FC_NFKC; 0077 +1D4E7 ; FC_NFKC; 0078 +1D4E8 ; FC_NFKC; 0079 +1D4E9 ; FC_NFKC; 007A +1D504 ; FC_NFKC; 0061 +1D505 ; FC_NFKC; 0062 +1D507 ; FC_NFKC; 0064 +1D508 ; FC_NFKC; 0065 +1D509 ; FC_NFKC; 0066 +1D50A ; FC_NFKC; 0067 +1D50D ; FC_NFKC; 006A +1D50E ; FC_NFKC; 006B +1D50F ; FC_NFKC; 006C +1D510 ; FC_NFKC; 006D +1D511 ; FC_NFKC; 006E +1D512 ; FC_NFKC; 006F +1D513 ; FC_NFKC; 0070 +1D514 ; FC_NFKC; 0071 +1D516 ; FC_NFKC; 0073 +1D517 ; FC_NFKC; 0074 +1D518 ; FC_NFKC; 0075 +1D519 ; FC_NFKC; 0076 +1D51A ; FC_NFKC; 0077 +1D51B ; FC_NFKC; 0078 +1D51C ; FC_NFKC; 0079 +1D538 ; FC_NFKC; 0061 +1D539 ; FC_NFKC; 0062 +1D53B ; FC_NFKC; 0064 +1D53C ; FC_NFKC; 0065 +1D53D ; FC_NFKC; 0066 +1D53E ; FC_NFKC; 0067 +1D540 ; FC_NFKC; 0069 +1D541 ; FC_NFKC; 006A +1D542 ; FC_NFKC; 006B +1D543 ; FC_NFKC; 006C +1D544 ; FC_NFKC; 006D +1D546 ; FC_NFKC; 006F +1D54A ; FC_NFKC; 0073 +1D54B ; FC_NFKC; 0074 +1D54C ; FC_NFKC; 0075 +1D54D ; FC_NFKC; 0076 +1D54E ; FC_NFKC; 0077 +1D54F ; FC_NFKC; 0078 +1D550 ; FC_NFKC; 0079 +1D56C ; FC_NFKC; 0061 +1D56D ; FC_NFKC; 0062 +1D56E ; FC_NFKC; 0063 +1D56F ; FC_NFKC; 0064 +1D570 ; FC_NFKC; 0065 +1D571 ; FC_NFKC; 0066 +1D572 ; FC_NFKC; 0067 +1D573 ; FC_NFKC; 0068 +1D574 ; FC_NFKC; 0069 +1D575 ; FC_NFKC; 006A +1D576 ; FC_NFKC; 006B +1D577 ; FC_NFKC; 006C +1D578 ; FC_NFKC; 006D +1D579 ; FC_NFKC; 006E +1D57A ; FC_NFKC; 006F +1D57B ; FC_NFKC; 0070 +1D57C ; FC_NFKC; 0071 +1D57D ; FC_NFKC; 0072 +1D57E ; FC_NFKC; 0073 +1D57F ; FC_NFKC; 0074 +1D580 ; FC_NFKC; 0075 +1D581 ; FC_NFKC; 0076 +1D582 ; FC_NFKC; 0077 +1D583 ; FC_NFKC; 0078 +1D584 ; FC_NFKC; 0079 +1D585 ; FC_NFKC; 007A +1D5A0 ; FC_NFKC; 0061 +1D5A1 ; FC_NFKC; 0062 +1D5A2 ; FC_NFKC; 0063 +1D5A3 ; FC_NFKC; 0064 +1D5A4 ; FC_NFKC; 0065 +1D5A5 ; FC_NFKC; 0066 +1D5A6 ; FC_NFKC; 0067 +1D5A7 ; FC_NFKC; 0068 +1D5A8 ; FC_NFKC; 0069 +1D5A9 ; FC_NFKC; 006A +1D5AA ; FC_NFKC; 006B +1D5AB ; FC_NFKC; 006C +1D5AC ; FC_NFKC; 006D +1D5AD ; FC_NFKC; 006E +1D5AE ; FC_NFKC; 006F +1D5AF ; FC_NFKC; 0070 +1D5B0 ; FC_NFKC; 0071 +1D5B1 ; FC_NFKC; 0072 +1D5B2 ; FC_NFKC; 0073 +1D5B3 ; FC_NFKC; 0074 +1D5B4 ; FC_NFKC; 0075 +1D5B5 ; FC_NFKC; 0076 +1D5B6 ; FC_NFKC; 0077 +1D5B7 ; FC_NFKC; 0078 +1D5B8 ; FC_NFKC; 0079 +1D5B9 ; FC_NFKC; 007A +1D5D4 ; FC_NFKC; 0061 +1D5D5 ; FC_NFKC; 0062 +1D5D6 ; FC_NFKC; 0063 +1D5D7 ; FC_NFKC; 0064 +1D5D8 ; FC_NFKC; 0065 +1D5D9 ; FC_NFKC; 0066 +1D5DA ; FC_NFKC; 0067 +1D5DB ; FC_NFKC; 0068 +1D5DC ; FC_NFKC; 0069 +1D5DD ; FC_NFKC; 006A +1D5DE ; FC_NFKC; 006B +1D5DF ; FC_NFKC; 006C +1D5E0 ; FC_NFKC; 006D +1D5E1 ; FC_NFKC; 006E +1D5E2 ; FC_NFKC; 006F +1D5E3 ; FC_NFKC; 0070 +1D5E4 ; FC_NFKC; 0071 +1D5E5 ; FC_NFKC; 0072 +1D5E6 ; FC_NFKC; 0073 +1D5E7 ; FC_NFKC; 0074 +1D5E8 ; FC_NFKC; 0075 +1D5E9 ; FC_NFKC; 0076 +1D5EA ; FC_NFKC; 0077 +1D5EB ; FC_NFKC; 0078 +1D5EC ; FC_NFKC; 0079 +1D5ED ; FC_NFKC; 007A +1D608 ; FC_NFKC; 0061 +1D609 ; FC_NFKC; 0062 +1D60A ; FC_NFKC; 0063 +1D60B ; FC_NFKC; 0064 +1D60C ; FC_NFKC; 0065 +1D60D ; FC_NFKC; 0066 +1D60E ; FC_NFKC; 0067 +1D60F ; FC_NFKC; 0068 +1D610 ; FC_NFKC; 0069 +1D611 ; FC_NFKC; 006A +1D612 ; FC_NFKC; 006B +1D613 ; FC_NFKC; 006C +1D614 ; FC_NFKC; 006D +1D615 ; FC_NFKC; 006E +1D616 ; FC_NFKC; 006F +1D617 ; FC_NFKC; 0070 +1D618 ; FC_NFKC; 0071 +1D619 ; FC_NFKC; 0072 +1D61A ; FC_NFKC; 0073 +1D61B ; FC_NFKC; 0074 +1D61C ; FC_NFKC; 0075 +1D61D ; FC_NFKC; 0076 +1D61E ; FC_NFKC; 0077 +1D61F ; FC_NFKC; 0078 +1D620 ; FC_NFKC; 0079 +1D621 ; FC_NFKC; 007A +1D63C ; FC_NFKC; 0061 +1D63D ; FC_NFKC; 0062 +1D63E ; FC_NFKC; 0063 +1D63F ; FC_NFKC; 0064 +1D640 ; FC_NFKC; 0065 +1D641 ; FC_NFKC; 0066 +1D642 ; FC_NFKC; 0067 +1D643 ; FC_NFKC; 0068 +1D644 ; FC_NFKC; 0069 +1D645 ; FC_NFKC; 006A +1D646 ; FC_NFKC; 006B +1D647 ; FC_NFKC; 006C +1D648 ; FC_NFKC; 006D +1D649 ; FC_NFKC; 006E +1D64A ; FC_NFKC; 006F +1D64B ; FC_NFKC; 0070 +1D64C ; FC_NFKC; 0071 +1D64D ; FC_NFKC; 0072 +1D64E ; FC_NFKC; 0073 +1D64F ; FC_NFKC; 0074 +1D650 ; FC_NFKC; 0075 +1D651 ; FC_NFKC; 0076 +1D652 ; FC_NFKC; 0077 +1D653 ; FC_NFKC; 0078 +1D654 ; FC_NFKC; 0079 +1D655 ; FC_NFKC; 007A +1D670 ; FC_NFKC; 0061 +1D671 ; FC_NFKC; 0062 +1D672 ; FC_NFKC; 0063 +1D673 ; FC_NFKC; 0064 +1D674 ; FC_NFKC; 0065 +1D675 ; FC_NFKC; 0066 +1D676 ; FC_NFKC; 0067 +1D677 ; FC_NFKC; 0068 +1D678 ; FC_NFKC; 0069 +1D679 ; FC_NFKC; 006A +1D67A ; FC_NFKC; 006B +1D67B ; FC_NFKC; 006C +1D67C ; FC_NFKC; 006D +1D67D ; FC_NFKC; 006E +1D67E ; FC_NFKC; 006F +1D67F ; FC_NFKC; 0070 +1D680 ; FC_NFKC; 0071 +1D681 ; FC_NFKC; 0072 +1D682 ; FC_NFKC; 0073 +1D683 ; FC_NFKC; 0074 +1D684 ; FC_NFKC; 0075 +1D685 ; FC_NFKC; 0076 +1D686 ; FC_NFKC; 0077 +1D687 ; FC_NFKC; 0078 +1D688 ; FC_NFKC; 0079 +1D689 ; FC_NFKC; 007A +1D6A8 ; FC_NFKC; 03B1 +1D6A9 ; FC_NFKC; 03B2 +1D6AA ; FC_NFKC; 03B3 +1D6AB ; FC_NFKC; 03B4 +1D6AC ; FC_NFKC; 03B5 +1D6AD ; FC_NFKC; 03B6 +1D6AE ; FC_NFKC; 03B7 +1D6AF ; FC_NFKC; 03B8 +1D6B0 ; FC_NFKC; 03B9 +1D6B1 ; FC_NFKC; 03BA +1D6B2 ; FC_NFKC; 03BB +1D6B3 ; FC_NFKC; 03BC +1D6B4 ; FC_NFKC; 03BD +1D6B5 ; FC_NFKC; 03BE +1D6B6 ; FC_NFKC; 03BF +1D6B7 ; FC_NFKC; 03C0 +1D6B8 ; FC_NFKC; 03C1 +1D6B9 ; FC_NFKC; 03B8 +1D6BA ; FC_NFKC; 03C3 +1D6BB ; FC_NFKC; 03C4 +1D6BC ; FC_NFKC; 03C5 +1D6BD ; FC_NFKC; 03C6 +1D6BE ; FC_NFKC; 03C7 +1D6BF ; FC_NFKC; 03C8 +1D6C0 ; FC_NFKC; 03C9 +1D6D3 ; FC_NFKC; 03C3 +1D6E2 ; FC_NFKC; 03B1 +1D6E3 ; FC_NFKC; 03B2 +1D6E4 ; FC_NFKC; 03B3 +1D6E5 ; FC_NFKC; 03B4 +1D6E6 ; FC_NFKC; 03B5 +1D6E7 ; FC_NFKC; 03B6 +1D6E8 ; FC_NFKC; 03B7 +1D6E9 ; FC_NFKC; 03B8 +1D6EA ; FC_NFKC; 03B9 +1D6EB ; FC_NFKC; 03BA +1D6EC ; FC_NFKC; 03BB +1D6ED ; FC_NFKC; 03BC +1D6EE ; FC_NFKC; 03BD +1D6EF ; FC_NFKC; 03BE +1D6F0 ; FC_NFKC; 03BF +1D6F1 ; FC_NFKC; 03C0 +1D6F2 ; FC_NFKC; 03C1 +1D6F3 ; FC_NFKC; 03B8 +1D6F4 ; FC_NFKC; 03C3 +1D6F5 ; FC_NFKC; 03C4 +1D6F6 ; FC_NFKC; 03C5 +1D6F7 ; FC_NFKC; 03C6 +1D6F8 ; FC_NFKC; 03C7 +1D6F9 ; FC_NFKC; 03C8 +1D6FA ; FC_NFKC; 03C9 +1D70D ; FC_NFKC; 03C3 +1D71C ; FC_NFKC; 03B1 +1D71D ; FC_NFKC; 03B2 +1D71E ; FC_NFKC; 03B3 +1D71F ; FC_NFKC; 03B4 +1D720 ; FC_NFKC; 03B5 +1D721 ; FC_NFKC; 03B6 +1D722 ; FC_NFKC; 03B7 +1D723 ; FC_NFKC; 03B8 +1D724 ; FC_NFKC; 03B9 +1D725 ; FC_NFKC; 03BA +1D726 ; FC_NFKC; 03BB +1D727 ; FC_NFKC; 03BC +1D728 ; FC_NFKC; 03BD +1D729 ; FC_NFKC; 03BE +1D72A ; FC_NFKC; 03BF +1D72B ; FC_NFKC; 03C0 +1D72C ; FC_NFKC; 03C1 +1D72D ; FC_NFKC; 03B8 +1D72E ; FC_NFKC; 03C3 +1D72F ; FC_NFKC; 03C4 +1D730 ; FC_NFKC; 03C5 +1D731 ; FC_NFKC; 03C6 +1D732 ; FC_NFKC; 03C7 +1D733 ; FC_NFKC; 03C8 +1D734 ; FC_NFKC; 03C9 +1D747 ; FC_NFKC; 03C3 +1D756 ; FC_NFKC; 03B1 +1D757 ; FC_NFKC; 03B2 +1D758 ; FC_NFKC; 03B3 +1D759 ; FC_NFKC; 03B4 +1D75A ; FC_NFKC; 03B5 +1D75B ; FC_NFKC; 03B6 +1D75C ; FC_NFKC; 03B7 +1D75D ; FC_NFKC; 03B8 +1D75E ; FC_NFKC; 03B9 +1D75F ; FC_NFKC; 03BA +1D760 ; FC_NFKC; 03BB +1D761 ; FC_NFKC; 03BC +1D762 ; FC_NFKC; 03BD +1D763 ; FC_NFKC; 03BE +1D764 ; FC_NFKC; 03BF +1D765 ; FC_NFKC; 03C0 +1D766 ; FC_NFKC; 03C1 +1D767 ; FC_NFKC; 03B8 +1D768 ; FC_NFKC; 03C3 +1D769 ; FC_NFKC; 03C4 +1D76A ; FC_NFKC; 03C5 +1D76B ; FC_NFKC; 03C6 +1D76C ; FC_NFKC; 03C7 +1D76D ; FC_NFKC; 03C8 +1D76E ; FC_NFKC; 03C9 +1D781 ; FC_NFKC; 03C3 +1D790 ; FC_NFKC; 03B1 +1D791 ; FC_NFKC; 03B2 +1D792 ; FC_NFKC; 03B3 +1D793 ; FC_NFKC; 03B4 +1D794 ; FC_NFKC; 03B5 +1D795 ; FC_NFKC; 03B6 +1D796 ; FC_NFKC; 03B7 +1D797 ; FC_NFKC; 03B8 +1D798 ; FC_NFKC; 03B9 +1D799 ; FC_NFKC; 03BA +1D79A ; FC_NFKC; 03BB +1D79B ; FC_NFKC; 03BC +1D79C ; FC_NFKC; 03BD +1D79D ; FC_NFKC; 03BE +1D79E ; FC_NFKC; 03BF +1D79F ; FC_NFKC; 03C0 +1D7A0 ; FC_NFKC; 03C1 +1D7A1 ; FC_NFKC; 03B8 +1D7A2 ; FC_NFKC; 03C3 +1D7A3 ; FC_NFKC; 03C4 +1D7A4 ; FC_NFKC; 03C5 +1D7A5 ; FC_NFKC; 03C6 +1D7A6 ; FC_NFKC; 03C7 +1D7A7 ; FC_NFKC; 03C8 +1D7A8 ; FC_NFKC; 03C9 +1D7BB ; FC_NFKC; 03C3 # Total code points: 564 @@ -667,1199 +665,1237 @@ FB46..FB4E ; Full_Composition_Exclusion # ================================================ -# Derived Property: NFD_QuickCheck -# Generated from computing decomposibles +# Property: NFD_Quick_Check + +# All code points not explicitly listed for NFD_Quick_Check +# have the value Yes (Y). + +# ================================================ + +# NFD_Quick_Check=No -00C0..00C5 ; NFD_NO -00C7..00CF ; NFD_NO -00D1..00D6 ; NFD_NO -00D9..00DD ; NFD_NO -00E0..00E5 ; NFD_NO -00E7..00EF ; NFD_NO -00F1..00F6 ; NFD_NO -00F9..00FD ; NFD_NO -00FF..010F ; NFD_NO -0112..0125 ; NFD_NO -0128..0130 ; NFD_NO -0134..0137 ; NFD_NO -0139..013E ; NFD_NO -0143..0148 ; NFD_NO -014C..0151 ; NFD_NO -0154..0165 ; NFD_NO -0168..017E ; NFD_NO -01A0..01A1 ; NFD_NO -01AF..01B0 ; NFD_NO -01CD..01DC ; NFD_NO -01DE..01E3 ; NFD_NO -01E6..01F0 ; NFD_NO -01F4..01F5 ; NFD_NO -01F8..021B ; NFD_NO -021E..021F ; NFD_NO -0226..0233 ; NFD_NO -0340..0341 ; NFD_NO -0343..0344 ; NFD_NO -0374 ; NFD_NO -037E ; NFD_NO -0385 ; NFD_NO -0386 ; NFD_NO -0387 ; NFD_NO -0388..038A ; NFD_NO -038C ; NFD_NO -038E..0390 ; NFD_NO -03AA..03B0 ; NFD_NO -03CA..03CE ; NFD_NO -03D3..03D4 ; NFD_NO -0400..0401 ; NFD_NO -0403 ; NFD_NO -0407 ; NFD_NO -040C..040E ; NFD_NO -0419 ; NFD_NO -0439 ; NFD_NO -0450..0451 ; NFD_NO -0453 ; NFD_NO -0457 ; NFD_NO -045C..045E ; NFD_NO -0476..0477 ; NFD_NO -04C1..04C2 ; NFD_NO -04D0..04D3 ; NFD_NO -04D6..04D7 ; NFD_NO -04DA..04DF ; NFD_NO -04E2..04E7 ; NFD_NO -04EA..04F5 ; NFD_NO -04F8..04F9 ; NFD_NO -0622..0626 ; NFD_NO -06C0 ; NFD_NO -06C2 ; NFD_NO -06D3 ; NFD_NO -0929 ; NFD_NO -0931 ; NFD_NO -0934 ; NFD_NO -0958..095F ; NFD_NO -09CB..09CC ; NFD_NO -09DC..09DD ; NFD_NO -09DF ; NFD_NO -0A33 ; NFD_NO -0A36 ; NFD_NO -0A59..0A5B ; NFD_NO -0A5E ; NFD_NO -0B48 ; NFD_NO -0B4B..0B4C ; NFD_NO -0B5C..0B5D ; NFD_NO -0B94 ; NFD_NO -0BCA..0BCC ; NFD_NO -0C48 ; NFD_NO -0CC0 ; NFD_NO -0CC7..0CC8 ; NFD_NO -0CCA..0CCB ; NFD_NO -0D4A..0D4C ; NFD_NO -0DDA ; NFD_NO -0DDC..0DDE ; NFD_NO -0F43 ; NFD_NO -0F4D ; NFD_NO -0F52 ; NFD_NO -0F57 ; NFD_NO -0F5C ; NFD_NO -0F69 ; NFD_NO -0F73 ; NFD_NO -0F75..0F76 ; NFD_NO -0F78 ; NFD_NO -0F81 ; NFD_NO -0F93 ; NFD_NO -0F9D ; NFD_NO -0FA2 ; NFD_NO -0FA7 ; NFD_NO -0FAC ; NFD_NO -0FB9 ; NFD_NO -1026 ; NFD_NO -1E00..1E99 ; NFD_NO -1E9B ; NFD_NO -1EA0..1EF9 ; NFD_NO -1F00..1F15 ; NFD_NO -1F18..1F1D ; NFD_NO -1F20..1F45 ; NFD_NO -1F48..1F4D ; NFD_NO -1F50..1F57 ; NFD_NO -1F59 ; NFD_NO -1F5B ; NFD_NO -1F5D ; NFD_NO -1F5F..1F7D ; NFD_NO -1F80..1FB4 ; NFD_NO -1FB6..1FBC ; NFD_NO -1FBE ; NFD_NO -1FC1 ; NFD_NO -1FC2..1FC4 ; NFD_NO -1FC6..1FCC ; NFD_NO -1FCD..1FCF ; NFD_NO -1FD0..1FD3 ; NFD_NO -1FD6..1FDB ; NFD_NO -1FDD..1FDF ; NFD_NO -1FE0..1FEC ; NFD_NO -1FED..1FEF ; NFD_NO -1FF2..1FF4 ; NFD_NO -1FF6..1FFC ; NFD_NO -1FFD ; NFD_NO -2000..2001 ; NFD_NO -2126 ; NFD_NO -212A..212B ; NFD_NO -219A..219B ; NFD_NO -21AE ; NFD_NO -21CD ; NFD_NO -21CE..21CF ; NFD_NO -2204 ; NFD_NO -2209 ; NFD_NO -220C ; NFD_NO -2224 ; NFD_NO -2226 ; NFD_NO -2241 ; NFD_NO -2244 ; NFD_NO -2247 ; NFD_NO -2249 ; NFD_NO -2260 ; NFD_NO -2262 ; NFD_NO -226D..2271 ; NFD_NO -2274..2275 ; NFD_NO -2278..2279 ; NFD_NO -2280..2281 ; NFD_NO -2284..2285 ; NFD_NO -2288..2289 ; NFD_NO -22AC..22AF ; NFD_NO -22E0..22E3 ; NFD_NO -22EA..22ED ; NFD_NO -2329 ; NFD_NO -232A ; NFD_NO -2ADC ; NFD_NO -304C ; NFD_NO -304E ; NFD_NO -3050 ; NFD_NO -3052 ; NFD_NO -3054 ; NFD_NO -3056 ; NFD_NO -3058 ; NFD_NO -305A ; NFD_NO -305C ; NFD_NO -305E ; NFD_NO -3060 ; NFD_NO -3062 ; NFD_NO -3065 ; NFD_NO -3067 ; NFD_NO -3069 ; NFD_NO -3070..3071 ; NFD_NO -3073..3074 ; NFD_NO -3076..3077 ; NFD_NO -3079..307A ; NFD_NO -307C..307D ; NFD_NO -3094 ; NFD_NO -309E ; NFD_NO -30AC ; NFD_NO -30AE ; NFD_NO -30B0 ; NFD_NO -30B2 ; NFD_NO -30B4 ; NFD_NO -30B6 ; NFD_NO -30B8 ; NFD_NO -30BA ; NFD_NO -30BC ; NFD_NO -30BE ; NFD_NO -30C0 ; NFD_NO -30C2 ; NFD_NO -30C5 ; NFD_NO -30C7 ; NFD_NO -30C9 ; NFD_NO -30D0..30D1 ; NFD_NO -30D3..30D4 ; NFD_NO -30D6..30D7 ; NFD_NO -30D9..30DA ; NFD_NO -30DC..30DD ; NFD_NO -30F4 ; NFD_NO -30F7..30FA ; NFD_NO -30FE ; NFD_NO -AC00..D7A3 ; NFD_NO -F900..FA0D ; NFD_NO -FA10 ; NFD_NO -FA12 ; NFD_NO -FA15..FA1E ; NFD_NO -FA20 ; NFD_NO -FA22 ; NFD_NO -FA25..FA26 ; NFD_NO -FA2A..FA2D ; NFD_NO -FA30..FA6A ; NFD_NO -FB1D ; NFD_NO -FB1F ; NFD_NO -FB2A..FB36 ; NFD_NO -FB38..FB3C ; NFD_NO -FB3E ; NFD_NO -FB40..FB41 ; NFD_NO -FB43..FB44 ; NFD_NO -FB46..FB4E ; NFD_NO -1D15E..1D164 ; NFD_NO -1D1BB..1D1C0 ; NFD_NO -2F800..2FA1D ; NFD_NO +00C0..00C5 ; NFD_QC; N +00C7..00CF ; NFD_QC; N +00D1..00D6 ; NFD_QC; N +00D9..00DD ; NFD_QC; N +00E0..00E5 ; NFD_QC; N +00E7..00EF ; NFD_QC; N +00F1..00F6 ; NFD_QC; N +00F9..00FD ; NFD_QC; N +00FF..010F ; NFD_QC; N +0112..0125 ; NFD_QC; N +0128..0130 ; NFD_QC; N +0134..0137 ; NFD_QC; N +0139..013E ; NFD_QC; N +0143..0148 ; NFD_QC; N +014C..0151 ; NFD_QC; N +0154..0165 ; NFD_QC; N +0168..017E ; NFD_QC; N +01A0..01A1 ; NFD_QC; N +01AF..01B0 ; NFD_QC; N +01CD..01DC ; NFD_QC; N +01DE..01E3 ; NFD_QC; N +01E6..01F0 ; NFD_QC; N +01F4..01F5 ; NFD_QC; N +01F8..021B ; NFD_QC; N +021E..021F ; NFD_QC; N +0226..0233 ; NFD_QC; N +0340..0341 ; NFD_QC; N +0343..0344 ; NFD_QC; N +0374 ; NFD_QC; N +037E ; NFD_QC; N +0385 ; NFD_QC; N +0386 ; NFD_QC; N +0387 ; NFD_QC; N +0388..038A ; NFD_QC; N +038C ; NFD_QC; N +038E..0390 ; NFD_QC; N +03AA..03B0 ; NFD_QC; N +03CA..03CE ; NFD_QC; N +03D3..03D4 ; NFD_QC; N +0400..0401 ; NFD_QC; N +0403 ; NFD_QC; N +0407 ; NFD_QC; N +040C..040E ; NFD_QC; N +0419 ; NFD_QC; N +0439 ; NFD_QC; N +0450..0451 ; NFD_QC; N +0453 ; NFD_QC; N +0457 ; NFD_QC; N +045C..045E ; NFD_QC; N +0476..0477 ; NFD_QC; N +04C1..04C2 ; NFD_QC; N +04D0..04D3 ; NFD_QC; N +04D6..04D7 ; NFD_QC; N +04DA..04DF ; NFD_QC; N +04E2..04E7 ; NFD_QC; N +04EA..04F5 ; NFD_QC; N +04F8..04F9 ; NFD_QC; N +0622..0626 ; NFD_QC; N +06C0 ; NFD_QC; N +06C2 ; NFD_QC; N +06D3 ; NFD_QC; N +0929 ; NFD_QC; N +0931 ; NFD_QC; N +0934 ; NFD_QC; N +0958..095F ; NFD_QC; N +09CB..09CC ; NFD_QC; N +09DC..09DD ; NFD_QC; N +09DF ; NFD_QC; N +0A33 ; NFD_QC; N +0A36 ; NFD_QC; N +0A59..0A5B ; NFD_QC; N +0A5E ; NFD_QC; N +0B48 ; NFD_QC; N +0B4B..0B4C ; NFD_QC; N +0B5C..0B5D ; NFD_QC; N +0B94 ; NFD_QC; N +0BCA..0BCC ; NFD_QC; N +0C48 ; NFD_QC; N +0CC0 ; NFD_QC; N +0CC7..0CC8 ; NFD_QC; N +0CCA..0CCB ; NFD_QC; N +0D4A..0D4C ; NFD_QC; N +0DDA ; NFD_QC; N +0DDC..0DDE ; NFD_QC; N +0F43 ; NFD_QC; N +0F4D ; NFD_QC; N +0F52 ; NFD_QC; N +0F57 ; NFD_QC; N +0F5C ; NFD_QC; N +0F69 ; NFD_QC; N +0F73 ; NFD_QC; N +0F75..0F76 ; NFD_QC; N +0F78 ; NFD_QC; N +0F81 ; NFD_QC; N +0F93 ; NFD_QC; N +0F9D ; NFD_QC; N +0FA2 ; NFD_QC; N +0FA7 ; NFD_QC; N +0FAC ; NFD_QC; N +0FB9 ; NFD_QC; N +1026 ; NFD_QC; N +1E00..1E99 ; NFD_QC; N +1E9B ; NFD_QC; N +1EA0..1EF9 ; NFD_QC; N +1F00..1F15 ; NFD_QC; N +1F18..1F1D ; NFD_QC; N +1F20..1F45 ; NFD_QC; N +1F48..1F4D ; NFD_QC; N +1F50..1F57 ; NFD_QC; N +1F59 ; NFD_QC; N +1F5B ; NFD_QC; N +1F5D ; NFD_QC; N +1F5F..1F7D ; NFD_QC; N +1F80..1FB4 ; NFD_QC; N +1FB6..1FBC ; NFD_QC; N +1FBE ; NFD_QC; N +1FC1 ; NFD_QC; N +1FC2..1FC4 ; NFD_QC; N +1FC6..1FCC ; NFD_QC; N +1FCD..1FCF ; NFD_QC; N +1FD0..1FD3 ; NFD_QC; N +1FD6..1FDB ; NFD_QC; N +1FDD..1FDF ; NFD_QC; N +1FE0..1FEC ; NFD_QC; N +1FED..1FEF ; NFD_QC; N +1FF2..1FF4 ; NFD_QC; N +1FF6..1FFC ; NFD_QC; N +1FFD ; NFD_QC; N +2000..2001 ; NFD_QC; N +2126 ; NFD_QC; N +212A..212B ; NFD_QC; N +219A..219B ; NFD_QC; N +21AE ; NFD_QC; N +21CD ; NFD_QC; N +21CE..21CF ; NFD_QC; N +2204 ; NFD_QC; N +2209 ; NFD_QC; N +220C ; NFD_QC; N +2224 ; NFD_QC; N +2226 ; NFD_QC; N +2241 ; NFD_QC; N +2244 ; NFD_QC; N +2247 ; NFD_QC; N +2249 ; NFD_QC; N +2260 ; NFD_QC; N +2262 ; NFD_QC; N +226D..2271 ; NFD_QC; N +2274..2275 ; NFD_QC; N +2278..2279 ; NFD_QC; N +2280..2281 ; NFD_QC; N +2284..2285 ; NFD_QC; N +2288..2289 ; NFD_QC; N +22AC..22AF ; NFD_QC; N +22E0..22E3 ; NFD_QC; N +22EA..22ED ; NFD_QC; N +2329 ; NFD_QC; N +232A ; NFD_QC; N +2ADC ; NFD_QC; N +304C ; NFD_QC; N +304E ; NFD_QC; N +3050 ; NFD_QC; N +3052 ; NFD_QC; N +3054 ; NFD_QC; N +3056 ; NFD_QC; N +3058 ; NFD_QC; N +305A ; NFD_QC; N +305C ; NFD_QC; N +305E ; NFD_QC; N +3060 ; NFD_QC; N +3062 ; NFD_QC; N +3065 ; NFD_QC; N +3067 ; NFD_QC; N +3069 ; NFD_QC; N +3070..3071 ; NFD_QC; N +3073..3074 ; NFD_QC; N +3076..3077 ; NFD_QC; N +3079..307A ; NFD_QC; N +307C..307D ; NFD_QC; N +3094 ; NFD_QC; N +309E ; NFD_QC; N +30AC ; NFD_QC; N +30AE ; NFD_QC; N +30B0 ; NFD_QC; N +30B2 ; NFD_QC; N +30B4 ; NFD_QC; N +30B6 ; NFD_QC; N +30B8 ; NFD_QC; N +30BA ; NFD_QC; N +30BC ; NFD_QC; N +30BE ; NFD_QC; N +30C0 ; NFD_QC; N +30C2 ; NFD_QC; N +30C5 ; NFD_QC; N +30C7 ; NFD_QC; N +30C9 ; NFD_QC; N +30D0..30D1 ; NFD_QC; N +30D3..30D4 ; NFD_QC; N +30D6..30D7 ; NFD_QC; N +30D9..30DA ; NFD_QC; N +30DC..30DD ; NFD_QC; N +30F4 ; NFD_QC; N +30F7..30FA ; NFD_QC; N +30FE ; NFD_QC; N +AC00..D7A3 ; NFD_QC; N +F900..FA0D ; NFD_QC; N +FA10 ; NFD_QC; N +FA12 ; NFD_QC; N +FA15..FA1E ; NFD_QC; N +FA20 ; NFD_QC; N +FA22 ; NFD_QC; N +FA25..FA26 ; NFD_QC; N +FA2A..FA2D ; NFD_QC; N +FA30..FA6A ; NFD_QC; N +FB1D ; NFD_QC; N +FB1F ; NFD_QC; N +FB2A..FB36 ; NFD_QC; N +FB38..FB3C ; NFD_QC; N +FB3E ; NFD_QC; N +FB40..FB41 ; NFD_QC; N +FB43..FB44 ; NFD_QC; N +FB46..FB4E ; NFD_QC; N +1D15E..1D164 ; NFD_QC; N +1D1BB..1D1C0 ; NFD_QC; N +2F800..2FA1D ; NFD_QC; N # Total code points: 13098 # ================================================ -# Derived Property: NFC_QuickCheck -# Generated from computing decomposibles (and characters that may compose with previous ones) +# Property: NFC_Quick_Check + +# All code points not explicitly listed for NFC_Quick_Check +# have the value Yes (Y). + +# ================================================ + +# NFC_Quick_Check=No + +0340..0341 ; NFC_QC; N +0343..0344 ; NFC_QC; N +0374 ; NFC_QC; N +037E ; NFC_QC; N +0387 ; NFC_QC; N +0958..095F ; NFC_QC; N +09DC..09DD ; NFC_QC; N +09DF ; NFC_QC; N +0A33 ; NFC_QC; N +0A36 ; NFC_QC; N +0A59..0A5B ; NFC_QC; N +0A5E ; NFC_QC; N +0B5C..0B5D ; NFC_QC; N +0F43 ; NFC_QC; N +0F4D ; NFC_QC; N +0F52 ; NFC_QC; N +0F57 ; NFC_QC; N +0F5C ; NFC_QC; N +0F69 ; NFC_QC; N +0F73 ; NFC_QC; N +0F75..0F76 ; NFC_QC; N +0F78 ; NFC_QC; N +0F81 ; NFC_QC; N +0F93 ; NFC_QC; N +0F9D ; NFC_QC; N +0FA2 ; NFC_QC; N +0FA7 ; NFC_QC; N +0FAC ; NFC_QC; N +0FB9 ; NFC_QC; N +1F71 ; NFC_QC; N +1F73 ; NFC_QC; N +1F75 ; NFC_QC; N +1F77 ; NFC_QC; N +1F79 ; NFC_QC; N +1F7B ; NFC_QC; N +1F7D ; NFC_QC; N +1FBB ; NFC_QC; N +1FBE ; NFC_QC; N +1FC9 ; NFC_QC; N +1FCB ; NFC_QC; N +1FD3 ; NFC_QC; N +1FDB ; NFC_QC; N +1FE3 ; NFC_QC; N +1FEB ; NFC_QC; N +1FEE..1FEF ; NFC_QC; N +1FF9 ; NFC_QC; N +1FFB ; NFC_QC; N +1FFD ; NFC_QC; N +2000..2001 ; NFC_QC; N +2126 ; NFC_QC; N +212A..212B ; NFC_QC; N +2329 ; NFC_QC; N +232A ; NFC_QC; N +2ADC ; NFC_QC; N +F900..FA0D ; NFC_QC; N +FA10 ; NFC_QC; N +FA12 ; NFC_QC; N +FA15..FA1E ; NFC_QC; N +FA20 ; NFC_QC; N +FA22 ; NFC_QC; N +FA25..FA26 ; NFC_QC; N +FA2A..FA2D ; NFC_QC; N +FA30..FA6A ; NFC_QC; N +FB1D ; NFC_QC; N +FB1F ; NFC_QC; N +FB2A..FB36 ; NFC_QC; N +FB38..FB3C ; NFC_QC; N +FB3E ; NFC_QC; N +FB40..FB41 ; NFC_QC; N +FB43..FB44 ; NFC_QC; N +FB46..FB4E ; NFC_QC; N +1D15E..1D164 ; NFC_QC; N +1D1BB..1D1C0 ; NFC_QC; N +2F800..2FA1D ; NFC_QC; N + +# Total code points: 1009 + +# ================================================ + +# NFC_Quick_Check=Maybe -0300..0304 ; NFC_MAYBE -0306..030C ; NFC_MAYBE -030F ; NFC_MAYBE -0311 ; NFC_MAYBE -0313..0314 ; NFC_MAYBE -031B ; NFC_MAYBE -0323..0328 ; NFC_MAYBE -032D..032E ; NFC_MAYBE -0330..0331 ; NFC_MAYBE -0338 ; NFC_MAYBE -0340..0341 ; NFC_NO -0342 ; NFC_MAYBE -0343..0344 ; NFC_NO -0345 ; NFC_MAYBE -0374 ; NFC_NO -037E ; NFC_NO -0387 ; NFC_NO -0653..0655 ; NFC_MAYBE -093C ; NFC_MAYBE -0958..095F ; NFC_NO -09BE ; NFC_MAYBE -09D7 ; NFC_MAYBE -09DC..09DD ; NFC_NO -09DF ; NFC_NO -0A33 ; NFC_NO -0A36 ; NFC_NO -0A59..0A5B ; NFC_NO -0A5E ; NFC_NO -0B3E ; NFC_MAYBE -0B56 ; NFC_MAYBE -0B57 ; NFC_MAYBE -0B5C..0B5D ; NFC_NO -0BBE ; NFC_MAYBE -0BD7 ; NFC_MAYBE -0C56 ; NFC_MAYBE -0CC2 ; NFC_MAYBE -0CD5..0CD6 ; NFC_MAYBE -0D3E ; NFC_MAYBE -0D57 ; NFC_MAYBE -0DCA ; NFC_MAYBE -0DCF ; NFC_MAYBE -0DDF ; NFC_MAYBE -0F43 ; NFC_NO -0F4D ; NFC_NO -0F52 ; NFC_NO -0F57 ; NFC_NO -0F5C ; NFC_NO -0F69 ; NFC_NO -0F73 ; NFC_NO -0F75..0F76 ; NFC_NO -0F78 ; NFC_NO -0F81 ; NFC_NO -0F93 ; NFC_NO -0F9D ; NFC_NO -0FA2 ; NFC_NO -0FA7 ; NFC_NO -0FAC ; NFC_NO -0FB9 ; NFC_NO -102E ; NFC_MAYBE -1161..1175 ; NFC_MAYBE -11A8..11C2 ; NFC_MAYBE -1F71 ; NFC_NO -1F73 ; NFC_NO -1F75 ; NFC_NO -1F77 ; NFC_NO -1F79 ; NFC_NO -1F7B ; NFC_NO -1F7D ; NFC_NO -1FBB ; NFC_NO -1FBE ; NFC_NO -1FC9 ; NFC_NO -1FCB ; NFC_NO -1FD3 ; NFC_NO -1FDB ; NFC_NO -1FE3 ; NFC_NO -1FEB ; NFC_NO -1FEE..1FEF ; NFC_NO -1FF9 ; NFC_NO -1FFB ; NFC_NO -1FFD ; NFC_NO -2000..2001 ; NFC_NO -2126 ; NFC_NO -212A..212B ; NFC_NO -2329 ; NFC_NO -232A ; NFC_NO -2ADC ; NFC_NO -3099..309A ; NFC_MAYBE -F900..FA0D ; NFC_NO -FA10 ; NFC_NO -FA12 ; NFC_NO -FA15..FA1E ; NFC_NO -FA20 ; NFC_NO -FA22 ; NFC_NO -FA25..FA26 ; NFC_NO -FA2A..FA2D ; NFC_NO -FA30..FA6A ; NFC_NO -FB1D ; NFC_NO -FB1F ; NFC_NO -FB2A..FB36 ; NFC_NO -FB38..FB3C ; NFC_NO -FB3E ; NFC_NO -FB40..FB41 ; NFC_NO -FB43..FB44 ; NFC_NO -FB46..FB4E ; NFC_NO -1D15E..1D164 ; NFC_NO -1D1BB..1D1C0 ; NFC_NO -2F800..2FA1D ; NFC_NO +0300..0304 ; NFC_QC; M +0306..030C ; NFC_QC; M +030F ; NFC_QC; M +0311 ; NFC_QC; M +0313..0314 ; NFC_QC; M +031B ; NFC_QC; M +0323..0328 ; NFC_QC; M +032D..032E ; NFC_QC; M +0330..0331 ; NFC_QC; M +0338 ; NFC_QC; M +0342 ; NFC_QC; M +0345 ; NFC_QC; M +0653..0655 ; NFC_QC; M +093C ; NFC_QC; M +09BE ; NFC_QC; M +09D7 ; NFC_QC; M +0B3E ; NFC_QC; M +0B56 ; NFC_QC; M +0B57 ; NFC_QC; M +0BBE ; NFC_QC; M +0BD7 ; NFC_QC; M +0C56 ; NFC_QC; M +0CC2 ; NFC_QC; M +0CD5..0CD6 ; NFC_QC; M +0D3E ; NFC_QC; M +0D57 ; NFC_QC; M +0DCA ; NFC_QC; M +0DCF ; NFC_QC; M +0DDF ; NFC_QC; M +102E ; NFC_QC; M +1161..1175 ; NFC_QC; M +11A8..11C2 ; NFC_QC; M +3099..309A ; NFC_QC; M -# Total code points: 1110 +# Total code points: 101 # ================================================ -# Derived Property: NFKD_QuickCheck -# Generated from computing decomposibles +# Property: NFKD_Quick_Check -00A0 ; NFKD_NO -00A8 ; NFKD_NO -00AA ; NFKD_NO -00AF ; NFKD_NO -00B2..00B3 ; NFKD_NO -00B4 ; NFKD_NO -00B5 ; NFKD_NO -00B8 ; NFKD_NO -00B9 ; NFKD_NO -00BA ; NFKD_NO -00BC..00BE ; NFKD_NO -00C0..00C5 ; NFKD_NO -00C7..00CF ; NFKD_NO -00D1..00D6 ; NFKD_NO -00D9..00DD ; NFKD_NO -00E0..00E5 ; NFKD_NO -00E7..00EF ; NFKD_NO -00F1..00F6 ; NFKD_NO -00F9..00FD ; NFKD_NO -00FF..010F ; NFKD_NO -0112..0125 ; NFKD_NO -0128..0130 ; NFKD_NO -0132..0137 ; NFKD_NO -0139..0140 ; NFKD_NO -0143..0149 ; NFKD_NO -014C..0151 ; NFKD_NO -0154..0165 ; NFKD_NO -0168..017F ; NFKD_NO -01A0..01A1 ; NFKD_NO -01AF..01B0 ; NFKD_NO -01C4..01DC ; NFKD_NO -01DE..01E3 ; NFKD_NO -01E6..01F5 ; NFKD_NO -01F8..021B ; NFKD_NO -021E..021F ; NFKD_NO -0226..0233 ; NFKD_NO -02B0..02B8 ; NFKD_NO -02D8..02DD ; NFKD_NO -02E0..02E4 ; NFKD_NO -0340..0341 ; NFKD_NO -0343..0344 ; NFKD_NO -0374 ; NFKD_NO -037A ; NFKD_NO -037E ; NFKD_NO -0384..0385 ; NFKD_NO -0386 ; NFKD_NO -0387 ; NFKD_NO -0388..038A ; NFKD_NO -038C ; NFKD_NO -038E..0390 ; NFKD_NO -03AA..03B0 ; NFKD_NO -03CA..03CE ; NFKD_NO -03D0..03D6 ; NFKD_NO -03F0..03F2 ; NFKD_NO -03F4..03F5 ; NFKD_NO -03F9 ; NFKD_NO -0400..0401 ; NFKD_NO -0403 ; NFKD_NO -0407 ; NFKD_NO -040C..040E ; NFKD_NO -0419 ; NFKD_NO -0439 ; NFKD_NO -0450..0451 ; NFKD_NO -0453 ; NFKD_NO -0457 ; NFKD_NO -045C..045E ; NFKD_NO -0476..0477 ; NFKD_NO -04C1..04C2 ; NFKD_NO -04D0..04D3 ; NFKD_NO -04D6..04D7 ; NFKD_NO -04DA..04DF ; NFKD_NO -04E2..04E7 ; NFKD_NO -04EA..04F5 ; NFKD_NO -04F8..04F9 ; NFKD_NO -0587 ; NFKD_NO -0622..0626 ; NFKD_NO -0675..0678 ; NFKD_NO -06C0 ; NFKD_NO -06C2 ; NFKD_NO -06D3 ; NFKD_NO -0929 ; NFKD_NO -0931 ; NFKD_NO -0934 ; NFKD_NO -0958..095F ; NFKD_NO -09CB..09CC ; NFKD_NO -09DC..09DD ; NFKD_NO -09DF ; NFKD_NO -0A33 ; NFKD_NO -0A36 ; NFKD_NO -0A59..0A5B ; NFKD_NO -0A5E ; NFKD_NO -0B48 ; NFKD_NO -0B4B..0B4C ; NFKD_NO -0B5C..0B5D ; NFKD_NO -0B94 ; NFKD_NO -0BCA..0BCC ; NFKD_NO -0C48 ; NFKD_NO -0CC0 ; NFKD_NO -0CC7..0CC8 ; NFKD_NO -0CCA..0CCB ; NFKD_NO -0D4A..0D4C ; NFKD_NO -0DDA ; NFKD_NO -0DDC..0DDE ; NFKD_NO -0E33 ; NFKD_NO -0EB3 ; NFKD_NO -0EDC..0EDD ; NFKD_NO -0F0C ; NFKD_NO -0F43 ; NFKD_NO -0F4D ; NFKD_NO -0F52 ; NFKD_NO -0F57 ; NFKD_NO -0F5C ; NFKD_NO -0F69 ; NFKD_NO -0F73 ; NFKD_NO -0F75..0F79 ; NFKD_NO -0F81 ; NFKD_NO -0F93 ; NFKD_NO -0F9D ; NFKD_NO -0FA2 ; NFKD_NO -0FA7 ; NFKD_NO -0FAC ; NFKD_NO -0FB9 ; NFKD_NO -1026 ; NFKD_NO -1D2C..1D2E ; NFKD_NO -1D30..1D3A ; NFKD_NO -1D3C..1D4D ; NFKD_NO -1D4F..1D61 ; NFKD_NO -1D62..1D6A ; NFKD_NO -1E00..1E9B ; NFKD_NO -1EA0..1EF9 ; NFKD_NO -1F00..1F15 ; NFKD_NO -1F18..1F1D ; NFKD_NO -1F20..1F45 ; NFKD_NO -1F48..1F4D ; NFKD_NO -1F50..1F57 ; NFKD_NO -1F59 ; NFKD_NO -1F5B ; NFKD_NO -1F5D ; NFKD_NO -1F5F..1F7D ; NFKD_NO -1F80..1FB4 ; NFKD_NO -1FB6..1FBC ; NFKD_NO -1FBD ; NFKD_NO -1FBE ; NFKD_NO -1FBF..1FC1 ; NFKD_NO -1FC2..1FC4 ; NFKD_NO -1FC6..1FCC ; NFKD_NO -1FCD..1FCF ; NFKD_NO -1FD0..1FD3 ; NFKD_NO -1FD6..1FDB ; NFKD_NO -1FDD..1FDF ; NFKD_NO -1FE0..1FEC ; NFKD_NO -1FED..1FEF ; NFKD_NO -1FF2..1FF4 ; NFKD_NO -1FF6..1FFC ; NFKD_NO -1FFD..1FFE ; NFKD_NO -2000..200A ; NFKD_NO -2011 ; NFKD_NO -2017 ; NFKD_NO -2024..2026 ; NFKD_NO -202F ; NFKD_NO -2033..2034 ; NFKD_NO -2036..2037 ; NFKD_NO -203C ; NFKD_NO -203E ; NFKD_NO -2047..2049 ; NFKD_NO -2057 ; NFKD_NO -205F ; NFKD_NO -2070 ; NFKD_NO -2071 ; NFKD_NO -2074..2079 ; NFKD_NO -207A..207C ; NFKD_NO -207D ; NFKD_NO -207E ; NFKD_NO -207F ; NFKD_NO -2080..2089 ; NFKD_NO -208A..208C ; NFKD_NO -208D ; NFKD_NO -208E ; NFKD_NO -20A8 ; NFKD_NO -2100..2101 ; NFKD_NO -2102 ; NFKD_NO -2103 ; NFKD_NO -2105..2106 ; NFKD_NO -2107 ; NFKD_NO -2109 ; NFKD_NO -210A..2113 ; NFKD_NO -2115 ; NFKD_NO -2116 ; NFKD_NO -2119..211D ; NFKD_NO -2120..2122 ; NFKD_NO -2124 ; NFKD_NO -2126 ; NFKD_NO -2128 ; NFKD_NO -212A..212D ; NFKD_NO -212F..2131 ; NFKD_NO -2133..2134 ; NFKD_NO -2135..2138 ; NFKD_NO -2139 ; NFKD_NO -213B ; NFKD_NO -213D..213F ; NFKD_NO -2140 ; NFKD_NO -2145..2149 ; NFKD_NO -2153..215F ; NFKD_NO -2160..217F ; NFKD_NO -219A..219B ; NFKD_NO -21AE ; NFKD_NO -21CD ; NFKD_NO -21CE..21CF ; NFKD_NO -2204 ; NFKD_NO -2209 ; NFKD_NO -220C ; NFKD_NO -2224 ; NFKD_NO -2226 ; NFKD_NO -222C..222D ; NFKD_NO -222F..2230 ; NFKD_NO -2241 ; NFKD_NO -2244 ; NFKD_NO -2247 ; NFKD_NO -2249 ; NFKD_NO -2260 ; NFKD_NO -2262 ; NFKD_NO -226D..2271 ; NFKD_NO -2274..2275 ; NFKD_NO -2278..2279 ; NFKD_NO -2280..2281 ; NFKD_NO -2284..2285 ; NFKD_NO -2288..2289 ; NFKD_NO -22AC..22AF ; NFKD_NO -22E0..22E3 ; NFKD_NO -22EA..22ED ; NFKD_NO -2329 ; NFKD_NO -232A ; NFKD_NO -2460..249B ; NFKD_NO -249C..24E9 ; NFKD_NO -24EA ; NFKD_NO -2A0C ; NFKD_NO -2A74..2A76 ; NFKD_NO -2ADC ; NFKD_NO -2E9F ; NFKD_NO -2EF3 ; NFKD_NO -2F00..2FD5 ; NFKD_NO -3000 ; NFKD_NO -3036 ; NFKD_NO -3038..303A ; NFKD_NO -304C ; NFKD_NO -304E ; NFKD_NO -3050 ; NFKD_NO -3052 ; NFKD_NO -3054 ; NFKD_NO -3056 ; NFKD_NO -3058 ; NFKD_NO -305A ; NFKD_NO -305C ; NFKD_NO -305E ; NFKD_NO -3060 ; NFKD_NO -3062 ; NFKD_NO -3065 ; NFKD_NO -3067 ; NFKD_NO -3069 ; NFKD_NO -3070..3071 ; NFKD_NO -3073..3074 ; NFKD_NO -3076..3077 ; NFKD_NO -3079..307A ; NFKD_NO -307C..307D ; NFKD_NO -3094 ; NFKD_NO -309B..309C ; NFKD_NO -309E ; NFKD_NO -309F ; NFKD_NO -30AC ; NFKD_NO -30AE ; NFKD_NO -30B0 ; NFKD_NO -30B2 ; NFKD_NO -30B4 ; NFKD_NO -30B6 ; NFKD_NO -30B8 ; NFKD_NO -30BA ; NFKD_NO -30BC ; NFKD_NO -30BE ; NFKD_NO -30C0 ; NFKD_NO -30C2 ; NFKD_NO -30C5 ; NFKD_NO -30C7 ; NFKD_NO -30C9 ; NFKD_NO -30D0..30D1 ; NFKD_NO -30D3..30D4 ; NFKD_NO -30D6..30D7 ; NFKD_NO -30D9..30DA ; NFKD_NO -30DC..30DD ; NFKD_NO -30F4 ; NFKD_NO -30F7..30FA ; NFKD_NO -30FE ; NFKD_NO -30FF ; NFKD_NO -3131..318E ; NFKD_NO -3192..3195 ; NFKD_NO -3196..319F ; NFKD_NO -3200..321E ; NFKD_NO -3220..3229 ; NFKD_NO -322A..3243 ; NFKD_NO -3250 ; NFKD_NO -3251..325F ; NFKD_NO -3260..327D ; NFKD_NO -3280..3289 ; NFKD_NO -328A..32B0 ; NFKD_NO -32B1..32BF ; NFKD_NO -32C0..32FE ; NFKD_NO -3300..33FF ; NFKD_NO -AC00..D7A3 ; NFKD_NO -F900..FA0D ; NFKD_NO -FA10 ; NFKD_NO -FA12 ; NFKD_NO -FA15..FA1E ; NFKD_NO -FA20 ; NFKD_NO -FA22 ; NFKD_NO -FA25..FA26 ; NFKD_NO -FA2A..FA2D ; NFKD_NO -FA30..FA6A ; NFKD_NO -FB00..FB06 ; NFKD_NO -FB13..FB17 ; NFKD_NO -FB1D ; NFKD_NO -FB1F..FB28 ; NFKD_NO -FB29 ; NFKD_NO -FB2A..FB36 ; NFKD_NO -FB38..FB3C ; NFKD_NO -FB3E ; NFKD_NO -FB40..FB41 ; NFKD_NO -FB43..FB44 ; NFKD_NO -FB46..FBB1 ; NFKD_NO -FBD3..FD3D ; NFKD_NO -FD50..FD8F ; NFKD_NO -FD92..FDC7 ; NFKD_NO -FDF0..FDFB ; NFKD_NO -FDFC ; NFKD_NO -FE30 ; NFKD_NO -FE31..FE32 ; NFKD_NO -FE33..FE34 ; NFKD_NO -FE35 ; NFKD_NO -FE36 ; NFKD_NO -FE37 ; NFKD_NO -FE38 ; NFKD_NO -FE39 ; NFKD_NO -FE3A ; NFKD_NO -FE3B ; NFKD_NO -FE3C ; NFKD_NO -FE3D ; NFKD_NO -FE3E ; NFKD_NO -FE3F ; NFKD_NO -FE40 ; NFKD_NO -FE41 ; NFKD_NO -FE42 ; NFKD_NO -FE43 ; NFKD_NO -FE44 ; NFKD_NO -FE47 ; NFKD_NO -FE48 ; NFKD_NO -FE49..FE4C ; NFKD_NO -FE4D..FE4F ; NFKD_NO -FE50..FE52 ; NFKD_NO -FE54..FE57 ; NFKD_NO -FE58 ; NFKD_NO -FE59 ; NFKD_NO -FE5A ; NFKD_NO -FE5B ; NFKD_NO -FE5C ; NFKD_NO -FE5D ; NFKD_NO -FE5E ; NFKD_NO -FE5F..FE61 ; NFKD_NO -FE62 ; NFKD_NO -FE63 ; NFKD_NO -FE64..FE66 ; NFKD_NO -FE68 ; NFKD_NO -FE69 ; NFKD_NO -FE6A..FE6B ; NFKD_NO -FE70..FE72 ; NFKD_NO -FE74 ; NFKD_NO -FE76..FEFC ; NFKD_NO -FF01..FF03 ; NFKD_NO -FF04 ; NFKD_NO -FF05..FF07 ; NFKD_NO -FF08 ; NFKD_NO -FF09 ; NFKD_NO -FF0A ; NFKD_NO -FF0B ; NFKD_NO -FF0C ; NFKD_NO -FF0D ; NFKD_NO -FF0E..FF0F ; NFKD_NO -FF10..FF19 ; NFKD_NO -FF1A..FF1B ; NFKD_NO -FF1C..FF1E ; NFKD_NO -FF1F..FF20 ; NFKD_NO -FF21..FF3A ; NFKD_NO -FF3B ; NFKD_NO -FF3C ; NFKD_NO -FF3D ; NFKD_NO -FF3E ; NFKD_NO -FF3F ; NFKD_NO -FF40 ; NFKD_NO -FF41..FF5A ; NFKD_NO -FF5B ; NFKD_NO -FF5C ; NFKD_NO -FF5D ; NFKD_NO -FF5E ; NFKD_NO -FF5F ; NFKD_NO -FF60 ; NFKD_NO -FF61 ; NFKD_NO -FF62 ; NFKD_NO -FF63 ; NFKD_NO -FF64 ; NFKD_NO -FF65 ; NFKD_NO -FF66..FF6F ; NFKD_NO -FF70 ; NFKD_NO -FF71..FF9D ; NFKD_NO -FF9E..FF9F ; NFKD_NO -FFA0..FFBE ; NFKD_NO -FFC2..FFC7 ; NFKD_NO -FFCA..FFCF ; NFKD_NO -FFD2..FFD7 ; NFKD_NO -FFDA..FFDC ; NFKD_NO -FFE0..FFE1 ; NFKD_NO -FFE2 ; NFKD_NO -FFE3 ; NFKD_NO -FFE4 ; NFKD_NO -FFE5..FFE6 ; NFKD_NO -FFE8 ; NFKD_NO -FFE9..FFEC ; NFKD_NO -FFED..FFEE ; NFKD_NO -1D15E..1D164 ; NFKD_NO -1D1BB..1D1C0 ; NFKD_NO -1D400..1D454 ; NFKD_NO -1D456..1D49C ; NFKD_NO -1D49E..1D49F ; NFKD_NO -1D4A2 ; NFKD_NO -1D4A5..1D4A6 ; NFKD_NO -1D4A9..1D4AC ; NFKD_NO -1D4AE..1D4B9 ; NFKD_NO -1D4BB ; NFKD_NO -1D4BD..1D4C3 ; NFKD_NO -1D4C5..1D505 ; NFKD_NO -1D507..1D50A ; NFKD_NO -1D50D..1D514 ; NFKD_NO -1D516..1D51C ; NFKD_NO -1D51E..1D539 ; NFKD_NO -1D53B..1D53E ; NFKD_NO -1D540..1D544 ; NFKD_NO -1D546 ; NFKD_NO -1D54A..1D550 ; NFKD_NO -1D552..1D6A3 ; NFKD_NO -1D6A8..1D6C0 ; NFKD_NO -1D6C1 ; NFKD_NO -1D6C2..1D6DA ; NFKD_NO -1D6DB ; NFKD_NO -1D6DC..1D6FA ; NFKD_NO -1D6FB ; NFKD_NO -1D6FC..1D714 ; NFKD_NO -1D715 ; NFKD_NO -1D716..1D734 ; NFKD_NO -1D735 ; NFKD_NO -1D736..1D74E ; NFKD_NO -1D74F ; NFKD_NO -1D750..1D76E ; NFKD_NO -1D76F ; NFKD_NO -1D770..1D788 ; NFKD_NO -1D789 ; NFKD_NO -1D78A..1D7A8 ; NFKD_NO -1D7A9 ; NFKD_NO -1D7AA..1D7C2 ; NFKD_NO -1D7C3 ; NFKD_NO -1D7C4..1D7C9 ; NFKD_NO -1D7CE..1D7FF ; NFKD_NO -2F800..2FA1D ; NFKD_NO +# All code points not explicitly listed for NFKD_Quick_Check +# have the value Yes (Y). + +# ================================================ + +# NFKD_Quick_Check=No + +00A0 ; NFKD_QC; N +00A8 ; NFKD_QC; N +00AA ; NFKD_QC; N +00AF ; NFKD_QC; N +00B2..00B3 ; NFKD_QC; N +00B4 ; NFKD_QC; N +00B5 ; NFKD_QC; N +00B8 ; NFKD_QC; N +00B9 ; NFKD_QC; N +00BA ; NFKD_QC; N +00BC..00BE ; NFKD_QC; N +00C0..00C5 ; NFKD_QC; N +00C7..00CF ; NFKD_QC; N +00D1..00D6 ; NFKD_QC; N +00D9..00DD ; NFKD_QC; N +00E0..00E5 ; NFKD_QC; N +00E7..00EF ; NFKD_QC; N +00F1..00F6 ; NFKD_QC; N +00F9..00FD ; NFKD_QC; N +00FF..010F ; NFKD_QC; N +0112..0125 ; NFKD_QC; N +0128..0130 ; NFKD_QC; N +0132..0137 ; NFKD_QC; N +0139..0140 ; NFKD_QC; N +0143..0149 ; NFKD_QC; N +014C..0151 ; NFKD_QC; N +0154..0165 ; NFKD_QC; N +0168..017F ; NFKD_QC; N +01A0..01A1 ; NFKD_QC; N +01AF..01B0 ; NFKD_QC; N +01C4..01DC ; NFKD_QC; N +01DE..01E3 ; NFKD_QC; N +01E6..01F5 ; NFKD_QC; N +01F8..021B ; NFKD_QC; N +021E..021F ; NFKD_QC; N +0226..0233 ; NFKD_QC; N +02B0..02B8 ; NFKD_QC; N +02D8..02DD ; NFKD_QC; N +02E0..02E4 ; NFKD_QC; N +0340..0341 ; NFKD_QC; N +0343..0344 ; NFKD_QC; N +0374 ; NFKD_QC; N +037A ; NFKD_QC; N +037E ; NFKD_QC; N +0384..0385 ; NFKD_QC; N +0386 ; NFKD_QC; N +0387 ; NFKD_QC; N +0388..038A ; NFKD_QC; N +038C ; NFKD_QC; N +038E..0390 ; NFKD_QC; N +03AA..03B0 ; NFKD_QC; N +03CA..03CE ; NFKD_QC; N +03D0..03D6 ; NFKD_QC; N +03F0..03F2 ; NFKD_QC; N +03F4..03F5 ; NFKD_QC; N +03F9 ; NFKD_QC; N +0400..0401 ; NFKD_QC; N +0403 ; NFKD_QC; N +0407 ; NFKD_QC; N +040C..040E ; NFKD_QC; N +0419 ; NFKD_QC; N +0439 ; NFKD_QC; N +0450..0451 ; NFKD_QC; N +0453 ; NFKD_QC; N +0457 ; NFKD_QC; N +045C..045E ; NFKD_QC; N +0476..0477 ; NFKD_QC; N +04C1..04C2 ; NFKD_QC; N +04D0..04D3 ; NFKD_QC; N +04D6..04D7 ; NFKD_QC; N +04DA..04DF ; NFKD_QC; N +04E2..04E7 ; NFKD_QC; N +04EA..04F5 ; NFKD_QC; N +04F8..04F9 ; NFKD_QC; N +0587 ; NFKD_QC; N +0622..0626 ; NFKD_QC; N +0675..0678 ; NFKD_QC; N +06C0 ; NFKD_QC; N +06C2 ; NFKD_QC; N +06D3 ; NFKD_QC; N +0929 ; NFKD_QC; N +0931 ; NFKD_QC; N +0934 ; NFKD_QC; N +0958..095F ; NFKD_QC; N +09CB..09CC ; NFKD_QC; N +09DC..09DD ; NFKD_QC; N +09DF ; NFKD_QC; N +0A33 ; NFKD_QC; N +0A36 ; NFKD_QC; N +0A59..0A5B ; NFKD_QC; N +0A5E ; NFKD_QC; N +0B48 ; NFKD_QC; N +0B4B..0B4C ; NFKD_QC; N +0B5C..0B5D ; NFKD_QC; N +0B94 ; NFKD_QC; N +0BCA..0BCC ; NFKD_QC; N +0C48 ; NFKD_QC; N +0CC0 ; NFKD_QC; N +0CC7..0CC8 ; NFKD_QC; N +0CCA..0CCB ; NFKD_QC; N +0D4A..0D4C ; NFKD_QC; N +0DDA ; NFKD_QC; N +0DDC..0DDE ; NFKD_QC; N +0E33 ; NFKD_QC; N +0EB3 ; NFKD_QC; N +0EDC..0EDD ; NFKD_QC; N +0F0C ; NFKD_QC; N +0F43 ; NFKD_QC; N +0F4D ; NFKD_QC; N +0F52 ; NFKD_QC; N +0F57 ; NFKD_QC; N +0F5C ; NFKD_QC; N +0F69 ; NFKD_QC; N +0F73 ; NFKD_QC; N +0F75..0F79 ; NFKD_QC; N +0F81 ; NFKD_QC; N +0F93 ; NFKD_QC; N +0F9D ; NFKD_QC; N +0FA2 ; NFKD_QC; N +0FA7 ; NFKD_QC; N +0FAC ; NFKD_QC; N +0FB9 ; NFKD_QC; N +1026 ; NFKD_QC; N +1D2C..1D2E ; NFKD_QC; N +1D30..1D3A ; NFKD_QC; N +1D3C..1D4D ; NFKD_QC; N +1D4F..1D61 ; NFKD_QC; N +1D62..1D6A ; NFKD_QC; N +1E00..1E9B ; NFKD_QC; N +1EA0..1EF9 ; NFKD_QC; N +1F00..1F15 ; NFKD_QC; N +1F18..1F1D ; NFKD_QC; N +1F20..1F45 ; NFKD_QC; N +1F48..1F4D ; NFKD_QC; N +1F50..1F57 ; NFKD_QC; N +1F59 ; NFKD_QC; N +1F5B ; NFKD_QC; N +1F5D ; NFKD_QC; N +1F5F..1F7D ; NFKD_QC; N +1F80..1FB4 ; NFKD_QC; N +1FB6..1FBC ; NFKD_QC; N +1FBD ; NFKD_QC; N +1FBE ; NFKD_QC; N +1FBF..1FC1 ; NFKD_QC; N +1FC2..1FC4 ; NFKD_QC; N +1FC6..1FCC ; NFKD_QC; N +1FCD..1FCF ; NFKD_QC; N +1FD0..1FD3 ; NFKD_QC; N +1FD6..1FDB ; NFKD_QC; N +1FDD..1FDF ; NFKD_QC; N +1FE0..1FEC ; NFKD_QC; N +1FED..1FEF ; NFKD_QC; N +1FF2..1FF4 ; NFKD_QC; N +1FF6..1FFC ; NFKD_QC; N +1FFD..1FFE ; NFKD_QC; N +2000..200A ; NFKD_QC; N +2011 ; NFKD_QC; N +2017 ; NFKD_QC; N +2024..2026 ; NFKD_QC; N +202F ; NFKD_QC; N +2033..2034 ; NFKD_QC; N +2036..2037 ; NFKD_QC; N +203C ; NFKD_QC; N +203E ; NFKD_QC; N +2047..2049 ; NFKD_QC; N +2057 ; NFKD_QC; N +205F ; NFKD_QC; N +2070 ; NFKD_QC; N +2071 ; NFKD_QC; N +2074..2079 ; NFKD_QC; N +207A..207C ; NFKD_QC; N +207D ; NFKD_QC; N +207E ; NFKD_QC; N +207F ; NFKD_QC; N +2080..2089 ; NFKD_QC; N +208A..208C ; NFKD_QC; N +208D ; NFKD_QC; N +208E ; NFKD_QC; N +20A8 ; NFKD_QC; N +2100..2101 ; NFKD_QC; N +2102 ; NFKD_QC; N +2103 ; NFKD_QC; N +2105..2106 ; NFKD_QC; N +2107 ; NFKD_QC; N +2109 ; NFKD_QC; N +210A..2113 ; NFKD_QC; N +2115 ; NFKD_QC; N +2116 ; NFKD_QC; N +2119..211D ; NFKD_QC; N +2120..2122 ; NFKD_QC; N +2124 ; NFKD_QC; N +2126 ; NFKD_QC; N +2128 ; NFKD_QC; N +212A..212D ; NFKD_QC; N +212F..2131 ; NFKD_QC; N +2133..2134 ; NFKD_QC; N +2135..2138 ; NFKD_QC; N +2139 ; NFKD_QC; N +213B ; NFKD_QC; N +213D..213F ; NFKD_QC; N +2140 ; NFKD_QC; N +2145..2149 ; NFKD_QC; N +2153..215F ; NFKD_QC; N +2160..217F ; NFKD_QC; N +219A..219B ; NFKD_QC; N +21AE ; NFKD_QC; N +21CD ; NFKD_QC; N +21CE..21CF ; NFKD_QC; N +2204 ; NFKD_QC; N +2209 ; NFKD_QC; N +220C ; NFKD_QC; N +2224 ; NFKD_QC; N +2226 ; NFKD_QC; N +222C..222D ; NFKD_QC; N +222F..2230 ; NFKD_QC; N +2241 ; NFKD_QC; N +2244 ; NFKD_QC; N +2247 ; NFKD_QC; N +2249 ; NFKD_QC; N +2260 ; NFKD_QC; N +2262 ; NFKD_QC; N +226D..2271 ; NFKD_QC; N +2274..2275 ; NFKD_QC; N +2278..2279 ; NFKD_QC; N +2280..2281 ; NFKD_QC; N +2284..2285 ; NFKD_QC; N +2288..2289 ; NFKD_QC; N +22AC..22AF ; NFKD_QC; N +22E0..22E3 ; NFKD_QC; N +22EA..22ED ; NFKD_QC; N +2329 ; NFKD_QC; N +232A ; NFKD_QC; N +2460..249B ; NFKD_QC; N +249C..24E9 ; NFKD_QC; N +24EA ; NFKD_QC; N +2A0C ; NFKD_QC; N +2A74..2A76 ; NFKD_QC; N +2ADC ; NFKD_QC; N +2E9F ; NFKD_QC; N +2EF3 ; NFKD_QC; N +2F00..2FD5 ; NFKD_QC; N +3000 ; NFKD_QC; N +3036 ; NFKD_QC; N +3038..303A ; NFKD_QC; N +304C ; NFKD_QC; N +304E ; NFKD_QC; N +3050 ; NFKD_QC; N +3052 ; NFKD_QC; N +3054 ; NFKD_QC; N +3056 ; NFKD_QC; N +3058 ; NFKD_QC; N +305A ; NFKD_QC; N +305C ; NFKD_QC; N +305E ; NFKD_QC; N +3060 ; NFKD_QC; N +3062 ; NFKD_QC; N +3065 ; NFKD_QC; N +3067 ; NFKD_QC; N +3069 ; NFKD_QC; N +3070..3071 ; NFKD_QC; N +3073..3074 ; NFKD_QC; N +3076..3077 ; NFKD_QC; N +3079..307A ; NFKD_QC; N +307C..307D ; NFKD_QC; N +3094 ; NFKD_QC; N +309B..309C ; NFKD_QC; N +309E ; NFKD_QC; N +309F ; NFKD_QC; N +30AC ; NFKD_QC; N +30AE ; NFKD_QC; N +30B0 ; NFKD_QC; N +30B2 ; NFKD_QC; N +30B4 ; NFKD_QC; N +30B6 ; NFKD_QC; N +30B8 ; NFKD_QC; N +30BA ; NFKD_QC; N +30BC ; NFKD_QC; N +30BE ; NFKD_QC; N +30C0 ; NFKD_QC; N +30C2 ; NFKD_QC; N +30C5 ; NFKD_QC; N +30C7 ; NFKD_QC; N +30C9 ; NFKD_QC; N +30D0..30D1 ; NFKD_QC; N +30D3..30D4 ; NFKD_QC; N +30D6..30D7 ; NFKD_QC; N +30D9..30DA ; NFKD_QC; N +30DC..30DD ; NFKD_QC; N +30F4 ; NFKD_QC; N +30F7..30FA ; NFKD_QC; N +30FE ; NFKD_QC; N +30FF ; NFKD_QC; N +3131..318E ; NFKD_QC; N +3192..3195 ; NFKD_QC; N +3196..319F ; NFKD_QC; N +3200..321E ; NFKD_QC; N +3220..3229 ; NFKD_QC; N +322A..3243 ; NFKD_QC; N +3250 ; NFKD_QC; N +3251..325F ; NFKD_QC; N +3260..327D ; NFKD_QC; N +3280..3289 ; NFKD_QC; N +328A..32B0 ; NFKD_QC; N +32B1..32BF ; NFKD_QC; N +32C0..32FE ; NFKD_QC; N +3300..33FF ; NFKD_QC; N +AC00..D7A3 ; NFKD_QC; N +F900..FA0D ; NFKD_QC; N +FA10 ; NFKD_QC; N +FA12 ; NFKD_QC; N +FA15..FA1E ; NFKD_QC; N +FA20 ; NFKD_QC; N +FA22 ; NFKD_QC; N +FA25..FA26 ; NFKD_QC; N +FA2A..FA2D ; NFKD_QC; N +FA30..FA6A ; NFKD_QC; N +FB00..FB06 ; NFKD_QC; N +FB13..FB17 ; NFKD_QC; N +FB1D ; NFKD_QC; N +FB1F..FB28 ; NFKD_QC; N +FB29 ; NFKD_QC; N +FB2A..FB36 ; NFKD_QC; N +FB38..FB3C ; NFKD_QC; N +FB3E ; NFKD_QC; N +FB40..FB41 ; NFKD_QC; N +FB43..FB44 ; NFKD_QC; N +FB46..FBB1 ; NFKD_QC; N +FBD3..FD3D ; NFKD_QC; N +FD50..FD8F ; NFKD_QC; N +FD92..FDC7 ; NFKD_QC; N +FDF0..FDFB ; NFKD_QC; N +FDFC ; NFKD_QC; N +FE30 ; NFKD_QC; N +FE31..FE32 ; NFKD_QC; N +FE33..FE34 ; NFKD_QC; N +FE35 ; NFKD_QC; N +FE36 ; NFKD_QC; N +FE37 ; NFKD_QC; N +FE38 ; NFKD_QC; N +FE39 ; NFKD_QC; N +FE3A ; NFKD_QC; N +FE3B ; NFKD_QC; N +FE3C ; NFKD_QC; N +FE3D ; NFKD_QC; N +FE3E ; NFKD_QC; N +FE3F ; NFKD_QC; N +FE40 ; NFKD_QC; N +FE41 ; NFKD_QC; N +FE42 ; NFKD_QC; N +FE43 ; NFKD_QC; N +FE44 ; NFKD_QC; N +FE47 ; NFKD_QC; N +FE48 ; NFKD_QC; N +FE49..FE4C ; NFKD_QC; N +FE4D..FE4F ; NFKD_QC; N +FE50..FE52 ; NFKD_QC; N +FE54..FE57 ; NFKD_QC; N +FE58 ; NFKD_QC; N +FE59 ; NFKD_QC; N +FE5A ; NFKD_QC; N +FE5B ; NFKD_QC; N +FE5C ; NFKD_QC; N +FE5D ; NFKD_QC; N +FE5E ; NFKD_QC; N +FE5F..FE61 ; NFKD_QC; N +FE62 ; NFKD_QC; N +FE63 ; NFKD_QC; N +FE64..FE66 ; NFKD_QC; N +FE68 ; NFKD_QC; N +FE69 ; NFKD_QC; N +FE6A..FE6B ; NFKD_QC; N +FE70..FE72 ; NFKD_QC; N +FE74 ; NFKD_QC; N +FE76..FEFC ; NFKD_QC; N +FF01..FF03 ; NFKD_QC; N +FF04 ; NFKD_QC; N +FF05..FF07 ; NFKD_QC; N +FF08 ; NFKD_QC; N +FF09 ; NFKD_QC; N +FF0A ; NFKD_QC; N +FF0B ; NFKD_QC; N +FF0C ; NFKD_QC; N +FF0D ; NFKD_QC; N +FF0E..FF0F ; NFKD_QC; N +FF10..FF19 ; NFKD_QC; N +FF1A..FF1B ; NFKD_QC; N +FF1C..FF1E ; NFKD_QC; N +FF1F..FF20 ; NFKD_QC; N +FF21..FF3A ; NFKD_QC; N +FF3B ; NFKD_QC; N +FF3C ; NFKD_QC; N +FF3D ; NFKD_QC; N +FF3E ; NFKD_QC; N +FF3F ; NFKD_QC; N +FF40 ; NFKD_QC; N +FF41..FF5A ; NFKD_QC; N +FF5B ; NFKD_QC; N +FF5C ; NFKD_QC; N +FF5D ; NFKD_QC; N +FF5E ; NFKD_QC; N +FF5F ; NFKD_QC; N +FF60 ; NFKD_QC; N +FF61 ; NFKD_QC; N +FF62 ; NFKD_QC; N +FF63 ; NFKD_QC; N +FF64 ; NFKD_QC; N +FF65 ; NFKD_QC; N +FF66..FF6F ; NFKD_QC; N +FF70 ; NFKD_QC; N +FF71..FF9D ; NFKD_QC; N +FF9E..FF9F ; NFKD_QC; N +FFA0..FFBE ; NFKD_QC; N +FFC2..FFC7 ; NFKD_QC; N +FFCA..FFCF ; NFKD_QC; N +FFD2..FFD7 ; NFKD_QC; N +FFDA..FFDC ; NFKD_QC; N +FFE0..FFE1 ; NFKD_QC; N +FFE2 ; NFKD_QC; N +FFE3 ; NFKD_QC; N +FFE4 ; NFKD_QC; N +FFE5..FFE6 ; NFKD_QC; N +FFE8 ; NFKD_QC; N +FFE9..FFEC ; NFKD_QC; N +FFED..FFEE ; NFKD_QC; N +1D15E..1D164 ; NFKD_QC; N +1D1BB..1D1C0 ; NFKD_QC; N +1D400..1D454 ; NFKD_QC; N +1D456..1D49C ; NFKD_QC; N +1D49E..1D49F ; NFKD_QC; N +1D4A2 ; NFKD_QC; N +1D4A5..1D4A6 ; NFKD_QC; N +1D4A9..1D4AC ; NFKD_QC; N +1D4AE..1D4B9 ; NFKD_QC; N +1D4BB ; NFKD_QC; N +1D4BD..1D4C3 ; NFKD_QC; N +1D4C5..1D505 ; NFKD_QC; N +1D507..1D50A ; NFKD_QC; N +1D50D..1D514 ; NFKD_QC; N +1D516..1D51C ; NFKD_QC; N +1D51E..1D539 ; NFKD_QC; N +1D53B..1D53E ; NFKD_QC; N +1D540..1D544 ; NFKD_QC; N +1D546 ; NFKD_QC; N +1D54A..1D550 ; NFKD_QC; N +1D552..1D6A3 ; NFKD_QC; N +1D6A8..1D6C0 ; NFKD_QC; N +1D6C1 ; NFKD_QC; N +1D6C2..1D6DA ; NFKD_QC; N +1D6DB ; NFKD_QC; N +1D6DC..1D6FA ; NFKD_QC; N +1D6FB ; NFKD_QC; N +1D6FC..1D714 ; NFKD_QC; N +1D715 ; NFKD_QC; N +1D716..1D734 ; NFKD_QC; N +1D735 ; NFKD_QC; N +1D736..1D74E ; NFKD_QC; N +1D74F ; NFKD_QC; N +1D750..1D76E ; NFKD_QC; N +1D76F ; NFKD_QC; N +1D770..1D788 ; NFKD_QC; N +1D789 ; NFKD_QC; N +1D78A..1D7A8 ; NFKD_QC; N +1D7A9 ; NFKD_QC; N +1D7AA..1D7C2 ; NFKD_QC; N +1D7C3 ; NFKD_QC; N +1D7C4..1D7C9 ; NFKD_QC; N +1D7CE..1D7FF ; NFKD_QC; N +2F800..2FA1D ; NFKD_QC; N # Total code points: 16396 # ================================================ -# Derived Property: NFKC_QuickCheck -# Generated from computing decomposibles (and characters that may compose with previous ones) +# Property: NFKC_Quick_Check + +# All code points not explicitly listed for NFKC_Quick_Check +# have the value Yes (Y). + +# ================================================ + +# NFKC_Quick_Check=No -00A0 ; NFKC_NO -00A8 ; NFKC_NO -00AA ; NFKC_NO -00AF ; NFKC_NO -00B2..00B3 ; NFKC_NO -00B4 ; NFKC_NO -00B5 ; NFKC_NO -00B8 ; NFKC_NO -00B9 ; NFKC_NO -00BA ; NFKC_NO -00BC..00BE ; NFKC_NO -0132..0133 ; NFKC_NO -013F..0140 ; NFKC_NO -0149 ; NFKC_NO -017F ; NFKC_NO -01C4..01CC ; NFKC_NO -01F1..01F3 ; NFKC_NO -02B0..02B8 ; NFKC_NO -02D8..02DD ; NFKC_NO -02E0..02E4 ; NFKC_NO -0300..0304 ; NFKC_MAYBE -0306..030C ; NFKC_MAYBE -030F ; NFKC_MAYBE -0311 ; NFKC_MAYBE -0313..0314 ; NFKC_MAYBE -031B ; NFKC_MAYBE -0323..0328 ; NFKC_MAYBE -032D..032E ; NFKC_MAYBE -0330..0331 ; NFKC_MAYBE -0338 ; NFKC_MAYBE -0340..0341 ; NFKC_NO -0342 ; NFKC_MAYBE -0343..0344 ; NFKC_NO -0345 ; NFKC_MAYBE -0374 ; NFKC_NO -037A ; NFKC_NO -037E ; NFKC_NO -0384..0385 ; NFKC_NO -0387 ; NFKC_NO -03D0..03D6 ; NFKC_NO -03F0..03F2 ; NFKC_NO -03F4..03F5 ; NFKC_NO -03F9 ; NFKC_NO -0587 ; NFKC_NO -0653..0655 ; NFKC_MAYBE -0675..0678 ; NFKC_NO -093C ; NFKC_MAYBE -0958..095F ; NFKC_NO -09BE ; NFKC_MAYBE -09D7 ; NFKC_MAYBE -09DC..09DD ; NFKC_NO -09DF ; NFKC_NO -0A33 ; NFKC_NO -0A36 ; NFKC_NO -0A59..0A5B ; NFKC_NO -0A5E ; NFKC_NO -0B3E ; NFKC_MAYBE -0B56 ; NFKC_MAYBE -0B57 ; NFKC_MAYBE -0B5C..0B5D ; NFKC_NO -0BBE ; NFKC_MAYBE -0BD7 ; NFKC_MAYBE -0C56 ; NFKC_MAYBE -0CC2 ; NFKC_MAYBE -0CD5..0CD6 ; NFKC_MAYBE -0D3E ; NFKC_MAYBE -0D57 ; NFKC_MAYBE -0DCA ; NFKC_MAYBE -0DCF ; NFKC_MAYBE -0DDF ; NFKC_MAYBE -0E33 ; NFKC_NO -0EB3 ; NFKC_NO -0EDC..0EDD ; NFKC_NO -0F0C ; NFKC_NO -0F43 ; NFKC_NO -0F4D ; NFKC_NO -0F52 ; NFKC_NO -0F57 ; NFKC_NO -0F5C ; NFKC_NO -0F69 ; NFKC_NO -0F73 ; NFKC_NO -0F75..0F79 ; NFKC_NO -0F81 ; NFKC_NO -0F93 ; NFKC_NO -0F9D ; NFKC_NO -0FA2 ; NFKC_NO -0FA7 ; NFKC_NO -0FAC ; NFKC_NO -0FB9 ; NFKC_NO -102E ; NFKC_MAYBE -1161..1175 ; NFKC_MAYBE -11A8..11C2 ; NFKC_MAYBE -1D2C..1D2E ; NFKC_NO -1D30..1D3A ; NFKC_NO -1D3C..1D4D ; NFKC_NO -1D4F..1D61 ; NFKC_NO -1D62..1D6A ; NFKC_NO -1E9A..1E9B ; NFKC_NO -1F71 ; NFKC_NO -1F73 ; NFKC_NO -1F75 ; NFKC_NO -1F77 ; NFKC_NO -1F79 ; NFKC_NO -1F7B ; NFKC_NO -1F7D ; NFKC_NO -1FBB ; NFKC_NO -1FBD ; NFKC_NO -1FBE ; NFKC_NO -1FBF..1FC1 ; NFKC_NO -1FC9 ; NFKC_NO -1FCB ; NFKC_NO -1FCD..1FCF ; NFKC_NO -1FD3 ; NFKC_NO -1FDB ; NFKC_NO -1FDD..1FDF ; NFKC_NO -1FE3 ; NFKC_NO -1FEB ; NFKC_NO -1FED..1FEF ; NFKC_NO -1FF9 ; NFKC_NO -1FFB ; NFKC_NO -1FFD..1FFE ; NFKC_NO -2000..200A ; NFKC_NO -2011 ; NFKC_NO -2017 ; NFKC_NO -2024..2026 ; NFKC_NO -202F ; NFKC_NO -2033..2034 ; NFKC_NO -2036..2037 ; NFKC_NO -203C ; NFKC_NO -203E ; NFKC_NO -2047..2049 ; NFKC_NO -2057 ; NFKC_NO -205F ; NFKC_NO -2070 ; NFKC_NO -2071 ; NFKC_NO -2074..2079 ; NFKC_NO -207A..207C ; NFKC_NO -207D ; NFKC_NO -207E ; NFKC_NO -207F ; NFKC_NO -2080..2089 ; NFKC_NO -208A..208C ; NFKC_NO -208D ; NFKC_NO -208E ; NFKC_NO -20A8 ; NFKC_NO -2100..2101 ; NFKC_NO -2102 ; NFKC_NO -2103 ; NFKC_NO -2105..2106 ; NFKC_NO -2107 ; NFKC_NO -2109 ; NFKC_NO -210A..2113 ; NFKC_NO -2115 ; NFKC_NO -2116 ; NFKC_NO -2119..211D ; NFKC_NO -2120..2122 ; NFKC_NO -2124 ; NFKC_NO -2126 ; NFKC_NO -2128 ; NFKC_NO -212A..212D ; NFKC_NO -212F..2131 ; NFKC_NO -2133..2134 ; NFKC_NO -2135..2138 ; NFKC_NO -2139 ; NFKC_NO -213B ; NFKC_NO -213D..213F ; NFKC_NO -2140 ; NFKC_NO -2145..2149 ; NFKC_NO -2153..215F ; NFKC_NO -2160..217F ; NFKC_NO -222C..222D ; NFKC_NO -222F..2230 ; NFKC_NO -2329 ; NFKC_NO -232A ; NFKC_NO -2460..249B ; NFKC_NO -249C..24E9 ; NFKC_NO -24EA ; NFKC_NO -2A0C ; NFKC_NO -2A74..2A76 ; NFKC_NO -2ADC ; NFKC_NO -2E9F ; NFKC_NO -2EF3 ; NFKC_NO -2F00..2FD5 ; NFKC_NO -3000 ; NFKC_NO -3036 ; NFKC_NO -3038..303A ; NFKC_NO -3099..309A ; NFKC_MAYBE -309B..309C ; NFKC_NO -309F ; NFKC_NO -30FF ; NFKC_NO -3131..318E ; NFKC_NO -3192..3195 ; NFKC_NO -3196..319F ; NFKC_NO -3200..321E ; NFKC_NO -3220..3229 ; NFKC_NO -322A..3243 ; NFKC_NO -3250 ; NFKC_NO -3251..325F ; NFKC_NO -3260..327D ; NFKC_NO -3280..3289 ; NFKC_NO -328A..32B0 ; NFKC_NO -32B1..32BF ; NFKC_NO -32C0..32FE ; NFKC_NO -3300..33FF ; NFKC_NO -F900..FA0D ; NFKC_NO -FA10 ; NFKC_NO -FA12 ; NFKC_NO -FA15..FA1E ; NFKC_NO -FA20 ; NFKC_NO -FA22 ; NFKC_NO -FA25..FA26 ; NFKC_NO -FA2A..FA2D ; NFKC_NO -FA30..FA6A ; NFKC_NO -FB00..FB06 ; NFKC_NO -FB13..FB17 ; NFKC_NO -FB1D ; NFKC_NO -FB1F..FB28 ; NFKC_NO -FB29 ; NFKC_NO -FB2A..FB36 ; NFKC_NO -FB38..FB3C ; NFKC_NO -FB3E ; NFKC_NO -FB40..FB41 ; NFKC_NO -FB43..FB44 ; NFKC_NO -FB46..FBB1 ; NFKC_NO -FBD3..FD3D ; NFKC_NO -FD50..FD8F ; NFKC_NO -FD92..FDC7 ; NFKC_NO -FDF0..FDFB ; NFKC_NO -FDFC ; NFKC_NO -FE30 ; NFKC_NO -FE31..FE32 ; NFKC_NO -FE33..FE34 ; NFKC_NO -FE35 ; NFKC_NO -FE36 ; NFKC_NO -FE37 ; NFKC_NO -FE38 ; NFKC_NO -FE39 ; NFKC_NO -FE3A ; NFKC_NO -FE3B ; NFKC_NO -FE3C ; NFKC_NO -FE3D ; NFKC_NO -FE3E ; NFKC_NO -FE3F ; NFKC_NO -FE40 ; NFKC_NO -FE41 ; NFKC_NO -FE42 ; NFKC_NO -FE43 ; NFKC_NO -FE44 ; NFKC_NO -FE47 ; NFKC_NO -FE48 ; NFKC_NO -FE49..FE4C ; NFKC_NO -FE4D..FE4F ; NFKC_NO -FE50..FE52 ; NFKC_NO -FE54..FE57 ; NFKC_NO -FE58 ; NFKC_NO -FE59 ; NFKC_NO -FE5A ; NFKC_NO -FE5B ; NFKC_NO -FE5C ; NFKC_NO -FE5D ; NFKC_NO -FE5E ; NFKC_NO -FE5F..FE61 ; NFKC_NO -FE62 ; NFKC_NO -FE63 ; NFKC_NO -FE64..FE66 ; NFKC_NO -FE68 ; NFKC_NO -FE69 ; NFKC_NO -FE6A..FE6B ; NFKC_NO -FE70..FE72 ; NFKC_NO -FE74 ; NFKC_NO -FE76..FEFC ; NFKC_NO -FF01..FF03 ; NFKC_NO -FF04 ; NFKC_NO -FF05..FF07 ; NFKC_NO -FF08 ; NFKC_NO -FF09 ; NFKC_NO -FF0A ; NFKC_NO -FF0B ; NFKC_NO -FF0C ; NFKC_NO -FF0D ; NFKC_NO -FF0E..FF0F ; NFKC_NO -FF10..FF19 ; NFKC_NO -FF1A..FF1B ; NFKC_NO -FF1C..FF1E ; NFKC_NO -FF1F..FF20 ; NFKC_NO -FF21..FF3A ; NFKC_NO -FF3B ; NFKC_NO -FF3C ; NFKC_NO -FF3D ; NFKC_NO -FF3E ; NFKC_NO -FF3F ; NFKC_NO -FF40 ; NFKC_NO -FF41..FF5A ; NFKC_NO -FF5B ; NFKC_NO -FF5C ; NFKC_NO -FF5D ; NFKC_NO -FF5E ; NFKC_NO -FF5F ; NFKC_NO -FF60 ; NFKC_NO -FF61 ; NFKC_NO -FF62 ; NFKC_NO -FF63 ; NFKC_NO -FF64 ; NFKC_NO -FF65 ; NFKC_NO -FF66..FF6F ; NFKC_NO -FF70 ; NFKC_NO -FF71..FF9D ; NFKC_NO -FF9E..FF9F ; NFKC_NO -FFA0..FFBE ; NFKC_NO -FFC2..FFC7 ; NFKC_NO -FFCA..FFCF ; NFKC_NO -FFD2..FFD7 ; NFKC_NO -FFDA..FFDC ; NFKC_NO -FFE0..FFE1 ; NFKC_NO -FFE2 ; NFKC_NO -FFE3 ; NFKC_NO -FFE4 ; NFKC_NO -FFE5..FFE6 ; NFKC_NO -FFE8 ; NFKC_NO -FFE9..FFEC ; NFKC_NO -FFED..FFEE ; NFKC_NO -1D15E..1D164 ; NFKC_NO -1D1BB..1D1C0 ; NFKC_NO -1D400..1D454 ; NFKC_NO -1D456..1D49C ; NFKC_NO -1D49E..1D49F ; NFKC_NO -1D4A2 ; NFKC_NO -1D4A5..1D4A6 ; NFKC_NO -1D4A9..1D4AC ; NFKC_NO -1D4AE..1D4B9 ; NFKC_NO -1D4BB ; NFKC_NO -1D4BD..1D4C3 ; NFKC_NO -1D4C5..1D505 ; NFKC_NO -1D507..1D50A ; NFKC_NO -1D50D..1D514 ; NFKC_NO -1D516..1D51C ; NFKC_NO -1D51E..1D539 ; NFKC_NO -1D53B..1D53E ; NFKC_NO -1D540..1D544 ; NFKC_NO -1D546 ; NFKC_NO -1D54A..1D550 ; NFKC_NO -1D552..1D6A3 ; NFKC_NO -1D6A8..1D6C0 ; NFKC_NO -1D6C1 ; NFKC_NO -1D6C2..1D6DA ; NFKC_NO -1D6DB ; NFKC_NO -1D6DC..1D6FA ; NFKC_NO -1D6FB ; NFKC_NO -1D6FC..1D714 ; NFKC_NO -1D715 ; NFKC_NO -1D716..1D734 ; NFKC_NO -1D735 ; NFKC_NO -1D736..1D74E ; NFKC_NO -1D74F ; NFKC_NO -1D750..1D76E ; NFKC_NO -1D76F ; NFKC_NO -1D770..1D788 ; NFKC_NO -1D789 ; NFKC_NO -1D78A..1D7A8 ; NFKC_NO -1D7A9 ; NFKC_NO -1D7AA..1D7C2 ; NFKC_NO -1D7C3 ; NFKC_NO -1D7C4..1D7C9 ; NFKC_NO -1D7CE..1D7FF ; NFKC_NO -2F800..2FA1D ; NFKC_NO +00A0 ; NFKC_QC; N +00A8 ; NFKC_QC; N +00AA ; NFKC_QC; N +00AF ; NFKC_QC; N +00B2..00B3 ; NFKC_QC; N +00B4 ; NFKC_QC; N +00B5 ; NFKC_QC; N +00B8 ; NFKC_QC; N +00B9 ; NFKC_QC; N +00BA ; NFKC_QC; N +00BC..00BE ; NFKC_QC; N +0132..0133 ; NFKC_QC; N +013F..0140 ; NFKC_QC; N +0149 ; NFKC_QC; N +017F ; NFKC_QC; N +01C4..01CC ; NFKC_QC; N +01F1..01F3 ; NFKC_QC; N +02B0..02B8 ; NFKC_QC; N +02D8..02DD ; NFKC_QC; N +02E0..02E4 ; NFKC_QC; N +0340..0341 ; NFKC_QC; N +0343..0344 ; NFKC_QC; N +0374 ; NFKC_QC; N +037A ; NFKC_QC; N +037E ; NFKC_QC; N +0384..0385 ; NFKC_QC; N +0387 ; NFKC_QC; N +03D0..03D6 ; NFKC_QC; N +03F0..03F2 ; NFKC_QC; N +03F4..03F5 ; NFKC_QC; N +03F9 ; NFKC_QC; N +0587 ; NFKC_QC; N +0675..0678 ; NFKC_QC; N +0958..095F ; NFKC_QC; N +09DC..09DD ; NFKC_QC; N +09DF ; NFKC_QC; N +0A33 ; NFKC_QC; N +0A36 ; NFKC_QC; N +0A59..0A5B ; NFKC_QC; N +0A5E ; NFKC_QC; N +0B5C..0B5D ; NFKC_QC; N +0E33 ; NFKC_QC; N +0EB3 ; NFKC_QC; N +0EDC..0EDD ; NFKC_QC; N +0F0C ; NFKC_QC; N +0F43 ; NFKC_QC; N +0F4D ; NFKC_QC; N +0F52 ; NFKC_QC; N +0F57 ; NFKC_QC; N +0F5C ; NFKC_QC; N +0F69 ; NFKC_QC; N +0F73 ; NFKC_QC; N +0F75..0F79 ; NFKC_QC; N +0F81 ; NFKC_QC; N +0F93 ; NFKC_QC; N +0F9D ; NFKC_QC; N +0FA2 ; NFKC_QC; N +0FA7 ; NFKC_QC; N +0FAC ; NFKC_QC; N +0FB9 ; NFKC_QC; N +1D2C..1D2E ; NFKC_QC; N +1D30..1D3A ; NFKC_QC; N +1D3C..1D4D ; NFKC_QC; N +1D4F..1D61 ; NFKC_QC; N +1D62..1D6A ; NFKC_QC; N +1E9A..1E9B ; NFKC_QC; N +1F71 ; NFKC_QC; N +1F73 ; NFKC_QC; N +1F75 ; NFKC_QC; N +1F77 ; NFKC_QC; N +1F79 ; NFKC_QC; N +1F7B ; NFKC_QC; N +1F7D ; NFKC_QC; N +1FBB ; NFKC_QC; N +1FBD ; NFKC_QC; N +1FBE ; NFKC_QC; N +1FBF..1FC1 ; NFKC_QC; N +1FC9 ; NFKC_QC; N +1FCB ; NFKC_QC; N +1FCD..1FCF ; NFKC_QC; N +1FD3 ; NFKC_QC; N +1FDB ; NFKC_QC; N +1FDD..1FDF ; NFKC_QC; N +1FE3 ; NFKC_QC; N +1FEB ; NFKC_QC; N +1FED..1FEF ; NFKC_QC; N +1FF9 ; NFKC_QC; N +1FFB ; NFKC_QC; N +1FFD..1FFE ; NFKC_QC; N +2000..200A ; NFKC_QC; N +2011 ; NFKC_QC; N +2017 ; NFKC_QC; N +2024..2026 ; NFKC_QC; N +202F ; NFKC_QC; N +2033..2034 ; NFKC_QC; N +2036..2037 ; NFKC_QC; N +203C ; NFKC_QC; N +203E ; NFKC_QC; N +2047..2049 ; NFKC_QC; N +2057 ; NFKC_QC; N +205F ; NFKC_QC; N +2070 ; NFKC_QC; N +2071 ; NFKC_QC; N +2074..2079 ; NFKC_QC; N +207A..207C ; NFKC_QC; N +207D ; NFKC_QC; N +207E ; NFKC_QC; N +207F ; NFKC_QC; N +2080..2089 ; NFKC_QC; N +208A..208C ; NFKC_QC; N +208D ; NFKC_QC; N +208E ; NFKC_QC; N +20A8 ; NFKC_QC; N +2100..2101 ; NFKC_QC; N +2102 ; NFKC_QC; N +2103 ; NFKC_QC; N +2105..2106 ; NFKC_QC; N +2107 ; NFKC_QC; N +2109 ; NFKC_QC; N +210A..2113 ; NFKC_QC; N +2115 ; NFKC_QC; N +2116 ; NFKC_QC; N +2119..211D ; NFKC_QC; N +2120..2122 ; NFKC_QC; N +2124 ; NFKC_QC; N +2126 ; NFKC_QC; N +2128 ; NFKC_QC; N +212A..212D ; NFKC_QC; N +212F..2131 ; NFKC_QC; N +2133..2134 ; NFKC_QC; N +2135..2138 ; NFKC_QC; N +2139 ; NFKC_QC; N +213B ; NFKC_QC; N +213D..213F ; NFKC_QC; N +2140 ; NFKC_QC; N +2145..2149 ; NFKC_QC; N +2153..215F ; NFKC_QC; N +2160..217F ; NFKC_QC; N +222C..222D ; NFKC_QC; N +222F..2230 ; NFKC_QC; N +2329 ; NFKC_QC; N +232A ; NFKC_QC; N +2460..249B ; NFKC_QC; N +249C..24E9 ; NFKC_QC; N +24EA ; NFKC_QC; N +2A0C ; NFKC_QC; N +2A74..2A76 ; NFKC_QC; N +2ADC ; NFKC_QC; N +2E9F ; NFKC_QC; N +2EF3 ; NFKC_QC; N +2F00..2FD5 ; NFKC_QC; N +3000 ; NFKC_QC; N +3036 ; NFKC_QC; N +3038..303A ; NFKC_QC; N +309B..309C ; NFKC_QC; N +309F ; NFKC_QC; N +30FF ; NFKC_QC; N +3131..318E ; NFKC_QC; N +3192..3195 ; NFKC_QC; N +3196..319F ; NFKC_QC; N +3200..321E ; NFKC_QC; N +3220..3229 ; NFKC_QC; N +322A..3243 ; NFKC_QC; N +3250 ; NFKC_QC; N +3251..325F ; NFKC_QC; N +3260..327D ; NFKC_QC; N +3280..3289 ; NFKC_QC; N +328A..32B0 ; NFKC_QC; N +32B1..32BF ; NFKC_QC; N +32C0..32FE ; NFKC_QC; N +3300..33FF ; NFKC_QC; N +F900..FA0D ; NFKC_QC; N +FA10 ; NFKC_QC; N +FA12 ; NFKC_QC; N +FA15..FA1E ; NFKC_QC; N +FA20 ; NFKC_QC; N +FA22 ; NFKC_QC; N +FA25..FA26 ; NFKC_QC; N +FA2A..FA2D ; NFKC_QC; N +FA30..FA6A ; NFKC_QC; N +FB00..FB06 ; NFKC_QC; N +FB13..FB17 ; NFKC_QC; N +FB1D ; NFKC_QC; N +FB1F..FB28 ; NFKC_QC; N +FB29 ; NFKC_QC; N +FB2A..FB36 ; NFKC_QC; N +FB38..FB3C ; NFKC_QC; N +FB3E ; NFKC_QC; N +FB40..FB41 ; NFKC_QC; N +FB43..FB44 ; NFKC_QC; N +FB46..FBB1 ; NFKC_QC; N +FBD3..FD3D ; NFKC_QC; N +FD50..FD8F ; NFKC_QC; N +FD92..FDC7 ; NFKC_QC; N +FDF0..FDFB ; NFKC_QC; N +FDFC ; NFKC_QC; N +FE30 ; NFKC_QC; N +FE31..FE32 ; NFKC_QC; N +FE33..FE34 ; NFKC_QC; N +FE35 ; NFKC_QC; N +FE36 ; NFKC_QC; N +FE37 ; NFKC_QC; N +FE38 ; NFKC_QC; N +FE39 ; NFKC_QC; N +FE3A ; NFKC_QC; N +FE3B ; NFKC_QC; N +FE3C ; NFKC_QC; N +FE3D ; NFKC_QC; N +FE3E ; NFKC_QC; N +FE3F ; NFKC_QC; N +FE40 ; NFKC_QC; N +FE41 ; NFKC_QC; N +FE42 ; NFKC_QC; N +FE43 ; NFKC_QC; N +FE44 ; NFKC_QC; N +FE47 ; NFKC_QC; N +FE48 ; NFKC_QC; N +FE49..FE4C ; NFKC_QC; N +FE4D..FE4F ; NFKC_QC; N +FE50..FE52 ; NFKC_QC; N +FE54..FE57 ; NFKC_QC; N +FE58 ; NFKC_QC; N +FE59 ; NFKC_QC; N +FE5A ; NFKC_QC; N +FE5B ; NFKC_QC; N +FE5C ; NFKC_QC; N +FE5D ; NFKC_QC; N +FE5E ; NFKC_QC; N +FE5F..FE61 ; NFKC_QC; N +FE62 ; NFKC_QC; N +FE63 ; NFKC_QC; N +FE64..FE66 ; NFKC_QC; N +FE68 ; NFKC_QC; N +FE69 ; NFKC_QC; N +FE6A..FE6B ; NFKC_QC; N +FE70..FE72 ; NFKC_QC; N +FE74 ; NFKC_QC; N +FE76..FEFC ; NFKC_QC; N +FF01..FF03 ; NFKC_QC; N +FF04 ; NFKC_QC; N +FF05..FF07 ; NFKC_QC; N +FF08 ; NFKC_QC; N +FF09 ; NFKC_QC; N +FF0A ; NFKC_QC; N +FF0B ; NFKC_QC; N +FF0C ; NFKC_QC; N +FF0D ; NFKC_QC; N +FF0E..FF0F ; NFKC_QC; N +FF10..FF19 ; NFKC_QC; N +FF1A..FF1B ; NFKC_QC; N +FF1C..FF1E ; NFKC_QC; N +FF1F..FF20 ; NFKC_QC; N +FF21..FF3A ; NFKC_QC; N +FF3B ; NFKC_QC; N +FF3C ; NFKC_QC; N +FF3D ; NFKC_QC; N +FF3E ; NFKC_QC; N +FF3F ; NFKC_QC; N +FF40 ; NFKC_QC; N +FF41..FF5A ; NFKC_QC; N +FF5B ; NFKC_QC; N +FF5C ; NFKC_QC; N +FF5D ; NFKC_QC; N +FF5E ; NFKC_QC; N +FF5F ; NFKC_QC; N +FF60 ; NFKC_QC; N +FF61 ; NFKC_QC; N +FF62 ; NFKC_QC; N +FF63 ; NFKC_QC; N +FF64 ; NFKC_QC; N +FF65 ; NFKC_QC; N +FF66..FF6F ; NFKC_QC; N +FF70 ; NFKC_QC; N +FF71..FF9D ; NFKC_QC; N +FF9E..FF9F ; NFKC_QC; N +FFA0..FFBE ; NFKC_QC; N +FFC2..FFC7 ; NFKC_QC; N +FFCA..FFCF ; NFKC_QC; N +FFD2..FFD7 ; NFKC_QC; N +FFDA..FFDC ; NFKC_QC; N +FFE0..FFE1 ; NFKC_QC; N +FFE2 ; NFKC_QC; N +FFE3 ; NFKC_QC; N +FFE4 ; NFKC_QC; N +FFE5..FFE6 ; NFKC_QC; N +FFE8 ; NFKC_QC; N +FFE9..FFEC ; NFKC_QC; N +FFED..FFEE ; NFKC_QC; N +1D15E..1D164 ; NFKC_QC; N +1D1BB..1D1C0 ; NFKC_QC; N +1D400..1D454 ; NFKC_QC; N +1D456..1D49C ; NFKC_QC; N +1D49E..1D49F ; NFKC_QC; N +1D4A2 ; NFKC_QC; N +1D4A5..1D4A6 ; NFKC_QC; N +1D4A9..1D4AC ; NFKC_QC; N +1D4AE..1D4B9 ; NFKC_QC; N +1D4BB ; NFKC_QC; N +1D4BD..1D4C3 ; NFKC_QC; N +1D4C5..1D505 ; NFKC_QC; N +1D507..1D50A ; NFKC_QC; N +1D50D..1D514 ; NFKC_QC; N +1D516..1D51C ; NFKC_QC; N +1D51E..1D539 ; NFKC_QC; N +1D53B..1D53E ; NFKC_QC; N +1D540..1D544 ; NFKC_QC; N +1D546 ; NFKC_QC; N +1D54A..1D550 ; NFKC_QC; N +1D552..1D6A3 ; NFKC_QC; N +1D6A8..1D6C0 ; NFKC_QC; N +1D6C1 ; NFKC_QC; N +1D6C2..1D6DA ; NFKC_QC; N +1D6DB ; NFKC_QC; N +1D6DC..1D6FA ; NFKC_QC; N +1D6FB ; NFKC_QC; N +1D6FC..1D714 ; NFKC_QC; N +1D715 ; NFKC_QC; N +1D716..1D734 ; NFKC_QC; N +1D735 ; NFKC_QC; N +1D736..1D74E ; NFKC_QC; N +1D74F ; NFKC_QC; N +1D750..1D76E ; NFKC_QC; N +1D76F ; NFKC_QC; N +1D770..1D788 ; NFKC_QC; N +1D789 ; NFKC_QC; N +1D78A..1D7A8 ; NFKC_QC; N +1D7A9 ; NFKC_QC; N +1D7AA..1D7C2 ; NFKC_QC; N +1D7C3 ; NFKC_QC; N +1D7C4..1D7C9 ; NFKC_QC; N +1D7CE..1D7FF ; NFKC_QC; N +2F800..2FA1D ; NFKC_QC; N -# Total code points: 4420 +# Total code points: 4319 + +# ================================================ + +# NFKC_Quick_Check=Maybe + +0300..0304 ; NFKC_QC; M +0306..030C ; NFKC_QC; M +030F ; NFKC_QC; M +0311 ; NFKC_QC; M +0313..0314 ; NFKC_QC; M +031B ; NFKC_QC; M +0323..0328 ; NFKC_QC; M +032D..032E ; NFKC_QC; M +0330..0331 ; NFKC_QC; M +0338 ; NFKC_QC; M +0342 ; NFKC_QC; M +0345 ; NFKC_QC; M +0653..0655 ; NFKC_QC; M +093C ; NFKC_QC; M +09BE ; NFKC_QC; M +09D7 ; NFKC_QC; M +0B3E ; NFKC_QC; M +0B56 ; NFKC_QC; M +0B57 ; NFKC_QC; M +0BBE ; NFKC_QC; M +0BD7 ; NFKC_QC; M +0C56 ; NFKC_QC; M +0CC2 ; NFKC_QC; M +0CD5..0CD6 ; NFKC_QC; M +0D3E ; NFKC_QC; M +0D57 ; NFKC_QC; M +0DCA ; NFKC_QC; M +0DCF ; NFKC_QC; M +0DDF ; NFKC_QC; M +102E ; NFKC_QC; M +1161..1175 ; NFKC_QC; M +11A8..11C2 ; NFKC_QC; M +3099..309A ; NFKC_QC; M + +# Total code points: 101 # ================================================ @@ -2536,4 +2572,3 @@ FFE3 ; Expands_On_NFKC 1D1BB..1D1C0 ; Expands_On_NFKC # Total code points: 1170 - diff --git a/icuSources/data/unidata/DerivedNumericValues.txt b/icuSources/data/unidata/DerivedNumericValues.txt index 7aac3a55..125269bf 100644 --- a/icuSources/data/unidata/DerivedNumericValues.txt +++ b/icuSources/data/unidata/DerivedNumericValues.txt @@ -1,1096 +1,1204 @@ -# DerivedNumericValues-4.0.0.txt -# Date: 2003-03-19, 01:18:09 GMT [MD] +# DerivedNumericValues-4.0.1.txt +# Date: 2004-03-11, 18:44:27 GMT [MD] # -# Unicode Character Database: Derived Property Data -# Generated algorithmically from the Unicode Character Database +# Unicode Character Database +# Copyright (c) 1991-2004 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html # For documentation, see UCD.html -# Note: Unassigned and Noncharacter codepoints may be omitted -# if they have default property values. + # ================================================ +# Numeric Values (from UnicodeData.txt, field 6/7/8) +# WARNING: Certain valus, such as 0.16666667, are repeating fractions +# Although they are only printed with a limited number of decimal places +# in this file, they should be expressed to the limits of the precision +# available when used. # ================================================ -# Numeric Values (from UnicodeData.txt, field 6/7/8) + +0F33 ; -0.5 # No TIBETAN DIGIT HALF ZERO + +# Total code points: 1 + # ================================================ -0F33 ; -0.5; numeric # No TIBETAN DIGIT HALF ZERO - -# Total code points: 1 - - -0030 ; 0.0; decimal # Nd DIGIT ZERO -0660 ; 0.0; decimal # Nd ARABIC-INDIC DIGIT ZERO -06F0 ; 0.0; decimal # Nd EXTENDED ARABIC-INDIC DIGIT ZERO -0966 ; 0.0; decimal # Nd DEVANAGARI DIGIT ZERO -09E6 ; 0.0; decimal # Nd BENGALI DIGIT ZERO -0A66 ; 0.0; decimal # Nd GURMUKHI DIGIT ZERO -0AE6 ; 0.0; decimal # Nd GUJARATI DIGIT ZERO -0B66 ; 0.0; decimal # Nd ORIYA DIGIT ZERO -0C66 ; 0.0; decimal # Nd TELUGU DIGIT ZERO -0CE6 ; 0.0; decimal # Nd KANNADA DIGIT ZERO -0D66 ; 0.0; decimal # Nd MALAYALAM DIGIT ZERO -0E50 ; 0.0; decimal # Nd THAI DIGIT ZERO -0ED0 ; 0.0; decimal # Nd LAO DIGIT ZERO -0F20 ; 0.0; decimal # Nd TIBETAN DIGIT ZERO -1040 ; 0.0; decimal # Nd MYANMAR DIGIT ZERO -17E0 ; 0.0; decimal # Nd KHMER DIGIT ZERO -17F0 ; 0.0; numeric # No KHMER SYMBOL LEK ATTAK SON -1810 ; 0.0; decimal # Nd MONGOLIAN DIGIT ZERO -1946 ; 0.0; decimal # Nd LIMBU DIGIT ZERO -2070 ; 0.0; digit # No SUPERSCRIPT ZERO -2080 ; 0.0; digit # No SUBSCRIPT ZERO -24EA ; 0.0; digit # No CIRCLED DIGIT ZERO -24FF ; 0.0; digit # No NEGATIVE CIRCLED DIGIT ZERO -3007 ; 0.0; numeric # Nl IDEOGRAPHIC NUMBER ZERO -96F6 ; 0.0; numeric # Lo CJK UNIFIED IDEOGRAPH-96F6 -FF10 ; 0.0; decimal # Nd FULLWIDTH DIGIT ZERO -104A0 ; 0.0; decimal # Nd OSMANYA DIGIT ZERO -1D7CE ; 0.0; decimal # Nd MATHEMATICAL BOLD DIGIT ZERO -1D7D8 ; 0.0; decimal # Nd MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO -1D7E2 ; 0.0; decimal # Nd MATHEMATICAL SANS-SERIF DIGIT ZERO -1D7EC ; 0.0; decimal # Nd MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO -1D7F6 ; 0.0; decimal # Nd MATHEMATICAL MONOSPACE DIGIT ZERO +0030 ; 0.0 # Nd DIGIT ZERO +0660 ; 0.0 # Nd ARABIC-INDIC DIGIT ZERO +06F0 ; 0.0 # Nd EXTENDED ARABIC-INDIC DIGIT ZERO +0966 ; 0.0 # Nd DEVANAGARI DIGIT ZERO +09E6 ; 0.0 # Nd BENGALI DIGIT ZERO +0A66 ; 0.0 # Nd GURMUKHI DIGIT ZERO +0AE6 ; 0.0 # Nd GUJARATI DIGIT ZERO +0B66 ; 0.0 # Nd ORIYA DIGIT ZERO +0C66 ; 0.0 # Nd TELUGU DIGIT ZERO +0CE6 ; 0.0 # Nd KANNADA DIGIT ZERO +0D66 ; 0.0 # Nd MALAYALAM DIGIT ZERO +0E50 ; 0.0 # Nd THAI DIGIT ZERO +0ED0 ; 0.0 # Nd LAO DIGIT ZERO +0F20 ; 0.0 # Nd TIBETAN DIGIT ZERO +1040 ; 0.0 # Nd MYANMAR DIGIT ZERO +17E0 ; 0.0 # Nd KHMER DIGIT ZERO +17F0 ; 0.0 # No KHMER SYMBOL LEK ATTAK SON +1810 ; 0.0 # Nd MONGOLIAN DIGIT ZERO +1946 ; 0.0 # Nd LIMBU DIGIT ZERO +2070 ; 0.0 # No SUPERSCRIPT ZERO +2080 ; 0.0 # No SUBSCRIPT ZERO +24EA ; 0.0 # No CIRCLED DIGIT ZERO +24FF ; 0.0 # No NEGATIVE CIRCLED DIGIT ZERO +3007 ; 0.0 # Nl IDEOGRAPHIC NUMBER ZERO +96F6 ; 0.0 # Lo CJK UNIFIED IDEOGRAPH-96F6 +FF10 ; 0.0 # Nd FULLWIDTH DIGIT ZERO +104A0 ; 0.0 # Nd OSMANYA DIGIT ZERO +1D7CE ; 0.0 # Nd MATHEMATICAL BOLD DIGIT ZERO +1D7D8 ; 0.0 # Nd MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO +1D7E2 ; 0.0 # Nd MATHEMATICAL SANS-SERIF DIGIT ZERO +1D7EC ; 0.0 # Nd MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO +1D7F6 ; 0.0 # Nd MATHEMATICAL MONOSPACE DIGIT ZERO # Total code points: 32 +# ================================================ -215B ; 0.125; numeric # No VULGAR FRACTION ONE EIGHTH +215B ; 0.125 # No VULGAR FRACTION ONE EIGHTH # Total code points: 1 +# ================================================ -2159 ; 0.16666667; numeric # No VULGAR FRACTION ONE SIXTH +2159 ; 0.16666667 # No VULGAR FRACTION ONE SIXTH # Total code points: 1 +# ================================================ -2155 ; 0.2; numeric # No VULGAR FRACTION ONE FIFTH +2155 ; 0.2 # No VULGAR FRACTION ONE FIFTH # Total code points: 1 +# ================================================ -00BC ; 0.25; numeric # No VULGAR FRACTION ONE QUARTER +00BC ; 0.25 # No VULGAR FRACTION ONE QUARTER # Total code points: 1 +# ================================================ -2153 ; 0.33333333; numeric # No VULGAR FRACTION ONE THIRD +2153 ; 0.33333333 # No VULGAR FRACTION ONE THIRD # Total code points: 1 +# ================================================ -215C ; 0.375; numeric # No VULGAR FRACTION THREE EIGHTHS +215C ; 0.375 # No VULGAR FRACTION THREE EIGHTHS # Total code points: 1 +# ================================================ -2156 ; 0.4; numeric # No VULGAR FRACTION TWO FIFTHS +2156 ; 0.4 # No VULGAR FRACTION TWO FIFTHS # Total code points: 1 +# ================================================ -00BD ; 0.5; numeric # No VULGAR FRACTION ONE HALF -0F2A ; 0.5; numeric # No TIBETAN DIGIT HALF ONE +00BD ; 0.5 # No VULGAR FRACTION ONE HALF +0F2A ; 0.5 # No TIBETAN DIGIT HALF ONE # Total code points: 2 +# ================================================ -2157 ; 0.6; numeric # No VULGAR FRACTION THREE FIFTHS +2157 ; 0.6 # No VULGAR FRACTION THREE FIFTHS # Total code points: 1 +# ================================================ -215D ; 0.625; numeric # No VULGAR FRACTION FIVE EIGHTHS +215D ; 0.625 # No VULGAR FRACTION FIVE EIGHTHS # Total code points: 1 +# ================================================ -2154 ; 0.66666667; numeric # No VULGAR FRACTION TWO THIRDS +2154 ; 0.66666667 # No VULGAR FRACTION TWO THIRDS # Total code points: 1 +# ================================================ -00BE ; 0.75; numeric # No VULGAR FRACTION THREE QUARTERS +00BE ; 0.75 # No VULGAR FRACTION THREE QUARTERS # Total code points: 1 +# ================================================ -2158 ; 0.8; numeric # No VULGAR FRACTION FOUR FIFTHS +2158 ; 0.8 # No VULGAR FRACTION FOUR FIFTHS # Total code points: 1 +# ================================================ -215A ; 0.83333333; numeric # No VULGAR FRACTION FIVE SIXTHS +215A ; 0.83333333 # No VULGAR FRACTION FIVE SIXTHS # Total code points: 1 +# ================================================ -215E ; 0.875; numeric # No VULGAR FRACTION SEVEN EIGHTHS +215E ; 0.875 # No VULGAR FRACTION SEVEN EIGHTHS # Total code points: 1 +# ================================================ -0031 ; 1.0; decimal # Nd DIGIT ONE -00B9 ; 1.0; digit # No SUPERSCRIPT ONE -0661 ; 1.0; decimal # Nd ARABIC-INDIC DIGIT ONE -06F1 ; 1.0; decimal # Nd EXTENDED ARABIC-INDIC DIGIT ONE -0967 ; 1.0; decimal # Nd DEVANAGARI DIGIT ONE -09E7 ; 1.0; decimal # Nd BENGALI DIGIT ONE -09F4 ; 1.0; numeric # No BENGALI CURRENCY NUMERATOR ONE -0A67 ; 1.0; decimal # Nd GURMUKHI DIGIT ONE -0AE7 ; 1.0; decimal # Nd GUJARATI DIGIT ONE -0B67 ; 1.0; decimal # Nd ORIYA DIGIT ONE -0BE7 ; 1.0; decimal # Nd TAMIL DIGIT ONE -0C67 ; 1.0; decimal # Nd TELUGU DIGIT ONE -0CE7 ; 1.0; decimal # Nd KANNADA DIGIT ONE -0D67 ; 1.0; decimal # Nd MALAYALAM DIGIT ONE -0E51 ; 1.0; decimal # Nd THAI DIGIT ONE -0ED1 ; 1.0; decimal # Nd LAO DIGIT ONE -0F21 ; 1.0; decimal # Nd TIBETAN DIGIT ONE -1041 ; 1.0; decimal # Nd MYANMAR DIGIT ONE -1369 ; 1.0; decimal # Nd ETHIOPIC DIGIT ONE -17E1 ; 1.0; decimal # Nd KHMER DIGIT ONE -17F1 ; 1.0; numeric # No KHMER SYMBOL LEK ATTAK MUOY -1811 ; 1.0; decimal # Nd MONGOLIAN DIGIT ONE -1947 ; 1.0; decimal # Nd LIMBU DIGIT ONE -2081 ; 1.0; digit # No SUBSCRIPT ONE -215F ; 1.0; numeric # No FRACTION NUMERATOR ONE -2160 ; 1.0; numeric # Nl ROMAN NUMERAL ONE -2170 ; 1.0; numeric # Nl SMALL ROMAN NUMERAL ONE -2460 ; 1.0; digit # No CIRCLED DIGIT ONE -2474 ; 1.0; digit # No PARENTHESIZED DIGIT ONE -2488 ; 1.0; digit # No DIGIT ONE FULL STOP -24F5 ; 1.0; digit # No DOUBLE CIRCLED DIGIT ONE -2776 ; 1.0; digit # No DINGBAT NEGATIVE CIRCLED DIGIT ONE -2780 ; 1.0; digit # No DINGBAT CIRCLED SANS-SERIF DIGIT ONE -278A ; 1.0; digit # No DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE -3021 ; 1.0; numeric # Nl HANGZHOU NUMERAL ONE -3192 ; 1.0; numeric # No IDEOGRAPHIC ANNOTATION ONE MARK -3220 ; 1.0; numeric # No PARENTHESIZED IDEOGRAPH ONE -3280 ; 1.0; numeric # No CIRCLED IDEOGRAPH ONE -4E00 ; 1.0; numeric # Lo CJK UNIFIED IDEOGRAPH-4E00 -58F1 ; 1.0; numeric # Lo CJK UNIFIED IDEOGRAPH-58F1 -58F9 ; 1.0; numeric # Lo CJK UNIFIED IDEOGRAPH-58F9 -5F0C ; 1.0; numeric # Lo CJK UNIFIED IDEOGRAPH-5F0C -FF11 ; 1.0; decimal # Nd FULLWIDTH DIGIT ONE -10107 ; 1.0; numeric # No AEGEAN NUMBER ONE -10320 ; 1.0; numeric # No OLD ITALIC NUMERAL ONE -104A1 ; 1.0; decimal # Nd OSMANYA DIGIT ONE -1D7CF ; 1.0; decimal # Nd MATHEMATICAL BOLD DIGIT ONE -1D7D9 ; 1.0; decimal # Nd MATHEMATICAL DOUBLE-STRUCK DIGIT ONE -1D7E3 ; 1.0; decimal # Nd MATHEMATICAL SANS-SERIF DIGIT ONE -1D7ED ; 1.0; decimal # Nd MATHEMATICAL SANS-SERIF BOLD DIGIT ONE -1D7F7 ; 1.0; decimal # Nd MATHEMATICAL MONOSPACE DIGIT ONE +0031 ; 1.0 # Nd DIGIT ONE +00B9 ; 1.0 # No SUPERSCRIPT ONE +0661 ; 1.0 # Nd ARABIC-INDIC DIGIT ONE +06F1 ; 1.0 # Nd EXTENDED ARABIC-INDIC DIGIT ONE +0967 ; 1.0 # Nd DEVANAGARI DIGIT ONE +09E7 ; 1.0 # Nd BENGALI DIGIT ONE +09F4 ; 1.0 # No BENGALI CURRENCY NUMERATOR ONE +0A67 ; 1.0 # Nd GURMUKHI DIGIT ONE +0AE7 ; 1.0 # Nd GUJARATI DIGIT ONE +0B67 ; 1.0 # Nd ORIYA DIGIT ONE +0BE7 ; 1.0 # Nd TAMIL DIGIT ONE +0C67 ; 1.0 # Nd TELUGU DIGIT ONE +0CE7 ; 1.0 # Nd KANNADA DIGIT ONE +0D67 ; 1.0 # Nd MALAYALAM DIGIT ONE +0E51 ; 1.0 # Nd THAI DIGIT ONE +0ED1 ; 1.0 # Nd LAO DIGIT ONE +0F21 ; 1.0 # Nd TIBETAN DIGIT ONE +1041 ; 1.0 # Nd MYANMAR DIGIT ONE +1369 ; 1.0 # Nd ETHIOPIC DIGIT ONE +17E1 ; 1.0 # Nd KHMER DIGIT ONE +17F1 ; 1.0 # No KHMER SYMBOL LEK ATTAK MUOY +1811 ; 1.0 # Nd MONGOLIAN DIGIT ONE +1947 ; 1.0 # Nd LIMBU DIGIT ONE +2081 ; 1.0 # No SUBSCRIPT ONE +215F ; 1.0 # No FRACTION NUMERATOR ONE +2160 ; 1.0 # Nl ROMAN NUMERAL ONE +2170 ; 1.0 # Nl SMALL ROMAN NUMERAL ONE +2460 ; 1.0 # No CIRCLED DIGIT ONE +2474 ; 1.0 # No PARENTHESIZED DIGIT ONE +2488 ; 1.0 # No DIGIT ONE FULL STOP +24F5 ; 1.0 # No DOUBLE CIRCLED DIGIT ONE +2776 ; 1.0 # No DINGBAT NEGATIVE CIRCLED DIGIT ONE +2780 ; 1.0 # No DINGBAT CIRCLED SANS-SERIF DIGIT ONE +278A ; 1.0 # No DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE +3021 ; 1.0 # Nl HANGZHOU NUMERAL ONE +3192 ; 1.0 # No IDEOGRAPHIC ANNOTATION ONE MARK +3220 ; 1.0 # No PARENTHESIZED IDEOGRAPH ONE +3280 ; 1.0 # No CIRCLED IDEOGRAPH ONE +4E00 ; 1.0 # Lo CJK UNIFIED IDEOGRAPH-4E00 +58F1 ; 1.0 # Lo CJK UNIFIED IDEOGRAPH-58F1 +58F9 ; 1.0 # Lo CJK UNIFIED IDEOGRAPH-58F9 +5F0C ; 1.0 # Lo CJK UNIFIED IDEOGRAPH-5F0C +FF11 ; 1.0 # Nd FULLWIDTH DIGIT ONE +10107 ; 1.0 # No AEGEAN NUMBER ONE +10320 ; 1.0 # No OLD ITALIC NUMERAL ONE +104A1 ; 1.0 # Nd OSMANYA DIGIT ONE +1D7CF ; 1.0 # Nd MATHEMATICAL BOLD DIGIT ONE +1D7D9 ; 1.0 # Nd MATHEMATICAL DOUBLE-STRUCK DIGIT ONE +1D7E3 ; 1.0 # Nd MATHEMATICAL SANS-SERIF DIGIT ONE +1D7ED ; 1.0 # Nd MATHEMATICAL SANS-SERIF BOLD DIGIT ONE +1D7F7 ; 1.0 # Nd MATHEMATICAL MONOSPACE DIGIT ONE # Total code points: 51 +# ================================================ + +0F2B ; 1.5 # No TIBETAN DIGIT HALF TWO + +# Total code points: 1 + +# ================================================ -0F2B ; 1.5; numeric # No TIBETAN DIGIT HALF TWO - -# Total code points: 1 - - -0032 ; 2.0; decimal # Nd DIGIT TWO -00B2 ; 2.0; digit # No SUPERSCRIPT TWO -0662 ; 2.0; decimal # Nd ARABIC-INDIC DIGIT TWO -06F2 ; 2.0; decimal # Nd EXTENDED ARABIC-INDIC DIGIT TWO -0968 ; 2.0; decimal # Nd DEVANAGARI DIGIT TWO -09E8 ; 2.0; decimal # Nd BENGALI DIGIT TWO -09F5 ; 2.0; numeric # No BENGALI CURRENCY NUMERATOR TWO -0A68 ; 2.0; decimal # Nd GURMUKHI DIGIT TWO -0AE8 ; 2.0; decimal # Nd GUJARATI DIGIT TWO -0B68 ; 2.0; decimal # Nd ORIYA DIGIT TWO -0BE8 ; 2.0; decimal # Nd TAMIL DIGIT TWO -0C68 ; 2.0; decimal # Nd TELUGU DIGIT TWO -0CE8 ; 2.0; decimal # Nd KANNADA DIGIT TWO -0D68 ; 2.0; decimal # Nd MALAYALAM DIGIT TWO -0E52 ; 2.0; decimal # Nd THAI DIGIT TWO -0ED2 ; 2.0; decimal # Nd LAO DIGIT TWO -0F22 ; 2.0; decimal # Nd TIBETAN DIGIT TWO -1042 ; 2.0; decimal # Nd MYANMAR DIGIT TWO -136A ; 2.0; decimal # Nd ETHIOPIC DIGIT TWO -17E2 ; 2.0; decimal # Nd KHMER DIGIT TWO -17F2 ; 2.0; numeric # No KHMER SYMBOL LEK ATTAK PII -1812 ; 2.0; decimal # Nd MONGOLIAN DIGIT TWO -1948 ; 2.0; decimal # Nd LIMBU DIGIT TWO -2082 ; 2.0; digit # No SUBSCRIPT TWO -2161 ; 2.0; numeric # Nl ROMAN NUMERAL TWO -2171 ; 2.0; numeric # Nl SMALL ROMAN NUMERAL TWO -2461 ; 2.0; digit # No CIRCLED DIGIT TWO -2475 ; 2.0; digit # No PARENTHESIZED DIGIT TWO -2489 ; 2.0; digit # No DIGIT TWO FULL STOP -24F6 ; 2.0; digit # No DOUBLE CIRCLED DIGIT TWO -2777 ; 2.0; digit # No DINGBAT NEGATIVE CIRCLED DIGIT TWO -2781 ; 2.0; digit # No DINGBAT CIRCLED SANS-SERIF DIGIT TWO -278B ; 2.0; digit # No DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO -3022 ; 2.0; numeric # Nl HANGZHOU NUMERAL TWO -3193 ; 2.0; numeric # No IDEOGRAPHIC ANNOTATION TWO MARK -3221 ; 2.0; numeric # No PARENTHESIZED IDEOGRAPH TWO -3281 ; 2.0; numeric # No CIRCLED IDEOGRAPH TWO -4E8C ; 2.0; numeric # Lo CJK UNIFIED IDEOGRAPH-4E8C -5169 ; 2.0; numeric # Lo CJK UNIFIED IDEOGRAPH-5169 -5F0D ; 2.0; numeric # Lo CJK UNIFIED IDEOGRAPH-5F0D -5F10 ; 2.0; numeric # Lo CJK UNIFIED IDEOGRAPH-5F10 -8CAE ; 2.0; numeric # Lo CJK UNIFIED IDEOGRAPH-8CAE -8D30 ; 2.0; numeric # Lo CJK UNIFIED IDEOGRAPH-8D30 -FF12 ; 2.0; decimal # Nd FULLWIDTH DIGIT TWO -10108 ; 2.0; numeric # No AEGEAN NUMBER TWO -104A2 ; 2.0; decimal # Nd OSMANYA DIGIT TWO -1D7D0 ; 2.0; decimal # Nd MATHEMATICAL BOLD DIGIT TWO -1D7DA ; 2.0; decimal # Nd MATHEMATICAL DOUBLE-STRUCK DIGIT TWO -1D7E4 ; 2.0; decimal # Nd MATHEMATICAL SANS-SERIF DIGIT TWO -1D7EE ; 2.0; decimal # Nd MATHEMATICAL SANS-SERIF BOLD DIGIT TWO -1D7F8 ; 2.0; decimal # Nd MATHEMATICAL MONOSPACE DIGIT TWO +0032 ; 2.0 # Nd DIGIT TWO +00B2 ; 2.0 # No SUPERSCRIPT TWO +0662 ; 2.0 # Nd ARABIC-INDIC DIGIT TWO +06F2 ; 2.0 # Nd EXTENDED ARABIC-INDIC DIGIT TWO +0968 ; 2.0 # Nd DEVANAGARI DIGIT TWO +09E8 ; 2.0 # Nd BENGALI DIGIT TWO +09F5 ; 2.0 # No BENGALI CURRENCY NUMERATOR TWO +0A68 ; 2.0 # Nd GURMUKHI DIGIT TWO +0AE8 ; 2.0 # Nd GUJARATI DIGIT TWO +0B68 ; 2.0 # Nd ORIYA DIGIT TWO +0BE8 ; 2.0 # Nd TAMIL DIGIT TWO +0C68 ; 2.0 # Nd TELUGU DIGIT TWO +0CE8 ; 2.0 # Nd KANNADA DIGIT TWO +0D68 ; 2.0 # Nd MALAYALAM DIGIT TWO +0E52 ; 2.0 # Nd THAI DIGIT TWO +0ED2 ; 2.0 # Nd LAO DIGIT TWO +0F22 ; 2.0 # Nd TIBETAN DIGIT TWO +1042 ; 2.0 # Nd MYANMAR DIGIT TWO +136A ; 2.0 # Nd ETHIOPIC DIGIT TWO +17E2 ; 2.0 # Nd KHMER DIGIT TWO +17F2 ; 2.0 # No KHMER SYMBOL LEK ATTAK PII +1812 ; 2.0 # Nd MONGOLIAN DIGIT TWO +1948 ; 2.0 # Nd LIMBU DIGIT TWO +2082 ; 2.0 # No SUBSCRIPT TWO +2161 ; 2.0 # Nl ROMAN NUMERAL TWO +2171 ; 2.0 # Nl SMALL ROMAN NUMERAL TWO +2461 ; 2.0 # No CIRCLED DIGIT TWO +2475 ; 2.0 # No PARENTHESIZED DIGIT TWO +2489 ; 2.0 # No DIGIT TWO FULL STOP +24F6 ; 2.0 # No DOUBLE CIRCLED DIGIT TWO +2777 ; 2.0 # No DINGBAT NEGATIVE CIRCLED DIGIT TWO +2781 ; 2.0 # No DINGBAT CIRCLED SANS-SERIF DIGIT TWO +278B ; 2.0 # No DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO +3022 ; 2.0 # Nl HANGZHOU NUMERAL TWO +3193 ; 2.0 # No IDEOGRAPHIC ANNOTATION TWO MARK +3221 ; 2.0 # No PARENTHESIZED IDEOGRAPH TWO +3281 ; 2.0 # No CIRCLED IDEOGRAPH TWO +4E8C ; 2.0 # Lo CJK UNIFIED IDEOGRAPH-4E8C +5169 ; 2.0 # Lo CJK UNIFIED IDEOGRAPH-5169 +5F0D ; 2.0 # Lo CJK UNIFIED IDEOGRAPH-5F0D +5F10 ; 2.0 # Lo CJK UNIFIED IDEOGRAPH-5F10 +8CAE ; 2.0 # Lo CJK UNIFIED IDEOGRAPH-8CAE +8D30 ; 2.0 # Lo CJK UNIFIED IDEOGRAPH-8D30 +FF12 ; 2.0 # Nd FULLWIDTH DIGIT TWO +10108 ; 2.0 # No AEGEAN NUMBER TWO +104A2 ; 2.0 # Nd OSMANYA DIGIT TWO +1D7D0 ; 2.0 # Nd MATHEMATICAL BOLD DIGIT TWO +1D7DA ; 2.0 # Nd MATHEMATICAL DOUBLE-STRUCK DIGIT TWO +1D7E4 ; 2.0 # Nd MATHEMATICAL SANS-SERIF DIGIT TWO +1D7EE ; 2.0 # Nd MATHEMATICAL SANS-SERIF BOLD DIGIT TWO +1D7F8 ; 2.0 # Nd MATHEMATICAL MONOSPACE DIGIT TWO # Total code points: 51 +# ================================================ -0F2C ; 2.5; numeric # No TIBETAN DIGIT HALF THREE - -# Total code points: 1 - - -0033 ; 3.0; decimal # Nd DIGIT THREE -00B3 ; 3.0; digit # No SUPERSCRIPT THREE -0663 ; 3.0; decimal # Nd ARABIC-INDIC DIGIT THREE -06F3 ; 3.0; decimal # Nd EXTENDED ARABIC-INDIC DIGIT THREE -0969 ; 3.0; decimal # Nd DEVANAGARI DIGIT THREE -09E9 ; 3.0; decimal # Nd BENGALI DIGIT THREE -09F6 ; 3.0; numeric # No BENGALI CURRENCY NUMERATOR THREE -0A69 ; 3.0; decimal # Nd GURMUKHI DIGIT THREE -0AE9 ; 3.0; decimal # Nd GUJARATI DIGIT THREE -0B69 ; 3.0; decimal # Nd ORIYA DIGIT THREE -0BE9 ; 3.0; decimal # Nd TAMIL DIGIT THREE -0C69 ; 3.0; decimal # Nd TELUGU DIGIT THREE -0CE9 ; 3.0; decimal # Nd KANNADA DIGIT THREE -0D69 ; 3.0; decimal # Nd MALAYALAM DIGIT THREE -0E53 ; 3.0; decimal # Nd THAI DIGIT THREE -0ED3 ; 3.0; decimal # Nd LAO DIGIT THREE -0F23 ; 3.0; decimal # Nd TIBETAN DIGIT THREE -1043 ; 3.0; decimal # Nd MYANMAR DIGIT THREE -136B ; 3.0; decimal # Nd ETHIOPIC DIGIT THREE -17E3 ; 3.0; decimal # Nd KHMER DIGIT THREE -17F3 ; 3.0; numeric # No KHMER SYMBOL LEK ATTAK BEI -1813 ; 3.0; decimal # Nd MONGOLIAN DIGIT THREE -1949 ; 3.0; decimal # Nd LIMBU DIGIT THREE -2083 ; 3.0; digit # No SUBSCRIPT THREE -2162 ; 3.0; numeric # Nl ROMAN NUMERAL THREE -2172 ; 3.0; numeric # Nl SMALL ROMAN NUMERAL THREE -2462 ; 3.0; digit # No CIRCLED DIGIT THREE -2476 ; 3.0; digit # No PARENTHESIZED DIGIT THREE -248A ; 3.0; digit # No DIGIT THREE FULL STOP -24F7 ; 3.0; digit # No DOUBLE CIRCLED DIGIT THREE -2778 ; 3.0; digit # No DINGBAT NEGATIVE CIRCLED DIGIT THREE -2782 ; 3.0; digit # No DINGBAT CIRCLED SANS-SERIF DIGIT THREE -278C ; 3.0; digit # No DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE -3023 ; 3.0; numeric # Nl HANGZHOU NUMERAL THREE -3194 ; 3.0; numeric # No IDEOGRAPHIC ANNOTATION THREE MARK -3222 ; 3.0; numeric # No PARENTHESIZED IDEOGRAPH THREE -3282 ; 3.0; numeric # No CIRCLED IDEOGRAPH THREE -4E09 ; 3.0; numeric # Lo CJK UNIFIED IDEOGRAPH-4E09 -53C1..53C3 ; 3.0; numeric # Lo [3] CJK UNIFIED IDEOGRAPH-53C1..CJK UNIFIED IDEOGRAPH-53C3 -5F0E ; 3.0; numeric # Lo CJK UNIFIED IDEOGRAPH-5F0E -FF13 ; 3.0; decimal # Nd FULLWIDTH DIGIT THREE -10109 ; 3.0; numeric # No AEGEAN NUMBER THREE -104A3 ; 3.0; decimal # Nd OSMANYA DIGIT THREE -1D7D1 ; 3.0; decimal # Nd MATHEMATICAL BOLD DIGIT THREE -1D7DB ; 3.0; decimal # Nd MATHEMATICAL DOUBLE-STRUCK DIGIT THREE -1D7E5 ; 3.0; decimal # Nd MATHEMATICAL SANS-SERIF DIGIT THREE -1D7EF ; 3.0; decimal # Nd MATHEMATICAL SANS-SERIF BOLD DIGIT THREE -1D7F9 ; 3.0; decimal # Nd MATHEMATICAL MONOSPACE DIGIT THREE +0F2C ; 2.5 # No TIBETAN DIGIT HALF THREE + +# Total code points: 1 + +# ================================================ + +0033 ; 3.0 # Nd DIGIT THREE +00B3 ; 3.0 # No SUPERSCRIPT THREE +0663 ; 3.0 # Nd ARABIC-INDIC DIGIT THREE +06F3 ; 3.0 # Nd EXTENDED ARABIC-INDIC DIGIT THREE +0969 ; 3.0 # Nd DEVANAGARI DIGIT THREE +09E9 ; 3.0 # Nd BENGALI DIGIT THREE +09F6 ; 3.0 # No BENGALI CURRENCY NUMERATOR THREE +0A69 ; 3.0 # Nd GURMUKHI DIGIT THREE +0AE9 ; 3.0 # Nd GUJARATI DIGIT THREE +0B69 ; 3.0 # Nd ORIYA DIGIT THREE +0BE9 ; 3.0 # Nd TAMIL DIGIT THREE +0C69 ; 3.0 # Nd TELUGU DIGIT THREE +0CE9 ; 3.0 # Nd KANNADA DIGIT THREE +0D69 ; 3.0 # Nd MALAYALAM DIGIT THREE +0E53 ; 3.0 # Nd THAI DIGIT THREE +0ED3 ; 3.0 # Nd LAO DIGIT THREE +0F23 ; 3.0 # Nd TIBETAN DIGIT THREE +1043 ; 3.0 # Nd MYANMAR DIGIT THREE +136B ; 3.0 # Nd ETHIOPIC DIGIT THREE +17E3 ; 3.0 # Nd KHMER DIGIT THREE +17F3 ; 3.0 # No KHMER SYMBOL LEK ATTAK BEI +1813 ; 3.0 # Nd MONGOLIAN DIGIT THREE +1949 ; 3.0 # Nd LIMBU DIGIT THREE +2083 ; 3.0 # No SUBSCRIPT THREE +2162 ; 3.0 # Nl ROMAN NUMERAL THREE +2172 ; 3.0 # Nl SMALL ROMAN NUMERAL THREE +2462 ; 3.0 # No CIRCLED DIGIT THREE +2476 ; 3.0 # No PARENTHESIZED DIGIT THREE +248A ; 3.0 # No DIGIT THREE FULL STOP +24F7 ; 3.0 # No DOUBLE CIRCLED DIGIT THREE +2778 ; 3.0 # No DINGBAT NEGATIVE CIRCLED DIGIT THREE +2782 ; 3.0 # No DINGBAT CIRCLED SANS-SERIF DIGIT THREE +278C ; 3.0 # No DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE +3023 ; 3.0 # Nl HANGZHOU NUMERAL THREE +3194 ; 3.0 # No IDEOGRAPHIC ANNOTATION THREE MARK +3222 ; 3.0 # No PARENTHESIZED IDEOGRAPH THREE +3282 ; 3.0 # No CIRCLED IDEOGRAPH THREE +4E09 ; 3.0 # Lo CJK UNIFIED IDEOGRAPH-4E09 +53C1..53C3 ; 3.0 # Lo [3] CJK UNIFIED IDEOGRAPH-53C1..CJK UNIFIED IDEOGRAPH-53C3 +5F0E ; 3.0 # Lo CJK UNIFIED IDEOGRAPH-5F0E +FF13 ; 3.0 # Nd FULLWIDTH DIGIT THREE +10109 ; 3.0 # No AEGEAN NUMBER THREE +104A3 ; 3.0 # Nd OSMANYA DIGIT THREE +1D7D1 ; 3.0 # Nd MATHEMATICAL BOLD DIGIT THREE +1D7DB ; 3.0 # Nd MATHEMATICAL DOUBLE-STRUCK DIGIT THREE +1D7E5 ; 3.0 # Nd MATHEMATICAL SANS-SERIF DIGIT THREE +1D7EF ; 3.0 # Nd MATHEMATICAL SANS-SERIF BOLD DIGIT THREE +1D7F9 ; 3.0 # Nd MATHEMATICAL MONOSPACE DIGIT THREE # Total code points: 50 +# ================================================ + +0F2D ; 3.5 # No TIBETAN DIGIT HALF FOUR -0F2D ; 3.5; numeric # No TIBETAN DIGIT HALF FOUR - -# Total code points: 1 - - -0034 ; 4.0; decimal # Nd DIGIT FOUR -0664 ; 4.0; decimal # Nd ARABIC-INDIC DIGIT FOUR -06F4 ; 4.0; decimal # Nd EXTENDED ARABIC-INDIC DIGIT FOUR -096A ; 4.0; decimal # Nd DEVANAGARI DIGIT FOUR -09EA ; 4.0; decimal # Nd BENGALI DIGIT FOUR -09F7 ; 4.0; numeric # No BENGALI CURRENCY NUMERATOR FOUR -0A6A ; 4.0; decimal # Nd GURMUKHI DIGIT FOUR -0AEA ; 4.0; decimal # Nd GUJARATI DIGIT FOUR -0B6A ; 4.0; decimal # Nd ORIYA DIGIT FOUR -0BEA ; 4.0; decimal # Nd TAMIL DIGIT FOUR -0C6A ; 4.0; decimal # Nd TELUGU DIGIT FOUR -0CEA ; 4.0; decimal # Nd KANNADA DIGIT FOUR -0D6A ; 4.0; decimal # Nd MALAYALAM DIGIT FOUR -0E54 ; 4.0; decimal # Nd THAI DIGIT FOUR -0ED4 ; 4.0; decimal # Nd LAO DIGIT FOUR -0F24 ; 4.0; decimal # Nd TIBETAN DIGIT FOUR -1044 ; 4.0; decimal # Nd MYANMAR DIGIT FOUR -136C ; 4.0; decimal # Nd ETHIOPIC DIGIT FOUR -17E4 ; 4.0; decimal # Nd KHMER DIGIT FOUR -17F4 ; 4.0; numeric # No KHMER SYMBOL LEK ATTAK BUON -1814 ; 4.0; decimal # Nd MONGOLIAN DIGIT FOUR -194A ; 4.0; decimal # Nd LIMBU DIGIT FOUR -2074 ; 4.0; digit # No SUPERSCRIPT FOUR -2084 ; 4.0; digit # No SUBSCRIPT FOUR -2163 ; 4.0; numeric # Nl ROMAN NUMERAL FOUR -2173 ; 4.0; numeric # Nl SMALL ROMAN NUMERAL FOUR -2463 ; 4.0; digit # No CIRCLED DIGIT FOUR -2477 ; 4.0; digit # No PARENTHESIZED DIGIT FOUR -248B ; 4.0; digit # No DIGIT FOUR FULL STOP -24F8 ; 4.0; digit # No DOUBLE CIRCLED DIGIT FOUR -2779 ; 4.0; digit # No DINGBAT NEGATIVE CIRCLED DIGIT FOUR -2783 ; 4.0; digit # No DINGBAT CIRCLED SANS-SERIF DIGIT FOUR -278D ; 4.0; digit # No DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR -3024 ; 4.0; numeric # Nl HANGZHOU NUMERAL FOUR -3195 ; 4.0; numeric # No IDEOGRAPHIC ANNOTATION FOUR MARK -3223 ; 4.0; numeric # No PARENTHESIZED IDEOGRAPH FOUR -3283 ; 4.0; numeric # No CIRCLED IDEOGRAPH FOUR -56DB ; 4.0; numeric # Lo CJK UNIFIED IDEOGRAPH-56DB -8086 ; 4.0; numeric # Lo CJK UNIFIED IDEOGRAPH-8086 -FF14 ; 4.0; decimal # Nd FULLWIDTH DIGIT FOUR -1010A ; 4.0; numeric # No AEGEAN NUMBER FOUR -104A4 ; 4.0; decimal # Nd OSMANYA DIGIT FOUR -1D7D2 ; 4.0; decimal # Nd MATHEMATICAL BOLD DIGIT FOUR -1D7DC ; 4.0; decimal # Nd MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR -1D7E6 ; 4.0; decimal # Nd MATHEMATICAL SANS-SERIF DIGIT FOUR -1D7F0 ; 4.0; decimal # Nd MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR -1D7FA ; 4.0; decimal # Nd MATHEMATICAL MONOSPACE DIGIT FOUR +# Total code points: 1 + +# ================================================ + +0034 ; 4.0 # Nd DIGIT FOUR +0664 ; 4.0 # Nd ARABIC-INDIC DIGIT FOUR +06F4 ; 4.0 # Nd EXTENDED ARABIC-INDIC DIGIT FOUR +096A ; 4.0 # Nd DEVANAGARI DIGIT FOUR +09EA ; 4.0 # Nd BENGALI DIGIT FOUR +09F7 ; 4.0 # No BENGALI CURRENCY NUMERATOR FOUR +0A6A ; 4.0 # Nd GURMUKHI DIGIT FOUR +0AEA ; 4.0 # Nd GUJARATI DIGIT FOUR +0B6A ; 4.0 # Nd ORIYA DIGIT FOUR +0BEA ; 4.0 # Nd TAMIL DIGIT FOUR +0C6A ; 4.0 # Nd TELUGU DIGIT FOUR +0CEA ; 4.0 # Nd KANNADA DIGIT FOUR +0D6A ; 4.0 # Nd MALAYALAM DIGIT FOUR +0E54 ; 4.0 # Nd THAI DIGIT FOUR +0ED4 ; 4.0 # Nd LAO DIGIT FOUR +0F24 ; 4.0 # Nd TIBETAN DIGIT FOUR +1044 ; 4.0 # Nd MYANMAR DIGIT FOUR +136C ; 4.0 # Nd ETHIOPIC DIGIT FOUR +17E4 ; 4.0 # Nd KHMER DIGIT FOUR +17F4 ; 4.0 # No KHMER SYMBOL LEK ATTAK BUON +1814 ; 4.0 # Nd MONGOLIAN DIGIT FOUR +194A ; 4.0 # Nd LIMBU DIGIT FOUR +2074 ; 4.0 # No SUPERSCRIPT FOUR +2084 ; 4.0 # No SUBSCRIPT FOUR +2163 ; 4.0 # Nl ROMAN NUMERAL FOUR +2173 ; 4.0 # Nl SMALL ROMAN NUMERAL FOUR +2463 ; 4.0 # No CIRCLED DIGIT FOUR +2477 ; 4.0 # No PARENTHESIZED DIGIT FOUR +248B ; 4.0 # No DIGIT FOUR FULL STOP +24F8 ; 4.0 # No DOUBLE CIRCLED DIGIT FOUR +2779 ; 4.0 # No DINGBAT NEGATIVE CIRCLED DIGIT FOUR +2783 ; 4.0 # No DINGBAT CIRCLED SANS-SERIF DIGIT FOUR +278D ; 4.0 # No DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR +3024 ; 4.0 # Nl HANGZHOU NUMERAL FOUR +3195 ; 4.0 # No IDEOGRAPHIC ANNOTATION FOUR MARK +3223 ; 4.0 # No PARENTHESIZED IDEOGRAPH FOUR +3283 ; 4.0 # No CIRCLED IDEOGRAPH FOUR +56DB ; 4.0 # Lo CJK UNIFIED IDEOGRAPH-56DB +8086 ; 4.0 # Lo CJK UNIFIED IDEOGRAPH-8086 +FF14 ; 4.0 # Nd FULLWIDTH DIGIT FOUR +1010A ; 4.0 # No AEGEAN NUMBER FOUR +104A4 ; 4.0 # Nd OSMANYA DIGIT FOUR +1D7D2 ; 4.0 # Nd MATHEMATICAL BOLD DIGIT FOUR +1D7DC ; 4.0 # Nd MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR +1D7E6 ; 4.0 # Nd MATHEMATICAL SANS-SERIF DIGIT FOUR +1D7F0 ; 4.0 # Nd MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR +1D7FA ; 4.0 # Nd MATHEMATICAL MONOSPACE DIGIT FOUR # Total code points: 47 +# ================================================ + +0F2E ; 4.5 # No TIBETAN DIGIT HALF FIVE + +# Total code points: 1 + +# ================================================ -0F2E ; 4.5; numeric # No TIBETAN DIGIT HALF FIVE - -# Total code points: 1 - - -0035 ; 5.0; decimal # Nd DIGIT FIVE -0665 ; 5.0; decimal # Nd ARABIC-INDIC DIGIT FIVE -06F5 ; 5.0; decimal # Nd EXTENDED ARABIC-INDIC DIGIT FIVE -096B ; 5.0; decimal # Nd DEVANAGARI DIGIT FIVE -09EB ; 5.0; decimal # Nd BENGALI DIGIT FIVE -0A6B ; 5.0; decimal # Nd GURMUKHI DIGIT FIVE -0AEB ; 5.0; decimal # Nd GUJARATI DIGIT FIVE -0B6B ; 5.0; decimal # Nd ORIYA DIGIT FIVE -0BEB ; 5.0; decimal # Nd TAMIL DIGIT FIVE -0C6B ; 5.0; decimal # Nd TELUGU DIGIT FIVE -0CEB ; 5.0; decimal # Nd KANNADA DIGIT FIVE -0D6B ; 5.0; decimal # Nd MALAYALAM DIGIT FIVE -0E55 ; 5.0; decimal # Nd THAI DIGIT FIVE -0ED5 ; 5.0; decimal # Nd LAO DIGIT FIVE -0F25 ; 5.0; decimal # Nd TIBETAN DIGIT FIVE -1045 ; 5.0; decimal # Nd MYANMAR DIGIT FIVE -136D ; 5.0; decimal # Nd ETHIOPIC DIGIT FIVE -17E5 ; 5.0; decimal # Nd KHMER DIGIT FIVE -17F5 ; 5.0; numeric # No KHMER SYMBOL LEK ATTAK PRAM -1815 ; 5.0; decimal # Nd MONGOLIAN DIGIT FIVE -194B ; 5.0; decimal # Nd LIMBU DIGIT FIVE -2075 ; 5.0; digit # No SUPERSCRIPT FIVE -2085 ; 5.0; digit # No SUBSCRIPT FIVE -2164 ; 5.0; numeric # Nl ROMAN NUMERAL FIVE -2174 ; 5.0; numeric # Nl SMALL ROMAN NUMERAL FIVE -2464 ; 5.0; digit # No CIRCLED DIGIT FIVE -2478 ; 5.0; digit # No PARENTHESIZED DIGIT FIVE -248C ; 5.0; digit # No DIGIT FIVE FULL STOP -24F9 ; 5.0; digit # No DOUBLE CIRCLED DIGIT FIVE -277A ; 5.0; digit # No DINGBAT NEGATIVE CIRCLED DIGIT FIVE -2784 ; 5.0; digit # No DINGBAT CIRCLED SANS-SERIF DIGIT FIVE -278E ; 5.0; digit # No DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE -3025 ; 5.0; numeric # Nl HANGZHOU NUMERAL FIVE -3224 ; 5.0; numeric # No PARENTHESIZED IDEOGRAPH FIVE -3284 ; 5.0; numeric # No CIRCLED IDEOGRAPH FIVE -4E94 ; 5.0; numeric # Lo CJK UNIFIED IDEOGRAPH-4E94 -4F0D ; 5.0; numeric # Lo CJK UNIFIED IDEOGRAPH-4F0D -FF15 ; 5.0; decimal # Nd FULLWIDTH DIGIT FIVE -1010B ; 5.0; numeric # No AEGEAN NUMBER FIVE -10321 ; 5.0; numeric # No OLD ITALIC NUMERAL FIVE -104A5 ; 5.0; decimal # Nd OSMANYA DIGIT FIVE -1D7D3 ; 5.0; decimal # Nd MATHEMATICAL BOLD DIGIT FIVE -1D7DD ; 5.0; decimal # Nd MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE -1D7E7 ; 5.0; decimal # Nd MATHEMATICAL SANS-SERIF DIGIT FIVE -1D7F1 ; 5.0; decimal # Nd MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE -1D7FB ; 5.0; decimal # Nd MATHEMATICAL MONOSPACE DIGIT FIVE +0035 ; 5.0 # Nd DIGIT FIVE +0665 ; 5.0 # Nd ARABIC-INDIC DIGIT FIVE +06F5 ; 5.0 # Nd EXTENDED ARABIC-INDIC DIGIT FIVE +096B ; 5.0 # Nd DEVANAGARI DIGIT FIVE +09EB ; 5.0 # Nd BENGALI DIGIT FIVE +0A6B ; 5.0 # Nd GURMUKHI DIGIT FIVE +0AEB ; 5.0 # Nd GUJARATI DIGIT FIVE +0B6B ; 5.0 # Nd ORIYA DIGIT FIVE +0BEB ; 5.0 # Nd TAMIL DIGIT FIVE +0C6B ; 5.0 # Nd TELUGU DIGIT FIVE +0CEB ; 5.0 # Nd KANNADA DIGIT FIVE +0D6B ; 5.0 # Nd MALAYALAM DIGIT FIVE +0E55 ; 5.0 # Nd THAI DIGIT FIVE +0ED5 ; 5.0 # Nd LAO DIGIT FIVE +0F25 ; 5.0 # Nd TIBETAN DIGIT FIVE +1045 ; 5.0 # Nd MYANMAR DIGIT FIVE +136D ; 5.0 # Nd ETHIOPIC DIGIT FIVE +17E5 ; 5.0 # Nd KHMER DIGIT FIVE +17F5 ; 5.0 # No KHMER SYMBOL LEK ATTAK PRAM +1815 ; 5.0 # Nd MONGOLIAN DIGIT FIVE +194B ; 5.0 # Nd LIMBU DIGIT FIVE +2075 ; 5.0 # No SUPERSCRIPT FIVE +2085 ; 5.0 # No SUBSCRIPT FIVE +2164 ; 5.0 # Nl ROMAN NUMERAL FIVE +2174 ; 5.0 # Nl SMALL ROMAN NUMERAL FIVE +2464 ; 5.0 # No CIRCLED DIGIT FIVE +2478 ; 5.0 # No PARENTHESIZED DIGIT FIVE +248C ; 5.0 # No DIGIT FIVE FULL STOP +24F9 ; 5.0 # No DOUBLE CIRCLED DIGIT FIVE +277A ; 5.0 # No DINGBAT NEGATIVE CIRCLED DIGIT FIVE +2784 ; 5.0 # No DINGBAT CIRCLED SANS-SERIF DIGIT FIVE +278E ; 5.0 # No DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE +3025 ; 5.0 # Nl HANGZHOU NUMERAL FIVE +3224 ; 5.0 # No PARENTHESIZED IDEOGRAPH FIVE +3284 ; 5.0 # No CIRCLED IDEOGRAPH FIVE +4E94 ; 5.0 # Lo CJK UNIFIED IDEOGRAPH-4E94 +4F0D ; 5.0 # Lo CJK UNIFIED IDEOGRAPH-4F0D +FF15 ; 5.0 # Nd FULLWIDTH DIGIT FIVE +1010B ; 5.0 # No AEGEAN NUMBER FIVE +10321 ; 5.0 # No OLD ITALIC NUMERAL FIVE +104A5 ; 5.0 # Nd OSMANYA DIGIT FIVE +1D7D3 ; 5.0 # Nd MATHEMATICAL BOLD DIGIT FIVE +1D7DD ; 5.0 # Nd MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE +1D7E7 ; 5.0 # Nd MATHEMATICAL SANS-SERIF DIGIT FIVE +1D7F1 ; 5.0 # Nd MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE +1D7FB ; 5.0 # Nd MATHEMATICAL MONOSPACE DIGIT FIVE # Total code points: 46 +# ================================================ + +0F2F ; 5.5 # No TIBETAN DIGIT HALF SIX -0F2F ; 5.5; numeric # No TIBETAN DIGIT HALF SIX - -# Total code points: 1 - - -0036 ; 6.0; decimal # Nd DIGIT SIX -0666 ; 6.0; decimal # Nd ARABIC-INDIC DIGIT SIX -06F6 ; 6.0; decimal # Nd EXTENDED ARABIC-INDIC DIGIT SIX -096C ; 6.0; decimal # Nd DEVANAGARI DIGIT SIX -09EC ; 6.0; decimal # Nd BENGALI DIGIT SIX -0A6C ; 6.0; decimal # Nd GURMUKHI DIGIT SIX -0AEC ; 6.0; decimal # Nd GUJARATI DIGIT SIX -0B6C ; 6.0; decimal # Nd ORIYA DIGIT SIX -0BEC ; 6.0; decimal # Nd TAMIL DIGIT SIX -0C6C ; 6.0; decimal # Nd TELUGU DIGIT SIX -0CEC ; 6.0; decimal # Nd KANNADA DIGIT SIX -0D6C ; 6.0; decimal # Nd MALAYALAM DIGIT SIX -0E56 ; 6.0; decimal # Nd THAI DIGIT SIX -0ED6 ; 6.0; decimal # Nd LAO DIGIT SIX -0F26 ; 6.0; decimal # Nd TIBETAN DIGIT SIX -1046 ; 6.0; decimal # Nd MYANMAR DIGIT SIX -136E ; 6.0; decimal # Nd ETHIOPIC DIGIT SIX -17E6 ; 6.0; decimal # Nd KHMER DIGIT SIX -17F6 ; 6.0; numeric # No KHMER SYMBOL LEK ATTAK PRAM-MUOY -1816 ; 6.0; decimal # Nd MONGOLIAN DIGIT SIX -194C ; 6.0; decimal # Nd LIMBU DIGIT SIX -2076 ; 6.0; digit # No SUPERSCRIPT SIX -2086 ; 6.0; digit # No SUBSCRIPT SIX -2165 ; 6.0; numeric # Nl ROMAN NUMERAL SIX -2175 ; 6.0; numeric # Nl SMALL ROMAN NUMERAL SIX -2465 ; 6.0; digit # No CIRCLED DIGIT SIX -2479 ; 6.0; digit # No PARENTHESIZED DIGIT SIX -248D ; 6.0; digit # No DIGIT SIX FULL STOP -24FA ; 6.0; digit # No DOUBLE CIRCLED DIGIT SIX -277B ; 6.0; digit # No DINGBAT NEGATIVE CIRCLED DIGIT SIX -2785 ; 6.0; digit # No DINGBAT CIRCLED SANS-SERIF DIGIT SIX -278F ; 6.0; digit # No DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX -3026 ; 6.0; numeric # Nl HANGZHOU NUMERAL SIX -3225 ; 6.0; numeric # No PARENTHESIZED IDEOGRAPH SIX -3285 ; 6.0; numeric # No CIRCLED IDEOGRAPH SIX -516D ; 6.0; numeric # Lo CJK UNIFIED IDEOGRAPH-516D -9646 ; 6.0; numeric # Lo CJK UNIFIED IDEOGRAPH-9646 -9678 ; 6.0; numeric # Lo CJK UNIFIED IDEOGRAPH-9678 -FF16 ; 6.0; decimal # Nd FULLWIDTH DIGIT SIX -1010C ; 6.0; numeric # No AEGEAN NUMBER SIX -104A6 ; 6.0; decimal # Nd OSMANYA DIGIT SIX -1D7D4 ; 6.0; decimal # Nd MATHEMATICAL BOLD DIGIT SIX -1D7DE ; 6.0; decimal # Nd MATHEMATICAL DOUBLE-STRUCK DIGIT SIX -1D7E8 ; 6.0; decimal # Nd MATHEMATICAL SANS-SERIF DIGIT SIX -1D7F2 ; 6.0; decimal # Nd MATHEMATICAL SANS-SERIF BOLD DIGIT SIX -1D7FC ; 6.0; decimal # Nd MATHEMATICAL MONOSPACE DIGIT SIX +# Total code points: 1 + +# ================================================ + +0036 ; 6.0 # Nd DIGIT SIX +0666 ; 6.0 # Nd ARABIC-INDIC DIGIT SIX +06F6 ; 6.0 # Nd EXTENDED ARABIC-INDIC DIGIT SIX +096C ; 6.0 # Nd DEVANAGARI DIGIT SIX +09EC ; 6.0 # Nd BENGALI DIGIT SIX +0A6C ; 6.0 # Nd GURMUKHI DIGIT SIX +0AEC ; 6.0 # Nd GUJARATI DIGIT SIX +0B6C ; 6.0 # Nd ORIYA DIGIT SIX +0BEC ; 6.0 # Nd TAMIL DIGIT SIX +0C6C ; 6.0 # Nd TELUGU DIGIT SIX +0CEC ; 6.0 # Nd KANNADA DIGIT SIX +0D6C ; 6.0 # Nd MALAYALAM DIGIT SIX +0E56 ; 6.0 # Nd THAI DIGIT SIX +0ED6 ; 6.0 # Nd LAO DIGIT SIX +0F26 ; 6.0 # Nd TIBETAN DIGIT SIX +1046 ; 6.0 # Nd MYANMAR DIGIT SIX +136E ; 6.0 # Nd ETHIOPIC DIGIT SIX +17E6 ; 6.0 # Nd KHMER DIGIT SIX +17F6 ; 6.0 # No KHMER SYMBOL LEK ATTAK PRAM-MUOY +1816 ; 6.0 # Nd MONGOLIAN DIGIT SIX +194C ; 6.0 # Nd LIMBU DIGIT SIX +2076 ; 6.0 # No SUPERSCRIPT SIX +2086 ; 6.0 # No SUBSCRIPT SIX +2165 ; 6.0 # Nl ROMAN NUMERAL SIX +2175 ; 6.0 # Nl SMALL ROMAN NUMERAL SIX +2465 ; 6.0 # No CIRCLED DIGIT SIX +2479 ; 6.0 # No PARENTHESIZED DIGIT SIX +248D ; 6.0 # No DIGIT SIX FULL STOP +24FA ; 6.0 # No DOUBLE CIRCLED DIGIT SIX +277B ; 6.0 # No DINGBAT NEGATIVE CIRCLED DIGIT SIX +2785 ; 6.0 # No DINGBAT CIRCLED SANS-SERIF DIGIT SIX +278F ; 6.0 # No DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX +3026 ; 6.0 # Nl HANGZHOU NUMERAL SIX +3225 ; 6.0 # No PARENTHESIZED IDEOGRAPH SIX +3285 ; 6.0 # No CIRCLED IDEOGRAPH SIX +516D ; 6.0 # Lo CJK UNIFIED IDEOGRAPH-516D +9646 ; 6.0 # Lo CJK UNIFIED IDEOGRAPH-9646 +9678 ; 6.0 # Lo CJK UNIFIED IDEOGRAPH-9678 +FF16 ; 6.0 # Nd FULLWIDTH DIGIT SIX +1010C ; 6.0 # No AEGEAN NUMBER SIX +104A6 ; 6.0 # Nd OSMANYA DIGIT SIX +1D7D4 ; 6.0 # Nd MATHEMATICAL BOLD DIGIT SIX +1D7DE ; 6.0 # Nd MATHEMATICAL DOUBLE-STRUCK DIGIT SIX +1D7E8 ; 6.0 # Nd MATHEMATICAL SANS-SERIF DIGIT SIX +1D7F2 ; 6.0 # Nd MATHEMATICAL SANS-SERIF BOLD DIGIT SIX +1D7FC ; 6.0 # Nd MATHEMATICAL MONOSPACE DIGIT SIX # Total code points: 46 +# ================================================ + +0F30 ; 6.5 # No TIBETAN DIGIT HALF SEVEN -0F30 ; 6.5; numeric # No TIBETAN DIGIT HALF SEVEN - -# Total code points: 1 - - -0037 ; 7.0; decimal # Nd DIGIT SEVEN -0667 ; 7.0; decimal # Nd ARABIC-INDIC DIGIT SEVEN -06F7 ; 7.0; decimal # Nd EXTENDED ARABIC-INDIC DIGIT SEVEN -096D ; 7.0; decimal # Nd DEVANAGARI DIGIT SEVEN -09ED ; 7.0; decimal # Nd BENGALI DIGIT SEVEN -0A6D ; 7.0; decimal # Nd GURMUKHI DIGIT SEVEN -0AED ; 7.0; decimal # Nd GUJARATI DIGIT SEVEN -0B6D ; 7.0; decimal # Nd ORIYA DIGIT SEVEN -0BED ; 7.0; decimal # Nd TAMIL DIGIT SEVEN -0C6D ; 7.0; decimal # Nd TELUGU DIGIT SEVEN -0CED ; 7.0; decimal # Nd KANNADA DIGIT SEVEN -0D6D ; 7.0; decimal # Nd MALAYALAM DIGIT SEVEN -0E57 ; 7.0; decimal # Nd THAI DIGIT SEVEN -0ED7 ; 7.0; decimal # Nd LAO DIGIT SEVEN -0F27 ; 7.0; decimal # Nd TIBETAN DIGIT SEVEN -1047 ; 7.0; decimal # Nd MYANMAR DIGIT SEVEN -136F ; 7.0; decimal # Nd ETHIOPIC DIGIT SEVEN -17E7 ; 7.0; decimal # Nd KHMER DIGIT SEVEN -17F7 ; 7.0; numeric # No KHMER SYMBOL LEK ATTAK PRAM-PII -1817 ; 7.0; decimal # Nd MONGOLIAN DIGIT SEVEN -194D ; 7.0; decimal # Nd LIMBU DIGIT SEVEN -2077 ; 7.0; digit # No SUPERSCRIPT SEVEN -2087 ; 7.0; digit # No SUBSCRIPT SEVEN -2166 ; 7.0; numeric # Nl ROMAN NUMERAL SEVEN -2176 ; 7.0; numeric # Nl SMALL ROMAN NUMERAL SEVEN -2466 ; 7.0; digit # No CIRCLED DIGIT SEVEN -247A ; 7.0; digit # No PARENTHESIZED DIGIT SEVEN -248E ; 7.0; digit # No DIGIT SEVEN FULL STOP -24FB ; 7.0; digit # No DOUBLE CIRCLED DIGIT SEVEN -277C ; 7.0; digit # No DINGBAT NEGATIVE CIRCLED DIGIT SEVEN -2786 ; 7.0; digit # No DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN -2790 ; 7.0; digit # No DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN -3027 ; 7.0; numeric # Nl HANGZHOU NUMERAL SEVEN -3226 ; 7.0; numeric # No PARENTHESIZED IDEOGRAPH SEVEN -3286 ; 7.0; numeric # No CIRCLED IDEOGRAPH SEVEN -4E03 ; 7.0; numeric # Lo CJK UNIFIED IDEOGRAPH-4E03 -67D2 ; 7.0; numeric # Lo CJK UNIFIED IDEOGRAPH-67D2 -FF17 ; 7.0; decimal # Nd FULLWIDTH DIGIT SEVEN -1010D ; 7.0; numeric # No AEGEAN NUMBER SEVEN -104A7 ; 7.0; decimal # Nd OSMANYA DIGIT SEVEN -1D7D5 ; 7.0; decimal # Nd MATHEMATICAL BOLD DIGIT SEVEN -1D7DF ; 7.0; decimal # Nd MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN -1D7E9 ; 7.0; decimal # Nd MATHEMATICAL SANS-SERIF DIGIT SEVEN -1D7F3 ; 7.0; decimal # Nd MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN -1D7FD ; 7.0; decimal # Nd MATHEMATICAL MONOSPACE DIGIT SEVEN +# Total code points: 1 + +# ================================================ + +0037 ; 7.0 # Nd DIGIT SEVEN +0667 ; 7.0 # Nd ARABIC-INDIC DIGIT SEVEN +06F7 ; 7.0 # Nd EXTENDED ARABIC-INDIC DIGIT SEVEN +096D ; 7.0 # Nd DEVANAGARI DIGIT SEVEN +09ED ; 7.0 # Nd BENGALI DIGIT SEVEN +0A6D ; 7.0 # Nd GURMUKHI DIGIT SEVEN +0AED ; 7.0 # Nd GUJARATI DIGIT SEVEN +0B6D ; 7.0 # Nd ORIYA DIGIT SEVEN +0BED ; 7.0 # Nd TAMIL DIGIT SEVEN +0C6D ; 7.0 # Nd TELUGU DIGIT SEVEN +0CED ; 7.0 # Nd KANNADA DIGIT SEVEN +0D6D ; 7.0 # Nd MALAYALAM DIGIT SEVEN +0E57 ; 7.0 # Nd THAI DIGIT SEVEN +0ED7 ; 7.0 # Nd LAO DIGIT SEVEN +0F27 ; 7.0 # Nd TIBETAN DIGIT SEVEN +1047 ; 7.0 # Nd MYANMAR DIGIT SEVEN +136F ; 7.0 # Nd ETHIOPIC DIGIT SEVEN +17E7 ; 7.0 # Nd KHMER DIGIT SEVEN +17F7 ; 7.0 # No KHMER SYMBOL LEK ATTAK PRAM-PII +1817 ; 7.0 # Nd MONGOLIAN DIGIT SEVEN +194D ; 7.0 # Nd LIMBU DIGIT SEVEN +2077 ; 7.0 # No SUPERSCRIPT SEVEN +2087 ; 7.0 # No SUBSCRIPT SEVEN +2166 ; 7.0 # Nl ROMAN NUMERAL SEVEN +2176 ; 7.0 # Nl SMALL ROMAN NUMERAL SEVEN +2466 ; 7.0 # No CIRCLED DIGIT SEVEN +247A ; 7.0 # No PARENTHESIZED DIGIT SEVEN +248E ; 7.0 # No DIGIT SEVEN FULL STOP +24FB ; 7.0 # No DOUBLE CIRCLED DIGIT SEVEN +277C ; 7.0 # No DINGBAT NEGATIVE CIRCLED DIGIT SEVEN +2786 ; 7.0 # No DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN +2790 ; 7.0 # No DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN +3027 ; 7.0 # Nl HANGZHOU NUMERAL SEVEN +3226 ; 7.0 # No PARENTHESIZED IDEOGRAPH SEVEN +3286 ; 7.0 # No CIRCLED IDEOGRAPH SEVEN +4E03 ; 7.0 # Lo CJK UNIFIED IDEOGRAPH-4E03 +67D2 ; 7.0 # Lo CJK UNIFIED IDEOGRAPH-67D2 +FF17 ; 7.0 # Nd FULLWIDTH DIGIT SEVEN +1010D ; 7.0 # No AEGEAN NUMBER SEVEN +104A7 ; 7.0 # Nd OSMANYA DIGIT SEVEN +1D7D5 ; 7.0 # Nd MATHEMATICAL BOLD DIGIT SEVEN +1D7DF ; 7.0 # Nd MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN +1D7E9 ; 7.0 # Nd MATHEMATICAL SANS-SERIF DIGIT SEVEN +1D7F3 ; 7.0 # Nd MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN +1D7FD ; 7.0 # Nd MATHEMATICAL MONOSPACE DIGIT SEVEN # Total code points: 45 +# ================================================ + +0F31 ; 7.5 # No TIBETAN DIGIT HALF EIGHT + +# Total code points: 1 + +# ================================================ -0F31 ; 7.5; numeric # No TIBETAN DIGIT HALF EIGHT - -# Total code points: 1 - - -0038 ; 8.0; decimal # Nd DIGIT EIGHT -0668 ; 8.0; decimal # Nd ARABIC-INDIC DIGIT EIGHT -06F8 ; 8.0; decimal # Nd EXTENDED ARABIC-INDIC DIGIT EIGHT -096E ; 8.0; decimal # Nd DEVANAGARI DIGIT EIGHT -09EE ; 8.0; decimal # Nd BENGALI DIGIT EIGHT -0A6E ; 8.0; decimal # Nd GURMUKHI DIGIT EIGHT -0AEE ; 8.0; decimal # Nd GUJARATI DIGIT EIGHT -0B6E ; 8.0; decimal # Nd ORIYA DIGIT EIGHT -0BEE ; 8.0; decimal # Nd TAMIL DIGIT EIGHT -0C6E ; 8.0; decimal # Nd TELUGU DIGIT EIGHT -0CEE ; 8.0; decimal # Nd KANNADA DIGIT EIGHT -0D6E ; 8.0; decimal # Nd MALAYALAM DIGIT EIGHT -0E58 ; 8.0; decimal # Nd THAI DIGIT EIGHT -0ED8 ; 8.0; decimal # Nd LAO DIGIT EIGHT -0F28 ; 8.0; decimal # Nd TIBETAN DIGIT EIGHT -1048 ; 8.0; decimal # Nd MYANMAR DIGIT EIGHT -1370 ; 8.0; decimal # Nd ETHIOPIC DIGIT EIGHT -17E8 ; 8.0; decimal # Nd KHMER DIGIT EIGHT -17F8 ; 8.0; numeric # No KHMER SYMBOL LEK ATTAK PRAM-BEI -1818 ; 8.0; decimal # Nd MONGOLIAN DIGIT EIGHT -194E ; 8.0; decimal # Nd LIMBU DIGIT EIGHT -2078 ; 8.0; digit # No SUPERSCRIPT EIGHT -2088 ; 8.0; digit # No SUBSCRIPT EIGHT -2167 ; 8.0; numeric # Nl ROMAN NUMERAL EIGHT -2177 ; 8.0; numeric # Nl SMALL ROMAN NUMERAL EIGHT -2467 ; 8.0; digit # No CIRCLED DIGIT EIGHT -247B ; 8.0; digit # No PARENTHESIZED DIGIT EIGHT -248F ; 8.0; digit # No DIGIT EIGHT FULL STOP -24FC ; 8.0; digit # No DOUBLE CIRCLED DIGIT EIGHT -277D ; 8.0; digit # No DINGBAT NEGATIVE CIRCLED DIGIT EIGHT -2787 ; 8.0; digit # No DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT -2791 ; 8.0; digit # No DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT -3028 ; 8.0; numeric # Nl HANGZHOU NUMERAL EIGHT -3227 ; 8.0; numeric # No PARENTHESIZED IDEOGRAPH EIGHT -3287 ; 8.0; numeric # No CIRCLED IDEOGRAPH EIGHT -516B ; 8.0; numeric # Lo CJK UNIFIED IDEOGRAPH-516B -634C ; 8.0; numeric # Lo CJK UNIFIED IDEOGRAPH-634C -FF18 ; 8.0; decimal # Nd FULLWIDTH DIGIT EIGHT -1010E ; 8.0; numeric # No AEGEAN NUMBER EIGHT -104A8 ; 8.0; decimal # Nd OSMANYA DIGIT EIGHT -1D7D6 ; 8.0; decimal # Nd MATHEMATICAL BOLD DIGIT EIGHT -1D7E0 ; 8.0; decimal # Nd MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT -1D7EA ; 8.0; decimal # Nd MATHEMATICAL SANS-SERIF DIGIT EIGHT -1D7F4 ; 8.0; decimal # Nd MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT -1D7FE ; 8.0; decimal # Nd MATHEMATICAL MONOSPACE DIGIT EIGHT +0038 ; 8.0 # Nd DIGIT EIGHT +0668 ; 8.0 # Nd ARABIC-INDIC DIGIT EIGHT +06F8 ; 8.0 # Nd EXTENDED ARABIC-INDIC DIGIT EIGHT +096E ; 8.0 # Nd DEVANAGARI DIGIT EIGHT +09EE ; 8.0 # Nd BENGALI DIGIT EIGHT +0A6E ; 8.0 # Nd GURMUKHI DIGIT EIGHT +0AEE ; 8.0 # Nd GUJARATI DIGIT EIGHT +0B6E ; 8.0 # Nd ORIYA DIGIT EIGHT +0BEE ; 8.0 # Nd TAMIL DIGIT EIGHT +0C6E ; 8.0 # Nd TELUGU DIGIT EIGHT +0CEE ; 8.0 # Nd KANNADA DIGIT EIGHT +0D6E ; 8.0 # Nd MALAYALAM DIGIT EIGHT +0E58 ; 8.0 # Nd THAI DIGIT EIGHT +0ED8 ; 8.0 # Nd LAO DIGIT EIGHT +0F28 ; 8.0 # Nd TIBETAN DIGIT EIGHT +1048 ; 8.0 # Nd MYANMAR DIGIT EIGHT +1370 ; 8.0 # Nd ETHIOPIC DIGIT EIGHT +17E8 ; 8.0 # Nd KHMER DIGIT EIGHT +17F8 ; 8.0 # No KHMER SYMBOL LEK ATTAK PRAM-BEI +1818 ; 8.0 # Nd MONGOLIAN DIGIT EIGHT +194E ; 8.0 # Nd LIMBU DIGIT EIGHT +2078 ; 8.0 # No SUPERSCRIPT EIGHT +2088 ; 8.0 # No SUBSCRIPT EIGHT +2167 ; 8.0 # Nl ROMAN NUMERAL EIGHT +2177 ; 8.0 # Nl SMALL ROMAN NUMERAL EIGHT +2467 ; 8.0 # No CIRCLED DIGIT EIGHT +247B ; 8.0 # No PARENTHESIZED DIGIT EIGHT +248F ; 8.0 # No DIGIT EIGHT FULL STOP +24FC ; 8.0 # No DOUBLE CIRCLED DIGIT EIGHT +277D ; 8.0 # No DINGBAT NEGATIVE CIRCLED DIGIT EIGHT +2787 ; 8.0 # No DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT +2791 ; 8.0 # No DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT +3028 ; 8.0 # Nl HANGZHOU NUMERAL EIGHT +3227 ; 8.0 # No PARENTHESIZED IDEOGRAPH EIGHT +3287 ; 8.0 # No CIRCLED IDEOGRAPH EIGHT +516B ; 8.0 # Lo CJK UNIFIED IDEOGRAPH-516B +634C ; 8.0 # Lo CJK UNIFIED IDEOGRAPH-634C +FF18 ; 8.0 # Nd FULLWIDTH DIGIT EIGHT +1010E ; 8.0 # No AEGEAN NUMBER EIGHT +104A8 ; 8.0 # Nd OSMANYA DIGIT EIGHT +1D7D6 ; 8.0 # Nd MATHEMATICAL BOLD DIGIT EIGHT +1D7E0 ; 8.0 # Nd MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT +1D7EA ; 8.0 # Nd MATHEMATICAL SANS-SERIF DIGIT EIGHT +1D7F4 ; 8.0 # Nd MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT +1D7FE ; 8.0 # Nd MATHEMATICAL MONOSPACE DIGIT EIGHT # Total code points: 45 +# ================================================ + +0F32 ; 8.5 # No TIBETAN DIGIT HALF NINE -0F32 ; 8.5; numeric # No TIBETAN DIGIT HALF NINE - -# Total code points: 1 - - -0039 ; 9.0; decimal # Nd DIGIT NINE -0669 ; 9.0; decimal # Nd ARABIC-INDIC DIGIT NINE -06F9 ; 9.0; decimal # Nd EXTENDED ARABIC-INDIC DIGIT NINE -096F ; 9.0; decimal # Nd DEVANAGARI DIGIT NINE -09EF ; 9.0; decimal # Nd BENGALI DIGIT NINE -0A6F ; 9.0; decimal # Nd GURMUKHI DIGIT NINE -0AEF ; 9.0; decimal # Nd GUJARATI DIGIT NINE -0B6F ; 9.0; decimal # Nd ORIYA DIGIT NINE -0BEF ; 9.0; decimal # Nd TAMIL DIGIT NINE -0C6F ; 9.0; decimal # Nd TELUGU DIGIT NINE -0CEF ; 9.0; decimal # Nd KANNADA DIGIT NINE -0D6F ; 9.0; decimal # Nd MALAYALAM DIGIT NINE -0E59 ; 9.0; decimal # Nd THAI DIGIT NINE -0ED9 ; 9.0; decimal # Nd LAO DIGIT NINE -0F29 ; 9.0; decimal # Nd TIBETAN DIGIT NINE -1049 ; 9.0; decimal # Nd MYANMAR DIGIT NINE -1371 ; 9.0; decimal # Nd ETHIOPIC DIGIT NINE -17E9 ; 9.0; decimal # Nd KHMER DIGIT NINE -17F9 ; 9.0; numeric # No KHMER SYMBOL LEK ATTAK PRAM-BUON -1819 ; 9.0; decimal # Nd MONGOLIAN DIGIT NINE -194F ; 9.0; decimal # Nd LIMBU DIGIT NINE -2079 ; 9.0; digit # No SUPERSCRIPT NINE -2089 ; 9.0; digit # No SUBSCRIPT NINE -2168 ; 9.0; numeric # Nl ROMAN NUMERAL NINE -2178 ; 9.0; numeric # Nl SMALL ROMAN NUMERAL NINE -2468 ; 9.0; digit # No CIRCLED DIGIT NINE -247C ; 9.0; digit # No PARENTHESIZED DIGIT NINE -2490 ; 9.0; digit # No DIGIT NINE FULL STOP -24FD ; 9.0; digit # No DOUBLE CIRCLED DIGIT NINE -277E ; 9.0; digit # No DINGBAT NEGATIVE CIRCLED DIGIT NINE -2788 ; 9.0; digit # No DINGBAT CIRCLED SANS-SERIF DIGIT NINE -2792 ; 9.0; digit # No DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE -3029 ; 9.0; numeric # Nl HANGZHOU NUMERAL NINE -3228 ; 9.0; numeric # No PARENTHESIZED IDEOGRAPH NINE -3288 ; 9.0; numeric # No CIRCLED IDEOGRAPH NINE -4E5D ; 9.0; numeric # Lo CJK UNIFIED IDEOGRAPH-4E5D -7396 ; 9.0; numeric # Lo CJK UNIFIED IDEOGRAPH-7396 -FF19 ; 9.0; decimal # Nd FULLWIDTH DIGIT NINE -1010F ; 9.0; numeric # No AEGEAN NUMBER NINE -104A9 ; 9.0; decimal # Nd OSMANYA DIGIT NINE -1D7D7 ; 9.0; decimal # Nd MATHEMATICAL BOLD DIGIT NINE -1D7E1 ; 9.0; decimal # Nd MATHEMATICAL DOUBLE-STRUCK DIGIT NINE -1D7EB ; 9.0; decimal # Nd MATHEMATICAL SANS-SERIF DIGIT NINE -1D7F5 ; 9.0; decimal # Nd MATHEMATICAL SANS-SERIF BOLD DIGIT NINE -1D7FF ; 9.0; decimal # Nd MATHEMATICAL MONOSPACE DIGIT NINE +# Total code points: 1 + +# ================================================ + +0039 ; 9.0 # Nd DIGIT NINE +0669 ; 9.0 # Nd ARABIC-INDIC DIGIT NINE +06F9 ; 9.0 # Nd EXTENDED ARABIC-INDIC DIGIT NINE +096F ; 9.0 # Nd DEVANAGARI DIGIT NINE +09EF ; 9.0 # Nd BENGALI DIGIT NINE +0A6F ; 9.0 # Nd GURMUKHI DIGIT NINE +0AEF ; 9.0 # Nd GUJARATI DIGIT NINE +0B6F ; 9.0 # Nd ORIYA DIGIT NINE +0BEF ; 9.0 # Nd TAMIL DIGIT NINE +0C6F ; 9.0 # Nd TELUGU DIGIT NINE +0CEF ; 9.0 # Nd KANNADA DIGIT NINE +0D6F ; 9.0 # Nd MALAYALAM DIGIT NINE +0E59 ; 9.0 # Nd THAI DIGIT NINE +0ED9 ; 9.0 # Nd LAO DIGIT NINE +0F29 ; 9.0 # Nd TIBETAN DIGIT NINE +1049 ; 9.0 # Nd MYANMAR DIGIT NINE +1371 ; 9.0 # Nd ETHIOPIC DIGIT NINE +17E9 ; 9.0 # Nd KHMER DIGIT NINE +17F9 ; 9.0 # No KHMER SYMBOL LEK ATTAK PRAM-BUON +1819 ; 9.0 # Nd MONGOLIAN DIGIT NINE +194F ; 9.0 # Nd LIMBU DIGIT NINE +2079 ; 9.0 # No SUPERSCRIPT NINE +2089 ; 9.0 # No SUBSCRIPT NINE +2168 ; 9.0 # Nl ROMAN NUMERAL NINE +2178 ; 9.0 # Nl SMALL ROMAN NUMERAL NINE +2468 ; 9.0 # No CIRCLED DIGIT NINE +247C ; 9.0 # No PARENTHESIZED DIGIT NINE +2490 ; 9.0 # No DIGIT NINE FULL STOP +24FD ; 9.0 # No DOUBLE CIRCLED DIGIT NINE +277E ; 9.0 # No DINGBAT NEGATIVE CIRCLED DIGIT NINE +2788 ; 9.0 # No DINGBAT CIRCLED SANS-SERIF DIGIT NINE +2792 ; 9.0 # No DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE +3029 ; 9.0 # Nl HANGZHOU NUMERAL NINE +3228 ; 9.0 # No PARENTHESIZED IDEOGRAPH NINE +3288 ; 9.0 # No CIRCLED IDEOGRAPH NINE +4E5D ; 9.0 # Lo CJK UNIFIED IDEOGRAPH-4E5D +7396 ; 9.0 # Lo CJK UNIFIED IDEOGRAPH-7396 +FF19 ; 9.0 # Nd FULLWIDTH DIGIT NINE +1010F ; 9.0 # No AEGEAN NUMBER NINE +104A9 ; 9.0 # Nd OSMANYA DIGIT NINE +1D7D7 ; 9.0 # Nd MATHEMATICAL BOLD DIGIT NINE +1D7E1 ; 9.0 # Nd MATHEMATICAL DOUBLE-STRUCK DIGIT NINE +1D7EB ; 9.0 # Nd MATHEMATICAL SANS-SERIF DIGIT NINE +1D7F5 ; 9.0 # Nd MATHEMATICAL SANS-SERIF BOLD DIGIT NINE +1D7FF ; 9.0 # Nd MATHEMATICAL MONOSPACE DIGIT NINE # Total code points: 45 +# ================================================ -0BF0 ; 10.0; numeric # No TAMIL NUMBER TEN -1372 ; 10.0; numeric # No ETHIOPIC NUMBER TEN -2169 ; 10.0; numeric # Nl ROMAN NUMERAL TEN -2179 ; 10.0; numeric # Nl SMALL ROMAN NUMERAL TEN -2469 ; 10.0; numeric # No CIRCLED NUMBER TEN -247D ; 10.0; numeric # No PARENTHESIZED NUMBER TEN -2491 ; 10.0; numeric # No NUMBER TEN FULL STOP -24FE ; 10.0; numeric # No DOUBLE CIRCLED NUMBER TEN -277F ; 10.0; numeric # No DINGBAT NEGATIVE CIRCLED NUMBER TEN -2789 ; 10.0; numeric # No DINGBAT CIRCLED SANS-SERIF NUMBER TEN -2793 ; 10.0; numeric # No DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN -3038 ; 10.0; numeric # Nl HANGZHOU NUMERAL TEN -3229 ; 10.0; numeric # No PARENTHESIZED IDEOGRAPH TEN -3289 ; 10.0; numeric # No CIRCLED IDEOGRAPH TEN -5341 ; 10.0; numeric # Lo CJK UNIFIED IDEOGRAPH-5341 -62FE ; 10.0; numeric # Lo CJK UNIFIED IDEOGRAPH-62FE -10110 ; 10.0; numeric # No AEGEAN NUMBER TEN -10322 ; 10.0; numeric # No OLD ITALIC NUMERAL TEN +0BF0 ; 10.0 # No TAMIL NUMBER TEN +1372 ; 10.0 # No ETHIOPIC NUMBER TEN +2169 ; 10.0 # Nl ROMAN NUMERAL TEN +2179 ; 10.0 # Nl SMALL ROMAN NUMERAL TEN +2469 ; 10.0 # No CIRCLED NUMBER TEN +247D ; 10.0 # No PARENTHESIZED NUMBER TEN +2491 ; 10.0 # No NUMBER TEN FULL STOP +24FE ; 10.0 # No DOUBLE CIRCLED NUMBER TEN +277F ; 10.0 # No DINGBAT NEGATIVE CIRCLED NUMBER TEN +2789 ; 10.0 # No DINGBAT CIRCLED SANS-SERIF NUMBER TEN +2793 ; 10.0 # No DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN +3038 ; 10.0 # Nl HANGZHOU NUMERAL TEN +3229 ; 10.0 # No PARENTHESIZED IDEOGRAPH TEN +3289 ; 10.0 # No CIRCLED IDEOGRAPH TEN +5341 ; 10.0 # Lo CJK UNIFIED IDEOGRAPH-5341 +62FE ; 10.0 # Lo CJK UNIFIED IDEOGRAPH-62FE +10110 ; 10.0 # No AEGEAN NUMBER TEN +10322 ; 10.0 # No OLD ITALIC NUMERAL TEN # Total code points: 18 +# ================================================ -216A ; 11.0; numeric # Nl ROMAN NUMERAL ELEVEN -217A ; 11.0; numeric # Nl SMALL ROMAN NUMERAL ELEVEN -246A ; 11.0; numeric # No CIRCLED NUMBER ELEVEN -247E ; 11.0; numeric # No PARENTHESIZED NUMBER ELEVEN -2492 ; 11.0; numeric # No NUMBER ELEVEN FULL STOP -24EB ; 11.0; numeric # No NEGATIVE CIRCLED NUMBER ELEVEN +216A ; 11.0 # Nl ROMAN NUMERAL ELEVEN +217A ; 11.0 # Nl SMALL ROMAN NUMERAL ELEVEN +246A ; 11.0 # No CIRCLED NUMBER ELEVEN +247E ; 11.0 # No PARENTHESIZED NUMBER ELEVEN +2492 ; 11.0 # No NUMBER ELEVEN FULL STOP +24EB ; 11.0 # No NEGATIVE CIRCLED NUMBER ELEVEN # Total code points: 6 +# ================================================ -216B ; 12.0; numeric # Nl ROMAN NUMERAL TWELVE -217B ; 12.0; numeric # Nl SMALL ROMAN NUMERAL TWELVE -246B ; 12.0; numeric # No CIRCLED NUMBER TWELVE -247F ; 12.0; numeric # No PARENTHESIZED NUMBER TWELVE -2493 ; 12.0; numeric # No NUMBER TWELVE FULL STOP -24EC ; 12.0; numeric # No NEGATIVE CIRCLED NUMBER TWELVE +216B ; 12.0 # Nl ROMAN NUMERAL TWELVE +217B ; 12.0 # Nl SMALL ROMAN NUMERAL TWELVE +246B ; 12.0 # No CIRCLED NUMBER TWELVE +247F ; 12.0 # No PARENTHESIZED NUMBER TWELVE +2493 ; 12.0 # No NUMBER TWELVE FULL STOP +24EC ; 12.0 # No NEGATIVE CIRCLED NUMBER TWELVE # Total code points: 6 +# ================================================ -246C ; 13.0; numeric # No CIRCLED NUMBER THIRTEEN -2480 ; 13.0; numeric # No PARENTHESIZED NUMBER THIRTEEN -2494 ; 13.0; numeric # No NUMBER THIRTEEN FULL STOP -24ED ; 13.0; numeric # No NEGATIVE CIRCLED NUMBER THIRTEEN +246C ; 13.0 # No CIRCLED NUMBER THIRTEEN +2480 ; 13.0 # No PARENTHESIZED NUMBER THIRTEEN +2494 ; 13.0 # No NUMBER THIRTEEN FULL STOP +24ED ; 13.0 # No NEGATIVE CIRCLED NUMBER THIRTEEN # Total code points: 4 +# ================================================ -246D ; 14.0; numeric # No CIRCLED NUMBER FOURTEEN -2481 ; 14.0; numeric # No PARENTHESIZED NUMBER FOURTEEN -2495 ; 14.0; numeric # No NUMBER FOURTEEN FULL STOP -24EE ; 14.0; numeric # No NEGATIVE CIRCLED NUMBER FOURTEEN +246D ; 14.0 # No CIRCLED NUMBER FOURTEEN +2481 ; 14.0 # No PARENTHESIZED NUMBER FOURTEEN +2495 ; 14.0 # No NUMBER FOURTEEN FULL STOP +24EE ; 14.0 # No NEGATIVE CIRCLED NUMBER FOURTEEN # Total code points: 4 +# ================================================ -246E ; 15.0; numeric # No CIRCLED NUMBER FIFTEEN -2482 ; 15.0; numeric # No PARENTHESIZED NUMBER FIFTEEN -2496 ; 15.0; numeric # No NUMBER FIFTEEN FULL STOP -24EF ; 15.0; numeric # No NEGATIVE CIRCLED NUMBER FIFTEEN +246E ; 15.0 # No CIRCLED NUMBER FIFTEEN +2482 ; 15.0 # No PARENTHESIZED NUMBER FIFTEEN +2496 ; 15.0 # No NUMBER FIFTEEN FULL STOP +24EF ; 15.0 # No NEGATIVE CIRCLED NUMBER FIFTEEN # Total code points: 4 +# ================================================ -09F9 ; 16.0; numeric # No BENGALI CURRENCY DENOMINATOR SIXTEEN -246F ; 16.0; numeric # No CIRCLED NUMBER SIXTEEN -2483 ; 16.0; numeric # No PARENTHESIZED NUMBER SIXTEEN -2497 ; 16.0; numeric # No NUMBER SIXTEEN FULL STOP -24F0 ; 16.0; numeric # No NEGATIVE CIRCLED NUMBER SIXTEEN +09F9 ; 16.0 # No BENGALI CURRENCY DENOMINATOR SIXTEEN +246F ; 16.0 # No CIRCLED NUMBER SIXTEEN +2483 ; 16.0 # No PARENTHESIZED NUMBER SIXTEEN +2497 ; 16.0 # No NUMBER SIXTEEN FULL STOP +24F0 ; 16.0 # No NEGATIVE CIRCLED NUMBER SIXTEEN # Total code points: 5 +# ================================================ -16EE ; 17.0; numeric # Nl RUNIC ARLAUG SYMBOL -2470 ; 17.0; numeric # No CIRCLED NUMBER SEVENTEEN -2484 ; 17.0; numeric # No PARENTHESIZED NUMBER SEVENTEEN -2498 ; 17.0; numeric # No NUMBER SEVENTEEN FULL STOP -24F1 ; 17.0; numeric # No NEGATIVE CIRCLED NUMBER SEVENTEEN +16EE ; 17.0 # Nl RUNIC ARLAUG SYMBOL +2470 ; 17.0 # No CIRCLED NUMBER SEVENTEEN +2484 ; 17.0 # No PARENTHESIZED NUMBER SEVENTEEN +2498 ; 17.0 # No NUMBER SEVENTEEN FULL STOP +24F1 ; 17.0 # No NEGATIVE CIRCLED NUMBER SEVENTEEN # Total code points: 5 +# ================================================ -16EF ; 18.0; numeric # Nl RUNIC TVIMADUR SYMBOL -2471 ; 18.0; numeric # No CIRCLED NUMBER EIGHTEEN -2485 ; 18.0; numeric # No PARENTHESIZED NUMBER EIGHTEEN -2499 ; 18.0; numeric # No NUMBER EIGHTEEN FULL STOP -24F2 ; 18.0; numeric # No NEGATIVE CIRCLED NUMBER EIGHTEEN +16EF ; 18.0 # Nl RUNIC TVIMADUR SYMBOL +2471 ; 18.0 # No CIRCLED NUMBER EIGHTEEN +2485 ; 18.0 # No PARENTHESIZED NUMBER EIGHTEEN +2499 ; 18.0 # No NUMBER EIGHTEEN FULL STOP +24F2 ; 18.0 # No NEGATIVE CIRCLED NUMBER EIGHTEEN # Total code points: 5 +# ================================================ -16F0 ; 19.0; numeric # Nl RUNIC BELGTHOR SYMBOL -2472 ; 19.0; numeric # No CIRCLED NUMBER NINETEEN -2486 ; 19.0; numeric # No PARENTHESIZED NUMBER NINETEEN -249A ; 19.0; numeric # No NUMBER NINETEEN FULL STOP -24F3 ; 19.0; numeric # No NEGATIVE CIRCLED NUMBER NINETEEN +16F0 ; 19.0 # Nl RUNIC BELGTHOR SYMBOL +2472 ; 19.0 # No CIRCLED NUMBER NINETEEN +2486 ; 19.0 # No PARENTHESIZED NUMBER NINETEEN +249A ; 19.0 # No NUMBER NINETEEN FULL STOP +24F3 ; 19.0 # No NEGATIVE CIRCLED NUMBER NINETEEN # Total code points: 5 +# ================================================ -1373 ; 20.0; numeric # No ETHIOPIC NUMBER TWENTY -2473 ; 20.0; numeric # No CIRCLED NUMBER TWENTY -2487 ; 20.0; numeric # No PARENTHESIZED NUMBER TWENTY -249B ; 20.0; numeric # No NUMBER TWENTY FULL STOP -24F4 ; 20.0; numeric # No NEGATIVE CIRCLED NUMBER TWENTY -3039 ; 20.0; numeric # Nl HANGZHOU NUMERAL TWENTY -5EFF ; 20.0; numeric # Lo CJK UNIFIED IDEOGRAPH-5EFF -10111 ; 20.0; numeric # No AEGEAN NUMBER TWENTY +1373 ; 20.0 # No ETHIOPIC NUMBER TWENTY +2473 ; 20.0 # No CIRCLED NUMBER TWENTY +2487 ; 20.0 # No PARENTHESIZED NUMBER TWENTY +249B ; 20.0 # No NUMBER TWENTY FULL STOP +24F4 ; 20.0 # No NEGATIVE CIRCLED NUMBER TWENTY +3039 ; 20.0 # Nl HANGZHOU NUMERAL TWENTY +5EFF ; 20.0 # Lo CJK UNIFIED IDEOGRAPH-5EFF +10111 ; 20.0 # No AEGEAN NUMBER TWENTY # Total code points: 8 +# ================================================ -3251 ; 21.0; numeric # No CIRCLED NUMBER TWENTY ONE +3251 ; 21.0 # No CIRCLED NUMBER TWENTY ONE # Total code points: 1 +# ================================================ -3252 ; 22.0; numeric # No CIRCLED NUMBER TWENTY TWO +3252 ; 22.0 # No CIRCLED NUMBER TWENTY TWO # Total code points: 1 +# ================================================ -3253 ; 23.0; numeric # No CIRCLED NUMBER TWENTY THREE +3253 ; 23.0 # No CIRCLED NUMBER TWENTY THREE # Total code points: 1 +# ================================================ -3254 ; 24.0; numeric # No CIRCLED NUMBER TWENTY FOUR +3254 ; 24.0 # No CIRCLED NUMBER TWENTY FOUR # Total code points: 1 +# ================================================ -3255 ; 25.0; numeric # No CIRCLED NUMBER TWENTY FIVE +3255 ; 25.0 # No CIRCLED NUMBER TWENTY FIVE # Total code points: 1 +# ================================================ -3256 ; 26.0; numeric # No CIRCLED NUMBER TWENTY SIX +3256 ; 26.0 # No CIRCLED NUMBER TWENTY SIX # Total code points: 1 +# ================================================ -3257 ; 27.0; numeric # No CIRCLED NUMBER TWENTY SEVEN +3257 ; 27.0 # No CIRCLED NUMBER TWENTY SEVEN # Total code points: 1 +# ================================================ -3258 ; 28.0; numeric # No CIRCLED NUMBER TWENTY EIGHT +3258 ; 28.0 # No CIRCLED NUMBER TWENTY EIGHT # Total code points: 1 +# ================================================ -3259 ; 29.0; numeric # No CIRCLED NUMBER TWENTY NINE +3259 ; 29.0 # No CIRCLED NUMBER TWENTY NINE # Total code points: 1 +# ================================================ -1374 ; 30.0; numeric # No ETHIOPIC NUMBER THIRTY -303A ; 30.0; numeric # Nl HANGZHOU NUMERAL THIRTY -325A ; 30.0; numeric # No CIRCLED NUMBER THIRTY -5345 ; 30.0; numeric # Lo CJK UNIFIED IDEOGRAPH-5345 -10112 ; 30.0; numeric # No AEGEAN NUMBER THIRTY +1374 ; 30.0 # No ETHIOPIC NUMBER THIRTY +303A ; 30.0 # Nl HANGZHOU NUMERAL THIRTY +325A ; 30.0 # No CIRCLED NUMBER THIRTY +5345 ; 30.0 # Lo CJK UNIFIED IDEOGRAPH-5345 +10112 ; 30.0 # No AEGEAN NUMBER THIRTY # Total code points: 5 +# ================================================ -325B ; 31.0; numeric # No CIRCLED NUMBER THIRTY ONE +325B ; 31.0 # No CIRCLED NUMBER THIRTY ONE # Total code points: 1 +# ================================================ -325C ; 32.0; numeric # No CIRCLED NUMBER THIRTY TWO +325C ; 32.0 # No CIRCLED NUMBER THIRTY TWO # Total code points: 1 +# ================================================ -325D ; 33.0; numeric # No CIRCLED NUMBER THIRTY THREE +325D ; 33.0 # No CIRCLED NUMBER THIRTY THREE # Total code points: 1 +# ================================================ -325E ; 34.0; numeric # No CIRCLED NUMBER THIRTY FOUR +325E ; 34.0 # No CIRCLED NUMBER THIRTY FOUR # Total code points: 1 +# ================================================ -325F ; 35.0; numeric # No CIRCLED NUMBER THIRTY FIVE +325F ; 35.0 # No CIRCLED NUMBER THIRTY FIVE # Total code points: 1 +# ================================================ -32B1 ; 36.0; numeric # No CIRCLED NUMBER THIRTY SIX +32B1 ; 36.0 # No CIRCLED NUMBER THIRTY SIX # Total code points: 1 +# ================================================ -32B2 ; 37.0; numeric # No CIRCLED NUMBER THIRTY SEVEN +32B2 ; 37.0 # No CIRCLED NUMBER THIRTY SEVEN # Total code points: 1 +# ================================================ -32B3 ; 38.0; numeric # No CIRCLED NUMBER THIRTY EIGHT +32B3 ; 38.0 # No CIRCLED NUMBER THIRTY EIGHT # Total code points: 1 +# ================================================ -32B4 ; 39.0; numeric # No CIRCLED NUMBER THIRTY NINE +32B4 ; 39.0 # No CIRCLED NUMBER THIRTY NINE # Total code points: 1 +# ================================================ -1375 ; 40.0; numeric # No ETHIOPIC NUMBER FORTY -32B5 ; 40.0; numeric # No CIRCLED NUMBER FORTY -10113 ; 40.0; numeric # No AEGEAN NUMBER FORTY +1375 ; 40.0 # No ETHIOPIC NUMBER FORTY +32B5 ; 40.0 # No CIRCLED NUMBER FORTY +10113 ; 40.0 # No AEGEAN NUMBER FORTY # Total code points: 3 +# ================================================ -32B6 ; 41.0; numeric # No CIRCLED NUMBER FORTY ONE +32B6 ; 41.0 # No CIRCLED NUMBER FORTY ONE # Total code points: 1 +# ================================================ -32B7 ; 42.0; numeric # No CIRCLED NUMBER FORTY TWO +32B7 ; 42.0 # No CIRCLED NUMBER FORTY TWO # Total code points: 1 +# ================================================ -32B8 ; 43.0; numeric # No CIRCLED NUMBER FORTY THREE +32B8 ; 43.0 # No CIRCLED NUMBER FORTY THREE # Total code points: 1 +# ================================================ -32B9 ; 44.0; numeric # No CIRCLED NUMBER FORTY FOUR +32B9 ; 44.0 # No CIRCLED NUMBER FORTY FOUR # Total code points: 1 +# ================================================ -32BA ; 45.0; numeric # No CIRCLED NUMBER FORTY FIVE +32BA ; 45.0 # No CIRCLED NUMBER FORTY FIVE # Total code points: 1 +# ================================================ -32BB ; 46.0; numeric # No CIRCLED NUMBER FORTY SIX +32BB ; 46.0 # No CIRCLED NUMBER FORTY SIX # Total code points: 1 +# ================================================ -32BC ; 47.0; numeric # No CIRCLED NUMBER FORTY SEVEN +32BC ; 47.0 # No CIRCLED NUMBER FORTY SEVEN # Total code points: 1 +# ================================================ -32BD ; 48.0; numeric # No CIRCLED NUMBER FORTY EIGHT +32BD ; 48.0 # No CIRCLED NUMBER FORTY EIGHT # Total code points: 1 +# ================================================ -32BE ; 49.0; numeric # No CIRCLED NUMBER FORTY NINE +32BE ; 49.0 # No CIRCLED NUMBER FORTY NINE # Total code points: 1 +# ================================================ -1376 ; 50.0; numeric # No ETHIOPIC NUMBER FIFTY -216C ; 50.0; numeric # Nl ROMAN NUMERAL FIFTY -217C ; 50.0; numeric # Nl SMALL ROMAN NUMERAL FIFTY -32BF ; 50.0; numeric # No CIRCLED NUMBER FIFTY -10114 ; 50.0; numeric # No AEGEAN NUMBER FIFTY -10323 ; 50.0; numeric # No OLD ITALIC NUMERAL FIFTY +1376 ; 50.0 # No ETHIOPIC NUMBER FIFTY +216C ; 50.0 # Nl ROMAN NUMERAL FIFTY +217C ; 50.0 # Nl SMALL ROMAN NUMERAL FIFTY +32BF ; 50.0 # No CIRCLED NUMBER FIFTY +10114 ; 50.0 # No AEGEAN NUMBER FIFTY +10323 ; 50.0 # No OLD ITALIC NUMERAL FIFTY # Total code points: 6 +# ================================================ -1377 ; 60.0; numeric # No ETHIOPIC NUMBER SIXTY -10115 ; 60.0; numeric # No AEGEAN NUMBER SIXTY +1377 ; 60.0 # No ETHIOPIC NUMBER SIXTY +10115 ; 60.0 # No AEGEAN NUMBER SIXTY # Total code points: 2 +# ================================================ -1378 ; 70.0; numeric # No ETHIOPIC NUMBER SEVENTY -10116 ; 70.0; numeric # No AEGEAN NUMBER SEVENTY +1378 ; 70.0 # No ETHIOPIC NUMBER SEVENTY +10116 ; 70.0 # No AEGEAN NUMBER SEVENTY # Total code points: 2 +# ================================================ -1379 ; 80.0; numeric # No ETHIOPIC NUMBER EIGHTY -10117 ; 80.0; numeric # No AEGEAN NUMBER EIGHTY +1379 ; 80.0 # No ETHIOPIC NUMBER EIGHTY +10117 ; 80.0 # No AEGEAN NUMBER EIGHTY # Total code points: 2 +# ================================================ -137A ; 90.0; numeric # No ETHIOPIC NUMBER NINETY -10118 ; 90.0; numeric # No AEGEAN NUMBER NINETY +137A ; 90.0 # No ETHIOPIC NUMBER NINETY +10118 ; 90.0 # No AEGEAN NUMBER NINETY # Total code points: 2 +# ================================================ -0BF1 ; 100.0; numeric # No TAMIL NUMBER ONE HUNDRED -137B ; 100.0; numeric # No ETHIOPIC NUMBER HUNDRED -216D ; 100.0; numeric # Nl ROMAN NUMERAL ONE HUNDRED -217D ; 100.0; numeric # Nl SMALL ROMAN NUMERAL ONE HUNDRED -4F70 ; 100.0; numeric # Lo CJK UNIFIED IDEOGRAPH-4F70 -767E ; 100.0; numeric # Lo CJK UNIFIED IDEOGRAPH-767E -964C ; 100.0; numeric # Lo CJK UNIFIED IDEOGRAPH-964C -10119 ; 100.0; numeric # No AEGEAN NUMBER ONE HUNDRED +0BF1 ; 100.0 # No TAMIL NUMBER ONE HUNDRED +137B ; 100.0 # No ETHIOPIC NUMBER HUNDRED +216D ; 100.0 # Nl ROMAN NUMERAL ONE HUNDRED +217D ; 100.0 # Nl SMALL ROMAN NUMERAL ONE HUNDRED +4F70 ; 100.0 # Lo CJK UNIFIED IDEOGRAPH-4F70 +767E ; 100.0 # Lo CJK UNIFIED IDEOGRAPH-767E +964C ; 100.0 # Lo CJK UNIFIED IDEOGRAPH-964C +10119 ; 100.0 # No AEGEAN NUMBER ONE HUNDRED # Total code points: 8 +# ================================================ -1011A ; 200.0; numeric # No AEGEAN NUMBER TWO HUNDRED +1011A ; 200.0 # No AEGEAN NUMBER TWO HUNDRED # Total code points: 1 +# ================================================ -1011B ; 300.0; numeric # No AEGEAN NUMBER THREE HUNDRED +1011B ; 300.0 # No AEGEAN NUMBER THREE HUNDRED # Total code points: 1 +# ================================================ -1011C ; 400.0; numeric # No AEGEAN NUMBER FOUR HUNDRED +1011C ; 400.0 # No AEGEAN NUMBER FOUR HUNDRED # Total code points: 1 +# ================================================ -216E ; 500.0; numeric # Nl ROMAN NUMERAL FIVE HUNDRED -217E ; 500.0; numeric # Nl SMALL ROMAN NUMERAL FIVE HUNDRED -1011D ; 500.0; numeric # No AEGEAN NUMBER FIVE HUNDRED +216E ; 500.0 # Nl ROMAN NUMERAL FIVE HUNDRED +217E ; 500.0 # Nl SMALL ROMAN NUMERAL FIVE HUNDRED +1011D ; 500.0 # No AEGEAN NUMBER FIVE HUNDRED # Total code points: 3 +# ================================================ -1011E ; 600.0; numeric # No AEGEAN NUMBER SIX HUNDRED +1011E ; 600.0 # No AEGEAN NUMBER SIX HUNDRED # Total code points: 1 +# ================================================ -1011F ; 700.0; numeric # No AEGEAN NUMBER SEVEN HUNDRED +1011F ; 700.0 # No AEGEAN NUMBER SEVEN HUNDRED # Total code points: 1 +# ================================================ -10120 ; 800.0; numeric # No AEGEAN NUMBER EIGHT HUNDRED +10120 ; 800.0 # No AEGEAN NUMBER EIGHT HUNDRED # Total code points: 1 +# ================================================ -10121 ; 900.0; numeric # No AEGEAN NUMBER NINE HUNDRED +10121 ; 900.0 # No AEGEAN NUMBER NINE HUNDRED # Total code points: 1 +# ================================================ -0BF2 ; 1000.0; numeric # No TAMIL NUMBER ONE THOUSAND -216F ; 1000.0; numeric # Nl ROMAN NUMERAL ONE THOUSAND -217F..2180 ; 1000.0; numeric # Nl [2] SMALL ROMAN NUMERAL ONE THOUSAND..ROMAN NUMERAL ONE THOUSAND C D -4EDF ; 1000.0; numeric # Lo CJK UNIFIED IDEOGRAPH-4EDF -5343 ; 1000.0; numeric # Lo CJK UNIFIED IDEOGRAPH-5343 -10122 ; 1000.0; numeric # No AEGEAN NUMBER ONE THOUSAND +0BF2 ; 1000.0 # No TAMIL NUMBER ONE THOUSAND +216F ; 1000.0 # Nl ROMAN NUMERAL ONE THOUSAND +217F..2180 ; 1000.0 # Nl [2] SMALL ROMAN NUMERAL ONE THOUSAND..ROMAN NUMERAL ONE THOUSAND C D +4EDF ; 1000.0 # Lo CJK UNIFIED IDEOGRAPH-4EDF +5343 ; 1000.0 # Lo CJK UNIFIED IDEOGRAPH-5343 +10122 ; 1000.0 # No AEGEAN NUMBER ONE THOUSAND # Total code points: 7 +# ================================================ -10123 ; 2000.0; numeric # No AEGEAN NUMBER TWO THOUSAND +10123 ; 2000.0 # No AEGEAN NUMBER TWO THOUSAND # Total code points: 1 +# ================================================ -10124 ; 3000.0; numeric # No AEGEAN NUMBER THREE THOUSAND +10124 ; 3000.0 # No AEGEAN NUMBER THREE THOUSAND # Total code points: 1 +# ================================================ -10125 ; 4000.0; numeric # No AEGEAN NUMBER FOUR THOUSAND +10125 ; 4000.0 # No AEGEAN NUMBER FOUR THOUSAND # Total code points: 1 +# ================================================ -2181 ; 5000.0; numeric # Nl ROMAN NUMERAL FIVE THOUSAND -10126 ; 5000.0; numeric # No AEGEAN NUMBER FIVE THOUSAND +2181 ; 5000.0 # Nl ROMAN NUMERAL FIVE THOUSAND +10126 ; 5000.0 # No AEGEAN NUMBER FIVE THOUSAND # Total code points: 2 +# ================================================ -10127 ; 6000.0; numeric # No AEGEAN NUMBER SIX THOUSAND +10127 ; 6000.0 # No AEGEAN NUMBER SIX THOUSAND # Total code points: 1 +# ================================================ -10128 ; 7000.0; numeric # No AEGEAN NUMBER SEVEN THOUSAND +10128 ; 7000.0 # No AEGEAN NUMBER SEVEN THOUSAND # Total code points: 1 +# ================================================ -10129 ; 8000.0; numeric # No AEGEAN NUMBER EIGHT THOUSAND +10129 ; 8000.0 # No AEGEAN NUMBER EIGHT THOUSAND # Total code points: 1 +# ================================================ -1012A ; 9000.0; numeric # No AEGEAN NUMBER NINE THOUSAND +1012A ; 9000.0 # No AEGEAN NUMBER NINE THOUSAND # Total code points: 1 +# ================================================ -137C ; 10000.0; numeric # No ETHIOPIC NUMBER TEN THOUSAND -2182 ; 10000.0; numeric # Nl ROMAN NUMERAL TEN THOUSAND -4E07 ; 10000.0; numeric # Lo CJK UNIFIED IDEOGRAPH-4E07 -842C ; 10000.0; numeric # Lo CJK UNIFIED IDEOGRAPH-842C -1012B ; 10000.0; numeric # No AEGEAN NUMBER TEN THOUSAND +137C ; 10000.0 # No ETHIOPIC NUMBER TEN THOUSAND +2182 ; 10000.0 # Nl ROMAN NUMERAL TEN THOUSAND +4E07 ; 10000.0 # Lo CJK UNIFIED IDEOGRAPH-4E07 +842C ; 10000.0 # Lo CJK UNIFIED IDEOGRAPH-842C +1012B ; 10000.0 # No AEGEAN NUMBER TEN THOUSAND # Total code points: 5 +# ================================================ -1012C ; 20000.0; numeric # No AEGEAN NUMBER TWENTY THOUSAND +1012C ; 20000.0 # No AEGEAN NUMBER TWENTY THOUSAND # Total code points: 1 +# ================================================ -1012D ; 30000.0; numeric # No AEGEAN NUMBER THIRTY THOUSAND +1012D ; 30000.0 # No AEGEAN NUMBER THIRTY THOUSAND # Total code points: 1 +# ================================================ -1012E ; 40000.0; numeric # No AEGEAN NUMBER FORTY THOUSAND +1012E ; 40000.0 # No AEGEAN NUMBER FORTY THOUSAND # Total code points: 1 +# ================================================ -1012F ; 50000.0; numeric # No AEGEAN NUMBER FIFTY THOUSAND +1012F ; 50000.0 # No AEGEAN NUMBER FIFTY THOUSAND # Total code points: 1 +# ================================================ -10130 ; 60000.0; numeric # No AEGEAN NUMBER SIXTY THOUSAND +10130 ; 60000.0 # No AEGEAN NUMBER SIXTY THOUSAND # Total code points: 1 +# ================================================ -10131 ; 70000.0; numeric # No AEGEAN NUMBER SEVENTY THOUSAND +10131 ; 70000.0 # No AEGEAN NUMBER SEVENTY THOUSAND # Total code points: 1 +# ================================================ -10132 ; 80000.0; numeric # No AEGEAN NUMBER EIGHTY THOUSAND +10132 ; 80000.0 # No AEGEAN NUMBER EIGHTY THOUSAND # Total code points: 1 +# ================================================ -10133 ; 90000.0; numeric # No AEGEAN NUMBER NINETY THOUSAND +10133 ; 90000.0 # No AEGEAN NUMBER NINETY THOUSAND # Total code points: 1 +# ================================================ -4EBF ; 100000000.0; numeric # Lo CJK UNIFIED IDEOGRAPH-4EBF -5104 ; 100000000.0; numeric # Lo CJK UNIFIED IDEOGRAPH-5104 +4EBF ; 100000000.0 # Lo CJK UNIFIED IDEOGRAPH-4EBF +5104 ; 100000000.0 # Lo CJK UNIFIED IDEOGRAPH-5104 # Total code points: 2 +# ================================================ -5146 ; 1000000000000.0; numeric # Lo CJK UNIFIED IDEOGRAPH-5146 +5146 ; 1000000000000.0 # Lo CJK UNIFIED IDEOGRAPH-5146 # Total code points: 1 - - diff --git a/icuSources/data/unidata/FractionalUCA.txt b/icuSources/data/unidata/FractionalUCA.txt index d3ad1a35..6c1cec69 100644 --- a/icuSources/data/unidata/FractionalUCA.txt +++ b/icuSources/data/unidata/FractionalUCA.txt @@ -1,6 +1,6 @@ # Fractional UCA Table, generated from standard UCA -# 2003-03-19,12:26:29 GMT [MD] -# VERSION: UCA=3.1.1, UCD=4.0.0 +# 2004-01-27,10:18:00 GMT [MD] +# VERSION: UCA=4.0.0, UCD=4.0.0 # Generated processed version, as described in ICU design document. # NOTES @@ -16,7 +16,9 @@ # WARNING # - Differs from previous version in that MAX value was introduced at 1F. # All tertiary values are shifted down by 1, filling the gap at 7! -[UCA version = 3.1.1] + +[UCA version = 4.0.0] + 0000; [,,] 0001; [,,] 0002; [,,] @@ -76,6 +78,7 @@ 009D; [,,] 009E; [,,] 009F; [,,] +034F; [,,] 0488; [,,] 0489; [,,] 0591; [,,] @@ -110,13 +113,37 @@ 05AF; [,,] 05BD; [,,] 05C4; [,,] +0600; [,,] +0601; [,,] +0602; [,,] +0603; [,,] +0610; [,,] +0611; [,,] +0612; [,,] +0613; [,,] +0614; [,,] +0615; [,,] +06D6; [,,] +06D7; [,,] +06D8; [,,] +06D9; [,,] +06DA; [,,] +06DB; [,,] +06DC; [,,] 06DD; [,,] 06DE; [,,] 06DF; [,,] 06E0; [,,] +06E1; [,,] +06E2; [,,] +06E3; [,,] +06E4; [,,] +06E7; [,,] +06E8; [,,] 06EA; [,,] 06EB; [,,] 06EC; [,,] +06ED; [,,] 070F; [,,] 0E4E; [,,] 0F18; [,,] @@ -142,6 +169,10 @@ 202C; [,,] 202D; [,,] 202E; [,,] +2060; [,,] +2061; [,,] +2062; [,,] +2063; [,,] 206A; [,,] 206B; [,,] 206C; [,,] @@ -309,6 +340,246 @@ DB40 DC7C; [,,] DB40 DC7D; [,,] DB40 DC7E; [,,] DB40 DC7F; [,,] +DB40 DD00; [,,] +DB40 DD01; [,,] +DB40 DD02; [,,] +DB40 DD03; [,,] +DB40 DD04; [,,] +DB40 DD05; [,,] +DB40 DD06; [,,] +DB40 DD07; [,,] +DB40 DD08; [,,] +DB40 DD09; [,,] +DB40 DD0A; [,,] +DB40 DD0B; [,,] +DB40 DD0C; [,,] +DB40 DD0D; [,,] +DB40 DD0E; [,,] +DB40 DD0F; [,,] +DB40 DD10; [,,] +DB40 DD11; [,,] +DB40 DD12; [,,] +DB40 DD13; [,,] +DB40 DD14; [,,] +DB40 DD15; [,,] +DB40 DD16; [,,] +DB40 DD17; [,,] +DB40 DD18; [,,] +DB40 DD19; [,,] +DB40 DD1A; [,,] +DB40 DD1B; [,,] +DB40 DD1C; [,,] +DB40 DD1D; [,,] +DB40 DD1E; [,,] +DB40 DD1F; [,,] +DB40 DD20; [,,] +DB40 DD21; [,,] +DB40 DD22; [,,] +DB40 DD23; [,,] +DB40 DD24; [,,] +DB40 DD25; [,,] +DB40 DD26; [,,] +DB40 DD27; [,,] +DB40 DD28; [,,] +DB40 DD29; [,,] +DB40 DD2A; [,,] +DB40 DD2B; [,,] +DB40 DD2C; [,,] +DB40 DD2D; [,,] +DB40 DD2E; [,,] +DB40 DD2F; [,,] +DB40 DD30; [,,] +DB40 DD31; [,,] +DB40 DD32; [,,] +DB40 DD33; [,,] +DB40 DD34; [,,] +DB40 DD35; [,,] +DB40 DD36; [,,] +DB40 DD37; [,,] +DB40 DD38; [,,] +DB40 DD39; [,,] +DB40 DD3A; [,,] +DB40 DD3B; [,,] +DB40 DD3C; [,,] +DB40 DD3D; [,,] +DB40 DD3E; [,,] +DB40 DD3F; [,,] +DB40 DD40; [,,] +DB40 DD41; [,,] +DB40 DD42; [,,] +DB40 DD43; [,,] +DB40 DD44; [,,] +DB40 DD45; [,,] +DB40 DD46; [,,] +DB40 DD47; [,,] +DB40 DD48; [,,] +DB40 DD49; [,,] +DB40 DD4A; [,,] +DB40 DD4B; [,,] +DB40 DD4C; [,,] +DB40 DD4D; [,,] +DB40 DD4E; [,,] +DB40 DD4F; [,,] +DB40 DD50; [,,] +DB40 DD51; [,,] +DB40 DD52; [,,] +DB40 DD53; [,,] +DB40 DD54; [,,] +DB40 DD55; [,,] +DB40 DD56; [,,] +DB40 DD57; [,,] +DB40 DD58; [,,] +DB40 DD59; [,,] +DB40 DD5A; [,,] +DB40 DD5B; [,,] +DB40 DD5C; [,,] +DB40 DD5D; [,,] +DB40 DD5E; [,,] +DB40 DD5F; [,,] +DB40 DD60; [,,] +DB40 DD61; [,,] +DB40 DD62; [,,] +DB40 DD63; [,,] +DB40 DD64; [,,] +DB40 DD65; [,,] +DB40 DD66; [,,] +DB40 DD67; [,,] +DB40 DD68; [,,] +DB40 DD69; [,,] +DB40 DD6A; [,,] +DB40 DD6B; [,,] +DB40 DD6C; [,,] +DB40 DD6D; [,,] +DB40 DD6E; [,,] +DB40 DD6F; [,,] +DB40 DD70; [,,] +DB40 DD71; [,,] +DB40 DD72; [,,] +DB40 DD73; [,,] +DB40 DD74; [,,] +DB40 DD75; [,,] +DB40 DD76; [,,] +DB40 DD77; [,,] +DB40 DD78; [,,] +DB40 DD79; [,,] +DB40 DD7A; [,,] +DB40 DD7B; [,,] +DB40 DD7C; [,,] +DB40 DD7D; [,,] +DB40 DD7E; [,,] +DB40 DD7F; [,,] +DB40 DD80; [,,] +DB40 DD81; [,,] +DB40 DD82; [,,] +DB40 DD83; [,,] +DB40 DD84; [,,] +DB40 DD85; [,,] +DB40 DD86; [,,] +DB40 DD87; [,,] +DB40 DD88; [,,] +DB40 DD89; [,,] +DB40 DD8A; [,,] +DB40 DD8B; [,,] +DB40 DD8C; [,,] +DB40 DD8D; [,,] +DB40 DD8E; [,,] +DB40 DD8F; [,,] +DB40 DD90; [,,] +DB40 DD91; [,,] +DB40 DD92; [,,] +DB40 DD93; [,,] +DB40 DD94; [,,] +DB40 DD95; [,,] +DB40 DD96; [,,] +DB40 DD97; [,,] +DB40 DD98; [,,] +DB40 DD99; [,,] +DB40 DD9A; [,,] +DB40 DD9B; [,,] +DB40 DD9C; [,,] +DB40 DD9D; [,,] +DB40 DD9E; [,,] +DB40 DD9F; [,,] +DB40 DDA0; [,,] +DB40 DDA1; [,,] +DB40 DDA2; [,,] +DB40 DDA3; [,,] +DB40 DDA4; [,,] +DB40 DDA5; [,,] +DB40 DDA6; [,,] +DB40 DDA7; [,,] +DB40 DDA8; [,,] +DB40 DDA9; [,,] +DB40 DDAA; [,,] +DB40 DDAB; [,,] +DB40 DDAC; [,,] +DB40 DDAD; [,,] +DB40 DDAE; [,,] +DB40 DDAF; [,,] +DB40 DDB0; [,,] +DB40 DDB1; [,,] +DB40 DDB2; [,,] +DB40 DDB3; [,,] +DB40 DDB4; [,,] +DB40 DDB5; [,,] +DB40 DDB6; [,,] +DB40 DDB7; [,,] +DB40 DDB8; [,,] +DB40 DDB9; [,,] +DB40 DDBA; [,,] +DB40 DDBB; [,,] +DB40 DDBC; [,,] +DB40 DDBD; [,,] +DB40 DDBE; [,,] +DB40 DDBF; [,,] +DB40 DDC0; [,,] +DB40 DDC1; [,,] +DB40 DDC2; [,,] +DB40 DDC3; [,,] +DB40 DDC4; [,,] +DB40 DDC5; [,,] +DB40 DDC6; [,,] +DB40 DDC7; [,,] +DB40 DDC8; [,,] +DB40 DDC9; [,,] +DB40 DDCA; [,,] +DB40 DDCB; [,,] +DB40 DDCC; [,,] +DB40 DDCD; [,,] +DB40 DDCE; [,,] +DB40 DDCF; [,,] +DB40 DDD0; [,,] +DB40 DDD1; [,,] +DB40 DDD2; [,,] +DB40 DDD3; [,,] +DB40 DDD4; [,,] +DB40 DDD5; [,,] +DB40 DDD6; [,,] +DB40 DDD7; [,,] +DB40 DDD8; [,,] +DB40 DDD9; [,,] +DB40 DDDA; [,,] +DB40 DDDB; [,,] +DB40 DDDC; [,,] +DB40 DDDD; [,,] +DB40 DDDE; [,,] +DB40 DDDF; [,,] +DB40 DDE0; [,,] +DB40 DDE1; [,,] +DB40 DDE2; [,,] +DB40 DDE3; [,,] +DB40 DDE4; [,,] +DB40 DDE5; [,,] +DB40 DDE6; [,,] +DB40 DDE7; [,,] +DB40 DDE8; [,,] +DB40 DDE9; [,,] +DB40 DDEA; [,,] +DB40 DDEB; [,,] +DB40 DDEC; [,,] +DB40 DDED; [,,] +DB40 DDEE; [,,] +DB40 DDEF; [,,] DB7F DFFE; [,,] DB7F DFFF; [,,] DBBF DFFE; [,,] @@ -346,6 +617,25 @@ FDEC; [,,] FDED; [,,] FDEE; [,,] FDEF; [,,] +FE00; [,,] +FE01; [,,] +FE02; [,,] +FE03; [,,] +FE04; [,,] +FE05; [,,] +FE06; [,,] +FE07; [,,] +FE08; [,,] +FE09; [,,] +FE0A; [,,] +FE0B; [,,] +FE0C; [,,] +FE0D; [,,] +FE0E; [,,] +FE0F; [,,] +FE21; [,,] +FE23; [,,] +FE73; [,,] FEFF; [,,] FFF9; [,,] FFFA; [,,] @@ -431,202 +721,214 @@ FFFF; [,,] 034C; [, D2 55, 05] 034D; [, D2 65, 05] 034E; [, D2 75, 05] -0360; [, D2 85, 05] -0361; [, D2 95, 05] -0362; [, D2 A5, 05] -FE20; [, D2 B5, 05] -FE21; [, D2 C5, 05] -FE22; [, D2 D5, 05] -FE23; [, D2 E5, 05] -0483; [, D2 F5, 05] -0484; [, D3 09, 05] -0485; [, D3 19, 05] -0486; [, D3 29, 05] -05B0; [, D3 39, 05] -05B1; [, D3 49, 05] -05B2; [, D3 59, 05] -05B3; [, D3 69, 05] -05B4; [, D3 79, 05] -05B5; [, D3 89, 05] -05B6; [, D3 99, 05] -05B7; [, D3 A9, 05] -05B8; [, D3 B9, 05] -05B9; [, D3 C9, 05] -05BB; [, D3 D9, 05] -05BC; [, D3 E9, 05] -05BF; [, D3 F9, 05] -05C1; [, D4 0D, 05] -05C2; [, D4 1D, 05] -FB1E; [, D4 2D, 05] -064B; [, D4 3D, 05] -FE71; [, D4 3D, 2F] -FE70; [, D4 3D, 33] -064C; [, D4 4D, 05] -FE72; [, D4 4D, 33] -064D; [, D4 5D, 05] -FE74; [, D4 5D, 33] -064E; [, D4 6D, 05] -FE77; [, D4 6D, 2F] -FE76; [, D4 6D, 33] -064F; [, D4 7D, 05] -FE79; [, D4 7D, 2F] -FE78; [, D4 7D, 33] -0650; [, D4 8D, 05] -FE7B; [, D4 8D, 2F] -FE7A; [, D4 8D, 33] -0651; [, D4 9D, 05] -FCF2; [, D4 9D, 2F] -FCF3; [, D4 9D, 2F] -FCF4; [, D4 9D, 2F] -FE7D; [, D4 9D, 2F] -FC5E; [, D4 9D, 33] -FC5F; [, D4 9D, 33] -FC60; [, D4 9D, 33] -FC61; [, D4 9D, 33] -FC62; [, D4 9D, 33] -FE7C; [, D4 9D, 33] -FC63; [, D4 9D, 33][, D4 ED, 33] -0652; [, D4 AD, 05] -FE7F; [, D4 AD, 2F] -FE7E; [, D4 AD, 33] -0653; [, D4 BD, 05] -0654; [, D4 CD, 05] -0655; [, D4 DD, 05] -0670; [, D4 ED, 05] -06D6; [, D4 FD, 05] -06D7; [, D5 11, 05] -06D8; [, D5 21, 05] -06D9; [, D5 31, 05] -06DA; [, D5 41, 05] -06DB; [, D5 51, 05] -06DC; [, D5 61, 05] -06E1; [, D5 71, 05] -06E2; [, D5 81, 05] -06E3; [, D5 91, 05] -06E4; [, D5 A1, 05] -06E7; [, D5 B1, 05] -06E8; [, D5 C1, 05] -06ED; [, D5 D1, 05] -0711; [, D5 E1, 05] -0730; [, D5 F1, 05] -0731; [, D6 05, 05] -0732; [, D6 15, 05] -0733; [, D6 25, 05] -0734; [, D6 35, 05] -0735; [, D6 45, 05] -0736; [, D6 55, 05] -0737; [, D6 65, 05] -0738; [, D6 75, 05] -0739; [, D6 85, 05] -073A; [, D6 95, 05] -073B; [, D6 A5, 05] -073C; [, D6 B5, 05] -073D; [, D6 C5, 05] -073E; [, D6 D5, 05] -073F; [, D6 E5, 05] -0740; [, D6 F5, 05] -0741; [, D7 09, 05] -0742; [, D7 19, 05] -0743; [, D7 29, 05] -0744; [, D7 39, 05] -0745; [, D7 49, 05] -0746; [, D7 59, 05] -0747; [, D7 69, 05] -0748; [, D7 79, 05] -0749; [, D7 89, 05] -074A; [, D7 99, 05] -093C; [, D7 A9, 05] -0901; [, D7 B9, 05] -0902; [, D7 C9, 05] -0903; [, D7 D9, 05] -0951; [, D7 E9, 05] -0952; [, D7 F9, 05] -0953; [, D8 0D, 05] -0954; [, D8 1D, 05] -09BC; [, D8 2D, 05] -0981; [, D8 3D, 05] -0982; [, D8 4D, 05] -0983; [, D8 5D, 05] -0A3C; [, D8 6D, 05] -0A02; [, D8 7D, 05] -0A70; [, D8 8D, 05] -0A71; [, D8 9D, 05] -0ABC; [, D8 AD, 05] -0A81; [, D8 BD, 05] -0A82; [, D8 CD, 05] -0A83; [, D8 DD, 05] -0B3C; [, D8 ED, 05] -0B01; [, D8 FD, 05] -0B02; [, D9 11, 05] -0B03; [, D9 21, 05] -0B82; [, D9 31, 05] -0C01; [, D9 41, 05] -0C02; [, D9 51, 05] -0C03; [, D9 61, 05] -0C82; [, D9 71, 05] -0C83; [, D9 81, 05] -0D02; [, D9 91, 05] -0D03; [, D9 A1, 05] -0D82; [, D9 B1, 05] -0D83; [, D9 C1, 05] -0E47; [, D9 D1, 05] -0E48; [, D9 E1, 05] -0E49; [, D9 F1, 05] -0E4A; [, DA 05, 05] -0E4B; [, DA 15, 05] -0EC8; [, DA 25, 05] -0EC9; [, DA 35, 05] -0ECA; [, DA 45, 05] -0ECB; [, DA 55, 05] -0F39; [, DA 65, 05] -0F7E; [, DA 75, 05] -0F7F; [, DA 85, 05] -1036; [, DA 95, 05] -1037; [, DA A5, 05] -1038; [, DA B5, 05] -17C6; [, DA C5, 05] -17C7; [, DA D5, 05] -17C8; [, DA E5, 05] -17C9; [, DA F5, 05] -17CA; [, DB 09, 05] -17CB; [, DB 19, 05] -17CC; [, DB 29, 05] -17CD; [, DB 39, 05] -17CE; [, DB 49, 05] -17CF; [, DB 59, 05] -17D0; [, DB 69, 05] -17D1; [, DB 79, 05] -17D3; [, DB 89, 05] -302A; [, DB 99, 05] -302B; [, DB A9, 05] -302C; [, DB B9, 05] -302D; [, DB C9, 05] -302E; [, DB D9, 05] -302F; [, DB E9, 05] -3099; [, DB F9, 05] -FF9E; [, DB F9, A3] -309A; [, DC 0D, 05] -FF9F; [, DC 0D, A3] -20D0; [, DC 1D, 05] -20D1; [, DC 2D, 05] -20D2; [, DC 3D, 05] -20D3; [, DC 4D, 05] -20D4; [, DC 5D, 05] -20D5; [, DC 6D, 05] -20D6; [, DC 7D, 05] -20D7; [, DC 8D, 05] -20D8; [, DC 9D, 05] -20D9; [, DC AD, 05] -20DA; [, DC BD, 05] -20DB; [, DC CD, 05] -20DC; [, DC DD, 05] -20DD; [, DC ED, 05] -20DE; [, DC FD, 05] -20DF; [, DD 11, 05] -20E0; [, DD 21, 05] -20E1; [, DD 31, 05] -20E2; [, DD 41, 05] -20E3; [, DD 51, 05] +0350; [, D2 85, 05] +0351; [, D2 95, 05] +0352; [, D2 A5, 05] +0353; [, D2 B5, 05] +0354; [, D2 C5, 05] +0355; [, D2 D5, 05] +0356; [, D2 E5, 05] +0357; [, D2 F5, 05] +035D; [, D3 09, 05] +035E; [, D3 19, 05] +035F; [, D3 29, 05] +0360; [, D3 39, 05] +FE22; [, D3 39, 05] +0361; [, D3 49, 05] +FE20; [, D3 49, 05] +0362; [, D3 59, 05] +0483; [, D3 69, 05] +0484; [, D3 79, 05] +0485; [, D3 89, 05] +0486; [, D3 99, 05] +05B0; [, D3 A9, 05] +05B1; [, D3 B9, 05] +05B2; [, D3 C9, 05] +05B3; [, D3 D9, 05] +05B4; [, D3 E9, 05] +05B5; [, D3 F9, 05] +05B6; [, D4 0D, 05] +05B7; [, D4 1D, 05] +05B8; [, D4 2D, 05] +05B9; [, D4 3D, 05] +05BB; [, D4 4D, 05] +05C2; [, D4 5D, 05] +05C1; [, D4 6D, 05] +05BC; [, D4 7D, 05] +05BF; [, D4 8D, 05] +FB1E; [, D4 9D, 05] +064B; [, D4 AD, 05] +FE71; [, D4 AD, 2F] +FE70; [, D4 AD, 33] +064C; [, D4 BD, 05] +FE72; [, D4 BD, 33] +064D; [, D4 CD, 05] +FE74; [, D4 CD, 33] +064E; [, D4 DD, 05] +FE77; [, D4 DD, 2F] +FE76; [, D4 DD, 33] +064F; [, D4 ED, 05] +FE79; [, D4 ED, 2F] +FE78; [, D4 ED, 33] +0650; [, D4 FD, 05] +FE7B; [, D4 FD, 2F] +FE7A; [, D4 FD, 33] +0651; [, D5 11, 05] +FCF2; [, D5 11, 2F] +FCF3; [, D5 11, 2F] +FCF4; [, D5 11, 2F] +FE7D; [, D5 11, 2F] +FC5E; [, D5 11, 33] +FC5F; [, D5 11, 33] +FC60; [, D5 11, 33] +FC61; [, D5 11, 33] +FC62; [, D5 11, 33] +FE7C; [, D5 11, 33] +FC63; [, D5 11, 33][, D5 91, 33] +0652; [, D5 21, 05] +FE7F; [, D5 21, 2F] +FE7E; [, D5 21, 33] +0653; [, D5 31, 05] +0654; [, D5 41, 05] +0655; [, D5 51, 05] +0656; [, D5 61, 05] +0657; [, D5 71, 05] +0658; [, D5 81, 05] +0670; [, D5 91, 05] +0711; [, D5 A1, 05] +0730; [, D5 B1, 05] +0731; [, D5 C1, 05] +0732; [, D5 D1, 05] +0733; [, D5 E1, 05] +0734; [, D5 F1, 05] +0735; [, D6 05, 05] +0736; [, D6 15, 05] +0737; [, D6 25, 05] +0738; [, D6 35, 05] +0739; [, D6 45, 05] +073A; [, D6 55, 05] +073B; [, D6 65, 05] +073C; [, D6 75, 05] +073D; [, D6 85, 05] +073E; [, D6 95, 05] +073F; [, D6 A5, 05] +0740; [, D6 B5, 05] +0741; [, D6 C5, 05] +0742; [, D6 D5, 05] +0743; [, D6 E5, 05] +0744; [, D6 F5, 05] +0745; [, D7 09, 05] +0746; [, D7 19, 05] +0747; [, D7 29, 05] +0748; [, D7 39, 05] +0749; [, D7 49, 05] +074A; [, D7 59, 05] +093C; [, D7 69, 05] +0901; [, D7 79, 05] +0902; [, D7 89, 05] +0903; [, D7 99, 05] +0951; [, D7 A9, 05] +0952; [, D7 B9, 05] +0953; [, D7 C9, 05] +0954; [, D7 D9, 05] +09BC; [, D7 E9, 05] +0981; [, D7 F9, 05] +0982; [, D8 0D, 05] +0983; [, D8 1D, 05] +0A3C; [, D8 2D, 05] +0A01; [, D8 3D, 05] +0A02; [, D8 4D, 05] +0A03; [, D8 5D, 05] +0A70; [, D8 6D, 05] +0A71; [, D8 7D, 05] +0ABC; [, D8 8D, 05] +0A81; [, D8 9D, 05] +0A82; [, D8 AD, 05] +0A83; [, D8 BD, 05] +0B3C; [, D8 CD, 05] +0B01; [, D8 DD, 05] +0B02; [, D8 ED, 05] +0B03; [, D8 FD, 05] +0B82; [, D9 11, 05] +0C01; [, D9 21, 05] +0C02; [, D9 31, 05] +0C03; [, D9 41, 05] +0CBC; [, D9 51, 05] +0C82; [, D9 61, 05] +0C83; [, D9 71, 05] +0D02; [, D9 81, 05] +0D03; [, D9 91, 05] +0D82; [, D9 A1, 05] +0D83; [, D9 B1, 05] +0E47; [, D9 C1, 05] +0E48; [, D9 D1, 05] +0E49; [, D9 E1, 05] +0E4A; [, D9 F1, 05] +0E4B; [, DA 05, 05] +0EC8; [, DA 15, 05] +0EC9; [, DA 25, 05] +0ECA; [, DA 35, 05] +0ECB; [, DA 45, 05] +0F39; [, DA 55, 05] +0F7E; [, DA 65, 05] +0F7F; [, DA 75, 05] +1036; [, DA 85, 05] +1037; [, DA 95, 05] +1038; [, DA A5, 05] +17C6; [, DA B5, 05] +17C7; [, DA C5, 05] +17C8; [, DA D5, 05] +17C9; [, DA E5, 05] +17CA; [, DA F5, 05] +17CB; [, DB 09, 05] +17CC; [, DB 19, 05] +17CD; [, DB 29, 05] +17CE; [, DB 39, 05] +17CF; [, DB 49, 05] +17D0; [, DB 59, 05] +17D1; [, DB 69, 05] +17D3; [, DB 79, 05] +17DD; [, DB 89, 05] +1939; [, DB 99, 05] +193A; [, DB A9, 05] +193B; [, DB B9, 05] +302A; [, DB C9, 05] +302B; [, DB D9, 05] +302C; [, DB E9, 05] +302D; [, DB F9, 05] +302E; [, DC 0D, 05] +302F; [, DC 1D, 05] +3099; [, DC 2D, 05] +FF9E; [, DC 2D, A3] +309A; [, DC 3D, 05] +FF9F; [, DC 3D, A3] +20D0; [, DC 4D, 05] +20D1; [, DC 5D, 05] +20D2; [, DC 6D, 05] +20D3; [, DC 7D, 05] +20D4; [, DC 8D, 05] +20D5; [, DC 9D, 05] +20D6; [, DC AD, 05] +20D7; [, DC BD, 05] +20D8; [, DC CD, 05] +20D9; [, DC DD, 05] +20DA; [, DC ED, 05] +20DB; [, DC FD, 05] +20DC; [, DD 11, 05] +20DD; [, DD 21, 05] +20DE; [, DD 31, 05] +20DF; [, DD 41, 05] +20E0; [, DD 51, 05] +20E1; [, DD 61, 05] +20E2; [, DF 79, 05] +20E3; [, DF 89, 05] +20E4; [, DF 99, 05] +20E5; [, DF A9, 05] +20E6; [, E0 3D, 05] +20E7; [, E0 4D, 05] +20E8; [, E0 5D, 05] +20E9; [, E0 6D, 05] +20EA; [, E0 7D, 05] # START OF VARIABLE SECTION!!! @@ -658,6 +960,7 @@ FF9F; [, DC 0D, A3] 2008; [06, 05, 09] 2009; [06, 05, 09] 200A; [06, 05, 09] +205F; [06, 05, 09] 00A0; [06, 05, 35] 2007; [06, 05, 35] 202F; [06, 05, 35] @@ -759,16487 +1062,22437 @@ FE31; [07 9C, 05, 2B] 2015; [07 9E, 05, 05] -301C; [07 A0, 05, 05] +2053; [07 A0, 05, 05] + +301C; [07 A2, 05, 05] + +3030; [07 A4, 05, 05] + +30A0; [07 A6, 05, 05] + +30FB; [07 A8, 05, 05] +FF65; [07 A8, 05, A3] + +002C; [07 AA, 05, 05] +FF0C; [07 AA, 05, 07] +FE50; [07 AA, 05, 1D] + +055D; [07 AC, 05, 05] + +060C; [07 AE, 05, 05] + +060D; [07 B0, 05, 05] + +066B; [07 B2, 05, 05] + +066C; [07 B4, 05, 05] + +1802; [07 B6, 05, 05] + +1808; [07 B8, 05, 05] + +3001; [07 BA, 05, 05] +FE51; [07 BA, 05, 1D] +FF64; [07 BA, 05, A3] + +FE45; [07 BC, 05, 05] + +FE46; [07 BE, 05, 05] + +003B; [07 C0, 05, 05] +037E; [07 C0, 05, 05] +FF1B; [07 C0, 05, 07] +FE54; [07 C0, 05, 1D] + +061B; [07 C2, 05, 05] + +204F; [07 C4, 05, 05] + +003A; [07 C6, 05, 05] +FF1A; [07 C6, 05, 07] +FE55; [07 C6, 05, 1D] +2A74; [07 C6, 05, 09][07 C6, 05, 09][0B BD, 05, 3D] + +0589; [07 C8, 05, 05] + +0703; [07 CA, 05, 05] + +0704; [07 CC, 05, 05] + +0705; [07 CE, 05, 05] + +0706; [07 D0, 05, 05] + +0707; [07 D2, 05, 05] + +0708; [07 D4, 05, 05] + +1361; [07 D6, 05, 05] + +1363; [07 D8, 05, 05] + +1364; [07 DA, 05, 05] + +1365; [07 DC, 05, 05] + +1366; [07 DE, 05, 05] + +1804; [07 E0, 05, 05] + +1805; [07 E2, 05, 05] + +0F14; [07 E4, 05, 05] + +17D6; [07 E6, 05, 05] + +16EB; [07 E8, 05, 05] + +16EC; [07 EA, 05, 05] + +16ED; [07 EC, 05, 05] + +0021; [07 EE, 05, 05] +FF01; [07 EE, 05, 07] +FE57; [07 EE, 05, 1D] +203C; [07 EE, 05, 09][07 EE, 05, 09] +2049; [07 EE, 05, 09][07 F6, 05, 09] + +00A1; [07 F0, 05, 05] + +055C; [07 F2, 05, 05] + +1944; [07 F4, 05, 05] + +003F; [07 F6, 05, 05] +FF1F; [07 F6, 05, 07] +FE56; [07 F6, 05, 1D] +2048; [07 F6, 05, 09][07 EE, 05, 09] +2047; [07 F6, 05, 09][07 F6, 05, 09] + +00BF; [07 F8, 05, 05] + +055E; [07 FA, 05, 05] + +061F; [07 FC, 05, 05] + +0709; [07 FE, 05, 05] + +1367; [08 05, 05, 05] + +1945; [08 07, 05, 05] + +203D; [08 09, 05, 05] + +002E; [08 0B, 05, 05] +FF0E; [08 0B, 05, 07] +2024; [08 0B, 05, 09] +FE52; [08 0B, 05, 1D] +2025; [08 0B, 05, 09][08 0B, 05, 09] +FE30; [08 0B, 05, 2B][08 0B, 05, 2B] +2026; [08 0B, 05, 09][08 0B, 05, 09][08 0B, 05, 3D] + +1801; [08 0D, 05, 05] + +06D4; [08 0F, 05, 05] + +0701; [08 11, 05, 05] + +0702; [08 13, 05, 05] + +1362; [08 15, 05, 05] + +1803; [08 17, 05, 05] + +1809; [08 19, 05, 05] + +166E; [08 1B, 05, 05] + +3002; [08 1D, 05, 05] +FF61; [08 1D, 05, A3] + +00B7; [08 1F, 05, 05] +0387; [08 1F, 05, 05] + +0964; [08 21, 05, 05] + +0965; [08 23, 05, 05] + +1735; [08 25, 05, 05] + +1736; [08 27, 05, 05] + +104A; [08 29, 05, 05] + +104B; [08 2B, 05, 05] + +17D4; [08 2D, 05, 05] + +17D5; [08 2F, 05, 05] + +0700; [08 31, 05, 05] + +10FB; [08 33, 05, 05] + +1368; [08 35, 05, 05] + +D800 DD00; [08 37, 05, 05] + +D800 DD01; [08 39, 05, 05] + +D800 DD02; [08 3B, 05, 05] + +D800 DF9F; [08 3D, 05, 05] + +0027; [08 3F, 05, 05] +FF07; [08 3F, 05, 07] + +2018; [08 41, 05, 05] + +2019; [08 43, 05, 05] + +201A; [08 45, 05, 05] + +201B; [08 47, 05, 05] + +2039; [08 49, 05, 05] + +203A; [08 4B, 05, 05] + +0022; [08 4D, 05, 05] +FF02; [08 4D, 05, 07] + +201C; [08 4F, 05, 05] + +201D; [08 51, 05, 05] + +201E; [08 53, 05, 05] + +201F; [08 55, 05, 05] + +301D; [08 57, 05, 05] + +301E; [08 59, 05, 05] + +301F; [08 5B, 05, 05] + +00AB; [08 5D, 05, 05] + +00BB; [08 5F, 05, 05] + +0028; [08 61, 05, 05] +FF08; [08 61, 05, 07] +FE59; [08 61, 05, 1D] +207D; [08 61, 05, 27] +208D; [08 61, 05, 29] +FE35; [08 61, 05, 2B] +2474; [08 61, 05, 09][23 72, 05, 09][08 63, 05, 3D] +247D; [08 61, 05, 09][23 72, 05, 09][23 70, 05, 3D][08 63, 05, 3D] +247E; [08 61, 05, 09][23 72, 05, 09][23 72, 05, 3D][08 63, 05, 3D] +247F; [08 61, 05, 09][23 72, 05, 09][23 74, 05, 3D][08 63, 05, 3D] +2480; [08 61, 05, 09][23 72, 05, 09][23 76, 05, 3D][08 63, 05, 3D] +2481; [08 61, 05, 09][23 72, 05, 09][23 78, 05, 3D][08 63, 05, 3D] +2482; [08 61, 05, 09][23 72, 05, 09][23 7A, 05, 3D][08 63, 05, 3D] +2483; [08 61, 05, 09][23 72, 05, 09][23 7C, 05, 3D][08 63, 05, 3D] +2484; [08 61, 05, 09][23 72, 05, 09][23 7E, 05, 3D][08 63, 05, 3D] +2485; [08 61, 05, 09][23 72, 05, 09][23 80, 05, 3D][08 63, 05, 3D] +2486; [08 61, 05, 09][23 72, 05, 09][23 82, 05, 3D][08 63, 05, 3D] +2475; [08 61, 05, 09][23 74, 05, 09][08 63, 05, 3D] +2487; [08 61, 05, 09][23 74, 05, 09][23 70, 05, 3D][08 63, 05, 3D] +2476; [08 61, 05, 09][23 76, 05, 09][08 63, 05, 3D] +2477; [08 61, 05, 09][23 78, 05, 09][08 63, 05, 3D] +2478; [08 61, 05, 09][23 7A, 05, 09][08 63, 05, 3D] +2479; [08 61, 05, 09][23 7C, 05, 09][08 63, 05, 3D] +247A; [08 61, 05, 09][23 7E, 05, 09][08 63, 05, 3D] +247B; [08 61, 05, 09][23 80, 05, 09][08 63, 05, 3D] +247C; [08 61, 05, 09][23 82, 05, 09][08 63, 05, 3D] +249C; [08 61, 05, 09][26, 05, 09][08 63, 05, 3D] +249D; [08 61, 05, 09][28, 05, 09][08 63, 05, 3D] +249E; [08 61, 05, 09][2A, 05, 09][08 63, 05, 3D] +249F; [08 61, 05, 09][2C, 05, 09][08 63, 05, 3D] +24A0; [08 61, 05, 09][2E, 05, 09][08 63, 05, 3D] +24A1; [08 61, 05, 09][30, 05, 09][08 63, 05, 3D] +24A2; [08 61, 05, 09][32, 05, 09][08 63, 05, 3D] +24A3; [08 61, 05, 09][34, 05, 09][08 63, 05, 3D] +24A4; [08 61, 05, 09][36, 05, 09][08 63, 05, 3D] +24A5; [08 61, 05, 09][38, 05, 09][08 63, 05, 3D] +24A6; [08 61, 05, 09][3A, 05, 09][08 63, 05, 3D] +24A7; [08 61, 05, 09][3C, 05, 09][08 63, 05, 3D] +24A8; [08 61, 05, 09][3E, 05, 09][08 63, 05, 3D] +24A9; [08 61, 05, 09][40, 05, 09][08 63, 05, 3D] +24AA; [08 61, 05, 09][42, 05, 09][08 63, 05, 3D] +24AB; [08 61, 05, 09][44, 05, 09][08 63, 05, 3D] +24AC; [08 61, 05, 09][46, 05, 09][08 63, 05, 3D] +24AD; [08 61, 05, 09][48, 05, 09][08 63, 05, 3D] +24AE; [08 61, 05, 09][4A, 05, 09][08 63, 05, 3D] +24AF; [08 61, 05, 09][4C, 05, 09][08 63, 05, 3D] +24B0; [08 61, 05, 09][4E, 05, 09][08 63, 05, 3D] +24B1; [08 61, 05, 09][50, 05, 09][08 63, 05, 3D] +24B2; [08 61, 05, 09][52, 05, 09][08 63, 05, 3D] +24B3; [08 61, 05, 09][54, 05, 09][08 63, 05, 3D] +24B4; [08 61, 05, 09][56, 05, 09][08 63, 05, 3D] +24B5; [08 61, 05, 09][58, 05, 09][08 63, 05, 3D] +3200; [08 61, 05, 09][87 20, 05, 09][08 63, 05, 3D] +320E; [08 61, 05, 09][87 20, 05, 09][87 48, 05, 3D][08 63, 05, 3D] +3201; [08 61, 05, 09][87 24, 05, 09][08 63, 05, 3D] +320F; [08 61, 05, 09][87 24, 05, 09][87 48, 05, 3D][08 63, 05, 3D] +3202; [08 61, 05, 09][87 26, 05, 09][08 63, 05, 3D] +3210; [08 61, 05, 09][87 26, 05, 09][87 48, 05, 3D][08 63, 05, 3D] +3203; [08 61, 05, 09][87 2A, 05, 09][08 63, 05, 3D] +3211; [08 61, 05, 09][87 2A, 05, 09][87 48, 05, 3D][08 63, 05, 3D] +3204; [08 61, 05, 09][87 2C, 05, 09][08 63, 05, 3D] +3212; [08 61, 05, 09][87 2C, 05, 09][87 48, 05, 3D][08 63, 05, 3D] +3205; [08 61, 05, 09][87 2E, 05, 09][08 63, 05, 3D] +3213; [08 61, 05, 09][87 2E, 05, 09][87 48, 05, 3D][08 63, 05, 3D] +3206; [08 61, 05, 09][87 32, 05, 09][08 63, 05, 3D] +3214; [08 61, 05, 09][87 32, 05, 09][87 48, 05, 3D][08 63, 05, 3D] +3207; [08 61, 05, 09][87 36, 05, 09][08 63, 05, 3D] +3215; [08 61, 05, 09][87 36, 05, 09][87 48, 05, 3D][08 63, 05, 3D] +321D; [08 61, 05, 09][87 36, 05, 09][87 58, 05, 3D][87 38, 05, 3D][87 50, 05, 3D][87 7A, 05, 3D][08 63, 05, 3D] +321E; [08 61, 05, 09][87 36, 05, 09][87 58, 05, 3D][87 44, 05, 3D][87 62, 05, 3D][08 63, 05, 3D] +3208; [08 61, 05, 09][87 38, 05, 09][08 63, 05, 3D] +3216; [08 61, 05, 09][87 38, 05, 09][87 48, 05, 3D][08 63, 05, 3D] +321C; [08 61, 05, 09][87 38, 05, 09][87 62, 05, 3D][08 63, 05, 3D] +3209; [08 61, 05, 09][87 3C, 05, 09][08 63, 05, 3D] +3217; [08 61, 05, 09][87 3C, 05, 09][87 48, 05, 3D][08 63, 05, 3D] +320A; [08 61, 05, 09][87 3E, 05, 09][08 63, 05, 3D] +3218; [08 61, 05, 09][87 3E, 05, 09][87 48, 05, 3D][08 63, 05, 3D] +320B; [08 61, 05, 09][87 40, 05, 09][08 63, 05, 3D] +3219; [08 61, 05, 09][87 40, 05, 09][87 48, 05, 3D][08 63, 05, 3D] +320C; [08 61, 05, 09][87 42, 05, 09][08 63, 05, 3D] +321A; [08 61, 05, 09][87 42, 05, 09][87 48, 05, 3D][08 63, 05, 3D] +320D; [08 61, 05, 09][87 44, 05, 09][08 63, 05, 3D] +321B; [08 61, 05, 09][87 44, 05, 09][87 48, 05, 3D][08 63, 05, 3D] +3220; [08 61, 05, 09][E0 04 06, 05, 09][08 63, 05, 3D] +3226; [08 61, 05, 09][E0 04 0C, 05, 09][08 63, 05, 3D] +3222; [08 61, 05, 09][E0 04 18, 05, 09][08 63, 05, 3D] +3228; [08 61, 05, 09][E0 04 C0, 05, 09][08 63, 05, 3D] +3221; [08 61, 05, 09][E0 05 24, 05, 09][08 63, 05, 3D] +3224; [08 61, 05, 09][E0 05 34, 05, 09][08 63, 05, 3D] +3239; [08 61, 05, 09][E0 05 D2, 05, 09][08 63, 05, 3D] +323D; [08 61, 05, 09][E0 06 14, 05, 09][08 63, 05, 3D] +3241; [08 61, 05, 09][E0 06 34, 05, 09][08 63, 05, 3D] +3227; [08 61, 05, 09][E0 0B 06, 05, 09][08 63, 05, 3D] +3225; [08 61, 05, 09][E0 0B 0A, 05, 09][08 63, 05, 3D] +3238; [08 61, 05, 09][E0 0D A4, 05, 09][08 63, 05, 3D] +3229; [08 61, 05, 09][E0 0E C4, 05, 09][08 63, 05, 3D] +323F; [08 61, 05, 09][E0 0E EA, 05, 09][08 63, 05, 3D] +3234; [08 61, 05, 09][E0 10 68, 05, 09][08 63, 05, 3D] +323A; [08 61, 05, 09][E0 11 4C, 05, 09][08 63, 05, 3D] +3223; [08 61, 05, 09][E0 16 28, 05, 09][08 63, 05, 3D] +322F; [08 61, 05, 09][E0 16 B0, 05, 09][08 63, 05, 3D] +323B; [08 61, 05, 09][E0 1F 74, 05, 09][08 63, 05, 3D] +3230; [08 61, 05, 09][E0 34 F0, 05, 09][08 63, 05, 3D] +322A; [08 61, 05, 09][E0 37 48, 05, 09][08 63, 05, 3D] +3232; [08 61, 05, 09][E0 37 4A, 05, 09][08 63, 05, 3D] +322D; [08 61, 05, 09][E0 37 88, 05, 09][08 63, 05, 3D] +3231; [08 61, 05, 09][E0 39 98, 05, 09][08 63, 05, 3D] +322C; [08 61, 05, 09][E0 41 DC, 05, 09][08 63, 05, 3D] +322B; [08 61, 05, 09][E0 4A 80, 05, 09][08 63, 05, 3D] +3235; [08 61, 05, 09][E0 4E B4, 05, 09][08 63, 05, 3D] +323C; [08 61, 05, 09][E0 57 BE, 05, 09][08 63, 05, 3D] +3233; [08 61, 05, 09][E0 5C 92, 05, 09][08 63, 05, 3D] +3237; [08 61, 05, 09][E0 5C D0, 05, 09][08 63, 05, 3D] +3240; [08 61, 05, 09][E0 5C F0, 05, 09][08 63, 05, 3D] +3242; [08 61, 05, 09][E0 6E 56, 05, 09][08 63, 05, 3D] +3243; [08 61, 05, 09][E0 6E 68, 05, 09][08 63, 05, 3D] +3236; [08 61, 05, 09][E0 84 48, 05, 09][08 63, 05, 3D] +323E; [08 61, 05, 09][E0 84 94, 05, 09][08 63, 05, 3D] +322E; [08 61, 05, 09][E0 8E E4, 05, 09][08 63, 05, 3D] + +0029; [08 63, 05, 05] +FF09; [08 63, 05, 07] +FE5A; [08 63, 05, 1D] +207E; [08 63, 05, 27] +208E; [08 63, 05, 29] +FE36; [08 63, 05, 2B] + +005B; [08 65, 05, 05] +FF3B; [08 65, 05, 07] +FE47; [08 65, 05, 2B] + +005D; [08 67, 05, 05] +FF3D; [08 67, 05, 07] +FE48; [08 67, 05, 2B] + +007B; [08 69, 05, 05] +FF5B; [08 69, 05, 07] +FE5B; [08 69, 05, 1D] +FE37; [08 69, 05, 2B] + +007D; [08 6B, 05, 05] +FF5D; [08 6B, 05, 07] +FE5C; [08 6B, 05, 1D] +FE38; [08 6B, 05, 2B] + +0F3A; [08 6D, 05, 05] + +0F3B; [08 6F, 05, 05] + +0F3C; [08 71, 05, 05] + +0F3D; [08 73, 05, 05] + +169B; [08 75, 05, 05] + +169C; [08 77, 05, 05] + +2045; [08 79, 05, 05] + +2046; [08 7B, 05, 05] + +29FC; [08 7D, 05, 05] + +29FD; [08 7F, 05, 05] + +2983; [08 81, 05, 05] + +2984; [08 83, 05, 05] + +2985; [08 85, 05, 05] +FF5F; [08 85, 05, 07] + +2986; [08 87, 05, 05] +FF60; [08 87, 05, 07] + +2987; [08 89, 05, 05] + +2988; [08 8B, 05, 05] + +2989; [08 8D, 05, 05] + +298A; [08 8F, 05, 05] + +298B; [08 91, 05, 05] + +298C; [08 93, 05, 05] + +298D; [08 95, 05, 05] + +298E; [08 97, 05, 05] + +298F; [08 99, 05, 05] + +2990; [08 9B, 05, 05] + +2991; [08 9D, 05, 05] + +2992; [08 9F, 05, 05] + +2993; [08 A1, 05, 05] + +2994; [08 A3, 05, 05] + +2995; [08 A5, 05, 05] + +2996; [08 A7, 05, 05] + +2997; [08 A9, 05, 05] + +2998; [08 AB, 05, 05] + +2329; [08 AD, 05, 05] +3008; [08 AD, 05, 05] +FE3F; [08 AD, 05, 2B] + +232A; [08 AF, 05, 05] +3009; [08 AF, 05, 05] +FE40; [08 AF, 05, 2B] + +300A; [08 B1, 05, 05] +FE3D; [08 B1, 05, 2B] + +300B; [08 B3, 05, 05] +FE3E; [08 B3, 05, 2B] + +300C; [08 B5, 05, 05] +FF62; [08 B5, 05, A3] +FE41; [08 B5, 05, 2B] + +300D; [08 B7, 05, 05] +FF63; [08 B7, 05, A3] +FE42; [08 B7, 05, 2B] + +300E; [08 B9, 05, 05] +FE43; [08 B9, 05, 2B] + +300F; [08 BB, 05, 05] +FE44; [08 BB, 05, 2B] + +3010; [08 BD, 05, 05] +FE3B; [08 BD, 05, 2B] + +3011; [08 BF, 05, 05] +FE3C; [08 BF, 05, 2B] + +3014; [08 C1, 05, 05] +FE5D; [08 C1, 05, 1D] +FE39; [08 C1, 05, 2B] + +3015; [08 C3, 05, 05] +FE5E; [08 C3, 05, 1D] +FE3A; [08 C3, 05, 2B] + +3016; [08 C5, 05, 05] + +3017; [08 C7, 05, 05] + +3018; [08 C9, 05, 05] + +3019; [08 CB, 05, 05] + +301A; [08 CD, 05, 05] + +301B; [08 CF, 05, 05] + +FD3E; [08 D1, 05, 05] + +FD3F; [08 D3, 05, 05] + +00A7; [08 D5, 05, 05] + +00B6; [08 D7, 05, 05] + +204B; [08 D9, 05, 05] + +00A9; [08 DB, 05, 05] + +00AE; [08 DD, 05, 05] + +0040; [08 DF, 05, 05] +FF20; [08 DF, 05, 07] +FE6B; [08 DF, 05, 1D] + +002A; [08 E1, 05, 05] +FF0A; [08 E1, 05, 07] +FE61; [08 E1, 05, 1D] + +204E; [08 E3, 05, 05] + +2051; [08 E5, 05, 05] + +066D; [08 E7, 05, 05] + +002F; [08 E9, 05, 05] +FF0F; [08 E9, 05, 07] + +2044; [08 EB, 05, 05] + +005C; [08 ED, 05, 05] +FF3C; [08 ED, 05, 07] +FE68; [08 ED, 05, 1D] + +0026; [08 EF, 05, 05] +FF06; [08 EF, 05, 07] +FE60; [08 EF, 05, 1D] + +214B; [08 F1, 05, 05] + +204A; [08 F3, 05, 05] + +0023; [08 F5, 05, 05] +FF03; [08 F5, 05, 07] +FE5F; [08 F5, 05, 1D] + +0025; [08 F7, 05, 05] +FF05; [08 F7, 05, 07] +FE6A; [08 F7, 05, 1D] + +066A; [08 F9, 05, 05] + +2030; [08 FB, 05, 05] + +2031; [08 FD, 05, 05] + +2052; [09 05, 05, 05] + +2020; [09 07, 05, 05] + +2021; [09 09, 05, 05] + +2022; [09 0B, 05, 05] + +2023; [09 0D, 05, 05] + +2027; [09 0F, 05, 05] + +2043; [09 11, 05, 05] + +204C; [09 13, 05, 05] + +204D; [09 15, 05, 05] + +2032; [09 17, 05, 05] +2033; [09 17, 05, 09][09 17, 05, 09] +2034; [09 17, 05, 09][09 17, 05, 09][09 17, 05, 3D] +2057; [09 17, 05, 09][09 17, 05, 09][09 17, 05, 3D][09 17, 05, 3D] + +2035; [09 19, 05, 05] +2036; [09 19, 05, 09][09 19, 05, 09] +2037; [09 19, 05, 09][09 19, 05, 09][09 19, 05, 3D] + +3003; [09 1B, 05, 05] + +303D; [09 1D, 05, 05] + +2038; [09 1F, 05, 05] + +203B; [09 21, 05, 05] + +203F; [09 23, 05, 05] + +2054; [09 25, 05, 05] + +2040; [09 27, 05, 05] + +2050; [09 29, 05, 05] + +2041; [09 2B, 05, 05] + +2042; [09 2D, 05, 05] + +055A; [09 2F, 05, 05] + +055B; [09 31, 05, 05] + +055F; [09 33, 05, 05] + +05BE; [09 35, 05, 05] + +05C0; [09 37, 05, 05] + +05C3; [09 39, 05, 05] + +05F3; [09 3B, 05, 05] + +05F4; [09 3D, 05, 05] + +070A; [09 3F, 05, 05] + +070B; [09 41, 05, 05] + +070C; [09 43, 05, 05] + +070D; [09 45, 05, 05] + +1800; [09 47, 05, 05] + +180A; [09 49, 05, 05] + +0970; [09 4B, 05, 05] + +0DF4; [09 4D, 05, 05] + +0E5A; [09 4F, 05, 05] + +0E5B; [09 51, 05, 05] + +0F04; [09 53, 05, 05] + +0F05; [09 55, 05, 05] + +0F06; [09 57, 05, 05] + +0F07; [09 59, 05, 05] + +0F08; [09 5B, 05, 05] + +0F09; [09 5D, 05, 05] + +0F0A; [09 5F, 05, 05] + +0F0B; [09 61, 05, 05] +0F0C; [09 61, 05, 35] + +0F0D; [09 63, 05, 05] + +0F0E; [09 65, 05, 05] + +0F0F; [09 67, 05, 05] + +0F10; [09 69, 05, 05] + +0F11; [09 6B, 05, 05] + +0F12; [09 6D, 05, 05] + +0F85; [09 6F, 05, 05] + +1940; [09 71, 05, 05] + +104C; [09 73, 05, 05] + +104D; [09 75, 05, 05] + +104E; [09 77, 05, 05] + +104F; [09 79, 05, 05] + +17D7; [09 7B, 05, 05] + +17D8; [09 7D, 05, 05] + +17D9; [09 7F, 05, 05] + +17DA; [09 81, 05, 05] + +166D; [09 83, 05, 05] + +02B9; [09 85, 05, 05] +0374; [09 85, 05, 05] + +0375; [09 87, 05, 05] + +02BA; [09 89, 05, 05] + +02C2; [09 8B, 05, 05] + +02C3; [09 8D, 05, 05] + +02C4; [09 8F, 05, 05] + +02C5; [09 91, 05, 05] + +02C6; [09 93, 05, 05] + +02C7; [09 95, 05, 05] + +02C8; [09 97, 05, 05] + +02C9; [09 99, 05, 05] + +02CA; [09 9B, 05, 05] + +02CB; [09 9D, 05, 05] + +02CC; [09 9F, 05, 05] + +02CD; [09 A1, 05, 05] + +02CE; [09 A3, 05, 05] + +02CF; [09 A5, 05, 05] + +02D2; [09 A7, 05, 05] + +02D3; [09 A9, 05, 05] + +02D4; [09 AB, 05, 05] + +02D5; [09 AD, 05, 05] + +02D6; [09 AF, 05, 05] + +02D7; [09 B1, 05, 05] + +02DE; [09 B3, 05, 05] + +02DF; [09 B5, 05, 05] + +02E5; [09 B7, 05, 05] + +02E6; [09 B9, 05, 05] + +02E7; [09 BB, 05, 05] + +02E8; [09 BD, 05, 05] + +02E9; [09 BF, 05, 05] + +02EA; [09 C1, 05, 05] + +02EB; [09 C3, 05, 05] + +02EC; [09 C5, 05, 05] + +02ED; [09 C7, 05, 05] + +02EF; [09 C9, 05, 05] + +02F0; [09 CB, 05, 05] + +02F1; [09 CD, 05, 05] + +02F2; [09 CF, 05, 05] + +02F3; [09 D1, 05, 05] + +02F4; [09 D3, 05, 05] + +02F5; [09 D5, 05, 05] + +02F6; [09 D7, 05, 05] + +02F7; [09 D9, 05, 05] + +02F8; [09 DB, 05, 05] + +02F9; [09 DD, 05, 05] + +02FA; [09 DF, 05, 05] + +02FB; [09 E1, 05, 05] + +02FC; [09 E3, 05, 05] + +02FD; [09 E5, 05, 05] + +02FE; [09 E7, 05, 05] + +02FF; [09 E9, 05, 05] + +00B0; [09 EB, 05, 05] +2103; [09 EB, 05, 09][2A, 05, 93] +2109; [09 EB, 05, 09][30, 05, 93] + +0482; [09 ED, 05, 05] + +060E; [09 EF, 05, 05] + +060F; [09 F1, 05, 05] + +06E9; [09 F3, 05, 05] + +FDFD; [09 F5, 05, 05] + +09FA; [09 F7, 05, 05] + +0B70; [09 F9, 05, 05] + +0BF3; [09 FB, 05, 05] + +0BF4; [09 FD, 05, 05] + +0BF5; [0A 05, 05, 05] + +0BF6; [0A 07, 05, 05] + +0BF7; [0A 09, 05, 05] + +0BF8; [0A 0B, 05, 05] + +0BFA; [0A 0D, 05, 05] + +0E4F; [0A 0F, 05, 05] + +0F01; [0A 11, 05, 05] + +0F02; [0A 13, 05, 05] + +0F03; [0A 15, 05, 05] + +0F13; [0A 17, 05, 05] + +0F15; [0A 19, 05, 05] + +0F16; [0A 1B, 05, 05] + +0F17; [0A 1D, 05, 05] + +0F1A; [0A 1F, 05, 05] + +0F1B; [0A 21, 05, 05] + +0F1C; [0A 23, 05, 05] + +0F1D; [0A 25, 05, 05] + +0F1E; [0A 27, 05, 05] + +0F1F; [0A 29, 05, 05] + +0F34; [0A 2B, 05, 05] + +0F36; [0A 2D, 05, 05] + +0F38; [0A 2F, 05, 05] + +0F3E; [0A 31, 05, 05] + +0F3F; [0A 33, 05, 05] + +0FBE; [0A 35, 05, 05] + +0FBF; [0A 37, 05, 05] + +0FC0; [0A 39, 05, 05] + +0FC1; [0A 3B, 05, 05] + +0FC2; [0A 3D, 05, 05] + +0FC3; [0A 3F, 05, 05] + +0FC4; [0A 41, 05, 05] + +0FC5; [0A 43, 05, 05] + +0FC7; [0A 45, 05, 05] + +0FC8; [0A 47, 05, 05] + +0FC9; [0A 49, 05, 05] + +0FCA; [0A 4B, 05, 05] + +0FCB; [0A 4D, 05, 05] + +0FCC; [0A 4F, 05, 05] + +0FCF; [0A 51, 05, 05] + +19E0; [0A 53, 05, 05] + +19E1; [0A 55, 05, 05] + +19E2; [0A 57, 05, 05] + +19E3; [0A 59, 05, 05] + +19E4; [0A 5B, 05, 05] + +19E5; [0A 5D, 05, 05] + +19E6; [0A 5F, 05, 05] + +19E7; [0A 61, 05, 05] + +19E8; [0A 63, 05, 05] + +19E9; [0A 65, 05, 05] + +19EA; [0A 67, 05, 05] + +19EB; [0A 69, 05, 05] + +19EC; [0A 6B, 05, 05] + +19ED; [0A 6D, 05, 05] + +19EE; [0A 6F, 05, 05] + +19EF; [0A 71, 05, 05] + +19F0; [0A 73, 05, 05] + +19F1; [0A 75, 05, 05] + +19F2; [0A 77, 05, 05] + +19F3; [0A 79, 05, 05] + +19F4; [0A 7B, 05, 05] + +19F5; [0A 7D, 05, 05] + +19F6; [0A 7F, 05, 05] + +19F7; [0A 81, 05, 05] + +19F8; [0A 83, 05, 05] + +19F9; [0A 85, 05, 05] + +19FA; [0A 87, 05, 05] + +19FB; [0A 89, 05, 05] + +19FC; [0A 8B, 05, 05] + +19FD; [0A 8D, 05, 05] + +19FE; [0A 8F, 05, 05] + +19FF; [0A 91, 05, 05] + +2104; [0A 93, 05, 05] + +2108; [0A 95, 05, 05] + +2114; [0A 97, 05, 05] + +2117; [0A 99, 05, 05] + +2118; [0A 9B, 05, 05] + +211E; [0A 9D, 05, 05] + +211F; [0A 9F, 05, 05] + +2123; [0A A1, 05, 05] + +2125; [0A A3, 05, 05] + +2127; [0A A5, 05, 05] + +2129; [0A A7, 05, 05] + +212E; [0A A9, 05, 05] + +2132; [0A AB, 05, 05] + +213A; [0A AD, 05, 05] + +2141; [0A AF, 05, 05] + +2142; [0A B1, 05, 05] + +2143; [0A B3, 05, 05] + +2144; [0A B5, 05, 05] + +214A; [0A B7, 05, 05] + +2190; [0A B9, 05, 05] +FFE9; [0A B9, 05, A3] +219A; [0A B9, 05, 05][, A5, 05] + +2192; [0A BB, 05, 05] +FFEB; [0A BB, 05, A3] +219B; [0A BB, 05, 05][, A5, 05] + +2191; [0A BD, 05, 05] +FFEA; [0A BD, 05, A3] + +2193; [0A BF, 05, 05] +FFEC; [0A BF, 05, A3] + +2194; [0A C1, 05, 05] +21AE; [0A C1, 05, 05][, A5, 05] + +2195; [0A C3, 05, 05] + +2196; [0A C5, 05, 05] + +2197; [0A C7, 05, 05] + +2198; [0A C9, 05, 05] + +2199; [0A CB, 05, 05] + +219C; [0A CD, 05, 05] + +219D; [0A CF, 05, 05] + +219E; [0A D1, 05, 05] + +219F; [0A D3, 05, 05] + +21A0; [0A D5, 05, 05] + +21A1; [0A D7, 05, 05] + +21A2; [0A D9, 05, 05] + +21A3; [0A DB, 05, 05] + +21A4; [0A DD, 05, 05] + +21A5; [0A DF, 05, 05] + +21A6; [0A E1, 05, 05] + +21A7; [0A E3, 05, 05] + +21A8; [0A E5, 05, 05] + +21A9; [0A E7, 05, 05] + +21AA; [0A E9, 05, 05] + +21AB; [0A EB, 05, 05] + +21AC; [0A ED, 05, 05] + +21AD; [0A EF, 05, 05] + +21AF; [0A F1, 05, 05] + +21B0; [0A F3, 05, 05] + +21B1; [0A F5, 05, 05] + +21B2; [0A F7, 05, 05] + +21B3; [0A F9, 05, 05] + +21B4; [0A FB, 05, 05] + +21B5; [0A FD, 05, 05] + +21B6; [0B 05, 05, 05] + +21B7; [0B 07, 05, 05] + +21B8; [0B 09, 05, 05] + +21B9; [0B 0B, 05, 05] + +21BA; [0B 0D, 05, 05] + +21BB; [0B 0F, 05, 05] + +21BC; [0B 11, 05, 05] + +21BD; [0B 13, 05, 05] + +21BE; [0B 15, 05, 05] + +21BF; [0B 17, 05, 05] + +21C0; [0B 19, 05, 05] + +21C1; [0B 1B, 05, 05] + +21C2; [0B 1D, 05, 05] + +21C3; [0B 1F, 05, 05] + +21C4; [0B 21, 05, 05] + +21C5; [0B 23, 05, 05] + +21C6; [0B 25, 05, 05] + +21C7; [0B 27, 05, 05] + +21C8; [0B 29, 05, 05] + +21C9; [0B 2B, 05, 05] + +21CA; [0B 2D, 05, 05] + +21CB; [0B 2F, 05, 05] + +21CC; [0B 31, 05, 05] + +21D0; [0B 33, 05, 05] +21CD; [0B 33, 05, 05][, A5, 05] + +21D1; [0B 35, 05, 05] + +21D2; [0B 37, 05, 05] +21CF; [0B 37, 05, 05][, A5, 05] + +21D3; [0B 39, 05, 05] + +21D4; [0B 3B, 05, 05] +21CE; [0B 3B, 05, 05][, A5, 05] + +21D5; [0B 3D, 05, 05] + +21D6; [0B 3F, 05, 05] + +21D7; [0B 41, 05, 05] + +21D8; [0B 43, 05, 05] + +21D9; [0B 45, 05, 05] + +21DA; [0B 47, 05, 05] + +21DB; [0B 49, 05, 05] + +21DC; [0B 4B, 05, 05] + +21DD; [0B 4D, 05, 05] + +21DE; [0B 4F, 05, 05] + +21DF; [0B 51, 05, 05] + +21E0; [0B 53, 05, 05] + +21E1; [0B 55, 05, 05] + +21E2; [0B 57, 05, 05] + +21E3; [0B 59, 05, 05] + +21E4; [0B 5B, 05, 05] + +21E5; [0B 5D, 05, 05] + +21E6; [0B 5F, 05, 05] + +21E7; [0B 61, 05, 05] + +21E8; [0B 63, 05, 05] + +21E9; [0B 65, 05, 05] + +21EA; [0B 67, 05, 05] + +21EB; [0B 69, 05, 05] + +21EC; [0B 6B, 05, 05] + +21ED; [0B 6D, 05, 05] + +21EE; [0B 6F, 05, 05] + +21EF; [0B 71, 05, 05] + +21F0; [0B 73, 05, 05] + +21F1; [0B 75, 05, 05] + +21F2; [0B 77, 05, 05] + +21F3; [0B 79, 05, 05] + +21F4; [0B 7B, 05, 05] + +21F5; [0B 7D, 05, 05] + +21F6; [0B 7F, 05, 05] + +21F7; [0B 81, 05, 05] + +21F8; [0B 83, 05, 05] + +21F9; [0B 85, 05, 05] + +21FA; [0B 87, 05, 05] + +21FB; [0B 89, 05, 05] + +21FC; [0B 8B, 05, 05] + +21FD; [0B 8D, 05, 05] + +21FE; [0B 8F, 05, 05] + +21FF; [0B 91, 05, 05] + +2200; [0B 93, 05, 05] + +2201; [0B 95, 05, 05] + +2202; [0B 97, 05, 05] +D835 DEDB; [0B 97, 05, 0B] +D835 DF15; [0B 97, 05, 0B] +D835 DF4F; [0B 97, 05, 0B] +D835 DF89; [0B 97, 05, 0B] +D835 DFC3; [0B 97, 05, 0B] + +2203; [0B 99, 05, 05] +2204; [0B 99, 05, 05][, A5, 05] + +2205; [0B 9B, 05, 05] + +2206; [0B 9D, 05, 05] + +2207; [0B 9F, 05, 05] +D835 DEC1; [0B 9F, 05, 0B] +D835 DEFB; [0B 9F, 05, 0B] +D835 DF35; [0B 9F, 05, 0B] +D835 DF6F; [0B 9F, 05, 0B] +D835 DFA9; [0B 9F, 05, 0B] + +2208; [0B A1, 05, 05] +2209; [0B A1, 05, 05][, A5, 05] + +220A; [0B A3, 05, 05] + +220B; [0B A5, 05, 05] +220C; [0B A5, 05, 05][, A5, 05] + +220D; [0B A7, 05, 05] + +03F6; [0B A9, 05, 05] + +220E; [0B AB, 05, 05] + +220F; [0B AD, 05, 05] + +2210; [0B AF, 05, 05] + +2211; [0B B1, 05, 05] +2140; [0B B1, 05, 0B] + +002B; [0B B3, 05, 05] +FF0B; [0B B3, 05, 07] +FB29; [0B B3, 05, 0B] +FE62; [0B B3, 05, 1D] +207A; [0B B3, 05, 27] +208A; [0B B3, 05, 29] + +00B1; [0B B5, 05, 05] + +00F7; [0B B7, 05, 05] + +00D7; [0B B9, 05, 05] + +003C; [0B BB, 05, 05] +FF1C; [0B BB, 05, 07] +FE64; [0B BB, 05, 1D] +226E; [0B BB, 05, 05][, A5, 05] + +003D; [0B BD, 05, 05] +FF1D; [0B BD, 05, 07] +FE66; [0B BD, 05, 1D] +207C; [0B BD, 05, 27] +208C; [0B BD, 05, 29] +2260; [0B BD, 05, 05][, A5, 05] +2A75; [0B BD, 05, 09][0B BD, 05, 09] +2A76; [0B BD, 05, 09][0B BD, 05, 09][0B BD, 05, 3D] + +003E; [0B BF, 05, 05] +FF1E; [0B BF, 05, 07] +FE65; [0B BF, 05, 1D] +226F; [0B BF, 05, 05][, A5, 05] + +00AC; [0B C1, 05, 05] +FFE2; [0B C1, 05, 07] + +007C; [0B C3, 05, 05] +FF5C; [0B C3, 05, 07] + +00A6; [0B C5, 05, 05] +FFE4; [0B C5, 05, 07] + +2016; [0B C7, 05, 05] + +007E; [0B C9, 05, 05] +FF5E; [0B C9, 05, 07] + +2212; [0B CB, 05, 05] +207B; [0B CB, 05, 27] +208B; [0B CB, 05, 29] + +2213; [0B CD, 05, 05] + +2214; [0B CF, 05, 05] + +2215; [0B D1, 05, 05] + +2216; [0B D3, 05, 05] + +2217; [0B D5, 05, 05] + +2218; [0B D7, 05, 05] + +2219; [0B D9, 05, 05] + +221A; [0B DB, 05, 05] + +221B; [0B DD, 05, 05] + +221C; [0B DF, 05, 05] + +221D; [0B E1, 05, 05] + +221E; [0B E3, 05, 05] + +221F; [0B E5, 05, 05] + +2220; [0B E7, 05, 05] + +2221; [0B E9, 05, 05] + +2222; [0B EB, 05, 05] + +2223; [0B ED, 05, 05] +2224; [0B ED, 05, 05][, A5, 05] + +2225; [0B EF, 05, 05] +2226; [0B EF, 05, 05][, A5, 05] + +2227; [0B F1, 05, 05] + +2228; [0B F3, 05, 05] + +2229; [0B F5, 05, 05] + +222A; [0B F7, 05, 05] + +222B; [0B F9, 05, 05] +222C; [0B F9, 05, 09][0B F9, 05, 09] +222D; [0B F9, 05, 09][0B F9, 05, 09][0B F9, 05, 3D] +2A0C; [0B F9, 05, 09][0B F9, 05, 09][0B F9, 05, 3D][0B F9, 05, 3D] + +222E; [0B FB, 05, 05] +222F; [0B FB, 05, 09][0B FB, 05, 09] +2230; [0B FB, 05, 09][0B FB, 05, 09][0B FB, 05, 3D] + +2231; [0B FD, 05, 05] + +2232; [0C 05, 05, 05] + +2233; [0C 07, 05, 05] + +2234; [0C 09, 05, 05] + +2235; [0C 0B, 05, 05] + +2236; [0C 0D, 05, 05] + +2237; [0C 0F, 05, 05] + +2238; [0C 11, 05, 05] + +2239; [0C 13, 05, 05] + +223A; [0C 15, 05, 05] + +223B; [0C 17, 05, 05] + +223C; [0C 19, 05, 05] +2241; [0C 19, 05, 05][, A5, 05] + +223D; [0C 1B, 05, 05] + +223E; [0C 1D, 05, 05] + +223F; [0C 1F, 05, 05] + +2240; [0C 21, 05, 05] + +2242; [0C 23, 05, 05] + +2243; [0C 25, 05, 05] +2244; [0C 25, 05, 05][, A5, 05] + +2245; [0C 27, 05, 05] +2247; [0C 27, 05, 05][, A5, 05] + +2246; [0C 29, 05, 05] + +2248; [0C 2B, 05, 05] +2249; [0C 2B, 05, 05][, A5, 05] + +224A; [0C 2D, 05, 05] + +224B; [0C 2F, 05, 05] + +224C; [0C 31, 05, 05] + +224D; [0C 33, 05, 05] +226D; [0C 33, 05, 05][, A5, 05] + +224E; [0C 35, 05, 05] + +224F; [0C 37, 05, 05] + +2250; [0C 39, 05, 05] + +2251; [0C 3B, 05, 05] + +2252; [0C 3D, 05, 05] + +2253; [0C 3F, 05, 05] + +2254; [0C 41, 05, 05] + +2255; [0C 43, 05, 05] + +2256; [0C 45, 05, 05] + +2257; [0C 47, 05, 05] + +2258; [0C 49, 05, 05] + +2259; [0C 4B, 05, 05] + +225A; [0C 4D, 05, 05] + +225B; [0C 4F, 05, 05] + +225C; [0C 51, 05, 05] + +225D; [0C 53, 05, 05] + +225E; [0C 55, 05, 05] + +225F; [0C 57, 05, 05] + +2261; [0C 59, 05, 05] +2262; [0C 59, 05, 05][, A5, 05] + +2263; [0C 5B, 05, 05] + +2264; [0C 5D, 05, 05] +2270; [0C 5D, 05, 05][, A5, 05] + +2265; [0C 5F, 05, 05] +2271; [0C 5F, 05, 05][, A5, 05] + +2266; [0C 61, 05, 05] + +2267; [0C 63, 05, 05] + +2268; [0C 65, 05, 05] + +2269; [0C 67, 05, 05] + +226A; [0C 69, 05, 05] + +226B; [0C 6B, 05, 05] + +226C; [0C 6D, 05, 05] + +2272; [0C 6F, 05, 05] +2274; [0C 6F, 05, 05][, A5, 05] + +2273; [0C 71, 05, 05] +2275; [0C 71, 05, 05][, A5, 05] + +2276; [0C 73, 05, 05] +2278; [0C 73, 05, 05][, A5, 05] + +2277; [0C 75, 05, 05] +2279; [0C 75, 05, 05][, A5, 05] + +227A; [0C 77, 05, 05] +2280; [0C 77, 05, 05][, A5, 05] + +227B; [0C 79, 05, 05] +2281; [0C 79, 05, 05][, A5, 05] + +227C; [0C 7B, 05, 05] +22E0; [0C 7B, 05, 05][, A5, 05] + +227D; [0C 7D, 05, 05] +22E1; [0C 7D, 05, 05][, A5, 05] + +227E; [0C 7F, 05, 05] + +227F; [0C 81, 05, 05] + +2282; [0C 83, 05, 05] +2284; [0C 83, 05, 05][, A5, 05] + +2283; [0C 85, 05, 05] +2285; [0C 85, 05, 05][, A5, 05] + +2286; [0C 87, 05, 05] +2288; [0C 87, 05, 05][, A5, 05] + +2287; [0C 89, 05, 05] +2289; [0C 89, 05, 05][, A5, 05] + +228A; [0C 8B, 05, 05] + +228B; [0C 8D, 05, 05] + +228C; [0C 8F, 05, 05] + +228D; [0C 91, 05, 05] + +228E; [0C 93, 05, 05] + +228F; [0C 95, 05, 05] + +2290; [0C 97, 05, 05] + +2291; [0C 99, 05, 05] +22E2; [0C 99, 05, 05][, A5, 05] + +2292; [0C 9B, 05, 05] +22E3; [0C 9B, 05, 05][, A5, 05] + +2293; [0C 9D, 05, 05] + +2294; [0C 9F, 05, 05] + +2295; [0C A1, 05, 05] + +2296; [0C A3, 05, 05] + +2297; [0C A5, 05, 05] + +2298; [0C A7, 05, 05] + +2299; [0C A9, 05, 05] + +229A; [0C AB, 05, 05] + +229B; [0C AD, 05, 05] + +229C; [0C AF, 05, 05] + +229D; [0C B1, 05, 05] + +229E; [0C B3, 05, 05] + +229F; [0C B5, 05, 05] + +22A0; [0C B7, 05, 05] + +22A1; [0C B9, 05, 05] + +22A2; [0C BB, 05, 05] +22AC; [0C BB, 05, 05][, A5, 05] + +22A3; [0C BD, 05, 05] + +22A4; [0C BF, 05, 05] + +22A5; [0C C1, 05, 05] + +22A6; [0C C3, 05, 05] + +22A7; [0C C5, 05, 05] + +22A8; [0C C7, 05, 05] +22AD; [0C C7, 05, 05][, A5, 05] + +22A9; [0C C9, 05, 05] +22AE; [0C C9, 05, 05][, A5, 05] + +22AA; [0C CB, 05, 05] + +22AB; [0C CD, 05, 05] +22AF; [0C CD, 05, 05][, A5, 05] + +22B0; [0C CF, 05, 05] + +22B1; [0C D1, 05, 05] + +22B2; [0C D3, 05, 05] +22EA; [0C D3, 05, 05][, A5, 05] + +22B3; [0C D5, 05, 05] +22EB; [0C D5, 05, 05][, A5, 05] + +22B4; [0C D7, 05, 05] +22EC; [0C D7, 05, 05][, A5, 05] + +22B5; [0C D9, 05, 05] +22ED; [0C D9, 05, 05][, A5, 05] + +22B6; [0C DB, 05, 05] + +22B7; [0C DD, 05, 05] + +22B8; [0C DF, 05, 05] + +22B9; [0C E1, 05, 05] + +22BA; [0C E3, 05, 05] + +22BB; [0C E5, 05, 05] + +22BC; [0C E7, 05, 05] + +22BD; [0C E9, 05, 05] + +22BE; [0C EB, 05, 05] + +22BF; [0C ED, 05, 05] + +22C0; [0C EF, 05, 05] + +22C1; [0C F1, 05, 05] + +22C2; [0C F3, 05, 05] + +22C3; [0C F5, 05, 05] + +22C4; [0C F7, 05, 05] + +22C5; [0C F9, 05, 05] + +22C6; [0C FB, 05, 05] + +22C7; [0C FD, 05, 05] + +22C8; [0D 05, 05, 05] + +22C9; [0D 07, 05, 05] + +22CA; [0D 09, 05, 05] + +22CB; [0D 0B, 05, 05] + +22CC; [0D 0D, 05, 05] + +22CD; [0D 0F, 05, 05] + +22CE; [0D 11, 05, 05] + +22CF; [0D 13, 05, 05] + +22D0; [0D 15, 05, 05] + +22D1; [0D 17, 05, 05] + +22D2; [0D 19, 05, 05] + +22D3; [0D 1B, 05, 05] + +22D4; [0D 1D, 05, 05] + +22D5; [0D 1F, 05, 05] + +22D6; [0D 21, 05, 05] + +22D7; [0D 23, 05, 05] + +22D8; [0D 25, 05, 05] + +22D9; [0D 27, 05, 05] + +22DA; [0D 29, 05, 05] + +22DB; [0D 2B, 05, 05] + +22DC; [0D 2D, 05, 05] + +22DD; [0D 2F, 05, 05] + +22DE; [0D 31, 05, 05] + +22DF; [0D 33, 05, 05] + +22E4; [0D 35, 05, 05] + +22E5; [0D 37, 05, 05] + +22E6; [0D 39, 05, 05] + +22E7; [0D 3B, 05, 05] + +22E8; [0D 3D, 05, 05] + +22E9; [0D 3F, 05, 05] + +22EE; [0D 41, 05, 05] + +22EF; [0D 43, 05, 05] + +22F0; [0D 45, 05, 05] + +22F1; [0D 47, 05, 05] + +22F2; [0D 49, 05, 05] + +22F3; [0D 4B, 05, 05] + +22F4; [0D 4D, 05, 05] + +22F5; [0D 4F, 05, 05] + +22F6; [0D 51, 05, 05] + +22F7; [0D 53, 05, 05] + +22F8; [0D 55, 05, 05] + +22F9; [0D 57, 05, 05] + +22FA; [0D 59, 05, 05] + +22FB; [0D 5B, 05, 05] + +22FC; [0D 5D, 05, 05] + +22FD; [0D 5F, 05, 05] + +22FE; [0D 61, 05, 05] + +22FF; [0D 63, 05, 05] + +2300; [0D 65, 05, 05] + +2301; [0D 67, 05, 05] + +2302; [0D 69, 05, 05] + +2303; [0D 6B, 05, 05] + +2304; [0D 6D, 05, 05] + +2305; [0D 6F, 05, 05] + +2306; [0D 71, 05, 05] + +2307; [0D 73, 05, 05] + +2308; [0D 75, 05, 05] + +2309; [0D 77, 05, 05] + +230A; [0D 79, 05, 05] + +230B; [0D 7B, 05, 05] + +230C; [0D 7D, 05, 05] + +230D; [0D 7F, 05, 05] + +230E; [0D 81, 05, 05] + +230F; [0D 83, 05, 05] + +2310; [0D 85, 05, 05] + +2311; [0D 87, 05, 05] + +2312; [0D 89, 05, 05] + +2313; [0D 8B, 05, 05] + +2314; [0D 8D, 05, 05] + +2315; [0D 8F, 05, 05] + +2316; [0D 91, 05, 05] + +2317; [0D 93, 05, 05] + +2318; [0D 95, 05, 05] + +2319; [0D 97, 05, 05] + +231A; [0D 99, 05, 05] + +231B; [0D 9B, 05, 05] + +231C; [0D 9D, 05, 05] + +231D; [0D 9F, 05, 05] + +231E; [0D A1, 05, 05] + +231F; [0D A3, 05, 05] + +2320; [0D A5, 05, 05] + +2321; [0D A7, 05, 05] + +2322; [0D A9, 05, 05] + +2323; [0D AB, 05, 05] + +2324; [0D AD, 05, 05] + +2325; [0D AF, 05, 05] + +2326; [0D B1, 05, 05] + +2327; [0D B3, 05, 05] + +2328; [0D B5, 05, 05] + +232B; [0D B7, 05, 05] + +232C; [0D B9, 05, 05] + +232D; [0D BB, 05, 05] + +232E; [0D BD, 05, 05] + +232F; [0D BF, 05, 05] + +2330; [0D C1, 05, 05] + +2331; [0D C3, 05, 05] + +2332; [0D C5, 05, 05] + +2333; [0D C7, 05, 05] + +2334; [0D C9, 05, 05] + +2335; [0D CB, 05, 05] + +2336; [0D CD, 05, 05] + +2337; [0D CF, 05, 05] + +2338; [0D D1, 05, 05] + +2339; [0D D3, 05, 05] + +233A; [0D D5, 05, 05] + +233B; [0D D7, 05, 05] + +233C; [0D D9, 05, 05] + +233D; [0D DB, 05, 05] + +233E; [0D DD, 05, 05] + +233F; [0D DF, 05, 05] + +2340; [0D E1, 05, 05] + +2341; [0D E3, 05, 05] + +2342; [0D E5, 05, 05] + +2343; [0D E7, 05, 05] + +2344; [0D E9, 05, 05] + +2345; [0D EB, 05, 05] + +2346; [0D ED, 05, 05] + +2347; [0D EF, 05, 05] + +2348; [0D F1, 05, 05] + +2349; [0D F3, 05, 05] + +234A; [0D F5, 05, 05] + +234B; [0D F7, 05, 05] + +234C; [0D F9, 05, 05] + +234D; [0D FB, 05, 05] + +234E; [0D FD, 05, 05] + +234F; [0E 05, 05, 05] + +2350; [0E 07, 05, 05] + +2351; [0E 09, 05, 05] + +2352; [0E 0B, 05, 05] + +2353; [0E 0D, 05, 05] + +2354; [0E 0F, 05, 05] + +2355; [0E 11, 05, 05] + +2356; [0E 13, 05, 05] + +2357; [0E 15, 05, 05] + +2358; [0E 17, 05, 05] + +2359; [0E 19, 05, 05] + +235A; [0E 1B, 05, 05] + +235B; [0E 1D, 05, 05] + +235C; [0E 1F, 05, 05] + +235D; [0E 21, 05, 05] + +235E; [0E 23, 05, 05] + +235F; [0E 25, 05, 05] + +2360; [0E 27, 05, 05] + +2361; [0E 29, 05, 05] + +2362; [0E 2B, 05, 05] + +2363; [0E 2D, 05, 05] + +2364; [0E 2F, 05, 05] + +2365; [0E 31, 05, 05] + +2366; [0E 33, 05, 05] + +2367; [0E 35, 05, 05] + +2368; [0E 37, 05, 05] + +2369; [0E 39, 05, 05] + +236A; [0E 3B, 05, 05] + +236B; [0E 3D, 05, 05] + +236C; [0E 3F, 05, 05] + +236D; [0E 41, 05, 05] + +236E; [0E 43, 05, 05] + +236F; [0E 45, 05, 05] + +2370; [0E 47, 05, 05] + +2371; [0E 49, 05, 05] + +2372; [0E 4B, 05, 05] + +2373; [0E 4D, 05, 05] + +2374; [0E 4F, 05, 05] + +2375; [0E 51, 05, 05] + +2376; [0E 53, 05, 05] + +2377; [0E 55, 05, 05] + +2378; [0E 57, 05, 05] + +2379; [0E 59, 05, 05] + +237A; [0E 5B, 05, 05] + +237B; [0E 5D, 05, 05] + +237C; [0E 5F, 05, 05] + +237D; [0E 61, 05, 05] + +237E; [0E 63, 05, 05] + +237F; [0E 65, 05, 05] + +2380; [0E 67, 05, 05] + +2381; [0E 69, 05, 05] + +2382; [0E 6B, 05, 05] + +2383; [0E 6D, 05, 05] + +2384; [0E 6F, 05, 05] + +2385; [0E 71, 05, 05] + +2386; [0E 73, 05, 05] + +2387; [0E 75, 05, 05] + +2388; [0E 77, 05, 05] + +2389; [0E 79, 05, 05] + +238A; [0E 7B, 05, 05] + +238B; [0E 7D, 05, 05] + +238C; [0E 7F, 05, 05] + +238D; [0E 81, 05, 05] + +238E; [0E 83, 05, 05] + +238F; [0E 85, 05, 05] + +2390; [0E 87, 05, 05] + +2391; [0E 89, 05, 05] + +2392; [0E 8B, 05, 05] + +2393; [0E 8D, 05, 05] + +2394; [0E 8F, 05, 05] + +2395; [0E 91, 05, 05] + +2396; [0E 93, 05, 05] + +2397; [0E 95, 05, 05] + +2398; [0E 97, 05, 05] + +2399; [0E 99, 05, 05] + +239A; [0E 9B, 05, 05] + +239B; [0E 9D, 05, 05] + +239C; [0E 9F, 05, 05] + +239D; [0E A1, 05, 05] + +239E; [0E A3, 05, 05] + +239F; [0E A5, 05, 05] + +23A0; [0E A7, 05, 05] + +23A1; [0E A9, 05, 05] + +23A2; [0E AB, 05, 05] + +23A3; [0E AD, 05, 05] + +23A4; [0E AF, 05, 05] + +23A5; [0E B1, 05, 05] + +23A6; [0E B3, 05, 05] + +23A7; [0E B5, 05, 05] + +23A8; [0E B7, 05, 05] + +23A9; [0E B9, 05, 05] + +23AA; [0E BB, 05, 05] + +23AB; [0E BD, 05, 05] + +23AC; [0E BF, 05, 05] + +23AD; [0E C1, 05, 05] + +23AE; [0E C3, 05, 05] + +23AF; [0E C5, 05, 05] + +23B0; [0E C7, 05, 05] + +23B1; [0E C9, 05, 05] + +23B2; [0E CB, 05, 05] + +23B3; [0E CD, 05, 05] + +23B4; [0E CF, 05, 05] + +23B5; [0E D1, 05, 05] + +23B6; [0E D3, 05, 05] + +23B7; [0E D5, 05, 05] + +23B8; [0E D7, 05, 05] + +23B9; [0E D9, 05, 05] + +23BA; [0E DB, 05, 05] + +23BB; [0E DD, 05, 05] + +23BC; [0E DF, 05, 05] + +23BD; [0E E1, 05, 05] + +23BE; [0E E3, 05, 05] + +23BF; [0E E5, 05, 05] + +23C0; [0E E7, 05, 05] + +23C1; [0E E9, 05, 05] + +23C2; [0E EB, 05, 05] + +23C3; [0E ED, 05, 05] + +23C4; [0E EF, 05, 05] + +23C5; [0E F1, 05, 05] + +23C6; [0E F3, 05, 05] + +23C7; [0E F5, 05, 05] + +23C8; [0E F7, 05, 05] + +23C9; [0E F9, 05, 05] + +23CA; [0E FB, 05, 05] + +23CB; [0E FD, 05, 05] + +23CC; [0F 05, 05, 05] + +23CD; [0F 07, 05, 05] + +23CE; [0F 09, 05, 05] + +23CF; [0F 0B, 05, 05] + +23D0; [0F 0D, 05, 05] + +2400; [0F 0F, 05, 05] + +2401; [0F 11, 05, 05] + +2402; [0F 13, 05, 05] + +2403; [0F 15, 05, 05] + +2404; [0F 17, 05, 05] + +2405; [0F 19, 05, 05] + +2406; [0F 1B, 05, 05] + +2407; [0F 1D, 05, 05] + +2408; [0F 1F, 05, 05] + +2409; [0F 21, 05, 05] + +240A; [0F 23, 05, 05] + +240B; [0F 25, 05, 05] + +240C; [0F 27, 05, 05] + +240D; [0F 29, 05, 05] + +240E; [0F 2B, 05, 05] + +240F; [0F 2D, 05, 05] + +2410; [0F 2F, 05, 05] + +2411; [0F 31, 05, 05] + +2412; [0F 33, 05, 05] + +2413; [0F 35, 05, 05] + +2414; [0F 37, 05, 05] + +2415; [0F 39, 05, 05] + +2416; [0F 3B, 05, 05] + +2417; [0F 3D, 05, 05] + +2418; [0F 3F, 05, 05] + +2419; [0F 41, 05, 05] + +241A; [0F 43, 05, 05] + +241B; [0F 45, 05, 05] + +241C; [0F 47, 05, 05] + +241D; [0F 49, 05, 05] + +241E; [0F 4B, 05, 05] + +241F; [0F 4D, 05, 05] + +2420; [0F 4F, 05, 05] + +2421; [0F 51, 05, 05] + +2422; [0F 53, 05, 05] + +2423; [0F 55, 05, 05] + +2424; [0F 57, 05, 05] + +2425; [0F 59, 05, 05] + +2426; [0F 5B, 05, 05] + +2440; [0F 5D, 05, 05] + +2441; [0F 5F, 05, 05] + +2442; [0F 61, 05, 05] + +2443; [0F 63, 05, 05] + +2444; [0F 65, 05, 05] + +2445; [0F 67, 05, 05] + +2446; [0F 69, 05, 05] + +2447; [0F 6B, 05, 05] + +2448; [0F 6D, 05, 05] + +2449; [0F 6F, 05, 05] + +244A; [0F 71, 05, 05] + +2500; [0F 73, 05, 05] + +2501; [0F 75, 05, 05] + +2502; [0F 77, 05, 05] +FFE8; [0F 77, 05, A3] + +2503; [0F 79, 05, 05] + +2504; [0F 7B, 05, 05] + +2505; [0F 7D, 05, 05] + +2506; [0F 7F, 05, 05] + +2507; [0F 81, 05, 05] + +2508; [0F 83, 05, 05] + +2509; [0F 85, 05, 05] + +250A; [0F 87, 05, 05] + +250B; [0F 89, 05, 05] + +250C; [0F 8B, 05, 05] + +250D; [0F 8D, 05, 05] + +250E; [0F 8F, 05, 05] + +250F; [0F 91, 05, 05] + +2510; [0F 93, 05, 05] + +2511; [0F 95, 05, 05] + +2512; [0F 97, 05, 05] + +2513; [0F 99, 05, 05] + +2514; [0F 9B, 05, 05] + +2515; [0F 9D, 05, 05] + +2516; [0F 9F, 05, 05] + +2517; [0F A1, 05, 05] + +2518; [0F A3, 05, 05] + +2519; [0F A5, 05, 05] + +251A; [0F A7, 05, 05] + +251B; [0F A9, 05, 05] + +251C; [0F AB, 05, 05] + +251D; [0F AD, 05, 05] + +251E; [0F AF, 05, 05] + +251F; [0F B1, 05, 05] + +2520; [0F B3, 05, 05] + +2521; [0F B5, 05, 05] + +2522; [0F B7, 05, 05] + +2523; [0F B9, 05, 05] + +2524; [0F BB, 05, 05] + +2525; [0F BD, 05, 05] + +2526; [0F BF, 05, 05] + +2527; [0F C1, 05, 05] + +2528; [0F C3, 05, 05] + +2529; [0F C5, 05, 05] + +252A; [0F C7, 05, 05] + +252B; [0F C9, 05, 05] + +252C; [0F CB, 05, 05] + +252D; [0F CD, 05, 05] + +252E; [0F CF, 05, 05] + +252F; [0F D1, 05, 05] + +2530; [0F D3, 05, 05] + +2531; [0F D5, 05, 05] + +2532; [0F D7, 05, 05] + +2533; [0F D9, 05, 05] + +2534; [0F DB, 05, 05] + +2535; [0F DD, 05, 05] + +2536; [0F DF, 05, 05] + +2537; [0F E1, 05, 05] + +2538; [0F E3, 05, 05] + +2539; [0F E5, 05, 05] + +253A; [0F E7, 05, 05] + +253B; [0F E9, 05, 05] + +253C; [0F EB, 05, 05] + +253D; [0F ED, 05, 05] + +253E; [0F EF, 05, 05] + +253F; [0F F1, 05, 05] + +2540; [0F F3, 05, 05] + +2541; [0F F5, 05, 05] + +2542; [0F F7, 05, 05] + +2543; [0F F9, 05, 05] + +2544; [0F FB, 05, 05] + +2545; [0F FD, 05, 05] + +2546; [10 05, 05, 05] + +2547; [10 07, 05, 05] + +2548; [10 09, 05, 05] + +2549; [10 0B, 05, 05] + +254A; [10 0D, 05, 05] + +254B; [10 0F, 05, 05] + +254C; [10 11, 05, 05] + +254D; [10 13, 05, 05] + +254E; [10 15, 05, 05] + +254F; [10 17, 05, 05] + +2550; [10 19, 05, 05] + +2551; [10 1B, 05, 05] + +2552; [10 1D, 05, 05] + +2553; [10 1F, 05, 05] + +2554; [10 21, 05, 05] + +2555; [10 23, 05, 05] + +2556; [10 25, 05, 05] + +2557; [10 27, 05, 05] + +2558; [10 29, 05, 05] + +2559; [10 2B, 05, 05] + +255A; [10 2D, 05, 05] + +255B; [10 2F, 05, 05] + +255C; [10 31, 05, 05] + +255D; [10 33, 05, 05] + +255E; [10 35, 05, 05] + +255F; [10 37, 05, 05] + +2560; [10 39, 05, 05] + +2561; [10 3B, 05, 05] + +2562; [10 3D, 05, 05] + +2563; [10 3F, 05, 05] + +2564; [10 41, 05, 05] + +2565; [10 43, 05, 05] + +2566; [10 45, 05, 05] + +2567; [10 47, 05, 05] + +2568; [10 49, 05, 05] + +2569; [10 4B, 05, 05] + +256A; [10 4D, 05, 05] + +256B; [10 4F, 05, 05] + +256C; [10 51, 05, 05] + +256D; [10 53, 05, 05] + +256E; [10 55, 05, 05] + +256F; [10 57, 05, 05] + +2570; [10 59, 05, 05] + +2571; [10 5B, 05, 05] + +2572; [10 5D, 05, 05] + +2573; [10 5F, 05, 05] + +2574; [10 61, 05, 05] + +2575; [10 63, 05, 05] + +2576; [10 65, 05, 05] + +2577; [10 67, 05, 05] + +2578; [10 69, 05, 05] + +2579; [10 6B, 05, 05] + +257A; [10 6D, 05, 05] + +257B; [10 6F, 05, 05] + +257C; [10 71, 05, 05] + +257D; [10 73, 05, 05] + +257E; [10 75, 05, 05] + +257F; [10 77, 05, 05] + +2580; [10 79, 05, 05] + +2581; [10 7B, 05, 05] + +2582; [10 7D, 05, 05] + +2583; [10 7F, 05, 05] + +2584; [10 81, 05, 05] + +2585; [10 83, 05, 05] + +2586; [10 85, 05, 05] + +2587; [10 87, 05, 05] + +2588; [10 89, 05, 05] + +2589; [10 8B, 05, 05] + +258A; [10 8D, 05, 05] + +258B; [10 8F, 05, 05] + +258C; [10 91, 05, 05] + +258D; [10 93, 05, 05] + +258E; [10 95, 05, 05] + +258F; [10 97, 05, 05] + +2590; [10 99, 05, 05] + +2591; [10 9B, 05, 05] + +2592; [10 9D, 05, 05] + +2593; [10 9F, 05, 05] + +2594; [10 A1, 05, 05] + +2595; [10 A3, 05, 05] + +2596; [10 A5, 05, 05] + +2597; [10 A7, 05, 05] + +2598; [10 A9, 05, 05] + +2599; [10 AB, 05, 05] + +259A; [10 AD, 05, 05] + +259B; [10 AF, 05, 05] + +259C; [10 B1, 05, 05] + +259D; [10 B3, 05, 05] + +259E; [10 B5, 05, 05] + +259F; [10 B7, 05, 05] + +25A0; [10 B9, 05, 05] +FFED; [10 B9, 05, A3] + +25A1; [10 BB, 05, 05] + +25A2; [10 BD, 05, 05] + +25A3; [10 BF, 05, 05] + +25A4; [10 C1, 05, 05] + +25A5; [10 C3, 05, 05] + +25A6; [10 C5, 05, 05] + +25A7; [10 C7, 05, 05] + +25A8; [10 C9, 05, 05] + +25A9; [10 CB, 05, 05] + +25AA; [10 CD, 05, 05] + +25AB; [10 CF, 05, 05] + +25AC; [10 D1, 05, 05] + +25AD; [10 D3, 05, 05] + +25AE; [10 D5, 05, 05] + +25AF; [10 D7, 05, 05] + +25B0; [10 D9, 05, 05] + +25B1; [10 DB, 05, 05] + +25B2; [10 DD, 05, 05] + +25B3; [10 DF, 05, 05] + +25B4; [10 E1, 05, 05] + +25B5; [10 E3, 05, 05] + +25B6; [10 E5, 05, 05] + +25B7; [10 E7, 05, 05] + +25B8; [10 E9, 05, 05] + +25B9; [10 EB, 05, 05] + +25BA; [10 ED, 05, 05] + +25BB; [10 EF, 05, 05] + +25BC; [10 F1, 05, 05] + +25BD; [10 F3, 05, 05] + +25BE; [10 F5, 05, 05] + +25BF; [10 F7, 05, 05] + +25C0; [10 F9, 05, 05] + +25C1; [10 FB, 05, 05] + +25C2; [10 FD, 05, 05] + +25C3; [11 05, 05, 05] + +25C4; [11 07, 05, 05] + +25C5; [11 09, 05, 05] + +25C6; [11 0B, 05, 05] + +25C7; [11 0D, 05, 05] + +25C8; [11 0F, 05, 05] + +25C9; [11 11, 05, 05] + +25CA; [11 13, 05, 05] + +25CB; [11 15, 05, 05] +FFEE; [11 15, 05, A3] + +25CC; [11 17, 05, 05] + +25CD; [11 19, 05, 05] + +25CE; [11 1B, 05, 05] + +25CF; [11 1D, 05, 05] + +25D0; [11 1F, 05, 05] + +25D1; [11 21, 05, 05] + +25D2; [11 23, 05, 05] + +25D3; [11 25, 05, 05] + +25D4; [11 27, 05, 05] + +25D5; [11 29, 05, 05] + +25D6; [11 2B, 05, 05] + +25D7; [11 2D, 05, 05] + +25D8; [11 2F, 05, 05] + +25D9; [11 31, 05, 05] + +25DA; [11 33, 05, 05] + +25DB; [11 35, 05, 05] + +25DC; [11 37, 05, 05] + +25DD; [11 39, 05, 05] + +25DE; [11 3B, 05, 05] + +25DF; [11 3D, 05, 05] + +25E0; [11 3F, 05, 05] + +25E1; [11 41, 05, 05] + +25E2; [11 43, 05, 05] + +25E3; [11 45, 05, 05] + +25E4; [11 47, 05, 05] + +25E5; [11 49, 05, 05] + +25E6; [11 4B, 05, 05] + +25E7; [11 4D, 05, 05] + +25E8; [11 4F, 05, 05] + +25E9; [11 51, 05, 05] + +25EA; [11 53, 05, 05] + +25EB; [11 55, 05, 05] + +25EC; [11 57, 05, 05] + +25ED; [11 59, 05, 05] + +25EE; [11 5B, 05, 05] + +25EF; [11 5D, 05, 05] + +25F0; [11 5F, 05, 05] + +25F1; [11 61, 05, 05] + +25F2; [11 63, 05, 05] + +25F3; [11 65, 05, 05] + +25F4; [11 67, 05, 05] + +25F5; [11 69, 05, 05] + +25F6; [11 6B, 05, 05] + +25F7; [11 6D, 05, 05] + +25F8; [11 6F, 05, 05] + +25F9; [11 71, 05, 05] + +25FA; [11 73, 05, 05] + +25FB; [11 75, 05, 05] + +25FC; [11 77, 05, 05] + +25FD; [11 79, 05, 05] + +25FE; [11 7B, 05, 05] + +25FF; [11 7D, 05, 05] + +2600; [11 7F, 05, 05] + +2601; [11 81, 05, 05] + +2602; [11 83, 05, 05] + +2603; [11 85, 05, 05] + +2604; [11 87, 05, 05] + +2605; [11 89, 05, 05] + +2606; [11 8B, 05, 05] + +2607; [11 8D, 05, 05] + +2608; [11 8F, 05, 05] + +2609; [11 91, 05, 05] + +260A; [11 93, 05, 05] + +260B; [11 95, 05, 05] + +260C; [11 97, 05, 05] + +260D; [11 99, 05, 05] + +260E; [11 9B, 05, 05] + +260F; [11 9D, 05, 05] + +2610; [11 9F, 05, 05] + +2611; [11 A1, 05, 05] + +2612; [11 A3, 05, 05] + +2613; [11 A5, 05, 05] + +2614; [11 A7, 05, 05] + +2615; [11 A9, 05, 05] + +2616; [11 AB, 05, 05] + +2617; [11 AD, 05, 05] + +2619; [11 AF, 05, 05] + +261A; [11 B1, 05, 05] + +261B; [11 B3, 05, 05] + +261C; [11 B5, 05, 05] + +261D; [11 B7, 05, 05] + +261E; [11 B9, 05, 05] + +261F; [11 BB, 05, 05] + +2620; [11 BD, 05, 05] + +2621; [11 BF, 05, 05] + +2622; [11 C1, 05, 05] + +2623; [11 C3, 05, 05] + +2624; [11 C5, 05, 05] + +2625; [11 C7, 05, 05] + +2626; [11 C9, 05, 05] + +2627; [11 CB, 05, 05] + +2628; [11 CD, 05, 05] + +2629; [11 CF, 05, 05] + +262A; [11 D1, 05, 05] + +262B; [11 D3, 05, 05] + +262C; [11 D5, 05, 05] + +262D; [11 D7, 05, 05] + +262E; [11 D9, 05, 05] + +262F; [11 DB, 05, 05] + +2638; [11 DD, 05, 05] + +2639; [11 DF, 05, 05] + +263A; [11 E1, 05, 05] + +263B; [11 E3, 05, 05] + +263C; [11 E5, 05, 05] + +263D; [11 E7, 05, 05] + +263E; [11 E9, 05, 05] + +263F; [11 EB, 05, 05] + +2640; [11 ED, 05, 05] + +2641; [11 EF, 05, 05] + +2642; [11 F1, 05, 05] + +2643; [11 F3, 05, 05] + +2644; [11 F5, 05, 05] + +2645; [11 F7, 05, 05] + +2646; [11 F9, 05, 05] + +2647; [11 FB, 05, 05] + +2648; [11 FD, 05, 05] + +2649; [12 05, 05, 05] + +264A; [12 07, 05, 05] + +264B; [12 09, 05, 05] + +264C; [12 0B, 05, 05] + +264D; [12 0D, 05, 05] + +264E; [12 0F, 05, 05] + +264F; [12 11, 05, 05] + +2650; [12 13, 05, 05] + +2651; [12 15, 05, 05] + +2652; [12 17, 05, 05] + +2653; [12 19, 05, 05] + +2654; [12 1B, 05, 05] + +2655; [12 1D, 05, 05] + +2656; [12 1F, 05, 05] + +2657; [12 21, 05, 05] + +2658; [12 23, 05, 05] + +2659; [12 25, 05, 05] + +265A; [12 27, 05, 05] + +265B; [12 29, 05, 05] + +265C; [12 2B, 05, 05] + +265D; [12 2D, 05, 05] + +265E; [12 2F, 05, 05] + +265F; [12 31, 05, 05] + +2660; [12 33, 05, 05] + +2661; [12 35, 05, 05] + +2662; [12 37, 05, 05] + +2663; [12 39, 05, 05] + +2664; [12 3B, 05, 05] + +2665; [12 3D, 05, 05] + +2666; [12 3F, 05, 05] + +2667; [12 41, 05, 05] + +2668; [12 43, 05, 05] + +2669; [12 45, 05, 05] + +266A; [12 47, 05, 05] + +266B; [12 49, 05, 05] + +266C; [12 4B, 05, 05] + +2670; [12 4D, 05, 05] + +2671; [12 4F, 05, 05] + +2672; [12 51, 05, 05] + +2673; [12 53, 05, 05] + +2674; [12 55, 05, 05] + +2675; [12 57, 05, 05] + +2676; [12 59, 05, 05] + +2677; [12 5B, 05, 05] + +2678; [12 5D, 05, 05] + +2679; [12 5F, 05, 05] + +267A; [12 61, 05, 05] + +267B; [12 63, 05, 05] + +267C; [12 65, 05, 05] + +267D; [12 67, 05, 05] + +2680; [12 69, 05, 05] + +2681; [12 6B, 05, 05] + +2682; [12 6D, 05, 05] + +2683; [12 6F, 05, 05] + +2684; [12 71, 05, 05] + +2685; [12 73, 05, 05] + +2686; [12 75, 05, 05] + +2687; [12 77, 05, 05] + +2688; [12 79, 05, 05] + +2689; [12 7B, 05, 05] + +2690; [12 7D, 05, 05] + +2691; [12 7F, 05, 05] + +26A0; [12 81, 05, 05] + +26A1; [12 83, 05, 05] + +2701; [12 85, 05, 05] + +2702; [12 87, 05, 05] + +2703; [12 89, 05, 05] + +2704; [12 8B, 05, 05] + +2706; [12 8D, 05, 05] + +2707; [12 8F, 05, 05] + +2708; [12 91, 05, 05] + +2709; [12 93, 05, 05] + +270C; [12 95, 05, 05] + +270D; [12 97, 05, 05] + +270E; [12 99, 05, 05] + +270F; [12 9B, 05, 05] + +2710; [12 9D, 05, 05] + +2711; [12 9F, 05, 05] + +2712; [12 A1, 05, 05] + +2713; [12 A3, 05, 05] + +2714; [12 A5, 05, 05] + +2715; [12 A7, 05, 05] + +2716; [12 A9, 05, 05] + +2717; [12 AB, 05, 05] + +2718; [12 AD, 05, 05] + +2719; [12 AF, 05, 05] + +271A; [12 B1, 05, 05] + +271B; [12 B3, 05, 05] + +271C; [12 B5, 05, 05] + +271D; [12 B7, 05, 05] + +271E; [12 B9, 05, 05] + +271F; [12 BB, 05, 05] + +2720; [12 BD, 05, 05] + +2721; [12 BF, 05, 05] + +2722; [12 C1, 05, 05] + +2723; [12 C3, 05, 05] + +2724; [12 C5, 05, 05] + +2725; [12 C7, 05, 05] + +2726; [12 C9, 05, 05] + +2727; [12 CB, 05, 05] + +2729; [12 CD, 05, 05] + +272A; [12 CF, 05, 05] + +272B; [12 D1, 05, 05] + +272C; [12 D3, 05, 05] + +272D; [12 D5, 05, 05] + +272E; [12 D7, 05, 05] + +272F; [12 D9, 05, 05] + +2730; [12 DB, 05, 05] + +2731; [12 DD, 05, 05] + +2732; [12 DF, 05, 05] + +2733; [12 E1, 05, 05] + +2734; [12 E3, 05, 05] + +2735; [12 E5, 05, 05] + +2736; [12 E7, 05, 05] + +2737; [12 E9, 05, 05] + +2738; [12 EB, 05, 05] + +2739; [12 ED, 05, 05] + +273A; [12 EF, 05, 05] + +273B; [12 F1, 05, 05] + +273C; [12 F3, 05, 05] + +273D; [12 F5, 05, 05] + +273E; [12 F7, 05, 05] + +273F; [12 F9, 05, 05] + +2740; [12 FB, 05, 05] + +2741; [12 FD, 05, 05] + +2742; [13 05, 05, 05] + +2743; [13 07, 05, 05] + +2744; [13 09, 05, 05] + +2745; [13 0B, 05, 05] + +2746; [13 0D, 05, 05] + +2747; [13 0F, 05, 05] + +2748; [13 11, 05, 05] + +2749; [13 13, 05, 05] + +274A; [13 15, 05, 05] + +274B; [13 17, 05, 05] + +274D; [13 19, 05, 05] + +274F; [13 1B, 05, 05] + +2750; [13 1D, 05, 05] + +2751; [13 1F, 05, 05] + +2752; [13 21, 05, 05] + +2756; [13 23, 05, 05] + +2758; [13 25, 05, 05] + +2759; [13 27, 05, 05] + +275A; [13 29, 05, 05] + +275B; [13 2B, 05, 05] + +275C; [13 2D, 05, 05] + +275D; [13 2F, 05, 05] + +275E; [13 31, 05, 05] + +2761; [13 33, 05, 05] + +2762; [13 35, 05, 05] + +2763; [13 37, 05, 05] + +2764; [13 39, 05, 05] + +2765; [13 3B, 05, 05] + +2766; [13 3D, 05, 05] + +2767; [13 3F, 05, 05] + +2768; [13 41, 05, 05] + +2769; [13 43, 05, 05] + +276A; [13 45, 05, 05] + +276B; [13 47, 05, 05] + +276C; [13 49, 05, 05] + +276D; [13 4B, 05, 05] + +276E; [13 4D, 05, 05] + +276F; [13 4F, 05, 05] + +2770; [13 51, 05, 05] + +2771; [13 53, 05, 05] + +2772; [13 55, 05, 05] + +2773; [13 57, 05, 05] + +2774; [13 59, 05, 05] + +2775; [13 5B, 05, 05] + +2794; [13 5D, 05, 05] + +2798; [13 5F, 05, 05] + +2799; [13 61, 05, 05] + +279A; [13 63, 05, 05] + +279B; [13 65, 05, 05] + +279C; [13 67, 05, 05] + +279D; [13 69, 05, 05] + +279E; [13 6B, 05, 05] + +279F; [13 6D, 05, 05] + +27A0; [13 6F, 05, 05] + +27A1; [13 71, 05, 05] + +27A2; [13 73, 05, 05] + +27A3; [13 75, 05, 05] + +27A4; [13 77, 05, 05] + +27A5; [13 79, 05, 05] + +27A6; [13 7B, 05, 05] + +27A7; [13 7D, 05, 05] + +27A8; [13 7F, 05, 05] + +27A9; [13 81, 05, 05] + +27AA; [13 83, 05, 05] + +27AB; [13 85, 05, 05] + +27AC; [13 87, 05, 05] + +27AD; [13 89, 05, 05] + +27AE; [13 8B, 05, 05] + +27AF; [13 8D, 05, 05] + +27B1; [13 8F, 05, 05] + +27B2; [13 91, 05, 05] + +27B3; [13 93, 05, 05] + +27B4; [13 95, 05, 05] + +27B5; [13 97, 05, 05] + +27B6; [13 99, 05, 05] + +27B7; [13 9B, 05, 05] + +27B8; [13 9D, 05, 05] + +27B9; [13 9F, 05, 05] + +27BA; [13 A1, 05, 05] + +27BB; [13 A3, 05, 05] + +27BC; [13 A5, 05, 05] + +27BD; [13 A7, 05, 05] + +27BE; [13 A9, 05, 05] + +27D0; [13 AB, 05, 05] + +27D1; [13 AD, 05, 05] + +27D2; [13 AF, 05, 05] + +27D3; [13 B1, 05, 05] + +27D4; [13 B3, 05, 05] + +27D5; [13 B5, 05, 05] + +27D6; [13 B7, 05, 05] + +27D7; [13 B9, 05, 05] + +27D8; [13 BB, 05, 05] + +27D9; [13 BD, 05, 05] + +27DA; [13 BF, 05, 05] + +27DB; [13 C1, 05, 05] + +27DC; [13 C3, 05, 05] + +27DD; [13 C5, 05, 05] + +27DE; [13 C7, 05, 05] + +27DF; [13 C9, 05, 05] + +27E0; [13 CB, 05, 05] + +27E1; [13 CD, 05, 05] + +27E2; [13 CF, 05, 05] + +27E3; [13 D1, 05, 05] + +27E4; [13 D3, 05, 05] + +27E5; [13 D5, 05, 05] + +27E6; [13 D7, 05, 05] + +27E7; [13 D9, 05, 05] + +27E8; [13 DB, 05, 05] + +27E9; [13 DD, 05, 05] + +27EA; [13 DF, 05, 05] + +27EB; [13 E1, 05, 05] + +27F0; [13 E3, 05, 05] + +27F1; [13 E5, 05, 05] + +27F2; [13 E7, 05, 05] + +27F3; [13 E9, 05, 05] + +27F4; [13 EB, 05, 05] + +27F5; [13 ED, 05, 05] + +27F6; [13 EF, 05, 05] + +27F7; [13 F1, 05, 05] + +27F8; [13 F3, 05, 05] + +27F9; [13 F5, 05, 05] + +27FA; [13 F7, 05, 05] + +27FB; [13 F9, 05, 05] + +27FC; [13 FB, 05, 05] + +27FD; [13 FD, 05, 05] + +27FE; [14 05, 05, 05] + +27FF; [14 07, 05, 05] + +2900; [14 09, 05, 05] + +2901; [14 0B, 05, 05] + +2902; [14 0D, 05, 05] + +2903; [14 0F, 05, 05] + +2904; [14 11, 05, 05] + +2905; [14 13, 05, 05] + +2906; [14 15, 05, 05] + +2907; [14 17, 05, 05] + +2908; [14 19, 05, 05] + +2909; [14 1B, 05, 05] + +290A; [14 1D, 05, 05] + +290B; [14 1F, 05, 05] + +290C; [14 21, 05, 05] + +290D; [14 23, 05, 05] + +290E; [14 25, 05, 05] + +290F; [14 27, 05, 05] + +2910; [14 29, 05, 05] + +2911; [14 2B, 05, 05] + +2912; [14 2D, 05, 05] + +2913; [14 2F, 05, 05] + +2914; [14 31, 05, 05] + +2915; [14 33, 05, 05] + +2916; [14 35, 05, 05] + +2917; [14 37, 05, 05] + +2918; [14 39, 05, 05] + +2919; [14 3B, 05, 05] + +291A; [14 3D, 05, 05] + +291B; [14 3F, 05, 05] + +291C; [14 41, 05, 05] + +291D; [14 43, 05, 05] + +291E; [14 45, 05, 05] + +291F; [14 47, 05, 05] + +2920; [14 49, 05, 05] + +2921; [14 4B, 05, 05] + +2922; [14 4D, 05, 05] + +2923; [14 4F, 05, 05] + +2924; [14 51, 05, 05] + +2925; [14 53, 05, 05] + +2926; [14 55, 05, 05] + +2927; [14 57, 05, 05] + +2928; [14 59, 05, 05] + +2929; [14 5B, 05, 05] + +292A; [14 5D, 05, 05] + +292B; [14 5F, 05, 05] + +292C; [14 61, 05, 05] + +292D; [14 63, 05, 05] + +292E; [14 65, 05, 05] + +292F; [14 67, 05, 05] + +2930; [14 69, 05, 05] + +2931; [14 6B, 05, 05] + +2932; [14 6D, 05, 05] + +2933; [14 6F, 05, 05] + +2934; [14 71, 05, 05] + +2935; [14 73, 05, 05] + +2936; [14 75, 05, 05] + +2937; [14 77, 05, 05] + +2938; [14 79, 05, 05] + +2939; [14 7B, 05, 05] + +293A; [14 7D, 05, 05] + +293B; [14 7F, 05, 05] + +293C; [14 81, 05, 05] + +293D; [14 83, 05, 05] + +293E; [14 85, 05, 05] + +293F; [14 87, 05, 05] + +2940; [14 89, 05, 05] + +2941; [14 8B, 05, 05] + +2942; [14 8D, 05, 05] + +2943; [14 8F, 05, 05] + +2944; [14 91, 05, 05] + +2945; [14 93, 05, 05] + +2946; [14 95, 05, 05] + +2947; [14 97, 05, 05] + +2948; [14 99, 05, 05] + +2949; [14 9B, 05, 05] + +294A; [14 9D, 05, 05] + +294B; [14 9F, 05, 05] + +294C; [14 A1, 05, 05] + +294D; [14 A3, 05, 05] + +294E; [14 A5, 05, 05] + +294F; [14 A7, 05, 05] + +2950; [14 A9, 05, 05] + +2951; [14 AB, 05, 05] + +2952; [14 AD, 05, 05] + +2953; [14 AF, 05, 05] + +2954; [14 B1, 05, 05] + +2955; [14 B3, 05, 05] + +2956; [14 B5, 05, 05] + +2957; [14 B7, 05, 05] + +2958; [14 B9, 05, 05] + +2959; [14 BB, 05, 05] + +295A; [14 BD, 05, 05] + +295B; [14 BF, 05, 05] + +295C; [14 C1, 05, 05] + +295D; [14 C3, 05, 05] + +295E; [14 C5, 05, 05] + +295F; [14 C7, 05, 05] + +2960; [14 C9, 05, 05] + +2961; [14 CB, 05, 05] + +2962; [15 20, 05, 05] + +2963; [15 22, 05, 05] + +2964; [15 24, 05, 05] + +2965; [15 26, 05, 05] + +2966; [15 28, 05, 05] + +2967; [15 2A, 05, 05] + +2968; [15 2C, 05, 05] + +2969; [15 2E, 05, 05] + +296A; [15 30, 05, 05] + +296B; [15 32, 05, 05] + +296C; [15 34, 05, 05] + +296D; [15 36, 05, 05] + +296E; [15 38, 05, 05] + +296F; [15 3A, 05, 05] + +2970; [15 3C, 05, 05] + +2971; [15 3E, 05, 05] + +2972; [15 40, 05, 05] + +2973; [15 42, 05, 05] + +2974; [15 44, 05, 05] + +2975; [15 46, 05, 05] + +2976; [15 48, 05, 05] + +2977; [15 4A, 05, 05] + +2978; [15 4C, 05, 05] + +2979; [15 4E, 05, 05] + +297A; [15 50, 05, 05] + +297B; [15 52, 05, 05] + +297C; [15 54, 05, 05] + +297D; [15 56, 05, 05] + +297E; [15 58, 05, 05] + +297F; [15 5A, 05, 05] + +2980; [15 5C, 05, 05] + +2981; [15 5E, 05, 05] + +2982; [15 60, 05, 05] + +2999; [15 62, 05, 05] + +299A; [15 64, 05, 05] + +299B; [15 66, 05, 05] + +299C; [15 68, 05, 05] + +299D; [15 6A, 05, 05] + +299E; [15 6C, 05, 05] + +299F; [15 6E, 05, 05] + +29A0; [15 70, 05, 05] + +29A1; [15 72, 05, 05] + +29A2; [15 74, 05, 05] + +29A3; [15 76, 05, 05] + +29A4; [15 78, 05, 05] + +29A5; [15 7A, 05, 05] + +29A6; [15 7C, 05, 05] + +29A7; [15 7E, 05, 05] + +29A8; [15 80, 05, 05] + +29A9; [15 82, 05, 05] + +29AA; [15 84, 05, 05] + +29AB; [15 86, 05, 05] + +29AC; [15 88, 05, 05] + +29AD; [15 8A, 05, 05] + +29AE; [15 8C, 05, 05] + +29AF; [15 8E, 05, 05] + +29B0; [15 90, 05, 05] + +29B1; [15 92, 05, 05] + +29B2; [15 94, 05, 05] + +29B3; [15 96, 05, 05] + +29B4; [15 98, 05, 05] + +29B5; [15 9A, 05, 05] + +29B6; [15 9C, 05, 05] + +29B7; [15 9E, 05, 05] + +29B8; [15 A0, 05, 05] + +29B9; [15 A2, 05, 05] + +29BA; [15 A4, 05, 05] + +29BB; [15 A6, 05, 05] + +29BC; [15 A8, 05, 05] + +29BD; [15 AA, 05, 05] + +29BE; [15 AC, 05, 05] + +29BF; [15 AE, 05, 05] + +29C0; [15 B0, 05, 05] + +29C1; [15 B2, 05, 05] + +29C2; [15 B4, 05, 05] + +29C3; [15 B6, 05, 05] + +29C4; [15 B8, 05, 05] + +29C5; [15 BA, 05, 05] + +29C6; [15 BC, 05, 05] + +29C7; [15 BE, 05, 05] + +29C8; [15 C0, 05, 05] + +29C9; [15 C2, 05, 05] + +29CA; [15 C4, 05, 05] + +29CB; [15 C6, 05, 05] + +29CC; [15 C8, 05, 05] + +29CD; [15 CA, 05, 05] + +29CE; [15 CC, 05, 05] + +29CF; [15 CE, 05, 05] + +29D0; [15 D0, 05, 05] + +29D1; [15 D2, 05, 05] + +29D2; [15 D4, 05, 05] + +29D3; [15 D6, 05, 05] + +29D4; [15 D8, 05, 05] + +29D5; [15 DA, 05, 05] + +29D6; [15 DC, 05, 05] + +29D7; [15 DE, 05, 05] + +29D8; [15 E0, 05, 05] + +29D9; [15 E2, 05, 05] + +29DA; [15 E4, 05, 05] + +29DB; [15 E6, 05, 05] + +29DC; [15 E8, 05, 05] + +29DD; [15 EA, 05, 05] + +29DE; [15 EC, 05, 05] + +29DF; [15 EE, 05, 05] + +29E0; [15 F0, 05, 05] + +29E1; [15 F2, 05, 05] + +29E2; [15 F4, 05, 05] + +29E3; [15 F6, 05, 05] + +29E4; [15 F8, 05, 05] + +29E5; [15 FA, 05, 05] + +29E6; [15 FC, 05, 05] + +29E7; [15 FE, 05, 05] + +29E8; [16 05, 05, 05] + +29E9; [16 07, 05, 05] + +29EA; [16 09, 05, 05] + +29EB; [16 0B, 05, 05] + +29EC; [16 0D, 05, 05] + +29ED; [16 0F, 05, 05] + +29EE; [16 11, 05, 05] + +29EF; [16 13, 05, 05] + +29F0; [16 15, 05, 05] + +29F1; [16 17, 05, 05] + +29F2; [16 19, 05, 05] + +29F3; [16 1B, 05, 05] + +29F4; [16 1D, 05, 05] + +29F5; [16 1F, 05, 05] + +29F6; [16 21, 05, 05] + +29F7; [16 23, 05, 05] + +29F8; [16 25, 05, 05] + +29F9; [16 27, 05, 05] + +29FA; [16 29, 05, 05] + +29FB; [16 2B, 05, 05] + +29FE; [16 2D, 05, 05] + +29FF; [16 2F, 05, 05] + +2A00; [16 31, 05, 05] + +2A01; [16 33, 05, 05] + +2A02; [16 35, 05, 05] + +2A03; [16 37, 05, 05] + +2A04; [16 39, 05, 05] + +2A05; [16 3B, 05, 05] + +2A06; [16 3D, 05, 05] + +2A07; [16 3F, 05, 05] + +2A08; [16 41, 05, 05] + +2A09; [16 43, 05, 05] + +2A0A; [16 45, 05, 05] + +2A0B; [16 47, 05, 05] + +2A0D; [16 49, 05, 05] + +2A0E; [16 4B, 05, 05] + +2A0F; [16 4D, 05, 05] + +2A10; [16 4F, 05, 05] + +2A11; [16 51, 05, 05] + +2A12; [16 53, 05, 05] + +2A13; [16 55, 05, 05] + +2A14; [16 57, 05, 05] + +2A15; [16 59, 05, 05] + +2A16; [16 5B, 05, 05] + +2A17; [16 5D, 05, 05] + +2A18; [16 5F, 05, 05] + +2A19; [16 61, 05, 05] + +2A1A; [16 63, 05, 05] + +2A1B; [16 65, 05, 05] + +2A1C; [16 67, 05, 05] + +2A1D; [16 69, 05, 05] + +2A1E; [16 6B, 05, 05] + +2A1F; [16 6D, 05, 05] + +2A20; [16 6F, 05, 05] + +2A21; [16 71, 05, 05] + +2A22; [16 73, 05, 05] + +2A23; [16 75, 05, 05] + +2A24; [16 77, 05, 05] + +2A25; [16 79, 05, 05] + +2A26; [16 7B, 05, 05] + +2A27; [16 7D, 05, 05] + +2A28; [16 7F, 05, 05] + +2A29; [16 81, 05, 05] + +2A2A; [16 83, 05, 05] + +2A2B; [16 85, 05, 05] + +2A2C; [16 87, 05, 05] + +2A2D; [16 89, 05, 05] + +2A2E; [16 8B, 05, 05] + +2A2F; [16 8D, 05, 05] + +2A30; [16 8F, 05, 05] + +2A31; [16 91, 05, 05] + +2A32; [16 93, 05, 05] + +2A33; [16 95, 05, 05] + +2A34; [16 97, 05, 05] + +2A35; [16 99, 05, 05] + +2A36; [16 9B, 05, 05] + +2A37; [16 9D, 05, 05] + +2A38; [16 9F, 05, 05] + +2A39; [16 A1, 05, 05] + +2A3A; [16 A3, 05, 05] + +2A3B; [16 A5, 05, 05] + +2A3C; [16 A7, 05, 05] + +2A3D; [16 A9, 05, 05] + +2A3E; [16 AB, 05, 05] + +2A3F; [16 AD, 05, 05] + +2A40; [16 AF, 05, 05] + +2A41; [16 B1, 05, 05] + +2A42; [16 B3, 05, 05] + +2A43; [16 B5, 05, 05] + +2A44; [16 B7, 05, 05] + +2A45; [16 B9, 05, 05] + +2A46; [16 BB, 05, 05] + +2A47; [16 BD, 05, 05] + +2A48; [16 BF, 05, 05] + +2A49; [16 C1, 05, 05] + +2A4A; [16 C3, 05, 05] + +2A4B; [16 C5, 05, 05] + +2A4C; [16 C7, 05, 05] + +2A4D; [16 C9, 05, 05] + +2A4E; [16 CB, 05, 05] + +2A4F; [16 CD, 05, 05] + +2A50; [16 CF, 05, 05] + +2A51; [16 D1, 05, 05] + +2A52; [16 D3, 05, 05] + +2A53; [16 D5, 05, 05] + +2A54; [16 D7, 05, 05] + +2A55; [16 D9, 05, 05] + +2A56; [16 DB, 05, 05] + +2A57; [16 DD, 05, 05] + +2A58; [16 DF, 05, 05] + +2A59; [16 E1, 05, 05] + +2A5A; [16 E3, 05, 05] + +2A5B; [16 E5, 05, 05] + +2A5C; [16 E7, 05, 05] + +2A5D; [16 E9, 05, 05] + +2A5E; [16 EB, 05, 05] + +2A5F; [16 ED, 05, 05] + +2A60; [16 EF, 05, 05] + +2A61; [16 F1, 05, 05] + +2A62; [16 F3, 05, 05] + +2A63; [16 F5, 05, 05] + +2A64; [16 F7, 05, 05] + +2A65; [16 F9, 05, 05] + +2A66; [16 FB, 05, 05] + +2A67; [16 FD, 05, 05] + +2A68; [17 05, 05, 05] + +2A69; [17 07, 05, 05] + +2A6A; [17 09, 05, 05] + +2A6B; [17 0B, 05, 05] + +2A6C; [17 0D, 05, 05] + +2A6D; [17 0F, 05, 05] + +2A6E; [17 11, 05, 05] + +2A6F; [17 13, 05, 05] + +2A70; [17 15, 05, 05] + +2A71; [17 17, 05, 05] + +2A72; [17 19, 05, 05] + +2A73; [17 1B, 05, 05] + +2A77; [17 1D, 05, 05] + +2A78; [17 1F, 05, 05] + +2A79; [17 21, 05, 05] + +2A7A; [17 23, 05, 05] + +2A7B; [17 25, 05, 05] + +2A7C; [17 27, 05, 05] + +2A7D; [17 29, 05, 05] + +2A7E; [17 2B, 05, 05] + +2A7F; [17 2D, 05, 05] + +2A80; [17 2F, 05, 05] + +2A81; [17 31, 05, 05] + +2A82; [17 33, 05, 05] + +2A83; [17 35, 05, 05] + +2A84; [17 37, 05, 05] + +2A85; [17 39, 05, 05] + +2A86; [17 3B, 05, 05] + +2A87; [17 3D, 05, 05] + +2A88; [17 3F, 05, 05] + +2A89; [17 41, 05, 05] + +2A8A; [17 43, 05, 05] + +2A8B; [17 45, 05, 05] + +2A8C; [17 47, 05, 05] + +2A8D; [17 49, 05, 05] + +2A8E; [17 4B, 05, 05] + +2A8F; [17 4D, 05, 05] + +2A90; [17 4F, 05, 05] + +2A91; [17 51, 05, 05] + +2A92; [17 53, 05, 05] + +2A93; [17 55, 05, 05] + +2A94; [17 57, 05, 05] + +2A95; [17 59, 05, 05] + +2A96; [17 5B, 05, 05] + +2A97; [17 5D, 05, 05] + +2A98; [17 5F, 05, 05] + +2A99; [17 61, 05, 05] + +2A9A; [17 63, 05, 05] + +2A9B; [17 65, 05, 05] + +2A9C; [17 67, 05, 05] + +2A9D; [17 69, 05, 05] + +2A9E; [17 6B, 05, 05] + +2A9F; [17 6D, 05, 05] + +2AA0; [17 6F, 05, 05] + +2AA1; [17 71, 05, 05] + +2AA2; [17 73, 05, 05] + +2AA3; [17 75, 05, 05] + +2AA4; [17 77, 05, 05] + +2AA5; [17 79, 05, 05] + +2AA6; [17 7B, 05, 05] + +2AA7; [17 7D, 05, 05] + +2AA8; [17 7F, 05, 05] + +2AA9; [17 81, 05, 05] + +2AAA; [17 83, 05, 05] + +2AAB; [17 85, 05, 05] + +2AAC; [17 87, 05, 05] + +2AAD; [17 89, 05, 05] + +2AAE; [17 8B, 05, 05] + +2AAF; [17 8D, 05, 05] + +2AB0; [17 8F, 05, 05] + +2AB1; [17 91, 05, 05] + +2AB2; [17 93, 05, 05] + +2AB3; [17 95, 05, 05] + +2AB4; [17 97, 05, 05] + +2AB5; [17 99, 05, 05] + +2AB6; [17 9B, 05, 05] + +2AB7; [17 9D, 05, 05] + +2AB8; [17 9F, 05, 05] + +2AB9; [17 A1, 05, 05] + +2ABA; [17 A3, 05, 05] + +2ABB; [17 A5, 05, 05] + +2ABC; [17 A7, 05, 05] + +2ABD; [17 A9, 05, 05] + +2ABE; [17 AB, 05, 05] + +2ABF; [17 AD, 05, 05] + +2AC0; [17 AF, 05, 05] + +2AC1; [17 B1, 05, 05] + +2AC2; [17 B3, 05, 05] + +2AC3; [17 B5, 05, 05] + +2AC4; [17 B7, 05, 05] + +2AC5; [17 B9, 05, 05] + +2AC6; [17 BB, 05, 05] + +2AC7; [17 BD, 05, 05] + +2AC8; [17 BF, 05, 05] + +2AC9; [17 C1, 05, 05] + +2ACA; [17 C3, 05, 05] + +2ACB; [17 C5, 05, 05] + +2ACC; [17 C7, 05, 05] + +2ACD; [17 C9, 05, 05] + +2ACE; [17 CB, 05, 05] + +2ACF; [17 CD, 05, 05] + +2AD0; [17 CF, 05, 05] + +2AD1; [17 D1, 05, 05] + +2AD2; [17 D3, 05, 05] + +2AD3; [17 D5, 05, 05] + +2AD4; [17 D7, 05, 05] + +2AD5; [17 D9, 05, 05] + +2AD6; [17 DB, 05, 05] + +2AD7; [17 DD, 05, 05] + +2AD8; [17 DF, 05, 05] + +2AD9; [17 E1, 05, 05] + +2ADA; [17 E3, 05, 05] + +2ADB; [17 E5, 05, 05] + +2ADD; [17 E7, 05, 05] +2ADC; [17 E7, 05, 05][, A5, 05] + +2ADE; [17 E9, 05, 05] + +2ADF; [17 EB, 05, 05] + +2AE0; [17 ED, 05, 05] + +2AE1; [17 EF, 05, 05] + +2AE2; [17 F1, 05, 05] + +2AE3; [17 F3, 05, 05] + +2AE4; [17 F5, 05, 05] + +2AE5; [17 F7, 05, 05] + +2AE6; [17 F9, 05, 05] + +2AE7; [17 FB, 05, 05] + +2AE8; [17 FD, 05, 05] + +2AE9; [18 05, 05, 05] + +2AEA; [18 07, 05, 05] + +2AEB; [18 09, 05, 05] + +2AEC; [18 0B, 05, 05] + +2AED; [18 0D, 05, 05] + +2AEE; [18 0F, 05, 05] + +2AEF; [18 11, 05, 05] + +2AF0; [18 13, 05, 05] + +2AF1; [18 15, 05, 05] + +2AF2; [18 17, 05, 05] + +2AF3; [18 19, 05, 05] + +2AF4; [18 1B, 05, 05] + +2AF5; [18 1D, 05, 05] + +2AF6; [18 1F, 05, 05] + +2AF7; [18 21, 05, 05] + +2AF8; [18 23, 05, 05] + +2AF9; [18 25, 05, 05] + +2AFA; [18 27, 05, 05] + +2AFB; [18 29, 05, 05] + +2AFC; [18 2B, 05, 05] + +2AFD; [18 2D, 05, 05] + +2AFE; [18 2F, 05, 05] + +2AFF; [18 31, 05, 05] + +2B00; [18 33, 05, 05] + +2B01; [18 35, 05, 05] + +2B02; [18 37, 05, 05] + +2B03; [18 39, 05, 05] + +2B04; [18 3B, 05, 05] + +2B05; [18 3D, 05, 05] + +2B06; [18 3F, 05, 05] + +2B07; [18 41, 05, 05] + +2B08; [18 43, 05, 05] + +2B09; [18 45, 05, 05] + +2B0A; [18 47, 05, 05] + +2B0B; [18 49, 05, 05] + +2B0C; [18 4B, 05, 05] + +2B0D; [18 4D, 05, 05] + +2800; [18 4F, 05, 05] + +2801; [18 51, 05, 05] + +2802; [18 53, 05, 05] + +2803; [18 55, 05, 05] + +2804; [18 57, 05, 05] + +2805; [18 59, 05, 05] + +2806; [18 5B, 05, 05] + +2807; [18 5D, 05, 05] + +2808; [18 5F, 05, 05] + +2809; [18 61, 05, 05] + +280A; [18 63, 05, 05] + +280B; [18 65, 05, 05] + +280C; [18 67, 05, 05] + +280D; [18 69, 05, 05] + +280E; [18 6B, 05, 05] + +280F; [18 6D, 05, 05] + +2810; [18 6F, 05, 05] + +2811; [18 71, 05, 05] + +2812; [18 73, 05, 05] + +2813; [18 75, 05, 05] + +2814; [18 77, 05, 05] + +2815; [18 79, 05, 05] + +2816; [18 7B, 05, 05] + +2817; [18 7D, 05, 05] + +2818; [18 7F, 05, 05] + +2819; [18 81, 05, 05] + +281A; [18 83, 05, 05] + +281B; [18 85, 05, 05] + +281C; [18 87, 05, 05] + +281D; [18 89, 05, 05] + +281E; [18 8B, 05, 05] + +281F; [18 8D, 05, 05] + +2820; [18 8F, 05, 05] + +2821; [18 91, 05, 05] + +2822; [18 93, 05, 05] + +2823; [18 95, 05, 05] + +2824; [18 97, 05, 05] + +2825; [18 99, 05, 05] + +2826; [18 9B, 05, 05] + +2827; [18 9D, 05, 05] + +2828; [18 9F, 05, 05] + +2829; [18 A1, 05, 05] + +282A; [18 A3, 05, 05] + +282B; [18 A5, 05, 05] + +282C; [18 A7, 05, 05] + +282D; [18 A9, 05, 05] + +282E; [18 AB, 05, 05] + +282F; [18 AD, 05, 05] + +2830; [18 AF, 05, 05] + +2831; [18 B1, 05, 05] + +2832; [18 B3, 05, 05] + +2833; [18 B5, 05, 05] + +2834; [18 B7, 05, 05] + +2835; [18 B9, 05, 05] + +2836; [18 BB, 05, 05] + +2837; [18 BD, 05, 05] + +2838; [18 BF, 05, 05] + +2839; [18 C1, 05, 05] + +283A; [18 C3, 05, 05] + +283B; [18 C5, 05, 05] + +283C; [18 C7, 05, 05] + +283D; [18 C9, 05, 05] + +283E; [18 CB, 05, 05] + +283F; [18 CD, 05, 05] + +2840; [18 CF, 05, 05] + +2841; [18 D1, 05, 05] + +2842; [18 D3, 05, 05] + +2843; [18 D5, 05, 05] + +2844; [18 D7, 05, 05] + +2845; [18 D9, 05, 05] + +2846; [18 DB, 05, 05] + +2847; [18 DD, 05, 05] + +2848; [18 DF, 05, 05] + +2849; [18 E1, 05, 05] + +284A; [18 E3, 05, 05] + +284B; [18 E5, 05, 05] + +284C; [18 E7, 05, 05] + +284D; [18 E9, 05, 05] + +284E; [18 EB, 05, 05] + +284F; [18 ED, 05, 05] + +2850; [18 EF, 05, 05] + +2851; [18 F1, 05, 05] + +2852; [18 F3, 05, 05] + +2853; [18 F5, 05, 05] + +2854; [18 F7, 05, 05] + +2855; [18 F9, 05, 05] + +2856; [18 FB, 05, 05] + +2857; [18 FD, 05, 05] + +2858; [19 05, 05, 05] + +2859; [19 07, 05, 05] + +285A; [19 09, 05, 05] + +285B; [19 0B, 05, 05] + +285C; [19 0D, 05, 05] + +285D; [19 0F, 05, 05] + +285E; [19 11, 05, 05] + +285F; [19 13, 05, 05] + +2860; [19 15, 05, 05] + +2861; [19 17, 05, 05] + +2862; [19 19, 05, 05] + +2863; [19 1B, 05, 05] + +2864; [19 1D, 05, 05] + +2865; [19 1F, 05, 05] + +2866; [19 21, 05, 05] + +2867; [19 23, 05, 05] + +2868; [19 25, 05, 05] + +2869; [19 27, 05, 05] + +286A; [19 29, 05, 05] + +286B; [19 2B, 05, 05] + +286C; [19 2D, 05, 05] + +286D; [19 2F, 05, 05] + +286E; [19 31, 05, 05] + +286F; [19 33, 05, 05] + +2870; [19 35, 05, 05] + +2871; [19 37, 05, 05] + +2872; [19 39, 05, 05] + +2873; [19 3B, 05, 05] + +2874; [19 3D, 05, 05] + +2875; [19 3F, 05, 05] + +2876; [19 41, 05, 05] + +2877; [19 43, 05, 05] + +2878; [19 45, 05, 05] + +2879; [19 47, 05, 05] + +287A; [19 49, 05, 05] + +287B; [19 4B, 05, 05] + +287C; [19 4D, 05, 05] + +287D; [19 4F, 05, 05] + +287E; [19 51, 05, 05] + +287F; [19 53, 05, 05] + +2880; [19 55, 05, 05] + +2881; [19 57, 05, 05] + +2882; [19 59, 05, 05] + +2883; [19 5B, 05, 05] + +2884; [19 5D, 05, 05] + +2885; [19 5F, 05, 05] + +2886; [19 61, 05, 05] + +2887; [19 63, 05, 05] + +2888; [19 65, 05, 05] + +2889; [19 67, 05, 05] + +288A; [19 69, 05, 05] + +288B; [19 6B, 05, 05] + +288C; [19 6D, 05, 05] + +288D; [19 6F, 05, 05] + +288E; [19 71, 05, 05] + +288F; [19 73, 05, 05] + +2890; [19 75, 05, 05] + +2891; [19 77, 05, 05] + +2892; [19 79, 05, 05] + +2893; [19 7B, 05, 05] + +2894; [19 7D, 05, 05] + +2895; [19 7F, 05, 05] + +2896; [19 81, 05, 05] + +2897; [19 83, 05, 05] + +2898; [19 85, 05, 05] + +2899; [19 87, 05, 05] + +289A; [19 89, 05, 05] + +289B; [19 8B, 05, 05] + +289C; [19 8D, 05, 05] + +289D; [19 8F, 05, 05] + +289E; [19 91, 05, 05] + +289F; [19 93, 05, 05] + +28A0; [19 95, 05, 05] + +28A1; [19 97, 05, 05] + +28A2; [19 99, 05, 05] + +28A3; [19 9B, 05, 05] + +28A4; [19 9D, 05, 05] + +28A5; [19 9F, 05, 05] + +28A6; [19 A1, 05, 05] + +28A7; [19 A3, 05, 05] + +28A8; [19 A5, 05, 05] + +28A9; [19 A7, 05, 05] + +28AA; [19 A9, 05, 05] + +28AB; [19 AB, 05, 05] + +28AC; [19 AD, 05, 05] + +28AD; [19 AF, 05, 05] + +28AE; [19 B1, 05, 05] + +28AF; [19 B3, 05, 05] + +28B0; [19 B5, 05, 05] + +28B1; [19 B7, 05, 05] + +28B2; [19 B9, 05, 05] + +28B3; [19 BB, 05, 05] + +28B4; [19 BD, 05, 05] + +28B5; [19 BF, 05, 05] + +28B6; [19 C1, 05, 05] + +28B7; [19 C3, 05, 05] + +28B8; [19 C5, 05, 05] + +28B9; [19 C7, 05, 05] + +28BA; [19 C9, 05, 05] + +28BB; [19 CB, 05, 05] + +28BC; [19 CD, 05, 05] + +28BD; [19 CF, 05, 05] + +28BE; [19 D1, 05, 05] + +28BF; [19 D3, 05, 05] + +28C0; [19 D5, 05, 05] + +28C1; [19 D7, 05, 05] + +28C2; [19 D9, 05, 05] + +28C3; [19 DB, 05, 05] + +28C4; [19 DD, 05, 05] + +28C5; [19 DF, 05, 05] + +28C6; [19 E1, 05, 05] + +28C7; [19 E3, 05, 05] + +28C8; [19 E5, 05, 05] + +28C9; [19 E7, 05, 05] + +28CA; [19 E9, 05, 05] + +28CB; [19 EB, 05, 05] + +28CC; [19 ED, 05, 05] + +28CD; [19 EF, 05, 05] + +28CE; [19 F1, 05, 05] + +28CF; [19 F3, 05, 05] + +28D0; [19 F5, 05, 05] + +28D1; [19 F7, 05, 05] + +28D2; [19 F9, 05, 05] + +28D3; [19 FB, 05, 05] + +28D4; [19 FD, 05, 05] + +28D5; [1A 05, 05, 05] + +28D6; [1A 07, 05, 05] + +28D7; [1A 09, 05, 05] + +28D8; [1A 0B, 05, 05] + +28D9; [1A 0D, 05, 05] + +28DA; [1A 0F, 05, 05] + +28DB; [1A 11, 05, 05] + +28DC; [1A 13, 05, 05] + +28DD; [1A 15, 05, 05] + +28DE; [1A 17, 05, 05] + +28DF; [1A 19, 05, 05] + +28E0; [1A 1B, 05, 05] + +28E1; [1A 1D, 05, 05] + +28E2; [1A 1F, 05, 05] + +28E3; [1A 21, 05, 05] + +28E4; [1A 23, 05, 05] + +28E5; [1A 25, 05, 05] + +28E6; [1A 27, 05, 05] + +28E7; [1A 29, 05, 05] + +28E8; [1A 2B, 05, 05] + +28E9; [1A 2D, 05, 05] + +28EA; [1A 2F, 05, 05] + +28EB; [1A 31, 05, 05] + +28EC; [1A 33, 05, 05] + +28ED; [1A 35, 05, 05] + +28EE; [1A 37, 05, 05] + +28EF; [1A 39, 05, 05] + +28F0; [1A 3B, 05, 05] + +28F1; [1A 3D, 05, 05] + +28F2; [1A 3F, 05, 05] + +28F3; [1A 41, 05, 05] + +28F4; [1A 43, 05, 05] + +28F5; [1A 45, 05, 05] + +28F6; [1A 47, 05, 05] + +28F7; [1A 49, 05, 05] + +28F8; [1A 4B, 05, 05] + +28F9; [1A 4D, 05, 05] + +28FA; [1A 4F, 05, 05] + +28FB; [1A 51, 05, 05] + +28FC; [1A 53, 05, 05] + +28FD; [1A 55, 05, 05] + +28FE; [1A 57, 05, 05] + +28FF; [1A 59, 05, 05] + +268A; [1A 5B, 05, 05] + +268B; [1A 5D, 05, 05] + +268C; [1A 5F, 05, 05] + +268D; [1A 61, 05, 05] + +268E; [1A 63, 05, 05] + +268F; [1A 65, 05, 05] + +2630; [1A 67, 05, 05] + +2631; [1A 69, 05, 05] + +2632; [1A 6B, 05, 05] + +2633; [1A 6D, 05, 05] + +2634; [1A 6F, 05, 05] + +2635; [1A 71, 05, 05] + +2636; [1A 73, 05, 05] + +2637; [1A 75, 05, 05] + +4DC0; [1A 77, 05, 05] + +4DC1; [1A 79, 05, 05] + +4DC2; [1A 7B, 05, 05] + +4DC3; [1A 7D, 05, 05] + +4DC4; [1A 7F, 05, 05] + +4DC5; [1A 81, 05, 05] + +4DC6; [1A 83, 05, 05] + +4DC7; [1A 85, 05, 05] + +4DC8; [1A 87, 05, 05] + +4DC9; [1A 89, 05, 05] + +4DCA; [1A 8B, 05, 05] + +4DCB; [1A 8D, 05, 05] + +4DCC; [1A 8F, 05, 05] + +4DCD; [1A 91, 05, 05] + +4DCE; [1A 93, 05, 05] + +4DCF; [1A 95, 05, 05] + +4DD0; [1A 97, 05, 05] + +4DD1; [1A 99, 05, 05] + +4DD2; [1A 9B, 05, 05] + +4DD3; [1A 9D, 05, 05] + +4DD4; [1A 9F, 05, 05] + +4DD5; [1A A1, 05, 05] + +4DD6; [1A A3, 05, 05] + +4DD7; [1A A5, 05, 05] + +4DD8; [1A A7, 05, 05] + +4DD9; [1A A9, 05, 05] + +4DDA; [1A AB, 05, 05] + +4DDB; [1A AD, 05, 05] + +4DDC; [1A AF, 05, 05] + +4DDD; [1A B1, 05, 05] + +4DDE; [1A B3, 05, 05] + +4DDF; [1A B5, 05, 05] + +4DE0; [1A B7, 05, 05] + +4DE1; [1A B9, 05, 05] + +4DE2; [1A BB, 05, 05] + +4DE3; [1A BD, 05, 05] + +4DE4; [1A BF, 05, 05] + +4DE5; [1A C1, 05, 05] + +4DE6; [1A C3, 05, 05] + +4DE7; [1A C5, 05, 05] + +4DE8; [1A C7, 05, 05] + +4DE9; [1A C9, 05, 05] + +4DEA; [1A CB, 05, 05] + +4DEB; [1A CD, 05, 05] + +4DEC; [1A CF, 05, 05] + +4DED; [1A D1, 05, 05] + +4DEE; [1A D3, 05, 05] + +4DEF; [1A D5, 05, 05] + +4DF0; [1A D7, 05, 05] + +4DF1; [1A D9, 05, 05] + +4DF2; [1A DB, 05, 05] + +4DF3; [1A DD, 05, 05] + +4DF4; [1A DF, 05, 05] + +4DF5; [1A E1, 05, 05] + +4DF6; [1A E3, 05, 05] + +4DF7; [1A E5, 05, 05] + +4DF8; [1A E7, 05, 05] + +4DF9; [1A E9, 05, 05] + +4DFA; [1A EB, 05, 05] + +4DFB; [1A ED, 05, 05] + +4DFC; [1A EF, 05, 05] + +4DFD; [1A F1, 05, 05] + +4DFE; [1A F3, 05, 05] + +4DFF; [1A F5, 05, 05] + +D834 DF00; [1A F7, 05, 05] + +D834 DF01; [1A F9, 05, 05] + +D834 DF02; [1A FB, 05, 05] + +D834 DF03; [1A FD, 05, 05] + +D834 DF04; [1B 05, 05, 05] + +D834 DF05; [1B 07, 05, 05] + +D834 DF06; [1B 09, 05, 05] + +D834 DF07; [1B 0B, 05, 05] + +D834 DF08; [1B 0D, 05, 05] + +D834 DF09; [1B 0F, 05, 05] + +D834 DF0A; [1B 11, 05, 05] + +D834 DF0B; [1B 13, 05, 05] + +D834 DF0C; [1B 15, 05, 05] + +D834 DF0D; [1B 17, 05, 05] + +D834 DF0E; [1B 19, 05, 05] + +D834 DF0F; [1B 1B, 05, 05] + +D834 DF10; [1B 1D, 05, 05] + +D834 DF11; [1B 1F, 05, 05] + +D834 DF12; [1B 21, 05, 05] + +D834 DF13; [1B 23, 05, 05] + +D834 DF14; [1B 25, 05, 05] + +D834 DF15; [1B 27, 05, 05] + +D834 DF16; [1B 29, 05, 05] + +D834 DF17; [1B 2B, 05, 05] + +D834 DF18; [1B 2D, 05, 05] + +D834 DF19; [1B 2F, 05, 05] + +D834 DF1A; [1B 31, 05, 05] + +D834 DF1B; [1B 33, 05, 05] + +D834 DF1C; [1B 35, 05, 05] + +D834 DF1D; [1B 37, 05, 05] + +D834 DF1E; [1B 39, 05, 05] + +D834 DF1F; [1B 3B, 05, 05] + +D834 DF20; [1B 3D, 05, 05] + +D834 DF21; [1B 3F, 05, 05] + +D834 DF22; [1B 41, 05, 05] + +D834 DF23; [1B 43, 05, 05] + +D834 DF24; [1B 45, 05, 05] + +D834 DF25; [1B 47, 05, 05] + +D834 DF26; [1B 49, 05, 05] + +D834 DF27; [1B 4B, 05, 05] + +D834 DF28; [1B 4D, 05, 05] + +D834 DF29; [1B 4F, 05, 05] + +D834 DF2A; [1B 51, 05, 05] + +D834 DF2B; [1B 53, 05, 05] + +D834 DF2C; [1B 55, 05, 05] + +D834 DF2D; [1B 57, 05, 05] + +D834 DF2E; [1B 59, 05, 05] + +D834 DF2F; [1B 5B, 05, 05] + +D834 DF30; [1B 5D, 05, 05] + +D834 DF31; [1B 5F, 05, 05] + +D834 DF32; [1B 61, 05, 05] + +D834 DF33; [1B 63, 05, 05] + +D834 DF34; [1B 65, 05, 05] + +D834 DF35; [1B 67, 05, 05] + +D834 DF36; [1B 69, 05, 05] + +D834 DF37; [1B 6B, 05, 05] + +D834 DF38; [1B 6D, 05, 05] + +D834 DF39; [1B 6F, 05, 05] + +D834 DF3A; [1B 71, 05, 05] + +D834 DF3B; [1B 73, 05, 05] + +D834 DF3C; [1B 75, 05, 05] + +D834 DF3D; [1B 77, 05, 05] + +D834 DF3E; [1B 79, 05, 05] + +D834 DF3F; [1B 7B, 05, 05] + +D834 DF40; [1B 7D, 05, 05] + +D834 DF41; [1B 7F, 05, 05] + +D834 DF42; [1B 81, 05, 05] + +D834 DF43; [1B 83, 05, 05] + +D834 DF44; [1B 85, 05, 05] + +D834 DF45; [1B 87, 05, 05] + +D834 DF46; [1B 89, 05, 05] + +D834 DF47; [1B 8B, 05, 05] + +D834 DF48; [1B 8D, 05, 05] + +D834 DF49; [1B 8F, 05, 05] + +D834 DF4A; [1B 91, 05, 05] + +D834 DF4B; [1B 93, 05, 05] + +D834 DF4C; [1B 95, 05, 05] + +D834 DF4D; [1B 97, 05, 05] + +D834 DF4E; [1B 99, 05, 05] + +D834 DF4F; [1B 9B, 05, 05] + +D834 DF50; [1B 9D, 05, 05] + +D834 DF51; [1B 9F, 05, 05] + +D834 DF52; [1B A1, 05, 05] + +D834 DF53; [1B A3, 05, 05] + +D834 DF54; [1B A5, 05, 05] + +D834 DF55; [1B A7, 05, 05] + +D834 DF56; [1B A9, 05, 05] + +A490; [1B AB, 05, 05] + +A491; [1B AD, 05, 05] + +A492; [1B AF, 05, 05] + +A493; [1B B1, 05, 05] + +A494; [1B B3, 05, 05] + +A495; [1B B5, 05, 05] + +A496; [1B B7, 05, 05] + +A497; [1B B9, 05, 05] + +A498; [1B BB, 05, 05] + +A499; [1B BD, 05, 05] + +A49A; [1B BF, 05, 05] + +A49B; [1B C1, 05, 05] + +A49C; [1B C3, 05, 05] + +A49D; [1B C5, 05, 05] + +A49E; [1B C7, 05, 05] + +A49F; [1B C9, 05, 05] + +A4A0; [1B CB, 05, 05] + +A4A1; [1B CD, 05, 05] + +A4A2; [1B CF, 05, 05] + +A4A3; [1B D1, 05, 05] + +A4A4; [1B D3, 05, 05] + +A4A5; [1B D5, 05, 05] + +A4A6; [1B D7, 05, 05] + +A4A7; [1B D9, 05, 05] + +A4A8; [1B DB, 05, 05] + +A4A9; [1B DD, 05, 05] + +A4AA; [1B DF, 05, 05] + +A4AB; [1B E1, 05, 05] + +A4AC; [1B E3, 05, 05] + +A4AD; [1B E5, 05, 05] + +A4AE; [1B E7, 05, 05] + +A4AF; [1B E9, 05, 05] + +A4B0; [1B EB, 05, 05] + +A4B1; [1B ED, 05, 05] + +A4B2; [1B EF, 05, 05] + +A4B3; [1B F1, 05, 05] + +A4B4; [1B F3, 05, 05] + +A4B5; [1B F5, 05, 05] + +A4B6; [1B F7, 05, 05] + +A4B7; [1B F9, 05, 05] + +A4B8; [1B FB, 05, 05] + +A4B9; [1B FD, 05, 05] + +A4BA; [1C 05, 05, 05] + +A4BB; [1C 07, 05, 05] + +A4BC; [1C 09, 05, 05] + +A4BD; [1C 0B, 05, 05] + +A4BE; [1C 0D, 05, 05] + +A4BF; [1C 0F, 05, 05] + +A4C0; [1C 11, 05, 05] + +A4C1; [1C 13, 05, 05] + +A4C2; [1C 15, 05, 05] + +A4C3; [1C 17, 05, 05] + +A4C4; [1C 19, 05, 05] + +A4C5; [1C 1B, 05, 05] + +A4C6; [1C 1D, 05, 05] + +D800 DD37; [1C 1F, 05, 05] + +D800 DD38; [1C 21, 05, 05] + +D800 DD39; [1C 23, 05, 05] + +D800 DD3A; [1C 25, 05, 05] + +D800 DD3B; [1C 27, 05, 05] + +D800 DD3C; [1C 29, 05, 05] + +D800 DD3D; [1C 2B, 05, 05] + +D800 DD3E; [1C 2D, 05, 05] + +D800 DD3F; [1C 2F, 05, 05] + +D834 DC00; [1C 31, 05, 05] + +D834 DC01; [1C 33, 05, 05] + +D834 DC02; [1C 35, 05, 05] + +D834 DC03; [1C 37, 05, 05] + +D834 DC04; [1C 39, 05, 05] + +D834 DC05; [1C 3B, 05, 05] + +D834 DC06; [1C 3D, 05, 05] + +D834 DC07; [1C 3F, 05, 05] + +D834 DC08; [1C 41, 05, 05] + +D834 DC09; [1C 43, 05, 05] + +D834 DC0A; [1C 45, 05, 05] + +D834 DC0B; [1C 47, 05, 05] + +D834 DC0C; [1C 49, 05, 05] + +D834 DC0D; [1C 4B, 05, 05] + +D834 DC0E; [1C 4D, 05, 05] + +D834 DC0F; [1C 4F, 05, 05] + +D834 DC10; [1C 51, 05, 05] + +D834 DC11; [1C 53, 05, 05] + +D834 DC12; [1C 55, 05, 05] + +D834 DC13; [1C 57, 05, 05] + +D834 DC14; [1C 59, 05, 05] + +D834 DC15; [1C 5B, 05, 05] + +D834 DC16; [1C 5D, 05, 05] + +D834 DC17; [1C 5F, 05, 05] + +D834 DC18; [1C 61, 05, 05] + +D834 DC19; [1C 63, 05, 05] + +D834 DC1A; [1C 65, 05, 05] + +D834 DC1B; [1C 67, 05, 05] + +D834 DC1C; [1C 69, 05, 05] + +D834 DC1D; [1C 6B, 05, 05] + +D834 DC1E; [1C 6D, 05, 05] + +D834 DC1F; [1C 6F, 05, 05] + +D834 DC20; [1C 71, 05, 05] + +D834 DC21; [1C 73, 05, 05] + +D834 DC22; [1C 75, 05, 05] + +D834 DC23; [1C 77, 05, 05] + +D834 DC24; [1C 79, 05, 05] + +D834 DC25; [1C 7B, 05, 05] + +D834 DC26; [1C 7D, 05, 05] + +D834 DC27; [1C 7F, 05, 05] + +D834 DC28; [1C 81, 05, 05] + +D834 DC29; [1C 83, 05, 05] + +D834 DC2A; [1C 85, 05, 05] + +D834 DC2B; [1C 87, 05, 05] + +D834 DC2C; [1C 89, 05, 05] + +D834 DC2D; [1C 8B, 05, 05] + +D834 DC2E; [1C 8D, 05, 05] + +D834 DC2F; [1C 8F, 05, 05] + +D834 DC30; [1C 91, 05, 05] + +D834 DC31; [1C 93, 05, 05] + +D834 DC32; [1C 95, 05, 05] + +D834 DC33; [1C 97, 05, 05] + +D834 DC34; [1C 99, 05, 05] + +D834 DC35; [1C 9B, 05, 05] + +D834 DC36; [1C 9D, 05, 05] + +D834 DC37; [1C 9F, 05, 05] + +D834 DC38; [1C A1, 05, 05] + +D834 DC39; [1C A3, 05, 05] + +D834 DC3A; [1C A5, 05, 05] + +D834 DC3B; [1C A7, 05, 05] + +D834 DC3C; [1C A9, 05, 05] + +D834 DC3D; [1C AB, 05, 05] + +D834 DC3E; [1C AD, 05, 05] + +D834 DC3F; [1C AF, 05, 05] + +D834 DC40; [1C B1, 05, 05] + +D834 DC41; [1C B3, 05, 05] + +D834 DC42; [1C B5, 05, 05] + +D834 DC43; [1C B7, 05, 05] + +D834 DC44; [1C B9, 05, 05] + +D834 DC45; [1C BB, 05, 05] + +D834 DC46; [1C BD, 05, 05] + +D834 DC47; [1C BF, 05, 05] + +D834 DC48; [1C C1, 05, 05] + +D834 DC49; [1C C3, 05, 05] + +D834 DC4A; [1C C5, 05, 05] + +D834 DC4B; [1C C7, 05, 05] + +D834 DC4C; [1C C9, 05, 05] + +D834 DC4D; [1C CB, 05, 05] + +D834 DC4E; [1C CD, 05, 05] + +D834 DC4F; [1C CF, 05, 05] + +D834 DC50; [1C D1, 05, 05] + +D834 DC51; [1C D3, 05, 05] + +D834 DC52; [1C D5, 05, 05] + +D834 DC53; [1C D7, 05, 05] + +D834 DC54; [1C D9, 05, 05] + +D834 DC55; [1C DB, 05, 05] + +D834 DC56; [1C DD, 05, 05] + +D834 DC57; [1C DF, 05, 05] + +D834 DC58; [1C E1, 05, 05] + +D834 DC59; [1C E3, 05, 05] + +D834 DC5A; [1C E5, 05, 05] + +D834 DC5B; [1C E7, 05, 05] + +D834 DC5C; [1C E9, 05, 05] + +D834 DC5D; [1C EB, 05, 05] + +D834 DC5E; [1C ED, 05, 05] + +D834 DC5F; [1C EF, 05, 05] + +D834 DC60; [1C F1, 05, 05] + +D834 DC61; [1C F3, 05, 05] + +D834 DC62; [1C F5, 05, 05] + +D834 DC63; [1C F7, 05, 05] + +D834 DC64; [1C F9, 05, 05] + +D834 DC65; [1C FB, 05, 05] + +D834 DC66; [1C FD, 05, 05] + +D834 DC67; [1D 05, 05, 05] + +D834 DC68; [1D 07, 05, 05] + +D834 DC69; [1D 09, 05, 05] + +D834 DC6A; [1D 0B, 05, 05] + +D834 DC6B; [1D 0D, 05, 05] + +D834 DC6C; [1D 0F, 05, 05] + +D834 DC6D; [1D 11, 05, 05] + +D834 DC6E; [1D 13, 05, 05] + +D834 DC6F; [1D 15, 05, 05] + +D834 DC70; [1D 17, 05, 05] + +D834 DC71; [1D 19, 05, 05] + +D834 DC72; [1D 1B, 05, 05] + +D834 DC73; [1D 1D, 05, 05] + +D834 DC74; [1D 1F, 05, 05] + +D834 DC75; [1D 21, 05, 05] + +D834 DC76; [1D 23, 05, 05] + +D834 DC77; [1D 25, 05, 05] + +D834 DC78; [1D 27, 05, 05] + +D834 DC79; [1D 29, 05, 05] + +D834 DC7A; [1D 2B, 05, 05] + +D834 DC7B; [1D 2D, 05, 05] + +D834 DC7C; [1D 2F, 05, 05] + +D834 DC7D; [1D 31, 05, 05] + +D834 DC7E; [1D 33, 05, 05] + +D834 DC7F; [1D 35, 05, 05] + +D834 DC80; [1D 37, 05, 05] + +D834 DC81; [1D 39, 05, 05] + +D834 DC82; [1D 3B, 05, 05] + +D834 DC83; [1D 3D, 05, 05] + +D834 DC84; [1D 3F, 05, 05] + +D834 DC85; [1D 41, 05, 05] + +D834 DC86; [1D 43, 05, 05] + +D834 DC87; [1D 45, 05, 05] + +D834 DC88; [1D 47, 05, 05] + +D834 DC89; [1D 49, 05, 05] + +D834 DC8A; [1D 4B, 05, 05] + +D834 DC8B; [1D 4D, 05, 05] + +D834 DC8C; [1D 4F, 05, 05] + +D834 DC8D; [1D 51, 05, 05] + +D834 DC8E; [1D 53, 05, 05] + +D834 DC8F; [1D 55, 05, 05] + +D834 DC90; [1D 57, 05, 05] + +D834 DC91; [1D 59, 05, 05] + +D834 DC92; [1D 5B, 05, 05] + +D834 DC93; [1D 5D, 05, 05] + +D834 DC94; [1D 5F, 05, 05] + +D834 DC95; [1D 61, 05, 05] + +D834 DC96; [1D 63, 05, 05] + +D834 DC97; [1D 65, 05, 05] + +D834 DC98; [1D 67, 05, 05] + +D834 DC99; [1D 69, 05, 05] + +D834 DC9A; [1D 6B, 05, 05] + +D834 DC9B; [1D 6D, 05, 05] + +D834 DC9C; [1D 6F, 05, 05] + +D834 DC9D; [1D 71, 05, 05] + +D834 DC9E; [1D 73, 05, 05] + +D834 DC9F; [1D 75, 05, 05] + +D834 DCA0; [1D 77, 05, 05] + +D834 DCA1; [1D 79, 05, 05] + +D834 DCA2; [1D 7B, 05, 05] + +D834 DCA3; [1D 7D, 05, 05] + +D834 DCA4; [1D 7F, 05, 05] + +D834 DCA5; [1D 81, 05, 05] + +D834 DCA6; [1D 83, 05, 05] + +D834 DCA7; [1D 85, 05, 05] + +D834 DCA8; [1D 87, 05, 05] + +D834 DCA9; [1D 89, 05, 05] + +D834 DCAA; [1D 8B, 05, 05] + +D834 DCAB; [1D 8D, 05, 05] + +D834 DCAC; [1D 8F, 05, 05] + +D834 DCAD; [1D 91, 05, 05] + +D834 DCAE; [1D 93, 05, 05] + +D834 DCAF; [1D 95, 05, 05] + +D834 DCB0; [1D 97, 05, 05] + +D834 DCB1; [1D 99, 05, 05] + +D834 DCB2; [1D 9B, 05, 05] + +D834 DCB3; [1D 9D, 05, 05] + +D834 DCB4; [1D 9F, 05, 05] + +D834 DCB5; [1D A1, 05, 05] + +D834 DCB6; [1D A3, 05, 05] + +D834 DCB7; [1D A5, 05, 05] + +D834 DCB8; [1D A7, 05, 05] + +D834 DCB9; [1D A9, 05, 05] + +D834 DCBA; [1D AB, 05, 05] + +D834 DCBB; [1D AD, 05, 05] + +D834 DCBC; [1D AF, 05, 05] + +D834 DCBD; [1D B1, 05, 05] + +D834 DCBE; [1D B3, 05, 05] + +D834 DCBF; [1D B5, 05, 05] + +D834 DCC0; [1D B7, 05, 05] + +D834 DCC1; [1D B9, 05, 05] + +D834 DCC2; [1D BB, 05, 05] + +D834 DCC3; [1D BD, 05, 05] + +D834 DCC4; [1D BF, 05, 05] + +D834 DCC5; [1D C1, 05, 05] + +D834 DCC6; [1D C3, 05, 05] + +D834 DCC7; [1D C5, 05, 05] + +D834 DCC8; [1D C7, 05, 05] + +D834 DCC9; [1D C9, 05, 05] + +D834 DCCA; [1D CB, 05, 05] + +D834 DCCB; [1D CD, 05, 05] + +D834 DCCC; [1D CF, 05, 05] + +D834 DCCD; [1D D1, 05, 05] + +D834 DCCE; [1D D3, 05, 05] + +D834 DCCF; [1D D5, 05, 05] + +D834 DCD0; [1D D7, 05, 05] + +D834 DCD1; [1D D9, 05, 05] + +D834 DCD2; [1D DB, 05, 05] + +D834 DCD3; [1D DD, 05, 05] + +D834 DCD4; [1D DF, 05, 05] + +D834 DCD5; [1D E1, 05, 05] + +D834 DCD6; [1D E3, 05, 05] + +D834 DCD7; [1D E5, 05, 05] + +D834 DCD8; [1D E7, 05, 05] + +D834 DCD9; [1D E9, 05, 05] + +D834 DCDA; [1D EB, 05, 05] + +D834 DCDB; [1D ED, 05, 05] + +D834 DCDC; [1D EF, 05, 05] + +D834 DCDD; [1D F1, 05, 05] + +D834 DCDE; [1D F3, 05, 05] + +D834 DCDF; [1D F5, 05, 05] + +D834 DCE0; [1D F7, 05, 05] + +D834 DCE1; [1D F9, 05, 05] + +D834 DCE2; [1D FB, 05, 05] + +D834 DCE3; [1D FD, 05, 05] + +D834 DCE4; [1E 05, 05, 05] + +D834 DCE5; [1E 07, 05, 05] + +D834 DCE6; [1E 09, 05, 05] + +D834 DCE7; [1E 0B, 05, 05] + +D834 DCE8; [1E 0D, 05, 05] + +D834 DCE9; [1E 0F, 05, 05] + +D834 DCEA; [1E 11, 05, 05] + +D834 DCEB; [1E 13, 05, 05] + +D834 DCEC; [1E 15, 05, 05] + +D834 DCED; [1E 17, 05, 05] + +D834 DCEE; [1E 19, 05, 05] + +D834 DCEF; [1E 1B, 05, 05] + +D834 DCF0; [1E 1D, 05, 05] + +D834 DCF1; [1E 1F, 05, 05] + +D834 DCF2; [1E 21, 05, 05] + +D834 DCF3; [1E 23, 05, 05] + +D834 DCF4; [1E 25, 05, 05] + +D834 DCF5; [1E 27, 05, 05] + +D834 DD00; [1E 29, 05, 05] + +D834 DD01; [1E 2B, 05, 05] + +D834 DD02; [1E 2D, 05, 05] + +D834 DD03; [1E 2F, 05, 05] + +D834 DD04; [1E 31, 05, 05] + +D834 DD05; [1E 33, 05, 05] + +D834 DD06; [1E 35, 05, 05] + +D834 DD07; [1E 37, 05, 05] + +D834 DD08; [1E 39, 05, 05] + +D834 DD09; [1E 3B, 05, 05] + +D834 DD0A; [1E 3D, 05, 05] + +D834 DD0B; [1E 3F, 05, 05] + +D834 DD0C; [1E 41, 05, 05] + +D834 DD0D; [1E 43, 05, 05] + +D834 DD0E; [1E 45, 05, 05] + +D834 DD0F; [1E 47, 05, 05] + +D834 DD10; [1E 49, 05, 05] + +D834 DD11; [1E 4B, 05, 05] + +D834 DD12; [1E 4D, 05, 05] + +D834 DD13; [1E 4F, 05, 05] + +D834 DD14; [1E 51, 05, 05] + +D834 DD15; [1E 53, 05, 05] + +D834 DD16; [1E 55, 05, 05] + +D834 DD17; [1E 57, 05, 05] + +D834 DD18; [1E 59, 05, 05] + +D834 DD19; [1E 5B, 05, 05] + +D834 DD1A; [1E 5D, 05, 05] + +D834 DD1B; [1E 5F, 05, 05] + +D834 DD1C; [1E 61, 05, 05] + +D834 DD1D; [1E 63, 05, 05] + +D834 DD1E; [1E 65, 05, 05] + +D834 DD1F; [1E 67, 05, 05] + +D834 DD20; [1E 69, 05, 05] + +D834 DD21; [1E 6B, 05, 05] + +D834 DD22; [1E 6D, 05, 05] + +D834 DD23; [1E 6F, 05, 05] + +D834 DD24; [1E 71, 05, 05] + +D834 DD25; [1E 73, 05, 05] + +D834 DD26; [1E 75, 05, 05] + +266D; [1E 77, 05, 05] + +266E; [1E 79, 05, 05] + +266F; [1E 7B, 05, 05] + +D834 DD2A; [1E 7D, 05, 05] + +D834 DD2B; [1E 7F, 05, 05] -3030; [07 A2, 05, 05] +D834 DD2C; [1E 81, 05, 05] -30FB; [07 A4, 05, 05] -FF65; [07 A4, 05, A3] +D834 DD2D; [1E 83, 05, 05] -002C; [07 A6, 05, 05] -FF0C; [07 A6, 05, 07] -FE50; [07 A6, 05, 1D] +D834 DD2E; [1E 85, 05, 05] -055D; [07 A8, 05, 05] +D834 DD2F; [1E 87, 05, 05] -060C; [07 AA, 05, 05] +D834 DD30; [1E 89, 05, 05] -066B; [07 AC, 05, 05] +D834 DD31; [1E 8B, 05, 05] -066C; [07 AE, 05, 05] +D834 DD32; [1E 8D, 05, 05] -1802; [07 B0, 05, 05] +D834 DD33; [1E 8F, 05, 05] -1808; [07 B2, 05, 05] +D834 DD34; [1E 91, 05, 05] -3001; [07 B4, 05, 05] -FE51; [07 B4, 05, 1D] -FF64; [07 B4, 05, A3] +D834 DD35; [1E 93, 05, 05] -003B; [07 B6, 05, 05] -037E; [07 B6, 05, 05] -FF1B; [07 B6, 05, 07] -FE54; [07 B6, 05, 1D] +D834 DD36; [1E 95, 05, 05] -061B; [07 B8, 05, 05] +D834 DD37; [1E 97, 05, 05] -003A; [07 BA, 05, 05] -FF1A; [07 BA, 05, 07] -FE55; [07 BA, 05, 1D] +D834 DD38; [1E 99, 05, 05] -0589; [07 BC, 05, 05] +D834 DD39; [1E 9B, 05, 05] -0703; [07 BE, 05, 05] +D834 DD3A; [1E 9D, 05, 05] -0704; [07 C0, 05, 05] +D834 DD3B; [1E 9F, 05, 05] -0705; [07 C2, 05, 05] +D834 DD3C; [1E A1, 05, 05] -0706; [07 C4, 05, 05] +D834 DD3D; [1E A3, 05, 05] -0707; [07 C6, 05, 05] +D834 DD3E; [1E A5, 05, 05] -0708; [07 C8, 05, 05] +D834 DD3F; [1E A7, 05, 05] -1361; [07 CA, 05, 05] +D834 DD40; [1E A9, 05, 05] -1363; [07 CC, 05, 05] +D834 DD41; [1E AB, 05, 05] -1364; [07 CE, 05, 05] +D834 DD42; [1E AD, 05, 05] -1365; [07 D0, 05, 05] +D834 DD43; [1E AF, 05, 05] -1366; [07 D2, 05, 05] +D834 DD44; [1E B1, 05, 05] -1804; [07 D4, 05, 05] +D834 DD45; [1E B3, 05, 05] -1805; [07 D6, 05, 05] +D834 DD46; [1E B5, 05, 05] -0F14; [07 D8, 05, 05] +D834 DD47; [1E B7, 05, 05] -17D6; [07 DA, 05, 05] +D834 DD48; [1E B9, 05, 05] -16EB; [07 DC, 05, 05] +D834 DD49; [1E BB, 05, 05] -16EC; [07 DE, 05, 05] +D834 DD4A; [1E BD, 05, 05] -16ED; [07 E0, 05, 05] +D834 DD4B; [1E BF, 05, 05] -0021; [07 E2, 05, 05] -FF01; [07 E2, 05, 07] -FE57; [07 E2, 05, 1D] -203C; [07 E2, 05, 09][07 E2, 05, 09] -2049; [07 E2, 05, 09][07 E8, 05, 09] +D834 DD4C; [1E C1, 05, 05] -00A1; [07 E4, 05, 05] +D834 DD4D; [1E C3, 05, 05] -055C; [07 E6, 05, 05] +D834 DD4E; [1E C5, 05, 05] -003F; [07 E8, 05, 05] -FF1F; [07 E8, 05, 07] -FE56; [07 E8, 05, 1D] -2048; [07 E8, 05, 09][07 E2, 05, 09] +D834 DD4F; [1E C7, 05, 05] -00BF; [07 EA, 05, 05] +D834 DD50; [1E C9, 05, 05] -055E; [07 EC, 05, 05] +D834 DD51; [1E CB, 05, 05] -061F; [07 EE, 05, 05] +D834 DD52; [1E CD, 05, 05] -0709; [07 F0, 05, 05] +D834 DD53; [1E CF, 05, 05] -1367; [07 F2, 05, 05] +D834 DD54; [1E D1, 05, 05] -203D; [07 F4, 05, 05] +D834 DD55; [1E D3, 05, 05] -002E; [07 F6, 05, 05] -FF0E; [07 F6, 05, 07] -2024; [07 F6, 05, 09] -FE52; [07 F6, 05, 1D] -2025; [07 F6, 05, 09][07 F6, 05, 09] -FE30; [07 F6, 05, 2B][07 F6, 05, 2B] -2026; [07 F6, 05, 09][07 F6, 05, 09][07 F6, 05, 3D] +D834 DD56; [1E D5, 05, 05] -1801; [07 F8, 05, 05] +D834 DD57; [1E D7, 05, 05] +D834 DD5E; [1E D7, 05, 05] -06D4; [07 FA, 05, 05] +D834 DD58; [1E D9, 05, 05] +D834 DD5F; [1E D9, 05, 05] +D834 DD60; [1E D9, 05, 05] +D834 DD61; [1E D9, 05, 05] +D834 DD62; [1E D9, 05, 05] +D834 DD63; [1E D9, 05, 05] +D834 DD64; [1E D9, 05, 05] -0701; [07 FC, 05, 05] +D834 DD59; [1E DB, 05, 05] -0702; [07 FE, 05, 05] +D834 DD5A; [1E DD, 05, 05] -1362; [08 05, 05, 05] +D834 DD5B; [1E DF, 05, 05] -1803; [08 07, 05, 05] +D834 DD5C; [1E E1, 05, 05] -1809; [08 09, 05, 05] +D834 DD5D; [1E E3, 05, 05] -166E; [08 0B, 05, 05] +D834 DD6A; [1E E5, 05, 05] -3002; [08 0D, 05, 05] -FF61; [08 0D, 05, A3] +D834 DD6B; [1E E7, 05, 05] -00B7; [08 0F, 05, 05] -0387; [08 0F, 05, 05] +D834 DD6C; [1E E9, 05, 05] -0964; [08 11, 05, 05] +D834 DD83; [1E EB, 05, 05] -0965; [08 13, 05, 05] +D834 DD84; [1E ED, 05, 05] -104A; [08 15, 05, 05] +D834 DD8C; [1E EF, 05, 05] -104B; [08 17, 05, 05] +D834 DD8D; [1E F1, 05, 05] -17D4; [08 19, 05, 05] +D834 DD8E; [1E F3, 05, 05] -17D5; [08 1B, 05, 05] +D834 DD8F; [1E F5, 05, 05] -0700; [08 1D, 05, 05] +D834 DD90; [1E F7, 05, 05] -10FB; [08 1F, 05, 05] +D834 DD91; [1E F9, 05, 05] -1368; [08 21, 05, 05] +D834 DD92; [1E FB, 05, 05] -0027; [08 23, 05, 05] -FF07; [08 23, 05, 07] +D834 DD93; [1E FD, 05, 05] -2018; [08 25, 05, 05] +D834 DD94; [1F 05, 05, 05] -2019; [08 27, 05, 05] +D834 DD95; [1F 07, 05, 05] -201A; [08 29, 05, 05] +D834 DD96; [1F 09, 05, 05] -201B; [08 2B, 05, 05] +D834 DD97; [1F 0B, 05, 05] -2039; [08 2D, 05, 05] +D834 DD98; [1F 0D, 05, 05] -203A; [08 2F, 05, 05] +D834 DD99; [1F 0F, 05, 05] -0022; [08 31, 05, 05] -FF02; [08 31, 05, 07] +D834 DD9A; [1F 11, 05, 05] -201C; [08 33, 05, 05] +D834 DD9B; [1F 13, 05, 05] -201D; [08 35, 05, 05] - -201E; [08 37, 05, 05] - -201F; [08 39, 05, 05] - -301D; [08 3B, 05, 05] - -301E; [08 3D, 05, 05] - -301F; [08 3F, 05, 05] - -00AB; [08 41, 05, 05] - -00BB; [08 43, 05, 05] - -0028; [08 45, 05, 05] -FF08; [08 45, 05, 07] -FE59; [08 45, 05, 1D] -207D; [08 45, 05, 27] -208D; [08 45, 05, 29] -FE35; [08 45, 05, 2B] -2474; [08 45, 05, 09][1A 92, 05, 09][08 47, 05, 3D] -247D; [08 45, 05, 09][1A 92, 05, 09][1A 90, 05, 3D][08 47, 05, 3D] -247E; [08 45, 05, 09][1A 92, 05, 09][1A 92, 05, 3D][08 47, 05, 3D] -247F; [08 45, 05, 09][1A 92, 05, 09][1A 94, 05, 3D][08 47, 05, 3D] -2480; [08 45, 05, 09][1A 92, 05, 09][1A 96, 05, 3D][08 47, 05, 3D] -2481; [08 45, 05, 09][1A 92, 05, 09][1A 98, 05, 3D][08 47, 05, 3D] -2482; [08 45, 05, 09][1A 92, 05, 09][1A 9A, 05, 3D][08 47, 05, 3D] -2483; [08 45, 05, 09][1A 92, 05, 09][1A 9C, 05, 3D][08 47, 05, 3D] -2484; [08 45, 05, 09][1A 92, 05, 09][1A 9E, 05, 3D][08 47, 05, 3D] -2485; [08 45, 05, 09][1A 92, 05, 09][1A A0, 05, 3D][08 47, 05, 3D] -2486; [08 45, 05, 09][1A 92, 05, 09][1A A2, 05, 3D][08 47, 05, 3D] -2475; [08 45, 05, 09][1A 94, 05, 09][08 47, 05, 3D] -2487; [08 45, 05, 09][1A 94, 05, 09][1A 90, 05, 3D][08 47, 05, 3D] -2476; [08 45, 05, 09][1A 96, 05, 09][08 47, 05, 3D] -2477; [08 45, 05, 09][1A 98, 05, 09][08 47, 05, 3D] -2478; [08 45, 05, 09][1A 9A, 05, 09][08 47, 05, 3D] -2479; [08 45, 05, 09][1A 9C, 05, 09][08 47, 05, 3D] -247A; [08 45, 05, 09][1A 9E, 05, 09][08 47, 05, 3D] -247B; [08 45, 05, 09][1A A0, 05, 09][08 47, 05, 3D] -247C; [08 45, 05, 09][1A A2, 05, 09][08 47, 05, 3D] -249C; [08 45, 05, 09][1D, 05, 09][08 47, 05, 3D] -249D; [08 45, 05, 09][1F, 05, 09][08 47, 05, 3D] -249E; [08 45, 05, 09][21, 05, 09][08 47, 05, 3D] -249F; [08 45, 05, 09][23, 05, 09][08 47, 05, 3D] -24A0; [08 45, 05, 09][25, 05, 09][08 47, 05, 3D] -24A1; [08 45, 05, 09][27, 05, 09][08 47, 05, 3D] -24A2; [08 45, 05, 09][29, 05, 09][08 47, 05, 3D] -24A3; [08 45, 05, 09][2B, 05, 09][08 47, 05, 3D] -24A4; [08 45, 05, 09][2D, 05, 09][08 47, 05, 3D] -24A5; [08 45, 05, 09][2F, 05, 09][08 47, 05, 3D] -24A6; [08 45, 05, 09][31, 05, 09][08 47, 05, 3D] -24A7; [08 45, 05, 09][33, 05, 09][08 47, 05, 3D] -24A8; [08 45, 05, 09][35, 05, 09][08 47, 05, 3D] -24A9; [08 45, 05, 09][37, 05, 09][08 47, 05, 3D] -24AA; [08 45, 05, 09][39, 05, 09][08 47, 05, 3D] -24AB; [08 45, 05, 09][3B, 05, 09][08 47, 05, 3D] -24AC; [08 45, 05, 09][3D, 05, 09][08 47, 05, 3D] -24AD; [08 45, 05, 09][3F, 05, 09][08 47, 05, 3D] -24AE; [08 45, 05, 09][41, 05, 09][08 47, 05, 3D] -24AF; [08 45, 05, 09][43, 05, 09][08 47, 05, 3D] -24B0; [08 45, 05, 09][45, 05, 09][08 47, 05, 3D] -24B1; [08 45, 05, 09][47, 05, 09][08 47, 05, 3D] -24B2; [08 45, 05, 09][49, 05, 09][08 47, 05, 3D] -24B3; [08 45, 05, 09][4B, 05, 09][08 47, 05, 3D] -24B4; [08 45, 05, 09][4D, 05, 09][08 47, 05, 3D] -24B5; [08 45, 05, 09][4F, 05, 09][08 47, 05, 3D] -3200; [08 45, 05, 09][78 20, 05, 09][08 47, 05, 3D] -320E; [08 45, 05, 09][78 20, 05, 09][78 48, 05, 3D][08 47, 05, 3D] -3201; [08 45, 05, 09][78 24, 05, 09][08 47, 05, 3D] -320F; [08 45, 05, 09][78 24, 05, 09][78 48, 05, 3D][08 47, 05, 3D] -3202; [08 45, 05, 09][78 26, 05, 09][08 47, 05, 3D] -3210; [08 45, 05, 09][78 26, 05, 09][78 48, 05, 3D][08 47, 05, 3D] -3203; [08 45, 05, 09][78 2A, 05, 09][08 47, 05, 3D] -3211; [08 45, 05, 09][78 2A, 05, 09][78 48, 05, 3D][08 47, 05, 3D] -3204; [08 45, 05, 09][78 2C, 05, 09][08 47, 05, 3D] -3212; [08 45, 05, 09][78 2C, 05, 09][78 48, 05, 3D][08 47, 05, 3D] -3205; [08 45, 05, 09][78 2E, 05, 09][08 47, 05, 3D] -3213; [08 45, 05, 09][78 2E, 05, 09][78 48, 05, 3D][08 47, 05, 3D] -3206; [08 45, 05, 09][78 32, 05, 09][08 47, 05, 3D] -3214; [08 45, 05, 09][78 32, 05, 09][78 48, 05, 3D][08 47, 05, 3D] -3207; [08 45, 05, 09][78 36, 05, 09][08 47, 05, 3D] -3215; [08 45, 05, 09][78 36, 05, 09][78 48, 05, 3D][08 47, 05, 3D] -3208; [08 45, 05, 09][78 38, 05, 09][08 47, 05, 3D] -3216; [08 45, 05, 09][78 38, 05, 09][78 48, 05, 3D][08 47, 05, 3D] -321C; [08 45, 05, 09][78 38, 05, 09][78 62, 05, 3D][08 47, 05, 3D] -3209; [08 45, 05, 09][78 3C, 05, 09][08 47, 05, 3D] -3217; [08 45, 05, 09][78 3C, 05, 09][78 48, 05, 3D][08 47, 05, 3D] -320A; [08 45, 05, 09][78 3E, 05, 09][08 47, 05, 3D] -3218; [08 45, 05, 09][78 3E, 05, 09][78 48, 05, 3D][08 47, 05, 3D] -320B; [08 45, 05, 09][78 40, 05, 09][08 47, 05, 3D] -3219; [08 45, 05, 09][78 40, 05, 09][78 48, 05, 3D][08 47, 05, 3D] -320C; [08 45, 05, 09][78 42, 05, 09][08 47, 05, 3D] -321A; [08 45, 05, 09][78 42, 05, 09][78 48, 05, 3D][08 47, 05, 3D] -320D; [08 45, 05, 09][78 44, 05, 09][08 47, 05, 3D] -321B; [08 45, 05, 09][78 44, 05, 09][78 48, 05, 3D][08 47, 05, 3D] -3220; [08 45, 05, 09][E0 03 03, 05, 09][08 47, 05, 3D] -3226; [08 45, 05, 09][E0 03 09, 05, 09][08 47, 05, 3D] -3222; [08 45, 05, 09][E0 03 15, 05, 09][08 47, 05, 3D] -3228; [08 45, 05, 09][E0 03 BD, 05, 09][08 47, 05, 3D] -3221; [08 45, 05, 09][E0 04 1F, 05, 09][08 47, 05, 3D] -3224; [08 45, 05, 09][E0 04 2F, 05, 09][08 47, 05, 3D] -3239; [08 45, 05, 09][E0 04 CD, 05, 09][08 47, 05, 3D] -323D; [08 45, 05, 09][E0 05 0D, 05, 09][08 47, 05, 3D] -3241; [08 45, 05, 09][E0 05 2D, 05, 09][08 47, 05, 3D] -3227; [08 45, 05, 09][E0 09 F1, 05, 09][08 47, 05, 3D] -3225; [08 45, 05, 09][E0 09 F5, 05, 09][08 47, 05, 3D] -3238; [08 45, 05, 09][E0 0C 8F, 05, 09][08 47, 05, 3D] -3229; [08 45, 05, 09][E0 0D AD, 05, 09][08 47, 05, 3D] -323F; [08 45, 05, 09][E0 0D D3, 05, 09][08 47, 05, 3D] -3234; [08 45, 05, 09][E0 0F 4D, 05, 09][08 47, 05, 3D] -323A; [08 45, 05, 09][E0 10 2F, 05, 09][08 47, 05, 3D] -3223; [08 45, 05, 09][E0 14 FD, 05, 09][08 47, 05, 3D] -322F; [08 45, 05, 09][E0 15 89, 05, 09][08 47, 05, 3D] -323B; [08 45, 05, 09][E0 1E 3B, 05, 09][08 47, 05, 3D] -3230; [08 45, 05, 09][E0 33 8D, 05, 09][08 47, 05, 3D] -322A; [08 45, 05, 09][E0 35 DB, 05, 09][08 47, 05, 3D] -3232; [08 45, 05, 09][E0 35 DD, 05, 09][08 47, 05, 3D] -322D; [08 45, 05, 09][E0 36 1F, 05, 09][08 47, 05, 3D] -3231; [08 45, 05, 09][E0 38 2B, 05, 09][08 47, 05, 3D] -322C; [08 45, 05, 09][E0 40 5F, 05, 09][08 47, 05, 3D] -322B; [08 45, 05, 09][E0 48 ED, 05, 09][08 47, 05, 3D] -3235; [08 45, 05, 09][E0 4D 1D, 05, 09][08 47, 05, 3D] -323C; [08 45, 05, 09][E0 56 15, 05, 09][08 47, 05, 3D] -3233; [08 45, 05, 09][E0 5A DB, 05, 09][08 47, 05, 3D] -3237; [08 45, 05, 09][E0 5B 1D, 05, 09][08 47, 05, 3D] -3240; [08 45, 05, 09][E0 5B 3D, 05, 09][08 47, 05, 3D] -3242; [08 45, 05, 09][E0 6C 7B, 05, 09][08 47, 05, 3D] -3243; [08 45, 05, 09][E0 6C 8D, 05, 09][08 47, 05, 3D] -3236; [08 45, 05, 09][E0 82 41, 05, 09][08 47, 05, 3D] -323E; [08 45, 05, 09][E0 82 8D, 05, 09][08 47, 05, 3D] -322E; [08 45, 05, 09][E0 8C C9, 05, 09][08 47, 05, 3D] - -0029; [08 47, 05, 05] -FF09; [08 47, 05, 07] -FE5A; [08 47, 05, 1D] -207E; [08 47, 05, 27] -208E; [08 47, 05, 29] -FE36; [08 47, 05, 2B] - -005B; [08 49, 05, 05] -FF3B; [08 49, 05, 07] - -005D; [08 4B, 05, 05] -FF3D; [08 4B, 05, 07] - -007B; [08 4D, 05, 05] -FF5B; [08 4D, 05, 07] -FE5B; [08 4D, 05, 1D] -FE37; [08 4D, 05, 2B] - -007D; [08 4F, 05, 05] -FF5D; [08 4F, 05, 07] -FE5C; [08 4F, 05, 1D] -FE38; [08 4F, 05, 2B] - -0F3A; [08 51, 05, 05] - -0F3B; [08 53, 05, 05] - -0F3C; [08 55, 05, 05] - -0F3D; [08 57, 05, 05] - -169B; [08 59, 05, 05] - -169C; [08 5B, 05, 05] - -2045; [08 5D, 05, 05] - -2046; [08 5F, 05, 05] - -2329; [08 61, 05, 05] -3008; [08 61, 05, 05] -FE3F; [08 61, 05, 2B] +D834 DD9C; [1F 15, 05, 05] -232A; [08 63, 05, 05] -3009; [08 63, 05, 05] -FE40; [08 63, 05, 2B] +D834 DD9D; [1F 17, 05, 05] -300A; [08 65, 05, 05] -FE3D; [08 65, 05, 2B] +D834 DD9E; [1F 19, 05, 05] -300B; [08 67, 05, 05] -FE3E; [08 67, 05, 2B] +D834 DD9F; [1F 1B, 05, 05] -300C; [08 69, 05, 05] -FF62; [08 69, 05, A3] -FE41; [08 69, 05, 2B] +D834 DDA0; [1F 1D, 05, 05] -300D; [08 6B, 05, 05] -FF63; [08 6B, 05, A3] -FE42; [08 6B, 05, 2B] +D834 DDA1; [1F 1F, 05, 05] -300E; [08 6D, 05, 05] -FE43; [08 6D, 05, 2B] +D834 DDA2; [1F 21, 05, 05] -300F; [08 6F, 05, 05] -FE44; [08 6F, 05, 2B] +D834 DDA3; [1F 23, 05, 05] -3010; [08 71, 05, 05] -FE3B; [08 71, 05, 2B] +D834 DDA4; [1F 25, 05, 05] -3011; [08 73, 05, 05] -FE3C; [08 73, 05, 2B] +D834 DDA5; [1F 27, 05, 05] -3014; [08 75, 05, 05] -FE5D; [08 75, 05, 1D] -FE39; [08 75, 05, 2B] +D834 DDA6; [1F 29, 05, 05] -3015; [08 77, 05, 05] -FE5E; [08 77, 05, 1D] -FE3A; [08 77, 05, 2B] +D834 DDA7; [1F 2B, 05, 05] -3016; [08 79, 05, 05] +D834 DDA8; [1F 2D, 05, 05] -3017; [08 7B, 05, 05] +D834 DDA9; [1F 2F, 05, 05] -3018; [08 7D, 05, 05] +D834 DDAE; [1F 31, 05, 05] -3019; [08 7F, 05, 05] +D834 DDAF; [1F 33, 05, 05] -301A; [08 81, 05, 05] +D834 DDB0; [1F 35, 05, 05] -301B; [08 83, 05, 05] +D834 DDB1; [1F 37, 05, 05] -FD3E; [08 85, 05, 05] +D834 DDB2; [1F 39, 05, 05] -FD3F; [08 87, 05, 05] +D834 DDB3; [1F 3B, 05, 05] -00A7; [08 89, 05, 05] +D834 DDB4; [1F 3D, 05, 05] -00B6; [08 8B, 05, 05] +D834 DDB5; [1F 3F, 05, 05] -204B; [08 8D, 05, 05] +D834 DDB6; [1F 41, 05, 05] -00A9; [08 8F, 05, 05] +D834 DDB7; [1F 43, 05, 05] -00AE; [08 91, 05, 05] +D834 DDB8; [1F 45, 05, 05] -0040; [08 93, 05, 05] -FF20; [08 93, 05, 07] -FE6B; [08 93, 05, 1D] +D834 DDB9; [1F 47, 05, 05] +D834 DDBB; [1F 47, 05, 05] +D834 DDBD; [1F 47, 05, 05] +D834 DDBF; [1F 47, 05, 05] -002A; [08 95, 05, 05] -FF0A; [08 95, 05, 07] -FE61; [08 95, 05, 1D] +D834 DDBA; [1F 49, 05, 05] +D834 DDBC; [1F 49, 05, 05] +D834 DDBE; [1F 49, 05, 05] +D834 DDC0; [1F 49, 05, 05] -066D; [08 97, 05, 05] +D834 DDC1; [1F 4B, 05, 05] -002F; [08 99, 05, 05] -FF0F; [08 99, 05, 07] +D834 DDC2; [1F 4D, 05, 05] -2044; [08 9B, 05, 05] +D834 DDC3; [1F 4F, 05, 05] -005C; [08 9D, 05, 05] -FF3C; [08 9D, 05, 07] -FE68; [08 9D, 05, 1D] +D834 DDC4; [1F 51, 05, 05] -0026; [08 9F, 05, 05] -FF06; [08 9F, 05, 07] -FE60; [08 9F, 05, 1D] +D834 DDC5; [1F 53, 05, 05] -204A; [08 A1, 05, 05] +D834 DDC6; [1F 55, 05, 05] -0023; [08 A3, 05, 05] -FF03; [08 A3, 05, 07] -FE5F; [08 A3, 05, 1D] +D834 DDC7; [1F 57, 05, 05] -0025; [08 A5, 05, 05] -FF05; [08 A5, 05, 07] -FE6A; [08 A5, 05, 1D] +D834 DDC8; [1F 59, 05, 05] -066A; [08 A7, 05, 05] +D834 DDC9; [1F 5B, 05, 05] -2030; [08 A9, 05, 05] +D834 DDCA; [1F 5D, 05, 05] -2031; [08 AB, 05, 05] +D834 DDCB; [1F 5F, 05, 05] -2020; [08 AD, 05, 05] +D834 DDCC; [1F 61, 05, 05] -2021; [08 AF, 05, 05] +D834 DDCD; [1F 63, 05, 05] -2022; [08 B1, 05, 05] +D834 DDCE; [1F 65, 05, 05] -2023; [08 B3, 05, 05] +D834 DDCF; [1F 67, 05, 05] -2027; [08 B5, 05, 05] +D834 DDD0; [1F 69, 05, 05] -2043; [08 B7, 05, 05] +D834 DDD1; [1F 6B, 05, 05] -204C; [08 B9, 05, 05] +D834 DDD2; [1F 6D, 05, 05] -204D; [08 BB, 05, 05] +D834 DDD3; [1F 6F, 05, 05] -2032; [08 BD, 05, 05] -2033; [08 BD, 05, 09][08 BD, 05, 09] -2034; [08 BD, 05, 09][08 BD, 05, 09][08 BD, 05, 3D] +D834 DDD4; [1F 71, 05, 05] -2035; [08 BF, 05, 05] -2036; [08 BF, 05, 09][08 BF, 05, 09] -2037; [08 BF, 05, 09][08 BF, 05, 09][08 BF, 05, 3D] +D834 DDD5; [1F 73, 05, 05] -3003; [08 C1, 05, 05] +D834 DDD6; [1F 75, 05, 05] -2038; [08 C3, 05, 05] +D834 DDD7; [1F 77, 05, 05] -203B; [08 C5, 05, 05] +D834 DDD8; [1F 79, 05, 05] -203F; [08 C7, 05, 05] +D834 DDD9; [1F 7B, 05, 05] -2040; [08 C9, 05, 05] +D834 DDDA; [1F 7D, 05, 05] -2041; [08 CB, 05, 05] +D834 DDDB; [1F 7F, 05, 05] -2042; [08 CD, 05, 05] +D834 DDDC; [1F 81, 05, 05] -055A; [08 CF, 05, 05] +D834 DDDD; [1F 83, 05, 05] -055B; [08 D1, 05, 05] +2FF0; [1F 85, 05, 05] -055F; [08 D3, 05, 05] +2FF1; [1F 87, 05, 05] -05BE; [08 D5, 05, 05] +2FF2; [1F 89, 05, 05] -05C0; [08 D7, 05, 05] +2FF3; [1F 8B, 05, 05] -05C3; [08 D9, 05, 05] +2FF4; [1F 8D, 05, 05] -05F3; [08 DB, 05, 05] +2FF5; [1F 8F, 05, 05] -05F4; [08 DD, 05, 05] +2FF6; [1F 91, 05, 05] -070A; [08 DF, 05, 05] +2FF7; [1F 93, 05, 05] -070B; [08 E1, 05, 05] +2FF8; [1F 95, 05, 05] -070C; [08 E3, 05, 05] +2FF9; [1F 97, 05, 05] -070D; [08 E5, 05, 05] +2FFA; [1F 99, 05, 05] -1800; [08 E7, 05, 05] +2FFB; [1F 9B, 05, 05] -180A; [08 E9, 05, 05] +3004; [1F 9D, 05, 05] -0970; [08 EB, 05, 05] +3012; [1F 9F, 05, 05] +3036; [1F 9F, 05, 09] -0DF4; [08 ED, 05, 05] +3013; [1F A1, 05, 05] -0E5A; [08 EF, 05, 05] +3020; [1F A3, 05, 05] -0E5B; [08 F1, 05, 05] +3037; [1F A5, 05, 05] -0F04; [08 F3, 05, 05] +303E; [1F A7, 05, 05] -0F05; [08 F5, 05, 05] +303F; [1F A9, 05, 05] -0F06; [08 F7, 05, 05] +3190; [1F AB, 05, 05] -0F07; [08 F9, 05, 05] +3191; [1F AD, 05, 05] -0F08; [08 FB, 05, 05] +327F; [1F AF, 05, 05] -0F09; [08 FD, 05, 05] +FFFC; [1F B1, 05, 05] -0F0A; [09 05, 05, 05] +FFFD; [1F B3, 05, 05] -0F0B; [09 07, 05, 05] -0F0C; [09 07, 05, 35] +09F8; [1F B5, 05, 05] -0F0D; [09 09, 05, 05] +09F9; [1F B7, 05, 05] -0F0E; [09 0B, 05, 05] +0BF0; [1F B9, 05, 05] -0F0F; [09 0D, 05, 05] +0BF1; [1F BB, 05, 05] -0F10; [09 0F, 05, 05] +0BF2; [1F BD, 05, 05] -0F11; [09 11, 05, 05] +1372; [1F BF, 05, 05] -0F12; [09 13, 05, 05] +1373; [1F C1, 05, 05] -0F85; [09 15, 05, 05] +1374; [1F C3, 05, 05] -104C; [09 17, 05, 05] +1375; [1F C5, 05, 05] -104D; [09 19, 05, 05] +1376; [1F C7, 05, 05] -104E; [09 1B, 05, 05] +1377; [1F C9, 05, 05] -104F; [09 1D, 05, 05] +1378; [1F CB, 05, 05] -17D7; [09 1F, 05, 05] +1379; [1F CD, 05, 05] -17D8; [09 21, 05, 05] +137A; [1F CF, 05, 05] -17D9; [09 23, 05, 05] +137B; [1F D1, 05, 05] -17DA; [09 25, 05, 05] +137C; [1F D3, 05, 05] -17DC; [09 27, 05, 05] +2180; [1F D5, 05, 05] -02B9; [09 29, 05, 05] -0374; [09 29, 05, 05] +2181; [1F D7, 05, 05] -0375; [09 2B, 05, 05] +2182; [1F D9, 05, 05] -02BA; [09 2D, 05, 05] +2183; [1F DB, 05, 05] -02C2; [09 2F, 05, 05] +D800 DF22; [1F DD, 05, 05] -02C3; [09 31, 05, 05] +D800 DF23; [1F DF, 05, 05] -02C4; [09 33, 05, 05] +D800 DD10; [1F E1, 05, 05] -02C5; [09 35, 05, 05] +D800 DD11; [1F E3, 05, 05] -02C6; [09 37, 05, 05] +D800 DD12; [1F E5, 05, 05] -02C7; [09 39, 05, 05] +D800 DD13; [1F E7, 05, 05] -02C8; [09 3B, 05, 05] +D800 DD14; [1F E9, 05, 05] -02C9; [09 3D, 05, 05] +D800 DD15; [1F EB, 05, 05] -02CA; [09 3F, 05, 05] +D800 DD16; [1F ED, 05, 05] -02CB; [09 41, 05, 05] +D800 DD17; [1F EF, 05, 05] -02CC; [09 43, 05, 05] +D800 DD18; [1F F1, 05, 05] -02CD; [09 45, 05, 05] +D800 DD19; [1F F3, 05, 05] -02CE; [09 47, 05, 05] +D800 DD1A; [1F F5, 05, 05] -02CF; [09 49, 05, 05] +D800 DD1B; [1F F7, 05, 05] -02D2; [09 4B, 05, 05] +D800 DD1C; [1F F9, 05, 05] -02D3; [09 4D, 05, 05] +D800 DD1D; [1F FB, 05, 05] -02D4; [09 4F, 05, 05] +D800 DD1E; [1F FD, 05, 05] -02D5; [09 51, 05, 05] +D800 DD1F; [20 05, 05, 05] -02D6; [09 53, 05, 05] +D800 DD20; [20 07, 05, 05] -02D7; [09 55, 05, 05] +D800 DD21; [20 09, 05, 05] -02DE; [09 57, 05, 05] +D800 DD22; [20 0B, 05, 05] -02E5; [09 59, 05, 05] +D800 DD23; [20 0D, 05, 05] -02E6; [09 5B, 05, 05] +D800 DD24; [20 0F, 05, 05] -02E7; [09 5D, 05, 05] +D800 DD25; [20 11, 05, 05] -02E8; [09 5F, 05, 05] +D800 DD26; [20 13, 05, 05] -02E9; [09 61, 05, 05] +D800 DD27; [20 15, 05, 05] -02EA; [09 63, 05, 05] +D800 DD28; [20 17, 05, 05] -02EB; [09 65, 05, 05] +D800 DD29; [20 19, 05, 05] -02EC; [09 67, 05, 05] +D800 DD2A; [20 1B, 05, 05] -02ED; [09 69, 05, 05] +D800 DD2B; [20 1D, 05, 05] -00B0; [09 6B, 05, 05] -2103; [09 6B, 05, 09][21, 05, 93] -2109; [09 6B, 05, 09][27, 05, 93] +D800 DD2C; [20 1F, 05, 05] -0482; [09 6D, 05, 05] +D800 DD2D; [20 21, 05, 05] -06E9; [09 6F, 05, 05] +D800 DD2E; [20 23, 05, 05] -09FA; [09 71, 05, 05] +D800 DD2F; [20 25, 05, 05] -0B70; [09 73, 05, 05] +D800 DD30; [20 27, 05, 05] -0E4F; [09 75, 05, 05] +D800 DD31; [20 29, 05, 05] -0F01; [09 77, 05, 05] +D800 DD32; [20 2B, 05, 05] -0F02; [09 79, 05, 05] +D800 DD33; [20 2D, 05, 05] -0F03; [09 7B, 05, 05] +[variable top = 202D] # END OF VARIABLE SECTION!!! -0F13; [09 7D, 05, 05] +02D0; [23 20, 05, 05] -0F15; [09 7F, 05, 05] +02D1; [23 22, 05, 05] -0F16; [09 81, 05, 05] +0E46; [23 24, 05, 05] -0F17; [09 83, 05, 05] +0EC6; [23 26, 05, 05] -0F1A; [09 85, 05, 05] +3005; [23 28, 05, 05] -0F1B; [09 87, 05, 05] +303B; [23 2A, 05, 05] -0F1C; [09 89, 05, 05] +3031; [23 2C, 05, 05] +3032; [23 2C, 05, 05][, DC 2D, 05] -0F1D; [09 8B, 05, 05] +3033; [23 2E, 05, 05] +3034; [23 2E, 05, 05][, DC 2D, 05] -0F1E; [09 8D, 05, 05] +3035; [23 30, 05, 05] -0F1F; [09 8F, 05, 05] +309D; [23 32, 05, 05] +309E; [23 32, 05, 05][, DC 2D, 05] -0F34; [09 91, 05, 05] +30FC; [23 34, 05, 05] +FF70; [23 34, 05, A3] -0F36; [09 93, 05, 05] +30FD; [23 36, 05, 05] +30FE; [23 36, 05, 05][, DC 2D, 05] -0F38; [09 95, 05, 05] +00A4; [23 38, 05, 05] -0F3E; [09 97, 05, 05] +00A2; [23 3A, 05, 05] +FFE0; [23 3A, 05, 07] -0F3F; [09 99, 05, 05] +0024; [23 3C, 05, 05] +FF04; [23 3C, 05, 07] +FE69; [23 3C, 05, 1D] -0FBE; [09 9B, 05, 05] +00A3; [23 3E, 05, 05] +FFE1; [23 3E, 05, 07] -0FBF; [09 9D, 05, 05] +00A5; [23 40, 05, 05] +FFE5; [23 40, 05, 07] -0FC0; [09 9F, 05, 05] +09F2; [23 42, 05, 05] -0FC1; [09 A1, 05, 05] +09F3; [23 44, 05, 05] -0FC2; [09 A3, 05, 05] +0AF1; [23 46, 05, 05] -0FC3; [09 A5, 05, 05] +0BF9; [23 48, 05, 05] -0FC4; [09 A7, 05, 05] +0E3F; [23 4A, 05, 05] -0FC5; [09 A9, 05, 05] +17DB; [23 4C, 05, 05] -0FC7; [09 AB, 05, 05] +20A0; [23 4E, 05, 05] -0FC8; [09 AD, 05, 05] +20A1; [23 50, 05, 05] -0FC9; [09 AF, 05, 05] +20A2; [23 52, 05, 05] -0FCA; [09 B1, 05, 05] +20A3; [23 54, 05, 05] -0FCB; [09 B3, 05, 05] +20A4; [23 56, 05, 05] -0FCC; [09 B5, 05, 05] +20A5; [23 58, 05, 05] -0FCF; [09 B7, 05, 05] +20A6; [23 5A, 05, 05] -166D; [09 B9, 05, 05] +20A7; [23 5C, 05, 05] -2190; [09 BB, 05, 05] -FFE9; [09 BB, 05, A3] -219A; [09 BB, 05, 05][, A5, 05] +20A9; [23 5E, 05, 05] +FFE6; [23 5E, 05, 07] -2192; [09 BD, 05, 05] -FFEB; [09 BD, 05, A3] -219B; [09 BD, 05, 05][, A5, 05] +20AA; [23 60, 05, 05] -2191; [09 BF, 05, 05] -FFEA; [09 BF, 05, A3] +20AB; [23 62, 05, 05] -2193; [09 C1, 05, 05] -FFEC; [09 C1, 05, A3] +20AC; [23 64, 05, 05] -2194; [09 C3, 05, 05] -21AE; [09 C3, 05, 05][, A5, 05] +20AD; [23 66, 05, 05] -2195; [09 C5, 05, 05] +20AE; [23 68, 05, 05] + +20AF; [23 6A, 05, 05] + +20B0; [23 6C, 05, 05] + +20B1; [23 6E, 05, 05] + +0030; [23 70, 05, 05] +FF10; [23 70, 05, 07] +D835 DFCE; [23 70, 05, 0B] +D835 DFD8; [23 70, 05, 0B] +D835 DFE2; [23 70, 05, 0B] +D835 DFEC; [23 70, 05, 0B] +D835 DFF6; [23 70, 05, 0B] +24EA; [23 70, 05, 0D] +24FF; [23 70, 05, 0D] +2070; [23 70, 05, 27] +2080; [23 70, 05, 29] +0660; [23 70, 05, 05][, E0 DD, 05] +06F0; [23 70, 05, 05][, E0 ED, 05] +D801 DCA0; [23 70, 05, 05][, E1 11, 05] +0966; [23 70, 05, 05][, E1 21, 05] +09E6; [23 70, 05, 05][, E1 31, 05] +0A66; [23 70, 05, 05][, E1 51, 05] +0AE6; [23 70, 05, 05][, E1 61, 05] +0B66; [23 70, 05, 05][, E1 71, 05] +0C66; [23 70, 05, 05][, E1 91, 05] +0CE6; [23 70, 05, 05][, E1 A1, 05] +0D66; [23 70, 05, 05][, E1 B1, 05] +1946; [23 70, 05, 05][, E1 C1, 05] +0E50; [23 70, 05, 05][, E1 D1, 05] +0ED0; [23 70, 05, 05][, E1 E1, 05] +0F20; [23 70, 05, 05][, E1 F1, 05] +0F33; [23 70, 05, 09][, E1 F1, 09] +1040; [23 70, 05, 05][, E2 05, 05] +17E0; [23 70, 05, 05][, E2 15, 05] +17F0; [23 70, 05, 05][, E2 25, 05] +1810; [23 70, 05, 05][, E2 35, 05] +3007; [23 70, 05, 05][, E2 45, 05] +3358; [23 70, 05, 09][E0 4B 22, 05, 09] + +0031; [23 72, 05, 05] +FF11; [23 72, 05, 07] +D835 DFCF; [23 72, 05, 0B] +D835 DFD9; [23 72, 05, 0B] +D835 DFE3; [23 72, 05, 0B] +D835 DFED; [23 72, 05, 0B] +D835 DFF7; [23 72, 05, 0B] +2460; [23 72, 05, 0D] +24F5; [23 72, 05, 0D] +2776; [23 72, 05, 0D] +2780; [23 72, 05, 0D] +278A; [23 72, 05, 0D] +00B9; [23 72, 05, 27] +2081; [23 72, 05, 29] +0661; [23 72, 05, 05][, E0 DD, 05] +06F1; [23 72, 05, 05][, E0 ED, 05] +1369; [23 72, 05, 05][, E0 FD, 05] +D801 DCA1; [23 72, 05, 05][, E1 11, 05] +0967; [23 72, 05, 05][, E1 21, 05] +09E7; [23 72, 05, 05][, E1 31, 05] +09F4; [23 72, 05, 05][, E1 41, 05] +0A67; [23 72, 05, 05][, E1 51, 05] +0AE7; [23 72, 05, 05][, E1 61, 05] +0B67; [23 72, 05, 05][, E1 71, 05] +0BE7; [23 72, 05, 05][, E1 81, 05] +0C67; [23 72, 05, 05][, E1 91, 05] +0CE7; [23 72, 05, 05][, E1 A1, 05] +0D67; [23 72, 05, 05][, E1 B1, 05] +1947; [23 72, 05, 05][, E1 C1, 05] +0E51; [23 72, 05, 05][, E1 D1, 05] +0ED1; [23 72, 05, 05][, E1 E1, 05] +0F21; [23 72, 05, 05][, E1 F1, 05] +0F2A; [23 72, 05, 09][, E1 F1, 09] +1041; [23 72, 05, 05][, E2 05, 05] +17E1; [23 72, 05, 05][, E2 15, 05] +17F1; [23 72, 05, 05][, E2 25, 05] +1811; [23 72, 05, 05][, E2 35, 05] +3021; [23 72, 05, 05][, E2 45, 05] +D800 DD07; [23 72, 05, 05][, E2 55, 05] +D800 DF20; [23 72, 05, 05][, E2 65, 05] +2488; [23 72, 05, 09][08 0B, 05, 09] +215F; [23 72, 05, 3B][08 EB, 05, 3B] +00BD; [23 72, 05, 3B][08 EB, 05, 3B][23 74, 05, 3D] +2153; [23 72, 05, 3B][08 EB, 05, 3B][23 76, 05, 3D] +00BC; [23 72, 05, 3B][08 EB, 05, 3B][23 78, 05, 3D] +2155; [23 72, 05, 3B][08 EB, 05, 3B][23 7A, 05, 3D] +2159; [23 72, 05, 3B][08 EB, 05, 3B][23 7C, 05, 3D] +215B; [23 72, 05, 3B][08 EB, 05, 3B][23 80, 05, 3D] +2469; [23 72, 05, 0D][23 70, 05, 0D] +24FE; [23 72, 05, 0D][23 70, 05, 0D] +277F; [23 72, 05, 0D][23 70, 05, 0D] +2789; [23 72, 05, 0D][23 70, 05, 0D] +2793; [23 72, 05, 0D][23 70, 05, 0D] +2491; [23 72, 05, 09][23 70, 05, 09][08 0B, 05, 3D] +33E9; [23 72, 05, 09][23 70, 05, 09][E0 34 F0, 05, 3D] +32C9; [23 72, 05, 09][23 70, 05, 09][E0 37 48, 05, 3D] +3362; [23 72, 05, 09][23 70, 05, 09][E0 4B 22, 05, 3D] +246A; [23 72, 05, 0D][23 72, 05, 0D] +24EB; [23 72, 05, 0D][23 72, 05, 0D] +2492; [23 72, 05, 09][23 72, 05, 09][08 0B, 05, 3D] +33EA; [23 72, 05, 09][23 72, 05, 09][E0 34 F0, 05, 3D] +32CA; [23 72, 05, 09][23 72, 05, 09][E0 37 48, 05, 3D] +3363; [23 72, 05, 09][23 72, 05, 09][E0 4B 22, 05, 3D] +246B; [23 72, 05, 0D][23 74, 05, 0D] +24EC; [23 72, 05, 0D][23 74, 05, 0D] +2493; [23 72, 05, 09][23 74, 05, 09][08 0B, 05, 3D] +33EB; [23 72, 05, 09][23 74, 05, 09][E0 34 F0, 05, 3D] +32CB; [23 72, 05, 09][23 74, 05, 09][E0 37 48, 05, 3D] +3364; [23 72, 05, 09][23 74, 05, 09][E0 4B 22, 05, 3D] +246C; [23 72, 05, 0D][23 76, 05, 0D] +24ED; [23 72, 05, 0D][23 76, 05, 0D] +2494; [23 72, 05, 09][23 76, 05, 09][08 0B, 05, 3D] +33EC; [23 72, 05, 09][23 76, 05, 09][E0 34 F0, 05, 3D] +3365; [23 72, 05, 09][23 76, 05, 09][E0 4B 22, 05, 3D] +246D; [23 72, 05, 0D][23 78, 05, 0D] +24EE; [23 72, 05, 0D][23 78, 05, 0D] +2495; [23 72, 05, 09][23 78, 05, 09][08 0B, 05, 3D] +33ED; [23 72, 05, 09][23 78, 05, 09][E0 34 F0, 05, 3D] +3366; [23 72, 05, 09][23 78, 05, 09][E0 4B 22, 05, 3D] +246E; [23 72, 05, 0D][23 7A, 05, 0D] +24EF; [23 72, 05, 0D][23 7A, 05, 0D] +2496; [23 72, 05, 09][23 7A, 05, 09][08 0B, 05, 3D] +33EE; [23 72, 05, 09][23 7A, 05, 09][E0 34 F0, 05, 3D] +3367; [23 72, 05, 09][23 7A, 05, 09][E0 4B 22, 05, 3D] +246F; [23 72, 05, 0D][23 7C, 05, 0D] +24F0; [23 72, 05, 0D][23 7C, 05, 0D] +2497; [23 72, 05, 09][23 7C, 05, 09][08 0B, 05, 3D] +33EF; [23 72, 05, 09][23 7C, 05, 09][E0 34 F0, 05, 3D] +3368; [23 72, 05, 09][23 7C, 05, 09][E0 4B 22, 05, 3D] +2470; [23 72, 05, 0D][23 7E, 05, 0D] +24F1; [23 72, 05, 0D][23 7E, 05, 0D] +2498; [23 72, 05, 09][23 7E, 05, 09][08 0B, 05, 3D] +33F0; [23 72, 05, 09][23 7E, 05, 09][E0 34 F0, 05, 3D] +3369; [23 72, 05, 09][23 7E, 05, 09][E0 4B 22, 05, 3D] +2471; [23 72, 05, 0D][23 80, 05, 0D] +24F2; [23 72, 05, 0D][23 80, 05, 0D] +2499; [23 72, 05, 09][23 80, 05, 09][08 0B, 05, 3D] +33F1; [23 72, 05, 09][23 80, 05, 09][E0 34 F0, 05, 3D] +336A; [23 72, 05, 09][23 80, 05, 09][E0 4B 22, 05, 3D] +2472; [23 72, 05, 0D][23 82, 05, 0D] +24F3; [23 72, 05, 0D][23 82, 05, 0D] +249A; [23 72, 05, 09][23 82, 05, 09][08 0B, 05, 3D] +33F2; [23 72, 05, 09][23 82, 05, 09][E0 34 F0, 05, 3D] +336B; [23 72, 05, 09][23 82, 05, 09][E0 4B 22, 05, 3D] +33E0; [23 72, 05, 09][E0 34 F0, 05, 09] +32C0; [23 72, 05, 09][E0 37 48, 05, 09] +3359; [23 72, 05, 09][E0 4B 22, 05, 09] + +0032; [23 74, 05, 05] +FF12; [23 74, 05, 07] +D835 DFD0; [23 74, 05, 0B] +D835 DFDA; [23 74, 05, 0B] +D835 DFE4; [23 74, 05, 0B] +D835 DFEE; [23 74, 05, 0B] +D835 DFF8; [23 74, 05, 0B] +2461; [23 74, 05, 0D] +24F6; [23 74, 05, 0D] +2777; [23 74, 05, 0D] +2781; [23 74, 05, 0D] +278B; [23 74, 05, 0D] +00B2; [23 74, 05, 27] +2082; [23 74, 05, 29] +0662; [23 74, 05, 05][, E0 DD, 05] +06F2; [23 74, 05, 05][, E0 ED, 05] +136A; [23 74, 05, 05][, E0 FD, 05] +D801 DCA2; [23 74, 05, 05][, E1 11, 05] +0968; [23 74, 05, 05][, E1 21, 05] +09E8; [23 74, 05, 05][, E1 31, 05] +09F5; [23 74, 05, 05][, E1 41, 05] +0A68; [23 74, 05, 05][, E1 51, 05] +0AE8; [23 74, 05, 05][, E1 61, 05] +0B68; [23 74, 05, 05][, E1 71, 05] +0BE8; [23 74, 05, 05][, E1 81, 05] +0C68; [23 74, 05, 05][, E1 91, 05] +0CE8; [23 74, 05, 05][, E1 A1, 05] +0D68; [23 74, 05, 05][, E1 B1, 05] +1948; [23 74, 05, 05][, E1 C1, 05] +0E52; [23 74, 05, 05][, E1 D1, 05] +0ED2; [23 74, 05, 05][, E1 E1, 05] +0F22; [23 74, 05, 05][, E1 F1, 05] +0F2B; [23 74, 05, 09][, E1 F1, 09] +1042; [23 74, 05, 05][, E2 05, 05] +17E2; [23 74, 05, 05][, E2 15, 05] +17F2; [23 74, 05, 05][, E2 25, 05] +1812; [23 74, 05, 05][, E2 35, 05] +3022; [23 74, 05, 05][, E2 45, 05] +D800 DD08; [23 74, 05, 05][, E2 55, 05] +2489; [23 74, 05, 09][08 0B, 05, 09] +2154; [23 74, 05, 3B][08 EB, 05, 3B][23 76, 05, 3D] +2156; [23 74, 05, 3B][08 EB, 05, 3B][23 7A, 05, 3D] +2473; [23 74, 05, 0D][23 70, 05, 0D] +24F4; [23 74, 05, 0D][23 70, 05, 0D] +249B; [23 74, 05, 09][23 70, 05, 09][08 0B, 05, 3D] +33F3; [23 74, 05, 09][23 70, 05, 09][E0 34 F0, 05, 3D] +336C; [23 74, 05, 09][23 70, 05, 09][E0 4B 22, 05, 3D] +3251; [23 74, 05, 0D][23 72, 05, 0D] +33F4; [23 74, 05, 09][23 72, 05, 09][E0 34 F0, 05, 3D] +336D; [23 74, 05, 09][23 72, 05, 09][E0 4B 22, 05, 3D] +3252; [23 74, 05, 0D][23 74, 05, 0D] +33F5; [23 74, 05, 09][23 74, 05, 09][E0 34 F0, 05, 3D] +336E; [23 74, 05, 09][23 74, 05, 09][E0 4B 22, 05, 3D] +3253; [23 74, 05, 0D][23 76, 05, 0D] +33F6; [23 74, 05, 09][23 76, 05, 09][E0 34 F0, 05, 3D] +336F; [23 74, 05, 09][23 76, 05, 09][E0 4B 22, 05, 3D] +3254; [23 74, 05, 0D][23 78, 05, 0D] +33F7; [23 74, 05, 09][23 78, 05, 09][E0 34 F0, 05, 3D] +3370; [23 74, 05, 09][23 78, 05, 09][E0 4B 22, 05, 3D] +3255; [23 74, 05, 0D][23 7A, 05, 0D] +33F8; [23 74, 05, 09][23 7A, 05, 09][E0 34 F0, 05, 3D] +3256; [23 74, 05, 0D][23 7C, 05, 0D] +33F9; [23 74, 05, 09][23 7C, 05, 09][E0 34 F0, 05, 3D] +3257; [23 74, 05, 0D][23 7E, 05, 0D] +33FA; [23 74, 05, 09][23 7E, 05, 09][E0 34 F0, 05, 3D] +3258; [23 74, 05, 0D][23 80, 05, 0D] +33FB; [23 74, 05, 09][23 80, 05, 09][E0 34 F0, 05, 3D] +3259; [23 74, 05, 0D][23 82, 05, 0D] +33FC; [23 74, 05, 09][23 82, 05, 09][E0 34 F0, 05, 3D] +33E1; [23 74, 05, 09][E0 34 F0, 05, 09] +32C1; [23 74, 05, 09][E0 37 48, 05, 09] +335A; [23 74, 05, 09][E0 4B 22, 05, 09] + +0033; [23 76, 05, 05] +FF13; [23 76, 05, 07] +D835 DFD1; [23 76, 05, 0B] +D835 DFDB; [23 76, 05, 0B] +D835 DFE5; [23 76, 05, 0B] +D835 DFEF; [23 76, 05, 0B] +D835 DFF9; [23 76, 05, 0B] +2462; [23 76, 05, 0D] +24F7; [23 76, 05, 0D] +2778; [23 76, 05, 0D] +2782; [23 76, 05, 0D] +278C; [23 76, 05, 0D] +00B3; [23 76, 05, 27] +2083; [23 76, 05, 29] +0663; [23 76, 05, 05][, E0 DD, 05] +06F3; [23 76, 05, 05][, E0 ED, 05] +136B; [23 76, 05, 05][, E0 FD, 05] +D801 DCA3; [23 76, 05, 05][, E1 11, 05] +0969; [23 76, 05, 05][, E1 21, 05] +09E9; [23 76, 05, 05][, E1 31, 05] +09F6; [23 76, 05, 05][, E1 41, 05] +0A69; [23 76, 05, 05][, E1 51, 05] +0AE9; [23 76, 05, 05][, E1 61, 05] +0B69; [23 76, 05, 05][, E1 71, 05] +0BE9; [23 76, 05, 05][, E1 81, 05] +0C69; [23 76, 05, 05][, E1 91, 05] +0CE9; [23 76, 05, 05][, E1 A1, 05] +0D69; [23 76, 05, 05][, E1 B1, 05] +1949; [23 76, 05, 05][, E1 C1, 05] +0E53; [23 76, 05, 05][, E1 D1, 05] +0ED3; [23 76, 05, 05][, E1 E1, 05] +0F23; [23 76, 05, 05][, E1 F1, 05] +0F2C; [23 76, 05, 09][, E1 F1, 09] +1043; [23 76, 05, 05][, E2 05, 05] +17E3; [23 76, 05, 05][, E2 15, 05] +17F3; [23 76, 05, 05][, E2 25, 05] +1813; [23 76, 05, 05][, E2 35, 05] +3023; [23 76, 05, 05][, E2 45, 05] +D800 DD09; [23 76, 05, 05][, E2 55, 05] +248A; [23 76, 05, 09][08 0B, 05, 09] +00BE; [23 76, 05, 3B][08 EB, 05, 3B][23 78, 05, 3D] +2157; [23 76, 05, 3B][08 EB, 05, 3B][23 7A, 05, 3D] +215C; [23 76, 05, 3B][08 EB, 05, 3B][23 80, 05, 3D] +325A; [23 76, 05, 0D][23 70, 05, 0D] +33FD; [23 76, 05, 09][23 70, 05, 09][E0 34 F0, 05, 3D] +325B; [23 76, 05, 0D][23 72, 05, 0D] +33FE; [23 76, 05, 09][23 72, 05, 09][E0 34 F0, 05, 3D] +325C; [23 76, 05, 0D][23 74, 05, 0D] +325D; [23 76, 05, 0D][23 76, 05, 0D] +325E; [23 76, 05, 0D][23 78, 05, 0D] +325F; [23 76, 05, 0D][23 7A, 05, 0D] +32B1; [23 76, 05, 0D][23 7C, 05, 0D] +32B2; [23 76, 05, 0D][23 7E, 05, 0D] +32B3; [23 76, 05, 0D][23 80, 05, 0D] +32B4; [23 76, 05, 0D][23 82, 05, 0D] +33E2; [23 76, 05, 09][E0 34 F0, 05, 09] +32C2; [23 76, 05, 09][E0 37 48, 05, 09] +335B; [23 76, 05, 09][E0 4B 22, 05, 09] + +0034; [23 78, 05, 05] +FF14; [23 78, 05, 07] +D835 DFD2; [23 78, 05, 0B] +D835 DFDC; [23 78, 05, 0B] +D835 DFE6; [23 78, 05, 0B] +D835 DFF0; [23 78, 05, 0B] +D835 DFFA; [23 78, 05, 0B] +2463; [23 78, 05, 0D] +24F8; [23 78, 05, 0D] +2779; [23 78, 05, 0D] +2783; [23 78, 05, 0D] +278D; [23 78, 05, 0D] +2074; [23 78, 05, 27] +2084; [23 78, 05, 29] +0664; [23 78, 05, 05][, E0 DD, 05] +06F4; [23 78, 05, 05][, E0 ED, 05] +136C; [23 78, 05, 05][, E0 FD, 05] +D801 DCA4; [23 78, 05, 05][, E1 11, 05] +096A; [23 78, 05, 05][, E1 21, 05] +09EA; [23 78, 05, 05][, E1 31, 05] +09F7; [23 78, 05, 05][, E1 41, 05] +0A6A; [23 78, 05, 05][, E1 51, 05] +0AEA; [23 78, 05, 05][, E1 61, 05] +0B6A; [23 78, 05, 05][, E1 71, 05] +0BEA; [23 78, 05, 05][, E1 81, 05] +0C6A; [23 78, 05, 05][, E1 91, 05] +0CEA; [23 78, 05, 05][, E1 A1, 05] +0D6A; [23 78, 05, 05][, E1 B1, 05] +194A; [23 78, 05, 05][, E1 C1, 05] +0E54; [23 78, 05, 05][, E1 D1, 05] +0ED4; [23 78, 05, 05][, E1 E1, 05] +0F24; [23 78, 05, 05][, E1 F1, 05] +0F2D; [23 78, 05, 09][, E1 F1, 09] +1044; [23 78, 05, 05][, E2 05, 05] +17E4; [23 78, 05, 05][, E2 15, 05] +17F4; [23 78, 05, 05][, E2 25, 05] +1814; [23 78, 05, 05][, E2 35, 05] +3024; [23 78, 05, 05][, E2 45, 05] +D800 DD0A; [23 78, 05, 05][, E2 55, 05] +248B; [23 78, 05, 09][08 0B, 05, 09] +2158; [23 78, 05, 3B][08 EB, 05, 3B][23 7A, 05, 3D] +32B5; [23 78, 05, 0D][23 70, 05, 0D] +32B6; [23 78, 05, 0D][23 72, 05, 0D] +32B7; [23 78, 05, 0D][23 74, 05, 0D] +32B8; [23 78, 05, 0D][23 76, 05, 0D] +32B9; [23 78, 05, 0D][23 78, 05, 0D] +32BA; [23 78, 05, 0D][23 7A, 05, 0D] +32BB; [23 78, 05, 0D][23 7C, 05, 0D] +32BC; [23 78, 05, 0D][23 7E, 05, 0D] +32BD; [23 78, 05, 0D][23 80, 05, 0D] +32BE; [23 78, 05, 0D][23 82, 05, 0D] +33E3; [23 78, 05, 09][E0 34 F0, 05, 09] +32C3; [23 78, 05, 09][E0 37 48, 05, 09] +335C; [23 78, 05, 09][E0 4B 22, 05, 09] + +0035; [23 7A, 05, 05] +FF15; [23 7A, 05, 07] +D835 DFD3; [23 7A, 05, 0B] +D835 DFDD; [23 7A, 05, 0B] +D835 DFE7; [23 7A, 05, 0B] +D835 DFF1; [23 7A, 05, 0B] +D835 DFFB; [23 7A, 05, 0B] +2464; [23 7A, 05, 0D] +24F9; [23 7A, 05, 0D] +277A; [23 7A, 05, 0D] +2784; [23 7A, 05, 0D] +278E; [23 7A, 05, 0D] +2075; [23 7A, 05, 27] +2085; [23 7A, 05, 29] +0665; [23 7A, 05, 05][, E0 DD, 05] +06F5; [23 7A, 05, 05][, E0 ED, 05] +136D; [23 7A, 05, 05][, E0 FD, 05] +D801 DCA5; [23 7A, 05, 05][, E1 11, 05] +096B; [23 7A, 05, 05][, E1 21, 05] +09EB; [23 7A, 05, 05][, E1 31, 05] +0A6B; [23 7A, 05, 05][, E1 51, 05] +0AEB; [23 7A, 05, 05][, E1 61, 05] +0B6B; [23 7A, 05, 05][, E1 71, 05] +0BEB; [23 7A, 05, 05][, E1 81, 05] +0C6B; [23 7A, 05, 05][, E1 91, 05] +0CEB; [23 7A, 05, 05][, E1 A1, 05] +0D6B; [23 7A, 05, 05][, E1 B1, 05] +194B; [23 7A, 05, 05][, E1 C1, 05] +0E55; [23 7A, 05, 05][, E1 D1, 05] +0ED5; [23 7A, 05, 05][, E1 E1, 05] +0F25; [23 7A, 05, 05][, E1 F1, 05] +0F2E; [23 7A, 05, 09][, E1 F1, 09] +1045; [23 7A, 05, 05][, E2 05, 05] +17E5; [23 7A, 05, 05][, E2 15, 05] +17F5; [23 7A, 05, 05][, E2 25, 05] +1815; [23 7A, 05, 05][, E2 35, 05] +3025; [23 7A, 05, 05][, E2 45, 05] +D800 DD0B; [23 7A, 05, 05][, E2 55, 05] +D800 DF21; [23 7A, 05, 05][, E2 65, 05] +248C; [23 7A, 05, 09][08 0B, 05, 09] +215A; [23 7A, 05, 3B][08 EB, 05, 3B][23 7C, 05, 3D] +215D; [23 7A, 05, 3B][08 EB, 05, 3B][23 80, 05, 3D] +32BF; [23 7A, 05, 0D][23 70, 05, 0D] +33E4; [23 7A, 05, 09][E0 34 F0, 05, 09] +32C4; [23 7A, 05, 09][E0 37 48, 05, 09] +335D; [23 7A, 05, 09][E0 4B 22, 05, 09] + +0036; [23 7C, 05, 05] +FF16; [23 7C, 05, 07] +D835 DFD4; [23 7C, 05, 0B] +D835 DFDE; [23 7C, 05, 0B] +D835 DFE8; [23 7C, 05, 0B] +D835 DFF2; [23 7C, 05, 0B] +D835 DFFC; [23 7C, 05, 0B] +2465; [23 7C, 05, 0D] +24FA; [23 7C, 05, 0D] +277B; [23 7C, 05, 0D] +2785; [23 7C, 05, 0D] +278F; [23 7C, 05, 0D] +2076; [23 7C, 05, 27] +2086; [23 7C, 05, 29] +0666; [23 7C, 05, 05][, E0 DD, 05] +06F6; [23 7C, 05, 05][, E0 ED, 05] +136E; [23 7C, 05, 05][, E0 FD, 05] +D801 DCA6; [23 7C, 05, 05][, E1 11, 05] +096C; [23 7C, 05, 05][, E1 21, 05] +09EC; [23 7C, 05, 05][, E1 31, 05] +0A6C; [23 7C, 05, 05][, E1 51, 05] +0AEC; [23 7C, 05, 05][, E1 61, 05] +0B6C; [23 7C, 05, 05][, E1 71, 05] +0BEC; [23 7C, 05, 05][, E1 81, 05] +0C6C; [23 7C, 05, 05][, E1 91, 05] +0CEC; [23 7C, 05, 05][, E1 A1, 05] +0D6C; [23 7C, 05, 05][, E1 B1, 05] +194C; [23 7C, 05, 05][, E1 C1, 05] +0E56; [23 7C, 05, 05][, E1 D1, 05] +0ED6; [23 7C, 05, 05][, E1 E1, 05] +0F26; [23 7C, 05, 05][, E1 F1, 05] +0F2F; [23 7C, 05, 09][, E1 F1, 09] +1046; [23 7C, 05, 05][, E2 05, 05] +17E6; [23 7C, 05, 05][, E2 15, 05] +17F6; [23 7C, 05, 05][, E2 25, 05] +1816; [23 7C, 05, 05][, E2 35, 05] +3026; [23 7C, 05, 05][, E2 45, 05] +D800 DD0C; [23 7C, 05, 05][, E2 55, 05] +248D; [23 7C, 05, 09][08 0B, 05, 09] +33E5; [23 7C, 05, 09][E0 34 F0, 05, 09] +32C5; [23 7C, 05, 09][E0 37 48, 05, 09] +335E; [23 7C, 05, 09][E0 4B 22, 05, 09] + +0037; [23 7E, 05, 05] +FF17; [23 7E, 05, 07] +D835 DFD5; [23 7E, 05, 0B] +D835 DFDF; [23 7E, 05, 0B] +D835 DFE9; [23 7E, 05, 0B] +D835 DFF3; [23 7E, 05, 0B] +D835 DFFD; [23 7E, 05, 0B] +2466; [23 7E, 05, 0D] +24FB; [23 7E, 05, 0D] +277C; [23 7E, 05, 0D] +2786; [23 7E, 05, 0D] +2790; [23 7E, 05, 0D] +2077; [23 7E, 05, 27] +2087; [23 7E, 05, 29] +0667; [23 7E, 05, 05][, E0 DD, 05] +06F7; [23 7E, 05, 05][, E0 ED, 05] +136F; [23 7E, 05, 05][, E0 FD, 05] +D801 DCA7; [23 7E, 05, 05][, E1 11, 05] +096D; [23 7E, 05, 05][, E1 21, 05] +09ED; [23 7E, 05, 05][, E1 31, 05] +0A6D; [23 7E, 05, 05][, E1 51, 05] +0AED; [23 7E, 05, 05][, E1 61, 05] +0B6D; [23 7E, 05, 05][, E1 71, 05] +0BED; [23 7E, 05, 05][, E1 81, 05] +0C6D; [23 7E, 05, 05][, E1 91, 05] +0CED; [23 7E, 05, 05][, E1 A1, 05] +0D6D; [23 7E, 05, 05][, E1 B1, 05] +194D; [23 7E, 05, 05][, E1 C1, 05] +0E57; [23 7E, 05, 05][, E1 D1, 05] +0ED7; [23 7E, 05, 05][, E1 E1, 05] +0F27; [23 7E, 05, 05][, E1 F1, 05] +0F30; [23 7E, 05, 09][, E1 F1, 09] +1047; [23 7E, 05, 05][, E2 05, 05] +17E7; [23 7E, 05, 05][, E2 15, 05] +17F7; [23 7E, 05, 05][, E2 25, 05] +1817; [23 7E, 05, 05][, E2 35, 05] +3027; [23 7E, 05, 05][, E2 45, 05] +D800 DD0D; [23 7E, 05, 05][, E2 55, 05] +248E; [23 7E, 05, 09][08 0B, 05, 09] +215E; [23 7E, 05, 3B][08 EB, 05, 3B][23 80, 05, 3D] +33E6; [23 7E, 05, 09][E0 34 F0, 05, 09] +32C6; [23 7E, 05, 09][E0 37 48, 05, 09] +335F; [23 7E, 05, 09][E0 4B 22, 05, 09] + +0038; [23 80, 05, 05] +FF18; [23 80, 05, 07] +D835 DFD6; [23 80, 05, 0B] +D835 DFE0; [23 80, 05, 0B] +D835 DFEA; [23 80, 05, 0B] +D835 DFF4; [23 80, 05, 0B] +D835 DFFE; [23 80, 05, 0B] +2467; [23 80, 05, 0D] +24FC; [23 80, 05, 0D] +277D; [23 80, 05, 0D] +2787; [23 80, 05, 0D] +2791; [23 80, 05, 0D] +2078; [23 80, 05, 27] +2088; [23 80, 05, 29] +0668; [23 80, 05, 05][, E0 DD, 05] +06F8; [23 80, 05, 05][, E0 ED, 05] +1370; [23 80, 05, 05][, E0 FD, 05] +D801 DCA8; [23 80, 05, 05][, E1 11, 05] +096E; [23 80, 05, 05][, E1 21, 05] +09EE; [23 80, 05, 05][, E1 31, 05] +0A6E; [23 80, 05, 05][, E1 51, 05] +0AEE; [23 80, 05, 05][, E1 61, 05] +0B6E; [23 80, 05, 05][, E1 71, 05] +0BEE; [23 80, 05, 05][, E1 81, 05] +0C6E; [23 80, 05, 05][, E1 91, 05] +0CEE; [23 80, 05, 05][, E1 A1, 05] +0D6E; [23 80, 05, 05][, E1 B1, 05] +194E; [23 80, 05, 05][, E1 C1, 05] +0E58; [23 80, 05, 05][, E1 D1, 05] +0ED8; [23 80, 05, 05][, E1 E1, 05] +0F28; [23 80, 05, 05][, E1 F1, 05] +0F31; [23 80, 05, 09][, E1 F1, 09] +1048; [23 80, 05, 05][, E2 05, 05] +17E8; [23 80, 05, 05][, E2 15, 05] +17F8; [23 80, 05, 05][, E2 25, 05] +1818; [23 80, 05, 05][, E2 35, 05] +3028; [23 80, 05, 05][, E2 45, 05] +D800 DD0E; [23 80, 05, 05][, E2 55, 05] +248F; [23 80, 05, 09][08 0B, 05, 09] +33E7; [23 80, 05, 09][E0 34 F0, 05, 09] +32C7; [23 80, 05, 09][E0 37 48, 05, 09] +3360; [23 80, 05, 09][E0 4B 22, 05, 09] + +0039; [23 82, 05, 05] +FF19; [23 82, 05, 07] +D835 DFD7; [23 82, 05, 0B] +D835 DFE1; [23 82, 05, 0B] +D835 DFEB; [23 82, 05, 0B] +D835 DFF5; [23 82, 05, 0B] +D835 DFFF; [23 82, 05, 0B] +2468; [23 82, 05, 0D] +24FD; [23 82, 05, 0D] +277E; [23 82, 05, 0D] +2788; [23 82, 05, 0D] +2792; [23 82, 05, 0D] +2079; [23 82, 05, 27] +2089; [23 82, 05, 29] +0669; [23 82, 05, 05][, E0 DD, 05] +06F9; [23 82, 05, 05][, E0 ED, 05] +1371; [23 82, 05, 05][, E0 FD, 05] +D801 DCA9; [23 82, 05, 05][, E1 11, 05] +096F; [23 82, 05, 05][, E1 21, 05] +09EF; [23 82, 05, 05][, E1 31, 05] +0A6F; [23 82, 05, 05][, E1 51, 05] +0AEF; [23 82, 05, 05][, E1 61, 05] +0B6F; [23 82, 05, 05][, E1 71, 05] +0BEF; [23 82, 05, 05][, E1 81, 05] +0C6F; [23 82, 05, 05][, E1 91, 05] +0CEF; [23 82, 05, 05][, E1 A1, 05] +0D6F; [23 82, 05, 05][, E1 B1, 05] +194F; [23 82, 05, 05][, E1 C1, 05] +0E59; [23 82, 05, 05][, E1 D1, 05] +0ED9; [23 82, 05, 05][, E1 E1, 05] +0F29; [23 82, 05, 05][, E1 F1, 05] +0F32; [23 82, 05, 09][, E1 F1, 09] +1049; [23 82, 05, 05][, E2 05, 05] +17E9; [23 82, 05, 05][, E2 15, 05] +17F9; [23 82, 05, 05][, E2 25, 05] +1819; [23 82, 05, 05][, E2 35, 05] +3029; [23 82, 05, 05][, E2 45, 05] +D800 DD0F; [23 82, 05, 05][, E2 55, 05] +2490; [23 82, 05, 09][08 0B, 05, 09] +33E8; [23 82, 05, 09][E0 34 F0, 05, 09] +32C8; [23 82, 05, 09][E0 37 48, 05, 09] +3361; [23 82, 05, 09][E0 4B 22, 05, 09] + +0061; [26, 05, 05] +FF41; [26, 05, 07] +0363; [26, 05, 09] +D835 DC1A; [26, 05, 0B] +D835 DC4E; [26, 05, 0B] +D835 DC82; [26, 05, 0B] +D835 DCB6; [26, 05, 0B] +D835 DCEA; [26, 05, 0B] +D835 DD1E; [26, 05, 0B] +D835 DD52; [26, 05, 0B] +D835 DD86; [26, 05, 0B] +D835 DDBA; [26, 05, 0B] +D835 DDEE; [26, 05, 0B] +D835 DE22; [26, 05, 0B] +D835 DE56; [26, 05, 0B] +D835 DE8A; [26, 05, 0B] +24D0; [26, 05, 0D] +0041; [26, 05, 8F] +FF21; [26, 05, 91] +D835 DC00; [26, 05, 95] +D835 DC34; [26, 05, 95] +D835 DC68; [26, 05, 95] +D835 DC9C; [26, 05, 95] +D835 DCD0; [26, 05, 95] +D835 DD04; [26, 05, 95] +D835 DD38; [26, 05, 95] +D835 DD6C; [26, 05, 95] +D835 DDA0; [26, 05, 95] +D835 DDD4; [26, 05, 95] +D835 DE08; [26, 05, 95] +D835 DE3C; [26, 05, 95] +D835 DE70; [26, 05, 95] +24B6; [26, 05, 97] +00AA; [26, 05, 27] +1D2C; [26, 05, 27] +1D43; [26, 05, 27] +00E1; [26, 05, 05][, 8D, 05] +00C1; [26, 05, 8F][, 8D, 05] +00E0; [26, 05, 05][, 8F, 05] +00C0; [26, 05, 8F][, 8F, 05] +0103; [26, 05, 05][, 91, 05] +0102; [26, 05, 8F][, 91, 05] +1EAF; [26, 05, 05][, 91, 05][, 8D, 05] +1EAE; [26, 05, 8F][, 91, 05][, 8D, 05] +1EB1; [26, 05, 05][, 91, 05][, 8F, 05] +1EB0; [26, 05, 8F][, 91, 05][, 8F, 05] +1EB5; [26, 05, 05][, 91, 05][, A1, 05] +1EB4; [26, 05, 8F][, 91, 05][, A1, 05] +1EB3; [26, 05, 05][, 91, 05][, AF, 05] +1EB2; [26, 05, 8F][, 91, 05][, AF, 05] +00E2; [26, 05, 05][, 93, 05] +00C2; [26, 05, 8F][, 93, 05] +1EA5; [26, 05, 05][, 93, 05][, 8D, 05] +1EA4; [26, 05, 8F][, 93, 05][, 8D, 05] +1EA7; [26, 05, 05][, 93, 05][, 8F, 05] +1EA6; [26, 05, 8F][, 93, 05][, 8F, 05] +1EAB; [26, 05, 05][, 93, 05][, A1, 05] +1EAA; [26, 05, 8F][, 93, 05][, A1, 05] +1EA9; [26, 05, 05][, 93, 05][, AF, 05] +1EA8; [26, 05, 8F][, 93, 05][, AF, 05] +01CE; [26, 05, 05][, 97, 05] +01CD; [26, 05, 8F][, 97, 05] +00E5; [26, 05, 05][, 99, 05] +00C5; [26, 05, 8F][, 99, 05] +212B; [26, 05, 8F][, 99, 05] +01FB; [26, 05, 05][, 99, 05][, 8D, 05] +01FA; [26, 05, 8F][, 99, 05][, 8D, 05] +00E4; [26, 05, 05][, 9D, 05] +00C4; [26, 05, 8F][, 9D, 05] +01DF; [26, 05, 05][, 9D, 05][, AB, 05] +01DE; [26, 05, 8F][, 9D, 05][, AB, 05] +00E3; [26, 05, 05][, A1, 05] +00C3; [26, 05, 8F][, A1, 05] +0227; [26, 05, 05][, A3, 05] +0226; [26, 05, 8F][, A3, 05] +01E1; [26, 05, 05][, A3, 05][, AB, 05] +01E0; [26, 05, 8F][, A3, 05][, AB, 05] +0105; [26, 05, 05][, A9, 05] +0104; [26, 05, 8F][, A9, 05] +0101; [26, 05, 05][, AB, 05] +0100; [26, 05, 8F][, AB, 05] +1EA3; [26, 05, 05][, AF, 05] +1EA2; [26, 05, 8F][, AF, 05] +0201; [26, 05, 05][, B5, 05] +0200; [26, 05, 8F][, B5, 05] +0203; [26, 05, 05][, B9, 05] +0202; [26, 05, 8F][, B9, 05] +1EA1; [26, 05, 05][, D0 4D, 05] +1EA0; [26, 05, 8F][, D0 4D, 05] +1EB7; [26, 05, 05][, D0 4D, 05][, 91, 05] +1EB6; [26, 05, 8F][, D0 4D, 05][, 91, 05] +1EAD; [26, 05, 05][, D0 4D, 05][, 93, 05] +1EAC; [26, 05, 8F][, D0 4D, 05][, 93, 05] +1E01; [26, 05, 05][, D0 6D, 05] +1E00; [26, 05, 8F][, D0 6D, 05] +33C2; [26, 05, 37][08 0B, 05, 37][3E, 05, 3D][08 0B, 05, 3D] +2100; [26, 05, 09][08 E9, 05, 09][2A, 05, 3D] +2101; [26, 05, 09][08 E9, 05, 09][4A, 05, 3D] +33DF; [26, 05, B9][0B D1, 05, 37][3E, 05, 3D] +3373; [26, 05, B9][4E, 05, B9] +1E9A; [26, 05, 09][59 8A, 05, 09] + +1D00; [27 60, 05, 05] + +00E6; [27 62, 05, 05] +00C6; [27 62, 05, 8F] +1D2D; [27 62, 05, 27] +01FD; [27 62, 05, 05][, 8D, 05] +01FC; [27 62, 05, 8F][, 8D, 05] +01E3; [27 62, 05, 05][, AB, 05] +01E2; [27 62, 05, 8F][, AB, 05] + +1D01; [27 64, 05, 05] + +1D02; [27 66, 05, 05] +1D46; [27 66, 05, 27] + +0250; [27 68, 05, 05] +1D44; [27 68, 05, 27] + +0251; [27 6A, 05, 05] +1D45; [27 6A, 05, 27] + +0252; [27 6C, 05, 05] + +0062; [28, 05, 05] +FF42; [28, 05, 07] +D835 DC1B; [28, 05, 0B] +D835 DC4F; [28, 05, 0B] +D835 DC83; [28, 05, 0B] +D835 DCB7; [28, 05, 0B] +D835 DCEB; [28, 05, 0B] +D835 DD1F; [28, 05, 0B] +D835 DD53; [28, 05, 0B] +D835 DD87; [28, 05, 0B] +D835 DDBB; [28, 05, 0B] +D835 DDEF; [28, 05, 0B] +D835 DE23; [28, 05, 0B] +D835 DE57; [28, 05, 0B] +D835 DE8B; [28, 05, 0B] +24D1; [28, 05, 0D] +0042; [28, 05, 8F] +FF22; [28, 05, 91] +212C; [28, 05, 95] +D835 DC01; [28, 05, 95] +D835 DC35; [28, 05, 95] +D835 DC69; [28, 05, 95] +D835 DCD1; [28, 05, 95] +D835 DD05; [28, 05, 95] +D835 DD39; [28, 05, 95] +D835 DD6D; [28, 05, 95] +D835 DDA1; [28, 05, 95] +D835 DDD5; [28, 05, 95] +D835 DE09; [28, 05, 95] +D835 DE3D; [28, 05, 95] +D835 DE71; [28, 05, 95] +24B7; [28, 05, 97] +1D2E; [28, 05, 27] +1D47; [28, 05, 27] +1E03; [28, 05, 05][, A3, 05] +1E02; [28, 05, 8F][, A3, 05] +1E05; [28, 05, 05][, D0 4D, 05] +1E04; [28, 05, 8F][, D0 4D, 05] +1E07; [28, 05, 05][, D1 11, 05] +1E06; [28, 05, 8F][, D1 11, 05] +3374; [28, 05, 37][26, 05, 37][48, 05, 3D] +33C3; [28, 05, B9][46, 05, 37] + +0299; [29 60, 05, 05] + +0180; [29 62, 05, 05] + +1D2F; [29 64, 05, 05] + +1D03; [29 66, 05, 05] + +0253; [29 68, 05, 05] +0181; [29 68, 05, 8F] + +0183; [29 6A, 05, 05] +0182; [29 6A, 05, 8F] + +0063; [2A, 05, 05] +FF43; [2A, 05, 07] +0368; [2A, 05, 09] +217D; [2A, 05, 09] +D835 DC1C; [2A, 05, 0B] +D835 DC50; [2A, 05, 0B] +D835 DC84; [2A, 05, 0B] +D835 DCB8; [2A, 05, 0B] +D835 DCEC; [2A, 05, 0B] +D835 DD20; [2A, 05, 0B] +D835 DD54; [2A, 05, 0B] +D835 DD88; [2A, 05, 0B] +D835 DDBC; [2A, 05, 0B] +D835 DDF0; [2A, 05, 0B] +D835 DE24; [2A, 05, 0B] +D835 DE58; [2A, 05, 0B] +D835 DE8C; [2A, 05, 0B] +24D2; [2A, 05, 0D] +0043; [2A, 05, 8F] +FF23; [2A, 05, 91] +216D; [2A, 05, 93] +2102; [2A, 05, 95] +212D; [2A, 05, 95] +D835 DC02; [2A, 05, 95] +D835 DC36; [2A, 05, 95] +D835 DC6A; [2A, 05, 95] +D835 DC9E; [2A, 05, 95] +D835 DCD2; [2A, 05, 95] +D835 DD6E; [2A, 05, 95] +D835 DDA2; [2A, 05, 95] +D835 DDD6; [2A, 05, 95] +D835 DE0A; [2A, 05, 95] +D835 DE3E; [2A, 05, 95] +D835 DE72; [2A, 05, 95] +24B8; [2A, 05, 97] +0107; [2A, 05, 05][, 8D, 05] +0106; [2A, 05, 8F][, 8D, 05] +0109; [2A, 05, 05][, 93, 05] +0108; [2A, 05, 8F][, 93, 05] +010D; [2A, 05, 05][, 97, 05] +010C; [2A, 05, 8F][, 97, 05] +010B; [2A, 05, 05][, A3, 05] +010A; [2A, 05, 8F][, A3, 05] +00E7; [2A, 05, 05][, A7, 05] +00C7; [2A, 05, 8F][, A7, 05] +1E09; [2A, 05, 05][, A7, 05][, 8D, 05] +1E08; [2A, 05, 8F][, A7, 05][, 8D, 05] +2105; [2A, 05, 09][08 E9, 05, 09][42, 05, 3D] +2106; [2A, 05, 09][08 E9, 05, 09][4E, 05, 3D] +33C6; [2A, 05, B9][0B D1, 05, 37][3A, 05, 3D][32, 05, 3D] +3388; [2A, 05, 37][26, 05, 37][3C, 05, 3D] +33C4; [2A, 05, 37][2A, 05, 37] +33C5; [2A, 05, 37][2C, 05, 37] +339D; [2A, 05, 37][3E, 05, 37] +33A0; [2A, 05, 37][3E, 05, 37][23 74, 05, 3D] +33A4; [2A, 05, 37][3E, 05, 37][23 76, 05, 3D] +33C7; [2A, 05, B9][42, 05, 37][08 0B, 05, 3D] + +1D04; [2B 60, 05, 05] + +0188; [2B 62, 05, 05] +0187; [2B 62, 05, 8F] + +0255; [2B 64, 05, 05] + +0064; [2C, 05, 05] +FF44; [2C, 05, 07] +0369; [2C, 05, 09] +217E; [2C, 05, 09] +2146; [2C, 05, 0B] +D835 DC1D; [2C, 05, 0B] +D835 DC51; [2C, 05, 0B] +D835 DC85; [2C, 05, 0B] +D835 DCB9; [2C, 05, 0B] +D835 DCED; [2C, 05, 0B] +D835 DD21; [2C, 05, 0B] +D835 DD55; [2C, 05, 0B] +D835 DD89; [2C, 05, 0B] +D835 DDBD; [2C, 05, 0B] +D835 DDF1; [2C, 05, 0B] +D835 DE25; [2C, 05, 0B] +D835 DE59; [2C, 05, 0B] +D835 DE8D; [2C, 05, 0B] +24D3; [2C, 05, 0D] +0044; [2C, 05, 8F] +FF24; [2C, 05, 91] +216E; [2C, 05, 93] +2145; [2C, 05, 95] +D835 DC03; [2C, 05, 95] +D835 DC37; [2C, 05, 95] +D835 DC6B; [2C, 05, 95] +D835 DC9F; [2C, 05, 95] +D835 DCD3; [2C, 05, 95] +D835 DD07; [2C, 05, 95] +D835 DD3B; [2C, 05, 95] +D835 DD6F; [2C, 05, 95] +D835 DDA3; [2C, 05, 95] +D835 DDD7; [2C, 05, 95] +D835 DE0B; [2C, 05, 95] +D835 DE3F; [2C, 05, 95] +D835 DE73; [2C, 05, 95] +24B9; [2C, 05, 97] +1D30; [2C, 05, 27] +1D48; [2C, 05, 27] +010F; [2C, 05, 05][, 97, 05] +010E; [2C, 05, 8F][, 97, 05] +1E0B; [2C, 05, 05][, A3, 05] +1E0A; [2C, 05, 8F][, A3, 05] +1E11; [2C, 05, 05][, A7, 05] +1E10; [2C, 05, 8F][, A7, 05] +1E0D; [2C, 05, 05][, D0 4D, 05] +1E0C; [2C, 05, 8F][, D0 4D, 05] +1E13; [2C, 05, 05][, D0 CD, 05] +1E12; [2C, 05, 8F][, D0 CD, 05] +1E0F; [2C, 05, 05][, D1 11, 05] +1E0E; [2C, 05, 8F][, D1 11, 05] +3372; [2C, 05, 37][26, 05, 37] +33C8; [2C, 05, 37][28, 05, B9] +3397; [2C, 05, 37][3C, 05, 37] +3377; [2C, 05, 37][3E, 05, 37] +3378; [2C, 05, 37][3E, 05, 37][23 74, 05, 3D] +3379; [2C, 05, 37][3E, 05, 37][23 76, 05, 3D] +01F3; [2C, 05, 09][58, 05, 09] +02A3; [2C, 05, 09][58, 05, 09] +01F2; [2C, 05, 93][58, 05, 09] +01F1; [2C, 05, 93][58, 05, 93] +01C6; [2C, 05, 09][58, 05, 09][, 97, 3D] +01C5; [2C, 05, 93][58, 05, 09][, 97, 3D] +01C4; [2C, 05, 93][58, 05, 93][, 97, 3D] +02A5; [2C, 05, 09][59 68, 05, 09] +02A4; [2C, 05, 09][59 6A, 05, 09] + +1D05; [2D 60, 05, 05] + +0111; [2D 62, 05, 05] +0110; [2D 62, 05, 8F] + +0256; [2D 64, 05, 05] +0189; [2D 64, 05, 8F] + +0257; [2D 66, 05, 05] +018A; [2D 66, 05, 8F] + +018C; [2D 68, 05, 05] +018B; [2D 68, 05, 8F] + +0221; [2D 6A, 05, 05] + +00F0; [2D 6C, 05, 05] +00D0; [2D 6C, 05, 8F] + +1D06; [2D 6E, 05, 05] + +0065; [2E, 05, 05] +FF45; [2E, 05, 07] +0364; [2E, 05, 09] +212F; [2E, 05, 0B] +2147; [2E, 05, 0B] +D835 DC1E; [2E, 05, 0B] +D835 DC52; [2E, 05, 0B] +D835 DC86; [2E, 05, 0B] +D835 DCEE; [2E, 05, 0B] +D835 DD22; [2E, 05, 0B] +D835 DD56; [2E, 05, 0B] +D835 DD8A; [2E, 05, 0B] +D835 DDBE; [2E, 05, 0B] +D835 DDF2; [2E, 05, 0B] +D835 DE26; [2E, 05, 0B] +D835 DE5A; [2E, 05, 0B] +D835 DE8E; [2E, 05, 0B] +24D4; [2E, 05, 0D] +0045; [2E, 05, 8F] +FF25; [2E, 05, 91] +2130; [2E, 05, 95] +D835 DC04; [2E, 05, 95] +D835 DC38; [2E, 05, 95] +D835 DC6C; [2E, 05, 95] +D835 DCD4; [2E, 05, 95] +D835 DD08; [2E, 05, 95] +D835 DD3C; [2E, 05, 95] +D835 DD70; [2E, 05, 95] +D835 DDA4; [2E, 05, 95] +D835 DDD8; [2E, 05, 95] +D835 DE0C; [2E, 05, 95] +D835 DE40; [2E, 05, 95] +D835 DE74; [2E, 05, 95] +24BA; [2E, 05, 97] +1D31; [2E, 05, 27] +1D49; [2E, 05, 27] +00E9; [2E, 05, 05][, 8D, 05] +00C9; [2E, 05, 8F][, 8D, 05] +00E8; [2E, 05, 05][, 8F, 05] +00C8; [2E, 05, 8F][, 8F, 05] +0115; [2E, 05, 05][, 91, 05] +0114; [2E, 05, 8F][, 91, 05] +00EA; [2E, 05, 05][, 93, 05] +00CA; [2E, 05, 8F][, 93, 05] +1EBF; [2E, 05, 05][, 93, 05][, 8D, 05] +1EBE; [2E, 05, 8F][, 93, 05][, 8D, 05] +1EC1; [2E, 05, 05][, 93, 05][, 8F, 05] +1EC0; [2E, 05, 8F][, 93, 05][, 8F, 05] +1EC5; [2E, 05, 05][, 93, 05][, A1, 05] +1EC4; [2E, 05, 8F][, 93, 05][, A1, 05] +1EC3; [2E, 05, 05][, 93, 05][, AF, 05] +1EC2; [2E, 05, 8F][, 93, 05][, AF, 05] +011B; [2E, 05, 05][, 97, 05] +011A; [2E, 05, 8F][, 97, 05] +00EB; [2E, 05, 05][, 9D, 05] +00CB; [2E, 05, 8F][, 9D, 05] +1EBD; [2E, 05, 05][, A1, 05] +1EBC; [2E, 05, 8F][, A1, 05] +0117; [2E, 05, 05][, A3, 05] +0116; [2E, 05, 8F][, A3, 05] +0229; [2E, 05, 05][, A7, 05] +0228; [2E, 05, 8F][, A7, 05] +1E1D; [2E, 05, 05][, A7, 05][, 91, 05] +1E1C; [2E, 05, 8F][, A7, 05][, 91, 05] +0119; [2E, 05, 05][, A9, 05] +0118; [2E, 05, 8F][, A9, 05] +0113; [2E, 05, 05][, AB, 05] +0112; [2E, 05, 8F][, AB, 05] +1E17; [2E, 05, 05][, AB, 05][, 8D, 05] +1E16; [2E, 05, 8F][, AB, 05][, 8D, 05] +1E15; [2E, 05, 05][, AB, 05][, 8F, 05] +1E14; [2E, 05, 8F][, AB, 05][, 8F, 05] +1EBB; [2E, 05, 05][, AF, 05] +1EBA; [2E, 05, 8F][, AF, 05] +0205; [2E, 05, 05][, B5, 05] +0204; [2E, 05, 8F][, B5, 05] +0207; [2E, 05, 05][, B9, 05] +0206; [2E, 05, 8F][, B9, 05] +1EB9; [2E, 05, 05][, D0 4D, 05] +1EB8; [2E, 05, 8F][, D0 4D, 05] +1EC7; [2E, 05, 05][, D0 4D, 05][, 93, 05] +1EC6; [2E, 05, 8F][, D0 4D, 05][, 93, 05] +1E19; [2E, 05, 05][, D0 CD, 05] +1E18; [2E, 05, 8F][, D0 CD, 05] +1E1B; [2E, 05, 05][, D0 FD, 05] +1E1A; [2E, 05, 8F][, D0 FD, 05] +32CD; [2E, 05, 37][48, 05, 37][32, 05, 3D] +32CE; [2E, 05, 37][50, 05, B9] + +1D07; [2F 60, 05, 05] + +01DD; [2F 62, 05, 05] +018E; [2F 62, 05, 8F] +1D32; [2F 62, 05, 27] + +0259; [2F 64, 05, 05] +018F; [2F 64, 05, 8F] +1D4A; [2F 64, 05, 27] + +025B; [2F 66, 05, 05] +0190; [2F 66, 05, 8F] +2107; [2F 66, 05, 93] +1D4B; [2F 66, 05, 27] + +0258; [2F 68, 05, 05] + +025A; [2F 6A, 05, 05] + +025C; [2F 6C, 05, 05] + +1D08; [2F 6E, 05, 05] +1D4C; [2F 6E, 05, 27] + +025D; [2F 70, 05, 05] + +025E; [2F 72, 05, 05] + +029A; [2F 74, 05, 05] + +0264; [2F 76, 05, 05] + +0066; [30, 05, 05] +FF46; [30, 05, 07] +D835 DC1F; [30, 05, 0B] +D835 DC53; [30, 05, 0B] +D835 DC87; [30, 05, 0B] +D835 DCBB; [30, 05, 0B] +D835 DCEF; [30, 05, 0B] +D835 DD23; [30, 05, 0B] +D835 DD57; [30, 05, 0B] +D835 DD8B; [30, 05, 0B] +D835 DDBF; [30, 05, 0B] +D835 DDF3; [30, 05, 0B] +D835 DE27; [30, 05, 0B] +D835 DE5B; [30, 05, 0B] +D835 DE8F; [30, 05, 0B] +24D5; [30, 05, 0D] +0046; [30, 05, 8F] +FF26; [30, 05, 91] +2131; [30, 05, 95] +D835 DC05; [30, 05, 95] +D835 DC39; [30, 05, 95] +D835 DC6D; [30, 05, 95] +D835 DCD5; [30, 05, 95] +D835 DD09; [30, 05, 95] +D835 DD3D; [30, 05, 95] +D835 DD71; [30, 05, 95] +D835 DDA5; [30, 05, 95] +D835 DDD9; [30, 05, 95] +D835 DE0D; [30, 05, 95] +D835 DE41; [30, 05, 95] +D835 DE75; [30, 05, 95] +24BB; [30, 05, 97] +1E1F; [30, 05, 05][, A3, 05] +1E1E; [30, 05, 8F][, A3, 05] +213B; [30, 05, 93][26, 05, 93][54, 05, 3D] +FB00; [30, 05, 09][30, 05, 09] +FB03; [30, 05, 09][30, 05, 09][36, 05, 3D] +FB04; [30, 05, 09][30, 05, 09][3C, 05, 3D] +FB01; [30, 05, 09][36, 05, 09] +FB02; [30, 05, 09][3C, 05, 09] +3399; [30, 05, 37][3E, 05, 37] +02A9; [30, 05, 09][41 6E, 05, 09] + +0192; [31 60, 05, 05] +0191; [31 60, 05, 8F] + +0067; [32, 05, 05] +FF47; [32, 05, 07] +210A; [32, 05, 0B] +D835 DC20; [32, 05, 0B] +D835 DC54; [32, 05, 0B] +D835 DC88; [32, 05, 0B] +D835 DCF0; [32, 05, 0B] +D835 DD24; [32, 05, 0B] +D835 DD58; [32, 05, 0B] +D835 DD8C; [32, 05, 0B] +D835 DDC0; [32, 05, 0B] +D835 DDF4; [32, 05, 0B] +D835 DE28; [32, 05, 0B] +D835 DE5C; [32, 05, 0B] +D835 DE90; [32, 05, 0B] +24D6; [32, 05, 0D] +0047; [32, 05, 8F] +FF27; [32, 05, 91] +D835 DC06; [32, 05, 95] +D835 DC3A; [32, 05, 95] +D835 DC6E; [32, 05, 95] +D835 DCA2; [32, 05, 95] +D835 DCD6; [32, 05, 95] +D835 DD0A; [32, 05, 95] +D835 DD3E; [32, 05, 95] +D835 DD72; [32, 05, 95] +D835 DDA6; [32, 05, 95] +D835 DDDA; [32, 05, 95] +D835 DE0E; [32, 05, 95] +D835 DE42; [32, 05, 95] +D835 DE76; [32, 05, 95] +24BC; [32, 05, 97] +1D33; [32, 05, 27] +1D4D; [32, 05, 27] +01F5; [32, 05, 05][, 8D, 05] +01F4; [32, 05, 8F][, 8D, 05] +011F; [32, 05, 05][, 91, 05] +011E; [32, 05, 8F][, 91, 05] +011D; [32, 05, 05][, 93, 05] +011C; [32, 05, 8F][, 93, 05] +01E7; [32, 05, 05][, 97, 05] +01E6; [32, 05, 8F][, 97, 05] +0121; [32, 05, 05][, A3, 05] +0120; [32, 05, 8F][, A3, 05] +0123; [32, 05, 05][, A7, 05] +0122; [32, 05, 8F][, A7, 05] +1E21; [32, 05, 05][, AB, 05] +1E20; [32, 05, 8F][, AB, 05] +33FF; [32, 05, 37][26, 05, 37][3C, 05, 3D] +3387; [32, 05, B9][28, 05, B9] +3393; [32, 05, B9][34, 05, B9][58, 05, 3D] +33AC; [32, 05, B9][44, 05, B9][26, 05, 3D] +33C9; [32, 05, B9][56, 05, 37] + +0261; [33 60, 05, 05] + +0262; [33 62, 05, 05] + +01E5; [33 64, 05, 05] +01E4; [33 64, 05, 8F] + +0260; [33 66, 05, 05] +0193; [33 66, 05, 8F] + +029B; [33 68, 05, 05] + +0263; [33 6A, 05, 05] +0194; [33 6A, 05, 8F] +02E0; [33 6A, 05, 27] + +01A3; [33 6C, 05, 05] +01A2; [33 6C, 05, 8F] + +0068; [34, 05, 05] +FF48; [34, 05, 07] +036A; [34, 05, 09] +210E; [34, 05, 0B] +D835 DC21; [34, 05, 0B] +D835 DC89; [34, 05, 0B] +D835 DCBD; [34, 05, 0B] +D835 DCF1; [34, 05, 0B] +D835 DD25; [34, 05, 0B] +D835 DD59; [34, 05, 0B] +D835 DD8D; [34, 05, 0B] +D835 DDC1; [34, 05, 0B] +D835 DDF5; [34, 05, 0B] +D835 DE29; [34, 05, 0B] +D835 DE5D; [34, 05, 0B] +D835 DE91; [34, 05, 0B] +24D7; [34, 05, 0D] +0048; [34, 05, 8F] +FF28; [34, 05, 91] +210B; [34, 05, 95] +210C; [34, 05, 95] +210D; [34, 05, 95] +D835 DC07; [34, 05, 95] +D835 DC3B; [34, 05, 95] +D835 DC6F; [34, 05, 95] +D835 DCD7; [34, 05, 95] +D835 DD73; [34, 05, 95] +D835 DDA7; [34, 05, 95] +D835 DDDB; [34, 05, 95] +D835 DE0F; [34, 05, 95] +D835 DE43; [34, 05, 95] +D835 DE77; [34, 05, 95] +24BD; [34, 05, 97] +02B0; [34, 05, 27] +1D34; [34, 05, 27] +0125; [34, 05, 05][, 93, 05] +0124; [34, 05, 8F][, 93, 05] +021F; [34, 05, 05][, 97, 05] +021E; [34, 05, 8F][, 97, 05] +1E27; [34, 05, 05][, 9D, 05] +1E26; [34, 05, 8F][, 9D, 05] +1E23; [34, 05, 05][, A3, 05] +1E22; [34, 05, 8F][, A3, 05] +1E29; [34, 05, 05][, A7, 05] +1E28; [34, 05, 8F][, A7, 05] +1E25; [34, 05, 05][, D0 4D, 05] +1E24; [34, 05, 8F][, D0 4D, 05] +1E2B; [34, 05, 05][, D0 DD, 05] +1E2A; [34, 05, 8F][, D0 DD, 05] +1E96; [34, 05, 05][, D1 11, 05] +33CA; [34, 05, 37][26, 05, 37] +32CC; [34, 05, B9][32, 05, 37] +33CB; [34, 05, B9][44, 05, B9] +3371; [34, 05, 37][44, 05, B9][26, 05, 3D] +3390; [34, 05, B9][58, 05, 37] + +029C; [35 60, 05, 05] + +0195; [35 62, 05, 05] +01F6; [35 62, 05, 8F] + +0127; [35 64, 05, 05] +210F; [35 64, 05, 0B] +0126; [35 64, 05, 8F] + +0266; [35 66, 05, 05] +02B1; [35 66, 05, 27] + +0267; [35 68, 05, 05] + +02BB; [35 6A, 05, 05] + +02BD; [35 6C, 05, 05] + +0069; [36, 05, 05] +FF49; [36, 05, 07] +0365; [36, 05, 09] +2170; [36, 05, 09] +2139; [36, 05, 0B] +2148; [36, 05, 0B] +D835 DC22; [36, 05, 0B] +D835 DC56; [36, 05, 0B] +D835 DC8A; [36, 05, 0B] +D835 DCBE; [36, 05, 0B] +D835 DCF2; [36, 05, 0B] +D835 DD26; [36, 05, 0B] +D835 DD5A; [36, 05, 0B] +D835 DD8E; [36, 05, 0B] +D835 DDC2; [36, 05, 0B] +D835 DDF6; [36, 05, 0B] +D835 DE2A; [36, 05, 0B] +D835 DE5E; [36, 05, 0B] +D835 DE92; [36, 05, 0B] +24D8; [36, 05, 0D] +0049; [36, 05, 8F] +FF29; [36, 05, 91] +2160; [36, 05, 93] +2110; [36, 05, 95] +2111; [36, 05, 95] +D835 DC08; [36, 05, 95] +D835 DC3C; [36, 05, 95] +D835 DC70; [36, 05, 95] +D835 DCD8; [36, 05, 95] +D835 DD40; [36, 05, 95] +D835 DD74; [36, 05, 95] +D835 DDA8; [36, 05, 95] +D835 DDDC; [36, 05, 95] +D835 DE10; [36, 05, 95] +D835 DE44; [36, 05, 95] +D835 DE78; [36, 05, 95] +24BE; [36, 05, 97] +1D35; [36, 05, 27] +2071; [36, 05, 27] +1D62; [36, 05, 29] +00ED; [36, 05, 05][, 8D, 05] +00CD; [36, 05, 8F][, 8D, 05] +00EC; [36, 05, 05][, 8F, 05] +00CC; [36, 05, 8F][, 8F, 05] +012D; [36, 05, 05][, 91, 05] +012C; [36, 05, 8F][, 91, 05] +00EE; [36, 05, 05][, 93, 05] +00CE; [36, 05, 8F][, 93, 05] +01D0; [36, 05, 05][, 97, 05] +01CF; [36, 05, 8F][, 97, 05] +00EF; [36, 05, 05][, 9D, 05] +00CF; [36, 05, 8F][, 9D, 05] +1E2F; [36, 05, 05][, 9D, 05][, 8D, 05] +1E2E; [36, 05, 8F][, 9D, 05][, 8D, 05] +0129; [36, 05, 05][, A1, 05] +0128; [36, 05, 8F][, A1, 05] +0130; [36, 05, 8F][, A3, 05] +012F; [36, 05, 05][, A9, 05] +012E; [36, 05, 8F][, A9, 05] +012B; [36, 05, 05][, AB, 05] +012A; [36, 05, 8F][, AB, 05] +1EC9; [36, 05, 05][, AF, 05] +1EC8; [36, 05, 8F][, AF, 05] +0209; [36, 05, 05][, B5, 05] +0208; [36, 05, 8F][, B5, 05] +020B; [36, 05, 05][, B9, 05] +020A; [36, 05, 8F][, B9, 05] +1ECB; [36, 05, 05][, D0 4D, 05] +1ECA; [36, 05, 8F][, D0 4D, 05] +1E2D; [36, 05, 05][, D0 FD, 05] +1E2C; [36, 05, 8F][, D0 FD, 05] +2171; [36, 05, 09][36, 05, 09] +2161; [36, 05, 93][36, 05, 93] +2172; [36, 05, 09][36, 05, 09][36, 05, 3D] +2162; [36, 05, 93][36, 05, 93][36, 05, 3D] +0133; [36, 05, 09][38, 05, 09] +0132; [36, 05, 93][38, 05, 93] +33CC; [36, 05, 37][40, 05, 37] +337A; [36, 05, B9][4E, 05, B9] +2173; [36, 05, 09][50, 05, 09] +2163; [36, 05, 93][50, 05, 93] +2178; [36, 05, 09][54, 05, 09] +2168; [36, 05, 93][54, 05, 93] + +0131; [37 60, 05, 05] + +026A; [37 62, 05, 05] + +1D09; [37 64, 05, 05] +1D4E; [37 64, 05, 27] + +0268; [37 66, 05, 05] +0197; [37 66, 05, 8F] + +0269; [37 68, 05, 05] +0196; [37 68, 05, 8F] + +006A; [38, 05, 05] +FF4A; [38, 05, 07] +2149; [38, 05, 0B] +D835 DC23; [38, 05, 0B] +D835 DC57; [38, 05, 0B] +D835 DC8B; [38, 05, 0B] +D835 DCBF; [38, 05, 0B] +D835 DCF3; [38, 05, 0B] +D835 DD27; [38, 05, 0B] +D835 DD5B; [38, 05, 0B] +D835 DD8F; [38, 05, 0B] +D835 DDC3; [38, 05, 0B] +D835 DDF7; [38, 05, 0B] +D835 DE2B; [38, 05, 0B] +D835 DE5F; [38, 05, 0B] +D835 DE93; [38, 05, 0B] +24D9; [38, 05, 0D] +004A; [38, 05, 8F] +FF2A; [38, 05, 91] +D835 DC09; [38, 05, 95] +D835 DC3D; [38, 05, 95] +D835 DC71; [38, 05, 95] +D835 DCA5; [38, 05, 95] +D835 DCD9; [38, 05, 95] +D835 DD0D; [38, 05, 95] +D835 DD41; [38, 05, 95] +D835 DD75; [38, 05, 95] +D835 DDA9; [38, 05, 95] +D835 DDDD; [38, 05, 95] +D835 DE11; [38, 05, 95] +D835 DE45; [38, 05, 95] +D835 DE79; [38, 05, 95] +24BF; [38, 05, 97] +02B2; [38, 05, 27] +1D36; [38, 05, 27] +0135; [38, 05, 05][, 93, 05] +0134; [38, 05, 8F][, 93, 05] +01F0; [38, 05, 05][, 97, 05] + +1D0A; [39 60, 05, 05] + +029D; [39 62, 05, 05] + +025F; [39 64, 05, 05] + +0284; [39 66, 05, 05] + +006B; [3A, 05, 05] +FF4B; [3A, 05, 07] +D835 DC24; [3A, 05, 0B] +D835 DC58; [3A, 05, 0B] +D835 DC8C; [3A, 05, 0B] +D835 DCC0; [3A, 05, 0B] +D835 DCF4; [3A, 05, 0B] +D835 DD28; [3A, 05, 0B] +D835 DD5C; [3A, 05, 0B] +D835 DD90; [3A, 05, 0B] +D835 DDC4; [3A, 05, 0B] +D835 DDF8; [3A, 05, 0B] +D835 DE2C; [3A, 05, 0B] +D835 DE60; [3A, 05, 0B] +D835 DE94; [3A, 05, 0B] +24DA; [3A, 05, 0D] +004B; [3A, 05, 8F] +212A; [3A, 05, 8F] +FF2B; [3A, 05, 91] +D835 DC0A; [3A, 05, 95] +D835 DC3E; [3A, 05, 95] +D835 DC72; [3A, 05, 95] +D835 DCA6; [3A, 05, 95] +D835 DCDA; [3A, 05, 95] +D835 DD0E; [3A, 05, 95] +D835 DD42; [3A, 05, 95] +D835 DD76; [3A, 05, 95] +D835 DDAA; [3A, 05, 95] +D835 DDDE; [3A, 05, 95] +D835 DE12; [3A, 05, 95] +D835 DE46; [3A, 05, 95] +D835 DE7A; [3A, 05, 95] +24C0; [3A, 05, 97] +1D37; [3A, 05, 27] +1D4F; [3A, 05, 27] +1E31; [3A, 05, 05][, 8D, 05] +1E30; [3A, 05, 8F][, 8D, 05] +01E9; [3A, 05, 05][, 97, 05] +01E8; [3A, 05, 8F][, 97, 05] +0137; [3A, 05, 05][, A7, 05] +0136; [3A, 05, 8F][, A7, 05] +1E33; [3A, 05, 05][, D0 4D, 05] +1E32; [3A, 05, 8F][, D0 4D, 05] +1E35; [3A, 05, 05][, D1 11, 05] +1E34; [3A, 05, 8F][, D1 11, 05] +3384; [3A, 05, 37][26, 05, B9] +3385; [3A, 05, B9][28, 05, B9] +3389; [3A, 05, 37][2A, 05, 37][26, 05, 3D][3C, 05, 3D] +338F; [3A, 05, 37][32, 05, 37] +3391; [3A, 05, 37][34, 05, B9][58, 05, 3D] +33CD; [3A, 05, B9][3A, 05, B9] +3398; [3A, 05, 37][3C, 05, 37] +339E; [3A, 05, 37][3E, 05, 37] +33CE; [3A, 05, B9][3E, 05, B9] +33A2; [3A, 05, 37][3E, 05, 37][23 74, 05, 3D] +33A6; [3A, 05, 37][3E, 05, 37][23 76, 05, 3D] +33AA; [3A, 05, 37][44, 05, B9][26, 05, 3D] +33CF; [3A, 05, 37][4C, 05, 37] +33B8; [3A, 05, 37][50, 05, B9] +33BE; [3A, 05, 37][52, 05, B9] +33C0; [3A, 05, 37][5A 62, 05, B9] + +1D0B; [3B 60, 05, 05] + +0199; [3B 62, 05, 05] +0198; [3B 62, 05, 8F] + +029E; [3B 64, 05, 05] + +006C; [3C, 05, 05] +FF4C; [3C, 05, 07] +217C; [3C, 05, 09] +2113; [3C, 05, 0B] +D835 DC25; [3C, 05, 0B] +D835 DC59; [3C, 05, 0B] +D835 DC8D; [3C, 05, 0B] +D835 DCC1; [3C, 05, 0B] +D835 DCF5; [3C, 05, 0B] +D835 DD29; [3C, 05, 0B] +D835 DD5D; [3C, 05, 0B] +D835 DD91; [3C, 05, 0B] +D835 DDC5; [3C, 05, 0B] +D835 DDF9; [3C, 05, 0B] +D835 DE2D; [3C, 05, 0B] +D835 DE61; [3C, 05, 0B] +D835 DE95; [3C, 05, 0B] +24DB; [3C, 05, 0D] +004C; [3C, 05, 8F] +FF2C; [3C, 05, 91] +216C; [3C, 05, 93] +2112; [3C, 05, 95] +D835 DC0B; [3C, 05, 95] +D835 DC3F; [3C, 05, 95] +D835 DC73; [3C, 05, 95] +D835 DCDB; [3C, 05, 95] +D835 DD0F; [3C, 05, 95] +D835 DD43; [3C, 05, 95] +D835 DD77; [3C, 05, 95] +D835 DDAB; [3C, 05, 95] +D835 DDDF; [3C, 05, 95] +D835 DE13; [3C, 05, 95] +D835 DE47; [3C, 05, 95] +D835 DE7B; [3C, 05, 95] +24C1; [3C, 05, 97] +02E1; [3C, 05, 27] +1D38; [3C, 05, 27] +013A; [3C, 05, 05][, 8D, 05] +0139; [3C, 05, 8F][, 8D, 05] +013E; [3C, 05, 05][, 97, 05] +013D; [3C, 05, 8F][, 97, 05] +013C; [3C, 05, 05][, A7, 05] +013B; [3C, 05, 8F][, A7, 05] +1E37; [3C, 05, 05][, D0 4D, 05] +1E36; [3C, 05, 8F][, D0 4D, 05] +1E39; [3C, 05, 05][, D0 4D, 05][, AB, 05] +1E38; [3C, 05, 8F][, D0 4D, 05][, AB, 05] +1E3D; [3C, 05, 05][, D0 CD, 05] +1E3C; [3C, 05, 8F][, D0 CD, 05] +1E3B; [3C, 05, 05][, D1 11, 05] +1E3A; [3C, 05, 8F][, D1 11, 05] +0140; [3C, 05, 09][08 1F, 05, 09] +013F; [3C, 05, 93][08 1F, 05, 09] +01C9; [3C, 05, 09][38, 05, 09] +01C8; [3C, 05, 93][38, 05, 09] +01C7; [3C, 05, 93][38, 05, 93] +33D0; [3C, 05, 37][3E, 05, 37] +33D1; [3C, 05, 37][40, 05, 37] +33D2; [3C, 05, 37][42, 05, 37][32, 05, 3D] +02AA; [3C, 05, 09][4A, 05, 09] +32CF; [3C, 05, B9][4C, 05, B9][2C, 05, 3D] +33D3; [3C, 05, 37][54, 05, 37] +02AB; [3C, 05, 09][58, 05, 09] + +029F; [3D 60, 05, 05] + +0142; [3D 62, 05, 05] +0141; [3D 62, 05, 8F] + +1D0C; [3D 64, 05, 05] + +019A; [3D 66, 05, 05] + +026B; [3D 68, 05, 05] + +026C; [3D 6A, 05, 05] + +026D; [3D 6C, 05, 05] + +0234; [3D 6E, 05, 05] + +026E; [3D 70, 05, 05] + +019B; [3D 72, 05, 05] + +028E; [3D 74, 05, 05] + +006D; [3E, 05, 05] +FF4D; [3E, 05, 07] +036B; [3E, 05, 09] +217F; [3E, 05, 09] +D835 DC26; [3E, 05, 0B] +D835 DC5A; [3E, 05, 0B] +D835 DC8E; [3E, 05, 0B] +D835 DCC2; [3E, 05, 0B] +D835 DCF6; [3E, 05, 0B] +D835 DD2A; [3E, 05, 0B] +D835 DD5E; [3E, 05, 0B] +D835 DD92; [3E, 05, 0B] +D835 DDC6; [3E, 05, 0B] +D835 DDFA; [3E, 05, 0B] +D835 DE2E; [3E, 05, 0B] +D835 DE62; [3E, 05, 0B] +D835 DE96; [3E, 05, 0B] +24DC; [3E, 05, 0D] +004D; [3E, 05, 8F] +FF2D; [3E, 05, 91] +216F; [3E, 05, 93] +2133; [3E, 05, 95] +D835 DC0C; [3E, 05, 95] +D835 DC40; [3E, 05, 95] +D835 DC74; [3E, 05, 95] +D835 DCDC; [3E, 05, 95] +D835 DD10; [3E, 05, 95] +D835 DD44; [3E, 05, 95] +D835 DD78; [3E, 05, 95] +D835 DDAC; [3E, 05, 95] +D835 DDE0; [3E, 05, 95] +D835 DE14; [3E, 05, 95] +D835 DE48; [3E, 05, 95] +D835 DE7C; [3E, 05, 95] +24C2; [3E, 05, 97] +1D39; [3E, 05, 27] +1D50; [3E, 05, 27] +1E3F; [3E, 05, 05][, 8D, 05] +1E3E; [3E, 05, 8F][, 8D, 05] +1E41; [3E, 05, 05][, A3, 05] +1E40; [3E, 05, 8F][, A3, 05] +1E43; [3E, 05, 05][, D0 4D, 05] +1E42; [3E, 05, 8F][, D0 4D, 05] +33A7; [3E, 05, 37][0B D1, 05, 37][4A, 05, 3D] +33A8; [3E, 05, 37][0B D1, 05, 37][4A, 05, 3D][23 74, 05, 3D] +33A1; [3E, 05, 37][23 74, 05, 37] +33A5; [3E, 05, 37][23 76, 05, 37] +3383; [3E, 05, 37][26, 05, B9] +33D4; [3E, 05, 37][28, 05, 37] +3386; [3E, 05, B9][28, 05, B9] +338E; [3E, 05, 37][32, 05, 37] +3392; [3E, 05, B9][34, 05, B9][58, 05, 3D] +33D5; [3E, 05, 37][36, 05, 37][3C, 05, 3D] +3396; [3E, 05, 37][3C, 05, 37] +339C; [3E, 05, 37][3E, 05, 37] +339F; [3E, 05, 37][3E, 05, 37][23 74, 05, 3D] +33A3; [3E, 05, 37][3E, 05, 37][23 76, 05, 3D] +33D6; [3E, 05, 37][42, 05, 37][3C, 05, 3D] +33AB; [3E, 05, B9][44, 05, B9][26, 05, 3D] +33B3; [3E, 05, 37][4A, 05, 37] +33B7; [3E, 05, 37][50, 05, B9] +33B9; [3E, 05, B9][50, 05, B9] +33BD; [3E, 05, 37][52, 05, B9] +33BF; [3E, 05, B9][52, 05, B9] +33C1; [3E, 05, B9][5A 62, 05, B9] + +1D0D; [3F 60, 05, 05] + +0271; [3F 62, 05, 05] + +006E; [40, 05, 05] +FF4E; [40, 05, 07] +D835 DC27; [40, 05, 0B] +D835 DC5B; [40, 05, 0B] +D835 DC8F; [40, 05, 0B] +D835 DCC3; [40, 05, 0B] +D835 DCF7; [40, 05, 0B] +D835 DD2B; [40, 05, 0B] +D835 DD5F; [40, 05, 0B] +D835 DD93; [40, 05, 0B] +D835 DDC7; [40, 05, 0B] +D835 DDFB; [40, 05, 0B] +D835 DE2F; [40, 05, 0B] +D835 DE63; [40, 05, 0B] +D835 DE97; [40, 05, 0B] +24DD; [40, 05, 0D] +004E; [40, 05, 8F] +FF2E; [40, 05, 91] +2115; [40, 05, 95] +D835 DC0D; [40, 05, 95] +D835 DC41; [40, 05, 95] +D835 DC75; [40, 05, 95] +D835 DCA9; [40, 05, 95] +D835 DCDD; [40, 05, 95] +D835 DD11; [40, 05, 95] +D835 DD79; [40, 05, 95] +D835 DDAD; [40, 05, 95] +D835 DDE1; [40, 05, 95] +D835 DE15; [40, 05, 95] +D835 DE49; [40, 05, 95] +D835 DE7D; [40, 05, 95] +24C3; [40, 05, 97] +1D3A; [40, 05, 27] +207F; [40, 05, 27] +0144; [40, 05, 05][, 8D, 05] +0143; [40, 05, 8F][, 8D, 05] +01F9; [40, 05, 05][, 8F, 05] +01F8; [40, 05, 8F][, 8F, 05] +0148; [40, 05, 05][, 97, 05] +0147; [40, 05, 8F][, 97, 05] +00F1; [40, 05, 05][, A1, 05] +00D1; [40, 05, 8F][, A1, 05] +1E45; [40, 05, 05][, A3, 05] +1E44; [40, 05, 8F][, A3, 05] +0146; [40, 05, 05][, A7, 05] +0145; [40, 05, 8F][, A7, 05] +1E47; [40, 05, 05][, D0 4D, 05] +1E46; [40, 05, 8F][, D0 4D, 05] +1E4B; [40, 05, 05][, D0 CD, 05] +1E4A; [40, 05, 8F][, D0 CD, 05] +1E49; [40, 05, 05][, D1 11, 05] +1E48; [40, 05, 8F][, D1 11, 05] +3381; [40, 05, 37][26, 05, B9] +338B; [40, 05, 37][30, 05, B9] +01CC; [40, 05, 09][38, 05, 09] +01CB; [40, 05, 93][38, 05, 09] +01CA; [40, 05, 93][38, 05, 93] +339A; [40, 05, 37][3E, 05, 37] +2116; [40, 05, 93][42, 05, 09] +33B1; [40, 05, 37][4A, 05, 37] +33B5; [40, 05, 37][50, 05, B9] +33BB; [40, 05, 37][52, 05, B9] + +0274; [41 60, 05, 05] + +1D3B; [41 62, 05, 05] + +1D0E; [41 64, 05, 05] + +0272; [41 66, 05, 05] +019D; [41 66, 05, 8F] + +019E; [41 68, 05, 05] +0220; [41 68, 05, 8F] + +0273; [41 6A, 05, 05] + +0235; [41 6C, 05, 05] + +014B; [41 6E, 05, 05] +014A; [41 6E, 05, 8F] +1D51; [41 6E, 05, 27] + +006F; [42, 05, 05] +FF4F; [42, 05, 07] +0366; [42, 05, 09] +2134; [42, 05, 0B] +D835 DC28; [42, 05, 0B] +D835 DC5C; [42, 05, 0B] +D835 DC90; [42, 05, 0B] +D835 DCF8; [42, 05, 0B] +D835 DD2C; [42, 05, 0B] +D835 DD60; [42, 05, 0B] +D835 DD94; [42, 05, 0B] +D835 DDC8; [42, 05, 0B] +D835 DDFC; [42, 05, 0B] +D835 DE30; [42, 05, 0B] +D835 DE64; [42, 05, 0B] +D835 DE98; [42, 05, 0B] +24DE; [42, 05, 0D] +004F; [42, 05, 8F] +FF2F; [42, 05, 91] +D835 DC0E; [42, 05, 95] +D835 DC42; [42, 05, 95] +D835 DC76; [42, 05, 95] +D835 DCAA; [42, 05, 95] +D835 DCDE; [42, 05, 95] +D835 DD12; [42, 05, 95] +D835 DD46; [42, 05, 95] +D835 DD7A; [42, 05, 95] +D835 DDAE; [42, 05, 95] +D835 DDE2; [42, 05, 95] +D835 DE16; [42, 05, 95] +D835 DE4A; [42, 05, 95] +D835 DE7E; [42, 05, 95] +24C4; [42, 05, 97] +00BA; [42, 05, 27] +1D3C; [42, 05, 27] +1D52; [42, 05, 27] +00F3; [42, 05, 05][, 8D, 05] +00D3; [42, 05, 8F][, 8D, 05] +00F2; [42, 05, 05][, 8F, 05] +00D2; [42, 05, 8F][, 8F, 05] +014F; [42, 05, 05][, 91, 05] +014E; [42, 05, 8F][, 91, 05] +00F4; [42, 05, 05][, 93, 05] +00D4; [42, 05, 8F][, 93, 05] +1ED1; [42, 05, 05][, 93, 05][, 8D, 05] +1ED0; [42, 05, 8F][, 93, 05][, 8D, 05] +1ED3; [42, 05, 05][, 93, 05][, 8F, 05] +1ED2; [42, 05, 8F][, 93, 05][, 8F, 05] +1ED7; [42, 05, 05][, 93, 05][, A1, 05] +1ED6; [42, 05, 8F][, 93, 05][, A1, 05] +1ED5; [42, 05, 05][, 93, 05][, AF, 05] +1ED4; [42, 05, 8F][, 93, 05][, AF, 05] +01D2; [42, 05, 05][, 97, 05] +01D1; [42, 05, 8F][, 97, 05] +00F6; [42, 05, 05][, 9D, 05] +00D6; [42, 05, 8F][, 9D, 05] +022B; [42, 05, 05][, 9D, 05][, AB, 05] +022A; [42, 05, 8F][, 9D, 05][, AB, 05] +0151; [42, 05, 05][, 9F, 05] +0150; [42, 05, 8F][, 9F, 05] +00F5; [42, 05, 05][, A1, 05] +00D5; [42, 05, 8F][, A1, 05] +1E4D; [42, 05, 05][, A1, 05][, 8D, 05] +1E4C; [42, 05, 8F][, A1, 05][, 8D, 05] +1E4F; [42, 05, 05][, A1, 05][, 9D, 05] +1E4E; [42, 05, 8F][, A1, 05][, 9D, 05] +022D; [42, 05, 05][, A1, 05][, AB, 05] +022C; [42, 05, 8F][, A1, 05][, AB, 05] +022F; [42, 05, 05][, A3, 05] +022E; [42, 05, 8F][, A3, 05] +0231; [42, 05, 05][, A3, 05][, AB, 05] +0230; [42, 05, 8F][, A3, 05][, AB, 05] +01EB; [42, 05, 05][, A9, 05] +01EA; [42, 05, 8F][, A9, 05] +01ED; [42, 05, 05][, A9, 05][, AB, 05] +01EC; [42, 05, 8F][, A9, 05][, AB, 05] +014D; [42, 05, 05][, AB, 05] +014C; [42, 05, 8F][, AB, 05] +1E53; [42, 05, 05][, AB, 05][, 8D, 05] +1E52; [42, 05, 8F][, AB, 05][, 8D, 05] +1E51; [42, 05, 05][, AB, 05][, 8F, 05] +1E50; [42, 05, 8F][, AB, 05][, 8F, 05] +1ECF; [42, 05, 05][, AF, 05] +1ECE; [42, 05, 8F][, AF, 05] +020D; [42, 05, 05][, B5, 05] +020C; [42, 05, 8F][, B5, 05] +020F; [42, 05, 05][, B9, 05] +020E; [42, 05, 8F][, B9, 05] +01A1; [42, 05, 05][, C9, 05] +01A0; [42, 05, 8F][, C9, 05] +1EDB; [42, 05, 05][, C9, 05][, 8D, 05] +1EDA; [42, 05, 8F][, C9, 05][, 8D, 05] +1EDD; [42, 05, 05][, C9, 05][, 8F, 05] +1EDC; [42, 05, 8F][, C9, 05][, 8F, 05] +1EE1; [42, 05, 05][, C9, 05][, A1, 05] +1EE0; [42, 05, 8F][, C9, 05][, A1, 05] +1EDF; [42, 05, 05][, C9, 05][, AF, 05] +1EDE; [42, 05, 8F][, C9, 05][, AF, 05] +1EE3; [42, 05, 05][, C9, 05][, D0 4D, 05] +1EE2; [42, 05, 8F][, C9, 05][, D0 4D, 05] +1ECD; [42, 05, 05][, D0 4D, 05] +1ECC; [42, 05, 8F][, D0 4D, 05] +1ED9; [42, 05, 05][, D0 4D, 05][, 93, 05] +1ED8; [42, 05, 8F][, D0 4D, 05][, 93, 05] +0153; [42, 05, 09][, E0 8D, 09][2E, 05, 3D] +0152; [42, 05, 93][, E0 8D, 09][2E, 05, 3D] +3375; [42, 05, 37][50, 05, B9] + +1D0F; [43 60, 05, 05] + +1D11; [43 62, 05, 05] + +0276; [43 64, 05, 05] + +1D14; [43 66, 05, 05] + +00F8; [43 68, 05, 05] +00D8; [43 68, 05, 8F] +01FF; [43 68, 05, 05][, 8D, 05] +01FE; [43 68, 05, 8F][, 8D, 05] + +1D13; [43 6A, 05, 05] + +0254; [43 6C, 05, 05] +0186; [43 6C, 05, 8F] +1D53; [43 6C, 05, 27] + +1D10; [43 6E, 05, 05] + +1D12; [43 70, 05, 05] + +1D16; [43 72, 05, 05] +1D54; [43 72, 05, 27] + +1D17; [43 74, 05, 05] +1D55; [43 74, 05, 27] + +0275; [43 76, 05, 05] +019F; [43 76, 05, 8F] + +0277; [43 78, 05, 05] + +0223; [43 7A, 05, 05] +0222; [43 7A, 05, 8F] +1D3D; [43 7A, 05, 27] + +1D15; [43 7C, 05, 05] + +0070; [44, 05, 05] +FF50; [44, 05, 07] +D835 DC29; [44, 05, 0B] +D835 DC5D; [44, 05, 0B] +D835 DC91; [44, 05, 0B] +D835 DCC5; [44, 05, 0B] +D835 DCF9; [44, 05, 0B] +D835 DD2D; [44, 05, 0B] +D835 DD61; [44, 05, 0B] +D835 DD95; [44, 05, 0B] +D835 DDC9; [44, 05, 0B] +D835 DDFD; [44, 05, 0B] +D835 DE31; [44, 05, 0B] +D835 DE65; [44, 05, 0B] +D835 DE99; [44, 05, 0B] +24DF; [44, 05, 0D] +0050; [44, 05, 8F] +FF30; [44, 05, 91] +2119; [44, 05, 95] +D835 DC0F; [44, 05, 95] +D835 DC43; [44, 05, 95] +D835 DC77; [44, 05, 95] +D835 DCAB; [44, 05, 95] +D835 DCDF; [44, 05, 95] +D835 DD13; [44, 05, 95] +D835 DD7B; [44, 05, 95] +D835 DDAF; [44, 05, 95] +D835 DDE3; [44, 05, 95] +D835 DE17; [44, 05, 95] +D835 DE4B; [44, 05, 95] +D835 DE7F; [44, 05, 95] +24C5; [44, 05, 97] +1D3E; [44, 05, 27] +1D56; [44, 05, 27] +1E55; [44, 05, 05][, 8D, 05] +1E54; [44, 05, 8F][, 8D, 05] +1E57; [44, 05, 05][, A3, 05] +1E56; [44, 05, 8F][, A3, 05] +33D8; [44, 05, 37][08 0B, 05, 37][3E, 05, 3D][08 0B, 05, 3D] +3380; [44, 05, 37][26, 05, B9] +33A9; [44, 05, B9][26, 05, 37] +3376; [44, 05, 37][2A, 05, 37] +338A; [44, 05, 37][30, 05, B9] +33D7; [44, 05, B9][34, 05, B9] +33D9; [44, 05, B9][44, 05, B9][3E, 05, 3D] +33DA; [44, 05, B9][48, 05, B9] +33B0; [44, 05, 37][4A, 05, 37] +3250; [44, 05, B9][4C, 05, B9][2E, 05, 3D] +33B4; [44, 05, 37][50, 05, B9] +33BA; [44, 05, 37][52, 05, B9] + +1D18; [45 60, 05, 05] + +01A5; [45 62, 05, 05] +01A4; [45 62, 05, 8F] + +0278; [45 64, 05, 05] + +0071; [46, 05, 05] +FF51; [46, 05, 07] +D835 DC2A; [46, 05, 0B] +D835 DC5E; [46, 05, 0B] +D835 DC92; [46, 05, 0B] +D835 DCC6; [46, 05, 0B] +D835 DCFA; [46, 05, 0B] +D835 DD2E; [46, 05, 0B] +D835 DD62; [46, 05, 0B] +D835 DD96; [46, 05, 0B] +D835 DDCA; [46, 05, 0B] +D835 DDFE; [46, 05, 0B] +D835 DE32; [46, 05, 0B] +D835 DE66; [46, 05, 0B] +D835 DE9A; [46, 05, 0B] +24E0; [46, 05, 0D] +0051; [46, 05, 8F] +FF31; [46, 05, 91] +211A; [46, 05, 95] +D835 DC10; [46, 05, 95] +D835 DC44; [46, 05, 95] +D835 DC78; [46, 05, 95] +D835 DCAC; [46, 05, 95] +D835 DCE0; [46, 05, 95] +D835 DD14; [46, 05, 95] +D835 DD7C; [46, 05, 95] +D835 DDB0; [46, 05, 95] +D835 DDE4; [46, 05, 95] +D835 DE18; [46, 05, 95] +D835 DE4C; [46, 05, 95] +D835 DE80; [46, 05, 95] +24C6; [46, 05, 97] + +02A0; [47 60, 05, 05] + +0138; [47 62, 05, 05] + +0072; [48, 05, 05] +FF52; [48, 05, 07] +036C; [48, 05, 09] +D835 DC2B; [48, 05, 0B] +D835 DC5F; [48, 05, 0B] +D835 DC93; [48, 05, 0B] +D835 DCC7; [48, 05, 0B] +D835 DCFB; [48, 05, 0B] +D835 DD2F; [48, 05, 0B] +D835 DD63; [48, 05, 0B] +D835 DD97; [48, 05, 0B] +D835 DDCB; [48, 05, 0B] +D835 DDFF; [48, 05, 0B] +D835 DE33; [48, 05, 0B] +D835 DE67; [48, 05, 0B] +D835 DE9B; [48, 05, 0B] +24E1; [48, 05, 0D] +0052; [48, 05, 8F] +FF32; [48, 05, 91] +211B; [48, 05, 95] +211C; [48, 05, 95] +211D; [48, 05, 95] +D835 DC11; [48, 05, 95] +D835 DC45; [48, 05, 95] +D835 DC79; [48, 05, 95] +D835 DCE1; [48, 05, 95] +D835 DD7D; [48, 05, 95] +D835 DDB1; [48, 05, 95] +D835 DDE5; [48, 05, 95] +D835 DE19; [48, 05, 95] +D835 DE4D; [48, 05, 95] +D835 DE81; [48, 05, 95] +24C7; [48, 05, 97] +02B3; [48, 05, 27] +1D3F; [48, 05, 27] +1D63; [48, 05, 29] +0155; [48, 05, 05][, 8D, 05] +0154; [48, 05, 8F][, 8D, 05] +0159; [48, 05, 05][, 97, 05] +0158; [48, 05, 8F][, 97, 05] +1E59; [48, 05, 05][, A3, 05] +1E58; [48, 05, 8F][, A3, 05] +0157; [48, 05, 05][, A7, 05] +0156; [48, 05, 8F][, A7, 05] +0211; [48, 05, 05][, B5, 05] +0210; [48, 05, 8F][, B5, 05] +0213; [48, 05, 05][, B9, 05] +0212; [48, 05, 8F][, B9, 05] +1E5B; [48, 05, 05][, D0 4D, 05] +1E5A; [48, 05, 8F][, D0 4D, 05] +1E5D; [48, 05, 05][, D0 4D, 05][, AB, 05] +1E5C; [48, 05, 8F][, D0 4D, 05][, AB, 05] +1E5F; [48, 05, 05][, D1 11, 05] +1E5E; [48, 05, 8F][, D1 11, 05] +33AD; [48, 05, 37][26, 05, 37][2C, 05, 3D] +33AE; [48, 05, 37][26, 05, 37][2C, 05, 3D][0B D1, 05, 3D][4A, 05, 3D] +33AF; [48, 05, 37][26, 05, 37][2C, 05, 3D][0B D1, 05, 3D][4A, 05, 3D][23 74, 05, 3D] +20A8; [48, 05, 93][4A, 05, 09] + +0280; [49 60, 05, 05] +01A6; [49 60, 05, 8F] + +1D19; [49 62, 05, 05] + +0279; [49 64, 05, 05] +02B4; [49 64, 05, 27] + +1D1A; [49 66, 05, 05] + +027A; [49 68, 05, 05] + +027B; [49 6A, 05, 05] +02B5; [49 6A, 05, 27] + +027C; [49 6C, 05, 05] + +027D; [49 6E, 05, 05] + +027E; [49 70, 05, 05] + +027F; [49 72, 05, 05] + +0281; [49 74, 05, 05] +02B6; [49 74, 05, 27] + +0073; [4A, 05, 05] +FF53; [4A, 05, 07] +D835 DC2C; [4A, 05, 0B] +D835 DC60; [4A, 05, 0B] +D835 DC94; [4A, 05, 0B] +D835 DCC8; [4A, 05, 0B] +D835 DCFC; [4A, 05, 0B] +D835 DD30; [4A, 05, 0B] +D835 DD64; [4A, 05, 0B] +D835 DD98; [4A, 05, 0B] +D835 DDCC; [4A, 05, 0B] +D835 DE00; [4A, 05, 0B] +D835 DE34; [4A, 05, 0B] +D835 DE68; [4A, 05, 0B] +D835 DE9C; [4A, 05, 0B] +24E2; [4A, 05, 0D] +0053; [4A, 05, 8F] +FF33; [4A, 05, 91] +D835 DC12; [4A, 05, 95] +D835 DC46; [4A, 05, 95] +D835 DC7A; [4A, 05, 95] +D835 DCAE; [4A, 05, 95] +D835 DCE2; [4A, 05, 95] +D835 DD16; [4A, 05, 95] +D835 DD4A; [4A, 05, 95] +D835 DD7E; [4A, 05, 95] +D835 DDB2; [4A, 05, 95] +D835 DDE6; [4A, 05, 95] +D835 DE1A; [4A, 05, 95] +D835 DE4E; [4A, 05, 95] +D835 DE82; [4A, 05, 95] +24C8; [4A, 05, 97] +02E2; [4A, 05, 27] +015B; [4A, 05, 05][, 8D, 05] +015A; [4A, 05, 8F][, 8D, 05] +1E65; [4A, 05, 05][, 8D, 05][, A3, 05] +1E64; [4A, 05, 8F][, 8D, 05][, A3, 05] +015D; [4A, 05, 05][, 93, 05] +015C; [4A, 05, 8F][, 93, 05] +0161; [4A, 05, 05][, 97, 05] +0160; [4A, 05, 8F][, 97, 05] +1E67; [4A, 05, 05][, 97, 05][, A3, 05] +1E66; [4A, 05, 8F][, 97, 05][, A3, 05] +1E61; [4A, 05, 05][, A3, 05] +1E60; [4A, 05, 8F][, A3, 05] +015F; [4A, 05, 05][, A7, 05] +015E; [4A, 05, 8F][, A7, 05] +1E63; [4A, 05, 05][, D0 4D, 05] +1E62; [4A, 05, 8F][, D0 4D, 05] +1E69; [4A, 05, 05][, D0 4D, 05][, A3, 05] +1E68; [4A, 05, 8F][, D0 4D, 05][, A3, 05] +0219; [4A, 05, 05][, D0 7D, 05] +0218; [4A, 05, 8F][, D0 7D, 05] +017F; [4A, 05, 09][, E0 9D, 09] +1E9B; [4A, 05, 09][, E0 9D, 09][, A3, 05] +2120; [4A, 05, 27][3E, 05, 27] +33DB; [4A, 05, 37][48, 05, 37] +00DF; [4A, 05, 09][, E0 8D, 09][4A, 05, 3D] +FB06; [4A, 05, 09][4C, 05, 09] +FB05; [4A, 05, 09][, E0 9D, 09][4C, 05, 3D] +33DC; [4A, 05, B9][50, 05, 37] + +0282; [4B 60, 05, 05] + +0283; [4B 62, 05, 05] +01A9; [4B 62, 05, 8F] + +01AA; [4B 64, 05, 05] + +0285; [4B 66, 05, 05] + +0286; [4B 68, 05, 05] + +0074; [4C, 05, 05] +FF54; [4C, 05, 07] +036D; [4C, 05, 09] +D835 DC2D; [4C, 05, 0B] +D835 DC61; [4C, 05, 0B] +D835 DC95; [4C, 05, 0B] +D835 DCC9; [4C, 05, 0B] +D835 DCFD; [4C, 05, 0B] +D835 DD31; [4C, 05, 0B] +D835 DD65; [4C, 05, 0B] +D835 DD99; [4C, 05, 0B] +D835 DDCD; [4C, 05, 0B] +D835 DE01; [4C, 05, 0B] +D835 DE35; [4C, 05, 0B] +D835 DE69; [4C, 05, 0B] +D835 DE9D; [4C, 05, 0B] +24E3; [4C, 05, 0D] +0054; [4C, 05, 8F] +FF34; [4C, 05, 91] +D835 DC13; [4C, 05, 95] +D835 DC47; [4C, 05, 95] +D835 DC7B; [4C, 05, 95] +D835 DCAF; [4C, 05, 95] +D835 DCE3; [4C, 05, 95] +D835 DD17; [4C, 05, 95] +D835 DD4B; [4C, 05, 95] +D835 DD7F; [4C, 05, 95] +D835 DDB3; [4C, 05, 95] +D835 DDE7; [4C, 05, 95] +D835 DE1B; [4C, 05, 95] +D835 DE4F; [4C, 05, 95] +D835 DE83; [4C, 05, 95] +24C9; [4C, 05, 97] +1D40; [4C, 05, 27] +1D57; [4C, 05, 27] +0165; [4C, 05, 05][, 97, 05] +0164; [4C, 05, 8F][, 97, 05] +1E97; [4C, 05, 05][, 9D, 05] +1E6B; [4C, 05, 05][, A3, 05] +1E6A; [4C, 05, 8F][, A3, 05] +0163; [4C, 05, 05][, A7, 05] +0162; [4C, 05, 8F][, A7, 05] +1E6D; [4C, 05, 05][, D0 4D, 05] +1E6C; [4C, 05, 8F][, D0 4D, 05] +021B; [4C, 05, 05][, D0 7D, 05] +021A; [4C, 05, 8F][, D0 7D, 05] +1E71; [4C, 05, 05][, D0 CD, 05] +1E70; [4C, 05, 8F][, D0 CD, 05] +1E6F; [4C, 05, 05][, D1 11, 05] +1E6E; [4C, 05, 8F][, D1 11, 05] +02A8; [4C, 05, 09][2B 64, 05, 09] +2121; [4C, 05, 93][2E, 05, 93][3C, 05, 3D] +3394; [4C, 05, B9][34, 05, B9][58, 05, 3D] +2122; [4C, 05, 27][3E, 05, 27] +01BE; [4C, 05, 09][4A, 05, 09] +02A6; [4C, 05, 09][4A, 05, 09] +02A7; [4C, 05, 09][4B 62, 05, 09] + +1D1B; [4D 60, 05, 05] + +0167; [4D 62, 05, 05] +0166; [4D 62, 05, 8F] + +01AB; [4D 64, 05, 05] + +01AD; [4D 66, 05, 05] +01AC; [4D 66, 05, 8F] + +0288; [4D 68, 05, 05] +01AE; [4D 68, 05, 8F] + +0236; [4D 6A, 05, 05] + +0287; [4D 6C, 05, 05] + +0075; [4E, 05, 05] +FF55; [4E, 05, 07] +0367; [4E, 05, 09] +D835 DC2E; [4E, 05, 0B] +D835 DC62; [4E, 05, 0B] +D835 DC96; [4E, 05, 0B] +D835 DCCA; [4E, 05, 0B] +D835 DCFE; [4E, 05, 0B] +D835 DD32; [4E, 05, 0B] +D835 DD66; [4E, 05, 0B] +D835 DD9A; [4E, 05, 0B] +D835 DDCE; [4E, 05, 0B] +D835 DE02; [4E, 05, 0B] +D835 DE36; [4E, 05, 0B] +D835 DE6A; [4E, 05, 0B] +D835 DE9E; [4E, 05, 0B] +24E4; [4E, 05, 0D] +0055; [4E, 05, 8F] +FF35; [4E, 05, 91] +D835 DC14; [4E, 05, 95] +D835 DC48; [4E, 05, 95] +D835 DC7C; [4E, 05, 95] +D835 DCB0; [4E, 05, 95] +D835 DCE4; [4E, 05, 95] +D835 DD18; [4E, 05, 95] +D835 DD4C; [4E, 05, 95] +D835 DD80; [4E, 05, 95] +D835 DDB4; [4E, 05, 95] +D835 DDE8; [4E, 05, 95] +D835 DE1C; [4E, 05, 95] +D835 DE50; [4E, 05, 95] +D835 DE84; [4E, 05, 95] +24CA; [4E, 05, 97] +1D41; [4E, 05, 27] +1D58; [4E, 05, 27] +1D64; [4E, 05, 29] +00FA; [4E, 05, 05][, 8D, 05] +00DA; [4E, 05, 8F][, 8D, 05] +00F9; [4E, 05, 05][, 8F, 05] +00D9; [4E, 05, 8F][, 8F, 05] +016D; [4E, 05, 05][, 91, 05] +016C; [4E, 05, 8F][, 91, 05] +00FB; [4E, 05, 05][, 93, 05] +00DB; [4E, 05, 8F][, 93, 05] +01D4; [4E, 05, 05][, 97, 05] +01D3; [4E, 05, 8F][, 97, 05] +016F; [4E, 05, 05][, 99, 05] +016E; [4E, 05, 8F][, 99, 05] +00FC; [4E, 05, 05][, 9D, 05] +00DC; [4E, 05, 8F][, 9D, 05] +01D8; [4E, 05, 05][, 9D, 05][, 8D, 05] +01D7; [4E, 05, 8F][, 9D, 05][, 8D, 05] +01DC; [4E, 05, 05][, 9D, 05][, 8F, 05] +01DB; [4E, 05, 8F][, 9D, 05][, 8F, 05] +01DA; [4E, 05, 05][, 9D, 05][, 97, 05] +01D9; [4E, 05, 8F][, 9D, 05][, 97, 05] +01D6; [4E, 05, 05][, 9D, 05][, AB, 05] +01D5; [4E, 05, 8F][, 9D, 05][, AB, 05] +0171; [4E, 05, 05][, 9F, 05] +0170; [4E, 05, 8F][, 9F, 05] +0169; [4E, 05, 05][, A1, 05] +0168; [4E, 05, 8F][, A1, 05] +1E79; [4E, 05, 05][, A1, 05][, 8D, 05] +1E78; [4E, 05, 8F][, A1, 05][, 8D, 05] +0173; [4E, 05, 05][, A9, 05] +0172; [4E, 05, 8F][, A9, 05] +016B; [4E, 05, 05][, AB, 05] +016A; [4E, 05, 8F][, AB, 05] +1E7B; [4E, 05, 05][, AB, 05][, 9D, 05] +1E7A; [4E, 05, 8F][, AB, 05][, 9D, 05] +1EE7; [4E, 05, 05][, AF, 05] +1EE6; [4E, 05, 8F][, AF, 05] +0215; [4E, 05, 05][, B5, 05] +0214; [4E, 05, 8F][, B5, 05] +0217; [4E, 05, 05][, B9, 05] +0216; [4E, 05, 8F][, B9, 05] +01B0; [4E, 05, 05][, C9, 05] +01AF; [4E, 05, 8F][, C9, 05] +1EE9; [4E, 05, 05][, C9, 05][, 8D, 05] +1EE8; [4E, 05, 8F][, C9, 05][, 8D, 05] +1EEB; [4E, 05, 05][, C9, 05][, 8F, 05] +1EEA; [4E, 05, 8F][, C9, 05][, 8F, 05] +1EEF; [4E, 05, 05][, C9, 05][, A1, 05] +1EEE; [4E, 05, 8F][, C9, 05][, A1, 05] +1EED; [4E, 05, 05][, C9, 05][, AF, 05] +1EEC; [4E, 05, 8F][, C9, 05][, AF, 05] +1EF1; [4E, 05, 05][, C9, 05][, D0 4D, 05] +1EF0; [4E, 05, 8F][, C9, 05][, D0 4D, 05] +1EE5; [4E, 05, 05][, D0 4D, 05] +1EE4; [4E, 05, 8F][, D0 4D, 05] +1E73; [4E, 05, 05][, D0 5D, 05] +1E72; [4E, 05, 8F][, D0 5D, 05] +1E77; [4E, 05, 05][, D0 CD, 05] +1E76; [4E, 05, 8F][, D0 CD, 05] +1E75; [4E, 05, 05][, D0 FD, 05] +1E74; [4E, 05, 8F][, D0 FD, 05] + +1D1C; [4F 60, 05, 05] + +1D1D; [4F 62, 05, 05] +1D59; [4F 62, 05, 27] + +1D1E; [4F 64, 05, 05] + +1D6B; [4F 66, 05, 05] + +0289; [4F 68, 05, 05] + +0265; [4F 6A, 05, 05] + +02AE; [4F 6C, 05, 05] + +02AF; [4F 6E, 05, 05] + +026F; [4F 70, 05, 05] +019C; [4F 70, 05, 8F] +1D5A; [4F 70, 05, 27] + +1D1F; [4F 72, 05, 05] + +0270; [4F 74, 05, 05] + +028A; [4F 76, 05, 05] +01B1; [4F 76, 05, 8F] + +0076; [50, 05, 05] +FF56; [50, 05, 07] +036E; [50, 05, 09] +2174; [50, 05, 09] +D835 DC2F; [50, 05, 0B] +D835 DC63; [50, 05, 0B] +D835 DC97; [50, 05, 0B] +D835 DCCB; [50, 05, 0B] +D835 DCFF; [50, 05, 0B] +D835 DD33; [50, 05, 0B] +D835 DD67; [50, 05, 0B] +D835 DD9B; [50, 05, 0B] +D835 DDCF; [50, 05, 0B] +D835 DE03; [50, 05, 0B] +D835 DE37; [50, 05, 0B] +D835 DE6B; [50, 05, 0B] +D835 DE9F; [50, 05, 0B] +24E5; [50, 05, 0D] +0056; [50, 05, 8F] +FF36; [50, 05, 91] +2164; [50, 05, 93] +D835 DC15; [50, 05, 95] +D835 DC49; [50, 05, 95] +D835 DC7D; [50, 05, 95] +D835 DCB1; [50, 05, 95] +D835 DCE5; [50, 05, 95] +D835 DD19; [50, 05, 95] +D835 DD4D; [50, 05, 95] +D835 DD81; [50, 05, 95] +D835 DDB5; [50, 05, 95] +D835 DDE9; [50, 05, 95] +D835 DE1D; [50, 05, 95] +D835 DE51; [50, 05, 95] +D835 DE85; [50, 05, 95] +24CB; [50, 05, 97] +1D5B; [50, 05, 27] +1D65; [50, 05, 29] +1E7D; [50, 05, 05][, A1, 05] +1E7C; [50, 05, 8F][, A1, 05] +1E7F; [50, 05, 05][, D0 4D, 05] +1E7E; [50, 05, 8F][, D0 4D, 05] +33DE; [50, 05, B9][0B D1, 05, 37][3E, 05, 3D] +2175; [50, 05, 09][36, 05, 09] +2165; [50, 05, 93][36, 05, 93] +2176; [50, 05, 09][36, 05, 09][36, 05, 3D] +2166; [50, 05, 93][36, 05, 93][36, 05, 3D] +2177; [50, 05, 09][36, 05, 09][36, 05, 3D][36, 05, 3D] +2167; [50, 05, 93][36, 05, 93][36, 05, 3D][36, 05, 3D] + +1D20; [51 60, 05, 05] + +028B; [51 62, 05, 05] +01B2; [51 62, 05, 8F] + +028C; [51 64, 05, 05] + +0077; [52, 05, 05] +FF57; [52, 05, 07] +D835 DC30; [52, 05, 0B] +D835 DC64; [52, 05, 0B] +D835 DC98; [52, 05, 0B] +D835 DCCC; [52, 05, 0B] +D835 DD00; [52, 05, 0B] +D835 DD34; [52, 05, 0B] +D835 DD68; [52, 05, 0B] +D835 DD9C; [52, 05, 0B] +D835 DDD0; [52, 05, 0B] +D835 DE04; [52, 05, 0B] +D835 DE38; [52, 05, 0B] +D835 DE6C; [52, 05, 0B] +D835 DEA0; [52, 05, 0B] +24E6; [52, 05, 0D] +0057; [52, 05, 8F] +FF37; [52, 05, 91] +D835 DC16; [52, 05, 95] +D835 DC4A; [52, 05, 95] +D835 DC7E; [52, 05, 95] +D835 DCB2; [52, 05, 95] +D835 DCE6; [52, 05, 95] +D835 DD1A; [52, 05, 95] +D835 DD4E; [52, 05, 95] +D835 DD82; [52, 05, 95] +D835 DDB6; [52, 05, 95] +D835 DDEA; [52, 05, 95] +D835 DE1E; [52, 05, 95] +D835 DE52; [52, 05, 95] +D835 DE86; [52, 05, 95] +24CC; [52, 05, 97] +02B7; [52, 05, 27] +1D42; [52, 05, 27] +1E83; [52, 05, 05][, 8D, 05] +1E82; [52, 05, 8F][, 8D, 05] +1E81; [52, 05, 05][, 8F, 05] +1E80; [52, 05, 8F][, 8F, 05] +0175; [52, 05, 05][, 93, 05] +0174; [52, 05, 8F][, 93, 05] +1E98; [52, 05, 05][, 99, 05] +1E85; [52, 05, 05][, 9D, 05] +1E84; [52, 05, 8F][, 9D, 05] +1E87; [52, 05, 05][, A3, 05] +1E86; [52, 05, 8F][, A3, 05] +1E89; [52, 05, 05][, D0 4D, 05] +1E88; [52, 05, 8F][, D0 4D, 05] +33DD; [52, 05, B9][28, 05, 37] + +1D21; [53 60, 05, 05] + +028D; [53 62, 05, 05] + +0078; [54, 05, 05] +FF58; [54, 05, 07] +036F; [54, 05, 09] +2179; [54, 05, 09] +D835 DC31; [54, 05, 0B] +D835 DC65; [54, 05, 0B] +D835 DC99; [54, 05, 0B] +D835 DCCD; [54, 05, 0B] +D835 DD01; [54, 05, 0B] +D835 DD35; [54, 05, 0B] +D835 DD69; [54, 05, 0B] +D835 DD9D; [54, 05, 0B] +D835 DDD1; [54, 05, 0B] +D835 DE05; [54, 05, 0B] +D835 DE39; [54, 05, 0B] +D835 DE6D; [54, 05, 0B] +D835 DEA1; [54, 05, 0B] +24E7; [54, 05, 0D] +0058; [54, 05, 8F] +FF38; [54, 05, 91] +2169; [54, 05, 93] +D835 DC17; [54, 05, 95] +D835 DC4B; [54, 05, 95] +D835 DC7F; [54, 05, 95] +D835 DCB3; [54, 05, 95] +D835 DCE7; [54, 05, 95] +D835 DD1B; [54, 05, 95] +D835 DD4F; [54, 05, 95] +D835 DD83; [54, 05, 95] +D835 DDB7; [54, 05, 95] +D835 DDEB; [54, 05, 95] +D835 DE1F; [54, 05, 95] +D835 DE53; [54, 05, 95] +D835 DE87; [54, 05, 95] +24CD; [54, 05, 97] +02E3; [54, 05, 27] +1E8D; [54, 05, 05][, 9D, 05] +1E8C; [54, 05, 8F][, 9D, 05] +1E8B; [54, 05, 05][, A3, 05] +1E8A; [54, 05, 8F][, A3, 05] +217A; [54, 05, 09][36, 05, 09] +216A; [54, 05, 93][36, 05, 93] +217B; [54, 05, 09][36, 05, 09][36, 05, 3D] +216B; [54, 05, 93][36, 05, 93][36, 05, 3D] + +0079; [56, 05, 05] +FF59; [56, 05, 07] +D835 DC32; [56, 05, 0B] +D835 DC66; [56, 05, 0B] +D835 DC9A; [56, 05, 0B] +D835 DCCE; [56, 05, 0B] +D835 DD02; [56, 05, 0B] +D835 DD36; [56, 05, 0B] +D835 DD6A; [56, 05, 0B] +D835 DD9E; [56, 05, 0B] +D835 DDD2; [56, 05, 0B] +D835 DE06; [56, 05, 0B] +D835 DE3A; [56, 05, 0B] +D835 DE6E; [56, 05, 0B] +D835 DEA2; [56, 05, 0B] +24E8; [56, 05, 0D] +0059; [56, 05, 8F] +FF39; [56, 05, 91] +D835 DC18; [56, 05, 95] +D835 DC4C; [56, 05, 95] +D835 DC80; [56, 05, 95] +D835 DCB4; [56, 05, 95] +D835 DCE8; [56, 05, 95] +D835 DD1C; [56, 05, 95] +D835 DD50; [56, 05, 95] +D835 DD84; [56, 05, 95] +D835 DDB8; [56, 05, 95] +D835 DDEC; [56, 05, 95] +D835 DE20; [56, 05, 95] +D835 DE54; [56, 05, 95] +D835 DE88; [56, 05, 95] +24CE; [56, 05, 97] +02B8; [56, 05, 27] +00FD; [56, 05, 05][, 8D, 05] +00DD; [56, 05, 8F][, 8D, 05] +1EF3; [56, 05, 05][, 8F, 05] +1EF2; [56, 05, 8F][, 8F, 05] +0177; [56, 05, 05][, 93, 05] +0176; [56, 05, 8F][, 93, 05] +1E99; [56, 05, 05][, 99, 05] +00FF; [56, 05, 05][, 9D, 05] +0178; [56, 05, 8F][, 9D, 05] +1EF9; [56, 05, 05][, A1, 05] +1EF8; [56, 05, 8F][, A1, 05] +1E8F; [56, 05, 05][, A3, 05] +1E8E; [56, 05, 8F][, A3, 05] +0233; [56, 05, 05][, AB, 05] +0232; [56, 05, 8F][, AB, 05] +1EF7; [56, 05, 05][, AF, 05] +1EF6; [56, 05, 8F][, AF, 05] +1EF5; [56, 05, 05][, D0 4D, 05] +1EF4; [56, 05, 8F][, D0 4D, 05] + +028F; [57 60, 05, 05] + +01B4; [57 62, 05, 05] +01B3; [57 62, 05, 8F] + +007A; [58, 05, 05] +FF5A; [58, 05, 07] +D835 DC33; [58, 05, 0B] +D835 DC67; [58, 05, 0B] +D835 DC9B; [58, 05, 0B] +D835 DCCF; [58, 05, 0B] +D835 DD03; [58, 05, 0B] +D835 DD37; [58, 05, 0B] +D835 DD6B; [58, 05, 0B] +D835 DD9F; [58, 05, 0B] +D835 DDD3; [58, 05, 0B] +D835 DE07; [58, 05, 0B] +D835 DE3B; [58, 05, 0B] +D835 DE6F; [58, 05, 0B] +D835 DEA3; [58, 05, 0B] +24E9; [58, 05, 0D] +005A; [58, 05, 8F] +FF3A; [58, 05, 91] +2124; [58, 05, 95] +2128; [58, 05, 95] +D835 DC19; [58, 05, 95] +D835 DC4D; [58, 05, 95] +D835 DC81; [58, 05, 95] +D835 DCB5; [58, 05, 95] +D835 DCE9; [58, 05, 95] +D835 DD85; [58, 05, 95] +D835 DDB9; [58, 05, 95] +D835 DDED; [58, 05, 95] +D835 DE21; [58, 05, 95] +D835 DE55; [58, 05, 95] +D835 DE89; [58, 05, 95] +24CF; [58, 05, 97] +017A; [58, 05, 05][, 8D, 05] +0179; [58, 05, 8F][, 8D, 05] +1E91; [58, 05, 05][, 93, 05] +1E90; [58, 05, 8F][, 93, 05] +017E; [58, 05, 05][, 97, 05] +017D; [58, 05, 8F][, 97, 05] +017C; [58, 05, 05][, A3, 05] +017B; [58, 05, 8F][, A3, 05] +1E93; [58, 05, 05][, D0 4D, 05] +1E92; [58, 05, 8F][, D0 4D, 05] +1E95; [58, 05, 05][, D1 11, 05] +1E94; [58, 05, 8F][, D1 11, 05] +018D; [58, 05, 09][52, 05, 09] + +1D22; [59 60, 05, 05] + +01B6; [59 62, 05, 05] +01B5; [59 62, 05, 8F] + +0225; [59 64, 05, 05] +0224; [59 64, 05, 8F] + +0290; [59 66, 05, 05] + +0291; [59 68, 05, 05] + +0292; [59 6A, 05, 05] +01B7; [59 6A, 05, 8F] +01EF; [59 6A, 05, 05][, 97, 05] +01EE; [59 6A, 05, 8F][, 97, 05] + +1D23; [59 6C, 05, 05] + +01B9; [59 6E, 05, 05] +01B8; [59 6E, 05, 8F] + +01BA; [59 70, 05, 05] + +0293; [59 72, 05, 05] + +021D; [59 74, 05, 05] +021C; [59 74, 05, 8F] + +00FE; [59 76, 05, 05] +00DE; [59 76, 05, 8F] + +01BF; [59 78, 05, 05] +01F7; [59 78, 05, 8F] + +01BB; [59 7A, 05, 05] + +01A8; [59 7C, 05, 05] +01A7; [59 7C, 05, 8F] + +01BD; [59 7E, 05, 05] +01BC; [59 7E, 05, 8F] + +0185; [59 80, 05, 05] +0184; [59 80, 05, 8F] + +0294; [59 82, 05, 05] + +02C0; [59 84, 05, 05] + +02BC; [59 86, 05, 05] +0149; [59 86, 05, 09][40, 05, 09] + +02EE; [59 88, 05, 05] + +02BE; [59 8A, 05, 05] + +0295; [59 8C, 05, 05] +02E4; [59 8C, 05, 27] + +02BF; [59 8E, 05, 05] + +02C1; [59 90, 05, 05] + +1D24; [59 92, 05, 05] + +1D25; [59 94, 05, 05] +1D5C; [59 94, 05, 27] + +02A1; [59 96, 05, 05] + +02A2; [59 98, 05, 05] + +0296; [59 9A, 05, 05] + +01C0; [59 9C, 05, 05] + +01C1; [59 9E, 05, 05] + +01C2; [59 A0, 05, 05] + +01C3; [59 A2, 05, 05] + +0297; [59 A4, 05, 05] + +0298; [59 A6, 05, 05] + +02AC; [59 A8, 05, 05] + +02AD; [59 AA, 05, 05] + +03B1; [5A 20, 05, 05] +D835 DEC2; [5A 20, 05, 0B] +D835 DEFC; [5A 20, 05, 0B] +D835 DF36; [5A 20, 05, 0B] +D835 DF70; [5A 20, 05, 0B] +D835 DFAA; [5A 20, 05, 0B] +0391; [5A 20, 05, 8F] +D835 DEA8; [5A 20, 05, 95] +D835 DEE2; [5A 20, 05, 95] +D835 DF1C; [5A 20, 05, 95] +D835 DF56; [5A 20, 05, 95] +D835 DF90; [5A 20, 05, 95] +1F00; [5A 20, 05, 05][, 89, 05] +1F08; [5A 20, 05, 8F][, 89, 05] +1F04; [5A 20, 05, 05][, 89, 05][, 8D, 05] +1F0C; [5A 20, 05, 8F][, 89, 05][, 8D, 05] +1F84; [5A 20, 05, 05][, 89, 05][, 8D, 05][, D1 E1, 05] +1F8C; [5A 20, 05, 8F][, 89, 05][, 8D, 05][, D1 E1, 05] +1F02; [5A 20, 05, 05][, 89, 05][, 8F, 05] +1F0A; [5A 20, 05, 8F][, 89, 05][, 8F, 05] +1F82; [5A 20, 05, 05][, 89, 05][, 8F, 05][, D1 E1, 05] +1F8A; [5A 20, 05, 8F][, 89, 05][, 8F, 05][, D1 E1, 05] +1F06; [5A 20, 05, 05][, 89, 05][, 9B, 05] +1F0E; [5A 20, 05, 8F][, 89, 05][, 9B, 05] +1F86; [5A 20, 05, 05][, 89, 05][, 9B, 05][, D1 E1, 05] +1F8E; [5A 20, 05, 8F][, 89, 05][, 9B, 05][, D1 E1, 05] +1F80; [5A 20, 05, 05][, 89, 05][, D1 E1, 05] +1F88; [5A 20, 05, 8F][, 89, 05][, D1 E1, 05] +1F01; [5A 20, 05, 05][, 8B, 05] +1F09; [5A 20, 05, 8F][, 8B, 05] +1F05; [5A 20, 05, 05][, 8B, 05][, 8D, 05] +1F0D; [5A 20, 05, 8F][, 8B, 05][, 8D, 05] +1F85; [5A 20, 05, 05][, 8B, 05][, 8D, 05][, D1 E1, 05] +1F8D; [5A 20, 05, 8F][, 8B, 05][, 8D, 05][, D1 E1, 05] +1F03; [5A 20, 05, 05][, 8B, 05][, 8F, 05] +1F0B; [5A 20, 05, 8F][, 8B, 05][, 8F, 05] +1F83; [5A 20, 05, 05][, 8B, 05][, 8F, 05][, D1 E1, 05] +1F8B; [5A 20, 05, 8F][, 8B, 05][, 8F, 05][, D1 E1, 05] +1F07; [5A 20, 05, 05][, 8B, 05][, 9B, 05] +1F0F; [5A 20, 05, 8F][, 8B, 05][, 9B, 05] +1F87; [5A 20, 05, 05][, 8B, 05][, 9B, 05][, D1 E1, 05] +1F8F; [5A 20, 05, 8F][, 8B, 05][, 9B, 05][, D1 E1, 05] +1F81; [5A 20, 05, 05][, 8B, 05][, D1 E1, 05] +1F89; [5A 20, 05, 8F][, 8B, 05][, D1 E1, 05] +03AC; [5A 20, 05, 05][, 8D, 05] +1F71; [5A 20, 05, 05][, 8D, 05] +0386; [5A 20, 05, 8F][, 8D, 05] +1FBB; [5A 20, 05, 8F][, 8D, 05] +1FB4; [5A 20, 05, 05][, 8D, 05][, D1 E1, 05] +1F70; [5A 20, 05, 05][, 8F, 05] +1FBA; [5A 20, 05, 8F][, 8F, 05] +1FB2; [5A 20, 05, 05][, 8F, 05][, D1 E1, 05] +1FB0; [5A 20, 05, 05][, 91, 05] +1FB8; [5A 20, 05, 8F][, 91, 05] +1FB6; [5A 20, 05, 05][, 9B, 05] +1FB7; [5A 20, 05, 05][, 9B, 05][, D1 E1, 05] +1FB1; [5A 20, 05, 05][, AB, 05] +1FB9; [5A 20, 05, 8F][, AB, 05] +1FB3; [5A 20, 05, 05][, D1 E1, 05] +1FBC; [5A 20, 05, 8F][, D1 E1, 05] + +03B2; [5A 22, 05, 05] +03D0; [5A 22, 05, 09] +D835 DEC3; [5A 22, 05, 0B] +D835 DEFD; [5A 22, 05, 0B] +D835 DF37; [5A 22, 05, 0B] +D835 DF71; [5A 22, 05, 0B] +D835 DFAB; [5A 22, 05, 0B] +0392; [5A 22, 05, 8F] +D835 DEA9; [5A 22, 05, 95] +D835 DEE3; [5A 22, 05, 95] +D835 DF1D; [5A 22, 05, 95] +D835 DF57; [5A 22, 05, 95] +D835 DF91; [5A 22, 05, 95] +1D5D; [5A 22, 05, 27] +1D66; [5A 22, 05, 29] + +03B3; [5A 24, 05, 05] +213D; [5A 24, 05, 0B] +D835 DEC4; [5A 24, 05, 0B] +D835 DEFE; [5A 24, 05, 0B] +D835 DF38; [5A 24, 05, 0B] +D835 DF72; [5A 24, 05, 0B] +D835 DFAC; [5A 24, 05, 0B] +0393; [5A 24, 05, 8F] +213E; [5A 24, 05, 95] +D835 DEAA; [5A 24, 05, 95] +D835 DEE4; [5A 24, 05, 95] +D835 DF1E; [5A 24, 05, 95] +D835 DF58; [5A 24, 05, 95] +D835 DF92; [5A 24, 05, 95] +1D5E; [5A 24, 05, 27] +1D67; [5A 24, 05, 29] + +1D26; [5A 26, 05, 05] + +03B4; [5A 28, 05, 05] +D835 DEC5; [5A 28, 05, 0B] +D835 DEFF; [5A 28, 05, 0B] +D835 DF39; [5A 28, 05, 0B] +D835 DF73; [5A 28, 05, 0B] +D835 DFAD; [5A 28, 05, 0B] +0394; [5A 28, 05, 8F] +D835 DEAB; [5A 28, 05, 95] +D835 DEE5; [5A 28, 05, 95] +D835 DF1F; [5A 28, 05, 95] +D835 DF59; [5A 28, 05, 95] +D835 DF93; [5A 28, 05, 95] +1D5F; [5A 28, 05, 27] + +03B5; [5A 2A, 05, 05] +03F5; [5A 2A, 05, 09] +D835 DEC6; [5A 2A, 05, 0B] +D835 DEDC; [5A 2A, 05, 0B] +D835 DF00; [5A 2A, 05, 0B] +D835 DF16; [5A 2A, 05, 0B] +D835 DF3A; [5A 2A, 05, 0B] +D835 DF50; [5A 2A, 05, 0B] +D835 DF74; [5A 2A, 05, 0B] +D835 DF8A; [5A 2A, 05, 0B] +D835 DFAE; [5A 2A, 05, 0B] +D835 DFC4; [5A 2A, 05, 0B] +0395; [5A 2A, 05, 8F] +D835 DEAC; [5A 2A, 05, 95] +D835 DEE6; [5A 2A, 05, 95] +D835 DF20; [5A 2A, 05, 95] +D835 DF5A; [5A 2A, 05, 95] +D835 DF94; [5A 2A, 05, 95] +1F10; [5A 2A, 05, 05][, 89, 05] +1F18; [5A 2A, 05, 8F][, 89, 05] +1F14; [5A 2A, 05, 05][, 89, 05][, 8D, 05] +1F1C; [5A 2A, 05, 8F][, 89, 05][, 8D, 05] +1F12; [5A 2A, 05, 05][, 89, 05][, 8F, 05] +1F1A; [5A 2A, 05, 8F][, 89, 05][, 8F, 05] +1F11; [5A 2A, 05, 05][, 8B, 05] +1F19; [5A 2A, 05, 8F][, 8B, 05] +1F15; [5A 2A, 05, 05][, 8B, 05][, 8D, 05] +1F1D; [5A 2A, 05, 8F][, 8B, 05][, 8D, 05] +1F13; [5A 2A, 05, 05][, 8B, 05][, 8F, 05] +1F1B; [5A 2A, 05, 8F][, 8B, 05][, 8F, 05] +03AD; [5A 2A, 05, 05][, 8D, 05] +1F73; [5A 2A, 05, 05][, 8D, 05] +0388; [5A 2A, 05, 8F][, 8D, 05] +1FC9; [5A 2A, 05, 8F][, 8D, 05] +1F72; [5A 2A, 05, 05][, 8F, 05] +1FC8; [5A 2A, 05, 8F][, 8F, 05] + +03DD; [5A 2C, 05, 05] +03DC; [5A 2C, 05, 8F] + +03DB; [5A 2E, 05, 05] +03DA; [5A 2E, 05, 8F] + +03B6; [5A 30, 05, 05] +D835 DEC7; [5A 30, 05, 0B] +D835 DF01; [5A 30, 05, 0B] +D835 DF3B; [5A 30, 05, 0B] +D835 DF75; [5A 30, 05, 0B] +D835 DFAF; [5A 30, 05, 0B] +0396; [5A 30, 05, 8F] +D835 DEAD; [5A 30, 05, 95] +D835 DEE7; [5A 30, 05, 95] +D835 DF21; [5A 30, 05, 95] +D835 DF5B; [5A 30, 05, 95] +D835 DF95; [5A 30, 05, 95] + +03B7; [5A 32, 05, 05] +D835 DEC8; [5A 32, 05, 0B] +D835 DF02; [5A 32, 05, 0B] +D835 DF3C; [5A 32, 05, 0B] +D835 DF76; [5A 32, 05, 0B] +D835 DFB0; [5A 32, 05, 0B] +0397; [5A 32, 05, 8F] +D835 DEAE; [5A 32, 05, 95] +D835 DEE8; [5A 32, 05, 95] +D835 DF22; [5A 32, 05, 95] +D835 DF5C; [5A 32, 05, 95] +D835 DF96; [5A 32, 05, 95] +1F20; [5A 32, 05, 05][, 89, 05] +1F28; [5A 32, 05, 8F][, 89, 05] +1F24; [5A 32, 05, 05][, 89, 05][, 8D, 05] +1F2C; [5A 32, 05, 8F][, 89, 05][, 8D, 05] +1F94; [5A 32, 05, 05][, 89, 05][, 8D, 05][, D1 E1, 05] +1F9C; [5A 32, 05, 8F][, 89, 05][, 8D, 05][, D1 E1, 05] +1F22; [5A 32, 05, 05][, 89, 05][, 8F, 05] +1F2A; [5A 32, 05, 8F][, 89, 05][, 8F, 05] +1F92; [5A 32, 05, 05][, 89, 05][, 8F, 05][, D1 E1, 05] +1F9A; [5A 32, 05, 8F][, 89, 05][, 8F, 05][, D1 E1, 05] +1F26; [5A 32, 05, 05][, 89, 05][, 9B, 05] +1F2E; [5A 32, 05, 8F][, 89, 05][, 9B, 05] +1F96; [5A 32, 05, 05][, 89, 05][, 9B, 05][, D1 E1, 05] +1F9E; [5A 32, 05, 8F][, 89, 05][, 9B, 05][, D1 E1, 05] +1F90; [5A 32, 05, 05][, 89, 05][, D1 E1, 05] +1F98; [5A 32, 05, 8F][, 89, 05][, D1 E1, 05] +1F21; [5A 32, 05, 05][, 8B, 05] +1F29; [5A 32, 05, 8F][, 8B, 05] +1F25; [5A 32, 05, 05][, 8B, 05][, 8D, 05] +1F2D; [5A 32, 05, 8F][, 8B, 05][, 8D, 05] +1F95; [5A 32, 05, 05][, 8B, 05][, 8D, 05][, D1 E1, 05] +1F9D; [5A 32, 05, 8F][, 8B, 05][, 8D, 05][, D1 E1, 05] +1F23; [5A 32, 05, 05][, 8B, 05][, 8F, 05] +1F2B; [5A 32, 05, 8F][, 8B, 05][, 8F, 05] +1F93; [5A 32, 05, 05][, 8B, 05][, 8F, 05][, D1 E1, 05] +1F9B; [5A 32, 05, 8F][, 8B, 05][, 8F, 05][, D1 E1, 05] +1F27; [5A 32, 05, 05][, 8B, 05][, 9B, 05] +1F2F; [5A 32, 05, 8F][, 8B, 05][, 9B, 05] +1F97; [5A 32, 05, 05][, 8B, 05][, 9B, 05][, D1 E1, 05] +1F9F; [5A 32, 05, 8F][, 8B, 05][, 9B, 05][, D1 E1, 05] +1F91; [5A 32, 05, 05][, 8B, 05][, D1 E1, 05] +1F99; [5A 32, 05, 8F][, 8B, 05][, D1 E1, 05] +03AE; [5A 32, 05, 05][, 8D, 05] +1F75; [5A 32, 05, 05][, 8D, 05] +0389; [5A 32, 05, 8F][, 8D, 05] +1FCB; [5A 32, 05, 8F][, 8D, 05] +1FC4; [5A 32, 05, 05][, 8D, 05][, D1 E1, 05] +1F74; [5A 32, 05, 05][, 8F, 05] +1FCA; [5A 32, 05, 8F][, 8F, 05] +1FC2; [5A 32, 05, 05][, 8F, 05][, D1 E1, 05] +1FC6; [5A 32, 05, 05][, 9B, 05] +1FC7; [5A 32, 05, 05][, 9B, 05][, D1 E1, 05] +1FC3; [5A 32, 05, 05][, D1 E1, 05] +1FCC; [5A 32, 05, 8F][, D1 E1, 05] + +03B8; [5A 34, 05, 05] +03D1; [5A 34, 05, 09] +D835 DEC9; [5A 34, 05, 0B] +D835 DEDD; [5A 34, 05, 0B] +D835 DF03; [5A 34, 05, 0B] +D835 DF17; [5A 34, 05, 0B] +D835 DF3D; [5A 34, 05, 0B] +D835 DF51; [5A 34, 05, 0B] +D835 DF77; [5A 34, 05, 0B] +D835 DF8B; [5A 34, 05, 0B] +D835 DFB1; [5A 34, 05, 0B] +D835 DFC5; [5A 34, 05, 0B] +0398; [5A 34, 05, 8F] +03F4; [5A 34, 05, 93] +D835 DEAF; [5A 34, 05, 95] +D835 DEB9; [5A 34, 05, 95] +D835 DEE9; [5A 34, 05, 95] +D835 DEF3; [5A 34, 05, 95] +D835 DF23; [5A 34, 05, 95] +D835 DF2D; [5A 34, 05, 95] +D835 DF5D; [5A 34, 05, 95] +D835 DF67; [5A 34, 05, 95] +D835 DF97; [5A 34, 05, 95] +D835 DFA1; [5A 34, 05, 95] + +03B9; [5A 36, 05, 05] +1FBE; [5A 36, 05, 05] +037A; [5A 36, 05, 09] +D835 DECA; [5A 36, 05, 0B] +D835 DF04; [5A 36, 05, 0B] +D835 DF3E; [5A 36, 05, 0B] +D835 DF78; [5A 36, 05, 0B] +D835 DFB2; [5A 36, 05, 0B] +0399; [5A 36, 05, 8F] +D835 DEB0; [5A 36, 05, 95] +D835 DEEA; [5A 36, 05, 95] +D835 DF24; [5A 36, 05, 95] +D835 DF5E; [5A 36, 05, 95] +D835 DF98; [5A 36, 05, 95] +1F30; [5A 36, 05, 05][, 89, 05] +1F38; [5A 36, 05, 8F][, 89, 05] +1F34; [5A 36, 05, 05][, 89, 05][, 8D, 05] +1F3C; [5A 36, 05, 8F][, 89, 05][, 8D, 05] +1F32; [5A 36, 05, 05][, 89, 05][, 8F, 05] +1F3A; [5A 36, 05, 8F][, 89, 05][, 8F, 05] +1F36; [5A 36, 05, 05][, 89, 05][, 9B, 05] +1F3E; [5A 36, 05, 8F][, 89, 05][, 9B, 05] +1F31; [5A 36, 05, 05][, 8B, 05] +1F39; [5A 36, 05, 8F][, 8B, 05] +1F35; [5A 36, 05, 05][, 8B, 05][, 8D, 05] +1F3D; [5A 36, 05, 8F][, 8B, 05][, 8D, 05] +1F33; [5A 36, 05, 05][, 8B, 05][, 8F, 05] +1F3B; [5A 36, 05, 8F][, 8B, 05][, 8F, 05] +1F37; [5A 36, 05, 05][, 8B, 05][, 9B, 05] +1F3F; [5A 36, 05, 8F][, 8B, 05][, 9B, 05] +03AF; [5A 36, 05, 05][, 8D, 05] +1F77; [5A 36, 05, 05][, 8D, 05] +038A; [5A 36, 05, 8F][, 8D, 05] +1FDB; [5A 36, 05, 8F][, 8D, 05] +1F76; [5A 36, 05, 05][, 8F, 05] +1FDA; [5A 36, 05, 8F][, 8F, 05] +1FD0; [5A 36, 05, 05][, 91, 05] +1FD8; [5A 36, 05, 8F][, 91, 05] +1FD6; [5A 36, 05, 05][, 9B, 05] +03CA; [5A 36, 05, 05][, 9D, 05] +03AA; [5A 36, 05, 8F][, 9D, 05] +0390; [5A 36, 05, 05][, 9D, 05][, 8D, 05] +1FD3; [5A 36, 05, 05][, 9D, 05][, 8D, 05] +1FD2; [5A 36, 05, 05][, 9D, 05][, 8F, 05] +1FD7; [5A 36, 05, 05][, 9D, 05][, 9B, 05] +1FD1; [5A 36, 05, 05][, AB, 05] +1FD9; [5A 36, 05, 8F][, AB, 05] + +03F3; [5A 38, 05, 05] + +03BA; [5A 3A, 05, 05] +03F0; [5A 3A, 05, 09] +D835 DECB; [5A 3A, 05, 0B] +D835 DEDE; [5A 3A, 05, 0B] +D835 DF05; [5A 3A, 05, 0B] +D835 DF18; [5A 3A, 05, 0B] +D835 DF3F; [5A 3A, 05, 0B] +D835 DF52; [5A 3A, 05, 0B] +D835 DF79; [5A 3A, 05, 0B] +D835 DF8C; [5A 3A, 05, 0B] +D835 DFB3; [5A 3A, 05, 0B] +D835 DFC6; [5A 3A, 05, 0B] +039A; [5A 3A, 05, 8F] +D835 DEB1; [5A 3A, 05, 95] +D835 DEEB; [5A 3A, 05, 95] +D835 DF25; [5A 3A, 05, 95] +D835 DF5F; [5A 3A, 05, 95] +D835 DF99; [5A 3A, 05, 95] +03D7; [5A 3A, 05, 09][5A 20, 05, 09][5A 36, 05, 3D] + +03BB; [5A 3C, 05, 05] +D835 DECC; [5A 3C, 05, 0B] +D835 DF06; [5A 3C, 05, 0B] +D835 DF40; [5A 3C, 05, 0B] +D835 DF7A; [5A 3C, 05, 0B] +D835 DFB4; [5A 3C, 05, 0B] +039B; [5A 3C, 05, 8F] +D835 DEB2; [5A 3C, 05, 95] +D835 DEEC; [5A 3C, 05, 95] +D835 DF26; [5A 3C, 05, 95] +D835 DF60; [5A 3C, 05, 95] +D835 DF9A; [5A 3C, 05, 95] + +1D27; [5A 3E, 05, 05] + +03BC; [5A 40, 05, 05] +00B5; [5A 40, 05, 09] +D835 DECD; [5A 40, 05, 0B] +D835 DF07; [5A 40, 05, 0B] +D835 DF41; [5A 40, 05, 0B] +D835 DF7B; [5A 40, 05, 0B] +D835 DFB5; [5A 40, 05, 0B] +039C; [5A 40, 05, 8F] +D835 DEB3; [5A 40, 05, 95] +D835 DEED; [5A 40, 05, 95] +D835 DF27; [5A 40, 05, 95] +D835 DF61; [5A 40, 05, 95] +D835 DF9B; [5A 40, 05, 95] +3382; [5A 40, 05, 37][26, 05, B9] +338C; [5A 40, 05, 37][30, 05, B9] +338D; [5A 40, 05, 37][32, 05, 37] +3395; [5A 40, 05, 37][3C, 05, 37] +339B; [5A 40, 05, 37][3E, 05, 37] +33B2; [5A 40, 05, 37][4A, 05, 37] +33B6; [5A 40, 05, 37][50, 05, B9] +33BC; [5A 40, 05, 37][52, 05, B9] + +03BD; [5A 42, 05, 05] +D835 DECE; [5A 42, 05, 0B] +D835 DF08; [5A 42, 05, 0B] +D835 DF42; [5A 42, 05, 0B] +D835 DF7C; [5A 42, 05, 0B] +D835 DFB6; [5A 42, 05, 0B] +039D; [5A 42, 05, 8F] +D835 DEB4; [5A 42, 05, 95] +D835 DEEE; [5A 42, 05, 95] +D835 DF28; [5A 42, 05, 95] +D835 DF62; [5A 42, 05, 95] +D835 DF9C; [5A 42, 05, 95] + +03BE; [5A 44, 05, 05] +D835 DECF; [5A 44, 05, 0B] +D835 DF09; [5A 44, 05, 0B] +D835 DF43; [5A 44, 05, 0B] +D835 DF7D; [5A 44, 05, 0B] +D835 DFB7; [5A 44, 05, 0B] +039E; [5A 44, 05, 8F] +D835 DEB5; [5A 44, 05, 95] +D835 DEEF; [5A 44, 05, 95] +D835 DF29; [5A 44, 05, 95] +D835 DF63; [5A 44, 05, 95] +D835 DF9D; [5A 44, 05, 95] + +03BF; [5A 46, 05, 05] +D835 DED0; [5A 46, 05, 0B] +D835 DF0A; [5A 46, 05, 0B] +D835 DF44; [5A 46, 05, 0B] +D835 DF7E; [5A 46, 05, 0B] +D835 DFB8; [5A 46, 05, 0B] +039F; [5A 46, 05, 8F] +D835 DEB6; [5A 46, 05, 95] +D835 DEF0; [5A 46, 05, 95] +D835 DF2A; [5A 46, 05, 95] +D835 DF64; [5A 46, 05, 95] +D835 DF9E; [5A 46, 05, 95] +1F40; [5A 46, 05, 05][, 89, 05] +1F48; [5A 46, 05, 8F][, 89, 05] +1F44; [5A 46, 05, 05][, 89, 05][, 8D, 05] +1F4C; [5A 46, 05, 8F][, 89, 05][, 8D, 05] +1F42; [5A 46, 05, 05][, 89, 05][, 8F, 05] +1F4A; [5A 46, 05, 8F][, 89, 05][, 8F, 05] +1F41; [5A 46, 05, 05][, 8B, 05] +1F49; [5A 46, 05, 8F][, 8B, 05] +1F45; [5A 46, 05, 05][, 8B, 05][, 8D, 05] +1F4D; [5A 46, 05, 8F][, 8B, 05][, 8D, 05] +1F43; [5A 46, 05, 05][, 8B, 05][, 8F, 05] +1F4B; [5A 46, 05, 8F][, 8B, 05][, 8F, 05] +03CC; [5A 46, 05, 05][, 8D, 05] +1F79; [5A 46, 05, 05][, 8D, 05] +038C; [5A 46, 05, 8F][, 8D, 05] +1FF9; [5A 46, 05, 8F][, 8D, 05] +1F78; [5A 46, 05, 05][, 8F, 05] +1FF8; [5A 46, 05, 8F][, 8F, 05] + +03C0; [5A 48, 05, 05] +03D6; [5A 48, 05, 09] +D835 DED1; [5A 48, 05, 0B] +D835 DEE1; [5A 48, 05, 0B] +D835 DF0B; [5A 48, 05, 0B] +D835 DF1B; [5A 48, 05, 0B] +D835 DF45; [5A 48, 05, 0B] +D835 DF55; [5A 48, 05, 0B] +D835 DF7F; [5A 48, 05, 0B] +D835 DF8F; [5A 48, 05, 0B] +D835 DFB9; [5A 48, 05, 0B] +D835 DFC9; [5A 48, 05, 0B] +03A0; [5A 48, 05, 8F] +213F; [5A 48, 05, 95] +D835 DEB7; [5A 48, 05, 95] +D835 DEF1; [5A 48, 05, 95] +D835 DF2B; [5A 48, 05, 95] +D835 DF65; [5A 48, 05, 95] +D835 DF9F; [5A 48, 05, 95] + +1D28; [5A 4A, 05, 05] + +03DF; [5A 4C, 05, 05] +03DE; [5A 4C, 05, 8F] + +03D9; [5A 4E, 05, 05] +03D8; [5A 4E, 05, 8F] + +03C1; [5A 50, 05, 05] +03F1; [5A 50, 05, 09] +D835 DED2; [5A 50, 05, 0B] +D835 DEE0; [5A 50, 05, 0B] +D835 DF0C; [5A 50, 05, 0B] +D835 DF1A; [5A 50, 05, 0B] +D835 DF46; [5A 50, 05, 0B] +D835 DF54; [5A 50, 05, 0B] +D835 DF80; [5A 50, 05, 0B] +D835 DF8E; [5A 50, 05, 0B] +D835 DFBA; [5A 50, 05, 0B] +D835 DFC8; [5A 50, 05, 0B] +03A1; [5A 50, 05, 8F] +D835 DEB8; [5A 50, 05, 95] +D835 DEF2; [5A 50, 05, 95] +D835 DF2C; [5A 50, 05, 95] +D835 DF66; [5A 50, 05, 95] +D835 DFA0; [5A 50, 05, 95] +1D68; [5A 50, 05, 29] +1FE4; [5A 50, 05, 05][, 89, 05] +1FE5; [5A 50, 05, 05][, 8B, 05] +1FEC; [5A 50, 05, 8F][, 8B, 05] + +1D29; [5A 52, 05, 05] + +03C3; [5A 54, 05, 05] +03F2; [5A 54, 05, 09] +D835 DED3; [5A 54, 05, 0B] +D835 DED4; [5A 54, 05, 0B] +D835 DF0D; [5A 54, 05, 0B] +D835 DF0E; [5A 54, 05, 0B] +D835 DF47; [5A 54, 05, 0B] +D835 DF48; [5A 54, 05, 0B] +D835 DF81; [5A 54, 05, 0B] +D835 DF82; [5A 54, 05, 0B] +D835 DFBB; [5A 54, 05, 0B] +D835 DFBC; [5A 54, 05, 0B] +03A3; [5A 54, 05, 8F] +03F9; [5A 54, 05, 93] +D835 DEBA; [5A 54, 05, 95] +D835 DEF4; [5A 54, 05, 95] +D835 DF2E; [5A 54, 05, 95] +D835 DF68; [5A 54, 05, 95] +D835 DFA2; [5A 54, 05, 95] +03C2; [5A 54, 05, 31] + +03C4; [5A 56, 05, 05] +D835 DED5; [5A 56, 05, 0B] +D835 DF0F; [5A 56, 05, 0B] +D835 DF49; [5A 56, 05, 0B] +D835 DF83; [5A 56, 05, 0B] +D835 DFBD; [5A 56, 05, 0B] +03A4; [5A 56, 05, 8F] +D835 DEBB; [5A 56, 05, 95] +D835 DEF5; [5A 56, 05, 95] +D835 DF2F; [5A 56, 05, 95] +D835 DF69; [5A 56, 05, 95] +D835 DFA3; [5A 56, 05, 95] + +03C5; [5A 58, 05, 05] +D835 DED6; [5A 58, 05, 0B] +D835 DF10; [5A 58, 05, 0B] +D835 DF4A; [5A 58, 05, 0B] +D835 DF84; [5A 58, 05, 0B] +D835 DFBE; [5A 58, 05, 0B] +03A5; [5A 58, 05, 8F] +03D2; [5A 58, 05, 93] +D835 DEBC; [5A 58, 05, 95] +D835 DEF6; [5A 58, 05, 95] +D835 DF30; [5A 58, 05, 95] +D835 DF6A; [5A 58, 05, 95] +D835 DFA4; [5A 58, 05, 95] +1F50; [5A 58, 05, 05][, 89, 05] +1F54; [5A 58, 05, 05][, 89, 05][, 8D, 05] +1F52; [5A 58, 05, 05][, 89, 05][, 8F, 05] +1F56; [5A 58, 05, 05][, 89, 05][, 9B, 05] +1F51; [5A 58, 05, 05][, 8B, 05] +1F59; [5A 58, 05, 8F][, 8B, 05] +1F55; [5A 58, 05, 05][, 8B, 05][, 8D, 05] +1F5D; [5A 58, 05, 8F][, 8B, 05][, 8D, 05] +1F53; [5A 58, 05, 05][, 8B, 05][, 8F, 05] +1F5B; [5A 58, 05, 8F][, 8B, 05][, 8F, 05] +1F57; [5A 58, 05, 05][, 8B, 05][, 9B, 05] +1F5F; [5A 58, 05, 8F][, 8B, 05][, 9B, 05] +03CD; [5A 58, 05, 05][, 8D, 05] +1F7B; [5A 58, 05, 05][, 8D, 05] +038E; [5A 58, 05, 8F][, 8D, 05] +1FEB; [5A 58, 05, 8F][, 8D, 05] +03D3; [5A 58, 05, 93][, 8D, 05] +1F7A; [5A 58, 05, 05][, 8F, 05] +1FEA; [5A 58, 05, 8F][, 8F, 05] +1FE0; [5A 58, 05, 05][, 91, 05] +1FE8; [5A 58, 05, 8F][, 91, 05] +1FE6; [5A 58, 05, 05][, 9B, 05] +03CB; [5A 58, 05, 05][, 9D, 05] +03AB; [5A 58, 05, 8F][, 9D, 05] +03D4; [5A 58, 05, 93][, 9D, 05] +03B0; [5A 58, 05, 05][, 9D, 05][, 8D, 05] +1FE3; [5A 58, 05, 05][, 9D, 05][, 8D, 05] +1FE2; [5A 58, 05, 05][, 9D, 05][, 8F, 05] +1FE7; [5A 58, 05, 05][, 9D, 05][, 9B, 05] +1FE1; [5A 58, 05, 05][, AB, 05] +1FE9; [5A 58, 05, 8F][, AB, 05] + +03C6; [5A 5A, 05, 05] +03D5; [5A 5A, 05, 09] +D835 DED7; [5A 5A, 05, 0B] +D835 DEDF; [5A 5A, 05, 0B] +D835 DF11; [5A 5A, 05, 0B] +D835 DF19; [5A 5A, 05, 0B] +D835 DF4B; [5A 5A, 05, 0B] +D835 DF53; [5A 5A, 05, 0B] +D835 DF85; [5A 5A, 05, 0B] +D835 DF8D; [5A 5A, 05, 0B] +D835 DFBF; [5A 5A, 05, 0B] +D835 DFC7; [5A 5A, 05, 0B] +03A6; [5A 5A, 05, 8F] +D835 DEBD; [5A 5A, 05, 95] +D835 DEF7; [5A 5A, 05, 95] +D835 DF31; [5A 5A, 05, 95] +D835 DF6B; [5A 5A, 05, 95] +D835 DFA5; [5A 5A, 05, 95] +1D60; [5A 5A, 05, 27] +1D69; [5A 5A, 05, 29] + +03C7; [5A 5C, 05, 05] +D835 DED8; [5A 5C, 05, 0B] +D835 DF12; [5A 5C, 05, 0B] +D835 DF4C; [5A 5C, 05, 0B] +D835 DF86; [5A 5C, 05, 0B] +D835 DFC0; [5A 5C, 05, 0B] +03A7; [5A 5C, 05, 8F] +D835 DEBE; [5A 5C, 05, 95] +D835 DEF8; [5A 5C, 05, 95] +D835 DF32; [5A 5C, 05, 95] +D835 DF6C; [5A 5C, 05, 95] +D835 DFA6; [5A 5C, 05, 95] +1D61; [5A 5C, 05, 27] +1D6A; [5A 5C, 05, 29] + +03C8; [5A 5E, 05, 05] +D835 DED9; [5A 5E, 05, 0B] +D835 DF13; [5A 5E, 05, 0B] +D835 DF4D; [5A 5E, 05, 0B] +D835 DF87; [5A 5E, 05, 0B] +D835 DFC1; [5A 5E, 05, 0B] +03A8; [5A 5E, 05, 8F] +D835 DEBF; [5A 5E, 05, 95] +D835 DEF9; [5A 5E, 05, 95] +D835 DF33; [5A 5E, 05, 95] +D835 DF6D; [5A 5E, 05, 95] +D835 DFA7; [5A 5E, 05, 95] + +1D2A; [5A 60, 05, 05] + +03C9; [5A 62, 05, 05] +D835 DEDA; [5A 62, 05, 0B] +D835 DF14; [5A 62, 05, 0B] +D835 DF4E; [5A 62, 05, 0B] +D835 DF88; [5A 62, 05, 0B] +D835 DFC2; [5A 62, 05, 0B] +03A9; [5A 62, 05, 8F] +2126; [5A 62, 05, 8F] +D835 DEC0; [5A 62, 05, 95] +D835 DEFA; [5A 62, 05, 95] +D835 DF34; [5A 62, 05, 95] +D835 DF6E; [5A 62, 05, 95] +D835 DFA8; [5A 62, 05, 95] +1F60; [5A 62, 05, 05][, 89, 05] +1F68; [5A 62, 05, 8F][, 89, 05] +1F64; [5A 62, 05, 05][, 89, 05][, 8D, 05] +1F6C; [5A 62, 05, 8F][, 89, 05][, 8D, 05] +1FA4; [5A 62, 05, 05][, 89, 05][, 8D, 05][, D1 E1, 05] +1FAC; [5A 62, 05, 8F][, 89, 05][, 8D, 05][, D1 E1, 05] +1F62; [5A 62, 05, 05][, 89, 05][, 8F, 05] +1F6A; [5A 62, 05, 8F][, 89, 05][, 8F, 05] +1FA2; [5A 62, 05, 05][, 89, 05][, 8F, 05][, D1 E1, 05] +1FAA; [5A 62, 05, 8F][, 89, 05][, 8F, 05][, D1 E1, 05] +1F66; [5A 62, 05, 05][, 89, 05][, 9B, 05] +1F6E; [5A 62, 05, 8F][, 89, 05][, 9B, 05] +1FA6; [5A 62, 05, 05][, 89, 05][, 9B, 05][, D1 E1, 05] +1FAE; [5A 62, 05, 8F][, 89, 05][, 9B, 05][, D1 E1, 05] +1FA0; [5A 62, 05, 05][, 89, 05][, D1 E1, 05] +1FA8; [5A 62, 05, 8F][, 89, 05][, D1 E1, 05] +1F61; [5A 62, 05, 05][, 8B, 05] +1F69; [5A 62, 05, 8F][, 8B, 05] +1F65; [5A 62, 05, 05][, 8B, 05][, 8D, 05] +1F6D; [5A 62, 05, 8F][, 8B, 05][, 8D, 05] +1FA5; [5A 62, 05, 05][, 8B, 05][, 8D, 05][, D1 E1, 05] +1FAD; [5A 62, 05, 8F][, 8B, 05][, 8D, 05][, D1 E1, 05] +1F63; [5A 62, 05, 05][, 8B, 05][, 8F, 05] +1F6B; [5A 62, 05, 8F][, 8B, 05][, 8F, 05] +1FA3; [5A 62, 05, 05][, 8B, 05][, 8F, 05][, D1 E1, 05] +1FAB; [5A 62, 05, 8F][, 8B, 05][, 8F, 05][, D1 E1, 05] +1F67; [5A 62, 05, 05][, 8B, 05][, 9B, 05] +1F6F; [5A 62, 05, 8F][, 8B, 05][, 9B, 05] +1FA7; [5A 62, 05, 05][, 8B, 05][, 9B, 05][, D1 E1, 05] +1FAF; [5A 62, 05, 8F][, 8B, 05][, 9B, 05][, D1 E1, 05] +1FA1; [5A 62, 05, 05][, 8B, 05][, D1 E1, 05] +1FA9; [5A 62, 05, 8F][, 8B, 05][, D1 E1, 05] +03CE; [5A 62, 05, 05][, 8D, 05] +1F7D; [5A 62, 05, 05][, 8D, 05] +038F; [5A 62, 05, 8F][, 8D, 05] +1FFB; [5A 62, 05, 8F][, 8D, 05] +1FF4; [5A 62, 05, 05][, 8D, 05][, D1 E1, 05] +1F7C; [5A 62, 05, 05][, 8F, 05] +1FFA; [5A 62, 05, 8F][, 8F, 05] +1FF2; [5A 62, 05, 05][, 8F, 05][, D1 E1, 05] +1FF6; [5A 62, 05, 05][, 9B, 05] +1FF7; [5A 62, 05, 05][, 9B, 05][, D1 E1, 05] +1FF3; [5A 62, 05, 05][, D1 E1, 05] +1FFC; [5A 62, 05, 8F][, D1 E1, 05] + +03E1; [5A 64, 05, 05] +03E0; [5A 64, 05, 8F] + +03F8; [5A 66, 05, 05] +03F7; [5A 66, 05, 8F] + +03FB; [5A 68, 05, 05] +03FA; [5A 68, 05, 8F] + +03E3; [5A 6A, 05, 05] +03E2; [5A 6A, 05, 8F] + +03E5; [5A 6C, 05, 05] +03E4; [5A 6C, 05, 8F] + +03E7; [5A 6E, 05, 05] +03E6; [5A 6E, 05, 8F] + +03E9; [5A 70, 05, 05] +03E8; [5A 70, 05, 8F] + +03EB; [5A 72, 05, 05] +03EA; [5A 72, 05, 8F] + +03ED; [5A 74, 05, 05] +03EC; [5A 74, 05, 8F] + +03EF; [5A 76, 05, 05] +03EE; [5A 76, 05, 8F] + +0430; [5B 20, 05, 05] +0410; [5B 20, 05, 8F] + +0430 0306; [5B 22, 05, 05] +04D1; [5B 22, 05, 05] +0410 0306; [5B 22, 05, 8F] +04D0; [5B 22, 05, 8F] + +0430 0308; [5B 24, 05, 05] +04D3; [5B 24, 05, 05] +0410 0308; [5B 24, 05, 8F] +04D2; [5B 24, 05, 8F] + +04D9; [5B 26, 05, 05] +04D8; [5B 26, 05, 8F] + +04D9 0308; [5B 28, 05, 05] +04DB; [5B 28, 05, 05] +04D8 0308; [5B 28, 05, 8F] +04DA; [5B 28, 05, 8F] + +04D5; [5B 2A, 05, 05] +04D4; [5B 2A, 05, 8F] + +0431; [5B 2C, 05, 05] +0411; [5B 2C, 05, 8F] + +0432; [5B 2E, 05, 05] +0412; [5B 2E, 05, 8F] + +0433; [5B 30, 05, 05] +0413; [5B 30, 05, 8F] +0491; [5B 30, 05, 09][, E0 9D, 09] +0490; [5B 30, 05, 93][, E0 9D, 09] + +0493; [5B 32, 05, 05] +0492; [5B 32, 05, 8F] + +0495; [5B 34, 05, 05] +0494; [5B 34, 05, 8F] + +0434; [5B 36, 05, 05] +0414; [5B 36, 05, 8F] + +0501; [5B 38, 05, 05] +0500; [5B 38, 05, 8F] + +0452; [5B 3A, 05, 05] +0402; [5B 3A, 05, 8F] + +0503; [5B 3C, 05, 05] +0502; [5B 3C, 05, 8F] -2196; [09 C7, 05, 05] +0433 0301; [5B 3E, 05, 05] +0433 0341; [5B 3E, 05, 05] +0453; [5B 3E, 05, 05] +0403; [5B 3E, 05, 8F] +0413 0301; [5B 3E, 05, 8F] +0413 0341; [5B 3E, 05, 8F] -2197; [09 C9, 05, 05] +0499; [5B 40, 05, 05] +0498; [5B 40, 05, 8F] -2198; [09 CB, 05, 05] +0435; [5B 42, 05, 05] +0415; [5B 42, 05, 8F] +0450; [5B 42, 05, 05][, 8F, 05] +0400; [5B 42, 05, 8F][, 8F, 05] +0451; [5B 42, 05, 05][, 9D, 05] +0401; [5B 42, 05, 8F][, 9D, 05] -2199; [09 CD, 05, 05] +0435 0306; [5B 44, 05, 05] +04D7; [5B 44, 05, 05] +0415 0306; [5B 44, 05, 8F] +04D6; [5B 44, 05, 8F] -219C; [09 CF, 05, 05] +0454; [5B 46, 05, 05] +0404; [5B 46, 05, 8F] -219D; [09 D1, 05, 05] +0436; [5B 48, 05, 05] +0416; [5B 48, 05, 8F] +04C2; [5B 48, 05, 05][, 91, 05] +04C1; [5B 48, 05, 8F][, 91, 05] -219E; [09 D3, 05, 05] +0436 0308; [5B 4A, 05, 05] +04DD; [5B 4A, 05, 05] +0416 0308; [5B 4A, 05, 8F] +04DC; [5B 4A, 05, 8F] -219F; [09 D5, 05, 05] +0497; [5B 4C, 05, 05] +0496; [5B 4C, 05, 8F] -21A0; [09 D7, 05, 05] +0437; [5B 4E, 05, 05] +0417; [5B 4E, 05, 8F] -21A1; [09 D9, 05, 05] +0505; [5B 50, 05, 05] +0504; [5B 50, 05, 8F] -21A2; [09 DB, 05, 05] +0437 0308; [5B 52, 05, 05] +04DF; [5B 52, 05, 05] +0417 0308; [5B 52, 05, 8F] +04DE; [5B 52, 05, 8F] -21A3; [09 DD, 05, 05] +0455; [5B 54, 05, 05] +0405; [5B 54, 05, 8F] -21A4; [09 DF, 05, 05] +04E1; [5B 56, 05, 05] +04E0; [5B 56, 05, 8F] -21A5; [09 E1, 05, 05] +0507; [5B 58, 05, 05] +0506; [5B 58, 05, 8F] -21A6; [09 E3, 05, 05] +0438; [5B 5A, 05, 05] +0418; [5B 5A, 05, 8F] +045D; [5B 5A, 05, 05][, 8F, 05] +040D; [5B 5A, 05, 8F][, 8F, 05] +04E3; [5B 5A, 05, 05][, AB, 05] +04E2; [5B 5A, 05, 8F][, AB, 05] -21A7; [09 E5, 05, 05] +048B; [5B 5C, 05, 05] +048A; [5B 5C, 05, 8F] -21A8; [09 E7, 05, 05] +0438 0308; [5B 5E, 05, 05] +04E5; [5B 5E, 05, 05] +0418 0308; [5B 5E, 05, 8F] +04E4; [5B 5E, 05, 8F] -21A9; [09 E9, 05, 05] +0456; [5B 60, 05, 05] +0406; [5B 60, 05, 8F] -21AA; [09 EB, 05, 05] +0456 0308; [5B 62, 05, 05] +0457; [5B 62, 05, 05] +0406 0308; [5B 62, 05, 8F] +0407; [5B 62, 05, 8F] -21AB; [09 ED, 05, 05] +0438 0306; [5B 64, 05, 05] +0439; [5B 64, 05, 05] +0418 0306; [5B 64, 05, 8F] +0419; [5B 64, 05, 8F] -21AC; [09 EF, 05, 05] +0458; [5B 66, 05, 05] +0408; [5B 66, 05, 8F] -21AD; [09 F1, 05, 05] +043A; [5B 68, 05, 05] +041A; [5B 68, 05, 8F] -21AF; [09 F3, 05, 05] +049B; [5B 6A, 05, 05] +049A; [5B 6A, 05, 8F] -21B0; [09 F5, 05, 05] +04C4; [5B 6C, 05, 05] +04C3; [5B 6C, 05, 8F] -21B1; [09 F7, 05, 05] +04A1; [5B 6E, 05, 05] +04A0; [5B 6E, 05, 8F] -21B2; [09 F9, 05, 05] +049F; [5B 70, 05, 05] +049E; [5B 70, 05, 8F] -21B3; [09 FB, 05, 05] +049D; [5B 72, 05, 05] +049C; [5B 72, 05, 8F] -21B4; [09 FD, 05, 05] +043B; [5B 74, 05, 05] +041B; [5B 74, 05, 8F] -21B5; [0A 05, 05, 05] +1D2B; [5B 76, 05, 05] -21B6; [0A 07, 05, 05] +04C6; [5B 78, 05, 05] +04C5; [5B 78, 05, 8F] -21B7; [0A 09, 05, 05] +0459; [5B 7A, 05, 05] +0409; [5B 7A, 05, 8F] -21B8; [0A 0B, 05, 05] +0509; [5B 7C, 05, 05] +0508; [5B 7C, 05, 8F] -21B9; [0A 0D, 05, 05] +043C; [5B 7E, 05, 05] +041C; [5B 7E, 05, 8F] -21BA; [0A 0F, 05, 05] +04CE; [5B 80, 05, 05] +04CD; [5B 80, 05, 8F] -21BB; [0A 11, 05, 05] +043D; [5B 82, 05, 05] +041D; [5B 82, 05, 8F] -21BC; [0A 13, 05, 05] +04CA; [5B 84, 05, 05] +04C9; [5B 84, 05, 8F] -21BD; [0A 15, 05, 05] +04A3; [5B 86, 05, 05] +04A2; [5B 86, 05, 8F] -21BE; [0A 17, 05, 05] +04C8; [5B 88, 05, 05] +04C7; [5B 88, 05, 8F] -21BF; [0A 19, 05, 05] +04A5; [5B 8A, 05, 05] +04A4; [5B 8A, 05, 8F] -21C0; [0A 1B, 05, 05] +045A; [5B 8C, 05, 05] +040A; [5B 8C, 05, 8F] -21C1; [0A 1D, 05, 05] +050B; [5B 8E, 05, 05] +050A; [5B 8E, 05, 8F] -21C2; [0A 1F, 05, 05] +043E; [5B 90, 05, 05] +041E; [5B 90, 05, 8F] -21C3; [0A 21, 05, 05] +043E 0308; [5B 92, 05, 05] +04E7; [5B 92, 05, 05] +041E 0308; [5B 92, 05, 8F] +04E6; [5B 92, 05, 8F] -21C4; [0A 23, 05, 05] +04E9; [5B 94, 05, 05] +04E8; [5B 94, 05, 8F] -21C5; [0A 25, 05, 05] +04E9 0308; [5B 96, 05, 05] +04EB; [5B 96, 05, 05] +04E8 0308; [5B 96, 05, 8F] +04EA; [5B 96, 05, 8F] -21C6; [0A 27, 05, 05] +043F; [5B 98, 05, 05] +041F; [5B 98, 05, 8F] -21C7; [0A 29, 05, 05] +04A7; [5B 9A, 05, 05] +04A6; [5B 9A, 05, 8F] -21C8; [0A 2B, 05, 05] +0481; [5B 9C, 05, 05] +0480; [5B 9C, 05, 8F] -21C9; [0A 2D, 05, 05] +0440; [5B 9E, 05, 05] +0420; [5B 9E, 05, 8F] -21CA; [0A 2F, 05, 05] +048F; [5B A0, 05, 05] +048E; [5B A0, 05, 8F] -21CB; [0A 31, 05, 05] +0441; [5B A2, 05, 05] +0421; [5B A2, 05, 8F] -21CC; [0A 33, 05, 05] +050D; [5B A4, 05, 05] +050C; [5B A4, 05, 8F] -21D0; [0A 35, 05, 05] -21CD; [0A 35, 05, 05][, A5, 05] +04AB; [5B A6, 05, 05] +04AA; [5B A6, 05, 8F] -21D1; [0A 37, 05, 05] +0442; [5B A8, 05, 05] +0422; [5B A8, 05, 8F] -21D2; [0A 39, 05, 05] -21CF; [0A 39, 05, 05][, A5, 05] +050F; [5B AA, 05, 05] +050E; [5B AA, 05, 8F] -21D3; [0A 3B, 05, 05] +04AD; [5B AC, 05, 05] +04AC; [5B AC, 05, 8F] -21D4; [0A 3D, 05, 05] -21CE; [0A 3D, 05, 05][, A5, 05] +045B; [5B AE, 05, 05] +040B; [5B AE, 05, 8F] -21D5; [0A 3F, 05, 05] +043A 0301; [5B B0, 05, 05] +043A 0341; [5B B0, 05, 05] +045C; [5B B0, 05, 05] +040C; [5B B0, 05, 8F] +041A 0301; [5B B0, 05, 8F] +041A 0341; [5B B0, 05, 8F] -21D6; [0A 41, 05, 05] +0443; [5B B2, 05, 05] +0423; [5B B2, 05, 8F] +04EF; [5B B2, 05, 05][, AB, 05] +04EE; [5B B2, 05, 8F][, AB, 05] -21D7; [0A 43, 05, 05] +0443 0306; [5B B4, 05, 05] +045E; [5B B4, 05, 05] +040E; [5B B4, 05, 8F] +0423 0306; [5B B4, 05, 8F] -21D8; [0A 45, 05, 05] +0443 0308; [5B B6, 05, 05] +04F1; [5B B6, 05, 05] +0423 0308; [5B B6, 05, 8F] +04F0; [5B B6, 05, 8F] -21D9; [0A 47, 05, 05] +0443 030B; [5B B8, 05, 05] +04F3; [5B B8, 05, 05] +0423 030B; [5B B8, 05, 8F] +04F2; [5B B8, 05, 8F] -21DA; [0A 49, 05, 05] +04AF; [5B BA, 05, 05] +04AE; [5B BA, 05, 8F] -21DB; [0A 4B, 05, 05] +04B1; [5B BC, 05, 05] +04B0; [5B BC, 05, 8F] -21DC; [0A 4D, 05, 05] +0479; [5B BE, 05, 05] +0478; [5B BE, 05, 8F] -21DD; [0A 4F, 05, 05] +0444; [5B C0, 05, 05] +0424; [5B C0, 05, 8F] -21DE; [0A 51, 05, 05] +0445; [5B C2, 05, 05] +0425; [5B C2, 05, 8F] -21DF; [0A 53, 05, 05] +04B3; [5B C4, 05, 05] +04B2; [5B C4, 05, 8F] -21E0; [0A 55, 05, 05] +04BB; [5B C6, 05, 05] +04BA; [5B C6, 05, 8F] -21E1; [0A 57, 05, 05] +0461; [5B C8, 05, 05] +0460; [5B C8, 05, 8F] -21E2; [0A 59, 05, 05] +047F; [5B CA, 05, 05] +047E; [5B CA, 05, 8F] -21E3; [0A 5B, 05, 05] +047D; [5B CC, 05, 05] +047C; [5B CC, 05, 8F] -21E4; [0A 5D, 05, 05] +047B; [5B CE, 05, 05] +047A; [5B CE, 05, 8F] -21E5; [0A 5F, 05, 05] +0446; [5B D0, 05, 05] +0426; [5B D0, 05, 8F] -21E6; [0A 61, 05, 05] +04B5; [5B D2, 05, 05] +04B4; [5B D2, 05, 8F] -21E7; [0A 63, 05, 05] +0447; [5B D4, 05, 05] +0427; [5B D4, 05, 8F] -21E8; [0A 65, 05, 05] +0447 0308; [5B D6, 05, 05] +04F5; [5B D6, 05, 05] +0427 0308; [5B D6, 05, 8F] +04F4; [5B D6, 05, 8F] -21E9; [0A 67, 05, 05] +04B7; [5B D8, 05, 05] +04B6; [5B D8, 05, 8F] -21EA; [0A 69, 05, 05] +04CC; [5B DA, 05, 05] +04CB; [5B DA, 05, 8F] -21EB; [0A 6B, 05, 05] +04B9; [5B DC, 05, 05] +04B8; [5B DC, 05, 8F] -21EC; [0A 6D, 05, 05] +04BD; [5B DE, 05, 05] +04BC; [5B DE, 05, 8F] -21ED; [0A 6F, 05, 05] +04BF; [5B E0, 05, 05] +04BE; [5B E0, 05, 8F] -21EE; [0A 71, 05, 05] +045F; [5B E2, 05, 05] +040F; [5B E2, 05, 8F] -21EF; [0A 73, 05, 05] +0448; [5B E4, 05, 05] +0428; [5B E4, 05, 8F] -21F0; [0A 75, 05, 05] +0449; [5B E6, 05, 05] +0429; [5B E6, 05, 8F] -21F1; [0A 77, 05, 05] +044A; [5B E8, 05, 05] +042A; [5B E8, 05, 8F] -21F2; [0A 79, 05, 05] +044B; [5B EA, 05, 05] +042B; [5B EA, 05, 8F] -21F3; [0A 7B, 05, 05] +044B 0308; [5B EC, 05, 05] +04F9; [5B EC, 05, 05] +042B 0308; [5B EC, 05, 8F] +04F8; [5B EC, 05, 8F] -2200; [0A 7D, 05, 05] +044C; [5B EE, 05, 05] +042C; [5B EE, 05, 8F] -2201; [0A 7F, 05, 05] +048D; [5B F0, 05, 05] +048C; [5B F0, 05, 8F] -2202; [0A 81, 05, 05] -D835 DEDB; [0A 81, 05, 0B] -D835 DF15; [0A 81, 05, 0B] -D835 DF4F; [0A 81, 05, 0B] -D835 DF89; [0A 81, 05, 0B] -D835 DFC3; [0A 81, 05, 0B] +0463; [5B F2, 05, 05] +0462; [5B F2, 05, 8F] -2203; [0A 83, 05, 05] -2204; [0A 83, 05, 05][, A5, 05] +044D; [5B F4, 05, 05] +042D; [5B F4, 05, 8F] -2205; [0A 85, 05, 05] +044D 0308; [5B F6, 05, 05] +04ED; [5B F6, 05, 05] +042D 0308; [5B F6, 05, 8F] +04EC; [5B F6, 05, 8F] -2206; [0A 87, 05, 05] +044E; [5B F8, 05, 05] +042E; [5B F8, 05, 8F] -2207; [0A 89, 05, 05] -D835 DEC1; [0A 89, 05, 0B] -D835 DEFB; [0A 89, 05, 0B] -D835 DF35; [0A 89, 05, 0B] -D835 DF6F; [0A 89, 05, 0B] -D835 DFA9; [0A 89, 05, 0B] +044F; [5B FA, 05, 05] +042F; [5B FA, 05, 8F] -2208; [0A 8B, 05, 05] -2209; [0A 8B, 05, 05][, A5, 05] +0465; [5B FC, 05, 05] +0464; [5B FC, 05, 8F] -220A; [0A 8D, 05, 05] +0467; [5B FE, 05, 05] +0466; [5B FE, 05, 8F] -220B; [0A 8F, 05, 05] -220C; [0A 8F, 05, 05][, A5, 05] +046B; [5C 05, 05, 05] +046A; [5C 05, 05, 8F] -220D; [0A 91, 05, 05] +0469; [5C 07, 05, 05] +0468; [5C 07, 05, 8F] -220E; [0A 93, 05, 05] +046D; [5C 09, 05, 05] +046C; [5C 09, 05, 8F] -220F; [0A 95, 05, 05] +046F; [5C 0B, 05, 05] +046E; [5C 0B, 05, 8F] -2210; [0A 97, 05, 05] +0471; [5C 0D, 05, 05] +0470; [5C 0D, 05, 8F] -2211; [0A 99, 05, 05] +0473; [5C 0F, 05, 05] +0472; [5C 0F, 05, 8F] -002B; [0A 9B, 05, 05] -FF0B; [0A 9B, 05, 07] -FB29; [0A 9B, 05, 0B] -FE62; [0A 9B, 05, 1D] -207A; [0A 9B, 05, 27] -208A; [0A 9B, 05, 29] +0475; [5C 11, 05, 05] +0474; [5C 11, 05, 8F] -00B1; [0A 9D, 05, 05] +0475 030F; [5C 13, 05, 05] +0477; [5C 13, 05, 05] +0474 030F; [5C 13, 05, 8F] +0476; [5C 13, 05, 8F] -00F7; [0A 9F, 05, 05] +04A9; [5C 15, 05, 05] +04A8; [5C 15, 05, 8F] -00D7; [0A A1, 05, 05] +04C0; [5C 17, 05, 8F] -003C; [0A A3, 05, 05] -FF1C; [0A A3, 05, 07] -FE64; [0A A3, 05, 1D] -226E; [0A A3, 05, 05][, A5, 05] +10D0; [5D 20, 05, 05] +10A0; [5D 20, 05, 8F] -003D; [0A A5, 05, 05] -FF1D; [0A A5, 05, 07] -FE66; [0A A5, 05, 1D] -207C; [0A A5, 05, 27] -208C; [0A A5, 05, 29] -2260; [0A A5, 05, 05][, A5, 05] +10D1; [5D 22, 05, 05] +10A1; [5D 22, 05, 8F] -003E; [0A A7, 05, 05] -FF1E; [0A A7, 05, 07] -FE65; [0A A7, 05, 1D] -226F; [0A A7, 05, 05][, A5, 05] +10D2; [5D 24, 05, 05] +10A2; [5D 24, 05, 8F] -00AC; [0A A9, 05, 05] -FFE2; [0A A9, 05, 07] +10D3; [5D 26, 05, 05] +10A3; [5D 26, 05, 8F] -007C; [0A AB, 05, 05] -FF5C; [0A AB, 05, 07] +10D4; [5D 28, 05, 05] +10A4; [5D 28, 05, 8F] -00A6; [0A AD, 05, 05] -FFE4; [0A AD, 05, 07] +10D5; [5D 2A, 05, 05] +10A5; [5D 2A, 05, 8F] -2016; [0A AF, 05, 05] +10D6; [5D 2C, 05, 05] +10A6; [5D 2C, 05, 8F] -007E; [0A B1, 05, 05] -FF5E; [0A B1, 05, 07] +10F1; [5D 2E, 05, 05] +10C1; [5D 2E, 05, 8F] -2212; [0A B3, 05, 05] -207B; [0A B3, 05, 27] -208B; [0A B3, 05, 29] +10D7; [5D 30, 05, 05] +10A7; [5D 30, 05, 8F] -2213; [0A B5, 05, 05] +10D8; [5D 32, 05, 05] +10A8; [5D 32, 05, 8F] -2214; [0A B7, 05, 05] +10D9; [5D 34, 05, 05] +10A9; [5D 34, 05, 8F] -2215; [0A B9, 05, 05] +10DA; [5D 36, 05, 05] +10AA; [5D 36, 05, 8F] -2216; [0A BB, 05, 05] +10DB; [5D 38, 05, 05] +10AB; [5D 38, 05, 8F] -2217; [0A BD, 05, 05] +10DC; [5D 3A, 05, 05] +10AC; [5D 3A, 05, 8F] -2218; [0A BF, 05, 05] +10F2; [5D 3C, 05, 05] +10C2; [5D 3C, 05, 8F] -2219; [0A C1, 05, 05] +10DD; [5D 3E, 05, 05] +10AD; [5D 3E, 05, 8F] -221A; [0A C3, 05, 05] +10DE; [5D 40, 05, 05] +10AE; [5D 40, 05, 8F] -221B; [0A C5, 05, 05] +10DF; [5D 42, 05, 05] +10AF; [5D 42, 05, 8F] -221C; [0A C7, 05, 05] +10E0; [5D 44, 05, 05] +10B0; [5D 44, 05, 8F] -221D; [0A C9, 05, 05] +10E1; [5D 46, 05, 05] +10B1; [5D 46, 05, 8F] -221E; [0A CB, 05, 05] +10E2; [5D 48, 05, 05] +10B2; [5D 48, 05, 8F] -221F; [0A CD, 05, 05] +10F3; [5D 4A, 05, 05] +10C3; [5D 4A, 05, 8F] -2220; [0A CF, 05, 05] +10E3; [5D 4C, 05, 05] +10B3; [5D 4C, 05, 8F] -2221; [0A D1, 05, 05] +10E4; [5D 4E, 05, 05] +10B4; [5D 4E, 05, 8F] -2222; [0A D3, 05, 05] +10E5; [5D 50, 05, 05] +10B5; [5D 50, 05, 8F] -2223; [0A D5, 05, 05] -2224; [0A D5, 05, 05][, A5, 05] +10E6; [5D 52, 05, 05] +10B6; [5D 52, 05, 8F] -2225; [0A D7, 05, 05] -2226; [0A D7, 05, 05][, A5, 05] +10E7; [5D 54, 05, 05] +10B7; [5D 54, 05, 8F] -2227; [0A D9, 05, 05] +10E8; [5D 56, 05, 05] +10B8; [5D 56, 05, 8F] -2228; [0A DB, 05, 05] +10E9; [5D 58, 05, 05] +10B9; [5D 58, 05, 8F] -2229; [0A DD, 05, 05] +10EA; [5D 5A, 05, 05] +10BA; [5D 5A, 05, 8F] -222A; [0A DF, 05, 05] +10EB; [5D 5C, 05, 05] +10BB; [5D 5C, 05, 8F] -222B; [0A E1, 05, 05] -222C; [0A E1, 05, 09][0A E1, 05, 09] -222D; [0A E1, 05, 09][0A E1, 05, 09][0A E1, 05, 3D] +10EC; [5D 5E, 05, 05] +10BC; [5D 5E, 05, 8F] -222E; [0A E3, 05, 05] -222F; [0A E3, 05, 09][0A E3, 05, 09] -2230; [0A E3, 05, 09][0A E3, 05, 09][0A E3, 05, 3D] +10ED; [5D 60, 05, 05] +10BD; [5D 60, 05, 8F] -2231; [0A E5, 05, 05] +10EE; [5D 62, 05, 05] +10BE; [5D 62, 05, 8F] -2232; [0A E7, 05, 05] +10F4; [5D 64, 05, 05] +10C4; [5D 64, 05, 8F] -2233; [0A E9, 05, 05] +10EF; [5D 66, 05, 05] +10BF; [5D 66, 05, 8F] -2234; [0A EB, 05, 05] +10F0; [5D 68, 05, 05] +10C0; [5D 68, 05, 8F] -2235; [0A ED, 05, 05] +10F5; [5D 6A, 05, 05] +10C5; [5D 6A, 05, 8F] -2236; [0A EF, 05, 05] +10F6; [5D 6C, 05, 05] -2237; [0A F1, 05, 05] +10F7; [5D 6E, 05, 05] -2238; [0A F3, 05, 05] +10F8; [5D 70, 05, 05] -2239; [0A F5, 05, 05] +0561; [5E 20, 05, 05] +0531; [5E 20, 05, 8F] -223A; [0A F7, 05, 05] +0562; [5E 22, 05, 05] +0532; [5E 22, 05, 8F] -223B; [0A F9, 05, 05] +0563; [5E 24, 05, 05] +0533; [5E 24, 05, 8F] -223C; [0A FB, 05, 05] -2241; [0A FB, 05, 05][, A5, 05] +0564; [5E 26, 05, 05] +0534; [5E 26, 05, 8F] -223D; [0A FD, 05, 05] +0565; [5E 28, 05, 05] +0535; [5E 28, 05, 8F] +0587; [5E 28, 05, 09][5E 62, 05, 09] -223E; [0B 05, 05, 05] +0566; [5E 2A, 05, 05] +0536; [5E 2A, 05, 8F] -223F; [0B 07, 05, 05] +0567; [5E 2C, 05, 05] +0537; [5E 2C, 05, 8F] -2240; [0B 09, 05, 05] +0568; [5E 2E, 05, 05] +0538; [5E 2E, 05, 8F] -2242; [0B 0B, 05, 05] +0569; [5E 30, 05, 05] +0539; [5E 30, 05, 8F] -2243; [0B 0D, 05, 05] -2244; [0B 0D, 05, 05][, A5, 05] +056A; [5E 32, 05, 05] +053A; [5E 32, 05, 8F] -2245; [0B 0F, 05, 05] -2247; [0B 0F, 05, 05][, A5, 05] +056B; [5E 34, 05, 05] +053B; [5E 34, 05, 8F] -2246; [0B 11, 05, 05] +056C; [5E 36, 05, 05] +053C; [5E 36, 05, 8F] -2248; [0B 13, 05, 05] -2249; [0B 13, 05, 05][, A5, 05] +056D; [5E 38, 05, 05] +053D; [5E 38, 05, 8F] -224A; [0B 15, 05, 05] +056E; [5E 3A, 05, 05] +053E; [5E 3A, 05, 8F] -224B; [0B 17, 05, 05] +056F; [5E 3C, 05, 05] +053F; [5E 3C, 05, 8F] -224C; [0B 19, 05, 05] +0570; [5E 3E, 05, 05] +0540; [5E 3E, 05, 8F] -224D; [0B 1B, 05, 05] -226D; [0B 1B, 05, 05][, A5, 05] +0571; [5E 40, 05, 05] +0541; [5E 40, 05, 8F] -224E; [0B 1D, 05, 05] +0572; [5E 42, 05, 05] +0542; [5E 42, 05, 8F] -224F; [0B 1F, 05, 05] +0573; [5E 44, 05, 05] +0543; [5E 44, 05, 8F] -2250; [0B 21, 05, 05] +0574; [5E 46, 05, 05] +0544; [5E 46, 05, 8F] +FB14; [5E 46, 05, 09][5E 28, 05, 09] +FB15; [5E 46, 05, 09][5E 34, 05, 09] +FB17; [5E 46, 05, 09][5E 38, 05, 09] +FB13; [5E 46, 05, 09][5E 4A, 05, 09] -2251; [0B 23, 05, 05] +0575; [5E 48, 05, 05] +0545; [5E 48, 05, 8F] -2252; [0B 25, 05, 05] +0576; [5E 4A, 05, 05] +0546; [5E 4A, 05, 8F] -2253; [0B 27, 05, 05] +0577; [5E 4C, 05, 05] +0547; [5E 4C, 05, 8F] -2254; [0B 29, 05, 05] +0578; [5E 4E, 05, 05] +0548; [5E 4E, 05, 8F] -2255; [0B 2B, 05, 05] +0579; [5E 50, 05, 05] +0549; [5E 50, 05, 8F] -2256; [0B 2D, 05, 05] +057A; [5E 52, 05, 05] +054A; [5E 52, 05, 8F] -2257; [0B 2F, 05, 05] +057B; [5E 54, 05, 05] +054B; [5E 54, 05, 8F] -2258; [0B 31, 05, 05] +057C; [5E 56, 05, 05] +054C; [5E 56, 05, 8F] -2259; [0B 33, 05, 05] +057D; [5E 58, 05, 05] +054D; [5E 58, 05, 8F] -225A; [0B 35, 05, 05] +057E; [5E 5A, 05, 05] +054E; [5E 5A, 05, 8F] +FB16; [5E 5A, 05, 09][5E 4A, 05, 09] -225B; [0B 37, 05, 05] +057F; [5E 5C, 05, 05] +054F; [5E 5C, 05, 8F] -225C; [0B 39, 05, 05] +0580; [5E 5E, 05, 05] +0550; [5E 5E, 05, 8F] -225D; [0B 3B, 05, 05] +0581; [5E 60, 05, 05] +0551; [5E 60, 05, 8F] -225E; [0B 3D, 05, 05] +0582; [5E 62, 05, 05] +0552; [5E 62, 05, 8F] -225F; [0B 3F, 05, 05] +0583; [5E 64, 05, 05] +0553; [5E 64, 05, 8F] -2261; [0B 41, 05, 05] -2262; [0B 41, 05, 05][, A5, 05] +0584; [5E 66, 05, 05] +0554; [5E 66, 05, 8F] -2263; [0B 43, 05, 05] +0585; [5E 68, 05, 05] +0555; [5E 68, 05, 8F] -2264; [0B 45, 05, 05] -2270; [0B 45, 05, 05][, A5, 05] +0586; [5E 6A, 05, 05] +0556; [5E 6A, 05, 8F] -2265; [0B 47, 05, 05] -2271; [0B 47, 05, 05][, A5, 05] +0559; [5E 6C, 05, 05] -2266; [0B 49, 05, 05] +05D0; [5F 20, 05, 05] +2135; [5F 20, 05, 09] +FB21; [5F 20, 05, 0B] +FB2E; [5F 20, 05, 05][, D4 1D, 05] +FB2F; [5F 20, 05, 05][, D4 2D, 05] +FB30; [5F 20, 05, 05][, D4 7D, 05] +FB4F; [5F 20, 05, 09][5F 36, 05, 09] -2267; [0B 4B, 05, 05] +05D1; [5F 22, 05, 05] +2136; [5F 22, 05, 09] +FB31; [5F 22, 05, 05][, D4 7D, 05] +FB4C; [5F 22, 05, 05][, D4 8D, 05] -2268; [0B 4D, 05, 05] +05D2; [5F 24, 05, 05] +2137; [5F 24, 05, 09] +FB32; [5F 24, 05, 05][, D4 7D, 05] -2269; [0B 4F, 05, 05] +05D3; [5F 26, 05, 05] +2138; [5F 26, 05, 09] +FB22; [5F 26, 05, 0B] +FB33; [5F 26, 05, 05][, D4 7D, 05] -226A; [0B 51, 05, 05] +05D4; [5F 28, 05, 05] +FB23; [5F 28, 05, 0B] +FB34; [5F 28, 05, 05][, D4 7D, 05] -226B; [0B 53, 05, 05] +05D5; [5F 2A, 05, 05] +FB4B; [5F 2A, 05, 05][, D4 3D, 05] +FB35; [5F 2A, 05, 05][, D4 7D, 05] +05F0; [5F 2A, 05, 09][5F 2A, 05, 09] +05F1; [5F 2A, 05, 09][5F 32, 05, 09] -226C; [0B 55, 05, 05] +05D6; [5F 2C, 05, 05] +FB36; [5F 2C, 05, 05][, D4 7D, 05] -2272; [0B 57, 05, 05] -2274; [0B 57, 05, 05][, A5, 05] +05D7; [5F 2E, 05, 05] -2273; [0B 59, 05, 05] -2275; [0B 59, 05, 05][, A5, 05] +05D8; [5F 30, 05, 05] +FB38; [5F 30, 05, 05][, D4 7D, 05] -2276; [0B 5B, 05, 05] -2278; [0B 5B, 05, 05][, A5, 05] +05D9; [5F 32, 05, 05] +FB1D; [5F 32, 05, 05][, D3 E9, 05] +FB39; [5F 32, 05, 05][, D4 7D, 05] +05F2; [5F 32, 05, 09][5F 32, 05, 09] +FB1F; [5F 32, 05, 09][5F 32, 05, 09][, D4 1D, 05] + +05DB; [5F 34, 05, 05] +FB24; [5F 34, 05, 0B] +05DA; [5F 34, 05, 31] +FB3B; [5F 34, 05, 05][, D4 7D, 05] +FB3A; [5F 34, 05, 31][, D4 7D, 05] +FB4D; [5F 34, 05, 05][, D4 8D, 05] + +05DC; [5F 36, 05, 05] +FB25; [5F 36, 05, 0B] +FB3C; [5F 36, 05, 05][, D4 7D, 05] + +05DE; [5F 38, 05, 05] +FB26; [5F 38, 05, 0B] +05DD; [5F 38, 05, 31] +FB3E; [5F 38, 05, 05][, D4 7D, 05] + +05E0; [5F 3A, 05, 05] +05DF; [5F 3A, 05, 31] +FB40; [5F 3A, 05, 05][, D4 7D, 05] + +05E1; [5F 3C, 05, 05] +FB41; [5F 3C, 05, 05][, D4 7D, 05] + +05E2; [5F 3E, 05, 05] +FB20; [5F 3E, 05, 0B] + +05E4; [5F 40, 05, 05] +05E3; [5F 40, 05, 31] +FB44; [5F 40, 05, 05][, D4 7D, 05] +FB43; [5F 40, 05, 31][, D4 7D, 05] +FB4E; [5F 40, 05, 05][, D4 8D, 05] + +05E6; [5F 42, 05, 05] +05E5; [5F 42, 05, 31] +FB46; [5F 42, 05, 05][, D4 7D, 05] + +05E7; [5F 44, 05, 05] +FB47; [5F 44, 05, 05][, D4 7D, 05] + +05E8; [5F 46, 05, 05] +FB27; [5F 46, 05, 0B] +FB48; [5F 46, 05, 05][, D4 7D, 05] + +05E9; [5F 48, 05, 05] +FB2B; [5F 48, 05, 05][, D4 5D, 05] +FB2A; [5F 48, 05, 05][, D4 6D, 05] +FB49; [5F 48, 05, 05][, D4 7D, 05] +FB2D; [5F 48, 05, 05][, D4 7D, 05][, D4 5D, 05] +FB2C; [5F 48, 05, 05][, D4 7D, 05][, D4 6D, 05] + +05EA; [5F 4A, 05, 05] +FB28; [5F 4A, 05, 0B] +FB4A; [5F 4A, 05, 05][, D4 7D, 05] + +0621; [60 20, 05, 05] +0674; [60 20, 05, 09] +FE80; [60 20, 05, 33] +06FD; [60 20, 05, 09][, E0 9D, 09] + +0622; [60 22, 05, 05] +0627 0653; [60 22, 05, 05] +FE82; [60 22, 05, 31] +FE81; [60 22, 05, 33] + +0623; [60 24, 05, 05] +0627 0654; [60 24, 05, 05] +FE84; [60 24, 05, 31] +FE83; [60 24, 05, 33] + +0672; [60 26, 05, 05] + +0671; [60 28, 05, 05] +FB51; [60 28, 05, 31] +FB50; [60 28, 05, 33] + +0624; [60 2A, 05, 05] +0648 0654; [60 2A, 05, 05] +FE86; [60 2A, 05, 31] +FE85; [60 2A, 05, 33] + +0625; [60 2C, 05, 05] +0627 0655; [60 2C, 05, 05] +FE88; [60 2C, 05, 31] +FE87; [60 2C, 05, 33] + +0673; [60 2E, 05, 05] + +0626; [60 30, 05, 05] +064A 0654; [60 30, 05, 05] +FE8B; [60 30, 05, 2D] +FE8C; [60 30, 05, 2F] +FE8A; [60 30, 05, 31] +FE89; [60 30, 05, 33] +FBEB; [60 30, 05, 31][60 32, 05, 31] +FBEA; [60 30, 05, 33][60 32, 05, 33] +FC97; [60 30, 05, 2D][60 4E, 05, 2D] +FC00; [60 30, 05, 33][60 4E, 05, 33] +FC98; [60 30, 05, 2D][60 5A, 05, 2D] +FC01; [60 30, 05, 33][60 5A, 05, 33] +FC99; [60 30, 05, 2D][60 5C, 05, 2D] +FC64; [60 30, 05, 31][60 7C, 05, 31] +FC65; [60 30, 05, 31][60 7E, 05, 31] +FC9A; [60 30, 05, 2D][60 F2, 05, 2D] +FCDF; [60 30, 05, 2F][60 F2, 05, 2F] +FC66; [60 30, 05, 31][60 F2, 05, 31] +FC02; [60 30, 05, 33][60 F2, 05, 33] +FC67; [60 30, 05, 31][60 F4, 05, 31] +FC9B; [60 30, 05, 2D][61 05, 05, 2D] +FCE0; [60 30, 05, 2F][61 05, 05, 2F] +FBED; [60 30, 05, 31][61 0F, 05, 31] +FBEC; [60 30, 05, 33][61 0F, 05, 33] +FBEF; [60 30, 05, 31][61 11, 05, 31] +FBEE; [60 30, 05, 33][61 11, 05, 33] +FBF3; [60 30, 05, 31][61 17, 05, 31] +FBF2; [60 30, 05, 33][61 17, 05, 33] +FBF1; [60 30, 05, 31][61 19, 05, 31] +FBF0; [60 30, 05, 33][61 19, 05, 33] +FBF5; [60 30, 05, 31][61 1B, 05, 31] +FBF4; [60 30, 05, 33][61 1B, 05, 33] +FBFB; [60 30, 05, 2D][61 25, 05, 2D] +FBFA; [60 30, 05, 31][61 25, 05, 31] +FC68; [60 30, 05, 31][61 25, 05, 31] +FBF9; [60 30, 05, 33][61 25, 05, 33] +FC03; [60 30, 05, 33][61 25, 05, 33] +FC69; [60 30, 05, 31][61 27, 05, 31] +FC04; [60 30, 05, 33][61 27, 05, 33] +FBF8; [60 30, 05, 2D][61 2F, 05, 2D] +FBF7; [60 30, 05, 31][61 2F, 05, 31] +FBF6; [60 30, 05, 33][61 2F, 05, 33] + +0627; [60 32, 05, 05] +FE8E; [60 32, 05, 31] +FE8D; [60 32, 05, 33] +FD3C; [60 32, 05, 31][, D4 AD, 31] +FD3D; [60 32, 05, 33][, D4 AD, 33] +0675; [60 32, 05, 09][60 20, 05, 09] +FDF3; [60 32, 05, 33][60 CE, 05, 33][60 36, 05, 3D][60 7C, 05, 3D] +FDF2; [60 32, 05, 33][60 E8, 05, 33][60 E8, 05, 3D][61 05, 05, 3D] + +066E; [60 34, 05, 05] + +0628; [60 36, 05, 05] +FE91; [60 36, 05, 2D] +FE92; [60 36, 05, 2F] +FE90; [60 36, 05, 31] +FE8F; [60 36, 05, 33] +FC9C; [60 36, 05, 2D][60 4E, 05, 2D] +FC05; [60 36, 05, 33][60 4E, 05, 33] +FC9D; [60 36, 05, 2D][60 5A, 05, 2D] +FC06; [60 36, 05, 33][60 5A, 05, 33] +FDC2; [60 36, 05, 31][60 5A, 05, 31][61 27, 05, 3D] +FC9E; [60 36, 05, 2D][60 5C, 05, 2D] +FC07; [60 36, 05, 33][60 5C, 05, 33] +FD9E; [60 36, 05, 31][60 5C, 05, 31][61 27, 05, 3D] +FC6A; [60 36, 05, 31][60 7C, 05, 31] +FC6B; [60 36, 05, 31][60 7E, 05, 31] +FC9F; [60 36, 05, 2D][60 F2, 05, 2D] +FCE1; [60 36, 05, 2F][60 F2, 05, 2F] +FC6C; [60 36, 05, 31][60 F2, 05, 31] +FC08; [60 36, 05, 33][60 F2, 05, 33] +FC6D; [60 36, 05, 31][60 F4, 05, 31] +FCA0; [60 36, 05, 2D][61 05, 05, 2D] +FCE2; [60 36, 05, 2F][61 05, 05, 2F] +FC6E; [60 36, 05, 31][61 25, 05, 31] +FC09; [60 36, 05, 33][61 25, 05, 33] +FC6F; [60 36, 05, 31][61 27, 05, 31] +FC0A; [60 36, 05, 33][61 27, 05, 33] + +067B; [60 38, 05, 05] +FB54; [60 38, 05, 2D] +FB55; [60 38, 05, 2F] +FB53; [60 38, 05, 31] +FB52; [60 38, 05, 33] + +067E; [60 3A, 05, 05] +FB58; [60 3A, 05, 2D] +FB59; [60 3A, 05, 2F] +FB57; [60 3A, 05, 31] +FB56; [60 3A, 05, 33] + +0680; [60 3C, 05, 05] +FB5C; [60 3C, 05, 2D] +FB5D; [60 3C, 05, 2F] +FB5B; [60 3C, 05, 31] +FB5A; [60 3C, 05, 33] + +0629; [60 3E, 05, 05] +FE94; [60 3E, 05, 31] +FE93; [60 3E, 05, 33] + +062A; [60 40, 05, 05] +FE97; [60 40, 05, 2D] +FE98; [60 40, 05, 2F] +FE96; [60 40, 05, 31] +FE95; [60 40, 05, 33] +FCA1; [60 40, 05, 2D][60 4E, 05, 2D] +FC0B; [60 40, 05, 33][60 4E, 05, 33] +FD50; [60 40, 05, 2D][60 4E, 05, 2D][60 F2, 05, 3D] +FDA0; [60 40, 05, 31][60 4E, 05, 31][61 25, 05, 3D] +FD9F; [60 40, 05, 31][60 4E, 05, 31][61 27, 05, 3D] +FCA2; [60 40, 05, 2D][60 5A, 05, 2D] +FC0C; [60 40, 05, 33][60 5A, 05, 33] +FD52; [60 40, 05, 2D][60 5A, 05, 2D][60 4E, 05, 3D] +FD51; [60 40, 05, 31][60 5A, 05, 31][60 4E, 05, 3D] +FD53; [60 40, 05, 2D][60 5A, 05, 2D][60 F2, 05, 3D] +FCA3; [60 40, 05, 2D][60 5C, 05, 2D] +FC0D; [60 40, 05, 33][60 5C, 05, 33] +FD54; [60 40, 05, 2D][60 5C, 05, 2D][60 F2, 05, 3D] +FDA2; [60 40, 05, 31][60 5C, 05, 31][61 25, 05, 3D] +FDA1; [60 40, 05, 31][60 5C, 05, 31][61 27, 05, 3D] +FC70; [60 40, 05, 31][60 7C, 05, 31] +FC71; [60 40, 05, 31][60 7E, 05, 31] +FCA4; [60 40, 05, 2D][60 F2, 05, 2D] +FCE3; [60 40, 05, 2F][60 F2, 05, 2F] +FC72; [60 40, 05, 31][60 F2, 05, 31] +FC0E; [60 40, 05, 33][60 F2, 05, 33] +FD55; [60 40, 05, 2D][60 F2, 05, 2D][60 4E, 05, 3D] +FD56; [60 40, 05, 2D][60 F2, 05, 2D][60 5A, 05, 3D] +FD57; [60 40, 05, 2D][60 F2, 05, 2D][60 5C, 05, 3D] +FDA4; [60 40, 05, 31][60 F2, 05, 31][61 25, 05, 3D] +FDA3; [60 40, 05, 31][60 F2, 05, 31][61 27, 05, 3D] +FC73; [60 40, 05, 31][60 F4, 05, 31] +FCA5; [60 40, 05, 2D][61 05, 05, 2D] +FCE4; [60 40, 05, 2F][61 05, 05, 2F] +FC74; [60 40, 05, 31][61 25, 05, 31] +FC0F; [60 40, 05, 33][61 25, 05, 33] +FC75; [60 40, 05, 31][61 27, 05, 31] +FC10; [60 40, 05, 33][61 27, 05, 33] + +062B; [60 42, 05, 05] +FE9B; [60 42, 05, 2D] +FE9C; [60 42, 05, 2F] +FE9A; [60 42, 05, 31] +FE99; [60 42, 05, 33] +FC11; [60 42, 05, 33][60 4E, 05, 33] +FC76; [60 42, 05, 31][60 7C, 05, 31] +FC77; [60 42, 05, 31][60 7E, 05, 31] +FCA6; [60 42, 05, 2D][60 F2, 05, 2D] +FCE5; [60 42, 05, 2F][60 F2, 05, 2F] +FC78; [60 42, 05, 31][60 F2, 05, 31] +FC12; [60 42, 05, 33][60 F2, 05, 33] +FC79; [60 42, 05, 31][60 F4, 05, 31] +FCE6; [60 42, 05, 2F][61 05, 05, 2F] +FC7A; [60 42, 05, 31][61 25, 05, 31] +FC13; [60 42, 05, 33][61 25, 05, 33] +FC7B; [60 42, 05, 31][61 27, 05, 31] +FC14; [60 42, 05, 33][61 27, 05, 33] + +0679; [60 44, 05, 05] +FB68; [60 44, 05, 2D] +FB69; [60 44, 05, 2F] +FB67; [60 44, 05, 31] +FB66; [60 44, 05, 33] + +067A; [60 46, 05, 05] +FB60; [60 46, 05, 2D] +FB61; [60 46, 05, 2F] +FB5F; [60 46, 05, 31] +FB5E; [60 46, 05, 33] + +067C; [60 48, 05, 05] + +067D; [60 4A, 05, 05] + +067F; [60 4C, 05, 05] +FB64; [60 4C, 05, 2D] +FB65; [60 4C, 05, 2F] +FB63; [60 4C, 05, 31] +FB62; [60 4C, 05, 33] + +062C; [60 4E, 05, 05] +FE9F; [60 4E, 05, 2D] +FEA0; [60 4E, 05, 2F] +FE9E; [60 4E, 05, 31] +FE9D; [60 4E, 05, 33] +FCA7; [60 4E, 05, 2D][60 5A, 05, 2D] +FC15; [60 4E, 05, 33][60 5A, 05, 33] +FDA6; [60 4E, 05, 31][60 5A, 05, 31][61 25, 05, 3D] +FDBE; [60 4E, 05, 31][60 5A, 05, 31][61 27, 05, 3D] +FDFB; [60 4E, 05, 33][60 E8, 05, 33][06, 05, 3D][60 4E, 05, 3D][60 E8, 05, 3D][60 32, 05, 3D][60 E8, 05, 3D][61 05, 05, 3D] +FCA8; [60 4E, 05, 2D][60 F2, 05, 2D] +FC16; [60 4E, 05, 33][60 F2, 05, 33] +FD59; [60 4E, 05, 2D][60 F2, 05, 2D][60 5A, 05, 3D] +FD58; [60 4E, 05, 31][60 F2, 05, 31][60 5A, 05, 3D] +FDA7; [60 4E, 05, 31][60 F2, 05, 31][61 25, 05, 3D] +FDA5; [60 4E, 05, 31][60 F2, 05, 31][61 27, 05, 3D] +FD1D; [60 4E, 05, 31][61 25, 05, 31] +FD01; [60 4E, 05, 33][61 25, 05, 33] +FD1E; [60 4E, 05, 31][61 27, 05, 31] +FD02; [60 4E, 05, 33][61 27, 05, 33] + +0683; [60 50, 05, 05] +FB78; [60 50, 05, 2D] +FB79; [60 50, 05, 2F] +FB77; [60 50, 05, 31] +FB76; [60 50, 05, 33] + +0684; [60 52, 05, 05] +FB74; [60 52, 05, 2D] +FB75; [60 52, 05, 2F] +FB73; [60 52, 05, 31] +FB72; [60 52, 05, 33] + +0686; [60 54, 05, 05] +FB7C; [60 54, 05, 2D] +FB7D; [60 54, 05, 2F] +FB7B; [60 54, 05, 31] +FB7A; [60 54, 05, 33] + +06BF; [60 56, 05, 05] + +0687; [60 58, 05, 05] +FB80; [60 58, 05, 2D] +FB81; [60 58, 05, 2F] +FB7F; [60 58, 05, 31] +FB7E; [60 58, 05, 33] + +062D; [60 5A, 05, 05] +FEA3; [60 5A, 05, 2D] +FEA4; [60 5A, 05, 2F] +FEA2; [60 5A, 05, 31] +FEA1; [60 5A, 05, 33] +FCA9; [60 5A, 05, 2D][60 4E, 05, 2D] +FC17; [60 5A, 05, 33][60 4E, 05, 33] +FDBF; [60 5A, 05, 31][60 4E, 05, 31][61 27, 05, 3D] +FCAA; [60 5A, 05, 2D][60 F2, 05, 2D] +FC18; [60 5A, 05, 33][60 F2, 05, 33] +FD5B; [60 5A, 05, 31][60 F2, 05, 31][61 25, 05, 3D] +FD5A; [60 5A, 05, 31][60 F2, 05, 31][61 27, 05, 3D] +FD1B; [60 5A, 05, 31][61 25, 05, 31] +FCFF; [60 5A, 05, 33][61 25, 05, 33] +FD1C; [60 5A, 05, 31][61 27, 05, 31] +FD00; [60 5A, 05, 33][61 27, 05, 33] + +062E; [60 5C, 05, 05] +FEA7; [60 5C, 05, 2D] +FEA8; [60 5C, 05, 2F] +FEA6; [60 5C, 05, 31] +FEA5; [60 5C, 05, 33] +FCAB; [60 5C, 05, 2D][60 4E, 05, 2D] +FC19; [60 5C, 05, 33][60 4E, 05, 33] +FC1A; [60 5C, 05, 33][60 5A, 05, 33] +FCAC; [60 5C, 05, 2D][60 F2, 05, 2D] +FC1B; [60 5C, 05, 33][60 F2, 05, 33] +FD1F; [60 5C, 05, 31][61 25, 05, 31] +FD03; [60 5C, 05, 33][61 25, 05, 33] +FD20; [60 5C, 05, 31][61 27, 05, 31] +FD04; [60 5C, 05, 33][61 27, 05, 33] + +0681; [60 5E, 05, 05] + +0682; [60 60, 05, 05] + +0685; [60 62, 05, 05] + +062F; [60 64, 05, 05] +FEAA; [60 64, 05, 31] +FEA9; [60 64, 05, 33] + +0630; [60 66, 05, 05] +FEAC; [60 66, 05, 31] +FEAB; [60 66, 05, 33] +FC5B; [60 66, 05, 33][, D5 91, 33] + +0688; [60 68, 05, 05] +FB89; [60 68, 05, 31] +FB88; [60 68, 05, 33] + +0689; [60 6A, 05, 05] + +068A; [60 6C, 05, 05] + +068B; [60 6E, 05, 05] + +068C; [60 70, 05, 05] +FB85; [60 70, 05, 31] +FB84; [60 70, 05, 33] + +068D; [60 72, 05, 05] +FB83; [60 72, 05, 31] +FB82; [60 72, 05, 33] + +068E; [60 74, 05, 05] +FB87; [60 74, 05, 31] +FB86; [60 74, 05, 33] + +068F; [60 76, 05, 05] + +0690; [60 78, 05, 05] + +06EE; [60 7A, 05, 05] + +0631; [60 7C, 05, 05] +FEAE; [60 7C, 05, 31] +FEAD; [60 7C, 05, 33] +FC5C; [60 7C, 05, 33][, D5 91, 33] +FDF6; [60 7C, 05, 33][60 94, 05, 33][61 11, 05, 3D][60 E8, 05, 3D] +FDFC; [60 7C, 05, 33][61 29, 05, 33][60 32, 05, 3D][60 E8, 05, 3D] + +0632; [60 7E, 05, 05] +FEB0; [60 7E, 05, 31] +FEAF; [60 7E, 05, 33] + +0691; [60 80, 05, 05] +FB8D; [60 80, 05, 31] +FB8C; [60 80, 05, 33] + +0692; [60 82, 05, 05] + +0693; [60 84, 05, 05] + +0694; [60 86, 05, 05] + +0695; [60 88, 05, 05] + +0696; [60 8A, 05, 05] + +0697; [60 8C, 05, 05] + +0698; [60 8E, 05, 05] +FB8B; [60 8E, 05, 31] +FB8A; [60 8E, 05, 33] + +0699; [60 90, 05, 05] + +06EF; [60 92, 05, 05] + +0633; [60 94, 05, 05] +FEB3; [60 94, 05, 2D] +FEB4; [60 94, 05, 2F] +FEB2; [60 94, 05, 31] +FEB1; [60 94, 05, 33] +FCAD; [60 94, 05, 2D][60 4E, 05, 2D] +FD34; [60 94, 05, 2F][60 4E, 05, 2F] +FC1C; [60 94, 05, 33][60 4E, 05, 33] +FD5D; [60 94, 05, 2D][60 4E, 05, 2D][60 5A, 05, 3D] +FD5E; [60 94, 05, 31][60 4E, 05, 31][61 25, 05, 3D] +FCAE; [60 94, 05, 2D][60 5A, 05, 2D] +FD35; [60 94, 05, 2F][60 5A, 05, 2F] +FC1D; [60 94, 05, 33][60 5A, 05, 33] +FD5C; [60 94, 05, 2D][60 5A, 05, 2D][60 4E, 05, 3D] +FCAF; [60 94, 05, 2D][60 5C, 05, 2D] +FD36; [60 94, 05, 2F][60 5C, 05, 2F] +FC1E; [60 94, 05, 33][60 5C, 05, 33] +FDA8; [60 94, 05, 31][60 5C, 05, 31][61 25, 05, 3D] +FDC6; [60 94, 05, 31][60 5C, 05, 31][61 27, 05, 3D] +FD2A; [60 94, 05, 31][60 7C, 05, 31] +FD0E; [60 94, 05, 33][60 7C, 05, 33] +FCB0; [60 94, 05, 2D][60 F2, 05, 2D] +FCE7; [60 94, 05, 2F][60 F2, 05, 2F] +FC1F; [60 94, 05, 33][60 F2, 05, 33] +FD61; [60 94, 05, 2D][60 F2, 05, 2D][60 4E, 05, 3D] +FD60; [60 94, 05, 2D][60 F2, 05, 2D][60 5A, 05, 3D] +FD5F; [60 94, 05, 31][60 F2, 05, 31][60 5A, 05, 3D] +FD63; [60 94, 05, 2D][60 F2, 05, 2D][60 F2, 05, 3D] +FD62; [60 94, 05, 31][60 F2, 05, 31][60 F2, 05, 3D] +FD31; [60 94, 05, 2D][61 05, 05, 2D] +FCE8; [60 94, 05, 2F][61 05, 05, 2F] +FD17; [60 94, 05, 31][61 25, 05, 31] +FCFB; [60 94, 05, 33][61 25, 05, 33] +FD18; [60 94, 05, 31][61 27, 05, 31] +FCFC; [60 94, 05, 33][61 27, 05, 33] + +0634; [60 96, 05, 05] +FEB7; [60 96, 05, 2D] +FEB8; [60 96, 05, 2F] +FEB6; [60 96, 05, 31] +FEB5; [60 96, 05, 33] +FD2D; [60 96, 05, 2D][60 4E, 05, 2D] +FD37; [60 96, 05, 2F][60 4E, 05, 2F] +FD25; [60 96, 05, 31][60 4E, 05, 31] +FD09; [60 96, 05, 33][60 4E, 05, 33] +FD69; [60 96, 05, 31][60 4E, 05, 31][61 27, 05, 3D] +FD2E; [60 96, 05, 2D][60 5A, 05, 2D] +FD38; [60 96, 05, 2F][60 5A, 05, 2F] +FD26; [60 96, 05, 31][60 5A, 05, 31] +FD0A; [60 96, 05, 33][60 5A, 05, 33] +FD68; [60 96, 05, 2D][60 5A, 05, 2D][60 F2, 05, 3D] +FD67; [60 96, 05, 31][60 5A, 05, 31][60 F2, 05, 3D] +FDAA; [60 96, 05, 31][60 5A, 05, 31][61 27, 05, 3D] +FD2F; [60 96, 05, 2D][60 5C, 05, 2D] +FD39; [60 96, 05, 2F][60 5C, 05, 2F] +FD27; [60 96, 05, 31][60 5C, 05, 31] +FD0B; [60 96, 05, 33][60 5C, 05, 33] +FD29; [60 96, 05, 31][60 7C, 05, 31] +FD0D; [60 96, 05, 33][60 7C, 05, 33] +FD30; [60 96, 05, 2D][60 F2, 05, 2D] +FCE9; [60 96, 05, 2F][60 F2, 05, 2F] +FD28; [60 96, 05, 31][60 F2, 05, 31] +FD0C; [60 96, 05, 33][60 F2, 05, 33] +FD6B; [60 96, 05, 2D][60 F2, 05, 2D][60 5C, 05, 3D] +FD6A; [60 96, 05, 31][60 F2, 05, 31][60 5C, 05, 3D] +FD6D; [60 96, 05, 2D][60 F2, 05, 2D][60 F2, 05, 3D] +FD6C; [60 96, 05, 31][60 F2, 05, 31][60 F2, 05, 3D] +FD32; [60 96, 05, 2D][61 05, 05, 2D] +FCEA; [60 96, 05, 2F][61 05, 05, 2F] +FD19; [60 96, 05, 31][61 25, 05, 31] +FCFD; [60 96, 05, 33][61 25, 05, 33] +FD1A; [60 96, 05, 31][61 27, 05, 31] +FCFE; [60 96, 05, 33][61 27, 05, 33] + +069A; [60 98, 05, 05] + +069B; [60 9A, 05, 05] + +069C; [60 9C, 05, 05] + +06FA; [60 9E, 05, 05] + +0635; [60 A0, 05, 05] +FEBB; [60 A0, 05, 2D] +FEBC; [60 A0, 05, 2F] +FEBA; [60 A0, 05, 31] +FEB9; [60 A0, 05, 33] +FCB1; [60 A0, 05, 2D][60 5A, 05, 2D] +FC20; [60 A0, 05, 33][60 5A, 05, 33] +FD65; [60 A0, 05, 2D][60 5A, 05, 2D][60 5A, 05, 3D] +FD64; [60 A0, 05, 31][60 5A, 05, 31][60 5A, 05, 3D] +FDA9; [60 A0, 05, 31][60 5A, 05, 31][61 27, 05, 3D] +FCB2; [60 A0, 05, 2D][60 5C, 05, 2D] +FD2B; [60 A0, 05, 31][60 7C, 05, 31] +FD0F; [60 A0, 05, 33][60 7C, 05, 33] +FDF5; [60 A0, 05, 33][60 E8, 05, 33][60 B0, 05, 3D][60 F2, 05, 3D] +FDF9; [60 A0, 05, 33][60 E8, 05, 33][61 25, 05, 3D] +FDFA; [60 A0, 05, 33][60 E8, 05, 33][61 25, 05, 3D][06, 05, 3D][60 32, 05, 3D][60 E8, 05, 3D][60 E8, 05, 3D][61 05, 05, 3D][06, 05, 3D][60 B0, 05, 3D][60 E8, 05, 3D][61 27, 05, 3D][61 05, 05, 3D][06, 05, 3D][61 11, 05, 3D][60 94, 05, 3D][60 E8, 05, 3D][60 F2, 05, 3D] +FDF0; [60 A0, 05, 33][60 E8, 05, 33][61 33, 05, 3D] +FCB3; [60 A0, 05, 2D][60 F2, 05, 2D] +FC21; [60 A0, 05, 33][60 F2, 05, 33] +FDC5; [60 A0, 05, 2D][60 F2, 05, 2D][60 F2, 05, 3D] +FD66; [60 A0, 05, 31][60 F2, 05, 31][60 F2, 05, 3D] +FD21; [60 A0, 05, 31][61 25, 05, 31] +FD05; [60 A0, 05, 33][61 25, 05, 33] +FD22; [60 A0, 05, 31][61 27, 05, 31] +FD06; [60 A0, 05, 33][61 27, 05, 33] + +0636; [60 A2, 05, 05] +FEBF; [60 A2, 05, 2D] +FEC0; [60 A2, 05, 2F] +FEBE; [60 A2, 05, 31] +FEBD; [60 A2, 05, 33] +FCB4; [60 A2, 05, 2D][60 4E, 05, 2D] +FC22; [60 A2, 05, 33][60 4E, 05, 33] +FCB5; [60 A2, 05, 2D][60 5A, 05, 2D] +FC23; [60 A2, 05, 33][60 5A, 05, 33] +FD6E; [60 A2, 05, 31][60 5A, 05, 31][61 25, 05, 3D] +FDAB; [60 A2, 05, 31][60 5A, 05, 31][61 27, 05, 3D] +FCB6; [60 A2, 05, 2D][60 5C, 05, 2D] +FC24; [60 A2, 05, 33][60 5C, 05, 33] +FD70; [60 A2, 05, 2D][60 5C, 05, 2D][60 F2, 05, 3D] +FD6F; [60 A2, 05, 31][60 5C, 05, 31][60 F2, 05, 3D] +FD2C; [60 A2, 05, 31][60 7C, 05, 31] +FD10; [60 A2, 05, 33][60 7C, 05, 33] +FCB7; [60 A2, 05, 2D][60 F2, 05, 2D] +FC25; [60 A2, 05, 33][60 F2, 05, 33] +FD23; [60 A2, 05, 31][61 25, 05, 31] +FD07; [60 A2, 05, 33][61 25, 05, 33] +FD24; [60 A2, 05, 31][61 27, 05, 31] +FD08; [60 A2, 05, 33][61 27, 05, 33] + +069D; [60 A4, 05, 05] + +069E; [60 A6, 05, 05] + +06FB; [60 A8, 05, 05] + +0637; [60 AA, 05, 05] +FEC3; [60 AA, 05, 2D] +FEC4; [60 AA, 05, 2F] +FEC2; [60 AA, 05, 31] +FEC1; [60 AA, 05, 33] +FCB8; [60 AA, 05, 2D][60 5A, 05, 2D] +FC26; [60 AA, 05, 33][60 5A, 05, 33] +FD33; [60 AA, 05, 2D][60 F2, 05, 2D] +FD3A; [60 AA, 05, 2F][60 F2, 05, 2F] +FC27; [60 AA, 05, 33][60 F2, 05, 33] +FD72; [60 AA, 05, 2D][60 F2, 05, 2D][60 5A, 05, 3D] +FD71; [60 AA, 05, 31][60 F2, 05, 31][60 5A, 05, 3D] +FD73; [60 AA, 05, 2D][60 F2, 05, 2D][60 F2, 05, 3D] +FD74; [60 AA, 05, 31][60 F2, 05, 31][61 27, 05, 3D] +FD11; [60 AA, 05, 31][61 25, 05, 31] +FCF5; [60 AA, 05, 33][61 25, 05, 33] +FD12; [60 AA, 05, 31][61 27, 05, 31] +FCF6; [60 AA, 05, 33][61 27, 05, 33] + +0638; [60 AC, 05, 05] +FEC7; [60 AC, 05, 2D] +FEC8; [60 AC, 05, 2F] +FEC6; [60 AC, 05, 31] +FEC5; [60 AC, 05, 33] +FCB9; [60 AC, 05, 2D][60 F2, 05, 2D] +FD3B; [60 AC, 05, 2F][60 F2, 05, 2F] +FC28; [60 AC, 05, 33][60 F2, 05, 33] + +069F; [60 AE, 05, 05] + +0639; [60 B0, 05, 05] +FECB; [60 B0, 05, 2D] +FECC; [60 B0, 05, 2F] +FECA; [60 B0, 05, 31] +FEC9; [60 B0, 05, 33] +FCBA; [60 B0, 05, 2D][60 4E, 05, 2D] +FC29; [60 B0, 05, 33][60 4E, 05, 33] +FDC4; [60 B0, 05, 2D][60 4E, 05, 2D][60 F2, 05, 3D] +FD75; [60 B0, 05, 31][60 4E, 05, 31][60 F2, 05, 3D] +FDF7; [60 B0, 05, 33][60 E8, 05, 33][61 27, 05, 3D][61 05, 05, 3D] +FCBB; [60 B0, 05, 2D][60 F2, 05, 2D] +FC2A; [60 B0, 05, 33][60 F2, 05, 33] +FD77; [60 B0, 05, 2D][60 F2, 05, 2D][60 F2, 05, 3D] +FD76; [60 B0, 05, 31][60 F2, 05, 31][60 F2, 05, 3D] +FD78; [60 B0, 05, 31][60 F2, 05, 31][61 25, 05, 3D] +FDB6; [60 B0, 05, 31][60 F2, 05, 31][61 27, 05, 3D] +FD13; [60 B0, 05, 31][61 25, 05, 31] +FCF7; [60 B0, 05, 33][61 25, 05, 33] +FD14; [60 B0, 05, 31][61 27, 05, 31] +FCF8; [60 B0, 05, 33][61 27, 05, 33] + +063A; [60 B2, 05, 05] +FECF; [60 B2, 05, 2D] +FED0; [60 B2, 05, 2F] +FECE; [60 B2, 05, 31] +FECD; [60 B2, 05, 33] +FCBC; [60 B2, 05, 2D][60 4E, 05, 2D] +FC2B; [60 B2, 05, 33][60 4E, 05, 33] +FCBD; [60 B2, 05, 2D][60 F2, 05, 2D] +FC2C; [60 B2, 05, 33][60 F2, 05, 33] +FD79; [60 B2, 05, 31][60 F2, 05, 31][60 F2, 05, 3D] +FD7B; [60 B2, 05, 31][60 F2, 05, 31][61 25, 05, 3D] +FD7A; [60 B2, 05, 31][60 F2, 05, 31][61 27, 05, 3D] +FD15; [60 B2, 05, 31][61 25, 05, 31] +FCF9; [60 B2, 05, 33][61 25, 05, 33] +FD16; [60 B2, 05, 31][61 27, 05, 31] +FCFA; [60 B2, 05, 33][61 27, 05, 33] + +06A0; [60 B4, 05, 05] + +06FC; [60 B6, 05, 05] + +0641; [60 B8, 05, 05] +FED3; [60 B8, 05, 2D] +FED4; [60 B8, 05, 2F] +FED2; [60 B8, 05, 31] +FED1; [60 B8, 05, 33] +FCBE; [60 B8, 05, 2D][60 4E, 05, 2D] +FC2D; [60 B8, 05, 33][60 4E, 05, 33] +FCBF; [60 B8, 05, 2D][60 5A, 05, 2D] +FC2E; [60 B8, 05, 33][60 5A, 05, 33] +FCC0; [60 B8, 05, 2D][60 5C, 05, 2D] +FC2F; [60 B8, 05, 33][60 5C, 05, 33] +FD7D; [60 B8, 05, 2D][60 5C, 05, 2D][60 F2, 05, 3D] +FD7C; [60 B8, 05, 31][60 5C, 05, 31][60 F2, 05, 3D] +FCC1; [60 B8, 05, 2D][60 F2, 05, 2D] +FC30; [60 B8, 05, 33][60 F2, 05, 33] +FDC1; [60 B8, 05, 31][60 F2, 05, 31][61 27, 05, 3D] +FC7C; [60 B8, 05, 31][61 25, 05, 31] +FC31; [60 B8, 05, 33][61 25, 05, 33] +FC7D; [60 B8, 05, 31][61 27, 05, 31] +FC32; [60 B8, 05, 33][61 27, 05, 33] + +06A1; [60 BA, 05, 05] + +06A2; [60 BC, 05, 05] + +06A3; [60 BE, 05, 05] + +06A4; [60 C0, 05, 05] +FB6C; [60 C0, 05, 2D] +FB6D; [60 C0, 05, 2F] +FB6B; [60 C0, 05, 31] +FB6A; [60 C0, 05, 33] + +06A5; [60 C2, 05, 05] + +06A6; [60 C4, 05, 05] +FB70; [60 C4, 05, 2D] +FB71; [60 C4, 05, 2F] +FB6F; [60 C4, 05, 31] +FB6E; [60 C4, 05, 33] + +066F; [60 C6, 05, 05] + +0642; [60 C8, 05, 05] +FED7; [60 C8, 05, 2D] +FED8; [60 C8, 05, 2F] +FED6; [60 C8, 05, 31] +FED5; [60 C8, 05, 33] +FCC2; [60 C8, 05, 2D][60 5A, 05, 2D] +FC33; [60 C8, 05, 33][60 5A, 05, 33] +FDF1; [60 C8, 05, 33][60 E8, 05, 33][61 33, 05, 3D] +FCC3; [60 C8, 05, 2D][60 F2, 05, 2D] +FC34; [60 C8, 05, 33][60 F2, 05, 33] +FDB4; [60 C8, 05, 2D][60 F2, 05, 2D][60 5A, 05, 3D] +FD7E; [60 C8, 05, 31][60 F2, 05, 31][60 5A, 05, 3D] +FD7F; [60 C8, 05, 31][60 F2, 05, 31][60 F2, 05, 3D] +FDB2; [60 C8, 05, 31][60 F2, 05, 31][61 27, 05, 3D] +FC7E; [60 C8, 05, 31][61 25, 05, 31] +FC35; [60 C8, 05, 33][61 25, 05, 33] +FC7F; [60 C8, 05, 31][61 27, 05, 31] +FC36; [60 C8, 05, 33][61 27, 05, 33] + +06A7; [60 CA, 05, 05] + +06A8; [60 CC, 05, 05] + +0643; [60 CE, 05, 05] +FEDB; [60 CE, 05, 2D] +FEDC; [60 CE, 05, 2F] +FEDA; [60 CE, 05, 31] +FED9; [60 CE, 05, 33] +FC80; [60 CE, 05, 31][60 32, 05, 31] +FC37; [60 CE, 05, 33][60 32, 05, 33] +FCC4; [60 CE, 05, 2D][60 4E, 05, 2D] +FC38; [60 CE, 05, 33][60 4E, 05, 33] +FCC5; [60 CE, 05, 2D][60 5A, 05, 2D] +FC39; [60 CE, 05, 33][60 5A, 05, 33] +FCC6; [60 CE, 05, 2D][60 5C, 05, 2D] +FC3A; [60 CE, 05, 33][60 5C, 05, 33] +FCC7; [60 CE, 05, 2D][60 E8, 05, 2D] +FCEB; [60 CE, 05, 2F][60 E8, 05, 2F] +FC81; [60 CE, 05, 31][60 E8, 05, 31] +FC3B; [60 CE, 05, 33][60 E8, 05, 33] +FCC8; [60 CE, 05, 2D][60 F2, 05, 2D] +FCEC; [60 CE, 05, 2F][60 F2, 05, 2F] +FC82; [60 CE, 05, 31][60 F2, 05, 31] +FC3C; [60 CE, 05, 33][60 F2, 05, 33] +FDC3; [60 CE, 05, 2D][60 F2, 05, 2D][60 F2, 05, 3D] +FDBB; [60 CE, 05, 31][60 F2, 05, 31][60 F2, 05, 3D] +FDB7; [60 CE, 05, 31][60 F2, 05, 31][61 27, 05, 3D] +FC83; [60 CE, 05, 31][61 25, 05, 31] +FC3D; [60 CE, 05, 33][61 25, 05, 33] +FC84; [60 CE, 05, 31][61 27, 05, 31] +FC3E; [60 CE, 05, 33][61 27, 05, 33] + +06A9; [60 D0, 05, 05] +FB90; [60 D0, 05, 2D] +FB91; [60 D0, 05, 2F] +FB8F; [60 D0, 05, 31] +FB8E; [60 D0, 05, 33] + +06AA; [60 D2, 05, 05] + +06AB; [60 D4, 05, 05] + +06AC; [60 D6, 05, 05] + +06AD; [60 D8, 05, 05] +FBD5; [60 D8, 05, 2D] +FBD6; [60 D8, 05, 2F] +FBD4; [60 D8, 05, 31] +FBD3; [60 D8, 05, 33] + +06AE; [60 DA, 05, 05] + +06AF; [60 DC, 05, 05] +FB94; [60 DC, 05, 2D] +FB95; [60 DC, 05, 2F] +FB93; [60 DC, 05, 31] +FB92; [60 DC, 05, 33] + +06B0; [60 DE, 05, 05] + +06B1; [60 E0, 05, 05] +FB9C; [60 E0, 05, 2D] +FB9D; [60 E0, 05, 2F] +FB9B; [60 E0, 05, 31] +FB9A; [60 E0, 05, 33] + +06B2; [60 E2, 05, 05] + +06B3; [60 E4, 05, 05] +FB98; [60 E4, 05, 2D] +FB99; [60 E4, 05, 2F] +FB97; [60 E4, 05, 31] +FB96; [60 E4, 05, 33] + +06B4; [60 E6, 05, 05] + +0644; [60 E8, 05, 05] +FEDF; [60 E8, 05, 2D] +FEE0; [60 E8, 05, 2F] +FEDE; [60 E8, 05, 31] +FEDD; [60 E8, 05, 33] +FEF6; [60 E8, 05, 31][60 22, 05, 31] +FEF5; [60 E8, 05, 33][60 22, 05, 33] +FEF8; [60 E8, 05, 31][60 24, 05, 31] +FEF7; [60 E8, 05, 33][60 24, 05, 33] +FEFA; [60 E8, 05, 31][60 2C, 05, 31] +FEF9; [60 E8, 05, 33][60 2C, 05, 33] +FEFC; [60 E8, 05, 31][60 32, 05, 31] +FEFB; [60 E8, 05, 33][60 32, 05, 33] +FCC9; [60 E8, 05, 2D][60 4E, 05, 2D] +FC3F; [60 E8, 05, 33][60 4E, 05, 33] +FD83; [60 E8, 05, 2D][60 4E, 05, 2D][60 4E, 05, 3D] +FD84; [60 E8, 05, 31][60 4E, 05, 31][60 4E, 05, 3D] +FDBA; [60 E8, 05, 2D][60 4E, 05, 2D][60 F2, 05, 3D] +FDBC; [60 E8, 05, 31][60 4E, 05, 31][60 F2, 05, 3D] +FDAC; [60 E8, 05, 31][60 4E, 05, 31][61 27, 05, 3D] +FCCA; [60 E8, 05, 2D][60 5A, 05, 2D] +FC40; [60 E8, 05, 33][60 5A, 05, 33] +FDB5; [60 E8, 05, 2D][60 5A, 05, 2D][60 F2, 05, 3D] +FD80; [60 E8, 05, 31][60 5A, 05, 31][60 F2, 05, 3D] +FD82; [60 E8, 05, 31][60 5A, 05, 31][61 25, 05, 3D] +FD81; [60 E8, 05, 31][60 5A, 05, 31][61 27, 05, 3D] +FCCB; [60 E8, 05, 2D][60 5C, 05, 2D] +FC41; [60 E8, 05, 33][60 5C, 05, 33] +FD86; [60 E8, 05, 2D][60 5C, 05, 2D][60 F2, 05, 3D] +FD85; [60 E8, 05, 31][60 5C, 05, 31][60 F2, 05, 3D] +FCCC; [60 E8, 05, 2D][60 F2, 05, 2D] +FCED; [60 E8, 05, 2F][60 F2, 05, 2F] +FC85; [60 E8, 05, 31][60 F2, 05, 31] +FC42; [60 E8, 05, 33][60 F2, 05, 33] +FD88; [60 E8, 05, 2D][60 F2, 05, 2D][60 5A, 05, 3D] +FD87; [60 E8, 05, 31][60 F2, 05, 31][60 5A, 05, 3D] +FDAD; [60 E8, 05, 31][60 F2, 05, 31][61 27, 05, 3D] +FCCD; [60 E8, 05, 2D][61 05, 05, 2D] +FC86; [60 E8, 05, 31][61 25, 05, 31] +FC43; [60 E8, 05, 33][61 25, 05, 33] +FC87; [60 E8, 05, 31][61 27, 05, 31] +FC44; [60 E8, 05, 33][61 27, 05, 33] + +06B5; [60 EA, 05, 05] + +06B6; [60 EC, 05, 05] + +06B7; [60 EE, 05, 05] + +06B8; [60 F0, 05, 05] + +0645; [60 F2, 05, 05] +FEE3; [60 F2, 05, 2D] +FEE4; [60 F2, 05, 2F] +FEE2; [60 F2, 05, 31] +FEE1; [60 F2, 05, 33] +06FE; [60 F2, 05, 09][, E0 9D, 09] +FC88; [60 F2, 05, 31][60 32, 05, 31] +FCCE; [60 F2, 05, 2D][60 4E, 05, 2D] +FC45; [60 F2, 05, 33][60 4E, 05, 33] +FD8C; [60 F2, 05, 2D][60 4E, 05, 2D][60 5A, 05, 3D] +FD92; [60 F2, 05, 2D][60 4E, 05, 2D][60 5C, 05, 3D] +FD8D; [60 F2, 05, 2D][60 4E, 05, 2D][60 F2, 05, 3D] +FDC0; [60 F2, 05, 31][60 4E, 05, 31][61 27, 05, 3D] +FCCF; [60 F2, 05, 2D][60 5A, 05, 2D] +FC46; [60 F2, 05, 33][60 5A, 05, 33] +FD89; [60 F2, 05, 2D][60 5A, 05, 2D][60 4E, 05, 3D] +FD8A; [60 F2, 05, 2D][60 5A, 05, 2D][60 F2, 05, 3D] +FDF4; [60 F2, 05, 33][60 5A, 05, 33][60 F2, 05, 3D][60 64, 05, 3D] +FD8B; [60 F2, 05, 31][60 5A, 05, 31][61 27, 05, 3D] +FCD0; [60 F2, 05, 2D][60 5C, 05, 2D] +FC47; [60 F2, 05, 33][60 5C, 05, 33] +FD8E; [60 F2, 05, 2D][60 5C, 05, 2D][60 4E, 05, 3D] +FD8F; [60 F2, 05, 2D][60 5C, 05, 2D][60 F2, 05, 3D] +FDB9; [60 F2, 05, 31][60 5C, 05, 31][61 27, 05, 3D] +FCD1; [60 F2, 05, 2D][60 F2, 05, 2D] +FC89; [60 F2, 05, 31][60 F2, 05, 31] +FC48; [60 F2, 05, 33][60 F2, 05, 33] +FDB1; [60 F2, 05, 31][60 F2, 05, 31][61 27, 05, 3D] +FC49; [60 F2, 05, 33][61 25, 05, 33] +FC4A; [60 F2, 05, 33][61 27, 05, 33] + +0646; [60 F4, 05, 05] +FEE7; [60 F4, 05, 2D] +FEE8; [60 F4, 05, 2F] +FEE6; [60 F4, 05, 31] +FEE5; [60 F4, 05, 33] +FCD2; [60 F4, 05, 2D][60 4E, 05, 2D] +FC4B; [60 F4, 05, 33][60 4E, 05, 33] +FDB8; [60 F4, 05, 2D][60 4E, 05, 2D][60 5A, 05, 3D] +FDBD; [60 F4, 05, 31][60 4E, 05, 31][60 5A, 05, 3D] +FD98; [60 F4, 05, 2D][60 4E, 05, 2D][60 F2, 05, 3D] +FD97; [60 F4, 05, 31][60 4E, 05, 31][60 F2, 05, 3D] +FD99; [60 F4, 05, 31][60 4E, 05, 31][61 25, 05, 3D] +FDC7; [60 F4, 05, 31][60 4E, 05, 31][61 27, 05, 3D] +FCD3; [60 F4, 05, 2D][60 5A, 05, 2D] +FC4C; [60 F4, 05, 33][60 5A, 05, 33] +FD95; [60 F4, 05, 2D][60 5A, 05, 2D][60 F2, 05, 3D] +FD96; [60 F4, 05, 31][60 5A, 05, 31][61 25, 05, 3D] +FDB3; [60 F4, 05, 31][60 5A, 05, 31][61 27, 05, 3D] +FCD4; [60 F4, 05, 2D][60 5C, 05, 2D] +FC4D; [60 F4, 05, 33][60 5C, 05, 33] +FC8A; [60 F4, 05, 31][60 7C, 05, 31] +FC8B; [60 F4, 05, 31][60 7E, 05, 31] +FCD5; [60 F4, 05, 2D][60 F2, 05, 2D] +FCEE; [60 F4, 05, 2F][60 F2, 05, 2F] +FC8C; [60 F4, 05, 31][60 F2, 05, 31] +FC4E; [60 F4, 05, 33][60 F2, 05, 33] +FD9B; [60 F4, 05, 31][60 F2, 05, 31][61 25, 05, 3D] +FD9A; [60 F4, 05, 31][60 F2, 05, 31][61 27, 05, 3D] +FC8D; [60 F4, 05, 31][60 F4, 05, 31] +FCD6; [60 F4, 05, 2D][61 05, 05, 2D] +FCEF; [60 F4, 05, 2F][61 05, 05, 2F] +FC8E; [60 F4, 05, 31][61 25, 05, 31] +FC4F; [60 F4, 05, 33][61 25, 05, 33] +FC8F; [60 F4, 05, 31][61 27, 05, 31] +FC50; [60 F4, 05, 33][61 27, 05, 33] + +06BA; [60 F6, 05, 05] +FB9F; [60 F6, 05, 31] +FB9E; [60 F6, 05, 33] + +06BB; [60 F8, 05, 05] +FBA2; [60 F8, 05, 2D] +FBA3; [60 F8, 05, 2F] +FBA1; [60 F8, 05, 31] +FBA0; [60 F8, 05, 33] + +06BC; [60 FA, 05, 05] + +06BD; [60 FC, 05, 05] + +06B9; [60 FE, 05, 05] + +0647; [61 05, 05, 05] +FEEB; [61 05, 05, 2D] +FEEC; [61 05, 05, 2F] +FEEA; [61 05, 05, 31] +FEE9; [61 05, 05, 33] +FCD9; [61 05, 05, 2D][, D5 91, 2D] +FCD7; [61 05, 05, 2D][60 4E, 05, 2D] +FC51; [61 05, 05, 33][60 4E, 05, 33] +FCD8; [61 05, 05, 2D][60 F2, 05, 2D] +FC52; [61 05, 05, 33][60 F2, 05, 33] +FD93; [61 05, 05, 2D][60 F2, 05, 2D][60 4E, 05, 3D] +FD94; [61 05, 05, 2D][60 F2, 05, 2D][60 F2, 05, 3D] +FC53; [61 05, 05, 33][61 25, 05, 33] +FC54; [61 05, 05, 33][61 27, 05, 33] + +06BE; [61 07, 05, 05] +FBAC; [61 07, 05, 2D] +FBAD; [61 07, 05, 2F] +FBAB; [61 07, 05, 31] +FBAA; [61 07, 05, 33] + +06C1; [61 09, 05, 05] +FBA8; [61 09, 05, 2D] +FBA9; [61 09, 05, 2F] +FBA7; [61 09, 05, 31] +FBA6; [61 09, 05, 33] +06C2; [61 09, 05, 05][, D5 41, 05] + +06C3; [61 0B, 05, 05] + +06FF; [61 0D, 05, 05] + +06D5; [61 0F, 05, 05] +06C0; [61 0F, 05, 05][, D5 41, 05] +FBA5; [61 0F, 05, 31][, D5 41, 31] +FBA4; [61 0F, 05, 33][, D5 41, 33] + +0648; [61 11, 05, 05] +06E5; [61 11, 05, 09] +FEEE; [61 11, 05, 31] +FEED; [61 11, 05, 33] +0676; [61 11, 05, 09][60 20, 05, 09] +FDF8; [61 11, 05, 33][60 94, 05, 33][60 E8, 05, 3D][60 F2, 05, 3D] + +06C4; [61 13, 05, 05] + +06C5; [61 15, 05, 05] +FBE1; [61 15, 05, 31] +FBE0; [61 15, 05, 33] + +06C6; [61 17, 05, 05] +FBDA; [61 17, 05, 31] +FBD9; [61 17, 05, 33] + +06C7; [61 19, 05, 05] +FBD8; [61 19, 05, 31] +FBD7; [61 19, 05, 33] +0677; [61 19, 05, 09][60 20, 05, 09] +FBDD; [61 19, 05, 33][60 20, 05, 33] + +06C8; [61 1B, 05, 05] +FBDC; [61 1B, 05, 31] +FBDB; [61 1B, 05, 33] + +06C9; [61 1D, 05, 05] +FBE3; [61 1D, 05, 31] +FBE2; [61 1D, 05, 33] + +06CA; [61 1F, 05, 05] + +06CB; [61 21, 05, 05] +FBDF; [61 21, 05, 31] +FBDE; [61 21, 05, 33] + +06CF; [61 23, 05, 05] + +0649; [61 25, 05, 05] +FBE8; [61 25, 05, 2D] +FBE9; [61 25, 05, 2F] +FEF0; [61 25, 05, 31] +FEEF; [61 25, 05, 33] +FC90; [61 25, 05, 31][, D5 91, 31] +FC5D; [61 25, 05, 33][, D5 91, 33] + +064A; [61 27, 05, 05] +06E6; [61 27, 05, 09] +FEF3; [61 27, 05, 2D] +FEF4; [61 27, 05, 2F] +FEF2; [61 27, 05, 31] +FEF1; [61 27, 05, 33] +0678; [61 27, 05, 09][60 20, 05, 09] +FCDA; [61 27, 05, 2D][60 4E, 05, 2D] +FC55; [61 27, 05, 33][60 4E, 05, 33] +FDAF; [61 27, 05, 31][60 4E, 05, 31][61 27, 05, 3D] +FCDB; [61 27, 05, 2D][60 5A, 05, 2D] +FC56; [61 27, 05, 33][60 5A, 05, 33] +FDAE; [61 27, 05, 31][60 5A, 05, 31][61 27, 05, 3D] +FCDC; [61 27, 05, 2D][60 5C, 05, 2D] +FC57; [61 27, 05, 33][60 5C, 05, 33] +FC91; [61 27, 05, 31][60 7C, 05, 31] +FC92; [61 27, 05, 31][60 7E, 05, 31] +FCDD; [61 27, 05, 2D][60 F2, 05, 2D] +FCF0; [61 27, 05, 2F][60 F2, 05, 2F] +FC93; [61 27, 05, 31][60 F2, 05, 31] +FC58; [61 27, 05, 33][60 F2, 05, 33] +FD9D; [61 27, 05, 2D][60 F2, 05, 2D][60 F2, 05, 3D] +FD9C; [61 27, 05, 31][60 F2, 05, 31][60 F2, 05, 3D] +FDB0; [61 27, 05, 31][60 F2, 05, 31][61 27, 05, 3D] +FC94; [61 27, 05, 31][60 F4, 05, 31] +FCDE; [61 27, 05, 2D][61 05, 05, 2D] +FCF1; [61 27, 05, 2F][61 05, 05, 2F] +FC95; [61 27, 05, 31][61 25, 05, 31] +FC59; [61 27, 05, 33][61 25, 05, 33] +FC96; [61 27, 05, 31][61 27, 05, 31] +FC5A; [61 27, 05, 33][61 27, 05, 33] -2277; [0B 5D, 05, 05] -2279; [0B 5D, 05, 05][, A5, 05] +06CC; [61 29, 05, 05] +FBFE; [61 29, 05, 2D] +FBFF; [61 29, 05, 2F] +FBFD; [61 29, 05, 31] +FBFC; [61 29, 05, 33] -227A; [0B 5F, 05, 05] -2280; [0B 5F, 05, 05][, A5, 05] +06CD; [61 2B, 05, 05] -227B; [0B 61, 05, 05] -2281; [0B 61, 05, 05][, A5, 05] +06CE; [61 2D, 05, 05] -227C; [0B 63, 05, 05] -22E0; [0B 63, 05, 05][, A5, 05] +06D0; [61 2F, 05, 05] +FBE6; [61 2F, 05, 2D] +FBE7; [61 2F, 05, 2F] +FBE5; [61 2F, 05, 31] +FBE4; [61 2F, 05, 33] -227D; [0B 65, 05, 05] -22E1; [0B 65, 05, 05][, A5, 05] +06D1; [61 31, 05, 05] -227E; [0B 67, 05, 05] +06D2; [61 33, 05, 05] +FBAF; [61 33, 05, 31] +FBAE; [61 33, 05, 33] +06D3; [61 33, 05, 05][, D5 41, 05] +FBB1; [61 33, 05, 31][, D5 41, 31] +FBB0; [61 33, 05, 33][, D5 41, 33] -227F; [0B 69, 05, 05] +0710; [62 20, 05, 05] -2282; [0B 6B, 05, 05] -2284; [0B 6B, 05, 05][, A5, 05] +0712; [62 22, 05, 05] +072D; [62 22, 05, 09][, E0 AD, 09] -2283; [0B 6D, 05, 05] -2285; [0B 6D, 05, 05][, A5, 05] +0713; [62 24, 05, 05] +0714; [62 24, 05, 09][, E0 9D, 09] +072E; [62 24, 05, 09][, E0 AD, 09] -2286; [0B 6F, 05, 05] -2288; [0B 6F, 05, 05][, A5, 05] +0716; [62 26, 05, 05] -2287; [0B 71, 05, 05] -2289; [0B 71, 05, 05][, A5, 05] +0715; [62 28, 05, 05] +072F; [62 28, 05, 09][, E0 AD, 09] -228A; [0B 73, 05, 05] +0717; [62 2A, 05, 05] -228B; [0B 75, 05, 05] +0718; [62 2C, 05, 05] -228C; [0B 77, 05, 05] +0719; [62 2E, 05, 05] -228D; [0B 79, 05, 05] +074D; [62 30, 05, 05] -228E; [0B 7B, 05, 05] +071A; [62 32, 05, 05] -228F; [0B 7D, 05, 05] +071B; [62 34, 05, 05] +071C; [62 34, 05, 09][, E0 9D, 09] -2290; [0B 7F, 05, 05] +071D; [62 36, 05, 05] -2291; [0B 81, 05, 05] -22E2; [0B 81, 05, 05][, A5, 05] +071E; [62 38, 05, 05] -2292; [0B 83, 05, 05] -22E3; [0B 83, 05, 05][, A5, 05] +071F; [62 3A, 05, 05] -2293; [0B 85, 05, 05] +074E; [62 3C, 05, 05] -2294; [0B 87, 05, 05] +0720; [62 3E, 05, 05] -2295; [0B 89, 05, 05] +0721; [62 40, 05, 05] -2296; [0B 8B, 05, 05] +0722; [62 42, 05, 05] -2297; [0B 8D, 05, 05] +0723; [62 44, 05, 05] +0724; [62 44, 05, 31] -2298; [0B 8F, 05, 05] +0725; [62 46, 05, 05] -2299; [0B 91, 05, 05] +0726; [62 48, 05, 05] +0727; [62 48, 05, 09][, E0 9D, 09] -229A; [0B 93, 05, 05] +074F; [62 4A, 05, 05] -229B; [0B 95, 05, 05] +0728; [62 4C, 05, 05] -229C; [0B 97, 05, 05] +0729; [62 4E, 05, 05] -229D; [0B 99, 05, 05] +072A; [62 50, 05, 05] -229E; [0B 9B, 05, 05] +072B; [62 52, 05, 05] -229F; [0B 9D, 05, 05] +072C; [62 54, 05, 05] -22A0; [0B 9F, 05, 05] +0780; [63 20, 05, 05] -22A1; [0B A1, 05, 05] +0799; [63 22, 05, 05] -22A2; [0B A3, 05, 05] -22AC; [0B A3, 05, 05][, A5, 05] +079A; [63 24, 05, 05] -22A3; [0B A5, 05, 05] +0781; [63 26, 05, 05] -22A4; [0B A7, 05, 05] +0782; [63 28, 05, 05] -22A5; [0B A9, 05, 05] +0783; [63 2A, 05, 05] -22A6; [0B AB, 05, 05] +079C; [63 2C, 05, 05] -22A7; [0B AD, 05, 05] +0784; [63 2E, 05, 05] -22A8; [0B AF, 05, 05] -22AD; [0B AF, 05, 05][, A5, 05] +0785; [63 30, 05, 05] -22A9; [0B B1, 05, 05] -22AE; [0B B1, 05, 05][, A5, 05] +0786; [63 32, 05, 05] -22AA; [0B B3, 05, 05] +0787; [63 34, 05, 05] -22AB; [0B B5, 05, 05] -22AF; [0B B5, 05, 05][, A5, 05] +07A2; [63 36, 05, 05] -22B0; [0B B7, 05, 05] +07A3; [63 38, 05, 05] -22B1; [0B B9, 05, 05] +0788; [63 3A, 05, 05] -22B2; [0B BB, 05, 05] -22EA; [0B BB, 05, 05][, A5, 05] +07A5; [63 3C, 05, 05] -22B3; [0B BD, 05, 05] -22EB; [0B BD, 05, 05][, A5, 05] +0789; [63 3E, 05, 05] -22B4; [0B BF, 05, 05] -22EC; [0B BF, 05, 05][, A5, 05] +078A; [63 40, 05, 05] -22B5; [0B C1, 05, 05] -22ED; [0B C1, 05, 05][, A5, 05] +078B; [63 42, 05, 05] -22B6; [0B C3, 05, 05] +079B; [63 44, 05, 05] -22B7; [0B C5, 05, 05] +078C; [63 46, 05, 05] -22B8; [0B C7, 05, 05] +0798; [63 48, 05, 05] -22B9; [0B C9, 05, 05] +07A0; [63 4A, 05, 05] -22BA; [0B CB, 05, 05] +07A1; [63 4C, 05, 05] -22BB; [0B CD, 05, 05] +078D; [63 4E, 05, 05] -22BC; [0B CF, 05, 05] +078E; [63 50, 05, 05] -22BD; [0B D1, 05, 05] +07A4; [63 52, 05, 05] -22BE; [0B D3, 05, 05] +078F; [63 54, 05, 05] -22BF; [0B D5, 05, 05] +0790; [63 56, 05, 05] -22C0; [0B D7, 05, 05] +079D; [63 58, 05, 05] -22C1; [0B D9, 05, 05] +079E; [63 5A, 05, 05] -22C2; [0B DB, 05, 05] +079F; [63 5C, 05, 05] -22C3; [0B DD, 05, 05] +0791; [63 5E, 05, 05] -22C4; [0B DF, 05, 05] +0792; [63 60, 05, 05] -22C5; [0B E1, 05, 05] +0793; [63 62, 05, 05] -22C6; [0B E3, 05, 05] +0794; [63 64, 05, 05] -22C7; [0B E5, 05, 05] +0795; [63 66, 05, 05] -22C8; [0B E7, 05, 05] +0796; [63 68, 05, 05] -22C9; [0B E9, 05, 05] +0797; [63 6A, 05, 05] -22CA; [0B EB, 05, 05] +07B1; [63 6C, 05, 05] -22CB; [0B ED, 05, 05] +07A6; [63 6E, 05, 05] -22CC; [0B EF, 05, 05] +07A7; [63 70, 05, 05] -22CD; [0B F1, 05, 05] +07A8; [63 72, 05, 05] -22CE; [0B F3, 05, 05] +07A9; [63 74, 05, 05] -22CF; [0B F5, 05, 05] +07AA; [63 76, 05, 05] -22D0; [0B F7, 05, 05] +07AB; [63 78, 05, 05] -22D1; [0B F9, 05, 05] +07AC; [63 7A, 05, 05] -22D2; [0B FB, 05, 05] +07AD; [63 7C, 05, 05] -22D3; [0B FD, 05, 05] +07AE; [63 7E, 05, 05] -22D4; [0C 05, 05, 05] +07AF; [63 80, 05, 05] -22D5; [0C 07, 05, 05] +07B0; [63 82, 05, 05] -22D6; [0C 09, 05, 05] +1200; [64 20, 05, 05] -22D7; [0C 0B, 05, 05] +1201; [64 22, 05, 05] -22D8; [0C 0D, 05, 05] +1202; [64 24, 05, 05] -22D9; [0C 0F, 05, 05] +1203; [64 26, 05, 05] -22DA; [0C 11, 05, 05] +1204; [64 28, 05, 05] -22DB; [0C 13, 05, 05] +1205; [64 2A, 05, 05] -22DC; [0C 15, 05, 05] +1206; [64 2C, 05, 05] -22DD; [0C 17, 05, 05] +1208; [64 2E, 05, 05] -22DE; [0C 19, 05, 05] +1209; [64 30, 05, 05] -22DF; [0C 1B, 05, 05] +120A; [64 32, 05, 05] -22E4; [0C 1D, 05, 05] +120B; [64 34, 05, 05] -22E5; [0C 1F, 05, 05] +120C; [64 36, 05, 05] -22E6; [0C 21, 05, 05] +120D; [64 38, 05, 05] -22E7; [0C 23, 05, 05] +120E; [64 3A, 05, 05] -22E8; [0C 25, 05, 05] +120F; [64 3C, 05, 05] -22E9; [0C 27, 05, 05] +1210; [64 3E, 05, 05] -22EE; [0C 29, 05, 05] +1211; [64 40, 05, 05] -22EF; [0C 2B, 05, 05] +1212; [64 42, 05, 05] -22F0; [0C 2D, 05, 05] +1213; [64 44, 05, 05] -22F1; [0C 2F, 05, 05] +1214; [64 46, 05, 05] -2300; [0C 31, 05, 05] +1215; [64 48, 05, 05] -2301; [0C 33, 05, 05] +1216; [64 4A, 05, 05] -2302; [0C 35, 05, 05] +1217; [64 4C, 05, 05] -2303; [0C 37, 05, 05] +1218; [64 4E, 05, 05] -2304; [0C 39, 05, 05] +1219; [64 50, 05, 05] -2305; [0C 3B, 05, 05] +121A; [64 52, 05, 05] -2306; [0C 3D, 05, 05] +121B; [64 54, 05, 05] -2307; [0C 3F, 05, 05] +121C; [64 56, 05, 05] -2308; [0C 41, 05, 05] +121D; [64 58, 05, 05] -2309; [0C 43, 05, 05] +121E; [64 5A, 05, 05] -230A; [0C 45, 05, 05] +121F; [64 5C, 05, 05] -230B; [0C 47, 05, 05] +1220; [64 5E, 05, 05] -230C; [0C 49, 05, 05] +1221; [64 60, 05, 05] -230D; [0C 4B, 05, 05] +1222; [64 62, 05, 05] -230E; [0C 4D, 05, 05] +1223; [64 64, 05, 05] -230F; [0C 4F, 05, 05] +1224; [64 66, 05, 05] -2310; [0C 51, 05, 05] +1225; [64 68, 05, 05] -2311; [0C 53, 05, 05] +1226; [64 6A, 05, 05] -2312; [0C 55, 05, 05] +1227; [64 6C, 05, 05] -2313; [0C 57, 05, 05] +1228; [64 6E, 05, 05] -2314; [0C 59, 05, 05] +1229; [64 70, 05, 05] -2315; [0C 5B, 05, 05] +122A; [64 72, 05, 05] -2316; [0C 5D, 05, 05] +122B; [64 74, 05, 05] -2317; [0C 5F, 05, 05] +122C; [64 76, 05, 05] -2318; [0C 61, 05, 05] +122D; [64 78, 05, 05] -2319; [0C 63, 05, 05] +122E; [64 7A, 05, 05] -231A; [0C 65, 05, 05] +122F; [64 7C, 05, 05] -231B; [0C 67, 05, 05] +1230; [64 7E, 05, 05] -231C; [0C 69, 05, 05] +1231; [64 80, 05, 05] -231D; [0C 6B, 05, 05] +1232; [64 82, 05, 05] -231E; [0C 6D, 05, 05] +1233; [64 84, 05, 05] -231F; [0C 6F, 05, 05] +1234; [64 86, 05, 05] -2320; [0C 71, 05, 05] +1235; [64 88, 05, 05] -2321; [0C 73, 05, 05] +1236; [64 8A, 05, 05] -2322; [0C 75, 05, 05] +1237; [64 8C, 05, 05] -2323; [0C 77, 05, 05] +1238; [64 8E, 05, 05] -2324; [0C 79, 05, 05] +1239; [64 90, 05, 05] -2325; [0C 7B, 05, 05] +123A; [64 92, 05, 05] -2326; [0C 7D, 05, 05] +123B; [64 94, 05, 05] -2327; [0C 7F, 05, 05] +123C; [64 96, 05, 05] -2328; [0C 81, 05, 05] +123D; [64 98, 05, 05] -232B; [0C 83, 05, 05] +123E; [64 9A, 05, 05] -232C; [0C 85, 05, 05] +123F; [64 9C, 05, 05] -232D; [0C 87, 05, 05] +1240; [64 9E, 05, 05] -232E; [0C 89, 05, 05] +1241; [64 A0, 05, 05] -232F; [0C 8B, 05, 05] +1242; [64 A2, 05, 05] -2330; [0C 8D, 05, 05] +1243; [64 A4, 05, 05] -2331; [0C 8F, 05, 05] +1244; [64 A6, 05, 05] -2332; [0C 91, 05, 05] +1245; [64 A8, 05, 05] -2333; [0C 93, 05, 05] +1246; [64 AA, 05, 05] -2334; [0C 95, 05, 05] +1248; [64 AC, 05, 05] -2335; [0C 97, 05, 05] +124A; [64 AE, 05, 05] -2336; [0C 99, 05, 05] +124B; [64 B0, 05, 05] -2337; [0C 9B, 05, 05] +124C; [64 B2, 05, 05] -2338; [0C 9D, 05, 05] +124D; [64 B4, 05, 05] -2339; [0C 9F, 05, 05] +1250; [64 B6, 05, 05] -233A; [0C A1, 05, 05] +1251; [64 B8, 05, 05] -233B; [0C A3, 05, 05] +1252; [64 BA, 05, 05] -233C; [0C A5, 05, 05] +1253; [64 BC, 05, 05] -233D; [0C A7, 05, 05] +1254; [64 BE, 05, 05] -233E; [0C A9, 05, 05] +1255; [64 C0, 05, 05] -233F; [0C AB, 05, 05] +1256; [64 C2, 05, 05] -2340; [0C AD, 05, 05] +1258; [64 C4, 05, 05] -2341; [0C AF, 05, 05] +125A; [64 C6, 05, 05] -2342; [0C B1, 05, 05] +125B; [64 C8, 05, 05] -2343; [0C B3, 05, 05] +125C; [64 CA, 05, 05] -2344; [0C B5, 05, 05] +125D; [64 CC, 05, 05] -2345; [0C B7, 05, 05] +1260; [64 CE, 05, 05] -2346; [0C B9, 05, 05] +1261; [64 D0, 05, 05] -2347; [0C BB, 05, 05] +1262; [64 D2, 05, 05] -2348; [0C BD, 05, 05] +1263; [64 D4, 05, 05] -2349; [0C BF, 05, 05] +1264; [64 D6, 05, 05] -234A; [0C C1, 05, 05] +1265; [64 D8, 05, 05] -234B; [0C C3, 05, 05] +1266; [64 DA, 05, 05] -234C; [0C C5, 05, 05] +1267; [64 DC, 05, 05] -234D; [0C C7, 05, 05] +1268; [64 DE, 05, 05] -234E; [0C C9, 05, 05] +1269; [64 E0, 05, 05] -234F; [0C CB, 05, 05] +126A; [64 E2, 05, 05] -2350; [0C CD, 05, 05] +126B; [64 E4, 05, 05] -2351; [0C CF, 05, 05] +126C; [64 E6, 05, 05] -2352; [0C D1, 05, 05] +126D; [64 E8, 05, 05] -2353; [0C D3, 05, 05] +126E; [64 EA, 05, 05] -2354; [0C D5, 05, 05] +126F; [64 EC, 05, 05] -2355; [0C D7, 05, 05] +1270; [64 EE, 05, 05] -2356; [0C D9, 05, 05] +1271; [64 F0, 05, 05] -2357; [0C DB, 05, 05] +1272; [64 F2, 05, 05] -2358; [0C DD, 05, 05] +1273; [64 F4, 05, 05] -2359; [0C DF, 05, 05] +1274; [64 F6, 05, 05] -235A; [0C E1, 05, 05] +1275; [64 F8, 05, 05] -235B; [0C E3, 05, 05] +1276; [64 FA, 05, 05] -235C; [0C E5, 05, 05] +1277; [64 FC, 05, 05] -235D; [0C E7, 05, 05] +1278; [64 FE, 05, 05] -235E; [0C E9, 05, 05] +1279; [65 05, 05, 05] -235F; [0C EB, 05, 05] +127A; [65 07, 05, 05] -2360; [0C ED, 05, 05] +127B; [65 09, 05, 05] -2361; [0C EF, 05, 05] +127C; [65 0B, 05, 05] -2362; [0C F1, 05, 05] +127D; [65 0D, 05, 05] -2363; [0C F3, 05, 05] +127E; [65 0F, 05, 05] -2364; [0C F5, 05, 05] +127F; [65 11, 05, 05] -2365; [0C F7, 05, 05] +1280; [65 13, 05, 05] -2366; [0C F9, 05, 05] +1281; [65 15, 05, 05] -2367; [0C FB, 05, 05] +1282; [65 17, 05, 05] -2368; [0C FD, 05, 05] +1283; [65 19, 05, 05] -2369; [0D 05, 05, 05] +1284; [65 1B, 05, 05] -236A; [0D 07, 05, 05] +1285; [65 1D, 05, 05] -236B; [0D 09, 05, 05] +1286; [65 1F, 05, 05] -236C; [0D 0B, 05, 05] +1288; [65 21, 05, 05] -236D; [0D 0D, 05, 05] +128A; [65 23, 05, 05] -236E; [0D 0F, 05, 05] +128B; [65 25, 05, 05] -236F; [0D 11, 05, 05] +128C; [65 27, 05, 05] -2370; [0D 13, 05, 05] +128D; [65 29, 05, 05] -2371; [0D 15, 05, 05] +1290; [65 2B, 05, 05] -2372; [0D 17, 05, 05] +1291; [65 2D, 05, 05] -2373; [0D 19, 05, 05] +1292; [65 2F, 05, 05] -2374; [0D 1B, 05, 05] +1293; [65 31, 05, 05] -2375; [0D 1D, 05, 05] +1294; [65 33, 05, 05] -2376; [0D 1F, 05, 05] +1295; [65 35, 05, 05] -2377; [0D 21, 05, 05] +1296; [65 37, 05, 05] -2378; [0D 23, 05, 05] +1297; [65 39, 05, 05] -2379; [0D 25, 05, 05] +1298; [65 3B, 05, 05] -237A; [0D 27, 05, 05] +1299; [65 3D, 05, 05] -237B; [0D 29, 05, 05] +129A; [65 3F, 05, 05] -237D; [0D 2B, 05, 05] +129B; [65 41, 05, 05] -237E; [0D 2D, 05, 05] +129C; [65 43, 05, 05] -237F; [0D 2F, 05, 05] +129D; [65 45, 05, 05] -2380; [0D 31, 05, 05] +129E; [65 47, 05, 05] -2381; [0D 33, 05, 05] +129F; [65 49, 05, 05] -2382; [0D 35, 05, 05] +12A0; [65 4B, 05, 05] -2383; [0D 37, 05, 05] +12A1; [65 4D, 05, 05] -2384; [0D 39, 05, 05] +12A2; [65 4F, 05, 05] -2385; [0D 3B, 05, 05] +12A3; [65 51, 05, 05] -2386; [0D 3D, 05, 05] +12A4; [65 53, 05, 05] -2387; [0D 3F, 05, 05] +12A5; [65 55, 05, 05] -2388; [0D 41, 05, 05] +12A6; [65 57, 05, 05] -2389; [0D 43, 05, 05] +12A7; [65 59, 05, 05] -238A; [0D 45, 05, 05] +12A8; [65 5B, 05, 05] -238B; [0D 47, 05, 05] +12A9; [65 5D, 05, 05] -238C; [0D 49, 05, 05] +12AA; [65 5F, 05, 05] -238D; [0D 4B, 05, 05] +12AB; [65 61, 05, 05] -238E; [0D 4D, 05, 05] +12AC; [65 63, 05, 05] -238F; [0D 4F, 05, 05] +12AD; [65 65, 05, 05] -2390; [0D 51, 05, 05] +12AE; [65 67, 05, 05] -2391; [0D 53, 05, 05] +12B0; [65 69, 05, 05] -2392; [0D 55, 05, 05] +12B2; [65 6B, 05, 05] -2393; [0D 57, 05, 05] +12B3; [65 6D, 05, 05] -2394; [0D 59, 05, 05] +12B4; [65 6F, 05, 05] -2395; [0D 5B, 05, 05] +12B5; [65 71, 05, 05] -2396; [0D 5D, 05, 05] +12B8; [65 73, 05, 05] -2397; [0D 5F, 05, 05] +12B9; [65 75, 05, 05] -2398; [0D 61, 05, 05] +12BA; [65 77, 05, 05] -2399; [0D 63, 05, 05] +12BB; [65 79, 05, 05] -239A; [0D 65, 05, 05] +12BC; [65 7B, 05, 05] -2400; [0D 67, 05, 05] +12BD; [65 7D, 05, 05] -2401; [0D 69, 05, 05] +12BE; [65 7F, 05, 05] -2402; [0D 6B, 05, 05] +12C0; [65 81, 05, 05] -2403; [0D 6D, 05, 05] +12C2; [65 83, 05, 05] -2404; [0D 6F, 05, 05] +12C3; [65 85, 05, 05] -2405; [0D 71, 05, 05] +12C4; [65 87, 05, 05] -2406; [0D 73, 05, 05] +12C5; [65 89, 05, 05] -2407; [0D 75, 05, 05] +12C8; [65 8B, 05, 05] -2408; [0D 77, 05, 05] +12C9; [65 8D, 05, 05] -2409; [0D 79, 05, 05] +12CA; [65 8F, 05, 05] -240A; [0D 7B, 05, 05] +12CB; [65 91, 05, 05] -240B; [0D 7D, 05, 05] +12CC; [65 93, 05, 05] -240C; [0D 7F, 05, 05] +12CD; [65 95, 05, 05] -240D; [0D 81, 05, 05] +12CE; [65 97, 05, 05] -240E; [0D 83, 05, 05] +12D0; [65 99, 05, 05] -240F; [0D 85, 05, 05] +12D1; [65 9B, 05, 05] -2410; [0D 87, 05, 05] +12D2; [65 9D, 05, 05] -2411; [0D 89, 05, 05] +12D3; [65 9F, 05, 05] -2412; [0D 8B, 05, 05] +12D4; [65 A1, 05, 05] -2413; [0D 8D, 05, 05] +12D5; [65 A3, 05, 05] -2414; [0D 8F, 05, 05] +12D6; [65 A5, 05, 05] -2415; [0D 91, 05, 05] +12D8; [65 A7, 05, 05] -2416; [0D 93, 05, 05] +12D9; [65 A9, 05, 05] -2417; [0D 95, 05, 05] +12DA; [65 AB, 05, 05] -2418; [0D 97, 05, 05] +12DB; [65 AD, 05, 05] -2419; [0D 99, 05, 05] +12DC; [65 AF, 05, 05] -241A; [0D 9B, 05, 05] +12DD; [65 B1, 05, 05] -241B; [0D 9D, 05, 05] +12DE; [65 B3, 05, 05] -241C; [0D 9F, 05, 05] +12DF; [65 B5, 05, 05] -241D; [0D A1, 05, 05] +12E0; [65 B7, 05, 05] -241E; [0D A3, 05, 05] +12E1; [65 B9, 05, 05] -241F; [0D A5, 05, 05] +12E2; [65 BB, 05, 05] -2420; [0D A7, 05, 05] +12E3; [65 BD, 05, 05] -2421; [0D A9, 05, 05] +12E4; [65 BF, 05, 05] -2422; [0D AB, 05, 05] +12E5; [65 C1, 05, 05] -2423; [0D AD, 05, 05] +12E6; [65 C3, 05, 05] -2424; [0D AF, 05, 05] +12E7; [65 C5, 05, 05] -2425; [0D B1, 05, 05] +12E8; [65 C7, 05, 05] -2426; [0D B3, 05, 05] +12E9; [65 C9, 05, 05] -2440; [0D B5, 05, 05] +12EA; [65 CB, 05, 05] -2441; [0D B7, 05, 05] +12EB; [65 CD, 05, 05] -2442; [0D B9, 05, 05] +12EC; [65 CF, 05, 05] -2443; [0D BB, 05, 05] +12ED; [65 D1, 05, 05] -2444; [0D BD, 05, 05] +12EE; [65 D3, 05, 05] -2445; [0D BF, 05, 05] +12F0; [65 D5, 05, 05] -2446; [0D C1, 05, 05] +12F1; [65 D7, 05, 05] -2447; [0D C3, 05, 05] +12F2; [65 D9, 05, 05] -2448; [0D C5, 05, 05] +12F3; [65 DB, 05, 05] -2449; [0D C7, 05, 05] +12F4; [65 DD, 05, 05] -244A; [0D C9, 05, 05] +12F5; [65 DF, 05, 05] -2500; [0D CB, 05, 05] +12F6; [65 E1, 05, 05] -2501; [0D CD, 05, 05] +12F7; [65 E3, 05, 05] -2502; [0D CF, 05, 05] -FFE8; [0D CF, 05, A3] +12F8; [65 E5, 05, 05] -2503; [0D D1, 05, 05] +12F9; [65 E7, 05, 05] -2504; [0D D3, 05, 05] +12FA; [65 E9, 05, 05] -2505; [0D D5, 05, 05] +12FB; [65 EB, 05, 05] -2506; [0D D7, 05, 05] +12FC; [65 ED, 05, 05] -2507; [0D D9, 05, 05] +12FD; [65 EF, 05, 05] -2508; [0D DB, 05, 05] +12FE; [65 F1, 05, 05] -2509; [0D DD, 05, 05] +12FF; [65 F3, 05, 05] -250A; [0D DF, 05, 05] +1300; [65 F5, 05, 05] -250B; [0D E1, 05, 05] +1301; [65 F7, 05, 05] -250C; [0D E3, 05, 05] +1302; [65 F9, 05, 05] -250D; [0D E5, 05, 05] +1303; [65 FB, 05, 05] -250E; [0D E7, 05, 05] +1304; [65 FD, 05, 05] -250F; [0D E9, 05, 05] +1305; [66 05, 05, 05] -2510; [0D EB, 05, 05] +1306; [66 07, 05, 05] -2511; [0D ED, 05, 05] +1307; [66 09, 05, 05] -2512; [0D EF, 05, 05] +1308; [66 0B, 05, 05] -2513; [0D F1, 05, 05] +1309; [66 0D, 05, 05] -2514; [0D F3, 05, 05] +130A; [66 0F, 05, 05] -2515; [0D F5, 05, 05] +130B; [66 11, 05, 05] -2516; [0D F7, 05, 05] +130C; [66 13, 05, 05] -2517; [0D F9, 05, 05] +130D; [66 15, 05, 05] -2518; [0D FB, 05, 05] +130E; [66 17, 05, 05] -2519; [0D FD, 05, 05] +1310; [66 19, 05, 05] -251A; [0E 05, 05, 05] +1312; [66 1B, 05, 05] -251B; [0E 07, 05, 05] +1313; [66 1D, 05, 05] -251C; [0E 09, 05, 05] +1314; [66 1F, 05, 05] -251D; [0E 0B, 05, 05] +1315; [66 21, 05, 05] -251E; [0E 0D, 05, 05] +1318; [66 23, 05, 05] -251F; [0E 0F, 05, 05] +1319; [66 25, 05, 05] -2520; [0E 11, 05, 05] +131A; [66 27, 05, 05] -2521; [0E 13, 05, 05] +131B; [66 29, 05, 05] -2522; [0E 15, 05, 05] +131C; [66 2B, 05, 05] -2523; [0E 17, 05, 05] +131D; [66 2D, 05, 05] -2524; [0E 19, 05, 05] +131E; [66 2F, 05, 05] -2525; [0E 1B, 05, 05] +1320; [66 31, 05, 05] -2526; [0E 1D, 05, 05] +1321; [66 33, 05, 05] -2527; [0E 1F, 05, 05] +1322; [66 35, 05, 05] -2528; [0E 21, 05, 05] +1323; [66 37, 05, 05] -2529; [0E 23, 05, 05] +1324; [66 39, 05, 05] -252A; [0E 25, 05, 05] +1325; [66 3B, 05, 05] -252B; [0E 27, 05, 05] +1326; [66 3D, 05, 05] -252C; [0E 29, 05, 05] +1327; [66 3F, 05, 05] -252D; [0E 2B, 05, 05] +1328; [66 41, 05, 05] -252E; [0E 2D, 05, 05] +1329; [66 43, 05, 05] -252F; [0E 2F, 05, 05] +132A; [66 45, 05, 05] -2530; [0E 31, 05, 05] +132B; [66 47, 05, 05] -2531; [0E 33, 05, 05] +132C; [66 49, 05, 05] -2532; [0E 35, 05, 05] +132D; [66 4B, 05, 05] -2533; [0E 37, 05, 05] +132E; [66 4D, 05, 05] -2534; [0E 39, 05, 05] +132F; [66 4F, 05, 05] -2535; [0E 3B, 05, 05] +1330; [66 51, 05, 05] -2536; [0E 3D, 05, 05] +1331; [66 53, 05, 05] -2537; [0E 3F, 05, 05] +1332; [66 55, 05, 05] -2538; [0E 41, 05, 05] +1333; [66 57, 05, 05] -2539; [0E 43, 05, 05] +1334; [66 59, 05, 05] -253A; [0E 45, 05, 05] +1335; [66 5B, 05, 05] -253B; [0E 47, 05, 05] +1336; [66 5D, 05, 05] -253C; [0E 49, 05, 05] +1337; [66 5F, 05, 05] -253D; [0E 4B, 05, 05] +1338; [66 61, 05, 05] -253E; [0E 4D, 05, 05] +1339; [66 63, 05, 05] -253F; [0E 4F, 05, 05] +133A; [66 65, 05, 05] -2540; [0E 51, 05, 05] +133B; [66 67, 05, 05] -2541; [0E 53, 05, 05] +133C; [66 69, 05, 05] -2542; [0E 55, 05, 05] +133D; [66 6B, 05, 05] -2543; [0E 57, 05, 05] +133E; [66 6D, 05, 05] -2544; [0E 59, 05, 05] +133F; [66 6F, 05, 05] -2545; [0E 5B, 05, 05] +1340; [66 71, 05, 05] -2546; [0E 5D, 05, 05] +1341; [66 73, 05, 05] -2547; [0E 5F, 05, 05] +1342; [66 75, 05, 05] -2548; [0E 61, 05, 05] +1343; [66 77, 05, 05] -2549; [0E 63, 05, 05] +1344; [66 79, 05, 05] -254A; [0E 65, 05, 05] +1345; [66 7B, 05, 05] -254B; [0E 67, 05, 05] +1346; [66 7D, 05, 05] -254C; [0E 69, 05, 05] +1348; [66 7F, 05, 05] -254D; [0E 6B, 05, 05] +1349; [66 81, 05, 05] -254E; [0E 6D, 05, 05] +134A; [66 83, 05, 05] -254F; [0E 6F, 05, 05] +134B; [66 85, 05, 05] -2550; [0E 71, 05, 05] +134C; [66 87, 05, 05] -2551; [0E 73, 05, 05] +134D; [66 89, 05, 05] -2552; [0E 75, 05, 05] +134E; [66 8B, 05, 05] -2553; [0E 77, 05, 05] +134F; [66 8D, 05, 05] -2554; [0E 79, 05, 05] +1350; [66 8F, 05, 05] -2555; [0E 7B, 05, 05] +1351; [66 91, 05, 05] -2556; [0E 7D, 05, 05] +1352; [66 93, 05, 05] -2557; [0E 7F, 05, 05] +1353; [66 95, 05, 05] -2558; [0E 81, 05, 05] +1354; [66 97, 05, 05] -2559; [0E 83, 05, 05] +1355; [66 99, 05, 05] -255A; [0E 85, 05, 05] +1356; [66 9B, 05, 05] -255B; [0E 87, 05, 05] +1357; [66 9D, 05, 05] -255C; [0E 89, 05, 05] +1358; [66 9F, 05, 05] -255D; [0E 8B, 05, 05] +1359; [66 A1, 05, 05] -255E; [0E 8D, 05, 05] +135A; [66 A3, 05, 05] -255F; [0E 8F, 05, 05] +0950; [67 20, 05, 05] -2560; [0E 91, 05, 05] +0904; [67 22, 05, 05] -2561; [0E 93, 05, 05] +0905; [67 24, 05, 05] -2562; [0E 95, 05, 05] +0906; [67 26, 05, 05] -2563; [0E 97, 05, 05] +0907; [67 28, 05, 05] -2564; [0E 99, 05, 05] +0908; [67 2A, 05, 05] -2565; [0E 9B, 05, 05] +0909; [67 2C, 05, 05] -2566; [0E 9D, 05, 05] +090A; [67 2E, 05, 05] -2567; [0E 9F, 05, 05] +090B; [67 30, 05, 05] -2568; [0E A1, 05, 05] +0960; [67 32, 05, 05] -2569; [0E A3, 05, 05] +090C; [67 34, 05, 05] -256A; [0E A5, 05, 05] +0961; [67 36, 05, 05] -256B; [0E A7, 05, 05] +090D; [67 38, 05, 05] -256C; [0E A9, 05, 05] +090E; [67 3A, 05, 05] -256D; [0E AB, 05, 05] +090F; [67 3C, 05, 05] -256E; [0E AD, 05, 05] +0910; [67 3E, 05, 05] -256F; [0E AF, 05, 05] +0911; [67 40, 05, 05] -2570; [0E B1, 05, 05] +0912; [67 42, 05, 05] -2571; [0E B3, 05, 05] +0913; [67 44, 05, 05] -2572; [0E B5, 05, 05] +0914; [67 46, 05, 05] -2573; [0E B7, 05, 05] +0915; [67 48, 05, 05] +0958; [67 48, 05, 05][, D7 69, 05] -2574; [0E B9, 05, 05] +0916; [67 4A, 05, 05] +0959; [67 4A, 05, 05][, D7 69, 05] -2575; [0E BB, 05, 05] +0917; [67 4C, 05, 05] +095A; [67 4C, 05, 05][, D7 69, 05] -2576; [0E BD, 05, 05] +0918; [67 4E, 05, 05] -2577; [0E BF, 05, 05] +0919; [67 50, 05, 05] -2578; [0E C1, 05, 05] +091A; [67 52, 05, 05] -2579; [0E C3, 05, 05] +091B; [67 54, 05, 05] -257A; [0E C5, 05, 05] +091C; [67 56, 05, 05] +095B; [67 56, 05, 05][, D7 69, 05] -257B; [0E C7, 05, 05] +091D; [67 58, 05, 05] -257C; [0E C9, 05, 05] +091E; [67 5A, 05, 05] -257D; [0E CB, 05, 05] +091F; [67 5C, 05, 05] -257E; [0E CD, 05, 05] +0920; [67 5E, 05, 05] -257F; [0E CF, 05, 05] +0921; [67 60, 05, 05] +095C; [67 60, 05, 05][, D7 69, 05] -2580; [0E D1, 05, 05] +0922; [67 62, 05, 05] +095D; [67 62, 05, 05][, D7 69, 05] -2581; [0E D3, 05, 05] +0923; [67 64, 05, 05] -2582; [0E D5, 05, 05] +0924; [67 66, 05, 05] -2583; [0E D7, 05, 05] +0925; [67 68, 05, 05] -2584; [0E D9, 05, 05] +0926; [67 6A, 05, 05] -2585; [0E DB, 05, 05] +0927; [67 6C, 05, 05] -2586; [0E DD, 05, 05] +0928; [67 6E, 05, 05] +0929; [67 6E, 05, 05][, D7 69, 05] -2587; [0E DF, 05, 05] +092A; [67 70, 05, 05] -2588; [0E E1, 05, 05] +092B; [67 72, 05, 05] +095E; [67 72, 05, 05][, D7 69, 05] -2589; [0E E3, 05, 05] +092C; [67 74, 05, 05] -258A; [0E E5, 05, 05] +092D; [67 76, 05, 05] -258B; [0E E7, 05, 05] +092E; [67 78, 05, 05] -258C; [0E E9, 05, 05] +092F; [67 7A, 05, 05] +095F; [67 7A, 05, 05][, D7 69, 05] -258D; [0E EB, 05, 05] +0930; [67 7C, 05, 05] +0931; [67 7C, 05, 05][, D7 69, 05] -258E; [0E ED, 05, 05] +0932; [67 7E, 05, 05] -258F; [0E EF, 05, 05] +0933; [67 80, 05, 05] +0934; [67 80, 05, 05][, D7 69, 05] -2590; [0E F1, 05, 05] +0935; [67 82, 05, 05] -2591; [0E F3, 05, 05] +0936; [67 84, 05, 05] -2592; [0E F5, 05, 05] +0937; [67 86, 05, 05] -2593; [0E F7, 05, 05] +0938; [67 88, 05, 05] -2594; [0E F9, 05, 05] +0939; [67 8A, 05, 05] -2595; [0E FB, 05, 05] +093D; [67 8C, 05, 05] -25A0; [0E FD, 05, 05] -FFED; [0E FD, 05, A3] +093E; [67 8E, 05, 05] -25A1; [0F 05, 05, 05] +093F; [67 90, 05, 05] -25A2; [0F 07, 05, 05] +0940; [67 92, 05, 05] -25A3; [0F 09, 05, 05] +0941; [67 94, 05, 05] -25A4; [0F 0B, 05, 05] +0942; [67 96, 05, 05] -25A5; [0F 0D, 05, 05] +0943; [67 98, 05, 05] -25A6; [0F 0F, 05, 05] +0944; [67 9A, 05, 05] -25A7; [0F 11, 05, 05] +0962; [67 9C, 05, 05] -25A8; [0F 13, 05, 05] +0963; [67 9E, 05, 05] -25A9; [0F 15, 05, 05] +0945; [67 A0, 05, 05] -25AA; [0F 17, 05, 05] +0946; [67 A2, 05, 05] -25AB; [0F 19, 05, 05] +0947; [67 A4, 05, 05] -25AC; [0F 1B, 05, 05] +0948; [67 A6, 05, 05] -25AD; [0F 1D, 05, 05] +0949; [67 A8, 05, 05] -25AE; [0F 1F, 05, 05] +094A; [67 AA, 05, 05] -25AF; [0F 21, 05, 05] +094B; [67 AC, 05, 05] -25B0; [0F 23, 05, 05] +094C; [67 AE, 05, 05] -25B1; [0F 25, 05, 05] +094D; [67 B0, 05, 05] -25B2; [0F 27, 05, 05] +0985; [68 20, 05, 05] -25B3; [0F 29, 05, 05] +0986; [68 22, 05, 05] -25B4; [0F 2B, 05, 05] +0987; [68 24, 05, 05] -25B5; [0F 2D, 05, 05] +0988; [68 26, 05, 05] -25B6; [0F 2F, 05, 05] +0989; [68 28, 05, 05] -25B7; [0F 31, 05, 05] +098A; [68 2A, 05, 05] -25B8; [0F 33, 05, 05] +098B; [68 2C, 05, 05] -25B9; [0F 35, 05, 05] +09E0; [68 2E, 05, 05] -25BA; [0F 37, 05, 05] +098C; [68 30, 05, 05] -25BB; [0F 39, 05, 05] +09E1; [68 32, 05, 05] -25BC; [0F 3B, 05, 05] +098F; [68 34, 05, 05] -25BD; [0F 3D, 05, 05] +0990; [68 36, 05, 05] -25BE; [0F 3F, 05, 05] +0993; [68 38, 05, 05] -25BF; [0F 41, 05, 05] +0994; [68 3A, 05, 05] -25C0; [0F 43, 05, 05] +0995; [68 3C, 05, 05] -25C1; [0F 45, 05, 05] +0996; [68 3E, 05, 05] -25C2; [0F 47, 05, 05] +0997; [68 40, 05, 05] -25C3; [0F 49, 05, 05] +0998; [68 42, 05, 05] -25C4; [0F 4B, 05, 05] +0999; [68 44, 05, 05] -25C5; [0F 4D, 05, 05] +099A; [68 46, 05, 05] -25C6; [0F 4F, 05, 05] +099B; [68 48, 05, 05] -25C7; [0F 51, 05, 05] +099C; [68 4A, 05, 05] -25C8; [0F 53, 05, 05] +099D; [68 4C, 05, 05] -25C9; [0F 55, 05, 05] +099E; [68 4E, 05, 05] -25CA; [0F 57, 05, 05] +099F; [68 50, 05, 05] -25CB; [0F 59, 05, 05] -FFEE; [0F 59, 05, A3] +09A0; [68 52, 05, 05] -25CC; [0F 5B, 05, 05] +09A1; [68 54, 05, 05] +09DC; [68 54, 05, 05][, D7 E9, 05] -25CD; [0F 5D, 05, 05] +09A2; [68 56, 05, 05] +09DD; [68 56, 05, 05][, D7 E9, 05] -25CE; [0F 5F, 05, 05] +09A3; [68 58, 05, 05] -25CF; [0F 61, 05, 05] +09A4; [68 5A, 05, 05] -25D0; [0F 63, 05, 05] +09A5; [68 5C, 05, 05] -25D1; [0F 65, 05, 05] +09A6; [68 5E, 05, 05] -25D2; [0F 67, 05, 05] +09A7; [68 60, 05, 05] -25D3; [0F 69, 05, 05] +09A8; [68 62, 05, 05] -25D4; [0F 6B, 05, 05] +09AA; [68 64, 05, 05] -25D5; [0F 6D, 05, 05] +09AB; [68 66, 05, 05] -25D6; [0F 6F, 05, 05] +09AC; [68 68, 05, 05] -25D7; [0F 71, 05, 05] +09AD; [68 6A, 05, 05] -25D8; [0F 73, 05, 05] +09AE; [68 6C, 05, 05] -25D9; [0F 75, 05, 05] +09AF; [68 6E, 05, 05] +09DF; [68 6E, 05, 05][, D7 E9, 05] -25DA; [0F 77, 05, 05] +09B0; [68 70, 05, 05] -25DB; [0F 79, 05, 05] +09F0; [68 72, 05, 05] -25DC; [0F 7B, 05, 05] +09B2; [68 74, 05, 05] -25DD; [0F 7D, 05, 05] +09F1; [68 76, 05, 05] -25DE; [0F 7F, 05, 05] +09B6; [68 78, 05, 05] -25DF; [0F 81, 05, 05] +09B7; [68 7A, 05, 05] -25E0; [0F 83, 05, 05] +09B8; [68 7C, 05, 05] -25E1; [0F 85, 05, 05] +09B9; [68 7E, 05, 05] -25E2; [0F 87, 05, 05] +09BD; [68 80, 05, 05] -25E3; [0F 89, 05, 05] +09BE; [68 82, 05, 05] -25E4; [0F 8B, 05, 05] +09BF; [68 84, 05, 05] -25E5; [0F 8D, 05, 05] +09C0; [68 86, 05, 05] -25E6; [0F 8F, 05, 05] +09C1; [68 88, 05, 05] -25E7; [0F 91, 05, 05] +09C2; [68 8A, 05, 05] -25E8; [0F 93, 05, 05] +09C3; [68 8C, 05, 05] -25E9; [0F 95, 05, 05] +09C4; [68 8E, 05, 05] -25EA; [0F 97, 05, 05] +09E2; [68 90, 05, 05] -25EB; [0F 99, 05, 05] +09E3; [68 92, 05, 05] -25EC; [0F 9B, 05, 05] +09C7; [68 94, 05, 05] -25ED; [0F 9D, 05, 05] +09C8; [68 96, 05, 05] -25EE; [0F 9F, 05, 05] +09C7 09BE; [68 98, 05, 05] +09CB; [68 98, 05, 05] -25EF; [0F A1, 05, 05] +09C7 09D7; [68 9A, 05, 05] +09CC; [68 9A, 05, 05] -25F0; [0F A3, 05, 05] +09CD; [68 9C, 05, 05] -25F1; [0F A5, 05, 05] +09D7; [68 9E, 05, 05] -25F2; [0F A7, 05, 05] +0A74; [69 20, 05, 05] -25F3; [0F A9, 05, 05] +0A73; [69 22, 05, 05] -25F4; [0F AB, 05, 05] +0A09; [69 24, 05, 05] -25F5; [0F AD, 05, 05] +0A0A; [69 26, 05, 05] -25F6; [0F AF, 05, 05] +0A13; [69 28, 05, 05] -25F7; [0F B1, 05, 05] +0A05; [69 2A, 05, 05] -2600; [0F B3, 05, 05] +0A06; [69 2C, 05, 05] -2601; [0F B5, 05, 05] +0A10; [69 2E, 05, 05] -2602; [0F B7, 05, 05] +0A14; [69 30, 05, 05] -2603; [0F B9, 05, 05] +0A72; [69 32, 05, 05] -2604; [0F BB, 05, 05] +0A07; [69 34, 05, 05] -2605; [0F BD, 05, 05] +0A08; [69 36, 05, 05] -2606; [0F BF, 05, 05] +0A0F; [69 38, 05, 05] -2607; [0F C1, 05, 05] +0A38; [69 3A, 05, 05] +0A36; [69 3A, 05, 05][, D8 2D, 05] -2608; [0F C3, 05, 05] +0A39; [69 3C, 05, 05] -2609; [0F C5, 05, 05] +0A15; [69 3E, 05, 05] -260A; [0F C7, 05, 05] +0A16; [69 40, 05, 05] +0A59; [69 40, 05, 05][, D8 2D, 05] -260B; [0F C9, 05, 05] +0A17; [69 42, 05, 05] +0A5A; [69 42, 05, 05][, D8 2D, 05] -260C; [0F CB, 05, 05] +0A18; [69 44, 05, 05] -260D; [0F CD, 05, 05] +0A19; [69 46, 05, 05] -260E; [0F CF, 05, 05] +0A1A; [69 48, 05, 05] -260F; [0F D1, 05, 05] +0A1B; [69 4A, 05, 05] -2610; [0F D3, 05, 05] +0A1C; [69 4C, 05, 05] +0A5B; [69 4C, 05, 05][, D8 2D, 05] -2611; [0F D5, 05, 05] +0A1D; [69 4E, 05, 05] -2612; [0F D7, 05, 05] +0A1E; [69 50, 05, 05] -2613; [0F D9, 05, 05] +0A1F; [69 52, 05, 05] -2619; [0F DB, 05, 05] +0A20; [69 54, 05, 05] -261A; [0F DD, 05, 05] +0A21; [69 56, 05, 05] -261B; [0F DF, 05, 05] +0A22; [69 58, 05, 05] -261C; [0F E1, 05, 05] +0A23; [69 5A, 05, 05] -261D; [0F E3, 05, 05] +0A24; [69 5C, 05, 05] -261E; [0F E5, 05, 05] +0A25; [69 5E, 05, 05] -261F; [0F E7, 05, 05] +0A26; [69 60, 05, 05] -2620; [0F E9, 05, 05] +0A27; [69 62, 05, 05] -2621; [0F EB, 05, 05] +0A28; [69 64, 05, 05] -2622; [0F ED, 05, 05] +0A2A; [69 66, 05, 05] -2623; [0F EF, 05, 05] +0A2B; [69 68, 05, 05] +0A5E; [69 68, 05, 05][, D8 2D, 05] -2624; [0F F1, 05, 05] +0A2C; [69 6A, 05, 05] -2625; [0F F3, 05, 05] +0A2D; [69 6C, 05, 05] -2626; [0F F5, 05, 05] +0A2E; [69 6E, 05, 05] -2627; [0F F7, 05, 05] +0A2F; [69 70, 05, 05] -2628; [0F F9, 05, 05] +0A30; [69 72, 05, 05] -2629; [0F FB, 05, 05] +0A32; [69 74, 05, 05] +0A33; [69 74, 05, 05][, D8 2D, 05] -262A; [0F FD, 05, 05] +0A35; [69 76, 05, 05] -262B; [10 05, 05, 05] +0A5C; [69 78, 05, 05] -262C; [10 07, 05, 05] +0A3E; [69 7A, 05, 05] -262D; [10 09, 05, 05] +0A3F; [69 7C, 05, 05] -262E; [10 0B, 05, 05] +0A40; [69 7E, 05, 05] -262F; [10 0D, 05, 05] +0A41; [69 80, 05, 05] -2630; [10 0F, 05, 05] +0A42; [69 82, 05, 05] -2631; [10 11, 05, 05] +0A47; [69 84, 05, 05] -2632; [10 13, 05, 05] +0A48; [69 86, 05, 05] -2633; [10 15, 05, 05] +0A4B; [69 88, 05, 05] -2634; [10 17, 05, 05] +0A4C; [69 8A, 05, 05] -2635; [10 19, 05, 05] +0A4D; [69 8C, 05, 05] -2636; [10 1B, 05, 05] +0AD0; [6A 20, 05, 05] -2637; [10 1D, 05, 05] +0A85; [6A 22, 05, 05] -2638; [10 1F, 05, 05] +0A86; [6A 24, 05, 05] -2639; [10 21, 05, 05] +0A87; [6A 26, 05, 05] -263A; [10 23, 05, 05] +0A88; [6A 28, 05, 05] -263B; [10 25, 05, 05] +0A89; [6A 2A, 05, 05] -263C; [10 27, 05, 05] +0A8A; [6A 2C, 05, 05] -263D; [10 29, 05, 05] +0A8B; [6A 2E, 05, 05] -263E; [10 2B, 05, 05] +0AE0; [6A 30, 05, 05] -263F; [10 2D, 05, 05] +0A8C; [6A 32, 05, 05] -2640; [10 2F, 05, 05] +0AE1; [6A 34, 05, 05] -2641; [10 31, 05, 05] +0A8D; [6A 36, 05, 05] -2642; [10 33, 05, 05] +0A8F; [6A 38, 05, 05] -2643; [10 35, 05, 05] +0A90; [6A 3A, 05, 05] -2644; [10 37, 05, 05] +0A91; [6A 3C, 05, 05] -2645; [10 39, 05, 05] +0A93; [6A 3E, 05, 05] -2646; [10 3B, 05, 05] +0A94; [6A 40, 05, 05] -2647; [10 3D, 05, 05] +0A95; [6A 42, 05, 05] -2648; [10 3F, 05, 05] +0A96; [6A 44, 05, 05] -2649; [10 41, 05, 05] +0A97; [6A 46, 05, 05] -264A; [10 43, 05, 05] +0A98; [6A 48, 05, 05] -264B; [10 45, 05, 05] +0A99; [6A 4A, 05, 05] -264C; [10 47, 05, 05] +0A9A; [6A 4C, 05, 05] -264D; [10 49, 05, 05] +0A9B; [6A 4E, 05, 05] -264E; [10 4B, 05, 05] +0A9C; [6A 50, 05, 05] -264F; [10 4D, 05, 05] +0A9D; [6A 52, 05, 05] -2650; [10 4F, 05, 05] +0A9E; [6A 54, 05, 05] -2651; [10 51, 05, 05] +0A9F; [6A 56, 05, 05] -2652; [10 53, 05, 05] +0AA0; [6A 58, 05, 05] -2653; [10 55, 05, 05] +0AA1; [6A 5A, 05, 05] -2654; [10 57, 05, 05] +0AA2; [6A 5C, 05, 05] -2655; [10 59, 05, 05] +0AA3; [6A 5E, 05, 05] -2656; [10 5B, 05, 05] +0AA4; [6A 60, 05, 05] -2657; [10 5D, 05, 05] +0AA5; [6A 62, 05, 05] -2658; [10 5F, 05, 05] +0AA6; [6A 64, 05, 05] -2659; [10 61, 05, 05] +0AA7; [6A 66, 05, 05] -265A; [10 63, 05, 05] +0AA8; [6A 68, 05, 05] -265B; [10 65, 05, 05] +0AAA; [6A 6A, 05, 05] -265C; [10 67, 05, 05] +0AAB; [6A 6C, 05, 05] -265D; [10 69, 05, 05] +0AAC; [6A 6E, 05, 05] -265E; [10 6B, 05, 05] +0AAD; [6A 70, 05, 05] -265F; [10 6D, 05, 05] +0AAE; [6A 72, 05, 05] -2660; [10 6F, 05, 05] +0AAF; [6A 74, 05, 05] -2661; [10 71, 05, 05] +0AB0; [6A 76, 05, 05] -2662; [10 73, 05, 05] +0AB2; [6A 78, 05, 05] -2663; [10 75, 05, 05] +0AB3; [6A 7A, 05, 05] -2664; [10 77, 05, 05] +0AB5; [6A 7C, 05, 05] -2665; [10 79, 05, 05] +0AB6; [6A 7E, 05, 05] -2666; [10 7B, 05, 05] +0AB7; [6A 80, 05, 05] -2667; [10 7D, 05, 05] +0AB8; [6A 82, 05, 05] -2668; [10 7F, 05, 05] +0AB9; [6A 84, 05, 05] -2669; [10 81, 05, 05] +0ABD; [6A 86, 05, 05] -266A; [10 83, 05, 05] +0ABE; [6A 88, 05, 05] -266B; [10 85, 05, 05] +0ABF; [6A 8A, 05, 05] -266C; [10 87, 05, 05] +0AC0; [6A 8C, 05, 05] -2670; [10 89, 05, 05] +0AC1; [6A 8E, 05, 05] -2671; [10 8B, 05, 05] +0AC2; [6A 90, 05, 05] -2701; [10 8D, 05, 05] +0AC3; [6A 92, 05, 05] -2702; [10 8F, 05, 05] +0AC4; [6A 94, 05, 05] -2703; [10 91, 05, 05] +0AE2; [6A 96, 05, 05] -2704; [10 93, 05, 05] +0AE3; [6A 98, 05, 05] -2706; [10 95, 05, 05] +0AC5; [6A 9A, 05, 05] -2707; [10 97, 05, 05] +0AC7; [6A 9C, 05, 05] -2708; [10 99, 05, 05] +0AC8; [6A 9E, 05, 05] -2709; [10 9B, 05, 05] +0AC9; [6A A0, 05, 05] -270C; [10 9D, 05, 05] +0ACB; [6A A2, 05, 05] -270D; [10 9F, 05, 05] +0ACC; [6A A4, 05, 05] -270E; [10 A1, 05, 05] +0ACD; [6A A6, 05, 05] -270F; [10 A3, 05, 05] +0B05; [6B 20, 05, 05] -2710; [10 A5, 05, 05] +0B06; [6B 22, 05, 05] -2711; [10 A7, 05, 05] +0B07; [6B 24, 05, 05] -2712; [10 A9, 05, 05] +0B08; [6B 26, 05, 05] -2713; [10 AB, 05, 05] +0B09; [6B 28, 05, 05] -2714; [10 AD, 05, 05] +0B0A; [6B 2A, 05, 05] -2715; [10 AF, 05, 05] +0B0B; [6B 2C, 05, 05] -2716; [10 B1, 05, 05] +0B60; [6B 2E, 05, 05] -2717; [10 B3, 05, 05] +0B0C; [6B 30, 05, 05] -2718; [10 B5, 05, 05] +0B61; [6B 32, 05, 05] -2719; [10 B7, 05, 05] +0B0F; [6B 34, 05, 05] -271A; [10 B9, 05, 05] +0B10; [6B 36, 05, 05] -271B; [10 BB, 05, 05] +0B13; [6B 38, 05, 05] -271C; [10 BD, 05, 05] +0B14; [6B 3A, 05, 05] -271D; [10 BF, 05, 05] +0B15; [6B 3C, 05, 05] -271E; [10 C1, 05, 05] +0B16; [6B 3E, 05, 05] -271F; [10 C3, 05, 05] +0B17; [6B 40, 05, 05] -2720; [10 C5, 05, 05] +0B18; [6B 42, 05, 05] -2721; [10 C7, 05, 05] +0B19; [6B 44, 05, 05] -2722; [10 C9, 05, 05] +0B1A; [6B 46, 05, 05] -2723; [10 CB, 05, 05] +0B1B; [6B 48, 05, 05] -2724; [10 CD, 05, 05] +0B1C; [6B 4A, 05, 05] -2725; [10 CF, 05, 05] +0B1D; [6B 4C, 05, 05] -2726; [10 D1, 05, 05] +0B1E; [6B 4E, 05, 05] -2727; [10 D3, 05, 05] +0B1F; [6B 50, 05, 05] -2729; [10 D5, 05, 05] +0B20; [6B 52, 05, 05] -272A; [10 D7, 05, 05] +0B21; [6B 54, 05, 05] +0B5C; [6B 54, 05, 05][, D8 CD, 05] -272B; [10 D9, 05, 05] +0B22; [6B 56, 05, 05] +0B5D; [6B 56, 05, 05][, D8 CD, 05] -272C; [10 DB, 05, 05] +0B23; [6B 58, 05, 05] -272D; [10 DD, 05, 05] +0B24; [6B 5A, 05, 05] -272E; [10 DF, 05, 05] +0B25; [6B 5C, 05, 05] -272F; [10 E1, 05, 05] +0B26; [6B 5E, 05, 05] -2730; [10 E3, 05, 05] +0B27; [6B 60, 05, 05] -2731; [10 E5, 05, 05] +0B28; [6B 62, 05, 05] -2732; [10 E7, 05, 05] +0B2A; [6B 64, 05, 05] -2733; [10 E9, 05, 05] +0B2B; [6B 66, 05, 05] -2734; [10 EB, 05, 05] +0B2C; [6B 68, 05, 05] -2735; [10 ED, 05, 05] +0B2D; [6B 6A, 05, 05] -2736; [10 EF, 05, 05] +0B2E; [6B 6C, 05, 05] -2737; [10 F1, 05, 05] +0B2F; [6B 6E, 05, 05] -2738; [10 F3, 05, 05] +0B5F; [6B 70, 05, 05] -2739; [10 F5, 05, 05] +0B30; [6B 72, 05, 05] -273A; [10 F7, 05, 05] +0B32; [6B 74, 05, 05] -273B; [10 F9, 05, 05] +0B33; [6B 76, 05, 05] -273C; [10 FB, 05, 05] +0B35; [6B 78, 05, 05] -273D; [10 FD, 05, 05] +0B71; [6B 7A, 05, 05] -273E; [11 05, 05, 05] +0B36; [6B 7C, 05, 05] -273F; [11 07, 05, 05] +0B37; [6B 7E, 05, 05] -2740; [11 09, 05, 05] +0B38; [6B 80, 05, 05] -2741; [11 0B, 05, 05] +0B39; [6B 82, 05, 05] -2742; [11 0D, 05, 05] +0B3D; [6B 84, 05, 05] -2743; [11 0F, 05, 05] +0B3E; [6B 86, 05, 05] -2744; [11 11, 05, 05] +0B3F; [6B 88, 05, 05] -2745; [11 13, 05, 05] +0B40; [6B 8A, 05, 05] -2746; [11 15, 05, 05] +0B41; [6B 8C, 05, 05] -2747; [11 17, 05, 05] +0B42; [6B 8E, 05, 05] -2748; [11 19, 05, 05] +0B43; [6B 90, 05, 05] -2749; [11 1B, 05, 05] +0B47; [6B 92, 05, 05] -274A; [11 1D, 05, 05] +0B47 0B56; [6B 94, 05, 05] +0B48; [6B 94, 05, 05] -274B; [11 1F, 05, 05] +0B47 0B3E; [6B 96, 05, 05] +0B4B; [6B 96, 05, 05] -274D; [11 21, 05, 05] +0B47 0B57; [6B 98, 05, 05] +0B4C; [6B 98, 05, 05] -274F; [11 23, 05, 05] +0B4D; [6B 9A, 05, 05] -2750; [11 25, 05, 05] +0B56; [6B 9C, 05, 05] -2751; [11 27, 05, 05] +0B57; [6B 9E, 05, 05] -2752; [11 29, 05, 05] +0B83; [6C 20, 05, 05] -2756; [11 2B, 05, 05] +0B85; [6C 22, 05, 05] -2758; [11 2D, 05, 05] +0B86; [6C 24, 05, 05] -2759; [11 2F, 05, 05] +0B87; [6C 26, 05, 05] -275A; [11 31, 05, 05] +0B88; [6C 28, 05, 05] -275B; [11 33, 05, 05] +0B89; [6C 2A, 05, 05] -275C; [11 35, 05, 05] +0B8A; [6C 2C, 05, 05] -275D; [11 37, 05, 05] +0B8E; [6C 2E, 05, 05] -275E; [11 39, 05, 05] +0B8F; [6C 30, 05, 05] -2761; [11 3B, 05, 05] +0B90; [6C 32, 05, 05] -2762; [11 3D, 05, 05] +0B92; [6C 34, 05, 05] -2763; [11 3F, 05, 05] +0B93; [6C 36, 05, 05] -2764; [11 41, 05, 05] +0B92 0BD7; [6C 38, 05, 05] +0B94; [6C 38, 05, 05] -2765; [11 43, 05, 05] +0B95; [6C 3A, 05, 05] -2766; [11 45, 05, 05] +0B99; [6C 3C, 05, 05] -2767; [11 47, 05, 05] +0B9A; [6C 3E, 05, 05] -277F; [11 49, 05, 05] +0B9C; [6C 40, 05, 05] -2789; [11 4B, 05, 05] +0B9E; [6C 42, 05, 05] -2793; [11 4D, 05, 05] +0B9F; [6C 44, 05, 05] -2794; [11 4F, 05, 05] +0BA3; [6C 46, 05, 05] -2798; [11 51, 05, 05] +0BA4; [6C 48, 05, 05] -2799; [11 53, 05, 05] +0BA8; [6C 4A, 05, 05] -279A; [11 55, 05, 05] +0BA9; [6C 4C, 05, 05] -279B; [11 57, 05, 05] +0BAA; [6C 4E, 05, 05] -279C; [11 59, 05, 05] +0BAE; [6C 50, 05, 05] -279D; [11 5B, 05, 05] +0BAF; [6C 52, 05, 05] -279E; [11 5D, 05, 05] +0BB0; [6C 54, 05, 05] -279F; [11 5F, 05, 05] +0BB1; [6C 56, 05, 05] -27A0; [11 61, 05, 05] +0BB2; [6C 58, 05, 05] -27A1; [11 63, 05, 05] +0BB3; [6C 5A, 05, 05] -27A2; [11 65, 05, 05] +0BB4; [6C 5C, 05, 05] -27A3; [11 67, 05, 05] +0BB5; [6C 5E, 05, 05] -27A4; [11 69, 05, 05] +0BB7; [6C 60, 05, 05] -27A5; [11 6B, 05, 05] +0BB8; [6C 62, 05, 05] -27A6; [11 6D, 05, 05] +0BB9; [6C 64, 05, 05] -27A7; [11 6F, 05, 05] +0BBE; [6C 66, 05, 05] -27A8; [11 71, 05, 05] +0BBF; [6C 68, 05, 05] -27A9; [11 73, 05, 05] +0BC0; [6C 6A, 05, 05] -27AA; [11 75, 05, 05] +0BC1; [6C 6C, 05, 05] -27AB; [11 77, 05, 05] +0BC2; [6C 6E, 05, 05] -27AC; [11 79, 05, 05] +0BC6; [6C 70, 05, 05] -27AD; [11 7B, 05, 05] +0BC7; [6C 72, 05, 05] -27AE; [11 7D, 05, 05] +0BC8; [6C 74, 05, 05] -27AF; [11 7F, 05, 05] +0BC6 0BBE; [6C 76, 05, 05] +0BCA; [6C 76, 05, 05] -27B1; [11 81, 05, 05] +0BC7 0BBE; [6C 78, 05, 05] +0BCB; [6C 78, 05, 05] -27B2; [11 83, 05, 05] +0BC6 0BD7; [6C 7A, 05, 05] +0BCC; [6C 7A, 05, 05] -27B3; [11 85, 05, 05] +0BCD; [6C 7C, 05, 05] -27B4; [11 87, 05, 05] +0BD7; [6C 7E, 05, 05] -27B5; [11 89, 05, 05] +0C05; [6D 20, 05, 05] -27B6; [11 8B, 05, 05] +0C06; [6D 22, 05, 05] -27B7; [11 8D, 05, 05] +0C07; [6D 24, 05, 05] -27B8; [11 8F, 05, 05] +0C08; [6D 26, 05, 05] -27B9; [11 91, 05, 05] +0C09; [6D 28, 05, 05] -27BA; [11 93, 05, 05] +0C0A; [6D 2A, 05, 05] -27BB; [11 95, 05, 05] +0C0B; [6D 2C, 05, 05] -27BC; [11 97, 05, 05] +0C60; [6D 2E, 05, 05] -27BD; [11 99, 05, 05] +0C0C; [6D 30, 05, 05] -27BE; [11 9B, 05, 05] +0C61; [6D 32, 05, 05] -2800; [11 9D, 05, 05] +0C0E; [6D 34, 05, 05] -2801; [11 9F, 05, 05] +0C0F; [6D 36, 05, 05] -2802; [11 A1, 05, 05] +0C10; [6D 38, 05, 05] -2803; [11 A3, 05, 05] +0C12; [6D 3A, 05, 05] -2804; [11 A5, 05, 05] +0C13; [6D 3C, 05, 05] -2805; [11 A7, 05, 05] +0C14; [6D 3E, 05, 05] -2806; [11 A9, 05, 05] +0C15; [6D 40, 05, 05] -2807; [11 AB, 05, 05] +0C16; [6D 42, 05, 05] -2808; [11 AD, 05, 05] +0C17; [6D 44, 05, 05] -2809; [11 AF, 05, 05] +0C18; [6D 46, 05, 05] -280A; [11 B1, 05, 05] +0C19; [6D 48, 05, 05] -280B; [11 B3, 05, 05] +0C1A; [6D 4A, 05, 05] -280C; [11 B5, 05, 05] +0C1B; [6D 4C, 05, 05] -280D; [11 B7, 05, 05] +0C1C; [6D 4E, 05, 05] -280E; [11 B9, 05, 05] +0C1D; [6D 50, 05, 05] -280F; [11 BB, 05, 05] +0C1E; [6D 52, 05, 05] -2810; [11 BD, 05, 05] +0C1F; [6D 54, 05, 05] -2811; [11 BF, 05, 05] +0C20; [6D 56, 05, 05] -2812; [11 C1, 05, 05] +0C21; [6D 58, 05, 05] -2813; [11 C3, 05, 05] +0C22; [6D 5A, 05, 05] -2814; [11 C5, 05, 05] +0C23; [6D 5C, 05, 05] -2815; [11 C7, 05, 05] +0C24; [6D 5E, 05, 05] -2816; [11 C9, 05, 05] +0C25; [6D 60, 05, 05] -2817; [11 CB, 05, 05] +0C26; [6D 62, 05, 05] -2818; [11 CD, 05, 05] +0C27; [6D 64, 05, 05] -2819; [11 CF, 05, 05] +0C28; [6D 66, 05, 05] -281A; [11 D1, 05, 05] +0C2A; [6D 68, 05, 05] -281B; [11 D3, 05, 05] +0C2B; [6D 6A, 05, 05] -281C; [11 D5, 05, 05] +0C2C; [6D 6C, 05, 05] -281D; [11 D7, 05, 05] +0C2D; [6D 6E, 05, 05] -281E; [11 D9, 05, 05] +0C2E; [6D 70, 05, 05] -281F; [11 DB, 05, 05] +0C2F; [6D 72, 05, 05] -2820; [11 DD, 05, 05] +0C30; [6D 74, 05, 05] -2821; [11 DF, 05, 05] +0C31; [6D 76, 05, 05] -2822; [11 E1, 05, 05] +0C32; [6D 78, 05, 05] -2823; [11 E3, 05, 05] +0C33; [6D 7A, 05, 05] -2824; [11 E5, 05, 05] +0C35; [6D 7C, 05, 05] -2825; [11 E7, 05, 05] +0C36; [6D 7E, 05, 05] -2826; [11 E9, 05, 05] +0C37; [6D 80, 05, 05] -2827; [11 EB, 05, 05] +0C38; [6D 82, 05, 05] -2828; [11 ED, 05, 05] +0C39; [6D 84, 05, 05] -2829; [11 EF, 05, 05] +0C3E; [6D 86, 05, 05] -282A; [11 F1, 05, 05] +0C3F; [6D 88, 05, 05] -282B; [11 F3, 05, 05] +0C40; [6D 8A, 05, 05] -282C; [11 F5, 05, 05] +0C41; [6D 8C, 05, 05] -282D; [11 F7, 05, 05] +0C42; [6D 8E, 05, 05] -282E; [11 F9, 05, 05] +0C43; [6D 90, 05, 05] -282F; [11 FB, 05, 05] +0C44; [6D 92, 05, 05] -2830; [11 FD, 05, 05] +0C46; [6D 94, 05, 05] -2831; [12 05, 05, 05] +0C47; [6D 96, 05, 05] -2832; [12 07, 05, 05] +0C46 0C56; [6D 98, 05, 05] +0C48; [6D 98, 05, 05] -2833; [12 09, 05, 05] +0C4A; [6D 9A, 05, 05] -2834; [12 0B, 05, 05] +0C4B; [6D 9C, 05, 05] -2835; [12 0D, 05, 05] +0C4C; [6D 9E, 05, 05] -2836; [12 0F, 05, 05] +0C4D; [6D A0, 05, 05] -2837; [12 11, 05, 05] +0C55; [6D A2, 05, 05] -2838; [12 13, 05, 05] +0C56; [6D A4, 05, 05] -2839; [12 15, 05, 05] +0C85; [6E 20, 05, 05] -283A; [12 17, 05, 05] +0C86; [6E 22, 05, 05] -283B; [12 19, 05, 05] +0C87; [6E 24, 05, 05] -283C; [12 1B, 05, 05] +0C88; [6E 26, 05, 05] -283D; [12 1D, 05, 05] +0C89; [6E 28, 05, 05] -283E; [12 1F, 05, 05] +0C8A; [6E 2A, 05, 05] -283F; [12 21, 05, 05] +0C8B; [6E 2C, 05, 05] -2840; [12 23, 05, 05] +0CE0; [6E 2E, 05, 05] -2841; [12 25, 05, 05] +0C8C; [6E 30, 05, 05] -2842; [12 27, 05, 05] +0CE1; [6E 32, 05, 05] -2843; [12 29, 05, 05] +0C8E; [6E 34, 05, 05] -2844; [12 2B, 05, 05] +0C8F; [6E 36, 05, 05] -2845; [12 2D, 05, 05] +0C90; [6E 38, 05, 05] -2846; [12 2F, 05, 05] +0C92; [6E 3A, 05, 05] -2847; [12 31, 05, 05] +0C93; [6E 3C, 05, 05] -2848; [12 33, 05, 05] +0C94; [6E 3E, 05, 05] -2849; [12 35, 05, 05] +0C95; [6E 40, 05, 05] -284A; [12 37, 05, 05] +0C96; [6E 42, 05, 05] -284B; [12 39, 05, 05] +0C97; [6E 44, 05, 05] -284C; [12 3B, 05, 05] +0C98; [6E 46, 05, 05] -284D; [12 3D, 05, 05] +0C99; [6E 48, 05, 05] -284E; [12 3F, 05, 05] +0C9A; [6E 4A, 05, 05] -284F; [12 41, 05, 05] +0C9B; [6E 4C, 05, 05] -2850; [12 43, 05, 05] +0C9C; [6E 4E, 05, 05] -2851; [12 45, 05, 05] +0C9D; [6E 50, 05, 05] -2852; [12 47, 05, 05] +0C9E; [6E 52, 05, 05] -2853; [12 49, 05, 05] +0C9F; [6E 54, 05, 05] -2854; [12 4B, 05, 05] +0CA0; [6E 56, 05, 05] -2855; [12 4D, 05, 05] +0CA1; [6E 58, 05, 05] -2856; [12 4F, 05, 05] +0CA2; [6E 5A, 05, 05] -2857; [12 51, 05, 05] +0CA3; [6E 5C, 05, 05] -2858; [12 53, 05, 05] +0CA4; [6E 5E, 05, 05] -2859; [12 55, 05, 05] +0CA5; [6E 60, 05, 05] -285A; [12 57, 05, 05] +0CA6; [6E 62, 05, 05] -285B; [12 59, 05, 05] +0CA7; [6E 64, 05, 05] -285C; [12 5B, 05, 05] +0CA8; [6E 66, 05, 05] -285D; [12 5D, 05, 05] +0CAA; [6E 68, 05, 05] -285E; [12 5F, 05, 05] +0CAB; [6E 6A, 05, 05] -285F; [12 61, 05, 05] +0CAC; [6E 6C, 05, 05] -2860; [12 63, 05, 05] +0CAD; [6E 6E, 05, 05] -2861; [12 65, 05, 05] +0CAE; [6E 70, 05, 05] -2862; [12 67, 05, 05] +0CAF; [6E 72, 05, 05] -2863; [12 69, 05, 05] +0CB0; [6E 74, 05, 05] -2864; [12 6B, 05, 05] +0CB1; [6E 76, 05, 05] -2865; [12 6D, 05, 05] +0CB2; [6E 78, 05, 05] -2866; [12 6F, 05, 05] +0CB5; [6E 7A, 05, 05] -2867; [12 71, 05, 05] +0CB6; [6E 7C, 05, 05] -2868; [12 73, 05, 05] +0CB7; [6E 7E, 05, 05] -2869; [12 75, 05, 05] +0CB8; [6E 80, 05, 05] -286A; [12 77, 05, 05] +0CB9; [6E 82, 05, 05] -286B; [12 79, 05, 05] +0CBD; [6E 84, 05, 05] -286C; [12 7B, 05, 05] +0CB3; [6E 86, 05, 05] -286D; [12 7D, 05, 05] +0CDE; [6E 88, 05, 05] -286E; [12 7F, 05, 05] +0CBE; [6E 8A, 05, 05] -286F; [12 81, 05, 05] +0CBF; [6E 8C, 05, 05] -2870; [12 83, 05, 05] +0CBF 0CD5; [6E 8E, 05, 05] +0CC0; [6E 8E, 05, 05] -2871; [12 85, 05, 05] +0CC1; [6E 90, 05, 05] -2872; [12 87, 05, 05] +0CC2; [6E 92, 05, 05] -2873; [12 89, 05, 05] +0CC3; [6E 94, 05, 05] -2874; [12 8B, 05, 05] +0CC4; [6E 96, 05, 05] -2875; [12 8D, 05, 05] +0CC6; [6E 98, 05, 05] -2876; [12 8F, 05, 05] +0CC6 0CD5; [6E 9A, 05, 05] +0CC7; [6E 9A, 05, 05] -2877; [12 91, 05, 05] +0CC6 0CD6; [6E 9C, 05, 05] +0CC8; [6E 9C, 05, 05] -2878; [12 93, 05, 05] +0CC6 0CC2; [6E 9E, 05, 05] +0CCA; [6E 9E, 05, 05] -2879; [12 95, 05, 05] +0CC6 0CC2 0CD5; [6E A0, 05, 05] +0CCA 0CD5; [6E A0, 05, 05] +0CCB; [6E A0, 05, 05] -287A; [12 97, 05, 05] +0CCC; [6E A2, 05, 05] -287B; [12 99, 05, 05] +0CCD; [6E A4, 05, 05] -287C; [12 9B, 05, 05] +0CD5; [6E A6, 05, 05] -287D; [12 9D, 05, 05] +0CD6; [6E A8, 05, 05] -287E; [12 9F, 05, 05] +0D05; [6F 20, 05, 05] -287F; [12 A1, 05, 05] +0D06; [6F 22, 05, 05] -2880; [12 A3, 05, 05] +0D07; [6F 24, 05, 05] -2881; [12 A5, 05, 05] +0D08; [6F 26, 05, 05] -2882; [12 A7, 05, 05] +0D09; [6F 28, 05, 05] -2883; [12 A9, 05, 05] +0D0A; [6F 2A, 05, 05] -2884; [12 AB, 05, 05] +0D0B; [6F 2C, 05, 05] -2885; [12 AD, 05, 05] +0D60; [6F 2E, 05, 05] -2886; [12 AF, 05, 05] +0D0C; [6F 30, 05, 05] -2887; [12 B1, 05, 05] +0D61; [6F 32, 05, 05] -2888; [12 B3, 05, 05] +0D0E; [6F 34, 05, 05] -2889; [12 B5, 05, 05] +0D0F; [6F 36, 05, 05] -288A; [12 B7, 05, 05] +0D10; [6F 38, 05, 05] -288B; [12 B9, 05, 05] +0D12; [6F 3A, 05, 05] -288C; [12 BB, 05, 05] +0D13; [6F 3C, 05, 05] -288D; [12 BD, 05, 05] +0D14; [6F 3E, 05, 05] -288E; [12 BF, 05, 05] +0D15; [6F 40, 05, 05] -288F; [12 C1, 05, 05] +0D16; [6F 42, 05, 05] -2890; [12 C3, 05, 05] +0D17; [6F 44, 05, 05] -2891; [12 C5, 05, 05] +0D18; [6F 46, 05, 05] -2892; [12 C7, 05, 05] +0D19; [6F 48, 05, 05] -2893; [12 C9, 05, 05] +0D1A; [6F 4A, 05, 05] -2894; [12 CB, 05, 05] +0D1B; [6F 4C, 05, 05] -2895; [12 CD, 05, 05] +0D1C; [6F 4E, 05, 05] -2896; [12 CF, 05, 05] +0D1D; [6F 50, 05, 05] -2897; [12 D1, 05, 05] +0D1E; [6F 52, 05, 05] -2898; [12 D3, 05, 05] +0D1F; [6F 54, 05, 05] -2899; [12 D5, 05, 05] +0D20; [6F 56, 05, 05] -289A; [12 D7, 05, 05] +0D21; [6F 58, 05, 05] -289B; [12 D9, 05, 05] +0D22; [6F 5A, 05, 05] -289C; [12 DB, 05, 05] +0D23; [6F 5C, 05, 05] -289D; [12 DD, 05, 05] +0D24; [6F 5E, 05, 05] -289E; [12 DF, 05, 05] +0D25; [6F 60, 05, 05] -289F; [12 E1, 05, 05] +0D26; [6F 62, 05, 05] -28A0; [12 E3, 05, 05] +0D27; [6F 64, 05, 05] -28A1; [12 E5, 05, 05] +0D28; [6F 66, 05, 05] -28A2; [12 E7, 05, 05] +0D2A; [6F 68, 05, 05] -28A3; [12 E9, 05, 05] +0D2B; [6F 6A, 05, 05] -28A4; [12 EB, 05, 05] +0D2C; [6F 6C, 05, 05] -28A5; [12 ED, 05, 05] +0D2D; [6F 6E, 05, 05] -28A6; [12 EF, 05, 05] +0D2E; [6F 70, 05, 05] -28A7; [12 F1, 05, 05] +0D2F; [6F 72, 05, 05] -28A8; [12 F3, 05, 05] +0D30; [6F 74, 05, 05] -28A9; [12 F5, 05, 05] +0D31; [6F 76, 05, 05] -28AA; [12 F7, 05, 05] +0D32; [6F 78, 05, 05] -28AB; [12 F9, 05, 05] +0D33; [6F 7A, 05, 05] -28AC; [12 FB, 05, 05] +0D34; [6F 7C, 05, 05] -28AD; [12 FD, 05, 05] +0D35; [6F 7E, 05, 05] -28AE; [13 05, 05, 05] +0D36; [6F 80, 05, 05] -28AF; [13 07, 05, 05] +0D37; [6F 82, 05, 05] -28B0; [13 09, 05, 05] +0D38; [6F 84, 05, 05] -28B1; [13 0B, 05, 05] +0D39; [6F 86, 05, 05] -28B2; [13 0D, 05, 05] +0D3E; [6F 88, 05, 05] -28B3; [13 0F, 05, 05] +0D3F; [6F 8A, 05, 05] -28B4; [13 11, 05, 05] +0D40; [6F 8C, 05, 05] -28B5; [13 13, 05, 05] +0D41; [6F 8E, 05, 05] -28B6; [13 15, 05, 05] +0D42; [6F 90, 05, 05] -28B7; [13 17, 05, 05] +0D43; [6F 92, 05, 05] -28B8; [13 19, 05, 05] +0D46; [6F 94, 05, 05] -28B9; [13 1B, 05, 05] +0D47; [6F 96, 05, 05] -28BA; [13 1D, 05, 05] +0D48; [6F 98, 05, 05] -28BB; [13 1F, 05, 05] +0D46 0D3E; [6F 9A, 05, 05] +0D4A; [6F 9A, 05, 05] -28BC; [13 21, 05, 05] +0D47 0D3E; [6F 9C, 05, 05] +0D4B; [6F 9C, 05, 05] -28BD; [13 23, 05, 05] +0D46 0D57; [6F 9E, 05, 05] +0D4C; [6F 9E, 05, 05] -28BE; [13 25, 05, 05] +0D4D; [6F A0, 05, 05] -28BF; [13 27, 05, 05] +0D57; [6F A2, 05, 05] -28C0; [13 29, 05, 05] +0D85; [70 20, 05, 05] -28C1; [13 2B, 05, 05] +0D86; [70 22, 05, 05] -28C2; [13 2D, 05, 05] +0D87; [70 24, 05, 05] -28C3; [13 2F, 05, 05] +0D88; [70 26, 05, 05] -28C4; [13 31, 05, 05] +0D89; [70 28, 05, 05] -28C5; [13 33, 05, 05] +0D8A; [70 2A, 05, 05] -28C6; [13 35, 05, 05] +0D8B; [70 2C, 05, 05] -28C7; [13 37, 05, 05] +0D8C; [70 2E, 05, 05] -28C8; [13 39, 05, 05] +0D8D; [70 30, 05, 05] -28C9; [13 3B, 05, 05] +0D8E; [70 32, 05, 05] -28CA; [13 3D, 05, 05] +0D8F; [70 34, 05, 05] -28CB; [13 3F, 05, 05] +0D90; [70 36, 05, 05] -28CC; [13 41, 05, 05] +0D91; [70 38, 05, 05] -28CD; [13 43, 05, 05] +0D92; [70 3A, 05, 05] -28CE; [13 45, 05, 05] +0D93; [70 3C, 05, 05] -28CF; [13 47, 05, 05] +0D94; [70 3E, 05, 05] -28D0; [13 49, 05, 05] +0D95; [70 40, 05, 05] -28D1; [13 4B, 05, 05] +0D96; [70 42, 05, 05] -28D2; [13 4D, 05, 05] +0D9A; [70 44, 05, 05] -28D3; [13 4F, 05, 05] +0D9B; [70 46, 05, 05] -28D4; [13 51, 05, 05] +0D9C; [70 48, 05, 05] -28D5; [13 53, 05, 05] +0D9D; [70 4A, 05, 05] -28D6; [13 55, 05, 05] +0D9E; [70 4C, 05, 05] -28D7; [13 57, 05, 05] +0D9F; [70 4E, 05, 05] -28D8; [13 59, 05, 05] +0DA0; [70 50, 05, 05] -28D9; [13 5B, 05, 05] +0DA1; [70 52, 05, 05] -28DA; [13 5D, 05, 05] +0DA2; [70 54, 05, 05] -28DB; [13 5F, 05, 05] +0DA3; [70 56, 05, 05] -28DC; [13 61, 05, 05] +0DA4; [70 58, 05, 05] -28DD; [13 63, 05, 05] +0DA5; [70 5A, 05, 05] -28DE; [13 65, 05, 05] +0DA6; [70 5C, 05, 05] -28DF; [13 67, 05, 05] +0DA7; [70 5E, 05, 05] -28E0; [13 69, 05, 05] +0DA8; [70 60, 05, 05] -28E1; [13 6B, 05, 05] +0DA9; [70 62, 05, 05] -28E2; [13 6D, 05, 05] +0DAA; [70 64, 05, 05] -28E3; [13 6F, 05, 05] +0DAB; [70 66, 05, 05] -28E4; [13 71, 05, 05] +0DAC; [70 68, 05, 05] -28E5; [13 73, 05, 05] +0DAD; [70 6A, 05, 05] -28E6; [13 75, 05, 05] +0DAE; [70 6C, 05, 05] -28E7; [13 77, 05, 05] +0DAF; [70 6E, 05, 05] -28E8; [13 79, 05, 05] +0DB0; [70 70, 05, 05] -28E9; [13 7B, 05, 05] +0DB1; [70 72, 05, 05] -28EA; [13 7D, 05, 05] +0DB3; [70 74, 05, 05] -28EB; [13 7F, 05, 05] +0DB4; [70 76, 05, 05] -28EC; [13 81, 05, 05] +0DB5; [70 78, 05, 05] -28ED; [13 83, 05, 05] +0DB6; [70 7A, 05, 05] -28EE; [13 85, 05, 05] +0DB7; [70 7C, 05, 05] -28EF; [13 87, 05, 05] +0DB8; [70 7E, 05, 05] -28F0; [13 89, 05, 05] +0DB9; [70 80, 05, 05] -28F1; [13 8B, 05, 05] +0DBA; [70 82, 05, 05] -28F2; [13 8D, 05, 05] +0DBB; [70 84, 05, 05] -28F3; [13 8F, 05, 05] +0DBD; [70 86, 05, 05] -28F4; [13 91, 05, 05] +0DC0; [70 88, 05, 05] -28F5; [13 93, 05, 05] +0DC1; [70 8A, 05, 05] -28F6; [13 95, 05, 05] +0DC2; [70 8C, 05, 05] -28F7; [13 97, 05, 05] +0DC3; [70 8E, 05, 05] -28F8; [13 99, 05, 05] +0DC4; [70 90, 05, 05] -28F9; [13 9B, 05, 05] +0DC5; [70 92, 05, 05] -28FA; [13 9D, 05, 05] +0DC6; [70 94, 05, 05] -28FB; [13 9F, 05, 05] +0DCA; [70 96, 05, 05] -28FC; [13 A1, 05, 05] +0DCF; [70 98, 05, 05] -28FD; [13 A3, 05, 05] +0DD0; [70 9A, 05, 05] -28FE; [13 A5, 05, 05] +0DD1; [70 9C, 05, 05] -28FF; [13 A7, 05, 05] +0DD2; [70 9E, 05, 05] -D834 DC00; [13 A9, 05, 05] +0DD3; [70 A0, 05, 05] -D834 DC01; [13 AB, 05, 05] +0DD4; [70 A2, 05, 05] -D834 DC02; [13 AD, 05, 05] +0DD6; [70 A4, 05, 05] -D834 DC03; [13 AF, 05, 05] +0DD8; [70 A6, 05, 05] -D834 DC04; [13 B1, 05, 05] +0DD9; [70 A8, 05, 05] -D834 DC05; [13 B3, 05, 05] +0DD9 0DCA; [70 AA, 05, 05] +0DDA; [70 AA, 05, 05] -D834 DC06; [13 B5, 05, 05] +0DDB; [70 AC, 05, 05] -D834 DC07; [13 B7, 05, 05] +0DD9 0DCF; [70 AE, 05, 05] +0DDC; [70 AE, 05, 05] -D834 DC08; [13 B9, 05, 05] +0DD9 0DCF 0DCA; [70 B0, 05, 05] +0DDC 0DCA; [70 B0, 05, 05] +0DDD; [70 B0, 05, 05] -D834 DC09; [13 BB, 05, 05] +0DD9 0DDF; [70 B2, 05, 05] +0DDE; [70 B2, 05, 05] -D834 DC0A; [13 BD, 05, 05] +0DDF; [70 B4, 05, 05] -D834 DC0B; [13 BF, 05, 05] +0DF2; [70 B6, 05, 05] -D834 DC0C; [13 C1, 05, 05] +0DF3; [70 B8, 05, 05] -D834 DC0D; [13 C3, 05, 05] +0E01; [71 20, 05, 05] -D834 DC0E; [13 C5, 05, 05] +0E02; [71 22, 05, 05] -D834 DC0F; [13 C7, 05, 05] +0E03; [71 24, 05, 05] -D834 DC10; [13 C9, 05, 05] +0E04; [71 26, 05, 05] -D834 DC11; [13 CB, 05, 05] +0E05; [71 28, 05, 05] -D834 DC12; [13 CD, 05, 05] +0E06; [71 2A, 05, 05] -D834 DC13; [13 CF, 05, 05] +0E07; [71 2C, 05, 05] -D834 DC14; [13 D1, 05, 05] +0E08; [71 2E, 05, 05] -D834 DC15; [13 D3, 05, 05] +0E09; [71 30, 05, 05] -D834 DC16; [13 D5, 05, 05] +0E0A; [71 32, 05, 05] -D834 DC17; [13 D7, 05, 05] +0E0B; [71 34, 05, 05] -D834 DC18; [13 D9, 05, 05] +0E0C; [71 36, 05, 05] -D834 DC19; [13 DB, 05, 05] +0E0D; [71 38, 05, 05] -D834 DC1A; [13 DD, 05, 05] +0E0E; [71 3A, 05, 05] -D834 DC1B; [13 DF, 05, 05] +0E0F; [71 3C, 05, 05] -D834 DC1C; [13 E1, 05, 05] +0E10; [71 3E, 05, 05] -D834 DC1D; [13 E3, 05, 05] +0E11; [71 40, 05, 05] -D834 DC1E; [13 E5, 05, 05] +0E12; [71 42, 05, 05] -D834 DC1F; [13 E7, 05, 05] +0E13; [71 44, 05, 05] -D834 DC20; [13 E9, 05, 05] +0E14; [71 46, 05, 05] -D834 DC21; [13 EB, 05, 05] +0E15; [71 48, 05, 05] -D834 DC22; [13 ED, 05, 05] +0E16; [71 4A, 05, 05] -D834 DC23; [13 EF, 05, 05] +0E17; [71 4C, 05, 05] -D834 DC24; [13 F1, 05, 05] +0E18; [71 4E, 05, 05] -D834 DC25; [13 F3, 05, 05] +0E19; [71 50, 05, 05] -D834 DC26; [13 F5, 05, 05] +0E1A; [71 52, 05, 05] -D834 DC27; [13 F7, 05, 05] +0E1B; [71 54, 05, 05] -D834 DC28; [13 F9, 05, 05] +0E1C; [71 56, 05, 05] -D834 DC29; [13 FB, 05, 05] +0E1D; [71 58, 05, 05] -D834 DC2A; [13 FD, 05, 05] +0E1E; [71 5A, 05, 05] -D834 DC2B; [14 05, 05, 05] +0E1F; [71 5C, 05, 05] -D834 DC2C; [14 07, 05, 05] +0E20; [71 5E, 05, 05] -D834 DC2D; [14 09, 05, 05] +0E21; [71 60, 05, 05] -D834 DC2E; [14 0B, 05, 05] +0E22; [71 62, 05, 05] -D834 DC2F; [14 0D, 05, 05] +0E23; [71 64, 05, 05] -D834 DC30; [14 0F, 05, 05] +0E24; [71 66, 05, 05] -D834 DC31; [14 11, 05, 05] +0E25; [71 68, 05, 05] -D834 DC32; [14 13, 05, 05] +0E26; [71 6A, 05, 05] -D834 DC33; [14 15, 05, 05] +0E27; [71 6C, 05, 05] -D834 DC34; [14 17, 05, 05] +0E28; [71 6E, 05, 05] -D834 DC35; [14 19, 05, 05] +0E29; [71 70, 05, 05] -D834 DC36; [14 1B, 05, 05] +0E2A; [71 72, 05, 05] -D834 DC37; [14 1D, 05, 05] +0E2B; [71 74, 05, 05] -D834 DC38; [14 1F, 05, 05] +0E2C; [71 76, 05, 05] -D834 DC39; [14 21, 05, 05] +0E2D; [71 78, 05, 05] -D834 DC3A; [14 23, 05, 05] +0E2E; [71 7A, 05, 05] -D834 DC3B; [14 25, 05, 05] +0E2F; [71 7C, 05, 05] -D834 DC3C; [14 27, 05, 05] +0E30; [71 7E, 05, 05] -D834 DC3D; [14 29, 05, 05] +0E31; [71 80, 05, 05] -D834 DC3E; [14 2B, 05, 05] +0E32; [71 82, 05, 05] -D834 DC3F; [14 2D, 05, 05] +0E33; [71 84, 05, 05] +0E4D 0E32; [71 84, 05, 05] -D834 DC40; [14 2F, 05, 05] +0E34; [71 86, 05, 05] -D834 DC41; [14 31, 05, 05] +0E35; [71 88, 05, 05] -D834 DC42; [14 33, 05, 05] +0E36; [71 8A, 05, 05] -D834 DC43; [14 35, 05, 05] +0E37; [71 8C, 05, 05] -D834 DC44; [14 37, 05, 05] +0E38; [71 8E, 05, 05] -D834 DC45; [14 39, 05, 05] +0E39; [71 90, 05, 05] -D834 DC46; [14 3B, 05, 05] +0E3A; [71 92, 05, 05] -D834 DC47; [14 3D, 05, 05] +0E40; [71 94, 05, 05] -D834 DC48; [14 3F, 05, 05] +0E41; [71 96, 05, 05] -D834 DC49; [14 41, 05, 05] +0E42; [71 98, 05, 05] -D834 DC4A; [14 43, 05, 05] +0E43; [71 9A, 05, 05] -D834 DC4B; [14 45, 05, 05] +0E44; [71 9C, 05, 05] -D834 DC4C; [14 47, 05, 05] +0E45; [71 9E, 05, 05] -D834 DC4D; [14 49, 05, 05] +0E4C; [71 A0, 05, 05] -D834 DC4E; [14 4B, 05, 05] +0E4D; [71 A2, 05, 05] -D834 DC4F; [14 4D, 05, 05] +0E81; [72 20, 05, 05] -D834 DC50; [14 4F, 05, 05] +0E82; [72 22, 05, 05] -D834 DC51; [14 51, 05, 05] +0E84; [72 24, 05, 05] -D834 DC52; [14 53, 05, 05] +0E87; [72 26, 05, 05] -D834 DC53; [14 55, 05, 05] +0E88; [72 28, 05, 05] -D834 DC54; [14 57, 05, 05] +0E8A; [72 2A, 05, 05] -D834 DC55; [14 59, 05, 05] +0E8D; [72 2C, 05, 05] -D834 DC56; [14 5B, 05, 05] +0E94; [72 2E, 05, 05] -D834 DC57; [14 5D, 05, 05] +0E95; [72 30, 05, 05] -D834 DC58; [14 5F, 05, 05] +0E96; [72 32, 05, 05] -D834 DC59; [14 61, 05, 05] +0E97; [72 34, 05, 05] -D834 DC5A; [14 63, 05, 05] +0E99; [72 36, 05, 05] -D834 DC5B; [14 65, 05, 05] +0E9A; [72 38, 05, 05] -D834 DC5C; [14 67, 05, 05] +0E9B; [72 3A, 05, 05] -D834 DC5D; [14 69, 05, 05] +0E9C; [72 3C, 05, 05] -D834 DC5E; [14 6B, 05, 05] +0E9D; [72 3E, 05, 05] -D834 DC5F; [14 6D, 05, 05] +0E9E; [72 40, 05, 05] -D834 DC60; [14 6F, 05, 05] +0E9F; [72 42, 05, 05] -D834 DC61; [14 71, 05, 05] +0EA1; [72 44, 05, 05] -D834 DC62; [14 73, 05, 05] +0EA2; [72 46, 05, 05] -D834 DC63; [14 75, 05, 05] +0EA3; [72 48, 05, 05] -D834 DC64; [14 77, 05, 05] +0EA5; [72 4A, 05, 05] -D834 DC65; [14 79, 05, 05] +0EA7; [72 4C, 05, 05] -D834 DC66; [14 7B, 05, 05] +0EAA; [72 4E, 05, 05] -D834 DC67; [14 7D, 05, 05] +0EAB; [72 50, 05, 05] +0EDC; [72 50, 05, 09][72 36, 05, 09] +0EDD; [72 50, 05, 09][72 44, 05, 09] -D834 DC68; [14 7F, 05, 05] +0EAD; [72 52, 05, 05] -D834 DC69; [14 81, 05, 05] +0EAE; [72 54, 05, 05] -D834 DC6A; [14 83, 05, 05] +0EAF; [72 56, 05, 05] -D834 DC6B; [14 85, 05, 05] +0EB0; [72 58, 05, 05] -D834 DC6C; [14 87, 05, 05] +0EB1; [72 5A, 05, 05] -D834 DC6D; [14 89, 05, 05] +0EB2; [72 5C, 05, 05] -D834 DC6E; [14 8B, 05, 05] +0EB3; [72 5E, 05, 05] +0ECD 0EB2; [72 5E, 05, 05] -D834 DC6F; [14 8D, 05, 05] +0EB4; [72 60, 05, 05] -D834 DC70; [14 8F, 05, 05] +0EB5; [72 62, 05, 05] -D834 DC71; [14 91, 05, 05] +0EB6; [72 64, 05, 05] -D834 DC72; [14 93, 05, 05] +0EB7; [72 66, 05, 05] -D834 DC73; [14 95, 05, 05] +0EB8; [72 68, 05, 05] -D834 DC74; [14 97, 05, 05] +0EB9; [72 6A, 05, 05] -D834 DC75; [14 99, 05, 05] +0EBB; [72 6C, 05, 05] -D834 DC76; [14 9B, 05, 05] +0EBC; [72 6E, 05, 05] -D834 DC77; [14 9D, 05, 05] +0EBD; [72 70, 05, 05] -D834 DC78; [14 9F, 05, 05] +0EC0; [72 72, 05, 05] -D834 DC79; [14 A1, 05, 05] +0EC1; [72 74, 05, 05] -D834 DC7A; [14 A3, 05, 05] +0EC2; [72 76, 05, 05] -D834 DC7B; [14 A5, 05, 05] +0EC3; [72 78, 05, 05] -D834 DC7C; [14 A7, 05, 05] +0EC4; [72 7A, 05, 05] -D834 DC7D; [14 A9, 05, 05] +0ECC; [72 7C, 05, 05] -D834 DC7E; [14 AB, 05, 05] +0ECD; [72 7E, 05, 05] -D834 DC7F; [14 AD, 05, 05] +0F40; [73 20, 05, 05] +0F69; [73 20, 05, 05][73 9E, 05, 05] -D834 DC80; [14 AF, 05, 05] +0F90; [73 22, 05, 05] +0FB9; [73 22, 05, 05][73 9E, 05, 05] -D834 DC81; [14 B1, 05, 05] +0F41; [73 24, 05, 05] -D834 DC82; [14 B3, 05, 05] +0F91; [73 26, 05, 05] -D834 DC83; [14 B5, 05, 05] +0F42; [73 28, 05, 05] +0F43; [73 28, 05, 05][73 A6, 05, 05] -D834 DC84; [14 B7, 05, 05] +0F92; [73 2A, 05, 05] +0F93; [73 2A, 05, 05][73 A6, 05, 05] -D834 DC85; [14 B9, 05, 05] +0F44; [73 2C, 05, 05] -D834 DC86; [14 BB, 05, 05] +0F94; [73 2E, 05, 05] -D834 DC87; [14 BD, 05, 05] +0F45; [73 30, 05, 05] -D834 DC88; [14 BF, 05, 05] +0F95; [73 32, 05, 05] -D834 DC89; [14 C1, 05, 05] +0F46; [73 34, 05, 05] -D834 DC8A; [14 C3, 05, 05] +0F96; [73 36, 05, 05] -D834 DC8B; [14 C5, 05, 05] +0F47; [73 38, 05, 05] -D834 DC8C; [14 C7, 05, 05] +0F97; [73 3A, 05, 05] -D834 DC8D; [14 C9, 05, 05] +0F49; [73 3C, 05, 05] -D834 DC8E; [14 CB, 05, 05] +0F99; [73 3E, 05, 05] -D834 DC8F; [15 20, 05, 05] +0F4A; [73 40, 05, 05] -D834 DC90; [15 22, 05, 05] +0F9A; [73 42, 05, 05] -D834 DC91; [15 24, 05, 05] +0F4B; [73 44, 05, 05] -D834 DC92; [15 26, 05, 05] +0F9B; [73 46, 05, 05] -D834 DC93; [15 28, 05, 05] +0F4C; [73 48, 05, 05] +0F4D; [73 48, 05, 05][73 A6, 05, 05] -D834 DC94; [15 2A, 05, 05] +0F9C; [73 4A, 05, 05] +0F9D; [73 4A, 05, 05][73 A6, 05, 05] -D834 DC95; [15 2C, 05, 05] +0F4E; [73 4C, 05, 05] -D834 DC96; [15 2E, 05, 05] +0F9E; [73 4E, 05, 05] -D834 DC97; [15 30, 05, 05] +0F4F; [73 50, 05, 05] -D834 DC98; [15 32, 05, 05] +0F9F; [73 52, 05, 05] -D834 DC99; [15 34, 05, 05] +0F50; [73 54, 05, 05] -D834 DC9A; [15 36, 05, 05] +0FA0; [73 56, 05, 05] -D834 DC9B; [15 38, 05, 05] +0F51; [73 58, 05, 05] +0F52; [73 58, 05, 05][73 A6, 05, 05] -D834 DC9C; [15 3A, 05, 05] +0FA1; [73 5A, 05, 05] +0FA2; [73 5A, 05, 05][73 A6, 05, 05] -D834 DC9D; [15 3C, 05, 05] +0F53; [73 5C, 05, 05] -D834 DC9E; [15 3E, 05, 05] +0FA3; [73 5E, 05, 05] -D834 DC9F; [15 40, 05, 05] +0F54; [73 60, 05, 05] -D834 DCA0; [15 42, 05, 05] +0FA4; [73 62, 05, 05] -D834 DCA1; [15 44, 05, 05] +0F55; [73 64, 05, 05] -D834 DCA2; [15 46, 05, 05] +0FA5; [73 66, 05, 05] -D834 DCA3; [15 48, 05, 05] +0F56; [73 68, 05, 05] +0F57; [73 68, 05, 05][73 A6, 05, 05] -D834 DCA4; [15 4A, 05, 05] +0FA6; [73 6A, 05, 05] +0FA7; [73 6A, 05, 05][73 A6, 05, 05] -D834 DCA5; [15 4C, 05, 05] +0F58; [73 6C, 05, 05] -D834 DCA6; [15 4E, 05, 05] +0FA8; [73 6E, 05, 05] -D834 DCA7; [15 50, 05, 05] +0F59; [73 70, 05, 05] -D834 DCA8; [15 52, 05, 05] +0FA9; [73 72, 05, 05] -D834 DCA9; [15 54, 05, 05] +0F5A; [73 74, 05, 05] -D834 DCAA; [15 56, 05, 05] +0FAA; [73 76, 05, 05] -D834 DCAB; [15 58, 05, 05] +0F5B; [73 78, 05, 05] +0F5C; [73 78, 05, 05][73 A6, 05, 05] -D834 DCAC; [15 5A, 05, 05] +0FAB; [73 7A, 05, 05] +0FAC; [73 7A, 05, 05][73 A6, 05, 05] -D834 DCAD; [15 5C, 05, 05] +0F5D; [73 7C, 05, 05] -D834 DCAE; [15 5E, 05, 05] +0FAD; [73 7E, 05, 05] +0FBA; [73 7E, 05, 09][, E0 9D, 09] -D834 DCAF; [15 60, 05, 05] +0F5E; [73 80, 05, 05] -D834 DCB0; [15 62, 05, 05] +0FAE; [73 82, 05, 05] -D834 DCB1; [15 64, 05, 05] +0F5F; [73 84, 05, 05] -D834 DCB2; [15 66, 05, 05] +0FAF; [73 86, 05, 05] -D834 DCB3; [15 68, 05, 05] +0F60; [73 88, 05, 05] -D834 DCB4; [15 6A, 05, 05] +0FB0; [73 8A, 05, 05] -D834 DCB5; [15 6C, 05, 05] +0F61; [73 8C, 05, 05] -D834 DCB6; [15 6E, 05, 05] +0FB1; [73 8E, 05, 05] +0FBB; [73 8E, 05, 09][, E0 9D, 09] -D834 DCB7; [15 70, 05, 05] +0F62; [73 90, 05, 05] +0F6A; [73 90, 05, 09][, E0 9D, 09] -D834 DCB8; [15 72, 05, 05] +0FB2; [73 92, 05, 05] +0FBC; [73 92, 05, 09][, E0 9D, 09] +0FB2 0F71; [73 92, 05, 05][73 B4, 05, 05] -D834 DCB9; [15 74, 05, 05] +0F63; [73 94, 05, 05] -D834 DCBA; [15 76, 05, 05] +0FB3; [73 96, 05, 05] +0FB3 0F71; [73 96, 05, 05][73 B4, 05, 05] -D834 DCBB; [15 78, 05, 05] +0F64; [73 98, 05, 05] -D834 DCBC; [15 7A, 05, 05] +0FB4; [73 9A, 05, 05] -D834 DCBD; [15 7C, 05, 05] +0F65; [73 9C, 05, 05] -D834 DCBE; [15 7E, 05, 05] +0FB5; [73 9E, 05, 05] -D834 DCBF; [15 80, 05, 05] +0F66; [73 A0, 05, 05] -D834 DCC0; [15 82, 05, 05] +0FB6; [73 A2, 05, 05] -D834 DCC1; [15 84, 05, 05] +0F67; [73 A4, 05, 05] -D834 DCC2; [15 86, 05, 05] +0FB7; [73 A6, 05, 05] -D834 DCC3; [15 88, 05, 05] +0F68; [73 A8, 05, 05] +0F00; [73 A8, 05, 09][73 CE, 05, 09][, DA 65, 3D] -D834 DCC4; [15 8A, 05, 05] +0FB8; [73 AA, 05, 05] -D834 DCC5; [15 8C, 05, 05] +0F88; [73 AC, 05, 05] -D834 DCC6; [15 8E, 05, 05] +0F89; [73 AE, 05, 05] -D834 DCC7; [15 90, 05, 05] +0F8A; [73 B0, 05, 05] -D834 DCC8; [15 92, 05, 05] +0F8B; [73 B2, 05, 05] -D834 DCC9; [15 94, 05, 05] +0F71; [73 B4, 05, 05] -D834 DCCA; [15 96, 05, 05] +0F72; [73 B6, 05, 05] -D834 DCCB; [15 98, 05, 05] +0F71 0F72; [73 B8, 05, 05] +0F73; [73 B8, 05, 05] -D834 DCCC; [15 9A, 05, 05] +0F80; [73 BA, 05, 05] -D834 DCCD; [15 9C, 05, 05] +0F71 0F80; [73 BC, 05, 05] +0F81; [73 BC, 05, 05] -D834 DCCE; [15 9E, 05, 05] +0F74; [73 BE, 05, 05] -D834 DCCF; [15 A0, 05, 05] +0F71 0F74; [73 C0, 05, 05] +0F75; [73 C0, 05, 05] -D834 DCD0; [15 A2, 05, 05] +0F76; [73 C2, 05, 05] +0FB2 0F80; [73 C2, 05, 05] -D834 DCD1; [15 A4, 05, 05] +0F77; [73 C4, 05, 05] +0FB2 0F71 0F80; [73 C4, 05, 05] +0FB2 0F81; [73 C4, 05, 05] -D834 DCD2; [15 A6, 05, 05] +0F78; [73 C6, 05, 05] +0FB3 0F80; [73 C6, 05, 05] -D834 DCD3; [15 A8, 05, 05] +0F79; [73 C8, 05, 05] +0FB3 0F71 0F80; [73 C8, 05, 05] +0FB3 0F81; [73 C8, 05, 05] -D834 DCD4; [15 AA, 05, 05] +0F7A; [73 CA, 05, 05] -D834 DCD5; [15 AC, 05, 05] +0F7B; [73 CC, 05, 05] -D834 DCD6; [15 AE, 05, 05] +0F7C; [73 CE, 05, 05] -D834 DCD7; [15 B0, 05, 05] +0F7D; [73 D0, 05, 05] -D834 DCD8; [15 B2, 05, 05] +0F84; [73 D2, 05, 05] -D834 DCD9; [15 B4, 05, 05] +1900; [74 20, 05, 05] -D834 DCDA; [15 B6, 05, 05] +1901; [74 22, 05, 05] -D834 DCDB; [15 B8, 05, 05] +1902; [74 24, 05, 05] -D834 DCDC; [15 BA, 05, 05] +1903; [74 26, 05, 05] -D834 DCDD; [15 BC, 05, 05] +1904; [74 28, 05, 05] -D834 DCDE; [15 BE, 05, 05] +1905; [74 2A, 05, 05] -D834 DCDF; [15 C0, 05, 05] +1906; [74 2C, 05, 05] -D834 DCE0; [15 C2, 05, 05] +1907; [74 2E, 05, 05] -D834 DCE1; [15 C4, 05, 05] +1908; [74 30, 05, 05] -D834 DCE2; [15 C6, 05, 05] +1909; [74 32, 05, 05] -D834 DCE3; [15 C8, 05, 05] +190A; [74 34, 05, 05] -D834 DCE4; [15 CA, 05, 05] +190B; [74 36, 05, 05] -D834 DCE5; [15 CC, 05, 05] +190C; [74 38, 05, 05] -D834 DCE6; [15 CE, 05, 05] +190D; [74 3A, 05, 05] -D834 DCE7; [15 D0, 05, 05] +190E; [74 3C, 05, 05] -D834 DCE8; [15 D2, 05, 05] +190F; [74 3E, 05, 05] -D834 DCE9; [15 D4, 05, 05] +1910; [74 40, 05, 05] -D834 DCEA; [15 D6, 05, 05] +1911; [74 42, 05, 05] -D834 DCEB; [15 D8, 05, 05] +1912; [74 44, 05, 05] -D834 DCEC; [15 DA, 05, 05] +1913; [74 46, 05, 05] -D834 DCED; [15 DC, 05, 05] +1914; [74 48, 05, 05] -D834 DCEE; [15 DE, 05, 05] +1915; [74 4A, 05, 05] -D834 DCEF; [15 E0, 05, 05] +1916; [74 4C, 05, 05] -D834 DCF0; [15 E2, 05, 05] +1917; [74 4E, 05, 05] -D834 DCF1; [15 E4, 05, 05] +1918; [74 50, 05, 05] -D834 DCF2; [15 E6, 05, 05] +1919; [74 52, 05, 05] -D834 DCF3; [15 E8, 05, 05] +191A; [74 54, 05, 05] -D834 DCF4; [15 EA, 05, 05] +191B; [74 56, 05, 05] -D834 DCF5; [15 EC, 05, 05] +191C; [74 58, 05, 05] -D834 DD00; [15 EE, 05, 05] +1920; [74 5A, 05, 05] -D834 DD01; [15 F0, 05, 05] +1921; [74 5C, 05, 05] -D834 DD02; [15 F2, 05, 05] +1922; [74 5E, 05, 05] -D834 DD03; [15 F4, 05, 05] +1923; [74 60, 05, 05] -D834 DD04; [15 F6, 05, 05] +1924; [74 62, 05, 05] -D834 DD05; [15 F8, 05, 05] +1925; [74 64, 05, 05] -D834 DD06; [15 FA, 05, 05] +1926; [74 66, 05, 05] -D834 DD07; [15 FC, 05, 05] +1927; [74 68, 05, 05] -D834 DD08; [15 FE, 05, 05] +1928; [74 6A, 05, 05] -D834 DD09; [16 05, 05, 05] +1929; [74 6C, 05, 05] -D834 DD0A; [16 07, 05, 05] +192A; [74 6E, 05, 05] -D834 DD0B; [16 09, 05, 05] +192B; [74 70, 05, 05] -D834 DD0C; [16 0B, 05, 05] +1930; [74 72, 05, 05] -D834 DD0D; [16 0D, 05, 05] +1931; [74 74, 05, 05] -D834 DD0E; [16 0F, 05, 05] +1932; [74 76, 05, 05] -D834 DD0F; [16 11, 05, 05] +1933; [74 78, 05, 05] -D834 DD10; [16 13, 05, 05] +1934; [74 7A, 05, 05] -D834 DD11; [16 15, 05, 05] +1935; [74 7C, 05, 05] -D834 DD12; [16 17, 05, 05] +1936; [74 7E, 05, 05] -D834 DD13; [16 19, 05, 05] +1937; [74 80, 05, 05] -D834 DD14; [16 1B, 05, 05] +1938; [74 82, 05, 05] -D834 DD15; [16 1D, 05, 05] +1700; [75 20, 05, 05] -D834 DD16; [16 1F, 05, 05] +1701; [75 22, 05, 05] -D834 DD17; [16 21, 05, 05] +1702; [75 24, 05, 05] -D834 DD18; [16 23, 05, 05] +1703; [75 26, 05, 05] -D834 DD19; [16 25, 05, 05] +1704; [75 28, 05, 05] -D834 DD1A; [16 27, 05, 05] +1705; [75 2A, 05, 05] -D834 DD1B; [16 29, 05, 05] +1706; [75 2C, 05, 05] -D834 DD1C; [16 2B, 05, 05] +1707; [75 2E, 05, 05] -D834 DD1D; [16 2D, 05, 05] +1708; [75 30, 05, 05] -D834 DD1E; [16 2F, 05, 05] +1709; [75 32, 05, 05] -D834 DD1F; [16 31, 05, 05] +170A; [75 34, 05, 05] -D834 DD20; [16 33, 05, 05] +170B; [75 36, 05, 05] -D834 DD21; [16 35, 05, 05] +170C; [75 38, 05, 05] -D834 DD22; [16 37, 05, 05] +170E; [75 3A, 05, 05] -D834 DD23; [16 39, 05, 05] +170F; [75 3C, 05, 05] -D834 DD24; [16 3B, 05, 05] +1710; [75 3E, 05, 05] -D834 DD25; [16 3D, 05, 05] +1711; [75 40, 05, 05] -D834 DD26; [16 3F, 05, 05] +1712; [75 42, 05, 05] -D834 DD2A; [16 41, 05, 05] +1713; [75 44, 05, 05] -D834 DD2B; [16 43, 05, 05] +1714; [75 46, 05, 05] -D834 DD2C; [16 45, 05, 05] +1720; [76 20, 05, 05] -D834 DD2D; [16 47, 05, 05] +1721; [76 22, 05, 05] -D834 DD2E; [16 49, 05, 05] +1722; [76 24, 05, 05] -D834 DD2F; [16 4B, 05, 05] +1723; [76 26, 05, 05] -D834 DD30; [16 4D, 05, 05] +1724; [76 28, 05, 05] -D834 DD31; [16 4F, 05, 05] +1725; [76 2A, 05, 05] -D834 DD32; [16 51, 05, 05] +1726; [76 2C, 05, 05] -D834 DD33; [16 53, 05, 05] +1727; [76 2E, 05, 05] -D834 DD34; [16 55, 05, 05] +1728; [76 30, 05, 05] -D834 DD35; [16 57, 05, 05] +1729; [76 32, 05, 05] -D834 DD36; [16 59, 05, 05] +172A; [76 34, 05, 05] -D834 DD37; [16 5B, 05, 05] +172B; [76 36, 05, 05] -D834 DD38; [16 5D, 05, 05] +172C; [76 38, 05, 05] -D834 DD39; [16 5F, 05, 05] +172D; [76 3A, 05, 05] -D834 DD3A; [16 61, 05, 05] +172E; [76 3C, 05, 05] -D834 DD3B; [16 63, 05, 05] +172F; [76 3E, 05, 05] -D834 DD3C; [16 65, 05, 05] +1730; [76 40, 05, 05] -D834 DD3D; [16 67, 05, 05] +1731; [76 42, 05, 05] -D834 DD3E; [16 69, 05, 05] +1732; [76 44, 05, 05] -D834 DD3F; [16 6B, 05, 05] +1733; [76 46, 05, 05] -D834 DD40; [16 6D, 05, 05] +1734; [76 48, 05, 05] -D834 DD41; [16 6F, 05, 05] +1740; [77 20, 05, 05] -D834 DD42; [16 71, 05, 05] +1741; [77 22, 05, 05] -D834 DD43; [16 73, 05, 05] +1742; [77 24, 05, 05] -D834 DD44; [16 75, 05, 05] +1743; [77 26, 05, 05] -D834 DD45; [16 77, 05, 05] +1744; [77 28, 05, 05] -D834 DD46; [16 79, 05, 05] +1745; [77 2A, 05, 05] -D834 DD47; [16 7B, 05, 05] +1746; [77 2C, 05, 05] -D834 DD48; [16 7D, 05, 05] +1747; [77 2E, 05, 05] -D834 DD49; [16 7F, 05, 05] +1748; [77 30, 05, 05] -D834 DD4A; [16 81, 05, 05] +1749; [77 32, 05, 05] -D834 DD4B; [16 83, 05, 05] +174A; [77 34, 05, 05] -D834 DD4C; [16 85, 05, 05] +174B; [77 36, 05, 05] -D834 DD4D; [16 87, 05, 05] +174C; [77 38, 05, 05] -D834 DD4E; [16 89, 05, 05] +174D; [77 3A, 05, 05] -D834 DD4F; [16 8B, 05, 05] +174E; [77 3C, 05, 05] -D834 DD50; [16 8D, 05, 05] +174F; [77 3E, 05, 05] -D834 DD51; [16 8F, 05, 05] +1750; [77 40, 05, 05] -D834 DD52; [16 91, 05, 05] +1751; [77 42, 05, 05] -D834 DD53; [16 93, 05, 05] +1752; [77 44, 05, 05] -D834 DD54; [16 95, 05, 05] +1753; [77 46, 05, 05] -D834 DD55; [16 97, 05, 05] +1760; [78 20, 05, 05] -D834 DD56; [16 99, 05, 05] +1761; [78 22, 05, 05] -D834 DD57; [16 9B, 05, 05] -D834 DD5E; [16 9B, 05, 05] +1762; [78 24, 05, 05] -D834 DD58; [16 9D, 05, 05] -D834 DD5F; [16 9D, 05, 05] -D834 DD60; [16 9D, 05, 05] -D834 DD61; [16 9D, 05, 05] -D834 DD62; [16 9D, 05, 05] -D834 DD63; [16 9D, 05, 05] -D834 DD64; [16 9D, 05, 05] +1763; [78 26, 05, 05] -D834 DD59; [16 9F, 05, 05] +1764; [78 28, 05, 05] -D834 DD5A; [16 A1, 05, 05] +1765; [78 2A, 05, 05] -D834 DD5B; [16 A3, 05, 05] +1766; [78 2C, 05, 05] -D834 DD5C; [16 A5, 05, 05] +1767; [78 2E, 05, 05] -D834 DD5D; [16 A7, 05, 05] +1768; [78 30, 05, 05] -D834 DD6A; [16 A9, 05, 05] +1769; [78 32, 05, 05] -D834 DD6B; [16 AB, 05, 05] +176A; [78 34, 05, 05] -D834 DD6C; [16 AD, 05, 05] +176B; [78 36, 05, 05] -D834 DD83; [16 AF, 05, 05] +176C; [78 38, 05, 05] -D834 DD84; [16 B1, 05, 05] +176E; [78 3A, 05, 05] -D834 DD8C; [16 B3, 05, 05] +176F; [78 3C, 05, 05] -D834 DD8D; [16 B5, 05, 05] +1770; [78 3E, 05, 05] -D834 DD8E; [16 B7, 05, 05] +1772; [78 40, 05, 05] -D834 DD8F; [16 B9, 05, 05] +1773; [78 42, 05, 05] -D834 DD90; [16 BB, 05, 05] +1000; [79 20, 05, 05] -D834 DD91; [16 BD, 05, 05] +1001; [79 22, 05, 05] -D834 DD92; [16 BF, 05, 05] +1002; [79 24, 05, 05] -D834 DD93; [16 C1, 05, 05] +1003; [79 26, 05, 05] -D834 DD94; [16 C3, 05, 05] +1004; [79 28, 05, 05] -D834 DD95; [16 C5, 05, 05] +1005; [79 2A, 05, 05] -D834 DD96; [16 C7, 05, 05] +1006; [79 2C, 05, 05] -D834 DD97; [16 C9, 05, 05] +1007; [79 2E, 05, 05] -D834 DD98; [16 CB, 05, 05] +1008; [79 30, 05, 05] -D834 DD99; [16 CD, 05, 05] +1009; [79 32, 05, 05] -D834 DD9A; [16 CF, 05, 05] +100A; [79 34, 05, 05] -D834 DD9B; [16 D1, 05, 05] +100B; [79 36, 05, 05] -D834 DD9C; [16 D3, 05, 05] +100C; [79 38, 05, 05] -D834 DD9D; [16 D5, 05, 05] +100D; [79 3A, 05, 05] -D834 DD9E; [16 D7, 05, 05] +100E; [79 3C, 05, 05] -D834 DD9F; [16 D9, 05, 05] +100F; [79 3E, 05, 05] -D834 DDA0; [16 DB, 05, 05] +1010; [79 40, 05, 05] -D834 DDA1; [16 DD, 05, 05] +1011; [79 42, 05, 05] -D834 DDA2; [16 DF, 05, 05] +1012; [79 44, 05, 05] -D834 DDA3; [16 E1, 05, 05] +1013; [79 46, 05, 05] -D834 DDA4; [16 E3, 05, 05] +1014; [79 48, 05, 05] -D834 DDA5; [16 E5, 05, 05] +1015; [79 4A, 05, 05] -D834 DDA6; [16 E7, 05, 05] +1016; [79 4C, 05, 05] -D834 DDA7; [16 E9, 05, 05] +1017; [79 4E, 05, 05] -D834 DDA8; [16 EB, 05, 05] +1018; [79 50, 05, 05] -D834 DDA9; [16 ED, 05, 05] +1019; [79 52, 05, 05] -D834 DDAE; [16 EF, 05, 05] +101A; [79 54, 05, 05] -D834 DDAF; [16 F1, 05, 05] +101B; [79 56, 05, 05] -D834 DDB0; [16 F3, 05, 05] +101C; [79 58, 05, 05] -D834 DDB1; [16 F5, 05, 05] +101D; [79 5A, 05, 05] -D834 DDB2; [16 F7, 05, 05] +1050; [79 5C, 05, 05] -D834 DDB3; [16 F9, 05, 05] +1051; [79 5E, 05, 05] -D834 DDB4; [16 FB, 05, 05] +101E; [79 60, 05, 05] -D834 DDB5; [16 FD, 05, 05] +101F; [79 62, 05, 05] -D834 DDB6; [17 05, 05, 05] +1020; [79 64, 05, 05] -D834 DDB7; [17 07, 05, 05] +1021; [79 66, 05, 05] -D834 DDB8; [17 09, 05, 05] +1023; [79 68, 05, 05] -D834 DDB9; [17 0B, 05, 05] -D834 DDBB; [17 0B, 05, 05] -D834 DDBD; [17 0B, 05, 05] -D834 DDBF; [17 0B, 05, 05] +1024; [79 6A, 05, 05] -D834 DDBA; [17 0D, 05, 05] -D834 DDBC; [17 0D, 05, 05] -D834 DDBE; [17 0D, 05, 05] -D834 DDC0; [17 0D, 05, 05] +1025; [79 6C, 05, 05] -D834 DDC1; [17 0F, 05, 05] +1025 102E; [79 6E, 05, 05] +1026; [79 6E, 05, 05] -D834 DDC2; [17 11, 05, 05] +1027; [79 70, 05, 05] -D834 DDC3; [17 13, 05, 05] +1029; [79 72, 05, 05] -D834 DDC4; [17 15, 05, 05] +102A; [79 74, 05, 05] -D834 DDC5; [17 17, 05, 05] +1052; [79 76, 05, 05] -D834 DDC6; [17 19, 05, 05] +1053; [79 78, 05, 05] -D834 DDC7; [17 1B, 05, 05] +1054; [79 7A, 05, 05] -D834 DDC8; [17 1D, 05, 05] +1055; [79 7C, 05, 05] -D834 DDC9; [17 1F, 05, 05] +102C; [79 7E, 05, 05] -D834 DDCA; [17 21, 05, 05] +102D; [79 80, 05, 05] -D834 DDCB; [17 23, 05, 05] +102E; [79 82, 05, 05] -D834 DDCC; [17 25, 05, 05] +102F; [79 84, 05, 05] -D834 DDCD; [17 27, 05, 05] +1030; [79 86, 05, 05] -D834 DDCE; [17 29, 05, 05] +1031; [79 88, 05, 05] -D834 DDCF; [17 2B, 05, 05] +1032; [79 8A, 05, 05] -D834 DDD0; [17 2D, 05, 05] +1056; [79 8C, 05, 05] -D834 DDD1; [17 2F, 05, 05] +1057; [79 8E, 05, 05] -D834 DDD2; [17 31, 05, 05] +1058; [79 90, 05, 05] -D834 DDD3; [17 33, 05, 05] +1059; [79 92, 05, 05] -D834 DDD4; [17 35, 05, 05] +1039; [79 94, 05, 05] -D834 DDD5; [17 37, 05, 05] +1780; [7A 20, 05, 05] -D834 DDD6; [17 39, 05, 05] +1781; [7A 22, 05, 05] -D834 DDD7; [17 3B, 05, 05] +1782; [7A 24, 05, 05] -D834 DDD8; [17 3D, 05, 05] +1783; [7A 26, 05, 05] -D834 DDD9; [17 3F, 05, 05] +1784; [7A 28, 05, 05] -D834 DDDA; [17 41, 05, 05] +1785; [7A 2A, 05, 05] -D834 DDDB; [17 43, 05, 05] +1786; [7A 2C, 05, 05] -D834 DDDC; [17 45, 05, 05] +1787; [7A 2E, 05, 05] -D834 DDDD; [17 47, 05, 05] +1788; [7A 30, 05, 05] -2FF0; [17 49, 05, 05] +1789; [7A 32, 05, 05] -2FF1; [17 4B, 05, 05] +178A; [7A 34, 05, 05] -2FF2; [17 4D, 05, 05] +178B; [7A 36, 05, 05] -2FF3; [17 4F, 05, 05] +178C; [7A 38, 05, 05] -2FF4; [17 51, 05, 05] +178D; [7A 3A, 05, 05] -2FF5; [17 53, 05, 05] +178E; [7A 3C, 05, 05] -2FF6; [17 55, 05, 05] +178F; [7A 3E, 05, 05] -2FF7; [17 57, 05, 05] +1790; [7A 40, 05, 05] -2FF8; [17 59, 05, 05] +1791; [7A 42, 05, 05] -2FF9; [17 5B, 05, 05] +1792; [7A 44, 05, 05] -2FFA; [17 5D, 05, 05] +1793; [7A 46, 05, 05] -2FFB; [17 5F, 05, 05] +1794; [7A 48, 05, 05] -3004; [17 61, 05, 05] +1795; [7A 4A, 05, 05] -3012; [17 63, 05, 05] -3036; [17 63, 05, 09] +1796; [7A 4C, 05, 05] -3013; [17 65, 05, 05] +1797; [7A 4E, 05, 05] -3020; [17 67, 05, 05] +1798; [7A 50, 05, 05] -3037; [17 69, 05, 05] +1799; [7A 52, 05, 05] -303E; [17 6B, 05, 05] +179A; [7A 54, 05, 05] -303F; [17 6D, 05, 05] +179B; [7A 56, 05, 05] -3190; [17 6F, 05, 05] +179C; [7A 58, 05, 05] -3191; [17 71, 05, 05] +179D; [7A 5A, 05, 05] -327F; [17 73, 05, 05] +179E; [7A 5C, 05, 05] -FFFC; [17 75, 05, 05] +179F; [7A 5E, 05, 05] -FFFD; [17 77, 05, 05] +17A0; [7A 60, 05, 05] -09F8; [17 79, 05, 05] +17A1; [7A 62, 05, 05] -09F9; [17 7B, 05, 05] +17A2; [7A 64, 05, 05] -0BF0; [17 7D, 05, 05] +17DC; [7A 66, 05, 05] -0BF1; [17 7F, 05, 05] +17A3; [7A 68, 05, 05] -0BF2; [17 81, 05, 05] +17A4; [7A 6A, 05, 05] -1372; [17 83, 05, 05] +17A5; [7A 6C, 05, 05] -1373; [17 85, 05, 05] +17A6; [7A 6E, 05, 05] -1374; [17 87, 05, 05] +17A7; [7A 70, 05, 05] -1375; [17 89, 05, 05] +17A8; [7A 72, 05, 05] -1376; [17 8B, 05, 05] +17A9; [7A 74, 05, 05] -1377; [17 8D, 05, 05] +17AA; [7A 76, 05, 05] -1378; [17 8F, 05, 05] +17AB; [7A 78, 05, 05] -1379; [17 91, 05, 05] +17AC; [7A 7A, 05, 05] -137A; [17 93, 05, 05] +17AD; [7A 7C, 05, 05] -137B; [17 95, 05, 05] +17AE; [7A 7E, 05, 05] -137C; [17 97, 05, 05] +17AF; [7A 80, 05, 05] -D800 DF22; [17 99, 05, 05] +17B0; [7A 82, 05, 05] -D800 DF23; [17 9B, 05, 05] +17B1; [7A 84, 05, 05] -[variable top = 179B] # END OF VARIABLE SECTION!!! +17B2; [7A 86, 05, 05] -02D0; [1A 20, 05, 05] +17B3; [7A 88, 05, 05] -02D1; [1A 22, 05, 05] +17B4; [7A 8A, 05, 05] -0E46; [1A 24, 05, 05] +17B5; [7A 8C, 05, 05] -0EC6; [1A 26, 05, 05] +17B6; [7A 8E, 05, 05] -3005; [1A 28, 05, 05] +17B7; [7A 90, 05, 05] -3031; [1A 2A, 05, 05] -3032; [1A 2A, 05, 05][, DB F9, 05] +17B8; [7A 92, 05, 05] -3033; [1A 2C, 05, 05] -3034; [1A 2C, 05, 05][, DB F9, 05] +17B9; [7A 94, 05, 05] -3035; [1A 2E, 05, 05] +17BA; [7A 96, 05, 05] -309D; [1A 30, 05, 05] -309E; [1A 30, 05, 05][, DB F9, 05] +17BB; [7A 98, 05, 05] -30FC; [1A 32, 05, 05] -FF70; [1A 32, 05, A3] +17BC; [7A 9A, 05, 05] -30FD; [1A 34, 05, 05] -30FE; [1A 34, 05, 05][, DB F9, 05] +17BD; [7A 9C, 05, 05] -00A4; [1A 36, 05, 05] +17BE; [7A 9E, 05, 05] -00A2; [1A 38, 05, 05] -FFE0; [1A 38, 05, 07] +17BF; [7A A0, 05, 05] -0024; [1A 3A, 05, 05] -FF04; [1A 3A, 05, 07] -FE69; [1A 3A, 05, 1D] +17C0; [7A A2, 05, 05] -00A3; [1A 3C, 05, 05] -FFE1; [1A 3C, 05, 07] +17C1; [7A A4, 05, 05] -00A5; [1A 3E, 05, 05] -FFE5; [1A 3E, 05, 07] +17C2; [7A A6, 05, 05] -09F2; [1A 40, 05, 05] +17C3; [7A A8, 05, 05] -09F3; [1A 42, 05, 05] +17C4; [7A AA, 05, 05] -0E3F; [1A 44, 05, 05] +17C5; [7A AC, 05, 05] -17DB; [1A 46, 05, 05] +17D2; [7A AE, 05, 05] -20A0; [1A 48, 05, 05] +1950; [7B 20, 05, 05] -20A1; [1A 4A, 05, 05] +1951; [7B 22, 05, 05] -20A2; [1A 4C, 05, 05] +1952; [7B 24, 05, 05] -20A3; [1A 4E, 05, 05] +1953; [7B 26, 05, 05] -20A4; [1A 50, 05, 05] +1954; [7B 28, 05, 05] -20A5; [1A 52, 05, 05] +1955; [7B 2A, 05, 05] -20A6; [1A 54, 05, 05] +1956; [7B 2C, 05, 05] -20A7; [1A 56, 05, 05] +1957; [7B 2E, 05, 05] -20A9; [1A 58, 05, 05] -FFE6; [1A 58, 05, 07] +1958; [7B 30, 05, 05] -20AA; [1A 5A, 05, 05] +1959; [7B 32, 05, 05] -20AB; [1A 5C, 05, 05] +195A; [7B 34, 05, 05] -20AC; [1A 5E, 05, 05] +195B; [7B 36, 05, 05] -20AD; [1A 60, 05, 05] +195C; [7B 38, 05, 05] -20AE; [1A 62, 05, 05] +195D; [7B 3A, 05, 05] -20AF; [1A 64, 05, 05] +195E; [7B 3C, 05, 05] -2104; [1A 66, 05, 05] +195F; [7B 3E, 05, 05] -2108; [1A 68, 05, 05] +1960; [7B 40, 05, 05] -2114; [1A 6A, 05, 05] +1961; [7B 42, 05, 05] -2117; [1A 6C, 05, 05] +1962; [7B 44, 05, 05] -2118; [1A 6E, 05, 05] +1963; [7B 46, 05, 05] -211E; [1A 70, 05, 05] +1964; [7B 48, 05, 05] -211F; [1A 72, 05, 05] +1965; [7B 4A, 05, 05] -2123; [1A 74, 05, 05] +1966; [7B 4C, 05, 05] -2125; [1A 76, 05, 05] +1967; [7B 4E, 05, 05] -2127; [1A 78, 05, 05] +1968; [7B 50, 05, 05] -2129; [1A 7A, 05, 05] +1969; [7B 52, 05, 05] -212E; [1A 7C, 05, 05] +196A; [7B 54, 05, 05] -2132; [1A 7E, 05, 05] +196B; [7B 56, 05, 05] -213A; [1A 80, 05, 05] +196C; [7B 58, 05, 05] -2180; [1A 82, 05, 05] +196D; [7B 5A, 05, 05] -2181; [1A 84, 05, 05] +1970; [7B 5C, 05, 05] -2182; [1A 86, 05, 05] +1971; [7B 5E, 05, 05] -2183; [1A 88, 05, 05] +1972; [7B 60, 05, 05] -266D; [1A 8A, 05, 05] - -266E; [1A 8C, 05, 05] - -266F; [1A 8E, 05, 05] - -0030; [1A 90, 05, 05] -FF10; [1A 90, 05, 07] -D835 DFCE; [1A 90, 05, 0B] -D835 DFD8; [1A 90, 05, 0B] -D835 DFE2; [1A 90, 05, 0B] -D835 DFEC; [1A 90, 05, 0B] -D835 DFF6; [1A 90, 05, 0B] -24EA; [1A 90, 05, 0D] -2070; [1A 90, 05, 27] -2080; [1A 90, 05, 29] -0660; [1A 90, 05, 05][, E0 6D, 05] -06F0; [1A 90, 05, 05][, E0 7D, 05] -0966; [1A 90, 05, 05][, E0 9D, 05] -09E6; [1A 90, 05, 05][, E0 AD, 05] -0A66; [1A 90, 05, 05][, E0 CD, 05] -0AE6; [1A 90, 05, 05][, E0 DD, 05] -0B66; [1A 90, 05, 05][, E0 ED, 05] -0C66; [1A 90, 05, 05][, E1 11, 05] -0CE6; [1A 90, 05, 05][, E1 21, 05] -0D66; [1A 90, 05, 05][, E1 31, 05] -0E50; [1A 90, 05, 05][, E1 41, 05] -0ED0; [1A 90, 05, 05][, E1 51, 05] -0F20; [1A 90, 05, 05][, E1 61, 05] -0F33; [1A 90, 05, 05][, E1 61, 05] -1040; [1A 90, 05, 05][, E1 71, 05] -17E0; [1A 90, 05, 05][, E1 81, 05] -1810; [1A 90, 05, 05][, E1 91, 05] -3007; [1A 90, 05, 05][, E1 A1, 05] -3358; [1A 90, 05, 09][E0 49 8D, 05, 09] - -0031; [1A 92, 05, 05] -FF11; [1A 92, 05, 07] -D835 DFCF; [1A 92, 05, 0B] -D835 DFD9; [1A 92, 05, 0B] -D835 DFE3; [1A 92, 05, 0B] -D835 DFED; [1A 92, 05, 0B] -D835 DFF7; [1A 92, 05, 0B] -2460; [1A 92, 05, 0D] -00B9; [1A 92, 05, 27] -2081; [1A 92, 05, 29] -2776; [1A 92, 05, 0D][, E0 3D, 0D] -2780; [1A 92, 05, 0D][, E0 4D, 0D] -278A; [1A 92, 05, 0D][, E0 5D, 0D] -0661; [1A 92, 05, 05][, E0 6D, 05] -06F1; [1A 92, 05, 05][, E0 7D, 05] -1369; [1A 92, 05, 05][, E0 8D, 05] -0967; [1A 92, 05, 05][, E0 9D, 05] -09E7; [1A 92, 05, 05][, E0 AD, 05] -09F4; [1A 92, 05, 05][, E0 BD, 05] -0A67; [1A 92, 05, 05][, E0 CD, 05] -0AE7; [1A 92, 05, 05][, E0 DD, 05] -0B67; [1A 92, 05, 05][, E0 ED, 05] -0BE7; [1A 92, 05, 05][, E0 FD, 05] -0C67; [1A 92, 05, 05][, E1 11, 05] -0CE7; [1A 92, 05, 05][, E1 21, 05] -0D67; [1A 92, 05, 05][, E1 31, 05] -0E51; [1A 92, 05, 05][, E1 41, 05] -0ED1; [1A 92, 05, 05][, E1 51, 05] -0F21; [1A 92, 05, 05][, E1 61, 05] -0F2A; [1A 92, 05, 05][, E1 61, 05] -1041; [1A 92, 05, 05][, E1 71, 05] -17E1; [1A 92, 05, 05][, E1 81, 05] -1811; [1A 92, 05, 05][, E1 91, 05] -3021; [1A 92, 05, 05][, E1 A1, 05] -D800 DF20; [1A 92, 05, 05][, E1 B1, 05] -2488; [1A 92, 05, 09][07 F6, 05, 09] -215F; [1A 92, 05, 3B][08 9B, 05, 3B] -00BD; [1A 92, 05, 3B][08 9B, 05, 3B][1A 94, 05, 3D] -2153; [1A 92, 05, 3B][08 9B, 05, 3B][1A 96, 05, 3D] -00BC; [1A 92, 05, 3B][08 9B, 05, 3B][1A 98, 05, 3D] -2155; [1A 92, 05, 3B][08 9B, 05, 3B][1A 9A, 05, 3D] -2159; [1A 92, 05, 3B][08 9B, 05, 3B][1A 9C, 05, 3D] -215B; [1A 92, 05, 3B][08 9B, 05, 3B][1A A0, 05, 3D] -2469; [1A 92, 05, 0D][1A 90, 05, 0D] -2491; [1A 92, 05, 09][1A 90, 05, 09][07 F6, 05, 3D] -33E9; [1A 92, 05, 09][1A 90, 05, 09][E0 33 8D, 05, 3D] -32C9; [1A 92, 05, 09][1A 90, 05, 09][E0 35 DB, 05, 3D] -3362; [1A 92, 05, 09][1A 90, 05, 09][E0 49 8D, 05, 3D] -246A; [1A 92, 05, 0D][1A 92, 05, 0D] -2492; [1A 92, 05, 09][1A 92, 05, 09][07 F6, 05, 3D] -33EA; [1A 92, 05, 09][1A 92, 05, 09][E0 33 8D, 05, 3D] -32CA; [1A 92, 05, 09][1A 92, 05, 09][E0 35 DB, 05, 3D] -3363; [1A 92, 05, 09][1A 92, 05, 09][E0 49 8D, 05, 3D] -246B; [1A 92, 05, 0D][1A 94, 05, 0D] -2493; [1A 92, 05, 09][1A 94, 05, 09][07 F6, 05, 3D] -33EB; [1A 92, 05, 09][1A 94, 05, 09][E0 33 8D, 05, 3D] -32CB; [1A 92, 05, 09][1A 94, 05, 09][E0 35 DB, 05, 3D] -3364; [1A 92, 05, 09][1A 94, 05, 09][E0 49 8D, 05, 3D] -246C; [1A 92, 05, 0D][1A 96, 05, 0D] -2494; [1A 92, 05, 09][1A 96, 05, 09][07 F6, 05, 3D] -33EC; [1A 92, 05, 09][1A 96, 05, 09][E0 33 8D, 05, 3D] -3365; [1A 92, 05, 09][1A 96, 05, 09][E0 49 8D, 05, 3D] -246D; [1A 92, 05, 0D][1A 98, 05, 0D] -2495; [1A 92, 05, 09][1A 98, 05, 09][07 F6, 05, 3D] -33ED; [1A 92, 05, 09][1A 98, 05, 09][E0 33 8D, 05, 3D] -3366; [1A 92, 05, 09][1A 98, 05, 09][E0 49 8D, 05, 3D] -246E; [1A 92, 05, 0D][1A 9A, 05, 0D] -2496; [1A 92, 05, 09][1A 9A, 05, 09][07 F6, 05, 3D] -33EE; [1A 92, 05, 09][1A 9A, 05, 09][E0 33 8D, 05, 3D] -3367; [1A 92, 05, 09][1A 9A, 05, 09][E0 49 8D, 05, 3D] -246F; [1A 92, 05, 0D][1A 9C, 05, 0D] -2497; [1A 92, 05, 09][1A 9C, 05, 09][07 F6, 05, 3D] -33EF; [1A 92, 05, 09][1A 9C, 05, 09][E0 33 8D, 05, 3D] -3368; [1A 92, 05, 09][1A 9C, 05, 09][E0 49 8D, 05, 3D] -2470; [1A 92, 05, 0D][1A 9E, 05, 0D] -2498; [1A 92, 05, 09][1A 9E, 05, 09][07 F6, 05, 3D] -33F0; [1A 92, 05, 09][1A 9E, 05, 09][E0 33 8D, 05, 3D] -3369; [1A 92, 05, 09][1A 9E, 05, 09][E0 49 8D, 05, 3D] -2471; [1A 92, 05, 0D][1A A0, 05, 0D] -2499; [1A 92, 05, 09][1A A0, 05, 09][07 F6, 05, 3D] -33F1; [1A 92, 05, 09][1A A0, 05, 09][E0 33 8D, 05, 3D] -336A; [1A 92, 05, 09][1A A0, 05, 09][E0 49 8D, 05, 3D] -2472; [1A 92, 05, 0D][1A A2, 05, 0D] -249A; [1A 92, 05, 09][1A A2, 05, 09][07 F6, 05, 3D] -33F2; [1A 92, 05, 09][1A A2, 05, 09][E0 33 8D, 05, 3D] -336B; [1A 92, 05, 09][1A A2, 05, 09][E0 49 8D, 05, 3D] -33E0; [1A 92, 05, 09][E0 33 8D, 05, 09] -32C0; [1A 92, 05, 09][E0 35 DB, 05, 09] -3359; [1A 92, 05, 09][E0 49 8D, 05, 09] - -0032; [1A 94, 05, 05] -FF12; [1A 94, 05, 07] -D835 DFD0; [1A 94, 05, 0B] -D835 DFDA; [1A 94, 05, 0B] -D835 DFE4; [1A 94, 05, 0B] -D835 DFEE; [1A 94, 05, 0B] -D835 DFF8; [1A 94, 05, 0B] -2461; [1A 94, 05, 0D] -00B2; [1A 94, 05, 27] -2082; [1A 94, 05, 29] -2777; [1A 94, 05, 0D][, E0 3D, 0D] -2781; [1A 94, 05, 0D][, E0 4D, 0D] -278B; [1A 94, 05, 0D][, E0 5D, 0D] -0662; [1A 94, 05, 05][, E0 6D, 05] -06F2; [1A 94, 05, 05][, E0 7D, 05] -136A; [1A 94, 05, 05][, E0 8D, 05] -0968; [1A 94, 05, 05][, E0 9D, 05] -09E8; [1A 94, 05, 05][, E0 AD, 05] -09F5; [1A 94, 05, 05][, E0 BD, 05] -0A68; [1A 94, 05, 05][, E0 CD, 05] -0AE8; [1A 94, 05, 05][, E0 DD, 05] -0B68; [1A 94, 05, 05][, E0 ED, 05] -0BE8; [1A 94, 05, 05][, E0 FD, 05] -0C68; [1A 94, 05, 05][, E1 11, 05] -0CE8; [1A 94, 05, 05][, E1 21, 05] -0D68; [1A 94, 05, 05][, E1 31, 05] -0E52; [1A 94, 05, 05][, E1 41, 05] -0ED2; [1A 94, 05, 05][, E1 51, 05] -0F22; [1A 94, 05, 05][, E1 61, 05] -0F2B; [1A 94, 05, 05][, E1 61, 05] -1042; [1A 94, 05, 05][, E1 71, 05] -17E2; [1A 94, 05, 05][, E1 81, 05] -1812; [1A 94, 05, 05][, E1 91, 05] -3022; [1A 94, 05, 05][, E1 A1, 05] -2489; [1A 94, 05, 09][07 F6, 05, 09] -2154; [1A 94, 05, 3B][08 9B, 05, 3B][1A 96, 05, 3D] -2156; [1A 94, 05, 3B][08 9B, 05, 3B][1A 9A, 05, 3D] -2473; [1A 94, 05, 0D][1A 90, 05, 0D] -249B; [1A 94, 05, 09][1A 90, 05, 09][07 F6, 05, 3D] -33F3; [1A 94, 05, 09][1A 90, 05, 09][E0 33 8D, 05, 3D] -336C; [1A 94, 05, 09][1A 90, 05, 09][E0 49 8D, 05, 3D] -33F4; [1A 94, 05, 09][1A 92, 05, 09][E0 33 8D, 05, 3D] -336D; [1A 94, 05, 09][1A 92, 05, 09][E0 49 8D, 05, 3D] -33F5; [1A 94, 05, 09][1A 94, 05, 09][E0 33 8D, 05, 3D] -336E; [1A 94, 05, 09][1A 94, 05, 09][E0 49 8D, 05, 3D] -33F6; [1A 94, 05, 09][1A 96, 05, 09][E0 33 8D, 05, 3D] -336F; [1A 94, 05, 09][1A 96, 05, 09][E0 49 8D, 05, 3D] -33F7; [1A 94, 05, 09][1A 98, 05, 09][E0 33 8D, 05, 3D] -3370; [1A 94, 05, 09][1A 98, 05, 09][E0 49 8D, 05, 3D] -33F8; [1A 94, 05, 09][1A 9A, 05, 09][E0 33 8D, 05, 3D] -33F9; [1A 94, 05, 09][1A 9C, 05, 09][E0 33 8D, 05, 3D] -33FA; [1A 94, 05, 09][1A 9E, 05, 09][E0 33 8D, 05, 3D] -33FB; [1A 94, 05, 09][1A A0, 05, 09][E0 33 8D, 05, 3D] -33FC; [1A 94, 05, 09][1A A2, 05, 09][E0 33 8D, 05, 3D] -33E1; [1A 94, 05, 09][E0 33 8D, 05, 09] -32C1; [1A 94, 05, 09][E0 35 DB, 05, 09] -335A; [1A 94, 05, 09][E0 49 8D, 05, 09] - -0033; [1A 96, 05, 05] -FF13; [1A 96, 05, 07] -D835 DFD1; [1A 96, 05, 0B] -D835 DFDB; [1A 96, 05, 0B] -D835 DFE5; [1A 96, 05, 0B] -D835 DFEF; [1A 96, 05, 0B] -D835 DFF9; [1A 96, 05, 0B] -2462; [1A 96, 05, 0D] -00B3; [1A 96, 05, 27] -2083; [1A 96, 05, 29] -2778; [1A 96, 05, 0D][, E0 3D, 0D] -2782; [1A 96, 05, 0D][, E0 4D, 0D] -278C; [1A 96, 05, 0D][, E0 5D, 0D] -0663; [1A 96, 05, 05][, E0 6D, 05] -06F3; [1A 96, 05, 05][, E0 7D, 05] -136B; [1A 96, 05, 05][, E0 8D, 05] -0969; [1A 96, 05, 05][, E0 9D, 05] -09E9; [1A 96, 05, 05][, E0 AD, 05] -09F6; [1A 96, 05, 05][, E0 BD, 05] -0A69; [1A 96, 05, 05][, E0 CD, 05] -0AE9; [1A 96, 05, 05][, E0 DD, 05] -0B69; [1A 96, 05, 05][, E0 ED, 05] -0BE9; [1A 96, 05, 05][, E0 FD, 05] -0C69; [1A 96, 05, 05][, E1 11, 05] -0CE9; [1A 96, 05, 05][, E1 21, 05] -0D69; [1A 96, 05, 05][, E1 31, 05] -0E53; [1A 96, 05, 05][, E1 41, 05] -0ED3; [1A 96, 05, 05][, E1 51, 05] -0F23; [1A 96, 05, 05][, E1 61, 05] -0F2C; [1A 96, 05, 05][, E1 61, 05] -1043; [1A 96, 05, 05][, E1 71, 05] -17E3; [1A 96, 05, 05][, E1 81, 05] -1813; [1A 96, 05, 05][, E1 91, 05] -3023; [1A 96, 05, 05][, E1 A1, 05] -248A; [1A 96, 05, 09][07 F6, 05, 09] -00BE; [1A 96, 05, 3B][08 9B, 05, 3B][1A 98, 05, 3D] -2157; [1A 96, 05, 3B][08 9B, 05, 3B][1A 9A, 05, 3D] -215C; [1A 96, 05, 3B][08 9B, 05, 3B][1A A0, 05, 3D] -33FD; [1A 96, 05, 09][1A 90, 05, 09][E0 33 8D, 05, 3D] -33FE; [1A 96, 05, 09][1A 92, 05, 09][E0 33 8D, 05, 3D] -33E2; [1A 96, 05, 09][E0 33 8D, 05, 09] -32C2; [1A 96, 05, 09][E0 35 DB, 05, 09] -335B; [1A 96, 05, 09][E0 49 8D, 05, 09] - -0034; [1A 98, 05, 05] -FF14; [1A 98, 05, 07] -D835 DFD2; [1A 98, 05, 0B] -D835 DFDC; [1A 98, 05, 0B] -D835 DFE6; [1A 98, 05, 0B] -D835 DFF0; [1A 98, 05, 0B] -D835 DFFA; [1A 98, 05, 0B] -2463; [1A 98, 05, 0D] -2074; [1A 98, 05, 27] -2084; [1A 98, 05, 29] -2779; [1A 98, 05, 0D][, E0 3D, 0D] -2783; [1A 98, 05, 0D][, E0 4D, 0D] -278D; [1A 98, 05, 0D][, E0 5D, 0D] -0664; [1A 98, 05, 05][, E0 6D, 05] -06F4; [1A 98, 05, 05][, E0 7D, 05] -136C; [1A 98, 05, 05][, E0 8D, 05] -096A; [1A 98, 05, 05][, E0 9D, 05] -09EA; [1A 98, 05, 05][, E0 AD, 05] -09F7; [1A 98, 05, 05][, E0 BD, 05] -0A6A; [1A 98, 05, 05][, E0 CD, 05] -0AEA; [1A 98, 05, 05][, E0 DD, 05] -0B6A; [1A 98, 05, 05][, E0 ED, 05] -0BEA; [1A 98, 05, 05][, E0 FD, 05] -0C6A; [1A 98, 05, 05][, E1 11, 05] -0CEA; [1A 98, 05, 05][, E1 21, 05] -0D6A; [1A 98, 05, 05][, E1 31, 05] -0E54; [1A 98, 05, 05][, E1 41, 05] -0ED4; [1A 98, 05, 05][, E1 51, 05] -0F24; [1A 98, 05, 05][, E1 61, 05] -0F2D; [1A 98, 05, 05][, E1 61, 05] -1044; [1A 98, 05, 05][, E1 71, 05] -17E4; [1A 98, 05, 05][, E1 81, 05] -1814; [1A 98, 05, 05][, E1 91, 05] -3024; [1A 98, 05, 05][, E1 A1, 05] -248B; [1A 98, 05, 09][07 F6, 05, 09] -2158; [1A 98, 05, 3B][08 9B, 05, 3B][1A 9A, 05, 3D] -33E3; [1A 98, 05, 09][E0 33 8D, 05, 09] -32C3; [1A 98, 05, 09][E0 35 DB, 05, 09] -335C; [1A 98, 05, 09][E0 49 8D, 05, 09] - -0035; [1A 9A, 05, 05] -FF15; [1A 9A, 05, 07] -D835 DFD3; [1A 9A, 05, 0B] -D835 DFDD; [1A 9A, 05, 0B] -D835 DFE7; [1A 9A, 05, 0B] -D835 DFF1; [1A 9A, 05, 0B] -D835 DFFB; [1A 9A, 05, 0B] -2464; [1A 9A, 05, 0D] -2075; [1A 9A, 05, 27] -2085; [1A 9A, 05, 29] -277A; [1A 9A, 05, 0D][, E0 3D, 0D] -2784; [1A 9A, 05, 0D][, E0 4D, 0D] -278E; [1A 9A, 05, 0D][, E0 5D, 0D] -0665; [1A 9A, 05, 05][, E0 6D, 05] -06F5; [1A 9A, 05, 05][, E0 7D, 05] -136D; [1A 9A, 05, 05][, E0 8D, 05] -096B; [1A 9A, 05, 05][, E0 9D, 05] -09EB; [1A 9A, 05, 05][, E0 AD, 05] -0A6B; [1A 9A, 05, 05][, E0 CD, 05] -0AEB; [1A 9A, 05, 05][, E0 DD, 05] -0B6B; [1A 9A, 05, 05][, E0 ED, 05] -0BEB; [1A 9A, 05, 05][, E0 FD, 05] -0C6B; [1A 9A, 05, 05][, E1 11, 05] -0CEB; [1A 9A, 05, 05][, E1 21, 05] -0D6B; [1A 9A, 05, 05][, E1 31, 05] -0E55; [1A 9A, 05, 05][, E1 41, 05] -0ED5; [1A 9A, 05, 05][, E1 51, 05] -0F25; [1A 9A, 05, 05][, E1 61, 05] -0F2E; [1A 9A, 05, 05][, E1 61, 05] -1045; [1A 9A, 05, 05][, E1 71, 05] -17E5; [1A 9A, 05, 05][, E1 81, 05] -1815; [1A 9A, 05, 05][, E1 91, 05] -3025; [1A 9A, 05, 05][, E1 A1, 05] -D800 DF21; [1A 9A, 05, 05][, E1 B1, 05] -248C; [1A 9A, 05, 09][07 F6, 05, 09] -215A; [1A 9A, 05, 3B][08 9B, 05, 3B][1A 9C, 05, 3D] -215D; [1A 9A, 05, 3B][08 9B, 05, 3B][1A A0, 05, 3D] -33E4; [1A 9A, 05, 09][E0 33 8D, 05, 09] -32C4; [1A 9A, 05, 09][E0 35 DB, 05, 09] -335D; [1A 9A, 05, 09][E0 49 8D, 05, 09] - -0036; [1A 9C, 05, 05] -FF16; [1A 9C, 05, 07] -D835 DFD4; [1A 9C, 05, 0B] -D835 DFDE; [1A 9C, 05, 0B] -D835 DFE8; [1A 9C, 05, 0B] -D835 DFF2; [1A 9C, 05, 0B] -D835 DFFC; [1A 9C, 05, 0B] -2465; [1A 9C, 05, 0D] -2076; [1A 9C, 05, 27] -2086; [1A 9C, 05, 29] -277B; [1A 9C, 05, 0D][, E0 3D, 0D] -2785; [1A 9C, 05, 0D][, E0 4D, 0D] -278F; [1A 9C, 05, 0D][, E0 5D, 0D] -0666; [1A 9C, 05, 05][, E0 6D, 05] -06F6; [1A 9C, 05, 05][, E0 7D, 05] -136E; [1A 9C, 05, 05][, E0 8D, 05] -096C; [1A 9C, 05, 05][, E0 9D, 05] -09EC; [1A 9C, 05, 05][, E0 AD, 05] -0A6C; [1A 9C, 05, 05][, E0 CD, 05] -0AEC; [1A 9C, 05, 05][, E0 DD, 05] -0B6C; [1A 9C, 05, 05][, E0 ED, 05] -0BEC; [1A 9C, 05, 05][, E0 FD, 05] -0C6C; [1A 9C, 05, 05][, E1 11, 05] -0CEC; [1A 9C, 05, 05][, E1 21, 05] -0D6C; [1A 9C, 05, 05][, E1 31, 05] -0E56; [1A 9C, 05, 05][, E1 41, 05] -0ED6; [1A 9C, 05, 05][, E1 51, 05] -0F26; [1A 9C, 05, 05][, E1 61, 05] -0F2F; [1A 9C, 05, 05][, E1 61, 05] -1046; [1A 9C, 05, 05][, E1 71, 05] -17E6; [1A 9C, 05, 05][, E1 81, 05] -1816; [1A 9C, 05, 05][, E1 91, 05] -3026; [1A 9C, 05, 05][, E1 A1, 05] -248D; [1A 9C, 05, 09][07 F6, 05, 09] -33E5; [1A 9C, 05, 09][E0 33 8D, 05, 09] -32C5; [1A 9C, 05, 09][E0 35 DB, 05, 09] -335E; [1A 9C, 05, 09][E0 49 8D, 05, 09] - -0037; [1A 9E, 05, 05] -FF17; [1A 9E, 05, 07] -D835 DFD5; [1A 9E, 05, 0B] -D835 DFDF; [1A 9E, 05, 0B] -D835 DFE9; [1A 9E, 05, 0B] -D835 DFF3; [1A 9E, 05, 0B] -D835 DFFD; [1A 9E, 05, 0B] -2466; [1A 9E, 05, 0D] -2077; [1A 9E, 05, 27] -2087; [1A 9E, 05, 29] -277C; [1A 9E, 05, 0D][, E0 3D, 0D] -2786; [1A 9E, 05, 0D][, E0 4D, 0D] -2790; [1A 9E, 05, 0D][, E0 5D, 0D] -0667; [1A 9E, 05, 05][, E0 6D, 05] -06F7; [1A 9E, 05, 05][, E0 7D, 05] -136F; [1A 9E, 05, 05][, E0 8D, 05] -096D; [1A 9E, 05, 05][, E0 9D, 05] -09ED; [1A 9E, 05, 05][, E0 AD, 05] -0A6D; [1A 9E, 05, 05][, E0 CD, 05] -0AED; [1A 9E, 05, 05][, E0 DD, 05] -0B6D; [1A 9E, 05, 05][, E0 ED, 05] -0BED; [1A 9E, 05, 05][, E0 FD, 05] -0C6D; [1A 9E, 05, 05][, E1 11, 05] -0CED; [1A 9E, 05, 05][, E1 21, 05] -0D6D; [1A 9E, 05, 05][, E1 31, 05] -0E57; [1A 9E, 05, 05][, E1 41, 05] -0ED7; [1A 9E, 05, 05][, E1 51, 05] -0F27; [1A 9E, 05, 05][, E1 61, 05] -0F30; [1A 9E, 05, 05][, E1 61, 05] -1047; [1A 9E, 05, 05][, E1 71, 05] -17E7; [1A 9E, 05, 05][, E1 81, 05] -1817; [1A 9E, 05, 05][, E1 91, 05] -3027; [1A 9E, 05, 05][, E1 A1, 05] -248E; [1A 9E, 05, 09][07 F6, 05, 09] -215E; [1A 9E, 05, 3B][08 9B, 05, 3B][1A A0, 05, 3D] -33E6; [1A 9E, 05, 09][E0 33 8D, 05, 09] -32C6; [1A 9E, 05, 09][E0 35 DB, 05, 09] -335F; [1A 9E, 05, 09][E0 49 8D, 05, 09] - -0038; [1A A0, 05, 05] -FF18; [1A A0, 05, 07] -D835 DFD6; [1A A0, 05, 0B] -D835 DFE0; [1A A0, 05, 0B] -D835 DFEA; [1A A0, 05, 0B] -D835 DFF4; [1A A0, 05, 0B] -D835 DFFE; [1A A0, 05, 0B] -2467; [1A A0, 05, 0D] -2078; [1A A0, 05, 27] -2088; [1A A0, 05, 29] -277D; [1A A0, 05, 0D][, E0 3D, 0D] -2787; [1A A0, 05, 0D][, E0 4D, 0D] -2791; [1A A0, 05, 0D][, E0 5D, 0D] -0668; [1A A0, 05, 05][, E0 6D, 05] -06F8; [1A A0, 05, 05][, E0 7D, 05] -1370; [1A A0, 05, 05][, E0 8D, 05] -096E; [1A A0, 05, 05][, E0 9D, 05] -09EE; [1A A0, 05, 05][, E0 AD, 05] -0A6E; [1A A0, 05, 05][, E0 CD, 05] -0AEE; [1A A0, 05, 05][, E0 DD, 05] -0B6E; [1A A0, 05, 05][, E0 ED, 05] -0BEE; [1A A0, 05, 05][, E0 FD, 05] -0C6E; [1A A0, 05, 05][, E1 11, 05] -0CEE; [1A A0, 05, 05][, E1 21, 05] -0D6E; [1A A0, 05, 05][, E1 31, 05] -0E58; [1A A0, 05, 05][, E1 41, 05] -0ED8; [1A A0, 05, 05][, E1 51, 05] -0F28; [1A A0, 05, 05][, E1 61, 05] -0F31; [1A A0, 05, 05][, E1 61, 05] -1048; [1A A0, 05, 05][, E1 71, 05] -17E8; [1A A0, 05, 05][, E1 81, 05] -1818; [1A A0, 05, 05][, E1 91, 05] -3028; [1A A0, 05, 05][, E1 A1, 05] -248F; [1A A0, 05, 09][07 F6, 05, 09] -33E7; [1A A0, 05, 09][E0 33 8D, 05, 09] -32C7; [1A A0, 05, 09][E0 35 DB, 05, 09] -3360; [1A A0, 05, 09][E0 49 8D, 05, 09] - -0039; [1A A2, 05, 05] -FF19; [1A A2, 05, 07] -D835 DFD7; [1A A2, 05, 0B] -D835 DFE1; [1A A2, 05, 0B] -D835 DFEB; [1A A2, 05, 0B] -D835 DFF5; [1A A2, 05, 0B] -D835 DFFF; [1A A2, 05, 0B] -2468; [1A A2, 05, 0D] -2079; [1A A2, 05, 27] -2089; [1A A2, 05, 29] -277E; [1A A2, 05, 0D][, E0 3D, 0D] -2788; [1A A2, 05, 0D][, E0 4D, 0D] -2792; [1A A2, 05, 0D][, E0 5D, 0D] -0669; [1A A2, 05, 05][, E0 6D, 05] -06F9; [1A A2, 05, 05][, E0 7D, 05] -1371; [1A A2, 05, 05][, E0 8D, 05] -096F; [1A A2, 05, 05][, E0 9D, 05] -09EF; [1A A2, 05, 05][, E0 AD, 05] -0A6F; [1A A2, 05, 05][, E0 CD, 05] -0AEF; [1A A2, 05, 05][, E0 DD, 05] -0B6F; [1A A2, 05, 05][, E0 ED, 05] -0BEF; [1A A2, 05, 05][, E0 FD, 05] -0C6F; [1A A2, 05, 05][, E1 11, 05] -0CEF; [1A A2, 05, 05][, E1 21, 05] -0D6F; [1A A2, 05, 05][, E1 31, 05] -0E59; [1A A2, 05, 05][, E1 41, 05] -0ED9; [1A A2, 05, 05][, E1 51, 05] -0F29; [1A A2, 05, 05][, E1 61, 05] -0F32; [1A A2, 05, 05][, E1 61, 05] -1049; [1A A2, 05, 05][, E1 71, 05] -17E9; [1A A2, 05, 05][, E1 81, 05] -1819; [1A A2, 05, 05][, E1 91, 05] -3029; [1A A2, 05, 05][, E1 A1, 05] -2490; [1A A2, 05, 09][07 F6, 05, 09] -33E8; [1A A2, 05, 09][E0 33 8D, 05, 09] -32C8; [1A A2, 05, 09][E0 35 DB, 05, 09] -3361; [1A A2, 05, 09][E0 49 8D, 05, 09] - -0061; [1D, 05, 05] -FF41; [1D, 05, 07] -D835 DC1A; [1D, 05, 0B] -D835 DC4E; [1D, 05, 0B] -D835 DC82; [1D, 05, 0B] -D835 DCB6; [1D, 05, 0B] -D835 DCEA; [1D, 05, 0B] -D835 DD1E; [1D, 05, 0B] -D835 DD52; [1D, 05, 0B] -D835 DD86; [1D, 05, 0B] -D835 DDBA; [1D, 05, 0B] -D835 DDEE; [1D, 05, 0B] -D835 DE22; [1D, 05, 0B] -D835 DE56; [1D, 05, 0B] -D835 DE8A; [1D, 05, 0B] -24D0; [1D, 05, 0D] -0041; [1D, 05, 8F] -FF21; [1D, 05, 91] -D835 DC00; [1D, 05, 95] -D835 DC34; [1D, 05, 95] -D835 DC68; [1D, 05, 95] -D835 DC9C; [1D, 05, 95] -D835 DCD0; [1D, 05, 95] -D835 DD04; [1D, 05, 95] -D835 DD38; [1D, 05, 95] -D835 DD6C; [1D, 05, 95] -D835 DDA0; [1D, 05, 95] -D835 DDD4; [1D, 05, 95] -D835 DE08; [1D, 05, 95] -D835 DE3C; [1D, 05, 95] -D835 DE70; [1D, 05, 95] -24B6; [1D, 05, 97] -00AA; [1D, 05, 27] -00E1; [1D, 05, 05][, 8D, 05] -00C1; [1D, 05, 8F][, 8D, 05] -00E0; [1D, 05, 05][, 8F, 05] -00C0; [1D, 05, 8F][, 8F, 05] -0103; [1D, 05, 05][, 91, 05] -0102; [1D, 05, 8F][, 91, 05] -1EAF; [1D, 05, 05][, 91, 05][, 8D, 05] -1EAE; [1D, 05, 8F][, 91, 05][, 8D, 05] -1EB1; [1D, 05, 05][, 91, 05][, 8F, 05] -1EB0; [1D, 05, 8F][, 91, 05][, 8F, 05] -1EB5; [1D, 05, 05][, 91, 05][, A1, 05] -1EB4; [1D, 05, 8F][, 91, 05][, A1, 05] -1EB3; [1D, 05, 05][, 91, 05][, AF, 05] -1EB2; [1D, 05, 8F][, 91, 05][, AF, 05] -00E2; [1D, 05, 05][, 93, 05] -00C2; [1D, 05, 8F][, 93, 05] -1EA5; [1D, 05, 05][, 93, 05][, 8D, 05] -1EA4; [1D, 05, 8F][, 93, 05][, 8D, 05] -1EA7; [1D, 05, 05][, 93, 05][, 8F, 05] -1EA6; [1D, 05, 8F][, 93, 05][, 8F, 05] -1EAB; [1D, 05, 05][, 93, 05][, A1, 05] -1EAA; [1D, 05, 8F][, 93, 05][, A1, 05] -1EA9; [1D, 05, 05][, 93, 05][, AF, 05] -1EA8; [1D, 05, 8F][, 93, 05][, AF, 05] -01CE; [1D, 05, 05][, 97, 05] -01CD; [1D, 05, 8F][, 97, 05] -00E5; [1D, 05, 05][, 99, 05] -00C5; [1D, 05, 8F][, 99, 05] -212B; [1D, 05, 8F][, 99, 05] -01FB; [1D, 05, 05][, 99, 05][, 8D, 05] -01FA; [1D, 05, 8F][, 99, 05][, 8D, 05] -00E4; [1D, 05, 05][, 9D, 05] -00C4; [1D, 05, 8F][, 9D, 05] -01DF; [1D, 05, 05][, 9D, 05][, AB, 05] -01DE; [1D, 05, 8F][, 9D, 05][, AB, 05] -00E3; [1D, 05, 05][, A1, 05] -00C3; [1D, 05, 8F][, A1, 05] -0227; [1D, 05, 05][, A3, 05] -0226; [1D, 05, 8F][, A3, 05] -01E1; [1D, 05, 05][, A3, 05][, AB, 05] -01E0; [1D, 05, 8F][, A3, 05][, AB, 05] -0105; [1D, 05, 05][, A9, 05] -0104; [1D, 05, 8F][, A9, 05] -0101; [1D, 05, 05][, AB, 05] -0100; [1D, 05, 8F][, AB, 05] -1EA3; [1D, 05, 05][, AF, 05] -1EA2; [1D, 05, 8F][, AF, 05] -0201; [1D, 05, 05][, B5, 05] -0200; [1D, 05, 8F][, B5, 05] -0203; [1D, 05, 05][, B9, 05] -0202; [1D, 05, 8F][, B9, 05] -1EA1; [1D, 05, 05][, D0 4D, 05] -1EA0; [1D, 05, 8F][, D0 4D, 05] -1EB7; [1D, 05, 05][, D0 4D, 05][, 91, 05] -1EB6; [1D, 05, 8F][, D0 4D, 05][, 91, 05] -1EAD; [1D, 05, 05][, D0 4D, 05][, 93, 05] -1EAC; [1D, 05, 8F][, D0 4D, 05][, 93, 05] -1E01; [1D, 05, 05][, D0 6D, 05] -1E00; [1D, 05, 8F][, D0 6D, 05] -33C2; [1D, 05, 37][07 F6, 05, 37][35, 05, 3D][07 F6, 05, 3D] -2100; [1D, 05, 09][08 99, 05, 09][21, 05, 3D] -2101; [1D, 05, 09][08 99, 05, 09][41, 05, 3D] -3373; [1D, 05, B9][45, 05, B9] -1E9A; [1D, 05, 09][50 86, 05, 09] - -00E6; [1E 60, 05, 05] -00C6; [1E 60, 05, 8F] -01FD; [1E 60, 05, 05][, 8D, 05] -01FC; [1E 60, 05, 8F][, 8D, 05] -01E3; [1E 60, 05, 05][, AB, 05] -01E2; [1E 60, 05, 8F][, AB, 05] - -0250; [1E 62, 05, 05] - -0251; [1E 64, 05, 05] - -0252; [1E 66, 05, 05] - -0062; [1F, 05, 05] -FF42; [1F, 05, 07] -D835 DC1B; [1F, 05, 0B] -D835 DC4F; [1F, 05, 0B] -D835 DC83; [1F, 05, 0B] -D835 DCB7; [1F, 05, 0B] -D835 DCEB; [1F, 05, 0B] -D835 DD1F; [1F, 05, 0B] -D835 DD53; [1F, 05, 0B] -D835 DD87; [1F, 05, 0B] -D835 DDBB; [1F, 05, 0B] -D835 DDEF; [1F, 05, 0B] -D835 DE23; [1F, 05, 0B] -D835 DE57; [1F, 05, 0B] -D835 DE8B; [1F, 05, 0B] -24D1; [1F, 05, 0D] -0042; [1F, 05, 8F] -FF22; [1F, 05, 91] -212C; [1F, 05, 95] -D835 DC01; [1F, 05, 95] -D835 DC35; [1F, 05, 95] -D835 DC69; [1F, 05, 95] -D835 DCD1; [1F, 05, 95] -D835 DD05; [1F, 05, 95] -D835 DD39; [1F, 05, 95] -D835 DD6D; [1F, 05, 95] -D835 DDA1; [1F, 05, 95] -D835 DDD5; [1F, 05, 95] -D835 DE09; [1F, 05, 95] -D835 DE3D; [1F, 05, 95] -D835 DE71; [1F, 05, 95] -24B7; [1F, 05, 97] -1E03; [1F, 05, 05][, A3, 05] -1E02; [1F, 05, 8F][, A3, 05] -1E05; [1F, 05, 05][, D0 4D, 05] -1E04; [1F, 05, 8F][, D0 4D, 05] -1E07; [1F, 05, 05][, D1 11, 05] -1E06; [1F, 05, 8F][, D1 11, 05] -3374; [1F, 05, 37][1D, 05, 37][3F, 05, 3D] -33C3; [1F, 05, B9][3D, 05, 37] - -0299; [20 60, 05, 05] - -0180; [20 62, 05, 05] - -0253; [20 64, 05, 05] -0181; [20 64, 05, 8F] - -0183; [20 66, 05, 05] -0182; [20 66, 05, 8F] - -0063; [21, 05, 05] -FF43; [21, 05, 07] -217D; [21, 05, 09] -D835 DC1C; [21, 05, 0B] -D835 DC50; [21, 05, 0B] -D835 DC84; [21, 05, 0B] -D835 DCB8; [21, 05, 0B] -D835 DCEC; [21, 05, 0B] -D835 DD20; [21, 05, 0B] -D835 DD54; [21, 05, 0B] -D835 DD88; [21, 05, 0B] -D835 DDBC; [21, 05, 0B] -D835 DDF0; [21, 05, 0B] -D835 DE24; [21, 05, 0B] -D835 DE58; [21, 05, 0B] -D835 DE8C; [21, 05, 0B] -24D2; [21, 05, 0D] -0043; [21, 05, 8F] -FF23; [21, 05, 91] -216D; [21, 05, 93] -2102; [21, 05, 95] -212D; [21, 05, 95] -D835 DC02; [21, 05, 95] -D835 DC36; [21, 05, 95] -D835 DC6A; [21, 05, 95] -D835 DC9E; [21, 05, 95] -D835 DCD2; [21, 05, 95] -D835 DD6E; [21, 05, 95] -D835 DDA2; [21, 05, 95] -D835 DDD6; [21, 05, 95] -D835 DE0A; [21, 05, 95] -D835 DE3E; [21, 05, 95] -D835 DE72; [21, 05, 95] -24B8; [21, 05, 97] -0107; [21, 05, 05][, 8D, 05] -0106; [21, 05, 8F][, 8D, 05] -0109; [21, 05, 05][, 93, 05] -0108; [21, 05, 8F][, 93, 05] -010D; [21, 05, 05][, 97, 05] -010C; [21, 05, 8F][, 97, 05] -010B; [21, 05, 05][, A3, 05] -010A; [21, 05, 8F][, A3, 05] -00E7; [21, 05, 05][, A7, 05] -00C7; [21, 05, 8F][, A7, 05] -1E09; [21, 05, 05][, A7, 05][, 8D, 05] -1E08; [21, 05, 8F][, A7, 05][, 8D, 05] -2105; [21, 05, 09][08 99, 05, 09][39, 05, 3D] -2106; [21, 05, 09][08 99, 05, 09][45, 05, 3D] -33C6; [21, 05, B9][0A B9, 05, 37][31, 05, 3D][29, 05, 3D] -3388; [21, 05, 37][1D, 05, 37][33, 05, 3D] -33C4; [21, 05, 37][21, 05, 37] -33C5; [21, 05, 37][23, 05, 37] -339D; [21, 05, 37][35, 05, 37] -33A0; [21, 05, 37][35, 05, 37][1A 94, 05, 3D] -33A4; [21, 05, 37][35, 05, 37][1A 96, 05, 3D] -33C7; [21, 05, B9][39, 05, 37][07 F6, 05, 3D] - -0188; [22 60, 05, 05] -0187; [22 60, 05, 8F] - -0255; [22 62, 05, 05] - -0064; [23, 05, 05] -FF44; [23, 05, 07] -217E; [23, 05, 09] -D835 DC1D; [23, 05, 0B] -D835 DC51; [23, 05, 0B] -D835 DC85; [23, 05, 0B] -D835 DCB9; [23, 05, 0B] -D835 DCED; [23, 05, 0B] -D835 DD21; [23, 05, 0B] -D835 DD55; [23, 05, 0B] -D835 DD89; [23, 05, 0B] -D835 DDBD; [23, 05, 0B] -D835 DDF1; [23, 05, 0B] -D835 DE25; [23, 05, 0B] -D835 DE59; [23, 05, 0B] -D835 DE8D; [23, 05, 0B] -24D3; [23, 05, 0D] -0044; [23, 05, 8F] -FF24; [23, 05, 91] -216E; [23, 05, 93] -D835 DC03; [23, 05, 95] -D835 DC37; [23, 05, 95] -D835 DC6B; [23, 05, 95] -D835 DC9F; [23, 05, 95] -D835 DCD3; [23, 05, 95] -D835 DD07; [23, 05, 95] -D835 DD3B; [23, 05, 95] -D835 DD6F; [23, 05, 95] -D835 DDA3; [23, 05, 95] -D835 DDD7; [23, 05, 95] -D835 DE0B; [23, 05, 95] -D835 DE3F; [23, 05, 95] -D835 DE73; [23, 05, 95] -24B9; [23, 05, 97] -010F; [23, 05, 05][, 97, 05] -010E; [23, 05, 8F][, 97, 05] -1E0B; [23, 05, 05][, A3, 05] -1E0A; [23, 05, 8F][, A3, 05] -1E11; [23, 05, 05][, A7, 05] -1E10; [23, 05, 8F][, A7, 05] -1E0D; [23, 05, 05][, D0 4D, 05] -1E0C; [23, 05, 8F][, D0 4D, 05] -1E13; [23, 05, 05][, D0 CD, 05] -1E12; [23, 05, 8F][, D0 CD, 05] -1E0F; [23, 05, 05][, D1 11, 05] -1E0E; [23, 05, 8F][, D1 11, 05] -3372; [23, 05, 37][1D, 05, 37] -33C8; [23, 05, 37][1F, 05, B9] -3397; [23, 05, 37][33, 05, 37] -01F3; [23, 05, 09][4F, 05, 09] -02A3; [23, 05, 09][4F, 05, 09] -01F2; [23, 05, 93][4F, 05, 09] -01F1; [23, 05, 93][4F, 05, 93] -01C6; [23, 05, 09][4F, 05, 09][, 97, 3D] -01C5; [23, 05, 93][4F, 05, 09][, 97, 3D] -01C4; [23, 05, 93][4F, 05, 93][, 97, 3D] -02A5; [23, 05, 09][50 66, 05, 09] -02A4; [23, 05, 09][50 68, 05, 09] - -0111; [24 60, 05, 05] -0110; [24 60, 05, 8F] - -0256; [24 62, 05, 05] -0189; [24 62, 05, 8F] - -0257; [24 64, 05, 05] -018A; [24 64, 05, 8F] - -018C; [24 66, 05, 05] -018B; [24 66, 05, 8F] - -00F0; [24 68, 05, 05] -00D0; [24 68, 05, 8F] - -018D; [24 6A, 05, 05] - -0065; [25, 05, 05] -FF45; [25, 05, 07] -212F; [25, 05, 0B] -D835 DC1E; [25, 05, 0B] -D835 DC52; [25, 05, 0B] -D835 DC86; [25, 05, 0B] -D835 DCEE; [25, 05, 0B] -D835 DD22; [25, 05, 0B] -D835 DD56; [25, 05, 0B] -D835 DD8A; [25, 05, 0B] -D835 DDBE; [25, 05, 0B] -D835 DDF2; [25, 05, 0B] -D835 DE26; [25, 05, 0B] -D835 DE5A; [25, 05, 0B] -D835 DE8E; [25, 05, 0B] -24D4; [25, 05, 0D] -0045; [25, 05, 8F] -FF25; [25, 05, 91] -2130; [25, 05, 95] -D835 DC04; [25, 05, 95] -D835 DC38; [25, 05, 95] -D835 DC6C; [25, 05, 95] -D835 DCD4; [25, 05, 95] -D835 DD08; [25, 05, 95] -D835 DD3C; [25, 05, 95] -D835 DD70; [25, 05, 95] -D835 DDA4; [25, 05, 95] -D835 DDD8; [25, 05, 95] -D835 DE0C; [25, 05, 95] -D835 DE40; [25, 05, 95] -D835 DE74; [25, 05, 95] -24BA; [25, 05, 97] -00E9; [25, 05, 05][, 8D, 05] -00C9; [25, 05, 8F][, 8D, 05] -00E8; [25, 05, 05][, 8F, 05] -00C8; [25, 05, 8F][, 8F, 05] -0115; [25, 05, 05][, 91, 05] -0114; [25, 05, 8F][, 91, 05] -00EA; [25, 05, 05][, 93, 05] -00CA; [25, 05, 8F][, 93, 05] -1EBF; [25, 05, 05][, 93, 05][, 8D, 05] -1EBE; [25, 05, 8F][, 93, 05][, 8D, 05] -1EC1; [25, 05, 05][, 93, 05][, 8F, 05] -1EC0; [25, 05, 8F][, 93, 05][, 8F, 05] -1EC5; [25, 05, 05][, 93, 05][, A1, 05] -1EC4; [25, 05, 8F][, 93, 05][, A1, 05] -1EC3; [25, 05, 05][, 93, 05][, AF, 05] -1EC2; [25, 05, 8F][, 93, 05][, AF, 05] -011B; [25, 05, 05][, 97, 05] -011A; [25, 05, 8F][, 97, 05] -00EB; [25, 05, 05][, 9D, 05] -00CB; [25, 05, 8F][, 9D, 05] -1EBD; [25, 05, 05][, A1, 05] -1EBC; [25, 05, 8F][, A1, 05] -0117; [25, 05, 05][, A3, 05] -0116; [25, 05, 8F][, A3, 05] -0229; [25, 05, 05][, A7, 05] -0228; [25, 05, 8F][, A7, 05] -1E1D; [25, 05, 05][, A7, 05][, 91, 05] -1E1C; [25, 05, 8F][, A7, 05][, 91, 05] -0119; [25, 05, 05][, A9, 05] -0118; [25, 05, 8F][, A9, 05] -0113; [25, 05, 05][, AB, 05] -0112; [25, 05, 8F][, AB, 05] -1E17; [25, 05, 05][, AB, 05][, 8D, 05] -1E16; [25, 05, 8F][, AB, 05][, 8D, 05] -1E15; [25, 05, 05][, AB, 05][, 8F, 05] -1E14; [25, 05, 8F][, AB, 05][, 8F, 05] -1EBB; [25, 05, 05][, AF, 05] -1EBA; [25, 05, 8F][, AF, 05] -0205; [25, 05, 05][, B5, 05] -0204; [25, 05, 8F][, B5, 05] -0207; [25, 05, 05][, B9, 05] -0206; [25, 05, 8F][, B9, 05] -1EB9; [25, 05, 05][, D0 4D, 05] -1EB8; [25, 05, 8F][, D0 4D, 05] -1EC7; [25, 05, 05][, D0 4D, 05][, 93, 05] -1EC6; [25, 05, 8F][, D0 4D, 05][, 93, 05] -1E19; [25, 05, 05][, D0 CD, 05] -1E18; [25, 05, 8F][, D0 CD, 05] -1E1B; [25, 05, 05][, D0 FD, 05] -1E1A; [25, 05, 8F][, D0 FD, 05] - -01DD; [26 60, 05, 05] -018E; [26 60, 05, 8F] - -0259; [26 62, 05, 05] -018F; [26 62, 05, 8F] - -025B; [26 64, 05, 05] -0190; [26 64, 05, 8F] -2107; [26 64, 05, 93] - -0258; [26 66, 05, 05] - -025A; [26 68, 05, 05] - -025C; [26 6A, 05, 05] - -025D; [26 6C, 05, 05] - -025E; [26 6E, 05, 05] - -029A; [26 70, 05, 05] - -0264; [26 72, 05, 05] - -0066; [27, 05, 05] -FF46; [27, 05, 07] -D835 DC1F; [27, 05, 0B] -D835 DC53; [27, 05, 0B] -D835 DC87; [27, 05, 0B] -D835 DCBB; [27, 05, 0B] -D835 DCEF; [27, 05, 0B] -D835 DD23; [27, 05, 0B] -D835 DD57; [27, 05, 0B] -D835 DD8B; [27, 05, 0B] -D835 DDBF; [27, 05, 0B] -D835 DDF3; [27, 05, 0B] -D835 DE27; [27, 05, 0B] -D835 DE5B; [27, 05, 0B] -D835 DE8F; [27, 05, 0B] -24D5; [27, 05, 0D] -0046; [27, 05, 8F] -FF26; [27, 05, 91] -2131; [27, 05, 95] -D835 DC05; [27, 05, 95] -D835 DC39; [27, 05, 95] -D835 DC6D; [27, 05, 95] -D835 DCD5; [27, 05, 95] -D835 DD09; [27, 05, 95] -D835 DD3D; [27, 05, 95] -D835 DD71; [27, 05, 95] -D835 DDA5; [27, 05, 95] -D835 DDD9; [27, 05, 95] -D835 DE0D; [27, 05, 95] -D835 DE41; [27, 05, 95] -D835 DE75; [27, 05, 95] -24BB; [27, 05, 97] -1E1F; [27, 05, 05][, A3, 05] -1E1E; [27, 05, 8F][, A3, 05] -FB00; [27, 05, 09][27, 05, 09] -FB03; [27, 05, 09][27, 05, 09][2D, 05, 3D] -FB04; [27, 05, 09][27, 05, 09][33, 05, 3D] -FB01; [27, 05, 09][2D, 05, 09] -FB02; [27, 05, 09][33, 05, 09] -3399; [27, 05, 37][35, 05, 37] -02A9; [27, 05, 09][38 68, 05, 09] - -0192; [28 60, 05, 05] -0191; [28 60, 05, 8F] - -0067; [29, 05, 05] -FF47; [29, 05, 07] -210A; [29, 05, 0B] -D835 DC20; [29, 05, 0B] -D835 DC54; [29, 05, 0B] -D835 DC88; [29, 05, 0B] -D835 DCF0; [29, 05, 0B] -D835 DD24; [29, 05, 0B] -D835 DD58; [29, 05, 0B] -D835 DD8C; [29, 05, 0B] -D835 DDC0; [29, 05, 0B] -D835 DDF4; [29, 05, 0B] -D835 DE28; [29, 05, 0B] -D835 DE5C; [29, 05, 0B] -D835 DE90; [29, 05, 0B] -24D6; [29, 05, 0D] -0047; [29, 05, 8F] -FF27; [29, 05, 91] -D835 DC06; [29, 05, 95] -D835 DC3A; [29, 05, 95] -D835 DC6E; [29, 05, 95] -D835 DCA2; [29, 05, 95] -D835 DCD6; [29, 05, 95] -D835 DD0A; [29, 05, 95] -D835 DD3E; [29, 05, 95] -D835 DD72; [29, 05, 95] -D835 DDA6; [29, 05, 95] -D835 DDDA; [29, 05, 95] -D835 DE0E; [29, 05, 95] -D835 DE42; [29, 05, 95] -D835 DE76; [29, 05, 95] -24BC; [29, 05, 97] -01F5; [29, 05, 05][, 8D, 05] -01F4; [29, 05, 8F][, 8D, 05] -011F; [29, 05, 05][, 91, 05] -011E; [29, 05, 8F][, 91, 05] -011D; [29, 05, 05][, 93, 05] -011C; [29, 05, 8F][, 93, 05] -01E7; [29, 05, 05][, 97, 05] -01E6; [29, 05, 8F][, 97, 05] -0121; [29, 05, 05][, A3, 05] -0120; [29, 05, 8F][, A3, 05] -0123; [29, 05, 05][, A7, 05] -0122; [29, 05, 8F][, A7, 05] -1E21; [29, 05, 05][, AB, 05] -1E20; [29, 05, 8F][, AB, 05] -3387; [29, 05, B9][1F, 05, B9] -3393; [29, 05, B9][2B, 05, B9][4F, 05, 3D] -33AC; [29, 05, B9][3B, 05, B9][1D, 05, 3D] -33C9; [29, 05, B9][4D, 05, 37] - -0262; [2A 60, 05, 05] - -01E5; [2A 62, 05, 05] -01E4; [2A 62, 05, 8F] - -0260; [2A 64, 05, 05] -0193; [2A 64, 05, 8F] - -029B; [2A 66, 05, 05] - -0263; [2A 68, 05, 05] -0194; [2A 68, 05, 8F] -02E0; [2A 68, 05, 27] - -0261; [2A 6A, 05, 05] - -01A3; [2A 6C, 05, 05] -01A2; [2A 6C, 05, 8F] - -0068; [2B, 05, 05] -FF48; [2B, 05, 07] -210E; [2B, 05, 0B] -D835 DC21; [2B, 05, 0B] -D835 DC89; [2B, 05, 0B] -D835 DCBD; [2B, 05, 0B] -D835 DCF1; [2B, 05, 0B] -D835 DD25; [2B, 05, 0B] -D835 DD59; [2B, 05, 0B] -D835 DD8D; [2B, 05, 0B] -D835 DDC1; [2B, 05, 0B] -D835 DDF5; [2B, 05, 0B] -D835 DE29; [2B, 05, 0B] -D835 DE5D; [2B, 05, 0B] -D835 DE91; [2B, 05, 0B] -24D7; [2B, 05, 0D] -0048; [2B, 05, 8F] -FF28; [2B, 05, 91] -210B; [2B, 05, 95] -210C; [2B, 05, 95] -210D; [2B, 05, 95] -D835 DC07; [2B, 05, 95] -D835 DC3B; [2B, 05, 95] -D835 DC6F; [2B, 05, 95] -D835 DCD7; [2B, 05, 95] -D835 DD73; [2B, 05, 95] -D835 DDA7; [2B, 05, 95] -D835 DDDB; [2B, 05, 95] -D835 DE0F; [2B, 05, 95] -D835 DE43; [2B, 05, 95] -D835 DE77; [2B, 05, 95] -24BD; [2B, 05, 97] -02B0; [2B, 05, 27] -0125; [2B, 05, 05][, 93, 05] -0124; [2B, 05, 8F][, 93, 05] -021F; [2B, 05, 05][, 97, 05] -021E; [2B, 05, 8F][, 97, 05] -1E27; [2B, 05, 05][, 9D, 05] -1E26; [2B, 05, 8F][, 9D, 05] -1E23; [2B, 05, 05][, A3, 05] -1E22; [2B, 05, 8F][, A3, 05] -1E29; [2B, 05, 05][, A7, 05] -1E28; [2B, 05, 8F][, A7, 05] -1E25; [2B, 05, 05][, D0 4D, 05] -1E24; [2B, 05, 8F][, D0 4D, 05] -1E2B; [2B, 05, 05][, D0 DD, 05] -1E2A; [2B, 05, 8F][, D0 DD, 05] -1E96; [2B, 05, 05][, D1 11, 05] -33CA; [2B, 05, 37][1D, 05, 37] -33CB; [2B, 05, B9][3B, 05, B9] -3371; [2B, 05, 37][3B, 05, B9][1D, 05, 3D] -3390; [2B, 05, B9][4F, 05, 37] - -029C; [2C 60, 05, 05] - -0195; [2C 62, 05, 05] -01F6; [2C 62, 05, 8F] - -0127; [2C 64, 05, 05] -210F; [2C 64, 05, 0B] -0126; [2C 64, 05, 8F] - -0266; [2C 66, 05, 05] -02B1; [2C 66, 05, 27] - -0267; [2C 68, 05, 05] - -02BB; [2C 6A, 05, 05] - -02BD; [2C 6C, 05, 05] - -0069; [2D, 05, 05] -FF49; [2D, 05, 07] -2170; [2D, 05, 09] -2139; [2D, 05, 0B] -D835 DC22; [2D, 05, 0B] -D835 DC56; [2D, 05, 0B] -D835 DC8A; [2D, 05, 0B] -D835 DCBE; [2D, 05, 0B] -D835 DCF2; [2D, 05, 0B] -D835 DD26; [2D, 05, 0B] -D835 DD5A; [2D, 05, 0B] -D835 DD8E; [2D, 05, 0B] -D835 DDC2; [2D, 05, 0B] -D835 DDF6; [2D, 05, 0B] -D835 DE2A; [2D, 05, 0B] -D835 DE5E; [2D, 05, 0B] -D835 DE92; [2D, 05, 0B] -24D8; [2D, 05, 0D] -0049; [2D, 05, 8F] -FF29; [2D, 05, 91] -2160; [2D, 05, 93] -2110; [2D, 05, 95] -2111; [2D, 05, 95] -D835 DC08; [2D, 05, 95] -D835 DC3C; [2D, 05, 95] -D835 DC70; [2D, 05, 95] -D835 DCD8; [2D, 05, 95] -D835 DD40; [2D, 05, 95] -D835 DD74; [2D, 05, 95] -D835 DDA8; [2D, 05, 95] -D835 DDDC; [2D, 05, 95] -D835 DE10; [2D, 05, 95] -D835 DE44; [2D, 05, 95] -D835 DE78; [2D, 05, 95] -24BE; [2D, 05, 97] -00ED; [2D, 05, 05][, 8D, 05] -00CD; [2D, 05, 8F][, 8D, 05] -00EC; [2D, 05, 05][, 8F, 05] -00CC; [2D, 05, 8F][, 8F, 05] -012D; [2D, 05, 05][, 91, 05] -012C; [2D, 05, 8F][, 91, 05] -00EE; [2D, 05, 05][, 93, 05] -00CE; [2D, 05, 8F][, 93, 05] -01D0; [2D, 05, 05][, 97, 05] -01CF; [2D, 05, 8F][, 97, 05] -00EF; [2D, 05, 05][, 9D, 05] -00CF; [2D, 05, 8F][, 9D, 05] -1E2F; [2D, 05, 05][, 9D, 05][, 8D, 05] -1E2E; [2D, 05, 8F][, 9D, 05][, 8D, 05] -0129; [2D, 05, 05][, A1, 05] -0128; [2D, 05, 8F][, A1, 05] -0130; [2D, 05, 8F][, A3, 05] -012F; [2D, 05, 05][, A9, 05] -012E; [2D, 05, 8F][, A9, 05] -012B; [2D, 05, 05][, AB, 05] -012A; [2D, 05, 8F][, AB, 05] -1EC9; [2D, 05, 05][, AF, 05] -1EC8; [2D, 05, 8F][, AF, 05] -0209; [2D, 05, 05][, B5, 05] -0208; [2D, 05, 8F][, B5, 05] -020B; [2D, 05, 05][, B9, 05] -020A; [2D, 05, 8F][, B9, 05] -1ECB; [2D, 05, 05][, D0 4D, 05] -1ECA; [2D, 05, 8F][, D0 4D, 05] -1E2D; [2D, 05, 05][, D0 FD, 05] -1E2C; [2D, 05, 8F][, D0 FD, 05] -2171; [2D, 05, 09][2D, 05, 09] -2161; [2D, 05, 93][2D, 05, 93] -2172; [2D, 05, 09][2D, 05, 09][2D, 05, 3D] -2162; [2D, 05, 93][2D, 05, 93][2D, 05, 3D] -0133; [2D, 05, 09][2F, 05, 09] -0132; [2D, 05, 93][2F, 05, 93] -33CC; [2D, 05, 37][37, 05, 37] -2173; [2D, 05, 09][47, 05, 09] -2163; [2D, 05, 93][47, 05, 93] -2178; [2D, 05, 09][4B, 05, 09] -2168; [2D, 05, 93][4B, 05, 93] - -0131; [2E 60, 05, 05] - -026A; [2E 62, 05, 05] - -0268; [2E 64, 05, 05] -0197; [2E 64, 05, 8F] - -0269; [2E 66, 05, 05] -0196; [2E 66, 05, 8F] - -006A; [2F, 05, 05] -FF4A; [2F, 05, 07] -D835 DC23; [2F, 05, 0B] -D835 DC57; [2F, 05, 0B] -D835 DC8B; [2F, 05, 0B] -D835 DCBF; [2F, 05, 0B] -D835 DCF3; [2F, 05, 0B] -D835 DD27; [2F, 05, 0B] -D835 DD5B; [2F, 05, 0B] -D835 DD8F; [2F, 05, 0B] -D835 DDC3; [2F, 05, 0B] -D835 DDF7; [2F, 05, 0B] -D835 DE2B; [2F, 05, 0B] -D835 DE5F; [2F, 05, 0B] -D835 DE93; [2F, 05, 0B] -24D9; [2F, 05, 0D] -004A; [2F, 05, 8F] -FF2A; [2F, 05, 91] -D835 DC09; [2F, 05, 95] -D835 DC3D; [2F, 05, 95] -D835 DC71; [2F, 05, 95] -D835 DCA5; [2F, 05, 95] -D835 DCD9; [2F, 05, 95] -D835 DD0D; [2F, 05, 95] -D835 DD41; [2F, 05, 95] -D835 DD75; [2F, 05, 95] -D835 DDA9; [2F, 05, 95] -D835 DDDD; [2F, 05, 95] -D835 DE11; [2F, 05, 95] -D835 DE45; [2F, 05, 95] -D835 DE79; [2F, 05, 95] -24BF; [2F, 05, 97] -02B2; [2F, 05, 27] -0135; [2F, 05, 05][, 93, 05] -0134; [2F, 05, 8F][, 93, 05] -01F0; [2F, 05, 05][, 97, 05] - -029D; [30 60, 05, 05] - -025F; [30 62, 05, 05] - -0284; [30 64, 05, 05] - -006B; [31, 05, 05] -FF4B; [31, 05, 07] -D835 DC24; [31, 05, 0B] -D835 DC58; [31, 05, 0B] -D835 DC8C; [31, 05, 0B] -D835 DCC0; [31, 05, 0B] -D835 DCF4; [31, 05, 0B] -D835 DD28; [31, 05, 0B] -D835 DD5C; [31, 05, 0B] -D835 DD90; [31, 05, 0B] -D835 DDC4; [31, 05, 0B] -D835 DDF8; [31, 05, 0B] -D835 DE2C; [31, 05, 0B] -D835 DE60; [31, 05, 0B] -D835 DE94; [31, 05, 0B] -24DA; [31, 05, 0D] -004B; [31, 05, 8F] -212A; [31, 05, 8F] -FF2B; [31, 05, 91] -D835 DC0A; [31, 05, 95] -D835 DC3E; [31, 05, 95] -D835 DC72; [31, 05, 95] -D835 DCA6; [31, 05, 95] -D835 DCDA; [31, 05, 95] -D835 DD0E; [31, 05, 95] -D835 DD42; [31, 05, 95] -D835 DD76; [31, 05, 95] -D835 DDAA; [31, 05, 95] -D835 DDDE; [31, 05, 95] -D835 DE12; [31, 05, 95] -D835 DE46; [31, 05, 95] -D835 DE7A; [31, 05, 95] -24C0; [31, 05, 97] -1E31; [31, 05, 05][, 8D, 05] -1E30; [31, 05, 8F][, 8D, 05] -01E9; [31, 05, 05][, 97, 05] -01E8; [31, 05, 8F][, 97, 05] -0137; [31, 05, 05][, A7, 05] -0136; [31, 05, 8F][, A7, 05] -1E33; [31, 05, 05][, D0 4D, 05] -1E32; [31, 05, 8F][, D0 4D, 05] -1E35; [31, 05, 05][, D1 11, 05] -1E34; [31, 05, 8F][, D1 11, 05] -3384; [31, 05, 37][1D, 05, B9] -3385; [31, 05, B9][1F, 05, B9] -3389; [31, 05, 37][21, 05, 37][1D, 05, 3D][33, 05, 3D] -338F; [31, 05, 37][29, 05, 37] -3391; [31, 05, 37][2B, 05, B9][4F, 05, 3D] -33CD; [31, 05, B9][31, 05, B9] -3398; [31, 05, 37][33, 05, 37] -339E; [31, 05, 37][35, 05, 37] -33CE; [31, 05, B9][35, 05, B9] -33A2; [31, 05, 37][35, 05, 37][1A 94, 05, 3D] -33A6; [31, 05, 37][35, 05, 37][1A 96, 05, 3D] -33AA; [31, 05, 37][3B, 05, B9][1D, 05, 3D] -33CF; [31, 05, 37][43, 05, 37] -33B8; [31, 05, 37][47, 05, B9] -33BE; [31, 05, 37][49, 05, B9] -33C0; [31, 05, 37][51 56, 05, B9] - -0199; [32 60, 05, 05] -0198; [32 60, 05, 8F] - -029E; [32 62, 05, 05] - -006C; [33, 05, 05] -FF4C; [33, 05, 07] -217C; [33, 05, 09] -2113; [33, 05, 0B] -D835 DC25; [33, 05, 0B] -D835 DC59; [33, 05, 0B] -D835 DC8D; [33, 05, 0B] -D835 DCF5; [33, 05, 0B] -D835 DD29; [33, 05, 0B] -D835 DD5D; [33, 05, 0B] -D835 DD91; [33, 05, 0B] -D835 DDC5; [33, 05, 0B] -D835 DDF9; [33, 05, 0B] -D835 DE2D; [33, 05, 0B] -D835 DE61; [33, 05, 0B] -D835 DE95; [33, 05, 0B] -24DB; [33, 05, 0D] -004C; [33, 05, 8F] -FF2C; [33, 05, 91] -216C; [33, 05, 93] -2112; [33, 05, 95] -D835 DC0B; [33, 05, 95] -D835 DC3F; [33, 05, 95] -D835 DC73; [33, 05, 95] -D835 DCDB; [33, 05, 95] -D835 DD0F; [33, 05, 95] -D835 DD43; [33, 05, 95] -D835 DD77; [33, 05, 95] -D835 DDAB; [33, 05, 95] -D835 DDDF; [33, 05, 95] -D835 DE13; [33, 05, 95] -D835 DE47; [33, 05, 95] -D835 DE7B; [33, 05, 95] -24C1; [33, 05, 97] -02E1; [33, 05, 27] -013A; [33, 05, 05][, 8D, 05] -0139; [33, 05, 8F][, 8D, 05] -013E; [33, 05, 05][, 97, 05] -013D; [33, 05, 8F][, 97, 05] -013C; [33, 05, 05][, A7, 05] -013B; [33, 05, 8F][, A7, 05] -1E37; [33, 05, 05][, D0 4D, 05] -1E36; [33, 05, 8F][, D0 4D, 05] -1E39; [33, 05, 05][, D0 4D, 05][, AB, 05] -1E38; [33, 05, 8F][, D0 4D, 05][, AB, 05] -1E3D; [33, 05, 05][, D0 CD, 05] -1E3C; [33, 05, 8F][, D0 CD, 05] -1E3B; [33, 05, 05][, D1 11, 05] -1E3A; [33, 05, 8F][, D1 11, 05] -0140; [33, 05, 09][08 0F, 05, 09] -013F; [33, 05, 93][08 0F, 05, 09] -01C9; [33, 05, 09][2F, 05, 09] -01C8; [33, 05, 93][2F, 05, 09] -01C7; [33, 05, 93][2F, 05, 93] -33D0; [33, 05, 37][35, 05, 37] -33D1; [33, 05, 37][37, 05, 37] -33D2; [33, 05, 37][39, 05, 37][29, 05, 3D] -02AA; [33, 05, 09][41, 05, 09] -33D3; [33, 05, 37][4B, 05, 37] -02AB; [33, 05, 09][4F, 05, 09] - -029F; [34 60, 05, 05] - -0142; [34 62, 05, 05] -0141; [34 62, 05, 8F] - -019A; [34 64, 05, 05] - -026B; [34 66, 05, 05] - -026C; [34 68, 05, 05] - -026D; [34 6A, 05, 05] - -026E; [34 6C, 05, 05] - -019B; [34 6E, 05, 05] - -028E; [34 70, 05, 05] - -006D; [35, 05, 05] -FF4D; [35, 05, 07] -217F; [35, 05, 09] -D835 DC26; [35, 05, 0B] -D835 DC5A; [35, 05, 0B] -D835 DC8E; [35, 05, 0B] -D835 DCC2; [35, 05, 0B] -D835 DCF6; [35, 05, 0B] -D835 DD2A; [35, 05, 0B] -D835 DD5E; [35, 05, 0B] -D835 DD92; [35, 05, 0B] -D835 DDC6; [35, 05, 0B] -D835 DDFA; [35, 05, 0B] -D835 DE2E; [35, 05, 0B] -D835 DE62; [35, 05, 0B] -D835 DE96; [35, 05, 0B] -24DC; [35, 05, 0D] -004D; [35, 05, 8F] -FF2D; [35, 05, 91] -216F; [35, 05, 93] -2133; [35, 05, 95] -D835 DC0C; [35, 05, 95] -D835 DC40; [35, 05, 95] -D835 DC74; [35, 05, 95] -D835 DCDC; [35, 05, 95] -D835 DD10; [35, 05, 95] -D835 DD44; [35, 05, 95] -D835 DD78; [35, 05, 95] -D835 DDAC; [35, 05, 95] -D835 DDE0; [35, 05, 95] -D835 DE14; [35, 05, 95] -D835 DE48; [35, 05, 95] -D835 DE7C; [35, 05, 95] -24C2; [35, 05, 97] -1E3F; [35, 05, 05][, 8D, 05] -1E3E; [35, 05, 8F][, 8D, 05] -1E41; [35, 05, 05][, A3, 05] -1E40; [35, 05, 8F][, A3, 05] -1E43; [35, 05, 05][, D0 4D, 05] -1E42; [35, 05, 8F][, D0 4D, 05] -33A7; [35, 05, 37][0A B9, 05, 37][41, 05, 3D] -33A8; [35, 05, 37][0A B9, 05, 37][41, 05, 3D][1A 94, 05, 3D] -33A1; [35, 05, 37][1A 94, 05, 37] -33A5; [35, 05, 37][1A 96, 05, 37] -3383; [35, 05, 37][1D, 05, B9] -33D4; [35, 05, 37][1F, 05, 37] -3386; [35, 05, B9][1F, 05, B9] -338E; [35, 05, 37][29, 05, 37] -3392; [35, 05, B9][2B, 05, B9][4F, 05, 3D] -33D5; [35, 05, 37][2D, 05, 37][33, 05, 3D] -3396; [35, 05, 37][33, 05, 37] -339C; [35, 05, 37][35, 05, 37] -339F; [35, 05, 37][35, 05, 37][1A 94, 05, 3D] -33A3; [35, 05, 37][35, 05, 37][1A 96, 05, 3D] -33D6; [35, 05, 37][39, 05, 37][33, 05, 3D] -33AB; [35, 05, B9][3B, 05, B9][1D, 05, 3D] -33B3; [35, 05, 37][41, 05, 37] -33B7; [35, 05, 37][47, 05, B9] -33B9; [35, 05, B9][47, 05, B9] -33BD; [35, 05, 37][49, 05, B9] -33BF; [35, 05, B9][49, 05, B9] -33C1; [35, 05, B9][51 56, 05, B9] - -0271; [36 60, 05, 05] - -006E; [37, 05, 05] -FF4E; [37, 05, 07] -D835 DC27; [37, 05, 0B] -D835 DC5B; [37, 05, 0B] -D835 DC8F; [37, 05, 0B] -D835 DCC3; [37, 05, 0B] -D835 DCF7; [37, 05, 0B] -D835 DD2B; [37, 05, 0B] -D835 DD5F; [37, 05, 0B] -D835 DD93; [37, 05, 0B] -D835 DDC7; [37, 05, 0B] -D835 DDFB; [37, 05, 0B] -D835 DE2F; [37, 05, 0B] -D835 DE63; [37, 05, 0B] -D835 DE97; [37, 05, 0B] -24DD; [37, 05, 0D] -004E; [37, 05, 8F] -FF2E; [37, 05, 91] -2115; [37, 05, 95] -D835 DC0D; [37, 05, 95] -D835 DC41; [37, 05, 95] -D835 DC75; [37, 05, 95] -D835 DCA9; [37, 05, 95] -D835 DCDD; [37, 05, 95] -D835 DD11; [37, 05, 95] -D835 DD79; [37, 05, 95] -D835 DDAD; [37, 05, 95] -D835 DDE1; [37, 05, 95] -D835 DE15; [37, 05, 95] -D835 DE49; [37, 05, 95] -D835 DE7D; [37, 05, 95] -24C3; [37, 05, 97] -207F; [37, 05, 27] -0144; [37, 05, 05][, 8D, 05] -0143; [37, 05, 8F][, 8D, 05] -01F9; [37, 05, 05][, 8F, 05] -01F8; [37, 05, 8F][, 8F, 05] -0148; [37, 05, 05][, 97, 05] -0147; [37, 05, 8F][, 97, 05] -00F1; [37, 05, 05][, A1, 05] -00D1; [37, 05, 8F][, A1, 05] -1E45; [37, 05, 05][, A3, 05] -1E44; [37, 05, 8F][, A3, 05] -0146; [37, 05, 05][, A7, 05] -0145; [37, 05, 8F][, A7, 05] -1E47; [37, 05, 05][, D0 4D, 05] -1E46; [37, 05, 8F][, D0 4D, 05] -1E4B; [37, 05, 05][, D0 CD, 05] -1E4A; [37, 05, 8F][, D0 CD, 05] -1E49; [37, 05, 05][, D1 11, 05] -1E48; [37, 05, 8F][, D1 11, 05] -3381; [37, 05, 37][1D, 05, B9] -338B; [37, 05, 37][27, 05, B9] -01CC; [37, 05, 09][2F, 05, 09] -01CB; [37, 05, 93][2F, 05, 09] -01CA; [37, 05, 93][2F, 05, 93] -339A; [37, 05, 37][35, 05, 37] -2116; [37, 05, 93][39, 05, 09] -33B1; [37, 05, 37][41, 05, 37] -33B5; [37, 05, 37][47, 05, B9] -33BB; [37, 05, 37][49, 05, B9] - -0274; [38 60, 05, 05] - -0272; [38 62, 05, 05] -019D; [38 62, 05, 8F] - -019E; [38 64, 05, 05] - -0273; [38 66, 05, 05] - -014B; [38 68, 05, 05] -014A; [38 68, 05, 8F] - -006F; [39, 05, 05] -FF4F; [39, 05, 07] -2134; [39, 05, 0B] -D835 DC28; [39, 05, 0B] -D835 DC5C; [39, 05, 0B] -D835 DC90; [39, 05, 0B] -D835 DCF8; [39, 05, 0B] -D835 DD2C; [39, 05, 0B] -D835 DD60; [39, 05, 0B] -D835 DD94; [39, 05, 0B] -D835 DDC8; [39, 05, 0B] -D835 DDFC; [39, 05, 0B] -D835 DE30; [39, 05, 0B] -D835 DE64; [39, 05, 0B] -D835 DE98; [39, 05, 0B] -24DE; [39, 05, 0D] -004F; [39, 05, 8F] -FF2F; [39, 05, 91] -D835 DC0E; [39, 05, 95] -D835 DC42; [39, 05, 95] -D835 DC76; [39, 05, 95] -D835 DCAA; [39, 05, 95] -D835 DCDE; [39, 05, 95] -D835 DD12; [39, 05, 95] -D835 DD46; [39, 05, 95] -D835 DD7A; [39, 05, 95] -D835 DDAE; [39, 05, 95] -D835 DDE2; [39, 05, 95] -D835 DE16; [39, 05, 95] -D835 DE4A; [39, 05, 95] -D835 DE7E; [39, 05, 95] -24C4; [39, 05, 97] -00BA; [39, 05, 27] -00F3; [39, 05, 05][, 8D, 05] -00D3; [39, 05, 8F][, 8D, 05] -00F2; [39, 05, 05][, 8F, 05] -00D2; [39, 05, 8F][, 8F, 05] -014F; [39, 05, 05][, 91, 05] -014E; [39, 05, 8F][, 91, 05] -00F4; [39, 05, 05][, 93, 05] -00D4; [39, 05, 8F][, 93, 05] -1ED1; [39, 05, 05][, 93, 05][, 8D, 05] -1ED0; [39, 05, 8F][, 93, 05][, 8D, 05] -1ED3; [39, 05, 05][, 93, 05][, 8F, 05] -1ED2; [39, 05, 8F][, 93, 05][, 8F, 05] -1ED7; [39, 05, 05][, 93, 05][, A1, 05] -1ED6; [39, 05, 8F][, 93, 05][, A1, 05] -1ED5; [39, 05, 05][, 93, 05][, AF, 05] -1ED4; [39, 05, 8F][, 93, 05][, AF, 05] -01D2; [39, 05, 05][, 97, 05] -01D1; [39, 05, 8F][, 97, 05] -00F6; [39, 05, 05][, 9D, 05] -00D6; [39, 05, 8F][, 9D, 05] -022B; [39, 05, 05][, 9D, 05][, AB, 05] -022A; [39, 05, 8F][, 9D, 05][, AB, 05] -0151; [39, 05, 05][, 9F, 05] -0150; [39, 05, 8F][, 9F, 05] -00F5; [39, 05, 05][, A1, 05] -00D5; [39, 05, 8F][, A1, 05] -1E4D; [39, 05, 05][, A1, 05][, 8D, 05] -1E4C; [39, 05, 8F][, A1, 05][, 8D, 05] -1E4F; [39, 05, 05][, A1, 05][, 9D, 05] -1E4E; [39, 05, 8F][, A1, 05][, 9D, 05] -022D; [39, 05, 05][, A1, 05][, AB, 05] -022C; [39, 05, 8F][, A1, 05][, AB, 05] -022F; [39, 05, 05][, A3, 05] -022E; [39, 05, 8F][, A3, 05] -0231; [39, 05, 05][, A3, 05][, AB, 05] -0230; [39, 05, 8F][, A3, 05][, AB, 05] -01EB; [39, 05, 05][, A9, 05] -01EA; [39, 05, 8F][, A9, 05] -01ED; [39, 05, 05][, A9, 05][, AB, 05] -01EC; [39, 05, 8F][, A9, 05][, AB, 05] -014D; [39, 05, 05][, AB, 05] -014C; [39, 05, 8F][, AB, 05] -1E53; [39, 05, 05][, AB, 05][, 8D, 05] -1E52; [39, 05, 8F][, AB, 05][, 8D, 05] -1E51; [39, 05, 05][, AB, 05][, 8F, 05] -1E50; [39, 05, 8F][, AB, 05][, 8F, 05] -1ECF; [39, 05, 05][, AF, 05] -1ECE; [39, 05, 8F][, AF, 05] -020D; [39, 05, 05][, B5, 05] -020C; [39, 05, 8F][, B5, 05] -020F; [39, 05, 05][, B9, 05] -020E; [39, 05, 8F][, B9, 05] -01A1; [39, 05, 05][, C9, 05] -01A0; [39, 05, 8F][, C9, 05] -1EDB; [39, 05, 05][, C9, 05][, 8D, 05] -1EDA; [39, 05, 8F][, C9, 05][, 8D, 05] -1EDD; [39, 05, 05][, C9, 05][, 8F, 05] -1EDC; [39, 05, 8F][, C9, 05][, 8F, 05] -1EE1; [39, 05, 05][, C9, 05][, A1, 05] -1EE0; [39, 05, 8F][, C9, 05][, A1, 05] -1EDF; [39, 05, 05][, C9, 05][, AF, 05] -1EDE; [39, 05, 8F][, C9, 05][, AF, 05] -1EE3; [39, 05, 05][, C9, 05][, D0 4D, 05] -1EE2; [39, 05, 8F][, C9, 05][, D0 4D, 05] -1ECD; [39, 05, 05][, D0 4D, 05] -1ECC; [39, 05, 8F][, D0 4D, 05] -1ED9; [39, 05, 05][, D0 4D, 05][, 93, 05] -1ED8; [39, 05, 8F][, D0 4D, 05][, 93, 05] -0153; [39, 05, 09][, DD 61, 09][25, 05, 3D] -0152; [39, 05, 93][, DD 61, 09][25, 05, 3D] -3375; [39, 05, 37][47, 05, B9] - -0276; [3A 60, 05, 05] - -00F8; [3A 62, 05, 05] -00D8; [3A 62, 05, 8F] -01FF; [3A 62, 05, 05][, 8D, 05] -01FE; [3A 62, 05, 8F][, 8D, 05] - -0254; [3A 64, 05, 05] -0186; [3A 64, 05, 8F] - -0275; [3A 66, 05, 05] -019F; [3A 66, 05, 8F] - -0277; [3A 68, 05, 05] - -0223; [3A 6A, 05, 05] -0222; [3A 6A, 05, 8F] - -0070; [3B, 05, 05] -FF50; [3B, 05, 07] -D835 DC29; [3B, 05, 0B] -D835 DC5D; [3B, 05, 0B] -D835 DC91; [3B, 05, 0B] -D835 DCC5; [3B, 05, 0B] -D835 DCF9; [3B, 05, 0B] -D835 DD2D; [3B, 05, 0B] -D835 DD61; [3B, 05, 0B] -D835 DD95; [3B, 05, 0B] -D835 DDC9; [3B, 05, 0B] -D835 DDFD; [3B, 05, 0B] -D835 DE31; [3B, 05, 0B] -D835 DE65; [3B, 05, 0B] -D835 DE99; [3B, 05, 0B] -24DF; [3B, 05, 0D] -0050; [3B, 05, 8F] -FF30; [3B, 05, 91] -2119; [3B, 05, 95] -D835 DC0F; [3B, 05, 95] -D835 DC43; [3B, 05, 95] -D835 DC77; [3B, 05, 95] -D835 DCAB; [3B, 05, 95] -D835 DCDF; [3B, 05, 95] -D835 DD13; [3B, 05, 95] -D835 DD7B; [3B, 05, 95] -D835 DDAF; [3B, 05, 95] -D835 DDE3; [3B, 05, 95] -D835 DE17; [3B, 05, 95] -D835 DE4B; [3B, 05, 95] -D835 DE7F; [3B, 05, 95] -24C5; [3B, 05, 97] -1E55; [3B, 05, 05][, 8D, 05] -1E54; [3B, 05, 8F][, 8D, 05] -1E57; [3B, 05, 05][, A3, 05] -1E56; [3B, 05, 8F][, A3, 05] -33D8; [3B, 05, 37][07 F6, 05, 37][35, 05, 3D][07 F6, 05, 3D] -3380; [3B, 05, 37][1D, 05, B9] -33A9; [3B, 05, B9][1D, 05, 37] -3376; [3B, 05, 37][21, 05, 37] -338A; [3B, 05, 37][27, 05, B9] -33D7; [3B, 05, B9][2B, 05, B9] -33D9; [3B, 05, B9][3B, 05, B9][35, 05, 3D] -33DA; [3B, 05, B9][3F, 05, B9] -33B0; [3B, 05, 37][41, 05, 37] -33B4; [3B, 05, 37][47, 05, B9] -33BA; [3B, 05, 37][49, 05, B9] - -01A5; [3C 60, 05, 05] -01A4; [3C 60, 05, 8F] - -0278; [3C 62, 05, 05] - -0071; [3D, 05, 05] -FF51; [3D, 05, 07] -D835 DC2A; [3D, 05, 0B] -D835 DC5E; [3D, 05, 0B] -D835 DC92; [3D, 05, 0B] -D835 DCC6; [3D, 05, 0B] -D835 DCFA; [3D, 05, 0B] -D835 DD2E; [3D, 05, 0B] -D835 DD62; [3D, 05, 0B] -D835 DD96; [3D, 05, 0B] -D835 DDCA; [3D, 05, 0B] -D835 DDFE; [3D, 05, 0B] -D835 DE32; [3D, 05, 0B] -D835 DE66; [3D, 05, 0B] -D835 DE9A; [3D, 05, 0B] -24E0; [3D, 05, 0D] -0051; [3D, 05, 8F] -FF31; [3D, 05, 91] -211A; [3D, 05, 95] -D835 DC10; [3D, 05, 95] -D835 DC44; [3D, 05, 95] -D835 DC78; [3D, 05, 95] -D835 DCAC; [3D, 05, 95] -D835 DCE0; [3D, 05, 95] -D835 DD14; [3D, 05, 95] -D835 DD7C; [3D, 05, 95] -D835 DDB0; [3D, 05, 95] -D835 DDE4; [3D, 05, 95] -D835 DE18; [3D, 05, 95] -D835 DE4C; [3D, 05, 95] -D835 DE80; [3D, 05, 95] -24C6; [3D, 05, 97] - -02A0; [3E 60, 05, 05] - -0138; [3E 62, 05, 05] - -0072; [3F, 05, 05] -FF52; [3F, 05, 07] -D835 DC2B; [3F, 05, 0B] -D835 DC5F; [3F, 05, 0B] -D835 DC93; [3F, 05, 0B] -D835 DCC7; [3F, 05, 0B] -D835 DCFB; [3F, 05, 0B] -D835 DD2F; [3F, 05, 0B] -D835 DD63; [3F, 05, 0B] -D835 DD97; [3F, 05, 0B] -D835 DDCB; [3F, 05, 0B] -D835 DDFF; [3F, 05, 0B] -D835 DE33; [3F, 05, 0B] -D835 DE67; [3F, 05, 0B] -D835 DE9B; [3F, 05, 0B] -24E1; [3F, 05, 0D] -0052; [3F, 05, 8F] -FF32; [3F, 05, 91] -211B; [3F, 05, 95] -211C; [3F, 05, 95] -211D; [3F, 05, 95] -D835 DC11; [3F, 05, 95] -D835 DC45; [3F, 05, 95] -D835 DC79; [3F, 05, 95] -D835 DCE1; [3F, 05, 95] -D835 DD7D; [3F, 05, 95] -D835 DDB1; [3F, 05, 95] -D835 DDE5; [3F, 05, 95] -D835 DE19; [3F, 05, 95] -D835 DE4D; [3F, 05, 95] -D835 DE81; [3F, 05, 95] -24C7; [3F, 05, 97] -02B3; [3F, 05, 27] -0155; [3F, 05, 05][, 8D, 05] -0154; [3F, 05, 8F][, 8D, 05] -0159; [3F, 05, 05][, 97, 05] -0158; [3F, 05, 8F][, 97, 05] -1E59; [3F, 05, 05][, A3, 05] -1E58; [3F, 05, 8F][, A3, 05] -0157; [3F, 05, 05][, A7, 05] -0156; [3F, 05, 8F][, A7, 05] -0211; [3F, 05, 05][, B5, 05] -0210; [3F, 05, 8F][, B5, 05] -0213; [3F, 05, 05][, B9, 05] -0212; [3F, 05, 8F][, B9, 05] -1E5B; [3F, 05, 05][, D0 4D, 05] -1E5A; [3F, 05, 8F][, D0 4D, 05] -1E5D; [3F, 05, 05][, D0 4D, 05][, AB, 05] -1E5C; [3F, 05, 8F][, D0 4D, 05][, AB, 05] -1E5F; [3F, 05, 05][, D1 11, 05] -1E5E; [3F, 05, 8F][, D1 11, 05] -33AD; [3F, 05, 37][1D, 05, 37][23, 05, 3D] -33AE; [3F, 05, 37][1D, 05, 37][23, 05, 3D][0A B9, 05, 3D][41, 05, 3D] -33AF; [3F, 05, 37][1D, 05, 37][23, 05, 3D][0A B9, 05, 3D][41, 05, 3D][1A 94, 05, 3D] -20A8; [3F, 05, 93][41, 05, 09] - -0280; [40 60, 05, 05] -01A6; [40 60, 05, 8F] - -0279; [40 62, 05, 05] -02B4; [40 62, 05, 27] - -027A; [40 64, 05, 05] - -027B; [40 66, 05, 05] -02B5; [40 66, 05, 27] - -027C; [40 68, 05, 05] - -027D; [40 6A, 05, 05] - -027E; [40 6C, 05, 05] - -027F; [40 6E, 05, 05] - -0281; [40 70, 05, 05] -02B6; [40 70, 05, 27] - -0073; [41, 05, 05] -FF53; [41, 05, 07] -D835 DC2C; [41, 05, 0B] -D835 DC60; [41, 05, 0B] -D835 DC94; [41, 05, 0B] -D835 DCC8; [41, 05, 0B] -D835 DCFC; [41, 05, 0B] -D835 DD30; [41, 05, 0B] -D835 DD64; [41, 05, 0B] -D835 DD98; [41, 05, 0B] -D835 DDCC; [41, 05, 0B] -D835 DE00; [41, 05, 0B] -D835 DE34; [41, 05, 0B] -D835 DE68; [41, 05, 0B] -D835 DE9C; [41, 05, 0B] -24E2; [41, 05, 0D] -0053; [41, 05, 8F] -FF33; [41, 05, 91] -D835 DC12; [41, 05, 95] -D835 DC46; [41, 05, 95] -D835 DC7A; [41, 05, 95] -D835 DCAE; [41, 05, 95] -D835 DCE2; [41, 05, 95] -D835 DD16; [41, 05, 95] -D835 DD4A; [41, 05, 95] -D835 DD7E; [41, 05, 95] -D835 DDB2; [41, 05, 95] -D835 DDE6; [41, 05, 95] -D835 DE1A; [41, 05, 95] -D835 DE4E; [41, 05, 95] -D835 DE82; [41, 05, 95] -24C8; [41, 05, 97] -02E2; [41, 05, 27] -015B; [41, 05, 05][, 8D, 05] -015A; [41, 05, 8F][, 8D, 05] -1E65; [41, 05, 05][, 8D, 05][, A3, 05] -1E64; [41, 05, 8F][, 8D, 05][, A3, 05] -015D; [41, 05, 05][, 93, 05] -015C; [41, 05, 8F][, 93, 05] -0161; [41, 05, 05][, 97, 05] -0160; [41, 05, 8F][, 97, 05] -1E67; [41, 05, 05][, 97, 05][, A3, 05] -1E66; [41, 05, 8F][, 97, 05][, A3, 05] -1E61; [41, 05, 05][, A3, 05] -1E60; [41, 05, 8F][, A3, 05] -015F; [41, 05, 05][, A7, 05] -015E; [41, 05, 8F][, A7, 05] -1E63; [41, 05, 05][, D0 4D, 05] -1E62; [41, 05, 8F][, D0 4D, 05] -1E69; [41, 05, 05][, D0 4D, 05][, A3, 05] -1E68; [41, 05, 8F][, D0 4D, 05][, A3, 05] -0219; [41, 05, 05][, D0 7D, 05] -0218; [41, 05, 8F][, D0 7D, 05] -017F; [41, 05, 09][, DF 79, 09] -1E9B; [41, 05, 09][, DF 79, 09][, A3, 05] -2120; [41, 05, 27][35, 05, 27] -33DB; [41, 05, 37][3F, 05, 37] -00DF; [41, 05, 09][, DD 61, 09][41, 05, 3D] -FB06; [41, 05, 09][43, 05, 09] -FB05; [41, 05, 09][, DF 79, 09][43, 05, 3D] -33DC; [41, 05, B9][47, 05, 37] - -0282; [42 60, 05, 05] - -0283; [42 62, 05, 05] -01A9; [42 62, 05, 8F] - -01AA; [42 64, 05, 05] - -0285; [42 66, 05, 05] - -0286; [42 68, 05, 05] - -0074; [43, 05, 05] -FF54; [43, 05, 07] -D835 DC2D; [43, 05, 0B] -D835 DC61; [43, 05, 0B] -D835 DC95; [43, 05, 0B] -D835 DCC9; [43, 05, 0B] -D835 DCFD; [43, 05, 0B] -D835 DD31; [43, 05, 0B] -D835 DD65; [43, 05, 0B] -D835 DD99; [43, 05, 0B] -D835 DDCD; [43, 05, 0B] -D835 DE01; [43, 05, 0B] -D835 DE35; [43, 05, 0B] -D835 DE69; [43, 05, 0B] -D835 DE9D; [43, 05, 0B] -24E3; [43, 05, 0D] -0054; [43, 05, 8F] -FF34; [43, 05, 91] -D835 DC13; [43, 05, 95] -D835 DC47; [43, 05, 95] -D835 DC7B; [43, 05, 95] -D835 DCAF; [43, 05, 95] -D835 DCE3; [43, 05, 95] -D835 DD17; [43, 05, 95] -D835 DD4B; [43, 05, 95] -D835 DD7F; [43, 05, 95] -D835 DDB3; [43, 05, 95] -D835 DDE7; [43, 05, 95] -D835 DE1B; [43, 05, 95] -D835 DE4F; [43, 05, 95] -D835 DE83; [43, 05, 95] -24C9; [43, 05, 97] -0165; [43, 05, 05][, 97, 05] -0164; [43, 05, 8F][, 97, 05] -1E97; [43, 05, 05][, 9D, 05] -1E6B; [43, 05, 05][, A3, 05] -1E6A; [43, 05, 8F][, A3, 05] -0163; [43, 05, 05][, A7, 05] -0162; [43, 05, 8F][, A7, 05] -1E6D; [43, 05, 05][, D0 4D, 05] -1E6C; [43, 05, 8F][, D0 4D, 05] -021B; [43, 05, 05][, D0 7D, 05] -021A; [43, 05, 8F][, D0 7D, 05] -1E71; [43, 05, 05][, D0 CD, 05] -1E70; [43, 05, 8F][, D0 CD, 05] -1E6F; [43, 05, 05][, D1 11, 05] -1E6E; [43, 05, 8F][, D1 11, 05] -02A8; [43, 05, 09][22 62, 05, 09] -2121; [43, 05, 93][25, 05, 93][33, 05, 3D] -3394; [43, 05, B9][2B, 05, B9][4F, 05, 3D] -2122; [43, 05, 27][35, 05, 27] -02A6; [43, 05, 09][41, 05, 09] -02A7; [43, 05, 09][42 62, 05, 09] - -0167; [44 60, 05, 05] -0166; [44 60, 05, 8F] - -01AB; [44 62, 05, 05] - -01AD; [44 64, 05, 05] -01AC; [44 64, 05, 8F] - -0288; [44 66, 05, 05] -01AE; [44 66, 05, 8F] - -0287; [44 68, 05, 05] - -0075; [45, 05, 05] -FF55; [45, 05, 07] -D835 DC2E; [45, 05, 0B] -D835 DC62; [45, 05, 0B] -D835 DC96; [45, 05, 0B] -D835 DCCA; [45, 05, 0B] -D835 DCFE; [45, 05, 0B] -D835 DD32; [45, 05, 0B] -D835 DD66; [45, 05, 0B] -D835 DD9A; [45, 05, 0B] -D835 DDCE; [45, 05, 0B] -D835 DE02; [45, 05, 0B] -D835 DE36; [45, 05, 0B] -D835 DE6A; [45, 05, 0B] -D835 DE9E; [45, 05, 0B] -24E4; [45, 05, 0D] -0055; [45, 05, 8F] -FF35; [45, 05, 91] -D835 DC14; [45, 05, 95] -D835 DC48; [45, 05, 95] -D835 DC7C; [45, 05, 95] -D835 DCB0; [45, 05, 95] -D835 DCE4; [45, 05, 95] -D835 DD18; [45, 05, 95] -D835 DD4C; [45, 05, 95] -D835 DD80; [45, 05, 95] -D835 DDB4; [45, 05, 95] -D835 DDE8; [45, 05, 95] -D835 DE1C; [45, 05, 95] -D835 DE50; [45, 05, 95] -D835 DE84; [45, 05, 95] -24CA; [45, 05, 97] -00FA; [45, 05, 05][, 8D, 05] -00DA; [45, 05, 8F][, 8D, 05] -00F9; [45, 05, 05][, 8F, 05] -00D9; [45, 05, 8F][, 8F, 05] -016D; [45, 05, 05][, 91, 05] -016C; [45, 05, 8F][, 91, 05] -00FB; [45, 05, 05][, 93, 05] -00DB; [45, 05, 8F][, 93, 05] -01D4; [45, 05, 05][, 97, 05] -01D3; [45, 05, 8F][, 97, 05] -016F; [45, 05, 05][, 99, 05] -016E; [45, 05, 8F][, 99, 05] -00FC; [45, 05, 05][, 9D, 05] -00DC; [45, 05, 8F][, 9D, 05] -01D8; [45, 05, 05][, 9D, 05][, 8D, 05] -01D7; [45, 05, 8F][, 9D, 05][, 8D, 05] -01DC; [45, 05, 05][, 9D, 05][, 8F, 05] -01DB; [45, 05, 8F][, 9D, 05][, 8F, 05] -01DA; [45, 05, 05][, 9D, 05][, 97, 05] -01D9; [45, 05, 8F][, 9D, 05][, 97, 05] -01D6; [45, 05, 05][, 9D, 05][, AB, 05] -01D5; [45, 05, 8F][, 9D, 05][, AB, 05] -0171; [45, 05, 05][, 9F, 05] -0170; [45, 05, 8F][, 9F, 05] -0169; [45, 05, 05][, A1, 05] -0168; [45, 05, 8F][, A1, 05] -1E79; [45, 05, 05][, A1, 05][, 8D, 05] -1E78; [45, 05, 8F][, A1, 05][, 8D, 05] -0173; [45, 05, 05][, A9, 05] -0172; [45, 05, 8F][, A9, 05] -016B; [45, 05, 05][, AB, 05] -016A; [45, 05, 8F][, AB, 05] -1E7B; [45, 05, 05][, AB, 05][, 9D, 05] -1E7A; [45, 05, 8F][, AB, 05][, 9D, 05] -1EE7; [45, 05, 05][, AF, 05] -1EE6; [45, 05, 8F][, AF, 05] -0215; [45, 05, 05][, B5, 05] -0214; [45, 05, 8F][, B5, 05] -0217; [45, 05, 05][, B9, 05] -0216; [45, 05, 8F][, B9, 05] -01B0; [45, 05, 05][, C9, 05] -01AF; [45, 05, 8F][, C9, 05] -1EE9; [45, 05, 05][, C9, 05][, 8D, 05] -1EE8; [45, 05, 8F][, C9, 05][, 8D, 05] -1EEB; [45, 05, 05][, C9, 05][, 8F, 05] -1EEA; [45, 05, 8F][, C9, 05][, 8F, 05] -1EEF; [45, 05, 05][, C9, 05][, A1, 05] -1EEE; [45, 05, 8F][, C9, 05][, A1, 05] -1EED; [45, 05, 05][, C9, 05][, AF, 05] -1EEC; [45, 05, 8F][, C9, 05][, AF, 05] -1EF1; [45, 05, 05][, C9, 05][, D0 4D, 05] -1EF0; [45, 05, 8F][, C9, 05][, D0 4D, 05] -1EE5; [45, 05, 05][, D0 4D, 05] -1EE4; [45, 05, 8F][, D0 4D, 05] -1E73; [45, 05, 05][, D0 5D, 05] -1E72; [45, 05, 8F][, D0 5D, 05] -1E77; [45, 05, 05][, D0 CD, 05] -1E76; [45, 05, 8F][, D0 CD, 05] -1E75; [45, 05, 05][, D0 FD, 05] -1E74; [45, 05, 8F][, D0 FD, 05] - -0289; [46 60, 05, 05] - -0265; [46 62, 05, 05] - -026F; [46 64, 05, 05] -019C; [46 64, 05, 8F] - -0270; [46 66, 05, 05] - -028A; [46 68, 05, 05] -01B1; [46 68, 05, 8F] - -0076; [47, 05, 05] -FF56; [47, 05, 07] -2174; [47, 05, 09] -D835 DC2F; [47, 05, 0B] -D835 DC63; [47, 05, 0B] -D835 DC97; [47, 05, 0B] -D835 DCCB; [47, 05, 0B] -D835 DCFF; [47, 05, 0B] -D835 DD33; [47, 05, 0B] -D835 DD67; [47, 05, 0B] -D835 DD9B; [47, 05, 0B] -D835 DDCF; [47, 05, 0B] -D835 DE03; [47, 05, 0B] -D835 DE37; [47, 05, 0B] -D835 DE6B; [47, 05, 0B] -D835 DE9F; [47, 05, 0B] -24E5; [47, 05, 0D] -0056; [47, 05, 8F] -FF36; [47, 05, 91] -2164; [47, 05, 93] -D835 DC15; [47, 05, 95] -D835 DC49; [47, 05, 95] -D835 DC7D; [47, 05, 95] -D835 DCB1; [47, 05, 95] -D835 DCE5; [47, 05, 95] -D835 DD19; [47, 05, 95] -D835 DD4D; [47, 05, 95] -D835 DD81; [47, 05, 95] -D835 DDB5; [47, 05, 95] -D835 DDE9; [47, 05, 95] -D835 DE1D; [47, 05, 95] -D835 DE51; [47, 05, 95] -D835 DE85; [47, 05, 95] -24CB; [47, 05, 97] -1E7D; [47, 05, 05][, A1, 05] -1E7C; [47, 05, 8F][, A1, 05] -1E7F; [47, 05, 05][, D0 4D, 05] -1E7E; [47, 05, 8F][, D0 4D, 05] -2175; [47, 05, 09][2D, 05, 09] -2165; [47, 05, 93][2D, 05, 93] -2176; [47, 05, 09][2D, 05, 09][2D, 05, 3D] -2166; [47, 05, 93][2D, 05, 93][2D, 05, 3D] -2177; [47, 05, 09][2D, 05, 09][2D, 05, 3D][2D, 05, 3D] -2167; [47, 05, 93][2D, 05, 93][2D, 05, 3D][2D, 05, 3D] - -028B; [48 60, 05, 05] -01B2; [48 60, 05, 8F] - -028C; [48 62, 05, 05] - -0077; [49, 05, 05] -FF57; [49, 05, 07] -D835 DC30; [49, 05, 0B] -D835 DC64; [49, 05, 0B] -D835 DC98; [49, 05, 0B] -D835 DCCC; [49, 05, 0B] -D835 DD00; [49, 05, 0B] -D835 DD34; [49, 05, 0B] -D835 DD68; [49, 05, 0B] -D835 DD9C; [49, 05, 0B] -D835 DDD0; [49, 05, 0B] -D835 DE04; [49, 05, 0B] -D835 DE38; [49, 05, 0B] -D835 DE6C; [49, 05, 0B] -D835 DEA0; [49, 05, 0B] -24E6; [49, 05, 0D] -0057; [49, 05, 8F] -FF37; [49, 05, 91] -D835 DC16; [49, 05, 95] -D835 DC4A; [49, 05, 95] -D835 DC7E; [49, 05, 95] -D835 DCB2; [49, 05, 95] -D835 DCE6; [49, 05, 95] -D835 DD1A; [49, 05, 95] -D835 DD4E; [49, 05, 95] -D835 DD82; [49, 05, 95] -D835 DDB6; [49, 05, 95] -D835 DDEA; [49, 05, 95] -D835 DE1E; [49, 05, 95] -D835 DE52; [49, 05, 95] -D835 DE86; [49, 05, 95] -24CC; [49, 05, 97] -02B7; [49, 05, 27] -1E83; [49, 05, 05][, 8D, 05] -1E82; [49, 05, 8F][, 8D, 05] -1E81; [49, 05, 05][, 8F, 05] -1E80; [49, 05, 8F][, 8F, 05] -0175; [49, 05, 05][, 93, 05] -0174; [49, 05, 8F][, 93, 05] -1E98; [49, 05, 05][, 99, 05] -1E85; [49, 05, 05][, 9D, 05] -1E84; [49, 05, 8F][, 9D, 05] -1E87; [49, 05, 05][, A3, 05] -1E86; [49, 05, 8F][, A3, 05] -1E89; [49, 05, 05][, D0 4D, 05] -1E88; [49, 05, 8F][, D0 4D, 05] -33DD; [49, 05, B9][1F, 05, 37] - -028D; [4A 60, 05, 05] - -0078; [4B, 05, 05] -FF58; [4B, 05, 07] -2179; [4B, 05, 09] -D835 DC31; [4B, 05, 0B] -D835 DC65; [4B, 05, 0B] -D835 DC99; [4B, 05, 0B] -D835 DCCD; [4B, 05, 0B] -D835 DD01; [4B, 05, 0B] -D835 DD35; [4B, 05, 0B] -D835 DD69; [4B, 05, 0B] -D835 DD9D; [4B, 05, 0B] -D835 DDD1; [4B, 05, 0B] -D835 DE05; [4B, 05, 0B] -D835 DE39; [4B, 05, 0B] -D835 DE6D; [4B, 05, 0B] -D835 DEA1; [4B, 05, 0B] -24E7; [4B, 05, 0D] -0058; [4B, 05, 8F] -FF38; [4B, 05, 91] -2169; [4B, 05, 93] -D835 DC17; [4B, 05, 95] -D835 DC4B; [4B, 05, 95] -D835 DC7F; [4B, 05, 95] -D835 DCB3; [4B, 05, 95] -D835 DCE7; [4B, 05, 95] -D835 DD1B; [4B, 05, 95] -D835 DD4F; [4B, 05, 95] -D835 DD83; [4B, 05, 95] -D835 DDB7; [4B, 05, 95] -D835 DDEB; [4B, 05, 95] -D835 DE1F; [4B, 05, 95] -D835 DE53; [4B, 05, 95] -D835 DE87; [4B, 05, 95] -24CD; [4B, 05, 97] -02E3; [4B, 05, 27] -1E8D; [4B, 05, 05][, 9D, 05] -1E8C; [4B, 05, 8F][, 9D, 05] -1E8B; [4B, 05, 05][, A3, 05] -1E8A; [4B, 05, 8F][, A3, 05] -217A; [4B, 05, 09][2D, 05, 09] -216A; [4B, 05, 93][2D, 05, 93] -217B; [4B, 05, 09][2D, 05, 09][2D, 05, 3D] -216B; [4B, 05, 93][2D, 05, 93][2D, 05, 3D] - -0079; [4D, 05, 05] -FF59; [4D, 05, 07] -D835 DC32; [4D, 05, 0B] -D835 DC66; [4D, 05, 0B] -D835 DC9A; [4D, 05, 0B] -D835 DCCE; [4D, 05, 0B] -D835 DD02; [4D, 05, 0B] -D835 DD36; [4D, 05, 0B] -D835 DD6A; [4D, 05, 0B] -D835 DD9E; [4D, 05, 0B] -D835 DDD2; [4D, 05, 0B] -D835 DE06; [4D, 05, 0B] -D835 DE3A; [4D, 05, 0B] -D835 DE6E; [4D, 05, 0B] -D835 DEA2; [4D, 05, 0B] -24E8; [4D, 05, 0D] -0059; [4D, 05, 8F] -FF39; [4D, 05, 91] -D835 DC18; [4D, 05, 95] -D835 DC4C; [4D, 05, 95] -D835 DC80; [4D, 05, 95] -D835 DCB4; [4D, 05, 95] -D835 DCE8; [4D, 05, 95] -D835 DD1C; [4D, 05, 95] -D835 DD50; [4D, 05, 95] -D835 DD84; [4D, 05, 95] -D835 DDB8; [4D, 05, 95] -D835 DDEC; [4D, 05, 95] -D835 DE20; [4D, 05, 95] -D835 DE54; [4D, 05, 95] -D835 DE88; [4D, 05, 95] -24CE; [4D, 05, 97] -02B8; [4D, 05, 27] -00FD; [4D, 05, 05][, 8D, 05] -00DD; [4D, 05, 8F][, 8D, 05] -1EF3; [4D, 05, 05][, 8F, 05] -1EF2; [4D, 05, 8F][, 8F, 05] -0177; [4D, 05, 05][, 93, 05] -0176; [4D, 05, 8F][, 93, 05] -1E99; [4D, 05, 05][, 99, 05] -00FF; [4D, 05, 05][, 9D, 05] -0178; [4D, 05, 8F][, 9D, 05] -1EF9; [4D, 05, 05][, A1, 05] -1EF8; [4D, 05, 8F][, A1, 05] -1E8F; [4D, 05, 05][, A3, 05] -1E8E; [4D, 05, 8F][, A3, 05] -0233; [4D, 05, 05][, AB, 05] -0232; [4D, 05, 8F][, AB, 05] -1EF7; [4D, 05, 05][, AF, 05] -1EF6; [4D, 05, 8F][, AF, 05] -1EF5; [4D, 05, 05][, D0 4D, 05] -1EF4; [4D, 05, 8F][, D0 4D, 05] - -028F; [4E 60, 05, 05] - -01B4; [4E 62, 05, 05] -01B3; [4E 62, 05, 8F] - -007A; [4F, 05, 05] -FF5A; [4F, 05, 07] -D835 DC33; [4F, 05, 0B] -D835 DC67; [4F, 05, 0B] -D835 DC9B; [4F, 05, 0B] -D835 DCCF; [4F, 05, 0B] -D835 DD03; [4F, 05, 0B] -D835 DD37; [4F, 05, 0B] -D835 DD6B; [4F, 05, 0B] -D835 DD9F; [4F, 05, 0B] -D835 DDD3; [4F, 05, 0B] -D835 DE07; [4F, 05, 0B] -D835 DE3B; [4F, 05, 0B] -D835 DE6F; [4F, 05, 0B] -D835 DEA3; [4F, 05, 0B] -24E9; [4F, 05, 0D] -005A; [4F, 05, 8F] -FF3A; [4F, 05, 91] -2124; [4F, 05, 95] -2128; [4F, 05, 95] -D835 DC19; [4F, 05, 95] -D835 DC4D; [4F, 05, 95] -D835 DC81; [4F, 05, 95] -D835 DCB5; [4F, 05, 95] -D835 DCE9; [4F, 05, 95] -D835 DD85; [4F, 05, 95] -D835 DDB9; [4F, 05, 95] -D835 DDED; [4F, 05, 95] -D835 DE21; [4F, 05, 95] -D835 DE55; [4F, 05, 95] -D835 DE89; [4F, 05, 95] -24CF; [4F, 05, 97] -017A; [4F, 05, 05][, 8D, 05] -0179; [4F, 05, 8F][, 8D, 05] -1E91; [4F, 05, 05][, 93, 05] -1E90; [4F, 05, 8F][, 93, 05] -017E; [4F, 05, 05][, 97, 05] -017D; [4F, 05, 8F][, 97, 05] -017C; [4F, 05, 05][, A3, 05] -017B; [4F, 05, 8F][, A3, 05] -1E93; [4F, 05, 05][, D0 4D, 05] -1E92; [4F, 05, 8F][, D0 4D, 05] -1E95; [4F, 05, 05][, D1 11, 05] -1E94; [4F, 05, 8F][, D1 11, 05] - -01B6; [50 60, 05, 05] -01B5; [50 60, 05, 8F] - -0225; [50 62, 05, 05] -0224; [50 62, 05, 8F] - -0290; [50 64, 05, 05] - -0291; [50 66, 05, 05] - -0292; [50 68, 05, 05] -01B7; [50 68, 05, 8F] -01EF; [50 68, 05, 05][, 97, 05] -01EE; [50 68, 05, 8F][, 97, 05] - -01B9; [50 6A, 05, 05] -01B8; [50 6A, 05, 8F] - -01BA; [50 6C, 05, 05] - -0293; [50 6E, 05, 05] - -021D; [50 70, 05, 05] -021C; [50 70, 05, 8F] - -00FE; [50 72, 05, 05] -00DE; [50 72, 05, 8F] - -01BF; [50 74, 05, 05] -01F7; [50 74, 05, 8F] - -01BB; [50 76, 05, 05] - -01A8; [50 78, 05, 05] -01A7; [50 78, 05, 8F] - -01BD; [50 7A, 05, 05] -01BC; [50 7A, 05, 8F] - -0185; [50 7C, 05, 05] -0184; [50 7C, 05, 8F] - -0294; [50 7E, 05, 05] - -02C0; [50 80, 05, 05] - -02BC; [50 82, 05, 05] -0149; [50 82, 05, 09][37, 05, 09] - -02EE; [50 84, 05, 05] - -02BE; [50 86, 05, 05] - -0295; [50 88, 05, 05] -02E4; [50 88, 05, 27] - -02BF; [50 8A, 05, 05] - -02C1; [50 8C, 05, 05] - -01BE; [50 8E, 05, 05] - -02A1; [50 90, 05, 05] - -02A2; [50 92, 05, 05] - -0296; [50 94, 05, 05] - -01C0; [50 96, 05, 05] - -01C1; [50 98, 05, 05] - -01C2; [50 9A, 05, 05] - -01C3; [50 9C, 05, 05] - -0297; [50 9E, 05, 05] - -0298; [50 A0, 05, 05] - -02AC; [50 A2, 05, 05] - -02AD; [50 A4, 05, 05] - -03B1; [51 20, 05, 05] -D835 DEC2; [51 20, 05, 0B] -D835 DEFC; [51 20, 05, 0B] -D835 DF36; [51 20, 05, 0B] -D835 DF70; [51 20, 05, 0B] -D835 DFAA; [51 20, 05, 0B] -0391; [51 20, 05, 8F] -D835 DEA8; [51 20, 05, 95] -D835 DEE2; [51 20, 05, 95] -D835 DF1C; [51 20, 05, 95] -D835 DF56; [51 20, 05, 95] -D835 DF90; [51 20, 05, 95] -1F00; [51 20, 05, 05][, 89, 05] -1F08; [51 20, 05, 8F][, 89, 05] -1F04; [51 20, 05, 05][, 89, 05][, 8D, 05] -1F0C; [51 20, 05, 8F][, 89, 05][, 8D, 05] -1F84; [51 20, 05, 05][, 89, 05][, 8D, 05][, D1 E1, 05] -1F8C; [51 20, 05, 8F][, 89, 05][, 8D, 05][, D1 E1, 05] -1F02; [51 20, 05, 05][, 89, 05][, 8F, 05] -1F0A; [51 20, 05, 8F][, 89, 05][, 8F, 05] -1F82; [51 20, 05, 05][, 89, 05][, 8F, 05][, D1 E1, 05] -1F8A; [51 20, 05, 8F][, 89, 05][, 8F, 05][, D1 E1, 05] -1F06; [51 20, 05, 05][, 89, 05][, 9B, 05] -1F0E; [51 20, 05, 8F][, 89, 05][, 9B, 05] -1F86; [51 20, 05, 05][, 89, 05][, 9B, 05][, D1 E1, 05] -1F8E; [51 20, 05, 8F][, 89, 05][, 9B, 05][, D1 E1, 05] -1F80; [51 20, 05, 05][, 89, 05][, D1 E1, 05] -1F88; [51 20, 05, 8F][, 89, 05][, D1 E1, 05] -1F01; [51 20, 05, 05][, 8B, 05] -1F09; [51 20, 05, 8F][, 8B, 05] -1F05; [51 20, 05, 05][, 8B, 05][, 8D, 05] -1F0D; [51 20, 05, 8F][, 8B, 05][, 8D, 05] -1F85; [51 20, 05, 05][, 8B, 05][, 8D, 05][, D1 E1, 05] -1F8D; [51 20, 05, 8F][, 8B, 05][, 8D, 05][, D1 E1, 05] -1F03; [51 20, 05, 05][, 8B, 05][, 8F, 05] -1F0B; [51 20, 05, 8F][, 8B, 05][, 8F, 05] -1F83; [51 20, 05, 05][, 8B, 05][, 8F, 05][, D1 E1, 05] -1F8B; [51 20, 05, 8F][, 8B, 05][, 8F, 05][, D1 E1, 05] -1F07; [51 20, 05, 05][, 8B, 05][, 9B, 05] -1F0F; [51 20, 05, 8F][, 8B, 05][, 9B, 05] -1F87; [51 20, 05, 05][, 8B, 05][, 9B, 05][, D1 E1, 05] -1F8F; [51 20, 05, 8F][, 8B, 05][, 9B, 05][, D1 E1, 05] -1F81; [51 20, 05, 05][, 8B, 05][, D1 E1, 05] -1F89; [51 20, 05, 8F][, 8B, 05][, D1 E1, 05] -03AC; [51 20, 05, 05][, 8D, 05] -1F71; [51 20, 05, 05][, 8D, 05] -0386; [51 20, 05, 8F][, 8D, 05] -1FBB; [51 20, 05, 8F][, 8D, 05] -1FB4; [51 20, 05, 05][, 8D, 05][, D1 E1, 05] -1F70; [51 20, 05, 05][, 8F, 05] -1FBA; [51 20, 05, 8F][, 8F, 05] -1FB2; [51 20, 05, 05][, 8F, 05][, D1 E1, 05] -1FB0; [51 20, 05, 05][, 91, 05] -1FB8; [51 20, 05, 8F][, 91, 05] -1FB6; [51 20, 05, 05][, 9B, 05] -1FB7; [51 20, 05, 05][, 9B, 05][, D1 E1, 05] -1FB1; [51 20, 05, 05][, AB, 05] -1FB9; [51 20, 05, 8F][, AB, 05] -1FB3; [51 20, 05, 05][, D1 E1, 05] -1FBC; [51 20, 05, 8F][, D1 E1, 05] - -03B2; [51 22, 05, 05] -03D0; [51 22, 05, 09] -D835 DEC3; [51 22, 05, 0B] -D835 DEFD; [51 22, 05, 0B] -D835 DF37; [51 22, 05, 0B] -D835 DF71; [51 22, 05, 0B] -D835 DFAB; [51 22, 05, 0B] -0392; [51 22, 05, 8F] -D835 DEA9; [51 22, 05, 95] -D835 DEE3; [51 22, 05, 95] -D835 DF1D; [51 22, 05, 95] -D835 DF57; [51 22, 05, 95] -D835 DF91; [51 22, 05, 95] - -03B3; [51 24, 05, 05] -D835 DEC4; [51 24, 05, 0B] -D835 DEFE; [51 24, 05, 0B] -D835 DF38; [51 24, 05, 0B] -D835 DF72; [51 24, 05, 0B] -D835 DFAC; [51 24, 05, 0B] -0393; [51 24, 05, 8F] -D835 DEAA; [51 24, 05, 95] -D835 DEE4; [51 24, 05, 95] -D835 DF1E; [51 24, 05, 95] -D835 DF58; [51 24, 05, 95] -D835 DF92; [51 24, 05, 95] - -03B4; [51 26, 05, 05] -D835 DEC5; [51 26, 05, 0B] -D835 DEFF; [51 26, 05, 0B] -D835 DF39; [51 26, 05, 0B] -D835 DF73; [51 26, 05, 0B] -D835 DFAD; [51 26, 05, 0B] -0394; [51 26, 05, 8F] -D835 DEAB; [51 26, 05, 95] -D835 DEE5; [51 26, 05, 95] -D835 DF1F; [51 26, 05, 95] -D835 DF59; [51 26, 05, 95] -D835 DF93; [51 26, 05, 95] - -03B5; [51 28, 05, 05] -03F5; [51 28, 05, 09] -D835 DEC6; [51 28, 05, 0B] -D835 DEDC; [51 28, 05, 0B] -D835 DF00; [51 28, 05, 0B] -D835 DF16; [51 28, 05, 0B] -D835 DF3A; [51 28, 05, 0B] -D835 DF50; [51 28, 05, 0B] -D835 DF74; [51 28, 05, 0B] -D835 DF8A; [51 28, 05, 0B] -D835 DFAE; [51 28, 05, 0B] -D835 DFC4; [51 28, 05, 0B] -0395; [51 28, 05, 8F] -D835 DEAC; [51 28, 05, 95] -D835 DEE6; [51 28, 05, 95] -D835 DF20; [51 28, 05, 95] -D835 DF5A; [51 28, 05, 95] -D835 DF94; [51 28, 05, 95] -1F10; [51 28, 05, 05][, 89, 05] -1F18; [51 28, 05, 8F][, 89, 05] -1F14; [51 28, 05, 05][, 89, 05][, 8D, 05] -1F1C; [51 28, 05, 8F][, 89, 05][, 8D, 05] -1F12; [51 28, 05, 05][, 89, 05][, 8F, 05] -1F1A; [51 28, 05, 8F][, 89, 05][, 8F, 05] -1F11; [51 28, 05, 05][, 8B, 05] -1F19; [51 28, 05, 8F][, 8B, 05] -1F15; [51 28, 05, 05][, 8B, 05][, 8D, 05] -1F1D; [51 28, 05, 8F][, 8B, 05][, 8D, 05] -1F13; [51 28, 05, 05][, 8B, 05][, 8F, 05] -1F1B; [51 28, 05, 8F][, 8B, 05][, 8F, 05] -03AD; [51 28, 05, 05][, 8D, 05] -1F73; [51 28, 05, 05][, 8D, 05] -0388; [51 28, 05, 8F][, 8D, 05] -1FC9; [51 28, 05, 8F][, 8D, 05] -1F72; [51 28, 05, 05][, 8F, 05] -1FC8; [51 28, 05, 8F][, 8F, 05] - -03DD; [51 2A, 05, 05] -03DC; [51 2A, 05, 8F] - -03DB; [51 2C, 05, 05] -03DA; [51 2C, 05, 8F] - -03B6; [51 2E, 05, 05] -D835 DEC7; [51 2E, 05, 0B] -D835 DF01; [51 2E, 05, 0B] -D835 DF3B; [51 2E, 05, 0B] -D835 DF75; [51 2E, 05, 0B] -D835 DFAF; [51 2E, 05, 0B] -0396; [51 2E, 05, 8F] -D835 DEAD; [51 2E, 05, 95] -D835 DEE7; [51 2E, 05, 95] -D835 DF21; [51 2E, 05, 95] -D835 DF5B; [51 2E, 05, 95] -D835 DF95; [51 2E, 05, 95] - -03B7; [51 30, 05, 05] -D835 DEC8; [51 30, 05, 0B] -D835 DF02; [51 30, 05, 0B] -D835 DF3C; [51 30, 05, 0B] -D835 DF76; [51 30, 05, 0B] -D835 DFB0; [51 30, 05, 0B] -0397; [51 30, 05, 8F] -D835 DEAE; [51 30, 05, 95] -D835 DEE8; [51 30, 05, 95] -D835 DF22; [51 30, 05, 95] -D835 DF5C; [51 30, 05, 95] -D835 DF96; [51 30, 05, 95] -1F20; [51 30, 05, 05][, 89, 05] -1F28; [51 30, 05, 8F][, 89, 05] -1F24; [51 30, 05, 05][, 89, 05][, 8D, 05] -1F2C; [51 30, 05, 8F][, 89, 05][, 8D, 05] -1F94; [51 30, 05, 05][, 89, 05][, 8D, 05][, D1 E1, 05] -1F9C; [51 30, 05, 8F][, 89, 05][, 8D, 05][, D1 E1, 05] -1F22; [51 30, 05, 05][, 89, 05][, 8F, 05] -1F2A; [51 30, 05, 8F][, 89, 05][, 8F, 05] -1F92; [51 30, 05, 05][, 89, 05][, 8F, 05][, D1 E1, 05] -1F9A; [51 30, 05, 8F][, 89, 05][, 8F, 05][, D1 E1, 05] -1F26; [51 30, 05, 05][, 89, 05][, 9B, 05] -1F2E; [51 30, 05, 8F][, 89, 05][, 9B, 05] -1F96; [51 30, 05, 05][, 89, 05][, 9B, 05][, D1 E1, 05] -1F9E; [51 30, 05, 8F][, 89, 05][, 9B, 05][, D1 E1, 05] -1F90; [51 30, 05, 05][, 89, 05][, D1 E1, 05] -1F98; [51 30, 05, 8F][, 89, 05][, D1 E1, 05] -1F21; [51 30, 05, 05][, 8B, 05] -1F29; [51 30, 05, 8F][, 8B, 05] -1F25; [51 30, 05, 05][, 8B, 05][, 8D, 05] -1F2D; [51 30, 05, 8F][, 8B, 05][, 8D, 05] -1F95; [51 30, 05, 05][, 8B, 05][, 8D, 05][, D1 E1, 05] -1F9D; [51 30, 05, 8F][, 8B, 05][, 8D, 05][, D1 E1, 05] -1F23; [51 30, 05, 05][, 8B, 05][, 8F, 05] -1F2B; [51 30, 05, 8F][, 8B, 05][, 8F, 05] -1F93; [51 30, 05, 05][, 8B, 05][, 8F, 05][, D1 E1, 05] -1F9B; [51 30, 05, 8F][, 8B, 05][, 8F, 05][, D1 E1, 05] -1F27; [51 30, 05, 05][, 8B, 05][, 9B, 05] -1F2F; [51 30, 05, 8F][, 8B, 05][, 9B, 05] -1F97; [51 30, 05, 05][, 8B, 05][, 9B, 05][, D1 E1, 05] -1F9F; [51 30, 05, 8F][, 8B, 05][, 9B, 05][, D1 E1, 05] -1F91; [51 30, 05, 05][, 8B, 05][, D1 E1, 05] -1F99; [51 30, 05, 8F][, 8B, 05][, D1 E1, 05] -03AE; [51 30, 05, 05][, 8D, 05] -1F75; [51 30, 05, 05][, 8D, 05] -0389; [51 30, 05, 8F][, 8D, 05] -1FCB; [51 30, 05, 8F][, 8D, 05] -1FC4; [51 30, 05, 05][, 8D, 05][, D1 E1, 05] -1F74; [51 30, 05, 05][, 8F, 05] -1FCA; [51 30, 05, 8F][, 8F, 05] -1FC2; [51 30, 05, 05][, 8F, 05][, D1 E1, 05] -1FC6; [51 30, 05, 05][, 9B, 05] -1FC7; [51 30, 05, 05][, 9B, 05][, D1 E1, 05] -1FC3; [51 30, 05, 05][, D1 E1, 05] -1FCC; [51 30, 05, 8F][, D1 E1, 05] - -03B8; [51 32, 05, 05] -03D1; [51 32, 05, 09] -D835 DEC9; [51 32, 05, 0B] -D835 DEDD; [51 32, 05, 0B] -D835 DF03; [51 32, 05, 0B] -D835 DF17; [51 32, 05, 0B] -D835 DF3D; [51 32, 05, 0B] -D835 DF51; [51 32, 05, 0B] -D835 DF77; [51 32, 05, 0B] -D835 DF8B; [51 32, 05, 0B] -D835 DFB1; [51 32, 05, 0B] -D835 DFC5; [51 32, 05, 0B] -0398; [51 32, 05, 8F] -03F4; [51 32, 05, 93] -D835 DEAF; [51 32, 05, 95] -D835 DEB9; [51 32, 05, 95] -D835 DEE9; [51 32, 05, 95] -D835 DEF3; [51 32, 05, 95] -D835 DF23; [51 32, 05, 95] -D835 DF2D; [51 32, 05, 95] -D835 DF5D; [51 32, 05, 95] -D835 DF67; [51 32, 05, 95] -D835 DF97; [51 32, 05, 95] -D835 DFA1; [51 32, 05, 95] - -037A; [51 34, 05, 05] -03B9; [51 34, 05, 05] -1FBE; [51 34, 05, 05] -D835 DECA; [51 34, 05, 0B] -D835 DF04; [51 34, 05, 0B] -D835 DF3E; [51 34, 05, 0B] -D835 DF78; [51 34, 05, 0B] -D835 DFB2; [51 34, 05, 0B] -0399; [51 34, 05, 8F] -D835 DEB0; [51 34, 05, 95] -D835 DEEA; [51 34, 05, 95] -D835 DF24; [51 34, 05, 95] -D835 DF5E; [51 34, 05, 95] -D835 DF98; [51 34, 05, 95] -1F30; [51 34, 05, 05][, 89, 05] -1F38; [51 34, 05, 8F][, 89, 05] -1F34; [51 34, 05, 05][, 89, 05][, 8D, 05] -1F3C; [51 34, 05, 8F][, 89, 05][, 8D, 05] -1F32; [51 34, 05, 05][, 89, 05][, 8F, 05] -1F3A; [51 34, 05, 8F][, 89, 05][, 8F, 05] -1F36; [51 34, 05, 05][, 89, 05][, 9B, 05] -1F3E; [51 34, 05, 8F][, 89, 05][, 9B, 05] -1F31; [51 34, 05, 05][, 8B, 05] -1F39; [51 34, 05, 8F][, 8B, 05] -1F35; [51 34, 05, 05][, 8B, 05][, 8D, 05] -1F3D; [51 34, 05, 8F][, 8B, 05][, 8D, 05] -1F33; [51 34, 05, 05][, 8B, 05][, 8F, 05] -1F3B; [51 34, 05, 8F][, 8B, 05][, 8F, 05] -1F37; [51 34, 05, 05][, 8B, 05][, 9B, 05] -1F3F; [51 34, 05, 8F][, 8B, 05][, 9B, 05] -03AF; [51 34, 05, 05][, 8D, 05] -1F77; [51 34, 05, 05][, 8D, 05] -038A; [51 34, 05, 8F][, 8D, 05] -1FDB; [51 34, 05, 8F][, 8D, 05] -1F76; [51 34, 05, 05][, 8F, 05] -1FDA; [51 34, 05, 8F][, 8F, 05] -1FD0; [51 34, 05, 05][, 91, 05] -1FD8; [51 34, 05, 8F][, 91, 05] -1FD6; [51 34, 05, 05][, 9B, 05] -03CA; [51 34, 05, 05][, 9D, 05] -03AA; [51 34, 05, 8F][, 9D, 05] -0390; [51 34, 05, 05][, 9D, 05][, 8D, 05] -1FD3; [51 34, 05, 05][, 9D, 05][, 8D, 05] -1FD2; [51 34, 05, 05][, 9D, 05][, 8F, 05] -1FD7; [51 34, 05, 05][, 9D, 05][, 9B, 05] -1FD1; [51 34, 05, 05][, AB, 05] -1FD9; [51 34, 05, 8F][, AB, 05] - -03F3; [51 36, 05, 05] - -03BA; [51 38, 05, 05] -03F0; [51 38, 05, 09] -D835 DECB; [51 38, 05, 0B] -D835 DEDE; [51 38, 05, 0B] -D835 DF05; [51 38, 05, 0B] -D835 DF18; [51 38, 05, 0B] -D835 DF3F; [51 38, 05, 0B] -D835 DF52; [51 38, 05, 0B] -D835 DF79; [51 38, 05, 0B] -D835 DF8C; [51 38, 05, 0B] -D835 DFB3; [51 38, 05, 0B] -D835 DFC6; [51 38, 05, 0B] -039A; [51 38, 05, 8F] -D835 DEB1; [51 38, 05, 95] -D835 DEEB; [51 38, 05, 95] -D835 DF25; [51 38, 05, 95] -D835 DF5F; [51 38, 05, 95] -D835 DF99; [51 38, 05, 95] -03D7; [51 38, 05, 09][51 20, 05, 09][51 34, 05, 3D] - -03BB; [51 3A, 05, 05] -D835 DECC; [51 3A, 05, 0B] -D835 DF06; [51 3A, 05, 0B] -D835 DF40; [51 3A, 05, 0B] -D835 DF7A; [51 3A, 05, 0B] -D835 DFB4; [51 3A, 05, 0B] -039B; [51 3A, 05, 8F] -D835 DEB2; [51 3A, 05, 95] -D835 DEEC; [51 3A, 05, 95] -D835 DF26; [51 3A, 05, 95] -D835 DF60; [51 3A, 05, 95] -D835 DF9A; [51 3A, 05, 95] - -03BC; [51 3C, 05, 05] -00B5; [51 3C, 05, 09] -D835 DECD; [51 3C, 05, 0B] -D835 DF07; [51 3C, 05, 0B] -D835 DF41; [51 3C, 05, 0B] -D835 DF7B; [51 3C, 05, 0B] -D835 DFB5; [51 3C, 05, 0B] -039C; [51 3C, 05, 8F] -D835 DEB3; [51 3C, 05, 95] -D835 DEED; [51 3C, 05, 95] -D835 DF27; [51 3C, 05, 95] -D835 DF61; [51 3C, 05, 95] -D835 DF9B; [51 3C, 05, 95] -3382; [51 3C, 05, 37][1D, 05, B9] -338C; [51 3C, 05, 37][27, 05, B9] -338D; [51 3C, 05, 37][29, 05, 37] -3395; [51 3C, 05, 37][33, 05, 37] -339B; [51 3C, 05, 37][35, 05, 37] -33B2; [51 3C, 05, 37][41, 05, 37] -33B6; [51 3C, 05, 37][47, 05, B9] -33BC; [51 3C, 05, 37][49, 05, B9] - -03BD; [51 3E, 05, 05] -D835 DECE; [51 3E, 05, 0B] -D835 DF08; [51 3E, 05, 0B] -D835 DF42; [51 3E, 05, 0B] -D835 DF7C; [51 3E, 05, 0B] -D835 DFB6; [51 3E, 05, 0B] -039D; [51 3E, 05, 8F] -D835 DEB4; [51 3E, 05, 95] -D835 DEEE; [51 3E, 05, 95] -D835 DF28; [51 3E, 05, 95] -D835 DF62; [51 3E, 05, 95] -D835 DF9C; [51 3E, 05, 95] - -03BE; [51 40, 05, 05] -D835 DECF; [51 40, 05, 0B] -D835 DF09; [51 40, 05, 0B] -D835 DF43; [51 40, 05, 0B] -D835 DF7D; [51 40, 05, 0B] -D835 DFB7; [51 40, 05, 0B] -039E; [51 40, 05, 8F] -D835 DEB5; [51 40, 05, 95] -D835 DEEF; [51 40, 05, 95] -D835 DF29; [51 40, 05, 95] -D835 DF63; [51 40, 05, 95] -D835 DF9D; [51 40, 05, 95] - -03BF; [51 42, 05, 05] -D835 DED0; [51 42, 05, 0B] -D835 DF0A; [51 42, 05, 0B] -D835 DF44; [51 42, 05, 0B] -D835 DF7E; [51 42, 05, 0B] -D835 DFB8; [51 42, 05, 0B] -039F; [51 42, 05, 8F] -D835 DEB6; [51 42, 05, 95] -D835 DEF0; [51 42, 05, 95] -D835 DF2A; [51 42, 05, 95] -D835 DF64; [51 42, 05, 95] -D835 DF9E; [51 42, 05, 95] -1F40; [51 42, 05, 05][, 89, 05] -1F48; [51 42, 05, 8F][, 89, 05] -1F44; [51 42, 05, 05][, 89, 05][, 8D, 05] -1F4C; [51 42, 05, 8F][, 89, 05][, 8D, 05] -1F42; [51 42, 05, 05][, 89, 05][, 8F, 05] -1F4A; [51 42, 05, 8F][, 89, 05][, 8F, 05] -1F41; [51 42, 05, 05][, 8B, 05] -1F49; [51 42, 05, 8F][, 8B, 05] -1F45; [51 42, 05, 05][, 8B, 05][, 8D, 05] -1F4D; [51 42, 05, 8F][, 8B, 05][, 8D, 05] -1F43; [51 42, 05, 05][, 8B, 05][, 8F, 05] -1F4B; [51 42, 05, 8F][, 8B, 05][, 8F, 05] -03CC; [51 42, 05, 05][, 8D, 05] -1F79; [51 42, 05, 05][, 8D, 05] -038C; [51 42, 05, 8F][, 8D, 05] -1FF9; [51 42, 05, 8F][, 8D, 05] -1F78; [51 42, 05, 05][, 8F, 05] -1FF8; [51 42, 05, 8F][, 8F, 05] - -03C0; [51 44, 05, 05] -03D6; [51 44, 05, 09] -D835 DED1; [51 44, 05, 0B] -D835 DEE1; [51 44, 05, 0B] -D835 DF0B; [51 44, 05, 0B] -D835 DF1B; [51 44, 05, 0B] -D835 DF45; [51 44, 05, 0B] -D835 DF55; [51 44, 05, 0B] -D835 DF7F; [51 44, 05, 0B] -D835 DF8F; [51 44, 05, 0B] -D835 DFB9; [51 44, 05, 0B] -D835 DFC9; [51 44, 05, 0B] -03A0; [51 44, 05, 8F] -D835 DEB7; [51 44, 05, 95] -D835 DEF1; [51 44, 05, 95] -D835 DF2B; [51 44, 05, 95] -D835 DF65; [51 44, 05, 95] -D835 DF9F; [51 44, 05, 95] - -03DF; [51 46, 05, 05] -03DE; [51 46, 05, 8F] - -03C1; [51 48, 05, 05] -03F1; [51 48, 05, 09] -D835 DED2; [51 48, 05, 0B] -D835 DEE0; [51 48, 05, 0B] -D835 DF0C; [51 48, 05, 0B] -D835 DF1A; [51 48, 05, 0B] -D835 DF46; [51 48, 05, 0B] -D835 DF54; [51 48, 05, 0B] -D835 DF80; [51 48, 05, 0B] -D835 DF8E; [51 48, 05, 0B] -D835 DFBA; [51 48, 05, 0B] -D835 DFC8; [51 48, 05, 0B] -03A1; [51 48, 05, 8F] -D835 DEB8; [51 48, 05, 95] -D835 DEF2; [51 48, 05, 95] -D835 DF2C; [51 48, 05, 95] -D835 DF66; [51 48, 05, 95] -D835 DFA0; [51 48, 05, 95] -1FE4; [51 48, 05, 05][, 89, 05] -1FE5; [51 48, 05, 05][, 8B, 05] -1FEC; [51 48, 05, 8F][, 8B, 05] - -03C3; [51 4A, 05, 05] -03F2; [51 4A, 05, 09] -D835 DED3; [51 4A, 05, 0B] -D835 DED4; [51 4A, 05, 0B] -D835 DF0D; [51 4A, 05, 0B] -D835 DF0E; [51 4A, 05, 0B] -D835 DF47; [51 4A, 05, 0B] -D835 DF48; [51 4A, 05, 0B] -D835 DF81; [51 4A, 05, 0B] -D835 DF82; [51 4A, 05, 0B] -D835 DFBB; [51 4A, 05, 0B] -D835 DFBC; [51 4A, 05, 0B] -03A3; [51 4A, 05, 8F] -D835 DEBA; [51 4A, 05, 95] -D835 DEF4; [51 4A, 05, 95] -D835 DF2E; [51 4A, 05, 95] -D835 DF68; [51 4A, 05, 95] -D835 DFA2; [51 4A, 05, 95] -03C2; [51 4A, 05, 31] - -03C4; [51 4C, 05, 05] -D835 DED5; [51 4C, 05, 0B] -D835 DF0F; [51 4C, 05, 0B] -D835 DF49; [51 4C, 05, 0B] -D835 DF83; [51 4C, 05, 0B] -D835 DFBD; [51 4C, 05, 0B] -03A4; [51 4C, 05, 8F] -D835 DEBB; [51 4C, 05, 95] -D835 DEF5; [51 4C, 05, 95] -D835 DF2F; [51 4C, 05, 95] -D835 DF69; [51 4C, 05, 95] -D835 DFA3; [51 4C, 05, 95] - -03C5; [51 4E, 05, 05] -D835 DED6; [51 4E, 05, 0B] -D835 DF10; [51 4E, 05, 0B] -D835 DF4A; [51 4E, 05, 0B] -D835 DF84; [51 4E, 05, 0B] -D835 DFBE; [51 4E, 05, 0B] -03A5; [51 4E, 05, 8F] -03D2; [51 4E, 05, 93] -D835 DEBC; [51 4E, 05, 95] -D835 DEF6; [51 4E, 05, 95] -D835 DF30; [51 4E, 05, 95] -D835 DF6A; [51 4E, 05, 95] -D835 DFA4; [51 4E, 05, 95] -1F50; [51 4E, 05, 05][, 89, 05] -1F54; [51 4E, 05, 05][, 89, 05][, 8D, 05] -1F52; [51 4E, 05, 05][, 89, 05][, 8F, 05] -1F56; [51 4E, 05, 05][, 89, 05][, 9B, 05] -1F51; [51 4E, 05, 05][, 8B, 05] -1F59; [51 4E, 05, 8F][, 8B, 05] -1F55; [51 4E, 05, 05][, 8B, 05][, 8D, 05] -1F5D; [51 4E, 05, 8F][, 8B, 05][, 8D, 05] -1F53; [51 4E, 05, 05][, 8B, 05][, 8F, 05] -1F5B; [51 4E, 05, 8F][, 8B, 05][, 8F, 05] -1F57; [51 4E, 05, 05][, 8B, 05][, 9B, 05] -1F5F; [51 4E, 05, 8F][, 8B, 05][, 9B, 05] -03CD; [51 4E, 05, 05][, 8D, 05] -1F7B; [51 4E, 05, 05][, 8D, 05] -038E; [51 4E, 05, 8F][, 8D, 05] -1FEB; [51 4E, 05, 8F][, 8D, 05] -03D3; [51 4E, 05, 93][, 8D, 05] -1F7A; [51 4E, 05, 05][, 8F, 05] -1FEA; [51 4E, 05, 8F][, 8F, 05] -1FE0; [51 4E, 05, 05][, 91, 05] -1FE8; [51 4E, 05, 8F][, 91, 05] -1FE6; [51 4E, 05, 05][, 9B, 05] -03CB; [51 4E, 05, 05][, 9D, 05] -03AB; [51 4E, 05, 8F][, 9D, 05] -03D4; [51 4E, 05, 93][, 9D, 05] -03B0; [51 4E, 05, 05][, 9D, 05][, 8D, 05] -1FE3; [51 4E, 05, 05][, 9D, 05][, 8D, 05] -1FE2; [51 4E, 05, 05][, 9D, 05][, 8F, 05] -1FE7; [51 4E, 05, 05][, 9D, 05][, 9B, 05] -1FE1; [51 4E, 05, 05][, AB, 05] -1FE9; [51 4E, 05, 8F][, AB, 05] - -03C6; [51 50, 05, 05] -03D5; [51 50, 05, 09] -D835 DED7; [51 50, 05, 0B] -D835 DEDF; [51 50, 05, 0B] -D835 DF11; [51 50, 05, 0B] -D835 DF19; [51 50, 05, 0B] -D835 DF4B; [51 50, 05, 0B] -D835 DF53; [51 50, 05, 0B] -D835 DF85; [51 50, 05, 0B] -D835 DF8D; [51 50, 05, 0B] -D835 DFBF; [51 50, 05, 0B] -D835 DFC7; [51 50, 05, 0B] -03A6; [51 50, 05, 8F] -D835 DEBD; [51 50, 05, 95] -D835 DEF7; [51 50, 05, 95] -D835 DF31; [51 50, 05, 95] -D835 DF6B; [51 50, 05, 95] -D835 DFA5; [51 50, 05, 95] - -03C7; [51 52, 05, 05] -D835 DED8; [51 52, 05, 0B] -D835 DF12; [51 52, 05, 0B] -D835 DF4C; [51 52, 05, 0B] -D835 DF86; [51 52, 05, 0B] -D835 DFC0; [51 52, 05, 0B] -03A7; [51 52, 05, 8F] -D835 DEBE; [51 52, 05, 95] -D835 DEF8; [51 52, 05, 95] -D835 DF32; [51 52, 05, 95] -D835 DF6C; [51 52, 05, 95] -D835 DFA6; [51 52, 05, 95] - -03C8; [51 54, 05, 05] -D835 DED9; [51 54, 05, 0B] -D835 DF13; [51 54, 05, 0B] -D835 DF4D; [51 54, 05, 0B] -D835 DF87; [51 54, 05, 0B] -D835 DFC1; [51 54, 05, 0B] -03A8; [51 54, 05, 8F] -D835 DEBF; [51 54, 05, 95] -D835 DEF9; [51 54, 05, 95] -D835 DF33; [51 54, 05, 95] -D835 DF6D; [51 54, 05, 95] -D835 DFA7; [51 54, 05, 95] - -03C9; [51 56, 05, 05] -D835 DEDA; [51 56, 05, 0B] -D835 DF14; [51 56, 05, 0B] -D835 DF4E; [51 56, 05, 0B] -D835 DF88; [51 56, 05, 0B] -D835 DFC2; [51 56, 05, 0B] -03A9; [51 56, 05, 8F] -2126; [51 56, 05, 8F] -D835 DEC0; [51 56, 05, 95] -D835 DEFA; [51 56, 05, 95] -D835 DF34; [51 56, 05, 95] -D835 DF6E; [51 56, 05, 95] -D835 DFA8; [51 56, 05, 95] -1F60; [51 56, 05, 05][, 89, 05] -1F68; [51 56, 05, 8F][, 89, 05] -1F64; [51 56, 05, 05][, 89, 05][, 8D, 05] -1F6C; [51 56, 05, 8F][, 89, 05][, 8D, 05] -1FA4; [51 56, 05, 05][, 89, 05][, 8D, 05][, D1 E1, 05] -1FAC; [51 56, 05, 8F][, 89, 05][, 8D, 05][, D1 E1, 05] -1F62; [51 56, 05, 05][, 89, 05][, 8F, 05] -1F6A; [51 56, 05, 8F][, 89, 05][, 8F, 05] -1FA2; [51 56, 05, 05][, 89, 05][, 8F, 05][, D1 E1, 05] -1FAA; [51 56, 05, 8F][, 89, 05][, 8F, 05][, D1 E1, 05] -1F66; [51 56, 05, 05][, 89, 05][, 9B, 05] -1F6E; [51 56, 05, 8F][, 89, 05][, 9B, 05] -1FA6; [51 56, 05, 05][, 89, 05][, 9B, 05][, D1 E1, 05] -1FAE; [51 56, 05, 8F][, 89, 05][, 9B, 05][, D1 E1, 05] -1FA0; [51 56, 05, 05][, 89, 05][, D1 E1, 05] -1FA8; [51 56, 05, 8F][, 89, 05][, D1 E1, 05] -1F61; [51 56, 05, 05][, 8B, 05] -1F69; [51 56, 05, 8F][, 8B, 05] -1F65; [51 56, 05, 05][, 8B, 05][, 8D, 05] -1F6D; [51 56, 05, 8F][, 8B, 05][, 8D, 05] -1FA5; [51 56, 05, 05][, 8B, 05][, 8D, 05][, D1 E1, 05] -1FAD; [51 56, 05, 8F][, 8B, 05][, 8D, 05][, D1 E1, 05] -1F63; [51 56, 05, 05][, 8B, 05][, 8F, 05] -1F6B; [51 56, 05, 8F][, 8B, 05][, 8F, 05] -1FA3; [51 56, 05, 05][, 8B, 05][, 8F, 05][, D1 E1, 05] -1FAB; [51 56, 05, 8F][, 8B, 05][, 8F, 05][, D1 E1, 05] -1F67; [51 56, 05, 05][, 8B, 05][, 9B, 05] -1F6F; [51 56, 05, 8F][, 8B, 05][, 9B, 05] -1FA7; [51 56, 05, 05][, 8B, 05][, 9B, 05][, D1 E1, 05] -1FAF; [51 56, 05, 8F][, 8B, 05][, 9B, 05][, D1 E1, 05] -1FA1; [51 56, 05, 05][, 8B, 05][, D1 E1, 05] -1FA9; [51 56, 05, 8F][, 8B, 05][, D1 E1, 05] -03CE; [51 56, 05, 05][, 8D, 05] -1F7D; [51 56, 05, 05][, 8D, 05] -038F; [51 56, 05, 8F][, 8D, 05] -1FFB; [51 56, 05, 8F][, 8D, 05] -1FF4; [51 56, 05, 05][, 8D, 05][, D1 E1, 05] -1F7C; [51 56, 05, 05][, 8F, 05] -1FFA; [51 56, 05, 8F][, 8F, 05] -1FF2; [51 56, 05, 05][, 8F, 05][, D1 E1, 05] -1FF6; [51 56, 05, 05][, 9B, 05] -1FF7; [51 56, 05, 05][, 9B, 05][, D1 E1, 05] -1FF3; [51 56, 05, 05][, D1 E1, 05] -1FFC; [51 56, 05, 8F][, D1 E1, 05] - -03E1; [51 58, 05, 05] -03E0; [51 58, 05, 8F] - -03E3; [51 5A, 05, 05] -03E2; [51 5A, 05, 8F] - -03E5; [51 5C, 05, 05] -03E4; [51 5C, 05, 8F] - -03E7; [51 5E, 05, 05] -03E6; [51 5E, 05, 8F] - -03E9; [51 60, 05, 05] -03E8; [51 60, 05, 8F] - -03EB; [51 62, 05, 05] -03EA; [51 62, 05, 8F] - -03ED; [51 64, 05, 05] -03EC; [51 64, 05, 8F] - -03EF; [51 66, 05, 05] -03EE; [51 66, 05, 8F] - -0430; [52 20, 05, 05] -0410; [52 20, 05, 8F] - -0430 0306; [52 22, 05, 05] -04D1; [52 22, 05, 05] -0410 0306; [52 22, 05, 8F] -04D0; [52 22, 05, 8F] - -0430 0308; [52 24, 05, 05] -04D3; [52 24, 05, 05] -0410 0308; [52 24, 05, 8F] -04D2; [52 24, 05, 8F] - -04D9; [52 26, 05, 05] -04D8; [52 26, 05, 8F] - -04D9 0308; [52 28, 05, 05] -04DB; [52 28, 05, 05] -04D8 0308; [52 28, 05, 8F] -04DA; [52 28, 05, 8F] - -04D5; [52 2A, 05, 05] -04D4; [52 2A, 05, 8F] - -0431; [52 2C, 05, 05] -0411; [52 2C, 05, 8F] - -0432; [52 2E, 05, 05] -0412; [52 2E, 05, 8F] - -0433; [52 30, 05, 05] -0413; [52 30, 05, 8F] -0491; [52 30, 05, 09][, DF 79, 09] -0490; [52 30, 05, 93][, DF 79, 09] - -0493; [52 32, 05, 05] -0492; [52 32, 05, 8F] - -0495; [52 34, 05, 05] -0494; [52 34, 05, 8F] - -0434; [52 36, 05, 05] -0414; [52 36, 05, 8F] - -0452; [52 38, 05, 05] -0402; [52 38, 05, 8F] - -0433 0301; [52 3A, 05, 05] -0433 0341; [52 3A, 05, 05] -0453; [52 3A, 05, 05] -0403; [52 3A, 05, 8F] -0413 0301; [52 3A, 05, 8F] -0413 0341; [52 3A, 05, 8F] - -0499; [52 3C, 05, 05] -0498; [52 3C, 05, 8F] +1973; [7B 62, 05, 05] -0435; [52 3E, 05, 05] -0415; [52 3E, 05, 8F] -0450; [52 3E, 05, 05][, 8F, 05] -0400; [52 3E, 05, 8F][, 8F, 05] -0451; [52 3E, 05, 05][, 9D, 05] -0401; [52 3E, 05, 8F][, 9D, 05] +1974; [7B 64, 05, 05] -0435 0306; [52 40, 05, 05] -04D7; [52 40, 05, 05] -0415 0306; [52 40, 05, 8F] -04D6; [52 40, 05, 8F] +1880; [7C 20, 05, 05] -0454; [52 42, 05, 05] -0404; [52 42, 05, 8F] +1881; [7C 22, 05, 05] -0436; [52 44, 05, 05] -0416; [52 44, 05, 8F] -04C2; [52 44, 05, 05][, 91, 05] -04C1; [52 44, 05, 8F][, 91, 05] +1882; [7C 24, 05, 05] -0436 0308; [52 46, 05, 05] -04DD; [52 46, 05, 05] -0416 0308; [52 46, 05, 8F] -04DC; [52 46, 05, 8F] +1883; [7C 26, 05, 05] -0497; [52 48, 05, 05] -0496; [52 48, 05, 8F] +1884; [7C 28, 05, 05] -0437; [52 4A, 05, 05] -0417; [52 4A, 05, 8F] +1885; [7C 2A, 05, 05] -0437 0308; [52 4C, 05, 05] -04DF; [52 4C, 05, 05] -0417 0308; [52 4C, 05, 8F] -04DE; [52 4C, 05, 8F] +1886; [7C 2C, 05, 05] -0455; [52 4E, 05, 05] -0405; [52 4E, 05, 8F] +1843; [7C 2E, 05, 05] -04E1; [52 50, 05, 05] -04E0; [52 50, 05, 8F] +1820; [7C 30, 05, 05] -0438; [52 52, 05, 05] -0418; [52 52, 05, 8F] -045D; [52 52, 05, 05][, 8F, 05] -040D; [52 52, 05, 8F][, 8F, 05] -04E3; [52 52, 05, 05][, AB, 05] -04E2; [52 52, 05, 8F][, AB, 05] +1887; [7C 32, 05, 05] -0438 0308; [52 54, 05, 05] -04E5; [52 54, 05, 05] -0418 0308; [52 54, 05, 8F] -04E4; [52 54, 05, 8F] +1821; [7C 34, 05, 05] -0456; [52 56, 05, 05] -0406; [52 56, 05, 8F] +1844; [7C 36, 05, 05] -0456 0308; [52 58, 05, 05] -0457; [52 58, 05, 05] -0406 0308; [52 58, 05, 8F] -0407; [52 58, 05, 8F] +185D; [7C 38, 05, 05] -0438 0306; [52 5A, 05, 05] -0439; [52 5A, 05, 05] -0418 0306; [52 5A, 05, 8F] -0419; [52 5A, 05, 8F] +1822; [7C 3A, 05, 05] -0458; [52 5C, 05, 05] -0408; [52 5C, 05, 8F] +1845; [7C 3C, 05, 05] -043A; [52 5E, 05, 05] -041A; [52 5E, 05, 8F] +185E; [7C 3E, 05, 05] -049B; [52 60, 05, 05] -049A; [52 60, 05, 8F] +1873; [7C 40, 05, 05] -04C4; [52 62, 05, 05] -04C3; [52 62, 05, 8F] +1888; [7C 42, 05, 05] -04A1; [52 64, 05, 05] -04A0; [52 64, 05, 8F] +185F; [7C 44, 05, 05] -049F; [52 66, 05, 05] -049E; [52 66, 05, 8F] +1823; [7C 46, 05, 05] -049D; [52 68, 05, 05] -049C; [52 68, 05, 8F] +1846; [7C 48, 05, 05] -043B; [52 6A, 05, 05] -041B; [52 6A, 05, 8F] +1824; [7C 4A, 05, 05] -0459; [52 6C, 05, 05] -0409; [52 6C, 05, 8F] +1847; [7C 4C, 05, 05] -043C; [52 6E, 05, 05] -041C; [52 6E, 05, 8F] +1861; [7C 4E, 05, 05] -043D; [52 70, 05, 05] -041D; [52 70, 05, 8F] +1825; [7C 50, 05, 05] -04A3; [52 72, 05, 05] -04A2; [52 72, 05, 8F] +1848; [7C 52, 05, 05] -04C8; [52 74, 05, 05] -04C7; [52 74, 05, 8F] +1826; [7C 54, 05, 05] -04A5; [52 76, 05, 05] -04A4; [52 76, 05, 8F] +1849; [7C 56, 05, 05] -045A; [52 78, 05, 05] -040A; [52 78, 05, 8F] +1860; [7C 58, 05, 05] -043E; [52 7A, 05, 05] -041E; [52 7A, 05, 8F] +1827; [7C 5A, 05, 05] -043E 0308; [52 7C, 05, 05] -04E7; [52 7C, 05, 05] -041E 0308; [52 7C, 05, 8F] -04E6; [52 7C, 05, 8F] +1828; [7C 5C, 05, 05] -04E9; [52 7E, 05, 05] -04E8; [52 7E, 05, 8F] +1829; [7C 5E, 05, 05] -04E9 0308; [52 80, 05, 05] -04EB; [52 80, 05, 05] -04E8 0308; [52 80, 05, 8F] -04EA; [52 80, 05, 8F] +184A; [7C 60, 05, 05] -043F; [52 82, 05, 05] -041F; [52 82, 05, 8F] +1862; [7C 62, 05, 05] -04A7; [52 84, 05, 05] -04A6; [52 84, 05, 8F] +188A; [7C 64, 05, 05] -0481; [52 86, 05, 05] -0480; [52 86, 05, 8F] +189B; [7C 66, 05, 05] -0440; [52 88, 05, 05] -0420; [52 88, 05, 8F] +182A; [7C 68, 05, 05] -048F; [52 8A, 05, 05] -048E; [52 8A, 05, 8F] +184B; [7C 6A, 05, 05] -0441; [52 8C, 05, 05] -0421; [52 8C, 05, 8F] +182B; [7C 6C, 05, 05] -04AB; [52 8E, 05, 05] -04AA; [52 8E, 05, 8F] +184C; [7C 6E, 05, 05] -0442; [52 90, 05, 05] -0422; [52 90, 05, 8F] +1866; [7C 70, 05, 05] -04AD; [52 92, 05, 05] -04AC; [52 92, 05, 8F] +182C; [7C 72, 05, 05] -045B; [52 94, 05, 05] -040B; [52 94, 05, 8F] +184D; [7C 74, 05, 05] -043A 0301; [52 96, 05, 05] -043A 0341; [52 96, 05, 05] -045C; [52 96, 05, 05] -040C; [52 96, 05, 8F] -041A 0301; [52 96, 05, 8F] -041A 0341; [52 96, 05, 8F] +182D; [7C 76, 05, 05] -0443; [52 98, 05, 05] -0423; [52 98, 05, 8F] -04EF; [52 98, 05, 05][, AB, 05] -04EE; [52 98, 05, 8F][, AB, 05] +184E; [7C 78, 05, 05] -0443 0306; [52 9A, 05, 05] -045E; [52 9A, 05, 05] -040E; [52 9A, 05, 8F] -0423 0306; [52 9A, 05, 8F] +1864; [7C 7A, 05, 05] -0443 0308; [52 9C, 05, 05] -04F1; [52 9C, 05, 05] -0423 0308; [52 9C, 05, 8F] -04F0; [52 9C, 05, 8F] +189A; [7C 7C, 05, 05] -0443 030B; [52 9E, 05, 05] -04F3; [52 9E, 05, 05] -0423 030B; [52 9E, 05, 8F] -04F2; [52 9E, 05, 8F] +1865; [7C 7E, 05, 05] -04AF; [52 A0, 05, 05] -04AE; [52 A0, 05, 8F] +182E; [7C 80, 05, 05] -04B1; [52 A2, 05, 05] -04B0; [52 A2, 05, 8F] +184F; [7C 82, 05, 05] -0479; [52 A4, 05, 05] -0478; [52 A4, 05, 8F] +182F; [7C 84, 05, 05] -0444; [52 A6, 05, 05] -0424; [52 A6, 05, 8F] +1830; [7C 86, 05, 05] -0445; [52 A8, 05, 05] -0425; [52 A8, 05, 8F] +1831; [7C 88, 05, 05] -04B3; [52 AA, 05, 05] -04B2; [52 AA, 05, 8F] +1867; [7C 8A, 05, 05] -04BB; [52 AC, 05, 05] -04BA; [52 AC, 05, 8F] +189C; [7C 8C, 05, 05] -0461; [52 AE, 05, 05] -0460; [52 AE, 05, 8F] +189D; [7C 8E, 05, 05] -047F; [52 B0, 05, 05] -047E; [52 B0, 05, 8F] +18A2; [7C 90, 05, 05] -047D; [52 B2, 05, 05] -047C; [52 B2, 05, 8F] +18A4; [7C 92, 05, 05] -047B; [52 B4, 05, 05] -047A; [52 B4, 05, 8F] +18A5; [7C 94, 05, 05] -0446; [52 B6, 05, 05] -0426; [52 B6, 05, 8F] +1832; [7C 96, 05, 05] -04B5; [52 B8, 05, 05] -04B4; [52 B8, 05, 8F] +1850; [7C 98, 05, 05] -0447; [52 BA, 05, 05] -0427; [52 BA, 05, 8F] +1868; [7C 9A, 05, 05] -0447 0308; [52 BC, 05, 05] -04F5; [52 BC, 05, 05] -0427 0308; [52 BC, 05, 8F] -04F4; [52 BC, 05, 8F] +1833; [7C 9C, 05, 05] -04B7; [52 BE, 05, 05] -04B6; [52 BE, 05, 8F] +1851; [7C 9E, 05, 05] -04CC; [52 C0, 05, 05] -04CB; [52 C0, 05, 8F] +1869; [7C A0, 05, 05] -04B9; [52 C2, 05, 05] -04B8; [52 C2, 05, 8F] +1834; [7C A2, 05, 05] -04BD; [52 C4, 05, 05] -04BC; [52 C4, 05, 8F] +1852; [7C A4, 05, 05] -04BF; [52 C6, 05, 05] -04BE; [52 C6, 05, 8F] +1871; [7C A6, 05, 05] -045F; [52 C8, 05, 05] -040F; [52 C8, 05, 8F] +185C; [7C A8, 05, 05] -0448; [52 CA, 05, 05] -0428; [52 CA, 05, 8F] +188B; [7C AA, 05, 05] -0449; [52 CC, 05, 05] -0429; [52 CC, 05, 8F] +1835; [7C AC, 05, 05] -044A; [52 CE, 05, 05] -042A; [52 CE, 05, 8F] +1853; [7C AE, 05, 05] -044B; [52 D0, 05, 05] -042B; [52 D0, 05, 8F] +186A; [7C B0, 05, 05] -044B 0308; [52 D2, 05, 05] -04F9; [52 D2, 05, 05] -042B 0308; [52 D2, 05, 8F] -04F8; [52 D2, 05, 8F] +1877; [7C B2, 05, 05] -044C; [52 D4, 05, 05] -042C; [52 D4, 05, 8F] +1836; [7C B4, 05, 05] -048D; [52 D6, 05, 05] -048C; [52 D6, 05, 8F] +1855; [7C B6, 05, 05] -0463; [52 D8, 05, 05] -0462; [52 D8, 05, 8F] +1872; [7C B8, 05, 05] -044D; [52 DA, 05, 05] -042D; [52 DA, 05, 8F] +1837; [7C BA, 05, 05] -044D 0308; [52 DC, 05, 05] -04ED; [52 DC, 05, 05] -042D 0308; [52 DC, 05, 8F] -04EC; [52 DC, 05, 8F] +1875; [7C BC, 05, 05] -044E; [52 DE, 05, 05] -042E; [52 DE, 05, 8F] +1838; [7C BE, 05, 05] -044F; [52 E0, 05, 05] -042F; [52 E0, 05, 8F] +1856; [7C C0, 05, 05] -0465; [52 E2, 05, 05] -0464; [52 E2, 05, 8F] +1839; [7C C2, 05, 05] -0467; [52 E4, 05, 05] -0466; [52 E4, 05, 8F] +186B; [7C C4, 05, 05] -046B; [52 E6, 05, 05] -046A; [52 E6, 05, 8F] +1876; [7C C6, 05, 05] -0469; [52 E8, 05, 05] -0468; [52 E8, 05, 8F] +183A; [7C C8, 05, 05] -046D; [52 EA, 05, 05] -046C; [52 EA, 05, 8F] +1857; [7C CA, 05, 05] -046F; [52 EC, 05, 05] -046E; [52 EC, 05, 8F] +1863; [7C CC, 05, 05] -0471; [52 EE, 05, 05] -0470; [52 EE, 05, 8F] +1874; [7C CE, 05, 05] -0473; [52 F0, 05, 05] -0472; [52 F0, 05, 8F] +1889; [7C D0, 05, 05] -0475; [52 F2, 05, 05] -0474; [52 F2, 05, 8F] +183B; [7C D2, 05, 05] -0475 030F; [52 F4, 05, 05] -0477; [52 F4, 05, 05] -0474 030F; [52 F4, 05, 8F] -0476; [52 F4, 05, 8F] +183C; [7C D4, 05, 05] -04A9; [52 F6, 05, 05] -04A8; [52 F6, 05, 8F] +1854; [7C D6, 05, 05] -04C0; [52 F8, 05, 8F] +186E; [7C D8, 05, 05] -10D0; [54 20, 05, 05] -10A0; [54 20, 05, 8F] +183D; [7C DA, 05, 05] -10D1; [54 22, 05, 05] -10A1; [54 22, 05, 8F] +186F; [7C DC, 05, 05] -10D2; [54 24, 05, 05] -10A2; [54 24, 05, 8F] +1858; [7C DE, 05, 05] -10D3; [54 26, 05, 05] -10A3; [54 26, 05, 8F] +186C; [7C E0, 05, 05] -10D4; [54 28, 05, 05] -10A4; [54 28, 05, 8F] +183E; [7C E2, 05, 05] -10D5; [54 2A, 05, 05] -10A5; [54 2A, 05, 8F] +1859; [7C E4, 05, 05] -10D6; [54 2C, 05, 05] -10A6; [54 2C, 05, 8F] +186D; [7C E6, 05, 05] -10F1; [54 2E, 05, 05] -10C1; [54 2E, 05, 8F] +183F; [7C E8, 05, 05] -10D7; [54 30, 05, 05] -10A7; [54 30, 05, 8F] +1840; [7C EA, 05, 05] -10D8; [54 32, 05, 05] -10A8; [54 32, 05, 8F] +1841; [7C EC, 05, 05] -10D9; [54 34, 05, 05] -10A9; [54 34, 05, 8F] +1842; [7C EE, 05, 05] -10DA; [54 36, 05, 05] -10AA; [54 36, 05, 8F] +185A; [7C F0, 05, 05] -10DB; [54 38, 05, 05] -10AB; [54 38, 05, 8F] +185B; [7C F2, 05, 05] -10DC; [54 3A, 05, 05] -10AC; [54 3A, 05, 8F] +1870; [7C F4, 05, 05] -10F2; [54 3C, 05, 05] -10C2; [54 3C, 05, 8F] +188C; [7C F6, 05, 05] -10DD; [54 3E, 05, 05] -10AD; [54 3E, 05, 8F] +189E; [7C F8, 05, 05] -10DE; [54 40, 05, 05] -10AE; [54 40, 05, 8F] +188D; [7C FA, 05, 05] -10DF; [54 42, 05, 05] -10AF; [54 42, 05, 8F] +188E; [7C FC, 05, 05] -10E0; [54 44, 05, 05] -10B0; [54 44, 05, 8F] +189F; [7C FE, 05, 05] -10E1; [54 46, 05, 05] -10B1; [54 46, 05, 8F] +188F; [7D 05, 05, 05] -10E2; [54 48, 05, 05] -10B2; [54 48, 05, 8F] +1890; [7D 07, 05, 05] -10F3; [54 4A, 05, 05] -10C3; [54 4A, 05, 8F] +1898; [7D 09, 05, 05] -10E3; [54 4C, 05, 05] -10B3; [54 4C, 05, 8F] +18A0; [7D 0B, 05, 05] -10E4; [54 4E, 05, 05] -10B4; [54 4E, 05, 8F] +1891; [7D 0D, 05, 05] -10E5; [54 50, 05, 05] -10B5; [54 50, 05, 8F] +18A1; [7D 0F, 05, 05] -10E6; [54 52, 05, 05] -10B6; [54 52, 05, 8F] +1892; [7D 11, 05, 05] -10E7; [54 54, 05, 05] -10B7; [54 54, 05, 8F] +1893; [7D 13, 05, 05] -10E8; [54 56, 05, 05] -10B8; [54 56, 05, 8F] +18A8; [7D 15, 05, 05] -10E9; [54 58, 05, 05] -10B9; [54 58, 05, 8F] +1894; [7D 17, 05, 05] -10EA; [54 5A, 05, 05] -10BA; [54 5A, 05, 8F] +18A3; [7D 19, 05, 05] -10EB; [54 5C, 05, 05] -10BB; [54 5C, 05, 8F] +1895; [7D 1B, 05, 05] -10EC; [54 5E, 05, 05] -10BC; [54 5E, 05, 8F] +1899; [7D 1D, 05, 05] -10ED; [54 60, 05, 05] -10BD; [54 60, 05, 8F] +1896; [7D 1F, 05, 05] -10EE; [54 62, 05, 05] -10BE; [54 62, 05, 8F] +1897; [7D 21, 05, 05] -10F4; [54 64, 05, 05] -10C4; [54 64, 05, 8F] +18A6; [7D 23, 05, 05] -10EF; [54 66, 05, 05] -10BF; [54 66, 05, 8F] +18A7; [7D 25, 05, 05] -10F0; [54 68, 05, 05] -10C0; [54 68, 05, 8F] +18A9; [7D 27, 05, 05] -10F5; [54 6A, 05, 05] -10C5; [54 6A, 05, 8F] +13A0; [7E 20, 05, 05] -10F6; [54 6C, 05, 05] +13A1; [7E 22, 05, 05] -0561; [55 20, 05, 05] -0531; [55 20, 05, 8F] +13A2; [7E 24, 05, 05] -0562; [55 22, 05, 05] -0532; [55 22, 05, 8F] +13A3; [7E 26, 05, 05] -0563; [55 24, 05, 05] -0533; [55 24, 05, 8F] +13A4; [7E 28, 05, 05] -0564; [55 26, 05, 05] -0534; [55 26, 05, 8F] +13A5; [7E 2A, 05, 05] -0565; [55 28, 05, 05] -0535; [55 28, 05, 8F] -0587; [55 28, 05, 09][55 62, 05, 09] +13A6; [7E 2C, 05, 05] -0566; [55 2A, 05, 05] -0536; [55 2A, 05, 8F] +13A7; [7E 2E, 05, 05] -0567; [55 2C, 05, 05] -0537; [55 2C, 05, 8F] +13A8; [7E 30, 05, 05] -0568; [55 2E, 05, 05] -0538; [55 2E, 05, 8F] +13A9; [7E 32, 05, 05] -0569; [55 30, 05, 05] -0539; [55 30, 05, 8F] +13AA; [7E 34, 05, 05] -056A; [55 32, 05, 05] -053A; [55 32, 05, 8F] +13AB; [7E 36, 05, 05] -056B; [55 34, 05, 05] -053B; [55 34, 05, 8F] +13AC; [7E 38, 05, 05] -056C; [55 36, 05, 05] -053C; [55 36, 05, 8F] +13AD; [7E 3A, 05, 05] -056D; [55 38, 05, 05] -053D; [55 38, 05, 8F] +13AE; [7E 3C, 05, 05] -056E; [55 3A, 05, 05] -053E; [55 3A, 05, 8F] +13AF; [7E 3E, 05, 05] -056F; [55 3C, 05, 05] -053F; [55 3C, 05, 8F] +13B0; [7E 40, 05, 05] -0570; [55 3E, 05, 05] -0540; [55 3E, 05, 8F] +13B1; [7E 42, 05, 05] -0571; [55 40, 05, 05] -0541; [55 40, 05, 8F] +13B2; [7E 44, 05, 05] -0572; [55 42, 05, 05] -0542; [55 42, 05, 8F] +13B3; [7E 46, 05, 05] -0573; [55 44, 05, 05] -0543; [55 44, 05, 8F] +13B4; [7E 48, 05, 05] -0574; [55 46, 05, 05] -0544; [55 46, 05, 8F] -FB14; [55 46, 05, 09][55 28, 05, 09] -FB15; [55 46, 05, 09][55 34, 05, 09] -FB17; [55 46, 05, 09][55 38, 05, 09] -FB13; [55 46, 05, 09][55 4A, 05, 09] +13B5; [7E 4A, 05, 05] -0575; [55 48, 05, 05] -0545; [55 48, 05, 8F] +13B6; [7E 4C, 05, 05] -0576; [55 4A, 05, 05] -0546; [55 4A, 05, 8F] +13B7; [7E 4E, 05, 05] -0577; [55 4C, 05, 05] -0547; [55 4C, 05, 8F] +13B8; [7E 50, 05, 05] -0578; [55 4E, 05, 05] -0548; [55 4E, 05, 8F] +13B9; [7E 52, 05, 05] -0579; [55 50, 05, 05] -0549; [55 50, 05, 8F] +13BA; [7E 54, 05, 05] -057A; [55 52, 05, 05] -054A; [55 52, 05, 8F] +13BB; [7E 56, 05, 05] -057B; [55 54, 05, 05] -054B; [55 54, 05, 8F] +13BC; [7E 58, 05, 05] -057C; [55 56, 05, 05] -054C; [55 56, 05, 8F] +13BD; [7E 5A, 05, 05] -057D; [55 58, 05, 05] -054D; [55 58, 05, 8F] +13BE; [7E 5C, 05, 05] -057E; [55 5A, 05, 05] -054E; [55 5A, 05, 8F] -FB16; [55 5A, 05, 09][55 4A, 05, 09] +13BF; [7E 5E, 05, 05] -057F; [55 5C, 05, 05] -054F; [55 5C, 05, 8F] +13C0; [7E 60, 05, 05] -0580; [55 5E, 05, 05] -0550; [55 5E, 05, 8F] +13C1; [7E 62, 05, 05] -0581; [55 60, 05, 05] -0551; [55 60, 05, 8F] +13C2; [7E 64, 05, 05] -0582; [55 62, 05, 05] -0552; [55 62, 05, 8F] +13C3; [7E 66, 05, 05] -0583; [55 64, 05, 05] -0553; [55 64, 05, 8F] +13C4; [7E 68, 05, 05] -0584; [55 66, 05, 05] -0554; [55 66, 05, 8F] +13C5; [7E 6A, 05, 05] -0585; [55 68, 05, 05] -0555; [55 68, 05, 8F] +13C6; [7E 6C, 05, 05] -0586; [55 6A, 05, 05] -0556; [55 6A, 05, 8F] +13C7; [7E 6E, 05, 05] -0559; [55 6C, 05, 05] +13C8; [7E 70, 05, 05] -05D0; [56 20, 05, 05] -2135; [56 20, 05, 09] -FB21; [56 20, 05, 0B] -FB2E; [56 20, 05, 05][, D3 A9, 05] -FB2F; [56 20, 05, 05][, D3 B9, 05] -FB30; [56 20, 05, 05][, D3 E9, 05] -FB4F; [56 20, 05, 09][56 36, 05, 09] +13C9; [7E 72, 05, 05] -05D1; [56 22, 05, 05] -2136; [56 22, 05, 09] -FB31; [56 22, 05, 05][, D3 E9, 05] -FB4C; [56 22, 05, 05][, D3 F9, 05] +13CA; [7E 74, 05, 05] -05D2; [56 24, 05, 05] -2137; [56 24, 05, 09] -FB32; [56 24, 05, 05][, D3 E9, 05] +13CB; [7E 76, 05, 05] -05D3; [56 26, 05, 05] -2138; [56 26, 05, 09] -FB22; [56 26, 05, 0B] -FB33; [56 26, 05, 05][, D3 E9, 05] +13CC; [7E 78, 05, 05] -05D4; [56 28, 05, 05] -FB23; [56 28, 05, 0B] -FB34; [56 28, 05, 05][, D3 E9, 05] +13CD; [7E 7A, 05, 05] -05D5; [56 2A, 05, 05] -FB4B; [56 2A, 05, 05][, D3 C9, 05] -FB35; [56 2A, 05, 05][, D3 E9, 05] -05F0; [56 2A, 05, 09][56 2A, 05, 09] -05F1; [56 2A, 05, 09][56 32, 05, 09] +13CE; [7E 7C, 05, 05] -05D6; [56 2C, 05, 05] -FB36; [56 2C, 05, 05][, D3 E9, 05] +13CF; [7E 7E, 05, 05] -05D7; [56 2E, 05, 05] +13D0; [7E 80, 05, 05] -05D8; [56 30, 05, 05] -FB38; [56 30, 05, 05][, D3 E9, 05] +13D1; [7E 82, 05, 05] -05D9; [56 32, 05, 05] -FB1D; [56 32, 05, 05][, D3 79, 05] -FB39; [56 32, 05, 05][, D3 E9, 05] -05F2; [56 32, 05, 09][56 32, 05, 09] -FB1F; [56 32, 05, 09][56 32, 05, 09][, D3 A9, 05] - -05DB; [56 34, 05, 05] -FB24; [56 34, 05, 0B] -05DA; [56 34, 05, 31] -FB3B; [56 34, 05, 05][, D3 E9, 05] -FB3A; [56 34, 05, 31][, D3 E9, 05] -FB4D; [56 34, 05, 05][, D3 F9, 05] - -05DC; [56 36, 05, 05] -FB25; [56 36, 05, 0B] -FB3C; [56 36, 05, 05][, D3 E9, 05] - -05DE; [56 38, 05, 05] -FB26; [56 38, 05, 0B] -05DD; [56 38, 05, 31] -FB3E; [56 38, 05, 05][, D3 E9, 05] - -05E0; [56 3A, 05, 05] -05DF; [56 3A, 05, 31] -FB40; [56 3A, 05, 05][, D3 E9, 05] - -05E1; [56 3C, 05, 05] -FB41; [56 3C, 05, 05][, D3 E9, 05] - -05E2; [56 3E, 05, 05] -FB20; [56 3E, 05, 0B] - -05E4; [56 40, 05, 05] -05E3; [56 40, 05, 31] -FB44; [56 40, 05, 05][, D3 E9, 05] -FB43; [56 40, 05, 31][, D3 E9, 05] -FB4E; [56 40, 05, 05][, D3 F9, 05] - -05E6; [56 42, 05, 05] -05E5; [56 42, 05, 31] -FB46; [56 42, 05, 05][, D3 E9, 05] - -05E7; [56 44, 05, 05] -FB47; [56 44, 05, 05][, D3 E9, 05] - -05E8; [56 46, 05, 05] -FB27; [56 46, 05, 0B] -FB48; [56 46, 05, 05][, D3 E9, 05] - -05E9; [56 48, 05, 05] -FB49; [56 48, 05, 05][, D3 E9, 05] -FB2C; [56 48, 05, 05][, D3 E9, 05][, D4 0D, 05] -FB2D; [56 48, 05, 05][, D3 E9, 05][, D4 1D, 05] -FB2A; [56 48, 05, 05][, D4 0D, 05] -FB2B; [56 48, 05, 05][, D4 1D, 05] - -05EA; [56 4A, 05, 05] -FB28; [56 4A, 05, 0B] -FB4A; [56 4A, 05, 05][, D3 E9, 05] - -0621; [57 20, 05, 05] -0674; [57 20, 05, 05] -FE80; [57 20, 05, 33] -06FD; [57 20, 05, 09][, DF 79, 09] - -0622; [57 22, 05, 05] -0627 0653; [57 22, 05, 05] -FE82; [57 22, 05, 31] -FE81; [57 22, 05, 33] - -0623; [57 24, 05, 05] -0627 0654; [57 24, 05, 05] -FE84; [57 24, 05, 31] -FE83; [57 24, 05, 33] - -0672; [57 26, 05, 05] - -0671; [57 28, 05, 05] -FB51; [57 28, 05, 31] -FB50; [57 28, 05, 33] - -0624; [57 2A, 05, 05] -0648 0654; [57 2A, 05, 05] -FE86; [57 2A, 05, 31] -FE85; [57 2A, 05, 33] - -0625; [57 2C, 05, 05] -0627 0655; [57 2C, 05, 05] -FE88; [57 2C, 05, 31] -FE87; [57 2C, 05, 33] - -0673; [57 2E, 05, 05] - -0626; [57 30, 05, 05] -064A 0654; [57 30, 05, 05] -FE8B; [57 30, 05, 2D] -FE8C; [57 30, 05, 2F] -FE8A; [57 30, 05, 31] -FE89; [57 30, 05, 33] -FBEB; [57 30, 05, 31][57 32, 05, 31] -FBEA; [57 30, 05, 33][57 32, 05, 33] -FC97; [57 30, 05, 2D][57 4C, 05, 2D] -FC00; [57 30, 05, 33][57 4C, 05, 33] -FC98; [57 30, 05, 2D][57 58, 05, 2D] -FC01; [57 30, 05, 33][57 58, 05, 33] -FC99; [57 30, 05, 2D][57 5A, 05, 2D] -FC64; [57 30, 05, 31][57 78, 05, 31] -FC65; [57 30, 05, 31][57 7A, 05, 31] -FC9A; [57 30, 05, 2D][57 EA, 05, 2D] -FCDF; [57 30, 05, 2F][57 EA, 05, 2F] -FC66; [57 30, 05, 31][57 EA, 05, 31] -FC02; [57 30, 05, 33][57 EA, 05, 33] -FC67; [57 30, 05, 31][57 EC, 05, 31] -FC9B; [57 30, 05, 2D][57 F8, 05, 2D] -FCE0; [57 30, 05, 2F][57 F8, 05, 2F] -FBED; [57 30, 05, 31][58 05, 05, 31] -FBEC; [57 30, 05, 33][58 05, 05, 33] -FBEF; [57 30, 05, 31][58 07, 05, 31] -FBEE; [57 30, 05, 33][58 07, 05, 33] -FBF3; [57 30, 05, 31][58 0D, 05, 31] -FBF2; [57 30, 05, 33][58 0D, 05, 33] -FBF1; [57 30, 05, 31][58 0F, 05, 31] -FBF0; [57 30, 05, 33][58 0F, 05, 33] -FBF5; [57 30, 05, 31][58 11, 05, 31] -FBF4; [57 30, 05, 33][58 11, 05, 33] -FBFB; [57 30, 05, 2D][58 1B, 05, 2D] -FBFA; [57 30, 05, 31][58 1B, 05, 31] -FC68; [57 30, 05, 31][58 1B, 05, 31] -FBF9; [57 30, 05, 33][58 1B, 05, 33] -FC03; [57 30, 05, 33][58 1B, 05, 33] -FC69; [57 30, 05, 31][58 1D, 05, 31] -FC04; [57 30, 05, 33][58 1D, 05, 33] -FBF8; [57 30, 05, 2D][58 25, 05, 2D] -FBF7; [57 30, 05, 31][58 25, 05, 31] -FBF6; [57 30, 05, 33][58 25, 05, 33] - -0627; [57 32, 05, 05] -FE8E; [57 32, 05, 31] -FE8D; [57 32, 05, 33] -FD3C; [57 32, 05, 31][, D4 3D, 31] -FD3D; [57 32, 05, 33][, D4 3D, 33] -0675; [57 32, 05, 09][57 20, 05, 09] -FDF3; [57 32, 05, 33][57 C6, 05, 33][57 34, 05, 3D][57 78, 05, 3D] -FDF2; [57 32, 05, 33][57 E0, 05, 33][57 E0, 05, 3D][57 F8, 05, 3D] - -0628; [57 34, 05, 05] -FE91; [57 34, 05, 2D] -FE92; [57 34, 05, 2F] -FE90; [57 34, 05, 31] -FE8F; [57 34, 05, 33] -FC9C; [57 34, 05, 2D][57 4C, 05, 2D] -FC05; [57 34, 05, 33][57 4C, 05, 33] -FC9D; [57 34, 05, 2D][57 58, 05, 2D] -FC06; [57 34, 05, 33][57 58, 05, 33] -FDC2; [57 34, 05, 31][57 58, 05, 31][58 1D, 05, 3D] -FC9E; [57 34, 05, 2D][57 5A, 05, 2D] -FC07; [57 34, 05, 33][57 5A, 05, 33] -FD9E; [57 34, 05, 31][57 5A, 05, 31][58 1D, 05, 3D] -FC6A; [57 34, 05, 31][57 78, 05, 31] -FC6B; [57 34, 05, 31][57 7A, 05, 31] -FC9F; [57 34, 05, 2D][57 EA, 05, 2D] -FCE1; [57 34, 05, 2F][57 EA, 05, 2F] -FC6C; [57 34, 05, 31][57 EA, 05, 31] -FC08; [57 34, 05, 33][57 EA, 05, 33] -FC6D; [57 34, 05, 31][57 EC, 05, 31] -FCA0; [57 34, 05, 2D][57 F8, 05, 2D] -FCE2; [57 34, 05, 2F][57 F8, 05, 2F] -FC6E; [57 34, 05, 31][58 1B, 05, 31] -FC09; [57 34, 05, 33][58 1B, 05, 33] -FC6F; [57 34, 05, 31][58 1D, 05, 31] -FC0A; [57 34, 05, 33][58 1D, 05, 33] - -067B; [57 36, 05, 05] -FB54; [57 36, 05, 2D] -FB55; [57 36, 05, 2F] -FB53; [57 36, 05, 31] -FB52; [57 36, 05, 33] - -067E; [57 38, 05, 05] -FB58; [57 38, 05, 2D] -FB59; [57 38, 05, 2F] -FB57; [57 38, 05, 31] -FB56; [57 38, 05, 33] - -0680; [57 3A, 05, 05] -FB5C; [57 3A, 05, 2D] -FB5D; [57 3A, 05, 2F] -FB5B; [57 3A, 05, 31] -FB5A; [57 3A, 05, 33] - -0629; [57 3C, 05, 05] -FE94; [57 3C, 05, 31] -FE93; [57 3C, 05, 33] - -062A; [57 3E, 05, 05] -FE97; [57 3E, 05, 2D] -FE98; [57 3E, 05, 2F] -FE96; [57 3E, 05, 31] -FE95; [57 3E, 05, 33] -FCA1; [57 3E, 05, 2D][57 4C, 05, 2D] -FC0B; [57 3E, 05, 33][57 4C, 05, 33] -FD50; [57 3E, 05, 2D][57 4C, 05, 2D][57 EA, 05, 3D] -FDA0; [57 3E, 05, 31][57 4C, 05, 31][58 1B, 05, 3D] -FD9F; [57 3E, 05, 31][57 4C, 05, 31][58 1D, 05, 3D] -FCA2; [57 3E, 05, 2D][57 58, 05, 2D] -FC0C; [57 3E, 05, 33][57 58, 05, 33] -FD52; [57 3E, 05, 2D][57 58, 05, 2D][57 4C, 05, 3D] -FD51; [57 3E, 05, 31][57 58, 05, 31][57 4C, 05, 3D] -FD53; [57 3E, 05, 2D][57 58, 05, 2D][57 EA, 05, 3D] -FCA3; [57 3E, 05, 2D][57 5A, 05, 2D] -FC0D; [57 3E, 05, 33][57 5A, 05, 33] -FD54; [57 3E, 05, 2D][57 5A, 05, 2D][57 EA, 05, 3D] -FDA2; [57 3E, 05, 31][57 5A, 05, 31][58 1B, 05, 3D] -FDA1; [57 3E, 05, 31][57 5A, 05, 31][58 1D, 05, 3D] -FC70; [57 3E, 05, 31][57 78, 05, 31] -FC71; [57 3E, 05, 31][57 7A, 05, 31] -FCA4; [57 3E, 05, 2D][57 EA, 05, 2D] -FCE3; [57 3E, 05, 2F][57 EA, 05, 2F] -FC72; [57 3E, 05, 31][57 EA, 05, 31] -FC0E; [57 3E, 05, 33][57 EA, 05, 33] -FD55; [57 3E, 05, 2D][57 EA, 05, 2D][57 4C, 05, 3D] -FD56; [57 3E, 05, 2D][57 EA, 05, 2D][57 58, 05, 3D] -FD57; [57 3E, 05, 2D][57 EA, 05, 2D][57 5A, 05, 3D] -FDA4; [57 3E, 05, 31][57 EA, 05, 31][58 1B, 05, 3D] -FDA3; [57 3E, 05, 31][57 EA, 05, 31][58 1D, 05, 3D] -FC73; [57 3E, 05, 31][57 EC, 05, 31] -FCA5; [57 3E, 05, 2D][57 F8, 05, 2D] -FCE4; [57 3E, 05, 2F][57 F8, 05, 2F] -FC74; [57 3E, 05, 31][58 1B, 05, 31] -FC0F; [57 3E, 05, 33][58 1B, 05, 33] -FC75; [57 3E, 05, 31][58 1D, 05, 31] -FC10; [57 3E, 05, 33][58 1D, 05, 33] - -062B; [57 40, 05, 05] -FE9B; [57 40, 05, 2D] -FE9C; [57 40, 05, 2F] -FE9A; [57 40, 05, 31] -FE99; [57 40, 05, 33] -FC11; [57 40, 05, 33][57 4C, 05, 33] -FC76; [57 40, 05, 31][57 78, 05, 31] -FC77; [57 40, 05, 31][57 7A, 05, 31] -FCA6; [57 40, 05, 2D][57 EA, 05, 2D] -FCE5; [57 40, 05, 2F][57 EA, 05, 2F] -FC78; [57 40, 05, 31][57 EA, 05, 31] -FC12; [57 40, 05, 33][57 EA, 05, 33] -FC79; [57 40, 05, 31][57 EC, 05, 31] -FCE6; [57 40, 05, 2F][57 F8, 05, 2F] -FC7A; [57 40, 05, 31][58 1B, 05, 31] -FC13; [57 40, 05, 33][58 1B, 05, 33] -FC7B; [57 40, 05, 31][58 1D, 05, 31] -FC14; [57 40, 05, 33][58 1D, 05, 33] - -0679; [57 42, 05, 05] -FB68; [57 42, 05, 2D] -FB69; [57 42, 05, 2F] -FB67; [57 42, 05, 31] -FB66; [57 42, 05, 33] - -067A; [57 44, 05, 05] -FB60; [57 44, 05, 2D] -FB61; [57 44, 05, 2F] -FB5F; [57 44, 05, 31] -FB5E; [57 44, 05, 33] - -067C; [57 46, 05, 05] - -067D; [57 48, 05, 05] - -067F; [57 4A, 05, 05] -FB64; [57 4A, 05, 2D] -FB65; [57 4A, 05, 2F] -FB63; [57 4A, 05, 31] -FB62; [57 4A, 05, 33] - -062C; [57 4C, 05, 05] -FE9F; [57 4C, 05, 2D] -FEA0; [57 4C, 05, 2F] -FE9E; [57 4C, 05, 31] -FE9D; [57 4C, 05, 33] -FCA7; [57 4C, 05, 2D][57 58, 05, 2D] -FC15; [57 4C, 05, 33][57 58, 05, 33] -FDA6; [57 4C, 05, 31][57 58, 05, 31][58 1B, 05, 3D] -FDBE; [57 4C, 05, 31][57 58, 05, 31][58 1D, 05, 3D] -FDFB; [57 4C, 05, 33][57 E0, 05, 33][06, 05, 3D][57 4C, 05, 3D][57 E0, 05, 3D][57 32, 05, 3D][57 E0, 05, 3D][57 F8, 05, 3D] -FCA8; [57 4C, 05, 2D][57 EA, 05, 2D] -FC16; [57 4C, 05, 33][57 EA, 05, 33] -FD59; [57 4C, 05, 2D][57 EA, 05, 2D][57 58, 05, 3D] -FD58; [57 4C, 05, 31][57 EA, 05, 31][57 58, 05, 3D] -FDA7; [57 4C, 05, 31][57 EA, 05, 31][58 1B, 05, 3D] -FDA5; [57 4C, 05, 31][57 EA, 05, 31][58 1D, 05, 3D] -FD1D; [57 4C, 05, 31][58 1B, 05, 31] -FD01; [57 4C, 05, 33][58 1B, 05, 33] -FD1E; [57 4C, 05, 31][58 1D, 05, 31] -FD02; [57 4C, 05, 33][58 1D, 05, 33] - -0683; [57 4E, 05, 05] -FB78; [57 4E, 05, 2D] -FB79; [57 4E, 05, 2F] -FB77; [57 4E, 05, 31] -FB76; [57 4E, 05, 33] - -0684; [57 50, 05, 05] -FB74; [57 50, 05, 2D] -FB75; [57 50, 05, 2F] -FB73; [57 50, 05, 31] -FB72; [57 50, 05, 33] - -0686; [57 52, 05, 05] -FB7C; [57 52, 05, 2D] -FB7D; [57 52, 05, 2F] -FB7B; [57 52, 05, 31] -FB7A; [57 52, 05, 33] - -06BF; [57 54, 05, 05] - -0687; [57 56, 05, 05] -FB80; [57 56, 05, 2D] -FB81; [57 56, 05, 2F] -FB7F; [57 56, 05, 31] -FB7E; [57 56, 05, 33] - -062D; [57 58, 05, 05] -FEA3; [57 58, 05, 2D] -FEA4; [57 58, 05, 2F] -FEA2; [57 58, 05, 31] -FEA1; [57 58, 05, 33] -FCA9; [57 58, 05, 2D][57 4C, 05, 2D] -FC17; [57 58, 05, 33][57 4C, 05, 33] -FDBF; [57 58, 05, 31][57 4C, 05, 31][58 1D, 05, 3D] -FCAA; [57 58, 05, 2D][57 EA, 05, 2D] -FC18; [57 58, 05, 33][57 EA, 05, 33] -FD5B; [57 58, 05, 31][57 EA, 05, 31][58 1B, 05, 3D] -FD5A; [57 58, 05, 31][57 EA, 05, 31][58 1D, 05, 3D] -FD1B; [57 58, 05, 31][58 1B, 05, 31] -FCFF; [57 58, 05, 33][58 1B, 05, 33] -FD1C; [57 58, 05, 31][58 1D, 05, 31] -FD00; [57 58, 05, 33][58 1D, 05, 33] - -062E; [57 5A, 05, 05] -FEA7; [57 5A, 05, 2D] -FEA8; [57 5A, 05, 2F] -FEA6; [57 5A, 05, 31] -FEA5; [57 5A, 05, 33] -FCAB; [57 5A, 05, 2D][57 4C, 05, 2D] -FC19; [57 5A, 05, 33][57 4C, 05, 33] -FC1A; [57 5A, 05, 33][57 58, 05, 33] -FCAC; [57 5A, 05, 2D][57 EA, 05, 2D] -FC1B; [57 5A, 05, 33][57 EA, 05, 33] -FD1F; [57 5A, 05, 31][58 1B, 05, 31] -FD03; [57 5A, 05, 33][58 1B, 05, 33] -FD20; [57 5A, 05, 31][58 1D, 05, 31] -FD04; [57 5A, 05, 33][58 1D, 05, 33] - -0681; [57 5C, 05, 05] - -0682; [57 5E, 05, 05] - -0685; [57 60, 05, 05] - -062F; [57 62, 05, 05] -FEAA; [57 62, 05, 31] -FEA9; [57 62, 05, 33] - -0630; [57 64, 05, 05] -FEAC; [57 64, 05, 31] -FEAB; [57 64, 05, 33] -FC5B; [57 64, 05, 33][, D4 ED, 33] - -0688; [57 66, 05, 05] -FB89; [57 66, 05, 31] -FB88; [57 66, 05, 33] - -0689; [57 68, 05, 05] - -068A; [57 6A, 05, 05] - -068B; [57 6C, 05, 05] - -068C; [57 6E, 05, 05] -FB85; [57 6E, 05, 31] -FB84; [57 6E, 05, 33] - -068D; [57 70, 05, 05] -FB83; [57 70, 05, 31] -FB82; [57 70, 05, 33] - -068E; [57 72, 05, 05] -FB87; [57 72, 05, 31] -FB86; [57 72, 05, 33] - -068F; [57 74, 05, 05] - -0690; [57 76, 05, 05] - -0631; [57 78, 05, 05] -FEAE; [57 78, 05, 31] -FEAD; [57 78, 05, 33] -FC5C; [57 78, 05, 33][, D4 ED, 33] -FDF6; [57 78, 05, 33][57 8E, 05, 33][58 07, 05, 3D][57 E0, 05, 3D] - -0632; [57 7A, 05, 05] -FEB0; [57 7A, 05, 31] -FEAF; [57 7A, 05, 33] - -0691; [57 7C, 05, 05] -FB8D; [57 7C, 05, 31] -FB8C; [57 7C, 05, 33] - -0692; [57 7E, 05, 05] - -0693; [57 80, 05, 05] - -0694; [57 82, 05, 05] - -0695; [57 84, 05, 05] - -0696; [57 86, 05, 05] - -0697; [57 88, 05, 05] - -0698; [57 8A, 05, 05] -FB8B; [57 8A, 05, 31] -FB8A; [57 8A, 05, 33] - -0699; [57 8C, 05, 05] - -0633; [57 8E, 05, 05] -FEB3; [57 8E, 05, 2D] -FEB4; [57 8E, 05, 2F] -FEB2; [57 8E, 05, 31] -FEB1; [57 8E, 05, 33] -FCAD; [57 8E, 05, 2D][57 4C, 05, 2D] -FD34; [57 8E, 05, 2F][57 4C, 05, 2F] -FC1C; [57 8E, 05, 33][57 4C, 05, 33] -FD5D; [57 8E, 05, 2D][57 4C, 05, 2D][57 58, 05, 3D] -FD5E; [57 8E, 05, 31][57 4C, 05, 31][58 1B, 05, 3D] -FCAE; [57 8E, 05, 2D][57 58, 05, 2D] -FD35; [57 8E, 05, 2F][57 58, 05, 2F] -FC1D; [57 8E, 05, 33][57 58, 05, 33] -FD5C; [57 8E, 05, 2D][57 58, 05, 2D][57 4C, 05, 3D] -FCAF; [57 8E, 05, 2D][57 5A, 05, 2D] -FD36; [57 8E, 05, 2F][57 5A, 05, 2F] -FC1E; [57 8E, 05, 33][57 5A, 05, 33] -FDA8; [57 8E, 05, 31][57 5A, 05, 31][58 1B, 05, 3D] -FDC6; [57 8E, 05, 31][57 5A, 05, 31][58 1D, 05, 3D] -FD2A; [57 8E, 05, 31][57 78, 05, 31] -FD0E; [57 8E, 05, 33][57 78, 05, 33] -FCB0; [57 8E, 05, 2D][57 EA, 05, 2D] -FCE7; [57 8E, 05, 2F][57 EA, 05, 2F] -FC1F; [57 8E, 05, 33][57 EA, 05, 33] -FD61; [57 8E, 05, 2D][57 EA, 05, 2D][57 4C, 05, 3D] -FD60; [57 8E, 05, 2D][57 EA, 05, 2D][57 58, 05, 3D] -FD5F; [57 8E, 05, 31][57 EA, 05, 31][57 58, 05, 3D] -FD63; [57 8E, 05, 2D][57 EA, 05, 2D][57 EA, 05, 3D] -FD62; [57 8E, 05, 31][57 EA, 05, 31][57 EA, 05, 3D] -FD31; [57 8E, 05, 2D][57 F8, 05, 2D] -FCE8; [57 8E, 05, 2F][57 F8, 05, 2F] -FD17; [57 8E, 05, 31][58 1B, 05, 31] -FCFB; [57 8E, 05, 33][58 1B, 05, 33] -FD18; [57 8E, 05, 31][58 1D, 05, 31] -FCFC; [57 8E, 05, 33][58 1D, 05, 33] - -0634; [57 90, 05, 05] -FEB7; [57 90, 05, 2D] -FEB8; [57 90, 05, 2F] -FEB6; [57 90, 05, 31] -FEB5; [57 90, 05, 33] -FD2D; [57 90, 05, 2D][57 4C, 05, 2D] -FD37; [57 90, 05, 2F][57 4C, 05, 2F] -FD25; [57 90, 05, 31][57 4C, 05, 31] -FD09; [57 90, 05, 33][57 4C, 05, 33] -FD69; [57 90, 05, 31][57 4C, 05, 31][58 1D, 05, 3D] -FD2E; [57 90, 05, 2D][57 58, 05, 2D] -FD38; [57 90, 05, 2F][57 58, 05, 2F] -FD26; [57 90, 05, 31][57 58, 05, 31] -FD0A; [57 90, 05, 33][57 58, 05, 33] -FD68; [57 90, 05, 2D][57 58, 05, 2D][57 EA, 05, 3D] -FD67; [57 90, 05, 31][57 58, 05, 31][57 EA, 05, 3D] -FDAA; [57 90, 05, 31][57 58, 05, 31][58 1D, 05, 3D] -FD2F; [57 90, 05, 2D][57 5A, 05, 2D] -FD39; [57 90, 05, 2F][57 5A, 05, 2F] -FD27; [57 90, 05, 31][57 5A, 05, 31] -FD0B; [57 90, 05, 33][57 5A, 05, 33] -FD29; [57 90, 05, 31][57 78, 05, 31] -FD0D; [57 90, 05, 33][57 78, 05, 33] -FD30; [57 90, 05, 2D][57 EA, 05, 2D] -FCE9; [57 90, 05, 2F][57 EA, 05, 2F] -FD28; [57 90, 05, 31][57 EA, 05, 31] -FD0C; [57 90, 05, 33][57 EA, 05, 33] -FD6B; [57 90, 05, 2D][57 EA, 05, 2D][57 5A, 05, 3D] -FD6A; [57 90, 05, 31][57 EA, 05, 31][57 5A, 05, 3D] -FD6D; [57 90, 05, 2D][57 EA, 05, 2D][57 EA, 05, 3D] -FD6C; [57 90, 05, 31][57 EA, 05, 31][57 EA, 05, 3D] -FD32; [57 90, 05, 2D][57 F8, 05, 2D] -FCEA; [57 90, 05, 2F][57 F8, 05, 2F] -FD19; [57 90, 05, 31][58 1B, 05, 31] -FCFD; [57 90, 05, 33][58 1B, 05, 33] -FD1A; [57 90, 05, 31][58 1D, 05, 31] -FCFE; [57 90, 05, 33][58 1D, 05, 33] - -069A; [57 92, 05, 05] - -069B; [57 94, 05, 05] - -069C; [57 96, 05, 05] - -06FA; [57 98, 05, 05] - -0635; [57 9A, 05, 05] -FEBB; [57 9A, 05, 2D] -FEBC; [57 9A, 05, 2F] -FEBA; [57 9A, 05, 31] -FEB9; [57 9A, 05, 33] -FCB1; [57 9A, 05, 2D][57 58, 05, 2D] -FC20; [57 9A, 05, 33][57 58, 05, 33] -FD65; [57 9A, 05, 2D][57 58, 05, 2D][57 58, 05, 3D] -FD64; [57 9A, 05, 31][57 58, 05, 31][57 58, 05, 3D] -FDA9; [57 9A, 05, 31][57 58, 05, 31][58 1D, 05, 3D] -FCB2; [57 9A, 05, 2D][57 5A, 05, 2D] -FD2B; [57 9A, 05, 31][57 78, 05, 31] -FD0F; [57 9A, 05, 33][57 78, 05, 33] -FDF5; [57 9A, 05, 33][57 E0, 05, 33][57 AA, 05, 3D][57 EA, 05, 3D] -FDF9; [57 9A, 05, 33][57 E0, 05, 33][58 1B, 05, 3D] -FDFA; [57 9A, 05, 33][57 E0, 05, 33][58 1B, 05, 3D][06, 05, 3D][57 32, 05, 3D][57 E0, 05, 3D][57 E0, 05, 3D][57 F8, 05, 3D][06, 05, 3D][57 AA, 05, 3D][57 E0, 05, 3D][58 1D, 05, 3D][57 F8, 05, 3D][06, 05, 3D][58 07, 05, 3D][57 8E, 05, 3D][57 E0, 05, 3D][57 EA, 05, 3D] -FDF0; [57 9A, 05, 33][57 E0, 05, 33][58 29, 05, 3D] -FCB3; [57 9A, 05, 2D][57 EA, 05, 2D] -FC21; [57 9A, 05, 33][57 EA, 05, 33] -FDC5; [57 9A, 05, 2D][57 EA, 05, 2D][57 EA, 05, 3D] -FD66; [57 9A, 05, 31][57 EA, 05, 31][57 EA, 05, 3D] -FD21; [57 9A, 05, 31][58 1B, 05, 31] -FD05; [57 9A, 05, 33][58 1B, 05, 33] -FD22; [57 9A, 05, 31][58 1D, 05, 31] -FD06; [57 9A, 05, 33][58 1D, 05, 33] - -0636; [57 9C, 05, 05] -FEBF; [57 9C, 05, 2D] -FEC0; [57 9C, 05, 2F] -FEBE; [57 9C, 05, 31] -FEBD; [57 9C, 05, 33] -FCB4; [57 9C, 05, 2D][57 4C, 05, 2D] -FC22; [57 9C, 05, 33][57 4C, 05, 33] -FCB5; [57 9C, 05, 2D][57 58, 05, 2D] -FC23; [57 9C, 05, 33][57 58, 05, 33] -FD6E; [57 9C, 05, 31][57 58, 05, 31][58 1B, 05, 3D] -FDAB; [57 9C, 05, 31][57 58, 05, 31][58 1D, 05, 3D] -FCB6; [57 9C, 05, 2D][57 5A, 05, 2D] -FC24; [57 9C, 05, 33][57 5A, 05, 33] -FD70; [57 9C, 05, 2D][57 5A, 05, 2D][57 EA, 05, 3D] -FD6F; [57 9C, 05, 31][57 5A, 05, 31][57 EA, 05, 3D] -FD2C; [57 9C, 05, 31][57 78, 05, 31] -FD10; [57 9C, 05, 33][57 78, 05, 33] -FCB7; [57 9C, 05, 2D][57 EA, 05, 2D] -FC25; [57 9C, 05, 33][57 EA, 05, 33] -FD23; [57 9C, 05, 31][58 1B, 05, 31] -FD07; [57 9C, 05, 33][58 1B, 05, 33] -FD24; [57 9C, 05, 31][58 1D, 05, 31] -FD08; [57 9C, 05, 33][58 1D, 05, 33] - -069D; [57 9E, 05, 05] - -069E; [57 A0, 05, 05] - -06FB; [57 A2, 05, 05] - -0637; [57 A4, 05, 05] -FEC3; [57 A4, 05, 2D] -FEC4; [57 A4, 05, 2F] -FEC2; [57 A4, 05, 31] -FEC1; [57 A4, 05, 33] -FCB8; [57 A4, 05, 2D][57 58, 05, 2D] -FC26; [57 A4, 05, 33][57 58, 05, 33] -FD33; [57 A4, 05, 2D][57 EA, 05, 2D] -FD3A; [57 A4, 05, 2F][57 EA, 05, 2F] -FC27; [57 A4, 05, 33][57 EA, 05, 33] -FD72; [57 A4, 05, 2D][57 EA, 05, 2D][57 58, 05, 3D] -FD71; [57 A4, 05, 31][57 EA, 05, 31][57 58, 05, 3D] -FD73; [57 A4, 05, 2D][57 EA, 05, 2D][57 EA, 05, 3D] -FD74; [57 A4, 05, 31][57 EA, 05, 31][58 1D, 05, 3D] -FD11; [57 A4, 05, 31][58 1B, 05, 31] -FCF5; [57 A4, 05, 33][58 1B, 05, 33] -FD12; [57 A4, 05, 31][58 1D, 05, 31] -FCF6; [57 A4, 05, 33][58 1D, 05, 33] - -0638; [57 A6, 05, 05] -FEC7; [57 A6, 05, 2D] -FEC8; [57 A6, 05, 2F] -FEC6; [57 A6, 05, 31] -FEC5; [57 A6, 05, 33] -FCB9; [57 A6, 05, 2D][57 EA, 05, 2D] -FD3B; [57 A6, 05, 2F][57 EA, 05, 2F] -FC28; [57 A6, 05, 33][57 EA, 05, 33] - -069F; [57 A8, 05, 05] - -0639; [57 AA, 05, 05] -FECB; [57 AA, 05, 2D] -FECC; [57 AA, 05, 2F] -FECA; [57 AA, 05, 31] -FEC9; [57 AA, 05, 33] -FCBA; [57 AA, 05, 2D][57 4C, 05, 2D] -FC29; [57 AA, 05, 33][57 4C, 05, 33] -FDC4; [57 AA, 05, 2D][57 4C, 05, 2D][57 EA, 05, 3D] -FD75; [57 AA, 05, 31][57 4C, 05, 31][57 EA, 05, 3D] -FDF7; [57 AA, 05, 33][57 E0, 05, 33][58 1D, 05, 3D][57 F8, 05, 3D] -FCBB; [57 AA, 05, 2D][57 EA, 05, 2D] -FC2A; [57 AA, 05, 33][57 EA, 05, 33] -FD77; [57 AA, 05, 2D][57 EA, 05, 2D][57 EA, 05, 3D] -FD76; [57 AA, 05, 31][57 EA, 05, 31][57 EA, 05, 3D] -FD78; [57 AA, 05, 31][57 EA, 05, 31][58 1B, 05, 3D] -FDB6; [57 AA, 05, 31][57 EA, 05, 31][58 1D, 05, 3D] -FD13; [57 AA, 05, 31][58 1B, 05, 31] -FCF7; [57 AA, 05, 33][58 1B, 05, 33] -FD14; [57 AA, 05, 31][58 1D, 05, 31] -FCF8; [57 AA, 05, 33][58 1D, 05, 33] - -063A; [57 AC, 05, 05] -FECF; [57 AC, 05, 2D] -FED0; [57 AC, 05, 2F] -FECE; [57 AC, 05, 31] -FECD; [57 AC, 05, 33] -FCBC; [57 AC, 05, 2D][57 4C, 05, 2D] -FC2B; [57 AC, 05, 33][57 4C, 05, 33] -FCBD; [57 AC, 05, 2D][57 EA, 05, 2D] -FC2C; [57 AC, 05, 33][57 EA, 05, 33] -FD79; [57 AC, 05, 31][57 EA, 05, 31][57 EA, 05, 3D] -FD7B; [57 AC, 05, 31][57 EA, 05, 31][58 1B, 05, 3D] -FD7A; [57 AC, 05, 31][57 EA, 05, 31][58 1D, 05, 3D] -FD15; [57 AC, 05, 31][58 1B, 05, 31] -FCF9; [57 AC, 05, 33][58 1B, 05, 33] -FD16; [57 AC, 05, 31][58 1D, 05, 31] -FCFA; [57 AC, 05, 33][58 1D, 05, 33] - -06A0; [57 AE, 05, 05] - -06FC; [57 B0, 05, 05] - -0641; [57 B2, 05, 05] -FED3; [57 B2, 05, 2D] -FED4; [57 B2, 05, 2F] -FED2; [57 B2, 05, 31] -FED1; [57 B2, 05, 33] -FCBE; [57 B2, 05, 2D][57 4C, 05, 2D] -FC2D; [57 B2, 05, 33][57 4C, 05, 33] -FCBF; [57 B2, 05, 2D][57 58, 05, 2D] -FC2E; [57 B2, 05, 33][57 58, 05, 33] -FCC0; [57 B2, 05, 2D][57 5A, 05, 2D] -FC2F; [57 B2, 05, 33][57 5A, 05, 33] -FD7D; [57 B2, 05, 2D][57 5A, 05, 2D][57 EA, 05, 3D] -FD7C; [57 B2, 05, 31][57 5A, 05, 31][57 EA, 05, 3D] -FCC1; [57 B2, 05, 2D][57 EA, 05, 2D] -FC30; [57 B2, 05, 33][57 EA, 05, 33] -FDC1; [57 B2, 05, 31][57 EA, 05, 31][58 1D, 05, 3D] -FC7C; [57 B2, 05, 31][58 1B, 05, 31] -FC31; [57 B2, 05, 33][58 1B, 05, 33] -FC7D; [57 B2, 05, 31][58 1D, 05, 31] -FC32; [57 B2, 05, 33][58 1D, 05, 33] - -06A1; [57 B4, 05, 05] - -06A2; [57 B6, 05, 05] - -06A3; [57 B8, 05, 05] - -06A4; [57 BA, 05, 05] -FB6C; [57 BA, 05, 2D] -FB6D; [57 BA, 05, 2F] -FB6B; [57 BA, 05, 31] -FB6A; [57 BA, 05, 33] - -06A5; [57 BC, 05, 05] - -06A6; [57 BE, 05, 05] -FB70; [57 BE, 05, 2D] -FB71; [57 BE, 05, 2F] -FB6F; [57 BE, 05, 31] -FB6E; [57 BE, 05, 33] - -0642; [57 C0, 05, 05] -FED7; [57 C0, 05, 2D] -FED8; [57 C0, 05, 2F] -FED6; [57 C0, 05, 31] -FED5; [57 C0, 05, 33] -FCC2; [57 C0, 05, 2D][57 58, 05, 2D] -FC33; [57 C0, 05, 33][57 58, 05, 33] -FDF1; [57 C0, 05, 33][57 E0, 05, 33][58 29, 05, 3D] -FCC3; [57 C0, 05, 2D][57 EA, 05, 2D] -FC34; [57 C0, 05, 33][57 EA, 05, 33] -FDB4; [57 C0, 05, 2D][57 EA, 05, 2D][57 58, 05, 3D] -FD7E; [57 C0, 05, 31][57 EA, 05, 31][57 58, 05, 3D] -FD7F; [57 C0, 05, 31][57 EA, 05, 31][57 EA, 05, 3D] -FDB2; [57 C0, 05, 31][57 EA, 05, 31][58 1D, 05, 3D] -FC7E; [57 C0, 05, 31][58 1B, 05, 31] -FC35; [57 C0, 05, 33][58 1B, 05, 33] -FC7F; [57 C0, 05, 31][58 1D, 05, 31] -FC36; [57 C0, 05, 33][58 1D, 05, 33] - -06A7; [57 C2, 05, 05] - -06A8; [57 C4, 05, 05] - -0643; [57 C6, 05, 05] -FEDB; [57 C6, 05, 2D] -FEDC; [57 C6, 05, 2F] -FEDA; [57 C6, 05, 31] -FED9; [57 C6, 05, 33] -FC80; [57 C6, 05, 31][57 32, 05, 31] -FC37; [57 C6, 05, 33][57 32, 05, 33] -FCC4; [57 C6, 05, 2D][57 4C, 05, 2D] -FC38; [57 C6, 05, 33][57 4C, 05, 33] -FCC5; [57 C6, 05, 2D][57 58, 05, 2D] -FC39; [57 C6, 05, 33][57 58, 05, 33] -FCC6; [57 C6, 05, 2D][57 5A, 05, 2D] -FC3A; [57 C6, 05, 33][57 5A, 05, 33] -FCC7; [57 C6, 05, 2D][57 E0, 05, 2D] -FCEB; [57 C6, 05, 2F][57 E0, 05, 2F] -FC81; [57 C6, 05, 31][57 E0, 05, 31] -FC3B; [57 C6, 05, 33][57 E0, 05, 33] -FCC8; [57 C6, 05, 2D][57 EA, 05, 2D] -FCEC; [57 C6, 05, 2F][57 EA, 05, 2F] -FC82; [57 C6, 05, 31][57 EA, 05, 31] -FC3C; [57 C6, 05, 33][57 EA, 05, 33] -FDC3; [57 C6, 05, 2D][57 EA, 05, 2D][57 EA, 05, 3D] -FDBB; [57 C6, 05, 31][57 EA, 05, 31][57 EA, 05, 3D] -FDB7; [57 C6, 05, 31][57 EA, 05, 31][58 1D, 05, 3D] -FC83; [57 C6, 05, 31][58 1B, 05, 31] -FC3D; [57 C6, 05, 33][58 1B, 05, 33] -FC84; [57 C6, 05, 31][58 1D, 05, 31] -FC3E; [57 C6, 05, 33][58 1D, 05, 33] - -06A9; [57 C8, 05, 05] -FB90; [57 C8, 05, 2D] -FB91; [57 C8, 05, 2F] -FB8F; [57 C8, 05, 31] -FB8E; [57 C8, 05, 33] - -06AA; [57 CA, 05, 05] - -06AB; [57 CC, 05, 05] - -06AC; [57 CE, 05, 05] - -06AD; [57 D0, 05, 05] -FBD5; [57 D0, 05, 2D] -FBD6; [57 D0, 05, 2F] -FBD4; [57 D0, 05, 31] -FBD3; [57 D0, 05, 33] - -06AE; [57 D2, 05, 05] - -06AF; [57 D4, 05, 05] -FB94; [57 D4, 05, 2D] -FB95; [57 D4, 05, 2F] -FB93; [57 D4, 05, 31] -FB92; [57 D4, 05, 33] - -06B0; [57 D6, 05, 05] - -06B1; [57 D8, 05, 05] -FB9C; [57 D8, 05, 2D] -FB9D; [57 D8, 05, 2F] -FB9B; [57 D8, 05, 31] -FB9A; [57 D8, 05, 33] - -06B2; [57 DA, 05, 05] - -06B3; [57 DC, 05, 05] -FB98; [57 DC, 05, 2D] -FB99; [57 DC, 05, 2F] -FB97; [57 DC, 05, 31] -FB96; [57 DC, 05, 33] - -06B4; [57 DE, 05, 05] - -0644; [57 E0, 05, 05] -FEDF; [57 E0, 05, 2D] -FEE0; [57 E0, 05, 2F] -FEDE; [57 E0, 05, 31] -FEDD; [57 E0, 05, 33] -FEF6; [57 E0, 05, 31][57 22, 05, 31] -FEF5; [57 E0, 05, 33][57 22, 05, 33] -FEF8; [57 E0, 05, 31][57 24, 05, 31] -FEF7; [57 E0, 05, 33][57 24, 05, 33] -FEFA; [57 E0, 05, 31][57 2C, 05, 31] -FEF9; [57 E0, 05, 33][57 2C, 05, 33] -FEFC; [57 E0, 05, 31][57 32, 05, 31] -FEFB; [57 E0, 05, 33][57 32, 05, 33] -FCC9; [57 E0, 05, 2D][57 4C, 05, 2D] -FC3F; [57 E0, 05, 33][57 4C, 05, 33] -FD83; [57 E0, 05, 2D][57 4C, 05, 2D][57 4C, 05, 3D] -FD84; [57 E0, 05, 31][57 4C, 05, 31][57 4C, 05, 3D] -FDBA; [57 E0, 05, 2D][57 4C, 05, 2D][57 EA, 05, 3D] -FDBC; [57 E0, 05, 31][57 4C, 05, 31][57 EA, 05, 3D] -FDAC; [57 E0, 05, 31][57 4C, 05, 31][58 1D, 05, 3D] -FCCA; [57 E0, 05, 2D][57 58, 05, 2D] -FC40; [57 E0, 05, 33][57 58, 05, 33] -FDB5; [57 E0, 05, 2D][57 58, 05, 2D][57 EA, 05, 3D] -FD80; [57 E0, 05, 31][57 58, 05, 31][57 EA, 05, 3D] -FD82; [57 E0, 05, 31][57 58, 05, 31][58 1B, 05, 3D] -FD81; [57 E0, 05, 31][57 58, 05, 31][58 1D, 05, 3D] -FCCB; [57 E0, 05, 2D][57 5A, 05, 2D] -FC41; [57 E0, 05, 33][57 5A, 05, 33] -FD86; [57 E0, 05, 2D][57 5A, 05, 2D][57 EA, 05, 3D] -FD85; [57 E0, 05, 31][57 5A, 05, 31][57 EA, 05, 3D] -FCCC; [57 E0, 05, 2D][57 EA, 05, 2D] -FCED; [57 E0, 05, 2F][57 EA, 05, 2F] -FC85; [57 E0, 05, 31][57 EA, 05, 31] -FC42; [57 E0, 05, 33][57 EA, 05, 33] -FD88; [57 E0, 05, 2D][57 EA, 05, 2D][57 58, 05, 3D] -FD87; [57 E0, 05, 31][57 EA, 05, 31][57 58, 05, 3D] -FDAD; [57 E0, 05, 31][57 EA, 05, 31][58 1D, 05, 3D] -FCCD; [57 E0, 05, 2D][57 F8, 05, 2D] -FC86; [57 E0, 05, 31][58 1B, 05, 31] -FC43; [57 E0, 05, 33][58 1B, 05, 33] -FC87; [57 E0, 05, 31][58 1D, 05, 31] -FC44; [57 E0, 05, 33][58 1D, 05, 33] - -06B5; [57 E2, 05, 05] - -06B6; [57 E4, 05, 05] - -06B7; [57 E6, 05, 05] - -06B8; [57 E8, 05, 05] - -0645; [57 EA, 05, 05] -FEE3; [57 EA, 05, 2D] -FEE4; [57 EA, 05, 2F] -FEE2; [57 EA, 05, 31] -FEE1; [57 EA, 05, 33] -06FE; [57 EA, 05, 09][, DF 79, 09] -FC88; [57 EA, 05, 31][57 32, 05, 31] -FCCE; [57 EA, 05, 2D][57 4C, 05, 2D] -FC45; [57 EA, 05, 33][57 4C, 05, 33] -FD8C; [57 EA, 05, 2D][57 4C, 05, 2D][57 58, 05, 3D] -FD92; [57 EA, 05, 2D][57 4C, 05, 2D][57 5A, 05, 3D] -FD8D; [57 EA, 05, 2D][57 4C, 05, 2D][57 EA, 05, 3D] -FDC0; [57 EA, 05, 31][57 4C, 05, 31][58 1D, 05, 3D] -FCCF; [57 EA, 05, 2D][57 58, 05, 2D] -FC46; [57 EA, 05, 33][57 58, 05, 33] -FD89; [57 EA, 05, 2D][57 58, 05, 2D][57 4C, 05, 3D] -FD8A; [57 EA, 05, 2D][57 58, 05, 2D][57 EA, 05, 3D] -FDF4; [57 EA, 05, 33][57 58, 05, 33][57 EA, 05, 3D][57 62, 05, 3D] -FD8B; [57 EA, 05, 31][57 58, 05, 31][58 1D, 05, 3D] -FCD0; [57 EA, 05, 2D][57 5A, 05, 2D] -FC47; [57 EA, 05, 33][57 5A, 05, 33] -FD8E; [57 EA, 05, 2D][57 5A, 05, 2D][57 4C, 05, 3D] -FD8F; [57 EA, 05, 2D][57 5A, 05, 2D][57 EA, 05, 3D] -FDB9; [57 EA, 05, 31][57 5A, 05, 31][58 1D, 05, 3D] -FCD1; [57 EA, 05, 2D][57 EA, 05, 2D] -FC89; [57 EA, 05, 31][57 EA, 05, 31] -FC48; [57 EA, 05, 33][57 EA, 05, 33] -FDB1; [57 EA, 05, 31][57 EA, 05, 31][58 1D, 05, 3D] -FC49; [57 EA, 05, 33][58 1B, 05, 33] -FC4A; [57 EA, 05, 33][58 1D, 05, 33] - -0646; [57 EC, 05, 05] -FEE7; [57 EC, 05, 2D] -FEE8; [57 EC, 05, 2F] -FEE6; [57 EC, 05, 31] -FEE5; [57 EC, 05, 33] -FCD2; [57 EC, 05, 2D][57 4C, 05, 2D] -FC4B; [57 EC, 05, 33][57 4C, 05, 33] -FDB8; [57 EC, 05, 2D][57 4C, 05, 2D][57 58, 05, 3D] -FDBD; [57 EC, 05, 31][57 4C, 05, 31][57 58, 05, 3D] -FD98; [57 EC, 05, 2D][57 4C, 05, 2D][57 EA, 05, 3D] -FD97; [57 EC, 05, 31][57 4C, 05, 31][57 EA, 05, 3D] -FD99; [57 EC, 05, 31][57 4C, 05, 31][58 1B, 05, 3D] -FDC7; [57 EC, 05, 31][57 4C, 05, 31][58 1D, 05, 3D] -FCD3; [57 EC, 05, 2D][57 58, 05, 2D] -FC4C; [57 EC, 05, 33][57 58, 05, 33] -FD95; [57 EC, 05, 2D][57 58, 05, 2D][57 EA, 05, 3D] -FD96; [57 EC, 05, 31][57 58, 05, 31][58 1B, 05, 3D] -FDB3; [57 EC, 05, 31][57 58, 05, 31][58 1D, 05, 3D] -FCD4; [57 EC, 05, 2D][57 5A, 05, 2D] -FC4D; [57 EC, 05, 33][57 5A, 05, 33] -FC8A; [57 EC, 05, 31][57 78, 05, 31] -FC8B; [57 EC, 05, 31][57 7A, 05, 31] -FCD5; [57 EC, 05, 2D][57 EA, 05, 2D] -FCEE; [57 EC, 05, 2F][57 EA, 05, 2F] -FC8C; [57 EC, 05, 31][57 EA, 05, 31] -FC4E; [57 EC, 05, 33][57 EA, 05, 33] -FD9B; [57 EC, 05, 31][57 EA, 05, 31][58 1B, 05, 3D] -FD9A; [57 EC, 05, 31][57 EA, 05, 31][58 1D, 05, 3D] -FC8D; [57 EC, 05, 31][57 EC, 05, 31] -FCD6; [57 EC, 05, 2D][57 F8, 05, 2D] -FCEF; [57 EC, 05, 2F][57 F8, 05, 2F] -FC8E; [57 EC, 05, 31][58 1B, 05, 31] -FC4F; [57 EC, 05, 33][58 1B, 05, 33] -FC8F; [57 EC, 05, 31][58 1D, 05, 31] -FC50; [57 EC, 05, 33][58 1D, 05, 33] - -06BA; [57 EE, 05, 05] -FB9F; [57 EE, 05, 31] -FB9E; [57 EE, 05, 33] - -06BB; [57 F0, 05, 05] -FBA2; [57 F0, 05, 2D] -FBA3; [57 F0, 05, 2F] -FBA1; [57 F0, 05, 31] -FBA0; [57 F0, 05, 33] - -06BC; [57 F2, 05, 05] - -06BD; [57 F4, 05, 05] - -06B9; [57 F6, 05, 05] - -0647; [57 F8, 05, 05] -FEEB; [57 F8, 05, 2D] -FEEC; [57 F8, 05, 2F] -FEEA; [57 F8, 05, 31] -FEE9; [57 F8, 05, 33] -FCD9; [57 F8, 05, 2D][, D4 ED, 2D] -FCD7; [57 F8, 05, 2D][57 4C, 05, 2D] -FC51; [57 F8, 05, 33][57 4C, 05, 33] -FCD8; [57 F8, 05, 2D][57 EA, 05, 2D] -FC52; [57 F8, 05, 33][57 EA, 05, 33] -FD93; [57 F8, 05, 2D][57 EA, 05, 2D][57 4C, 05, 3D] -FD94; [57 F8, 05, 2D][57 EA, 05, 2D][57 EA, 05, 3D] -FC53; [57 F8, 05, 33][58 1B, 05, 33] -FC54; [57 F8, 05, 33][58 1D, 05, 33] - -06BE; [57 FA, 05, 05] -FBAC; [57 FA, 05, 2D] -FBAD; [57 FA, 05, 2F] -FBAB; [57 FA, 05, 31] -FBAA; [57 FA, 05, 33] - -06C1; [57 FC, 05, 05] -FBA8; [57 FC, 05, 2D] -FBA9; [57 FC, 05, 2F] -FBA7; [57 FC, 05, 31] -FBA6; [57 FC, 05, 33] -06C2; [57 FC, 05, 05][, D4 CD, 05] - -06C3; [57 FE, 05, 05] - -06D5; [58 05, 05, 05] -06C0; [58 05, 05, 05][, D4 CD, 05] -FBA5; [58 05, 05, 31][, D4 CD, 31] -FBA4; [58 05, 05, 33][, D4 CD, 33] - -0648; [58 07, 05, 05] -06E5; [58 07, 05, 09] -FEEE; [58 07, 05, 31] -FEED; [58 07, 05, 33] -0676; [58 07, 05, 09][57 20, 05, 09] -FDF8; [58 07, 05, 33][57 8E, 05, 33][57 E0, 05, 3D][57 EA, 05, 3D] - -06C4; [58 09, 05, 05] - -06C5; [58 0B, 05, 05] -FBE1; [58 0B, 05, 31] -FBE0; [58 0B, 05, 33] - -06C6; [58 0D, 05, 05] -FBDA; [58 0D, 05, 31] -FBD9; [58 0D, 05, 33] - -06C7; [58 0F, 05, 05] -FBD8; [58 0F, 05, 31] -FBD7; [58 0F, 05, 33] -0677; [58 0F, 05, 09][57 20, 05, 09] -FBDD; [58 0F, 05, 33][57 20, 05, 33] - -06C8; [58 11, 05, 05] -FBDC; [58 11, 05, 31] -FBDB; [58 11, 05, 33] - -06C9; [58 13, 05, 05] -FBE3; [58 13, 05, 31] -FBE2; [58 13, 05, 33] - -06CA; [58 15, 05, 05] - -06CB; [58 17, 05, 05] -FBDF; [58 17, 05, 31] -FBDE; [58 17, 05, 33] - -06CF; [58 19, 05, 05] - -0649; [58 1B, 05, 05] -FBE8; [58 1B, 05, 2D] -FBE9; [58 1B, 05, 2F] -FEF0; [58 1B, 05, 31] -FEEF; [58 1B, 05, 33] -FC90; [58 1B, 05, 31][, D4 ED, 31] -FC5D; [58 1B, 05, 33][, D4 ED, 33] - -064A; [58 1D, 05, 05] -06E6; [58 1D, 05, 09] -FEF3; [58 1D, 05, 2D] -FEF4; [58 1D, 05, 2F] -FEF2; [58 1D, 05, 31] -FEF1; [58 1D, 05, 33] -0678; [58 1D, 05, 09][57 20, 05, 09] -FCDA; [58 1D, 05, 2D][57 4C, 05, 2D] -FC55; [58 1D, 05, 33][57 4C, 05, 33] -FDAF; [58 1D, 05, 31][57 4C, 05, 31][58 1D, 05, 3D] -FCDB; [58 1D, 05, 2D][57 58, 05, 2D] -FC56; [58 1D, 05, 33][57 58, 05, 33] -FDAE; [58 1D, 05, 31][57 58, 05, 31][58 1D, 05, 3D] -FCDC; [58 1D, 05, 2D][57 5A, 05, 2D] -FC57; [58 1D, 05, 33][57 5A, 05, 33] -FC91; [58 1D, 05, 31][57 78, 05, 31] -FC92; [58 1D, 05, 31][57 7A, 05, 31] -FCDD; [58 1D, 05, 2D][57 EA, 05, 2D] -FCF0; [58 1D, 05, 2F][57 EA, 05, 2F] -FC93; [58 1D, 05, 31][57 EA, 05, 31] -FC58; [58 1D, 05, 33][57 EA, 05, 33] -FD9D; [58 1D, 05, 2D][57 EA, 05, 2D][57 EA, 05, 3D] -FD9C; [58 1D, 05, 31][57 EA, 05, 31][57 EA, 05, 3D] -FDB0; [58 1D, 05, 31][57 EA, 05, 31][58 1D, 05, 3D] -FC94; [58 1D, 05, 31][57 EC, 05, 31] -FCDE; [58 1D, 05, 2D][57 F8, 05, 2D] -FCF1; [58 1D, 05, 2F][57 F8, 05, 2F] -FC95; [58 1D, 05, 31][58 1B, 05, 31] -FC59; [58 1D, 05, 33][58 1B, 05, 33] -FC96; [58 1D, 05, 31][58 1D, 05, 31] -FC5A; [58 1D, 05, 33][58 1D, 05, 33] +13D2; [7E 84, 05, 05] -06CC; [58 1F, 05, 05] -FBFE; [58 1F, 05, 2D] -FBFF; [58 1F, 05, 2F] -FBFD; [58 1F, 05, 31] -FBFC; [58 1F, 05, 33] +13D3; [7E 86, 05, 05] -06CD; [58 21, 05, 05] +13D4; [7E 88, 05, 05] -06CE; [58 23, 05, 05] +13D5; [7E 8A, 05, 05] -06D0; [58 25, 05, 05] -FBE6; [58 25, 05, 2D] -FBE7; [58 25, 05, 2F] -FBE5; [58 25, 05, 31] -FBE4; [58 25, 05, 33] +13D6; [7E 8C, 05, 05] -06D1; [58 27, 05, 05] +13D7; [7E 8E, 05, 05] -06D2; [58 29, 05, 05] -FBAF; [58 29, 05, 31] -FBAE; [58 29, 05, 33] -06D3; [58 29, 05, 05][, D4 CD, 05] -FBB1; [58 29, 05, 31][, D4 CD, 31] -FBB0; [58 29, 05, 33][, D4 CD, 33] +13D8; [7E 90, 05, 05] -0710; [59 20, 05, 05] +13D9; [7E 92, 05, 05] -0712; [59 22, 05, 05] +13DA; [7E 94, 05, 05] -0713; [59 24, 05, 05] -0714; [59 24, 05, 09][, DF 79, 09] +13DB; [7E 96, 05, 05] -0715; [59 26, 05, 05] +13DC; [7E 98, 05, 05] -0716; [59 28, 05, 05] +13DD; [7E 9A, 05, 05] -0717; [59 2A, 05, 05] +13DE; [7E 9C, 05, 05] -0718; [59 2C, 05, 05] +13DF; [7E 9E, 05, 05] -0719; [59 2E, 05, 05] +13E0; [7E A0, 05, 05] -071A; [59 30, 05, 05] +13E1; [7E A2, 05, 05] -071B; [59 32, 05, 05] -071C; [59 32, 05, 09][, DF 79, 09] +13E2; [7E A4, 05, 05] -071D; [59 34, 05, 05] +13E3; [7E A6, 05, 05] -071E; [59 36, 05, 05] +13E4; [7E A8, 05, 05] -071F; [59 38, 05, 05] +13E5; [7E AA, 05, 05] -0720; [59 3A, 05, 05] +13E6; [7E AC, 05, 05] -0721; [59 3C, 05, 05] +13E7; [7E AE, 05, 05] -0722; [59 3E, 05, 05] +13E8; [7E B0, 05, 05] -0723; [59 40, 05, 05] -0724; [59 40, 05, 31] +13E9; [7E B2, 05, 05] -0725; [59 42, 05, 05] +13EA; [7E B4, 05, 05] -0726; [59 44, 05, 05] -0727; [59 44, 05, 09][, DF 79, 09] +13EB; [7E B6, 05, 05] -0728; [59 46, 05, 05] +13EC; [7E B8, 05, 05] -0729; [59 48, 05, 05] +13ED; [7E BA, 05, 05] -072A; [59 4A, 05, 05] +13EE; [7E BC, 05, 05] -072B; [59 4C, 05, 05] +13EF; [7E BE, 05, 05] -072C; [59 4E, 05, 05] +13F0; [7E C0, 05, 05] -0780; [5A 20, 05, 05] +13F1; [7E C2, 05, 05] -0799; [5A 22, 05, 05] +13F2; [7E C4, 05, 05] -079A; [5A 24, 05, 05] +13F3; [7E C6, 05, 05] -0781; [5A 26, 05, 05] +13F4; [7E C8, 05, 05] -0782; [5A 28, 05, 05] +1401; [7F 20, 05, 05] -0783; [5A 2A, 05, 05] +1402; [7F 22, 05, 05] -079C; [5A 2C, 05, 05] +1403; [7F 24, 05, 05] -0784; [5A 2E, 05, 05] +1404; [7F 26, 05, 05] -0785; [5A 30, 05, 05] +1405; [7F 28, 05, 05] -0786; [5A 32, 05, 05] +1406; [7F 2A, 05, 05] -0787; [5A 34, 05, 05] +1407; [7F 2C, 05, 05] -07A2; [5A 36, 05, 05] +1408; [7F 2E, 05, 05] -07A3; [5A 38, 05, 05] +1409; [7F 30, 05, 05] -0788; [5A 3A, 05, 05] +140A; [7F 32, 05, 05] -07A5; [5A 3C, 05, 05] +140B; [7F 34, 05, 05] -0789; [5A 3E, 05, 05] +140C; [7F 36, 05, 05] -078A; [5A 40, 05, 05] +140D; [7F 38, 05, 05] -078B; [5A 42, 05, 05] +140E; [7F 3A, 05, 05] -079B; [5A 44, 05, 05] +140F; [7F 3C, 05, 05] -078C; [5A 46, 05, 05] +1410; [7F 3E, 05, 05] -0798; [5A 48, 05, 05] +1411; [7F 40, 05, 05] -07A0; [5A 4A, 05, 05] +1412; [7F 42, 05, 05] -07A1; [5A 4C, 05, 05] +1413; [7F 44, 05, 05] -078D; [5A 4E, 05, 05] +1414; [7F 46, 05, 05] -078E; [5A 50, 05, 05] +1415; [7F 48, 05, 05] -07A4; [5A 52, 05, 05] +1416; [7F 4A, 05, 05] -078F; [5A 54, 05, 05] +1417; [7F 4C, 05, 05] -0790; [5A 56, 05, 05] +1418; [7F 4E, 05, 05] -079D; [5A 58, 05, 05] +1419; [7F 50, 05, 05] -079E; [5A 5A, 05, 05] +141A; [7F 52, 05, 05] -079F; [5A 5C, 05, 05] +141B; [7F 54, 05, 05] -0791; [5A 5E, 05, 05] +141C; [7F 56, 05, 05] -0792; [5A 60, 05, 05] +141D; [7F 58, 05, 05] -0793; [5A 62, 05, 05] +141E; [7F 5A, 05, 05] -0794; [5A 64, 05, 05] +141F; [7F 5C, 05, 05] -0795; [5A 66, 05, 05] +1420; [7F 5E, 05, 05] -0796; [5A 68, 05, 05] +1421; [7F 60, 05, 05] -0797; [5A 6A, 05, 05] +1422; [7F 62, 05, 05] -07A6; [5A 6C, 05, 05] +1423; [7F 64, 05, 05] -07A7; [5A 6E, 05, 05] +1424; [7F 66, 05, 05] -07A8; [5A 70, 05, 05] +1425; [7F 68, 05, 05] -07A9; [5A 72, 05, 05] +1426; [7F 6A, 05, 05] -07AA; [5A 74, 05, 05] +1427; [7F 6C, 05, 05] -07AB; [5A 76, 05, 05] +1428; [7F 6E, 05, 05] -07AC; [5A 78, 05, 05] +1429; [7F 70, 05, 05] -07AD; [5A 7A, 05, 05] +142A; [7F 72, 05, 05] -07AE; [5A 7C, 05, 05] +142B; [7F 74, 05, 05] -07AF; [5A 7E, 05, 05] +142C; [7F 76, 05, 05] -07B0; [5A 80, 05, 05] +142D; [7F 78, 05, 05] -1200; [5B 20, 05, 05] +142E; [7F 7A, 05, 05] -1201; [5B 22, 05, 05] +142F; [7F 7C, 05, 05] -1202; [5B 24, 05, 05] +1430; [7F 7E, 05, 05] -1203; [5B 26, 05, 05] +1431; [7F 80, 05, 05] -1204; [5B 28, 05, 05] +1432; [7F 82, 05, 05] -1205; [5B 2A, 05, 05] +1433; [7F 84, 05, 05] -1206; [5B 2C, 05, 05] +1434; [7F 86, 05, 05] -1208; [5B 2E, 05, 05] +1435; [7F 88, 05, 05] -1209; [5B 30, 05, 05] +1436; [7F 8A, 05, 05] -120A; [5B 32, 05, 05] +1437; [7F 8C, 05, 05] -120B; [5B 34, 05, 05] +1438; [7F 8E, 05, 05] -120C; [5B 36, 05, 05] +1439; [7F 90, 05, 05] -120D; [5B 38, 05, 05] +143A; [7F 92, 05, 05] -120E; [5B 3A, 05, 05] +143B; [7F 94, 05, 05] -120F; [5B 3C, 05, 05] +143C; [7F 96, 05, 05] -1210; [5B 3E, 05, 05] +143D; [7F 98, 05, 05] -1211; [5B 40, 05, 05] +143E; [7F 9A, 05, 05] -1212; [5B 42, 05, 05] +143F; [7F 9C, 05, 05] -1213; [5B 44, 05, 05] +1440; [7F 9E, 05, 05] -1214; [5B 46, 05, 05] +1441; [7F A0, 05, 05] -1215; [5B 48, 05, 05] +1442; [7F A2, 05, 05] -1216; [5B 4A, 05, 05] +1443; [7F A4, 05, 05] -1217; [5B 4C, 05, 05] +1444; [7F A6, 05, 05] -1218; [5B 4E, 05, 05] +1445; [7F A8, 05, 05] -1219; [5B 50, 05, 05] +1446; [7F AA, 05, 05] -121A; [5B 52, 05, 05] +1447; [7F AC, 05, 05] -121B; [5B 54, 05, 05] +1448; [7F AE, 05, 05] -121C; [5B 56, 05, 05] +1449; [7F B0, 05, 05] -121D; [5B 58, 05, 05] +144A; [7F B2, 05, 05] -121E; [5B 5A, 05, 05] +144B; [7F B4, 05, 05] -121F; [5B 5C, 05, 05] +144C; [7F B6, 05, 05] -1220; [5B 5E, 05, 05] +144D; [7F B8, 05, 05] -1221; [5B 60, 05, 05] +144E; [7F BA, 05, 05] -1222; [5B 62, 05, 05] +144F; [7F BC, 05, 05] -1223; [5B 64, 05, 05] +1450; [7F BE, 05, 05] -1224; [5B 66, 05, 05] +1451; [7F C0, 05, 05] -1225; [5B 68, 05, 05] +1452; [7F C2, 05, 05] -1226; [5B 6A, 05, 05] +1453; [7F C4, 05, 05] -1227; [5B 6C, 05, 05] +1454; [7F C6, 05, 05] -1228; [5B 6E, 05, 05] +1455; [7F C8, 05, 05] -1229; [5B 70, 05, 05] +1456; [7F CA, 05, 05] -122A; [5B 72, 05, 05] +1457; [7F CC, 05, 05] -122B; [5B 74, 05, 05] +1458; [7F CE, 05, 05] -122C; [5B 76, 05, 05] +1459; [7F D0, 05, 05] -122D; [5B 78, 05, 05] +145A; [7F D2, 05, 05] -122E; [5B 7A, 05, 05] +145B; [7F D4, 05, 05] -122F; [5B 7C, 05, 05] +145C; [7F D6, 05, 05] -1230; [5B 7E, 05, 05] +145D; [7F D8, 05, 05] -1231; [5B 80, 05, 05] +145E; [7F DA, 05, 05] -1232; [5B 82, 05, 05] +145F; [7F DC, 05, 05] -1233; [5B 84, 05, 05] +1460; [7F DE, 05, 05] -1234; [5B 86, 05, 05] +1461; [7F E0, 05, 05] -1235; [5B 88, 05, 05] +1462; [7F E2, 05, 05] -1236; [5B 8A, 05, 05] +1463; [7F E4, 05, 05] -1237; [5B 8C, 05, 05] +1464; [7F E6, 05, 05] -1238; [5B 8E, 05, 05] +1465; [7F E8, 05, 05] -1239; [5B 90, 05, 05] +1466; [7F EA, 05, 05] -123A; [5B 92, 05, 05] +1467; [7F EC, 05, 05] -123B; [5B 94, 05, 05] +1468; [7F EE, 05, 05] -123C; [5B 96, 05, 05] +1469; [7F F0, 05, 05] -123D; [5B 98, 05, 05] +146A; [7F F2, 05, 05] -123E; [5B 9A, 05, 05] +146B; [7F F4, 05, 05] -123F; [5B 9C, 05, 05] +146C; [7F F6, 05, 05] -1240; [5B 9E, 05, 05] +146D; [7F F8, 05, 05] -1241; [5B A0, 05, 05] +146E; [7F FA, 05, 05] -1242; [5B A2, 05, 05] +146F; [7F FC, 05, 05] -1243; [5B A4, 05, 05] +1470; [7F FE, 05, 05] -1244; [5B A6, 05, 05] +1471; [80 05, 05, 05] -1245; [5B A8, 05, 05] +1472; [80 07, 05, 05] -1246; [5B AA, 05, 05] +1473; [80 09, 05, 05] -1248; [5B AC, 05, 05] +1474; [80 0B, 05, 05] -124A; [5B AE, 05, 05] +1475; [80 0D, 05, 05] -124B; [5B B0, 05, 05] +1476; [80 0F, 05, 05] -124C; [5B B2, 05, 05] +1477; [80 11, 05, 05] -124D; [5B B4, 05, 05] +1478; [80 13, 05, 05] -1250; [5B B6, 05, 05] +1479; [80 15, 05, 05] -1251; [5B B8, 05, 05] +147A; [80 17, 05, 05] -1252; [5B BA, 05, 05] +147B; [80 19, 05, 05] -1253; [5B BC, 05, 05] +147C; [80 1B, 05, 05] -1254; [5B BE, 05, 05] +147D; [80 1D, 05, 05] -1255; [5B C0, 05, 05] +147E; [80 1F, 05, 05] -1256; [5B C2, 05, 05] +147F; [80 21, 05, 05] -1258; [5B C4, 05, 05] +1480; [80 23, 05, 05] -125A; [5B C6, 05, 05] +1481; [80 25, 05, 05] -125B; [5B C8, 05, 05] +1482; [80 27, 05, 05] -125C; [5B CA, 05, 05] +1483; [80 29, 05, 05] -125D; [5B CC, 05, 05] +1484; [80 2B, 05, 05] -1260; [5B CE, 05, 05] +1485; [80 2D, 05, 05] -1261; [5B D0, 05, 05] +1486; [80 2F, 05, 05] -1262; [5B D2, 05, 05] +1487; [80 31, 05, 05] -1263; [5B D4, 05, 05] +1488; [80 33, 05, 05] -1264; [5B D6, 05, 05] +1489; [80 35, 05, 05] -1265; [5B D8, 05, 05] +148A; [80 37, 05, 05] -1266; [5B DA, 05, 05] +148B; [80 39, 05, 05] -1267; [5B DC, 05, 05] +148C; [80 3B, 05, 05] -1268; [5B DE, 05, 05] +148D; [80 3D, 05, 05] -1269; [5B E0, 05, 05] +148E; [80 3F, 05, 05] -126A; [5B E2, 05, 05] +148F; [80 41, 05, 05] -126B; [5B E4, 05, 05] +1490; [80 43, 05, 05] -126C; [5B E6, 05, 05] +1491; [80 45, 05, 05] -126D; [5B E8, 05, 05] +1492; [80 47, 05, 05] -126E; [5B EA, 05, 05] +1493; [80 49, 05, 05] -126F; [5B EC, 05, 05] +1494; [80 4B, 05, 05] -1270; [5B EE, 05, 05] +1495; [80 4D, 05, 05] -1271; [5B F0, 05, 05] +1496; [80 4F, 05, 05] -1272; [5B F2, 05, 05] +1497; [80 51, 05, 05] -1273; [5B F4, 05, 05] +1498; [80 53, 05, 05] -1274; [5B F6, 05, 05] +1499; [80 55, 05, 05] -1275; [5B F8, 05, 05] +149A; [80 57, 05, 05] -1276; [5B FA, 05, 05] +149B; [80 59, 05, 05] -1277; [5B FC, 05, 05] +149C; [80 5B, 05, 05] -1278; [5B FE, 05, 05] +149D; [80 5D, 05, 05] -1279; [5C 05, 05, 05] +149E; [80 5F, 05, 05] -127A; [5C 07, 05, 05] +149F; [80 61, 05, 05] -127B; [5C 09, 05, 05] +14A0; [80 63, 05, 05] -127C; [5C 0B, 05, 05] +14A1; [80 65, 05, 05] -127D; [5C 0D, 05, 05] +14A2; [80 67, 05, 05] -127E; [5C 0F, 05, 05] +14A3; [80 69, 05, 05] -127F; [5C 11, 05, 05] +14A4; [80 6B, 05, 05] -1280; [5C 13, 05, 05] +14A5; [80 6D, 05, 05] -1281; [5C 15, 05, 05] +14A6; [80 6F, 05, 05] -1282; [5C 17, 05, 05] +14A7; [80 71, 05, 05] -1283; [5C 19, 05, 05] +14A8; [80 73, 05, 05] -1284; [5C 1B, 05, 05] +14A9; [80 75, 05, 05] -1285; [5C 1D, 05, 05] +14AA; [80 77, 05, 05] -1286; [5C 1F, 05, 05] +14AB; [80 79, 05, 05] -1288; [5C 21, 05, 05] +14AC; [80 7B, 05, 05] -128A; [5C 23, 05, 05] +14AD; [80 7D, 05, 05] -128B; [5C 25, 05, 05] +14AE; [80 7F, 05, 05] -128C; [5C 27, 05, 05] +14AF; [80 81, 05, 05] -128D; [5C 29, 05, 05] +14B0; [80 83, 05, 05] -1290; [5C 2B, 05, 05] +14B1; [80 85, 05, 05] -1291; [5C 2D, 05, 05] +14B2; [80 87, 05, 05] -1292; [5C 2F, 05, 05] +14B3; [80 89, 05, 05] -1293; [5C 31, 05, 05] +14B4; [80 8B, 05, 05] -1294; [5C 33, 05, 05] +14B5; [80 8D, 05, 05] -1295; [5C 35, 05, 05] +14B6; [80 8F, 05, 05] -1296; [5C 37, 05, 05] +14B7; [80 91, 05, 05] -1297; [5C 39, 05, 05] +14B8; [80 93, 05, 05] -1298; [5C 3B, 05, 05] +14B9; [80 95, 05, 05] -1299; [5C 3D, 05, 05] +14BA; [80 97, 05, 05] -129A; [5C 3F, 05, 05] +14BB; [80 99, 05, 05] -129B; [5C 41, 05, 05] +14BC; [80 9B, 05, 05] -129C; [5C 43, 05, 05] +14BD; [80 9D, 05, 05] -129D; [5C 45, 05, 05] +14BE; [80 9F, 05, 05] -129E; [5C 47, 05, 05] +14BF; [80 A1, 05, 05] -129F; [5C 49, 05, 05] +14C0; [80 A3, 05, 05] -12A0; [5C 4B, 05, 05] +14C1; [80 A5, 05, 05] -12A1; [5C 4D, 05, 05] +14C2; [80 A7, 05, 05] -12A2; [5C 4F, 05, 05] +14C3; [80 A9, 05, 05] -12A3; [5C 51, 05, 05] +14C4; [80 AB, 05, 05] -12A4; [5C 53, 05, 05] +14C5; [80 AD, 05, 05] -12A5; [5C 55, 05, 05] +14C6; [80 AF, 05, 05] -12A6; [5C 57, 05, 05] +14C7; [80 B1, 05, 05] -12A7; [5C 59, 05, 05] +14C8; [80 B3, 05, 05] -12A8; [5C 5B, 05, 05] +14C9; [80 B5, 05, 05] -12A9; [5C 5D, 05, 05] +14CA; [80 B7, 05, 05] -12AA; [5C 5F, 05, 05] +14CB; [80 B9, 05, 05] -12AB; [5C 61, 05, 05] +14CC; [80 BB, 05, 05] -12AC; [5C 63, 05, 05] +14CD; [80 BD, 05, 05] -12AD; [5C 65, 05, 05] +14CE; [80 BF, 05, 05] -12AE; [5C 67, 05, 05] +14CF; [80 C1, 05, 05] -12B0; [5C 69, 05, 05] +14D0; [80 C3, 05, 05] -12B2; [5C 6B, 05, 05] +14D1; [80 C5, 05, 05] -12B3; [5C 6D, 05, 05] +14D2; [80 C7, 05, 05] -12B4; [5C 6F, 05, 05] +14D3; [80 C9, 05, 05] -12B5; [5C 71, 05, 05] +14D4; [80 CB, 05, 05] -12B8; [5C 73, 05, 05] +14D5; [80 CD, 05, 05] -12B9; [5C 75, 05, 05] +14D6; [80 CF, 05, 05] -12BA; [5C 77, 05, 05] +14D7; [80 D1, 05, 05] -12BB; [5C 79, 05, 05] +14D8; [80 D3, 05, 05] -12BC; [5C 7B, 05, 05] +14D9; [80 D5, 05, 05] -12BD; [5C 7D, 05, 05] +14DA; [80 D7, 05, 05] -12BE; [5C 7F, 05, 05] +14DB; [80 D9, 05, 05] -12C0; [5C 81, 05, 05] +14DC; [80 DB, 05, 05] -12C2; [5C 83, 05, 05] +14DD; [80 DD, 05, 05] -12C3; [5C 85, 05, 05] +14DE; [80 DF, 05, 05] -12C4; [5C 87, 05, 05] +14DF; [80 E1, 05, 05] -12C5; [5C 89, 05, 05] +14E0; [80 E3, 05, 05] -12C8; [5C 8B, 05, 05] +14E1; [80 E5, 05, 05] -12C9; [5C 8D, 05, 05] +14E2; [80 E7, 05, 05] -12CA; [5C 8F, 05, 05] +14E3; [80 E9, 05, 05] -12CB; [5C 91, 05, 05] +14E4; [80 EB, 05, 05] -12CC; [5C 93, 05, 05] +14E5; [80 ED, 05, 05] -12CD; [5C 95, 05, 05] +14E6; [80 EF, 05, 05] -12CE; [5C 97, 05, 05] +14E7; [80 F1, 05, 05] -12D0; [5C 99, 05, 05] +14E8; [80 F3, 05, 05] -12D1; [5C 9B, 05, 05] +14E9; [80 F5, 05, 05] -12D2; [5C 9D, 05, 05] +14EA; [80 F7, 05, 05] -12D3; [5C 9F, 05, 05] +14EB; [80 F9, 05, 05] -12D4; [5C A1, 05, 05] +14EC; [80 FB, 05, 05] -12D5; [5C A3, 05, 05] +14ED; [80 FD, 05, 05] -12D6; [5C A5, 05, 05] +14EE; [81 05, 05, 05] -12D8; [5C A7, 05, 05] +14EF; [81 07, 05, 05] -12D9; [5C A9, 05, 05] +14F0; [81 09, 05, 05] -12DA; [5C AB, 05, 05] +14F1; [81 0B, 05, 05] -12DB; [5C AD, 05, 05] +14F2; [81 0D, 05, 05] -12DC; [5C AF, 05, 05] +14F3; [81 0F, 05, 05] -12DD; [5C B1, 05, 05] +14F4; [81 11, 05, 05] -12DE; [5C B3, 05, 05] +14F5; [81 13, 05, 05] -12DF; [5C B5, 05, 05] +14F6; [81 15, 05, 05] -12E0; [5C B7, 05, 05] +14F7; [81 17, 05, 05] -12E1; [5C B9, 05, 05] +14F8; [81 19, 05, 05] -12E2; [5C BB, 05, 05] +14F9; [81 1B, 05, 05] -12E3; [5C BD, 05, 05] +14FA; [81 1D, 05, 05] -12E4; [5C BF, 05, 05] +14FB; [81 1F, 05, 05] -12E5; [5C C1, 05, 05] +14FC; [81 21, 05, 05] -12E6; [5C C3, 05, 05] +14FD; [81 23, 05, 05] -12E7; [5C C5, 05, 05] +14FE; [81 25, 05, 05] -12E8; [5C C7, 05, 05] +14FF; [81 27, 05, 05] -12E9; [5C C9, 05, 05] +1500; [81 29, 05, 05] -12EA; [5C CB, 05, 05] +1501; [81 2B, 05, 05] -12EB; [5C CD, 05, 05] +1502; [81 2D, 05, 05] -12EC; [5C CF, 05, 05] +1503; [81 2F, 05, 05] -12ED; [5C D1, 05, 05] +1504; [81 31, 05, 05] -12EE; [5C D3, 05, 05] +1505; [81 33, 05, 05] -12F0; [5C D5, 05, 05] +1506; [81 35, 05, 05] -12F1; [5C D7, 05, 05] +1507; [81 37, 05, 05] -12F2; [5C D9, 05, 05] +1508; [81 39, 05, 05] -12F3; [5C DB, 05, 05] +1509; [81 3B, 05, 05] -12F4; [5C DD, 05, 05] +150A; [81 3D, 05, 05] -12F5; [5C DF, 05, 05] +150B; [81 3F, 05, 05] -12F6; [5C E1, 05, 05] +150C; [81 41, 05, 05] -12F7; [5C E3, 05, 05] +150D; [81 43, 05, 05] -12F8; [5C E5, 05, 05] +150E; [81 45, 05, 05] -12F9; [5C E7, 05, 05] +150F; [81 47, 05, 05] -12FA; [5C E9, 05, 05] +1510; [81 49, 05, 05] -12FB; [5C EB, 05, 05] +1511; [81 4B, 05, 05] -12FC; [5C ED, 05, 05] +1512; [81 4D, 05, 05] -12FD; [5C EF, 05, 05] +1513; [81 4F, 05, 05] -12FE; [5C F1, 05, 05] +1514; [81 51, 05, 05] -12FF; [5C F3, 05, 05] +1515; [81 53, 05, 05] -1300; [5C F5, 05, 05] +1516; [81 55, 05, 05] -1301; [5C F7, 05, 05] +1517; [81 57, 05, 05] -1302; [5C F9, 05, 05] +1518; [81 59, 05, 05] -1303; [5C FB, 05, 05] +1519; [81 5B, 05, 05] -1304; [5C FD, 05, 05] +151A; [81 5D, 05, 05] -1305; [5D 05, 05, 05] +151B; [81 5F, 05, 05] -1306; [5D 07, 05, 05] +151C; [81 61, 05, 05] -1307; [5D 09, 05, 05] +151D; [81 63, 05, 05] -1308; [5D 0B, 05, 05] +151E; [81 65, 05, 05] -1309; [5D 0D, 05, 05] +151F; [81 67, 05, 05] -130A; [5D 0F, 05, 05] +1520; [81 69, 05, 05] -130B; [5D 11, 05, 05] +1521; [81 6B, 05, 05] -130C; [5D 13, 05, 05] +1522; [81 6D, 05, 05] -130D; [5D 15, 05, 05] +1523; [81 6F, 05, 05] -130E; [5D 17, 05, 05] +1524; [81 71, 05, 05] -1310; [5D 19, 05, 05] +1525; [81 73, 05, 05] -1312; [5D 1B, 05, 05] +1526; [81 75, 05, 05] -1313; [5D 1D, 05, 05] +1527; [81 77, 05, 05] -1314; [5D 1F, 05, 05] +1528; [81 79, 05, 05] -1315; [5D 21, 05, 05] +1529; [81 7B, 05, 05] -1318; [5D 23, 05, 05] +152A; [81 7D, 05, 05] -1319; [5D 25, 05, 05] +152B; [81 7F, 05, 05] -131A; [5D 27, 05, 05] +152C; [81 81, 05, 05] -131B; [5D 29, 05, 05] +152D; [81 83, 05, 05] -131C; [5D 2B, 05, 05] +152E; [81 85, 05, 05] -131D; [5D 2D, 05, 05] +152F; [81 87, 05, 05] -131E; [5D 2F, 05, 05] +1530; [81 89, 05, 05] -1320; [5D 31, 05, 05] +1531; [81 8B, 05, 05] -1321; [5D 33, 05, 05] +1532; [81 8D, 05, 05] -1322; [5D 35, 05, 05] +1533; [81 8F, 05, 05] -1323; [5D 37, 05, 05] +1534; [81 91, 05, 05] -1324; [5D 39, 05, 05] +1535; [81 93, 05, 05] -1325; [5D 3B, 05, 05] +1536; [81 95, 05, 05] -1326; [5D 3D, 05, 05] +1537; [81 97, 05, 05] -1327; [5D 3F, 05, 05] +1538; [81 99, 05, 05] -1328; [5D 41, 05, 05] +1539; [81 9B, 05, 05] -1329; [5D 43, 05, 05] +153A; [81 9D, 05, 05] -132A; [5D 45, 05, 05] +153B; [81 9F, 05, 05] -132B; [5D 47, 05, 05] +153C; [81 A1, 05, 05] -132C; [5D 49, 05, 05] +153D; [81 A3, 05, 05] -132D; [5D 4B, 05, 05] +153E; [81 A5, 05, 05] -132E; [5D 4D, 05, 05] +153F; [81 A7, 05, 05] -132F; [5D 4F, 05, 05] +1540; [81 A9, 05, 05] -1330; [5D 51, 05, 05] +1541; [81 AB, 05, 05] -1331; [5D 53, 05, 05] +1542; [81 AD, 05, 05] -1332; [5D 55, 05, 05] +1543; [81 AF, 05, 05] -1333; [5D 57, 05, 05] +1544; [81 B1, 05, 05] -1334; [5D 59, 05, 05] +1545; [81 B3, 05, 05] -1335; [5D 5B, 05, 05] +1546; [81 B5, 05, 05] -1336; [5D 5D, 05, 05] +1547; [81 B7, 05, 05] -1337; [5D 5F, 05, 05] +1548; [81 B9, 05, 05] -1338; [5D 61, 05, 05] +1549; [81 BB, 05, 05] -1339; [5D 63, 05, 05] +154A; [81 BD, 05, 05] -133A; [5D 65, 05, 05] +154B; [81 BF, 05, 05] -133B; [5D 67, 05, 05] +154C; [81 C1, 05, 05] -133C; [5D 69, 05, 05] +154D; [81 C3, 05, 05] -133D; [5D 6B, 05, 05] +154E; [81 C5, 05, 05] -133E; [5D 6D, 05, 05] +154F; [81 C7, 05, 05] -133F; [5D 6F, 05, 05] +1550; [81 C9, 05, 05] -1340; [5D 71, 05, 05] +1551; [81 CB, 05, 05] -1341; [5D 73, 05, 05] +1552; [81 CD, 05, 05] -1342; [5D 75, 05, 05] +1553; [81 CF, 05, 05] -1343; [5D 77, 05, 05] +1554; [81 D1, 05, 05] -1344; [5D 79, 05, 05] +1555; [81 D3, 05, 05] -1345; [5D 7B, 05, 05] +1556; [81 D5, 05, 05] -1346; [5D 7D, 05, 05] +1557; [81 D7, 05, 05] -1348; [5D 7F, 05, 05] +1558; [81 D9, 05, 05] -1349; [5D 81, 05, 05] +1559; [81 DB, 05, 05] -134A; [5D 83, 05, 05] +155A; [81 DD, 05, 05] -134B; [5D 85, 05, 05] +155B; [81 DF, 05, 05] -134C; [5D 87, 05, 05] +155C; [81 E1, 05, 05] -134D; [5D 89, 05, 05] +155D; [81 E3, 05, 05] -134E; [5D 8B, 05, 05] +155E; [81 E5, 05, 05] -134F; [5D 8D, 05, 05] +155F; [81 E7, 05, 05] -1350; [5D 8F, 05, 05] +1560; [81 E9, 05, 05] -1351; [5D 91, 05, 05] +1561; [81 EB, 05, 05] -1352; [5D 93, 05, 05] +1562; [81 ED, 05, 05] -1353; [5D 95, 05, 05] +1563; [81 EF, 05, 05] -1354; [5D 97, 05, 05] +1564; [81 F1, 05, 05] -1355; [5D 99, 05, 05] +1565; [81 F3, 05, 05] -1356; [5D 9B, 05, 05] +1566; [81 F5, 05, 05] -1357; [5D 9D, 05, 05] +1567; [81 F7, 05, 05] -1358; [5D 9F, 05, 05] +1568; [81 F9, 05, 05] -1359; [5D A1, 05, 05] +1569; [81 FB, 05, 05] -135A; [5D A3, 05, 05] +156A; [81 FD, 05, 05] -0950; [5E 20, 05, 05] +156B; [82 05, 05, 05] -0905; [5E 22, 05, 05] +156C; [82 07, 05, 05] -0906; [5E 24, 05, 05] +156D; [82 09, 05, 05] -0907; [5E 26, 05, 05] +156E; [82 0B, 05, 05] -0908; [5E 28, 05, 05] +156F; [82 0D, 05, 05] -0909; [5E 2A, 05, 05] +1570; [82 0F, 05, 05] -090A; [5E 2C, 05, 05] +1571; [82 11, 05, 05] -090B; [5E 2E, 05, 05] +1572; [82 13, 05, 05] -0960; [5E 30, 05, 05] +1573; [82 15, 05, 05] -090C; [5E 32, 05, 05] +1574; [82 17, 05, 05] -0961; [5E 34, 05, 05] +1575; [82 19, 05, 05] -090D; [5E 36, 05, 05] +1576; [82 1B, 05, 05] -090E; [5E 38, 05, 05] +1577; [82 1D, 05, 05] -090F; [5E 3A, 05, 05] +1578; [82 1F, 05, 05] -0910; [5E 3C, 05, 05] +1579; [82 21, 05, 05] -0911; [5E 3E, 05, 05] +157A; [82 23, 05, 05] -0912; [5E 40, 05, 05] +157B; [82 25, 05, 05] -0913; [5E 42, 05, 05] +157D; [82 27, 05, 05] -0914; [5E 44, 05, 05] +166F; [82 29, 05, 05] -0915; [5E 46, 05, 05] -0958; [5E 46, 05, 05][, D7 A9, 05] +157E; [82 2B, 05, 05] -0916; [5E 48, 05, 05] -0959; [5E 48, 05, 05][, D7 A9, 05] +157F; [82 2D, 05, 05] -0917; [5E 4A, 05, 05] -095A; [5E 4A, 05, 05][, D7 A9, 05] +1580; [82 2F, 05, 05] -0918; [5E 4C, 05, 05] +1581; [82 31, 05, 05] -0919; [5E 4E, 05, 05] +1582; [82 33, 05, 05] -091A; [5E 50, 05, 05] +1583; [82 35, 05, 05] -091B; [5E 52, 05, 05] +1584; [82 37, 05, 05] -091C; [5E 54, 05, 05] -095B; [5E 54, 05, 05][, D7 A9, 05] +1585; [82 39, 05, 05] -091D; [5E 56, 05, 05] +1586; [82 3B, 05, 05] -091E; [5E 58, 05, 05] +1587; [82 3D, 05, 05] -091F; [5E 5A, 05, 05] +1588; [82 3F, 05, 05] -0920; [5E 5C, 05, 05] +1589; [82 41, 05, 05] -0921; [5E 5E, 05, 05] -095C; [5E 5E, 05, 05][, D7 A9, 05] +158A; [82 43, 05, 05] -0922; [5E 60, 05, 05] -095D; [5E 60, 05, 05][, D7 A9, 05] +158B; [82 45, 05, 05] -0923; [5E 62, 05, 05] +158C; [82 47, 05, 05] -0924; [5E 64, 05, 05] +158D; [82 49, 05, 05] -0925; [5E 66, 05, 05] +1670; [82 4B, 05, 05] -0926; [5E 68, 05, 05] +158E; [82 4D, 05, 05] -0927; [5E 6A, 05, 05] +158F; [82 4F, 05, 05] -0928; [5E 6C, 05, 05] -0929; [5E 6C, 05, 05][, D7 A9, 05] +1590; [82 51, 05, 05] -092A; [5E 6E, 05, 05] +1591; [82 53, 05, 05] -092B; [5E 70, 05, 05] -095E; [5E 70, 05, 05][, D7 A9, 05] +1592; [82 55, 05, 05] -092C; [5E 72, 05, 05] +1593; [82 57, 05, 05] -092D; [5E 74, 05, 05] +1594; [82 59, 05, 05] -092E; [5E 76, 05, 05] +1595; [82 5B, 05, 05] -092F; [5E 78, 05, 05] -095F; [5E 78, 05, 05][, D7 A9, 05] +1671; [82 5D, 05, 05] -0930; [5E 7A, 05, 05] -0931; [5E 7A, 05, 05][, D7 A9, 05] +1672; [82 5F, 05, 05] -0932; [5E 7C, 05, 05] +1673; [82 61, 05, 05] -0933; [5E 7E, 05, 05] -0934; [5E 7E, 05, 05][, D7 A9, 05] +1674; [82 63, 05, 05] -0935; [5E 80, 05, 05] +1675; [82 65, 05, 05] -0936; [5E 82, 05, 05] +1676; [82 67, 05, 05] -0937; [5E 84, 05, 05] +1596; [82 69, 05, 05] -0938; [5E 86, 05, 05] +1597; [82 6B, 05, 05] -0939; [5E 88, 05, 05] +1598; [82 6D, 05, 05] -093D; [5E 8A, 05, 05] +1599; [82 6F, 05, 05] -093E; [5E 8C, 05, 05] +159A; [82 71, 05, 05] -093F; [5E 8E, 05, 05] +159B; [82 73, 05, 05] -0940; [5E 90, 05, 05] +159C; [82 75, 05, 05] -0941; [5E 92, 05, 05] +159D; [82 77, 05, 05] -0942; [5E 94, 05, 05] +159E; [82 79, 05, 05] -0943; [5E 96, 05, 05] +159F; [82 7B, 05, 05] -0944; [5E 98, 05, 05] +15A0; [82 7D, 05, 05] -0962; [5E 9A, 05, 05] +15A1; [82 7F, 05, 05] -0963; [5E 9C, 05, 05] +15A2; [82 81, 05, 05] -0945; [5E 9E, 05, 05] +15A3; [82 83, 05, 05] -0946; [5E A0, 05, 05] +15A4; [82 85, 05, 05] -0947; [5E A2, 05, 05] +15A5; [82 87, 05, 05] -0948; [5E A4, 05, 05] +15A6; [82 89, 05, 05] -0949; [5E A6, 05, 05] +157C; [82 8B, 05, 05] -094A; [5E A8, 05, 05] +15A7; [82 8D, 05, 05] -094B; [5E AA, 05, 05] +15A8; [82 8F, 05, 05] -094C; [5E AC, 05, 05] +15A9; [82 91, 05, 05] -094D; [5E AE, 05, 05] +15AA; [82 93, 05, 05] -0985; [5F 20, 05, 05] +15AB; [82 95, 05, 05] -0986; [5F 22, 05, 05] +15AC; [82 97, 05, 05] -0987; [5F 24, 05, 05] +15AD; [82 99, 05, 05] -0988; [5F 26, 05, 05] +15AE; [82 9B, 05, 05] -0989; [5F 28, 05, 05] +15AF; [82 9D, 05, 05] -098A; [5F 2A, 05, 05] +15B0; [82 9F, 05, 05] -098B; [5F 2C, 05, 05] +15B1; [82 A1, 05, 05] -09E0; [5F 2E, 05, 05] +15B2; [82 A3, 05, 05] -098C; [5F 30, 05, 05] +15B3; [82 A5, 05, 05] -09E1; [5F 32, 05, 05] +15B4; [82 A7, 05, 05] -098F; [5F 34, 05, 05] +15B5; [82 A9, 05, 05] -0990; [5F 36, 05, 05] +15B6; [82 AB, 05, 05] -0993; [5F 38, 05, 05] +15B7; [82 AD, 05, 05] -0994; [5F 3A, 05, 05] +15B8; [82 AF, 05, 05] -0995; [5F 3C, 05, 05] +15B9; [82 B1, 05, 05] -0996; [5F 3E, 05, 05] +15BA; [82 B3, 05, 05] -0997; [5F 40, 05, 05] +15BB; [82 B5, 05, 05] -0998; [5F 42, 05, 05] +15BC; [82 B7, 05, 05] -0999; [5F 44, 05, 05] +15BD; [82 B9, 05, 05] -099A; [5F 46, 05, 05] +15BE; [82 BB, 05, 05] -099B; [5F 48, 05, 05] +15BF; [82 BD, 05, 05] -099C; [5F 4A, 05, 05] +15C0; [82 BF, 05, 05] -099D; [5F 4C, 05, 05] +15C1; [82 C1, 05, 05] -099E; [5F 4E, 05, 05] +15C2; [82 C3, 05, 05] -099F; [5F 50, 05, 05] +15C3; [82 C5, 05, 05] -09A0; [5F 52, 05, 05] +15C4; [82 C7, 05, 05] -09A1; [5F 54, 05, 05] -09DC; [5F 54, 05, 05][, D8 2D, 05] +15C5; [82 C9, 05, 05] -09A2; [5F 56, 05, 05] -09DD; [5F 56, 05, 05][, D8 2D, 05] +15C6; [82 CB, 05, 05] -09A3; [5F 58, 05, 05] +15C7; [82 CD, 05, 05] -09A4; [5F 5A, 05, 05] +15C8; [82 CF, 05, 05] -09A5; [5F 5C, 05, 05] +15C9; [82 D1, 05, 05] -09A6; [5F 5E, 05, 05] +15CA; [82 D3, 05, 05] -09A7; [5F 60, 05, 05] +15CB; [82 D5, 05, 05] -09A8; [5F 62, 05, 05] +15CC; [82 D7, 05, 05] -09AA; [5F 64, 05, 05] +15CD; [82 D9, 05, 05] -09AB; [5F 66, 05, 05] +15CE; [82 DB, 05, 05] -09AC; [5F 68, 05, 05] +15CF; [82 DD, 05, 05] -09AD; [5F 6A, 05, 05] +15D0; [82 DF, 05, 05] -09AE; [5F 6C, 05, 05] +15D1; [82 E1, 05, 05] -09AF; [5F 6E, 05, 05] -09DF; [5F 6E, 05, 05][, D8 2D, 05] +15D2; [82 E3, 05, 05] -09B0; [5F 70, 05, 05] +15D3; [82 E5, 05, 05] -09F0; [5F 72, 05, 05] +15D4; [82 E7, 05, 05] -09B2; [5F 74, 05, 05] +15D5; [82 E9, 05, 05] -09F1; [5F 76, 05, 05] +15D6; [82 EB, 05, 05] -09B6; [5F 78, 05, 05] +15D7; [82 ED, 05, 05] -09B7; [5F 7A, 05, 05] +15D8; [82 EF, 05, 05] -09B8; [5F 7C, 05, 05] +15D9; [82 F1, 05, 05] -09B9; [5F 7E, 05, 05] +15DA; [82 F3, 05, 05] -09BE; [5F 80, 05, 05] +15DB; [82 F5, 05, 05] -09BF; [5F 82, 05, 05] +15DC; [82 F7, 05, 05] -09C0; [5F 84, 05, 05] +15DD; [82 F9, 05, 05] -09C1; [5F 86, 05, 05] +15DE; [82 FB, 05, 05] -09C2; [5F 88, 05, 05] +15DF; [82 FD, 05, 05] -09C3; [5F 8A, 05, 05] +15E0; [83 05, 05, 05] -09C4; [5F 8C, 05, 05] +15E1; [83 07, 05, 05] -09E2; [5F 8E, 05, 05] +15E2; [83 09, 05, 05] -09E3; [5F 90, 05, 05] +15E3; [83 0B, 05, 05] -09C7; [5F 92, 05, 05] +15E4; [83 0D, 05, 05] -09C8; [5F 94, 05, 05] +15E5; [83 0F, 05, 05] -09C7 09BE; [5F 96, 05, 05] -09CB; [5F 96, 05, 05] +15E6; [83 11, 05, 05] -09C7 09D7; [5F 98, 05, 05] -09CC; [5F 98, 05, 05] +15E7; [83 13, 05, 05] -09CD; [5F 9A, 05, 05] +15E8; [83 15, 05, 05] -09D7; [5F 9C, 05, 05] +15E9; [83 17, 05, 05] -0A74; [60 20, 05, 05] +15EA; [83 19, 05, 05] -0A73; [60 22, 05, 05] +15EB; [83 1B, 05, 05] -0A09; [60 24, 05, 05] +15EC; [83 1D, 05, 05] -0A0A; [60 26, 05, 05] +15ED; [83 1F, 05, 05] -0A13; [60 28, 05, 05] +15EE; [83 21, 05, 05] -0A05; [60 2A, 05, 05] +15EF; [83 23, 05, 05] -0A06; [60 2C, 05, 05] +15F0; [83 25, 05, 05] -0A10; [60 2E, 05, 05] +15F1; [83 27, 05, 05] -0A14; [60 30, 05, 05] +15F2; [83 29, 05, 05] -0A72; [60 32, 05, 05] +15F3; [83 2B, 05, 05] -0A07; [60 34, 05, 05] +15F4; [83 2D, 05, 05] -0A08; [60 36, 05, 05] +15F5; [83 2F, 05, 05] -0A0F; [60 38, 05, 05] +15F6; [83 31, 05, 05] -0A38; [60 3A, 05, 05] -0A36; [60 3A, 05, 05][, D8 6D, 05] +15F7; [83 33, 05, 05] -0A39; [60 3C, 05, 05] +15F8; [83 35, 05, 05] -0A15; [60 3E, 05, 05] +15F9; [83 37, 05, 05] -0A16; [60 40, 05, 05] -0A59; [60 40, 05, 05][, D8 6D, 05] +15FA; [83 39, 05, 05] -0A17; [60 42, 05, 05] -0A5A; [60 42, 05, 05][, D8 6D, 05] +15FB; [83 3B, 05, 05] -0A18; [60 44, 05, 05] +15FC; [83 3D, 05, 05] -0A19; [60 46, 05, 05] +15FD; [83 3F, 05, 05] -0A1A; [60 48, 05, 05] +15FE; [83 41, 05, 05] -0A1B; [60 4A, 05, 05] +15FF; [83 43, 05, 05] -0A1C; [60 4C, 05, 05] -0A5B; [60 4C, 05, 05][, D8 6D, 05] +1600; [83 45, 05, 05] -0A1D; [60 4E, 05, 05] +1601; [83 47, 05, 05] -0A1E; [60 50, 05, 05] +1602; [83 49, 05, 05] -0A1F; [60 52, 05, 05] +1603; [83 4B, 05, 05] -0A20; [60 54, 05, 05] +1604; [83 4D, 05, 05] -0A21; [60 56, 05, 05] +1605; [83 4F, 05, 05] -0A22; [60 58, 05, 05] +1606; [83 51, 05, 05] -0A23; [60 5A, 05, 05] +1607; [83 53, 05, 05] -0A24; [60 5C, 05, 05] +1608; [83 55, 05, 05] -0A25; [60 5E, 05, 05] +1609; [83 57, 05, 05] -0A26; [60 60, 05, 05] +160A; [83 59, 05, 05] -0A27; [60 62, 05, 05] +160B; [83 5B, 05, 05] -0A28; [60 64, 05, 05] +160C; [83 5D, 05, 05] -0A2A; [60 66, 05, 05] +160D; [83 5F, 05, 05] -0A2B; [60 68, 05, 05] -0A5E; [60 68, 05, 05][, D8 6D, 05] +160E; [83 61, 05, 05] -0A2C; [60 6A, 05, 05] +160F; [83 63, 05, 05] -0A2D; [60 6C, 05, 05] +1610; [83 65, 05, 05] -0A2E; [60 6E, 05, 05] +1611; [83 67, 05, 05] -0A2F; [60 70, 05, 05] +1612; [83 69, 05, 05] -0A30; [60 72, 05, 05] +1613; [83 6B, 05, 05] -0A32; [60 74, 05, 05] -0A33; [60 74, 05, 05][, D8 6D, 05] +1614; [83 6D, 05, 05] -0A35; [60 76, 05, 05] +1615; [83 6F, 05, 05] -0A5C; [60 78, 05, 05] +1616; [83 71, 05, 05] -0A3E; [60 7A, 05, 05] +1617; [83 73, 05, 05] -0A3F; [60 7C, 05, 05] +1618; [83 75, 05, 05] -0A40; [60 7E, 05, 05] +1619; [83 77, 05, 05] -0A41; [60 80, 05, 05] +161A; [83 79, 05, 05] -0A42; [60 82, 05, 05] +161B; [83 7B, 05, 05] -0A47; [60 84, 05, 05] +161C; [83 7D, 05, 05] -0A48; [60 86, 05, 05] +161D; [83 7F, 05, 05] -0A4B; [60 88, 05, 05] +161E; [83 81, 05, 05] -0A4C; [60 8A, 05, 05] +161F; [83 83, 05, 05] -0A4D; [60 8C, 05, 05] +1620; [83 85, 05, 05] -0AD0; [61 20, 05, 05] +1621; [83 87, 05, 05] -0A85; [61 22, 05, 05] +1622; [83 89, 05, 05] -0A86; [61 24, 05, 05] +1623; [83 8B, 05, 05] -0A87; [61 26, 05, 05] +1624; [83 8D, 05, 05] -0A88; [61 28, 05, 05] +1625; [83 8F, 05, 05] -0A89; [61 2A, 05, 05] +1626; [83 91, 05, 05] -0A8A; [61 2C, 05, 05] +1627; [83 93, 05, 05] -0A8B; [61 2E, 05, 05] +1628; [83 95, 05, 05] -0AE0; [61 30, 05, 05] +1629; [83 97, 05, 05] -0A8D; [61 32, 05, 05] +162A; [83 99, 05, 05] -0A8F; [61 34, 05, 05] +162B; [83 9B, 05, 05] -0A90; [61 36, 05, 05] +162C; [83 9D, 05, 05] -0A91; [61 38, 05, 05] +162D; [83 9F, 05, 05] -0A93; [61 3A, 05, 05] +162E; [83 A1, 05, 05] -0A94; [61 3C, 05, 05] +162F; [83 A3, 05, 05] -0A95; [61 3E, 05, 05] +1630; [83 A5, 05, 05] -0A96; [61 40, 05, 05] +1631; [83 A7, 05, 05] -0A97; [61 42, 05, 05] +1632; [83 A9, 05, 05] -0A98; [61 44, 05, 05] +1633; [83 AB, 05, 05] -0A99; [61 46, 05, 05] +1634; [83 AD, 05, 05] -0A9A; [61 48, 05, 05] +1635; [83 AF, 05, 05] -0A9B; [61 4A, 05, 05] +1636; [83 B1, 05, 05] -0A9C; [61 4C, 05, 05] +1637; [83 B3, 05, 05] -0A9D; [61 4E, 05, 05] +1638; [83 B5, 05, 05] -0A9E; [61 50, 05, 05] +1639; [83 B7, 05, 05] -0A9F; [61 52, 05, 05] +163A; [83 B9, 05, 05] -0AA0; [61 54, 05, 05] +163B; [83 BB, 05, 05] -0AA1; [61 56, 05, 05] +163C; [83 BD, 05, 05] -0AA2; [61 58, 05, 05] +163D; [83 BF, 05, 05] -0AA3; [61 5A, 05, 05] +163E; [83 C1, 05, 05] -0AA4; [61 5C, 05, 05] +163F; [83 C3, 05, 05] -0AA5; [61 5E, 05, 05] +1640; [83 C5, 05, 05] -0AA6; [61 60, 05, 05] +1641; [83 C7, 05, 05] -0AA7; [61 62, 05, 05] +1642; [83 C9, 05, 05] -0AA8; [61 64, 05, 05] +1643; [83 CB, 05, 05] -0AAA; [61 66, 05, 05] +1644; [83 CD, 05, 05] -0AAB; [61 68, 05, 05] +1645; [83 CF, 05, 05] -0AAC; [61 6A, 05, 05] +1646; [83 D1, 05, 05] -0AAD; [61 6C, 05, 05] +1647; [83 D3, 05, 05] -0AAE; [61 6E, 05, 05] +1648; [83 D5, 05, 05] -0AAF; [61 70, 05, 05] +1649; [83 D7, 05, 05] -0AB0; [61 72, 05, 05] +164A; [83 D9, 05, 05] -0AB2; [61 74, 05, 05] +164B; [83 DB, 05, 05] -0AB3; [61 76, 05, 05] +164C; [83 DD, 05, 05] -0AB5; [61 78, 05, 05] +164D; [83 DF, 05, 05] -0AB6; [61 7A, 05, 05] +164E; [83 E1, 05, 05] -0AB7; [61 7C, 05, 05] +164F; [83 E3, 05, 05] -0AB8; [61 7E, 05, 05] +1650; [83 E5, 05, 05] -0AB9; [61 80, 05, 05] +1651; [83 E7, 05, 05] -0ABD; [61 82, 05, 05] +1652; [83 E9, 05, 05] -0ABE; [61 84, 05, 05] +1653; [83 EB, 05, 05] -0ABF; [61 86, 05, 05] +1654; [83 ED, 05, 05] -0AC0; [61 88, 05, 05] +1655; [83 EF, 05, 05] -0AC1; [61 8A, 05, 05] +1656; [83 F1, 05, 05] -0AC2; [61 8C, 05, 05] +1657; [83 F3, 05, 05] -0AC3; [61 8E, 05, 05] +1658; [83 F5, 05, 05] -0AC4; [61 90, 05, 05] +1659; [83 F7, 05, 05] -0AC5; [61 92, 05, 05] +165A; [83 F9, 05, 05] -0AC7; [61 94, 05, 05] +165B; [83 FB, 05, 05] -0AC8; [61 96, 05, 05] +165C; [83 FD, 05, 05] -0AC9; [61 98, 05, 05] +165D; [84 05, 05, 05] -0ACB; [61 9A, 05, 05] +165E; [84 07, 05, 05] -0ACC; [61 9C, 05, 05] +165F; [84 09, 05, 05] -0ACD; [61 9E, 05, 05] +1660; [84 0B, 05, 05] -0B05; [62 20, 05, 05] +1661; [84 0D, 05, 05] -0B06; [62 22, 05, 05] +1662; [84 0F, 05, 05] -0B07; [62 24, 05, 05] +1663; [84 11, 05, 05] -0B08; [62 26, 05, 05] +1664; [84 13, 05, 05] -0B09; [62 28, 05, 05] +1665; [84 15, 05, 05] -0B0A; [62 2A, 05, 05] +1666; [84 17, 05, 05] -0B0B; [62 2C, 05, 05] +1667; [84 19, 05, 05] -0B60; [62 2E, 05, 05] +1668; [84 1B, 05, 05] -0B0C; [62 30, 05, 05] +1669; [84 1D, 05, 05] -0B61; [62 32, 05, 05] +166A; [84 1F, 05, 05] -0B0F; [62 34, 05, 05] +166B; [84 21, 05, 05] -0B10; [62 36, 05, 05] +166C; [84 23, 05, 05] -0B13; [62 38, 05, 05] +1681; [85 20, 05, 05] -0B14; [62 3A, 05, 05] +1682; [85 22, 05, 05] -0B15; [62 3C, 05, 05] +1683; [85 24, 05, 05] -0B16; [62 3E, 05, 05] +1684; [85 26, 05, 05] -0B17; [62 40, 05, 05] +1685; [85 28, 05, 05] -0B18; [62 42, 05, 05] +1686; [85 2A, 05, 05] -0B19; [62 44, 05, 05] +1687; [85 2C, 05, 05] -0B1A; [62 46, 05, 05] +1688; [85 2E, 05, 05] -0B1B; [62 48, 05, 05] +1689; [85 30, 05, 05] -0B1C; [62 4A, 05, 05] +168A; [85 32, 05, 05] -0B1D; [62 4C, 05, 05] +168B; [85 34, 05, 05] -0B1E; [62 4E, 05, 05] +168C; [85 36, 05, 05] -0B1F; [62 50, 05, 05] +168D; [85 38, 05, 05] -0B20; [62 52, 05, 05] +168E; [85 3A, 05, 05] -0B21; [62 54, 05, 05] -0B5C; [62 54, 05, 05][, D8 ED, 05] +168F; [85 3C, 05, 05] -0B22; [62 56, 05, 05] -0B5D; [62 56, 05, 05][, D8 ED, 05] +1690; [85 3E, 05, 05] -0B23; [62 58, 05, 05] +1691; [85 40, 05, 05] -0B24; [62 5A, 05, 05] +1692; [85 42, 05, 05] -0B25; [62 5C, 05, 05] +1693; [85 44, 05, 05] -0B26; [62 5E, 05, 05] +1694; [85 46, 05, 05] -0B27; [62 60, 05, 05] +1695; [85 48, 05, 05] -0B28; [62 62, 05, 05] +1696; [85 4A, 05, 05] -0B2A; [62 64, 05, 05] +1697; [85 4C, 05, 05] -0B2B; [62 66, 05, 05] +1698; [85 4E, 05, 05] -0B2C; [62 68, 05, 05] +1699; [85 50, 05, 05] -0B2D; [62 6A, 05, 05] +169A; [85 52, 05, 05] -0B2E; [62 6C, 05, 05] +16A0; [86 20, 05, 05] +16A1; [86 20, 05, 09][, E0 8D, 09] -0B2F; [62 6E, 05, 05] +16A2; [86 22, 05, 05] +16A4; [86 22, 05, 09][, E0 8D, 09] +16A5; [86 22, 05, 09][, E0 9D, 09] -0B5F; [62 70, 05, 05] +16A6; [86 24, 05, 05] +16A7; [86 24, 05, 09][, E0 8D, 09] +16F0; [86 24, 05, 09][86 24, 05, 09] -0B30; [62 72, 05, 05] +16A8; [86 26, 05, 05] +16A9; [86 26, 05, 09][, E0 8D, 09] +16AC; [86 26, 05, 09][, E0 9D, 09] +16AD; [86 26, 05, 09][, E0 AD, 09] +16AE; [86 26, 05, 09][, E0 BD, 09] -0B32; [62 74, 05, 05] +16AF; [86 28, 05, 05] -0B33; [62 76, 05, 05] +16B0; [86 2A, 05, 05] -0B36; [62 78, 05, 05] +16B1; [86 2C, 05, 05] -0B37; [62 7A, 05, 05] +16B2; [86 2E, 05, 05] +16B3; [86 2E, 05, 09][, E0 8D, 09] +16B4; [86 2E, 05, 09][, E0 9D, 09] +16B5; [86 2E, 05, 09][, E0 AD, 09] +16B6; [86 2E, 05, 09][, E0 BD, 09] -0B38; [62 7C, 05, 05] +16B7; [86 30, 05, 05] -0B39; [62 7E, 05, 05] +16B9; [86 32, 05, 05] +16E9; [86 32, 05, 09][, E0 8D, 09] -0B3D; [62 80, 05, 05] +16BA; [86 34, 05, 05] +16BB; [86 34, 05, 09][, E0 8D, 09] +16BC; [86 34, 05, 09][, E0 9D, 09] +16BD; [86 34, 05, 09][, E0 AD, 09] -0B3E; [62 82, 05, 05] +16BE; [86 36, 05, 05] +16BF; [86 36, 05, 09][, E0 8D, 09] +16C0; [86 36, 05, 09][, E0 9D, 09] -0B3F; [62 84, 05, 05] +16C1; [86 38, 05, 05] +16C2; [86 38, 05, 09][, E0 8D, 09] -0B40; [62 86, 05, 05] +16C3; [86 3A, 05, 05] +16C4; [86 3A, 05, 09][, E0 8D, 09] -0B41; [62 88, 05, 05] +16C5; [86 3C, 05, 05] +16C6; [86 3C, 05, 09][, E0 8D, 09] +16EE; [86 3C, 05, 09][86 4E, 05, 09] -0B42; [62 8A, 05, 05] +16C7; [86 3E, 05, 05] -0B43; [62 8C, 05, 05] +16C8; [86 40, 05, 05] +16D5; [86 40, 05, 09][, E0 8D, 09] -0B47; [62 8E, 05, 05] +16C9; [86 42, 05, 05] -0B47 0B56; [62 90, 05, 05] -0B48; [62 90, 05, 05] +16CA; [86 44, 05, 05] +16CB; [86 44, 05, 09][, E0 8D, 09] +16EA; [86 44, 05, 09][, E0 9D, 09] +16CC; [86 44, 05, 09][, E0 AD, 09] +16CD; [86 44, 05, 09][, E0 BD, 09] +16CE; [86 44, 05, 09][, E0 CD, 09] -0B47 0B3E; [62 92, 05, 05] -0B4B; [62 92, 05, 05] +16CF; [86 46, 05, 05] +16D0; [86 46, 05, 09][, E0 8D, 09] +16D1; [86 46, 05, 09][, E0 9D, 09] -0B47 0B57; [62 94, 05, 05] -0B4C; [62 94, 05, 05] +16D2; [86 48, 05, 05] +16D3; [86 48, 05, 09][, E0 8D, 09] +16D4; [86 48, 05, 09][, E0 9D, 09] -0B4D; [62 96, 05, 05] +16D6; [86 4A, 05, 05] -0B56; [62 98, 05, 05] +16D7; [86 4C, 05, 05] +16D8; [86 4C, 05, 09][, E0 8D, 09] +16D9; [86 4C, 05, 09][, E0 9D, 09] +16EF; [86 4C, 05, 09][, E0 8D, 09][86 4C, 05, 3D][, E0 8D, 3D] -0B57; [62 9A, 05, 05] +16DA; [86 4E, 05, 05] +16DB; [86 4E, 05, 09][, E0 8D, 09] -0B83; [63 20, 05, 05] +16DC; [86 50, 05, 05] +16DD; [86 50, 05, 09][, E0 8D, 09] -0B85; [63 22, 05, 05] +16DE; [86 52, 05, 05] -0B86; [63 24, 05, 05] +16DF; [86 54, 05, 05] -0B87; [63 26, 05, 05] +16AA; [86 56, 05, 05] -0B88; [63 28, 05, 05] +16AB; [86 58, 05, 05] -0B89; [63 2A, 05, 05] +16A3; [86 5A, 05, 05] -0B8A; [63 2C, 05, 05] +16E0; [86 5C, 05, 05] -0B8E; [63 2E, 05, 05] +16E3; [86 5E, 05, 05] -0B8F; [63 30, 05, 05] +16B8; [86 60, 05, 05] -0B90; [63 32, 05, 05] +16E4; [86 62, 05, 05] -0B92; [63 34, 05, 05] +16E1; [86 64, 05, 05] -0B93; [63 36, 05, 05] +16E2; [86 66, 05, 05] -0B92 0BD7; [63 38, 05, 05] -0B94; [63 38, 05, 05] +16E5; [86 68, 05, 05] -0B95; [63 3A, 05, 05] +16E6; [86 6A, 05, 05] +16E7; [86 6A, 05, 09][, E0 8D, 09] +16E8; [86 6A, 05, 09][, E0 9D, 09] -0B99; [63 3C, 05, 05] +1100; [87 20, 05, 05] +3131; [87 20, 05, 09] +3260; [87 20, 05, 0D] +FFA1; [87 20, 05, A3] +326E; [87 20, 05, 0D][87 48, 05, 0D] -0B9A; [63 3E, 05, 05] +1101; [87 22, 05, 05] +3132; [87 22, 05, 09] +FFA2; [87 22, 05, A3] -0B9C; [63 40, 05, 05] +1102; [87 24, 05, 05] +3134; [87 24, 05, 09] +3261; [87 24, 05, 0D] +FFA4; [87 24, 05, A3] +326F; [87 24, 05, 0D][87 48, 05, 0D] -0B9E; [63 42, 05, 05] +1103; [87 26, 05, 05] +3137; [87 26, 05, 09] +3262; [87 26, 05, 0D] +FFA7; [87 26, 05, A3] +3270; [87 26, 05, 0D][87 48, 05, 0D] -0B9F; [63 44, 05, 05] +1104; [87 28, 05, 05] +3138; [87 28, 05, 09] +FFA8; [87 28, 05, A3] -0BA3; [63 46, 05, 05] +1105; [87 2A, 05, 05] +3139; [87 2A, 05, 09] +3263; [87 2A, 05, 0D] +FFA9; [87 2A, 05, A3] +3271; [87 2A, 05, 0D][87 48, 05, 0D] -0BA4; [63 48, 05, 05] +1106; [87 2C, 05, 05] +3141; [87 2C, 05, 09] +3264; [87 2C, 05, 0D] +FFB1; [87 2C, 05, A3] +3272; [87 2C, 05, 0D][87 48, 05, 0D] -0BA8; [63 4A, 05, 05] +1107; [87 2E, 05, 05] +3142; [87 2E, 05, 09] +3265; [87 2E, 05, 0D] +FFB2; [87 2E, 05, A3] +3273; [87 2E, 05, 0D][87 48, 05, 0D] -0BA9; [63 4C, 05, 05] +1108; [87 30, 05, 05] +3143; [87 30, 05, 09] +FFB3; [87 30, 05, A3] -0BAA; [63 4E, 05, 05] +1109; [87 32, 05, 05] +3145; [87 32, 05, 09] +3266; [87 32, 05, 0D] +FFB5; [87 32, 05, A3] +3274; [87 32, 05, 0D][87 48, 05, 0D] -0BAE; [63 50, 05, 05] +110A; [87 34, 05, 05] +3146; [87 34, 05, 09] +FFB6; [87 34, 05, A3] -0BAF; [63 52, 05, 05] +110B; [87 36, 05, 05] +3147; [87 36, 05, 09] +3267; [87 36, 05, 0D] +FFB7; [87 36, 05, A3] +3275; [87 36, 05, 0D][87 48, 05, 0D] -0BB0; [63 54, 05, 05] +110C; [87 38, 05, 05] +3148; [87 38, 05, 09] +3268; [87 38, 05, 0D] +FFB8; [87 38, 05, A3] +3276; [87 38, 05, 0D][87 48, 05, 0D] +327D; [87 38, 05, 0D][87 62, 05, 0D][87 36, 05, 3D][87 6E, 05, 3D] -0BB1; [63 56, 05, 05] +110D; [87 3A, 05, 05] +3149; [87 3A, 05, 09] +FFB9; [87 3A, 05, A3] -0BB2; [63 58, 05, 05] +110E; [87 3C, 05, 05] +314A; [87 3C, 05, 09] +3269; [87 3C, 05, 0D] +FFBA; [87 3C, 05, A3] +3277; [87 3C, 05, 0D][87 48, 05, 0D] +327C; [87 3C, 05, 0D][87 48, 05, 0D][87 92, 05, 3D][87 20, 05, 3D][87 58, 05, 3D] -0BB3; [63 5A, 05, 05] +110F; [87 3E, 05, 05] +314B; [87 3E, 05, 09] +326A; [87 3E, 05, 0D] +FFBB; [87 3E, 05, A3] +3278; [87 3E, 05, 0D][87 48, 05, 0D] -0BB4; [63 5C, 05, 05] +1110; [87 40, 05, 05] +314C; [87 40, 05, 09] +326B; [87 40, 05, 0D] +FFBC; [87 40, 05, A3] +3279; [87 40, 05, 0D][87 48, 05, 0D] -0BB5; [63 5E, 05, 05] +1111; [87 42, 05, 05] +314D; [87 42, 05, 09] +326C; [87 42, 05, 0D] +FFBD; [87 42, 05, A3] +327A; [87 42, 05, 0D][87 48, 05, 0D] -0BB7; [63 60, 05, 05] +1112; [87 44, 05, 05] +314E; [87 44, 05, 09] +326D; [87 44, 05, 0D] +FFBE; [87 44, 05, A3] +327B; [87 44, 05, 0D][87 48, 05, 0D] -0BB8; [63 62, 05, 05] +1113; [87 46 10, 05, 05] -0BB9; [63 64, 05, 05] +1114; [87 46 13, 05, 05] +3165; [87 46 13, 05, 09] -0BBE; [63 66, 05, 05] +1115; [87 46 16, 05, 05] +3166; [87 46 16, 05, 09] -0BBF; [63 68, 05, 05] +1116; [87 46 19, 05, 05] -0BC0; [63 6A, 05, 05] +1117; [87 46 1C, 05, 05] -0BC1; [63 6C, 05, 05] +1118; [87 46 1F, 05, 05] -0BC2; [63 6E, 05, 05] +1119; [87 46 22, 05, 05] -0BC6; [63 70, 05, 05] +111A; [87 46 25, 05, 05] +3140; [87 46 25, 05, 09] +FFB0; [87 46 25, 05, A3] -0BC7; [63 72, 05, 05] +111B; [87 46 28, 05, 05] -0BC8; [63 74, 05, 05] +111C; [87 46 2B, 05, 05] +316E; [87 46 2B, 05, 09] -0BC6 0BBE; [63 76, 05, 05] -0BCA; [63 76, 05, 05] +111D; [87 46 2E, 05, 05] +3171; [87 46 2E, 05, 09] -0BC7 0BBE; [63 78, 05, 05] -0BCB; [63 78, 05, 05] +111E; [87 46 31, 05, 05] +3172; [87 46 31, 05, 09] -0BC6 0BD7; [63 7A, 05, 05] -0BCC; [63 7A, 05, 05] +111F; [87 46 34, 05, 05] -0BCD; [63 7C, 05, 05] +1120; [87 46 37, 05, 05] +3173; [87 46 37, 05, 09] -0BD7; [63 7E, 05, 05] +1121; [87 46 3A, 05, 05] +3144; [87 46 3A, 05, 09] +FFB4; [87 46 3A, 05, A3] -0C05; [64 20, 05, 05] +1122; [87 46 3D, 05, 05] +3174; [87 46 3D, 05, 09] -0C06; [64 22, 05, 05] +1123; [87 46 40, 05, 05] +3175; [87 46 40, 05, 09] -0C07; [64 24, 05, 05] +1124; [87 46 43, 05, 05] -0C08; [64 26, 05, 05] +1125; [87 46 46, 05, 05] -0C09; [64 28, 05, 05] +1126; [87 46 49, 05, 05] -0C0A; [64 2A, 05, 05] +1127; [87 46 4C, 05, 05] +3176; [87 46 4C, 05, 09] -0C0B; [64 2C, 05, 05] +1128; [87 46 4F, 05, 05] -0C60; [64 2E, 05, 05] +1129; [87 46 52, 05, 05] +3177; [87 46 52, 05, 09] -0C0C; [64 30, 05, 05] +112A; [87 46 55, 05, 05] -0C61; [64 32, 05, 05] +112B; [87 46 58, 05, 05] +3178; [87 46 58, 05, 09] -0C0E; [64 34, 05, 05] +112C; [87 46 5B, 05, 05] +3179; [87 46 5B, 05, 09] -0C0F; [64 36, 05, 05] +112D; [87 46 5E, 05, 05] +317A; [87 46 5E, 05, 09] -0C10; [64 38, 05, 05] +112E; [87 46 61, 05, 05] +317B; [87 46 61, 05, 09] -0C12; [64 3A, 05, 05] +112F; [87 46 64, 05, 05] +317C; [87 46 64, 05, 09] -0C13; [64 3C, 05, 05] +1130; [87 46 67, 05, 05] -0C14; [64 3E, 05, 05] +1131; [87 46 6A, 05, 05] -0C15; [64 40, 05, 05] +1132; [87 46 6D, 05, 05] +317D; [87 46 6D, 05, 09] -0C16; [64 42, 05, 05] +1133; [87 46 70, 05, 05] -0C17; [64 44, 05, 05] +1134; [87 46 73, 05, 05] -0C18; [64 46, 05, 05] +1135; [87 46 76, 05, 05] -0C19; [64 48, 05, 05] +1136; [87 46 79, 05, 05] +317E; [87 46 79, 05, 09] -0C1A; [64 4A, 05, 05] +1137; [87 46 7C, 05, 05] -0C1B; [64 4C, 05, 05] +1138; [87 46 7F, 05, 05] -0C1C; [64 4E, 05, 05] +1139; [87 46 82, 05, 05] -0C1D; [64 50, 05, 05] +113A; [87 46 85, 05, 05] -0C1E; [64 52, 05, 05] +113B; [87 46 88, 05, 05] -0C1F; [64 54, 05, 05] +113C; [87 46 8B, 05, 05] -0C20; [64 56, 05, 05] +113D; [87 46 8E, 05, 05] -0C21; [64 58, 05, 05] +113E; [87 46 91, 05, 05] -0C22; [64 5A, 05, 05] +113F; [87 46 94, 05, 05] -0C23; [64 5C, 05, 05] +1140; [87 46 97, 05, 05] +317F; [87 46 97, 05, 09] -0C24; [64 5E, 05, 05] +1141; [87 46 9A, 05, 05] -0C25; [64 60, 05, 05] +1142; [87 46 9D, 05, 05] -0C26; [64 62, 05, 05] +1143; [87 46 A0, 05, 05] -0C27; [64 64, 05, 05] +1144; [87 46 A3, 05, 05] -0C28; [64 66, 05, 05] +1145; [87 46 A6, 05, 05] -0C2A; [64 68, 05, 05] +1146; [87 46 A9, 05, 05] -0C2B; [64 6A, 05, 05] +1147; [87 46 AC, 05, 05] +3180; [87 46 AC, 05, 09] -0C2C; [64 6C, 05, 05] +1148; [87 46 AF, 05, 05] -0C2D; [64 6E, 05, 05] +1149; [87 46 B2, 05, 05] -0C2E; [64 70, 05, 05] +114A; [87 46 B5, 05, 05] -0C2F; [64 72, 05, 05] +114B; [87 46 B8, 05, 05] -0C30; [64 74, 05, 05] +114C; [87 46 BB, 05, 05] +3181; [87 46 BB, 05, 09] -0C31; [64 76, 05, 05] +114D; [87 46 BE, 05, 05] -0C32; [64 78, 05, 05] +114E; [87 46 C1, 05, 05] -0C33; [64 7A, 05, 05] +114F; [87 46 C4, 05, 05] -0C35; [64 7C, 05, 05] +1150; [87 46 C7, 05, 05] -0C36; [64 7E, 05, 05] +1151; [87 46 CA, 05, 05] -0C37; [64 80, 05, 05] +1152; [87 46 CD, 05, 05] -0C38; [64 82, 05, 05] +1153; [87 46 D0, 05, 05] -0C39; [64 84, 05, 05] +1154; [87 46 D3, 05, 05] -0C3E; [64 86, 05, 05] +1155; [87 46 D6, 05, 05] -0C3F; [64 88, 05, 05] +1156; [87 46 D9, 05, 05] -0C40; [64 8A, 05, 05] +1157; [87 46 DC, 05, 05] +3184; [87 46 DC, 05, 09] -0C41; [64 8C, 05, 05] +1158; [87 46 DF, 05, 05] +3185; [87 46 DF, 05, 09] -0C42; [64 8E, 05, 05] +1159; [87 46 E2, 05, 05] +3186; [87 46 E2, 05, 09] -0C43; [64 90, 05, 05] +115F; [87 46 E5, 05, 05] -0C44; [64 92, 05, 05] +1160; [87 46 E8, 05, 05] +3164; [87 46 E8, 05, 09] +FFA0; [87 46 E8, 05, A3] -0C46; [64 94, 05, 05] +1161; [87 48, 05, 05] +314F; [87 48, 05, 09] +FFC2; [87 48, 05, A3] -0C47; [64 96, 05, 05] +1162; [87 4A, 05, 05] +3150; [87 4A, 05, 09] +FFC3; [87 4A, 05, A3] -0C46 0C56; [64 98, 05, 05] -0C48; [64 98, 05, 05] +1163; [87 4C, 05, 05] +3151; [87 4C, 05, 09] +FFC4; [87 4C, 05, A3] -0C4A; [64 9A, 05, 05] +1164; [87 4E, 05, 05] +3152; [87 4E, 05, 09] +FFC5; [87 4E, 05, A3] -0C4B; [64 9C, 05, 05] +1165; [87 50, 05, 05] +3153; [87 50, 05, 09] +FFC6; [87 50, 05, A3] -0C4C; [64 9E, 05, 05] +1166; [87 52, 05, 05] +3154; [87 52, 05, 09] +FFC7; [87 52, 05, A3] -0C4D; [64 A0, 05, 05] +1167; [87 54, 05, 05] +3155; [87 54, 05, 09] +FFCA; [87 54, 05, A3] -0C55; [64 A2, 05, 05] +1168; [87 56, 05, 05] +3156; [87 56, 05, 09] +FFCB; [87 56, 05, A3] -0C56; [64 A4, 05, 05] +1169; [87 58, 05, 05] +3157; [87 58, 05, 09] +FFCC; [87 58, 05, A3] -0C85; [65 20, 05, 05] +116A; [87 5A, 05, 05] +3158; [87 5A, 05, 09] +FFCD; [87 5A, 05, A3] -0C86; [65 22, 05, 05] +116B; [87 5C, 05, 05] +3159; [87 5C, 05, 09] +FFCE; [87 5C, 05, A3] -0C87; [65 24, 05, 05] +116C; [87 5E, 05, 05] +315A; [87 5E, 05, 09] +FFCF; [87 5E, 05, A3] -0C88; [65 26, 05, 05] +116D; [87 60, 05, 05] +315B; [87 60, 05, 09] +FFD2; [87 60, 05, A3] -0C89; [65 28, 05, 05] +116E; [87 62, 05, 05] +315C; [87 62, 05, 09] +FFD3; [87 62, 05, A3] -0C8A; [65 2A, 05, 05] +116F; [87 64, 05, 05] +315D; [87 64, 05, 09] +FFD4; [87 64, 05, A3] -0C8B; [65 2C, 05, 05] +1170; [87 66, 05, 05] +315E; [87 66, 05, 09] +FFD5; [87 66, 05, A3] -0CE0; [65 2E, 05, 05] +1171; [87 68, 05, 05] +315F; [87 68, 05, 09] +FFD6; [87 68, 05, A3] -0C8C; [65 30, 05, 05] +1172; [87 6A, 05, 05] +3160; [87 6A, 05, 09] +FFD7; [87 6A, 05, A3] -0CE1; [65 32, 05, 05] +1173; [87 6C, 05, 05] +3161; [87 6C, 05, 09] +FFDA; [87 6C, 05, A3] -0C8E; [65 34, 05, 05] +1174; [87 6E, 05, 05] +3162; [87 6E, 05, 09] +FFDB; [87 6E, 05, A3] -0C8F; [65 36, 05, 05] +1175; [87 70, 05, 05] +3163; [87 70, 05, 09] +FFDC; [87 70, 05, A3] -0C90; [65 38, 05, 05] +1176; [87 72 10, 05, 05] -0C92; [65 3A, 05, 05] +1177; [87 72 13, 05, 05] -0C93; [65 3C, 05, 05] +1178; [87 72 16, 05, 05] -0C94; [65 3E, 05, 05] +1179; [87 72 19, 05, 05] -0C95; [65 40, 05, 05] +117A; [87 72 1C, 05, 05] -0C96; [65 42, 05, 05] +117B; [87 72 1F, 05, 05] -0C97; [65 44, 05, 05] +117C; [87 72 22, 05, 05] -0C98; [65 46, 05, 05] +117D; [87 72 25, 05, 05] -0C99; [65 48, 05, 05] +117E; [87 72 28, 05, 05] -0C9A; [65 4A, 05, 05] +117F; [87 72 2B, 05, 05] -0C9B; [65 4C, 05, 05] +1180; [87 72 2E, 05, 05] -0C9C; [65 4E, 05, 05] +1181; [87 72 31, 05, 05] -0C9D; [65 50, 05, 05] +1182; [87 72 34, 05, 05] -0C9E; [65 52, 05, 05] +1183; [87 72 37, 05, 05] -0C9F; [65 54, 05, 05] +1184; [87 72 3A, 05, 05] +3187; [87 72 3A, 05, 09] -0CA0; [65 56, 05, 05] +1185; [87 72 3D, 05, 05] +3188; [87 72 3D, 05, 09] -0CA1; [65 58, 05, 05] +1186; [87 72 40, 05, 05] -0CA2; [65 5A, 05, 05] +1187; [87 72 43, 05, 05] -0CA3; [65 5C, 05, 05] +1188; [87 72 46, 05, 05] +3189; [87 72 46, 05, 09] -0CA4; [65 5E, 05, 05] +1189; [87 72 49, 05, 05] -0CA5; [65 60, 05, 05] +118A; [87 72 4C, 05, 05] -0CA6; [65 62, 05, 05] +118B; [87 72 4F, 05, 05] -0CA7; [65 64, 05, 05] +118C; [87 72 52, 05, 05] -0CA8; [65 66, 05, 05] +118D; [87 72 55, 05, 05] -0CAA; [65 68, 05, 05] +118E; [87 72 58, 05, 05] -0CAB; [65 6A, 05, 05] +118F; [87 72 5B, 05, 05] -0CAC; [65 6C, 05, 05] +1190; [87 72 5E, 05, 05] -0CAD; [65 6E, 05, 05] +1191; [87 72 61, 05, 05] +318A; [87 72 61, 05, 09] -0CAE; [65 70, 05, 05] +1192; [87 72 64, 05, 05] +318B; [87 72 64, 05, 09] -0CAF; [65 72, 05, 05] +1193; [87 72 67, 05, 05] -0CB0; [65 74, 05, 05] +1194; [87 72 6A, 05, 05] +318C; [87 72 6A, 05, 09] -0CB1; [65 76, 05, 05] +1195; [87 72 6D, 05, 05] -0CB2; [65 78, 05, 05] +1196; [87 72 70, 05, 05] -0CB5; [65 7A, 05, 05] +1197; [87 72 73, 05, 05] -0CB6; [65 7C, 05, 05] +1198; [87 72 76, 05, 05] -0CB7; [65 7E, 05, 05] +1199; [87 72 79, 05, 05] -0CB8; [65 80, 05, 05] +119A; [87 72 7C, 05, 05] -0CB9; [65 82, 05, 05] +119B; [87 72 7F, 05, 05] -0CB3; [65 84, 05, 05] +119C; [87 72 82, 05, 05] -0CDE; [65 86, 05, 05] +119D; [87 72 85, 05, 05] -0CBE; [65 88, 05, 05] +119E; [87 72 88, 05, 05] +318D; [87 72 88, 05, 09] -0CBF; [65 8A, 05, 05] +119F; [87 72 8B, 05, 05] -0CBF 0CD5; [65 8C, 05, 05] -0CC0; [65 8C, 05, 05] +11A0; [87 72 8E, 05, 05] -0CC1; [65 8E, 05, 05] +11A1; [87 72 91, 05, 05] +318E; [87 72 91, 05, 09] -0CC2; [65 90, 05, 05] +11A2; [87 72 94, 05, 05] -0CC3; [65 92, 05, 05] +11A8; [87 74, 05, 05] -0CC4; [65 94, 05, 05] +11A9; [87 76, 05, 05] -0CC6; [65 96, 05, 05] +11AA; [87 78, 05, 05] +3133; [87 78, 05, 09] +FFA3; [87 78, 05, A3] -0CC6 0CD5; [65 98, 05, 05] -0CC7; [65 98, 05, 05] +11AB; [87 7A, 05, 05] -0CC6 0CD6; [65 9A, 05, 05] -0CC8; [65 9A, 05, 05] +11AC; [87 7C, 05, 05] +3135; [87 7C, 05, 09] +FFA5; [87 7C, 05, A3] -0CC6 0CC2; [65 9C, 05, 05] -0CCA; [65 9C, 05, 05] +11AD; [87 7E, 05, 05] +3136; [87 7E, 05, 09] +FFA6; [87 7E, 05, A3] -0CC6 0CC2 0CD5; [65 9E, 05, 05] -0CCA 0CD5; [65 9E, 05, 05] -0CCB; [65 9E, 05, 05] +11AE; [87 80, 05, 05] -0CCC; [65 A0, 05, 05] +11AF; [87 82, 05, 05] -0CCD; [65 A2, 05, 05] +11B0; [87 84, 05, 05] +313A; [87 84, 05, 09] +FFAA; [87 84, 05, A3] -0CD5; [65 A4, 05, 05] +11B1; [87 86, 05, 05] +313B; [87 86, 05, 09] +FFAB; [87 86, 05, A3] -0CD6; [65 A6, 05, 05] +11B2; [87 88, 05, 05] +313C; [87 88, 05, 09] +FFAC; [87 88, 05, A3] -0D05; [66 20, 05, 05] +11B3; [87 8A, 05, 05] +313D; [87 8A, 05, 09] +FFAD; [87 8A, 05, A3] -0D06; [66 22, 05, 05] +11B4; [87 8C, 05, 05] +313E; [87 8C, 05, 09] +FFAE; [87 8C, 05, A3] -0D07; [66 24, 05, 05] +11B5; [87 8E, 05, 05] +313F; [87 8E, 05, 09] +FFAF; [87 8E, 05, A3] -0D08; [66 26, 05, 05] +11B6; [87 90, 05, 05] -0D09; [66 28, 05, 05] +11B7; [87 92, 05, 05] -0D0A; [66 2A, 05, 05] +11B8; [87 94, 05, 05] -0D0B; [66 2C, 05, 05] +11B9; [87 96, 05, 05] -0D60; [66 2E, 05, 05] +11BA; [87 98, 05, 05] -0D0C; [66 30, 05, 05] +11BB; [87 9A, 05, 05] -0D61; [66 32, 05, 05] +11BC; [87 9C, 05, 05] -0D0E; [66 34, 05, 05] +11BD; [87 9E, 05, 05] -0D0F; [66 36, 05, 05] +11BE; [87 A0, 05, 05] -0D10; [66 38, 05, 05] +11BF; [87 A2, 05, 05] -0D12; [66 3A, 05, 05] +11C0; [87 A4, 05, 05] -0D13; [66 3C, 05, 05] +11C1; [87 A6, 05, 05] -0D14; [66 3E, 05, 05] +11C2; [87 A8, 05, 05] -0D15; [66 40, 05, 05] +11C3; [87 AA 10, 05, 05] -0D16; [66 42, 05, 05] +11C4; [87 AA 13, 05, 05] -0D17; [66 44, 05, 05] +11C5; [87 AA 16, 05, 05] -0D18; [66 46, 05, 05] +11C6; [87 AA 19, 05, 05] -0D19; [66 48, 05, 05] +11C7; [87 AA 1C, 05, 05] +3167; [87 AA 1C, 05, 09] -0D1A; [66 4A, 05, 05] +11C8; [87 AA 1F, 05, 05] +3168; [87 AA 1F, 05, 09] -0D1B; [66 4C, 05, 05] +11C9; [87 AA 22, 05, 05] -0D1C; [66 4E, 05, 05] +11CA; [87 AA 25, 05, 05] -0D1D; [66 50, 05, 05] +11CB; [87 AA 28, 05, 05] -0D1E; [66 52, 05, 05] +11CC; [87 AA 2B, 05, 05] +3169; [87 AA 2B, 05, 09] -0D1F; [66 54, 05, 05] +11CD; [87 AA 2E, 05, 05] -0D20; [66 56, 05, 05] +11CE; [87 AA 31, 05, 05] +316A; [87 AA 31, 05, 09] -0D21; [66 58, 05, 05] +11CF; [87 AA 34, 05, 05] -0D22; [66 5A, 05, 05] +11D0; [87 AA 37, 05, 05] -0D23; [66 5C, 05, 05] +11D1; [87 AA 3A, 05, 05] -0D24; [66 5E, 05, 05] +11D2; [87 AA 3D, 05, 05] -0D25; [66 60, 05, 05] +11D3; [87 AA 40, 05, 05] +316B; [87 AA 40, 05, 09] -0D26; [66 62, 05, 05] +11D4; [87 AA 43, 05, 05] -0D27; [66 64, 05, 05] +11D5; [87 AA 46, 05, 05] -0D28; [66 66, 05, 05] +11D6; [87 AA 49, 05, 05] -0D2A; [66 68, 05, 05] +11D7; [87 AA 4C, 05, 05] +316C; [87 AA 4C, 05, 09] -0D2B; [66 6A, 05, 05] +11D8; [87 AA 4F, 05, 05] -0D2C; [66 6C, 05, 05] +11D9; [87 AA 52, 05, 05] +316D; [87 AA 52, 05, 09] -0D2D; [66 6E, 05, 05] +11DA; [87 AA 55, 05, 05] -0D2E; [66 70, 05, 05] +11DB; [87 AA 58, 05, 05] -0D2F; [66 72, 05, 05] +11DC; [87 AA 5B, 05, 05] -0D30; [66 74, 05, 05] +11DD; [87 AA 5E, 05, 05] +316F; [87 AA 5E, 05, 09] -0D31; [66 76, 05, 05] +11DE; [87 AA 61, 05, 05] -0D32; [66 78, 05, 05] +11DF; [87 AA 64, 05, 05] +3170; [87 AA 64, 05, 09] -0D33; [66 7A, 05, 05] +11E0; [87 AA 67, 05, 05] -0D34; [66 7C, 05, 05] +11E1; [87 AA 6A, 05, 05] -0D35; [66 7E, 05, 05] +11E2; [87 AA 6D, 05, 05] -0D36; [66 80, 05, 05] +11E3; [87 AA 70, 05, 05] -0D37; [66 82, 05, 05] +11E4; [87 AA 73, 05, 05] -0D38; [66 84, 05, 05] +11E5; [87 AA 76, 05, 05] -0D39; [66 86, 05, 05] +11E6; [87 AA 79, 05, 05] -0D3E; [66 88, 05, 05] +11E7; [87 AA 7C, 05, 05] -0D3F; [66 8A, 05, 05] +11E8; [87 AA 7F, 05, 05] -0D40; [66 8C, 05, 05] +11E9; [87 AA 82, 05, 05] -0D41; [66 8E, 05, 05] +11EA; [87 AA 85, 05, 05] -0D42; [66 90, 05, 05] +11EB; [87 AA 88, 05, 05] -0D43; [66 92, 05, 05] +11EC; [87 AA 8B, 05, 05] -0D46; [66 94, 05, 05] +11ED; [87 AA 8E, 05, 05] -0D47; [66 96, 05, 05] +11EE; [87 AA 91, 05, 05] -0D48; [66 98, 05, 05] +11EF; [87 AA 94, 05, 05] -0D46 0D3E; [66 9A, 05, 05] -0D4A; [66 9A, 05, 05] +11F0; [87 AA 97, 05, 05] -0D47 0D3E; [66 9C, 05, 05] -0D4B; [66 9C, 05, 05] +11F1; [87 AA 9A, 05, 05] +3182; [87 AA 9A, 05, 09] -0D46 0D57; [66 9E, 05, 05] -0D4C; [66 9E, 05, 05] +11F2; [87 AA 9D, 05, 05] +3183; [87 AA 9D, 05, 09] -0D4D; [66 A0, 05, 05] +11F3; [87 AA A0, 05, 05] -0D57; [66 A2, 05, 05] +11F4; [87 AA A3, 05, 05] -0D85; [67 20, 05, 05] +11F5; [87 AA A6, 05, 05] -0D86; [67 22, 05, 05] +11F6; [87 AA A9, 05, 05] -0D87; [67 24, 05, 05] +11F7; [87 AA AC, 05, 05] -0D88; [67 26, 05, 05] +11F8; [87 AA AF, 05, 05] -0D89; [67 28, 05, 05] +11F9; [87 AA B2, 05, 05] -0D8A; [67 2A, 05, 05] +3041; [88 20, 05, 19] +3042; [88 20, 05, 9B] +30A1; [88 20, 05, 1D] +FF67; [88 20, 05, 1F] +30A2; [88 20, 05, A1] +FF71; [88 20, 05, A3] +32D0; [88 20, 05, 25] +3303; [88 20, 05, 37][23 34, 05, 37][88 70, 05, 3D] +3300; [88 20, 05, 37][88 52, 05, 37][, DC 3D, 3D][23 34, 05, 3D][88 46, 05, 3D] +3301; [88 20, 05, 37][88 70, 05, 37][88 56, 05, 3D][88 20, 05, 3D] +3302; [88 20, 05, 37][88 7E, 05, 37][88 58, 05, 3D][, DC 3D, 3D][88 20, 05, 3D] -0D8B; [67 2C, 05, 05] +3043; [88 22, 05, 19] +3044; [88 22, 05, 9B] +30A3; [88 22, 05, 1D] +FF68; [88 22, 05, 1F] +30A4; [88 22, 05, A1] +FF72; [88 22, 05, A3] +32D1; [88 22, 05, 25] +3304; [88 22, 05, 37][88 4A, 05, 37][88 7E, 05, 3D][88 2E, 05, 3D][, DC 2D, 3D] +3305; [88 22, 05, 37][88 7E, 05, 37][88 40, 05, 3D] + +3045; [88 24, 05, 19] +3046; [88 24, 05, 9B] +30A5; [88 24, 05, 1D] +FF69; [88 24, 05, 1F] +30A6; [88 24, 05, A1] +FF73; [88 24, 05, A3] +32D2; [88 24, 05, 25] +3094; [88 24, 05, 9B][, DC 2D, 05] +30F4; [88 24, 05, A1][, DC 2D, 05] +3306; [88 24, 05, 37][88 28, 05, 37][88 7E, 05, 3D] + +3047; [88 26, 05, 19] +3048; [88 26, 05, 9B] +30A7; [88 26, 05, 1D] +FF6A; [88 26, 05, 1F] +30A8; [88 26, 05, A1] +FF74; [88 26, 05, A3] +32D3; [88 26, 05, 25] +3308; [88 26, 05, 37][23 34, 05, 37][88 2A, 05, 3D][23 34, 05, 3D] +3307; [88 26, 05, 37][88 38, 05, 37][88 2E, 05, 3D][23 34, 05, 3D][88 46, 05, 3D][, DC 2D, 3D] + +3049; [88 28, 05, 19] +304A; [88 28, 05, 9B] +30A9; [88 28, 05, 1D] +FF6B; [88 28, 05, 1F] +30AA; [88 28, 05, A1] +FF75; [88 28, 05, A3] +32D4; [88 28, 05, 25] +330A; [88 28, 05, 37][23 34, 05, 37][88 60, 05, 3D] +3309; [88 28, 05, 37][88 7E, 05, 37][88 38, 05, 3D] + +3095; [88 2A, 05, 19] +304B; [88 2A, 05, 9B] +30F5; [88 2A, 05, 1D] +30AB; [88 2A, 05, A1] +FF76; [88 2A, 05, A3] +32D5; [88 2A, 05, 25] +304C; [88 2A, 05, 9B][, DC 2D, 05] +30AC; [88 2A, 05, A1][, DC 2D, 05] +330B; [88 2A, 05, 37][88 22, 05, 37][88 6E, 05, 3D] +330C; [88 2A, 05, 37][88 6C, 05, 37][88 42, 05, 3D][88 46, 05, 3D] +330D; [88 2A, 05, 37][88 74, 05, 37][88 6E, 05, 3D][23 34, 05, 3D] +330E; [88 2A, 05, 37][, DC 2D, 37][88 74, 05, 3D][88 7E, 05, 3D] +330F; [88 2A, 05, 37][, DC 2D, 37][88 7E, 05, 3D][88 5C, 05, 3D] + +304D; [88 2C, 05, 9B] +30AD; [88 2C, 05, A1] +FF77; [88 2C, 05, A3] +32D6; [88 2C, 05, 25] +304E; [88 2C, 05, 9B][, DC 2D, 05] +30AE; [88 2C, 05, A1][, DC 2D, 05] +3310; [88 2C, 05, 37][, DC 2D, 37][88 2A, 05, 3D][, DC 2D, 3D] +3311; [88 2C, 05, 37][, DC 2D, 37][88 4A, 05, 3D][23 34, 05, 3D] +3312; [88 2C, 05, 37][88 68, 05, 37][88 6E, 05, 3D][23 34, 05, 3D] +3313; [88 2C, 05, 37][, DC 2D, 37][88 70, 05, 3D][88 3E, 05, 3D][, DC 2D, 3D][23 34, 05, 3D] +3314; [88 2C, 05, 37][88 74, 05, 37] +3315; [88 2C, 05, 37][88 74, 05, 37][88 2E, 05, 3D][, DC 2D, 3D][88 6C, 05, 3D][88 60, 05, 3D] +3316; [88 2C, 05, 37][88 74, 05, 37][88 62, 05, 3D][23 34, 05, 3D][88 46, 05, 3D][88 70, 05, 3D] +3317; [88 2C, 05, 37][88 74, 05, 37][88 76, 05, 3D][88 42, 05, 3D][88 46, 05, 3D] + +304F; [88 2E, 05, 9B] +31F0; [88 2E, 05, 1D] +30AF; [88 2E, 05, A1] +FF78; [88 2E, 05, A3] +32D7; [88 2E, 05, 25] +3050; [88 2E, 05, 9B][, DC 2D, 05] +30B0; [88 2E, 05, A1][, DC 2D, 05] +3318; [88 2E, 05, 37][, DC 2D, 37][88 6C, 05, 3D][88 60, 05, 3D] +3319; [88 2E, 05, 37][, DC 2D, 37][88 6C, 05, 3D][88 60, 05, 3D][88 46, 05, 3D][88 7E, 05, 3D] +331A; [88 2E, 05, 37][88 70, 05, 37][88 3A, 05, 3D][, DC 2D, 3D][88 22, 05, 3D][88 74, 05, 3D] +331B; [88 2E, 05, 37][88 74, 05, 37][23 34, 05, 3D][88 4E, 05, 3D] + +3096; [88 30, 05, 19] +3051; [88 30, 05, 9B] +30F6; [88 30, 05, 1D] +30B1; [88 30, 05, A1] +FF79; [88 30, 05, A3] +32D8; [88 30, 05, 25] +3052; [88 30, 05, 9B][, DC 2D, 05] +30B2; [88 30, 05, A1][, DC 2D, 05] +331C; [88 30, 05, 37][23 34, 05, 37][88 38, 05, 3D] + +3053; [88 32, 05, 9B] +30B3; [88 32, 05, A1] +FF7A; [88 32, 05, A3] +32D9; [88 32, 05, 25] +3054; [88 32, 05, 9B][, DC 2D, 05] +30B4; [88 32, 05, A1][, DC 2D, 05] +331E; [88 32, 05, 37][23 34, 05, 37][88 5A, 05, 3D][, DC 3D, 3D] +30FF; [88 32, 05, 2B][88 46, 05, 2B] +331D; [88 32, 05, 37][88 70, 05, 37][88 48, 05, 3D] + +3055; [88 34, 05, 9B] +30B5; [88 34, 05, A1] +FF7B; [88 34, 05, A3] +32DA; [88 34, 05, 25] +3056; [88 34, 05, 9B][, DC 2D, 05] +30B6; [88 34, 05, A1][, DC 2D, 05] +331F; [88 34, 05, 37][88 22, 05, 37][88 2E, 05, 3D][88 70, 05, 3D] +3320; [88 34, 05, 37][88 7E, 05, 37][88 40, 05, 3D][23 34, 05, 3D][88 60, 05, 3D] + +3057; [88 36, 05, 9B] +31F1; [88 36, 05, 1D] +30B7; [88 36, 05, A1] +FF7C; [88 36, 05, A3] +32DB; [88 36, 05, 25] +3058; [88 36, 05, 9B][, DC 2D, 05] +30B8; [88 36, 05, A1][, DC 2D, 05] +3006; [88 36, 05, 09][88 62, 05, 09] +3321; [88 36, 05, 37][88 6E, 05, 37][88 7E, 05, 3D][88 2E, 05, 3D][, DC 2D, 3D] + +3059; [88 38, 05, 9B] +31F2; [88 38, 05, 1D] +30B9; [88 38, 05, A1] +FF7D; [88 38, 05, A3] +32DC; [88 38, 05, 25] +305A; [88 38, 05, 9B][, DC 2D, 05] +30BA; [88 38, 05, A1][, DC 2D, 05] + +305B; [88 3A, 05, 9B] +30BB; [88 3A, 05, A1] +FF7E; [88 3A, 05, A3] +32DD; [88 3A, 05, 25] +305C; [88 3A, 05, 9B][, DC 2D, 05] +30BC; [88 3A, 05, A1][, DC 2D, 05] +3322; [88 3A, 05, 37][88 7E, 05, 37][88 40, 05, 3D] +3323; [88 3A, 05, 37][88 7E, 05, 37][88 46, 05, 3D] + +305D; [88 3C, 05, 9B] +30BD; [88 3C, 05, A1] +FF7F; [88 3C, 05, A3] +32DE; [88 3C, 05, 25] +305E; [88 3C, 05, 9B][, DC 2D, 05] +30BE; [88 3C, 05, A1][, DC 2D, 05] + +305F; [88 3E, 05, 9B] +30BF; [88 3E, 05, A1] +FF80; [88 3E, 05, A3] +32DF; [88 3E, 05, 25] +3060; [88 3E, 05, 9B][, DC 2D, 05] +30C0; [88 3E, 05, A1][, DC 2D, 05] +3324; [88 3E, 05, 37][, DC 2D, 37][23 34, 05, 3D][88 38, 05, 3D] + +3061; [88 40, 05, 9B] +30C1; [88 40, 05, A1] +FF81; [88 40, 05, A3] +32E0; [88 40, 05, 25] +3062; [88 40, 05, 9B][, DC 2D, 05] +30C2; [88 40, 05, A1][, DC 2D, 05] + +3063; [88 42, 05, 19] +3064; [88 42, 05, 9B] +30C3; [88 42, 05, 1D] +FF6F; [88 42, 05, 1F] +30C4; [88 42, 05, A1] +FF82; [88 42, 05, A3] +32E1; [88 42, 05, 25] +3065; [88 42, 05, 9B][, DC 2D, 05] +30C5; [88 42, 05, A1][, DC 2D, 05] + +3066; [88 44, 05, 9B] +30C6; [88 44, 05, A1] +FF83; [88 44, 05, A3] +32E2; [88 44, 05, 25] +3067; [88 44, 05, 9B][, DC 2D, 05] +30C7; [88 44, 05, A1][, DC 2D, 05] +3325; [88 44, 05, 37][, DC 2D, 37][88 36, 05, 3D] + +3068; [88 46, 05, 9B] +31F3; [88 46, 05, 1D] +30C8; [88 46, 05, A1] +FF84; [88 46, 05, A3] +32E3; [88 46, 05, 25] +3069; [88 46, 05, 9B][, DC 2D, 05] +30C9; [88 46, 05, A1][, DC 2D, 05] +3326; [88 46, 05, 37][, DC 2D, 37][88 70, 05, 3D] +3327; [88 46, 05, 37][88 7E, 05, 37] + +306A; [88 48, 05, 9B] +30CA; [88 48, 05, A1] +FF85; [88 48, 05, A3] +32E4; [88 48, 05, 25] +3328; [88 48, 05, 37][88 50, 05, 37] + +306B; [88 4A, 05, 9B] +30CB; [88 4A, 05, A1] +FF86; [88 4A, 05, A3] +32E5; [88 4A, 05, 25] + +306C; [88 4C, 05, 9B] +31F4; [88 4C, 05, 1D] +30CC; [88 4C, 05, A1] +FF87; [88 4C, 05, A3] +32E6; [88 4C, 05, 25] + +306D; [88 4E, 05, 9B] +30CD; [88 4E, 05, A1] +FF88; [88 4E, 05, A3] +32E7; [88 4E, 05, 25] + +306E; [88 50, 05, 9B] +30CE; [88 50, 05, A1] +FF89; [88 50, 05, A3] +32E8; [88 50, 05, 25] +3329; [88 50, 05, 37][88 42, 05, 37][88 46, 05, 3D] + +306F; [88 52, 05, 9B] +31F5; [88 52, 05, 1D] +30CF; [88 52, 05, A1] +FF8A; [88 52, 05, A3] +32E9; [88 52, 05, 25] +3070; [88 52, 05, 9B][, DC 2D, 05] +30D0; [88 52, 05, A1][, DC 2D, 05] +3071; [88 52, 05, 9B][, DC 3D, 05] +30D1; [88 52, 05, A1][, DC 3D, 05] +332B; [88 52, 05, 37][, DC 3D, 37][23 34, 05, 3D][88 3A, 05, 3D][88 7E, 05, 3D][88 46, 05, 3D] +332C; [88 52, 05, 37][, DC 3D, 37][23 34, 05, 3D][88 42, 05, 3D] +332D; [88 52, 05, 37][, DC 2D, 37][23 34, 05, 3D][88 72, 05, 3D][88 70, 05, 3D] +332A; [88 52, 05, 37][88 22, 05, 37][88 42, 05, 3D] + +3072; [88 54, 05, 9B] +31F6; [88 54, 05, 1D] +30D2; [88 54, 05, A1] +FF8B; [88 54, 05, A3] +32EA; [88 54, 05, 25] +3073; [88 54, 05, 9B][, DC 2D, 05] +30D3; [88 54, 05, A1][, DC 2D, 05] +3074; [88 54, 05, 9B][, DC 3D, 05] +30D4; [88 54, 05, A1][, DC 3D, 05] +332E; [88 54, 05, 37][, DC 3D, 37][88 20, 05, 3D][88 38, 05, 3D][88 46, 05, 3D][88 70, 05, 3D] +332F; [88 54, 05, 37][, DC 3D, 37][88 2E, 05, 3D][88 70, 05, 3D] +3330; [88 54, 05, 37][, DC 3D, 37][88 32, 05, 3D] +3331; [88 54, 05, 37][, DC 2D, 37][88 70, 05, 3D] + +3075; [88 56, 05, 9B] +31F7; [88 56, 05, 1D] +30D5; [88 56, 05, A1] +FF8C; [88 56, 05, A3] +32EB; [88 56, 05, 25] +3076; [88 56, 05, 9B][, DC 2D, 05] +30D6; [88 56, 05, A1][, DC 2D, 05] +3077; [88 56, 05, 9B][, DC 3D, 05] +30D7; [88 56, 05, A1][, DC 3D, 05] +3332; [88 56, 05, 37][88 20, 05, 37][88 6C, 05, 3D][88 42, 05, 3D][88 46, 05, 3D][, DC 2D, 3D] +3333; [88 56, 05, 37][88 22, 05, 37][23 34, 05, 3D][88 46, 05, 3D] +3334; [88 56, 05, 37][, DC 2D, 37][88 42, 05, 3D][88 36, 05, 3D][88 26, 05, 3D][88 70, 05, 3D] +3335; [88 56, 05, 37][88 6C, 05, 37][88 7E, 05, 3D] + +3078; [88 58, 05, 9B] +31F8; [88 58, 05, 1D] +30D8; [88 58, 05, A1] +FF8D; [88 58, 05, A3] +32EC; [88 58, 05, 25] +3079; [88 58, 05, 9B][, DC 2D, 05] +30D9; [88 58, 05, A1][, DC 2D, 05] +307A; [88 58, 05, 9B][, DC 3D, 05] +30DA; [88 58, 05, A1][, DC 3D, 05] +333B; [88 58, 05, 37][, DC 3D, 37][23 34, 05, 3D][88 36, 05, 3D][, DC 2D, 3D] +333C; [88 58, 05, 37][, DC 2D, 37][23 34, 05, 3D][88 3E, 05, 3D] +3336; [88 58, 05, 37][88 2E, 05, 37][88 3E, 05, 3D][23 34, 05, 3D][88 70, 05, 3D] +3337; [88 58, 05, 37][, DC 3D, 37][88 3C, 05, 3D] +3338; [88 58, 05, 37][, DC 3D, 37][88 4A, 05, 3D][88 54, 05, 3D] +3339; [88 58, 05, 37][88 70, 05, 37][88 42, 05, 3D] +333A; [88 58, 05, 37][, DC 3D, 37][88 7E, 05, 3D][88 38, 05, 3D] + +307B; [88 5A, 05, 9B] +31F9; [88 5A, 05, 1D] +30DB; [88 5A, 05, A1] +FF8E; [88 5A, 05, A3] +32ED; [88 5A, 05, 25] +307C; [88 5A, 05, 9B][, DC 2D, 05] +30DC; [88 5A, 05, A1][, DC 2D, 05] +307D; [88 5A, 05, 9B][, DC 3D, 05] +30DD; [88 5A, 05, A1][, DC 3D, 05] +3341; [88 5A, 05, 37][23 34, 05, 37][88 70, 05, 3D] +3342; [88 5A, 05, 37][23 34, 05, 37][88 7E, 05, 3D] +333D; [88 5A, 05, 37][, DC 3D, 37][88 22, 05, 3D][88 7E, 05, 3D][88 46, 05, 3D] +333E; [88 5A, 05, 37][, DC 2D, 37][88 70, 05, 3D][88 46, 05, 3D] +333F; [88 5A, 05, 37][88 7E, 05, 37] +3340; [88 5A, 05, 37][, DC 3D, 37][88 7E, 05, 3D][88 46, 05, 3D][, DC 2D, 3D] + +307E; [88 5C, 05, 9B] +30DE; [88 5C, 05, A1] +FF8F; [88 5C, 05, A3] +32EE; [88 5C, 05, 25] +3343; [88 5C, 05, 37][88 22, 05, 37][88 2E, 05, 3D][88 74, 05, 3D] +3344; [88 5C, 05, 37][88 22, 05, 37][88 70, 05, 3D] +303C; [88 5C, 05, 09][88 38, 05, 09] +3345; [88 5C, 05, 37][88 42, 05, 37][88 52, 05, 3D] +3346; [88 5C, 05, 37][88 70, 05, 37][88 2E, 05, 3D] +3347; [88 5C, 05, 37][88 7E, 05, 37][88 36, 05, 3D][88 6A, 05, 3D][88 7E, 05, 3D] + +307F; [88 5E, 05, 9B] +30DF; [88 5E, 05, A1] +FF90; [88 5E, 05, A3] +32EF; [88 5E, 05, 25] +3348; [88 5E, 05, 37][88 2E, 05, 37][88 74, 05, 3D][88 7E, 05, 3D] +3349; [88 5E, 05, 37][88 6E, 05, 37] +334A; [88 5E, 05, 37][88 6E, 05, 37][88 52, 05, 3D][, DC 2D, 3D][23 34, 05, 3D][88 70, 05, 3D] + +3080; [88 60, 05, 9B] +31FA; [88 60, 05, 1D] +30E0; [88 60, 05, A1] +FF91; [88 60, 05, A3] +32F0; [88 60, 05, 25] + +3081; [88 62, 05, 9B] +30E1; [88 62, 05, A1] +FF92; [88 62, 05, A3] +32F1; [88 62, 05, 25] +334D; [88 62, 05, 37][23 34, 05, 37][88 46, 05, 3D][88 70, 05, 3D] +334B; [88 62, 05, 37][88 2A, 05, 37][, DC 2D, 3D] +334C; [88 62, 05, 37][88 2A, 05, 37][, DC 2D, 3D][88 46, 05, 3D][88 7E, 05, 3D] + +3082; [88 64, 05, 9B] +30E2; [88 64, 05, A1] +FF93; [88 64, 05, A3] +32F2; [88 64, 05, 25] + +3083; [88 66, 05, 19] +3084; [88 66, 05, 9B] +30E3; [88 66, 05, 1D] +FF6C; [88 66, 05, 1F] +30E4; [88 66, 05, A1] +FF94; [88 66, 05, A3] +32F3; [88 66, 05, 25] +334E; [88 66, 05, 37][23 34, 05, 37][88 46, 05, 3D][, DC 2D, 3D] +334F; [88 66, 05, 37][23 34, 05, 37][88 70, 05, 3D] + +3085; [88 68, 05, 19] +3086; [88 68, 05, 9B] +30E5; [88 68, 05, 1D] +FF6D; [88 68, 05, 1F] +30E6; [88 68, 05, A1] +FF95; [88 68, 05, A3] +32F4; [88 68, 05, 25] +3350; [88 68, 05, 37][88 20, 05, 37][88 7E, 05, 3D] + +3087; [88 6A, 05, 19] +3088; [88 6A, 05, 9B] +30E7; [88 6A, 05, 1D] +FF6E; [88 6A, 05, 1F] +30E8; [88 6A, 05, A1] +FF96; [88 6A, 05, A3] +32F5; [88 6A, 05, 25] +309F; [88 6A, 05, 2B][88 6E, 05, 2B] + +3089; [88 6C, 05, 9B] +31FB; [88 6C, 05, 1D] +30E9; [88 6C, 05, A1] +FF97; [88 6C, 05, A3] +32F6; [88 6C, 05, 25] + +308A; [88 6E, 05, 9B] +31FC; [88 6E, 05, 1D] +30EA; [88 6E, 05, A1] +FF98; [88 6E, 05, A3] +32F7; [88 6E, 05, 25] +3351; [88 6E, 05, 37][88 42, 05, 37][88 46, 05, 3D][88 70, 05, 3D] +3352; [88 6E, 05, 37][88 6C, 05, 37] + +308B; [88 70, 05, 9B] +31FD; [88 70, 05, 1D] +30EB; [88 70, 05, A1] +FF99; [88 70, 05, A3] +32F8; [88 70, 05, 25] +3354; [88 70, 05, 37][23 34, 05, 37][88 56, 05, 3D][, DC 2D, 3D][88 70, 05, 3D] +3353; [88 70, 05, 37][88 54, 05, 37][, DC 3D, 3D][23 34, 05, 3D] + +308C; [88 72, 05, 9B] +31FE; [88 72, 05, 1D] +30EC; [88 72, 05, A1] +FF9A; [88 72, 05, A3] +32F9; [88 72, 05, 25] +3355; [88 72, 05, 37][88 60, 05, 37] +3356; [88 72, 05, 37][88 7E, 05, 37][88 46, 05, 3D][88 30, 05, 3D][, DC 2D, 3D][88 7E, 05, 3D] + +308D; [88 74, 05, 9B] +31FF; [88 74, 05, 1D] +30ED; [88 74, 05, A1] +FF9B; [88 74, 05, A3] +32FA; [88 74, 05, 25] + +308E; [88 76, 05, 19] +308F; [88 76, 05, 9B] +30EE; [88 76, 05, 1D] +30EF; [88 76, 05, A1] +FF9C; [88 76, 05, A3] +32FB; [88 76, 05, 25] +30F7; [88 76, 05, A1][, DC 2D, 05] +3357; [88 76, 05, 37][88 42, 05, 37][88 46, 05, 3D] -0D8C; [67 2E, 05, 05] +3090; [88 78, 05, 9B] +30F0; [88 78, 05, A1] +32FC; [88 78, 05, 25] +30F8; [88 78, 05, A1][, DC 2D, 05] -0D8D; [67 30, 05, 05] +3091; [88 7A, 05, 9B] +30F1; [88 7A, 05, A1] +32FD; [88 7A, 05, 25] +30F9; [88 7A, 05, A1][, DC 2D, 05] -0D8E; [67 32, 05, 05] +3092; [88 7C, 05, 9B] +30F2; [88 7C, 05, A1] +FF66; [88 7C, 05, A3] +32FE; [88 7C, 05, 25] +30FA; [88 7C, 05, A1][, DC 2D, 05] -0D8F; [67 34, 05, 05] +3093; [88 7E, 05, 9B] +30F3; [88 7E, 05, A1] +FF9D; [88 7E, 05, A3] -0D90; [67 36, 05, 05] +3105; [89 20, 05, 05] +31A0; [89 20, 05, 09][, E0 9D, 09] -0D91; [67 38, 05, 05] +3106; [89 22, 05, 05] +31B4; [89 22, 05, 31] -0D92; [67 3A, 05, 05] +3107; [89 24, 05, 05] -0D93; [67 3C, 05, 05] +3108; [89 26, 05, 05] -0D94; [67 3E, 05, 05] +312A; [89 28, 05, 05] -0D95; [67 40, 05, 05] +3109; [89 2A, 05, 05] -0D96; [67 42, 05, 05] +310A; [89 2C, 05, 05] +31B5; [89 2C, 05, 31] -0D9A; [67 44, 05, 05] +310B; [89 2E, 05, 05] -0D9B; [67 46, 05, 05] +310C; [89 30, 05, 05] -0D9C; [67 48, 05, 05] +310D; [89 32, 05, 05] +31A3; [89 32, 05, 09][, E0 9D, 09] -0D9D; [67 4A, 05, 05] +310E; [89 34, 05, 05] +31B6; [89 34, 05, 31] -0D9E; [67 4C, 05, 05] +312B; [89 36, 05, 05] -0D9F; [67 4E, 05, 05] +31AD; [89 38, 05, 05] -0DA0; [67 50, 05, 05] +310F; [89 3A, 05, 05] +31B7; [89 3A, 05, 31] -0DA1; [67 52, 05, 05] +3110; [89 3C, 05, 05] +31A2; [89 3C, 05, 09][, E0 9D, 09] -0DA2; [67 54, 05, 05] +3111; [89 3E, 05, 05] -0DA3; [67 56, 05, 05] +3112; [89 40, 05, 05] -0DA4; [67 58, 05, 05] +312C; [89 42, 05, 05] -0DA5; [67 5A, 05, 05] +3113; [89 44, 05, 05] -0DA6; [67 5C, 05, 05] +3114; [89 46, 05, 05] -0DA7; [67 5E, 05, 05] +3115; [89 48, 05, 05] -0DA8; [67 60, 05, 05] +3116; [89 4A, 05, 05] -0DA9; [67 62, 05, 05] +3117; [89 4C, 05, 05] +31A1; [89 4C, 05, 09][, E0 9D, 09] -0DAA; [67 64, 05, 05] +3118; [89 4E, 05, 05] -0DAB; [67 66, 05, 05] +3119; [89 50, 05, 05] -0DAC; [67 68, 05, 05] +311A; [89 52, 05, 05] +31A9; [89 52, 05, 09][, E0 9D, 09] -0DAD; [67 6A, 05, 05] +311B; [89 54, 05, 05] +31A7; [89 54, 05, 09][, E0 9D, 09] -0DAE; [67 6C, 05, 05] +31A6; [89 56, 05, 05] -0DAF; [67 6E, 05, 05] +311C; [89 58, 05, 05] -0DB0; [67 70, 05, 05] +311D; [89 5A, 05, 05] -0DB1; [67 72, 05, 05] +31A4; [89 5C, 05, 05] +31A5; [89 5C, 05, 09][, E0 9D, 09] -0DB3; [67 74, 05, 05] +311E; [89 5E, 05, 05] +31AE; [89 5E, 05, 09][, E0 9D, 09] -0DB4; [67 76, 05, 05] +311F; [89 60, 05, 05] -0DB5; [67 78, 05, 05] +3120; [89 62, 05, 05] +31AF; [89 62, 05, 09][, E0 9D, 09] -0DB6; [67 7A, 05, 05] +3121; [89 64, 05, 05] -0DB7; [67 7C, 05, 05] +3122; [89 66, 05, 05] -0DB8; [67 7E, 05, 05] +3123; [89 68, 05, 05] -0DB9; [67 80, 05, 05] +3124; [89 6A, 05, 05] -0DBA; [67 82, 05, 05] +31B2; [89 6C, 05, 05] -0DBB; [67 84, 05, 05] +3125; [89 6E, 05, 05] -0DBD; [67 86, 05, 05] +31B0; [89 70, 05, 05] -0DC0; [67 88, 05, 05] +31B1; [89 72, 05, 05] -0DC1; [67 8A, 05, 05] +31AC; [89 74, 05, 05] -0DC2; [67 8C, 05, 05] +3126; [89 76, 05, 05] -0DC3; [67 8E, 05, 05] +3127; [89 78, 05, 05] +31AA; [89 78, 05, 09][, E0 9D, 09] +31B3; [89 78, 05, 2B][, E0 9D, 2B] -0DC4; [67 90, 05, 05] +3128; [89 7A, 05, 05] +31AB; [89 7A, 05, 09][, E0 9D, 09] +31A8; [89 7A, 05, 09][, E0 AD, 09] -0DC5; [67 92, 05, 05] +3129; [89 7C, 05, 05] -0DC6; [67 94, 05, 05] +A000; [8A 20, 05, 05] -0DCA; [67 96, 05, 05] +A001; [8A 22, 05, 05] -0DCF; [67 98, 05, 05] +A002; [8A 24, 05, 05] -0DD0; [67 9A, 05, 05] +A003; [8A 26, 05, 05] -0DD1; [67 9C, 05, 05] +A004; [8A 28, 05, 05] -0DD2; [67 9E, 05, 05] +A005; [8A 2A, 05, 05] -0DD3; [67 A0, 05, 05] +A006; [8A 2C, 05, 05] -0DD4; [67 A2, 05, 05] +A007; [8A 2E, 05, 05] -0DD6; [67 A4, 05, 05] +A008; [8A 30, 05, 05] -0DD8; [67 A6, 05, 05] +A009; [8A 32, 05, 05] -0DD9; [67 A8, 05, 05] +A00A; [8A 34, 05, 05] -0DD9 0DCA; [67 AA, 05, 05] -0DDA; [67 AA, 05, 05] +A00B; [8A 36, 05, 05] -0DDB; [67 AC, 05, 05] +A00C; [8A 38, 05, 05] -0DD9 0DCF; [67 AE, 05, 05] -0DDC; [67 AE, 05, 05] +A00D; [8A 3A, 05, 05] -0DD9 0DCF 0DCA; [67 B0, 05, 05] -0DDC 0DCA; [67 B0, 05, 05] -0DDD; [67 B0, 05, 05] +A00E; [8A 3C, 05, 05] -0DD9 0DDF; [67 B2, 05, 05] -0DDE; [67 B2, 05, 05] +A00F; [8A 3E, 05, 05] -0DDF; [67 B4, 05, 05] +A010; [8A 40, 05, 05] -0DF2; [67 B6, 05, 05] +A011; [8A 42, 05, 05] -0DF3; [67 B8, 05, 05] +A012; [8A 44, 05, 05] -0E01; [68 20, 05, 05] +A013; [8A 46, 05, 05] -0E02; [68 22, 05, 05] +A014; [8A 48, 05, 05] -0E03; [68 24, 05, 05] +A015; [8A 4A, 05, 05] -0E04; [68 26, 05, 05] +A016; [8A 4C, 05, 05] -0E05; [68 28, 05, 05] +A017; [8A 4E, 05, 05] -0E06; [68 2A, 05, 05] +A018; [8A 50, 05, 05] -0E07; [68 2C, 05, 05] +A019; [8A 52, 05, 05] -0E08; [68 2E, 05, 05] +A01A; [8A 54, 05, 05] -0E09; [68 30, 05, 05] +A01B; [8A 56, 05, 05] -0E0A; [68 32, 05, 05] +A01C; [8A 58, 05, 05] -0E0B; [68 34, 05, 05] +A01D; [8A 5A, 05, 05] -0E0C; [68 36, 05, 05] +A01E; [8A 5C, 05, 05] -0E0D; [68 38, 05, 05] +A01F; [8A 5E, 05, 05] -0E0E; [68 3A, 05, 05] +A020; [8A 60, 05, 05] -0E0F; [68 3C, 05, 05] +A021; [8A 62, 05, 05] -0E10; [68 3E, 05, 05] +A022; [8A 64, 05, 05] -0E11; [68 40, 05, 05] +A023; [8A 66, 05, 05] -0E12; [68 42, 05, 05] +A024; [8A 68, 05, 05] -0E13; [68 44, 05, 05] +A025; [8A 6A, 05, 05] -0E14; [68 46, 05, 05] +A026; [8A 6C, 05, 05] -0E15; [68 48, 05, 05] +A027; [8A 6E, 05, 05] -0E16; [68 4A, 05, 05] +A028; [8A 70, 05, 05] -0E17; [68 4C, 05, 05] +A029; [8A 72, 05, 05] -0E18; [68 4E, 05, 05] +A02A; [8A 74, 05, 05] -0E19; [68 50, 05, 05] +A02B; [8A 76, 05, 05] -0E1A; [68 52, 05, 05] +A02C; [8A 78, 05, 05] -0E1B; [68 54, 05, 05] +A02D; [8A 7A, 05, 05] -0E1C; [68 56, 05, 05] +A02E; [8A 7C, 05, 05] -0E1D; [68 58, 05, 05] +A02F; [8A 7E, 05, 05] -0E1E; [68 5A, 05, 05] +A030; [8A 80, 05, 05] -0E1F; [68 5C, 05, 05] +A031; [8A 82, 05, 05] -0E20; [68 5E, 05, 05] +A032; [8A 84, 05, 05] -0E21; [68 60, 05, 05] +A033; [8A 86, 05, 05] -0E22; [68 62, 05, 05] +A034; [8A 88, 05, 05] -0E23; [68 64, 05, 05] +A035; [8A 8A, 05, 05] -0E24; [68 66, 05, 05] +A036; [8A 8C, 05, 05] -0E25; [68 68, 05, 05] +A037; [8A 8E, 05, 05] -0E26; [68 6A, 05, 05] +A038; [8A 90, 05, 05] -0E27; [68 6C, 05, 05] +A039; [8A 92, 05, 05] -0E28; [68 6E, 05, 05] +A03A; [8A 94, 05, 05] -0E29; [68 70, 05, 05] +A03B; [8A 96, 05, 05] -0E2A; [68 72, 05, 05] +A03C; [8A 98, 05, 05] -0E2B; [68 74, 05, 05] +A03D; [8A 9A, 05, 05] -0E2C; [68 76, 05, 05] +A03E; [8A 9C, 05, 05] -0E2D; [68 78, 05, 05] +A03F; [8A 9E, 05, 05] -0E2E; [68 7A, 05, 05] +A040; [8A A0, 05, 05] -0E2F; [68 7C, 05, 05] +A041; [8A A2, 05, 05] -0E30; [68 7E, 05, 05] +A042; [8A A4, 05, 05] -0E31; [68 80, 05, 05] +A043; [8A A6, 05, 05] -0E32; [68 82, 05, 05] +A044; [8A A8, 05, 05] -0E33; [68 84, 05, 05] -0E4D 0E32; [68 84, 05, 05] +A045; [8A AA, 05, 05] -0E34; [68 86, 05, 05] +A046; [8A AC, 05, 05] -0E35; [68 88, 05, 05] +A047; [8A AE, 05, 05] -0E36; [68 8A, 05, 05] +A048; [8A B0, 05, 05] -0E37; [68 8C, 05, 05] +A049; [8A B2, 05, 05] -0E38; [68 8E, 05, 05] +A04A; [8A B4, 05, 05] -0E39; [68 90, 05, 05] +A04B; [8A B6, 05, 05] -0E3A; [68 92, 05, 05] +A04C; [8A B8, 05, 05] -0E40; [68 94, 05, 05] +A04D; [8A BA, 05, 05] -0E41; [68 96, 05, 05] +A04E; [8A BC, 05, 05] -0E42; [68 98, 05, 05] +A04F; [8A BE, 05, 05] -0E43; [68 9A, 05, 05] +A050; [8A C0, 05, 05] -0E44; [68 9C, 05, 05] +A051; [8A C2, 05, 05] -0E45; [68 9E, 05, 05] +A052; [8A C4, 05, 05] -0E4C; [68 A0, 05, 05] +A053; [8A C6, 05, 05] -0E4D; [68 A2, 05, 05] +A054; [8A C8, 05, 05] -0E81; [69 20, 05, 05] +A055; [8A CA, 05, 05] -0E82; [69 22, 05, 05] +A056; [8A CC, 05, 05] -0E84; [69 24, 05, 05] +A057; [8A CE, 05, 05] -0E87; [69 26, 05, 05] +A058; [8A D0, 05, 05] -0E88; [69 28, 05, 05] +A059; [8A D2, 05, 05] -0E8A; [69 2A, 05, 05] +A05A; [8A D4, 05, 05] -0E8D; [69 2C, 05, 05] +A05B; [8A D6, 05, 05] -0E94; [69 2E, 05, 05] +A05C; [8A D8, 05, 05] -0E95; [69 30, 05, 05] +A05D; [8A DA, 05, 05] -0E96; [69 32, 05, 05] +A05E; [8A DC, 05, 05] -0E97; [69 34, 05, 05] +A05F; [8A DE, 05, 05] -0E99; [69 36, 05, 05] +A060; [8A E0, 05, 05] -0E9A; [69 38, 05, 05] +A061; [8A E2, 05, 05] -0E9B; [69 3A, 05, 05] +A062; [8A E4, 05, 05] -0E9C; [69 3C, 05, 05] +A063; [8A E6, 05, 05] -0E9D; [69 3E, 05, 05] +A064; [8A E8, 05, 05] -0E9E; [69 40, 05, 05] +A065; [8A EA, 05, 05] -0E9F; [69 42, 05, 05] +A066; [8A EC, 05, 05] -0EA1; [69 44, 05, 05] +A067; [8A EE, 05, 05] -0EA2; [69 46, 05, 05] +A068; [8A F0, 05, 05] -0EA3; [69 48, 05, 05] +A069; [8A F2, 05, 05] -0EA5; [69 4A, 05, 05] +A06A; [8A F4, 05, 05] -0EA7; [69 4C, 05, 05] +A06B; [8A F6, 05, 05] -0EAA; [69 4E, 05, 05] +A06C; [8A F8, 05, 05] -0EAB; [69 50, 05, 05] -0EDC; [69 50, 05, 09][69 36, 05, 09] -0EDD; [69 50, 05, 09][69 44, 05, 09] +A06D; [8A FA, 05, 05] -0EAD; [69 52, 05, 05] +A06E; [8A FC, 05, 05] -0EAE; [69 54, 05, 05] +A06F; [8A FE, 05, 05] -0EAF; [69 56, 05, 05] +A070; [8B 05, 05, 05] -0EB0; [69 58, 05, 05] +A071; [8B 07, 05, 05] -0EB1; [69 5A, 05, 05] +A072; [8B 09, 05, 05] -0EB2; [69 5C, 05, 05] +A073; [8B 0B, 05, 05] -0EB3; [69 5E, 05, 05] -0ECD 0EB2; [69 5E, 05, 05] +A074; [8B 0D, 05, 05] -0EB4; [69 60, 05, 05] +A075; [8B 0F, 05, 05] -0EB5; [69 62, 05, 05] +A076; [8B 11, 05, 05] -0EB6; [69 64, 05, 05] +A077; [8B 13, 05, 05] -0EB7; [69 66, 05, 05] +A078; [8B 15, 05, 05] -0EB8; [69 68, 05, 05] +A079; [8B 17, 05, 05] -0EB9; [69 6A, 05, 05] +A07A; [8B 19, 05, 05] -0EBB; [69 6C, 05, 05] +A07B; [8B 1B, 05, 05] -0EBC; [69 6E, 05, 05] +A07C; [8B 1D, 05, 05] -0EBD; [69 70, 05, 05] +A07D; [8B 1F, 05, 05] -0EC0; [69 72, 05, 05] +A07E; [8B 21, 05, 05] -0EC1; [69 74, 05, 05] +A07F; [8B 23, 05, 05] -0EC2; [69 76, 05, 05] +A080; [8B 25, 05, 05] -0EC3; [69 78, 05, 05] +A081; [8B 27, 05, 05] -0EC4; [69 7A, 05, 05] +A082; [8B 29, 05, 05] -0ECC; [69 7C, 05, 05] +A083; [8B 2B, 05, 05] -0ECD; [69 7E, 05, 05] +A084; [8B 2D, 05, 05] -0F40; [6A 20, 05, 05] -0F69; [6A 20, 05, 05][6A 9E, 05, 05] +A085; [8B 2F, 05, 05] -0F90; [6A 22, 05, 05] -0FB9; [6A 22, 05, 05][6A 9E, 05, 05] +A086; [8B 31, 05, 05] -0F41; [6A 24, 05, 05] +A087; [8B 33, 05, 05] -0F91; [6A 26, 05, 05] +A088; [8B 35, 05, 05] -0F42; [6A 28, 05, 05] -0F43; [6A 28, 05, 05][6A A6, 05, 05] +A089; [8B 37, 05, 05] -0F92; [6A 2A, 05, 05] -0F93; [6A 2A, 05, 05][6A A6, 05, 05] +A08A; [8B 39, 05, 05] -0F44; [6A 2C, 05, 05] +A08B; [8B 3B, 05, 05] -0F94; [6A 2E, 05, 05] +A08C; [8B 3D, 05, 05] -0F45; [6A 30, 05, 05] +A08D; [8B 3F, 05, 05] -0F95; [6A 32, 05, 05] +A08E; [8B 41, 05, 05] -0F46; [6A 34, 05, 05] +A08F; [8B 43, 05, 05] -0F96; [6A 36, 05, 05] +A090; [8B 45, 05, 05] -0F47; [6A 38, 05, 05] +A091; [8B 47, 05, 05] -0F97; [6A 3A, 05, 05] +A092; [8B 49, 05, 05] -0F49; [6A 3C, 05, 05] +A093; [8B 4B, 05, 05] -0F99; [6A 3E, 05, 05] +A094; [8B 4D, 05, 05] -0F4A; [6A 40, 05, 05] +A095; [8B 4F, 05, 05] -0F9A; [6A 42, 05, 05] +A096; [8B 51, 05, 05] -0F4B; [6A 44, 05, 05] +A097; [8B 53, 05, 05] -0F9B; [6A 46, 05, 05] +A098; [8B 55, 05, 05] -0F4C; [6A 48, 05, 05] -0F4D; [6A 48, 05, 05][6A A6, 05, 05] +A099; [8B 57, 05, 05] -0F9C; [6A 4A, 05, 05] -0F9D; [6A 4A, 05, 05][6A A6, 05, 05] +A09A; [8B 59, 05, 05] -0F4E; [6A 4C, 05, 05] +A09B; [8B 5B, 05, 05] -0F9E; [6A 4E, 05, 05] +A09C; [8B 5D, 05, 05] -0F4F; [6A 50, 05, 05] +A09D; [8B 5F, 05, 05] -0F9F; [6A 52, 05, 05] +A09E; [8B 61, 05, 05] -0F50; [6A 54, 05, 05] +A09F; [8B 63, 05, 05] -0FA0; [6A 56, 05, 05] +A0A0; [8B 65, 05, 05] -0F51; [6A 58, 05, 05] -0F52; [6A 58, 05, 05][6A A6, 05, 05] +A0A1; [8B 67, 05, 05] -0FA1; [6A 5A, 05, 05] -0FA2; [6A 5A, 05, 05][6A A6, 05, 05] +A0A2; [8B 69, 05, 05] -0F53; [6A 5C, 05, 05] +A0A3; [8B 6B, 05, 05] -0FA3; [6A 5E, 05, 05] +A0A4; [8B 6D, 05, 05] -0F54; [6A 60, 05, 05] +A0A5; [8B 6F, 05, 05] -0FA4; [6A 62, 05, 05] +A0A6; [8B 71, 05, 05] -0F55; [6A 64, 05, 05] +A0A7; [8B 73, 05, 05] -0FA5; [6A 66, 05, 05] +A0A8; [8B 75, 05, 05] -0F56; [6A 68, 05, 05] -0F57; [6A 68, 05, 05][6A A6, 05, 05] +A0A9; [8B 77, 05, 05] -0FA6; [6A 6A, 05, 05] -0FA7; [6A 6A, 05, 05][6A A6, 05, 05] +A0AA; [8B 79, 05, 05] -0F58; [6A 6C, 05, 05] +A0AB; [8B 7B, 05, 05] -0FA8; [6A 6E, 05, 05] +A0AC; [8B 7D, 05, 05] -0F59; [6A 70, 05, 05] +A0AD; [8B 7F, 05, 05] -0FA9; [6A 72, 05, 05] +A0AE; [8B 81, 05, 05] -0F5A; [6A 74, 05, 05] +A0AF; [8B 83, 05, 05] -0FAA; [6A 76, 05, 05] +A0B0; [8B 85, 05, 05] -0F5B; [6A 78, 05, 05] -0F5C; [6A 78, 05, 05][6A A6, 05, 05] +A0B1; [8B 87, 05, 05] -0FAB; [6A 7A, 05, 05] -0FAC; [6A 7A, 05, 05][6A A6, 05, 05] +A0B2; [8B 89, 05, 05] -0F5D; [6A 7C, 05, 05] +A0B3; [8B 8B, 05, 05] -0FAD; [6A 7E, 05, 05] -0FBA; [6A 7E, 05, 09][, DF 79, 09] +A0B4; [8B 8D, 05, 05] -0F5E; [6A 80, 05, 05] +A0B5; [8B 8F, 05, 05] -0FAE; [6A 82, 05, 05] +A0B6; [8B 91, 05, 05] -0F5F; [6A 84, 05, 05] +A0B7; [8B 93, 05, 05] -0FAF; [6A 86, 05, 05] +A0B8; [8B 95, 05, 05] -0F60; [6A 88, 05, 05] +A0B9; [8B 97, 05, 05] -0FB0; [6A 8A, 05, 05] +A0BA; [8B 99, 05, 05] -0F61; [6A 8C, 05, 05] +A0BB; [8B 9B, 05, 05] -0FB1; [6A 8E, 05, 05] -0FBB; [6A 8E, 05, 09][, DF 79, 09] +A0BC; [8B 9D, 05, 05] -0F62; [6A 90, 05, 05] -0F6A; [6A 90, 05, 09][, DF 79, 09] +A0BD; [8B 9F, 05, 05] -0FB2; [6A 92, 05, 05] -0FBC; [6A 92, 05, 09][, DF 79, 09] -0FB2 0F71; [6A 92, 05, 05][6A B4, 05, 05] +A0BE; [8B A1, 05, 05] -0F63; [6A 94, 05, 05] +A0BF; [8B A3, 05, 05] -0FB3; [6A 96, 05, 05] -0FB3 0F71; [6A 96, 05, 05][6A B4, 05, 05] +A0C0; [8B A5, 05, 05] -0F64; [6A 98, 05, 05] +A0C1; [8B A7, 05, 05] -0FB4; [6A 9A, 05, 05] +A0C2; [8B A9, 05, 05] -0F65; [6A 9C, 05, 05] +A0C3; [8B AB, 05, 05] -0FB5; [6A 9E, 05, 05] +A0C4; [8B AD, 05, 05] -0F66; [6A A0, 05, 05] +A0C5; [8B AF, 05, 05] -0FB6; [6A A2, 05, 05] +A0C6; [8B B1, 05, 05] -0F67; [6A A4, 05, 05] +A0C7; [8B B3, 05, 05] -0FB7; [6A A6, 05, 05] +A0C8; [8B B5, 05, 05] -0F68; [6A A8, 05, 05] -0F00; [6A A8, 05, 09][6A CE, 05, 09][, DA 75, 3D] +A0C9; [8B B7, 05, 05] -0FB8; [6A AA, 05, 05] +A0CA; [8B B9, 05, 05] -0F88; [6A AC, 05, 05] +A0CB; [8B BB, 05, 05] -0F89; [6A AE, 05, 05] +A0CC; [8B BD, 05, 05] -0F8A; [6A B0, 05, 05] +A0CD; [8B BF, 05, 05] -0F8B; [6A B2, 05, 05] +A0CE; [8B C1, 05, 05] -0F71; [6A B4, 05, 05] +A0CF; [8B C3, 05, 05] -0F72; [6A B6, 05, 05] +A0D0; [8B C5, 05, 05] -0F71 0F72; [6A B8, 05, 05] -0F73; [6A B8, 05, 05] +A0D1; [8B C7, 05, 05] -0F80; [6A BA, 05, 05] +A0D2; [8B C9, 05, 05] -0F71 0F80; [6A BC, 05, 05] -0F81; [6A BC, 05, 05] +A0D3; [8B CB, 05, 05] -0F74; [6A BE, 05, 05] +A0D4; [8B CD, 05, 05] -0F71 0F74; [6A C0, 05, 05] -0F75; [6A C0, 05, 05] +A0D5; [8B CF, 05, 05] -0F76; [6A C2, 05, 05] -0FB2 0F80; [6A C2, 05, 05] +A0D6; [8B D1, 05, 05] -0F77; [6A C4, 05, 05] -0FB2 0F71 0F80; [6A C4, 05, 05] -0FB2 0F81; [6A C4, 05, 05] +A0D7; [8B D3, 05, 05] -0F78; [6A C6, 05, 05] -0FB3 0F80; [6A C6, 05, 05] +A0D8; [8B D5, 05, 05] -0F79; [6A C8, 05, 05] -0FB3 0F71 0F80; [6A C8, 05, 05] -0FB3 0F81; [6A C8, 05, 05] +A0D9; [8B D7, 05, 05] -0F7A; [6A CA, 05, 05] +A0DA; [8B D9, 05, 05] -0F7B; [6A CC, 05, 05] +A0DB; [8B DB, 05, 05] -0F7C; [6A CE, 05, 05] +A0DC; [8B DD, 05, 05] -0F7D; [6A D0, 05, 05] +A0DD; [8B DF, 05, 05] -0F84; [6A D2, 05, 05] +A0DE; [8B E1, 05, 05] -1000; [6B 20, 05, 05] +A0DF; [8B E3, 05, 05] -1001; [6B 22, 05, 05] +A0E0; [8B E5, 05, 05] -1002; [6B 24, 05, 05] +A0E1; [8B E7, 05, 05] -1003; [6B 26, 05, 05] +A0E2; [8B E9, 05, 05] -1004; [6B 28, 05, 05] +A0E3; [8B EB, 05, 05] -1005; [6B 2A, 05, 05] +A0E4; [8B ED, 05, 05] -1006; [6B 2C, 05, 05] +A0E5; [8B EF, 05, 05] -1007; [6B 2E, 05, 05] +A0E6; [8B F1, 05, 05] -1008; [6B 30, 05, 05] +A0E7; [8B F3, 05, 05] -1009; [6B 32, 05, 05] +A0E8; [8B F5, 05, 05] -100A; [6B 34, 05, 05] +A0E9; [8B F7, 05, 05] -100B; [6B 36, 05, 05] +A0EA; [8B F9, 05, 05] -100C; [6B 38, 05, 05] +A0EB; [8B FB, 05, 05] -100D; [6B 3A, 05, 05] +A0EC; [8B FD, 05, 05] -100E; [6B 3C, 05, 05] +A0ED; [8C 05, 05, 05] -100F; [6B 3E, 05, 05] +A0EE; [8C 07, 05, 05] -1010; [6B 40, 05, 05] +A0EF; [8C 09, 05, 05] -1011; [6B 42, 05, 05] +A0F0; [8C 0B, 05, 05] -1012; [6B 44, 05, 05] +A0F1; [8C 0D, 05, 05] -1013; [6B 46, 05, 05] +A0F2; [8C 0F, 05, 05] -1014; [6B 48, 05, 05] +A0F3; [8C 11, 05, 05] -1015; [6B 4A, 05, 05] +A0F4; [8C 13, 05, 05] -1016; [6B 4C, 05, 05] +A0F5; [8C 15, 05, 05] -1017; [6B 4E, 05, 05] +A0F6; [8C 17, 05, 05] -1018; [6B 50, 05, 05] +A0F7; [8C 19, 05, 05] -1019; [6B 52, 05, 05] +A0F8; [8C 1B, 05, 05] -101A; [6B 54, 05, 05] +A0F9; [8C 1D, 05, 05] -101B; [6B 56, 05, 05] +A0FA; [8C 1F, 05, 05] -101C; [6B 58, 05, 05] +A0FB; [8C 21, 05, 05] -101D; [6B 5A, 05, 05] +A0FC; [8C 23, 05, 05] -1050; [6B 5C, 05, 05] +A0FD; [8C 25, 05, 05] -1051; [6B 5E, 05, 05] +A0FE; [8C 27, 05, 05] -101E; [6B 60, 05, 05] +A0FF; [8C 29, 05, 05] -101F; [6B 62, 05, 05] +A100; [8C 2B, 05, 05] -1020; [6B 64, 05, 05] +A101; [8C 2D, 05, 05] -1021; [6B 66, 05, 05] +A102; [8C 2F, 05, 05] -1023; [6B 68, 05, 05] +A103; [8C 31, 05, 05] -1024; [6B 6A, 05, 05] +A104; [8C 33, 05, 05] -1025; [6B 6C, 05, 05] +A105; [8C 35, 05, 05] -1025 102E; [6B 6E, 05, 05] -1026; [6B 6E, 05, 05] +A106; [8C 37, 05, 05] -1027; [6B 70, 05, 05] +A107; [8C 39, 05, 05] -1029; [6B 72, 05, 05] +A108; [8C 3B, 05, 05] -102A; [6B 74, 05, 05] +A109; [8C 3D, 05, 05] -1052; [6B 76, 05, 05] +A10A; [8C 3F, 05, 05] -1053; [6B 78, 05, 05] +A10B; [8C 41, 05, 05] -1054; [6B 7A, 05, 05] +A10C; [8C 43, 05, 05] -1055; [6B 7C, 05, 05] +A10D; [8C 45, 05, 05] -102C; [6B 7E, 05, 05] +A10E; [8C 47, 05, 05] -102D; [6B 80, 05, 05] +A10F; [8C 49, 05, 05] -102E; [6B 82, 05, 05] +A110; [8C 4B, 05, 05] -102F; [6B 84, 05, 05] +A111; [8C 4D, 05, 05] -1030; [6B 86, 05, 05] +A112; [8C 4F, 05, 05] -1031; [6B 88, 05, 05] +A113; [8C 51, 05, 05] -1032; [6B 8A, 05, 05] +A114; [8C 53, 05, 05] -1056; [6B 8C, 05, 05] +A115; [8C 55, 05, 05] -1057; [6B 8E, 05, 05] +A116; [8C 57, 05, 05] -1058; [6B 90, 05, 05] +A117; [8C 59, 05, 05] -1059; [6B 92, 05, 05] +A118; [8C 5B, 05, 05] -1039; [6B 94, 05, 05] +A119; [8C 5D, 05, 05] -1780; [6C 20, 05, 05] +A11A; [8C 5F, 05, 05] -1781; [6C 22, 05, 05] +A11B; [8C 61, 05, 05] -1782; [6C 24, 05, 05] +A11C; [8C 63, 05, 05] -1783; [6C 26, 05, 05] +A11D; [8C 65, 05, 05] -1784; [6C 28, 05, 05] +A11E; [8C 67, 05, 05] -1785; [6C 2A, 05, 05] +A11F; [8C 69, 05, 05] -1786; [6C 2C, 05, 05] +A120; [8C 6B, 05, 05] -1787; [6C 2E, 05, 05] +A121; [8C 6D, 05, 05] -1788; [6C 30, 05, 05] +A122; [8C 6F, 05, 05] -1789; [6C 32, 05, 05] +A123; [8C 71, 05, 05] -178A; [6C 34, 05, 05] +A124; [8C 73, 05, 05] -178B; [6C 36, 05, 05] +A125; [8C 75, 05, 05] -178C; [6C 38, 05, 05] +A126; [8C 77, 05, 05] -178D; [6C 3A, 05, 05] +A127; [8C 79, 05, 05] -178E; [6C 3C, 05, 05] +A128; [8C 7B, 05, 05] -178F; [6C 3E, 05, 05] +A129; [8C 7D, 05, 05] -1790; [6C 40, 05, 05] +A12A; [8C 7F, 05, 05] -1791; [6C 42, 05, 05] +A12B; [8C 81, 05, 05] -1792; [6C 44, 05, 05] +A12C; [8C 83, 05, 05] -1793; [6C 46, 05, 05] +A12D; [8C 85, 05, 05] -1794; [6C 48, 05, 05] +A12E; [8C 87, 05, 05] -1795; [6C 4A, 05, 05] +A12F; [8C 89, 05, 05] -1796; [6C 4C, 05, 05] +A130; [8C 8B, 05, 05] -1797; [6C 4E, 05, 05] +A131; [8C 8D, 05, 05] -1798; [6C 50, 05, 05] +A132; [8C 8F, 05, 05] -1799; [6C 52, 05, 05] +A133; [8C 91, 05, 05] -179A; [6C 54, 05, 05] +A134; [8C 93, 05, 05] -179B; [6C 56, 05, 05] +A135; [8C 95, 05, 05] -179C; [6C 58, 05, 05] +A136; [8C 97, 05, 05] -179D; [6C 5A, 05, 05] +A137; [8C 99, 05, 05] -179E; [6C 5C, 05, 05] +A138; [8C 9B, 05, 05] -179F; [6C 5E, 05, 05] +A139; [8C 9D, 05, 05] -17A0; [6C 60, 05, 05] +A13A; [8C 9F, 05, 05] -17A1; [6C 62, 05, 05] +A13B; [8C A1, 05, 05] -17A2; [6C 64, 05, 05] +A13C; [8C A3, 05, 05] -17A3; [6C 66, 05, 05] +A13D; [8C A5, 05, 05] -17A4; [6C 68, 05, 05] +A13E; [8C A7, 05, 05] -17A5; [6C 6A, 05, 05] +A13F; [8C A9, 05, 05] -17A6; [6C 6C, 05, 05] +A140; [8C AB, 05, 05] -17A7; [6C 6E, 05, 05] +A141; [8C AD, 05, 05] -17A8; [6C 70, 05, 05] +A142; [8C AF, 05, 05] -17A9; [6C 72, 05, 05] +A143; [8C B1, 05, 05] -17AA; [6C 74, 05, 05] +A144; [8C B3, 05, 05] -17AB; [6C 76, 05, 05] +A145; [8C B5, 05, 05] -17AC; [6C 78, 05, 05] +A146; [8C B7, 05, 05] -17AD; [6C 7A, 05, 05] +A147; [8C B9, 05, 05] -17AE; [6C 7C, 05, 05] +A148; [8C BB, 05, 05] -17AF; [6C 7E, 05, 05] +A149; [8C BD, 05, 05] -17B0; [6C 80, 05, 05] +A14A; [8C BF, 05, 05] -17B1; [6C 82, 05, 05] +A14B; [8C C1, 05, 05] -17B2; [6C 84, 05, 05] +A14C; [8C C3, 05, 05] -17B3; [6C 86, 05, 05] +A14D; [8C C5, 05, 05] -17B4; [6C 88, 05, 05] +A14E; [8C C7, 05, 05] -17B5; [6C 8A, 05, 05] +A14F; [8C C9, 05, 05] -17B6; [6C 8C, 05, 05] +A150; [8C CB, 05, 05] -17B7; [6C 8E, 05, 05] +A151; [8C CD, 05, 05] -17B8; [6C 90, 05, 05] +A152; [8C CF, 05, 05] -17B9; [6C 92, 05, 05] +A153; [8C D1, 05, 05] -17BA; [6C 94, 05, 05] +A154; [8C D3, 05, 05] -17BB; [6C 96, 05, 05] +A155; [8C D5, 05, 05] -17BC; [6C 98, 05, 05] +A156; [8C D7, 05, 05] -17BD; [6C 9A, 05, 05] +A157; [8C D9, 05, 05] -17BE; [6C 9C, 05, 05] +A158; [8C DB, 05, 05] -17BF; [6C 9E, 05, 05] +A159; [8C DD, 05, 05] -17C0; [6C A0, 05, 05] +A15A; [8C DF, 05, 05] -17C1; [6C A2, 05, 05] +A15B; [8C E1, 05, 05] -17C2; [6C A4, 05, 05] +A15C; [8C E3, 05, 05] -17C3; [6C A6, 05, 05] +A15D; [8C E5, 05, 05] -17C4; [6C A8, 05, 05] +A15E; [8C E7, 05, 05] -17C5; [6C AA, 05, 05] +A15F; [8C E9, 05, 05] -17D2; [6C AC, 05, 05] +A160; [8C EB, 05, 05] -1880; [6D 20, 05, 05] +A161; [8C ED, 05, 05] -1881; [6D 22, 05, 05] +A162; [8C EF, 05, 05] -1882; [6D 24, 05, 05] +A163; [8C F1, 05, 05] -1883; [6D 26, 05, 05] +A164; [8C F3, 05, 05] -1884; [6D 28, 05, 05] +A165; [8C F5, 05, 05] -1885; [6D 2A, 05, 05] +A166; [8C F7, 05, 05] -1886; [6D 2C, 05, 05] +A167; [8C F9, 05, 05] -1843; [6D 2E, 05, 05] +A168; [8C FB, 05, 05] -1820; [6D 30, 05, 05] +A169; [8C FD, 05, 05] -1887; [6D 32, 05, 05] +A16A; [8D 05, 05, 05] -1821; [6D 34, 05, 05] +A16B; [8D 07, 05, 05] -1844; [6D 36, 05, 05] +A16C; [8D 09, 05, 05] -185D; [6D 38, 05, 05] +A16D; [8D 0B, 05, 05] -1822; [6D 3A, 05, 05] +A16E; [8D 0D, 05, 05] -1845; [6D 3C, 05, 05] +A16F; [8D 0F, 05, 05] -185E; [6D 3E, 05, 05] +A170; [8D 11, 05, 05] -1873; [6D 40, 05, 05] +A171; [8D 13, 05, 05] -1888; [6D 42, 05, 05] +A172; [8D 15, 05, 05] -185F; [6D 44, 05, 05] +A173; [8D 17, 05, 05] -1823; [6D 46, 05, 05] +A174; [8D 19, 05, 05] -1846; [6D 48, 05, 05] +A175; [8D 1B, 05, 05] -1824; [6D 4A, 05, 05] +A176; [8D 1D, 05, 05] -1847; [6D 4C, 05, 05] +A177; [8D 1F, 05, 05] -1861; [6D 4E, 05, 05] +A178; [8D 21, 05, 05] -1825; [6D 50, 05, 05] +A179; [8D 23, 05, 05] -1848; [6D 52, 05, 05] +A17A; [8D 25, 05, 05] -1826; [6D 54, 05, 05] +A17B; [8D 27, 05, 05] -1849; [6D 56, 05, 05] +A17C; [8D 29, 05, 05] -1860; [6D 58, 05, 05] +A17D; [8D 2B, 05, 05] -1827; [6D 5A, 05, 05] +A17E; [8D 2D, 05, 05] -1828; [6D 5C, 05, 05] +A17F; [8D 2F, 05, 05] -1829; [6D 5E, 05, 05] +A180; [8D 31, 05, 05] -184A; [6D 60, 05, 05] +A181; [8D 33, 05, 05] -1862; [6D 62, 05, 05] +A182; [8D 35, 05, 05] -188A; [6D 64, 05, 05] +A183; [8D 37, 05, 05] -189B; [6D 66, 05, 05] +A184; [8D 39, 05, 05] -182A; [6D 68, 05, 05] +A185; [8D 3B, 05, 05] -184B; [6D 6A, 05, 05] +A186; [8D 3D, 05, 05] -182B; [6D 6C, 05, 05] +A187; [8D 3F, 05, 05] -184C; [6D 6E, 05, 05] +A188; [8D 41, 05, 05] -1866; [6D 70, 05, 05] +A189; [8D 43, 05, 05] -182C; [6D 72, 05, 05] +A18A; [8D 45, 05, 05] -184D; [6D 74, 05, 05] +A18B; [8D 47, 05, 05] -182D; [6D 76, 05, 05] +A18C; [8D 49, 05, 05] -184E; [6D 78, 05, 05] +A18D; [8D 4B, 05, 05] -1864; [6D 7A, 05, 05] +A18E; [8D 4D, 05, 05] -189A; [6D 7C, 05, 05] +A18F; [8D 4F, 05, 05] -1865; [6D 7E, 05, 05] +A190; [8D 51, 05, 05] -182E; [6D 80, 05, 05] +A191; [8D 53, 05, 05] -184F; [6D 82, 05, 05] +A192; [8D 55, 05, 05] -182F; [6D 84, 05, 05] +A193; [8D 57, 05, 05] -1830; [6D 86, 05, 05] +A194; [8D 59, 05, 05] -1831; [6D 88, 05, 05] +A195; [8D 5B, 05, 05] -1867; [6D 8A, 05, 05] +A196; [8D 5D, 05, 05] -189C; [6D 8C, 05, 05] +A197; [8D 5F, 05, 05] -189D; [6D 8E, 05, 05] +A198; [8D 61, 05, 05] -18A2; [6D 90, 05, 05] +A199; [8D 63, 05, 05] -18A4; [6D 92, 05, 05] +A19A; [8D 65, 05, 05] -18A5; [6D 94, 05, 05] +A19B; [8D 67, 05, 05] -1832; [6D 96, 05, 05] +A19C; [8D 69, 05, 05] -1850; [6D 98, 05, 05] +A19D; [8D 6B, 05, 05] -1868; [6D 9A, 05, 05] +A19E; [8D 6D, 05, 05] -1833; [6D 9C, 05, 05] +A19F; [8D 6F, 05, 05] -1851; [6D 9E, 05, 05] +A1A0; [8D 71, 05, 05] -1869; [6D A0, 05, 05] +A1A1; [8D 73, 05, 05] -1834; [6D A2, 05, 05] +A1A2; [8D 75, 05, 05] -1852; [6D A4, 05, 05] +A1A3; [8D 77, 05, 05] -1871; [6D A6, 05, 05] +A1A4; [8D 79, 05, 05] -185C; [6D A8, 05, 05] +A1A5; [8D 7B, 05, 05] -188B; [6D AA, 05, 05] +A1A6; [8D 7D, 05, 05] -1835; [6D AC, 05, 05] +A1A7; [8D 7F, 05, 05] -1853; [6D AE, 05, 05] +A1A8; [8D 81, 05, 05] -186A; [6D B0, 05, 05] +A1A9; [8D 83, 05, 05] -1877; [6D B2, 05, 05] +A1AA; [8D 85, 05, 05] -1836; [6D B4, 05, 05] +A1AB; [8D 87, 05, 05] -1855; [6D B6, 05, 05] +A1AC; [8D 89, 05, 05] -1872; [6D B8, 05, 05] +A1AD; [8D 8B, 05, 05] -1837; [6D BA, 05, 05] +A1AE; [8D 8D, 05, 05] -1875; [6D BC, 05, 05] +A1AF; [8D 8F, 05, 05] -1838; [6D BE, 05, 05] +A1B0; [8D 91, 05, 05] -1856; [6D C0, 05, 05] +A1B1; [8D 93, 05, 05] -1839; [6D C2, 05, 05] +A1B2; [8D 95, 05, 05] -186B; [6D C4, 05, 05] +A1B3; [8D 97, 05, 05] -1876; [6D C6, 05, 05] +A1B4; [8D 99, 05, 05] -183A; [6D C8, 05, 05] +A1B5; [8D 9B, 05, 05] -1857; [6D CA, 05, 05] +A1B6; [8D 9D, 05, 05] -1863; [6D CC, 05, 05] +A1B7; [8D 9F, 05, 05] -1874; [6D CE, 05, 05] +A1B8; [8D A1, 05, 05] -1889; [6D D0, 05, 05] +A1B9; [8D A3, 05, 05] -183B; [6D D2, 05, 05] +A1BA; [8D A5, 05, 05] -183C; [6D D4, 05, 05] +A1BB; [8D A7, 05, 05] -1854; [6D D6, 05, 05] +A1BC; [8D A9, 05, 05] -186E; [6D D8, 05, 05] +A1BD; [8D AB, 05, 05] -183D; [6D DA, 05, 05] +A1BE; [8D AD, 05, 05] -186F; [6D DC, 05, 05] +A1BF; [8D AF, 05, 05] -1858; [6D DE, 05, 05] +A1C0; [8D B1, 05, 05] -186C; [6D E0, 05, 05] +A1C1; [8D B3, 05, 05] -183E; [6D E2, 05, 05] +A1C2; [8D B5, 05, 05] -1859; [6D E4, 05, 05] +A1C3; [8D B7, 05, 05] -186D; [6D E6, 05, 05] +A1C4; [8D B9, 05, 05] -183F; [6D E8, 05, 05] +A1C5; [8D BB, 05, 05] -1840; [6D EA, 05, 05] +A1C6; [8D BD, 05, 05] -1841; [6D EC, 05, 05] +A1C7; [8D BF, 05, 05] -1842; [6D EE, 05, 05] +A1C8; [8D C1, 05, 05] -185A; [6D F0, 05, 05] +A1C9; [8D C3, 05, 05] -185B; [6D F2, 05, 05] +A1CA; [8D C5, 05, 05] -1870; [6D F4, 05, 05] +A1CB; [8D C7, 05, 05] -188C; [6D F6, 05, 05] +A1CC; [8D C9, 05, 05] -189E; [6D F8, 05, 05] +A1CD; [8D CB, 05, 05] -188D; [6D FA, 05, 05] +A1CE; [8D CD, 05, 05] -188E; [6D FC, 05, 05] +A1CF; [8D CF, 05, 05] -189F; [6D FE, 05, 05] +A1D0; [8D D1, 05, 05] -188F; [6E 05, 05, 05] +A1D1; [8D D3, 05, 05] -1890; [6E 07, 05, 05] +A1D2; [8D D5, 05, 05] -1898; [6E 09, 05, 05] +A1D3; [8D D7, 05, 05] -18A0; [6E 0B, 05, 05] +A1D4; [8D D9, 05, 05] -1891; [6E 0D, 05, 05] +A1D5; [8D DB, 05, 05] -18A1; [6E 0F, 05, 05] +A1D6; [8D DD, 05, 05] -1892; [6E 11, 05, 05] +A1D7; [8D DF, 05, 05] -1893; [6E 13, 05, 05] +A1D8; [8D E1, 05, 05] -18A8; [6E 15, 05, 05] +A1D9; [8D E3, 05, 05] -1894; [6E 17, 05, 05] +A1DA; [8D E5, 05, 05] -18A3; [6E 19, 05, 05] +A1DB; [8D E7, 05, 05] -1895; [6E 1B, 05, 05] +A1DC; [8D E9, 05, 05] -1899; [6E 1D, 05, 05] +A1DD; [8D EB, 05, 05] -1896; [6E 1F, 05, 05] +A1DE; [8D ED, 05, 05] -1897; [6E 21, 05, 05] +A1DF; [8D EF, 05, 05] -18A6; [6E 23, 05, 05] +A1E0; [8D F1, 05, 05] -18A7; [6E 25, 05, 05] +A1E1; [8D F3, 05, 05] -18A9; [6E 27, 05, 05] +A1E2; [8D F5, 05, 05] -13A0; [6F 20, 05, 05] +A1E3; [8D F7, 05, 05] -13A1; [6F 22, 05, 05] +A1E4; [8D F9, 05, 05] -13A2; [6F 24, 05, 05] +A1E5; [8D FB, 05, 05] -13A3; [6F 26, 05, 05] +A1E6; [8D FD, 05, 05] -13A4; [6F 28, 05, 05] +A1E7; [8E 05, 05, 05] -13A5; [6F 2A, 05, 05] +A1E8; [8E 07, 05, 05] -13A6; [6F 2C, 05, 05] +A1E9; [8E 09, 05, 05] -13A7; [6F 2E, 05, 05] +A1EA; [8E 0B, 05, 05] -13A8; [6F 30, 05, 05] +A1EB; [8E 0D, 05, 05] -13A9; [6F 32, 05, 05] +A1EC; [8E 0F, 05, 05] -13AA; [6F 34, 05, 05] +A1ED; [8E 11, 05, 05] -13AB; [6F 36, 05, 05] +A1EE; [8E 13, 05, 05] -13AC; [6F 38, 05, 05] +A1EF; [8E 15, 05, 05] -13AD; [6F 3A, 05, 05] +A1F0; [8E 17, 05, 05] -13AE; [6F 3C, 05, 05] +A1F1; [8E 19, 05, 05] -13AF; [6F 3E, 05, 05] +A1F2; [8E 1B, 05, 05] -13B0; [6F 40, 05, 05] +A1F3; [8E 1D, 05, 05] -13B1; [6F 42, 05, 05] +A1F4; [8E 1F, 05, 05] -13B2; [6F 44, 05, 05] +A1F5; [8E 21, 05, 05] -13B3; [6F 46, 05, 05] +A1F6; [8E 23, 05, 05] -13B4; [6F 48, 05, 05] +A1F7; [8E 25, 05, 05] -13B5; [6F 4A, 05, 05] +A1F8; [8E 27, 05, 05] -13B6; [6F 4C, 05, 05] +A1F9; [8E 29, 05, 05] -13B7; [6F 4E, 05, 05] +A1FA; [8E 2B, 05, 05] -13B8; [6F 50, 05, 05] +A1FB; [8E 2D, 05, 05] -13B9; [6F 52, 05, 05] +A1FC; [8E 2F, 05, 05] -13BA; [6F 54, 05, 05] +A1FD; [8E 31, 05, 05] -13BB; [6F 56, 05, 05] +A1FE; [8E 33, 05, 05] -13BC; [6F 58, 05, 05] +A1FF; [8E 35, 05, 05] -13BD; [6F 5A, 05, 05] +A200; [8E 37, 05, 05] -13BE; [6F 5C, 05, 05] +A201; [8E 39, 05, 05] -13BF; [6F 5E, 05, 05] +A202; [8E 3B, 05, 05] -13C0; [6F 60, 05, 05] +A203; [8E 3D, 05, 05] -13C1; [6F 62, 05, 05] +A204; [8E 3F, 05, 05] -13C2; [6F 64, 05, 05] +A205; [8E 41, 05, 05] -13C3; [6F 66, 05, 05] +A206; [8E 43, 05, 05] -13C4; [6F 68, 05, 05] +A207; [8E 45, 05, 05] -13C5; [6F 6A, 05, 05] +A208; [8E 47, 05, 05] -13C6; [6F 6C, 05, 05] +A209; [8E 49, 05, 05] -13C7; [6F 6E, 05, 05] +A20A; [8E 4B, 05, 05] -13C8; [6F 70, 05, 05] +A20B; [8E 4D, 05, 05] -13C9; [6F 72, 05, 05] +A20C; [8E 4F, 05, 05] -13CA; [6F 74, 05, 05] +A20D; [8E 51, 05, 05] -13CB; [6F 76, 05, 05] +A20E; [8E 53, 05, 05] -13CC; [6F 78, 05, 05] +A20F; [8E 55, 05, 05] -13CD; [6F 7A, 05, 05] +A210; [8E 57, 05, 05] -13CE; [6F 7C, 05, 05] +A211; [8E 59, 05, 05] -13CF; [6F 7E, 05, 05] +A212; [8E 5B, 05, 05] -13D0; [6F 80, 05, 05] +A213; [8E 5D, 05, 05] -13D1; [6F 82, 05, 05] +A214; [8E 5F, 05, 05] -13D2; [6F 84, 05, 05] +A215; [8E 61, 05, 05] -13D3; [6F 86, 05, 05] +A216; [8E 63, 05, 05] -13D4; [6F 88, 05, 05] +A217; [8E 65, 05, 05] -13D5; [6F 8A, 05, 05] +A218; [8E 67, 05, 05] -13D6; [6F 8C, 05, 05] +A219; [8E 69, 05, 05] -13D7; [6F 8E, 05, 05] +A21A; [8E 6B, 05, 05] -13D8; [6F 90, 05, 05] +A21B; [8E 6D, 05, 05] -13D9; [6F 92, 05, 05] +A21C; [8E 6F, 05, 05] -13DA; [6F 94, 05, 05] +A21D; [8E 71, 05, 05] -13DB; [6F 96, 05, 05] +A21E; [8E 73, 05, 05] -13DC; [6F 98, 05, 05] +A21F; [8E 75, 05, 05] -13DD; [6F 9A, 05, 05] +A220; [8E 77, 05, 05] -13DE; [6F 9C, 05, 05] +A221; [8E 79, 05, 05] -13DF; [6F 9E, 05, 05] +A222; [8E 7B, 05, 05] -13E0; [6F A0, 05, 05] +A223; [8E 7D, 05, 05] -13E1; [6F A2, 05, 05] +A224; [8E 7F, 05, 05] -13E2; [6F A4, 05, 05] +A225; [8E 81, 05, 05] -13E3; [6F A6, 05, 05] +A226; [8E 83, 05, 05] -13E4; [6F A8, 05, 05] +A227; [8E 85, 05, 05] -13E5; [6F AA, 05, 05] +A228; [8E 87, 05, 05] -13E6; [6F AC, 05, 05] +A229; [8E 89, 05, 05] -13E7; [6F AE, 05, 05] +A22A; [8E 8B, 05, 05] -13E8; [6F B0, 05, 05] +A22B; [8E 8D, 05, 05] -13E9; [6F B2, 05, 05] +A22C; [8E 8F, 05, 05] -13EA; [6F B4, 05, 05] +A22D; [8E 91, 05, 05] -13EB; [6F B6, 05, 05] +A22E; [8E 93, 05, 05] -13EC; [6F B8, 05, 05] +A22F; [8E 95, 05, 05] -13ED; [6F BA, 05, 05] +A230; [8E 97, 05, 05] -13EE; [6F BC, 05, 05] +A231; [8E 99, 05, 05] -13EF; [6F BE, 05, 05] +A232; [8E 9B, 05, 05] -13F0; [6F C0, 05, 05] +A233; [8E 9D, 05, 05] -13F1; [6F C2, 05, 05] +A234; [8E 9F, 05, 05] -13F2; [6F C4, 05, 05] +A235; [8E A1, 05, 05] -13F3; [6F C6, 05, 05] +A236; [8E A3, 05, 05] -13F4; [6F C8, 05, 05] +A237; [8E A5, 05, 05] -1401; [70 20, 05, 05] +A238; [8E A7, 05, 05] -1402; [70 22, 05, 05] +A239; [8E A9, 05, 05] -1403; [70 24, 05, 05] +A23A; [8E AB, 05, 05] -1404; [70 26, 05, 05] +A23B; [8E AD, 05, 05] -1405; [70 28, 05, 05] +A23C; [8E AF, 05, 05] -1406; [70 2A, 05, 05] +A23D; [8E B1, 05, 05] -1407; [70 2C, 05, 05] +A23E; [8E B3, 05, 05] -1408; [70 2E, 05, 05] +A23F; [8E B5, 05, 05] -1409; [70 30, 05, 05] +A240; [8E B7, 05, 05] -140A; [70 32, 05, 05] +A241; [8E B9, 05, 05] -140B; [70 34, 05, 05] +A242; [8E BB, 05, 05] -140C; [70 36, 05, 05] +A243; [8E BD, 05, 05] -140D; [70 38, 05, 05] +A244; [8E BF, 05, 05] -140E; [70 3A, 05, 05] +A245; [8E C1, 05, 05] -140F; [70 3C, 05, 05] +A246; [8E C3, 05, 05] -1410; [70 3E, 05, 05] +A247; [8E C5, 05, 05] -1411; [70 40, 05, 05] +A248; [8E C7, 05, 05] -1412; [70 42, 05, 05] +A249; [8E C9, 05, 05] -1413; [70 44, 05, 05] +A24A; [8E CB, 05, 05] -1414; [70 46, 05, 05] +A24B; [8E CD, 05, 05] -1415; [70 48, 05, 05] +A24C; [8E CF, 05, 05] -1416; [70 4A, 05, 05] +A24D; [8E D1, 05, 05] -1417; [70 4C, 05, 05] +A24E; [8E D3, 05, 05] -1418; [70 4E, 05, 05] +A24F; [8E D5, 05, 05] -1419; [70 50, 05, 05] +A250; [8E D7, 05, 05] -141A; [70 52, 05, 05] +A251; [8E D9, 05, 05] -141B; [70 54, 05, 05] +A252; [8E DB, 05, 05] -141C; [70 56, 05, 05] +A253; [8E DD, 05, 05] -141D; [70 58, 05, 05] +A254; [8E DF, 05, 05] -141E; [70 5A, 05, 05] +A255; [8E E1, 05, 05] -141F; [70 5C, 05, 05] +A256; [8E E3, 05, 05] -1420; [70 5E, 05, 05] +A257; [8E E5, 05, 05] -1421; [70 60, 05, 05] +A258; [8E E7, 05, 05] -1422; [70 62, 05, 05] +A259; [8E E9, 05, 05] -1423; [70 64, 05, 05] +A25A; [8E EB, 05, 05] -1424; [70 66, 05, 05] +A25B; [8E ED, 05, 05] -1425; [70 68, 05, 05] +A25C; [8E EF, 05, 05] -1426; [70 6A, 05, 05] +A25D; [8E F1, 05, 05] -1427; [70 6C, 05, 05] +A25E; [8E F3, 05, 05] -1428; [70 6E, 05, 05] +A25F; [8E F5, 05, 05] -1429; [70 70, 05, 05] +A260; [8E F7, 05, 05] -142A; [70 72, 05, 05] +A261; [8E F9, 05, 05] -142B; [70 74, 05, 05] +A262; [8E FB, 05, 05] -142C; [70 76, 05, 05] +A263; [8E FD, 05, 05] -142D; [70 78, 05, 05] +A264; [8F 05, 05, 05] -142E; [70 7A, 05, 05] +A265; [8F 07, 05, 05] -142F; [70 7C, 05, 05] +A266; [8F 09, 05, 05] -1430; [70 7E, 05, 05] +A267; [8F 0B, 05, 05] -1431; [70 80, 05, 05] +A268; [8F 0D, 05, 05] -1432; [70 82, 05, 05] +A269; [8F 0F, 05, 05] -1433; [70 84, 05, 05] +A26A; [8F 11, 05, 05] -1434; [70 86, 05, 05] +A26B; [8F 13, 05, 05] -1435; [70 88, 05, 05] +A26C; [8F 15, 05, 05] -1436; [70 8A, 05, 05] +A26D; [8F 17, 05, 05] -1437; [70 8C, 05, 05] +A26E; [8F 19, 05, 05] -1438; [70 8E, 05, 05] +A26F; [8F 1B, 05, 05] -1439; [70 90, 05, 05] +A270; [8F 1D, 05, 05] -143A; [70 92, 05, 05] +A271; [8F 1F, 05, 05] -143B; [70 94, 05, 05] +A272; [8F 21, 05, 05] -143C; [70 96, 05, 05] +A273; [8F 23, 05, 05] -143D; [70 98, 05, 05] +A274; [8F 25, 05, 05] -143E; [70 9A, 05, 05] +A275; [8F 27, 05, 05] -143F; [70 9C, 05, 05] +A276; [8F 29, 05, 05] -1440; [70 9E, 05, 05] +A277; [8F 2B, 05, 05] -1441; [70 A0, 05, 05] +A278; [8F 2D, 05, 05] -1442; [70 A2, 05, 05] +A279; [8F 2F, 05, 05] -1443; [70 A4, 05, 05] +A27A; [8F 31, 05, 05] -1444; [70 A6, 05, 05] +A27B; [8F 33, 05, 05] -1445; [70 A8, 05, 05] +A27C; [8F 35, 05, 05] -1446; [70 AA, 05, 05] +A27D; [8F 37, 05, 05] -1447; [70 AC, 05, 05] +A27E; [8F 39, 05, 05] -1448; [70 AE, 05, 05] +A27F; [8F 3B, 05, 05] -1449; [70 B0, 05, 05] +A280; [8F 3D, 05, 05] -144A; [70 B2, 05, 05] +A281; [8F 3F, 05, 05] -144B; [70 B4, 05, 05] +A282; [8F 41, 05, 05] -144C; [70 B6, 05, 05] +A283; [8F 43, 05, 05] -144D; [70 B8, 05, 05] +A284; [8F 45, 05, 05] -144E; [70 BA, 05, 05] +A285; [8F 47, 05, 05] -144F; [70 BC, 05, 05] +A286; [8F 49, 05, 05] -1450; [70 BE, 05, 05] +A287; [8F 4B, 05, 05] -1451; [70 C0, 05, 05] +A288; [8F 4D, 05, 05] -1452; [70 C2, 05, 05] +A289; [8F 4F, 05, 05] -1453; [70 C4, 05, 05] +A28A; [8F 51, 05, 05] -1454; [70 C6, 05, 05] +A28B; [8F 53, 05, 05] -1455; [70 C8, 05, 05] +A28C; [8F 55, 05, 05] -1456; [70 CA, 05, 05] +A28D; [8F 57, 05, 05] -1457; [70 CC, 05, 05] +A28E; [8F 59, 05, 05] -1458; [70 CE, 05, 05] +A28F; [8F 5B, 05, 05] -1459; [70 D0, 05, 05] +A290; [8F 5D, 05, 05] -145A; [70 D2, 05, 05] +A291; [8F 5F, 05, 05] -145B; [70 D4, 05, 05] +A292; [8F 61, 05, 05] -145C; [70 D6, 05, 05] +A293; [8F 63, 05, 05] -145D; [70 D8, 05, 05] +A294; [8F 65, 05, 05] -145E; [70 DA, 05, 05] +A295; [8F 67, 05, 05] -145F; [70 DC, 05, 05] +A296; [8F 69, 05, 05] -1460; [70 DE, 05, 05] +A297; [8F 6B, 05, 05] -1461; [70 E0, 05, 05] +A298; [8F 6D, 05, 05] -1462; [70 E2, 05, 05] +A299; [8F 6F, 05, 05] -1463; [70 E4, 05, 05] +A29A; [8F 71, 05, 05] -1464; [70 E6, 05, 05] +A29B; [8F 73, 05, 05] -1465; [70 E8, 05, 05] +A29C; [8F 75, 05, 05] -1466; [70 EA, 05, 05] +A29D; [8F 77, 05, 05] -1467; [70 EC, 05, 05] +A29E; [8F 79, 05, 05] -1468; [70 EE, 05, 05] +A29F; [8F 7B, 05, 05] -1469; [70 F0, 05, 05] +A2A0; [8F 7D, 05, 05] -146A; [70 F2, 05, 05] +A2A1; [8F 7F, 05, 05] -146B; [70 F4, 05, 05] +A2A2; [8F 81, 05, 05] -146C; [70 F6, 05, 05] +A2A3; [8F 83, 05, 05] -146D; [70 F8, 05, 05] +A2A4; [8F 85, 05, 05] -146E; [70 FA, 05, 05] +A2A5; [8F 87, 05, 05] -146F; [70 FC, 05, 05] +A2A6; [8F 89, 05, 05] -1470; [70 FE, 05, 05] +A2A7; [8F 8B, 05, 05] -1471; [71 05, 05, 05] +A2A8; [8F 8D, 05, 05] -1472; [71 07, 05, 05] +A2A9; [8F 8F, 05, 05] -1473; [71 09, 05, 05] +A2AA; [8F 91, 05, 05] -1474; [71 0B, 05, 05] +A2AB; [8F 93, 05, 05] -1475; [71 0D, 05, 05] +A2AC; [8F 95, 05, 05] -1476; [71 0F, 05, 05] +A2AD; [8F 97, 05, 05] -1477; [71 11, 05, 05] +A2AE; [8F 99, 05, 05] -1478; [71 13, 05, 05] +A2AF; [8F 9B, 05, 05] -1479; [71 15, 05, 05] +A2B0; [8F 9D, 05, 05] -147A; [71 17, 05, 05] +A2B1; [8F 9F, 05, 05] -147B; [71 19, 05, 05] +A2B2; [8F A1, 05, 05] -147C; [71 1B, 05, 05] +A2B3; [8F A3, 05, 05] -147D; [71 1D, 05, 05] +A2B4; [8F A5, 05, 05] -147E; [71 1F, 05, 05] +A2B5; [8F A7, 05, 05] -147F; [71 21, 05, 05] +A2B6; [8F A9, 05, 05] -1480; [71 23, 05, 05] +A2B7; [8F AB, 05, 05] -1481; [71 25, 05, 05] +A2B8; [8F AD, 05, 05] -1482; [71 27, 05, 05] +A2B9; [8F AF, 05, 05] -1483; [71 29, 05, 05] +A2BA; [8F B1, 05, 05] -1484; [71 2B, 05, 05] +A2BB; [8F B3, 05, 05] -1485; [71 2D, 05, 05] +A2BC; [8F B5, 05, 05] -1486; [71 2F, 05, 05] +A2BD; [8F B7, 05, 05] -1487; [71 31, 05, 05] +A2BE; [8F B9, 05, 05] -1488; [71 33, 05, 05] +A2BF; [8F BB, 05, 05] -1489; [71 35, 05, 05] +A2C0; [8F BD, 05, 05] -148A; [71 37, 05, 05] +A2C1; [8F BF, 05, 05] -148B; [71 39, 05, 05] +A2C2; [8F C1, 05, 05] -148C; [71 3B, 05, 05] +A2C3; [8F C3, 05, 05] -148D; [71 3D, 05, 05] +A2C4; [8F C5, 05, 05] -148E; [71 3F, 05, 05] +A2C5; [8F C7, 05, 05] -148F; [71 41, 05, 05] +A2C6; [8F C9, 05, 05] -1490; [71 43, 05, 05] +A2C7; [8F CB, 05, 05] -1491; [71 45, 05, 05] +A2C8; [8F CD, 05, 05] -1492; [71 47, 05, 05] +A2C9; [8F CF, 05, 05] -1493; [71 49, 05, 05] +A2CA; [8F D1, 05, 05] -1494; [71 4B, 05, 05] +A2CB; [8F D3, 05, 05] -1495; [71 4D, 05, 05] +A2CC; [8F D5, 05, 05] -1496; [71 4F, 05, 05] +A2CD; [8F D7, 05, 05] -1497; [71 51, 05, 05] +A2CE; [8F D9, 05, 05] -1498; [71 53, 05, 05] +A2CF; [8F DB, 05, 05] -1499; [71 55, 05, 05] +A2D0; [8F DD, 05, 05] -149A; [71 57, 05, 05] +A2D1; [8F DF, 05, 05] -149B; [71 59, 05, 05] +A2D2; [8F E1, 05, 05] -149C; [71 5B, 05, 05] +A2D3; [8F E3, 05, 05] -149D; [71 5D, 05, 05] +A2D4; [8F E5, 05, 05] -149E; [71 5F, 05, 05] +A2D5; [8F E7, 05, 05] -149F; [71 61, 05, 05] +A2D6; [8F E9, 05, 05] -14A0; [71 63, 05, 05] +A2D7; [8F EB, 05, 05] -14A1; [71 65, 05, 05] +A2D8; [8F ED, 05, 05] -14A2; [71 67, 05, 05] +A2D9; [8F EF, 05, 05] -14A3; [71 69, 05, 05] +A2DA; [8F F1, 05, 05] -14A4; [71 6B, 05, 05] +A2DB; [8F F3, 05, 05] -14A5; [71 6D, 05, 05] +A2DC; [8F F5, 05, 05] -14A6; [71 6F, 05, 05] +A2DD; [8F F7, 05, 05] -14A7; [71 71, 05, 05] +A2DE; [8F F9, 05, 05] -14A8; [71 73, 05, 05] +A2DF; [8F FB, 05, 05] -14A9; [71 75, 05, 05] +A2E0; [8F FD, 05, 05] -14AA; [71 77, 05, 05] +A2E1; [90 05, 05, 05] -14AB; [71 79, 05, 05] +A2E2; [90 07, 05, 05] -14AC; [71 7B, 05, 05] +A2E3; [90 09, 05, 05] -14AD; [71 7D, 05, 05] +A2E4; [90 0B, 05, 05] -14AE; [71 7F, 05, 05] +A2E5; [90 0D, 05, 05] -14AF; [71 81, 05, 05] +A2E6; [90 0F, 05, 05] -14B0; [71 83, 05, 05] +A2E7; [90 11, 05, 05] -14B1; [71 85, 05, 05] +A2E8; [90 13, 05, 05] -14B2; [71 87, 05, 05] +A2E9; [90 15, 05, 05] -14B3; [71 89, 05, 05] +A2EA; [90 17, 05, 05] -14B4; [71 8B, 05, 05] +A2EB; [90 19, 05, 05] -14B5; [71 8D, 05, 05] +A2EC; [90 1B, 05, 05] -14B6; [71 8F, 05, 05] +A2ED; [90 1D, 05, 05] -14B7; [71 91, 05, 05] +A2EE; [90 1F, 05, 05] -14B8; [71 93, 05, 05] +A2EF; [90 21, 05, 05] -14B9; [71 95, 05, 05] +A2F0; [90 23, 05, 05] -14BA; [71 97, 05, 05] +A2F1; [90 25, 05, 05] -14BB; [71 99, 05, 05] +A2F2; [90 27, 05, 05] -14BC; [71 9B, 05, 05] +A2F3; [90 29, 05, 05] -14BD; [71 9D, 05, 05] +A2F4; [90 2B, 05, 05] -14BE; [71 9F, 05, 05] +A2F5; [90 2D, 05, 05] -14BF; [71 A1, 05, 05] +A2F6; [90 2F, 05, 05] -14C0; [71 A3, 05, 05] +A2F7; [90 31, 05, 05] -14C1; [71 A5, 05, 05] +A2F8; [90 33, 05, 05] -14C2; [71 A7, 05, 05] +A2F9; [90 35, 05, 05] -14C3; [71 A9, 05, 05] +A2FA; [90 37, 05, 05] -14C4; [71 AB, 05, 05] +A2FB; [90 39, 05, 05] -14C5; [71 AD, 05, 05] +A2FC; [90 3B, 05, 05] -14C6; [71 AF, 05, 05] +A2FD; [90 3D, 05, 05] -14C7; [71 B1, 05, 05] +A2FE; [90 3F, 05, 05] -14C8; [71 B3, 05, 05] +A2FF; [90 41, 05, 05] -14C9; [71 B5, 05, 05] +A300; [90 43, 05, 05] -14CA; [71 B7, 05, 05] +A301; [90 45, 05, 05] -14CB; [71 B9, 05, 05] +A302; [90 47, 05, 05] -14CC; [71 BB, 05, 05] +A303; [90 49, 05, 05] -14CD; [71 BD, 05, 05] +A304; [90 4B, 05, 05] -14CE; [71 BF, 05, 05] +A305; [90 4D, 05, 05] -14CF; [71 C1, 05, 05] +A306; [90 4F, 05, 05] -14D0; [71 C3, 05, 05] +A307; [90 51, 05, 05] -14D1; [71 C5, 05, 05] +A308; [90 53, 05, 05] -14D2; [71 C7, 05, 05] +A309; [90 55, 05, 05] -14D3; [71 C9, 05, 05] +A30A; [90 57, 05, 05] -14D4; [71 CB, 05, 05] +A30B; [90 59, 05, 05] -14D5; [71 CD, 05, 05] +A30C; [90 5B, 05, 05] -14D6; [71 CF, 05, 05] +A30D; [90 5D, 05, 05] -14D7; [71 D1, 05, 05] +A30E; [90 5F, 05, 05] -14D8; [71 D3, 05, 05] +A30F; [90 61, 05, 05] -14D9; [71 D5, 05, 05] +A310; [90 63, 05, 05] -14DA; [71 D7, 05, 05] +A311; [90 65, 05, 05] -14DB; [71 D9, 05, 05] +A312; [90 67, 05, 05] -14DC; [71 DB, 05, 05] +A313; [90 69, 05, 05] -14DD; [71 DD, 05, 05] +A314; [90 6B, 05, 05] -14DE; [71 DF, 05, 05] +A315; [90 6D, 05, 05] -14DF; [71 E1, 05, 05] +A316; [90 6F, 05, 05] -14E0; [71 E3, 05, 05] +A317; [90 71, 05, 05] -14E1; [71 E5, 05, 05] +A318; [90 73, 05, 05] -14E2; [71 E7, 05, 05] +A319; [90 75, 05, 05] -14E3; [71 E9, 05, 05] +A31A; [90 77, 05, 05] -14E4; [71 EB, 05, 05] +A31B; [90 79, 05, 05] -14E5; [71 ED, 05, 05] +A31C; [90 7B, 05, 05] -14E6; [71 EF, 05, 05] +A31D; [90 7D, 05, 05] -14E7; [71 F1, 05, 05] +A31E; [90 7F, 05, 05] -14E8; [71 F3, 05, 05] +A31F; [90 81, 05, 05] -14E9; [71 F5, 05, 05] +A320; [90 83, 05, 05] -14EA; [71 F7, 05, 05] +A321; [90 85, 05, 05] -14EB; [71 F9, 05, 05] +A322; [90 87, 05, 05] -14EC; [71 FB, 05, 05] +A323; [90 89, 05, 05] -14ED; [71 FD, 05, 05] +A324; [90 8B, 05, 05] -14EE; [72 05, 05, 05] +A325; [90 8D, 05, 05] -14EF; [72 07, 05, 05] +A326; [90 8F, 05, 05] -14F0; [72 09, 05, 05] +A327; [90 91, 05, 05] -14F1; [72 0B, 05, 05] +A328; [90 93, 05, 05] -14F2; [72 0D, 05, 05] +A329; [90 95, 05, 05] -14F3; [72 0F, 05, 05] +A32A; [90 97, 05, 05] -14F4; [72 11, 05, 05] +A32B; [90 99, 05, 05] -14F5; [72 13, 05, 05] +A32C; [90 9B, 05, 05] -14F6; [72 15, 05, 05] +A32D; [90 9D, 05, 05] -14F7; [72 17, 05, 05] +A32E; [90 9F, 05, 05] -14F8; [72 19, 05, 05] +A32F; [90 A1, 05, 05] -14F9; [72 1B, 05, 05] +A330; [90 A3, 05, 05] -14FA; [72 1D, 05, 05] +A331; [90 A5, 05, 05] -14FB; [72 1F, 05, 05] +A332; [90 A7, 05, 05] -14FC; [72 21, 05, 05] +A333; [90 A9, 05, 05] -14FD; [72 23, 05, 05] +A334; [90 AB, 05, 05] -14FE; [72 25, 05, 05] +A335; [90 AD, 05, 05] -14FF; [72 27, 05, 05] +A336; [90 AF, 05, 05] -1500; [72 29, 05, 05] +A337; [90 B1, 05, 05] -1501; [72 2B, 05, 05] +A338; [90 B3, 05, 05] -1502; [72 2D, 05, 05] +A339; [90 B5, 05, 05] -1503; [72 2F, 05, 05] +A33A; [90 B7, 05, 05] -1504; [72 31, 05, 05] +A33B; [90 B9, 05, 05] -1505; [72 33, 05, 05] +A33C; [90 BB, 05, 05] -1506; [72 35, 05, 05] +A33D; [90 BD, 05, 05] -1507; [72 37, 05, 05] +A33E; [90 BF, 05, 05] -1508; [72 39, 05, 05] +A33F; [90 C1, 05, 05] -1509; [72 3B, 05, 05] +A340; [90 C3, 05, 05] -150A; [72 3D, 05, 05] +A341; [90 C5, 05, 05] -150B; [72 3F, 05, 05] +A342; [90 C7, 05, 05] -150C; [72 41, 05, 05] +A343; [90 C9, 05, 05] -150D; [72 43, 05, 05] +A344; [90 CB, 05, 05] -150E; [72 45, 05, 05] +A345; [90 CD, 05, 05] -150F; [72 47, 05, 05] +A346; [90 CF, 05, 05] -1510; [72 49, 05, 05] +A347; [90 D1, 05, 05] -1511; [72 4B, 05, 05] +A348; [90 D3, 05, 05] -1512; [72 4D, 05, 05] +A349; [90 D5, 05, 05] -1513; [72 4F, 05, 05] +A34A; [90 D7, 05, 05] -1514; [72 51, 05, 05] +A34B; [90 D9, 05, 05] -1515; [72 53, 05, 05] +A34C; [90 DB, 05, 05] -1516; [72 55, 05, 05] +A34D; [90 DD, 05, 05] -1517; [72 57, 05, 05] +A34E; [90 DF, 05, 05] -1518; [72 59, 05, 05] +A34F; [90 E1, 05, 05] -1519; [72 5B, 05, 05] +A350; [90 E3, 05, 05] -151A; [72 5D, 05, 05] +A351; [90 E5, 05, 05] -151B; [72 5F, 05, 05] +A352; [90 E7, 05, 05] -151C; [72 61, 05, 05] +A353; [90 E9, 05, 05] -151D; [72 63, 05, 05] +A354; [90 EB, 05, 05] -151E; [72 65, 05, 05] +A355; [90 ED, 05, 05] -151F; [72 67, 05, 05] +A356; [90 EF, 05, 05] -1520; [72 69, 05, 05] +A357; [90 F1, 05, 05] -1521; [72 6B, 05, 05] +A358; [90 F3, 05, 05] -1522; [72 6D, 05, 05] +A359; [90 F5, 05, 05] -1523; [72 6F, 05, 05] +A35A; [90 F7, 05, 05] -1524; [72 71, 05, 05] +A35B; [90 F9, 05, 05] -1525; [72 73, 05, 05] +A35C; [90 FB, 05, 05] -1526; [72 75, 05, 05] +A35D; [90 FD, 05, 05] -1527; [72 77, 05, 05] +A35E; [91 05, 05, 05] -1528; [72 79, 05, 05] +A35F; [91 07, 05, 05] -1529; [72 7B, 05, 05] +A360; [91 09, 05, 05] -152A; [72 7D, 05, 05] +A361; [91 0B, 05, 05] -152B; [72 7F, 05, 05] +A362; [91 0D, 05, 05] -152C; [72 81, 05, 05] +A363; [91 0F, 05, 05] -152D; [72 83, 05, 05] +A364; [91 11, 05, 05] -152E; [72 85, 05, 05] +A365; [91 13, 05, 05] -152F; [72 87, 05, 05] +A366; [91 15, 05, 05] -1530; [72 89, 05, 05] +A367; [91 17, 05, 05] -1531; [72 8B, 05, 05] +A368; [91 19, 05, 05] -1532; [72 8D, 05, 05] +A369; [91 1B, 05, 05] -1533; [72 8F, 05, 05] +A36A; [91 1D, 05, 05] -1534; [72 91, 05, 05] +A36B; [91 1F, 05, 05] -1535; [72 93, 05, 05] +A36C; [91 21, 05, 05] -1536; [72 95, 05, 05] +A36D; [91 23, 05, 05] -1537; [72 97, 05, 05] +A36E; [91 25, 05, 05] -1538; [72 99, 05, 05] +A36F; [91 27, 05, 05] -1539; [72 9B, 05, 05] +A370; [91 29, 05, 05] -153A; [72 9D, 05, 05] +A371; [91 2B, 05, 05] -153B; [72 9F, 05, 05] +A372; [91 2D, 05, 05] -153C; [72 A1, 05, 05] +A373; [91 2F, 05, 05] -153D; [72 A3, 05, 05] +A374; [91 31, 05, 05] -153E; [72 A5, 05, 05] +A375; [91 33, 05, 05] -153F; [72 A7, 05, 05] +A376; [91 35, 05, 05] -1540; [72 A9, 05, 05] +A377; [91 37, 05, 05] -1541; [72 AB, 05, 05] +A378; [91 39, 05, 05] -1542; [72 AD, 05, 05] +A379; [91 3B, 05, 05] -1543; [72 AF, 05, 05] +A37A; [91 3D, 05, 05] -1544; [72 B1, 05, 05] +A37B; [91 3F, 05, 05] -1545; [72 B3, 05, 05] +A37C; [91 41, 05, 05] -1546; [72 B5, 05, 05] +A37D; [91 43, 05, 05] -1547; [72 B7, 05, 05] +A37E; [91 45, 05, 05] -1548; [72 B9, 05, 05] +A37F; [91 47, 05, 05] -1549; [72 BB, 05, 05] +A380; [91 49, 05, 05] -154A; [72 BD, 05, 05] +A381; [91 4B, 05, 05] -154B; [72 BF, 05, 05] +A382; [91 4D, 05, 05] -154C; [72 C1, 05, 05] +A383; [91 4F, 05, 05] -154D; [72 C3, 05, 05] +A384; [91 51, 05, 05] -154E; [72 C5, 05, 05] +A385; [91 53, 05, 05] -154F; [72 C7, 05, 05] +A386; [91 55, 05, 05] -1550; [72 C9, 05, 05] +A387; [91 57, 05, 05] -1551; [72 CB, 05, 05] +A388; [91 59, 05, 05] -1552; [72 CD, 05, 05] +A389; [91 5B, 05, 05] -1553; [72 CF, 05, 05] +A38A; [91 5D, 05, 05] -1554; [72 D1, 05, 05] +A38B; [91 5F, 05, 05] -1555; [72 D3, 05, 05] +A38C; [91 61, 05, 05] -1556; [72 D5, 05, 05] +A38D; [91 63, 05, 05] -1557; [72 D7, 05, 05] +A38E; [91 65, 05, 05] -1558; [72 D9, 05, 05] +A38F; [91 67, 05, 05] -1559; [72 DB, 05, 05] +A390; [91 69, 05, 05] -155A; [72 DD, 05, 05] +A391; [91 6B, 05, 05] -155B; [72 DF, 05, 05] +A392; [91 6D, 05, 05] -155C; [72 E1, 05, 05] +A393; [91 6F, 05, 05] -155D; [72 E3, 05, 05] +A394; [91 71, 05, 05] -155E; [72 E5, 05, 05] +A395; [91 73, 05, 05] -155F; [72 E7, 05, 05] +A396; [91 75, 05, 05] -1560; [72 E9, 05, 05] +A397; [91 77, 05, 05] -1561; [72 EB, 05, 05] +A398; [91 79, 05, 05] -1562; [72 ED, 05, 05] +A399; [91 7B, 05, 05] -1563; [72 EF, 05, 05] +A39A; [91 7D, 05, 05] -1564; [72 F1, 05, 05] +A39B; [91 7F, 05, 05] -1565; [72 F3, 05, 05] +A39C; [91 81, 05, 05] -1566; [72 F5, 05, 05] +A39D; [91 83, 05, 05] -1567; [72 F7, 05, 05] +A39E; [91 85, 05, 05] -1568; [72 F9, 05, 05] +A39F; [91 87, 05, 05] -1569; [72 FB, 05, 05] +A3A0; [91 89, 05, 05] -156A; [72 FD, 05, 05] +A3A1; [91 8B, 05, 05] -156B; [73 05, 05, 05] +A3A2; [91 8D, 05, 05] -156C; [73 07, 05, 05] +A3A3; [91 8F, 05, 05] -156D; [73 09, 05, 05] +A3A4; [91 91, 05, 05] -156E; [73 0B, 05, 05] +A3A5; [91 93, 05, 05] -156F; [73 0D, 05, 05] +A3A6; [91 95, 05, 05] -1570; [73 0F, 05, 05] +A3A7; [91 97, 05, 05] -1571; [73 11, 05, 05] +A3A8; [91 99, 05, 05] -1572; [73 13, 05, 05] +A3A9; [91 9B, 05, 05] -1573; [73 15, 05, 05] +A3AA; [91 9D, 05, 05] -1574; [73 17, 05, 05] +A3AB; [91 9F, 05, 05] -1575; [73 19, 05, 05] +A3AC; [91 A1, 05, 05] -1576; [73 1B, 05, 05] +A3AD; [91 A3, 05, 05] -1577; [73 1D, 05, 05] +A3AE; [91 A5, 05, 05] -1578; [73 1F, 05, 05] +A3AF; [91 A7, 05, 05] -1579; [73 21, 05, 05] +A3B0; [91 A9, 05, 05] -157A; [73 23, 05, 05] +A3B1; [91 AB, 05, 05] -157B; [73 25, 05, 05] +A3B2; [91 AD, 05, 05] -157D; [73 27, 05, 05] +A3B3; [91 AF, 05, 05] -166F; [73 29, 05, 05] +A3B4; [91 B1, 05, 05] -157E; [73 2B, 05, 05] +A3B5; [91 B3, 05, 05] -157F; [73 2D, 05, 05] +A3B6; [91 B5, 05, 05] -1580; [73 2F, 05, 05] +A3B7; [91 B7, 05, 05] -1581; [73 31, 05, 05] +A3B8; [91 B9, 05, 05] -1582; [73 33, 05, 05] +A3B9; [91 BB, 05, 05] -1583; [73 35, 05, 05] +A3BA; [91 BD, 05, 05] -1584; [73 37, 05, 05] +A3BB; [91 BF, 05, 05] -1585; [73 39, 05, 05] +A3BC; [91 C1, 05, 05] -1586; [73 3B, 05, 05] +A3BD; [91 C3, 05, 05] -1587; [73 3D, 05, 05] +A3BE; [91 C5, 05, 05] -1588; [73 3F, 05, 05] +A3BF; [91 C7, 05, 05] -1589; [73 41, 05, 05] +A3C0; [91 C9, 05, 05] -158A; [73 43, 05, 05] +A3C1; [91 CB, 05, 05] -158B; [73 45, 05, 05] +A3C2; [91 CD, 05, 05] -158C; [73 47, 05, 05] +A3C3; [91 CF, 05, 05] -158D; [73 49, 05, 05] +A3C4; [91 D1, 05, 05] -1670; [73 4B, 05, 05] +A3C5; [91 D3, 05, 05] -158E; [73 4D, 05, 05] +A3C6; [91 D5, 05, 05] -158F; [73 4F, 05, 05] +A3C7; [91 D7, 05, 05] -1590; [73 51, 05, 05] +A3C8; [91 D9, 05, 05] -1591; [73 53, 05, 05] +A3C9; [91 DB, 05, 05] -1592; [73 55, 05, 05] +A3CA; [91 DD, 05, 05] -1593; [73 57, 05, 05] +A3CB; [91 DF, 05, 05] -1594; [73 59, 05, 05] +A3CC; [91 E1, 05, 05] -1595; [73 5B, 05, 05] +A3CD; [91 E3, 05, 05] -1671; [73 5D, 05, 05] +A3CE; [91 E5, 05, 05] -1672; [73 5F, 05, 05] +A3CF; [91 E7, 05, 05] -1673; [73 61, 05, 05] +A3D0; [91 E9, 05, 05] -1674; [73 63, 05, 05] +A3D1; [91 EB, 05, 05] -1675; [73 65, 05, 05] +A3D2; [91 ED, 05, 05] -1676; [73 67, 05, 05] +A3D3; [91 EF, 05, 05] -1596; [73 69, 05, 05] +A3D4; [91 F1, 05, 05] -1597; [73 6B, 05, 05] +A3D5; [91 F3, 05, 05] -1598; [73 6D, 05, 05] +A3D6; [91 F5, 05, 05] -1599; [73 6F, 05, 05] +A3D7; [91 F7, 05, 05] -159A; [73 71, 05, 05] +A3D8; [91 F9, 05, 05] -159B; [73 73, 05, 05] +A3D9; [91 FB, 05, 05] -159C; [73 75, 05, 05] +A3DA; [91 FD, 05, 05] -159D; [73 77, 05, 05] +A3DB; [92 05, 05, 05] -159E; [73 79, 05, 05] +A3DC; [92 07, 05, 05] -159F; [73 7B, 05, 05] +A3DD; [92 09, 05, 05] -15A0; [73 7D, 05, 05] +A3DE; [92 0B, 05, 05] -15A1; [73 7F, 05, 05] +A3DF; [92 0D, 05, 05] -15A2; [73 81, 05, 05] +A3E0; [92 0F, 05, 05] -15A3; [73 83, 05, 05] +A3E1; [92 11, 05, 05] -15A4; [73 85, 05, 05] +A3E2; [92 13, 05, 05] -15A5; [73 87, 05, 05] +A3E3; [92 15, 05, 05] -15A6; [73 89, 05, 05] +A3E4; [92 17, 05, 05] -157C; [73 8B, 05, 05] +A3E5; [92 19, 05, 05] -15A7; [73 8D, 05, 05] +A3E6; [92 1B, 05, 05] -15A8; [73 8F, 05, 05] +A3E7; [92 1D, 05, 05] -15A9; [73 91, 05, 05] +A3E8; [92 1F, 05, 05] -15AA; [73 93, 05, 05] +A3E9; [92 21, 05, 05] -15AB; [73 95, 05, 05] +A3EA; [92 23, 05, 05] -15AC; [73 97, 05, 05] +A3EB; [92 25, 05, 05] -15AD; [73 99, 05, 05] +A3EC; [92 27, 05, 05] -15AE; [73 9B, 05, 05] +A3ED; [92 29, 05, 05] -15AF; [73 9D, 05, 05] +A3EE; [92 2B, 05, 05] -15B0; [73 9F, 05, 05] +A3EF; [92 2D, 05, 05] -15B1; [73 A1, 05, 05] +A3F0; [92 2F, 05, 05] -15B2; [73 A3, 05, 05] +A3F1; [92 31, 05, 05] -15B3; [73 A5, 05, 05] +A3F2; [92 33, 05, 05] -15B4; [73 A7, 05, 05] +A3F3; [92 35, 05, 05] -15B5; [73 A9, 05, 05] +A3F4; [92 37, 05, 05] -15B6; [73 AB, 05, 05] +A3F5; [92 39, 05, 05] -15B7; [73 AD, 05, 05] +A3F6; [92 3B, 05, 05] -15B8; [73 AF, 05, 05] +A3F7; [92 3D, 05, 05] -15B9; [73 B1, 05, 05] +A3F8; [92 3F, 05, 05] -15BA; [73 B3, 05, 05] +A3F9; [92 41, 05, 05] -15BB; [73 B5, 05, 05] +A3FA; [92 43, 05, 05] -15BC; [73 B7, 05, 05] +A3FB; [92 45, 05, 05] -15BD; [73 B9, 05, 05] +A3FC; [92 47, 05, 05] -15BE; [73 BB, 05, 05] +A3FD; [92 49, 05, 05] -15BF; [73 BD, 05, 05] +A3FE; [92 4B, 05, 05] -15C0; [73 BF, 05, 05] +A3FF; [92 4D, 05, 05] -15C1; [73 C1, 05, 05] +A400; [92 4F, 05, 05] -15C2; [73 C3, 05, 05] +A401; [92 51, 05, 05] -15C3; [73 C5, 05, 05] +A402; [92 53, 05, 05] -15C4; [73 C7, 05, 05] +A403; [92 55, 05, 05] -15C5; [73 C9, 05, 05] +A404; [92 57, 05, 05] -15C6; [73 CB, 05, 05] +A405; [92 59, 05, 05] -15C7; [73 CD, 05, 05] +A406; [92 5B, 05, 05] -15C8; [73 CF, 05, 05] +A407; [92 5D, 05, 05] -15C9; [73 D1, 05, 05] +A408; [92 5F, 05, 05] -15CA; [73 D3, 05, 05] +A409; [92 61, 05, 05] -15CB; [73 D5, 05, 05] +A40A; [92 63, 05, 05] -15CC; [73 D7, 05, 05] +A40B; [92 65, 05, 05] -15CD; [73 D9, 05, 05] +A40C; [92 67, 05, 05] -15CE; [73 DB, 05, 05] +A40D; [92 69, 05, 05] -15CF; [73 DD, 05, 05] +A40E; [92 6B, 05, 05] -15D0; [73 DF, 05, 05] +A40F; [92 6D, 05, 05] -15D1; [73 E1, 05, 05] +A410; [92 6F, 05, 05] -15D2; [73 E3, 05, 05] +A411; [92 71, 05, 05] -15D3; [73 E5, 05, 05] +A412; [92 73, 05, 05] -15D4; [73 E7, 05, 05] +A413; [92 75, 05, 05] -15D5; [73 E9, 05, 05] +A414; [92 77, 05, 05] -15D6; [73 EB, 05, 05] +A415; [92 79, 05, 05] -15D7; [73 ED, 05, 05] +A416; [92 7B, 05, 05] -15D8; [73 EF, 05, 05] +A417; [92 7D, 05, 05] -15D9; [73 F1, 05, 05] +A418; [92 7F, 05, 05] -15DA; [73 F3, 05, 05] +A419; [92 81, 05, 05] -15DB; [73 F5, 05, 05] +A41A; [92 83, 05, 05] -15DC; [73 F7, 05, 05] +A41B; [92 85, 05, 05] -15DD; [73 F9, 05, 05] +A41C; [92 87, 05, 05] -15DE; [73 FB, 05, 05] +A41D; [92 89, 05, 05] -15DF; [73 FD, 05, 05] +A41E; [92 8B, 05, 05] -15E0; [74 05, 05, 05] +A41F; [92 8D, 05, 05] -15E1; [74 07, 05, 05] +A420; [92 8F, 05, 05] -15E2; [74 09, 05, 05] +A421; [92 91, 05, 05] -15E3; [74 0B, 05, 05] +A422; [92 93, 05, 05] -15E4; [74 0D, 05, 05] +A423; [92 95, 05, 05] -15E5; [74 0F, 05, 05] +A424; [92 97, 05, 05] -15E6; [74 11, 05, 05] +A425; [92 99, 05, 05] -15E7; [74 13, 05, 05] +A426; [92 9B, 05, 05] -15E8; [74 15, 05, 05] +A427; [92 9D, 05, 05] -15E9; [74 17, 05, 05] +A428; [92 9F, 05, 05] -15EA; [74 19, 05, 05] +A429; [92 A1, 05, 05] -15EB; [74 1B, 05, 05] +A42A; [92 A3, 05, 05] -15EC; [74 1D, 05, 05] +A42B; [92 A5, 05, 05] -15ED; [74 1F, 05, 05] +A42C; [92 A7, 05, 05] -15EE; [74 21, 05, 05] +A42D; [92 A9, 05, 05] -15EF; [74 23, 05, 05] +A42E; [92 AB, 05, 05] -15F0; [74 25, 05, 05] +A42F; [92 AD, 05, 05] -15F1; [74 27, 05, 05] +A430; [92 AF, 05, 05] -15F2; [74 29, 05, 05] +A431; [92 B1, 05, 05] -15F3; [74 2B, 05, 05] +A432; [92 B3, 05, 05] -15F4; [74 2D, 05, 05] +A433; [92 B5, 05, 05] -15F5; [74 2F, 05, 05] +A434; [92 B7, 05, 05] -15F6; [74 31, 05, 05] +A435; [92 B9, 05, 05] -15F7; [74 33, 05, 05] +A436; [92 BB, 05, 05] -15F8; [74 35, 05, 05] +A437; [92 BD, 05, 05] -15F9; [74 37, 05, 05] +A438; [92 BF, 05, 05] -15FA; [74 39, 05, 05] +A439; [92 C1, 05, 05] -15FB; [74 3B, 05, 05] +A43A; [92 C3, 05, 05] -15FC; [74 3D, 05, 05] +A43B; [92 C5, 05, 05] -15FD; [74 3F, 05, 05] +A43C; [92 C7, 05, 05] -15FE; [74 41, 05, 05] +A43D; [92 C9, 05, 05] -15FF; [74 43, 05, 05] +A43E; [92 CB, 05, 05] -1600; [74 45, 05, 05] +A43F; [92 CD, 05, 05] -1601; [74 47, 05, 05] +A440; [92 CF, 05, 05] -1602; [74 49, 05, 05] +A441; [92 D1, 05, 05] -1603; [74 4B, 05, 05] +A442; [92 D3, 05, 05] -1604; [74 4D, 05, 05] +A443; [92 D5, 05, 05] -1605; [74 4F, 05, 05] +A444; [92 D7, 05, 05] -1606; [74 51, 05, 05] +A445; [92 D9, 05, 05] -1607; [74 53, 05, 05] +A446; [92 DB, 05, 05] -1608; [74 55, 05, 05] +A447; [92 DD, 05, 05] -1609; [74 57, 05, 05] +A448; [92 DF, 05, 05] -160A; [74 59, 05, 05] +A449; [92 E1, 05, 05] -160B; [74 5B, 05, 05] +A44A; [92 E3, 05, 05] -160C; [74 5D, 05, 05] +A44B; [92 E5, 05, 05] -160D; [74 5F, 05, 05] +A44C; [92 E7, 05, 05] -160E; [74 61, 05, 05] +A44D; [92 E9, 05, 05] -160F; [74 63, 05, 05] +A44E; [92 EB, 05, 05] -1610; [74 65, 05, 05] +A44F; [92 ED, 05, 05] -1611; [74 67, 05, 05] +A450; [92 EF, 05, 05] -1612; [74 69, 05, 05] +A451; [92 F1, 05, 05] -1613; [74 6B, 05, 05] +A452; [92 F3, 05, 05] -1614; [74 6D, 05, 05] +A453; [92 F5, 05, 05] -1615; [74 6F, 05, 05] +A454; [92 F7, 05, 05] -1616; [74 71, 05, 05] +A455; [92 F9, 05, 05] -1617; [74 73, 05, 05] +A456; [92 FB, 05, 05] -1618; [74 75, 05, 05] +A457; [92 FD, 05, 05] -1619; [74 77, 05, 05] +A458; [93 05, 05, 05] -161A; [74 79, 05, 05] +A459; [93 07, 05, 05] -161B; [74 7B, 05, 05] +A45A; [93 09, 05, 05] -161C; [74 7D, 05, 05] +A45B; [93 0B, 05, 05] -161D; [74 7F, 05, 05] +A45C; [93 0D, 05, 05] -161E; [74 81, 05, 05] +A45D; [93 0F, 05, 05] -161F; [74 83, 05, 05] +A45E; [93 11, 05, 05] -1620; [74 85, 05, 05] +A45F; [93 13, 05, 05] -1621; [74 87, 05, 05] +A460; [93 15, 05, 05] -1622; [74 89, 05, 05] +A461; [93 17, 05, 05] -1623; [74 8B, 05, 05] +A462; [93 19, 05, 05] -1624; [74 8D, 05, 05] +A463; [93 1B, 05, 05] -1625; [74 8F, 05, 05] +A464; [93 1D, 05, 05] -1626; [74 91, 05, 05] +A465; [93 1F, 05, 05] -1627; [74 93, 05, 05] +A466; [93 21, 05, 05] -1628; [74 95, 05, 05] +A467; [93 23, 05, 05] -1629; [74 97, 05, 05] +A468; [93 25, 05, 05] -162A; [74 99, 05, 05] +A469; [93 27, 05, 05] -162B; [74 9B, 05, 05] +A46A; [93 29, 05, 05] -162C; [74 9D, 05, 05] +A46B; [93 2B, 05, 05] -162D; [74 9F, 05, 05] +A46C; [93 2D, 05, 05] -162E; [74 A1, 05, 05] +A46D; [93 2F, 05, 05] -162F; [74 A3, 05, 05] +A46E; [93 31, 05, 05] -1630; [74 A5, 05, 05] +A46F; [93 33, 05, 05] -1631; [74 A7, 05, 05] +A470; [93 35, 05, 05] -1632; [74 A9, 05, 05] +A471; [93 37, 05, 05] -1633; [74 AB, 05, 05] +A472; [93 39, 05, 05] -1634; [74 AD, 05, 05] +A473; [93 3B, 05, 05] -1635; [74 AF, 05, 05] +A474; [93 3D, 05, 05] -1636; [74 B1, 05, 05] +A475; [93 3F, 05, 05] -1637; [74 B3, 05, 05] +A476; [93 41, 05, 05] -1638; [74 B5, 05, 05] +A477; [93 43, 05, 05] -1639; [74 B7, 05, 05] +A478; [93 45, 05, 05] -163A; [74 B9, 05, 05] +A479; [93 47, 05, 05] -163B; [74 BB, 05, 05] +A47A; [93 49, 05, 05] -163C; [74 BD, 05, 05] +A47B; [93 4B, 05, 05] -163D; [74 BF, 05, 05] +A47C; [93 4D, 05, 05] -163E; [74 C1, 05, 05] +A47D; [93 4F, 05, 05] -163F; [74 C3, 05, 05] +A47E; [93 51, 05, 05] -1640; [74 C5, 05, 05] +A47F; [93 53, 05, 05] -1641; [74 C7, 05, 05] +A480; [93 55, 05, 05] -1642; [74 C9, 05, 05] +A481; [93 57, 05, 05] -1643; [74 CB, 05, 05] +A482; [93 59, 05, 05] -1644; [74 CD, 05, 05] +A483; [93 5B, 05, 05] -1645; [74 CF, 05, 05] +A484; [93 5D, 05, 05] -1646; [74 D1, 05, 05] +A485; [93 5F, 05, 05] -1647; [74 D3, 05, 05] +A486; [93 61, 05, 05] -1648; [74 D5, 05, 05] +A487; [93 63, 05, 05] -1649; [74 D7, 05, 05] +A488; [93 65, 05, 05] -164A; [74 D9, 05, 05] +A489; [93 67, 05, 05] -164B; [74 DB, 05, 05] +A48A; [93 69, 05, 05] -164C; [74 DD, 05, 05] +A48B; [93 6B, 05, 05] -164D; [74 DF, 05, 05] +A48C; [93 6D, 05, 05] -164E; [74 E1, 05, 05] +D800 DF00; [93 6F, 05, 05] -164F; [74 E3, 05, 05] +D800 DF01; [93 71, 05, 05] -1650; [74 E5, 05, 05] +D800 DF02; [93 73, 05, 05] -1651; [74 E7, 05, 05] +D800 DF03; [93 75, 05, 05] -1652; [74 E9, 05, 05] +D800 DF04; [93 77, 05, 05] -1653; [74 EB, 05, 05] +D800 DF05; [93 79, 05, 05] -1654; [74 ED, 05, 05] +D800 DF06; [93 7B, 05, 05] -1655; [74 EF, 05, 05] +D800 DF07; [93 7D, 05, 05] -1656; [74 F1, 05, 05] +D800 DF08; [93 7F, 05, 05] -1657; [74 F3, 05, 05] +D800 DF09; [93 81, 05, 05] -1658; [74 F5, 05, 05] +D800 DF0A; [93 83, 05, 05] -1659; [74 F7, 05, 05] +D800 DF0B; [93 85, 05, 05] -165A; [74 F9, 05, 05] +D800 DF0C; [93 87, 05, 05] -165B; [74 FB, 05, 05] +D800 DF0D; [93 89, 05, 05] -165C; [74 FD, 05, 05] +D800 DF0E; [93 8B, 05, 05] -165D; [75 05, 05, 05] +D800 DF0F; [93 8D, 05, 05] -165E; [75 07, 05, 05] +D800 DF10; [93 8F, 05, 05] -165F; [75 09, 05, 05] +D800 DF11; [93 91, 05, 05] -1660; [75 0B, 05, 05] +D800 DF12; [93 93, 05, 05] -1661; [75 0D, 05, 05] +D800 DF13; [93 95, 05, 05] -1662; [75 0F, 05, 05] +D800 DF14; [93 97, 05, 05] -1663; [75 11, 05, 05] +D800 DF15; [93 99, 05, 05] -1664; [75 13, 05, 05] +D800 DF16; [93 9B, 05, 05] -1665; [75 15, 05, 05] +D800 DF17; [93 9D, 05, 05] -1666; [75 17, 05, 05] +D800 DF18; [93 9F, 05, 05] -1667; [75 19, 05, 05] +D800 DF19; [93 A1, 05, 05] -1668; [75 1B, 05, 05] +D800 DF1A; [93 A3, 05, 05] -1669; [75 1D, 05, 05] +D800 DF1B; [93 A5, 05, 05] -166A; [75 1F, 05, 05] +D800 DF1C; [93 A7, 05, 05] -166B; [75 21, 05, 05] +D800 DF1D; [93 A9, 05, 05] -166C; [75 23, 05, 05] +D800 DF1E; [93 AB, 05, 05] -1681; [76 20, 05, 05] +D800 DF30; [93 AD, 05, 05] -1682; [76 22, 05, 05] +D800 DF31; [93 AF, 05, 05] -1683; [76 24, 05, 05] +D800 DF32; [93 B1, 05, 05] -1684; [76 26, 05, 05] +D800 DF33; [93 B3, 05, 05] -1685; [76 28, 05, 05] +D800 DF34; [93 B5, 05, 05] -1686; [76 2A, 05, 05] +D800 DF35; [93 B7, 05, 05] -1687; [76 2C, 05, 05] +D800 DF36; [93 B9, 05, 05] -1688; [76 2E, 05, 05] +D800 DF37; [93 BB, 05, 05] -1689; [76 30, 05, 05] +D800 DF38; [93 BD, 05, 05] -168A; [76 32, 05, 05] +D800 DF39; [93 BF, 05, 05] -168B; [76 34, 05, 05] +D800 DF3A; [93 C1, 05, 05] -168C; [76 36, 05, 05] +D800 DF3B; [93 C3, 05, 05] -168D; [76 38, 05, 05] +D800 DF3C; [93 C5, 05, 05] -168E; [76 3A, 05, 05] +D800 DF3D; [93 C7, 05, 05] -168F; [76 3C, 05, 05] +D800 DF3E; [93 C9, 05, 05] -1690; [76 3E, 05, 05] +D800 DF3F; [93 CB, 05, 05] -1691; [76 40, 05, 05] +D800 DF40; [93 CD, 05, 05] -1692; [76 42, 05, 05] +D800 DF41; [93 CF, 05, 05] -1693; [76 44, 05, 05] +D800 DF42; [93 D1, 05, 05] -1694; [76 46, 05, 05] +D800 DF43; [93 D3, 05, 05] -1695; [76 48, 05, 05] +D800 DF44; [93 D5, 05, 05] -1696; [76 4A, 05, 05] +D800 DF45; [93 D7, 05, 05] -1697; [76 4C, 05, 05] +D800 DF46; [93 D9, 05, 05] -1698; [76 4E, 05, 05] +D800 DF47; [93 DB, 05, 05] -1699; [76 50, 05, 05] +D800 DF48; [93 DD, 05, 05] -169A; [76 52, 05, 05] +D800 DF49; [93 DF, 05, 05] -16A0; [77 20, 05, 05] -16A1; [77 20, 05, 09][, DD 61, 09] +D800 DF4A; [93 E1, 05, 05] -16A2; [77 22, 05, 05] -16A4; [77 22, 05, 09][, DD 61, 09] -16A5; [77 22, 05, 09][, DF 79, 09] +D801 DC28; [93 E3, 05, 05] +D801 DC00; [93 E3, 05, 8F] -16A6; [77 24, 05, 05] -16A7; [77 24, 05, 09][, DD 61, 09] -16F0; [77 24, 05, 09][77 24, 05, 09] +D801 DC29; [93 E5, 05, 05] +D801 DC01; [93 E5, 05, 8F] -16A8; [77 26, 05, 05] -16A9; [77 26, 05, 09][, DD 61, 09] -16AC; [77 26, 05, 09][, DF 79, 09] -16AD; [77 26, 05, 09][, DF 89, 09] -16AE; [77 26, 05, 09][, DF 99, 09] +D801 DC2A; [93 E7, 05, 05] +D801 DC02; [93 E7, 05, 8F] -16AF; [77 28, 05, 05] +D801 DC2B; [93 E9, 05, 05] +D801 DC03; [93 E9, 05, 8F] -16B0; [77 2A, 05, 05] +D801 DC2C; [93 EB, 05, 05] +D801 DC04; [93 EB, 05, 8F] -16B1; [77 2C, 05, 05] +D801 DC2D; [93 ED, 05, 05] +D801 DC05; [93 ED, 05, 8F] -16B2; [77 2E, 05, 05] -16B3; [77 2E, 05, 09][, DD 61, 09] -16B4; [77 2E, 05, 09][, DF 79, 09] -16B5; [77 2E, 05, 09][, DF 89, 09] -16B6; [77 2E, 05, 09][, DF 99, 09] +D801 DC2E; [93 EF, 05, 05] +D801 DC06; [93 EF, 05, 8F] -16B7; [77 30, 05, 05] +D801 DC2F; [93 F1, 05, 05] +D801 DC07; [93 F1, 05, 8F] -16B9; [77 32, 05, 05] -16E9; [77 32, 05, 09][, DD 61, 09] +D801 DC30; [93 F3, 05, 05] +D801 DC08; [93 F3, 05, 8F] -16BA; [77 34, 05, 05] -16BB; [77 34, 05, 09][, DD 61, 09] -16BC; [77 34, 05, 09][, DF 79, 09] -16BD; [77 34, 05, 09][, DF 89, 09] +D801 DC31; [93 F5, 05, 05] +D801 DC09; [93 F5, 05, 8F] -16BE; [77 36, 05, 05] -16BF; [77 36, 05, 09][, DD 61, 09] -16C0; [77 36, 05, 09][, DF 79, 09] +D801 DC32; [93 F7, 05, 05] +D801 DC0A; [93 F7, 05, 8F] -16C1; [77 38, 05, 05] -16C2; [77 38, 05, 09][, DD 61, 09] +D801 DC33; [93 F9, 05, 05] +D801 DC0B; [93 F9, 05, 8F] -16C3; [77 3A, 05, 05] -16C4; [77 3A, 05, 09][, DD 61, 09] +D801 DC34; [93 FB, 05, 05] +D801 DC0C; [93 FB, 05, 8F] -16C5; [77 3C, 05, 05] -16C6; [77 3C, 05, 09][, DD 61, 09] -16EE; [77 3C, 05, 09][77 4E, 05, 09] +D801 DC35; [93 FD, 05, 05] +D801 DC0D; [93 FD, 05, 8F] -16C7; [77 3E, 05, 05] +D801 DC36; [94 05, 05, 05] +D801 DC0E; [94 05, 05, 8F] -16C8; [77 40, 05, 05] -16D5; [77 40, 05, 09][, DD 61, 09] +D801 DC37; [94 07, 05, 05] +D801 DC0F; [94 07, 05, 8F] -16C9; [77 42, 05, 05] +D801 DC38; [94 09, 05, 05] +D801 DC10; [94 09, 05, 8F] -16CA; [77 44, 05, 05] -16CB; [77 44, 05, 09][, DD 61, 09] -16EA; [77 44, 05, 09][, DF 79, 09] -16CC; [77 44, 05, 09][, DF 89, 09] -16CD; [77 44, 05, 09][, DF 99, 09] -16CE; [77 44, 05, 09][, E0 2D, 09] +D801 DC39; [94 0B, 05, 05] +D801 DC11; [94 0B, 05, 8F] -16CF; [77 46, 05, 05] -16D0; [77 46, 05, 09][, DD 61, 09] -16D1; [77 46, 05, 09][, DF 79, 09] +D801 DC3A; [94 0D, 05, 05] +D801 DC12; [94 0D, 05, 8F] -16D2; [77 48, 05, 05] -16D3; [77 48, 05, 09][, DD 61, 09] -16D4; [77 48, 05, 09][, DF 79, 09] +D801 DC3B; [94 0F, 05, 05] +D801 DC13; [94 0F, 05, 8F] -16D6; [77 4A, 05, 05] +D801 DC3C; [94 11, 05, 05] +D801 DC14; [94 11, 05, 8F] -16D7; [77 4C, 05, 05] -16D8; [77 4C, 05, 09][, DD 61, 09] -16D9; [77 4C, 05, 09][, DF 79, 09] -16EF; [77 4C, 05, 09][, DD 61, 09][77 4C, 05, 3D][, DD 61, 3D] +D801 DC3D; [94 13, 05, 05] +D801 DC15; [94 13, 05, 8F] -16DA; [77 4E, 05, 05] -16DB; [77 4E, 05, 09][, DD 61, 09] +D801 DC3E; [94 15, 05, 05] +D801 DC16; [94 15, 05, 8F] -16DC; [77 50, 05, 05] -16DD; [77 50, 05, 09][, DD 61, 09] +D801 DC3F; [94 17, 05, 05] +D801 DC17; [94 17, 05, 8F] -16DE; [77 52, 05, 05] +D801 DC40; [94 19, 05, 05] +D801 DC18; [94 19, 05, 8F] -16DF; [77 54, 05, 05] +D801 DC41; [94 1B, 05, 05] +D801 DC19; [94 1B, 05, 8F] -16AA; [77 56, 05, 05] +D801 DC42; [94 1D, 05, 05] +D801 DC1A; [94 1D, 05, 8F] -16AB; [77 58, 05, 05] +D801 DC43; [94 1F, 05, 05] +D801 DC1B; [94 1F, 05, 8F] -16A3; [77 5A, 05, 05] +D801 DC44; [94 21, 05, 05] +D801 DC1C; [94 21, 05, 8F] -16E0; [77 5C, 05, 05] +D801 DC45; [94 23, 05, 05] +D801 DC1D; [94 23, 05, 8F] -16E3; [77 5E, 05, 05] +D801 DC46; [94 25, 05, 05] +D801 DC1E; [94 25, 05, 8F] -16B8; [77 60, 05, 05] +D801 DC47; [94 27, 05, 05] +D801 DC1F; [94 27, 05, 8F] -16E4; [77 62, 05, 05] +D801 DC48; [94 29, 05, 05] +D801 DC20; [94 29, 05, 8F] -16E1; [77 64, 05, 05] +D801 DC49; [94 2B, 05, 05] +D801 DC21; [94 2B, 05, 8F] -16E2; [77 66, 05, 05] +D801 DC4A; [94 2D, 05, 05] +D801 DC22; [94 2D, 05, 8F] -16E5; [77 68, 05, 05] +D801 DC4B; [94 2F, 05, 05] +D801 DC23; [94 2F, 05, 8F] -16E6; [77 6A, 05, 05] -16E7; [77 6A, 05, 09][, DD 61, 09] -16E8; [77 6A, 05, 09][, DF 79, 09] +D801 DC4C; [94 31, 05, 05] +D801 DC24; [94 31, 05, 8F] -1100; [78 20, 05, 05] -3131; [78 20, 05, 09] -3260; [78 20, 05, 0D] -FFA1; [78 20, 05, A3] -326E; [78 20, 05, 0D][78 48, 05, 0D] +D801 DC4D; [94 33, 05, 05] +D801 DC25; [94 33, 05, 8F] -1101; [78 22, 05, 05] -3132; [78 22, 05, 09] -FFA2; [78 22, 05, A3] +D801 DC4E; [94 35, 05, 05] +D801 DC26; [94 35, 05, 8F] -1102; [78 24, 05, 05] -3134; [78 24, 05, 09] -3261; [78 24, 05, 0D] -FFA4; [78 24, 05, A3] -326F; [78 24, 05, 0D][78 48, 05, 0D] +D801 DC4F; [94 37, 05, 05] +D801 DC27; [94 37, 05, 8F] -1103; [78 26, 05, 05] -3137; [78 26, 05, 09] -3262; [78 26, 05, 0D] -FFA7; [78 26, 05, A3] -3270; [78 26, 05, 0D][78 48, 05, 0D] +D801 DC50; [94 39, 05, 05] -1104; [78 28, 05, 05] -3138; [78 28, 05, 09] -FFA8; [78 28, 05, A3] +D801 DC51; [94 3B, 05, 05] -1105; [78 2A, 05, 05] -3139; [78 2A, 05, 09] -3263; [78 2A, 05, 0D] -FFA9; [78 2A, 05, A3] -3271; [78 2A, 05, 0D][78 48, 05, 0D] +D801 DC52; [94 3D, 05, 05] -1106; [78 2C, 05, 05] -3141; [78 2C, 05, 09] -3264; [78 2C, 05, 0D] -FFB1; [78 2C, 05, A3] -3272; [78 2C, 05, 0D][78 48, 05, 0D] +D801 DC53; [94 3F, 05, 05] -1107; [78 2E, 05, 05] -3142; [78 2E, 05, 09] -3265; [78 2E, 05, 0D] -FFB2; [78 2E, 05, A3] -3273; [78 2E, 05, 0D][78 48, 05, 0D] +D801 DC54; [94 41, 05, 05] -1108; [78 30, 05, 05] -3143; [78 30, 05, 09] -FFB3; [78 30, 05, A3] +D801 DC55; [94 43, 05, 05] -1109; [78 32, 05, 05] -3145; [78 32, 05, 09] -3266; [78 32, 05, 0D] -FFB5; [78 32, 05, A3] -3274; [78 32, 05, 0D][78 48, 05, 0D] +D801 DC56; [94 45, 05, 05] -110A; [78 34, 05, 05] -3146; [78 34, 05, 09] -FFB6; [78 34, 05, A3] +D801 DC57; [94 47, 05, 05] -110B; [78 36, 05, 05] -3147; [78 36, 05, 09] -3267; [78 36, 05, 0D] -FFB7; [78 36, 05, A3] -3275; [78 36, 05, 0D][78 48, 05, 0D] +D801 DC58; [94 49, 05, 05] -110C; [78 38, 05, 05] -3148; [78 38, 05, 09] -3268; [78 38, 05, 0D] -FFB8; [78 38, 05, A3] -3276; [78 38, 05, 0D][78 48, 05, 0D] +D801 DC59; [94 4B, 05, 05] -110D; [78 3A, 05, 05] -3149; [78 3A, 05, 09] -FFB9; [78 3A, 05, A3] +D801 DC5A; [94 4D, 05, 05] -110E; [78 3C, 05, 05] -314A; [78 3C, 05, 09] -3269; [78 3C, 05, 0D] -FFBA; [78 3C, 05, A3] -3277; [78 3C, 05, 0D][78 48, 05, 0D] +D801 DC5B; [94 4F, 05, 05] -110F; [78 3E, 05, 05] -314B; [78 3E, 05, 09] -326A; [78 3E, 05, 0D] -FFBB; [78 3E, 05, A3] -3278; [78 3E, 05, 0D][78 48, 05, 0D] +D801 DC5C; [94 51, 05, 05] -1110; [78 40, 05, 05] -314C; [78 40, 05, 09] -326B; [78 40, 05, 0D] -FFBC; [78 40, 05, A3] -3279; [78 40, 05, 0D][78 48, 05, 0D] +D801 DC5D; [94 53, 05, 05] -1111; [78 42, 05, 05] -314D; [78 42, 05, 09] -326C; [78 42, 05, 0D] -FFBD; [78 42, 05, A3] -327A; [78 42, 05, 0D][78 48, 05, 0D] +D801 DC5E; [94 55, 05, 05] -1112; [78 44, 05, 05] -314E; [78 44, 05, 09] -326D; [78 44, 05, 0D] -FFBE; [78 44, 05, A3] -327B; [78 44, 05, 0D][78 48, 05, 0D] +D801 DC5F; [94 57, 05, 05] -1113; [78 46 10, 05, 05] +D801 DC60; [94 59, 05, 05] -1114; [78 46 13, 05, 05] -3165; [78 46 13, 05, 09] +D801 DC61; [94 5B, 05, 05] -1115; [78 46 16, 05, 05] -3166; [78 46 16, 05, 09] +D801 DC62; [94 5D, 05, 05] -1116; [78 46 19, 05, 05] +D801 DC63; [94 5F, 05, 05] -1117; [78 46 1C, 05, 05] +D801 DC64; [94 61, 05, 05] -1118; [78 46 1F, 05, 05] +D801 DC65; [94 63, 05, 05] -1119; [78 46 22, 05, 05] +D801 DC66; [94 65, 05, 05] -111A; [78 46 25, 05, 05] -3140; [78 46 25, 05, 09] -FFB0; [78 46 25, 05, A3] +D801 DC67; [94 67, 05, 05] -111B; [78 46 28, 05, 05] +D801 DC68; [94 69, 05, 05] -111C; [78 46 2B, 05, 05] -316E; [78 46 2B, 05, 09] +D801 DC69; [94 6B, 05, 05] -111D; [78 46 2E, 05, 05] -3171; [78 46 2E, 05, 09] +D801 DC6A; [94 6D, 05, 05] -111E; [78 46 31, 05, 05] -3172; [78 46 31, 05, 09] +D801 DC6B; [94 6F, 05, 05] -111F; [78 46 34, 05, 05] +D801 DC6C; [94 71, 05, 05] -1120; [78 46 37, 05, 05] -3173; [78 46 37, 05, 09] +D801 DC6D; [94 73, 05, 05] -1121; [78 46 3A, 05, 05] -3144; [78 46 3A, 05, 09] -FFB4; [78 46 3A, 05, A3] +D801 DC6E; [94 75, 05, 05] -1122; [78 46 3D, 05, 05] -3174; [78 46 3D, 05, 09] +D801 DC6F; [94 77, 05, 05] -1123; [78 46 40, 05, 05] -3175; [78 46 40, 05, 09] +D801 DC70; [94 79, 05, 05] -1124; [78 46 43, 05, 05] +D801 DC71; [94 7B, 05, 05] -1125; [78 46 46, 05, 05] +D801 DC72; [94 7D, 05, 05] -1126; [78 46 49, 05, 05] +D801 DC73; [94 7F, 05, 05] -1127; [78 46 4C, 05, 05] -3176; [78 46 4C, 05, 09] +D801 DC74; [94 81, 05, 05] -1128; [78 46 4F, 05, 05] +D801 DC75; [94 83, 05, 05] -1129; [78 46 52, 05, 05] -3177; [78 46 52, 05, 09] +D801 DC76; [94 85, 05, 05] -112A; [78 46 55, 05, 05] +D801 DC77; [94 87, 05, 05] -112B; [78 46 58, 05, 05] -3178; [78 46 58, 05, 09] +D801 DC78; [94 89, 05, 05] -112C; [78 46 5B, 05, 05] -3179; [78 46 5B, 05, 09] +D801 DC79; [94 8B, 05, 05] -112D; [78 46 5E, 05, 05] -317A; [78 46 5E, 05, 09] +D801 DC7A; [94 8D, 05, 05] -112E; [78 46 61, 05, 05] -317B; [78 46 61, 05, 09] +D801 DC7B; [94 8F, 05, 05] -112F; [78 46 64, 05, 05] -317C; [78 46 64, 05, 09] +D801 DC7C; [94 91, 05, 05] -1130; [78 46 67, 05, 05] +D801 DC7D; [94 93, 05, 05] -1131; [78 46 6A, 05, 05] +D801 DC7E; [94 95, 05, 05] -1132; [78 46 6D, 05, 05] -317D; [78 46 6D, 05, 09] +D801 DC7F; [94 97, 05, 05] -1133; [78 46 70, 05, 05] +D801 DC80; [94 99, 05, 05] -1134; [78 46 73, 05, 05] +D801 DC81; [94 9B, 05, 05] -1135; [78 46 76, 05, 05] +D801 DC82; [94 9D, 05, 05] -1136; [78 46 79, 05, 05] -317E; [78 46 79, 05, 09] +D801 DC83; [94 9F, 05, 05] -1137; [78 46 7C, 05, 05] +D801 DC84; [94 A1, 05, 05] -1138; [78 46 7F, 05, 05] +D801 DC85; [94 A3, 05, 05] -1139; [78 46 82, 05, 05] +D801 DC86; [94 A5, 05, 05] -113A; [78 46 85, 05, 05] +D801 DC87; [94 A7, 05, 05] -113B; [78 46 88, 05, 05] +D801 DC88; [94 A9, 05, 05] -113C; [78 46 8B, 05, 05] +D801 DC89; [94 AB, 05, 05] -113D; [78 46 8E, 05, 05] +D801 DC8A; [94 AD, 05, 05] -113E; [78 46 91, 05, 05] +D801 DC8B; [94 AF, 05, 05] -113F; [78 46 94, 05, 05] +D801 DC8C; [94 B1, 05, 05] -1140; [78 46 97, 05, 05] -317F; [78 46 97, 05, 09] +D801 DC8D; [94 B3, 05, 05] -1141; [78 46 9A, 05, 05] +D801 DC8E; [94 B5, 05, 05] -1142; [78 46 9D, 05, 05] +D801 DC8F; [94 B7, 05, 05] -1143; [78 46 A0, 05, 05] +D801 DC90; [94 B9, 05, 05] -1144; [78 46 A3, 05, 05] +D801 DC91; [94 BB, 05, 05] -1145; [78 46 A6, 05, 05] +D801 DC92; [94 BD, 05, 05] -1146; [78 46 A9, 05, 05] +D801 DC93; [94 BF, 05, 05] -1147; [78 46 AC, 05, 05] -3180; [78 46 AC, 05, 09] +D801 DC94; [94 C1, 05, 05] -1148; [78 46 AF, 05, 05] +D801 DC95; [94 C3, 05, 05] -1149; [78 46 B2, 05, 05] +D801 DC96; [94 C5, 05, 05] -114A; [78 46 B5, 05, 05] +D801 DC97; [94 C7, 05, 05] -114B; [78 46 B8, 05, 05] +D801 DC98; [94 C9, 05, 05] -114C; [78 46 BB, 05, 05] -3181; [78 46 BB, 05, 09] +D801 DC99; [94 CB, 05, 05] -114D; [78 46 BE, 05, 05] +D801 DC9A; [94 CD, 05, 05] -114E; [78 46 C1, 05, 05] +D801 DC9B; [94 CF, 05, 05] -114F; [78 46 C4, 05, 05] +D801 DC9C; [94 D1, 05, 05] -1150; [78 46 C7, 05, 05] +D801 DC9D; [94 D3, 05, 05] -1151; [78 46 CA, 05, 05] +D800 DC00; [94 D5, 05, 05] -1152; [78 46 CD, 05, 05] +D800 DC01; [94 D7, 05, 05] -1153; [78 46 D0, 05, 05] +D800 DC02; [94 D9, 05, 05] -1154; [78 46 D3, 05, 05] +D800 DC03; [94 DB, 05, 05] -1155; [78 46 D6, 05, 05] +D800 DC04; [94 DD, 05, 05] -1156; [78 46 D9, 05, 05] +D800 DC05; [94 DF, 05, 05] -1157; [78 46 DC, 05, 05] -3184; [78 46 DC, 05, 09] +D800 DC06; [94 E1, 05, 05] -1158; [78 46 DF, 05, 05] -3185; [78 46 DF, 05, 09] +D800 DC07; [94 E3, 05, 05] -1159; [78 46 E2, 05, 05] -3186; [78 46 E2, 05, 09] +D800 DC08; [94 E5, 05, 05] -115F; [78 46 E5, 05, 05] +D800 DC09; [94 E7, 05, 05] -1160; [78 46 E8, 05, 05] -3164; [78 46 E8, 05, 09] -FFA0; [78 46 E8, 05, A3] +D800 DC0A; [94 E9, 05, 05] -1161; [78 48, 05, 05] -314F; [78 48, 05, 09] -FFC2; [78 48, 05, A3] +D800 DC0B; [94 EB, 05, 05] -1162; [78 4A, 05, 05] -3150; [78 4A, 05, 09] -FFC3; [78 4A, 05, A3] +D800 DC0D; [94 ED, 05, 05] -1163; [78 4C, 05, 05] -3151; [78 4C, 05, 09] -FFC4; [78 4C, 05, A3] +D800 DC0E; [94 EF, 05, 05] -1164; [78 4E, 05, 05] -3152; [78 4E, 05, 09] -FFC5; [78 4E, 05, A3] +D800 DC0F; [94 F1, 05, 05] -1165; [78 50, 05, 05] -3153; [78 50, 05, 09] -FFC6; [78 50, 05, A3] +D800 DC10; [94 F3, 05, 05] -1166; [78 52, 05, 05] -3154; [78 52, 05, 09] -FFC7; [78 52, 05, A3] +D800 DC11; [94 F5, 05, 05] -1167; [78 54, 05, 05] -3155; [78 54, 05, 09] -FFCA; [78 54, 05, A3] +D800 DC12; [94 F7, 05, 05] -1168; [78 56, 05, 05] -3156; [78 56, 05, 09] -FFCB; [78 56, 05, A3] +D800 DC13; [94 F9, 05, 05] -1169; [78 58, 05, 05] -3157; [78 58, 05, 09] -FFCC; [78 58, 05, A3] +D800 DC14; [94 FB, 05, 05] -116A; [78 5A, 05, 05] -3158; [78 5A, 05, 09] -FFCD; [78 5A, 05, A3] +D800 DC15; [94 FD, 05, 05] -116B; [78 5C, 05, 05] -3159; [78 5C, 05, 09] -FFCE; [78 5C, 05, A3] +D800 DC16; [95 05, 05, 05] -116C; [78 5E, 05, 05] -315A; [78 5E, 05, 09] -FFCF; [78 5E, 05, A3] +D800 DC17; [95 07, 05, 05] -116D; [78 60, 05, 05] -315B; [78 60, 05, 09] -FFD2; [78 60, 05, A3] +D800 DC18; [95 09, 05, 05] -116E; [78 62, 05, 05] -315C; [78 62, 05, 09] -FFD3; [78 62, 05, A3] +D800 DC19; [95 0B, 05, 05] -116F; [78 64, 05, 05] -315D; [78 64, 05, 09] -FFD4; [78 64, 05, A3] +D800 DC1A; [95 0D, 05, 05] -1170; [78 66, 05, 05] -315E; [78 66, 05, 09] -FFD5; [78 66, 05, A3] +D800 DC1B; [95 0F, 05, 05] -1171; [78 68, 05, 05] -315F; [78 68, 05, 09] -FFD6; [78 68, 05, A3] +D800 DC1C; [95 11, 05, 05] -1172; [78 6A, 05, 05] -3160; [78 6A, 05, 09] -FFD7; [78 6A, 05, A3] +D800 DC1D; [95 13, 05, 05] -1173; [78 6C, 05, 05] -3161; [78 6C, 05, 09] -FFDA; [78 6C, 05, A3] +D800 DC1E; [95 15, 05, 05] -1174; [78 6E, 05, 05] -3162; [78 6E, 05, 09] -FFDB; [78 6E, 05, A3] +D800 DC1F; [95 17, 05, 05] -1175; [78 70, 05, 05] -3163; [78 70, 05, 09] -FFDC; [78 70, 05, A3] +D800 DC20; [95 19, 05, 05] -1176; [78 72 10, 05, 05] +D800 DC21; [95 1B, 05, 05] -1177; [78 72 13, 05, 05] +D800 DC22; [95 1D, 05, 05] -1178; [78 72 16, 05, 05] +D800 DC23; [95 1F, 05, 05] -1179; [78 72 19, 05, 05] +D800 DC24; [95 21, 05, 05] -117A; [78 72 1C, 05, 05] +D800 DC25; [95 23, 05, 05] -117B; [78 72 1F, 05, 05] +D800 DC26; [95 25, 05, 05] -117C; [78 72 22, 05, 05] +D800 DC28; [95 27, 05, 05] -117D; [78 72 25, 05, 05] +D800 DC29; [95 29, 05, 05] -117E; [78 72 28, 05, 05] +D800 DC2A; [95 2B, 05, 05] -117F; [78 72 2B, 05, 05] +D800 DC2B; [95 2D, 05, 05] -1180; [78 72 2E, 05, 05] +D800 DC2C; [95 2F, 05, 05] -1181; [78 72 31, 05, 05] +D800 DC2D; [95 31, 05, 05] -1182; [78 72 34, 05, 05] +D800 DC2E; [95 33, 05, 05] -1183; [78 72 37, 05, 05] +D800 DC2F; [95 35, 05, 05] -1184; [78 72 3A, 05, 05] -3187; [78 72 3A, 05, 09] +D800 DC30; [95 37, 05, 05] -1185; [78 72 3D, 05, 05] -3188; [78 72 3D, 05, 09] +D800 DC31; [95 39, 05, 05] -1186; [78 72 40, 05, 05] +D800 DC32; [95 3B, 05, 05] -1187; [78 72 43, 05, 05] +D800 DC33; [95 3D, 05, 05] -1188; [78 72 46, 05, 05] -3189; [78 72 46, 05, 09] +D800 DC34; [95 3F, 05, 05] -1189; [78 72 49, 05, 05] +D800 DC35; [95 41, 05, 05] -118A; [78 72 4C, 05, 05] +D800 DC36; [95 43, 05, 05] -118B; [78 72 4F, 05, 05] +D800 DC37; [95 45, 05, 05] -118C; [78 72 52, 05, 05] +D800 DC38; [95 47, 05, 05] -118D; [78 72 55, 05, 05] +D800 DC39; [95 49, 05, 05] -118E; [78 72 58, 05, 05] +D800 DC3A; [95 4B, 05, 05] -118F; [78 72 5B, 05, 05] +D800 DC3C; [95 4D, 05, 05] -1190; [78 72 5E, 05, 05] +D800 DC3D; [95 4F, 05, 05] -1191; [78 72 61, 05, 05] -318A; [78 72 61, 05, 09] +D800 DC3F; [95 51, 05, 05] -1192; [78 72 64, 05, 05] -318B; [78 72 64, 05, 09] +D800 DC40; [95 53, 05, 05] -1193; [78 72 67, 05, 05] +D800 DC41; [95 55, 05, 05] -1194; [78 72 6A, 05, 05] -318C; [78 72 6A, 05, 09] +D800 DC42; [95 57, 05, 05] -1195; [78 72 6D, 05, 05] +D800 DC43; [95 59, 05, 05] -1196; [78 72 70, 05, 05] +D800 DC44; [95 5B, 05, 05] -1197; [78 72 73, 05, 05] +D800 DC45; [95 5D, 05, 05] -1198; [78 72 76, 05, 05] +D800 DC46; [95 5F, 05, 05] -1199; [78 72 79, 05, 05] +D800 DC47; [95 61, 05, 05] -119A; [78 72 7C, 05, 05] +D800 DC48; [95 63, 05, 05] -119B; [78 72 7F, 05, 05] +D800 DC49; [95 65, 05, 05] -119C; [78 72 82, 05, 05] +D800 DC4A; [95 67, 05, 05] -119D; [78 72 85, 05, 05] +D800 DC4B; [95 69, 05, 05] -119E; [78 72 88, 05, 05] -318D; [78 72 88, 05, 09] +D800 DC4C; [95 6B, 05, 05] -119F; [78 72 8B, 05, 05] +D800 DC4D; [95 6D, 05, 05] -11A0; [78 72 8E, 05, 05] +D800 DC50; [95 6F, 05, 05] -11A1; [78 72 91, 05, 05] -318E; [78 72 91, 05, 09] +D800 DC51; [95 71, 05, 05] -11A2; [78 72 94, 05, 05] +D800 DC52; [95 73, 05, 05] -11A8; [78 74, 05, 05] +D800 DC53; [95 75, 05, 05] -11A9; [78 76, 05, 05] +D800 DC54; [95 77, 05, 05] -11AA; [78 78, 05, 05] -3133; [78 78, 05, 09] -FFA3; [78 78, 05, A3] +D800 DC55; [95 79, 05, 05] -11AB; [78 7A, 05, 05] +D800 DC56; [95 7B, 05, 05] -11AC; [78 7C, 05, 05] -3135; [78 7C, 05, 09] -FFA5; [78 7C, 05, A3] +D800 DC57; [95 7D, 05, 05] -11AD; [78 7E, 05, 05] -3136; [78 7E, 05, 09] -FFA6; [78 7E, 05, A3] +D800 DC58; [95 7F, 05, 05] -11AE; [78 80, 05, 05] +D800 DC59; [95 81, 05, 05] -11AF; [78 82, 05, 05] +D800 DC5A; [95 83, 05, 05] -11B0; [78 84, 05, 05] -313A; [78 84, 05, 09] -FFAA; [78 84, 05, A3] +D800 DC5B; [95 85, 05, 05] -11B1; [78 86, 05, 05] -313B; [78 86, 05, 09] -FFAB; [78 86, 05, A3] +D800 DC5C; [95 87, 05, 05] -11B2; [78 88, 05, 05] -313C; [78 88, 05, 09] -FFAC; [78 88, 05, A3] +D800 DC5D; [95 89, 05, 05] -11B3; [78 8A, 05, 05] -313D; [78 8A, 05, 09] -FFAD; [78 8A, 05, A3] +D800 DC80; [95 8B, 05, 05] -11B4; [78 8C, 05, 05] -313E; [78 8C, 05, 09] -FFAE; [78 8C, 05, A3] +D800 DC81; [95 8D, 05, 05] -11B5; [78 8E, 05, 05] -313F; [78 8E, 05, 09] -FFAF; [78 8E, 05, A3] +D800 DC82; [95 8F, 05, 05] -11B6; [78 90, 05, 05] +D800 DC83; [95 91, 05, 05] -11B7; [78 92, 05, 05] +D800 DC84; [95 93, 05, 05] -11B8; [78 94, 05, 05] +D800 DC85; [95 95, 05, 05] -11B9; [78 96, 05, 05] +D800 DC86; [95 97, 05, 05] -11BA; [78 98, 05, 05] +D800 DC87; [95 99, 05, 05] -11BB; [78 9A, 05, 05] +D800 DC88; [95 9B, 05, 05] -11BC; [78 9C, 05, 05] +D800 DC89; [95 9D, 05, 05] -11BD; [78 9E, 05, 05] +D800 DC8A; [95 9F, 05, 05] -11BE; [78 A0, 05, 05] +D800 DC8B; [95 A1, 05, 05] -11BF; [78 A2, 05, 05] +D800 DC8C; [95 A3, 05, 05] -11C0; [78 A4, 05, 05] +D800 DC8D; [95 A5, 05, 05] -11C1; [78 A6, 05, 05] +D800 DC8E; [95 A7, 05, 05] -11C2; [78 A8, 05, 05] +D800 DC8F; [95 A9, 05, 05] -11C3; [78 AA 10, 05, 05] +D800 DC90; [95 AB, 05, 05] -11C4; [78 AA 13, 05, 05] +D800 DC91; [95 AD, 05, 05] -11C5; [78 AA 16, 05, 05] +D800 DC92; [95 AF, 05, 05] -11C6; [78 AA 19, 05, 05] +D800 DC93; [95 B1, 05, 05] -11C7; [78 AA 1C, 05, 05] -3167; [78 AA 1C, 05, 09] +D800 DC94; [95 B3, 05, 05] -11C8; [78 AA 1F, 05, 05] -3168; [78 AA 1F, 05, 09] +D800 DC95; [95 B5, 05, 05] -11C9; [78 AA 22, 05, 05] +D800 DC96; [95 B7, 05, 05] -11CA; [78 AA 25, 05, 05] +D800 DC97; [95 B9, 05, 05] -11CB; [78 AA 28, 05, 05] +D800 DC98; [95 BB, 05, 05] -11CC; [78 AA 2B, 05, 05] -3169; [78 AA 2B, 05, 09] +D800 DC99; [95 BD, 05, 05] -11CD; [78 AA 2E, 05, 05] +D800 DC9A; [95 BF, 05, 05] -11CE; [78 AA 31, 05, 05] -316A; [78 AA 31, 05, 09] +D800 DC9B; [95 C1, 05, 05] -11CF; [78 AA 34, 05, 05] +D800 DC9C; [95 C3, 05, 05] -11D0; [78 AA 37, 05, 05] +D800 DC9D; [95 C5, 05, 05] -11D1; [78 AA 3A, 05, 05] +D800 DC9E; [95 C7, 05, 05] -11D2; [78 AA 3D, 05, 05] +D800 DC9F; [95 C9, 05, 05] -11D3; [78 AA 40, 05, 05] -316B; [78 AA 40, 05, 09] +D800 DCA0; [95 CB, 05, 05] -11D4; [78 AA 43, 05, 05] +D800 DCA1; [95 CD, 05, 05] -11D5; [78 AA 46, 05, 05] +D800 DCA2; [95 CF, 05, 05] -11D6; [78 AA 49, 05, 05] +D800 DCA3; [95 D1, 05, 05] -11D7; [78 AA 4C, 05, 05] -316C; [78 AA 4C, 05, 09] +D800 DCA4; [95 D3, 05, 05] -11D8; [78 AA 4F, 05, 05] +D800 DCA5; [95 D5, 05, 05] -11D9; [78 AA 52, 05, 05] -316D; [78 AA 52, 05, 09] +D800 DCA6; [95 D7, 05, 05] -11DA; [78 AA 55, 05, 05] +D800 DCA7; [95 D9, 05, 05] -11DB; [78 AA 58, 05, 05] +D800 DCA8; [95 DB, 05, 05] -11DC; [78 AA 5B, 05, 05] +D800 DCA9; [95 DD, 05, 05] -11DD; [78 AA 5E, 05, 05] -316F; [78 AA 5E, 05, 09] +D800 DCAA; [95 DF, 05, 05] -11DE; [78 AA 61, 05, 05] +D800 DCAB; [95 E1, 05, 05] -11DF; [78 AA 64, 05, 05] -3170; [78 AA 64, 05, 09] +D800 DCAC; [95 E3, 05, 05] -11E0; [78 AA 67, 05, 05] +D800 DCAD; [95 E5, 05, 05] -11E1; [78 AA 6A, 05, 05] +D800 DCAE; [95 E7, 05, 05] -11E2; [78 AA 6D, 05, 05] +D800 DCAF; [95 E9, 05, 05] -11E3; [78 AA 70, 05, 05] +D800 DCB0; [95 EB, 05, 05] -11E4; [78 AA 73, 05, 05] +D800 DCB1; [95 ED, 05, 05] -11E5; [78 AA 76, 05, 05] +D800 DCB2; [95 EF, 05, 05] -11E6; [78 AA 79, 05, 05] +D800 DCB3; [95 F1, 05, 05] -11E7; [78 AA 7C, 05, 05] +D800 DCB4; [95 F3, 05, 05] -11E8; [78 AA 7F, 05, 05] +D800 DCB5; [95 F5, 05, 05] -11E9; [78 AA 82, 05, 05] +D800 DCB6; [95 F7, 05, 05] -11EA; [78 AA 85, 05, 05] +D800 DCB7; [95 F9, 05, 05] -11EB; [78 AA 88, 05, 05] +D800 DCB8; [95 FB, 05, 05] -11EC; [78 AA 8B, 05, 05] +D800 DCB9; [95 FD, 05, 05] -11ED; [78 AA 8E, 05, 05] +D800 DCBA; [96 05, 05, 05] -11EE; [78 AA 91, 05, 05] +D800 DCBB; [96 07, 05, 05] -11EF; [78 AA 94, 05, 05] +D800 DCBC; [96 09, 05, 05] -11F0; [78 AA 97, 05, 05] +D800 DCBD; [96 0B, 05, 05] -11F1; [78 AA 9A, 05, 05] -3182; [78 AA 9A, 05, 09] +D800 DCBE; [96 0D, 05, 05] -11F2; [78 AA 9D, 05, 05] -3183; [78 AA 9D, 05, 09] +D800 DCBF; [96 0F, 05, 05] -11F3; [78 AA A0, 05, 05] +D800 DCC0; [96 11, 05, 05] -11F4; [78 AA A3, 05, 05] +D800 DCC1; [96 13, 05, 05] -11F5; [78 AA A6, 05, 05] +D800 DCC2; [96 15, 05, 05] -11F6; [78 AA A9, 05, 05] +D800 DCC3; [96 17, 05, 05] -11F7; [78 AA AC, 05, 05] +D800 DCC4; [96 19, 05, 05] -11F8; [78 AA AF, 05, 05] +D800 DCC5; [96 1B, 05, 05] -11F9; [78 AA B2, 05, 05] +D800 DCC6; [96 1D, 05, 05] -3041; [79 20, 05, 19] -3042; [79 20, 05, 9B] -30A1; [79 20, 05, 1D] -FF67; [79 20, 05, 1F] -30A2; [79 20, 05, A1] -FF71; [79 20, 05, A3] -32D0; [79 20, 05, 25] -3303; [79 20, 05, 37][1A 32, 05, 37][79 70, 05, 3D] -3300; [79 20, 05, 37][79 52, 05, 37][, DC 0D, 3D][1A 32, 05, 3D][79 46, 05, 3D] -3301; [79 20, 05, 37][79 70, 05, 37][79 56, 05, 3D][79 20, 05, 3D] -3302; [79 20, 05, 37][79 7E, 05, 37][79 58, 05, 3D][, DC 0D, 3D][79 20, 05, 3D] +D800 DCC7; [96 1F, 05, 05] -3043; [79 22, 05, 19] -3044; [79 22, 05, 9B] -30A3; [79 22, 05, 1D] -FF68; [79 22, 05, 1F] -30A4; [79 22, 05, A1] -FF72; [79 22, 05, A3] -32D1; [79 22, 05, 25] -3304; [79 22, 05, 37][79 4A, 05, 37][79 7E, 05, 3D][79 2E, 05, 3D][, DB F9, 3D] -3305; [79 22, 05, 37][79 7E, 05, 37][79 40, 05, 3D] - -3045; [79 24, 05, 19] -3046; [79 24, 05, 9B] -30A5; [79 24, 05, 1D] -FF69; [79 24, 05, 1F] -30A6; [79 24, 05, A1] -FF73; [79 24, 05, A3] -32D2; [79 24, 05, 25] -3094; [79 24, 05, 9B][, DB F9, 05] -30F4; [79 24, 05, A1][, DB F9, 05] -3306; [79 24, 05, 37][79 28, 05, 37][79 7E, 05, 3D] - -3047; [79 26, 05, 19] -3048; [79 26, 05, 9B] -30A7; [79 26, 05, 1D] -FF6A; [79 26, 05, 1F] -30A8; [79 26, 05, A1] -FF74; [79 26, 05, A3] -32D3; [79 26, 05, 25] -3308; [79 26, 05, 37][1A 32, 05, 37][79 2A, 05, 3D][1A 32, 05, 3D] -3307; [79 26, 05, 37][79 38, 05, 37][79 2E, 05, 3D][1A 32, 05, 3D][79 46, 05, 3D][, DB F9, 3D] - -3049; [79 28, 05, 19] -304A; [79 28, 05, 9B] -30A9; [79 28, 05, 1D] -FF6B; [79 28, 05, 1F] -30AA; [79 28, 05, A1] -FF75; [79 28, 05, A3] -32D4; [79 28, 05, 25] -330A; [79 28, 05, 37][1A 32, 05, 37][79 60, 05, 3D] -3309; [79 28, 05, 37][79 7E, 05, 37][79 38, 05, 3D] - -304B; [79 2A, 05, 9B] -30F5; [79 2A, 05, 1D] -30AB; [79 2A, 05, A1] -FF76; [79 2A, 05, A3] -32D5; [79 2A, 05, 25] -304C; [79 2A, 05, 9B][, DB F9, 05] -30AC; [79 2A, 05, A1][, DB F9, 05] -330B; [79 2A, 05, 37][79 22, 05, 37][79 6E, 05, 3D] -330C; [79 2A, 05, 37][79 6C, 05, 37][79 42, 05, 3D][79 46, 05, 3D] -330D; [79 2A, 05, 37][79 74, 05, 37][79 6E, 05, 3D][1A 32, 05, 3D] -330E; [79 2A, 05, 37][, DB F9, 37][79 74, 05, 3D][79 7E, 05, 3D] -330F; [79 2A, 05, 37][, DB F9, 37][79 7E, 05, 3D][79 5C, 05, 3D] - -304D; [79 2C, 05, 9B] -30AD; [79 2C, 05, A1] -FF77; [79 2C, 05, A3] -32D6; [79 2C, 05, 25] -304E; [79 2C, 05, 9B][, DB F9, 05] -30AE; [79 2C, 05, A1][, DB F9, 05] -3310; [79 2C, 05, 37][, DB F9, 37][79 2A, 05, 3D][, DB F9, 3D] -3311; [79 2C, 05, 37][, DB F9, 37][79 4A, 05, 3D][1A 32, 05, 3D] -3312; [79 2C, 05, 37][79 68, 05, 37][79 6E, 05, 3D][1A 32, 05, 3D] -3313; [79 2C, 05, 37][, DB F9, 37][79 70, 05, 3D][79 3E, 05, 3D][, DB F9, 3D][1A 32, 05, 3D] -3314; [79 2C, 05, 37][79 74, 05, 37] -3315; [79 2C, 05, 37][79 74, 05, 37][79 2E, 05, 3D][, DB F9, 3D][79 6C, 05, 3D][79 60, 05, 3D] -3316; [79 2C, 05, 37][79 74, 05, 37][79 62, 05, 3D][1A 32, 05, 3D][79 46, 05, 3D][79 70, 05, 3D] -3317; [79 2C, 05, 37][79 74, 05, 37][79 76, 05, 3D][79 42, 05, 3D][79 46, 05, 3D] - -304F; [79 2E, 05, 9B] -30AF; [79 2E, 05, A1] -FF78; [79 2E, 05, A3] -32D7; [79 2E, 05, 25] -3050; [79 2E, 05, 9B][, DB F9, 05] -30B0; [79 2E, 05, A1][, DB F9, 05] -3318; [79 2E, 05, 37][, DB F9, 37][79 6C, 05, 3D][79 60, 05, 3D] -3319; [79 2E, 05, 37][, DB F9, 37][79 6C, 05, 3D][79 60, 05, 3D][79 46, 05, 3D][79 7E, 05, 3D] -331A; [79 2E, 05, 37][79 70, 05, 37][79 3A, 05, 3D][, DB F9, 3D][79 22, 05, 3D][79 74, 05, 3D] -331B; [79 2E, 05, 37][79 74, 05, 37][1A 32, 05, 3D][79 4E, 05, 3D] - -3051; [79 30, 05, 9B] -30F6; [79 30, 05, 1D] -30B1; [79 30, 05, A1] -FF79; [79 30, 05, A3] -32D8; [79 30, 05, 25] -3052; [79 30, 05, 9B][, DB F9, 05] -30B2; [79 30, 05, A1][, DB F9, 05] -331C; [79 30, 05, 37][1A 32, 05, 37][79 38, 05, 3D] - -3053; [79 32, 05, 9B] -30B3; [79 32, 05, A1] -FF7A; [79 32, 05, A3] -32D9; [79 32, 05, 25] -3054; [79 32, 05, 9B][, DB F9, 05] -30B4; [79 32, 05, A1][, DB F9, 05] -331E; [79 32, 05, 37][1A 32, 05, 37][79 5A, 05, 3D][, DC 0D, 3D] -331D; [79 32, 05, 37][79 70, 05, 37][79 48, 05, 3D] - -3055; [79 34, 05, 9B] -30B5; [79 34, 05, A1] -FF7B; [79 34, 05, A3] -32DA; [79 34, 05, 25] -3056; [79 34, 05, 9B][, DB F9, 05] -30B6; [79 34, 05, A1][, DB F9, 05] -331F; [79 34, 05, 37][79 22, 05, 37][79 2E, 05, 3D][79 70, 05, 3D] -3320; [79 34, 05, 37][79 7E, 05, 37][79 40, 05, 3D][1A 32, 05, 3D][79 60, 05, 3D] - -3057; [79 36, 05, 9B] -30B7; [79 36, 05, A1] -FF7C; [79 36, 05, A3] -32DB; [79 36, 05, 25] -3058; [79 36, 05, 9B][, DB F9, 05] -30B8; [79 36, 05, A1][, DB F9, 05] -3006; [79 36, 05, 09][79 62, 05, 09] -3321; [79 36, 05, 37][79 6E, 05, 37][79 7E, 05, 3D][79 2E, 05, 3D][, DB F9, 3D] - -3059; [79 38, 05, 9B] -30B9; [79 38, 05, A1] -FF7D; [79 38, 05, A3] -32DC; [79 38, 05, 25] -305A; [79 38, 05, 9B][, DB F9, 05] -30BA; [79 38, 05, A1][, DB F9, 05] - -305B; [79 3A, 05, 9B] -30BB; [79 3A, 05, A1] -FF7E; [79 3A, 05, A3] -32DD; [79 3A, 05, 25] -305C; [79 3A, 05, 9B][, DB F9, 05] -30BC; [79 3A, 05, A1][, DB F9, 05] -3322; [79 3A, 05, 37][79 7E, 05, 37][79 40, 05, 3D] -3323; [79 3A, 05, 37][79 7E, 05, 37][79 46, 05, 3D] - -305D; [79 3C, 05, 9B] -30BD; [79 3C, 05, A1] -FF7F; [79 3C, 05, A3] -32DE; [79 3C, 05, 25] -305E; [79 3C, 05, 9B][, DB F9, 05] -30BE; [79 3C, 05, A1][, DB F9, 05] - -305F; [79 3E, 05, 9B] -30BF; [79 3E, 05, A1] -FF80; [79 3E, 05, A3] -32DF; [79 3E, 05, 25] -3060; [79 3E, 05, 9B][, DB F9, 05] -30C0; [79 3E, 05, A1][, DB F9, 05] -3324; [79 3E, 05, 37][, DB F9, 37][1A 32, 05, 3D][79 38, 05, 3D] - -3061; [79 40, 05, 9B] -30C1; [79 40, 05, A1] -FF81; [79 40, 05, A3] -32E0; [79 40, 05, 25] -3062; [79 40, 05, 9B][, DB F9, 05] -30C2; [79 40, 05, A1][, DB F9, 05] - -3063; [79 42, 05, 19] -3064; [79 42, 05, 9B] -30C3; [79 42, 05, 1D] -FF6F; [79 42, 05, 1F] -30C4; [79 42, 05, A1] -FF82; [79 42, 05, A3] -32E1; [79 42, 05, 25] -3065; [79 42, 05, 9B][, DB F9, 05] -30C5; [79 42, 05, A1][, DB F9, 05] - -3066; [79 44, 05, 9B] -30C6; [79 44, 05, A1] -FF83; [79 44, 05, A3] -32E2; [79 44, 05, 25] -3067; [79 44, 05, 9B][, DB F9, 05] -30C7; [79 44, 05, A1][, DB F9, 05] -3325; [79 44, 05, 37][, DB F9, 37][79 36, 05, 3D] - -3068; [79 46, 05, 9B] -30C8; [79 46, 05, A1] -FF84; [79 46, 05, A3] -32E3; [79 46, 05, 25] -3069; [79 46, 05, 9B][, DB F9, 05] -30C9; [79 46, 05, A1][, DB F9, 05] -3326; [79 46, 05, 37][, DB F9, 37][79 70, 05, 3D] -3327; [79 46, 05, 37][79 7E, 05, 37] - -306A; [79 48, 05, 9B] -30CA; [79 48, 05, A1] -FF85; [79 48, 05, A3] -32E4; [79 48, 05, 25] -3328; [79 48, 05, 37][79 50, 05, 37] - -306B; [79 4A, 05, 9B] -30CB; [79 4A, 05, A1] -FF86; [79 4A, 05, A3] -32E5; [79 4A, 05, 25] - -306C; [79 4C, 05, 9B] -30CC; [79 4C, 05, A1] -FF87; [79 4C, 05, A3] -32E6; [79 4C, 05, 25] - -306D; [79 4E, 05, 9B] -30CD; [79 4E, 05, A1] -FF88; [79 4E, 05, A3] -32E7; [79 4E, 05, 25] - -306E; [79 50, 05, 9B] -30CE; [79 50, 05, A1] -FF89; [79 50, 05, A3] -32E8; [79 50, 05, 25] -3329; [79 50, 05, 37][79 42, 05, 37][79 46, 05, 3D] - -306F; [79 52, 05, 9B] -30CF; [79 52, 05, A1] -FF8A; [79 52, 05, A3] -32E9; [79 52, 05, 25] -3070; [79 52, 05, 9B][, DB F9, 05] -30D0; [79 52, 05, A1][, DB F9, 05] -3071; [79 52, 05, 9B][, DC 0D, 05] -30D1; [79 52, 05, A1][, DC 0D, 05] -332B; [79 52, 05, 37][, DC 0D, 37][1A 32, 05, 3D][79 3A, 05, 3D][79 7E, 05, 3D][79 46, 05, 3D] -332C; [79 52, 05, 37][, DC 0D, 37][1A 32, 05, 3D][79 42, 05, 3D] -332D; [79 52, 05, 37][, DB F9, 37][1A 32, 05, 3D][79 72, 05, 3D][79 70, 05, 3D] -332A; [79 52, 05, 37][79 22, 05, 37][79 42, 05, 3D] - -3072; [79 54, 05, 9B] -30D2; [79 54, 05, A1] -FF8B; [79 54, 05, A3] -32EA; [79 54, 05, 25] -3073; [79 54, 05, 9B][, DB F9, 05] -30D3; [79 54, 05, A1][, DB F9, 05] -3074; [79 54, 05, 9B][, DC 0D, 05] -30D4; [79 54, 05, A1][, DC 0D, 05] -332E; [79 54, 05, 37][, DC 0D, 37][79 20, 05, 3D][79 38, 05, 3D][79 46, 05, 3D][79 70, 05, 3D] -332F; [79 54, 05, 37][, DC 0D, 37][79 2E, 05, 3D][79 70, 05, 3D] -3330; [79 54, 05, 37][, DC 0D, 37][79 32, 05, 3D] -3331; [79 54, 05, 37][, DB F9, 37][79 70, 05, 3D] - -3075; [79 56, 05, 9B] -30D5; [79 56, 05, A1] -FF8C; [79 56, 05, A3] -32EB; [79 56, 05, 25] -3076; [79 56, 05, 9B][, DB F9, 05] -30D6; [79 56, 05, A1][, DB F9, 05] -3077; [79 56, 05, 9B][, DC 0D, 05] -30D7; [79 56, 05, A1][, DC 0D, 05] -3332; [79 56, 05, 37][79 20, 05, 37][79 6C, 05, 3D][79 42, 05, 3D][79 46, 05, 3D][, DB F9, 3D] -3333; [79 56, 05, 37][79 22, 05, 37][1A 32, 05, 3D][79 46, 05, 3D] -3334; [79 56, 05, 37][, DB F9, 37][79 42, 05, 3D][79 36, 05, 3D][79 26, 05, 3D][79 70, 05, 3D] -3335; [79 56, 05, 37][79 6C, 05, 37][79 7E, 05, 3D] - -3078; [79 58, 05, 9B] -30D8; [79 58, 05, A1] -FF8D; [79 58, 05, A3] -32EC; [79 58, 05, 25] -3079; [79 58, 05, 9B][, DB F9, 05] -30D9; [79 58, 05, A1][, DB F9, 05] -307A; [79 58, 05, 9B][, DC 0D, 05] -30DA; [79 58, 05, A1][, DC 0D, 05] -333B; [79 58, 05, 37][, DC 0D, 37][1A 32, 05, 3D][79 36, 05, 3D][, DB F9, 3D] -333C; [79 58, 05, 37][, DB F9, 37][1A 32, 05, 3D][79 3E, 05, 3D] -3336; [79 58, 05, 37][79 2E, 05, 37][79 3E, 05, 3D][1A 32, 05, 3D][79 70, 05, 3D] -3337; [79 58, 05, 37][, DC 0D, 37][79 3C, 05, 3D] -3338; [79 58, 05, 37][, DC 0D, 37][79 4A, 05, 3D][79 54, 05, 3D] -3339; [79 58, 05, 37][79 70, 05, 37][79 42, 05, 3D] -333A; [79 58, 05, 37][, DC 0D, 37][79 7E, 05, 3D][79 38, 05, 3D] - -307B; [79 5A, 05, 9B] -30DB; [79 5A, 05, A1] -FF8E; [79 5A, 05, A3] -32ED; [79 5A, 05, 25] -307C; [79 5A, 05, 9B][, DB F9, 05] -30DC; [79 5A, 05, A1][, DB F9, 05] -307D; [79 5A, 05, 9B][, DC 0D, 05] -30DD; [79 5A, 05, A1][, DC 0D, 05] -3341; [79 5A, 05, 37][1A 32, 05, 37][79 70, 05, 3D] -3342; [79 5A, 05, 37][1A 32, 05, 37][79 7E, 05, 3D] -333D; [79 5A, 05, 37][, DC 0D, 37][79 22, 05, 3D][79 7E, 05, 3D][79 46, 05, 3D] -333E; [79 5A, 05, 37][, DB F9, 37][79 70, 05, 3D][79 46, 05, 3D] -333F; [79 5A, 05, 37][79 7E, 05, 37] -3340; [79 5A, 05, 37][, DC 0D, 37][79 7E, 05, 3D][79 46, 05, 3D][, DB F9, 3D] - -307E; [79 5C, 05, 9B] -30DE; [79 5C, 05, A1] -FF8F; [79 5C, 05, A3] -32EE; [79 5C, 05, 25] -3343; [79 5C, 05, 37][79 22, 05, 37][79 2E, 05, 3D][79 74, 05, 3D] -3344; [79 5C, 05, 37][79 22, 05, 37][79 70, 05, 3D] -3345; [79 5C, 05, 37][79 42, 05, 37][79 52, 05, 3D] -3346; [79 5C, 05, 37][79 70, 05, 37][79 2E, 05, 3D] -3347; [79 5C, 05, 37][79 7E, 05, 37][79 36, 05, 3D][79 6A, 05, 3D][79 7E, 05, 3D] - -307F; [79 5E, 05, 9B] -30DF; [79 5E, 05, A1] -FF90; [79 5E, 05, A3] -32EF; [79 5E, 05, 25] -3348; [79 5E, 05, 37][79 2E, 05, 37][79 74, 05, 3D][79 7E, 05, 3D] -3349; [79 5E, 05, 37][79 6E, 05, 37] -334A; [79 5E, 05, 37][79 6E, 05, 37][79 52, 05, 3D][, DB F9, 3D][1A 32, 05, 3D][79 70, 05, 3D] - -3080; [79 60, 05, 9B] -30E0; [79 60, 05, A1] -FF91; [79 60, 05, A3] -32F0; [79 60, 05, 25] - -3081; [79 62, 05, 9B] -30E1; [79 62, 05, A1] -FF92; [79 62, 05, A3] -32F1; [79 62, 05, 25] -334D; [79 62, 05, 37][1A 32, 05, 37][79 46, 05, 3D][79 70, 05, 3D] -334B; [79 62, 05, 37][79 2A, 05, 37][, DB F9, 3D] -334C; [79 62, 05, 37][79 2A, 05, 37][, DB F9, 3D][79 46, 05, 3D][79 7E, 05, 3D] - -3082; [79 64, 05, 9B] -30E2; [79 64, 05, A1] -FF93; [79 64, 05, A3] -32F2; [79 64, 05, 25] - -3083; [79 66, 05, 19] -3084; [79 66, 05, 9B] -30E3; [79 66, 05, 1D] -FF6C; [79 66, 05, 1F] -30E4; [79 66, 05, A1] -FF94; [79 66, 05, A3] -32F3; [79 66, 05, 25] -334E; [79 66, 05, 37][1A 32, 05, 37][79 46, 05, 3D][, DB F9, 3D] -334F; [79 66, 05, 37][1A 32, 05, 37][79 70, 05, 3D] - -3085; [79 68, 05, 19] -3086; [79 68, 05, 9B] -30E5; [79 68, 05, 1D] -FF6D; [79 68, 05, 1F] -30E6; [79 68, 05, A1] -FF95; [79 68, 05, A3] -32F4; [79 68, 05, 25] -3350; [79 68, 05, 37][79 20, 05, 37][79 7E, 05, 3D] - -3087; [79 6A, 05, 19] -3088; [79 6A, 05, 9B] -30E7; [79 6A, 05, 1D] -FF6E; [79 6A, 05, 1F] -30E8; [79 6A, 05, A1] -FF96; [79 6A, 05, A3] -32F5; [79 6A, 05, 25] - -3089; [79 6C, 05, 9B] -30E9; [79 6C, 05, A1] -FF97; [79 6C, 05, A3] -32F6; [79 6C, 05, 25] - -308A; [79 6E, 05, 9B] -30EA; [79 6E, 05, A1] -FF98; [79 6E, 05, A3] -32F7; [79 6E, 05, 25] -3351; [79 6E, 05, 37][79 42, 05, 37][79 46, 05, 3D][79 70, 05, 3D] -3352; [79 6E, 05, 37][79 6C, 05, 37] - -308B; [79 70, 05, 9B] -30EB; [79 70, 05, A1] -FF99; [79 70, 05, A3] -32F8; [79 70, 05, 25] -3354; [79 70, 05, 37][1A 32, 05, 37][79 56, 05, 3D][, DB F9, 3D][79 70, 05, 3D] -3353; [79 70, 05, 37][79 54, 05, 37][, DC 0D, 3D][1A 32, 05, 3D] - -308C; [79 72, 05, 9B] -30EC; [79 72, 05, A1] -FF9A; [79 72, 05, A3] -32F9; [79 72, 05, 25] -3355; [79 72, 05, 37][79 60, 05, 37] -3356; [79 72, 05, 37][79 7E, 05, 37][79 46, 05, 3D][79 30, 05, 3D][, DB F9, 3D][79 7E, 05, 3D] - -308D; [79 74, 05, 9B] -30ED; [79 74, 05, A1] -FF9B; [79 74, 05, A3] -32FA; [79 74, 05, 25] - -308E; [79 76, 05, 19] -308F; [79 76, 05, 9B] -30EE; [79 76, 05, 1D] -30EF; [79 76, 05, A1] -FF9C; [79 76, 05, A3] -32FB; [79 76, 05, 25] -30F7; [79 76, 05, A1][, DB F9, 05] -3357; [79 76, 05, 37][79 42, 05, 37][79 46, 05, 3D] +D800 DCC8; [96 21, 05, 05] -3090; [79 78, 05, 9B] -30F0; [79 78, 05, A1] -32FC; [79 78, 05, 25] -30F8; [79 78, 05, A1][, DB F9, 05] +D800 DCC9; [96 23, 05, 05] -3091; [79 7A, 05, 9B] -30F1; [79 7A, 05, A1] -32FD; [79 7A, 05, 25] -30F9; [79 7A, 05, A1][, DB F9, 05] +D800 DCCA; [96 25, 05, 05] -3092; [79 7C, 05, 9B] -30F2; [79 7C, 05, A1] -FF66; [79 7C, 05, A3] -32FE; [79 7C, 05, 25] -30FA; [79 7C, 05, A1][, DB F9, 05] +D800 DCCB; [96 27, 05, 05] -3093; [79 7E, 05, 9B] -30F3; [79 7E, 05, A1] -FF9D; [79 7E, 05, A3] +D800 DCCC; [96 29, 05, 05] -3105; [7A 20, 05, 05] -31A0; [7A 20, 05, 09][, DF 79, 09] +D800 DCCD; [96 2B, 05, 05] -3106; [7A 22, 05, 05] -31B4; [7A 22, 05, 31] +D800 DCCE; [96 2D, 05, 05] -3107; [7A 24, 05, 05] +D800 DCCF; [96 2F, 05, 05] -3108; [7A 26, 05, 05] +D800 DCD0; [96 31, 05, 05] -312A; [7A 28, 05, 05] +D800 DCD1; [96 33, 05, 05] -3109; [7A 2A, 05, 05] +D800 DCD2; [96 35, 05, 05] -310A; [7A 2C, 05, 05] -31B5; [7A 2C, 05, 31] +D800 DCD3; [96 37, 05, 05] -310B; [7A 2E, 05, 05] +D800 DCD4; [96 39, 05, 05] -310C; [7A 30, 05, 05] +D800 DCD5; [96 3B, 05, 05] -310D; [7A 32, 05, 05] -31A3; [7A 32, 05, 09][, DF 79, 09] +D800 DCD6; [96 3D, 05, 05] -310E; [7A 34, 05, 05] -31B6; [7A 34, 05, 31] +D800 DCD7; [96 3F, 05, 05] -312B; [7A 36, 05, 05] +D800 DCD8; [96 41, 05, 05] -31AD; [7A 38, 05, 05] +D800 DCD9; [96 43, 05, 05] -310F; [7A 3A, 05, 05] -31B7; [7A 3A, 05, 31] +D800 DCDA; [96 45, 05, 05] -3110; [7A 3C, 05, 05] -31A2; [7A 3C, 05, 09][, DF 79, 09] +D800 DCDB; [96 47, 05, 05] -3111; [7A 3E, 05, 05] +D800 DCDC; [96 49, 05, 05] -3112; [7A 40, 05, 05] +D800 DCDD; [96 4B, 05, 05] -312C; [7A 42, 05, 05] +D800 DCDE; [96 4D, 05, 05] -3113; [7A 44, 05, 05] +D800 DCDF; [96 4F, 05, 05] -3114; [7A 46, 05, 05] +D800 DCE0; [96 51, 05, 05] -3115; [7A 48, 05, 05] +D800 DCE1; [96 53, 05, 05] -3116; [7A 4A, 05, 05] +D800 DCE2; [96 55, 05, 05] -3117; [7A 4C, 05, 05] -31A1; [7A 4C, 05, 09][, DF 79, 09] +D800 DCE3; [96 57, 05, 05] -3118; [7A 4E, 05, 05] +D800 DCE4; [96 59, 05, 05] -3119; [7A 50, 05, 05] +D800 DCE5; [96 5B, 05, 05] -311A; [7A 52, 05, 05] -31A9; [7A 52, 05, 09][, DF 79, 09] +D800 DCE6; [96 5D, 05, 05] -311B; [7A 54, 05, 05] -31A7; [7A 54, 05, 09][, DF 79, 09] +D800 DCE7; [96 5F, 05, 05] -31A6; [7A 56, 05, 05] +D800 DCE8; [96 61, 05, 05] -311C; [7A 58, 05, 05] +D800 DCE9; [96 63, 05, 05] -311D; [7A 5A, 05, 05] +D800 DCEA; [96 65, 05, 05] -31A4; [7A 5C, 05, 05] -31A5; [7A 5C, 05, 09][, DF 79, 09] +D800 DCEB; [96 67, 05, 05] -311E; [7A 5E, 05, 05] -31AE; [7A 5E, 05, 09][, DF 79, 09] +D800 DCEC; [96 69, 05, 05] -311F; [7A 60, 05, 05] +D800 DCED; [96 6B, 05, 05] -3120; [7A 62, 05, 05] -31AF; [7A 62, 05, 09][, DF 79, 09] +D800 DCEE; [96 6D, 05, 05] -3121; [7A 64, 05, 05] +D800 DCEF; [96 6F, 05, 05] -3122; [7A 66, 05, 05] +D800 DCF0; [96 71, 05, 05] -3123; [7A 68, 05, 05] +D800 DCF1; [96 73, 05, 05] -3124; [7A 6A, 05, 05] +D800 DCF2; [96 75, 05, 05] -31B2; [7A 6C, 05, 05] +D800 DCF3; [96 77, 05, 05] -3125; [7A 6E, 05, 05] +D800 DCF4; [96 79, 05, 05] -31B0; [7A 70, 05, 05] +D800 DCF5; [96 7B, 05, 05] -31B1; [7A 72, 05, 05] +D800 DCF6; [96 7D, 05, 05] -31AC; [7A 74, 05, 05] +D800 DCF7; [96 7F, 05, 05] -3126; [7A 76, 05, 05] +D800 DCF8; [96 81, 05, 05] -3127; [7A 78, 05, 05] -31AA; [7A 78, 05, 09][, DF 79, 09] -31B3; [7A 78, 05, 2B][, DF 79, 2B] +D800 DCF9; [96 83, 05, 05] -3128; [7A 7A, 05, 05] -31AB; [7A 7A, 05, 09][, DF 79, 09] -31A8; [7A 7A, 05, 09][, DF 89, 09] +D800 DCFA; [96 85, 05, 05] -3129; [7A 7C, 05, 05] +D802 DC00; [96 87, 05, 05] -D800 DF00; [7A 7E, 05, 05] +D802 DC01; [96 89, 05, 05] -D800 DF01; [7A 80, 05, 05] +D802 DC02; [96 8B, 05, 05] -D800 DF02; [7A 82, 05, 05] +D802 DC03; [96 8D, 05, 05] -D800 DF03; [7A 84, 05, 05] +D802 DC04; [96 8F, 05, 05] -D800 DF04; [7A 86, 05, 05] +D802 DC05; [96 91, 05, 05] -D800 DF05; [7A 88, 05, 05] +D802 DC08; [96 93, 05, 05] -D800 DF06; [7A 8A, 05, 05] +D802 DC0A; [96 95, 05, 05] -D800 DF07; [7A 8C, 05, 05] +D802 DC0B; [96 97, 05, 05] -D800 DF08; [7A 8E, 05, 05] +D802 DC0C; [96 99, 05, 05] -D800 DF09; [7A 90, 05, 05] +D802 DC0D; [96 9B, 05, 05] -D800 DF0A; [7A 92, 05, 05] +D802 DC0E; [96 9D, 05, 05] -D800 DF0B; [7A 94, 05, 05] +D802 DC0F; [96 9F, 05, 05] -D800 DF0C; [7A 96, 05, 05] +D802 DC10; [96 A1, 05, 05] -D800 DF0D; [7A 98, 05, 05] +D802 DC11; [96 A3, 05, 05] -D800 DF0E; [7A 9A, 05, 05] +D802 DC12; [96 A5, 05, 05] -D800 DF0F; [7A 9C, 05, 05] +D802 DC13; [96 A7, 05, 05] -D800 DF10; [7A 9E, 05, 05] +D802 DC14; [96 A9, 05, 05] -D800 DF11; [7A A0, 05, 05] +D802 DC15; [96 AB, 05, 05] -D800 DF12; [7A A2, 05, 05] +D802 DC16; [96 AD, 05, 05] -D800 DF13; [7A A4, 05, 05] +D802 DC17; [96 AF, 05, 05] -D800 DF14; [7A A6, 05, 05] +D802 DC18; [96 B1, 05, 05] -D800 DF15; [7A A8, 05, 05] +D802 DC19; [96 B3, 05, 05] -D800 DF16; [7A AA, 05, 05] +D802 DC1A; [96 B5, 05, 05] -D800 DF17; [7A AC, 05, 05] +D802 DC1B; [96 B7, 05, 05] -D800 DF18; [7A AE, 05, 05] +D802 DC1C; [96 B9, 05, 05] -D800 DF19; [7A B0, 05, 05] +D802 DC1D; [96 BB, 05, 05] -D800 DF1A; [7A B2, 05, 05] +D802 DC1E; [96 BD, 05, 05] -D800 DF1B; [7A B4, 05, 05] +D802 DC1F; [96 BF, 05, 05] -D800 DF1C; [7A B6, 05, 05] +D802 DC20; [96 C1, 05, 05] -D800 DF1D; [7A B8, 05, 05] +D802 DC21; [96 C3, 05, 05] -D800 DF1E; [7A BA, 05, 05] +D802 DC22; [96 C5, 05, 05] -D800 DF30; [7A BC, 05, 05] +D802 DC23; [96 C7, 05, 05] -D800 DF31; [7A BE, 05, 05] +D802 DC24; [96 C9, 05, 05] -D800 DF32; [7A C0, 05, 05] +D802 DC25; [96 CB, 05, 05] -D800 DF33; [7A C2, 05, 05] +D802 DC26; [96 CD, 05, 05] -D800 DF34; [7A C4, 05, 05] +D802 DC27; [96 CF, 05, 05] -D800 DF35; [7A C6, 05, 05] +D802 DC28; [96 D1, 05, 05] -D800 DF36; [7A C8, 05, 05] +D802 DC29; [96 D3, 05, 05] -D800 DF37; [7A CA, 05, 05] +D802 DC2A; [96 D5, 05, 05] -D800 DF38; [7A CC, 05, 05] +D802 DC2B; [96 D7, 05, 05] -D800 DF39; [7A CE, 05, 05] +D802 DC2C; [96 D9, 05, 05] -D800 DF3A; [7A D0, 05, 05] +D802 DC2D; [96 DB, 05, 05] -D800 DF3B; [7A D2, 05, 05] +D802 DC2E; [96 DD, 05, 05] -D800 DF3C; [7A D4, 05, 05] +D802 DC2F; [96 DF, 05, 05] -D800 DF3D; [7A D6, 05, 05] +D802 DC30; [96 E1, 05, 05] -D800 DF3E; [7A D8, 05, 05] +D802 DC31; [96 E3, 05, 05] -D800 DF3F; [7A DA, 05, 05] +D802 DC32; [96 E5, 05, 05] -D800 DF40; [7A DC, 05, 05] +D802 DC33; [96 E7, 05, 05] -D800 DF41; [7A DE, 05, 05] +D802 DC34; [96 E9, 05, 05] -D800 DF42; [7A E0, 05, 05] +D802 DC35; [96 EB, 05, 05] -D800 DF43; [7A E2, 05, 05] +D802 DC37; [96 ED, 05, 05] -D800 DF44; [7A E4, 05, 05] +D802 DC38; [96 EF, 05, 05] -D800 DF45; [7A E6, 05, 05] +D802 DC3C; [96 F1, 05, 05] -D800 DF46; [7A E8, 05, 05] +D802 DC3F; [96 F3, 05, 05] -D800 DF47; [7A EA, 05, 05] +D800 DF80; [96 F5, 05, 05] -D800 DF48; [7A EC, 05, 05] +D800 DF81; [96 F7, 05, 05] -D800 DF49; [7A EE, 05, 05] +D800 DF82; [96 F9, 05, 05] -D800 DF4A; [7A F0, 05, 05] +D800 DF83; [96 FB, 05, 05] -D801 DC28; [7A F2, 05, 05] -D801 DC00; [7A F2, 05, 8F] +D800 DF84; [96 FD, 05, 05] -D801 DC29; [7A F4, 05, 05] -D801 DC01; [7A F4, 05, 8F] +D800 DF85; [97 05, 05, 05] -D801 DC2A; [7A F6, 05, 05] -D801 DC02; [7A F6, 05, 8F] +D800 DF86; [97 07, 05, 05] -D801 DC2B; [7A F8, 05, 05] -D801 DC03; [7A F8, 05, 8F] +D800 DF87; [97 09, 05, 05] -D801 DC2C; [7A FA, 05, 05] -D801 DC04; [7A FA, 05, 8F] +D800 DF88; [97 0B, 05, 05] -D801 DC2D; [7A FC, 05, 05] -D801 DC05; [7A FC, 05, 8F] +D800 DF89; [97 0D, 05, 05] -D801 DC2E; [7A FE, 05, 05] -D801 DC06; [7A FE, 05, 8F] +D800 DF8A; [97 0F, 05, 05] -D801 DC2F; [7B 05, 05, 05] -D801 DC07; [7B 05, 05, 8F] +D800 DF8B; [97 11, 05, 05] -D801 DC30; [7B 07, 05, 05] -D801 DC08; [7B 07, 05, 8F] +D800 DF8C; [97 13, 05, 05] -D801 DC31; [7B 09, 05, 05] -D801 DC09; [7B 09, 05, 8F] +D800 DF8D; [97 15, 05, 05] -D801 DC32; [7B 0B, 05, 05] -D801 DC0A; [7B 0B, 05, 8F] +D800 DF8E; [97 17, 05, 05] -D801 DC33; [7B 0D, 05, 05] -D801 DC0B; [7B 0D, 05, 8F] +D800 DF8F; [97 19, 05, 05] -D801 DC34; [7B 0F, 05, 05] -D801 DC0C; [7B 0F, 05, 8F] +D800 DF90; [97 1B, 05, 05] -D801 DC35; [7B 11, 05, 05] -D801 DC0D; [7B 11, 05, 8F] +D800 DF91; [97 1D, 05, 05] -D801 DC36; [7B 13, 05, 05] -D801 DC0E; [7B 13, 05, 8F] +D800 DF92; [97 1F, 05, 05] -D801 DC37; [7B 15, 05, 05] -D801 DC0F; [7B 15, 05, 8F] +D800 DF93; [97 21, 05, 05] -D801 DC38; [7B 17, 05, 05] -D801 DC10; [7B 17, 05, 8F] +D800 DF94; [97 23, 05, 05] -D801 DC39; [7B 19, 05, 05] -D801 DC11; [7B 19, 05, 8F] +D800 DF95; [97 25, 05, 05] -D801 DC3A; [7B 1B, 05, 05] -D801 DC12; [7B 1B, 05, 8F] +D800 DF96; [97 27, 05, 05] -D801 DC3B; [7B 1D, 05, 05] -D801 DC13; [7B 1D, 05, 8F] +D800 DF97; [97 29, 05, 05] -D801 DC3C; [7B 1F, 05, 05] -D801 DC14; [7B 1F, 05, 8F] +D800 DF98; [97 2B, 05, 05] -D801 DC3D; [7B 21, 05, 05] -D801 DC15; [7B 21, 05, 8F] +D800 DF99; [97 2D, 05, 05] -D801 DC3E; [7B 23, 05, 05] -D801 DC16; [7B 23, 05, 8F] +D800 DF9A; [97 2F, 05, 05] -D801 DC3F; [7B 25, 05, 05] -D801 DC17; [7B 25, 05, 8F] +D800 DF9B; [97 31, 05, 05] -D801 DC40; [7B 27, 05, 05] -D801 DC18; [7B 27, 05, 8F] +D800 DF9C; [97 33, 05, 05] -D801 DC41; [7B 29, 05, 05] -D801 DC19; [7B 29, 05, 8F] +D800 DF9D; [97 35, 05, 05] -D801 DC42; [7B 2B, 05, 05] -D801 DC1A; [7B 2B, 05, 8F] - -D801 DC43; [7B 2D, 05, 05] -D801 DC1B; [7B 2D, 05, 8F] - -D801 DC44; [7B 2F, 05, 05] -D801 DC1C; [7B 2F, 05, 8F] - -D801 DC45; [7B 31, 05, 05] -D801 DC1D; [7B 31, 05, 8F] - -D801 DC46; [7B 33, 05, 05] -D801 DC1E; [7B 33, 05, 8F] - -D801 DC47; [7B 35, 05, 05] -D801 DC1F; [7B 35, 05, 8F] - -D801 DC48; [7B 37, 05, 05] -D801 DC20; [7B 37, 05, 8F] - -D801 DC49; [7B 39, 05, 05] -D801 DC21; [7B 39, 05, 8F] - -D801 DC4A; [7B 3B, 05, 05] -D801 DC22; [7B 3B, 05, 8F] - -D801 DC4B; [7B 3D, 05, 05] -D801 DC23; [7B 3D, 05, 8F] - -D801 DC4C; [7B 3F, 05, 05] -D801 DC24; [7B 3F, 05, 8F] - -D801 DC4D; [7B 41, 05, 05] -D801 DC25; [7B 41, 05, 8F] - -2F00; [E0 03 03, 05, 09] -3280; [E0 03 03, 05, 0D] -3192; [E0 03 03, 05, 27] -319C; [E0 03 05, 05, 27] -3286; [E0 03 09, 05, 0D] -3282; [E0 03 15, 05, 0D] -3194; [E0 03 15, 05, 27] -32A4; [E0 03 17, 05, 0D] -3196; [E0 03 17, 05, 27] -32A6; [E0 03 19, 05, 0D] -3198; [E0 03 19, 05, 27] -F967; [E0 03 1D, 05, 05] -319B; [E0 03 35, 05, 27] -2F01; [E0 03 53, 05, 09] -2EA6; [E0 03 5B, 05, 05] -32A5; [E0 03 5D, 05, 0D] -3197; [E0 03 5D, 05, 27] -F905; [E0 03 67, 05, 05] -2F02; [E0 03 6F, 05, 09] -2E80; [E0 03 6F, 05, 09][, DD 61, 3D] -D87E DC01; [E0 03 73, 05, 05] -F95E; [E0 03 75, 05, 05] -D87E DC00; [E0 03 7D, 05, 05] -2F03; [E0 03 81, 05, 09] -D87E DC02; [E0 03 85, 05, 05] -2F04; [E0 03 B5, 05, 09] -319A; [E0 03 B5, 05, 27] -2E84; [E0 03 B5, 05, 09][, DD 61, 3D] -2E83; [E0 03 B7, 05, 05] -2E82; [E0 03 B9, 05, 05] -3288; [E0 03 BD, 05, 0D] -F91B; [E0 04 0B, 05, 05] -2F05; [E0 04 11, 05, 09] -F9BA; [E0 04 13, 05, 05] -2F06; [E0 04 1F, 05, 09] -3281; [E0 04 1F, 05, 0D] -3193; [E0 04 1F, 05, 27] -3284; [E0 04 2F, 05, 0D] -2F07; [E0 04 47, 05, 09] -F977; [E0 04 63, 05, 05] -2F08; [E0 04 7B, 05, 09] -319F; [E0 04 7B, 05, 27] -2E85; [E0 04 7D, 05, 05] -F9FD; [E0 04 87, 05, 05] -D87E DC19; [E0 04 9F, 05, 05] -F9A8; [E0 04 CF, 05, 05] -32AD; [E0 05 0D, 05, 0D] -32A1; [E0 05 2D, 05, 0D] -D87E DC04; [E0 05 CB, 05, 05] -F92D; [E0 06 1B, 05, 05] -F9B5; [E0 06 25, 05, 05] -D87E DC05; [E0 06 6B, 05, 05] -FA30; [E0 06 6B, 05, 05] -D87E DC06; [E0 06 85, 05, 05] -F965; [E0 06 8D, 05, 05] -D87E DC07; [E0 07 17, 05, 05] -F9D4; [E0 07 69, 05, 05] -D87E DC08; [E0 08 0B, 05, 05] -D87E DC09; [E0 08 49, 05, 05] -D87E DC0B; [E0 08 B5, 05, 05] -F9BB; [E0 08 CB, 05, 05] -D87E DC0A; [E0 08 E5, 05, 05] -FA31; [E0 08 E5, 05, 05] -329D; [E0 09 6F, 05, 0D] -2F09; [E0 09 99, 05, 09] -FA0C; [E0 09 9B, 05, 05] -D87E DC0E; [E0 09 B5, 05, 05] -FA32; [E0 09 B5, 05, 05] -D87E DC0F; [E0 09 C3, 05, 05] -D87E DC10; [E0 09 E3, 05, 05] -2F0A; [E0 09 E5, 05, 09] -D87E DC14; [E0 09 E9, 05, 05] -F978; [E0 09 ED, 05, 05] -2F0B; [E0 09 F1, 05, 09] -3287; [E0 09 F1, 05, 0D] -F9D1; [E0 09 F5, 05, 05] -3285; [E0 09 F5, 05, 0D] -D87E DC11; [E0 0A 0D, 05, 05] -2F0C; [E0 0A 23, 05, 09] -2E86; [E0 0A 23, 05, 09][, DD 61, 3D] -D87E DC15; [E0 0A 39, 05, 05] -D87E DCD2; [E0 0A 43, 05, 05] -D87E DCD3; [E0 0A 49, 05, 05] -2F0D; [E0 0A 4B, 05, 09] -D87E DC17; [E0 0A 4D, 05, 05] -32A2; [E0 0A 51, 05, 0D] -D87E DC18; [E0 0A 67, 05, 05] -2F0E; [E0 0A 75, 05, 09] -D87E DC1A; [E0 0A 77, 05, 05] -D87E DC1B; [E0 0A 89, 05, 05] -F92E; [E0 0A 8D, 05, 05] -F979; [E0 0A B1, 05, 05] -F955; [E0 0A B7, 05, 05] -F954; [E0 0A D7, 05, 05] -FA15; [E0 0A DB, 05, 05] -2F0F; [E0 0A DF, 05, 09] -2E87; [E0 0A DF, 05, 09][, DD 61, 3D] -D87E DC1D; [E0 0B 0D, 05, 05] -2F10; [E0 0B 0D, 05, 09] -2F11; [E0 0B 23, 05, 09] -2E88; [E0 0B 23, 05, 09][, DD 61, 3D] -2E89; [E0 0B 27, 05, 05] -D87E DC1E; [E0 0B 29, 05, 05] -D87E DC50; [E0 0B 31, 05, 05] -FA00; [E0 0B 31, 05, 05] -F99C; [E0 0B 51, 05, 05] -F9DD; [E0 0B 75, 05, 05] -F9FF; [E0 0B 97, 05, 05] -D87E DC20; [E0 0B 99, 05, 05] -D87E DC21; [E0 0B AF, 05, 05] -D87E DC22; [E0 0C 0B, 05, 05] -D87E DC23; [E0 0C 15, 05, 05] -F9C7; [E0 0C 39, 05, 05] -F98A; [E0 0C 5D, 05, 05] -2F12; [E0 0C 5D, 05, 09] -F99D; [E0 0C 6D, 05, 05] -D87E DD92; [E0 0C 8D, 05, 05] -3298; [E0 0C 8F, 05, 0D] -D87E DC25; [E0 0C B5, 05, 05] -D87E DC26; [E0 0C B9, 05, 05] -FA33; [E0 0C B9, 05, 05] -F952; [E0 0C CB, 05, 05] -F92F; [E0 0C E3, 05, 05] -D87E DC27; [E0 0C EF, 05, 05] -FA34; [E0 0C EF, 05, 05] -F97F; [E0 0D 15, 05, 05] -2F13; [E0 0D 1D, 05, 09] -D87E DC28; [E0 0D 1F, 05, 05] -D87E DC29; [E0 0D 35, 05, 05] -D87E DC2A; [E0 0D 37, 05, 05] -2F14; [E0 0D 55, 05, 09] -D87E DC2B; [E0 0D 59, 05, 05] -F963; [E0 0D 59, 05, 05] -2F15; [E0 0D 5F, 05, 09] -2F16; [E0 0D 9B, 05, 09] -32A9; [E0 0D A1, 05, 0D] -F9EB; [E0 0D A9, 05, 05] -2F17; [E0 0D AD, 05, 09] -3038; [E0 0D AD, 05, 09] -3289; [E0 0D AD, 05, 0D] -3039; [E0 0D B3, 05, 09] -303A; [E0 0D B5, 05, 09] -D87E DC2C; [E0 0D BD, 05, 05] -D87E DC2D; [E0 0D CD, 05, 05] -FA35; [E0 0D CD, 05, 05] -32AF; [E0 0D D3, 05, 0D] -D87E DC2E; [E0 0D DF, 05, 05] -2F18; [E0 0D E3, 05, 09] -2E8A; [E0 0D E3, 05, 09][, DD 61, 3D] -2F19; [E0 0D FD, 05, 09] -2E8B; [E0 0D FD, 05, 09][, DD 61, 3D] -329E; [E0 0E 0F, 05, 0D] -D87E DC2F; [E0 0E 15, 05, 05] -F91C; [E0 0E 19, 05, 05] -D87E DC30; [E0 0E 29, 05, 05] -D87E DC31; [E0 0E 2D, 05, 05] -D87E DC32; [E0 0E 2D, 05, 05] -D87E DC33; [E0 0E 2D, 05, 05] -2F1A; [E0 0E 33, 05, 09] -2E81; [E0 0E 33, 05, 09][, DD 61, 3D] -2F1B; [E0 0E 9B, 05, 09] -F96B; [E0 0E B5, 05, 05] -2F1C; [E0 0E BF, 05, 09] -D87E DC36; [E0 0E C3, 05, 05] -D87E DC37; [E0 0E ED, 05, 05] -2F1D; [E0 0E F5, 05, 09] -F906; [E0 0E F9, 05, 05] -D87E DC39; [E0 0F 09, 05, 05] -D87E DC3A; [E0 0F 15, 05, 05] -32A8; [E0 0F 19, 05, 0D] -D87E DC3B; [E0 0F 3F, 05, 05] -3294; [E0 0F 4D, 05, 0D] -F9DE; [E0 0F 51, 05, 05] -F9ED; [E0 0F 6D, 05, 05] -D87E DC3D; [E0 0F A3, 05, 05] -F980; [E0 0F B7, 05, 05] -D87E DC3E; [E0 0F C3, 05, 05] -D87E DC3F; [E0 10 07, 05, 05] -D87E DC3C; [E0 10 73, 05, 05] -D87E DC40; [E0 10 7B, 05, 05] -F99E; [E0 10 B1, 05, 05] -D87E DC41; [E0 11 27, 05, 05] -D87E DC42; [E0 11 5B, 05, 05] -D87E DC43; [E0 11 E1, 05, 05] -D87E DC44; [E0 12 05, 05, 05] -D87E DC45; [E0 12 47, 05, 05] -D87E DC46; [E0 12 47, 05, 05] -F90B; [E0 12 4D, 05, 05] -D87E DC47; [E0 12 71, 05, 05] -FA36; [E0 12 79, 05, 05] -D87E DC48; [E0 12 95, 05, 05] -D87E DC49; [E0 12 A5, 05, 05] -FA0D; [E0 12 BF, 05, 05] -D87E DC4A; [E0 12 C3, 05, 05] -D87E DC4C; [E0 13 4F, 05, 05] -FA37; [E0 13 4F, 05, 05] -D87E DC4E; [E0 13 E5, 05, 05] -FA38; [E0 14 17, 05, 05] -D87E DC4F; [E0 14 2F, 05, 05] -2F1E; [E0 14 F5, 05, 09] -3283; [E0 14 FD, 05, 0D] -3195; [E0 14 FD, 05, 27] -F9A9; [E0 15 3D, 05, 05] -D87E DC4B; [E0 15 77, 05, 05] -D87E DC4D; [E0 15 79, 05, 05] -2F1F; [E0 15 89, 05, 09] -328F; [E0 15 89, 05, 0D] -319E; [E0 15 AB, 05, 27] -D87E DC55; [E0 16 65, 05, 05] -D87E DC52; [E0 16 EB, 05, 05] -D87E DC53; [E0 17 3B, 05, 05] -D87E DC54; [E0 17 6D, 05, 05] -D87E DC57; [E0 17 B5, 05, 05] -D87E DC56; [E0 17 B7, 05, 05] -FA39; [E0 17 D3, 05, 05] -FA10; [E0 18 0B, 05, 05] -F96C; [E0 18 13, 05, 05] -FA3A; [E0 18 A7, 05, 05] -D87E DC58; [E0 18 AF, 05, 05] -F94A; [E0 19 0B, 05, 05] -F942; [E0 19 19, 05, 05] -2F20; [E0 19 31, 05, 09] -D87E DC51; [E0 19 37, 05, 05] -D87E DC5A; [E0 19 3F, 05, 05] -D87E DC5B; [E0 19 49, 05, 05] -2F21; [E0 19 5F, 05, 09] -D87E DC5C; [E0 19 67, 05, 05] -2F22; [E0 19 6F, 05, 09] -2F23; [E0 19 85, 05, 09] -D87E DC5D; [E0 19 8F, 05, 05] -32B0; [E0 19 93, 05, 0D] -D87E DC5E; [E0 19 9F, 05, 05] -2F24; [E0 19 A9, 05, 09] -337D; [E0 19 A9, 05, 37][E0 3E B5, 05, 3D] -319D; [E0 19 AD, 05, 27] -F90C; [E0 19 EB, 05, 05] -F909; [E0 19 FD, 05, 05] -D87E DC5F; [E0 1A 23, 05, 05] -F981; [E0 1A 45, 05, 05] -2F25; [E0 1A 45, 05, 09] -329B; [E0 1A 45, 05, 0D] -D87E DC65; [E0 1B 13, 05, 05] -D87E DC62; [E0 1B 3B, 05, 05] -D87E DC63; [E0 1B 99, 05, 05] -D87E DC64; [E0 1B B1, 05, 05] -D87E DC66; [E0 1C 33, 05, 05] -D87E DD86; [E0 1C D1, 05, 05] -D87E DC69; [E0 1D 7B, 05, 05] -D87E DC6A; [E0 1D E7, 05, 05] -D87E DC6B; [E0 1D E7, 05, 05] -2F26; [E0 1E 0F, 05, 09] -32AB; [E0 1E 3B, 05, 0D] -2F27; [E0 1E 6F, 05, 09] -FA04; [E0 1E 79, 05, 05] -32AA; [E0 1E 9D, 05, 0D] -D87E DC6D; [E0 1E F5, 05, 05] -D87E DC6E; [E0 1F 23, 05, 05] -D87E DC6F; [E0 1F 41, 05, 05] -F95F; [E0 1F 41, 05, 05] -F9AA; [E0 1F 41, 05, 05] -F9BC; [E0 1F 4F, 05, 05] -D87E DC70; [E0 1F 59, 05, 05] -2F28; [E0 1F 63, 05, 09] -D87E DC72; [E0 1F 71, 05, 05] -D87E DC73; [E0 1F 7F, 05, 05] -2F29; [E0 1F 91, 05, 09] -2E8C; [E0 1F 91, 05, 09][, DD 61, 3D] -2E8D; [E0 1F 91, 05, 09][, DF 79, 3D] -2E90; [E0 1F B7, 05, 05] -D87E DC75; [E0 1F B7, 05, 05] -2F2A; [E0 1F B7, 05, 09] -2E8E; [E0 1F B7, 05, 09][, DD 61, 3D] -2E8F; [E0 1F B9, 05, 05] -2E91; [E0 1F B9, 05, 09][, DD 61, 3D] -2F2B; [E0 1F E3, 05, 09] -F9BD; [E0 1F F1, 05, 05] -D87E DC77; [E0 20 37, 05, 05] -F94B; [E0 20 3B, 05, 05] -FA3B; [E0 20 3F, 05, 05] -F9DF; [E0 20 41, 05, 05] -D87E DC78; [E0 20 53, 05, 05] -FA3C; [E0 20 53, 05, 05] -2F2C; [E0 20 53, 05, 09] -2F2D; [E0 20 59, 05, 09] -D87E DC7A; [E0 20 91, 05, 05] -D87E DC79; [E0 20 F7, 05, 05] -F9D5; [E0 21 AD, 05, 05] -D87E DC7C; [E0 22 05, 05, 05] -F921; [E0 22 1F, 05, 05] -D87E DC7F; [E0 22 55, 05, 05] -D87E DC7E; [E0 22 5B, 05, 05] -D87E DC80; [E0 22 77, 05, 05] -D87E DDF4; [E0 22 E3, 05, 05] -F9AB; [E0 22 F3, 05, 05] -2F2E; [E0 23 39, 05, 09] -D87E DC81; [E0 23 45, 05, 05] -D87E DC82; [E0 23 47, 05, 05] -2F2F; [E0 23 4D, 05, 09] -32A7; [E0 23 4F, 05, 0D] -2F30; [E0 23 65, 05, 09] -2E92; [E0 23 69, 05, 05] -D87E DC84; [E0 23 7D, 05, 05] -2F31; [E0 23 7F, 05, 09] -D87E DC85; [E0 23 D3, 05, 05] -D87E DC86; [E0 23 FD, 05, 05] -D87E DC87; [E0 24 59, 05, 05] -2F32; [E0 24 6B, 05, 09] -337B; [E0 24 6D, 05, 37][E0 2B C3, 05, 3D] -F98E; [E0 24 6F, 05, 05] -2E93; [E0 24 7B, 05, 05] -2F33; [E0 24 7B, 05, 09] -2F34; [E0 24 85, 05, 09] -FA01; [E0 24 D3, 05, 05] -D87E DC8B; [E0 24 E7, 05, 05] -D87E DC8C; [E0 24 ED, 05, 05] -D87E DC8D; [E0 24 F3, 05, 05] -F9A2; [E0 25 1D, 05, 05] -D87E DC8E; [E0 25 1F, 05, 05] -F928; [E0 25 1F, 05, 05] -FA0B; [E0 25 31, 05, 05] -F982; [E0 25 63, 05, 05] -2F35; [E0 25 73, 05, 09] -D87E DC90; [E0 25 87, 05, 05] -2F36; [E0 25 87, 05, 09] -F943; [E0 25 93, 05, 05] -2F37; [E0 25 A1, 05, 09] -2F38; [E0 25 B1, 05, 09] -D87E DC94; [E0 25 CF, 05, 05] -D87E DC95; [E0 25 CF, 05, 05] -2F39; [E0 26 2F, 05, 09] -2E95; [E0 26 2F, 05, 09][, DD 61, 3D] -2E94; [E0 26 31, 05, 05] -D87E DC74; [E0 26 35, 05, 05] -2F3A; [E0 26 51, 05, 09] -D87E DC99; [E0 26 53, 05, 05] -D87E DC9A; [E0 26 65, 05, 05] -2F3B; [E0 26 75, 05, 09] -F9D8; [E0 26 A5, 05, 05] -D87E DC9C; [E0 26 C3, 05, 05] -F966; [E0 26 E1, 05, 05] -2F3C; [E0 27 19, 05, 09] -2E97; [E0 27 19, 05, 09][, DD 61, 3D] -2E96; [E0 27 1B, 05, 05] -D87E DC9D; [E0 27 2D, 05, 05] -D87E DC9E; [E0 27 41, 05, 05] -F9A3; [E0 27 7D, 05, 05] -D87E DC9F; [E0 27 85, 05, 05] -F960; [E0 27 B7, 05, 05] -F9AC; [E0 27 CB, 05, 05] -D87E DCA0; [E0 28 99, 05, 05] -D87E DCA3; [E0 28 BF, 05, 05] -FA3D; [E0 28 BF, 05, 05] -D87E DCA5; [E0 29 29, 05, 05] -F9B9; [E0 29 5D, 05, 05] -F9D9; [E0 2A 27, 05, 05] -D87E DCA6; [E0 2A 2F, 05, 05] -D87E DCA7; [E0 2A 37, 05, 05] -D87E DCA9; [E0 2A 37, 05, 05] -D87E DCA8; [E0 2A 3B, 05, 05] -FA3E; [E0 2A 6F, 05, 05] -D87E DCAA; [E0 2A 93, 05, 05] -D87E DCAB; [E0 2A BB, 05, 05] -FA3F; [E0 2A BB, 05, 05] -F98F; [E0 2A BF, 05, 05] -D87E DCAD; [E0 2A E7, 05, 05] -D87E DCAE; [E0 2A FD, 05, 05] -D87E DCAC; [E0 2B 07, 05, 05] -D87E DCAF; [E0 2B 5F, 05, 05] -D87E DCB0; [E0 2B 87, 05, 05] -FA40; [E0 2B 87, 05, 05] -D87E DCB1; [E0 2B 8F, 05, 05] -F90D; [E0 2B 8F, 05, 05] -F990; [E0 2B A3, 05, 05] -2F3D; [E0 2B B3, 05, 09] -D87E DCB2; [E0 2B C3, 05, 05] -D87E DCB3; [E0 2B D9, 05, 05] -F9D2; [E0 2C 03, 05, 05] -2F3E; [E0 2C 13, 05, 09] -2F3F; [E0 2C 3D, 05, 09] -2E98; [E0 2C 3F, 05, 05] -D87E DCB4; [E0 2C 61, 05, 05] -D87E DCB5; [E0 2D 0D, 05, 05] -F925; [E0 2D 3D, 05, 05] -F95B; [E0 2D 49, 05, 05] -FA02; [E0 2D 51, 05, 05] -D87E DCB6; [E0 2D 53, 05, 05] -D87E DCBA; [E0 2D A3, 05, 05] -F973; [E0 2D A7, 05, 05] -D87E DCB9; [E0 2E 29, 05, 05] -D87E DCB7; [E0 2E 4F, 05, 05] -D87E DCBB; [E0 2E 7F, 05, 05] -F9A4; [E0 2E A5, 05, 05] -D87E DCBC; [E0 2E B5, 05, 05] -F975; [E0 2E EF, 05, 05] -D87E DCC1; [E0 2F 05, 05, 05] -D87E DCC0; [E0 2F 3D, 05, 05] -D87E DCBD; [E0 2F 7B, 05, 05] -D87E DCBF; [E0 2F F7, 05, 05] -D87E DCC3; [E0 30 89, 05, 05] -D87E DCC6; [E0 30 A5, 05, 05] -D87E DCC4; [E0 30 B3, 05, 05] -F991; [E0 30 EB, 05, 05] -D87E DCC5; [E0 30 F1, 05, 05] -F930; [E0 31 43, 05, 05] -2F40; [E0 32 1D, 05, 09] -2F41; [E0 32 27, 05, 09] -2E99; [E0 32 29, 05, 05] -D87E DCC8; [E0 32 5D, 05, 05] -FA41; [E0 32 5D, 05, 05] -D87E DCC9; [E0 32 97, 05, 05] -F969; [E0 32 AF, 05, 05] -2F42; [E0 32 CD, 05, 09] -2F43; [E0 32 ED, 05, 09] -F9BE; [E0 32 F1, 05, 05] -2F44; [E0 33 0B, 05, 09] -2F45; [E0 33 35, 05, 09] -F983; [E0 33 4D, 05, 05] -2F46; [E0 33 83, 05, 09] -2E9B; [E0 33 85, 05, 05] -FA42; [E0 33 87, 05, 05] -D87E DCCB; [E0 33 89, 05, 05] -2F47; [E0 33 8D, 05, 09] -3290; [E0 33 8D, 05, 0D] -2E9C; [E0 33 8D, 05, 09][, DD 61, 3D] -337E; [E0 33 DF, 05, 37][E0 41 71, 05, 3D] -F9E0; [E0 33 E9, 05, 05] -337C; [E0 34 21, 05, 37][E0 10 4F, 05, 3D] -D87E DCCD; [E0 34 59, 05, 05] -FA12; [E0 34 AF, 05, 05] -F9C5; [E0 34 D7, 05, 05] -D87E DCCF; [E0 34 E9, 05, 05] -FA43; [E0 34 E9, 05, 05] -D87E DCD5; [E0 35 03, 05, 05] -FA06; [E0 35 33, 05, 05] -F98B; [E0 35 57, 05, 05] -2F48; [E0 35 AB, 05, 09] -F901; [E0 35 B3, 05, 05] -D87E DCCC; [E0 35 BB, 05, 05] -D87E DCD4; [E0 35 CB, 05, 05] -2F49; [E0 35 DB, 05, 09] -328A; [E0 35 DB, 05, 0D] -2E9D; [E0 35 DB, 05, 09][, DD 61, 3D] -3292; [E0 35 DD, 05, 0D] -D87E DCD8; [E0 35 F9, 05, 05] -F929; [E0 35 F9, 05, 05] -D87E DCD9; [E0 36 05, 05, 05] -D87E DCDA; [E0 36 11, 05, 05] -2F4A; [E0 36 1F, 05, 09] -328D; [E0 36 1F, 05, 0D] -F9E1; [E0 36 6B, 05, 05] -D87E DCDC; [E0 36 75, 05, 05] -D87E DCDB; [E0 36 8B, 05, 05] -F9C8; [E0 36 C5, 05, 05] -D87E DCE0; [E0 36 D9, 05, 05] -F9F4; [E0 36 FD, 05, 05] -F9C9; [E0 37 B9, 05, 05] -D87E DCDF; [E0 37 C7, 05, 05] -F9DA; [E0 38 05, 05, 05] -D87E DCE5; [E0 38 15, 05, 05] -3291; [E0 38 2B, 05, 0D] -337F; [E0 38 2B, 05, 37][E0 25 A9, 05, 3D][E0 05 3F, 05, 3D][E0 5A DB, 05, 3D] -D87E DCE1; [E0 38 7B, 05, 05] -F97A; [E0 38 D9, 05, 05] -D87E DCE2; [E0 38 E1, 05, 05] -FA44; [E0 38 E1, 05, 05] -D87E DCE4; [E0 38 F3, 05, 05] -F9E2; [E0 39 2B, 05, 05] -D87E DCE6; [E0 3A 07, 05, 05] -D87E DCE8; [E0 3A 63, 05, 05] -D87E DCE9; [E0 3B 29, 05, 05] -D87E DCEA; [E0 3B B7, 05, 05] -F914; [E0 3B E7, 05, 05] -F95C; [E0 3B E7, 05, 05] -F9BF; [E0 3B E7, 05, 05] -F94C; [E0 3C 0D, 05, 05] -D87E DCEB; [E0 3D 3B, 05, 05] -F931; [E0 3D 91, 05, 05] -D87E DCED; [E0 3D A1, 05, 05] -F91D; [E0 3D F3, 05, 05] -2F4B; [E0 3E 2F, 05, 09] -D87E DCEF; [E0 3E 31, 05, 05] -D87E DCF1; [E0 3E 97, 05, 05] -2F4C; [E0 3E B3, 05, 09] -32A3; [E0 3E B5, 05, 0D] -D87E DCF3; [E0 3E D3, 05, 05] -F98C; [E0 3E DD, 05, 05] -2F4D; [E0 3E E1, 05, 09] -2E9E; [E0 3E E3, 05, 09][, DD 61, 3D] -D87E DCF4; [E0 3F 31, 05, 05] -F9A5; [E0 3F 4F, 05, 05] -2F4E; [E0 3F 59, 05, 09] -D87E DCF5; [E0 3F 67, 05, 05] -F970; [E0 3F 67, 05, 05] -D87E DCF6; [E0 3F 69, 05, 05] -2F4F; [E0 3F 89, 05, 09] -2E9F; [E0 3F 8D, 05, 09] -2F50; [E0 3F 9B, 05, 09] -2F51; [E0 3F A9, 05, 09] -2F52; [E0 40 15, 05, 09] -2EA0; [E0 40 19, 05, 05] -2F53; [E0 40 1F, 05, 09] -2F54; [E0 40 5F, 05, 09] -328C; [E0 40 5F, 05, 0D] -2EA1; [E0 40 61, 05, 05] -2EA2; [E0 40 6B, 05, 05] -D87E DCFA; [E0 40 93, 05, 05] -D87E DCFE; [E0 40 C5, 05, 05] -F972; [E0 41 0B, 05, 05] -D87E DCFC; [E0 41 79, 05, 05] -F968; [E0 41 93, 05, 05] -D87E DCFD; [E0 41 95, 05, 05] -F9E3; [E0 41 C5, 05, 05] -329F; [E0 41 CB, 05, 0D] -D87E DCFF; [E0 42 2B, 05, 05] -F915; [E0 42 35, 05, 05] -FA05; [E0 42 3B, 05, 05] -D87E DD07; [E0 42 67, 05, 05] -D87E DD00; [E0 42 7B, 05, 05] -D87E DD02; [E0 42 81, 05, 05] -F9CA; [E0 42 81, 05, 05] -D87E DD03; [E0 42 D1, 05, 05] -F92A; [E0 42 D3, 05, 05] -D87E DD01; [E0 42 ED, 05, 05] -FA45; [E0 42 ED, 05, 05] -D87E DD04; [E0 42 EF, 05, 05] -D87E DD05; [E0 43 0D, 05, 05] -F9F5; [E0 43 99, 05, 05] -F94D; [E0 43 B7, 05, 05] -F9D6; [E0 43 D7, 05, 05] -D87E DD0E; [E0 43 F5, 05, 05] -FA46; [E0 44 3B, 05, 05] -D87E DD08; [E0 44 65, 05, 05] -D87E DD09; [E0 44 E3, 05, 05] -F9CB; [E0 45 43, 05, 05] -F9EC; [E0 45 7F, 05, 05] -D87E DD0C; [E0 45 99, 05, 05] -D87E DD0B; [E0 45 A1, 05, 05] -F904; [E0 45 AD, 05, 05] -F94E; [E0 46 2D, 05, 05] -FA47; [E0 46 53, 05, 05] -F992; [E0 46 55, 05, 05] -D87E DD0F; [E0 46 EB, 05, 05] -D87E DD12; [E0 47 9F, 05, 05] -F922; [E0 47 E9, 05, 05] -F984; [E0 48 13, 05, 05] -D87E DD15; [E0 48 4D, 05, 05] -D87E DD14; [E0 48 53, 05, 05] -D87E DD13; [E0 48 89, 05, 05] -D87E DD17; [E0 48 AB, 05, 05] -2F55; [E0 48 ED, 05, 09] -328B; [E0 48 ED, 05, 0D] -2EA3; [E0 48 EF, 05, 05] -D87E DC35; [E0 48 F7, 05, 05] -D87E DD19; [E0 49 09, 05, 05] -D87E DD18; [E0 49 15, 05, 05] -F9FB; [E0 49 4D, 05, 05] -D87E DD1A; [E0 49 75, 05, 05] -F99F; [E0 49 AB, 05, 05] -F916; [E0 49 CD, 05, 05] -D87E DD1C; [E0 4A A9, 05, 05] -F993; [E0 4A B1, 05, 05] -FA48; [E0 4A FB, 05, 05] -D87E DD1E; [E0 4B 5B, 05, 05] -F9C0; [E0 4B BF, 05, 05] -F9EE; [E0 4B C3, 05, 05] -F932; [E0 4C 47, 05, 05] -F91E; [E0 4C 5D, 05, 05] -D87E DD20; [E0 4C 77, 05, 05] -2F56; [E0 4C 7B, 05, 09] -2EA4; [E0 4C 7D, 05, 05] -FA49; [E0 4C 7D, 05, 05] -2EA5; [E0 4C 7D, 05, 09][, DD 61, 3D] -D87E DD21; [E0 4C 91, 05, 05] -2F57; [E0 4C 93, 05, 09] -2F58; [E0 4C 9D, 05, 09] -2F59; [E0 4C A5, 05, 09] -2F5A; [E0 4C B5, 05, 09] -D87E DD22; [E0 4C C7, 05, 05] -2F5B; [E0 4C D9, 05, 09] -2F5C; [E0 4C DD, 05, 09] -2EA7; [E0 4C DD, 05, 09][, DD 61, 3D] -F946; [E0 4C EB, 05, 05] -3295; [E0 4D 1D, 05, 0D] -D87E DD24; [E0 4D 2B, 05, 05] -D87E DD25; [E0 4D 55, 05, 05] -2F5D; [E0 4D 83, 05, 09] -2EA8; [E0 4D 85, 05, 05] -F9FA; [E0 4D AB, 05, 05] -F92B; [E0 4E 27, 05, 05] -FA16; [E0 4E 83, 05, 05] -F9A7; [E0 4F 1D, 05, 05] -D87E DD28; [E0 4F 27, 05, 05] -2F5E; [E0 4F 3B, 05, 09] -F961; [E0 4F 41, 05, 05] -F9DB; [E0 4F 41, 05, 05] -2F5F; [E0 4F 45, 05, 09] -D87E DD29; [E0 4F 49, 05, 05] -2EA9; [E0 4F 49, 05, 09][, DD 61, 3D] -D87E DD2B; [E0 4F 7D, 05, 05] -F9AD; [E0 4F 97, 05, 05] -F917; [E0 4F EF, 05, 05] -F9E4; [E0 50 43, 05, 05] -F9CC; [E0 50 49, 05, 05] -FA4A; [E0 50 7B, 05, 05] -D87E DD2E; [E0 50 C5, 05, 05] -D87E DD2F; [E0 50 EF, 05, 05] -F9AE; [E0 51 0D, 05, 05] -D87E DD30; [E0 51 1D, 05, 05] -D87E DD31; [E0 51 45, 05, 05] -F994; [E0 51 4D, 05, 05] -F9EF; [E0 51 6B, 05, 05] -D87E DD32; [E0 51 CF, 05, 05] -2F60; [E0 51 F3, 05, 09] -2F61; [E0 52 0B, 05, 09] -2F62; [E0 52 6F, 05, 09] -2F63; [E0 52 7D, 05, 09] -D87E DD34; [E0 52 87, 05, 05] -2F64; [E0 52 8F, 05, 09] -2F65; [E0 52 9F, 05, 09] -3199; [E0 52 A3, 05, 27] -329A; [E0 52 AD, 05, 0D] -D87E DD36; [E0 52 BB, 05, 05] -F9CD; [E0 52 F1, 05, 05] -F976; [E0 53 0D, 05, 05] -D87E DD38; [E0 53 23, 05, 05] -F962; [E0 53 23, 05, 05] -2F66; [E0 53 59, 05, 09] -2EAA; [E0 53 59, 05, 09][, DD 61, 3D] -2F67; [E0 53 67, 05, 09] -F9E5; [E0 54 0B, 05, 05] -D87E DD3A; [E0 54 67, 05, 05] -F9C1; [E0 54 CB, 05, 05] -F90E; [E0 55 1D, 05, 05] -2F68; [E0 55 37, 05, 09] -2F69; [E0 55 45, 05, 09] -2F6A; [E0 55 A7, 05, 09] -2F6B; [E0 55 C9, 05, 09] -FA17; [E0 55 DF, 05, 05] -32AC; [E0 56 15, 05, 0D] -F933; [E0 56 1D, 05, 05] -2F6C; [E0 56 2B, 05, 09] -2EAB; [E0 56 2B, 05, 09][, DD 61, 3D] -D87E DD40; [E0 56 37, 05, 05] -F96D; [E0 56 51, 05, 05] -D87E DD45; [E0 56 8B, 05, 05] -D87E DD46; [E0 56 8D, 05, 05] -D87E DD47; [E0 56 8D, 05, 05] -D87E DD48; [E0 56 E3, 05, 05] -D87E DD4A; [E0 57 69, 05, 05] -2F6D; [E0 58 0D, 05, 09] -2F6E; [E0 58 1B, 05, 09] -2F6F; [E0 58 3D, 05, 09] -D87E DD4E; [E0 58 F3, 05, 05] -F9CE; [E0 59 31, 05, 05] -D87E DD4F; [E0 59 73, 05, 05] -F93B; [E0 59 73, 05, 05] -FA4B; [E0 59 7D, 05, 05] -F947; [E0 59 EF, 05, 05] -D87E DD50; [E0 59 F3, 05, 05] -F964; [E0 5A 55, 05, 05] -F985; [E0 5A B3, 05, 05] -2F70; [E0 5A D3, 05, 09] -2EAC; [E0 5A D3, 05, 09][, DD 61, 3D] -2EAD; [E0 5A D5, 05, 05] -FA18; [E0 5A D7, 05, 05] -FA4C; [E0 5A DB, 05, 05] -3293; [E0 5A DB, 05, 0D] -FA4E; [E0 5A EF, 05, 05] -FA4D; [E0 5A F1, 05, 05] -FA4F; [E0 5B 03, 05, 05] -D87E DD53; [E0 5B 0F, 05, 05] -FA50; [E0 5B 0F, 05, 05] -FA51; [E0 5B 1D, 05, 05] -3297; [E0 5B 1D, 05, 0D] -FA19; [E0 5B 1F, 05, 05] -FA1A; [E0 5B 2D, 05, 05] -F93C; [E0 5B 61, 05, 05] -FA52; [E0 5B 7D, 05, 05] -FA53; [E0 5B 7F, 05, 05] -D87E DD56; [E0 5B 81, 05, 05] -FA1B; [E0 5B 81, 05, 05] -F9B6; [E0 5B BF, 05, 05] -2F71; [E0 5B D3, 05, 09] -2F72; [E0 5B DF, 05, 09] -F995; [E0 5B F7, 05, 05] -3299; [E0 5C 17, 05, 0D] -D87E DD57; [E0 5C 3D, 05, 05] -F956; [E0 5C 9F, 05, 05] -D87E DD59; [E0 5C E7, 05, 05] -FA54; [E0 5C E7, 05, 05] -D87E DD5A; [E0 5C FB, 05, 05] -D87E DD5B; [E0 5D 09, 05, 05] -2F73; [E0 5D 53, 05, 09] -FA55; [E0 5D 6D, 05, 05] -F9F7; [E0 5E 05, 05, 05] -2F74; [E0 5E 05, 05, 09] -D87E DD5F; [E0 5E 4B, 05, 05] -2F75; [E0 5E 61, 05, 09] -2EAE; [E0 5E 61, 05, 09][, DD 61, 3D] -F9F8; [E0 5E AF, 05, 05] -FA56; [E0 5F F3, 05, 05] -D87E DD62; [E0 60 03, 05, 05] -D87E DD63; [E0 60 09, 05, 05] -F9A6; [E0 60 F3, 05, 05] -F944; [E0 61 3B, 05, 05] -2F76; [E0 61 61, 05, 09] -F9F9; [E0 61 9F, 05, 05] -FA1D; [E0 61 F7, 05, 05] -D87E DD66; [E0 62 23, 05, 05] -FA03; [E0 62 2B, 05, 05] -D87E DD69; [E0 62 45, 05, 05] -F97B; [E0 62 4D, 05, 05] -D87E DD68; [E0 62 4F, 05, 05] -2F77; [E0 62 6F, 05, 09] -2EAF; [E0 62 71, 05, 05] -D87E DD6A; [E0 62 7F, 05, 05] -F9CF; [E0 62 9F, 05, 05] -F96A; [E0 62 C3, 05, 05] -F94F; [E0 62 DD, 05, 05] -D87E DD6C; [E0 63 49, 05, 05] -F93D; [E0 63 C3, 05, 05] -F957; [E0 64 03, 05, 05] -D87E DD6E; [E0 64 15, 05, 05] -F996; [E0 64 6F, 05, 05] -FA57; [E0 64 6F, 05, 05] -D87E DD6F; [E0 64 8B, 05, 05] -FA58; [E0 64 99, 05, 05] -F950; [E0 64 F5, 05, 05] -FA59; [E0 65 0D, 05, 05] -D87E DD70; [E0 65 15, 05, 05] -2EB0; [E0 65 C9, 05, 05] -2F78; [E0 66 FB, 05, 09] -2F79; [E0 67 35, 05, 09] -2EB2; [E0 67 37, 05, 05] -2EB5; [E0 67 37, 05, 09][, DD 61, 3D] -2EB1; [E0 67 39, 05, 05] -2EB3; [E0 67 39, 05, 09][, DD 61, 3D] -2EB4; [E0 67 39, 05, 09][, DF 79, 3D] -FA5A; [E0 67 77, 05, 05] -F9E6; [E0 67 85, 05, 05] -D87E DD76; [E0 67 87, 05, 05] -F90F; [E0 67 9D, 05, 05] -2F7A; [E0 67 A7, 05, 09] -2EB6; [E0 67 A7, 05, 09][, DD 61, 3D] -2EB7; [E0 67 A7, 05, 09][, DF 79, 3D] -2EB8; [E0 67 A9, 05, 05] -D87E DD78; [E0 67 BD, 05, 05] -F9AF; [E0 67 C7, 05, 05] -FA1E; [E0 68 11, 05, 05] -2F7B; [E0 68 11, 05, 09] -D87E DD79; [E0 68 8B, 05, 05] - -F934; [E0 68 99, 05, 05] -2F7C; [E0 68 99, 05, 09] -2EB9; [E0 68 9B, 05, 05] -D87E DD7A; [E0 68 A1, 05, 05] -FA5B; [E0 68 A1, 05, 05] -2F7D; [E0 68 AF, 05, 09] -2F7E; [E0 68 BB, 05, 09] -2F7F; [E0 68 FD, 05, 09] -F9B0; [E0 69 27, 05, 05] -D87E DD7D; [E0 69 5B, 05, 05] -F997; [E0 69 79, 05, 05] -D87E DD7F; [E0 69 7B, 05, 05] -F945; [E0 69 97, 05, 05] -2F80; [E0 69 99, 05, 09] -2EBB; [E0 69 99, 05, 09][, DD 61, 3D] -2EBA; [E0 69 9B, 05, 05] -2F81; [E0 69 AD, 05, 09] -2EBC; [E0 69 AD, 05, 09][, DD 61, 3D] -F953; [E0 69 B1, 05, 05] -D87E DCD6; [E0 69 F5, 05, 05] -D87E DD82; [E0 6A 03, 05, 05] -D87E DD83; [E0 6A A5, 05, 05] -D87E DD85; [E0 6B 1F, 05, 05] -F926; [E0 6C 57, 05, 05] -2F82; [E0 6C 6D, 05, 09] -F9F6; [E0 6C 77, 05, 05] -2F83; [E0 6C 7B, 05, 09] -FA5C; [E0 6C 81, 05, 05] -2F84; [E0 6C 8D, 05, 09] -2F85; [E0 6C 9F, 05, 09] -2EBD; [E0 6C 9F, 05, 09][, DD 61, 3D] -D87E DC93; [E0 6C A9, 05, 05] -D87E DD8B; [E0 6C A9, 05, 05] -D87E DD8C; [E0 6C AF, 05, 05] -2F86; [E0 6C BF, 05, 09] -2F87; [E0 6C DD, 05, 09] -2F88; [E0 6C E5, 05, 09] -2F89; [E0 6D 87, 05, 09] -F97C; [E0 6D 89, 05, 05] -2F8A; [E0 6D 8F, 05, 09] -2F8B; [E0 6D 9B, 05, 09] -2EBE; [E0 6D 9D, 05, 05] -FA5D; [E0 6D 9D, 05, 05] -FA5E; [E0 6D 9D, 05, 05] -2EBF; [E0 6D 9D, 05, 09][, DD 61, 3D] -2EC0; [E0 6D 9D, 05, 09][, DF 79, 3D] -D87E DD90; [E0 6D C1, 05, 05] -D87E DD8F; [E0 6D CD, 05, 05] -D87E DD91; [E0 6D E5, 05, 05] -D87E DD93; [E0 6E 11, 05, 05] -D87E DD94; [E0 6E 15, 05, 05] -D87E DD95; [E0 6E 29, 05, 05] -D87E DD98; [E0 6E 79, 05, 05] -F974; [E0 6E 79, 05, 05] -D87E DD96; [E0 6E 7B, 05, 05] -D87E DD99; [E0 6E E9, 05, 05] -D87E DD9C; [E0 6E F5, 05, 05] -F9FE; [E0 6F 1F, 05, 05] -D87E DDA0; [E0 6F 59, 05, 05] -D87E DD9A; [E0 6F 79, 05, 05] -D87E DD9B; [E0 70 11, 05, 05] -D87E DD9D; [E0 70 31, 05, 05] -F93E; [E0 70 49, 05, 05] -D87E DDA1; [E0 70 4B, 05, 05] -D87E DDA2; [E0 70 4F, 05, 05] -D87E DDA3; [E0 70 6F, 05, 05] -D87E DD9E; [E0 70 85, 05, 05] -F958; [E0 70 99, 05, 05] -F918; [E0 71 35, 05, 05] -F96E; [E0 71 4D, 05, 05] -D87E DD9F; [E0 71 69, 05, 05] -FA5F; [E0 71 69, 05, 05] -F999; [E0 72 9B, 05, 05] -D87E DDA8; [E0 72 A1, 05, 05] -D87E DDA9; [E0 72 A5, 05, 05] -F9C2; [E0 72 B7, 05, 05] -D87E DDAA; [E0 72 EB, 05, 05] -D87E DDAC; [E0 73 8B, 05, 05] -F923; [E0 74 61, 05, 05] -F9F0; [E0 74 BB, 05, 05] -F935; [E0 74 D3, 05, 05] -FA20; [E0 74 EB, 05, 05] -F91F; [E0 75 25, 05, 05] -F910; [E0 75 49, 05, 05] -2F8C; [E0 75 65, 05, 09] -2EC1; [E0 75 67, 05, 05] -D87E DDB3; [E0 75 6B, 05, 05] -D87E DDB4; [E0 75 83, 05, 05] -F936; [E0 75 83, 05, 05] -D87E DDB5; [E0 75 99, 05, 05] -D87E DDB6; [E0 75 9D, 05, 05] -2F8D; [E0 75 A1, 05, 09] -D87E DDB8; [E0 75 DB, 05, 05] -D87E DDB7; [E0 76 21, 05, 05] -D87E DDBA; [E0 76 93, 05, 05] -D87E DDB9; [E0 76 EB, 05, 05] -D87E DDBC; [E0 77 23, 05, 05] -D87E DDBD; [E0 77 A9, 05, 05] -D87E DDBB; [E0 77 C5, 05, 05] -D87E DDBE; [E0 77 DF, 05, 05] -F911; [E0 78 4B, 05, 05] -D87E DDC0; [E0 78 99, 05, 05] -D87E DDC1; [E0 78 D9, 05, 05] -F927; [E0 79 19, 05, 05] -2F8E; [E0 79 5B, 05, 09] -FA08; [E0 79 73, 05, 05] -2F8F; [E0 79 73, 05, 09] -D87E DDC3; [E0 79 9B, 05, 05] -D87E DDC4; [E0 79 A1, 05, 05] -2F90; [E0 79 A1, 05, 09] -2EC2; [E0 79 A3, 05, 05] -F9A0; [E0 7A 63, 05, 05] -F9E7; [E0 7A 7D, 05, 05] -D87E DDC6; [E0 7A 8D, 05, 05] -D87E DDC7; [E0 7A 9B, 05, 05] -F9E8; [E0 7A A1, 05, 05] -F912; [E0 7A CF, 05, 05] -D87E DDC9; [E0 7A D3, 05, 05] -FA60; [E0 7B 03, 05, 05] -F924; [E0 7B AB, 05, 05] -2F91; [E0 7B DF, 05, 09] -2EC4; [E0 7B E1, 05, 05] -2EC3; [E0 7B E3, 05, 05] -FA0A; [E0 7B F9, 05, 05] -2F92; [E0 7B F9, 05, 09] -FA61; [E0 7C 13, 05, 05] -2EC5; [E0 7C 69, 05, 05] -2EC6; [E0 7C 8B, 05, 05] -2F93; [E0 7C 8B, 05, 09] -2EC7; [E0 7C 8B, 05, 09][, DD 61, 3D] -2F94; [E0 7C E7, 05, 09] -D87E DDCF; [E0 7E 2F, 05, 05] -F96F; [E0 7E 43, 05, 05] -F9A1; [E0 7E 43, 05, 05] -F97D; [E0 7E 93, 05, 05] -F941; [E0 7E 9B, 05, 05] -D87E DDD0; [E0 7E C9, 05, 05] -FA22; [E0 7E DF, 05, 05] -F95D; [E0 7E EB, 05, 05] -FA62; [E0 7E F1, 05, 05] -FA63; [E0 7F 65, 05, 05] -F9FC; [E0 7F A3, 05, 05] -F95A; [E0 7F F3, 05, 05] -D87E DDD1; [E0 80 0B, 05, 05] -2EC8; [E0 80 37, 05, 05] -2F95; [E0 81 69, 05, 09] -2F96; [E0 81 87, 05, 09] -F900; [E0 81 8B, 05, 05] -D87E DDD2; [E0 81 A5, 05, 05] -2F97; [E0 81 A5, 05, 09] -2F98; [E0 81 EB, 05, 09] -2F99; [E0 82 39, 05, 09] -3296; [E0 82 41, 05, 0D] -D87E DDD4; [E0 82 55, 05, 05] -D87E DDD5; [E0 82 81, 05, 05] -F948; [E0 82 83, 05, 05] -32AE; [E0 82 8D, 05, 0D] -F903; [E0 82 8F, 05, 05] -FA64; [E0 82 A5, 05, 05] -FA65; [E0 83 13, 05, 05] -D87E DDD6; [E0 83 39, 05, 05] -2EC9; [E0 83 3D, 05, 05] -2F9A; [E0 83 CB, 05, 09] -2F9B; [E0 83 E3, 05, 09] -D87E DDD7; [E0 83 F1, 05, 05] -2F9C; [E0 84 6D, 05, 09] -2ECA; [E0 84 6D, 05, 09][, DD 61, 3D] -D87E DDDB; [E0 84 7F, 05, 05] -D87E DDDA; [E0 84 9D, 05, 05] -F937; [E0 84 E5, 05, 05] -D87E DDDC; [E0 84 E7, 05, 05] -2F9D; [E0 86 65, 05, 09] -F902; [E0 86 A3, 05, 05] -2F9E; [E0 86 A3, 05, 09] -D87E DDDE; [E0 86 B7, 05, 05] -F998; [E0 87 5F, 05, 05] -F9D7; [E0 87 67, 05, 05] -D87E DDDF; [E0 87 83, 05, 05] -FA07; [E0 87 89, 05, 05] -F98D; [E0 87 D7, 05, 05] -2ECB; [E0 87 DF, 05, 05] -2F9F; [E0 88 4D, 05, 09] -D87E DD8D; [E0 88 53, 05, 05] -F971; [E0 88 77, 05, 05] -2FA0; [E0 88 77, 05, 09] -2FA1; [E0 88 81, 05, 09] -2ECC; [E0 88 83, 05, 05] -FA66; [E0 88 83, 05, 05] -2ECD; [E0 88 83, 05, 09][, DD 61, 3D] -2ECE; [E0 88 83, 05, 09][, DF 79, 3D] -F99A; [E0 89 61, 05, 05] -FA25; [E0 89 8B, 05, 05] -FA67; [E0 89 8B, 05, 05] -329C; [E0 89 ED, 05, 0D] -F9C3; [E0 8A 17, 05, 05] -F913; [E0 8A 3D, 05, 05] -2FA2; [E0 8A 41, 05, 09] -2ECF; [E0 8A 41, 05, 09][, DD 61, 3D] -D87E DDE2; [E0 8A 47, 05, 05] -F92C; [E0 8A BB, 05, 05] -D87E DDE3; [E0 8B 05, 05, 05] -FA26; [E0 8B 1D, 05, 05] -D87E DDE4; [E0 8B 45, 05, 05] -D87E DDE6; [E0 8B 59, 05, 05] -2FA3; [E0 8B B5, 05, 09] -F919; [E0 8B F7, 05, 05] -F9B7; [E0 8C 8F, 05, 05] -2FA4; [E0 8C B3, 05, 09] -F9E9; [E0 8C BF, 05, 05] -2FA5; [E0 8C BF, 05, 09] -F97E; [E0 8C C5, 05, 05] -F90A; [E0 8C C9, 05, 05] -2FA6; [E0 8C C9, 05, 09] -328E; [E0 8C C9, 05, 0D] -F9B1; [E0 8D 93, 05, 05] -D87E DDE7; [E0 8D 9B, 05, 05] -D87E DDEA; [E0 8E 27, 05, 05] -D87E DDE8; [E0 8E DD, 05, 05] -D87E DDE9; [E0 8E DF, 05, 05] -F93F; [E0 8F 3B, 05, 05] -F99B; [E0 8F C7, 05, 05] -D87E DDEB; [E0 91 2D, 05, 05] -D87E DDEC; [E0 91 65, 05, 05] -2ED0; [E0 92 49, 05, 05] -2ED1; [E0 94 35, 05, 05] -2FA7; [E0 94 35, 05, 09] -2ED2; [E0 94 37, 05, 05] -2ED3; [E0 94 45, 05, 05] -2FA8; [E0 94 47, 05, 09] -D87E DDEE; [E0 94 5D, 05, 05] -F986; [E0 94 A1, 05, 05] -D87E DDF0; [E0 94 B5, 05, 05] -2ED4; [E0 95 1B, 05, 05] -2FA9; [E0 95 83, 05, 09] -2ED5; [E0 95 83, 05, 09][, DD 61, 3D] -2ED6; [E0 95 85, 05, 05] -F9C6; [E0 95 A7, 05, 05] -F951; [E0 95 E1, 05, 05] -FA09; [E0 95 E5, 05, 05] -F959; [E0 96 39, 05, 05] -F9D3; [E0 96 3F, 05, 05] -F9DC; [E0 96 5B, 05, 05] -F9F1; [E0 96 95, 05, 05] -2FAA; [E0 96 BB, 05, 09] -F9B8; [E0 96 BF, 05, 05] -2FAB; [E0 96 C1, 05, 09] -D87E DDF3; [E0 96 D5, 05, 05] -F9EA; [E0 97 17, 05, 05] -FA68; [E0 97 19, 05, 05] -2FAC; [E0 97 23, 05, 09] -2ED7; [E0 97 23, 05, 09][, DD 61, 3D] -F9B2; [E0 97 3F, 05, 05] -F949; [E0 97 41, 05, 05] -D87E DDF5; [E0 97 99, 05, 05] -F938; [E0 97 B7, 05, 05] -F9B3; [E0 97 E3, 05, 05] -2FAD; [E0 97 F5, 05, 09] -2ED8; [E0 97 F7, 05, 05] -FA1C; [E0 98 03, 05, 05] -2FAE; [E0 98 13, 05, 09] -2FAF; [E0 98 1B, 05, 09] -2FB0; [E0 98 29, 05, 09] -2FB1; [E0 98 ED, 05, 09] -D87E DDFA; [E0 99 1B, 05, 05] -2ED9; [E0 99 27, 05, 05] -2FB2; [E0 99 35, 05, 09] -2FB3; [E0 99 41, 05, 09] -FA69; [E0 99 59, 05, 05] -2FB4; [E0 99 5D, 05, 09] -32A0; [E0 99 65, 05, 0D] -D87E DDFE; [E0 99 71, 05, 05] -D87E DDFF; [E0 99 71, 05, 05] -F9B4; [E0 99 8B, 05, 05] -D87E DE00; [E0 99 AD, 05, 05] -FA6A; [E0 99 D1, 05, 05] -F9D0; [E0 9A 1B, 05, 05] -2EDA; [E0 9A 49, 05, 05] -2FB5; [E0 9A AF, 05, 09] -2EDB; [E0 9A FB, 05, 05] -2FB6; [E0 9B 19, 05, 09] -2EDC; [E0 9B 1F, 05, 05] -2EDD; [E0 9B 21, 05, 05] -2FB7; [E0 9B 21, 05, 09] -2EDF; [E0 9B 23, 05, 05] -2EDE; [E0 9B 23, 05, 09][, DD 61, 3D] -D87E DE02; [E0 9B 27, 05, 05] -FA2A; [E0 9B 41, 05, 05] -FA2B; [E0 9B 5B, 05, 05] -FA2C; [E0 9B B3, 05, 05] -D87E DE04; [E0 9B B5, 05, 05] -2EE0; [E0 9C 2D, 05, 05] -2FB8; [E0 9C 93, 05, 09] -2EE1; [E0 9C 93, 05, 09][, DD 61, 3D] -2FB9; [E0 9C 99, 05, 09] -D87E DE05; [E0 9C B5, 05, 05] -2FBA; [E0 9C BF, 05, 09] -D87E DE06; [E0 9C EB, 05, 05] -F91A; [E0 9D 4D, 05, 05] -D87E DE07; [E0 9D 67, 05, 05] -F987; [E0 9E 43, 05, 05] -2EE2; [E0 9E 47, 05, 05] -2FBB; [E0 9E BF, 05, 09] -2EE3; [E0 9E BF, 05, 09][, DD 61, 3D] -2FBC; [E0 9F 23, 05, 09] -2FBD; [E0 9F 31, 05, 09] -D87E DE0A; [E0 9F 97, 05, 05] -2FBE; [E0 9F BD, 05, 09] -2FBF; [E0 9F D1, 05, 09] -2FC0; [E0 9F D7, 05, 09] -2FC1; [E0 9F EB, 05, 09] -2EE4; [E0 9F EB, 05, 09][, DD 61, 3D] -2FC2; [E0 A0 2B, 05, 09] -F939; [E0 A0 55, 05, 05] -D87E DE0B; [E0 A1 FB, 05, 05] -F9F2; [E0 A2 2D, 05, 05] -2EE5; [E0 A2 77, 05, 05] -2FC3; [E0 A3 4D, 05, 09] -D87E DE0C; [E0 A3 7D, 05, 05] -D87E DE0F; [E0 A4 55, 05, 05] -FA2D; [E0 A4 EF, 05, 05] -F93A; [E0 A5 7F, 05, 05] -F920; [E0 A5 C7, 05, 05] -2EE6; [E0 A5 C9, 05, 05] -2FC4; [E0 A6 79, 05, 09] -2EE7; [E0 A6 79, 05, 09][, DD 61, 3D] -F940; [E0 A6 8D, 05, 05] -2FC5; [E0 A6 8D, 05, 09] -F988; [E0 A6 BD, 05, 05] -F9F3; [E0 A6 CD, 05, 05] -2FC6; [E0 A6 D9, 05, 09] -2EE8; [E0 A6 DB, 05, 05] -D87E DE15; [E0 A7 09, 05, 05] -2FC7; [E0 A7 09, 05, 09] -2FC8; [E0 A7 19, 05, 09] -2EE9; [E0 A7 1B, 05, 05] -2FC9; [E0 A7 2D, 05, 09] -F989; [E0 A7 2F, 05, 05] -2FCA; [E0 A7 35, 05, 09] -D87E DE17; [E0 A7 85, 05, 05] -2FCB; [E0 A7 85, 05, 09] -2FCC; [E0 A7 8D, 05, 09] -2EEA; [E0 A7 8F, 05, 05] -D87E DE18; [E0 A7 8F, 05, 05] -D87E DE19; [E0 A7 9D, 05, 05] -2FCD; [E0 A7 AF, 05, 09] -D87E DE1A; [E0 A7 B1, 05, 05] -2FCE; [E0 A7 B9, 05, 09] -D87E DE1B; [E0 A7 BF, 05, 05] -2FCF; [E0 A7 D3, 05, 09] -D87E DE1C; [E0 A8 0D, 05, 05] -2FD0; [E0 A8 0D, 05, 09] -2FD1; [E0 A8 2B, 05, 09] -2EEB; [E0 A8 2B, 05, 09][, DD 61, 3D] -2EEC; [E0 A8 37, 05, 05] -2FD2; [E0 A8 3B, 05, 09] -2EED; [E0 A8 3B, 05, 09][, DD 61, 3D] -2EEE; [E0 A8 95, 05, 05] -F9C4; [E0 A8 B1, 05, 05] -2FD3; [E0 A8 B1, 05, 09] -2EEF; [E0 A8 B1, 05, 09][, DD 61, 3D] -2EF0; [E0 A8 C9, 05, 05] -F907; [E0 A8 CF, 05, 05] -F908; [E0 A8 CF, 05, 05] -2FD4; [E0 A8 CF, 05, 09] -2EF1; [E0 A8 CF, 05, 09][, DD 61, 3D] -2EF2; [E0 A8 CF, 05, 09][, DF 79, 3D] -2EF3; [E0 A8 D5, 05, 09] -2FD5; [E0 A8 D7, 05, 09] -FA0E; [E0 A9 9B, 05, 05] -FA0F; [E0 A9 9D, 05, 05] -FA11; [E0 A9 A1, 05, 05] -FA13; [E0 A9 A5, 05, 05] -FA14; [E0 A9 A7, 05, 05] -FA1F; [E0 A9 BD, 05, 05] -FA21; [E0 A9 C1, 05, 05] -FA23; [E0 A9 C5, 05, 05] -FA24; [E0 A9 C7, 05, 05] -FA27; [E0 A9 CD, 05, 05] -FA28; [E0 A9 CF, 05, 05] -FA29; [E0 A9 D1, 05, 05] - -D87E DC0C; [E0 AB 23, 05, 05] -D87E DC13; [E0 AB 59, 05, 05] -D87E DDCA; [E0 AB 5D, 05, 05] -D87E DC1F; [E0 AB A5, 05, 05] -D87E DC24; [E0 AC 15, 05, 05] -D87E DC67; [E0 AF D3, 05, 05] -D87E DC68; [E0 AF EF, 05, 05] -D87E DC76; [E0 B0 FD, 05, 05] -D87E DC83; [E0 B2 61, 05, 05] -D87E DC88; [E0 B2 C7, 05, 05] -D87E DC8A; [E0 B2 FB, 05, 05] -D87E DC96; [E0 B3 95, 05, 05] -D87E DC9B; [E0 B3 CD, 05, 05] -D87E DCA2; [E0 B4 43, 05, 05] -D87E DCA1; [E0 B4 7F, 05, 05] -D87E DCC2; [E0 B6 6F, 05, 05] -D87E DCC7; [E0 B6 EB, 05, 05] -D87E DCD1; [E0 B7 DF, 05, 05] -D87E DCD0; [E0 B8 2B, 05, 05] -D87E DCCE; [E0 B8 4D, 05, 05] -D87E DCDE; [E0 B8 AD, 05, 05] -D87E DCE7; [E0 B9 59, 05, 05] -D87E DCEE; [E0 BA 53, 05, 05] -D87E DCF2; [E0 BA BF, 05, 05] -D87E DD0A; [E0 BC 91, 05, 05] -D87E DD16; [E0 BD 5B, 05, 05] -D87E DD2A; [E0 BF 8F, 05, 05] -D87E DD2C; [E0 BF A7, 05, 05] -D87E DD2D; [E0 BF A7, 05, 05] -D87E DD33; [E0 C0 71, 05, 05] -D87E DD3E; [E0 C2 3B, 05, 05] -D87E DD3F; [E0 C2 53, 05, 05] -D87E DD49; [E0 C2 B5, 05, 05] -D87E DD4B; [E0 C2 CF, 05, 05] -D87E DD4C; [E0 C3 73, 05, 05] -D87E DD51; [E0 C4 11, 05, 05] -D87E DD58; [E0 C4 A9, 05, 05] -D87E DD60; [E0 C6 57, 05, 05] -D87E DD64; [E0 C6 A1, 05, 05] -D87E DD67; [E0 C7 97, 05, 05] -D87E DD6D; [E0 C8 5D, 05, 05] -D87E DD71; [E0 C8 C3, 05, 05] -D87E DD74; [E0 C9 11, 05, 05] -D87E DD81; [E0 CA 0D, 05, 05] -D87E DCD7; [E0 CA 15, 05, 05] -D87E DD84; [E0 CA 79, 05, 05] -D87E DD8E; [E0 CB 3D, 05, 05] -D87E DDA7; [E0 CC C1, 05, 05] -D87E DDAE; [E0 CD 29, 05, 05] -D87E DDAF; [E0 CD 31, 05, 05] -D87E DDB2; [E0 CD 45, 05, 05] -D87E DDBF; [E0 CE 21, 05, 05] -D87E DDC2; [E0 CE 65, 05, 05] -D87E DDC8; [E0 CE DD, 05, 05] -D87E DDCD; [E0 CF F3, 05, 05] -D87E DDCE; [E0 D0 09, 05, 05] -D87E DDEF; [E0 D5 B9, 05, 05] -D87E DDF2; [E0 D6 5F, 05, 05] -D87E DDF8; [E0 D7 73, 05, 05] -D87E DDF9; [E0 D7 83, 05, 05] -D87E DDFC; [E0 D7 FB, 05, 05] -D87E DE03; [E0 D9 05, 05, 05] -D87E DE08; [E0 DA 3F, 05, 05] -D87E DE0D; [E0 DC 47, 05, 05] -D87E DE0E; [E0 DC 85, 05, 05] -D87E DE11; [E0 DC 9B, 05, 05] -D87E DE16; [E0 DD 5B, 05, 05] - -D87E DC03; [E1 23 C5 57, 05, 05] -D87E DC12; [E1 24 1D 2D, 05, 05] -D87E DD1B; [E1 24 1D EA, 05, 05] -D87E DC16; [E1 24 21 18, 05, 05] -D87E DC0D; [E1 24 35 03, 05, 05] -D87E DDD9; [E1 24 5B 2D, 05, 05] -D87E DDDD; [E1 24 6D 57, 05, 05] -D87E DC34; [E1 24 89 2D, 05, 05] -D87E DC38; [E1 24 A3 18, 05, 05] -D87E DC59; [E1 25 70 D5, 05, 05] -D87E DC60; [E1 25 96 81, 05, 05] -D87E DC61; [E1 25 9C 03, 05, 05] -D87E DC6C; [E1 25 D9 2D, 05, 05] -D87E DC71; [E1 25 F5 2D, 05, 05] -D87E DCF8; [E1 26 21 C0, 05, 05] -D87E DC7B; [E1 26 33 D5, 05, 05] -D87E DC7D; [E1 26 34 03, 05, 05] -D87E DC89; [E1 26 81 18, 05, 05] -D87E DD39; [E1 26 83 6C, 05, 05] -D87E DC91; [E1 26 A4 EA, 05, 05] -D87E DC92; [E1 26 A4 EA, 05, 05] -D87E DCA4; [E1 26 F2 81, 05, 05] -D87E DCB8; [E1 27 4F 81, 05, 05] -D87E DCBE; [E1 27 62 96, 05, 05] -D87E DCCA; [E1 27 BA 03, 05, 05] -D87E DC97; [E1 27 F3 2D, 05, 05] -D87E DD80; [E1 28 04 18, 05, 05] -D87E DD89; [E1 28 08 6C, 05, 05] -D87E DD8A; [E1 28 09 2D, 05, 05] -D87E DCDD; [E1 28 0C 6C, 05, 05] -D87E DCE3; [E1 28 1A 96, 05, 05] -D87E DCEC; [E1 28 49 C0, 05, 05] -D87E DCF0; [E1 28 74 C0, 05, 05] -D87E DCF7; [E1 28 9D 42, 05, 05] -D87E DCF9; [E1 28 A6 57, 05, 05] -D87E DCFB; [E1 28 CB D5, 05, 05] -D87E DD06; [E1 28 D4 03, 05, 05] -D87E DD0D; [E1 28 F8 42, 05, 05] -D87E DD10; [E1 29 07 03, 05, 05] -D87E DD11; [E1 29 0B 03, 05, 05] -D87E DD1D; [E1 29 47 6C, 05, 05] -D87E DD1F; [E1 29 62 C0, 05, 05] -D87E DD23; [E1 29 95 2D, 05, 05] -D87E DD26; [E1 29 AE 42, 05, 05] -D87E DD27; [E1 29 C0 D5, 05, 05] -D87E DD35; [E1 2A 1C 03, 05, 05] -D87E DD37; [E1 2A 23 AB, 05, 05] -D87E DD3B; [E1 2A 64 EA, 05, 05] -D87E DD3C; [E1 2A 66 D5, 05, 05] -D87E DD3D; [E1 2A 72 81, 05, 05] -D87E DD42; [E1 2A 81 03, 05, 05] -D87E DD41; [E1 2A 81 18, 05, 05] -D87E DD43; [E1 2A 84 42, 05, 05] -D87E DD44; [E1 2A 86 6C, 05, 05] -D87E DD4D; [E1 2A C4 96, 05, 05] -D87E DD52; [E1 2A F0 03, 05, 05] -D87E DD54; [E1 2A F9 AB, 05, 05] -D87E DD55; [E1 2A FD 42, 05, 05] -D87E DD5C; [E1 2B 3A 2D, 05, 05] -D87E DD5D; [E1 2B 53 18, 05, 05] -D87E DD5E; [E1 2B 53 18, 05, 05] -D87E DD61; [E1 2B 68 C0, 05, 05] -D87E DD65; [E1 2B 7A 81, 05, 05] -D87E DD6B; [E1 2B BB 03, 05, 05] -D87E DC98; [E1 2B EC AB, 05, 05] -D87E DD72; [E1 2B F3 2D, 05, 05] -D87E DD73; [E1 2B F5 C0, 05, 05] -D87E DD75; [E1 2C 04 EA, 05, 05] -D87E DD77; [E1 2C 0D 57, 05, 05] -D87E DD7B; [E1 2C 2F AB, 05, 05] -D87E DD7C; [E1 2C 35 C0, 05, 05] -D87E DD7E; [E1 2C 40 D5, 05, 05] -D87E DD87; [E1 2C 6B 6C, 05, 05] -D87E DD88; [E1 2C 6C 96, 05, 05] -D87E DD97; [E1 2C B7 D5, 05, 05] -D87E DDA4; [E1 2C CC AB, 05, 05] -D87E DDA6; [E1 2C D9 EA, 05, 05] -D87E DDA5; [E1 2C E6 6C, 05, 05] -D87E DDAD; [E1 2D 0E D5, 05, 05] -D87E DDB0; [E1 2D 19 EA, 05, 05] -D87E DDB1; [E1 2D 32 03, 05, 05] -D87E DDAB; [E1 2D 71 57, 05, 05] -D87E DDC5; [E1 2D A9 18, 05, 05] -D87E DDCB; [E1 2D D9 AB, 05, 05] -D87E DDCC; [E1 2D E9 03, 05, 05] -D87E DDD3; [E1 2E 31 81, 05, 05] -D87E DDD8; [E1 2E 67 6C, 05, 05] - -D87E DDE0; [E1 2E F5 03, 05, 05] -D87E DDE1; [E1 2E F7 42, 05, 05] -D87E DDE5; [E1 2F 15 03, 05, 05] -D87E DDED; [E1 2F 7B 57, 05, 05] -D87E DDF1; [E1 2F 9B 18, 05, 05] -D87E DDF6; [E1 2F EC 42, 05, 05] -D87E DC1C; [E1 2F F9 18, 05, 05] -D87E DDF7; [E1 2F FE 03, 05, 05] -D87E DDFB; [E1 30 2A 57, 05, 05] -D87E DDFD; [E1 30 36 03, 05, 05] -D87E DE01; [E1 30 4E 03, 05, 05] -D87E DE09; [E1 30 C2 D5, 05, 05] -D87E DE10; [E1 31 3D AB, 05, 05] -D87E DE12; [E1 31 42 42, 05, 05] -D87E DE13; [E1 31 58 57, 05, 05] -D87E DE14; [E1 31 63 42, 05, 05] -D87E DC8F; [E1 31 78 AB, 05, 05] -D87E DE1D; [E1 31 AC 81, 05, 05] - -2ADC; [E2 6E 17 96, 05, 05][, A5, 05] +2F00; [E0 04 06, 05, 09] +3280; [E0 04 06, 05, 0D] +3192; [E0 04 06, 05, 27] +319C; [E0 04 08, 05, 27] +3286; [E0 04 0C, 05, 0D] +3282; [E0 04 18, 05, 0D] +3194; [E0 04 18, 05, 27] +32A4; [E0 04 1A, 05, 0D] +3196; [E0 04 1A, 05, 27] +32A6; [E0 04 1C, 05, 0D] +3198; [E0 04 1C, 05, 27] +F967; [E0 04 20, 05, 05] +319B; [E0 04 38, 05, 27] +2F01; [E0 04 56, 05, 09] +2EA6; [E0 04 5E, 05, 09] +32A5; [E0 04 60, 05, 0D] +3197; [E0 04 60, 05, 27] +F905; [E0 04 6A, 05, 05] +2F02; [E0 04 72, 05, 09] +2E80; [E0 04 72, 05, 09][, E0 8D, 3D] +D87E DC01; [E0 04 76, 05, 05] +F95E; [E0 04 78, 05, 05] +D87E DC00; [E0 04 80, 05, 05] +2F03; [E0 04 84, 05, 09] +D87E DC02; [E0 04 88, 05, 05] +2F04; [E0 04 B8, 05, 09] +319A; [E0 04 B8, 05, 27] +2E84; [E0 04 B8, 05, 09][, E0 8D, 3D] +2E83; [E0 04 BA, 05, 09] +2E82; [E0 04 BC, 05, 09] +3288; [E0 04 C0, 05, 0D] +F91B; [E0 05 10, 05, 05] +2F05; [E0 05 16, 05, 09] +F9BA; [E0 05 18, 05, 05] +2F06; [E0 05 24, 05, 09] +3281; [E0 05 24, 05, 0D] +3193; [E0 05 24, 05, 27] +3284; [E0 05 34, 05, 0D] +2F07; [E0 05 4C, 05, 09] +F977; [E0 05 68, 05, 05] +2F08; [E0 05 80, 05, 09] +319F; [E0 05 80, 05, 27] +2E85; [E0 05 82, 05, 09] +F9FD; [E0 05 8C, 05, 05] +D87E DC19; [E0 05 A4, 05, 05] +F9A8; [E0 05 D4, 05, 05] +32AD; [E0 06 14, 05, 0D] +32A1; [E0 06 34, 05, 0D] +D87E DC04; [E0 06 D2, 05, 05] +F92D; [E0 07 24, 05, 05] +F9B5; [E0 07 2E, 05, 05] +D87E DC05; [E0 07 74, 05, 05] +FA30; [E0 07 74, 05, 05] +D87E DC06; [E0 07 8E, 05, 05] +F965; [E0 07 96, 05, 05] +D87E DC07; [E0 08 22, 05, 05] +F9D4; [E0 08 74, 05, 05] +D87E DC08; [E0 09 18, 05, 05] +D87E DC09; [E0 09 56, 05, 05] +D87E DC0B; [E0 09 C2, 05, 05] +F9BB; [E0 09 D8, 05, 05] +D87E DC0A; [E0 09 F2, 05, 05] +FA31; [E0 09 F2, 05, 05] +329D; [E0 0A 7E, 05, 0D] +2F09; [E0 0A A8, 05, 09] +FA0C; [E0 0A AA, 05, 05] +D87E DC0E; [E0 0A C4, 05, 05] +FA32; [E0 0A C4, 05, 05] +D87E DC0F; [E0 0A D2, 05, 05] +D87E DC10; [E0 0A F2, 05, 05] +2F0A; [E0 0A F4, 05, 09] +D87E DC14; [E0 0A F8, 05, 05] +F978; [E0 0A FC, 05, 05] +2F0B; [E0 0B 06, 05, 09] +3287; [E0 0B 06, 05, 0D] +F9D1; [E0 0B 0A, 05, 05] +3285; [E0 0B 0A, 05, 0D] +D87E DC11; [E0 0B 1E, 05, 05] +2F0C; [E0 0B 34, 05, 09] +2E86; [E0 0B 34, 05, 09][, E0 8D, 3D] +D87E DC15; [E0 0B 4A, 05, 05] +D87E DCD2; [E0 0B 54, 05, 05] +D87E DCD3; [E0 0B 5A, 05, 05] +2F0D; [E0 0B 5C, 05, 09] +D87E DC17; [E0 0B 5E, 05, 05] +32A2; [E0 0B 62, 05, 0D] +D87E DC18; [E0 0B 78, 05, 05] +2F0E; [E0 0B 86, 05, 09] +D87E DC1A; [E0 0B 88, 05, 05] +D87E DC1B; [E0 0B 9A, 05, 05] +F92E; [E0 0B 9E, 05, 05] +F979; [E0 0B C2, 05, 05] +F955; [E0 0B C8, 05, 05] +F954; [E0 0B E8, 05, 05] +FA15; [E0 0B EC, 05, 05] +2F0F; [E0 0B F0, 05, 09] +2E87; [E0 0B F0, 05, 09][, E0 8D, 3D] +D87E DC1D; [E0 0C 20, 05, 05] +2F10; [E0 0C 20, 05, 09] +2F11; [E0 0C 36, 05, 09] +2E88; [E0 0C 36, 05, 09][, E0 8D, 3D] +2E89; [E0 0C 3A, 05, 09] +D87E DC1E; [E0 0C 3C, 05, 05] +D87E DC50; [E0 0C 44, 05, 05] +FA00; [E0 0C 44, 05, 05] +F99C; [E0 0C 64, 05, 05] +F9DD; [E0 0C 88, 05, 05] +F9FF; [E0 0C AA, 05, 05] +D87E DC20; [E0 0C AC, 05, 05] +D87E DC21; [E0 0C C2, 05, 05] +D87E DC22; [E0 0D 20, 05, 05] +D87E DC23; [E0 0D 2A, 05, 05] +F9C7; [E0 0D 4E, 05, 05] +F98A; [E0 0D 72, 05, 05] +2F12; [E0 0D 72, 05, 09] +F99D; [E0 0D 82, 05, 05] +D87E DD92; [E0 0D A2, 05, 05] +3298; [E0 0D A4, 05, 0D] +D87E DC25; [E0 0D CA, 05, 05] +D87E DC26; [E0 0D CE, 05, 05] +FA33; [E0 0D CE, 05, 05] +F952; [E0 0D E0, 05, 05] +F92F; [E0 0D F8, 05, 05] +D87E DC27; [E0 0E 0A, 05, 05] +FA34; [E0 0E 0A, 05, 05] +F97F; [E0 0E 2C, 05, 05] +2F13; [E0 0E 34, 05, 09] +D87E DC28; [E0 0E 36, 05, 05] +D87E DC29; [E0 0E 4C, 05, 05] +D87E DC2A; [E0 0E 4E, 05, 05] +2F14; [E0 0E 6C, 05, 09] +D87E DC2B; [E0 0E 70, 05, 05] +F963; [E0 0E 70, 05, 05] +2F15; [E0 0E 76, 05, 09] +2F16; [E0 0E B2, 05, 09] +32A9; [E0 0E B8, 05, 0D] +F9EB; [E0 0E C0, 05, 05] +2F17; [E0 0E C4, 05, 09] +3038; [E0 0E C4, 05, 09] +3289; [E0 0E C4, 05, 0D] +3039; [E0 0E CA, 05, 09] +303A; [E0 0E CC, 05, 09] +D87E DC2C; [E0 0E D4, 05, 05] +D87E DC2D; [E0 0E E4, 05, 05] +FA35; [E0 0E E4, 05, 05] +32AF; [E0 0E EA, 05, 0D] +D87E DC2E; [E0 0E F6, 05, 05] +2F18; [E0 0E FA, 05, 09] +2E8A; [E0 0E FA, 05, 09][, E0 8D, 3D] +2F19; [E0 0F 1A, 05, 09] +2E8B; [E0 0F 1A, 05, 09][, E0 8D, 3D] +329E; [E0 0F 28, 05, 0D] +D87E DC2F; [E0 0F 2E, 05, 05] +F91C; [E0 0F 32, 05, 05] +D87E DC30; [E0 0F 42, 05, 05] +D87E DC31; [E0 0F 46, 05, 05] +D87E DC32; [E0 0F 46, 05, 05] +D87E DC33; [E0 0F 46, 05, 05] +2F1A; [E0 0F 4C, 05, 09] +2E81; [E0 0F 4C, 05, 09][, E0 8D, 3D] +2F1B; [E0 0F B4, 05, 09] +F96B; [E0 0F CE, 05, 05] +2F1C; [E0 0F D8, 05, 09] +D87E DC36; [E0 0F DC, 05, 05] +D87E DC37; [E0 10 0C, 05, 05] +2F1D; [E0 10 14, 05, 09] +F906; [E0 10 18, 05, 05] +D87E DC39; [E0 10 24, 05, 05] +D87E DC3A; [E0 10 30, 05, 05] +32A8; [E0 10 34, 05, 0D] +D87E DC3B; [E0 10 5A, 05, 05] +3294; [E0 10 68, 05, 0D] +F9DE; [E0 10 6C, 05, 05] +F9ED; [E0 10 88, 05, 05] +D87E DC3D; [E0 10 BE, 05, 05] +F980; [E0 10 D2, 05, 05] +D87E DC3E; [E0 10 DE, 05, 05] +D87E DC3F; [E0 11 24, 05, 05] +D87E DC3C; [E0 11 90, 05, 05] +D87E DC40; [E0 11 98, 05, 05] +F99E; [E0 11 CE, 05, 05] +D87E DC41; [E0 12 46, 05, 05] +D87E DC42; [E0 12 7A, 05, 05] +D87E DC43; [E0 13 06, 05, 05] +D87E DC44; [E0 13 26, 05, 05] +D87E DC45; [E0 13 68, 05, 05] +D87E DC46; [E0 13 68, 05, 05] +F90B; [E0 13 6E, 05, 05] +D87E DC47; [E0 13 92, 05, 05] +FA36; [E0 13 9A, 05, 05] +D87E DC48; [E0 13 B6, 05, 05] +D87E DC49; [E0 13 C6, 05, 05] +FA0D; [E0 13 E0, 05, 05] +D87E DC4A; [E0 13 E4, 05, 05] +D87E DC4C; [E0 14 72, 05, 05] +FA37; [E0 14 72, 05, 05] +D87E DC4E; [E0 15 0E, 05, 05] +FA38; [E0 15 3C, 05, 05] +D87E DC4F; [E0 15 54, 05, 05] +2F1E; [E0 16 20, 05, 09] +3283; [E0 16 28, 05, 0D] +3195; [E0 16 28, 05, 27] +F9A9; [E0 16 64, 05, 05] +D87E DC4B; [E0 16 9E, 05, 05] +D87E DC4D; [E0 16 A0, 05, 05] +2F1F; [E0 16 B0, 05, 09] +328F; [E0 16 B0, 05, 0D] +319E; [E0 16 D2, 05, 27] +D87E DC55; [E0 17 8E, 05, 05] +D87E DC52; [E0 18 1A, 05, 05] +D87E DC53; [E0 18 66, 05, 05] +D87E DC54; [E0 18 98, 05, 05] +D87E DC57; [E0 18 E0, 05, 05] +D87E DC56; [E0 18 E2, 05, 05] +FA39; [E0 19 04, 05, 05] +FA10; [E0 19 38, 05, 05] +F96C; [E0 19 40, 05, 05] +FA3A; [E0 19 D4, 05, 05] +D87E DC58; [E0 19 DC, 05, 05] +F94A; [E0 1A 3A, 05, 05] +F942; [E0 1A 48, 05, 05] +2F20; [E0 1A 60, 05, 09] +D87E DC51; [E0 1A 66, 05, 05] +D87E DC5A; [E0 1A 6E, 05, 05] +D87E DC5B; [E0 1A 78, 05, 05] +2F21; [E0 1A 8E, 05, 09] +D87E DC5C; [E0 1A 96, 05, 05] +2F22; [E0 1A 9E, 05, 09] +2F23; [E0 1A B4, 05, 09] +D87E DC5D; [E0 1A BE, 05, 05] +32B0; [E0 1A C2, 05, 0D] +D87E DC5E; [E0 1A CE, 05, 05] +2F24; [E0 1A D8, 05, 09] +337D; [E0 1A D8, 05, 37][E0 40 34, 05, 3D] +319D; [E0 1A DC, 05, 27] +F90C; [E0 1B 20, 05, 05] +F909; [E0 1B 32, 05, 05] +D87E DC5F; [E0 1B 54, 05, 05] +F981; [E0 1B 76, 05, 05] +2F25; [E0 1B 76, 05, 09] +329B; [E0 1B 76, 05, 0D] +D87E DC65; [E0 1C 46, 05, 05] +D87E DC62; [E0 1C 6E, 05, 05] +D87E DC63; [E0 1C CC, 05, 05] +D87E DC64; [E0 1C E4, 05, 05] +D87E DC66; [E0 1D 68, 05, 05] +D87E DD86; [E0 1E 0C, 05, 05] +D87E DC69; [E0 1E B2, 05, 05] +D87E DC6A; [E0 1F 24, 05, 05] +D87E DC6B; [E0 1F 24, 05, 05] +2F26; [E0 1F 48, 05, 09] +32AB; [E0 1F 74, 05, 0D] +2F27; [E0 1F A8, 05, 09] +FA04; [E0 1F B2, 05, 05] +32AA; [E0 1F D6, 05, 0D] +D87E DC6D; [E0 20 34, 05, 05] +D87E DC6E; [E0 20 5E, 05, 05] +D87E DC6F; [E0 20 7C, 05, 05] +F95F; [E0 20 7C, 05, 05] +F9AA; [E0 20 7C, 05, 05] +F9BC; [E0 20 8A, 05, 05] +D87E DC70; [E0 20 94, 05, 05] +2F28; [E0 20 9E, 05, 09] +D87E DC72; [E0 20 AC, 05, 05] +D87E DC73; [E0 20 BA, 05, 05] +2F29; [E0 20 CC, 05, 09] +2E8C; [E0 20 CC, 05, 09][, E0 8D, 3D] +2E8D; [E0 20 CC, 05, 09][, E0 9D, 3D] +D87E DC75; [E0 20 F2, 05, 05] +2E90; [E0 20 F2, 05, 09] +2F2A; [E0 20 F2, 05, 09] +2E8E; [E0 20 F2, 05, 09][, E0 8D, 3D] +2E8F; [E0 20 F4, 05, 09] +2E91; [E0 20 F4, 05, 09][, E0 8D, 3D] +2F2B; [E0 21 24, 05, 09] +F9BD; [E0 21 32, 05, 05] +D87E DC77; [E0 21 74, 05, 05] +F94B; [E0 21 78, 05, 05] +FA3B; [E0 21 7C, 05, 05] +F9DF; [E0 21 7E, 05, 05] +D87E DC78; [E0 21 90, 05, 05] +FA3C; [E0 21 90, 05, 05] +2F2C; [E0 21 90, 05, 09] +2F2D; [E0 21 96, 05, 09] +D87E DC7A; [E0 21 CE, 05, 05] +D87E DC79; [E0 22 3A, 05, 05] +F9D5; [E0 22 EC, 05, 05] +D87E DC7C; [E0 23 46, 05, 05] +F921; [E0 23 60, 05, 05] +D87E DC7F; [E0 23 96, 05, 05] +D87E DC7E; [E0 23 9C, 05, 05] +D87E DC80; [E0 23 B8, 05, 05] +D87E DDF4; [E0 24 2A, 05, 05] +F9AB; [E0 24 3A, 05, 05] +2F2E; [E0 24 7C, 05, 09] +D87E DC81; [E0 24 88, 05, 05] +D87E DC82; [E0 24 8A, 05, 05] +2F2F; [E0 24 90, 05, 09] +32A7; [E0 24 92, 05, 0D] +2F30; [E0 24 A8, 05, 09] +2E92; [E0 24 AC, 05, 09] +D87E DC84; [E0 24 C0, 05, 05] +2F31; [E0 24 C2, 05, 09] +D87E DC85; [E0 25 1C, 05, 05] +D87E DC86; [E0 25 46, 05, 05] +D87E DC87; [E0 25 9E, 05, 05] +2F32; [E0 25 B0, 05, 09] +337B; [E0 25 B2, 05, 37][E0 2D 1C, 05, 3D] +F98E; [E0 25 B4, 05, 05] +2E93; [E0 25 C0, 05, 09] +2F33; [E0 25 C0, 05, 09] +2F34; [E0 25 CA, 05, 09] +FA01; [E0 26 1E, 05, 05] +D87E DC8B; [E0 26 32, 05, 05] +D87E DC8C; [E0 26 38, 05, 05] +D87E DC8D; [E0 26 3E, 05, 05] +F9A2; [E0 26 64, 05, 05] +D87E DC8E; [E0 26 66, 05, 05] +F928; [E0 26 66, 05, 05] +FA0B; [E0 26 78, 05, 05] +F982; [E0 26 AA, 05, 05] +2F35; [E0 26 BA, 05, 09] +D87E DC90; [E0 26 CE, 05, 05] +2F36; [E0 26 CE, 05, 09] +F943; [E0 26 DA, 05, 05] +2F37; [E0 26 E8, 05, 09] +2F38; [E0 26 F8, 05, 09] +D87E DC94; [E0 27 1C, 05, 05] +D87E DC95; [E0 27 1C, 05, 05] +2F39; [E0 27 78, 05, 09] +2E95; [E0 27 78, 05, 09][, E0 8D, 3D] +2E94; [E0 27 7A, 05, 09] +D87E DC74; [E0 27 7E, 05, 05] +2F3A; [E0 27 9A, 05, 09] +D87E DC99; [E0 27 9C, 05, 05] +D87E DC9A; [E0 27 AE, 05, 05] +2F3B; [E0 27 BE, 05, 09] +F9D8; [E0 27 EE, 05, 05] +D87E DC9C; [E0 28 12, 05, 05] +F966; [E0 28 30, 05, 05] +2F3C; [E0 28 64, 05, 09] +2E97; [E0 28 64, 05, 09][, E0 8D, 3D] +2E96; [E0 28 66, 05, 09] +D87E DC9D; [E0 28 78, 05, 05] +D87E DC9E; [E0 28 8C, 05, 05] +F9A3; [E0 28 C8, 05, 05] +D87E DC9F; [E0 28 D0, 05, 05] +F960; [E0 29 08, 05, 05] +F9AC; [E0 29 1C, 05, 05] +D87E DCA0; [E0 29 E6, 05, 05] +D87E DCA3; [E0 2A 12, 05, 05] +FA3D; [E0 2A 12, 05, 05] +D87E DCA5; [E0 2A 78, 05, 05] +F9B9; [E0 2A AC, 05, 05] +F9D9; [E0 2B 78, 05, 05] +D87E DCA6; [E0 2B 80, 05, 05] +D87E DCA7; [E0 2B 88, 05, 05] +D87E DCA9; [E0 2B 88, 05, 05] +D87E DCA8; [E0 2B 8C, 05, 05] +FA3E; [E0 2B C0, 05, 05] +D87E DCAA; [E0 2B E4, 05, 05] +D87E DCAB; [E0 2C 12, 05, 05] +FA3F; [E0 2C 12, 05, 05] +F98F; [E0 2C 16, 05, 05] +D87E DCAD; [E0 2C 3E, 05, 05] +D87E DCAE; [E0 2C 54, 05, 05] +D87E DCAC; [E0 2C 5A, 05, 05] +D87E DCAF; [E0 2C B2, 05, 05] +D87E DCB0; [E0 2C DA, 05, 05] +FA40; [E0 2C DA, 05, 05] +D87E DCB1; [E0 2C E2, 05, 05] +F90D; [E0 2C E2, 05, 05] +F990; [E0 2C F6, 05, 05] +2F3D; [E0 2D 0C, 05, 09] +D87E DCB2; [E0 2D 1C, 05, 05] +D87E DCB3; [E0 2D 32, 05, 05] +F9D2; [E0 2D 58, 05, 05] +2F3E; [E0 2D 68, 05, 09] +2F3F; [E0 2D 92, 05, 09] +2E98; [E0 2D 94, 05, 09] +D87E DCB4; [E0 2D B6, 05, 05] +D87E DCB5; [E0 2E 64, 05, 05] +F925; [E0 2E 94, 05, 05] +F95B; [E0 2E A0, 05, 05] +FA02; [E0 2E A8, 05, 05] +D87E DCB6; [E0 2E AA, 05, 05] +D87E DCBA; [E0 2E FA, 05, 05] +F973; [E0 2F 04, 05, 05] +D87E DCB9; [E0 2F 82, 05, 05] +D87E DCB7; [E0 2F A8, 05, 05] +D87E DCBB; [E0 2F D8, 05, 05] +F9A4; [E0 30 04, 05, 05] +D87E DCBC; [E0 30 14, 05, 05] +F975; [E0 30 4E, 05, 05] +D87E DCC1; [E0 30 60, 05, 05] +D87E DCC0; [E0 30 98, 05, 05] +D87E DCBD; [E0 30 D6, 05, 05] +D87E DCBF; [E0 31 58, 05, 05] +D87E DCC3; [E0 31 E6, 05, 05] +D87E DCC6; [E0 32 08, 05, 05] +D87E DCC4; [E0 32 16, 05, 05] +F991; [E0 32 4E, 05, 05] +D87E DCC5; [E0 32 54, 05, 05] +F930; [E0 32 A2, 05, 05] +2F40; [E0 33 7E, 05, 09] +2F41; [E0 33 88, 05, 09] +2E99; [E0 33 8A, 05, 09] +D87E DCC8; [E0 33 BE, 05, 05] +FA41; [E0 33 BE, 05, 05] +D87E DCC9; [E0 33 F8, 05, 05] +F969; [E0 34 16, 05, 05] +2F42; [E0 34 34, 05, 09] +2F43; [E0 34 54, 05, 09] +F9BE; [E0 34 58, 05, 05] +2F44; [E0 34 6E, 05, 09] +2F45; [E0 34 98, 05, 09] +F983; [E0 34 B0, 05, 05] +2F46; [E0 34 E6, 05, 09] +2E9B; [E0 34 E8, 05, 09] +FA42; [E0 34 EA, 05, 05] +D87E DCCB; [E0 34 EC, 05, 05] +2F47; [E0 34 F0, 05, 09] +3290; [E0 34 F0, 05, 0D] +2E9C; [E0 34 F0, 05, 09][, E0 8D, 3D] +337E; [E0 35 48, 05, 37][E0 42 F0, 05, 3D] +F9E0; [E0 35 52, 05, 05] +337C; [E0 35 86, 05, 37][E0 11 6C, 05, 3D] +D87E DCCD; [E0 35 BE, 05, 05] +FA12; [E0 36 1A, 05, 05] +F9C5; [E0 36 42, 05, 05] +D87E DCCF; [E0 36 54, 05, 05] +FA43; [E0 36 54, 05, 05] +D87E DCD5; [E0 36 6A, 05, 05] +FA06; [E0 36 9A, 05, 05] +F98B; [E0 36 BE, 05, 05] +2F48; [E0 37 18, 05, 09] +F901; [E0 37 20, 05, 05] +D87E DCCC; [E0 37 28, 05, 05] +D87E DCD4; [E0 37 38, 05, 05] +2F49; [E0 37 48, 05, 09] +328A; [E0 37 48, 05, 0D] +2E9D; [E0 37 48, 05, 09][, E0 8D, 3D] +3292; [E0 37 4A, 05, 0D] +D87E DCD8; [E0 37 66, 05, 05] +F929; [E0 37 66, 05, 05] +D87E DCD9; [E0 37 6E, 05, 05] +D87E DCDA; [E0 37 7A, 05, 05] +2F4A; [E0 37 88, 05, 09] +328D; [E0 37 88, 05, 0D] +F9E1; [E0 37 D4, 05, 05] +D87E DCDC; [E0 37 DE, 05, 05] +D87E DCDB; [E0 37 F4, 05, 05] +F9C8; [E0 38 34, 05, 05] +D87E DCE0; [E0 38 48, 05, 05] +F9F4; [E0 38 6C, 05, 05] +F9C9; [E0 39 2A, 05, 05] +D87E DCDF; [E0 39 38, 05, 05] +F9DA; [E0 39 72, 05, 05] +D87E DCE5; [E0 39 82, 05, 05] +3291; [E0 39 98, 05, 0D] +337F; [E0 39 98, 05, 37][E0 26 F0, 05, 3D][E0 06 46, 05, 3D][E0 5C 92, 05, 3D] +D87E DCE1; [E0 39 E8, 05, 05] +F97A; [E0 3A 4C, 05, 05] +D87E DCE2; [E0 3A 54, 05, 05] +FA44; [E0 3A 54, 05, 05] +D87E DCE4; [E0 3A 66, 05, 05] +F9E2; [E0 3A 9A, 05, 05] +D87E DCE6; [E0 3B 78, 05, 05] +D87E DCE8; [E0 3B D4, 05, 05] +D87E DCE9; [E0 3C 9C, 05, 05] +D87E DCEA; [E0 3D 30, 05, 05] +F914; [E0 3D 60, 05, 05] +F95C; [E0 3D 60, 05, 05] +F9BF; [E0 3D 60, 05, 05] +F94C; [E0 3D 82, 05, 05] +D87E DCEB; [E0 3E B2, 05, 05] +F931; [E0 3F 0E, 05, 05] +D87E DCED; [E0 3F 1E, 05, 05] +F91D; [E0 3F 70, 05, 05] +2F4B; [E0 3F A8, 05, 09] +D87E DCEF; [E0 3F AA, 05, 05] +D87E DCF1; [E0 40 16, 05, 05] +2F4C; [E0 40 32, 05, 09] +32A3; [E0 40 34, 05, 0D] +D87E DCF3; [E0 40 52, 05, 05] +F98C; [E0 40 5C, 05, 05] +2F4D; [E0 40 60, 05, 09] +2E9E; [E0 40 62, 05, 09][, E0 8D, 3D] +D87E DCF4; [E0 40 AC, 05, 05] +F9A5; [E0 40 CA, 05, 05] +2F4E; [E0 40 D4, 05, 09] +D87E DCF5; [E0 40 E2, 05, 05] +F970; [E0 40 E2, 05, 05] +D87E DCF6; [E0 40 E4, 05, 05] +2F4F; [E0 41 0A, 05, 09] +2E9F; [E0 41 0E, 05, 09] +2F50; [E0 41 1C, 05, 09] +2F51; [E0 41 2A, 05, 09] +2F52; [E0 41 92, 05, 09] +2EA0; [E0 41 96, 05, 09] +2F53; [E0 41 9C, 05, 09] +2F54; [E0 41 DC, 05, 09] +328C; [E0 41 DC, 05, 0D] +2EA1; [E0 41 DE, 05, 09] +2EA2; [E0 41 E8, 05, 09] +D87E DCFA; [E0 42 16, 05, 05] +D87E DCFE; [E0 42 48, 05, 05] +F972; [E0 42 8A, 05, 05] +D87E DCFC; [E0 42 F8, 05, 05] +F968; [E0 43 18, 05, 05] +D87E DCFD; [E0 43 1A, 05, 05] +F9E3; [E0 43 4A, 05, 05] +329F; [E0 43 50, 05, 0D] +D87E DCFF; [E0 43 AC, 05, 05] +F915; [E0 43 B6, 05, 05] +FA05; [E0 43 BC, 05, 05] +D87E DD07; [E0 43 E8, 05, 05] +D87E DD00; [E0 43 FC, 05, 05] +D87E DD02; [E0 44 08, 05, 05] +F9CA; [E0 44 08, 05, 05] +D87E DD03; [E0 44 58, 05, 05] +F92A; [E0 44 5A, 05, 05] +D87E DD01; [E0 44 74, 05, 05] +FA45; [E0 44 74, 05, 05] +D87E DD04; [E0 44 76, 05, 05] +D87E DD05; [E0 44 90, 05, 05] +F9F5; [E0 45 22, 05, 05] +F94D; [E0 45 40, 05, 05] +F9D6; [E0 45 60, 05, 05] +D87E DD0E; [E0 45 7E, 05, 05] +FA46; [E0 45 C0, 05, 05] +D87E DD08; [E0 45 EA, 05, 05] +D87E DD09; [E0 46 6E, 05, 05] +F9CB; [E0 46 CA, 05, 05] +F9EC; [E0 47 0C, 05, 05] +D87E DD0C; [E0 47 26, 05, 05] +D87E DD0B; [E0 47 2E, 05, 05] +F904; [E0 47 3A, 05, 05] +F94E; [E0 47 B6, 05, 05] +FA47; [E0 47 DC, 05, 05] +F992; [E0 47 DE, 05, 05] +D87E DD0F; [E0 48 7A, 05, 05] +D87E DD12; [E0 49 30, 05, 05] +F922; [E0 49 7A, 05, 05] +F984; [E0 49 A0, 05, 05] +D87E DD15; [E0 49 DA, 05, 05] +D87E DD14; [E0 49 E0, 05, 05] +D87E DD13; [E0 4A 1C, 05, 05] +D87E DD17; [E0 4A 3E, 05, 05] +2F55; [E0 4A 80, 05, 09] +328B; [E0 4A 80, 05, 0D] +2EA3; [E0 4A 82, 05, 09] +D87E DC35; [E0 4A 8A, 05, 05] +D87E DD19; [E0 4A 98, 05, 05] +D87E DD18; [E0 4A A4, 05, 05] +F9FB; [E0 4A DC, 05, 05] +D87E DD1A; [E0 4B 0A, 05, 05] +F99F; [E0 4B 40, 05, 05] +F916; [E0 4B 62, 05, 05] +D87E DD1C; [E0 4C 40, 05, 05] +F993; [E0 4C 48, 05, 05] +FA48; [E0 4C 92, 05, 05] +D87E DD1E; [E0 4C EE, 05, 05] +F9C0; [E0 4D 58, 05, 05] +F9EE; [E0 4D 5C, 05, 05] +F932; [E0 4D DC, 05, 05] +F91E; [E0 4D F2, 05, 05] +D87E DD20; [E0 4E 12, 05, 05] +2F56; [E0 4E 16, 05, 09] +FA49; [E0 4E 18, 05, 05] +2EA4; [E0 4E 18, 05, 09] +2EA5; [E0 4E 18, 05, 09][, E0 8D, 3D] +D87E DD21; [E0 4E 2C, 05, 05] +2F57; [E0 4E 2E, 05, 09] +2F58; [E0 4E 38, 05, 09] +2F59; [E0 4E 40, 05, 09] +2F5A; [E0 4E 50, 05, 09] +D87E DD22; [E0 4E 62, 05, 05] +2F5B; [E0 4E 74, 05, 09] +2F5C; [E0 4E 78, 05, 09] +2EA7; [E0 4E 78, 05, 09][, E0 8D, 3D] +F946; [E0 4E 86, 05, 05] +3295; [E0 4E B4, 05, 0D] +D87E DD24; [E0 4E C2, 05, 05] +D87E DD25; [E0 4E EC, 05, 05] +2F5D; [E0 4F 20, 05, 09] +2EA8; [E0 4F 22, 05, 09] +F9FA; [E0 4F 48, 05, 05] +F92B; [E0 4F C0, 05, 05] +FA16; [E0 50 22, 05, 05] +F9A7; [E0 50 B8, 05, 05] +D87E DD28; [E0 50 C2, 05, 05] +2F5E; [E0 50 D6, 05, 09] +F961; [E0 50 DC, 05, 05] +F9DB; [E0 50 DC, 05, 05] +2F5F; [E0 50 E0, 05, 09] +D87E DD29; [E0 50 E4, 05, 05] +2EA9; [E0 50 E4, 05, 09][, E0 8D, 3D] +D87E DD2B; [E0 51 1E, 05, 05] +F9AD; [E0 51 38, 05, 05] +F917; [E0 51 90, 05, 05] +F9E4; [E0 51 E0, 05, 05] +F9CC; [E0 51 E6, 05, 05] +FA4A; [E0 52 1E, 05, 05] +D87E DD2E; [E0 52 68, 05, 05] +D87E DD2F; [E0 52 92, 05, 05] +F9AE; [E0 52 AC, 05, 05] +D87E DD30; [E0 52 BC, 05, 05] +D87E DD31; [E0 52 E4, 05, 05] +F994; [E0 52 EC, 05, 05] +F9EF; [E0 53 10, 05, 05] +D87E DD32; [E0 53 74, 05, 05] +2F60; [E0 53 98, 05, 09] +2F61; [E0 53 AC, 05, 09] +2F62; [E0 54 16, 05, 09] +2F63; [E0 54 24, 05, 09] +D87E DD34; [E0 54 2E, 05, 05] +2F64; [E0 54 36, 05, 09] +2F65; [E0 54 46, 05, 09] +3199; [E0 54 4A, 05, 27] +329A; [E0 54 54, 05, 0D] +D87E DD36; [E0 54 62, 05, 05] +F9CD; [E0 54 98, 05, 05] +F976; [E0 54 B0, 05, 05] +D87E DD38; [E0 54 C6, 05, 05] +F962; [E0 54 C6, 05, 05] +2F66; [E0 54 FC, 05, 09] +2EAA; [E0 54 FC, 05, 09][, E0 8D, 3D] +2F67; [E0 55 10, 05, 09] +F9E5; [E0 55 B0, 05, 05] +D87E DD3A; [E0 56 12, 05, 05] +F9C1; [E0 56 76, 05, 05] +F90E; [E0 56 C4, 05, 05] +2F68; [E0 56 DE, 05, 09] +2F69; [E0 56 EC, 05, 09] +2F6A; [E0 57 54, 05, 09] +2F6B; [E0 57 76, 05, 09] +FA17; [E0 57 8C, 05, 05] +32AC; [E0 57 BE, 05, 0D] +F933; [E0 57 C6, 05, 05] +2F6C; [E0 57 D4, 05, 09] +2EAB; [E0 57 D4, 05, 09][, E0 8D, 3D] +D87E DD40; [E0 57 E0, 05, 05] +F96D; [E0 57 FA, 05, 05] +D87E DD45; [E0 58 3A, 05, 05] +D87E DD46; [E0 58 3C, 05, 05] +D87E DD47; [E0 58 3C, 05, 05] +D87E DD48; [E0 58 92, 05, 05] +D87E DD4A; [E0 59 1A, 05, 05] +2F6D; [E0 59 BA, 05, 09] +2F6E; [E0 59 C8, 05, 09] +2F6F; [E0 59 EA, 05, 09] +D87E DD4E; [E0 5A A6, 05, 05] +F9CE; [E0 5A E0, 05, 05] +D87E DD4F; [E0 5B 28, 05, 05] +F93B; [E0 5B 28, 05, 05] +FA4B; [E0 5B 32, 05, 05] +F947; [E0 5B A4, 05, 05] +D87E DD50; [E0 5B A8, 05, 05] +F964; [E0 5C 0C, 05, 05] +F985; [E0 5C 6A, 05, 05] +2F70; [E0 5C 8A, 05, 09] +2EAC; [E0 5C 8A, 05, 09][, E0 8D, 3D] +2EAD; [E0 5C 8C, 05, 09] +FA18; [E0 5C 8E, 05, 05] +FA4C; [E0 5C 92, 05, 05] +3293; [E0 5C 92, 05, 0D] +FA4E; [E0 5C A6, 05, 05] +FA4D; [E0 5C A8, 05, 05] +FA4F; [E0 5C B6, 05, 05] +D87E DD53; [E0 5C C2, 05, 05] +FA50; [E0 5C C2, 05, 05] +FA51; [E0 5C D0, 05, 05] +3297; [E0 5C D0, 05, 0D] +FA19; [E0 5C D2, 05, 05] +FA1A; [E0 5C E0, 05, 05] +F93C; [E0 5D 1A, 05, 05] +FA52; [E0 5D 36, 05, 05] +FA53; [E0 5D 38, 05, 05] +D87E DD56; [E0 5D 3A, 05, 05] +FA1B; [E0 5D 3A, 05, 05] +F9B6; [E0 5D 78, 05, 05] +2F71; [E0 5D 8C, 05, 09] +2F72; [E0 5D 98, 05, 09] +F995; [E0 5D B0, 05, 05] +3299; [E0 5D CC, 05, 0D] +D87E DD57; [E0 5D F2, 05, 05] +F956; [E0 5E 5A, 05, 05] +D87E DD59; [E0 5E A2, 05, 05] +FA54; [E0 5E A2, 05, 05] +D87E DD5A; [E0 5E B6, 05, 05] +D87E DD5B; [E0 5E C0, 05, 05] +2F73; [E0 5F 10, 05, 09] +FA55; [E0 5F 2A, 05, 05] +F9F7; [E0 5F BE, 05, 05] +2F74; [E0 5F BE, 05, 09] +D87E DD5F; [E0 60 0A, 05, 05] +2F75; [E0 60 20, 05, 09] +2EAE; [E0 60 20, 05, 09][, E0 8D, 3D] +F9F8; [E0 60 6E, 05, 05] +FA56; [E0 61 B4, 05, 05] +D87E DD62; [E0 61 C0, 05, 05] +D87E DD63; [E0 61 C6, 05, 05] +F9A6; [E0 62 B6, 05, 05] +F944; [E0 62 FA, 05, 05] +2F76; [E0 63 26, 05, 09] +F9F9; [E0 63 64, 05, 05] +FA1D; [E0 63 BC, 05, 05] +D87E DD66; [E0 63 E4, 05, 05] +FA03; [E0 63 EC, 05, 05] +D87E DD69; [E0 64 0C, 05, 05] +F97B; [E0 64 14, 05, 05] +D87E DD68; [E0 64 16, 05, 05] +2F77; [E0 64 36, 05, 09] +2EAF; [E0 64 38, 05, 09] +D87E DD6A; [E0 64 46, 05, 05] +F9CF; [E0 64 66, 05, 05] +F96A; [E0 64 8A, 05, 05] +F94F; [E0 64 A4, 05, 05] +D87E DD6C; [E0 65 12, 05, 05] +F93D; [E0 65 8C, 05, 05] +F957; [E0 65 C8, 05, 05] +D87E DD6E; [E0 65 DA, 05, 05] +F996; [E0 66 3A, 05, 05] +FA57; [E0 66 3A, 05, 05] +D87E DD6F; [E0 66 56, 05, 05] +FA58; [E0 66 64, 05, 05] +F950; [E0 66 C0, 05, 05] +FA59; [E0 66 D4, 05, 05] +D87E DD70; [E0 66 DC, 05, 05] +2EB0; [E0 67 96, 05, 09] +2F78; [E0 68 CA, 05, 09] +2F79; [E0 69 06, 05, 09] +2EB2; [E0 69 08, 05, 09] +2EB5; [E0 69 08, 05, 09][, E0 8D, 3D] +2EB1; [E0 69 0A, 05, 09] +2EB3; [E0 69 0A, 05, 09][, E0 8D, 3D] +2EB4; [E0 69 0A, 05, 09][, E0 9D, 3D] +FA5A; [E0 69 48, 05, 05] +F9E6; [E0 69 56, 05, 05] +D87E DD76; [E0 69 58, 05, 05] +F90F; [E0 69 6E, 05, 05] +2F7A; [E0 69 78, 05, 09] +2EB6; [E0 69 78, 05, 09][, E0 8D, 3D] +2EB7; [E0 69 78, 05, 09][, E0 9D, 3D] +2EB8; [E0 69 7A, 05, 09] +D87E DD78; [E0 69 8E, 05, 05] +F9AF; [E0 69 98, 05, 05] +FA1E; [E0 69 DE, 05, 05] +2F7B; [E0 69 DE, 05, 09] +D87E DD79; [E0 6A 5E, 05, 05] + +F934; [E0 6A 6C, 05, 05] +2F7C; [E0 6A 6C, 05, 09] +2EB9; [E0 6A 6E, 05, 09] +D87E DD7A; [E0 6A 74, 05, 05] +FA5B; [E0 6A 74, 05, 05] +2F7D; [E0 6A 82, 05, 09] +2F7E; [E0 6A 8E, 05, 09] +2F7F; [E0 6A D0, 05, 09] +F9B0; [E0 6A F6, 05, 05] +D87E DD7D; [E0 6B 30, 05, 05] +F997; [E0 6B 4E, 05, 05] +D87E DD7F; [E0 6B 50, 05, 05] +F945; [E0 6B 6C, 05, 05] +2F80; [E0 6B 6E, 05, 09] +2EBB; [E0 6B 6E, 05, 09][, E0 8D, 3D] +2EBA; [E0 6B 70, 05, 09] +2F81; [E0 6B 82, 05, 09] +2EBC; [E0 6B 82, 05, 09][, E0 8D, 3D] +F953; [E0 6B 86, 05, 05] +D87E DCD6; [E0 6B CA, 05, 05] +D87E DD82; [E0 6B D4, 05, 05] +D87E DD83; [E0 6C 7C, 05, 05] +D87E DD85; [E0 6C F2, 05, 05] +F926; [E0 6E 32, 05, 05] +2F82; [E0 6E 48, 05, 09] +F9F6; [E0 6E 52, 05, 05] +2F83; [E0 6E 56, 05, 09] +FA5C; [E0 6E 5C, 05, 05] +2F84; [E0 6E 68, 05, 09] +2F85; [E0 6E 7A, 05, 09] +2EBD; [E0 6E 7A, 05, 09][, E0 8D, 3D] +D87E DC93; [E0 6E 84, 05, 05] +D87E DD8B; [E0 6E 84, 05, 05] +D87E DD8C; [E0 6E 8A, 05, 05] +2F86; [E0 6E 9A, 05, 09] +2F87; [E0 6E B8, 05, 09] +2F88; [E0 6E C0, 05, 09] +2F89; [E0 6F 64, 05, 09] +F97C; [E0 6F 66, 05, 05] +2F8A; [E0 6F 6C, 05, 09] +2F8B; [E0 6F 78, 05, 09] +FA5D; [E0 6F 7A, 05, 05] +FA5E; [E0 6F 7A, 05, 05] +2EBE; [E0 6F 7A, 05, 09] +2EBF; [E0 6F 7A, 05, 09][, E0 8D, 3D] +2EC0; [E0 6F 7A, 05, 09][, E0 9D, 3D] +D87E DD90; [E0 6F 9E, 05, 05] +D87E DD8F; [E0 6F AA, 05, 05] +D87E DD91; [E0 6F C2, 05, 05] +D87E DD93; [E0 6F EA, 05, 05] +D87E DD94; [E0 6F EE, 05, 05] +D87E DD95; [E0 70 08, 05, 05] +D87E DD98; [E0 70 58, 05, 05] +F974; [E0 70 58, 05, 05] +D87E DD96; [E0 70 5A, 05, 05] +D87E DD99; [E0 70 C8, 05, 05] +D87E DD9C; [E0 70 D4, 05, 05] +F9FE; [E0 70 FA, 05, 05] +D87E DDA0; [E0 71 3A, 05, 05] +D87E DD9A; [E0 71 5A, 05, 05] +D87E DD9B; [E0 71 EE, 05, 05] +D87E DD9D; [E0 72 14, 05, 05] +F93E; [E0 72 2C, 05, 05] +D87E DDA1; [E0 72 2E, 05, 05] +D87E DDA2; [E0 72 32, 05, 05] +D87E DDA3; [E0 72 52, 05, 05] +D87E DD9E; [E0 72 68, 05, 05] +F958; [E0 72 7C, 05, 05] +F918; [E0 73 1A, 05, 05] +F96E; [E0 73 32, 05, 05] +D87E DD9F; [E0 73 4E, 05, 05] +FA5F; [E0 73 4E, 05, 05] +F999; [E0 74 82, 05, 05] +D87E DDA8; [E0 74 88, 05, 05] +D87E DDA9; [E0 74 8C, 05, 05] +F9C2; [E0 74 9E, 05, 05] +D87E DDAA; [E0 74 D2, 05, 05] +D87E DDAC; [E0 75 74, 05, 05] +F923; [E0 76 4C, 05, 05] +F9F0; [E0 76 A6, 05, 05] +F935; [E0 76 BE, 05, 05] +FA20; [E0 76 D6, 05, 05] +F91F; [E0 77 12, 05, 05] +F910; [E0 77 36, 05, 05] +2F8C; [E0 77 52, 05, 09] +2EC1; [E0 77 54, 05, 09] +D87E DDB3; [E0 77 58, 05, 05] +D87E DDB4; [E0 77 70, 05, 05] +F936; [E0 77 70, 05, 05] +D87E DDB5; [E0 77 86, 05, 05] +D87E DDB6; [E0 77 8A, 05, 05] +2F8D; [E0 77 8E, 05, 09] +D87E DDB8; [E0 77 C8, 05, 05] +D87E DDB7; [E0 78 10, 05, 05] +D87E DDBA; [E0 78 82, 05, 05] +D87E DDB9; [E0 78 DA, 05, 05] +D87E DDBC; [E0 79 14, 05, 05] +D87E DDBD; [E0 79 9A, 05, 05] +D87E DDBB; [E0 79 B6, 05, 05] +D87E DDBE; [E0 79 D0, 05, 05] +F911; [E0 7A 3E, 05, 05] +D87E DDC0; [E0 7A 8C, 05, 05] +D87E DDC1; [E0 7A CC, 05, 05] +F927; [E0 7B 0E, 05, 05] +2F8E; [E0 7B 50, 05, 09] +FA08; [E0 7B 68, 05, 05] +2F8F; [E0 7B 68, 05, 09] +D87E DDC3; [E0 7B 90, 05, 05] +D87E DDC4; [E0 7B 96, 05, 05] +2F90; [E0 7B 96, 05, 09] +2EC2; [E0 7B 98, 05, 09] +F9A0; [E0 7C 5A, 05, 05] +F9E7; [E0 7C 74, 05, 05] +D87E DDC6; [E0 7C 84, 05, 05] +D87E DDC7; [E0 7C 92, 05, 05] +F9E8; [E0 7C 98, 05, 05] +F912; [E0 7C C6, 05, 05] +D87E DDC9; [E0 7C CA, 05, 05] +FA60; [E0 7C F6, 05, 05] +F924; [E0 7D A4, 05, 05] +2F91; [E0 7D D8, 05, 09] +2EC4; [E0 7D DA, 05, 09] +2EC3; [E0 7D DC, 05, 09] +FA0A; [E0 7D F2, 05, 05] +2F92; [E0 7D F2, 05, 09] +FA61; [E0 7E 0E, 05, 05] +2EC5; [E0 7E 64, 05, 09] +2EC6; [E0 7E 86, 05, 09] +2F93; [E0 7E 86, 05, 09] +2EC7; [E0 7E 86, 05, 09][, E0 8D, 3D] +2F94; [E0 7E E2, 05, 09] +D87E DDCF; [E0 80 2E, 05, 05] +F96F; [E0 80 42, 05, 05] +F9A1; [E0 80 42, 05, 05] +F97D; [E0 80 92, 05, 05] +F941; [E0 80 9A, 05, 05] +D87E DDD0; [E0 80 C8, 05, 05] +FA22; [E0 80 DE, 05, 05] +F95D; [E0 80 EA, 05, 05] +FA62; [E0 80 F0, 05, 05] +FA63; [E0 81 66, 05, 05] +F9FC; [E0 81 A4, 05, 05] +F95A; [E0 81 F4, 05, 05] +D87E DDD1; [E0 82 0E, 05, 05] +2EC8; [E0 82 3A, 05, 09] +2F95; [E0 83 6E, 05, 09] +2F96; [E0 83 8C, 05, 09] +F900; [E0 83 90, 05, 05] +D87E DDD2; [E0 83 AA, 05, 05] +2F97; [E0 83 AA, 05, 09] +2F98; [E0 83 F0, 05, 09] +2F99; [E0 84 40, 05, 09] +3296; [E0 84 48, 05, 0D] +D87E DDD4; [E0 84 5C, 05, 05] +D87E DDD5; [E0 84 88, 05, 05] +F948; [E0 84 8A, 05, 05] +32AE; [E0 84 94, 05, 0D] +F903; [E0 84 96, 05, 05] +FA64; [E0 84 AC, 05, 05] +FA65; [E0 85 1C, 05, 05] +D87E DDD6; [E0 85 42, 05, 05] +2EC9; [E0 85 46, 05, 09] +2F9A; [E0 85 D4, 05, 09] +2F9B; [E0 85 EC, 05, 09] +D87E DDD7; [E0 85 FA, 05, 05] +2F9C; [E0 86 78, 05, 09] +2ECA; [E0 86 78, 05, 09][, E0 8D, 3D] +D87E DDDB; [E0 86 8A, 05, 05] +D87E DDDA; [E0 86 A8, 05, 05] +F937; [E0 86 F0, 05, 05] +D87E DDDC; [E0 86 F2, 05, 05] +2F9D; [E0 88 74, 05, 09] +F902; [E0 88 B2, 05, 05] +2F9E; [E0 88 B2, 05, 09] +D87E DDDE; [E0 88 C6, 05, 05] +F998; [E0 89 70, 05, 05] +F9D7; [E0 89 78, 05, 05] +D87E DDDF; [E0 89 94, 05, 05] +FA07; [E0 89 9A, 05, 05] +F98D; [E0 89 E8, 05, 05] +2ECB; [E0 89 F0, 05, 09] +2F9F; [E0 8A 60, 05, 09] +D87E DD8D; [E0 8A 66, 05, 05] +F971; [E0 8A 8A, 05, 05] +2FA0; [E0 8A 8A, 05, 09] +2FA1; [E0 8A 94, 05, 09] +FA66; [E0 8A 96, 05, 05] +2ECC; [E0 8A 96, 05, 09] +2ECD; [E0 8A 96, 05, 09][, E0 8D, 3D] +2ECE; [E0 8A 96, 05, 09][, E0 9D, 3D] +F99A; [E0 8B 76, 05, 05] +FA25; [E0 8B A0, 05, 05] +FA67; [E0 8B A0, 05, 05] +329C; [E0 8C 08, 05, 0D] +F9C3; [E0 8C 2E, 05, 05] +F913; [E0 8C 54, 05, 05] +2FA2; [E0 8C 58, 05, 09] +2ECF; [E0 8C 58, 05, 09][, E0 8D, 3D] +D87E DDE2; [E0 8C 5E, 05, 05] +F92C; [E0 8C D2, 05, 05] +D87E DDE3; [E0 8D 1E, 05, 05] +FA26; [E0 8D 36, 05, 05] +D87E DDE4; [E0 8D 5E, 05, 05] +D87E DDE6; [E0 8D 72, 05, 05] +2FA3; [E0 8D CE, 05, 09] +F919; [E0 8E 16, 05, 05] +F9B7; [E0 8E AA, 05, 05] +2FA4; [E0 8E CE, 05, 09] +F9E9; [E0 8E DA, 05, 05] +2FA5; [E0 8E DA, 05, 09] +F97E; [E0 8E E0, 05, 05] +F90A; [E0 8E E4, 05, 05] +2FA6; [E0 8E E4, 05, 09] +328E; [E0 8E E4, 05, 0D] +F9B1; [E0 8F B0, 05, 05] +D87E DDE7; [E0 8F B8, 05, 05] +D87E DDEA; [E0 90 46, 05, 05] +D87E DDE8; [E0 90 FC, 05, 05] +D87E DDE9; [E0 91 04, 05, 05] +F93F; [E0 91 5C, 05, 05] +F99B; [E0 91 E8, 05, 05] +D87E DDEB; [E0 93 52, 05, 05] +D87E DDEC; [E0 93 8A, 05, 05] +2ED0; [E0 94 70, 05, 09] +2ED1; [E0 96 60, 05, 09] +2FA7; [E0 96 60, 05, 09] +2ED2; [E0 96 62, 05, 09] +2ED3; [E0 96 70, 05, 09] +2FA8; [E0 96 72, 05, 09] +D87E DDEE; [E0 96 88, 05, 05] +F986; [E0 96 CC, 05, 05] +D87E DDF0; [E0 96 E0, 05, 05] +2ED4; [E0 97 48, 05, 09] +2FA9; [E0 97 B0, 05, 09] +2ED5; [E0 97 B0, 05, 09][, E0 8D, 3D] +2ED6; [E0 97 B2, 05, 09] +F9C6; [E0 97 D4, 05, 05] +F951; [E0 98 14, 05, 05] +FA09; [E0 98 18, 05, 05] +F959; [E0 98 68, 05, 05] +F9D3; [E0 98 6E, 05, 05] +F9DC; [E0 98 8A, 05, 05] +F9F1; [E0 98 C4, 05, 05] +2FAA; [E0 98 EA, 05, 09] +F9B8; [E0 98 EE, 05, 05] +2FAB; [E0 98 F0, 05, 09] +D87E DDF3; [E0 99 0A, 05, 05] +F9EA; [E0 99 48, 05, 05] +FA68; [E0 99 4A, 05, 05] +2FAC; [E0 99 54, 05, 09] +2ED7; [E0 99 54, 05, 09][, E0 8D, 3D] +F9B2; [E0 99 70, 05, 05] +F949; [E0 99 72, 05, 05] +D87E DDF5; [E0 99 CA, 05, 05] +F938; [E0 99 E8, 05, 05] +F9B3; [E0 9A 1A, 05, 05] +2FAD; [E0 9A 2C, 05, 09] +2ED8; [E0 9A 2E, 05, 09] +FA1C; [E0 9A 36, 05, 05] +2FAE; [E0 9A 46, 05, 09] +2FAF; [E0 9A 4E, 05, 09] +2FB0; [E0 9A 5C, 05, 09] +2FB1; [E0 9B 26, 05, 09] +D87E DDFA; [E0 9B 50, 05, 05] +2ED9; [E0 9B 5C, 05, 09] +2FB2; [E0 9B 6A, 05, 09] +2FB3; [E0 9B 76, 05, 09] +FA69; [E0 9B 8E, 05, 05] +2FB4; [E0 9B 92, 05, 09] +32A0; [E0 9B 9A, 05, 0D] +D87E DDFE; [E0 9B A6, 05, 05] +D87E DDFF; [E0 9B A6, 05, 05] +F9B4; [E0 9B C0, 05, 05] +D87E DE00; [E0 9B E2, 05, 05] +FA6A; [E0 9C 0C, 05, 05] +F9D0; [E0 9C 52, 05, 05] +2EDA; [E0 9C 80, 05, 09] +2FB5; [E0 9C E6, 05, 09] +2EDB; [E0 9D 38, 05, 09] +2FB6; [E0 9D 52, 05, 09] +2EDC; [E0 9D 58, 05, 09] +2EDD; [E0 9D 5A, 05, 09] +2FB7; [E0 9D 5A, 05, 09] +2EDF; [E0 9D 5C, 05, 09] +2EDE; [E0 9D 5C, 05, 09][, E0 8D, 3D] +D87E DE02; [E0 9D 60, 05, 05] +FA2A; [E0 9D 7A, 05, 05] +FA2B; [E0 9D 94, 05, 05] +FA2C; [E0 9D EC, 05, 05] +D87E DE04; [E0 9D EE, 05, 05] +2EE0; [E0 9E 68, 05, 09] +2FB8; [E0 9E CE, 05, 09] +2EE1; [E0 9E CE, 05, 09][, E0 8D, 3D] +2FB9; [E0 9E D4, 05, 09] +D87E DE05; [E0 9E F0, 05, 05] +2FBA; [E0 9E FA, 05, 09] +D87E DE06; [E0 9F 2C, 05, 05] +F91A; [E0 9F 8A, 05, 05] +D87E DE07; [E0 9F A4, 05, 05] +F987; [E0 A0 82, 05, 05] +2EE2; [E0 A0 86, 05, 09] +2FBB; [E0 A1 04, 05, 09] +2EE3; [E0 A1 04, 05, 09][, E0 8D, 3D] +2FBC; [E0 A1 64, 05, 09] +2FBD; [E0 A1 72, 05, 09] +D87E DE0A; [E0 A1 D8, 05, 05] +2FBE; [E0 A2 04, 05, 09] +2FBF; [E0 A2 18, 05, 09] +2FC0; [E0 A2 1E, 05, 09] +2FC1; [E0 A2 32, 05, 09] +2EE4; [E0 A2 32, 05, 09][, E0 8D, 3D] +2FC2; [E0 A2 6E, 05, 09] +F939; [E0 A2 98, 05, 05] +D87E DE0B; [E0 A4 46, 05, 05] +F9F2; [E0 A4 74, 05, 05] +2EE5; [E0 A4 BE, 05, 09] +2FC3; [E0 A5 96, 05, 09] +D87E DE0C; [E0 A5 C6, 05, 05] +D87E DE0F; [E0 A6 A0, 05, 05] +FA2D; [E0 A7 40, 05, 05] +F93A; [E0 A7 CC, 05, 05] +F920; [E0 A8 1A, 05, 05] +2EE6; [E0 A8 1C, 05, 09] +2FC4; [E0 A8 C8, 05, 09] +2EE7; [E0 A8 C8, 05, 09][, E0 8D, 3D] +F940; [E0 A8 DC, 05, 05] +2FC5; [E0 A8 DC, 05, 09] +F988; [E0 A9 12, 05, 05] +F9F3; [E0 A9 22, 05, 05] +2FC6; [E0 A9 2E, 05, 09] +2EE8; [E0 A9 30, 05, 09] +D87E DE15; [E0 A9 5A, 05, 05] +2FC7; [E0 A9 5A, 05, 09] +2FC8; [E0 A9 6A, 05, 09] +2EE9; [E0 A9 6C, 05, 09] +2FC9; [E0 A9 7E, 05, 09] +F989; [E0 A9 80, 05, 05] +2FCA; [E0 A9 86, 05, 09] +D87E DE17; [E0 A9 D6, 05, 05] +2FCB; [E0 A9 D6, 05, 09] +2FCC; [E0 A9 DE, 05, 09] +D87E DE18; [E0 A9 E0, 05, 05] +2EEA; [E0 A9 E0, 05, 09] +D87E DE19; [E0 A9 EE, 05, 05] +2FCD; [E0 AA 06, 05, 09] +D87E DE1A; [E0 AA 08, 05, 05] +2FCE; [E0 AA 10, 05, 09] +D87E DE1B; [E0 AA 16, 05, 05] +2FCF; [E0 AA 2A, 05, 09] +D87E DE1C; [E0 AA 60, 05, 05] +2FD0; [E0 AA 60, 05, 09] +2FD1; [E0 AA 7E, 05, 09] +2EEB; [E0 AA 7E, 05, 09][, E0 8D, 3D] +2EEC; [E0 AA 8A, 05, 09] +2FD2; [E0 AA 8E, 05, 09] +2EED; [E0 AA 8E, 05, 09][, E0 8D, 3D] +2EEE; [E0 AA E8, 05, 09] +F9C4; [E0 AB 0A, 05, 05] +2FD3; [E0 AB 0A, 05, 09] +2EEF; [E0 AB 0A, 05, 09][, E0 8D, 3D] +2EF0; [E0 AB 22, 05, 09] +F907; [E0 AB 28, 05, 05] +F908; [E0 AB 28, 05, 05] +2FD4; [E0 AB 28, 05, 09] +2EF1; [E0 AB 28, 05, 09][, E0 8D, 3D] +2EF2; [E0 AB 28, 05, 09][, E0 9D, 3D] +2EF3; [E0 AB 2E, 05, 09] +2FD5; [E0 AB 30, 05, 09] +FA0E; [E0 AB F0, 05, 05] +FA0F; [E0 AB F2, 05, 05] +FA11; [E0 AB F6, 05, 05] +FA13; [E0 AB FA, 05, 05] +FA14; [E0 AB FC, 05, 05] +FA1F; [E0 AC 18, 05, 05] +FA21; [E0 AC 1C, 05, 05] +FA23; [E0 AC 20, 05, 05] +FA24; [E0 AC 22, 05, 05] +FA27; [E0 AC 28, 05, 05] +FA28; [E0 AC 2A, 05, 05] +FA29; [E0 AC 2C, 05, 05] + +D87E DC0C; [E0 AD 7C, 05, 05] +D87E DC13; [E0 AD B2, 05, 05] +D87E DDCA; [E0 AD B6, 05, 05] +D87E DC1F; [E0 AE 04, 05, 05] +D87E DC24; [E0 AE 70, 05, 05] +D87E DC67; [E0 B2 3A, 05, 05] +D87E DC68; [E0 B2 56, 05, 05] +D87E DC76; [E0 B3 66, 05, 05] +D87E DC83; [E0 B4 C8, 05, 05] +D87E DC88; [E0 B5 34, 05, 05] +D87E DC8A; [E0 B5 68, 05, 05] +D87E DC96; [E0 B6 04, 05, 05] +D87E DC9B; [E0 B6 3C, 05, 05] +D87E DCA2; [E0 B6 AE, 05, 05] +D87E DCA1; [E0 B6 EA, 05, 05] +D87E DCC2; [E0 B8 DE, 05, 05] +D87E DCC7; [E0 B9 60, 05, 05] +D87E DCD1; [E0 BA 56, 05, 05] +D87E DCD0; [E0 BA 9E, 05, 05] +D87E DCCE; [E0 BA C0, 05, 05] +D87E DCDE; [E0 BB 26, 05, 05] +D87E DCE7; [E0 BB CE, 05, 05] +D87E DCEE; [E0 BC CA, 05, 05] +D87E DCF2; [E0 BD 3C, 05, 05] +D87E DD0A; [E0 BF 12, 05, 05] +D87E DD16; [E0 BF D8, 05, 05] +D87E DD2A; [E0 C2 16, 05, 05] +D87E DD2C; [E0 C2 2E, 05, 05] +D87E DD2D; [E0 C2 2E, 05, 05] +D87E DD33; [E0 C2 F4, 05, 05] +D87E DD3E; [E0 C4 C2, 05, 05] +D87E DD3F; [E0 C4 DA, 05, 05] +D87E DD49; [E0 C5 42, 05, 05] +D87E DD4B; [E0 C5 5C, 05, 05] +D87E DD4C; [E0 C5 FC, 05, 05] +D87E DD51; [E0 C6 9C, 05, 05] +D87E DD58; [E0 C7 3A, 05, 05] +D87E DD60; [E0 C8 E6, 05, 05] +D87E DD64; [E0 C9 36, 05, 05] +D87E DD67; [E0 CA 2E, 05, 05] +D87E DD6D; [E0 CA F0, 05, 05] +D87E DD71; [E0 CB 5C, 05, 05] +D87E DD74; [E0 CB A6, 05, 05] +D87E DD81; [E0 CC A4, 05, 05] +D87E DCD7; [E0 CC AC, 05, 05] +D87E DD84; [E0 CD 16, 05, 05] +D87E DD8E; [E0 CD D6, 05, 05] +D87E DDA7; [E0 CF 62, 05, 05] +D87E DDAE; [E0 CF C6, 05, 05] +D87E DDAF; [E0 CF CE, 05, 05] +D87E DDB2; [E0 CF E2, 05, 05] +D87E DDBF; [E0 D0 C0, 05, 05] +D87E DDC2; [E0 D1 0A, 05, 05] +D87E DDC8; [E0 D1 82, 05, 05] +D87E DDCD; [E0 D2 9A, 05, 05] +D87E DDCE; [E0 D2 AC, 05, 05] +D87E DDEF; [E0 D8 6C, 05, 05] +D87E DDF2; [E0 D9 14, 05, 05] +D87E DDF8; [E0 DA 2A, 05, 05] +D87E DDF9; [E0 DA 3A, 05, 05] +D87E DDFC; [E0 DA B2, 05, 05] +D87E DE03; [E0 DB BA, 05, 05] +D87E DE08; [E0 DC F6, 05, 05] +D87E DE0D; [E0 DF 08, 05, 05] +D87E DE0E; [E0 DF 46, 05, 05] +D87E DE11; [E0 DF 5C, 05, 05] +D87E DE16; [E0 E0 1E, 05, 05] + +D87E DC03; [E1 30 45 C8, 05, 05] +D87E DC12; [E1 30 B6 E4, 05, 05] +D87E DD1B; [E1 30 B7 E4, 05, 05] +D87E DC16; [E1 30 BC 20, 05, 05] +D87E DC0D; [E1 30 D6 AC, 05, 05] +D87E DDD9; [E1 31 0E 90, 05, 05] +D87E DDDD; [E1 31 26 C8, 05, 05] +D87E DC34; [E1 31 4B E4, 05, 05] +D87E DC38; [E1 31 6E 74, 05, 05] +D87E DC59; [E1 32 81 C8, 05, 05] +D87E DC60; [E1 32 B4 04, 05, 05] +D87E DC61; [E1 32 BB 58, 05, 05] +D87E DC6C; [E1 33 11 E4, 05, 05] +D87E DC71; [E1 33 37 3C, 05, 05] +D87E DCF8; [E1 33 6E AC, 05, 05] +D87E DC7B; [E1 33 86 C8, 05, 05] +D87E DC7D; [E1 33 87 04, 05, 05] +D87E DC89; [E1 33 ED C8, 05, 05] +D87E DD39; [E1 33 F0 E4, 05, 05] +D87E DC91; [E1 34 22 90, 05, 05] +D87E DC92; [E1 34 22 90, 05, 05] +D87E DCA4; [E1 34 8A 04, 05, 05] +D87E DCB8; [E1 35 07 04, 05, 05] +D87E DCBE; [E1 35 20 74, 05, 05] +D87E DCCA; [E1 35 95 04, 05, 05] +D87E DC97; [E1 35 E1 3C, 05, 05] +D87E DD80; [E1 35 F3 C8, 05, 05] +D87E DD89; [E1 35 F9 90, 05, 05] +D87E DD8A; [E1 35 FA 90, 05, 05] +D87E DCDD; [E1 35 FE E4, 05, 05] +D87E DCE3; [E1 36 16 C8, 05, 05] +D87E DCEC; [E1 36 55 AC, 05, 05] +D87E DCF0; [E1 36 8F 04, 05, 05] +D87E DCF7; [E1 36 C5 04, 05, 05] +D87E DCF9; [E1 36 D1 20, 05, 05] +D87E DCFB; [E1 37 08 20, 05, 05] +D87E DD06; [E1 37 13 04, 05, 05] +D87E DD0D; [E1 37 43 58, 05, 05] +D87E DD10; [E1 37 53 04, 05, 05] +D87E DD11; [E1 37 58 58, 05, 05] +D87E DD1D; [E1 37 A8 E4, 05, 05] +D87E DD1F; [E1 37 CD 58, 05, 05] +D87E DD23; [E1 38 15 90, 05, 05] +D87E DD26; [E1 38 37 04, 05, 05] +D87E DD27; [E1 38 4F C8, 05, 05] +D87E DD35; [E1 38 C5 58, 05, 05] +D87E DD37; [E1 38 CF 90, 05, 05] +D87E DD3B; [E1 39 2B 90, 05, 05] +D87E DD3C; [E1 39 2E 20, 05, 05] +D87E DD3D; [E1 39 3D AC, 05, 05] +D87E DD42; [E1 39 51 04, 05, 05] +D87E DD41; [E1 39 51 20, 05, 05] +D87E DD43; [E1 39 55 58, 05, 05] +D87E DD44; [E1 39 58 3C, 05, 05] +D87E DD4D; [E1 39 AB 20, 05, 05] +D87E DD52; [E1 39 E5 04, 05, 05] +D87E DD54; [E1 39 F1 E4, 05, 05] +D87E DD55; [E1 39 F6 AC, 05, 05] +D87E DD5C; [E1 3A 48 E4, 05, 05] +D87E DD5D; [E1 3A 6A 20, 05, 05] +D87E DD5E; [E1 3A 6A 20, 05, 05] +D87E DD61; [E1 3A 87 04, 05, 05] +D87E DD65; [E1 3A 9E AC, 05, 05] +D87E DD6B; [E1 3A F4 AC, 05, 05] +D87E DC98; [E1 3B 3B E4, 05, 05] +D87E DD72; [E1 3B 44 90, 05, 05] +D87E DD73; [E1 3B 48 04, 05, 05] +D87E DD75; [E1 3B 58 3C, 05, 05] +D87E DD77; [E1 3B 63 74, 05, 05] +D87E DD7B; [E1 3B 91 3C, 05, 05] +D87E DD7C; [E1 3B 99 58, 05, 05] +D87E DD7E; [E1 3B A8 20, 05, 05] +D87E DD87; [E1 3B E0 E4, 05, 05] +D87E DD88; [E1 3B E2 74, 05, 05] +D87E DD97; [E1 3C 4B C8, 05, 05] +D87E DDA4; [E1 3C 67 90, 05, 05] +D87E DDA6; [E1 3C 79 3C, 05, 05] +D87E DDA5; [E1 3C 89 E4, 05, 05] +D87E DDAD; [E1 3C BB C8, 05, 05] +D87E DDB0; [E1 3C CA 90, 05, 05] +D87E DDB1; [E1 3C EA AC, 05, 05] +D87E DDAB; [E1 3D 44 20, 05, 05] +D87E DDC5; [E1 3D 8E 74, 05, 05] +D87E DDCB; [E1 3D CF 3C, 05, 05] +D87E DDCC; [E1 3D E3 AC, 05, 05] +D87E DDD3; [E1 3E 45 58, 05, 05] +D87E DDD8; [E1 3E 8D 3C, 05, 05] + +D87E DDE0; [E1 3F 4F 04, 05, 05] +D87E DDE1; [E1 3F 52 04, 05, 05] +D87E DDE5; [E1 3F 75 AC, 05, 05] +D87E DDED; [E1 3F FE 20, 05, 05] +D87E DDF1; [E1 40 2D 74, 05, 05] +D87E DDF6; [E1 40 99 AC, 05, 05] +D87E DC1C; [E1 40 AA C8, 05, 05] +D87E DDF7; [E1 40 B1 58, 05, 05] +D87E DDFB; [E1 40 E8 74, 05, 05] +D87E DDFD; [E1 40 F8 04, 05, 05] +D87E DE01; [E1 41 1D 04, 05, 05] +D87E DE09; [E1 41 B8 C8, 05, 05] +D87E DE10; [E1 42 5D 90, 05, 05] +D87E DE12; [E1 42 63 AC, 05, 05] +D87E DE13; [E1 42 81 20, 05, 05] +D87E DE14; [E1 42 8F AC, 05, 05] +D87E DC8F; [E1 42 AC 3C, 05, 05] +D87E DE1D; [E1 42 F1 58, 05, 05] # HOMELESS COLLATION ELEMENTS FDD0 0061; [, 97, 3D] -FDD0 0062; [, D4 3D, 31] -FDD0 0063; [, D4 CD, 31] -FDD0 0064; [, D4 CD, 33] -FDD0 0065; [, D4 ED, 2D] -FDD0 0066; [, D4 ED, 31] -FDD0 0067; [, D4 ED, 33] -FDD0 0068; [, DA 75, 3D] -FDD0 0069; [, DB F9, 37] -FDD0 006A; [, DB F9, 3D] -FDD0 006B; [, DC 0D, 37] -FDD0 006C; [, DC 0D, 3D] -FDD0 006D; [, DD 61, 09] -FDD0 006E; [, DD 61, 3D] -FDD0 006F; [, DF 79, 09] -FDD0 0070; [, DF 79, 2B] -FDD0 0071; [, DF 79, 3D] -FDD0 0072; [, DF 89, 09] -FDD0 0073; [, DF 99, 09] -FDD0 0074; [, E0 2D, 09] -FDD0 0075; [, E0 3D, 0D] -FDD0 0076; [, E0 4D, 0D] -FDD0 0077; [, E0 5D, 0D] -FDD0 0078; [, E0 6D, 05] -FDD0 0079; [, E0 7D, 05] -FDD0 007A; [, E0 8D, 05] -FDD0 007B; [, E0 9D, 05] -FDD0 007C; [, E0 AD, 05] -FDD0 007D; [, E0 BD, 05] -FDD0 007E; [, E0 CD, 05] -FDD0 007F; [, E0 DD, 05] -FDD0 0080; [, E0 ED, 05] -FDD0 0081; [, E0 FD, 05] -FDD0 0082; [, E1 11, 05] -FDD0 0083; [, E1 21, 05] -FDD0 0084; [, E1 31, 05] -FDD0 0085; [, E1 41, 05] -FDD0 0086; [, E1 51, 05] -FDD0 0087; [, E1 61, 05] -FDD0 0088; [, E1 71, 05] -FDD0 0089; [, E1 81, 05] -FDD0 008A; [, E1 91, 05] -FDD0 008B; [, E1 A1, 05] -FDD0 008C; [, E1 B1, 05] +FDD0 0062; [, D4 AD, 31] +FDD0 0063; [, D5 41, 31] +FDD0 0064; [, D5 41, 33] +FDD0 0065; [, D5 91, 2D] +FDD0 0066; [, D5 91, 31] +FDD0 0067; [, D5 91, 33] +FDD0 0068; [, DA 65, 3D] +FDD0 0069; [, DC 2D, 37] +FDD0 006A; [, DC 2D, 3D] +FDD0 006B; [, DC 3D, 37] +FDD0 006C; [, DC 3D, 3D] +FDD0 006D; [, E0 8D, 09] +FDD0 006E; [, E0 8D, 3D] +FDD0 006F; [, E0 9D, 09] +FDD0 0070; [, E0 9D, 2B] +FDD0 0071; [, E0 9D, 3D] +FDD0 0072; [, E0 AD, 09] +FDD0 0073; [, E0 BD, 09] +FDD0 0074; [, E0 CD, 09] +FDD0 0075; [, E0 DD, 05] +FDD0 0076; [, E0 ED, 05] +FDD0 0077; [, E0 FD, 05] +FDD0 0078; [, E1 11, 05] +FDD0 0079; [, E1 21, 05] +FDD0 007A; [, E1 31, 05] +FDD0 007B; [, E1 41, 05] +FDD0 007C; [, E1 51, 05] +FDD0 007D; [, E1 61, 05] +FDD0 007E; [, E1 71, 05] +FDD0 007F; [, E1 81, 05] +FDD0 0080; [, E1 91, 05] +FDD0 0081; [, E1 A1, 05] +FDD0 0082; [, E1 B1, 05] +FDD0 0083; [, E1 C1, 05] +FDD0 0084; [, E1 D1, 05] +FDD0 0085; [, E1 E1, 05] +FDD0 0086; [, E1 F1, 05] +FDD0 0087; [, E1 F1, 09] +FDD0 0088; [, E2 05, 05] +FDD0 0089; [, E2 15, 05] +FDD0 008A; [, E2 25, 05] +FDD0 008B; [, E2 35, 05] +FDD0 008C; [, E2 45, 05] +FDD0 008D; [, E2 55, 05] +FDD0 008E; [, E2 65, 05] +FDD0 008F; [,, 3F 03] # CONSTRUCTED FAKE SECONDARY-IGNORABLE +FDD0 0090; [24, 05, 05] # PLACE HOLDER FOR CODAN # VALUES BASED ON UCA -[first tertiary ignorable [,,]] -[last tertiary ignorable [,,]] -[first secondary ignorable [,, 05]] -[last secondary ignorable [,, 05]] -[first primary ignorable [, 87, 05]] -[last primary ignorable [, E1 B1, 05]] -[first variable [05 07, 05, 05]] -[last variable [17 9B, 05, 05]] -[first regular [1A 20, 05, 05]] -#[last regular [78 AA B2, 05, 05]] -[last regular [7B 41, 05, 8F]] -[first implicit [E0 03 03, 05, 05]] -[last implicit [E3 DC 70 C0, 05, 05]] -[first trailing [E5, 05, 05]] -[last trailing [E5, 05, 05]] +[first tertiary ignorable [,,]] # CONSTRUCTED +[last tertiary ignorable [,,]] # CONSTRUCTED +# Warning: Case bits are masked in the following +#[first tertiary in secondary non-ignorable [X, X, 05]] # U+0332 COMBINING LOW LINE +#[last tertiary in secondary non-ignorable [X, X, 3D]] # U+2A74 DOUBLE COLON EQUAL +[first secondary ignorable [,, 3F 03]] # CONSTRUCTED +[last secondary ignorable [,, 3F 03]] # CONSTRUCTED +#[first secondary in primary non-ignorable [X, 05, X]] # U+0009 +#[last secondary in primary non-ignorable [X, 05, X]] # U+0009 +[first primary ignorable [, 87, 05]] # U+0332 COMBINING LOW LINE +[last primary ignorable [, E2 65, 05]] # U+10320 OLD ITALIC NUMERAL ONE +[first variable [05 07, 05, 05]] # U+0009 +[last variable [20 2D, 05, 05]] # U+10133 AEGEAN NUMBER NINETY THOUSAND +[first regular [23 20, 05, 05]] # U+02D0 MODIFIER LETTER TRIANGULAR COLON +[last regular [97 35, 05, 05]] # U+1039D UGARITIC LETTER SSU +[first implicit [E0 04 06, 05, 05]] # CONSTRUCTED +[last implicit [E4 DF 7E 20, 05, 05]] # CONSTRUCTED +[first trailing [E5, 05, 05]] # CONSTRUCTED +[last trailing [E5, 05, 05]] # CONSTRUCTED # FIXED VALUES -# superceded! [top [78 AA B2, 05, 05]] +# superceded! [top [97 35, 05, 05]] [fixed first implicit byte E0] [fixed last implicit byte E4] [fixed first trail byte E5] diff --git a/icuSources/data/unidata/LineBreak.txt b/icuSources/data/unidata/LineBreak.txt index 9e20e665..c8c115b6 100644 --- a/icuSources/data/unidata/LineBreak.txt +++ b/icuSources/data/unidata/LineBreak.txt @@ -1,4 +1,4 @@ -# LineBreak-4.0.0.txt +# LineBreak-4.0.1.txt # # Line Break Properties # @@ -82,82 +82,12 @@ 00B6..00BA;AI 00BB;QU 00BC..00BF;AI -00C0..00C5;AL -00C6;AI -00C7..00CF;AL -00D0;AI -00D1..00D6;AL -00D7..00D8;AI -00D9..00DD;AL -00DE..00E1;AI -00E2..00E5;AL -00E6;AI -00E7;AL -00E8..00EA;AI -00EB;AL -00EC..00ED;AI -00EE..00EF;AL -00F0;AI -00F1;AL -00F2..00F3;AI -00F4..00F6;AL -00F7..00FA;AI -00FB;AL -00FC;AI -00FD;AL -00FE;AI -00FF..0100;AL -0101;AI -0102..0110;AL -0111;AI -0112;AL -0113;AI -0114..011A;AL -011B;AI -011C..0125;AL -0126..0127;AI -0128..012A;AL -012B;AI -012C..0130;AL -0131..0133;AI -0134..0137;AL -0138;AI -0139..013E;AL -013F..0142;AI -0143;AL -0144;AI -0145..0147;AL -0148..014A;AI -014B..014C;AL -014D;AI -014E..0151;AL -0152..0153;AI -0154..0165;AL -0166..0167;AI -0168..016A;AL -016B;AI -016C..01CD;AL -01CE;AI -01CF;AL -01D0;AI -01D1;AL -01D2;AI -01D3;AL -01D4;AI -01D5;AL -01D6;AI -01D7;AL -01D8;AI -01D9;AL -01DA;AI -01DB;AL -01DC;AI -01DD..0236;AL -0250;AL -0251;AI -0252..0260;AL -0261;AI -0262..02C6;AL +00C0..00D6;AL +00D7;AI +00D8..00F6;AL +00F7;AI +00F8..0236;AL +0250..02C6;AL 02C7;AI 02C8;BB 02C9..02CB;AI @@ -171,28 +101,17 @@ 02DD;AI 02DE..02FF;AL 0300..0357;CM -035D..036F;CM +035D..0362;GL +0363..036F;CM 0374..0375;AL 037A;AL -037E;AL +037E;IS 0384..038A;AL 038C;AL -038E..0390;AL -0391..03A1;AI -03A3..03A9;AI -03AA..03B0;AL -03B1..03C1;AI -03C2;AL -03C3..03C9;AI -03CA..03CE;AL +038E..03A1;AL +03A3..03CE;AL 03D0..03FB;AL -0400;AL -0401;AI -0402..040F;AL -0410..044F;AI -0450;AL -0451;AI -0452..0482;AL +0400..0482;AL 0483..0486;CM 0488..0489;CM 048A..04CE;AL @@ -226,7 +145,9 @@ 0640..064A;AL 064B..0658;CM 0660..0669;NU -066A..066F;AL +066A;AL +066B..066C;NU +066D..066F;AL 0670;CM 0671..06D5;AL 06D6..06DC;CM @@ -636,14 +557,10 @@ 2116;PR 2117..2120;AL 2121..2122;AI -2123..2125;AL -2126;PO -2127..212A;AL +2123..212A;AL 212B;AI 212C..213B;AL -213D..213F;AL -2140;AI -2141..214B;AL +213D..214B;AL 2153;AL 2154..2155;AI 2156..215A;AL @@ -729,11 +646,7 @@ 23B7..23D0;AL 2400..2426;AL 2440..244A;AL -2460..24BF;AI -24C0..24CF;AL -24D0..24E9;AI -24EA;AL -24EB..24FE;AI +2460..24FE;AI 24FF;AL 2500..254B;AI 254C..254F;AL @@ -819,7 +732,8 @@ 2773;CL 2774;OP 2775;CL -2776..2794;AL +2776..2793;AI +2794;AL 2798..27AF;AL 27B1..27BE;AL 27D0..27E5;AL @@ -963,7 +877,10 @@ AC00..D7A3;ID D800..DB7F;SG DB80..DBFF;SG DC00..DFFF;SG -E000..F8FF;XX +E000..F801;XX +F802..F86F;AL +F870..F87F;CM +F880..F8FF;AL F900..FA2D;ID FA30..FA6A;ID FB00..FB06;AL diff --git a/icuSources/data/unidata/PropList.txt b/icuSources/data/unidata/PropList.txt index 90176ad0..964c40ac 100644 --- a/icuSources/data/unidata/PropList.txt +++ b/icuSources/data/unidata/PropList.txt @@ -1,17 +1,16 @@ -# PropList-4.0.0.txt -# Date: 2003-03-20, 20:07:40 GMT [MD] +# PropList-4.0.1.txt +# Date: 2004-03-02, 02:42:40 GMT [MD] # -# Unicode Character Database: Extended Properties +# Unicode Character Database +# Copyright (c) 1991-2004 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html # For documentation, see UCD.html -# Note: Unassigned and Noncharacter codepoints may be omitted -# if they have default property values. -# ================================================ # ================================================ -0009..000D ; White_Space # Cc [5] .. +0009..000D ; White_Space # Cc [5] .. 0020 ; White_Space # Zs SPACE -0085 ; White_Space # Cc +0085 ; White_Space # Cc 00A0 ; White_Space # Zs NO-BREAK SPACE 1680 ; White_Space # Zs OGHAM SPACE MARK 180E ; White_Space # Zs MONGOLIAN VOWEL SEPARATOR @@ -112,6 +111,7 @@ FF63 ; Quotation_Mark # Pe HALFWIDTH RIGHT CORNER BRACKET 037E ; Terminal_Punctuation # Po GREEK QUESTION MARK 0387 ; Terminal_Punctuation # Po GREEK ANO TELEIA 0589 ; Terminal_Punctuation # Po ARMENIAN FULL STOP +05C3 ; Terminal_Punctuation # Po HEBREW PUNCTUATION SOF PASUQ 060C ; Terminal_Punctuation # Po ARABIC COMMA 061B ; Terminal_Punctuation # Po ARABIC SEMICOLON 061F ; Terminal_Punctuation # Po ARABIC QUESTION MARK @@ -120,6 +120,8 @@ FF63 ; Quotation_Mark # Pe HALFWIDTH RIGHT CORNER BRACKET 070C ; Terminal_Punctuation # Po SYRIAC HARKLEAN METOBELUS 0964..0965 ; Terminal_Punctuation # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA 0E5A..0E5B ; Terminal_Punctuation # Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT +0F08 ; Terminal_Punctuation # Po TIBETAN MARK SBRUL SHAD +0F0D..0F12 ; Terminal_Punctuation # Po [6] TIBETAN MARK SHAD..TIBETAN MARK RGYA GRAM SHAD 104A..104B ; Terminal_Punctuation # Po [2] MYANMAR SIGN LITTLE SECTION..MYANMAR SIGN SECTION 1361..1368 ; Terminal_Punctuation # Po [8] ETHIOPIC WORDSPACE..ETHIOPIC PARAGRAPH SEPARATOR 166D..166E ; Terminal_Punctuation # Po [2] CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP @@ -142,63 +144,80 @@ FF1F ; Terminal_Punctuation # Po FULLWIDTH QUESTION MARK FF61 ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC FULL STOP FF64 ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC COMMA -# Total code points: 78 +# Total code points: 86 # ================================================ -0028 ; Other_Math # Ps LEFT PARENTHESIS -0029 ; Other_Math # Pe RIGHT PARENTHESIS -002A ; Other_Math # Po ASTERISK -002D ; Other_Math # Pd HYPHEN-MINUS -002F ; Other_Math # Po SOLIDUS -005B ; Other_Math # Ps LEFT SQUARE BRACKET -005C ; Other_Math # Po REVERSE SOLIDUS -005D ; Other_Math # Pe RIGHT SQUARE BRACKET 005E ; Other_Math # Sk CIRCUMFLEX ACCENT -007B ; Other_Math # Ps LEFT CURLY BRACKET -007D ; Other_Math # Pe RIGHT CURLY BRACKET +03D0..03D2 ; Other_Math # L& [3] GREEK BETA SYMBOL..GREEK UPSILON WITH HOOK SYMBOL +03D5 ; Other_Math # L& GREEK PHI SYMBOL +03F0..03F1 ; Other_Math # L& [2] GREEK KAPPA SYMBOL..GREEK RHO SYMBOL +03F4..03F5 ; Other_Math # L& [2] GREEK CAPITAL THETA SYMBOL..GREEK LUNATE EPSILON SYMBOL 2016 ; Other_Math # Po DOUBLE VERTICAL LINE 2032..2034 ; Other_Math # Po [3] PRIME..TRIPLE PRIME +2040 ; Other_Math # Pc CHARACTER TIE +2061..2063 ; Other_Math # Cf [3] FUNCTION APPLICATION..INVISIBLE SEPARATOR 207D ; Other_Math # Ps SUPERSCRIPT LEFT PARENTHESIS 207E ; Other_Math # Pe SUPERSCRIPT RIGHT PARENTHESIS 208D ; Other_Math # Ps SUBSCRIPT LEFT PARENTHESIS 208E ; Other_Math # Pe SUBSCRIPT RIGHT PARENTHESIS 20D0..20DC ; Other_Math # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE 20E1 ; Other_Math # Mn COMBINING LEFT RIGHT ARROW ABOVE +20E5..20E6 ; Other_Math # Mn [2] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING DOUBLE VERTICAL STROKE OVERLAY 2102 ; Other_Math # L& DOUBLE-STRUCK CAPITAL C 210A..2113 ; Other_Math # L& [10] SCRIPT SMALL G..SCRIPT SMALL L 2115 ; Other_Math # L& DOUBLE-STRUCK CAPITAL N 2119..211D ; Other_Math # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R 2124 ; Other_Math # L& DOUBLE-STRUCK CAPITAL Z 2128 ; Other_Math # L& BLACK-LETTER CAPITAL Z +2129 ; Other_Math # So TURNED GREEK SMALL LETTER IOTA 212C..212D ; Other_Math # L& [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C 212F..2131 ; Other_Math # L& [3] SCRIPT SMALL E..SCRIPT CAPITAL F 2133..2134 ; Other_Math # L& [2] SCRIPT CAPITAL M..SCRIPT SMALL O 2135..2138 ; Other_Math # Lo [4] ALEF SYMBOL..DALET SYMBOL -FE35 ; Other_Math # Ps PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS -FE36 ; Other_Math # Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS -FE37 ; Other_Math # Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET -FE38 ; Other_Math # Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET -FE47 ; Other_Math # Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET -FE48 ; Other_Math # Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET -FE59 ; Other_Math # Ps SMALL LEFT PARENTHESIS -FE5A ; Other_Math # Pe SMALL RIGHT PARENTHESIS -FE5B ; Other_Math # Ps SMALL LEFT CURLY BRACKET -FE5C ; Other_Math # Pe SMALL RIGHT CURLY BRACKET +213D..213F ; Other_Math # L& [3] DOUBLE-STRUCK SMALL GAMMA..DOUBLE-STRUCK CAPITAL PI +2145..2149 ; Other_Math # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J +23B7 ; Other_Math # So RADICAL SYMBOL BOTTOM +23D0 ; Other_Math # So VERTICAL LINE EXTENSION +27E6 ; Other_Math # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7 ; Other_Math # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8 ; Other_Math # Ps MATHEMATICAL LEFT ANGLE BRACKET +27E9 ; Other_Math # Pe MATHEMATICAL RIGHT ANGLE BRACKET +27EA ; Other_Math # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB ; Other_Math # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +2983 ; Other_Math # Ps LEFT WHITE CURLY BRACKET +2984 ; Other_Math # Pe RIGHT WHITE CURLY BRACKET +2985 ; Other_Math # Ps LEFT WHITE PARENTHESIS +2986 ; Other_Math # Pe RIGHT WHITE PARENTHESIS +2987 ; Other_Math # Ps Z NOTATION LEFT IMAGE BRACKET +2988 ; Other_Math # Pe Z NOTATION RIGHT IMAGE BRACKET +2989 ; Other_Math # Ps Z NOTATION LEFT BINDING BRACKET +298A ; Other_Math # Pe Z NOTATION RIGHT BINDING BRACKET +298B ; Other_Math # Ps LEFT SQUARE BRACKET WITH UNDERBAR +298C ; Other_Math # Pe RIGHT SQUARE BRACKET WITH UNDERBAR +298D ; Other_Math # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E ; Other_Math # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F ; Other_Math # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990 ; Other_Math # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991 ; Other_Math # Ps LEFT ANGLE BRACKET WITH DOT +2992 ; Other_Math # Pe RIGHT ANGLE BRACKET WITH DOT +2993 ; Other_Math # Ps LEFT ARC LESS-THAN BRACKET +2994 ; Other_Math # Pe RIGHT ARC GREATER-THAN BRACKET +2995 ; Other_Math # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET +2996 ; Other_Math # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET +2997 ; Other_Math # Ps LEFT BLACK TORTOISE SHELL BRACKET +2998 ; Other_Math # Pe RIGHT BLACK TORTOISE SHELL BRACKET +29D8 ; Other_Math # Ps LEFT WIGGLY FENCE +29D9 ; Other_Math # Pe RIGHT WIGGLY FENCE +29DA ; Other_Math # Ps LEFT DOUBLE WIGGLY FENCE +29DB ; Other_Math # Pe RIGHT DOUBLE WIGGLY FENCE +29FC ; Other_Math # Ps LEFT-POINTING CURVED ANGLE BRACKET +29FD ; Other_Math # Pe RIGHT-POINTING CURVED ANGLE BRACKET FE61 ; Other_Math # Po SMALL ASTERISK FE63 ; Other_Math # Pd SMALL HYPHEN-MINUS FE68 ; Other_Math # Po SMALL REVERSE SOLIDUS -FF08 ; Other_Math # Ps FULLWIDTH LEFT PARENTHESIS -FF09 ; Other_Math # Pe FULLWIDTH RIGHT PARENTHESIS -FF0A ; Other_Math # Po FULLWIDTH ASTERISK -FF0D ; Other_Math # Pd FULLWIDTH HYPHEN-MINUS -FF0F ; Other_Math # Po FULLWIDTH SOLIDUS -FF3B ; Other_Math # Ps FULLWIDTH LEFT SQUARE BRACKET FF3C ; Other_Math # Po FULLWIDTH REVERSE SOLIDUS -FF3D ; Other_Math # Pe FULLWIDTH RIGHT SQUARE BRACKET FF3E ; Other_Math # Sk FULLWIDTH CIRCUMFLEX ACCENT -FF5B ; Other_Math # Ps FULLWIDTH LEFT CURLY BRACKET -FF5D ; Other_Math # Pe FULLWIDTH RIGHT CURLY BRACKET 1D400..1D454 ; Other_Math # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G 1D456..1D49C ; Other_Math # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A 1D49E..1D49F ; Other_Math # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D @@ -231,7 +250,7 @@ FF5D ; Other_Math # Pe FULLWIDTH RIGHT CURLY BRACKET 1D7C4..1D7C9 ; Other_Math # L& [6] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL 1D7CE..1D7FF ; Other_Math # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE -# Total code points: 1069 +# Total code points: 1099 # ================================================ @@ -537,24 +556,24 @@ FF70 ; Extender # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND # ================================================ -FDD0..FDEF ; Noncharacter_Code_Point # Cn [32] -FFFE..FFFF ; Noncharacter_Code_Point # Cn [2] -1FFFE..1FFFF ; Noncharacter_Code_Point # Cn [2] -2FFFE..2FFFF ; Noncharacter_Code_Point # Cn [2] -3FFFE..3FFFF ; Noncharacter_Code_Point # Cn [2] -4FFFE..4FFFF ; Noncharacter_Code_Point # Cn [2] -5FFFE..5FFFF ; Noncharacter_Code_Point # Cn [2] -6FFFE..6FFFF ; Noncharacter_Code_Point # Cn [2] -7FFFE..7FFFF ; Noncharacter_Code_Point # Cn [2] -8FFFE..8FFFF ; Noncharacter_Code_Point # Cn [2] -9FFFE..9FFFF ; Noncharacter_Code_Point # Cn [2] -AFFFE..AFFFF ; Noncharacter_Code_Point # Cn [2] -BFFFE..BFFFF ; Noncharacter_Code_Point # Cn [2] -CFFFE..CFFFF ; Noncharacter_Code_Point # Cn [2] -DFFFE..DFFFF ; Noncharacter_Code_Point # Cn [2] -EFFFE..EFFFF ; Noncharacter_Code_Point # Cn [2] -FFFFE..FFFFF ; Noncharacter_Code_Point # Cn [2] -10FFFE..10FFFF; Noncharacter_Code_Point # Cn [2] +FDD0..FDEF ; Noncharacter_Code_Point # Cn [32] .. +FFFE..FFFF ; Noncharacter_Code_Point # Cn [2] .. +1FFFE..1FFFF ; Noncharacter_Code_Point # Cn [2] .. +2FFFE..2FFFF ; Noncharacter_Code_Point # Cn [2] .. +3FFFE..3FFFF ; Noncharacter_Code_Point # Cn [2] .. +4FFFE..4FFFF ; Noncharacter_Code_Point # Cn [2] .. +5FFFE..5FFFF ; Noncharacter_Code_Point # Cn [2] .. +6FFFE..6FFFF ; Noncharacter_Code_Point # Cn [2] .. +7FFFE..7FFFF ; Noncharacter_Code_Point # Cn [2] .. +8FFFE..8FFFF ; Noncharacter_Code_Point # Cn [2] .. +9FFFE..9FFFF ; Noncharacter_Code_Point # Cn [2] .. +AFFFE..AFFFF ; Noncharacter_Code_Point # Cn [2] .. +BFFFE..BFFFF ; Noncharacter_Code_Point # Cn [2] .. +CFFFE..CFFFF ; Noncharacter_Code_Point # Cn [2] .. +DFFFE..DFFFF ; Noncharacter_Code_Point # Cn [2] .. +EFFFE..EFFFF ; Noncharacter_Code_Point # Cn [2] .. +FFFFE..FFFFF ; Noncharacter_Code_Point # Cn [2] .. +10FFFE..10FFFF; Noncharacter_Code_Point # Cn [2] .. # Total code points: 66 @@ -572,10 +591,11 @@ FFFFE..FFFFF ; Noncharacter_Code_Point # Cn [2] 0D57 ; Other_Grapheme_Extend # Mc MALAYALAM AU LENGTH MARK 0DCF ; Other_Grapheme_Extend # Mc SINHALA VOWEL SIGN AELA-PILLA 0DDF ; Other_Grapheme_Extend # Mc SINHALA VOWEL SIGN GAYANUKITTA +200C..200D ; Other_Grapheme_Extend # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER 1D165 ; Other_Grapheme_Extend # Mc MUSICAL SYMBOL COMBINING STEM 1D16E..1D16F ; Other_Grapheme_Extend # Mc [2] MUSICAL SYMBOL COMBINING FLAG-1..MUSICAL SYMBOL COMBINING FLAG-2 -# Total code points: 16 +# Total code points: 18 # ================================================ @@ -636,20 +656,17 @@ FA27..FA29 ; Unified_Ideograph # Lo [3] CJK COMPATIBILITY IDEOGRAPH-FA27..C 034F ; Other_Default_Ignorable_Code_Point # Mn COMBINING GRAPHEME JOINER 115F..1160 ; Other_Default_Ignorable_Code_Point # Lo [2] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG FILLER -180B..180D ; Other_Default_Ignorable_Code_Point # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE -200B ; Other_Default_Ignorable_Code_Point # Zs ZERO WIDTH SPACE -2064..2069 ; Other_Default_Ignorable_Code_Point # Cn [6] +200B ; Other_Default_Ignorable_Code_Point # Cf ZERO WIDTH SPACE +2064..2069 ; Other_Default_Ignorable_Code_Point # Cn [6] .. 3164 ; Other_Default_Ignorable_Code_Point # Lo HANGUL FILLER -FE00..FE0F ; Other_Default_Ignorable_Code_Point # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 FFA0 ; Other_Default_Ignorable_Code_Point # Lo HALFWIDTH HANGUL FILLER -FFF0..FFF8 ; Other_Default_Ignorable_Code_Point # Cn [9] -E0000 ; Other_Default_Ignorable_Code_Point # Cn -E0002..E001F ; Other_Default_Ignorable_Code_Point # Cn [30] -E0080..E00FF ; Other_Default_Ignorable_Code_Point # Cn [128] -E0100..E01EF ; Other_Default_Ignorable_Code_Point # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -E01F0..E0FFF ; Other_Default_Ignorable_Code_Point # Cn [3600] +FFF0..FFF8 ; Other_Default_Ignorable_Code_Point # Cn [9] .. +E0000 ; Other_Default_Ignorable_Code_Point # Cn +E0002..E001F ; Other_Default_Ignorable_Code_Point # Cn [30] .. +E0080..E00FF ; Other_Default_Ignorable_Code_Point # Cn [128] .. +E01F0..E0FFF ; Other_Default_Ignorable_Code_Point # Cn [3600] .. -# Total code points: 4039 +# Total code points: 3780 # ================================================ @@ -665,14 +682,31 @@ E01F0..E0FFF ; Other_Default_Ignorable_Code_Point # Cn [3600] 0069..006A ; Soft_Dotted # L& [2] LATIN SMALL LETTER I..LATIN SMALL LETTER J 012F ; Soft_Dotted # L& LATIN SMALL LETTER I WITH OGONEK 0268 ; Soft_Dotted # L& LATIN SMALL LETTER I WITH STROKE +029D ; Soft_Dotted # L& LATIN SMALL LETTER J WITH CROSSED-TAIL +02B2 ; Soft_Dotted # Lm MODIFIER LETTER SMALL J +03F3 ; Soft_Dotted # L& GREEK LETTER YOT 0456 ; Soft_Dotted # L& CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I 0458 ; Soft_Dotted # L& CYRILLIC SMALL LETTER JE 1D62 ; Soft_Dotted # L& LATIN SUBSCRIPT SMALL LETTER I 1E2D ; Soft_Dotted # L& LATIN SMALL LETTER I WITH TILDE BELOW 1ECB ; Soft_Dotted # L& LATIN SMALL LETTER I WITH DOT BELOW 2071 ; Soft_Dotted # L& SUPERSCRIPT LATIN SMALL LETTER I - -# Total code points: 10 +2148..2149 ; Soft_Dotted # L& [2] DOUBLE-STRUCK ITALIC SMALL I..DOUBLE-STRUCK ITALIC SMALL J +1D422..1D423 ; Soft_Dotted # L& [2] MATHEMATICAL BOLD SMALL I..MATHEMATICAL BOLD SMALL J +1D456..1D457 ; Soft_Dotted # L& [2] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL ITALIC SMALL J +1D48A..1D48B ; Soft_Dotted # L& [2] MATHEMATICAL BOLD ITALIC SMALL I..MATHEMATICAL BOLD ITALIC SMALL J +1D4BE..1D4BF ; Soft_Dotted # L& [2] MATHEMATICAL SCRIPT SMALL I..MATHEMATICAL SCRIPT SMALL J +1D4F2..1D4F3 ; Soft_Dotted # L& [2] MATHEMATICAL BOLD SCRIPT SMALL I..MATHEMATICAL BOLD SCRIPT SMALL J +1D526..1D527 ; Soft_Dotted # L& [2] MATHEMATICAL FRAKTUR SMALL I..MATHEMATICAL FRAKTUR SMALL J +1D55A..1D55B ; Soft_Dotted # L& [2] MATHEMATICAL DOUBLE-STRUCK SMALL I..MATHEMATICAL DOUBLE-STRUCK SMALL J +1D58E..1D58F ; Soft_Dotted # L& [2] MATHEMATICAL BOLD FRAKTUR SMALL I..MATHEMATICAL BOLD FRAKTUR SMALL J +1D5C2..1D5C3 ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF SMALL I..MATHEMATICAL SANS-SERIF SMALL J +1D5F6..1D5F7 ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF BOLD SMALL I..MATHEMATICAL SANS-SERIF BOLD SMALL J +1D62A..1D62B ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF ITALIC SMALL I..MATHEMATICAL SANS-SERIF ITALIC SMALL J +1D65E..1D65F ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J +1D692..1D693 ; Soft_Dotted # L& [2] MATHEMATICAL MONOSPACE SMALL I..MATHEMATICAL MONOSPACE SMALL J + +# Total code points: 41 # ================================================ @@ -689,3 +723,41 @@ E01F0..E0FFF ; Other_Default_Ignorable_Code_Point # Cn [3600] # Total code points: 4 +# ================================================ + +0021 ; STerm # Po EXCLAMATION MARK +002E ; STerm # Po FULL STOP +003F ; STerm # Po QUESTION MARK +055C ; STerm # Po ARMENIAN EXCLAMATION MARK +055E ; STerm # Po ARMENIAN QUESTION MARK +0589 ; STerm # Po ARMENIAN FULL STOP +061F ; STerm # Po ARABIC QUESTION MARK +06D4 ; STerm # Po ARABIC FULL STOP +0700..0702 ; STerm # Po [3] SYRIAC END OF PARAGRAPH..SYRIAC SUBLINEAR FULL STOP +0964..0965 ; STerm # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA +104A..104B ; STerm # Po [2] MYANMAR SIGN LITTLE SECTION..MYANMAR SIGN SECTION +1362 ; STerm # Po ETHIOPIC FULL STOP +1367..1368 ; STerm # Po [2] ETHIOPIC QUESTION MARK..ETHIOPIC PARAGRAPH SEPARATOR +166E ; STerm # Po CANADIAN SYLLABICS FULL STOP +1803 ; STerm # Po MONGOLIAN FULL STOP +1809 ; STerm # Po MONGOLIAN MANCHU FULL STOP +1944..1945 ; STerm # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK +203C..203D ; STerm # Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG +2047..2049 ; STerm # Po [3] DOUBLE QUESTION MARK..EXCLAMATION QUESTION MARK +3002 ; STerm # Po IDEOGRAPHIC FULL STOP +FE52 ; STerm # Po SMALL FULL STOP +FE56..FE57 ; STerm # Po [2] SMALL QUESTION MARK..SMALL EXCLAMATION MARK +FF01 ; STerm # Po FULLWIDTH EXCLAMATION MARK +FF0E ; STerm # Po FULLWIDTH FULL STOP +FF1F ; STerm # Po FULLWIDTH QUESTION MARK +FF61 ; STerm # Po HALFWIDTH IDEOGRAPHIC FULL STOP + +# Total code points: 36 + +# ================================================ + +180B..180D ; Variation_Selector # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE +FE00..FE0F ; Variation_Selector # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 +E0100..E01EF ; Variation_Selector # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 + +# Total code points: 259 diff --git a/icuSources/data/unidata/PropertyAliases.txt b/icuSources/data/unidata/PropertyAliases.txt index 1195e8f0..cf9950f9 100644 --- a/icuSources/data/unidata/PropertyAliases.txt +++ b/icuSources/data/unidata/PropertyAliases.txt @@ -1,6 +1,10 @@ -# PropertyAliases-4.0.0.txt -# Date: 2003-03-12, 23:46:08 GMT [MD] +# PropertyAliases-4.0.1.txt +# Date: 2004-03-02, 19:47:55 GMT [MD] # +# Unicode Character Database +# Copyright (c) 1991-2004 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# For documentation, see UCD.html # This file contains aliases for properties used in the UCD. # These names can be used for XML formats of UCD data, for regular-expression # property tests, and other programmatic textual descriptions of Unicode data. @@ -11,46 +15,50 @@ # # FORMAT # -# Each line has two fields, separated by semicolons. +# Each line has two or more fields, separated by semicolons. # # First Field: The first field is an abbreviated name for the property. # # Second Field: The second field is a long name # -# With loose matching of property names, the case distinctions, whitespace, -# and '_' are ignored. +# The above are the preferred aliases. Other aliases may be listed in additional fields. # -# NOTE: Currently there is at most one abbreviated name and one long name for -# each property. However, in the future additional aliases may be added. +# Loose matching should be applied to all property names and property values, with +# the exception of String Property values. With loose matching of property names and +# values, the case distinctions, whitespace, and '_' are ignored. For Numeric Property +# values, numeric equivalencies are applied: thus "01.00" is equivalent to "1". # -# NOTE: The property value names are NOT unique across properties, especially -# with loose matches. For example: +# NOTE: Property value names are NOT unique across properties. For example: # # AL means Arabic Letter for the Bidi_Class property, and # AL means Alpha_Left for the Combining_Class property, and # AL means Alphabetic for the Line_Break property. # # In addition, some property names may be the same as some property value names. +# For example: +# +# sc means the Script property, and +# Sc means the General_Category property value Currency_Symbol (Sc) # # The combination of property value and property name is, however, unique. -# For more information, see UTR #18: Regular Expression Guidelines +# +# For more information, see UTS #18: Regular Expression Guidelines # ================================================ # ================================================ -# Non-enumerated Properties +# Numeric Properties +# ================================================ +nv ; Numeric_Value + +# ================================================ +# String Properties # ================================================ -age ; Age -blk ; Block bmg ; Bidi_Mirroring_Glyph cf ; Case_Folding dm ; Decomposition_Mapping FC_NFKC ; FC_NFKC_Closure -isc ; ISO_Comment lc ; Lowercase_Mapping -na ; Name -na1 ; Unicode_1_Name -nv ; Numeric_Value scc ; Special_Case_Condition sfc ; Simple_Case_Folding slc ; Simple_Lowercase_Mapping @@ -58,10 +66,24 @@ stc ; Simple_Titlecase_Mapping suc ; Simple_Uppercase_Mapping tc ; Titlecase_Mapping uc ; Uppercase_Mapping + +# ================================================ +# Miscellaneous Properties +# ================================================ +isc ; ISO_Comment +na ; Name +na1 ; Unicode_1_Name URS ; Unicode_Radical_Stroke # ================================================ -# Enumerated Non-Binary Properties +# Catalog Properties +# ================================================ +age ; Age +blk ; Block +sc ; Script + +# ================================================ +# Enumerated Properties # ================================================ bc ; Bidi_Class ccc ; Canonical_Combining_Class @@ -77,7 +99,6 @@ NFD_QC ; NFD_Quick_Check NFKC_QC ; NFKC_Quick_Check NFKD_QC ; NFKD_Quick_Check nt ; Numeric_Type -sc ; Script # ================================================ # Binary Properties @@ -118,9 +139,11 @@ OUpper ; Other_Uppercase QMark ; Quotation_Mark Radical ; Radical SD ; Soft_Dotted +STerm ; STerm Term ; Terminal_Punctuation UIdeo ; Unified_Ideograph Upper ; Uppercase +VS ; Variation_Selector WSpace ; White_Space XIDC ; XID_Continue XIDS ; XID_Start @@ -128,3 +151,7 @@ XO_NFC ; Expands_On_NFC XO_NFD ; Expands_On_NFD XO_NFKC ; Expands_On_NFKC XO_NFKD ; Expands_On_NFKD + +# ================================================ +# Total: 82 + diff --git a/icuSources/data/unidata/PropertyValueAliases.txt b/icuSources/data/unidata/PropertyValueAliases.txt index fe82f236..74460d5c 100644 --- a/icuSources/data/unidata/PropertyValueAliases.txt +++ b/icuSources/data/unidata/PropertyValueAliases.txt @@ -1,6 +1,10 @@ -# PropertyValueAliases-4.0.0.txt -# Date: 2003-03-12, 23:46:08 GMT [MD] +# PropertyValueAliases-4.0.1.txt +# Date: 2004-03-02, 19:46:47 GMT [MD] # +# Unicode Character Database +# Copyright (c) 1991-2004 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# For documentation, see UCD.html # This file contains aliases for property values used in the UCD. # These names can be used for XML formats of UCD data, for regular-expression # property tests, and other programmatic textual descriptions of Unicode data. @@ -12,11 +16,10 @@ # FORMAT # # Each line describes a property value name. -# This consists of three fields, separated by semicolons. +# This consists of three or more fields, separated by semicolons. # # First Field: The first field describes the property for which that # property value name is used. -# There is one special pseudo-property: "qc" stands for any quick-check property # # Second Field: The second field is an abbreviated name. # If there is no abbreviated name available, the field is marked with "n/a". @@ -26,32 +29,44 @@ # In the case of ccc, there are 4 fields. The second field is numeric, third # is abbreviated, and fourth is long. # -# With loose matching of property names, the case distinctions, whitespace, -# and '_' are ignored. +# The above are the preferred aliases. Other aliases may be listed in additional fields. # -# NOTE: Currently there is at most one abbreviated name and one long name for -# property value. However, in the future additional aliases may be added. -# In such a case, the first line for the property value would have -# the preferred alias for output. +# Loose matching should be applied to all property names and property values, with +# the exception of String Property values. With loose matching of property names and +# values, the case distinctions, whitespace, and '_' are ignored. For Numeric Property +# values, numeric equivalencies are applied: thus "01.00" is equivalent to "1". # -# NOTE: The property value names are NOT unique across properties, especially -# with loose matches. For example: +# NOTE: Property value names are NOT unique across properties. For example: # -# AL means Arabic Letter for the Bidi_Class property, and -# AL means Alpha_Left for the Combining_Class property, and -# AL means Alphabetic for the Line_Break property. +# AL means Arabic Letter for the Bidi_Class property, and +# AL means Alpha_Left for the Combining_Class property, and +# AL means Alphabetic for the Line_Break property. # # In addition, some property names may be the same as some property value names. # For example: # -# cc means Combining_Class property, and -# cc means the General_Category property value Control (cc) +# sc means the Script property, and +# Sc means the General_Category property value Currency_Symbol (Sc) # # The combination of property value and property name is, however, unique. -# For more information, see UTR #18: Regular Expression Guidelines +# +# For more information, see UTS #18: Regular Expression Guidelines # ================================================ +# Age (age) + +age; n/a ; 1.1 +age; n/a ; 2.0 +age; n/a ; 2.1 +age; n/a ; 3.0 +age; n/a ; 3.1 +age; n/a ; 3.2 +age; n/a ; 4.0 +age; n/a ; unassigned + +# Bidi_Class (bc) + bc ; AL ; Arabic_Letter bc ; AN ; Arabic_Number bc ; B ; Paragraph_Separator @@ -72,6 +87,8 @@ bc ; RLO ; Right_To_Left_Override bc ; S ; Segment_Separator bc ; WS ; White_Space +# Block (blk) + blk; n/a ; Aegean_Numbers blk; n/a ; Alphabetic_Presentation_Forms blk; n/a ; Arabic @@ -105,7 +122,7 @@ blk; n/a ; Control_Pictures blk; n/a ; Currency_Symbols blk; n/a ; Cypriot_Syllabary blk; n/a ; Cyrillic -blk; n/a ; Cyrillic_Supplementary +blk; n/a ; Cyrillic_Supplement ; Cyrillic_Supplementary blk; n/a ; Deseret blk; n/a ; Devanagari blk; n/a ; Dingbats @@ -139,10 +156,10 @@ blk; n/a ; Katakana_Phonetic_Extensions blk; n/a ; Khmer blk; n/a ; Khmer_Symbols blk; n/a ; Lao -blk; n/a ; Latin_Extended_Additional +blk; n/a ; Latin-1_Supplement blk; n/a ; Latin_Extended-A blk; n/a ; Latin_Extended-B -blk; n/a ; Latin-1_Supplement +blk; n/a ; Latin_Extended_Additional blk; n/a ; Letterlike_Symbols blk; n/a ; Limbu blk; n/a ; Linear_B_Ideograms @@ -199,8 +216,14 @@ blk; n/a ; Yi_Radicals blk; n/a ; Yi_Syllables blk; n/a ; Yijing_Hexagram_Symbols +# Canonical_Combining_Class (ccc) + ccc; 0; NR ; Not_Reordered ccc; 1; OV ; Overlay +ccc; 7; NK ; Nukta +ccc; 8; KV ; Kana_Voicing +ccc; 9; VR ; Virama +ccc; 200; ATBL ; Attached_Below_Left ccc; 202; ATB ; Attached_Below ccc; 216; ATAR ; Attached_Above_Right ccc; 218; BL ; Below_Left @@ -214,28 +237,29 @@ ccc; 232; AR ; Above_Right ccc; 233; DB ; Double_Below ccc; 234; DA ; Double_Above ccc; 240; IS ; Iota_Subscript -ccc; 7; NK ; Nukta -ccc; 8; KV ; Kana_Voicing -ccc; 9; VR ; Virama -dt ; can ; canonical -dt ; com ; compat -dt ; enc ; circle -dt ; fin ; final -dt ; font ; font -dt ; fra ; fraction -dt ; init ; initial -dt ; iso ; isolated -dt ; med ; medial -dt ; n/a ; none -dt ; nar ; narrow -dt ; nb ; noBreak -dt ; sml ; small -dt ; sqr ; square -dt ; sub ; sub -dt ; sup ; super -dt ; vert ; vertical -dt ; wide ; wide +# Decomposition_Type (dt) + +dt ; can ; Canonical +dt ; com ; Compat +dt ; enc ; Circle +dt ; fin ; Final +dt ; font ; Font +dt ; fra ; Fraction +dt ; init ; Initial +dt ; iso ; Isolated +dt ; med ; Medial +dt ; nar ; Narrow +dt ; nb ; Nobreak +dt ; none ; None +dt ; sml ; Small +dt ; sqr ; Square +dt ; sub ; Sub +dt ; sup ; Super +dt ; vert ; Vertical +dt ; wide ; Wide + +# East_Asian_Width (ea) ea ; A ; Ambiguous ea ; F ; Fullwidth @@ -244,6 +268,8 @@ ea ; N ; Neutral ea ; Na ; Narrow ea ; W ; Wide +# General_Category (gc) + gc ; C ; Other # Cc | Cf | Cn | Co | Cs gc ; Cc ; Control gc ; Cf ; Format @@ -283,6 +309,8 @@ gc ; Zl ; Line_Separator gc ; Zp ; Paragraph_Separator gc ; Zs ; Space_Separator +# Hangul_Syllable_Type (hst) + hst; L ; Leading_Jamo hst; LV ; LV_Syllable hst; LVT ; LVT_Syllable @@ -290,60 +318,64 @@ hst; NA ; Not_Applicable hst; T ; Trailing_Jamo hst; V ; Vowel_Jamo -jg ; n/a ; AIN -jg ; n/a ; ALAPH -jg ; n/a ; ALEF -jg ; n/a ; BEH -jg ; n/a ; BETH -jg ; n/a ; DAL -jg ; n/a ; DALATH_RISH +# Joining_Group (jg) + +jg ; n/a ; Ain +jg ; n/a ; Alaph +jg ; n/a ; Alef +jg ; n/a ; Beh +jg ; n/a ; Beth +jg ; n/a ; Dal +jg ; n/a ; Dalath_Rish jg ; n/a ; E -jg ; n/a ; FE -jg ; n/a ; FEH -jg ; n/a ; FINAL_SEMKATH -jg ; n/a ; GAF -jg ; n/a ; GAMAL -jg ; n/a ; HAH -jg ; n/a ; HAMZA_ON_HEH_GOAL -jg ; n/a ; HE -jg ; n/a ; HEH -jg ; n/a ; HEH_GOAL -jg ; n/a ; HETH -jg ; n/a ; KAF -jg ; n/a ; KAPH -jg ; n/a ; KHAPH -jg ; n/a ; KNOTTED_HEH -jg ; n/a ; LAM -jg ; n/a ; LAMADH -jg ; n/a ; MEEM -jg ; n/a ; MIM -jg ; n/a ; NO_JOINING_GROUP -jg ; n/a ; NOON -jg ; n/a ; NUN -jg ; n/a ; PE -jg ; n/a ; QAF -jg ; n/a ; QAPH -jg ; n/a ; REH -jg ; n/a ; REVERSED_PE -jg ; n/a ; SAD -jg ; n/a ; SADHE -jg ; n/a ; SEEN -jg ; n/a ; SEMKATH -jg ; n/a ; SHIN -jg ; n/a ; SWASH_KAF -jg ; n/a ; SYRIAC_WAW -jg ; n/a ; TAH -jg ; n/a ; TAW -jg ; n/a ; TEH_MARBUTA -jg ; n/a ; TETH -jg ; n/a ; WAW -jg ; n/a ; YEH -jg ; n/a ; YEH_BARREE -jg ; n/a ; YEH_WITH_TAIL -jg ; n/a ; YUDH -jg ; n/a ; YUDH_HE -jg ; n/a ; ZAIN -jg ; n/a ; ZHAIN +jg ; n/a ; Fe +jg ; n/a ; Feh +jg ; n/a ; Final_Semkath +jg ; n/a ; Gaf +jg ; n/a ; Gamal +jg ; n/a ; Hah +jg ; n/a ; Hamza_On_Heh_Goal +jg ; n/a ; He +jg ; n/a ; Heh +jg ; n/a ; Heh_Goal +jg ; n/a ; Heth +jg ; n/a ; Kaf +jg ; n/a ; Kaph +jg ; n/a ; Khaph +jg ; n/a ; Knotted_Heh +jg ; n/a ; Lam +jg ; n/a ; Lamadh +jg ; n/a ; Meem +jg ; n/a ; Mim +jg ; n/a ; No_Joining_Group +jg ; n/a ; Noon +jg ; n/a ; Nun +jg ; n/a ; Pe +jg ; n/a ; Qaf +jg ; n/a ; Qaph +jg ; n/a ; Reh +jg ; n/a ; Reversed_Pe +jg ; n/a ; Sad +jg ; n/a ; Sadhe +jg ; n/a ; Seen +jg ; n/a ; Semkath +jg ; n/a ; Shin +jg ; n/a ; Swash_Kaf +jg ; n/a ; Syriac_Waw +jg ; n/a ; Tah +jg ; n/a ; Taw +jg ; n/a ; Teh_Marbuta +jg ; n/a ; Teth +jg ; n/a ; Waw +jg ; n/a ; Yeh +jg ; n/a ; Yeh_Barree +jg ; n/a ; Yeh_With_Tail +jg ; n/a ; Yudh +jg ; n/a ; Yudh_He +jg ; n/a ; Zain +jg ; n/a ; Zhain + +# Joining_Type (jt) jt ; C ; Join_Causing jt ; D ; Dual_Joining @@ -352,6 +384,8 @@ jt ; R ; Right_Joining jt ; T ; Transparent jt ; U ; Non_Joining +# Line_Break (lb) + lb ; AI ; Ambiguous lb ; AL ; Alphabetic lb ; B2 ; Break_Both @@ -366,7 +400,7 @@ lb ; EX ; Exclamation lb ; GL ; Glue lb ; HY ; Hyphen lb ; ID ; Ideographic -lb ; IN ; Inseperable +lb ; IN ; Inseparable ; Inseperable lb ; IS ; Infix_Numeric lb ; LF ; Line_Feed lb ; NL ; Next_Line @@ -384,14 +418,36 @@ lb ; WJ ; Word_Joiner lb ; XX ; Unknown lb ; ZW ; ZWSpace -nt ; de ; Decimal -nt ; di ; Digit -nt ; n/a ; None -nt ; nu ; Numeric +# NFC_Quick_Check (NFC_QC) + +NFC_QC; M ; Maybe +NFC_QC; N ; No +NFC_QC; Y ; Yes + +# NFD_Quick_Check (NFD_QC) + +NFD_QC; N ; No +NFD_QC; Y ; Yes + +# NFKC_Quick_Check (NFKC_QC) + +NFKC_QC; M ; Maybe +NFKC_QC; N ; No +NFKC_QC; Y ; Yes + +# NFKD_Quick_Check (NFKD_QC) + +NFKD_QC; N ; No +NFKD_QC; Y ; Yes + +# Numeric_Type (nt) + +nt ; De ; Decimal +nt ; Di ; Digit +nt ; None ; None +nt ; Nu ; Numeric -qc ; M ; Maybe -qc ; N ; No -qc ; Y ; Yes +# Script (sc) sc ; Arab ; Arabic sc ; Armn ; Armenian @@ -416,6 +472,7 @@ sc ; Hani ; Han sc ; Hano ; Hanunoo sc ; Hebr ; Hebrew sc ; Hira ; Hiragana +sc ; Hrkt ; Katakana_Or_Hiragana sc ; Ital ; Old_Italic sc ; Kana ; Katakana sc ; Khmr ; Khmer diff --git a/icuSources/data/unidata/Scripts.txt b/icuSources/data/unidata/Scripts.txt index 696720aa..2aa0630d 100644 --- a/icuSources/data/unidata/Scripts.txt +++ b/icuSources/data/unidata/Scripts.txt @@ -1,774 +1,1336 @@ -# Scripts-4.0.0.txt -# Date: 2003-03-20, 20:07:48 GMT [MD] +# Scripts-4.0.1.txt +# Date: 2004-03-11, 18:47:37 GMT [MD] # +# Unicode Character Database +# Copyright (c) 1991-2004 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html # For documentation, see UCD.html -# Note: Unassigned and Noncharacter codepoints may be omitted -# if they have default property values. -# ================================================ - - -# ================================================ -# Script -# All code points not explicitly listed in this file have the property -# value: COMMON. -# ================================================ - -0041..005A ; LATIN # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z -0061..007A ; LATIN # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z -00AA ; LATIN # L& FEMININE ORDINAL INDICATOR -00BA ; LATIN # L& MASCULINE ORDINAL INDICATOR -00C0..00D6 ; LATIN # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS -00D8..00F6 ; LATIN # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS -00F8..01BA ; LATIN # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL -01BB ; LATIN # Lo LATIN LETTER TWO WITH STROKE -01BC..01BF ; LATIN # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN -01C0..01C3 ; LATIN # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK -01C4..0236 ; LATIN # L& [115] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER T WITH CURL -0250..02AF ; LATIN # L& [96] LATIN SMALL LETTER TURNED A..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL -02B0..02B8 ; LATIN # Lm [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y -02E0..02E4 ; LATIN # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP -1D00..1D25 ; LATIN # L& [38] LATIN LETTER SMALL CAPITAL A..LATIN LETTER AIN -1D2C..1D5C ; LATIN # Lm [49] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL AIN -1D62..1D65 ; LATIN # L& [4] LATIN SUBSCRIPT SMALL LETTER I..LATIN SUBSCRIPT SMALL LETTER V -1D6B ; LATIN # L& LATIN SMALL LETTER UE -1E00..1E9B ; LATIN # L& [156] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER LONG S WITH DOT ABOVE -1EA0..1EF9 ; LATIN # L& [90] LATIN CAPITAL LETTER A WITH DOT BELOW..LATIN SMALL LETTER Y WITH TILDE -2071 ; LATIN # L& SUPERSCRIPT LATIN SMALL LETTER I -207F ; LATIN # L& SUPERSCRIPT LATIN SMALL LETTER N -212A..212B ; LATIN # L& [2] KELVIN SIGN..ANGSTROM SIGN -FB00..FB06 ; LATIN # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST -FF21..FF3A ; LATIN # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z -FF41..FF5A ; LATIN # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z + +# ================================================ + +# Property: Script + +# All code points not explicitly listed for Script +# have the value Common (Zyyy). + +# ================================================ + +0000..001F ; Common # Cc [32] .. +0020 ; Common # Zs SPACE +0021..0023 ; Common # Po [3] EXCLAMATION MARK..NUMBER SIGN +0024 ; Common # Sc DOLLAR SIGN +0025..0027 ; Common # Po [3] PERCENT SIGN..APOSTROPHE +0028 ; Common # Ps LEFT PARENTHESIS +0029 ; Common # Pe RIGHT PARENTHESIS +002A ; Common # Po ASTERISK +002B ; Common # Sm PLUS SIGN +002C ; Common # Po COMMA +002D ; Common # Pd HYPHEN-MINUS +002E..002F ; Common # Po [2] FULL STOP..SOLIDUS +0030..0039 ; Common # Nd [10] DIGIT ZERO..DIGIT NINE +003A..003B ; Common # Po [2] COLON..SEMICOLON +003C..003E ; Common # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN +003F..0040 ; Common # Po [2] QUESTION MARK..COMMERCIAL AT +005B ; Common # Ps LEFT SQUARE BRACKET +005C ; Common # Po REVERSE SOLIDUS +005D ; Common # Pe RIGHT SQUARE BRACKET +005E ; Common # Sk CIRCUMFLEX ACCENT +005F ; Common # Pc LOW LINE +0060 ; Common # Sk GRAVE ACCENT +007B ; Common # Ps LEFT CURLY BRACKET +007C ; Common # Sm VERTICAL LINE +007D ; Common # Pe RIGHT CURLY BRACKET +007E ; Common # Sm TILDE +007F..009F ; Common # Cc [33] .. +00A0 ; Common # Zs NO-BREAK SPACE +00A1 ; Common # Po INVERTED EXCLAMATION MARK +00A2..00A5 ; Common # Sc [4] CENT SIGN..YEN SIGN +00A6..00A7 ; Common # So [2] BROKEN BAR..SECTION SIGN +00A8 ; Common # Sk DIAERESIS +00A9 ; Common # So COPYRIGHT SIGN +00AB ; Common # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +00AC ; Common # Sm NOT SIGN +00AD ; Common # Cf SOFT HYPHEN +00AE ; Common # So REGISTERED SIGN +00AF ; Common # Sk MACRON +00B0 ; Common # So DEGREE SIGN +00B1 ; Common # Sm PLUS-MINUS SIGN +00B2..00B3 ; Common # No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE +00B4 ; Common # Sk ACUTE ACCENT +00B5 ; Common # L& MICRO SIGN +00B6 ; Common # So PILCROW SIGN +00B7 ; Common # Po MIDDLE DOT +00B8 ; Common # Sk CEDILLA +00B9 ; Common # No SUPERSCRIPT ONE +00BB ; Common # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +00BC..00BE ; Common # No [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS +00BF ; Common # Po INVERTED QUESTION MARK +00D7 ; Common # Sm MULTIPLICATION SIGN +00F7 ; Common # Sm DIVISION SIGN +02B9..02C1 ; Common # Lm [9] MODIFIER LETTER PRIME..MODIFIER LETTER REVERSED GLOTTAL STOP +02C2..02C5 ; Common # Sk [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD +02C6..02D1 ; Common # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON +02D2..02DF ; Common # Sk [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT +02E5..02ED ; Common # Sk [9] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER UNASPIRATED +02EE ; Common # Lm MODIFIER LETTER DOUBLE APOSTROPHE +02EF..02FF ; Common # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW +037E ; Common # Po GREEK QUESTION MARK +0387 ; Common # Po GREEK ANO TELEIA +0589 ; Common # Po ARMENIAN FULL STOP +0600..0603 ; Common # Cf [4] ARABIC NUMBER SIGN..ARABIC SIGN SAFHA +060C ; Common # Po ARABIC COMMA +061B ; Common # Po ARABIC SEMICOLON +061F ; Common # Po ARABIC QUESTION MARK +0640 ; Common # Lm ARABIC TATWEEL +0660..0669 ; Common # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE +06DD ; Common # Cf ARABIC END OF AYAH +0964..0965 ; Common # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA +0970 ; Common # Po DEVANAGARI ABBREVIATION SIGN +0E3F ; Common # Sc THAI CURRENCY SYMBOL BAHT +10FB ; Common # Po GEORGIAN PARAGRAPH SEPARATOR +16EB..16ED ; Common # Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION +1735..1736 ; Common # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION +2000..200A ; Common # Zs [11] EN QUAD..HAIR SPACE +200B ; Common # Cf ZERO WIDTH SPACE +200E..200F ; Common # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK +2010..2015 ; Common # Pd [6] HYPHEN..HORIZONTAL BAR +2016..2017 ; Common # Po [2] DOUBLE VERTICAL LINE..DOUBLE LOW LINE +2018 ; Common # Pi LEFT SINGLE QUOTATION MARK +2019 ; Common # Pf RIGHT SINGLE QUOTATION MARK +201A ; Common # Ps SINGLE LOW-9 QUOTATION MARK +201B..201C ; Common # Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK +201D ; Common # Pf RIGHT DOUBLE QUOTATION MARK +201E ; Common # Ps DOUBLE LOW-9 QUOTATION MARK +201F ; Common # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK +2020..2027 ; Common # Po [8] DAGGER..HYPHENATION POINT +2028 ; Common # Zl LINE SEPARATOR +2029 ; Common # Zp PARAGRAPH SEPARATOR +202A..202E ; Common # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE +202F ; Common # Zs NARROW NO-BREAK SPACE +2030..2038 ; Common # Po [9] PER MILLE SIGN..CARET +2039 ; Common # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK +203A ; Common # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +203B..203E ; Common # Po [4] REFERENCE MARK..OVERLINE +203F..2040 ; Common # Pc [2] UNDERTIE..CHARACTER TIE +2041..2043 ; Common # Po [3] CARET INSERTION POINT..HYPHEN BULLET +2044 ; Common # Sm FRACTION SLASH +2045 ; Common # Ps LEFT SQUARE BRACKET WITH QUILL +2046 ; Common # Pe RIGHT SQUARE BRACKET WITH QUILL +2047..2051 ; Common # Po [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY +2052 ; Common # Sm COMMERCIAL MINUS SIGN +2053 ; Common # Po SWUNG DASH +2054 ; Common # Pc INVERTED UNDERTIE +2057 ; Common # Po QUADRUPLE PRIME +205F ; Common # Zs MEDIUM MATHEMATICAL SPACE +2060..2063 ; Common # Cf [4] WORD JOINER..INVISIBLE SEPARATOR +206A..206F ; Common # Cf [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES +2070 ; Common # No SUPERSCRIPT ZERO +2074..2079 ; Common # No [6] SUPERSCRIPT FOUR..SUPERSCRIPT NINE +207A..207C ; Common # Sm [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN +207D ; Common # Ps SUPERSCRIPT LEFT PARENTHESIS +207E ; Common # Pe SUPERSCRIPT RIGHT PARENTHESIS +2080..2089 ; Common # No [10] SUBSCRIPT ZERO..SUBSCRIPT NINE +208A..208C ; Common # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN +208D ; Common # Ps SUBSCRIPT LEFT PARENTHESIS +208E ; Common # Pe SUBSCRIPT RIGHT PARENTHESIS +20A0..20B1 ; Common # Sc [18] EURO-CURRENCY SIGN..PESO SIGN +2100..2101 ; Common # So [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT +2102 ; Common # L& DOUBLE-STRUCK CAPITAL C +2103..2106 ; Common # So [4] DEGREE CELSIUS..CADA UNA +2107 ; Common # L& EULER CONSTANT +2108..2109 ; Common # So [2] SCRUPLE..DEGREE FAHRENHEIT +210A..2113 ; Common # L& [10] SCRIPT SMALL G..SCRIPT SMALL L +2114 ; Common # So L B BAR SYMBOL +2115 ; Common # L& DOUBLE-STRUCK CAPITAL N +2116..2118 ; Common # So [3] NUMERO SIGN..SCRIPT CAPITAL P +2119..211D ; Common # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R +211E..2123 ; Common # So [6] PRESCRIPTION TAKE..VERSICLE +2124 ; Common # L& DOUBLE-STRUCK CAPITAL Z +2125 ; Common # So OUNCE SIGN +2127 ; Common # So INVERTED OHM SIGN +2128 ; Common # L& BLACK-LETTER CAPITAL Z +2129 ; Common # So TURNED GREEK SMALL LETTER IOTA +212C..212D ; Common # L& [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C +212E ; Common # So ESTIMATED SYMBOL +212F..2131 ; Common # L& [3] SCRIPT SMALL E..SCRIPT CAPITAL F +2132 ; Common # So TURNED CAPITAL F +2133..2134 ; Common # L& [2] SCRIPT CAPITAL M..SCRIPT SMALL O +2135..2138 ; Common # Lo [4] ALEF SYMBOL..DALET SYMBOL +2139 ; Common # L& INFORMATION SOURCE +213A..213B ; Common # So [2] ROTATED CAPITAL Q..FACSIMILE SIGN +213D..213F ; Common # L& [3] DOUBLE-STRUCK SMALL GAMMA..DOUBLE-STRUCK CAPITAL PI +2140..2144 ; Common # Sm [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y +2145..2149 ; Common # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J +214A ; Common # So PROPERTY LINE +214B ; Common # Sm TURNED AMPERSAND +2153..215F ; Common # No [13] VULGAR FRACTION ONE THIRD..FRACTION NUMERATOR ONE +2160..2183 ; Common # Nl [36] ROMAN NUMERAL ONE..ROMAN NUMERAL REVERSED ONE HUNDRED +2190..2194 ; Common # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW +2195..2199 ; Common # So [5] UP DOWN ARROW..SOUTH WEST ARROW +219A..219B ; Common # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE +219C..219F ; Common # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW +21A0 ; Common # Sm RIGHTWARDS TWO HEADED ARROW +21A1..21A2 ; Common # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL +21A3 ; Common # Sm RIGHTWARDS ARROW WITH TAIL +21A4..21A5 ; Common # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR +21A6 ; Common # Sm RIGHTWARDS ARROW FROM BAR +21A7..21AD ; Common # So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW +21AE ; Common # Sm LEFT RIGHT ARROW WITH STROKE +21AF..21CD ; Common # So [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE +21CE..21CF ; Common # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE +21D0..21D1 ; Common # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW +21D2 ; Common # Sm RIGHTWARDS DOUBLE ARROW +21D3 ; Common # So DOWNWARDS DOUBLE ARROW +21D4 ; Common # Sm LEFT RIGHT DOUBLE ARROW +21D5..21F3 ; Common # So [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW +21F4..22FF ; Common # Sm [268] RIGHT ARROW WITH SMALL CIRCLE..Z NOTATION BAG MEMBERSHIP +2300..2307 ; Common # So [8] DIAMETER SIGN..WAVY LINE +2308..230B ; Common # Sm [4] LEFT CEILING..RIGHT FLOOR +230C..231F ; Common # So [20] BOTTOM RIGHT CROP..BOTTOM RIGHT CORNER +2320..2321 ; Common # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL +2322..2328 ; Common # So [7] FROWN..KEYBOARD +2329 ; Common # Ps LEFT-POINTING ANGLE BRACKET +232A ; Common # Pe RIGHT-POINTING ANGLE BRACKET +232B..237B ; Common # So [81] ERASE TO THE LEFT..NOT CHECK MARK +237C ; Common # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +237D..239A ; Common # So [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL +239B..23B3 ; Common # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM +23B4 ; Common # Ps TOP SQUARE BRACKET +23B5 ; Common # Pe BOTTOM SQUARE BRACKET +23B6 ; Common # Po BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET +23B7..23D0 ; Common # So [26] RADICAL SYMBOL BOTTOM..VERTICAL LINE EXTENSION +2400..2426 ; Common # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO +2440..244A ; Common # So [11] OCR HOOK..OCR DOUBLE BACKSLASH +2460..249B ; Common # No [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP +249C..24E9 ; Common # So [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z +24EA..24FF ; Common # No [22] CIRCLED DIGIT ZERO..NEGATIVE CIRCLED DIGIT ZERO +2500..25B6 ; Common # So [183] BOX DRAWINGS LIGHT HORIZONTAL..BLACK RIGHT-POINTING TRIANGLE +25B7 ; Common # Sm WHITE RIGHT-POINTING TRIANGLE +25B8..25C0 ; Common # So [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE +25C1 ; Common # Sm WHITE LEFT-POINTING TRIANGLE +25C2..25F7 ; Common # So [54] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE CIRCLE WITH UPPER RIGHT QUADRANT +25F8..25FF ; Common # Sm [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE +2600..2617 ; Common # So [24] BLACK SUN WITH RAYS..BLACK SHOGI PIECE +2619..266E ; Common # So [86] REVERSED ROTATED FLORAL HEART BULLET..MUSIC NATURAL SIGN +266F ; Common # Sm MUSIC SHARP SIGN +2670..267D ; Common # So [14] WEST SYRIAC CROSS..PARTIALLY-RECYCLED PAPER SYMBOL +2680..2691 ; Common # So [18] DIE FACE-1..BLACK FLAG +26A0..26A1 ; Common # So [2] WARNING SIGN..HIGH VOLTAGE SIGN +2701..2704 ; Common # So [4] UPPER BLADE SCISSORS..WHITE SCISSORS +2706..2709 ; Common # So [4] TELEPHONE LOCATION SIGN..ENVELOPE +270C..2727 ; Common # So [28] VICTORY HAND..WHITE FOUR POINTED STAR +2729..274B ; Common # So [35] STRESS OUTLINED WHITE STAR..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK +274D ; Common # So SHADOWED WHITE CIRCLE +274F..2752 ; Common # So [4] LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE +2756 ; Common # So BLACK DIAMOND MINUS WHITE X +2758..275E ; Common # So [7] LIGHT VERTICAL BAR..HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT +2761..2767 ; Common # So [7] CURVED STEM PARAGRAPH SIGN ORNAMENT..ROTATED FLORAL HEART BULLET +2768 ; Common # Ps MEDIUM LEFT PARENTHESIS ORNAMENT +2769 ; Common # Pe MEDIUM RIGHT PARENTHESIS ORNAMENT +276A ; Common # Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT +276B ; Common # Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT +276C ; Common # Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT +276D ; Common # Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT +276E ; Common # Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT +276F ; Common # Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT +2770 ; Common # Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT +2771 ; Common # Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT +2772 ; Common # Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT +2773 ; Common # Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT +2774 ; Common # Ps MEDIUM LEFT CURLY BRACKET ORNAMENT +2775 ; Common # Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT +2776..2793 ; Common # No [30] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN +2794 ; Common # So HEAVY WIDE-HEADED RIGHTWARDS ARROW +2798..27AF ; Common # So [24] HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27B1..27BE ; Common # So [14] NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW +27D0..27E5 ; Common # Sm [22] WHITE DIAMOND WITH CENTRED DOT..WHITE SQUARE WITH RIGHTWARDS TICK +27E6 ; Common # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7 ; Common # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8 ; Common # Ps MATHEMATICAL LEFT ANGLE BRACKET +27E9 ; Common # Pe MATHEMATICAL RIGHT ANGLE BRACKET +27EA ; Common # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB ; Common # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +27F0..27FF ; Common # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW +2900..2982 ; Common # Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON +2983 ; Common # Ps LEFT WHITE CURLY BRACKET +2984 ; Common # Pe RIGHT WHITE CURLY BRACKET +2985 ; Common # Ps LEFT WHITE PARENTHESIS +2986 ; Common # Pe RIGHT WHITE PARENTHESIS +2987 ; Common # Ps Z NOTATION LEFT IMAGE BRACKET +2988 ; Common # Pe Z NOTATION RIGHT IMAGE BRACKET +2989 ; Common # Ps Z NOTATION LEFT BINDING BRACKET +298A ; Common # Pe Z NOTATION RIGHT BINDING BRACKET +298B ; Common # Ps LEFT SQUARE BRACKET WITH UNDERBAR +298C ; Common # Pe RIGHT SQUARE BRACKET WITH UNDERBAR +298D ; Common # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E ; Common # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F ; Common # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990 ; Common # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991 ; Common # Ps LEFT ANGLE BRACKET WITH DOT +2992 ; Common # Pe RIGHT ANGLE BRACKET WITH DOT +2993 ; Common # Ps LEFT ARC LESS-THAN BRACKET +2994 ; Common # Pe RIGHT ARC GREATER-THAN BRACKET +2995 ; Common # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET +2996 ; Common # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET +2997 ; Common # Ps LEFT BLACK TORTOISE SHELL BRACKET +2998 ; Common # Pe RIGHT BLACK TORTOISE SHELL BRACKET +2999..29D7 ; Common # Sm [63] DOTTED FENCE..BLACK HOURGLASS +29D8 ; Common # Ps LEFT WIGGLY FENCE +29D9 ; Common # Pe RIGHT WIGGLY FENCE +29DA ; Common # Ps LEFT DOUBLE WIGGLY FENCE +29DB ; Common # Pe RIGHT DOUBLE WIGGLY FENCE +29DC..29FB ; Common # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS +29FC ; Common # Ps LEFT-POINTING CURVED ANGLE BRACKET +29FD ; Common # Pe RIGHT-POINTING CURVED ANGLE BRACKET +29FE..2AFF ; Common # Sm [258] TINY..N-ARY WHITE VERTICAL BAR +2B00..2B0D ; Common # So [14] NORTH EAST WHITE ARROW..UP DOWN BLACK ARROW +2FF0..2FFB ; Common # So [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID +3000 ; Common # Zs IDEOGRAPHIC SPACE +3001..3003 ; Common # Po [3] IDEOGRAPHIC COMMA..DITTO MARK +3004 ; Common # So JAPANESE INDUSTRIAL STANDARD SYMBOL +3006 ; Common # Lo IDEOGRAPHIC CLOSING MARK +3008 ; Common # Ps LEFT ANGLE BRACKET +3009 ; Common # Pe RIGHT ANGLE BRACKET +300A ; Common # Ps LEFT DOUBLE ANGLE BRACKET +300B ; Common # Pe RIGHT DOUBLE ANGLE BRACKET +300C ; Common # Ps LEFT CORNER BRACKET +300D ; Common # Pe RIGHT CORNER BRACKET +300E ; Common # Ps LEFT WHITE CORNER BRACKET +300F ; Common # Pe RIGHT WHITE CORNER BRACKET +3010 ; Common # Ps LEFT BLACK LENTICULAR BRACKET +3011 ; Common # Pe RIGHT BLACK LENTICULAR BRACKET +3012..3013 ; Common # So [2] POSTAL MARK..GETA MARK +3014 ; Common # Ps LEFT TORTOISE SHELL BRACKET +3015 ; Common # Pe RIGHT TORTOISE SHELL BRACKET +3016 ; Common # Ps LEFT WHITE LENTICULAR BRACKET +3017 ; Common # Pe RIGHT WHITE LENTICULAR BRACKET +3018 ; Common # Ps LEFT WHITE TORTOISE SHELL BRACKET +3019 ; Common # Pe RIGHT WHITE TORTOISE SHELL BRACKET +301A ; Common # Ps LEFT WHITE SQUARE BRACKET +301B ; Common # Pe RIGHT WHITE SQUARE BRACKET +301C ; Common # Pd WAVE DASH +301D ; Common # Ps REVERSED DOUBLE PRIME QUOTATION MARK +301E..301F ; Common # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK +3020 ; Common # So POSTAL MARK FACE +3030 ; Common # Pd WAVY DASH +3036..3037 ; Common # So [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL +303C ; Common # Lo MASU MARK +303D ; Common # Po PART ALTERNATION MARK +303E..303F ; Common # So [2] IDEOGRAPHIC VARIATION INDICATOR..IDEOGRAPHIC HALF FILL SPACE +30A0 ; Common # Pd KATAKANA-HIRAGANA DOUBLE HYPHEN +30FB ; Common # Pc KATAKANA MIDDLE DOT +30FC ; Common # Lm KATAKANA-HIRAGANA PROLONGED SOUND MARK +3190..3191 ; Common # So [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK +3192..3195 ; Common # No [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK +3196..319F ; Common # So [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK +3220..3229 ; Common # No [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN +322A..3243 ; Common # So [26] PARENTHESIZED IDEOGRAPH MOON..PARENTHESIZED IDEOGRAPH REACH +3250 ; Common # So PARTNERSHIP SIGN +3251..325F ; Common # No [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE +327F ; Common # So KOREAN STANDARD SYMBOL +3280..3289 ; Common # No [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN +328A..32B0 ; Common # So [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT +32B1..32BF ; Common # No [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY +32C0..32FE ; Common # So [63] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..CIRCLED KATAKANA WO +3300..33FF ; Common # So [256] SQUARE APAATO..SQUARE GAL +4DC0..4DFF ; Common # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION +E000..F8FF ; Common # Co [6400] .. +FD3E ; Common # Ps ORNATE LEFT PARENTHESIS +FD3F ; Common # Pe ORNATE RIGHT PARENTHESIS +FDFD ; Common # So ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM +FE30 ; Common # Po PRESENTATION FORM FOR VERTICAL TWO DOT LEADER +FE31..FE32 ; Common # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH +FE33..FE34 ; Common # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE +FE35 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS +FE36 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS +FE37 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET +FE38 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET +FE39 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET +FE3A ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET +FE3B ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET +FE3C ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET +FE3D ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET +FE3E ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET +FE3F ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET +FE40 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET +FE41 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET +FE42 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET +FE43 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET +FE44 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET +FE45..FE46 ; Common # Po [2] SESAME DOT..WHITE SESAME DOT +FE47 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET +FE48 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET +FE49..FE4C ; Common # Po [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE +FE4D..FE4F ; Common # Pc [3] DASHED LOW LINE..WAVY LOW LINE +FE50..FE52 ; Common # Po [3] SMALL COMMA..SMALL FULL STOP +FE54..FE57 ; Common # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK +FE58 ; Common # Pd SMALL EM DASH +FE59 ; Common # Ps SMALL LEFT PARENTHESIS +FE5A ; Common # Pe SMALL RIGHT PARENTHESIS +FE5B ; Common # Ps SMALL LEFT CURLY BRACKET +FE5C ; Common # Pe SMALL RIGHT CURLY BRACKET +FE5D ; Common # Ps SMALL LEFT TORTOISE SHELL BRACKET +FE5E ; Common # Pe SMALL RIGHT TORTOISE SHELL BRACKET +FE5F..FE61 ; Common # Po [3] SMALL NUMBER SIGN..SMALL ASTERISK +FE62 ; Common # Sm SMALL PLUS SIGN +FE63 ; Common # Pd SMALL HYPHEN-MINUS +FE64..FE66 ; Common # Sm [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN +FE68 ; Common # Po SMALL REVERSE SOLIDUS +FE69 ; Common # Sc SMALL DOLLAR SIGN +FE6A..FE6B ; Common # Po [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT +FEFF ; Common # Cf ZERO WIDTH NO-BREAK SPACE +FF01..FF03 ; Common # Po [3] FULLWIDTH EXCLAMATION MARK..FULLWIDTH NUMBER SIGN +FF04 ; Common # Sc FULLWIDTH DOLLAR SIGN +FF05..FF07 ; Common # Po [3] FULLWIDTH PERCENT SIGN..FULLWIDTH APOSTROPHE +FF08 ; Common # Ps FULLWIDTH LEFT PARENTHESIS +FF09 ; Common # Pe FULLWIDTH RIGHT PARENTHESIS +FF0A ; Common # Po FULLWIDTH ASTERISK +FF0B ; Common # Sm FULLWIDTH PLUS SIGN +FF0C ; Common # Po FULLWIDTH COMMA +FF0D ; Common # Pd FULLWIDTH HYPHEN-MINUS +FF0E..FF0F ; Common # Po [2] FULLWIDTH FULL STOP..FULLWIDTH SOLIDUS +FF10..FF19 ; Common # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE +FF1A..FF1B ; Common # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON +FF1C..FF1E ; Common # Sm [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN +FF1F..FF20 ; Common # Po [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT +FF3B ; Common # Ps FULLWIDTH LEFT SQUARE BRACKET +FF3C ; Common # Po FULLWIDTH REVERSE SOLIDUS +FF3D ; Common # Pe FULLWIDTH RIGHT SQUARE BRACKET +FF3E ; Common # Sk FULLWIDTH CIRCUMFLEX ACCENT +FF3F ; Common # Pc FULLWIDTH LOW LINE +FF40 ; Common # Sk FULLWIDTH GRAVE ACCENT +FF5B ; Common # Ps FULLWIDTH LEFT CURLY BRACKET +FF5C ; Common # Sm FULLWIDTH VERTICAL LINE +FF5D ; Common # Pe FULLWIDTH RIGHT CURLY BRACKET +FF5E ; Common # Sm FULLWIDTH TILDE +FF5F ; Common # Ps FULLWIDTH LEFT WHITE PARENTHESIS +FF60 ; Common # Pe FULLWIDTH RIGHT WHITE PARENTHESIS +FF61 ; Common # Po HALFWIDTH IDEOGRAPHIC FULL STOP +FF62 ; Common # Ps HALFWIDTH LEFT CORNER BRACKET +FF63 ; Common # Pe HALFWIDTH RIGHT CORNER BRACKET +FF64 ; Common # Po HALFWIDTH IDEOGRAPHIC COMMA +FF65 ; Common # Pc HALFWIDTH KATAKANA MIDDLE DOT +FFE0..FFE1 ; Common # Sc [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN +FFE2 ; Common # Sm FULLWIDTH NOT SIGN +FFE3 ; Common # Sk FULLWIDTH MACRON +FFE4 ; Common # So FULLWIDTH BROKEN BAR +FFE5..FFE6 ; Common # Sc [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN +FFE8 ; Common # So HALFWIDTH FORMS LIGHT VERTICAL +FFE9..FFEC ; Common # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW +FFED..FFEE ; Common # So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE +FFF9..FFFB ; Common # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR +FFFC..FFFD ; Common # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER +10100..10101 ; Common # Po [2] AEGEAN WORD SEPARATOR LINE..AEGEAN WORD SEPARATOR DOT +10102 ; Common # So AEGEAN CHECK MARK +10107..10133 ; Common # No [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND +10137..1013F ; Common # So [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT +1D000..1D0F5 ; Common # So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO +1D100..1D126 ; Common # So [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2 +1D12A..1D164 ; Common # So [59] MUSICAL SYMBOL DOUBLE SHARP..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE +1D165..1D166 ; Common # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM +1D16A..1D16C ; Common # So [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3 +1D16D..1D172 ; Common # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 +1D173..1D17A ; Common # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE +1D183..1D184 ; Common # So [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN +1D18C..1D1A9 ; Common # So [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH +1D1AE..1D1DD ; Common # So [48] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL PES SUBPUNCTIS +1D300..1D356 ; Common # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING +1D400..1D454 ; Common # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G +1D456..1D49C ; Common # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A +1D49E..1D49F ; Common # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D +1D4A2 ; Common # L& MATHEMATICAL SCRIPT CAPITAL G +1D4A5..1D4A6 ; Common # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K +1D4A9..1D4AC ; Common # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q +1D4AE..1D4B9 ; Common # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D +1D4BB ; Common # L& MATHEMATICAL SCRIPT SMALL F +1D4BD..1D4C3 ; Common # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N +1D4C5..1D505 ; Common # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B +1D507..1D50A ; Common # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G +1D50D..1D514 ; Common # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q +1D516..1D51C ; Common # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y +1D51E..1D539 ; Common # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B..1D53E ; Common # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540..1D544 ; Common # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546 ; Common # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A..1D550 ; Common # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552..1D6A3 ; Common # L& [338] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL MONOSPACE SMALL Z +1D6A8..1D6C0 ; Common # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA +1D6C1 ; Common # Sm MATHEMATICAL BOLD NABLA +1D6C2..1D6DA ; Common # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA +1D6DB ; Common # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6DC..1D6FA ; Common # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FB ; Common # Sm MATHEMATICAL ITALIC NABLA +1D6FC..1D714 ; Common # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA +1D715 ; Common # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D716..1D734 ; Common # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D735 ; Common # Sm MATHEMATICAL BOLD ITALIC NABLA +1D736..1D74E ; Common # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D74F ; Common # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D750..1D76E ; Common # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D76F ; Common # Sm MATHEMATICAL SANS-SERIF BOLD NABLA +1D770..1D788 ; Common # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D789 ; Common # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D78A..1D7A8 ; Common # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7A9 ; Common # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7AA..1D7C2 ; Common # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C3 ; Common # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL +1D7C4..1D7C9 ; Common # L& [6] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL +1D7CE..1D7FF ; Common # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE +E0001 ; Common # Cf LANGUAGE TAG +E0020..E007F ; Common # Cf [96] TAG SPACE..CANCEL TAG +F0000..FFFFD ; Common # Co [65534] .. +100000..10FFFD; Common # Co [65534] .. + +# The above property value applies to 880197 code points not listed here. +# Total code points: 1022471 + +# ================================================ + +0041..005A ; Latin # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z +0061..007A ; Latin # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z +00AA ; Latin # L& FEMININE ORDINAL INDICATOR +00BA ; Latin # L& MASCULINE ORDINAL INDICATOR +00C0..00D6 ; Latin # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS +00D8..00F6 ; Latin # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS +00F8..01BA ; Latin # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL +01BB ; Latin # Lo LATIN LETTER TWO WITH STROKE +01BC..01BF ; Latin # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN +01C0..01C3 ; Latin # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK +01C4..0236 ; Latin # L& [115] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER T WITH CURL +0250..02AF ; Latin # L& [96] LATIN SMALL LETTER TURNED A..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +02B0..02B8 ; Latin # Lm [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y +02E0..02E4 ; Latin # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +1D00..1D25 ; Latin # L& [38] LATIN LETTER SMALL CAPITAL A..LATIN LETTER AIN +1D2C..1D5C ; Latin # Lm [49] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL AIN +1D62..1D65 ; Latin # L& [4] LATIN SUBSCRIPT SMALL LETTER I..LATIN SUBSCRIPT SMALL LETTER V +1D6B ; Latin # L& LATIN SMALL LETTER UE +1E00..1E9B ; Latin # L& [156] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER LONG S WITH DOT ABOVE +1EA0..1EF9 ; Latin # L& [90] LATIN CAPITAL LETTER A WITH DOT BELOW..LATIN SMALL LETTER Y WITH TILDE +2071 ; Latin # L& SUPERSCRIPT LATIN SMALL LETTER I +207F ; Latin # L& SUPERSCRIPT LATIN SMALL LETTER N +212A..212B ; Latin # L& [2] KELVIN SIGN..ANGSTROM SIGN +FB00..FB06 ; Latin # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST +FF21..FF3A ; Latin # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z +FF41..FF5A ; Latin # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z # Total code points: 938 # ================================================ -00B5 ; GREEK # L& MICRO SIGN -037A ; GREEK # Lm GREEK YPOGEGRAMMENI -0386 ; GREEK # L& GREEK CAPITAL LETTER ALPHA WITH TONOS -0388..038A ; GREEK # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS -038C ; GREEK # L& GREEK CAPITAL LETTER OMICRON WITH TONOS -038E..03A1 ; GREEK # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO -03A3..03CE ; GREEK # L& [44] GREEK CAPITAL LETTER SIGMA..GREEK SMALL LETTER OMEGA WITH TONOS -03D0..03F5 ; GREEK # L& [38] GREEK BETA SYMBOL..GREEK LUNATE EPSILON SYMBOL -03F7..03FB ; GREEK # L& [5] GREEK CAPITAL LETTER SHO..GREEK SMALL LETTER SAN -1D26..1D2A ; GREEK # L& [5] GREEK LETTER SMALL CAPITAL GAMMA..GREEK LETTER SMALL CAPITAL PSI -1D5D..1D61 ; GREEK # Lm [5] MODIFIER LETTER SMALL BETA..MODIFIER LETTER SMALL CHI -1D66..1D6A ; GREEK # L& [5] GREEK SUBSCRIPT SMALL LETTER BETA..GREEK SUBSCRIPT SMALL LETTER CHI -1F00..1F15 ; GREEK # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA -1F18..1F1D ; GREEK # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA -1F20..1F45 ; GREEK # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA -1F48..1F4D ; GREEK # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA -1F50..1F57 ; GREEK # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI -1F59 ; GREEK # L& GREEK CAPITAL LETTER UPSILON WITH DASIA -1F5B ; GREEK # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA -1F5D ; GREEK # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA -1F5F..1F7D ; GREEK # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA -1F80..1FB4 ; GREEK # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI -1FB6..1FBC ; GREEK # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI -1FBE ; GREEK # L& GREEK PROSGEGRAMMENI -1FC2..1FC4 ; GREEK # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI -1FC6..1FCC ; GREEK # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI -1FD0..1FD3 ; GREEK # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA -1FD6..1FDB ; GREEK # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA -1FE0..1FEC ; GREEK # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA -1FF2..1FF4 ; GREEK # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI -1FF6..1FFC ; GREEK # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI -2126 ; GREEK # L& OHM SIGN - -# Total code points: 348 - -# ================================================ - -0400..0481 ; CYRILLIC # L& [130] CYRILLIC CAPITAL LETTER IE WITH GRAVE..CYRILLIC SMALL LETTER KOPPA -0483..0486 ; CYRILLIC # Mn [4] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC PSILI PNEUMATA -048A..04CE ; CYRILLIC # L& [69] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EM WITH TAIL -04D0..04F5 ; CYRILLIC # L& [38] CYRILLIC CAPITAL LETTER A WITH BREVE..CYRILLIC SMALL LETTER CHE WITH DIAERESIS -04F8..04F9 ; CYRILLIC # L& [2] CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS..CYRILLIC SMALL LETTER YERU WITH DIAERESIS -0500..050F ; CYRILLIC # L& [16] CYRILLIC CAPITAL LETTER KOMI DE..CYRILLIC SMALL LETTER KOMI TJE -1D2B ; CYRILLIC # L& CYRILLIC LETTER SMALL CAPITAL EL - -# Total code points: 260 - -# ================================================ - -0531..0556 ; ARMENIAN # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH -0559 ; ARMENIAN # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING -0561..0587 ; ARMENIAN # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN -FB13..FB17 ; ARMENIAN # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH +0374..0375 ; Greek # Sk [2] GREEK NUMERAL SIGN..GREEK LOWER NUMERAL SIGN +037A ; Greek # Lm GREEK YPOGEGRAMMENI +0384..0385 ; Greek # Sk [2] GREEK TONOS..GREEK DIALYTIKA TONOS +0386 ; Greek # L& GREEK CAPITAL LETTER ALPHA WITH TONOS +0388..038A ; Greek # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS +038C ; Greek # L& GREEK CAPITAL LETTER OMICRON WITH TONOS +038E..03A1 ; Greek # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO +03A3..03CE ; Greek # L& [44] GREEK CAPITAL LETTER SIGMA..GREEK SMALL LETTER OMEGA WITH TONOS +03D0..03F5 ; Greek # L& [38] GREEK BETA SYMBOL..GREEK LUNATE EPSILON SYMBOL +03F6 ; Greek # Sm GREEK REVERSED LUNATE EPSILON SYMBOL +03F7..03FB ; Greek # L& [5] GREEK CAPITAL LETTER SHO..GREEK SMALL LETTER SAN +1D26..1D2A ; Greek # L& [5] GREEK LETTER SMALL CAPITAL GAMMA..GREEK LETTER SMALL CAPITAL PSI +1D5D..1D61 ; Greek # Lm [5] MODIFIER LETTER SMALL BETA..MODIFIER LETTER SMALL CHI +1D66..1D6A ; Greek # L& [5] GREEK SUBSCRIPT SMALL LETTER BETA..GREEK SUBSCRIPT SMALL LETTER CHI +1F00..1F15 ; Greek # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F18..1F1D ; Greek # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F20..1F45 ; Greek # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F48..1F4D ; Greek # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50..1F57 ; Greek # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F59 ; Greek # L& GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B ; Greek # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D ; Greek # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F..1F7D ; Greek # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA +1F80..1FB4 ; Greek # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6..1FBC ; Greek # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBD ; Greek # Sk GREEK KORONIS +1FBE ; Greek # L& GREEK PROSGEGRAMMENI +1FBF..1FC1 ; Greek # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI +1FC2..1FC4 ; Greek # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6..1FCC ; Greek # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FCD..1FCF ; Greek # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI +1FD0..1FD3 ; Greek # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6..1FDB ; Greek # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA +1FDD..1FDF ; Greek # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI +1FE0..1FEC ; Greek # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA +1FED..1FEF ; Greek # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA +1FF2..1FF4 ; Greek # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6..1FFC ; Greek # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +1FFD..1FFE ; Greek # Sk [2] GREEK OXIA..GREEK DASIA +2126 ; Greek # L& OHM SIGN + +# Total code points: 367 -# Total code points: 83 +# ================================================ + +0400..0481 ; Cyrillic # L& [130] CYRILLIC CAPITAL LETTER IE WITH GRAVE..CYRILLIC SMALL LETTER KOPPA +0482 ; Cyrillic # So CYRILLIC THOUSANDS SIGN +0483..0486 ; Cyrillic # Mn [4] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC PSILI PNEUMATA +0488..0489 ; Cyrillic # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN +048A..04CE ; Cyrillic # L& [69] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EM WITH TAIL +04D0..04F5 ; Cyrillic # L& [38] CYRILLIC CAPITAL LETTER A WITH BREVE..CYRILLIC SMALL LETTER CHE WITH DIAERESIS +04F8..04F9 ; Cyrillic # L& [2] CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS..CYRILLIC SMALL LETTER YERU WITH DIAERESIS +0500..050F ; Cyrillic # L& [16] CYRILLIC CAPITAL LETTER KOMI DE..CYRILLIC SMALL LETTER KOMI TJE +1D2B ; Cyrillic # L& CYRILLIC LETTER SMALL CAPITAL EL + +# Total code points: 263 # ================================================ -05D0..05EA ; HEBREW # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV -05F0..05F2 ; HEBREW # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD -FB1D ; HEBREW # Lo HEBREW LETTER YOD WITH HIRIQ -FB1F..FB28 ; HEBREW # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV -FB2A..FB36 ; HEBREW # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH -FB38..FB3C ; HEBREW # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH -FB3E ; HEBREW # Lo HEBREW LETTER MEM WITH DAGESH -FB40..FB41 ; HEBREW # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH -FB43..FB44 ; HEBREW # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH -FB46..FB4F ; HEBREW # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED +0531..0556 ; Armenian # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH +0559 ; Armenian # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +055A..055F ; Armenian # Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK +0561..0587 ; Armenian # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN +058A ; Armenian # Pd ARMENIAN HYPHEN +FB13..FB17 ; Armenian # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH -# Total code points: 74 +# Total code points: 90 # ================================================ -0621..063A ; ARABIC # Lo [26] ARABIC LETTER HAMZA..ARABIC LETTER GHAIN -0641..064A ; ARABIC # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH -066E..066F ; ARABIC # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF -0671..06D3 ; ARABIC # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE -06D5 ; ARABIC # Lo ARABIC LETTER AE -06E5..06E6 ; ARABIC # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH -06EE..06EF ; ARABIC # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V -06FA..06FC ; ARABIC # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW -06FF ; ARABIC # Lo ARABIC LETTER HEH WITH INVERTED V -FB50..FBB1 ; ARABIC # Lo [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM -FBD3..FD3D ; ARABIC # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM -FD50..FD8F ; ARABIC # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM -FD92..FDC7 ; ARABIC # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM -FDF0..FDFB ; ARABIC # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU -FE70..FE74 ; ARABIC # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM -FE76..FEFC ; ARABIC # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM +0591..05A1 ; Hebrew # Mn [17] HEBREW ACCENT ETNAHTA..HEBREW ACCENT PAZER +05A3..05B9 ; Hebrew # Mn [23] HEBREW ACCENT MUNAH..HEBREW POINT HOLAM +05BB..05BD ; Hebrew # Mn [3] HEBREW POINT QUBUTS..HEBREW POINT METEG +05BE ; Hebrew # Po HEBREW PUNCTUATION MAQAF +05BF ; Hebrew # Mn HEBREW POINT RAFE +05C0 ; Hebrew # Po HEBREW PUNCTUATION PASEQ +05C1..05C2 ; Hebrew # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT +05C3 ; Hebrew # Po HEBREW PUNCTUATION SOF PASUQ +05C4 ; Hebrew # Mn HEBREW MARK UPPER DOT +05D0..05EA ; Hebrew # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV +05F0..05F2 ; Hebrew # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD +05F3..05F4 ; Hebrew # Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM +FB1D ; Hebrew # Lo HEBREW LETTER YOD WITH HIRIQ +FB1E ; Hebrew # Mn HEBREW POINT JUDEO-SPANISH VARIKA +FB1F..FB28 ; Hebrew # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV +FB29 ; Hebrew # Sm HEBREW LETTER ALTERNATIVE PLUS SIGN +FB2A..FB36 ; Hebrew # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH +FB38..FB3C ; Hebrew # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH +FB3E ; Hebrew # Lo HEBREW LETTER MEM WITH DAGESH +FB40..FB41 ; Hebrew # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH +FB43..FB44 ; Hebrew # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH +FB46..FB4F ; Hebrew # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED + +# Total code points: 128 + +# ================================================ -# Total code points: 877 +060D ; Arabic # Po ARABIC DATE SEPARATOR +060E..060F ; Arabic # So [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA +0610..0615 ; Arabic # Mn [6] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL HIGH TAH +0621..063A ; Arabic # Lo [26] ARABIC LETTER HAMZA..ARABIC LETTER GHAIN +0641..064A ; Arabic # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH +0656..0658 ; Arabic # Mn [3] ARABIC SUBSCRIPT ALEF..ARABIC MARK NOON GHUNNA +066A..066D ; Arabic # Po [4] ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR +066E..066F ; Arabic # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF +0671..06D3 ; Arabic # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +06D4 ; Arabic # Po ARABIC FULL STOP +06D5 ; Arabic # Lo ARABIC LETTER AE +06D6..06DC ; Arabic # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN +06DE ; Arabic # Me ARABIC START OF RUB EL HIZB +06DF..06E4 ; Arabic # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA +06E5..06E6 ; Arabic # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH +06E7..06E8 ; Arabic # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON +06E9 ; Arabic # So ARABIC PLACE OF SAJDAH +06EA..06ED ; Arabic # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM +06EE..06EF ; Arabic # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V +06F0..06F9 ; Arabic # Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE +06FA..06FC ; Arabic # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW +06FD..06FE ; Arabic # So [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN +06FF ; Arabic # Lo ARABIC LETTER HEH WITH INVERTED V +FB50..FBB1 ; Arabic # Lo [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +FBD3..FD3D ; Arabic # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +FD50..FD8F ; Arabic # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +FD92..FDC7 ; Arabic # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FDF0..FDFB ; Arabic # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU +FDFC ; Arabic # Sc RIAL SIGN +FE70..FE74 ; Arabic # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM +FE76..FEFC ; Arabic # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM + +# Total code points: 928 # ================================================ -0710 ; SYRIAC # Lo SYRIAC LETTER ALAPH -0711 ; SYRIAC # Mn SYRIAC LETTER SUPERSCRIPT ALAPH -0712..072F ; SYRIAC # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH -0730..074A ; SYRIAC # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH -074D..074F ; SYRIAC # Lo [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE +0700..070D ; Syriac # Po [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS +070F ; Syriac # Cf SYRIAC ABBREVIATION MARK +0710 ; Syriac # Lo SYRIAC LETTER ALAPH +0711 ; Syriac # Mn SYRIAC LETTER SUPERSCRIPT ALAPH +0712..072F ; Syriac # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH +0730..074A ; Syriac # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH +074D..074F ; Syriac # Lo [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE -# Total code points: 62 +# Total code points: 77 # ================================================ -0780..07A5 ; THAANA # Lo [38] THAANA LETTER HAA..THAANA LETTER WAAVU -07A6..07B0 ; THAANA # Mn [11] THAANA ABAFILI..THAANA SUKUN -07B1 ; THAANA # Lo THAANA LETTER NAA +0780..07A5 ; Thaana # Lo [38] THAANA LETTER HAA..THAANA LETTER WAAVU +07A6..07B0 ; Thaana # Mn [11] THAANA ABAFILI..THAANA SUKUN +07B1 ; Thaana # Lo THAANA LETTER NAA # Total code points: 50 # ================================================ -0901..0902 ; DEVANAGARI # Mn [2] DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN ANUSVARA -0903 ; DEVANAGARI # Mc DEVANAGARI SIGN VISARGA -0904..0939 ; DEVANAGARI # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA -093C ; DEVANAGARI # Mn DEVANAGARI SIGN NUKTA -093D ; DEVANAGARI # Lo DEVANAGARI SIGN AVAGRAHA -093E..0940 ; DEVANAGARI # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II -0941..0948 ; DEVANAGARI # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI -0949..094C ; DEVANAGARI # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU -094D ; DEVANAGARI # Mn DEVANAGARI SIGN VIRAMA -0950 ; DEVANAGARI # Lo DEVANAGARI OM -0951..0954 ; DEVANAGARI # Mn [4] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI ACUTE ACCENT -0958..0961 ; DEVANAGARI # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL -0962..0963 ; DEVANAGARI # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL -0966..096F ; DEVANAGARI # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE +0901..0902 ; Devanagari # Mn [2] DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN ANUSVARA +0903 ; Devanagari # Mc DEVANAGARI SIGN VISARGA +0904..0939 ; Devanagari # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA +093C ; Devanagari # Mn DEVANAGARI SIGN NUKTA +093D ; Devanagari # Lo DEVANAGARI SIGN AVAGRAHA +093E..0940 ; Devanagari # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II +0941..0948 ; Devanagari # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI +0949..094C ; Devanagari # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU +094D ; Devanagari # Mn DEVANAGARI SIGN VIRAMA +0950 ; Devanagari # Lo DEVANAGARI OM +0951..0954 ; Devanagari # Mn [4] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI ACUTE ACCENT +0958..0961 ; Devanagari # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL +0962..0963 ; Devanagari # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL +0966..096F ; Devanagari # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE # Total code points: 102 # ================================================ -0981 ; BENGALI # Mn BENGALI SIGN CANDRABINDU -0982..0983 ; BENGALI # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA -0985..098C ; BENGALI # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L -098F..0990 ; BENGALI # Lo [2] BENGALI LETTER E..BENGALI LETTER AI -0993..09A8 ; BENGALI # Lo [22] BENGALI LETTER O..BENGALI LETTER NA -09AA..09B0 ; BENGALI # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA -09B2 ; BENGALI # Lo BENGALI LETTER LA -09B6..09B9 ; BENGALI # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA -09BC ; BENGALI # Mn BENGALI SIGN NUKTA -09BD ; BENGALI # Lo BENGALI SIGN AVAGRAHA -09BE..09C0 ; BENGALI # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II -09C1..09C4 ; BENGALI # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR -09C7..09C8 ; BENGALI # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI -09CB..09CC ; BENGALI # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU -09CD ; BENGALI # Mn BENGALI SIGN VIRAMA -09D7 ; BENGALI # Mc BENGALI AU LENGTH MARK -09DC..09DD ; BENGALI # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA -09DF..09E1 ; BENGALI # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL -09E2..09E3 ; BENGALI # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL -09E6..09EF ; BENGALI # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE -09F0..09F1 ; BENGALI # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL +0981 ; Bengali # Mn BENGALI SIGN CANDRABINDU +0982..0983 ; Bengali # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA +0985..098C ; Bengali # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L +098F..0990 ; Bengali # Lo [2] BENGALI LETTER E..BENGALI LETTER AI +0993..09A8 ; Bengali # Lo [22] BENGALI LETTER O..BENGALI LETTER NA +09AA..09B0 ; Bengali # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA +09B2 ; Bengali # Lo BENGALI LETTER LA +09B6..09B9 ; Bengali # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA +09BC ; Bengali # Mn BENGALI SIGN NUKTA +09BD ; Bengali # Lo BENGALI SIGN AVAGRAHA +09BE..09C0 ; Bengali # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II +09C1..09C4 ; Bengali # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR +09C7..09C8 ; Bengali # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI +09CB..09CC ; Bengali # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU +09CD ; Bengali # Mn BENGALI SIGN VIRAMA +09D7 ; Bengali # Mc BENGALI AU LENGTH MARK +09DC..09DD ; Bengali # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA +09DF..09E1 ; Bengali # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL +09E2..09E3 ; Bengali # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL +09E6..09EF ; Bengali # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE +09F0..09F1 ; Bengali # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL +09F2..09F3 ; Bengali # Sc [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN +09F4..09F9 ; Bengali # No [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN +09FA ; Bengali # So BENGALI ISSHAR + +# Total code points: 90 -# Total code points: 81 +# ================================================ + +0A01..0A02 ; Gurmukhi # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI +0A03 ; Gurmukhi # Mc GURMUKHI SIGN VISARGA +0A05..0A0A ; Gurmukhi # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU +0A0F..0A10 ; Gurmukhi # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI +0A13..0A28 ; Gurmukhi # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA +0A2A..0A30 ; Gurmukhi # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA +0A32..0A33 ; Gurmukhi # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA +0A35..0A36 ; Gurmukhi # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA +0A38..0A39 ; Gurmukhi # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA +0A3C ; Gurmukhi # Mn GURMUKHI SIGN NUKTA +0A3E..0A40 ; Gurmukhi # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II +0A41..0A42 ; Gurmukhi # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU +0A47..0A48 ; Gurmukhi # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI +0A4B..0A4D ; Gurmukhi # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA +0A59..0A5C ; Gurmukhi # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA +0A5E ; Gurmukhi # Lo GURMUKHI LETTER FA +0A66..0A6F ; Gurmukhi # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE +0A70..0A71 ; Gurmukhi # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK +0A72..0A74 ; Gurmukhi # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR + +# Total code points: 77 # ================================================ -0A02 ; GURMUKHI # Mn GURMUKHI SIGN BINDI -0A03 ; GURMUKHI # Mc GURMUKHI SIGN VISARGA -0A05..0A0A ; GURMUKHI # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU -0A0F..0A10 ; GURMUKHI # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI -0A13..0A28 ; GURMUKHI # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA -0A2A..0A30 ; GURMUKHI # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA -0A32..0A33 ; GURMUKHI # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA -0A35..0A36 ; GURMUKHI # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA -0A38..0A39 ; GURMUKHI # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA -0A3C ; GURMUKHI # Mn GURMUKHI SIGN NUKTA -0A3E..0A40 ; GURMUKHI # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II -0A41..0A42 ; GURMUKHI # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU -0A47..0A48 ; GURMUKHI # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI -0A4B..0A4D ; GURMUKHI # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA -0A59..0A5C ; GURMUKHI # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA -0A5E ; GURMUKHI # Lo GURMUKHI LETTER FA -0A66..0A6F ; GURMUKHI # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE -0A70..0A71 ; GURMUKHI # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK -0A72..0A74 ; GURMUKHI # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR - -# Total code points: 76 - -# ================================================ - -0A81..0A82 ; GUJARATI # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA -0A83 ; GUJARATI # Mc GUJARATI SIGN VISARGA -0A85..0A8D ; GUJARATI # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E -0A8F..0A91 ; GUJARATI # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O -0A93..0AA8 ; GUJARATI # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA -0AAA..0AB0 ; GUJARATI # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA -0AB2..0AB3 ; GUJARATI # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA -0AB5..0AB9 ; GUJARATI # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA -0ABC ; GUJARATI # Mn GUJARATI SIGN NUKTA -0ABD ; GUJARATI # Lo GUJARATI SIGN AVAGRAHA -0ABE..0AC0 ; GUJARATI # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II -0AC1..0AC5 ; GUJARATI # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E -0AC7..0AC8 ; GUJARATI # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI -0AC9 ; GUJARATI # Mc GUJARATI VOWEL SIGN CANDRA O -0ACB..0ACC ; GUJARATI # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU -0ACD ; GUJARATI # Mn GUJARATI SIGN VIRAMA -0AD0 ; GUJARATI # Lo GUJARATI OM -0AE0..0AE1 ; GUJARATI # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL -0AE2..0AE3 ; GUJARATI # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL -0AE6..0AEF ; GUJARATI # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE +0A81..0A82 ; Gujarati # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA +0A83 ; Gujarati # Mc GUJARATI SIGN VISARGA +0A85..0A8D ; Gujarati # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E +0A8F..0A91 ; Gujarati # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O +0A93..0AA8 ; Gujarati # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA +0AAA..0AB0 ; Gujarati # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA +0AB2..0AB3 ; Gujarati # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA +0AB5..0AB9 ; Gujarati # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA +0ABC ; Gujarati # Mn GUJARATI SIGN NUKTA +0ABD ; Gujarati # Lo GUJARATI SIGN AVAGRAHA +0ABE..0AC0 ; Gujarati # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II +0AC1..0AC5 ; Gujarati # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E +0AC7..0AC8 ; Gujarati # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI +0AC9 ; Gujarati # Mc GUJARATI VOWEL SIGN CANDRA O +0ACB..0ACC ; Gujarati # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU +0ACD ; Gujarati # Mn GUJARATI SIGN VIRAMA +0AD0 ; Gujarati # Lo GUJARATI OM +0AE0..0AE1 ; Gujarati # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL +0AE2..0AE3 ; Gujarati # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL +0AE6..0AEF ; Gujarati # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE +0AF1 ; Gujarati # Sc GUJARATI RUPEE SIGN -# Total code points: 82 +# Total code points: 83 # ================================================ -0B01 ; ORIYA # Mn ORIYA SIGN CANDRABINDU -0B02..0B03 ; ORIYA # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA -0B05..0B0C ; ORIYA # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L -0B0F..0B10 ; ORIYA # Lo [2] ORIYA LETTER E..ORIYA LETTER AI -0B13..0B28 ; ORIYA # Lo [22] ORIYA LETTER O..ORIYA LETTER NA -0B2A..0B30 ; ORIYA # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA -0B32..0B33 ; ORIYA # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA -0B35..0B39 ; ORIYA # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA -0B3C ; ORIYA # Mn ORIYA SIGN NUKTA -0B3D ; ORIYA # Lo ORIYA SIGN AVAGRAHA -0B3E ; ORIYA # Mc ORIYA VOWEL SIGN AA -0B3F ; ORIYA # Mn ORIYA VOWEL SIGN I -0B40 ; ORIYA # Mc ORIYA VOWEL SIGN II -0B41..0B43 ; ORIYA # Mn [3] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC R -0B47..0B48 ; ORIYA # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI -0B4B..0B4C ; ORIYA # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU -0B4D ; ORIYA # Mn ORIYA SIGN VIRAMA -0B56 ; ORIYA # Mn ORIYA AI LENGTH MARK -0B57 ; ORIYA # Mc ORIYA AU LENGTH MARK -0B5C..0B5D ; ORIYA # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA -0B5F..0B61 ; ORIYA # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL -0B66..0B6F ; ORIYA # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE -0B71 ; ORIYA # Lo ORIYA LETTER WA +0B01 ; Oriya # Mn ORIYA SIGN CANDRABINDU +0B02..0B03 ; Oriya # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA +0B05..0B0C ; Oriya # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L +0B0F..0B10 ; Oriya # Lo [2] ORIYA LETTER E..ORIYA LETTER AI +0B13..0B28 ; Oriya # Lo [22] ORIYA LETTER O..ORIYA LETTER NA +0B2A..0B30 ; Oriya # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA +0B32..0B33 ; Oriya # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA +0B35..0B39 ; Oriya # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA +0B3C ; Oriya # Mn ORIYA SIGN NUKTA +0B3D ; Oriya # Lo ORIYA SIGN AVAGRAHA +0B3E ; Oriya # Mc ORIYA VOWEL SIGN AA +0B3F ; Oriya # Mn ORIYA VOWEL SIGN I +0B40 ; Oriya # Mc ORIYA VOWEL SIGN II +0B41..0B43 ; Oriya # Mn [3] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC R +0B47..0B48 ; Oriya # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI +0B4B..0B4C ; Oriya # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU +0B4D ; Oriya # Mn ORIYA SIGN VIRAMA +0B56 ; Oriya # Mn ORIYA AI LENGTH MARK +0B57 ; Oriya # Mc ORIYA AU LENGTH MARK +0B5C..0B5D ; Oriya # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA +0B5F..0B61 ; Oriya # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL +0B66..0B6F ; Oriya # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE +0B70 ; Oriya # So ORIYA ISSHAR +0B71 ; Oriya # Lo ORIYA LETTER WA -# Total code points: 80 +# Total code points: 81 + +# ================================================ + +0B82 ; Tamil # Mn TAMIL SIGN ANUSVARA +0B83 ; Tamil # Lo TAMIL SIGN VISARGA +0B85..0B8A ; Tamil # Lo [6] TAMIL LETTER A..TAMIL LETTER UU +0B8E..0B90 ; Tamil # Lo [3] TAMIL LETTER E..TAMIL LETTER AI +0B92..0B95 ; Tamil # Lo [4] TAMIL LETTER O..TAMIL LETTER KA +0B99..0B9A ; Tamil # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA +0B9C ; Tamil # Lo TAMIL LETTER JA +0B9E..0B9F ; Tamil # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA +0BA3..0BA4 ; Tamil # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA +0BA8..0BAA ; Tamil # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA +0BAE..0BB5 ; Tamil # Lo [8] TAMIL LETTER MA..TAMIL LETTER VA +0BB7..0BB9 ; Tamil # Lo [3] TAMIL LETTER SSA..TAMIL LETTER HA +0BBE..0BBF ; Tamil # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I +0BC0 ; Tamil # Mn TAMIL VOWEL SIGN II +0BC1..0BC2 ; Tamil # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU +0BC6..0BC8 ; Tamil # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI +0BCA..0BCC ; Tamil # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU +0BCD ; Tamil # Mn TAMIL SIGN VIRAMA +0BD7 ; Tamil # Mc TAMIL AU LENGTH MARK +0BE7..0BEF ; Tamil # Nd [9] TAMIL DIGIT ONE..TAMIL DIGIT NINE +0BF0..0BF2 ; Tamil # No [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND +0BF3..0BF8 ; Tamil # So [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN +0BF9 ; Tamil # Sc TAMIL RUPEE SIGN +0BFA ; Tamil # So TAMIL NUMBER SIGN + +# Total code points: 69 # ================================================ -0B82 ; TAMIL # Mn TAMIL SIGN ANUSVARA -0B83 ; TAMIL # Lo TAMIL SIGN VISARGA -0B85..0B8A ; TAMIL # Lo [6] TAMIL LETTER A..TAMIL LETTER UU -0B8E..0B90 ; TAMIL # Lo [3] TAMIL LETTER E..TAMIL LETTER AI -0B92..0B95 ; TAMIL # Lo [4] TAMIL LETTER O..TAMIL LETTER KA -0B99..0B9A ; TAMIL # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA -0B9C ; TAMIL # Lo TAMIL LETTER JA -0B9E..0B9F ; TAMIL # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA -0BA3..0BA4 ; TAMIL # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA -0BA8..0BAA ; TAMIL # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA -0BAE..0BB5 ; TAMIL # Lo [8] TAMIL LETTER MA..TAMIL LETTER VA -0BB7..0BB9 ; TAMIL # Lo [3] TAMIL LETTER SSA..TAMIL LETTER HA -0BBE..0BBF ; TAMIL # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I -0BC0 ; TAMIL # Mn TAMIL VOWEL SIGN II -0BC1..0BC2 ; TAMIL # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU -0BC6..0BC8 ; TAMIL # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI -0BCA..0BCC ; TAMIL # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU -0BCD ; TAMIL # Mn TAMIL SIGN VIRAMA -0BD7 ; TAMIL # Mc TAMIL AU LENGTH MARK -0BE7..0BEF ; TAMIL # Nd [9] TAMIL DIGIT ONE..TAMIL DIGIT NINE -0BF0..0BF2 ; TAMIL # No [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND - -# Total code points: 61 - -# ================================================ - -0C01..0C03 ; TELUGU # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA -0C05..0C0C ; TELUGU # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L -0C0E..0C10 ; TELUGU # Lo [3] TELUGU LETTER E..TELUGU LETTER AI -0C12..0C28 ; TELUGU # Lo [23] TELUGU LETTER O..TELUGU LETTER NA -0C2A..0C33 ; TELUGU # Lo [10] TELUGU LETTER PA..TELUGU LETTER LLA -0C35..0C39 ; TELUGU # Lo [5] TELUGU LETTER VA..TELUGU LETTER HA -0C3E..0C40 ; TELUGU # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II -0C41..0C44 ; TELUGU # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR -0C46..0C48 ; TELUGU # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI -0C4A..0C4D ; TELUGU # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA -0C55..0C56 ; TELUGU # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK -0C60..0C61 ; TELUGU # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL -0C66..0C6F ; TELUGU # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE +0C01..0C03 ; Telugu # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA +0C05..0C0C ; Telugu # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L +0C0E..0C10 ; Telugu # Lo [3] TELUGU LETTER E..TELUGU LETTER AI +0C12..0C28 ; Telugu # Lo [23] TELUGU LETTER O..TELUGU LETTER NA +0C2A..0C33 ; Telugu # Lo [10] TELUGU LETTER PA..TELUGU LETTER LLA +0C35..0C39 ; Telugu # Lo [5] TELUGU LETTER VA..TELUGU LETTER HA +0C3E..0C40 ; Telugu # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II +0C41..0C44 ; Telugu # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR +0C46..0C48 ; Telugu # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI +0C4A..0C4D ; Telugu # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA +0C55..0C56 ; Telugu # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK +0C60..0C61 ; Telugu # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL +0C66..0C6F ; Telugu # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE # Total code points: 80 # ================================================ -0C82..0C83 ; KANNADA # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA -0C85..0C8C ; KANNADA # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L -0C8E..0C90 ; KANNADA # Lo [3] KANNADA LETTER E..KANNADA LETTER AI -0C92..0CA8 ; KANNADA # Lo [23] KANNADA LETTER O..KANNADA LETTER NA -0CAA..0CB3 ; KANNADA # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA -0CB5..0CB9 ; KANNADA # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA -0CBD ; KANNADA # Lo KANNADA SIGN AVAGRAHA -0CBE ; KANNADA # Mc KANNADA VOWEL SIGN AA -0CBF ; KANNADA # Mn KANNADA VOWEL SIGN I -0CC0..0CC4 ; KANNADA # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR -0CC6 ; KANNADA # Mn KANNADA VOWEL SIGN E -0CC7..0CC8 ; KANNADA # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI -0CCA..0CCB ; KANNADA # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO -0CCC..0CCD ; KANNADA # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA -0CD5..0CD6 ; KANNADA # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK -0CDE ; KANNADA # Lo KANNADA LETTER FA -0CE0..0CE1 ; KANNADA # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL -0CE6..0CEF ; KANNADA # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE +0C82..0C83 ; Kannada # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA +0C85..0C8C ; Kannada # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L +0C8E..0C90 ; Kannada # Lo [3] KANNADA LETTER E..KANNADA LETTER AI +0C92..0CA8 ; Kannada # Lo [23] KANNADA LETTER O..KANNADA LETTER NA +0CAA..0CB3 ; Kannada # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA +0CB5..0CB9 ; Kannada # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA +0CBC ; Kannada # Mn KANNADA SIGN NUKTA +0CBD ; Kannada # Lo KANNADA SIGN AVAGRAHA +0CBE ; Kannada # Mc KANNADA VOWEL SIGN AA +0CBF ; Kannada # Mn KANNADA VOWEL SIGN I +0CC0..0CC4 ; Kannada # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR +0CC6 ; Kannada # Mn KANNADA VOWEL SIGN E +0CC7..0CC8 ; Kannada # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI +0CCA..0CCB ; Kannada # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO +0CCC..0CCD ; Kannada # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA +0CD5..0CD6 ; Kannada # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK +0CDE ; Kannada # Lo KANNADA LETTER FA +0CE0..0CE1 ; Kannada # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL +0CE6..0CEF ; Kannada # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE -# Total code points: 81 +# Total code points: 82 # ================================================ -0D02..0D03 ; MALAYALAM # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA -0D05..0D0C ; MALAYALAM # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L -0D0E..0D10 ; MALAYALAM # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI -0D12..0D28 ; MALAYALAM # Lo [23] MALAYALAM LETTER O..MALAYALAM LETTER NA -0D2A..0D39 ; MALAYALAM # Lo [16] MALAYALAM LETTER PA..MALAYALAM LETTER HA -0D3E..0D40 ; MALAYALAM # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II -0D41..0D43 ; MALAYALAM # Mn [3] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC R -0D46..0D48 ; MALAYALAM # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI -0D4A..0D4C ; MALAYALAM # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU -0D4D ; MALAYALAM # Mn MALAYALAM SIGN VIRAMA -0D57 ; MALAYALAM # Mc MALAYALAM AU LENGTH MARK -0D60..0D61 ; MALAYALAM # Lo [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL -0D66..0D6F ; MALAYALAM # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE +0D02..0D03 ; Malayalam # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA +0D05..0D0C ; Malayalam # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L +0D0E..0D10 ; Malayalam # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI +0D12..0D28 ; Malayalam # Lo [23] MALAYALAM LETTER O..MALAYALAM LETTER NA +0D2A..0D39 ; Malayalam # Lo [16] MALAYALAM LETTER PA..MALAYALAM LETTER HA +0D3E..0D40 ; Malayalam # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II +0D41..0D43 ; Malayalam # Mn [3] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC R +0D46..0D48 ; Malayalam # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI +0D4A..0D4C ; Malayalam # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU +0D4D ; Malayalam # Mn MALAYALAM SIGN VIRAMA +0D57 ; Malayalam # Mc MALAYALAM AU LENGTH MARK +0D60..0D61 ; Malayalam # Lo [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL +0D66..0D6F ; Malayalam # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE # Total code points: 78 # ================================================ -0D82..0D83 ; SINHALA # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA -0D85..0D96 ; SINHALA # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA -0D9A..0DB1 ; SINHALA # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA -0DB3..0DBB ; SINHALA # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA -0DBD ; SINHALA # Lo SINHALA LETTER DANTAJA LAYANNA -0DC0..0DC6 ; SINHALA # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA -0DCA ; SINHALA # Mn SINHALA SIGN AL-LAKUNA -0DCF..0DD1 ; SINHALA # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA -0DD2..0DD4 ; SINHALA # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA -0DD6 ; SINHALA # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA -0DD8..0DDF ; SINHALA # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA -0DF2..0DF3 ; SINHALA # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA +0D82..0D83 ; Sinhala # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA +0D85..0D96 ; Sinhala # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA +0D9A..0DB1 ; Sinhala # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA +0DB3..0DBB ; Sinhala # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA +0DBD ; Sinhala # Lo SINHALA LETTER DANTAJA LAYANNA +0DC0..0DC6 ; Sinhala # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA +0DCA ; Sinhala # Mn SINHALA SIGN AL-LAKUNA +0DCF..0DD1 ; Sinhala # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA +0DD2..0DD4 ; Sinhala # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA +0DD6 ; Sinhala # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA +0DD8..0DDF ; Sinhala # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA +0DF2..0DF3 ; Sinhala # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA +0DF4 ; Sinhala # Po SINHALA PUNCTUATION KUNDDALIYA -# Total code points: 79 +# Total code points: 80 # ================================================ -0E01..0E30 ; THAI # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A -0E31 ; THAI # Mn THAI CHARACTER MAI HAN-AKAT -0E32..0E33 ; THAI # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM -0E34..0E3A ; THAI # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU -0E40..0E45 ; THAI # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO -0E46 ; THAI # Lm THAI CHARACTER MAIYAMOK -0E47..0E4E ; THAI # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN -0E50..0E59 ; THAI # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE +0E01..0E30 ; Thai # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A +0E31 ; Thai # Mn THAI CHARACTER MAI HAN-AKAT +0E32..0E33 ; Thai # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM +0E34..0E3A ; Thai # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU +0E40..0E45 ; Thai # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO +0E46 ; Thai # Lm THAI CHARACTER MAIYAMOK +0E47..0E4E ; Thai # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN +0E4F ; Thai # Po THAI CHARACTER FONGMAN +0E50..0E59 ; Thai # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE +0E5A..0E5B ; Thai # Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT -# Total code points: 83 +# Total code points: 86 # ================================================ -0E81..0E82 ; LAO # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG -0E84 ; LAO # Lo LAO LETTER KHO TAM -0E87..0E88 ; LAO # Lo [2] LAO LETTER NGO..LAO LETTER CO -0E8A ; LAO # Lo LAO LETTER SO TAM -0E8D ; LAO # Lo LAO LETTER NYO -0E94..0E97 ; LAO # Lo [4] LAO LETTER DO..LAO LETTER THO TAM -0E99..0E9F ; LAO # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG -0EA1..0EA3 ; LAO # Lo [3] LAO LETTER MO..LAO LETTER LO LING -0EA5 ; LAO # Lo LAO LETTER LO LOOT -0EA7 ; LAO # Lo LAO LETTER WO -0EAA..0EAB ; LAO # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG -0EAD..0EB0 ; LAO # Lo [4] LAO LETTER O..LAO VOWEL SIGN A -0EB1 ; LAO # Mn LAO VOWEL SIGN MAI KAN -0EB2..0EB3 ; LAO # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM -0EB4..0EB9 ; LAO # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU -0EBB..0EBC ; LAO # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO -0EBD ; LAO # Lo LAO SEMIVOWEL SIGN NYO -0EC0..0EC4 ; LAO # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI -0EC6 ; LAO # Lm LAO KO LA -0EC8..0ECD ; LAO # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA -0ED0..0ED9 ; LAO # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE -0EDC..0EDD ; LAO # Lo [2] LAO HO NO..LAO HO MO +0E81..0E82 ; Lao # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG +0E84 ; Lao # Lo LAO LETTER KHO TAM +0E87..0E88 ; Lao # Lo [2] LAO LETTER NGO..LAO LETTER CO +0E8A ; Lao # Lo LAO LETTER SO TAM +0E8D ; Lao # Lo LAO LETTER NYO +0E94..0E97 ; Lao # Lo [4] LAO LETTER DO..LAO LETTER THO TAM +0E99..0E9F ; Lao # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG +0EA1..0EA3 ; Lao # Lo [3] LAO LETTER MO..LAO LETTER LO LING +0EA5 ; Lao # Lo LAO LETTER LO LOOT +0EA7 ; Lao # Lo LAO LETTER WO +0EAA..0EAB ; Lao # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG +0EAD..0EB0 ; Lao # Lo [4] LAO LETTER O..LAO VOWEL SIGN A +0EB1 ; Lao # Mn LAO VOWEL SIGN MAI KAN +0EB2..0EB3 ; Lao # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM +0EB4..0EB9 ; Lao # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU +0EBB..0EBC ; Lao # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO +0EBD ; Lao # Lo LAO SEMIVOWEL SIGN NYO +0EC0..0EC4 ; Lao # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI +0EC6 ; Lao # Lm LAO KO LA +0EC8..0ECD ; Lao # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA +0ED0..0ED9 ; Lao # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE +0EDC..0EDD ; Lao # Lo [2] LAO HO NO..LAO HO MO # Total code points: 65 # ================================================ -0F00 ; TIBETAN # Lo TIBETAN SYLLABLE OM -0F18..0F19 ; TIBETAN # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS -0F20..0F29 ; TIBETAN # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE -0F2A..0F33 ; TIBETAN # No [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO -0F35 ; TIBETAN # Mn TIBETAN MARK NGAS BZUNG NYI ZLA -0F37 ; TIBETAN # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS -0F39 ; TIBETAN # Mn TIBETAN MARK TSA -PHRU -0F40..0F47 ; TIBETAN # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA -0F49..0F6A ; TIBETAN # Lo [34] TIBETAN LETTER NYA..TIBETAN LETTER FIXED-FORM RA -0F71..0F7E ; TIBETAN # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO -0F7F ; TIBETAN # Mc TIBETAN SIGN RNAM BCAD -0F80..0F84 ; TIBETAN # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA -0F86..0F87 ; TIBETAN # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS -0F88..0F8B ; TIBETAN # Lo [4] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN GRU MED RGYINGS -0F90..0F97 ; TIBETAN # Mn [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA -0F99..0FBC ; TIBETAN # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA -0FC6 ; TIBETAN # Mn TIBETAN SYMBOL PADMA GDAN - -# Total code points: 139 +0F00 ; Tibetan # Lo TIBETAN SYLLABLE OM +0F01..0F03 ; Tibetan # So [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA +0F04..0F12 ; Tibetan # Po [15] TIBETAN MARK INITIAL YIG MGO MDUN MA..TIBETAN MARK RGYA GRAM SHAD +0F13..0F17 ; Tibetan # So [5] TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS +0F18..0F19 ; Tibetan # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +0F1A..0F1F ; Tibetan # So [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG +0F20..0F29 ; Tibetan # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE +0F2A..0F33 ; Tibetan # No [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO +0F34 ; Tibetan # So TIBETAN MARK BSDUS RTAGS +0F35 ; Tibetan # Mn TIBETAN MARK NGAS BZUNG NYI ZLA +0F36 ; Tibetan # So TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN +0F37 ; Tibetan # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS +0F38 ; Tibetan # So TIBETAN MARK CHE MGO +0F39 ; Tibetan # Mn TIBETAN MARK TSA -PHRU +0F3A ; Tibetan # Ps TIBETAN MARK GUG RTAGS GYON +0F3B ; Tibetan # Pe TIBETAN MARK GUG RTAGS GYAS +0F3C ; Tibetan # Ps TIBETAN MARK ANG KHANG GYON +0F3D ; Tibetan # Pe TIBETAN MARK ANG KHANG GYAS +0F3E..0F3F ; Tibetan # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES +0F40..0F47 ; Tibetan # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA +0F49..0F6A ; Tibetan # Lo [34] TIBETAN LETTER NYA..TIBETAN LETTER FIXED-FORM RA +0F71..0F7E ; Tibetan # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO +0F7F ; Tibetan # Mc TIBETAN SIGN RNAM BCAD +0F80..0F84 ; Tibetan # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA +0F85 ; Tibetan # Po TIBETAN MARK PALUTA +0F86..0F87 ; Tibetan # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS +0F88..0F8B ; Tibetan # Lo [4] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN GRU MED RGYINGS +0F90..0F97 ; Tibetan # Mn [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA +0F99..0FBC ; Tibetan # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA +0FBE..0FC5 ; Tibetan # So [8] TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE +0FC6 ; Tibetan # Mn TIBETAN SYMBOL PADMA GDAN +0FC7..0FCC ; Tibetan # So [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL +0FCF ; Tibetan # So TIBETAN SIGN RDEL NAG GSUM + +# Total code points: 193 # ================================================ -1000..1021 ; MYANMAR # Lo [34] MYANMAR LETTER KA..MYANMAR LETTER A -1023..1027 ; MYANMAR # Lo [5] MYANMAR LETTER I..MYANMAR LETTER E -1029..102A ; MYANMAR # Lo [2] MYANMAR LETTER O..MYANMAR LETTER AU -102C ; MYANMAR # Mc MYANMAR VOWEL SIGN AA -102D..1030 ; MYANMAR # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU -1031 ; MYANMAR # Mc MYANMAR VOWEL SIGN E -1032 ; MYANMAR # Mn MYANMAR VOWEL SIGN AI -1036..1037 ; MYANMAR # Mn [2] MYANMAR SIGN ANUSVARA..MYANMAR SIGN DOT BELOW -1038 ; MYANMAR # Mc MYANMAR SIGN VISARGA -1039 ; MYANMAR # Mn MYANMAR SIGN VIRAMA -1040..1049 ; MYANMAR # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE -1050..1055 ; MYANMAR # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL -1056..1057 ; MYANMAR # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR -1058..1059 ; MYANMAR # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL +1000..1021 ; Myanmar # Lo [34] MYANMAR LETTER KA..MYANMAR LETTER A +1023..1027 ; Myanmar # Lo [5] MYANMAR LETTER I..MYANMAR LETTER E +1029..102A ; Myanmar # Lo [2] MYANMAR LETTER O..MYANMAR LETTER AU +102C ; Myanmar # Mc MYANMAR VOWEL SIGN AA +102D..1030 ; Myanmar # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU +1031 ; Myanmar # Mc MYANMAR VOWEL SIGN E +1032 ; Myanmar # Mn MYANMAR VOWEL SIGN AI +1036..1037 ; Myanmar # Mn [2] MYANMAR SIGN ANUSVARA..MYANMAR SIGN DOT BELOW +1038 ; Myanmar # Mc MYANMAR SIGN VISARGA +1039 ; Myanmar # Mn MYANMAR SIGN VIRAMA +1040..1049 ; Myanmar # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE +104A..104F ; Myanmar # Po [6] MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE +1050..1055 ; Myanmar # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL +1056..1057 ; Myanmar # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR +1058..1059 ; Myanmar # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL -# Total code points: 72 +# Total code points: 78 # ================================================ -10A0..10C5 ; GEORGIAN # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE -10D0..10F8 ; GEORGIAN # Lo [41] GEORGIAN LETTER AN..GEORGIAN LETTER ELIFI +10A0..10C5 ; Georgian # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE +10D0..10F8 ; Georgian # Lo [41] GEORGIAN LETTER AN..GEORGIAN LETTER ELIFI # Total code points: 79 # ================================================ -1100..1159 ; HANGUL # Lo [90] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH -115F..11A2 ; HANGUL # Lo [68] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG SSANGARAEA -11A8..11F9 ; HANGUL # Lo [82] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH -3131..318E ; HANGUL # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE -AC00..D7A3 ; HANGUL # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH -FFA0..FFBE ; HANGUL # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH -FFC2..FFC7 ; HANGUL # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E -FFCA..FFCF ; HANGUL # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE -FFD2..FFD7 ; HANGUL # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU -FFDA..FFDC ; HANGUL # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I - -# Total code points: 11558 - -# ================================================ - -1200..1206 ; ETHIOPIC # Lo [7] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE HO -1208..1246 ; ETHIOPIC # Lo [63] ETHIOPIC SYLLABLE LA..ETHIOPIC SYLLABLE QO -1248 ; ETHIOPIC # Lo ETHIOPIC SYLLABLE QWA -124A..124D ; ETHIOPIC # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE -1250..1256 ; ETHIOPIC # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO -1258 ; ETHIOPIC # Lo ETHIOPIC SYLLABLE QHWA -125A..125D ; ETHIOPIC # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE -1260..1286 ; ETHIOPIC # Lo [39] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XO -1288 ; ETHIOPIC # Lo ETHIOPIC SYLLABLE XWA -128A..128D ; ETHIOPIC # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE -1290..12AE ; ETHIOPIC # Lo [31] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KO -12B0 ; ETHIOPIC # Lo ETHIOPIC SYLLABLE KWA -12B2..12B5 ; ETHIOPIC # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE -12B8..12BE ; ETHIOPIC # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO -12C0 ; ETHIOPIC # Lo ETHIOPIC SYLLABLE KXWA -12C2..12C5 ; ETHIOPIC # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE -12C8..12CE ; ETHIOPIC # Lo [7] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE WO -12D0..12D6 ; ETHIOPIC # Lo [7] ETHIOPIC SYLLABLE PHARYNGEAL A..ETHIOPIC SYLLABLE PHARYNGEAL O -12D8..12EE ; ETHIOPIC # Lo [23] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE YO -12F0..130E ; ETHIOPIC # Lo [31] ETHIOPIC SYLLABLE DA..ETHIOPIC SYLLABLE GO -1310 ; ETHIOPIC # Lo ETHIOPIC SYLLABLE GWA -1312..1315 ; ETHIOPIC # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE -1318..131E ; ETHIOPIC # Lo [7] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE GGO -1320..1346 ; ETHIOPIC # Lo [39] ETHIOPIC SYLLABLE THA..ETHIOPIC SYLLABLE TZO -1348..135A ; ETHIOPIC # Lo [19] ETHIOPIC SYLLABLE FA..ETHIOPIC SYLLABLE FYA -1369..1371 ; ETHIOPIC # Nd [9] ETHIOPIC DIGIT ONE..ETHIOPIC DIGIT NINE -1372..137C ; ETHIOPIC # No [11] ETHIOPIC NUMBER TEN..ETHIOPIC NUMBER TEN THOUSAND - -# Total code points: 337 - -# ================================================ - -13A0..13F4 ; CHEROKEE # Lo [85] CHEROKEE LETTER A..CHEROKEE LETTER YV +1100..1159 ; Hangul # Lo [90] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH +115F..11A2 ; Hangul # Lo [68] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG SSANGARAEA +11A8..11F9 ; Hangul # Lo [82] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH +3131..318E ; Hangul # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE +3200..321E ; Hangul # So [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU +3260..327D ; Hangul # So [30] CIRCLED HANGUL KIYEOK..CIRCLED KOREAN CHARACTER JUEUI +AC00..D7A3 ; Hangul # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH +FFA0..FFBE ; Hangul # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH +FFC2..FFC7 ; Hangul # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E +FFCA..FFCF ; Hangul # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE +FFD2..FFD7 ; Hangul # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU +FFDA..FFDC ; Hangul # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I + +# Total code points: 11619 + +# ================================================ + +1200..1206 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE HO +1208..1246 ; Ethiopic # Lo [63] ETHIOPIC SYLLABLE LA..ETHIOPIC SYLLABLE QO +1248 ; Ethiopic # Lo ETHIOPIC SYLLABLE QWA +124A..124D ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE +1250..1256 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO +1258 ; Ethiopic # Lo ETHIOPIC SYLLABLE QHWA +125A..125D ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE +1260..1286 ; Ethiopic # Lo [39] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XO +1288 ; Ethiopic # Lo ETHIOPIC SYLLABLE XWA +128A..128D ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE +1290..12AE ; Ethiopic # Lo [31] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KO +12B0 ; Ethiopic # Lo ETHIOPIC SYLLABLE KWA +12B2..12B5 ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE +12B8..12BE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO +12C0 ; Ethiopic # Lo ETHIOPIC SYLLABLE KXWA +12C2..12C5 ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE +12C8..12CE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE WO +12D0..12D6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE PHARYNGEAL A..ETHIOPIC SYLLABLE PHARYNGEAL O +12D8..12EE ; Ethiopic # Lo [23] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE YO +12F0..130E ; Ethiopic # Lo [31] ETHIOPIC SYLLABLE DA..ETHIOPIC SYLLABLE GO +1310 ; Ethiopic # Lo ETHIOPIC SYLLABLE GWA +1312..1315 ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE +1318..131E ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE GGO +1320..1346 ; Ethiopic # Lo [39] ETHIOPIC SYLLABLE THA..ETHIOPIC SYLLABLE TZO +1348..135A ; Ethiopic # Lo [19] ETHIOPIC SYLLABLE FA..ETHIOPIC SYLLABLE FYA +1361..1368 ; Ethiopic # Po [8] ETHIOPIC WORDSPACE..ETHIOPIC PARAGRAPH SEPARATOR +1369..1371 ; Ethiopic # Nd [9] ETHIOPIC DIGIT ONE..ETHIOPIC DIGIT NINE +1372..137C ; Ethiopic # No [11] ETHIOPIC NUMBER TEN..ETHIOPIC NUMBER TEN THOUSAND + +# Total code points: 345 + +# ================================================ + +13A0..13F4 ; Cherokee # Lo [85] CHEROKEE LETTER A..CHEROKEE LETTER YV # Total code points: 85 # ================================================ -1401..166C ; CANADIAN_ABORIGINAL # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA -166F..1676 ; CANADIAN_ABORIGINAL # Lo [8] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS NNGAA +1401..166C ; Canadian_Aboriginal # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA +166D..166E ; Canadian_Aboriginal # Po [2] CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP +166F..1676 ; Canadian_Aboriginal # Lo [8] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS NNGAA -# Total code points: 628 +# Total code points: 630 # ================================================ -1681..169A ; OGHAM # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH +1680 ; Ogham # Zs OGHAM SPACE MARK +1681..169A ; Ogham # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH +169B ; Ogham # Ps OGHAM FEATHER MARK +169C ; Ogham # Pe OGHAM REVERSED FEATHER MARK -# Total code points: 26 +# Total code points: 29 # ================================================ -16A0..16EA ; RUNIC # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X -16EE..16F0 ; RUNIC # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL +16A0..16EA ; Runic # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X +16EE..16F0 ; Runic # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL # Total code points: 78 # ================================================ -1780..17B3 ; KHMER # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU -17B4..17B5 ; KHMER # Cf [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA -17B6 ; KHMER # Mc KHMER VOWEL SIGN AA -17B7..17BD ; KHMER # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA -17BE..17C5 ; KHMER # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU -17C6 ; KHMER # Mn KHMER SIGN NIKAHIT -17C7..17C8 ; KHMER # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU -17C9..17D3 ; KHMER # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT -17E0..17E9 ; KHMER # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE - -# Total code points: 94 +1780..17B3 ; Khmer # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU +17B4..17B5 ; Khmer # Cf [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA +17B6 ; Khmer # Mc KHMER VOWEL SIGN AA +17B7..17BD ; Khmer # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA +17BE..17C5 ; Khmer # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU +17C6 ; Khmer # Mn KHMER SIGN NIKAHIT +17C7..17C8 ; Khmer # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU +17C9..17D3 ; Khmer # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT +17D4..17D6 ; Khmer # Po [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH +17D7 ; Khmer # Lm KHMER SIGN LEK TOO +17D8..17DA ; Khmer # Po [3] KHMER SIGN BEYYAL..KHMER SIGN KOOMUUT +17DB ; Khmer # Sc KHMER CURRENCY SYMBOL RIEL +17DC ; Khmer # Lo KHMER SIGN AVAKRAHASANYA +17DD ; Khmer # Mn KHMER SIGN ATTHACAN +17E0..17E9 ; Khmer # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE +17F0..17F9 ; Khmer # No [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON +19E0..19FF ; Khmer # So [32] KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC + +# Total code points: 146 # ================================================ -1810..1819 ; MONGOLIAN # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE -1820..1842 ; MONGOLIAN # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI -1843 ; MONGOLIAN # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN -1844..1877 ; MONGOLIAN # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA -1880..18A8 ; MONGOLIAN # Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA -18A9 ; MONGOLIAN # Mn MONGOLIAN LETTER ALI GALI DAGALGA +1800..1805 ; Mongolian # Po [6] MONGOLIAN BIRGA..MONGOLIAN FOUR DOTS +1806 ; Mongolian # Pd MONGOLIAN TODO SOFT HYPHEN +1807..180A ; Mongolian # Po [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU +180B..180D ; Mongolian # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE +180E ; Mongolian # Zs MONGOLIAN VOWEL SEPARATOR +1810..1819 ; Mongolian # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE +1820..1842 ; Mongolian # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI +1843 ; Mongolian # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN +1844..1877 ; Mongolian # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA +1880..18A8 ; Mongolian # Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA +18A9 ; Mongolian # Mn MONGOLIAN LETTER ALI GALI DAGALGA -# Total code points: 140 +# Total code points: 155 # ================================================ -3041..3096 ; HIRAGANA # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE -309D..309E ; HIRAGANA # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK -309F ; HIRAGANA # Lo HIRAGANA DIGRAPH YORI +3041..3096 ; Hiragana # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE +309D..309E ; Hiragana # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK +309F ; Hiragana # Lo HIRAGANA DIGRAPH YORI # Total code points: 89 # ================================================ -30A1..30FA ; KATAKANA # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO -30FD..30FE ; KATAKANA # Lm [2] KATAKANA ITERATION MARK..KATAKANA VOICED ITERATION MARK -30FF ; KATAKANA # Lo KATAKANA DIGRAPH KOTO -31F0..31FF ; KATAKANA # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO -FF66..FF6F ; KATAKANA # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU -FF71..FF9D ; KATAKANA # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N +30A1..30FA ; Katakana # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO +30FD..30FE ; Katakana # Lm [2] KATAKANA ITERATION MARK..KATAKANA VOICED ITERATION MARK +30FF ; Katakana # Lo KATAKANA DIGRAPH KOTO +31F0..31FF ; Katakana # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO +FF66..FF6F ; Katakana # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU +FF71..FF9D ; Katakana # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N # Total code points: 164 # ================================================ -3105..312C ; BOPOMOFO # Lo [40] BOPOMOFO LETTER B..BOPOMOFO LETTER GN -31A0..31B7 ; BOPOMOFO # Lo [24] BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H +3105..312C ; Bopomofo # Lo [40] BOPOMOFO LETTER B..BOPOMOFO LETTER GN +31A0..31B7 ; Bopomofo # Lo [24] BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H # Total code points: 64 # ================================================ -2E80..2E99 ; HAN # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP -2E9B..2EF3 ; HAN # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE -2F00..2FD5 ; HAN # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE -3005 ; HAN # Lm IDEOGRAPHIC ITERATION MARK -3007 ; HAN # Nl IDEOGRAPHIC NUMBER ZERO -3021..3029 ; HAN # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE -3038..303A ; HAN # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY -303B ; HAN # Lm VERTICAL IDEOGRAPHIC ITERATION MARK -3400..4DB5 ; HAN # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 -4E00..9FA5 ; HAN # Lo [20902] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FA5 -F900..FA2D ; HAN # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D -FA30..FA6A ; HAN # Lo [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A -20000..2A6D6 ; HAN # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 -2F800..2FA1D ; HAN # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D +2E80..2E99 ; Han # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP +2E9B..2EF3 ; Han # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE +2F00..2FD5 ; Han # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE +3005 ; Han # Lm IDEOGRAPHIC ITERATION MARK +3007 ; Han # Nl IDEOGRAPHIC NUMBER ZERO +3021..3029 ; Han # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE +3038..303A ; Han # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY +303B ; Han # Lm VERTICAL IDEOGRAPHIC ITERATION MARK +3400..4DB5 ; Han # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 +4E00..9FA5 ; Han # Lo [20902] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FA5 +F900..FA2D ; Han # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D +FA30..FA6A ; Han # Lo [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A +20000..2A6D6 ; Han # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 +2F800..2FA1D ; Han # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D # Total code points: 71442 # ================================================ -A000..A48C ; YI # Lo [1165] YI SYLLABLE IT..YI SYLLABLE YYR -A490..A4C6 ; YI # So [55] YI RADICAL QOT..YI RADICAL KE +A000..A48C ; Yi # Lo [1165] YI SYLLABLE IT..YI SYLLABLE YYR +A490..A4C6 ; Yi # So [55] YI RADICAL QOT..YI RADICAL KE # Total code points: 1220 # ================================================ -10300..1031E ; OLD_ITALIC # Lo [31] OLD ITALIC LETTER A..OLD ITALIC LETTER UU +10300..1031E ; Old_Italic # Lo [31] OLD ITALIC LETTER A..OLD ITALIC LETTER UU +10320..10323 ; Old_Italic # No [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY -# Total code points: 31 +# Total code points: 35 # ================================================ -10330..10349 ; GOTHIC # Lo [26] GOTHIC LETTER AHSA..GOTHIC LETTER OTHAL -1034A ; GOTHIC # Nl GOTHIC LETTER NINE HUNDRED +10330..10349 ; Gothic # Lo [26] GOTHIC LETTER AHSA..GOTHIC LETTER OTHAL +1034A ; Gothic # Nl GOTHIC LETTER NINE HUNDRED # Total code points: 27 # ================================================ -10400..1044F ; DESERET # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW +10400..1044F ; Deseret # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW # Total code points: 80 # ================================================ -0300..034F ; INHERITED # Mn [80] COMBINING GRAVE ACCENT..COMBINING GRAPHEME JOINER -0360..036F ; INHERITED # Mn [16] COMBINING DOUBLE TILDE..COMBINING LATIN SMALL LETTER X -0488..0489 ; INHERITED # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN -0591..05A1 ; INHERITED # Mn [17] HEBREW ACCENT ETNAHTA..HEBREW ACCENT PAZER -05A3..05B9 ; INHERITED # Mn [23] HEBREW ACCENT MUNAH..HEBREW POINT HOLAM -05BB..05BD ; INHERITED # Mn [3] HEBREW POINT QUBUTS..HEBREW POINT METEG -05BF ; INHERITED # Mn HEBREW POINT RAFE -05C1..05C2 ; INHERITED # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT -05C4 ; INHERITED # Mn HEBREW MARK UPPER DOT -064B..0655 ; INHERITED # Mn [11] ARABIC FATHATAN..ARABIC HAMZA BELOW -0670 ; INHERITED # Mn ARABIC LETTER SUPERSCRIPT ALEF -06D6..06DC ; INHERITED # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN -06DD ; INHERITED # Cf ARABIC END OF AYAH -06DE ; INHERITED # Me ARABIC START OF RUB EL HIZB -06DF..06E4 ; INHERITED # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA -06E7..06E8 ; INHERITED # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON -06EA..06ED ; INHERITED # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM -180B..180D ; INHERITED # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE -20D0..20DC ; INHERITED # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE -20DD..20E0 ; INHERITED # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH -20E1 ; INHERITED # Mn COMBINING LEFT RIGHT ARROW ABOVE -20E2..20E4 ; INHERITED # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE -20E5..20EA ; INHERITED # Mn [6] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING LEFTWARDS ARROW OVERLAY -302A..302F ; INHERITED # Mn [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK -3099..309A ; INHERITED # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK -FB1E ; INHERITED # Mn HEBREW POINT JUDEO-SPANISH VARIKA -FE00..FE0F ; INHERITED # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 -FE20..FE23 ; INHERITED # Mn [4] COMBINING LIGATURE LEFT HALF..COMBINING DOUBLE TILDE RIGHT HALF -1D167..1D169 ; INHERITED # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 -1D17B..1D182 ; INHERITED # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE -1D185..1D18B ; INHERITED # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE -1D1AA..1D1AD ; INHERITED # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO - -# Total code points: 259 - -# ================================================ - -1700..170C ; TAGALOG # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA -170E..1711 ; TAGALOG # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA -1712..1714 ; TAGALOG # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA +0300..0357 ; Inherited # Mn [88] COMBINING GRAVE ACCENT..COMBINING RIGHT HALF RING ABOVE +035D..036F ; Inherited # Mn [19] COMBINING DOUBLE BREVE..COMBINING LATIN SMALL LETTER X +064B..0655 ; Inherited # Mn [11] ARABIC FATHATAN..ARABIC HAMZA BELOW +0670 ; Inherited # Mn ARABIC LETTER SUPERSCRIPT ALEF +200C..200D ; Inherited # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER +20D0..20DC ; Inherited # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE +20DD..20E0 ; Inherited # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH +20E1 ; Inherited # Mn COMBINING LEFT RIGHT ARROW ABOVE +20E2..20E4 ; Inherited # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE +20E5..20EA ; Inherited # Mn [6] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING LEFTWARDS ARROW OVERLAY +302A..302F ; Inherited # Mn [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK +3099..309A ; Inherited # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +FE00..FE0F ; Inherited # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 +FE20..FE23 ; Inherited # Mn [4] COMBINING LIGATURE LEFT HALF..COMBINING DOUBLE TILDE RIGHT HALF +1D167..1D169 ; Inherited # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 +1D17B..1D182 ; Inherited # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE +1D185..1D18B ; Inherited # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE +1D1AA..1D1AD ; Inherited # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO +E0100..E01EF ; Inherited # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 + +# Total code points: 438 + +# ================================================ + +1700..170C ; Tagalog # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA +170E..1711 ; Tagalog # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA +1712..1714 ; Tagalog # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA # Total code points: 20 # ================================================ -1720..1731 ; HANUNOO # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA -1732..1734 ; HANUNOO # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD +1720..1731 ; Hanunoo # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA +1732..1734 ; Hanunoo # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD # Total code points: 21 # ================================================ -1740..1751 ; BUHID # Lo [18] BUHID LETTER A..BUHID LETTER HA -1752..1753 ; BUHID # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U +1740..1751 ; Buhid # Lo [18] BUHID LETTER A..BUHID LETTER HA +1752..1753 ; Buhid # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U # Total code points: 20 # ================================================ -1760..176C ; TAGBANWA # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA -176E..1770 ; TAGBANWA # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA -1772..1773 ; TAGBANWA # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U +1760..176C ; Tagbanwa # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA +176E..1770 ; Tagbanwa # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA +1772..1773 ; Tagbanwa # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U # Total code points: 18 # ================================================ -1900..191C ; LIMBU # Lo [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA -1920..1922 ; LIMBU # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U -1923..1926 ; LIMBU # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU -1927..1928 ; LIMBU # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O -1929..192B ; LIMBU # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA -1930..1931 ; LIMBU # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA -1932 ; LIMBU # Mn LIMBU SMALL LETTER ANUSVARA -1933..1938 ; LIMBU # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA -1939..193B ; LIMBU # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I -1946..194F ; LIMBU # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE - -# Total code points: 63 +1900..191C ; Limbu # Lo [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA +1920..1922 ; Limbu # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U +1923..1926 ; Limbu # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU +1927..1928 ; Limbu # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O +1929..192B ; Limbu # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA +1930..1931 ; Limbu # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA +1932 ; Limbu # Mn LIMBU SMALL LETTER ANUSVARA +1933..1938 ; Limbu # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA +1939..193B ; Limbu # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I +1940 ; Limbu # So LIMBU SIGN LOO +1944..1945 ; Limbu # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK +1946..194F ; Limbu # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE + +# Total code points: 66 # ================================================ -1950..196D ; TAI_LE # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI -1970..1974 ; TAI_LE # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 +1950..196D ; Tai_Le # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI +1970..1974 ; Tai_Le # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 # Total code points: 35 # ================================================ -10000..1000B ; LINEAR_B # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE -1000D..10026 ; LINEAR_B # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO -10028..1003A ; LINEAR_B # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO -1003C..1003D ; LINEAR_B # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE -1003F..1004D ; LINEAR_B # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO -10050..1005D ; LINEAR_B # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 -10080..100FA ; LINEAR_B # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 +10000..1000B ; Linear_B # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE +1000D..10026 ; Linear_B # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO +10028..1003A ; Linear_B # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO +1003C..1003D ; Linear_B # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE +1003F..1004D ; Linear_B # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO +10050..1005D ; Linear_B # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 +10080..100FA ; Linear_B # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 # Total code points: 211 # ================================================ -10380..1039D ; UGARITIC # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU +10380..1039D ; Ugaritic # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU +1039F ; Ugaritic # Po UGARITIC WORD DIVIDER -# Total code points: 30 +# Total code points: 31 # ================================================ -10450..1047F ; SHAVIAN # Lo [48] SHAVIAN LETTER PEEP..SHAVIAN LETTER YEW +10450..1047F ; Shavian # Lo [48] SHAVIAN LETTER PEEP..SHAVIAN LETTER YEW # Total code points: 48 # ================================================ -10480..1049D ; OSMANYA # Lo [30] OSMANYA LETTER ALEF..OSMANYA LETTER OO -104A0..104A9 ; OSMANYA # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE +10480..1049D ; Osmanya # Lo [30] OSMANYA LETTER ALEF..OSMANYA LETTER OO +104A0..104A9 ; Osmanya # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE # Total code points: 40 # ================================================ -10800..10805 ; CYPRIOT # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA -10808 ; CYPRIOT # Lo CYPRIOT SYLLABLE JO -1080A..10835 ; CYPRIOT # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO -10837..10838 ; CYPRIOT # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE -1083C ; CYPRIOT # Lo CYPRIOT SYLLABLE ZA -1083F ; CYPRIOT # Lo CYPRIOT SYLLABLE ZO +10800..10805 ; Cypriot # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA +10808 ; Cypriot # Lo CYPRIOT SYLLABLE JO +1080A..10835 ; Cypriot # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO +10837..10838 ; Cypriot # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE +1083C ; Cypriot # Lo CYPRIOT SYLLABLE ZA +1083F ; Cypriot # Lo CYPRIOT SYLLABLE ZO # Total code points: 55 # ================================================ -2800..28FF ; BRAILLE # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 +2800..28FF ; Braille # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 # Total code points: 256 +# ================================================ + +3031..3035 ; Katakana_Or_Hiragana # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF +309B..309C ; Katakana_Or_Hiragana # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +FF70 ; Katakana_Or_Hiragana # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF9E..FF9F ; Katakana_Or_Hiragana # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK + +# Total code points: 10 diff --git a/icuSources/data/unidata/SpecialCasing.txt b/icuSources/data/unidata/SpecialCasing.txt index 34d1c61d..c8401d6c 100644 --- a/icuSources/data/unidata/SpecialCasing.txt +++ b/icuSources/data/unidata/SpecialCasing.txt @@ -1,5 +1,5 @@ -# SpecialCasing-4.0.0.txt -# Date: 2003-03-14, 20:22:04 GMT [MD] +# SpecialCasing-4.0.1.txt +# Date: 2003-10-06, 17:30:00 PST [KW] # # Special Casing Properties # @@ -170,7 +170,7 @@ FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH 1FF3; 1FF3; 1FFC; 03A9 0399; # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI 1FFC; 1FF3; 1FFC; 03A9 0399; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI -# Some characters with YPOGEGRAMMENI are also have no corresponding titlecases +# Some characters with YPOGEGRAMMENI also have no corresponding titlecases 1FB2; 1FB2; 1FBA 0345; 1FBA 0399; # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI 1FB4; 1FB4; 0386 0345; 0386 0399; # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI diff --git a/icuSources/data/unidata/UCARules.txt b/icuSources/data/unidata/UCARules.txt index 3e1a3b0b..dfb5c520 100644 --- a/icuSources/data/unidata/UCARules.txt +++ b/icuSources/data/unidata/UCARules.txt @@ -1,11254 +1,14655 @@ -# UCA Rules -# This file contains the UCA tables for the given version, but transformed into rule syntax. -# Generated: 2003-03-19,12:34:38 GMT [MD] -# NOTE: Since UCA handles canonical equivalents, no composites are necessary -# (except in extensions). -# For syntax description, see: http://oss.software.ibm.com/icu/userguide/Collate_Intro.html -# VERSION: UCA=3.1.1, UCD=4.0.0 -& [last tertiary ignorable] - - = '\u0001' - = '\u0002' - = '\u0003' - = '\u0004' - = '\u0005' - = '\u0006' - = '\u0007' - = '\u0008' - = '\u000E' - = '\u000F' - = '\u0010' - = '\u0011' - = '\u0012' - = '\u0013' - = '\u0014' - = '\u0015' - = '\u0016' - = '\u0017' - = '\u0018' - = '\u0019' - = '\u001A' - = '\u001B' - = '\u001C' - = '\u001D' - = '\u001E' - = '\u001F' - = '\u007F' - = '\u0080' - = '\u0081' - = '\u0082' - = '\u0083' - = '\u0084' - = '\u0086' - = '\u0087' - = '\u0088' - = '\u0089' - = '\u008A' - = '\u008B' - = '\u008C' - = '\u008D' - = '\u008E' - = '\u008F' - = '\u0090' - = '\u0091' - = '\u0092' - = '\u0093' - = '\u0094' - = '\u0095' - = '\u0096' - = '\u0097' - = '\u0098' - = '\u0099' - = '\u009A' - = '\u009B' - = '\u009C' - = '\u009D' - = '\u009E' - = '\u009F' - = ҈ - = ҉ - = ֑ - = ֒ - = ֓ - = ֔ - = ֕ - = ֖ - = ֗ - = ֘ - = ֙ - = ֚ - = ֛ - = ֜ - = ֝ - = ֞ - = ֟ - = Ö  - = Ö¡ - = Ö£ - = Ö¤ - = Ö¥ - = Ö¦ - = Ö§ - = Ö¨ - = Ö© - = Öª - = Ö« - = Ö¬ - = Ö­ - = Ö® - = Ö¯ - = Ö½ - = ׄ - = '\u06DD' - = ۞ - = ۟ - = Û  - = Ûª - = Û« - = Û¬ - = '\u070F' - = ๎ - = ༘ - = ༙ - = ༵ - = ༷ - = ྂ - = ྃ - = ྆ - = ྇ - = ࿆ - = ᠋ - = ᠌ - = ᠍ - = '\u180E' - = ​ - = '\u200C' - = '\u200D' - = '\u200E' - = '\u200F' - = '\u202A' - = '\u202B' - = '\u202C' - = '\u202D' - = '\u202E' - = '\u206A' - = '\u206B' - = '\u206C' - = '\u206D' - = '\u206E' - = '\u206F' - = '\uFEFF' - = '\uFFF9' - = '\uFFFA' - = '\uFFFB' - = 𝅥 - = 𝅦 - = 𝅧 - = 𝅨 - = 𝅩 - = 𝅭 - = 𝅮 - = 𝅯 - = 𝅰 - = 𝅱 - = 𝅲 - = 𝅳 - = 𝅴 - = 𝅵 - = 𝅶 - = 𝅷 - = 𝅸 - = 𝅹 - = 𝅺 - = 𝅻 - = 𝅼 - = 𝅽 - = 𝅾 - = 𝅿 - = 𝆀 - = 𝆁 - = 𝆂 - = 𝆅 - = 𝆆 - = 𝆇 - = 𝆈 - = 𝆉 - = 𝆊 - = 𝆋 - = 𝆪 - = 𝆫 - = 𝆬 - = 𝆭 - = 󠀁 - = 󠀠 - = 󠀡 - = 󠀢 - = 󠀣 - = 󠀤 - = 󠀥 - = 󠀦 - = 󠀧 - = 󠀨 - = 󠀩 - = 󠀪 - = 󠀫 - = 󠀬 - = 󠀭 - = 󠀮 - = 󠀯 - = 󠀰 - = 󠀱 - = 󠀲 - = 󠀳 - = 󠀴 - = 󠀵 - = 󠀶 - = 󠀷 - = 󠀸 - = 󠀹 - = 󠀺 - = 󠀻 - = 󠀼 - = 󠀽 - = 󠀾 - = 󠀿 - = 󠁀 - = 󠁁 - = 󠁂 - = 󠁃 - = 󠁄 - = 󠁅 - = 󠁆 - = 󠁇 - = 󠁈 - = 󠁉 - = 󠁊 - = 󠁋 - = 󠁌 - = 󠁍 - = 󠁎 - = 󠁏 - = 󠁐 - = 󠁑 - = 󠁒 - = 󠁓 - = 󠁔 - = 󠁕 - = 󠁖 - = 󠁗 - = 󠁘 - = 󠁙 - = 󠁚 - = 󠁛 - = 󠁜 - = 󠁝 - = 󠁞 - = 󠁟 - = 󠁠 - = 󠁡 - = 󠁢 - = 󠁣 - = 󠁤 - = 󠁥 - = 󠁦 - = 󠁧 - = 󠁨 - = 󠁩 - = 󠁪 - = 󠁫 - = 󠁬 - = 󠁭 - = 󠁮 - = 󠁯 - = 󠁰 - = 󠁱 - = 󠁲 - = 󠁳 - = 󠁴 - = 󠁵 - = 󠁶 - = 󠁷 - = 󠁸 - = 󠁹 - = 󠁺 - = 󠁻 - = 󠁼 - = 󠁽 - = 󠁾 - = 󠁿 -& [last primary ignorable] - << ̲ - << ̓ - << ̔ - << ́ - << ̀ - << ̆ - << ̂ - << ̌ - << ̊ - << ͂ - << ̈ - << ̋ - << ̃ - << ̇ - << ̸ - << ̧ - << ̨ - << ̄ - << ̅ - << ̉ - << ̍ - << ̎ - << ̏ - << ̐ - << ̑ - << ̒ - << ̕ - << ̖ - << ̗ - << ̘ - << ̙ - << ̚ - << ̛ - << ̜ - << ̝ - << ̞ - << ̟ - << Ì  - << Ì¡ - << Ì¢ - << Ì£ - << ̤ - << Ì¥ - << ̦ - << Ì© - << ̪ - << Ì« - << ̬ - << Ì­ - << Ì® - << ̯ - << ̰ - << ̱ - << ̳ - << Ì´ - << ̵ - << ̶ - << Ì· - << ̹ - << ̺ - << Ì» - << ̼ - << ̽ - << ̾ - << Ì¿ - << ͅ - << ͆ - << ͇ - << ͈ - << ͉ - << ͊ - << ͋ - << ͌ - << ͍ - << ͎ - << Í  - << Í¡ - << Í¢ - << ︠ - << ︡ - << ︢ - << ︣ - << ҃ - << ҄ - << ҅ - << ҆ - << Ö° - << Ö± - << Ö² - << Ö³ - << Ö´ - << Öµ - << Ö¶ - << Ö· - << Ö¸ - << Ö¹ - << Ö» - << Ö¼ - << Ö¿ - << ׁ - << ׂ - << ﬞ - << ً - <<< ï¹± - <<< ï¹° - << ٌ - <<< ï¹² - << ٍ - <<< ï¹´ - << َ - <<< ï¹· - <<< ï¹¶ - << ُ - <<< ï¹¹ - <<< ﹸ - << ِ - <<< ï¹» - <<< ﹺ - << ّ - <<< ï³² - = ï³³ - = ï³´ - = ï¹½ - <<< ﱞ - = ﱟ - = ï±  - = ﱡ - = ï±¢ - = ï¹¼ - <<< ï±£ / Ù° - << ْ - <<< ﹿ - <<< ï¹¾ - << ٓ - << ٔ - << ٕ - << Ù° - << ۖ - << ۗ - << ۘ - << ۙ - << ۚ - << ۛ - << ۜ - << Û¡ - << Û¢ - << Û£ - << Û¤ - << Û§ - << Û¨ - << Û­ - << ܑ - << ܰ - << ܱ - << ܲ - << ܳ - << Ü´ - << ܵ - << ܶ - << Ü· - << ܸ - << ܹ - << ܺ - << Ü» - << ܼ - << ܽ - << ܾ - << Ü¿ - << ݀ - << ݁ - << ݂ - << ݃ - << ݄ - << ݅ - << ݆ - << ݇ - << ݈ - << ݉ - << ݊ - << ़ - << ँ - << ं - << ः - << ॑ - << ॒ - << ॓ - << ॔ - << ় - << ঁ - << ং - << ঃ - << ਼ - << ਂ - << à©° - << ੱ - << ઼ - << ઁ - << ં - << ઃ - << ଼ - << ଁ - << ଂ - << ଃ - << ஂ - << ఁ - << ం - << ః - << ಂ - << ಃ - << ം - << ഃ - << ං - << ඃ - << ็ - << ่ - << ้ - << ๊ - << ๋ - << ່ - << ້ - << ໊ - << ໋ - << ༹ - << ཾ - << ཿ - << ံ - << ့ - << း - << ំ - << ះ - << ៈ - << ៉ - << ៊ - << ់ - << ៌ - << ៍ - << ៎ - << ៏ - << ័ - << ៑ - << ៓ - << 〪 - << 〫 - << 〬 - << 〭 - << 〮 - << 〯 - << ゙ - <<< ゙ - << ゚ - <<< ゚ - << ⃐ - << ⃑ - << ⃒ - << ⃓ - << ⃔ - << ⃕ - << ⃖ - << ⃗ - << ⃘ - << ⃙ - << ⃚ - << ⃛ - << ⃜ - << ⃝ - << ⃞ - << ⃟ - << ⃠ - << ⃡ - << ⃢ - << ⃣ -& [last regular] - < '\u0009' - < '\u000A' - < '\u000B' - < '\u000C' - < '\u000D' - < '\u0085' - < '\u2028' - < '\u2029' - < '\u0020' - <<< '\u3000' - <<< '\u2002' - = '\u2003' - = '\u2004' - = '\u2005' - = '\u2006' - = '\u2008' - = '\u2009' - = '\u200A' - <<< '\u00A0' - = '\u2007' - = '\u202F' - < '\u1680' - < ـ - < '`' - <<< ` - < ´ - = ΄ - < ˜ - < '^' - <<< ï¼¾ - < ¯ - <<< ï¿£ - < ‾ - <<< ﹉ - = ﹊ - = ﹋ - = ﹌ - < ˘ - < ˙ - < ¨ - < ˚ - < ˝ - < á¾½ - = ᾿ - < ῾ - < ¸ - < ˛ - < '_' - <<< _ - <<< ﹍ - = ﹎ - = ﹏ - <<< ︳ - = ︴ - < ‗ - < ῀ - < ゛ - < ゜ - < '­' - < '-' - <<< - - <<< ï¹£ - < ֊ - < ᠆ - < ᠇ - < ‐ - <<< ‑ - < ‒ - < – - <<< ︲ - < — - <<< ﹘ - <<< ︱ - < ― - < 〜 - < 〰 - < ・ - <<< ï½¥ - < ',' - <<< , - <<< ﹐ - < ՝ - < ، - < Ù« - < Ù¬ - < ᠂ - < ᠈ - < 、 - <<< ﹑ - <<< 、 - < ';' - <<< ; - <<< ﹔ - < ؛ - < ':' - <<< : - <<< ﹕ - < ։ - < ܃ - < ܄ - < ܅ - < ܆ - < ܇ - < ܈ - < ፡ - < ፣ - < ፤ - < ፥ - < ፦ - < ᠄ - < ᠅ - < ༔ - < ៖ - < ᛫ - < ᛬ - < ᛭ - < '!' - <<< ! - <<< ‼ / '!' - <<< ⁉ / '?' - <<< ﹗ - < ¡ - < ՜ - < '?' - <<< ? - <<< ⁈ / '!' - <<< ﹖ - < ¿ - < ՞ - < ؟ - < ܉ - < ፧ - < ‽ - < '.' - <<< . - <<< ․ - <<< ‥ / '.' - <<< … / '..' - <<< ﹒ - <<< ︰ / '.' - < ᠁ - < ۔ - < ܁ - < ܂ - < ። - < ᠃ - < ᠉ - < ᙮ - < 。 - <<< 。 - < · - < । - < ॥ - < ၊ - < ။ - < ។ - < ៕ - < ܀ - < ჻ - < ፨ - < '' - <<< ' - < ‘ - < ’ - < ‚ - < ‛ - < ‹ - < › - < '"' - <<< " - < “ - < ” - < „ - < ‟ - < 〝 - < 〞 - < 〟 - < « - < » - < '(' - <<< ( - <<< ⑴ / 1')' - <<< ⑽ / 10')' - <<< ⑾ / 11')' - <<< ⑿ / 12')' - <<< ⒀ / 13')' - <<< ⒁ / 14')' - <<< ⒂ / 15')' - <<< ⒃ / 16')' - <<< ⒄ / 17')' - <<< ⒅ / 18')' - <<< ⒆ / 19')' - <<< ⑵ / 2')' - <<< ⒇ / 20')' - <<< ⑶ / 3')' - <<< ⑷ / 4')' - <<< ⑸ / 5')' - <<< ⑹ / 6')' - <<< ⑺ / 7')' - <<< ⑻ / 8')' - <<< ⑼ / 9')' - <<< ⒜ / a')' - <<< ⒝ / b')' - <<< ⒞ / c')' - <<< ⒟ / d')' - <<< ⒠ / e')' - <<< ⒡ / f')' - <<< ⒢ / g')' - <<< ⒣ / h')' - <<< ⒤ / i')' - <<< ⒥ / j')' - <<< ⒦ / k')' - <<< ⒧ / l')' - <<< ⒨ / m')' - <<< ⒩ / n')' - <<< ⒪ / o')' - <<< ⒫ / p')' - <<< ⒬ / q')' - <<< ⒭ / r')' - <<< ⒮ / s')' - <<< ⒯ / t')' - <<< ⒰ / u')' - <<< ⒱ / v')' - <<< ⒲ / w')' - <<< ⒳ / x')' - <<< ⒴ / y')' - <<< ⒵ / z')' - <<< ㈀ / ᄀ')' - <<< ㈎ / 가')' - <<< ㈁ / ᄂ')' - <<< ㈏ / 나')' - <<< ㈂ / ᄃ')' - <<< ㈐ / 다')' - <<< ㈃ / ᄅ')' - <<< ㈑ / 라')' - <<< ㈄ / ᄆ')' - <<< ㈒ / 마')' - <<< ㈅ / ᄇ')' - <<< ㈓ / 바')' - <<< ㈆ / ᄉ')' - <<< ㈔ / 사')' - <<< ㈇ / ᄋ')' - <<< ㈕ / 아')' - <<< ㈈ / ᄌ')' - <<< ㈖ / 자')' - <<< ㈜ / 주')' - <<< ㈉ / ᄎ')' - <<< ㈗ / ì°¨')' - <<< ㈊ / ᄏ')' - <<< ㈘ / ì¹´')' - <<< ㈋ / ᄐ')' - <<< ㈙ / 타')' - <<< ㈌ / ᄑ')' - <<< ㈚ / 파')' - <<< ㈍ / ᄒ')' - <<< ㈛ / 하')' - <<< ㈠ / 一')' - <<< ㈦ / 七')' - <<< ㈢ / 三')' - <<< ㈨ / 九')' - <<< ㈡ / 二')' - <<< ㈤ / 五')' - <<< ㈹ / 代')' - <<< ㈽ / 企')' - <<< ㉁ / 休')' - <<< ㈧ / 八')' - <<< ㈥ / 六')' - <<< ㈸ / 労')' - <<< ㈩ / 十')' - <<< ㈿ / 協')' - <<< ㈴ / 名')' - <<< ㈺ / 呼')' - <<< ㈣ / 四')' - <<< ㈯ / 土')' - <<< ㈻ / å­¦')' - <<< ㈰ / 日')' - <<< ㈪ / 月')' - <<< ㈲ / 有')' - <<< ㈭ / 木')' - <<< ㈱ / æ ª')' - <<< ㈬ / æ°´')' - <<< ㈫ / 火')' - <<< ㈵ / 特')' - <<< ㈼ / 監')' - <<< ㈳ / 社')' - <<< ㈷ / 祝')' - <<< ㉀ / 祭')' - <<< ㉂ / 自')' - <<< ㉃ / 至')' - <<< ㈶ / 財')' - <<< ㈾ / 資')' - <<< ㈮ / 金')' - <<< ﹙ - <<< ⁽ - <<< ₍ - <<< ︵ - < ')' - <<< ) - <<< ﹚ - <<< ⁾ - <<< ₎ - <<< ︶ - < '[' - <<< ï¼» - < ']' - <<< ï¼½ - < '{' - <<< { - <<< ﹛ - <<< ︷ - < '}' - <<< } - <<< ﹜ - <<< ︸ - < ༺ - < ༻ - < ༼ - < ༽ - < ᚛ - < ᚜ - < ⁅ - < ⁆ - < 〈 - <<< ︿ - < 〉 - <<< ﹀ - < 《 - <<< ︽ - < 》 - <<< ︾ - < 「 - <<< ï½¢ - <<< ﹁ - < 」 - <<< ï½£ - <<< ﹂ - < 『 - <<< ﹃ - < 』 - <<< ﹄ - < 【 - <<< ︻ - < 】 - <<< ︼ - < 〔 - <<< ﹝ - <<< ︹ - < 〕 - <<< ﹞ - <<< ︺ - < 〖 - < 〗 - < 〘 - < 〙 - < 〚 - < 〛 - < ï´¾ - < ï´¿ - < § - < ¶ - < ⁋ - < © - < ® - < '@' - <<< ï¼  - <<< ﹫ - < '*' - <<< * - <<< ﹡ - < Ù­ - < '/' - <<< / - < ⁄ - < '\' - <<< ï¼¼ - <<< ﹨ - < '&' - <<< & - <<< ï¹  - < ⁊ - < '#' - <<< # - <<< ﹟ - < '%' - <<< % - <<< ﹪ - < Ùª - < ‰ - < ‱ - < † - < ‡ - < • - < ‣ - < ‧ - < ⁃ - < ⁌ - < ⁍ - < ′ - <<< ″ / ′ - <<< ‴ / ′′ - < ‵ - <<< ‶ / ‵ - <<< ‷ / ‵‵ - < 〃 - < ‸ - < ※ - < ‿ - < ⁀ - < ⁁ - < ⁂ - < ՚ - < ՛ - < ՟ - < Ö¾ - < ׀ - < ׃ - < ׳ - < ×´ - < ܊ - < ܋ - < ܌ - < ܍ - < ᠀ - < ᠊ - < ॰ - < à·´ - < ๚ - < ๛ - < ༄ - < ༅ - < ༆ - < ༇ - < ༈ - < ༉ - < ༊ - < ་ - <<< ༌ - < ། - < ༎ - < ༏ - < ༐ - < ༑ - < ༒ - < ྅ - < ၌ - < ၍ - < ၎ - < ၏ - < ៗ - < ៘ - < ៙ - < ៚ - < ៜ - < ʹ - < ͵ - < ʺ - < ˂ - < ˃ - < ˄ - < ˅ - < ˆ - < ˇ - < ˈ - < ˉ - < ˊ - < ˋ - < ˌ - < ˍ - < ˎ - < ˏ - < ˒ - < ˓ - < ˔ - < ˕ - < ˖ - < ˗ - < ˞ - < Ë¥ - < ˦ - < ˧ - < ˨ - < Ë© - < ˪ - < Ë« - < ˬ - < Ë­ - < ° - <<< ℃ / C - <<< ℉ / F - < ҂ - < Û© - < ৺ - < à­° - < ๏ - < ༁ - < ༂ - < ༃ - < ༓ - < ༕ - < ༖ - < ༗ - < ༚ - < ༛ - < ༜ - < ༝ - < ༞ - < ༟ - < ༴ - < ༶ - < ༸ - < ༾ - < ༿ - < ྾ - < ྿ - < ࿀ - < ࿁ - < ࿂ - < ࿃ - < ࿄ - < ࿅ - < ࿇ - < ࿈ - < ࿉ - < ࿊ - < ࿋ - < ࿌ - < ࿏ - < ᙭ - < ← - <<< ï¿© - < → - <<< ï¿« - < ↑ - <<< ↑ - < ↓ - <<< ↓ - < ↔ - < ↕ - < ↖ - < ↗ - < ↘ - < ↙ - < ↜ - < ↝ - < ↞ - < ↟ - < ↠ - < ↡ - < ↢ - < ↣ - < ↤ - < ↥ - < ↦ - < ↧ - < ↨ - < ↩ - < ↪ - < ↫ - < ↬ - < ↭ - < ↯ - < ↰ - < ↱ - < ↲ - < ↳ - < ↴ - < ↵ - < ↶ - < ↷ - < ↸ - < ↹ - < ↺ - < ↻ - < ↼ - < ↽ - < ↾ - < ↿ - < ⇀ - < ⇁ - < ⇂ - < ⇃ - < ⇄ - < ⇅ - < ⇆ - < ⇇ - < ⇈ - < ⇉ - < ⇊ - < ⇋ - < ⇌ - < ⇐ - < ⇑ - < ⇒ - < ⇓ - < ⇔ - < ⇕ - < ⇖ - < ⇗ - < ⇘ - < ⇙ - < ⇚ - < ⇛ - < ⇜ - < ⇝ - < ⇞ - < ⇟ - < ⇠ - < ⇡ - < ⇢ - < ⇣ - < ⇤ - < ⇥ - < ⇦ - < ⇧ - < ⇨ - < ⇩ - < ⇪ - < ⇫ - < ⇬ - < ⇭ - < ⇮ - < ⇯ - < ⇰ - < ⇱ - < ⇲ - < ⇳ - < ∀ - < ∁ - < ∂ - <<< 𝛛 - = 𝜕 - = 𝝏 - = 𝞉 - = 𝟃 - < ∃ - < ∅ - < ∆ - < ∇ - <<< 𝛁 - = 𝛻 - = 𝜵 - = 𝝯 - = 𝞩 - < ∈ - < ∊ - < ∋ - < ∍ - < ∎ - < ∏ - < ∐ - < ∑ - < '+' - <<< + - <<< ﬩ - <<< ï¹¢ - <<< ⁺ - <<< ₊ - < ± - < ÷ - < × - < '<' - <<< < - <<< ﹤ - < '=' - <<< = - <<< ﹦ - <<< ⁼ - <<< ₌ - < '>' - <<< > - <<< ï¹¥ - < ¬ - <<< ï¿¢ - < '|' - <<< | - < ¦ - <<< ¦ - < ‖ - < '~' - <<< ~ - < − - <<< ⁻ - <<< ₋ - < ∓ - < ∔ - < ∕ - < ∖ - < ∗ - < ∘ - < ∙ - < √ - < ∛ - < ∜ - < ∝ - < ∞ - < ∟ - < ∠ - < ∡ - < ∢ - < ∣ - < ∥ - < ∧ - < ∨ - < ∩ - < ∪ - < ∫ - <<< ∬ / ∫ - <<< ∭ / ∫∫ - < ∮ - <<< ∯ / ∮ - <<< ∰ / ∮∮ - < ∱ - < ∲ - < ∳ - < ∴ - < ∵ - < ∶ - < ∷ - < ∸ - < ∹ - < ∺ - < ∻ - < ∼ - < ∽ - < ∾ - < ∿ - < ≀ - < ≂ - < ≃ - < ≅ - < ≆ - < ≈ - < ≊ - < ≋ - < ≌ - < ≍ - < ≎ - < ≏ - < ≐ - < ≑ - < ≒ - < ≓ - < ≔ - < ≕ - < ≖ - < ≗ - < ≘ - < ≙ - < ≚ - < ≛ - < ≜ - < ≝ - < ≞ - < ≟ - < ≡ - < ≣ - < ≤ - < ≥ - < ≦ - < ≧ - < ≨ - < ≩ - < ≪ - < ≫ - < ≬ - < ≲ - < ≳ - < ≶ - < ≷ - < ≺ - < ≻ - < ≼ - < ≽ - < ≾ - < ≿ - < ⊂ - < ⊃ - < ⊆ - < ⊇ - < ⊊ - < ⊋ - < ⊌ - < ⊍ - < ⊎ - < ⊏ - < ⊐ - < ⊑ - < ⊒ - < ⊓ - < ⊔ - < ⊕ - < ⊖ - < ⊗ - < ⊘ - < ⊙ - < ⊚ - < ⊛ - < ⊜ - < ⊝ - < ⊞ - < ⊟ - < ⊠ - < ⊡ - < ⊢ - < ⊣ - < ⊤ - < ⊥ - < ⊦ - < ⊧ - < ⊨ - < ⊩ - < ⊪ - < ⊫ - < ⊰ - < ⊱ - < ⊲ - < ⊳ - < ⊴ - < ⊵ - < ⊶ - < ⊷ - < ⊸ - < ⊹ - < ⊺ - < ⊻ - < ⊼ - < ⊽ - < ⊾ - < ⊿ - < ⋀ - < ⋁ - < ⋂ - < ⋃ - < ⋄ - < ⋅ - < ⋆ - < ⋇ - < ⋈ - < ⋉ - < ⋊ - < ⋋ - < ⋌ - < ⋍ - < ⋎ - < ⋏ - < ⋐ - < ⋑ - < ⋒ - < ⋓ - < ⋔ - < ⋕ - < ⋖ - < ⋗ - < ⋘ - < ⋙ - < ⋚ - < ⋛ - < ⋜ - < ⋝ - < ⋞ - < ⋟ - < ⋤ - < ⋥ - < ⋦ - < ⋧ - < ⋨ - < ⋩ - < ⋮ - < ⋯ - < ⋰ - < ⋱ - < ⌀ - < ⌁ - < ⌂ - < ⌃ - < ⌄ - < ⌅ - < ⌆ - < ⌇ - < ⌈ - < ⌉ - < ⌊ - < ⌋ - < ⌌ - < ⌍ - < ⌎ - < ⌏ - < ⌐ - < ⌑ - < ⌒ - < ⌓ - < ⌔ - < ⌕ - < ⌖ - < ⌗ - < ⌘ - < ⌙ - < ⌚ - < ⌛ - < ⌜ - < ⌝ - < ⌞ - < ⌟ - < ⌠ - < ⌡ - < ⌢ - < ⌣ - < ⌤ - < ⌥ - < ⌦ - < ⌧ - < ⌨ - < ⌫ - < ⌬ - < ⌭ - < ⌮ - < ⌯ - < ⌰ - < ⌱ - < ⌲ - < ⌳ - < ⌴ - < ⌵ - < ⌶ - < ⌷ - < ⌸ - < ⌹ - < ⌺ - < ⌻ - < ⌼ - < ⌽ - < ⌾ - < ⌿ - < ⍀ - < ⍁ - < ⍂ - < ⍃ - < ⍄ - < ⍅ - < ⍆ - < ⍇ - < ⍈ - < ⍉ - < ⍊ - < ⍋ - < ⍌ - < ⍍ - < ⍎ - < ⍏ - < ⍐ - < ⍑ - < ⍒ - < ⍓ - < ⍔ - < ⍕ - < ⍖ - < ⍗ - < ⍘ - < ⍙ - < ⍚ - < ⍛ - < ⍜ - < ⍝ - < ⍞ - < ⍟ - < ⍠ - < ⍡ - < ⍢ - < ⍣ - < ⍤ - < ⍥ - < ⍦ - < ⍧ - < ⍨ - < ⍩ - < ⍪ - < ⍫ - < ⍬ - < ⍭ - < ⍮ - < ⍯ - < ⍰ - < ⍱ - < ⍲ - < ⍳ - < ⍴ - < ⍵ - < ⍶ - < ⍷ - < ⍸ - < ⍹ - < ⍺ - < ⍻ - < ⍽ - < ⍾ - < ⍿ - < ⎀ - < ⎁ - < ⎂ - < ⎃ - < ⎄ - < ⎅ - < ⎆ - < ⎇ - < ⎈ - < ⎉ - < ⎊ - < ⎋ - < ⎌ - < ⎍ - < ⎎ - < ⎏ - < ⎐ - < ⎑ - < ⎒ - < ⎓ - < ⎔ - < ⎕ - < ⎖ - < ⎗ - < ⎘ - < ⎙ - < ⎚ - < ␀ - < ␁ - < ␂ - < ␃ - < ␄ - < ␅ - < ␆ - < ␇ - < ␈ - < ␉ - < ␊ - < ␋ - < ␌ - < ␍ - < ␎ - < ␏ - < ␐ - < ␑ - < ␒ - < ␓ - < ␔ - < ␕ - < ␖ - < ␗ - < ␘ - < ␙ - < ␚ - < ␛ - < ␜ - < ␝ - < ␞ - < ␟ - < ␠ - < ␡ - < ␢ - < ␣ - < ␤ - < ␥ - < ␦ - < ⑀ - < ⑁ - < ⑂ - < ⑃ - < ⑄ - < ⑅ - < ⑆ - < ⑇ - < ⑈ - < ⑉ - < ⑊ - < ─ - < ━ - < │ - <<< │ - < ┃ - < ┄ - < ┅ - < ┆ - < ┇ - < ┈ - < ┉ - < ┊ - < ┋ - < ┌ - < ┍ - < ┎ - < ┏ - < ┐ - < ┑ - < ┒ - < ┓ - < └ - < ┕ - < ┖ - < ┗ - < ┘ - < ┙ - < ┚ - < ┛ - < ├ - < ┝ - < ┞ - < ┟ - < ┠ - < ┡ - < ┢ - < ┣ - < ┤ - < ┥ - < ┦ - < ┧ - < ┨ - < ┩ - < ┪ - < ┫ - < ┬ - < ┭ - < ┮ - < ┯ - < ┰ - < ┱ - < ┲ - < ┳ - < ┴ - < ┵ - < ┶ - < ┷ - < ┸ - < ┹ - < ┺ - < ┻ - < ┼ - < ┽ - < ┾ - < ┿ - < ╀ - < ╁ - < ╂ - < ╃ - < ╄ - < ╅ - < ╆ - < ╇ - < ╈ - < ╉ - < ╊ - < ╋ - < ╌ - < ╍ - < ╎ - < ╏ - < ═ - < ║ - < ╒ - < ╓ - < ╔ - < ╕ - < ╖ - < ╗ - < ╘ - < ╙ - < ╚ - < ╛ - < ╜ - < ╝ - < ╞ - < ╟ - < ╠ - < ╡ - < ╢ - < ╣ - < ╤ - < ╥ - < ╦ - < ╧ - < ╨ - < ╩ - < ╪ - < ╫ - < ╬ - < ╭ - < ╮ - < ╯ - < ╰ - < ╱ - < ╲ - < ╳ - < ╴ - < ╵ - < ╶ - < ╷ - < ╸ - < ╹ - < ╺ - < ╻ - < ╼ - < ╽ - < ╾ - < ╿ - < ▀ - < ▁ - < ▂ - < ▃ - < ▄ - < ▅ - < ▆ - < ▇ - < █ - < ▉ - < ▊ - < ▋ - < ▌ - < ▍ - < ▎ - < ▏ - < ▐ - < ░ - < ▒ - < ▓ - < ▔ - < ▕ - < ■ - <<< ï¿­ - < □ - < ▢ - < ▣ - < ▤ - < ▥ - < ▦ - < ▧ - < ▨ - < ▩ - < ▪ - < ▫ - < ▬ - < ▭ - < ▮ - < ▯ - < ▰ - < ▱ - < ▲ - < △ - < ▴ - < ▵ - < ▶ - < ▷ - < ▸ - < ▹ - < ► - < ▻ - < ▼ - < ▽ - < ▾ - < ▿ - < ◀ - < ◁ - < ◂ - < ◃ - < ◄ - < ◅ - < ◆ - < ◇ - < ◈ - < ◉ - < ◊ - < ○ - <<< ï¿® - < ◌ - < ◍ - < ◎ - < ● - < ◐ - < ◑ - < ◒ - < ◓ - < ◔ - < ◕ - < ◖ - < ◗ - < ◘ - < ◙ - < ◚ - < ◛ - < ◜ - < ◝ - < ◞ - < ◟ - < ◠ - < ◡ - < ◢ - < ◣ - < ◤ - < ◥ - < ◦ - < ◧ - < ◨ - < ◩ - < ◪ - < ◫ - < ◬ - < ◭ - < ◮ - < ◯ - < ◰ - < ◱ - < ◲ - < ◳ - < ◴ - < ◵ - < ◶ - < ◷ - < ☀ - < ☁ - < ☂ - < ☃ - < ☄ - < ★ - < ☆ - < ☇ - < ☈ - < ☉ - < ☊ - < ☋ - < ☌ - < ☍ - < ☎ - < ☏ - < ☐ - < ☑ - < ☒ - < ☓ - < ☙ - < ☚ - < ☛ - < ☜ - < ☝ - < ☞ - < ☟ - < ☠ - < ☡ - < ☢ - < ☣ - < ☤ - < ☥ - < ☦ - < ☧ - < ☨ - < ☩ - < ☪ - < ☫ - < ☬ - < ☭ - < ☮ - < ☯ - < ☰ - < ☱ - < ☲ - < ☳ - < ☴ - < ☵ - < ☶ - < ☷ - < ☸ - < ☹ - < ☺ - < ☻ - < ☼ - < ☽ - < ☾ - < ☿ - < ♀ - < ♁ - < ♂ - < ♃ - < ♄ - < ♅ - < ♆ - < ♇ - < ♈ - < ♉ - < ♊ - < ♋ - < ♌ - < ♍ - < ♎ - < ♏ - < ♐ - < ♑ - < ♒ - < ♓ - < ♔ - < ♕ - < ♖ - < ♗ - < ♘ - < ♙ - < ♚ - < ♛ - < ♜ - < ♝ - < ♞ - < ♟ - < ♠ - < ♡ - < ♢ - < ♣ - < ♤ - < ♥ - < ♦ - < ♧ - < ♨ - < ♩ - < ♪ - < ♫ - < ♬ - < ♰ - < ♱ - < ✁ - < ✂ - < ✃ - < ✄ - < ✆ - < ✇ - < ✈ - < ✉ - < ✌ - < ✍ - < ✎ - < ✏ - < ✐ - < ✑ - < ✒ - < ✓ - < ✔ - < ✕ - < ✖ - < ✗ - < ✘ - < ✙ - < ✚ - < ✛ - < ✜ - < ✝ - < ✞ - < ✟ - < ✠ - < ✡ - < ✢ - < ✣ - < ✤ - < ✥ - < ✦ - < ✧ - < ✩ - < ✪ - < ✫ - < ✬ - < ✭ - < ✮ - < ✯ - < ✰ - < ✱ - < ✲ - < ✳ - < ✴ - < ✵ - < ✶ - < ✷ - < ✸ - < ✹ - < ✺ - < ✻ - < ✼ - < ✽ - < ✾ - < ✿ - < ❀ - < ❁ - < ❂ - < ❃ - < ❄ - < ❅ - < ❆ - < ❇ - < ❈ - < ❉ - < ❊ - < ❋ - < ❍ - < ❏ - < ❐ - < ❑ - < ❒ - < ❖ - < ❘ - < ❙ - < ❚ - < ❛ - < ❜ - < ❝ - < ❞ - < ❡ - < ❢ - < ❣ - < ❤ - < ❥ - < ❦ - < ❧ - < ❿ - < ➉ - < ➓ - < ➔ - < ➘ - < ➙ - < ➚ - < ➛ - < ➜ - < ➝ - < ➞ - < ➟ - < ➠ - < ➡ - < ➢ - < ➣ - < ➤ - < ➥ - < ➦ - < ➧ - < ➨ - < ➩ - < ➪ - < ➫ - < ➬ - < ➭ - < ➮ - < ➯ - < ➱ - < ➲ - < ➳ - < ➴ - < ➵ - < ➶ - < ➷ - < ➸ - < ➹ - < ➺ - < ➻ - < ➼ - < ➽ - < ➾ - < ⠀ - < ⠁ - < ⠂ - < ⠃ - < ⠄ - < ⠅ - < ⠆ - < ⠇ - < ⠈ - < ⠉ - < ⠊ - < ⠋ - < ⠌ - < ⠍ - < ⠎ - < ⠏ - < ⠐ - < ⠑ - < ⠒ - < ⠓ - < ⠔ - < ⠕ - < ⠖ - < ⠗ - < ⠘ - < ⠙ - < ⠚ - < ⠛ - < ⠜ - < ⠝ - < ⠞ - < ⠟ - < â   - < â ¡ - < â ¢ - < â £ - < â ¤ - < â ¥ - < â ¦ - < â § - < â ¨ - < â © - < â ª - < â « - < â ¬ - < â ­ - < â ® - < â ¯ - < â ° - < â ± - < â ² - < â ³ - < â ´ - < â µ - < â ¶ - < â · - < â ¸ - < â ¹ - < â º - < â » - < â ¼ - < â ½ - < â ¾ - < â ¿ - < ⡀ - < ⡁ - < ⡂ - < ⡃ - < ⡄ - < ⡅ - < ⡆ - < ⡇ - < ⡈ - < ⡉ - < ⡊ - < ⡋ - < ⡌ - < ⡍ - < ⡎ - < ⡏ - < ⡐ - < ⡑ - < ⡒ - < ⡓ - < ⡔ - < ⡕ - < ⡖ - < ⡗ - < ⡘ - < ⡙ - < ⡚ - < ⡛ - < ⡜ - < ⡝ - < ⡞ - < ⡟ - < â¡  - < â¡¡ - < â¡¢ - < â¡£ - < ⡤ - < â¡¥ - < ⡦ - < â¡§ - < ⡨ - < â¡© - < ⡪ - < â¡« - < ⡬ - < â¡­ - < â¡® - < ⡯ - < â¡° - < ⡱ - < ⡲ - < ⡳ - < â¡´ - < ⡵ - < â¡¶ - < â¡· - < ⡸ - < ⡹ - < ⡺ - < â¡» - < ⡼ - < ⡽ - < ⡾ - < â¡¿ - < ⢀ - < ⢁ - < ⢂ - < ⢃ - < ⢄ - < ⢅ - < ⢆ - < ⢇ - < ⢈ - < ⢉ - < ⢊ - < ⢋ - < ⢌ - < ⢍ - < ⢎ - < ⢏ - < ⢐ - < ⢑ - < ⢒ - < ⢓ - < ⢔ - < ⢕ - < ⢖ - < ⢗ - < ⢘ - < ⢙ - < ⢚ - < ⢛ - < ⢜ - < ⢝ - < ⢞ - < ⢟ - < ⢠ - < ⢡ - < ⢢ - < ⢣ - < ⢤ - < ⢥ - < ⢦ - < ⢧ - < ⢨ - < ⢩ - < ⢪ - < ⢫ - < ⢬ - < ⢭ - < ⢮ - < ⢯ - < ⢰ - < ⢱ - < ⢲ - < ⢳ - < ⢴ - < ⢵ - < ⢶ - < ⢷ - < ⢸ - < ⢹ - < ⢺ - < ⢻ - < ⢼ - < ⢽ - < ⢾ - < ⢿ - < ⣀ - < ⣁ - < ⣂ - < ⣃ - < ⣄ - < ⣅ - < ⣆ - < ⣇ - < ⣈ - < ⣉ - < ⣊ - < ⣋ - < ⣌ - < ⣍ - < ⣎ - < ⣏ - < ⣐ - < ⣑ - < ⣒ - < ⣓ - < ⣔ - < ⣕ - < ⣖ - < ⣗ - < ⣘ - < ⣙ - < ⣚ - < ⣛ - < ⣜ - < ⣝ - < ⣞ - < ⣟ - < ⣠ - < ⣡ - < ⣢ - < ⣣ - < ⣤ - < ⣥ - < ⣦ - < ⣧ - < ⣨ - < ⣩ - < ⣪ - < ⣫ - < ⣬ - < ⣭ - < ⣮ - < ⣯ - < ⣰ - < ⣱ - < ⣲ - < ⣳ - < ⣴ - < ⣵ - < ⣶ - < ⣷ - < ⣸ - < ⣹ - < ⣺ - < ⣻ - < ⣼ - < ⣽ - < ⣾ - < ⣿ - < 𝀀 - < 𝀁 - < 𝀂 - < 𝀃 - < 𝀄 - < 𝀅 - < 𝀆 - < 𝀇 - < 𝀈 - < 𝀉 - < 𝀊 - < 𝀋 - < 𝀌 - < 𝀍 - < 𝀎 - < 𝀏 - < 𝀐 - < 𝀑 - < 𝀒 - < 𝀓 - < 𝀔 - < 𝀕 - < 𝀖 - < 𝀗 - < 𝀘 - < 𝀙 - < 𝀚 - < 𝀛 - < 𝀜 - < 𝀝 - < 𝀞 - < 𝀟 - < 𝀠 - < 𝀡 - < 𝀢 - < 𝀣 - < 𝀤 - < 𝀥 - < 𝀦 - < 𝀧 - < 𝀨 - < 𝀩 - < 𝀪 - < 𝀫 - < 𝀬 - < 𝀭 - < 𝀮 - < 𝀯 - < 𝀰 - < 𝀱 - < 𝀲 - < 𝀳 - < 𝀴 - < 𝀵 - < 𝀶 - < 𝀷 - < 𝀸 - < 𝀹 - < 𝀺 - < 𝀻 - < 𝀼 - < 𝀽 - < 𝀾 - < 𝀿 - < 𝁀 - < 𝁁 - < 𝁂 - < 𝁃 - < 𝁄 - < 𝁅 - < 𝁆 - < 𝁇 - < 𝁈 - < 𝁉 - < 𝁊 - < 𝁋 - < 𝁌 - < 𝁍 - < 𝁎 - < 𝁏 - < 𝁐 - < 𝁑 - < 𝁒 - < 𝁓 - < 𝁔 - < 𝁕 - < 𝁖 - < 𝁗 - < 𝁘 - < 𝁙 - < 𝁚 - < 𝁛 - < 𝁜 - < 𝁝 - < 𝁞 - < 𝁟 - < 𝁠 - < 𝁡 - < 𝁢 - < 𝁣 - < 𝁤 - < 𝁥 - < 𝁦 - < 𝁧 - < 𝁨 - < 𝁩 - < 𝁪 - < 𝁫 - < 𝁬 - < 𝁭 - < 𝁮 - < 𝁯 - < 𝁰 - < 𝁱 - < 𝁲 - < 𝁳 - < 𝁴 - < 𝁵 - < 𝁶 - < 𝁷 - < 𝁸 - < 𝁹 - < 𝁺 - < 𝁻 - < 𝁼 - < 𝁽 - < 𝁾 - < 𝁿 - < 𝂀 - < 𝂁 - < 𝂂 - < 𝂃 - < 𝂄 - < 𝂅 - < 𝂆 - < 𝂇 - < 𝂈 - < 𝂉 - < 𝂊 - < 𝂋 - < 𝂌 - < 𝂍 - < 𝂎 - < 𝂏 - < 𝂐 - < 𝂑 - < 𝂒 - < 𝂓 - < 𝂔 - < 𝂕 - < 𝂖 - < 𝂗 - < 𝂘 - < 𝂙 - < 𝂚 - < 𝂛 - < 𝂜 - < 𝂝 - < 𝂞 - < 𝂟 - < 𝂠 - < 𝂡 - < 𝂢 - < 𝂣 - < 𝂤 - < 𝂥 - < 𝂦 - < 𝂧 - < 𝂨 - < 𝂩 - < 𝂪 - < 𝂫 - < 𝂬 - < 𝂭 - < 𝂮 - < 𝂯 - < 𝂰 - < 𝂱 - < 𝂲 - < 𝂳 - < 𝂴 - < 𝂵 - < 𝂶 - < 𝂷 - < 𝂸 - < 𝂹 - < 𝂺 - < 𝂻 - < 𝂼 - < 𝂽 - < 𝂾 - < 𝂿 - < 𝃀 - < 𝃁 - < 𝃂 - < 𝃃 - < 𝃄 - < 𝃅 - < 𝃆 - < 𝃇 - < 𝃈 - < 𝃉 - < 𝃊 - < 𝃋 - < 𝃌 - < 𝃍 - < 𝃎 - < 𝃏 - < 𝃐 - < 𝃑 - < 𝃒 - < 𝃓 - < 𝃔 - < 𝃕 - < 𝃖 - < 𝃗 - < 𝃘 - < 𝃙 - < 𝃚 - < 𝃛 - < 𝃜 - < 𝃝 - < 𝃞 - < 𝃟 - < 𝃠 - < 𝃡 - < 𝃢 - < 𝃣 - < 𝃤 - < 𝃥 - < 𝃦 - < 𝃧 - < 𝃨 - < 𝃩 - < 𝃪 - < 𝃫 - < 𝃬 - < 𝃭 - < 𝃮 - < 𝃯 - < 𝃰 - < 𝃱 - < 𝃲 - < 𝃳 - < 𝃴 - < 𝃵 - < 𝄀 - < 𝄁 - < 𝄂 - < 𝄃 - < 𝄄 - < 𝄅 - < 𝄆 - < 𝄇 - < 𝄈 - < 𝄉 - < 𝄊 - < 𝄋 - < 𝄌 - < 𝄍 - < 𝄎 - < 𝄏 - < 𝄐 - < 𝄑 - < 𝄒 - < 𝄓 - < 𝄔 - < 𝄕 - < 𝄖 - < 𝄗 - < 𝄘 - < 𝄙 - < 𝄚 - < 𝄛 - < 𝄜 - < 𝄝 - < 𝄞 - < 𝄟 - < 𝄠 - < 𝄡 - < 𝄢 - < 𝄣 - < 𝄤 - < 𝄥 - < 𝄦 - < 𝄪 - < 𝄫 - < 𝄬 - < 𝄭 - < 𝄮 - < 𝄯 - < 𝄰 - < 𝄱 - < 𝄲 - < 𝄳 - < 𝄴 - < 𝄵 - < 𝄶 - < 𝄷 - < 𝄸 - < 𝄹 - < 𝄺 - < 𝄻 - < 𝄼 - < 𝄽 - < 𝄾 - < 𝄿 - < 𝅀 - < 𝅁 - < 𝅂 - < 𝅃 - < 𝅄 - < 𝅅 - < 𝅆 - < 𝅇 - < 𝅈 - < 𝅉 - < 𝅊 - < 𝅋 - < 𝅌 - < 𝅍 - < 𝅎 - < 𝅏 - < 𝅐 - < 𝅑 - < 𝅒 - < 𝅓 - < 𝅔 - < 𝅕 - < 𝅖 - < 𝅗 - = 𝅗𝅥 - < 𝅘 - = 𝅘𝅥 - = 𝅘𝅥𝅮 - = 𝅘𝅥𝅯 - = 𝅘𝅥𝅰 - = 𝅘𝅥𝅱 - = 𝅘𝅥𝅲 - < 𝅙 - < 𝅚 - < 𝅛 - < 𝅜 - < 𝅝 - < 𝅪 - < 𝅫 - < 𝅬 - < 𝆃 - < 𝆄 - < 𝆌 - < 𝆍 - < 𝆎 - < 𝆏 - < 𝆐 - < 𝆑 - < 𝆒 - < 𝆓 - < 𝆔 - < 𝆕 - < 𝆖 - < 𝆗 - < 𝆘 - < 𝆙 - < 𝆚 - < 𝆛 - < 𝆜 - < 𝆝 - < 𝆞 - < 𝆟 - < 𝆠 - < 𝆡 - < 𝆢 - < 𝆣 - < 𝆤 - < 𝆥 - < 𝆦 - < 𝆧 - < 𝆨 - < 𝆩 - < 𝆮 - < 𝆯 - < 𝆰 - < 𝆱 - < 𝆲 - < 𝆳 - < 𝆴 - < 𝆵 - < 𝆶 - < 𝆷 - < 𝆸 - < 𝆹 - = 𝆹𝅥 - = 𝆹𝅥𝅮 - = 𝆹𝅥𝅯 - < 𝆺 - = 𝆺𝅥 - = 𝆺𝅥𝅮 - = 𝆺𝅥𝅯 - < 𝇁 - < 𝇂 - < 𝇃 - < 𝇄 - < 𝇅 - < 𝇆 - < 𝇇 - < 𝇈 - < 𝇉 - < 𝇊 - < 𝇋 - < 𝇌 - < 𝇍 - < 𝇎 - < 𝇏 - < 𝇐 - < 𝇑 - < 𝇒 - < 𝇓 - < 𝇔 - < 𝇕 - < 𝇖 - < 𝇗 - < 𝇘 - < 𝇙 - < 𝇚 - < 𝇛 - < 𝇜 - < 𝇝 - < â¿° - < ⿱ - < ⿲ - < ⿳ - < â¿´ - < ⿵ - < â¿¶ - < â¿· - < ⿸ - < ⿹ - < ⿺ - < â¿» - < 〄 - < 〒 - <<< 〶 - < 〓 - < 〠 - < 〷 - < 〾 - < 〿 - < ㆐ - < ㆑ - < ㉿ - <  - < � - < ৸ - < à§¹ - < ௰ - < ௱ - < ௲ - < ፲ - < ፳ - < ፴ - < ፵ - < ፶ - < ፷ - < ፸ - < ፹ - < ፺ - < ፻ - < ፼ - < 𐌢 - < 𐌣 - < [variable top] - < ː - < ˑ - < ๆ - < ໆ - < 々 - < 〱 - <<< 〲 / ゙ - < 〳 - <<< 〴 / ゙ - < 〵 - < ゝ - < ー - <<< ï½° - < ヽ - < ¤ - < ¢ - <<< ï¿  - < '$' - <<< $ - <<< ﹩ - < £ - <<< ï¿¡ - < Â¥ - <<< ï¿¥ - < à§² - < à§³ - < ฿ - < ៛ - < ₠ - < ₡ - < ₢ - < ₣ - < ₤ - < ₥ - < ₦ - < ₧ - < ₩ - <<< ₩ - < ₪ - < ₫ - < € - < ₭ - < ₮ - < ₯ - < ℄ - < ℈ - < ℔ - < ℗ - < ℘ - < ℞ - < ℟ - < ℣ - < ℥ - < ℧ - < ℩ - < ℮ - < Ⅎ - < ℺ - < ↀ - < ↁ - < ↂ - < Ↄ - < ♭ - < ♮ - < ♯ - < 0 - <<< 0 - <<< ㍘ / 点 - <<< 𝟎 - = 𝟘 - = 𝟢 - = 𝟬 - = 𝟶 - <<< ⓪ - <<< ⁰ - <<< ₀ - << Ù  - << Û° - << ० - << ০ - << ੦ - << ૦ - << à­¦ - << ౦ - << ೦ - << ൦ - << ๐ - << ໐ - << ༠ - = ༳ - << ၀ - << ០ - << ᠐ - << 〇 - < 1 - <<< 1 - <<< ⒈ / '.' - <<< ⒑ / 0'.' - <<< ㏩ / 0日 - <<< ㋉ / 0月 - <<< ㍢ / 0点 - <<< ⒒ / 1'.' - <<< ㏪ / 1日 - <<< ㋊ / 1月 - <<< ㍣ / 1点 - <<< ⒓ / 2'.' - <<< ㏫ / 2日 - <<< ㋋ / 2月 - <<< ㍤ / 2点 - <<< ⒔ / 3'.' - <<< ㏬ / 3日 - <<< ㍥ / 3点 - <<< ⒕ / 4'.' - <<< ㏭ / 4日 - <<< ㍦ / 4点 - <<< ⒖ / 5'.' - <<< ㏮ / 5日 - <<< ㍧ / 5点 - <<< ⒗ / 6'.' - <<< ㏯ / 6日 - <<< ㍨ / 6点 - <<< ⒘ / 7'.' - <<< ㏰ / 7日 - <<< ㍩ / 7点 - <<< ⒙ / 8'.' - <<< ㏱ / 8日 - <<< ㍪ / 8点 - <<< ⒚ / 9'.' - <<< ㏲ / 9日 - <<< ㍫ / 9点 - <<< ㏠ / 日 - <<< ㋀ / 月 - <<< ㍙ / 点 - <<< 𝟏 - = 𝟙 - = 𝟣 - = 𝟭 - = 𝟷 - <<< ① - <<< ⑩ / 0 - <<< ⑪ / 1 - <<< ⑫ / 2 - <<< ⑬ / 3 - <<< ⑭ / 4 - <<< ⑮ / 5 - <<< ⑯ / 6 - <<< ⑰ / 7 - <<< ⑱ / 8 - <<< ⑲ / 9 - <<< ¹ - <<< ₁ - <<< ⅟ / ⁄ - <<< ½ / ⁄2 - <<< ⅓ / ⁄3 - <<< ¼ / ⁄4 - <<< ⅕ / ⁄5 - <<< ⅙ / ⁄6 - <<< ⅛ / ⁄8 - << ❶ - << ➀ - << ➊ - << Ù¡ - << Û± - << ፩ - << १ - << à§§ - << à§´ - << à©§ - << à«§ - << à­§ - << ௧ - << à±§ - << à³§ - << ൧ - << ๑ - << ໑ - << ༡ - = ༪ - << ၁ - << ១ - << ᠑ - << 〡 - << 𐌠 - < 2 - <<< 2 - <<< ⒉ / '.' - <<< ⒛ / 0'.' - <<< ㏳ / 0日 - <<< ㍬ / 0点 - <<< ㏴ / 1日 - <<< ㍭ / 1点 - <<< ㏵ / 2日 - <<< ㍮ / 2点 - <<< ㏶ / 3日 - <<< ㍯ / 3点 - <<< ㏷ / 4日 - <<< ㍰ / 4点 - <<< ㏸ / 5日 - <<< ㏹ / 6日 - <<< ㏺ / 7日 - <<< ㏻ / 8日 - <<< ㏼ / 9日 - <<< ㏡ / 日 - <<< ㋁ / 月 - <<< ㍚ / 点 - <<< 𝟐 - = 𝟚 - = 𝟤 - = 𝟮 - = 𝟸 - <<< ② - <<< ⑳ / 0 - <<< ² - <<< ₂ - <<< ⅔ / ⁄3 - <<< ⅖ / ⁄5 - << ❷ - << ➁ - << ➋ - << Ù¢ - << Û² - << ፪ - << २ - << ২ - << à§µ - << ੨ - << ૨ - << à­¨ - << ௨ - << ౨ - << ೨ - << ൨ - << ๒ - << ໒ - << ༢ - = ༫ - << ၂ - << ២ - << ᠒ - << 〢 - < 3 - <<< 3 - <<< ⒊ / '.' - <<< ㏽ / 0日 - <<< ㏾ / 1日 - <<< ㏢ / 日 - <<< ㋂ / 月 - <<< ㍛ / 点 - <<< 𝟑 - = 𝟛 - = 𝟥 - = 𝟯 - = 𝟹 - <<< ③ - <<< ³ - <<< ₃ - <<< ¾ / ⁄4 - <<< ⅗ / ⁄5 - <<< ⅜ / ⁄8 - << ❸ - << ➂ - << ➌ - << Ù£ - << Û³ - << ፫ - << ३ - << à§© - << à§¶ - << à©© - << à«© - << à­© - << ௩ - << ౩ - << ೩ - << ൩ - << ๓ - << ໓ - << ༣ - = ༬ - << ၃ - << ៣ - << ᠓ - << 〣 - < 4 - <<< 4 - <<< ⒋ / '.' - <<< ㏣ / 日 - <<< ㋃ / 月 - <<< ㍜ / 点 - <<< 𝟒 - = 𝟜 - = 𝟦 - = 𝟰 - = 𝟺 - <<< ④ - <<< ⁴ - <<< ₄ - <<< ⅘ / ⁄5 - << ❹ - << ➃ - << ➍ - << Ù¤ - << Û´ - << ፬ - << ४ - << ৪ - << à§· - << ੪ - << ૪ - << à­ª - << ௪ - << ౪ - << ೪ - << ൪ - << ๔ - << ໔ - << ༤ - = ༭ - << ၄ - << ៤ - << ᠔ - << 〤 - < 5 - <<< 5 - <<< ⒌ / '.' - <<< ㏤ / 日 - <<< ㋄ / 月 - <<< ㍝ / 点 - <<< 𝟓 - = 𝟝 - = 𝟧 - = 𝟱 - = 𝟻 - <<< ⑤ - <<< ⁵ - <<< ₅ - <<< ⅚ / ⁄6 - <<< ⅝ / ⁄8 - << ❺ - << ➄ - << ➎ - << Ù¥ - << Ûµ - << ፭ - << ५ - << à§« - << à©« - << à«« - << à­« - << ௫ - << ౫ - << ೫ - << ൫ - << ๕ - << ໕ - << ༥ - = ༮ - << ၅ - << ៥ - << ᠕ - << 〥 - << 𐌡 - < 6 - <<< 6 - <<< ⒍ / '.' - <<< ㏥ / 日 - <<< ㋅ / 月 - <<< ㍞ / 点 - <<< 𝟔 - = 𝟞 - = 𝟨 - = 𝟲 - = 𝟼 - <<< ⑥ - <<< ⁶ - <<< ₆ - << ❻ - << ➅ - << ➏ - << Ù¦ - << Û¶ - << ፮ - << ६ - << ৬ - << ੬ - << ૬ - << à­¬ - << ௬ - << ౬ - << ೬ - << ൬ - << ๖ - << ໖ - << ༦ - = ༯ - << ၆ - << ៦ - << ᠖ - << 〦 - < 7 - <<< 7 - <<< ⒎ / '.' - <<< ㏦ / 日 - <<< ㋆ / 月 - <<< ㍟ / 点 - <<< 𝟕 - = 𝟟 - = 𝟩 - = 𝟳 - = 𝟽 - <<< ⑦ - <<< ⁷ - <<< ₇ - <<< ⅞ / ⁄8 - << ❼ - << ➆ - << ➐ - << Ù§ - << Û· - << ፯ - << ७ - << à§­ - << à©­ - << à«­ - << à­­ - << ௭ - << à±­ - << à³­ - << ൭ - << ๗ - << ໗ - << ༧ - = ༰ - << ၇ - << ៧ - << ᠗ - << 〧 - < 8 - <<< 8 - <<< ⒏ / '.' - <<< ㏧ / 日 - <<< ㋇ / 月 - <<< ㍠ / 点 - <<< 𝟖 - = 𝟠 - = 𝟪 - = 𝟴 - = 𝟾 - <<< ⑧ - <<< ⁸ - <<< ₈ - << ❽ - << ➇ - << ➑ - << Ù¨ - << Û¸ - << ፰ - << ८ - << à§® - << à©® - << à«® - << à­® - << ௮ - << à±® - << à³® - << ൮ - << ๘ - << ໘ - << ༨ - = ༱ - << ၈ - << ៨ - << ᠘ - << 〨 - < 9 - <<< 9 - <<< ⒐ / '.' - <<< ㏨ / 日 - <<< ㋈ / 月 - <<< ㍡ / 点 - <<< 𝟗 - = 𝟡 - = 𝟫 - = 𝟵 - = 𝟿 - <<< ⑨ - <<< ⁹ - <<< ₉ - << ❾ - << ➈ - << ➒ - << Ù© - << Û¹ - << ፱ - << ९ - << ৯ - << ੯ - << ૯ - << à­¯ - << ௯ - << ౯ - << ೯ - << ൯ - << ๙ - << ໙ - << ༩ - = ༲ - << ၉ - << ៩ - << ᠙ - << 〩 - < a - <<< a - <<< ℀ / '/'c - <<< ℁ / '/'s - <<< ẚ / ʾ - <<< 𝐚 - = 𝑎 - = 𝒂 - = 𝒶 - = 𝓪 - = 𝔞 - = 𝕒 - = 𝖆 - = 𝖺 - = 𝗮 - = 𝘢 - = 𝙖 - = 𝚊 - <<< ⓐ - <<< A - <<< A - <<< 𝐀 - = 𝐴 - = 𝑨 - = 𝒜 - = 𝓐 - = 𝔄 - = 𝔸 - = 𝕬 - = 𝖠 - = 𝗔 - = 𝘈 - = 𝘼 - = 𝙰 - <<< Ⓐ - <<< ª - <<< ㏂ / '.'m'.' - <<< ㍳ / U - < æ - <<< Æ - < ɐ - < ɑ - < ɒ - < b - <<< b - <<< 𝐛 - = 𝑏 - = 𝒃 - = 𝒷 - = 𝓫 - = 𝔟 - = 𝕓 - = 𝖇 - = 𝖻 - = 𝗯 - = 𝘣 - = 𝙗 - = 𝚋 - <<< ⓑ - <<< B - <<< ï¼¢ - <<< ℬ - = 𝐁 - = 𝐵 - = 𝑩 - = 𝓑 - = 𝔅 - = 𝔹 - = 𝕭 - = 𝖡 - = 𝗕 - = 𝘉 - = 𝘽 - = 𝙱 - <<< Ⓑ - <<< ㍴ / ar - <<< ㏃ / q - < ʙ - < ƀ - < ɓ - <<< Ɓ - < ƃ - <<< Ƃ - < c - <<< c - <<< ⅽ - <<< ℅ / '/'o - <<< ℆ / '/'u - <<< 𝐜 - = 𝑐 - = 𝒄 - = 𝒸 - = 𝓬 - = 𝔠 - = 𝕔 - = 𝖈 - = 𝖼 - = 𝗰 - = 𝘤 - = 𝙘 - = 𝚌 - <<< ⓒ - <<< C - <<< ï¼£ - <<< Ⅽ - <<< ℂ - = ℭ - = 𝐂 - = 𝐶 - = 𝑪 - = 𝒞 - = 𝓒 - = 𝕮 - = 𝖢 - = 𝗖 - = 𝘊 - = 𝘾 - = 𝙲 - <<< Ⓒ - <<< ㎈ / al - <<< ㏄ / c - <<< ㏅ / d - <<< ㎝ / m - <<< ㎠ / m2 - <<< ㎤ / m3 - <<< ㏆ / ∕kg - <<< ㏇ / o'.' - < ƈ - <<< Ƈ - < ɕ - < d - <<< d - <<< ⅾ - <<< dz / z - = Ê£ / z - <<< dž / ž - <<< Ê¥ / ʑ - <<< ʤ / ʒ - <<< 𝐝 - = 𝑑 - = 𝒅 - = 𝒹 - = 𝓭 - = 𝔡 - = 𝕕 - = 𝖉 - = 𝖽 - = 𝗱 - = 𝘥 - = 𝙙 - = 𝚍 - <<< ⓓ - <<< D - <<< D - <<< Ⅾ - <<< Dz / z - <<< DZ / Z - <<< Dž / ž - <<< DŽ / Ž - <<< 𝐃 - = 𝐷 - = 𝑫 - = 𝒟 - = 𝓓 - = 𝔇 - = 𝔻 - = 𝕯 - = 𝖣 - = 𝗗 - = 𝘋 - = 𝘿 - = 𝙳 - <<< Ⓓ - <<< ㍲ / a - <<< ㏈ / B - <<< ㎗ / l - < đ - <<< Đ - < ɖ - <<< Ɖ - < ɗ - <<< Ɗ - < ƌ - <<< Ƌ - < ð - <<< Ð - < ƍ - < e - <<< e - <<< ℯ - = 𝐞 - = 𝑒 - = 𝒆 - = 𝓮 - = 𝔢 - = 𝕖 - = 𝖊 - = 𝖾 - = 𝗲 - = 𝘦 - = 𝙚 - = 𝚎 - <<< ⓔ - <<< E - <<< ï¼¥ - <<< ℰ - = 𝐄 - = 𝐸 - = 𝑬 - = 𝓔 - = 𝔈 - = 𝔼 - = 𝕰 - = 𝖤 - = 𝗘 - = 𝘌 - = 𝙀 - = 𝙴 - <<< Ⓔ - < ǝ - <<< Ǝ - < ə - <<< Ə - < ɛ - <<< Ɛ - <<< ℇ - < ɘ - < ɚ - < ɜ - < ɝ - < ɞ - < ʚ - < ɤ - < f - <<< f - <<< ff / f - <<< ffi / fi - <<< ffl / fl - <<< fi / i - <<< fl / l - <<< Ê© / ŋ - <<< 𝐟 - = 𝑓 - = 𝒇 - = 𝒻 - = 𝓯 - = 𝔣 - = 𝕗 - = 𝖋 - = 𝖿 - = 𝗳 - = 𝘧 - = 𝙛 - = 𝚏 - <<< ⓕ - <<< F - <<< F - <<< ℱ - = 𝐅 - = 𝐹 - = 𝑭 - = 𝓕 - = 𝔉 - = 𝔽 - = 𝕱 - = 𝖥 - = 𝗙 - = 𝘍 - = 𝙁 - = 𝙵 - <<< Ⓕ - <<< ㎙ / m - < ƒ - <<< Ƒ - < g - <<< g - <<< ℊ - = 𝐠 - = 𝑔 - = 𝒈 - = 𝓰 - = 𝔤 - = 𝕘 - = 𝖌 - = 𝗀 - = 𝗴 - = 𝘨 - = 𝙜 - = 𝚐 - <<< ⓖ - <<< G - <<< ï¼§ - <<< 𝐆 - = 𝐺 - = 𝑮 - = 𝒢 - = 𝓖 - = 𝔊 - = 𝔾 - = 𝕲 - = 𝖦 - = 𝗚 - = 𝘎 - = 𝙂 - = 𝙶 - <<< Ⓖ - <<< ㎇ / B - <<< ㎓ / Hz - <<< ㎬ / Pa - <<< ㏉ / y - < É¢ - < Ç¥ - <<< Ǥ - < É  - <<< Ɠ - < ʛ - < É£ - <<< Ɣ - <<< Ë  - < É¡ - < Æ£ - <<< Æ¢ - < h - <<< h - <<< ℎ - = 𝐡 - = 𝒉 - = 𝒽 - = 𝓱 - = 𝔥 - = 𝕙 - = 𝖍 - = 𝗁 - = 𝗵 - = 𝘩 - = 𝙝 - = 𝚑 - <<< ⓗ - <<< H - <<< H - <<< ℋ - = ℌ - = ℍ - = 𝐇 - = 𝐻 - = 𝑯 - = 𝓗 - = 𝕳 - = 𝖧 - = 𝗛 - = 𝘏 - = 𝙃 - = 𝙷 - <<< Ⓗ - <<< ʰ - <<< ㏊ / a - <<< ㍱ / Pa - <<< ㏋ / P - <<< ㎐ / z - < ʜ - < ƕ - <<< Ƕ - < ħ - <<< ℏ - <<< Ħ - < ɦ - <<< ʱ - < ɧ - < Ê» - < ʽ - < i - <<< i - <<< ⅰ - <<< ⅱ / i - <<< ⅲ / ii - <<< ij / j - <<< ⅳ / v - <<< ⅸ / x - <<< ℹ - = 𝐢 - = 𝑖 - = 𝒊 - = 𝒾 - = 𝓲 - = 𝔦 - = 𝕚 - = 𝖎 - = 𝗂 - = 𝗶 - = 𝘪 - = 𝙞 - = 𝚒 - <<< ⓘ - <<< I - <<< I - <<< Ⅰ - <<< Ⅱ / I - <<< Ⅲ / Ii - <<< IJ / J - <<< Ⅳ / V - <<< Ⅸ / X - <<< ℐ - = ℑ - = 𝐈 - = 𝐼 - = 𝑰 - = 𝓘 - = 𝕀 - = 𝕴 - = 𝖨 - = 𝗜 - = 𝘐 - = 𝙄 - = 𝙸 - <<< Ⓘ - <<< ㏌ / n - < ı - < ɪ - < ɨ - <<< Ɨ - < É© - <<< Ɩ - < j - <<< j - <<< 𝐣 - = 𝑗 - = 𝒋 - = 𝒿 - = 𝓳 - = 𝔧 - = 𝕛 - = 𝖏 - = 𝗃 - = 𝗷 - = 𝘫 - = 𝙟 - = 𝚓 - <<< ⓙ - <<< J - <<< J - <<< 𝐉 - = 𝐽 - = 𝑱 - = 𝒥 - = 𝓙 - = 𝔍 - = 𝕁 - = 𝕵 - = 𝖩 - = 𝗝 - = 𝘑 - = 𝙅 - = 𝙹 - <<< Ⓙ - <<< ʲ - < ʝ - < ɟ - < ʄ - < k - <<< k - <<< 𝐤 - = 𝑘 - = 𝒌 - = 𝓀 - = 𝓴 - = 𝔨 - = 𝕜 - = 𝖐 - = 𝗄 - = 𝗸 - = 𝘬 - = 𝙠 - = 𝚔 - <<< ⓚ - <<< K - <<< K - <<< 𝐊 - = 𝐾 - = 𝑲 - = 𝒦 - = 𝓚 - = 𝔎 - = 𝕂 - = 𝕶 - = 𝖪 - = 𝗞 - = 𝘒 - = 𝙆 - = 𝙺 - <<< Ⓚ - <<< ㎄ / A - <<< ㎉ / cal - <<< ㎏ / g - <<< ㎑ / Hz - <<< ㎘ / l - <<< ㎞ / m - <<< ㎢ / m2 - <<< ㎦ / m3 - <<< ㎪ / Pa - <<< ㏏ / t - <<< ㎸ / V - <<< ㎾ / W - <<< ㏀ / Ω - <<< ㎅ / B - <<< ㏍ / K - <<< ㏎ / M - < ƙ - <<< Ƙ - < ʞ - < l - <<< l - <<< ⅼ - <<< ŀ / · - <<< lj / j - <<< ʪ / s - <<< Ê« / z - <<< ℓ - = 𝐥 - = 𝑙 - = 𝒍 - = 𝓵 - = 𝔩 - = 𝕝 - = 𝖑 - = 𝗅 - = 𝗹 - = 𝘭 - = 𝙡 - = 𝚕 - <<< ⓛ - <<< L - <<< L - <<< Ⅼ - <<< Ä¿ / · - <<< Lj / j - <<< LJ / J - <<< ℒ - = 𝐋 - = 𝐿 - = 𝑳 - = 𝓛 - = 𝔏 - = 𝕃 - = 𝕷 - = 𝖫 - = 𝗟 - = 𝘓 - = 𝙇 - = 𝙻 - <<< Ⓛ - <<< Ë¡ - <<< ㏐ / m - <<< ㏑ / n - <<< ㏒ / og - <<< ㏓ / x - < ʟ - < ł - <<< Ł - < ƚ - < É« - < ɬ - < É­ - < É® - < ƛ - < ʎ - < m - <<< m - <<< ⅿ - <<< 𝐦 - = 𝑚 - = 𝒎 - = 𝓂 - = 𝓶 - = 𝔪 - = 𝕞 - = 𝖒 - = 𝗆 - = 𝗺 - = 𝘮 - = 𝙢 - = 𝚖 - <<< ⓜ - <<< M - <<< ï¼­ - <<< Ⅿ - <<< ℳ - = 𝐌 - = 𝑀 - = 𝑴 - = 𝓜 - = 𝔐 - = 𝕄 - = 𝕸 - = 𝖬 - = 𝗠 - = 𝘔 - = 𝙈 - = 𝙼 - <<< Ⓜ - <<< ㎧ / ∕s - <<< ㎨ / ∕s2 - <<< ㎡ / 2 - <<< ㎥ / 3 - <<< ㎃ / A - <<< ㏔ / b - <<< ㎎ / g - <<< ㏕ / il - <<< ㎖ / l - <<< ㎜ / m - <<< ㎟ / m2 - <<< ㎣ / m3 - <<< ㏖ / ol - <<< ㎳ / s - <<< ㎷ / V - <<< ㎽ / W - <<< ㎆ / B - <<< ㎒ / Hz - <<< ㎫ / Pa - <<< ㎹ / V - <<< ㎿ / W - <<< ㏁ / Ω - < ɱ - < n - <<< n - <<< nj / j - <<< 𝐧 - = 𝑛 - = 𝒏 - = 𝓃 - = 𝓷 - = 𝔫 - = 𝕟 - = 𝖓 - = 𝗇 - = 𝗻 - = 𝘯 - = 𝙣 - = 𝚗 - <<< ⓝ - <<< N - <<< ï¼® - <<< Nj / j - <<< NJ / J - <<< № / o - <<< ℕ - = 𝐍 - = 𝑁 - = 𝑵 - = 𝒩 - = 𝓝 - = 𝔑 - = 𝕹 - = 𝖭 - = 𝗡 - = 𝘕 - = 𝙉 - = 𝙽 - <<< Ⓝ - <<< ⁿ - <<< ㎁ / A - <<< ㎋ / F - <<< ㎚ / m - <<< ㎱ / s - <<< ㎵ / V - <<< ㎻ / W - < É´ - < ɲ - <<< Ɲ - < ƞ - < ɳ - < ŋ - <<< Ŋ - < o - <<< o - <<< ℴ - = 𝐨 - = 𝑜 - = 𝒐 - = 𝓸 - = 𝔬 - = 𝕠 - = 𝖔 - = 𝗈 - = 𝗼 - = 𝘰 - = 𝙤 - = 𝚘 - <<< ⓞ - <<< O - <<< O - <<< 𝐎 - = 𝑂 - = 𝑶 - = 𝒪 - = 𝓞 - = 𝔒 - = 𝕆 - = 𝕺 - = 𝖮 - = 𝗢 - = 𝘖 - = 𝙊 - = 𝙾 - <<< Ⓞ - <<< º - <<< ㍵ / V - << œ / e - <<< Œ / e - < ɶ - < ø - <<< Ø - < ɔ - <<< Ɔ - < ɵ - <<< Ɵ - < É· - < È£ - <<< È¢ - < p - <<< p - <<< 𝐩 - = 𝑝 - = 𝒑 - = 𝓅 - = 𝓹 - = 𝔭 - = 𝕡 - = 𝖕 - = 𝗉 - = 𝗽 - = 𝘱 - = 𝙥 - = 𝚙 - <<< ⓟ - <<< P - <<< ï¼° - <<< ℙ - = 𝐏 - = 𝑃 - = 𝑷 - = 𝒫 - = 𝓟 - = 𝔓 - = 𝕻 - = 𝖯 - = 𝗣 - = 𝘗 - = 𝙋 - = 𝙿 - <<< Ⓟ - <<< ㏘ / '.'m'.' - <<< ㎀ / A - <<< ㍶ / c - <<< ㎊ / F - <<< ㎰ / s - <<< ㎴ / V - <<< ㎺ / W - <<< ㎩ / a - <<< ㏗ / H - <<< ㏙ / Pm - <<< ㏚ / R - < Æ¥ - <<< Ƥ - < ɸ - < q - <<< q - <<< 𝐪 - = 𝑞 - = 𝒒 - = 𝓆 - = 𝓺 - = 𝔮 - = 𝕢 - = 𝖖 - = 𝗊 - = 𝗾 - = 𝘲 - = 𝙦 - = 𝚚 - <<< ⓠ - <<< Q - <<< ï¼± - <<< ℚ - = 𝐐 - = 𝑄 - = 𝑸 - = 𝒬 - = 𝓠 - = 𝔔 - = 𝕼 - = 𝖰 - = 𝗤 - = 𝘘 - = 𝙌 - = 𝚀 - <<< Ⓠ - < Ê  - < ĸ - < r - <<< r - <<< 𝐫 - = 𝑟 - = 𝒓 - = 𝓇 - = 𝓻 - = 𝔯 - = 𝕣 - = 𝖗 - = 𝗋 - = 𝗿 - = 𝘳 - = 𝙧 - = 𝚛 - <<< ⓡ - <<< R - <<< ï¼² - <<< ₨ / s - <<< ℛ - = ℜ - = ℝ - = 𝐑 - = 𝑅 - = 𝑹 - = 𝓡 - = 𝕽 - = 𝖱 - = 𝗥 - = 𝘙 - = 𝙍 - = 𝚁 - <<< Ⓡ - <<< ʳ - <<< ㎭ / ad - <<< ㎮ / ad∕s - <<< ㎯ / ad∕s2 - < ʀ - <<< Ʀ - < ɹ - <<< Ê´ - < ɺ - < É» - <<< ʵ - < ɼ - < ɽ - < ɾ - < É¿ - < ʁ - <<< ʶ - < s - <<< s - <<< st / t - <<< 𝐬 - = 𝑠 - = 𝒔 - = 𝓈 - = 𝓼 - = 𝔰 - = 𝕤 - = 𝖘 - = 𝗌 - = 𝘀 - = 𝘴 - = 𝙨 - = 𝚜 - <<< ⓢ - <<< S - <<< ï¼³ - <<< 𝐒 - = 𝑆 - = 𝑺 - = 𝒮 - = 𝓢 - = 𝔖 - = 𝕊 - = 𝕾 - = 𝖲 - = 𝗦 - = 𝘚 - = 𝙎 - = 𝚂 - <<< Ⓢ - <<< Ë¢ - <<< ℠ / m - <<< ㏛ / r - <<< ㏜ / v - << ß / s - << Å¿ - <<< ſt / t - < ʂ - < ʃ - <<< Æ© - < ƪ - < ʅ - < ʆ - < t - <<< t - <<< ʨ / ɕ - <<< ʦ / s - <<< ʧ / ʃ - <<< 𝐭 - = 𝑡 - = 𝒕 - = 𝓉 - = 𝓽 - = 𝔱 - = 𝕥 - = 𝖙 - = 𝗍 - = 𝘁 - = 𝘵 - = 𝙩 - = 𝚝 - <<< ⓣ - <<< T - <<< ï¼´ - <<< ℡ / El - <<< 𝐓 - = 𝑇 - = 𝑻 - = 𝒯 - = 𝓣 - = 𝔗 - = 𝕋 - = 𝕿 - = 𝖳 - = 𝗧 - = 𝘛 - = 𝙏 - = 𝚃 - <<< Ⓣ - <<< ™ / m - <<< ㎔ / Hz - < ŧ - <<< Ŧ - < Æ« - < Æ­ - <<< Ƭ - < ʈ - <<< Æ® - < ʇ - < u - <<< u - <<< 𝐮 - = 𝑢 - = 𝒖 - = 𝓊 - = 𝓾 - = 𝔲 - = 𝕦 - = 𝖚 - = 𝗎 - = 𝘂 - = 𝘶 - = 𝙪 - = 𝚞 - <<< ⓤ - <<< U - <<< ï¼µ - <<< 𝐔 - = 𝑈 - = 𝑼 - = 𝒰 - = 𝓤 - = 𝔘 - = 𝕌 - = 𝖀 - = 𝖴 - = 𝗨 - = 𝘜 - = 𝙐 - = 𝚄 - <<< Ⓤ - < ʉ - < É¥ - < ɯ - <<< Ɯ - < ɰ - < ʊ - <<< Ʊ - < v - <<< v - <<< ⅴ - <<< ⅵ / i - <<< ⅶ / ii - <<< ⅷ / iii - <<< 𝐯 - = 𝑣 - = 𝒗 - = 𝓋 - = 𝓿 - = 𝔳 - = 𝕧 - = 𝖛 - = 𝗏 - = 𝘃 - = 𝘷 - = 𝙫 - = 𝚟 - <<< ⓥ - <<< V - <<< ï¼¶ - <<< Ⅴ - <<< Ⅵ / I - <<< Ⅶ / Ii - <<< Ⅷ / Iii - <<< 𝐕 - = 𝑉 - = 𝑽 - = 𝒱 - = 𝓥 - = 𝔙 - = 𝕍 - = 𝖁 - = 𝖵 - = 𝗩 - = 𝘝 - = 𝙑 - = 𝚅 - <<< Ⓥ - < ʋ - <<< Ʋ - < ʌ - < w - <<< w - <<< 𝐰 - = 𝑤 - = 𝒘 - = 𝓌 - = 𝔀 - = 𝔴 - = 𝕨 - = 𝖜 - = 𝗐 - = 𝘄 - = 𝘸 - = 𝙬 - = 𝚠 - <<< ⓦ - <<< W - <<< ï¼· - <<< 𝐖 - = 𝑊 - = 𝑾 - = 𝒲 - = 𝓦 - = 𝔚 - = 𝕎 - = 𝖂 - = 𝖶 - = 𝗪 - = 𝘞 - = 𝙒 - = 𝚆 - <<< Ⓦ - <<< Ê· - <<< ㏝ / b - < ʍ - < x - <<< x - <<< ⅹ - <<< ⅺ / i - <<< ⅻ / ii - <<< 𝐱 - = 𝑥 - = 𝒙 - = 𝓍 - = 𝔁 - = 𝔵 - = 𝕩 - = 𝖝 - = 𝗑 - = 𝘅 - = 𝘹 - = 𝙭 - = 𝚡 - <<< ⓧ - <<< X - <<< X - <<< Ⅹ - <<< Ⅺ / I - <<< Ⅻ / Ii - <<< 𝐗 - = 𝑋 - = 𝑿 - = 𝒳 - = 𝓧 - = 𝔛 - = 𝕏 - = 𝖃 - = 𝖷 - = 𝗫 - = 𝘟 - = 𝙓 - = 𝚇 - <<< Ⓧ - <<< Ë£ - < y - <<< y - <<< 𝐲 - = 𝑦 - = 𝒚 - = 𝓎 - = 𝔂 - = 𝔶 - = 𝕪 - = 𝖞 - = 𝗒 - = 𝘆 - = 𝘺 - = 𝙮 - = 𝚢 - <<< ⓨ - <<< Y - <<< ï¼¹ - <<< 𝐘 - = 𝑌 - = 𝒀 - = 𝒴 - = 𝓨 - = 𝔜 - = 𝕐 - = 𝖄 - = 𝖸 - = 𝗬 - = 𝘠 - = 𝙔 - = 𝚈 - <<< Ⓨ - <<< ʸ - < ʏ - < Æ´ - <<< Ƴ - < z - <<< z - <<< 𝐳 - = 𝑧 - = 𝒛 - = 𝓏 - = 𝔃 - = 𝔷 - = 𝕫 - = 𝖟 - = 𝗓 - = 𝘇 - = 𝘻 - = 𝙯 - = 𝚣 - <<< ⓩ - <<< Z - <<< Z - <<< ℤ - = ℨ - = 𝐙 - = 𝑍 - = 𝒁 - = 𝒵 - = 𝓩 - = 𝖅 - = 𝖹 - = 𝗭 - = 𝘡 - = 𝙕 - = 𝚉 - <<< Ⓩ - < ƶ - <<< Ƶ - < È¥ - <<< Ȥ - < ʐ - < ʑ - < ʒ - <<< Æ· - < ƹ - <<< Ƹ - < ƺ - < ʓ - < ȝ - <<< Ȝ - < þ - <<< Þ - < Æ¿ - <<< Ç· - < Æ» - < ƨ - <<< Ƨ - < ƽ - <<< Ƽ - < ƅ - <<< Ƅ - < ʔ - < ˀ - < ʼ - <<< ʼn / n - < Ë® - < ʾ - < ʕ - <<< ˤ - < Ê¿ - < ˁ - < ƾ - < Ê¡ - < Ê¢ - < ʖ - < ǀ - < ǁ - < ǂ - < ǃ - < ʗ - < ʘ - < ʬ - < Ê­ - < α - <<< 𝛂 - = 𝛼 - = 𝜶 - = 𝝰 - = 𝞪 - <<< Α - <<< 𝚨 - = 𝛢 - = 𝜜 - = 𝝖 - = 𝞐 - < β - <<< ϐ - <<< 𝛃 - = 𝛽 - = 𝜷 - = 𝝱 - = 𝞫 - <<< Β - <<< 𝚩 - = 𝛣 - = 𝜝 - = 𝝗 - = 𝞑 - < γ - <<< 𝛄 - = 𝛾 - = 𝜸 - = 𝝲 - = 𝞬 - <<< Γ - <<< 𝚪 - = 𝛤 - = 𝜞 - = 𝝘 - = 𝞒 - < δ - <<< 𝛅 - = 𝛿 - = 𝜹 - = 𝝳 - = 𝞭 - <<< Δ - <<< 𝚫 - = 𝛥 - = 𝜟 - = 𝝙 - = 𝞓 - < ε - <<< ϵ - <<< 𝛆 - = 𝛜 - = 𝜀 - = 𝜖 - = 𝜺 - = 𝝐 - = 𝝴 - = 𝞊 - = 𝞮 - = 𝟄 - <<< Ε - <<< 𝚬 - = 𝛦 - = 𝜠 - = 𝝚 - = 𝞔 - < ϝ - <<< Ϝ - < ϛ - <<< Ϛ - < ζ - <<< 𝛇 - = 𝜁 - = 𝜻 - = 𝝵 - = 𝞯 - <<< Ζ - <<< 𝚭 - = 𝛧 - = 𝜡 - = 𝝛 - = 𝞕 - < η - <<< 𝛈 - = 𝜂 - = 𝜼 - = 𝝶 - = 𝞰 - <<< Η - <<< 𝚮 - = 𝛨 - = 𝜢 - = 𝝜 - = 𝞖 - < θ - <<< ϑ - <<< 𝛉 - = 𝛝 - = 𝜃 - = 𝜗 - = 𝜽 - = 𝝑 - = 𝝷 - = 𝞋 - = 𝞱 - = 𝟅 - <<< Θ - <<< Ï´ - <<< 𝚯 - = 𝚹 - = 𝛩 - = 𝛳 - = 𝜣 - = 𝜭 - = 𝝝 - = 𝝧 - = 𝞗 - = 𝞡 - < ͺ - = ι - <<< 𝛊 - = 𝜄 - = 𝜾 - = 𝝸 - = 𝞲 - <<< Ι - <<< 𝚰 - = 𝛪 - = 𝜤 - = 𝝞 - = 𝞘 - < ϳ - < κ - <<< ϰ - <<< ϗ / αι - <<< 𝛋 - = 𝛞 - = 𝜅 - = 𝜘 - = 𝜿 - = 𝝒 - = 𝝹 - = 𝞌 - = 𝞳 - = 𝟆 - <<< Κ - <<< 𝚱 - = 𝛫 - = 𝜥 - = 𝝟 - = 𝞙 - < λ - <<< 𝛌 - = 𝜆 - = 𝝀 - = 𝝺 - = 𝞴 - <<< Λ - <<< 𝚲 - = 𝛬 - = 𝜦 - = 𝝠 - = 𝞚 - < μ - <<< µ - <<< 𝛍 - = 𝜇 - = 𝝁 - = 𝝻 - = 𝞵 - <<< Μ - <<< 𝚳 - = 𝛭 - = 𝜧 - = 𝝡 - = 𝞛 - <<< ㎂ / A - <<< ㎌ / F - <<< ㎍ / g - <<< ㎕ / l - <<< ㎛ / m - <<< ㎲ / s - <<< ㎶ / V - <<< ㎼ / W - < ν - <<< 𝛎 - = 𝜈 - = 𝝂 - = 𝝼 - = 𝞶 - <<< Ν - <<< 𝚴 - = 𝛮 - = 𝜨 - = 𝝢 - = 𝞜 - < ξ - <<< 𝛏 - = 𝜉 - = 𝝃 - = 𝝽 - = 𝞷 - <<< Ξ - <<< 𝚵 - = 𝛯 - = 𝜩 - = 𝝣 - = 𝞝 - < ο - <<< 𝛐 - = 𝜊 - = 𝝄 - = 𝝾 - = 𝞸 - <<< Ο - <<< 𝚶 - = 𝛰 - = 𝜪 - = 𝝤 - = 𝞞 - < π - <<< ϖ - <<< 𝛑 - = 𝛡 - = 𝜋 - = 𝜛 - = 𝝅 - = 𝝕 - = 𝝿 - = 𝞏 - = 𝞹 - = 𝟉 - <<< Π - <<< 𝚷 - = 𝛱 - = 𝜫 - = 𝝥 - = 𝞟 - < ϟ - <<< Ϟ - < ρ - <<< ϱ - <<< 𝛒 - = 𝛠 - = 𝜌 - = 𝜚 - = 𝝆 - = 𝝔 - = 𝞀 - = 𝞎 - = 𝞺 - = 𝟈 - <<< Ρ - <<< 𝚸 - = 𝛲 - = 𝜬 - = 𝝦 - = 𝞠 - < σ - <<< ϲ - <<< 𝛓 - = 𝛔 - = 𝜍 - = 𝜎 - = 𝝇 - = 𝝈 - = 𝞁 - = 𝞂 - = 𝞻 - = 𝞼 - <<< Σ - <<< 𝚺 - = 𝛴 - = 𝜮 - = 𝝨 - = 𝞢 - <<< ς - < τ - <<< 𝛕 - = 𝜏 - = 𝝉 - = 𝞃 - = 𝞽 - <<< Τ - <<< 𝚻 - = 𝛵 - = 𝜯 - = 𝝩 - = 𝞣 - < υ - <<< 𝛖 - = 𝜐 - = 𝝊 - = 𝞄 - = 𝞾 - <<< Î¥ - <<< ϒ - <<< 𝚼 - = 𝛶 - = 𝜰 - = 𝝪 - = 𝞤 - < φ - <<< ϕ - <<< 𝛗 - = 𝛟 - = 𝜑 - = 𝜙 - = 𝝋 - = 𝝓 - = 𝞅 - = 𝞍 - = 𝞿 - = 𝟇 - <<< Φ - <<< 𝚽 - = 𝛷 - = 𝜱 - = 𝝫 - = 𝞥 - < χ - <<< 𝛘 - = 𝜒 - = 𝝌 - = 𝞆 - = 𝟀 - <<< Χ - <<< 𝚾 - = 𝛸 - = 𝜲 - = 𝝬 - = 𝞦 - < ψ - <<< 𝛙 - = 𝜓 - = 𝝍 - = 𝞇 - = 𝟁 - <<< Ψ - <<< 𝚿 - = 𝛹 - = 𝜳 - = 𝝭 - = 𝞧 - < ω - <<< 𝛚 - = 𝜔 - = 𝝎 - = 𝞈 - = 𝟂 - <<< Ω - <<< 𝛀 - = 𝛺 - = 𝜴 - = 𝝮 - = 𝞨 - < Ï¡ - <<< Ï  - < Ï£ - <<< Ï¢ - < Ï¥ - <<< Ϥ - < ϧ - <<< Ϧ - < Ï© - <<< Ϩ - < Ï« - <<< Ϫ - < Ï­ - <<< Ϭ - < ϯ - <<< Ï® - < а - <<< А - < ӑ - <<< Ӑ - < ӓ - <<< Ӓ - < ә - <<< Ә - < ӛ - <<< Ӛ - < ӕ - <<< Ӕ - < б - <<< Б - < в - <<< В - < г - <<< Г - << ґ - <<< Ґ - < ғ - <<< Ғ - < ҕ - <<< Ҕ - < д - <<< Д - < ђ - <<< Ђ - < ѓ - <<< Ѓ - < ҙ - <<< Ҙ - < е - <<< Е - < ӗ - <<< Ӗ - < є - <<< Є - < ж - <<< Ж - < ӝ - <<< Ӝ - < җ - <<< Җ - < з - <<< З - < ӟ - <<< Ӟ - < ѕ - <<< Ѕ - < Ó¡ - <<< Ó  - < и - <<< И - < Ó¥ - <<< Ó¤ - < і - <<< І - < ї - <<< Ї - < й - <<< Й - < ј - <<< Ј - < к - <<< К - < қ - <<< Қ - < ӄ - <<< Ӄ - < Ò¡ - <<< Ò  - < ҟ - <<< Ҟ - < ҝ - <<< Ҝ - < л - <<< Л - < љ - <<< Љ - < м - <<< М - < н - <<< Н - < Ò£ - <<< Ò¢ - < ӈ - <<< Ӈ - < Ò¥ - <<< Ò¤ - < њ - <<< Њ - < о - <<< О - < Ó§ - <<< Ó¦ - < Ó© - <<< Ó¨ - < Ó« - <<< Óª - < п - <<< П - < Ò§ - <<< Ò¦ - < ҁ - <<< Ҁ - < р - <<< Р - < ҏ - <<< Ҏ - < с - <<< С - < Ò« - <<< Òª - < т - <<< Т - < Ò­ - <<< Ò¬ - < ћ - <<< Ћ - < ќ - <<< Ќ - < у - <<< У - < ў - <<< Ў - < Ó± - <<< Ó° - < Ó³ - <<< Ó² - < Ò¯ - <<< Ò® - < Ò± - <<< Ò° - < ѹ - <<< Ѹ - < ф - <<< Ф - < х - <<< Ð¥ - < Ò³ - <<< Ò² - < Ò» - <<< Òº - < Ñ¡ - <<< Ñ  - < Ñ¿ - <<< Ѿ - < ѽ - <<< Ѽ - < Ñ» - <<< Ѻ - < ц - <<< Ц - < Òµ - <<< Ò´ - < ч - <<< Ч - < Óµ - <<< Ó´ - < Ò· - <<< Ò¶ - < ӌ - <<< Ӌ - < Ò¹ - <<< Ò¸ - < Ò½ - <<< Ò¼ - < Ò¿ - <<< Ò¾ - < џ - <<< Џ - < ш - <<< Ш - < щ - <<< Щ - < ъ - <<< Ъ - < ы - <<< Ы - < Ó¹ - <<< Ó¸ - < ь - <<< Ь - < ҍ - <<< Ҍ - < Ñ£ - <<< Ñ¢ - < э - <<< Э - < Ó­ - <<< Ó¬ - < ю - <<< Ю - < я - <<< Я - < Ñ¥ - <<< Ѥ - < ѧ - <<< Ѧ - < Ñ« - <<< Ѫ - < Ñ© - <<< Ѩ - < Ñ­ - <<< Ѭ - < ѯ - <<< Ñ® - < ѱ - <<< Ѱ - < ѳ - <<< Ѳ - < ѵ - <<< Ñ´ - < Ñ· - <<< Ѷ - < Ò© - <<< Ò¨ - < Ӏ - < ა - <<< Ⴀ - < ბ - <<< Ⴁ - < გ - <<< Ⴂ - < დ - <<< Ⴃ - < ე - <<< Ⴄ - < ვ - <<< Ⴅ - < ზ - <<< Ⴆ - < ჱ - <<< Ⴡ - < თ - <<< Ⴇ - < ი - <<< Ⴈ - < კ - <<< Ⴉ - < ლ - <<< Ⴊ - < მ - <<< Ⴋ - < ნ - <<< Ⴌ - < ჲ - <<< Ⴢ - < ო - <<< Ⴍ - < პ - <<< Ⴎ - < ჟ - <<< Ⴏ - < რ - <<< Ⴐ - < ს - <<< Ⴑ - < ტ - <<< Ⴒ - < ჳ - <<< Ⴣ - < უ - <<< Ⴓ - < ფ - <<< Ⴔ - < ქ - <<< Ⴕ - < ღ - <<< Ⴖ - < ყ - <<< Ⴗ - < შ - <<< Ⴘ - < ჩ - <<< Ⴙ - < ც - <<< Ⴚ - < ძ - <<< Ⴛ - < წ - <<< Ⴜ - < ჭ - <<< Ⴝ - < ხ - <<< Ⴞ - < ჴ - <<< Ⴤ - < ჯ - <<< Ⴟ - < ჰ - <<< Ⴠ - < ჵ - <<< Ⴥ - < ჶ - < Õ¡ - <<< Ô± - < Õ¢ - <<< Ô² - < Õ£ - <<< Ô³ - < Õ¤ - <<< Ô´ - < Õ¥ - <<< և / ւ - <<< Ôµ - < Õ¦ - <<< Ô¶ - < Õ§ - <<< Ô· - < Õ¨ - <<< Ô¸ - < Õ© - <<< Ô¹ - < Õª - <<< Ôº - < Õ« - <<< Ô» - < Õ¬ - <<< Ô¼ - < Õ­ - <<< Ô½ - < Õ® - <<< Ô¾ - < Õ¯ - <<< Ô¿ - < Õ° - <<< Հ - < Õ± - <<< Ձ - < Õ² - <<< Ղ - < Õ³ - <<< Ճ - < Õ´ - <<< ﬔ / Õ¥ - <<< ﬕ / Õ« - <<< ﬗ / Õ­ - <<< ﬓ / Õ¶ - <<< Մ - < Õµ - <<< Յ - < Õ¶ - <<< Ն - < Õ· - <<< Շ - < Õ¸ - <<< Ո - < Õ¹ - <<< Չ - < Õº - <<< Պ - < Õ» - <<< Ջ - < Õ¼ - <<< Ռ - < Õ½ - <<< Ս - < Õ¾ - <<< ﬖ / Õ¶ - <<< Վ - < Õ¿ - <<< Տ - < ր - <<< Ր - < ց - <<< Ց - < ւ - <<< Ւ - < փ - <<< Փ - < ք - <<< Ք - < օ - <<< Օ - < ֆ - <<< Ֆ - < ՙ - < א - <<< ℵ - <<< ﭏ / ל - <<< ﬡ - < ב - <<< ℶ - < ג - <<< ℷ - < ד - <<< ℸ - <<< ﬢ - < ה - <<< ﬣ - < ו - <<< ×° / ו - <<< ×± / י - < ז - < ח - < ט - < י - <<< ײ / י - < כ - <<< ﬤ - <<< ך - < ל - <<< ﬥ - < מ - <<< ﬦ - <<< ם - < ×  - <<< ן - < ס - < ×¢ - <<< ﬠ - < פ - <<< ×£ - < צ - <<< ×¥ - < ×§ - < ר - <<< ﬧ - < ש - < ת - <<< ﬨ - < Ø¡ - = Ù´ - <<< ﺀ - << Û½ - < Ø¢ - <<< ﺂ - <<< ﺁ - < Ø£ - <<< ﺄ - <<< ﺃ - < Ù² - < Ù± - <<< ﭑ - <<< ﭐ - < ؤ - <<< ﺆ - <<< ﺅ - < Ø¥ - <<< ﺈ - <<< ﺇ - < Ù³ - < ئ - <<< ﺋ - <<< ﲗ / ج - <<< ﲘ / Ø­ - <<< ﲙ / Ø® - <<< ﲚ / م - <<< ﲛ / ه - <<< ﯻ / ى - <<< ﯸ / ې - <<< ﺌ - <<< ﳟ / م - <<< ï³  / ه - <<< ﺊ - <<< ﯫ / ا - <<< ﱤ / ر - <<< ï±¥ / ز - <<< ﱦ / م - <<< ï±§ / ن - <<< ﯭ / ە - <<< ﯯ / و - <<< ﯳ / ۆ - <<< ﯱ / ۇ - <<< ﯵ / ۈ - <<< ﯺ / ى - = ﱨ / ى - <<< ﱩ / ي - <<< ﯷ / ې - <<< ﺉ - <<< ﯪ / ا - <<< ﰀ / ج - <<< ﰁ / Ø­ - <<< ﰂ / م - <<< ﯬ / ە - <<< ﯮ / و - <<< ﯲ / ۆ - <<< ﯰ / ۇ - <<< ﯴ / ۈ - <<< ﯹ / ى - = ﰃ / ى - <<< ﰄ / ي - <<< ﯶ / ې - < ا - <<< Ùµ / Ù´ - <<< ﺎ - <<< ï´¼ / ً - <<< ﺍ - <<< ï´½ / ً - <<< ï·³ / كبر - <<< ï·² / لله - < ب - <<< ﺑ - <<< ﲜ / ج - <<< ﲝ / Ø­ - <<< ﲞ / Ø® - <<< ﲟ / م - <<< ï²  / ه - <<< ﺒ - <<< ﳡ / م - <<< ï³¢ / ه - <<< ﺐ - <<< ﷂ / حي - <<< ﶞ / خي - <<< ﱪ / ر - <<< ﱫ / ز - <<< ﱬ / م - <<< ï±­ / ن - <<< ï±® / ى - <<< ﱯ / ي - <<< ﺏ - <<< ﰅ / ج - <<< ﰆ / Ø­ - <<< ﰇ / Ø® - <<< ﰈ / م - <<< ﰉ / ى - <<< ﰊ / ي - < Ù» - <<< ﭔ - <<< ﭕ - <<< ﭓ - <<< ﭒ - < Ù¾ - <<< ﭘ - <<< ﭙ - <<< ﭗ - <<< ﭖ - < ڀ - <<< ﭜ - <<< ﭝ - <<< ﭛ - <<< ﭚ - < Ø© - <<< ﺔ - <<< ﺓ - < ت - <<< ﺗ - <<< ﲡ / ج - <<< ﵐ / جم - <<< ï²¢ / Ø­ - <<< ﵒ / حج - <<< ﵓ / حم - <<< ï²£ / Ø® - <<< ﵔ / خم - <<< ﲤ / م - <<< ﵕ / مج - <<< ﵖ / مح - <<< ﵗ / مخ - <<< ï²¥ / ه - <<< ﺘ - <<< ï³£ / م - <<< ﳤ / ه - <<< ﺖ - <<< ï¶  / جى - <<< ﶟ / جي - <<< ﵑ / حج - <<< ï¶¢ / خى - <<< ï¶¡ / خي - <<< ï±° / ر - <<< ï±± / ز - <<< ï±² / م - <<< ﶤ / مى - <<< ï¶£ / مي - <<< ï±³ / ن - <<< ï±´ / ى - <<< ï±µ / ي - <<< ﺕ - <<< ﰋ / ج - <<< ﰌ / Ø­ - <<< ﰍ / Ø® - <<< ﰎ / م - <<< ﰏ / ى - <<< ﰐ / ي - < Ø« - <<< ﺛ - <<< ﲦ / م - <<< ﺜ - <<< ï³¥ / م - <<< ﳦ / ه - <<< ﺚ - <<< ï±¶ / ر - <<< ï±· / ز - <<< ﱸ / م - <<< ï±¹ / ن - <<< ﱺ / ى - <<< ï±» / ي - <<< ﺙ - <<< ﰑ / ج - <<< ﰒ / م - <<< ﰓ / ى - <<< ﰔ / ي - < Ù¹ - <<< ï­¨ - <<< ï­© - <<< ï­§ - <<< ï­¦ - < Ùº - <<< ï­  - <<< ï­¡ - <<< ﭟ - <<< ﭞ - < Ù¼ - < Ù½ - < Ù¿ - <<< ï­¤ - <<< ï­¥ - <<< ï­£ - <<< ï­¢ - < ج - <<< ﺟ - <<< ï²§ / Ø­ - <<< ﲨ / م - <<< ﵙ / مح - <<< ﺠ - <<< ﺞ - <<< ﶦ / حى - <<< ï¶¾ / حي - <<< ﵘ / مح - <<< ï¶§ / مى - <<< ï¶¥ / مي - <<< ﴝ / ى - <<< ﴞ / ي - <<< ﺝ - <<< ﰕ / Ø­ - <<< ï·» / ل'\u0020'جلاله - <<< ﰖ / م - <<< ﴁ / ى - <<< ﴂ / ي - < ڃ - <<< ï­¸ - <<< ï­¹ - <<< ï­· - <<< ï­¶ - < ڄ - <<< ï­´ - <<< ï­µ - <<< ï­³ - <<< ï­² - < چ - <<< ï­¼ - <<< ï­½ - <<< ï­» - <<< ï­º - < Ú¿ - < ڇ - <<< ﮀ - <<< ﮁ - <<< ï­¿ - <<< ï­¾ - < Ø­ - <<< ﺣ - <<< ﲩ / ج - <<< ﲪ / م - <<< ﺤ - <<< ﺢ - <<< ï¶¿ / جي - <<< ﵛ / مى - <<< ﵚ / مي - <<< ﴛ / ى - <<< ﴜ / ي - <<< ﺡ - <<< ﰗ / ج - <<< ﰘ / م - <<< ﳿ / ى - <<< ﴀ / ي - < Ø® - <<< ﺧ - <<< ﲫ / ج - <<< ﲬ / م - <<< ﺨ - <<< ﺦ - <<< ﴟ / ى - <<< ï´  / ي - <<< ﺥ - <<< ﰙ / ج - <<< ﰚ / Ø­ - <<< ﰛ / م - <<< ﴃ / ى - <<< ﴄ / ي - < ځ - < ڂ - < څ - < د - <<< ﺪ - <<< ﺩ - < ذ - <<< ﺬ - <<< ﺫ - <<< ﱛ / Ù° - < ڈ - <<< ﮉ - <<< ﮈ - < ډ - < ڊ - < ڋ - < ڌ - <<< ﮅ - <<< ﮄ - < ڍ - <<< ﮃ - <<< ﮂ - < ڎ - <<< ﮇ - <<< ﮆ - < ڏ - < ڐ - < ر - <<< ﺮ - <<< ﺭ - <<< ﱜ / Ù° - <<< ï·¶ / سول - < ز - <<< ﺰ - <<< ﺯ - < ڑ - <<< ﮍ - <<< ﮌ - < ڒ - < ړ - < ڔ - < ڕ - < ږ - < ڗ - < ژ - <<< ﮋ - <<< ﮊ - < ڙ - < س - <<< ﺳ - <<< ï²­ / ج - <<< ﵝ / جح - <<< ï²® / Ø­ - <<< ﵜ / حج - <<< ﲯ / Ø® - <<< ï²° / م - <<< ﵡ / مج - <<< ïµ  / مح - <<< ïµ£ / مم - <<< ï´± / ه - <<< ﺴ - <<< ï´´ / ج - <<< ï´µ / Ø­ - <<< ï´¶ / Ø® - <<< ï³§ / م - <<< ﳨ / ه - <<< ﺲ - <<< ﵞ / جى - <<< ﶨ / خى - <<< ﷆ / خي - <<< ï´ª / ر - <<< ﵟ / مح - <<< ïµ¢ / مم - <<< ﴗ / ى - <<< ﴘ / ي - <<< ﺱ - <<< ﰜ / ج - <<< ﰝ / Ø­ - <<< ﰞ / Ø® - <<< ﴎ / ر - <<< ﰟ / م - <<< ï³» / ى - <<< ï³¼ / ي - < Ø´ - <<< ﺷ - <<< ï´­ / ج - <<< ï´® / Ø­ - <<< ﵨ / حم - <<< ï´¯ / Ø® - <<< ï´° / م - <<< ﵫ / مخ - <<< ïµ­ / مم - <<< ï´² / ه - <<< ﺸ - <<< ï´· / ج - <<< ï´¸ / Ø­ - <<< ï´¹ / Ø® - <<< ﳩ / م - <<< ﳪ / ه - <<< ﺶ - <<< ï´¥ / ج - <<< ﵩ / جي - <<< ï´¦ / Ø­ - <<< ïµ§ / حم - <<< ﶪ / حي - <<< ï´§ / Ø® - <<< ï´© / ر - <<< ï´¨ / م - <<< ﵪ / مخ - <<< ﵬ / مم - <<< ﴙ / ى - <<< ﴚ / ي - <<< ﺵ - <<< ﴉ / ج - <<< ﴊ / Ø­ - <<< ﴋ / Ø® - <<< ﴍ / ر - <<< ﴌ / م - <<< ï³½ / ى - <<< ï³¾ / ي - < ښ - < ڛ - < ڜ - < Ûº - < ص - <<< ﺻ - <<< ï²± / Ø­ - <<< ïµ¥ / حح - <<< ï²² / Ø® - <<< ï²³ / م - <<< ﷅ / مم - <<< ﺼ - <<< ﺺ - <<< ﵤ / حح - <<< ï¶© / حي - <<< ï´« / ر - <<< ﵦ / مم - <<< ï´¡ / ى - <<< ï´¢ / ي - <<< ﺹ - <<< ï°  / Ø­ - <<< ﴏ / ر - <<< ï·µ / لعم - <<< ï·¹ / لى - <<< ï·º / لى'\u0020'الله'\u0020'عليه'\u0020'وسلم - <<< ï·° / لے - <<< ï°¡ / م - <<< ﴅ / ى - <<< ﴆ / ي - < ض - <<< ﺿ - <<< ï²´ / ج - <<< ï²µ / Ø­ - <<< ï²¶ / Ø® - <<< ïµ° / خم - <<< ï²· / م - <<< ﻀ - <<< ﺾ - <<< ïµ® / حى - <<< ï¶« / حي - <<< ﵯ / خم - <<< ï´¬ / ر - <<< ï´£ / ى - <<< ï´¤ / ي - <<< ﺽ - <<< ï°¢ / ج - <<< ï°£ / Ø­ - <<< ï°¤ / Ø® - <<< ﴐ / ر - <<< ï°¥ / م - <<< ﴇ / ى - <<< ﴈ / ي - < ڝ - < ڞ - < Û» - < Ø· - <<< ﻃ - <<< ﲸ / Ø­ - <<< ï´³ / م - <<< ïµ² / مح - <<< ïµ³ / مم - <<< ﻄ - <<< ï´º / م - <<< ﻂ - <<< ïµ± / مح - <<< ïµ´ / مي - <<< ﴑ / ى - <<< ﴒ / ي - <<< ﻁ - <<< ï°¦ / Ø­ - <<< ï°§ / م - <<< ï³µ / ى - <<< ï³¶ / ي - < ظ - <<< ﻇ - <<< ï²¹ / م - <<< ﻈ - <<< ï´» / م - <<< ﻆ - <<< ﻅ - <<< ï°¨ / م - < ڟ - < ع - <<< ﻋ - <<< ﲺ / ج - <<< ﷄ / جم - <<< ï²» / م - <<< ïµ· / مم - <<< ﻌ - <<< ﻊ - <<< ïµµ / جم - <<< ïµ¶ / مم - <<< ﵸ / مى - <<< ï¶¶ / مي - <<< ﴓ / ى - <<< ﴔ / ي - <<< ﻉ - <<< ï°© / ج - <<< ï·· / ليه - <<< ï°ª / م - <<< ï³· / ى - <<< ﳸ / ي - < غ - <<< ﻏ - <<< ï²¼ / ج - <<< ï²½ / م - <<< ﻐ - <<< ﻎ - <<< ïµ¹ / مم - <<< ïµ» / مى - <<< ﵺ / مي - <<< ﴕ / ى - <<< ﴖ / ي - <<< ﻍ - <<< ï°« / ج - <<< ï°¬ / م - <<< ï³¹ / ى - <<< ﳺ / ي - < Ú  - < Û¼ - < ف - <<< ﻓ - <<< ï²¾ / ج - <<< ﲿ / Ø­ - <<< ﳀ / Ø® - <<< ïµ½ / خم - <<< ﳁ / م - <<< ﻔ - <<< ﻒ - <<< ïµ¼ / خم - <<< ﷁ / مي - <<< ï±¼ / ى - <<< ï±½ / ي - <<< ﻑ - <<< ï°­ / ج - <<< ï°® / Ø­ - <<< ï°¯ / Ø® - <<< ï°° / م - <<< ï°± / ى - <<< ï°² / ي - < Ú¡ - < Ú¢ - < Ú£ - < Ú¤ - <<< ï­¬ - <<< ï­­ - <<< ï­« - <<< ï­ª - < Ú¥ - < Ú¦ - <<< ï­° - <<< ï­± - <<< ï­¯ - <<< ï­® - < ق - <<< ﻗ - <<< ﳂ / Ø­ - <<< ﳃ / م - <<< ï¶´ / مح - <<< ﻘ - <<< ﻖ - <<< ïµ¾ / مح - <<< ﵿ / مم - <<< ï¶² / مي - <<< ï±¾ / ى - <<< ﱿ / ي - <<< ﻕ - <<< ï°³ / Ø­ - <<< ï·± / لے - <<< ï°´ / م - <<< ï°µ / ى - <<< ï°¶ / ي - < Ú§ - < Ú¨ - < ك - <<< ﻛ - <<< ﳄ / ج - <<< ﳅ / Ø­ - <<< ﳆ / Ø® - <<< ﳇ / ل - <<< ﳈ / م - <<< ﷃ / مم - <<< ﻜ - <<< ﳫ / ل - <<< ﳬ / م - <<< ﻚ - <<< ﲀ / ا - <<< ﲁ / ل - <<< ﲂ / م - <<< ï¶» / مم - <<< ï¶· / مي - <<< ﲃ / ى - <<< ﲄ / ي - <<< ﻙ - <<< ï°· / ا - <<< ï°¸ / ج - <<< ï°¹ / Ø­ - <<< ï°º / Ø® - <<< ï°» / ل - <<< ï°¼ / م - <<< ï°½ / ى - <<< ï°¾ / ي - < Ú© - <<< ﮐ - <<< ﮑ - <<< ﮏ - <<< ﮎ - < Úª - < Ú« - < Ú¬ - < Ú­ - <<< ﯕ - <<< ﯖ - <<< ﯔ - <<< ﯓ - < Ú® - < Ú¯ - <<< ﮔ - <<< ﮕ - <<< ﮓ - <<< ﮒ - < Ú° - < Ú± - <<< ﮜ - <<< ﮝ - <<< ﮛ - <<< ﮚ - < Ú² - < Ú³ - <<< ﮘ - <<< ﮙ - <<< ﮗ - <<< ﮖ - < Ú´ - < ل - <<< ﻟ - <<< ﳉ / ج - <<< ﶃ / جج - <<< ﶺ / جم - <<< ﳊ / Ø­ - <<< ï¶µ / حم - <<< ﳋ / Ø® - <<< ﶆ / خم - <<< ﳌ / م - <<< ﶈ / مح - <<< ﳍ / ه - <<< ï»  - <<< ï³­ / م - <<< ﻞ - <<< ï»¶ / Ø¢ - <<< ﻸ / Ø£ - <<< ﻺ / Ø¥ - <<< ﻼ / ا - <<< ﶄ / جج - <<< ï¶¼ / جم - <<< ﶬ / جي - <<< ﶀ / حم - <<< ﶂ / حى - <<< ﶁ / حي - <<< ﶅ / خم - <<< ﲅ / م - <<< ﶇ / مح - <<< ï¶­ / مي - <<< ﲆ / ى - <<< ﲇ / ي - <<< ﻝ - <<< ﻵ / Ø¢ - <<< ï»· / Ø£ - <<< ﻹ / Ø¥ - <<< ï»» / ا - <<< ï°¿ / ج - <<< ﱀ / Ø­ - <<< ﱁ / Ø® - <<< ﱂ / م - <<< ﱃ / ى - <<< ﱄ / ي - < Úµ - < Ú¶ - < Ú· - < Ú¸ - < م - <<< ﻣ - <<< ﳎ / ج - <<< ﶌ / جح - <<< ﶒ / جخ - <<< ﶍ / جم - <<< ﳏ / Ø­ - <<< ﶉ / حج - <<< ﶊ / حم - <<< ﳐ / Ø® - <<< ﶎ / خج - <<< ﶏ / خم - <<< ﳑ / م - <<< ﻤ - <<< ﻢ - <<< ﲈ / ا - <<< ﷀ / جي - <<< ﶋ / حي - <<< ï¶¹ / خي - <<< ﲉ / م - <<< ï¶± / مي - <<< ﻡ - <<< ﱅ / ج - <<< ﱆ / Ø­ - <<< ï·´ / حمد - <<< ﱇ / Ø® - <<< ﱈ / م - <<< ﱉ / ى - <<< ﱊ / ي - << Û¾ - < ن - <<< ï»§ - <<< ﳒ / ج - <<< ﶸ / جح - <<< ﶘ / جم - <<< ﳓ / Ø­ - <<< ﶕ / حم - <<< ﳔ / Ø® - <<< ﳕ / م - <<< ﳖ / ه - <<< ﻨ - <<< ï³® / م - <<< ﳯ / ه - <<< ﻦ - <<< ï¶½ / جح - <<< ﶗ / جم - <<< ﶙ / جى - <<< ﷇ / جي - <<< ﶖ / حى - <<< ï¶³ / حي - <<< ﲊ / ر - <<< ﲋ / ز - <<< ﲌ / م - <<< ﶛ / مى - <<< ﶚ / مي - <<< ﲍ / ن - <<< ﲎ / ى - <<< ﲏ / ي - <<< ﻥ - <<< ﱋ / ج - <<< ﱌ / Ø­ - <<< ﱍ / Ø® - <<< ﱎ / م - <<< ﱏ / ى - <<< ﱐ / ي - < Úº - <<< ﮟ - <<< ﮞ - < Ú» - <<< ﮢ - <<< ﮣ - <<< ﮡ - <<< ï®  - < Ú¼ - < Ú½ - < Ú¹ - < ه - <<< ﻫ - <<< ﳙ / Ù° - <<< ﳗ / ج - <<< ﳘ / م - <<< ﶓ / مج - <<< ﶔ / مم - <<< ﻬ - <<< ﻪ - <<< ﻩ - <<< ﱑ / ج - <<< ﱒ / م - <<< ﱓ / ى - <<< ﱔ / ي - < Ú¾ - <<< ﮬ - <<< ï®­ - <<< ﮫ - <<< ﮪ - < ہ - <<< ﮨ - <<< ﮩ - <<< ï®§ - <<< ﮦ - < ۃ - < ە - <<< ﮥ / ٔ - <<< ﮤ / ٔ - < و - <<< Û¥ - <<< Ù¶ / Ù´ - <<< ï»® - <<< ï»­ - <<< ï·¸ / سلم - < ۄ - < ۅ - <<< ﯡ - <<< ﯠ - < ۆ - <<< ﯚ - <<< ﯙ - < ۇ - <<< Ù· / Ù´ - <<< ﯘ - <<< ﯗ - <<< ﯝ / Ù´ - < ۈ - <<< ﯜ - <<< ﯛ - < ۉ - <<< ﯣ - <<< ﯢ - < ۊ - < ۋ - <<< ﯟ - <<< ﯞ - < ۏ - < ى - <<< ﯨ - <<< ﯩ - <<< ï»° - <<< ﲐ / Ù° - <<< ﻯ - <<< ﱝ / Ù° - < ي - <<< Û¦ - <<< Ù¸ / Ù´ - <<< ﻳ - <<< ﳚ / ج - <<< ﳛ / Ø­ - <<< ﳜ / Ø® - <<< ﳝ / م - <<< ﶝ / مم - <<< ﳞ / ه - <<< ï»´ - <<< ï³° / م - <<< ï³± / ه - <<< ﻲ - <<< ﶯ / جي - <<< ï¶® / حي - <<< ﲑ / ر - <<< ﲒ / ز - <<< ﲓ / م - <<< ﶜ / مم - <<< ï¶° / مي - <<< ﲔ / ن - <<< ﲕ / ى - <<< ﲖ / ي - <<< ï»± - <<< ﱕ / ج - <<< ﱖ / Ø­ - <<< ﱗ / Ø® - <<< ﱘ / م - <<< ﱙ / ى - <<< ﱚ / ي - < ی - <<< ﯾ - <<< ﯿ - <<< ﯽ - <<< ﯼ - < ۍ - < ێ - < ې - <<< ﯦ - <<< ﯧ - <<< ﯥ - <<< ﯤ - < ۑ - < ے - <<< ﮯ - <<< ï®± / ٔ - <<< ï®® - <<< ï®° / ٔ - < ܐ - < ܒ - < ܓ - << ܔ - < ܕ - < ܖ - < ܗ - < ܘ - < ܙ - < ܚ - < ܛ - << ܜ - < ܝ - < ܞ - < ܟ - < Ü  - < Ü¡ - < Ü¢ - < Ü£ - <<< ܤ - < Ü¥ - < ܦ - << ܧ - < ܨ - < Ü© - < ܪ - < Ü« - < ܬ - < ހ - < ޙ - < ޚ - < ށ - < ނ - < ރ - < ޜ - < ބ - < ޅ - < ކ - < އ - < Þ¢ - < Þ£ - < ވ - < Þ¥ - < މ - < ފ - < ދ - < ޛ - < ތ - < ޘ - < Þ  - < Þ¡ - < ލ - < ގ - < Þ¤ - < ޏ - < ސ - < ޝ - < ޞ - < ޟ - < ޑ - < ޒ - < ޓ - < ޔ - < ޕ - < ޖ - < ޗ - < Þ¦ - < Þ§ - < Þ¨ - < Þ© - < Þª - < Þ« - < Þ¬ - < Þ­ - < Þ® - < Þ¯ - < Þ° - < ሀ - < ሁ - < ሂ - < ሃ - < ሄ - < ህ - < ሆ - < ለ - < ሉ - < ሊ - < ላ - < ሌ - < ል - < ሎ - < ሏ - < ሐ - < ሑ - < ሒ - < ሓ - < ሔ - < ሕ - < ሖ - < ሗ - < መ - < ሙ - < ሚ - < ማ - < ሜ - < ም - < ሞ - < ሟ - < ሠ - < ሡ - < ሢ - < ሣ - < ሤ - < ሥ - < ሦ - < ሧ - < ረ - < ሩ - < ሪ - < ራ - < ሬ - < ር - < ሮ - < ሯ - < ሰ - < ሱ - < ሲ - < ሳ - < ሴ - < ስ - < ሶ - < ሷ - < ሸ - < ሹ - < ሺ - < ሻ - < ሼ - < ሽ - < ሾ - < ሿ - < ቀ - < ቁ - < ቂ - < ቃ - < ቄ - < ቅ - < ቆ - < ቈ - < ቊ - < ቋ - < ቌ - < ቍ - < ቐ - < ቑ - < ቒ - < ቓ - < ቔ - < ቕ - < ቖ - < ቘ - < ቚ - < ቛ - < ቜ - < ቝ - < በ - < ቡ - < ቢ - < ባ - < ቤ - < ብ - < ቦ - < ቧ - < ቨ - < ቩ - < ቪ - < ቫ - < ቬ - < ቭ - < ቮ - < ቯ - < ተ - < ቱ - < ቲ - < ታ - < ቴ - < ት - < ቶ - < ቷ - < ቸ - < ቹ - < ቺ - < ቻ - < ቼ - < ች - < ቾ - < ቿ - < ኀ - < ኁ - < ኂ - < ኃ - < ኄ - < ኅ - < ኆ - < ኈ - < ኊ - < ኋ - < ኌ - < ኍ - < ነ - < ኑ - < ኒ - < ና - < ኔ - < ን - < ኖ - < ኗ - < ኘ - < ኙ - < ኚ - < ኛ - < ኜ - < ኝ - < ኞ - < ኟ - < አ - < ኡ - < ኢ - < ኣ - < ኤ - < እ - < ኦ - < ኧ - < ከ - < ኩ - < ኪ - < ካ - < ኬ - < ክ - < ኮ - < ኰ - < ኲ - < ኳ - < ኴ - < ኵ - < ኸ - < ኹ - < ኺ - < ኻ - < ኼ - < ኽ - < ኾ - < ዀ - < ዂ - < ዃ - < ዄ - < ዅ - < ወ - < ዉ - < ዊ - < ዋ - < ዌ - < ው - < ዎ - < ዐ - < ዑ - < ዒ - < ዓ - < ዔ - < ዕ - < ዖ - < ዘ - < ዙ - < ዚ - < ዛ - < ዜ - < ዝ - < ዞ - < ዟ - < ዠ - < ዡ - < ዢ - < ዣ - < ዤ - < ዥ - < ዦ - < ዧ - < የ - < ዩ - < ዪ - < ያ - < ዬ - < ይ - < ዮ - < ደ - < ዱ - < ዲ - < ዳ - < ዴ - < ድ - < ዶ - < ዷ - < ዸ - < ዹ - < ዺ - < ዻ - < ዼ - < ዽ - < ዾ - < ዿ - < ጀ - < ጁ - < ጂ - < ጃ - < ጄ - < ጅ - < ጆ - < ጇ - < ገ - < ጉ - < ጊ - < ጋ - < ጌ - < ግ - < ጎ - < ጐ - < ጒ - < ጓ - < ጔ - < ጕ - < ጘ - < ጙ - < ጚ - < ጛ - < ጜ - < ጝ - < ጞ - < ጠ - < ጡ - < ጢ - < ጣ - < ጤ - < ጥ - < ጦ - < ጧ - < ጨ - < ጩ - < ጪ - < ጫ - < ጬ - < ጭ - < ጮ - < ጯ - < ጰ - < ጱ - < ጲ - < ጳ - < ጴ - < ጵ - < ጶ - < ጷ - < ጸ - < ጹ - < ጺ - < ጻ - < ጼ - < ጽ - < ጾ - < ጿ - < ፀ - < ፁ - < ፂ - < ፃ - < ፄ - < ፅ - < ፆ - < ፈ - < ፉ - < ፊ - < ፋ - < ፌ - < ፍ - < ፎ - < ፏ - < ፐ - < ፑ - < ፒ - < ፓ - < ፔ - < ፕ - < ፖ - < ፗ - < ፘ - < ፙ - < ፚ - < ॐ - < अ - < आ - < इ - < ई - < उ - < ऊ - < ऋ - < ॠ - < ऌ - < ॡ - < ऍ - < ऎ - < ए - < ऐ - < ऑ - < ऒ - < ओ - < औ - < क - < ख - < ग - < घ - < ङ - < च - < छ - < ज - < झ - < ञ - < ट - < ठ - < ड - < ढ - < ण - < त - < थ - < द - < ध - < न - < प - < फ - < ब - < भ - < म - < य - < र - < ल - < ळ - < व - < श - < ष - < स - < ह - < ऽ - < ा - < ि - < ी - < ु - < ू - < ृ - < ॄ - < ॢ - < ॣ - < ॅ - < ॆ - < े - < ै - < ॉ - < ॊ - < ो - < ौ - < ् - < অ - < আ - < ই - < ঈ - < উ - < ঊ - < ঋ - < à§  - < ঌ - < à§¡ - < এ - < ঐ - < ও - < ঔ - < ক - < খ - < গ - < ঘ - < ঙ - < চ - < ছ - < জ - < ঝ - < ঞ - < ট - < ঠ - < ড - < ঢ - < ণ - < ত - < থ - < দ - < ধ - < ন - < প - < ফ - < ব - < ভ - < ম - < য - < র - < à§° - < ল - < à§± - < শ - < ষ - < স - < হ - < া - < ি - < ী - < ু - < ূ - < ৃ - < ৄ - < à§¢ - < à§£ - < ে - < ৈ - < ো - < ৌ - < ্ - < ৗ - < à©´ - < ੳ - < ਉ - < ਊ - < ਓ - < ਅ - < ਆ - < ਐ - < ਔ - < ੲ - < ਇ - < ਈ - < ਏ - < ਸ - < ਹ - < ਕ - < ਖ - < ਗ - < ਘ - < ਙ - < ਚ - < ਛ - < ਜ - < ਝ - < ਞ - < ਟ - < ਠ - < ਡ - < ਢ - < ਣ - < ਤ - < ਥ - < ਦ - < ਧ - < ਨ - < ਪ - < ਫ - < ਬ - < ਭ - < ਮ - < ਯ - < ਰ - < ਲ - < ਵ - < ੜ - < ਾ - < ਿ - < ੀ - < ੁ - < ੂ - < ੇ - < ੈ - < ੋ - < ੌ - < ੍ - < ૐ - < અ - < આ - < ઇ - < ઈ - < ઉ - < ઊ - < ઋ - < à«  - < ઍ - < એ - < ઐ - < ઑ - < ઓ - < ઔ - < ક - < ખ - < ગ - < ઘ - < ઙ - < ચ - < છ - < જ - < ઝ - < ઞ - < ટ - < ઠ - < ડ - < ઢ - < ણ - < ત - < થ - < દ - < ધ - < ન - < પ - < ફ - < બ - < ભ - < મ - < ય - < ર - < લ - < ળ - < વ - < શ - < ષ - < સ - < હ - < ઽ - < ા - < િ - < ી - < ુ - < ૂ - < ૃ - < ૄ - < ૅ - < ે - < ૈ - < ૉ - < ો - < ૌ - < ્ - < ଅ - < ଆ - < ଇ - < ଈ - < ଉ - < ଊ - < ଋ - < à­  - < ଌ - < à­¡ - < ଏ - < ଐ - < ଓ - < ଔ - < କ - < ଖ - < ଗ - < ଘ - < ଙ - < ଚ - < ଛ - < ଜ - < ଝ - < ଞ - < ଟ - < ଠ - < ଡ - < ଢ - < ଣ - < ତ - < ଥ - < ଦ - < ଧ - < ନ - < ପ - < ଫ - < ବ - < ଭ - < ମ - < ଯ - < ୟ - < ର - < ଲ - < ଳ - < ଶ - < ଷ - < ସ - < ହ - < ଽ - < ା - < ି - < ୀ - < ୁ - < ୂ - < ୃ - < େ - < ୈ - < ୋ - < ୌ - < ୍ - < ୖ - < ୗ - < ஃ - < அ - < ஆ - < இ - < ஈ - < உ - < ஊ - < எ - < ஏ - < ஐ - < ஒ - < ஓ - < ஔ - < க - < ங - < ச - < ஜ - < ஞ - < ட - < ண - < த - < ந - < ன - < ப - < à®® - < ய - < à®° - < à®± - < ல - < ள - < à®´ - < வ - < à®· - < ஸ - < ஹ - < ா - < ி - < ீ - < ு - < ூ - < ெ - < ே - < ை - < ொ - < ோ - < ௌ - < ் - < ௗ - < అ - < ఆ - < ఇ - < ఈ - < ఉ - < ఊ - < ఋ - < à±  - < ఌ - < ౡ - < ఎ - < ఏ - < ఐ - < ఒ - < ఓ - < ఔ - < క - < ఖ - < గ - < ఘ - < ఙ - < చ - < ఛ - < జ - < ఝ - < ఞ - < ట - < à°  - < à°¡ - < à°¢ - < à°£ - < à°¤ - < à°¥ - < à°¦ - < à°§ - < à°¨ - < à°ª - < à°« - < à°¬ - < à°­ - < à°® - < à°¯ - < à°° - < à°± - < à°² - < à°³ - < à°µ - < à°¶ - < à°· - < à°¸ - < à°¹ - < à°¾ - < à°¿ - < ీ - < ు - < ూ - < ృ - < ౄ - < ె - < ే - < ై - < ొ - < ో - < ౌ - < ్ - < ౕ - < ౖ - < ಅ - < ಆ - < ಇ - < ಈ - < ಉ - < ಊ - < ಋ - < à³  - < ಌ - < ೡ - < ಎ - < ಏ - < ಐ - < ಒ - < ಓ - < ಔ - < ಕ - < ಖ - < ಗ - < ಘ - < ಙ - < ಚ - < ಛ - < ಜ - < ಝ - < ಞ - < ಟ - < ಠ - < ಡ - < ಢ - < ಣ - < ತ - < ಥ - < ದ - < ಧ - < ನ - < ಪ - < ಫ - < ಬ - < ಭ - < ಮ - < ಯ - < ರ - < ಱ - < ಲ - < ವ - < ಶ - < ಷ - < ಸ - < ಹ - < ಳ - < ೞ - < ಾ - < ಿ - < ೀ - < ು - < ೂ - < ೃ - < ೄ - < ೆ - < ೇ - < ೈ - < ೊ - < ೋ - < ೌ - < ್ - < ೕ - < ೖ - < അ - < ആ - < ഇ - < ഈ - < ഉ - < ഊ - < ഋ - < ൠ - < ഌ - < ൡ - < എ - < ഏ - < ഐ - < ഒ - < ഓ - < ഔ - < ക - < ഖ - < ഗ - < ഘ - < ങ - < ച - < ഛ - < ജ - < ഝ - < ഞ - < ട - < à´  - < à´¡ - < à´¢ - < à´£ - < à´¤ - < à´¥ - < à´¦ - < à´§ - < à´¨ - < à´ª - < à´« - < à´¬ - < à´­ - < à´® - < à´¯ - < à´° - < à´± - < à´² - < à´³ - < à´´ - < à´µ - < à´¶ - < à´· - < à´¸ - < à´¹ - < à´¾ - < à´¿ - < ീ - < ു - < ൂ - < ൃ - < െ - < േ - < ൈ - < ൊ - < ോ - < ൌ - < ് - < ൗ - < අ - < ආ - < ඇ - < ඈ - < ඉ - < ඊ - < උ - < ඌ - < ඍ - < ඎ - < ඏ - < ඐ - < එ - < ඒ - < ඓ - < ඔ - < ඕ - < ඖ - < ක - < ඛ - < ග - < ඝ - < ඞ - < ඟ - < à¶  - < à¶¡ - < à¶¢ - < à¶£ - < ඤ - < à¶¥ - < ඦ - < à¶§ - < ඨ - < à¶© - < ඪ - < à¶« - < ඬ - < à¶­ - < à¶® - < ද - < à¶° - < à¶± - < à¶³ - < à¶´ - < à¶µ - < à¶¶ - < à¶· - < ම - < à¶¹ - < ය - < à¶» - < à¶½ - < ව - < ශ - < ෂ - < ස - < හ - < ළ - < ෆ - < ් - < ා - < ැ - < ෑ - < ි - < ී - < ු - < ූ - < ෘ - < ෙ - < ේ - < ෛ - < ො - < ෝ - < ෞ - < ෟ - < à·² - < à·³ - < ก - < ข - < ฃ - < ค - < ฅ - < ฆ - < ง - < จ - < ฉ - < ช - < ซ - < ฌ - < ญ - < ฎ - < ฏ - < ฐ - < ฑ - < ฒ - < ณ - < ด - < ต - < ถ - < ท - < ธ - < น - < บ - < ป - < ผ - < ฝ - < พ - < ฟ - < ภ - < ม - < ย - < ร - < ฤ - < ล - < ฦ - < ว - < ศ - < ษ - < ส - < ห - < ฬ - < อ - < ฮ - < ฯ - < ะ - < ั - < า - < ำ - = ํา - < ิ - < ี - < ึ - < ื - < ุ - < ู - < ฺ - < เ - < แ - < โ - < ใ - < ไ - < ๅ - < ์ - < ํ - < ກ - < ຂ - < ຄ - < ງ - < ຈ - < ຊ - < ຍ - < ດ - < ຕ - < ຖ - < ທ - < ນ - < ບ - < ປ - < ຜ - < ຝ - < ພ - < ຟ - < ມ - < ຢ - < ຣ - < ລ - < ວ - < ສ - < ຫ - <<< ໜ / ນ - <<< ໝ / ມ - < ອ - < ຮ - < ຯ - < ະ - < ັ - < າ - < ຳ - = ໍາ - < ິ - < ີ - < ຶ - < ື - < ຸ - < ູ - < ົ - < ຼ - < ຽ - < ເ - < ແ - < ໂ - < ໃ - < ໄ - < ໌ - < ໍ - < ཀ - < ྐ - < ཁ - < ྑ - < ག - < ྒ - < ང - < ྔ - < ཅ - < ྕ - < ཆ - < ྖ - < ཇ - < ྗ - < ཉ - < ྙ - < ཊ - < ྚ - < ཋ - < ྛ - < ཌ - < ྜ - < ཎ - < ྞ - < ཏ - < ྟ - < ཐ - < ྠ - < ད - < ྡ - < ན - < ྣ - < པ - < ྤ - < ཕ - < ྥ - < བ - < ྦ - < མ - < ྨ - < ཙ - < ྩ - < ཚ - < ྪ - < ཛ - < ྫ - < ཝ - < ྭ - << ྺ - < ཞ - < ྮ - < ཟ - < ྯ - < འ - < ྰ - < ཡ - < ྱ - << ྻ - < ར - << ཪ - < ྲ - <<< ྲཱ / ཱ - << ྼ - < ལ - < ླ - <<< ླཱ / ཱ - < ཤ - < ྴ - < ཥ - < ྵ - < ས - < ྶ - < ཧ - < ྷ - < ཨ - <<< ༀ / ོཾ - < ྸ - < ྈ - < ྉ - < ྊ - < ྋ - < ཱ - < ི - < ཱི - < ྀ - < ཱྀ - < ུ - < ཱུ - < ྲྀ - < ཷ - = ྲཱྀ - < ླྀ - < ཹ - = ླཱྀ - < ེ - < ཻ - < ོ - < ཽ - < ྄ - < က - < ခ - < ဂ - < ဃ - < င - < စ - < ဆ - < ဇ - < ဈ - < ဉ - < ည - < ဋ - < ဌ - < ဍ - < ဎ - < ဏ - < တ - < ထ - < ဒ - < ဓ - < န - < ပ - < ဖ - < ဗ - < ဘ - < မ - < ယ - < ရ - < လ - < ဝ - < ၐ - < ၑ - < သ - < ဟ - < ဠ - < အ - < ဣ - < ဤ - < ဥ - < ဦ - < ဧ - < ဩ - < ဪ - < ၒ - < ၓ - < ၔ - < ၕ - < ာ - < ိ - < ီ - < ု - < ူ - < ေ - < ဲ - < ၖ - < ၗ - < ၘ - < ၙ - < ္ - < ក - < ខ - < គ - < ឃ - < ង - < ច - < ឆ - < ជ - < ឈ - < ញ - < ដ - < ឋ - < ឌ - < ឍ - < ណ - < ត - < ថ - < ទ - < ធ - < ន - < ប - < ផ - < ព - < ភ - < ម - < យ - < រ - < ល - < វ - < ឝ - < ឞ - < ស - < ហ - < ឡ - < អ - < ឣ - < ឤ - < ឥ - < ឦ - < ឧ - < ឨ - < ឩ - < ឪ - < ឫ - < ឬ - < ឭ - < ឮ - < ឯ - < ឰ - < ឱ - < ឲ - < ឳ - < '឴' - < '឵' - < ា - < ិ - < ី - < ឹ - < ឺ - < ុ - < ូ - < ួ - < ើ - < ឿ - < ៀ - < េ - < ែ - < ៃ - < ោ - < ៅ - < ្ - < ᢀ - < ᢁ - < ᢂ - < ᢃ - < ᢄ - < ᢅ - < ᢆ - < ᡃ - < á   - < ᢇ - < á ¡ - < ᡄ - < ᡝ - < á ¢ - < ᡅ - < ᡞ - < ᡳ - < ᢈ - < ᡟ - < á £ - < ᡆ - < á ¤ - < ᡇ - < á¡¡ - < á ¥ - < ᡈ - < á ¦ - < ᡉ - < á¡  - < á § - < á ¨ - < á © - < ᡊ - < á¡¢ - < ᢊ - < ᢛ - < á ª - < ᡋ - < á « - < ᡌ - < ᡦ - < á ¬ - < ᡍ - < á ­ - < ᡎ - < ᡤ - < ᢚ - < á¡¥ - < á ® - < ᡏ - < á ¯ - < á ° - < á ± - < á¡§ - < ᢜ - < ᢝ - < ᢢ - < ᢤ - < ᢥ - < á ² - < ᡐ - < ᡨ - < á ³ - < ᡑ - < á¡© - < á ´ - < ᡒ - < ᡱ - < ᡜ - < ᢋ - < á µ - < ᡓ - < ᡪ - < á¡· - < á ¶ - < ᡕ - < ᡲ - < á · - < ᡵ - < á ¸ - < ᡖ - < á ¹ - < á¡« - < á¡¶ - < á º - < ᡗ - < á¡£ - < á¡´ - < ᢉ - < á » - < á ¼ - < ᡔ - < á¡® - < á ½ - < ᡯ - < ᡘ - < ᡬ - < á ¾ - < ᡙ - < á¡­ - < á ¿ - < ᡀ - < ᡁ - < ᡂ - < ᡚ - < ᡛ - < á¡° - < ᢌ - < ᢞ - < ᢍ - < ᢎ - < ᢟ - < ᢏ - < ᢐ - < ᢘ - < ᢠ - < ᢑ - < ᢡ - < ᢒ - < ᢓ - < ᢨ - < ᢔ - < ᢣ - < ᢕ - < ᢙ - < ᢖ - < ᢗ - < ᢦ - < ᢧ - < ᢩ - < Ꭰ - < Ꭱ - < Ꭲ - < Ꭳ - < Ꭴ - < Ꭵ - < Ꭶ - < Ꭷ - < Ꭸ - < Ꭹ - < Ꭺ - < Ꭻ - < Ꭼ - < Ꭽ - < Ꭾ - < Ꭿ - < Ꮀ - < Ꮁ - < Ꮂ - < Ꮃ - < Ꮄ - < Ꮅ - < Ꮆ - < Ꮇ - < Ꮈ - < Ꮉ - < Ꮊ - < Ꮋ - < Ꮌ - < Ꮍ - < Ꮎ - < Ꮏ - < Ꮐ - < Ꮑ - < Ꮒ - < Ꮓ - < Ꮔ - < Ꮕ - < Ꮖ - < Ꮗ - < Ꮘ - < Ꮙ - < Ꮚ - < Ꮛ - < Ꮜ - < Ꮝ - < Ꮞ - < Ꮟ - < Ꮠ - < Ꮡ - < Ꮢ - < Ꮣ - < Ꮤ - < Ꮥ - < Ꮦ - < Ꮧ - < Ꮨ - < Ꮩ - < Ꮪ - < Ꮫ - < Ꮬ - < Ꮭ - < Ꮮ - < Ꮯ - < Ꮰ - < Ꮱ - < Ꮲ - < Ꮳ - < Ꮴ - < Ꮵ - < Ꮶ - < Ꮷ - < Ꮸ - < Ꮹ - < Ꮺ - < Ꮻ - < Ꮼ - < Ꮽ - < Ꮾ - < Ꮿ - < Ᏸ - < Ᏹ - < Ᏺ - < Ᏻ - < Ᏼ - < ᐁ - < ᐂ - < ᐃ - < ᐄ - < ᐅ - < ᐆ - < ᐇ - < ᐈ - < ᐉ - < ᐊ - < ᐋ - < ᐌ - < ᐍ - < ᐎ - < ᐏ - < ᐐ - < ᐑ - < ᐒ - < ᐓ - < ᐔ - < ᐕ - < ᐖ - < ᐗ - < ᐘ - < ᐙ - < ᐚ - < ᐛ - < ᐜ - < ᐝ - < ᐞ - < ᐟ - < ᐠ - < ᐡ - < ᐢ - < ᐣ - < ᐤ - < ᐥ - < ᐦ - < ᐧ - < ᐨ - < ᐩ - < ᐪ - < ᐫ - < ᐬ - < ᐭ - < ᐮ - < ᐯ - < ᐰ - < ᐱ - < ᐲ - < ᐳ - < ᐴ - < ᐵ - < ᐶ - < ᐷ - < ᐸ - < ᐹ - < ᐺ - < ᐻ - < ᐼ - < ᐽ - < ᐾ - < ᐿ - < ᑀ - < ᑁ - < ᑂ - < ᑃ - < ᑄ - < ᑅ - < ᑆ - < ᑇ - < ᑈ - < ᑉ - < ᑊ - < ᑋ - < ᑌ - < ᑍ - < ᑎ - < ᑏ - < ᑐ - < ᑑ - < ᑒ - < ᑓ - < ᑔ - < ᑕ - < ᑖ - < ᑗ - < ᑘ - < ᑙ - < ᑚ - < ᑛ - < ᑜ - < ᑝ - < ᑞ - < ᑟ - < ᑠ - < ᑡ - < ᑢ - < ᑣ - < ᑤ - < ᑥ - < ᑦ - < ᑧ - < ᑨ - < ᑩ - < ᑪ - < ᑫ - < ᑬ - < ᑭ - < ᑮ - < ᑯ - < ᑰ - < ᑱ - < ᑲ - < ᑳ - < ᑴ - < ᑵ - < ᑶ - < ᑷ - < ᑸ - < ᑹ - < ᑺ - < ᑻ - < ᑼ - < ᑽ - < ᑾ - < ᑿ - < ᒀ - < ᒁ - < ᒂ - < ᒃ - < ᒄ - < ᒅ - < ᒆ - < ᒇ - < ᒈ - < ᒉ - < ᒊ - < ᒋ - < ᒌ - < ᒍ - < ᒎ - < ᒏ - < ᒐ - < ᒑ - < ᒒ - < ᒓ - < ᒔ - < ᒕ - < ᒖ - < ᒗ - < ᒘ - < ᒙ - < ᒚ - < ᒛ - < ᒜ - < ᒝ - < ᒞ - < ᒟ - < ᒠ - < ᒡ - < ᒢ - < ᒣ - < ᒤ - < ᒥ - < ᒦ - < ᒧ - < ᒨ - < ᒩ - < ᒪ - < ᒫ - < ᒬ - < ᒭ - < ᒮ - < ᒯ - < ᒰ - < ᒱ - < ᒲ - < ᒳ - < ᒴ - < ᒵ - < ᒶ - < ᒷ - < ᒸ - < ᒹ - < ᒺ - < ᒻ - < ᒼ - < ᒽ - < ᒾ - < ᒿ - < ᓀ - < ᓁ - < ᓂ - < ᓃ - < ᓄ - < ᓅ - < ᓆ - < ᓇ - < ᓈ - < ᓉ - < ᓊ - < ᓋ - < ᓌ - < ᓍ - < ᓎ - < ᓏ - < ᓐ - < ᓑ - < ᓒ - < ᓓ - < ᓔ - < ᓕ - < ᓖ - < ᓗ - < ᓘ - < ᓙ - < ᓚ - < ᓛ - < ᓜ - < ᓝ - < ᓞ - < ᓟ - < ᓠ - < ᓡ - < ᓢ - < ᓣ - < ᓤ - < ᓥ - < ᓦ - < ᓧ - < ᓨ - < ᓩ - < ᓪ - < ᓫ - < ᓬ - < ᓭ - < ᓮ - < ᓯ - < ᓰ - < ᓱ - < ᓲ - < ᓳ - < ᓴ - < ᓵ - < ᓶ - < ᓷ - < ᓸ - < ᓹ - < ᓺ - < ᓻ - < ᓼ - < ᓽ - < ᓾ - < ᓿ - < ᔀ - < ᔁ - < ᔂ - < ᔃ - < ᔄ - < ᔅ - < ᔆ - < ᔇ - < ᔈ - < ᔉ - < ᔊ - < ᔋ - < ᔌ - < ᔍ - < ᔎ - < ᔏ - < ᔐ - < ᔑ - < ᔒ - < ᔓ - < ᔔ - < ᔕ - < ᔖ - < ᔗ - < ᔘ - < ᔙ - < ᔚ - < ᔛ - < ᔜ - < ᔝ - < ᔞ - < ᔟ - < ᔠ - < ᔡ - < ᔢ - < ᔣ - < ᔤ - < ᔥ - < ᔦ - < ᔧ - < ᔨ - < ᔩ - < ᔪ - < ᔫ - < ᔬ - < ᔭ - < ᔮ - < ᔯ - < ᔰ - < ᔱ - < ᔲ - < ᔳ - < ᔴ - < ᔵ - < ᔶ - < ᔷ - < ᔸ - < ᔹ - < ᔺ - < ᔻ - < ᔼ - < ᔽ - < ᔾ - < ᔿ - < ᕀ - < ᕁ - < ᕂ - < ᕃ - < ᕄ - < ᕅ - < ᕆ - < ᕇ - < ᕈ - < ᕉ - < ᕊ - < ᕋ - < ᕌ - < ᕍ - < ᕎ - < ᕏ - < ᕐ - < ᕑ - < ᕒ - < ᕓ - < ᕔ - < ᕕ - < ᕖ - < ᕗ - < ᕘ - < ᕙ - < ᕚ - < ᕛ - < ᕜ - < ᕝ - < ᕞ - < ᕟ - < ᕠ - < ᕡ - < ᕢ - < ᕣ - < ᕤ - < ᕥ - < ᕦ - < ᕧ - < ᕨ - < ᕩ - < ᕪ - < ᕫ - < ᕬ - < ᕭ - < ᕮ - < ᕯ - < ᕰ - < ᕱ - < ᕲ - < ᕳ - < ᕴ - < ᕵ - < ᕶ - < ᕷ - < ᕸ - < ᕹ - < ᕺ - < ᕻ - < ᕽ - < ᙯ - < ᕾ - < ᕿ - < ᖀ - < ᖁ - < ᖂ - < ᖃ - < ᖄ - < ᖅ - < ᖆ - < ᖇ - < ᖈ - < ᖉ - < ᖊ - < ᖋ - < ᖌ - < ᖍ - < ᙰ - < ᖎ - < ᖏ - < ᖐ - < ᖑ - < ᖒ - < ᖓ - < ᖔ - < ᖕ - < ᙱ - < ᙲ - < ᙳ - < ᙴ - < ᙵ - < ᙶ - < ᖖ - < ᖗ - < ᖘ - < ᖙ - < ᖚ - < ᖛ - < ᖜ - < ᖝ - < ᖞ - < ᖟ - < ᖠ - < ᖡ - < ᖢ - < ᖣ - < ᖤ - < ᖥ - < ᖦ - < ᕼ - < ᖧ - < ᖨ - < ᖩ - < ᖪ - < ᖫ - < ᖬ - < ᖭ - < ᖮ - < ᖯ - < ᖰ - < ᖱ - < ᖲ - < ᖳ - < ᖴ - < ᖵ - < ᖶ - < ᖷ - < ᖸ - < ᖹ - < ᖺ - < ᖻ - < ᖼ - < ᖽ - < ᖾ - < ᖿ - < ᗀ - < ᗁ - < ᗂ - < ᗃ - < ᗄ - < ᗅ - < ᗆ - < ᗇ - < ᗈ - < ᗉ - < ᗊ - < ᗋ - < ᗌ - < ᗍ - < ᗎ - < ᗏ - < ᗐ - < ᗑ - < ᗒ - < ᗓ - < ᗔ - < ᗕ - < ᗖ - < ᗗ - < ᗘ - < ᗙ - < ᗚ - < ᗛ - < ᗜ - < ᗝ - < ᗞ - < ᗟ - < ᗠ - < ᗡ - < ᗢ - < ᗣ - < ᗤ - < ᗥ - < ᗦ - < ᗧ - < ᗨ - < ᗩ - < ᗪ - < ᗫ - < ᗬ - < ᗭ - < ᗮ - < ᗯ - < ᗰ - < ᗱ - < ᗲ - < ᗳ - < ᗴ - < ᗵ - < ᗶ - < ᗷ - < ᗸ - < ᗹ - < ᗺ - < ᗻ - < ᗼ - < ᗽ - < ᗾ - < ᗿ - < ᘀ - < ᘁ - < ᘂ - < ᘃ - < ᘄ - < ᘅ - < ᘆ - < ᘇ - < ᘈ - < ᘉ - < ᘊ - < ᘋ - < ᘌ - < ᘍ - < ᘎ - < ᘏ - < ᘐ - < ᘑ - < ᘒ - < ᘓ - < ᘔ - < ᘕ - < ᘖ - < ᘗ - < ᘘ - < ᘙ - < ᘚ - < ᘛ - < ᘜ - < ᘝ - < ᘞ - < ᘟ - < ᘠ - < ᘡ - < ᘢ - < ᘣ - < ᘤ - < ᘥ - < ᘦ - < ᘧ - < ᘨ - < ᘩ - < ᘪ - < ᘫ - < ᘬ - < ᘭ - < ᘮ - < ᘯ - < ᘰ - < ᘱ - < ᘲ - < ᘳ - < ᘴ - < ᘵ - < ᘶ - < ᘷ - < ᘸ - < ᘹ - < ᘺ - < ᘻ - < ᘼ - < ᘽ - < ᘾ - < ᘿ - < ᙀ - < ᙁ - < ᙂ - < ᙃ - < ᙄ - < ᙅ - < ᙆ - < ᙇ - < ᙈ - < ᙉ - < ᙊ - < ᙋ - < ᙌ - < ᙍ - < ᙎ - < ᙏ - < ᙐ - < ᙑ - < ᙒ - < ᙓ - < ᙔ - < ᙕ - < ᙖ - < ᙗ - < ᙘ - < ᙙ - < ᙚ - < ᙛ - < ᙜ - < ᙝ - < ᙞ - < ᙟ - < ᙠ - < ᙡ - < ᙢ - < ᙣ - < ᙤ - < ᙥ - < ᙦ - < ᙧ - < ᙨ - < ᙩ - < ᙪ - < ᙫ - < ᙬ - < ᚁ - < ᚂ - < ᚃ - < ᚄ - < ᚅ - < ᚆ - < ᚇ - < ᚈ - < ᚉ - < ᚊ - < ᚋ - < ᚌ - < ᚍ - < ᚎ - < ᚏ - < ᚐ - < ᚑ - < ᚒ - < ᚓ - < ᚔ - < ᚕ - < ᚖ - < ᚗ - < ᚘ - < ᚙ - < ᚚ - < ᚠ - << ᚡ - < ᚢ - << ᚤ - << ᚥ - < ᚦ - <<< ᛰ / ᚦ - << ᚧ - < ᚨ - << ᚩ - << ᚬ - << ᚭ - << ᚮ - < ᚯ - < ᚰ - < ᚱ - < ᚲ - << ᚳ - << ᚴ - << ᚵ - << ᚶ - < ᚷ - < ᚹ - << ᛩ - < ᚺ - << ᚻ - << ᚼ - << ᚽ - < ᚾ - << ᚿ - << ᛀ - < ᛁ - << ᛂ - < ᛃ - << ᛄ - < ᛅ - <<< ᛮ / ᛚ - << ᛆ - < ᛇ - < ᛈ - << ᛕ - < ᛉ - < ᛊ - << ᛋ - << ᛪ - << ᛌ - << ᛍ - << ᛎ - < ᛏ - << ᛐ - << ᛑ - < ᛒ - << ᛓ - << ᛔ - < ᛖ - < ᛗ - << ᛘ - <<< ᛯ / ᛗ - << ᛙ - < ᛚ - << ᛛ - < ᛜ - << ᛝ - < ᛞ - < ᛟ - < ᚪ - < ᚫ - < ᚣ - < ᛠ - < ᛣ - < ᚸ - < ᛤ - < ᛡ - < ᛢ - < ᛥ - < ᛦ - << ᛧ - << ᛨ - < ᄀ - <<< ㄱ - <<< ㉠ - <<< ㉮ / ᅡ - <<< ᄀ - < ᄁ - <<< ㄲ - <<< ï¾¢ - < ᄂ - <<< ㄴ - <<< ㉡ - <<< ㉯ / ᅡ - <<< ᄂ - < ᄃ - <<< ㄷ - <<< ㉢ - <<< ㉰ / ᅡ - <<< ï¾§ - < ᄄ - <<< ㄸ - <<< ᄄ - < ᄅ - <<< ㄹ - <<< ㉣ - <<< ㉱ / ᅡ - <<< ᄅ - < ᄆ - <<< ㅁ - <<< ㉤ - <<< ㉲ / ᅡ - <<< ï¾± - < ᄇ - <<< ㅂ - <<< ㉥ - <<< ㉳ / ᅡ - <<< ï¾² - < ᄈ - <<< ㅃ - <<< ï¾³ - < ᄉ - <<< ㅅ - <<< ㉦ - <<< ㉴ / ᅡ - <<< ï¾µ - < ᄊ - <<< ㅆ - <<< ï¾¶ - < ᄋ - <<< ㅇ - <<< ㉧ - <<< ㉵ / ᅡ - <<< ï¾· - < ᄌ - <<< ㅈ - <<< ㉨ - <<< ㉶ / ᅡ - <<< ᄌ - < ᄍ - <<< ㅉ - <<< ï¾¹ - < ᄎ - <<< ㅊ - <<< ㉩ - <<< ㉷ / ᅡ - <<< ᄎ - < ᄏ - <<< ㅋ - <<< ㉪ - <<< ㉸ / ᅡ - <<< ï¾» - < ᄐ - <<< ㅌ - <<< ㉫ - <<< ㉹ / ᅡ - <<< ï¾¼ - < ᄑ - <<< ㅍ - <<< ㉬ - <<< ㉺ / ᅡ - <<< ï¾½ - < ᄒ - <<< ㅎ - <<< ㉭ - <<< ㉻ / ᅡ - <<< ï¾¾ - < ᄓ - < ᄔ - <<< ㅥ - < ᄕ - <<< ㅦ - < ᄖ - < ᄗ - < ᄘ - < ᄙ - < ᄚ - <<< ㅀ - <<< ï¾° - < ᄛ - < ᄜ - <<< ㅮ - < ᄝ - <<< ㅱ - < ᄞ - <<< ㅲ - < ᄟ - < ᄠ - <<< ㅳ - < ᄡ - <<< ㅄ - <<< ï¾´ - < ᄢ - <<< ㅴ - < ᄣ - <<< ㅵ - < ᄤ - < ᄥ - < ᄦ - < ᄧ - <<< ㅶ - < ᄨ - < ᄩ - <<< ㅷ - < ᄪ - < ᄫ - <<< ㅸ - < ᄬ - <<< ㅹ - < ᄭ - <<< ㅺ - < ᄮ - <<< ㅻ - < ᄯ - <<< ㅼ - < ᄰ - < ᄱ - < ᄲ - <<< ㅽ - < ᄳ - < ᄴ - < ᄵ - < ᄶ - <<< ㅾ - < ᄷ - < ᄸ - < ᄹ - < ᄺ - < ᄻ - < ᄼ - < ᄽ - < ᄾ - < ᄿ - < ᅀ - <<< ㅿ - < ᅁ - < ᅂ - < ᅃ - < ᅄ - < ᅅ - < ᅆ - < ᅇ - <<< ㆀ - < ᅈ - < ᅉ - < ᅊ - < ᅋ - < ᅌ - <<< ㆁ - < ᅍ - < ᅎ - < ᅏ - < ᅐ - < ᅑ - < ᅒ - < ᅓ - < ᅔ - < ᅕ - < ᅖ - < ᅗ - <<< ㆄ - < ᅘ - <<< ㆅ - < ᅙ - <<< ㆆ - < ᅟ - < ᅠ - <<< ㅤ - <<< ï¾  - < ᅡ - <<< ㅏ - <<< ᅡ - < ᅢ - <<< ㅐ - <<< ᅢ - < ᅣ - <<< ㅑ - <<< ᅣ - < ᅤ - <<< ㅒ - <<< ᅤ - < ᅥ - <<< ㅓ - <<< ᅥ - < ᅦ - <<< ㅔ - <<< ᅦ - < ᅧ - <<< ㅕ - <<< ᅧ - < ᅨ - <<< ㅖ - <<< ᅨ - < ᅩ - <<< ㅗ - <<< ᅩ - < ᅪ - <<< ㅘ - <<< ᅪ - < ᅫ - <<< ㅙ - <<< ᅫ - < ᅬ - <<< ㅚ - <<< ᅬ - < ᅭ - <<< ㅛ - <<< ᅭ - < ᅮ - <<< ㅜ - <<< ᅮ - < ᅯ - <<< ㅝ - <<< ᅯ - < ᅰ - <<< ㅞ - <<< ᅰ - < ᅱ - <<< ㅟ - <<< ᅱ - < ᅲ - <<< ㅠ - <<< ᅲ - < ᅳ - <<< ㅡ - <<< ᅳ - < ᅴ - <<< ㅢ - <<< ᅴ - < ᅵ - <<< ㅣ - <<< ᅵ - < ᅶ - < ᅷ - < ᅸ - < ᅹ - < ᅺ - < ᅻ - < ᅼ - < ᅽ - < ᅾ - < ᅿ - < ᆀ - < ᆁ - < ᆂ - < ᆃ - < ᆄ - <<< ㆇ - < ᆅ - <<< ㆈ - < ᆆ - < ᆇ - < ᆈ - <<< ㆉ - < ᆉ - < ᆊ - < ᆋ - < ᆌ - < ᆍ - < ᆎ - < ᆏ - < ᆐ - < ᆑ - <<< ㆊ - < ᆒ - <<< ㆋ - < ᆓ - < ᆔ - <<< ㆌ - < ᆕ - < ᆖ - < ᆗ - < ᆘ - < ᆙ - < ᆚ - < ᆛ - < ᆜ - < ᆝ - < ᆞ - <<< ㆍ - < ᆟ - < ᆠ - < ᆡ - <<< ㆎ - < ᆢ - < ᆨ - < ᆩ - < ᆪ - <<< ㄳ - <<< ï¾£ - < ᆫ - < ᆬ - <<< ㄵ - <<< ï¾¥ - < ᆭ - <<< ㄶ - <<< ᆭ - < ᆮ - < ᆯ - < ᆰ - <<< ㄺ - <<< ᆰ - < ᆱ - <<< ㄻ - <<< ᆱ - < ᆲ - <<< ㄼ - <<< ᆲ - < ᆳ - <<< ㄽ - <<< ï¾­ - < ᆴ - <<< ㄾ - <<< ï¾® - < ᆵ - <<< ㄿ - <<< ᆵ - < ᆶ - < ᆷ - < ᆸ - < ᆹ - < ᆺ - < ᆻ - < ᆼ - < ᆽ - < ᆾ - < ᆿ - < ᇀ - < ᇁ - < ᇂ - < ᇃ - < ᇄ - < ᇅ - < ᇆ - < ᇇ - <<< ㅧ - < ᇈ - <<< ㅨ - < ᇉ - < ᇊ - < ᇋ - < ᇌ - <<< ㅩ - < ᇍ - < ᇎ - <<< ㅪ - < ᇏ - < ᇐ - < ᇑ - < ᇒ - < ᇓ - <<< ㅫ - < ᇔ - < ᇕ - < ᇖ - < ᇗ - <<< ㅬ - < ᇘ - < ᇙ - <<< ㅭ - < ᇚ - < ᇛ - < ᇜ - < ᇝ - <<< ㅯ - < ᇞ - < ᇟ - <<< ㅰ - < ᇠ - < ᇡ - < ᇢ - < ᇣ - < ᇤ - < ᇥ - < ᇦ - < ᇧ - < ᇨ - < ᇩ - < ᇪ - < ᇫ - < ᇬ - < ᇭ - < ᇮ - < ᇯ - < ᇰ - < ᇱ - <<< ㆂ - < ᇲ - <<< ㆃ - < ᇳ - < ᇴ - < ᇵ - < ᇶ - < ᇷ - < ᇸ - < ᇹ - < ぁ - <<< あ - <<< ァ - <<< ï½§ - <<< ア - <<< ï½± - <<< ㋐ - <<< ㌃ / ーる - <<< ㌀ / ぱーと - <<< ㌁ / るふあ - <<< ㌂ / んぺあ - < ぃ - <<< い - <<< ィ - <<< ィ - <<< イ - <<< ï½² - <<< ㋑ - <<< ㌄ / にんぐ - <<< ㌅ / んち - < ぅ - <<< う - <<< ゥ - <<< ゥ - <<< ウ - <<< ï½³ - <<< ㋒ - <<< ㌆ / おん - < ぇ - <<< え - <<< ェ - <<< ェ - <<< エ - <<< ï½´ - <<< ㋓ - <<< ㌈ / ーかー - <<< ㌇ / すくーど - < ぉ - <<< お - <<< ォ - <<< ォ - <<< オ - <<< ï½µ - <<< ㋔ - <<< ㌊ / ーむ - <<< ㌉ / んす - < か - <<< ヵ - <<< カ - <<< ï½¶ - <<< ㋕ - <<< ㌋ / いり - <<< ㌌ / らつと - <<< ㌍ / ろりー - <<< ㌎ / ゙ろん - <<< ㌏ / ゙んま - < き - <<< キ - <<< ï½· - <<< ㋖ - <<< ㌐ / ゙が - <<< ㌑ / ゙にー - <<< ㌒ / ゆりー - <<< ㌓ / ゙るだー - <<< ㌔ / ろ - <<< ㌕ / ろぐらむ - <<< ㌖ / ろめーとる - <<< ㌗ / ろわつと - < く - <<< ク - <<< ク - <<< ㋗ - <<< ㌘ / ゙らむ - <<< ㌙ / ゙らむとん - <<< ㌚ / るぜいろ - <<< ㌛ / ろーね - < け - <<< ヶ - <<< ケ - <<< ï½¹ - <<< ㋘ - <<< ㌜ / ーす - < こ - <<< コ - <<< コ - <<< ㋙ - <<< ㌞ / ーぽ - <<< ㌝ / るな - < さ - <<< サ - <<< ï½» - <<< ㋚ - <<< ㌟ / いくる - <<< ㌠ / んちーむ - < 〆 / め - <<< し - <<< シ - <<< ï½¼ - <<< ㋛ - <<< ㌡ / りんぐ - < す - <<< ス - <<< ï½½ - <<< ㋜ - < せ - <<< セ - <<< ï½¾ - <<< ㋝ - <<< ㌢ / んち - <<< ㌣ / んと - < そ - <<< ソ - <<< ソ - <<< ㋞ - < た - <<< タ - <<< タ - <<< ㋟ - <<< ㌤ / ゙ーす - < ち - <<< チ - <<< チ - <<< ㋠ - < っ - <<< つ - <<< ッ - <<< ッ - <<< ツ - <<< ツ - <<< ㋡ - < て - <<< テ - <<< テ - <<< ㋢ - <<< ㌥ / ゙し - < と - <<< ト - <<< ト - <<< ㋣ - <<< ㌦ / ゙る - <<< ㌧ / ん - < な - <<< ナ - <<< ナ - <<< ㋤ - <<< ㌨ / の - < に - <<< ニ - <<< ニ - <<< ㋥ - < ぬ - <<< ヌ - <<< ヌ - <<< ㋦ - < ね - <<< ネ - <<< ネ - <<< ㋧ - < の - <<< ノ - <<< ノ - <<< ㋨ - <<< ㌩ / つと - < は - <<< ハ - <<< ハ - <<< ㋩ - <<< ㌫ / ゚ーせんと - <<< ㌬ / ゚ーつ - <<< ㌭ / ゙ーれる - <<< ㌪ / いつ - < ひ - <<< ヒ - <<< ヒ - <<< ㋪ - <<< ㌮ / ゚あすとる - <<< ㌯ / ゚くる - <<< ㌰ / ゚こ - <<< ㌱ / ゙る - < ふ - <<< フ - <<< フ - <<< ㋫ - <<< ㌲ / あらつど - <<< ㌳ / いーと - <<< ㌴ / ゙つしえる - <<< ㌵ / らん - < へ - <<< ヘ - <<< ヘ - <<< ㋬ - <<< ㌻ / ゚ーじ - <<< ㌼ / ゙ーた - <<< ㌶ / くたーる - <<< ㌷ / ゚そ - <<< ㌸ / ゚にひ - <<< ㌹ / るつ - <<< ㌺ / ゚んす - < ほ - <<< ホ - <<< ホ - <<< ㋭ - <<< ㍁ / ーる - <<< ㍂ / ーん - <<< ㌽ / ゚いんと - <<< ㌾ / ゙ると - <<< ㌿ / ん - <<< ㍀ / ゚んど - < ま - <<< マ - <<< マ - <<< ㋮ - <<< ㍃ / いくろ - <<< ㍄ / いる - <<< ㍅ / つは - <<< ㍆ / るく - <<< ㍇ / んしよん - < み - <<< ミ - <<< ミ - <<< ㋯ - <<< ㍈ / くろん - <<< ㍉ / り - <<< ㍊ / りばーる - < む - <<< ム - <<< ム - <<< ㋰ - < め - <<< メ - <<< メ - <<< ㋱ - <<< ㍍ / ーとる - <<< ㍋ / が - <<< ㍌ / がとん - < も - <<< モ - <<< モ - <<< ㋲ - < ゃ - <<< や - <<< ャ - <<< ャ - <<< ヤ - <<< ヤ - <<< ㋳ - <<< ㍎ / ーど - <<< ㍏ / ーる - < ゅ - <<< ゆ - <<< ュ - <<< ï½­ - <<< ユ - <<< ユ - <<< ㋴ - <<< ㍐ / あん - < ょ - <<< よ - <<< ョ - <<< ï½® - <<< ヨ - <<< ヨ - <<< ㋵ - < ら - <<< ラ - <<< ラ - <<< ㋶ - < り - <<< リ - <<< リ - <<< ㋷ - <<< ㍑ / つとる - <<< ㍒ / ら - < る - <<< ル - <<< ル - <<< ㋸ - <<< ㍔ / ーぶる - <<< ㍓ / ぴー - < れ - <<< レ - <<< レ - <<< ㋹ - <<< ㍕ / む - <<< ㍖ / んとげん - < ろ - <<< ロ - <<< ロ - <<< ㋺ - < ゎ - <<< わ - <<< ヮ - <<< ワ - <<< ワ - <<< ㋻ - <<< ㍗ / つと - < ゐ - <<< ヰ - <<< ㋼ - < ゑ - <<< ヱ - <<< ㋽ - < を - <<< ヲ - <<< ヲ - <<< ㋾ - < ん - <<< ン - <<< ン - < ㄅ - << ㆠ - < ㄆ - <<< ㆴ - < ㄇ - < ㄈ - < ㄪ - < ㄉ - < ㄊ - <<< ㆵ - < ㄋ - < ㄌ - < ㄍ - << ㆣ - < ㄎ - <<< ㆶ - < ㄫ - < ㆭ - < ㄏ - <<< ㆷ - < ㄐ - << ㆢ - < ㄑ - < ㄒ - < ㄬ - < ㄓ - < ㄔ - < ㄕ - < ㄖ - < ㄗ - << ㆡ - < ㄘ - < ㄙ - < ㄚ - << ㆩ - < ㄛ - << ㆧ - < ㆦ - < ㄜ - < ㄝ - < ㆤ - << ㆥ - < ㄞ - << ㆮ - < ㄟ - < ㄠ - << ㆯ - < ㄡ - < ㄢ - < ㄣ - < ㄤ - < ㆲ - < ㄥ - < ㆰ - < ㆱ - < ㆬ - < ㄦ - < ㄧ - << ㆪ - <<< ㆳ - < ㄨ - << ㆫ - << ㆨ - < ㄩ - < 𐌀 - < 𐌁 - < 𐌂 - < 𐌃 - < 𐌄 - < 𐌅 - < 𐌆 - < 𐌇 - < 𐌈 - < 𐌉 - < 𐌊 - < 𐌋 - < 𐌌 - < 𐌍 - < 𐌎 - < 𐌏 - < 𐌐 - < 𐌑 - < 𐌒 - < 𐌓 - < 𐌔 - < 𐌕 - < 𐌖 - < 𐌗 - < 𐌘 - < 𐌙 - < 𐌚 - < 𐌛 - < 𐌜 - < 𐌝 - < 𐌞 - < 𐌰 - < 𐌱 - < 𐌲 - < 𐌳 - < 𐌴 - < 𐌵 - < 𐌶 - < 𐌷 - < 𐌸 - < 𐌹 - < 𐌺 - < 𐌻 - < 𐌼 - < 𐌽 - < 𐌾 - < 𐌿 - < 𐍀 - < 𐍁 - < 𐍂 - < 𐍃 - < 𐍄 - < 𐍅 - < 𐍆 - < 𐍇 - < 𐍈 - < 𐍉 - < 𐍊 - < 𐐨 - <<< 𐐀 - < 𐐩 - <<< 𐐁 - < 𐐪 - <<< 𐐂 - < 𐐫 - <<< 𐐃 - < 𐐬 - <<< 𐐄 - < 𐐭 - <<< 𐐅 - < 𐐮 - <<< 𐐆 - < 𐐯 - <<< 𐐇 - < 𐐰 - <<< 𐐈 - < 𐐱 - <<< 𐐉 - < 𐐲 - <<< 𐐊 - < 𐐳 - <<< 𐐋 - < 𐐴 - <<< 𐐌 - < 𐐵 - <<< 𐐍 - < 𐐶 - <<< 𐐎 - < 𐐷 - <<< 𐐏 - < 𐐸 - <<< 𐐐 - < 𐐹 - <<< 𐐑 - < 𐐺 - <<< 𐐒 - < 𐐻 - <<< 𐐓 - < 𐐼 - <<< 𐐔 - < 𐐽 - <<< 𐐕 - < 𐐾 - <<< 𐐖 - < 𐐿 - <<< 𐐗 - < 𐑀 - <<< 𐐘 - < 𐑁 - <<< 𐐙 - < 𐑂 - <<< 𐐚 - < 𐑃 - <<< 𐐛 - < 𐑄 - <<< 𐐜 - < 𐑅 - <<< 𐐝 - < 𐑆 - <<< 𐐞 - < 𐑇 - <<< 𐐟 - < 𐑈 - <<< 𐐠 - < 𐑉 - <<< 𐐡 - < 𐑊 - <<< 𐐢 - < 𐑋 - <<< 𐐣 - < 𐑌 - <<< 𐐤 - < 𐑍 - <<< 𐐥 -& 一 # U+4E00 CJK UNIFIED IDEOGRAPH-4E00 - <<< ⼀ - <<< ㊀ - <<< ㆒ -& 丁 # U+4E01 CJK UNIFIED IDEOGRAPH-4E01 - <<< ㆜ -& 七 # U+4E03 CJK UNIFIED IDEOGRAPH-4E03 - <<< ㊆ -& 三 # U+4E09 CJK UNIFIED IDEOGRAPH-4E09 - <<< ㊂ - <<< ㆔ -& 上 # U+4E0A CJK UNIFIED IDEOGRAPH-4E0A - <<< ㊤ - <<< ㆖ -& 下 # U+4E0B CJK UNIFIED IDEOGRAPH-4E0B - <<< ㊦ - <<< ㆘ -& 丙 # U+4E19 CJK UNIFIED IDEOGRAPH-4E19 - <<< ㆛ -& 丨 # U+4E28 CJK UNIFIED IDEOGRAPH-4E28 - <<< ⼁ -& 丬 # U+4E2C CJK UNIFIED IDEOGRAPH-4E2C - = ⺦ -& 中 # U+4E2D CJK UNIFIED IDEOGRAPH-4E2D - <<< ㊥ - <<< ㆗ -& 丶 # U+4E36 CJK UNIFIED IDEOGRAPH-4E36 - <<< ⼂ - << ⺀ -& 丸 # U+4E38 CJK UNIFIED IDEOGRAPH-4E38 - = 丸 -& 丽 # U+4E3D CJK UNIFIED IDEOGRAPH-4E3D - = 丽 -& 丿 # U+4E3F CJK UNIFIED IDEOGRAPH-4E3F - <<< ⼃ -& 乁 # U+4E41 CJK UNIFIED IDEOGRAPH-4E41 - = 乁 -& 乙 # U+4E59 CJK UNIFIED IDEOGRAPH-4E59 - <<< ⼄ - <<< ㆚ - << ⺄ -& 乚 # U+4E5A CJK UNIFIED IDEOGRAPH-4E5A - = ⺃ -& 乛 # U+4E5B CJK UNIFIED IDEOGRAPH-4E5B - = ⺂ -& 九 # U+4E5D CJK UNIFIED IDEOGRAPH-4E5D - <<< ㊈ -& 亅 # U+4E85 CJK UNIFIED IDEOGRAPH-4E85 - <<< ⼅ -& 二 # U+4E8C CJK UNIFIED IDEOGRAPH-4E8C - <<< ⼆ - <<< ㊁ - <<< ㆓ -& 五 # U+4E94 CJK UNIFIED IDEOGRAPH-4E94 - <<< ㊄ -& 亠 # U+4EA0 CJK UNIFIED IDEOGRAPH-4EA0 - <<< ⼇ -& 人 # U+4EBA CJK UNIFIED IDEOGRAPH-4EBA - <<< ⼈ - <<< ㆟ -& 亻 # U+4EBB CJK UNIFIED IDEOGRAPH-4EBB - = ⺅ -& 仌 # U+4ECC CJK UNIFIED IDEOGRAPH-4ECC - = 仌 -& 企 # U+4F01 CJK UNIFIED IDEOGRAPH-4F01 - <<< ㊭ -& 休 # U+4F11 CJK UNIFIED IDEOGRAPH-4F11 - <<< ㊡ -& ä½  # U+4F60 CJK UNIFIED IDEOGRAPH-4F60 - = ä½  -& ä¾® # U+4FAE CJK UNIFIED IDEOGRAPH-4FAE - = ä¾® -& ä¾» # U+4FBB CJK UNIFIED IDEOGRAPH-4FBB - = ä¾» -& 倂 # U+5002 CJK UNIFIED IDEOGRAPH-5002 - = 倂 -& 偺 # U+507A CJK UNIFIED IDEOGRAPH-507A - = 偺 -& 備 # U+5099 CJK UNIFIED IDEOGRAPH-5099 - = 備 -& 像 # U+50CF CJK UNIFIED IDEOGRAPH-50CF - = 像 -& 僧 # U+50E7 CJK UNIFIED IDEOGRAPH-50E7 - = 僧 -& 優 # U+512A CJK UNIFIED IDEOGRAPH-512A - <<< ㊝ -& 儿 # U+513F CJK UNIFIED IDEOGRAPH-513F - <<< ⼉ -& 免 # U+514D CJK UNIFIED IDEOGRAPH-514D - = 免 -& 兔 # U+5154 CJK UNIFIED IDEOGRAPH-5154 - = 兔 -& 兤 # U+5164 CJK UNIFIED IDEOGRAPH-5164 - = 兤 -& 入 # U+5165 CJK UNIFIED IDEOGRAPH-5165 - <<< ⼊ -& 內 # U+5167 CJK UNIFIED IDEOGRAPH-5167 - = 內 -& 八 # U+516B CJK UNIFIED IDEOGRAPH-516B - <<< ⼋ - <<< ㊇ -& 六 # U+516D CJK UNIFIED IDEOGRAPH-516D - <<< ㊅ -& 具 # U+5177 CJK UNIFIED IDEOGRAPH-5177 - = 具 -& 冂 # U+5182 CJK UNIFIED IDEOGRAPH-5182 - <<< ⼌ - << ⺆ -& 再 # U+518D CJK UNIFIED IDEOGRAPH-518D - = 再 -& 冒 # U+5192 CJK UNIFIED IDEOGRAPH-5192 - = 冒 -& 冕 # U+5195 CJK UNIFIED IDEOGRAPH-5195 - = 冕 -& 冖 # U+5196 CJK UNIFIED IDEOGRAPH-5196 - <<< ⼍ -& 冗 # U+5197 CJK UNIFIED IDEOGRAPH-5197 - = 冗 -& 写 # U+5199 CJK UNIFIED IDEOGRAPH-5199 - <<< ㊢ -& 冤 # U+51A4 CJK UNIFIED IDEOGRAPH-51A4 - = 冤 -& 冫 # U+51AB CJK UNIFIED IDEOGRAPH-51AB - <<< ⼎ -& 冬 # U+51AC CJK UNIFIED IDEOGRAPH-51AC - = 冬 -& 况 # U+51B5 CJK UNIFIED IDEOGRAPH-51B5 - = 况 -& 几 # U+51E0 CJK UNIFIED IDEOGRAPH-51E0 - <<< ⼏ - << ⺇ -& 凵 # U+51F5 CJK UNIFIED IDEOGRAPH-51F5 - = 凵 - <<< ⼐ -& 刀 # U+5200 CJK UNIFIED IDEOGRAPH-5200 - <<< ⼑ - << ⺈ -& 刂 # U+5202 CJK UNIFIED IDEOGRAPH-5202 - = ⺉ -& 刃 # U+5203 CJK UNIFIED IDEOGRAPH-5203 - = 刃 -& 切 # U+5207 CJK UNIFIED IDEOGRAPH-5207 - = 切 -& 刻 # U+523B CJK UNIFIED IDEOGRAPH-523B - = 刻 -& 剆 # U+5246 CJK UNIFIED IDEOGRAPH-5246 - = 剆 -& 割 # U+5272 CJK UNIFIED IDEOGRAPH-5272 - = 割 -& 剷 # U+5277 CJK UNIFIED IDEOGRAPH-5277 - = 剷 -& 力 # U+529B CJK UNIFIED IDEOGRAPH-529B - <<< ⼒ -& 劳 # U+52B3 CJK UNIFIED IDEOGRAPH-52B3 - = 劳 -& 労 # U+52B4 CJK UNIFIED IDEOGRAPH-52B4 - <<< ㊘ -& 勇 # U+52C7 CJK UNIFIED IDEOGRAPH-52C7 - = 勇 -& 勉 # U+52C9 CJK UNIFIED IDEOGRAPH-52C9 - = 勉 -& 勤 # U+52E4 CJK UNIFIED IDEOGRAPH-52E4 - = 勤 -& 勹 # U+52F9 CJK UNIFIED IDEOGRAPH-52F9 - <<< ⼓ -& 勺 # U+52FA CJK UNIFIED IDEOGRAPH-52FA - = 勺 -& 包 # U+5305 CJK UNIFIED IDEOGRAPH-5305 - = 包 -& 匆 # U+5306 CJK UNIFIED IDEOGRAPH-5306 - = 匆 -& 匕 # U+5315 CJK UNIFIED IDEOGRAPH-5315 - <<< ⼔ -& 北 # U+5317 CJK UNIFIED IDEOGRAPH-5317 - = 北 -& 匚 # U+531A CJK UNIFIED IDEOGRAPH-531A - <<< ⼕ -& 匸 # U+5338 CJK UNIFIED IDEOGRAPH-5338 - <<< ⼖ -& 医 # U+533B CJK UNIFIED IDEOGRAPH-533B - <<< ㊩ -& 十 # U+5341 CJK UNIFIED IDEOGRAPH-5341 - <<< ⼗ - = 〸 - <<< ㊉ -& 卄 # U+5344 CJK UNIFIED IDEOGRAPH-5344 - <<< 〹 -& 卅 # U+5345 CJK UNIFIED IDEOGRAPH-5345 - <<< 〺 -& 卉 # U+5349 CJK UNIFIED IDEOGRAPH-5349 - = 卉 -& 卑 # U+5351 CJK UNIFIED IDEOGRAPH-5351 - = 卑 -& 協 # U+5354 CJK UNIFIED IDEOGRAPH-5354 - <<< ㊯ -& 博 # U+535A CJK UNIFIED IDEOGRAPH-535A - = 博 -& 卜 # U+535C CJK UNIFIED IDEOGRAPH-535C - <<< ⼘ - << ⺊ -& 卩 # U+5369 CJK UNIFIED IDEOGRAPH-5369 - <<< ⼙ - << ⺋ -& 印 # U+5370 CJK UNIFIED IDEOGRAPH-5370 - <<< ㊞ -& 即 # U+5373 CJK UNIFIED IDEOGRAPH-5373 - = 即 -& 卽 # U+537D CJK UNIFIED IDEOGRAPH-537D - = 卽 -& 卿 # U+537F CJK UNIFIED IDEOGRAPH-537F - = 卿 - = 卿 - = 卿 -& 厂 # U+5382 CJK UNIFIED IDEOGRAPH-5382 - <<< ⼚ - << ⺁ -& 厶 # U+53B6 CJK UNIFIED IDEOGRAPH-53B6 - <<< ⼛ -& 又 # U+53C8 CJK UNIFIED IDEOGRAPH-53C8 - <<< ⼜ -& 及 # U+53CA CJK UNIFIED IDEOGRAPH-53CA - = 及 -& 叟 # U+53DF CJK UNIFIED IDEOGRAPH-53DF - = 叟 -& 口 # U+53E3 CJK UNIFIED IDEOGRAPH-53E3 - <<< ⼝ -& 叫 # U+53EB CJK UNIFIED IDEOGRAPH-53EB - = 叫 -& 叱 # U+53F1 CJK UNIFIED IDEOGRAPH-53F1 - = 叱 -& 右 # U+53F3 CJK UNIFIED IDEOGRAPH-53F3 - <<< ㊨ -& 吆 # U+5406 CJK UNIFIED IDEOGRAPH-5406 - = 吆 -& 名 # U+540D CJK UNIFIED IDEOGRAPH-540D - <<< ㊔ -& 吸 # U+5438 CJK UNIFIED IDEOGRAPH-5438 - = 吸 -& 呈 # U+5448 CJK UNIFIED IDEOGRAPH-5448 - = 呈 -& 周 # U+5468 CJK UNIFIED IDEOGRAPH-5468 - = 周 -& 咞 # U+549E CJK UNIFIED IDEOGRAPH-549E - = 咞 -& 咢 # U+54A2 CJK UNIFIED IDEOGRAPH-54A2 - = 咢 -& 哶 # U+54F6 CJK UNIFIED IDEOGRAPH-54F6 - = 哶 -& 唐 # U+5510 CJK UNIFIED IDEOGRAPH-5510 - = 唐 -& 啓 # U+5553 CJK UNIFIED IDEOGRAPH-5553 - = 啓 -& 啣 # U+5563 CJK UNIFIED IDEOGRAPH-5563 - = 啣 -& 善 # U+5584 CJK UNIFIED IDEOGRAPH-5584 - = 善 - = 善 -& 喙 # U+5599 CJK UNIFIED IDEOGRAPH-5599 - = 喙 -& 喫 # U+55AB CJK UNIFIED IDEOGRAPH-55AB - = 喫 -& 喳 # U+55B3 CJK UNIFIED IDEOGRAPH-55B3 - = 喳 -& 嗂 # U+55C2 CJK UNIFIED IDEOGRAPH-55C2 - = 嗂 -& 嘆 # U+5606 CJK UNIFIED IDEOGRAPH-5606 - = 嘆 -& 噑 # U+5651 CJK UNIFIED IDEOGRAPH-5651 - = 噑 -& 噴 # U+5674 CJK UNIFIED IDEOGRAPH-5674 - = 噴 -& 囗 # U+56D7 CJK UNIFIED IDEOGRAPH-56D7 - <<< ⼞ -& 四 # U+56DB CJK UNIFIED IDEOGRAPH-56DB - <<< ㊃ - <<< ㆕ -& 圖 # U+5716 CJK UNIFIED IDEOGRAPH-5716 - = 圖 -& 圗 # U+5717 CJK UNIFIED IDEOGRAPH-5717 - = 圗 -& 土 # U+571F CJK UNIFIED IDEOGRAPH-571F - <<< ⼟ - <<< ㊏ -& 地 # U+5730 CJK UNIFIED IDEOGRAPH-5730 - <<< ㆞ -& 型 # U+578B CJK UNIFIED IDEOGRAPH-578B - = 型 -& 城 # U+57CE CJK UNIFIED IDEOGRAPH-57CE - = 城 -& 埴 # U+57F4 CJK UNIFIED IDEOGRAPH-57F4 - = 埴 -& 堍 # U+580D CJK UNIFIED IDEOGRAPH-580D - = 堍 -& å ± # U+5831 CJK UNIFIED IDEOGRAPH-5831 - = å ± -& å ² # U+5832 CJK UNIFIED IDEOGRAPH-5832 - = å ² -& 墬 # U+58AC CJK UNIFIED IDEOGRAPH-58AC - = 墬 -& 士 # U+58EB CJK UNIFIED IDEOGRAPH-58EB - <<< â¼  -& 壮 # U+58EE CJK UNIFIED IDEOGRAPH-58EE - = 壮 -& 売 # U+58F2 CJK UNIFIED IDEOGRAPH-58F2 - = 売 -& 壷 # U+58F7 CJK UNIFIED IDEOGRAPH-58F7 - = 壷 -& 夂 # U+5902 CJK UNIFIED IDEOGRAPH-5902 - <<< ⼡ -& 夆 # U+5906 CJK UNIFIED IDEOGRAPH-5906 - = 夆 -& 夊 # U+590A CJK UNIFIED IDEOGRAPH-590A - <<< â¼¢ -& 夕 # U+5915 CJK UNIFIED IDEOGRAPH-5915 - <<< â¼£ -& 多 # U+591A CJK UNIFIED IDEOGRAPH-591A - = 多 -& 夜 # U+591C CJK UNIFIED IDEOGRAPH-591C - <<< ㊰ -& 夢 # U+5922 CJK UNIFIED IDEOGRAPH-5922 - = 夢 -& 大 # U+5927 CJK UNIFIED IDEOGRAPH-5927 - <<< ⼤ - <<< ㍽ / æ­£ -& 天 # U+5929 CJK UNIFIED IDEOGRAPH-5929 - <<< ㆝ -& 奢 # U+5962 CJK UNIFIED IDEOGRAPH-5962 - = 奢 -& 女 # U+5973 CJK UNIFIED IDEOGRAPH-5973 - <<< â¼¥ - <<< ㊛ -& 姘 # U+59D8 CJK UNIFIED IDEOGRAPH-59D8 - = 姘 -& 姬 # U+59EC CJK UNIFIED IDEOGRAPH-59EC - = 姬 -& 娛 # U+5A1B CJK UNIFIED IDEOGRAPH-5A1B - = 娛 -& 娧 # U+5A27 CJK UNIFIED IDEOGRAPH-5A27 - = 娧 -& 婦 # U+5A66 CJK UNIFIED IDEOGRAPH-5A66 - = 婦 -& 媵 # U+5AB5 CJK UNIFIED IDEOGRAPH-5AB5 - = 媵 -& 嬈 # U+5B08 CJK UNIFIED IDEOGRAPH-5B08 - = 嬈 -& 嬾 # U+5B3E CJK UNIFIED IDEOGRAPH-5B3E - = 嬾 - = 嬾 -& 子 # U+5B50 CJK UNIFIED IDEOGRAPH-5B50 - <<< ⼦ -& å­¦ # U+5B66 CJK UNIFIED IDEOGRAPH-5B66 - <<< ㊫ -& 宀 # U+5B80 CJK UNIFIED IDEOGRAPH-5B80 - <<< â¼§ -& 宗 # U+5B97 CJK UNIFIED IDEOGRAPH-5B97 - <<< ㊪ -& 寃 # U+5BC3 CJK UNIFIED IDEOGRAPH-5BC3 - = 寃 -& 寘 # U+5BD8 CJK UNIFIED IDEOGRAPH-5BD8 - = 寘 -& 寧 # U+5BE7 CJK UNIFIED IDEOGRAPH-5BE7 - = 寧 -& 寳 # U+5BF3 CJK UNIFIED IDEOGRAPH-5BF3 - = 寳 -& 寸 # U+5BF8 CJK UNIFIED IDEOGRAPH-5BF8 - <<< ⼨ -& 寿 # U+5BFF CJK UNIFIED IDEOGRAPH-5BFF - = 寿 -& 将 # U+5C06 CJK UNIFIED IDEOGRAPH-5C06 - = 将 -& 小 # U+5C0F CJK UNIFIED IDEOGRAPH-5C0F - <<< ⼩ - << ⺌ - << ⺍ -& å°¢ # U+5C22 CJK UNIFIED IDEOGRAPH-5C22 - = ⺐ - = å°¢ - <<< ⼪ - << ⺎ -& å°£ # U+5C23 CJK UNIFIED IDEOGRAPH-5C23 - = ⺏ - << ⺑ -& å°¸ # U+5C38 CJK UNIFIED IDEOGRAPH-5C38 - <<< ⼫ -& å±  # U+5C60 CJK UNIFIED IDEOGRAPH-5C60 - = å±  -& å±® # U+5C6E CJK UNIFIED IDEOGRAPH-5C6E - = å±® - <<< ⼬ -& å±± # U+5C71 CJK UNIFIED IDEOGRAPH-5C71 - <<< â¼­ -& 岍 # U+5C8D CJK UNIFIED IDEOGRAPH-5C8D - = 岍 -& 峀 # U+5CC0 CJK UNIFIED IDEOGRAPH-5CC0 - = 峀 -& 嵃 # U+5D43 CJK UNIFIED IDEOGRAPH-5D43 - = 嵃 -& 嵫 # U+5D6B CJK UNIFIED IDEOGRAPH-5D6B - = 嵫 -& åµ® # U+5D6E CJK UNIFIED IDEOGRAPH-5D6E - = åµ® -& åµ¼ # U+5D7C CJK UNIFIED IDEOGRAPH-5D7C - = åµ¼ -& å¶² # U+5DB2 CJK UNIFIED IDEOGRAPH-5DB2 - = å¶² -& 巛 # U+5DDB CJK UNIFIED IDEOGRAPH-5DDB - <<< â¼® -& å·¡ # U+5DE1 CJK UNIFIED IDEOGRAPH-5DE1 - = å·¡ -& å·¢ # U+5DE2 CJK UNIFIED IDEOGRAPH-5DE2 - = å·¢ -& å·¥ # U+5DE5 CJK UNIFIED IDEOGRAPH-5DE5 - <<< ⼯ -& å·¦ # U+5DE6 CJK UNIFIED IDEOGRAPH-5DE6 - <<< ㊧ -& å·± # U+5DF1 CJK UNIFIED IDEOGRAPH-5DF1 - <<< â¼° -& å·³ # U+5DF3 CJK UNIFIED IDEOGRAPH-5DF3 - = ⺒ -& å·½ # U+5DFD CJK UNIFIED IDEOGRAPH-5DFD - = å·½ -& å·¾ # U+5DFE CJK UNIFIED IDEOGRAPH-5DFE - <<< â¼± -& 帨 # U+5E28 CJK UNIFIED IDEOGRAPH-5E28 - = 帨 -& 帽 # U+5E3D CJK UNIFIED IDEOGRAPH-5E3D - = 帽 -& 幩 # U+5E69 CJK UNIFIED IDEOGRAPH-5E69 - = 幩 -& å¹² # U+5E72 CJK UNIFIED IDEOGRAPH-5E72 - <<< â¼² -& å¹³ # U+5E73 CJK UNIFIED IDEOGRAPH-5E73 - < ㍻ / 成 -& 幺 # U+5E7A CJK UNIFIED IDEOGRAPH-5E7A - = ⺓ - <<< â¼³ -& 广 # U+5E7F CJK UNIFIED IDEOGRAPH-5E7F - <<< â¼´ -& 庰 # U+5EB0 CJK UNIFIED IDEOGRAPH-5EB0 - = 庰 -& 庳 # U+5EB3 CJK UNIFIED IDEOGRAPH-5EB3 - = 庳 -& 庶 # U+5EB6 CJK UNIFIED IDEOGRAPH-5EB6 - = 庶 -& 廊 # U+5ECA CJK UNIFIED IDEOGRAPH-5ECA - = 廊 -& å»´ # U+5EF4 CJK UNIFIED IDEOGRAPH-5EF4 - <<< â¼µ -& 廾 # U+5EFE CJK UNIFIED IDEOGRAPH-5EFE - = 廾 - <<< â¼¶ -& 弋 # U+5F0B CJK UNIFIED IDEOGRAPH-5F0B - <<< â¼· -& 弓 # U+5F13 CJK UNIFIED IDEOGRAPH-5F13 - <<< ⼸ -& å¼¢ # U+5F22 CJK UNIFIED IDEOGRAPH-5F22 - = å¼¢ - = å¼¢ -& 彐 # U+5F50 CJK UNIFIED IDEOGRAPH-5F50 - <<< â¼¹ - << ⺕ -& 彑 # U+5F51 CJK UNIFIED IDEOGRAPH-5F51 - = ⺔ -& 当 # U+5F53 CJK UNIFIED IDEOGRAPH-5F53 - = 当 -& 彡 # U+5F61 CJK UNIFIED IDEOGRAPH-5F61 - <<< ⼺ -& å½¢ # U+5F62 CJK UNIFIED IDEOGRAPH-5F62 - = å½¢ -& 彫 # U+5F6B CJK UNIFIED IDEOGRAPH-5F6B - = 彫 -& å½³ # U+5F73 CJK UNIFIED IDEOGRAPH-5F73 - <<< â¼» -& 徚 # U+5F9A CJK UNIFIED IDEOGRAPH-5F9A - = 徚 -& 心 # U+5FC3 CJK UNIFIED IDEOGRAPH-5FC3 - <<< â¼¼ - << ⺗ -& 忄 # U+5FC4 CJK UNIFIED IDEOGRAPH-5FC4 - = ⺖ -& 忍 # U+5FCD CJK UNIFIED IDEOGRAPH-5FCD - = 忍 -& 志 # U+5FD7 CJK UNIFIED IDEOGRAPH-5FD7 - = 志 -& 忹 # U+5FF9 CJK UNIFIED IDEOGRAPH-5FF9 - = 忹 -& 悁 # U+6081 CJK UNIFIED IDEOGRAPH-6081 - = 悁 -& 悔 # U+6094 CJK UNIFIED IDEOGRAPH-6094 - = 悔 -& 惇 # U+60C7 CJK UNIFIED IDEOGRAPH-60C7 - = 惇 -& 慈 # U+6148 CJK UNIFIED IDEOGRAPH-6148 - = 慈 -& 慌 # U+614C CJK UNIFIED IDEOGRAPH-614C - = 慌 - = 慌 -& 慎 # U+614E CJK UNIFIED IDEOGRAPH-614E - = 慎 -& 慺 # U+617A CJK UNIFIED IDEOGRAPH-617A - = 慺 -& 憎 # U+618E CJK UNIFIED IDEOGRAPH-618E - = 憎 -& 憤 # U+61A4 CJK UNIFIED IDEOGRAPH-61A4 - = 憤 -& 憯 # U+61AF CJK UNIFIED IDEOGRAPH-61AF - = 憯 -& 憲 # U+61B2 CJK UNIFIED IDEOGRAPH-61B2 - = 憲 -& 懞 # U+61DE CJK UNIFIED IDEOGRAPH-61DE - = 懞 -& 懲 # U+61F2 CJK UNIFIED IDEOGRAPH-61F2 - = 懲 -& 懶 # U+61F6 CJK UNIFIED IDEOGRAPH-61F6 - = 懶 -& 戈 # U+6208 CJK UNIFIED IDEOGRAPH-6208 - <<< â¼½ -& 成 # U+6210 CJK UNIFIED IDEOGRAPH-6210 - = 成 -& 戛 # U+621B CJK UNIFIED IDEOGRAPH-621B - = 戛 -& 戶 # U+6236 CJK UNIFIED IDEOGRAPH-6236 - <<< â¼¾ -& 手 # U+624B CJK UNIFIED IDEOGRAPH-624B - <<< ⼿ -& 扌 # U+624C CJK UNIFIED IDEOGRAPH-624C - = ⺘ -& 扝 # U+625D CJK UNIFIED IDEOGRAPH-625D - = 扝 -& 抱 # U+62B1 CJK UNIFIED IDEOGRAPH-62B1 - = 抱 -& 拔 # U+62D4 CJK UNIFIED IDEOGRAPH-62D4 - = 拔 -& 拼 # U+62FC CJK UNIFIED IDEOGRAPH-62FC - = 拼 -& 挽 # U+633D CJK UNIFIED IDEOGRAPH-633D - = 挽 -& 捐 # U+6350 CJK UNIFIED IDEOGRAPH-6350 - = 捐 -& 捨 # U+6368 CJK UNIFIED IDEOGRAPH-6368 - = 捨 -& 掃 # U+6383 CJK UNIFIED IDEOGRAPH-6383 - = 掃 -& 掩 # U+63A9 CJK UNIFIED IDEOGRAPH-63A9 - = 掩 -& 揅 # U+63C5 CJK UNIFIED IDEOGRAPH-63C5 - = 揅 -& 揤 # U+63E4 CJK UNIFIED IDEOGRAPH-63E4 - = 揤 -& 搢 # U+6422 CJK UNIFIED IDEOGRAPH-6422 - = 搢 -& 摩 # U+6469 CJK UNIFIED IDEOGRAPH-6469 - = 摩 -& 摷 # U+6477 CJK UNIFIED IDEOGRAPH-6477 - = 摷 -& 摾 # U+647E CJK UNIFIED IDEOGRAPH-647E - = 摾 -& 撝 # U+649D CJK UNIFIED IDEOGRAPH-649D - = 撝 -& 支 # U+652F CJK UNIFIED IDEOGRAPH-652F - <<< ⽀ -& 攴 # U+6534 CJK UNIFIED IDEOGRAPH-6534 - <<< ⽁ -& 攵 # U+6535 CJK UNIFIED IDEOGRAPH-6535 - = ⺙ -& 敏 # U+654F CJK UNIFIED IDEOGRAPH-654F - = 敏 -& 敬 # U+656C CJK UNIFIED IDEOGRAPH-656C - = 敬 -& 文 # U+6587 CJK UNIFIED IDEOGRAPH-6587 - <<< ⽂ -& 斗 # U+6597 CJK UNIFIED IDEOGRAPH-6597 - <<< ⽃ -& 斤 # U+65A4 CJK UNIFIED IDEOGRAPH-65A4 - <<< ⽄ -& 方 # U+65B9 CJK UNIFIED IDEOGRAPH-65B9 - <<< ⽅ -& 无 # U+65E0 CJK UNIFIED IDEOGRAPH-65E0 - <<< ⽆ -& 旡 # U+65E1 CJK UNIFIED IDEOGRAPH-65E1 - = ⺛ -& 旣 # U+65E3 CJK UNIFIED IDEOGRAPH-65E3 - = 旣 -& 日 # U+65E5 CJK UNIFIED IDEOGRAPH-65E5 - <<< ⽇ - <<< ㊐ - << ⺜ -& 明 # U+660E CJK UNIFIED IDEOGRAPH-660E - < ㍾ / æ²» -& 昭 # U+662D CJK UNIFIED IDEOGRAPH-662D - < ㍼ / 和 -& 晉 # U+6649 CJK UNIFIED IDEOGRAPH-6649 - = 晉 -& 暑 # U+6691 CJK UNIFIED IDEOGRAPH-6691 - = 暑 -& 暜 # U+669C CJK UNIFIED IDEOGRAPH-669C - = 暜 -& 曰 # U+66F0 CJK UNIFIED IDEOGRAPH-66F0 - <<< ⽈ -& 書 # U+66F8 CJK UNIFIED IDEOGRAPH-66F8 - = 書 -& 最 # U+6700 CJK UNIFIED IDEOGRAPH-6700 - = 最 -& 月 # U+6708 CJK UNIFIED IDEOGRAPH-6708 - <<< ⽉ - <<< ㊊ - << ⺝ -& 有 # U+6709 CJK UNIFIED IDEOGRAPH-6709 - <<< ㊒ -& 朗 # U+6717 CJK UNIFIED IDEOGRAPH-6717 - = 朗 -& 望 # U+671B CJK UNIFIED IDEOGRAPH-671B - = 望 -& 朡 # U+6721 CJK UNIFIED IDEOGRAPH-6721 - = 朡 -& æœ¨ # U+6728 CJK UNIFIED IDEOGRAPH-6728 - <<< ⽊ - <<< ㊍ -& 杓 # U+6753 CJK UNIFIED IDEOGRAPH-6753 - = 杓 -& 杞 # U+675E CJK UNIFIED IDEOGRAPH-675E - = 杞 -& 枅 # U+6785 CJK UNIFIED IDEOGRAPH-6785 - = 枅 -& 柺 # U+67FA CJK UNIFIED IDEOGRAPH-67FA - = 柺 -& 栟 # U+681F CJK UNIFIED IDEOGRAPH-681F - = 栟 -& æ ª # U+682A CJK UNIFIED IDEOGRAPH-682A - <<< ㊑ - <<< ㍿ / 式会社 -& 桒 # U+6852 CJK UNIFIED IDEOGRAPH-6852 - = 桒 -& 梅 # U+6885 CJK UNIFIED IDEOGRAPH-6885 - = 梅 -& 梎 # U+688E CJK UNIFIED IDEOGRAPH-688E - = 梎 -& 椔 # U+6914 CJK UNIFIED IDEOGRAPH-6914 - = 椔 -& 楂 # U+6942 CJK UNIFIED IDEOGRAPH-6942 - = 楂 -& 榣 # U+69A3 CJK UNIFIED IDEOGRAPH-69A3 - = 榣 -& 槪 # U+69EA CJK UNIFIED IDEOGRAPH-69EA - = 槪 -& 檨 # U+6AA8 CJK UNIFIED IDEOGRAPH-6AA8 - = 檨 -& 櫛 # U+6ADB CJK UNIFIED IDEOGRAPH-6ADB - = 櫛 -& 欠 # U+6B20 CJK UNIFIED IDEOGRAPH-6B20 - <<< ⽋ -& 次 # U+6B21 CJK UNIFIED IDEOGRAPH-6B21 - = 次 -& 歔 # U+6B54 CJK UNIFIED IDEOGRAPH-6B54 - = 歔 -& æ­¢ # U+6B62 CJK UNIFIED IDEOGRAPH-6B62 - <<< ⽌ -& æ­£ # U+6B63 CJK UNIFIED IDEOGRAPH-6B63 - <<< ㊣ -& æ­² # U+6B72 CJK UNIFIED IDEOGRAPH-6B72 - = æ­² -& æ­¹ # U+6B79 CJK UNIFIED IDEOGRAPH-6B79 - <<< ⽍ -& æ­º # U+6B7A CJK UNIFIED IDEOGRAPH-6B7A - << ⺞ -& 殟 # U+6B9F CJK UNIFIED IDEOGRAPH-6B9F - = 殟 -& 殳 # U+6BB3 CJK UNIFIED IDEOGRAPH-6BB3 - <<< ⽎ -& 殺 # U+6BBA CJK UNIFIED IDEOGRAPH-6BBA - = 殺 -& æ®» # U+6BBB CJK UNIFIED IDEOGRAPH-6BBB - = æ®» -& 毋 # U+6BCB CJK UNIFIED IDEOGRAPH-6BCB - <<< ⽏ -& 母 # U+6BCD CJK UNIFIED IDEOGRAPH-6BCD - <<< ⺟ -& 比 # U+6BD4 CJK UNIFIED IDEOGRAPH-6BD4 - <<< ⽐ -& 毛 # U+6BDB CJK UNIFIED IDEOGRAPH-6BDB - <<< ⽑ -& 氏 # U+6C0F CJK UNIFIED IDEOGRAPH-6C0F - <<< ⽒ -& 民 # U+6C11 CJK UNIFIED IDEOGRAPH-6C11 - = ⺠ -& 气 # U+6C14 CJK UNIFIED IDEOGRAPH-6C14 - <<< ⽓ -& æ°´ # U+6C34 CJK UNIFIED IDEOGRAPH-6C34 - <<< ⽔ - <<< ㊌ -& æ°µ # U+6C35 CJK UNIFIED IDEOGRAPH-6C35 - = ⺡ -& æ°º # U+6C3A CJK UNIFIED IDEOGRAPH-6C3A - = ⺢ -& 汎 # U+6C4E CJK UNIFIED IDEOGRAPH-6C4E - = 汎 -& æ±§ # U+6C67 CJK UNIFIED IDEOGRAPH-6C67 - = æ±§ -& 沿 # U+6CBF CJK UNIFIED IDEOGRAPH-6CBF - = 沿 -& 泍 # U+6CCD CJK UNIFIED IDEOGRAPH-6CCD - = 泍 -& 注 # U+6CE8 CJK UNIFIED IDEOGRAPH-6CE8 - <<< ㊟ -& 洖 # U+6D16 CJK UNIFIED IDEOGRAPH-6D16 - = 洖 -& æ´´ # U+6D34 CJK UNIFIED IDEOGRAPH-6D34 - = æ´´ -& æ´¾ # U+6D3E CJK UNIFIED IDEOGRAPH-6D3E - = æ´¾ -& 流 # U+6D41 CJK UNIFIED IDEOGRAPH-6D41 - = 流 -& 浩 # U+6D69 CJK UNIFIED IDEOGRAPH-6D69 - = 浩 -& æµ· # U+6D77 CJK UNIFIED IDEOGRAPH-6D77 - = æµ· -& 浸 # U+6D78 CJK UNIFIED IDEOGRAPH-6D78 - = 浸 -& 涅 # U+6D85 CJK UNIFIED IDEOGRAPH-6D85 - = 涅 -& æ·¹ # U+6DF9 CJK UNIFIED IDEOGRAPH-6DF9 - = æ·¹ -& 港 # U+6E2F CJK UNIFIED IDEOGRAPH-6E2F - = 港 -& æ¹® # U+6E6E CJK UNIFIED IDEOGRAPH-6E6E - = æ¹® -& 滇 # U+6EC7 CJK UNIFIED IDEOGRAPH-6EC7 - = 滇 -& 滋 # U+6ECB CJK UNIFIED IDEOGRAPH-6ECB - = 滋 -& æ½® # U+6F6E CJK UNIFIED IDEOGRAPH-6F6E - = æ½® -& 濆 # U+6FC6 CJK UNIFIED IDEOGRAPH-6FC6 - = 濆 -& 瀛 # U+701B CJK UNIFIED IDEOGRAPH-701B - = 瀛 -& 瀞 # U+701E CJK UNIFIED IDEOGRAPH-701E - = 瀞 -& 瀹 # U+7039 CJK UNIFIED IDEOGRAPH-7039 - = 瀹 -& 灊 # U+704A CJK UNIFIED IDEOGRAPH-704A - = 灊 -& 火 # U+706B CJK UNIFIED IDEOGRAPH-706B - <<< ⽕ - <<< ㊋ -& 灬 # U+706C CJK UNIFIED IDEOGRAPH-706C - = ⺣ -& 灰 # U+7070 CJK UNIFIED IDEOGRAPH-7070 - = 灰 -& 灷 # U+7077 CJK UNIFIED IDEOGRAPH-7077 - = 灷 -& 災 # U+707D CJK UNIFIED IDEOGRAPH-707D - = 災 -& 炭 # U+70AD CJK UNIFIED IDEOGRAPH-70AD - = 炭 -& 煅 # U+7145 CJK UNIFIED IDEOGRAPH-7145 - = 煅 -& 熜 # U+719C CJK UNIFIED IDEOGRAPH-719C - = 熜 -& 爨 # U+7228 CJK UNIFIED IDEOGRAPH-7228 - = 爨 -& 爪 # U+722A CJK UNIFIED IDEOGRAPH-722A - <<< ⽖ -& 爫 # U+722B CJK UNIFIED IDEOGRAPH-722B - = ⺤ - << ⺥ -& 爵 # U+7235 CJK UNIFIED IDEOGRAPH-7235 - = 爵 -& 父 # U+7236 CJK UNIFIED IDEOGRAPH-7236 - <<< ⽗ -& 爻 # U+723B CJK UNIFIED IDEOGRAPH-723B - <<< ⽘ -& 爿 # U+723F CJK UNIFIED IDEOGRAPH-723F - <<< ⽙ -& 片 # U+7247 CJK UNIFIED IDEOGRAPH-7247 - <<< ⽚ -& 牐 # U+7250 CJK UNIFIED IDEOGRAPH-7250 - = 牐 -& 牙 # U+7259 CJK UNIFIED IDEOGRAPH-7259 - <<< ⽛ -& 牛 # U+725B CJK UNIFIED IDEOGRAPH-725B - <<< ⽜ - << ⺧ -& 特 # U+7279 CJK UNIFIED IDEOGRAPH-7279 - <<< ㊕ -& 犀 # U+7280 CJK UNIFIED IDEOGRAPH-7280 - = 犀 -& 犕 # U+7295 CJK UNIFIED IDEOGRAPH-7295 - = 犕 -& 犬 # U+72AC CJK UNIFIED IDEOGRAPH-72AC - <<< ⽝ -& 犭 # U+72AD CJK UNIFIED IDEOGRAPH-72AD - = ⺨ -& 獺 # U+737A CJK UNIFIED IDEOGRAPH-737A - = 獺 -& 玄 # U+7384 CJK UNIFIED IDEOGRAPH-7384 - <<< ⽞ -& 玉 # U+7389 CJK UNIFIED IDEOGRAPH-7389 - <<< ⽟ -& 王 # U+738B CJK UNIFIED IDEOGRAPH-738B - = 王 - << ⺩ -& 玥 # U+73A5 CJK UNIFIED IDEOGRAPH-73A5 - = 玥 -& 瑇 # U+7447 CJK UNIFIED IDEOGRAPH-7447 - = 瑇 -& 瑜 # U+745C CJK UNIFIED IDEOGRAPH-745C - = 瑜 -& 瑱 # U+7471 CJK UNIFIED IDEOGRAPH-7471 - = 瑱 -& 璅 # U+7485 CJK UNIFIED IDEOGRAPH-7485 - = 璅 -& 瓊 # U+74CA CJK UNIFIED IDEOGRAPH-74CA - = 瓊 -& 瓜 # U+74DC CJK UNIFIED IDEOGRAPH-74DC - <<< â½  -& 瓦 # U+74E6 CJK UNIFIED IDEOGRAPH-74E6 - <<< ⽡ -& 甘 # U+7518 CJK UNIFIED IDEOGRAPH-7518 - <<< â½¢ -& 生 # U+751F CJK UNIFIED IDEOGRAPH-751F - <<< â½£ -& 甤 # U+7524 CJK UNIFIED IDEOGRAPH-7524 - = 甤 -& 用 # U+7528 CJK UNIFIED IDEOGRAPH-7528 - <<< ⽤ -& 田 # U+7530 CJK UNIFIED IDEOGRAPH-7530 - <<< â½¥ -& 甲 # U+7532 CJK UNIFIED IDEOGRAPH-7532 - <<< ㆙ -& 男 # U+7537 CJK UNIFIED IDEOGRAPH-7537 - <<< ㊚ -& 甾 # U+753E CJK UNIFIED IDEOGRAPH-753E - = 甾 -& 異 # U+7570 CJK UNIFIED IDEOGRAPH-7570 - = 異 -& 疋 # U+758B CJK UNIFIED IDEOGRAPH-758B - <<< ⽦ - << ⺪ -& 疒 # U+7592 CJK UNIFIED IDEOGRAPH-7592 - <<< â½§ -& 瘐 # U+7610 CJK UNIFIED IDEOGRAPH-7610 - = 瘐 -& 癶 # U+7676 CJK UNIFIED IDEOGRAPH-7676 - <<< ⽨ -& 白 # U+767D CJK UNIFIED IDEOGRAPH-767D - <<< ⽩ -& 皮 # U+76AE CJK UNIFIED IDEOGRAPH-76AE - <<< ⽪ -& 皿 # U+76BF CJK UNIFIED IDEOGRAPH-76BF - <<< ⽫ -& 監 # U+76E3 CJK UNIFIED IDEOGRAPH-76E3 - <<< ㊬ -& 目 # U+76EE CJK UNIFIED IDEOGRAPH-76EE - <<< ⽬ - << ⺫ -& 直 # U+76F4 CJK UNIFIED IDEOGRAPH-76F4 - = 直 -& 眞 # U+771E CJK UNIFIED IDEOGRAPH-771E - = 眞 -& 真 # U+771F CJK UNIFIED IDEOGRAPH-771F - = 真 - = 真 -& 睊 # U+774A CJK UNIFIED IDEOGRAPH-774A - = 睊 -& 瞋 # U+778B CJK UNIFIED IDEOGRAPH-778B - = 瞋 -& 矛 # U+77DB CJK UNIFIED IDEOGRAPH-77DB - <<< â½­ -& 矢 # U+77E2 CJK UNIFIED IDEOGRAPH-77E2 - <<< â½® -& 石 # U+77F3 CJK UNIFIED IDEOGRAPH-77F3 - <<< ⽯ -& 硎 # U+784E CJK UNIFIED IDEOGRAPH-784E - = 硎 -& 碌 # U+788C CJK UNIFIED IDEOGRAPH-788C - = 碌 -& 磌 # U+78CC CJK UNIFIED IDEOGRAPH-78CC - = 磌 -& 示 # U+793A CJK UNIFIED IDEOGRAPH-793A - <<< â½° - << ⺬ -& 礻 # U+793B CJK UNIFIED IDEOGRAPH-793B - = ⺭ -& 社 # U+793E CJK UNIFIED IDEOGRAPH-793E - <<< ㊓ -& 祖 # U+7956 CJK UNIFIED IDEOGRAPH-7956 - = 祖 -& 祝 # U+795D CJK UNIFIED IDEOGRAPH-795D - <<< ㊗ -& 福 # U+798F CJK UNIFIED IDEOGRAPH-798F - = 福 -& 禸 # U+79B8 CJK UNIFIED IDEOGRAPH-79B8 - <<< â½± -& 禾 # U+79BE CJK UNIFIED IDEOGRAPH-79BE - <<< â½² -& 秘 # U+79D8 CJK UNIFIED IDEOGRAPH-79D8 - <<< ㊙ -& ç§« # U+79EB CJK UNIFIED IDEOGRAPH-79EB - = ç§« -& 穀 # U+7A40 CJK UNIFIED IDEOGRAPH-7A40 - = 穀 -& 穊 # U+7A4A CJK UNIFIED IDEOGRAPH-7A4A - = 穊 -& 穏 # U+7A4F CJK UNIFIED IDEOGRAPH-7A4F - = 穏 -& ç©´ # U+7A74 CJK UNIFIED IDEOGRAPH-7A74 - <<< â½³ -& 立 # U+7ACB CJK UNIFIED IDEOGRAPH-7ACB - <<< â½´ -& ç«® # U+7AEE CJK UNIFIED IDEOGRAPH-7AEE - = ç«® -& 竹 # U+7AF9 CJK UNIFIED IDEOGRAPH-7AF9 - <<< â½µ - << ⺮ -& 篆 # U+7BC6 CJK UNIFIED IDEOGRAPH-7BC6 - = 篆 -& 築 # U+7BC9 CJK UNIFIED IDEOGRAPH-7BC9 - = 築 -& ç±³ # U+7C73 CJK UNIFIED IDEOGRAPH-7C73 - <<< â½¶ -& 糒 # U+7CD2 CJK UNIFIED IDEOGRAPH-7CD2 - = 糒 -& ç³£ # U+7CE3 CJK UNIFIED IDEOGRAPH-7CE3 - = ç³£ -& 糨 # U+7CE8 CJK UNIFIED IDEOGRAPH-7CE8 - = 糨 -& 糸 # U+7CF8 CJK UNIFIED IDEOGRAPH-7CF8 - <<< â½· -& ç³¹ # U+7CF9 CJK UNIFIED IDEOGRAPH-7CF9 - = ⺯ -& 紀 # U+7D00 CJK UNIFIED IDEOGRAPH-7D00 - = 紀 -& çµ£ # U+7D63 CJK UNIFIED IDEOGRAPH-7D63 - = çµ£ -& 緇 # U+7DC7 CJK UNIFIED IDEOGRAPH-7DC7 - = 緇 -& 縂 # U+7E02 CJK UNIFIED IDEOGRAPH-7E02 - = 縂 -& 繅 # U+7E45 CJK UNIFIED IDEOGRAPH-7E45 - = 繅 -& 纟 # U+7E9F CJK UNIFIED IDEOGRAPH-7E9F - = ⺰ -& ç¼¶ # U+7F36 CJK UNIFIED IDEOGRAPH-7F36 - <<< ⽸ -& 网 # U+7F51 CJK UNIFIED IDEOGRAPH-7F51 - <<< â½¹ -& 罒 # U+7F52 CJK UNIFIED IDEOGRAPH-7F52 - = ⺲ - << ⺵ -& 罓 # U+7F53 CJK UNIFIED IDEOGRAPH-7F53 - = ⺱ - << ⺳ - << ⺴ -& 罺 # U+7F7A CJK UNIFIED IDEOGRAPH-7F7A - = 罺 -& 羊 # U+7F8A CJK UNIFIED IDEOGRAPH-7F8A - <<< ⽺ - << ⺶ - << ⺷ -& 羋 # U+7F8B CJK UNIFIED IDEOGRAPH-7F8B - = ⺸ -& 羕 # U+7F95 CJK UNIFIED IDEOGRAPH-7F95 - = 羕 -& ç¾½ # U+7FBD CJK UNIFIED IDEOGRAPH-7FBD - <<< â½» -& 翺 # U+7FFA CJK UNIFIED IDEOGRAPH-7FFA - = 翺 -& 老 # U+8001 CJK UNIFIED IDEOGRAPH-8001 - <<< â½¼ -& 耂 # U+8002 CJK UNIFIED IDEOGRAPH-8002 - = ⺹ -& 者 # U+8005 CJK UNIFIED IDEOGRAPH-8005 - = 者 -& 而 # U+800C CJK UNIFIED IDEOGRAPH-800C - <<< â½½ -& 耒 # U+8012 CJK UNIFIED IDEOGRAPH-8012 - <<< â½¾ -& 耳 # U+8033 CJK UNIFIED IDEOGRAPH-8033 - <<< ⽿ -& 聠 # U+8060 CJK UNIFIED IDEOGRAPH-8060 - = 聠 -& 聰 # U+8070 CJK UNIFIED IDEOGRAPH-8070 - = 聰 -& 聿 # U+807F CJK UNIFIED IDEOGRAPH-807F - <<< ⾀ - << ⺻ -& 肀 # U+8080 CJK UNIFIED IDEOGRAPH-8080 - = ⺺ -& 肉 # U+8089 CJK UNIFIED IDEOGRAPH-8089 - <<< ⾁ - << ⺼ -& 肭 # U+80AD CJK UNIFIED IDEOGRAPH-80AD - = 肭 -& 育 # U+80B2 CJK UNIFIED IDEOGRAPH-80B2 - = 育 -& 脃 # U+8103 CJK UNIFIED IDEOGRAPH-8103 - = 脃 -& 脾 # U+813E CJK UNIFIED IDEOGRAPH-813E - = 脾 -& 臣 # U+81E3 CJK UNIFIED IDEOGRAPH-81E3 - <<< ⾂ -& 自 # U+81EA CJK UNIFIED IDEOGRAPH-81EA - <<< ⾃ -& 至 # U+81F3 CJK UNIFIED IDEOGRAPH-81F3 - <<< ⾄ -& 臼 # U+81FC CJK UNIFIED IDEOGRAPH-81FC - <<< ⾅ - << ⺽ -& 舁 # U+8201 CJK UNIFIED IDEOGRAPH-8201 - = 舁 - = 舁 -& 舄 # U+8204 CJK UNIFIED IDEOGRAPH-8204 - = 舄 -& 舌 # U+820C CJK UNIFIED IDEOGRAPH-820C - <<< ⾆ -& 舛 # U+821B CJK UNIFIED IDEOGRAPH-821B - <<< ⾇ -& 舟 # U+821F CJK UNIFIED IDEOGRAPH-821F - <<< ⾈ -& 艮 # U+826E CJK UNIFIED IDEOGRAPH-826E - <<< ⾉ -& 色 # U+8272 CJK UNIFIED IDEOGRAPH-8272 - <<< ⾊ -& 艸 # U+8278 CJK UNIFIED IDEOGRAPH-8278 - <<< ⾋ -& 艹 # U+8279 CJK UNIFIED IDEOGRAPH-8279 - = ⺾ - << ⺿ - << ⻀ -& 芋 # U+828B CJK UNIFIED IDEOGRAPH-828B - = 芋 -& 芑 # U+8291 CJK UNIFIED IDEOGRAPH-8291 - = 芑 -& 芝 # U+829D CJK UNIFIED IDEOGRAPH-829D - = 芝 -& 花 # U+82B1 CJK UNIFIED IDEOGRAPH-82B1 - = 花 -& 芳 # U+82B3 CJK UNIFIED IDEOGRAPH-82B3 - = 芳 -& 芽 # U+82BD CJK UNIFIED IDEOGRAPH-82BD - = 芽 -& 若 # U+82E5 CJK UNIFIED IDEOGRAPH-82E5 - = 若 -& 苦 # U+82E6 CJK UNIFIED IDEOGRAPH-82E6 - = 苦 -& 茝 # U+831D CJK UNIFIED IDEOGRAPH-831D - = 茝 -& 茣 # U+8323 CJK UNIFIED IDEOGRAPH-8323 - = 茣 -& 荓 # U+8353 CJK UNIFIED IDEOGRAPH-8353 - = 荓 -& 荣 # U+8363 CJK UNIFIED IDEOGRAPH-8363 - = 荣 -& 莭 # U+83AD CJK UNIFIED IDEOGRAPH-83AD - = 莭 -& 莽 # U+83BD CJK UNIFIED IDEOGRAPH-83BD - = 莽 -& 菊 # U+83CA CJK UNIFIED IDEOGRAPH-83CA - = 菊 -& 菌 # U+83CC CJK UNIFIED IDEOGRAPH-83CC - = 菌 -& 菜 # U+83DC CJK UNIFIED IDEOGRAPH-83DC - = 菜 -& 菧 # U+83E7 CJK UNIFIED IDEOGRAPH-83E7 - = 菧 -& 著 # U+8457 CJK UNIFIED IDEOGRAPH-8457 - = 著 -& 蓱 # U+84F1 CJK UNIFIED IDEOGRAPH-84F1 - = 蓱 -& 蓳 # U+84F3 CJK UNIFIED IDEOGRAPH-84F3 - = 蓳 -& 蔖 # U+8516 CJK UNIFIED IDEOGRAPH-8516 - = 蔖 -& 蕤 # U+8564 CJK UNIFIED IDEOGRAPH-8564 - = 蕤 -& 虍 # U+864D CJK UNIFIED IDEOGRAPH-864D - <<< ⾌ -& 虎 # U+864E CJK UNIFIED IDEOGRAPH-864E - = ⻁ -& 虐 # U+8650 CJK UNIFIED IDEOGRAPH-8650 - = 虐 -& 虜 # U+865C CJK UNIFIED IDEOGRAPH-865C - = 虜 -& 虧 # U+8667 CJK UNIFIED IDEOGRAPH-8667 - = 虧 -& 虩 # U+8669 CJK UNIFIED IDEOGRAPH-8669 - = 虩 -& 虫 # U+866B CJK UNIFIED IDEOGRAPH-866B - <<< ⾍ -& 蚈 # U+8688 CJK UNIFIED IDEOGRAPH-8688 - = 蚈 -& 蚩 # U+86A9 CJK UNIFIED IDEOGRAPH-86A9 - = 蚩 -& 蛢 # U+86E2 CJK UNIFIED IDEOGRAPH-86E2 - = 蛢 -& 蜎 # U+870E CJK UNIFIED IDEOGRAPH-870E - = 蜎 -& 蜨 # U+8728 CJK UNIFIED IDEOGRAPH-8728 - = 蜨 -& 蝫 # U+876B CJK UNIFIED IDEOGRAPH-876B - = 蝫 -& 蝹 # U+8779 CJK UNIFIED IDEOGRAPH-8779 - = 蝹 -& 螆 # U+8786 CJK UNIFIED IDEOGRAPH-8786 - = 螆 -& 蟡 # U+87E1 CJK UNIFIED IDEOGRAPH-87E1 - = 蟡 -& 蠁 # U+8801 CJK UNIFIED IDEOGRAPH-8801 - = 蠁 -& 血 # U+8840 CJK UNIFIED IDEOGRAPH-8840 - <<< ⾎ -& 行 # U+884C CJK UNIFIED IDEOGRAPH-884C - <<< ⾏ -& è¡  # U+8860 CJK UNIFIED IDEOGRAPH-8860 - = è¡  -& è¡£ # U+8863 CJK UNIFIED IDEOGRAPH-8863 - = è¡£ - <<< ⾐ -& 衤 # U+8864 CJK UNIFIED IDEOGRAPH-8864 - = ⻂ -& 裗 # U+88D7 CJK UNIFIED IDEOGRAPH-88D7 - = 裗 -& 裞 # U+88DE CJK UNIFIED IDEOGRAPH-88DE - = 裞 -& 裺 # U+88FA CJK UNIFIED IDEOGRAPH-88FA - = 裺 -& 襾 # U+897E CJK UNIFIED IDEOGRAPH-897E - <<< ⾑ -& 西 # U+897F CJK UNIFIED IDEOGRAPH-897F - = ⻄ -& 覀 # U+8980 CJK UNIFIED IDEOGRAPH-8980 - = ⻃ -& 見 # U+898B CJK UNIFIED IDEOGRAPH-898B - <<< ⾒ -& 见 # U+89C1 CJK UNIFIED IDEOGRAPH-89C1 - = ⻅ -& 角 # U+89D2 CJK UNIFIED IDEOGRAPH-89D2 - = ⻆ - <<< ⾓ - << ⻇ -& 言 # U+8A00 CJK UNIFIED IDEOGRAPH-8A00 - <<< ⾔ -& 誠 # U+8AA0 CJK UNIFIED IDEOGRAPH-8AA0 - = 誠 -& è«­ # U+8AED CJK UNIFIED IDEOGRAPH-8AED - = è«­ -& 變 # U+8B8A CJK UNIFIED IDEOGRAPH-8B8A - = 變 -& è®  # U+8BA0 CJK UNIFIED IDEOGRAPH-8BA0 - = ⻈ -& è°· # U+8C37 CJK UNIFIED IDEOGRAPH-8C37 - <<< ⾕ -& 豆 # U+8C46 CJK UNIFIED IDEOGRAPH-8C46 - <<< ⾖ -& 豕 # U+8C55 CJK UNIFIED IDEOGRAPH-8C55 - = 豕 - <<< ⾗ -& 豸 # U+8C78 CJK UNIFIED IDEOGRAPH-8C78 - <<< ⾘ -& 貝 # U+8C9D CJK UNIFIED IDEOGRAPH-8C9D - <<< ⾙ -& 財 # U+8CA1 CJK UNIFIED IDEOGRAPH-8CA1 - <<< ㊖ -& 貫 # U+8CAB CJK UNIFIED IDEOGRAPH-8CAB - = 貫 -& 賁 # U+8CC1 CJK UNIFIED IDEOGRAPH-8CC1 - = 賁 -& 資 # U+8CC7 CJK UNIFIED IDEOGRAPH-8CC7 - <<< ㊮ -& 贛 # U+8D1B CJK UNIFIED IDEOGRAPH-8D1B - = 贛 -& 贝 # U+8D1D CJK UNIFIED IDEOGRAPH-8D1D - = ⻉ -& 赤 # U+8D64 CJK UNIFIED IDEOGRAPH-8D64 - <<< ⾚ -& èµ° # U+8D70 CJK UNIFIED IDEOGRAPH-8D70 - <<< ⾛ -& èµ· # U+8D77 CJK UNIFIED IDEOGRAPH-8D77 - = èµ· -& è¶³ # U+8DB3 CJK UNIFIED IDEOGRAPH-8DB3 - <<< ⾜ - << ⻊ -& è¶¼ # U+8DBC CJK UNIFIED IDEOGRAPH-8DBC - = è¶¼ -& 跋 # U+8DCB CJK UNIFIED IDEOGRAPH-8DCB - = 跋 -& è·° # U+8DF0 CJK UNIFIED IDEOGRAPH-8DF0 - = è·° -& 身 # U+8EAB CJK UNIFIED IDEOGRAPH-8EAB - <<< ⾝ -& 車 # U+8ECA CJK UNIFIED IDEOGRAPH-8ECA - <<< ⾞ -& 軔 # U+8ED4 CJK UNIFIED IDEOGRAPH-8ED4 - = 軔 -& 輸 # U+8F38 CJK UNIFIED IDEOGRAPH-8F38 - = 輸 -& 车 # U+8F66 CJK UNIFIED IDEOGRAPH-8F66 - = ⻋ -& 辛 # U+8F9B CJK UNIFIED IDEOGRAPH-8F9B - <<< ⾟ -& 辞 # U+8F9E CJK UNIFIED IDEOGRAPH-8F9E - = 辞 -& è¾° # U+8FB0 CJK UNIFIED IDEOGRAPH-8FB0 - <<< â¾  -& è¾µ # U+8FB5 CJK UNIFIED IDEOGRAPH-8FB5 - <<< ⾡ -& è¾¶ # U+8FB6 CJK UNIFIED IDEOGRAPH-8FB6 - = ⻌ - << ⻍ - << ⻎ -& 適 # U+9069 CJK UNIFIED IDEOGRAPH-9069 - <<< ㊜ -& 邑 # U+9091 CJK UNIFIED IDEOGRAPH-9091 - <<< â¾¢ - << ⻏ -& 邔 # U+9094 CJK UNIFIED IDEOGRAPH-9094 - = 邔 -& 郱 # U+90F1 CJK UNIFIED IDEOGRAPH-90F1 - = 郱 -& 鄑 # U+9111 CJK UNIFIED IDEOGRAPH-9111 - = 鄑 -& 鄛 # U+911B CJK UNIFIED IDEOGRAPH-911B - = 鄛 -& 酉 # U+9149 CJK UNIFIED IDEOGRAPH-9149 - <<< â¾£ -& 釆 # U+91C6 CJK UNIFIED IDEOGRAPH-91C6 - <<< ⾤ -& 里 # U+91CC CJK UNIFIED IDEOGRAPH-91CC - <<< â¾¥ -& 金 # U+91D1 CJK UNIFIED IDEOGRAPH-91D1 - <<< ⾦ - <<< ㊎ -& 鈸 # U+9238 CJK UNIFIED IDEOGRAPH-9238 - = 鈸 -& 鉼 # U+927C CJK UNIFIED IDEOGRAPH-927C - = 鉼 -& 鋗 # U+92D7 CJK UNIFIED IDEOGRAPH-92D7 - = 鋗 -& 鋘 # U+92D8 CJK UNIFIED IDEOGRAPH-92D8 - = 鋘 -& 鏹 # U+93F9 CJK UNIFIED IDEOGRAPH-93F9 - = 鏹 -& 鐕 # U+9415 CJK UNIFIED IDEOGRAPH-9415 - = 鐕 -& 钅 # U+9485 CJK UNIFIED IDEOGRAPH-9485 - = ⻐ -& 長 # U+9577 CJK UNIFIED IDEOGRAPH-9577 - = ⻑ - <<< â¾§ -& 镸 # U+9578 CJK UNIFIED IDEOGRAPH-9578 - = ⻒ -& 长 # U+957F CJK UNIFIED IDEOGRAPH-957F - = ⻓ -& 門 # U+9580 CJK UNIFIED IDEOGRAPH-9580 - <<< ⾨ -& 開 # U+958B CJK UNIFIED IDEOGRAPH-958B - = 開 -& 閷 # U+95B7 CJK UNIFIED IDEOGRAPH-95B7 - = 閷 -& 门 # U+95E8 CJK UNIFIED IDEOGRAPH-95E8 - = ⻔ -& 阜 # U+961C CJK UNIFIED IDEOGRAPH-961C - <<< ⾩ - << ⻕ -& 阝 # U+961D CJK UNIFIED IDEOGRAPH-961D - = ⻖ -& 隶 # U+96B6 CJK UNIFIED IDEOGRAPH-96B6 - <<< ⾪ -& 隹 # U+96B9 CJK UNIFIED IDEOGRAPH-96B9 - <<< ⾫ -& 雃 # U+96C3 CJK UNIFIED IDEOGRAPH-96C3 - = 雃 -& 雨 # U+96E8 CJK UNIFIED IDEOGRAPH-96E8 - <<< ⾬ - << ⻗ -& 霣 # U+9723 CJK UNIFIED IDEOGRAPH-9723 - = 霣 -& 靑 # U+9751 CJK UNIFIED IDEOGRAPH-9751 - <<< â¾­ -& 青 # U+9752 CJK UNIFIED IDEOGRAPH-9752 - = ⻘ -& 非 # U+975E CJK UNIFIED IDEOGRAPH-975E - <<< â¾® -& 面 # U+9762 CJK UNIFIED IDEOGRAPH-9762 - <<< ⾯ -& 革 # U+9769 CJK UNIFIED IDEOGRAPH-9769 - <<< â¾° -& 韋 # U+97CB CJK UNIFIED IDEOGRAPH-97CB - <<< â¾± -& 韠 # U+97E0 CJK UNIFIED IDEOGRAPH-97E0 - = 韠 -& 韦 # U+97E6 CJK UNIFIED IDEOGRAPH-97E6 - = ⻙ -& 韭 # U+97ED CJK UNIFIED IDEOGRAPH-97ED - <<< â¾² -& 音 # U+97F3 CJK UNIFIED IDEOGRAPH-97F3 - <<< â¾³ -& 頁 # U+9801 CJK UNIFIED IDEOGRAPH-9801 - <<< â¾´ -& 項 # U+9805 CJK UNIFIED IDEOGRAPH-9805 - <<< ㊠ -& 頋 # U+980B CJK UNIFIED IDEOGRAPH-980B - = 頋 - = 頋 -& é © # U+9829 CJK UNIFIED IDEOGRAPH-9829 - = é © -& 页 # U+9875 CJK UNIFIED IDEOGRAPH-9875 - = ⻚ -& 風 # U+98A8 CJK UNIFIED IDEOGRAPH-98A8 - <<< â¾µ -& 风 # U+98CE CJK UNIFIED IDEOGRAPH-98CE - = ⻛ -& 飛 # U+98DB CJK UNIFIED IDEOGRAPH-98DB - <<< â¾¶ -& 飞 # U+98DE CJK UNIFIED IDEOGRAPH-98DE - = ⻜ -& 食 # U+98DF CJK UNIFIED IDEOGRAPH-98DF - = ⻝ - <<< â¾· -& 飠 # U+98E0 CJK UNIFIED IDEOGRAPH-98E0 - = ⻟ - << ⻞ -& 飢 # U+98E2 CJK UNIFIED IDEOGRAPH-98E2 - = 飢 -& 餩 # U+9929 CJK UNIFIED IDEOGRAPH-9929 - = 餩 -& 饣 # U+9963 CJK UNIFIED IDEOGRAPH-9963 - = â»  -& 首 # U+9996 CJK UNIFIED IDEOGRAPH-9996 - <<< ⾸ - << ⻡ -& 香 # U+9999 CJK UNIFIED IDEOGRAPH-9999 - <<< â¾¹ -& 馧 # U+99A7 CJK UNIFIED IDEOGRAPH-99A7 - = 馧 -& 馬 # U+99AC CJK UNIFIED IDEOGRAPH-99AC - <<< ⾺ -& 駂 # U+99C2 CJK UNIFIED IDEOGRAPH-99C2 - = 駂 -& é§¾ # U+99FE CJK UNIFIED IDEOGRAPH-99FE - = é§¾ -& 马 # U+9A6C CJK UNIFIED IDEOGRAPH-9A6C - = ⻢ -& 骨 # U+9AA8 CJK UNIFIED IDEOGRAPH-9AA8 - <<< â¾» - << ⻣ -& 高 # U+9AD8 CJK UNIFIED IDEOGRAPH-9AD8 - <<< â¾¼ -& 髟 # U+9ADF CJK UNIFIED IDEOGRAPH-9ADF - <<< â¾½ -& 鬒 # U+9B12 CJK UNIFIED IDEOGRAPH-9B12 - = 鬒 -& 鬥 # U+9B25 CJK UNIFIED IDEOGRAPH-9B25 - <<< â¾¾ -& 鬯 # U+9B2F CJK UNIFIED IDEOGRAPH-9B2F - <<< ⾿ -& 鬲 # U+9B32 CJK UNIFIED IDEOGRAPH-9B32 - <<< ⿀ -& 鬼 # U+9B3C CJK UNIFIED IDEOGRAPH-9B3C - <<< ⿁ - << ⻤ -& 魚 # U+9B5A CJK UNIFIED IDEOGRAPH-9B5A - <<< ⿂ -& 鱀 # U+9C40 CJK UNIFIED IDEOGRAPH-9C40 - = 鱀 -& é±¼ # U+9C7C CJK UNIFIED IDEOGRAPH-9C7C - = ⻥ -& é³¥ # U+9CE5 CJK UNIFIED IDEOGRAPH-9CE5 - <<< ⿃ -& é³½ # U+9CFD CJK UNIFIED IDEOGRAPH-9CFD - = é³½ -& éµ§ # U+9D67 CJK UNIFIED IDEOGRAPH-9D67 - = éµ§ -& 鸟 # U+9E1F CJK UNIFIED IDEOGRAPH-9E1F - = ⻦ -& é¹µ # U+9E75 CJK UNIFIED IDEOGRAPH-9E75 - <<< ⿄ - << â»§ -& 鹿 # U+9E7F CJK UNIFIED IDEOGRAPH-9E7F - <<< ⿅ -& 麥 # U+9EA5 CJK UNIFIED IDEOGRAPH-9EA5 - <<< ⿆ -& 麦 # U+9EA6 CJK UNIFIED IDEOGRAPH-9EA6 - = ⻨ -& 麻 # U+9EBB CJK UNIFIED IDEOGRAPH-9EBB - = 麻 - <<< ⿇ -& 黃 # U+9EC3 CJK UNIFIED IDEOGRAPH-9EC3 - <<< ⿈ -& 黄 # U+9EC4 CJK UNIFIED IDEOGRAPH-9EC4 - = ⻩ -& 黍 # U+9ECD CJK UNIFIED IDEOGRAPH-9ECD - <<< ⿉ -& 黑 # U+9ED1 CJK UNIFIED IDEOGRAPH-9ED1 - <<< ⿊ -& 黹 # U+9EF9 CJK UNIFIED IDEOGRAPH-9EF9 - = 黹 - <<< ⿋ -& 黽 # U+9EFD CJK UNIFIED IDEOGRAPH-9EFD - <<< ⿌ -& 黾 # U+9EFE CJK UNIFIED IDEOGRAPH-9EFE - = ⻪ - = 黾 -& 鼅 # U+9F05 CJK UNIFIED IDEOGRAPH-9F05 - = 鼅 -& 鼎 # U+9F0E CJK UNIFIED IDEOGRAPH-9F0E - <<< ⿍ -& 鼏 # U+9F0F CJK UNIFIED IDEOGRAPH-9F0F - = 鼏 -& 鼓 # U+9F13 CJK UNIFIED IDEOGRAPH-9F13 - <<< ⿎ -& 鼖 # U+9F16 CJK UNIFIED IDEOGRAPH-9F16 - = 鼖 -& é¼  # U+9F20 CJK UNIFIED IDEOGRAPH-9F20 - <<< ⿏ -& é¼» # U+9F3B CJK UNIFIED IDEOGRAPH-9F3B - = é¼» - <<< ⿐ -& 齊 # U+9F4A CJK UNIFIED IDEOGRAPH-9F4A - <<< ⿑ - << ⻫ -& 齐 # U+9F50 CJK UNIFIED IDEOGRAPH-9F50 - = ⻬ -& 齒 # U+9F52 CJK UNIFIED IDEOGRAPH-9F52 - <<< ⿒ - << â»­ -& 齿 # U+9F7F CJK UNIFIED IDEOGRAPH-9F7F - = â»® -& 龍 # U+9F8D CJK UNIFIED IDEOGRAPH-9F8D - <<< ⿓ - << ⻯ -& 龙 # U+9F99 CJK UNIFIED IDEOGRAPH-9F99 - = â»° -& 龜 # U+9F9C CJK UNIFIED IDEOGRAPH-9F9C - <<< ⿔ - << â»± - << ⻲ -& 龟 # U+9F9F CJK UNIFIED IDEOGRAPH-9F9F - <<< ⻳ -& é¾  # U+9FA0 CJK UNIFIED IDEOGRAPH-9FA0 - <<< ⿕ -& 﨎 # U+FA0E CJK COMPATIBILITY IDEOGRAPH-FA0E - = 﨎 -& 﨏 # U+FA0F CJK COMPATIBILITY IDEOGRAPH-FA0F - = 﨏 -& 﨑 # U+FA11 CJK COMPATIBILITY IDEOGRAPH-FA11 - = 﨑 -& 﨓 # U+FA13 CJK COMPATIBILITY IDEOGRAPH-FA13 - = 﨓 -& 﨔 # U+FA14 CJK COMPATIBILITY IDEOGRAPH-FA14 - = 﨔 -& 﨟 # U+FA1F CJK COMPATIBILITY IDEOGRAPH-FA1F - = 﨟 -& 﨡 # U+FA21 CJK COMPATIBILITY IDEOGRAPH-FA21 - = 﨡 -& 﨣 # U+FA23 CJK COMPATIBILITY IDEOGRAPH-FA23 - = 﨣 -& 﨤 # U+FA24 CJK COMPATIBILITY IDEOGRAPH-FA24 - = 﨤 -& 﨧 # U+FA27 CJK COMPATIBILITY IDEOGRAPH-FA27 - = 﨧 -& 﨨 # U+FA28 CJK COMPATIBILITY IDEOGRAPH-FA28 - = 﨨 -& 﨩 # U+FA29 CJK COMPATIBILITY IDEOGRAPH-FA29 - = 﨩 -& 㒞 # U+349E CJK UNIFIED IDEOGRAPH-349E - = 㒞 -& 㒹 # U+34B9 CJK UNIFIED IDEOGRAPH-34B9 - = 㒹 -& 㒻 # U+34BB CJK UNIFIED IDEOGRAPH-34BB - = 㒻 -& 㓟 # U+34DF CJK UNIFIED IDEOGRAPH-34DF - = 㓟 -& 㔕 # U+3515 CJK UNIFIED IDEOGRAPH-3515 - = 㔕 -& 㛮 # U+36EE CJK UNIFIED IDEOGRAPH-36EE - = 㛮 -& 㛼 # U+36FC CJK UNIFIED IDEOGRAPH-36FC - = 㛼 -& 㞁 # U+3781 CJK UNIFIED IDEOGRAPH-3781 - = 㞁 -& ã ¯ # U+382F CJK UNIFIED IDEOGRAPH-382F - = ã ¯ -& ã¡¢ # U+3862 CJK UNIFIED IDEOGRAPH-3862 - = ã¡¢ -& 㡼 # U+387C CJK UNIFIED IDEOGRAPH-387C - = 㡼 -& 㣇 # U+38C7 CJK UNIFIED IDEOGRAPH-38C7 - = 㣇 -& 㣣 # U+38E3 CJK UNIFIED IDEOGRAPH-38E3 - = 㣣 -& 㤜 # U+391C CJK UNIFIED IDEOGRAPH-391C - = 㤜 -& 㤺 # U+393A CJK UNIFIED IDEOGRAPH-393A - = 㤺 -& 㨮 # U+3A2E CJK UNIFIED IDEOGRAPH-3A2E - = 㨮 -& 㩬 # U+3A6C CJK UNIFIED IDEOGRAPH-3A6C - = 㩬 -& 㫤 # U+3AE4 CJK UNIFIED IDEOGRAPH-3AE4 - = 㫤 -& 㬈 # U+3B08 CJK UNIFIED IDEOGRAPH-3B08 - = 㬈 -& 㬙 # U+3B19 CJK UNIFIED IDEOGRAPH-3B19 - = 㬙 -& 㭉 # U+3B49 CJK UNIFIED IDEOGRAPH-3B49 - = 㭉 -& 㮝 # U+3B9D CJK UNIFIED IDEOGRAPH-3B9D - = 㮝 -& 㰘 # U+3C18 CJK UNIFIED IDEOGRAPH-3C18 - = 㰘 -& 㱎 # U+3C4E CJK UNIFIED IDEOGRAPH-3C4E - = 㱎 -& ã´³ # U+3D33 CJK UNIFIED IDEOGRAPH-3D33 - = ã´³ -& 㶖 # U+3D96 CJK UNIFIED IDEOGRAPH-3D96 - = 㶖 -& 㺬 # U+3EAC CJK UNIFIED IDEOGRAPH-3EAC - = 㺬 -& 㺸 # U+3EB8 CJK UNIFIED IDEOGRAPH-3EB8 - = 㺸 - = 㺸 -& 㼛 # U+3F1B CJK UNIFIED IDEOGRAPH-3F1B - = 㼛 -& 㿼 # U+3FFC CJK UNIFIED IDEOGRAPH-3FFC - = 㿼 -& 䀈 # U+4008 CJK UNIFIED IDEOGRAPH-4008 - = 䀈 -& 䀹 # U+4039 CJK UNIFIED IDEOGRAPH-4039 - = 䀹 -& 䁆 # U+4046 CJK UNIFIED IDEOGRAPH-4046 - = 䁆 -& 䂖 # U+4096 CJK UNIFIED IDEOGRAPH-4096 - = 䂖 -& 䃣 # U+40E3 CJK UNIFIED IDEOGRAPH-40E3 - = 䃣 -& 䄯 # U+412F CJK UNIFIED IDEOGRAPH-412F - = 䄯 -& 䈂 # U+4202 CJK UNIFIED IDEOGRAPH-4202 - = 䈂 -& 䈧 # U+4227 CJK UNIFIED IDEOGRAPH-4227 - = 䈧 -& 䊠 # U+42A0 CJK UNIFIED IDEOGRAPH-42A0 - = 䊠 -& 䌁 # U+4301 CJK UNIFIED IDEOGRAPH-4301 - = 䌁 -& 䌴 # U+4334 CJK UNIFIED IDEOGRAPH-4334 - = 䌴 -& 䍙 # U+4359 CJK UNIFIED IDEOGRAPH-4359 - = 䍙 -& 䏕 # U+43D5 CJK UNIFIED IDEOGRAPH-43D5 - = 䏕 -& 䏙 # U+43D9 CJK UNIFIED IDEOGRAPH-43D9 - = 䏙 -& 䐋 # U+440B CJK UNIFIED IDEOGRAPH-440B - = 䐋 -& 䑫 # U+446B CJK UNIFIED IDEOGRAPH-446B - = 䑫 -& 䔫 # U+452B CJK UNIFIED IDEOGRAPH-452B - = 䔫 -& 䕝 # U+455D CJK UNIFIED IDEOGRAPH-455D - = 䕝 -& 䕡 # U+4561 CJK UNIFIED IDEOGRAPH-4561 - = 䕡 -& 䕫 # U+456B CJK UNIFIED IDEOGRAPH-456B - = 䕫 -& 䗗 # U+45D7 CJK UNIFIED IDEOGRAPH-45D7 - = 䗗 -& 䗹 # U+45F9 CJK UNIFIED IDEOGRAPH-45F9 - = 䗹 -& 䘵 # U+4635 CJK UNIFIED IDEOGRAPH-4635 - = 䘵 -& 䚾 # U+46BE CJK UNIFIED IDEOGRAPH-46BE - = 䚾 -& 䛇 # U+46C7 CJK UNIFIED IDEOGRAPH-46C7 - = 䛇 -& 䦕 # U+4995 CJK UNIFIED IDEOGRAPH-4995 - = 䦕 -& 䧦 # U+49E6 CJK UNIFIED IDEOGRAPH-49E6 - = 䧦 -& ä©® # U+4A6E CJK UNIFIED IDEOGRAPH-4A6E - = ä©® -& ä©¶ # U+4A76 CJK UNIFIED IDEOGRAPH-4A76 - = ä©¶ -& 䪲 # U+4AB2 CJK UNIFIED IDEOGRAPH-4AB2 - = 䪲 -& 䬳 # U+4B33 CJK UNIFIED IDEOGRAPH-4B33 - = 䬳 -& 䯎 # U+4BCE CJK UNIFIED IDEOGRAPH-4BCE - = 䯎 -& 䳎 # U+4CCE CJK UNIFIED IDEOGRAPH-4CCE - = 䳎 -& ä³­ # U+4CED CJK UNIFIED IDEOGRAPH-4CED - = ä³­ -& 䳸 # U+4CF8 CJK UNIFIED IDEOGRAPH-4CF8 - = 䳸 -& 䵖 # U+4D56 CJK UNIFIED IDEOGRAPH-4D56 - = 䵖 -& 𠄢 # U+20122 CJK UNIFIED IDEOGRAPH-20122 - = 𠄢 -& 𠔜 # U+2051C CJK UNIFIED IDEOGRAPH-2051C - = 𠔜 -& 𠔥 # U+20525 CJK UNIFIED IDEOGRAPH-20525 - = 𠔥 -& 𠕋 # U+2054B CJK UNIFIED IDEOGRAPH-2054B - = 𠕋 -& 𠘺 # U+2063A CJK UNIFIED IDEOGRAPH-2063A - = 𠘺 -& 𠠄 # U+20804 CJK UNIFIED IDEOGRAPH-20804 - = 𠠄 -& 𠣞 # U+208DE CJK UNIFIED IDEOGRAPH-208DE - = 𠣞 -& 𠨬 # U+20A2C CJK UNIFIED IDEOGRAPH-20A2C - = 𠨬 -& ð ­£ # U+20B63 CJK UNIFIED IDEOGRAPH-20B63 - = ð ­£ -& 𡓤 # U+214E4 CJK UNIFIED IDEOGRAPH-214E4 - = 𡓤 -& 𡚨 # U+216A8 CJK UNIFIED IDEOGRAPH-216A8 - = 𡚨 -& 𡛪 # U+216EA CJK UNIFIED IDEOGRAPH-216EA - = 𡛪 -& 𡧈 # U+219C8 CJK UNIFIED IDEOGRAPH-219C8 - = 𡧈 -& 𡬘 # U+21B18 CJK UNIFIED IDEOGRAPH-21B18 - = 𡬘 -& 𡴋 # U+21D0B CJK UNIFIED IDEOGRAPH-21D0B - = 𡴋 -& ð¡·¤ # U+21DE4 CJK UNIFIED IDEOGRAPH-21DE4 - = ð¡·¤ -& ð¡·¦ # U+21DE6 CJK UNIFIED IDEOGRAPH-21DE6 - = ð¡·¦ -& 𢆃 # U+22183 CJK UNIFIED IDEOGRAPH-22183 - = 𢆃 -& 𢆟 # U+2219F CJK UNIFIED IDEOGRAPH-2219F - = 𢆟 -& 𢌱 # U+22331 CJK UNIFIED IDEOGRAPH-22331 - = 𢌱 - = 𢌱 -& 𢛔 # U+226D4 CJK UNIFIED IDEOGRAPH-226D4 - = 𢛔 -& 𢬌 # U+22B0C CJK UNIFIED IDEOGRAPH-22B0C - = 𢬌 -& 𢯱 # U+22BF1 CJK UNIFIED IDEOGRAPH-22BF1 - = 𢯱 -& 𣀊 # U+2300A CJK UNIFIED IDEOGRAPH-2300A - = 𣀊 -& 𣊸 # U+232B8 CJK UNIFIED IDEOGRAPH-232B8 - = 𣊸 -& 𣍟 # U+2335F CJK UNIFIED IDEOGRAPH-2335F - = 𣍟 -& 𣎓 # U+23393 CJK UNIFIED IDEOGRAPH-23393 - = 𣎓 -& 𣎜 # U+2339C CJK UNIFIED IDEOGRAPH-2339C - = 𣎜 -& 𣏃 # U+233C3 CJK UNIFIED IDEOGRAPH-233C3 - = 𣏃 -& 𣑭 # U+2346D CJK UNIFIED IDEOGRAPH-2346D - = 𣑭 -& 𣚣 # U+236A3 CJK UNIFIED IDEOGRAPH-236A3 - = 𣚣 -& 𣢧 # U+238A7 CJK UNIFIED IDEOGRAPH-238A7 - = 𣢧 -& 𣪍 # U+23A8D CJK UNIFIED IDEOGRAPH-23A8D - = 𣪍 -& 𣫺 # U+23AFA CJK UNIFIED IDEOGRAPH-23AFA - = 𣫺 -& 𣲼 # U+23CBC CJK UNIFIED IDEOGRAPH-23CBC - = 𣲼 -& 𣴞 # U+23D1E CJK UNIFIED IDEOGRAPH-23D1E - = 𣴞 -& 𣻑 # U+23ED1 CJK UNIFIED IDEOGRAPH-23ED1 - = 𣻑 -& 𣽞 # U+23F5E CJK UNIFIED IDEOGRAPH-23F5E - = 𣽞 -& 𣾎 # U+23F8E CJK UNIFIED IDEOGRAPH-23F8E - = 𣾎 -& 𤉣 # U+24263 CJK UNIFIED IDEOGRAPH-24263 - = 𤉣 -& 𤎫 # U+243AB CJK UNIFIED IDEOGRAPH-243AB - = 𤎫 -& 𤘈 # U+24608 CJK UNIFIED IDEOGRAPH-24608 - = 𤘈 -& 𤜵 # U+24735 CJK UNIFIED IDEOGRAPH-24735 - = 𤜵 -& 𤠔 # U+24814 CJK UNIFIED IDEOGRAPH-24814 - = 𤠔 -& 𤰶 # U+24C36 CJK UNIFIED IDEOGRAPH-24C36 - = 𤰶 -& 𤲒 # U+24C92 CJK UNIFIED IDEOGRAPH-24C92 - = 𤲒 -& 𤾡 # U+24FA1 CJK UNIFIED IDEOGRAPH-24FA1 - = 𤾡 -& 𤾸 # U+24FB8 CJK UNIFIED IDEOGRAPH-24FB8 - = 𤾸 -& 𥁄 # U+25044 CJK UNIFIED IDEOGRAPH-25044 - = 𥁄 -& 𥃲 # U+250F2 CJK UNIFIED IDEOGRAPH-250F2 - = 𥃲 -& 𥃳 # U+250F3 CJK UNIFIED IDEOGRAPH-250F3 - = 𥃳 -& 𥄙 # U+25119 CJK UNIFIED IDEOGRAPH-25119 - = 𥄙 -& 𥄳 # U+25133 CJK UNIFIED IDEOGRAPH-25133 - = 𥄳 -& 𥐝 # U+2541D CJK UNIFIED IDEOGRAPH-2541D - = 𥐝 -& 𥘦 # U+25626 CJK UNIFIED IDEOGRAPH-25626 - = 𥘦 -& 𥚚 # U+2569A CJK UNIFIED IDEOGRAPH-2569A - = 𥚚 -& 𥛅 # U+256C5 CJK UNIFIED IDEOGRAPH-256C5 - = 𥛅 -& 𥥼 # U+2597C CJK UNIFIED IDEOGRAPH-2597C - = 𥥼 -& 𥪧 # U+25AA7 CJK UNIFIED IDEOGRAPH-25AA7 - = 𥪧 - = 𥪧 -& 𥮫 # U+25BAB CJK UNIFIED IDEOGRAPH-25BAB - = 𥮫 -& 𥲀 # U+25C80 CJK UNIFIED IDEOGRAPH-25C80 - = 𥲀 -& 𥾆 # U+25F86 CJK UNIFIED IDEOGRAPH-25F86 - = 𥾆 -& 𦇚 # U+261DA CJK UNIFIED IDEOGRAPH-261DA - = 𦇚 -& 𦈨 # U+26228 CJK UNIFIED IDEOGRAPH-26228 - = 𦈨 -& 𦉇 # U+26247 CJK UNIFIED IDEOGRAPH-26247 - = 𦉇 -& 𦋙 # U+262D9 CJK UNIFIED IDEOGRAPH-262D9 - = 𦋙 -& 𦌾 # U+2633E CJK UNIFIED IDEOGRAPH-2633E - = 𦌾 -& 𦓚 # U+264DA CJK UNIFIED IDEOGRAPH-264DA - = 𦓚 -& 𦔣 # U+26523 CJK UNIFIED IDEOGRAPH-26523 - = 𦔣 -& 𦖨 # U+265A8 CJK UNIFIED IDEOGRAPH-265A8 - = 𦖨 -& 𦞧 # U+267A7 CJK UNIFIED IDEOGRAPH-267A7 - = 𦞧 -& 𦞵 # U+267B5 CJK UNIFIED IDEOGRAPH-267B5 - = 𦞵 -& 𦬼 # U+26B3C CJK UNIFIED IDEOGRAPH-26B3C - = 𦬼 -& 𦰶 # U+26C36 CJK UNIFIED IDEOGRAPH-26C36 - = 𦰶 -& 𦳕 # U+26CD5 CJK UNIFIED IDEOGRAPH-26CD5 - = 𦳕 -& 𦵫 # U+26D6B CJK UNIFIED IDEOGRAPH-26D6B - = 𦵫 -& 𦼬 # U+26F2C CJK UNIFIED IDEOGRAPH-26F2C - = 𦼬 -& 𦾱 # U+26FB1 CJK UNIFIED IDEOGRAPH-26FB1 - = 𦾱 -& 𧃒 # U+270D2 CJK UNIFIED IDEOGRAPH-270D2 - = 𧃒 -& 𧏊 # U+273CA CJK UNIFIED IDEOGRAPH-273CA - = 𧏊 -& 𧙧 # U+27667 CJK UNIFIED IDEOGRAPH-27667 - = 𧙧 -& ð§¢® # U+278AE CJK UNIFIED IDEOGRAPH-278AE - = ð§¢® -& 𧥦 # U+27966 CJK UNIFIED IDEOGRAPH-27966 - = 𧥦 -& 𧲨 # U+27CA8 CJK UNIFIED IDEOGRAPH-27CA8 - = 𧲨 -& 𧼯 # U+27F2F CJK UNIFIED IDEOGRAPH-27F2F - = 𧼯 -& 𨗒 # U+285D2 CJK UNIFIED IDEOGRAPH-285D2 - = 𨗒 -& 𨗭 # U+285ED CJK UNIFIED IDEOGRAPH-285ED - = 𨗭 -& 𨜮 # U+2872E CJK UNIFIED IDEOGRAPH-2872E - = 𨜮 -& 𨯺 # U+28BFA CJK UNIFIED IDEOGRAPH-28BFA - = 𨯺 -& 𨵷 # U+28D77 CJK UNIFIED IDEOGRAPH-28D77 - = 𨵷 -& 𩅅 # U+29145 CJK UNIFIED IDEOGRAPH-29145 - = 𩅅 -& 𩇟 # U+291DF CJK UNIFIED IDEOGRAPH-291DF - = 𩇟 -& 𩈚 # U+2921A CJK UNIFIED IDEOGRAPH-2921A - = 𩈚 -& 𩐊 # U+2940A CJK UNIFIED IDEOGRAPH-2940A - = 𩐊 -& 𩒖 # U+29496 CJK UNIFIED IDEOGRAPH-29496 - = 𩒖 -& 𩖶 # U+295B6 CJK UNIFIED IDEOGRAPH-295B6 - = 𩖶 -& 𩬰 # U+29B30 CJK UNIFIED IDEOGRAPH-29B30 - = 𩬰 -& 𪃎 # U+2A0CE CJK UNIFIED IDEOGRAPH-2A0CE - = 𪃎 -& 𪄅 # U+2A105 CJK UNIFIED IDEOGRAPH-2A105 - = 𪄅 -& 𪈎 # U+2A20E CJK UNIFIED IDEOGRAPH-2A20E - = 𪈎 -& 𪊑 # U+2A291 CJK UNIFIED IDEOGRAPH-2A291 - = 𪊑 -& 𪎒 # U+2A392 CJK UNIFIED IDEOGRAPH-2A392 - = 𪎒 -& 𪘀 # U+2A600 CJK UNIFIED IDEOGRAPH-2A600 - = 𪘀 +# UCA Rules +# This file contains the UCA tables for the given version, but transformed into rule syntax. +# Generated: 2004-01-14,16:57:44 GMT [MD] +# NOTE: Since UCA handles canonical equivalents, no composites are necessary +# (except in extensions). +# For syntax description, see: http://oss.software.ibm.com/icu/userguide/Collate_Intro.html +# VERSION: UCA=4.0.0, UCD=4.0.0 +& [last tertiary ignorable] + + = '' + = '' + = '' + = '' + = '' + = '' + = '' + = '' + = '' + = '' + = '' + = '' + = '' + = '' + = '' + = '' + = '' + = '' + = '' + = '' + = '' + = '' + = '' + = '' + = '' + = '' + = '' + = '€' + = '' + = '‚' + = 'ƒ' + = '„' + = '†' + = '‡' + = 'ˆ' + = '‰' + = 'Š' + = '‹' + = 'Œ' + = '' + = 'Ž' + = '' + = '' + = '‘' + = '’' + = '“' + = '”' + = '•' + = '–' + = '—' + = '˜' + = '™' + = 'š' + = '›' + = 'œ' + = '' + = 'ž' + = 'Ÿ' + = ͏ + = ҈ + = ҉ + = ֑ + = ֒ + = ֓ + = ֔ + = ֕ + = ֖ + = ֗ + = ֘ + = ֙ + = ֚ + = ֛ + = ֜ + = ֝ + = ֞ + = ֟ + = Ö  + = Ö¡ + = Ö£ + = Ö¤ + = Ö¥ + = Ö¦ + = Ö§ + = Ö¨ + = Ö© + = Öª + = Ö« + = Ö¬ + = Ö­ + = Ö® + = Ö¯ + = Ö½ + = ׄ + = '؀' + = '؁' + = '؂' + = '؃' + = ؐ + = ؑ + = ؒ + = ؓ + = ؔ + = ؕ + = ۖ + = ۗ + = ۘ + = ۙ + = ۚ + = ۛ + = ۜ + = '۝' + = ۞ + = ۟ + = Û  + = Û¡ + = Û¢ + = Û£ + = Û¤ + = Û§ + = Û¨ + = Ûª + = Û« + = Û¬ + = Û­ + = '܏' + = ๎ + = ༘ + = ༙ + = ༵ + = ༷ + = ྂ + = ྃ + = ྆ + = ྇ + = ࿆ + = ᠋ + = ᠌ + = ᠍ + = '᠎' + = '​' + = '‌' + = '‍' + = '‎' + = '‏' + = '‪' + = '‫' + = '‬' + = '‭' + = '‮' + = '⁠' + = '⁡' + = '⁢' + = '⁣' + = '' + = '' + = '' + = '' + = '' + = '' + = ︀ + = ︁ + = ︂ + = ︃ + = ︄ + = ︅ + = ︆ + = ︇ + = ︈ + = ︉ + = ︊ + = ︋ + = ︌ + = ︍ + = ︎ + = ️ + = ︡ + = ︣ + = ï¹³ + = '' + = '' + = '' + = 'ï¿»' + = 𝅥 + = 𝅦 + = 𝅧 + = 𝅨 + = 𝅩 + = 𝅭 + = 𝅮 + = 𝅯 + = 𝅰 + = 𝅱 + = 𝅲 + = '𝅳' + = '𝅴' + = '𝅵' + = '𝅶' + = '𝅷' + = '𝅸' + = '𝅹' + = '𝅺' + = 𝅻 + = 𝅼 + = 𝅽 + = 𝅾 + = 𝅿 + = 𝆀 + = 𝆁 + = 𝆂 + = 𝆅 + = 𝆆 + = 𝆇 + = 𝆈 + = 𝆉 + = 𝆊 + = 𝆋 + = 𝆪 + = 𝆫 + = 𝆬 + = 𝆭 + = '󠀁' + = '󠀠' + = '󠀡' + = '󠀢' + = '󠀣' + = '󠀤' + = '󠀥' + = '󠀦' + = '󠀧' + = '󠀨' + = '󠀩' + = '󠀪' + = '󠀫' + = '󠀬' + = '󠀭' + = '󠀮' + = '󠀯' + = '󠀰' + = '󠀱' + = '󠀲' + = '󠀳' + = '󠀴' + = '󠀵' + = '󠀶' + = '󠀷' + = '󠀸' + = '󠀹' + = '󠀺' + = '󠀻' + = '󠀼' + = '󠀽' + = '󠀾' + = '󠀿' + = '󠁀' + = '󠁁' + = '󠁂' + = '󠁃' + = '󠁄' + = '󠁅' + = '󠁆' + = '󠁇' + = '󠁈' + = '󠁉' + = '󠁊' + = '󠁋' + = '󠁌' + = '󠁍' + = '󠁎' + = '󠁏' + = '󠁐' + = '󠁑' + = '󠁒' + = '󠁓' + = '󠁔' + = '󠁕' + = '󠁖' + = '󠁗' + = '󠁘' + = '󠁙' + = '󠁚' + = '󠁛' + = '󠁜' + = '󠁝' + = '󠁞' + = '󠁟' + = '󠁠' + = '󠁡' + = '󠁢' + = '󠁣' + = '󠁤' + = '󠁥' + = '󠁦' + = '󠁧' + = '󠁨' + = '󠁩' + = '󠁪' + = '󠁫' + = '󠁬' + = '󠁭' + = '󠁮' + = '󠁯' + = '󠁰' + = '󠁱' + = '󠁲' + = '󠁳' + = '󠁴' + = '󠁵' + = '󠁶' + = '󠁷' + = '󠁸' + = '󠁹' + = '󠁺' + = '󠁻' + = '󠁼' + = '󠁽' + = '󠁾' + = '󠁿' + = 󠄀 + = 󠄁 + = 󠄂 + = 󠄃 + = 󠄄 + = 󠄅 + = 󠄆 + = 󠄇 + = 󠄈 + = 󠄉 + = 󠄊 + = 󠄋 + = 󠄌 + = 󠄍 + = 󠄎 + = 󠄏 + = 󠄐 + = 󠄑 + = 󠄒 + = 󠄓 + = 󠄔 + = 󠄕 + = 󠄖 + = 󠄗 + = 󠄘 + = 󠄙 + = 󠄚 + = 󠄛 + = 󠄜 + = 󠄝 + = 󠄞 + = 󠄟 + = 󠄠 + = 󠄡 + = 󠄢 + = 󠄣 + = 󠄤 + = 󠄥 + = 󠄦 + = 󠄧 + = 󠄨 + = 󠄩 + = 󠄪 + = 󠄫 + = 󠄬 + = 󠄭 + = 󠄮 + = 󠄯 + = 󠄰 + = 󠄱 + = 󠄲 + = 󠄳 + = 󠄴 + = 󠄵 + = 󠄶 + = 󠄷 + = 󠄸 + = 󠄹 + = 󠄺 + = 󠄻 + = 󠄼 + = 󠄽 + = 󠄾 + = 󠄿 + = 󠅀 + = 󠅁 + = 󠅂 + = 󠅃 + = 󠅄 + = 󠅅 + = 󠅆 + = 󠅇 + = 󠅈 + = 󠅉 + = 󠅊 + = 󠅋 + = 󠅌 + = 󠅍 + = 󠅎 + = 󠅏 + = 󠅐 + = 󠅑 + = 󠅒 + = 󠅓 + = 󠅔 + = 󠅕 + = 󠅖 + = 󠅗 + = 󠅘 + = 󠅙 + = 󠅚 + = 󠅛 + = 󠅜 + = 󠅝 + = 󠅞 + = 󠅟 + = 󠅠 + = 󠅡 + = 󠅢 + = 󠅣 + = 󠅤 + = 󠅥 + = 󠅦 + = 󠅧 + = 󠅨 + = 󠅩 + = 󠅪 + = 󠅫 + = 󠅬 + = 󠅭 + = 󠅮 + = 󠅯 + = 󠅰 + = 󠅱 + = 󠅲 + = 󠅳 + = 󠅴 + = 󠅵 + = 󠅶 + = 󠅷 + = 󠅸 + = 󠅹 + = 󠅺 + = 󠅻 + = 󠅼 + = 󠅽 + = 󠅾 + = 󠅿 + = 󠆀 + = 󠆁 + = 󠆂 + = 󠆃 + = 󠆄 + = 󠆅 + = 󠆆 + = 󠆇 + = 󠆈 + = 󠆉 + = 󠆊 + = 󠆋 + = 󠆌 + = 󠆍 + = 󠆎 + = 󠆏 + = 󠆐 + = 󠆑 + = 󠆒 + = 󠆓 + = 󠆔 + = 󠆕 + = 󠆖 + = 󠆗 + = 󠆘 + = 󠆙 + = 󠆚 + = 󠆛 + = 󠆜 + = 󠆝 + = 󠆞 + = 󠆟 + = 󠆠 + = 󠆡 + = 󠆢 + = 󠆣 + = 󠆤 + = 󠆥 + = 󠆦 + = 󠆧 + = 󠆨 + = 󠆩 + = 󠆪 + = 󠆫 + = 󠆬 + = 󠆭 + = 󠆮 + = 󠆯 + = 󠆰 + = 󠆱 + = 󠆲 + = 󠆳 + = 󠆴 + = 󠆵 + = 󠆶 + = 󠆷 + = 󠆸 + = 󠆹 + = 󠆺 + = 󠆻 + = 󠆼 + = 󠆽 + = 󠆾 + = 󠆿 + = 󠇀 + = 󠇁 + = 󠇂 + = 󠇃 + = 󠇄 + = 󠇅 + = 󠇆 + = 󠇇 + = 󠇈 + = 󠇉 + = 󠇊 + = 󠇋 + = 󠇌 + = 󠇍 + = 󠇎 + = 󠇏 + = 󠇐 + = 󠇑 + = 󠇒 + = 󠇓 + = 󠇔 + = 󠇕 + = 󠇖 + = 󠇗 + = 󠇘 + = 󠇙 + = 󠇚 + = 󠇛 + = 󠇜 + = 󠇝 + = 󠇞 + = 󠇟 + = 󠇠 + = 󠇡 + = 󠇢 + = 󠇣 + = 󠇤 + = 󠇥 + = 󠇦 + = 󠇧 + = 󠇨 + = 󠇩 + = 󠇪 + = 󠇫 + = 󠇬 + = 󠇭 + = 󠇮 + = 󠇯 +& [last primary ignorable] + << ̲ + << ̓ + << ̔ + << ́ + << ̀ + << ̆ + << ̂ + << ̌ + << ̊ + << ͂ + << ̈ + << ̋ + << ̃ + << ̇ + << ̸ + << ̧ + << ̨ + << ̄ + << ̅ + << ̉ + << ̍ + << ̎ + << ̏ + << ̐ + << ̑ + << ̒ + << ̕ + << ̖ + << ̗ + << ̘ + << ̙ + << ̚ + << ̛ + << ̜ + << ̝ + << ̞ + << ̟ + << Ì  + << Ì¡ + << Ì¢ + << Ì£ + << ̤ + << Ì¥ + << ̦ + << Ì© + << ̪ + << Ì« + << ̬ + << Ì­ + << Ì® + << ̯ + << ̰ + << ̱ + << ̳ + << Ì´ + << ̵ + << ̶ + << Ì· + << ̹ + << ̺ + << Ì» + << ̼ + << ̽ + << ̾ + << Ì¿ + << ͅ + << ͆ + << ͇ + << ͈ + << ͉ + << ͊ + << ͋ + << ͌ + << ͍ + << ͎ + << ͐ + << ͑ + << ͒ + << ͓ + << ͔ + << ͕ + << ͖ + << ͗ + << ͝ + << ͞ + << ͟ + << Í  + = ︢ + << Í¡ + = ︠ + << Í¢ + << ҃ + << ҄ + << ҅ + << ҆ + << Ö° + << Ö± + << Ö² + << Ö³ + << Ö´ + << Öµ + << Ö¶ + << Ö· + << Ö¸ + << Ö¹ + << Ö» + << ׂ + << ׁ + << Ö¼ + << Ö¿ + << ﬞ + << ً + <<< ï¹± + <<< ï¹° + << ٌ + <<< ï¹² + << ٍ + <<< ï¹´ + << َ + <<< ï¹· + <<< ï¹¶ + << ُ + <<< ï¹¹ + <<< ﹸ + << ِ + <<< ï¹» + <<< ﹺ + << ّ + <<< ï³² + = ï³³ + = ï³´ + = ï¹½ + <<< ﱞ + = ﱟ + = ï±  + = ﱡ + = ï±¢ + = ï¹¼ + <<< ï±£ / Ù° + << ْ + <<< ﹿ + <<< ï¹¾ + << ٓ + << ٔ + << ٕ + << ٖ + << ٗ + << ٘ + << Ù° + << ܑ + << ܰ + << ܱ + << ܲ + << ܳ + << Ü´ + << ܵ + << ܶ + << Ü· + << ܸ + << ܹ + << ܺ + << Ü» + << ܼ + << ܽ + << ܾ + << Ü¿ + << ݀ + << ݁ + << ݂ + << ݃ + << ݄ + << ݅ + << ݆ + << ݇ + << ݈ + << ݉ + << ݊ + << ़ + << ँ + << ं + << ः + << ॑ + << ॒ + << ॓ + << ॔ + << ় + << ঁ + << ং + << ঃ + << ਼ + << ਁ + << ਂ + << ਃ + << à©° + << ੱ + << ઼ + << ઁ + << ં + << ઃ + << ଼ + << ଁ + << ଂ + << ଃ + << ஂ + << ఁ + << ం + << ః + << ಼ + << ಂ + << ಃ + << ം + << ഃ + << ං + << ඃ + << ็ + << ่ + << ้ + << ๊ + << ๋ + << ່ + << ້ + << ໊ + << ໋ + << ༹ + << ཾ + << ཿ + << ံ + << ့ + << း + << ំ + << ះ + << ៈ + << ៉ + << ៊ + << ់ + << ៌ + << ៍ + << ៎ + << ៏ + << ័ + << ៑ + << ៓ + << ៝ + << ᤹ + << ᤺ + << ᤻ + << 〪 + << 〫 + << 〬 + << 〭 + << 〮 + << 〯 + << ゙ + <<< ゙ + << ゚ + <<< ゚ + << ⃐ + << ⃑ + << ⃒ + << ⃓ + << ⃔ + << ⃕ + << ⃖ + << ⃗ + << ⃘ + << ⃙ + << ⃚ + << ⃛ + << ⃜ + << ⃝ + << ⃞ + << ⃟ + << ⃠ + << ⃡ + << ⃢ + << ⃣ + << ⃤ + << ⃥ + << ⃦ + << ⃧ + << ⃨ + << ⃩ + << ⃪ +& [last regular] + < ' ' + < ' +' + < ' ' + < ' ' + < ' +' + < '…' + < ' +' + < '
' + < ' ' + <<< ' ' + <<< ' ' + = ' ' + = ' ' + = ' ' + = ' ' + = ' ' + = ' ' + = ' ' + = ' ' + <<< ' ' + = ' ' + = ' ' + < ' ' + < ـ + < '`' + <<< ` + < ´ + = ΄ + < ˜ + < '^' + <<< ï¼¾ + < ¯ + <<< ï¿£ + < ‾ + <<< ﹉ + = ﹊ + = ﹋ + = ﹌ + < ˘ + < ˙ + < ¨ + < ˚ + < ˝ + < á¾½ + = ᾿ + < ῾ + < ¸ + < ˛ + < '_' + <<< _ + <<< ﹍ + = ﹎ + = ﹏ + <<< ︳ + = ︴ + < ‗ + < ῀ + < ゛ + < ゜ + < '­' + < '-' + <<< - + <<< ï¹£ + < ֊ + < ᠆ + < ᠇ + < ‐ + <<< ‑ + < ‒ + < – + <<< ︲ + < — + <<< ﹘ + <<< ︱ + < ― + < ⁓ + < 〜 + < 〰 + < ゠ + < ・ + <<< ï½¥ + < ',' + <<< , + <<< ﹐ + < ՝ + < ، + < ؍ + < Ù« + < Ù¬ + < ᠂ + < ᠈ + < 、 + <<< ﹑ + <<< 、 + < ﹅ + < ﹆ + < ';' + <<< ; + <<< ﹔ + < ؛ + < ⁏ + < ':' + <<< : + <<< â©´ / ':=' + <<< ﹕ + < ։ + < ܃ + < ܄ + < ܅ + < ܆ + < ܇ + < ܈ + < ፡ + < ፣ + < ፤ + < ፥ + < ፦ + < ᠄ + < ᠅ + < ༔ + < ៖ + < ᛫ + < ᛬ + < ᛭ + < '!' + <<< ! + <<< ‼ / '!' + <<< ⁉ / '?' + <<< ﹗ + < ¡ + < ՜ + < ᥄ + < '?' + <<< ? + <<< ⁈ / '!' + <<< ⁇ / '?' + <<< ﹖ + < ¿ + < ՞ + < ؟ + < ܉ + < ፧ + < ᥅ + < ‽ + < '.' + <<< . + <<< ․ + <<< ‥ / '.' + <<< … / '..' + <<< ﹒ + <<< ︰ / '.' + < ᠁ + < ۔ + < ܁ + < ܂ + < ። + < ᠃ + < ᠉ + < ᙮ + < 。 + <<< 。 + < · + < । + < ॥ + < ᜵ + < ᜶ + < ၊ + < ။ + < ។ + < ៕ + < ܀ + < ჻ + < ፨ + < 𐄀 + < 𐄁 + < 𐄂 + < 𐎟 + < '' + <<< ' + < ‘ + < ’ + < ‚ + < ‛ + < ‹ + < › + < '"' + <<< " + < “ + < ” + < „ + < ‟ + < 〝 + < 〞 + < 〟 + < « + < » + < '(' + <<< ( + <<< ⑴ / 1')' + <<< ⑽ / 10')' + <<< ⑾ / 11')' + <<< ⑿ / 12')' + <<< ⒀ / 13')' + <<< ⒁ / 14')' + <<< ⒂ / 15')' + <<< ⒃ / 16')' + <<< ⒄ / 17')' + <<< ⒅ / 18')' + <<< ⒆ / 19')' + <<< ⑵ / 2')' + <<< ⒇ / 20')' + <<< ⑶ / 3')' + <<< ⑷ / 4')' + <<< ⑸ / 5')' + <<< ⑹ / 6')' + <<< ⑺ / 7')' + <<< ⑻ / 8')' + <<< ⑼ / 9')' + <<< ⒜ / a')' + <<< ⒝ / b')' + <<< ⒞ / c')' + <<< ⒟ / d')' + <<< ⒠ / e')' + <<< ⒡ / f')' + <<< ⒢ / g')' + <<< ⒣ / h')' + <<< ⒤ / i')' + <<< ⒥ / j')' + <<< ⒦ / k')' + <<< ⒧ / l')' + <<< ⒨ / m')' + <<< ⒩ / n')' + <<< ⒪ / o')' + <<< ⒫ / p')' + <<< ⒬ / q')' + <<< ⒭ / r')' + <<< ⒮ / s')' + <<< ⒯ / t')' + <<< ⒰ / u')' + <<< ⒱ / v')' + <<< ⒲ / w')' + <<< ⒳ / x')' + <<< ⒴ / y')' + <<< ⒵ / z')' + <<< ㈀ / ᄀ')' + <<< ㈎ / 가')' + <<< ㈁ / ᄂ')' + <<< ㈏ / 나')' + <<< ㈂ / ᄃ')' + <<< ㈐ / 다')' + <<< ㈃ / ᄅ')' + <<< ㈑ / 라')' + <<< ㈄ / ᄆ')' + <<< ㈒ / 마')' + <<< ㈅ / ᄇ')' + <<< ㈓ / 바')' + <<< ㈆ / ᄉ')' + <<< ㈔ / 사')' + <<< ㈇ / ᄋ')' + <<< ㈕ / 아')' + <<< ㈝ / 오전')' + <<< ㈞ / 오후')' + <<< ㈈ / ᄌ')' + <<< ㈖ / 자')' + <<< ㈜ / 주')' + <<< ㈉ / ᄎ')' + <<< ㈗ / ì°¨')' + <<< ㈊ / ᄏ')' + <<< ㈘ / ì¹´')' + <<< ㈋ / ᄐ')' + <<< ㈙ / 타')' + <<< ㈌ / ᄑ')' + <<< ㈚ / 파')' + <<< ㈍ / ᄒ')' + <<< ㈛ / 하')' + <<< ㈠ / 一')' + <<< ㈦ / 七')' + <<< ㈢ / 三')' + <<< ㈨ / 九')' + <<< ㈡ / 二')' + <<< ㈤ / 五')' + <<< ㈹ / 代')' + <<< ㈽ / 企')' + <<< ㉁ / 休')' + <<< ㈧ / 八')' + <<< ㈥ / 六')' + <<< ㈸ / 労')' + <<< ㈩ / 十')' + <<< ㈿ / 協')' + <<< ㈴ / 名')' + <<< ㈺ / 呼')' + <<< ㈣ / 四')' + <<< ㈯ / 土')' + <<< ㈻ / å­¦')' + <<< ㈰ / 日')' + <<< ㈪ / 月')' + <<< ㈲ / 有')' + <<< ㈭ / 木')' + <<< ㈱ / æ ª')' + <<< ㈬ / æ°´')' + <<< ㈫ / 火')' + <<< ㈵ / 特')' + <<< ㈼ / 監')' + <<< ㈳ / 社')' + <<< ㈷ / 祝')' + <<< ㉀ / 祭')' + <<< ㉂ / 自')' + <<< ㉃ / 至')' + <<< ㈶ / 財')' + <<< ㈾ / 資')' + <<< ㈮ / 金')' + <<< ﹙ + <<< ⁽ + <<< ₍ + <<< ︵ + < ')' + <<< ) + <<< ﹚ + <<< ⁾ + <<< ₎ + <<< ︶ + < '[' + <<< ï¼» + <<< ﹇ + < ']' + <<< ï¼½ + <<< ﹈ + < '{' + <<< { + <<< ﹛ + <<< ︷ + < '}' + <<< } + <<< ﹜ + <<< ︸ + < ༺ + < ༻ + < ༼ + < ༽ + < ᚛ + < ᚜ + < ⁅ + < ⁆ + < â§¼ + < â§½ + < ⦃ + < ⦄ + < ⦅ + <<< ⦅ + < ⦆ + <<< ï½  + < ⦇ + < ⦈ + < ⦉ + < ⦊ + < ⦋ + < ⦌ + < ⦍ + < ⦎ + < ⦏ + < ⦐ + < ⦑ + < ⦒ + < ⦓ + < ⦔ + < ⦕ + < ⦖ + < ⦗ + < ⦘ + < 〈 + <<< ︿ + < 〉 + <<< ﹀ + < 《 + <<< ︽ + < 》 + <<< ︾ + < 「 + <<< ï½¢ + <<< ﹁ + < 」 + <<< ï½£ + <<< ﹂ + < 『 + <<< ﹃ + < 』 + <<< ﹄ + < 【 + <<< ︻ + < 】 + <<< ︼ + < 〔 + <<< ﹝ + <<< ︹ + < 〕 + <<< ﹞ + <<< ︺ + < 〖 + < 〗 + < 〘 + < 〙 + < 〚 + < 〛 + < ï´¾ + < ï´¿ + < § + < ¶ + < ⁋ + < © + < ® + < '@' + <<< ï¼  + <<< ﹫ + < '*' + <<< * + <<< ﹡ + < ⁎ + < ⁑ + < Ù­ + < '/' + <<< / + < ⁄ + < '\' + <<< ï¼¼ + <<< ﹨ + < '&' + <<< & + <<< ï¹  + < ⅋ + < ⁊ + < '#' + <<< # + <<< ﹟ + < '%' + <<< % + <<< ﹪ + < Ùª + < ‰ + < ‱ + < ⁒ + < † + < ‡ + < • + < ‣ + < ‧ + < ⁃ + < ⁌ + < ⁍ + < ′ + <<< ″ / ′ + <<< ‴ / ′′ + <<< ⁗ / ′′′ + < ‵ + <<< ‶ / ‵ + <<< ‷ / ‵‵ + < 〃 + < 〽 + < ‸ + < ※ + < ‿ + < ⁔ + < ⁀ + < ⁐ + < ⁁ + < ⁂ + < ՚ + < ՛ + < ՟ + < Ö¾ + < ׀ + < ׃ + < ׳ + < ×´ + < ܊ + < ܋ + < ܌ + < ܍ + < ᠀ + < ᠊ + < ॰ + < à·´ + < ๚ + < ๛ + < ༄ + < ༅ + < ༆ + < ༇ + < ༈ + < ༉ + < ༊ + < ་ + <<< ༌ + < ། + < ༎ + < ༏ + < ༐ + < ༑ + < ༒ + < ྅ + < ᥀ + < ၌ + < ၍ + < ၎ + < ၏ + < ៗ + < ៘ + < ៙ + < ៚ + < ᙭ + < ʹ + < ͵ + < ʺ + < ˂ + < ˃ + < ˄ + < ˅ + < ˆ + < ˇ + < ˈ + < ˉ + < ˊ + < ˋ + < ˌ + < ˍ + < ˎ + < ˏ + < ˒ + < ˓ + < ˔ + < ˕ + < ˖ + < ˗ + < ˞ + < ˟ + < Ë¥ + < ˦ + < ˧ + < ˨ + < Ë© + < ˪ + < Ë« + < ˬ + < Ë­ + < ˯ + < ˰ + < ˱ + < ˲ + < ˳ + < Ë´ + < ˵ + < ˶ + < Ë· + < ˸ + < ˹ + < ˺ + < Ë» + < ˼ + < ˽ + < ˾ + < Ë¿ + < ° + <<< ℃ / C + <<< ℉ / F + < ҂ + < ؎ + < ؏ + < Û© + < ï·½ + < ৺ + < à­° + < ௳ + < ௴ + < ௵ + < ௶ + < ௷ + < ௸ + < ௺ + < ๏ + < ༁ + < ༂ + < ༃ + < ༓ + < ༕ + < ༖ + < ༗ + < ༚ + < ༛ + < ༜ + < ༝ + < ༞ + < ༟ + < ༴ + < ༶ + < ༸ + < ༾ + < ༿ + < ྾ + < ྿ + < ࿀ + < ࿁ + < ࿂ + < ࿃ + < ࿄ + < ࿅ + < ࿇ + < ࿈ + < ࿉ + < ࿊ + < ࿋ + < ࿌ + < ࿏ + < á§  + < á§¡ + < á§¢ + < á§£ + < ᧤ + < á§¥ + < ᧦ + < á§§ + < ᧨ + < á§© + < ᧪ + < á§« + < ᧬ + < á§­ + < á§® + < ᧯ + < á§° + < á§± + < á§² + < á§³ + < á§´ + < á§µ + < á§¶ + < á§· + < ᧸ + < á§¹ + < ᧺ + < á§» + < á§¼ + < á§½ + < á§¾ + < á§¿ + < ℄ + < ℈ + < ℔ + < ℗ + < ℘ + < ℞ + < ℟ + < ℣ + < ℥ + < ℧ + < ℩ + < ℮ + < Ⅎ + < ℺ + < ⅁ + < ⅂ + < ⅃ + < ⅄ + < ⅊ + < ← + <<< ï¿© + < → + <<< ï¿« + < ↑ + <<< ↑ + < ↓ + <<< ↓ + < ↔ + < ↕ + < ↖ + < ↗ + < ↘ + < ↙ + < ↜ + < ↝ + < ↞ + < ↟ + < ↠ + < ↡ + < ↢ + < ↣ + < ↤ + < ↥ + < ↦ + < ↧ + < ↨ + < ↩ + < ↪ + < ↫ + < ↬ + < ↭ + < ↯ + < ↰ + < ↱ + < ↲ + < ↳ + < ↴ + < ↵ + < ↶ + < ↷ + < ↸ + < ↹ + < ↺ + < ↻ + < ↼ + < ↽ + < ↾ + < ↿ + < ⇀ + < ⇁ + < ⇂ + < ⇃ + < ⇄ + < ⇅ + < ⇆ + < ⇇ + < ⇈ + < ⇉ + < ⇊ + < ⇋ + < ⇌ + < ⇐ + < ⇑ + < ⇒ + < ⇓ + < ⇔ + < ⇕ + < ⇖ + < ⇗ + < ⇘ + < ⇙ + < ⇚ + < ⇛ + < ⇜ + < ⇝ + < ⇞ + < ⇟ + < ⇠ + < ⇡ + < ⇢ + < ⇣ + < ⇤ + < ⇥ + < ⇦ + < ⇧ + < ⇨ + < ⇩ + < ⇪ + < ⇫ + < ⇬ + < ⇭ + < ⇮ + < ⇯ + < ⇰ + < ⇱ + < ⇲ + < ⇳ + < ⇴ + < ⇵ + < ⇶ + < ⇷ + < ⇸ + < ⇹ + < ⇺ + < ⇻ + < ⇼ + < ⇽ + < ⇾ + < ⇿ + < ∀ + < ∁ + < ∂ + <<< 𝛛 + = 𝜕 + = 𝝏 + = 𝞉 + = 𝟃 + < ∃ + < ∅ + < ∆ + < ∇ + <<< 𝛁 + = 𝛻 + = 𝜵 + = 𝝯 + = 𝞩 + < ∈ + < ∊ + < ∋ + < ∍ + < ϶ + < ∎ + < ∏ + < ∐ + < ∑ + <<< ⅀ + < '+' + <<< + + <<< ﬩ + <<< ï¹¢ + <<< ⁺ + <<< ₊ + < ± + < ÷ + < × + < '<' + <<< < + <<< ﹤ + < '=' + <<< = + <<< ⩵ / '=' + <<< â©¶ / '==' + <<< ﹦ + <<< ⁼ + <<< ₌ + < '>' + <<< > + <<< ï¹¥ + < ¬ + <<< ï¿¢ + < '|' + <<< | + < ¦ + <<< ¦ + < ‖ + < '~' + <<< ~ + < − + <<< ⁻ + <<< ₋ + < ∓ + < ∔ + < ∕ + < ∖ + < ∗ + < ∘ + < ∙ + < √ + < ∛ + < ∜ + < ∝ + < ∞ + < ∟ + < ∠ + < ∡ + < ∢ + < ∣ + < ∥ + < ∧ + < ∨ + < ∩ + < ∪ + < ∫ + <<< ∬ / ∫ + <<< ∭ / ∫∫ + <<< ⨌ / ∫∫∫ + < ∮ + <<< ∯ / ∮ + <<< ∰ / ∮∮ + < ∱ + < ∲ + < ∳ + < ∴ + < ∵ + < ∶ + < ∷ + < ∸ + < ∹ + < ∺ + < ∻ + < ∼ + < ∽ + < ∾ + < ∿ + < ≀ + < ≂ + < ≃ + < ≅ + < ≆ + < ≈ + < ≊ + < ≋ + < ≌ + < ≍ + < ≎ + < ≏ + < ≐ + < ≑ + < ≒ + < ≓ + < ≔ + < ≕ + < ≖ + < ≗ + < ≘ + < ≙ + < ≚ + < ≛ + < ≜ + < ≝ + < ≞ + < ≟ + < ≡ + < ≣ + < ≤ + < ≥ + < ≦ + < ≧ + < ≨ + < ≩ + < ≪ + < ≫ + < ≬ + < ≲ + < ≳ + < ≶ + < ≷ + < ≺ + < ≻ + < ≼ + < ≽ + < ≾ + < ≿ + < ⊂ + < ⊃ + < ⊆ + < ⊇ + < ⊊ + < ⊋ + < ⊌ + < ⊍ + < ⊎ + < ⊏ + < ⊐ + < ⊑ + < ⊒ + < ⊓ + < ⊔ + < ⊕ + < ⊖ + < ⊗ + < ⊘ + < ⊙ + < ⊚ + < ⊛ + < ⊜ + < ⊝ + < ⊞ + < ⊟ + < ⊠ + < ⊡ + < ⊢ + < ⊣ + < ⊤ + < ⊥ + < ⊦ + < ⊧ + < ⊨ + < ⊩ + < ⊪ + < ⊫ + < ⊰ + < ⊱ + < ⊲ + < ⊳ + < ⊴ + < ⊵ + < ⊶ + < ⊷ + < ⊸ + < ⊹ + < ⊺ + < ⊻ + < ⊼ + < ⊽ + < ⊾ + < ⊿ + < ⋀ + < ⋁ + < ⋂ + < ⋃ + < ⋄ + < ⋅ + < ⋆ + < ⋇ + < ⋈ + < ⋉ + < ⋊ + < ⋋ + < ⋌ + < ⋍ + < ⋎ + < ⋏ + < ⋐ + < ⋑ + < ⋒ + < ⋓ + < ⋔ + < ⋕ + < ⋖ + < ⋗ + < ⋘ + < ⋙ + < ⋚ + < ⋛ + < ⋜ + < ⋝ + < ⋞ + < ⋟ + < ⋤ + < ⋥ + < ⋦ + < ⋧ + < ⋨ + < ⋩ + < ⋮ + < ⋯ + < ⋰ + < ⋱ + < ⋲ + < ⋳ + < ⋴ + < ⋵ + < ⋶ + < ⋷ + < ⋸ + < ⋹ + < ⋺ + < ⋻ + < ⋼ + < ⋽ + < ⋾ + < ⋿ + < ⌀ + < ⌁ + < ⌂ + < ⌃ + < ⌄ + < ⌅ + < ⌆ + < ⌇ + < ⌈ + < ⌉ + < ⌊ + < ⌋ + < ⌌ + < ⌍ + < ⌎ + < ⌏ + < ⌐ + < ⌑ + < ⌒ + < ⌓ + < ⌔ + < ⌕ + < ⌖ + < ⌗ + < ⌘ + < ⌙ + < ⌚ + < ⌛ + < ⌜ + < ⌝ + < ⌞ + < ⌟ + < ⌠ + < ⌡ + < ⌢ + < ⌣ + < ⌤ + < ⌥ + < ⌦ + < ⌧ + < ⌨ + < ⌫ + < ⌬ + < ⌭ + < ⌮ + < ⌯ + < ⌰ + < ⌱ + < ⌲ + < ⌳ + < ⌴ + < ⌵ + < ⌶ + < ⌷ + < ⌸ + < ⌹ + < ⌺ + < ⌻ + < ⌼ + < ⌽ + < ⌾ + < ⌿ + < ⍀ + < ⍁ + < ⍂ + < ⍃ + < ⍄ + < ⍅ + < ⍆ + < ⍇ + < ⍈ + < ⍉ + < ⍊ + < ⍋ + < ⍌ + < ⍍ + < ⍎ + < ⍏ + < ⍐ + < ⍑ + < ⍒ + < ⍓ + < ⍔ + < ⍕ + < ⍖ + < ⍗ + < ⍘ + < ⍙ + < ⍚ + < ⍛ + < ⍜ + < ⍝ + < ⍞ + < ⍟ + < ⍠ + < ⍡ + < ⍢ + < ⍣ + < ⍤ + < ⍥ + < ⍦ + < ⍧ + < ⍨ + < ⍩ + < ⍪ + < ⍫ + < ⍬ + < ⍭ + < ⍮ + < ⍯ + < ⍰ + < ⍱ + < ⍲ + < ⍳ + < ⍴ + < ⍵ + < ⍶ + < ⍷ + < ⍸ + < ⍹ + < ⍺ + < ⍻ + < ⍼ + < ⍽ + < ⍾ + < ⍿ + < ⎀ + < ⎁ + < ⎂ + < ⎃ + < ⎄ + < ⎅ + < ⎆ + < ⎇ + < ⎈ + < ⎉ + < ⎊ + < ⎋ + < ⎌ + < ⎍ + < ⎎ + < ⎏ + < ⎐ + < ⎑ + < ⎒ + < ⎓ + < ⎔ + < ⎕ + < ⎖ + < ⎗ + < ⎘ + < ⎙ + < ⎚ + < ⎛ + < ⎜ + < ⎝ + < ⎞ + < ⎟ + < ⎠ + < ⎡ + < ⎢ + < ⎣ + < ⎤ + < ⎥ + < ⎦ + < ⎧ + < ⎨ + < ⎩ + < ⎪ + < ⎫ + < ⎬ + < ⎭ + < ⎮ + < ⎯ + < ⎰ + < ⎱ + < ⎲ + < ⎳ + < ⎴ + < ⎵ + < ⎶ + < ⎷ + < ⎸ + < ⎹ + < ⎺ + < ⎻ + < ⎼ + < ⎽ + < ⎾ + < ⎿ + < ⏀ + < ⏁ + < ⏂ + < ⏃ + < ⏄ + < ⏅ + < ⏆ + < ⏇ + < ⏈ + < ⏉ + < ⏊ + < ⏋ + < ⏌ + < ⏍ + < ⏎ + < ⏏ + < ⏐ + < ␀ + < ␁ + < ␂ + < ␃ + < ␄ + < ␅ + < ␆ + < ␇ + < ␈ + < ␉ + < ␊ + < ␋ + < ␌ + < ␍ + < ␎ + < ␏ + < ␐ + < ␑ + < ␒ + < ␓ + < ␔ + < ␕ + < ␖ + < ␗ + < ␘ + < ␙ + < ␚ + < ␛ + < ␜ + < ␝ + < ␞ + < ␟ + < ␠ + < ␡ + < ␢ + < ␣ + < ␤ + < ␥ + < ␦ + < ⑀ + < ⑁ + < ⑂ + < ⑃ + < ⑄ + < ⑅ + < ⑆ + < ⑇ + < ⑈ + < ⑉ + < ⑊ + < ─ + < ━ + < │ + <<< │ + < ┃ + < ┄ + < ┅ + < ┆ + < ┇ + < ┈ + < ┉ + < ┊ + < ┋ + < ┌ + < ┍ + < ┎ + < ┏ + < ┐ + < ┑ + < ┒ + < ┓ + < └ + < ┕ + < ┖ + < ┗ + < ┘ + < ┙ + < ┚ + < ┛ + < ├ + < ┝ + < ┞ + < ┟ + < ┠ + < ┡ + < ┢ + < ┣ + < ┤ + < ┥ + < ┦ + < ┧ + < ┨ + < ┩ + < ┪ + < ┫ + < ┬ + < ┭ + < ┮ + < ┯ + < ┰ + < ┱ + < ┲ + < ┳ + < ┴ + < ┵ + < ┶ + < ┷ + < ┸ + < ┹ + < ┺ + < ┻ + < ┼ + < ┽ + < ┾ + < ┿ + < ╀ + < ╁ + < ╂ + < ╃ + < ╄ + < ╅ + < ╆ + < ╇ + < ╈ + < ╉ + < ╊ + < ╋ + < ╌ + < ╍ + < ╎ + < ╏ + < ═ + < ║ + < ╒ + < ╓ + < ╔ + < ╕ + < ╖ + < ╗ + < ╘ + < ╙ + < ╚ + < ╛ + < ╜ + < ╝ + < ╞ + < ╟ + < ╠ + < ╡ + < ╢ + < ╣ + < ╤ + < ╥ + < ╦ + < ╧ + < ╨ + < ╩ + < ╪ + < ╫ + < ╬ + < ╭ + < ╮ + < ╯ + < ╰ + < ╱ + < ╲ + < ╳ + < ╴ + < ╵ + < ╶ + < ╷ + < ╸ + < ╹ + < ╺ + < ╻ + < ╼ + < ╽ + < ╾ + < ╿ + < ▀ + < ▁ + < ▂ + < ▃ + < ▄ + < ▅ + < ▆ + < ▇ + < █ + < ▉ + < ▊ + < ▋ + < ▌ + < ▍ + < ▎ + < ▏ + < ▐ + < ░ + < ▒ + < ▓ + < ▔ + < ▕ + < ▖ + < ▗ + < ▘ + < ▙ + < ▚ + < ▛ + < ▜ + < ▝ + < ▞ + < ▟ + < ■ + <<< ï¿­ + < □ + < ▢ + < ▣ + < ▤ + < ▥ + < ▦ + < ▧ + < ▨ + < ▩ + < ▪ + < ▫ + < ▬ + < ▭ + < ▮ + < ▯ + < ▰ + < ▱ + < ▲ + < △ + < ▴ + < ▵ + < ▶ + < ▷ + < ▸ + < ▹ + < ► + < ▻ + < ▼ + < ▽ + < ▾ + < ▿ + < ◀ + < ◁ + < ◂ + < ◃ + < ◄ + < ◅ + < ◆ + < ◇ + < ◈ + < ◉ + < ◊ + < ○ + <<< ï¿® + < ◌ + < ◍ + < ◎ + < ● + < ◐ + < ◑ + < ◒ + < ◓ + < ◔ + < ◕ + < ◖ + < ◗ + < ◘ + < ◙ + < ◚ + < ◛ + < ◜ + < ◝ + < ◞ + < ◟ + < ◠ + < ◡ + < ◢ + < ◣ + < ◤ + < ◥ + < ◦ + < ◧ + < ◨ + < ◩ + < ◪ + < ◫ + < ◬ + < ◭ + < ◮ + < ◯ + < ◰ + < ◱ + < ◲ + < ◳ + < ◴ + < ◵ + < ◶ + < ◷ + < ◸ + < ◹ + < ◺ + < ◻ + < ◼ + < ◽ + < ◾ + < ◿ + < ☀ + < ☁ + < ☂ + < ☃ + < ☄ + < ★ + < ☆ + < ☇ + < ☈ + < ☉ + < ☊ + < ☋ + < ☌ + < ☍ + < ☎ + < ☏ + < ☐ + < ☑ + < ☒ + < ☓ + < ☔ + < ☕ + < ☖ + < ☗ + < ☙ + < ☚ + < ☛ + < ☜ + < ☝ + < ☞ + < ☟ + < ☠ + < ☡ + < ☢ + < ☣ + < ☤ + < ☥ + < ☦ + < ☧ + < ☨ + < ☩ + < ☪ + < ☫ + < ☬ + < ☭ + < ☮ + < ☯ + < ☸ + < ☹ + < ☺ + < ☻ + < ☼ + < ☽ + < ☾ + < ☿ + < ♀ + < ♁ + < ♂ + < ♃ + < ♄ + < ♅ + < ♆ + < ♇ + < ♈ + < ♉ + < ♊ + < ♋ + < ♌ + < ♍ + < ♎ + < ♏ + < ♐ + < ♑ + < ♒ + < ♓ + < ♔ + < ♕ + < ♖ + < ♗ + < ♘ + < ♙ + < ♚ + < ♛ + < ♜ + < ♝ + < ♞ + < ♟ + < ♠ + < ♡ + < ♢ + < ♣ + < ♤ + < ♥ + < ♦ + < ♧ + < ♨ + < ♩ + < ♪ + < ♫ + < ♬ + < ♰ + < ♱ + < ♲ + < ♳ + < ♴ + < ♵ + < ♶ + < ♷ + < ♸ + < ♹ + < ♺ + < ♻ + < ♼ + < ♽ + < ⚀ + < ⚁ + < ⚂ + < ⚃ + < ⚄ + < ⚅ + < ⚆ + < ⚇ + < ⚈ + < ⚉ + < ⚐ + < ⚑ + < ⚠ + < ⚡ + < ✁ + < ✂ + < ✃ + < ✄ + < ✆ + < ✇ + < ✈ + < ✉ + < ✌ + < ✍ + < ✎ + < ✏ + < ✐ + < ✑ + < ✒ + < ✓ + < ✔ + < ✕ + < ✖ + < ✗ + < ✘ + < ✙ + < ✚ + < ✛ + < ✜ + < ✝ + < ✞ + < ✟ + < ✠ + < ✡ + < ✢ + < ✣ + < ✤ + < ✥ + < ✦ + < ✧ + < ✩ + < ✪ + < ✫ + < ✬ + < ✭ + < ✮ + < ✯ + < ✰ + < ✱ + < ✲ + < ✳ + < ✴ + < ✵ + < ✶ + < ✷ + < ✸ + < ✹ + < ✺ + < ✻ + < ✼ + < ✽ + < ✾ + < ✿ + < ❀ + < ❁ + < ❂ + < ❃ + < ❄ + < ❅ + < ❆ + < ❇ + < ❈ + < ❉ + < ❊ + < ❋ + < ❍ + < ❏ + < ❐ + < ❑ + < ❒ + < ❖ + < ❘ + < ❙ + < ❚ + < ❛ + < ❜ + < ❝ + < ❞ + < ❡ + < ❢ + < ❣ + < ❤ + < ❥ + < ❦ + < ❧ + < ❨ + < ❩ + < ❪ + < ❫ + < ❬ + < ❭ + < ❮ + < ❯ + < ❰ + < ❱ + < ❲ + < ❳ + < ❴ + < ❵ + < ➔ + < ➘ + < ➙ + < ➚ + < ➛ + < ➜ + < ➝ + < ➞ + < ➟ + < ➠ + < ➡ + < ➢ + < ➣ + < ➤ + < ➥ + < ➦ + < ➧ + < ➨ + < ➩ + < ➪ + < ➫ + < ➬ + < ➭ + < ➮ + < ➯ + < ➱ + < ➲ + < ➳ + < ➴ + < ➵ + < ➶ + < ➷ + < ➸ + < ➹ + < ➺ + < ➻ + < ➼ + < ➽ + < ➾ + < ⟐ + < ⟑ + < ⟒ + < ⟓ + < ⟔ + < ⟕ + < ⟖ + < ⟗ + < ⟘ + < ⟙ + < ⟚ + < ⟛ + < ⟜ + < ⟝ + < ⟞ + < ⟟ + < ⟠ + < ⟡ + < ⟢ + < ⟣ + < ⟤ + < ⟥ + < ⟦ + < ⟧ + < ⟨ + < ⟩ + < ⟪ + < ⟫ + < ⟰ + < ⟱ + < ⟲ + < ⟳ + < ⟴ + < ⟵ + < ⟶ + < ⟷ + < ⟸ + < ⟹ + < ⟺ + < ⟻ + < ⟼ + < ⟽ + < ⟾ + < ⟿ + < ⤀ + < ⤁ + < ⤂ + < ⤃ + < ⤄ + < ⤅ + < ⤆ + < ⤇ + < ⤈ + < ⤉ + < ⤊ + < ⤋ + < ⤌ + < ⤍ + < ⤎ + < ⤏ + < ⤐ + < ⤑ + < ⤒ + < ⤓ + < ⤔ + < ⤕ + < ⤖ + < ⤗ + < ⤘ + < ⤙ + < ⤚ + < ⤛ + < ⤜ + < ⤝ + < ⤞ + < ⤟ + < ⤠ + < ⤡ + < ⤢ + < ⤣ + < ⤤ + < ⤥ + < ⤦ + < ⤧ + < ⤨ + < ⤩ + < ⤪ + < ⤫ + < ⤬ + < ⤭ + < ⤮ + < ⤯ + < ⤰ + < ⤱ + < ⤲ + < ⤳ + < ⤴ + < ⤵ + < ⤶ + < ⤷ + < ⤸ + < ⤹ + < ⤺ + < ⤻ + < ⤼ + < ⤽ + < ⤾ + < ⤿ + < ⥀ + < ⥁ + < ⥂ + < ⥃ + < ⥄ + < ⥅ + < ⥆ + < ⥇ + < ⥈ + < ⥉ + < ⥊ + < ⥋ + < ⥌ + < ⥍ + < ⥎ + < ⥏ + < ⥐ + < ⥑ + < ⥒ + < ⥓ + < ⥔ + < ⥕ + < ⥖ + < ⥗ + < ⥘ + < ⥙ + < ⥚ + < ⥛ + < ⥜ + < ⥝ + < ⥞ + < ⥟ + < ⥠ + < ⥡ + < ⥢ + < ⥣ + < ⥤ + < ⥥ + < ⥦ + < ⥧ + < ⥨ + < ⥩ + < ⥪ + < ⥫ + < ⥬ + < ⥭ + < ⥮ + < ⥯ + < ⥰ + < ⥱ + < ⥲ + < ⥳ + < ⥴ + < ⥵ + < ⥶ + < ⥷ + < ⥸ + < ⥹ + < ⥺ + < ⥻ + < ⥼ + < ⥽ + < ⥾ + < ⥿ + < ⦀ + < ⦁ + < ⦂ + < ⦙ + < ⦚ + < ⦛ + < ⦜ + < ⦝ + < ⦞ + < ⦟ + < ⦠ + < ⦡ + < ⦢ + < ⦣ + < ⦤ + < ⦥ + < ⦦ + < ⦧ + < ⦨ + < ⦩ + < ⦪ + < ⦫ + < ⦬ + < ⦭ + < ⦮ + < ⦯ + < ⦰ + < ⦱ + < ⦲ + < ⦳ + < ⦴ + < ⦵ + < ⦶ + < ⦷ + < ⦸ + < ⦹ + < ⦺ + < ⦻ + < ⦼ + < ⦽ + < ⦾ + < ⦿ + < ⧀ + < ⧁ + < ⧂ + < ⧃ + < ⧄ + < ⧅ + < ⧆ + < ⧇ + < ⧈ + < ⧉ + < ⧊ + < ⧋ + < ⧌ + < ⧍ + < ⧎ + < ⧏ + < ⧐ + < ⧑ + < ⧒ + < ⧓ + < ⧔ + < ⧕ + < ⧖ + < ⧗ + < ⧘ + < ⧙ + < ⧚ + < ⧛ + < ⧜ + < ⧝ + < ⧞ + < ⧟ + < â§  + < â§¡ + < â§¢ + < â§£ + < ⧤ + < â§¥ + < ⧦ + < â§§ + < ⧨ + < â§© + < ⧪ + < â§« + < ⧬ + < â§­ + < â§® + < ⧯ + < â§° + < â§± + < â§² + < â§³ + < â§´ + < â§µ + < â§¶ + < â§· + < ⧸ + < â§¹ + < ⧺ + < â§» + < â§¾ + < â§¿ + < ⨀ + < ⨁ + < ⨂ + < ⨃ + < ⨄ + < ⨅ + < ⨆ + < ⨇ + < ⨈ + < ⨉ + < ⨊ + < ⨋ + < ⨍ + < ⨎ + < ⨏ + < ⨐ + < ⨑ + < ⨒ + < ⨓ + < ⨔ + < ⨕ + < ⨖ + < ⨗ + < ⨘ + < ⨙ + < ⨚ + < ⨛ + < ⨜ + < ⨝ + < ⨞ + < ⨟ + < ⨠ + < ⨡ + < ⨢ + < ⨣ + < ⨤ + < ⨥ + < ⨦ + < ⨧ + < ⨨ + < ⨩ + < ⨪ + < ⨫ + < ⨬ + < ⨭ + < ⨮ + < ⨯ + < ⨰ + < ⨱ + < ⨲ + < ⨳ + < ⨴ + < ⨵ + < ⨶ + < ⨷ + < ⨸ + < ⨹ + < ⨺ + < ⨻ + < ⨼ + < ⨽ + < ⨾ + < ⨿ + < ⩀ + < ⩁ + < ⩂ + < ⩃ + < ⩄ + < ⩅ + < ⩆ + < ⩇ + < ⩈ + < ⩉ + < ⩊ + < ⩋ + < ⩌ + < ⩍ + < ⩎ + < ⩏ + < ⩐ + < ⩑ + < ⩒ + < ⩓ + < ⩔ + < ⩕ + < ⩖ + < ⩗ + < ⩘ + < ⩙ + < ⩚ + < ⩛ + < ⩜ + < ⩝ + < ⩞ + < ⩟ + < â©  + < â©¡ + < â©¢ + < â©£ + < ⩤ + < â©¥ + < ⩦ + < â©§ + < ⩨ + < â©© + < ⩪ + < â©« + < ⩬ + < â©­ + < â©® + < ⩯ + < â©° + < ⩱ + < ⩲ + < ⩳ + < â©· + < ⩸ + < ⩹ + < ⩺ + < â©» + < ⩼ + < ⩽ + < ⩾ + < â©¿ + < ⪀ + < ⪁ + < ⪂ + < ⪃ + < ⪄ + < ⪅ + < ⪆ + < ⪇ + < ⪈ + < ⪉ + < ⪊ + < ⪋ + < ⪌ + < ⪍ + < ⪎ + < ⪏ + < ⪐ + < ⪑ + < ⪒ + < ⪓ + < ⪔ + < ⪕ + < ⪖ + < ⪗ + < ⪘ + < ⪙ + < ⪚ + < ⪛ + < ⪜ + < ⪝ + < ⪞ + < ⪟ + < ⪠ + < ⪡ + < ⪢ + < ⪣ + < ⪤ + < ⪥ + < ⪦ + < ⪧ + < ⪨ + < ⪩ + < ⪪ + < ⪫ + < ⪬ + < ⪭ + < ⪮ + < ⪯ + < ⪰ + < ⪱ + < ⪲ + < ⪳ + < ⪴ + < ⪵ + < ⪶ + < ⪷ + < ⪸ + < ⪹ + < ⪺ + < ⪻ + < ⪼ + < ⪽ + < ⪾ + < ⪿ + < ⫀ + < ⫁ + < ⫂ + < ⫃ + < ⫄ + < ⫅ + < ⫆ + < ⫇ + < ⫈ + < ⫉ + < ⫊ + < ⫋ + < ⫌ + < ⫍ + < ⫎ + < ⫏ + < ⫐ + < ⫑ + < ⫒ + < ⫓ + < ⫔ + < ⫕ + < ⫖ + < ⫗ + < ⫘ + < ⫙ + < ⫚ + < ⫛ + < ⫝ + < ⫞ + < ⫟ + < â«  + < â«¡ + < â«¢ + < â«£ + < ⫤ + < â«¥ + < ⫦ + < â«§ + < ⫨ + < â«© + < ⫪ + < â«« + < ⫬ + < â«­ + < â«® + < ⫯ + < â«° + < ⫱ + < ⫲ + < ⫳ + < â«´ + < ⫵ + < â«¶ + < â«· + < ⫸ + < ⫹ + < ⫺ + < â«» + < ⫼ + < ⫽ + < ⫾ + < â«¿ + < ⬀ + < ⬁ + < ⬂ + < ⬃ + < ⬄ + < ⬅ + < ⬆ + < ⬇ + < ⬈ + < ⬉ + < ⬊ + < ⬋ + < ⬌ + < ⬍ + < ⠀ + < ⠁ + < ⠂ + < ⠃ + < ⠄ + < ⠅ + < ⠆ + < ⠇ + < ⠈ + < ⠉ + < ⠊ + < ⠋ + < ⠌ + < ⠍ + < ⠎ + < ⠏ + < ⠐ + < ⠑ + < ⠒ + < ⠓ + < ⠔ + < ⠕ + < ⠖ + < ⠗ + < ⠘ + < ⠙ + < ⠚ + < ⠛ + < ⠜ + < ⠝ + < ⠞ + < ⠟ + < â   + < â ¡ + < â ¢ + < â £ + < â ¤ + < â ¥ + < â ¦ + < â § + < â ¨ + < â © + < â ª + < â « + < â ¬ + < â ­ + < â ® + < â ¯ + < â ° + < â ± + < â ² + < â ³ + < â ´ + < â µ + < â ¶ + < â · + < â ¸ + < â ¹ + < â º + < â » + < â ¼ + < â ½ + < â ¾ + < â ¿ + < ⡀ + < ⡁ + < ⡂ + < ⡃ + < ⡄ + < ⡅ + < ⡆ + < ⡇ + < ⡈ + < ⡉ + < ⡊ + < ⡋ + < ⡌ + < ⡍ + < ⡎ + < ⡏ + < ⡐ + < ⡑ + < ⡒ + < ⡓ + < ⡔ + < ⡕ + < ⡖ + < ⡗ + < ⡘ + < ⡙ + < ⡚ + < ⡛ + < ⡜ + < ⡝ + < ⡞ + < ⡟ + < â¡  + < â¡¡ + < â¡¢ + < â¡£ + < ⡤ + < â¡¥ + < ⡦ + < â¡§ + < ⡨ + < â¡© + < ⡪ + < â¡« + < ⡬ + < â¡­ + < â¡® + < ⡯ + < â¡° + < ⡱ + < ⡲ + < ⡳ + < â¡´ + < ⡵ + < â¡¶ + < â¡· + < ⡸ + < ⡹ + < ⡺ + < â¡» + < ⡼ + < ⡽ + < ⡾ + < â¡¿ + < ⢀ + < ⢁ + < ⢂ + < ⢃ + < ⢄ + < ⢅ + < ⢆ + < ⢇ + < ⢈ + < ⢉ + < ⢊ + < ⢋ + < ⢌ + < ⢍ + < ⢎ + < ⢏ + < ⢐ + < ⢑ + < ⢒ + < ⢓ + < ⢔ + < ⢕ + < ⢖ + < ⢗ + < ⢘ + < ⢙ + < ⢚ + < ⢛ + < ⢜ + < ⢝ + < ⢞ + < ⢟ + < ⢠ + < ⢡ + < ⢢ + < ⢣ + < ⢤ + < ⢥ + < ⢦ + < ⢧ + < ⢨ + < ⢩ + < ⢪ + < ⢫ + < ⢬ + < ⢭ + < ⢮ + < ⢯ + < ⢰ + < ⢱ + < ⢲ + < ⢳ + < ⢴ + < ⢵ + < ⢶ + < ⢷ + < ⢸ + < ⢹ + < ⢺ + < ⢻ + < ⢼ + < ⢽ + < ⢾ + < ⢿ + < ⣀ + < ⣁ + < ⣂ + < ⣃ + < ⣄ + < ⣅ + < ⣆ + < ⣇ + < ⣈ + < ⣉ + < ⣊ + < ⣋ + < ⣌ + < ⣍ + < ⣎ + < ⣏ + < ⣐ + < ⣑ + < ⣒ + < ⣓ + < ⣔ + < ⣕ + < ⣖ + < ⣗ + < ⣘ + < ⣙ + < ⣚ + < ⣛ + < ⣜ + < ⣝ + < ⣞ + < ⣟ + < ⣠ + < ⣡ + < ⣢ + < ⣣ + < ⣤ + < ⣥ + < ⣦ + < ⣧ + < ⣨ + < ⣩ + < ⣪ + < ⣫ + < ⣬ + < ⣭ + < ⣮ + < ⣯ + < ⣰ + < ⣱ + < ⣲ + < ⣳ + < ⣴ + < ⣵ + < ⣶ + < ⣷ + < ⣸ + < ⣹ + < ⣺ + < ⣻ + < ⣼ + < ⣽ + < ⣾ + < ⣿ + < ⚊ + < ⚋ + < ⚌ + < ⚍ + < ⚎ + < ⚏ + < ☰ + < ☱ + < ☲ + < ☳ + < ☴ + < ☵ + < ☶ + < ☷ + < ䷀ + < ䷁ + < ䷂ + < ䷃ + < ䷄ + < ䷅ + < ䷆ + < ䷇ + < ䷈ + < ䷉ + < ䷊ + < ䷋ + < ䷌ + < ䷍ + < ䷎ + < ䷏ + < ䷐ + < ䷑ + < ䷒ + < ䷓ + < ䷔ + < ䷕ + < ䷖ + < ䷗ + < ䷘ + < ䷙ + < ䷚ + < ䷛ + < ䷜ + < ䷝ + < ䷞ + < ䷟ + < ä·  + < ä·¡ + < ä·¢ + < ä·£ + < ä·¤ + < ä·¥ + < ä·¦ + < ä·§ + < ä·¨ + < ä·© + < ä·ª + < ä·« + < ä·¬ + < ä·­ + < ä·® + < ä·¯ + < ä·° + < ä·± + < ä·² + < ä·³ + < ä·´ + < ä·µ + < ä·¶ + < ä·· + < ä·¸ + < ä·¹ + < ä·º + < ä·» + < ä·¼ + < ä·½ + < ä·¾ + < ä·¿ + < 𝌀 + < 𝌁 + < 𝌂 + < 𝌃 + < 𝌄 + < 𝌅 + < 𝌆 + < 𝌇 + < 𝌈 + < 𝌉 + < 𝌊 + < 𝌋 + < 𝌌 + < 𝌍 + < 𝌎 + < 𝌏 + < 𝌐 + < 𝌑 + < 𝌒 + < 𝌓 + < 𝌔 + < 𝌕 + < 𝌖 + < 𝌗 + < 𝌘 + < 𝌙 + < 𝌚 + < 𝌛 + < 𝌜 + < 𝌝 + < 𝌞 + < 𝌟 + < 𝌠 + < 𝌡 + < 𝌢 + < 𝌣 + < 𝌤 + < 𝌥 + < 𝌦 + < 𝌧 + < 𝌨 + < 𝌩 + < 𝌪 + < 𝌫 + < 𝌬 + < 𝌭 + < 𝌮 + < 𝌯 + < 𝌰 + < 𝌱 + < 𝌲 + < 𝌳 + < 𝌴 + < 𝌵 + < 𝌶 + < 𝌷 + < 𝌸 + < 𝌹 + < 𝌺 + < 𝌻 + < 𝌼 + < 𝌽 + < 𝌾 + < 𝌿 + < 𝍀 + < 𝍁 + < 𝍂 + < 𝍃 + < 𝍄 + < 𝍅 + < 𝍆 + < 𝍇 + < 𝍈 + < 𝍉 + < 𝍊 + < 𝍋 + < 𝍌 + < 𝍍 + < 𝍎 + < 𝍏 + < 𝍐 + < 𝍑 + < 𝍒 + < 𝍓 + < 𝍔 + < 𝍕 + < 𝍖 + < ꒐ + < ꒑ + < ꒒ + < ꒓ + < ꒔ + < ꒕ + < ꒖ + < ꒗ + < ꒘ + < ꒙ + < ꒚ + < ꒛ + < ꒜ + < ꒝ + < ꒞ + < ꒟ + < ꒠ + < ꒡ + < ꒢ + < ꒣ + < ꒤ + < ꒥ + < ꒦ + < ꒧ + < ꒨ + < ꒩ + < ꒪ + < ꒫ + < ꒬ + < ꒭ + < ꒮ + < ꒯ + < ꒰ + < ꒱ + < ꒲ + < ꒳ + < ꒴ + < ꒵ + < ꒶ + < ꒷ + < ꒸ + < ꒹ + < ꒺ + < ꒻ + < ꒼ + < ꒽ + < ꒾ + < ꒿ + < ꓀ + < ꓁ + < ꓂ + < ꓃ + < ꓄ + < ꓅ + < ꓆ + < 𐄷 + < 𐄸 + < 𐄹 + < 𐄺 + < 𐄻 + < 𐄼 + < 𐄽 + < 𐄾 + < 𐄿 + < 𝀀 + < 𝀁 + < 𝀂 + < 𝀃 + < 𝀄 + < 𝀅 + < 𝀆 + < 𝀇 + < 𝀈 + < 𝀉 + < 𝀊 + < 𝀋 + < 𝀌 + < 𝀍 + < 𝀎 + < 𝀏 + < 𝀐 + < 𝀑 + < 𝀒 + < 𝀓 + < 𝀔 + < 𝀕 + < 𝀖 + < 𝀗 + < 𝀘 + < 𝀙 + < 𝀚 + < 𝀛 + < 𝀜 + < 𝀝 + < 𝀞 + < 𝀟 + < 𝀠 + < 𝀡 + < 𝀢 + < 𝀣 + < 𝀤 + < 𝀥 + < 𝀦 + < 𝀧 + < 𝀨 + < 𝀩 + < 𝀪 + < 𝀫 + < 𝀬 + < 𝀭 + < 𝀮 + < 𝀯 + < 𝀰 + < 𝀱 + < 𝀲 + < 𝀳 + < 𝀴 + < 𝀵 + < 𝀶 + < 𝀷 + < 𝀸 + < 𝀹 + < 𝀺 + < 𝀻 + < 𝀼 + < 𝀽 + < 𝀾 + < 𝀿 + < 𝁀 + < 𝁁 + < 𝁂 + < 𝁃 + < 𝁄 + < 𝁅 + < 𝁆 + < 𝁇 + < 𝁈 + < 𝁉 + < 𝁊 + < 𝁋 + < 𝁌 + < 𝁍 + < 𝁎 + < 𝁏 + < 𝁐 + < 𝁑 + < 𝁒 + < 𝁓 + < 𝁔 + < 𝁕 + < 𝁖 + < 𝁗 + < 𝁘 + < 𝁙 + < 𝁚 + < 𝁛 + < 𝁜 + < 𝁝 + < 𝁞 + < 𝁟 + < 𝁠 + < 𝁡 + < 𝁢 + < 𝁣 + < 𝁤 + < 𝁥 + < 𝁦 + < 𝁧 + < 𝁨 + < 𝁩 + < 𝁪 + < 𝁫 + < 𝁬 + < 𝁭 + < 𝁮 + < 𝁯 + < 𝁰 + < 𝁱 + < 𝁲 + < 𝁳 + < 𝁴 + < 𝁵 + < 𝁶 + < 𝁷 + < 𝁸 + < 𝁹 + < 𝁺 + < 𝁻 + < 𝁼 + < 𝁽 + < 𝁾 + < 𝁿 + < 𝂀 + < 𝂁 + < 𝂂 + < 𝂃 + < 𝂄 + < 𝂅 + < 𝂆 + < 𝂇 + < 𝂈 + < 𝂉 + < 𝂊 + < 𝂋 + < 𝂌 + < 𝂍 + < 𝂎 + < 𝂏 + < 𝂐 + < 𝂑 + < 𝂒 + < 𝂓 + < 𝂔 + < 𝂕 + < 𝂖 + < 𝂗 + < 𝂘 + < 𝂙 + < 𝂚 + < 𝂛 + < 𝂜 + < 𝂝 + < 𝂞 + < 𝂟 + < 𝂠 + < 𝂡 + < 𝂢 + < 𝂣 + < 𝂤 + < 𝂥 + < 𝂦 + < 𝂧 + < 𝂨 + < 𝂩 + < 𝂪 + < 𝂫 + < 𝂬 + < 𝂭 + < 𝂮 + < 𝂯 + < 𝂰 + < 𝂱 + < 𝂲 + < 𝂳 + < 𝂴 + < 𝂵 + < 𝂶 + < 𝂷 + < 𝂸 + < 𝂹 + < 𝂺 + < 𝂻 + < 𝂼 + < 𝂽 + < 𝂾 + < 𝂿 + < 𝃀 + < 𝃁 + < 𝃂 + < 𝃃 + < 𝃄 + < 𝃅 + < 𝃆 + < 𝃇 + < 𝃈 + < 𝃉 + < 𝃊 + < 𝃋 + < 𝃌 + < 𝃍 + < 𝃎 + < 𝃏 + < 𝃐 + < 𝃑 + < 𝃒 + < 𝃓 + < 𝃔 + < 𝃕 + < 𝃖 + < 𝃗 + < 𝃘 + < 𝃙 + < 𝃚 + < 𝃛 + < 𝃜 + < 𝃝 + < 𝃞 + < 𝃟 + < 𝃠 + < 𝃡 + < 𝃢 + < 𝃣 + < 𝃤 + < 𝃥 + < 𝃦 + < 𝃧 + < 𝃨 + < 𝃩 + < 𝃪 + < 𝃫 + < 𝃬 + < 𝃭 + < 𝃮 + < 𝃯 + < 𝃰 + < 𝃱 + < 𝃲 + < 𝃳 + < 𝃴 + < 𝃵 + < 𝄀 + < 𝄁 + < 𝄂 + < 𝄃 + < 𝄄 + < 𝄅 + < 𝄆 + < 𝄇 + < 𝄈 + < 𝄉 + < 𝄊 + < 𝄋 + < 𝄌 + < 𝄍 + < 𝄎 + < 𝄏 + < 𝄐 + < 𝄑 + < 𝄒 + < 𝄓 + < 𝄔 + < 𝄕 + < 𝄖 + < 𝄗 + < 𝄘 + < 𝄙 + < 𝄚 + < 𝄛 + < 𝄜 + < 𝄝 + < 𝄞 + < 𝄟 + < 𝄠 + < 𝄡 + < 𝄢 + < 𝄣 + < 𝄤 + < 𝄥 + < 𝄦 + < ♭ + < ♮ + < ♯ + < 𝄪 + < 𝄫 + < 𝄬 + < 𝄭 + < 𝄮 + < 𝄯 + < 𝄰 + < 𝄱 + < 𝄲 + < 𝄳 + < 𝄴 + < 𝄵 + < 𝄶 + < 𝄷 + < 𝄸 + < 𝄹 + < 𝄺 + < 𝄻 + < 𝄼 + < 𝄽 + < 𝄾 + < 𝄿 + < 𝅀 + < 𝅁 + < 𝅂 + < 𝅃 + < 𝅄 + < 𝅅 + < 𝅆 + < 𝅇 + < 𝅈 + < 𝅉 + < 𝅊 + < 𝅋 + < 𝅌 + < 𝅍 + < 𝅎 + < 𝅏 + < 𝅐 + < 𝅑 + < 𝅒 + < 𝅓 + < 𝅔 + < 𝅕 + < 𝅖 + < 𝅗 + = 𝅗𝅥 + < 𝅘 + = 𝅘𝅥 + = 𝅘𝅥𝅮 + = 𝅘𝅥𝅯 + = 𝅘𝅥𝅰 + = 𝅘𝅥𝅱 + = 𝅘𝅥𝅲 + < 𝅙 + < 𝅚 + < 𝅛 + < 𝅜 + < 𝅝 + < 𝅪 + < 𝅫 + < 𝅬 + < 𝆃 + < 𝆄 + < 𝆌 + < 𝆍 + < 𝆎 + < 𝆏 + < 𝆐 + < 𝆑 + < 𝆒 + < 𝆓 + < 𝆔 + < 𝆕 + < 𝆖 + < 𝆗 + < 𝆘 + < 𝆙 + < 𝆚 + < 𝆛 + < 𝆜 + < 𝆝 + < 𝆞 + < 𝆟 + < 𝆠 + < 𝆡 + < 𝆢 + < 𝆣 + < 𝆤 + < 𝆥 + < 𝆦 + < 𝆧 + < 𝆨 + < 𝆩 + < 𝆮 + < 𝆯 + < 𝆰 + < 𝆱 + < 𝆲 + < 𝆳 + < 𝆴 + < 𝆵 + < 𝆶 + < 𝆷 + < 𝆸 + < 𝆹 + = 𝆹𝅥 + = 𝆹𝅥𝅮 + = 𝆹𝅥𝅯 + < 𝆺 + = 𝆺𝅥 + = 𝆺𝅥𝅮 + = 𝆺𝅥𝅯 + < 𝇁 + < 𝇂 + < 𝇃 + < 𝇄 + < 𝇅 + < 𝇆 + < 𝇇 + < 𝇈 + < 𝇉 + < 𝇊 + < 𝇋 + < 𝇌 + < 𝇍 + < 𝇎 + < 𝇏 + < 𝇐 + < 𝇑 + < 𝇒 + < 𝇓 + < 𝇔 + < 𝇕 + < 𝇖 + < 𝇗 + < 𝇘 + < 𝇙 + < 𝇚 + < 𝇛 + < 𝇜 + < 𝇝 + < â¿° + < ⿱ + < ⿲ + < ⿳ + < â¿´ + < ⿵ + < â¿¶ + < â¿· + < ⿸ + < ⿹ + < ⿺ + < â¿» + < 〄 + < 〒 + <<< 〶 + < 〓 + < 〠 + < 〷 + < 〾 + < 〿 + < ㆐ + < ㆑ + < ㉿ + <  + < � + < ৸ + < à§¹ + < ௰ + < ௱ + < ௲ + < ፲ + < ፳ + < ፴ + < ፵ + < ፶ + < ፷ + < ፸ + < ፹ + < ፺ + < ፻ + < ፼ + < ↀ + < ↁ + < ↂ + < Ↄ + < 𐌢 + < 𐌣 + < 𐄐 + < 𐄑 + < 𐄒 + < 𐄓 + < 𐄔 + < 𐄕 + < 𐄖 + < 𐄗 + < 𐄘 + < 𐄙 + < 𐄚 + < 𐄛 + < 𐄜 + < 𐄝 + < 𐄞 + < 𐄟 + < 𐄠 + < 𐄡 + < 𐄢 + < 𐄣 + < 𐄤 + < 𐄥 + < 𐄦 + < 𐄧 + < 𐄨 + < 𐄩 + < 𐄪 + < 𐄫 + < 𐄬 + < 𐄭 + < 𐄮 + < 𐄯 + < 𐄰 + < 𐄱 + < 𐄲 + < 𐄳 + < [variable top] + < ː + < ˑ + < ๆ + < ໆ + < 々 + < 〻 + < 〱 + <<< 〲 / ゙ + < 〳 + <<< 〴 / ゙ + < 〵 + < ゝ + < ー + <<< ï½° + < ヽ + < ¤ + < ¢ + <<< ï¿  + < '$' + <<< $ + <<< ﹩ + < £ + <<< ï¿¡ + < Â¥ + <<< ï¿¥ + < à§² + < à§³ + < ૱ + < ௹ + < ฿ + < ៛ + < ₠ + < ₡ + < ₢ + < ₣ + < ₤ + < ₥ + < ₦ + < ₧ + < ₩ + <<< ₩ + < ₪ + < ₫ + < € + < ₭ + < ₮ + < ₯ + < ₰ + < ₱ + < 0 + <<< 0 + <<< ㍘ / 点 + <<< 𝟎 + = 𝟘 + = 𝟢 + = 𝟬 + = 𝟶 + <<< ⓪ + = ⓿ + <<< ⁰ + <<< ₀ + << Ù  + << Û° + << 𐒠 + << ० + << ০ + << ੦ + << ૦ + << à­¦ + << ౦ + << ೦ + << ൦ + << ᥆ + << ๐ + << ໐ + << ༠ + <<< ༳ + << ၀ + << ០ + << ៰ + << ᠐ + << 〇 + < 1 + <<< 1 + <<< ⒈ / '.' + <<< ⒑ / 0'.' + <<< ㏩ / 0日 + <<< ㋉ / 0月 + <<< ㍢ / 0点 + <<< ⒒ / 1'.' + <<< ㏪ / 1日 + <<< ㋊ / 1月 + <<< ㍣ / 1点 + <<< ⒓ / 2'.' + <<< ㏫ / 2日 + <<< ㋋ / 2月 + <<< ㍤ / 2点 + <<< ⒔ / 3'.' + <<< ㏬ / 3日 + <<< ㍥ / 3点 + <<< ⒕ / 4'.' + <<< ㏭ / 4日 + <<< ㍦ / 4点 + <<< ⒖ / 5'.' + <<< ㏮ / 5日 + <<< ㍧ / 5点 + <<< ⒗ / 6'.' + <<< ㏯ / 6日 + <<< ㍨ / 6点 + <<< ⒘ / 7'.' + <<< ㏰ / 7日 + <<< ㍩ / 7点 + <<< ⒙ / 8'.' + <<< ㏱ / 8日 + <<< ㍪ / 8点 + <<< ⒚ / 9'.' + <<< ㏲ / 9日 + <<< ㍫ / 9点 + <<< ㏠ / 日 + <<< ㋀ / 月 + <<< ㍙ / 点 + <<< 𝟏 + = 𝟙 + = 𝟣 + = 𝟭 + = 𝟷 + <<< ① + = ⓵ + = ❶ + = ➀ + = ➊ + <<< ⑩ / 0 + = ⓾ / 0 + = ❿ / 0 + = ➉ / 0 + = ➓ / 0 + <<< ⑪ / 1 + = ⓫ / 1 + <<< ⑫ / 2 + = ⓬ / 2 + <<< ⑬ / 3 + = ⓭ / 3 + <<< ⑭ / 4 + = ⓮ / 4 + <<< ⑮ / 5 + = ⓯ / 5 + <<< ⑯ / 6 + = ⓰ / 6 + <<< ⑰ / 7 + = ⓱ / 7 + <<< ⑱ / 8 + = ⓲ / 8 + <<< ⑲ / 9 + = ⓳ / 9 + <<< ¹ + <<< ₁ + <<< ⅟ / ⁄ + <<< ½ / ⁄2 + <<< ⅓ / ⁄3 + <<< ¼ / ⁄4 + <<< ⅕ / ⁄5 + <<< ⅙ / ⁄6 + <<< ⅛ / ⁄8 + << Ù¡ + << Û± + << ፩ + << 𐒡 + << १ + << à§§ + << à§´ + << à©§ + << à«§ + << à­§ + << ௧ + << à±§ + << à³§ + << ൧ + << ᥇ + << ๑ + << ໑ + << ༡ + <<< ༪ + << ၁ + << ១ + << ៱ + << ᠑ + << 〡 + << 𐄇 + << 𐌠 + < 2 + <<< 2 + <<< ⒉ / '.' + <<< ⒛ / 0'.' + <<< ㏳ / 0日 + <<< ㍬ / 0点 + <<< ㏴ / 1日 + <<< ㍭ / 1点 + <<< ㏵ / 2日 + <<< ㍮ / 2点 + <<< ㏶ / 3日 + <<< ㍯ / 3点 + <<< ㏷ / 4日 + <<< ㍰ / 4点 + <<< ㏸ / 5日 + <<< ㏹ / 6日 + <<< ㏺ / 7日 + <<< ㏻ / 8日 + <<< ㏼ / 9日 + <<< ㏡ / 日 + <<< ㋁ / 月 + <<< ㍚ / 点 + <<< 𝟐 + = 𝟚 + = 𝟤 + = 𝟮 + = 𝟸 + <<< ② + = ⓶ + = ❷ + = ➁ + = ➋ + <<< ⑳ / 0 + = ⓴ / 0 + <<< ㉑ / 1 + <<< ㉒ / 2 + <<< ㉓ / 3 + <<< ㉔ / 4 + <<< ㉕ / 5 + <<< ㉖ / 6 + <<< ㉗ / 7 + <<< ㉘ / 8 + <<< ㉙ / 9 + <<< ² + <<< ₂ + <<< ⅔ / ⁄3 + <<< ⅖ / ⁄5 + << Ù¢ + << Û² + << ፪ + << 𐒢 + << २ + << ২ + << à§µ + << ੨ + << ૨ + << à­¨ + << ௨ + << ౨ + << ೨ + << ൨ + << ᥈ + << ๒ + << ໒ + << ༢ + <<< ༫ + << ၂ + << ២ + << ៲ + << ᠒ + << 〢 + << 𐄈 + < 3 + <<< 3 + <<< ⒊ / '.' + <<< ㏽ / 0日 + <<< ㏾ / 1日 + <<< ㏢ / 日 + <<< ㋂ / 月 + <<< ㍛ / 点 + <<< 𝟑 + = 𝟛 + = 𝟥 + = 𝟯 + = 𝟹 + <<< ③ + = ⓷ + = ❸ + = ➂ + = ➌ + <<< ㉚ / 0 + <<< ㉛ / 1 + <<< ㉜ / 2 + <<< ㉝ / 3 + <<< ㉞ / 4 + <<< ㉟ / 5 + <<< ㊱ / 6 + <<< ㊲ / 7 + <<< ㊳ / 8 + <<< ㊴ / 9 + <<< ³ + <<< ₃ + <<< ¾ / ⁄4 + <<< ⅗ / ⁄5 + <<< ⅜ / ⁄8 + << Ù£ + << Û³ + << ፫ + << 𐒣 + << ३ + << à§© + << à§¶ + << à©© + << à«© + << à­© + << ௩ + << ౩ + << ೩ + << ൩ + << ᥉ + << ๓ + << ໓ + << ༣ + <<< ༬ + << ၃ + << ៣ + << ៳ + << ᠓ + << 〣 + << 𐄉 + < 4 + <<< 4 + <<< ⒋ / '.' + <<< ㏣ / 日 + <<< ㋃ / 月 + <<< ㍜ / 点 + <<< 𝟒 + = 𝟜 + = 𝟦 + = 𝟰 + = 𝟺 + <<< ④ + = ⓸ + = ❹ + = ➃ + = ➍ + <<< ㊵ / 0 + <<< ㊶ / 1 + <<< ㊷ / 2 + <<< ㊸ / 3 + <<< ㊹ / 4 + <<< ㊺ / 5 + <<< ㊻ / 6 + <<< ㊼ / 7 + <<< ㊽ / 8 + <<< ㊾ / 9 + <<< ⁴ + <<< ₄ + <<< ⅘ / ⁄5 + << Ù¤ + << Û´ + << ፬ + << 𐒤 + << ४ + << ৪ + << à§· + << ੪ + << ૪ + << à­ª + << ௪ + << ౪ + << ೪ + << ൪ + << ᥊ + << ๔ + << ໔ + << ༤ + <<< ༭ + << ၄ + << ៤ + << ៴ + << ᠔ + << 〤 + << 𐄊 + < 5 + <<< 5 + <<< ⒌ / '.' + <<< ㏤ / 日 + <<< ㋄ / 月 + <<< ㍝ / 点 + <<< 𝟓 + = 𝟝 + = 𝟧 + = 𝟱 + = 𝟻 + <<< ⑤ + = ⓹ + = ❺ + = ➄ + = ➎ + <<< ㊿ / 0 + <<< ⁵ + <<< ₅ + <<< ⅚ / ⁄6 + <<< ⅝ / ⁄8 + << Ù¥ + << Ûµ + << ፭ + << 𐒥 + << ५ + << à§« + << à©« + << à«« + << à­« + << ௫ + << ౫ + << ೫ + << ൫ + << ᥋ + << ๕ + << ໕ + << ༥ + <<< ༮ + << ၅ + << ៥ + << ៵ + << ᠕ + << 〥 + << 𐄋 + << 𐌡 + < 6 + <<< 6 + <<< ⒍ / '.' + <<< ㏥ / 日 + <<< ㋅ / 月 + <<< ㍞ / 点 + <<< 𝟔 + = 𝟞 + = 𝟨 + = 𝟲 + = 𝟼 + <<< ⑥ + = ⓺ + = ❻ + = ➅ + = ➏ + <<< ⁶ + <<< ₆ + << Ù¦ + << Û¶ + << ፮ + << 𐒦 + << ६ + << ৬ + << ੬ + << ૬ + << à­¬ + << ௬ + << ౬ + << ೬ + << ൬ + << ᥌ + << ๖ + << ໖ + << ༦ + <<< ༯ + << ၆ + << ៦ + << ៶ + << ᠖ + << 〦 + << 𐄌 + < 7 + <<< 7 + <<< ⒎ / '.' + <<< ㏦ / 日 + <<< ㋆ / 月 + <<< ㍟ / 点 + <<< 𝟕 + = 𝟟 + = 𝟩 + = 𝟳 + = 𝟽 + <<< ⑦ + = ⓻ + = ❼ + = ➆ + = ➐ + <<< ⁷ + <<< ₇ + <<< ⅞ / ⁄8 + << Ù§ + << Û· + << ፯ + << 𐒧 + << ७ + << à§­ + << à©­ + << à«­ + << à­­ + << ௭ + << à±­ + << à³­ + << ൭ + << ᥍ + << ๗ + << ໗ + << ༧ + <<< ༰ + << ၇ + << ៧ + << ៷ + << ᠗ + << 〧 + << 𐄍 + < 8 + <<< 8 + <<< ⒏ / '.' + <<< ㏧ / 日 + <<< ㋇ / 月 + <<< ㍠ / 点 + <<< 𝟖 + = 𝟠 + = 𝟪 + = 𝟴 + = 𝟾 + <<< ⑧ + = ⓼ + = ❽ + = ➇ + = ➑ + <<< ⁸ + <<< ₈ + << Ù¨ + << Û¸ + << ፰ + << 𐒨 + << ८ + << à§® + << à©® + << à«® + << à­® + << ௮ + << à±® + << à³® + << ൮ + << ᥎ + << ๘ + << ໘ + << ༨ + <<< ༱ + << ၈ + << ៨ + << ៸ + << ᠘ + << 〨 + << 𐄎 + < 9 + <<< 9 + <<< ⒐ / '.' + <<< ㏨ / 日 + <<< ㋈ / 月 + <<< ㍡ / 点 + <<< 𝟗 + = 𝟡 + = 𝟫 + = 𝟵 + = 𝟿 + <<< ⑨ + = ⓽ + = ❾ + = ➈ + = ➒ + <<< ⁹ + <<< ₉ + << Ù© + << Û¹ + << ፱ + << 𐒩 + << ९ + << ৯ + << ੯ + << ૯ + << à­¯ + << ௯ + << ౯ + << ೯ + << ൯ + << ᥏ + << ๙ + << ໙ + << ༩ + <<< ༲ + << ၉ + << ៩ + << ៹ + << ᠙ + << 〩 + << 𐄏 + < a + <<< a + <<< Í£ + <<< ℀ / '/'c + <<< ℁ / '/'s + <<< ẚ / ʾ + <<< 𝐚 + = 𝑎 + = 𝒂 + = 𝒶 + = 𝓪 + = 𝔞 + = 𝕒 + = 𝖆 + = 𝖺 + = 𝗮 + = 𝘢 + = 𝙖 + = 𝚊 + <<< ⓐ + <<< A + <<< A + <<< 𝐀 + = 𝐴 + = 𝑨 + = 𝒜 + = 𝓐 + = 𝔄 + = 𝔸 + = 𝕬 + = 𝖠 + = 𝗔 + = 𝘈 + = 𝘼 + = 𝙰 + <<< Ⓐ + <<< ª + = á´¬ + = ᵃ + <<< ㏂ / '.'m'.' + <<< ㏟ / ∕m + <<< ㍳ / U + < ᴀ + < æ + <<< Æ + <<< á´­ + < ᴁ + < ᴂ + <<< ᵆ + < ɐ + <<< ᵄ + < ɑ + <<< ᵅ + < ɒ + < b + <<< b + <<< 𝐛 + = 𝑏 + = 𝒃 + = 𝒷 + = 𝓫 + = 𝔟 + = 𝕓 + = 𝖇 + = 𝖻 + = 𝗯 + = 𝘣 + = 𝙗 + = 𝚋 + <<< ⓑ + <<< B + <<< ï¼¢ + <<< ℬ + = 𝐁 + = 𝐵 + = 𝑩 + = 𝓑 + = 𝔅 + = 𝔹 + = 𝕭 + = 𝖡 + = 𝗕 + = 𝘉 + = 𝘽 + = 𝙱 + <<< Ⓑ + <<< á´® + = ᵇ + <<< ㍴ / ar + <<< ㏃ / q + < ʙ + < ƀ + < á´¯ + < ᴃ + < ɓ + <<< Ɓ + < ƃ + <<< Ƃ + < c + <<< c + <<< ͨ + = ⅽ + <<< ℅ / '/'o + <<< ℆ / '/'u + <<< 𝐜 + = 𝑐 + = 𝒄 + = 𝒸 + = 𝓬 + = 𝔠 + = 𝕔 + = 𝖈 + = 𝖼 + = 𝗰 + = 𝘤 + = 𝙘 + = 𝚌 + <<< ⓒ + <<< C + <<< ï¼£ + <<< Ⅽ + <<< ℂ + = ℭ + = 𝐂 + = 𝐶 + = 𝑪 + = 𝒞 + = 𝓒 + = 𝕮 + = 𝖢 + = 𝗖 + = 𝘊 + = 𝘾 + = 𝙲 + <<< Ⓒ + <<< ㎈ / al + <<< ㏄ / c + <<< ㏅ / d + <<< ㎝ / m + <<< ㎠ / m2 + <<< ㎤ / m3 + <<< ㏆ / ∕kg + <<< ㏇ / o'.' + < ᴄ + < ƈ + <<< Ƈ + < ɕ + < d + <<< d + <<< Í© + = ⅾ + <<< dz / z + = Ê£ / z + <<< dž / ž + <<< Ê¥ / ʑ + <<< ʤ / ʒ + <<< ⅆ + = 𝐝 + = 𝑑 + = 𝒅 + = 𝒹 + = 𝓭 + = 𝔡 + = 𝕕 + = 𝖉 + = 𝖽 + = 𝗱 + = 𝘥 + = 𝙙 + = 𝚍 + <<< ⓓ + <<< D + <<< D + <<< Ⅾ + <<< Dz / z + <<< DZ / Z + <<< Dž / ž + <<< DŽ / Ž + <<< ⅅ + = 𝐃 + = 𝐷 + = 𝑫 + = 𝒟 + = 𝓓 + = 𝔇 + = 𝔻 + = 𝕯 + = 𝖣 + = 𝗗 + = 𝘋 + = 𝘿 + = 𝙳 + <<< Ⓓ + <<< á´° + = ᵈ + <<< ㍲ / a + <<< ㏈ / B + <<< ㎗ / l + <<< ㍷ / m + <<< ㍸ / m2 + <<< ㍹ / m3 + < ᴅ + < đ + <<< Đ + < ɖ + <<< Ɖ + < ɗ + <<< Ɗ + < ƌ + <<< Ƌ + < È¡ + < ð + <<< Ð + < ᴆ + < e + <<< e + <<< ͤ + <<< ℯ + = ⅇ + = 𝐞 + = 𝑒 + = 𝒆 + = 𝓮 + = 𝔢 + = 𝕖 + = 𝖊 + = 𝖾 + = 𝗲 + = 𝘦 + = 𝙚 + = 𝚎 + <<< ⓔ + <<< E + <<< ï¼¥ + <<< ℰ + = 𝐄 + = 𝐸 + = 𝑬 + = 𝓔 + = 𝔈 + = 𝔼 + = 𝕰 + = 𝖤 + = 𝗘 + = 𝘌 + = 𝙀 + = 𝙴 + <<< Ⓔ + <<< á´± + = ᵉ + <<< ㋍ / rg + <<< ㋎ / V + < ᴇ + < ǝ + <<< Ǝ + <<< á´² + < ə + <<< Ə + <<< ᵊ + < ɛ + <<< Ɛ + <<< ℇ + <<< ᵋ + < ɘ + < ɚ + < ɜ + < ᴈ + <<< ᵌ + < ɝ + < ɞ + < ʚ + < ɤ + < f + <<< f + <<< ff / f + <<< ffi / fi + <<< ffl / fl + <<< fi / i + <<< fl / l + <<< Ê© / ŋ + <<< 𝐟 + = 𝑓 + = 𝒇 + = 𝒻 + = 𝓯 + = 𝔣 + = 𝕗 + = 𝖋 + = 𝖿 + = 𝗳 + = 𝘧 + = 𝙛 + = 𝚏 + <<< ⓕ + <<< F + <<< F + <<< ℻ / Ax + <<< ℱ + = 𝐅 + = 𝐹 + = 𝑭 + = 𝓕 + = 𝔉 + = 𝔽 + = 𝕱 + = 𝖥 + = 𝗙 + = 𝘍 + = 𝙁 + = 𝙵 + <<< Ⓕ + <<< ㎙ / m + < ƒ + <<< Ƒ + < g + <<< g + <<< ℊ + = 𝐠 + = 𝑔 + = 𝒈 + = 𝓰 + = 𝔤 + = 𝕘 + = 𝖌 + = 𝗀 + = 𝗴 + = 𝘨 + = 𝙜 + = 𝚐 + <<< ⓖ + <<< G + <<< ï¼§ + <<< 𝐆 + = 𝐺 + = 𝑮 + = 𝒢 + = 𝓖 + = 𝔊 + = 𝔾 + = 𝕲 + = 𝖦 + = 𝗚 + = 𝘎 + = 𝙂 + = 𝙶 + <<< Ⓖ + <<< á´³ + = ᵍ + <<< ㏿ / al + <<< ㎇ / B + <<< ㎓ / Hz + <<< ㎬ / Pa + <<< ㏉ / y + < É¡ + < É¢ + < Ç¥ + <<< Ǥ + < É  + <<< Ɠ + < ʛ + < É£ + <<< Ɣ + <<< Ë  + < Æ£ + <<< Æ¢ + < h + <<< h + <<< ͪ + <<< ℎ + = 𝐡 + = 𝒉 + = 𝒽 + = 𝓱 + = 𝔥 + = 𝕙 + = 𝖍 + = 𝗁 + = 𝗵 + = 𝘩 + = 𝙝 + = 𝚑 + <<< ⓗ + <<< H + <<< H + <<< ℋ + = ℌ + = ℍ + = 𝐇 + = 𝐻 + = 𝑯 + = 𝓗 + = 𝕳 + = 𝖧 + = 𝗛 + = 𝘏 + = 𝙃 + = 𝙷 + <<< Ⓗ + <<< ʰ + = á´´ + <<< ㏊ / a + <<< ㍱ / Pa + <<< ㋌ / g + <<< ㏋ / P + <<< ㎐ / z + < ʜ + < ƕ + <<< Ƕ + < ħ + <<< ℏ + <<< Ħ + < ɦ + <<< ʱ + < ɧ + < Ê» + < ʽ + < i + <<< i + <<< Í¥ + = ⅰ + <<< ⅱ / i + <<< ⅲ / ii + <<< ij / j + <<< ⅳ / v + <<< ⅸ / x + <<< ℹ + = ⅈ + = 𝐢 + = 𝑖 + = 𝒊 + = 𝒾 + = 𝓲 + = 𝔦 + = 𝕚 + = 𝖎 + = 𝗂 + = 𝗶 + = 𝘪 + = 𝙞 + = 𝚒 + <<< ⓘ + <<< I + <<< I + <<< Ⅰ + <<< Ⅱ / I + <<< Ⅲ / Ii + <<< IJ / J + <<< Ⅳ / V + <<< Ⅸ / X + <<< ℐ + = ℑ + = 𝐈 + = 𝐼 + = 𝑰 + = 𝓘 + = 𝕀 + = 𝕴 + = 𝖨 + = 𝗜 + = 𝘐 + = 𝙄 + = 𝙸 + <<< Ⓘ + <<< á´µ + = ⁱ + <<< áµ¢ + <<< ㏌ / n + <<< ㍺ / U + < ı + < ɪ + < ᴉ + <<< ᵎ + < ɨ + <<< Ɨ + < É© + <<< Ɩ + < j + <<< j + <<< ⅉ + = 𝐣 + = 𝑗 + = 𝒋 + = 𝒿 + = 𝓳 + = 𝔧 + = 𝕛 + = 𝖏 + = 𝗃 + = 𝗷 + = 𝘫 + = 𝙟 + = 𝚓 + <<< ⓙ + <<< J + <<< J + <<< 𝐉 + = 𝐽 + = 𝑱 + = 𝒥 + = 𝓙 + = 𝔍 + = 𝕁 + = 𝕵 + = 𝖩 + = 𝗝 + = 𝘑 + = 𝙅 + = 𝙹 + <<< Ⓙ + <<< ʲ + = á´¶ + < ᴊ + < ʝ + < ɟ + < ʄ + < k + <<< k + <<< 𝐤 + = 𝑘 + = 𝒌 + = 𝓀 + = 𝓴 + = 𝔨 + = 𝕜 + = 𝖐 + = 𝗄 + = 𝗸 + = 𝘬 + = 𝙠 + = 𝚔 + <<< ⓚ + <<< K + <<< K + <<< 𝐊 + = 𝐾 + = 𝑲 + = 𝒦 + = 𝓚 + = 𝔎 + = 𝕂 + = 𝕶 + = 𝖪 + = 𝗞 + = 𝘒 + = 𝙆 + = 𝙺 + <<< Ⓚ + <<< á´· + = ᵏ + <<< ㎄ / A + <<< ㎉ / cal + <<< ㎏ / g + <<< ㎑ / Hz + <<< ㎘ / l + <<< ㎞ / m + <<< ㎢ / m2 + <<< ㎦ / m3 + <<< ㎪ / Pa + <<< ㏏ / t + <<< ㎸ / V + <<< ㎾ / W + <<< ㏀ / Ω + <<< ㎅ / B + <<< ㏍ / K + <<< ㏎ / M + < ᴋ + < ƙ + <<< Ƙ + < ʞ + < l + <<< l + <<< ⅼ + <<< ŀ / · + <<< lj / j + <<< ʪ / s + <<< Ê« / z + <<< ℓ + = 𝐥 + = 𝑙 + = 𝒍 + = 𝓁 + = 𝓵 + = 𝔩 + = 𝕝 + = 𝖑 + = 𝗅 + = 𝗹 + = 𝘭 + = 𝙡 + = 𝚕 + <<< ⓛ + <<< L + <<< L + <<< Ⅼ + <<< Ä¿ / · + <<< Lj / j + <<< LJ / J + <<< ℒ + = 𝐋 + = 𝐿 + = 𝑳 + = 𝓛 + = 𝔏 + = 𝕃 + = 𝕷 + = 𝖫 + = 𝗟 + = 𝘓 + = 𝙇 + = 𝙻 + <<< Ⓛ + <<< Ë¡ + = á´¸ + <<< ㏐ / m + <<< ㏑ / n + <<< ㏒ / og + <<< ㏓ / x + <<< ㋏ / Td + < ʟ + < ł + <<< Ł + < ᴌ + < ƚ + < É« + < ɬ + < É­ + < È´ + < É® + < ƛ + < ʎ + < m + <<< m + <<< Í« + = ⅿ + <<< 𝐦 + = 𝑚 + = 𝒎 + = 𝓂 + = 𝓶 + = 𝔪 + = 𝕞 + = 𝖒 + = 𝗆 + = 𝗺 + = 𝘮 + = 𝙢 + = 𝚖 + <<< ⓜ + <<< M + <<< ï¼­ + <<< Ⅿ + <<< ℳ + = 𝐌 + = 𝑀 + = 𝑴 + = 𝓜 + = 𝔐 + = 𝕄 + = 𝕸 + = 𝖬 + = 𝗠 + = 𝘔 + = 𝙈 + = 𝙼 + <<< Ⓜ + <<< á´¹ + = ᵐ + <<< ㎧ / ∕s + <<< ㎨ / ∕s2 + <<< ㎡ / 2 + <<< ㎥ / 3 + <<< ㎃ / A + <<< ㏔ / b + <<< ㎎ / g + <<< ㏕ / il + <<< ㎖ / l + <<< ㎜ / m + <<< ㎟ / m2 + <<< ㎣ / m3 + <<< ㏖ / ol + <<< ㎳ / s + <<< ㎷ / V + <<< ㎽ / W + <<< ㎆ / B + <<< ㎒ / Hz + <<< ㎫ / Pa + <<< ㎹ / V + <<< ㎿ / W + <<< ㏁ / Ω + < ᴍ + < ɱ + < n + <<< n + <<< nj / j + <<< 𝐧 + = 𝑛 + = 𝒏 + = 𝓃 + = 𝓷 + = 𝔫 + = 𝕟 + = 𝖓 + = 𝗇 + = 𝗻 + = 𝘯 + = 𝙣 + = 𝚗 + <<< ⓝ + <<< N + <<< ï¼® + <<< Nj / j + <<< NJ / J + <<< № / o + <<< ℕ + = 𝐍 + = 𝑁 + = 𝑵 + = 𝒩 + = 𝓝 + = 𝔑 + = 𝕹 + = 𝖭 + = 𝗡 + = 𝘕 + = 𝙉 + = 𝙽 + <<< Ⓝ + <<< á´º + = ⁿ + <<< ㎁ / A + <<< ㎋ / F + <<< ㎚ / m + <<< ㎱ / s + <<< ㎵ / V + <<< ㎻ / W + < É´ + < á´» + < ᴎ + < ɲ + <<< Ɲ + < ƞ + <<< È  + < ɳ + < ȵ + < ŋ + <<< Ŋ + <<< ᵑ + < o + <<< o + <<< ͦ + <<< ℴ + = 𝐨 + = 𝑜 + = 𝒐 + = 𝓸 + = 𝔬 + = 𝕠 + = 𝖔 + = 𝗈 + = 𝗼 + = 𝘰 + = 𝙤 + = 𝚘 + <<< ⓞ + <<< O + <<< O + <<< 𝐎 + = 𝑂 + = 𝑶 + = 𝒪 + = 𝓞 + = 𝔒 + = 𝕆 + = 𝕺 + = 𝖮 + = 𝗢 + = 𝘖 + = 𝙊 + = 𝙾 + <<< Ⓞ + <<< º + = á´¼ + = ᵒ + <<< ㍵ / V + << œ / e + <<< Œ / e + < ᴏ + < ᴑ + < ɶ + < ᴔ + < ø + <<< Ø + < ᴓ + < ɔ + <<< Ɔ + <<< ᵓ + < ᴐ + < ᴒ + < ᴖ + <<< ᵔ + < ᴗ + <<< ᵕ + < ɵ + <<< Ɵ + < É· + < È£ + <<< È¢ + <<< á´½ + < ᴕ + < p + <<< p + <<< 𝐩 + = 𝑝 + = 𝒑 + = 𝓅 + = 𝓹 + = 𝔭 + = 𝕡 + = 𝖕 + = 𝗉 + = 𝗽 + = 𝘱 + = 𝙥 + = 𝚙 + <<< ⓟ + <<< P + <<< ï¼° + <<< ℙ + = 𝐏 + = 𝑃 + = 𝑷 + = 𝒫 + = 𝓟 + = 𝔓 + = 𝕻 + = 𝖯 + = 𝗣 + = 𝘗 + = 𝙋 + = 𝙿 + <<< Ⓟ + <<< á´¾ + = ᵖ + <<< ㏘ / '.'m'.' + <<< ㎀ / A + <<< ㍶ / c + <<< ㎊ / F + <<< ㎰ / s + <<< ㎴ / V + <<< ㎺ / W + <<< ㎩ / a + <<< ㏗ / H + <<< ㏙ / Pm + <<< ㏚ / R + <<< ㉐ / Te + < ᴘ + < Æ¥ + <<< Ƥ + < ɸ + < q + <<< q + <<< 𝐪 + = 𝑞 + = 𝒒 + = 𝓆 + = 𝓺 + = 𝔮 + = 𝕢 + = 𝖖 + = 𝗊 + = 𝗾 + = 𝘲 + = 𝙦 + = 𝚚 + <<< ⓠ + <<< Q + <<< ï¼± + <<< ℚ + = 𝐐 + = 𝑄 + = 𝑸 + = 𝒬 + = 𝓠 + = 𝔔 + = 𝕼 + = 𝖰 + = 𝗤 + = 𝘘 + = 𝙌 + = 𝚀 + <<< Ⓠ + < Ê  + < ĸ + < r + <<< r + <<< ͬ + <<< 𝐫 + = 𝑟 + = 𝒓 + = 𝓇 + = 𝓻 + = 𝔯 + = 𝕣 + = 𝖗 + = 𝗋 + = 𝗿 + = 𝘳 + = 𝙧 + = 𝚛 + <<< ⓡ + <<< R + <<< ï¼² + <<< ₨ / s + <<< ℛ + = ℜ + = ℝ + = 𝐑 + = 𝑅 + = 𝑹 + = 𝓡 + = 𝕽 + = 𝖱 + = 𝗥 + = 𝘙 + = 𝙍 + = 𝚁 + <<< Ⓡ + <<< ʳ + = á´¿ + <<< áµ£ + <<< ㎭ / ad + <<< ㎮ / ad∕s + <<< ㎯ / ad∕s2 + < ʀ + <<< Ʀ + < ᴙ + < ɹ + <<< Ê´ + < ᴚ + < ɺ + < É» + <<< ʵ + < ɼ + < ɽ + < ɾ + < É¿ + < ʁ + <<< ʶ + < s + <<< s + <<< st / t + <<< 𝐬 + = 𝑠 + = 𝒔 + = 𝓈 + = 𝓼 + = 𝔰 + = 𝕤 + = 𝖘 + = 𝗌 + = 𝘀 + = 𝘴 + = 𝙨 + = 𝚜 + <<< ⓢ + <<< S + <<< ï¼³ + <<< 𝐒 + = 𝑆 + = 𝑺 + = 𝒮 + = 𝓢 + = 𝔖 + = 𝕊 + = 𝕾 + = 𝖲 + = 𝗦 + = 𝘚 + = 𝙎 + = 𝚂 + <<< Ⓢ + <<< Ë¢ + <<< ℠ / m + <<< ㏛ / r + <<< ㏜ / v + << ß / s + << Å¿ + <<< ſt / t + < ʂ + < ʃ + <<< Æ© + < ƪ + < ʅ + < ʆ + < t + <<< t + <<< Í­ + <<< ʨ / ɕ + <<< ƾ / s + = ʦ / s + <<< ʧ / ʃ + <<< 𝐭 + = 𝑡 + = 𝒕 + = 𝓉 + = 𝓽 + = 𝔱 + = 𝕥 + = 𝖙 + = 𝗍 + = 𝘁 + = 𝘵 + = 𝙩 + = 𝚝 + <<< ⓣ + <<< T + <<< ï¼´ + <<< ℡ / El + <<< 𝐓 + = 𝑇 + = 𝑻 + = 𝒯 + = 𝓣 + = 𝔗 + = 𝕋 + = 𝕿 + = 𝖳 + = 𝗧 + = 𝘛 + = 𝙏 + = 𝚃 + <<< Ⓣ + <<< ᵀ + = ᵗ + <<< ™ / m + <<< ㎔ / Hz + < ᴛ + < ŧ + <<< Ŧ + < Æ« + < Æ­ + <<< Ƭ + < ʈ + <<< Æ® + < ȶ + < ʇ + < u + <<< u + <<< ͧ + <<< 𝐮 + = 𝑢 + = 𝒖 + = 𝓊 + = 𝓾 + = 𝔲 + = 𝕦 + = 𝖚 + = 𝗎 + = 𝘂 + = 𝘶 + = 𝙪 + = 𝚞 + <<< ⓤ + <<< U + <<< ï¼µ + <<< 𝐔 + = 𝑈 + = 𝑼 + = 𝒰 + = 𝓤 + = 𝔘 + = 𝕌 + = 𝖀 + = 𝖴 + = 𝗨 + = 𝘜 + = 𝙐 + = 𝚄 + <<< Ⓤ + <<< ᵁ + = ᵘ + <<< ᵤ + < ᴜ + < ᴝ + <<< ᵙ + < ᴞ + < ᵫ + < ʉ + < É¥ + < Ê® + < ʯ + < ɯ + <<< Ɯ + <<< ᵚ + < ᴟ + < ɰ + < ʊ + <<< Ʊ + < v + <<< v + <<< Í® + = ⅴ + <<< ⅵ / i + <<< ⅶ / ii + <<< ⅷ / iii + <<< 𝐯 + = 𝑣 + = 𝒗 + = 𝓋 + = 𝓿 + = 𝔳 + = 𝕧 + = 𝖛 + = 𝗏 + = 𝘃 + = 𝘷 + = 𝙫 + = 𝚟 + <<< ⓥ + <<< V + <<< ï¼¶ + <<< Ⅴ + <<< Ⅵ / I + <<< Ⅶ / Ii + <<< Ⅷ / Iii + <<< 𝐕 + = 𝑉 + = 𝑽 + = 𝒱 + = 𝓥 + = 𝔙 + = 𝕍 + = 𝖁 + = 𝖵 + = 𝗩 + = 𝘝 + = 𝙑 + = 𝚅 + <<< Ⓥ + <<< ᵛ + <<< áµ¥ + <<< ㏞ / ∕m + < á´  + < ʋ + <<< Ʋ + < ʌ + < w + <<< w + <<< 𝐰 + = 𝑤 + = 𝒘 + = 𝓌 + = 𝔀 + = 𝔴 + = 𝕨 + = 𝖜 + = 𝗐 + = 𝘄 + = 𝘸 + = 𝙬 + = 𝚠 + <<< ⓦ + <<< W + <<< ï¼· + <<< 𝐖 + = 𝑊 + = 𝑾 + = 𝒲 + = 𝓦 + = 𝔚 + = 𝕎 + = 𝖂 + = 𝖶 + = 𝗪 + = 𝘞 + = 𝙒 + = 𝚆 + <<< Ⓦ + <<< Ê· + = ᵂ + <<< ㏝ / b + < á´¡ + < ʍ + < x + <<< x + <<< ͯ + = ⅹ + <<< ⅺ / i + <<< ⅻ / ii + <<< 𝐱 + = 𝑥 + = 𝒙 + = 𝓍 + = 𝔁 + = 𝔵 + = 𝕩 + = 𝖝 + = 𝗑 + = 𝘅 + = 𝘹 + = 𝙭 + = 𝚡 + <<< ⓧ + <<< X + <<< X + <<< Ⅹ + <<< Ⅺ / I + <<< Ⅻ / Ii + <<< 𝐗 + = 𝑋 + = 𝑿 + = 𝒳 + = 𝓧 + = 𝔛 + = 𝕏 + = 𝖃 + = 𝖷 + = 𝗫 + = 𝘟 + = 𝙓 + = 𝚇 + <<< Ⓧ + <<< Ë£ + < y + <<< y + <<< 𝐲 + = 𝑦 + = 𝒚 + = 𝓎 + = 𝔂 + = 𝔶 + = 𝕪 + = 𝖞 + = 𝗒 + = 𝘆 + = 𝘺 + = 𝙮 + = 𝚢 + <<< ⓨ + <<< Y + <<< ï¼¹ + <<< 𝐘 + = 𝑌 + = 𝒀 + = 𝒴 + = 𝓨 + = 𝔜 + = 𝕐 + = 𝖄 + = 𝖸 + = 𝗬 + = 𝘠 + = 𝙔 + = 𝚈 + <<< Ⓨ + <<< ʸ + < ʏ + < Æ´ + <<< Ƴ + < z + <<< z + <<< ƍ / w + <<< 𝐳 + = 𝑧 + = 𝒛 + = 𝓏 + = 𝔃 + = 𝔷 + = 𝕫 + = 𝖟 + = 𝗓 + = 𝘇 + = 𝘻 + = 𝙯 + = 𝚣 + <<< ⓩ + <<< Z + <<< Z + <<< ℤ + = ℨ + = 𝐙 + = 𝑍 + = 𝒁 + = 𝒵 + = 𝓩 + = 𝖅 + = 𝖹 + = 𝗭 + = 𝘡 + = 𝙕 + = 𝚉 + <<< Ⓩ + < á´¢ + < ƶ + <<< Ƶ + < È¥ + <<< Ȥ + < ʐ + < ʑ + < ʒ + <<< Æ· + < á´£ + < ƹ + <<< Ƹ + < ƺ + < ʓ + < ȝ + <<< Ȝ + < þ + <<< Þ + < Æ¿ + <<< Ç· + < Æ» + < ƨ + <<< Ƨ + < ƽ + <<< Ƽ + < ƅ + <<< Ƅ + < ʔ + < ˀ + < ʼ + <<< ʼn / n + < Ë® + < ʾ + < ʕ + <<< ˤ + < Ê¿ + < ˁ + < á´¤ + < á´¥ + <<< ᵜ + < Ê¡ + < Ê¢ + < ʖ + < ǀ + < ǁ + < ǂ + < ǃ + < ʗ + < ʘ + < ʬ + < Ê­ + < α + <<< 𝛂 + = 𝛼 + = 𝜶 + = 𝝰 + = 𝞪 + <<< Α + <<< 𝚨 + = 𝛢 + = 𝜜 + = 𝝖 + = 𝞐 + < β + <<< ϐ + <<< 𝛃 + = 𝛽 + = 𝜷 + = 𝝱 + = 𝞫 + <<< Β + <<< 𝚩 + = 𝛣 + = 𝜝 + = 𝝗 + = 𝞑 + <<< ᵝ + <<< ᵦ + < γ + <<< ℽ + = 𝛄 + = 𝛾 + = 𝜸 + = 𝝲 + = 𝞬 + <<< Γ + <<< ℾ + = 𝚪 + = 𝛤 + = 𝜞 + = 𝝘 + = 𝞒 + <<< ᵞ + <<< áµ§ + < á´¦ + < δ + <<< 𝛅 + = 𝛿 + = 𝜹 + = 𝝳 + = 𝞭 + <<< Δ + <<< 𝚫 + = 𝛥 + = 𝜟 + = 𝝙 + = 𝞓 + <<< ᵟ + < ε + <<< ϵ + <<< 𝛆 + = 𝛜 + = 𝜀 + = 𝜖 + = 𝜺 + = 𝝐 + = 𝝴 + = 𝞊 + = 𝞮 + = 𝟄 + <<< Ε + <<< 𝚬 + = 𝛦 + = 𝜠 + = 𝝚 + = 𝞔 + < ϝ + <<< Ϝ + < ϛ + <<< Ϛ + < ζ + <<< 𝛇 + = 𝜁 + = 𝜻 + = 𝝵 + = 𝞯 + <<< Ζ + <<< 𝚭 + = 𝛧 + = 𝜡 + = 𝝛 + = 𝞕 + < η + <<< 𝛈 + = 𝜂 + = 𝜼 + = 𝝶 + = 𝞰 + <<< Η + <<< 𝚮 + = 𝛨 + = 𝜢 + = 𝝜 + = 𝞖 + < θ + <<< ϑ + <<< 𝛉 + = 𝛝 + = 𝜃 + = 𝜗 + = 𝜽 + = 𝝑 + = 𝝷 + = 𝞋 + = 𝞱 + = 𝟅 + <<< Θ + <<< Ï´ + <<< 𝚯 + = 𝚹 + = 𝛩 + = 𝛳 + = 𝜣 + = 𝜭 + = 𝝝 + = 𝝧 + = 𝞗 + = 𝞡 + < ι + <<< ͺ + <<< 𝛊 + = 𝜄 + = 𝜾 + = 𝝸 + = 𝞲 + <<< Ι + <<< 𝚰 + = 𝛪 + = 𝜤 + = 𝝞 + = 𝞘 + < ϳ + < κ + <<< ϰ + <<< ϗ / αι + <<< 𝛋 + = 𝛞 + = 𝜅 + = 𝜘 + = 𝜿 + = 𝝒 + = 𝝹 + = 𝞌 + = 𝞳 + = 𝟆 + <<< Κ + <<< 𝚱 + = 𝛫 + = 𝜥 + = 𝝟 + = 𝞙 + < λ + <<< 𝛌 + = 𝜆 + = 𝝀 + = 𝝺 + = 𝞴 + <<< Λ + <<< 𝚲 + = 𝛬 + = 𝜦 + = 𝝠 + = 𝞚 + < á´§ + < μ + <<< µ + <<< 𝛍 + = 𝜇 + = 𝝁 + = 𝝻 + = 𝞵 + <<< Μ + <<< 𝚳 + = 𝛭 + = 𝜧 + = 𝝡 + = 𝞛 + <<< ㎂ / A + <<< ㎌ / F + <<< ㎍ / g + <<< ㎕ / l + <<< ㎛ / m + <<< ㎲ / s + <<< ㎶ / V + <<< ㎼ / W + < ν + <<< 𝛎 + = 𝜈 + = 𝝂 + = 𝝼 + = 𝞶 + <<< Ν + <<< 𝚴 + = 𝛮 + = 𝜨 + = 𝝢 + = 𝞜 + < ξ + <<< 𝛏 + = 𝜉 + = 𝝃 + = 𝝽 + = 𝞷 + <<< Ξ + <<< 𝚵 + = 𝛯 + = 𝜩 + = 𝝣 + = 𝞝 + < ο + <<< 𝛐 + = 𝜊 + = 𝝄 + = 𝝾 + = 𝞸 + <<< Ο + <<< 𝚶 + = 𝛰 + = 𝜪 + = 𝝤 + = 𝞞 + < π + <<< ϖ + <<< 𝛑 + = 𝛡 + = 𝜋 + = 𝜛 + = 𝝅 + = 𝝕 + = 𝝿 + = 𝞏 + = 𝞹 + = 𝟉 + <<< Π + <<< ℿ + = 𝚷 + = 𝛱 + = 𝜫 + = 𝝥 + = 𝞟 + < á´¨ + < ϟ + <<< Ϟ + < ϙ + <<< Ϙ + < ρ + <<< ϱ + <<< 𝛒 + = 𝛠 + = 𝜌 + = 𝜚 + = 𝝆 + = 𝝔 + = 𝞀 + = 𝞎 + = 𝞺 + = 𝟈 + <<< Ρ + <<< 𝚸 + = 𝛲 + = 𝜬 + = 𝝦 + = 𝞠 + <<< ᵨ + < á´© + < σ + <<< ϲ + <<< 𝛓 + = 𝛔 + = 𝜍 + = 𝜎 + = 𝝇 + = 𝝈 + = 𝞁 + = 𝞂 + = 𝞻 + = 𝞼 + <<< Σ + <<< Ϲ + <<< 𝚺 + = 𝛴 + = 𝜮 + = 𝝨 + = 𝞢 + <<< ς + < τ + <<< 𝛕 + = 𝜏 + = 𝝉 + = 𝞃 + = 𝞽 + <<< Τ + <<< 𝚻 + = 𝛵 + = 𝜯 + = 𝝩 + = 𝞣 + < υ + <<< 𝛖 + = 𝜐 + = 𝝊 + = 𝞄 + = 𝞾 + <<< Î¥ + <<< ϒ + <<< 𝚼 + = 𝛶 + = 𝜰 + = 𝝪 + = 𝞤 + < φ + <<< ϕ + <<< 𝛗 + = 𝛟 + = 𝜑 + = 𝜙 + = 𝝋 + = 𝝓 + = 𝞅 + = 𝞍 + = 𝞿 + = 𝟇 + <<< Φ + <<< 𝚽 + = 𝛷 + = 𝜱 + = 𝝫 + = 𝞥 + <<< áµ  + <<< ᵩ + < χ + <<< 𝛘 + = 𝜒 + = 𝝌 + = 𝞆 + = 𝟀 + <<< Χ + <<< 𝚾 + = 𝛸 + = 𝜲 + = 𝝬 + = 𝞦 + <<< ᵡ + <<< ᵪ + < ψ + <<< 𝛙 + = 𝜓 + = 𝝍 + = 𝞇 + = 𝟁 + <<< Ψ + <<< 𝚿 + = 𝛹 + = 𝜳 + = 𝝭 + = 𝞧 + < á´ª + < ω + <<< 𝛚 + = 𝜔 + = 𝝎 + = 𝞈 + = 𝟂 + <<< Ω + <<< 𝛀 + = 𝛺 + = 𝜴 + = 𝝮 + = 𝞨 + < Ï¡ + <<< Ï  + < ϸ + <<< Ï· + < Ï» + <<< Ϻ + < Ï£ + <<< Ï¢ + < Ï¥ + <<< Ϥ + < ϧ + <<< Ϧ + < Ï© + <<< Ϩ + < Ï« + <<< Ϫ + < Ï­ + <<< Ϭ + < ϯ + <<< Ï® + < а + <<< А + < ӑ + <<< Ӑ + < ӓ + <<< Ӓ + < ә + <<< Ә + < ӛ + <<< Ӛ + < ӕ + <<< Ӕ + < б + <<< Б + < в + <<< В + < г + <<< Г + << ґ + <<< Ґ + < ғ + <<< Ғ + < ҕ + <<< Ҕ + < д + <<< Д + < ԁ + <<< Ԁ + < ђ + <<< Ђ + < ԃ + <<< Ԃ + < ѓ + <<< Ѓ + < ҙ + <<< Ҙ + < е + <<< Е + < ӗ + <<< Ӗ + < є + <<< Є + < ж + <<< Ж + < ӝ + <<< Ӝ + < җ + <<< Җ + < з + <<< З + < ԅ + <<< Ԅ + < ӟ + <<< Ӟ + < ѕ + <<< Ѕ + < Ó¡ + <<< Ó  + < ԇ + <<< Ԇ + < и + <<< И + < ҋ + <<< Ҋ + < Ó¥ + <<< Ó¤ + < і + <<< І + < ї + <<< Ї + < й + <<< Й + < ј + <<< Ј + < к + <<< К + < қ + <<< Қ + < ӄ + <<< Ӄ + < Ò¡ + <<< Ò  + < ҟ + <<< Ҟ + < ҝ + <<< Ҝ + < л + <<< Л + < á´« + < ӆ + <<< Ӆ + < љ + <<< Љ + < ԉ + <<< Ԉ + < м + <<< М + < ӎ + <<< Ӎ + < н + <<< Н + < ӊ + <<< Ӊ + < Ò£ + <<< Ò¢ + < ӈ + <<< Ӈ + < Ò¥ + <<< Ò¤ + < њ + <<< Њ + < ԋ + <<< Ԋ + < о + <<< О + < Ó§ + <<< Ó¦ + < Ó© + <<< Ó¨ + < Ó« + <<< Óª + < п + <<< П + < Ò§ + <<< Ò¦ + < ҁ + <<< Ҁ + < р + <<< Р + < ҏ + <<< Ҏ + < с + <<< С + < ԍ + <<< Ԍ + < Ò« + <<< Òª + < т + <<< Т + < ԏ + <<< Ԏ + < Ò­ + <<< Ò¬ + < ћ + <<< Ћ + < ќ + <<< Ќ + < у + <<< У + < ў + <<< Ў + < Ó± + <<< Ó° + < Ó³ + <<< Ó² + < Ò¯ + <<< Ò® + < Ò± + <<< Ò° + < ѹ + <<< Ѹ + < ф + <<< Ф + < х + <<< Ð¥ + < Ò³ + <<< Ò² + < Ò» + <<< Òº + < Ñ¡ + <<< Ñ  + < Ñ¿ + <<< Ѿ + < ѽ + <<< Ѽ + < Ñ» + <<< Ѻ + < ц + <<< Ц + < Òµ + <<< Ò´ + < ч + <<< Ч + < Óµ + <<< Ó´ + < Ò· + <<< Ò¶ + < ӌ + <<< Ӌ + < Ò¹ + <<< Ò¸ + < Ò½ + <<< Ò¼ + < Ò¿ + <<< Ò¾ + < џ + <<< Џ + < ш + <<< Ш + < щ + <<< Щ + < ъ + <<< Ъ + < ы + <<< Ы + < Ó¹ + <<< Ó¸ + < ь + <<< Ь + < ҍ + <<< Ҍ + < Ñ£ + <<< Ñ¢ + < э + <<< Э + < Ó­ + <<< Ó¬ + < ю + <<< Ю + < я + <<< Я + < Ñ¥ + <<< Ѥ + < ѧ + <<< Ѧ + < Ñ« + <<< Ѫ + < Ñ© + <<< Ѩ + < Ñ­ + <<< Ѭ + < ѯ + <<< Ñ® + < ѱ + <<< Ѱ + < ѳ + <<< Ѳ + < ѵ + <<< Ñ´ + < Ñ· + <<< Ѷ + < Ò© + <<< Ò¨ + < Ӏ + < ა + <<< Ⴀ + < ბ + <<< Ⴁ + < გ + <<< Ⴂ + < დ + <<< Ⴃ + < ე + <<< Ⴄ + < ვ + <<< Ⴅ + < ზ + <<< Ⴆ + < ჱ + <<< Ⴡ + < თ + <<< Ⴇ + < ი + <<< Ⴈ + < კ + <<< Ⴉ + < ლ + <<< Ⴊ + < მ + <<< Ⴋ + < ნ + <<< Ⴌ + < ჲ + <<< Ⴢ + < ო + <<< Ⴍ + < პ + <<< Ⴎ + < ჟ + <<< Ⴏ + < რ + <<< Ⴐ + < ს + <<< Ⴑ + < ტ + <<< Ⴒ + < ჳ + <<< Ⴣ + < უ + <<< Ⴓ + < ფ + <<< Ⴔ + < ქ + <<< Ⴕ + < ღ + <<< Ⴖ + < ყ + <<< Ⴗ + < შ + <<< Ⴘ + < ჩ + <<< Ⴙ + < ც + <<< Ⴚ + < ძ + <<< Ⴛ + < წ + <<< Ⴜ + < ჭ + <<< Ⴝ + < ხ + <<< Ⴞ + < ჴ + <<< Ⴤ + < ჯ + <<< Ⴟ + < ჰ + <<< Ⴠ + < ჵ + <<< Ⴥ + < ჶ + < ჷ + < ჸ + < Õ¡ + <<< Ô± + < Õ¢ + <<< Ô² + < Õ£ + <<< Ô³ + < Õ¤ + <<< Ô´ + < Õ¥ + <<< և / ւ + <<< Ôµ + < Õ¦ + <<< Ô¶ + < Õ§ + <<< Ô· + < Õ¨ + <<< Ô¸ + < Õ© + <<< Ô¹ + < Õª + <<< Ôº + < Õ« + <<< Ô» + < Õ¬ + <<< Ô¼ + < Õ­ + <<< Ô½ + < Õ® + <<< Ô¾ + < Õ¯ + <<< Ô¿ + < Õ° + <<< Հ + < Õ± + <<< Ձ + < Õ² + <<< Ղ + < Õ³ + <<< Ճ + < Õ´ + <<< ﬔ / Õ¥ + <<< ﬕ / Õ« + <<< ﬗ / Õ­ + <<< ﬓ / Õ¶ + <<< Մ + < Õµ + <<< Յ + < Õ¶ + <<< Ն + < Õ· + <<< Շ + < Õ¸ + <<< Ո + < Õ¹ + <<< Չ + < Õº + <<< Պ + < Õ» + <<< Ջ + < Õ¼ + <<< Ռ + < Õ½ + <<< Ս + < Õ¾ + <<< ﬖ / Õ¶ + <<< Վ + < Õ¿ + <<< Տ + < ր + <<< Ր + < ց + <<< Ց + < ւ + <<< Ւ + < փ + <<< Փ + < ք + <<< Ք + < օ + <<< Օ + < ֆ + <<< Ֆ + < ՙ + < א + <<< ℵ + <<< ﭏ / ל + <<< ﬡ + < ב + <<< ℶ + < ג + <<< ℷ + < ד + <<< ℸ + <<< ﬢ + < ה + <<< ﬣ + < ו + <<< ×° / ו + <<< ×± / י + < ז + < ח + < ט + < י + <<< ײ / י + < כ + <<< ﬤ + <<< ך + < ל + <<< ﬥ + < מ + <<< ﬦ + <<< ם + < ×  + <<< ן + < ס + < ×¢ + <<< ﬠ + < פ + <<< ×£ + < צ + <<< ×¥ + < ×§ + < ר + <<< ﬧ + < ש + < ת + <<< ﬨ + < Ø¡ + <<< Ù´ + <<< ﺀ + << Û½ + < Ø¢ + <<< ﺂ + <<< ﺁ + < Ø£ + <<< ﺄ + <<< ﺃ + < Ù² + < Ù± + <<< ﭑ + <<< ﭐ + < ؤ + <<< ﺆ + <<< ﺅ + < Ø¥ + <<< ﺈ + <<< ﺇ + < Ù³ + < ئ + <<< ﺋ + <<< ﲗ / ج + <<< ﲘ / Ø­ + <<< ﲙ / Ø® + <<< ﲚ / م + <<< ﲛ / ه + <<< ﯻ / ى + <<< ﯸ / ې + <<< ﺌ + <<< ﳟ / م + <<< ï³  / ه + <<< ﺊ + <<< ﯫ / ا + <<< ﱤ / ر + <<< ï±¥ / ز + <<< ﱦ / م + <<< ï±§ / ن + <<< ﯭ / ە + <<< ﯯ / و + <<< ﯳ / ۆ + <<< ﯱ / ۇ + <<< ﯵ / ۈ + <<< ﯺ / ى + = ﱨ / ى + <<< ﱩ / ي + <<< ﯷ / ې + <<< ﺉ + <<< ﯪ / ا + <<< ﰀ / ج + <<< ﰁ / Ø­ + <<< ﰂ / م + <<< ﯬ / ە + <<< ﯮ / و + <<< ﯲ / ۆ + <<< ﯰ / ۇ + <<< ﯴ / ۈ + <<< ﯹ / ى + = ﰃ / ى + <<< ﰄ / ي + <<< ﯶ / ې + < ا + <<< Ùµ / Ø¡ + <<< ﺎ + <<< ï´¼ / ً + <<< ﺍ + <<< ï´½ / ً + <<< ï·³ / كبر + <<< ï·² / لله + < Ù® + < ب + <<< ﺑ + <<< ﲜ / ج + <<< ﲝ / Ø­ + <<< ﲞ / Ø® + <<< ﲟ / م + <<< ï²  / ه + <<< ﺒ + <<< ﳡ / م + <<< ï³¢ / ه + <<< ﺐ + <<< ﷂ / حي + <<< ﶞ / خي + <<< ﱪ / ر + <<< ﱫ / ز + <<< ﱬ / م + <<< ï±­ / ن + <<< ï±® / ى + <<< ﱯ / ي + <<< ﺏ + <<< ﰅ / ج + <<< ﰆ / Ø­ + <<< ﰇ / Ø® + <<< ﰈ / م + <<< ﰉ / ى + <<< ﰊ / ي + < Ù» + <<< ﭔ + <<< ﭕ + <<< ﭓ + <<< ﭒ + < Ù¾ + <<< ﭘ + <<< ﭙ + <<< ﭗ + <<< ﭖ + < ڀ + <<< ﭜ + <<< ﭝ + <<< ﭛ + <<< ﭚ + < Ø© + <<< ﺔ + <<< ﺓ + < ت + <<< ﺗ + <<< ﲡ / ج + <<< ﵐ / جم + <<< ï²¢ / Ø­ + <<< ﵒ / حج + <<< ﵓ / حم + <<< ï²£ / Ø® + <<< ﵔ / خم + <<< ﲤ / م + <<< ﵕ / مج + <<< ﵖ / مح + <<< ﵗ / مخ + <<< ï²¥ / ه + <<< ﺘ + <<< ï³£ / م + <<< ﳤ / ه + <<< ﺖ + <<< ï¶  / جى + <<< ﶟ / جي + <<< ﵑ / حج + <<< ï¶¢ / خى + <<< ï¶¡ / خي + <<< ï±° / ر + <<< ï±± / ز + <<< ï±² / م + <<< ﶤ / مى + <<< ï¶£ / مي + <<< ï±³ / ن + <<< ï±´ / ى + <<< ï±µ / ي + <<< ﺕ + <<< ﰋ / ج + <<< ﰌ / Ø­ + <<< ﰍ / Ø® + <<< ﰎ / م + <<< ﰏ / ى + <<< ﰐ / ي + < Ø« + <<< ﺛ + <<< ﲦ / م + <<< ﺜ + <<< ï³¥ / م + <<< ﳦ / ه + <<< ﺚ + <<< ï±¶ / ر + <<< ï±· / ز + <<< ﱸ / م + <<< ï±¹ / ن + <<< ﱺ / ى + <<< ï±» / ي + <<< ﺙ + <<< ﰑ / ج + <<< ﰒ / م + <<< ﰓ / ى + <<< ﰔ / ي + < Ù¹ + <<< ï­¨ + <<< ï­© + <<< ï­§ + <<< ï­¦ + < Ùº + <<< ï­  + <<< ï­¡ + <<< ﭟ + <<< ﭞ + < Ù¼ + < Ù½ + < Ù¿ + <<< ï­¤ + <<< ï­¥ + <<< ï­£ + <<< ï­¢ + < ج + <<< ﺟ + <<< ï²§ / Ø­ + <<< ﲨ / م + <<< ﵙ / مح + <<< ﺠ + <<< ﺞ + <<< ﶦ / حى + <<< ï¶¾ / حي + <<< ﵘ / مح + <<< ï¶§ / مى + <<< ï¶¥ / مي + <<< ﴝ / ى + <<< ﴞ / ي + <<< ﺝ + <<< ﰕ / Ø­ + <<< ï·» / ل' 'جلاله + <<< ﰖ / م + <<< ﴁ / ى + <<< ﴂ / ي + < ڃ + <<< ï­¸ + <<< ï­¹ + <<< ï­· + <<< ï­¶ + < ڄ + <<< ï­´ + <<< ï­µ + <<< ï­³ + <<< ï­² + < چ + <<< ï­¼ + <<< ï­½ + <<< ï­» + <<< ï­º + < Ú¿ + < ڇ + <<< ﮀ + <<< ﮁ + <<< ï­¿ + <<< ï­¾ + < Ø­ + <<< ﺣ + <<< ﲩ / ج + <<< ﲪ / م + <<< ﺤ + <<< ﺢ + <<< ï¶¿ / جي + <<< ﵛ / مى + <<< ﵚ / مي + <<< ﴛ / ى + <<< ﴜ / ي + <<< ﺡ + <<< ﰗ / ج + <<< ﰘ / م + <<< ﳿ / ى + <<< ﴀ / ي + < Ø® + <<< ﺧ + <<< ﲫ / ج + <<< ﲬ / م + <<< ﺨ + <<< ﺦ + <<< ﴟ / ى + <<< ï´  / ي + <<< ﺥ + <<< ﰙ / ج + <<< ﰚ / Ø­ + <<< ﰛ / م + <<< ﴃ / ى + <<< ﴄ / ي + < ځ + < ڂ + < څ + < د + <<< ﺪ + <<< ﺩ + < ذ + <<< ﺬ + <<< ﺫ + <<< ﱛ / Ù° + < ڈ + <<< ﮉ + <<< ﮈ + < ډ + < ڊ + < ڋ + < ڌ + <<< ﮅ + <<< ﮄ + < ڍ + <<< ﮃ + <<< ﮂ + < ڎ + <<< ﮇ + <<< ﮆ + < ڏ + < ڐ + < Û® + < ر + <<< ﺮ + <<< ﺭ + <<< ﱜ / Ù° + <<< ï·¶ / سول + <<< ï·¼ / یال + < ز + <<< ﺰ + <<< ﺯ + < ڑ + <<< ﮍ + <<< ﮌ + < ڒ + < ړ + < ڔ + < ڕ + < ږ + < ڗ + < ژ + <<< ﮋ + <<< ﮊ + < ڙ + < Û¯ + < س + <<< ﺳ + <<< ï²­ / ج + <<< ﵝ / جح + <<< ï²® / Ø­ + <<< ﵜ / حج + <<< ﲯ / Ø® + <<< ï²° / م + <<< ﵡ / مج + <<< ïµ  / مح + <<< ïµ£ / مم + <<< ï´± / ه + <<< ﺴ + <<< ï´´ / ج + <<< ï´µ / Ø­ + <<< ï´¶ / Ø® + <<< ï³§ / م + <<< ﳨ / ه + <<< ﺲ + <<< ﵞ / جى + <<< ﶨ / خى + <<< ﷆ / خي + <<< ï´ª / ر + <<< ﵟ / مح + <<< ïµ¢ / مم + <<< ﴗ / ى + <<< ﴘ / ي + <<< ﺱ + <<< ﰜ / ج + <<< ﰝ / Ø­ + <<< ﰞ / Ø® + <<< ﴎ / ر + <<< ﰟ / م + <<< ï³» / ى + <<< ï³¼ / ي + < Ø´ + <<< ﺷ + <<< ï´­ / ج + <<< ï´® / Ø­ + <<< ﵨ / حم + <<< ï´¯ / Ø® + <<< ï´° / م + <<< ﵫ / مخ + <<< ïµ­ / مم + <<< ï´² / ه + <<< ﺸ + <<< ï´· / ج + <<< ï´¸ / Ø­ + <<< ï´¹ / Ø® + <<< ﳩ / م + <<< ﳪ / ه + <<< ﺶ + <<< ï´¥ / ج + <<< ﵩ / جي + <<< ï´¦ / Ø­ + <<< ïµ§ / حم + <<< ﶪ / حي + <<< ï´§ / Ø® + <<< ï´© / ر + <<< ï´¨ / م + <<< ﵪ / مخ + <<< ﵬ / مم + <<< ﴙ / ى + <<< ﴚ / ي + <<< ﺵ + <<< ﴉ / ج + <<< ﴊ / Ø­ + <<< ﴋ / Ø® + <<< ﴍ / ر + <<< ﴌ / م + <<< ï³½ / ى + <<< ï³¾ / ي + < ښ + < ڛ + < ڜ + < Ûº + < ص + <<< ﺻ + <<< ï²± / Ø­ + <<< ïµ¥ / حح + <<< ï²² / Ø® + <<< ï²³ / م + <<< ﷅ / مم + <<< ﺼ + <<< ﺺ + <<< ﵤ / حح + <<< ï¶© / حي + <<< ï´« / ر + <<< ﵦ / مم + <<< ï´¡ / ى + <<< ï´¢ / ي + <<< ﺹ + <<< ï°  / Ø­ + <<< ﴏ / ر + <<< ï·µ / لعم + <<< ï·¹ / لى + <<< ï·º / لى' 'الله' 'عليه' 'وسلم + <<< ï·° / لے + <<< ï°¡ / م + <<< ﴅ / ى + <<< ﴆ / ي + < ض + <<< ﺿ + <<< ï²´ / ج + <<< ï²µ / Ø­ + <<< ï²¶ / Ø® + <<< ïµ° / خم + <<< ï²· / م + <<< ﻀ + <<< ﺾ + <<< ïµ® / حى + <<< ï¶« / حي + <<< ﵯ / خم + <<< ï´¬ / ر + <<< ï´£ / ى + <<< ï´¤ / ي + <<< ﺽ + <<< ï°¢ / ج + <<< ï°£ / Ø­ + <<< ï°¤ / Ø® + <<< ﴐ / ر + <<< ï°¥ / م + <<< ﴇ / ى + <<< ﴈ / ي + < ڝ + < ڞ + < Û» + < Ø· + <<< ﻃ + <<< ﲸ / Ø­ + <<< ï´³ / م + <<< ïµ² / مح + <<< ïµ³ / مم + <<< ﻄ + <<< ï´º / م + <<< ﻂ + <<< ïµ± / مح + <<< ïµ´ / مي + <<< ﴑ / ى + <<< ﴒ / ي + <<< ﻁ + <<< ï°¦ / Ø­ + <<< ï°§ / م + <<< ï³µ / ى + <<< ï³¶ / ي + < ظ + <<< ﻇ + <<< ï²¹ / م + <<< ﻈ + <<< ï´» / م + <<< ﻆ + <<< ﻅ + <<< ï°¨ / م + < ڟ + < ع + <<< ﻋ + <<< ﲺ / ج + <<< ﷄ / جم + <<< ï²» / م + <<< ïµ· / مم + <<< ﻌ + <<< ﻊ + <<< ïµµ / جم + <<< ïµ¶ / مم + <<< ﵸ / مى + <<< ï¶¶ / مي + <<< ﴓ / ى + <<< ﴔ / ي + <<< ﻉ + <<< ï°© / ج + <<< ï·· / ليه + <<< ï°ª / م + <<< ï³· / ى + <<< ﳸ / ي + < غ + <<< ﻏ + <<< ï²¼ / ج + <<< ï²½ / م + <<< ﻐ + <<< ﻎ + <<< ïµ¹ / مم + <<< ïµ» / مى + <<< ﵺ / مي + <<< ﴕ / ى + <<< ﴖ / ي + <<< ﻍ + <<< ï°« / ج + <<< ï°¬ / م + <<< ï³¹ / ى + <<< ﳺ / ي + < Ú  + < Û¼ + < ف + <<< ﻓ + <<< ï²¾ / ج + <<< ﲿ / Ø­ + <<< ﳀ / Ø® + <<< ïµ½ / خم + <<< ﳁ / م + <<< ﻔ + <<< ﻒ + <<< ïµ¼ / خم + <<< ﷁ / مي + <<< ï±¼ / ى + <<< ï±½ / ي + <<< ﻑ + <<< ï°­ / ج + <<< ï°® / Ø­ + <<< ï°¯ / Ø® + <<< ï°° / م + <<< ï°± / ى + <<< ï°² / ي + < Ú¡ + < Ú¢ + < Ú£ + < Ú¤ + <<< ï­¬ + <<< ï­­ + <<< ï­« + <<< ï­ª + < Ú¥ + < Ú¦ + <<< ï­° + <<< ï­± + <<< ï­¯ + <<< ï­® + < Ù¯ + < ق + <<< ﻗ + <<< ﳂ / Ø­ + <<< ﳃ / م + <<< ï¶´ / مح + <<< ﻘ + <<< ﻖ + <<< ïµ¾ / مح + <<< ﵿ / مم + <<< ï¶² / مي + <<< ï±¾ / ى + <<< ﱿ / ي + <<< ﻕ + <<< ï°³ / Ø­ + <<< ï·± / لے + <<< ï°´ / م + <<< ï°µ / ى + <<< ï°¶ / ي + < Ú§ + < Ú¨ + < ك + <<< ﻛ + <<< ﳄ / ج + <<< ﳅ / Ø­ + <<< ﳆ / Ø® + <<< ﳇ / ل + <<< ﳈ / م + <<< ﷃ / مم + <<< ﻜ + <<< ﳫ / ل + <<< ﳬ / م + <<< ﻚ + <<< ﲀ / ا + <<< ﲁ / ل + <<< ﲂ / م + <<< ï¶» / مم + <<< ï¶· / مي + <<< ﲃ / ى + <<< ﲄ / ي + <<< ﻙ + <<< ï°· / ا + <<< ï°¸ / ج + <<< ï°¹ / Ø­ + <<< ï°º / Ø® + <<< ï°» / ل + <<< ï°¼ / م + <<< ï°½ / ى + <<< ï°¾ / ي + < Ú© + <<< ﮐ + <<< ﮑ + <<< ﮏ + <<< ﮎ + < Úª + < Ú« + < Ú¬ + < Ú­ + <<< ﯕ + <<< ﯖ + <<< ﯔ + <<< ﯓ + < Ú® + < Ú¯ + <<< ﮔ + <<< ﮕ + <<< ﮓ + <<< ﮒ + < Ú° + < Ú± + <<< ﮜ + <<< ﮝ + <<< ﮛ + <<< ﮚ + < Ú² + < Ú³ + <<< ﮘ + <<< ﮙ + <<< ﮗ + <<< ﮖ + < Ú´ + < ل + <<< ﻟ + <<< ﳉ / ج + <<< ﶃ / جج + <<< ﶺ / جم + <<< ﳊ / Ø­ + <<< ï¶µ / حم + <<< ﳋ / Ø® + <<< ﶆ / خم + <<< ﳌ / م + <<< ﶈ / مح + <<< ﳍ / ه + <<< ï»  + <<< ï³­ / م + <<< ﻞ + <<< ï»¶ / Ø¢ + <<< ﻸ / Ø£ + <<< ﻺ / Ø¥ + <<< ﻼ / ا + <<< ﶄ / جج + <<< ï¶¼ / جم + <<< ﶬ / جي + <<< ﶀ / حم + <<< ﶂ / حى + <<< ﶁ / حي + <<< ﶅ / خم + <<< ﲅ / م + <<< ﶇ / مح + <<< ï¶­ / مي + <<< ﲆ / ى + <<< ﲇ / ي + <<< ﻝ + <<< ﻵ / Ø¢ + <<< ï»· / Ø£ + <<< ﻹ / Ø¥ + <<< ï»» / ا + <<< ï°¿ / ج + <<< ﱀ / Ø­ + <<< ﱁ / Ø® + <<< ﱂ / م + <<< ﱃ / ى + <<< ﱄ / ي + < Úµ + < Ú¶ + < Ú· + < Ú¸ + < م + <<< ﻣ + <<< ﳎ / ج + <<< ﶌ / جح + <<< ﶒ / جخ + <<< ﶍ / جم + <<< ﳏ / Ø­ + <<< ﶉ / حج + <<< ﶊ / حم + <<< ﳐ / Ø® + <<< ﶎ / خج + <<< ﶏ / خم + <<< ﳑ / م + <<< ﻤ + <<< ﻢ + <<< ﲈ / ا + <<< ﷀ / جي + <<< ﶋ / حي + <<< ï¶¹ / خي + <<< ﲉ / م + <<< ï¶± / مي + <<< ﻡ + <<< ﱅ / ج + <<< ﱆ / Ø­ + <<< ï·´ / حمد + <<< ﱇ / Ø® + <<< ﱈ / م + <<< ﱉ / ى + <<< ﱊ / ي + << Û¾ + < ن + <<< ï»§ + <<< ﳒ / ج + <<< ﶸ / جح + <<< ﶘ / جم + <<< ﳓ / Ø­ + <<< ﶕ / حم + <<< ﳔ / Ø® + <<< ﳕ / م + <<< ﳖ / ه + <<< ﻨ + <<< ï³® / م + <<< ﳯ / ه + <<< ﻦ + <<< ï¶½ / جح + <<< ﶗ / جم + <<< ﶙ / جى + <<< ﷇ / جي + <<< ﶖ / حى + <<< ï¶³ / حي + <<< ﲊ / ر + <<< ﲋ / ز + <<< ﲌ / م + <<< ﶛ / مى + <<< ﶚ / مي + <<< ﲍ / ن + <<< ﲎ / ى + <<< ﲏ / ي + <<< ﻥ + <<< ﱋ / ج + <<< ﱌ / Ø­ + <<< ﱍ / Ø® + <<< ﱎ / م + <<< ﱏ / ى + <<< ﱐ / ي + < Úº + <<< ﮟ + <<< ﮞ + < Ú» + <<< ﮢ + <<< ﮣ + <<< ﮡ + <<< ï®  + < Ú¼ + < Ú½ + < Ú¹ + < ه + <<< ﻫ + <<< ﳙ / Ù° + <<< ﳗ / ج + <<< ﳘ / م + <<< ﶓ / مج + <<< ﶔ / مم + <<< ﻬ + <<< ﻪ + <<< ﻩ + <<< ﱑ / ج + <<< ﱒ / م + <<< ﱓ / ى + <<< ﱔ / ي + < Ú¾ + <<< ﮬ + <<< ï®­ + <<< ﮫ + <<< ﮪ + < ہ + <<< ﮨ + <<< ﮩ + <<< ï®§ + <<< ﮦ + < ۃ + < Û¿ + < ە + <<< ﮥ / ٔ + <<< ﮤ / ٔ + < و + <<< Û¥ + <<< Ù¶ / Ø¡ + <<< ï»® + <<< ï»­ + <<< ï·¸ / سلم + < ۄ + < ۅ + <<< ﯡ + <<< ﯠ + < ۆ + <<< ﯚ + <<< ﯙ + < ۇ + <<< Ù· / Ø¡ + <<< ﯘ + <<< ﯗ + <<< ﯝ / Ø¡ + < ۈ + <<< ﯜ + <<< ﯛ + < ۉ + <<< ﯣ + <<< ﯢ + < ۊ + < ۋ + <<< ﯟ + <<< ﯞ + < ۏ + < ى + <<< ﯨ + <<< ﯩ + <<< ï»° + <<< ﲐ / Ù° + <<< ﻯ + <<< ﱝ / Ù° + < ي + <<< Û¦ + <<< Ù¸ / Ø¡ + <<< ﻳ + <<< ﳚ / ج + <<< ﳛ / Ø­ + <<< ﳜ / Ø® + <<< ﳝ / م + <<< ﶝ / مم + <<< ﳞ / ه + <<< ï»´ + <<< ï³° / م + <<< ï³± / ه + <<< ﻲ + <<< ﶯ / جي + <<< ï¶® / حي + <<< ﲑ / ر + <<< ﲒ / ز + <<< ﲓ / م + <<< ﶜ / مم + <<< ï¶° / مي + <<< ﲔ / ن + <<< ﲕ / ى + <<< ﲖ / ي + <<< ï»± + <<< ﱕ / ج + <<< ﱖ / Ø­ + <<< ﱗ / Ø® + <<< ﱘ / م + <<< ﱙ / ى + <<< ﱚ / ي + < ی + <<< ﯾ + <<< ﯿ + <<< ﯽ + <<< ﯼ + < ۍ + < ێ + < ې + <<< ﯦ + <<< ﯧ + <<< ﯥ + <<< ﯤ + < ۑ + < ے + <<< ﮯ + <<< ï®± / ٔ + <<< ï®® + <<< ï®° / ٔ + < ܐ + < ܒ + << Ü­ + < ܓ + << ܔ + << Ü® + < ܖ + < ܕ + << ܯ + < ܗ + < ܘ + < ܙ + < ݍ + < ܚ + < ܛ + << ܜ + < ܝ + < ܞ + < ܟ + < ݎ + < Ü  + < Ü¡ + < Ü¢ + < Ü£ + <<< ܤ + < Ü¥ + < ܦ + << ܧ + < ݏ + < ܨ + < Ü© + < ܪ + < Ü« + < ܬ + < ހ + < ޙ + < ޚ + < ށ + < ނ + < ރ + < ޜ + < ބ + < ޅ + < ކ + < އ + < Þ¢ + < Þ£ + < ވ + < Þ¥ + < މ + < ފ + < ދ + < ޛ + < ތ + < ޘ + < Þ  + < Þ¡ + < ލ + < ގ + < Þ¤ + < ޏ + < ސ + < ޝ + < ޞ + < ޟ + < ޑ + < ޒ + < ޓ + < ޔ + < ޕ + < ޖ + < ޗ + < Þ± + < Þ¦ + < Þ§ + < Þ¨ + < Þ© + < Þª + < Þ« + < Þ¬ + < Þ­ + < Þ® + < Þ¯ + < Þ° + < ሀ + < ሁ + < ሂ + < ሃ + < ሄ + < ህ + < ሆ + < ለ + < ሉ + < ሊ + < ላ + < ሌ + < ል + < ሎ + < ሏ + < ሐ + < ሑ + < ሒ + < ሓ + < ሔ + < ሕ + < ሖ + < ሗ + < መ + < ሙ + < ሚ + < ማ + < ሜ + < ም + < ሞ + < ሟ + < ሠ + < ሡ + < ሢ + < ሣ + < ሤ + < ሥ + < ሦ + < ሧ + < ረ + < ሩ + < ሪ + < ራ + < ሬ + < ር + < ሮ + < ሯ + < ሰ + < ሱ + < ሲ + < ሳ + < ሴ + < ስ + < ሶ + < ሷ + < ሸ + < ሹ + < ሺ + < ሻ + < ሼ + < ሽ + < ሾ + < ሿ + < ቀ + < ቁ + < ቂ + < ቃ + < ቄ + < ቅ + < ቆ + < ቈ + < ቊ + < ቋ + < ቌ + < ቍ + < ቐ + < ቑ + < ቒ + < ቓ + < ቔ + < ቕ + < ቖ + < ቘ + < ቚ + < ቛ + < ቜ + < ቝ + < በ + < ቡ + < ቢ + < ባ + < ቤ + < ብ + < ቦ + < ቧ + < ቨ + < ቩ + < ቪ + < ቫ + < ቬ + < ቭ + < ቮ + < ቯ + < ተ + < ቱ + < ቲ + < ታ + < ቴ + < ት + < ቶ + < ቷ + < ቸ + < ቹ + < ቺ + < ቻ + < ቼ + < ች + < ቾ + < ቿ + < ኀ + < ኁ + < ኂ + < ኃ + < ኄ + < ኅ + < ኆ + < ኈ + < ኊ + < ኋ + < ኌ + < ኍ + < ነ + < ኑ + < ኒ + < ና + < ኔ + < ን + < ኖ + < ኗ + < ኘ + < ኙ + < ኚ + < ኛ + < ኜ + < ኝ + < ኞ + < ኟ + < አ + < ኡ + < ኢ + < ኣ + < ኤ + < እ + < ኦ + < ኧ + < ከ + < ኩ + < ኪ + < ካ + < ኬ + < ክ + < ኮ + < ኰ + < ኲ + < ኳ + < ኴ + < ኵ + < ኸ + < ኹ + < ኺ + < ኻ + < ኼ + < ኽ + < ኾ + < ዀ + < ዂ + < ዃ + < ዄ + < ዅ + < ወ + < ዉ + < ዊ + < ዋ + < ዌ + < ው + < ዎ + < ዐ + < ዑ + < ዒ + < ዓ + < ዔ + < ዕ + < ዖ + < ዘ + < ዙ + < ዚ + < ዛ + < ዜ + < ዝ + < ዞ + < ዟ + < ዠ + < ዡ + < ዢ + < ዣ + < ዤ + < ዥ + < ዦ + < ዧ + < የ + < ዩ + < ዪ + < ያ + < ዬ + < ይ + < ዮ + < ደ + < ዱ + < ዲ + < ዳ + < ዴ + < ድ + < ዶ + < ዷ + < ዸ + < ዹ + < ዺ + < ዻ + < ዼ + < ዽ + < ዾ + < ዿ + < ጀ + < ጁ + < ጂ + < ጃ + < ጄ + < ጅ + < ጆ + < ጇ + < ገ + < ጉ + < ጊ + < ጋ + < ጌ + < ግ + < ጎ + < ጐ + < ጒ + < ጓ + < ጔ + < ጕ + < ጘ + < ጙ + < ጚ + < ጛ + < ጜ + < ጝ + < ጞ + < ጠ + < ጡ + < ጢ + < ጣ + < ጤ + < ጥ + < ጦ + < ጧ + < ጨ + < ጩ + < ጪ + < ጫ + < ጬ + < ጭ + < ጮ + < ጯ + < ጰ + < ጱ + < ጲ + < ጳ + < ጴ + < ጵ + < ጶ + < ጷ + < ጸ + < ጹ + < ጺ + < ጻ + < ጼ + < ጽ + < ጾ + < ጿ + < ፀ + < ፁ + < ፂ + < ፃ + < ፄ + < ፅ + < ፆ + < ፈ + < ፉ + < ፊ + < ፋ + < ፌ + < ፍ + < ፎ + < ፏ + < ፐ + < ፑ + < ፒ + < ፓ + < ፔ + < ፕ + < ፖ + < ፗ + < ፘ + < ፙ + < ፚ + < ॐ + < ऄ + < अ + < आ + < इ + < ई + < उ + < ऊ + < ऋ + < ॠ + < ऌ + < ॡ + < ऍ + < ऎ + < ए + < ऐ + < ऑ + < ऒ + < ओ + < औ + < क + < ख + < ग + < घ + < ङ + < च + < छ + < ज + < झ + < ञ + < ट + < ठ + < ड + < ढ + < ण + < त + < थ + < द + < ध + < न + < प + < फ + < ब + < भ + < म + < य + < र + < ल + < ळ + < व + < श + < ष + < स + < ह + < ऽ + < ा + < ि + < ी + < ु + < ू + < ृ + < ॄ + < ॢ + < ॣ + < ॅ + < ॆ + < े + < ै + < ॉ + < ॊ + < ो + < ौ + < ् + < অ + < আ + < ই + < ঈ + < উ + < ঊ + < ঋ + < à§  + < ঌ + < à§¡ + < এ + < ঐ + < ও + < ঔ + < ক + < খ + < গ + < ঘ + < ঙ + < চ + < ছ + < জ + < ঝ + < ঞ + < ট + < ঠ + < ড + < ঢ + < ণ + < ত + < থ + < দ + < ধ + < ন + < প + < ফ + < ব + < ভ + < ম + < য + < র + < à§° + < ল + < à§± + < শ + < ষ + < স + < হ + < ঽ + < া + < ি + < ী + < ু + < ূ + < ৃ + < ৄ + < à§¢ + < à§£ + < ে + < ৈ + < ো + < ৌ + < ্ + < ৗ + < à©´ + < ੳ + < ਉ + < ਊ + < ਓ + < ਅ + < ਆ + < ਐ + < ਔ + < ੲ + < ਇ + < ਈ + < ਏ + < ਸ + < ਹ + < ਕ + < ਖ + < ਗ + < ਘ + < ਙ + < ਚ + < ਛ + < ਜ + < ਝ + < ਞ + < ਟ + < ਠ + < ਡ + < ਢ + < ਣ + < ਤ + < ਥ + < ਦ + < ਧ + < ਨ + < ਪ + < ਫ + < ਬ + < ਭ + < ਮ + < ਯ + < ਰ + < ਲ + < ਵ + < ੜ + < ਾ + < ਿ + < ੀ + < ੁ + < ੂ + < ੇ + < ੈ + < ੋ + < ੌ + < ੍ + < ૐ + < અ + < આ + < ઇ + < ઈ + < ઉ + < ઊ + < ઋ + < à«  + < ઌ + < à«¡ + < ઍ + < એ + < ઐ + < ઑ + < ઓ + < ઔ + < ક + < ખ + < ગ + < ઘ + < ઙ + < ચ + < છ + < જ + < ઝ + < ઞ + < ટ + < ઠ + < ડ + < ઢ + < ણ + < ત + < થ + < દ + < ધ + < ન + < પ + < ફ + < બ + < ભ + < મ + < ય + < ર + < લ + < ળ + < વ + < શ + < ષ + < સ + < હ + < ઽ + < ા + < િ + < ી + < ુ + < ૂ + < ૃ + < ૄ + < à«¢ + < à«£ + < ૅ + < ે + < ૈ + < ૉ + < ો + < ૌ + < ્ + < ଅ + < ଆ + < ଇ + < ଈ + < ଉ + < ଊ + < ଋ + < à­  + < ଌ + < à­¡ + < ଏ + < ଐ + < ଓ + < ଔ + < କ + < ଖ + < ଗ + < ଘ + < ଙ + < ଚ + < ଛ + < ଜ + < ଝ + < ଞ + < ଟ + < ଠ + < ଡ + < ଢ + < ଣ + < ତ + < ଥ + < ଦ + < ଧ + < ନ + < ପ + < ଫ + < ବ + < ଭ + < ମ + < ଯ + < ୟ + < ର + < ଲ + < ଳ + < ଵ + < à­± + < ଶ + < ଷ + < ସ + < ହ + < ଽ + < ା + < ି + < ୀ + < ୁ + < ୂ + < ୃ + < େ + < ୈ + < ୋ + < ୌ + < ୍ + < ୖ + < ୗ + < ஃ + < அ + < ஆ + < இ + < ஈ + < உ + < ஊ + < எ + < ஏ + < ஐ + < ஒ + < ஓ + < ஔ + < க + < ங + < ச + < ஜ + < ஞ + < ட + < ண + < த + < ந + < ன + < ப + < à®® + < ய + < à®° + < à®± + < ல + < ள + < à®´ + < வ + < à®· + < ஸ + < ஹ + < ா + < ி + < ீ + < ு + < ூ + < ெ + < ே + < ை + < ொ + < ோ + < ௌ + < ் + < ௗ + < అ + < ఆ + < ఇ + < ఈ + < ఉ + < ఊ + < ఋ + < à±  + < ఌ + < ౡ + < ఎ + < ఏ + < ఐ + < ఒ + < ఓ + < ఔ + < క + < ఖ + < గ + < ఘ + < ఙ + < చ + < ఛ + < జ + < ఝ + < ఞ + < ట + < à°  + < à°¡ + < à°¢ + < à°£ + < à°¤ + < à°¥ + < à°¦ + < à°§ + < à°¨ + < à°ª + < à°« + < à°¬ + < à°­ + < à°® + < à°¯ + < à°° + < à°± + < à°² + < à°³ + < à°µ + < à°¶ + < à°· + < à°¸ + < à°¹ + < à°¾ + < à°¿ + < ీ + < ు + < ూ + < ృ + < ౄ + < ె + < ే + < ై + < ొ + < ో + < ౌ + < ్ + < ౕ + < ౖ + < ಅ + < ಆ + < ಇ + < ಈ + < ಉ + < ಊ + < ಋ + < à³  + < ಌ + < ೡ + < ಎ + < ಏ + < ಐ + < ಒ + < ಓ + < ಔ + < ಕ + < ಖ + < ಗ + < ಘ + < ಙ + < ಚ + < ಛ + < ಜ + < ಝ + < ಞ + < ಟ + < ಠ + < ಡ + < ಢ + < ಣ + < ತ + < ಥ + < ದ + < ಧ + < ನ + < ಪ + < ಫ + < ಬ + < ಭ + < ಮ + < ಯ + < ರ + < ಱ + < ಲ + < ವ + < ಶ + < ಷ + < ಸ + < ಹ + < ಽ + < ಳ + < ೞ + < ಾ + < ಿ + < ೀ + < ು + < ೂ + < ೃ + < ೄ + < ೆ + < ೇ + < ೈ + < ೊ + < ೋ + < ೌ + < ್ + < ೕ + < ೖ + < അ + < ആ + < ഇ + < ഈ + < ഉ + < ഊ + < ഋ + < ൠ + < ഌ + < ൡ + < എ + < ഏ + < ഐ + < ഒ + < ഓ + < ഔ + < ക + < ഖ + < ഗ + < ഘ + < ങ + < ച + < ഛ + < ജ + < ഝ + < ഞ + < ട + < à´  + < à´¡ + < à´¢ + < à´£ + < à´¤ + < à´¥ + < à´¦ + < à´§ + < à´¨ + < à´ª + < à´« + < à´¬ + < à´­ + < à´® + < à´¯ + < à´° + < à´± + < à´² + < à´³ + < à´´ + < à´µ + < à´¶ + < à´· + < à´¸ + < à´¹ + < à´¾ + < à´¿ + < ീ + < ു + < ൂ + < ൃ + < െ + < േ + < ൈ + < ൊ + < ോ + < ൌ + < ് + < ൗ + < අ + < ආ + < ඇ + < ඈ + < ඉ + < ඊ + < උ + < ඌ + < ඍ + < ඎ + < ඏ + < ඐ + < එ + < ඒ + < ඓ + < ඔ + < ඕ + < ඖ + < ක + < ඛ + < ග + < ඝ + < ඞ + < ඟ + < à¶  + < à¶¡ + < à¶¢ + < à¶£ + < ඤ + < à¶¥ + < ඦ + < à¶§ + < ඨ + < à¶© + < ඪ + < à¶« + < ඬ + < à¶­ + < à¶® + < ද + < à¶° + < à¶± + < à¶³ + < à¶´ + < à¶µ + < à¶¶ + < à¶· + < ම + < à¶¹ + < ය + < à¶» + < à¶½ + < ව + < ශ + < ෂ + < ස + < හ + < ළ + < ෆ + < ් + < ා + < ැ + < ෑ + < ි + < ී + < ු + < ූ + < ෘ + < ෙ + < ේ + < ෛ + < ො + < ෝ + < ෞ + < ෟ + < à·² + < à·³ + < ก + < ข + < ฃ + < ค + < ฅ + < ฆ + < ง + < จ + < ฉ + < ช + < ซ + < ฌ + < ญ + < ฎ + < ฏ + < ฐ + < ฑ + < ฒ + < ณ + < ด + < ต + < ถ + < ท + < ธ + < น + < บ + < ป + < ผ + < ฝ + < พ + < ฟ + < ภ + < ม + < ย + < ร + < ฤ + < ล + < ฦ + < ว + < ศ + < ษ + < ส + < ห + < ฬ + < อ + < ฮ + < ฯ + < ะ + < ั + < า + < ำ + = ํา + < ิ + < ี + < ึ + < ื + < ุ + < ู + < ฺ + < เ + < แ + < โ + < ใ + < ไ + < ๅ + < ์ + < ํ + < ກ + < ຂ + < ຄ + < ງ + < ຈ + < ຊ + < ຍ + < ດ + < ຕ + < ຖ + < ທ + < ນ + < ບ + < ປ + < ຜ + < ຝ + < ພ + < ຟ + < ມ + < ຢ + < ຣ + < ລ + < ວ + < ສ + < ຫ + <<< ໜ / ນ + <<< ໝ / ມ + < ອ + < ຮ + < ຯ + < ະ + < ັ + < າ + < ຳ + = ໍາ + < ິ + < ີ + < ຶ + < ື + < ຸ + < ູ + < ົ + < ຼ + < ຽ + < ເ + < ແ + < ໂ + < ໃ + < ໄ + < ໌ + < ໍ + < ཀ + < ྐ + < ཁ + < ྑ + < ག + < ྒ + < ང + < ྔ + < ཅ + < ྕ + < ཆ + < ྖ + < ཇ + < ྗ + < ཉ + < ྙ + < ཊ + < ྚ + < ཋ + < ྛ + < ཌ + < ྜ + < ཎ + < ྞ + < ཏ + < ྟ + < ཐ + < ྠ + < ད + < ྡ + < ན + < ྣ + < པ + < ྤ + < ཕ + < ྥ + < བ + < ྦ + < མ + < ྨ + < ཙ + < ྩ + < ཚ + < ྪ + < ཛ + < ྫ + < ཝ + < ྭ + << ྺ + < ཞ + < ྮ + < ཟ + < ྯ + < འ + < ྰ + < ཡ + < ྱ + << ྻ + < ར + << ཪ + < ྲ + <<< ྲཱ / ཱ + << ྼ + < ལ + < ླ + <<< ླཱ / ཱ + < ཤ + < ྴ + < ཥ + < ྵ + < ས + < ྶ + < ཧ + < ྷ + < ཨ + <<< ༀ / ོཾ + < ྸ + < ྈ + < ྉ + < ྊ + < ྋ + < ཱ + < ི + < ཱི + < ྀ + < ཱྀ + < ུ + < ཱུ + < ྲྀ + < ཷ + = ྲཱྀ + < ླྀ + < ཹ + = ླཱྀ + < ེ + < ཻ + < ོ + < ཽ + < ྄ + < ᤀ + < ᤁ + < ᤂ + < ᤃ + < ᤄ + < ᤅ + < ᤆ + < ᤇ + < ᤈ + < ᤉ + < ᤊ + < ᤋ + < ᤌ + < ᤍ + < ᤎ + < ᤏ + < ᤐ + < ᤑ + < ᤒ + < ᤓ + < ᤔ + < ᤕ + < ᤖ + < ᤗ + < ᤘ + < ᤙ + < ᤚ + < ᤛ + < ᤜ + < ᤠ + < ᤡ + < ᤢ + < ᤣ + < ᤤ + < ᤥ + < ᤦ + < ᤧ + < ᤨ + < ᤩ + < ᤪ + < ᤫ + < ᤰ + < ᤱ + < ᤲ + < ᤳ + < ᤴ + < ᤵ + < ᤶ + < ᤷ + < ᤸ + < ᜀ + < ᜁ + < ᜂ + < ᜃ + < ᜄ + < ᜅ + < ᜆ + < ᜇ + < ᜈ + < ᜉ + < ᜊ + < ᜋ + < ᜌ + < ᜎ + < ᜏ + < ᜐ + < ᜑ + < ᜒ + < ᜓ + < ᜔ + < ᜠ + < ᜡ + < ᜢ + < ᜣ + < ᜤ + < ᜥ + < ᜦ + < ᜧ + < ᜨ + < ᜩ + < ᜪ + < ᜫ + < ᜬ + < ᜭ + < ᜮ + < ᜯ + < ᜰ + < ᜱ + < ᜲ + < ᜳ + < ᜴ + < ᝀ + < ᝁ + < ᝂ + < ᝃ + < ᝄ + < ᝅ + < ᝆ + < ᝇ + < ᝈ + < ᝉ + < ᝊ + < ᝋ + < ᝌ + < ᝍ + < ᝎ + < ᝏ + < ᝐ + < ᝑ + < ᝒ + < ᝓ + < ᝠ + < ᝡ + < ᝢ + < ᝣ + < ᝤ + < ᝥ + < ᝦ + < ᝧ + < ᝨ + < ᝩ + < ᝪ + < ᝫ + < ᝬ + < ᝮ + < ᝯ + < ᝰ + < ᝲ + < ᝳ + < က + < ခ + < ဂ + < ဃ + < င + < စ + < ဆ + < ဇ + < ဈ + < ဉ + < ည + < ဋ + < ဌ + < ဍ + < ဎ + < ဏ + < တ + < ထ + < ဒ + < ဓ + < န + < ပ + < ဖ + < ဗ + < ဘ + < မ + < ယ + < ရ + < လ + < ဝ + < ၐ + < ၑ + < သ + < ဟ + < ဠ + < အ + < ဣ + < ဤ + < ဥ + < ဦ + < ဧ + < ဩ + < ဪ + < ၒ + < ၓ + < ၔ + < ၕ + < ာ + < ိ + < ီ + < ု + < ူ + < ေ + < ဲ + < ၖ + < ၗ + < ၘ + < ၙ + < ္ + < ក + < ខ + < គ + < ឃ + < ង + < ច + < ឆ + < ជ + < ឈ + < ញ + < ដ + < ឋ + < ឌ + < ឍ + < ណ + < ត + < ថ + < ទ + < ធ + < ន + < ប + < ផ + < ព + < ភ + < ម + < យ + < រ + < ល + < វ + < ឝ + < ឞ + < ស + < ហ + < ឡ + < អ + < ៜ + < ឣ + < ឤ + < ឥ + < ឦ + < ឧ + < ឨ + < ឩ + < ឪ + < ឫ + < ឬ + < ឭ + < ឮ + < ឯ + < ឰ + < ឱ + < ឲ + < ឳ + < '឴' + < '឵' + < ា + < ិ + < ី + < ឹ + < ឺ + < ុ + < ូ + < ួ + < ើ + < ឿ + < ៀ + < េ + < ែ + < ៃ + < ោ + < ៅ + < ្ + < ᥐ + < ᥑ + < ᥒ + < ᥓ + < ᥔ + < ᥕ + < ᥖ + < ᥗ + < ᥘ + < ᥙ + < ᥚ + < ᥛ + < ᥜ + < ᥝ + < ᥞ + < ᥟ + < ᥠ + < ᥡ + < ᥢ + < ᥣ + < ᥤ + < ᥥ + < ᥦ + < ᥧ + < ᥨ + < ᥩ + < ᥪ + < ᥫ + < ᥬ + < ᥭ + < ᥰ + < ᥱ + < ᥲ + < ᥳ + < ᥴ + < ᢀ + < ᢁ + < ᢂ + < ᢃ + < ᢄ + < ᢅ + < ᢆ + < ᡃ + < á   + < ᢇ + < á ¡ + < ᡄ + < ᡝ + < á ¢ + < ᡅ + < ᡞ + < ᡳ + < ᢈ + < ᡟ + < á £ + < ᡆ + < á ¤ + < ᡇ + < á¡¡ + < á ¥ + < ᡈ + < á ¦ + < ᡉ + < á¡  + < á § + < á ¨ + < á © + < ᡊ + < á¡¢ + < ᢊ + < ᢛ + < á ª + < ᡋ + < á « + < ᡌ + < ᡦ + < á ¬ + < ᡍ + < á ­ + < ᡎ + < ᡤ + < ᢚ + < á¡¥ + < á ® + < ᡏ + < á ¯ + < á ° + < á ± + < á¡§ + < ᢜ + < ᢝ + < ᢢ + < ᢤ + < ᢥ + < á ² + < ᡐ + < ᡨ + < á ³ + < ᡑ + < á¡© + < á ´ + < ᡒ + < ᡱ + < ᡜ + < ᢋ + < á µ + < ᡓ + < ᡪ + < á¡· + < á ¶ + < ᡕ + < ᡲ + < á · + < ᡵ + < á ¸ + < ᡖ + < á ¹ + < á¡« + < á¡¶ + < á º + < ᡗ + < á¡£ + < á¡´ + < ᢉ + < á » + < á ¼ + < ᡔ + < á¡® + < á ½ + < ᡯ + < ᡘ + < ᡬ + < á ¾ + < ᡙ + < á¡­ + < á ¿ + < ᡀ + < ᡁ + < ᡂ + < ᡚ + < ᡛ + < á¡° + < ᢌ + < ᢞ + < ᢍ + < ᢎ + < ᢟ + < ᢏ + < ᢐ + < ᢘ + < ᢠ + < ᢑ + < ᢡ + < ᢒ + < ᢓ + < ᢨ + < ᢔ + < ᢣ + < ᢕ + < ᢙ + < ᢖ + < ᢗ + < ᢦ + < ᢧ + < ᢩ + < Ꭰ + < Ꭱ + < Ꭲ + < Ꭳ + < Ꭴ + < Ꭵ + < Ꭶ + < Ꭷ + < Ꭸ + < Ꭹ + < Ꭺ + < Ꭻ + < Ꭼ + < Ꭽ + < Ꭾ + < Ꭿ + < Ꮀ + < Ꮁ + < Ꮂ + < Ꮃ + < Ꮄ + < Ꮅ + < Ꮆ + < Ꮇ + < Ꮈ + < Ꮉ + < Ꮊ + < Ꮋ + < Ꮌ + < Ꮍ + < Ꮎ + < Ꮏ + < Ꮐ + < Ꮑ + < Ꮒ + < Ꮓ + < Ꮔ + < Ꮕ + < Ꮖ + < Ꮗ + < Ꮘ + < Ꮙ + < Ꮚ + < Ꮛ + < Ꮜ + < Ꮝ + < Ꮞ + < Ꮟ + < Ꮠ + < Ꮡ + < Ꮢ + < Ꮣ + < Ꮤ + < Ꮥ + < Ꮦ + < Ꮧ + < Ꮨ + < Ꮩ + < Ꮪ + < Ꮫ + < Ꮬ + < Ꮭ + < Ꮮ + < Ꮯ + < Ꮰ + < Ꮱ + < Ꮲ + < Ꮳ + < Ꮴ + < Ꮵ + < Ꮶ + < Ꮷ + < Ꮸ + < Ꮹ + < Ꮺ + < Ꮻ + < Ꮼ + < Ꮽ + < Ꮾ + < Ꮿ + < Ᏸ + < Ᏹ + < Ᏺ + < Ᏻ + < Ᏼ + < ᐁ + < ᐂ + < ᐃ + < ᐄ + < ᐅ + < ᐆ + < ᐇ + < ᐈ + < ᐉ + < ᐊ + < ᐋ + < ᐌ + < ᐍ + < ᐎ + < ᐏ + < ᐐ + < ᐑ + < ᐒ + < ᐓ + < ᐔ + < ᐕ + < ᐖ + < ᐗ + < ᐘ + < ᐙ + < ᐚ + < ᐛ + < ᐜ + < ᐝ + < ᐞ + < ᐟ + < ᐠ + < ᐡ + < ᐢ + < ᐣ + < ᐤ + < ᐥ + < ᐦ + < ᐧ + < ᐨ + < ᐩ + < ᐪ + < ᐫ + < ᐬ + < ᐭ + < ᐮ + < ᐯ + < ᐰ + < ᐱ + < ᐲ + < ᐳ + < ᐴ + < ᐵ + < ᐶ + < ᐷ + < ᐸ + < ᐹ + < ᐺ + < ᐻ + < ᐼ + < ᐽ + < ᐾ + < ᐿ + < ᑀ + < ᑁ + < ᑂ + < ᑃ + < ᑄ + < ᑅ + < ᑆ + < ᑇ + < ᑈ + < ᑉ + < ᑊ + < ᑋ + < ᑌ + < ᑍ + < ᑎ + < ᑏ + < ᑐ + < ᑑ + < ᑒ + < ᑓ + < ᑔ + < ᑕ + < ᑖ + < ᑗ + < ᑘ + < ᑙ + < ᑚ + < ᑛ + < ᑜ + < ᑝ + < ᑞ + < ᑟ + < ᑠ + < ᑡ + < ᑢ + < ᑣ + < ᑤ + < ᑥ + < ᑦ + < ᑧ + < ᑨ + < ᑩ + < ᑪ + < ᑫ + < ᑬ + < ᑭ + < ᑮ + < ᑯ + < ᑰ + < ᑱ + < ᑲ + < ᑳ + < ᑴ + < ᑵ + < ᑶ + < ᑷ + < ᑸ + < ᑹ + < ᑺ + < ᑻ + < ᑼ + < ᑽ + < ᑾ + < ᑿ + < ᒀ + < ᒁ + < ᒂ + < ᒃ + < ᒄ + < ᒅ + < ᒆ + < ᒇ + < ᒈ + < ᒉ + < ᒊ + < ᒋ + < ᒌ + < ᒍ + < ᒎ + < ᒏ + < ᒐ + < ᒑ + < ᒒ + < ᒓ + < ᒔ + < ᒕ + < ᒖ + < ᒗ + < ᒘ + < ᒙ + < ᒚ + < ᒛ + < ᒜ + < ᒝ + < ᒞ + < ᒟ + < ᒠ + < ᒡ + < ᒢ + < ᒣ + < ᒤ + < ᒥ + < ᒦ + < ᒧ + < ᒨ + < ᒩ + < ᒪ + < ᒫ + < ᒬ + < ᒭ + < ᒮ + < ᒯ + < ᒰ + < ᒱ + < ᒲ + < ᒳ + < ᒴ + < ᒵ + < ᒶ + < ᒷ + < ᒸ + < ᒹ + < ᒺ + < ᒻ + < ᒼ + < ᒽ + < ᒾ + < ᒿ + < ᓀ + < ᓁ + < ᓂ + < ᓃ + < ᓄ + < ᓅ + < ᓆ + < ᓇ + < ᓈ + < ᓉ + < ᓊ + < ᓋ + < ᓌ + < ᓍ + < ᓎ + < ᓏ + < ᓐ + < ᓑ + < ᓒ + < ᓓ + < ᓔ + < ᓕ + < ᓖ + < ᓗ + < ᓘ + < ᓙ + < ᓚ + < ᓛ + < ᓜ + < ᓝ + < ᓞ + < ᓟ + < ᓠ + < ᓡ + < ᓢ + < ᓣ + < ᓤ + < ᓥ + < ᓦ + < ᓧ + < ᓨ + < ᓩ + < ᓪ + < ᓫ + < ᓬ + < ᓭ + < ᓮ + < ᓯ + < ᓰ + < ᓱ + < ᓲ + < ᓳ + < ᓴ + < ᓵ + < ᓶ + < ᓷ + < ᓸ + < ᓹ + < ᓺ + < ᓻ + < ᓼ + < ᓽ + < ᓾ + < ᓿ + < ᔀ + < ᔁ + < ᔂ + < ᔃ + < ᔄ + < ᔅ + < ᔆ + < ᔇ + < ᔈ + < ᔉ + < ᔊ + < ᔋ + < ᔌ + < ᔍ + < ᔎ + < ᔏ + < ᔐ + < ᔑ + < ᔒ + < ᔓ + < ᔔ + < ᔕ + < ᔖ + < ᔗ + < ᔘ + < ᔙ + < ᔚ + < ᔛ + < ᔜ + < ᔝ + < ᔞ + < ᔟ + < ᔠ + < ᔡ + < ᔢ + < ᔣ + < ᔤ + < ᔥ + < ᔦ + < ᔧ + < ᔨ + < ᔩ + < ᔪ + < ᔫ + < ᔬ + < ᔭ + < ᔮ + < ᔯ + < ᔰ + < ᔱ + < ᔲ + < ᔳ + < ᔴ + < ᔵ + < ᔶ + < ᔷ + < ᔸ + < ᔹ + < ᔺ + < ᔻ + < ᔼ + < ᔽ + < ᔾ + < ᔿ + < ᕀ + < ᕁ + < ᕂ + < ᕃ + < ᕄ + < ᕅ + < ᕆ + < ᕇ + < ᕈ + < ᕉ + < ᕊ + < ᕋ + < ᕌ + < ᕍ + < ᕎ + < ᕏ + < ᕐ + < ᕑ + < ᕒ + < ᕓ + < ᕔ + < ᕕ + < ᕖ + < ᕗ + < ᕘ + < ᕙ + < ᕚ + < ᕛ + < ᕜ + < ᕝ + < ᕞ + < ᕟ + < ᕠ + < ᕡ + < ᕢ + < ᕣ + < ᕤ + < ᕥ + < ᕦ + < ᕧ + < ᕨ + < ᕩ + < ᕪ + < ᕫ + < ᕬ + < ᕭ + < ᕮ + < ᕯ + < ᕰ + < ᕱ + < ᕲ + < ᕳ + < ᕴ + < ᕵ + < ᕶ + < ᕷ + < ᕸ + < ᕹ + < ᕺ + < ᕻ + < ᕽ + < ᙯ + < ᕾ + < ᕿ + < ᖀ + < ᖁ + < ᖂ + < ᖃ + < ᖄ + < ᖅ + < ᖆ + < ᖇ + < ᖈ + < ᖉ + < ᖊ + < ᖋ + < ᖌ + < ᖍ + < ᙰ + < ᖎ + < ᖏ + < ᖐ + < ᖑ + < ᖒ + < ᖓ + < ᖔ + < ᖕ + < ᙱ + < ᙲ + < ᙳ + < ᙴ + < ᙵ + < ᙶ + < ᖖ + < ᖗ + < ᖘ + < ᖙ + < ᖚ + < ᖛ + < ᖜ + < ᖝ + < ᖞ + < ᖟ + < ᖠ + < ᖡ + < ᖢ + < ᖣ + < ᖤ + < ᖥ + < ᖦ + < ᕼ + < ᖧ + < ᖨ + < ᖩ + < ᖪ + < ᖫ + < ᖬ + < ᖭ + < ᖮ + < ᖯ + < ᖰ + < ᖱ + < ᖲ + < ᖳ + < ᖴ + < ᖵ + < ᖶ + < ᖷ + < ᖸ + < ᖹ + < ᖺ + < ᖻ + < ᖼ + < ᖽ + < ᖾ + < ᖿ + < ᗀ + < ᗁ + < ᗂ + < ᗃ + < ᗄ + < ᗅ + < ᗆ + < ᗇ + < ᗈ + < ᗉ + < ᗊ + < ᗋ + < ᗌ + < ᗍ + < ᗎ + < ᗏ + < ᗐ + < ᗑ + < ᗒ + < ᗓ + < ᗔ + < ᗕ + < ᗖ + < ᗗ + < ᗘ + < ᗙ + < ᗚ + < ᗛ + < ᗜ + < ᗝ + < ᗞ + < ᗟ + < ᗠ + < ᗡ + < ᗢ + < ᗣ + < ᗤ + < ᗥ + < ᗦ + < ᗧ + < ᗨ + < ᗩ + < ᗪ + < ᗫ + < ᗬ + < ᗭ + < ᗮ + < ᗯ + < ᗰ + < ᗱ + < ᗲ + < ᗳ + < ᗴ + < ᗵ + < ᗶ + < ᗷ + < ᗸ + < ᗹ + < ᗺ + < ᗻ + < ᗼ + < ᗽ + < ᗾ + < ᗿ + < ᘀ + < ᘁ + < ᘂ + < ᘃ + < ᘄ + < ᘅ + < ᘆ + < ᘇ + < ᘈ + < ᘉ + < ᘊ + < ᘋ + < ᘌ + < ᘍ + < ᘎ + < ᘏ + < ᘐ + < ᘑ + < ᘒ + < ᘓ + < ᘔ + < ᘕ + < ᘖ + < ᘗ + < ᘘ + < ᘙ + < ᘚ + < ᘛ + < ᘜ + < ᘝ + < ᘞ + < ᘟ + < ᘠ + < ᘡ + < ᘢ + < ᘣ + < ᘤ + < ᘥ + < ᘦ + < ᘧ + < ᘨ + < ᘩ + < ᘪ + < ᘫ + < ᘬ + < ᘭ + < ᘮ + < ᘯ + < ᘰ + < ᘱ + < ᘲ + < ᘳ + < ᘴ + < ᘵ + < ᘶ + < ᘷ + < ᘸ + < ᘹ + < ᘺ + < ᘻ + < ᘼ + < ᘽ + < ᘾ + < ᘿ + < ᙀ + < ᙁ + < ᙂ + < ᙃ + < ᙄ + < ᙅ + < ᙆ + < ᙇ + < ᙈ + < ᙉ + < ᙊ + < ᙋ + < ᙌ + < ᙍ + < ᙎ + < ᙏ + < ᙐ + < ᙑ + < ᙒ + < ᙓ + < ᙔ + < ᙕ + < ᙖ + < ᙗ + < ᙘ + < ᙙ + < ᙚ + < ᙛ + < ᙜ + < ᙝ + < ᙞ + < ᙟ + < ᙠ + < ᙡ + < ᙢ + < ᙣ + < ᙤ + < ᙥ + < ᙦ + < ᙧ + < ᙨ + < ᙩ + < ᙪ + < ᙫ + < ᙬ + < ᚁ + < ᚂ + < ᚃ + < ᚄ + < ᚅ + < ᚆ + < ᚇ + < ᚈ + < ᚉ + < ᚊ + < ᚋ + < ᚌ + < ᚍ + < ᚎ + < ᚏ + < ᚐ + < ᚑ + < ᚒ + < ᚓ + < ᚔ + < ᚕ + < ᚖ + < ᚗ + < ᚘ + < ᚙ + < ᚚ + < ᚠ + << ᚡ + < ᚢ + << ᚤ + << ᚥ + < ᚦ + <<< ᛰ / ᚦ + << ᚧ + < ᚨ + << ᚩ + << ᚬ + << ᚭ + << ᚮ + < ᚯ + < ᚰ + < ᚱ + < ᚲ + << ᚳ + << ᚴ + << ᚵ + << ᚶ + < ᚷ + < ᚹ + << ᛩ + < ᚺ + << ᚻ + << ᚼ + << ᚽ + < ᚾ + << ᚿ + << ᛀ + < ᛁ + << ᛂ + < ᛃ + << ᛄ + < ᛅ + <<< ᛮ / ᛚ + << ᛆ + < ᛇ + < ᛈ + << ᛕ + < ᛉ + < ᛊ + << ᛋ + << ᛪ + << ᛌ + << ᛍ + << ᛎ + < ᛏ + << ᛐ + << ᛑ + < ᛒ + << ᛓ + << ᛔ + < ᛖ + < ᛗ + << ᛘ + <<< ᛯ / ᛗ + << ᛙ + < ᛚ + << ᛛ + < ᛜ + << ᛝ + < ᛞ + < ᛟ + < ᚪ + < ᚫ + < ᚣ + < ᛠ + < ᛣ + < ᚸ + < ᛤ + < ᛡ + < ᛢ + < ᛥ + < ᛦ + << ᛧ + << ᛨ + < ᄀ + <<< ㄱ + <<< ㉠ + <<< ㉮ / ᅡ + <<< ᄀ + < ᄁ + <<< ㄲ + <<< ï¾¢ + < ᄂ + <<< ㄴ + <<< ㉡ + <<< ㉯ / ᅡ + <<< ᄂ + < ᄃ + <<< ㄷ + <<< ㉢ + <<< ㉰ / ᅡ + <<< ï¾§ + < ᄄ + <<< ㄸ + <<< ᄄ + < ᄅ + <<< ㄹ + <<< ㉣ + <<< ㉱ / ᅡ + <<< ᄅ + < ᄆ + <<< ㅁ + <<< ㉤ + <<< ㉲ / ᅡ + <<< ï¾± + < ᄇ + <<< ㅂ + <<< ㉥ + <<< ㉳ / ᅡ + <<< ï¾² + < ᄈ + <<< ㅃ + <<< ï¾³ + < ᄉ + <<< ㅅ + <<< ㉦ + <<< ㉴ / ᅡ + <<< ï¾µ + < ᄊ + <<< ㅆ + <<< ï¾¶ + < ᄋ + <<< ㅇ + <<< ㉧ + <<< ㉵ / ᅡ + <<< ï¾· + < ᄌ + <<< ㅈ + <<< ㉨ + <<< ㉶ / ᅡ + <<< ㉽ / ᅮ의 + <<< ᄌ + < ᄍ + <<< ㅉ + <<< ï¾¹ + < ᄎ + <<< ㅊ + <<< ㉩ + <<< ㉷ / ᅡ + <<< ㉼ / ᅡᆷ고 + <<< ᄎ + < ᄏ + <<< ㅋ + <<< ㉪ + <<< ㉸ / ᅡ + <<< ï¾» + < ᄐ + <<< ㅌ + <<< ㉫ + <<< ㉹ / ᅡ + <<< ï¾¼ + < ᄑ + <<< ㅍ + <<< ㉬ + <<< ㉺ / ᅡ + <<< ï¾½ + < ᄒ + <<< ㅎ + <<< ㉭ + <<< ㉻ / ᅡ + <<< ï¾¾ + < ᄓ + < ᄔ + <<< ㅥ + < ᄕ + <<< ㅦ + < ᄖ + < ᄗ + < ᄘ + < ᄙ + < ᄚ + <<< ㅀ + <<< ï¾° + < ᄛ + < ᄜ + <<< ㅮ + < ᄝ + <<< ㅱ + < ᄞ + <<< ㅲ + < ᄟ + < ᄠ + <<< ㅳ + < ᄡ + <<< ㅄ + <<< ï¾´ + < ᄢ + <<< ㅴ + < ᄣ + <<< ㅵ + < ᄤ + < ᄥ + < ᄦ + < ᄧ + <<< ㅶ + < ᄨ + < ᄩ + <<< ㅷ + < ᄪ + < ᄫ + <<< ㅸ + < ᄬ + <<< ㅹ + < ᄭ + <<< ㅺ + < ᄮ + <<< ㅻ + < ᄯ + <<< ㅼ + < ᄰ + < ᄱ + < ᄲ + <<< ㅽ + < ᄳ + < ᄴ + < ᄵ + < ᄶ + <<< ㅾ + < ᄷ + < ᄸ + < ᄹ + < ᄺ + < ᄻ + < ᄼ + < ᄽ + < ᄾ + < ᄿ + < ᅀ + <<< ㅿ + < ᅁ + < ᅂ + < ᅃ + < ᅄ + < ᅅ + < ᅆ + < ᅇ + <<< ㆀ + < ᅈ + < ᅉ + < ᅊ + < ᅋ + < ᅌ + <<< ㆁ + < ᅍ + < ᅎ + < ᅏ + < ᅐ + < ᅑ + < ᅒ + < ᅓ + < ᅔ + < ᅕ + < ᅖ + < ᅗ + <<< ㆄ + < ᅘ + <<< ㆅ + < ᅙ + <<< ㆆ + < ᅟ + < ᅠ + <<< ㅤ + <<< ï¾  + < ᅡ + <<< ㅏ + <<< ᅡ + < ᅢ + <<< ㅐ + <<< ᅢ + < ᅣ + <<< ㅑ + <<< ᅣ + < ᅤ + <<< ㅒ + <<< ᅤ + < ᅥ + <<< ㅓ + <<< ᅥ + < ᅦ + <<< ㅔ + <<< ᅦ + < ᅧ + <<< ㅕ + <<< ᅧ + < ᅨ + <<< ㅖ + <<< ᅨ + < ᅩ + <<< ㅗ + <<< ᅩ + < ᅪ + <<< ㅘ + <<< ᅪ + < ᅫ + <<< ㅙ + <<< ᅫ + < ᅬ + <<< ㅚ + <<< ᅬ + < ᅭ + <<< ㅛ + <<< ᅭ + < ᅮ + <<< ㅜ + <<< ᅮ + < ᅯ + <<< ㅝ + <<< ᅯ + < ᅰ + <<< ㅞ + <<< ᅰ + < ᅱ + <<< ㅟ + <<< ᅱ + < ᅲ + <<< ㅠ + <<< ᅲ + < ᅳ + <<< ㅡ + <<< ᅳ + < ᅴ + <<< ㅢ + <<< ᅴ + < ᅵ + <<< ㅣ + <<< ᅵ + < ᅶ + < ᅷ + < ᅸ + < ᅹ + < ᅺ + < ᅻ + < ᅼ + < ᅽ + < ᅾ + < ᅿ + < ᆀ + < ᆁ + < ᆂ + < ᆃ + < ᆄ + <<< ㆇ + < ᆅ + <<< ㆈ + < ᆆ + < ᆇ + < ᆈ + <<< ㆉ + < ᆉ + < ᆊ + < ᆋ + < ᆌ + < ᆍ + < ᆎ + < ᆏ + < ᆐ + < ᆑ + <<< ㆊ + < ᆒ + <<< ㆋ + < ᆓ + < ᆔ + <<< ㆌ + < ᆕ + < ᆖ + < ᆗ + < ᆘ + < ᆙ + < ᆚ + < ᆛ + < ᆜ + < ᆝ + < ᆞ + <<< ㆍ + < ᆟ + < ᆠ + < ᆡ + <<< ㆎ + < ᆢ + < ᆨ + < ᆩ + < ᆪ + <<< ㄳ + <<< ï¾£ + < ᆫ + < ᆬ + <<< ㄵ + <<< ï¾¥ + < ᆭ + <<< ㄶ + <<< ᆭ + < ᆮ + < ᆯ + < ᆰ + <<< ㄺ + <<< ᆰ + < ᆱ + <<< ㄻ + <<< ᆱ + < ᆲ + <<< ㄼ + <<< ᆲ + < ᆳ + <<< ㄽ + <<< ï¾­ + < ᆴ + <<< ㄾ + <<< ï¾® + < ᆵ + <<< ㄿ + <<< ᆵ + < ᆶ + < ᆷ + < ᆸ + < ᆹ + < ᆺ + < ᆻ + < ᆼ + < ᆽ + < ᆾ + < ᆿ + < ᇀ + < ᇁ + < ᇂ + < ᇃ + < ᇄ + < ᇅ + < ᇆ + < ᇇ + <<< ㅧ + < ᇈ + <<< ㅨ + < ᇉ + < ᇊ + < ᇋ + < ᇌ + <<< ㅩ + < ᇍ + < ᇎ + <<< ㅪ + < ᇏ + < ᇐ + < ᇑ + < ᇒ + < ᇓ + <<< ㅫ + < ᇔ + < ᇕ + < ᇖ + < ᇗ + <<< ㅬ + < ᇘ + < ᇙ + <<< ㅭ + < ᇚ + < ᇛ + < ᇜ + < ᇝ + <<< ㅯ + < ᇞ + < ᇟ + <<< ㅰ + < ᇠ + < ᇡ + < ᇢ + < ᇣ + < ᇤ + < ᇥ + < ᇦ + < ᇧ + < ᇨ + < ᇩ + < ᇪ + < ᇫ + < ᇬ + < ᇭ + < ᇮ + < ᇯ + < ᇰ + < ᇱ + <<< ㆂ + < ᇲ + <<< ㆃ + < ᇳ + < ᇴ + < ᇵ + < ᇶ + < ᇷ + < ᇸ + < ᇹ + < ぁ + <<< あ + <<< ァ + <<< ï½§ + <<< ア + <<< ï½± + <<< ㋐ + <<< ㌃ / ーる + <<< ㌀ / ぱーと + <<< ㌁ / るふあ + <<< ㌂ / んぺあ + < ぃ + <<< い + <<< ィ + <<< ィ + <<< イ + <<< ï½² + <<< ㋑ + <<< ㌄ / にんぐ + <<< ㌅ / んち + < ぅ + <<< う + <<< ゥ + <<< ゥ + <<< ウ + <<< ï½³ + <<< ㋒ + <<< ㌆ / おん + < ぇ + <<< え + <<< ェ + <<< ェ + <<< エ + <<< ï½´ + <<< ㋓ + <<< ㌈ / ーかー + <<< ㌇ / すくーど + < ぉ + <<< お + <<< ォ + <<< ォ + <<< オ + <<< ï½µ + <<< ㋔ + <<< ㌊ / ーむ + <<< ㌉ / んす + < ゕ + <<< か + <<< ヵ + <<< カ + <<< ï½¶ + <<< ㋕ + <<< ㌋ / いり + <<< ㌌ / らつと + <<< ㌍ / ろりー + <<< ㌎ / ゙ろん + <<< ㌏ / ゙んま + < き + <<< キ + <<< ï½· + <<< ㋖ + <<< ㌐ / ゙が + <<< ㌑ / ゙にー + <<< ㌒ / ゆりー + <<< ㌓ / ゙るだー + <<< ㌔ / ろ + <<< ㌕ / ろぐらむ + <<< ㌖ / ろめーとる + <<< ㌗ / ろわつと + < く + <<< ㇰ + <<< ク + <<< ク + <<< ㋗ + <<< ㌘ / ゙らむ + <<< ㌙ / ゙らむとん + <<< ㌚ / るぜいろ + <<< ㌛ / ろーね + < ゖ + <<< け + <<< ヶ + <<< ケ + <<< ï½¹ + <<< ㋘ + <<< ㌜ / ーす + < こ + <<< コ + <<< コ + <<< ㋙ + <<< ヿ / と + <<< ㌞ / ーぽ + <<< ㌝ / るな + < さ + <<< サ + <<< ï½» + <<< ㋚ + <<< ㌟ / いくる + <<< ㌠ / んちーむ + < 〆 / め + <<< し + <<< ㇱ + <<< シ + <<< ï½¼ + <<< ㋛ + <<< ㌡ / りんぐ + < す + <<< ㇲ + <<< ス + <<< ï½½ + <<< ㋜ + < せ + <<< セ + <<< ï½¾ + <<< ㋝ + <<< ㌢ / んち + <<< ㌣ / んと + < そ + <<< ソ + <<< ソ + <<< ㋞ + < た + <<< タ + <<< タ + <<< ㋟ + <<< ㌤ / ゙ーす + < ち + <<< チ + <<< チ + <<< ㋠ + < っ + <<< つ + <<< ッ + <<< ッ + <<< ツ + <<< ツ + <<< ㋡ + < て + <<< テ + <<< テ + <<< ㋢ + <<< ㌥ / ゙し + < と + <<< ㇳ + <<< ト + <<< ト + <<< ㋣ + <<< ㌦ / ゙る + <<< ㌧ / ん + < な + <<< ナ + <<< ナ + <<< ㋤ + <<< ㌨ / の + < に + <<< ニ + <<< ニ + <<< ㋥ + < ぬ + <<< ㇴ + <<< ヌ + <<< ヌ + <<< ㋦ + < ね + <<< ネ + <<< ネ + <<< ㋧ + < の + <<< ノ + <<< ノ + <<< ㋨ + <<< ㌩ / つと + < は + <<< ㇵ + <<< ハ + <<< ハ + <<< ㋩ + <<< ㌫ / ゚ーせんと + <<< ㌬ / ゚ーつ + <<< ㌭ / ゙ーれる + <<< ㌪ / いつ + < ひ + <<< ㇶ + <<< ヒ + <<< ヒ + <<< ㋪ + <<< ㌮ / ゚あすとる + <<< ㌯ / ゚くる + <<< ㌰ / ゚こ + <<< ㌱ / ゙る + < ふ + <<< ㇷ + <<< フ + <<< フ + <<< ㋫ + <<< ㌲ / あらつど + <<< ㌳ / いーと + <<< ㌴ / ゙つしえる + <<< ㌵ / らん + < へ + <<< ㇸ + <<< ヘ + <<< ヘ + <<< ㋬ + <<< ㌻ / ゚ーじ + <<< ㌼ / ゙ーた + <<< ㌶ / くたーる + <<< ㌷ / ゚そ + <<< ㌸ / ゚にひ + <<< ㌹ / るつ + <<< ㌺ / ゚んす + < ほ + <<< ㇹ + <<< ホ + <<< ホ + <<< ㋭ + <<< ㍁ / ーる + <<< ㍂ / ーん + <<< ㌽ / ゚いんと + <<< ㌾ / ゙ると + <<< ㌿ / ん + <<< ㍀ / ゚んど + < 〼 / す + <<< ま + <<< マ + <<< マ + <<< ㋮ + <<< ㍃ / いくろ + <<< ㍄ / いる + <<< ㍅ / つは + <<< ㍆ / るく + <<< ㍇ / んしよん + < み + <<< ミ + <<< ミ + <<< ㋯ + <<< ㍈ / くろん + <<< ㍉ / り + <<< ㍊ / りばーる + < む + <<< ㇺ + <<< ム + <<< ム + <<< ㋰ + < め + <<< メ + <<< メ + <<< ㋱ + <<< ㍍ / ーとる + <<< ㍋ / が + <<< ㍌ / がとん + < も + <<< モ + <<< モ + <<< ㋲ + < ゃ + <<< や + <<< ャ + <<< ャ + <<< ヤ + <<< ヤ + <<< ㋳ + <<< ㍎ / ーど + <<< ㍏ / ーる + < ゅ + <<< ゆ + <<< ュ + <<< ï½­ + <<< ユ + <<< ユ + <<< ㋴ + <<< ㍐ / あん + < ょ + <<< よ + <<< ョ + <<< ï½® + <<< ヨ + <<< ヨ + <<< ㋵ + <<< ゟ / り + < ら + <<< ㇻ + <<< ラ + <<< ラ + <<< ㋶ + < り + <<< ㇼ + <<< リ + <<< リ + <<< ㋷ + <<< ㍑ / つとる + <<< ㍒ / ら + < る + <<< ㇽ + <<< ル + <<< ル + <<< ㋸ + <<< ㍔ / ーぶる + <<< ㍓ / ぴー + < れ + <<< ㇾ + <<< レ + <<< レ + <<< ㋹ + <<< ㍕ / む + <<< ㍖ / んとげん + < ろ + <<< ㇿ + <<< ロ + <<< ロ + <<< ㋺ + < ゎ + <<< わ + <<< ヮ + <<< ワ + <<< ワ + <<< ㋻ + <<< ㍗ / つと + < ゐ + <<< ヰ + <<< ㋼ + < ゑ + <<< ヱ + <<< ㋽ + < を + <<< ヲ + <<< ヲ + <<< ㋾ + < ん + <<< ン + <<< ン + < ㄅ + << ㆠ + < ㄆ + <<< ㆴ + < ㄇ + < ㄈ + < ㄪ + < ㄉ + < ㄊ + <<< ㆵ + < ㄋ + < ㄌ + < ㄍ + << ㆣ + < ㄎ + <<< ㆶ + < ㄫ + < ㆭ + < ㄏ + <<< ㆷ + < ㄐ + << ㆢ + < ㄑ + < ㄒ + < ㄬ + < ㄓ + < ㄔ + < ㄕ + < ㄖ + < ㄗ + << ㆡ + < ㄘ + < ㄙ + < ㄚ + << ㆩ + < ㄛ + << ㆧ + < ㆦ + < ㄜ + < ㄝ + < ㆤ + << ㆥ + < ㄞ + << ㆮ + < ㄟ + < ㄠ + << ㆯ + < ㄡ + < ㄢ + < ㄣ + < ㄤ + < ㆲ + < ㄥ + < ㆰ + < ㆱ + < ㆬ + < ㄦ + < ㄧ + << ㆪ + <<< ㆳ + < ㄨ + << ㆫ + << ㆨ + < ㄩ + < ꀀ + < ꀁ + < ꀂ + < ꀃ + < ꀄ + < ꀅ + < ꀆ + < ꀇ + < ꀈ + < ꀉ + < ꀊ + < ꀋ + < ꀌ + < ꀍ + < ꀎ + < ꀏ + < ꀐ + < ꀑ + < ꀒ + < ꀓ + < ꀔ + < ꀕ + < ꀖ + < ꀗ + < ꀘ + < ꀙ + < ꀚ + < ꀛ + < ꀜ + < ꀝ + < ꀞ + < ꀟ + < ꀠ + < ꀡ + < ꀢ + < ꀣ + < ꀤ + < ꀥ + < ꀦ + < ꀧ + < ꀨ + < ꀩ + < ꀪ + < ꀫ + < ꀬ + < ꀭ + < ꀮ + < ꀯ + < ꀰ + < ꀱ + < ꀲ + < ꀳ + < ꀴ + < ꀵ + < ꀶ + < ꀷ + < ꀸ + < ꀹ + < ꀺ + < ꀻ + < ꀼ + < ꀽ + < ꀾ + < ꀿ + < ꁀ + < ꁁ + < ꁂ + < ꁃ + < ꁄ + < ꁅ + < ꁆ + < ꁇ + < ꁈ + < ꁉ + < ꁊ + < ꁋ + < ꁌ + < ꁍ + < ꁎ + < ꁏ + < ꁐ + < ꁑ + < ꁒ + < ꁓ + < ꁔ + < ꁕ + < ꁖ + < ꁗ + < ꁘ + < ꁙ + < ꁚ + < ꁛ + < ꁜ + < ꁝ + < ꁞ + < ꁟ + < ꁠ + < ꁡ + < ꁢ + < ꁣ + < ꁤ + < ꁥ + < ꁦ + < ꁧ + < ꁨ + < ꁩ + < ꁪ + < ꁫ + < ꁬ + < ꁭ + < ꁮ + < ꁯ + < ꁰ + < ꁱ + < ꁲ + < ꁳ + < ꁴ + < ꁵ + < ꁶ + < ꁷ + < ꁸ + < ꁹ + < ꁺ + < ꁻ + < ꁼ + < ꁽ + < ꁾ + < ꁿ + < ꂀ + < ꂁ + < ꂂ + < ꂃ + < ꂄ + < ꂅ + < ꂆ + < ꂇ + < ꂈ + < ꂉ + < ꂊ + < ꂋ + < ꂌ + < ꂍ + < ꂎ + < ꂏ + < ꂐ + < ꂑ + < ꂒ + < ꂓ + < ꂔ + < ꂕ + < ꂖ + < ꂗ + < ꂘ + < ꂙ + < ꂚ + < ꂛ + < ꂜ + < ꂝ + < ꂞ + < ꂟ + < ꂠ + < ꂡ + < ꂢ + < ꂣ + < ꂤ + < ꂥ + < ꂦ + < ꂧ + < ꂨ + < ꂩ + < ꂪ + < ꂫ + < ꂬ + < ꂭ + < ꂮ + < ꂯ + < ꂰ + < ꂱ + < ꂲ + < ꂳ + < ꂴ + < ꂵ + < ꂶ + < ꂷ + < ꂸ + < ꂹ + < ꂺ + < ꂻ + < ꂼ + < ꂽ + < ꂾ + < ꂿ + < ꃀ + < ꃁ + < ꃂ + < ꃃ + < ꃄ + < ꃅ + < ꃆ + < ꃇ + < ꃈ + < ꃉ + < ꃊ + < ꃋ + < ꃌ + < ꃍ + < ꃎ + < ꃏ + < ꃐ + < ꃑ + < ꃒ + < ꃓ + < ꃔ + < ꃕ + < ꃖ + < ꃗ + < ꃘ + < ꃙ + < ꃚ + < ꃛ + < ꃜ + < ꃝ + < ꃞ + < ꃟ + < ꃠ + < ꃡ + < ꃢ + < ꃣ + < ꃤ + < ꃥ + < ꃦ + < ꃧ + < ꃨ + < ꃩ + < ꃪ + < ꃫ + < ꃬ + < ꃭ + < ꃮ + < ꃯ + < ꃰ + < ꃱ + < ꃲ + < ꃳ + < ꃴ + < ꃵ + < ꃶ + < ꃷ + < ꃸ + < ꃹ + < ꃺ + < ꃻ + < ꃼ + < ꃽ + < ꃾ + < ꃿ + < ꄀ + < ꄁ + < ꄂ + < ꄃ + < ꄄ + < ꄅ + < ꄆ + < ꄇ + < ꄈ + < ꄉ + < ꄊ + < ꄋ + < ꄌ + < ꄍ + < ꄎ + < ꄏ + < ꄐ + < ꄑ + < ꄒ + < ꄓ + < ꄔ + < ꄕ + < ꄖ + < ꄗ + < ꄘ + < ꄙ + < ꄚ + < ꄛ + < ꄜ + < ꄝ + < ꄞ + < ꄟ + < ꄠ + < ꄡ + < ꄢ + < ꄣ + < ꄤ + < ꄥ + < ꄦ + < ꄧ + < ꄨ + < ꄩ + < ꄪ + < ꄫ + < ꄬ + < ꄭ + < ꄮ + < ꄯ + < ꄰ + < ꄱ + < ꄲ + < ꄳ + < ꄴ + < ꄵ + < ꄶ + < ꄷ + < ꄸ + < ꄹ + < ꄺ + < ꄻ + < ꄼ + < ꄽ + < ꄾ + < ꄿ + < ꅀ + < ꅁ + < ꅂ + < ꅃ + < ꅄ + < ꅅ + < ꅆ + < ꅇ + < ꅈ + < ꅉ + < ꅊ + < ꅋ + < ꅌ + < ꅍ + < ꅎ + < ꅏ + < ꅐ + < ꅑ + < ꅒ + < ꅓ + < ꅔ + < ꅕ + < ꅖ + < ꅗ + < ꅘ + < ꅙ + < ꅚ + < ꅛ + < ꅜ + < ꅝ + < ꅞ + < ꅟ + < ꅠ + < ꅡ + < ꅢ + < ꅣ + < ꅤ + < ꅥ + < ꅦ + < ꅧ + < ꅨ + < ꅩ + < ꅪ + < ꅫ + < ꅬ + < ꅭ + < ꅮ + < ꅯ + < ꅰ + < ꅱ + < ꅲ + < ꅳ + < ꅴ + < ꅵ + < ꅶ + < ꅷ + < ꅸ + < ꅹ + < ꅺ + < ꅻ + < ꅼ + < ꅽ + < ꅾ + < ꅿ + < ꆀ + < ꆁ + < ꆂ + < ꆃ + < ꆄ + < ꆅ + < ꆆ + < ꆇ + < ꆈ + < ꆉ + < ꆊ + < ꆋ + < ꆌ + < ꆍ + < ꆎ + < ꆏ + < ꆐ + < ꆑ + < ꆒ + < ꆓ + < ꆔ + < ꆕ + < ꆖ + < ꆗ + < ꆘ + < ꆙ + < ꆚ + < ꆛ + < ꆜ + < ꆝ + < ꆞ + < ꆟ + < ꆠ + < ꆡ + < ꆢ + < ꆣ + < ꆤ + < ꆥ + < ꆦ + < ꆧ + < ꆨ + < ꆩ + < ꆪ + < ꆫ + < ꆬ + < ꆭ + < ꆮ + < ꆯ + < ꆰ + < ꆱ + < ꆲ + < ꆳ + < ꆴ + < ꆵ + < ꆶ + < ꆷ + < ꆸ + < ꆹ + < ꆺ + < ꆻ + < ꆼ + < ꆽ + < ꆾ + < ꆿ + < ꇀ + < ꇁ + < ꇂ + < ꇃ + < ꇄ + < ꇅ + < ꇆ + < ꇇ + < ꇈ + < ꇉ + < ꇊ + < ꇋ + < ꇌ + < ꇍ + < ꇎ + < ꇏ + < ꇐ + < ꇑ + < ꇒ + < ꇓ + < ꇔ + < ꇕ + < ꇖ + < ꇗ + < ꇘ + < ꇙ + < ꇚ + < ꇛ + < ꇜ + < ꇝ + < ꇞ + < ꇟ + < ꇠ + < ꇡ + < ꇢ + < ꇣ + < ꇤ + < ꇥ + < ꇦ + < ꇧ + < ꇨ + < ꇩ + < ꇪ + < ꇫ + < ꇬ + < ꇭ + < ꇮ + < ꇯ + < ꇰ + < ꇱ + < ꇲ + < ꇳ + < ꇴ + < ꇵ + < ꇶ + < ꇷ + < ꇸ + < ꇹ + < ꇺ + < ꇻ + < ꇼ + < ꇽ + < ꇾ + < ꇿ + < ꈀ + < ꈁ + < ꈂ + < ꈃ + < ꈄ + < ꈅ + < ꈆ + < ꈇ + < ꈈ + < ꈉ + < ꈊ + < ꈋ + < ꈌ + < ꈍ + < ꈎ + < ꈏ + < ꈐ + < ꈑ + < ꈒ + < ꈓ + < ꈔ + < ꈕ + < ꈖ + < ꈗ + < ꈘ + < ꈙ + < ꈚ + < ꈛ + < ꈜ + < ꈝ + < ꈞ + < ꈟ + < ꈠ + < ꈡ + < ꈢ + < ꈣ + < ꈤ + < ꈥ + < ꈦ + < ꈧ + < ꈨ + < ꈩ + < ꈪ + < ꈫ + < ꈬ + < ꈭ + < ꈮ + < ꈯ + < ꈰ + < ꈱ + < ꈲ + < ꈳ + < ꈴ + < ꈵ + < ꈶ + < ꈷ + < ꈸ + < ꈹ + < ꈺ + < ꈻ + < ꈼ + < ꈽ + < ꈾ + < ꈿ + < ꉀ + < ꉁ + < ꉂ + < ꉃ + < ꉄ + < ꉅ + < ꉆ + < ꉇ + < ꉈ + < ꉉ + < ꉊ + < ꉋ + < ꉌ + < ꉍ + < ꉎ + < ꉏ + < ꉐ + < ꉑ + < ꉒ + < ꉓ + < ꉔ + < ꉕ + < ꉖ + < ꉗ + < ꉘ + < ꉙ + < ꉚ + < ꉛ + < ꉜ + < ꉝ + < ꉞ + < ꉟ + < ꉠ + < ꉡ + < ꉢ + < ꉣ + < ꉤ + < ꉥ + < ꉦ + < ꉧ + < ꉨ + < ꉩ + < ꉪ + < ꉫ + < ꉬ + < ꉭ + < ꉮ + < ꉯ + < ꉰ + < ꉱ + < ꉲ + < ꉳ + < ꉴ + < ꉵ + < ꉶ + < ꉷ + < ꉸ + < ꉹ + < ꉺ + < ꉻ + < ꉼ + < ꉽ + < ꉾ + < ꉿ + < ꊀ + < ꊁ + < ꊂ + < ꊃ + < ꊄ + < ꊅ + < ꊆ + < ꊇ + < ꊈ + < ꊉ + < ꊊ + < ꊋ + < ꊌ + < ꊍ + < ꊎ + < ꊏ + < ꊐ + < ꊑ + < ꊒ + < ꊓ + < ꊔ + < ꊕ + < ꊖ + < ꊗ + < ꊘ + < ꊙ + < ꊚ + < ꊛ + < ꊜ + < ꊝ + < ꊞ + < ꊟ + < ꊠ + < ꊡ + < ꊢ + < ꊣ + < ꊤ + < ꊥ + < ꊦ + < ꊧ + < ꊨ + < ꊩ + < ꊪ + < ꊫ + < ꊬ + < ꊭ + < ꊮ + < ꊯ + < ꊰ + < ꊱ + < ꊲ + < ꊳ + < ꊴ + < ꊵ + < ꊶ + < ꊷ + < ꊸ + < ꊹ + < ꊺ + < ꊻ + < ꊼ + < ꊽ + < ꊾ + < ꊿ + < ꋀ + < ꋁ + < ꋂ + < ꋃ + < ꋄ + < ꋅ + < ꋆ + < ꋇ + < ꋈ + < ꋉ + < ꋊ + < ꋋ + < ꋌ + < ꋍ + < ꋎ + < ꋏ + < ꋐ + < ꋑ + < ꋒ + < ꋓ + < ꋔ + < ꋕ + < ꋖ + < ꋗ + < ꋘ + < ꋙ + < ꋚ + < ꋛ + < ꋜ + < ꋝ + < ꋞ + < ꋟ + < ꋠ + < ꋡ + < ꋢ + < ꋣ + < ꋤ + < ꋥ + < ꋦ + < ꋧ + < ꋨ + < ꋩ + < ꋪ + < ꋫ + < ꋬ + < ꋭ + < ꋮ + < ꋯ + < ꋰ + < ꋱ + < ꋲ + < ꋳ + < ꋴ + < ꋵ + < ꋶ + < ꋷ + < ꋸ + < ꋹ + < ꋺ + < ꋻ + < ꋼ + < ꋽ + < ꋾ + < ꋿ + < ꌀ + < ꌁ + < ꌂ + < ꌃ + < ꌄ + < ꌅ + < ꌆ + < ꌇ + < ꌈ + < ꌉ + < ꌊ + < ꌋ + < ꌌ + < ꌍ + < ꌎ + < ꌏ + < ꌐ + < ꌑ + < ꌒ + < ꌓ + < ꌔ + < ꌕ + < ꌖ + < ꌗ + < ꌘ + < ꌙ + < ꌚ + < ꌛ + < ꌜ + < ꌝ + < ꌞ + < ꌟ + < ꌠ + < ꌡ + < ꌢ + < ꌣ + < ꌤ + < ꌥ + < ꌦ + < ꌧ + < ꌨ + < ꌩ + < ꌪ + < ꌫ + < ꌬ + < ꌭ + < ꌮ + < ꌯ + < ꌰ + < ꌱ + < ꌲ + < ꌳ + < ꌴ + < ꌵ + < ꌶ + < ꌷ + < ꌸ + < ꌹ + < ꌺ + < ꌻ + < ꌼ + < ꌽ + < ꌾ + < ꌿ + < ꍀ + < ꍁ + < ꍂ + < ꍃ + < ꍄ + < ꍅ + < ꍆ + < ꍇ + < ꍈ + < ꍉ + < ꍊ + < ꍋ + < ꍌ + < ꍍ + < ꍎ + < ꍏ + < ꍐ + < ꍑ + < ꍒ + < ꍓ + < ꍔ + < ꍕ + < ꍖ + < ꍗ + < ꍘ + < ꍙ + < ꍚ + < ꍛ + < ꍜ + < ꍝ + < ꍞ + < ꍟ + < ꍠ + < ꍡ + < ꍢ + < ꍣ + < ꍤ + < ꍥ + < ꍦ + < ꍧ + < ꍨ + < ꍩ + < ꍪ + < ꍫ + < ꍬ + < ꍭ + < ꍮ + < ꍯ + < ꍰ + < ꍱ + < ꍲ + < ꍳ + < ꍴ + < ꍵ + < ꍶ + < ꍷ + < ꍸ + < ꍹ + < ꍺ + < ꍻ + < ꍼ + < ꍽ + < ꍾ + < ꍿ + < ꎀ + < ꎁ + < ꎂ + < ꎃ + < ꎄ + < ꎅ + < ꎆ + < ꎇ + < ꎈ + < ꎉ + < ꎊ + < ꎋ + < ꎌ + < ꎍ + < ꎎ + < ꎏ + < ꎐ + < ꎑ + < ꎒ + < ꎓ + < ꎔ + < ꎕ + < ꎖ + < ꎗ + < ꎘ + < ꎙ + < ꎚ + < ꎛ + < ꎜ + < ꎝ + < ꎞ + < ꎟ + < ꎠ + < ꎡ + < ꎢ + < ꎣ + < ꎤ + < ꎥ + < ꎦ + < ꎧ + < ꎨ + < ꎩ + < ꎪ + < ꎫ + < ꎬ + < ꎭ + < ꎮ + < ꎯ + < ꎰ + < ꎱ + < ꎲ + < ꎳ + < ꎴ + < ꎵ + < ꎶ + < ꎷ + < ꎸ + < ꎹ + < ꎺ + < ꎻ + < ꎼ + < ꎽ + < ꎾ + < ꎿ + < ꏀ + < ꏁ + < ꏂ + < ꏃ + < ꏄ + < ꏅ + < ꏆ + < ꏇ + < ꏈ + < ꏉ + < ꏊ + < ꏋ + < ꏌ + < ꏍ + < ꏎ + < ꏏ + < ꏐ + < ꏑ + < ꏒ + < ꏓ + < ꏔ + < ꏕ + < ꏖ + < ꏗ + < ꏘ + < ꏙ + < ꏚ + < ꏛ + < ꏜ + < ꏝ + < ꏞ + < ꏟ + < ꏠ + < ꏡ + < ꏢ + < ꏣ + < ꏤ + < ꏥ + < ꏦ + < ꏧ + < ꏨ + < ꏩ + < ꏪ + < ꏫ + < ꏬ + < ꏭ + < ꏮ + < ꏯ + < ꏰ + < ꏱ + < ꏲ + < ꏳ + < ꏴ + < ꏵ + < ꏶ + < ꏷ + < ꏸ + < ꏹ + < ꏺ + < ꏻ + < ꏼ + < ꏽ + < ꏾ + < ꏿ + < ꐀ + < ꐁ + < ꐂ + < ꐃ + < ꐄ + < ꐅ + < ꐆ + < ꐇ + < ꐈ + < ꐉ + < ꐊ + < ꐋ + < ꐌ + < ꐍ + < ꐎ + < ꐏ + < ꐐ + < ꐑ + < ꐒ + < ꐓ + < ꐔ + < ꐕ + < ꐖ + < ꐗ + < ꐘ + < ꐙ + < ꐚ + < ꐛ + < ꐜ + < ꐝ + < ꐞ + < ꐟ + < ꐠ + < ꐡ + < ꐢ + < ꐣ + < ꐤ + < ꐥ + < ꐦ + < ꐧ + < ꐨ + < ꐩ + < ꐪ + < ꐫ + < ꐬ + < ꐭ + < ꐮ + < ꐯ + < ꐰ + < ꐱ + < ꐲ + < ꐳ + < ꐴ + < ꐵ + < ꐶ + < ꐷ + < ꐸ + < ꐹ + < ꐺ + < ꐻ + < ꐼ + < ꐽ + < ꐾ + < ꐿ + < ꑀ + < ꑁ + < ꑂ + < ꑃ + < ꑄ + < ꑅ + < ꑆ + < ꑇ + < ꑈ + < ꑉ + < ꑊ + < ꑋ + < ꑌ + < ꑍ + < ꑎ + < ꑏ + < ꑐ + < ꑑ + < ꑒ + < ꑓ + < ꑔ + < ꑕ + < ꑖ + < ꑗ + < ꑘ + < ꑙ + < ꑚ + < ꑛ + < ꑜ + < ꑝ + < ꑞ + < ꑟ + < ꑠ + < ꑡ + < ꑢ + < ꑣ + < ꑤ + < ꑥ + < ꑦ + < ꑧ + < ꑨ + < ꑩ + < ꑪ + < ꑫ + < ꑬ + < ꑭ + < ꑮ + < ꑯ + < ꑰ + < ꑱ + < ꑲ + < ꑳ + < ꑴ + < ꑵ + < ꑶ + < ꑷ + < ꑸ + < ꑹ + < ꑺ + < ꑻ + < ꑼ + < ꑽ + < ꑾ + < ꑿ + < ꒀ + < ꒁ + < ꒂ + < ꒃ + < ꒄ + < ꒅ + < ꒆ + < ꒇ + < ꒈ + < ꒉ + < ꒊ + < ꒋ + < ꒌ + < 𐌀 + < 𐌁 + < 𐌂 + < 𐌃 + < 𐌄 + < 𐌅 + < 𐌆 + < 𐌇 + < 𐌈 + < 𐌉 + < 𐌊 + < 𐌋 + < 𐌌 + < 𐌍 + < 𐌎 + < 𐌏 + < 𐌐 + < 𐌑 + < 𐌒 + < 𐌓 + < 𐌔 + < 𐌕 + < 𐌖 + < 𐌗 + < 𐌘 + < 𐌙 + < 𐌚 + < 𐌛 + < 𐌜 + < 𐌝 + < 𐌞 + < 𐌰 + < 𐌱 + < 𐌲 + < 𐌳 + < 𐌴 + < 𐌵 + < 𐌶 + < 𐌷 + < 𐌸 + < 𐌹 + < 𐌺 + < 𐌻 + < 𐌼 + < 𐌽 + < 𐌾 + < 𐌿 + < 𐍀 + < 𐍁 + < 𐍂 + < 𐍃 + < 𐍄 + < 𐍅 + < 𐍆 + < 𐍇 + < 𐍈 + < 𐍉 + < 𐍊 + < 𐐨 + <<< 𐐀 + < 𐐩 + <<< 𐐁 + < 𐐪 + <<< 𐐂 + < 𐐫 + <<< 𐐃 + < 𐐬 + <<< 𐐄 + < 𐐭 + <<< 𐐅 + < 𐐮 + <<< 𐐆 + < 𐐯 + <<< 𐐇 + < 𐐰 + <<< 𐐈 + < 𐐱 + <<< 𐐉 + < 𐐲 + <<< 𐐊 + < 𐐳 + <<< 𐐋 + < 𐐴 + <<< 𐐌 + < 𐐵 + <<< 𐐍 + < 𐐶 + <<< 𐐎 + < 𐐷 + <<< 𐐏 + < 𐐸 + <<< 𐐐 + < 𐐹 + <<< 𐐑 + < 𐐺 + <<< 𐐒 + < 𐐻 + <<< 𐐓 + < 𐐼 + <<< 𐐔 + < 𐐽 + <<< 𐐕 + < 𐐾 + <<< 𐐖 + < 𐐿 + <<< 𐐗 + < 𐑀 + <<< 𐐘 + < 𐑁 + <<< 𐐙 + < 𐑂 + <<< 𐐚 + < 𐑃 + <<< 𐐛 + < 𐑄 + <<< 𐐜 + < 𐑅 + <<< 𐐝 + < 𐑆 + <<< 𐐞 + < 𐑇 + <<< 𐐟 + < 𐑈 + <<< 𐐠 + < 𐑉 + <<< 𐐡 + < 𐑊 + <<< 𐐢 + < 𐑋 + <<< 𐐣 + < 𐑌 + <<< 𐐤 + < 𐑍 + <<< 𐐥 + < 𐑎 + <<< 𐐦 + < 𐑏 + <<< 𐐧 + < 𐑐 + < 𐑑 + < 𐑒 + < 𐑓 + < 𐑔 + < 𐑕 + < 𐑖 + < 𐑗 + < 𐑘 + < 𐑙 + < 𐑚 + < 𐑛 + < 𐑜 + < 𐑝 + < 𐑞 + < 𐑟 + < 𐑠 + < 𐑡 + < 𐑢 + < 𐑣 + < 𐑤 + < 𐑥 + < 𐑦 + < 𐑧 + < 𐑨 + < 𐑩 + < 𐑪 + < 𐑫 + < 𐑬 + < 𐑭 + < 𐑮 + < 𐑯 + < 𐑰 + < 𐑱 + < 𐑲 + < 𐑳 + < 𐑴 + < 𐑵 + < 𐑶 + < 𐑷 + < 𐑸 + < 𐑹 + < 𐑺 + < 𐑻 + < 𐑼 + < 𐑽 + < 𐑾 + < 𐑿 + < 𐒀 + < 𐒁 + < 𐒂 + < 𐒃 + < 𐒄 + < 𐒅 + < 𐒆 + < 𐒇 + < 𐒈 + < 𐒉 + < 𐒊 + < 𐒋 + < 𐒌 + < 𐒍 + < 𐒎 + < 𐒏 + < 𐒐 + < 𐒑 + < 𐒒 + < 𐒓 + < 𐒔 + < 𐒕 + < 𐒖 + < 𐒗 + < 𐒘 + < 𐒙 + < 𐒚 + < 𐒛 + < 𐒜 + < 𐒝 + < 𐀀 + < 𐀁 + < 𐀂 + < 𐀃 + < 𐀄 + < 𐀅 + < 𐀆 + < 𐀇 + < 𐀈 + < 𐀉 + < 𐀊 + < 𐀋 + < 𐀍 + < 𐀎 + < 𐀏 + < 𐀐 + < 𐀑 + < 𐀒 + < 𐀓 + < 𐀔 + < 𐀕 + < 𐀖 + < 𐀗 + < 𐀘 + < 𐀙 + < 𐀚 + < 𐀛 + < 𐀜 + < 𐀝 + < 𐀞 + < 𐀟 + < 𐀠 + < 𐀡 + < 𐀢 + < 𐀣 + < 𐀤 + < 𐀥 + < 𐀦 + < 𐀨 + < 𐀩 + < 𐀪 + < 𐀫 + < 𐀬 + < 𐀭 + < 𐀮 + < 𐀯 + < 𐀰 + < 𐀱 + < 𐀲 + < 𐀳 + < 𐀴 + < 𐀵 + < 𐀶 + < 𐀷 + < 𐀸 + < 𐀹 + < 𐀺 + < 𐀼 + < 𐀽 + < 𐀿 + < 𐁀 + < 𐁁 + < 𐁂 + < 𐁃 + < 𐁄 + < 𐁅 + < 𐁆 + < 𐁇 + < 𐁈 + < 𐁉 + < 𐁊 + < 𐁋 + < 𐁌 + < 𐁍 + < 𐁐 + < 𐁑 + < 𐁒 + < 𐁓 + < 𐁔 + < 𐁕 + < 𐁖 + < 𐁗 + < 𐁘 + < 𐁙 + < 𐁚 + < 𐁛 + < 𐁜 + < 𐁝 + < 𐂀 + < 𐂁 + < 𐂂 + < 𐂃 + < 𐂄 + < 𐂅 + < 𐂆 + < 𐂇 + < 𐂈 + < 𐂉 + < 𐂊 + < 𐂋 + < 𐂌 + < 𐂍 + < 𐂎 + < 𐂏 + < 𐂐 + < 𐂑 + < 𐂒 + < 𐂓 + < 𐂔 + < 𐂕 + < 𐂖 + < 𐂗 + < 𐂘 + < 𐂙 + < 𐂚 + < 𐂛 + < 𐂜 + < 𐂝 + < 𐂞 + < 𐂟 + < 𐂠 + < 𐂡 + < 𐂢 + < 𐂣 + < 𐂤 + < 𐂥 + < 𐂦 + < 𐂧 + < 𐂨 + < 𐂩 + < 𐂪 + < 𐂫 + < 𐂬 + < 𐂭 + < 𐂮 + < 𐂯 + < 𐂰 + < 𐂱 + < 𐂲 + < 𐂳 + < 𐂴 + < 𐂵 + < 𐂶 + < 𐂷 + < 𐂸 + < 𐂹 + < 𐂺 + < 𐂻 + < 𐂼 + < 𐂽 + < 𐂾 + < 𐂿 + < 𐃀 + < 𐃁 + < 𐃂 + < 𐃃 + < 𐃄 + < 𐃅 + < 𐃆 + < 𐃇 + < 𐃈 + < 𐃉 + < 𐃊 + < 𐃋 + < 𐃌 + < 𐃍 + < 𐃎 + < 𐃏 + < 𐃐 + < 𐃑 + < 𐃒 + < 𐃓 + < 𐃔 + < 𐃕 + < 𐃖 + < 𐃗 + < 𐃘 + < 𐃙 + < 𐃚 + < 𐃛 + < 𐃜 + < 𐃝 + < 𐃞 + < 𐃟 + < 𐃠 + < 𐃡 + < 𐃢 + < 𐃣 + < 𐃤 + < 𐃥 + < 𐃦 + < 𐃧 + < 𐃨 + < 𐃩 + < 𐃪 + < 𐃫 + < 𐃬 + < 𐃭 + < 𐃮 + < 𐃯 + < 𐃰 + < 𐃱 + < 𐃲 + < 𐃳 + < 𐃴 + < 𐃵 + < 𐃶 + < 𐃷 + < 𐃸 + < 𐃹 + < 𐃺 + < 𐠀 + < 𐠁 + < 𐠂 + < 𐠃 + < 𐠄 + < 𐠅 + < 𐠈 + < 𐠊 + < 𐠋 + < 𐠌 + < 𐠍 + < 𐠎 + < 𐠏 + < 𐠐 + < 𐠑 + < 𐠒 + < 𐠓 + < 𐠔 + < 𐠕 + < 𐠖 + < 𐠗 + < 𐠘 + < 𐠙 + < 𐠚 + < 𐠛 + < 𐠜 + < 𐠝 + < 𐠞 + < 𐠟 + < 𐠠 + < 𐠡 + < 𐠢 + < 𐠣 + < 𐠤 + < 𐠥 + < 𐠦 + < 𐠧 + < 𐠨 + < 𐠩 + < 𐠪 + < 𐠫 + < 𐠬 + < 𐠭 + < 𐠮 + < 𐠯 + < 𐠰 + < 𐠱 + < 𐠲 + < 𐠳 + < 𐠴 + < 𐠵 + < 𐠷 + < 𐠸 + < 𐠼 + < 𐠿 + < 𐎀 + < 𐎁 + < 𐎂 + < 𐎃 + < 𐎄 + < 𐎅 + < 𐎆 + < 𐎇 + < 𐎈 + < 𐎉 + < 𐎊 + < 𐎋 + < 𐎌 + < 𐎍 + < 𐎎 + < 𐎏 + < 𐎐 + < 𐎑 + < 𐎒 + < 𐎓 + < 𐎔 + < 𐎕 + < 𐎖 + < 𐎗 + < 𐎘 + < 𐎙 + < 𐎚 + < 𐎛 + < 𐎜 + < 𐎝 +& 一 + <<< ⼀ + <<< ㊀ + <<< ㆒ +& 丁 + <<< ㆜ +& 七 + <<< ㊆ +& 三 + <<< ㊂ + <<< ㆔ +& 上 + <<< ㊤ + <<< ㆖ +& 下 + <<< ㊦ + <<< ㆘ +& 丙 + <<< ㆛ +& 丨 + <<< ⼁ +& 丬 + <<< ⺦ +& 中 + <<< ㊥ + <<< ㆗ +& 丶 + <<< ⼂ + << ⺀ +& 丸 + = 丸 +& 丽 + = 丽 +& 丿 + <<< ⼃ +& 乁 + = 乁 +& 乙 + <<< ⼄ + <<< ㆚ + << ⺄ +& 乚 + <<< ⺃ +& 乛 + <<< ⺂ +& 九 + <<< ㊈ +& 亅 + <<< ⼅ +& 二 + <<< ⼆ + <<< ㊁ + <<< ㆓ +& 五 + <<< ㊄ +& 亠 + <<< ⼇ +& 人 + <<< ⼈ + <<< ㆟ +& 亻 + <<< ⺅ +& 仌 + = 仌 +& 企 + <<< ㊭ +& 休 + <<< ㊡ +& ä½  + = ä½  +& ä¾® + = ä¾® +& ä¾» + = ä¾» +& 倂 + = 倂 +& 偺 + = 偺 +& 備 + = 備 +& 像 + = 像 +& 僧 + = 僧 +& 優 + <<< ㊝ +& 儿 + <<< ⼉ +& 免 + = 免 +& 兔 + = 兔 +& 兤 + = 兤 +& 入 + <<< ⼊ +& 內 + = 內 +& 八 + <<< ⼋ + <<< ㊇ +& 六 + <<< ㊅ +& 具 + = 具 +& 冂 + <<< ⼌ + << ⺆ +& 再 + = 再 +& 冒 + = 冒 +& 冕 + = 冕 +& 冖 + <<< ⼍ +& 冗 + = 冗 +& 写 + <<< ㊢ +& 冤 + = 冤 +& 冫 + <<< ⼎ +& 冬 + = 冬 +& 况 + = 况 +& 几 + <<< ⼏ + << ⺇ +& 凵 + = 凵 + <<< ⼐ +& 刀 + <<< ⼑ + << ⺈ +& 刂 + <<< ⺉ +& 刃 + = 刃 +& 切 + = 切 +& 刻 + = 刻 +& 剆 + = 剆 +& 割 + = 割 +& 剷 + = 剷 +& 力 + <<< ⼒ +& 劳 + = 劳 +& 労 + <<< ㊘ +& 勇 + = 勇 +& 勉 + = 勉 +& 勤 + = 勤 +& 勹 + <<< ⼓ +& 勺 + = 勺 +& 包 + = 包 +& 匆 + = 匆 +& 匕 + <<< ⼔ +& 北 + = 北 +& 匚 + <<< ⼕ +& 匸 + <<< ⼖ +& 医 + <<< ㊩ +& 十 + <<< ⼗ + = 〸 + <<< ㊉ +& 卄 + <<< 〹 +& 卅 + <<< 〺 +& 卉 + = 卉 +& 卑 + = 卑 +& 協 + <<< ㊯ +& 博 + = 博 +& 卜 + <<< ⼘ + << ⺊ +& 卩 + <<< ⼙ + << ⺋ +& 印 + <<< ㊞ +& 即 + = 即 +& 卽 + = 卽 +& 卿 + = 卿 + = 卿 + = 卿 +& 厂 + <<< ⼚ + << ⺁ +& 厶 + <<< ⼛ +& 又 + <<< ⼜ +& 及 + = 及 +& 叟 + = 叟 +& 口 + <<< ⼝ +& 叫 + = 叫 +& 叱 + = 叱 +& 右 + <<< ㊨ +& 吆 + = 吆 +& 名 + <<< ㊔ +& 吸 + = 吸 +& 呈 + = 呈 +& 周 + = 周 +& 咞 + = 咞 +& 咢 + = 咢 +& 哶 + = 哶 +& 唐 + = 唐 +& 啓 + = 啓 +& 啣 + = 啣 +& 善 + = 善 + = 善 +& 喙 + = 喙 +& 喫 + = 喫 +& 喳 + = 喳 +& 嗂 + = 嗂 +& 嘆 + = 嘆 +& 噑 + = 噑 +& 噴 + = 噴 +& 囗 + <<< ⼞ +& 四 + <<< ㊃ + <<< ㆕ +& 圖 + = 圖 +& 圗 + = 圗 +& 土 + <<< ⼟ + <<< ㊏ +& 地 + <<< ㆞ +& 型 + = 型 +& 城 + = 城 +& 埴 + = 埴 +& 堍 + = 堍 +& å ± + = å ± +& å ² + = å ² +& 墬 + = 墬 +& 士 + <<< â¼  +& 壮 + = 壮 +& 売 + = 売 +& 壷 + = 壷 +& 夂 + <<< ⼡ +& 夆 + = 夆 +& 夊 + <<< â¼¢ +& 夕 + <<< â¼£ +& 多 + = 多 +& 夜 + <<< ㊰ +& 夢 + = 夢 +& 大 + <<< ⼤ + <<< ㍽ / æ­£ +& 天 + <<< ㆝ +& 奢 + = 奢 +& 女 + <<< â¼¥ + <<< ㊛ +& 姘 + = 姘 +& 姬 + = 姬 +& 娛 + = 娛 +& 娧 + = 娧 +& 婦 + = 婦 +& 媵 + = 媵 +& 嬈 + = 嬈 +& 嬾 + = 嬾 + = 嬾 +& 子 + <<< ⼦ +& å­¦ + <<< ㊫ +& 宀 + <<< â¼§ +& 宗 + <<< ㊪ +& 寃 + = 寃 +& 寘 + = 寘 +& 寧 + = 寧 +& 寳 + = 寳 +& 寸 + <<< ⼨ +& 寿 + = 寿 +& 将 + = 将 +& 小 + <<< ⼩ + << ⺌ + << ⺍ +& å°¢ + = å°¢ + <<< ⺐ + = ⼪ + << ⺎ +& å°£ + <<< ⺏ + << ⺑ +& å°¸ + <<< ⼫ +& å±  + = å±  +& å±® + = å±® + <<< ⼬ +& å±± + <<< â¼­ +& 岍 + = 岍 +& 峀 + = 峀 +& 嵃 + = 嵃 +& 嵫 + = 嵫 +& åµ® + = åµ® +& åµ¼ + = åµ¼ +& å¶² + = å¶² +& 巛 + <<< â¼® +& å·¡ + = å·¡ +& å·¢ + = å·¢ +& å·¥ + <<< ⼯ +& å·¦ + <<< ㊧ +& å·± + <<< â¼° +& å·³ + <<< ⺒ +& å·½ + = å·½ +& å·¾ + <<< â¼± +& 帨 + = 帨 +& 帽 + = 帽 +& 幩 + = 幩 +& å¹² + <<< â¼² +& å¹³ + < ㍻ / 成 +& 幺 + <<< ⺓ + = â¼³ +& 广 + <<< â¼´ +& 庰 + = 庰 +& 庳 + = 庳 +& 庶 + = 庶 +& 廊 + = 廊 +& å»´ + <<< â¼µ +& 廾 + = 廾 + <<< â¼¶ +& 弋 + <<< â¼· +& 弓 + <<< ⼸ +& å¼¢ + = å¼¢ + = å¼¢ +& 彐 + <<< â¼¹ + << ⺕ +& 彑 + <<< ⺔ +& 当 + = 当 +& 彡 + <<< ⼺ +& å½¢ + = å½¢ +& 彫 + = 彫 +& å½³ + <<< â¼» +& 徚 + = 徚 +& 心 + <<< â¼¼ + << ⺗ +& 忄 + <<< ⺖ +& 忍 + = 忍 +& 志 + = 志 +& 忹 + = 忹 +& 悁 + = 悁 +& 悔 + = 悔 +& 惇 + = 惇 +& 慈 + = 慈 +& 慌 + = 慌 + = 慌 +& 慎 + = 慎 +& 慺 + = 慺 +& 憎 + = 憎 +& 憤 + = 憤 +& 憯 + = 憯 +& 憲 + = 憲 +& 懞 + = 懞 +& 懲 + = 懲 +& 懶 + = 懶 +& 戈 + <<< â¼½ +& 成 + = 成 +& 戛 + = 戛 +& 戶 + <<< â¼¾ +& 手 + <<< ⼿ +& 扌 + <<< ⺘ +& 扝 + = 扝 +& 抱 + = 抱 +& 拔 + = 拔 +& 拼 + = 拼 +& 挽 + = 挽 +& 捐 + = 捐 +& 捨 + = 捨 +& 掃 + = 掃 +& 掩 + = 掩 +& 揅 + = 揅 +& 揤 + = 揤 +& 搢 + = 搢 +& 摩 + = 摩 +& 摷 + = 摷 +& 摾 + = 摾 +& 撝 + = 撝 +& 支 + <<< ⽀ +& 攴 + <<< ⽁ +& 攵 + <<< ⺙ +& 敏 + = 敏 +& 敬 + = 敬 +& 文 + <<< ⽂ +& 斗 + <<< ⽃ +& 斤 + <<< ⽄ +& 方 + <<< ⽅ +& 无 + <<< ⽆ +& 旡 + <<< ⺛ +& 旣 + = 旣 +& 日 + <<< ⽇ + <<< ㊐ + << ⺜ +& 明 + < ㍾ / æ²» +& 昭 + < ㍼ / 和 +& 晉 + = 晉 +& 暑 + = 暑 +& 暜 + = 暜 +& 曰 + <<< ⽈ +& 書 + = 書 +& 最 + = 最 +& 月 + <<< ⽉ + <<< ㊊ + << ⺝ +& 有 + <<< ㊒ +& 朗 + = 朗 +& 望 + = 望 +& 朡 + = 朡 +& 木 + <<< ⽊ + <<< ㊍ +& 杓 + = 杓 +& 杞 + = 杞 +& 枅 + = 枅 +& 柺 + = 柺 +& 栟 + = 栟 +& æ ª + <<< ㊑ + <<< ㍿ / 式会社 +& 桒 + = 桒 +& 梅 + = 梅 +& 梎 + = 梎 +& 椔 + = 椔 +& 楂 + = 楂 +& 榣 + = 榣 +& 槪 + = 槪 +& 檨 + = 檨 +& 櫛 + = 櫛 +& 欠 + <<< ⽋ +& 次 + = 次 +& 歔 + = 歔 +& æ­¢ + <<< ⽌ +& æ­£ + <<< ㊣ +& æ­² + = æ­² +& æ­¹ + <<< ⽍ +& æ­º + << ⺞ +& 殟 + = 殟 +& 殳 + <<< ⽎ +& 殺 + = 殺 +& æ®» + = æ®» +& 毋 + <<< ⽏ +& 母 + <<< ⺟ +& 比 + <<< ⽐ +& 毛 + <<< ⽑ +& 氏 + <<< ⽒ +& 民 + <<< ⺠ +& 气 + <<< ⽓ +& æ°´ + <<< ⽔ + <<< ㊌ +& æ°µ + <<< ⺡ +& æ°º + <<< ⺢ +& 汎 + = 汎 +& æ±§ + = æ±§ +& 沿 + = 沿 +& 泍 + = 泍 +& 注 + <<< ㊟ +& 洖 + = 洖 +& æ´´ + = æ´´ +& æ´¾ + = æ´¾ +& 流 + = 流 +& 浩 + = 浩 +& æµ· + = æµ· +& 浸 + = 浸 +& 涅 + = 涅 +& æ·¹ + = æ·¹ +& 港 + = 港 +& æ¹® + = æ¹® +& 滇 + = 滇 +& 滋 + = 滋 +& æ½® + = æ½® +& 濆 + = 濆 +& 瀛 + = 瀛 +& 瀞 + = 瀞 +& 瀹 + = 瀹 +& 灊 + = 灊 +& 火 + <<< ⽕ + <<< ㊋ +& 灬 + <<< ⺣ +& 灰 + = 灰 +& 灷 + = 灷 +& 災 + = 災 +& 炭 + = 炭 +& 煅 + = 煅 +& 熜 + = 熜 +& 爨 + = 爨 +& 爪 + <<< ⽖ +& 爫 + <<< ⺤ + << ⺥ +& 爵 + = 爵 +& 父 + <<< ⽗ +& 爻 + <<< ⽘ +& 爿 + <<< ⽙ +& 片 + <<< ⽚ +& 牐 + = 牐 +& 牙 + <<< ⽛ +& 牛 + <<< ⽜ + << ⺧ +& 特 + <<< ㊕ +& 犀 + = 犀 +& 犕 + = 犕 +& 犬 + <<< ⽝ +& 犭 + <<< ⺨ +& 獺 + = 獺 +& 玄 + <<< ⽞ +& 玉 + <<< ⽟ +& 王 + = 王 + << ⺩ +& 玥 + = 玥 +& 瑇 + = 瑇 +& 瑜 + = 瑜 +& 瑱 + = 瑱 +& 璅 + = 璅 +& 瓊 + = 瓊 +& 瓜 + <<< â½  +& 瓦 + <<< ⽡ +& 甘 + <<< â½¢ +& 生 + <<< â½£ +& 甤 + = 甤 +& 用 + <<< ⽤ +& 田 + <<< â½¥ +& 甲 + <<< ㆙ +& 男 + <<< ㊚ +& 甾 + = 甾 +& 異 + = 異 +& 疋 + <<< ⽦ + << ⺪ +& 疒 + <<< â½§ +& 瘐 + = 瘐 +& 癶 + <<< ⽨ +& 白 + <<< ⽩ +& 皮 + <<< ⽪ +& 皿 + <<< ⽫ +& 監 + <<< ㊬ +& 目 + <<< ⽬ + << ⺫ +& 直 + = 直 +& 眞 + = 眞 +& 真 + = 真 + = 真 +& 睊 + = 睊 +& 瞋 + = 瞋 +& 矛 + <<< â½­ +& 矢 + <<< â½® +& 石 + <<< ⽯ +& 硎 + = 硎 +& 碌 + = 碌 +& 磌 + = 磌 +& 示 + <<< â½° + << ⺬ +& 礻 + <<< ⺭ +& 社 + <<< ㊓ +& 祖 + = 祖 +& 祝 + <<< ㊗ +& 福 + = 福 +& 禸 + <<< â½± +& 禾 + <<< â½² +& 秘 + <<< ㊙ +& ç§« + = ç§« +& 穀 + = 穀 +& 穊 + = 穊 +& 穏 + = 穏 +& ç©´ + <<< â½³ +& 立 + <<< â½´ +& ç«® + = ç«® +& 竹 + <<< â½µ + << ⺮ +& 篆 + = 篆 +& 築 + = 築 +& ç±³ + <<< â½¶ +& 糒 + = 糒 +& ç³£ + = ç³£ +& 糨 + = 糨 +& 糸 + <<< â½· +& ç³¹ + <<< ⺯ +& 紀 + = 紀 +& çµ£ + = çµ£ +& 緇 + = 緇 +& 縂 + = 縂 +& 繅 + = 繅 +& 纟 + <<< ⺰ +& ç¼¶ + <<< ⽸ +& 网 + <<< â½¹ +& 罒 + <<< ⺲ + << ⺵ +& 罓 + <<< ⺱ + << ⺳ + << ⺴ +& 罺 + = 罺 +& 羊 + <<< ⽺ + << ⺶ + << ⺷ +& 羋 + <<< ⺸ +& 羕 + = 羕 +& ç¾½ + <<< â½» +& 翺 + = 翺 +& 老 + <<< â½¼ +& 耂 + <<< ⺹ +& 者 + = 者 +& 而 + <<< â½½ +& 耒 + <<< â½¾ +& 耳 + <<< ⽿ +& 聠 + = 聠 +& 聰 + = 聰 +& 聿 + <<< ⾀ + << ⺻ +& 肀 + <<< ⺺ +& 肉 + <<< ⾁ + << ⺼ +& 肭 + = 肭 +& 育 + = 育 +& 脃 + = 脃 +& 脾 + = 脾 +& 臣 + <<< ⾂ +& 自 + <<< ⾃ +& 至 + <<< ⾄ +& 臼 + <<< ⾅ + << ⺽ +& 舁 + = 舁 + = 舁 +& 舄 + = 舄 +& 舌 + <<< ⾆ +& 舛 + <<< ⾇ +& 舟 + <<< ⾈ +& 艮 + <<< ⾉ +& 色 + <<< ⾊ +& 艸 + <<< ⾋ +& 艹 + <<< ⺾ + << ⺿ + << ⻀ +& 芋 + = 芋 +& 芑 + = 芑 +& 芝 + = 芝 +& 花 + = 花 +& 芳 + = 芳 +& 芽 + = 芽 +& 若 + = 若 +& 苦 + = 苦 +& 茝 + = 茝 +& 茣 + = 茣 +& 荓 + = 荓 +& 荣 + = 荣 +& 莭 + = 莭 +& 莽 + = 莽 +& 菊 + = 菊 +& 菌 + = 菌 +& 菜 + = 菜 +& 菧 + = 菧 +& 著 + = 著 +& 蓱 + = 蓱 +& 蓳 + = 蓳 +& 蔖 + = 蔖 +& 蕤 + = 蕤 +& 虍 + <<< ⾌ +& 虎 + <<< ⻁ +& 虐 + = 虐 +& 虜 + = 虜 +& 虧 + = 虧 +& 虩 + = 虩 +& 虫 + <<< ⾍ +& 蚈 + = 蚈 +& 蚩 + = 蚩 +& 蛢 + = 蛢 +& 蜎 + = 蜎 +& 蜨 + = 蜨 +& 蝫 + = 蝫 +& 蝹 + = 蝹 +& 螆 + = 螆 +& 蟡 + = 蟡 +& 蠁 + = 蠁 +& 血 + <<< ⾎ +& 行 + <<< ⾏ +& è¡  + = è¡  +& è¡£ + = è¡£ + <<< ⾐ +& 衤 + <<< ⻂ +& 裗 + = 裗 +& 裞 + = 裞 +& 裺 + = 裺 +& 襾 + <<< ⾑ +& 西 + <<< ⻄ +& 覀 + <<< ⻃ +& 見 + <<< ⾒ +& 见 + <<< ⻅ +& 角 + <<< ⻆ + = ⾓ + << ⻇ +& 言 + <<< ⾔ +& 誠 + = 誠 +& è«­ + = è«­ +& 變 + = 變 +& è®  + <<< ⻈ +& è°· + <<< ⾕ +& 豆 + <<< ⾖ +& 豕 + = 豕 + <<< ⾗ +& 豸 + <<< ⾘ +& 貝 + <<< ⾙ +& 財 + <<< ㊖ +& 貫 + = 貫 +& 賁 + = 賁 +& 資 + <<< ㊮ +& 贛 + = 贛 +& 贝 + <<< ⻉ +& 赤 + <<< ⾚ +& èµ° + <<< ⾛ +& èµ· + = èµ· +& è¶³ + <<< ⾜ + << ⻊ +& è¶¼ + = è¶¼ +& 跋 + = 跋 +& è·° + = è·° +& 身 + <<< ⾝ +& 車 + <<< ⾞ +& 軔 + = 軔 +& 輸 + = 輸 +& 车 + <<< ⻋ +& 辛 + <<< ⾟ +& 辞 + = 辞 +& è¾° + <<< â¾  +& è¾µ + <<< ⾡ +& è¾¶ + <<< ⻌ + << ⻍ + << ⻎ +& 適 + <<< ㊜ +& 邑 + <<< â¾¢ + << ⻏ +& 邔 + = 邔 +& 郱 + = 郱 +& 鄑 + = 鄑 +& 鄛 + = 鄛 +& 酉 + <<< â¾£ +& 釆 + <<< ⾤ +& 里 + <<< â¾¥ +& 金 + <<< ⾦ + <<< ㊎ +& 鈸 + = 鈸 +& 鉼 + = 鉼 +& 鋗 + = 鋗 +& 鋘 + = 鋘 +& 鏹 + = 鏹 +& 鐕 + = 鐕 +& 钅 + <<< ⻐ +& 長 + <<< ⻑ + = â¾§ +& 镸 + <<< ⻒ +& 长 + <<< ⻓ +& 門 + <<< ⾨ +& 開 + = 開 +& 閷 + = 閷 +& 门 + <<< ⻔ +& 阜 + <<< ⾩ + << ⻕ +& 阝 + <<< ⻖ +& 隶 + <<< ⾪ +& 隹 + <<< ⾫ +& 雃 + = 雃 +& 雨 + <<< ⾬ + << ⻗ +& 霣 + = 霣 +& 靑 + <<< â¾­ +& 青 + <<< ⻘ +& 非 + <<< â¾® +& 面 + <<< ⾯ +& 革 + <<< â¾° +& 韋 + <<< â¾± +& 韠 + = 韠 +& 韦 + <<< ⻙ +& 韭 + <<< â¾² +& 音 + <<< â¾³ +& 頁 + <<< â¾´ +& 項 + <<< ㊠ +& 頋 + = 頋 + = 頋 +& é © + = é © +& 页 + <<< ⻚ +& 風 + <<< â¾µ +& 风 + <<< ⻛ +& 飛 + <<< â¾¶ +& 飞 + <<< ⻜ +& 食 + <<< ⻝ + = â¾· +& 飠 + <<< ⻟ + << ⻞ +& 飢 + = 飢 +& 餩 + = 餩 +& 饣 + <<< â»  +& 首 + <<< ⾸ + << ⻡ +& 香 + <<< â¾¹ +& 馧 + = 馧 +& 馬 + <<< ⾺ +& 駂 + = 駂 +& é§¾ + = é§¾ +& 马 + <<< ⻢ +& 骨 + <<< â¾» + << ⻣ +& 高 + <<< â¾¼ +& 髟 + <<< â¾½ +& 鬒 + = 鬒 +& 鬥 + <<< â¾¾ +& 鬯 + <<< ⾿ +& 鬲 + <<< ⿀ +& 鬼 + <<< ⿁ + << ⻤ +& 魚 + <<< ⿂ +& 鱀 + = 鱀 +& é±¼ + <<< ⻥ +& é³¥ + <<< ⿃ +& é³½ + = é³½ +& éµ§ + = éµ§ +& 鸟 + <<< ⻦ +& é¹µ + <<< ⿄ + << â»§ +& 鹿 + <<< ⿅ +& 麥 + <<< ⿆ +& 麦 + <<< ⻨ +& 麻 + = 麻 + <<< ⿇ +& 黃 + <<< ⿈ +& 黄 + <<< ⻩ +& 黍 + <<< ⿉ +& 黑 + <<< ⿊ +& 黹 + = 黹 + <<< ⿋ +& 黽 + <<< ⿌ +& 黾 + = 黾 + <<< ⻪ +& 鼅 + = 鼅 +& 鼎 + <<< ⿍ +& 鼏 + = 鼏 +& 鼓 + <<< ⿎ +& 鼖 + = 鼖 +& é¼  + <<< ⿏ +& é¼» + = é¼» + <<< ⿐ +& 齊 + <<< ⿑ + << ⻫ +& 齐 + <<< ⻬ +& 齒 + <<< ⿒ + << â»­ +& 齿 + <<< â»® +& 龍 + <<< ⿓ + << ⻯ +& 龙 + <<< â»° +& 龜 + <<< ⿔ + << â»± + << ⻲ +& 龟 + <<< ⻳ +& é¾  + <<< ⿕ +& 﨎 + = 﨎 +& 﨏 + = 﨏 +& 﨑 + = 﨑 +& 﨓 + = 﨓 +& 﨔 + = 﨔 +& 﨟 + = 﨟 +& 﨡 + = 﨡 +& 﨣 + = 﨣 +& 﨤 + = 﨤 +& 﨧 + = 﨧 +& 﨨 + = 﨨 +& 﨩 + = 﨩 +& 㒞 + = 㒞 +& 㒹 + = 㒹 +& 㒻 + = 㒻 +& 㓟 + = 㓟 +& 㔕 + = 㔕 +& 㛮 + = 㛮 +& 㛼 + = 㛼 +& 㞁 + = 㞁 +& ã ¯ + = ã ¯ +& ã¡¢ + = ã¡¢ +& 㡼 + = 㡼 +& 㣇 + = 㣇 +& 㣣 + = 㣣 +& 㤜 + = 㤜 +& 㤺 + = 㤺 +& 㨮 + = 㨮 +& 㩬 + = 㩬 +& 㫤 + = 㫤 +& 㬈 + = 㬈 +& 㬙 + = 㬙 +& 㭉 + = 㭉 +& 㮝 + = 㮝 +& 㰘 + = 㰘 +& 㱎 + = 㱎 +& ã´³ + = ã´³ +& 㶖 + = 㶖 +& 㺬 + = 㺬 +& 㺸 + = 㺸 + = 㺸 +& 㼛 + = 㼛 +& 㿼 + = 㿼 +& 䀈 + = 䀈 +& 䀹 + = 䀹 +& 䁆 + = 䁆 +& 䂖 + = 䂖 +& 䃣 + = 䃣 +& 䄯 + = 䄯 +& 䈂 + = 䈂 +& 䈧 + = 䈧 +& 䊠 + = 䊠 +& 䌁 + = 䌁 +& 䌴 + = 䌴 +& 䍙 + = 䍙 +& 䏕 + = 䏕 +& 䏙 + = 䏙 +& 䐋 + = 䐋 +& 䑫 + = 䑫 +& 䔫 + = 䔫 +& 䕝 + = 䕝 +& 䕡 + = 䕡 +& 䕫 + = 䕫 +& 䗗 + = 䗗 +& 䗹 + = 䗹 +& 䘵 + = 䘵 +& 䚾 + = 䚾 +& 䛇 + = 䛇 +& 䦕 + = 䦕 +& 䧦 + = 䧦 +& ä©® + = ä©® +& ä©¶ + = ä©¶ +& 䪲 + = 䪲 +& 䬳 + = 䬳 +& 䯎 + = 䯎 +& 䳎 + = 䳎 +& ä³­ + = ä³­ +& 䳸 + = 䳸 +& 䵖 + = 䵖 +& 𠄢 + = 𠄢 +& 𠔜 + = 𠔜 +& 𠔥 + = 𠔥 +& 𠕋 + = 𠕋 +& 𠘺 + = 𠘺 +& 𠠄 + = 𠠄 +& 𠣞 + = 𠣞 +& 𠨬 + = 𠨬 +& ð ­£ + = ð ­£ +& 𡓤 + = 𡓤 +& 𡚨 + = 𡚨 +& 𡛪 + = 𡛪 +& 𡧈 + = 𡧈 +& 𡬘 + = 𡬘 +& 𡴋 + = 𡴋 +& ð¡·¤ + = ð¡·¤ +& ð¡·¦ + = ð¡·¦ +& 𢆃 + = 𢆃 +& 𢆟 + = 𢆟 +& 𢌱 + = 𢌱 + = 𢌱 +& 𢛔 + = 𢛔 +& 𢬌 + = 𢬌 +& 𢯱 + = 𢯱 +& 𣀊 + = 𣀊 +& 𣊸 + = 𣊸 +& 𣍟 + = 𣍟 +& 𣎓 + = 𣎓 +& 𣎜 + = 𣎜 +& 𣏃 + = 𣏃 +& 𣑭 + = 𣑭 +& 𣚣 + = 𣚣 +& 𣢧 + = 𣢧 +& 𣪍 + = 𣪍 +& 𣫺 + = 𣫺 +& 𣲼 + = 𣲼 +& 𣴞 + = 𣴞 +& 𣻑 + = 𣻑 +& 𣽞 + = 𣽞 +& 𣾎 + = 𣾎 +& 𤉣 + = 𤉣 +& 𤎫 + = 𤎫 +& 𤘈 + = 𤘈 +& 𤜵 + = 𤜵 +& 𤠔 + = 𤠔 +& 𤰶 + = 𤰶 +& 𤲒 + = 𤲒 +& 𤾡 + = 𤾡 +& 𤾸 + = 𤾸 +& 𥁄 + = 𥁄 +& 𥃲 + = 𥃲 +& 𥃳 + = 𥃳 +& 𥄙 + = 𥄙 +& 𥄳 + = 𥄳 +& 𥐝 + = 𥐝 +& 𥘦 + = 𥘦 +& 𥚚 + = 𥚚 +& 𥛅 + = 𥛅 +& 𥥼 + = 𥥼 +& 𥪧 + = 𥪧 + = 𥪧 +& 𥮫 + = 𥮫 +& 𥲀 + = 𥲀 +& 𥾆 + = 𥾆 +& 𦇚 + = 𦇚 +& 𦈨 + = 𦈨 +& 𦉇 + = 𦉇 +& 𦋙 + = 𦋙 +& 𦌾 + = 𦌾 +& 𦓚 + = 𦓚 +& 𦔣 + = 𦔣 +& 𦖨 + = 𦖨 +& 𦞧 + = 𦞧 +& 𦞵 + = 𦞵 +& 𦬼 + = 𦬼 +& 𦰶 + = 𦰶 +& 𦳕 + = 𦳕 +& 𦵫 + = 𦵫 +& 𦼬 + = 𦼬 +& 𦾱 + = 𦾱 +& 𧃒 + = 𧃒 +& 𧏊 + = 𧏊 +& 𧙧 + = 𧙧 +& ð§¢® + = ð§¢® +& 𧥦 + = 𧥦 +& 𧲨 + = 𧲨 +& 𧼯 + = 𧼯 +& 𨗒 + = 𨗒 +& 𨗭 + = 𨗭 +& 𨜮 + = 𨜮 +& 𨯺 + = 𨯺 +& 𨵷 + = 𨵷 +& 𩅅 + = 𩅅 +& 𩇟 + = 𩇟 +& 𩈚 + = 𩈚 +& 𩐊 + = 𩐊 +& 𩒖 + = 𩒖 +& 𩖶 + = 𩖶 +& 𩬰 + = 𩬰 +& 𪃎 + = 𪃎 +& 𪄅 + = 𪄅 +& 𪈎 + = 𪈎 +& 𪊑 + = 𪊑 +& 𪎒 + = 𪎒 +& 𪘀 + = 𪘀 diff --git a/icuSources/data/unidata/UnicodeData.txt b/icuSources/data/unidata/UnicodeData.txt index 86ea1cf9..e8f17b62 100644 --- a/icuSources/data/unidata/UnicodeData.txt +++ b/icuSources/data/unidata/UnicodeData.txt @@ -41,11 +41,11 @@ 0028;LEFT PARENTHESIS;Ps;0;ON;;;;;Y;OPENING PARENTHESIS;;;; 0029;RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;CLOSING PARENTHESIS;;;; 002A;ASTERISK;Po;0;ON;;;;;N;;;;; -002B;PLUS SIGN;Sm;0;ET;;;;;N;;;;; +002B;PLUS SIGN;Sm;0;ES;;;;;N;;;;; 002C;COMMA;Po;0;CS;;;;;N;;;;; -002D;HYPHEN-MINUS;Pd;0;ET;;;;;N;;;;; +002D;HYPHEN-MINUS;Pd;0;ES;;;;;N;;;;; 002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;; -002F;SOLIDUS;Po;0;ES;;;;;N;SLASH;;;; +002F;SOLIDUS;Po;0;CS;;;;;N;SLASH;;;; 0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;; 0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;; 0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;; @@ -171,7 +171,7 @@ 00AA;FEMININE ORDINAL INDICATOR;Ll;0;L; 0061;;;;N;;;;; 00AB;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING GUILLEMET;*;;; 00AC;NOT SIGN;Sm;0;ON;;;;;N;;;;; -00AD;SOFT HYPHEN;Cf;0;ON;;;;;N;;;;; +00AD;SOFT HYPHEN;Cf;0;BN;;;;;N;;;;; 00AE;REGISTERED SIGN;So;0;ON;;;;;N;REGISTERED TRADE MARK SIGN;;;; 00AF;MACRON;Sk;0;ON; 0020 0304;;;;N;SPACING MACRON;;;; 00B0;DEGREE SIGN;So;0;ET;;;;;N;;;;; @@ -659,7 +659,7 @@ 02AB;LATIN SMALL LETTER LZ DIGRAPH;Ll;0;L;;;;;N;;;;; 02AC;LATIN LETTER BILABIAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; 02AD;LATIN LETTER BIDENTAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; -02AE;LATIN SMALL LETTER TURNED H WITH FISHHOOK ;Ll;0;L;;;;;N;;;;; +02AE;LATIN SMALL LETTER TURNED H WITH FISHHOOK;Ll;0;L;;;;;N;;;;; 02AF;LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL;Ll;0;L;;;;;N;;;;; 02B0;MODIFIER LETTER SMALL H;Lm;0;L; 0068;;;;N;;;;; 02B1;MODIFIER LETTER SMALL H WITH HOOK;Lm;0;L; 0266;;;;N;MODIFIER LETTER SMALL H HOOK;;;; @@ -1411,7 +1411,7 @@ 0612;ARABIC SIGN RAHMATULLAH ALAYHE;Mn;230;NSM;;;;;N;;;;; 0613;ARABIC SIGN RADI ALLAHOU ANHU;Mn;230;NSM;;;;;N;;;;; 0614;ARABIC SIGN TAKHALLUS;Mn;230;NSM;;;;;N;;;;; -0615;ARABIC SMALL HIGH TAH ;Mn;230;NSM;;;;;N;;;;; +0615;ARABIC SMALL HIGH TAH;Mn;230;NSM;;;;;N;;;;; 061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;; 061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;; 0621;ARABIC LETTER HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH;;;; @@ -3645,15 +3645,15 @@ 1366;ETHIOPIC PREFACE COLON;Po;0;L;;;;;N;;;;; 1367;ETHIOPIC QUESTION MARK;Po;0;L;;;;;N;;;;; 1368;ETHIOPIC PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; -1369;ETHIOPIC DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -136A;ETHIOPIC DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -136B;ETHIOPIC DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -136C;ETHIOPIC DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -136D;ETHIOPIC DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -136E;ETHIOPIC DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -136F;ETHIOPIC DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1370;ETHIOPIC DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1371;ETHIOPIC DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1369;ETHIOPIC DIGIT ONE;Nd;0;L;;;1;1;N;;;;; +136A;ETHIOPIC DIGIT TWO;Nd;0;L;;;2;2;N;;;;; +136B;ETHIOPIC DIGIT THREE;Nd;0;L;;;3;3;N;;;;; +136C;ETHIOPIC DIGIT FOUR;Nd;0;L;;;4;4;N;;;;; +136D;ETHIOPIC DIGIT FIVE;Nd;0;L;;;5;5;N;;;;; +136E;ETHIOPIC DIGIT SIX;Nd;0;L;;;6;6;N;;;;; +136F;ETHIOPIC DIGIT SEVEN;Nd;0;L;;;7;7;N;;;;; +1370;ETHIOPIC DIGIT EIGHT;Nd;0;L;;;8;8;N;;;;; +1371;ETHIOPIC DIGIT NINE;Nd;0;L;;;9;9;N;;;;; 1372;ETHIOPIC NUMBER TEN;No;0;L;;;;10;N;;;;; 1373;ETHIOPIC NUMBER TWENTY;No;0;L;;;;20;N;;;;; 1374;ETHIOPIC NUMBER THIRTY;No;0;L;;;;30;N;;;;; @@ -5571,7 +5571,7 @@ 2008;PUNCTUATION SPACE;Zs;0;WS; 0020;;;;N;;;;; 2009;THIN SPACE;Zs;0;WS; 0020;;;;N;;;;; 200A;HAIR SPACE;Zs;0;WS; 0020;;;;N;;;;; -200B;ZERO WIDTH SPACE;Zs;0;BN;;;;;N;;;;; +200B;ZERO WIDTH SPACE;Cf;0;BN;;;;;N;;;;; 200C;ZERO WIDTH NON-JOINER;Cf;0;BN;;;;;N;;;;; 200D;ZERO WIDTH JOINER;Cf;0;BN;;;;;N;;;;; 200E;LEFT-TO-RIGHT MARK;Cf;0;L;;;;;N;;;;; @@ -5628,7 +5628,7 @@ 2041;CARET INSERTION POINT;Po;0;ON;;;;;N;;;;; 2042;ASTERISM;Po;0;ON;;;;;N;;;;; 2043;HYPHEN BULLET;Po;0;ON;;;;;N;;;;; -2044;FRACTION SLASH;Sm;0;ON;;;;;N;;;;; +2044;FRACTION SLASH;Sm;0;CS;;;;;N;;;;; 2045;LEFT SQUARE BRACKET WITH QUILL;Ps;0;ON;;;;;Y;;;;; 2046;RIGHT SQUARE BRACKET WITH QUILL;Pe;0;ON;;;;;Y;;;;; 2047;DOUBLE QUESTION MARK;Po;0;ON; 003F 003F;;;;N;;;;; @@ -6482,46 +6482,46 @@ 2448;OCR DASH;So;0;ON;;;;;N;;;;; 2449;OCR CUSTOMER ACCOUNT NUMBER;So;0;ON;;;;;N;;;;; 244A;OCR DOUBLE BACKSLASH;So;0;ON;;;;;N;;;;; -2460;CIRCLED DIGIT ONE;No;0;EN; 0031;;1;1;N;;;;; -2461;CIRCLED DIGIT TWO;No;0;EN; 0032;;2;2;N;;;;; -2462;CIRCLED DIGIT THREE;No;0;EN; 0033;;3;3;N;;;;; -2463;CIRCLED DIGIT FOUR;No;0;EN; 0034;;4;4;N;;;;; -2464;CIRCLED DIGIT FIVE;No;0;EN; 0035;;5;5;N;;;;; -2465;CIRCLED DIGIT SIX;No;0;EN; 0036;;6;6;N;;;;; -2466;CIRCLED DIGIT SEVEN;No;0;EN; 0037;;7;7;N;;;;; -2467;CIRCLED DIGIT EIGHT;No;0;EN; 0038;;8;8;N;;;;; -2468;CIRCLED DIGIT NINE;No;0;EN; 0039;;9;9;N;;;;; -2469;CIRCLED NUMBER TEN;No;0;EN; 0031 0030;;;10;N;;;;; -246A;CIRCLED NUMBER ELEVEN;No;0;EN; 0031 0031;;;11;N;;;;; -246B;CIRCLED NUMBER TWELVE;No;0;EN; 0031 0032;;;12;N;;;;; -246C;CIRCLED NUMBER THIRTEEN;No;0;EN; 0031 0033;;;13;N;;;;; -246D;CIRCLED NUMBER FOURTEEN;No;0;EN; 0031 0034;;;14;N;;;;; -246E;CIRCLED NUMBER FIFTEEN;No;0;EN; 0031 0035;;;15;N;;;;; -246F;CIRCLED NUMBER SIXTEEN;No;0;EN; 0031 0036;;;16;N;;;;; -2470;CIRCLED NUMBER SEVENTEEN;No;0;EN; 0031 0037;;;17;N;;;;; -2471;CIRCLED NUMBER EIGHTEEN;No;0;EN; 0031 0038;;;18;N;;;;; -2472;CIRCLED NUMBER NINETEEN;No;0;EN; 0031 0039;;;19;N;;;;; -2473;CIRCLED NUMBER TWENTY;No;0;EN; 0032 0030;;;20;N;;;;; -2474;PARENTHESIZED DIGIT ONE;No;0;EN; 0028 0031 0029;;1;1;N;;;;; -2475;PARENTHESIZED DIGIT TWO;No;0;EN; 0028 0032 0029;;2;2;N;;;;; -2476;PARENTHESIZED DIGIT THREE;No;0;EN; 0028 0033 0029;;3;3;N;;;;; -2477;PARENTHESIZED DIGIT FOUR;No;0;EN; 0028 0034 0029;;4;4;N;;;;; -2478;PARENTHESIZED DIGIT FIVE;No;0;EN; 0028 0035 0029;;5;5;N;;;;; -2479;PARENTHESIZED DIGIT SIX;No;0;EN; 0028 0036 0029;;6;6;N;;;;; -247A;PARENTHESIZED DIGIT SEVEN;No;0;EN; 0028 0037 0029;;7;7;N;;;;; -247B;PARENTHESIZED DIGIT EIGHT;No;0;EN; 0028 0038 0029;;8;8;N;;;;; -247C;PARENTHESIZED DIGIT NINE;No;0;EN; 0028 0039 0029;;9;9;N;;;;; -247D;PARENTHESIZED NUMBER TEN;No;0;EN; 0028 0031 0030 0029;;;10;N;;;;; -247E;PARENTHESIZED NUMBER ELEVEN;No;0;EN; 0028 0031 0031 0029;;;11;N;;;;; -247F;PARENTHESIZED NUMBER TWELVE;No;0;EN; 0028 0031 0032 0029;;;12;N;;;;; -2480;PARENTHESIZED NUMBER THIRTEEN;No;0;EN; 0028 0031 0033 0029;;;13;N;;;;; -2481;PARENTHESIZED NUMBER FOURTEEN;No;0;EN; 0028 0031 0034 0029;;;14;N;;;;; -2482;PARENTHESIZED NUMBER FIFTEEN;No;0;EN; 0028 0031 0035 0029;;;15;N;;;;; -2483;PARENTHESIZED NUMBER SIXTEEN;No;0;EN; 0028 0031 0036 0029;;;16;N;;;;; -2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;EN; 0028 0031 0037 0029;;;17;N;;;;; -2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;EN; 0028 0031 0038 0029;;;18;N;;;;; -2486;PARENTHESIZED NUMBER NINETEEN;No;0;EN; 0028 0031 0039 0029;;;19;N;;;;; -2487;PARENTHESIZED NUMBER TWENTY;No;0;EN; 0028 0032 0030 0029;;;20;N;;;;; +2460;CIRCLED DIGIT ONE;No;0;ON; 0031;;1;1;N;;;;; +2461;CIRCLED DIGIT TWO;No;0;ON; 0032;;2;2;N;;;;; +2462;CIRCLED DIGIT THREE;No;0;ON; 0033;;3;3;N;;;;; +2463;CIRCLED DIGIT FOUR;No;0;ON; 0034;;4;4;N;;;;; +2464;CIRCLED DIGIT FIVE;No;0;ON; 0035;;5;5;N;;;;; +2465;CIRCLED DIGIT SIX;No;0;ON; 0036;;6;6;N;;;;; +2466;CIRCLED DIGIT SEVEN;No;0;ON; 0037;;7;7;N;;;;; +2467;CIRCLED DIGIT EIGHT;No;0;ON; 0038;;8;8;N;;;;; +2468;CIRCLED DIGIT NINE;No;0;ON; 0039;;9;9;N;;;;; +2469;CIRCLED NUMBER TEN;No;0;ON; 0031 0030;;;10;N;;;;; +246A;CIRCLED NUMBER ELEVEN;No;0;ON; 0031 0031;;;11;N;;;;; +246B;CIRCLED NUMBER TWELVE;No;0;ON; 0031 0032;;;12;N;;;;; +246C;CIRCLED NUMBER THIRTEEN;No;0;ON; 0031 0033;;;13;N;;;;; +246D;CIRCLED NUMBER FOURTEEN;No;0;ON; 0031 0034;;;14;N;;;;; +246E;CIRCLED NUMBER FIFTEEN;No;0;ON; 0031 0035;;;15;N;;;;; +246F;CIRCLED NUMBER SIXTEEN;No;0;ON; 0031 0036;;;16;N;;;;; +2470;CIRCLED NUMBER SEVENTEEN;No;0;ON; 0031 0037;;;17;N;;;;; +2471;CIRCLED NUMBER EIGHTEEN;No;0;ON; 0031 0038;;;18;N;;;;; +2472;CIRCLED NUMBER NINETEEN;No;0;ON; 0031 0039;;;19;N;;;;; +2473;CIRCLED NUMBER TWENTY;No;0;ON; 0032 0030;;;20;N;;;;; +2474;PARENTHESIZED DIGIT ONE;No;0;ON; 0028 0031 0029;;1;1;N;;;;; +2475;PARENTHESIZED DIGIT TWO;No;0;ON; 0028 0032 0029;;2;2;N;;;;; +2476;PARENTHESIZED DIGIT THREE;No;0;ON; 0028 0033 0029;;3;3;N;;;;; +2477;PARENTHESIZED DIGIT FOUR;No;0;ON; 0028 0034 0029;;4;4;N;;;;; +2478;PARENTHESIZED DIGIT FIVE;No;0;ON; 0028 0035 0029;;5;5;N;;;;; +2479;PARENTHESIZED DIGIT SIX;No;0;ON; 0028 0036 0029;;6;6;N;;;;; +247A;PARENTHESIZED DIGIT SEVEN;No;0;ON; 0028 0037 0029;;7;7;N;;;;; +247B;PARENTHESIZED DIGIT EIGHT;No;0;ON; 0028 0038 0029;;8;8;N;;;;; +247C;PARENTHESIZED DIGIT NINE;No;0;ON; 0028 0039 0029;;9;9;N;;;;; +247D;PARENTHESIZED NUMBER TEN;No;0;ON; 0028 0031 0030 0029;;;10;N;;;;; +247E;PARENTHESIZED NUMBER ELEVEN;No;0;ON; 0028 0031 0031 0029;;;11;N;;;;; +247F;PARENTHESIZED NUMBER TWELVE;No;0;ON; 0028 0031 0032 0029;;;12;N;;;;; +2480;PARENTHESIZED NUMBER THIRTEEN;No;0;ON; 0028 0031 0033 0029;;;13;N;;;;; +2481;PARENTHESIZED NUMBER FOURTEEN;No;0;ON; 0028 0031 0034 0029;;;14;N;;;;; +2482;PARENTHESIZED NUMBER FIFTEEN;No;0;ON; 0028 0031 0035 0029;;;15;N;;;;; +2483;PARENTHESIZED NUMBER SIXTEEN;No;0;ON; 0028 0031 0036 0029;;;16;N;;;;; +2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;ON; 0028 0031 0037 0029;;;17;N;;;;; +2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;ON; 0028 0031 0038 0029;;;18;N;;;;; +2486;PARENTHESIZED NUMBER NINETEEN;No;0;ON; 0028 0031 0039 0029;;;19;N;;;;; +2487;PARENTHESIZED NUMBER TWENTY;No;0;ON; 0028 0032 0030 0029;;;20;N;;;;; 2488;DIGIT ONE FULL STOP;No;0;EN; 0031 002E;;1;1;N;DIGIT ONE PERIOD;;;; 2489;DIGIT TWO FULL STOP;No;0;EN; 0032 002E;;2;2;N;DIGIT TWO PERIOD;;;; 248A;DIGIT THREE FULL STOP;No;0;EN; 0033 002E;;3;3;N;DIGIT THREE PERIOD;;;; @@ -6620,7 +6620,7 @@ 24E7;CIRCLED LATIN SMALL LETTER X;So;0;L; 0078;;;;N;;;24CD;;24CD 24E8;CIRCLED LATIN SMALL LETTER Y;So;0;L; 0079;;;;N;;;24CE;;24CE 24E9;CIRCLED LATIN SMALL LETTER Z;So;0;L; 007A;;;;N;;;24CF;;24CF -24EA;CIRCLED DIGIT ZERO;No;0;EN; 0030;;0;0;N;;;;; +24EA;CIRCLED DIGIT ZERO;No;0;ON; 0030;;0;0;N;;;;; 24EB;NEGATIVE CIRCLED NUMBER ELEVEN;No;0;ON;;;;11;N;;;;; 24EC;NEGATIVE CIRCLED NUMBER TWELVE;No;0;ON;;;;12;N;;;;; 24ED;NEGATIVE CIRCLED NUMBER THIRTEEN;No;0;ON;;;;13;N;;;;; @@ -7261,262 +7261,262 @@ 27FD;LONG LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; 27FE;LONG RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; 27FF;LONG RIGHTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;; -2800;BRAILLE PATTERN BLANK;So;0;ON;;;;;N;;;;; -2801;BRAILLE PATTERN DOTS-1;So;0;ON;;;;;N;;;;; -2802;BRAILLE PATTERN DOTS-2;So;0;ON;;;;;N;;;;; -2803;BRAILLE PATTERN DOTS-12;So;0;ON;;;;;N;;;;; -2804;BRAILLE PATTERN DOTS-3;So;0;ON;;;;;N;;;;; -2805;BRAILLE PATTERN DOTS-13;So;0;ON;;;;;N;;;;; -2806;BRAILLE PATTERN DOTS-23;So;0;ON;;;;;N;;;;; -2807;BRAILLE PATTERN DOTS-123;So;0;ON;;;;;N;;;;; -2808;BRAILLE PATTERN DOTS-4;So;0;ON;;;;;N;;;;; -2809;BRAILLE PATTERN DOTS-14;So;0;ON;;;;;N;;;;; -280A;BRAILLE PATTERN DOTS-24;So;0;ON;;;;;N;;;;; -280B;BRAILLE PATTERN DOTS-124;So;0;ON;;;;;N;;;;; -280C;BRAILLE PATTERN DOTS-34;So;0;ON;;;;;N;;;;; -280D;BRAILLE PATTERN DOTS-134;So;0;ON;;;;;N;;;;; -280E;BRAILLE PATTERN DOTS-234;So;0;ON;;;;;N;;;;; -280F;BRAILLE PATTERN DOTS-1234;So;0;ON;;;;;N;;;;; -2810;BRAILLE PATTERN DOTS-5;So;0;ON;;;;;N;;;;; -2811;BRAILLE PATTERN DOTS-15;So;0;ON;;;;;N;;;;; -2812;BRAILLE PATTERN DOTS-25;So;0;ON;;;;;N;;;;; -2813;BRAILLE PATTERN DOTS-125;So;0;ON;;;;;N;;;;; -2814;BRAILLE PATTERN DOTS-35;So;0;ON;;;;;N;;;;; -2815;BRAILLE PATTERN DOTS-135;So;0;ON;;;;;N;;;;; -2816;BRAILLE PATTERN DOTS-235;So;0;ON;;;;;N;;;;; -2817;BRAILLE PATTERN DOTS-1235;So;0;ON;;;;;N;;;;; -2818;BRAILLE PATTERN DOTS-45;So;0;ON;;;;;N;;;;; -2819;BRAILLE PATTERN DOTS-145;So;0;ON;;;;;N;;;;; -281A;BRAILLE PATTERN DOTS-245;So;0;ON;;;;;N;;;;; -281B;BRAILLE PATTERN DOTS-1245;So;0;ON;;;;;N;;;;; -281C;BRAILLE PATTERN DOTS-345;So;0;ON;;;;;N;;;;; -281D;BRAILLE PATTERN DOTS-1345;So;0;ON;;;;;N;;;;; -281E;BRAILLE PATTERN DOTS-2345;So;0;ON;;;;;N;;;;; -281F;BRAILLE PATTERN DOTS-12345;So;0;ON;;;;;N;;;;; -2820;BRAILLE PATTERN DOTS-6;So;0;ON;;;;;N;;;;; -2821;BRAILLE PATTERN DOTS-16;So;0;ON;;;;;N;;;;; -2822;BRAILLE PATTERN DOTS-26;So;0;ON;;;;;N;;;;; -2823;BRAILLE PATTERN DOTS-126;So;0;ON;;;;;N;;;;; -2824;BRAILLE PATTERN DOTS-36;So;0;ON;;;;;N;;;;; -2825;BRAILLE PATTERN DOTS-136;So;0;ON;;;;;N;;;;; -2826;BRAILLE PATTERN DOTS-236;So;0;ON;;;;;N;;;;; -2827;BRAILLE PATTERN DOTS-1236;So;0;ON;;;;;N;;;;; -2828;BRAILLE PATTERN DOTS-46;So;0;ON;;;;;N;;;;; -2829;BRAILLE PATTERN DOTS-146;So;0;ON;;;;;N;;;;; -282A;BRAILLE PATTERN DOTS-246;So;0;ON;;;;;N;;;;; -282B;BRAILLE PATTERN DOTS-1246;So;0;ON;;;;;N;;;;; -282C;BRAILLE PATTERN DOTS-346;So;0;ON;;;;;N;;;;; -282D;BRAILLE PATTERN DOTS-1346;So;0;ON;;;;;N;;;;; -282E;BRAILLE PATTERN DOTS-2346;So;0;ON;;;;;N;;;;; -282F;BRAILLE PATTERN DOTS-12346;So;0;ON;;;;;N;;;;; -2830;BRAILLE PATTERN DOTS-56;So;0;ON;;;;;N;;;;; -2831;BRAILLE PATTERN DOTS-156;So;0;ON;;;;;N;;;;; -2832;BRAILLE PATTERN DOTS-256;So;0;ON;;;;;N;;;;; -2833;BRAILLE PATTERN DOTS-1256;So;0;ON;;;;;N;;;;; -2834;BRAILLE PATTERN DOTS-356;So;0;ON;;;;;N;;;;; -2835;BRAILLE PATTERN DOTS-1356;So;0;ON;;;;;N;;;;; -2836;BRAILLE PATTERN DOTS-2356;So;0;ON;;;;;N;;;;; -2837;BRAILLE PATTERN DOTS-12356;So;0;ON;;;;;N;;;;; -2838;BRAILLE PATTERN DOTS-456;So;0;ON;;;;;N;;;;; -2839;BRAILLE PATTERN DOTS-1456;So;0;ON;;;;;N;;;;; -283A;BRAILLE PATTERN DOTS-2456;So;0;ON;;;;;N;;;;; -283B;BRAILLE PATTERN DOTS-12456;So;0;ON;;;;;N;;;;; -283C;BRAILLE PATTERN DOTS-3456;So;0;ON;;;;;N;;;;; -283D;BRAILLE PATTERN DOTS-13456;So;0;ON;;;;;N;;;;; -283E;BRAILLE PATTERN DOTS-23456;So;0;ON;;;;;N;;;;; -283F;BRAILLE PATTERN DOTS-123456;So;0;ON;;;;;N;;;;; -2840;BRAILLE PATTERN DOTS-7;So;0;ON;;;;;N;;;;; -2841;BRAILLE PATTERN DOTS-17;So;0;ON;;;;;N;;;;; -2842;BRAILLE PATTERN DOTS-27;So;0;ON;;;;;N;;;;; -2843;BRAILLE PATTERN DOTS-127;So;0;ON;;;;;N;;;;; -2844;BRAILLE PATTERN DOTS-37;So;0;ON;;;;;N;;;;; -2845;BRAILLE PATTERN DOTS-137;So;0;ON;;;;;N;;;;; -2846;BRAILLE PATTERN DOTS-237;So;0;ON;;;;;N;;;;; -2847;BRAILLE PATTERN DOTS-1237;So;0;ON;;;;;N;;;;; -2848;BRAILLE PATTERN DOTS-47;So;0;ON;;;;;N;;;;; -2849;BRAILLE PATTERN DOTS-147;So;0;ON;;;;;N;;;;; -284A;BRAILLE PATTERN DOTS-247;So;0;ON;;;;;N;;;;; -284B;BRAILLE PATTERN DOTS-1247;So;0;ON;;;;;N;;;;; -284C;BRAILLE PATTERN DOTS-347;So;0;ON;;;;;N;;;;; -284D;BRAILLE PATTERN DOTS-1347;So;0;ON;;;;;N;;;;; -284E;BRAILLE PATTERN DOTS-2347;So;0;ON;;;;;N;;;;; -284F;BRAILLE PATTERN DOTS-12347;So;0;ON;;;;;N;;;;; -2850;BRAILLE PATTERN DOTS-57;So;0;ON;;;;;N;;;;; -2851;BRAILLE PATTERN DOTS-157;So;0;ON;;;;;N;;;;; -2852;BRAILLE PATTERN DOTS-257;So;0;ON;;;;;N;;;;; -2853;BRAILLE PATTERN DOTS-1257;So;0;ON;;;;;N;;;;; -2854;BRAILLE PATTERN DOTS-357;So;0;ON;;;;;N;;;;; -2855;BRAILLE PATTERN DOTS-1357;So;0;ON;;;;;N;;;;; -2856;BRAILLE PATTERN DOTS-2357;So;0;ON;;;;;N;;;;; -2857;BRAILLE PATTERN DOTS-12357;So;0;ON;;;;;N;;;;; -2858;BRAILLE PATTERN DOTS-457;So;0;ON;;;;;N;;;;; -2859;BRAILLE PATTERN DOTS-1457;So;0;ON;;;;;N;;;;; -285A;BRAILLE PATTERN DOTS-2457;So;0;ON;;;;;N;;;;; -285B;BRAILLE PATTERN DOTS-12457;So;0;ON;;;;;N;;;;; -285C;BRAILLE PATTERN DOTS-3457;So;0;ON;;;;;N;;;;; -285D;BRAILLE PATTERN DOTS-13457;So;0;ON;;;;;N;;;;; -285E;BRAILLE PATTERN DOTS-23457;So;0;ON;;;;;N;;;;; -285F;BRAILLE PATTERN DOTS-123457;So;0;ON;;;;;N;;;;; -2860;BRAILLE PATTERN DOTS-67;So;0;ON;;;;;N;;;;; -2861;BRAILLE PATTERN DOTS-167;So;0;ON;;;;;N;;;;; -2862;BRAILLE PATTERN DOTS-267;So;0;ON;;;;;N;;;;; -2863;BRAILLE PATTERN DOTS-1267;So;0;ON;;;;;N;;;;; -2864;BRAILLE PATTERN DOTS-367;So;0;ON;;;;;N;;;;; -2865;BRAILLE PATTERN DOTS-1367;So;0;ON;;;;;N;;;;; -2866;BRAILLE PATTERN DOTS-2367;So;0;ON;;;;;N;;;;; -2867;BRAILLE PATTERN DOTS-12367;So;0;ON;;;;;N;;;;; -2868;BRAILLE PATTERN DOTS-467;So;0;ON;;;;;N;;;;; -2869;BRAILLE PATTERN DOTS-1467;So;0;ON;;;;;N;;;;; -286A;BRAILLE PATTERN DOTS-2467;So;0;ON;;;;;N;;;;; -286B;BRAILLE PATTERN DOTS-12467;So;0;ON;;;;;N;;;;; -286C;BRAILLE PATTERN DOTS-3467;So;0;ON;;;;;N;;;;; -286D;BRAILLE PATTERN DOTS-13467;So;0;ON;;;;;N;;;;; -286E;BRAILLE PATTERN DOTS-23467;So;0;ON;;;;;N;;;;; -286F;BRAILLE PATTERN DOTS-123467;So;0;ON;;;;;N;;;;; -2870;BRAILLE PATTERN DOTS-567;So;0;ON;;;;;N;;;;; -2871;BRAILLE PATTERN DOTS-1567;So;0;ON;;;;;N;;;;; -2872;BRAILLE PATTERN DOTS-2567;So;0;ON;;;;;N;;;;; -2873;BRAILLE PATTERN DOTS-12567;So;0;ON;;;;;N;;;;; -2874;BRAILLE PATTERN DOTS-3567;So;0;ON;;;;;N;;;;; -2875;BRAILLE PATTERN DOTS-13567;So;0;ON;;;;;N;;;;; -2876;BRAILLE PATTERN DOTS-23567;So;0;ON;;;;;N;;;;; -2877;BRAILLE PATTERN DOTS-123567;So;0;ON;;;;;N;;;;; -2878;BRAILLE PATTERN DOTS-4567;So;0;ON;;;;;N;;;;; -2879;BRAILLE PATTERN DOTS-14567;So;0;ON;;;;;N;;;;; -287A;BRAILLE PATTERN DOTS-24567;So;0;ON;;;;;N;;;;; -287B;BRAILLE PATTERN DOTS-124567;So;0;ON;;;;;N;;;;; -287C;BRAILLE PATTERN DOTS-34567;So;0;ON;;;;;N;;;;; -287D;BRAILLE PATTERN DOTS-134567;So;0;ON;;;;;N;;;;; -287E;BRAILLE PATTERN DOTS-234567;So;0;ON;;;;;N;;;;; -287F;BRAILLE PATTERN DOTS-1234567;So;0;ON;;;;;N;;;;; -2880;BRAILLE PATTERN DOTS-8;So;0;ON;;;;;N;;;;; -2881;BRAILLE PATTERN DOTS-18;So;0;ON;;;;;N;;;;; -2882;BRAILLE PATTERN DOTS-28;So;0;ON;;;;;N;;;;; -2883;BRAILLE PATTERN DOTS-128;So;0;ON;;;;;N;;;;; -2884;BRAILLE PATTERN DOTS-38;So;0;ON;;;;;N;;;;; -2885;BRAILLE PATTERN DOTS-138;So;0;ON;;;;;N;;;;; -2886;BRAILLE PATTERN DOTS-238;So;0;ON;;;;;N;;;;; -2887;BRAILLE PATTERN DOTS-1238;So;0;ON;;;;;N;;;;; -2888;BRAILLE PATTERN DOTS-48;So;0;ON;;;;;N;;;;; -2889;BRAILLE PATTERN DOTS-148;So;0;ON;;;;;N;;;;; -288A;BRAILLE PATTERN DOTS-248;So;0;ON;;;;;N;;;;; -288B;BRAILLE PATTERN DOTS-1248;So;0;ON;;;;;N;;;;; -288C;BRAILLE PATTERN DOTS-348;So;0;ON;;;;;N;;;;; -288D;BRAILLE PATTERN DOTS-1348;So;0;ON;;;;;N;;;;; -288E;BRAILLE PATTERN DOTS-2348;So;0;ON;;;;;N;;;;; -288F;BRAILLE PATTERN DOTS-12348;So;0;ON;;;;;N;;;;; -2890;BRAILLE PATTERN DOTS-58;So;0;ON;;;;;N;;;;; -2891;BRAILLE PATTERN DOTS-158;So;0;ON;;;;;N;;;;; -2892;BRAILLE PATTERN DOTS-258;So;0;ON;;;;;N;;;;; -2893;BRAILLE PATTERN DOTS-1258;So;0;ON;;;;;N;;;;; -2894;BRAILLE PATTERN DOTS-358;So;0;ON;;;;;N;;;;; -2895;BRAILLE PATTERN DOTS-1358;So;0;ON;;;;;N;;;;; -2896;BRAILLE PATTERN DOTS-2358;So;0;ON;;;;;N;;;;; -2897;BRAILLE PATTERN DOTS-12358;So;0;ON;;;;;N;;;;; -2898;BRAILLE PATTERN DOTS-458;So;0;ON;;;;;N;;;;; -2899;BRAILLE PATTERN DOTS-1458;So;0;ON;;;;;N;;;;; -289A;BRAILLE PATTERN DOTS-2458;So;0;ON;;;;;N;;;;; -289B;BRAILLE PATTERN DOTS-12458;So;0;ON;;;;;N;;;;; -289C;BRAILLE PATTERN DOTS-3458;So;0;ON;;;;;N;;;;; -289D;BRAILLE PATTERN DOTS-13458;So;0;ON;;;;;N;;;;; -289E;BRAILLE PATTERN DOTS-23458;So;0;ON;;;;;N;;;;; -289F;BRAILLE PATTERN DOTS-123458;So;0;ON;;;;;N;;;;; -28A0;BRAILLE PATTERN DOTS-68;So;0;ON;;;;;N;;;;; -28A1;BRAILLE PATTERN DOTS-168;So;0;ON;;;;;N;;;;; -28A2;BRAILLE PATTERN DOTS-268;So;0;ON;;;;;N;;;;; -28A3;BRAILLE PATTERN DOTS-1268;So;0;ON;;;;;N;;;;; -28A4;BRAILLE PATTERN DOTS-368;So;0;ON;;;;;N;;;;; -28A5;BRAILLE PATTERN DOTS-1368;So;0;ON;;;;;N;;;;; -28A6;BRAILLE PATTERN DOTS-2368;So;0;ON;;;;;N;;;;; -28A7;BRAILLE PATTERN DOTS-12368;So;0;ON;;;;;N;;;;; -28A8;BRAILLE PATTERN DOTS-468;So;0;ON;;;;;N;;;;; -28A9;BRAILLE PATTERN DOTS-1468;So;0;ON;;;;;N;;;;; -28AA;BRAILLE PATTERN DOTS-2468;So;0;ON;;;;;N;;;;; -28AB;BRAILLE PATTERN DOTS-12468;So;0;ON;;;;;N;;;;; -28AC;BRAILLE PATTERN DOTS-3468;So;0;ON;;;;;N;;;;; -28AD;BRAILLE PATTERN DOTS-13468;So;0;ON;;;;;N;;;;; -28AE;BRAILLE PATTERN DOTS-23468;So;0;ON;;;;;N;;;;; -28AF;BRAILLE PATTERN DOTS-123468;So;0;ON;;;;;N;;;;; -28B0;BRAILLE PATTERN DOTS-568;So;0;ON;;;;;N;;;;; -28B1;BRAILLE PATTERN DOTS-1568;So;0;ON;;;;;N;;;;; -28B2;BRAILLE PATTERN DOTS-2568;So;0;ON;;;;;N;;;;; -28B3;BRAILLE PATTERN DOTS-12568;So;0;ON;;;;;N;;;;; -28B4;BRAILLE PATTERN DOTS-3568;So;0;ON;;;;;N;;;;; -28B5;BRAILLE PATTERN DOTS-13568;So;0;ON;;;;;N;;;;; -28B6;BRAILLE PATTERN DOTS-23568;So;0;ON;;;;;N;;;;; -28B7;BRAILLE PATTERN DOTS-123568;So;0;ON;;;;;N;;;;; -28B8;BRAILLE PATTERN DOTS-4568;So;0;ON;;;;;N;;;;; -28B9;BRAILLE PATTERN DOTS-14568;So;0;ON;;;;;N;;;;; -28BA;BRAILLE PATTERN DOTS-24568;So;0;ON;;;;;N;;;;; -28BB;BRAILLE PATTERN DOTS-124568;So;0;ON;;;;;N;;;;; -28BC;BRAILLE PATTERN DOTS-34568;So;0;ON;;;;;N;;;;; -28BD;BRAILLE PATTERN DOTS-134568;So;0;ON;;;;;N;;;;; -28BE;BRAILLE PATTERN DOTS-234568;So;0;ON;;;;;N;;;;; -28BF;BRAILLE PATTERN DOTS-1234568;So;0;ON;;;;;N;;;;; -28C0;BRAILLE PATTERN DOTS-78;So;0;ON;;;;;N;;;;; -28C1;BRAILLE PATTERN DOTS-178;So;0;ON;;;;;N;;;;; -28C2;BRAILLE PATTERN DOTS-278;So;0;ON;;;;;N;;;;; -28C3;BRAILLE PATTERN DOTS-1278;So;0;ON;;;;;N;;;;; -28C4;BRAILLE PATTERN DOTS-378;So;0;ON;;;;;N;;;;; -28C5;BRAILLE PATTERN DOTS-1378;So;0;ON;;;;;N;;;;; -28C6;BRAILLE PATTERN DOTS-2378;So;0;ON;;;;;N;;;;; -28C7;BRAILLE PATTERN DOTS-12378;So;0;ON;;;;;N;;;;; -28C8;BRAILLE PATTERN DOTS-478;So;0;ON;;;;;N;;;;; -28C9;BRAILLE PATTERN DOTS-1478;So;0;ON;;;;;N;;;;; -28CA;BRAILLE PATTERN DOTS-2478;So;0;ON;;;;;N;;;;; -28CB;BRAILLE PATTERN DOTS-12478;So;0;ON;;;;;N;;;;; -28CC;BRAILLE PATTERN DOTS-3478;So;0;ON;;;;;N;;;;; -28CD;BRAILLE PATTERN DOTS-13478;So;0;ON;;;;;N;;;;; -28CE;BRAILLE PATTERN DOTS-23478;So;0;ON;;;;;N;;;;; -28CF;BRAILLE PATTERN DOTS-123478;So;0;ON;;;;;N;;;;; -28D0;BRAILLE PATTERN DOTS-578;So;0;ON;;;;;N;;;;; -28D1;BRAILLE PATTERN DOTS-1578;So;0;ON;;;;;N;;;;; -28D2;BRAILLE PATTERN DOTS-2578;So;0;ON;;;;;N;;;;; -28D3;BRAILLE PATTERN DOTS-12578;So;0;ON;;;;;N;;;;; -28D4;BRAILLE PATTERN DOTS-3578;So;0;ON;;;;;N;;;;; -28D5;BRAILLE PATTERN DOTS-13578;So;0;ON;;;;;N;;;;; -28D6;BRAILLE PATTERN DOTS-23578;So;0;ON;;;;;N;;;;; -28D7;BRAILLE PATTERN DOTS-123578;So;0;ON;;;;;N;;;;; -28D8;BRAILLE PATTERN DOTS-4578;So;0;ON;;;;;N;;;;; -28D9;BRAILLE PATTERN DOTS-14578;So;0;ON;;;;;N;;;;; -28DA;BRAILLE PATTERN DOTS-24578;So;0;ON;;;;;N;;;;; -28DB;BRAILLE PATTERN DOTS-124578;So;0;ON;;;;;N;;;;; -28DC;BRAILLE PATTERN DOTS-34578;So;0;ON;;;;;N;;;;; -28DD;BRAILLE PATTERN DOTS-134578;So;0;ON;;;;;N;;;;; -28DE;BRAILLE PATTERN DOTS-234578;So;0;ON;;;;;N;;;;; -28DF;BRAILLE PATTERN DOTS-1234578;So;0;ON;;;;;N;;;;; -28E0;BRAILLE PATTERN DOTS-678;So;0;ON;;;;;N;;;;; -28E1;BRAILLE PATTERN DOTS-1678;So;0;ON;;;;;N;;;;; -28E2;BRAILLE PATTERN DOTS-2678;So;0;ON;;;;;N;;;;; -28E3;BRAILLE PATTERN DOTS-12678;So;0;ON;;;;;N;;;;; -28E4;BRAILLE PATTERN DOTS-3678;So;0;ON;;;;;N;;;;; -28E5;BRAILLE PATTERN DOTS-13678;So;0;ON;;;;;N;;;;; -28E6;BRAILLE PATTERN DOTS-23678;So;0;ON;;;;;N;;;;; -28E7;BRAILLE PATTERN DOTS-123678;So;0;ON;;;;;N;;;;; -28E8;BRAILLE PATTERN DOTS-4678;So;0;ON;;;;;N;;;;; -28E9;BRAILLE PATTERN DOTS-14678;So;0;ON;;;;;N;;;;; -28EA;BRAILLE PATTERN DOTS-24678;So;0;ON;;;;;N;;;;; -28EB;BRAILLE PATTERN DOTS-124678;So;0;ON;;;;;N;;;;; -28EC;BRAILLE PATTERN DOTS-34678;So;0;ON;;;;;N;;;;; -28ED;BRAILLE PATTERN DOTS-134678;So;0;ON;;;;;N;;;;; -28EE;BRAILLE PATTERN DOTS-234678;So;0;ON;;;;;N;;;;; -28EF;BRAILLE PATTERN DOTS-1234678;So;0;ON;;;;;N;;;;; -28F0;BRAILLE PATTERN DOTS-5678;So;0;ON;;;;;N;;;;; -28F1;BRAILLE PATTERN DOTS-15678;So;0;ON;;;;;N;;;;; -28F2;BRAILLE PATTERN DOTS-25678;So;0;ON;;;;;N;;;;; -28F3;BRAILLE PATTERN DOTS-125678;So;0;ON;;;;;N;;;;; -28F4;BRAILLE PATTERN DOTS-35678;So;0;ON;;;;;N;;;;; -28F5;BRAILLE PATTERN DOTS-135678;So;0;ON;;;;;N;;;;; -28F6;BRAILLE PATTERN DOTS-235678;So;0;ON;;;;;N;;;;; -28F7;BRAILLE PATTERN DOTS-1235678;So;0;ON;;;;;N;;;;; -28F8;BRAILLE PATTERN DOTS-45678;So;0;ON;;;;;N;;;;; -28F9;BRAILLE PATTERN DOTS-145678;So;0;ON;;;;;N;;;;; -28FA;BRAILLE PATTERN DOTS-245678;So;0;ON;;;;;N;;;;; -28FB;BRAILLE PATTERN DOTS-1245678;So;0;ON;;;;;N;;;;; -28FC;BRAILLE PATTERN DOTS-345678;So;0;ON;;;;;N;;;;; -28FD;BRAILLE PATTERN DOTS-1345678;So;0;ON;;;;;N;;;;; -28FE;BRAILLE PATTERN DOTS-2345678;So;0;ON;;;;;N;;;;; -28FF;BRAILLE PATTERN DOTS-12345678;So;0;ON;;;;;N;;;;; +2800;BRAILLE PATTERN BLANK;So;0;L;;;;;N;;;;; +2801;BRAILLE PATTERN DOTS-1;So;0;L;;;;;N;;;;; +2802;BRAILLE PATTERN DOTS-2;So;0;L;;;;;N;;;;; +2803;BRAILLE PATTERN DOTS-12;So;0;L;;;;;N;;;;; +2804;BRAILLE PATTERN DOTS-3;So;0;L;;;;;N;;;;; +2805;BRAILLE PATTERN DOTS-13;So;0;L;;;;;N;;;;; +2806;BRAILLE PATTERN DOTS-23;So;0;L;;;;;N;;;;; +2807;BRAILLE PATTERN DOTS-123;So;0;L;;;;;N;;;;; +2808;BRAILLE PATTERN DOTS-4;So;0;L;;;;;N;;;;; +2809;BRAILLE PATTERN DOTS-14;So;0;L;;;;;N;;;;; +280A;BRAILLE PATTERN DOTS-24;So;0;L;;;;;N;;;;; +280B;BRAILLE PATTERN DOTS-124;So;0;L;;;;;N;;;;; +280C;BRAILLE PATTERN DOTS-34;So;0;L;;;;;N;;;;; +280D;BRAILLE PATTERN DOTS-134;So;0;L;;;;;N;;;;; +280E;BRAILLE PATTERN DOTS-234;So;0;L;;;;;N;;;;; +280F;BRAILLE PATTERN DOTS-1234;So;0;L;;;;;N;;;;; +2810;BRAILLE PATTERN DOTS-5;So;0;L;;;;;N;;;;; +2811;BRAILLE PATTERN DOTS-15;So;0;L;;;;;N;;;;; +2812;BRAILLE PATTERN DOTS-25;So;0;L;;;;;N;;;;; +2813;BRAILLE PATTERN DOTS-125;So;0;L;;;;;N;;;;; +2814;BRAILLE PATTERN DOTS-35;So;0;L;;;;;N;;;;; +2815;BRAILLE PATTERN DOTS-135;So;0;L;;;;;N;;;;; +2816;BRAILLE PATTERN DOTS-235;So;0;L;;;;;N;;;;; +2817;BRAILLE PATTERN DOTS-1235;So;0;L;;;;;N;;;;; +2818;BRAILLE PATTERN DOTS-45;So;0;L;;;;;N;;;;; +2819;BRAILLE PATTERN DOTS-145;So;0;L;;;;;N;;;;; +281A;BRAILLE PATTERN DOTS-245;So;0;L;;;;;N;;;;; +281B;BRAILLE PATTERN DOTS-1245;So;0;L;;;;;N;;;;; +281C;BRAILLE PATTERN DOTS-345;So;0;L;;;;;N;;;;; +281D;BRAILLE PATTERN DOTS-1345;So;0;L;;;;;N;;;;; +281E;BRAILLE PATTERN DOTS-2345;So;0;L;;;;;N;;;;; +281F;BRAILLE PATTERN DOTS-12345;So;0;L;;;;;N;;;;; +2820;BRAILLE PATTERN DOTS-6;So;0;L;;;;;N;;;;; +2821;BRAILLE PATTERN DOTS-16;So;0;L;;;;;N;;;;; +2822;BRAILLE PATTERN DOTS-26;So;0;L;;;;;N;;;;; +2823;BRAILLE PATTERN DOTS-126;So;0;L;;;;;N;;;;; +2824;BRAILLE PATTERN DOTS-36;So;0;L;;;;;N;;;;; +2825;BRAILLE PATTERN DOTS-136;So;0;L;;;;;N;;;;; +2826;BRAILLE PATTERN DOTS-236;So;0;L;;;;;N;;;;; +2827;BRAILLE PATTERN DOTS-1236;So;0;L;;;;;N;;;;; +2828;BRAILLE PATTERN DOTS-46;So;0;L;;;;;N;;;;; +2829;BRAILLE PATTERN DOTS-146;So;0;L;;;;;N;;;;; +282A;BRAILLE PATTERN DOTS-246;So;0;L;;;;;N;;;;; +282B;BRAILLE PATTERN DOTS-1246;So;0;L;;;;;N;;;;; +282C;BRAILLE PATTERN DOTS-346;So;0;L;;;;;N;;;;; +282D;BRAILLE PATTERN DOTS-1346;So;0;L;;;;;N;;;;; +282E;BRAILLE PATTERN DOTS-2346;So;0;L;;;;;N;;;;; +282F;BRAILLE PATTERN DOTS-12346;So;0;L;;;;;N;;;;; +2830;BRAILLE PATTERN DOTS-56;So;0;L;;;;;N;;;;; +2831;BRAILLE PATTERN DOTS-156;So;0;L;;;;;N;;;;; +2832;BRAILLE PATTERN DOTS-256;So;0;L;;;;;N;;;;; +2833;BRAILLE PATTERN DOTS-1256;So;0;L;;;;;N;;;;; +2834;BRAILLE PATTERN DOTS-356;So;0;L;;;;;N;;;;; +2835;BRAILLE PATTERN DOTS-1356;So;0;L;;;;;N;;;;; +2836;BRAILLE PATTERN DOTS-2356;So;0;L;;;;;N;;;;; +2837;BRAILLE PATTERN DOTS-12356;So;0;L;;;;;N;;;;; +2838;BRAILLE PATTERN DOTS-456;So;0;L;;;;;N;;;;; +2839;BRAILLE PATTERN DOTS-1456;So;0;L;;;;;N;;;;; +283A;BRAILLE PATTERN DOTS-2456;So;0;L;;;;;N;;;;; +283B;BRAILLE PATTERN DOTS-12456;So;0;L;;;;;N;;;;; +283C;BRAILLE PATTERN DOTS-3456;So;0;L;;;;;N;;;;; +283D;BRAILLE PATTERN DOTS-13456;So;0;L;;;;;N;;;;; +283E;BRAILLE PATTERN DOTS-23456;So;0;L;;;;;N;;;;; +283F;BRAILLE PATTERN DOTS-123456;So;0;L;;;;;N;;;;; +2840;BRAILLE PATTERN DOTS-7;So;0;L;;;;;N;;;;; +2841;BRAILLE PATTERN DOTS-17;So;0;L;;;;;N;;;;; +2842;BRAILLE PATTERN DOTS-27;So;0;L;;;;;N;;;;; +2843;BRAILLE PATTERN DOTS-127;So;0;L;;;;;N;;;;; +2844;BRAILLE PATTERN DOTS-37;So;0;L;;;;;N;;;;; +2845;BRAILLE PATTERN DOTS-137;So;0;L;;;;;N;;;;; +2846;BRAILLE PATTERN DOTS-237;So;0;L;;;;;N;;;;; +2847;BRAILLE PATTERN DOTS-1237;So;0;L;;;;;N;;;;; +2848;BRAILLE PATTERN DOTS-47;So;0;L;;;;;N;;;;; +2849;BRAILLE PATTERN DOTS-147;So;0;L;;;;;N;;;;; +284A;BRAILLE PATTERN DOTS-247;So;0;L;;;;;N;;;;; +284B;BRAILLE PATTERN DOTS-1247;So;0;L;;;;;N;;;;; +284C;BRAILLE PATTERN DOTS-347;So;0;L;;;;;N;;;;; +284D;BRAILLE PATTERN DOTS-1347;So;0;L;;;;;N;;;;; +284E;BRAILLE PATTERN DOTS-2347;So;0;L;;;;;N;;;;; +284F;BRAILLE PATTERN DOTS-12347;So;0;L;;;;;N;;;;; +2850;BRAILLE PATTERN DOTS-57;So;0;L;;;;;N;;;;; +2851;BRAILLE PATTERN DOTS-157;So;0;L;;;;;N;;;;; +2852;BRAILLE PATTERN DOTS-257;So;0;L;;;;;N;;;;; +2853;BRAILLE PATTERN DOTS-1257;So;0;L;;;;;N;;;;; +2854;BRAILLE PATTERN DOTS-357;So;0;L;;;;;N;;;;; +2855;BRAILLE PATTERN DOTS-1357;So;0;L;;;;;N;;;;; +2856;BRAILLE PATTERN DOTS-2357;So;0;L;;;;;N;;;;; +2857;BRAILLE PATTERN DOTS-12357;So;0;L;;;;;N;;;;; +2858;BRAILLE PATTERN DOTS-457;So;0;L;;;;;N;;;;; +2859;BRAILLE PATTERN DOTS-1457;So;0;L;;;;;N;;;;; +285A;BRAILLE PATTERN DOTS-2457;So;0;L;;;;;N;;;;; +285B;BRAILLE PATTERN DOTS-12457;So;0;L;;;;;N;;;;; +285C;BRAILLE PATTERN DOTS-3457;So;0;L;;;;;N;;;;; +285D;BRAILLE PATTERN DOTS-13457;So;0;L;;;;;N;;;;; +285E;BRAILLE PATTERN DOTS-23457;So;0;L;;;;;N;;;;; +285F;BRAILLE PATTERN DOTS-123457;So;0;L;;;;;N;;;;; +2860;BRAILLE PATTERN DOTS-67;So;0;L;;;;;N;;;;; +2861;BRAILLE PATTERN DOTS-167;So;0;L;;;;;N;;;;; +2862;BRAILLE PATTERN DOTS-267;So;0;L;;;;;N;;;;; +2863;BRAILLE PATTERN DOTS-1267;So;0;L;;;;;N;;;;; +2864;BRAILLE PATTERN DOTS-367;So;0;L;;;;;N;;;;; +2865;BRAILLE PATTERN DOTS-1367;So;0;L;;;;;N;;;;; +2866;BRAILLE PATTERN DOTS-2367;So;0;L;;;;;N;;;;; +2867;BRAILLE PATTERN DOTS-12367;So;0;L;;;;;N;;;;; +2868;BRAILLE PATTERN DOTS-467;So;0;L;;;;;N;;;;; +2869;BRAILLE PATTERN DOTS-1467;So;0;L;;;;;N;;;;; +286A;BRAILLE PATTERN DOTS-2467;So;0;L;;;;;N;;;;; +286B;BRAILLE PATTERN DOTS-12467;So;0;L;;;;;N;;;;; +286C;BRAILLE PATTERN DOTS-3467;So;0;L;;;;;N;;;;; +286D;BRAILLE PATTERN DOTS-13467;So;0;L;;;;;N;;;;; +286E;BRAILLE PATTERN DOTS-23467;So;0;L;;;;;N;;;;; +286F;BRAILLE PATTERN DOTS-123467;So;0;L;;;;;N;;;;; +2870;BRAILLE PATTERN DOTS-567;So;0;L;;;;;N;;;;; +2871;BRAILLE PATTERN DOTS-1567;So;0;L;;;;;N;;;;; +2872;BRAILLE PATTERN DOTS-2567;So;0;L;;;;;N;;;;; +2873;BRAILLE PATTERN DOTS-12567;So;0;L;;;;;N;;;;; +2874;BRAILLE PATTERN DOTS-3567;So;0;L;;;;;N;;;;; +2875;BRAILLE PATTERN DOTS-13567;So;0;L;;;;;N;;;;; +2876;BRAILLE PATTERN DOTS-23567;So;0;L;;;;;N;;;;; +2877;BRAILLE PATTERN DOTS-123567;So;0;L;;;;;N;;;;; +2878;BRAILLE PATTERN DOTS-4567;So;0;L;;;;;N;;;;; +2879;BRAILLE PATTERN DOTS-14567;So;0;L;;;;;N;;;;; +287A;BRAILLE PATTERN DOTS-24567;So;0;L;;;;;N;;;;; +287B;BRAILLE PATTERN DOTS-124567;So;0;L;;;;;N;;;;; +287C;BRAILLE PATTERN DOTS-34567;So;0;L;;;;;N;;;;; +287D;BRAILLE PATTERN DOTS-134567;So;0;L;;;;;N;;;;; +287E;BRAILLE PATTERN DOTS-234567;So;0;L;;;;;N;;;;; +287F;BRAILLE PATTERN DOTS-1234567;So;0;L;;;;;N;;;;; +2880;BRAILLE PATTERN DOTS-8;So;0;L;;;;;N;;;;; +2881;BRAILLE PATTERN DOTS-18;So;0;L;;;;;N;;;;; +2882;BRAILLE PATTERN DOTS-28;So;0;L;;;;;N;;;;; +2883;BRAILLE PATTERN DOTS-128;So;0;L;;;;;N;;;;; +2884;BRAILLE PATTERN DOTS-38;So;0;L;;;;;N;;;;; +2885;BRAILLE PATTERN DOTS-138;So;0;L;;;;;N;;;;; +2886;BRAILLE PATTERN DOTS-238;So;0;L;;;;;N;;;;; +2887;BRAILLE PATTERN DOTS-1238;So;0;L;;;;;N;;;;; +2888;BRAILLE PATTERN DOTS-48;So;0;L;;;;;N;;;;; +2889;BRAILLE PATTERN DOTS-148;So;0;L;;;;;N;;;;; +288A;BRAILLE PATTERN DOTS-248;So;0;L;;;;;N;;;;; +288B;BRAILLE PATTERN DOTS-1248;So;0;L;;;;;N;;;;; +288C;BRAILLE PATTERN DOTS-348;So;0;L;;;;;N;;;;; +288D;BRAILLE PATTERN DOTS-1348;So;0;L;;;;;N;;;;; +288E;BRAILLE PATTERN DOTS-2348;So;0;L;;;;;N;;;;; +288F;BRAILLE PATTERN DOTS-12348;So;0;L;;;;;N;;;;; +2890;BRAILLE PATTERN DOTS-58;So;0;L;;;;;N;;;;; +2891;BRAILLE PATTERN DOTS-158;So;0;L;;;;;N;;;;; +2892;BRAILLE PATTERN DOTS-258;So;0;L;;;;;N;;;;; +2893;BRAILLE PATTERN DOTS-1258;So;0;L;;;;;N;;;;; +2894;BRAILLE PATTERN DOTS-358;So;0;L;;;;;N;;;;; +2895;BRAILLE PATTERN DOTS-1358;So;0;L;;;;;N;;;;; +2896;BRAILLE PATTERN DOTS-2358;So;0;L;;;;;N;;;;; +2897;BRAILLE PATTERN DOTS-12358;So;0;L;;;;;N;;;;; +2898;BRAILLE PATTERN DOTS-458;So;0;L;;;;;N;;;;; +2899;BRAILLE PATTERN DOTS-1458;So;0;L;;;;;N;;;;; +289A;BRAILLE PATTERN DOTS-2458;So;0;L;;;;;N;;;;; +289B;BRAILLE PATTERN DOTS-12458;So;0;L;;;;;N;;;;; +289C;BRAILLE PATTERN DOTS-3458;So;0;L;;;;;N;;;;; +289D;BRAILLE PATTERN DOTS-13458;So;0;L;;;;;N;;;;; +289E;BRAILLE PATTERN DOTS-23458;So;0;L;;;;;N;;;;; +289F;BRAILLE PATTERN DOTS-123458;So;0;L;;;;;N;;;;; +28A0;BRAILLE PATTERN DOTS-68;So;0;L;;;;;N;;;;; +28A1;BRAILLE PATTERN DOTS-168;So;0;L;;;;;N;;;;; +28A2;BRAILLE PATTERN DOTS-268;So;0;L;;;;;N;;;;; +28A3;BRAILLE PATTERN DOTS-1268;So;0;L;;;;;N;;;;; +28A4;BRAILLE PATTERN DOTS-368;So;0;L;;;;;N;;;;; +28A5;BRAILLE PATTERN DOTS-1368;So;0;L;;;;;N;;;;; +28A6;BRAILLE PATTERN DOTS-2368;So;0;L;;;;;N;;;;; +28A7;BRAILLE PATTERN DOTS-12368;So;0;L;;;;;N;;;;; +28A8;BRAILLE PATTERN DOTS-468;So;0;L;;;;;N;;;;; +28A9;BRAILLE PATTERN DOTS-1468;So;0;L;;;;;N;;;;; +28AA;BRAILLE PATTERN DOTS-2468;So;0;L;;;;;N;;;;; +28AB;BRAILLE PATTERN DOTS-12468;So;0;L;;;;;N;;;;; +28AC;BRAILLE PATTERN DOTS-3468;So;0;L;;;;;N;;;;; +28AD;BRAILLE PATTERN DOTS-13468;So;0;L;;;;;N;;;;; +28AE;BRAILLE PATTERN DOTS-23468;So;0;L;;;;;N;;;;; +28AF;BRAILLE PATTERN DOTS-123468;So;0;L;;;;;N;;;;; +28B0;BRAILLE PATTERN DOTS-568;So;0;L;;;;;N;;;;; +28B1;BRAILLE PATTERN DOTS-1568;So;0;L;;;;;N;;;;; +28B2;BRAILLE PATTERN DOTS-2568;So;0;L;;;;;N;;;;; +28B3;BRAILLE PATTERN DOTS-12568;So;0;L;;;;;N;;;;; +28B4;BRAILLE PATTERN DOTS-3568;So;0;L;;;;;N;;;;; +28B5;BRAILLE PATTERN DOTS-13568;So;0;L;;;;;N;;;;; +28B6;BRAILLE PATTERN DOTS-23568;So;0;L;;;;;N;;;;; +28B7;BRAILLE PATTERN DOTS-123568;So;0;L;;;;;N;;;;; +28B8;BRAILLE PATTERN DOTS-4568;So;0;L;;;;;N;;;;; +28B9;BRAILLE PATTERN DOTS-14568;So;0;L;;;;;N;;;;; +28BA;BRAILLE PATTERN DOTS-24568;So;0;L;;;;;N;;;;; +28BB;BRAILLE PATTERN DOTS-124568;So;0;L;;;;;N;;;;; +28BC;BRAILLE PATTERN DOTS-34568;So;0;L;;;;;N;;;;; +28BD;BRAILLE PATTERN DOTS-134568;So;0;L;;;;;N;;;;; +28BE;BRAILLE PATTERN DOTS-234568;So;0;L;;;;;N;;;;; +28BF;BRAILLE PATTERN DOTS-1234568;So;0;L;;;;;N;;;;; +28C0;BRAILLE PATTERN DOTS-78;So;0;L;;;;;N;;;;; +28C1;BRAILLE PATTERN DOTS-178;So;0;L;;;;;N;;;;; +28C2;BRAILLE PATTERN DOTS-278;So;0;L;;;;;N;;;;; +28C3;BRAILLE PATTERN DOTS-1278;So;0;L;;;;;N;;;;; +28C4;BRAILLE PATTERN DOTS-378;So;0;L;;;;;N;;;;; +28C5;BRAILLE PATTERN DOTS-1378;So;0;L;;;;;N;;;;; +28C6;BRAILLE PATTERN DOTS-2378;So;0;L;;;;;N;;;;; +28C7;BRAILLE PATTERN DOTS-12378;So;0;L;;;;;N;;;;; +28C8;BRAILLE PATTERN DOTS-478;So;0;L;;;;;N;;;;; +28C9;BRAILLE PATTERN DOTS-1478;So;0;L;;;;;N;;;;; +28CA;BRAILLE PATTERN DOTS-2478;So;0;L;;;;;N;;;;; +28CB;BRAILLE PATTERN DOTS-12478;So;0;L;;;;;N;;;;; +28CC;BRAILLE PATTERN DOTS-3478;So;0;L;;;;;N;;;;; +28CD;BRAILLE PATTERN DOTS-13478;So;0;L;;;;;N;;;;; +28CE;BRAILLE PATTERN DOTS-23478;So;0;L;;;;;N;;;;; +28CF;BRAILLE PATTERN DOTS-123478;So;0;L;;;;;N;;;;; +28D0;BRAILLE PATTERN DOTS-578;So;0;L;;;;;N;;;;; +28D1;BRAILLE PATTERN DOTS-1578;So;0;L;;;;;N;;;;; +28D2;BRAILLE PATTERN DOTS-2578;So;0;L;;;;;N;;;;; +28D3;BRAILLE PATTERN DOTS-12578;So;0;L;;;;;N;;;;; +28D4;BRAILLE PATTERN DOTS-3578;So;0;L;;;;;N;;;;; +28D5;BRAILLE PATTERN DOTS-13578;So;0;L;;;;;N;;;;; +28D6;BRAILLE PATTERN DOTS-23578;So;0;L;;;;;N;;;;; +28D7;BRAILLE PATTERN DOTS-123578;So;0;L;;;;;N;;;;; +28D8;BRAILLE PATTERN DOTS-4578;So;0;L;;;;;N;;;;; +28D9;BRAILLE PATTERN DOTS-14578;So;0;L;;;;;N;;;;; +28DA;BRAILLE PATTERN DOTS-24578;So;0;L;;;;;N;;;;; +28DB;BRAILLE PATTERN DOTS-124578;So;0;L;;;;;N;;;;; +28DC;BRAILLE PATTERN DOTS-34578;So;0;L;;;;;N;;;;; +28DD;BRAILLE PATTERN DOTS-134578;So;0;L;;;;;N;;;;; +28DE;BRAILLE PATTERN DOTS-234578;So;0;L;;;;;N;;;;; +28DF;BRAILLE PATTERN DOTS-1234578;So;0;L;;;;;N;;;;; +28E0;BRAILLE PATTERN DOTS-678;So;0;L;;;;;N;;;;; +28E1;BRAILLE PATTERN DOTS-1678;So;0;L;;;;;N;;;;; +28E2;BRAILLE PATTERN DOTS-2678;So;0;L;;;;;N;;;;; +28E3;BRAILLE PATTERN DOTS-12678;So;0;L;;;;;N;;;;; +28E4;BRAILLE PATTERN DOTS-3678;So;0;L;;;;;N;;;;; +28E5;BRAILLE PATTERN DOTS-13678;So;0;L;;;;;N;;;;; +28E6;BRAILLE PATTERN DOTS-23678;So;0;L;;;;;N;;;;; +28E7;BRAILLE PATTERN DOTS-123678;So;0;L;;;;;N;;;;; +28E8;BRAILLE PATTERN DOTS-4678;So;0;L;;;;;N;;;;; +28E9;BRAILLE PATTERN DOTS-14678;So;0;L;;;;;N;;;;; +28EA;BRAILLE PATTERN DOTS-24678;So;0;L;;;;;N;;;;; +28EB;BRAILLE PATTERN DOTS-124678;So;0;L;;;;;N;;;;; +28EC;BRAILLE PATTERN DOTS-34678;So;0;L;;;;;N;;;;; +28ED;BRAILLE PATTERN DOTS-134678;So;0;L;;;;;N;;;;; +28EE;BRAILLE PATTERN DOTS-234678;So;0;L;;;;;N;;;;; +28EF;BRAILLE PATTERN DOTS-1234678;So;0;L;;;;;N;;;;; +28F0;BRAILLE PATTERN DOTS-5678;So;0;L;;;;;N;;;;; +28F1;BRAILLE PATTERN DOTS-15678;So;0;L;;;;;N;;;;; +28F2;BRAILLE PATTERN DOTS-25678;So;0;L;;;;;N;;;;; +28F3;BRAILLE PATTERN DOTS-125678;So;0;L;;;;;N;;;;; +28F4;BRAILLE PATTERN DOTS-35678;So;0;L;;;;;N;;;;; +28F5;BRAILLE PATTERN DOTS-135678;So;0;L;;;;;N;;;;; +28F6;BRAILLE PATTERN DOTS-235678;So;0;L;;;;;N;;;;; +28F7;BRAILLE PATTERN DOTS-1235678;So;0;L;;;;;N;;;;; +28F8;BRAILLE PATTERN DOTS-45678;So;0;L;;;;;N;;;;; +28F9;BRAILLE PATTERN DOTS-145678;So;0;L;;;;;N;;;;; +28FA;BRAILLE PATTERN DOTS-245678;So;0;L;;;;;N;;;;; +28FB;BRAILLE PATTERN DOTS-1245678;So;0;L;;;;;N;;;;; +28FC;BRAILLE PATTERN DOTS-345678;So;0;L;;;;;N;;;;; +28FD;BRAILLE PATTERN DOTS-1345678;So;0;L;;;;;N;;;;; +28FE;BRAILLE PATTERN DOTS-2345678;So;0;L;;;;;N;;;;; +28FF;BRAILLE PATTERN DOTS-12345678;So;0;L;;;;;N;;;;; 2900;RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 2901;RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; 2902;LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; @@ -10621,7 +10621,13 @@ DBFF;;Cs;0;L;;;;;N;;;;; DC00;;Cs;0;L;;;;;N;;;;; DFFF;;Cs;0;L;;;;;N;;;;; E000;;Co;0;L;;;;;N;;;;; -F8FF;;Co;0;L;;;;;N;;;;; +F801;;Co;0;L;;;;;N;;;;; +F802;;So;0;ON;;;;;N;;;;; +F86F;;So;0;ON;;;;;N;;;;; +F870;;Mn;0;NSM;;;;;N;;;;; +F87F;;Mn;0;NSM;;;;;N;;;;; +F880;;So;0;ON;;;;;N;;;;; +F8FF;;So;0;ON;;;;;N;;;;; F900;CJK COMPATIBILITY IDEOGRAPH-F900;Lo;0;L;8C48;;;;N;;;;; F901;CJK COMPATIBILITY IDEOGRAPH-F901;Lo;0;L;66F4;;;;N;;;;; F902;CJK COMPATIBILITY IDEOGRAPH-F902;Lo;0;L;8ECA;;;;N;;;;; @@ -12080,9 +12086,9 @@ FFEB;HALFWIDTH RIGHTWARDS ARROW;Sm;0;ON; 2192;;;;N;;;;; FFEC;HALFWIDTH DOWNWARDS ARROW;Sm;0;ON; 2193;;;;N;;;;; FFED;HALFWIDTH BLACK SQUARE;So;0;ON; 25A0;;;;N;;;;; FFEE;HALFWIDTH WHITE CIRCLE;So;0;ON; 25CB;;;;N;;;;; -FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;BN;;;;;N;;;;; -FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;BN;;;;;N;;;;; -FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;BN;;;;;N;;;;; +FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;ON;;;;;N;;;;; +FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;ON;;;;;N;;;;; +FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;ON;;;;;N;;;;; FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 10000;LINEAR B SYLLABLE B008 A;Lo;0;L;;;;;N;;;;; diff --git a/icuSources/data/unidata/changes.txt b/icuSources/data/unidata/changes.txt new file mode 100644 index 00000000..a406c3f6 --- /dev/null +++ b/icuSources/data/unidata/changes.txt @@ -0,0 +1,73 @@ +Unicode 4.0.1 update + +*** related Jitterbugs + +3170 RFE: Update to Unicode 4.0.1 +3171 Add new Unicode 4.0.1 properties +3520 use Unicode 4.0.1 updates for break iteration + +*** data files & enums & parser code + +* file preparation +- ucdstrip: DerivedNormalizationProps.txt, NormalizationTest.txt, DerivedCoreProperties.txt +- ucdstrip and ucdmerge: EastAsianWidth.txt, LineBreak.txt + +* file fixes +- fix UnicodeData.txt general categories of Ethiopic digits Nd->No + according to PRI #26 + http://www.unicode.org/review/resolved-pri.html#pri26 +- undone again because no corrigendum in sight; + instead modified tests to not check consistency on this for Unicode 4.0.1 + +* ucdterms.txt +- update from http://www.unicode.org/copyright.html + formatted for plain text + +* uchar.h & uprops.h & uprops.c & genprops +- add UBLOCK_CYRILLIC_SUPPLEMENT because the block is renamed +- add U_LB_INSEPARABLE due to a spelling fix + + put short name comment only on line with new constant + for genpname perl script parser +- new binary properties + + STerm + + Variation_Selector + +* genpname +- fix genpname perl script so that it doesn't choke on more than 2 names per property value +- perl script: correctly calculate the maximum number of fields per row + +* uscript.h +- new script code Hrkt=Katakana_Or_Hiragana + +* gennorm.c track changes in DerivedNormalizationProps.txt +- "FNC" -> "FC_NFKC" +- single field "NFD_NO" -> two fields "NFD_QC; N" etc. + +* genprops/props2.c track changes in DerivedNumericValues.txt +- changed from 3 columns to 2, dropping the numeric type + + assume that the type is always numeric for Han characters, + and that only those are added in addition to what UnicodeData.txt lists + +*** Unicode version numbers +- makedata.mak +- uchar.h +- configure.in + +*** tests +- update test of default bidi classes according to PRI #28 + /tsutil/cucdtst/TestUnicodeData + http://www.unicode.org/review/resolved-pri.html#pri28 +- bidi tests: change exemplar character for ES depending on Unicode version +- change hardcoded expected property values where they change + +*** other code + +* name matching +- read UCD.html + +* scripts +- use new Hrkt=Katakana_Or_Hiragana + +* ZWJ & ZWNJ +- are now part of combining character sequences +- break iteration used to assume that LB classes did not overlap; now they do for ZWJ & ZWNJ diff --git a/icuSources/data/unidata/ucdterms.txt b/icuSources/data/unidata/ucdterms.txt index d049d4e4..7f1ddea3 100644 --- a/icuSources/data/unidata/ucdterms.txt +++ b/icuSources/data/unidata/ucdterms.txt @@ -1,31 +1,45 @@ -Unicode Character Database Terms of Use -From UCD.html ----- - -UCD Terms of Use - - -Disclaimer - -The Unicode Character Database is provided as is by Unicode, Inc. No claims are -made as to fitness for any particular purpose. No warranties of any kind are -expressed or implied. The recipient agrees to determine applicability of -information provided. If this file has been purchased on magnetic or optical -media from Unicode, Inc., the sole remedy for any claim will be exchange of -defective media within 90 days of receipt. - -This disclaimer is applicable for all other data files accompanying the Unicode -Character Database, some of which have been compiled by the Unicode Consortium, -and some of which have been supplied by other sources. - - -Limitations on Rights to Redistribute This Data - -Recipient is granted the right to make copies in any form for internal -distribution and to freely use the information supplied in the creation of -products supporting the Unicode (TM) Standard. The files in the Unicode -Character Database can be redistributed to third parties or other organizations -(whether for profit or not) as long as this notice and the disclaimer notice are -retained. Information can be extracted from these files and used in -documentation or programs, as long as there is an accompanying notice indicating -the source. +UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE + +Unicode Data Files include all data files under the directories +http://www.unicode.org/Public/ and http://www.unicode.org/reports/. +Unicode Software includes any source code under the directories +http://www.unicode.org/Public/ and http://www.unicode.org/reports/. + +NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING, +INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA FILES ("DATA FILES"), +AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND +BY, ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, +DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. + +COPYRIGHT AND PERMISSION NOTICE + +Copyright (c) 1991-2004 Unicode, Inc. All rights reserved. Distributed under the +Terms of Use in http://www.unicode.org/copyright.html. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +the Unicode data files and associated documentation (the "Data Files") or +Unicode software and associated documentation (the "Software") to deal in the +Data Files or Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, and/or sell copies of +the Data Files or Software, and to permit persons to whom the Data Files or +Software are furnished to do so, provided that (a) the above copyright notice(s) +and this permission notice appear in all copies of the Data Files or Software, +(b) both the above copyright notice(s) and this permission notice appear in +associated documentation, and (c) there is clear notice in each modified Data +File or in the Software as well as in the documentation associated with the Data +File(s) or Software that the data or software has been modified. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD +PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS +NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL +DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING +OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR +SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall not be +used in advertising or otherwise to promote the sale, use or other dealings in +these Data Files or Software without prior written authorization of the +copyright holder. diff --git a/icuSources/extra/Makefile.in b/icuSources/extra/Makefile.in index 43615659..937859ca 100644 --- a/icuSources/extra/Makefile.in +++ b/icuSources/extra/Makefile.in @@ -1,6 +1,6 @@ #****************************************************************************** # -# Copyright (C) 1999, International Business Machines +# Copyright (C) 1999-2004, International Business Machines # Corporation and others. All Rights Reserved. # #****************************************************************************** @@ -15,16 +15,13 @@ top_builddir = .. include $(top_builddir)/icudefs.mk -@USTDIO_TRUE@USTDIO = ustdio -@USTDIO_FALSE@USTDIO = - ## Build directory information subdir = extra ## Files to remove for 'make clean' CLEANFILES = *~ -SUBDIRS = $(USTDIO) uconv +SUBDIRS = uconv ## List of phony targets .PHONY : all all-local all-recursive install install-local \ diff --git a/icuSources/extra/scrptrun/scrptrun.h b/icuSources/extra/scrptrun/scrptrun.h index 5ceddd77..b5c63b11 100644 --- a/icuSources/extra/scrptrun/scrptrun.h +++ b/icuSources/extra/scrptrun/scrptrun.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * - * Copyright (C) 1999-2001, International Business Machines + * Copyright (C) 1999-2003, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -56,14 +56,14 @@ public: /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } /** * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } diff --git a/icuSources/extra/uconv/Makefile.in b/icuSources/extra/uconv/Makefile.in index b343410e..c7b1b00b 100644 --- a/icuSources/extra/uconv/Makefile.in +++ b/icuSources/extra/uconv/Makefile.in @@ -1,6 +1,6 @@ ## ****************************************************************************** ## * -## * Copyright (C) 1999-2000, International Business Machines +## * Copyright (C) 1999-2004, International Business Machines ## * Corporation and others. All Rights Reserved. ## * ## ******************************************************************************* @@ -30,19 +30,25 @@ RESFILES=$(RESSRC:$(RESOURCESDIR)$(FILESEPCHAR)%.txt=$(RESDIR)/$(RESOURCESDIR)$( ## +TARGET_STUB_NAME = uconv + SECTION = 1 -ALL_MAN_FILES = $(TARGET).$(SECTION) +ALL_MAN_FILES = $(TARGET_STUB_NAME).$(SECTION) ## Extra files to remove for 'make clean' CLEANFILES = *~ $(DEPS) $(ALL_MAN_FILES) ## Target information -TARGET = uconv +TARGET = $(BINDIR)/$(TARGET_STUB_NAME)$(EXEEXT) CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common -I$(top_srcdir)/i18n -I$(srcdir)/../toolutil LIBS = $(LIBICUI18N) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M) +ifeq ($(PKGDATA_OPTS),) +PKGDATA_OPTS = -O pkgdata.inc +endif + ## generic settings for data - common. PKGMODE=common INSTALLTO=$(DESTDIR)$(ICUDATA_DIR) @@ -51,7 +57,7 @@ UCONVMSG_LIB=dummy ## Static mode ifeq ($(UCONVMSG_MODE),static) DEFS += -DUCONVMSG_LINK=$(MSGNAME) -UCONVMSG_LIB = $(RESDIR)/lib$(MSGNAME).a +UCONVMSG_LIB = $(RESDIR)/$(LIBPREFIX)$(MSGNAME).$(A) LIBS += $(UCONVMSG_LIB) PKGMODE=static INSTALLTO=$(libdir) @@ -91,7 +97,7 @@ install-local: all-local install-target install-resfiles install-man install-target: all-local $(MKINSTALLDIRS) $(DESTDIR)$(bindir) - $(INSTALL) $(TARGET) $(DESTDIR)$(bindir)/$(TARGET) + $(INSTALL) $(TARGET) $(DESTDIR)$(bindir) dist-local: @@ -100,7 +106,7 @@ clean-local: resclean $(RMV) $(OBJECTS) $(TARGET) resclean: - -$(INVOKE) $(top_builddir)/tools/pkgdata/pkgdata --clean -p $(RESDIR) -O pkgdata.inc -m $(PKGMODE) -d $(RESDIR) -T $(RESDIR) $(RESDIR)/$(RESDIR).lst + #-$(INVOKE) $(BINDIR)/pkgdata --clean -p $(RESDIR) -O pkgdata.inc -m $(PKGMODE) -d $(RESDIR) -T $(RESDIR) $(RESDIR)/$(RESDIR).lst $(RMV) pkgdata.inc $(RESDIR) distclean-local: clean-local @@ -116,8 +122,12 @@ pkgdata.inc: $(srcdir)/pkgdata.inc.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status +%.$(SECTION): $(srcdir)/%.$(SECTION).in $(srcdir)/pkgdata.inc.in + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + $(TARGET) : $(OBJECTS) $(UCONVMSG_LIB) - $(LINK.cc) -o $@ $(OBJECTS) $(LIBS) + $(LINK.cc) $(OUTOPT)$@ $(OBJECTS) $(LIBS) resfiles: $(RESFILES) package-resfiles @@ -127,20 +137,20 @@ endif package-resfiles: $(RESDIR)/$(RESDIR).lst pkgdata.inc - $(INVOKE) $(top_builddir)/tools/pkgdata/pkgdata -p $(RESDIR) -O pkgdata.inc -m $(PKGMODE) -d $(RESDIR) -T $(RESDIR) $(RESDIR)/$(RESDIR).lst + $(INVOKE) $(PKGDATA_INVOKE_OPTS) $(BINDIR)/pkgdata -p $(RESDIR) $(PKGDATA_OPTS) -m $(PKGMODE) -d $(RESDIR) -T $(RESDIR) $(RESDIR)/$(RESDIR).lst $(RESDIR)/$(RESDIR).lst: Makefile pkgdata.inc $(srcdir)/resfiles.mk @$(MKINSTALLDIRS) $(RESDIR) @-$(RMV) $@ @for file in $(RESFILES); do \ - echo `pwd`/$$file >> $@; \ + echo $(CURR_FULL_DIR)/$$file >> $@; \ done; # no install for static mode ifneq ($(UCONVMSG_MODE),static) install-resfiles: $(RESFILES) $(MKINSTALLDIRS) $(DESTDIR)$(ICUDATA_DIR) - $(INVOKE) $(top_builddir)/tools/pkgdata/pkgdata -p $(RESDIR) -O pkgdata.inc -m $(PKGMODE) -d $(RESDIR) -I $(INSTALLTO) -T $(RESDIR) $(RESDIR)/$(RESDIR).lst + $(INVOKE) $(BINDIR)/pkgdata -p $(RESDIR) -O pkgdata.inc -m $(PKGMODE) -d $(RESDIR) -I $(INSTALLTO) -T $(RESDIR) $(RESDIR)/$(RESDIR).lst endif ## @@ -148,18 +158,11 @@ $(UCONVMSG_LIB): resfiles $(RESDIR)/$(RESOURCESDIR)/$(MSGNAME)_%.res: $(srcdir)/$(RESOURCESDIR)/%.txt $(MKINSTALLDIRS) $(@D) - $(INVOKE) $(top_builddir)/tools/genrb/genrb -p $(MSGNAME) -e UTF-8 -s $(^D) -d $(@D) $(^F) + $(INVOKE) $(BINDIR)/genrb -p $(MSGNAME) -e UTF-8 -s $(^D) -d $(@D) $(^F) install-man: $(ALL_MAN_FILES) $(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man$(SECTION) $(INSTALL_DATA) $? $(DESTDIR)$(mandir)/man$(SECTION) -%.$(SECTION): $(srcdir)/%.$(SECTION).in - cd $(top_builddir) \ - && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status -# Don't do this. This is a problem when changing platforms. -#ifneq ($(MAKECMDGOALS),distclean) -#-include $(DEPS) -#endif diff --git a/icuSources/extra/uconv/makedata.mak b/icuSources/extra/uconv/makedata.mak index 159553c6..2ba70c84 100644 --- a/icuSources/extra/uconv/makedata.mak +++ b/icuSources/extra/uconv/makedata.mak @@ -1,5 +1,5 @@ #********************************************************************** -#* Copyright (C) 1999-2000, International Business Machines Corporation +#* Copyright (C) 1999-2004, International Business Machines Corporation #* and others. All Rights Reserved. #********************************************************************** # nmake file for creating data files on win32 @@ -37,7 +37,7 @@ CFG=Debug !ENDIF !MESSAGE ICU path is $(ICUP) RESNAME=uconvmsg -RESDIR=. #$(ICUP)\..\icuapps\uconv\$(RESNAME) +RESDIR=resources RESFILES=resfiles.mk ICUDATA=$(ICUP)\data @@ -50,27 +50,13 @@ ICD=$(ICUDATA)^\ DATA_PATH=$(ICUP)\data^\ ICUTOOLS=$(ICUP)\bin -# We have to prepare params for pkgdata - to help it find the tools -!IF "$(CFG)" == "Debug" || "$(CFG)" == "debug" -PKGOPT=D:$(ICUP) -!ELSE -PKGOPT=R:$(ICUP) -!ENDIF - -# This appears in original Microsofts makefiles -!IF "$(OS)" == "Windows_NT" -NULL= -!ELSE -NULL=nul -!ENDIF - -PATH = $(PATH);$(ICUP)\bin +PATH = $(ICUP)\bin;$(PATH) # Suffixes for data files .SUFFIXES : .ucm .cnv .dll .dat .res .txt .c # We're including a list of resource files. -FILESEPCHAR=\\ +FILESEPCHAR= !IF EXISTS("$(RESFILES)") !INCLUDE "$(RESFILES)" @@ -78,6 +64,8 @@ FILESEPCHAR=\\ !ERROR ERROR: cannot find "$(RESFILES)" !ENDIF RB_FILES = $(RESSRC:.txt=.res) +RB_FILES = resources\$(RB_FILES:.res =.res resources\) +RESOURCESDIR= # This target should build all the data files !IF "$(PKGMODE)" == "dll" @@ -86,41 +74,29 @@ OUTPUT = "$(DLL_OUTPUT)\$(RESNAME).dll" OUTPUT = "$(DLL_OUTPUT)\$(RESNAME).lib" !ENDIF -ALL : GODATA $(OUTPUT) GOBACK #$(RESNAME).dat +ALL : $(OUTPUT) @echo All targets are up to date (mode $(PKGMODE)) # invoke pkgdata - static -"$(DLL_OUTPUT)\$(RESNAME).lib" : $(RB_FILES) $(RESFILES) +"$(DLL_OUTPUT)\$(RESNAME).lib" : $(RB_FILES) $(RESFILES) @echo Building $(RESNAME).lib - @"$(ICUTOOLS)\pkgdata" -f -v -m static -c -p $(RESNAME) -O "$(PKGOPT)" -d "$(DLL_OUTPUT)" -s "$(RESDIR)" <. .\" -.TH UCONV 1 "16 February 2002" "ICU MANPAGE" "ICU @VERSION@ Manual" +.TH UCONV 1 "2003-dec-22" "ICU MANPAGE" "ICU @VERSION@ Manual" .SH NAME .B uconv \- convert data from one encoding to another @@ -67,6 +67,12 @@ .BI "\-t\fP, \fB\-\-to\-code" " encoding" ] [ +.BI "\-\-add\-signature" +] +[ +.BI "\-\-remove\-signature" +] +[ .BI "\-o\fP, \fB\-\-output" " file" ] [ @@ -114,14 +120,14 @@ after the data have been transcoded to Unicode. The .I transliteration can be either a list of semicolon-separated transliterator names, -or an arbitrary complex set of rules in the ICU transliteration +or an arbitrarily complex set of rules in the ICU transliteration rules format. .PP For transcoding purposes, .B uconv options are compatible with those of .BR iconv (1), -making it easy to replace it in scripts. It is not necessary the case, +making it easy to replace it in scripts. It is not necessarily the case, however, that the encoding names used by .B uconv and ICU are the same as the ones used by @@ -240,6 +246,13 @@ Set the original encoding of the data to Transcode the data to .IR encoding . .TP +.BI "\-\-add\-signature" +Add a U+FEFF Unicode signature character (BOM) if the output charset +supports it and does not add one anyway. +.TP +.BI "\-\-remove\-signature" +Remove a U+FEFF Unicode signature character (BOM). +.TP .BI "\-o\fP, \fB\-\-output" " file" Write the transcoded data to .IR file . @@ -431,7 +444,7 @@ Yves Arrouye .SH VERSION @VERSION@ .SH COPYRIGHT -Copyright (C) 2001 IBM, Inc. and others. +Copyright (C) 2000-2003 IBM, Inc. and others. .SH SEE ALSO .BR convrtrs.txt (5) .br diff --git a/icuSources/extra/uconv/uconv.cpp b/icuSources/extra/uconv/uconv.cpp index a265c4ff..633bbca3 100644 --- a/icuSources/extra/uconv/uconv.cpp +++ b/icuSources/extra/uconv/uconv.cpp @@ -1,6 +1,6 @@ /***************************************************************************** * -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************/ @@ -14,12 +14,18 @@ * Conversion to the C conversion API and many improvements by * Yves Arrouye , current maintainer. * + * Markus Scherer maintainer from 2003. + * See source code repository history for changes. */ #include +#include #include +#include #include #include +#include +#include #include #include @@ -32,10 +38,10 @@ #include "unicode/uwmsg.h" -#ifdef WIN32 -#include +#if (defined(WIN32) || defined(U_CYGWIN)) && !defined(__STRICT_ANSI__) #include #include +#define USE_FILENO_BINARY_MODE 1 #endif #ifdef UCONVMSG_LINK @@ -45,6 +51,8 @@ U_CFUNC char uconvmsg_dat[]; #endif +#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) + #define DEFAULT_BUFSZ 4096 #define UCONVMSG "uconvmsg" @@ -172,7 +180,7 @@ static const struct callback_ent *findCallback(const char *name) { expected for convrters.txt(5). */ static int printConverters(const char *pname, const char *lookfor, - int canon) + UBool canon) { UErrorCode err = U_ZERO_ERROR; int32_t num; @@ -227,13 +235,22 @@ static int printConverters(const char *pname, const char *lookfor, } else { uint16_t s; + if (canon) { + printf("{ "); + } for (s = 0; s < num_stds; ++s) { stds[s] = ucnv_getStandard(s, &err); + if (canon) { + printf("%s ", stds[s]); + } if (U_FAILURE(err)) { u_wmsg(stderr, "cantGetTag", u_wmsg_errorName(err)); return -1; } } + if (canon) { + puts("}"); + } } for (int32_t i = 0; i < num; i++) { @@ -256,9 +273,9 @@ static int printConverters(const char *pname, const char *lookfor, if (U_FAILURE(err)) { printf("%s", name); - UnicodeString str(name, (int32_t)(uprv_strlen(name) + 1)); + UnicodeString str(name, ""); putchar('\t'); - u_wmsg(stderr, "cantGetAliases", str.getBuffer(), + u_wmsg(stderr, "cantGetAliases", str.getTerminatedBuffer(), u_wmsg_errorName(err)); return -1; } else { @@ -270,28 +287,40 @@ static int printConverters(const char *pname, const char *lookfor, const char *alias = ucnv_getAlias(name, a, &err); if (U_FAILURE(err)) { - UnicodeString str(name, (int32_t)(uprv_strlen(name) + 1)); + UnicodeString str(name, ""); putchar('\t'); - u_wmsg(stderr, "cantGetAliases", str.getBuffer(), + u_wmsg(stderr, "cantGetAliases", str.getTerminatedBuffer(), u_wmsg_errorName(err)); return -1; } - printf("%s", alias); + /* Print the current alias so that it looks right. */ + printf("%s%s%s", (canon ? (a == 0? "" : "\t" ) : "") , + alias, + (canon ? "" : " ")); /* Look (slowly, linear searching) for a tag. */ if (canon) { - for (s = t = 0; s < num_stds; ++s) { - const char *standard = - ucnv_getStandardName(name, stds[s], &err); - if (U_SUCCESS(err) && standard) { - if (!strcmp(standard, alias)) { - if (!t) { - printf(" {"); - t = 1; + /* -1 to skip the last standard */ + for (s = t = 0; s < num_stds-1; ++s) { + UEnumeration *nameEnum = ucnv_openStandardNames(name, stds[s], &err); + if (U_SUCCESS(err)) { + /* List the standard tags */ + const char *standardName; + UBool isFirst = TRUE; + UErrorCode enumError = U_ZERO_ERROR; + while ((standardName = uenum_next(nameEnum, NULL, &enumError))) { + /* See if this alias is supported by this standard. */ + if (!strcmp(standardName, alias)) { + if (!t) { + printf(" {"); + t = 1; + } + /* Print a * after the default standard name */ + printf(" %s%s", stds[s], (isFirst ? "*" : "")); } - printf(" %s", stds[s]); + isFirst = FALSE; } } } @@ -299,21 +328,17 @@ static int printConverters(const char *pname, const char *lookfor, printf(" }"); } } + /* Terminate this entry. */ + if (canon) { + puts(""); + } /* Move on. */ - - if (a < num_aliases - 1) { - putchar(a || !canon ? ' ' : '\t'); - } } - } - - /* Terminate this entry. */ - - if (canon) { - putchar('\n'); - } else if (i < num - 1) { - putchar(' '); + /* Terminate this entry. */ + if (!canon) { + puts(""); + } } } @@ -329,7 +354,7 @@ static int printConverters(const char *pname, const char *lookfor, /* Print all available transliterators. If canon is non zero, print one transliterator per line. */ -static int printTransliterators(int canon) +static int printTransliterators(UBool canon) { #if UCONFIG_NO_TRANSLITERATION printf("no transliterators available because of UCONFIG_NO_TRANSLITERATION, see uconfig.h\n"); @@ -391,32 +416,182 @@ static int printTransliterators(int canon) #endif } -/* Return the offset of a byte in its source, given the from and to offsets - vectors and the byte offset itself. */ +enum { + uSP = 0x20, // space + uCR = 0xd, // carriage return + uLF = 0xa, // line feed + uNL = 0x85, // newline + uLS = 0x2028, // line separator + uPS = 0x2029, // paragraph separator + uSig = 0xfeff // signature/BOM character +}; -static inline int32_t dataOffset(int32_t whereto, - const int32_t *fromoffsets, int32_t fromsz, - const int32_t *tooffsets, int32_t tosz) { - if (whereto >= 0 && whereto < tosz) { - whereto = tooffsets[whereto]; - if (whereto >= 0 && whereto < fromsz) { - return fromoffsets[whereto]; +static inline int32_t +getChunkLimit(const UnicodeString &prev, const UnicodeString &s) { + // find one of + // CR, LF, CRLF, NL, LS, PS + // for paragraph ends (see UAX #13/Unicode 4) + // and include it in the chunk + // all of these characters are on the BMP + // do not include FF or VT in case they are part of a paragraph + // (important for bidi contexts) + static const UChar paraEnds[] = { + 0xd, 0xa, 0x85, 0x2028, 0x2029 + }; + enum { + iCR, iLF, iNL, iLS, iPS, iCount + }; + + // first, see if there is a CRLF split between prev and s + if (prev.endsWith(paraEnds + iCR, 1)) { + if (s.startsWith(paraEnds + iLF, 1)) { + return 1; // split CRLF, include the LF + } else if (!s.isEmpty()) { + return 0; // complete the last chunk + } else { + return -1; // wait for actual further contents to arrive } } - return 0; + const UChar *u = s.getBuffer(), *limit = u + s.length(); + UChar c; + + while (u < limit) { + c = *u++; + if ( + ((c < uSP) && (c == uCR || c == uLF)) || + (c == uNL) || + ((c & uLS) == uLS) + ) { + if (c == uCR) { + // check for CRLF + if (u == limit) { + return -1; // LF may be in the next chunk + } else if (*u == uLF) { + ++u; // include the LF in this chunk + } + } + return (int32_t)(u - s.getBuffer()); + } + } + + return -1; // continue collecting the chunk +} + +enum { + CNV_NO_FEFF, // cannot convert the U+FEFF Unicode signature character (BOM) + CNV_WITH_FEFF, // can convert the U+FEFF signature character + CNV_ADDS_FEFF // automatically adds/detects the U+FEFF signature character +}; + +static inline UChar +nibbleToHex(uint8_t n) { + n &= 0xf; + return + n <= 9 ? + (UChar)(0x30 + n) : + (UChar)((0x61 - 10) + n); +} + +// check the converter's Unicode signature properties; +// the fromUnicode side of the converter must be in its initial state +// and will be reset again if it was used +static int32_t +cnvSigType(UConverter *cnv) { + UErrorCode err; + int32_t result; + + // test if the output charset can convert U+FEFF + USet *set = uset_open(1, 0); + err = U_ZERO_ERROR; + ucnv_getUnicodeSet(cnv, set, UCNV_ROUNDTRIP_SET, &err); + if (U_SUCCESS(err) && uset_contains(set, uSig)) { + result = CNV_WITH_FEFF; + } else { + result = CNV_NO_FEFF; // an error occurred or U+FEFF cannot be converted + } + uset_close(set); + + if (result == CNV_WITH_FEFF) { + // test if the output charset emits a signature anyway + const UChar a[1] = { 0x61 }; // "a" + const UChar *in; + + char buffer[20]; + char *out; + + in = a; + out = buffer; + err = U_ZERO_ERROR; + ucnv_fromUnicode(cnv, + &out, buffer + sizeof(buffer), + &in, a + 1, + NULL, TRUE, &err); + ucnv_resetFromUnicode(cnv); + + if (NULL != ucnv_detectUnicodeSignature(buffer, (int32_t)(out - buffer), NULL, &err) && + U_SUCCESS(err) + ) { + result = CNV_ADDS_FEFF; + } + } + + return result; } +class ConvertFile { +public: + ConvertFile() : + buf(NULL), outbuf(NULL), fromoffsets(NULL), + bufsz(0), signature(0) {} + + void + setBufferSize(size_t bufferSize) { + bufsz = bufferSize; + + buf = new char[2 * bufsz]; + outbuf = buf + bufsz; + + // +1 for an added U+FEFF in the intermediate Unicode buffer + fromoffsets = new int32_t[bufsz + 1]; + } + + ~ConvertFile() { + delete [] buf; + delete [] fromoffsets; + } + + UBool convertFile(const char *pname, + const char *fromcpage, + UConverterToUCallback toucallback, + const void *touctxt, + const char *tocpage, + UConverterFromUCallback fromucallback, + const void *fromuctxt, + UBool fallback, + const char *translit, + const char *infilestr, + FILE * outfile, int verbose); +private: + friend int main(int argc, char **argv); + + char *buf, *outbuf; + int32_t *fromoffsets; + + size_t bufsz; + int8_t signature; // add (1) or remove (-1) a U+FEFF Unicode signature character +}; + // Convert a file from one encoding to another -static UBool convertFile(const char *pname, +UBool +ConvertFile::convertFile(const char *pname, const char *fromcpage, UConverterToUCallback toucallback, const void *touctxt, const char *tocpage, UConverterFromUCallback fromucallback, const void *fromuctxt, - int fallback, - size_t bufsz, + UBool fallback, const char *translit, const char *infilestr, FILE * outfile, int verbose) @@ -427,23 +602,27 @@ static UBool convertFile(const char *pname, UConverter *convto = 0; UErrorCode err = U_ZERO_ERROR; UBool flush; - const char *cbufp; + const char *cbufp, *prevbufp; char *bufp; - char *buf = 0; uint32_t infoffset = 0, outfoffset = 0; /* Where we are in the file, for error reporting. */ - const UChar *unibufbp; + const UChar *unibuf, *unibufbp; UChar *unibufp; - UChar *unibuf = 0; - int32_t *fromoffsets = 0, *tooffsets = 0; - size_t rd, wr, tobufsz; + size_t rd, wr; #if !UCONFIG_NO_TRANSLITERATION Transliterator *t = 0; // Transliterator acting on Unicode data. + UnicodeString chunk; // One chunk of the text being collected for transformation. #endif UnicodeString u; // String to do the transliteration. + int32_t ulen; + + // use conversion offsets for error messages + // unless a transliterator is used - + // a text transformation will reorder characters in unpredictable ways + UBool useOffsets = TRUE; // Open the correct input file or connect to stdin for reading input @@ -461,7 +640,7 @@ static UBool convertFile(const char *pname, } else { infilestr = "-"; infile = stdin; -#ifdef WIN32 +#ifdef USE_FILENO_BINARY_MODE if (setmode(fileno(stdin), O_BINARY) == -1) { initMsg(pname); u_wmsg(stderr, "cantSetInBinMode"); @@ -499,10 +678,10 @@ static UBool convertFile(const char *pname, UChar linebuf[20], offsetbuf[20]; uprv_itou(linebuf, 20, parse.line, 10, 0); uprv_itou(offsetbuf, 20, parse.offset, 10, 0); - u_wmsg(stderr, "cantCreateTranslitParseErr", str.getBuffer(), + u_wmsg(stderr, "cantCreateTranslitParseErr", str.getTerminatedBuffer(), u_wmsg_errorName(err), linebuf, offsetbuf); } else { - u_wmsg(stderr, "cantCreateTranslit", str.getBuffer(), + u_wmsg(stderr, "cantCreateTranslit", str.getTerminatedBuffer(), u_wmsg_errorName(err)); } @@ -512,6 +691,8 @@ static UBool convertFile(const char *pname, } goto error_exit; } + + useOffsets = FALSE; } #endif @@ -521,9 +702,9 @@ static UBool convertFile(const char *pname, convfrom = ucnv_open(fromcpage, &err); if (U_FAILURE(err)) { - UnicodeString str(fromcpage, (int32_t)(uprv_strlen(fromcpage) + 1)); + UnicodeString str(fromcpage, ""); initMsg(pname); - u_wmsg(stderr, "cantOpenFromCodeset", str.getBuffer(), + u_wmsg(stderr, "cantOpenFromCodeset", str.getTerminatedBuffer(), u_wmsg_errorName(err)); goto error_exit; } @@ -536,9 +717,9 @@ static UBool convertFile(const char *pname, convto = ucnv_open(tocpage, &err); if (U_FAILURE(err)) { - UnicodeString str(tocpage, (int32_t)(uprv_strlen(tocpage) + 1)); + UnicodeString str(tocpage, ""); initMsg(pname); - u_wmsg(stderr, "cantOpenToCodeset", str.getBuffer(), + u_wmsg(stderr, "cantOpenToCodeset", str.getTerminatedBuffer(), u_wmsg_errorName(err)); goto error_exit; } @@ -550,157 +731,316 @@ static UBool convertFile(const char *pname, } ucnv_setFallback(convto, fallback); - // To ensure that the buffer always is of enough size, we - // must take the worst case scenario, that is the character in - // the codepage that uses the most bytes and multiply it against - // the buffer size. - - // use bufsz+1 to allow for additional BOM/signature character (U+FEFF) - tobufsz = (bufsz+1) * ucnv_getMaxCharSize(convto); - - buf = new char[tobufsz]; - unibuf = new UChar[bufsz]; - - fromoffsets = new int32_t[bufsz]; - tooffsets = new int32_t[tobufsz]; + UBool willexit, fromSawEndOfBytes, toSawEndOfUnicode; + int8_t sig; // OK, we can convert now. + sig = signature; + rd = 0; do { - char willexit = 0; + willexit = FALSE; + + // input file offset at the beginning of the next buffer + infoffset += rd; rd = fread(buf, 1, bufsz, infile); if (ferror(infile) != 0) { UnicodeString str(strerror(errno)); - str.append((UChar32) 0); initMsg(pname); - u_wmsg(stderr, "cantRead", str.getBuffer()); + u_wmsg(stderr, "cantRead", str.getTerminatedBuffer()); goto error_exit; } - // Convert the read buffer into the new coding - // After the call 'unibufp' will be placed on the last + // Convert the read buffer into the new encoding via Unicode. + // After the call 'unibufp' will be placed behind the last // character that was converted in the 'unibuf'. - // Also the 'cbufp' is positioned on the last converted + // Also the 'cbufp' is positioned behind the last converted // character. // At the last conversion in the file, flush should be set to - // true so that we get all characters converted + // true so that we get all characters converted. // // The converter must be flushed at the end of conversion so // that characters on hold also will be written. - unibufp = unibuf; cbufp = buf; - flush = rd != bufsz; - ucnv_toUnicode(convfrom, &unibufp, unibufp + bufsz, &cbufp, - cbufp + rd, fromoffsets, flush, &err); - - infoffset += (uint32_t)(cbufp - buf); + flush = (UBool)(rd != bufsz); - if (U_FAILURE(err)) { - char pos[32]; - sprintf(pos, "%u", infoffset - 1); - UnicodeString str(pos, (int32_t)(uprv_strlen(pos) + 1)); - initMsg(pname); - u_wmsg(stderr, "problemCvtToU", str.getBuffer(), u_wmsg_errorName(err)); - willexit = 1; - err = U_ZERO_ERROR; /* reset the error for the rest of the conversion. */ - } + // convert until the input is consumed + do { + // remember the start of the current byte-to-Unicode conversion + prevbufp = cbufp; + + unibuf = unibufp = u.getBuffer((int32_t)bufsz); + + // Use bufsz instead of u.getCapacity() for the targetLimit + // so that we don't overflow fromoffsets[]. + ucnv_toUnicode(convfrom, &unibufp, unibuf + bufsz, &cbufp, + buf + rd, useOffsets ? fromoffsets : NULL, flush, &err); + + ulen = (int32_t)(unibufp - unibuf); + u.releaseBuffer(ulen); + + // fromSawEndOfBytes indicates that ucnv_toUnicode() is done + // converting all of the input bytes. + // It works like this because ucnv_toUnicode() returns only under the + // following conditions: + // - an error occurred during conversion (an error code is set) + // - the target buffer is filled (the error code indicates an overflow) + // - the source is consumed + // That is, if the error code does not indicate a failure, + // not even an overflow, then the source must be consumed entirely. + fromSawEndOfBytes = (UBool)U_SUCCESS(err); + + if (err == U_BUFFER_OVERFLOW_ERROR) { + err = U_ZERO_ERROR; + } else if (U_FAILURE(err)) { + char pos[32], errorBytes[32]; + int8_t i, length, errorLength; + + UErrorCode localError = U_ZERO_ERROR; + errorLength = (int8_t)sizeof(errorBytes); + ucnv_getInvalidChars(convfrom, errorBytes, &errorLength, &localError); + if (U_FAILURE(localError) || errorLength == 0) { + errorLength = 1; + } - // At the last conversion, the converted characters should be - // equal to number of chars read. + // print the input file offset of the start of the error bytes: + // input file offset of the current byte buffer + + // length of the just consumed bytes - + // length of the error bytes + length = + (int8_t)sprintf(pos, "%d", + (int)(infoffset + (cbufp - buf) - errorLength)); + + // output the bytes that caused the error + UnicodeString str; + for (i = 0; i < errorLength; ++i) { + if (i > 0) { + str.append((UChar)uSP); + } + str.append(nibbleToHex((uint8_t)errorBytes[i] >> 4)); + str.append(nibbleToHex((uint8_t)errorBytes[i])); + } - if (flush && !willexit && cbufp != (buf + rd)) { - char pos[32]; - sprintf(pos, "%u", infoffset); - UnicodeString str(pos, (int32_t)(uprv_strlen(pos) + 1)); - initMsg(pname); - u_wmsg(stderr, "premEndInput", str.getBuffer()); - willexit = 1; - } + initMsg(pname); + u_wmsg(stderr, "problemCvtToU", + UnicodeString(pos, length, "").getTerminatedBuffer(), + str.getTerminatedBuffer(), + u_wmsg_errorName(err)); - // Prepare to transliterate and convert. Transliterate if needed. + willexit = TRUE; + err = U_ZERO_ERROR; /* reset the error for the rest of the conversion. */ + } -#if !UCONFIG_NO_TRANSLITERATION - if (t) { - u.setTo(unibuf, (int32_t)(unibufp - unibuf)); // Copy into string. - t->transliterate(u); - } else -#endif - { - u.setTo(unibuf, (int32_t)(unibufp - unibuf), (int32_t)(bufsz)); // Share the buffer. - } + // Replaced a check for whether the input was consumed by + // looping until it is; message key "premEndInput" now obsolete. - int32_t ulen = u.length(); + if (ulen == 0) { + continue; + } - // Convert the Unicode buffer into the destination codepage - // Again 'bufp' will be placed on the last converted character - // And 'unibufbp' will be placed on the last converted unicode character - // At the last conversion flush should be set to true to ensure that - // all characters left get converted + // remove a U+FEFF Unicode signature character if requested + if (sig < 0) { + if (u.charAt(0) == uSig) { + u.remove(0, 1); - const UChar *unibufu = unibufbp = u.getBuffer(); + // account for the removed UChar and offset + --ulen; - do { - int32_t len = ulen > (int32_t)bufsz ? (int32_t)bufsz : ulen; + if (useOffsets) { + // remove an offset from fromoffsets[] as well + // to keep the array parallel with the UChars + memmove(fromoffsets, fromoffsets + 1, ulen * 4); + } - bufp = buf; - unibufp = (UChar *) (unibufbp + len); + } + sig = 0; + } - ucnv_fromUnicode(convto, &bufp, bufp + tobufsz, - &unibufbp, - unibufp, - tooffsets, flush, &err); +#if !UCONFIG_NO_TRANSLITERATION + // Transliterate/transform if needed. + + // For transformation, we use chunking code - + // collect Unicode input until, for example, an end-of-line, + // then transform and output-convert that and continue collecting. + // This makes the transformation result independent of the buffer size + // while avoiding the slower keyboard mode. + // The end-of-chunk characters are completely included in the + // transformed string in case they are to be transformed themselves. + if (t != NULL) { + UnicodeString out; + int32_t chunkLimit; + + do { + chunkLimit = getChunkLimit(chunk, u); + if (chunkLimit < 0 && flush && fromSawEndOfBytes) { + // use all of the rest at the end of the text + chunkLimit = u.length(); + } + if (chunkLimit >= 0) { + // complete the chunk and transform it + chunk.append(u, 0, chunkLimit); + u.remove(0, chunkLimit); + t->transliterate(chunk); + + // append the transformation result to the result and empty the chunk + out.append(chunk); + chunk.remove(); + } else { + // continue collecting the chunk + chunk.append(u); + break; + } + } while (!u.isEmpty()); - if (U_FAILURE(err)) { - const char *errtag; - char pos[32]; + u = out; + ulen = u.length(); + } +#endif - uint32_t erroffset = - dataOffset((int32_t)(bufp - buf - 1), fromoffsets, (int32_t)(bufsz), tooffsets, (int32_t)(tobufsz)); - int32_t ferroffset = (int32_t)(infoffset - (unibufp - unibufu) + erroffset); + // add a U+FEFF Unicode signature character if requested + // and possible/necessary + if (sig > 0) { + if (u.charAt(0) != uSig && cnvSigType(convto) == CNV_WITH_FEFF) { + u.insert(0, (UChar)uSig); + + if (useOffsets) { + // insert a pseudo-offset into fromoffsets[] as well + // to keep the array parallel with the UChars + memmove(fromoffsets + 1, fromoffsets, ulen * 4); + fromoffsets[0] = -1; + } - if ((int32_t) ferroffset < 0) { - ferroffset = (int32_t)(outfoffset + (bufp - buf)); - errtag = "problemCvtFromUOut"; - } else { - errtag = "problemCvtFromU"; + // account for the additional UChar and offset + ++ulen; } - sprintf(pos, "%u", ferroffset); - UnicodeString str(pos, (int32_t)(uprv_strlen(pos) + 1)); - initMsg(pname); - u_wmsg(stderr, errtag, str.getBuffer(), - u_wmsg_errorName(err)); - willexit = 1; + sig = 0; } - // At the last conversion, the converted characters should be equal to number - // of consumed characters. - if (flush && !willexit && unibufbp != (unibufu + (size_t) (unibufp - unibufu))) { - char pos[32]; - sprintf(pos, "%u", infoffset); - UnicodeString str(pos, (int32_t)(uprv_strlen(pos) + 1)); - initMsg(pname); - u_wmsg(stderr, "premEnd", str.getBuffer()); - willexit = 1; - } + // Convert the Unicode buffer into the destination codepage + // Again 'bufp' will be placed behind the last converted character + // And 'unibufp' will be placed behind the last converted unicode character + // At the last conversion flush should be set to true to ensure that + // all characters left get converted + + unibuf = unibufbp = u.getBuffer(); + + do { + bufp = outbuf; + + // Use fromSawEndOfBytes in addition to the flush flag - + // it indicates whether the intermediate Unicode string + // contains the very last UChars for the very last input bytes. + ucnv_fromUnicode(convto, &bufp, outbuf + bufsz, + &unibufbp, + unibuf + ulen, + NULL, (UBool)(flush && fromSawEndOfBytes), &err); + + // toSawEndOfUnicode indicates that ucnv_fromUnicode() is done + // converting all of the intermediate UChars. + // See comment for fromSawEndOfBytes. + toSawEndOfUnicode = (UBool)U_SUCCESS(err); + + if (err == U_BUFFER_OVERFLOW_ERROR) { + err = U_ZERO_ERROR; + } else if (U_FAILURE(err)) { + UChar errorUChars[4]; + const char *errtag; + char pos[32]; + UChar32 c; + int8_t i, length, errorLength; + + UErrorCode localError = U_ZERO_ERROR; + errorLength = (int8_t)LENGTHOF(errorUChars); + ucnv_getInvalidUChars(convto, errorUChars, &errorLength, &localError); + if (U_FAILURE(localError) || errorLength == 0) { + // need at least 1 so that we don't access beyond the length of fromoffsets[] + errorLength = 1; + } - // Finally, write the converted buffer to the output file + int32_t ferroffset; + if (useOffsets) { + // Unicode buffer offset of the start of the error UChars + ferroffset = (int32_t)((unibufbp - unibuf) - errorLength); + if (ferroffset < 0) { + // approximation - the character started in the previous Unicode buffer + ferroffset = 0; + } - rd = (size_t) (bufp - buf); - outfoffset += (int32_t)(wr = fwrite(buf, 1, rd, outfile)); - if (wr != rd) { - UnicodeString str(strerror(errno), ""); - initMsg(pname); - u_wmsg(stderr, "cantWrite", str.getBuffer()); - willexit = 1; - } + // get the corresponding byte offset out of fromoffsets[] + // go back if the offset is not known for some of the UChars + int32_t fromoffset; + do { + fromoffset = fromoffsets[ferroffset]; + } while (fromoffset < 0 && --ferroffset >= 0); + + // total input file offset = + // input file offset of the current byte buffer + + // byte buffer offset of where the current Unicode buffer is converted from + + // fromoffsets[Unicode offset] + ferroffset = infoffset + (prevbufp - buf) + fromoffset; + errtag = "problemCvtFromU"; + } else { + // Do not use fromoffsets if (t != NULL) because the Unicode text may + // be different from what the offsets refer to. + + // output file offset + ferroffset = (int32_t)(outfoffset + (bufp - outbuf)); + errtag = "problemCvtFromUOut"; + } - if (willexit) { - goto error_exit; - } - } while ((ulen -= (int32_t)(bufsz)) > 0); + length = (int8_t)sprintf(pos, "%u", (int)ferroffset); + + // output the code points that caused the error + UnicodeString str; + for (i = 0; i < errorLength;) { + if (i > 0) { + str.append((UChar)uSP); + } + U16_NEXT(errorUChars, i, errorLength, c); + if (c >= 0x100000) { + str.append(nibbleToHex((uint8_t)(c >> 20))); + } + if (c >= 0x10000) { + str.append(nibbleToHex((uint8_t)(c >> 16))); + } + str.append(nibbleToHex((uint8_t)(c >> 12))); + str.append(nibbleToHex((uint8_t)(c >> 8))); + str.append(nibbleToHex((uint8_t)(c >> 4))); + str.append(nibbleToHex((uint8_t)c)); + } + + initMsg(pname); + u_wmsg(stderr, errtag, + UnicodeString(pos, length, "").getTerminatedBuffer(), + str.getTerminatedBuffer(), + u_wmsg_errorName(err)); + u_wmsg(stderr, "errorUnicode", str.getTerminatedBuffer()); + + willexit = TRUE; + err = U_ZERO_ERROR; /* reset the error for the rest of the conversion. */ + } + + // Replaced a check for whether the intermediate Unicode characters were all consumed by + // looping until they are; message key "premEnd" now obsolete. + + // Finally, write the converted buffer to the output file + size_t outlen = (size_t) (bufp - outbuf); + outfoffset += (int32_t)(wr = fwrite(outbuf, 1, outlen, outfile)); + if (wr != outlen) { + UnicodeString str(strerror(errno)); + initMsg(pname); + u_wmsg(stderr, "cantWrite", str.getTerminatedBuffer()); + willexit = TRUE; + } + + if (willexit) { + goto error_exit; + } + } while (!toSawEndOfUnicode); + } while (!fromSawEndOfBytes); } while (!flush); // Stop when we have flushed the // converters (this means that it's // the end of output) @@ -713,19 +1053,13 @@ error_exit: normal_exit: // Cleanup. - if (convfrom) ucnv_close(convfrom); - if (convto) ucnv_close(convto); + ucnv_close(convfrom); + ucnv_close(convto); #if !UCONFIG_NO_TRANSLITERATION - if (t) delete t; + delete t; #endif - if (buf) delete[] buf; - if (unibuf) delete[] unibuf; - - if (fromoffsets) delete[] fromoffsets; - if (tooffsets) delete[] tooffsets; - if (infile != stdin) { fclose(infile); } @@ -767,11 +1101,11 @@ static void usage(const char *pname, int ecode) { exit(ecode); } -int main(int argc, char **argv) +extern int +main(int argc, char **argv) { FILE *outfile; int ret = 0; - int seenf = 0; size_t bufsz = DEFAULT_BUFSZ; @@ -779,23 +1113,33 @@ int main(int argc, char **argv) const char *tocpage = 0; const char *translit = 0; const char *outfilestr = 0; - int fallback = 0; + UBool fallback = FALSE; UConverterFromUCallback fromucallback = UCNV_FROM_U_CALLBACK_STOP; const void *fromuctxt = 0; UConverterToUCallback toucallback = UCNV_TO_U_CALLBACK_STOP; const void *touctxt = 0; - char **iter; + char **iter, **remainArgv, **remainArgvLimit; char **end = argv + argc; const char *pname; - int printConvs = 0, printCanon = 0; + UBool printConvs = FALSE, printCanon = FALSE, printTranslits = FALSE; const char *printName = 0; - int printTranslits = 0; - int verbose = 0; + UBool verbose = FALSE; + UErrorCode status = U_ZERO_ERROR; + + ConvertFile cf; + + /* Initialize ICU */ + u_init(&status); + if (U_FAILURE(status)) { + fprintf(stderr, "%s: can not initialize ICU. status = %s\n", + argv[0], u_errorName(status)); + exit(1); + } // Get and prettify pname. pname = uprv_strrchr(*argv, U_FILE_SEP_CHAR); @@ -813,9 +1157,7 @@ int main(int argc, char **argv) // First, get the arguments from command-line // to know the codepages to convert between - // XXX When you add to this loop, you need to add to the similar loop - // below. - + remainArgv = remainArgvLimit = argv + 1; for (iter = argv + 1; iter != end; iter++) { // Check for from charset if (strcmp("-f", *iter) == 0 || !strcmp("--from-code", *iter)) { @@ -837,9 +1179,9 @@ int main(int argc, char **argv) else usage(pname, 1); } else if (!strcmp("--fallback", *iter)) { - fallback = 1; + fallback = TRUE; } else if (!strcmp("--no-fallback", *iter)) { - fallback = 0; + fallback = FALSE; } else if (strcmp("-b", *iter) == 0 || !strcmp("--block-size", *iter)) { iter++; if (iter != end) { @@ -848,7 +1190,7 @@ int main(int argc, char **argv) initMsg(pname); UnicodeString str(*iter); initMsg(pname); - u_wmsg(stderr, "badBlockSize", str.getBuffer()); + u_wmsg(stderr, "badBlockSize", str.getTerminatedBuffer()); return 3; } } else { @@ -858,7 +1200,7 @@ int main(int argc, char **argv) if (printTranslits) { usage(pname, 1); } - printConvs = 1; + printConvs = TRUE; } else if (strcmp("--default-code", *iter) == 0) { if (printTranslits) { usage(pname, 1); @@ -876,19 +1218,19 @@ int main(int argc, char **argv) if (U_FAILURE(e) || !printName) { UnicodeString str(*iter); initMsg(pname); - u_wmsg(stderr, "noSuchCodeset", str.getBuffer()); + u_wmsg(stderr, "noSuchCodeset", str.getTerminatedBuffer()); return 2; } } else usage(pname, 1); } else if (strcmp("--canon", *iter) == 0) { - printCanon = 1; + printCanon = TRUE; } else if (strcmp("-L", *iter) == 0 || !strcmp("--list-transliterators", *iter)) { if (printConvs) { usage(pname, 1); } - printTranslits = 1; + printTranslits = TRUE; } else if (strcmp("-h", *iter) == 0 || !strcmp("-?", *iter) || !strcmp("--help", *iter)) { usage(pname, 0); @@ -904,7 +1246,7 @@ int main(int argc, char **argv) } else { UnicodeString str(*iter); initMsg(pname); - u_wmsg(stderr, "unknownCallback", str.getBuffer()); + u_wmsg(stderr, "unknownCallback", str.getTerminatedBuffer()); return 4; } } else { @@ -920,7 +1262,7 @@ int main(int argc, char **argv) } else { UnicodeString str(*iter); initMsg(pname); - u_wmsg(stderr, "unknownCallback", str.getBuffer()); + u_wmsg(stderr, "unknownCallback", str.getTerminatedBuffer()); return 4; } } else { @@ -940,18 +1282,18 @@ int main(int argc, char **argv) } else { UnicodeString str(*iter); initMsg(pname); - u_wmsg(stderr, "unknownCallback", str.getBuffer()); + u_wmsg(stderr, "unknownCallback", str.getTerminatedBuffer()); return 4; } } else { usage(pname, 1); } } else if (!strcmp("-s", *iter) || !strcmp("--silent", *iter)) { - verbose = 0; + verbose = FALSE; } else if (!strcmp("-v", *iter) || !strcmp("--verbose", *iter)) { - verbose = 1; + verbose = TRUE; } else if (!strcmp("-V", *iter) || !strcmp("--version", *iter)) { - printf("%s v2.0\n", pname); + printf("%s v2.1 ICU " U_ICU_VERSION "\n", pname); return 0; } else if (!strcmp("-o", *iter) || !strcmp("--output", *iter)) { ++iter; @@ -960,8 +1302,15 @@ int main(int argc, char **argv) } else { usage(pname, 1); } + } else if (0 == strcmp("--add-signature", *iter)) { + cf.signature = 1; + } else if (0 == strcmp("--remove-signature", *iter)) { + cf.signature = -1; } else if (**iter == '-' && (*iter)[1]) { usage(pname, 1); + } else { + // move a non-option up in argv[] + *remainArgvLimit++ = *iter; } } @@ -992,7 +1341,7 @@ int main(int argc, char **argv) } else { outfilestr = "-"; outfile = stdout; -#ifdef WIN32 +#ifdef USE_FILENO_BINARY_MODE if (setmode(fileno(outfile), O_BINARY) == -1) { u_wmsg(stderr, "cantSetOutBinMode"); exit(-1); @@ -1001,69 +1350,26 @@ int main(int argc, char **argv) } /* Loop again on the arguments to find all the input files, and - convert them. XXX Cheap and sloppy. */ + convert them. */ - for (iter = argv + 1; iter != end; iter++) { - if (strcmp("-f", *iter) == 0 || !strcmp("--from-code", *iter)) { - iter++; - } else if (strcmp("-t", *iter) == 0 || !strcmp("--to-code", *iter)) { - iter++; - } else if (strcmp("-x", *iter) == 0) { - iter++; - } else if (!strcmp("--fallback", *iter)) { - ; - } else if (!strcmp("--no-fallback", *iter)) { - ; - } else if (strcmp("-b", *iter) == 0 || !strcmp("--block-size", *iter)) { - iter++; - } else if (strcmp("-l", *iter) == 0 || !strcmp("--list", *iter)) { - ; - } else if (strcmp("--default-code", *iter) == 0) { - ; - } else if (strcmp("--list-code", *iter) == 0) { - ; - } else if (strcmp("--canon", *iter) == 0) { - ; - } else if (strcmp("-L", *iter) == 0 - || !strcmp("--list-transliterators", *iter)) { - ; - } else if (strcmp("-h", *iter) == 0 || !strcmp("-?", *iter) - || !strcmp("--help", *iter)) { - ; - } else if (!strcmp("-c", *iter)) { - ; - } else if (!strcmp("--to-callback", *iter)) { - iter++; - } else if (!strcmp("--from-callback", *iter)) { - iter++; - } else if (!strcmp("-i", *iter)) { - ; - } else if (!strcmp("--callback", *iter)) { - iter++; - } else if (!strcmp("-s", *iter) || !strcmp("--silent", *iter)) { - ; - } else if (!strcmp("-v", *iter) || !strcmp("--verbose", *iter)) { - ; - } else if (!strcmp("-V", *iter) || !strcmp("--version", *iter)) { - ; - } else if (!strcmp("-o", *iter) || !strcmp("--output", *iter)) { - ++iter; - } else { - seenf = 1; - if (!convertFile - (pname, fromcpage, toucallback, touctxt, tocpage, - fromucallback, fromuctxt, fallback, bufsz, translit, *iter, - outfile, verbose)) { + cf.setBufferSize(bufsz); + + if(remainArgv < remainArgvLimit) { + for (iter = remainArgv; iter != remainArgvLimit; iter++) { + if (!cf.convertFile( + pname, fromcpage, toucallback, touctxt, tocpage, + fromucallback, fromuctxt, fallback, translit, *iter, + outfile, verbose) + ) { goto error_exit; } } - } - - if (!seenf) { - if (!convertFile - (pname, fromcpage, toucallback, touctxt, tocpage, - fromucallback, fromuctxt, fallback, bufsz, translit, 0, outfile, - verbose)) { + } else { + if (!cf.convertFile( + pname, fromcpage, toucallback, touctxt, tocpage, + fromucallback, fromuctxt, fallback, translit, 0, + outfile, verbose) + ) { goto error_exit; } } @@ -1073,8 +1379,9 @@ error_exit: ret = 1; normal_exit: - if (outfile != stdout) + if (outfile != stdout) { fclose(outfile); + } return ret; } diff --git a/icuSources/extra/uconv/uconv.dsp b/icuSources/extra/uconv/uconv.dsp index eec26663..fb1a4121 100644 --- a/icuSources/extra/uconv/uconv.dsp +++ b/icuSources/extra/uconv/uconv.dsp @@ -77,7 +77,6 @@ SOURCE="$(InputPath)" # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" -# PROP Exclude_From_Build 1 # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" MTL=midl.exe @@ -91,6 +90,17 @@ BSC32=bscmake.exe LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 icuucd.lib icuind.lib uconvmsg.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\lib" /libpath:"Debug" +# Begin Custom Build +ProjDir=. +TargetPath=.\Debug\uconv.exe +InputPath=.\Debug\uconv.exe +InputName=uconv +SOURCE="$(InputPath)" + +"$(ProjDir)\..\..\..\bin\$(InputName).exe" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(TargetPath) ..\..\..\bin + +# End Custom Build !ELSEIF "$(CFG)" == "uconv - Win64 Release" @@ -107,7 +117,7 @@ LINK32=link.exe # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /W3 /GX /Zi /O2 /Op /I "..\..\..\include" /I "..\..\common" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "UCONVMSG_LINK" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /W3 /GX /Zi /O2 /Op /I "..\..\..\include" /I "..\..\common" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "UCONVMSG_LINK" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -143,7 +153,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /Op /I "..\..\..\include" /I "..\..\common" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "UCONVMSG_LINK" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /GZ /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /Op /I "..\..\..\include" /I "..\..\common" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "UCONVMSG_LINK" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /GZ /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe diff --git a/icuSources/extra/uconv/uconv.dsw b/icuSources/extra/uconv/uconv.dsw deleted file mode 100644 index c4c54ba8..00000000 --- a/icuSources/extra/uconv/uconv.dsw +++ /dev/null @@ -1,29 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "uconv"=.\uconv.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/icuSources/extra/uconv/uconv.vcproj b/icuSources/extra/uconv/uconv.vcproj index ff296ba6..3e3f07c9 100644 --- a/icuSources/extra/uconv/uconv.vcproj +++ b/icuSources/extra/uconv/uconv.vcproj @@ -1,7 +1,7 @@ - + @@ -36,17 +36,16 @@ CompileAs="0"/> + Outputs="$(ProjectDir)..\..\..\bin\$(TargetFileName)"/> + + + + Name="VCCustomBuildTool" + CommandLine="copy "$(TargetPath)" ..\..\..\bin +" + Outputs="$(ProjectDir)..\..\..\bin\$(TargetFileName)"/> @@ -119,10 +126,18 @@ Culture="1033"/> + + + + + @@ -168,7 +183,7 @@ Name="Debug|Win32"> diff --git a/icuSources/extra/uconv/unicode/uwmsg.h b/icuSources/extra/uconv/unicode/uwmsg.h index f660bb23..69a10356 100644 --- a/icuSources/extra/uconv/unicode/uwmsg.h +++ b/icuSources/extra/uconv/unicode/uwmsg.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2000, International Business Machines Corporation +* Copyright (C) 2000-2004, International Business Machines Corporation * and others. All Rights Reserved. ********************************************************************** @@ -18,12 +18,12 @@ and print it to stderr /* Set the path to wmsg's bundle. Caller owns storage. */ -U_CAPI UResourceBundle *u_wmsg_setPath(const char *path, UErrorCode *err); +U_CFUNC UResourceBundle *u_wmsg_setPath(const char *path, UErrorCode *err); /* Format a message and print it's output to a given file stream */ -U_CAPI int u_wmsg(FILE *fp, const char *tag, ... ); +U_CFUNC int u_wmsg(FILE *fp, const char *tag, ... ); /* format an error message */ -U_CAPI const UChar* u_wmsg_errorName(UErrorCode err); +U_CFUNC const UChar* u_wmsg_errorName(UErrorCode err); #endif diff --git a/icuSources/extra/uconv/uwmsg.c b/icuSources/extra/uconv/uwmsg.c index 4769d3cc..61e6c463 100644 --- a/icuSources/extra/uconv/uwmsg.c +++ b/icuSources/extra/uconv/uwmsg.c @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1998-2000, International Business Machines Corporation +* Copyright (C) 1998-2004, International Business Machines Corporation * and others. All Rights Reserved. ********************************************************************** * @@ -18,6 +18,7 @@ #include "unicode/umsg.h" #include "unicode/uwmsg.h" #include "unicode/ures.h" +#include "unicode/putil.h" #include "cstring.h" #include @@ -88,7 +89,7 @@ static UResourceBundle *gBundle = NULL; U_STRING_DECL(gNoFormatting, " (UCONFIG_NO_FORMATTING see uconfig.h)", 38); -U_CAPI UResourceBundle *u_wmsg_setPath(const char *path, UErrorCode *err) +U_CFUNC UResourceBundle *u_wmsg_setPath(const char *path, UErrorCode *err) { if(U_FAILURE(*err)) { @@ -119,7 +120,7 @@ U_CAPI UResourceBundle *u_wmsg_setPath(const char *path, UErrorCode *err) } /* Format a message and print it's output to fp */ -U_CAPI int u_wmsg(FILE *fp, const char *tag, ... ) +U_CFUNC int u_wmsg(FILE *fp, const char *tag, ... ) { const UChar *msg; int32_t msgLen; @@ -196,21 +197,27 @@ U_CAPI int u_wmsg(FILE *fp, const char *tag, ... ) } /* these will break if the # of messages change. simply add or remove 0's .. */ -UChar * gInfoMessages[U_ERROR_WARNING_LIMIT-U_ERROR_WARNING_START] = - { 0,0 }; +UChar **gInfoMessages = NULL; -UChar * gErrMessages[U_ERROR_LIMIT] = - { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; +UChar **gErrMessages = NULL; static const UChar *fetchErrorName(UErrorCode err) { + if (!gInfoMessages) { + gInfoMessages = (UChar **)malloc((U_ERROR_WARNING_LIMIT-U_ERROR_WARNING_START)*sizeof(UChar*)); + memset(gInfoMessages, 0, (U_ERROR_WARNING_LIMIT-U_ERROR_WARNING_START)*sizeof(UChar*)); + } + if (!gErrMessages) { + gErrMessages = (UChar **)malloc(U_ERROR_LIMIT*sizeof(UChar*)); + memset(gErrMessages, 0, U_ERROR_LIMIT*sizeof(UChar*)); + } if(err>=0) return gErrMessages[err]; else return gInfoMessages[err-U_ERROR_WARNING_START]; } -U_CAPI const UChar *u_wmsg_errorName(UErrorCode err) +U_CFUNC const UChar *u_wmsg_errorName(UErrorCode err) { UChar *msg; int32_t msgLen; diff --git a/icuSources/extra/ustdio/locbund.c b/icuSources/extra/ustdio/locbund.c deleted file mode 100644 index f1d34349..00000000 --- a/icuSources/extra/ustdio/locbund.c +++ /dev/null @@ -1,225 +0,0 @@ -/* -******************************************************************************* -* -* Copyright (C) 1998-1999, International Business Machines -* Corporation and others. All Rights Reserved. -* -******************************************************************************* -* -* File locbund.c -* -* Modification History: -* -* Date Name Description -* 11/18/98 stephen Creation. -* 12/10/1999 bobbyr@optiosoftware.com Fix for memory leak + string allocation bugs -******************************************************************************* -*/ - -#include - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_FORMATTING - -#include "locbund.h" - -#include "cmemory.h" -#include "unicode/ustring.h" -#include "unicode/uloc.h" - -ULocaleBundle* -u_locbund_new(const char *loc) -{ - ULocaleBundle *result = (ULocaleBundle*) uprv_malloc(sizeof(ULocaleBundle)); - int32_t len; - - if(result == 0) - return 0; - - len = (int32_t)(loc == 0 ? strlen(uloc_getDefault()) : strlen(loc)); - result->fLocale = (char*) uprv_malloc(len + 1); - if(result->fLocale == 0) { - uprv_free(result); - return 0; - } - - strcpy(result->fLocale, (loc == 0 ? uloc_getDefault() : loc) ); - - result->fNumberFormat = 0; - result->fPercentFormat = 0; - result->fCurrencyFormat = 0; - result->fScientificFormat = 0; - result->fSpelloutFormat = 0; - result->fDateFormat = 0; - result->fTimeFormat = 0; - - return result; -} - -ULocaleBundle* -u_locbund_clone(const ULocaleBundle *bundle) -{ - ULocaleBundle *result = (ULocaleBundle*)uprv_malloc(sizeof(ULocaleBundle)); - UErrorCode status = U_ZERO_ERROR; - - if(result == 0) - return 0; - - result->fLocale = (char*) uprv_malloc(strlen(bundle->fLocale) + 1); - if(result->fLocale == 0) { - uprv_free(result); - return 0; - } - - strcpy(result->fLocale, bundle->fLocale ); - - result->fNumberFormat = (bundle->fNumberFormat == 0 ? 0 : - unum_clone(bundle->fNumberFormat, &status)); - result->fPercentFormat = (bundle->fPercentFormat == 0 ? 0 : - unum_clone(bundle->fPercentFormat, - &status)); - result->fCurrencyFormat = (bundle->fCurrencyFormat == 0 ? 0 : - unum_clone(bundle->fCurrencyFormat, - &status)); - result->fScientificFormat = (bundle->fScientificFormat == 0 ? 0 : - unum_clone(bundle->fScientificFormat, - &status)); - result->fSpelloutFormat = (bundle->fSpelloutFormat == 0 ? 0 : - unum_clone(bundle->fSpelloutFormat, - &status)); - result->fDateFormat = (bundle->fDateFormat == 0 ? 0 : - udat_clone(bundle->fDateFormat, &status)); - result->fTimeFormat = (bundle->fTimeFormat == 0 ? 0 : - udat_clone(bundle->fTimeFormat, &status)); - - return result; -} - -void -u_locbund_delete(ULocaleBundle *bundle) -{ - uprv_free(bundle->fLocale); - - if(bundle->fNumberFormat != 0) - unum_close(bundle->fNumberFormat); - if(bundle->fPercentFormat != 0) - unum_close(bundle->fPercentFormat); - if(bundle->fCurrencyFormat != 0) - unum_close(bundle->fCurrencyFormat); - if(bundle->fScientificFormat != 0) - unum_close(bundle->fScientificFormat); - if(bundle->fSpelloutFormat != 0) - unum_close(bundle->fSpelloutFormat); - if(bundle->fDateFormat != 0) - udat_close(bundle->fDateFormat); - if(bundle->fTimeFormat != 0) - udat_close(bundle->fTimeFormat); - - uprv_free(bundle); -} - -UNumberFormat* -u_locbund_getNumberFormat(ULocaleBundle *bundle) -{ - UErrorCode status = U_ZERO_ERROR; - - if(bundle->fNumberFormat == 0) { - bundle->fNumberFormat = unum_open(UNUM_DEFAULT, NULL,0,bundle->fLocale,NULL, &status); - if(U_FAILURE(status)) - return 0; - } - - return bundle->fNumberFormat; -} - -UNumberFormat* -u_locbund_getPercentFormat(ULocaleBundle *bundle) -{ - UErrorCode status = U_ZERO_ERROR; - - if(bundle->fPercentFormat == 0) { - bundle->fPercentFormat = unum_open(UNUM_PERCENT,NULL,0, bundle->fLocale,NULL, &status); - if(U_FAILURE(status)) - return 0; - } - - return bundle->fPercentFormat; -} - -UNumberFormat* -u_locbund_getCurrencyFormat(ULocaleBundle *bundle) -{ - UErrorCode status = U_ZERO_ERROR; - - if(bundle->fCurrencyFormat == 0) { - bundle->fCurrencyFormat = unum_open(UNUM_CURRENCY,NULL,0, bundle->fLocale, NULL,&status); - if(U_FAILURE(status)) - return 0; - } - - return bundle->fCurrencyFormat; -} - -#define PAT_SIZE 512 - -UNumberFormat* -u_locbund_getScientificFormat(ULocaleBundle *bundle) -{ - UErrorCode status = U_ZERO_ERROR; -/* UChar pattern [PAT_SIZE];*/ - - if(bundle->fScientificFormat == 0) { - /* create the pattern for the locale */ -/* u_uastrcpy(pattern, "0.000000E000");*/ - - bundle->fScientificFormat = unum_open(UNUM_SCIENTIFIC, NULL, 0, - bundle->fLocale, NULL,&status); - - if(U_FAILURE(status)) - return 0; - } - - return bundle->fScientificFormat; -} - -UNumberFormat* -u_locbund_getSpelloutFormat(ULocaleBundle *bundle) -{ - UErrorCode status = U_ZERO_ERROR; - - if(bundle->fSpelloutFormat == 0) { - bundle->fSpelloutFormat = unum_open(UNUM_SPELLOUT,NULL,0 ,bundle->fLocale, NULL, - &status); - } - - return bundle->fSpelloutFormat; -} - -UDateFormat* -u_locbund_getDateFormat(ULocaleBundle *bundle) -{ - UErrorCode status = U_ZERO_ERROR; - - if(bundle->fDateFormat == 0) { - bundle->fDateFormat = udat_open(UDAT_NONE, UDAT_DEFAULT, - bundle->fLocale, 0, 0,NULL,0, &status); - } - - return bundle->fDateFormat; -} - -UDateFormat* -u_locbund_getTimeFormat(ULocaleBundle *bundle) -{ - UErrorCode status = U_ZERO_ERROR; - - if(bundle->fTimeFormat == 0) { - bundle->fTimeFormat = udat_open(UDAT_DEFAULT, UDAT_NONE, - bundle->fLocale, 0, 0,NULL,0, &status); - } - - return bundle->fTimeFormat; -} - -#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/extra/ustdio/locbund.h b/icuSources/extra/ustdio/locbund.h deleted file mode 100644 index 2d12a4e4..00000000 --- a/icuSources/extra/ustdio/locbund.h +++ /dev/null @@ -1,125 +0,0 @@ -/* -******************************************************************************* -* -* Copyright (C) 1998-1999, International Business Machines -* Corporation and others. All Rights Reserved. -* -******************************************************************************* -* -* File locbund.h -* -* Modification History: -* -* Date Name Description -* 10/16/98 stephen Creation. -* 02/25/99 stephen Modified for new C API. -******************************************************************************* -*/ - -#ifndef LOCBUND_H -#define LOCBUND_H - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_FORMATTING - -#include "unicode/unum.h" -#include "unicode/udat.h" - -struct ULocaleBundle { - char *fLocale; - - UNumberFormat *fNumberFormat; - UNumberFormat *fPercentFormat; - UNumberFormat *fCurrencyFormat; - UNumberFormat *fScientificFormat; - UNumberFormat *fSpelloutFormat; - - UDateFormat *fDateFormat; - UDateFormat *fTimeFormat; -}; -typedef struct ULocaleBundle ULocaleBundle; - - -/** - * Create a new ULocaleBundle, initializing all formatters to 0. - * @param loc The locale of the ULocaleBundle. - * @return A pointer to a ULocaleBundle, or 0 if loc was invalid. - */ -ULocaleBundle* -u_locbund_new(const char *loc); - -/** - * Create a deep copy of this ULocaleBundle; - * @param bundle The ULocaleBundle to clone. - * @return A new ULocaleBundle. - */ -ULocaleBundle* -u_locbund_clone(const ULocaleBundle *bundle); - -/** - * Delete the specified ULocaleBundle, freeing all associated memory. - * @param bundle The ULocaleBundle to delete - */ -void -u_locbund_delete(ULocaleBundle *bundle); - -/** - * Get the NumberFormat used to format and parse numbers in a ULocaleBundle. - * @param bundle The ULocaleBundle to use - * @return A pointer to the NumberFormat used for number formatting and parsing. - */ -UNumberFormat* -u_locbund_getNumberFormat(ULocaleBundle *bundle); - -/** - * Get the NumberFormat used to format and parse percents in a ULocaleBundle. - * @param bundle The ULocaleBundle to use - * @return A pointer to the NumberFormat used for percent formatting and parsing. - */ -UNumberFormat* -u_locbund_getPercentFormat(ULocaleBundle *bundle); - -/** - * Get the NumberFormat used to format and parse currency in a ULocaleBundle. - * @param bundle The ULocaleBundle to use - * @return A pointer to the NumberFormat used for currency formatting and parsing. - */ -UNumberFormat* -u_locbund_getCurrencyFormat(ULocaleBundle *bundle); - -/** - * Get the NumberFormat used to format and parse scientific numbers in a ULocaleBundle. - * @param bundle The ULocaleBundle to use - * @return A pointer to the NumberFormat used for scientific formatting and parsing. - */ -UNumberFormat* -u_locbund_getScientificFormat(ULocaleBundle *bundle); - -/** - * Get the NumberFormat used format to and parse spelled-out numbers in a ULocaleBundle. - * @param bundle The ULocaleBundle to use - * @return A pointer to the NumberFormat used for spelled-out number formatting and parsing. - */ -UNumberFormat* -u_locbund_getSpelloutFormat(ULocaleBundle *bundle); - -/** - * Get the DateFormat used to format and parse dates in a ULocaleBundle. - * @param bundle The ULocaleBundle to use - * @return A pointer to the DateFormat used for date formatting and parsing. - */ -UDateFormat* -u_locbund_getDateFormat(ULocaleBundle *bundle); - -/** - * Get the DateFormat used to format and parse times in a ULocaleBundle. - * @param bundle The ULocaleBundle to use - * @return A pointer to the DateFormat used for time formatting and parsing. - */ -UDateFormat* -u_locbund_getTimeFormat(ULocaleBundle *bundle); - -#endif /* #if !UCONFIG_NO_FORMATTING */ - -#endif diff --git a/icuSources/extra/ustdio/loccache.c b/icuSources/extra/ustdio/loccache.c deleted file mode 100644 index 68fdd79a..00000000 --- a/icuSources/extra/ustdio/loccache.c +++ /dev/null @@ -1,122 +0,0 @@ -/* -******************************************************************************* -* -* Copyright (C) 1998-2003, International Business Machines -* Corporation and others. All Rights Reserved. -* -******************************************************************************* -* -* File loccache.c -* -* Modification History: -* -* Date Name Description -* 11/18/98 stephen Creation. -* 03/11/99 stephen Modified for new C API. -* 06/16/99 stephen Added #include for uloc.h -******************************************************************************* -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_FORMATTING - -#include "loccache.h" -#include "uhash.h" -#include "unicode/uloc.h" -#include "umutex.h" -#include "ucln.h" - -/* The global cache */ -static UHashtable *gLocaleCache = NULL; - -static void U_CALLCONV -hash_freeBundle(void* obj) -{ - u_locbund_delete((ULocaleBundle *)obj); -} - -ULocaleBundle* -u_loccache_get(const char *loc) -{ - ULocaleBundle *result; - UErrorCode status = U_ZERO_ERROR; - - /* Create the cache, if needed */ - if(gLocaleCache == NULL) { - UHashtable *tempCache; - int32_t locCount = uloc_countAvailable(); - - tempCache = uhash_openSize(uhash_hashChars, uhash_compareChars, locCount, &status); - if(U_FAILURE(status)) - return NULL; - - uhash_setValueDeleter(tempCache, hash_freeBundle); - - /* Lock the cache */ - umtx_lock(NULL); - /* Make sure it didn't change while we were acquiring the lock */ - if(gLocaleCache == NULL) { - gLocaleCache = tempCache; - } - else { - uhash_close(tempCache); - } - - /* Unlock the cache */ - umtx_unlock(NULL); - ucln_ustdio_registerCleanup(); - } - - /* Try and get the bundle from the cache */ - /* This will be slightly wasteful the first time around, */ - /* since we know the cache will be empty. But, it simplifies */ - /* the code a great deal. */ - - result = (ULocaleBundle*)uhash_get(gLocaleCache, loc); - - /* If the bundle wasn't found, create it and add it to the cache */ - if(result == NULL) { - /* Create the bundle */ - ULocaleBundle *tempBundle = u_locbund_new(loc); - - /* Lock the cache */ - umtx_lock(NULL); - - /* Make sure the cache didn't change while we were locking it */ - result = (ULocaleBundle*)uhash_get(gLocaleCache, loc); - if(result == NULL) { - result = tempBundle; - uhash_put(gLocaleCache, tempBundle->fLocale, tempBundle, &status); - } - else { - u_locbund_delete(tempBundle); - } - - /* Unlock the cache */ - umtx_unlock(NULL); - } - - return result; -} - -static UBool loccache_cleanup() -{ - if (gLocaleCache) { - uhash_close(gLocaleCache); - gLocaleCache = NULL; - } - return TRUE; /* Everything was cleaned up */ -} - -static UBool ustdio_cleanup(void) -{ - return loccache_cleanup(); -} - -void ucln_ustdio_registerCleanup() -{ - ucln_registerCleanup(UCLN_USTDIO, ustdio_cleanup); -} - -#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/extra/ustdio/sprintf.c b/icuSources/extra/ustdio/sprintf.c deleted file mode 100644 index 24930d44..00000000 --- a/icuSources/extra/ustdio/sprintf.c +++ /dev/null @@ -1,1449 +0,0 @@ -/* -******************************************************************************* -* -* Copyright (C) 1998-2003, International Business Machines -* Corporation and others. All Rights Reserved. -* -******************************************************************************* -* -* File sprintf.c -* -* Modification History: -* -* Date Name Description -* 02/08/2000 george Creation. Copied from uprintf.c -* 03/27/2002 Mark Schneckloth Many fixes regarding alignment, null termination -* (mschneckloth@atomz.com) and other various problems. -******************************************************************************* -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_FORMATTING - -#include "sprintf.h" -#include "sprntf_p.h" -#include "unicode/ustdio.h" -#include "unicode/ustring.h" -#include "locbund.h" -#include "loccache.h" -#include "unicode/unum.h" -#include "unicode/udat.h" -#include "unicode/uloc.h" - -#include "cmemory.h" -#include - - -/* --- Prototypes ---------------------------- */ - -int32_t -u_sprintf_simple_percent_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args); - -int32_t -u_sprintf_string_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args); - -int32_t -u_sprintf_date_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args); - -int32_t -u_sprintf_scientific_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args); - -int32_t -u_sprintf_scidbl_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args); - -int32_t -u_sprintf_uchar_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args); - -int32_t -u_sprintf_currency_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args); - -int32_t -u_sprintf_ustring_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args); - -int32_t -u_sprintf_percent_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args); - -int32_t -u_sprintf_time_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args); - -int32_t -u_sprintf_spellout_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args); - -int32_t -u_sprintf_hex_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args); - -int32_t -u_sprintf_char_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args); - -int32_t -u_sprintf_integer_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args); - -int32_t -u_sprintf_uinteger_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args); - -int32_t -u_sprintf_double_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args); - -int32_t -u_sprintf_count_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args); - -int32_t -u_sprintf_octal_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args); - -int32_t -u_sprintf_pointer_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args); - -/* ANSI style formatting */ -/* Use US-ASCII characters only for formatting */ - -/* % */ -#define UFMT_SIMPLE_PERCENT {ufmt_simple_percent, u_sprintf_simple_percent_handler} -/* s */ -#define UFMT_STRING {ufmt_string, u_sprintf_string_handler} -/* c */ -#define UFMT_CHAR {ufmt_char, u_sprintf_char_handler} -/* d, i */ -#define UFMT_INT {ufmt_int, u_sprintf_integer_handler} -/* u */ -#define UFMT_UINT {ufmt_int, u_sprintf_uinteger_handler} -/* o */ -#define UFMT_OCTAL {ufmt_int, u_sprintf_octal_handler} -/* x, X */ -#define UFMT_HEX {ufmt_int, u_sprintf_hex_handler} -/* f */ -#define UFMT_DOUBLE {ufmt_double, u_sprintf_double_handler} -/* e, E */ -#define UFMT_SCIENTIFIC {ufmt_double, u_sprintf_scientific_handler} -/* g, G */ -#define UFMT_SCIDBL {ufmt_double, u_sprintf_scidbl_handler} -/* n */ -#define UFMT_COUNT {ufmt_count, u_sprintf_count_handler} - -/* non-ANSI extensions */ -/* Use US-ASCII characters only for formatting */ - -/* p */ -#define UFMT_POINTER {ufmt_pointer, u_sprintf_pointer_handler} -/* D */ -#define UFMT_DATE {ufmt_date, u_sprintf_date_handler} -/* T */ -#define UFMT_TIME {ufmt_date, u_sprintf_time_handler} -/* V */ -#define UFMT_SPELLOUT {ufmt_double, u_sprintf_spellout_handler} -/* P */ -#define UFMT_PERCENT {ufmt_double, u_sprintf_percent_handler} -/* M */ -#define UFMT_CURRENCY {ufmt_double, u_sprintf_currency_handler} -/* K */ -#define UFMT_UCHAR {ufmt_uchar, u_sprintf_uchar_handler} -/* U */ -#define UFMT_USTRING {ufmt_ustring, u_sprintf_ustring_handler} - - -#define UFMT_EMPTY {ufmt_empty, NULL} - -struct u_sprintf_info { - enum ufmt_type_info info; - u_sprintf_handler handler; -}; -typedef struct u_sprintf_info u_sprintf_info; - -/* Use US-ASCII characters only for formatting. Most codepages have -characters 20-7F from Unicode. Using any other codepage specific -characters will make it very difficult to format the string on -non-Unicode machines */ -static const u_sprintf_info g_u_sprintf_infos[108] = { - /* 0x20 */ - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_SIMPLE_PERCENT,UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - - /* 0x30 */ - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - - /* 0x40 */ - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_DATE, UFMT_SCIENTIFIC, UFMT_EMPTY, UFMT_SCIDBL, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_UCHAR, - UFMT_EMPTY, UFMT_CURRENCY, UFMT_EMPTY, UFMT_EMPTY, - - /* 0x50 */ - UFMT_PERCENT, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_TIME, UFMT_USTRING, UFMT_SPELLOUT, UFMT_EMPTY, - UFMT_HEX, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - - /* 0x60 */ - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_CHAR, - UFMT_INT, UFMT_SCIENTIFIC, UFMT_DOUBLE, UFMT_SCIDBL, - UFMT_EMPTY, UFMT_INT, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_COUNT, UFMT_OCTAL, - - /* 0x70 */ - UFMT_POINTER, UFMT_EMPTY, UFMT_EMPTY, UFMT_STRING, - UFMT_EMPTY, UFMT_UINT, UFMT_EMPTY, UFMT_EMPTY, - UFMT_HEX, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, -}; - -#define USPRINTF_NUM_FMT_HANDLERS sizeof(g_u_sprintf_infos) - -/* We do not use handlers for 0-0x1f */ -#define USPRINTF_BASE_FMT_HANDLERS 0x20 - -/* buffer size for formatting */ -#define USPRINTF_BUFFER_SIZE 1024 -#define USPRINTF_SYMBOL_BUFFER_SIZE 8 - -static const UChar gNullStr[] = {0x28, 0x6E, 0x75, 0x6C, 0x6C, 0x29, 0}; /* "(null)" */ -static const UChar gSpaceStr[] = {0x20, 0}; /* " " */ - -U_CAPI int32_t U_EXPORT2 -u_sprintf(UChar *buffer, - const char *locale, - const char *patternSpecification, - ... ) -{ - va_list ap; - int32_t written; - - va_start(ap, patternSpecification); - written = u_vsnprintf(buffer, INT32_MAX, locale, patternSpecification, ap); - va_end(ap); - - return written; -} - -U_CAPI int32_t U_EXPORT2 -u_sprintf_u(UChar *buffer, - const char *locale, - const UChar *patternSpecification, - ... ) -{ - va_list ap; - int32_t written; - - va_start(ap, patternSpecification); - written = u_vsnprintf_u(buffer, INT32_MAX, locale, patternSpecification, ap); - va_end(ap); - - return written; -} - -U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ -u_vsprintf(UChar *buffer, - const char *locale, - const char *patternSpecification, - va_list ap) -{ - return u_vsnprintf(buffer, INT32_MAX, locale, patternSpecification, ap); -} - -U_CAPI int32_t U_EXPORT2 -u_snprintf(UChar *buffer, - int32_t count, - const char *locale, - const char *patternSpecification, - ... ) -{ - va_list ap; - int32_t written; - - va_start(ap, patternSpecification); - written = u_vsnprintf(buffer, count, locale, patternSpecification, ap); - va_end(ap); - - return written; -} - -U_CAPI int32_t U_EXPORT2 -u_snprintf_u(UChar *buffer, - int32_t count, - const char *locale, - const UChar *patternSpecification, - ... ) -{ - va_list ap; - int32_t written; - - va_start(ap, patternSpecification); - written = u_vsnprintf_u(buffer, count, locale, patternSpecification, ap); - va_end(ap); - - return written; -} - -U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ -u_vsnprintf(UChar *buffer, - int32_t count, - const char *locale, - const char *patternSpecification, - va_list ap) -{ - int32_t written; - UChar *pattern; - UChar patBuffer[UFMT_DEFAULT_BUFFER_SIZE]; - int32_t size = (int32_t)strlen(patternSpecification) + 1; - - /* convert from the default codepage to Unicode */ - if (size >= MAX_UCHAR_BUFFER_SIZE(patBuffer)) { - pattern = (UChar *)uprv_malloc(size * sizeof(UChar)); - if(pattern == 0) { - return 0; - } - } - else { - pattern = patBuffer; - } - ufmt_defaultCPToUnicode(patternSpecification, size, pattern, size); - - /* do the work */ - written = u_vsnprintf_u(buffer, count, locale, pattern, ap); - - /* clean up */ - if (pattern != patBuffer) { - uprv_free(pattern); - } - - return written; -} - -U_CAPI int32_t U_EXPORT2 -u_vsprintf_u(UChar *buffer, - const char *locale, - const UChar *patternSpecification, - va_list ap) -{ - return u_vsnprintf_u(buffer, INT32_MAX, locale, patternSpecification, ap); -} - - -static UChar * -u_strset(UChar *str, int32_t count, UChar c) { - int32_t idx; - for(idx = 0; idx < count; ++idx) { - str[idx] = c; - } - return str; -} - -/* copies the minimum number of code units of (count or output->available) */ -static int32_t -u_minstrncpy(u_localized_string *output, const UChar *str, int32_t count) { - int32_t size = ufmt_min(count, output->available); - - u_strncpy(output->str + (output->len - output->available), str, size); - output->available -= size; - return size; -} - -static int32_t -u_sprintf_pad_and_justify(u_localized_string *output, - const u_sprintf_spec_info *info, - const UChar *result, - int32_t resultLen) -{ - int32_t written = 0; - - resultLen = ufmt_min(resultLen, output->available); - - /* pad and justify, if needed */ - if(info->fWidth != -1 && resultLen < info->fWidth) { - int32_t paddingLeft = info->fWidth - resultLen; - int32_t outputPos = output->len - output->available; - - if (paddingLeft + resultLen > output->available) { - paddingLeft = output->available - resultLen; - if (paddingLeft < 0) { - paddingLeft = 0; - } - /* paddingLeft = output->available - resultLen;*/ - } - written += paddingLeft; - - /* left justify */ - if(info->fLeft) { - written += u_minstrncpy(output, result, resultLen); - u_strset(&output->str[outputPos + resultLen], paddingLeft, info->fPadChar); - output->available -= paddingLeft; - } - /* right justify */ - else { - u_strset(&output->str[outputPos], paddingLeft, info->fPadChar); - output->available -= paddingLeft; - written += u_minstrncpy(output, result, resultLen); - } - } - /* just write the formatted output */ - else { - written = u_minstrncpy(output, result, resultLen); - } - - return written; -} - -/* Sets the sign of a format based on u_sprintf_spec_info */ -/* TODO: Is setting the prefix symbol to a positive sign a good idea in all locales? */ -static void -u_sprintf_set_sign(UNumberFormat *format, - const u_sprintf_spec_info *info, - UErrorCode *status) -{ - if(info->fShowSign) { - if (info->fSpace) { - /* Setting UNUM_PLUS_SIGN_SYMBOL affects the exponent too. */ - /* unum_setSymbol(format, UNUM_PLUS_SIGN_SYMBOL, gSpaceStr, 1, &status); */ - unum_setTextAttribute(format, UNUM_POSITIVE_PREFIX, gSpaceStr, 1, status); - } - else { - UChar plusSymbol[USPRINTF_SYMBOL_BUFFER_SIZE]; - int32_t symbolLen; - - symbolLen = unum_getSymbol(format, - UNUM_PLUS_SIGN_SYMBOL, - plusSymbol, - sizeof(plusSymbol)/sizeof(*plusSymbol), - status); - unum_setTextAttribute(format, - UNUM_POSITIVE_PREFIX, - plusSymbol, - symbolLen, - status); - } - } -} - -/* handle a '%' */ - -int32_t -u_sprintf_simple_percent_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args) -{ - /* put a single '%' on the stream */ - if (output->available >= 1) { - output->str[output->len - output->available--] = 0x0025; - /* we wrote one character */ - return 1; - } - return 0; -} - -/* handle 's' */ - -int32_t -u_sprintf_string_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args) -{ - UChar *s; - UChar buffer[UFMT_DEFAULT_BUFFER_SIZE]; - int32_t len, written; - int32_t argSize; - const char *arg = (const char*)(args[0].ptrValue); - - /* convert from the default codepage to Unicode */ - if (arg) { - argSize = (int32_t)strlen(arg) + 1; - if (argSize >= MAX_UCHAR_BUFFER_SIZE(buffer)) { - s = ufmt_defaultCPToUnicode(arg, argSize, - (UChar *)uprv_malloc(MAX_UCHAR_BUFFER_NEEDED(argSize)), - MAX_UCHAR_BUFFER_NEEDED(argSize)); - if(s == NULL) { - return 0; - } - } - else { - s = ufmt_defaultCPToUnicode(arg, argSize, buffer, - sizeof(buffer)/sizeof(UChar)); - } - } - else { - s = (UChar *)gNullStr; - } - len = u_strlen(s); - - /* width = minimum # of characters to write */ - /* precision = maximum # of characters to write */ - - /* precision takes precedence over width */ - /* determine if the string should be truncated */ - if(info->fPrecision != -1 && len > info->fPrecision) { - written = u_minstrncpy(output, s, info->fPrecision); - } - /* determine if the string should be padded */ - else { - written = u_sprintf_pad_and_justify(output, info, s, len); - } - - /* clean up */ - if (gNullStr != s && buffer != s) { - uprv_free(s); - } - - return written; -} - -/* HSYS */ -int32_t -u_sprintf_integer_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args) -{ - long num = (long) (args[0].intValue); - UNumberFormat *format; - UChar result [USPRINTF_BUFFER_SIZE]; - int32_t minDigits = -1; - UErrorCode status = U_ZERO_ERROR; - - - /* mask off any necessary bits */ - if(info->fIsShort) - num &= UINT16_MAX; - else if(! info->fIsLong || ! info->fIsLongLong) - num &= UINT32_MAX; - - /* get the formatter */ - format = u_locbund_getNumberFormat(output->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* set the appropriate flags on the formatter */ - - /* set the minimum integer digits */ - if(info->fPrecision != -1) { - /* clone the stream's bundle if it isn't owned */ - if(! output->fOwnBundle) { - output->fBundle = u_locbund_clone(output->fBundle); - output->fOwnBundle = TRUE; - format = u_locbund_getNumberFormat(output->fBundle); - } - - /* set the minimum # of digits */ - minDigits = unum_getAttribute(format, UNUM_MIN_INTEGER_DIGITS); - unum_setAttribute(format, UNUM_MIN_INTEGER_DIGITS, info->fPrecision); - } - - /* set whether to show the sign */ - if(info->fShowSign) { - /* clone the stream's bundle if it isn't owned */ - if(! output->fOwnBundle) { - output->fBundle = u_locbund_clone(output->fBundle); - output->fOwnBundle = TRUE; - format = u_locbund_getNumberFormat(output->fBundle); - } - - u_sprintf_set_sign(format, info, &status); - } - - /* format the number */ - unum_format(format, num, result, USPRINTF_BUFFER_SIZE, 0, &status); - - /* restore the number format */ - if(minDigits != -1) { - unum_setAttribute(format, UNUM_MIN_INTEGER_DIGITS, minDigits); - } - - return u_sprintf_pad_and_justify(output, info, result, u_strlen(result)); -} - -int32_t -u_sprintf_hex_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args) -{ - long num = (long) (args[0].intValue); - UChar result [USPRINTF_BUFFER_SIZE]; - int32_t len = USPRINTF_BUFFER_SIZE; - - - /* mask off any necessary bits */ - if(info->fIsShort) - num &= UINT16_MAX; - else if(! info->fIsLong || ! info->fIsLongLong) - num &= UINT32_MAX; - - /* format the number, preserving the minimum # of digits */ - ufmt_ltou(result, &len, num, 16, - (UBool)(info->fSpec == 0x0078), - (info->fPrecision == -1 && info->fZero) ? info->fWidth : info->fPrecision); - - /* convert to alt form, if desired */ - if(num != 0 && info->fAlt && len < USPRINTF_BUFFER_SIZE - 2) { - /* shift the formatted string right by 2 chars */ - memmove(result + 2, result, len * sizeof(UChar)); - result[0] = 0x0030; - result[1] = info->fSpec; - len += 2; - } - - return u_sprintf_pad_and_justify(output, info, result, len); -} - -int32_t -u_sprintf_octal_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args) -{ - long num = (long) (args[0].intValue); - UChar result [USPRINTF_BUFFER_SIZE]; - int32_t len = USPRINTF_BUFFER_SIZE; - - - /* mask off any necessary bits */ - if(info->fIsShort) - num &= UINT16_MAX; - else if(! info->fIsLong || ! info->fIsLongLong) - num &= UINT32_MAX; - - /* format the number, preserving the minimum # of digits */ - ufmt_ltou(result, &len, num, 8, - FALSE, /* doesn't matter for octal */ - info->fPrecision == -1 && info->fZero ? info->fWidth : info->fPrecision); - - /* convert to alt form, if desired */ - if(info->fAlt && result[0] != 0x0030 && len < USPRINTF_BUFFER_SIZE - 1) { - /* shift the formatted string right by 1 char */ - memmove(result + 1, result, len * sizeof(UChar)); - result[0] = 0x0030; - len += 1; - } - - return u_sprintf_pad_and_justify(output, info, result, len); -} - - -int32_t -u_sprintf_uinteger_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args) -{ - u_sprintf_spec_info uint_info; - ufmt_args uint_args; - - memcpy(&uint_info, info, sizeof(u_sprintf_spec_info)); - memcpy(&uint_args, args, sizeof(ufmt_args)); - - uint_info.fPrecision = 0; - uint_info.fAlt = FALSE; - - /* Get around int32_t limitations */ - uint_args.doubleValue = ((double) ((uint32_t) (uint_args.intValue))); - - return u_sprintf_double_handler(output, &uint_info, &uint_args); -} - -int32_t -u_sprintf_double_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args) -{ - double num = (double) (args[0].doubleValue); - UNumberFormat *format; - UChar result [USPRINTF_BUFFER_SIZE]; - int32_t minDecimalDigits; - int32_t maxDecimalDigits; - UErrorCode status = U_ZERO_ERROR; - - /* mask off any necessary bits */ - /* if(! info->fIsLongDouble) - num &= DBL_MAX;*/ - - /* get the formatter */ - format = u_locbund_getNumberFormat(output->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* set the appropriate flags on the formatter */ - - /* clone the stream's bundle if it isn't owned */ - if(! output->fOwnBundle) { - output->fBundle = u_locbund_clone(output->fBundle); - output->fOwnBundle = TRUE; - format = u_locbund_getNumberFormat(output->fBundle); - } - - /* set the number of decimal digits */ - - /* save the formatter's state */ - minDecimalDigits = unum_getAttribute(format, UNUM_MIN_FRACTION_DIGITS); - maxDecimalDigits = unum_getAttribute(format, UNUM_MAX_FRACTION_DIGITS); - - if(info->fPrecision != -1) { - /* set the # of decimal digits */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, info->fPrecision); - } - else if(info->fPrecision == 0 && ! info->fAlt) { - /* no decimal point in this case */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 0); - } - else if(info->fAlt) { - /* '#' means always show decimal point */ - /* copy of printf behavior on Solaris - '#' shows 6 digits */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 6); - } - else { - /* # of decimal digits is 6 if precision not specified regardless of locale */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 6); - } - - /* set whether to show the sign */ - u_sprintf_set_sign(format, info, &status); - - /* format the number */ - unum_formatDouble(format, num, result, USPRINTF_BUFFER_SIZE, 0, &status); - - /* restore the number format */ - unum_setAttribute(format, UNUM_MIN_FRACTION_DIGITS, minDecimalDigits); - unum_setAttribute(format, UNUM_MAX_FRACTION_DIGITS, maxDecimalDigits); - - return u_sprintf_pad_and_justify(output, info, result, u_strlen(result)); -} - - -int32_t -u_sprintf_char_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args) -{ - UChar s[UTF_MAX_CHAR_LENGTH+1]; - int32_t len, written; - unsigned char arg = (unsigned char)(args[0].intValue); - - /* convert from default codepage to Unicode */ - ufmt_defaultCPToUnicode((const char *)&arg, 2, s, sizeof(s)/sizeof(UChar)); - - /* Remember that this may be a surrogate pair */ - len = u_strlen(s); - - /* width = minimum # of characters to write */ - /* precision = maximum # of characters to write */ - - /* precision takes precedence over width */ - /* determine if the string should be truncated */ - if(info->fPrecision != -1 && len > info->fPrecision) { - written = u_minstrncpy(output, s, info->fPrecision); - } - else { - /* determine if the string should be padded */ - written = u_sprintf_pad_and_justify(output, info, s, len); - } - - return written; -} - - -int32_t -u_sprintf_pointer_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args) -{ - long num = (long) (args[0].intValue); - UChar result [USPRINTF_BUFFER_SIZE]; - int32_t len = USPRINTF_BUFFER_SIZE; - - - /* format the pointer in hex */ - ufmt_ltou(result, &len, num, 16, TRUE, info->fPrecision); - - return u_sprintf_pad_and_justify(output, info, result, len); -} - -int32_t -u_sprintf_scientific_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args) -{ - double num = (double) (args[0].doubleValue); - UNumberFormat *format; - UChar result [USPRINTF_BUFFER_SIZE]; - int32_t minDecimalDigits; - int32_t maxDecimalDigits; - UErrorCode status = U_ZERO_ERROR; - UChar srcExpBuf[USPRINTF_SYMBOL_BUFFER_SIZE]; - int32_t srcLen, expLen; - UChar expBuf[USPRINTF_SYMBOL_BUFFER_SIZE]; - - - /* mask off any necessary bits */ - /* if(! info->fIsLongDouble) - num &= DBL_MAX;*/ - - /* get the formatter */ - format = u_locbund_getScientificFormat(output->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* set the appropriate flags on the formatter */ - - /* clone the stream's bundle if it isn't owned */ - if(! output->fOwnBundle) { - output->fBundle = u_locbund_clone(output->fBundle); - output->fOwnBundle = TRUE; - format = u_locbund_getScientificFormat(output->fBundle); - } - - srcLen = unum_getSymbol(format, - UNUM_EXPONENTIAL_SYMBOL, - srcExpBuf, - sizeof(srcExpBuf), - &status); - - /* Upper/lower case the e */ - if (info->fSpec == (UChar)0x65 /* e */) { - expLen = u_strToLower(expBuf, (int32_t)sizeof(expBuf), - srcExpBuf, srcLen, - output->fBundle->fLocale, - &status); - } - else { - expLen = u_strToUpper(expBuf, (int32_t)sizeof(expBuf), - srcExpBuf, srcLen, - output->fBundle->fLocale, - &status); - } - - unum_setSymbol(format, - UNUM_EXPONENTIAL_SYMBOL, - expBuf, - expLen, - &status); - - /* set the number of decimal digits */ - - /* save the formatter's state */ - minDecimalDigits = unum_getAttribute(format, UNUM_MIN_FRACTION_DIGITS); - maxDecimalDigits = unum_getAttribute(format, UNUM_MAX_FRACTION_DIGITS); - - if(info->fPrecision != -1) { - /* set the # of decimal digits */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, info->fPrecision); - } - else if(info->fPrecision == 0 && ! info->fAlt) { - /* no decimal point in this case */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 0); - } - else if(info->fAlt) { - /* '#' means always show decimal point */ - /* copy of printf behavior on Solaris - '#' shows 6 digits */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 6); - } - else { - /* # of decimal digits is 6 if precision not specified */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 6); - } - - /* set whether to show the sign */ - u_sprintf_set_sign(format, info, &status); - - /* format the number */ - unum_formatDouble(format, num, result, USPRINTF_BUFFER_SIZE, 0, &status); - - /* restore the number format */ - unum_setAttribute(format, UNUM_MIN_FRACTION_DIGITS, minDecimalDigits); - unum_setAttribute(format, UNUM_MAX_FRACTION_DIGITS, maxDecimalDigits); - - /* Since we clone the fBundle and we're only using the scientific - format, we don't need to save the old exponent value. */ - /*unum_setSymbol(format, - UNUM_EXPONENTIAL_SYMBOL, - srcExpBuf, - srcLen, - &status);*/ - - return u_sprintf_pad_and_justify(output, info, result, u_strlen(result)); -} - -int32_t -u_sprintf_date_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args) -{ - UDate num = (UDate) (args[0].dateValue); - UDateFormat *format; - UChar result [USPRINTF_BUFFER_SIZE]; - UErrorCode status = U_ZERO_ERROR; - - - /* get the formatter */ - format = u_locbund_getDateFormat(output->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* format the date */ - udat_format(format, num, result, USPRINTF_BUFFER_SIZE, 0, &status); - - return u_sprintf_pad_and_justify(output, info, result, u_strlen(result)); -} - -int32_t -u_sprintf_time_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args) -{ - UDate num = (UDate) (args[0].dateValue); - UDateFormat *format; - UChar result [USPRINTF_BUFFER_SIZE]; - UErrorCode status = U_ZERO_ERROR; - - - /* get the formatter */ - format = u_locbund_getTimeFormat(output->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* format the time */ - udat_format(format, num, result, USPRINTF_BUFFER_SIZE, 0, &status); - - return u_sprintf_pad_and_justify(output, info, result, u_strlen(result)); -} - - -int32_t -u_sprintf_percent_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args) -{ - double num = (double) (args[0].doubleValue); - UNumberFormat *format; - UChar result [USPRINTF_BUFFER_SIZE]; - int32_t minDecimalDigits; - int32_t maxDecimalDigits; - UErrorCode status = U_ZERO_ERROR; - - - /* mask off any necessary bits */ - /* if(! info->fIsLongDouble) - num &= DBL_MAX;*/ - - /* get the formatter */ - format = u_locbund_getPercentFormat(output->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* set the appropriate flags on the formatter */ - - /* clone the stream's bundle if it isn't owned */ - if(! output->fOwnBundle) { - output->fBundle = u_locbund_clone(output->fBundle); - output->fOwnBundle = TRUE; - format = u_locbund_getPercentFormat(output->fBundle); - } - - /* set the number of decimal digits */ - - /* save the formatter's state */ - minDecimalDigits = unum_getAttribute(format, UNUM_MIN_FRACTION_DIGITS); - maxDecimalDigits = unum_getAttribute(format, UNUM_MAX_FRACTION_DIGITS); - - if(info->fPrecision != -1) { - /* set the # of decimal digits */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, info->fPrecision); - } - else if(info->fPrecision == 0 && ! info->fAlt) { - /* no decimal point in this case */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 0); - } - else if(info->fAlt) { - /* '#' means always show decimal point */ - /* copy of printf behavior on Solaris - '#' shows 6 digits */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 6); - } - else { - /* # of decimal digits is 6 if precision not specified */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 6); - } - - /* set whether to show the sign */ - u_sprintf_set_sign(format, info, &status); - - /* format the number */ - unum_formatDouble(format, num, result, USPRINTF_BUFFER_SIZE, 0, &status); - - /* restore the number format */ - unum_setAttribute(format, UNUM_MIN_FRACTION_DIGITS, minDecimalDigits); - unum_setAttribute(format, UNUM_MAX_FRACTION_DIGITS, maxDecimalDigits); - - return u_sprintf_pad_and_justify(output, info, result, u_strlen(result)); -} - - -int32_t -u_sprintf_currency_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args) -{ - double num = (double) (args[0].doubleValue); - UNumberFormat *format; - UChar result [USPRINTF_BUFFER_SIZE]; - int32_t minDecimalDigits; - int32_t maxDecimalDigits; - UErrorCode status = U_ZERO_ERROR; - - - /* mask off any necessary bits */ - /* if(! info->fIsLongDouble) - num &= DBL_MAX;*/ - - /* get the formatter */ - format = u_locbund_getCurrencyFormat(output->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* set the appropriate flags on the formatter */ - - /* clone the stream's bundle if it isn't owned */ - if(! output->fOwnBundle) { - output->fBundle = u_locbund_clone(output->fBundle); - output->fOwnBundle = TRUE; - format = u_locbund_getCurrencyFormat(output->fBundle); - } - - /* set the number of decimal digits */ - - /* save the formatter's state */ - minDecimalDigits = unum_getAttribute(format, UNUM_MIN_FRACTION_DIGITS); - maxDecimalDigits = unum_getAttribute(format, UNUM_MAX_FRACTION_DIGITS); - - if(info->fPrecision != -1) { - /* set the # of decimal digits */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, info->fPrecision); - } - else if(info->fPrecision == 0 && ! info->fAlt) { - /* no decimal point in this case */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 0); - } - else if(info->fAlt) { - /* '#' means always show decimal point */ - /* copy of printf behavior on Solaris - '#' shows 6 digits */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 2); - } - else { - /* # of decimal digits is 2 if precision not specified, 2 is typical */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 2); - } - - /* set whether to show the sign */ - u_sprintf_set_sign(format, info, &status); - - /* format the number */ - unum_formatDouble(format, num, result, USPRINTF_BUFFER_SIZE, 0, &status); - - /* restore the number format */ - unum_setAttribute(format, UNUM_MIN_FRACTION_DIGITS, minDecimalDigits); - unum_setAttribute(format, UNUM_MAX_FRACTION_DIGITS, maxDecimalDigits); - - return u_sprintf_pad_and_justify(output, info, result, u_strlen(result)); -} - -int32_t -u_sprintf_ustring_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args) -{ - int32_t len, written; - const UChar *arg = (const UChar*)(args[0].ptrValue); - - /* allocate enough space for the buffer */ - if (!arg) { - arg = gNullStr; - } - len = u_strlen(arg); - - /* width = minimum # of characters to write */ - /* precision = maximum # of characters to write */ - - /* precision takes precedence over width */ - /* determine if the string should be truncated */ - if(info->fPrecision != -1 && len > info->fPrecision) { - written = u_minstrncpy(output, arg, info->fPrecision); - } - else { - /* determine if the string should be padded */ - written = u_sprintf_pad_and_justify(output, info, arg, len); - } - - return written; -} - - - -int32_t -u_sprintf_uchar_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args) -{ - int32_t written = 0; - UChar arg = (UChar)(args[0].intValue); - - - /* width = minimum # of characters to write */ - /* precision = maximum # of characters to write */ - - /* precision takes precedence over width */ - /* determine if the char should be printed */ - if(info->fPrecision != -1 && info->fPrecision < 1) { - /* write nothing */ - written = 0; - } - else { - /* determine if the string should be padded */ - written = u_sprintf_pad_and_justify(output, info, &arg, 1); - } - - return written; -} - -int32_t -u_sprintf_scidbl_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args) -{ - u_sprintf_spec_info scidbl_info; - double num = args[0].doubleValue; - - memcpy(&scidbl_info, info, sizeof(u_sprintf_spec_info)); - - /* determine whether to use 'd', 'e' or 'f' notation */ - if (scidbl_info.fPrecision == -1 && num == uprv_trunc(num)) - { - /* use 'f' notation */ - scidbl_info.fSpec = 0x0066; - scidbl_info.fPrecision = 0; - /* call the double handler */ - return u_sprintf_double_handler(output, &scidbl_info, args); - } - else if(num < 0.0001 || (scidbl_info.fPrecision < 1 && 1000000.0 <= num) - || (scidbl_info.fPrecision != -1 && num > uprv_pow10(scidbl_info.fPrecision))) - { - /* use 'e' or 'E' notation */ - scidbl_info.fSpec = scidbl_info.fSpec - 2; - /* call the scientific handler */ - return u_sprintf_scientific_handler(output, &scidbl_info, args); - } - else { - /* use 'f' notation */ - scidbl_info.fSpec = 0x0066; - /* call the double handler */ - return u_sprintf_double_handler(output, &scidbl_info, args); - } -} - - -int32_t -u_sprintf_count_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args) -{ - int *count = (int*)(args[0].ptrValue); - - /* in the special case of count, the u_printf_spec_info's width */ - /* will contain the # of chars written thus far */ - *count = info->fWidth; - - return 0; -} - - -int32_t -u_sprintf_spellout_handler(u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args) -{ - double num = (double) (args[0].doubleValue); - UNumberFormat *format; - UChar result [USPRINTF_BUFFER_SIZE]; - int32_t minDecimalDigits; - int32_t maxDecimalDigits; - UErrorCode status = U_ZERO_ERROR; - - - /* mask off any necessary bits */ - /* if(! info->fIsLongDouble) - num &= DBL_MAX;*/ - - /* get the formatter */ - format = u_locbund_getSpelloutFormat(output->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* set the appropriate flags on the formatter */ - - /* clone the stream's bundle if it isn't owned */ - if(! output->fOwnBundle) { - output->fBundle = u_locbund_clone(output->fBundle); - output->fOwnBundle = TRUE; - format = u_locbund_getSpelloutFormat(output->fBundle); - } - - /* set the number of decimal digits */ - - /* save the formatter's state */ - minDecimalDigits = unum_getAttribute(format, UNUM_MIN_FRACTION_DIGITS); - maxDecimalDigits = unum_getAttribute(format, UNUM_MAX_FRACTION_DIGITS); - - if(info->fPrecision != -1) { - /* set the # of decimal digits */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, info->fPrecision); - } - else if(info->fPrecision == 0 && ! info->fAlt) { - /* no decimal point in this case */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 0); - } - else if(info->fAlt) { - /* '#' means always show decimal point */ - /* copy of printf behavior on Solaris - '#' shows 6 digits */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 6); - } - else { - /* # of decimal digits is 6 if precision not specified */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 6); - } - - /* set whether to show the sign */ - u_sprintf_set_sign(format, info, &status); - - /* format the number */ - unum_formatDouble(format, num, result, USPRINTF_BUFFER_SIZE, 0, &status); - - /* restore the number format */ - unum_setAttribute(format, UNUM_MIN_FRACTION_DIGITS, minDecimalDigits); - unum_setAttribute(format, UNUM_MAX_FRACTION_DIGITS, maxDecimalDigits); - - return u_sprintf_pad_and_justify(output, info, result, u_strlen(result)); -} - -#define UP_PERCENT 0x0025 - -U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ -u_vsnprintf_u(UChar *buffer, - int32_t count, - const char *locale, - const UChar *patternSpecification, - va_list ap) -{ - const UChar *alias = patternSpecification; - const UChar *lastAlias; - int32_t patCount; - int32_t written = 0; - uint16_t handlerNum; - - ufmt_args args; - u_localized_string outStr; - u_sprintf_spec spec; - ufmt_type_info info; - u_sprintf_handler handler; - - if (count < 0) { - count = INT32_MAX; - } - - outStr.str = buffer; - outStr.len = count; - outStr.available = count; - - /* if locale is 0, use the default */ - if(locale == 0) { - locale = uloc_getDefault(); - } - outStr.fBundle = u_loccache_get(locale); - - if(outStr.fBundle == 0) { - return 0; - } - outStr.fOwnBundle = FALSE; - - /* iterate through the pattern */ - while(outStr.available > 0) { - - /* find the next '%' */ - lastAlias = alias; - while(*alias != UP_PERCENT && *alias != 0x0000) { - alias++; - } - - /* write any characters before the '%' */ - if(alias > lastAlias) { - written += u_minstrncpy(&outStr, lastAlias, (int32_t)(alias - lastAlias)); - } - - /* break if at end of string */ - if(*alias == 0x0000) { - break; - } - - /* parse the specifier */ - patCount = u_sprintf_parse_spec(alias, &spec); - - /* fill in the precision and width, if specified out of line */ - - /* width specified out of line */ - if(spec.fInfo.fWidth == -2) { - if(spec.fWidthPos == -1) { - /* read the width from the argument list */ - spec.fInfo.fWidth = va_arg(ap, int); - } - else { - /* handle positional parameter */ - } - - /* if it's negative, take the absolute value and set left alignment */ - if(spec.fInfo.fWidth < 0) { - spec.fInfo.fWidth *= -1; - spec.fInfo.fLeft = TRUE; - } - } - - /* precision specified out of line */ - if(spec.fInfo.fPrecision == -2) { - if(spec.fPrecisionPos == -1) { - /* read the precision from the argument list */ - spec.fInfo.fPrecision = va_arg(ap, int); - } - else { - /* handle positional parameter */ - } - - /* if it's negative, set it to zero */ - if(spec.fInfo.fPrecision < 0) - spec.fInfo.fPrecision = 0; - } - - handlerNum = (uint16_t)(spec.fInfo.fSpec - USPRINTF_BASE_FMT_HANDLERS); - if (handlerNum < USPRINTF_NUM_FMT_HANDLERS) { - /* query the info function for argument information */ - info = g_u_sprintf_infos[ handlerNum ].info; - if(info > ufmt_simple_percent) { - switch(info) { - case ufmt_count: - /* set the spec's width to the # of chars written */ - spec.fInfo.fWidth = written; - case ufmt_char: - case ufmt_uchar: - case ufmt_int: - args.intValue = va_arg(ap, int); - break; - case ufmt_wchar: - args.wcharValue = va_arg(ap, wchar_t); - break; - case ufmt_string: - args.ptrValue = va_arg(ap, char*); - break; - case ufmt_wstring: - args.ptrValue = va_arg(ap, wchar_t*); - break; - case ufmt_ustring: - args.ptrValue = va_arg(ap, UChar*); - break; - case ufmt_pointer: - args.ptrValue = va_arg(ap, void*); - break; - case ufmt_float: - args.floatValue = (float) va_arg(ap, double); - break; - case ufmt_double: - args.doubleValue = va_arg(ap, double); - break; - case ufmt_date: - args.dateValue = va_arg(ap, UDate); - break; - default: - break; /* Should never get here */ - } - } - - /* call the handler function */ - handler = g_u_sprintf_infos[ handlerNum ].handler; - if(handler != 0) { - written += (*handler)(&outStr, &spec.fInfo, &args); - } - else { - /* just echo unknown tags */ - written += u_minstrncpy(&outStr, lastAlias, (int32_t)(alias - lastAlias)); - } - } - else { - /* just echo unknown tags */ - written += u_minstrncpy(&outStr, lastAlias, (int32_t)(alias - lastAlias)); - } - - /* update the pointer in pattern and continue */ - alias += patCount; - } - - /* Terminate the buffer, if there's room. */ - if (outStr.available > 0) { - buffer[outStr.len - outStr.available] = 0x0000; - } - - /* Release the cloned bundle, if we cloned it. */ - if(outStr.fOwnBundle) { - u_locbund_delete(outStr.fBundle); - outStr.fBundle = NULL; - outStr.fOwnBundle = FALSE; - } - - /* return # of UChars written */ - return written; -} - -#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/extra/ustdio/sprintf.h b/icuSources/extra/ustdio/sprintf.h deleted file mode 100644 index dabbbb5f..00000000 --- a/icuSources/extra/ustdio/sprintf.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -****************************************************************************** -* -* Copyright (C) 2000-2001, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* -* File sprintf.h -* -* Modification History: -* -* Date Name Description -* 02/08/00 george Creation. Copied from uprintf.h -****************************************************************************** -*/ - -#ifndef USPRINTF_H -#define USPRINTF_H - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_FORMATTING - -#include "unicode/ustdio.h" -#include "ufmt_cmn.h" -#include "locbund.h" - -/** - * Struct encapsulating a single uprintf format specification. - */ -struct u_sprintf_spec_info { - UChar fSpec; /* Conversion specification */ - - int32_t fPrecision; /* Precision */ - int32_t fWidth; /* Width */ - - UChar fPadChar; /* Padding character */ - - UBool fAlt; /* # flag */ - UBool fSpace; /* Space flag */ - UBool fLeft; /* - flag */ - UBool fShowSign; /* + flag */ - UBool fZero; /* 0 flag */ - - UBool fIsLongDouble; /* L flag */ - UBool fIsShort; /* h flag */ - UBool fIsLong; /* l flag */ - UBool fIsLongLong; /* ll flag */ -}; -typedef struct u_sprintf_spec_info u_sprintf_spec_info; - -struct u_localized_string { - UChar *str; /* Place to write the string */ - int32_t available;/* Number of codeunits available to write to */ - int32_t len; /* Maximum number of code units that can be written to output */ - - ULocaleBundle *fBundle; /* formatters */ - UBool fOwnBundle; /* TRUE if fBundle should be deleted */ -}; -typedef struct u_localized_string u_localized_string; - -/** - * A u_printf handler function. - * A u_printf handler is responsible for handling a single u_printf - * format specification, for example 'd' or 's'. - * @param info A pointer to a u_printf_spec_info struct containing - * information on the format specification. - * @param args A pointer to the argument data - * @return The number of Unicode characters written to stream. - */ -typedef int32_t (*u_sprintf_handler) (u_localized_string *output, - const u_sprintf_spec_info *info, - const ufmt_args *args); - -#endif /* #if !UCONFIG_NO_FORMATTING */ - -#endif diff --git a/icuSources/extra/ustdio/sprntf_p.c b/icuSources/extra/ustdio/sprntf_p.c deleted file mode 100644 index 74503166..00000000 --- a/icuSources/extra/ustdio/sprntf_p.c +++ /dev/null @@ -1,307 +0,0 @@ -/* -****************************************************************************** -* -* Copyright (C) 2000-2001, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* -* File sprntf_p.c -* -* Modification History: -* -* Date Name Description -* 02/08/00 george Creation. Copied from uprntf_p.c -****************************************************************************** -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_FORMATTING - -#include "sprntf_p.h" -#include "ufmt_cmn.h" - -/* flag characters for uprintf */ -#define FLAG_MINUS 0x002D -#define FLAG_PLUS 0x002B -#define FLAG_SPACE 0x0020 -#define FLAG_POUND 0x0023 -#define FLAG_ZERO 0x0030 -#define FLAG_PAREN 0x0028 - -#define ISFLAG(s) (s) == FLAG_MINUS || \ - (s) == FLAG_PLUS || \ - (s) == FLAG_SPACE || \ - (s) == FLAG_POUND || \ - (s) == FLAG_ZERO || \ - (s) == FLAG_PAREN - -/* special characters for uprintf */ -#define SPEC_ASTERISK 0x002A -#define SPEC_DOLLARSIGN 0x0024 -#define SPEC_PERIOD 0x002E -#define SPEC_PERCENT 0x0025 - -/* unicode digits */ -#define DIGIT_ZERO 0x0030 -#define DIGIT_ONE 0x0031 -#define DIGIT_TWO 0x0032 -#define DIGIT_THREE 0x0033 -#define DIGIT_FOUR 0x0034 -#define DIGIT_FIVE 0x0035 -#define DIGIT_SIX 0x0036 -#define DIGIT_SEVEN 0x0037 -#define DIGIT_EIGHT 0x0038 -#define DIGIT_NINE 0x0039 - -#define ISDIGIT(s) (s) == DIGIT_ZERO || \ - (s) == DIGIT_ONE || \ - (s) == DIGIT_TWO || \ - (s) == DIGIT_THREE || \ - (s) == DIGIT_FOUR || \ - (s) == DIGIT_FIVE || \ - (s) == DIGIT_SIX || \ - (s) == DIGIT_SEVEN || \ - (s) == DIGIT_EIGHT || \ - (s) == DIGIT_NINE - -/* u_printf modifiers */ -#define MOD_H 0x0068 -#define MOD_LOWERL 0x006C -#define MOD_L 0x004C - -#define ISMOD(s) (s) == MOD_H || \ - (s) == MOD_LOWERL || \ - (s) == MOD_L - -/* We parse the argument list in Unicode */ -int32_t -u_sprintf_parse_spec (const UChar *fmt, - u_sprintf_spec *spec) -{ - const UChar *s = fmt; - const UChar *backup; - u_sprintf_spec_info *info = &(spec->fInfo); - - /* initialize spec to default values */ - spec->fWidthPos = -1; - spec->fPrecisionPos = -1; - spec->fArgPos = -1; - - info->fPrecision = -1; - info->fWidth = -1; - info->fSpec = 0x0000; - info->fPadChar = 0x0020; - info->fAlt = FALSE; - info->fSpace = FALSE; - info->fLeft = FALSE; - info->fShowSign = FALSE; - info->fZero = FALSE; - info->fIsLongDouble = FALSE; - info->fIsShort = FALSE; - info->fIsLong = FALSE; - info->fIsLongLong = FALSE; - - /* skip over the initial '%' */ - s++; - - /* Check for positional argument */ - if(ISDIGIT(*s)) { - - /* Save the current position */ - backup = s; - - /* handle positional parameters */ - if(ISDIGIT(*s)) { - spec->fArgPos = (int) (*s++ - DIGIT_ZERO); - - while(ISDIGIT(*s)) { - spec->fArgPos *= 10; - spec->fArgPos += (int) (*s++ - DIGIT_ZERO); - } - } - - /* if there is no '$', don't read anything */ - if(*s != SPEC_DOLLARSIGN) { - spec->fArgPos = -1; - s = backup; - } - /* munge the '$' */ - else - s++; - } - - /* Get any format flags */ - while(ISFLAG(*s)) { - switch(*s++) { - - /* left justify */ - case FLAG_MINUS: - info->fLeft = TRUE; - break; - - /* always show sign */ - case FLAG_PLUS: - info->fShowSign = TRUE; - break; - - /* use space if no sign present */ - case FLAG_SPACE: - info->fShowSign = TRUE; - info->fSpace = TRUE; - break; - - /* use alternate form */ - case FLAG_POUND: - info->fAlt = TRUE; - break; - - /* pad with leading zeroes */ - case FLAG_ZERO: - info->fZero = TRUE; - info->fPadChar = 0x0030; - break; - - /* pad character specified */ - case FLAG_PAREN: - - /* first four characters are hex values for pad char */ - info->fPadChar = (UChar)ufmt_digitvalue(*s++); - info->fPadChar = (UChar)((info->fPadChar * 16) + ufmt_digitvalue(*s++)); - info->fPadChar = (UChar)((info->fPadChar * 16) + ufmt_digitvalue(*s++)); - info->fPadChar = (UChar)((info->fPadChar * 16) + ufmt_digitvalue(*s++)); - - /* final character is ignored */ - s++; - - break; - } - } - - /* Get the width */ - - /* width is specified out of line */ - if(*s == SPEC_ASTERISK) { - - info->fWidth = -2; - - /* Skip the '*' */ - s++; - - /* Save the current position */ - backup = s; - - /* handle positional parameters */ - if(ISDIGIT(*s)) { - spec->fWidthPos = (int) (*s++ - DIGIT_ZERO); - - while(ISDIGIT(*s)) { - spec->fWidthPos *= 10; - spec->fWidthPos += (int) (*s++ - DIGIT_ZERO); - } - } - - /* if there is no '$', don't read anything */ - if(*s != SPEC_DOLLARSIGN) { - spec->fWidthPos = -1; - s = backup; - } - /* munge the '$' */ - else - s++; - } - /* read the width, if present */ - else if(ISDIGIT(*s)){ - info->fWidth = (int) (*s++ - DIGIT_ZERO); - - while(ISDIGIT(*s)) { - info->fWidth *= 10; - info->fWidth += (int) (*s++ - DIGIT_ZERO); - } - } - - /* Get the precision */ - - if(*s == SPEC_PERIOD) { - - /* eat up the '.' */ - s++; - - /* precision is specified out of line */ - if(*s == SPEC_ASTERISK) { - - info->fPrecision = -2; - - /* Skip the '*' */ - s++; - - /* save the current position */ - backup = s; - - /* handle positional parameters */ - if(ISDIGIT(*s)) { - spec->fPrecisionPos = (int) (*s++ - DIGIT_ZERO); - - while(ISDIGIT(*s)) { - spec->fPrecisionPos *= 10; - spec->fPrecisionPos += (int) (*s++ - DIGIT_ZERO); - } - - /* if there is no '$', don't read anything */ - if(*s != SPEC_DOLLARSIGN) { - spec->fPrecisionPos = -1; - s = backup; - } - else { - /* munge the '$' */ - s++; - } - } - } - /* read the precision */ - else if(ISDIGIT(*s)){ - info->fPrecision = (int) (*s++ - DIGIT_ZERO); - - while(ISDIGIT(*s)) { - info->fPrecision *= 10; - info->fPrecision += (int) (*s++ - DIGIT_ZERO); - } - } - } - - /* Get any modifiers */ - if(ISMOD(*s)) { - switch(*s++) { - - /* short */ - case MOD_H: - info->fIsShort = TRUE; - break; - - /* long or long long */ - case MOD_LOWERL: - if(*s == MOD_LOWERL) { - info->fIsLongLong = TRUE; - /* skip over the next 'l' */ - s++; - } - else - info->fIsLong = TRUE; - break; - - /* long double */ - case MOD_L: - info->fIsLongDouble = TRUE; - break; - } - } - - /* finally, get the specifier letter */ - info->fSpec = *s++; - - /* return # of characters in this specifier */ - return (int32_t)(s - fmt); -} - -#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/extra/ustdio/sprntf_p.h b/icuSources/extra/ustdio/sprntf_p.h deleted file mode 100644 index 584af8de..00000000 --- a/icuSources/extra/ustdio/sprntf_p.h +++ /dev/null @@ -1,51 +0,0 @@ -/* -****************************************************************************** -* -* Copyright (C) 2000-2001, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* -* File sprntf_p.h -* -* Modification History: -* -* Date Name Description -* 02/08/00 george Creation. Copied from uprntf_p.h -****************************************************************************** -*/ - -#ifndef USPRINTF_P_H -#define USPRINTF_P_H - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_FORMATTING - -#include "sprintf.h" - -/** - * Struct encapsulating a single uprintf format specification. - */ -struct u_sprintf_spec { - u_sprintf_spec_info fInfo; /* Information on this spec */ - int32_t fWidthPos; /* Position of width in arg list */ - int32_t fPrecisionPos; /* Position of precision in arg list */ - int32_t fArgPos; /* Position of data in arg list */ -}; -typedef struct u_sprintf_spec u_sprintf_spec; - -/** - * Parse a single u_printf format specifier. - * @param fmt A pointer to a '%' character in a u_printf format specification. - * @param spec A pointer to a u_printf_spec to receive the parsed - * format specifier. - * @return The number of characters contained in this specifier. - */ -int32_t -u_sprintf_parse_spec (const UChar *fmt, - u_sprintf_spec *spec); - -#endif /* #if !UCONFIG_NO_FORMATTING */ - -#endif diff --git a/icuSources/extra/ustdio/sscanf.c b/icuSources/extra/ustdio/sscanf.c deleted file mode 100644 index 7384accf..00000000 --- a/icuSources/extra/ustdio/sscanf.c +++ /dev/null @@ -1,1335 +0,0 @@ -/* -****************************************************************************** -* -* Copyright (C) 2000-2003, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* -* File sscanf.c -* -* Modification History: -* -* Date Name Description -* 02/08/00 george Creation. Copied from uscanf.c -****************************************************************************** -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_FORMATTING - -#include "unicode/uchar.h" - -#include "sscanf.h" -#include "sscanf_p.h" -#include "uscanset.h" -#include "unicode/ustdio.h" -#include "unicode/ustring.h" -#include "locbund.h" -#include "loccache.h" -#include "unicode/unum.h" -#include "unicode/udat.h" -#include "unicode/uloc.h" - -#include "cmemory.h" -#include "ustr_imp.h" - -/* --- Prototypes ---------------------------- */ - -int32_t -u_sscanf_simple_percent_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_sscanf_ustring_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_sscanf_count_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_sscanf_integer_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_sscanf_uinteger_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_sscanf_double_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_sscanf_scientific_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_sscanf_scidbl_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_sscanf_currency_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_sscanf_percent_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_sscanf_date_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_sscanf_time_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_sscanf_char_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_sscanf_uchar_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_sscanf_spellout_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_sscanf_hex_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_sscanf_octal_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_sscanf_pointer_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_sscanf_string_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_sscanf_scanset_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -/* ANSI style formatting */ -/* Use US-ASCII characters only for formatting */ - -/* % */ -#define UFMT_SIMPLE_PERCENT {ufmt_simple_percent, u_sscanf_simple_percent_handler} -/* s */ -#define UFMT_STRING {ufmt_string, u_sscanf_string_handler} -/* c */ -#define UFMT_CHAR {ufmt_string, u_sscanf_char_handler} -/* d, i */ -#define UFMT_INT {ufmt_int, u_sscanf_integer_handler} -/* u */ -#define UFMT_UINT {ufmt_int, u_sscanf_uinteger_handler} -/* o */ -#define UFMT_OCTAL {ufmt_int, u_sscanf_octal_handler} -/* x, X */ -#define UFMT_HEX {ufmt_int, u_sscanf_hex_handler} -/* f */ -#define UFMT_DOUBLE {ufmt_double, u_sscanf_double_handler} -/* e, E */ -#define UFMT_SCIENTIFIC {ufmt_double, u_sscanf_scientific_handler} -/* g, G */ -#define UFMT_SCIDBL {ufmt_double, u_sscanf_scidbl_handler} -/* n */ -#define UFMT_COUNT {ufmt_count, u_sscanf_count_handler} -/* [ */ -#define UFMT_SCANSET {ufmt_string, u_sscanf_scanset_handler} /* TODO: Is this also suppose to be ufmt_ustring */ - -/* non-ANSI extensions */ -/* Use US-ASCII characters only for formatting */ - -/* p */ -#define UFMT_POINTER {ufmt_pointer, u_sscanf_pointer_handler} -/* D */ -#define UFMT_DATE {ufmt_date, u_sscanf_date_handler} -/* T */ -#define UFMT_TIME {ufmt_date, u_sscanf_time_handler} -/* V */ -#define UFMT_SPELLOUT {ufmt_double, u_sscanf_spellout_handler} -/* P */ -#define UFMT_PERCENT {ufmt_double, u_sscanf_percent_handler} -/* M */ -#define UFMT_CURRENCY {ufmt_double, u_sscanf_currency_handler} -/* K */ -#define UFMT_UCHAR {ufmt_uchar, u_sscanf_uchar_handler} -/* U */ -#define UFMT_USTRING {ufmt_ustring, u_sscanf_ustring_handler} - - -#define UFMT_EMPTY {ufmt_empty, NULL} - -struct u_sscanf_info { - enum ufmt_type_info info; - u_sscanf_handler handler; -}; -typedef struct u_sscanf_info u_sscanf_info; - -/* Use US-ASCII characters only for formatting. Most codepages have - characters 20-7F from Unicode. Using any other codepage specific - characters will make it very difficult to format the string on - non-Unicode machines */ -static const u_sscanf_info g_u_sscanf_infos[108] = { -/* 0x20 */ - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_SIMPLE_PERCENT,UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - -/* 0x30 */ - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - -/* 0x40 */ - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_DATE, UFMT_SCIENTIFIC, UFMT_EMPTY, UFMT_SCIDBL, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_UCHAR, - UFMT_EMPTY, UFMT_CURRENCY, UFMT_EMPTY, UFMT_EMPTY, - -/* 0x50 */ - UFMT_PERCENT, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_TIME, UFMT_USTRING, UFMT_SPELLOUT, UFMT_EMPTY, - UFMT_HEX, UFMT_EMPTY, UFMT_EMPTY, UFMT_SCANSET, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - -/* 0x60 */ - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_CHAR, - UFMT_INT, UFMT_SCIENTIFIC, UFMT_DOUBLE, UFMT_SCIDBL, - UFMT_EMPTY, UFMT_INT, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_COUNT, UFMT_OCTAL, - -/* 0x70 */ - UFMT_POINTER, UFMT_EMPTY, UFMT_EMPTY, UFMT_STRING, - UFMT_EMPTY, UFMT_UINT, UFMT_EMPTY, UFMT_EMPTY, - UFMT_HEX, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, -}; - -#define USCANF_NUM_FMT_HANDLERS sizeof(g_u_sscanf_infos) - -/* We do not use handlers for 0-0x1f */ -#define USCANF_BASE_FMT_HANDLERS 0x20 - -int32_t -u_sscanf(const UChar *buffer, - const char *locale, - const char *patternSpecification, - ... ) -{ - va_list ap; - int32_t converted; - - va_start(ap, patternSpecification); - converted = u_vsscanf(buffer, locale, patternSpecification, ap); - va_end(ap); - - return converted; -} - -int32_t -u_sscanf_u(const UChar *buffer, - const char *locale, - const UChar *patternSpecification, - ... ) -{ - va_list ap; - int32_t converted; - - va_start(ap, patternSpecification); - converted = u_vsscanf_u(buffer, locale, patternSpecification, ap); - va_end(ap); - - return converted; -} - -U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ -u_vsscanf(const UChar *buffer, - const char *locale, - const char *patternSpecification, - va_list ap) -{ - int32_t converted; - UChar *pattern; - UChar patBuffer[UFMT_DEFAULT_BUFFER_SIZE]; - int32_t size = (int32_t)strlen(patternSpecification) + 1; - - /* convert from the default codepage to Unicode */ - if (size >= MAX_UCHAR_BUFFER_SIZE(patBuffer)) { - pattern = (UChar *)uprv_malloc(size * sizeof(UChar)); - if(pattern == 0) { - return 0; - } - } - else { - pattern = patBuffer; - } - ufmt_defaultCPToUnicode(patternSpecification, size, pattern, size); - - /* do the work */ - converted = u_vsscanf_u(buffer, locale, pattern, ap); - - /* clean up */ - if (pattern != patBuffer) { - uprv_free(pattern); - } - - return converted; -} - -static int32_t -u_sscanf_skip_leading_ws(u_localized_string *input, - UChar pad) -{ - UChar c; - int32_t count = input->pos; - int32_t skipped; - - /* skip all leading ws in the stream */ - while( ((c = input->str[count]) != U_EOF) && (c == pad || u_isWhitespace(c)) ) - count++; - - if(c == U_EOF) - count++; - - skipped = count - input->pos; - input->pos = count; - return skipped; -} - -int32_t -u_sscanf_simple_percent_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - /* make sure the next character in the stream is a percent */ - if(input->str[input->pos++] != 0x0025) { - return -1; - } - - return 0; -} - -int32_t -u_sscanf_string_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - UChar c; - int32_t count; - const UChar *source; - UConverter *conv; - UErrorCode status = U_ZERO_ERROR; - char *arg = (char*)(args[0].ptrValue); - char *alias = arg; - char *limit; - - /* skip all ws in the stream */ - u_sscanf_skip_leading_ws(input, info->fPadChar); - - /* get the string one character at a time, truncating to the width */ - count = 0; - - /* open the default converter */ - conv = u_getDefaultConverter(&status); - - if(U_FAILURE(status)) - return -1; - - while( ((c = input->str[input->pos++]) != U_EOF) - && (c != info->fPadChar && !u_isWhitespace(c)) - && (info->fWidth == -1 || count < info->fWidth) ) - { - - /* put the character from the stream onto the target */ - source = &c; - /* Since we do this one character at a time, do it this way. */ - limit = alias + ucnv_getMaxCharSize(conv); - - /* convert the character to the default codepage */ - ucnv_fromUnicode(conv, &alias, limit, &source, source + 1, - NULL, TRUE, &status); - - if(U_FAILURE(status)) { - /* clean up */ - u_releaseDefaultConverter(conv); - return -1; - } - - /* increment the count */ - ++count; - } - - /* clean up */ - u_releaseDefaultConverter(conv); - - /* put the final character we read back on the stream */ - if(c != U_EOF) - input->pos--; - - /* add the terminator */ - *alias = 0x00; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_sscanf_ustring_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - UChar c; - int32_t count; - UChar *arg = (UChar*)(args[0].ptrValue); - UChar *alias = arg; - - /* skip all ws in the stream */ - u_sscanf_skip_leading_ws(input, info->fPadChar); - - /* get the string one character at a time, truncating to the width */ - count = 0; - - while( ((c = input->str[input->pos++]) != U_EOF) - && (c != info->fPadChar && ! u_isWhitespace(c)) - && (info->fWidth == -1 || count < info->fWidth) ) - { - - /* put the character from the stream onto the target */ - *alias++ = c; - - /* increment the count */ - ++count; - } - - /* put the final character we read back on the stream */ - if(c != U_EOF) - input->pos--; - - /* add the terminator */ - *alias = 0x0000; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_sscanf_count_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - int *converted = (int*)(args[0].ptrValue); - - /* in the special case of count, the u_sscanf_spec_info's width */ - /* will contain the # of items converted thus far */ - *converted = info->fWidth; - - /* we converted 0 args */ - return 0; -} - -int32_t -u_sscanf_integer_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - int32_t len; - long *num = (long*) (args[0].ptrValue); - UNumberFormat *format; - int32_t parsePos = 0; - UErrorCode status = U_ZERO_ERROR; - - - /* skip all ws in the stream */ - u_sscanf_skip_leading_ws(input, info->fPadChar); - - /* determine the size of the stream's buffer */ - len = input->len - input->pos; - - /* truncate to the width, if specified */ - if(info->fWidth != -1) - len = ufmt_min(len, info->fWidth); - - /* get the formatter */ - format = u_locbund_getNumberFormat(input->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* parse the number */ - *num = unum_parse(format, &(input->str[input->pos]), len, &parsePos, &status); - - /* mask off any necessary bits */ - if(info->fIsShort) - *num &= UINT16_MAX; - else if(! info->fIsLong || ! info->fIsLongLong) - *num &= UINT32_MAX; - - /* update the stream's position to reflect consumed data */ - input->pos += parsePos; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_sscanf_uinteger_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - ufmt_args uint_args; - int32_t converted_args; - uint32_t *num = (uint32_t*) (args[0].ptrValue); - double currDouble; - - uint_args.ptrValue = &currDouble; - converted_args = u_sscanf_double_handler(input, info, &uint_args, fmt, consumed); - - *num = (uint32_t)currDouble; - - return converted_args; -} - -int32_t -u_sscanf_double_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - int32_t len; - double *num = (double*) (args[0].ptrValue); - UNumberFormat *format; - int32_t parsePos = 0; - UErrorCode status = U_ZERO_ERROR; - - - /* skip all ws in the stream */ - u_sscanf_skip_leading_ws(input, info->fPadChar); - - /* determine the size of the stream's buffer */ - len = input->len - input->pos; - - /* truncate to the width, if specified */ - if(info->fWidth != -1) - len = ufmt_min(len, info->fWidth); - - /* get the formatter */ - format = u_locbund_getNumberFormat(input->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* parse the number */ - *num = unum_parseDouble(format, &(input->str[input->pos]), len, &parsePos, &status); - - /* mask off any necessary bits */ - /* if(! info->fIsLong_double) - num &= DBL_MAX;*/ - - /* update the stream's position to reflect consumed data */ - input->pos += parsePos; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_sscanf_scientific_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - int32_t len; - double *num = (double*) (args[0].ptrValue); - UNumberFormat *format; - int32_t parsePos = 0; - UErrorCode status = U_ZERO_ERROR; - - - /* skip all ws in the stream */ - u_sscanf_skip_leading_ws(input, info->fPadChar); - - /* determine the size of the stream's buffer */ - len = input->len - input->pos; - - /* truncate to the width, if specified */ - if(info->fWidth != -1) - len = ufmt_min(len, info->fWidth); - - /* get the formatter */ - format = u_locbund_getScientificFormat(input->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* parse the number */ - *num = unum_parseDouble(format, &(input->str[input->pos]), len, &parsePos, &status); - - /* mask off any necessary bits */ - /* if(! info->fIsLong_double) - num &= DBL_MAX;*/ - - /* update the stream's position to reflect consumed data */ - input->pos += parsePos; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_sscanf_scidbl_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - int32_t len; - double *num = (double*) (args[0].ptrValue); - UNumberFormat *scientificFormat, *genericFormat; - /*int32_t scientificResult, genericResult;*/ - double scientificResult, genericResult; - int32_t scientificParsePos = 0, genericParsePos = 0; - UErrorCode scientificStatus = U_ZERO_ERROR; - UErrorCode genericStatus = U_ZERO_ERROR; - - - /* since we can't determine by scanning the characters whether */ - /* a number was formatted in the 'f' or 'g' styles, parse the */ - /* string with both formatters, and assume whichever one */ - /* parsed the most is the correct formatter to use */ - - - /* skip all ws in the stream */ - u_sscanf_skip_leading_ws(input, info->fPadChar); - - /* determine the size of the stream's buffer */ - len = input->len - input->pos; - - /* truncate to the width, if specified */ - if(info->fWidth != -1) - len = ufmt_min(len, info->fWidth); - - /* get the formatters */ - scientificFormat = u_locbund_getScientificFormat(input->fBundle); - genericFormat = u_locbund_getNumberFormat(input->fBundle); - - /* handle error */ - if(scientificFormat == 0 || genericFormat == 0) - return 0; - - /* parse the number using each format*/ - - scientificResult = unum_parseDouble(scientificFormat, &(input->str[input->pos]), len, - &scientificParsePos, &scientificStatus); - - genericResult = unum_parseDouble(genericFormat, &(input->str[input->pos]), len, - &genericParsePos, &genericStatus); - - /* determine which parse made it farther */ - if(scientificParsePos > genericParsePos) { - /* stash the result in num */ - *num = scientificResult; - /* update the stream's position to reflect consumed data */ - input->pos += scientificParsePos; - } - else { - /* stash the result in num */ - *num = genericResult; - /* update the stream's position to reflect consumed data */ - input->pos += genericParsePos; - } - - /* mask off any necessary bits */ - /* if(! info->fIsLong_double) - num &= DBL_MAX;*/ - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_sscanf_currency_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - int32_t len; - double *num = (double*) (args[0].ptrValue); - UNumberFormat *format; - int32_t parsePos = 0; - UErrorCode status = U_ZERO_ERROR; - - - /* skip all ws in the stream */ - u_sscanf_skip_leading_ws(input, info->fPadChar); - - /* determine the size of the stream's buffer */ - len = input->len - input->pos; - - /* truncate to the width, if specified */ - if(info->fWidth != -1) - len = ufmt_min(len, info->fWidth); - - /* get the formatter */ - format = u_locbund_getCurrencyFormat(input->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* parse the number */ - *num = unum_parseDouble(format, &(input->str[input->pos]), len, &parsePos, &status); - - /* mask off any necessary bits */ - /* if(! info->fIsLong_double) - num &= DBL_MAX;*/ - - /* update the stream's position to reflect consumed data */ - input->pos += parsePos; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_sscanf_percent_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - int32_t len; - double *num = (double*) (args[0].ptrValue); - UNumberFormat *format; - int32_t parsePos = 0; - UErrorCode status = U_ZERO_ERROR; - - - /* skip all ws in the stream */ - u_sscanf_skip_leading_ws(input, info->fPadChar); - - /* determine the size of the stream's buffer */ - len = input->len - input->pos; - - /* truncate to the width, if specified */ - if(info->fWidth != -1) - len = ufmt_min(len, info->fWidth); - - /* get the formatter */ - format = u_locbund_getPercentFormat(input->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* parse the number */ - *num = unum_parseDouble(format, &(input->str[input->pos]), len, &parsePos, &status); - - /* mask off any necessary bits */ - /* if(! info->fIsLong_double) - num &= DBL_MAX;*/ - - /* update the stream's position to reflect consumed data */ - input->pos += parsePos; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_sscanf_date_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - int32_t len; - UDate *date = (UDate*) (args[0].ptrValue); - UDateFormat *format; - int32_t parsePos = 0; - UErrorCode status = U_ZERO_ERROR; - - - /* skip all ws in the stream */ - u_sscanf_skip_leading_ws(input, info->fPadChar); - - /* determine the size of the stream's buffer */ - len = input->len - input->pos; - - /* truncate to the width, if specified */ - if(info->fWidth != -1) - len = ufmt_min(len, info->fWidth); - - /* get the formatter */ - format = u_locbund_getDateFormat(input->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* parse the number */ - *date = udat_parse(format, &(input->str[input->pos]), len, &parsePos, &status); - - /* update the stream's position to reflect consumed data */ - input->pos += parsePos; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_sscanf_time_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - int32_t len; - UDate *time = (UDate*) (args[0].ptrValue); - UDateFormat *format; - int32_t parsePos = 0; - UErrorCode status = U_ZERO_ERROR; - - - /* skip all ws in the stream */ - u_sscanf_skip_leading_ws(input, info->fPadChar); - - /* determine the size of the stream's buffer */ - len = input->len - input->pos; - - /* truncate to the width, if specified */ - if(info->fWidth != -1) - len = ufmt_min(len, info->fWidth); - - /* get the formatter */ - format = u_locbund_getTimeFormat(input->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* parse the number */ - *time = udat_parse(format, &(input->str[input->pos]), len, &parsePos, &status); - - /* update the stream's position to reflect consumed data */ - input->pos += parsePos; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_sscanf_char_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - UChar uc = 0; - char *result; - char *c = (char*)(args[0].ptrValue); - - /* skip all ws in the stream */ - u_sscanf_skip_leading_ws(input, info->fPadChar); - - /* get the character from the stream, truncating to the width */ - if(info->fWidth == -1 || info->fWidth > 1) - uc = input->str[input->pos++]; - - /* handle EOF */ - if(uc == U_EOF) - return -1; - - /* convert the character to the default codepage */ - result = ufmt_unicodeToDefaultCP(&uc, 1); - *c = result[0]; - - /* clean up */ - uprv_free(result); - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_sscanf_uchar_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - UChar *c = (UChar*)(args[0].ptrValue); - - /* skip all ws in the stream */ - u_sscanf_skip_leading_ws(input, info->fPadChar); - - /* get the character from the stream, truncating to the width */ - if(info->fWidth == -1 || info->fWidth > 1) - *c = input->str[input->pos]; - - /* handle EOF */ - if(*c == U_EOF) - return -1; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_sscanf_spellout_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - int32_t len; - double *num = (double*) (args[0].ptrValue); - UNumberFormat *format; - int32_t parsePos = 0; - UErrorCode status = U_ZERO_ERROR; - - - /* skip all ws in the stream */ - u_sscanf_skip_leading_ws(input, info->fPadChar); - - /* determine the size of the stream's buffer */ - len = input->len - input->pos; - - /* truncate to the width, if specified */ - if(info->fWidth != -1) - len = ufmt_min(len, info->fWidth); - - /* get the formatter */ - format = u_locbund_getSpelloutFormat(input->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* parse the number */ - *num = unum_parseDouble(format, &(input->str[input->pos]), len, &parsePos, &status); - - /* mask off any necessary bits */ - /* if(! info->fIsLong_double) - num &= DBL_MAX;*/ - - /* update the stream's position to reflect consumed data */ - input->pos += parsePos; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_sscanf_hex_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - int32_t len; - long *num = (long*) (args[0].ptrValue); - - - /* skip all ws in the stream */ - u_sscanf_skip_leading_ws(input, info->fPadChar); - - /* determine the size of the stream's buffer */ - len = input->len - input->pos; - - /* truncate to the width, if specified */ - if(info->fWidth != -1) - len = ufmt_min(len, info->fWidth); - - /* check for alternate form */ - if( input->str[input->pos] == 0x0030 && - (input->str[input->pos + 1] == 0x0078 || input->str[input->pos + 1] == 0x0058) ) { - - /* skip the '0' and 'x' or 'X' if present */ - input->pos += 2; - len -= 2; - } - - /* parse the number */ - *num = ufmt_utol(&(input->str[input->pos]), &len, 16); - - /* update the stream's position to reflect consumed data */ - input->pos += len; - - /* mask off any necessary bits */ - if(info->fIsShort) - *num &= UINT16_MAX; - else if(! info->fIsLong || ! info->fIsLongLong) - *num &= UINT32_MAX; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_sscanf_octal_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - int32_t len; - long *num = (long*) (args[0].ptrValue); - - - /* skip all ws in the stream */ - u_sscanf_skip_leading_ws(input, info->fPadChar); - - /* determine the size of the stream's buffer */ - len = input->len - input->pos; - - /* truncate to the width, if specified */ - if(info->fWidth != -1) - len = ufmt_min(len, info->fWidth); - - /* parse the number */ - *num = ufmt_utol(&(input->str[input->pos]), &len, 8); - - /* update the stream's position to reflect consumed data */ - input->pos += len; - - /* mask off any necessary bits */ - if(info->fIsShort) - *num &= UINT16_MAX; - else if(! info->fIsLong || ! info->fIsLongLong) - *num &= UINT32_MAX; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_sscanf_pointer_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - int32_t len; - void *p = (void*)(args[0].ptrValue); - - - /* skip all ws in the stream */ - u_sscanf_skip_leading_ws(input, info->fPadChar); - - /* determine the size of the stream's buffer */ - len = input->len - input->pos; - - /* truncate to the width, if specified */ - if(info->fWidth != -1) - len = ufmt_min(len, info->fWidth); - - /* parse the pointer - cast to void** to assign to *p */ - *(void**)p = (void*) ufmt_utol(&(input->str[input->pos]), &len, 16); - - /* update the stream's position to reflect consumed data */ - input->pos += len; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_sscanf_scanset_handler(u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - u_scanf_scanset scanset; - int32_t len; - UBool success; - UChar c; - UChar *s = (UChar*) (args[0].ptrValue); - UChar *alias, *limit; - - - /* determine the size of the stream's buffer */ - len = input->len - input->pos; - - /* truncate to the width, if specified */ - if(info->fWidth != -1) - len = ufmt_min(len, info->fWidth); - - /* alias the target */ - alias = s; - limit = alias + len; - - /* parse the scanset from the fmt string */ - *consumed = u_strlen(fmt); - success = u_scanf_scanset_init(&scanset, fmt, consumed); - - /* increment consumed by one to eat the final ']' */ - ++(*consumed); - - /* verify that the parse was successful and the converter opened */ - if(! success) - return -1; - - /* grab characters one at a time and make sure they are in the scanset */ - while( (c = input->str[input->pos++]) != U_EOF && alias < limit) { - if(u_scanf_scanset_in(&scanset, c)) { - *(alias++) = c; - } - else { - /* if the character's not in the scanset, break out */ - break; - } - } - - /* put the final character we read back on the stream */ - if(c != U_EOF) - input->pos--; - - /* if we didn't match at least 1 character, fail */ - if(alias == s) - return -1; - /* otherwise, add the terminator */ - else - *alias = 0x00; - - /* we converted 1 arg */ - return 1; -} - - -#define UP_PERCENT 0x0025 - -U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ -u_vsscanf_u(const UChar *buffer, - const char *locale, - const UChar *patternSpecification, - va_list ap) -{ - const UChar *alias; - int32_t count, converted, temp; - uint16_t handlerNum; - - ufmt_args args; - u_localized_string inStr; - u_sscanf_spec spec; - ufmt_type_info info; - u_sscanf_handler handler; - - /* alias the pattern */ - alias = patternSpecification; - - inStr.str = (UChar *)buffer; - inStr.len = u_strlen(buffer); - inStr.pos = 0; - - /* haven't converted anything yet */ - converted = 0; - - /* if locale is 0, use the default */ - if(locale == 0) { - locale = uloc_getDefault(); - } - inStr.fBundle = u_loccache_get(locale); - - if(inStr.fBundle == 0) { - return 0; - } - inStr.fOwnBundle = FALSE; - - /* iterate through the pattern */ - for(;;) { - - /* match any characters up to the next '%' */ - while(*alias != UP_PERCENT && *alias != 0x0000 && inStr.str[inStr.pos++] == *alias) { - alias++; - } - - /* if we aren't at a '%', or if we're at end of string, break*/ - if(*alias != UP_PERCENT || *alias == 0x0000) - break; - - /* parse the specifier */ - count = u_sscanf_parse_spec(alias, &spec); - - /* update the pointer in pattern */ - alias += count; - - /* skip the argument, if necessary */ - if(spec.fSkipArg) - args.ptrValue = va_arg(ap, int*); - - handlerNum = (uint16_t)(spec.fInfo.fSpec - USCANF_BASE_FMT_HANDLERS); - if (handlerNum < USCANF_NUM_FMT_HANDLERS) { - /* query the info function for argument information */ - info = g_u_sscanf_infos[ handlerNum ].info; - if(info > ufmt_simple_percent) { - switch(info) { - - case ufmt_count: - args.intValue = va_arg(ap, int); - /* set the spec's width to the # of items converted */ - spec.fInfo.fWidth = converted; - break; - - case ufmt_char: - case ufmt_uchar: - case ufmt_int: - args.ptrValue = va_arg(ap, int*); - break; - - case ufmt_wchar: - args.ptrValue = va_arg(ap, wchar_t*); - break; - - case ufmt_string: - args.ptrValue = va_arg(ap, char*); - break; - - case ufmt_wstring: - args.ptrValue = va_arg(ap, wchar_t*); - break; - - case ufmt_pointer: - args.ptrValue = va_arg(ap, void*); - break; - - case ufmt_float: - args.ptrValue = va_arg(ap, float*); - break; - - case ufmt_double: - args.ptrValue = va_arg(ap, double*); - break; - - case ufmt_date: - args.ptrValue = va_arg(ap, UDate*); - break; - - case ufmt_ustring: - args.ptrValue = va_arg(ap, UChar*); - break; - - default: - break; /* Should never get here */ - } - } - /* call the handler function */ - handler = g_u_sscanf_infos[ handlerNum ].handler; - if(handler != 0) { - - /* reset count */ - count = 0; - - temp = (*handler)(&inStr, &spec.fInfo, &args, alias, &count); - - /* if the handler encountered an error condition, break */ - if(temp == -1) - break; - - /* add to the # of items converted */ - converted += temp; - - /* update the pointer in pattern */ - alias += count; - } - /* else do nothing */ - } - /* else do nothing */ - - /* just ignore unknown tags */ - } - - /* return # of items converted */ - return converted; -} - -#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/extra/ustdio/sscanf.h b/icuSources/extra/ustdio/sscanf.h deleted file mode 100644 index 734c1f7c..00000000 --- a/icuSources/extra/ustdio/sscanf.h +++ /dev/null @@ -1,79 +0,0 @@ -/* -****************************************************************************** -* -* Copyright (C) 2000-2001, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* -* File sscanf.h -* -* Modification History: -* -* Date Name Description -* 02/08/00 george Creation. Copied from uscanf.h -****************************************************************************** -*/ - -#ifndef _USSCANF_H -#define _USSCANF_H - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_FORMATTING - -#include "unicode/ustdio.h" -#include "ufmt_cmn.h" -#include "locbund.h" - -/** - * Struct encapsulating a single uscanf format specification. - */ -struct u_sscanf_spec_info { - UChar fSpec; /* Format specification */ - - int32_t fWidth; /* Width */ - - UChar fPadChar; /* Padding character */ - - UBool fIsLongDouble; /* L flag */ - UBool fIsShort; /* h flag */ - UBool fIsLong; /* l flag */ - UBool fIsLongLong; /* ll flag */ -}; -typedef struct u_sscanf_spec_info u_sscanf_spec_info; - -struct u_localized_string { - UChar *str; /* Place to write the string */ - int32_t pos; /* Number of codeunits available to write to */ - int32_t len; /* Maximum number of code units that can be written to output */ - - ULocaleBundle *fBundle; /* formatters */ - UBool fOwnBundle; /* TRUE if fBundle should be deleted */ -}; -typedef struct u_localized_string u_localized_string; - -/** - * A u_scanf handler function. - * A u_scanf handler is responsible for handling a single u_scanf - * format specification, for example 'd' or 's'. - * @param stream The UFILE to which to write output. - * @param info A pointer to a u_scanf_spec_info struct containing - * information on the format specification. - * @param args A pointer to the argument data - * @param fmt A pointer to the first character in the format string - * following the spec. - * @param consumed On output, set to the number of characters consumed - * in fmt. - * @return The number of arguments converted and assigned, or -1 if an - * error occurred. - */ -typedef int32_t (*u_sscanf_handler) (u_localized_string *input, - const u_sscanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -#endif /* #if !UCONFIG_NO_FORMATTING */ - -#endif diff --git a/icuSources/extra/ustdio/sscanf_p.c b/icuSources/extra/ustdio/sscanf_p.c deleted file mode 100644 index 446aa110..00000000 --- a/icuSources/extra/ustdio/sscanf_p.c +++ /dev/null @@ -1,187 +0,0 @@ -/* -****************************************************************************** -* -* Copyright (C) 2000-2001, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* -* File sscnnf_p.c -* -* Modification History: -* -* Date Name Description -* 02/08/00 george Creation. Copied from uscnnf_p.h -****************************************************************************** -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_FORMATTING - -#include "sscanf_p.h" -#include "ufmt_cmn.h" - -/* flag characters for u_scanf */ -#define FLAG_ASTERISK 0x002A -#define FLAG_PAREN 0x0028 - -#define ISFLAG(s) (s) == FLAG_ASTERISK || \ - (s) == FLAG_PAREN - -/* special characters for u_scanf */ -#define SPEC_DOLLARSIGN 0x0024 - -/* unicode digits */ -#define DIGIT_ZERO 0x0030 -#define DIGIT_ONE 0x0031 -#define DIGIT_TWO 0x0032 -#define DIGIT_THREE 0x0033 -#define DIGIT_FOUR 0x0034 -#define DIGIT_FIVE 0x0035 -#define DIGIT_SIX 0x0036 -#define DIGIT_SEVEN 0x0037 -#define DIGIT_EIGHT 0x0038 -#define DIGIT_NINE 0x0039 - -#define ISDIGIT(s) (s) == DIGIT_ZERO || \ - (s) == DIGIT_ONE || \ - (s) == DIGIT_TWO || \ - (s) == DIGIT_THREE || \ - (s) == DIGIT_FOUR || \ - (s) == DIGIT_FIVE || \ - (s) == DIGIT_SIX || \ - (s) == DIGIT_SEVEN || \ - (s) == DIGIT_EIGHT || \ - (s) == DIGIT_NINE - -/* u_scanf modifiers */ -#define MOD_H 0x0068 -#define MOD_LOWERL 0x006C -#define MOD_L 0x004C - -#define ISMOD(s) (s) == MOD_H || \ - (s) == MOD_LOWERL || \ - (s) == MOD_L - -/* We parse the argument list in Unicode */ -int32_t -u_sscanf_parse_spec (const UChar *fmt, - u_sscanf_spec *spec) -{ - const UChar *s = fmt; - const UChar *backup; - u_sscanf_spec_info *info = &(spec->fInfo); - - /* initialize spec to default values */ - spec->fArgPos = -1; - spec->fSkipArg = FALSE; - - info->fSpec = 0x0000; - info->fWidth = -1; - info->fPadChar = 0x0020; - info->fIsLongDouble = FALSE; - info->fIsShort = FALSE; - info->fIsLong = FALSE; - info->fIsLongLong = FALSE; - - - /* skip over the initial '%' */ - s++; - - /* Check for positional argument */ - if(ISDIGIT(*s)) { - - /* Save the current position */ - backup = s; - - /* handle positional parameters */ - if(ISDIGIT(*s)) { - spec->fArgPos = (int) (*s++ - DIGIT_ZERO); - - while(ISDIGIT(*s)) { - spec->fArgPos *= 10; - spec->fArgPos += (int) (*s++ - DIGIT_ZERO); - } - } - - /* if there is no '$', don't read anything */ - if(*s != SPEC_DOLLARSIGN) { - spec->fArgPos = -1; - s = backup; - } - /* munge the '$' */ - else - s++; - } - - /* Get any format flags */ - while(ISFLAG(*s)) { - switch(*s++) { - - /* skip argument */ - case FLAG_ASTERISK: - spec->fSkipArg = TRUE; - break; - - /* pad character specified */ - case FLAG_PAREN: - - /* first four characters are hex values for pad char */ - info->fPadChar = (UChar)ufmt_digitvalue(*s++); - info->fPadChar = (UChar)((info->fPadChar * 16) + ufmt_digitvalue(*s++)); - info->fPadChar = (UChar)((info->fPadChar * 16) + ufmt_digitvalue(*s++)); - info->fPadChar = (UChar)((info->fPadChar * 16) + ufmt_digitvalue(*s++)); - - /* final character is ignored */ - s++; - - break; - } - } - - /* Get the width */ - if(ISDIGIT(*s)){ - info->fWidth = (int) (*s++ - DIGIT_ZERO); - - while(ISDIGIT(*s)) { - info->fWidth *= 10; - info->fWidth += (int) (*s++ - DIGIT_ZERO); - } - } - - /* Get any modifiers */ - if(ISMOD(*s)) { - switch(*s++) { - - /* short */ - case MOD_H: - info->fIsShort = TRUE; - break; - - /* long or long long */ - case MOD_LOWERL: - if(*s == MOD_LOWERL) { - info->fIsLongLong = TRUE; - /* skip over the next 'l' */ - s++; - } - else - info->fIsLong = TRUE; - break; - - /* long double */ - case MOD_L: - info->fIsLongDouble = TRUE; - break; - } - } - - /* finally, get the specifier letter */ - info->fSpec = *s++; - - /* return # of characters in this specifier */ - return (int32_t)(s - fmt); -} - -#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/extra/ustdio/sscanf_p.h b/icuSources/extra/ustdio/sscanf_p.h deleted file mode 100644 index 5e37db1e..00000000 --- a/icuSources/extra/ustdio/sscanf_p.h +++ /dev/null @@ -1,50 +0,0 @@ -/* -****************************************************************************** -* -* Copyright (C) 2000-2001, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* -* File sscnf_p.h -* -* Modification History: -* -* Date Name Description -* 02/08/00 george Creation. Copied from uscnf_p.h -****************************************************************************** -*/ - -#ifndef _USSCANF_P_H -#define _USSCANF_P_H - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_FORMATTING - -#include "sscanf.h" - -/** - * Struct encapsulating a single u_scanf format specification. - */ -struct u_sscanf_spec { - u_sscanf_spec_info fInfo; /* Information on this spec */ - int32_t fArgPos; /* Position of data in arg list */ - UBool fSkipArg; /* TRUE if arg should be skipped */ -}; -typedef struct u_sscanf_spec u_sscanf_spec; - -/** - * Parse a single u_scanf format specifier. - * @param fmt A pointer to a '%' character in a u_scanf format specification. - * @param spec A pointer to a u_scanf_spec to receive the parsed - * format specifier. - * @return The number of characters contained in this specifier. - */ -int32_t -u_sscanf_parse_spec (const UChar *fmt, - u_sscanf_spec *spec); - -#endif /* #if !UCONFIG_NO_FORMATTING */ - -#endif diff --git a/icuSources/extra/ustdio/ufile.h b/icuSources/extra/ustdio/ufile.h deleted file mode 100644 index 6e75f8bb..00000000 --- a/icuSources/extra/ustdio/ufile.h +++ /dev/null @@ -1,103 +0,0 @@ -/* -******************************************************************************* -* -* Copyright (C) 1998-1999, International Business Machines -* Corporation and others. All Rights Reserved. -* -******************************************************************************* -* -* File ufile.h -* -* Modification History: -* -* Date Name Description -* 12/01/98 stephen Creation. -* 03/12/99 stephen Modified for new C API. -******************************************************************************* -*/ - -#ifndef UFILE_H -#define UFILE_H - -#include "unicode/utypes.h" -#include "unicode/ucnv.h" -#include "unicode/utrans.h" -#include "locbund.h" - -/* The buffer size for fromUnicode calls */ -#define UFILE_CHARBUFFER_SIZE 1024 - -/* The buffer size for toUnicode calls */ -#define UFILE_UCHARBUFFER_SIZE 1024 - -/* A UFILE */ - -#if !UCONFIG_NO_TRANSLITERATION - -typedef struct { - UChar *buffer; /* Beginning of buffer */ - int32_t capacity; /* Capacity of buffer */ - int32_t pos; /* Beginning of untranslitted data */ - int32_t length; /* Length *from beginning of buffer* of untranslitted data */ - UTransliterator *translit; -} UFILETranslitBuffer; - -#endif - -struct UFILE { - FILE *fFile; /* the actual fs interface */ - UBool fOwnFile; /* TRUE if fFile should be closed */ - -#if !UCONFIG_NO_FORMATTING - ULocaleBundle *fBundle; /* formatters */ - UBool fOwnBundle; /* TRUE if fBundle should be deleted */ -#endif - - UConverter *fConverter; /* for codeset conversion */ - - /* buffer used for fromUnicode */ - char fCharBuffer [UFILE_CHARBUFFER_SIZE]; - - /* buffer used for toUnicode */ - UChar fUCBuffer [UFILE_UCHARBUFFER_SIZE]; - - UChar *fUCLimit; /* data limit in fUCBuffer */ - UChar *fUCPos; /* current pos in fUCBuffer */ - -#if !UCONFIG_NO_TRANSLITERATION - UFILETranslitBuffer *fTranslit; -#endif -}; - -/** - * Like u_file_write but takes a flush parameter - */ -U_CAPI int32_t U_EXPORT2 -u_file_write_flush( const UChar *chars, - int32_t count, - UFILE *f, - UBool flush); - -/** - * Fill a UFILE's buffer with converted codepage data. - * @param f The UFILE containing the buffer to fill. - */ -void -ufile_fill_uchar_buffer(UFILE *f); - -/** - * Close out the transliterator and flush any data therein. - * @param f flu - */ -void -ufile_close_translit(UFILE *f); - -/** - * Flush the buffer in the transliterator - * @param f UFile to flush - */ -void -ufile_flush_translit(UFILE *f); - - -#endif diff --git a/icuSources/extra/ustdio/uprintf.c b/icuSources/extra/ustdio/uprintf.c deleted file mode 100644 index 7f2b5c5c..00000000 --- a/icuSources/extra/ustdio/uprintf.c +++ /dev/null @@ -1,1338 +0,0 @@ -/* -****************************************************************************** -* -* Copyright (C) 1998-2003, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* -* File uprintf.c -* -* Modification History: -* -* Date Name Description -* 11/19/98 stephen Creation. -* 03/12/99 stephen Modified for new C API. -* Added conversion from default codepage. -****************************************************************************** -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_FORMATTING - -#include "uprintf.h" -#include "uprntf_p.h" -#include "unicode/ustdio.h" -#include "ufile.h" -#include "unicode/ustring.h" -#include "locbund.h" -#include "unicode/unum.h" -#include "unicode/udat.h" - -#include "cmemory.h" - - -/* --- Prototypes ---------------------------- */ - -int32_t -u_printf_simple_percent_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args); - -int32_t -u_printf_string_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args); - -int32_t -u_printf_date_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args); - -int32_t -u_printf_scientific_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args); - -int32_t -u_printf_scidbl_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args); - -int32_t -u_printf_uchar_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args); - -int32_t -u_printf_currency_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args); - -int32_t -u_printf_ustring_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args); - -int32_t -u_printf_percent_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args); - -int32_t -u_printf_time_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args); - -int32_t -u_printf_spellout_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args); - -int32_t -u_printf_hex_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args); - -int32_t -u_printf_char_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args); - -int32_t -u_printf_integer_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args); - -int32_t -u_printf_uinteger_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args); - -int32_t -u_printf_double_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args); - -int32_t -u_printf_count_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args); - -int32_t -u_printf_octal_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args); - -int32_t -u_printf_pointer_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args); - -/* ANSI style formatting */ -/* Use US-ASCII characters only for formatting */ - -/* % */ -#define UFMT_SIMPLE_PERCENT {ufmt_simple_percent, u_printf_simple_percent_handler} -/* s */ -#define UFMT_STRING {ufmt_string, u_printf_string_handler} -/* c */ -#define UFMT_CHAR {ufmt_char, u_printf_char_handler} -/* d, i */ -#define UFMT_INT {ufmt_int, u_printf_integer_handler} -/* u */ -#define UFMT_UINT {ufmt_int, u_printf_uinteger_handler} -/* o */ -#define UFMT_OCTAL {ufmt_int, u_printf_octal_handler} -/* x, X */ -#define UFMT_HEX {ufmt_int, u_printf_hex_handler} -/* f */ -#define UFMT_DOUBLE {ufmt_double, u_printf_double_handler} -/* e, E */ -#define UFMT_SCIENTIFIC {ufmt_double, u_printf_scientific_handler} -/* g, G */ -#define UFMT_SCIDBL {ufmt_double, u_printf_scidbl_handler} -/* n */ -#define UFMT_COUNT {ufmt_count, u_printf_count_handler} - -/* non-ANSI extensions */ -/* Use US-ASCII characters only for formatting */ - -/* p */ -#define UFMT_POINTER {ufmt_pointer, u_printf_pointer_handler} -/* D */ -#define UFMT_DATE {ufmt_date, u_printf_date_handler} -/* T */ -#define UFMT_TIME {ufmt_date, u_printf_time_handler} -/* V */ -#define UFMT_SPELLOUT {ufmt_double, u_printf_spellout_handler} -/* P */ -#define UFMT_PERCENT {ufmt_double, u_printf_percent_handler} -/* M */ -#define UFMT_CURRENCY {ufmt_double, u_printf_currency_handler} -/* K */ -#define UFMT_UCHAR {ufmt_uchar, u_printf_uchar_handler} -/* U */ -#define UFMT_USTRING {ufmt_ustring, u_printf_ustring_handler} - - -#define UFMT_EMPTY {ufmt_empty, NULL} - -struct u_printf_info { - ufmt_type_info info; - u_printf_handler handler; -}; -typedef struct u_printf_info u_printf_info; - -/* Use US-ASCII characters only for formatting. Most codepages have - characters 20-7F from Unicode. Using any other codepage specific - characters will make it very difficult to format the string on - non-Unicode machines */ -static const u_printf_info g_u_printf_infos[108] = { -/* 0x20 */ - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_SIMPLE_PERCENT,UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - -/* 0x30 */ - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - -/* 0x40 */ - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_DATE, UFMT_SCIENTIFIC, UFMT_EMPTY, UFMT_SCIDBL, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_UCHAR, - UFMT_EMPTY, UFMT_CURRENCY, UFMT_EMPTY, UFMT_EMPTY, - -/* 0x50 */ - UFMT_PERCENT, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_TIME, UFMT_USTRING, UFMT_SPELLOUT, UFMT_EMPTY, - UFMT_HEX, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - -/* 0x60 */ - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_CHAR, - UFMT_INT, UFMT_SCIENTIFIC, UFMT_DOUBLE, UFMT_SCIDBL, - UFMT_EMPTY, UFMT_INT, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_COUNT, UFMT_OCTAL, - -/* 0x70 */ - UFMT_POINTER, UFMT_EMPTY, UFMT_EMPTY, UFMT_STRING, - UFMT_EMPTY, UFMT_UINT, UFMT_EMPTY, UFMT_EMPTY, - UFMT_HEX, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, -}; - -#define UPRINTF_NUM_FMT_HANDLERS sizeof(g_u_printf_infos) - -/* We do not use handlers for 0-0x1f */ -#define UPRINTF_BASE_FMT_HANDLERS 0x20 - -/* buffer size for formatting */ -#define UFPRINTF_BUFFER_SIZE 1024 -#define UFPRINTF_SYMBOL_BUFFER_SIZE 8 - -static const UChar gNullStr[] = {0x28, 0x6E, 0x75, 0x6C, 0x6C, 0x29, 0}; /* "(null)" */ -static const UChar gSpaceStr[] = {0x20, 0}; /* " " */ - -int32_t -u_fprintf( UFILE *f, - const char *patternSpecification, - ... ) -{ - va_list ap; - int32_t count; - - va_start(ap, patternSpecification); - count = u_vfprintf(f, patternSpecification, ap); - va_end(ap); - - return count; -} - -int32_t -u_fprintf_u( UFILE *f, - const UChar *patternSpecification, - ... ) -{ - va_list ap; - int32_t count; - - va_start(ap, patternSpecification); - count = u_vfprintf_u(f, patternSpecification, ap); - va_end(ap); - - return count; -} - -U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ -u_vfprintf( UFILE *f, - const char *patternSpecification, - va_list ap) -{ - int32_t count; - UChar *pattern; - UChar buffer[UFMT_DEFAULT_BUFFER_SIZE]; - int32_t size = (int32_t)strlen(patternSpecification) + 1; - - /* convert from the default codepage to Unicode */ - if (size >= MAX_UCHAR_BUFFER_SIZE(buffer)) { - pattern = (UChar *)uprv_malloc(size * sizeof(UChar)); - if(pattern == 0) { - return 0; - } - } - else { - pattern = buffer; - } - ufmt_defaultCPToUnicode(patternSpecification, size, pattern, size); - - /* do the work */ - count = u_vfprintf_u(f, pattern, ap); - - /* clean up */ - if (pattern != buffer) { - uprv_free(pattern); - } - - return count; -} - -static int32_t -u_printf_pad_and_justify(UFILE *stream, - const u_printf_spec_info *info, - const UChar *result, - int32_t resultLen) -{ - int32_t written, i; - - /* pad and justify, if needed */ - if(info->fWidth != -1 && resultLen < info->fWidth) { - /* left justify */ - if(info->fLeft) { - written = u_file_write(result, resultLen, stream); - for(i = 0; i < info->fWidth - resultLen; ++i) { - written += u_file_write(&info->fPadChar, 1, stream); - } - } - /* right justify */ - else { - written = 0; - for(i = 0; i < info->fWidth - resultLen; ++i) { - written += u_file_write(&info->fPadChar, 1, stream); - } - written += u_file_write(result, resultLen, stream); - } - } - /* just write the formatted output */ - else - written = u_file_write(result, resultLen, stream); - - return written; -} - -/* Sets the sign of a format based on u_sprintf_spec_info */ -/* TODO: Is setting the prefix symbol to a positive sign a good idea in all locales? */ -static void -u_printf_set_sign(UNumberFormat *format, - const u_printf_spec_info *info, - UErrorCode *status) -{ - if(info->fShowSign) { - if (info->fSpace) { - /* Setting UNUM_PLUS_SIGN_SYMBOL affects the exponent too. */ - /* unum_setSymbol(format, UNUM_PLUS_SIGN_SYMBOL, gSpaceStr, 1, &status); */ - unum_setTextAttribute(format, UNUM_POSITIVE_PREFIX, gSpaceStr, 1, status); - } - else { - UChar plusSymbol[UFPRINTF_SYMBOL_BUFFER_SIZE]; - int32_t symbolLen; - - symbolLen = unum_getSymbol(format, - UNUM_PLUS_SIGN_SYMBOL, - plusSymbol, - sizeof(plusSymbol)/sizeof(*plusSymbol), - status); - unum_setTextAttribute(format, - UNUM_POSITIVE_PREFIX, - plusSymbol, - symbolLen, - status); - } - } -} - -/* handle a '%' */ - -int32_t -u_printf_simple_percent_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args) -{ - /* put a single '%' on the stream */ - u_fputc(0x0025, stream); - /* we wrote one character */ - return 1; -} - -/* handle 's' */ - -int32_t -u_printf_string_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args) -{ - UChar *s; - UChar buffer[UFMT_DEFAULT_BUFFER_SIZE]; - int32_t len, written; - int32_t argSize; - const char *arg = (const char*)(args[0].ptrValue); - - /* convert from the default codepage to Unicode */ - if (arg) { - argSize = (int32_t)strlen(arg) + 1; - if (argSize >= MAX_UCHAR_BUFFER_SIZE(buffer)) { - s = ufmt_defaultCPToUnicode(arg, argSize, - (UChar *)uprv_malloc(MAX_UCHAR_BUFFER_NEEDED(argSize)), - MAX_UCHAR_BUFFER_NEEDED(argSize)); - if(s == NULL) { - return 0; - } - } - else { - s = ufmt_defaultCPToUnicode(arg, argSize, buffer, - sizeof(buffer)/sizeof(UChar)); - } - } - else { - s = (UChar *)gNullStr; - } - len = u_strlen(s); - - /* width = minimum # of characters to write */ - /* precision = maximum # of characters to write */ - - /* precision takes precedence over width */ - /* determine if the string should be truncated */ - if(info->fPrecision != -1 && len > info->fPrecision) { - written = u_file_write(s, info->fPrecision, stream); - } - /* determine if the string should be padded */ - else { - written = u_printf_pad_and_justify(stream, info, s, len); - } - - /* clean up */ - if (gNullStr != s && buffer != s) { - uprv_free(s); - } - - return written; -} - -/* HSYS */ -int32_t -u_printf_integer_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args) -{ - long num = (long) (args[0].intValue); - UNumberFormat *format; - UChar result [UFPRINTF_BUFFER_SIZE]; - int32_t minDigits = -1; - UErrorCode status = U_ZERO_ERROR; - - /* mask off any necessary bits */ - if(info->fIsShort) - num &= UINT16_MAX; - else if(! info->fIsLong || ! info->fIsLongLong) - num &= UINT32_MAX; - - /* get the formatter */ - format = u_locbund_getNumberFormat(stream->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* set the appropriate flags on the formatter */ - - /* set the minimum integer digits */ - if(info->fPrecision != -1) { - /* clone the stream's bundle if it isn't owned */ - if(! stream->fOwnBundle) { - stream->fBundle = u_locbund_clone(stream->fBundle); - stream->fOwnBundle = TRUE; - format = u_locbund_getNumberFormat(stream->fBundle); - } - - /* set the minimum # of digits */ - minDigits = unum_getAttribute(format, UNUM_MIN_INTEGER_DIGITS); - unum_setAttribute(format, UNUM_MIN_INTEGER_DIGITS, info->fPrecision); - } - - /* set whether to show the sign */ - if(info->fShowSign) { - /* clone the stream's bundle if it isn't owned */ - if(! stream->fOwnBundle) { - stream->fBundle = u_locbund_clone(stream->fBundle); - stream->fOwnBundle = TRUE; - format = u_locbund_getNumberFormat(stream->fBundle); - } - - u_printf_set_sign(format, info, &status); - } - - /* format the number */ - unum_format(format, num, result, UFPRINTF_BUFFER_SIZE, 0, &status); - - /* restore the number format */ - if(minDigits != -1) - unum_setAttribute(format, UNUM_MIN_INTEGER_DIGITS, minDigits); - - return u_printf_pad_and_justify(stream, info, result, u_strlen(result)); -} - -int32_t -u_printf_hex_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args) -{ - long num = (long) (args[0].intValue); - UChar result[UFPRINTF_BUFFER_SIZE]; - int32_t len = UFPRINTF_BUFFER_SIZE; - - - /* mask off any necessary bits */ - if(info->fIsShort) - num &= UINT16_MAX; - else if(! info->fIsLong || ! info->fIsLongLong) - num &= UINT32_MAX; - - /* format the number, preserving the minimum # of digits */ - ufmt_ltou(result, &len, num, 16, - (UBool)(info->fSpec == 0x0078), - (info->fPrecision == -1 && info->fZero) ? info->fWidth : info->fPrecision); - - /* convert to alt form, if desired */ - if(num != 0 && info->fAlt && len < UFPRINTF_BUFFER_SIZE - 2) { - /* shift the formatted string right by 2 chars */ - memmove(result + 2, result, len * sizeof(UChar)); - result[0] = 0x0030; - result[1] = info->fSpec; - len += 2; - } - - return u_printf_pad_and_justify(stream, info, result, len); -} - -int32_t -u_printf_octal_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args) -{ - long num = (long) (args[0].intValue); - UChar result[UFPRINTF_BUFFER_SIZE]; - int32_t len = UFPRINTF_BUFFER_SIZE; - - - /* mask off any necessary bits */ - if(info->fIsShort) - num &= UINT16_MAX; - else if(! info->fIsLong || ! info->fIsLongLong) - num &= UINT32_MAX; - - /* format the number, preserving the minimum # of digits */ - ufmt_ltou(result, &len, num, 8, - FALSE, /* doesn't matter for octal */ - info->fPrecision == -1 && info->fZero ? info->fWidth : info->fPrecision); - - /* convert to alt form, if desired */ - if(info->fAlt && result[0] != 0x0030 && len < UFPRINTF_BUFFER_SIZE - 1) { - /* shift the formatted string right by 1 char */ - memmove(result + 1, result, len * sizeof(UChar)); - result[0] = 0x0030; - len += 1; - } - - return u_printf_pad_and_justify(stream, info, result, len); -} - - -int32_t -u_printf_uinteger_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args) -{ - u_printf_spec_info uint_info; - ufmt_args uint_args; - - memcpy(&uint_info, info, sizeof(u_printf_spec_info)); - memcpy(&uint_args, args, sizeof(ufmt_args)); - - uint_info.fPrecision = 0; - uint_info.fAlt = FALSE; - - /* Get around int32_t limitations */ - uint_args.doubleValue = ((double) ((uint32_t) (uint_args.intValue))); - - return u_printf_double_handler(stream, &uint_info, &uint_args); -} - -int32_t -u_printf_double_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args) -{ - double num = (double) (args[0].doubleValue); - UNumberFormat *format; - UChar result [UFPRINTF_BUFFER_SIZE]; - int32_t minDecimalDigits; - int32_t maxDecimalDigits; - UErrorCode status = U_ZERO_ERROR; - - /* mask off any necessary bits */ - /* if(! info->fIsLongDouble) - num &= DBL_MAX;*/ - - /* get the formatter */ - format = u_locbund_getNumberFormat(stream->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* set the appropriate flags on the formatter */ - - /* clone the stream's bundle if it isn't owned */ - if(! stream->fOwnBundle) { - stream->fBundle = u_locbund_clone(stream->fBundle); - stream->fOwnBundle = TRUE; - format = u_locbund_getNumberFormat(stream->fBundle); - } - - /* set the number of decimal digits */ - - /* save the formatter's state */ - minDecimalDigits = unum_getAttribute(format, UNUM_MIN_FRACTION_DIGITS); - maxDecimalDigits = unum_getAttribute(format, UNUM_MAX_FRACTION_DIGITS); - - if(info->fPrecision != -1) { - /* set the # of decimal digits */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, info->fPrecision); - } - else if(info->fPrecision == 0 && ! info->fAlt) { - /* no decimal point in this case */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 0); - } - else if(info->fAlt) { - /* '#' means always show decimal point */ - /* copy of printf behavior on Solaris - '#' shows 6 digits */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 6); - } - else { - /* # of decimal digits is 6 if precision not specified */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 6); - } - - /* set whether to show the sign */ - u_printf_set_sign(format, info, &status); - - /* format the number */ - unum_formatDouble(format, num, result, UFPRINTF_BUFFER_SIZE, 0, &status); - - /* restore the number format */ - unum_setAttribute(format, UNUM_MIN_FRACTION_DIGITS, minDecimalDigits); - unum_setAttribute(format, UNUM_MAX_FRACTION_DIGITS, maxDecimalDigits); - - return u_printf_pad_and_justify(stream, info, result, u_strlen(result)); -} - - -int32_t -u_printf_char_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args) -{ - UChar s[UTF_MAX_CHAR_LENGTH+1]; - int32_t len = 1, written; - unsigned char arg = (unsigned char)(args[0].intValue); - - /* convert from default codepage to Unicode */ - ufmt_defaultCPToUnicode((const char *)&arg, 2, s, sizeof(s)/sizeof(UChar)); - - /* Remember that this may be a surrogate pair */ - if (arg != 0) { - len = u_strlen(s); - } - - /* width = minimum # of characters to write */ - /* precision = maximum # of characters to write */ - - /* precision takes precedence over width */ - /* determine if the string should be truncated */ - if(info->fPrecision != -1 && len > info->fPrecision) { - written = u_file_write(s, info->fPrecision, stream); - } - else { - /* determine if the string should be padded */ - written = u_printf_pad_and_justify(stream, info, s, len); - } - - return written; -} - - -int32_t -u_printf_pointer_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args) -{ - long num = (long) (args[0].intValue); - UChar result[UFPRINTF_BUFFER_SIZE]; - int32_t len = UFPRINTF_BUFFER_SIZE; - - - /* format the pointer in hex */ - ufmt_ltou(result, &len, num, 16, TRUE, info->fPrecision); - - return u_printf_pad_and_justify(stream, info, result, len); -} - - -int32_t -u_printf_scientific_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args) -{ - double num = (double) (args[0].doubleValue); - UNumberFormat *format; - UChar result [UFPRINTF_BUFFER_SIZE]; - int32_t minDecimalDigits; - int32_t maxDecimalDigits; - UErrorCode status = U_ZERO_ERROR; - UChar srcExpBuf[UFPRINTF_SYMBOL_BUFFER_SIZE]; - int32_t srcLen, expLen; - UChar expBuf[UFPRINTF_SYMBOL_BUFFER_SIZE]; - - - /* mask off any necessary bits */ - /* if(! info->fIsLongDouble) - num &= DBL_MAX;*/ - - /* get the formatter */ - format = u_locbund_getScientificFormat(stream->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* set the appropriate flags on the formatter */ - - /* clone the stream's bundle if it isn't owned */ - if(! stream->fOwnBundle) { - stream->fBundle = u_locbund_clone(stream->fBundle); - stream->fOwnBundle = TRUE; - format = u_locbund_getScientificFormat(stream->fBundle); - } - - srcLen = unum_getSymbol(format, - UNUM_EXPONENTIAL_SYMBOL, - srcExpBuf, - sizeof(srcExpBuf), - &status); - - /* Upper/lower case the e */ - if (info->fSpec == (UChar)0x65 /* e */) { - expLen = u_strToLower(expBuf, (int32_t)sizeof(expBuf), - srcExpBuf, srcLen, - stream->fBundle->fLocale, - &status); - } - else { - expLen = u_strToUpper(expBuf, (int32_t)sizeof(expBuf), - srcExpBuf, srcLen, - stream->fBundle->fLocale, - &status); - } - - unum_setSymbol(format, - UNUM_EXPONENTIAL_SYMBOL, - expBuf, - expLen, - &status); - - /* set the number of decimal digits */ - - /* save the formatter's state */ - minDecimalDigits = unum_getAttribute(format, UNUM_MIN_FRACTION_DIGITS); - maxDecimalDigits = unum_getAttribute(format, UNUM_MAX_FRACTION_DIGITS); - - if(info->fPrecision != -1) { - /* set the # of decimal digits */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, info->fPrecision); - } - else if(info->fPrecision == 0 && ! info->fAlt) { - /* no decimal point in this case */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 0); - } - else if(info->fAlt) { - /* '#' means always show decimal point */ - /* copy of printf behavior on Solaris - '#' shows 6 digits */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 6); - } - else { - /* # of decimal digits is 6 if precision not specified */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 6); - } - - /* set whether to show the sign */ - u_printf_set_sign(format, info, &status); - - /* format the number */ - unum_formatDouble(format, num, result, UFPRINTF_BUFFER_SIZE, 0, &status); - - /* restore the number format */ - unum_setAttribute(format, UNUM_MIN_FRACTION_DIGITS, minDecimalDigits); - unum_setAttribute(format, UNUM_MAX_FRACTION_DIGITS, maxDecimalDigits); - - /* Since we clone the fBundle and we're only using the scientific - format, we don't need to save the old exponent value. */ - /*unum_setSymbol(format, - UNUM_EXPONENTIAL_SYMBOL, - srcExpBuf, - srcLen, - &status);*/ - - return u_printf_pad_and_justify(stream, info, result, u_strlen(result)); -} - -int32_t -u_printf_date_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args) -{ - UDate num = (UDate) (args[0].dateValue); - UDateFormat *format; - UChar result [UFPRINTF_BUFFER_SIZE]; - UErrorCode status = U_ZERO_ERROR; - - - /* get the formatter */ - format = u_locbund_getDateFormat(stream->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* format the date */ - udat_format(format, num, result, UFPRINTF_BUFFER_SIZE, 0, &status); - - return u_printf_pad_and_justify(stream, info, result, u_strlen(result)); -} - -int32_t -u_printf_time_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args) -{ - UDate num = (UDate) (args[0].dateValue); - UDateFormat *format; - UChar result [UFPRINTF_BUFFER_SIZE]; - UErrorCode status = U_ZERO_ERROR; - - - /* get the formatter */ - format = u_locbund_getTimeFormat(stream->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* format the time */ - udat_format(format, num, result, UFPRINTF_BUFFER_SIZE, 0, &status); - - return u_printf_pad_and_justify(stream, info, result, u_strlen(result)); -} - - -int32_t -u_printf_percent_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args) -{ - double num = (double) (args[0].doubleValue); - UNumberFormat *format; - UChar result [UFPRINTF_BUFFER_SIZE]; - int32_t minDecimalDigits; - int32_t maxDecimalDigits; - UErrorCode status = U_ZERO_ERROR; - - - /* mask off any necessary bits */ - /* if(! info->fIsLongDouble) - num &= DBL_MAX;*/ - - /* get the formatter */ - format = u_locbund_getPercentFormat(stream->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* set the appropriate flags on the formatter */ - - /* clone the stream's bundle if it isn't owned */ - if(! stream->fOwnBundle) { - stream->fBundle = u_locbund_clone(stream->fBundle); - stream->fOwnBundle = TRUE; - format = u_locbund_getPercentFormat(stream->fBundle); - } - - /* set the number of decimal digits */ - - /* save the formatter's state */ - minDecimalDigits = unum_getAttribute(format, UNUM_MIN_FRACTION_DIGITS); - maxDecimalDigits = unum_getAttribute(format, UNUM_MAX_FRACTION_DIGITS); - - if(info->fPrecision != -1) { - /* set the # of decimal digits */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, info->fPrecision); - } - else if(info->fPrecision == 0 && ! info->fAlt) { - /* no decimal point in this case */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 0); - } - else if(info->fAlt) { - /* '#' means always show decimal point */ - /* copy of printf behavior on Solaris - '#' shows 6 digits */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 6); - } - else { - /* # of decimal digits is 6 if precision not specified */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 6); - } - - /* set whether to show the sign */ - u_printf_set_sign(format, info, &status); - - /* format the number */ - unum_formatDouble(format, num, result, UFPRINTF_BUFFER_SIZE, 0, &status); - - /* restore the number format */ - unum_setAttribute(format, UNUM_MIN_FRACTION_DIGITS, minDecimalDigits); - unum_setAttribute(format, UNUM_MAX_FRACTION_DIGITS, maxDecimalDigits); - - return u_printf_pad_and_justify(stream, info, result, u_strlen(result)); -} - - -int32_t -u_printf_currency_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args) -{ - double num = (double) (args[0].doubleValue); - UNumberFormat *format; - UChar result [UFPRINTF_BUFFER_SIZE]; - int32_t minDecimalDigits; - int32_t maxDecimalDigits; - UErrorCode status = U_ZERO_ERROR; - - - /* mask off any necessary bits */ - /* if(! info->fIsLongDouble) - num &= DBL_MAX;*/ - - /* get the formatter */ - format = u_locbund_getCurrencyFormat(stream->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* set the appropriate flags on the formatter */ - - /* clone the stream's bundle if it isn't owned */ - if(! stream->fOwnBundle) { - stream->fBundle = u_locbund_clone(stream->fBundle); - stream->fOwnBundle = TRUE; - format = u_locbund_getCurrencyFormat(stream->fBundle); - } - - /* set the number of decimal digits */ - - /* save the formatter's state */ - minDecimalDigits = unum_getAttribute(format, UNUM_MIN_FRACTION_DIGITS); - maxDecimalDigits = unum_getAttribute(format, UNUM_MAX_FRACTION_DIGITS); - - if(info->fPrecision != -1) { - /* set the # of decimal digits */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, info->fPrecision); - } - else if(info->fPrecision == 0 && ! info->fAlt) { - /* no decimal point in this case */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 0); - } - else if(info->fAlt) { - /* '#' means always show decimal point */ - /* copy of printf behavior on Solaris - '#' shows 6 digits */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 2); - } - else { - /* # of decimal digits is 2 if precision not specified, 2 is typical */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 2); - } - - /* set whether to show the sign */ - u_printf_set_sign(format, info, &status); - - /* format the number */ - unum_formatDouble(format, num, result, UFPRINTF_BUFFER_SIZE, 0, &status); - - /* restore the number format */ - unum_setAttribute(format, UNUM_MIN_FRACTION_DIGITS, minDecimalDigits); - unum_setAttribute(format, UNUM_MAX_FRACTION_DIGITS, maxDecimalDigits); - - return u_printf_pad_and_justify(stream, info, result, u_strlen(result)); -} - -int32_t -u_printf_ustring_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args) -{ - int32_t len = 0, written; - const UChar *arg = (const UChar*)(args[0].ptrValue); - - /* allocate enough space for the buffer */ - if (arg == NULL) { - arg = gNullStr; - } - len = u_strlen(arg); - - /* width = minimum # of characters to write */ - /* precision = maximum # of characters to write */ - - /* precision takes precedence over width */ - /* determine if the string should be truncated */ - if(info->fPrecision != -1 && len > info->fPrecision) { - written = u_file_write(arg, info->fPrecision, stream); - } - else { - /* determine if the string should be padded */ - written = u_printf_pad_and_justify(stream, info, arg, len); - } - - return written; -} - - - -int32_t -u_printf_uchar_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args) -{ - int32_t written = 0; - UChar arg = (UChar)(args[0].intValue); - - - /* width = minimum # of characters to write */ - /* precision = maximum # of characters to write */ - - /* precision takes precedence over width */ - /* determine if the char should be printed */ - if(info->fPrecision != -1 && info->fPrecision < 1) { - /* write nothing */ - written = 0; - } - else { - /* determine if the string should be padded */ - written = u_printf_pad_and_justify(stream, info, &arg, 1); - } - - return written; -} - -int32_t -u_printf_scidbl_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args) -{ - u_printf_spec_info scidbl_info; - double num = args[0].doubleValue; - - memcpy(&scidbl_info, info, sizeof(u_printf_spec_info)); - - /* determine whether to use 'd', 'e' or 'f' notation */ - if (scidbl_info.fPrecision == -1 && num == uprv_trunc(num)) - { - /* use 'f' notation */ - scidbl_info.fSpec = 0x0066; - scidbl_info.fPrecision = 0; - /* call the double handler */ - return u_printf_double_handler(stream, &scidbl_info, args); - } - else if(num < 0.0001 || (scidbl_info.fPrecision < 1 && 1000000.0 <= num) - || (scidbl_info.fPrecision != -1 && num > uprv_pow10(scidbl_info.fPrecision))) - { - /* use 'e' or 'E' notation */ - scidbl_info.fSpec = scidbl_info.fSpec - 2; - /* call the scientific handler */ - return u_printf_scientific_handler(stream, &scidbl_info, args); - } - else { - /* use 'f' notation */ - scidbl_info.fSpec = 0x0066; - /* call the double handler */ - return u_printf_double_handler(stream, &scidbl_info, args); - } -} - - -int32_t -u_printf_count_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args) -{ - int *count = (int*)(args[0].ptrValue); - - /* in the special case of count, the u_printf_spec_info's width */ - /* will contain the # of chars written thus far */ - *count = info->fWidth; - - return 0; -} - - -int32_t -u_printf_spellout_handler(UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args) -{ - double num = (double) (args[0].doubleValue); - UNumberFormat *format; - UChar result [UFPRINTF_BUFFER_SIZE]; - int32_t minDecimalDigits; - int32_t maxDecimalDigits; - UErrorCode status = U_ZERO_ERROR; - - - /* mask off any necessary bits */ - /* if(! info->fIsLongDouble) - num &= DBL_MAX;*/ - - /* get the formatter */ - format = u_locbund_getSpelloutFormat(stream->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* set the appropriate flags on the formatter */ - - /* clone the stream's bundle if it isn't owned */ - if(! stream->fOwnBundle) { - stream->fBundle = u_locbund_clone(stream->fBundle); - stream->fOwnBundle = TRUE; - format = u_locbund_getSpelloutFormat(stream->fBundle); - } - - /* set the number of decimal digits */ - - /* save the formatter's state */ - minDecimalDigits = unum_getAttribute(format, UNUM_MIN_FRACTION_DIGITS); - maxDecimalDigits = unum_getAttribute(format, UNUM_MAX_FRACTION_DIGITS); - - if(info->fPrecision != -1) { - /* set the # of decimal digits */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, info->fPrecision); - } - else if(info->fPrecision == 0 && ! info->fAlt) { - /* no decimal point in this case */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 0); - } - else if(info->fAlt) { - /* '#' means always show decimal point */ - /* copy of printf behavior on Solaris - '#' shows 6 digits */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 6); - } - else { - /* # of decimal digits is 6 if precision not specified */ - unum_setAttribute(format, UNUM_FRACTION_DIGITS, 6); - } - - /* set whether to show the sign */ - u_printf_set_sign(format, info, &status); - - /* format the number */ - unum_formatDouble(format, num, result, UFPRINTF_BUFFER_SIZE, 0, &status); - - /* restore the number format */ - unum_setAttribute(format, UNUM_MIN_FRACTION_DIGITS, minDecimalDigits); - unum_setAttribute(format, UNUM_MAX_FRACTION_DIGITS, maxDecimalDigits); - - return u_printf_pad_and_justify(stream, info, result, u_strlen(result)); -} - -#define UP_PERCENT 0x0025 - -U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ -u_vfprintf_u( UFILE *f, - const UChar *patternSpecification, - va_list ap) -{ - u_printf_spec spec; - const UChar *alias; - int32_t patCount, written; - uint16_t handlerNum; - - ufmt_args args; - - ufmt_type_info info; - u_printf_handler handler; - - /* alias the pattern */ - alias = patternSpecification; - - /* haven't written anything yet */ - written = 0; - - /* iterate through the pattern */ - for(;;) { - - /* find the next '%' */ - patCount = 0; - while(*alias != UP_PERCENT && *alias != 0x0000) { - alias++; - ++patCount; - } - - /* write any characters before the '%' */ - if(patCount > 0) - written += u_file_write(alias - patCount, patCount, f); - - /* break if at end of string */ - if(*alias == 0x0000) - break; - - /* parse the specifier */ - patCount = u_printf_parse_spec(alias, &spec); - - /* fill in the precision and width, if specified out of line */ - - /* width specified out of line */ - if(spec.fInfo.fWidth == -2) { - if(spec.fWidthPos == -1) { - /* read the width from the argument list */ - spec.fInfo.fWidth = va_arg(ap, int); - } - else { - /* handle positional parameter */ - } - - /* if it's negative, take the absolute value and set left alignment */ - if(spec.fInfo.fWidth < 0) { - spec.fInfo.fWidth *= -1; - spec.fInfo.fLeft = TRUE; - } - } - - /* precision specified out of line */ - if(spec.fInfo.fPrecision == -2) { - if(spec.fPrecisionPos == -1) { - /* read the precision from the argument list */ - spec.fInfo.fPrecision = va_arg(ap, int); - } - else { - /* handle positional parameter */ - } - - /* if it's negative, set it to zero */ - if(spec.fInfo.fPrecision < 0) - spec.fInfo.fPrecision = 0; - } - - handlerNum = (uint16_t)(spec.fInfo.fSpec - UPRINTF_BASE_FMT_HANDLERS); - if (handlerNum < UPRINTF_NUM_FMT_HANDLERS) { - /* query the info function for argument information */ - info = g_u_printf_infos[ handlerNum ].info; - if(info > ufmt_simple_percent) { - switch(info) { - - case ufmt_count: - /* set the spec's width to the # of chars written */ - spec.fInfo.fWidth = written; - - case ufmt_char: - case ufmt_uchar: - case ufmt_int: - args.intValue = va_arg(ap, int); - break; - - case ufmt_wchar: - args.wcharValue = va_arg(ap, wchar_t); - break; - - case ufmt_string: - args.ptrValue = va_arg(ap, char*); - break; - - case ufmt_wstring: - args.ptrValue = va_arg(ap, wchar_t*); - break; - - case ufmt_ustring: - args.ptrValue = va_arg(ap, UChar*); - break; - - case ufmt_pointer: - args.ptrValue = va_arg(ap, void*); - break; - - case ufmt_float: - args.floatValue = (float) va_arg(ap, double); - break; - - case ufmt_double: - args.doubleValue = va_arg(ap, double); - break; - - case ufmt_date: - args.dateValue = va_arg(ap, UDate); - break; - - default: - break; /* Should never get here */ - } - } - - /* call the handler function */ - handler = g_u_printf_infos[ handlerNum ].handler; - if(handler != 0) { - written += (*handler)(f, &spec.fInfo, &args); - } - else { - /* just echo unknown tags */ - written += u_file_write(alias, patCount, f); - } - } - else { - /* just echo unknown tags */ - written += u_file_write(alias, patCount, f); - } - - /* update the pointer in pattern and continue */ - alias += patCount; - } - - /* return # of UChars written */ - return written; -} - -#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/extra/ustdio/uprintf.h b/icuSources/extra/ustdio/uprintf.h deleted file mode 100644 index 3d29f467..00000000 --- a/icuSources/extra/ustdio/uprintf.h +++ /dev/null @@ -1,70 +0,0 @@ -/* -****************************************************************************** -* -* Copyright (C) 1998-2001, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* -* File uprintf.h -* -* Modification History: -* -* Date Name Description -* 11/19/98 stephen Creation. -* 03/12/99 stephen Modified for new C API. -****************************************************************************** -*/ - -#ifndef UPRINTF_H -#define UPRINTF_H - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_FORMATTING - -#include "unicode/ustdio.h" -#include "ufmt_cmn.h" - -/** - * Struct encapsulating a single uprintf format specification. - */ -struct u_printf_spec_info { - UChar fSpec; /* Conversion specification */ - - int32_t fPrecision; /* Precision */ - int32_t fWidth; /* Width */ - - UChar fPadChar; /* Padding character */ - - UBool fAlt; /* # flag */ - UBool fSpace; /* Space flag */ - UBool fLeft; /* - flag */ - UBool fShowSign; /* + flag */ - UBool fZero; /* 0 flag */ - - UBool fIsLongDouble; /* L flag */ - UBool fIsShort; /* h flag */ - UBool fIsLong; /* l flag */ - UBool fIsLongLong; /* ll flag */ -}; -typedef struct u_printf_spec_info u_printf_spec_info; - - -/** - * A u_printf handler function. - * A u_printf handler is responsible for handling a single u_printf - * format specification, for example 'd' or 's'. - * @param stream The UFILE to which to write output. - * @param info A pointer to a u_printf_spec_info struct containing - * information on the format specification. - * @param args A pointer to the argument data - * @return The number of Unicode characters written to stream. - */ -typedef int32_t (*u_printf_handler) (UFILE *stream, - const u_printf_spec_info *info, - const ufmt_args *args); - -#endif /* #if !UCONFIG_NO_FORMATTING */ - -#endif diff --git a/icuSources/extra/ustdio/uprntf_p.c b/icuSources/extra/ustdio/uprntf_p.c deleted file mode 100644 index 6164cffe..00000000 --- a/icuSources/extra/ustdio/uprntf_p.c +++ /dev/null @@ -1,308 +0,0 @@ -/* -******************************************************************************* -* -* Copyright (C) 1998-1999, International Business Machines -* Corporation and others. All Rights Reserved. -* -******************************************************************************* -* -* File uprntf_p.c -* -* Modification History: -* -* Date Name Description -* 11/23/98 stephen Creation. -* 03/12/99 stephen Modified for new C API. -******************************************************************************* -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_FORMATTING - -#include "uprntf_p.h" -#include "ufmt_cmn.h" - -/* flag characters for uprintf */ -#define FLAG_MINUS 0x002D -#define FLAG_PLUS 0x002B -#define FLAG_SPACE 0x0020 -#define FLAG_POUND 0x0023 -#define FLAG_ZERO 0x0030 -#define FLAG_PAREN 0x0028 - -#define ISFLAG(s) (s) == FLAG_MINUS || \ - (s) == FLAG_PLUS || \ - (s) == FLAG_SPACE || \ - (s) == FLAG_POUND || \ - (s) == FLAG_ZERO || \ - (s) == FLAG_PAREN - -/* special characters for uprintf */ -#define SPEC_ASTERISK 0x002A -#define SPEC_DOLLARSIGN 0x0024 -#define SPEC_PERIOD 0x002E -#define SPEC_PERCENT 0x0025 - -/* unicode digits */ -#define DIGIT_ZERO 0x0030 -#define DIGIT_ONE 0x0031 -#define DIGIT_TWO 0x0032 -#define DIGIT_THREE 0x0033 -#define DIGIT_FOUR 0x0034 -#define DIGIT_FIVE 0x0035 -#define DIGIT_SIX 0x0036 -#define DIGIT_SEVEN 0x0037 -#define DIGIT_EIGHT 0x0038 -#define DIGIT_NINE 0x0039 - -#define ISDIGIT(s) (s) == DIGIT_ZERO || \ - (s) == DIGIT_ONE || \ - (s) == DIGIT_TWO || \ - (s) == DIGIT_THREE || \ - (s) == DIGIT_FOUR || \ - (s) == DIGIT_FIVE || \ - (s) == DIGIT_SIX || \ - (s) == DIGIT_SEVEN || \ - (s) == DIGIT_EIGHT || \ - (s) == DIGIT_NINE - -/* u_printf modifiers */ -#define MOD_H 0x0068 -#define MOD_LOWERL 0x006C -#define MOD_L 0x004C - -#define ISMOD(s) (s) == MOD_H || \ - (s) == MOD_LOWERL || \ - (s) == MOD_L - -/* We parse the argument list in Unicode */ -int32_t -u_printf_parse_spec (const UChar *fmt, - u_printf_spec *spec) -{ - const UChar *s = fmt; - const UChar *backup; - u_printf_spec_info *info = &(spec->fInfo); - - /* initialize spec to default values */ - spec->fWidthPos = -1; - spec->fPrecisionPos = -1; - spec->fArgPos = -1; - - info->fPrecision = -1; - info->fWidth = -1; - info->fSpec = 0x0000; - info->fPadChar = 0x0020; - info->fAlt = FALSE; - info->fSpace = FALSE; - info->fLeft = FALSE; - info->fShowSign = FALSE; - info->fZero = FALSE; - info->fIsLongDouble = FALSE; - info->fIsShort = FALSE; - info->fIsLong = FALSE; - info->fIsLongLong = FALSE; - - /* skip over the initial '%' */ - s++; - - /* Check for positional argument */ - if(ISDIGIT(*s)) { - - /* Save the current position */ - backup = s; - - /* handle positional parameters */ - if(ISDIGIT(*s)) { - spec->fArgPos = (int) (*s++ - DIGIT_ZERO); - - while(ISDIGIT(*s)) { - spec->fArgPos *= 10; - spec->fArgPos += (int) (*s++ - DIGIT_ZERO); - } - } - - /* if there is no '$', don't read anything */ - if(*s != SPEC_DOLLARSIGN) { - spec->fArgPos = -1; - s = backup; - } - /* munge the '$' */ - else - s++; - } - - /* Get any format flags */ - while(ISFLAG(*s)) { - switch(*s++) { - - /* left justify */ - case FLAG_MINUS: - info->fLeft = TRUE; - break; - - /* always show sign */ - case FLAG_PLUS: - info->fShowSign = TRUE; - break; - - /* use space if no sign present */ - case FLAG_SPACE: - info->fShowSign = TRUE; - info->fSpace = TRUE; - break; - - /* use alternate form */ - case FLAG_POUND: - info->fAlt = TRUE; - break; - - /* pad with leading zeroes */ - case FLAG_ZERO: - info->fZero = TRUE; - info->fPadChar = 0x0030; - break; - - /* pad character specified */ - case FLAG_PAREN: - - /* first four characters are hex values for pad char */ - info->fPadChar = (UChar)ufmt_digitvalue(*s++); - info->fPadChar = (UChar)((info->fPadChar * 16) + ufmt_digitvalue(*s++)); - info->fPadChar = (UChar)((info->fPadChar * 16) + ufmt_digitvalue(*s++)); - info->fPadChar = (UChar)((info->fPadChar * 16) + ufmt_digitvalue(*s++)); - - /* final character is ignored */ - s++; - - break; - } - } - - /* Get the width */ - - /* width is specified out of line */ - if(*s == SPEC_ASTERISK) { - - info->fWidth = -2; - - /* Skip the '*' */ - s++; - - /* Save the current position */ - backup = s; - - /* handle positional parameters */ - if(ISDIGIT(*s)) { - spec->fWidthPos = (int) (*s++ - DIGIT_ZERO); - - while(ISDIGIT(*s)) { - spec->fWidthPos *= 10; - spec->fWidthPos += (int) (*s++ - DIGIT_ZERO); - } - } - - /* if there is no '$', don't read anything */ - if(*s != SPEC_DOLLARSIGN) { - spec->fWidthPos = -1; - s = backup; - } - /* munge the '$' */ - else - s++; - } - /* read the width, if present */ - else if(ISDIGIT(*s)){ - info->fWidth = (int) (*s++ - DIGIT_ZERO); - - while(ISDIGIT(*s)) { - info->fWidth *= 10; - info->fWidth += (int) (*s++ - DIGIT_ZERO); - } - } - - /* Get the precision */ - - if(*s == SPEC_PERIOD) { - - /* eat up the '.' */ - s++; - - /* precision is specified out of line */ - if(*s == SPEC_ASTERISK) { - - info->fPrecision = -2; - - /* Skip the '*' */ - s++; - - /* save the current position */ - backup = s; - - /* handle positional parameters */ - if(ISDIGIT(*s)) { - spec->fPrecisionPos = (int) (*s++ - DIGIT_ZERO); - - while(ISDIGIT(*s)) { - spec->fPrecisionPos *= 10; - spec->fPrecisionPos += (int) (*s++ - DIGIT_ZERO); - } - - /* if there is no '$', don't read anything */ - if(*s != SPEC_DOLLARSIGN) { - spec->fPrecisionPos = -1; - s = backup; - } - else { - /* munge the '$' */ - s++; - } - } - } - /* read the precision */ - else if(ISDIGIT(*s)){ - info->fPrecision = (int) (*s++ - DIGIT_ZERO); - - while(ISDIGIT(*s)) { - info->fPrecision *= 10; - info->fPrecision += (int) (*s++ - DIGIT_ZERO); - } - } - } - - /* Get any modifiers */ - if(ISMOD(*s)) { - switch(*s++) { - - /* short */ - case MOD_H: - info->fIsShort = TRUE; - break; - - /* long or long long */ - case MOD_LOWERL: - if(*s == MOD_LOWERL) { - info->fIsLongLong = TRUE; - /* skip over the next 'l' */ - s++; - } - else - info->fIsLong = TRUE; - break; - - /* long double */ - case MOD_L: - info->fIsLongDouble = TRUE; - break; - } - } - - /* finally, get the specifier letter */ - info->fSpec = *s++; - - /* return # of characters in this specifier */ - return (int32_t)(s - fmt); -} - -#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/extra/ustdio/uprntf_p.h b/icuSources/extra/ustdio/uprntf_p.h deleted file mode 100644 index ce671b45..00000000 --- a/icuSources/extra/ustdio/uprntf_p.h +++ /dev/null @@ -1,52 +0,0 @@ -/* -******************************************************************************* -* -* Copyright (C) 1998-1999, International Business Machines -* Corporation and others. All Rights Reserved. -* -******************************************************************************* -* -* File uprntf_p.h -* -* Modification History: -* -* Date Name Description -* 12/02/98 stephen Creation. -* 03/12/99 stephen Modified for new C API. -******************************************************************************* -*/ - -#ifndef UPRNTF_P_H -#define UPRNTF_P_H - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_FORMATTING - -#include "uprintf.h" - -/** - * Struct encapsulating a single uprintf format specification. - */ -struct u_printf_spec { - u_printf_spec_info fInfo; /* Information on this spec */ - int32_t fWidthPos; /* Position of width in arg list */ - int32_t fPrecisionPos; /* Position of precision in arg list */ - int32_t fArgPos; /* Position of data in arg list */ -}; -typedef struct u_printf_spec u_printf_spec; - -/** - * Parse a single u_printf format specifier. - * @param fmt A pointer to a '%' character in a u_printf format specification. - * @param spec A pointer to a u_printf_spec to receive the parsed - * format specifier. - * @return The number of characters contained in this specifier. - */ -int32_t -u_printf_parse_spec (const UChar *fmt, - u_printf_spec *spec); - -#endif /* #if !UCONFIG_NO_FORMATTING */ - -#endif diff --git a/icuSources/extra/ustdio/uscanf.c b/icuSources/extra/ustdio/uscanf.c deleted file mode 100644 index e8913eab..00000000 --- a/icuSources/extra/ustdio/uscanf.c +++ /dev/null @@ -1,1348 +0,0 @@ -/* -****************************************************************************** -* -* Copyright (C) 1998-2003, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* -* File uscanf.c -* -* Modification History: -* -* Date Name Description -* 12/02/98 stephen Creation. -* 03/13/99 stephen Modified for new C API. -****************************************************************************** -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_FORMATTING - -#include "unicode/uchar.h" - -#include "uscanf.h" -#include "uscanf_p.h" -#include "uscanset.h" -#include "unicode/ustdio.h" -#include "ufile.h" -#include "unicode/ustring.h" -#include "locbund.h" -#include "unicode/unum.h" -#include "unicode/udat.h" - -#include "cmemory.h" -#include "ustr_imp.h" - -/* --- Prototypes ---------------------------- */ - -int32_t -u_scanf_simple_percent_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_scanf_ustring_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_scanf_count_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_scanf_integer_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_scanf_uinteger_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_scanf_double_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_scanf_scientific_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_scanf_scidbl_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_scanf_currency_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_scanf_percent_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_scanf_date_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_scanf_time_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_scanf_char_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_scanf_uchar_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_scanf_spellout_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_scanf_hex_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_scanf_octal_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_scanf_pointer_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_scanf_string_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -int32_t -u_scanf_scanset_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -/* ANSI style formatting */ -/* Use US-ASCII characters only for formatting */ - -/* % */ -#define UFMT_SIMPLE_PERCENT {ufmt_simple_percent, u_scanf_simple_percent_handler} -/* s */ -#define UFMT_STRING {ufmt_string, u_scanf_string_handler} -/* c */ -#define UFMT_CHAR {ufmt_string, u_scanf_char_handler} -/* d, i */ -#define UFMT_INT {ufmt_int, u_scanf_integer_handler} -/* u */ -#define UFMT_UINT {ufmt_int, u_scanf_uinteger_handler} -/* o */ -#define UFMT_OCTAL {ufmt_int, u_scanf_octal_handler} -/* x, X */ -#define UFMT_HEX {ufmt_int, u_scanf_hex_handler} -/* f */ -#define UFMT_DOUBLE {ufmt_double, u_scanf_double_handler} -/* e, E */ -#define UFMT_SCIENTIFIC {ufmt_double, u_scanf_scientific_handler} -/* g, G */ -#define UFMT_SCIDBL {ufmt_double, u_scanf_scidbl_handler} -/* n */ -#define UFMT_COUNT {ufmt_count, u_scanf_count_handler} -/* [ */ -#define UFMT_SCANSET {ufmt_string, u_scanf_scanset_handler} /* TODO: Is this also suppose to be ufmt_ustring */ - -/* non-ANSI extensions */ -/* Use US-ASCII characters only for formatting */ - -/* p */ -#define UFMT_POINTER {ufmt_pointer, u_scanf_pointer_handler} -/* D */ -#define UFMT_DATE {ufmt_date, u_scanf_date_handler} -/* T */ -#define UFMT_TIME {ufmt_date, u_scanf_time_handler} -/* V */ -#define UFMT_SPELLOUT {ufmt_double, u_scanf_spellout_handler} -/* P */ -#define UFMT_PERCENT {ufmt_double, u_scanf_percent_handler} -/* M */ -#define UFMT_CURRENCY {ufmt_double, u_scanf_currency_handler} -/* K */ -#define UFMT_UCHAR {ufmt_uchar, u_scanf_uchar_handler} -/* U */ -#define UFMT_USTRING {ufmt_ustring, u_scanf_ustring_handler} - - -#define UFMT_EMPTY {ufmt_empty, NULL} - -struct u_scanf_info { - ufmt_type_info info; - u_scanf_handler handler; -}; -typedef struct u_scanf_info u_scanf_info; - -/* Use US-ASCII characters only for formatting. Most codepages have - characters 20-7F from Unicode. Using any other codepage specific - characters will make it very difficult to format the string on - non-Unicode machines */ -static const u_scanf_info g_u_scanf_infos[108] = { -/* 0x20 */ - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_SIMPLE_PERCENT,UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - -/* 0x30 */ - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - -/* 0x40 */ - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_DATE, UFMT_SCIENTIFIC, UFMT_EMPTY, UFMT_SCIDBL, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_UCHAR, - UFMT_EMPTY, UFMT_CURRENCY, UFMT_EMPTY, UFMT_EMPTY, - -/* 0x50 */ - UFMT_PERCENT, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_TIME, UFMT_USTRING, UFMT_SPELLOUT, UFMT_EMPTY, - UFMT_HEX, UFMT_EMPTY, UFMT_EMPTY, UFMT_SCANSET, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - -/* 0x60 */ - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_CHAR, - UFMT_INT, UFMT_SCIENTIFIC, UFMT_DOUBLE, UFMT_SCIDBL, - UFMT_EMPTY, UFMT_INT, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_COUNT, UFMT_OCTAL, - -/* 0x70 */ - UFMT_POINTER, UFMT_EMPTY, UFMT_EMPTY, UFMT_STRING, - UFMT_EMPTY, UFMT_UINT, UFMT_EMPTY, UFMT_EMPTY, - UFMT_HEX, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, - UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, -}; - -#define USCANF_NUM_FMT_HANDLERS sizeof(g_u_scanf_infos) - -/* We do not use handlers for 0-0x1f */ -#define USCANF_BASE_FMT_HANDLERS 0x20 - -int32_t -u_fscanf(UFILE *f, - const char *patternSpecification, - ... ) -{ - va_list ap; - int32_t converted; - - va_start(ap, patternSpecification); - converted = u_vfscanf(f, patternSpecification, ap); - va_end(ap); - - return converted; -} - -int32_t -u_fscanf_u(UFILE *f, - const UChar *patternSpecification, - ... ) -{ - va_list ap; - int32_t converted; - - va_start(ap, patternSpecification); - converted = u_vfscanf_u(f, patternSpecification, ap); - va_end(ap); - - return converted; -} - -U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ -u_vfscanf(UFILE *f, - const char *patternSpecification, - va_list ap) -{ - int32_t converted; - UChar *pattern; - UChar buffer[UFMT_DEFAULT_BUFFER_SIZE]; - int32_t size = (int32_t)strlen(patternSpecification) + 1; - - /* convert from the default codepage to Unicode */ - if (size >= MAX_UCHAR_BUFFER_SIZE(buffer)) { - pattern = (UChar *)uprv_malloc(size * sizeof(UChar)); - if(pattern == 0) { - return 0; - } - } - else { - pattern = buffer; - } - ufmt_defaultCPToUnicode(patternSpecification, size, pattern, size); - - /* do the work */ - converted = u_vfscanf_u(f, pattern, ap); - - /* clean up */ - if (pattern != buffer) { - uprv_free(pattern); - } - - return converted; -} - -static int32_t -u_scanf_skip_leading_ws(UFILE *stream, - UChar pad) -{ - UChar c; - int32_t count = 0; - - /* skip all leading ws in the stream */ - while( ((c = u_fgetc(stream)) != U_EOF) && (c == pad || u_isWhitespace(c)) ) - ++count; - - /* put the final character back on the stream */ - if(c != U_EOF) - u_fungetc(c, stream); - - return count; -} - -int32_t -u_scanf_simple_percent_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - /* make sure the next character in the stream is a percent */ - if(u_fgetc(stream) != 0x0025) - return -1; - else - return 0; -} - -int32_t -u_scanf_string_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - UChar c; - int32_t count; - const UChar *source; - UConverter *conv; - UErrorCode status = U_ZERO_ERROR; - char *arg = (char*)(args[0].ptrValue); - char *alias = arg; - char *limit; - - /* skip all ws in the stream */ - u_scanf_skip_leading_ws(stream, info->fPadChar); - - /* get the string one character at a time, truncating to the width */ - count = 0; - - /* open the default converter */ - conv = u_getDefaultConverter(&status); - - if(U_FAILURE(status)) - return -1; - - while( ((c = u_fgetc(stream)) != U_EOF) && - (c != info->fPadChar && !u_isWhitespace(c)) && - (info->fWidth == -1 || count < info->fWidth) ) - { - - /* put the character from the stream onto the target */ - source = &c; - /* Since we do this one character at a time, do it this way. */ - limit = alias + ucnv_getMaxCharSize(conv); - - /* convert the character to the default codepage */ - ucnv_fromUnicode(conv, &alias, limit, &source, source + 1, - NULL, TRUE, &status); - - if(U_FAILURE(status)) { - /* clean up */ - u_releaseDefaultConverter(conv); - return -1; - } - - /* increment the count */ - ++count; - } - - /* put the final character we read back on the stream */ - if(c != U_EOF) - u_fungetc(c, stream); - - /* add the terminator */ - *alias = 0x00; - - /* clean up */ - u_releaseDefaultConverter(conv); - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_scanf_ustring_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - UChar c; - int32_t count; - UChar *arg = (UChar*)(args[0].ptrValue); - UChar *alias = arg; - - /* skip all ws in the stream */ - u_scanf_skip_leading_ws(stream, info->fPadChar); - - /* get the string one character at a time, truncating to the width */ - count = 0; - - while( ((c = u_fgetc(stream)) != U_EOF) && - (c != info->fPadChar && ! u_isWhitespace(c)) && - (info->fWidth == -1 || count < info->fWidth) ) { - - /* put the character from the stream onto the target */ - *alias++ = c; - - /* increment the count */ - ++count; - } - - /* put the final character we read back on the stream */ - if(c != U_EOF) - u_fungetc(c, stream); - - /* add the terminator */ - *alias = 0x0000; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_scanf_count_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - int *converted = (int*)(args[0].ptrValue); - - /* in the special case of count, the u_scanf_spec_info's width */ - /* will contain the # of items converted thus far */ - *converted = info->fWidth; - - /* we converted 0 args */ - return 0; -} - -int32_t -u_scanf_integer_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - int32_t len; - long *num = (long*) (args[0].ptrValue); - UNumberFormat *format; - int32_t parsePos = 0; - UErrorCode status = U_ZERO_ERROR; - - - /* skip all ws in the stream */ - u_scanf_skip_leading_ws(stream, info->fPadChar); - - /* fill the stream's internal buffer */ - ufile_fill_uchar_buffer(stream); - - /* determine the size of the stream's buffer */ - len = stream->fUCLimit - stream->fUCPos; - - /* truncate to the width, if specified */ - if(info->fWidth != -1) - len = ufmt_min(len, info->fWidth); - - /* get the formatter */ - format = u_locbund_getNumberFormat(stream->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* parse the number */ - *num = unum_parse(format, stream->fUCPos, len, &parsePos, &status); - - /* mask off any necessary bits */ - if(info->fIsShort) - *num &= UINT16_MAX; - else if(! info->fIsLong || ! info->fIsLongLong) - *num &= UINT32_MAX; - - /* update the stream's position to reflect consumed data */ - stream->fUCPos += parsePos; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_scanf_uinteger_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - ufmt_args uint_args; - int32_t converted_args; - uint32_t *num = (uint32_t*) (args[0].ptrValue); - double currDouble; - - uint_args.ptrValue = &currDouble; - converted_args = u_scanf_double_handler(stream, info, &uint_args, fmt, consumed); - - *num = (uint32_t)currDouble; - - return converted_args; -} - -int32_t -u_scanf_double_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - int32_t len; - double *num = (double*) (args[0].ptrValue); - UNumberFormat *format; - int32_t parsePos = 0; - UErrorCode status = U_ZERO_ERROR; - - - /* skip all ws in the stream */ - u_scanf_skip_leading_ws(stream, info->fPadChar); - - /* fill the stream's internal buffer */ - ufile_fill_uchar_buffer(stream); - - /* determine the size of the stream's buffer */ - len = stream->fUCLimit - stream->fUCPos; - - /* truncate to the width, if specified */ - if(info->fWidth != -1) - len = ufmt_min(len, info->fWidth); - - /* get the formatter */ - format = u_locbund_getNumberFormat(stream->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* parse the number */ - *num = unum_parseDouble(format, stream->fUCPos, len, &parsePos, &status); - - /* mask off any necessary bits */ - /* if(! info->fIsLong_double) - num &= DBL_MAX;*/ - - /* update the stream's position to reflect consumed data */ - stream->fUCPos += parsePos; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_scanf_scientific_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - int32_t len; - double *num = (double*) (args[0].ptrValue); - UNumberFormat *format; - int32_t parsePos = 0; - UErrorCode status = U_ZERO_ERROR; - - - /* skip all ws in the stream */ - u_scanf_skip_leading_ws(stream, info->fPadChar); - - /* fill the stream's internal buffer */ - ufile_fill_uchar_buffer(stream); - - /* determine the size of the stream's buffer */ - len = stream->fUCLimit - stream->fUCPos; - - /* truncate to the width, if specified */ - if(info->fWidth != -1) - len = ufmt_min(len, info->fWidth); - - /* get the formatter */ - format = u_locbund_getScientificFormat(stream->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* parse the number */ - *num = unum_parseDouble(format, stream->fUCPos, len, &parsePos, &status); - - /* mask off any necessary bits */ - /* if(! info->fIsLong_double) - num &= DBL_MAX;*/ - - /* update the stream's position to reflect consumed data */ - stream->fUCPos += parsePos; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_scanf_scidbl_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - int32_t len; - double *num = (double*) (args[0].ptrValue); - UNumberFormat *scientificFormat, *genericFormat; - /*int32_t scientificResult, genericResult;*/ - double scientificResult, genericResult; - int32_t scientificParsePos = 0, genericParsePos = 0; - UErrorCode scientificStatus = U_ZERO_ERROR; - UErrorCode genericStatus = U_ZERO_ERROR; - UBool useScientific; - - - /* since we can't determine by scanning the characters whether */ - /* a number was formatted in the 'f' or 'g' styles, parse the */ - /* string with both formatters, and assume whichever one */ - /* parsed the most is the correct formatter to use */ - - - /* skip all ws in the stream */ - u_scanf_skip_leading_ws(stream, info->fPadChar); - - /* fill the stream's internal buffer */ - ufile_fill_uchar_buffer(stream); - - /* determine the size of the stream's buffer */ - len = stream->fUCLimit - stream->fUCPos; - - /* truncate to the width, if specified */ - if(info->fWidth != -1) - len = ufmt_min(len, info->fWidth); - - /* get the formatters */ - scientificFormat = u_locbund_getScientificFormat(stream->fBundle); - genericFormat = u_locbund_getNumberFormat(stream->fBundle); - - /* handle error */ - if(scientificFormat == 0 || genericFormat == 0) - return 0; - - /* parse the number using each format*/ - - scientificResult = unum_parseDouble(scientificFormat, stream->fUCPos, len, - &scientificParsePos, &scientificStatus); - - genericResult = unum_parseDouble(genericFormat, stream->fUCPos, len, - &genericParsePos, &genericStatus); - - /* determine which parse made it farther */ - useScientific = (UBool)(scientificParsePos > genericParsePos); - - /* stash the result in num */ - *num = useScientific ? scientificResult : genericResult; - - /* mask off any necessary bits */ - /* if(! info->fIsLong_double) - num &= DBL_MAX;*/ - - /* update the stream's position to reflect consumed data */ - stream->fUCPos += useScientific ? scientificParsePos : genericParsePos; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_scanf_currency_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - int32_t len; - double *num = (double*) (args[0].ptrValue); - UNumberFormat *format; - int32_t parsePos = 0; - UErrorCode status = U_ZERO_ERROR; - - - /* skip all ws in the stream */ - u_scanf_skip_leading_ws(stream, info->fPadChar); - - /* fill the stream's internal buffer */ - ufile_fill_uchar_buffer(stream); - - /* determine the size of the stream's buffer */ - len = stream->fUCLimit - stream->fUCPos; - - /* truncate to the width, if specified */ - if(info->fWidth != -1) - len = ufmt_min(len, info->fWidth); - - /* get the formatter */ - format = u_locbund_getCurrencyFormat(stream->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* parse the number */ - *num = unum_parseDouble(format, stream->fUCPos, len, &parsePos, &status); - - /* mask off any necessary bits */ - /* if(! info->fIsLong_double) - num &= DBL_MAX;*/ - - /* update the stream's position to reflect consumed data */ - stream->fUCPos += parsePos; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_scanf_percent_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - int32_t len; - double *num = (double*) (args[0].ptrValue); - UNumberFormat *format; - int32_t parsePos = 0; - UErrorCode status = U_ZERO_ERROR; - - - /* skip all ws in the stream */ - u_scanf_skip_leading_ws(stream, info->fPadChar); - - /* fill the stream's internal buffer */ - ufile_fill_uchar_buffer(stream); - - /* determine the size of the stream's buffer */ - len = stream->fUCLimit - stream->fUCPos; - - /* truncate to the width, if specified */ - if(info->fWidth != -1) - len = ufmt_min(len, info->fWidth); - - /* get the formatter */ - format = u_locbund_getPercentFormat(stream->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* parse the number */ - *num = unum_parseDouble(format, stream->fUCPos, len, &parsePos, &status); - - /* mask off any necessary bits */ - /* if(! info->fIsLong_double) - num &= DBL_MAX;*/ - - /* update the stream's position to reflect consumed data */ - stream->fUCPos += parsePos; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_scanf_date_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - int32_t len; - UDate *date = (UDate*) (args[0].ptrValue); - UDateFormat *format; - int32_t parsePos = 0; - UErrorCode status = U_ZERO_ERROR; - - - /* skip all ws in the stream */ - u_scanf_skip_leading_ws(stream, info->fPadChar); - - /* fill the stream's internal buffer */ - ufile_fill_uchar_buffer(stream); - - /* determine the size of the stream's buffer */ - len = stream->fUCLimit - stream->fUCPos; - - /* truncate to the width, if specified */ - if(info->fWidth != -1) - len = ufmt_min(len, info->fWidth); - - /* get the formatter */ - format = u_locbund_getDateFormat(stream->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* parse the number */ - *date = udat_parse(format, stream->fUCPos, len, &parsePos, &status); - - /* update the stream's position to reflect consumed data */ - stream->fUCPos += parsePos; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_scanf_time_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - int32_t len; - UDate *time = (UDate*) (args[0].ptrValue); - UDateFormat *format; - int32_t parsePos = 0; - UErrorCode status = U_ZERO_ERROR; - - - /* skip all ws in the stream */ - u_scanf_skip_leading_ws(stream, info->fPadChar); - - /* fill the stream's internal buffer */ - ufile_fill_uchar_buffer(stream); - - /* determine the size of the stream's buffer */ - len = stream->fUCLimit - stream->fUCPos; - - /* truncate to the width, if specified */ - if(info->fWidth != -1) - len = ufmt_min(len, info->fWidth); - - /* get the formatter */ - format = u_locbund_getTimeFormat(stream->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* parse the number */ - *time = udat_parse(format, stream->fUCPos, len, &parsePos, &status); - - /* update the stream's position to reflect consumed data */ - stream->fUCPos += parsePos; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_scanf_char_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - UChar uc = 0; - char *result; - char *c = (char*)(args[0].ptrValue); - - /* skip all ws in the stream */ - u_scanf_skip_leading_ws(stream, info->fPadChar); - - /* get the character from the stream, truncating to the width */ - if(info->fWidth == -1 || info->fWidth > 1) - uc = u_fgetc(stream); - - /* handle EOF */ - if(uc == U_EOF) - return -1; - - /* convert the character to the default codepage */ - result = ufmt_unicodeToDefaultCP(&uc, 1); - *c = result[0]; - - /* clean up */ - uprv_free(result); - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_scanf_uchar_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - UChar *c = (UChar*)(args[0].ptrValue); - - /* skip all ws in the stream */ - u_scanf_skip_leading_ws(stream, info->fPadChar); - - /* get the character from the stream, truncating to the width */ - if(info->fWidth == -1 || info->fWidth > 1) - *c = u_fgetc(stream); - - /* handle EOF */ - if(*c == U_EOF) - return -1; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_scanf_spellout_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - int32_t len; - double *num = (double*) (args[0].ptrValue); - UNumberFormat *format; - int32_t parsePos = 0; - UErrorCode status = U_ZERO_ERROR; - - - /* skip all ws in the stream */ - u_scanf_skip_leading_ws(stream, info->fPadChar); - - /* fill the stream's internal buffer */ - ufile_fill_uchar_buffer(stream); - - /* determine the size of the stream's buffer */ - len = stream->fUCLimit - stream->fUCPos; - - /* truncate to the width, if specified */ - if(info->fWidth != -1) - len = ufmt_min(len, info->fWidth); - - /* get the formatter */ - format = u_locbund_getSpelloutFormat(stream->fBundle); - - /* handle error */ - if(format == 0) - return 0; - - /* parse the number */ - *num = unum_parseDouble(format, stream->fUCPos, len, &parsePos, &status); - - /* mask off any necessary bits */ - /* if(! info->fIsLong_double) - num &= DBL_MAX;*/ - - /* update the stream's position to reflect consumed data */ - stream->fUCPos += parsePos; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_scanf_hex_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - int32_t len; - long *num = (long*) (args[0].ptrValue); - - - /* skip all ws in the stream */ - u_scanf_skip_leading_ws(stream, info->fPadChar); - - /* fill the stream's internal buffer */ - ufile_fill_uchar_buffer(stream); - - /* determine the size of the stream's buffer */ - len = stream->fUCLimit - stream->fUCPos; - - /* truncate to the width, if specified */ - if(info->fWidth != -1) - len = ufmt_min(len, info->fWidth); - - /* check for alternate form */ - if( *(stream->fUCPos) == 0x0030 && - (*(stream->fUCPos + 1) == 0x0078 || *(stream->fUCPos + 1) == 0x0058) ) { - - /* skip the '0' and 'x' or 'X' if present */ - stream->fUCPos += 2; - len -= 2; - } - - /* parse the number */ - *num = ufmt_utol(stream->fUCPos, &len, 16); - - /* update the stream's position to reflect consumed data */ - stream->fUCPos += len; - - /* mask off any necessary bits */ - if(info->fIsShort) - *num &= UINT16_MAX; - else if(! info->fIsLong || ! info->fIsLongLong) - *num &= UINT32_MAX; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_scanf_octal_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - int32_t len; - long *num = (long*) (args[0].ptrValue); - - - /* skip all ws in the stream */ - u_scanf_skip_leading_ws(stream, info->fPadChar); - - /* fill the stream's internal buffer */ - ufile_fill_uchar_buffer(stream); - - /* determine the size of the stream's buffer */ - len = stream->fUCLimit - stream->fUCPos; - - /* truncate to the width, if specified */ - if(info->fWidth != -1) - len = ufmt_min(len, info->fWidth); - - /* parse the number */ - *num = ufmt_utol(stream->fUCPos, &len, 8); - - /* update the stream's position to reflect consumed data */ - stream->fUCPos += len; - - /* mask off any necessary bits */ - if(info->fIsShort) - *num &= UINT16_MAX; - else if(! info->fIsLong || ! info->fIsLongLong) - *num &= UINT32_MAX; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_scanf_pointer_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - int32_t len; - void *p = (void*)(args[0].ptrValue); - - - /* skip all ws in the stream */ - u_scanf_skip_leading_ws(stream, info->fPadChar); - - /* fill the stream's internal buffer */ - ufile_fill_uchar_buffer(stream); - - /* determine the size of the stream's buffer */ - len = stream->fUCLimit - stream->fUCPos; - - /* truncate to the width, if specified */ - if(info->fWidth != -1) - len = ufmt_min(len, info->fWidth); - - /* parse the pointer - cast to void** to assign to *p */ - *(void**)p = (void*) ufmt_utol(stream->fUCPos, &len, 16); - - /* update the stream's position to reflect consumed data */ - stream->fUCPos += len; - - /* we converted 1 arg */ - return 1; -} - -int32_t -u_scanf_scanset_handler(UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed) -{ - u_scanf_scanset scanset; - int32_t len; - UBool success; - UChar c; - UChar *s = (UChar*) (args[0].ptrValue); - UChar *alias, *limit; - - - /* fill the stream's internal buffer */ - ufile_fill_uchar_buffer(stream); - - /* determine the size of the stream's buffer */ - len = stream->fUCLimit - stream->fUCPos; - - /* truncate to the width, if specified */ - if(info->fWidth != -1) - len = ufmt_min(len, info->fWidth); - - /* alias the target */ - alias = s; - limit = alias + len; - - /* parse the scanset from the fmt string */ - *consumed = u_strlen(fmt); - success = u_scanf_scanset_init(&scanset, fmt, consumed); - - /* increment consumed by one to eat the final ']' */ - ++(*consumed); - - /* verify that the parse was successful and the converter opened */ - if(! success) - return -1; - - /* grab characters one at a time and make sure they are in the scanset */ - while( (c = u_fgetc(stream)) != U_EOF && alias < limit) { - if(u_scanf_scanset_in(&scanset, c)) { - *(alias++) = c; - } - else { - /* if the character's not in the scanset, break out */ - break; - } - } - - /* put the final character we read back on the stream */ - if(c != U_EOF) - u_fungetc(c, stream); - - /* if we didn't match at least 1 character, fail */ - if(alias == s) - return -1; - /* otherwise, add the terminator */ - else - *alias = 0x00; - - /* we converted 1 arg */ - return 1; -} - - -#define UP_PERCENT 0x0025 - -U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ -u_vfscanf_u(UFILE *f, - const UChar *patternSpecification, - va_list ap) -{ - u_scanf_spec spec; - const UChar *alias; - int32_t count, converted, temp; - uint16_t handlerNum; - - ufmt_args args; - - ufmt_type_info info; - u_scanf_handler handler; - - /* alias the pattern */ - alias = patternSpecification; - - /* haven't converted anything yet */ - converted = 0; - - /* iterate through the pattern */ - for(;;) { - - /* match any characters up to the next '%' */ - while(*alias != UP_PERCENT && *alias != 0x0000 && u_fgetc(f) == *alias) { - alias++; - } - - /* if we aren't at a '%', or if we're at end of string, break*/ - if(*alias != UP_PERCENT || *alias == 0x0000) - break; - - /* parse the specifier */ - count = u_scanf_parse_spec(alias, &spec); - - /* update the pointer in pattern */ - alias += count; - - /* skip the argument, if necessary */ - if(spec.fSkipArg) - args.ptrValue = va_arg(ap, int*); - - handlerNum = (uint16_t)(spec.fInfo.fSpec - USCANF_BASE_FMT_HANDLERS); - if (handlerNum < USCANF_NUM_FMT_HANDLERS) { - /* query the info function for argument information */ - info = g_u_scanf_infos[ handlerNum ].info; - if(info > ufmt_simple_percent) { - switch(info) { - - case ufmt_count: - args.intValue = va_arg(ap, int); - /* set the spec's width to the # of items converted */ - spec.fInfo.fWidth = converted; - break; - - case ufmt_char: - case ufmt_uchar: - case ufmt_int: - args.ptrValue = va_arg(ap, int*); - break; - - case ufmt_wchar: - args.ptrValue = va_arg(ap, wchar_t*); - break; - - case ufmt_string: - args.ptrValue = va_arg(ap, char*); - break; - - case ufmt_wstring: - args.ptrValue = va_arg(ap, wchar_t*); - break; - - case ufmt_pointer: - args.ptrValue = va_arg(ap, void*); - break; - - case ufmt_float: - args.ptrValue = va_arg(ap, float*); - break; - - case ufmt_double: - args.ptrValue = va_arg(ap, double*); - break; - - case ufmt_date: - args.ptrValue = va_arg(ap, UDate*); - break; - - case ufmt_ustring: - args.ptrValue = va_arg(ap, UChar*); - break; - - default: - break; /* Should never get here */ - } - } - /* call the handler function */ - handler = g_u_scanf_infos[ handlerNum ].handler; - if(handler != 0) { - - /* reset count */ - count = 0; - - temp = (*handler)(f, &spec.fInfo, &args, alias, &count); - - /* if the handler encountered an error condition, break */ - if(temp == -1) - break; - - /* add to the # of items converted */ - converted += temp; - - /* update the pointer in pattern */ - alias += count; - } - /* else do nothing */ - } - /* else do nothing */ - - /* just ignore unknown tags */ - - } - - /* return # of items converted */ - return converted; -} - -#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/extra/ustdio/uscanf.h b/icuSources/extra/ustdio/uscanf.h deleted file mode 100644 index f9783a94..00000000 --- a/icuSources/extra/ustdio/uscanf.h +++ /dev/null @@ -1,69 +0,0 @@ -/* -****************************************************************************** -* -* Copyright (C) 1998-2001, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* -* File uscanf.h -* -* Modification History: -* -* Date Name Description -* 12/02/98 stephen Creation. -* 03/13/99 stephen Modified for new C API. -****************************************************************************** -*/ - -#ifndef USCANF_H -#define USCANF_H - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_FORMATTING - -#include "unicode/ustdio.h" -#include "ufmt_cmn.h" - -/** - * Struct encapsulating a single uscanf format specification. - */ -struct u_scanf_spec_info { - UChar fSpec; /* Format specification */ - - int32_t fWidth; /* Width */ - - UChar fPadChar; /* Padding character */ - - UBool fIsLongDouble; /* L flag */ - UBool fIsShort; /* h flag */ - UBool fIsLong; /* l flag */ - UBool fIsLongLong; /* ll flag */ -}; -typedef struct u_scanf_spec_info u_scanf_spec_info; - -/** - * A u_scanf handler function. - * A u_scanf handler is responsible for handling a single u_scanf - * format specification, for example 'd' or 's'. - * @param stream The UFILE to which to write output. - * @param info A pointer to a u_scanf_spec_info struct containing - * information on the format specification. - * @param args A pointer to the argument data - * @param fmt A pointer to the first character in the format string - * following the spec. - * @param consumed On output, set to the number of characters consumed - * in fmt. - * @return The number of arguments converted and assigned, or -1 if an - * error occurred. - */ -typedef int32_t (*u_scanf_handler) (UFILE *stream, - const u_scanf_spec_info *info, - ufmt_args *args, - const UChar *fmt, - int32_t *consumed); - -#endif /* #if !UCONFIG_NO_FORMATTING */ - -#endif diff --git a/icuSources/extra/ustdio/uscanf_p.c b/icuSources/extra/ustdio/uscanf_p.c deleted file mode 100644 index 0ed8a021..00000000 --- a/icuSources/extra/ustdio/uscanf_p.c +++ /dev/null @@ -1,188 +0,0 @@ -/* -******************************************************************************* -* -* Copyright (C) 1998-2001, International Business Machines -* Corporation and others. All Rights Reserved. -* -******************************************************************************* -* -* File uscnnf_p.c -* -* Modification History: -* -* Date Name Description -* 12/02/98 stephen Creation. -* 03/13/99 stephen Modified for new C API. -******************************************************************************* -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_FORMATTING - -#include "uscanf_p.h" -#include "ufmt_cmn.h" - -/* flag characters for u_scanf */ -#define FLAG_ASTERISK 0x002A -#define FLAG_PAREN 0x0028 - -#define ISFLAG(s) (s) == FLAG_ASTERISK || \ - (s) == FLAG_PAREN - -/* special characters for u_scanf */ -#define SPEC_DOLLARSIGN 0x0024 - -/* unicode digits */ -#define DIGIT_ZERO 0x0030 -#define DIGIT_ONE 0x0031 -#define DIGIT_TWO 0x0032 -#define DIGIT_THREE 0x0033 -#define DIGIT_FOUR 0x0034 -#define DIGIT_FIVE 0x0035 -#define DIGIT_SIX 0x0036 -#define DIGIT_SEVEN 0x0037 -#define DIGIT_EIGHT 0x0038 -#define DIGIT_NINE 0x0039 - -#define ISDIGIT(s) (s) == DIGIT_ZERO || \ - (s) == DIGIT_ONE || \ - (s) == DIGIT_TWO || \ - (s) == DIGIT_THREE || \ - (s) == DIGIT_FOUR || \ - (s) == DIGIT_FIVE || \ - (s) == DIGIT_SIX || \ - (s) == DIGIT_SEVEN || \ - (s) == DIGIT_EIGHT || \ - (s) == DIGIT_NINE - -/* u_scanf modifiers */ -#define MOD_H 0x0068 -#define MOD_LOWERL 0x006C -#define MOD_L 0x004C - -#define ISMOD(s) (s) == MOD_H || \ - (s) == MOD_LOWERL || \ - (s) == MOD_L - -/* We parse the argument list in Unicode */ -int32_t -u_scanf_parse_spec (const UChar *fmt, - u_scanf_spec *spec) -{ - const UChar *s = fmt; - const UChar *backup; - u_scanf_spec_info *info = &(spec->fInfo); - - /* initialize spec to default values */ - spec->fArgPos = -1; - spec->fSkipArg = FALSE; - - info->fSpec = 0x0000; - info->fWidth = -1; - info->fPadChar = 0x0020; - info->fIsLongDouble = FALSE; - info->fIsShort = FALSE; - info->fIsLong = FALSE; - info->fIsLongLong = FALSE; - - - /* skip over the initial '%' */ - s++; - - /* Check for positional argument */ - if(ISDIGIT(*s)) { - - /* Save the current position */ - backup = s; - - /* handle positional parameters */ - if(ISDIGIT(*s)) { - spec->fArgPos = (int) (*s++ - DIGIT_ZERO); - - while(ISDIGIT(*s)) { - spec->fArgPos *= 10; - spec->fArgPos += (int) (*s++ - DIGIT_ZERO); - } - } - - /* if there is no '$', don't read anything */ - if(*s != SPEC_DOLLARSIGN) { - spec->fArgPos = -1; - s = backup; - } - /* munge the '$' */ - else - s++; - } - - /* Get any format flags */ - while(ISFLAG(*s)) { - switch(*s++) { - - /* skip argument */ - case FLAG_ASTERISK: - spec->fSkipArg = TRUE; - break; - - /* pad character specified */ - case FLAG_PAREN: - - /* first four characters are hex values for pad char */ - info->fPadChar = (UChar)ufmt_digitvalue(*s++); - info->fPadChar = (UChar)((info->fPadChar * 16) + ufmt_digitvalue(*s++)); - info->fPadChar = (UChar)((info->fPadChar * 16) + ufmt_digitvalue(*s++)); - info->fPadChar = (UChar)((info->fPadChar * 16) + ufmt_digitvalue(*s++)); - - /* final character is ignored */ - s++; - - break; - } - } - - /* Get the width */ - if(ISDIGIT(*s)){ - info->fWidth = (int) (*s++ - DIGIT_ZERO); - - while(ISDIGIT(*s)) { - info->fWidth *= 10; - info->fWidth += (int) (*s++ - DIGIT_ZERO); - } - } - - /* Get any modifiers */ - if(ISMOD(*s)) { - switch(*s++) { - - /* short */ - case MOD_H: - info->fIsShort = TRUE; - break; - - /* long or long long */ - case MOD_LOWERL: - if(*s == MOD_LOWERL) { - info->fIsLongLong = TRUE; - /* skip over the next 'l' */ - s++; - } - else - info->fIsLong = TRUE; - break; - - /* long double */ - case MOD_L: - info->fIsLongDouble = TRUE; - break; - } - } - - /* finally, get the specifier letter */ - info->fSpec = *s++; - - /* return # of characters in this specifier */ - return (int32_t)(s - fmt); -} - -#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/extra/ustdio/uscanf_p.h b/icuSources/extra/ustdio/uscanf_p.h deleted file mode 100644 index 04fb8441..00000000 --- a/icuSources/extra/ustdio/uscanf_p.h +++ /dev/null @@ -1,51 +0,0 @@ -/* -******************************************************************************* -* -* Copyright (C) 1998-2001, International Business Machines -* Corporation and others. All Rights Reserved. -* -******************************************************************************* -* -* File uscnf_p.h -* -* Modification History: -* -* Date Name Description -* 12/02/98 stephen Creation. -* 03/13/99 stephen Modified for new C API. -******************************************************************************* -*/ - -#ifndef _USCANF_P -#define _USCANF_P - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_FORMATTING - -#include "uscanf.h" - -/** - * Struct encapsulating a single u_scanf format specification. - */ -struct u_scanf_spec { - u_scanf_spec_info fInfo; /* Information on this spec */ - int32_t fArgPos; /* Position of data in arg list */ - UBool fSkipArg; /* TRUE if arg should be skipped */ -}; -typedef struct u_scanf_spec u_scanf_spec; - -/** - * Parse a single u_scanf format specifier. - * @param fmt A pointer to a '%' character in a u_scanf format specification. - * @param spec A pointer to a u_scanf_spec to receive the parsed - * format specifier. - * @return The number of characters contained in this specifier. - */ -int32_t -u_scanf_parse_spec (const UChar *fmt, - u_scanf_spec *spec); - -#endif /* #if !UCONFIG_NO_FORMATTING */ - -#endif diff --git a/icuSources/extra/ustdio/uscanset.c b/icuSources/extra/ustdio/uscanset.c deleted file mode 100644 index 5f6fca8c..00000000 --- a/icuSources/extra/ustdio/uscanset.c +++ /dev/null @@ -1,188 +0,0 @@ -/* -****************************************************************************** -* -* Copyright (C) 1998-2001, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* -* File uscanset.c -* -* Modification History: -* -* Date Name Description -* 12/03/98 stephen Creation. -* 03/13/99 stephen Modified for new C API. -****************************************************************************** -*/ - -#include "uscanset.h" - - -static UBool -u_scanf_scanset_add(u_scanf_scanset *scanset, - UChar c) -{ - if(scanset->single_count == U_SCANF_MAX_SCANSET_SIZE - 1) - return FALSE; - - scanset->singles[scanset->single_count++] = c; - - return TRUE; -} - -static UBool -u_scanf_scanset_addrange(u_scanf_scanset *scanset, - UChar start, - UChar end) -{ - if(scanset->pair_count == U_SCANF_MAX_SCANSET_SIZE - 1) - return FALSE; - - if (end < start) { - /* swap chars */ - UChar temp = end; - end = start; - start = temp; - } - - scanset->pairs[scanset->pair_count].start = start; - scanset->pairs[scanset->pair_count].end = end; - scanset->pair_count++; - - return TRUE; -} - -UBool -u_scanf_scanset_init(u_scanf_scanset *scanset, - const UChar *s, - int32_t *len) -{ - UChar c; - const UChar *limit; - int32_t count; - UBool result = FALSE; - - - /* set up parameters */ - limit = s + *len; - count = 0; - - /* initialize to defaults */ - scanset->single_count = 0; - scanset->pair_count = 0; - scanset->is_inclusive = TRUE; - - /* check to see if this is an inclusive or exclusive scanset */ - if(*s == 0x005E) { /* '^' */ - scanset->is_inclusive = FALSE; - - /* increment s and count */ - ++s; - ++count; - } - - /* if ']' is the first character, add it */ - else if(*s == 0x005D) { - result = u_scanf_scanset_add(scanset, *s++); - - /* increment count */ - ++count; - } - - /* if the first character is '^' and the second is ']', add ']' */ - if( ! scanset->is_inclusive && *s == 0x005D) { - result = u_scanf_scanset_add(scanset, *s++); - - /* increment count */ - ++count; - } - - /* add characters until a ']' is seen, adding ranges as necessary */ - while(s < limit) { - - /* grab the current character */ - c = *s++; - - /* if it's a ']', we're done */ - if(c == 0x005D) - break; - - /* check if this is a range */ - if(*s == 0x002D && *(s+1) != 0x005D) { - result = u_scanf_scanset_addrange(scanset, c, *(s+1)); - - /* increment count and s */ - s += 2; - count += 2; - } - else { - /* otherwise, just add the character */ - result = u_scanf_scanset_add(scanset, c); - } - - /* increment count */ - ++count; - } - - /* update length to reflect # of characters consumed */ - *len = count; - return result; -} - -UBool -u_scanf_scanset_in(u_scanf_scanset *scanset, - UChar c) -{ - int i; - - /* if this is an inclusive scanset, make sure c is in it */ - if(scanset->is_inclusive) { - - /* check the single chars first*/ - for(i = 0; i < scanset->single_count; ++i) { - if(c == scanset->singles[i]) { - return TRUE; - } - } - - /* check the pairs */ - for(i = 0; i < scanset->pair_count; ++i) { - if(c >= scanset->pairs[i].start && c <= scanset->pairs[i].end) { - return TRUE; - } - } - - /* didn't find it, so c isn't in set */ - return FALSE; - } - - /* otherwise, make sure c isn't in it */ - else { - - /* check the single chars first*/ - for(i = 0; i < scanset->single_count; ++i) { - if(c == scanset->singles[i]) { - return FALSE; - } - } - - /* check the pairs */ - for(i = 0; i < scanset->pair_count; ++i) { - if(c >= scanset->pairs[i].start && c <= scanset->pairs[i].end) { - return FALSE; - } - } - - /* didn't find it, so c is in set */ - return TRUE; - } -} - - - - - - - - diff --git a/icuSources/extra/ustdio/uscanset.h b/icuSources/extra/ustdio/uscanset.h deleted file mode 100644 index bc7ad207..00000000 --- a/icuSources/extra/ustdio/uscanset.h +++ /dev/null @@ -1,77 +0,0 @@ -/* -******************************************************************************* -* -* Copyright (C) 1998-1999, International Business Machines -* Corporation and others. All Rights Reserved. -* -******************************************************************************* -* -* File uscanset.h -* -* Modification History: -* -* Date Name Description -* 12/03/98 stephen Creation. -* 03/12/99 stephen Modified for new C API. -******************************************************************************* -*/ - -#ifndef USCANSET_H -#define USCANSET_H - -#include "unicode/utypes.h" - - -/** - * Simple struct for a scanset pair, ie a-z or A-Z - */ -struct u_scanf_scanset_pair { - UChar start; - UChar end; -}; -typedef struct u_scanf_scanset_pair u_scanf_scanset_pair; - -#define U_SCANF_MAX_SCANSET_SIZE 512 - -/** - * Struct representing a scanset - */ -struct u_scanf_scanset { - UBool is_inclusive; /* false if '^' is given */ - - UChar singles [U_SCANF_MAX_SCANSET_SIZE]; - u_scanf_scanset_pair pairs [U_SCANF_MAX_SCANSET_SIZE]; - - int32_t single_count; /* count of single chars in set */ - int32_t pair_count; /* count of pairs in set */ -}; -typedef struct u_scanf_scanset u_scanf_scanset; - -/** - * Init a u_scanf_scanset. - * @param scanset A pointer to the u_scanf_scanset to init. - * @param s A pointer to the first character in the scanset - * @param len On input, a pointer to the length of s. On output, - * a pointer to the number of characters parsed, excluding the final ']' - * @return TRUE if successful, FALSE otherwise. - */ -UBool -u_scanf_scanset_init(u_scanf_scanset *scanset, - const UChar *s, - int32_t *len); - -/** - * Determine if a UChar is in a u_scanf_scanset - * @param scanset A pointer to a u_scanf_scanset - * @param c The UChar to test. - * @return TRUE if the UChar is in the scanset, FALSE otherwise - */ -UBool -u_scanf_scanset_in(u_scanf_scanset *scanset, - UChar c); - -#endif - - - - diff --git a/icuSources/extra/ustdio/ustdio.dsw b/icuSources/extra/ustdio/ustdio.dsw deleted file mode 100644 index d33e6624..00000000 --- a/icuSources/extra/ustdio/ustdio.dsw +++ /dev/null @@ -1,29 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "ustdio"=.\ustdio.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/icuSources/extra/ustdio/ustream.cpp b/icuSources/extra/ustdio/ustream.cpp deleted file mode 100644 index 556822c2..00000000 --- a/icuSources/extra/ustdio/ustream.cpp +++ /dev/null @@ -1,332 +0,0 @@ -/* -********************************************************************** -* Copyright (C) 2001, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -* FILE NAME : ustream.cpp -* -* Modification History: -* -* Date Name Description -* 06/25/2001 grhoten Move iostream from unistr.h to here -****************************************************************************** -*/ - - -#include "unicode/utypes.h" -#include "unicode/uobject.h" -#include "unicode/ustream.h" -#include "unicode/ucnv.h" -#include "unicode/uchar.h" -#include "ustr_imp.h" -#include - -// console IO - -#if U_IOSTREAM_SOURCE >= 198506 - -#if U_IOSTREAM_SOURCE >= 199711 -#define STD_NAMESPACE std:: -#else -#define STD_NAMESPACE -#endif - -#define STD_OSTREAM STD_NAMESPACE ostream -#define STD_ISTREAM STD_NAMESPACE istream - -U_USTDIO_API STD_OSTREAM & -operator<<(STD_OSTREAM& stream, const UnicodeString& str) -{ - if(str.length() > 0) { - char buffer[200]; - UConverter *converter; - UErrorCode errorCode = U_ZERO_ERROR; - - // use the default converter to convert chunks of text - converter = u_getDefaultConverter(&errorCode); - if(U_SUCCESS(errorCode)) { - const UChar *us = str.getBuffer(); - const UChar *uLimit = us + str.length(); - char *s, *sLimit = buffer + sizeof(buffer); - do { - errorCode = U_ZERO_ERROR; - s = buffer; - ucnv_fromUnicode(converter, &s, sLimit, &us, uLimit, 0, FALSE, &errorCode); - - // write this chunk - if(s > buffer) { - stream.write(buffer, s - buffer); - } - } while(errorCode == U_BUFFER_OVERFLOW_ERROR); - u_releaseDefaultConverter(converter); - } - } - -/* stream.flush();*/ - return stream; -} - -U_USTDIO_API STD_ISTREAM & -operator>>(STD_ISTREAM& stream, UnicodeString& str) -{ - /* ipfx should eat whitespace when ios::skipws is set */ - UChar uBuffer[16]; - char buffer[16]; - int32_t idx = 0; - UConverter *converter; - UErrorCode errorCode = U_ZERO_ERROR; - - str.truncate(0); - // use the default converter to convert chunks of text - converter = u_getDefaultConverter(&errorCode); - if(U_SUCCESS(errorCode)) { - UChar *us = uBuffer; - const UChar *uLimit = uBuffer + sizeof(uBuffer)/sizeof(*uBuffer); - const char *s, *sLimit; - char ch; - UChar ch32; - UBool intialWhitespace = TRUE; - - /* We need to consume one byte at a time to see what is considered whitespace. */ - while (!stream.eof()) { - ch = stream.get(); - sLimit = &ch + 1; - errorCode = U_ZERO_ERROR; - us = uBuffer; - s = &ch; - ucnv_toUnicode(converter, &us, uLimit, &s, sLimit, 0, FALSE, &errorCode); - if(U_FAILURE(errorCode)) { - /* Something really bad happened */ - return stream; - } - /* Was the character consumed? */ - if (us != uBuffer) { - U16_GET(uBuffer, 0, 0, us-uBuffer, ch32); - if (u_isWhitespace(ch32)) { - if (!intialWhitespace) { - buffer[idx++] = ch; - while (idx > 0) { - stream.putback(buffer[--idx]); - } - break; - } - /* else skip intialWhitespace */ - } - else { - str.append(ch32); - intialWhitespace = FALSE; - } - idx = 0; - } - else { - buffer[idx++] = ch; - } - } - u_releaseDefaultConverter(converter); - } - -/* stream.flush();*/ - return stream; -} - - -#endif - -#if 0 -/* UnicodeStringStreamer internal API may be useful for future reference */ -#ifndef UNISTRM_H -#define UNISTRM_H - -#include "filestrm.h" -#include "umemstrm.h" -#include "unicode/unistr.h" - - -class U_COMMON_API UnicodeStringStreamer /* not : public UObject because all methods are static */ { -public: - static void streamIn(UnicodeString* string, FileStream* is); - static void streamOut(const UnicodeString* string, FileStream* os); - static void streamIn(UnicodeString* string, UMemoryStream* is); - static void streamOut(const UnicodeString* string, UMemoryStream* os); -}; - - -#endif - -//======================================== -// Streaming (to be removed) -//======================================== - -#include "unistrm.h" -#include "filestrm.h" - - -inline uint8_t -uprv_hibyte(uint16_t x) -{ return (uint8_t)(x >> 8); } - -inline uint8_t -uprv_lobyte(uint16_t x) -{ return (uint8_t)(x & 0xff); } - -inline uint16_t -uprv_hiword(uint32_t x) -{ return (uint16_t)(x >> 16); } - -inline uint16_t -uprv_loword(uint32_t x) -{ return (uint16_t)(x & 0xffff); } - -inline void -writeLong(FileStream *os, - int32_t x) -{ - uint16_t word = uprv_hiword((uint32_t)x); - T_FileStream_putc(os, uprv_hibyte(word)); - T_FileStream_putc(os, uprv_lobyte(word)); - word = uprv_loword((uint32_t)x); - T_FileStream_putc(os, uprv_hibyte(word)); - T_FileStream_putc(os, uprv_lobyte(word)); -} - -inline int32_t -readLong(FileStream *is) -{ - int32_t x = T_FileStream_getc(is); - - x = (x << 8) | T_FileStream_getc(is); - x = (x << 8) | T_FileStream_getc(is); - x = (x << 8) | T_FileStream_getc(is); - - return x; -} - -inline void -writeUChar(FileStream *os, - UChar c) -{ - T_FileStream_putc(os, uprv_hibyte(c)); - T_FileStream_putc(os, uprv_lobyte(c)); -} - -inline UChar -readUChar(FileStream *is) -{ - UChar c = (UChar)T_FileStream_getc(is); - - return (UChar)((c << 8) | T_FileStream_getc(is)); -} - -void -UnicodeStringStreamer::streamOut(const UnicodeString *s, - FileStream *os) -{ - if(!T_FileStream_error(os)) { - writeLong(os, s->fLength); - } - - const UChar *c = s->getArrayStart(); - const UChar *end = c + s->fLength; - - while(c != end && ! T_FileStream_error(os)) { - writeUChar(os, *c++); - } -} - -void -UnicodeStringStreamer::streamIn(UnicodeString *s, - FileStream *is) -{ - int32_t newSize; - - // handle error conditions - if(T_FileStream_error(is) || T_FileStream_eof(is)) { - s->setToBogus(); - return; - } - newSize = readLong(is); - if((newSize < 0) || T_FileStream_error(is) - || ((newSize > 0) && T_FileStream_eof(is))) { - s->setToBogus(); //error condition - return; - } - - // clone s's array, if needed - if(!s->cloneArrayIfNeeded(newSize, newSize, FALSE)) { - return; - } - - UChar *c = s->getArrayStart(); - UChar *end = c + newSize; - - while(c < end && ! (T_FileStream_error(is) || T_FileStream_eof(is))) { - *c++ = readUChar(is); - } - - // couldn't read all chars - if(c < end) { - s->setToBogus(); - return; - } - - s->fLength = newSize; -} - -void -UnicodeStringStreamer::streamOut(const UnicodeString *s, - UMemoryStream *os) -{ - if(!uprv_mstrm_error(os)) { - uprv_mstrm_write(os, (uint8_t*)&s->fLength, (int32_t)sizeof(s->fLength)); - } - - const UChar *c = s->getArrayStart(); - const UChar *end = c + s->fLength; - - while(c != end && ! uprv_mstrm_error(os)) { - uprv_mstrm_write(os, (uint8_t*)c, (int32_t)sizeof(*c)); - c++; - } -} - -void -UnicodeStringStreamer::streamIn(UnicodeString *s, - UMemoryStream *is) -{ - int32_t newSize; - - // handle error conditions - if(uprv_mstrm_error(is) || uprv_mstrm_eof(is)) { - s->setToBogus(); - return; - } - uprv_mstrm_read(is, (uint8_t *)&newSize, (int32_t)sizeof(int32_t)); - if((newSize < 0) || uprv_mstrm_error(is) - || ((newSize > 0) && uprv_mstrm_eof(is))) { - s->setToBogus(); //error condition - return; - } - - // clone s's array, if needed - if(!s->cloneArrayIfNeeded(newSize, newSize, FALSE)) { - return; - } - - UChar *c = s->getArrayStart(); - UChar *end = c + newSize; - - while(c < end && ! (uprv_mstrm_error(is) || uprv_mstrm_eof(is))) { - uprv_mstrm_read(is, (uint8_t *)c, (int32_t)sizeof(*c)); - c++; - } - - // couldn't read all chars - if(c < end) { - s->setToBogus(); - return; - } - - s->fLength = newSize; -} - -#endif diff --git a/icuSources/i18n/Makefile.in b/icuSources/i18n/Makefile.in index 2723e55e..e5b092c5 100644 --- a/icuSources/i18n/Makefile.in +++ b/icuSources/i18n/Makefile.in @@ -1,6 +1,6 @@ #****************************************************************************** # -# Copyright (C) 1998-2003, International Business Machines +# Copyright (C) 1998-2004, International Business Machines # Corporation and others. All Rights Reserved. # #****************************************************************************** @@ -15,25 +15,30 @@ top_builddir = .. ## All the flags and other definitions are included here. include $(top_builddir)/icudefs.mk +-include Makefile.local ## Build directory information subdir = i18n ## Extra files to remove for 'make clean' -CLEANFILES = *~ $(DEPS) +CLEANFILES = *~ $(DEPS) $(IMPORT_LIB) $(MIDDLE_IMPORT_LIB) $(FINAL_IMPORT_LIB) ## Target information -TARGET_STUBNAME=i18n +TARGET_STUBNAME=$(I18N_STUBNAME) ifneq ($(ENABLE_STATIC),) -TARGET = $(LIBICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX).a +TARGET = $(LIBDIR)/$(LIBSICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX).$(A) endif ifneq ($(ENABLE_SHARED),) -SO_TARGET = $(LIBICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX).$(SO) +SO_TARGET = $(LIBDIR)/$(LIBICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX).$(SO) ALL_SO_TARGETS = $(SO_TARGET) $(MIDDLE_SO_TARGET) $(FINAL_SO_TARGET) +ifeq ($(ENABLE_SO_VERSION_DATA),1) +SO_VERSION_DATA = i18n.res +endif + ifeq ($(OS390BATCH),1) BATCH_TARGET = $(BATCH_I18N_TARGET) BATCH_LIBS = $(BATCH_LIBICUUC) -lm @@ -47,26 +52,28 @@ DYNAMICCPPFLAGS = $(SHAREDLIBCPPFLAGS) DYNAMICCFLAGS = $(SHAREDLIBCFLAGS) DYNAMICCXXFLAGS = $(SHAREDLIBCXXFLAGS) +LDFLAGS += $(LDFLAGSICUI18N) CPPFLAGS += -I$(srcdir) -I$(top_builddir)/common -I$(top_srcdir)/common $(LIBCPPFLAGS) DEFS += -DU_I18N_IMPLEMENTATION LIBS = $(LIBICUUC) $(DEFAULT_LIBS) OBJECTS = ucln_in.o \ fmtable.o format.o msgfmt.o umsg.o numfmt.o unum.o decimfmt.o dcfmtsym.o \ +ucurr.o digitlst.o \ choicfmt.o datefmt.o smpdtfmt.o dtfmtsym.o udat.o \ -ucal.o calendar.o gregocal.o timezone.o simpletz.o \ -buddhcal.o japancal.o \ +nfrs.o nfrule.o nfsubs.o rbnf.o \ +ucal.o calendar.o gregocal.o timezone.o simpletz.o olsontz.o \ +astro.o buddhcal.o islamcal.o japancal.o gregoimp.o hebrwcal.o chnsecal.o \ sortkey.o bocsu.o coleitr.o coll.o ucoleitr.o \ -ucol.o ucol_bld.o ucol_cnt.o ucol_elm.o ucol_tok.o ucol_wgt.o tblcoll.o \ +ucol.o ucol_bld.o ucol_cnt.o ucol_elm.o ucol_sit.o ucol_tok.o ucol_wgt.o tblcoll.o \ strmatch.o usearch.o search.o stsearch.o \ -unifltlg.o translit.o utrans.o \ -cpdtrans.o hextouni.o rbt.o rbt_data.o rbt_pars.o rbt_rule.o rbt_set.o \ -nultrans.o remtrans.o titletrn.o tolowtrn.o toupptrn.o anytrans.o \ -name2uni.o uni2name.o unitohex.o nortrans.o quant.o transreg.o \ -nfrs.o nfrule.o nfsubs.o rbnf.o esctrn.o unesctrn.o \ +translit.o utrans.o esctrn.o unesctrn.o \ funcrepl.o strrepl.o tridpars.o \ -ucurr.o \ -regexcmp.o rematch.o repattrn.o regexst.o +cpdtrans.o rbt.o rbt_data.o rbt_pars.o rbt_rule.o rbt_set.o \ +nultrans.o remtrans.o casetrn.o titletrn.o tolowtrn.o toupptrn.o anytrans.o \ +name2uni.o uni2name.o nortrans.o quant.o transreg.o \ +regexcmp.o rematch.o repattrn.o regexst.o uregex.o ulocdata.o \ +measfmt.o currfmt.o curramt.o currunit.o measure.o utmscale.o STATIC_OBJECTS = $(OBJECTS:.o=.$(STATIC_O)) @@ -99,22 +106,24 @@ install-local: install-headers install-library install-library: all-local $(MKINSTALLDIRS) $(DESTDIR)$(libdir) ifneq ($(ENABLE_STATIC),) - $(INSTALL-L) $(TARGET) $(DESTDIR)$(libdir)/$(TARGET) + $(INSTALL-L) $(TARGET) $(DESTDIR)$(libdir) endif ifneq ($(ENABLE_SHARED),) - $(INSTALL-L) $(FINAL_SO_TARGET) $(DESTDIR)$(libdir)/$(FINAL_SO_TARGET) + $(INSTALL-L) $(FINAL_SO_TARGET) $(DESTDIR)$(libdir) ifneq ($(FINAL_SO_TARGET),$(SO_TARGET)) - cd $(DESTDIR)$(libdir) && $(RM) $(SO_TARGET) && ln -s $(FINAL_SO_TARGET) $(SO_TARGET) + cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(SO_TARGET)) && ln -s $(notdir $(FINAL_SO_TARGET)) $(notdir $(SO_TARGET)) ifneq ($(FINAL_SO_TARGET),$(MIDDLE_SO_TARGET)) - cd $(DESTDIR)$(libdir) && $(RM) $(MIDDLE_SO_TARGET) && ln -s $(FINAL_SO_TARGET) $(MIDDLE_SO_TARGET) + cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(MIDDLE_SO_TARGET)) && ln -s $(notdir $(FINAL_SO_TARGET)) $(notdir $(MIDDLE_SO_TARGET)) endif endif endif ifneq ($(IMPORT_LIB_EXT),) - $(INSTALL-L) $(FINAL_IMPORT_LIB) $(DESTDIR)$(libdir)/$(FINAL_IMPORT_LIB) - cd $(DESTDIR)$(libdir) && $(RM) $(IMPORT_LIB) && ln -s $(FINAL_IMPORT_LIB) $(IMPORT_LIB) + $(INSTALL-L) $(FINAL_IMPORT_LIB) $(DESTDIR)$(libdir) +ifneq ($(IMPORT_LIB),$(FINAL_IMPORT_LIB)) + cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(IMPORT_LIB)) && ln -s $(notdir $(FINAL_IMPORT_LIB)) $(notdir $(IMPORT_LIB)) +endif ifneq ($(MIDDLE_IMPORT_LIB),$(FINAL_IMPORT_LIB)) - cd $(DESTDIR)$(libdir) && $(RM) $(MIDDLE_IMPORT_LIB) && ln -s $(FINAL_IMPORT_LIB) $(MIDDLE_IMPORT_LIB) + cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(MIDDLE_IMPORT_LIB)) && ln -s $(notdir $(FINAL_IMPORT_LIB)) $(notdir $(MIDDLE_IMPORT_LIB)) endif endif @@ -129,7 +138,7 @@ dist-local: clean-local: test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES) - $(RMV) $(OBJECTS) $(STATIC_OBJECTS) $(ALL_TARGETS) + $(RMV) $(OBJECTS) $(STATIC_OBJECTS) $(ALL_TARGETS) $(SO_VERSION_DATA) distclean-local: clean-local $(RMV) Makefile @@ -146,7 +155,7 @@ $(TARGET): $(TARGET)($(STATIC_OBJECTS)) endif ifneq ($(ENABLE_SHARED),) -$(FINAL_SO_TARGET): $(OBJECTS) +$(FINAL_SO_TARGET): $(OBJECTS) $(SO_VERSION_DATA) $(SHLIB.cc) $(LD_SONAME) $(OUTOPT)$@ $^ $(LIBS) ifeq ($(OS390BATCH),1) diff --git a/icuSources/i18n/anytrans.cpp b/icuSources/i18n/anytrans.cpp index cdfea1b4..6c5e9415 100644 --- a/icuSources/i18n/anytrans.cpp +++ b/icuSources/i18n/anytrans.cpp @@ -1,6 +1,6 @@ /* ***************************************************************** -* Copyright (c) 2002-2003, International Business Machines Corporation +* Copyright (c) 2002-2004, International Business Machines Corporation * and others. All Rights Reserved. ***************************************************************** * Date Name Description @@ -19,6 +19,7 @@ #include "uvector.h" #include "tridpars.h" #include "hash.h" +#include "putilimp.h" //------------------------------------------------------------ // Constants @@ -170,7 +171,7 @@ void ScriptRunIterator::adjustLimit(int32_t delta) { //------------------------------------------------------------ // AnyTransliterator -const char AnyTransliterator::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(AnyTransliterator) AnyTransliterator::AnyTransliterator(const UnicodeString& id, const UnicodeString& theTarget, @@ -319,8 +320,8 @@ UScriptCode AnyTransliterator::scriptNameToCode(const UnicodeString& name) { */ void AnyTransliterator::registerIDs() { - UErrorCode ec; - Hashtable seen(TRUE); + UErrorCode ec = U_ZERO_ERROR; + Hashtable seen(TRUE, ec); int32_t sourceCount = Transliterator::_countAvailableSources(); for (int32_t s=0; s +#include "unicode/putil.h" +#include "uhash.h" +#include "umutex.h" +#include "ucln_in.h" +#include "putilimp.h" +#include // for toString() + +#ifdef U_DEBUG_ASTRO +# include "uresimp.h" // for debugging + +static void debug_astro_loc(const char *f, int32_t l) +{ + fprintf(stderr, "%s:%d: ", f, l); +} + +static void debug_astro_msg(const char *pat, ...) +{ + va_list ap; + va_start(ap, pat); + vfprintf(stderr, pat, ap); + fflush(stderr); +} +#include "unicode/datefmt.h" +#include "unicode/ustring.h" +static const char * debug_astro_date(UDate d) { + static char gStrBuf[1024]; + static DateFormat *df = NULL; + if(df == NULL) { + df = DateFormat::createDateTimeInstance(DateFormat::MEDIUM, DateFormat::MEDIUM, Locale::getUS()); + df->adoptTimeZone(TimeZone::getGMT()->clone()); + } + UnicodeString str; + df->format(d,str); + u_austrncpy(gStrBuf,str.getTerminatedBuffer(),sizeof(gStrBuf)-1); + return gStrBuf; +} + +// must use double parens, i.e.: U_DEBUG_ASTRO_MSG(("four is: %d",4)); +#define U_DEBUG_ASTRO_MSG(x) {debug_astro_loc(__FILE__,__LINE__);debug_astro_msg x;} +#else +#define U_DEBUG_ASTRO_MSG(x) +#endif + +static inline UBool isINVALID(double d) { + return(uprv_isNaN(d)); +} + +static UMTX ccLock = NULL; + +U_CDECL_BEGIN +static UBool calendar_astro_cleanup(void) { + umtx_destroy(&ccLock); + return TRUE; +} +U_CDECL_END + +U_NAMESPACE_BEGIN + +/** + * The number of standard hours in one sidereal day. + * Approximately 24.93. + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +#define SIDEREAL_DAY (23.93446960027) + +/** + * The number of sidereal hours in one mean solar day. + * Approximately 24.07. + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +#define SOLAR_DAY (24.065709816) + +/** + * The average number of solar days from one new moon to the next. This is the time + * it takes for the moon to return the same ecliptic longitude as the sun. + * It is longer than the sidereal month because the sun's longitude increases + * during the year due to the revolution of the earth around the sun. + * Approximately 29.53. + * + * @see #SIDEREAL_MONTH + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +const double CalendarAstronomer::SYNODIC_MONTH = 29.530588853; + +/** + * The average number of days it takes + * for the moon to return to the same ecliptic longitude relative to the + * stellar background. This is referred to as the sidereal month. + * It is shorter than the synodic month due to + * the revolution of the earth around the sun. + * Approximately 27.32. + * + * @see #SYNODIC_MONTH + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +#define SIDEREAL_MONTH 27.32166 + +/** + * The average number number of days between successive vernal equinoxes. + * Due to the precession of the earth's + * axis, this is not precisely the same as the sidereal year. + * Approximately 365.24 + * + * @see #SIDEREAL_YEAR + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +#define TROPICAL_YEAR 365.242191 + +/** + * The average number of days it takes + * for the sun to return to the same position against the fixed stellar + * background. This is the duration of one orbit of the earth about the sun + * as it would appear to an outside observer. + * Due to the precession of the earth's + * axis, this is not precisely the same as the tropical year. + * Approximately 365.25. + * + * @see #TROPICAL_YEAR + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +#define SIDEREAL_YEAR 365.25636 + +//------------------------------------------------------------------------- +// Time-related constants +//------------------------------------------------------------------------- + +/** + * The number of milliseconds in one second. + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +#define SECOND_MS U_MILLIS_PER_SECOND + +/** + * The number of milliseconds in one minute. + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +#define MINUTE_MS U_MILLIS_PER_MINUTE + +/** + * The number of milliseconds in one hour. + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +#define HOUR_MS U_MILLIS_PER_HOUR + +/** + * The number of milliseconds in one day. + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +#define DAY_MS U_MILLIS_PER_DAY + +/** + * The start of the julian day numbering scheme used by astronomers, which + * is 1/1/4713 BC (Julian), 12:00 GMT. This is given as the number of milliseconds + * since 1/1/1970 AD (Gregorian), a negative number. + * Note that julian day numbers and + * the Julian calendar are not the same thing. Also note that + * julian days start at noon, not midnight. + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +#define JULIAN_EPOCH_MS -210866760000000.0 + + +/** + * Milliseconds value for 0.0 January 2000 AD. + */ +#define EPOCH_2000_MS 946598400000.0 + +//------------------------------------------------------------------------- +// Assorted private data used for conversions +//------------------------------------------------------------------------- + +// My own copies of these so compilers are more likely to optimize them away +const double CalendarAstronomer::PI = 3.14159265358979323846; + +#define CalendarAstronomer_PI2 (CalendarAstronomer::PI*2.0) +#define RAD_HOUR ( 12 / CalendarAstronomer::PI ) // radians -> hours +#define DEG_RAD ( CalendarAstronomer::PI / 180 ) // degrees -> radians +#define RAD_DEG ( 180 / CalendarAstronomer::PI ) // radians -> degrees + +//------------------------------------------------------------------------- +// Constructors +//------------------------------------------------------------------------- + +/** + * Construct a new CalendarAstronomer object that is initialized to + * the current date and time. + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +CalendarAstronomer::CalendarAstronomer(): + fTime(Calendar::getNow()), fLongitude(0.0), fLatitude(0.0), fGmtOffset(0.0), moonPosition(0,0), moonPositionSet(FALSE) { + clearCache(); +} + +/** + * Construct a new CalendarAstronomer object that is initialized to + * the specified date and time. + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +CalendarAstronomer::CalendarAstronomer(UDate d): fTime(d), fLongitude(0.0), fLatitude(0.0), fGmtOffset(0.0), moonPosition(0,0), moonPositionSet(FALSE) { + clearCache(); +} + +/** + * Construct a new CalendarAstronomer object with the given + * latitude and longitude. The object's time is set to the current + * date and time. + *

    + * @param longitude The desired longitude, in degrees east of + * the Greenwich meridian. + * + * @param latitude The desired latitude, in degrees. Positive + * values signify North, negative South. + * + * @see java.util.Date#getTime() + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +CalendarAstronomer::CalendarAstronomer(double longitude, double latitude) : + fTime(Calendar::getNow()), moonPosition(0,0), moonPositionSet(FALSE) { + fLongitude = normPI(longitude * (double)DEG_RAD); + fLatitude = normPI(latitude * (double)DEG_RAD); + fGmtOffset = (double)(fLongitude * 24. * (double)HOUR_MS / (double)CalendarAstronomer_PI2); + clearCache(); +} + +CalendarAstronomer::~CalendarAstronomer() +{ +} + +//------------------------------------------------------------------------- +// Time and date getters and setters +//------------------------------------------------------------------------- + +/** + * Set the current date and time of this CalendarAstronomer object. All + * astronomical calculations are performed based on this time setting. + * + * @param aTime the date and time, expressed as the number of milliseconds since + * 1/1/1970 0:00 GMT (Gregorian). + * + * @see #setDate + * @see #getTime + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +void CalendarAstronomer::setTime(UDate aTime) { + fTime = aTime; + U_DEBUG_ASTRO_MSG(("setTime(%.1lf, %sL)\n", aTime, debug_astro_date(aTime+fGmtOffset))); + clearCache(); +} + +/** + * Set the current date and time of this CalendarAstronomer object. All + * astronomical calculations are performed based on this time setting. + * + * @param jdn the desired time, expressed as a "julian day number", + * which is the number of elapsed days since + * 1/1/4713 BC (Julian), 12:00 GMT. Note that julian day + * numbers start at noon. To get the jdn for + * the corresponding midnight, subtract 0.5. + * + * @see #getJulianDay + * @see #JULIAN_EPOCH_MS + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +void CalendarAstronomer::setJulianDay(double jdn) { + fTime = (double)(jdn * DAY_MS) + JULIAN_EPOCH_MS; + clearCache(); + julianDay = jdn; +} + +/** + * Get the current time of this CalendarAstronomer object, + * represented as the number of milliseconds since + * 1/1/1970 AD 0:00 GMT (Gregorian). + * + * @see #setTime + * @see #getDate + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +UDate CalendarAstronomer::getTime() { + return fTime; +} + +/** + * Get the current time of this CalendarAstronomer object, + * expressed as a "julian day number", which is the number of elapsed + * days since 1/1/4713 BC (Julian), 12:00 GMT. + * + * @see #setJulianDay + * @see #JULIAN_EPOCH_MS + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +double CalendarAstronomer::getJulianDay() { + if (isINVALID(julianDay)) { + julianDay = (fTime - (double)JULIAN_EPOCH_MS) / (double)DAY_MS; + } + return julianDay; +} + +/** + * Return this object's time expressed in julian centuries: + * the number of centuries after 1/1/1900 AD, 12:00 GMT + * + * @see #getJulianDay + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +double CalendarAstronomer::getJulianCentury() { + if (isINVALID(julianCentury)) { + julianCentury = (getJulianDay() - 2415020.0) / 36525.0; + } + return julianCentury; +} + +/** + * Returns the current Greenwich sidereal time, measured in hours + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +double CalendarAstronomer::getGreenwichSidereal() { + if (isINVALID(siderealTime)) { + // See page 86 of "Practial Astronomy with your Calculator", + // by Peter Duffet-Smith, for details on the algorithm. + + double UT = normalize(fTime/(double)HOUR_MS, 24.); + + siderealTime = normalize(getSiderealOffset() + UT*1.002737909, 24.); + } + return siderealTime; +} + +double CalendarAstronomer::getSiderealOffset() { + if (isINVALID(siderealT0)) { + double JD = uprv_floor(getJulianDay() - 0.5) + 0.5; + double S = JD - 2451545.0; + double T = S / 36525.0; + siderealT0 = normalize(6.697374558 + 2400.051336*T + 0.000025862*T*T, 24); + } + return siderealT0; +} + +/** + * Returns the current local sidereal time, measured in hours + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +double CalendarAstronomer::getLocalSidereal() { + return normalize(getGreenwichSidereal() + (fGmtOffset/(double)HOUR_MS), 24.); +} + +/** + * Converts local sidereal time to Universal Time. + * + * @param lst The Local Sidereal Time, in hours since sidereal midnight + * on this object's current date. + * + * @return The corresponding Universal Time, in milliseconds since + * 1 Jan 1970, GMT. + */ +double CalendarAstronomer::lstToUT(double lst) { + // Convert to local mean time + double lt = normalize((lst - getSiderealOffset()) * 0.9972695663, 24); + + // Then find local midnight on this day + double base = (DAY_MS * Math::floorDivide(fTime + fGmtOffset,(double)DAY_MS)) - fGmtOffset; + + //out(" lt =" + lt + " hours"); + //out(" base=" + new Date(base)); + + return base + (long)(lt * HOUR_MS); +} + + +//------------------------------------------------------------------------- +// Coordinate transformations, all based on the current time of this object +//------------------------------------------------------------------------- + +/** + * Convert from ecliptic to equatorial coordinates. + * + * @param ecliptic A point in the sky in ecliptic coordinates. + * @return The corresponding point in equatorial coordinates. + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +CalendarAstronomer::Equatorial& CalendarAstronomer::eclipticToEquatorial(CalendarAstronomer::Equatorial& result, const CalendarAstronomer::Ecliptic& ecliptic) +{ + return eclipticToEquatorial(result, ecliptic.longitude, ecliptic.latitude); +} + +/** + * Convert from ecliptic to equatorial coordinates. + * + * @param eclipLong The ecliptic longitude + * @param eclipLat The ecliptic latitude + * + * @return The corresponding point in equatorial coordinates. + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +CalendarAstronomer::Equatorial& CalendarAstronomer::eclipticToEquatorial(CalendarAstronomer::Equatorial& result, double eclipLong, double eclipLat) +{ + // See page 42 of "Practial Astronomy with your Calculator", + // by Peter Duffet-Smith, for details on the algorithm. + + double obliq = eclipticObliquity(); + double sinE = ::sin(obliq); + double cosE = cos(obliq); + + double sinL = ::sin(eclipLong); + double cosL = cos(eclipLong); + + double sinB = ::sin(eclipLat); + double cosB = cos(eclipLat); + double tanB = tan(eclipLat); + + result.set(atan2(sinL*cosE - tanB*sinE, cosL), + asin(sinB*cosE + cosB*sinE*sinL) ); + return result; +} + +/** + * Convert from ecliptic longitude to equatorial coordinates. + * + * @param eclipLong The ecliptic longitude + * + * @return The corresponding point in equatorial coordinates. + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +CalendarAstronomer::Equatorial& CalendarAstronomer::eclipticToEquatorial(CalendarAstronomer::Equatorial& result, double eclipLong) +{ + return eclipticToEquatorial(result, eclipLong, 0); // TODO: optimize +} + +/** + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +CalendarAstronomer::Horizon& CalendarAstronomer::eclipticToHorizon(CalendarAstronomer::Horizon& result, double eclipLong) +{ + Equatorial equatorial; + eclipticToEquatorial(equatorial, eclipLong); + + double H = getLocalSidereal()*CalendarAstronomer::PI/12 - equatorial.ascension; // Hour-angle + + double sinH = ::sin(H); + double cosH = cos(H); + double sinD = ::sin(equatorial.declination); + double cosD = cos(equatorial.declination); + double sinL = ::sin(fLatitude); + double cosL = cos(fLatitude); + + double altitude = asin(sinD*sinL + cosD*cosL*cosH); + double azimuth = atan2(-cosD*cosL*sinH, sinD - sinL * ::sin(altitude)); + + result.set(azimuth, altitude); + return result; +} + + +//------------------------------------------------------------------------- +// The Sun +//------------------------------------------------------------------------- + +// +// Parameters of the Sun's orbit as of the epoch Jan 0.0 1990 +// Angles are in radians (after multiplying by CalendarAstronomer::PI/180) +// +#define JD_EPOCH 2447891.5 // Julian day of epoch + +#define SUN_ETA_G (279.403303 * CalendarAstronomer::PI/180) // Ecliptic longitude at epoch +#define SUN_OMEGA_G (282.768422 * CalendarAstronomer::PI/180) // Ecliptic longitude of perigee +#define SUN_E 0.016713 // Eccentricity of orbit +//double sunR0 1.495585e8 // Semi-major axis in KM +//double sunTheta0 (0.533128 * CalendarAstronomer::PI/180) // Angular diameter at R0 + +// The following three methods, which compute the sun parameters +// given above for an arbitrary epoch (whatever time the object is +// set to), make only a small difference as compared to using the +// above constants. E.g., Sunset times might differ by ~12 +// seconds. Furthermore, the eta-g computation is befuddled by +// Duffet-Smith's incorrect coefficients (p.86). I've corrected +// the first-order coefficient but the others may be off too - no +// way of knowing without consulting another source. + +// /** +// * Return the sun's ecliptic longitude at perigee for the current time. +// * See Duffett-Smith, p. 86. +// * @return radians +// */ +// private double getSunOmegaG() { +// double T = getJulianCentury(); +// return (281.2208444 + (1.719175 + 0.000452778*T)*T) * DEG_RAD; +// } + +// /** +// * Return the sun's ecliptic longitude for the current time. +// * See Duffett-Smith, p. 86. +// * @return radians +// */ +// private double getSunEtaG() { +// double T = getJulianCentury(); +// //return (279.6966778 + (36000.76892 + 0.0003025*T)*T) * DEG_RAD; +// // +// // The above line is from Duffett-Smith, and yields manifestly wrong +// // results. The below constant is derived empirically to match the +// // constant he gives for the 1990 EPOCH. +// // +// return (279.6966778 + (-0.3262541582718024 + 0.0003025*T)*T) * DEG_RAD; +// } + +// /** +// * Return the sun's eccentricity of orbit for the current time. +// * See Duffett-Smith, p. 86. +// * @return double +// */ +// private double getSunE() { +// double T = getJulianCentury(); +// return 0.01675104 - (0.0000418 + 0.000000126*T)*T; +// } + +/** + * The longitude of the sun at the time specified by this object. + * The longitude is measured in radians along the ecliptic + * from the "first point of Aries," the point at which the ecliptic + * crosses the earth's equatorial plane at the vernal equinox. + *

    + * Currently, this method uses an approximation of the two-body Kepler's + * equation for the earth and the sun. It does not take into account the + * perturbations caused by the other planets, the moon, etc. + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +double CalendarAstronomer::getSunLongitude() +{ + // See page 86 of "Practial Astronomy with your Calculator", + // by Peter Duffet-Smith, for details on the algorithm. + + if (isINVALID(sunLongitude)) { + getSunLongitude(getJulianDay(), sunLongitude, meanAnomalySun); + } + return sunLongitude; +} + +/** + * TODO Make this public when the entire class is package-private. + */ +/*public*/ void CalendarAstronomer::getSunLongitude(double jDay, double &longitude, double &meanAnomaly) +{ + // See page 86 of "Practial Astronomy with your Calculator", + // by Peter Duffet-Smith, for details on the algorithm. + + double day = jDay - JD_EPOCH; // Days since epoch + + // Find the angular distance the sun in a fictitious + // circular orbit has travelled since the epoch. + double epochAngle = norm2PI(CalendarAstronomer_PI2/TROPICAL_YEAR*day); + + // The epoch wasn't at the sun's perigee; find the angular distance + // since perigee, which is called the "mean anomaly" + meanAnomaly = norm2PI(epochAngle + SUN_ETA_G - SUN_OMEGA_G); + + // Now find the "true anomaly", e.g. the real solar longitude + // by solving Kepler's equation for an elliptical orbit + // NOTE: The 3rd ed. of the book lists omega_g and eta_g in different + // equations; omega_g is to be correct. + longitude = norm2PI(trueAnomaly(meanAnomaly, SUN_E) + SUN_OMEGA_G); +} + +/** + * The position of the sun at this object's current date and time, + * in equatorial coordinates. + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +CalendarAstronomer::Equatorial& CalendarAstronomer::getSunPosition(CalendarAstronomer::Equatorial& result) { + return eclipticToEquatorial(result, getSunLongitude(), 0); +} + + +/** + * Constant representing the vernal equinox. + * For use with {@link #getSunTime getSunTime}. + * Note: In this case, "vernal" refers to the northern hemisphere's seasons. + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +double CalendarAstronomer::VERNAL_EQUINOX() { + return 0; +} + +/** + * Constant representing the summer solstice. + * For use with {@link #getSunTime getSunTime}. + * Note: In this case, "summer" refers to the northern hemisphere's seasons. + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +double CalendarAstronomer::SUMMER_SOLSTICE() { + return (CalendarAstronomer::PI/2); +} + +/** + * Constant representing the autumnal equinox. + * For use with {@link #getSunTime getSunTime}. + * Note: In this case, "autumn" refers to the northern hemisphere's seasons. + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +double CalendarAstronomer::AUTUMN_EQUINOX() { + return (CalendarAstronomer::PI); +} + +/** + * Constant representing the winter solstice. + * For use with {@link #getSunTime getSunTime}. + * Note: In this case, "winter" refers to the northern hemisphere's seasons. + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +double CalendarAstronomer::WINTER_SOLSTICE() { + return ((CalendarAstronomer::PI*3)/2); +} + +/** + * Find the next time at which the sun's ecliptic longitude will have + * the desired value. + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +class SunTimeAngleFunc : public CalendarAstronomer::AngleFunc { +public: + virtual double eval(CalendarAstronomer& a) { return a.getSunLongitude(); } +}; + +UDate CalendarAstronomer::getSunTime(double desired, UBool next) +{ + SunTimeAngleFunc func; + return timeOfAngle( func, + desired, + TROPICAL_YEAR, + MINUTE_MS, + next); +} + +class RiseSetCoordFunc : public CalendarAstronomer::CoordFunc { +public: + virtual void eval(CalendarAstronomer::Equatorial& result, CalendarAstronomer&a) { a.getSunPosition(result); } +}; + +UDate CalendarAstronomer::getSunRiseSet(UBool rise) +{ + UDate t0 = fTime; + + // Make a rough guess: 6am or 6pm local time on the current day + double noon = Math::floorDivide(fTime + fGmtOffset, (double)DAY_MS)*DAY_MS - fGmtOffset + (12*HOUR_MS); + + U_DEBUG_ASTRO_MSG(("Noon=%.2lf, %sL, gmtoff %.2lf\n", noon, debug_astro_date(noon+fGmtOffset), fGmtOffset)); + setTime(noon + ((rise ? -6 : 6) * HOUR_MS)); + U_DEBUG_ASTRO_MSG(("added %.2lf ms as a guess,\n", ((rise ? -6. : 6.) * HOUR_MS))); + + RiseSetCoordFunc func; + double t = riseOrSet(func, + rise, + .533 * DEG_RAD, // Angular Diameter + 34. /60.0 * DEG_RAD, // Refraction correction + MINUTE_MS / 12.); // Desired accuracy + + setTime(t0); + return t; +} + +// Commented out - currently unused. ICU 2.6, Alan +// //------------------------------------------------------------------------- +// // Alternate Sun Rise/Set +// // See Duffett-Smith p.93 +// //------------------------------------------------------------------------- +// +// // This yields worse results (as compared to USNO data) than getSunRiseSet(). +// /** +// * TODO Make this when the entire class is package-private. +// */ +// /*public*/ long getSunRiseSet2(boolean rise) { +// // 1. Calculate coordinates of the sun's center for midnight +// double jd = uprv_floor(getJulianDay() - 0.5) + 0.5; +// double[] sl = getSunLongitude(jd);// double lambda1 = sl[0]; +// Equatorial pos1 = eclipticToEquatorial(lambda1, 0); +// +// // 2. Add ... to lambda to get position 24 hours later +// double lambda2 = lambda1 + 0.985647*DEG_RAD; +// Equatorial pos2 = eclipticToEquatorial(lambda2, 0); +// +// // 3. Calculate LSTs of rising and setting for these two positions +// double tanL = ::tan(fLatitude); +// double H = ::acos(-tanL * ::tan(pos1.declination)); +// double lst1r = (CalendarAstronomer_PI2 + pos1.ascension - H) * 24 / CalendarAstronomer_PI2; +// double lst1s = (pos1.ascension + H) * 24 / CalendarAstronomer_PI2; +// H = ::acos(-tanL * ::tan(pos2.declination)); +// double lst2r = (CalendarAstronomer_PI2-H + pos2.ascension ) * 24 / CalendarAstronomer_PI2; +// double lst2s = (H + pos2.ascension ) * 24 / CalendarAstronomer_PI2; +// if (lst1r > 24) lst1r -= 24; +// if (lst1s > 24) lst1s -= 24; +// if (lst2r > 24) lst2r -= 24; +// if (lst2s > 24) lst2s -= 24; +// +// // 4. Convert LSTs to GSTs. If GST1 > GST2, add 24 to GST2. +// double gst1r = lstToGst(lst1r); +// double gst1s = lstToGst(lst1s); +// double gst2r = lstToGst(lst2r); +// double gst2s = lstToGst(lst2s); +// if (gst1r > gst2r) gst2r += 24; +// if (gst1s > gst2s) gst2s += 24; +// +// // 5. Calculate GST at 0h UT of this date +// double t00 = utToGst(0); +// +// // 6. Calculate GST at 0h on the observer's longitude +// double offset = ::round(fLongitude*12/PI); // p.95 step 6; he _rounds_ to nearest 15 deg. +// double t00p = t00 - offset*1.002737909; +// if (t00p < 0) t00p += 24; // do NOT normalize +// +// // 7. Adjust +// if (gst1r < t00p) { +// gst1r += 24; +// gst2r += 24; +// } +// if (gst1s < t00p) { +// gst1s += 24; +// gst2s += 24; +// } +// +// // 8. +// double gstr = (24.07*gst1r-t00*(gst2r-gst1r))/(24.07+gst1r-gst2r); +// double gsts = (24.07*gst1s-t00*(gst2s-gst1s))/(24.07+gst1s-gst2s); +// +// // 9. Correct for parallax, refraction, and sun's diameter +// double dec = (pos1.declination + pos2.declination) / 2; +// double psi = ::acos(sin(fLatitude) / cos(dec)); +// double x = 0.830725 * DEG_RAD; // parallax+refraction+diameter +// double y = ::asin(sin(x) / ::sin(psi)) * RAD_DEG; +// double delta_t = 240 * y / cos(dec) / 3600; // hours +// +// // 10. Add correction to GSTs, subtract from GSTr +// gstr -= delta_t; +// gsts += delta_t; +// +// // 11. Convert GST to UT and then to local civil time +// double ut = gstToUt(rise ? gstr : gsts); +// //System.out.println((rise?"rise=":"set=") + ut + ", delta_t=" + delta_t); +// long midnight = DAY_MS * (time / DAY_MS); // Find UT midnight on this day +// return midnight + (long) (ut * 3600000); +// } + +// Commented out - currently unused. ICU 2.6, Alan +// /** +// * Convert local sidereal time to Greenwich sidereal time. +// * Section 15. Duffett-Smith p.21 +// * @param lst in hours (0..24) +// * @return GST in hours (0..24) +// */ +// double lstToGst(double lst) { +// double delta = fLongitude * 24 / CalendarAstronomer_PI2; +// return normalize(lst - delta, 24); +// } + +// Commented out - currently unused. ICU 2.6, Alan +// /** +// * Convert UT to GST on this date. +// * Section 12. Duffett-Smith p.17 +// * @param ut in hours +// * @return GST in hours +// */ +// double utToGst(double ut) { +// return normalize(getT0() + ut*1.002737909, 24); +// } + +// Commented out - currently unused. ICU 2.6, Alan +// /** +// * Convert GST to UT on this date. +// * Section 13. Duffett-Smith p.18 +// * @param gst in hours +// * @return UT in hours +// */ +// double gstToUt(double gst) { +// return normalize(gst - getT0(), 24) * 0.9972695663; +// } + +// Commented out - currently unused. ICU 2.6, Alan +// double getT0() { +// // Common computation for UT <=> GST +// +// // Find JD for 0h UT +// double jd = uprv_floor(getJulianDay() - 0.5) + 0.5; +// +// double s = jd - 2451545.0; +// double t = s / 36525.0; +// double t0 = 6.697374558 + (2400.051336 + 0.000025862*t)*t; +// return t0; +// } + +// Commented out - currently unused. ICU 2.6, Alan +// //------------------------------------------------------------------------- +// // Alternate Sun Rise/Set +// // See sci.astro FAQ +// // http://www.faqs.org/faqs/astronomy/faq/part3/section-5.html +// //------------------------------------------------------------------------- +// +// // Note: This method appears to produce inferior accuracy as +// // compared to getSunRiseSet(). +// +// /** +// * TODO Make this when the entire class is package-private. +// */ +// /*public*/ long getSunRiseSet3(boolean rise) { +// +// // Compute day number for 0.0 Jan 2000 epoch +// double d = (double)(time - EPOCH_2000_MS) / DAY_MS; +// +// // Now compute the Local Sidereal Time, LST: +// // +// double LST = 98.9818 + 0.985647352 * d + /*UT*15 + long*/ +// fLongitude*RAD_DEG; +// // +// // (east long. positive). Note that LST is here expressed in degrees, +// // where 15 degrees corresponds to one hour. Since LST really is an angle, +// // it's convenient to use one unit---degrees---throughout. +// +// // COMPUTING THE SUN'S POSITION +// // ---------------------------- +// // +// // To be able to compute the Sun's rise/set times, you need to be able to +// // compute the Sun's position at any time. First compute the "day +// // number" d as outlined above, for the desired moment. Next compute: +// // +// double oblecl = 23.4393 - 3.563E-7 * d; +// // +// double w = 282.9404 + 4.70935E-5 * d; +// double M = 356.0470 + 0.9856002585 * d; +// double e = 0.016709 - 1.151E-9 * d; +// // +// // This is the obliquity of the ecliptic, plus some of the elements of +// // the Sun's apparent orbit (i.e., really the Earth's orbit): w = +// // argument of perihelion, M = mean anomaly, e = eccentricity. +// // Semi-major axis is here assumed to be exactly 1.0 (while not strictly +// // true, this is still an accurate approximation). Next compute E, the +// // eccentric anomaly: +// // +// double E = M + e*(180/PI) * ::sin(M*DEG_RAD) * ( 1.0 + e*cos(M*DEG_RAD) ); +// // +// // where E and M are in degrees. This is it---no further iterations are +// // needed because we know e has a sufficiently small value. Next compute +// // the true anomaly, v, and the distance, r: +// // +// /* r * cos(v) = */ double A = cos(E*DEG_RAD) - e; +// /* r * ::sin(v) = */ double B = ::sqrt(1 - e*e) * ::sin(E*DEG_RAD); +// // +// // and +// // +// // r = sqrt( A*A + B*B ) +// double v = ::atan2( B, A )*RAD_DEG; +// // +// // The Sun's true longitude, slon, can now be computed: +// // +// double slon = v + w; +// // +// // Since the Sun is always at the ecliptic (or at least very very close to +// // it), we can use simplified formulae to convert slon (the Sun's ecliptic +// // longitude) to sRA and sDec (the Sun's RA and Dec): +// // +// // ::sin(slon) * cos(oblecl) +// // tan(sRA) = ------------------------- +// // cos(slon) +// // +// // ::sin(sDec) = ::sin(oblecl) * ::sin(slon) +// // +// // As was the case when computing az, the Azimuth, if possible use an +// // atan2() function to compute sRA. +// +// double sRA = ::atan2(sin(slon*DEG_RAD) * cos(oblecl*DEG_RAD), cos(slon*DEG_RAD))*RAD_DEG; +// +// double sin_sDec = ::sin(oblecl*DEG_RAD) * ::sin(slon*DEG_RAD); +// double sDec = ::asin(sin_sDec)*RAD_DEG; +// +// // COMPUTING RISE AND SET TIMES +// // ---------------------------- +// // +// // To compute when an object rises or sets, you must compute when it +// // passes the meridian and the HA of rise/set. Then the rise time is +// // the meridian time minus HA for rise/set, and the set time is the +// // meridian time plus the HA for rise/set. +// // +// // To find the meridian time, compute the Local Sidereal Time at 0h local +// // time (or 0h UT if you prefer to work in UT) as outlined above---name +// // that quantity LST0. The Meridian Time, MT, will now be: +// // +// // MT = RA - LST0 +// double MT = normalize(sRA - LST, 360); +// // +// // where "RA" is the object's Right Ascension (in degrees!). If negative, +// // add 360 deg to MT. If the object is the Sun, leave the time as it is, +// // but if it's stellar, multiply MT by 365.2422/366.2422, to convert from +// // sidereal to solar time. Now, compute HA for rise/set, name that +// // quantity HA0: +// // +// // ::sin(h0) - ::sin(lat) * ::sin(Dec) +// // cos(HA0) = --------------------------------- +// // cos(lat) * cos(Dec) +// // +// // where h0 is the altitude selected to represent rise/set. For a purely +// // mathematical horizon, set h0 = 0 and simplify to: +// // +// // cos(HA0) = - tan(lat) * tan(Dec) +// // +// // If you want to account for refraction on the atmosphere, set h0 = -35/60 +// // degrees (-35 arc minutes), and if you want to compute the rise/set times +// // for the Sun's upper limb, set h0 = -50/60 (-50 arc minutes). +// // +// double h0 = -50/60 * DEG_RAD; +// +// double HA0 = ::acos( +// (sin(h0) - ::sin(fLatitude) * sin_sDec) / +// (cos(fLatitude) * cos(sDec*DEG_RAD)))*RAD_DEG; +// +// // When HA0 has been computed, leave it as it is for the Sun but multiply +// // by 365.2422/366.2422 for stellar objects, to convert from sidereal to +// // solar time. Finally compute: +// // +// // Rise time = MT - HA0 +// // Set time = MT + HA0 +// // +// // convert the times from degrees to hours by dividing by 15. +// // +// // If you'd like to check that your calculations are accurate or just +// // need a quick result, check the USNO's Sun or Moon Rise/Set Table, +// // . +// +// double result = MT + (rise ? -HA0 : HA0); // in degrees +// +// // Find UT midnight on this day +// long midnight = DAY_MS * (time / DAY_MS); +// +// return midnight + (long) (result * 3600000 / 15); +// } + +//------------------------------------------------------------------------- +// The Moon +//------------------------------------------------------------------------- + +#define moonL0 (318.351648 * CalendarAstronomer::PI/180 ) // Mean long. at epoch +#define moonP0 ( 36.340410 * CalendarAstronomer::PI/180 ) // Mean long. of perigee +#define moonN0 ( 318.510107 * CalendarAstronomer::PI/180 ) // Mean long. of node +#define moonI ( 5.145366 * CalendarAstronomer::PI/180 ) // Inclination of orbit +#define moonE ( 0.054900 ) // Eccentricity of orbit + +// These aren't used right now +#define moonA ( 3.84401e5 ) // semi-major axis (km) +#define moonT0 ( 0.5181 * CalendarAstronomer::PI/180 ) // Angular size at distance A +#define moonPi ( 0.9507 * CalendarAstronomer::PI/180 ) // Parallax at distance A + +/** + * The position of the moon at the time set on this + * object, in equatorial coordinates. + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +const CalendarAstronomer::Equatorial& CalendarAstronomer::getMoonPosition() +{ + // + // See page 142 of "Practial Astronomy with your Calculator", + // by Peter Duffet-Smith, for details on the algorithm. + // + if (moonPositionSet == FALSE) { + // Calculate the solar longitude. Has the side effect of + // filling in "meanAnomalySun" as well. + getSunLongitude(); + + // + // Find the # of days since the epoch of our orbital parameters. + // TODO: Convert the time of day portion into ephemeris time + // + double day = getJulianDay() - JD_EPOCH; // Days since epoch + + // Calculate the mean longitude and anomaly of the moon, based on + // a circular orbit. Similar to the corresponding solar calculation. + double meanLongitude = norm2PI(13.1763966*PI/180*day + moonL0); + meanAnomalyMoon = norm2PI(meanLongitude - 0.1114041*PI/180 * day - moonP0); + + // + // Calculate the following corrections: + // Evection: the sun's gravity affects the moon's eccentricity + // Annual Eqn: variation in the effect due to earth-sun distance + // A3: correction factor (for ???) + // + double evection = 1.2739*PI/180 * ::sin(2 * (meanLongitude - sunLongitude) + - meanAnomalyMoon); + double annual = 0.1858*PI/180 * ::sin(meanAnomalySun); + double a3 = 0.3700*PI/180 * ::sin(meanAnomalySun); + + meanAnomalyMoon += evection - annual - a3; + + // + // More correction factors: + // center equation of the center correction + // a4 yet another error correction (???) + // + // TODO: Skip the equation of the center correction and solve Kepler's eqn? + // + double center = 6.2886*PI/180 * ::sin(meanAnomalyMoon); + double a4 = 0.2140*PI/180 * ::sin(2 * meanAnomalyMoon); + + // Now find the moon's corrected longitude + moonLongitude = meanLongitude + evection + center - annual + a4; + + // + // And finally, find the variation, caused by the fact that the sun's + // gravitational pull on the moon varies depending on which side of + // the earth the moon is on + // + double variation = 0.6583*CalendarAstronomer::PI/180 * ::sin(2*(moonLongitude - sunLongitude)); + + moonLongitude += variation; + + // + // What we've calculated so far is the moon's longitude in the plane + // of its own orbit. Now map to the ecliptic to get the latitude + // and longitude. First we need to find the longitude of the ascending + // node, the position on the ecliptic where it is crossed by the moon's + // orbit as it crosses from the southern to the northern hemisphere. + // + double nodeLongitude = norm2PI(moonN0 - 0.0529539*PI/180 * day); + + nodeLongitude -= 0.16*PI/180 * ::sin(meanAnomalySun); + + double y = ::sin(moonLongitude - nodeLongitude); + double x = cos(moonLongitude - nodeLongitude); + + moonEclipLong = ::atan2(y*cos(moonI), x) + nodeLongitude; + double moonEclipLat = ::asin(y * ::sin(moonI)); + + eclipticToEquatorial(moonPosition, moonEclipLong, moonEclipLat); + moonPositionSet = TRUE; + } + return moonPosition; +} + +/** + * The "age" of the moon at the time specified in this object. + * This is really the angle between the + * current ecliptic longitudes of the sun and the moon, + * measured in radians. + * + * @see #getMoonPhase + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +double CalendarAstronomer::getMoonAge() { + // See page 147 of "Practial Astronomy with your Calculator", + // by Peter Duffet-Smith, for details on the algorithm. + // + // Force the moon's position to be calculated. We're going to use + // some the intermediate results cached during that calculation. + // + getMoonPosition(); + + return norm2PI(moonEclipLong - sunLongitude); +} + +/** + * Calculate the phase of the moon at the time set in this object. + * The returned phase is a double in the range + * 0 <= phase < 1, interpreted as follows: + *

      + *
    • 0.00: New moon + *
    • 0.25: First quarter + *
    • 0.50: Full moon + *
    • 0.75: Last quarter + *
    + * + * @see #getMoonAge + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +double CalendarAstronomer::getMoonPhase() { + // See page 147 of "Practial Astronomy with your Calculator", + // by Peter Duffet-Smith, for details on the algorithm. + return 0.5 * (1 - cos(getMoonAge())); +} + +/** + * Constant representing a new moon. + * For use with {@link #getMoonTime getMoonTime} + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +const CalendarAstronomer::MoonAge CalendarAstronomer::NEW_MOON() { + return CalendarAstronomer::MoonAge(0); +} + +/** + * Constant representing the moon's first quarter. + * For use with {@link #getMoonTime getMoonTime} + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +const CalendarAstronomer::MoonAge CalendarAstronomer::FIRST_QUARTER() { + return CalendarAstronomer::MoonAge(CalendarAstronomer::PI/2); +} + +/** + * Constant representing a full moon. + * For use with {@link #getMoonTime getMoonTime} + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +const CalendarAstronomer::MoonAge CalendarAstronomer::FULL_MOON() { + return CalendarAstronomer::MoonAge(CalendarAstronomer::PI); +} +/** + * Constant representing the moon's last quarter. + * For use with {@link #getMoonTime getMoonTime} + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ + +class MoonTimeAngleFunc : public CalendarAstronomer::AngleFunc { +public: + virtual double eval(CalendarAstronomer&a) { return a.getMoonAge(); } +}; + +const CalendarAstronomer::MoonAge CalendarAstronomer::LAST_QUARTER() { + return CalendarAstronomer::MoonAge((CalendarAstronomer::PI*3)/2); +} + +/** + * Find the next or previous time at which the Moon's ecliptic + * longitude will have the desired value. + *

    + * @param desired The desired longitude. + * @param next true if the next occurrance of the phase + * is desired, false for the previous occurrance. + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +UDate CalendarAstronomer::getMoonTime(double desired, UBool next) +{ + MoonTimeAngleFunc func; + return timeOfAngle( func, + desired, + SYNODIC_MONTH, + MINUTE_MS, + next); +} + +/** + * Find the next or previous time at which the moon will be in the + * desired phase. + *

    + * @param desired The desired phase of the moon. + * @param next true if the next occurrance of the phase + * is desired, false for the previous occurrance. + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +UDate CalendarAstronomer::getMoonTime(const CalendarAstronomer::MoonAge& desired, UBool next) { + return getMoonTime(desired.value, next); +} + +class MoonRiseSetCoordFunc : public CalendarAstronomer::CoordFunc { +public: + virtual void eval(CalendarAstronomer::Equatorial& result, CalendarAstronomer&a) { result = a.getMoonPosition(); } +}; + +/** + * Returns the time (GMT) of sunrise or sunset on the local date to which + * this calendar is currently set. + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +UDate CalendarAstronomer::getMoonRiseSet(UBool rise) +{ + MoonRiseSetCoordFunc func; + return riseOrSet(func, + rise, + .533 * DEG_RAD, // Angular Diameter + 34 /60.0 * DEG_RAD, // Refraction correction + MINUTE_MS); // Desired accuracy +} + +//------------------------------------------------------------------------- +// Interpolation methods for finding the time at which a given event occurs +//------------------------------------------------------------------------- + +UDate CalendarAstronomer::timeOfAngle(AngleFunc& func, double desired, + double periodDays, double epsilon, UBool next) +{ + // Find the value of the function at the current time + double lastAngle = func.eval(*this); + + // Find out how far we are from the desired angle + double deltaAngle = norm2PI(desired - lastAngle) ; + + // Using the average period, estimate the next (or previous) time at + // which the desired angle occurs. + double deltaT = (deltaAngle + (next ? 0.0 : - CalendarAstronomer_PI2 )) * (periodDays*DAY_MS) / CalendarAstronomer_PI2; + + double lastDeltaT = deltaT; // Liu + UDate startTime = fTime; // Liu + + setTime(fTime + uprv_ceil(deltaT)); + + // Now iterate until we get the error below epsilon. Throughout + // this loop we use normPI to get values in the range -Pi to Pi, + // since we're using them as correction factors rather than absolute angles. + do { + // Evaluate the function at the time we've estimated + double angle = func.eval(*this); + + // Find the # of milliseconds per radian at this point on the curve + double factor = uprv_fabs(deltaT / normPI(angle-lastAngle)); + + // Correct the time estimate based on how far off the angle is + deltaT = normPI(desired - angle) * factor; + + // HACK: + // + // If abs(deltaT) begins to diverge we need to quit this loop. + // This only appears to happen when attempting to locate, for + // example, a new moon on the day of the new moon. E.g.: + // + // This result is correct: + // newMoon(7508(Mon Jul 23 00:00:00 CST 1990,false))= + // Sun Jul 22 10:57:41 CST 1990 + // + // But attempting to make the same call a day earlier causes deltaT + // to diverge: + // CalendarAstronomer.timeOfAngle() diverging: 1.348508727575625E9 -> + // 1.3649828540224032E9 + // newMoon(7507(Sun Jul 22 00:00:00 CST 1990,false))= + // Sun Jul 08 13:56:15 CST 1990 + // + // As a temporary solution, we catch this specific condition and + // adjust our start time by one eighth period days (either forward + // or backward) and try again. + // Liu 11/9/00 + if (uprv_fabs(deltaT) > uprv_fabs(lastDeltaT)) { + double delta = uprv_ceil (periodDays * DAY_MS / 8.0); + setTime(startTime + (next ? delta : -delta)); + return timeOfAngle(func, desired, periodDays, epsilon, next); + } + + lastDeltaT = deltaT; + lastAngle = angle; + + setTime(fTime + uprv_ceil(deltaT)); + } + while (uprv_fabs(deltaT) > epsilon); + + return fTime; +} + +UDate CalendarAstronomer::riseOrSet(CoordFunc& func, UBool rise, + double diameter, double refraction, + double epsilon) +{ + Equatorial pos; + double tanL = ::tan(fLatitude); + double deltaT = 0; + int32_t count = 0; + + // + // Calculate the object's position at the current time, then use that + // position to calculate the time of rising or setting. The position + // will be different at that time, so iterate until the error is allowable. + // + U_DEBUG_ASTRO_MSG(("setup rise=%s, dia=%.3lf, ref=%.3lf, eps=%.3lf\n", + rise?"T":"F", diameter, refraction, epsilon)); + do { + // See "Practical Astronomy With Your Calculator, section 33. + func.eval(pos, *this); + double angle = ::acos(-tanL * ::tan(pos.declination)); + double lst = ((rise ? CalendarAstronomer_PI2-angle : angle) + pos.ascension ) * 24 / CalendarAstronomer_PI2; + + // Convert from LST to Universal Time. + UDate newTime = lstToUT( lst ); + + deltaT = newTime - fTime; + setTime(newTime); + U_DEBUG_ASTRO_MSG(("%d] dT=%.3lf, angle=%.3lf, lst=%.3lf, A=%.3lf/D=%.3lf\n", + count, deltaT, angle, lst, pos.ascension, pos.declination)); + } + while (++ count < 5 && uprv_fabs(deltaT) > epsilon); + + // Calculate the correction due to refraction and the object's angular diameter + double cosD = ::cos(pos.declination); + double psi = ::acos(sin(fLatitude) / cosD); + double x = diameter / 2 + refraction; + double y = ::asin(sin(x) / ::sin(psi)); + long delta = (long)((240 * y * RAD_DEG / cosD)*SECOND_MS); + + return fTime + (rise ? -delta : delta); +} + +/** + * Find the "true anomaly" (longitude) of an object from + * its mean anomaly and the eccentricity of its orbit. This uses + * an iterative solution to Kepler's equation. + * + * @param meanAnomaly The object's longitude calculated as if it were in + * a regular, circular orbit, measured in radians + * from the point of perigee. + * + * @param eccentricity The eccentricity of the orbit + * + * @return The true anomaly (longitude) measured in radians + */ +double CalendarAstronomer::trueAnomaly(double meanAnomaly, double eccentricity) +{ + // First, solve Kepler's equation iteratively + // Duffett-Smith, p.90 + double delta; + double E = meanAnomaly; + do { + delta = E - eccentricity * ::sin(E) - meanAnomaly; + E = E - delta / (1 - eccentricity * ::cos(E)); + } + while (uprv_fabs(delta) > 1e-5); // epsilon = 1e-5 rad + + return 2.0 * ::atan( ::tan(E/2) * ::sqrt( (1+eccentricity) + /(1-eccentricity) ) ); +} + +/** + * Return the obliquity of the ecliptic (the angle between the ecliptic + * and the earth's equator) at the current time. This varies due to + * the precession of the earth's axis. + * + * @return the obliquity of the ecliptic relative to the equator, + * measured in radians. + */ +double CalendarAstronomer::eclipticObliquity() { + if (isINVALID(eclipObliquity)) { + const double epoch = 2451545.0; // 2000 AD, January 1.5 + + double T = (getJulianDay() - epoch) / 36525; + + eclipObliquity = 23.439292 + - 46.815/3600 * T + - 0.0006/3600 * T*T + + 0.00181/3600 * T*T*T; + + eclipObliquity *= DEG_RAD; + } + return eclipObliquity; +} + + +//------------------------------------------------------------------------- +// Private data +//------------------------------------------------------------------------- +void CalendarAstronomer::clearCache() { + const double INVALID = uprv_getNaN(); + + julianDay = INVALID; + julianCentury = INVALID; + sunLongitude = INVALID; + meanAnomalySun = INVALID; + moonLongitude = INVALID; + moonEclipLong = INVALID; + meanAnomalyMoon = INVALID; + eclipObliquity = INVALID; + siderealTime = INVALID; + siderealT0 = INVALID; + moonPositionSet = FALSE; +} + +//private static void out(String s) { +// System.out.println(s); +//} + +//private static String deg(double rad) { +// return Double.toString(rad * RAD_DEG); +//} + +//private static String hours(long ms) { +// return Double.toString((double)ms / HOUR_MS) + " hours"; +//} + +/** + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ +UDate CalendarAstronomer::local(UDate localMillis) { + // TODO - srl ? + TimeZone *tz = TimeZone::createDefault(); + int32_t rawOffset; + int32_t dstOffset; + UErrorCode status = U_ZERO_ERROR; + tz->getOffset(localMillis, TRUE, rawOffset, dstOffset, status); + delete tz; + return localMillis - rawOffset; +} + +// Debugging functions +UnicodeString CalendarAstronomer::Ecliptic::toString() const +{ +#ifdef U_DEBUG_ASTRO + char tmp[800]; + sprintf(tmp, "[%.5f,%.5f]", longitude*RAD_DEG, latitude*RAD_DEG); + return UnicodeString(tmp, ""); +#else + return UnicodeString(); +#endif +} + +UnicodeString CalendarAstronomer::Equatorial::toString() const +{ +#ifdef U_DEBUG_ASTRO + char tmp[400]; + sprintf(tmp, "%f,%f", + (ascension*RAD_DEG), (declination*RAD_DEG)); + return UnicodeString(tmp, ""); +#else + return UnicodeString(); +#endif +} + +UnicodeString CalendarAstronomer::Horizon::toString() const +{ +#ifdef U_DEBUG_ASTRO + char tmp[800]; + sprintf(tmp, "[%.5f,%.5f]", altitude*RAD_DEG, azimuth*RAD_DEG); + return UnicodeString(tmp, ""); +#else + return UnicodeString(); +#endif +} + + +// static private String radToHms(double angle) { +// int hrs = (int) (angle*RAD_HOUR); +// int min = (int)((angle*RAD_HOUR - hrs) * 60); +// int sec = (int)((angle*RAD_HOUR - hrs - min/60.0) * 3600); + +// return Integer.toString(hrs) + "h" + min + "m" + sec + "s"; +// } + +// static private String radToDms(double angle) { +// int deg = (int) (angle*RAD_DEG); +// int min = (int)((angle*RAD_DEG - deg) * 60); +// int sec = (int)((angle*RAD_DEG - deg - min/60.0) * 3600); + +// return Integer.toString(deg) + "\u00b0" + min + "'" + sec + "\""; +// } + +// =============== Calendar Cache ================ + +void CalendarCache::createCache(CalendarCache** cache, UErrorCode& status) { + ucln_i18n_registerCleanup(UCLN_I18N_ASTRO_CALENDAR, calendar_astro_cleanup); + *cache = new CalendarCache(32, status); + if(cache == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + } + if(U_FAILURE(status)) { + delete *cache; + *cache = NULL; + } +} + +int32_t CalendarCache::get(CalendarCache** cache, int32_t key, UErrorCode &status) { + int32_t res; + + if(U_FAILURE(status)) { + return 0; + } + umtx_lock(&ccLock); + + if(*cache == NULL) { + createCache(cache, status); + if(U_FAILURE(status)) { + umtx_unlock(&ccLock); + return 0; + } + } + + res = uhash_igeti((*cache)->fTable, key); + U_DEBUG_ASTRO_MSG(("%p: GET: [%d] == %d\n", (*cache)->fTable, key, res)); + + umtx_unlock(&ccLock); + return res; +} + +void CalendarCache::put(CalendarCache** cache, int32_t key, int32_t value, UErrorCode &status) { + + if(U_FAILURE(status)) { + return; + } + umtx_lock(&ccLock); + + if(*cache == NULL) { + createCache(cache, status); + if(U_FAILURE(status)) { + umtx_unlock(&ccLock); + return; + } + } + + uhash_iputi((*cache)->fTable, key, value, &status); + U_DEBUG_ASTRO_MSG(("%p: PUT: [%d] := %d\n", (*cache)->fTable, key, value)); + + umtx_unlock(&ccLock); +} + +CalendarCache::CalendarCache(int32_t size, UErrorCode &status) { + fTable = uhash_openSize(uhash_hashLong, uhash_compareLong, size, &status); + U_DEBUG_ASTRO_MSG(("%p: Opening.\n", fTable)); +} + +CalendarCache::~CalendarCache() { + if(fTable != NULL) { + U_DEBUG_ASTRO_MSG(("%p: Closing.\n", fTable)); + uhash_close(fTable); + } +} + +U_NAMESPACE_END + +#endif // !UCONFIG_NO_FORMATTING diff --git a/icuSources/i18n/astro.h b/icuSources/i18n/astro.h new file mode 100644 index 00000000..8291d60e --- /dev/null +++ b/icuSources/i18n/astro.h @@ -0,0 +1,791 @@ +/************************************************************************ + * Copyright (C) 1996-2003, International Business Machines Corporation * + * and others. All Rights Reserved. * + ************************************************************************ + * 2003-nov-07 srl Port from Java + */ + +#ifndef ASTRO_H +#define ASTRO_H + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "gregoimp.h" // for Math +#include "unicode/unistr.h" + +U_NAMESPACE_BEGIN + +/** + * CalendarAstronomer is a class that can perform the calculations to + * determine the positions of the sun and moon, the time of sunrise and + * sunset, and other astronomy-related data. The calculations it performs + * are in some cases quite complicated, and this utility class saves you + * the trouble of worrying about them. + *

    + * The measurement of time is a very important part of astronomy. Because + * astronomical bodies are constantly in motion, observations are only valid + * at a given moment in time. Accordingly, each CalendarAstronomer + * object has a time property that determines the date + * and time for which its calculations are performed. You can set and + * retrieve this property with {@link #setDate setDate}, {@link #getDate getDate} + * and related methods. + *

    + * Almost all of the calculations performed by this class, or by any + * astronomer, are approximations to various degrees of accuracy. The + * calculations in this class are mostly modelled after those described + * in the book + * + * Practical Astronomy With Your Calculator, by Peter J. + * Duffett-Smith, Cambridge University Press, 1990. This is an excellent + * book, and if you want a greater understanding of how these calculations + * are performed it a very good, readable starting point. + *

    + * WARNING: This class is very early in its development, and + * it is highly likely that its API will change to some degree in the future. + * At the moment, it basically does just enough to support {@link IslamicCalendar} + * and {@link ChineseCalendar}. + * + * @author Laura Werner + * @author Alan Liu + * @internal + */ +class U_I18N_API CalendarAstronomer : public UMemory { +public: + // some classes + +public: + /** + * Represents the position of an object in the sky relative to the ecliptic, + * the plane of the earth's orbit around the Sun. + * This is a spherical coordinate system in which the latitude + * specifies the position north or south of the plane of the ecliptic. + * The longitude specifies the position along the ecliptic plane + * relative to the "First Point of Aries", which is the Sun's position in the sky + * at the Vernal Equinox. + *

    + * Note that Ecliptic objects are immutable and cannot be modified + * once they are constructed. This allows them to be passed and returned by + * value without worrying about whether other code will modify them. + * + * @see CalendarAstronomer.Equatorial + * @see CalendarAstronomer.Horizon + * @internal + */ + class U_I18N_API Ecliptic : public UMemory { + public: + /** + * Constructs an Ecliptic coordinate object. + *

    + * @param lat The ecliptic latitude, measured in radians. + * @param lon The ecliptic longitude, measured in radians. + * @internal + */ + Ecliptic(double lat = 0, double lon = 0) { + latitude = lat; + longitude = lon; + } + + /** + * Setter for Ecliptic Coordinate object + * @param lat The ecliptic latitude, measured in radians. + * @param lon The ecliptic longitude, measured in radians. + * @internal + */ + void set(double lat, double lon) { + latitude = lat; + longitude = lon; + } + + /** + * Return a string representation of this object + * @internal + */ + UnicodeString toString() const; + + /** + * The ecliptic latitude, in radians. This specifies an object's + * position north or south of the plane of the ecliptic, + * with positive angles representing north. + * @internal + */ + double latitude; + + /** + * The ecliptic longitude, in radians. + * This specifies an object's position along the ecliptic plane + * relative to the "First Point of Aries", which is the Sun's position + * in the sky at the Vernal Equinox, + * with positive angles representing east. + *

    + * A bit of trivia: the first point of Aries is currently in the + * constellation Pisces, due to the precession of the earth's axis. + * @internal + */ + double longitude; + }; + + /** + * Represents the position of an + * object in the sky relative to the plane of the earth's equator. + * The Right Ascension specifies the position east or west + * along the equator, relative to the sun's position at the vernal + * equinox. The Declination is the position north or south + * of the equatorial plane. + *

    + * Note that Equatorial objects are immutable and cannot be modified + * once they are constructed. This allows them to be passed and returned by + * value without worrying about whether other code will modify them. + * + * @see CalendarAstronomer.Ecliptic + * @see CalendarAstronomer.Horizon + * @internal + */ + class U_I18N_API Equatorial : public UMemory { + public: + /** + * Constructs an Equatorial coordinate object. + *

    + * @param asc The right ascension, measured in radians. + * @param dec The declination, measured in radians. + * @internal + */ + Equatorial(double asc = 0, double dec = 0) + : ascension(asc), declination(dec) { } + + /** + * Setter + * @param asc The right ascension, measured in radians. + * @param dec The declination, measured in radians. + * @internal + */ + void set(double asc, double dec) { + ascension = asc; + declination = dec; + } + + /** + * Return a string representation of this object, with the + * angles measured in degrees. + * @internal + */ + UnicodeString toString() const; + + /** + * Return a string representation of this object with the right ascension + * measured in hours, minutes, and seconds. + * @internal + */ + //String toHmsString() { + //return radToHms(ascension) + "," + radToDms(declination); + //} + + /** + * The right ascension, in radians. + * This is the position east or west along the equator + * relative to the sun's position at the vernal equinox, + * with positive angles representing East. + * @internal + */ + double ascension; + + /** + * The declination, in radians. + * This is the position north or south of the equatorial plane, + * with positive angles representing north. + * @internal + */ + double declination; + }; + + /** + * Represents the position of an object in the sky relative to + * the local horizon. + * The Altitude represents the object's elevation above the horizon, + * with objects below the horizon having a negative altitude. + * The Azimuth is the geographic direction of the object from the + * observer's position, with 0 representing north. The azimuth increases + * clockwise from north. + *

    + * Note that Horizon objects are immutable and cannot be modified + * once they are constructed. This allows them to be passed and returned by + * value without worrying about whether other code will modify them. + * + * @see CalendarAstronomer.Ecliptic + * @see CalendarAstronomer.Equatorial + * @internal + */ + class U_I18N_API Horizon : public UMemory { + public: + /** + * Constructs a Horizon coordinate object. + *

    + * @param alt The altitude, measured in radians above the horizon. + * @param azim The azimuth, measured in radians clockwise from north. + * @internal + */ + Horizon(double alt=0, double azim=0) + : altitude(alt), azimuth(azim) { } + + /** + * Setter for Ecliptic Coordinate object + * @param alt The altitude, measured in radians above the horizon. + * @param azim The azimuth, measured in radians clockwise from north. + * @internal + */ + void set(double alt, double azim) { + altitude = alt; + azimuth = azim; + } + + /** + * Return a string representation of this object, with the + * angles measured in degrees. + * @internal + */ + UnicodeString toString() const; + + /** + * The object's altitude above the horizon, in radians. + * @internal + */ + double altitude; + + /** + * The object's direction, in radians clockwise from north. + * @internal + */ + double azimuth; + }; + +public: + //------------------------------------------------------------------------- + // Assorted private data used for conversions + //------------------------------------------------------------------------- + + // My own copies of these so compilers are more likely to optimize them away + static const double PI; + + /** + * The average number of solar days from one new moon to the next. This is the time + * it takes for the moon to return the same ecliptic longitude as the sun. + * It is longer than the sidereal month because the sun's longitude increases + * during the year due to the revolution of the earth around the sun. + * Approximately 29.53. + * + * @see #SIDEREAL_MONTH + * @internal + * @deprecated ICU 2.4. This class may be removed or modified. + */ + static const double SYNODIC_MONTH; + + //------------------------------------------------------------------------- + // Constructors + //------------------------------------------------------------------------- + + /** + * Construct a new CalendarAstronomer object that is initialized to + * the current date and time. + * @internal + */ + CalendarAstronomer(); + + /** + * Construct a new CalendarAstronomer object that is initialized to + * the specified date and time. + * @internal + */ + CalendarAstronomer(UDate d); + + /** + * Construct a new CalendarAstronomer object with the given + * latitude and longitude. The object's time is set to the current + * date and time. + *

    + * @param longitude The desired longitude, in degrees east of + * the Greenwich meridian. + * + * @param latitude The desired latitude, in degrees. Positive + * values signify North, negative South. + * + * @see java.util.Date#getTime() + * @internal + */ + CalendarAstronomer(double longitude, double latitude); + + /** + * Destructor + * @internal + */ + ~CalendarAstronomer(); + + //------------------------------------------------------------------------- + // Time and date getters and setters + //------------------------------------------------------------------------- + + /** + * Set the current date and time of this CalendarAstronomer object. All + * astronomical calculations are performed based on this time setting. + * + * @param aTime the date and time, expressed as the number of milliseconds since + * 1/1/1970 0:00 GMT (Gregorian). + * + * @see #setDate + * @see #getTime + * @internal + */ + void setTime(UDate aTime); + + + /** + * Set the current date and time of this CalendarAstronomer object. All + * astronomical calculations are performed based on this time setting. + * + * @param aTime the date and time, expressed as the number of milliseconds since + * 1/1/1970 0:00 GMT (Gregorian). + * + * @see #getTime + * @internal + */ + void setDate(UDate aDate) { setTime(aDate); } + + /** + * Set the current date and time of this CalendarAstronomer object. All + * astronomical calculations are performed based on this time setting. + * + * @param jdn the desired time, expressed as a "julian day number", + * which is the number of elapsed days since + * 1/1/4713 BC (Julian), 12:00 GMT. Note that julian day + * numbers start at noon. To get the jdn for + * the corresponding midnight, subtract 0.5. + * + * @see #getJulianDay + * @see #JULIAN_EPOCH_MS + * @internal + */ + void setJulianDay(double jdn); + + /** + * Get the current time of this CalendarAstronomer object, + * represented as the number of milliseconds since + * 1/1/1970 AD 0:00 GMT (Gregorian). + * + * @see #setTime + * @see #getDate + * @internal + */ + UDate getTime(); + + /** + * Get the current time of this CalendarAstronomer object, + * expressed as a "julian day number", which is the number of elapsed + * days since 1/1/4713 BC (Julian), 12:00 GMT. + * + * @see #setJulianDay + * @see #JULIAN_EPOCH_MS + * @internal + */ + double getJulianDay(); + + /** + * Return this object's time expressed in julian centuries: + * the number of centuries after 1/1/1900 AD, 12:00 GMT + * + * @see #getJulianDay + * @internal + */ + double getJulianCentury(); + + /** + * Returns the current Greenwich sidereal time, measured in hours + * @internal + */ + double getGreenwichSidereal(); + +private: + double getSiderealOffset(); +public: + /** + * Returns the current local sidereal time, measured in hours + * @internal + */ + double getLocalSidereal(); + + /** + * Converts local sidereal time to Universal Time. + * + * @param lst The Local Sidereal Time, in hours since sidereal midnight + * on this object's current date. + * + * @return The corresponding Universal Time, in milliseconds since + * 1 Jan 1970, GMT. + */ + //private: + double lstToUT(double lst); + + /** + * + * Convert from ecliptic to equatorial coordinates. + * + * @param ecliptic The ecliptic + * @param result Fillin result + * @return reference to result + */ + Equatorial& eclipticToEquatorial(Equatorial& result, const Ecliptic& ecliptic); + + /** + * Convert from ecliptic to equatorial coordinates. + * + * @param eclipLong The ecliptic longitude + * @param eclipLat The ecliptic latitude + * + * @return The corresponding point in equatorial coordinates. + * @internal + */ + Equatorial& eclipticToEquatorial(Equatorial& result, double eclipLong, double eclipLat); + + /** + * Convert from ecliptic longitude to equatorial coordinates. + * + * @param eclipLong The ecliptic longitude + * + * @return The corresponding point in equatorial coordinates. + * @internal + */ + Equatorial& eclipticToEquatorial(Equatorial& result, double eclipLong) ; + + /** + * @internal + */ + Horizon& eclipticToHorizon(Horizon& result, double eclipLong) ; + + //------------------------------------------------------------------------- + // The Sun + //------------------------------------------------------------------------- + + /** + * The longitude of the sun at the time specified by this object. + * The longitude is measured in radians along the ecliptic + * from the "first point of Aries," the point at which the ecliptic + * crosses the earth's equatorial plane at the vernal equinox. + *

    + * Currently, this method uses an approximation of the two-body Kepler's + * equation for the earth and the sun. It does not take into account the + * perturbations caused by the other planets, the moon, etc. + * @internal + */ + double getSunLongitude(); + + /** + * TODO Make this public when the entire class is package-private. + */ + /*public*/ void getSunLongitude(double julianDay, double &longitude, double &meanAnomaly); + + /** + * The position of the sun at this object's current date and time, + * in equatorial coordinates. + * @param result fillin for the result + * @internal + */ + Equatorial& getSunPosition(Equatorial& result); + +public: + /** + * Constant representing the vernal equinox. + * For use with {@link #getSunTime getSunTime}. + * Note: In this case, "vernal" refers to the northern hemisphere's seasons. + * @internal + */ + static double VERNAL_EQUINOX(); + + /** + * Constant representing the summer solstice. + * For use with {@link #getSunTime getSunTime}. + * Note: In this case, "summer" refers to the northern hemisphere's seasons. + * @internal + */ + static double SUMMER_SOLSTICE(); + + /** + * Constant representing the autumnal equinox. + * For use with {@link #getSunTime getSunTime}. + * Note: In this case, "autumn" refers to the northern hemisphere's seasons. + * @internal + */ + static double AUTUMN_EQUINOX(); + + /** + * Constant representing the winter solstice. + * For use with {@link #getSunTime getSunTime}. + * Note: In this case, "winter" refers to the northern hemisphere's seasons. + * @internal + */ + static double WINTER_SOLSTICE(); + + /** + * Find the next time at which the sun's ecliptic longitude will have + * the desired value. + * @internal + */ + UDate getSunTime(double desired, UBool next); + + /** + * Returns the time (GMT) of sunrise or sunset on the local date to which + * this calendar is currently set. + * + * NOTE: This method only works well if this object is set to a + * time near local noon. Because of variations between the local + * official time zone and the geographic longitude, the + * computation can flop over into an adjacent day if this object + * is set to a time near local midnight. + * + * @internal + */ + UDate getSunRiseSet(UBool rise); + + //------------------------------------------------------------------------- + // The Moon + //------------------------------------------------------------------------- + + /** + * The position of the moon at the time set on this + * object, in equatorial coordinates. + * @internal + * @return const reference to internal field of calendar astronomer. Do not use outside of the lifetime of this astronomer. + */ + const Equatorial& getMoonPosition(); + + /** + * The "age" of the moon at the time specified in this object. + * This is really the angle between the + * current ecliptic longitudes of the sun and the moon, + * measured in radians. + * + * @see #getMoonPhase + * @internal + */ + double getMoonAge(); + + /** + * Calculate the phase of the moon at the time set in this object. + * The returned phase is a double in the range + * 0 <= phase < 1, interpreted as follows: + *

      + *
    • 0.00: New moon + *
    • 0.25: First quarter + *
    • 0.50: Full moon + *
    • 0.75: Last quarter + *
    + * + * @see #getMoonAge + * @internal + */ + double getMoonPhase(); + + class U_I18N_API MoonAge : public UMemory { + public: + MoonAge(double l) + : value(l) { } + void set(double l) { value = l; } + double value; + }; + + /** + * Constant representing a new moon. + * For use with {@link #getMoonTime getMoonTime} + * @internal + */ + static const MoonAge NEW_MOON(); + + /** + * Constant representing the moon's first quarter. + * For use with {@link #getMoonTime getMoonTime} + * @internal + */ + static const MoonAge FIRST_QUARTER(); + + /** + * Constant representing a full moon. + * For use with {@link #getMoonTime getMoonTime} + * @internal + */ + static const MoonAge FULL_MOON(); + + /** + * Constant representing the moon's last quarter. + * For use with {@link #getMoonTime getMoonTime} + * @internal + */ + static const MoonAge LAST_QUARTER(); + + /** + * Find the next or previous time at which the Moon's ecliptic + * longitude will have the desired value. + *

    + * @param desired The desired longitude. + * @param next true if the next occurrance of the phase + * is desired, false for the previous occurrance. + * @internal + */ + UDate getMoonTime(double desired, UBool next); + UDate getMoonTime(const MoonAge& desired, UBool next); + + /** + * Returns the time (GMT) of sunrise or sunset on the local date to which + * this calendar is currently set. + * @internal + */ + UDate getMoonRiseSet(UBool rise); + + //------------------------------------------------------------------------- + // Interpolation methods for finding the time at which a given event occurs + //------------------------------------------------------------------------- + + // private + class U_I18N_API AngleFunc : public UMemory { + public: + virtual double eval(CalendarAstronomer&) = 0; + }; + friend class AngleFunc; + + UDate timeOfAngle(AngleFunc& func, double desired, + double periodDays, double epsilon, UBool next); + + class U_I18N_API CoordFunc : public UMemory { + public: + virtual void eval(Equatorial& result, CalendarAstronomer&) = 0; + }; + friend class CoordFunc; + + double riseOrSet(CoordFunc& func, UBool rise, + double diameter, double refraction, + double epsilon); + + //------------------------------------------------------------------------- + // Other utility methods + //------------------------------------------------------------------------- +private: + /*** + * Given 'value', add or subtract 'range' until 0 <= 'value' < range. + * The modulus operator. + */ + inline static double normalize(double value, double range) { + return value - range * Math::floorDivide(value, range); + } + + /** + * Normalize an angle so that it's in the range 0 - 2pi. + * For positive angles this is just (angle % 2pi), but the Java + * mod operator doesn't work that way for negative numbers.... + */ + inline static double norm2PI(double angle) { + return normalize(angle, CalendarAstronomer::PI * 2.0); + } + + /** + * Normalize an angle into the range -PI - PI + */ + inline static double normPI(double angle) { + return normalize(angle + PI, CalendarAstronomer::PI * 2.0) - PI; + } + + /** + * Find the "true anomaly" (longitude) of an object from + * its mean anomaly and the eccentricity of its orbit. This uses + * an iterative solution to Kepler's equation. + * + * @param meanAnomaly The object's longitude calculated as if it were in + * a regular, circular orbit, measured in radians + * from the point of perigee. + * + * @param eccentricity The eccentricity of the orbit + * + * @return The true anomaly (longitude) measured in radians + */ + double trueAnomaly(double meanAnomaly, double eccentricity); + + /** + * Return the obliquity of the ecliptic (the angle between the ecliptic + * and the earth's equator) at the current time. This varies due to + * the precession of the earth's axis. + * + * @return the obliquity of the ecliptic relative to the equator, + * measured in radians. + */ + double eclipticObliquity(); + + //------------------------------------------------------------------------- + // Private data + //------------------------------------------------------------------------- +private: + /** + * Current time in milliseconds since 1/1/1970 AD + * @see java.util.Date#getTime + */ + UDate fTime; + + /* These aren't used yet, but they'll be needed for sunset calculations + * and equatorial to horizon coordinate conversions + */ + double fLongitude; + double fLatitude; + double fGmtOffset; + + // + // The following fields are used to cache calculated results for improved + // performance. These values all depend on the current time setting + // of this object, so the clearCache method is provided. + // + + double julianDay ; + double julianCentury ; + double sunLongitude ; + double meanAnomalySun ; + double moonLongitude ; + double moonEclipLong ; + double meanAnomalyMoon ; + double eclipObliquity ; + double siderealT0 ; + double siderealTime ; + + void clearCache(); + + Equatorial moonPosition; + UBool moonPositionSet; + + /** + * @internal + */ + UDate local(UDate localMillis); +}; + +U_NAMESPACE_END + +struct UHashtable; + +U_NAMESPACE_BEGIN + +/** + * Cache of month -> julian day + * @internal + */ +class U_I18N_API CalendarCache : public UMemory { +public: + static int32_t get(CalendarCache** cache, int32_t key, UErrorCode &status); + static void put(CalendarCache** cache, int32_t key, int32_t value, UErrorCode &status); + virtual ~CalendarCache(); +private: + CalendarCache(int32_t size, UErrorCode& status); + static void createCache(CalendarCache** cache, UErrorCode& status); + /** + * not implemented + */ + CalendarCache(); + UHashtable *fTable; +}; + +U_NAMESPACE_END + +#endif +#endif diff --git a/icuSources/i18n/buddhcal.cpp b/icuSources/i18n/buddhcal.cpp index bf4290d0..e7cc5d41 100644 --- a/icuSources/i18n/buddhcal.cpp +++ b/icuSources/i18n/buddhcal.cpp @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 2003, International Business Machines Corporation and * +* Copyright (C) 2003-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* * @@ -22,7 +22,7 @@ U_NAMESPACE_BEGIN -const char BuddhistCalendar::fgClassID = 0; // Value is irrelevant +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(BuddhistCalendar) static const int32_t kMaxEra = 0; // only 1 era @@ -92,14 +92,13 @@ int32_t BuddhistCalendar::monthLength(int32_t month) const { UErrorCode status = U_ZERO_ERROR; - int32_t year = internalGet(UCAL_YEAR); // ignore era return GregorianCalendar::monthLength(month, getGregorianYear(status)); } int32_t BuddhistCalendar::internalGetEra() const { - return isSet(UCAL_ERA) ? internalGet(UCAL_ERA) : BE; + return internalGet(UCAL_ERA, BE); } int32_t @@ -117,9 +116,47 @@ BuddhistCalendar::getGregorianYear(UErrorCode &status) const return year + kBuddhistEraStart; } +int32_t BuddhistCalendar::handleGetExtendedYear() +{ + int32_t year; + if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) { + year = internalGet(UCAL_EXTENDED_YEAR, 1); + } else { + // Ignore the era, as there is only one + year = internalGet(UCAL_YEAR, 1); + } + return year; +} + +int32_t BuddhistCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, + + UBool useMonth) const +{ + return GregorianCalendar::handleComputeMonthStart(eyear+kBuddhistEraStart, month, useMonth); +} + +void BuddhistCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status) +{ + GregorianCalendar::handleComputeFields(julianDay, status); + int32_t y = internalGet(UCAL_EXTENDED_YEAR) - kBuddhistEraStart; + internalSet(UCAL_EXTENDED_YEAR, y); + internalSet(UCAL_ERA, 0); + internalSet(UCAL_YEAR, y); +} + +int32_t BuddhistCalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) const +{ + if(field == UCAL_ERA) { + return BE; + } else { + return GregorianCalendar::handleGetLimit(field,limitType); + } +} + +#if 0 void BuddhistCalendar::timeToFields(UDate theTime, UBool quick, UErrorCode& status) { - GregorianCalendar::timeToFields(theTime, quick, status); + //Calendar::timeToFields(theTime, quick, status); int32_t era = internalGet(UCAL_ERA); int32_t year = internalGet(UCAL_YEAR); @@ -138,6 +175,7 @@ void BuddhistCalendar::timeToFields(UDate theTime, UBool quick, UErrorCode& stat internalSet(UCAL_ERA, era); internalSet(UCAL_YEAR, year); } +#endif void BuddhistCalendar::add(UCalendarDateFields field, int32_t amount, UErrorCode& status) { @@ -148,8 +186,7 @@ void BuddhistCalendar::add(UCalendarDateFields field, int32_t amount, UErrorCode return; // Do nothing! if(field == UCAL_YEAR /* || field == UCAL_YEAR_WOY */) { - int32_t year = internalGet(field); - int32_t era = internalGetEra(); + int32_t year = get(field, status); // not internalGet -- force completion year += amount; @@ -235,19 +272,18 @@ BuddhistCalendar::initializeSystemDefaultCentury() if (fgSystemDefaultCenturyStart == fgSystemDefaultCentury) { UErrorCode status = U_ZERO_ERROR; - Calendar *calendar = new BuddhistCalendar(Locale("th_TH_TRADITIONAL"),status); - if (calendar != NULL && U_SUCCESS(status)) + BuddhistCalendar calendar(Locale("@calendar=buddhist"),status); + if (U_SUCCESS(status)) { - calendar->setTime(Calendar::getNow(), status); - calendar->add(UCAL_YEAR, -80, status); - UDate newStart = calendar->getTime(status); - int32_t newYear = calendar->get(UCAL_YEAR, status); + calendar.setTime(Calendar::getNow(), status); + calendar.add(UCAL_YEAR, -80, status); + UDate newStart = calendar.getTime(status); + int32_t newYear = calendar.get(UCAL_YEAR, status); { Mutex m; fgSystemDefaultCenturyStart = newStart; fgSystemDefaultCenturyStartYear = newYear; } - delete calendar; } // We have no recourse upon failure unless we want to propagate the failure // out. diff --git a/icuSources/i18n/buddhcal.h b/icuSources/i18n/buddhcal.h index 13681324..bb3316b4 100644 --- a/icuSources/i18n/buddhcal.h +++ b/icuSources/i18n/buddhcal.h @@ -1,15 +1,16 @@ /* -* Copyright (C) 2003, International Business Machines Corporation and others. All Rights Reserved. -******************************************************************************** -* -* File BUDDHCAL.H -* -* Modification History: -* -* Date Name Description -* 05/13/2003 srl copied from gregocal.h -******************************************************************************** -*/ + * Copyright (C) 2003-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ******************************************************************************** + * + * File BUDDHCAL.H + * + * Modification History: + * + * Date Name Description + * 05/13/2003 srl copied from gregocal.h + ******************************************************************************** + */ #ifndef BUDDHCAL_H #define BUDDHCAL_H @@ -60,7 +61,7 @@ public: * @param aLocale The given locale. * @param success Indicates the status of BuddhistCalendar object construction. * Returns U_ZERO_ERROR if constructed successfully. - * @stable ICU 2.0 + * @internal */ BuddhistCalendar(const Locale& aLocale, UErrorCode& success); @@ -92,10 +93,7 @@ public: */ virtual Calendar* clone(void) const; - - public: - /** * Override Calendar Returns a unique class ID POLYMORPHICALLY. Pure virtual * override. This method is to implement a simple version of RTTI, since not all C++ @@ -119,7 +117,7 @@ public: * @return The class ID for all objects of this class. * @internal */ - static inline UClassID getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(void); /** * return the calendar type, "buddhist". @@ -139,35 +137,126 @@ public: * @param status Output param set to success/failure code on exit. If any value * previously set in the time field is invalid, this will be set to * an error status. - * @draft ICU 2.6. + * @draft ICU 2.6 */ virtual void add(UCalendarDateFields field, int32_t amount, UErrorCode& status); /** - * API overrides - * @private + * Gets the maximum value for the given time field. e.g. for DAY_OF_MONTH, + * 31. + * + * @param field The given time field. + * @return The maximum value for the given time field. + * @draft ICU 2.6 */ int32_t getMaximum(UCalendarDateFields field) const; + + /** + * Gets the lowest maximum value for the given field if varies. Otherwise same as + * getMaximum(). e.g., for Gregorian DAY_OF_MONTH, 28. + * + * @param field The given time field. + * @return The lowest maximum value for the given time field. + * @draft ICU 2.6 + */ int32_t getLeastMaximum(UCalendarDateFields field) const; + + /** + * @deprecated ICU 2.6 use UCalendarDateFields instead of EDateFields + */ inline virtual int32_t getMaximum(EDateFields field) const { return getMaximum((UCalendarDateFields)field); } + /** + * @deprecated ICU 2.6 use UCalendarDateFields instead of EDateFields + */ inline virtual int32_t getLeastMaximum(EDateFields field) const { return getLeastMaximum((UCalendarDateFields)field); } + /** + * @deprecated ICU 2.6 use UCalendarDateFields instead of EDateFields + */ inline virtual void add(EDateFields field, int32_t amount, UErrorCode& status) { add((UCalendarDateFields)field, amount, status); } - private: BuddhistCalendar(); // default constructor not implemented - static const char fgClassID; - protected: + /** + * Return the extended year defined by the current fields. This will + * use the UCAL_EXTENDED_YEAR field or the UCAL_YEAR and supra-year fields (such + * as UCAL_ERA) specific to the calendar system, depending on which set of + * fields is newer. + * @return the extended year + * @internal + */ + virtual int32_t handleGetExtendedYear(); + /** + * Subclasses may override this method to compute several fields + * specific to each calendar system. + * @internal + */ + virtual void handleComputeFields(int32_t julianDay, UErrorCode& status); + /** + * Subclass API for defining limits of different types. + * @param field one of the field numbers + * @param limitType one of MINIMUM, GREATEST_MINIMUM, + * LEAST_MAXIMUM, or MAXIMUM + * @internal + */ + virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const; + /** + * Return the Julian day number of day before the first day of the + * given month in the given extended year. Subclasses should override + * this method to implement their calendar system. + * @param eyear the extended year + * @param month the zero-based month, or 0 if useMonth is false + * @param useMonth if false, compute the day before the first day of + * the given year, otherwise, compute the day before the first day of + * the given month + * @param return the Julian day number of the day before the first + * day of the given month and year + * @internal + */ + virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month, + UBool useMonth) const; + + /** + * month length of current month + * @internal + */ virtual int32_t monthLength(int32_t month) const; + /** + * month length of month + * @internal + */ virtual int32_t monthLength(int32_t month, int32_t year) const; + + /** + * month length of current month + * @internal + */ int32_t getGregorianYear(UErrorCode& status) const; + /** + * Calculate the era for internal computation + * @internal + */ virtual int32_t internalGetEra() const; - virtual void timeToFields(UDate theTime, UBool quick, UErrorCode& status); + + /** + * Returns TRUE because the Buddhist Calendar does have a default century + * @internal + */ virtual UBool haveDefaultCentury() const; + + /** + * Returns the date of the start of the default century + * @return start of century - in milliseconds since epoch, 1970 + * @internal + */ virtual UDate defaultCenturyStart() const; + + /** + * Returns the year in which the default century begins + * @internal + */ virtual int32_t defaultCenturyStartYear() const; private: // default century stuff. @@ -189,40 +278,31 @@ private: */ static const int32_t fgSystemDefaultCenturyYear; + /** + * start of default century, as a date + */ static const UDate fgSystemDefaultCentury; /** - * Returns the beginning date of the 100-year window that dates with 2-digit years - * are considered to fall within. - * @return the beginning date of the 100-year window that dates with 2-digit years - * are considered to fall within. + * Returns the beginning date of the 100-year window that dates + * with 2-digit years are considered to fall within. */ UDate internalGetDefaultCenturyStart(void) const; /** - * Returns the first year of the 100-year window that dates with 2-digit years - * are considered to fall within. - * @return the first year of the 100-year window that dates with 2-digit years - * are considered to fall within. + * Returns the first year of the 100-year window that dates with + * 2-digit years are considered to fall within. */ int32_t internalGetDefaultCenturyStartYear(void) const; /** - * Initializes the 100-year window that dates with 2-digit years are considered - * to fall within so that its start date is 80 years before the current time. + * Initializes the 100-year window that dates with 2-digit years + * are considered to fall within so that its start date is 80 years + * before the current time. */ static void initializeSystemDefaultCentury(void); }; -inline UClassID -BuddhistCalendar::getStaticClassID(void) -{ return (UClassID)&fgClassID; } - -inline UClassID -BuddhistCalendar::getDynamicClassID(void) const -{ return BuddhistCalendar::getStaticClassID(); } - - U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/i18n/calendar.cpp b/icuSources/i18n/calendar.cpp index 85005660..f323ef6e 100644 --- a/icuSources/i18n/calendar.cpp +++ b/icuSources/i18n/calendar.cpp @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 1997-2003, International Business Machines Corporation and * +* Copyright (C) 1997-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* * @@ -28,17 +28,38 @@ #if !UCONFIG_NO_FORMATTING -#include "unicode/resbund.h" #include "unicode/gregocal.h" +#include "gregoimp.h" #include "buddhcal.h" #include "japancal.h" +#include "islamcal.h" +#include "hebrwcal.h" +#include "chnsecal.h" #include "unicode/calendar.h" #include "cpputils.h" #include "iculserv.h" #include "ucln_in.h" #include "cstring.h" +#include "locbased.h" +#include "uresimp.h" -U_NAMESPACE_BEGIN +#if !UCONFIG_NO_SERVICE +static ICULocaleService* gService = NULL; +#endif + +// INTERNAL - for cleanup + +U_CDECL_BEGIN +static UBool calendar_cleanup(void) { +#if !UCONFIG_NO_SERVICE + if (gService) { + delete gService; + gService = NULL; + } +#endif + return TRUE; +} +U_CDECL_END // ------------------------------------------ // @@ -48,11 +69,96 @@ U_NAMESPACE_BEGIN //#define U_DEBUG_CALSVC 1 // -#ifdef U_DEBUG_CALSVC +#if defined( U_DEBUG_CALSVC ) || defined (U_DEBUG_CAL) #include + + +/** + * convert a UCalendarDateFields into a string - for debugging + * @param f field enum + * @return static string to the field name + * @internal + */ +static const char* fldName(UCalendarDateFields f) { + switch (f) { +#define FIELD_NAME_STR(x) case x: return (#x+5) + FIELD_NAME_STR( UCAL_ERA ); + FIELD_NAME_STR( UCAL_YEAR ); + FIELD_NAME_STR( UCAL_MONTH ); + FIELD_NAME_STR( UCAL_WEEK_OF_YEAR ); + FIELD_NAME_STR( UCAL_WEEK_OF_MONTH ); + FIELD_NAME_STR( UCAL_DATE ); + FIELD_NAME_STR( UCAL_DAY_OF_YEAR ); + FIELD_NAME_STR( UCAL_DAY_OF_WEEK ); + FIELD_NAME_STR( UCAL_DAY_OF_WEEK_IN_MONTH ); + FIELD_NAME_STR( UCAL_AM_PM ); + FIELD_NAME_STR( UCAL_HOUR ); + FIELD_NAME_STR( UCAL_HOUR_OF_DAY ); + FIELD_NAME_STR( UCAL_MINUTE ); + FIELD_NAME_STR( UCAL_SECOND ); + FIELD_NAME_STR( UCAL_MILLISECOND ); + FIELD_NAME_STR( UCAL_ZONE_OFFSET ); + FIELD_NAME_STR( UCAL_DST_OFFSET ); + FIELD_NAME_STR( UCAL_YEAR_WOY ); + FIELD_NAME_STR( UCAL_DOW_LOCAL ); + FIELD_NAME_STR( UCAL_EXTENDED_YEAR ); + FIELD_NAME_STR( UCAL_JULIAN_DAY ); + FIELD_NAME_STR( UCAL_MILLISECONDS_IN_DAY ); +#undef FIELD_NAME_STR + default: + return "??"; + } +} + #endif -static ICULocaleService* gService = NULL; +static const char * const gBasicCalendars[] = { "@calendar=gregorian", "@calendar=japanese", + "@calendar=buddhist", "@calendar=islamic-civil", + "@calendar=islamic", "@calendar=hebrew", "@calendar=chinese", + NULL }; + +U_NAMESPACE_BEGIN + +static UBool isStandardSupportedID( const char *id, UErrorCode& status) { + if(U_FAILURE(status)) { + return FALSE; + } + for(int32_t i=0;gBasicCalendars[i] != NULL;i++) { + if(uprv_strcmp(gBasicCalendars[i],id) == 0) { + return TRUE; + } + } + return FALSE; +} + +static Calendar *createStandardCalendar(char *calType, const Locale &canLoc, UErrorCode& status) { +#ifdef U_DEBUG_CALSVC + fprintf(stderr, "BasicCalendarFactory %p: creating type for %s\n", + this, (const char*)curLoc.getName()); + fflush(stderr); +#endif + + if(!calType || !*calType || !uprv_strcmp(calType,"@calendar=gregorian")) { // Gregorian (default) + return new GregorianCalendar(canLoc, status); + } else if(!uprv_strcmp(calType, "@calendar=japanese")) { + return new JapaneseCalendar(canLoc, status); + } else if(!uprv_strcmp(calType, "@calendar=buddhist")) { + return new BuddhistCalendar(canLoc, status); + } else if(!uprv_strcmp(calType, "@calendar=islamic-civil")) { + return new IslamicCalendar(canLoc, status, IslamicCalendar::CIVIL); + } else if(!uprv_strcmp(calType, "@calendar=islamic")) { + return new IslamicCalendar(canLoc, status, IslamicCalendar::ASTRONOMICAL); + } else if(!uprv_strcmp(calType, "@calendar=hebrew")) { + return new HebrewCalendar(canLoc, status); + //} else if(!uprv_strcmp(calType, "@calendar=chinese")) { + //return new ChineseCalendar(canLoc, status); + } else { + status = U_UNSUPPORTED_ERROR; + return NULL; + } +} + +#if !UCONFIG_NO_SERVICE // ------------------------------------- @@ -60,29 +166,46 @@ static ICULocaleService* gService = NULL; * a Calendar Factory which creates the "basic" calendar types, that is, those * shipped with ICU. */ - class BasicCalendarFactory : public LocaleKeyFactory { public: /** * @param calendarType static const string (caller owns storage - will be aliased) to calendar type */ - BasicCalendarFactory(const char *calendarType) - : LocaleKeyFactory(LocaleKeyFactory::INVISIBLE), fType(calendarType), fID(calendarType,"") { } + BasicCalendarFactory() + : LocaleKeyFactory(LocaleKeyFactory::INVISIBLE) { } virtual ~BasicCalendarFactory() {} protected: - virtual UBool isSupportedID( const UnicodeString& id, UErrorCode& /* status */) const { return (id == fID); } + virtual UBool isSupportedID( const UnicodeString& id, UErrorCode& status) const { + if(U_FAILURE(status)) { + return FALSE; + } + for(int32_t i=0;gBasicCalendars[i] != NULL;i++) { + UnicodeString ourId(gBasicCalendars[i],""); + if(ourId == id) { + return TRUE; + } + } + return FALSE; + } virtual void updateVisibleIDs(Hashtable& result, UErrorCode& status) const { if (U_SUCCESS(status)) { - const UnicodeString& id = fID; - result.put(id, (void*)this, status); + for(int32_t i=0;gBasicCalendars[i] != NULL;i++) { + UnicodeString id(gBasicCalendars[i],""); + result.put(id, (void*)this, status); + } } } virtual UObject* create(const ICUServiceKey& key, const ICUService* /*service*/, UErrorCode& status) const { +#ifdef U_DEBUG_CALSVC + if(key.getDynamicClassID() != LocaleKey::getStaticClassID()) { + fprintf(stderr, "::create - not a LocaleKey!\n"); + } +#endif const LocaleKey& lkey = (LocaleKey&)key; Locale curLoc; // current locale Locale canLoc; // Canonical locale @@ -93,37 +216,30 @@ protected: UnicodeString str; key.currentID(str); + char tmp[200]; + // Extract a char* out of it.. + int32_t len = str.length(); + int32_t actLen = sizeof(tmp)-1; + if(len > actLen) { + len = actLen; + } + str.extract(0,len,tmp); + tmp[len]=0; + #ifdef U_DEBUG_CALSVC - fprintf(stderr, "BasicCalendarFactory[%s] - cur %s, can %s\n", fType, (const char*)curLoc.getName(), (const char*)canLoc.getName()); + fprintf(stderr, "BasicCalendarFactory::create() - cur %s, can %s\n", (const char*)curLoc.getName(), (const char*)canLoc.getName()); #endif - if(str != fID) { // Do we handle this type? + if(!isStandardSupportedID(tmp,status)) { // Do we handle this type? #ifdef U_DEBUG_CALSVC - fprintf(stderr, "BasicCalendarFactory[%s] - not handling %s.\n", fType, (const char*) curLoc.getName() ); + + fprintf(stderr, "BasicCalendarFactory - not handling %s.[%s]\n", (const char*) curLoc.getName(), tmp ); #endif return NULL; } -#ifdef U_DEBUG_CALSVC - fprintf(stderr, "BasicCalendarFactory %p: creating %s type for %s\n", - this, fType, (const char*)curLoc.getName()); - fflush(stderr); -#endif - - if(!fType || !*fType || !uprv_strcmp(fType,"gregorian")) { // Gregorian (default) - return new GregorianCalendar(canLoc, status); - } else if(!uprv_strcmp(fType, "japanese")) { - return new JapaneseCalendar(canLoc, status); - } else if(!uprv_strcmp(fType, "buddhist")) { - return new BuddhistCalendar(canLoc, status); - } else { - status = U_UNSUPPORTED_ERROR; - return NULL; + return createStandardCalendar(tmp, canLoc, status); } - } -private: - const char *fType; - const UnicodeString fID; }; @@ -132,76 +248,55 @@ private: */ class DefaultCalendarFactory : public ICUResourceBundleFactory { -public: + public: DefaultCalendarFactory(): ICUResourceBundleFactory() { } -protected: + protected: virtual UObject* create(const ICUServiceKey& key, const ICUService* /*service*/, UErrorCode& status) const { - - LocaleKey &lkey = (LocaleKey&)key; - Locale loc; - lkey.currentLocale(loc); - -#ifdef U_DEBUG_CALSVC - fprintf(stderr, "DefaultCalendar factory %p: looking up %s\n", - this, (const char*)loc.getName()); -#endif - - UErrorCode resStatus = U_ZERO_ERROR; - - UResourceBundle *rb = ures_open(NULL, (const char*)loc.getName(), &resStatus); - + + LocaleKey &lkey = (LocaleKey&)key; + Locale loc; + lkey.currentLocale(loc); + + UnicodeString myString; + + // attempt keyword lookup + char keyword[128]; + + if(!loc.getKeywordValue("calendar", keyword, sizeof(keyword)-1, status)) { + // fetch default calendar id + char funcEquiv[ULOC_FULLNAME_CAPACITY]; + ures_getFunctionalEquivalent(funcEquiv, sizeof(funcEquiv)-1, + NULL, "calendar", "calendar", + loc.getName(), + NULL, FALSE, &status); + uloc_getKeywordValue(funcEquiv, "calendar", keyword, + sizeof(keyword)-1, &status); #ifdef U_DEBUG_CALSVC - fprintf(stderr, "... ures_open -> %s\n", u_errorName(resStatus)); + fprintf(stderr, " getFunctionalEquivalent calendar=%s [%s]\n", keyword, u_errorName(status)); #endif - if(U_FAILURE(resStatus) || - (resStatus == U_USING_DEFAULT_WARNING) || (resStatus==U_USING_FALLBACK_WARNING)) { //Don't want to handle fallback data. - ures_close(rb); - status = resStatus; // propagate err back to caller + } #ifdef U_DEBUG_CALSVC - fprintf(stderr, "... exitting (NULL)\n"); + else { fprintf(stderr, " explicit calendar=%s\n", keyword); } #endif - return NULL; - } - - int32_t len = 0; - - UnicodeString myString = ures_getUnicodeStringByKey(rb, Calendar::kDefaultCalendar, &status); - -#ifdef U_DEBUG_CALSVC - UErrorCode debugStatus = U_ZERO_ERROR; - const UChar *defCal = ures_getStringByKey(rb, Calendar::kDefaultCalendar, &len, &debugStatus); - fprintf(stderr, "... get string(%d) -> %s\n", len, u_errorName(debugStatus)); -#endif - ures_close(rb); - - if(U_FAILURE(status)) { - return NULL; + if(U_FAILURE(status)) { + return NULL; + } else { + UnicodeString *ret = new UnicodeString(); + ret->append((UChar)0x40); // '@' is a variant character + ret->append(UNICODE_STRING("calendar=", 9)); + (*ret) += UnicodeString(keyword,-1,US_INV); + return ret; + } } - - -#ifdef U_DEBUG_CALSVC - { - char defCalStr[200]; - if(len > 199) { - len = 199; - } - u_UCharsToChars(defCal, defCalStr, len); - defCalStr[len]=0; - fprintf(stderr, "DefaultCalendarFactory: looked up %s, got DefaultCalendar= %s\n", (const char*)loc.getName(), defCalStr); - } -#endif - - return myString.clone(); - } }; // ------------------------------------- class CalendarService : public ICULocaleService { public: CalendarService() - : ICULocaleService("Calendar") + : ICULocaleService(UNICODE_STRING_SIMPLE("Calendar")) { UErrorCode status = U_ZERO_ERROR; registerFactory(new DefaultCalendarFactory(), status); @@ -220,18 +315,18 @@ public: } virtual UObject* handleDefault(const ICUServiceKey& key, UnicodeString* /*actualID*/, UErrorCode& status) const { - LocaleKey& lkey = (LocaleKey&)key; - //int32_t kind = lkey.kind(); + LocaleKey& lkey = (LocaleKey&)key; + //int32_t kind = lkey.kind(); - Locale loc; - lkey.canonicalLocale(loc); + Locale loc; + lkey.canonicalLocale(loc); #ifdef U_DEBUG_CALSVC Locale loc2; lkey.currentLocale(loc2); fprintf(stderr, "CalSvc:handleDefault for currentLoc %s, canloc %s\n", (const char*)loc.getName(), (const char*)loc2.getName()); #endif - Calendar *nc = new GregorianCalendar(loc, status); + Calendar *nc = new GregorianCalendar(loc, status); #ifdef U_DEBUG_CALSVC UErrorCode status2 = U_ZERO_ERROR; @@ -247,8 +342,16 @@ public: // ------------------------------------- +static inline UBool +isCalendarServiceUsed() { + Mutex mutex; + return (UBool)(gService != NULL); +} + +// ------------------------------------- + static ICULocaleService* -getService(void) +getCalendarService(UErrorCode &status) { UBool needInit; { @@ -256,7 +359,6 @@ getService(void) needInit = (UBool)(gService == NULL); } if (needInit) { - UErrorCode status = U_ZERO_ERROR; #ifdef U_DEBUG_CALSVC fprintf(stderr, "Spinning up Calendar Service\n"); #endif @@ -266,9 +368,7 @@ getService(void) #endif // Register all basic instances. - newservice->registerFactory(new BasicCalendarFactory("japanese"),status); - newservice->registerFactory(new BasicCalendarFactory("buddhist"),status); - newservice->registerFactory(new BasicCalendarFactory("gregorian"),status); + newservice->registerFactory(new BasicCalendarFactory(),status); #ifdef U_DEBUG_CALSVC fprintf(stderr, "Done..\n"); @@ -293,18 +393,52 @@ getService(void) delete newservice; } else { // we won the contention - we can register the cleanup. - ucln_i18n_registerCleanup(); + ucln_i18n_registerCleanup(UCLN_I18N_CALENDAR, calendar_cleanup); } } return gService; } +URegistryKey Calendar::registerFactory(ICUServiceFactory* toAdopt, UErrorCode& status) +{ + return getCalendarService(status)->registerFactory(toAdopt, status); +} + +UBool Calendar::unregister(URegistryKey key, UErrorCode& status) { + return getCalendarService(status)->unregister(key, status); +} +#endif /* UCONFIG_NO_SERVICE */ + // ------------------------------------- +static const int32_t kCalendarLimits[UCAL_FIELD_COUNT][4] = { + // Minimum Greatest min Least max Greatest max + {/*N/A*/-1, /*N/A*/-1, /*N/A*/-1, /*N/A*/-1}, // ERA + {/*N/A*/-1, /*N/A*/-1, /*N/A*/-1, /*N/A*/-1}, // YEAR + {/*N/A*/-1, /*N/A*/-1, /*N/A*/-1, /*N/A*/-1}, // MONTH + {/*N/A*/-1, /*N/A*/-1, /*N/A*/-1, /*N/A*/-1}, // WEEK_OF_YEAR + {/*N/A*/-1, /*N/A*/-1, /*N/A*/-1, /*N/A*/-1}, // WEEK_OF_MONTH + {/*N/A*/-1, /*N/A*/-1, /*N/A*/-1, /*N/A*/-1}, // DAY_OF_MONTH + {/*N/A*/-1, /*N/A*/-1, /*N/A*/-1, /*N/A*/-1}, // DAY_OF_YEAR + { 1, 1, 7, 7 }, // DAY_OF_WEEK + {/*N/A*/-1, /*N/A*/-1, /*N/A*/-1, /*N/A*/-1}, // DAY_OF_WEEK_IN_MONTH + { 0, 0, 1, 1 }, // AM_PM + { 0, 0, 11, 11 }, // HOUR + { 0, 0, 23, 23 }, // HOUR_OF_DAY + { 0, 0, 59, 59 }, // MINUTE + { 0, 0, 59, 59 }, // SECOND + { 0, 0, 999, 999 }, // MILLISECOND + {-12*kOneHour, -12*kOneHour, 12*kOneHour, 15*kOneHour }, // ZONE_OFFSET + { 0, 0, 1*kOneHour, 1*kOneHour }, // DST_OFFSET + {/*N/A*/-1, /*N/A*/-1, /*N/A*/-1, /*N/A*/-1}, // YEAR_WOY + { 1, 1, 7, 7 }, // DOW_LOCAL + {/*N/A*/-1, /*N/A*/-1, /*N/A*/-1, /*N/A*/-1}, // EXTENDED_YEAR + { -0x7F000000, -0x7F000000, 0x7F000000, 0x7F000000 }, // JULIAN_DAY + { 0, 0, 24*kOneHour-1, 24*kOneHour-1 } // MILLISECONDS_IN_DAY +}; // Resource bundle tags read by this class const char Calendar::kDateTimeElements[] = "DateTimeElements"; -const char Calendar::kDefaultCalendar[] = "DefaultCalendar"; // Data flow in Calendar // --------------------- @@ -363,14 +497,15 @@ Calendar::Calendar(UErrorCode& success) fIsTimeSet(FALSE), fAreFieldsSet(FALSE), fAreAllFieldsSet(FALSE), - fNextStamp(kMinimumUserStamp), + fAreFieldsVirtuallySet(FALSE), + fNextStamp((int32_t)kMinimumUserStamp), fTime(0), fLenient(TRUE), fZone(0) { clear(); fZone = TimeZone::createDefault(); - setWeekCountData(Locale::getDefault(), success); + setWeekCountData(Locale::getDefault(), NULL, success); } // ------------------------------------- @@ -380,20 +515,25 @@ Calendar::Calendar(TimeZone* zone, const Locale& aLocale, UErrorCode& success) fIsTimeSet(FALSE), fAreFieldsSet(FALSE), fAreAllFieldsSet(FALSE), - fNextStamp(kMinimumUserStamp), + fAreFieldsVirtuallySet(FALSE), + fNextStamp((int32_t)kMinimumUserStamp), fTime(0), fLenient(TRUE), fZone(0) { if(zone == 0) { - success = U_ILLEGAL_ARGUMENT_ERROR; - return; +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d: ILLEGAL ARG because timezone cannot be 0\n", + __FILE__, __LINE__); +#endif + success = U_ILLEGAL_ARGUMENT_ERROR; + return; } clear(); fZone = zone; - setWeekCountData(aLocale, success); + setWeekCountData(aLocale, NULL, success); } // ------------------------------------- @@ -403,14 +543,15 @@ Calendar::Calendar(const TimeZone& zone, const Locale& aLocale, UErrorCode& succ fIsTimeSet(FALSE), fAreFieldsSet(FALSE), fAreAllFieldsSet(FALSE), - fNextStamp(kMinimumUserStamp), + fAreFieldsVirtuallySet(FALSE), + fNextStamp((int32_t)kMinimumUserStamp), fTime(0), fLenient(TRUE), fZone(0) { clear(); fZone = zone.clone(); - setWeekCountData(aLocale, success); + setWeekCountData(aLocale, NULL, success); } // ------------------------------------- @@ -434,21 +575,21 @@ Calendar::Calendar(const Calendar &source) Calendar & Calendar::operator=(const Calendar &right) { - if (this != &right) - { + if (this != &right) { uprv_arrayCopy(right.fFields, fFields, UCAL_FIELD_COUNT); uprv_arrayCopy(right.fIsSet, fIsSet, UCAL_FIELD_COUNT); uprv_arrayCopy(right.fStamp, fStamp, UCAL_FIELD_COUNT); - fTime = right.fTime; - fIsTimeSet = right.fIsTimeSet; + fTime = right.fTime; + fIsTimeSet = right.fIsTimeSet; fAreAllFieldsSet = right.fAreAllFieldsSet; - fAreFieldsSet = right.fAreFieldsSet; + fAreFieldsSet = right.fAreFieldsSet; + fAreFieldsVirtuallySet = right.fAreFieldsVirtuallySet; fLenient = right.fLenient; delete fZone; fZone = right.fZone->clone(); - fFirstDayOfWeek = right.fFirstDayOfWeek; - fMinimalDaysInFirstWeek = right.fMinimalDaysInFirstWeek; - fNextStamp = right.fNextStamp; + fFirstDayOfWeek = right.fFirstDayOfWeek; + fMinimalDaysInFirstWeek = right.fMinimalDaysInFirstWeek; + fNextStamp = right.fNextStamp; } return *this; @@ -456,7 +597,7 @@ Calendar::operator=(const Calendar &right) // ------------------------------------- -Calendar* +Calendar* U_EXPORT2 Calendar::createInstance(UErrorCode& success) { return createInstance(TimeZone::createDefault(), Locale::getDefault(), success); @@ -464,7 +605,7 @@ Calendar::createInstance(UErrorCode& success) // ------------------------------------- -Calendar* +Calendar* U_EXPORT2 Calendar::createInstance(const TimeZone& zone, UErrorCode& success) { return createInstance(zone, Locale::getDefault(), success); @@ -472,7 +613,7 @@ Calendar::createInstance(const TimeZone& zone, UErrorCode& success) // ------------------------------------- -Calendar* +Calendar* U_EXPORT2 Calendar::createInstance(const Locale& aLocale, UErrorCode& success) { return createInstance(TimeZone::createDefault(), aLocale, success); @@ -482,11 +623,45 @@ Calendar::createInstance(const Locale& aLocale, UErrorCode& success) // Note: this is the bottleneck that actually calls the service routines. -Calendar* +Calendar* U_EXPORT2 Calendar::createInstance(TimeZone* zone, const Locale& aLocale, UErrorCode& success) { - UObject* u = getService()->get(aLocale, LocaleKey::KIND_ANY, success); - Calendar* c = NULL; + Locale actualLoc; + UObject* u; +#if !UCONFIG_NO_SERVICE + if (isCalendarServiceUsed()) { + u = getCalendarService(success)->get(aLocale, LocaleKey::KIND_ANY, &actualLoc, success); + } + else +#endif + { + char calLocaleType[ULOC_FULLNAME_CAPACITY] = {"@calendar="}; + int32_t calLocaleTypeLen = uprv_strlen(calLocaleType); + int32_t keywordCapacity = aLocale.getKeywordValue("calendar", calLocaleType+calLocaleTypeLen, sizeof(calLocaleType)-calLocaleTypeLen-1, success); + if (keywordCapacity == 0) { + char funcEquiv[ULOC_FULLNAME_CAPACITY]; + + // fetch default calendar id + ures_getFunctionalEquivalent(funcEquiv, sizeof(funcEquiv)-1, + NULL, "calendar", "calendar", + aLocale.getName(), + NULL, FALSE, &success); + keywordCapacity = uloc_getKeywordValue(funcEquiv, "calendar", calLocaleType+calLocaleTypeLen, + sizeof(calLocaleType)-calLocaleTypeLen-1, &success); + if (keywordCapacity == 0 || U_FAILURE(success)) { + // no calendar type. Default to nothing. + calLocaleType[0] = 0; + } +#ifdef U_DEBUG_CALSVC + fprintf(stderr, " getFunctionalEquivalent calendar=%s [%s]\n", keyword, u_errorName(status)); +#endif + } +#ifdef U_DEBUG_CALSVC + else { fprintf(stderr, " explicit calendar=%s\n", keyword); } +#endif + u = createStandardCalendar(calLocaleType, aLocale, success); + } + Calendar* c = NULL; if(U_FAILURE(success) || !u) { delete zone; @@ -495,30 +670,40 @@ Calendar::createInstance(TimeZone* zone, const Locale& aLocale, UErrorCode& succ } return NULL; } - + +#if !UCONFIG_NO_SERVICE if(u->getDynamicClassID() == UnicodeString::getStaticClassID()) { // It's a unicode string telling us what type of calendar to load ("gregorian", etc) char tmp[200]; const UnicodeString& str = *(UnicodeString*)u; // Extract a char* out of it.. int32_t len = str.length(); - if(len > sizeof(tmp)-1) { - len = sizeof(tmp)-1; + int32_t actLen = sizeof(tmp)-1; + if(len > actLen) { + len = actLen; } str.extract(0,len,tmp); tmp[len]=0; #ifdef U_DEBUG_CALSVC - // fprintf(stderr, "createInstance(%s) told to look at %s..\n", (const char*)aLocale.getName(), tmp); + fprintf(stderr, "Calendar::createInstance(%s), fetched string %s..\n", (const char*)aLocale.getName(), tmp); #endif // Create a Locale over this string - Locale l(tmp); + Locale l = Locale::createFromName(tmp); +#ifdef U_DEBUG_CALSVC + fprintf(stderr, "looking up [%s].. should be %s\n",l.getName(), tmp); +#endif + + Locale actualLoc2; delete u; u = NULL; - - c = (Calendar*)getService()->get(l, LocaleKey::KIND_ANY, success); + + // Don't overwrite actualLoc, since the actual loc from this call + // may be something like "@calendar=gregorian" -- TODO investigate + // further... + c = (Calendar*)getCalendarService(success)->get(l, LocaleKey::KIND_ANY, &actualLoc2, success); if(U_FAILURE(success) || !c) { delete zone; @@ -531,16 +716,33 @@ Calendar::createInstance(TimeZone* zone, const Locale& aLocale, UErrorCode& succ if(c->getDynamicClassID() == UnicodeString::getStaticClassID()) { // recursed! Second lookup returned a UnicodeString. // Perhaps DefaultCalendar{} was set to another locale. +#ifdef U_DEBUG_CALSVC + char tmp[200]; + const UnicodeString& str = *(UnicodeString*)c; + // Extract a char* out of it.. + int32_t len = str.length(); + int32_t actLen = sizeof(tmp)-1; + if(len > actLen) { + len = actLen; + } + str.extract(0,len,tmp); + tmp[len]=0; + + fprintf(stderr, "err - recursed, 2nd lookup was unistring %s\n", tmp); +#endif success = U_MISSING_RESOURCE_ERROR; // requested a calendar type which could NOT be found. delete c; delete zone; return NULL; } #ifdef U_DEBUG_CALSVC - fprintf(stderr, "setting to locale %s\n", (const char*)aLocale.getName()); + fprintf(stderr, "%p: setting week count data to locale %s, actual locale %s\n", c, (const char*)aLocale.getName(), (const char *)actualLoc.getName()); #endif - c->setWeekCountData(aLocale, success); // set the correct locale (this was an indirected calendar) - } else { + c->setWeekCountData(aLocale, c->getType(), success); // set the correct locale (this was an indirected calendar) + } + else +#endif /* UCONFIG_NO_SERVICE */ + { // a calendar was returned - we assume the factory did the right thing. c = (Calendar*)u; } @@ -548,12 +750,13 @@ Calendar::createInstance(TimeZone* zone, const Locale& aLocale, UErrorCode& succ // Now, reset calendar to default state: c->adoptTimeZone(zone); // Set the correct time zone c->setTimeInMillis(getNow(), success); // let the new calendar have the current time. + return c; } // ------------------------------------- -Calendar* +Calendar* U_EXPORT2 Calendar::createInstance(const TimeZone& zone, const Locale& aLocale, UErrorCode& success) { Calendar* c = createInstance(aLocale, success); @@ -614,7 +817,7 @@ Calendar::after(const Calendar& when, UErrorCode& status) const // ------------------------------------- -const Locale* +const Locale* U_EXPORT2 Calendar::getAvailableLocales(int32_t& count) { return Locale::getAvailableLocales(count); @@ -622,10 +825,10 @@ Calendar::getAvailableLocales(int32_t& count) // ------------------------------------- -UDate +UDate U_EXPORT2 Calendar::getNow() { - return (UDate)uprv_getUTCtime() * U_MILLIS_PER_SECOND; // return as milliseconds + return uprv_getUTCtime(); // return as milliseconds } // ------------------------------------- @@ -661,19 +864,15 @@ Calendar::setTimeInMillis( double millis, UErrorCode& status ) { if(U_FAILURE(status)) return; - fIsTimeSet = TRUE; - fTime = millis; - - fAreFieldsSet = FALSE; - - computeFields(status); - - /* Test for buffer overflows */ - if(U_FAILURE(status)) { - return; + if (millis > MAX_MILLIS) { + millis = MAX_MILLIS; + } else if (millis < MIN_MILLIS) { + millis = MIN_MILLIS; } - fAreFieldsSet = TRUE; - fAreAllFieldsSet = TRUE; + + fTime = millis; + fAreFieldsSet = fAreAllFieldsSet = FALSE; + fIsTimeSet = fAreFieldsVirtuallySet = TRUE; } // ------------------------------------- @@ -693,11 +892,14 @@ Calendar::get(UCalendarDateFields field, UErrorCode& status) const void Calendar::set(UCalendarDateFields field, int32_t value) { - fIsTimeSet = FALSE; + if (fAreFieldsVirtuallySet) { + UErrorCode ec = U_ZERO_ERROR; + computeFields(ec); + } fFields[field] = value; fStamp[field] = fNextStamp++; - fAreFieldsSet = FALSE; fIsSet[field] = TRUE; // Remove later + fIsTimeSet = fAreFieldsSet = fAreFieldsVirtuallySet = FALSE; } // ------------------------------------- @@ -742,13 +944,10 @@ Calendar::clear() { for (int32_t i=0; i bestStamp) { + bestStamp = fStamp[i]; + } + } + return bestStamp; } + // ------------------------------------- void @@ -795,39 +1009,802 @@ Calendar::complete(UErrorCode& status) } } + //------------------------------------------------------------------------- + // Protected utility methods for use by subclasses. These are very handy + // for implementing add, roll, and computeFields. + //------------------------------------------------------------------------- + + /** + * Adjust the specified field so that it is within + * the allowable range for the date to which this calendar is set. + * For example, in a Gregorian calendar pinning the {@link #DAY_OF_MONTH DAY_OF_MONTH} + * field for a calendar set to April 31 would cause it to be set + * to April 30. + *

    + * Subclassing: + *
    + * This utility method is intended for use by subclasses that need to implement + * their own overrides of {@link #roll roll} and {@link #add add}. + *

    + * Note: + * pinField is implemented in terms of + * {@link #getActualMinimum getActualMinimum} + * and {@link #getActualMaximum getActualMaximum}. If either of those methods uses + * a slow, iterative algorithm for a particular field, it would be + * unwise to attempt to call pinField for that field. If you + * really do need to do so, you should override this method to do + * something more efficient for that field. + *

    + * @param field The calendar field whose value should be pinned. + * + * @see #getActualMinimum + * @see #getActualMaximum + * @stable ICU 2.0 + */ +void Calendar::pinField(UCalendarDateFields field, UErrorCode& status) { + int32_t max = getActualMaximum(field, status); + int32_t min = getActualMinimum(field, status); + + if (fFields[field] > max) { + set(field, max); + } else if (fFields[field] < min) { + set(field, min); + } +} + + +void Calendar::computeFields(UErrorCode &ec) +{ + if (U_FAILURE(ec)) { + return; + } + // Compute local wall millis + double localMillis = internalGetTime(); + int32_t rawOffset, dstOffset; + getTimeZone().getOffset(localMillis, FALSE, rawOffset, dstOffset, ec); + localMillis += rawOffset; + + // Mark fields as set. Do this before calling handleComputeFields(). + uint32_t mask = //fInternalSetMask; + (1 << ERA) | + (1 << UCAL_YEAR) | + (1 << UCAL_MONTH) | + (1 << UCAL_DAY_OF_MONTH) | // = UCAL_DATE + (1 << UCAL_DAY_OF_YEAR) | + (1 << UCAL_EXTENDED_YEAR); + + for (int32_t i=0; i>= 1; + } + + // We used to check for and correct extreme millis values (near + // Long.MIN_VALUE or Long.MAX_VALUE) here. Such values would cause + // overflows from positive to negative (or vice versa) and had to + // be manually tweaked. We no longer need to do this because we + // have limited the range of supported dates to those that have a + // Julian day that fits into an int. This allows us to implement a + // JULIAN_DAY field and also removes some inelegant code. - Liu + // 11/6/00 + + int32_t days = (int32_t)Math::floorDivide(localMillis, (double)kOneDay); + + internalSet(UCAL_JULIAN_DAY,days + kEpochStartAsJulianDay); + +#if defined (U_DEBUG_CAL) + //fprintf(stderr, "%s:%d- Hmm! Jules @ %d, as per %.0lf millis\n", + //__FILE__, __LINE__, fFields[UCAL_JULIAN_DAY], localMillis); +#endif + + // In some cases we will have to call this method again below to + // adjust for DST pushing us into the next Julian day. + computeGregorianAndDOWFields(fFields[UCAL_JULIAN_DAY], ec); + + int32_t millisInDay = (int32_t) (localMillis - (days * kOneDay)); + if (millisInDay < 0) millisInDay += (int32_t)kOneDay; + + // Adjust our millisInDay for DST. dstOffset will be zero if DST + // is not in effect at this time of year, or if our zone does not + // use DST. + millisInDay += dstOffset; + + // If DST has pushed us into the next day, we must call + // computeGregorianAndDOWFields() again. This happens in DST between + // 12:00 am and 1:00 am every day. The first call to + // computeGregorianAndDOWFields() will give the wrong day, since the + // Standard time is in the previous day. + if (millisInDay >= (int32_t)kOneDay) { + millisInDay -= (int32_t)kOneDay; // ASSUME dstOffset < 24:00 + + // We don't worry about overflow of JULIAN_DAY because the + // allowable range of JULIAN_DAY has slop at the ends (that is, + // the max is less that 0x7FFFFFFF and the min is greater than + // -0x80000000). + computeGregorianAndDOWFields(++fFields[UCAL_JULIAN_DAY], ec); + } + + // Call framework method to have subclass compute its fields. + // These must include, at a minimum, MONTH, DAY_OF_MONTH, + // EXTENDED_YEAR, YEAR, DAY_OF_YEAR. This method will call internalSet(), + // which will update stamp[]. + handleComputeFields(fFields[UCAL_JULIAN_DAY], ec); + + // Compute week-related fields, based on the subclass-computed + // fields computed by handleComputeFields(). + computeWeekFields(ec); + + // Compute time-related fields. These are indepent of the date and + // of the subclass algorithm. They depend only on the local zone + // wall milliseconds in day. + fFields[UCAL_MILLISECONDS_IN_DAY] = millisInDay; + fFields[UCAL_MILLISECOND] = millisInDay % 1000; + millisInDay /= 1000; + fFields[UCAL_SECOND] = millisInDay % 60; + millisInDay /= 60; + fFields[UCAL_MINUTE] = millisInDay % 60; + millisInDay /= 60; + fFields[UCAL_HOUR_OF_DAY] = millisInDay; + fFields[UCAL_AM_PM] = millisInDay / 12; // Assume AM == 0 + fFields[UCAL_HOUR] = millisInDay % 12; + fFields[UCAL_ZONE_OFFSET] = rawOffset; + fFields[UCAL_DST_OFFSET] = dstOffset; +} + +uint8_t Calendar::julianDayToDayOfWeek(double julian) +{ + // If julian is negative, then julian%7 will be negative, so we adjust + // accordingly. We add 1 because Julian day 0 is Monday. + int8_t dayOfWeek = (int8_t) uprv_fmod(julian + 1, 7); + + uint8_t result = (uint8_t)(dayOfWeek + ((dayOfWeek < 0) ? (7+UCAL_SUNDAY ) : UCAL_SUNDAY)); + return result; +} + +/** + * Compute the Gregorian calendar year, month, and day of month from + * the given Julian day. These values are not stored in fields, but in + * member variables gregorianXxx. Also compute the DAY_OF_WEEK and + * DOW_LOCAL fields. + */ +void Calendar::computeGregorianAndDOWFields(int32_t julianDay, UErrorCode &ec) +{ + computeGregorianFields(julianDay, ec); + + // Compute day of week: JD 0 = Monday + int32_t dow = julianDayToDayOfWeek(julianDay); + internalSet(UCAL_DAY_OF_WEEK,dow); + + // Calculate 1-based localized day of week + int32_t dowLocal = dow - getFirstDayOfWeek() + 1; + if (dowLocal < 1) { + dowLocal += 7; + } + internalSet(UCAL_DOW_LOCAL,dowLocal); + fFields[UCAL_DOW_LOCAL] = dowLocal; +} + +/** + * Compute the Gregorian calendar year, month, and day of month from the + * Julian day. These values are not stored in fields, but in member + * variables gregorianXxx. They are used for time zone computations and by + * subclasses that are Gregorian derivatives. Subclasses may call this + * method to perform a Gregorian calendar millis->fields computation. + * To perform a Gregorian calendar fields->millis computation, call + * computeGregorianMonthStart(). + * @see #computeGregorianMonthStart + */ +void Calendar::computeGregorianFields(int32_t julianDay, UErrorCode & /* ec */) { + int32_t gregorianDayOfWeekUnused; + Grego::dayToFields(julianDay - kEpochStartAsJulianDay, fGregorianYear, fGregorianMonth, fGregorianDayOfMonth, gregorianDayOfWeekUnused, fGregorianDayOfYear); +} + +/** + * Compute the fields WEEK_OF_YEAR, YEAR_WOY, WEEK_OF_MONTH, + * DAY_OF_WEEK_IN_MONTH, and DOW_LOCAL from EXTENDED_YEAR, YEAR, + * DAY_OF_WEEK, and DAY_OF_YEAR. The latter fields are computed by the + * subclass based on the calendar system. + * + *

    The YEAR_WOY field is computed simplistically. It is equal to YEAR + * most of the time, but at the year boundary it may be adjusted to YEAR-1 + * or YEAR+1 to reflect the overlap of a week into an adjacent year. In + * this case, a simple increment or decrement is performed on YEAR, even + * though this may yield an invalid YEAR value. For instance, if the YEAR + * is part of a calendar system with an N-year cycle field CYCLE, then + * incrementing the YEAR may involve incrementing CYCLE and setting YEAR + * back to 0 or 1. This is not handled by this code, and in fact cannot be + * simply handled without having subclasses define an entire parallel set of + * fields for fields larger than or equal to a year. This additional + * complexity is not warranted, since the intention of the YEAR_WOY field is + * to support ISO 8601 notation, so it will typically be used with a + * proleptic Gregorian calendar, which has no field larger than a year. + */ +void Calendar::computeWeekFields(UErrorCode &ec) { + if(U_FAILURE(ec)) { + return; + } + int32_t eyear = fFields[UCAL_EXTENDED_YEAR]; + int32_t year = fFields[UCAL_YEAR]; + int32_t dayOfWeek = fFields[UCAL_DAY_OF_WEEK]; + int32_t dayOfYear = fFields[UCAL_DAY_OF_YEAR]; + + // WEEK_OF_YEAR start + // Compute the week of the year. For the Gregorian calendar, valid week + // numbers run from 1 to 52 or 53, depending on the year, the first day + // of the week, and the minimal days in the first week. For other + // calendars, the valid range may be different -- it depends on the year + // length. Days at the start of the year may fall into the last week of + // the previous year; days at the end of the year may fall into the + // first week of the next year. ASSUME that the year length is less than + // 7000 days. + int32_t yearOfWeekOfYear = year; + int32_t relDow = (dayOfWeek + 7 - getFirstDayOfWeek()) % 7; // 0..6 + int32_t relDowJan1 = (dayOfWeek - dayOfYear + 7001 - getFirstDayOfWeek()) % 7; // 0..6 + int32_t woy = (dayOfYear - 1 + relDowJan1) / 7; // 0..53 + if ((7 - relDowJan1) >= getMinimalDaysInFirstWeek()) { + ++woy; + } + + // Adjust for weeks at the year end that overlap into the previous or + // next calendar year. + if (woy == 0) { + // We are the last week of the previous year. + // Check to see if we are in the last week; if so, we need + // to handle the case in which we are the first week of the + // next year. + + int32_t prevDoy = dayOfYear + handleGetYearLength(eyear - 1); + woy = weekNumber(prevDoy, dayOfWeek); + yearOfWeekOfYear--; + } else { + int32_t lastDoy = handleGetYearLength(eyear); + // Fast check: For it to be week 1 of the next year, the DOY + // must be on or after L-5, where L is yearLength(), then it + // cannot possibly be week 1 of the next year: + // L-5 L + // doy: 359 360 361 362 363 364 365 001 + // dow: 1 2 3 4 5 6 7 + if (dayOfYear >= (lastDoy - 5)) { + int32_t lastRelDow = (relDow + lastDoy - dayOfYear) % 7; + if (lastRelDow < 0) { + lastRelDow += 7; + } + if (((6 - lastRelDow) >= getMinimalDaysInFirstWeek()) && + ((dayOfYear + 7 - relDow) > lastDoy)) { + woy = 1; + yearOfWeekOfYear++; + } + } + } + fFields[UCAL_WEEK_OF_YEAR] = woy; + fFields[UCAL_YEAR_WOY] = yearOfWeekOfYear; + // WEEK_OF_YEAR end + + int32_t dayOfMonth = fFields[UCAL_DAY_OF_MONTH]; + fFields[UCAL_WEEK_OF_MONTH] = weekNumber(dayOfMonth, dayOfWeek); + fFields[UCAL_DAY_OF_WEEK_IN_MONTH] = (dayOfMonth-1) / 7 + 1; +#if defined (U_DEBUG_CAL) + if(fFields[UCAL_DAY_OF_WEEK_IN_MONTH]==0) fprintf(stderr, "%s:%d: DOWIM %d on %g\n", + __FILE__, __LINE__,fFields[UCAL_DAY_OF_WEEK_IN_MONTH], fTime); +#endif +} + + +int32_t Calendar::weekNumber(int32_t desiredDay, int32_t dayOfPeriod, int32_t dayOfWeek) +{ + // Determine the day of the week of the first day of the period + // in question (either a year or a month). Zero represents the + // first day of the week on this calendar. + int32_t periodStartDayOfWeek = (dayOfWeek - getFirstDayOfWeek() - dayOfPeriod + 1) % 7; + if (periodStartDayOfWeek < 0) periodStartDayOfWeek += 7; + + // Compute the week number. Initially, ignore the first week, which + // may be fractional (or may not be). We add periodStartDayOfWeek in + // order to fill out the first week, if it is fractional. + int32_t weekNo = (desiredDay + periodStartDayOfWeek - 1)/7; + + // If the first week is long enough, then count it. If + // the minimal days in the first week is one, or if the period start + // is zero, we always increment weekNo. + if ((7 - periodStartDayOfWeek) >= getMinimalDaysInFirstWeek()) ++weekNo; + + return weekNo; +} + +void Calendar::handleComputeFields(int32_t /* julianDay */, UErrorCode &/* status */) +{ + internalSet(UCAL_MONTH, getGregorianMonth()); + internalSet(UCAL_DAY_OF_MONTH, getGregorianDayOfMonth()); + internalSet(UCAL_DAY_OF_YEAR, getGregorianDayOfYear()); + int32_t eyear = getGregorianYear(); + internalSet(UCAL_EXTENDED_YEAR, eyear); + int32_t era = GregorianCalendar::AD; + if (eyear < 1) { + era = GregorianCalendar::BC; + eyear = 1 - eyear; + } + internalSet(UCAL_ERA, era); + internalSet(UCAL_YEAR, eyear); +} // ------------------------------------- -int32_t Calendar::fieldDifference(UDate when, EDateFields field, UErrorCode& status) { - return fieldDifference(when, (UCalendarDateFields) field, status); +void Calendar::roll(EDateFields field, int32_t amount, UErrorCode& status) +{ + roll((UCalendarDateFields)field, amount, status); } +void Calendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& status) +{ + if (amount == 0) { + return; // Nothing to do + } -int32_t Calendar::fieldDifference(UDate targetMs, UCalendarDateFields field, UErrorCode& ec) { - if (U_FAILURE(ec)) return 0; - int32_t min = 0; - double startMs = getTimeInMillis(ec); - // Always add from the start millis. This accomodates - // operations like adding years from February 29, 2000 up to - // February 29, 2004. If 1, 1, 1, 1 is added to the year - // field, the DOM gets pinned to 28 and stays there, giving an - // incorrect DOM difference of 1. We have to add 1, reset, 2, - // reset, 3, reset, 4. - if (startMs < targetMs) { - int32_t max = 1; - // Find a value that is too large - while (U_SUCCESS(ec)) { - setTimeInMillis(startMs, ec); - add(field, max, ec); - double ms = getTimeInMillis(ec); - if (ms == targetMs) { - return max; - } else if (ms > targetMs) { - break; - } else { - max <<= 1; + complete(status); + + if(U_FAILURE(status)) { + return; + } + switch (field) { + case UCAL_DAY_OF_MONTH: + case UCAL_AM_PM: + case UCAL_MINUTE: + case UCAL_SECOND: + case UCAL_MILLISECOND: + case UCAL_MILLISECONDS_IN_DAY: + case UCAL_ERA: + // These are the standard roll instructions. These work for all + // simple cases, that is, cases in which the limits are fixed, such + // as the hour, the day of the month, and the era. + { + int32_t min = getActualMinimum(field,status); + int32_t max = getActualMaximum(field,status); + int32_t gap = max - min + 1; + + int32_t value = internalGet(field) + amount; + value = (value - min) % gap; + if (value < 0) { + value += gap; + } + value += min; + + set(field, value); + return; + } + + case UCAL_HOUR: + case UCAL_HOUR_OF_DAY: + // Rolling the hour is difficult on the ONSET and CEASE days of + // daylight savings. For example, if the change occurs at + // 2 AM, we have the following progression: + // ONSET: 12 Std -> 1 Std -> 3 Dst -> 4 Dst + // CEASE: 12 Dst -> 1 Dst -> 1 Std -> 2 Std + // To get around this problem we don't use fields; we manipulate + // the time in millis directly. + { + // Assume min == 0 in calculations below + double start = getTimeInMillis(status); + int32_t oldHour = internalGet(field); + int32_t max = getMaximum(field); + int32_t newHour = (oldHour + amount) % (max + 1); + if (newHour < 0) { + newHour += max + 1; + } + setTimeInMillis(start + kOneHour * (newHour - oldHour),status); + return; + } + + case UCAL_MONTH: + // Rolling the month involves both pinning the final value + // and adjusting the DAY_OF_MONTH if necessary. We only adjust the + // DAY_OF_MONTH if, after updating the MONTH field, it is illegal. + // E.g., .roll(MONTH, 1) -> or . + { + int32_t max = getActualMaximum(UCAL_MONTH, status); + int32_t mon = (internalGet(UCAL_MONTH) + amount) % (max+1); + + if (mon < 0) { + mon += (max + 1); + } + set(UCAL_MONTH, mon); + + // Keep the day of month in range. We don't want to spill over + // into the next month; e.g., we don't want jan31 + 1 mo -> feb31 -> + // mar3. + pinField(UCAL_DAY_OF_MONTH,status); + return; + } + + case UCAL_YEAR: + case UCAL_YEAR_WOY: + case UCAL_EXTENDED_YEAR: + // Rolling the year can involve pinning the DAY_OF_MONTH. + set(field, internalGet(field) + amount); + pinField(UCAL_MONTH,status); + pinField(UCAL_DAY_OF_MONTH,status); + return; + + case UCAL_WEEK_OF_MONTH: + { + // This is tricky, because during the roll we may have to shift + // to a different day of the week. For example: + + // s m t w r f s + // 1 2 3 4 5 + // 6 7 8 9 10 11 12 + + // When rolling from the 6th or 7th back one week, we go to the + // 1st (assuming that the first partial week counts). The same + // thing happens at the end of the month. + + // The other tricky thing is that we have to figure out whether + // the first partial week actually counts or not, based on the + // minimal first days in the week. And we have to use the + // correct first day of the week to delineate the week + // boundaries. + + // Here's our algorithm. First, we find the real boundaries of + // the month. Then we discard the first partial week if it + // doesn't count in this locale. Then we fill in the ends with + // phantom days, so that the first partial week and the last + // partial week are full weeks. We then have a nice square + // block of weeks. We do the usual rolling within this block, + // as is done elsewhere in this method. If we wind up on one of + // the phantom days that we added, we recognize this and pin to + // the first or the last day of the month. Easy, eh? + + // Normalize the DAY_OF_WEEK so that 0 is the first day of the week + // in this locale. We have dow in 0..6. + int32_t dow = internalGet(UCAL_DAY_OF_WEEK) - getFirstDayOfWeek(); + if (dow < 0) dow += 7; + + // Find the day of the week (normalized for locale) for the first + // of the month. + int32_t fdm = (dow - internalGet(UCAL_DAY_OF_MONTH) + 1) % 7; + if (fdm < 0) fdm += 7; + + // Get the first day of the first full week of the month, + // including phantom days, if any. Figure out if the first week + // counts or not; if it counts, then fill in phantom days. If + // not, advance to the first real full week (skip the partial week). + int32_t start; + if ((7 - fdm) < getMinimalDaysInFirstWeek()) + start = 8 - fdm; // Skip the first partial week + else + start = 1 - fdm; // This may be zero or negative + + // Get the day of the week (normalized for locale) for the last + // day of the month. + int32_t monthLen = getActualMaximum(UCAL_DAY_OF_MONTH, status); + int32_t ldm = (monthLen - internalGet(UCAL_DAY_OF_MONTH) + dow) % 7; + // We know monthLen >= DAY_OF_MONTH so we skip the += 7 step here. + + // Get the limit day for the blocked-off rectangular month; that + // is, the day which is one past the last day of the month, + // after the month has already been filled in with phantom days + // to fill out the last week. This day has a normalized DOW of 0. + int32_t limit = monthLen + 7 - ldm; + + // Now roll between start and (limit - 1). + int32_t gap = limit - start; + int32_t day_of_month = (internalGet(UCAL_DAY_OF_MONTH) + amount*7 - + start) % gap; + if (day_of_month < 0) day_of_month += gap; + day_of_month += start; + + // Finally, pin to the real start and end of the month. + if (day_of_month < 1) day_of_month = 1; + if (day_of_month > monthLen) day_of_month = monthLen; + + // Set the DAY_OF_MONTH. We rely on the fact that this field + // takes precedence over everything else (since all other fields + // are also set at this point). If this fact changes (if the + // disambiguation algorithm changes) then we will have to unset + // the appropriate fields here so that DAY_OF_MONTH is attended + // to. + set(UCAL_DAY_OF_MONTH, day_of_month); + return; + } + case UCAL_WEEK_OF_YEAR: + { + // This follows the outline of WEEK_OF_MONTH, except it applies + // to the whole year. Please see the comment for WEEK_OF_MONTH + // for general notes. + + // Normalize the DAY_OF_WEEK so that 0 is the first day of the week + // in this locale. We have dow in 0..6. + int32_t dow = internalGet(UCAL_DAY_OF_WEEK) - getFirstDayOfWeek(); + if (dow < 0) dow += 7; + + // Find the day of the week (normalized for locale) for the first + // of the year. + int32_t fdy = (dow - internalGet(UCAL_DAY_OF_YEAR) + 1) % 7; + if (fdy < 0) fdy += 7; + + // Get the first day of the first full week of the year, + // including phantom days, if any. Figure out if the first week + // counts or not; if it counts, then fill in phantom days. If + // not, advance to the first real full week (skip the partial week). + int32_t start; + if ((7 - fdy) < getMinimalDaysInFirstWeek()) + start = 8 - fdy; // Skip the first partial week + else + start = 1 - fdy; // This may be zero or negative + + // Get the day of the week (normalized for locale) for the last + // day of the year. + int32_t yearLen = getActualMaximum(UCAL_DAY_OF_YEAR,status); + int32_t ldy = (yearLen - internalGet(UCAL_DAY_OF_YEAR) + dow) % 7; + // We know yearLen >= DAY_OF_YEAR so we skip the += 7 step here. + + // Get the limit day for the blocked-off rectangular year; that + // is, the day which is one past the last day of the year, + // after the year has already been filled in with phantom days + // to fill out the last week. This day has a normalized DOW of 0. + int32_t limit = yearLen + 7 - ldy; + + // Now roll between start and (limit - 1). + int32_t gap = limit - start; + int32_t day_of_year = (internalGet(UCAL_DAY_OF_YEAR) + amount*7 - + start) % gap; + if (day_of_year < 0) day_of_year += gap; + day_of_year += start; + + // Finally, pin to the real start and end of the month. + if (day_of_year < 1) day_of_year = 1; + if (day_of_year > yearLen) day_of_year = yearLen; + + // Make sure that the year and day of year are attended to by + // clearing other fields which would normally take precedence. + // If the disambiguation algorithm is changed, this section will + // have to be updated as well. + set(UCAL_DAY_OF_YEAR, day_of_year); + clear(UCAL_MONTH); + return; + } + case UCAL_DAY_OF_YEAR: + { + // Roll the day of year using millis. Compute the millis for + // the start of the year, and get the length of the year. + double delta = amount * kOneDay; // Scale up from days to millis + double min2 = internalGet(UCAL_DAY_OF_YEAR)-1; + min2 *= kOneDay; + min2 = internalGetTime() - min2; + + // double min2 = internalGetTime() - (internalGet(UCAL_DAY_OF_YEAR) - 1.0) * kOneDay; + double newtime; + + double yearLength = getActualMaximum(UCAL_DAY_OF_YEAR,status); + double oneYear = yearLength; + oneYear *= kOneDay; + newtime = uprv_fmod((internalGetTime() + delta - min2), oneYear); + if (newtime < 0) newtime += oneYear; + setTimeInMillis(newtime + min2, status); + return; + } + case UCAL_DAY_OF_WEEK: + case UCAL_DOW_LOCAL: + { + // Roll the day of week using millis. Compute the millis for + // the start of the week, using the first day of week setting. + // Restrict the millis to [start, start+7days). + double delta = amount * kOneDay; // Scale up from days to millis + // Compute the number of days before the current day in this + // week. This will be a value 0..6. + int32_t leadDays = internalGet(field); + leadDays -= (field == UCAL_DAY_OF_WEEK) ? getFirstDayOfWeek() : 1; + if (leadDays < 0) leadDays += 7; + double min2 = internalGetTime() - leadDays * kOneDay; + double newtime = uprv_fmod((internalGetTime() + delta - min2), kOneWeek); + if (newtime < 0) newtime += kOneWeek; + setTimeInMillis(newtime + min2, status); + return; + } + case UCAL_DAY_OF_WEEK_IN_MONTH: + { + // Roll the day of week in the month using millis. Determine + // the first day of the week in the month, and then the last, + // and then roll within that range. + double delta = amount * kOneWeek; // Scale up from weeks to millis + // Find the number of same days of the week before this one + // in this month. + int32_t preWeeks = (internalGet(UCAL_DAY_OF_MONTH) - 1) / 7; + // Find the number of same days of the week after this one + // in this month. + int32_t postWeeks = (getActualMaximum(UCAL_DAY_OF_MONTH,status) - + internalGet(UCAL_DAY_OF_MONTH)) / 7; + // From these compute the min and gap millis for rolling. + double min2 = internalGetTime() - preWeeks * kOneWeek; + double gap2 = kOneWeek * (preWeeks + postWeeks + 1); // Must add 1! + // Roll within this range + double newtime = uprv_fmod((internalGetTime() + delta - min2), gap2); + if (newtime < 0) newtime += gap2; + setTimeInMillis(newtime + min2, status); + return; + } + case UCAL_JULIAN_DAY: + set(field, internalGet(field) + amount); + return; + default: + // Other fields cannot be rolled by this method +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d: ILLEGAL ARG because of roll on non-rollable field %s\n", + __FILE__, __LINE__,fldName(field)); +#endif + status = U_ILLEGAL_ARGUMENT_ERROR; + } +} + +void Calendar::add(EDateFields field, int32_t amount, UErrorCode& status) +{ + Calendar::add((UCalendarDateFields)field, amount, status); +} + +// ------------------------------------- +void Calendar::add(UCalendarDateFields field, int32_t amount, UErrorCode& status) +{ + if (amount == 0) { + return; // Do nothing! + } + + // We handle most fields in the same way. The algorithm is to add + // a computed amount of millis to the current millis. The only + // wrinkle is with DST -- for some fields, like the DAY_OF_MONTH, + // we don't want the HOUR to shift due to changes in DST. If the + // result of the add operation is to move from DST to Standard, or + // vice versa, we need to adjust by an hour forward or back, + // respectively. For such fields we set keepHourInvariant to TRUE. + + // We only adjust the DST for fields larger than an hour. For + // fields smaller than an hour, we cannot adjust for DST without + // causing problems. for instance, if you add one hour to April 5, + // 1998, 1:00 AM, in PST, the time becomes "2:00 AM PDT" (an + // illegal value), but then the adjustment sees the change and + // compensates by subtracting an hour. As a result the time + // doesn't advance at all. + + // For some fields larger than a day, such as a UCAL_MONTH, we pin the + // UCAL_DAY_OF_MONTH. This allows .add(UCAL_MONTH, 1) to be + // , rather than => . + + double delta = amount; // delta in ms + UBool keepHourInvariant = TRUE; + + switch (field) { + case UCAL_ERA: + set(field, get(field, status) + amount); + pinField(UCAL_ERA, status); + return; + + case UCAL_YEAR: + case UCAL_EXTENDED_YEAR: + case UCAL_YEAR_WOY: + case UCAL_MONTH: + set(field, get(field, status) + amount); + pinField(UCAL_DAY_OF_MONTH, status); + return; + + case UCAL_WEEK_OF_YEAR: + case UCAL_WEEK_OF_MONTH: + case UCAL_DAY_OF_WEEK_IN_MONTH: + delta *= kOneWeek; + break; + + case UCAL_AM_PM: + delta *= 12 * kOneHour; + break; + + case UCAL_DAY_OF_MONTH: + case UCAL_DAY_OF_YEAR: + case UCAL_DAY_OF_WEEK: + case UCAL_DOW_LOCAL: + case UCAL_JULIAN_DAY: + delta *= kOneDay; + break; + + case UCAL_HOUR_OF_DAY: + case UCAL_HOUR: + delta *= kOneHour; + keepHourInvariant = FALSE; + break; + + case UCAL_MINUTE: + delta *= kOneMinute; + keepHourInvariant = FALSE; + break; + + case UCAL_SECOND: + delta *= kOneSecond; + keepHourInvariant = FALSE; + break; + + case UCAL_MILLISECOND: + case UCAL_MILLISECONDS_IN_DAY: + keepHourInvariant = FALSE; + break; + + default: +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d: ILLEGAL ARG because field %s not addable", + __FILE__, __LINE__, fldName(field)); +#endif + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + // throw new IllegalArgumentException("Calendar.add(" + fieldName(field) + + // ") not supported"); + } + + // In order to keep the hour invariant (for fields where this is + // appropriate), record the DST_OFFSET before and after the add() + // operation. If it has changed, then adjust the millis to + // compensate. + int32_t dst = 0; + int32_t hour = 0; + if (keepHourInvariant) { + dst = get(UCAL_DST_OFFSET, status); + hour = internalGet(UCAL_HOUR_OF_DAY); + } + + setTimeInMillis(getTimeInMillis(status) + delta, status); + + if (keepHourInvariant) { + dst -= get(UCAL_DST_OFFSET, status); + if (dst != 0) { + // We have done an hour-invariant adjustment but the + // DST offset has altered. We adjust millis to keep + // the hour constant. In cases such as midnight after + // a DST change which occurs at midnight, there is the + // danger of adjusting into a different day. To avoid + // this we make the adjustment only if it actually + // maintains the hour. + double t = internalGetTime(); + setTimeInMillis(t + dst, status); + if (get(UCAL_HOUR_OF_DAY, status) != hour) { + setTimeInMillis(t, status); + } + } + } +} + +// ------------------------------------- +int32_t Calendar::fieldDifference(UDate when, EDateFields field, UErrorCode& status) { + return fieldDifference(when, (UCalendarDateFields) field, status); +} + +int32_t Calendar::fieldDifference(UDate targetMs, UCalendarDateFields field, UErrorCode& ec) { + if (U_FAILURE(ec)) return 0; + int32_t min = 0; + double startMs = getTimeInMillis(ec); + // Always add from the start millis. This accomodates + // operations like adding years from February 29, 2000 up to + // February 29, 2004. If 1, 1, 1, 1 is added to the year + // field, the DOM gets pinned to 28 and stays there, giving an + // incorrect DOM difference of 1. We have to add 1, reset, 2, + // reset, 3, reset, 4. + if (startMs < targetMs) { + int32_t max = 1; + // Find a value that is too large + while (U_SUCCESS(ec)) { + setTimeInMillis(startMs, ec); + add(field, max, ec); + double ms = getTimeInMillis(ec); + if (ms == targetMs) { + return max; + } else if (ms > targetMs) { + break; + } else { + max <<= 1; if (max < 0) { // Field difference too large to fit into int32_t +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d: ILLEGAL ARG because field %s's max too large for int32_t\n", + __FILE__, __LINE__, fldName(field)); +#endif ec = U_ILLEGAL_ARGUMENT_ERROR; } } @@ -861,6 +1838,10 @@ int32_t Calendar::fieldDifference(UDate targetMs, UCalendarDateFields field, UEr max <<= 1; if (max == 0) { // Field difference too large to fit into int32_t +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d: ILLEGAL ARG because field %s's max too large for int32_t\n", + __FILE__, __LINE__, fldName(field)); +#endif ec = U_ILLEGAL_ARGUMENT_ERROR; } } @@ -1001,7 +1982,85 @@ Calendar::getMinimalDaysInFirstWeek() const return fMinimalDaysInFirstWeek; } +// ------------------------------------- limits + +int32_t +Calendar::getMinimum(EDateFields field) const { + return getLimit((UCalendarDateFields) field,UCAL_LIMIT_MINIMUM); +} + +int32_t +Calendar::getMinimum(UCalendarDateFields field) const +{ + return getLimit(field,UCAL_LIMIT_MINIMUM); +} + +// ------------------------------------- +int32_t +Calendar::getMaximum(EDateFields field) const +{ + return getLimit((UCalendarDateFields) field,UCAL_LIMIT_MAXIMUM); +} + +int32_t +Calendar::getMaximum(UCalendarDateFields field) const +{ + return getLimit(field,UCAL_LIMIT_MAXIMUM); +} + // ------------------------------------- +int32_t +Calendar::getGreatestMinimum(EDateFields field) const +{ + return getLimit((UCalendarDateFields)field,UCAL_LIMIT_GREATEST_MINIMUM); +} + +int32_t +Calendar::getGreatestMinimum(UCalendarDateFields field) const +{ + return getLimit(field,UCAL_LIMIT_GREATEST_MINIMUM); +} + +// ------------------------------------- +int32_t +Calendar::getLeastMaximum(EDateFields field) const +{ + return getLimit((UCalendarDateFields) field,UCAL_LIMIT_LEAST_MAXIMUM); +} + +int32_t +Calendar::getLeastMaximum(UCalendarDateFields field) const +{ + return getLimit( field,UCAL_LIMIT_LEAST_MAXIMUM); +} + +// ------------------------------------- +int32_t +Calendar::getActualMinimum(EDateFields field, UErrorCode& status) const +{ + return getActualMinimum((UCalendarDateFields) field, status); +} + +int32_t Calendar::getLimit(UCalendarDateFields field, ELimitType limitType) const { + switch (field) { + case UCAL_DAY_OF_WEEK: + case UCAL_AM_PM: + case UCAL_HOUR: + case UCAL_HOUR_OF_DAY: + case UCAL_MINUTE: + case UCAL_SECOND: + case UCAL_MILLISECOND: + case UCAL_ZONE_OFFSET: + case UCAL_DST_OFFSET: + case UCAL_DOW_LOCAL: + case UCAL_JULIAN_DAY: + case UCAL_MILLISECONDS_IN_DAY: + return kCalendarLimits[field][limitType]; + default: + return handleGetLimit(field, limitType); + } +} + int32_t Calendar::getActualMinimum(UCalendarDateFields field, UErrorCode& status) const @@ -1046,57 +2105,868 @@ Calendar::getActualMinimum(UCalendarDateFields field, UErrorCode& status) const // ------------------------------------- + + +/** + * Ensure that each field is within its valid range by calling {@link + * #validateField(int)} on each field that has been set. This method + * should only be called if this calendar is not lenient. + * @see #isLenient + * @see #validateField(int) + * @draft ICU 2.8 + */ +void Calendar::validateFields(UErrorCode &status) { + for (int32_t field = 0; U_SUCCESS(status) && (field < UCAL_FIELD_COUNT); field++) { + if (isSet((UCalendarDateFields)field)) { + validateField((UCalendarDateFields)field, status); + } + } +} + +/** + * Validate a single field of this calendar. Subclasses should + * override this method to validate any calendar-specific fields. + * Generic fields can be handled by + * Calendar.validateField(). + * @see #validateField(int, int, int) + * @draft ICU 2.8 + */ +void Calendar::validateField(UCalendarDateFields field, UErrorCode &status) { + int32_t y; + switch (field) { + case UCAL_DAY_OF_MONTH: + y = handleGetExtendedYear(); + validateField(field, 1, handleGetMonthLength(y, internalGet(UCAL_MONTH)), status); + break; + case UCAL_DAY_OF_YEAR: + y = handleGetExtendedYear(); + validateField(field, 1, handleGetYearLength(y), status); + break; + case UCAL_DAY_OF_WEEK_IN_MONTH: + if (internalGet(field) == 0) { +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d: ILLEGAL ARG because DOW in month cannot be 0\n", + __FILE__, __LINE__); +#endif + status = U_ILLEGAL_ARGUMENT_ERROR; // "DAY_OF_WEEK_IN_MONTH cannot be zero" + return; + } + validateField(field, getMinimum(field), getMaximum(field), status); + break; + default: + validateField(field, getMinimum(field), getMaximum(field), status); + break; + } +} + +/** + * Validate a single field of this calendar given its minimum and + * maximum allowed value. If the field is out of range, throw a + * descriptive IllegalArgumentException. Subclasses may + * use this method in their implementation of {@link + * #validateField(int)}. + * @draft ICU 2.8 + */ +void Calendar::validateField(UCalendarDateFields field, int32_t min, int32_t max, UErrorCode& status) +{ + int32_t value = fFields[field]; + if (value < min || value > max) { +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d: ILLEGAL ARG because of field %s out of range %d..%d at %d\n", + __FILE__, __LINE__,fldName(field),min,max,value); +#endif + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } +} + +// ------------------------- + +const UFieldResolutionTable* Calendar::getFieldResolutionTable() const { + return kDatePrecedence; +} + + +UCalendarDateFields Calendar::newerField(UCalendarDateFields defaultField, UCalendarDateFields alternateField) const +{ + if (fStamp[alternateField] > fStamp[defaultField]) { + return alternateField; + } + return defaultField; +} + +UCalendarDateFields Calendar::resolveFields(const UFieldResolutionTable* precedenceTable) { + int32_t bestField = UCAL_FIELD_COUNT; + for (int32_t g=0; precedenceTable[g][0][0] != -1 && (bestField == UCAL_FIELD_COUNT); ++g) { + int32_t bestStamp = kUnset; + for (int32_t l=0; precedenceTable[g][l][0] != -1; ++l) { + int32_t lineStamp = kUnset; + // Skip over first entry if it is negative + for (int32_t i=((precedenceTable[g][l][0]>=kResolveRemap)?1:0); precedenceTable[g][l][i]!=-1; ++i) { + int32_t s = fStamp[precedenceTable[g][l][i]]; + // If any field is unset then don't use this line + if (s == kUnset) { + goto linesInGroup; + } else if(s > lineStamp) { + lineStamp = s; + } + } + // Record new maximum stamp & field no. + if (lineStamp > bestStamp) { + bestStamp = lineStamp; + bestField = precedenceTable[g][l][0]; // First field refers to entire line + } + linesInGroup: + ; + } + } + return (UCalendarDateFields)( (bestField>=kResolveRemap)?(bestField&(kResolveRemap-1)):bestField ); +} + +const UFieldResolutionTable Calendar::kDatePrecedence[] = + { + { + { UCAL_DAY_OF_MONTH, kResolveSTOP }, + { UCAL_WEEK_OF_YEAR, UCAL_DAY_OF_WEEK, kResolveSTOP }, + { UCAL_WEEK_OF_MONTH, UCAL_DAY_OF_WEEK, kResolveSTOP }, + { UCAL_DAY_OF_WEEK_IN_MONTH, UCAL_DAY_OF_WEEK, kResolveSTOP }, + { UCAL_WEEK_OF_YEAR, UCAL_DOW_LOCAL, kResolveSTOP }, + { UCAL_WEEK_OF_MONTH, UCAL_DOW_LOCAL, kResolveSTOP }, + { UCAL_DAY_OF_WEEK_IN_MONTH, UCAL_DOW_LOCAL, kResolveSTOP }, + { UCAL_DAY_OF_YEAR, kResolveSTOP }, + { kResolveRemap | UCAL_DAY_OF_MONTH, UCAL_YEAR, kResolveSTOP }, // if YEAR is set over YEAR_WOY use DAY_OF_MONTH + { kResolveRemap | UCAL_WEEK_OF_YEAR, UCAL_YEAR_WOY, kResolveSTOP }, // if YEAR_WOY is set, calc based on WEEK_OF_YEAR + { kResolveSTOP } + }, + { + { UCAL_WEEK_OF_YEAR, kResolveSTOP }, + { UCAL_WEEK_OF_MONTH, kResolveSTOP }, + { UCAL_DAY_OF_WEEK_IN_MONTH, kResolveSTOP }, + { kResolveRemap | UCAL_DAY_OF_WEEK_IN_MONTH, UCAL_DAY_OF_WEEK, kResolveSTOP }, + { kResolveRemap | UCAL_DAY_OF_WEEK_IN_MONTH, UCAL_DOW_LOCAL, kResolveSTOP }, + { kResolveSTOP } + }, + {{kResolveSTOP}} + }; + + +const UFieldResolutionTable Calendar::kDOWPrecedence[] = +{ + { + { UCAL_DAY_OF_WEEK,kResolveSTOP, kResolveSTOP }, + { UCAL_DOW_LOCAL,kResolveSTOP, kResolveSTOP }, + {kResolveSTOP} + }, + {{kResolveSTOP}} +}; + +// precedence for calculating a year +const UFieldResolutionTable Calendar::kYearPrecedence[] = +{ + { + { UCAL_YEAR, kResolveSTOP }, + { UCAL_EXTENDED_YEAR, kResolveSTOP }, + { UCAL_YEAR_WOY, UCAL_WEEK_OF_YEAR, kResolveSTOP }, // YEAR_WOY is useless without WEEK_OF_YEAR + { kResolveSTOP } + }, + {{kResolveSTOP}} +}; + + +// ------------------------- + + +void Calendar::computeTime(UErrorCode& status) { + if (!isLenient()) { + validateFields(status); + } + + // Compute the Julian day + int32_t julianDay = computeJulianDay(); + + double millis = Grego::julianDayToMillis(julianDay); + +#if defined (U_DEBUG_CAL) + // int32_t julianInsanityCheck = (int32_t)Math::floorDivide(millis, kOneDay); + // julianInsanityCheck += kEpochStartAsJulianDay; + // if(1 || julianInsanityCheck != julianDay) { + // fprintf(stderr, "%s:%d- D'oh- computed jules %d, to mills (%s)%.lf, recomputed %d\n", + // __FILE__, __LINE__, julianDay, millis<0.0?"NEG":"", millis, julianInsanityCheck); + // } +#endif + + int32_t millisInDay; + + // We only use MILLISECONDS_IN_DAY if it has been set by the user. + // This makes it possible for the caller to set the calendar to a + // time and call clear(MONTH) to reset the MONTH to January. This + // is legacy behavior. Without this, clear(MONTH) has no effect, + // since the internally set JULIAN_DAY is used. + if (fStamp[UCAL_MILLISECONDS_IN_DAY] >= ((int32_t)kMinimumUserStamp) && + newestStamp(UCAL_AM_PM, UCAL_MILLISECOND, kUnset) <= fStamp[UCAL_MILLISECONDS_IN_DAY]) { + millisInDay = internalGet(UCAL_MILLISECONDS_IN_DAY); + } else { + millisInDay = computeMillisInDay(); + } + + // Compute the time zone offset and DST offset. There are two potential + // ambiguities here. We'll assume a 2:00 am (wall time) switchover time + // for discussion purposes here. + // 1. The transition into DST. Here, a designated time of 2:00 am - 2:59 am + // can be in standard or in DST depending. However, 2:00 am is an invalid + // representation (the representation jumps from 1:59:59 am Std to 3:00:00 am DST). + // We assume standard time. + // 2. The transition out of DST. Here, a designated time of 1:00 am - 1:59 am + // can be in standard or DST. Both are valid representations (the rep + // jumps from 1:59:59 DST to 1:00:00 Std). + // Again, we assume standard time. + // We use the TimeZone object, unless the user has explicitly set the ZONE_OFFSET + // or DST_OFFSET fields; then we use those fields. + if (fStamp[UCAL_ZONE_OFFSET] >= ((int32_t)kMinimumUserStamp) || + fStamp[UCAL_DST_OFFSET] >= ((int32_t)kMinimumUserStamp)) { + millisInDay -= internalGet(UCAL_ZONE_OFFSET) + internalGet(UCAL_DST_OFFSET); + } else { + millisInDay -= computeZoneOffset(millis, millisInDay,status); + } + + internalSetTime(millis + millisInDay); +} + +/** + * Compute the milliseconds in the day from the fields. This is a + * value from 0 to 23:59:59.999 inclusive, unless fields are out of + * range, in which case it can be an arbitrary value. This value + * reflects local zone wall time. + * @stable ICU 2.0 + */ +int32_t Calendar::computeMillisInDay() { + // Do the time portion of the conversion. + + int32_t millisInDay = 0; + + // Find the best set of fields specifying the time of day. There + // are only two possibilities here; the HOUR_OF_DAY or the + // AM_PM and the HOUR. + int32_t hourOfDayStamp = fStamp[UCAL_HOUR_OF_DAY]; + int32_t hourStamp = (fStamp[UCAL_HOUR] > fStamp[UCAL_AM_PM])?fStamp[UCAL_HOUR]:fStamp[UCAL_AM_PM]; + int32_t bestStamp = (hourStamp > hourOfDayStamp) ? hourStamp : hourOfDayStamp; + + // Hours + if (bestStamp != kUnset) { + if (bestStamp == hourOfDayStamp) { + // Don't normalize here; let overflow bump into the next period. + // This is consistent with how we handle other fields. + millisInDay += internalGet(UCAL_HOUR_OF_DAY); + } else { + // Don't normalize here; let overflow bump into the next period. + // This is consistent with how we handle other fields. + millisInDay += internalGet(UCAL_HOUR); + millisInDay += 12 * internalGet(UCAL_AM_PM); // Default works for unset AM_PM + } + } + + // We use the fact that unset == 0; we start with millisInDay + // == HOUR_OF_DAY. + millisInDay *= 60; + millisInDay += internalGet(UCAL_MINUTE); // now have minutes + millisInDay *= 60; + millisInDay += internalGet(UCAL_SECOND); // now have seconds + millisInDay *= 1000; + millisInDay += internalGet(MILLISECOND); // now have millis + + return millisInDay; +} + +/** + * This method can assume EXTENDED_YEAR has been set. + * @param millis milliseconds of the date fields + * @param millisInDay milliseconds of the time fields; may be out + * or range. + * @stable ICU 2.0 + */ +int32_t Calendar::computeZoneOffset(double millis, int32_t millisInDay, UErrorCode &ec) { + int32_t rawOffset, dstOffset; + getTimeZone().getOffset(millis+millisInDay, TRUE, rawOffset, dstOffset, ec); + return rawOffset + dstOffset; + // Note: Because we pass in wall millisInDay, rather than + // standard millisInDay, we interpret "1:00 am" on the day + // of cessation of DST as "1:00 am Std" (assuming the time + // of cessation is 2:00 am). +} + +int32_t Calendar::computeJulianDay() +{ + // We want to see if any of the date fields is newer than the + // JULIAN_DAY. If not, then we use JULIAN_DAY. If so, then we do + // the normal resolution. We only use JULIAN_DAY if it has been + // set by the user. This makes it possible for the caller to set + // the calendar to a time and call clear(MONTH) to reset the MONTH + // to January. This is legacy behavior. Without this, + // clear(MONTH) has no effect, since the internally set JULIAN_DAY + // is used. + if (fStamp[UCAL_JULIAN_DAY] >= (int32_t)kMinimumUserStamp) { + int32_t bestStamp = newestStamp(UCAL_ERA, UCAL_DAY_OF_WEEK_IN_MONTH, kUnset); + bestStamp = newestStamp(UCAL_YEAR_WOY, UCAL_EXTENDED_YEAR, bestStamp); + if (bestStamp <= fStamp[UCAL_JULIAN_DAY]) { + return internalGet(UCAL_JULIAN_DAY); + } + } + + UCalendarDateFields bestField = resolveFields(getFieldResolutionTable()); + if (bestField == UCAL_FIELD_COUNT) { + bestField = UCAL_DAY_OF_MONTH; + } + + return handleComputeJulianDay(bestField); +} + +// ------------------------------------------- + +int32_t Calendar::handleComputeJulianDay(UCalendarDateFields bestField) { + UBool useMonth = (bestField == UCAL_DAY_OF_MONTH || + bestField == UCAL_WEEK_OF_MONTH || + bestField == UCAL_DAY_OF_WEEK_IN_MONTH); + int32_t year; + + if (bestField == UCAL_WEEK_OF_YEAR) { + year = internalGet(UCAL_YEAR_WOY, handleGetExtendedYear()); + internalSet(UCAL_EXTENDED_YEAR, year); + } else { + year = handleGetExtendedYear(); + internalSet(UCAL_EXTENDED_YEAR, year); + } + +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d - bf= %s - y=%d\n", __FILE__, __LINE__, fldName(bestField), year); +#endif + + // Get the Julian day of the day BEFORE the start of this year. + // If useMonth is true, get the day before the start of the month. + + // give calendar subclass a chance to have a default 'first' month + int8_t month; + + if(isSet(UCAL_MONTH)) { + month = (int8_t)internalGet(UCAL_MONTH); + } else { + month = (int8_t)getDefaultMonthInYear(); + } + + int32_t julianDay = handleComputeMonthStart(year, useMonth ? month : 0, useMonth); + + if (bestField == UCAL_DAY_OF_MONTH) { + + // give calendar subclass a chance to have a default 'first' dom + int32_t dayOfMonth; + if(isSet(UCAL_DAY_OF_MONTH)) { + dayOfMonth = internalGet(UCAL_DAY_OF_MONTH,1); + } else { + dayOfMonth = getDefaultDayInMonth(month); + } + return julianDay + dayOfMonth; + } + + if (bestField == UCAL_DAY_OF_YEAR) { + return julianDay + internalGet(UCAL_DAY_OF_YEAR); + } + + int32_t firstDayOfWeek = getFirstDayOfWeek(); // Localized fdw + + // At this point julianDay is the 0-based day BEFORE the first day of + // January 1, year 1 of the given calendar. If julianDay == 0, it + // specifies (Jan. 1, 1) - 1, in whatever calendar we are using (Julian + // or Gregorian). (or it is before the month we are in, if useMonth is True) + + // At this point we need to process the WEEK_OF_MONTH or + // WEEK_OF_YEAR, which are similar, or the DAY_OF_WEEK_IN_MONTH. + // First, perform initial shared computations. These locate the + // first week of the period. + + // Get the 0-based localized DOW of day one of the month or year. + // Valid range 0..6. + int32_t first = julianDayToDayOfWeek(julianDay + 1) - firstDayOfWeek; + if (first < 0) { + first += 7; + } + + int32_t dowLocal = getLocalDOW(); + + // Find the first target DOW (dowLocal) in the month or year. + // Actually, it may be just before the first of the month or year. + // It will be an integer from -5..7. + int32_t date = 1 - first + dowLocal; + + if (bestField == UCAL_DAY_OF_WEEK_IN_MONTH) { + // Adjust the target DOW to be in the month or year. + if (date < 1) { + date += 7; + } + + // The only trickiness occurs if the day-of-week-in-month is + // negative. + int32_t dim = internalGet(UCAL_DAY_OF_WEEK_IN_MONTH, 1); + if (dim >= 0) { + date += 7*(dim - 1); + + } else { + // Move date to the last of this day-of-week in this month, + // then back up as needed. If dim==-1, we don't back up at + // all. If dim==-2, we back up once, etc. Don't back up + // past the first of the given day-of-week in this month. + // Note that we handle -2, -3, etc. correctly, even though + // values < -1 are technically disallowed. + int32_t m = internalGet(UCAL_MONTH, UCAL_JANUARY); + int32_t monthLength = handleGetMonthLength(year, m); + date += ((monthLength - date) / 7 + dim + 1) * 7; + } + } else { +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d - bf= %s\n", __FILE__, __LINE__, fldName(bestField)); +#endif + + if(bestField == UCAL_WEEK_OF_YEAR) { // ------------------------------------- WOY ------------- + if(!isSet(UCAL_YEAR_WOY) || // YWOY not set at all or + ( (resolveFields(kYearPrecedence) != UCAL_YEAR_WOY) // YWOY doesn't have precedence + && (fStamp[UCAL_YEAR_WOY]!=kInternallySet) ) ) { // (excluding where all fields are internally set - then YWOY is used) + // need to be sure to stay in 'real' year. + int32_t woy = internalGet(bestField); + + int32_t nextJulianDay = handleComputeMonthStart(year+1, 0, FALSE); // jd of day before jan 1 + int32_t nextFirst = julianDayToDayOfWeek(nextJulianDay + 1) - firstDayOfWeek; + + if (nextFirst < 0) { // 0..6 ldow of Jan 1 + nextFirst += 7; + } + + if(woy==1) { // FIRST WEEK --------------------------------- +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d - woy=%d, yp=%d, nj(%d)=%d, nf=%d", __FILE__, __LINE__, + internalGet(bestField), resolveFields(kYearPrecedence), year+1, + nextJulianDay, nextFirst); + + fprintf(stderr, " next: %d DFW, min=%d \n", (7-nextFirst), getMinimalDaysInFirstWeek() ); +#endif + + // nextFirst is now the localized DOW of Jan 1 of y-woy+1 + if((nextFirst > 0) && // Jan 1 starts on FDOW + (7-nextFirst) >= getMinimalDaysInFirstWeek()) { // or enough days in the week + // Jan 1 of (yearWoy+1) is in yearWoy+1 - recalculate JD to next year +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d - was going to move JD from %d to %d [d%d]\n", __FILE__, __LINE__, + julianDay, nextJulianDay, (nextJulianDay-julianDay)); +#endif + julianDay = nextJulianDay; + + // recalculate 'first' [0-based local dow of jan 1] + first = julianDayToDayOfWeek(julianDay + 1) - firstDayOfWeek; + if (first < 0) { + first += 7; + } + // recalculate date. + date = 1 - first + dowLocal; + } + } else if(woy>=getLeastMaximum(bestField)) { + // could be in the last week- find out if this JD would overstep + int32_t testDate = date; + if ((7 - first) < getMinimalDaysInFirstWeek()) { + testDate += 7; + } + + // Now adjust for the week number. + testDate += 7 * (woy - 1); + +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d - y=%d, y-1=%d doy%d, njd%d (C.F. %d)\n", + __FILE__, __LINE__, year, year-1, testDate, julianDay+testDate, nextJulianDay); +#endif + if(julianDay+testDate > nextJulianDay) { // is it past Dec 31? (nextJulianDay is day BEFORE year+1's Jan 1) + // Fire up the calculating engines.. retry YWOY = (year-1) + julianDay = handleComputeMonthStart(year-1, 0, FALSE); // jd before Jan 1 of previous year + first = julianDayToDayOfWeek(julianDay + 1) - firstDayOfWeek; // 0 based local dow of first week + + if(first < 0) { // 0..6 + first += 7; + } + date = 1 - first + dowLocal; + +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d - date now %d, jd%d, ywoy%d\n", + __FILE__, __LINE__, date, julianDay, year-1); +#endif + + + } /* correction needed */ + } /* leastmaximum */ + } /* resolvefields(year) != year_woy */ + } /* bestfield != week_of_year */ + + // assert(bestField == WEEK_OF_MONTH || bestField == WEEK_OF_YEAR) + // Adjust for minimal days in first week + if ((7 - first) < getMinimalDaysInFirstWeek()) { + date += 7; + } + + // Now adjust for the week number. + date += 7 * (internalGet(bestField) - 1); + } + + return julianDay + date; +} + +int32_t +Calendar::getDefaultMonthInYear() +{ + return 0; +} + +int32_t +Calendar::getDefaultDayInMonth(int32_t /*month*/) +{ + return 1; +} + + +int32_t Calendar::getLocalDOW() +{ + // Get zero-based localized DOW, valid range 0..6. This is the DOW + // we are looking for. + int32_t dowLocal = 0; + switch (resolveFields(kDOWPrecedence)) { + case DAY_OF_WEEK: + dowLocal = internalGet(UCAL_DAY_OF_WEEK) - fFirstDayOfWeek; + break; + case DOW_LOCAL: + dowLocal = internalGet(UCAL_DOW_LOCAL) - 1; + break; + default: + break; + } + dowLocal = dowLocal % 7; + if (dowLocal < 0) { + dowLocal += 7; + } + return dowLocal; +} + +int32_t Calendar::handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy) +{ + // We have UCAL_YEAR_WOY and UCAL_WEEK_OF_YEAR - from those, determine + // what year we fall in, so that other code can set it properly. + // (code borrowed from computeWeekFields and handleComputeJulianDay) + //return yearWoy; + + // First, we need a reliable DOW. + UCalendarDateFields bestField = resolveFields(kDatePrecedence); // !! Note: if subclasses have a different table, they should override handleGetExtendedYearFromWeekFields + + // Now, a local DOW + int32_t dowLocal = getLocalDOW(); // 0..6 + int32_t firstDayOfWeek = getFirstDayOfWeek(); // Localized fdw + int32_t jan1Start = handleComputeMonthStart(yearWoy, 0, FALSE); + int32_t nextJan1Start = handleComputeMonthStart(yearWoy+1, 0, FALSE); // next year's Jan1 start + + // At this point julianDay is the 0-based day BEFORE the first day of + // January 1, year 1 of the given calendar. If julianDay == 0, it + // specifies (Jan. 1, 1) - 1, in whatever calendar we are using (Julian + // or Gregorian). (or it is before the month we are in, if useMonth is True) + + // At this point we need to process the WEEK_OF_MONTH or + // WEEK_OF_YEAR, which are similar, or the DAY_OF_WEEK_IN_MONTH. + // First, perform initial shared computations. These locate the + // first week of the period. + + // Get the 0-based localized DOW of day one of the month or year. + // Valid range 0..6. + int32_t first = julianDayToDayOfWeek(jan1Start + 1) - firstDayOfWeek; + if (first < 0) { + first += 7; + } + int32_t nextFirst = julianDayToDayOfWeek(nextJan1Start + 1) - firstDayOfWeek; + if (nextFirst < 0) { + nextFirst += 7; + } + + int32_t minDays = getMinimalDaysInFirstWeek(); + UBool jan1InPrevYear = FALSE; // January 1st in the year of WOY is the 1st week? (i.e. first week is < minimal ) + UBool nextJan1InPrevYear = FALSE; // January 1st of Year of WOY + 1 is in the first week? + + if((7 - first) < minDays) { + jan1InPrevYear = TRUE; + } + + if((7 - nextFirst) < minDays) { + nextJan1InPrevYear = TRUE; + } + + switch(bestField) { + case UCAL_WEEK_OF_YEAR: + if(woy == 1) { + if(jan1InPrevYear == TRUE) { + // the first week of January is in the previous year + // therefore WOY1 is always solidly within yearWoy + return yearWoy; + } else { + // First WOY is split between two years + if( dowLocal < first) { // we are prior to Jan 1 + return yearWoy-1; // previous year + } else { + return yearWoy; // in this year + } + } + } else if(woy >= getLeastMaximum(bestField)) { + // we _might_ be in the last week.. + int32_t jd = // Calculate JD of our target day: + jan1Start + // JD of Jan 1 + (7-first) + // days in the first week (Jan 1.. ) + (woy-1)*7 + // add the weeks of the year + dowLocal; // the local dow (0..6) of last week + if(jan1InPrevYear==FALSE) { + jd -= 7; // woy already includes Jan 1's week. + } + + if( (jd+1) >= nextJan1Start ) { + // we are in week 52 or 53 etc. - actual year is yearWoy+1 + return yearWoy+1; + } else { + // still in yearWoy; + return yearWoy; + } + } else { + // we're not possibly in the last week -must be ywoy + return yearWoy; + } + break; + + case UCAL_DATE: + if((internalGet(UCAL_MONTH)==0) && + (woy >= getLeastMaximum(UCAL_WEEK_OF_YEAR))) { + return yearWoy+1; // month 0, late woy = in the next year + } else if(woy==1) { + //if(nextJan1InPrevYear) { + if(internalGet(UCAL_MONTH)==0) { + return yearWoy; + } else { + return yearWoy-1; + } + //} + } + + //(internalGet(UCAL_DATE) <= (7-first)) /* && in minDow */ ) { + //within 1st week and in this month.. + //return yearWoy+1; + return yearWoy; + break; + + default: // assume the year is appropriate + return yearWoy; + break; + } + +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d - forgot a return on field %s\n", __FILE__, __LINE__, fldName(bestField)); +#endif + + return yearWoy; +} + +int32_t Calendar::handleGetMonthLength(int32_t extendedYear, int32_t month) const +{ + return handleComputeMonthStart(extendedYear, month+1, TRUE) - + handleComputeMonthStart(extendedYear, month, TRUE); +} + +int32_t Calendar::handleGetYearLength(int32_t eyear) const { + return handleComputeMonthStart(eyear+1, 0, FALSE) - + handleComputeMonthStart(eyear, 0, FALSE); +} + int32_t Calendar::getActualMaximum(UCalendarDateFields field, UErrorCode& status) const { - int32_t fieldValue = getLeastMaximum(field); - int32_t endValue = getMaximum(field); + int32_t result; + switch (field) { + case UCAL_DATE: + { + if(U_FAILURE(status)) return 0; + Calendar *cal = clone(); + if(!cal) { status = U_MEMORY_ALLOCATION_ERROR; return 0; } + cal->prepareGetActual(field,FALSE,status); + result = handleGetMonthLength(cal->get(UCAL_EXTENDED_YEAR, status), cal->get(UCAL_MONTH, status)); + delete cal; + } + break; - // if we know that the maximum value is always the same, just return it - if (fieldValue == endValue) { - return fieldValue; + case UCAL_DAY_OF_YEAR: + { + if(U_FAILURE(status)) return 0; + Calendar *cal = clone(); + if(!cal) { status = U_MEMORY_ALLOCATION_ERROR; return 0; } + cal->prepareGetActual(field,FALSE,status); + result = handleGetYearLength(cal->get(UCAL_EXTENDED_YEAR, status)); + delete cal; + } + break; + + case DAY_OF_WEEK: + case AM_PM: + case HOUR: + case HOUR_OF_DAY: + case MINUTE: + case SECOND: + case MILLISECOND: + case ZONE_OFFSET: + case DST_OFFSET: + case DOW_LOCAL: + case UCAL_JULIAN_DAY: + case UCAL_MILLISECONDS_IN_DAY: + // These fields all have fixed minima/maxima + result = getMaximum(field); + break; + + default: + // For all other fields, do it the hard way.... + result = getActualHelper(field, getLeastMaximum(field), getMaximum(field),status); + break; + } + return result; +} + + +/** +* Prepare this calendar for computing the actual minimum or maximum. +* This method modifies this calendar's fields; it is called on a +* temporary calendar. +* +*

    Rationale: The semantics of getActualXxx() is to return the +* maximum or minimum value that the given field can take, taking into +* account other relevant fields. In general these other fields are +* larger fields. For example, when computing the actual maximum +* DATE, the current value of DATE itself is ignored, +* as is the value of any field smaller. +* +*

    The time fields all have fixed minima and maxima, so we don't +* need to worry about them. This also lets us set the +* MILLISECONDS_IN_DAY to zero to erase any effects the time fields +* might have when computing date fields. +* +*

    DAY_OF_WEEK is adjusted specially for the WEEK_OF_MONTH and +* WEEK_OF_YEAR fields to ensure that they are computed correctly. +* @internal +*/ +void Calendar::prepareGetActual(UCalendarDateFields field, UBool isMinimum, UErrorCode &status) + { + set(UCAL_MILLISECONDS_IN_DAY, 0); + + switch (field) { + case UCAL_YEAR: + case UCAL_YEAR_WOY: + case UCAL_EXTENDED_YEAR: + set(UCAL_DAY_OF_YEAR, getGreatestMinimum(UCAL_DAY_OF_YEAR)); + break; + + case UCAL_MONTH: + set(UCAL_DATE, getGreatestMinimum(UCAL_DATE)); + break; + + case UCAL_DAY_OF_WEEK_IN_MONTH: + // For dowim, the maximum occurs for the DOW of the first of the + // month. + set(UCAL_DATE, 1); + set(UCAL_DAY_OF_WEEK, get(UCAL_DAY_OF_WEEK, status)); // Make this user set + break; + + case UCAL_WEEK_OF_MONTH: + case UCAL_WEEK_OF_YEAR: + // If we're counting weeks, set the day of the week to either the + // first or last localized DOW. We know the last week of a month + // or year will contain the first day of the week, and that the + // first week will contain the last DOW. + { + int32_t dow = fFirstDayOfWeek; + if (isMinimum) { + dow = (dow + 6) % 7; // set to last DOW + if (dow < UCAL_SUNDAY) { + dow += 7; + } + } +#if defined (U_DEBUG_CAL) + fprintf(stderr, "prepareGetActualHelper(WOM/WOY) - dow=%d\n", dow); +#endif + set(UCAL_DAY_OF_WEEK, dow); + } + break; + default: + ; } + // Do this last to give it the newest time stamp + set(field, getGreatestMinimum(field)); +} + +int32_t Calendar::getActualHelper(UCalendarDateFields field, int32_t startValue, int32_t endValue, UErrorCode &status) const +{ +#if defined (U_DEBUG_CAL) + fprintf(stderr, "getActualHelper(%d,%d .. %d, %s)\n", field, startValue, endValue, u_errorName(status)); +#endif + if (startValue == endValue) { + // if we know that the maximum value is always the same, just return it + return startValue; + } + + int32_t delta = (endValue > startValue) ? 1 : -1; + // clone the calendar so we don't mess with the real one, and set it to // accept anything for the field values - Calendar *work = (Calendar*)this->clone(); + if(U_FAILURE(status)) return startValue; + Calendar *work = clone(); + if(!work) { status = U_MEMORY_ALLOCATION_ERROR; return startValue; } work->setLenient(TRUE); +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d - getActualHelper - %s\n", __FILE__, __LINE__, u_errorName(status)); +#endif + work->prepareGetActual(field, delta < 0, status); +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d - getActualHelper - %s\n", __FILE__, __LINE__, u_errorName(status)); +#endif - // if we're counting weeks, set the day of the week to Sunday. We know the - // last week of a month or year will contain the first day of the week. - if (field == UCAL_WEEK_OF_YEAR || field == UCAL_WEEK_OF_MONTH) - work->set(UCAL_DAY_OF_WEEK, fFirstDayOfWeek); - - // now try each value from getLeastMaximum() to getMaximum() one by one until + // now try each value from the start to the end one by one until // we get a value that normalizes to another value. The last value that // normalizes to itself is the actual maximum for the current date - int32_t result = fieldValue; - + int32_t result = startValue; do { - work->set(field, fieldValue); - if(work->get(field, status) != fieldValue) { +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d - getActualHelper - %s\n", __FILE__, __LINE__, u_errorName(status)); +#endif + work->set(field, startValue); +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d - getActualHelper - %s (set to %d)\n", __FILE__, __LINE__, u_errorName(status), startValue); +#endif + if (work->get(field, status) != startValue) { +#if defined (U_DEBUG_CAL) + fprintf(stderr, "getActualHelper(fld %d) - got %d (not %d), BREAK - %s\n", field, work->get(field,status), startValue, u_errorName(status)); +#endif break; - } - else { - result = fieldValue; - fieldValue++; + } else { + result = startValue; + startValue += delta; +#if defined (U_DEBUG_CAL) + fprintf(stderr, "getActualHelper(%d) result=%d (start), start += %d to %d\n", field, result, delta, startValue); +#endif } - } while (fieldValue <= endValue); - + } while (result != endValue && U_SUCCESS(status)); delete work; - - /* Test for buffer overflows */ - if(U_FAILURE(status)) { - return 0; - } - +#if defined (U_DEBUG_CAL) + fprintf(stderr, "getActualHelper(%d) = %d\n", field, result); +#endif return result; } + + + // ------------------------------------- void -Calendar::setWeekCountData(const Locale& desiredLocale, UErrorCode& status) +Calendar::setWeekCountData(const Locale& desiredLocale, const char *type, UErrorCode& status) { // Read the week count data from the resource bundle. This should // have the form: @@ -1113,20 +2983,27 @@ Calendar::setWeekCountData(const Locale& desiredLocale, UErrorCode& status) fFirstDayOfWeek = UCAL_SUNDAY; fMinimalDaysInFirstWeek = 1; - UResourceBundle *resource = ures_open(NULL, desiredLocale.getName(), &status); - + CalendarData calData(desiredLocale, type, status); // If the resource data doesn't seem to be present at all, then use last-resort // hard-coded data. + UResourceBundle *dateTimeElements = calData.getByKey(kDateTimeElements, status); + if (U_FAILURE(status)) { +#if defined (U_DEBUG_CALDATA) + fprintf(stderr, " Failure loading dateTimeElements = %s\n", u_errorName(status)); +#endif status = U_USING_FALLBACK_WARNING; - ures_close(resource); return; } - //dateTimeElements = resource.getStringArray(kDateTimeElements, count, status); - UResourceBundle *dateTimeElements = ures_getByKey(resource, kDateTimeElements, NULL, &status); + U_LOCALE_BASED(locBased, *this); + locBased.setLocaleIDs(ures_getLocaleByType(dateTimeElements, ULOC_VALID_LOCALE, &status), + ures_getLocaleByType(dateTimeElements, ULOC_ACTUAL_LOCALE, &status)); if (U_SUCCESS(status)) { +#if defined (U_DEBUG_CAL) + fprintf(stderr, " Valid=%s, Actual=%s\n", validLocale, actualLocale); +#endif int32_t arrLen; const int32_t *dateTimeElementsArr = ures_getIntVector(dateTimeElements, &arrLen, &status); @@ -1141,9 +3018,8 @@ Calendar::setWeekCountData(const Locale& desiredLocale, UErrorCode& status) status = U_INVALID_FORMAT_ERROR; } } - - ures_close(dateTimeElements); - ures_close(resource); + + // do NOT close dateTimeElements } /** @@ -1165,21 +3041,24 @@ Calendar::updateTime(UErrorCode& status) fAreFieldsSet = FALSE; fIsTimeSet = TRUE; + fAreFieldsVirtuallySet = FALSE; } +Locale +Calendar::getLocale(ULocDataLocaleType type, UErrorCode& status) const { + U_LOCALE_BASED(locBased, *this); + return locBased.getLocale(type, status); +} - -U_NAMESPACE_END - -U_CFUNC UBool calendar_cleanup(void) { - if (gService) { - delete gService; - gService = NULL; - } - return TRUE; +const char * +Calendar::getLocaleID(ULocDataLocaleType type, UErrorCode& status) const { + U_LOCALE_BASED(locBased, *this); + return locBased.getLocaleID(type, status); } +U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ + //eof diff --git a/icuSources/i18n/casetrn.cpp b/icuSources/i18n/casetrn.cpp new file mode 100644 index 00000000..39469edb --- /dev/null +++ b/icuSources/i18n/casetrn.cpp @@ -0,0 +1,196 @@ +/* +******************************************************************************* +* +* Copyright (C) 2001-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: casetrn.cpp +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2004sep03 +* created by: Markus W. Scherer +* +* Implementation class for lower-/upper-/title-casing transliterators. +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_TRANSLITERATION + +#include "unicode/uchar.h" +#include "unicode/ustring.h" +#include "tolowtrn.h" +#include "ucase.h" +#include "cpputils.h" + +/* case context iterator using a Replaceable */ +U_CFUNC UChar32 U_CALLCONV +utrans_rep_caseContextIterator(void *context, int8_t dir) +{ + UCaseContext *csc=(UCaseContext *)context; + Replaceable *rep=(Replaceable *)csc->p; + UChar32 c; + + if(dir<0) { + /* reset for backward iteration */ + csc->index=csc->cpStart; + csc->dir=dir; + } else if(dir>0) { + /* reset for forward iteration */ + csc->index=csc->cpLimit; + csc->dir=dir; + } else { + /* continue current iteration direction */ + dir=csc->dir; + } + + // automatically adjust start and limit if the Replaceable disagrees + // with the original values + if(dir<0) { + if(csc->startindex) { + c=rep->char32At(csc->index-1); + if(c<0) { + csc->start=csc->index; + } else { + csc->index-=U16_LENGTH(c); + return c; + } + } + } else { + // detect, and store in csc->b1, if we hit the limit + if(csc->indexlimit) { + c=rep->char32At(csc->index); + if(c<0) { + csc->limit=csc->index; + csc->b1=TRUE; + } else { + csc->index+=U16_LENGTH(c); + return c; + } + } else { + csc->b1=TRUE; + } + } + return U_SENTINEL; +} + +U_NAMESPACE_BEGIN + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(CaseMapTransliterator) + +/** + * Constructs a transliterator. + */ +CaseMapTransliterator::CaseMapTransliterator(const Locale &loc, const UnicodeString &id, UCaseMapFull *map) : + Transliterator(id, 0), + fLoc(loc), fLocName(NULL), + fCsp(NULL), + fMap(map) +{ + UErrorCode errorCode = U_ZERO_ERROR; + fCsp = ucase_getSingleton(&errorCode); // expect to get NULL if failure + fLocName=fLoc.getName(); + + // TODO test incremental mode with context-sensitive text (e.g. greek sigma) + // TODO need to call setMaximumContextLength()?! +} + +/** + * Destructor. + */ +CaseMapTransliterator::~CaseMapTransliterator() { +} + +/** + * Copy constructor. + */ +CaseMapTransliterator::CaseMapTransliterator(const CaseMapTransliterator& o) : + Transliterator(o), + fLoc(o.fLoc), fLocName(NULL), fCsp(o.fCsp), fMap(o.fMap) +{ + fLocName=fLoc.getName(); +} + +/** + * Assignment operator. + */ +CaseMapTransliterator& CaseMapTransliterator::operator=(const CaseMapTransliterator& o) { + Transliterator::operator=(o); + fLoc = o.fLoc; + fLocName = fLoc.getName(); + fCsp = o.fCsp; + fMap = o.fMap; + return *this; +} + +/** + * Transliterator API. + */ +Transliterator* CaseMapTransliterator::clone(void) const { + return new CaseMapTransliterator(*this); +} + +/** + * Implements {@link Transliterator#handleTransliterate}. + */ +void CaseMapTransliterator::handleTransliterate(Replaceable& text, + UTransPosition& offsets, + UBool isIncremental) const +{ + if (offsets.start >= offsets.limit) { + return; + } + + UCaseContext csc; + uprv_memset(&csc, 0, sizeof(csc)); + csc.p = &text; + csc.start = offsets.contextStart; + csc.limit = offsets.contextLimit; + + UnicodeString tmp; + const UChar *s; + UChar32 c; + int32_t textPos, delta, result, locCache=0; + + for(textPos=offsets.start; textPos=0) { + // replace the current code point with its full case mapping result + // see UCASE_MAX_STRING_LENGTH + if(result<=UCASE_MAX_STRING_LENGTH) { + // string s[result] + tmp.setTo(FALSE, s, result); + delta=result-U16_LENGTH(c); + } else { + // single code point + tmp.setTo(result); + delta=tmp.length()-U16_LENGTH(c); + } + text.handleReplaceBetween(csc.cpStart, textPos, tmp); + if(delta!=0) { + textPos+=delta; + csc.limit=offsets.contextLimit+=delta; + offsets.limit+=delta; + } + } + } + offsets.start=textPos; +} + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_TRANSLITERATION */ diff --git a/icuSources/i18n/casetrn.h b/icuSources/i18n/casetrn.h new file mode 100644 index 00000000..cf3e0f95 --- /dev/null +++ b/icuSources/i18n/casetrn.h @@ -0,0 +1,115 @@ +/* +******************************************************************************* +* +* Copyright (C) 2001-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: casetrn.h +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2004sep03 +* created by: Markus W. Scherer +* +* Implementation class for lower-/upper-/title-casing transliterators. +*/ + +#ifndef __CASETRN_H__ +#define __CASETRN_H__ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_TRANSLITERATION + +#include "unicode/translit.h" +#include "unicode/locid.h" +#include "ucase.h" + +U_CDECL_BEGIN + +typedef int32_t U_CALLCONV +UCaseMapFull(const UCaseProps *csp, UChar32 c, + UCaseContextIterator *iter, void *context, + const UChar **pString, + const char *locale, int32_t *locCache); + +U_CDECL_END + +U_NAMESPACE_BEGIN + +/** + * A transliterator that performs locale-sensitive + * case mapping. + */ +class U_I18N_API CaseMapTransliterator : public Transliterator { +public: + /** + * Constructs a transliterator. + * @param loc the given locale. + * @param id the transliterator ID. + * @param map the full case mapping function (see ucase.h) + */ + CaseMapTransliterator(const Locale &loc, const UnicodeString &id, UCaseMapFull *map); + + /** + * Destructor. + */ + virtual ~CaseMapTransliterator(); + + /** + * Copy constructor. + */ + CaseMapTransliterator(const CaseMapTransliterator&); + + /** + * Assignment operator. + */ + CaseMapTransliterator& operator=(const CaseMapTransliterator&); + + /** + * Transliterator API. + * @return a copy of the object. + */ + virtual Transliterator* clone(void) const; + + /** + * ICU "poor man's RTTI", returns a UClassID for the actual class. + */ + virtual UClassID getDynamicClassID() const; + + /** + * ICU "poor man's RTTI", returns a UClassID for this class. + */ + static UClassID U_EXPORT2 getStaticClassID(); + +protected: + /** + * Implements {@link Transliterator#handleTransliterate}. + * @param text the buffer holding transliterated and + * untransliterated text + * @param offset the start and limit of the text, the position + * of the cursor, and the start and limit of transliteration. + * @param incremental if true, assume more text may be coming after + * pos.contextLimit. Otherwise, assume the text is complete. + */ + virtual void handleTransliterate(Replaceable& text, + UTransPosition& offsets, + UBool isIncremental) const; + + Locale fLoc; + const char *fLocName; + UCaseProps *fCsp; + UCaseMapFull *fMap; +}; + +U_NAMESPACE_END + +/** case context iterator using a Replaceable. This must be a C function because it is a callback. */ +U_CFUNC UChar32 U_CALLCONV +utrans_rep_caseContextIterator(void *context, int8_t dir); + +#endif /* #if !UCONFIG_NO_TRANSLITERATION */ + +#endif diff --git a/icuSources/i18n/chnsecal.cpp b/icuSources/i18n/chnsecal.cpp new file mode 100644 index 00000000..fda2aaca --- /dev/null +++ b/icuSources/i18n/chnsecal.cpp @@ -0,0 +1,13 @@ +/* + ****************************************************************************** + * Copyright (C) 2003-2004, International Business Machines Corporation and * + * others. All Rights Reserved. * + ****************************************************************************** + * + * + ****************************************************************************** + */ +#include "chnsecal.h" + +// Placeholder for now until the implementation can be finished. + diff --git a/icuSources/i18n/chnsecal.h b/icuSources/i18n/chnsecal.h new file mode 100644 index 00000000..9d5a9f77 --- /dev/null +++ b/icuSources/i18n/chnsecal.h @@ -0,0 +1,11 @@ +/* + ****************************************************************************** + * Copyright (C) 1996-2003, International Business Machines Corporation and * + * others. All Rights Reserved. * + ****************************************************************************** + * + * + ************************************************************************** + */ + +// placeholder diff --git a/icuSources/i18n/choicfmt.cpp b/icuSources/i18n/choicfmt.cpp index 09a849b7..eeac7f38 100644 --- a/icuSources/i18n/choicfmt.cpp +++ b/icuSources/i18n/choicfmt.cpp @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 1997-2003, International Business Machines Corporation and * +* Copyright (C) 1997-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* * @@ -32,6 +32,8 @@ #include "unicode/locid.h" #include "cpputils.h" #include "ustrfmt.h" +#include "cstring.h" +#include "putilimp.h" // ***************************************************************************** // class ChoiceFormat @@ -39,7 +41,7 @@ U_NAMESPACE_BEGIN -const char ChoiceFormat::fgClassID = 0; // Value is irrelevant +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ChoiceFormat) // Special characters used by ChoiceFormat. There are two characters // used interchangeably to indicate <=. Either is parsed, but only @@ -52,8 +54,8 @@ const char ChoiceFormat::fgClassID = 0; // Value is irrelevant #define MINUS ((UChar)0x002D) /*-*/ #define INFINITY ((UChar)0x221E) -const UChar ChoiceFormat::fgPositiveInfinity[] = {INFINITY, 0}; -const UChar ChoiceFormat::fgNegativeInfinity[] = {MINUS, INFINITY, 0}; +static const UChar gPositiveInfinity[] = {INFINITY, 0}; +static const UChar gNegativeInfinity[] = {MINUS, INFINITY, 0}; #define POSITIVE_INF_STRLEN 1 #define NEGATIVE_INF_STRLEN 2 @@ -132,7 +134,6 @@ UBool ChoiceFormat::operator==(const Format& that) const { if (this == &that) return TRUE; - if (this->getDynamicClassID() != that.getDynamicClassID()) return FALSE; // not the same class if (!NumberFormat::operator==(that)) return FALSE; ChoiceFormat& thatAlias = (ChoiceFormat&)that; if (fCount != thatAlias.fCount) return FALSE; @@ -196,7 +197,7 @@ ChoiceFormat::stod(const UnicodeString& string) char source[256]; char* end; - string.extract(0, string.length(), source, sizeof(source), ""); /* invariant codepage */ + string.extract(0, string.length(), source, (int32_t)sizeof(source), US_INV); /* invariant codepage */ return uprv_strtod(source,&end); } @@ -212,7 +213,7 @@ ChoiceFormat::dtos(double value, char temp[256]; uprv_dtostr(value, temp, 3, TRUE); - string = UnicodeString(temp, ""); /* invariant codepage */ + string = UnicodeString(temp, -1, US_INV); /* invariant codepage */ return string; } @@ -322,9 +323,9 @@ ChoiceFormat::applyPattern(const UnicodeString& pattern, double limit; buf.trim(); - if (!buf.compare(fgPositiveInfinity, POSITIVE_INF_STRLEN)) { + if (!buf.compare(gPositiveInfinity, POSITIVE_INF_STRLEN)) { limit = uprv_getInfinity(); - } else if (!buf.compare(fgNegativeInfinity, NEGATIVE_INF_STRLEN)) { + } else if (!buf.compare(gNegativeInfinity, NEGATIVE_INF_STRLEN)) { limit = -uprv_getInfinity(); } else { limit = stod(buf); @@ -565,6 +566,19 @@ ChoiceFormat::getFormats(int32_t& cnt) const return fChoiceFormats; } +// ------------------------------------- +// Formats an int64 number, it's actually formatted as +// a double. The returned format string may differ +// from the input number because of this. + +UnicodeString& +ChoiceFormat::format(int64_t number, + UnicodeString& appendTo, + FieldPosition& status) const +{ + return format((double) number, appendTo, status); +} + // ------------------------------------- // Formats a long number, it's actually formatted as // a double. The returned format string may differ @@ -626,10 +640,11 @@ ChoiceFormat::format(const Formattable* objs, UnicodeString buffer; for (int32_t i = 0; i < cnt; i++) { - double objDouble = (objs[i].getType() == Formattable::kLong) ? - ((double) objs[i].getLong()) : objs[i].getDouble(); - buffer.remove(); - appendTo += format(objDouble, buffer, pos); + double objDouble = objs[i].getDouble(status); + if (U_SUCCESS(status)) { + buffer.remove(); + appendTo += format(objDouble, buffer, pos); + } } return appendTo; diff --git a/icuSources/i18n/coleitr.cpp b/icuSources/i18n/coleitr.cpp index cd91b8e3..7661e854 100644 --- a/icuSources/i18n/coleitr.cpp +++ b/icuSources/i18n/coleitr.cpp @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 1996-2001, International Business Machines Corporation and * +* Copyright (C) 1996-2003, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* */ @@ -38,7 +38,7 @@ U_NAMESPACE_BEGIN -const char CollationElementIterator::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(CollationElementIterator) /* synwee : public can't remove */ int32_t const CollationElementIterator::NULLORDER = 0xffffffff; @@ -98,8 +98,7 @@ UBool CollationElementIterator::operator==( } // option comparison - if (!(m_data_->reset_ == that.m_data_->reset_ - && m_data_->iteratordata_.coll == that.m_data_->iteratordata_.coll)) + if (m_data_->iteratordata_.coll != that.m_data_->iteratordata_.coll) { return FALSE; } @@ -340,7 +339,7 @@ CollationElementIterator::CollationElementIterator( { // A CollationElementIterator is really a two-layered beast. // Internally it uses a Normalizer to munge the source text into a form - // where all "composed" Unicode characters (such as ü) are split into a + // where all "composed" Unicode characters (such as \u00FC) are split into a // normal character and a combining accent character. // Afterward, CollationElementIterator does its own processing to handle // expanding and contracting collation sequences, ignorables, and so on. diff --git a/icuSources/i18n/coll.cpp b/icuSources/i18n/coll.cpp index f8d075d8..6715a77e 100644 --- a/icuSources/i18n/coll.cpp +++ b/icuSources/i18n/coll.cpp @@ -1,6 +1,6 @@ /* ****************************************************************************** -* Copyright (C) 1996-2003, International Business Machines Corporation and * +* Copyright (C) 1996-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ****************************************************************************** */ @@ -43,11 +43,31 @@ #include "unicode/coll.h" #include "unicode/tblcoll.h" +#include "ucol_imp.h" #include "cmemory.h" #include "mutex.h" #include "iculserv.h" +#include "ustrenum.h" #include "ucln_in.h" +U_NAMESPACE_BEGIN +#if !UCONFIG_NO_SERVICE +U_NAMESPACE_END + +static ICULocaleService* gService = NULL; +/** + * Release all static memory held by collator. + */ +U_CDECL_BEGIN +static UBool U_CALLCONV collator_cleanup(void) { + if (gService) { + delete gService; + gService = NULL; + } + return TRUE; +} +U_CDECL_END + U_NAMESPACE_BEGIN // ------------------------------------------ @@ -57,9 +77,13 @@ U_NAMESPACE_BEGIN //------------------------------------------- +CollatorFactory::~CollatorFactory() {} + +//------------------------------------------- + UBool CollatorFactory::visible(void) const { - return TRUE; + return TRUE; } //------------------------------------------- @@ -75,8 +99,10 @@ CollatorFactory::getDisplayName(const Locale& objectLocale, // ------------------------------------- class ICUCollatorFactory : public ICUResourceBundleFactory { - - virtual UObject* create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const; + public: + ICUCollatorFactory(): ICUResourceBundleFactory(UnicodeString(U_ICUDATA_COLL, (char*)NULL)) { } + protected: + virtual UObject* create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const; }; UObject* @@ -88,7 +114,7 @@ ICUCollatorFactory::create(const ICUServiceKey& key, const ICUService* /* servic // default LocaleFactory uses currentLocale since that's the one vetted by handlesKey // but for ICU rb resources we use the actual one since it will fallback again lkey.canonicalLocale(loc); - + return Collator::makeInstance(loc, status); } return NULL; @@ -97,44 +123,53 @@ ICUCollatorFactory::create(const ICUServiceKey& key, const ICUService* /* servic // ------------------------------------- class ICUCollatorService : public ICULocaleService { - public: +public: ICUCollatorService() : ICULocaleService("Collator") { UErrorCode status = U_ZERO_ERROR; registerFactory(new ICUCollatorFactory(), status); } - + virtual UObject* cloneInstance(UObject* instance) const { return ((Collator*)instance)->clone(); } - + virtual UObject* handleDefault(const ICUServiceKey& key, UnicodeString* actualID, UErrorCode& status) const { LocaleKey& lkey = (LocaleKey&)key; - if (actualID) { - lkey.canonicalID(*actualID); - } - Locale loc; + if (actualID) { + // Ugly Hack Alert! We return an empty actualID to signal + // to callers that this is a default object, not a "real" + // service-created object. (TODO remove in 3.0) [aliu] + actualID->truncate(0); + } + Locale loc(""); lkey.canonicalLocale(loc); return Collator::makeInstance(loc, status); } - - virtual UObject* getKey(ICUServiceKey& key, UnicodeString* actualReturn, UErrorCode& status) const { - UnicodeString ar; - if (actualReturn == NULL) { - actualReturn = &ar; - } - Collator* result = (Collator*)ICULocaleService::getKey(key, actualReturn, status); - if (result) { - const LocaleKey& lkey = (const LocaleKey&)key; - Locale canonicalLocale; - Locale currentLocale; - - result->setLocales(lkey.canonicalLocale(canonicalLocale), - LocaleUtility::initLocaleFromName(*actualReturn, currentLocale)); - } - return result; - } + + virtual UObject* getKey(ICUServiceKey& key, UnicodeString* actualReturn, UErrorCode& status) const { + UnicodeString ar; + if (actualReturn == NULL) { + actualReturn = &ar; + } + Collator* result = (Collator*)ICULocaleService::getKey(key, actualReturn, status); + // Ugly Hack Alert! If the actualReturn length is zero, this + // means we got a default object, not a "real" service-created + // object. We don't call setLocales() on a default object, + // because that will overwrite its correct built-in locale + // metadata (valid & actual) with our incorrect data (all we + // have is the requested locale). (TODO remove in 3.0) [aliu] + if (result && actualReturn->length() > 0) { + const LocaleKey& lkey = (const LocaleKey&)key; + Locale canonicalLocale(""); + Locale currentLocale(""); + + result->setLocales(lkey.canonicalLocale(canonicalLocale), + LocaleUtility::initLocaleFromName(*actualReturn, currentLocale)); + } + return result; + } virtual UBool isDefault() const { return countFactories() == 1; @@ -145,32 +180,33 @@ class ICUCollatorService : public ICULocaleService { class ICUCollatorService; -static ICULocaleService* gService = NULL; - static ICULocaleService* getService(void) { - UBool needInit; - { - Mutex mutex; - needInit = (UBool)(gService == NULL); - } - if(needInit) { - ICULocaleService *newservice = new ICUCollatorService(); - if(newservice) { - Mutex mutex; - if(gService == NULL) { - gService = newservice; - newservice = NULL; - } + UBool needInit; + { + Mutex mutex; + needInit = (UBool)(gService == NULL); } - if(newservice) { - delete newservice; - } else { - ucln_i18n_registerCleanup(); + if(needInit) { + ICULocaleService *newservice = new ICUCollatorService(); + if(newservice) { + Mutex mutex; + if(gService == NULL) { + gService = newservice; + newservice = NULL; + } + } + if(newservice) { + delete newservice; + } + else { +#if !UCONFIG_NO_SERVICE + ucln_i18n_registerCleanup(UCLN_I18N_COLLATOR, collator_cleanup); +#endif + } } - } - return gService; + return gService; } // ------------------------------------- @@ -178,128 +214,144 @@ getService(void) static UBool hasService(void) { - Mutex mutex; - return gService != NULL; + Mutex mutex; + return gService != NULL; } // ------------------------------------- UCollator* Collator::createUCollator(const char *loc, - UErrorCode *status) + UErrorCode *status) { - UCollator *result = 0; - if (status && U_SUCCESS(*status) && hasService()) { - Locale desiredLocale(loc); - Collator *col = (Collator*)gService->get(desiredLocale, *status); - if (col && col->getDynamicClassID() == RuleBasedCollator::getStaticClassID()) { - RuleBasedCollator *rbc = (RuleBasedCollator *)col; - if (!rbc->dataIsOwned) { - result = ucol_safeClone(rbc->ucollator, NULL, NULL, status); - } else { - result = rbc->ucollator; - rbc->ucollator = NULL; // to prevent free on delete - } - } - delete col; - } - return result; + UCollator *result = 0; + if (status && U_SUCCESS(*status) && hasService()) { + Locale desiredLocale(loc); + Collator *col = (Collator*)gService->get(desiredLocale, *status); + if (col && col->getDynamicClassID() == RuleBasedCollator::getStaticClassID()) { + RuleBasedCollator *rbc = (RuleBasedCollator *)col; + if (!rbc->dataIsOwned) { + result = ucol_safeClone(rbc->ucollator, NULL, NULL, status); + } else { + result = rbc->ucollator; + rbc->ucollator = NULL; // to prevent free on delete + } + } + delete col; + } + return result; } +#endif /* UCONFIG_NO_SERVICE */ // Collator public methods ----------------------------------------------- -Collator* Collator::createInstance(UErrorCode& success) +Collator* U_EXPORT2 Collator::createInstance(UErrorCode& success) { - if (U_FAILURE(success)) - return 0; - return createInstance(Locale::getDefault(), success); + return createInstance(Locale::getDefault(), success); } -Collator* Collator::createInstance(const Locale& desiredLocale, +Collator* U_EXPORT2 Collator::createInstance(const Locale& desiredLocale, UErrorCode& status) { - if (U_FAILURE(status)) - return 0; - - if (hasService()) { - return (Collator*)gService->get(desiredLocale, status); - } - return makeInstance(desiredLocale, status); + if (U_FAILURE(status)) + return 0; + +#if !UCONFIG_NO_SERVICE + if (hasService()) { + Locale actualLoc; + Collator *result = + (Collator*)gService->get(desiredLocale, &actualLoc, status); + // Ugly Hack Alert! If the returned locale is empty (not root, + // but empty -- getName() == "") then that means the service + // returned a default object, not a "real" service object. In + // that case, the locale metadata (valid & actual) is setup + // correctly already, and we don't want to overwrite it. (TODO + // remove in 3.0) [aliu] + if (*actualLoc.getName() != 0) { + result->setLocales(desiredLocale, actualLoc); + } + return result; + } +#endif + return makeInstance(desiredLocale, status); } Collator* Collator::makeInstance(const Locale& desiredLocale, UErrorCode& status) { - // A bit of explanation is required here. Although in the current - // implementation - // Collator::createInstance() is just turning around and calling - // RuleBasedCollator(Locale&), this will not necessarily always be the - // case. For example, suppose we modify this code to handle a - // non-table-based Collator, such as that for Thai. In this case, - // createInstance() will have to be modified to somehow determine this fact - // (perhaps a field in the resource bundle). Then it can construct the - // non-table-based Collator in some other way, when it sees that it needs - // to. - // The specific caution is this: RuleBasedCollator(Locale&) will ALWAYS - // return a valid collation object, if the system if functioning properly. - // The reason is that it will fall back, use the default locale, and even - // use the built-in default collation rules. THEREFORE, createInstance() - // should in general ONLY CALL RuleBasedCollator(Locale&) IF IT KNOWS IN - // ADVANCE that the given locale's collation is properly implemented as a - // RuleBasedCollator. - // Currently, we don't do this...we always return a RuleBasedCollator, - // whether it is strictly correct to do so or not, without checking, because - // we currently have no way of checking. - - RuleBasedCollator* collation = new RuleBasedCollator(desiredLocale, - status); - /* test for NULL */ - if (collation == 0) { - status = U_MEMORY_ALLOCATION_ERROR; - return 0; - } - if (U_FAILURE(status)) - { - delete collation; - collation = 0; - } - return collation; + // A bit of explanation is required here. Although in the current + // implementation + // Collator::createInstance() is just turning around and calling + // RuleBasedCollator(Locale&), this will not necessarily always be the + // case. For example, suppose we modify this code to handle a + // non-table-based Collator, such as that for Thai. In this case, + // createInstance() will have to be modified to somehow determine this fact + // (perhaps a field in the resource bundle). Then it can construct the + // non-table-based Collator in some other way, when it sees that it needs + // to. + // The specific caution is this: RuleBasedCollator(Locale&) will ALWAYS + // return a valid collation object, if the system if functioning properly. + // The reason is that it will fall back, use the default locale, and even + // use the built-in default collation rules. THEREFORE, createInstance() + // should in general ONLY CALL RuleBasedCollator(Locale&) IF IT KNOWS IN + // ADVANCE that the given locale's collation is properly implemented as a + // RuleBasedCollator. + // Currently, we don't do this...we always return a RuleBasedCollator, + // whether it is strictly correct to do so or not, without checking, because + // we currently have no way of checking. + + RuleBasedCollator* collation = new RuleBasedCollator(desiredLocale, + status); + /* test for NULL */ + if (collation == 0) { + status = U_MEMORY_ALLOCATION_ERROR; + return 0; + } + if (U_FAILURE(status)) + { + delete collation; + collation = 0; + } + return collation; } +#ifdef U_USE_COLLATION_OBSOLETE_2_6 // !!! dlf the following is obsolete, ignore registration for this Collator * Collator::createInstance(const Locale &loc, UVersionInfo version, - UErrorCode &status) { - Collator *collator; - UVersionInfo info; - - collator=new RuleBasedCollator(loc, status); - /* test for NULL */ - if (collator == 0) { - status = U_MEMORY_ALLOCATION_ERROR; - return 0; - } - - if(U_SUCCESS(status)) { - collator->getVersion(info); - if(0!=uprv_memcmp(version, info, sizeof(UVersionInfo))) { - delete collator; - status=U_MISSING_RESOURCE_ERROR; - return 0; + UErrorCode &status) +{ + Collator *collator; + UVersionInfo info; + + collator=new RuleBasedCollator(loc, status); + /* test for NULL */ + if (collator == 0) { + status = U_MEMORY_ALLOCATION_ERROR; + return 0; } - } - return collator; + + if(U_SUCCESS(status)) { + collator->getVersion(info); + if(0!=uprv_memcmp(version, info, sizeof(UVersionInfo))) { + delete collator; + status=U_MISSING_RESOURCE_ERROR; + return 0; + } + } + return collator; } +#endif // implement deprecated, previously abstract method Collator::EComparisonResult Collator::compare(const UnicodeString& source, const UnicodeString& target) const { - UErrorCode ec = U_ZERO_ERROR; - return (Collator::EComparisonResult)compare(source, target, ec); + UErrorCode ec = U_ZERO_ERROR; + return (Collator::EComparisonResult)compare(source, target, ec); } // implement deprecated, previously abstract method @@ -307,8 +359,8 @@ Collator::EComparisonResult Collator::compare(const UnicodeString& source, const UnicodeString& target, int32_t length) const { - UErrorCode ec = U_ZERO_ERROR; - return (Collator::EComparisonResult)compare(source, target, length, ec); + UErrorCode ec = U_ZERO_ERROR; + return (Collator::EComparisonResult)compare(source, target, length, ec); } // implement deprecated, previously abstract method @@ -316,52 +368,54 @@ Collator::EComparisonResult Collator::compare(const UChar* source, int32_t sourc const UChar* target, int32_t targetLength) const { - UErrorCode ec = U_ZERO_ERROR; - return (Collator::EComparisonResult)compare(source, sourceLength, target, targetLength, ec); + UErrorCode ec = U_ZERO_ERROR; + return (Collator::EComparisonResult)compare(source, sourceLength, target, targetLength, ec); } UBool Collator::equals(const UnicodeString& source, - const UnicodeString& target) const + const UnicodeString& target) const { - UErrorCode ec = U_ZERO_ERROR; - return (compare(source, target, ec) == UCOL_EQUAL); + UErrorCode ec = U_ZERO_ERROR; + return (compare(source, target, ec) == UCOL_EQUAL); } UBool Collator::greaterOrEqual(const UnicodeString& source, - const UnicodeString& target) const + const UnicodeString& target) const { - UErrorCode ec = U_ZERO_ERROR; - return (compare(source, target, ec) != UCOL_LESS); + UErrorCode ec = U_ZERO_ERROR; + return (compare(source, target, ec) != UCOL_LESS); } UBool Collator::greater(const UnicodeString& source, - const UnicodeString& target) const + const UnicodeString& target) const { - UErrorCode ec = U_ZERO_ERROR; - return (compare(source, target, ec) == UCOL_GREATER); + UErrorCode ec = U_ZERO_ERROR; + return (compare(source, target, ec) == UCOL_GREATER); } // this API ignores registered collators, since it returns an // array of indefinite lifetime -const Locale* Collator::getAvailableLocales(int32_t& count) +const Locale* U_EXPORT2 Collator::getAvailableLocales(int32_t& count) { - return Locale::getAvailableLocales(count); + return Locale::getAvailableLocales(count); } -UnicodeString& Collator::getDisplayName(const Locale& objectLocale, - const Locale& displayLocale, - UnicodeString& name) +UnicodeString& U_EXPORT2 Collator::getDisplayName(const Locale& objectLocale, + const Locale& displayLocale, + UnicodeString& name) { - if (hasService()) { - return gService->getDisplayName(objectLocale.getName(), name, displayLocale); - } - return objectLocale.getDisplayName(displayLocale, name); +#if !UCONFIG_NO_SERVICE + if (hasService()) { + return gService->getDisplayName(objectLocale.getName(), name, displayLocale); + } +#endif + return objectLocale.getDisplayName(displayLocale, name); } -UnicodeString& Collator::getDisplayName(const Locale& objectLocale, - UnicodeString& name) +UnicodeString& U_EXPORT2 Collator::getDisplayName(const Locale& objectLocale, + UnicodeString& name) { - return getDisplayName(objectLocale, Locale::getDefault(), name); + return getDisplayName(objectLocale, Locale::getDefault(), name); } /* This is useless information */ @@ -381,7 +435,7 @@ UnicodeString& Collator::getDisplayName(const Locale& objectLocale, * is left to the child class. */ Collator::Collator() - : UObject() +: UObject() { } @@ -396,7 +450,7 @@ Collator::Collator() * @deprecated 2.4 use the default constructor instead */ Collator::Collator(UCollationStrength, UNormalizationMode ) - : UObject() +: UObject() { } @@ -409,23 +463,44 @@ Collator::Collator(const Collator &other) { } -int32_t Collator::getBound(const uint8_t *source, - int32_t sourceLength, - UColBoundMode boundType, - uint32_t noOfLevels, - uint8_t *result, - int32_t resultLength, - UErrorCode &status) { - return ucol_getBound(source, sourceLength, boundType, noOfLevels, result, resultLength, &status); +UBool Collator::operator==(const Collator& other) const +{ + return (UBool)(this == &other); +} + +UBool Collator::operator!=(const Collator& other) const +{ + return (UBool)!(*this == other); +} + +int32_t U_EXPORT2 Collator::getBound(const uint8_t *source, + int32_t sourceLength, + UColBoundMode boundType, + uint32_t noOfLevels, + uint8_t *result, + int32_t resultLength, + UErrorCode &status) +{ + return ucol_getBound(source, sourceLength, boundType, noOfLevels, result, resultLength, &status); } void Collator::setLocales(const Locale& /* requestedLocale */, const Locale& /* validLocale */) { } +UnicodeSet *Collator::getTailoredSet(UErrorCode &status) const +{ + if(U_FAILURE(status)) { + return NULL; + } + // everything can be changed + return new UnicodeSet(0, 0x10FFFF); +} + // ------------------------------------- -URegistryKey +#if !UCONFIG_NO_SERVICE +URegistryKey U_EXPORT2 Collator::registerInstance(Collator* toAdopt, const Locale& locale, UErrorCode& status) { if (U_SUCCESS(status)) { @@ -440,41 +515,41 @@ class CFactory : public LocaleKeyFactory { private: CollatorFactory* _delegate; Hashtable* _ids; - + public: CFactory(CollatorFactory* delegate, UErrorCode& status) : LocaleKeyFactory(delegate->visible() ? VISIBLE : INVISIBLE) , _delegate(delegate) , _ids(NULL) { - if (U_SUCCESS(status)) { - int32_t count = 0; - _ids = new Hashtable(status); - if (_ids) { - const UnicodeString * idlist = _delegate->getSupportedIDs(count, status); - for (int i = 0; i < count; ++i) { - _ids->put(idlist[i], (void*)this, status); - if (U_FAILURE(status)) { - delete _ids; - _ids = NULL; - return; - } - } - } else { - status = U_MEMORY_ALLOCATION_ERROR; - } + if (U_SUCCESS(status)) { + int32_t count = 0; + _ids = new Hashtable(status); + if (_ids) { + const UnicodeString * idlist = _delegate->getSupportedIDs(count, status); + for (int i = 0; i < count; ++i) { + _ids->put(idlist[i], (void*)this, status); + if (U_FAILURE(status)) { + delete _ids; + _ids = NULL; + return; + } + } + } else { + status = U_MEMORY_ALLOCATION_ERROR; + } } } - + virtual ~CFactory() { delete _delegate; delete _ids; } - + virtual UObject* create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const; - - protected: + +protected: virtual const Hashtable* getSupportedIDs(UErrorCode& status) const { if (U_SUCCESS(status)) { @@ -482,7 +557,7 @@ public: } return NULL; } - + virtual UnicodeString& getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeString& result) const; }; @@ -494,7 +569,7 @@ CFactory::create(const ICUServiceKey& key, const ICUService* /* service */, UErr const LocaleKey& lkey = (const LocaleKey&)key; Locale validLoc; lkey.currentLocale(validLoc); - return _delegate->createCollator(validLoc); + return _delegate->createCollator(validLoc); } return NULL; } @@ -515,7 +590,7 @@ CFactory::getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeS return result; } -URegistryKey +URegistryKey U_EXPORT2 Collator::registerFactory(CollatorFactory* toAdopt, UErrorCode& status) { if (U_SUCCESS(status)) { @@ -530,24 +605,60 @@ Collator::registerFactory(CollatorFactory* toAdopt, UErrorCode& status) // ------------------------------------- -UBool +UBool U_EXPORT2 Collator::unregister(URegistryKey key, UErrorCode& status) { - if (U_SUCCESS(status)) { - if (hasService()) { - return gService->unregister(key, status); + if (U_SUCCESS(status)) { + if (hasService()) { + return gService->unregister(key, status); + } + status = U_ILLEGAL_ARGUMENT_ERROR; } - status = U_ILLEGAL_ARGUMENT_ERROR; - } - return FALSE; + return FALSE; } // ------------------------------------- -StringEnumeration* +StringEnumeration* U_EXPORT2 Collator::getAvailableLocales(void) { - return getService()->getAvailableLocales(); + return getService()->getAvailableLocales(); +} +#endif /* UCONFIG_NO_SERVICE */ + +StringEnumeration* U_EXPORT2 +Collator::getKeywords(UErrorCode& status) { + // This is a wrapper over ucol_getKeywords + UEnumeration* uenum = ucol_getKeywords(&status); + if (U_FAILURE(status)) { + uenum_close(uenum); + return NULL; + } + return new UStringEnumeration(uenum); +} + +StringEnumeration* U_EXPORT2 +Collator::getKeywordValues(const char *keyword, UErrorCode& status) { + // This is a wrapper over ucol_getKeywordValues + UEnumeration* uenum = ucol_getKeywordValues(keyword, &status); + if (U_FAILURE(status)) { + uenum_close(uenum); + return NULL; + } + return new UStringEnumeration(uenum); +} + +Locale U_EXPORT2 +Collator::getFunctionalEquivalent(const char* keyword, const Locale& locale, + UBool& isAvailable, UErrorCode& status) { + // This is a wrapper over ucol_getFunctionalEquivalent + char loc[ULOC_FULLNAME_CAPACITY]; + /*int32_t len =*/ ucol_getFunctionalEquivalent(loc, sizeof(loc), + keyword, locale.getName(), &isAvailable, &status); + if (U_FAILURE(status)) { + *loc = 0; // root + } + return Locale::createFromName(loc); } // UCollator private data members ---------------------------------------- @@ -559,19 +670,6 @@ Collator::getAvailableLocales(void) U_NAMESPACE_END -// defined in ucln_cmn.h - -/** - * Release all static memory held by collator. - */ -U_CFUNC UBool collator_cleanup(void) { - if (gService) { - delete gService; - gService = NULL; - } - return TRUE; -} - #endif /* #if !UCONFIG_NO_COLLATION */ /* eof */ diff --git a/icuSources/i18n/cpdtrans.cpp b/icuSources/i18n/cpdtrans.cpp index abcf12ac..fa3b5589 100644 --- a/icuSources/i18n/cpdtrans.cpp +++ b/icuSources/i18n/cpdtrans.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -13,7 +13,6 @@ #if !UCONFIG_NO_TRANSLITERATION #include "unicode/unifilt.h" -#include "unicode/unifltlg.h" #include "unicode/uniset.h" #include "cpdtrans.h" #include "uvector.h" @@ -27,10 +26,11 @@ static const UChar NEWLINE = 10; // Empty string static const UChar EMPTY[] = {0}; //"" +static const UChar COLON_COLON[] = {0x3A, 0x3A, 0}; //"::" U_NAMESPACE_BEGIN -const char CompoundTransliterator::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(CompoundTransliterator) /** * Constructs a new compound transliterator given an array of @@ -363,7 +363,7 @@ UnicodeString& CompoundTransliterator::toRules(UnicodeString& rulesSource, // If we are a compound RBT and if we have a global // filter, then emit it at the top. UnicodeString pat; - rulesSource.append("::").append(getFilter()->toPattern(pat, escapeUnprintable)).append(ID_DELIM); + rulesSource.append(COLON_COLON).append(getFilter()->toPattern(pat, escapeUnprintable)).append(ID_DELIM); } for (int32_t i=0; iclone(); +} + +CurrencyFormat::~CurrencyFormat() { + delete fmt; +} + +UBool CurrencyFormat::operator==(const Format& other) const { + if (this == &other) { + return TRUE; + } + if (other.getDynamicClassID() != CurrencyFormat::getStaticClassID()) { + return FALSE; + } + const CurrencyFormat* c = (const CurrencyFormat*) &other; + return *fmt == *c->fmt; +} + +Format* CurrencyFormat::clone() const { + return new CurrencyFormat(*this); +} + +UnicodeString& CurrencyFormat::format(const Formattable& obj, + UnicodeString& appendTo, + FieldPosition& pos, + UErrorCode& ec) const { + return fmt->format(obj, appendTo, pos, ec); +} + +UnicodeString& CurrencyFormat::format(const Formattable& obj, + UnicodeString& appendTo, + UErrorCode& ec) const { + return MeasureFormat::format(obj, appendTo, ec); +} + +void CurrencyFormat::parseObject(const UnicodeString& source, + Formattable& result, + ParsePosition& pos) const { + fmt->parseCurrency(source, result, pos); +} + +void CurrencyFormat::parseObject(const UnicodeString& source, + Formattable& result, + UErrorCode& ec) const { + MeasureFormat::parseObject(source, result, ec); +} + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(CurrencyFormat) + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/i18n/currfmt.h b/icuSources/i18n/currfmt.h new file mode 100644 index 00000000..659b1ad7 --- /dev/null +++ b/icuSources/i18n/currfmt.h @@ -0,0 +1,112 @@ +/* +********************************************************************** +* Copyright (c) 2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Author: Alan Liu +* Created: April 20, 2004 +* Since: ICU 3.0 +********************************************************************** +*/ +#ifndef CURRENCYFORMAT_H +#define CURRENCYFORMAT_H + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/measfmt.h" + +U_NAMESPACE_BEGIN + +class NumberFormat; + +/** + * Temporary internal concrete subclass of MeasureFormat implementing + * parsing and formatting of currency amount objects. This class is + * likely to be redesigned and rewritten in the near future. + * + *

    This class currently delegates to DecimalFormat for parsing and + * formatting. + * + * @see MeasureFormat + * @author Alan Liu + * @internal + */ +class U_I18N_API CurrencyFormat : public MeasureFormat { + + public: + + /** + * Construct a CurrencyFormat for the given locale. + */ + CurrencyFormat(const Locale& locale, UErrorCode& ec); + + /** + * Copy constructor. + */ + CurrencyFormat(const CurrencyFormat& other); + + /** + * Destructor. + */ + virtual ~CurrencyFormat(); + + /** + * Override Format API. + */ + virtual UBool operator==(const Format& other) const; + + /** + * Override Format API. + */ + virtual Format* clone() const; + + /** + * Override Format API. + */ + virtual UnicodeString& format(const Formattable& obj, + UnicodeString& appendTo, + FieldPosition& pos, + UErrorCode& ec) const; + + /** + * Redeclare Format API to prevent hiding. + */ + UnicodeString& format(const Formattable& obj, + UnicodeString& appendTo, + UErrorCode& ec) const; + + /** + * Override Format API. + */ + virtual void parseObject(const UnicodeString& source, + Formattable& result, + ParsePosition& pos) const; + + /** + * Redeclare Format API to prevent hiding. + */ + void parseObject(const UnicodeString& source, + Formattable& result, + UErrorCode& ec) const; + + /** + * Override Format API. + */ + virtual UClassID getDynamicClassID() const; + + /** + * Returns the class ID for this class. + */ + static UClassID U_EXPORT2 getStaticClassID(); + + private: + + NumberFormat* fmt; +}; + +U_NAMESPACE_END + +#endif // #if !UCONFIG_NO_FORMATTING +#endif // #ifndef CURRENCYFORMAT_H diff --git a/icuSources/i18n/currunit.cpp b/icuSources/i18n/currunit.cpp new file mode 100644 index 00000000..0ba2631d --- /dev/null +++ b/icuSources/i18n/currunit.cpp @@ -0,0 +1,60 @@ +/* +********************************************************************** +* Copyright (c) 2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Author: Alan Liu +* Created: April 26, 2004 +* Since: ICU 3.0 +********************************************************************** +*/ +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/currunit.h" +#include "unicode/ustring.h" + +U_NAMESPACE_BEGIN + +CurrencyUnit::CurrencyUnit(const UChar* _isoCode, UErrorCode& ec) { + *isoCode = 0; + if (U_SUCCESS(ec)) { + if (_isoCode && u_strlen(_isoCode)==3) { + u_strcpy(isoCode, _isoCode); + } else { + ec = U_ILLEGAL_ARGUMENT_ERROR; + } + } +} + +CurrencyUnit::CurrencyUnit(const CurrencyUnit& other) : + MeasureUnit(other) { + *this = other; +} + +CurrencyUnit& CurrencyUnit::operator=(const CurrencyUnit& other) { + if (this != &other) { + u_strcpy(isoCode, other.isoCode); + } + return *this; +} + +UObject* CurrencyUnit::clone() const { + return new CurrencyUnit(*this); +} + +CurrencyUnit::~CurrencyUnit() { +} + +UBool CurrencyUnit::operator==(const UObject& other) const { + const CurrencyUnit& c = (const CurrencyUnit&) other; + return other.getDynamicClassID() == CurrencyUnit::getStaticClassID() && + u_strcmp(isoCode, c.isoCode) == 0; +} + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(CurrencyUnit) + +U_NAMESPACE_END + +#endif // !UCONFIG_NO_FORMATTING diff --git a/icuSources/i18n/datefmt.cpp b/icuSources/i18n/datefmt.cpp index 63b43aa6..b2b75816 100644 --- a/icuSources/i18n/datefmt.cpp +++ b/icuSources/i18n/datefmt.cpp @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 1997-2003, International Business Machines Corporation and * +* Copyright (C) 1997-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* * @@ -21,10 +21,14 @@ #if !UCONFIG_NO_FORMATTING -#include "unicode/resbund.h" +#include "unicode/ures.h" #include "unicode/datefmt.h" #include "unicode/smpdtfmt.h" +#if defined( U_DEBUG_CALSVC ) || defined (U_DEBUG_CAL) +#include +#endif + // ***************************************************************************** // class DateFormat // ***************************************************************************** @@ -86,14 +90,13 @@ DateFormat::operator==(const Format& other) const // which have confirmed that the other object being compared against is // an instance of a sublcass of DateFormat. THIS IS IMPORTANT. - // We only dereference this pointer after we have confirmed below that - // 'other' is a DateFormat subclass. + // Format::operator== guarantees that this cast is safe DateFormat* fmt = (DateFormat*)&other; return (this == fmt) || - ((getDynamicClassID() == other.getDynamicClassID()) && + (Format::operator==(other) && fCalendar&&(fCalendar->isEquivalentTo(*fmt->fCalendar)) && - (fNumberFormat&&(*fNumberFormat == *fmt->fNumberFormat)) ); + (fNumberFormat && *fNumberFormat == *fmt->fNumberFormat)); } //---------------------------------------------------------------------- @@ -193,7 +196,13 @@ DateFormat::parse(const UnicodeString& text, ParsePosition pos(0); UDate result = parse(text, pos); - if (pos.getIndex() == 0) status = U_ILLEGAL_ARGUMENT_ERROR; + if (pos.getIndex() == 0) { +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d - - failed to parse - err index %d\n" + , __FILE__, __LINE__, pos.getErrorIndex() ); +#endif + status = U_ILLEGAL_ARGUMENT_ERROR; + } return result; } @@ -209,7 +218,7 @@ DateFormat::parseObject(const UnicodeString& source, //---------------------------------------------------------------------- -DateFormat* +DateFormat* U_EXPORT2 DateFormat::createTimeInstance(DateFormat::EStyle style, const Locale& aLocale) { @@ -218,36 +227,36 @@ DateFormat::createTimeInstance(DateFormat::EStyle style, //---------------------------------------------------------------------- -DateFormat* +DateFormat* U_EXPORT2 DateFormat::createDateInstance(DateFormat::EStyle style, const Locale& aLocale) { - // +4 to set the correct index for getting data out of - // LocaleElements. - if(style != kNone) - { - style = (EStyle) (style + kDateOffset); - } - return create(kNone, (EStyle) (style), aLocale); + // +4 to set the correct index for getting data out of + // LocaleElements. + if(style != kNone) + { + style = (EStyle) (style + kDateOffset); + } + return create(kNone, (EStyle) (style), aLocale); } //---------------------------------------------------------------------- -DateFormat* +DateFormat* U_EXPORT2 DateFormat::createDateTimeInstance(EStyle dateStyle, EStyle timeStyle, const Locale& aLocale) { - if(dateStyle != kNone) - { - dateStyle = (EStyle) (dateStyle + kDateOffset); - } - return create(timeStyle, dateStyle, aLocale); + if(dateStyle != kNone) + { + dateStyle = (EStyle) (dateStyle + kDateOffset); + } + return create(timeStyle, dateStyle, aLocale); } //---------------------------------------------------------------------- -DateFormat* +DateFormat* U_EXPORT2 DateFormat::createInstance() { return create(kShort, (EStyle) (kShort + kDateOffset), Locale::getDefault()); @@ -255,7 +264,7 @@ DateFormat::createInstance() //---------------------------------------------------------------------- -DateFormat* +DateFormat* U_EXPORT2 DateFormat::create(EStyle timeStyle, EStyle dateStyle, const Locale& locale) { // Try to create a SimpleDateFormat of the desired style. @@ -279,7 +288,7 @@ DateFormat::create(EStyle timeStyle, EStyle dateStyle, const Locale& locale) //---------------------------------------------------------------------- -const Locale* +const Locale* U_EXPORT2 DateFormat::getAvailableLocales(int32_t& count) { // Get the list of installed locales. diff --git a/icuSources/i18n/dcfmtsym.cpp b/icuSources/i18n/dcfmtsym.cpp index 686dda57..d9b4d484 100644 --- a/icuSources/i18n/dcfmtsym.cpp +++ b/icuSources/i18n/dcfmtsym.cpp @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 1997-2003, International Business Machines Corporation and * +* Copyright (C) 1997-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* * @@ -13,7 +13,7 @@ * 03/18/97 clhuang Implemented with C++ APIs. * 03/27/97 helena Updated to pass the simple test after code review. * 08/26/97 aliu Added currency/intl currency symbol support. -* 07/20/98 stephen Slightly modified initialization of monetarySeparator +* 07/20/98 stephen Slightly modified initialization of monetarySeparator ******************************************************************************** */ @@ -22,10 +22,13 @@ #if !UCONFIG_NO_FORMATTING #include "unicode/dcfmtsym.h" -#include "unicode/resbund.h" +#include "unicode/ures.h" #include "unicode/decimfmt.h" #include "unicode/ucurr.h" #include "unicode/choicfmt.h" +#include "ucurrimp.h" +#include "cstring.h" +#include "locbased.h" // ***************************************************************************** // class DecimalFormatSymbols @@ -33,9 +36,9 @@ U_NAMESPACE_BEGIN -const char DecimalFormatSymbols::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(DecimalFormatSymbols) -const char DecimalFormatSymbols::fgNumberElements[] = "NumberElements"; +static const char gNumberElements[] = "NumberElements"; static const UChar INTL_CURRENCY_SYMBOL_STR[] = {0xa4, 0xa4, 0}; @@ -43,18 +46,20 @@ static const UChar INTL_CURRENCY_SYMBOL_STR[] = {0xa4, 0xa4, 0}; // Initializes this with the decimal format symbols in the default locale. DecimalFormatSymbols::DecimalFormatSymbols(UErrorCode& status) - : UObject() + : UObject(), + locale() { - initialize(Locale::getDefault(), status, TRUE); + initialize(locale, status, TRUE); } // ------------------------------------- // Initializes this with the decimal format symbols in the desired locale. DecimalFormatSymbols::DecimalFormatSymbols(const Locale& loc, UErrorCode& status) - : UObject() + : UObject(), + locale(loc) { - initialize(loc, status); + initialize(locale, status); } // ------------------------------------- @@ -69,11 +74,7 @@ DecimalFormatSymbols::~DecimalFormatSymbols() DecimalFormatSymbols::DecimalFormatSymbols(const DecimalFormatSymbols &source) : UObject(source) { - int i; - for(i = 0; i < (int)kFormatSymbolCount; ++i) { - // fastCopyFrom is safe, see docs on fSymbols - fSymbols[(ENumberFormatSymbol)i].fastCopyFrom(source.fSymbols[(ENumberFormatSymbol)i]); - } + *this = source; } // ------------------------------------- @@ -82,13 +83,14 @@ DecimalFormatSymbols::DecimalFormatSymbols(const DecimalFormatSymbols &source) DecimalFormatSymbols& DecimalFormatSymbols::operator=(const DecimalFormatSymbols& rhs) { - if (this != &rhs) - { - int i; - for(i = 0; i < (int)kFormatSymbolCount; ++i) { + if (this != &rhs) { + for(int32_t i = 0; i < (int32_t)kFormatSymbolCount; ++i) { // fastCopyFrom is safe, see docs on fSymbols fSymbols[(ENumberFormatSymbol)i].fastCopyFrom(rhs.fSymbols[(ENumberFormatSymbol)i]); } + locale = rhs.locale; + uprv_strcpy(validLocale, rhs.validLocale); + uprv_strcpy(actualLocale, rhs.actualLocale); } return *this; } @@ -101,14 +103,14 @@ DecimalFormatSymbols::operator==(const DecimalFormatSymbols& that) const if (this == &that) { return TRUE; } - - int i; - for(i = 0; i < (int)kFormatSymbolCount; ++i) { + for(int32_t i = 0; i < (int32_t)kFormatSymbolCount; ++i) { if(fSymbols[(ENumberFormatSymbol)i] != that.fSymbols[(ENumberFormatSymbol)i]) { return FALSE; } } - return TRUE; + return locale == that.locale && + uprv_strcmp(validLocale, that.validLocale) == 0 && + uprv_strcmp(actualLocale, that.actualLocale) == 0; } // ------------------------------------- @@ -117,11 +119,14 @@ void DecimalFormatSymbols::initialize(const Locale& loc, UErrorCode& status, UBool useLastResortData) { - if (U_FAILURE(status)) return; + *validLocale = *actualLocale = 0; - this->locale = loc; + if (U_FAILURE(status)) + return; - ResourceBundle resource((char *)0, loc, status); + const char* locStr = loc.getName(); + UResourceBundle *resource = ures_open((char *)0, locStr, &status); + UResourceBundle *numberElementsRes = ures_getByKey(resource, gNumberElements, resource, &status); if (U_FAILURE(status)) { // Initializes with last resort data if necessary. @@ -130,89 +135,93 @@ DecimalFormatSymbols::initialize(const Locale& loc, UErrorCode& status, status = U_USING_FALLBACK_WARNING; initialize(); } - return; - } - - // Gets the number element array. - int32_t i = 0; - ResourceBundle numberElementsRes = resource.get(fgNumberElements, status); - int32_t numberElementsLength = numberElementsRes.getSize(); - - // If the array size is too small, something is wrong with the resource - // bundle, returns the failure error code. - if (numberElementsLength < 11) { - status = U_INVALID_FORMAT_ERROR; - return; - } - - UnicodeString numberElements[kFormatSymbolCount]; - for(i = 0; i (int32_t)kFormatSymbolCount) { + /* Warning: Invalid format. Array too large. */ + numberElementsLength = (int32_t)kFormatSymbolCount; + } + // If the array size is too small, something is wrong with the resource + // bundle, returns the failure error code. + if (numberElementsLength != 12 || U_FAILURE(status)) { + status = U_INVALID_FORMAT_ERROR; + } + else { + const UChar *numberElements[kFormatSymbolCount]; + int32_t numberElementsStrLen[kFormatSymbolCount]; + int32_t i = 0; + for(i = 0; i= 12 ? 11 : 0]); + static const int32_t TYPE_MAPPING[][2] = { + {kDecimalSeparatorSymbol, 0}, + {kGroupingSeparatorSymbol, 1}, + {kPatternSeparatorSymbol, 2}, + {kPercentSymbol, 3}, + {kZeroDigitSymbol, 4}, + {kDigitSymbol, 5}, + {kMinusSignSymbol, 6}, + {kExponentialSymbol, 7}, + {kPerMillSymbol, 8}, + {kInfinitySymbol, 9}, + {kNaNSymbol, 10}, + {kPlusSignSymbol, 11}, + {kMonetarySeparatorSymbol, 0} + }; + int32_t idx; + + for (idx = 0; idx < (int32_t)(sizeof(TYPE_MAPPING)/sizeof(TYPE_MAPPING[0])); idx++) { + if (TYPE_MAPPING[idx][1] < numberElementsLength) { + fSymbols[TYPE_MAPPING[idx][0]].setTo(TRUE, numberElements[TYPE_MAPPING[idx][1]], numberElementsStrLen[TYPE_MAPPING[idx][1]]); + } + } // Default values until it's set later on. fSymbols[kCurrencySymbol] = (UChar)0xa4; // 'OX' currency symbol fSymbols[kIntlCurrencySymbol] = INTL_CURRENCY_SYMBOL_STR; + // TODO: read from locale data, if this makes it into CLDR + fSymbols[kSignificantDigitSymbol] = (UChar)0x0040; // '@' significant digit + fSymbols[kPadEscapeSymbol] = (UChar)0x002a; // TODO: '*' Hard coded for now; get from resource later } // initialize with default values @@ -229,8 +238,8 @@ DecimalFormatSymbols::initialize() { fSymbols[kPercentSymbol] = (UChar)0x25; // '%' percent sign fSymbols[kZeroDigitSymbol] = (UChar)0x30; // '0' native 0 digit fSymbols[kDigitSymbol] = (UChar)0x23; // '#' pattern digit - fSymbols[kMinusSignSymbol] = (UChar)0x2d; // '-' minus sign fSymbols[kPlusSignSymbol] = (UChar)0x002b; // '+' plus sign + fSymbols[kMinusSignSymbol] = (UChar)0x2d; // '-' minus sign fSymbols[kCurrencySymbol] = (UChar)0xa4; // 'OX' currency symbol fSymbols[kIntlCurrencySymbol] = INTL_CURRENCY_SYMBOL_STR; fSymbols[kMonetarySeparatorSymbol] = (UChar)0x2e; // '.' monetary decimal separator @@ -239,6 +248,13 @@ DecimalFormatSymbols::initialize() { fSymbols[kPadEscapeSymbol] = (UChar)0x2a; // '*' pad escape symbol fSymbols[kInfinitySymbol] = (UChar)0x221e; // 'oo' infinite fSymbols[kNaNSymbol] = (UChar)0xfffd; // SUB NaN + fSymbols[kSignificantDigitSymbol] = (UChar)0x0040; // '@' significant digit +} + +Locale +DecimalFormatSymbols::getLocale(ULocDataLocaleType type, UErrorCode& status) const { + U_LOCALE_BASED(locBased, *this); + return locBased.getLocale(type, status); } U_NAMESPACE_END diff --git a/icuSources/i18n/decimfmt.cpp b/icuSources/i18n/decimfmt.cpp index 5e1398b6..fcbf2243 100644 --- a/icuSources/i18n/decimfmt.cpp +++ b/icuSources/i18n/decimfmt.cpp @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 1997-2003, International Business Machines Corporation and * +* Copyright (C) 1997-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* * @@ -46,14 +46,17 @@ #include "unicode/ucurr.h" #include "unicode/ustring.h" #include "unicode/dcfmtsym.h" -#include "unicode/resbund.h" +#include "unicode/ures.h" #include "unicode/uchar.h" -#include "uprops.h" +#include "unicode/curramt.h" +#include "ucurrimp.h" +#include "util.h" #include "digitlst.h" #include "cmemory.h" #include "cstring.h" #include "umutex.h" #include "uassert.h" +#include "putilimp.h" U_NAMESPACE_BEGIN @@ -76,35 +79,45 @@ static void debugout(UnicodeString s) { // class DecimalFormat // ***************************************************************************** -const char DecimalFormat::fgClassID = 0; // Value is irrelevant +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(DecimalFormat) // Constants for characters used in programmatic (unlocalized) patterns. -const UChar DecimalFormat::kPatternZeroDigit = 0x0030 /*'0'*/; -const UChar DecimalFormat::kPatternGroupingSeparator = 0x002C /*','*/; -const UChar DecimalFormat::kPatternDecimalSeparator = 0x002E /*'.'*/; -const UChar DecimalFormat::kPatternPerMill = 0x2030; -const UChar DecimalFormat::kPatternPercent = 0x0025 /*'%'*/; -const UChar DecimalFormat::kPatternDigit = 0x0023 /*'#'*/; -const UChar DecimalFormat::kPatternSeparator = 0x003B /*';'*/; -const UChar DecimalFormat::kPatternExponent = 0x0045 /*'E'*/; -const UChar DecimalFormat::kPatternPlus = 0x002B /*'+'*/; -const UChar DecimalFormat::kPatternMinus = 0x002D /*'-'*/; -const UChar DecimalFormat::kPatternPadEscape = 0x002A /*'*'*/; -const UChar DecimalFormat::kCurrencySign = 0x00A4; -const UChar DecimalFormat::kQuote = 0x0027 /*'\''*/; - -//const int8_t DecimalFormat::fgMaxDigit = 9; +#define kPatternZeroDigit ((UChar)0x0030) /*'0'*/ +#define kPatternSignificantDigit ((UChar)0x0040) /*'@'*/ +#define kPatternGroupingSeparator ((UChar)0x002C) /*','*/ +#define kPatternDecimalSeparator ((UChar)0x002E) /*'.'*/ +#define kPatternPerMill ((UChar)0x2030) +#define kPatternPercent ((UChar)0x0025) /*'%'*/ +#define kPatternDigit ((UChar)0x0023) /*'#'*/ +#define kPatternSeparator ((UChar)0x003B) /*';'*/ +#define kPatternExponent ((UChar)0x0045) /*'E'*/ +#define kPatternPlus ((UChar)0x002B) /*'+'*/ +#define kPatternMinus ((UChar)0x002D) /*'-'*/ +#define kPatternPadEscape ((UChar)0x002A) /*'*'*/ +#define kQuote ((UChar)0x0027) /*'\''*/ +/** + * The CURRENCY_SIGN is the standard Unicode symbol for currency. It + * is used in patterns and substitued with either the currency symbol, + * or if it is doubled, with the international currency symbol. If the + * CURRENCY_SIGN is seen in a pattern, then the decimal separator is + * replaced with the monetary decimal separator. + */ +#define kCurrencySign ((UChar)0x00A4) +#define kDefaultPad ((UChar)0x0020) /* */ const int32_t DecimalFormat::kDoubleIntegerDigits = 309; const int32_t DecimalFormat::kDoubleFractionDigits = 340; +const int32_t DecimalFormat::kMaxScientificIntegerDigits = 8; + /** * These are the tags we expect to see in normal resource bundle files associated * with a locale. */ const char DecimalFormat::fgNumberPatterns[]="NumberPatterns"; -static const UChar kDefaultPad = 0x0020; /* */ +inline int32_t _min(int32_t a, int32_t b) { return (aindexOf((UChar)kCurrencySign) >= 0) { + // If it looks like we are going to use a currency pattern + // then do the time consuming lookup. + if (symbolsToAdopt == NULL) { + setCurrencyForLocale(uloc_getDefault(), status); + } else { + setCurrencyForSymbols(); + } } else { - setCurrencyForSymbols(); + setCurrency(NULL, status); } applyPattern(*pattern, FALSE /*not localized*/,parseErr, status); @@ -308,9 +346,10 @@ void DecimalFormat::setCurrencyForLocale(const char* locale, UErrorCode& ec) { // Trap an error in mapping locale to currency. If we can't // map, then don't fail and set the currency to "". UErrorCode ec2 = U_ZERO_ERROR; - c = ucurr_forLocale(locale, &ec2); + UChar c[4]; + ucurr_forLocale(locale, c, 4, &ec2); } - setCurrency(c); + setCurrency(c, ec); } //------------------------------------------------------------------------------ @@ -363,57 +402,61 @@ static void _copy_us_ptr(UnicodeString** pdest, const UnicodeString* source) { DecimalFormat& DecimalFormat::operator=(const DecimalFormat& rhs) { - if(this != &rhs) { - NumberFormat::operator=(rhs); - fPositivePrefix = rhs.fPositivePrefix; - fPositiveSuffix = rhs.fPositiveSuffix; - fNegativePrefix = rhs.fNegativePrefix; - fNegativeSuffix = rhs.fNegativeSuffix; - _copy_us_ptr(&fPosPrefixPattern, rhs.fPosPrefixPattern); - _copy_us_ptr(&fPosSuffixPattern, rhs.fPosSuffixPattern); - _copy_us_ptr(&fNegPrefixPattern, rhs.fNegPrefixPattern); - _copy_us_ptr(&fNegSuffixPattern, rhs.fNegSuffixPattern); - if (rhs.fCurrencyChoice == 0) { - delete fCurrencyChoice; - fCurrencyChoice = 0; - } else { - fCurrencyChoice = (ChoiceFormat*) rhs.fCurrencyChoice->clone(); - } - if(rhs.fRoundingIncrement == NULL) { - delete fRoundingIncrement; - fRoundingIncrement = NULL; - } - else if(fRoundingIncrement == NULL) { - fRoundingIncrement = new DigitList(*rhs.fRoundingIncrement); - } - else { - *fRoundingIncrement = *rhs.fRoundingIncrement; - } - fRoundingDouble = rhs.fRoundingDouble; - fMultiplier = rhs.fMultiplier; - fGroupingSize = rhs.fGroupingSize; - fGroupingSize2 = rhs.fGroupingSize2; - fDecimalSeparatorAlwaysShown = rhs.fDecimalSeparatorAlwaysShown; - if(fSymbols == NULL) - fSymbols = new DecimalFormatSymbols(*rhs.fSymbols); - else - *fSymbols = *rhs.fSymbols; - fUseExponentialNotation = rhs.fUseExponentialNotation; - fExponentSignAlwaysShown = rhs.fExponentSignAlwaysShown; - /*Bertrand A. D. Update 98.03.17*/ - fIsCurrencyFormat = rhs.fIsCurrencyFormat; - /*end of Update*/ - fMinExponentDigits = rhs.fMinExponentDigits; -// if (fDigitList == NULL) -// fDigitList = new DigitList(); + if(this != &rhs) { + NumberFormat::operator=(rhs); + fPositivePrefix = rhs.fPositivePrefix; + fPositiveSuffix = rhs.fPositiveSuffix; + fNegativePrefix = rhs.fNegativePrefix; + fNegativeSuffix = rhs.fNegativeSuffix; + _copy_us_ptr(&fPosPrefixPattern, rhs.fPosPrefixPattern); + _copy_us_ptr(&fPosSuffixPattern, rhs.fPosSuffixPattern); + _copy_us_ptr(&fNegPrefixPattern, rhs.fNegPrefixPattern); + _copy_us_ptr(&fNegSuffixPattern, rhs.fNegSuffixPattern); + if (rhs.fCurrencyChoice == 0) { + delete fCurrencyChoice; + fCurrencyChoice = 0; + } else { + fCurrencyChoice = (ChoiceFormat*) rhs.fCurrencyChoice->clone(); + } + if(rhs.fRoundingIncrement == NULL) { + delete fRoundingIncrement; + fRoundingIncrement = NULL; + } + else if(fRoundingIncrement == NULL) { + fRoundingIncrement = new DigitList(*rhs.fRoundingIncrement); + } + else { + *fRoundingIncrement = *rhs.fRoundingIncrement; + } + fRoundingDouble = rhs.fRoundingDouble; + fMultiplier = rhs.fMultiplier; + fGroupingSize = rhs.fGroupingSize; + fGroupingSize2 = rhs.fGroupingSize2; + fDecimalSeparatorAlwaysShown = rhs.fDecimalSeparatorAlwaysShown; + if(fSymbols == NULL) { + fSymbols = new DecimalFormatSymbols(*rhs.fSymbols); + } else { + *fSymbols = *rhs.fSymbols; + } + fUseExponentialNotation = rhs.fUseExponentialNotation; + fExponentSignAlwaysShown = rhs.fExponentSignAlwaysShown; + /*Bertrand A. D. Update 98.03.17*/ + fIsCurrencyFormat = rhs.fIsCurrencyFormat; + /*end of Update*/ + fMinExponentDigits = rhs.fMinExponentDigits; + // if (fDigitList == NULL) + // fDigitList = new DigitList(); - /* sfb 990629 */ - fFormatWidth = rhs.fFormatWidth; - fPad = rhs.fPad; - fPadPosition = rhs.fPadPosition; - /* end sfb */ - } - return *this; + /* sfb 990629 */ + fFormatWidth = rhs.fFormatWidth; + fPad = rhs.fPad; + fPadPosition = rhs.fPadPosition; + /* end sfb */ + fMinSignificantDigits = rhs.fMinSignificantDigits; + fMaxSignificantDigits = rhs.fMaxSignificantDigits; + fUseSignificantDigits = rhs.fUseSignificantDigits; + } + return *this; } //------------------------------------------------------------------------------ @@ -424,9 +467,7 @@ DecimalFormat::operator==(const Format& that) const if (this == &that) return TRUE; - if (getDynamicClassID() != that.getDynamicClassID()) - return FALSE; - + // NumberFormat::operator== guarantees this cast is safe const DecimalFormat* other = (DecimalFormat*)&that; #ifdef FMT_DEBUG @@ -531,6 +572,7 @@ DecimalFormat::operator==(const Format& that) const if (first) { printf("[ "); first = FALSE; } else { printf(", "); } debug("Symbols !="); } + // TODO Add debug stuff for significant digits here if (!first) { printf(" ]"); } #endif @@ -562,7 +604,11 @@ DecimalFormat::operator==(const Format& that) const fUseExponentialNotation == other->fUseExponentialNotation && (!fUseExponentialNotation || fMinExponentDigits == other->fMinExponentDigits) && - *fSymbols == *(other->fSymbols)); + *fSymbols == *(other->fSymbols) && + fUseSignificantDigits == other->fUseSignificantDigits && + (!fUseSignificantDigits || + (fMinSignificantDigits == other->fMinSignificantDigits && + fMaxSignificantDigits == other->fMaxSignificantDigits))); } //------------------------------------------------------------------------------ @@ -579,6 +625,16 @@ UnicodeString& DecimalFormat::format(int32_t number, UnicodeString& appendTo, FieldPosition& fieldPosition) const +{ + return format((int64_t)number, appendTo, fieldPosition); +} + +//------------------------------------------------------------------------------ + +UnicodeString& +DecimalFormat::format(int64_t number, + UnicodeString& appendTo, + FieldPosition& fieldPosition) const { DigitList digits; @@ -596,19 +652,16 @@ DecimalFormat::format(int32_t number, // check for this before multiplying, and if it happens we use doubles // instead, trading off accuracy for range. if (fRoundingIncrement != NULL - || (fMultiplier != 0 && (number > (INT32_MAX / fMultiplier) - || number < (INT32_MIN / fMultiplier)))) + || (fMultiplier != 0 && (number > (U_INT64_MAX / fMultiplier) + || number < (U_INT64_MIN / fMultiplier)))) { digits.set(((double)number) * fMultiplier, - fUseExponentialNotation ? - getMinimumIntegerDigits() + getMaximumFractionDigits() : 0, - !fUseExponentialNotation); + precision(FALSE), + !fUseExponentialNotation && !areSignificantDigitsUsed()); } else { - digits.set(number * fMultiplier, - fUseExponentialNotation ? - getMinimumIntegerDigits() + getMaximumFractionDigits() : 0); + digits.set(number * fMultiplier, precision(TRUE)); } return subformat(appendTo, fieldPosition, digits, TRUE); @@ -692,10 +745,8 @@ DecimalFormat::format( double number, DigitList digits; // This detects negativity too. - digits.set(number, fUseExponentialNotation ? - getMinimumIntegerDigits() + getMaximumFractionDigits() : - getMaximumFractionDigits(), - !fUseExponentialNotation); + digits.set(number, precision(FALSE), + !fUseExponentialNotation && !areSignificantDigitsUsed()); return subformat(appendTo, fieldPosition, digits, FALSE); } @@ -788,6 +839,7 @@ DecimalFormat::subformat(UnicodeString& appendTo, } else { decimal = &getConstSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol); } + UBool useSigDig = areSignificantDigitsUsed(); int32_t maxIntDig = getMaximumIntegerDigits(); int32_t minIntDig = getMinimumIntegerDigits(); @@ -819,6 +871,23 @@ DecimalFormat::subformat(UnicodeString& appendTo, fieldPosition.setBeginIndex(-1); } + int32_t minFracDig = 0; + if (useSigDig) { + maxIntDig = minIntDig = 1; + minFracDig = getMinimumSignificantDigits() - 1; + } else { + minFracDig = getMinimumFractionDigits(); + if (maxIntDig > kMaxScientificIntegerDigits) { + maxIntDig = 1; + if (maxIntDig < minIntDig) { + maxIntDig = minIntDig; + } + } + if (maxIntDig > minIntDig) { + minIntDig = 1; + } + } + // Minimum integer digits are handled in exponential format by // adjusting the exponent. For example, 0.01234 with 3 minimum // integer digits is "123.4E-4". @@ -839,7 +908,7 @@ DecimalFormat::subformat(UnicodeString& appendTo, } else { // No exponent increment is defined; use minimum integer digits. // If none is specified, as in "#E0", generate 1 integer digit. - exponent -= (minIntDig > 0 || getMinimumFractionDigits() > 0) + exponent -= (minIntDig > 0 || minFracDig > 0) ? minIntDig : 1; } @@ -847,7 +916,7 @@ DecimalFormat::subformat(UnicodeString& appendTo, // are more digits, up to the maximum number of digits. We // place the decimal point after the "integer" digits, which // are the first (decimalAt - exponent) digits. - int32_t minimumDigits = minIntDig + getMinimumFractionDigits(); + int32_t minimumDigits = minIntDig + minFracDig; // The number of integer digits is handled specially if the number // is zero, since then there may be no digits. int32_t integerDigits = digits.isZero() ? minIntDig : @@ -914,8 +983,14 @@ DecimalFormat::subformat(UnicodeString& appendTo, DigitList expDigits; expDigits.set(exponent); - for (i=expDigits.fDecimalAt; i 0 && count < digits.fDecimalAt) + int32_t count = useSigDig ? + _max(1, digits.fDecimalAt) : minIntDig; + if (digits.fDecimalAt > 0 && count < digits.fDecimalAt) { count = digits.fDecimalAt; + } // Handle the case where getMaximumIntegerDigits() is smaller // than the real number of integer digits. If this is so, we // output the least significant max integer digits. For example, // the value 1997 printed with 2 max integer digits is just "97". - if (count > maxIntDig) - { + int32_t digitIndex = 0; // Index into digitList.fDigits[] + if (count > maxIntDig && maxIntDig >= 0) { count = maxIntDig; digitIndex = digits.fDecimalAt - count; } @@ -954,15 +1038,19 @@ DecimalFormat::subformat(UnicodeString& appendTo, int32_t i; for (i=count-1; i>=0; --i) { - if (i < digits.fDecimalAt && digitIndex < digits.fCount) - { + if (i < digits.fDecimalAt && digitIndex < digits.fCount && + sigCount < maxSigDig) { // Output a real digit appendTo += ((UChar32)(digits.fDigits[digitIndex++] + zeroDelta)); + ++sigCount; } else { - // Output a leading zero + // Output a zero (leading or trailing) appendTo += (zero); + if (sigCount > 0) { + ++sigCount; + } } // Output grouping separator if necessary. @@ -977,8 +1065,8 @@ DecimalFormat::subformat(UnicodeString& appendTo, // Determine whether or not there are any printable fractional // digits. If we've used up the digits we know there aren't. - UBool fractionPresent = (getMinimumFractionDigits() > 0) || - (!isInteger && digitIndex < digits.fCount); + UBool fractionPresent = (!isInteger && digitIndex < digits.fCount) || + (useSigDig ? (sigCount < minSigDig) : (getMinimumFractionDigits() > 0)); // If there is no fraction present, and we haven't printed any // integer digits, then print a zero. Otherwise we won't print @@ -994,37 +1082,50 @@ DecimalFormat::subformat(UnicodeString& appendTo, if (fieldPosition.getField() == NumberFormat::kFractionField) fieldPosition.setBeginIndex(appendTo.length()); - int32_t maxFracDigits = getMaximumFractionDigits(); - int32_t negDecimalAt = -digits.fDecimalAt; - for (i=0; i < maxFracDigits; ++i) - { - if (!isInteger && digitIndex < digits.fCount) - { - if (i >= negDecimalAt) - { - // Output a digit - appendTo += ((UChar32)(digits.fDigits[digitIndex++] + zeroDelta)); - } - else - { - // Output leading fractional zeros. These are zeros that come after - // the decimal but before any significant digits. These are only - // output if abs(number being formatted) < 1.0. - appendTo += zero; - } + count = useSigDig ? INT32_MAX : getMaximumFractionDigits(); + if (useSigDig && (sigCount == maxSigDig || + (sigCount >= minSigDig && digitIndex == digits.fCount))) { + count = 0; + } + + for (i=0; i < count; ++i) { + // Here is where we escape from the loop. We escape + // if we've output the maximum fraction digits + // (specified in the for expression above). We also + // stop when we've output the minimum digits and + // either: we have an integer, so there is no + // fractional stuff to display, or we're out of + // significant digits. + if (!useSigDig && i >= getMinimumFractionDigits() && + (isInteger || digitIndex >= digits.fCount)) { + break; } - else - { - // Here is where we escape from the loop. We escape if we've output - // the maximum fraction digits (specified in the for expression above). - // We also stop when we've output the minimum digits and either: - // we have an integer, so there is no fractional stuff to display, - // or we're out of significant digits. - if (i >= getMinimumFractionDigits()) - break; - // No precision is left. + // Output leading fractional zeros. These are zeros + // that come after the decimal but before any + // significant digits. These are only output if + // abs(number being formatted) < 1.0. + if (-1-i > (digits.fDecimalAt-1)) { appendTo += zero; + continue; + } + + // Output a digit, if we have any precision left, or a + // zero if we don't. We don't want to output noise digits. + if (!isInteger && digitIndex < digits.fCount) { + appendTo += ((UChar32)(digits.fDigits[digitIndex++] + zeroDelta)); + } else { + appendTo += zero; + } + + // If we reach the maximum number of significant + // digits, or if we output all the real digits and + // reach the minimum, then we are done. + ++sigCount; + if (useSigDig && + (sigCount == maxSigDig || + (digitIndex == digits.fCount && sigCount >= minSigDig))) { + break; } } @@ -1091,8 +1192,33 @@ DecimalFormat::parse(const UnicodeString& text, void DecimalFormat::parse(const UnicodeString& text, Formattable& result, - ParsePosition& parsePosition) const -{ + ParsePosition& parsePosition) const { + parse(text, result, parsePosition, FALSE); +} + +Formattable& DecimalFormat::parseCurrency(const UnicodeString& text, + Formattable& result, + ParsePosition& pos) const { + parse(text, result, pos, TRUE); + return result; +} + +/** + * Parses the given text as either a number or a currency amount. + * @param text the string to parse + * @param result output parameter for the result + * @param parsePosition input-output position; on input, the + * position within text to match; must have 0 <= pos.getIndex() < + * text.length(); on output, the position after the last matched + * character. If the parse fails, the position in unchanged upon + * output. + * @param parseCurrency if true, a currency amount is parsed; + * otherwise a Number is parsed + */ +void DecimalFormat::parse(const UnicodeString& text, + Formattable& result, + ParsePosition& parsePosition, + UBool parseCurrency) const { int32_t backup; int32_t i = backup = parsePosition.getIndex(); @@ -1123,9 +1249,11 @@ DecimalFormat::parse(const UnicodeString& text, // status is used to record whether a number is infinite. UBool status[fgStatusLength]; + UChar curbuf[4]; + UChar* currency = parseCurrency ? curbuf : NULL; DigitList digits; - if (!subparse(text, parsePosition, digits, status)) { + if (!subparse(text, parsePosition, digits, status, currency)) { parsePosition.setIndex(backup); return; } @@ -1134,40 +1262,54 @@ DecimalFormat::parse(const UnicodeString& text, if (status[fgStatusInfinite]) { double inf = uprv_getInfinity(); result.setDouble(digits.fIsPositive ? inf : -inf); - return; } - // Do as much of the multiplier conversion as possible without - // losing accuracy. - int32_t mult = fMultiplier; // Don't modify this.multiplier - while (mult % 10 == 0) { - mult /= 10; - --digits.fDecimalAt; - } - - // Handle integral values. We want to return the most - // parsimonious type that will accommodate all of the result's - // precision. We therefore only return a long if the result fits - // entirely within a long (taking into account the multiplier) -- - // otherwise we fall through and return a double. When more - // numeric types are supported by Formattable (e.g., 64-bit - // integers, bignums) we will extend this logic to include them. - if (digits.fitsIntoLong(isParseIntegerOnly())) { - int32_t n = digits.getLong(); - if (n % mult == 0) { - result.setLong(n / mult); - return; + else { + // Do as much of the multiplier conversion as possible without + // losing accuracy. + int32_t mult = fMultiplier; // Don't modify this.multiplier + while (mult % 10 == 0) { + mult /= 10; + --digits.fDecimalAt; + } + + // Handle integral values. We want to return the most + // parsimonious type that will accommodate all of the result's + // precision. We therefore only return a long if the result fits + // entirely within a long (taking into account the multiplier) -- + // otherwise we fall through and return a double. When more + // numeric types are supported by Formattable (e.g., 64-bit + // integers, bignums) we will extend this logic to include them. + if (digits.fitsIntoLong(isParseIntegerOnly())) { + int32_t n = digits.getLong(); + if (n % mult == 0) { + result.setLong(n / mult); + } + else { // else handle the remainder + result.setDouble(((double)n) / mult); + } } - else { // else handle the remainder - result.setDouble(((double)n) / mult); - return; + else if (digits.fitsIntoInt64(isParseIntegerOnly())) { + int64_t n = digits.getInt64(); + if (n % mult == 0) { + result.setInt64(n / mult); + } + else { // else handle the remainder + result.setDouble(((double)n) / mult); + } + } + else { + // Handle non-integral or very large values + // Dividing by one is okay and not that costly. + result.setDouble(digits.getDouble() / mult); } } - else { - // Handle non-integral or very large values - // Dividing by one is okay and not that costly. - result.setDouble(digits.getDouble() / mult); - return; + + if (parseCurrency) { + UErrorCode ec = U_ZERO_ERROR; + Formattable n(result); + result.adoptObject(new CurrencyAmount(n, curbuf, ec)); + U_ASSERT(U_SUCCESS(ec)); // should always succeed } } @@ -1176,21 +1318,27 @@ DecimalFormat::parse(const UnicodeString& text, This is an old implimentation that was preparing for 64-bit numbers in ICU. It is very slow, and 64-bit numbers are not ANSI-C compatible. This code is here if we change our minds. + +^^^ what is this referring to? remove? ^^^ [alan] */ + /** * Parse the given text into a number. The text is parsed beginning at * parsePosition, until an unparseable character is seen. - * @param text The string to parse. + * @param text the string to parse. * @param parsePosition The position at which to being parsing. Upon - * return, the first unparseable character. - * @param digits The DigitList to set to the parsed value. - * @param isExponent If true, parse an exponent. This means no - * infinite values and integer only. By default it's really false. - * @param status Upon return contains boolean status flags indicating + * return, the first unparsed character. + * @param digits the DigitList to set to the parsed value. + * @param status output param containing boolean status flags indicating * whether the value was infinite and whether it was positive. + * @param currency return value for parsed currency, for generic + * currency parsing mode, or NULL for normal parsing. In generic + * currency parsing mode, any currency is parsed, not just the + * currency that this formatter is set to. */ UBool DecimalFormat::subparse(const UnicodeString& text, ParsePosition& parsePosition, - DigitList& digits, UBool* status) const + DigitList& digits, UBool* status, + UChar* currency) const { int32_t position = parsePosition.getIndex(); int32_t oldStart = position; @@ -1201,8 +1349,8 @@ UBool DecimalFormat::subparse(const UnicodeString& text, ParsePosition& parsePos } // Match positive and negative prefixes; prefer longest match. - int32_t posMatch = compareAffix(text, position, FALSE, TRUE); - int32_t negMatch = compareAffix(text, position, TRUE, TRUE); + int32_t posMatch = compareAffix(text, position, FALSE, TRUE, currency); + int32_t negMatch = compareAffix(text, position, TRUE, TRUE, currency); if (posMatch >= 0 && negMatch >= 0) { if (posMatch > negMatch) { negMatch = -1; @@ -1249,7 +1397,6 @@ UBool DecimalFormat::subparse(const UnicodeString& text, ParsePosition& parsePos decimal = &getConstSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol); } const UnicodeString *grouping = &getConstSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol); - const UnicodeString *exponentChar = &getConstSymbol(DecimalFormatSymbols::kExponentialSymbol); UBool sawDecimal = FALSE; UBool sawDigit = FALSE; int32_t backup = -1; @@ -1418,10 +1565,10 @@ UBool DecimalFormat::subparse(const UnicodeString& text, ParsePosition& parsePos // Match positive and negative suffixes; prefer longest match. if (posMatch >= 0) { - posMatch = compareAffix(text, position, FALSE, FALSE); + posMatch = compareAffix(text, position, FALSE, FALSE, currency); } if (negMatch >= 0) { - negMatch = compareAffix(text, position, TRUE, FALSE); + negMatch = compareAffix(text, position, TRUE, FALSE, currency); } if (posMatch >= 0 && negMatch >= 0) { if (posMatch > negMatch) { @@ -1479,19 +1626,24 @@ int32_t DecimalFormat::skipPadding(const UnicodeString& text, int32_t position) * @param pos offset into input at which to begin matching * @param isNegative * @param isPrefix + * @param currency return value for parsed currency, for generic + * currency parsing mode, or null for normal parsing. In generic + * currency parsing mode, any currency is parsed, not just the + * currency that this formatter is set to. * @return length of input that matches, or -1 if match failure */ int32_t DecimalFormat::compareAffix(const UnicodeString& text, int32_t pos, UBool isNegative, - UBool isPrefix) const { - if (fCurrencyChoice != NULL) { + UBool isPrefix, + UChar* currency) const { + if (fCurrencyChoice != NULL || currency != NULL) { if (isPrefix) { return compareComplexAffix(isNegative ? *fNegPrefixPattern : *fPosPrefixPattern, - text, pos); + text, pos, currency); } else { return compareComplexAffix(isNegative ? *fNegSuffixPattern : *fPosSuffixPattern, - text, pos); + text, pos, currency); } } @@ -1603,13 +1755,18 @@ int32_t DecimalFormat::skipUWhiteSpace(const UnicodeString& text, int32_t pos) { * @param affixPat pattern string * @param input input text * @param pos offset into input at which to begin matching + * @param currency return value for parsed currency, for generic + * currency parsing mode, or null for normal parsing. In generic + * currency parsing mode, any currency is parsed, not just the + * currency that this formatter is set to. * @return length of input that matches, or -1 if match failure */ int32_t DecimalFormat::compareComplexAffix(const UnicodeString& affixPat, const UnicodeString& text, - int32_t pos) const { - U_ASSERT(fCurrencyChoice != NULL); - U_ASSERT(*getCurrency() != 0); + int32_t pos, + UChar* currency) const { + U_ASSERT(currency != NULL || + (fCurrencyChoice != NULL && *getCurrency() != 0)); for (int32_t i=0; i= 0; ) { UChar32 c = affixPat.char32At(i); @@ -1624,16 +1781,44 @@ int32_t DecimalFormat::compareComplexAffix(const UnicodeString& affixPat, switch (c) { case kCurrencySign: { + // If currency != null, then perform generic currency matching. + // Otherwise, do currency choice parsing. UBool intl = igetLocale().getName(); + ec = U_ZERO_ERROR; + } + // Delegate parse of display name => ISO code to Currency ParsePosition ppos(pos); - Formattable result; - fCurrencyChoice->parse(text, result, ppos); - pos = (ppos.getIndex() == pos) ? -1 : ppos.getIndex(); + UChar curr[4]; + uprv_parseCurrency(loc, text, ppos, curr, ec); + + // If parse succeeds, populate currency[0] + if (U_SUCCESS(ec) && ppos.getIndex() != pos) { + u_strcpy(currency, curr); + pos = ppos.getIndex(); + } else { + pos = -1; + } + } else { + if (intl) { + ++i; + pos = match(text, pos, getCurrency()); + } else { + ParsePosition ppos(pos); + Formattable result; + fCurrencyChoice->parse(text, result, ppos); + pos = (ppos.getIndex() == pos) ? -1 : ppos.getIndex(); + } } continue; } @@ -1720,11 +1905,24 @@ DecimalFormat::getDecimalFormatSymbols() const void DecimalFormat::adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt) { - if (fSymbols != NULL) + if (symbolsToAdopt == NULL) { + return; // do not allow caller to set fSymbols to NULL + } + + UBool sameSymbols = FALSE; + if (fSymbols != NULL) { + sameSymbols = (UBool)(getConstSymbol(DecimalFormatSymbols::kCurrencySymbol) == + symbolsToAdopt->getConstSymbol(DecimalFormatSymbols::kCurrencySymbol) && + getConstSymbol(DecimalFormatSymbols::kIntlCurrencySymbol) == + symbolsToAdopt->getConstSymbol(DecimalFormatSymbols::kIntlCurrencySymbol)); delete fSymbols; + } fSymbols = symbolsToAdopt; - setCurrencyForSymbols(); + if (!sameSymbols) { + // If the currency symbols are the same, there is no need to recalculate. + setCurrencyForSymbols(); + } expandAffixes(); } //------------------------------------------------------------------------------ @@ -1757,17 +1955,23 @@ DecimalFormat::setCurrencyForSymbols() { // currency object to one for that locale. If it is custom, // we set the currency to null. UErrorCode ec = U_ZERO_ERROR; - DecimalFormatSymbols def(fSymbols->getLocale(), ec); - - if (getConstSymbol(DecimalFormatSymbols::kCurrencySymbol) == - def.getConstSymbol(DecimalFormatSymbols::kCurrencySymbol) && - getConstSymbol(DecimalFormatSymbols::kIntlCurrencySymbol) == - def.getConstSymbol(DecimalFormatSymbols::kIntlCurrencySymbol) - ) { - setCurrencyForLocale(fSymbols->getLocale().getName(), ec); - } else { - setCurrency(NULL); // Use DFS currency info + const UChar* c = NULL; + const char* loc = fSymbols->getLocale().getName(); + UChar intlCurrencySymbol[4]; + ucurr_forLocale(loc, intlCurrencySymbol, 4, &ec); + UnicodeString currencySymbol; + + uprv_getStaticCurrencyName(intlCurrencySymbol, loc, currencySymbol, ec); + if (U_SUCCESS(ec) + && getConstSymbol(DecimalFormatSymbols::kCurrencySymbol) == currencySymbol + && getConstSymbol(DecimalFormatSymbols::kIntlCurrencySymbol) == intlCurrencySymbol) + { + // Trap an error in mapping locale to currency. If we can't + // map, then don't fail and set the currency to "". + c = intlCurrencySymbol; } + ec = U_ZERO_ERROR; // reset local error code! + setCurrency(c, ec); } @@ -1882,7 +2086,7 @@ DecimalFormat::setMultiplier(int32_t newValue) * @see #getRoundingMode * @see #setRoundingMode */ -double DecimalFormat::getRoundingIncrement() { +double DecimalFormat::getRoundingIncrement() const { return fRoundingDouble; } @@ -1916,7 +2120,7 @@ void DecimalFormat::setRoundingIncrement(double newValue) { * @see #getRoundingIncrement * @see #setRoundingMode */ -DecimalFormat::ERoundingMode DecimalFormat::getRoundingMode() { +DecimalFormat::ERoundingMode DecimalFormat::getRoundingMode() const { return fRoundingMode; } @@ -1941,7 +2145,7 @@ void DecimalFormat::setRoundingMode(ERoundingMode roundingMode) { * @see #getPadPosition * @see #setPadPosition */ -int32_t DecimalFormat::getFormatWidth() { +int32_t DecimalFormat::getFormatWidth() const { return fFormatWidth; } @@ -1961,29 +2165,10 @@ void DecimalFormat::setFormatWidth(int32_t width) { fFormatWidth = (width > 0) ? width : 0; } -/** - * Get the character used to pad to the format width. The default is ' '. - * @return the pad character - * @see #setFormatWidth - * @see #getFormatWidth - * @see #setPadCharacter - * @see #getPadPosition - * @see #setPadPosition - */ -UnicodeString DecimalFormat::getPadCharacterString() { +UnicodeString DecimalFormat::getPadCharacterString() const { return fPad; } -/** - * Set the character used to pad to the format width. This has no effect - * unless padding is enabled. - * @param padChar the pad character - * @see #setFormatWidth - * @see #getFormatWidth - * @see #getPadCharacter - * @see #getPadPosition - * @see #setPadPosition - */ void DecimalFormat::setPadCharacter(const UnicodeString &padChar) { if (padChar.length() > 0) { fPad = padChar.char32At(0); @@ -2010,7 +2195,7 @@ void DecimalFormat::setPadCharacter(const UnicodeString &padChar) { * @see #kPadBeforeSuffix * @see #kPadAfterSuffix */ -DecimalFormat::EPadPosition DecimalFormat::getPadPosition() { +DecimalFormat::EPadPosition DecimalFormat::getPadPosition() const { return fPadPosition; } @@ -2062,9 +2247,6 @@ UBool DecimalFormat::isScientificNotation() { */ void DecimalFormat::setScientificNotation(UBool useScientific) { fUseExponentialNotation = useScientific; - if (fUseExponentialNotation && fMinExponentDigits < 1) { - fMinExponentDigits = 1; - } } /** @@ -2076,7 +2258,7 @@ void DecimalFormat::setScientificNotation(UBool useScientific) { * @see #isExponentSignAlwaysShown * @see #setExponentSignAlwaysShown */ -int8_t DecimalFormat::getMinimumExponentDigits() { +int8_t DecimalFormat::getMinimumExponentDigits() const { return fMinExponentDigits; } @@ -2541,18 +2723,22 @@ UnicodeString& DecimalFormat::toPattern(UnicodeString& result, UBool localized) const { result.remove(); - UChar32 zero; + UChar32 zero, sigDigit = kPatternSignificantDigit; UnicodeString digit, group; int32_t i; int32_t roundingDecimalPos = 0; // Pos of decimal in roundingDigits UnicodeString roundingDigits; int32_t padPos = (fFormatWidth > 0) ? fPadPosition : -1; UnicodeString padSpec; + UBool useSigDig = areSignificantDigitsUsed(); if (localized) { digit.append(getConstSymbol(DecimalFormatSymbols::kDigitSymbol)); group.append(getConstSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol)); zero = getConstSymbol(DecimalFormatSymbols::kZeroDigitSymbol).char32At(0); + if (useSigDig) { + sigDigit = getConstSymbol(DecimalFormatSymbols::kSignificantDigitSymbol).char32At(0); + } } else { digit.append((UChar)kPatternDigit); @@ -2586,57 +2772,85 @@ DecimalFormat::toPattern(UnicodeString& result, UBool localized) const result.append(padSpec); } int32_t sub0Start = result.length(); - int32_t g = isGroupingUsed() ? uprv_max(0, fGroupingSize) : 0; + int32_t g = isGroupingUsed() ? _max(0, fGroupingSize) : 0; if (g > 0 && fGroupingSize2 > 0 && fGroupingSize2 != fGroupingSize) { g += fGroupingSize2; } - int32_t maxIntDig = fUseExponentialNotation ? getMaximumIntegerDigits() : - (uprv_max(uprv_max(g, getMinimumIntegerDigits()), - roundingDecimalPos) + 1); - for (i = maxIntDig; i > 0; --i) { - if (!fUseExponentialNotation && i kMaxScientificIntegerDigits) { + maxDig = 1; + } + } else if (useSigDig) { + maxDig = _max(maxDig, g+1); + } else { + maxDig = _max(_max(g, getMinimumIntegerDigits()), + roundingDecimalPos) + 1; + } + for (i = maxDig; i > 0; --i) { + if (!fUseExponentialNotation && i= 0 && pos < roundingDigits.length()) { - result.append((UChar) (roundingDigits.char32At(pos) - kPatternZeroDigit + zero)); - continue; + if (useSigDig) { + // #@,@### (maxSigDig == 5, minSigDig == 2) + // 65 4321 (1-based pos, count from the right) + // Use # if pos > maxSigDig or 1 <= pos <= (maxSigDig - minSigDig) + // Use @ if (maxSigDig - minSigDig) < pos <= maxSigDig + if (maxSigDig >= i && i > (maxSigDig - minDig)) { + result.append(sigDigit); + } else { + result.append(digit); + } + } else { + if (! roundingDigits.isEmpty()) { + int32_t pos = roundingDecimalPos - i; + if (pos >= 0 && pos < roundingDigits.length()) { + result.append((UChar) (roundingDigits.char32At(pos) - kPatternZeroDigit + zero)); + continue; + } + } + if (i<=minDig) { + result.append(zero); + } else { + result.append(digit); } - } - if (i<=getMinimumIntegerDigits()) { - result.append(zero); - } - else { - result.append(digit); } } - if (getMaximumFractionDigits() > 0 || fDecimalSeparatorAlwaysShown) { - if (localized) { - result += getConstSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol); - } - else { - result.append((UChar)kPatternDecimalSeparator); + if (!useSigDig) { + if (getMaximumFractionDigits() > 0 || fDecimalSeparatorAlwaysShown) { + if (localized) { + result += getConstSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol); + } + else { + result.append((UChar)kPatternDecimalSeparator); + } } - } - int32_t pos = roundingDecimalPos; - for (i = 0; i < getMaximumFractionDigits(); ++i) { - if (! roundingDigits.isEmpty() && pos < roundingDigits.length()) { - if (pos < 0) { + int32_t pos = roundingDecimalPos; + for (i = 0; i < getMaximumFractionDigits(); ++i) { + if (! roundingDigits.isEmpty() && pos < roundingDigits.length()) { + if (pos < 0) { + result.append(zero); + } + else { + result.append((UChar)(roundingDigits.char32At(pos) - kPatternZeroDigit + zero)); + } + ++pos; + continue; + } + if (i 0) { result.insert(sub0Start, digit); - ++maxIntDig; + ++maxDig; --add; // Only add a grouping separator if we have at least // 2 additional characters to be added, so we don't // end up with ",###". - if (add>1 && isGroupingPosition(maxIntDig)) { + if (add>1 && isGroupingPosition(maxDig)) { result.insert(sub0Start, group); --add; } @@ -2782,12 +2996,13 @@ DecimalFormat::applyPattern(const UnicodeString& pattern, parseError.preContext[0] = parseError.postContext[0] = (UChar)0; // Set the significant pattern symbols - UChar32 zeroDigit = kPatternZeroDigit; + UChar32 zeroDigit = kPatternZeroDigit; // '0' + UChar32 sigDigit = kPatternSignificantDigit; // '@' UnicodeString groupingSeparator ((UChar)kPatternGroupingSeparator); UnicodeString decimalSeparator ((UChar)kPatternDecimalSeparator); UnicodeString percent ((UChar)kPatternPercent); UnicodeString perMill ((UChar)kPatternPerMill); - UnicodeString digit ((UChar)kPatternDigit); + UnicodeString digit ((UChar)kPatternDigit); // '#' UnicodeString separator ((UChar)kPatternSeparator); UnicodeString exponent ((UChar)kPatternExponent); UnicodeString plus ((UChar)kPatternPlus); @@ -2796,6 +3011,7 @@ DecimalFormat::applyPattern(const UnicodeString& pattern, // Substitute with the localized symbols if necessary if (localized) { zeroDigit = getConstSymbol(DecimalFormatSymbols::kZeroDigitSymbol).char32At(0); + sigDigit = getConstSymbol(DecimalFormatSymbols::kSignificantDigitSymbol).char32At(0); groupingSeparator. remove().append(getConstSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol)); decimalSeparator. remove().append(getConstSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol)); percent. remove().append(getConstSymbol(DecimalFormatSymbols::kPercentSymbol)); @@ -2834,11 +3050,11 @@ DecimalFormat::applyPattern(const UnicodeString& pattern, UnicodeString suffix; int32_t decimalPos = -1; int32_t multiplier = 1; - int32_t digitLeftCount = 0, zeroDigitCount = 0, digitRightCount = 0; + int32_t digitLeftCount = 0, zeroDigitCount = 0, digitRightCount = 0, sigDigitCount = 0; int8_t groupingCount = -1; int8_t groupingCount2 = -1; int32_t padPos = -1; - UChar32 padChar; + UChar32 padChar = 0; int32_t roundingPos = -1; DigitList roundingInc; int8_t expDigits = -1; @@ -2852,7 +3068,7 @@ DecimalFormat::applyPattern(const UnicodeString& pattern, UBool isPartDone = FALSE; UChar32 ch; - for (; !isPartDone && pos < patLen; pos += UTF_NEED_MULTIPLE_UCHAR(ch)) { + for (; !isPartDone && pos < patLen; ) { // Todo: account for surrogate pairs ch = pattern.char32At(pos); switch (subpart) { @@ -2867,7 +3083,7 @@ DecimalFormat::applyPattern(const UnicodeString& pattern, // if any (should be in the zero digits). If there is no // decimal point, then there should be no right digits. if (pattern.compare(pos, digitLen, digit) == 0) { - if (zeroDigitCount > 0) { + if (zeroDigitCount > 0 || sigDigitCount > 0) { ++digitRightCount; } else { ++digitLeftCount; @@ -2876,7 +3092,8 @@ DecimalFormat::applyPattern(const UnicodeString& pattern, ++groupingCount; } pos += digitLen; - } else if (ch >= zeroDigit && ch <= nineDigit) { + } else if ((ch >= zeroDigit && ch <= nineDigit) || + ch == sigDigit) { if (digitRightCount > 0) { // Unexpected '0' debug("Unexpected '0'") @@ -2884,17 +3101,21 @@ DecimalFormat::applyPattern(const UnicodeString& pattern, syntaxError(pattern,pos,parseError); return; } - ++zeroDigitCount; + if (ch == sigDigit) { + ++sigDigitCount; + } else { + ++zeroDigitCount; + if (ch != zeroDigit && roundingPos < 0) { + roundingPos = digitLeftCount + zeroDigitCount; + } + if (roundingPos >= 0) { + roundingInc.append((char)(ch - zeroDigit + '0')); + } + } if (groupingCount >= 0 && decimalPos < 0) { ++groupingCount; } - if (ch != zeroDigit && roundingPos < 0) { - roundingPos = digitLeftCount + zeroDigitCount; - } - if (roundingPos >= 0) { - roundingInc.append((char)(ch - zeroDigit + '0')); - } - pos++; + pos += U16_LENGTH(ch); } else if (pattern.compare(pos, groupSepLen, groupingSeparator) == 0) { if (decimalPos >= 0) { // Grouping separator after decimal @@ -2935,24 +3156,28 @@ DecimalFormat::applyPattern(const UnicodeString& pattern, syntaxError(pattern,pos,parseError); return; } + pos += exponent.length(); // Check for positive prefix - if ((pos+1) < patLen - && pattern.compare((int32_t) (pos+1), plus.length(), plus) == 0) - { + if (pos < patLen + && pattern.compare(pos, plus.length(), plus) == 0) { expSignAlways = TRUE; pos += plus.length(); } // Use lookahead to parse out the exponential part of the // pattern, then jump into suffix subpart. expDigits = 0; - pos += exponent.length() - 1; - while (++pos < patLen && - pattern[(int32_t) pos] == zeroDigit) - { + while (pos < patLen && + pattern.char32At(pos) == zeroDigit) { ++expDigits; + pos += U16_LENGTH(zeroDigit); } - if ((digitLeftCount + zeroDigitCount) < 1 || + // 1. Require at least one mantissa pattern digit + // 2. Disallow "#+ @" in mantissa + // 3. Require at least one exponent pattern digit + if (((digitLeftCount + zeroDigitCount) < 1 && + (sigDigitCount + digitRightCount) < 1) || + (sigDigitCount > 0 && digitLeftCount > 0) || expDigits < 1) { // Malformed exponential pattern debug("Malformed exponential pattern") @@ -2973,53 +3198,30 @@ DecimalFormat::applyPattern(const UnicodeString& pattern, // Process the prefix / suffix characters // Process unquoted characters seen in prefix or suffix // subpart. - if (pattern.compare(pos, digitLen, digit) == 0) { - // Any of these characters implicitly begins the - // next subpart if we are in the prefix - if (subpart == 1) { // prefix subpart - subpart = 0; // pattern proper subpart - sub0Start = pos; // Reprocess this character - continue; - } - pos += digitLen; - // Fall through to append(ch) - } else if (pattern.compare(pos, groupSepLen, groupingSeparator) == 0) { - // Any of these characters implicitly begins the - // next subpart if we are in the prefix - if (subpart == 1) { // prefix subpart - subpart = 0; // pattern proper subpart - sub0Start = pos; // Reprocess this character - continue; - } - pos += groupSepLen; - // Fall through to append(ch) - } else if (pattern.compare(pos, decimalSepLen, decimalSeparator) == 0) { - // Any of these characters implicitly begins the - // next subpart if we are in the prefix - if (subpart == 1) { // prefix subpart - subpart = 0; // pattern proper subpart - sub0Start = pos; // Reprocess this character - continue; - } - pos += decimalSepLen; - // Fall through to append(ch) - } else if (ch >= zeroDigit && ch <= nineDigit) { - // Any of these characters implicitly begins the - // next subpart if we are in the prefix + + // Several syntax characters implicitly begins the + // next subpart if we are in the prefix; otherwise + // they are illegal if unquoted. + if (!pattern.compare(pos, digitLen, digit) || + !pattern.compare(pos, groupSepLen, groupingSeparator) || + !pattern.compare(pos, decimalSepLen, decimalSeparator) || + (ch >= zeroDigit && ch <= nineDigit) || + ch == sigDigit) { if (subpart == 1) { // prefix subpart subpart = 0; // pattern proper subpart sub0Start = pos; // Reprocess this character continue; + } else { + status = U_UNQUOTED_SPECIAL; + syntaxError(pattern,pos,parseError); + return; } - pos++; - // Fall through to append(ch) } else if (ch == kCurrencySign) { + affix->append(kQuote); // Encode currency // Use lookahead to determine if the currency sign is // doubled or not. - pos++; - affix->append(kQuote); // Encode currency - if (pos < pattern.length() && pattern[pos] == kCurrencySign) - { + U_ASSERT(U16_LENGTH(kCurrencySign) == 1); + if ((pos+1) < pattern.length() && pattern[pos+1] == kCurrencySign) { affix->append(kCurrencySign); ++pos; // Skip over the doubled character } @@ -3029,10 +3231,10 @@ DecimalFormat::applyPattern(const UnicodeString& pattern, // A quote outside quotes indicates either the opening // quote or two quotes, which is a quote literal. That is, // we have the first quote in 'do' or o''clock. + U_ASSERT(U16_LENGTH(kQuote) == 1); ++pos; if (pos < pattern.length() && pattern[pos] == kQuote) { affix->append(kQuote); // Encode quote - ++pos; // Fall through to append(ch) } else { subpart += 2; // open quote @@ -3062,10 +3264,10 @@ DecimalFormat::applyPattern(const UnicodeString& pattern, return; } affix->append(kQuote); // Encode percent/perMill + affix->append(kPatternPercent); // Use unlocalized pattern char multiplier = 100; - ch = kPatternPercent; // Use unlocalized pattern char pos += percent.length(); - // Fall through to append(ch) + break; } else if (pattern.compare(pos, perMill.length(), perMill) == 0) { // Next handle characters which are appended directly. if (multiplier != 1) { @@ -3076,10 +3278,10 @@ DecimalFormat::applyPattern(const UnicodeString& pattern, return; } affix->append(kQuote); // Encode percent/perMill + affix->append(kPatternPerMill); // Use unlocalized pattern char multiplier = 1000; - ch = kPatternPerMill; // Use unlocalized pattern char pos += perMill.length(); - // Fall through to append(ch) + break; } else if (pattern.compare(pos, padEscape.length(), padEscape) == 0) { if (padPos >= 0 || // Multiple pad specifiers (pos+1) == pattern.length()) { // Nothing after padEscape @@ -3092,34 +3294,32 @@ DecimalFormat::applyPattern(const UnicodeString& pattern, pos += padEscape.length(); padChar = pattern.char32At(pos); pos += U16_LENGTH(padChar); - continue; + break; } else if (pattern.compare(pos, minus.length(), minus) == 0) { affix->append(kQuote); // Encode minus - ch = kPatternMinus; + affix->append(kPatternMinus); pos += minus.length(); - // Fall through to append(ch) + break; } else if (pattern.compare(pos, plus.length(), plus) == 0) { affix->append(kQuote); // Encode plus - ch = kPatternPlus; + affix->append(kPatternPlus); pos += plus.length(); - // Fall through to append(ch) - } else { - pos++; + break; } // Unquoted, non-special characters fall through to here, as // well as other code which needs to append something to the // affix. affix->append(ch); + pos += U16_LENGTH(ch); break; case 3: // Prefix subpart, in quote case 4: // Suffix subpart, in quote // A quote within quotes indicates either the closing // quote or two quotes, which is a quote literal. That is, // we have the second quote in 'do' or 'don''t'. - pos++; if (ch == kQuote) { + ++pos; if (pos < pattern.length() && pattern[pos] == kQuote) { - ++pos; affix->append(kQuote); // Encode quote // Fall through to append(ch) } else { @@ -3128,6 +3328,7 @@ DecimalFormat::applyPattern(const UnicodeString& pattern, } } affix->append(ch); + pos += U16_LENGTH(ch); break; } } @@ -3153,7 +3354,8 @@ DecimalFormat::applyPattern(const UnicodeString& pattern, * "#" to become "#0" when toPattern() is called (even though that's * what it really is, semantically). */ - if (zeroDigitCount == 0 && digitLeftCount > 0 && decimalPos >= 0) { + if (zeroDigitCount == 0 && sigDigitCount == 0 && + digitLeftCount > 0 && decimalPos >= 0) { // Handle "###.###" and "###." and ".###" int n = decimalPos; if (n == 0) @@ -3164,11 +3366,13 @@ DecimalFormat::applyPattern(const UnicodeString& pattern, } // Do syntax checking on the digits, decimal points, and quotes. - if ((decimalPos < 0 && digitRightCount > 0) || + if ((decimalPos < 0 && digitRightCount > 0 && sigDigitCount == 0) || (decimalPos >= 0 && - (decimalPos < digitLeftCount || + (sigDigitCount > 0 || + decimalPos < digitLeftCount || decimalPos > (digitLeftCount + zeroDigitCount))) || groupingCount == 0 || groupingCount2 == 0 || + (sigDigitCount > 0 && zeroDigitCount > 0) || subpart > 2) { // subpart > 2 == unmatched quote debug("Syntax error") @@ -3223,20 +3427,28 @@ DecimalFormat::applyPattern(const UnicodeString& pattern, } fExponentSignAlwaysShown = expSignAlways; fIsCurrencyFormat = isCurrency; - int digitTotalCount = digitLeftCount + zeroDigitCount + digitRightCount; + int32_t digitTotalCount = digitLeftCount + zeroDigitCount + digitRightCount; // The effectiveDecimalPos is the position the decimal is at or // would be at if there is no decimal. Note that if // decimalPos<0, then digitTotalCount == digitLeftCount + // zeroDigitCount. - int effectiveDecimalPos = decimalPos >= 0 ? decimalPos : digitTotalCount; - setMinimumIntegerDigits(effectiveDecimalPos - digitLeftCount); - setMaximumIntegerDigits(fUseExponentialNotation + int32_t effectiveDecimalPos = decimalPos >= 0 ? decimalPos : digitTotalCount; + UBool isSigDig = (sigDigitCount > 0); + setSignificantDigitsUsed(isSigDig); + if (isSigDig) { + setMinimumSignificantDigits(sigDigitCount); + setMaximumSignificantDigits(sigDigitCount + digitRightCount); + } else { + int32_t minInt = effectiveDecimalPos - digitLeftCount; + setMinimumIntegerDigits(minInt); + setMaximumIntegerDigits(fUseExponentialNotation ? digitLeftCount + getMinimumIntegerDigits() : kDoubleIntegerDigits); - setMaximumFractionDigits(decimalPos >= 0 + setMaximumFractionDigits(decimalPos >= 0 ? (digitTotalCount - decimalPos) : 0); - setMinimumFractionDigits(decimalPos >= 0 + setMinimumFractionDigits(decimalPos >= 0 ? (digitLeftCount + zeroDigitCount - decimalPos) : 0); + } setGroupingUsed(groupingCount > 0); fGroupingSize = (groupingCount > 0) ? groupingCount : 0; fGroupingSize2 = (groupingCount2 > 0 && groupingCount2 != groupingCount) @@ -3373,7 +3585,7 @@ DecimalFormat::applyPattern(const UnicodeString& pattern, * @see NumberFormat#setMaximumIntegerDigits */ void DecimalFormat::setMaximumIntegerDigits(int32_t newValue) { - NumberFormat::setMaximumIntegerDigits(uprv_min(newValue, kDoubleIntegerDigits)); + NumberFormat::setMaximumIntegerDigits(_min(newValue, kDoubleIntegerDigits)); } /** @@ -3382,7 +3594,7 @@ void DecimalFormat::setMaximumIntegerDigits(int32_t newValue) { * @see NumberFormat#setMinimumIntegerDigits */ void DecimalFormat::setMinimumIntegerDigits(int32_t newValue) { - NumberFormat::setMinimumIntegerDigits(uprv_min(newValue, kDoubleIntegerDigits)); + NumberFormat::setMinimumIntegerDigits(_min(newValue, kDoubleIntegerDigits)); } /** @@ -3391,7 +3603,7 @@ void DecimalFormat::setMinimumIntegerDigits(int32_t newValue) { * @see NumberFormat#setMaximumFractionDigits */ void DecimalFormat::setMaximumFractionDigits(int32_t newValue) { - NumberFormat::setMaximumFractionDigits(uprv_min(newValue, kDoubleFractionDigits)); + NumberFormat::setMaximumFractionDigits(_min(newValue, kDoubleFractionDigits)); } /** @@ -3400,40 +3612,112 @@ void DecimalFormat::setMaximumFractionDigits(int32_t newValue) { * @see NumberFormat#setMinimumFractionDigits */ void DecimalFormat::setMinimumFractionDigits(int32_t newValue) { - NumberFormat::setMinimumFractionDigits(uprv_min(newValue, kDoubleFractionDigits)); + NumberFormat::setMinimumFractionDigits(_min(newValue, kDoubleFractionDigits)); } -/** - * Sets the Currency object used to display currency - * amounts. This takes effect immediately, if this format is a - * currency format. If this format is not a currency format, then - * the currency object is used if and when this object becomes a - * currency format through the application of a new pattern. - * @param theCurrency new currency object to use. Must not be - * null. - * @since ICU 2.2 - */ -void DecimalFormat::setCurrency(const UChar* theCurrency) { +int32_t DecimalFormat::getMinimumSignificantDigits() const { + return fMinSignificantDigits; +} + +int32_t DecimalFormat::getMaximumSignificantDigits() const { + return fMaxSignificantDigits; +} + +void DecimalFormat::setMinimumSignificantDigits(int32_t min) { + if (min < 1) { + min = 1; + } + // pin max sig dig to >= min + int32_t max = _max(fMaxSignificantDigits, min); + fMinSignificantDigits = min; + fMaxSignificantDigits = max; +} + +void DecimalFormat::setMaximumSignificantDigits(int32_t max) { + if (max < 1) { + max = 1; + } + // pin min sig dig to 1..max + U_ASSERT(fMinSignificantDigits >= 1); + int32_t min = _min(fMinSignificantDigits, max); + fMinSignificantDigits = min; + fMaxSignificantDigits = max; +} + +UBool DecimalFormat::areSignificantDigitsUsed() const { + return fUseSignificantDigits; +} + +void DecimalFormat::setSignificantDigitsUsed(UBool useSignificantDigits) { + fUseSignificantDigits = useSignificantDigits; +} + +void DecimalFormat::setCurrency(const UChar* theCurrency, UErrorCode& ec) { // If we are a currency format, then modify our affixes to // encode the currency symbol for the given currency in our // locale, and adjust the decimal digits and rounding for the // given currency. - NumberFormat::setCurrency(theCurrency); + // Note: The code is ordered so that this object is *not changed* + // until we are sure we are going to succeed. + + // NULL or empty currency is *legal* and indicates no currency. + UBool isCurr = (theCurrency && *theCurrency); + + double rounding = 0.0; + int32_t frac = 0; + if (fIsCurrencyFormat && isCurr) { + rounding = ucurr_getRoundingIncrement(theCurrency, &ec); + frac = ucurr_getDefaultFractionDigits(theCurrency, &ec); + } + + NumberFormat::setCurrency(theCurrency, ec); + if (U_FAILURE(ec)) return; if (fIsCurrencyFormat) { - if (theCurrency && *theCurrency) { - setRoundingIncrement(ucurr_getRoundingIncrement(theCurrency)); - - int32_t d = ucurr_getDefaultFractionDigits(theCurrency); - setMinimumFractionDigits(d); - setMaximumFractionDigits(d); + // NULL or empty currency is *legal* and indicates no currency. + if (isCurr) { + setRoundingIncrement(rounding); + setMinimumFractionDigits(frac); + setMaximumFractionDigits(frac); } - expandAffixes(); } } +// Deprecated variant with no UErrorCode parameter +void DecimalFormat::setCurrency(const UChar* theCurrency) { + UErrorCode ec = U_ZERO_ERROR; + setCurrency(theCurrency, ec); +} + +void DecimalFormat::getEffectiveCurrency(UChar* result, UErrorCode& /*ec*/) const { + const UChar* c = getCurrency(); + if (*c == 0) { + const UnicodeString &intl = + fSymbols->getConstSymbol(DecimalFormatSymbols::kIntlCurrencySymbol); + c = intl.getBuffer(); // ok for intl to go out of scope + } + u_strncpy(result, c, 3); + result[3] = 0; +} + +/** + * Return the number of fraction digits to display, or the total + * number of digits for significant digit formats and exponential + * formats. + */ +int32_t +DecimalFormat::precision(UBool isIntegral) const { + if (areSignificantDigitsUsed()) { + return getMaximumSignificantDigits(); + } else if (fUseExponentialNotation) { + return getMinimumIntegerDigits() + getMaximumFractionDigits(); + } else { + return isIntegral ? 0 : getMaximumFractionDigits(); + } +} + U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/common/digitlst.cpp b/icuSources/i18n/digitlst.cpp similarity index 78% rename from icuSources/common/digitlst.cpp rename to icuSources/i18n/digitlst.cpp index df529033..2ec5a147 100644 --- a/icuSources/common/digitlst.cpp +++ b/icuSources/i18n/digitlst.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1997-2001, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -26,6 +26,8 @@ #include "unicode/putil.h" #include "digitlst.h" +#include "cstring.h" +#include "putilimp.h" #include #include #include @@ -47,9 +49,13 @@ static char gDecimal = 0; /* Only for 32 bit numbers. Ignore the negative sign. */ static const char LONG_MIN_REP[] = "2147483648"; +static const char I64_MIN_REP[] = "9223372036854775808"; + +static const int64_t I64_MIN_VALUE = U_INT64_MIN; enum { - LONG_MIN_REP_LENGTH = sizeof(LONG_MIN_REP) - 1 //Ignore the NULL at the end + LONG_MIN_REP_LENGTH = sizeof(LONG_MIN_REP) - 1, //Ignore the NULL at the end + I64_MIN_REP_LENGTH = sizeof(I64_MIN_REP) - 1 //Ignore the NULL at the end }; U_NAMESPACE_BEGIN @@ -60,6 +66,7 @@ U_NAMESPACE_BEGIN DigitList::DigitList() { + fDigits = fDecimalDigits + 1; // skip the decimal clear(); } @@ -89,7 +96,7 @@ DigitList::operator=(const DigitList& other) fDecimalAt = other.fDecimalAt; fCount = other.fCount; fIsPositive = other.fIsPositive; - strncpy(fDigits, other.fDigits, fCount); + uprv_strncpy(fDigits, other.fDigits, fCount); } return *this; } @@ -103,7 +110,7 @@ DigitList::operator==(const DigitList& that) const (fDecimalAt == that.fDecimalAt && fCount == that.fCount && fIsPositive == that.fIsPositive && - strncmp(fDigits, that.fDigits, fCount) == 0)); + uprv_strncmp(fDigits, that.fDigits, fCount) == 0)); } // ------------------------------------- @@ -112,7 +119,6 @@ DigitList::operator==(const DigitList& that) const void DigitList::clear() { - fDigits = fDecimalDigits + 1; // skip the decimal fDecimalAt = 0; fCount = 0; fIsPositive = TRUE; @@ -133,10 +139,11 @@ DigitList::clear() * @return the number of digits written, not including the sign. */ static int32_t -formatBase10(int32_t number, char *outputStr, int32_t outputLen) +formatBase10(int64_t number, char *outputStr, int32_t outputLen) { char buffer[MAX_DIGITS + 1]; int32_t bufferLen; + int32_t result; if (outputLen > MAX_DIGITS) { outputLen = MAX_DIGITS; // Ignore NULL @@ -160,13 +167,13 @@ formatBase10(int32_t number, char *outputStr, int32_t outputLen) number /= 10; } - outputLen -= bufferLen++; + result = outputLen - bufferLen++; - while (bufferLen <= MAX_DIGITS) { // Copy the number to output + while (bufferLen <= outputLen) { // Copy the number to output *(outputStr++) = buffer[bufferLen++]; } *outputStr = 0; // NULL terminate. - return outputLen; + return result; } /** @@ -177,7 +184,7 @@ formatBase10(int32_t number, char *outputStr, int32_t outputLen) * can be linked to this function. */ double -DigitList::getDouble() +DigitList::getDouble() /*const*/ { double value; @@ -185,6 +192,7 @@ DigitList::getDouble() value = 0.0; } else { + char* end = NULL; if (!gDecimal) { char rep[MAX_DIGITS]; // For machines that decide to change the decimal on you, @@ -199,7 +207,7 @@ DigitList::getDouble() formatBase10(fDecimalAt, fDigits + fCount + 1, // skip the 'e' MAX_DEC_DIGITS - fCount - 3); // skip the 'e' and '.' - value = atof(fDecimalDigits); + value = uprv_strtod(fDecimalDigits, &end); } return fIsPositive ? value : -value; @@ -210,7 +218,7 @@ DigitList::getDouble() /** * Make sure that fitsIntoLong() is called before calling this function. */ -int32_t DigitList::getLong() +int32_t DigitList::getLong() /*const*/ { if (fCount == fDecimalAt) { int32_t value; @@ -232,18 +240,59 @@ int32_t DigitList::getLong() } } + +/** + * Make sure that fitsIntoInt64() is called before calling this function. + */ +int64_t DigitList::getInt64() /*const*/ +{ + if (fCount == fDecimalAt) { + uint64_t value; + + fDigits[fCount] = 0; // NULL terminate + + // This conversion is bad on 64-bit platforms when we want to + // be able to return a 64-bit number [grhoten] + *fDecimalDigits = fIsPositive ? '+' : '-'; + + if (fCount < LONG_MIN_REP_LENGTH) { + return (int64_t)atol(fDecimalDigits); + } + + // too big for atol, hand-roll atoi64 + value = 0; + for (int i = 0; i < fCount; ++i) { + int v = fDigits[i] - kZero; + value = value * (uint64_t)10 + (uint64_t)v; + } + if (!fIsPositive) { + value = ~value; + value += 1; + } + int64_t svalue = (int64_t)value; + return svalue; + } + else { + // todo: figure out best approach + + // This is 100% accurate in c++ because if we are representing + // an integral value, we suffer nothing in the conversion to + // double. If we are to support 64-bit longs later, getLong() + // must be rewritten. [LIU] + return (int64_t)getDouble(); + } +} + /** * Return true if the number represented by this object can fit into * a long. */ UBool -DigitList::fitsIntoLong(UBool ignoreNegativeZero) +DigitList::fitsIntoLong(UBool ignoreNegativeZero) /*const*/ { // Figure out if the result will fit in a long. We have to // first look for nonzero digits after the decimal point; - // then check the size. If the digit count is 18 or less, then - // the value can definitely be represented as a long. If it is 19 - // then it may be too large. + // then check the size. // Trim trailing zeros after the decimal point. This does not change // the represented value. @@ -256,8 +305,6 @@ DigitList::fitsIntoLong(UBool ignoreNegativeZero) return fIsPositive || ignoreNegativeZero; } -// initializeLONG_MIN_REP(); - // If the digit list represents a double or this number is too // big for a long. if (fDecimalAt < fCount || fDecimalAt > LONG_MIN_REP_LENGTH) @@ -291,14 +338,77 @@ DigitList::fitsIntoLong(UBool ignoreNegativeZero) return !fIsPositive; } +/** + * Return true if the number represented by this object can fit into + * a long. + */ +UBool +DigitList::fitsIntoInt64(UBool ignoreNegativeZero) /*const*/ +{ + // Figure out if the result will fit in a long. We have to + // first look for nonzero digits after the decimal point; + // then check the size. + + // Trim trailing zeros after the decimal point. This does not change + // the represented value. + while (fCount > fDecimalAt && fCount > 0 && fDigits[fCount - 1] == kZero) + --fCount; + + if (fCount == 0) { + // Positive zero fits into a long, but negative zero can only + // be represented as a double. - bug 4162852 + return fIsPositive || ignoreNegativeZero; + } + + // If the digit list represents a double or this number is too + // big for a long. + if (fDecimalAt < fCount || fDecimalAt > I64_MIN_REP_LENGTH) + return FALSE; + + // If number is small enough to fit in an int64 + if (fDecimalAt < I64_MIN_REP_LENGTH) + return TRUE; + + // At this point we have fDecimalAt == fCount, and fCount == INT64_MIN_REP_LENGTH. + // The number will overflow if it is larger than U_INT64_MAX + // or smaller than U_INT64_MIN. + for (int32_t i=0; i max) + return FALSE; + if (dig < max) + return TRUE; + } + + // At this point the first count digits match. If fDecimalAt is less + // than count, then the remaining digits are zero, and we return true. + if (fCount < fDecimalAt) + return TRUE; + + // Now we have a representation of INT64_MIN_VALUE, without the leading + // negative sign. If this represents a positive value, then it does + // not fit; otherwise it fits. + return !fIsPositive; +} + + // ------------------------------------- +void +DigitList::set(int32_t source, int32_t maximumDigits) +{ + set((int64_t)source, maximumDigits); +} + +// ------------------------------------- /** * @param maximumDigits The maximum digits to be generated. If zero, * there is no maximum -- generate all digits. */ void -DigitList::set(int32_t source, int32_t maximumDigits) +DigitList::set(int64_t source, int32_t maximumDigits) { fCount = fDecimalAt = formatBase10(source, fDecimalDigits, MAX_DIGITS); @@ -335,7 +445,7 @@ DigitList::set(double source, int32_t maximumDigits, UBool fixedPoint) fIsPositive = !uprv_isNegative(source); // Allow +0 and -0 // Generate a representation of the form /[+-][0-9]+e[+-][0-9]+/ - sprintf(rep, "%+1.*e", MAX_DIGITS - 1, source); + sprintf(rep, "%+1.*e", MAX_DBL_DIGITS - 1, source); fDecimalAt = 0; rep[2] = rep[1]; // remove decimal @@ -347,7 +457,7 @@ DigitList::set(double source, int32_t maximumDigits, UBool fixedPoint) while (*repPtr != 'e') { *(digitPtr++) = *(repPtr++); } - fCount = MAX_DIGITS + fDecimalAt; + fCount = MAX_DBL_DIGITS + fDecimalAt; // Parse an exponent of the form /[eE][+-][0-9]+/ UBool negExp = (*(++repPtr) == '-'); @@ -449,7 +559,7 @@ DigitList::round(int32_t maximumDigits) * @return true if digit maximumDigits-1 should be * incremented */ -UBool DigitList::shouldRoundUp(int32_t maximumDigits) { +UBool DigitList::shouldRoundUp(int32_t maximumDigits) const { // Implement IEEE half-even rounding if (fDigits[maximumDigits] == '5' ) { for (int i=maximumDigits+1; i -// Decimal digits in a 32-bit int +// Decimal digits in a 64-bit int //#define LONG_DIGITS 19 +#define INT64_DIGITS 19 typedef enum EDigitListValues { - MAX_DIGITS = DBL_DIG, + MAX_DBL_DIGITS = DBL_DIG, + MAX_I64_DIGITS = INT64_DIGITS, + MAX_DIGITS = MAX_I64_DIGITS, MAX_EXPONENT = DBL_DIG, DIGIT_PADDING = 3, // "+." + fDigits + "e" + fDecimalAt - MAX_DEC_DIGITS = DBL_DIG + DIGIT_PADDING + MAX_EXPONENT + MAX_DEC_DIGITS = MAX_DIGITS + DIGIT_PADDING + MAX_EXPONENT } EDigitListValues; U_NAMESPACE_BEGIN @@ -61,7 +64,7 @@ U_NAMESPACE_BEGIN * derived by placing all the digits of the list to the right of the * decimal point, by 10^exponent. */ -class U_COMMON_API DigitList : public UMemory { // Declare external to make compiler happy +class U_I18N_API DigitList : public UMemory { // Declare external to make compiler happy public: DigitList(); ~DigitList(); @@ -115,7 +118,7 @@ public: * Returns 0.0 if zero length. * @return the value of the digit list. */ - double getDouble(void); + double getDouble(void) /*const*/; /** * Utility routine to get the value of the digit list @@ -123,7 +126,15 @@ public: * Returns 0 if zero length. * @return the value of the digit list, return 0 if it is zero length */ - int32_t getLong(void); + int32_t getLong(void) /*const*/; + + /** + * Utility routine to get the value of the digit list + * Make sure that fitsIntoInt64() is called before calling this function. + * Returns 0 if zero length. + * @return the value of the digit list, return 0 if it is zero length + */ + int64_t getInt64(void) /*const*/; /** * Return true if the number represented by this object can fit into @@ -132,7 +143,16 @@ public: * @return true if the number represented by this object can fit into * a long, return false otherwise. */ - UBool fitsIntoLong(UBool ignoreNegativeZero); + UBool fitsIntoLong(UBool ignoreNegativeZero) /*const*/; + + /** + * Return true if the number represented by this object can fit into + * an int64_t. + * @param ignoreNegativeZero True if negative zero is ignored. + * @return true if the number represented by this object can fit into + * a long, return false otherwise. + */ + UBool fitsIntoInt64(UBool ignoreNegativeZero) /*const*/; /** * Utility routine to set the value of the digit list from a double @@ -153,6 +173,15 @@ public: */ void set(int32_t source, int32_t maximumDigits = 0); + /** + * Utility routine to set the value of the digit list from an int64. + * If a non-zero maximumDigits is specified, no more than that number of + * significant digits will be produced. + * @param source The value to be set + * @param maximunDigits The maximum number of digits to be shown + */ + void set(int64_t source, int32_t maximumDigits = 0); + /** * Return true if this is a representation of zero. * @return true if this is a representation of zero. @@ -206,13 +235,7 @@ private: */ void round(int32_t maximumDigits); - /** - * Initializes the buffer that records the mimimum long value. - * @param maximumDigits The maximum number of digits to be shown. - */ - /*static void initializeLONG_MIN_REP(void);*/ - - UBool shouldRoundUp(int32_t maximumDigits); + UBool shouldRoundUp(int32_t maximumDigits) const; }; // ------------------------------------- diff --git a/icuSources/i18n/dtfmtsym.cpp b/icuSources/i18n/dtfmtsym.cpp index 5abf8996..816372ee 100644 --- a/icuSources/i18n/dtfmtsym.cpp +++ b/icuSources/i18n/dtfmtsym.cpp @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 1997-2003, International Business Machines Corporation and * +* Copyright (C) 1997-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* * @@ -23,12 +23,13 @@ #if !UCONFIG_NO_FORMATTING #include "unicode/dtfmtsym.h" -#include "unicode/resbund.h" #include "unicode/smpdtfmt.h" #include "ucln_in.h" #include "mutex.h" #include "cmemory.h" #include "cstring.h" +#include "locbased.h" +#include "gregoimp.h" // ***************************************************************************** // class DateFormatSymbols @@ -38,16 +39,17 @@ * resource data. */ -#define PATTERN_CHARS_LEN 20 +#define PATTERN_CHARS_LEN 24 /** * Unlocalized date-time pattern characters. For example: 'y', 'd', etc. All * locales use the same these unlocalized pattern characters. */ -static const UChar gPatternChars[] = -{ +static const UChar gPatternChars[] = { + // GyMdkHmsSEDFwWahKzYeugAZ 0x47, 0x79, 0x4D, 0x64, 0x6B, 0x48, 0x6D, 0x73, 0x53, 0x45, - 0x44, 0x46, 0x77, 0x57, 0x61, 0x68, 0x4B, 0x7A, 0x59, 0x65, 0 /* "GyMdkHmsSEDFwWahKzYe" */ + 0x44, 0x46, 0x77, 0x57, 0x61, 0x68, 0x4B, 0x7A, 0x59, 0x65, + 0x75, 0x67, 0x41, 0x5A, 0 }; //------------------------------------------------------ @@ -111,25 +113,26 @@ static const UChar gLastResortZoneStrings[5][4] = U_NAMESPACE_BEGIN -const char DateFormatSymbols::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(DateFormatSymbols) /** * These are the tags we expect to see in normal resource bundle files associated - * with a locale. + * with a locale and calendar */ -const char DateFormatSymbols::fgErasTag[]="Eras"; -const char DateFormatSymbols::fgMonthNamesTag[]="MonthNames"; -const char DateFormatSymbols::fgMonthAbbreviationsTag[]="MonthAbbreviations"; -const char DateFormatSymbols::fgDayNamesTag[]="DayNames"; -const char DateFormatSymbols::fgDayAbbreviationsTag[]="DayAbbreviations"; -const char DateFormatSymbols::fgAmPmMarkersTag[]="AmPmMarkers"; +const char gErasTag[]="eras"; +const char gAbbreviatedTag[] = "abbreviated"; +const char gMonthNamesTag[]="monthNames"; +const char gDayNamesTag[]="dayNames"; +const char gNamesWideTag[]="wide"; +const char gNamesAbbrTag[]="abbreviated"; +const char gAmPmMarkersTag[]="AmPmMarkers"; /** * These are the tags we expect to see in time zone data resource bundle files * associated with a locale. */ -const char DateFormatSymbols::fgZoneStringsTag[]="zoneStrings"; -const char DateFormatSymbols::fgLocalPatternCharsTag[]="localPatternChars"; +const char gZoneStringsTag[]="zoneStrings"; +const char gLocalPatternCharsTag[]="localPatternChars"; /** * Jitterbug 2974: MSVC has a bug whereby new X[0] behaves badly. @@ -481,7 +484,7 @@ DateFormatSymbols::setZoneStrings(const UnicodeString* const *strings, int32_t r //------------------------------------------------------ -const UChar * +const UChar * U_EXPORT2 DateFormatSymbols::getPatternUChars(void) { return gPatternChars; @@ -507,14 +510,16 @@ DateFormatSymbols::setLocalPatternChars(const UnicodeString& newLocalPatternChar //------------------------------------------------------ void -DateFormatSymbols::initField(UnicodeString **field, int32_t& length, const ResourceBundle data, UErrorCode &status) { +DateFormatSymbols::initField(UnicodeString **field, int32_t& length, const UResourceBundle *data, UErrorCode &status) { if (U_SUCCESS(status)) { - length = data.getSize(); + int32_t strLen = 0; + length = ures_getSize(data); *field = newUnicodeStringArray(length); if (*field) { for(int32_t i = 0; ifastCopyFrom(data.getStringEx(i, status)); + const UChar *resStr = ures_getStringByIndex(data, i, &strLen, &status); + // setTo() - see assignArray comments + (*(field)+i)->setTo(TRUE, resStr, strLen); } } else { @@ -543,43 +548,12 @@ DateFormatSymbols::initField(UnicodeString **field, int32_t& length, const UChar } } -ResourceBundle -DateFormatSymbols::getData(ResourceBundle &rb, const char *tag, const char *type, UErrorCode& status ) -{ - char tmp[100]; - char *fullTag = tmp; - - if(!type || !*type) { - type = "gregorian"; - } - - int32_t len = uprv_strlen(tag) + 1 + uprv_strlen(type); // tag + _ + type (i.e. Eras_Japanese ) - if(len >= (int32_t)sizeof(tmp)) { - fullTag = (char*)uprv_malloc(len+1); - } - - uprv_strcpy(fullTag, tag); - uprv_strcat(fullTag, "_"); - uprv_strcat(fullTag, type); - - ResourceBundle resource = rb.get(fullTag, status); - - if(status == U_MISSING_RESOURCE_ERROR) { - status = U_ZERO_ERROR; - resource = rb.get(tag, status); - } - - if(fullTag != tmp) { - uprv_free(fullTag); // not stack allocated - } - - return resource; -} - void DateFormatSymbols::initializeData(const Locale& locale, const char *type, UErrorCode& status, UBool useLastResortData) { int32_t i; + int32_t len = 0; + const UChar *resStr; /* In case something goes wrong, initialize all of the data to NULL. */ fEras = NULL; @@ -606,8 +580,17 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError * We cast away const here, but that's okay; we won't delete any of * these. */ - ResourceBundle resource((char *)0, locale, status); - + CalendarData calData(locale, type, status); + UResourceBundle *nonCalendarData = ures_open((char*)0, locale.getName(), &status); + + // load the first data item + UResourceBundle *erasMain = calData.getByKey(gErasTag, status); + UResourceBundle *eras = ures_getByKeyWithFallback(erasMain, gAbbreviatedTag, NULL, &status); + UResourceBundle *lsweekdaysData = NULL; // Data closed by calData + UResourceBundle *weekdaysData = NULL; // Data closed by calData + UResourceBundle *zoneArray = ures_getByKey(nonCalendarData, gZoneStringsTag, NULL, &status); + UResourceBundle *zoneRow = ures_getByIndex(zoneArray, (int32_t)0, NULL, &status); + U_LOCALE_BASED(locBased, *this); if (U_FAILURE(status)) { if (useLastResortData) @@ -630,85 +613,94 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError /* test for NULL */ if (fZoneStrings == 0) { status = U_MEMORY_ALLOCATION_ERROR; - return; } fZoneStringsRowCount = 1; initField(fZoneStrings, fZoneStringsColCount, (const UChar *)gLastResortZoneStrings, kZoneNum, kZoneLen, status); fLocalPatternChars = gPatternChars; } - return; + goto cleanup; } // if we make it to here, the resource data is cool, and we can get everything out // of it that we need except for the time-zone and localized-pattern data, which - // are stoerd in a separate file - initField(&fEras, fErasCount, getData(resource, fgErasTag, type, status), status); - initField(&fMonths, fMonthsCount, getData(resource, fgMonthNamesTag, type, status), status); - initField(&fShortMonths, fShortMonthsCount, getData(resource, fgMonthAbbreviationsTag, type, status), status); - initField(&fAmPms, fAmPmsCount, getData(resource, fgAmPmMarkersTag, type, status), status); - // fastCopyFrom() - see assignArray comments - fLocalPatternChars.fastCopyFrom(resource.getStringEx(fgLocalPatternCharsTag, status)); + // are stored in a separate file + locBased.setLocaleIDs(ures_getLocaleByType(eras, ULOC_VALID_LOCALE, &status), + ures_getLocaleByType(eras, ULOC_ACTUAL_LOCALE, &status)); + initField(&fEras, fErasCount, eras, status); + initField(&fMonths, fMonthsCount, calData.getByKey2(gMonthNamesTag, gNamesWideTag, status), status); + initField(&fShortMonths, fShortMonthsCount, calData.getByKey2(gMonthNamesTag, gNamesAbbrTag, status), status); + initField(&fAmPms, fAmPmsCount, calData.getByKey(gAmPmMarkersTag, status), status); + + // fastCopyFrom()/setTo() - see assignArray comments + resStr = ures_getStringByKey(nonCalendarData, gLocalPatternCharsTag, &len, &status); + fLocalPatternChars.setTo(TRUE, resStr, len); + // If the locale data does not include new pattern chars, use the defaults + // TODO: Consider making this an error, since this may add conflicting characters. + if (len < PATTERN_CHARS_LEN) { + fLocalPatternChars.append(UnicodeString(TRUE, &gPatternChars[len], PATTERN_CHARS_LEN-len)); + } - ResourceBundle zoneArray = resource.get(fgZoneStringsTag, status); - fZoneStringsRowCount = zoneArray.getSize(); - ResourceBundle zoneRow = zoneArray.get((int32_t)0, status); /* TODO: Fix the case where the zoneStrings is not a perfect square array of information. */ - fZoneStringsColCount = zoneRow.getSize(); + fZoneStringsRowCount = ures_getSize(zoneArray); + fZoneStringsColCount = ures_getSize(zoneRow); fZoneStrings = (UnicodeString **)uprv_malloc(fZoneStringsRowCount * sizeof(UnicodeString *)); /* test for NULL */ if (fZoneStrings == 0) { status = U_MEMORY_ALLOCATION_ERROR; - return; + goto cleanup; } for(i = 0; iclone(); + return ((const Measure*) a)->clone(); +} + +// Return TRUE if *a is an instance of Measure. +inline UBool instanceOfMeasure(const UObject* a) { + // LATER: return a->instanceof(Measure::getStaticClassID()); + return a->getDynamicClassID() == + CurrencyAmount::getStaticClassID(); +} + +//-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. + +/** + * Set 'ec' to 'err' only if 'ec' is not already set to a failing UErrorCode. + */ +inline void setError(UErrorCode& ec, UErrorCode err) { + if (U_SUCCESS(ec)) { + ec = err; + } +} // ------------------------------------- // default constructor. @@ -35,7 +79,8 @@ const char Formattable::fgClassID=0; Formattable::Formattable() : UObject(), fType(kLong) { - fValue.fLong = 0; + fBogus.setToBogus(); + fValue.fInt64 = 0; } // ------------------------------------- @@ -44,6 +89,7 @@ Formattable::Formattable() Formattable::Formattable(UDate date, ISDATE /*isDate*/) : UObject(), fType(kDate) { + fBogus.setToBogus(); fValue.fDate = date; } @@ -53,6 +99,7 @@ Formattable::Formattable(UDate date, ISDATE /*isDate*/) Formattable::Formattable(double value) : UObject(), fType(kDouble) { + fBogus.setToBogus(); fValue.fDouble = value; } @@ -62,7 +109,18 @@ Formattable::Formattable(double value) Formattable::Formattable(int32_t value) : UObject(), fType(kLong) { - fValue.fLong = value; + fBogus.setToBogus(); + fValue.fInt64 = value; +} + +// ------------------------------------- +// Creates a formattable object with a long value. + +Formattable::Formattable(int64_t value) + : UObject(), fType(kInt64) +{ + fBogus.setToBogus(); + fValue.fInt64 = value; } // ------------------------------------- @@ -71,6 +129,7 @@ Formattable::Formattable(int32_t value) Formattable::Formattable(const char* stringToCopy) : UObject(), fType(kString) { + fBogus.setToBogus(); fValue.fString = new UnicodeString(stringToCopy); } @@ -80,6 +139,7 @@ Formattable::Formattable(const char* stringToCopy) Formattable::Formattable(const UnicodeString& stringToCopy) : UObject(), fType(kString) { + fBogus.setToBogus(); fValue.fString = new UnicodeString(stringToCopy); } @@ -90,14 +150,23 @@ Formattable::Formattable(const UnicodeString& stringToCopy) Formattable::Formattable(UnicodeString* stringToAdopt) : UObject(), fType(kString) { + fBogus.setToBogus(); fValue.fString = stringToAdopt; } +Formattable::Formattable(UObject* objectToAdopt) + : UObject(), fType(kObject) +{ + fBogus.setToBogus(); + fValue.fObject = objectToAdopt; +} + // ------------------------------------- Formattable::Formattable(const Formattable* arrayToCopy, int32_t count) : UObject(), fType(kArray) { + fBogus.setToBogus(); fValue.fArrayAndCount.fArray = createArrayCopy(arrayToCopy, count); fValue.fArrayAndCount.fCount = count; } @@ -108,6 +177,7 @@ Formattable::Formattable(const Formattable* arrayToCopy, int32_t count) Formattable::Formattable(const Formattable &source) : UObject(source), fType(kLong) { + fBogus.setToBogus(); *this = source; } @@ -141,13 +211,17 @@ Formattable::operator=(const Formattable& source) fValue.fDouble = source.fValue.fDouble; break; case kLong: + case kInt64: // Sets the long value. - fValue.fLong = source.fValue.fLong; + fValue.fInt64 = source.fValue.fInt64; break; case kDate: // Sets the Date value. fValue.fDate = source.fValue.fDate; break; + case kObject: + fValue.fObject = objectClone(source.fValue.fObject); + break; } } return *this; @@ -158,32 +232,48 @@ Formattable::operator=(const Formattable& source) UBool Formattable::operator==(const Formattable& that) const { - // Checks class ID. + int32_t i; + if (this == &that) return TRUE; // Returns FALSE if the data types are different. if (fType != that.fType) return FALSE; // Compares the actual data values. + UBool equal = TRUE; switch (fType) { case kDate: - return fValue.fDate == that.fValue.fDate; + equal = (fValue.fDate == that.fValue.fDate); + break; case kDouble: - return fValue.fDouble == that.fValue.fDouble; + equal = (fValue.fDouble == that.fValue.fDouble); + break; case kLong: - return fValue.fLong == that.fValue.fLong; + case kInt64: + equal = (fValue.fInt64 == that.fValue.fInt64); + break; case kString: - return *(fValue.fString) == *(that.fValue.fString); + equal = (*(fValue.fString) == *(that.fValue.fString)); + break; case kArray: - if (fValue.fArrayAndCount.fCount != that.fValue.fArrayAndCount.fCount) - return FALSE; + if (fValue.fArrayAndCount.fCount != that.fValue.fArrayAndCount.fCount) { + equal = FALSE; + break; + } // Checks each element for equality. - for (int32_t i=0; i INT32_MAX) { + status = U_INVALID_FORMAT_ERROR; + return INT32_MAX; + } else if (fValue.fInt64 < INT32_MIN) { + status = U_INVALID_FORMAT_ERROR; + return INT32_MIN; + } else { + return (int32_t)fValue.fInt64; + } + case Formattable::kDouble: + if (fValue.fDouble > INT32_MAX) { + status = U_INVALID_FORMAT_ERROR; + return INT32_MAX; + } else if (fValue.fDouble < INT32_MIN) { + status = U_INVALID_FORMAT_ERROR; + return INT32_MIN; + } else { + return (int32_t)fValue.fDouble; // loses fraction + } + case Formattable::kObject: + // TODO Later replace this with instanceof call + if (instanceOfMeasure(fValue.fObject)) { + return ((const Measure*) fValue.fObject)-> + getNumber().getLong(status); + } + default: + status = U_INVALID_FORMAT_ERROR; + return 0; + } +} + +// ------------------------------------- +int64_t +Formattable::getInt64(UErrorCode& status) const +{ + if (U_FAILURE(status)) { + return 0; + } + + switch (fType) { + case Formattable::kLong: + case Formattable::kInt64: + return fValue.fInt64; + case Formattable::kDouble: + if (fValue.fDouble > U_INT64_MAX) { + status = U_INVALID_FORMAT_ERROR; + return U_INT64_MAX; + } else if (fValue.fDouble < U_INT64_MIN) { + status = U_INVALID_FORMAT_ERROR; + return U_INT64_MIN; + } else { + return (int64_t)fValue.fDouble; + } + case Formattable::kObject: + // TODO Later replace this with instanceof call + if (instanceOfMeasure(fValue.fObject)) { + return ((const Measure*) fValue.fObject)-> + getNumber().getInt64(status); + } + default: + status = U_INVALID_FORMAT_ERROR; + return 0; + } +} + +// ------------------------------------- +double +Formattable::getDouble(UErrorCode& status) const +{ + if (U_FAILURE(status)) { + return 0; + } + + switch (fType) { + case Formattable::kLong: + case Formattable::kInt64: // loses precision + return (double)fValue.fInt64; + case Formattable::kDouble: + return fValue.fDouble; + case Formattable::kObject: + // TODO Later replace this with instanceof call + if (instanceOfMeasure(fValue.fObject)) { + return ((const Measure*) fValue.fObject)-> + getNumber().getDouble(status); + } + default: + status = U_INVALID_FORMAT_ERROR; + return 0; + } +} + +const UObject* +Formattable::getObject() const { + return (fType == kObject) ? fValue.fObject : NULL; +} + // ------------------------------------- // Sets the value to a double value d. @@ -239,7 +456,18 @@ Formattable::setLong(int32_t l) { dispose(); fType = kLong; - fValue.fLong = l; + fValue.fInt64 = l; +} + +// ------------------------------------- +// Sets the value to an int64 value ll. + +void +Formattable::setInt64(int64_t ll) +{ + dispose(); + fType = kInt64; + fValue.fInt64 = ll; } // ------------------------------------- @@ -299,6 +527,70 @@ Formattable::adoptArray(Formattable* array, int32_t count) fValue.fArrayAndCount.fCount = count; } +void +Formattable::adoptObject(UObject* objectToAdopt) { + dispose(); + fType = kObject; + fValue.fObject = objectToAdopt; +} + +// ------------------------------------- +UnicodeString& +Formattable::getString(UnicodeString& result, UErrorCode& status) const +{ + if (fType != kString) { + setError(status, U_INVALID_FORMAT_ERROR); + result.setToBogus(); + } else { + result = *fValue.fString; + } + return result; +} + +// ------------------------------------- +const UnicodeString& +Formattable::getString(UErrorCode& status) const +{ + if (fType != kString) { + setError(status, U_INVALID_FORMAT_ERROR); + return *getBogus(); + } + return *fValue.fString; +} + +// ------------------------------------- +UnicodeString& +Formattable::getString(UErrorCode& status) +{ + if (fType != kString) { + setError(status, U_INVALID_FORMAT_ERROR); + return *getBogus(); + } + return *fValue.fString; +} + +// ------------------------------------- +const Formattable* +Formattable::getArray(int32_t& count, UErrorCode& status) const +{ + if (fType != kArray) { + setError(status, U_INVALID_FORMAT_ERROR); + count = 0; + return NULL; + } + count = fValue.fArrayAndCount.fCount; + return fValue.fArrayAndCount.fArray; +} + +// ------------------------------------- +// Gets the bogus string, ensures mondo bogosity. + +UnicodeString* +Formattable::getBogus() const +{ + return (UnicodeString*)&fBogus; /* cast away const :-( */ +} + #if 0 //---------------------------------------------------- // console I/O diff --git a/icuSources/i18n/format.cpp b/icuSources/i18n/format.cpp index 3141c85f..e93642c6 100644 --- a/icuSources/i18n/format.cpp +++ b/icuSources/i18n/format.cpp @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 1997-2003, International Business Machines Corporation and * +* Copyright (C) 1997-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* * @@ -39,6 +39,9 @@ uprv_icuin_lib_dummy(int32_t i) { #if !UCONFIG_NO_FORMATTING #include "unicode/format.h" +#include "unicode/ures.h" +#include "cstring.h" +#include "locbased.h" // ***************************************************************************** // class Format @@ -46,7 +49,14 @@ uprv_icuin_lib_dummy(int32_t i) { U_NAMESPACE_BEGIN -const char FieldPosition::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(FieldPosition) + +FieldPosition::~FieldPosition() {} + +FieldPosition * +FieldPosition::clone() const { + return new FieldPosition(*this); +} // ------------------------------------- // default constructor @@ -54,6 +64,7 @@ const char FieldPosition::fgClassID=0; Format::Format() : UObject() { + *validLocale = *actualLocale = 0; } // ------------------------------------- @@ -68,14 +79,17 @@ Format::~Format() Format::Format(const Format &that) : UObject(that) { + *this = that; } // ------------------------------------- // assignment operator Format& -Format::operator=(const Format& /*that*/) +Format::operator=(const Format& that) { + uprv_strcpy(validLocale, that.validLocale); + uprv_strcpy(actualLocale, that.actualLocale); return *this; } @@ -90,9 +104,7 @@ Format::format(const Formattable& obj, { if (U_FAILURE(status)) return toAppendTo; - // {sfb} should really be FieldPosition::DONT_CARE, not 0 - // leave at 0 for now, to keep in sync with Java - FieldPosition pos(0); + FieldPosition pos(FieldPosition::DONT_CARE); return format(obj, toAppendTo, pos, status); } @@ -118,10 +130,10 @@ Format::parseObject(const UnicodeString& source, // ------------------------------------- UBool -Format::operator==(const Format& /*that*/) const +Format::operator==(const Format& that) const { - // Add this implementation to make linker happy. - return TRUE; + // Subclasses: Call this method and then add more specific checks. + return getDynamicClassID() == that.getDynamicClassID(); } //--------------------------------------- @@ -156,6 +168,24 @@ void Format::syntaxError(const UnicodeString& pattern, parseError.postContext[stop-start]= 0; } +Locale +Format::getLocale(ULocDataLocaleType type, UErrorCode& status) const { + U_LOCALE_BASED(locBased, *this); + return locBased.getLocale(type, status); +} + +const char * +Format::getLocaleID(ULocDataLocaleType type, UErrorCode& status) const { + U_LOCALE_BASED(locBased, *this); + return locBased.getLocaleID(type, status); +} + +void +Format::setLocaleIDs(const char* valid, const char* actual) { + U_LOCALE_BASED(locBased, *this); + locBased.setLocaleIDs(valid, actual); +} + U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/i18n/funcrepl.cpp b/icuSources/i18n/funcrepl.cpp index 8b33196e..61198a26 100644 --- a/icuSources/i18n/funcrepl.cpp +++ b/icuSources/i18n/funcrepl.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (c) 2002, International Business Machines Corporation +* Copyright (c) 2002-2003, International Business Machines Corporation * and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -22,7 +22,7 @@ static const UChar CLOSE[] = {32,41,0}; // " )" U_NAMESPACE_BEGIN -const char FunctionReplacer::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(FunctionReplacer) /** * Construct a replacer that takes the output of the given @@ -38,7 +38,10 @@ FunctionReplacer::FunctionReplacer(Transliterator* adoptedTranslit, /** * Copy constructor. */ -FunctionReplacer::FunctionReplacer(const FunctionReplacer& other) { +FunctionReplacer::FunctionReplacer(const FunctionReplacer& other) : + UnicodeFunctor(other), + UnicodeReplacer(other) +{ translit = other.translit->clone(); replacer = other.replacer->clone(); } diff --git a/icuSources/i18n/funcrepl.h b/icuSources/i18n/funcrepl.h index cfb6a08d..c9cfe605 100644 --- a/icuSources/i18n/funcrepl.h +++ b/icuSources/i18n/funcrepl.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (c) 2002, International Business Machines Corporation +* Copyright (c) 2002-2004, International Business Machines Corporation * and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -45,12 +45,6 @@ class U_I18N_API FunctionReplacer : public UnicodeFunctor, public UnicodeReplace */ UnicodeFunctor* replacer; - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; - public: /** @@ -111,14 +105,14 @@ class U_I18N_API FunctionReplacer : public UnicodeFunctor, public UnicodeReplace * * @draft ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * * @draft ICU 2.2 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } + static UClassID U_EXPORT2 getStaticClassID(); }; U_NAMESPACE_END diff --git a/icuSources/i18n/gregocal.cpp b/icuSources/i18n/gregocal.cpp index 1ae4f1f3..bcc82a1b 100644 --- a/icuSources/i18n/gregocal.cpp +++ b/icuSources/i18n/gregocal.cpp @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 1997-2003, International Business Machines Corporation and * +* Copyright (C) 1997-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* * @@ -43,25 +43,19 @@ #if !UCONFIG_NO_FORMATTING #include "unicode/gregocal.h" -#include "unicode/smpdtfmt.h" /* for the public field (!) SimpleDateFormat::fgSystemDefaultCentury */ +#include "gregoimp.h" #include "mutex.h" - +#include "uassert.h" // ***************************************************************************** // class GregorianCalendar // ***************************************************************************** - -static const int32_t kJan1_1JulianDay = 1721426; // January 1, year 1 (Gregorian) - /** * Note that the Julian date used here is not a true Julian date, since * it is measured from midnight, not noon. This value is the Julian * day number of January 1, 1970 (Gregorian calendar) at noon UTC. [LIU] */ -static const int32_t kEpochStartAsJulianDay = 2440588; // January 1, 1970 (Gregorian) - -static const int32_t kEpochYear = 1970; static const int32_t kNumDays[] = {0,31,59,90,120,151,181,212,243,273,304,334}; // 0-based, for day-in-year @@ -72,18 +66,39 @@ static const int32_t kMonthLength[] static const int32_t kLeapMonthLength[] = {31,29,31,30,31,30,31,31,30,31,30,31}; // 0-based -// Useful millisecond constants -static const double kOneDay = U_MILLIS_PER_DAY; // 86,400,000 -static const double kOneWeek = 7.0 * U_MILLIS_PER_DAY; // 604,800,000 - -// These numbers are 2^52 - 1, the largest allowable mantissa in a 64-bit double -// with a 0 exponent. These are the absolute largest numbers for millis that -// this calendar will handle reliably. It will work for larger values, however. -// The problem is that, once the exponent is not 0, the calendar will jump. -// When translated into a year, LATEST_SUPPORTED_MILLIS corresponds to 144,683 AD -// and EARLIEST_SUPPORTED_MILLIS corresponds to 140,742 BC -static const UDate EARLIEST_SUPPORTED_MILLIS = - 4503599627370495.0; -static const UDate LATEST_SUPPORTED_MILLIS = 4503599627370495.0; +// setTimeInMillis() limits the Julian day range to +/-7F000000. +// This would seem to limit the year range to: +// ms=+183882168921600000 jd=7f000000 December 20, 5828963 AD +// ms=-184303902528000000 jd=81000000 September 20, 5838270 BC +// HOWEVER, CalendarRegressionTest/Test4167060 shows that the actual +// range limit on the year field is smaller (~ +/-140000). [alan 3.0] + +static const int32_t kGregorianCalendarLimits[UCAL_FIELD_COUNT][4] = { + // Minimum Greatest Least Maximum + // Minimum Maximum + { 0, 0, 1, 1 }, // ERA + { 1, 1, 140742, 144683 }, // YEAR + { 0, 0, 11, 11 }, // MONTH + { 1, 1, 52, 53 }, // WEEK_OF_YEAR + { 0, 0, 4, 6 }, // WEEK_OF_MONTH + { 1, 1, 28, 31 }, // DAY_OF_MONTH + { 1, 1, 365, 366 }, // DAY_OF_YEAR + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1},// DAY_OF_WEEK + { -1, -1, 4, 6 }, // DAY_OF_WEEK_IN_MONTH + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1},// AM_PM + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1},// HOUR + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1},// HOUR_OF_DAY + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1},// MINUTE + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1},// SECOND + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1},// MILLISECOND + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1},// ZONE_OFFSET + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1},// DST_OFFSET + { -140742, -140742, 140742, 144683 }, // YEAR_WOY + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1},// DOW_LOCAL + { -140742, -140742, 140742, 144683 }, // EXTENDED_YEAR + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1},// JULIAN_DAY + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1} // MILLISECONDS_IN_DAY +}; /* *

    @@ -112,20 +127,14 @@ static const UDate LATEST_SUPPORTED_MILLIS    =   4503599627370495.0;
      * 
    * (*) In units of one-hour */ -static const int32_t kMinValues[] = { - 0,1,0,1,0,1,1,1,-1,0,0,0,0,0,0,-12*U_MILLIS_PER_HOUR,0,1,1 -}; -static const int32_t kLeastMaxValues[] = { - 1,140742,11,52,4,28,365,7,4,1,11,23,59,59,999,12*U_MILLIS_PER_HOUR,1*U_MILLIS_PER_HOUR,140742,7 -}; -static const int32_t kMaxValues[] = { - 1,144683,11,53,6,31,366,7,6,1,11,23,59,59,999,12*U_MILLIS_PER_HOUR,1*U_MILLIS_PER_HOUR, 144683,7 -}; +#if defined( U_DEBUG_CALSVC ) || defined (U_DEBUG_CAL) +#include +#endif U_NAMESPACE_BEGIN -const char GregorianCalendar::fgClassID = 0; // Value is irrelevant +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(GregorianCalendar) // 00:00:00 UTC, October 15, 1582, expressed in ms from the epoch. // Note that only Italy and other Catholic countries actually @@ -133,15 +142,17 @@ const char GregorianCalendar::fgClassID = 0; // Value is irrelevant // the next few centuries, some as late as 1928. [LIU] // in Java, -12219292800000L //const UDate GregorianCalendar::kPapalCutover = -12219292800000L; +static const uint32_t kCutoverJulianDay = 2299161; static const UDate kPapalCutover = (2299161.0 - kEpochStartAsJulianDay) * U_MILLIS_PER_DAY; +static const UDate kPapalCutoverJulian = (2299161.0 - kEpochStartAsJulianDay); // ------------------------------------- GregorianCalendar::GregorianCalendar(UErrorCode& status) : Calendar(TimeZone::createDefault(), Locale::getDefault(), status), fGregorianCutover(kPapalCutover), - fNormalizedGregorianCutover(fGregorianCutover), - fGregorianCutoverYear(1582) + fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(1582), + fIsGregorian(TRUE), fInvertGregorian(FALSE) { setTimeInMillis(getNow(), status); } @@ -151,8 +162,8 @@ GregorianCalendar::GregorianCalendar(UErrorCode& status) GregorianCalendar::GregorianCalendar(TimeZone* zone, UErrorCode& status) : Calendar(zone, Locale::getDefault(), status), fGregorianCutover(kPapalCutover), - fNormalizedGregorianCutover(fGregorianCutover), - fGregorianCutoverYear(1582) + fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(1582), + fIsGregorian(TRUE), fInvertGregorian(FALSE) { setTimeInMillis(getNow(), status); } @@ -162,8 +173,8 @@ GregorianCalendar::GregorianCalendar(TimeZone* zone, UErrorCode& status) GregorianCalendar::GregorianCalendar(const TimeZone& zone, UErrorCode& status) : Calendar(zone, Locale::getDefault(), status), fGregorianCutover(kPapalCutover), - fNormalizedGregorianCutover(fGregorianCutover), - fGregorianCutoverYear(1582) + fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(1582), + fIsGregorian(TRUE), fInvertGregorian(FALSE) { setTimeInMillis(getNow(), status); } @@ -173,8 +184,8 @@ GregorianCalendar::GregorianCalendar(const TimeZone& zone, UErrorCode& status) GregorianCalendar::GregorianCalendar(const Locale& aLocale, UErrorCode& status) : Calendar(TimeZone::createDefault(), aLocale, status), fGregorianCutover(kPapalCutover), - fNormalizedGregorianCutover(fGregorianCutover), - fGregorianCutoverYear(1582) + fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(1582), + fIsGregorian(TRUE), fInvertGregorian(FALSE) { setTimeInMillis(getNow(), status); } @@ -185,8 +196,8 @@ GregorianCalendar::GregorianCalendar(TimeZone* zone, const Locale& aLocale, UErrorCode& status) : Calendar(zone, aLocale, status), fGregorianCutover(kPapalCutover), - fNormalizedGregorianCutover(fGregorianCutover), - fGregorianCutoverYear(1582) + fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(1582), + fIsGregorian(TRUE), fInvertGregorian(FALSE) { setTimeInMillis(getNow(), status); } @@ -197,8 +208,8 @@ GregorianCalendar::GregorianCalendar(const TimeZone& zone, const Locale& aLocale UErrorCode& status) : Calendar(zone, aLocale, status), fGregorianCutover(kPapalCutover), - fNormalizedGregorianCutover(fGregorianCutover), - fGregorianCutoverYear(1582) + fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(1582), + fIsGregorian(TRUE), fInvertGregorian(FALSE) { setTimeInMillis(getNow(), status); } @@ -209,8 +220,8 @@ GregorianCalendar::GregorianCalendar(int32_t year, int32_t month, int32_t date, UErrorCode& status) : Calendar(TimeZone::createDefault(), Locale::getDefault(), status), fGregorianCutover(kPapalCutover), - fNormalizedGregorianCutover(fGregorianCutover), - fGregorianCutoverYear(1582) + fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(1582), + fIsGregorian(TRUE), fInvertGregorian(FALSE) { set(UCAL_ERA, AD); set(UCAL_YEAR, year); @@ -224,8 +235,8 @@ GregorianCalendar::GregorianCalendar(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, UErrorCode& status) : Calendar(TimeZone::createDefault(), Locale::getDefault(), status), fGregorianCutover(kPapalCutover), - fNormalizedGregorianCutover(fGregorianCutover), - fGregorianCutoverYear(1582) + fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(1582), + fIsGregorian(TRUE), fInvertGregorian(FALSE) { set(UCAL_ERA, AD); set(UCAL_YEAR, year); @@ -242,8 +253,8 @@ GregorianCalendar::GregorianCalendar(int32_t year, int32_t month, int32_t date, UErrorCode& status) : Calendar(TimeZone::createDefault(), Locale::getDefault(), status), fGregorianCutover(kPapalCutover), - fNormalizedGregorianCutover(fGregorianCutover), - fGregorianCutoverYear(1582) + fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(1582), + fIsGregorian(TRUE), fInvertGregorian(FALSE) { set(UCAL_ERA, AD); set(UCAL_YEAR, year); @@ -265,8 +276,8 @@ GregorianCalendar::~GregorianCalendar() GregorianCalendar::GregorianCalendar(const GregorianCalendar &source) : Calendar(source), fGregorianCutover(source.fGregorianCutover), - fNormalizedGregorianCutover(source.fNormalizedGregorianCutover), - fGregorianCutoverYear(source.fGregorianCutoverYear) + fCutoverJulianDay(source.fCutoverJulianDay), fNormalizedGregorianCutover(source.fNormalizedGregorianCutover), fGregorianCutoverYear(source.fGregorianCutoverYear), + fIsGregorian(source.fIsGregorian), fInvertGregorian(source.fInvertGregorian) { } @@ -288,6 +299,7 @@ GregorianCalendar::operator=(const GregorianCalendar &right) fGregorianCutover = right.fGregorianCutover; fNormalizedGregorianCutover = right.fNormalizedGregorianCutover; fGregorianCutoverYear = right.fGregorianCutoverYear; + fCutoverJulianDay = right.fCutoverJulianDay; } return *this; } @@ -317,7 +329,7 @@ GregorianCalendar::setGregorianChange(UDate date, UErrorCode& status) // normalized cutover is in pure date milliseconds; it contains no time // of day or timezone component, and it used to compare against other // pure date values. - UDate cutoverDay = floorDivide(fGregorianCutover, kOneDay); + int32_t cutoverDay = (int32_t)Math::floorDivide(fGregorianCutover, (double)kOneDay); fNormalizedGregorianCutover = cutoverDay * kOneDay; // Handle the rare case of numeric overflow. If the user specifies a @@ -345,10 +357,94 @@ GregorianCalendar::setGregorianChange(UDate date, UErrorCode& status) fGregorianCutoverYear = cal->get(UCAL_YEAR, status); if (cal->get(UCAL_ERA, status) == BC) fGregorianCutoverYear = 1 - fGregorianCutoverYear; - + fCutoverJulianDay = cutoverDay; delete cal; } + +void GregorianCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status) { + int32_t eyear, month, dayOfMonth, dayOfYear; + + + if(U_FAILURE(status)) { + return; + } + +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d: jd%d- (greg's %d)- [cut=%d]\n", + __FILE__, __LINE__, julianDay, getGregorianDayOfYear(), fCutoverJulianDay); +#endif + + + if (julianDay >= fCutoverJulianDay) { + month = getGregorianMonth(); + dayOfMonth = getGregorianDayOfMonth(); + dayOfYear = getGregorianDayOfYear(); + eyear = getGregorianYear(); + } else { + // The Julian epoch day (not the same as Julian Day) + // is zero on Saturday December 30, 0 (Gregorian). + int32_t julianEpochDay = julianDay - (kJan1_1JulianDay - 2); + eyear = (int32_t) Math::floorDivide(4*julianEpochDay + 1464, 1461); + + // Compute the Julian calendar day number for January 1, eyear + int32_t january1 = 365*(eyear-1) + Math::floorDivide(eyear-1, (int32_t)4); + dayOfYear = (julianEpochDay - january1); // 0-based + + // Julian leap years occurred historically every 4 years starting + // with 8 AD. Before 8 AD the spacing is irregular; every 3 years + // from 45 BC to 9 BC, and then none until 8 AD. However, we don't + // implement this historical detail; instead, we implement the + // computatinally cleaner proleptic calendar, which assumes + // consistent 4-year cycles throughout time. + UBool isLeap = ((eyear&0x3) == 0); // equiv. to (eyear%4 == 0) + + // Common Julian/Gregorian calculation + int32_t correction = 0; + int32_t march1 = isLeap ? 60 : 59; // zero-based DOY for March 1 + if (dayOfYear >= march1) { + correction = isLeap ? 1 : 2; + } + month = (12 * (dayOfYear + correction) + 6) / 367; // zero-based month + dayOfMonth = dayOfYear - (isLeap?kLeapNumDays[month]:kNumDays[month]) + 1; // one-based DOM + ++dayOfYear; +#if defined (U_DEBUG_CAL) +// fprintf(stderr, "%d - %d[%d] + 1\n", dayOfYear, isLeap?kLeapNumDays[month]:kNumDays[month], month ); +// fprintf(stderr, "%s:%d: greg's HCF %d -> %d/%d/%d not %d/%d/%d\n", +// __FILE__, __LINE__,julianDay, +// eyear,month,dayOfMonth, +// getGregorianYear(), getGregorianMonth(), getGregorianDayOfMonth() ); + fprintf(stderr, "%s:%d: doy %d (greg's %d)- [cut=%d]\n", + __FILE__, __LINE__, dayOfYear, getGregorianDayOfYear(), fCutoverJulianDay); +#endif + + } + + // [j81] if we are after the cutover in its year, shift the day of the year + if((eyear == fGregorianCutoverYear) && (julianDay >= fCutoverJulianDay)) { + //from handleComputeMonthStart + int32_t gregShift = Grego::gregorianShift(eyear); +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d: gregorian shift %d ::: doy%d => %d [cut=%d]\n", + __FILE__, __LINE__,gregShift, dayOfYear, dayOfYear+gregShift, fCutoverJulianDay); +#endif + dayOfYear += gregShift; + } + + internalSet(UCAL_MONTH, month); + internalSet(UCAL_DAY_OF_MONTH, dayOfMonth); + internalSet(UCAL_DAY_OF_YEAR, dayOfYear); + internalSet(UCAL_EXTENDED_YEAR, eyear); + int32_t era = AD; + if (eyear < 1) { + era = BC; + eyear = 1 - eyear; + } + internalSet(UCAL_ERA, era); + internalSet(UCAL_YEAR, eyear); +} + + // ------------------------------------- UDate @@ -362,213 +458,135 @@ GregorianCalendar::getGregorianChange() const UBool GregorianCalendar::isLeapYear(int32_t year) const { + // MSVC complains bitterly if we try to use Grego::isLeapYear here + // NOTE: year&0x3 == year%4 return (year >= fGregorianCutoverYear ? - ((year%4 == 0) && ((year%100 != 0) || (year%400 == 0))) : // Gregorian - (year%4 == 0)); // Julian + (((year&0x3) == 0) && ((year%100 != 0) || (year%400 == 0))) : // Gregorian + ((year&0x3) == 0)); // Julian } - // ------------------------------------- -/** - * Compute the date-based fields given the milliseconds since the epoch start. - * Do not compute the time-based fields (HOUR, MINUTE, etc.). - * - * @param theTime the given time as LOCAL milliseconds, not UTC. - */ -void -GregorianCalendar::timeToFields(UDate theTime, UBool quick, UErrorCode& status) +int32_t GregorianCalendar::handleComputeJulianDay(UCalendarDateFields bestField) { - if (U_FAILURE(status)) - return; + fInvertGregorian = FALSE; - int32_t rawYear; - int32_t year, yearOfWeekOfYear, month, date, dayOfWeek, locDayOfWeek, dayOfYear, era; - UBool isLeap; - - // Compute the year, month, and day of month from the given millis - if (theTime >= fNormalizedGregorianCutover) { - // The Gregorian epoch day is zero for Monday January 1, year 1. - double gregorianEpochDay = millisToJulianDay(theTime) - kJan1_1JulianDay; - // Here we convert from the day number to the multiple radix - // representation. We use 400-year, 100-year, and 4-year cycles. - // For example, the 4-year cycle has 4 years + 1 leap day; giving - // 1461 == 365*4 + 1 days. - int32_t rem[1]; - int32_t n400 = floorDivide(gregorianEpochDay, 146097, rem); // 400-year cycle length - int32_t n100 = floorDivide(rem[0], 36524, rem); // 100-year cycle length - int32_t n4 = floorDivide(rem[0], 1461, rem); // 4-year cycle length - int32_t n1 = floorDivide(rem[0], 365, rem); - rawYear = 400*n400 + 100*n100 + 4*n4 + n1; - dayOfYear = rem[0]; // zero-based day of year - if (n100 == 4 || n1 == 4) - dayOfYear = 365; // Dec 31 at end of 4- or 400-yr cycle - else - ++rawYear; - - isLeap = ((rawYear&0x3) == 0) && // equiv. to (rawYear%4 == 0) - (rawYear%100 != 0 || rawYear%400 == 0); - - // Gregorian day zero is a Monday - dayOfWeek = (int32_t)uprv_fmod(gregorianEpochDay + 1, 7); - } - else { - // The Julian epoch day (not the same as Julian Day) - // is zero on Saturday December 30, 0 (Gregorian). - double julianEpochDay = millisToJulianDay(theTime) - (kJan1_1JulianDay - 2); - rawYear = (int32_t) floorDivide(4*julianEpochDay + 1464, 1461.0); - - // Compute the Julian calendar day number for January 1, rawYear - double january1 = 365.0 * (rawYear - 1) + floorDivide((double)(rawYear - 1), 4.0); - dayOfYear = (int32_t)(julianEpochDay - january1); // 0-based - - // Julian leap years occurred historically every 4 years starting - // with 8 AD. Before 8 AD the spacing is irregular; every 3 years - // from 45 BC to 9 BC, and then none until 8 AD. However, we don't - // implement this historical detail; instead, we implement the - // computatinally cleaner proleptic calendar, which assumes - // consistent 4-year cycles throughout time. - isLeap = ((rawYear & 0x3) == 0); // equiv. to (rawYear%4 == 0) - - // Julian calendar day zero is a Saturday - dayOfWeek = (int32_t)uprv_fmod(julianEpochDay-1, 7); - } - - // Common Julian/Gregorian calculation - int32_t correction = 0; - int32_t march1 = isLeap ? 60 : 59; // zero-based DOY for March 1 - if (dayOfYear >= march1) - correction = isLeap ? 1 : 2; - month = (12 * (dayOfYear + correction) + 6) / 367; // zero-based month - date = dayOfYear - - (isLeap ? kLeapNumDays[month] : kNumDays[month]) + 1; // one-based DOM - - // Normalize day of week - dayOfWeek += (dayOfWeek < 0) ? (UCAL_SUNDAY+7) : UCAL_SUNDAY; - + int32_t jd = Calendar::handleComputeJulianDay(bestField); + + if((bestField == UCAL_WEEK_OF_YEAR) && // if we are doing WOY calculations, we are counting relative to Jan 1 *julian* + (internalGet(UCAL_EXTENDED_YEAR)==fGregorianCutoverYear) && + jd >= fCutoverJulianDay) { + fInvertGregorian = TRUE; // So that the Julian Jan 1 will be used in handleComputeMonthStart + return Calendar::handleComputeJulianDay(bestField); + } - era = AD; - year = rawYear; - if (year < 1) { - era = BC; - year = 1 - year; - } - // Adjust the doy for the cutover year. Do this AFTER the above - // computations using doy! [j81 - aliu] - if (rawYear == fGregorianCutoverYear && - theTime >= fNormalizedGregorianCutover) { - dayOfYear -= 10; + // The following check handles portions of the cutover year BEFORE the + // cutover itself happens. + //if ((fIsGregorian==TRUE) != (jd >= fCutoverJulianDay)) { /* cutoverJulianDay)) { */ + if ((fIsGregorian==TRUE) != (jd >= fCutoverJulianDay)) { /* cutoverJulianDay)) { */ +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d: jd [invert] %d\n", + __FILE__, __LINE__, jd); +#endif + fInvertGregorian = TRUE; + jd = Calendar::handleComputeJulianDay(bestField); +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d: fIsGregorian %s, fInvertGregorian %s - ", + __FILE__, __LINE__,fIsGregorian?"T":"F", fInvertGregorian?"T":"F"); + fprintf(stderr, " jd NOW %d\n", + jd); +#endif + } else { +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d: jd [==] %d - %sfIsGregorian %sfInvertGregorian, %d\n", + __FILE__, __LINE__, jd, fIsGregorian?"T":"F", fInvertGregorian?"T":"F", bestField); +#endif + } + + if(fIsGregorian && (internalGet(UCAL_EXTENDED_YEAR) == fGregorianCutoverYear)) { + int32_t gregShift = Grego::gregorianShift(internalGet(UCAL_EXTENDED_YEAR)); + if (bestField == UCAL_DAY_OF_YEAR) { +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d: [DOY%d] gregorian shift of JD %d += %d\n", + __FILE__, __LINE__, fFields[bestField],jd, gregShift); +#endif + jd -= gregShift; + } else if ( bestField == UCAL_WEEK_OF_MONTH ) { + int32_t weekShift = 14; +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d: [WOY/WOM] gregorian week shift of %d += %d\n", + __FILE__, __LINE__, jd, weekShift); +#endif + jd += weekShift; // shift by weeks for week based fields. } + } + + return jd; +} - // Calculate year of week of year +int32_t GregorianCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, + UBool /* useMonth */) const +{ + GregorianCalendar *nonConstThis = (GregorianCalendar*)this; // cast away const - internalSet(UCAL_ERA, era); - internalSet(UCAL_YEAR, year); - internalSet(UCAL_MONTH, month + UCAL_JANUARY); // 0-based - internalSet(UCAL_DATE, date); - internalSet(UCAL_DAY_OF_WEEK, dayOfWeek); - internalSet(UCAL_DAY_OF_YEAR, ++dayOfYear); // Convert from 0-based to 1-based - if (quick) - return; + // If the month is out of range, adjust it into range, and + // modify the extended year value accordingly. + if (month < 0 || month > 11) { + eyear += Math::floorDivide(month, 12, month); + } - yearOfWeekOfYear = year; - - // Compute the week of the year. Valid week numbers run from 1 to 52 - // or 53, depending on the year, the first day of the week, and the - // minimal days in the first week. Days at the start of the year may - // fall into the last week of the previous year; days at the end of - // the year may fall into the first week of the next year. - int32_t relDow = (dayOfWeek + 7 - getFirstDayOfWeek()) % 7; // 0..6 - int32_t relDowJan1 = (dayOfWeek - dayOfYear + 701 - getFirstDayOfWeek()) % 7; // 0..6 - int32_t woy = (dayOfYear - 1 + relDowJan1) / 7; // 0..53 - if ((7 - relDowJan1) >= getMinimalDaysInFirstWeek()) { - ++woy; - // Check to see if we are in the last week; if so, we need - // to handle the case in which we are the first week of the - // next year. - int32_t lastDoy = yearLength(); - int32_t lastRelDow = (relDow + lastDoy - dayOfYear) % 7; - if (lastRelDow < 0) lastRelDow += 7; - if (dayOfYear > 359 && // Fast check which eliminates most cases - (6 - lastRelDow) >= getMinimalDaysInFirstWeek() && - (dayOfYear + 7 - relDow) > lastDoy) { - woy = 1; - yearOfWeekOfYear++; - } + UBool isLeap = eyear%4 == 0; + int32_t y = eyear-1; + int32_t julianDay = 365*y + Math::floorDivide(y, 4) + (kJan1_1JulianDay - 3); + + nonConstThis->fIsGregorian = (eyear >= fGregorianCutoverYear); +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d: (hcms%d/%d) fIsGregorian %s, fInvertGregorian %s\n", + __FILE__, __LINE__, eyear,month, fIsGregorian?"T":"F", fInvertGregorian?"T":"F"); +#endif + if (fInvertGregorian) { + nonConstThis->fIsGregorian = !fIsGregorian; } - else if (woy == 0) { - // We are the last week of the previous year. - int32_t prevDoy = dayOfYear + yearLength(rawYear - 1); - woy = weekNumber(prevDoy, dayOfWeek); - yearOfWeekOfYear--; + if (fIsGregorian) { + isLeap = isLeap && ((eyear%100 != 0) || (eyear%400 == 0)); + // Add 2 because Gregorian calendar starts 2 days after + // Julian calendar + int32_t gregShift = Grego::gregorianShift(eyear); +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d: (hcms%d/%d) gregorian shift of %d += %d\n", + __FILE__, __LINE__, eyear, month, julianDay, gregShift); +#endif + julianDay += gregShift; } + // At this point julianDay indicates the day BEFORE the first + // day of January 1, of either the Julian or Gregorian + // calendar. - internalSet(UCAL_WEEK_OF_YEAR, woy); - internalSet(UCAL_YEAR_WOY, yearOfWeekOfYear); - - internalSet(UCAL_WEEK_OF_MONTH, weekNumber(date, dayOfWeek)); - internalSet(UCAL_DAY_OF_WEEK_IN_MONTH, (date-1) / 7 + 1); + if (month != 0) { + julianDay += isLeap?kLeapNumDays[month]:kNumDays[month]; + } - // Calculate localized day of week - locDayOfWeek = dayOfWeek-getFirstDayOfWeek()+1; - locDayOfWeek += (locDayOfWeek<1?7:0); - internalSet(UCAL_DOW_LOCAL, locDayOfWeek); + return julianDay; } -// ------------------------------------- - -/** - * Return the week number of a day, within a period. This may be the week number in - * a year, or the week number in a month. Usually this will be a value >= 1, but if - * some initial days of the period are excluded from week 1, because - * minimalDaysInFirstWeek is > 1, then the week number will be zero for those - * initial days. Requires the day of week for the given date in order to determine - * the day of week of the first day of the period. - * - * @param dayOfPeriod Day-of-year or day-of-month. Should be 1 for first day of period. - * @param day Day-of-week for given dayOfPeriod. 1-based with 1=Sunday. - * @return Week number, one-based, or zero if the day falls in part of the - * month before the first week, when there are days before the first - * week because the minimum days in the first week is more than one. - */ -int32_t -GregorianCalendar::weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek) +int32_t GregorianCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month) const { - // Determine the day of the week of the first day of the period - // in question (either a year or a month). Zero represents the - // first day of the week on this calendar. - int32_t periodStartDayOfWeek = (dayOfWeek - getFirstDayOfWeek() - dayOfPeriod + 1) % 7; - if (periodStartDayOfWeek < 0) - periodStartDayOfWeek += 7; - - // Compute the week number. Initially, ignore the first week, which - // may be fractional (or may not be). We add periodStartDayOfWeek in - // order to fill out the first week, if it is fractional. - int32_t weekNo = (dayOfPeriod + periodStartDayOfWeek - 1)/7; - - // If the first week is long enough, then count it. If - // the minimal days in the first week is one, or if the period start - // is zero, we always increment weekNo. - if ((7 - periodStartDayOfWeek) >= getMinimalDaysInFirstWeek()) - ++weekNo; - - return weekNo; + return isLeapYear(extendedYear) ? kLeapMonthLength[month] : kMonthLength[month]; +} + +int32_t GregorianCalendar::handleGetYearLength(int32_t eyear) const { + return isLeapYear(eyear) ? 366 : 365; } -// ------------------------------------- int32_t GregorianCalendar::monthLength(int32_t month) const { - int32_t year = internalGet(UCAL_YEAR); - if(internalGetEra() == BC) { - year = 1 - year; - } - - return monthLength(month, year); + int32_t year = internalGet(UCAL_EXTENDED_YEAR); + return handleGetMonthLength(year, month); } // ------------------------------------- @@ -597,112 +615,6 @@ GregorianCalendar::yearLength() const // ------------------------------------- -/** - * Overrides Calendar - * Converts UTC as milliseconds to time field values. - * The time is not - * recomputed first; to recompute the time, then the fields, call the - * complete method. - * @see Calendar#complete - */ -void -GregorianCalendar::computeFields(UErrorCode& status) -{ - if (U_FAILURE(status)) - return; - - int32_t rawOffset = getTimeZone().getRawOffset(); - double localMillis = internalGetTime() + rawOffset; - - /* Check for very extreme values -- millis near Long.MIN_VALUE or - * Long.MAX_VALUE. For these values, adding the zone offset can push - * the millis past MAX_VALUE to MIN_VALUE, or vice versa. This produces - * the undesirable effect that the time can wrap around at the ends, - * yielding, for example, a UDate(Long.MAX_VALUE) with a big BC year - * (should be AD). Handle this by pinning such values to Long.MIN_VALUE - * or Long.MAX_VALUE. - liu 8/11/98 bug 4149677 */ - - /* {sfb} 9/04/98 - * Since in C++ we use doubles instead of longs for dates, there is - * an inherent loss of range in the calendar (because in Java you have all 64 - * bits to store data, while in C++ you have only 52 bits of mantissa. - * So, I will pin to these (2^52 - 1) values instead */ - - if(internalGetTime() > 0 && localMillis < 0 && rawOffset > 0) { - localMillis = LATEST_SUPPORTED_MILLIS; - } - else if(internalGetTime() < 0 && localMillis > 0 && rawOffset < 0) { - localMillis = EARLIEST_SUPPORTED_MILLIS; - } - - // Time to fields takes the wall millis (Standard or DST). - timeToFields(localMillis, FALSE, status); - - uint8_t era = (uint8_t) internalGetEra(); - int32_t year = internalGet(UCAL_YEAR); - int32_t month = internalGet(UCAL_MONTH); - int32_t date = internalGet(UCAL_DATE); - uint8_t dayOfWeek = (uint8_t) internalGet(UCAL_DAY_OF_WEEK); - - double days = uprv_floor(localMillis / kOneDay); - int32_t millisInDay = (int32_t) (localMillis - (days * kOneDay)); - if (millisInDay < 0) - millisInDay += U_MILLIS_PER_DAY; - - // Call getOffset() to get the TimeZone offset. The millisInDay value must - // be standard local millis. - int32_t gregoYear = getGregorianYear(status); - int32_t dstOffset = getTimeZone().getOffset((gregoYear>0?AD:BC), getGregorianYear(status), month, date, dayOfWeek, millisInDay, - monthLength(month), status) - rawOffset; - if(U_FAILURE(status)) - return; - - // Adjust our millisInDay for DST, if necessary. - millisInDay += dstOffset; - - // If DST has pushed us into the next day, we must call timeToFields() again. - // This happens in DST between 12:00 am and 1:00 am every day. The call to - // timeToFields() will give the wrong day, since the Standard time is in the - // previous day. - if (millisInDay >= U_MILLIS_PER_DAY) { - UDate dstMillis = localMillis + dstOffset; - millisInDay -= U_MILLIS_PER_DAY; - // As above, check for and pin extreme values - if(localMillis > 0 && dstMillis < 0 && dstOffset > 0) { - dstMillis = LATEST_SUPPORTED_MILLIS; - } - else if(localMillis < 0 && dstMillis > 0 && dstOffset < 0) { - dstMillis = EARLIEST_SUPPORTED_MILLIS; - } - timeToFields(dstMillis, FALSE, status); - } - - // Fill in all time-related fields based on millisInDay. Call internalSet() - // so as not to perturb flags. - internalSet(UCAL_MILLISECOND, millisInDay % 1000); - millisInDay /= 1000; - internalSet(UCAL_SECOND, millisInDay % 60); - millisInDay /= 60; - internalSet(UCAL_MINUTE, millisInDay % 60); - millisInDay /= 60; - internalSet(UCAL_HOUR_OF_DAY, millisInDay); - internalSet(UCAL_AM_PM, millisInDay / 12); // Assume AM == 0 - internalSet(UCAL_HOUR, millisInDay % 12); - - internalSet(UCAL_ZONE_OFFSET, rawOffset); - internalSet(UCAL_DST_OFFSET, dstOffset); - - // Careful here: We are manually setting the time stamps[] flags to - // INTERNALLY_SET, so we must be sure that the above code actually does - // set all these fields. - for (int i=0; i0)?AD:BC; // calculate era from extended year. - - // First, use the year to determine whether to use the Gregorian or the - // Julian calendar. If the year is not the year of the cutover, this - // computation will be correct. But if the year is the cutover year, - // this may be incorrect. In that case, assume the Gregorian calendar, - // make the computation, and then recompute if the resultant millis - // indicate the wrong calendar has been assumed. - - // A date such as Oct. 10, 1582 does not exist in a Gregorian calendar - // with the default changeover of Oct. 15, 1582, since in such a - // calendar Oct. 4 (Julian) is followed by Oct. 15 (Gregorian). This - // algorithm will interpret such a date using the Julian calendar, - // yielding Oct. 20, 1582 (Gregorian). - UBool isGregorian = year >= fGregorianCutoverYear; - double julianDay = computeJulianDay(isGregorian, year); - double millis = julianDayToMillis(julianDay); - - // The following check handles portions of the cutover year BEFORE the - // cutover itself happens. The check for the julianDate number is for a - // rare case; it's a hardcoded number, but it's efficient. The given - // Julian day number corresponds to Dec 3, 292269055 BC, which - // corresponds to millis near Long.MIN_VALUE. The need for the check - // arises because for extremely negative Julian day numbers, the millis - // actually overflow to be positive values. Without the check, the - // initial date is interpreted with the Gregorian calendar, even when - // the cutover doesn't warrant it. - if (isGregorian != (millis >= fNormalizedGregorianCutover) && - julianDay != -106749550580.0) { // See above - julianDay = computeJulianDay(!isGregorian, year); - millis = julianDayToMillis(julianDay); - } - - // Do the time portion of the conversion. - - int32_t millisInDay = 0; - - // Find the best set of fields specifying the time of day. There - // are only two possibilities here; the HOUR_OF_DAY or the - // AM_PM and the HOUR. - int32_t hourOfDayStamp = fStamp[UCAL_HOUR_OF_DAY]; - int32_t hourStamp = fStamp[UCAL_HOUR]; - int32_t bestStamp = (hourStamp > hourOfDayStamp) ? hourStamp : hourOfDayStamp; - - // Hours - if (bestStamp != kUnset) { - if (bestStamp == hourOfDayStamp) - // Don't normalize here; let overflow bump into the next period. - // This is consistent with how we handle other fields. - millisInDay += internalGet(UCAL_HOUR_OF_DAY); - - else { - // Don't normalize here; let overflow bump into the next period. - // This is consistent with how we handle other fields. - millisInDay += internalGet(UCAL_HOUR); - - millisInDay += 12 * internalGet(UCAL_AM_PM); // Default works for unset AM_PM - } - } - - // We use the fact that unset == 0; we start with millisInDay - // == HOUR_OF_DAY. - millisInDay *= 60; - millisInDay += internalGet(UCAL_MINUTE); // now have minutes - millisInDay *= 60; - millisInDay += internalGet(UCAL_SECOND); // now have seconds - millisInDay *= 1000; - millisInDay += internalGet(UCAL_MILLISECOND); // now have millis - - // Compute the time zone offset and DST offset. There are two potential - // ambiguities here. We'll assume a 2:00 am (wall time) switchover time - // for discussion purposes here. - // 1. The transition into DST. Here, a designated time of 2:00 am - 2:59 am - // can be in standard or in DST depending. However, 2:00 am is an invalid - // representation (the representation jumps from 1:59:59 am Std to 3:00:00 am DST). - // We assume standard time. - // 2. The transition out of DST. Here, a designated time of 1:00 am - 1:59 am - // can be in standard or DST. Both are valid representations (the rep - // jumps from 1:59:59 DST to 1:00:00 Std). - // Again, we assume standard time. - // We use the TimeZone object, unless the user has explicitly set the ZONE_OFFSET - // or DST_OFFSET fields; then we use those fields. - const TimeZone& zone = getTimeZone(); - int32_t zoneOffset = (fStamp[UCAL_ZONE_OFFSET] >= kMinimumUserStamp) - /*isSet(ZONE_OFFSET) && userSetZoneOffset*/ ? - internalGet(UCAL_ZONE_OFFSET) : zone.getRawOffset(); - - // Now add date and millisInDay together, to make millis contain local wall - // millis, with no zone or DST adjustments - millis += millisInDay; - - int32_t dstOffset = 0; - if (fStamp[UCAL_ZONE_OFFSET] >= kMinimumUserStamp - /*isSet(DST_OFFSET) && userSetDSTOffset*/) - dstOffset = internalGet(UCAL_DST_OFFSET); - else { - /* Normalize the millisInDay to 0..ONE_DAY-1. If the millis is out - * of range, then we must call timeToFields() to recompute our - * fields. */ - int32_t normalizedMillisInDay [1]; - floorDivide(millis, (int32_t)kOneDay, normalizedMillisInDay); - - // We need to have the month, the day, and the day of the week. - // Calling timeToFields will compute the MONTH and DATE fields. - // If we're lenient then we need to call timeToFields() to - // normalize the year, month, and date numbers. - uint8_t dow; - if (isLenient() || fStamp[UCAL_MONTH] == kUnset || fStamp[UCAL_DATE] == kUnset - || millisInDay != normalizedMillisInDay[0]) { - timeToFields(millis, TRUE, status); // Use wall time; true == do quick computation - dow = (uint8_t) internalGet(UCAL_DAY_OF_WEEK); // DOW is computed by timeToFields - } - else { - // It's tempting to try to use DAY_OF_WEEK here, if it - // is set, but we CAN'T. Even if it's set, it might have - // been set wrong by the user. We should rely only on - // the Julian day number, which has been computed correctly - // using the disambiguation algorithm above. [LIU] - dow = julianDayToDayOfWeek(julianDay); - } - - // It's tempting to try to use DAY_OF_WEEK here, if it - // is set, but we CAN'T. Even if it's set, it might have - // been set wrong by the user. We should rely only on - // the Julian day number, which has been computed correctly - // using the disambiguation algorithm above. [LIU] - dstOffset = zone.getOffset((uint8_t)era, - internalGet(UCAL_YEAR), - internalGet(UCAL_MONTH), - internalGet(UCAL_DATE), - dow, - normalizedMillisInDay[0], - monthLength(internalGet(UCAL_MONTH)), - status) - - zoneOffset; - // Note: Because we pass in wall millisInDay, rather than - // standard millisInDay, we interpret "1:00 am" on the day - // of cessation of DST as "1:00 am Std" (assuming the time - // of cessation is 2:00 am). - } - - // Store our final computed GMT time, with timezone adjustments. - internalSetTime(millis - zoneOffset - dstOffset); -} // ------------------------------------- @@ -977,335 +708,76 @@ double GregorianCalendar::computeJulianDayOfYear(UBool isGregorian, int32_t year, UBool& isLeap) { isLeap = year%4 == 0; int32_t y = year - 1; - double julianDay = 365.0*y + floorDivide(y, 4) + (kJan1_1JulianDay - 3); + double julianDay = 365.0*y + Math::floorDivide(y, 4) + (kJan1_1JulianDay - 3); if (isGregorian) { isLeap = isLeap && ((year%100 != 0) || (year%400 == 0)); // Add 2 because Gregorian calendar starts 2 days after Julian calendar - julianDay += floorDivide(y, 400) - floorDivide(y, 100) + 2; + julianDay += Grego::gregorianShift(year); } return julianDay; } -/** - * Compute the day of week, relative to the first day of week, from - * 0..6, of the current DOW_LOCAL or DAY_OF_WEEK fields. This is - * equivalent to get(DOW_LOCAL) - 1. - */ -int32_t GregorianCalendar::computeRelativeDOW() const { - int32_t relDow = 0; - if (fStamp[UCAL_DOW_LOCAL] > fStamp[UCAL_DAY_OF_WEEK]) { - relDow = internalGet(UCAL_DOW_LOCAL) - 1; // 1-based - } else if (fStamp[UCAL_DAY_OF_WEEK] != kUnset) { - relDow = internalGet(UCAL_DAY_OF_WEEK) - getFirstDayOfWeek(); - if (relDow < 0) relDow += 7; - } - return relDow; -} - -/** - * Compute the day of week, relative to the first day of week, - * from 0..6 of the given julian day. - */ -int32_t GregorianCalendar::computeRelativeDOW(double julianDay) const { - int32_t relDow = julianDayToDayOfWeek(julianDay) - getFirstDayOfWeek(); - if (relDow < 0) { - relDow += 7; - } - return relDow; -} - -/** - * Compute the DOY using the WEEK_OF_YEAR field and the julian day - * of the day BEFORE January 1 of a year (a return value from - * computeJulianDayOfYear). - */ -int32_t GregorianCalendar::computeDOYfromWOY(double julianDayOfYear) const { - // Compute DOY from day of week plus week of year - - // Find the day of the week for the first of this year. This - // is zero-based, with 0 being the locale-specific first day of - // the week. Add 1 to get first day of year. - int32_t fdy = computeRelativeDOW(julianDayOfYear + 1); - - return - // Compute doy of first (relative) DOW of WOY 1 - (((7 - fdy) < getMinimalDaysInFirstWeek()) - ? (8 - fdy) : (1 - fdy)) +// /** +// * Compute the day of week, relative to the first day of week, from +// * 0..6, of the current DOW_LOCAL or DAY_OF_WEEK fields. This is +// * equivalent to get(DOW_LOCAL) - 1. +// */ +// int32_t GregorianCalendar::computeRelativeDOW() const { +// int32_t relDow = 0; +// if (fStamp[UCAL_DOW_LOCAL] > fStamp[UCAL_DAY_OF_WEEK]) { +// relDow = internalGet(UCAL_DOW_LOCAL) - 1; // 1-based +// } else if (fStamp[UCAL_DAY_OF_WEEK] != kUnset) { +// relDow = internalGet(UCAL_DAY_OF_WEEK) - getFirstDayOfWeek(); +// if (relDow < 0) relDow += 7; +// } +// return relDow; +// } + +// /** +// * Compute the day of week, relative to the first day of week, +// * from 0..6 of the given julian day. +// */ +// int32_t GregorianCalendar::computeRelativeDOW(double julianDay) const { +// int32_t relDow = julianDayToDayOfWeek(julianDay) - getFirstDayOfWeek(); +// if (relDow < 0) { +// relDow += 7; +// } +// return relDow; +// } + +// /** +// * Compute the DOY using the WEEK_OF_YEAR field and the julian day +// * of the day BEFORE January 1 of a year (a return value from +// * computeJulianDayOfYear). +// */ +// int32_t GregorianCalendar::computeDOYfromWOY(double julianDayOfYear) const { +// // Compute DOY from day of week plus week of year + +// // Find the day of the week for the first of this year. This +// // is zero-based, with 0 being the locale-specific first day of +// // the week. Add 1 to get first day of year. +// int32_t fdy = computeRelativeDOW(julianDayOfYear + 1); + +// return +// // Compute doy of first (relative) DOW of WOY 1 +// (((7 - fdy) < getMinimalDaysInFirstWeek()) +// ? (8 - fdy) : (1 - fdy)) - // Adjust for the week number. - + (7 * (internalGet(UCAL_WEEK_OF_YEAR) - 1)) - - // Adjust for the DOW - + computeRelativeDOW(); -} - -double -GregorianCalendar::computeJulianDay(UBool isGregorian, int32_t year) -{ - // Assumes 'year' is gregorian. - // Find the most recent set of fields specifying the day within - // the year. These may be any of the following combinations: - // MONTH* + DAY_OF_MONTH* - // MONTH* + WEEK_OF_MONTH* + DAY_OF_WEEK - // MONTH* + DAY_OF_WEEK_IN_MONTH* + DAY_OF_WEEK - // DAY_OF_YEAR* - // WEEK_OF_YEAR* + DAY_OF_WEEK* - // WEEK_OF_YEAR* + DOW_LOCAL - // We look for the most recent of the fields marked thus*. If other - // fields are missing, we use their default values, which are those of - // the epoch start, or in the case of DAY_OF_WEEK, the first day in - // the week. - int32_t monthStamp = fStamp[UCAL_MONTH]; - int32_t domStamp = fStamp[UCAL_DATE]; - int32_t womStamp = fStamp[UCAL_WEEK_OF_MONTH]; - int32_t dowimStamp = fStamp[UCAL_DAY_OF_WEEK_IN_MONTH]; - int32_t doyStamp = fStamp[UCAL_DAY_OF_YEAR]; - int32_t woyStamp = fStamp[UCAL_WEEK_OF_YEAR]; - - UBool isLeap; - double julianDay; - - int32_t bestStamp = (monthStamp > domStamp) ? monthStamp : domStamp; - if (womStamp > bestStamp) bestStamp = womStamp; - if (dowimStamp > bestStamp) bestStamp = dowimStamp; - if (doyStamp > bestStamp) bestStamp = doyStamp; - if (woyStamp >= bestStamp) { - // Note use of >= here, rather than >. We will see woy == - // best if (a) all stamps are unset, in which case the - // specific handling of unset will be used below, or (b) all - // stamps are kInternallySet. In the latter case we want to - // use the YEAR_WOY if it is newer. - if (fStamp[UCAL_YEAR_WOY] > fStamp[UCAL_YEAR]) { - year = internalGet(UCAL_YEAR_WOY); - if (fStamp[UCAL_ERA] != kUnset && internalGet(UCAL_ERA) == BC) { - year = 1 - year; - } - // Only the WOY algorithm correctly handles YEAR_WOY, so - // force its use by making its stamp the most recent. - // This only affects the situation in which all stamps are - // equal (see above). - bestStamp = ++woyStamp; - } else if (woyStamp > bestStamp) { - // The WOY stamp is not only equal to, but newer than any - // other stamp. This means the WOY has been explicitly - // set, and will be used for computation. - bestStamp = woyStamp; - if (fStamp[UCAL_YEAR_WOY] != kUnset && fStamp[UCAL_YEAR_WOY] >= fStamp[UCAL_YEAR]) { - - // The YEAR_WOY is set, and is not superceded by the - // YEAR; use it. - year = internalGet(UCAL_YEAR_WOY); - } - - /* At this point we cannot avoid using the WEEK_OF_YEAR together - * with the YEAR field, since the YEAR_WOY is unavailable. Our goal - * is round-trip field integrity. We cannot guarantee round-trip - * time integrity because the YEAR + WOY combination may be - * ambiguous; consider a calendar with MDFW 3 and FDW Sunday. YEAR - * 1997 + WOY 1 + DOW Wednesday specifies two days: Jan 1 1997, and - * Dec 31 1997. However, we can guarantee that the YEAR fields, as - * set, will remain unchanged. - * - * In general, YEAR and YEAR_WOY are equal, but at the ends of the - * years, the YEAR and YEAR_WOY can differ by one. To detect this - * in WOY 1, we look at the position of WOY 1. If it extends into - * the previous year, then we check the DOW and see if it falls in - * the previous year. If so, we increment the year. This allows us - * to have round-trip integrity on the YEAR field. - * - * If the WOY is >= 52, then we do an intial computation of the DOY - * for the current year. If this exceeds the length of this year, - * we decrement the year. Again, this provides round-trip integrity - * on the YEAR field. - aliu - */ - - else if (internalGet(UCAL_WEEK_OF_YEAR) == 1) { - // YEAR_WOY has not been set, so we must use the YEAR. - // Since WOY computations rely on the YEAR_WOY, not the - // YEAR, we must guess at its value. It is usually equal - // to the YEAR, but may be one greater in WOY 1, and may - // be one less in WOY >= 52. Note that YEAR + WOY is - // ambiguous (YEAR_WOY + WOY is not). - - // FDW = Mon, MDFW = 2, Mon Dec 27 1999, WOY 1, YEAR_WOY 2000 - - // Find out where WOY 1 falls; some of it may extend - // into the previous year. If so, and if the DOW is - // one of those days, then increment the YEAR_WOY. - julianDay = computeJulianDayOfYear(isGregorian, year, isLeap); - int32_t fdy = computeRelativeDOW(1 + julianDay); - - int32_t doy = - (((7 - fdy) < getMinimalDaysInFirstWeek()) - ? (8 - fdy) : (1 - fdy)); - - if (doy < 1) { - // Some of WOY 1 for YEAR year extends into YEAR - // year-1 if doy < 1. doy == 0 -- 1 day of WOY 1 - // in previous year; doy == -1 -- 2 days, etc. - - // Compute the day of week, relative to the first day of week, - // from 0..6. - int32_t relDow = computeRelativeDOW(); - - // Range of days that are in YEAR year (as opposed - // to YEAR year-1) are DOY == 1..6+doy. Range of - // days of the week in YEAR year are fdy..fdy + 5 - // + doy. These are relative DOWs. - if ((relDow < fdy) || (relDow > (fdy + 5 + doy))) { - ++year; - } - } - - } else if (internalGet(UCAL_WEEK_OF_YEAR) >= 52) { - // FDW = Mon, MDFW = 4, Sat Jan 01 2000, WOY 52, YEAR_WOY 1999 - julianDay = computeJulianDayOfYear(isGregorian, year, isLeap); - if (computeDOYfromWOY(julianDay) > yearLength(year)) { - --year; - } - // It's tempting to take our julianDay and DOY here, in an else - // clause, and return them, since they are correct. However, - // this neglects the cutover adjustment, and it's easier to - // maintain the code if everything goes through the same control - // path below. - aliu - } - } - } +// // Adjust for the week number. +// + (7 * (internalGet(UCAL_WEEK_OF_YEAR) - 1)) - // The following if() clause checks if the month field - // predominates. This set of computations must be done BEFORE - // using the year, since the year value may be adjusted here. - UBool useMonth = FALSE; - int32_t month = 0; // SRL getDefaultMonth ? - if (bestStamp != kUnset && - (bestStamp == monthStamp || - bestStamp == domStamp || - bestStamp == womStamp || - bestStamp == dowimStamp)) { - useMonth = TRUE; - - // We have the month specified. Make it 0-based for the algorithm. - month = (monthStamp != kUnset) ? internalGet(UCAL_MONTH) - UCAL_JANUARY : getDefaultMonthInYear(); - - // If the month is out of range, adjust it into range - if (month < 0 || month > 11) { - int32_t rem[1]; - year += floorDivide(month, 12, rem); - month = rem[0]; - } - } - - // Compute the julian day number of the day BEFORE the first day of - // January 1, year 1 of the given calendar. If julianDay == 0, it - // specifies (Jan. 1, 1) - 1, in whatever calendar we are using (Julian - // or Gregorian). - julianDay = computeJulianDayOfYear(isGregorian, year, isLeap); - - if (useMonth) { - - // Move julianDay to the day BEFORE the first of the month. - julianDay += isLeap ? kLeapNumDays[month] : kNumDays[month]; - int32_t date = 0; - - if (bestStamp == domStamp || - bestStamp == monthStamp) { - - date = (domStamp != kUnset) ? internalGet(UCAL_DATE) : getDefaultDayInMonth(month); - } - else { // assert(bestStamp == womStamp || bestStamp == dowimStamp) - // Compute from day of week plus week number or from the day of - // week plus the day of week in month. The computations are - // almost identical. - - // Find the day of the week for the first of this month. This - // is zero-based, with 0 being the locale-specific first day of - // the week. Add 1 to get first day of month. - int32_t fdm = computeRelativeDOW(julianDay + 1); - - // Find the start of the first week. This will be a date from - // 1..-6. It represents the locale-specific first day of the - // week of the first day of the month, ignoring minimal days in - // first week. - date = 1 - fdm + ((fStamp[UCAL_DAY_OF_WEEK] != kUnset) ? - ((internalGet(UCAL_DAY_OF_WEEK) - getFirstDayOfWeek() + 7)%7) : 0); - - if (bestStamp == womStamp) { - // Adjust for minimal days in first week. - if ((7 - fdm) < getMinimalDaysInFirstWeek()) - date += 7; - - // Now adjust for the week number. - date += 7 * (internalGet(UCAL_WEEK_OF_MONTH) - 1); - } - else { // assert(bestStamp == dowimStamp) - // Adjust into the month, if needed. - if (date < 1) date += 7; - - // We are basing this on the day-of-week-in-month. The only - // trickiness occurs if the day-of-week-in-month is - // negative. - int32_t dim = internalGet(UCAL_DAY_OF_WEEK_IN_MONTH); - if (dim >= 0) { - date += 7*(dim - 1); - } else { - // Move date to the last of this day-of-week in this - // month, then back up as needed. If dim==-1, we don't - // back up at all. If dim==-2, we back up once, etc. - // Don't back up past the first of the given day-of-week - // in this month. Note that we handle -2, -3, - // etc. correctly, even though values < -1 are - // technically disallowed. - date += ((monthLength(internalGet(UCAL_MONTH), year) - date) / 7 + dim + 1) * 7; - } - } - } - - julianDay += date; - } - else { - // assert(bestStamp == doyStamp || bestStamp == woyStamp || - // bestStamp == UNSET). In the last case we should use January 1. - - // No month, start with January 0 (day before Jan 1), then adjust. - - int32_t doy = 0; - UBool doCutoverAdjustment = TRUE; - - if (bestStamp == kUnset) { - //doy = 1; - // For Gregorian the following will always be 1: kNumDays[UCAL_JANUARY] + 1 - int32_t defMonth = getDefaultMonthInYear(); // 0 for gregorian - int32_t defDay = getDefaultDayInMonth(defMonth); // 1 for gregorian - - doy = defDay + (isLeap ? kLeapNumDays[defMonth] : kNumDays[defMonth]); - doCutoverAdjustment = FALSE; - } - else if (bestStamp == doyStamp) { - doy = internalGet(UCAL_DAY_OF_YEAR); - } - else if (bestStamp == woyStamp) { - doy = computeDOYfromWOY(julianDay); - } - - // Adjust for cutover year [j81 - aliu] - if (doCutoverAdjustment && year == fGregorianCutoverYear && isGregorian) { - doy -= 10; - } - - julianDay += doy; - } - return julianDay; -} +// // Adjust for the DOW +// + computeRelativeDOW(); +// } // ------------------------------------- double GregorianCalendar::millisToJulianDay(UDate millis) { - return (double)kEpochStartAsJulianDay + floorDivide(millis, kOneDay); - //return kEpochStartAsJulianDay + uprv_trunc(millis / kOneDay); + return (double)kEpochStartAsJulianDay + Math::floorDivide(millis, (double)kOneDay); } // ------------------------------------- @@ -1316,63 +788,6 @@ GregorianCalendar::julianDayToMillis(double julian) return (UDate) ((julian - kEpochStartAsJulianDay) * (double) kOneDay); } -// ------------------------------------- - -double -GregorianCalendar::floorDivide(double numerator, double denominator) -{ - return uprv_floor(numerator / denominator); -} - -// ------------------------------------- - -int32_t -GregorianCalendar::floorDivide(int32_t numerator, int32_t denominator) -{ - // We do this computation in order to handle - // a numerator of Long.MIN_VALUE correctly - return (numerator >= 0) ? - numerator / denominator : - ((numerator + 1) / denominator) - 1; -} - -// ------------------------------------- - -int32_t -GregorianCalendar::floorDivide(int32_t numerator, int32_t denominator, int32_t remainder[]) -{ - if (numerator >= 0) { - remainder[0] = numerator % denominator; - return numerator / denominator; - } - int32_t quotient = ((numerator + 1) / denominator) - 1; - remainder[0] = numerator - (quotient * denominator); - return quotient; -} - -// ------------------------------------- - -int32_t -GregorianCalendar::floorDivide(double numerator, int32_t denominator, int32_t remainder[]) -{ - double quotient; - if (numerator >= 0) { - quotient = uprv_trunc(numerator / denominator); - remainder[0] = (int32_t)uprv_fmod(numerator, denominator); - } else { - quotient = uprv_trunc((numerator + 1) / denominator) - 1; - remainder[0] = (int32_t)(numerator - (quotient * denominator)); - } - if (quotient < INT32_MIN || quotient > INT32_MAX) { - // Normalize out of range values. It doesn't matter what - // we return for these cases; the data is wrong anyway. This - // only occurs for years near 2,000,000,000 CE/BCE. - quotient = 0.0; // Or whatever - } - return (int32_t)quotient; -} - - // ------------------------------------- int32_t @@ -1380,160 +795,7 @@ GregorianCalendar::aggregateStamp(int32_t stamp_a, int32_t stamp_b) { return (((stamp_a != kUnset && stamp_b != kUnset) ? uprv_max(stamp_a, stamp_b) - : kUnset)); -} - -// ------------------------------------- -void -GregorianCalendar::add(EDateFields field, int32_t amount, UErrorCode& status) { - add((UCalendarDateFields) field, amount, status); -} - -void -GregorianCalendar::add(UCalendarDateFields field, int32_t amount, UErrorCode& status) -{ - if (U_FAILURE(status)) - return; - - if (amount == 0) - return; // Do nothing! - complete(status); - - if (field == UCAL_YEAR || field == UCAL_YEAR_WOY) { - int32_t year = internalGet(field); - int32_t era = internalGetEra(); - year += (era == AD) ? amount : -amount; - if (year > 0) - set(field, year); - else { // year <= 0 - set(field, 1 - year); - // if year == 0, you get 1 BC - set(UCAL_ERA, (AD + BC) - era); - } - pinDayOfMonth(); - } - else if (field == UCAL_MONTH) { - int32_t month = internalGet(UCAL_MONTH) + amount; - if (month >= 0) { - add(UCAL_YEAR, (int32_t) (month / 12), status); - set(UCAL_MONTH, (int32_t) (month % 12)); - } - else { // month < 0 - - add(UCAL_YEAR, (int32_t) ((month + 1) / 12) - 1, status); - month %= 12; - if (month < 0) - month += 12; - set(UCAL_MONTH, UCAL_JANUARY + month); - } - pinDayOfMonth(); - } - else if (field == UCAL_ERA) { - int32_t era = internalGet(UCAL_ERA) + amount; - if (era < 0) - era = 0; - if (era > 1) - era = 1; - set(UCAL_ERA, era); - } - else { - // We handle most fields here. The algorithm is to add a computed amount - // of millis to the current millis. The only wrinkle is with DST -- if - // the result of the add operation is to move from DST to Standard, or vice - // versa, we need to adjust by an hour forward or back, respectively. - // Otherwise you get weird effects in which the hour seems to shift when - // you add to the DAY_OF_MONTH field, for instance. - - // We only adjust the DST for fields larger than an hour. For fields - // smaller than an hour, we cannot adjust for DST without causing problems. - // for instance, if you add one hour to April 5, 1998, 1:00 AM, in PST, - // the time becomes "2:00 AM PDT" (an illegal value), but then the adjustment - // sees the change and compensates by subtracting an hour. As a result the - // time doesn't advance at all. - - // {sfb} do we want to use a double here, or a int32_t? - // probably a double, since if we used a int32_t in the - // WEEK_OF_YEAR clause below, if delta was greater than approx. - // 7.1 we would reach the limit of a int32_t - double delta = amount; - UBool adjustDST = TRUE; - - switch (field) { - case UCAL_WEEK_OF_YEAR: - case UCAL_WEEK_OF_MONTH: - case UCAL_DAY_OF_WEEK_IN_MONTH: - delta *= 7 * 24 * 60 * 60 * 1000; // 7 days - break; - - case UCAL_AM_PM: - delta *= 12 * 60 * 60 * 1000; // 12 hrs - break; - - case UCAL_DATE: // synonym of DAY_OF_MONTH - case UCAL_DAY_OF_YEAR: - case UCAL_DAY_OF_WEEK: - case UCAL_DOW_LOCAL: - delta *= 24 * 60 * 60 * 1000; // 1 day - break; - - case UCAL_HOUR_OF_DAY: - case UCAL_HOUR: - delta *= 60 * 60 * 1000; // 1 hour - adjustDST = FALSE; - break; - - case UCAL_MINUTE: - delta *= 60 * 1000; // 1 minute - adjustDST = FALSE; - break; - - case UCAL_SECOND: - delta *= 1000; // 1 second - adjustDST = FALSE; - break; - - case UCAL_MILLISECOND: - adjustDST = FALSE; - break; - - case UCAL_ZONE_OFFSET: - case UCAL_DST_OFFSET: - default: - status = U_ILLEGAL_ARGUMENT_ERROR; - return; - } - - // In order to keep the hour invariant (for fields where this is - // appropriate), record the DST_OFFSET before and after the add() - // operation. If it has changed, then adjust the millis to - // compensate. - int32_t dst = 0; - int32_t hour = 0; - if (adjustDST) { - dst = get(UCAL_DST_OFFSET, status); - hour = internalGet(UCAL_HOUR_OF_DAY); - } - - setTimeInMillis(internalGetTime() + delta, status); - - if (adjustDST) { - dst -= get(UCAL_DST_OFFSET, status); - if (dst != 0) { - // We have done an hour-invariant adjustment but the - // DST offset has altered. We adjust millis to keep - // the hour constant. In cases such as midnight after - // a DST change which occurs at midnight, there is the - // danger of adjusting into a different day. To avoid - // this we make the adjustment only if it actually - // maintains the hour. - UDate t = internalGetTime(); - setTimeInMillis(t + dst, status); - if (get(UCAL_HOUR_OF_DAY, status) != hour) { - setTimeInMillis(t, status); - } - } - } - } + : (int32_t)kUnset)); } // ------------------------------------- @@ -1551,494 +813,343 @@ GregorianCalendar::roll(EDateFields field, int32_t amount, UErrorCode& status) { void GregorianCalendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& status) { - if(U_FAILURE(status)) - return; - - if (amount == 0) - return; // Nothing to do - + if((amount == 0) || U_FAILURE(status)) { + return; + } - int32_t min = 0, max = 0, gap; - if (field >= 0 && field < UCAL_FIELD_COUNT) { - complete(status); - min = getMinimum(field); - max = getMaximum(field); - } + // J81 processing. (gregorian cutover) + UBool inCutoverMonth = FALSE; + int32_t cMonthLen=0; // 'c' for cutover; in days + int32_t cDayOfMonth=0; // no discontinuity: [0, cMonthLen) + double cMonthStart=0.0; // in ms - /* Some of the fields require special handling to work in the month - * containing the Gregorian cutover point. Do shared computations - * for these fields here. [j81 - aliu] */ - UBool inCutoverMonth = FALSE; - int32_t cMonthLen=0; // 'c' for cutover; in days - int32_t cDayOfMonth=0; // no discontinuity: [0, cMonthLen) - double cMonthStart=0.0; // in ms - if (field == UCAL_DATE || field == UCAL_WEEK_OF_MONTH) { - max = monthLength(internalGet(UCAL_MONTH)); - double t = internalGetTime(); + // Common code - see if we're in the cutover month of the cutover year + if(get(UCAL_EXTENDED_YEAR, status) == fGregorianCutoverYear) { + switch (field) { + case UCAL_DAY_OF_MONTH: + case UCAL_WEEK_OF_MONTH: + { + int32_t max = monthLength(internalGet(UCAL_MONTH)); + UDate t = internalGetTime(); // We subtract 1 from the DAY_OF_MONTH to make it zero-based, and an - // additional 10 if we are after the cutover. Thus the monthStart + // additional 10 if we are after the cutover. Thus the monthStart // value will be correct iff we actually are in the cutover month. - cDayOfMonth = internalGet(UCAL_DATE) - ((t >= fGregorianCutover) ? 10 : 0); + cDayOfMonth = internalGet(UCAL_DAY_OF_MONTH) - ((t >= fGregorianCutover) ? 10 : 0); cMonthStart = t - ((cDayOfMonth - 1) * kOneDay); - // A month containing the cutover is 10 days shorter. if ((cMonthStart < fGregorianCutover) && (cMonthStart + (cMonthLen=(max-10))*kOneDay >= fGregorianCutover)) { - inCutoverMonth = TRUE; - } - } - - switch (field) { - case UCAL_ERA: - case UCAL_YEAR: - case UCAL_YEAR_WOY: - case UCAL_AM_PM: - case UCAL_MINUTE: - case UCAL_SECOND: - case UCAL_MILLISECOND: - // These fields are handled simply, since they have fixed minima - // and maxima. The field DAY_OF_MONTH is almost as simple. Other - // fields are complicated, since the range within they must roll - // varies depending on the date. - break; - - case UCAL_HOUR: - case UCAL_HOUR_OF_DAY: - // Rolling the hour is difficult on the ONSET and CEASE days of - // daylight savings. For example, if the change occurs at - // 2 AM, we have the following progression: - // ONSET: 12 Std -> 1 Std -> 3 Dst -> 4 Dst - // CEASE: 12 Dst -> 1 Dst -> 1 Std -> 2 Std - // To get around this problem we don't use fields; we manipulate - // the time in millis directly. - { - // Assume min == 0 in calculations below - UDate start = getTime(status); - int32_t oldHour = internalGet(field); - int32_t newHour = (oldHour + amount) % (max + 1); - if(newHour < 0) - newHour += max + 1; - setTime(start + ((double)U_MILLIS_PER_HOUR * (newHour - oldHour)), status); - return; - } - case UCAL_MONTH: - // Rolling the month involves both pinning the final value to [0, 11] - // and adjusting the DAY_OF_MONTH if necessary. We only adjust the - // DAY_OF_MONTH if, after updating the MONTH field, it is illegal. - // E.g., .roll(MONTH, 1) -> or . - { - int32_t mon = (internalGet(UCAL_MONTH) + amount) % 12; - if (mon < 0) - mon += 12; - set(UCAL_MONTH, mon); - - // Keep the day of month in range. We don't want to spill over - // into the next month; e.g., we don't want jan31 + 1 mo -> feb31 -> - // mar3. - // NOTE: We could optimize this later by checking for dom <= 28 - // first. Do this if there appears to be a need. [LIU] - int32_t monthLen = monthLength(mon); - int32_t dom = internalGet(UCAL_DATE); - if (dom > monthLen) - set(UCAL_DATE, monthLen); - return; - } - - case UCAL_WEEK_OF_YEAR: - { - // Unlike WEEK_OF_MONTH, WEEK_OF_YEAR never shifts the day of the - // week. However, rolling the week of the year can have seemingly - // strange effects simply because the year of the week of year - // may be different from the calendar year. For example, the - // date Dec 28, 1997 is the first day of week 1 of 1998 (if - // weeks start on Sunday and the minimal days in first week is - // <= 3). - int32_t woy = internalGet(UCAL_WEEK_OF_YEAR); - // Get the ISO year, which matches the week of year. This - // may be one year before or after the calendar year. - int32_t isoYear = internalGet(UCAL_YEAR_WOY); - int32_t isoDoy = internalGet(UCAL_DAY_OF_YEAR); - if (internalGet(UCAL_MONTH) == UCAL_JANUARY) { - if (woy >= 52) { - isoDoy += yearLength(isoYear); - } - } - else { - if (woy == 1) { - isoDoy -= yearLength(isoYear-1); - } - } - woy += amount; - // Do fast checks to avoid unnecessary computation: - if (woy < 1 || woy > 52) { - // Determine the last week of the ISO year. - // We do this using the standard formula we use - // everywhere in this file. If we can see that the - // days at the end of the year are going to fall into - // week 1 of the next year, we drop the last week by - // subtracting 7 from the last day of the year. - int32_t lastDoy = yearLength(isoYear); - int32_t lastRelDow = (lastDoy - isoDoy + internalGet(UCAL_DAY_OF_WEEK) - - getFirstDayOfWeek()) % 7; - if (lastRelDow < 0) - lastRelDow += 7; - if ((6 - lastRelDow) >= getMinimalDaysInFirstWeek()) - lastDoy -= 7; - int32_t lastWoy = weekNumber(lastDoy, lastRelDow + 1); - woy = ((woy + lastWoy - 1) % lastWoy) + 1; - } - set(UCAL_WEEK_OF_YEAR, woy); - set(UCAL_YEAR_WOY, isoYear); // make YEAR_WOY timestamp > YEAR timestamp - return; - } - case UCAL_WEEK_OF_MONTH: - { - // This is tricky, because during the roll we may have to shift - // to a different day of the week. For example: - - // s m t w r f s - // 1 2 3 4 5 - // 6 7 8 9 10 11 12 - - // When rolling from the 6th or 7th back one week, we go to the - // 1st (assuming that the first partial week counts). The same - // thing happens at the end of the month. - - // The other tricky thing is that we have to figure out whether - // the first partial week actually counts or not, based on the - // minimal first days in the week. And we have to use the - // correct first day of the week to delineate the week - // boundaries. - - // Here's our algorithm. First, we find the real boundaries of - // the month. Then we discard the first partial week if it - // doesn't count in this locale. Then we fill in the ends with - // phantom days, so that the first partial week and the last - // partial week are full weeks. We then have a nice square - // block of weeks. We do the usual rolling within this block, - // as is done elsewhere in this method. If we wind up on one of - // the phantom days that we added, we recognize this and pin to - // the first or the last day of the month. Easy, eh? - - // Another wrinkle: To fix jitterbug 81, we have to make all this - // work in the oddball month containing the Gregorian cutover. - // This month is 10 days shorter than usual, and also contains - // a discontinuity in the days; e.g., the default cutover month - // is Oct 1582, and goes from day of month 4 to day of month 15. - - // Normalize the DAY_OF_WEEK so that 0 is the first day of the week - // in this locale. We have dow in 0..6. - int32_t dow = internalGet(UCAL_DAY_OF_WEEK) - getFirstDayOfWeek(); - if (dow < 0) - dow += 7; - - // Find the day of month, compensating for cutover discontinuity. - int32_t dom = inCutoverMonth ? cDayOfMonth : internalGet(UCAL_DATE); - - // Find the day of the week (normalized for locale) for the first - // of the month. - int32_t fdm = (dow - dom + 1) % 7; - if (fdm < 0) - fdm += 7; - - // Get the first day of the first full week of the month, - // including phantom days, if any. Figure out if the first week - // counts or not; if it counts, then fill in phantom days. If - // not, advance to the first real full week (skip the partial week). - int32_t start; - if ((7 - fdm) < getMinimalDaysInFirstWeek()) - start = 8 - fdm; // Skip the first partial week - else - start = 1 - fdm; // This may be zero or negative - - // Get the day of the week (normalized for locale) for the last - // day of the month. - int32_t monthLen = inCutoverMonth ? cMonthLen : monthLength(internalGet(UCAL_MONTH)); - int32_t ldm = (monthLen - dom + dow) % 7; - // We know monthLen >= DAY_OF_MONTH so we skip the += 7 step here. - - // Get the limit day for the blocked-off rectangular month; that - // is, the day which is one past the last day of the month, - // after the month has already been filled in with phantom days - // to fill out the last week. This day has a normalized DOW of 0. - int32_t limit = monthLen + 7 - ldm; - - // Now roll between start and (limit - 1). - gap = limit - start; - int32_t newDom = (dom + amount*7 - start) % gap; - if (newDom < 0) - newDom += gap; - newDom += start; - - // Finally, pin to the real start and end of the month. - if (newDom < 1) - newDom = 1; - if (newDom > monthLen) - newDom = monthLen; - - // Set the DAY_OF_MONTH. We rely on the fact that this field - // takes precedence over everything else (since all other fields - // are also set at this point). If this fact changes (if the - // disambiguation algorithm changes) then we will have to unset - // the appropriate fields here so that DAY_OF_MONTH is attended - // to. - - // If we are in the cutover month, manipulate ms directly. Don't do - // this in general because it doesn't work across DST boundaries - // (details, details). This takes care of the discontinuity. - if (inCutoverMonth) { - setTimeInMillis(cMonthStart + (newDom-1)*kOneDay, status); - } else { - set(UCAL_DATE, newDom); - } - return; - } - case UCAL_DATE: - if (inCutoverMonth) { - // The default computation works except when the current month - // contains the Gregorian cutover. We handle this special case - // here. [j81 - aliu] - double monthLen = cMonthLen * kOneDay; - double msIntoMonth = uprv_fmod(internalGetTime() - cMonthStart + - amount * kOneDay, monthLen); - if (msIntoMonth < 0) { - msIntoMonth += monthLen; - } - setTimeInMillis(cMonthStart + msIntoMonth, status); - return; - } else { - max = monthLength(internalGet(UCAL_MONTH)); - // ...else fall through to default computation + inCutoverMonth = TRUE; } - break; - case UCAL_DAY_OF_YEAR: - { - // Roll the day of year using millis. Compute the millis for - // the start of the year, and get the length of the year. - double delta = amount * kOneDay; // Scale up from days to millis - double min2 = internalGetTime() - (internalGet(UCAL_DAY_OF_YEAR) - 1) * kOneDay; - int32_t yearLen = yearLength(); - internalSetTime( uprv_fmod((internalGetTime() + delta - min2), (yearLen * kOneDay))); - if (internalGetTime() < 0) - internalSetTime( internalGetTime() + yearLen * kOneDay); - - setTimeInMillis(internalGetTime() + min2, status); - return; - } - - case UCAL_DAY_OF_WEEK: - case UCAL_DOW_LOCAL: - { - // Roll the day of week using millis. Compute the millis for - // the start of the week, using the first day of week setting. - // Restrict the millis to [start, start+7days). - double delta = amount * kOneDay; // Scale up from days to millis - // Compute the number of days before the current day in this - // week. This will be a value 0..6. - int32_t leadDays = internalGet(field) - - ((field == UCAL_DAY_OF_WEEK) ? getFirstDayOfWeek() : 1); - if (leadDays < 0) - leadDays += 7; - double min2 = internalGetTime() - leadDays * kOneDay; - internalSetTime(uprv_fmod((internalGetTime() + delta - min2), kOneWeek)); - if (internalGetTime() < 0) - internalSetTime(internalGetTime() + kOneWeek); - setTimeInMillis(internalGetTime() + min2, status); - return; - } - case UCAL_DAY_OF_WEEK_IN_MONTH: - { - // Roll the day of week in the month using millis. Determine - // the first day of the week in the month, and then the last, - // and then roll within that range. - double delta = amount * kOneWeek; // Scale up from weeks to millis - // Find the number of same days of the week before this one - // in this month. - int32_t preWeeks = (internalGet(UCAL_DATE) - 1) / 7; - // Find the number of same days of the week after this one - // in this month. - int32_t postWeeks = (monthLength(internalGet(UCAL_MONTH)) - internalGet(UCAL_DATE)) / 7; - // From these compute the min and gap millis for rolling. - double min2 = internalGetTime() - preWeeks * kOneWeek; - double gap2 = kOneWeek * (preWeeks + postWeeks + 1); // Must add 1! - // Roll within this range - internalSetTime(uprv_fmod((internalGetTime() + delta - min2), gap2)); - if (internalGetTime() < 0) - internalSetTime(internalGetTime() + gap2); - setTimeInMillis(internalGetTime() + min2, status); - return; - } - case UCAL_ZONE_OFFSET: - case UCAL_DST_OFFSET: + } default: - status = U_ILLEGAL_ARGUMENT_ERROR; - return; - // These fields cannot be rolled + ; } + } - // These are the standard roll instructions. These work for all - // simple cases, that is, cases in which the limits are fixed, such - // as the hour, the month, and the era. - gap = max - min + 1; - int32_t value = internalGet(field) + amount; - value = (value - min) % gap; - if (value < 0) - value += gap; - value += min; + switch (field) { + case UCAL_WEEK_OF_YEAR: { + // Unlike WEEK_OF_MONTH, WEEK_OF_YEAR never shifts the day of the + // week. Also, rolling the week of the year can have seemingly + // strange effects simply because the year of the week of year + // may be different from the calendar year. For example, the + // date Dec 28, 1997 is the first day of week 1 of 1998 (if + // weeks start on Sunday and the minimal days in first week is + // <= 3). + int32_t woy = get(UCAL_WEEK_OF_YEAR, status); + // Get the ISO year, which matches the week of year. This + // may be one year before or after the calendar year. + int32_t isoYear = get(UCAL_YEAR_WOY, status); + int32_t isoDoy = internalGet(UCAL_DAY_OF_YEAR); + if (internalGet(UCAL_MONTH) == UCAL_JANUARY) { + if (woy >= 52) { + isoDoy += handleGetYearLength(isoYear); + } + } else { + if (woy == 1) { + isoDoy -= handleGetYearLength(isoYear - 1); + } + } + woy += amount; + // Do fast checks to avoid unnecessary computation: + if (woy < 1 || woy > 52) { + // Determine the last week of the ISO year. + // We do this using the standard formula we use + // everywhere in this file. If we can see that the + // days at the end of the year are going to fall into + // week 1 of the next year, we drop the last week by + // subtracting 7 from the last day of the year. + int32_t lastDoy = handleGetYearLength(isoYear); + int32_t lastRelDow = (lastDoy - isoDoy + internalGet(UCAL_DAY_OF_WEEK) - + getFirstDayOfWeek()) % 7; + if (lastRelDow < 0) lastRelDow += 7; + if ((6 - lastRelDow) >= getMinimalDaysInFirstWeek()) lastDoy -= 7; + int32_t lastWoy = weekNumber(lastDoy, lastRelDow + 1); + woy = ((woy + lastWoy - 1) % lastWoy) + 1; + } + set(UCAL_WEEK_OF_YEAR, woy); + set(UCAL_YEAR_WOY,isoYear); + return; + } - set(field, value); + case UCAL_DAY_OF_MONTH: + if( !inCutoverMonth ) { + Calendar::roll(field, amount, status); + return; + } else { + // [j81] 1582 special case for DOM + // The default computation works except when the current month + // contains the Gregorian cutover. We handle this special case + // here. [j81 - aliu] + double monthLen = cMonthLen * kOneDay; + double msIntoMonth = uprv_fmod(internalGetTime() - cMonthStart + + amount * kOneDay, monthLen); + if (msIntoMonth < 0) { + msIntoMonth += monthLen; + } +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d: roll DOM %d -> %.0lf ms \n", + __FILE__, __LINE__,amount, cMonthLen, cMonthStart+msIntoMonth); +#endif + setTimeInMillis(cMonthStart + msIntoMonth, status); + return; + } + case UCAL_WEEK_OF_MONTH: + if( !inCutoverMonth ) { + Calendar::roll(field, amount, status); + return; + } else { +#if defined (U_DEBUG_CAL) + fprintf(stderr, "%s:%d: roll WOM %d ??????????????????? \n", + __FILE__, __LINE__,amount); +#endif + // NOTE: following copied from the old + // GregorianCalendar::roll( WEEK_OF_MONTH ) code + + // This is tricky, because during the roll we may have to shift + // to a different day of the week. For example: + + // s m t w r f s + // 1 2 3 4 5 + // 6 7 8 9 10 11 12 + + // When rolling from the 6th or 7th back one week, we go to the + // 1st (assuming that the first partial week counts). The same + // thing happens at the end of the month. + + // The other tricky thing is that we have to figure out whether + // the first partial week actually counts or not, based on the + // minimal first days in the week. And we have to use the + // correct first day of the week to delineate the week + // boundaries. + + // Here's our algorithm. First, we find the real boundaries of + // the month. Then we discard the first partial week if it + // doesn't count in this locale. Then we fill in the ends with + // phantom days, so that the first partial week and the last + // partial week are full weeks. We then have a nice square + // block of weeks. We do the usual rolling within this block, + // as is done elsewhere in this method. If we wind up on one of + // the phantom days that we added, we recognize this and pin to + // the first or the last day of the month. Easy, eh? + + // Another wrinkle: To fix jitterbug 81, we have to make all this + // work in the oddball month containing the Gregorian cutover. + // This month is 10 days shorter than usual, and also contains + // a discontinuity in the days; e.g., the default cutover month + // is Oct 1582, and goes from day of month 4 to day of month 15. + + // Normalize the DAY_OF_WEEK so that 0 is the first day of the week + // in this locale. We have dow in 0..6. + int32_t dow = internalGet(UCAL_DAY_OF_WEEK) - getFirstDayOfWeek(); + if (dow < 0) + dow += 7; + + // Find the day of month, compensating for cutover discontinuity. + int32_t dom = cDayOfMonth; + + // Find the day of the week (normalized for locale) for the first + // of the month. + int32_t fdm = (dow - dom + 1) % 7; + if (fdm < 0) + fdm += 7; + + // Get the first day of the first full week of the month, + // including phantom days, if any. Figure out if the first week + // counts or not; if it counts, then fill in phantom days. If + // not, advance to the first real full week (skip the partial week). + int32_t start; + if ((7 - fdm) < getMinimalDaysInFirstWeek()) + start = 8 - fdm; // Skip the first partial week + else + start = 1 - fdm; // This may be zero or negative + + // Get the day of the week (normalized for locale) for the last + // day of the month. + int32_t monthLen = cMonthLen; + int32_t ldm = (monthLen - dom + dow) % 7; + // We know monthLen >= DAY_OF_MONTH so we skip the += 7 step here. + + // Get the limit day for the blocked-off rectangular month; that + // is, the day which is one past the last day of the month, + // after the month has already been filled in with phantom days + // to fill out the last week. This day has a normalized DOW of 0. + int32_t limit = monthLen + 7 - ldm; + + // Now roll between start and (limit - 1). + int32_t gap = limit - start; + int32_t newDom = (dom + amount*7 - start) % gap; + if (newDom < 0) + newDom += gap; + newDom += start; + + // Finally, pin to the real start and end of the month. + if (newDom < 1) + newDom = 1; + if (newDom > monthLen) + newDom = monthLen; + + // Set the DAY_OF_MONTH. We rely on the fact that this field + // takes precedence over everything else (since all other fields + // are also set at this point). If this fact changes (if the + // disambiguation algorithm changes) then we will have to unset + // the appropriate fields here so that DAY_OF_MONTH is attended + // to. + + // If we are in the cutover month, manipulate ms directly. Don't do + // this in general because it doesn't work across DST boundaries + // (details, details). This takes care of the discontinuity. + setTimeInMillis(cMonthStart + (newDom-1)*kOneDay, status); + return; + } + + default: + Calendar::roll(field, amount, status); + return; + } } // ------------------------------------- -int32_t -GregorianCalendar::getMinimum(EDateFields field) const { - return getMinimum((UCalendarDateFields) field); -} -int32_t -GregorianCalendar::getMinimum(UCalendarDateFields field) const -{ - return kMinValues[field]; -} -// ------------------------------------- -int32_t -GregorianCalendar::getMaximum(EDateFields field) const +/** + * Return the minimum value that this field could have, given the current date. + * For the Gregorian calendar, this is the same as getMinimum() and getGreatestMinimum(). + * @param field the time field. + * @return the minimum value that this field could have, given the current date. + * @deprecated ICU 2.6. Use getActualMinimum(UCalendarDateFields field) instead. + */ +int32_t GregorianCalendar::getActualMinimum(EDateFields field) const { - return getMaximum((UCalendarDateFields) field); + return getMinimum((UCalendarDateFields)field); } -int32_t -GregorianCalendar::getMaximum(UCalendarDateFields field) const +int32_t GregorianCalendar::getActualMinimum(EDateFields field, UErrorCode& /* status */) const { - return kMaxValues[field]; + return getMinimum((UCalendarDateFields)field); } -// ------------------------------------- -int32_t -GregorianCalendar::getGreatestMinimum(EDateFields field) const +/** + * Return the minimum value that this field could have, given the current date. + * For the Gregorian calendar, this is the same as getMinimum() and getGreatestMinimum(). + * @param field the time field. + * @return the minimum value that this field could have, given the current date. + * @draft ICU 2.6. + */ +int32_t GregorianCalendar::getActualMinimum(UCalendarDateFields field, UErrorCode& /* status */) const { - return getGreatestMinimum((UCalendarDateFields) field); + return getMinimum(field); } -int32_t -GregorianCalendar::getGreatestMinimum(UCalendarDateFields field) const -{ - return kMinValues[field]; -} -// ------------------------------------- -int32_t -GregorianCalendar::getLeastMaximum(EDateFields field) const -{ - return getLeastMaximum((UCalendarDateFields) field); -} +// ------------------------------------ -int32_t -GregorianCalendar::getLeastMaximum(UCalendarDateFields field) const -{ - return kLeastMaxValues[field]; -} - -// ------------------------------------- -int32_t -GregorianCalendar::getActualMinimum(EDateFields field) const -{ - return getActualMinimum((UCalendarDateFields) field); -} +/** + * Old year limits were least max 292269054, max 292278994. + */ -int32_t -GregorianCalendar::getActualMinimum(UCalendarDateFields field) const -{ - return getMinimum(field); +/** + * @stable ICU 2.0 + */ +int32_t GregorianCalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) const { + return kGregorianCalendarLimits[field][limitType]; } -// ------------------------------------- - -int32_t -GregorianCalendar::getActualMaximum(UCalendarDateFields field) const +/** + * Return the maximum value that this field could have, given the current date. + * For example, with the date "Feb 3, 1997" and the DAY_OF_MONTH field, the actual + * maximum would be 28; for "Feb 3, 1996" it s 29. Similarly for a Hebrew calendar, + * for some years the actual maximum for MONTH is 12, and for others 13. + * @stable ICU 2.0 + */ +int32_t GregorianCalendar::getActualMaximum(UCalendarDateFields field, UErrorCode& status) const { /* It is a known limitation that the code here (and in getActualMinimum) - * won't behave properly at the extreme limits of GregorianCalendar's - * representable range (except for the code that handles the YEAR - * field). That's because the ends of the representable range are at - * odd spots in the year. For calendars with the default Gregorian - * cutover, these limits are Sun Dec 02 16:47:04 GMT 292269055 BC to Sun - * Aug 17 07:12:55 GMT 292278994 AD, somewhat different for non-GMT - * zones. As a result, if the calendar is set to Aug 1 292278994 AD, - * the actual maximum of DAY_OF_MONTH is 17, not 30. If the date is Mar - * 31 in that year, the actual maximum month might be Jul, whereas is - * the date is Mar 15, the actual maximum might be Aug -- depending on - * the precise semantics that are desired. Similar considerations - * affect all fields. Nonetheless, this effect is sufficiently arcane - * that we permit it, rather than complicating the code to handle such - * intricacies. - liu 8/20/98 */ - - UErrorCode status = U_ZERO_ERROR; + * won't behave properly at the extreme limits of GregorianCalendar's + * representable range (except for the code that handles the YEAR + * field). That's because the ends of the representable range are at + * odd spots in the year. For calendars with the default Gregorian + * cutover, these limits are Sun Dec 02 16:47:04 GMT 292269055 BC to Sun + * Aug 17 07:12:55 GMT 292278994 AD, somewhat different for non-GMT + * zones. As a result, if the calendar is set to Aug 1 292278994 AD, + * the actual maximum of DAY_OF_MONTH is 17, not 30. If the date is Mar + * 31 in that year, the actual maximum month might be Jul, whereas is + * the date is Mar 15, the actual maximum might be Aug -- depending on + * the precise semantics that are desired. Similar considerations + * affect all fields. Nonetheless, this effect is sufficiently arcane + * that we permit it, rather than complicating the code to handle such + * intricacies. - liu 8/20/98 + + * UPDATE: No longer true, since we have pulled in the limit values on + * the year. - Liu 11/6/00 */ switch (field) { - // we have functions that enable us to fast-path number of days in month - // of year - case UCAL_DATE: - return monthLength(get(UCAL_MONTH, status)); - - case UCAL_DAY_OF_YEAR: - return yearLength(); - - // for week of year, week of month, or day of week in month, we - // just fall back on the default implementation in Calendar (I'm not sure - // we could do better by having special calculations here) - case UCAL_WEEK_OF_YEAR: - case UCAL_WEEK_OF_MONTH: - case UCAL_DAY_OF_WEEK_IN_MONTH: - return Calendar::getActualMaximum(field, status); case UCAL_YEAR: - case UCAL_YEAR_WOY: /* The year computation is no different, in principle, from the - * others, however, the range of possible maxima is large. In - * addition, the way we know we've exceeded the range is different. - * For these reasons, we use the special case code below to handle - * this field. - * - * The actual maxima for YEAR depend on the type of calendar: - * - * Gregorian = May 17, 292275056 BC - Aug 17, 292278994 AD - * Julian = Dec 2, 292269055 BC - Jan 3, 292272993 AD - * Hybrid = Dec 2, 292269055 BC - Aug 17, 292278994 AD - * - * We know we've exceeded the maximum when either the month, date, - * time, or era changes in response to setting the year. We don't - * check for month, date, and time here because the year and era are - * sufficient to detect an invalid year setting. NOTE: If code is - * added to check the month and date in the future for some reason, - * Feb 29 must be allowed to shift to Mar 1 when setting the year. - */ + * others, however, the range of possible maxima is large. In + * addition, the way we know we've exceeded the range is different. + * For these reasons, we use the special case code below to handle + * this field. + * + * The actual maxima for YEAR depend on the type of calendar: + * + * Gregorian = May 17, 292275056 BC - Aug 17, 292278994 AD + * Julian = Dec 2, 292269055 BC - Jan 3, 292272993 AD + * Hybrid = Dec 2, 292269055 BC - Aug 17, 292278994 AD + * + * We know we've exceeded the maximum when either the month, date, + * time, or era changes in response to setting the year. We don't + * check for month, date, and time here because the year and era are + * sufficient to detect an invalid year setting. NOTE: If code is + * added to check the month and date in the future for some reason, + * Feb 29 must be allowed to shift to Mar 1 when setting the year. + */ { - Calendar *cal = (Calendar*)this->clone(); + if(U_FAILURE(status)) return 0; + Calendar *cal = clone(); + if(!cal) { + status = U_MEMORY_ALLOCATION_ERROR; + return 0; + } + cal->setLenient(TRUE); int32_t era = cal->get(UCAL_ERA, status); - if(U_FAILURE(status)) - return 0; - UDate d = cal->getTime(status); - if(U_FAILURE(status)) - return 0; /* Perform a binary search, with the invariant that lowGood is a - * valid year, and highBad is an out of range year. - */ - int32_t lowGood = getLeastMaximum(field); - int32_t highBad = getMaximum(field) + 1; - while((lowGood + 1) < highBad) { + * valid year, and highBad is an out of range year. + */ + int32_t lowGood = kGregorianCalendarLimits[UCAL_YEAR][1]; + int32_t highBad = kGregorianCalendarLimits[UCAL_YEAR][2]+1; + while ((lowGood + 1) < highBad) { int32_t y = (lowGood + highBad) / 2; - cal->set(field, y); - if(cal->get(field, status) == y && cal->get(UCAL_ERA, status) == era) { + cal->set(UCAL_YEAR, y); + if (cal->get(UCAL_YEAR, status) == y && cal->get(UCAL_ERA, status) == era) { lowGood = y; - } - else { + } else { highBad = y; cal->setTime(d, status); // Restore original fields } @@ -2048,13 +1159,58 @@ GregorianCalendar::getActualMaximum(UCalendarDateFields field) const return lowGood; } - // and we know none of the other fields have variable maxima in - // GregorianCalendar, so we can just return the fixed maximum default: - return getMaximum(field); + return Calendar::getActualMaximum(field,status); } } + +int32_t GregorianCalendar::handleGetExtendedYear() { + int32_t year = kEpochYear; + switch(resolveFields(kYearPrecedence)) { + case UCAL_EXTENDED_YEAR: + year = internalGet(UCAL_EXTENDED_YEAR, kEpochYear); + break; + + case UCAL_YEAR: + { + // The year defaults to the epoch start, the era to AD + int32_t era = internalGet(UCAL_ERA, AD); + if (era == BC) { + year = 1 - internalGet(UCAL_YEAR, 1); // Convert to extended year + } else { + year = internalGet(UCAL_YEAR, kEpochYear); + } + } + break; + + case UCAL_YEAR_WOY: + year = handleGetExtendedYearFromWeekFields(internalGet(UCAL_YEAR_WOY), internalGet(UCAL_WEEK_OF_YEAR)); +#if defined (U_DEBUG_CAL) + // if(internalGet(UCAL_YEAR_WOY) != year) { + fprintf(stderr, "%s:%d: hGEYFWF[%d,%d] -> %d\n", + __FILE__, __LINE__,internalGet(UCAL_YEAR_WOY),internalGet(UCAL_WEEK_OF_YEAR),year); + //} +#endif + break; + + default: + year = kEpochYear; + } + return year; +} + +int32_t GregorianCalendar::handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy) +{ + // convert year to extended form + int32_t era = internalGet(UCAL_ERA, AD); + if(era == BC) { + yearWoy = 1 - yearWoy; + } + return Calendar::handleGetExtendedYearFromWeekFields(yearWoy, woy); +} + + // ------------------------------------- UBool @@ -2077,7 +1233,7 @@ GregorianCalendar::inDaylightTime(UErrorCode& status) const */ int32_t GregorianCalendar::internalGetEra() const { - return isSet(UCAL_ERA) ? internalGet(UCAL_ERA) : AD; + return isSet(UCAL_ERA) ? internalGet(UCAL_ERA) : (int32_t)AD; } const char * @@ -2087,10 +1243,7 @@ GregorianCalendar::getType() const { return "gregorian"; } -// ------ Default Century functions moved here from SimpleDateFormat - -// uncomment in 2.8 -//const UDate GregorianCalendar::fgSystemDefaultCentury = DBL_MIN; +const UDate GregorianCalendar::fgSystemDefaultCentury = DBL_MIN; const int32_t GregorianCalendar::fgSystemDefaultCenturyYear = -1; UDate GregorianCalendar::fgSystemDefaultCenturyStart = DBL_MIN; @@ -2119,7 +1272,7 @@ GregorianCalendar::internalGetDefaultCenturyStart() const UBool needsUpdate; { Mutex m; - needsUpdate = (fgSystemDefaultCenturyStart == SimpleDateFormat::fgSystemDefaultCentury); + needsUpdate = (fgSystemDefaultCenturyStart == fgSystemDefaultCentury); } if (needsUpdate) { @@ -2139,7 +1292,7 @@ GregorianCalendar::internalGetDefaultCenturyStartYear() const UBool needsUpdate; { Mutex m; - needsUpdate = (fgSystemDefaultCenturyStart == SimpleDateFormat::fgSystemDefaultCentury); + needsUpdate = (fgSystemDefaultCenturyStart == fgSystemDefaultCentury); } if (needsUpdate) { @@ -2159,7 +1312,7 @@ GregorianCalendar::initializeSystemDefaultCentury() // on the current time. They'll be set to 80 years before // the current time. // No point in locking as it should be idempotent. - if (fgSystemDefaultCenturyStart == SimpleDateFormat::fgSystemDefaultCentury) + if (fgSystemDefaultCenturyStart == fgSystemDefaultCentury) { UErrorCode status = U_ZERO_ERROR; Calendar *calendar = new GregorianCalendar(status); @@ -2188,4 +1341,3 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ //eof - diff --git a/icuSources/i18n/gregoimp.cpp b/icuSources/i18n/gregoimp.cpp new file mode 100644 index 00000000..52d4e1d4 --- /dev/null +++ b/icuSources/i18n/gregoimp.cpp @@ -0,0 +1,270 @@ +/* +********************************************************************** +* Copyright (c) 2003-2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Author: Alan Liu +* Created: September 2 2003 +* Since: ICU 2.8 +********************************************************************** +*/ +#include "gregoimp.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/ucal.h" +#include "uresimp.h" +#include "cstring.h" +#include "uassert.h" + +int32_t Math::floorDivide(int32_t numerator, int32_t denominator) { + return (numerator >= 0) ? + numerator / denominator : ((numerator + 1) / denominator) - 1; +} + +int32_t Math::floorDivide(double numerator, int32_t denominator, + int32_t& remainder) { + double quotient; + quotient = uprv_floor(numerator / denominator); + remainder = (int32_t) (numerator - (quotient * denominator)); + return (int32_t) quotient; +} + +double Math::floorDivide(double dividend, double divisor, + double& remainder) { + // Only designed to work for positive divisors + U_ASSERT(divisor > 0); + double quotient = floorDivide(dividend, divisor); + remainder = dividend - (quotient * divisor); + // N.B. For certain large dividends, on certain platforms, there + // is a bug such that the quotient is off by one. If you doubt + // this to be true, set a breakpoint below and run cintltst. + if (remainder < 0 || remainder >= divisor) { + // E.g. 6.7317038241449352e+022 / 86400000.0 is wrong on my + // machine (too high by one). 4.1792057231752762e+024 / + // 86400000.0 is wrong the other way (too low). + double q = quotient; + quotient += (remainder < 0) ? -1 : +1; + if (q == quotient) { + // For quotients > ~2^53, we won't be able to add or + // subtract one, since the LSB of the mantissa will be > + // 2^0; that is, the exponent (base 2) will be larger than + // the length, in bits, of the mantissa. In that case, we + // can't give a correct answer, so we set the remainder to + // zero. This has the desired effect of making extreme + // values give back an approximate answer rather than + // crashing. For example, UDate values above a ~10^25 + // might all have a time of midnight. + remainder = 0; + } else { + remainder = dividend - (quotient * divisor); + } + } + U_ASSERT(0 <= remainder && remainder < divisor); + return quotient; +} + +const int32_t JULIAN_1_CE = 1721426; // January 1, 1 CE Gregorian +const int32_t JULIAN_1970_CE = 2440588; // January 1, 1970 CE Gregorian + +const int16_t Grego::DAYS_BEFORE[24] = + {0,31,59,90,120,151,181,212,243,273,304,334, + 0,31,60,91,121,152,182,213,244,274,305,335}; + +const int8_t Grego::MONTH_LENGTH[24] = + {31,28,31,30,31,30,31,31,30,31,30,31, + 31,29,31,30,31,30,31,31,30,31,30,31}; + +double Grego::fieldsToDay(int32_t year, int32_t month, int32_t dom) { + + int32_t y = year - 1; + + double julian = 365 * y + Math::floorDivide(y, 4) + (JULIAN_1_CE - 3) + // Julian cal + Math::floorDivide(y, 400) - Math::floorDivide(y, 100) + 2 + // => Gregorian cal + DAYS_BEFORE[month + (isLeapYear(year) ? 12 : 0)] + dom; // => month/dom + + return julian - JULIAN_1970_CE; // JD => epoch day +} + +void Grego::dayToFields(double day, int32_t& year, int32_t& month, + int32_t& dom, int32_t& dow, int32_t& doy) { + + // Convert from 1970 CE epoch to 1 CE epoch (Gregorian calendar) + day += JULIAN_1970_CE - JULIAN_1_CE; + + // Convert from the day number to the multiple radix + // representation. We use 400-year, 100-year, and 4-year cycles. + // For example, the 4-year cycle has 4 years + 1 leap day; giving + // 1461 == 365*4 + 1 days. + int32_t n400 = Math::floorDivide(day, 146097, doy); // 400-year cycle length + int32_t n100 = Math::floorDivide(doy, 36524, doy); // 100-year cycle length + int32_t n4 = Math::floorDivide(doy, 1461, doy); // 4-year cycle length + int32_t n1 = Math::floorDivide(doy, 365, doy); + year = 400*n400 + 100*n100 + 4*n4 + n1; + if (n100 == 4 || n1 == 4) { + doy = 365; // Dec 31 at end of 4- or 400-year cycle + } else { + ++year; + } + + UBool isLeap = isLeapYear(year); + + // Gregorian day zero is a Monday. + dow = (int32_t) uprv_fmod(day + 1, 7); + dow += (dow < 0) ? (UCAL_SUNDAY + 7) : UCAL_SUNDAY; + + // Common Julian/Gregorian calculation + int32_t correction = 0; + int32_t march1 = isLeap ? 60 : 59; // zero-based DOY for March 1 + if (doy >= march1) { + correction = isLeap ? 1 : 2; + } + month = (12 * (doy + correction) + 6) / 367; // zero-based month + dom = doy - DAYS_BEFORE[month + (isLeap ? 12 : 0)] + 1; // one-based DOM + doy++; // one-based doy +} + +/* ---- CalendarData ------ */ + +#define U_CALENDAR_KEY "calendar" +#define U_GREGORIAN_KEY "gregorian" +#define U_FORMAT_KEY "format" +#define U_DEFAULT_KEY "default" +#define U_CALENDAR_DATA ((char*)0) + + +#if defined( U_DEBUG_CALDATA) +#include +#endif + +// CalendarData::CalendarData(const Locale& loc, UErrorCode& status) +// : fFillin(NULL), fBundle(NULL), fFallback(NULL) { +// initData(loc.getBaseName(), (char*) "???", status); +// } + +CalendarData::CalendarData(const Locale& loc, const char *type, UErrorCode& status) + : fFillin(NULL), fOtherFillin(NULL), fBundle(NULL), fFallback(NULL) { + initData(loc.getBaseName(), type, status); +} + +void CalendarData::initData(const char *locale, const char *type, UErrorCode& status) { + fOtherFillin = ures_open(U_CALENDAR_DATA, locale, &status); + fFillin = ures_getByKey(fOtherFillin, U_CALENDAR_KEY, fFillin, &status); + + if((type != NULL) && + (*type != '\0') && + (uprv_strcmp(type, U_GREGORIAN_KEY))) + { + fBundle = ures_getByKeyWithFallback(fFillin, type, NULL, &status); + fFallback = ures_getByKeyWithFallback(fFillin, U_GREGORIAN_KEY, NULL, &status); + +#if defined (U_DEBUG_CALDATA) + fprintf(stderr, "%p: CalendarData(%s, %s, %s) -> main(%p, %s)=%s, fallback(%p, %s)=%s\n", + this, locale, type, u_errorName(status), fBundle, type, fBundle?ures_getLocale(fBundle, &status):"", + fFallback, U_GREGORIAN_KEY, fFallback?ures_getLocale(fFallback, &status):""); +#endif + + } else { + fBundle = ures_getByKeyWithFallback(fFillin, U_GREGORIAN_KEY, NULL, &status); +#if defined (U_DEBUG_CALDATA) + fprintf(stderr, "%p: CalendarData(%s, %s, %s) -> main(%p, %s)=%s, fallback = NULL\n", + this, locale, type, u_errorName(status), fBundle, U_GREGORIAN_KEY, fBundle?ures_getLocale(fBundle, &status):"" ); +#endif + } +} + +CalendarData::~CalendarData() { + ures_close(fFillin); + ures_close(fBundle); + ures_close(fFallback); + ures_close(fOtherFillin); +} + +UResourceBundle* +CalendarData::getByKey(const char *key, UErrorCode& status) { + if(U_FAILURE(status)) { + return NULL; + } + + if(fBundle) { + fFillin = ures_getByKeyWithFallback(fBundle, key, fFillin, &status); +#if defined (U_DEBUG_CALDATA) + fprintf(stderr, "%p: get %s -> %s - from MAIN %s\n",this, key, u_errorName(status), ures_getLocale(fFillin, &status)); +#endif + } + if(fFallback && (status == U_MISSING_RESOURCE_ERROR)) { + status = U_ZERO_ERROR; // retry with fallback (gregorian) + fFillin = ures_getByKeyWithFallback(fFallback, key, fFillin, &status); +#if defined (U_DEBUG_CALDATA) + fprintf(stderr, "%p: get %s -> %s - from FALLBACK %s\n",this, key, u_errorName(status), ures_getLocale(fFillin, &status)); +#endif + } + return fFillin; +} + +UResourceBundle* CalendarData::getByKey2(const char *key, const char *subKey, UErrorCode& status) { + if(U_FAILURE(status)) { + return NULL; + } + + if(fBundle) { +#if defined (U_DEBUG_CALDATA) + fprintf(stderr, "%p: //\n"); +#endif + fFillin = ures_getByKeyWithFallback(fBundle, key, fFillin, &status); + fOtherFillin = ures_getByKeyWithFallback(fFillin, U_FORMAT_KEY, fOtherFillin, &status); + fFillin = ures_getByKeyWithFallback(fOtherFillin, subKey, fFillin, &status); +#if defined (U_DEBUG_CALDATA) + fprintf(stderr, "%p: get %s/format/%s -> %s - from MAIN %s\n", this, key, subKey, u_errorName(status), ures_getLocale(fFillin, &status)); +#endif + } + if(fFallback && (status == U_MISSING_RESOURCE_ERROR)) { + status = U_ZERO_ERROR; // retry with fallback (gregorian) + fFillin = ures_getByKeyWithFallback(fFallback, key, fFillin, &status); + fOtherFillin = ures_getByKeyWithFallback(fFillin, U_FORMAT_KEY, fOtherFillin, &status); + fFillin = ures_getByKeyWithFallback(fOtherFillin, subKey, fFillin, &status); +#if defined (U_DEBUG_CALDATA) + fprintf(stderr, "%p: get %s/format/%s -> %s - from FALLBACK %s\n",this, key, subKey, u_errorName(status), ures_getLocale(fFillin,&status)); +#endif + } + +//// handling of 'default' keyword on failure: Commented out for 3.0. +// if((status == U_MISSING_RESOURCE_ERROR) && +// uprv_strcmp(subKey,U_DEFAULT_KEY)) { // avoid recursion +// #if defined (U_DEBUG_CALDATA) +// fprintf(stderr, "%p: - attempting fallback -\n", this); +// fflush(stderr); +// #endif +// UErrorCode subStatus = U_ZERO_ERROR; +// int32_t len; +// char kwBuf[128] = ""; +// const UChar *kw; +// /* fFillin = */ getByKey2(key, U_DEFAULT_KEY, subStatus); +// kw = ures_getString(fFillin, &len, &subStatus); +// if(len>126) { // too big +// len = 0; +// } +// if(U_SUCCESS(subStatus) && (len>0)) { +// u_UCharsToChars(kw, kwBuf, len+1); +// if(*kwBuf && uprv_strcmp(kwBuf,subKey)) { +// #if defined (U_DEBUG_CALDATA) +// fprintf(stderr, "%p: trying %s/format/default -> \"%s\"\n",this, key, kwBuf); +// #endif +// // now try again with the default +// status = U_ZERO_ERROR; +// /* fFillin = */ getByKey2(key, kwBuf, status); +// } +// #if defined (U_DEBUG_CALDATA) +// } else { +// fprintf(stderr, "%p: could not load %s/format/default - fail out (%s)\n",this, key, kwBuf, u_errorName(status)); +// #endif +// } +// } + + return fFillin; +} + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(CalendarData); + +#endif +//eof diff --git a/icuSources/i18n/gregoimp.h b/icuSources/i18n/gregoimp.h new file mode 100644 index 00000000..0adaa48e --- /dev/null +++ b/icuSources/i18n/gregoimp.h @@ -0,0 +1,342 @@ +/* +********************************************************************** +* Copyright (c) 2003-2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Author: Alan Liu +* Created: September 2 2003 +* Since: ICU 2.8 +********************************************************************** +*/ +#ifndef GREGOIMP_H +#define GREGOIMP_H +#include "unicode/utypes.h" +#if !UCONFIG_NO_FORMATTING + +#include "unicode/ures.h" +#include "unicode/locid.h" +#include "putilimp.h" + +U_NAMESPACE_BEGIN + +/** + * A utility class providing mathematical functions used by time zone + * and calendar code. Do not instantiate. + */ +class U_I18N_API Math { + public: + /** + * Divide two integers, returning the floor of the quotient. + * Unlike the built-in division, this is mathematically + * well-behaved. E.g., -1/4 => 0 but + * floorDivide(-1,4) => -1. + * @param numerator the numerator + * @param denominator a divisor which must be != 0 + * @return the floor of the quotient + */ + static int32_t floorDivide(int32_t numerator, int32_t denominator); + + /** + * Divide two numbers, returning the floor of the quotient. + * Unlike the built-in division, this is mathematically + * well-behaved. E.g., -1/4 => 0 but + * floorDivide(-1,4) => -1. + * @param numerator the numerator + * @param denominator a divisor which must be != 0 + * @return the floor of the quotient + */ + static inline double floorDivide(double numerator, double denominator); + + /** + * Divide two numbers, returning the floor of the quotient and + * the modulus remainder. Unlike the built-in division, this is + * mathematically well-behaved. E.g., -1/4 => 0 and + * -1%4 => -1, but floorDivide(-1,4) => + * -1 with remainder => 3. NOTE: If numerator is + * too large, the returned quotient may overflow. + * @param numerator the numerator + * @param denominator a divisor which must be != 0 + * @param remainder output parameter to receive the + * remainder. Unlike numerator % denominator, this + * will always be non-negative, in the half-open range [0, + * |denominator|). + * @return the floor of the quotient + */ + static int32_t floorDivide(double numerator, int32_t denominator, + int32_t& remainder); + + /** + * For a positive divisor, return the quotient and remainder + * such that dividend = quotient*divisor + remainder and + * 0 <= remainder < divisor. + * + * Works around edge-case bugs. Handles pathological input + * (divident >> divisor) reasonably. + * + * Calling with a divisor <= 0 is disallowed. + */ + static double floorDivide(double dividend, double divisor, + double& remainder); +}; + +// Useful millisecond constants +#define kOneDay (1.0 * U_MILLIS_PER_DAY) // 86,400,000 +#define kOneHour (60*60*1000) +#define kOneMinute 60000 +#define kOneSecond 1000 +#define kOneMillisecond 1 +#define kOneWeek (7.0 * kOneDay) // 604,800,000 + +// Epoch constants +#define kJan1_1JulianDay 1721426 // January 1, year 1 (Gregorian) + +#define kEpochStartAsJulianDay 2440588 // January 1, 1970 (Gregorian) + +#define kEpochYear 1970 + + +#define kEarliestViableMillis -185331720384000000.0 // minimum representable by julian day -1e17 + +#define kLatestViableMillis 185753453990400000.0 // max representable by julian day +1e17 + +/** + * The minimum supported Julian day. This value is equivalent to + * MIN_MILLIS. + */ +#define MIN_JULIAN (-0x7F000000) + +/** + * The minimum supported epoch milliseconds. This value is equivalent + * to MIN_JULIAN. + */ +#define MIN_MILLIS ((MIN_JULIAN - kEpochStartAsJulianDay) * kOneDay) + +/** + * The maximum supported Julian day. This value is equivalent to + * MAX_MILLIS. + */ +#define MAX_JULIAN (+0x7F000000) + +/** + * The maximum supported epoch milliseconds. This value is equivalent + * to MAX_JULIAN. + */ +#define MAX_MILLIS ((MAX_JULIAN - kEpochStartAsJulianDay) * kOneDay) + +/** + * A utility class providing proleptic Gregorian calendar functions + * used by time zone and calendar code. Do not instantiate. + * + * Note: Unlike GregorianCalendar, all computations performed by this + * class occur in the pure proleptic GregorianCalendar. + */ +class U_I18N_API Grego { + public: + /** + * Return TRUE if the given year is a leap year. + * @param year Gregorian year, with 0 == 1 BCE, -1 == 2 BCE, etc. + * @return TRUE if the year is a leap year + */ + static inline UBool isLeapYear(int32_t year); + + /** + * Return the number of days in the given month. + * @param year Gregorian year, with 0 == 1 BCE, -1 == 2 BCE, etc. + * @param month 0-based month, with 0==Jan + * @return the number of days in the given month + */ + static inline int8_t monthLength(int32_t year, int32_t month); + + /** + * Return the length of a previous month of the Gregorian calendar. + * @param y the extended year + * @param m the 0-based month number + * @return the number of days in the month previous to the given month + */ + static inline int8_t previousMonthLength(int y, int m); + + /** + * Convert a year, month, and day-of-month, given in the proleptic + * Gregorian calendar, to 1970 epoch days. + * @param year Gregorian year, with 0 == 1 BCE, -1 == 2 BCE, etc. + * @param month 0-based month, with 0==Jan + * @param dom 1-based day of month + * @return the day number, with day 0 == Jan 1 1970 + */ + static double fieldsToDay(int32_t year, int32_t month, int32_t dom); + + /** + * Convert a 1970-epoch day number to proleptic Gregorian year, + * month, day-of-month, and day-of-week. + * @param day 1970-epoch day (integral value) + * @param year output parameter to receive year + * @param month output parameter to receive month (0-based, 0==Jan) + * @param dom output parameter to receive day-of-month (1-based) + * @param dow output parameter to receive day-of-week (1-based, 1==Sun) + * @param doy output parameter to receive day-of-year (1-based) + */ + static void dayToFields(double day, int32_t& year, int32_t& month, + int32_t& dom, int32_t& dow, int32_t& doy); + + /** + * Convert a 1970-epoch day number to proleptic Gregorian year, + * month, day-of-month, and day-of-week. + * @param day 1970-epoch day (integral value) + * @param year output parameter to receive year + * @param month output parameter to receive month (0-based, 0==Jan) + * @param dom output parameter to receive day-of-month (1-based) + * @param dow output parameter to receive day-of-week (1-based, 1==Sun) + */ + static inline void dayToFields(double day, int32_t& year, int32_t& month, + int32_t& dom, int32_t& dow); + + /** + * Converts Julian day to time as milliseconds. + * @param julian the given Julian day number. + * @return time as milliseconds. + * @internal + */ + static inline double julianDayToMillis(int32_t julian); + + /** + * Converts time as milliseconds to Julian day. + * @param millis the given milliseconds. + * @return the Julian day number. + * @internal + */ + static inline int32_t millisToJulianDay(double millis); + + /** + * Calculates the Gregorian day shift value for an extended year. + * @param eyear Extended year + * @returns number of days to ADD to Julian in order to convert from J->G + */ + static inline int32_t gregorianShift(int32_t eyear); + + private: + static const int16_t DAYS_BEFORE[24]; + static const int8_t MONTH_LENGTH[24]; +}; + +inline double Math::floorDivide(double numerator, double denominator) { + return uprv_floor(numerator / denominator); +} + +inline UBool Grego::isLeapYear(int32_t year) { + // year&0x3 == year%4 + return ((year&0x3) == 0) && ((year%100 != 0) || (year%400 == 0)); +} + +inline int8_t +Grego::monthLength(int32_t year, int32_t month) { + return MONTH_LENGTH[month + isLeapYear(year)?12:0]; +} + +inline int8_t +Grego::previousMonthLength(int y, int m) { + return (m > 0) ? monthLength(y, m-1) : 31; +} + +inline void Grego::dayToFields(double day, int32_t& year, int32_t& month, + int32_t& dom, int32_t& dow) { + int32_t doy_unused; + dayToFields(day,year,month,dom,dow,doy_unused); +} + +inline double Grego::julianDayToMillis(int32_t julian) +{ + return (julian - kEpochStartAsJulianDay) * kOneDay; +} + +inline int32_t Grego::millisToJulianDay(double millis) { + return (int32_t) (kEpochStartAsJulianDay + Math::floorDivide(millis, (double)kOneDay)); +} + +inline int32_t Grego::gregorianShift(int32_t eyear) { + int32_t y = eyear-1; + int32_t gregShift = Math::floorDivide(y, 400) - Math::floorDivide(y, 100) + 2; + return gregShift; +} + +/** + * This class provides convenient access to the data needed for a calendar. + * @internal ICU 3.0 + */ +class U_I18N_API CalendarData : public UObject { +public: + /** + * Construct a CalendarData from the given locale. + * @param loc locale to use. The 'calendar' keyword will be ignored. + * @param type calendar type. NULL indicates the gregorian calendar. + * No default lookup is done. + * @param status error code + */ + CalendarData(const Locale& loc, const char *type, UErrorCode& status); + + /** + * Load data for calendar. Note, this object owns the resources, do NOT call ures_close()! + * The ResourceBundle C++ API should NOT be used because it is too slow for a low level API. + * + * @param key Resource key to data + * @param status Error Status + * @internal + */ + UResourceBundle* getByKey(const char *key, UErrorCode& status); + + /** + * Load data for calendar. Note, this object owns the resources, do NOT call ures_close()! + * There is an implicit key of 'format' + * data is located in: "calendar/key/format/subKey" + * for example, calendar/dayNames/format/abbreviated + * The ResourceBundle C++ API should NOT be used because it is too slow for a low level API. + * + * @param key Resource key to data + * @param subKey Resource key to data + * @param status Error Status + * @internal + */ + UResourceBundle* getByKey2(const char *key, const char *subKey, UErrorCode& status); + + ~CalendarData(); + + /** + * Override Calendar Returns a unique class ID POLYMORPHICALLY. Pure virtual + * override. This method is to implement a simple version of RTTI, since not all C++ + * compilers support genuine RTTI. Polymorphic operator==() and clone() methods call + * this method. + * + * @return The class ID for this object. All objects of a given class have the + * same class ID. Objects of other classes have different class IDs. + * @stable ICU 2.0 + */ + virtual UClassID getDynamicClassID(void) const; + + /** + * Return the class ID for this class. This is useful only for comparing to a return + * value from getDynamicClassID(). For example: + * + * Base* polymorphic_pointer = createPolymorphicObject(); + * if (polymorphic_pointer->getDynamicClassID() == + * Derived::getStaticClassID()) ... + * + * @return The class ID for all objects of this class. + * @stable ICU 2.0 + */ + static UClassID U_EXPORT2 getStaticClassID(void); + +private: + void initData(const char *locale, const char *type, UErrorCode& status); + + UResourceBundle *fFillin; + UResourceBundle *fOtherFillin; + UResourceBundle *fBundle; + UResourceBundle *fFallback; + CalendarData(); // Not implemented. +}; + +U_NAMESPACE_END + +#endif // !UCONFIG_NO_FORMATTING +#endif // GREGOIMP_H + +//eof diff --git a/icuSources/i18n/hebrwcal.cpp b/icuSources/i18n/hebrwcal.cpp new file mode 100644 index 00000000..b8bd65fa --- /dev/null +++ b/icuSources/i18n/hebrwcal.cpp @@ -0,0 +1,729 @@ +/* + * Copyright (C) 2003-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ****************************************************************************** + * + * File HEBRWCAL.H + * + * Modification History: + * + * Date Name Description + * 12/03/2003 srl ported from java HebrewCalendar + ***************************************************************************** + */ + +#include "hebrwcal.h" + +#if !UCONFIG_NO_FORMATTING + +#include "mutex.h" +#include +#include "gregoimp.h" // Math +#include "astro.h" // CalendarAstronomer +#include "uhash.h" +#include "ucln_in.h" + +// Hebrew Calendar implementation + +/** + * The absolute date, in milliseconds since 1/1/1970 AD, Gregorian, + * of the start of the Hebrew calendar. In order to keep this calendar's + * time of day in sync with that of the Gregorian calendar, we use + * midnight, rather than sunset the day before. + */ +static const double EPOCH_MILLIS = -180799862400000.; // 1/1/1 HY + +static const int32_t LIMITS[UCAL_FIELD_COUNT][4] = { + // Minimum Greatest Least Maximum + // Minimum Maximum + { 0, 0, 0, 0 }, // ERA + { 1, 1, 5000000, 5000000 }, // YEAR + { 0, 0, 12, 12 }, // MONTH + { 1, 1, 51, 56 }, // WEEK_OF_YEAR + { 0, 0, 5, 6 }, // WEEK_OF_MONTH + { 1, 1, 29, 30 }, // DAY_OF_MONTH + { 1, 1, 353, 385 }, // DAY_OF_YEAR + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // DAY_OF_WEEK + { -1, -1, 4, 6 }, // DAY_OF_WEEK_IN_MONTH + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1/* */}, // AM_PM + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // HOUR + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // HOUR_OF_DAY + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // MINUTE + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // SECOND + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // MILLISECOND + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // ZONE_OFFSET + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // DST_OFFSET + { -5000001, -5000001, 5000001, 5000001 }, // YEAR_WOY + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // DOW_LOCAL + { -5000000, -5000000, 5000000, 5000000 }, // EXTENDED_YEAR + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // JULIAN_DAY + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // MILLISECONDS_IN_DAY +}; + +/** + * The lengths of the Hebrew months. This is complicated, because there + * are three different types of years, or six if you count leap years. + * Due to the rules for postponing the start of the year to avoid having + * certain holidays fall on the sabbath, the year can end up being three + * different lengths, called "deficient", "normal", and "complete". + */ +static const int32_t MONTH_LENGTH[][3] = { + // Deficient Normal Complete + { 30, 30, 30 }, //Tishri + { 29, 29, 30 }, //Heshvan + { 29, 30, 30 }, //Kislev + { 29, 29, 29 }, //Tevet + { 30, 30, 30 }, //Shevat + { 30, 30, 30 }, //Adar I (leap years only) + { 29, 29, 29 }, //Adar + { 30, 30, 30 }, //Nisan + { 29, 29, 29 }, //Iyar + { 30, 30, 30 }, //Sivan + { 29, 29, 29 }, //Tammuz + { 30, 30, 30 }, //Av + { 29, 29, 29 }, //Elul +}; + +/** + * The cumulative # of days to the end of each month in a non-leap year + * Although this can be calculated from the MONTH_LENGTH table, + * keeping it around separately makes some calculations a lot faster + */ + +static const int32_t MONTH_START[][3] = { + // Deficient Normal Complete + { 0, 0, 0 }, // (placeholder) + { 30, 30, 30 }, // Tishri + { 59, 59, 60 }, // Heshvan + { 88, 89, 90 }, // Kislev + { 117, 118, 119 }, // Tevet + { 147, 148, 149 }, // Shevat + { 147, 148, 149 }, // (Adar I placeholder) + { 176, 177, 178 }, // Adar + { 206, 207, 208 }, // Nisan + { 235, 236, 237 }, // Iyar + { 265, 266, 267 }, // Sivan + { 294, 295, 296 }, // Tammuz + { 324, 325, 326 }, // Av + { 353, 354, 355 }, // Elul +}; + +/** + * The cumulative # of days to the end of each month in a leap year + */ +static const int32_t LEAP_MONTH_START[][3] = { + // Deficient Normal Complete + { 0, 0, 0 }, // (placeholder) + { 30, 30, 30 }, // Tishri + { 59, 59, 60 }, // Heshvan + { 88, 89, 90 }, // Kislev + { 117, 118, 119 }, // Tevet + { 147, 148, 149 }, // Shevat + { 177, 178, 179 }, // Adar I + { 206, 207, 208 }, // Adar II + { 236, 237, 238 }, // Nisan + { 265, 266, 267 }, // Iyar + { 295, 296, 297 }, // Sivan + { 324, 325, 326 }, // Tammuz + { 354, 355, 356 }, // Av + { 383, 384, 385 }, // Elul +}; + +static CalendarCache *gCache = NULL; + +U_CDECL_BEGIN +static UBool calendar_hebrew_cleanup(void) { + delete gCache; + gCache = NULL; + return TRUE; +} +U_CDECL_END + +U_NAMESPACE_BEGIN +//------------------------------------------------------------------------- +// Constructors... +//------------------------------------------------------------------------- + +/** + * Constructs a default HebrewCalendar using the current time + * in the default time zone with the default locale. + * @internal + */ +HebrewCalendar::HebrewCalendar(const Locale& aLocale, UErrorCode& success) + : Calendar(TimeZone::createDefault(), aLocale, success) + +{ + setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly. +} + + +HebrewCalendar::~HebrewCalendar() { +} + +const char *HebrewCalendar::getType() const { + return "hebrew"; +} + +Calendar* HebrewCalendar::clone() const { + return new HebrewCalendar(*this); +} + +HebrewCalendar::HebrewCalendar(const HebrewCalendar& other) : Calendar(other) { +} + + +//------------------------------------------------------------------------- +// Rolling and adding functions overridden from Calendar +// +// These methods call through to the default implementation in IBMCalendar +// for most of the fields and only handle the unusual ones themselves. +//------------------------------------------------------------------------- + +/** + * Add a signed amount to a specified field, using this calendar's rules. + * For example, to add three days to the current date, you can call + * add(Calendar.DATE, 3). + *

    + * When adding to certain fields, the values of other fields may conflict and + * need to be changed. For example, when adding one to the {@link #MONTH MONTH} field + * for the date "30 Av 5758", the {@link #DAY_OF_MONTH DAY_OF_MONTH} field + * must be adjusted so that the result is "29 Elul 5758" rather than the invalid + * "30 Elul 5758". + *

    + * This method is able to add to + * all fields except for {@link #ERA ERA}, {@link #DST_OFFSET DST_OFFSET}, + * and {@link #ZONE_OFFSET ZONE_OFFSET}. + *

    + * Note: You should always use {@link #roll roll} and add rather + * than attempting to perform arithmetic operations directly on the fields + * of a HebrewCalendar. Since the {@link #MONTH MONTH} field behaves + * discontinuously in non-leap years, simple arithmetic can give invalid results. + *

    + * @param field the time field. + * @param amount the amount to add to the field. + * + * @exception IllegalArgumentException if the field is invalid or refers + * to a field that cannot be handled by this method. + * @internal + */ +void HebrewCalendar::add(UCalendarDateFields field, int32_t amount, UErrorCode& status) +{ + if(U_FAILURE(status)) { + return; + } + switch (field) { + case UCAL_MONTH: + { + // We can't just do a set(MONTH, get(MONTH) + amount). The + // reason is ADAR_1. Suppose amount is +2 and we land in + // ADAR_1 -- then we have to bump to ADAR_2 aka ADAR. But + // if amount is -2 and we land in ADAR_1, then we have to + // bump the other way -- down to SHEVAT. - Alan 11/00 + int32_t month = get(UCAL_MONTH, status); + int32_t year = get(UCAL_YEAR, status); + UBool acrossAdar1; + if (amount > 0) { + acrossAdar1 = (month < ADAR_1); // started before ADAR_1? + month += amount; + for (;;) { + if (acrossAdar1 && month>=ADAR_1 && !isLeapYear(year)) { + ++month; + } + if (month <= ELUL) { + break; + } + month -= ELUL+1; + ++year; + acrossAdar1 = TRUE; + } + } else { + acrossAdar1 = (month > ADAR_1); // started after ADAR_1? + month += amount; + for (;;) { + if (acrossAdar1 && month<=ADAR_1 && !isLeapYear(year)) { + --month; + } + if (month >= 0) { + break; + } + month += ELUL+1; + --year; + acrossAdar1 = TRUE; + } + } + set(UCAL_MONTH, month); + set(UCAL_YEAR, year); + pinField(UCAL_DAY_OF_MONTH, status); + break; + } + + default: + Calendar::add(field, amount, status); + break; + } +} + +/** + * Rolls (up/down) a specified amount time on the given field. For + * example, to roll the current date up by three days, you can call + * roll(Calendar.DATE, 3). If the + * field is rolled past its maximum allowable value, it will "wrap" back + * to its minimum and continue rolling. + * For example, calling roll(Calendar.DATE, 10) + * on a Hebrew calendar set to "25 Av 5758" will result in the date "5 Av 5758". + *

    + * When rolling certain fields, the values of other fields may conflict and + * need to be changed. For example, when rolling the {@link #MONTH MONTH} field + * upward by one for the date "30 Av 5758", the {@link #DAY_OF_MONTH DAY_OF_MONTH} field + * must be adjusted so that the result is "29 Elul 5758" rather than the invalid + * "30 Elul". + *

    + * This method is able to roll + * all fields except for {@link #ERA ERA}, {@link #DST_OFFSET DST_OFFSET}, + * and {@link #ZONE_OFFSET ZONE_OFFSET}. Subclasses may, of course, add support for + * additional fields in their overrides of roll. + *

    + * Note: You should always use roll and {@link #add add} rather + * than attempting to perform arithmetic operations directly on the fields + * of a HebrewCalendar. Since the {@link #MONTH MONTH} field behaves + * discontinuously in non-leap years, simple arithmetic can give invalid results. + *

    + * @param field the time field. + * @param amount the amount by which the field should be rolled. + * + * @exception IllegalArgumentException if the field is invalid or refers + * to a field that cannot be handled by this method. + * @internal + */ +void HebrewCalendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& status) +{ + if(U_FAILURE(status)) { + return; + } + switch (field) { + case UCAL_MONTH: + { + int32_t month = get(UCAL_MONTH, status); + int32_t year = get(UCAL_YEAR, status); + + UBool leapYear = isLeapYear(year); + int32_t yearLength = monthsInYear(year); + int32_t newMonth = month + (amount % yearLength); + // + // If it's not a leap year and we're rolling past the missing month + // of ADAR_1, we need to roll an extra month to make up for it. + // + if (!leapYear) { + if (amount > 0 && month < ADAR_1 && newMonth >= ADAR_1) { + newMonth++; + } else if (amount < 0 && month > ADAR_1 && newMonth <= ADAR_1) { + newMonth--; + } + } + set(UCAL_MONTH, (newMonth + 13) % 13); + pinField(UCAL_DAY_OF_MONTH, status); + return; + } + default: + Calendar::roll(field, amount, status); + } +} + +void HebrewCalendar::roll(EDateFields field, int32_t amount, UErrorCode& status) { + roll((UCalendarDateFields)field, amount, status); +} + +//------------------------------------------------------------------------- +// Support methods +//------------------------------------------------------------------------- + +// Hebrew date calculations are performed in terms of days, hours, and +// "parts" (or halakim), which are 1/1080 of an hour, or 3 1/3 seconds. +static const int32_t HOUR_PARTS = 1080; +static const int32_t DAY_PARTS = 24*HOUR_PARTS; + +// An approximate value for the length of a lunar month. +// It is used to calculate the approximate year and month of a given +// absolute date. +static const int32_t MONTH_DAYS = 29; +static const int32_t MONTH_FRACT = 12*HOUR_PARTS + 793; +static const int32_t MONTH_PARTS = MONTH_DAYS*DAY_PARTS + MONTH_FRACT; + +// The time of the new moon (in parts) on 1 Tishri, year 1 (the epoch) +// counting from noon on the day before. BAHARAD is an abbreviation of +// Bet (Monday), Hey (5 hours from sunset), Resh-Daled (204). +static const int32_t BAHARAD = 11*HOUR_PARTS + 204; + +/** + * Finds the day # of the first day in the given Hebrew year. + * To do this, we want to calculate the time of the Tishri 1 new moon + * in that year. + *

    + * The algorithm here is similar to ones described in a number of + * references, including: + *

    + */ +int32_t HebrewCalendar::startOfYear(int32_t year, UErrorCode &status) +{ + ucln_i18n_registerCleanup(UCLN_I18N_HEBREW_CALENDAR, calendar_hebrew_cleanup); + int32_t day = CalendarCache::get(&gCache, year, status); + + if (day == 0) { + int32_t months = (235 * year - 234) / 19; // # of months before year + + int32_t frac = months * MONTH_FRACT + BAHARAD; // Fractional part of day # + day = months * 29 + (frac / DAY_PARTS); // Whole # part of calculation + frac = frac % DAY_PARTS; // Time of day + + int32_t wd = (day % 7); // Day of week (0 == Monday) + + if (wd == 2 || wd == 4 || wd == 6) { + // If the 1st is on Sun, Wed, or Fri, postpone to the next day + day += 1; + wd = (day % 7); + } + if (wd == 1 && frac > 15*HOUR_PARTS+204 && !isLeapYear(year) ) { + // If the new moon falls after 3:11:20am (15h204p from the previous noon) + // on a Tuesday and it is not a leap year, postpone by 2 days. + // This prevents 356-day years. + day += 2; + } + else if (wd == 0 && frac > 21*HOUR_PARTS+589 && isLeapYear(year-1) ) { + // If the new moon falls after 9:32:43 1/3am (21h589p from yesterday noon) + // on a Monday and *last* year was a leap year, postpone by 1 day. + // Prevents 382-day years. + day += 1; + } + CalendarCache::put(&gCache, year, day, status); + } + return day; +} + +/** + * Find the day of the week for a given day + * + * @param day The # of days since the start of the Hebrew calendar, + * 1-based (i.e. 1/1/1 AM is day 1). + */ +int32_t HebrewCalendar::absoluteDayToDayOfWeek(int32_t day) +{ + // We know that 1/1/1 AM is a Monday, which makes the math easy... + return (day % 7) + 1; +} + +/** + * Returns the the type of a given year. + * 0 "Deficient" year with 353 or 383 days + * 1 "Normal" year with 354 or 384 days + * 2 "Complete" year with 355 or 385 days + */ +int32_t HebrewCalendar::yearType(int32_t year) const +{ + int32_t yearLength = handleGetYearLength(year); + + if (yearLength > 380) { + yearLength -= 30; // Subtract length of leap month. + } + + int type = 0; + + switch (yearLength) { + case 353: + type = 0; break; + case 354: + type = 1; break; + case 355: + type = 2; break; + default: + //throw new RuntimeException("Illegal year length " + yearLength + " in year " + year); + type = 1; + } + return type; +} + +/** + * Determine whether a given Hebrew year is a leap year + * + * The rule here is that if (year % 19) == 0, 3, 6, 8, 11, 14, or 17. + * The formula below performs the same test, believe it or not. + */ +UBool HebrewCalendar::isLeapYear(int32_t year) { + //return (year * 12 + 17) % 19 >= 12; + int32_t x = (year*12 + 17) % 19; + return x >= ((x < 0) ? -7 : 12); +} + +int32_t HebrewCalendar::monthsInYear(int32_t year) { + return isLeapYear(year) ? 13 : 12; +} + +//------------------------------------------------------------------------- +// Calendar framework +//------------------------------------------------------------------------- + +/** + * @internal + */ +int32_t HebrewCalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) const { + return LIMITS[field][limitType]; +} + +/** + * Returns the length of the given month in the given year + * @internal + */ +int32_t HebrewCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month) const { + switch (month) { + case HESHVAN: + case KISLEV: + // These two month lengths can vary + return MONTH_LENGTH[month][yearType(extendedYear)]; + + default: + // The rest are a fixed length + return MONTH_LENGTH[month][0]; + } +} + +/** + * Returns the number of days in the given Hebrew year + * @internal + */ +int32_t HebrewCalendar::handleGetYearLength(int32_t eyear) const { + UErrorCode status = U_ZERO_ERROR; + return startOfYear(eyear+1, status) - startOfYear(eyear, status); +} + +//------------------------------------------------------------------------- +// Functions for converting from milliseconds to field values +//------------------------------------------------------------------------- + +/** + * Subclasses may override this method to compute several fields + * specific to each calendar system. These are: + * + *
    • ERA + *
    • YEAR + *
    • MONTH + *
    • DAY_OF_MONTH + *
    • DAY_OF_YEAR + *
    • EXTENDED_YEAR
    + * + * Subclasses can refer to the DAY_OF_WEEK and DOW_LOCAL fields, + * which will be set when this method is called. Subclasses can + * also call the getGregorianXxx() methods to obtain Gregorian + * calendar equivalents for the given Julian day. + * + *

    In addition, subclasses should compute any subclass-specific + * fields, that is, fields from BASE_FIELD_COUNT to + * getFieldCount() - 1. + * @internal + */ +void HebrewCalendar::handleComputeFields(int32_t julianDay, UErrorCode &status) { + int32_t d = julianDay - 347997; + double m = ((d * (double)DAY_PARTS)/ (double) MONTH_PARTS); // Months (approx) + int32_t year = (int32_t)( ((19. * m + 234.) / 235.) + 1.); // Years (approx) + int32_t ys = startOfYear(year, status); // 1st day of year + int32_t dayOfYear = (d - ys); + + // Because of the postponement rules, it's possible to guess wrong. Fix it. + while (dayOfYear < 1) { + year--; + ys = startOfYear(year, status); + dayOfYear = (d - ys); + } + + // Now figure out which month we're in, and the date within that month + int32_t type = yearType(year); + UBool isLeap = isLeapYear(year); + + int32_t month = 0; + while (dayOfYear > ( isLeap ? LEAP_MONTH_START[month][type] : MONTH_START[month][type] ) ) { + month++; + } + month--; + int dayOfMonth = dayOfYear - (isLeap ? LEAP_MONTH_START[month][type] : MONTH_START[month][type]); + + internalSet(UCAL_ERA, 0); + internalSet(UCAL_YEAR, year); + internalSet(UCAL_EXTENDED_YEAR, year); + internalSet(UCAL_MONTH, month); + internalSet(UCAL_DAY_OF_MONTH, dayOfMonth); + internalSet(UCAL_DAY_OF_YEAR, dayOfYear); +} + +//------------------------------------------------------------------------- +// Functions for converting from field values to milliseconds +//------------------------------------------------------------------------- + +/** + * @internal + */ +int32_t HebrewCalendar::handleGetExtendedYear() { + int32_t year; + if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) { + year = internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1 + } else { + year = internalGet(UCAL_YEAR, 1); // Default to year 1 + } + return year; +} + +/** + * Return JD of start of given month/year. + * @internal + */ +int32_t HebrewCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, UBool /*useMonth*/) const { + UErrorCode status = U_ZERO_ERROR; + // Resolve out-of-range months. This is necessary in order to + // obtain the correct year. We correct to + // a 12- or 13-month year (add/subtract 12 or 13, depending + // on the year) but since we _always_ number from 0..12, and + // the leap year determines whether or not month 5 (Adar 1) + // is present, we allow 0..12 in any given year. + while (month < 0) { + month += monthsInYear(--eyear); + } + // Careful: allow 0..12 in all years + while (month > 12) { + month -= monthsInYear(eyear++); + } + + int32_t day = startOfYear(eyear, status); + + if(U_FAILURE(status)) { + return 0; + } + + if (month != 0) { + if (isLeapYear(eyear)) { + day += LEAP_MONTH_START[month][yearType(eyear)]; + } else { + day += MONTH_START[month][yearType(eyear)]; + } + } + + return (int) (day + 347997); +} + +UBool +HebrewCalendar::inDaylightTime(UErrorCode& status) const +{ +// copied from GregorianCalendar +if (U_FAILURE(status) || !getTimeZone().useDaylightTime()) + return FALSE; + + // Force an update of the state of the Calendar. +((HebrewCalendar*)this)->complete(status); // cast away const + +return (UBool)(U_SUCCESS(status) ? (internalGet(UCAL_DST_OFFSET) != 0) : FALSE); +} + +// default century +const UDate HebrewCalendar::fgSystemDefaultCentury = DBL_MIN; +const int32_t HebrewCalendar::fgSystemDefaultCenturyYear = -1; + +UDate HebrewCalendar::fgSystemDefaultCenturyStart = DBL_MIN; +int32_t HebrewCalendar::fgSystemDefaultCenturyStartYear = -1; + + +UBool HebrewCalendar::haveDefaultCentury() const +{ + return TRUE; +} + +UDate HebrewCalendar::defaultCenturyStart() const +{ + return internalGetDefaultCenturyStart(); +} + +int32_t HebrewCalendar::defaultCenturyStartYear() const +{ + return internalGetDefaultCenturyStartYear(); +} + +UDate +HebrewCalendar::internalGetDefaultCenturyStart() const +{ + // lazy-evaluate systemDefaultCenturyStart + UBool needsUpdate; + { + Mutex m; + needsUpdate = (fgSystemDefaultCenturyStart == fgSystemDefaultCentury); + } + + if (needsUpdate) { + initializeSystemDefaultCentury(); + } + + // use defaultCenturyStart unless it's the flag value; + // then use systemDefaultCenturyStart + + return fgSystemDefaultCenturyStart; +} + +int32_t +HebrewCalendar::internalGetDefaultCenturyStartYear() const +{ + // lazy-evaluate systemDefaultCenturyStartYear + UBool needsUpdate; + { + Mutex m; + needsUpdate = (fgSystemDefaultCenturyStart == fgSystemDefaultCentury); + } + + if (needsUpdate) { + initializeSystemDefaultCentury(); + } + + // use defaultCenturyStart unless it's the flag value; + // then use systemDefaultCenturyStartYear + + return fgSystemDefaultCenturyStartYear; +} + +void +HebrewCalendar::initializeSystemDefaultCentury() +{ + // initialize systemDefaultCentury and systemDefaultCenturyYear based + // on the current time. They'll be set to 80 years before + // the current time. + // No point in locking as it should be idempotent. + if (fgSystemDefaultCenturyStart == fgSystemDefaultCentury) + { + UErrorCode status = U_ZERO_ERROR; + HebrewCalendar calendar(Locale("@calendar=hebrew"),status); + if (U_SUCCESS(status)) + { + calendar.setTime(Calendar::getNow(), status); + calendar.add(UCAL_YEAR, -80, status); + UDate newStart = calendar.getTime(status); + int32_t newYear = calendar.get(UCAL_YEAR, status); + { + Mutex m; + fgSystemDefaultCenturyStart = newStart; + fgSystemDefaultCenturyStartYear = newYear; + } + } + // We have no recourse upon failure unless we want to propagate the failure + // out. + } +} + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(HebrewCalendar); + +U_NAMESPACE_END + +#endif // UCONFIG_NO_FORMATTING + diff --git a/icuSources/i18n/hebrwcal.h b/icuSources/i18n/hebrwcal.h new file mode 100644 index 00000000..a9ac8446 --- /dev/null +++ b/icuSources/i18n/hebrwcal.h @@ -0,0 +1,484 @@ +/* +* Copyright (C) 2003-2004, International Business Machines Corporation and others. All Rights Reserved. +******************************************************************************** +* +* File HEBRWCAL.H +* +* Modification History: +* +* Date Name Description +* 05/13/2003 srl copied from gregocal.h +* 11/26/2003 srl copied from buddhcal.h +******************************************************************************** +*/ + +#ifndef HEBRWCAL_H +#define HEBRWCAL_H + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/calendar.h" +#include "unicode/gregocal.h" + +U_NAMESPACE_BEGIN + +/** + * HebrewCalendar is a subclass of Calendar + * that that implements the traditional Hebrew calendar. + * This is the civil calendar in Israel and the liturgical calendar + * of the Jewish faith worldwide. + *

    + * The Hebrew calendar is lunisolar and thus has a number of interesting + * properties that distinguish it from the Gregorian. Months start + * on the day of (an arithmetic approximation of) each new moon. Since the + * solar year (approximately 365.24 days) is not an even multiple of + * the lunar month (approximately 29.53 days) an extra "leap month" is + * inserted in 7 out of every 19 years. To make matters even more + * interesting, the start of a year can be delayed by up to three days + * in order to prevent certain holidays from falling on the Sabbath and + * to prevent certain illegal year lengths. Finally, the lengths of certain + * months can vary depending on the number of days in the year. + *

    + * The leap month is known as "Adar 1" and is inserted between the + * months of Shevat and Adar in leap years. Since the leap month does + * not come at the end of the year, calculations involving + * month numbers are particularly complex. Users of this class should + * make sure to use the {@link #roll roll} and {@link #add add} methods + * rather than attempting to perform date arithmetic by manipulating + * the fields directly. + *

    + * Note: In the traditional Hebrew calendar, days start at sunset. + * However, in order to keep the time fields in this class + * synchronized with those of the other calendars and with local clock time, + * we treat days and months as beginning at midnight, + * roughly 6 hours after the corresponding sunset. + *

    + * If you are interested in more information on the rules behind the Hebrew + * calendar, see one of the following references: + *

    + *

    + * @see com.ibm.icu.util.GregorianCalendar + * + * @author Laura Werner + * @author Alan Liu + * @author Steven R. Loomis + *

    + * @internal + */ +class U_I18N_API HebrewCalendar : public Calendar { +public: + /** + * Useful constants for HebrewCalendar. + * @internal + */ + enum EEras { + /** + * Constant for Tishri, the 1st month of the Hebrew year. + */ + TISHRI, + /** + * Constant for Heshvan, the 2nd month of the Hebrew year. + */ + HESHVAN, + /** + * Constant for Kislev, the 3rd month of the Hebrew year. + */ + KISLEV, + + /** + * Constant for Tevet, the 4th month of the Hebrew year. + */ + TEVET, + + /** + * Constant for Shevat, the 5th month of the Hebrew year. + */ + SHEVAT, + + /** + * Constant for Adar I, the 6th month of the Hebrew year + * (present in leap years only). In non-leap years, the calendar + * jumps from Shevat (5th month) to Adar (7th month). + */ + ADAR_1, + + /** + * Constant for the Adar, the 7th month of the Hebrew year. + */ + ADAR, + + /** + * Constant for Nisan, the 8th month of the Hebrew year. + */ + NISAN, + + /** + * Constant for Iyar, the 9th month of the Hebrew year. + */ + IYAR, + + /** + * Constant for Sivan, the 10th month of the Hebrew year. + */ + SIVAN, + + /** + * Constant for Tammuz, the 11th month of the Hebrew year. + */ + TAMUZ, + + /** + * Constant for Av, the 12th month of the Hebrew year. + */ + AV, + + /** + * Constant for Elul, the 13th month of the Hebrew year. + */ + ELUL + }; + + /** + * Constructs a HebrewCalendar based on the current time in the default time zone + * with the given locale. + * + * @param aLocale The given locale. + * @param success Indicates the status of HebrewCalendar object construction. + * Returns U_ZERO_ERROR if constructed successfully. + * @internal + */ + HebrewCalendar(const Locale& aLocale, UErrorCode& success); + + + /** + * Destructor + * @internal + */ + virtual ~HebrewCalendar(); + + /** + * Copy constructor + * @param source the object to be copied. + * @internal + */ + HebrewCalendar(const HebrewCalendar& source); + + /** + * Default assignment operator + * @param right the object to be copied. + * @internal + */ + HebrewCalendar& operator=(const HebrewCalendar& right); + + /** + * Create and return a polymorphic copy of this calendar. + * @return return a polymorphic copy of this calendar. + * @internal + */ + virtual Calendar* clone(void) const; + +public: + /** + * Override Calendar Returns a unique class ID POLYMORPHICALLY. Pure virtual + * override. This method is to implement a simple version of RTTI, since not all C++ + * compilers support genuine RTTI. Polymorphic operator==() and clone() methods call + * this method. + * + * @return The class ID for this object. All objects of a given class have the + * same class ID. Objects of other classes have different class IDs. + * @internal + */ + virtual UClassID getDynamicClassID(void) const; + + /** + * Return the class ID for this class. This is useful only for comparing to a return + * value from getDynamicClassID(). For example: + * + * Base* polymorphic_pointer = createPolymorphicObject(); + * if (polymorphic_pointer->getDynamicClassID() == + * Derived::getStaticClassID()) ... + * + * @return The class ID for all objects of this class. + * @internal + */ + static UClassID U_EXPORT2 getStaticClassID(void); + + /** + * return the calendar type, "hebrew". + * + * @return calendar type + * @internal + */ + virtual const char * getType() const; + + + // Calendar API + public: + /** + * (Overrides Calendar) UDate Arithmetic function. Adds the specified (signed) amount + * of time to the given time field, based on the calendar's rules. For more + * information, see the documentation for Calendar::add(). + * + * @param field The time field. + * @param amount The amount of date or time to be added to the field. + * @param status Output param set to success/failure code on exit. If any value + * previously set in the time field is invalid, this will be set to + * an error status. + */ + virtual void add(UCalendarDateFields field, int32_t amount, UErrorCode& status); + /** + * @deprecated ICU 2.6 use UCalendarDateFields instead of EDateFields + */ + inline virtual void add(EDateFields field, int32_t amount, UErrorCode& status) { add((UCalendarDateFields)field, amount, status); } + + + /** + * (Overrides Calendar) Rolls up or down by the given amount in the specified field. + * For more information, see the documentation for Calendar::roll(). + * + * @param field The time field. + * @param amount Indicates amount to roll. + * @param status Output param set to success/failure code on exit. If any value + * previously set in the time field is invalid, this will be set to + * an error status. + * @internal + */ + virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode& status); + + /** + * (Overrides Calendar) Rolls up or down by the given amount in the specified field. + * For more information, see the documentation for Calendar::roll(). + * + * @param field The time field. + * @param amount Indicates amount to roll. + * @param status Output param set to success/failure code on exit. If any value + * previously set in the time field is invalid, this will be set to + * an error status. + * @deprecated ICU 2.6. Use roll(UCalendarDateFields field, int32_t amount, UErrorCode& status) instead. +` */ + virtual void roll(EDateFields field, int32_t amount, UErrorCode& status); + + + protected: + + /** + * Subclass API for defining limits of different types. + * Subclasses must implement this method to return limits for the + * following fields: + * + *

    UCAL_ERA
    +     * UCAL_YEAR
    +     * UCAL_MONTH
    +     * UCAL_WEEK_OF_YEAR
    +     * UCAL_WEEK_OF_MONTH
    +     * UCAL_DATE (DAY_OF_MONTH on Java)
    +     * UCAL_DAY_OF_YEAR
    +     * UCAL_DAY_OF_WEEK_IN_MONTH
    +     * UCAL_YEAR_WOY
    +     * UCAL_EXTENDED_YEAR
    + * + * @param field one of the above field numbers + * @param limitType one of MINIMUM, GREATEST_MINIMUM, + * LEAST_MAXIMUM, or MAXIMUM + * @internal + */ + virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const; + + /** + * Return the number of days in the given month of the given extended + * year of this calendar system. Subclasses should override this + * method if they can provide a more correct or more efficient + * implementation than the default implementation in Calendar. + * @internal + */ + virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const; + + /** + * Return the number of days in the given extended year of this + * calendar system. Subclasses should override this method if they can + * provide a more correct or more efficient implementation than the + * default implementation in Calendar. + * @stable ICU 2.0 + */ + virtual int32_t handleGetYearLength(int32_t eyear) const; + /** + * Subclasses may override this method to compute several fields + * specific to each calendar system. These are: + * + *
    • ERA + *
    • YEAR + *
    • MONTH + *
    • DAY_OF_MONTH + *
    • DAY_OF_YEAR + *
    • EXTENDED_YEAR
    + * + *

    The GregorianCalendar implementation implements + * a calendar with the specified Julian/Gregorian cutover date. + * @internal + */ + virtual void handleComputeFields(int32_t julianDay, UErrorCode &status); + /** + * Return the extended year defined by the current fields. This will + * use the UCAL_EXTENDED_YEAR field or the UCAL_YEAR and supra-year fields (such + * as UCAL_ERA) specific to the calendar system, depending on which set of + * fields is newer. + * @return the extended year + * @internal + */ + virtual int32_t handleGetExtendedYear(); + /** + * Return the Julian day number of day before the first day of the + * given month in the given extended year. Subclasses should override + * this method to implement their calendar system. + * @param eyear the extended year + * @param month the zero-based month, or 0 if useMonth is false + * @param useMonth if false, compute the day before the first day of + * the given year, otherwise, compute the day before the first day of + * the given month + * @param return the Julian day number of the day before the first + * day of the given month and year + * @internal + */ + virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month, + UBool useMonth) const; + + + + protected: + + /** + * (Overrides Calendar) Return true if the current date for this Calendar is in + * Daylight Savings Time. Recognizes DST_OFFSET, if it is set. + * + * @param status Fill-in parameter which receives the status of this operation. + * @return True if the current date for this Calendar is in Daylight Savings Time, + * false, otherwise. + * @internal + */ + virtual UBool inDaylightTime(UErrorCode& status) const; + + /** + * Returns TRUE because the Hebrew Calendar does have a default century + * @internal + */ + virtual UBool haveDefaultCentury() const; + + /** + * Returns the date of the start of the default century + * @return start of century - in milliseconds since epoch, 1970 + * @internal + */ + virtual UDate defaultCenturyStart() const; + + /** + * Returns the year in which the default century begins + * @internal + */ + virtual int32_t defaultCenturyStartYear() const; + + private: // default century stuff. + /** + * The system maintains a static default century start date. This is initialized + * the first time it is used. Before then, it is set to SYSTEM_DEFAULT_CENTURY to + * indicate an uninitialized state. Once the system default century date and year + * are set, they do not change. + */ + static UDate fgSystemDefaultCenturyStart; + + /** + * See documentation for systemDefaultCenturyStart. + */ + static int32_t fgSystemDefaultCenturyStartYear; + + /** + * Default value that indicates the defaultCenturyStartYear is unitialized + */ + static const int32_t fgSystemDefaultCenturyYear; + + /** + * start of default century, as a date + */ + static const UDate fgSystemDefaultCentury; + + /** + * Returns the beginning date of the 100-year window that dates + * with 2-digit years are considered to fall within. + */ + UDate internalGetDefaultCenturyStart(void) const; + + /** + * Returns the first year of the 100-year window that dates with + * 2-digit years are considered to fall within. + */ + int32_t internalGetDefaultCenturyStartYear(void) const; + + /** + * Initializes the 100-year window that dates with 2-digit years + * are considered to fall within so that its start date is 80 years + * before the current time. + */ + static void initializeSystemDefaultCentury(void); + + private: // Calendar-specific implementation + /** + * Finds the day # of the first day in the given Hebrew year. + * To do this, we want to calculate the time of the Tishri 1 new moon + * in that year. + *

    + * The algorithm here is similar to ones described in a number of + * references, including: + *

    + * @param year extended year + * @return day number (JD) + * @internal + */ + static int32_t startOfYear(int32_t year, UErrorCode& status); + + static int32_t absoluteDayToDayOfWeek(int32_t day) ; + + /** + * @internal + */ + int32_t yearType(int32_t year) const; + + /** + * @internal + */ + static UBool isLeapYear(int32_t year) ; + /** + * @internal + */ + static int32_t monthsInYear(int32_t year) ; +}; + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif +//eof + diff --git a/icuSources/i18n/hextouni.cpp b/icuSources/i18n/hextouni.cpp deleted file mode 100644 index 7981b421..00000000 --- a/icuSources/i18n/hextouni.cpp +++ /dev/null @@ -1,376 +0,0 @@ -/* -********************************************************************** -* Copyright (C) 1999-2003, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -* Date Name Description -* 11/17/99 aliu Creation. -********************************************************************** -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_TRANSLITERATION - -#include "unicode/rep.h" -#include "unicode/unifilt.h" -#include "unicode/uchar.h" -#include "hextouni.h" - - -U_NAMESPACE_BEGIN - -const char HexToUnicodeTransliterator::fgClassID=0; - -/** - * ID for this transliterator. - */ -const char HexToUnicodeTransliterator::_ID[] = "Hex-Any"; - -/** - * This pattern encodes the following specs for the default constructor: - * \\u0000 - * \\U0000 - * u+0000 - * U+0000 - * The multiple backslashes resolve to a single backslash - * in the effective prefix. - */ -const UChar HexToUnicodeTransliterator::DEFAULT_PATTERN[] = { - 0x5C, 0x5C, 0x75, 0x30, 0x30, 0x30, 0x30, 0x3B, /* "\\u0000;" */ - 0x5C, 0x5C, 0x55, 0x30, 0x30, 0x30, 0x30, 0x3B, /* "\\U0000;" */ - 0x75, 0x2B, 0x30, 0x30, 0x30, 0x30, 0x3B, /* "u+0000;" */ - 0x55, 0x2B, 0x30, 0x30, 0x30, 0x30, 0 /* "U+0000" */ -}; /* "\\u0000;\\U0000;u+0000;U+0000" */ - -static const UChar gQuadA[] = { - 0x41, 0x41, 0x41, 0x41, 0 -}; /* "AAAA" */ - -/** - * Constructs a transliterator. - */ -HexToUnicodeTransliterator::HexToUnicodeTransliterator(UnicodeFilter* adoptedFilter) : - Transliterator(_ID, adoptedFilter) { - // We don't need to pass the status back to the caller because - // we know that the DEFAULT_PATTERN parses. - UErrorCode status = U_ZERO_ERROR; - applyPattern(DEFAULT_PATTERN, status); -} - -/** - * Constructs a transliterator. - */ -HexToUnicodeTransliterator::HexToUnicodeTransliterator(const UnicodeString& thePattern, - UErrorCode& status) : - Transliterator(_ID, 0) { - applyPattern(thePattern, status); -} - -/** - * Constructs a transliterator. - */ -HexToUnicodeTransliterator::HexToUnicodeTransliterator(const UnicodeString& thePattern, - UnicodeFilter* adoptedFilter, - UErrorCode& status) : - Transliterator(_ID, adoptedFilter) { - applyPattern(thePattern, status); -} - -/** - * Copy constructor. - */ -HexToUnicodeTransliterator::HexToUnicodeTransliterator(const HexToUnicodeTransliterator& o) : - Transliterator(o), - pattern(o.pattern), - affixes(o.affixes), - affixCount(o.affixCount) { -} - -/** - * Assignment operator. - */ -HexToUnicodeTransliterator& HexToUnicodeTransliterator::operator=( - const HexToUnicodeTransliterator& o) { - Transliterator::operator=(o); - pattern = o.pattern; - affixes = o.affixes; - affixCount = o.affixCount; - return *this; -} - -/** - * Transliterator API. - */ -Transliterator* HexToUnicodeTransliterator::clone(void) const { - return new HexToUnicodeTransliterator(*this); -} - -void HexToUnicodeTransliterator::applyPattern(const UnicodeString& thePattern, - UErrorCode& status) { - if (U_FAILURE(status)) { - return; - } - - /* The pattern is processed and stored in affixes. The pattern - * consists of zero or more affixes. Each affix is parsed to - * determine the prefix, suffix, minimum digit count, and maximum - * digit count. These values are then stored as a four character - * header. That is, their numeric values are cast to UChars and - * stored in the string. Following these four characters, the prefix - * characters, then suffix characters are stored. Each spec takes - * n+4 characters, where n is the total length of the prefix and - * suffix. - */ - - // POSSIBILE FUTURE MODIFICATION - // Parse thePattern, and if this succeeds, set pattern to thePattern. - // If it fails, call applyPattern(pattern) to restore the original - // conditions. - - pattern = thePattern; - affixes.truncate(0); - affixCount = 0; - - /* The mode specifies where we are in each spec. - * mode 0 = in prefix - * mode 1 = in optional digits (#) - * mode 2 = in required digits (0) - * mode 3 = in suffix - */ - int32_t mode = 0; - - int32_t prefixLen = 0, suffixLen = 0, minDigits = 0, maxDigits = 0; - int32_t start = 0; - - /* To make parsing easier, we append a virtual ';' at the end of - * the pattern string, if there isn't one already. When we get to - * the index pattern.length() (that is, one past the end), we - * create a virtual ';' if necessary. - */ - UChar c = 0; // These are outside the loop so we can see the - UBool isLiteral = FALSE; // previous character... - for (int32_t i=0; i<=pattern.length(); ++i) { - // Create the virtual trailing ';' if necessary - if (i == pattern.length()) { - // If the last character was not a non-literal ';'... - if (i > 0 && !(c == SEMICOLON && !isLiteral)) { - c = SEMICOLON; - isLiteral = FALSE; - } else { - break; - } - } else { - c = pattern.charAt(i); - isLiteral = FALSE; - } - - if (c == BACKSLASH) { - if ((i+1) 4 - // Invalid min/max digit count - || prefixLen > 0xFFFF || suffixLen > 0xFFFF) { - // Suffix or prefix too long - status = U_ILLEGAL_ARGUMENT_ERROR; - return; - } - // If there was no prefix and no suffix, then the - // header will not have been allocated yet. We need - // allocate the header now. - if (start == affixes.length()) { - affixes.append(gQuadA); - } - // Fill in 4-character header - affixes.setCharAt(start++, (UChar) prefixLen); - affixes.setCharAt(start++, (UChar) suffixLen); - affixes.setCharAt(start++, (UChar) minDigits); - affixes.setCharAt(start++, (UChar) maxDigits); - start = affixes.length(); - ++affixCount; - prefixLen = suffixLen = minDigits = maxDigits = mode = 0; - break; - default: - isLiteral = TRUE; - break; - } - } - - if (isLiteral) { - if (start == affixes.length()) { - // Make space for the header. Append any four - // characters as place holders for the header values. - // We fill these in when we parse the ';'. - affixes.append(gQuadA); - } - affixes.append(c); - if (mode == 0) { - ++prefixLen; - } else { - // Any literal outside the prefix moves us into mode 3 - // (suffix) - mode = 3; - ++suffixLen; - } - } - } -} - -const UnicodeString& HexToUnicodeTransliterator::toPattern(void) const { - return pattern; -} - -void HexToUnicodeTransliterator::handleTransliterate(Replaceable& text, UTransPosition& offsets, - UBool isIncremental) const { - int32_t cursor = offsets.start; - int32_t limit = offsets.limit; - int32_t i, j, ipat; - - while (cursor < limit) { - // Loop over the specs in affixes. If affixCount is zero (an - // empty pattern), then we do nothing. We exit this loop when - // we match one of the specs. We exit this function (by - // jumping to exit: below) if a partial match is detected and - // isIncremental is true. - for (j=0, ipat=0; j= limit) { - if (i > 0) { - // We've already matched a character. This is - // a partial match, so we return if in - // incremental mode. In non-incremental mode, - // go to the next spec. - if (isIncremental) { - goto exit; - } - match = FALSE; - break; - } - } - UChar c = text.charAt(curs++); - if (c != affixes.charAt(ipat + i)) { - match = FALSE; - break; - } - } - - if (match) { - UChar u = 0; - int32_t digitCount = 0; - for (;;) { - if (curs >= limit) { - // Check for partial match in incremental mode. - if (curs > cursor && isIncremental) { - goto exit; - } - break; - } - int32_t digit = u_digit(text.charAt(curs), 16); - if (digit < 0) { - break; - } - ++curs; - u <<= 4; - u |= digit; - if (++digitCount == maxDigits) { - break; - } - } - - match = (digitCount >= minDigits); - - if (match) { - for (i=0; i= limit) { - // Check for partial match in incremental mode. - if (curs > cursor && isIncremental) { - goto exit; - } - match = FALSE; - break; - } - UChar c = text.charAt(curs++); - if (c != affixes.charAt(ipat + prefixLen + i)) { - match = FALSE; - break; - } - } - - if (match) { - // This is a temporary one-character string - UnicodeString str(u); - - // At this point, we have a match - text.handleReplaceBetween(cursor, curs, str); - limit -= curs - cursor - 1; - // The following break statement leaves the - // loop that is traversing the specs in - // affixes. We then parse the next input - // character. - break; - } - } - } - - ipat += prefixLen + suffixLen; - } - - ++cursor; - } - - exit: - offsets.contextLimit += limit - offsets.limit; - offsets.limit = limit; - offsets.start = cursor; -} - -U_NAMESPACE_END - -#endif /* #if !UCONFIG_NO_TRANSLITERATION */ diff --git a/icuSources/i18n/hextouni.h b/icuSources/i18n/hextouni.h deleted file mode 100644 index 8e0a9140..00000000 --- a/icuSources/i18n/hextouni.h +++ /dev/null @@ -1,198 +0,0 @@ -/* -********************************************************************** -* Copyright (C) 1999-2003, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -* Date Name Description -* 11/17/99 aliu Creation. -********************************************************************** -*/ -#ifndef HEXTOUNI_H -#define HEXTOUNI_H - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_TRANSLITERATION - -#include "unicode/translit.h" - -U_NAMESPACE_BEGIN - -/** - * A transliterator that converts from hexadecimal Unicode escape - * sequences to the characters they represent. For example, "U+0040" - * and '\u0040'. A default HexToUnicodeTransliterator recognizes the - * prefixes "U+", "u+", "\U", and "\u". Hex values may be - * upper- or lowercase. By calling the applyPattern() method, one - * or more custom prefix/suffix pairs may be specified. See - * applyPattern() for details. - * - * @author Alan Liu - * @internal Use transliterator factory methods instead since this class will be removed in that release. - */ -class U_I18N_API HexToUnicodeTransliterator : public Transliterator { - - /** - * ID for this transliterator. - */ - static const char _ID[]; - - /** - * The pattern used by the default constructor - */ - static const UChar DEFAULT_PATTERN[]; - - // Character constants defined here to avoid ASCII dependency - enum { - SEMICOLON = 0x003B, // ';' - ZERO = 0x0030, // '0' - POUND = 0x0023, // '#' - BACKSLASH = 0x005C // '\\' - }; - - /** - * The pattern for this transliterator - */ - UnicodeString pattern; - - /** - * The processed pattern specification. See applyPattern() for - * details. - */ - UnicodeString affixes; - - /** - * The number of different affix sets in affixes. - */ - int32_t affixCount; - - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; - -public: - - /** - * Constructs a transliterator that recognizes the standard - * prefixes "\u", "\U", "u+", and "U+", each with no - * suffix. - * @internal Use transliterator factory methods instead since this class will be removed in that release. - */ - HexToUnicodeTransliterator(UnicodeFilter* adoptedFilter = 0); - - /** - * Constructs a custom transliterator with the given pattern. - * @see #applyPattern - * @internal Use transliterator factory methods instead since this class will be removed in that release. - */ - HexToUnicodeTransliterator(const UnicodeString& pattern, - UErrorCode& status); - - /** - * Constructs a custom transliterator with the given pattern - * and filter. - * @see #applyPattern - * @internal Use transliterator factory methods instead since this class will be removed in that release. - */ - HexToUnicodeTransliterator(const UnicodeString& pattern, - UnicodeFilter* adoptedFilter, - UErrorCode& status); - - /** - * Destructor. - * @internal Use transliterator factory methods instead since this class will be removed in that release. - */ - virtual ~HexToUnicodeTransliterator(); - - /** - * Copy constructor. - * @internal Use transliterator factory methods instead since this class will be removed in that release. - */ - HexToUnicodeTransliterator(const HexToUnicodeTransliterator&); - - /** - * Assignment operator. - * @internal Use transliterator factory methods instead since this class will be removed in that release. - */ - HexToUnicodeTransliterator& operator=(const HexToUnicodeTransliterator&); - - /** - * Transliterator API. - * @internal Use transliterator factory methods instead since this class will be removed in that release. - */ - Transliterator* clone(void) const; - - /** - * Set the patterns recognized by this transliterator. One or - * more patterns may be specified, separated by semicolons (';'). - * Each pattern contains zero or more prefix characters, one or - * more digit characters, and zero or more suffix characters. The - * digit characters indicates optional digits ('#') followed by - * required digits ('0'). The total number of digits cannot - * exceed 4, and must be at least 1 required digit. Use a - * backslash ('\\') to escape any of the special characters. An - * empty pattern is allowed; it specifies a transliterator that - * does nothing. - * - *

    Example: "U+0000;<###0>" specifies two patterns. The first - * has a prefix of "U+", exactly four digits, and no suffix. The - * second has a prefix of "<", between one and four digits, and a - * suffix of ">". - * - *

    -     * pattern := spec | ( pattern ';' spec )
    -     * spec := prefix-char* digit-spec suffix-char*
    -     * digit-spec := '#'* '0'+
    -     * prefix-char := [^special-char] | '\\' special-char
    -     * suffix-char := [^special-char] | '\\' special-char
    -     * special-char := ';' | '0' | '#' | '\\'
    -     * 
    - * @internal Use transliterator factory methods instead since this class will be removed in that release. - */ - void applyPattern(const UnicodeString& thePattern, UErrorCode& status); - - /** - * Return this transliterator's pattern. - * @internal Use transliterator factory methods instead since this class will be removed in that release. - */ - const UnicodeString& toPattern(void) const; - - /** - * Implements {@link Transliterator#handleTransliterate}. - * @internal Use transliterator factory methods instead since this class will be removed in that release. - */ - virtual void handleTransliterate(Replaceable& text, UTransPosition& offset, - UBool isIncremental) const; - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @draft ICU 2.2 - */ - virtual inline UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @draft ICU 2.2 - */ - static inline UClassID getStaticClassID(); -}; - -inline HexToUnicodeTransliterator::~HexToUnicodeTransliterator() {} - -inline UClassID -HexToUnicodeTransliterator::getStaticClassID() -{ return (UClassID)&fgClassID; } - -inline UClassID -HexToUnicodeTransliterator::getDynamicClassID() const -{ return HexToUnicodeTransliterator::getStaticClassID(); } - -U_NAMESPACE_END - -#endif /* #if !UCONFIG_NO_TRANSLITERATION */ - -#endif diff --git a/icuSources/i18n/i18n.dsp b/icuSources/i18n/i18n.dsp index c0fa8eb2..ce857541 100644 --- a/icuSources/i18n/i18n.dsp +++ b/icuSources/i18n/i18n.dsp @@ -55,7 +55,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 icuuc.lib /nologo /base:"0x4a900000" /dll /machine:I386 /out:"..\..\bin\icuin26.dll" /implib:"..\..\lib\icuin.lib" /libpath:"..\..\lib" +# ADD LINK32 icuuc.lib /nologo /base:"0x4a900000" /dll /machine:I386 /out:"..\..\bin\icuin32.dll" /implib:"..\..\lib\icuin.lib" /libpath:"..\..\lib" # SUBTRACT LINK32 /pdb:none /debug !ELSEIF "$(CFG)" == "i18n - Win32 Debug" @@ -82,7 +82,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 icuucd.lib /nologo /base:"0x4a900000" /dll /debug /machine:I386 /out:"..\..\bin\icuin26d.dll" /implib:"..\..\lib\icuind.lib" /pdbtype:sept /libpath:"..\..\lib" +# ADD LINK32 icuucd.lib /nologo /base:"0x4a900000" /dll /debug /machine:I386 /out:"..\..\bin\icuin32d.dll" /implib:"..\..\lib\icuind.lib" /pdbtype:sept /libpath:"..\..\lib" # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "i18n - Win64 Release" @@ -99,7 +99,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "I18N_EXPORTS" /FD /c -# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\include" /I "..\..\source\common" /D "WIN64" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "I18N_EXPORTS" /D "U_I18N_IMPLEMENTATION" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GF /QIA64_fmaopt /Zm600 /c +# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /Ob2 /I "..\..\include" /I "..\..\source\common" /D "WIN64" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "I18N_EXPORTS" /D "U_I18N_IMPLEMENTATION" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GF /Zm600 /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win64 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win64 # ADD BASE RSC /l 0x409 /d "NDEBUG" @@ -109,7 +109,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:IX86 /machine:IA64 -# ADD LINK32 icuuc.lib /nologo /base:"0x4a900000" /dll /machine:IX86 /out:"..\..\bin\icuin26.dll" /implib:"..\..\lib\icuin.lib" /libpath:"..\..\lib" /machine:IA64 +# ADD LINK32 icuuc.lib /nologo /base:"0x4a900000" /dll /machine:IX86 /out:"..\..\bin\icuin32.dll" /implib:"..\..\lib\icuin.lib" /libpath:"..\..\lib" /machine:IA64 # SUBTRACT LINK32 /debug !ELSEIF "$(CFG)" == "i18n - Win64 Debug" @@ -126,7 +126,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "I18N_EXPORTS" /FD /GZ /c -# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\include" /I "..\..\source\common" /D "_WINDOWS" /D "_USRDLL" /D "I18N_EXPORTS" /D "U_I18N_IMPLEMENTATION" /D "WIN64" /D "_DEBUG" /D "_MBCS" /D "UDATA_MAP" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GF /GZ /QIA64_fmaopt /Zm600 /c +# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\include" /I "..\..\source\common" /D "_WINDOWS" /D "_USRDLL" /D "I18N_EXPORTS" /D "U_I18N_IMPLEMENTATION" /D "WIN64" /D "_DEBUG" /D "_MBCS" /D "UDATA_MAP" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GF /GZ /Zm600 /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win64 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win64 # ADD BASE RSC /l 0x409 /d "_DEBUG" @@ -136,7 +136,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:IX86 /pdbtype:sept /machine:IA64 -# ADD LINK32 icuucd.lib /nologo /base:"0x4a900000" /dll /incremental:no /debug /machine:IX86 /out:"..\..\bin\icuin26d.dll" /implib:"..\..\lib\icuind.lib" /pdbtype:sept /libpath:"..\..\lib" /machine:IA64 +# ADD LINK32 icuucd.lib /nologo /base:"0x4a900000" /dll /incremental:no /debug /machine:IX86 /out:"..\..\bin\icuin32d.dll" /implib:"..\..\lib\icuind.lib" /pdbtype:sept /libpath:"..\..\lib" /machine:IA64 !ENDIF @@ -544,6 +544,10 @@ SOURCE=.\ucol_imp.h # End Source File # Begin Source File +SOURCE=.\ucol_sit.cpp +# End Source File +# Begin Source File + SOURCE=.\ucol_tok.cpp # End Source File # Begin Source File @@ -670,6 +674,14 @@ SOURCE=.\usrchimp.h # PROP Default_Filter "" # Begin Source File +SOURCE=.\astro.cpp +# End Source File +# Begin Source File + +SOURCE=.\astro.h +# End Source File +# Begin Source File + SOURCE=.\buddhcal.cpp # End Source File # Begin Source File @@ -729,6 +741,14 @@ InputPath=.\unicode\calendar.h # End Source File # Begin Source File +SOURCE=.\chnsecal.cpp +# End Source File +# Begin Source File + +SOURCE=.\chnsecal.h +# End Source File +# Begin Source File + SOURCE=.\choicfmt.cpp # End Source File # Begin Source File @@ -780,6 +800,116 @@ InputPath=.\unicode\choicfmt.h # End Source File # Begin Source File +SOURCE=.\curramt.cpp +# End Source File +# Begin Source File + +SOURCE=.\unicode\curramt.h + +!IF "$(CFG)" == "i18n - Win32 Release" + +# Begin Custom Build +InputPath=.\unicode\curramt.h + +"..\..\include\unicode\curramt.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "i18n - Win32 Debug" + +# Begin Custom Build +InputPath=.\unicode\curramt.h + +"..\..\include\unicode\curramt.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "i18n - Win64 Release" + +# Begin Custom Build +InputPath=.\unicode\curramt.h + +"..\..\include\unicode\curramt.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "i18n - Win64 Debug" + +# Begin Custom Build +InputPath=.\unicode\curramt.h + +"..\..\include\unicode\curramt.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\currfmt.cpp +# End Source File +# Begin Source File + +SOURCE=.\currfmt.h +# End Source File +# Begin Source File + +SOURCE=.\currunit.cpp +# End Source File +# Begin Source File + +SOURCE=.\unicode\currunit.h + +!IF "$(CFG)" == "i18n - Win32 Release" + +# Begin Custom Build +InputPath=.\unicode\currunit.h + +"..\..\include\unicode\currunit.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "i18n - Win32 Debug" + +# Begin Custom Build +InputPath=.\unicode\currunit.h + +"..\..\include\unicode\currunit.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "i18n - Win64 Release" + +# Begin Custom Build +InputPath=.\unicode\currunit.h + +"..\..\include\unicode\currunit.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "i18n - Win64 Debug" + +# Begin Custom Build +InputPath=.\unicode\currunit.h + +"..\..\include\unicode\currunit.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + SOURCE=.\datefmt.cpp # End Source File # Begin Source File @@ -933,6 +1063,14 @@ InputPath=.\unicode\decimfmt.h # End Source File # Begin Source File +SOURCE=.\digitlst.cpp +# End Source File +# Begin Source File + +SOURCE=.\digitlst.h +# End Source File +# Begin Source File + SOURCE=.\dtfmtsym.cpp # End Source File # Begin Source File @@ -1184,6 +1322,30 @@ InputPath=.\unicode\gregocal.h # End Source File # Begin Source File +SOURCE=.\gregoimp.cpp +# End Source File +# Begin Source File + +SOURCE=.\gregoimp.h +# End Source File +# Begin Source File + +SOURCE=.\hebrwcal.cpp +# End Source File +# Begin Source File + +SOURCE=.\hebrwcal.h +# End Source File +# Begin Source File + +SOURCE=.\islamcal.cpp +# End Source File +# Begin Source File + +SOURCE=.\islamcal.h +# End Source File +# Begin Source File + SOURCE=.\japancal.cpp # End Source File # Begin Source File @@ -1192,6 +1354,108 @@ SOURCE=.\japancal.h # End Source File # Begin Source File +SOURCE=.\measfmt.cpp +# End Source File +# Begin Source File + +SOURCE=.\unicode\measfmt.h + +!IF "$(CFG)" == "i18n - Win32 Release" + +# Begin Custom Build +InputPath=.\unicode\measfmt.h + +"..\..\include\unicode\measfmt.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "i18n - Win32 Debug" + +# Begin Custom Build +InputPath=.\unicode\measfmt.h + +"..\..\include\unicode\measfmt.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "i18n - Win64 Release" + +# Begin Custom Build +InputPath=.\unicode\measfmt.h + +"..\..\include\unicode\measfmt.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "i18n - Win64 Debug" + +# Begin Custom Build +InputPath=.\unicode\measfmt.h + +"..\..\include\unicode\measfmt.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\measure.cpp +# End Source File +# Begin Source File + +SOURCE=.\unicode\measure.h + +!IF "$(CFG)" == "i18n - Win32 Release" + +# Begin Custom Build +InputPath=.\unicode\measure.h + +"..\..\include\unicode\measure.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "i18n - Win32 Debug" + +# Begin Custom Build +InputPath=.\unicode\measure.h + +"..\..\include\unicode\measure.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "i18n - Win64 Release" + +# Begin Custom Build +InputPath=.\unicode\measure.h + +"..\..\include\unicode\measure.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "i18n - Win64 Debug" + +# Begin Custom Build +InputPath=.\unicode\measure.h + +"..\..\include\unicode\measure.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + SOURCE=.\msgfmt.cpp # End Source File # Begin Source File @@ -1322,6 +1586,14 @@ InputPath=.\unicode\numfmt.h # End Source File # Begin Source File +SOURCE=.\olsontz.cpp +# End Source File +# Begin Source File + +SOURCE=.\olsontz.h +# End Source File +# Begin Source File + SOURCE=.\rbnf.cpp # End Source File # Begin Source File @@ -1526,10 +1798,6 @@ InputPath=.\unicode\timezone.h # End Source File # Begin Source File -SOURCE=.\tzdat.h -# End Source File -# Begin Source File - SOURCE=.\ucal.cpp # End Source File # Begin Source File @@ -1632,6 +1900,10 @@ InputPath=.\unicode\ucurr.h # End Source File # Begin Source File +SOURCE=.\ucurrimp.h +# End Source File +# Begin Source File + SOURCE=.\udat.cpp # End Source File # Begin Source File @@ -1786,6 +2058,70 @@ InputPath=.\unicode\unum.h !ENDIF +# End Source File +# Begin Source File + +SOURCE=.\utmscale.c + +!IF "$(CFG)" == "i18n - Win32 Release" + +!ELSEIF "$(CFG)" == "i18n - Win32 Debug" + +!ELSEIF "$(CFG)" == "i18n - Win64 Release" + +# ADD CPP /Od + +!ELSEIF "$(CFG)" == "i18n - Win64 Debug" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\unicode\utmscale.h + +!IF "$(CFG)" == "i18n - Win32 Release" + +# Begin Custom Build +InputPath=.\unicode\utmscale.h + +"..\..\include\unicode\utmscale.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "i18n - Win32 Debug" + +# Begin Custom Build +InputPath=.\unicode\utmscale.h + +"..\..\include\unicode\utmscale.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "i18n - Win64 Release" + +# Begin Custom Build +InputPath=.\unicode\utmscale.h + +"..\..\include\unicode\utmscale.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "i18n - Win64 Debug" + +# Begin Custom Build +InputPath=.\unicode\utmscale.h + +"..\..\include\unicode\utmscale.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ENDIF + # End Source File # End Group # Begin Group "misc" @@ -1886,11 +2222,58 @@ SOURCE=.\rematch.cpp # End Source File # Begin Source File -SOURCE=.\remtrans.cpp +SOURCE=.\repattrn.cpp # End Source File # Begin Source File -SOURCE=.\repattrn.cpp +SOURCE=.\uregex.cpp +# End Source File +# Begin Source File + +SOURCE=.\unicode\uregex.h + +!IF "$(CFG)" == "i18n - Win32 Release" + +# Begin Custom Build +InputPath=.\unicode\uregex.h + +"..\..\include\unicode\uregex.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "i18n - Win32 Debug" + +# Begin Custom Build +InputPath=.\unicode\uregex.h + +"..\..\include\unicode\uregex.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "i18n - Win64 Release" + +# Begin Custom Build +InputPath=.\unicode\uregex.h + +"..\..\include\unicode\uregex.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ELSEIF "$(CFG)" == "i18n - Win64 Debug" + +# Begin Custom Build +InputPath=.\unicode\uregex.h + +"..\..\include\unicode\uregex.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode + +# End Custom Build + +!ENDIF + # End Source File # End Group # Begin Group "transforms" @@ -1906,35 +2289,35 @@ SOURCE=.\anytrans.h # End Source File # Begin Source File -SOURCE=.\cpdtrans.cpp +SOURCE=.\casetrn.cpp # End Source File # Begin Source File -SOURCE=.\cpdtrans.h +SOURCE=.\casetrn.h # End Source File # Begin Source File -SOURCE=.\esctrn.cpp +SOURCE=.\cpdtrans.cpp # End Source File # Begin Source File -SOURCE=.\esctrn.h +SOURCE=.\cpdtrans.h # End Source File # Begin Source File -SOURCE=.\funcrepl.cpp +SOURCE=.\esctrn.cpp # End Source File # Begin Source File -SOURCE=.\funcrepl.h +SOURCE=.\esctrn.h # End Source File # Begin Source File -SOURCE=.\hextouni.cpp +SOURCE=.\funcrepl.cpp # End Source File # Begin Source File -SOURCE=.\hextouni.h +SOURCE=.\funcrepl.h # End Source File # Begin Source File @@ -2010,6 +2393,10 @@ SOURCE=.\rbt_set.h # End Source File # Begin Source File +SOURCE=.\remtrans.cpp +# End Source File +# Begin Source File + SOURCE=.\remtrans.h # End Source File # Begin Source File @@ -2133,18 +2520,14 @@ SOURCE=.\uni2name.h # End Source File # Begin Source File -SOURCE=.\unifltlg.cpp -# End Source File -# Begin Source File - -SOURCE=.\unicode\unifltlg.h +SOURCE=.\unicode\unirepl.h !IF "$(CFG)" == "i18n - Win32 Release" # Begin Custom Build -InputPath=.\unicode\unifltlg.h +InputPath=.\unicode\unirepl.h -"..\..\include\unicode\unifltlg.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" +"..\..\include\unicode\unirepl.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" copy $(InputPath) ..\..\include\unicode # End Custom Build @@ -2152,9 +2535,9 @@ InputPath=.\unicode\unifltlg.h !ELSEIF "$(CFG)" == "i18n - Win32 Debug" # Begin Custom Build -InputPath=.\unicode\unifltlg.h +InputPath=.\unicode\unirepl.h -"..\..\include\unicode\unifltlg.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" +"..\..\include\unicode\unirepl.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" copy $(InputPath) ..\..\include\unicode # End Custom Build @@ -2162,9 +2545,9 @@ InputPath=.\unicode\unifltlg.h !ELSEIF "$(CFG)" == "i18n - Win64 Release" # Begin Custom Build -InputPath=.\unicode\unifltlg.h +InputPath=.\unicode\unirepl.h -"..\..\include\unicode\unifltlg.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" +"..\..\include\unicode\unirepl.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" copy $(InputPath) ..\..\include\unicode # End Custom Build @@ -2172,9 +2555,9 @@ InputPath=.\unicode\unifltlg.h !ELSEIF "$(CFG)" == "i18n - Win64 Debug" # Begin Custom Build -InputPath=.\unicode\unifltlg.h +InputPath=.\unicode\unirepl.h -"..\..\include\unicode\unifltlg.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" +"..\..\include\unicode\unirepl.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" copy $(InputPath) ..\..\include\unicode # End Custom Build @@ -2184,14 +2567,18 @@ InputPath=.\unicode\unifltlg.h # End Source File # Begin Source File -SOURCE=.\unicode\unirepl.h +SOURCE=.\utrans.cpp +# End Source File +# Begin Source File + +SOURCE=.\unicode\utrans.h !IF "$(CFG)" == "i18n - Win32 Release" # Begin Custom Build -InputPath=.\unicode\unirepl.h +InputPath=.\unicode\utrans.h -"..\..\include\unicode\unirepl.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" +"..\..\include\unicode\utrans.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" copy $(InputPath) ..\..\include\unicode # End Custom Build @@ -2199,9 +2586,9 @@ InputPath=.\unicode\unirepl.h !ELSEIF "$(CFG)" == "i18n - Win32 Debug" # Begin Custom Build -InputPath=.\unicode\unirepl.h +InputPath=.\unicode\utrans.h -"..\..\include\unicode\unirepl.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" +"..\..\include\unicode\utrans.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" copy $(InputPath) ..\..\include\unicode # End Custom Build @@ -2209,9 +2596,9 @@ InputPath=.\unicode\unirepl.h !ELSEIF "$(CFG)" == "i18n - Win64 Release" # Begin Custom Build -InputPath=.\unicode\unirepl.h +InputPath=.\unicode\utrans.h -"..\..\include\unicode\unirepl.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" +"..\..\include\unicode\utrans.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" copy $(InputPath) ..\..\include\unicode # End Custom Build @@ -2219,9 +2606,9 @@ InputPath=.\unicode\unirepl.h !ELSEIF "$(CFG)" == "i18n - Win64 Debug" # Begin Custom Build -InputPath=.\unicode\unirepl.h +InputPath=.\unicode\utrans.h -"..\..\include\unicode\unirepl.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" +"..\..\include\unicode\utrans.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" copy $(InputPath) ..\..\include\unicode # End Custom Build @@ -2229,28 +2616,24 @@ InputPath=.\unicode\unirepl.h !ENDIF # End Source File -# Begin Source File - -SOURCE=.\unitohex.cpp -# End Source File -# Begin Source File +# End Group +# Begin Group "locale" -SOURCE=.\unitohex.h -# End Source File +# PROP Default_Filter "" # Begin Source File -SOURCE=.\utrans.cpp +SOURCE=.\ulocdata.c # End Source File # Begin Source File -SOURCE=.\unicode\utrans.h +SOURCE=.\unicode\ulocdata.h !IF "$(CFG)" == "i18n - Win32 Release" # Begin Custom Build -InputPath=.\unicode\utrans.h +InputPath=.\unicode\ulocdata.h -"..\..\include\unicode\utrans.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" +"..\..\include\unicode\ulocdata.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" copy $(InputPath) ..\..\include\unicode # End Custom Build @@ -2258,9 +2641,9 @@ InputPath=.\unicode\utrans.h !ELSEIF "$(CFG)" == "i18n - Win32 Debug" # Begin Custom Build -InputPath=.\unicode\utrans.h +InputPath=.\unicode\ulocdata.h -"..\..\include\unicode\utrans.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" +"..\..\include\unicode\ulocdata.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" copy $(InputPath) ..\..\include\unicode # End Custom Build @@ -2268,9 +2651,9 @@ InputPath=.\unicode\utrans.h !ELSEIF "$(CFG)" == "i18n - Win64 Release" # Begin Custom Build -InputPath=.\unicode\utrans.h +InputPath=.\unicode\ulocdata.h -"..\..\include\unicode\utrans.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" +"..\..\include\unicode\ulocdata.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" copy $(InputPath) ..\..\include\unicode # End Custom Build @@ -2278,9 +2661,9 @@ InputPath=.\unicode\utrans.h !ELSEIF "$(CFG)" == "i18n - Win64 Debug" # Begin Custom Build -InputPath=.\unicode\utrans.h +InputPath=.\unicode\ulocdata.h -"..\..\include\unicode\utrans.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" +"..\..\include\unicode\ulocdata.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" copy $(InputPath) ..\..\include\unicode # End Custom Build diff --git a/icuSources/i18n/i18n.rc b/icuSources/i18n/i18n.rc index f41fc69a..120a13fb 100644 --- a/icuSources/i18n/i18n.rc +++ b/icuSources/i18n/i18n.rc @@ -1,29 +1,50 @@ -// Version Resource file for ICU I18N library. - // Do not edit with Microsoft Developer Studio Resource Editor. // It will permanently substitute version numbers that are intended to be // picked up by the pre-processor during each build. // Copyright (c) 2001-2003 International Business Machines // Corporation and others. All Rights Reserved. // +#include "../common/msvcres.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // -#include "winresrc.h" - +#include ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// -// +// LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #pragma code_page(1252) -#include "unicode\uversion.h" +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "../common/msvcres.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include \0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + ///////////////////////////////////////////////////////////////////////////// // @@ -59,7 +80,6 @@ BEGIN #else VALUE "OriginalFilename", "icuin" U_ICU_VERSION_SHORT ".dll\0") #endif - VALUE "PrivateBuild", "\0" VALUE "ProductName", "International Components for Unicode\0" VALUE "ProductVersion", CommaVersionString(U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, 0) @@ -74,3 +94,15 @@ END ///////////////////////////////////////////////////////////////////////////// + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/icuSources/i18n/i18n.vcproj b/icuSources/i18n/i18n.vcproj index 49f9a623..5c5702a0 100644 --- a/icuSources/i18n/i18n.vcproj +++ b/icuSources/i18n/i18n.vcproj @@ -1,7 +1,7 @@ - + @@ -23,8 +23,8 @@ InlineFunctionExpansion="2" EnableIntrinsicFunctions="TRUE" ImproveFloatingPointConsistency="TRUE" - AdditionalIncludeDirectories="..\..\include,..\..\source\common" - PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;I18N_EXPORTS;U_I18N_IMPLEMENTATION" + AdditionalIncludeDirectories="..\..\include,..\common" + PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;U_I18N_IMPLEMENTATION" StringPooling="TRUE" RuntimeLibrary="2" EnableFunctionLevelLinking="TRUE" @@ -42,13 +42,10 @@ Name="VCCustomBuildTool"/> + TypeLibraryName=".\..\..\lib\icuin.tlb"/> + + + + TypeLibraryName=".\..\..\lib\icuind.tlb"/> + + + + + + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + @@ -345,17 +356,17 @@ Name="Release|Win32"> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + + + @@ -402,19 +419,25 @@ Name="Release|Win32"> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + + + @@ -424,17 +447,67 @@ Name="Release|Win32"> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + + + + + + + + + + + + + + + + + + + + + + + + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + + + @@ -512,17 +591,17 @@ Name="Release|Win32"> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -625,17 +785,17 @@ Name="Release|Win32"> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + + + @@ -690,17 +856,17 @@ Name="Release|Win32"> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> - - @@ -781,17 +944,17 @@ Name="Release|Win32"> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + @@ -825,17 +991,39 @@ Name="Release|Win32"> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + + + + + + + + + + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + + + + + + @@ -908,17 +1110,17 @@ Name="Release|Win32"> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + + + + + + + + + + + + + + @@ -976,12 +1206,6 @@ - - - - @@ -1048,6 +1272,9 @@ + + @@ -1075,17 +1302,17 @@ Name="Release|Win32"> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> - - - - - - - - - - + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> - - - - @@ -1168,17 +1367,17 @@ Name="Release|Win32"> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> diff --git a/icuSources/i18n/islamcal.cpp b/icuSources/i18n/islamcal.cpp new file mode 100644 index 00000000..eda1cc36 --- /dev/null +++ b/icuSources/i18n/islamcal.cpp @@ -0,0 +1,528 @@ +/* + * Copyright (C) 2003-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ****************************************************************************** + * + * File ISLAMCAL.H + * + * Modification History: + * + * Date Name Description + * 10/14/2003 srl ported from java IslamicCalendar + ***************************************************************************** + */ + +#include "islamcal.h" + +#if !UCONFIG_NO_FORMATTING + +#include "mutex.h" +#include +#include "gregoimp.h" // Math +#include "astro.h" // CalendarAstronomer +#include "uhash.h" +#include "ucln_in.h" + +static const UDate HIJRA_MILLIS = -42521587200000.0; // 7/16/622 AD 00:00 + +// Debugging +#ifdef U_DEBUG_ISLAMCAL +# include +# include +static void debug_islamcal_loc(const char *f, int32_t l) +{ + fprintf(stderr, "%s:%d: ", f, l); +} + +static void debug_islamcal_msg(const char *pat, ...) +{ + va_list ap; + va_start(ap, pat); + vfprintf(stderr, pat, ap); + fflush(stderr); +} +// must use double parens, i.e.: U_DEBUG_ISLAMCAL_MSG(("four is: %d",4)); +#define U_DEBUG_ISLAMCAL_MSG(x) {debug_islamcal_loc(__FILE__,__LINE__);debug_islamcal_msg x;} +#else +#define U_DEBUG_ISLAMCAL_MSG(x) +#endif + + +// --- The cache -- +// cache of months +static UMTX astroLock = 0; // pod bay door lock +static CalendarCache *gMonthCache = NULL; +static CalendarAstronomer *gIslamicCalendarAstro = NULL; + +U_CDECL_BEGIN +static UBool calendar_islamic_cleanup(void) { + if (gMonthCache) { + delete gMonthCache; + gMonthCache = NULL; + } + if (gIslamicCalendarAstro) { + delete gIslamicCalendarAstro; + gIslamicCalendarAstro = NULL; + } + umtx_destroy(&astroLock); + return TRUE; +} +U_CDECL_END + +U_NAMESPACE_BEGIN + +// Implementation of the IslamicCalendar class + +//------------------------------------------------------------------------- +// Constructors... +//------------------------------------------------------------------------- + +const char *IslamicCalendar::getType() const { + if(civil==CIVIL) { + return "islamic-civil"; + } else { + return "islamic"; + } +} + +Calendar* IslamicCalendar::clone() const { + return new IslamicCalendar(*this); +} + +IslamicCalendar::IslamicCalendar(const Locale& aLocale, UErrorCode& success, ECivil beCivil) + : Calendar(TimeZone::createDefault(), aLocale, success), + civil(beCivil) +{ + setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly. +} + +IslamicCalendar::IslamicCalendar(const IslamicCalendar& other) : Calendar(other), civil(other.civil) { +} + +IslamicCalendar::~IslamicCalendar() +{ +} + +/** + * Determines whether this object uses the fixed-cycle Islamic civil calendar + * or an approximation of the religious, astronomical calendar. + * + * @param beCivil true to use the civil calendar, + * false to use the astronomical calendar. + * @draft ICU 2.4 + */ +void IslamicCalendar::setCivil(ECivil beCivil, UErrorCode &status) +{ + if (civil != beCivil) { + // The fields of the calendar will become invalid, because the calendar + // rules are different + UDate m = getTimeInMillis(status); + civil = beCivil; + clear(); + setTimeInMillis(m, status); + } +} + +/** + * Returns true if this object is using the fixed-cycle civil + * calendar, or false if using the religious, astronomical + * calendar. + * @draft ICU 2.4 + */ +UBool IslamicCalendar::isCivil() { + return (civil == CIVIL); +} + +//------------------------------------------------------------------------- +// Minimum / Maximum access functions +//------------------------------------------------------------------------- + +static const int32_t LIMITS[UCAL_FIELD_COUNT][4] = { + // Minimum Greatest Least Maximum + // Minimum Maximum + { 0, 0, 0, 0 }, // ERA + { 1, 1, 5000000, 5000000 }, // YEAR + { 0, 0, 11, 11 }, // MONTH + { 1, 1, 51, 52 }, // WEEK_OF_YEAR + { 0, 0, 5, 6 }, // WEEK_OF_MONTH + { 1, 1, 29, 30 }, // DAY_OF_MONTH + { 1, 1, 354, 355 }, // DAY_OF_YEAR + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // DAY_OF_WEEK + { -1, -1, 4, 5 }, // DAY_OF_WEEK_IN_MONTH + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // AM_PM + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // HOUR + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // HOUR_OF_DAY + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // MINUTE + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // SECOND + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // MILLISECOND + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // ZONE_OFFSET + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // DST_OFFSET + { 1, 1, 5000001, 5000001 }, // YEAR_WOY + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // DOW_LOCAL + { 1, 1, 5000000, 5000000 }, // EXTENDED_YEAR + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // JULIAN_DAY + {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1} // MILLISECONDS_IN_DAY +}; + +/** + * @draft ICU 2.4 + */ +int32_t IslamicCalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) const { + return LIMITS[field][limitType]; +} + +//------------------------------------------------------------------------- +// Assorted calculation utilities +// + +/** + * Determine whether a year is a leap year in the Islamic civil calendar + */ +UBool IslamicCalendar::civilLeapYear(int32_t year) +{ + return (14 + 11 * year) % 30 < 11; +} + +/** + * Return the day # on which the given year starts. Days are counted + * from the Hijri epoch, origin 0. + */ +int32_t IslamicCalendar::yearStart(int32_t year) { + if (civil == CIVIL) { + return (year-1)*354 + Math::floorDivide((3+11*year),30); + } else { + return trueMonthStart(12*(year-1)); + } +} + +/** + * Return the day # on which the given month starts. Days are counted + * from the Hijri epoch, origin 0. + * + * @param year The hijri year + * @param year The hijri month, 0-based + */ +int32_t IslamicCalendar::monthStart(int32_t year, int32_t month) const { + if (civil == CIVIL) { + return (int32_t)uprv_ceil(29.5*month) + + (year-1)*354 + (int32_t)Math::floorDivide((3+11*year),30); + } else { + return trueMonthStart(12*(year-1) + month); + } +} + +/** + * Find the day number on which a particular month of the true/lunar + * Islamic calendar starts. + * + * @param month The month in question, origin 0 from the Hijri epoch + * + * @return The day number on which the given month starts. + */ +int32_t IslamicCalendar::trueMonthStart(int32_t month) const +{ + UErrorCode status = U_ZERO_ERROR; + int32_t start = CalendarCache::get(&gMonthCache, month, status); + + if (start==0) { + // Make a guess at when the month started, using the average length + UDate origin = HIJRA_MILLIS + + uprv_floor(month * CalendarAstronomer::SYNODIC_MONTH - 1) * kOneDay; + + double age = moonAge(origin); + + if (moonAge(origin) >= 0) { + // The month has already started + do { + origin -= kOneDay; + age = moonAge(origin); + } while (age >= 0); + } + else { + // Preceding month has not ended yet. + do { + origin += kOneDay; + age = moonAge(origin); + } while (age < 0); + } + start = (int32_t)Math::floorDivide((origin - HIJRA_MILLIS), (double)kOneDay) + 1; + CalendarCache::put(&gMonthCache, month, start, status); + } + if(U_FAILURE(status)) { + start = 0; + } + return start; +} + +/** + * Return the "age" of the moon at the given time; this is the difference + * in ecliptic latitude between the moon and the sun. This method simply + * calls CalendarAstronomer.moonAge, converts to degrees, + * and adjusts the result to be in the range [-180, 180]. + * + * @param time The time at which the moon's age is desired, + * in millis since 1/1/1970. + */ +double IslamicCalendar::moonAge(UDate time) +{ + double age = 0; + + umtx_lock(&astroLock); + if(gIslamicCalendarAstro == NULL) { + gIslamicCalendarAstro = new CalendarAstronomer(); + } + gIslamicCalendarAstro->setTime(time); + age = gIslamicCalendarAstro->getMoonAge(); + ucln_i18n_registerCleanup(UCLN_I18N_ISLAMIC_CALENDAR, calendar_islamic_cleanup); + umtx_unlock(&astroLock); + + // Convert to degrees and normalize... + age = age * 180 / CalendarAstronomer::PI; + if (age > 180) { + age = age - 360; + } + + return age; +} + +//---------------------------------------------------------------------- +// Calendar framework +//---------------------------------------------------------------------- + +/** + * Return the length (in days) of the given month. + * + * @param year The hijri year + * @param year The hijri month, 0-based + * @draft ICU 2.4 + */ +int32_t IslamicCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month) const { + + int32_t length = 0; + + if (civil == CIVIL) { + length = 29 + (month+1) % 2; + if (month == DHU_AL_HIJJAH && civilLeapYear(extendedYear)) { + length++; + } + } else { + month = 12*(extendedYear-1) + month; + length = trueMonthStart(month+1) - trueMonthStart(month) ; + } + return length; +} + +/** + * Return the number of days in the given Islamic year + * @draft ICU 2.4 + */ +int32_t IslamicCalendar::handleGetYearLength(int32_t extendedYear) const { + if (civil == CIVIL) { + return 354 + (civilLeapYear(extendedYear) ? 1 : 0); + } else { + int32_t month = 12*(extendedYear-1); + return (trueMonthStart(month + 12) - trueMonthStart(month)); + } +} + +//------------------------------------------------------------------------- +// Functions for converting from field values to milliseconds.... +//------------------------------------------------------------------------- + +// Return JD of start of given month/year +/** + * @draft ICU 2.4 + */ +int32_t IslamicCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, UBool /* useMonth */) const { + return monthStart(eyear, month) + 1948439; +} + +//------------------------------------------------------------------------- +// Functions for converting from milliseconds to field values +//------------------------------------------------------------------------- + + /** + * @draft ICU 2.4 + */ +int32_t IslamicCalendar::handleGetExtendedYear() { + int32_t year; + if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) { + year = internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1 + } else { + year = internalGet(UCAL_YEAR, 1); // Default to year 1 + } + return year; +} + +/** + * Override Calendar to compute several fields specific to the Islamic + * calendar system. These are: + * + *
    • ERA + *
    • YEAR + *
    • MONTH + *
    • DAY_OF_MONTH + *
    • DAY_OF_YEAR + *
    • EXTENDED_YEAR
    + * + * The DAY_OF_WEEK and DOW_LOCAL fields are already set when this + * method is called. The getGregorianXxx() methods return Gregorian + * calendar equivalents for the given Julian day. + * @draft ICU 2.4 + */ +void IslamicCalendar::handleComputeFields(int32_t julianDay, UErrorCode &/*status*/) { + int32_t year, month, dayOfMonth, dayOfYear; + UDate startDate; + int32_t days = julianDay - 1948440; + + if (civil == CIVIL) { + // Use the civil calendar approximation, which is just arithmetic + year = (int)Math::floorDivide( (double)(30 * days + 10646) , 10631.0 ); + month = (int32_t)uprv_ceil((days - 29 - yearStart(year)) / 29.5 ); + month = month<11?month:11; + startDate = monthStart(year, month); + } else { + // Guess at the number of elapsed full months since the epoch + int32_t months = (int32_t)uprv_floor((double)days / CalendarAstronomer::SYNODIC_MONTH); + + startDate = uprv_floor(months * CalendarAstronomer::SYNODIC_MONTH - 1); + + if ( days - startDate >= 28 && moonAge(internalGetTime()) > 0) { + // If we're near the end of the month, assume next month and search backwards + months++; + } + + // Find out the last time that the new moon was actually visible at this longitude + // This returns midnight the night that the moon was visible at sunset. + while ((startDate = trueMonthStart(months)) > days) { + // If it was after the date in question, back up a month and try again + months--; + } + + year = months / 12 + 1; + month = months % 12; + } + + dayOfMonth = (days - monthStart(year, month)) + 1; + + // Now figure out the day of the year. + dayOfYear = (days - monthStart(year, 0) + 1); + + internalSet(UCAL_ERA, 0); + internalSet(UCAL_YEAR, year); + internalSet(UCAL_EXTENDED_YEAR, year); + internalSet(UCAL_MONTH, month); + internalSet(UCAL_DAY_OF_MONTH, dayOfMonth); + internalSet(UCAL_DAY_OF_YEAR, dayOfYear); +} + +UBool +IslamicCalendar::inDaylightTime(UErrorCode& status) const +{ +// copied from GregorianCalendar +if (U_FAILURE(status) || !getTimeZone().useDaylightTime()) + return FALSE; + + // Force an update of the state of the Calendar. +((IslamicCalendar*)this)->complete(status); // cast away const + +return (UBool)(U_SUCCESS(status) ? (internalGet(UCAL_DST_OFFSET) != 0) : FALSE); +} + +// default century +const UDate IslamicCalendar::fgSystemDefaultCentury = DBL_MIN; +const int32_t IslamicCalendar::fgSystemDefaultCenturyYear = -1; + +UDate IslamicCalendar::fgSystemDefaultCenturyStart = DBL_MIN; +int32_t IslamicCalendar::fgSystemDefaultCenturyStartYear = -1; + + +UBool IslamicCalendar::haveDefaultCentury() const +{ + return TRUE; +} + +UDate IslamicCalendar::defaultCenturyStart() const +{ + return internalGetDefaultCenturyStart(); +} + +int32_t IslamicCalendar::defaultCenturyStartYear() const +{ + return internalGetDefaultCenturyStartYear(); +} + +UDate +IslamicCalendar::internalGetDefaultCenturyStart() const +{ + // lazy-evaluate systemDefaultCenturyStart + UBool needsUpdate; + { + Mutex m; + needsUpdate = (fgSystemDefaultCenturyStart == fgSystemDefaultCentury); + } + + if (needsUpdate) { + initializeSystemDefaultCentury(); + } + + // use defaultCenturyStart unless it's the flag value; + // then use systemDefaultCenturyStart + + return fgSystemDefaultCenturyStart; +} + +int32_t +IslamicCalendar::internalGetDefaultCenturyStartYear() const +{ + // lazy-evaluate systemDefaultCenturyStartYear + UBool needsUpdate; + { + Mutex m; + needsUpdate = (fgSystemDefaultCenturyStart == fgSystemDefaultCentury); + } + + if (needsUpdate) { + initializeSystemDefaultCentury(); + } + + // use defaultCenturyStart unless it's the flag value; + // then use systemDefaultCenturyStartYear + + return fgSystemDefaultCenturyStartYear; +} + +void +IslamicCalendar::initializeSystemDefaultCentury() +{ + // initialize systemDefaultCentury and systemDefaultCenturyYear based + // on the current time. They'll be set to 80 years before + // the current time. + // No point in locking as it should be idempotent. + if (fgSystemDefaultCenturyStart == fgSystemDefaultCentury) + { + UErrorCode status = U_ZERO_ERROR; + IslamicCalendar calendar(Locale("@calendar=islamic-civil"),status); + if (U_SUCCESS(status)) + { + calendar.setTime(Calendar::getNow(), status); + calendar.add(UCAL_YEAR, -80, status); + UDate newStart = calendar.getTime(status); + int32_t newYear = calendar.get(UCAL_YEAR, status); + { + Mutex m; + fgSystemDefaultCenturyStart = newStart; + fgSystemDefaultCenturyStartYear = newYear; + } + } + // We have no recourse upon failure unless we want to propagate the failure + // out. + } +} + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(IslamicCalendar) + +U_NAMESPACE_END + +#endif + diff --git a/icuSources/i18n/islamcal.h b/icuSources/i18n/islamcal.h new file mode 100644 index 00000000..fbcd9511 --- /dev/null +++ b/icuSources/i18n/islamcal.h @@ -0,0 +1,462 @@ +/* + * Copyright (C) 2003-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ****************************************************************************** + * + * File ISLAMCAL.H + * + * Modification History: + * + * Date Name Description + * 10/14/2003 srl ported from java IslamicCalendar + ***************************************************************************** + */ + +#ifndef ISLAMCAL_H +#define ISLAMCAL_H + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/calendar.h" + +U_NAMESPACE_BEGIN + +/** + * IslamicCalendar is a subclass of Calendar + * that that implements the Islamic civil and religious calendars. It + * is used as the civil calendar in most of the Arab world and the + * liturgical calendar of the Islamic faith worldwide. This calendar + * is also known as the "Hijri" calendar, since it starts at the time + * of Mohammed's emigration (or "hijra") to Medinah on Thursday, + * July 15, 622 AD (Julian). + *

    + * The Islamic calendar is strictly lunar, and thus an Islamic year of twelve + * lunar months does not correspond to the solar year used by most other + * calendar systems, including the Gregorian. An Islamic year is, on average, + * about 354 days long, so each successive Islamic year starts about 11 days + * earlier in the corresponding Gregorian year. + *

    + * Each month of the calendar starts when the new moon's crescent is visible + * at sunset. However, in order to keep the time fields in this class + * synchronized with those of the other calendars and with local clock time, + * we treat days and months as beginning at midnight, + * roughly 6 hours after the corresponding sunset. + *

    + * There are two main variants of the Islamic calendar in existence. The first + * is the civil calendar, which uses a fixed cycle of alternating 29- + * and 30-day months, with a leap day added to the last month of 11 out of + * every 30 years. This calendar is easily calculated and thus predictable in + * advance, so it is used as the civil calendar in a number of Arab countries. + * This is the default behavior of a newly-created IslamicCalendar + * object. + *

    + * The Islamic religious calendar, however, is based on the observation + * of the crescent moon. It is thus affected by the position at which the + * observations are made, seasonal variations in the time of sunset, the + * eccentricities of the moon's orbit, and even the weather at the observation + * site. This makes it impossible to calculate in advance, and it causes the + * start of a month in the religious calendar to differ from the civil calendar + * by up to three days. + *

    + * Using astronomical calculations for the position of the sun and moon, the + * moon's illumination, and other factors, it is possible to determine the start + * of a lunar month with a fairly high degree of certainty. However, these + * calculations are extremely complicated and thus slow, so most algorithms, + * including the one used here, are only approximations of the true astronical + * calculations. At present, the approximations used in this class are fairly + * simplistic; they will be improved in later versions of the code. + *

    + * The {@link #setCivil setCivil} method determines + * which approach is used to determine the start of a month. By default, the + * fixed-cycle civil calendar is used. However, if setCivil(false) + * is called, an approximation of the true lunar calendar will be used. + * + * @see GregorianCalendar + * + * @author Laura Werner + * @author Alan Liu + * @author Steven R. Loomis + * @internal + */ +class U_I18N_API IslamicCalendar : public Calendar { + public: + //------------------------------------------------------------------------- + // Constants... + //------------------------------------------------------------------------- + /** + * Calendar type - civil or religious + * @internal + */ + enum ECivil { + ASTRONOMICAL, + CIVIL + }; + + /** + * Constants for the months + * @internal + */ + enum EMonths { + /** + * Constant for Muharram, the 1st month of the Islamic year. + * @internal + */ + MUHARRAM = 0, + + /** + * Constant for Safar, the 2nd month of the Islamic year. + * @internal + */ + SAFAR = 1, + + /** + * Constant for Rabi' al-awwal (or Rabi' I), the 3rd month of the Islamic year. + * @internal + */ + RABI_1 = 2, + + /** + * Constant for Rabi' al-thani or (Rabi' II), the 4th month of the Islamic year. + * @internal + */ + RABI_2 = 3, + + /** + * Constant for Jumada al-awwal or (Jumada I), the 5th month of the Islamic year. + * @internal + */ + JUMADA_1 = 4, + + /** + * Constant for Jumada al-thani or (Jumada II), the 6th month of the Islamic year. + * @internal + */ + JUMADA_2 = 5, + + /** + * Constant for Rajab, the 7th month of the Islamic year. + * @internal + */ + RAJAB = 6, + + /** + * Constant for Sha'ban, the 8th month of the Islamic year. + * @internal + */ + SHABAN = 7, + + /** + * Constant for Ramadan, the 9th month of the Islamic year. + * @internal + */ + RAMADAN = 8, + + /** + * Constant for Shawwal, the 10th month of the Islamic year. + * @internal + */ + SHAWWAL = 9, + + /** + * Constant for Dhu al-Qi'dah, the 11th month of the Islamic year. + * @internal + */ + DHU_AL_QIDAH = 10, + + /** + * Constant for Dhu al-Hijjah, the 12th month of the Islamic year. + * @internal + */ + DHU_AL_HIJJAH = 11, + + ISLAMIC_MONTH_MAX + }; + + + + //------------------------------------------------------------------------- + // Constructors... + //------------------------------------------------------------------------- + + /** + * Constructs an IslamicCalendar based on the current time in the default time zone + * with the given locale. + * + * @param aLocale The given locale. + * @param success Indicates the status of IslamicCalendar object construction. + * Returns U_ZERO_ERROR if constructed successfully. + * @param beCivil Whether the calendar should be civil (default-TRUE) or religious (FALSE) + * @internal + */ + IslamicCalendar(const Locale& aLocale, UErrorCode &success, ECivil beCivil = CIVIL); + + /** + * Copy Constructor + * @internal + */ + IslamicCalendar(const IslamicCalendar& other); + + /** + * Destructor. + * @internal + */ + virtual ~IslamicCalendar(); + + /** + * Determines whether this object uses the fixed-cycle Islamic civil calendar + * or an approximation of the religious, astronomical calendar. + * + * @param beCivil CIVIL to use the civil calendar, + * ASTRONOMICAL to use the astronomical calendar. + * @internal + */ + void setCivil(ECivil beCivil, UErrorCode &status); + + /** + * Returns true if this object is using the fixed-cycle civil + * calendar, or false if using the religious, astronomical + * calendar. + * @internal + */ + UBool isCivil(); + + + // TODO: copy c'tor, etc + + // clone + virtual Calendar* clone() const; + + private: + /** + * Determine whether a year is a leap year in the Islamic civil calendar + */ + static UBool civilLeapYear(int32_t year); + + /** + * Return the day # on which the given year starts. Days are counted + * from the Hijri epoch, origin 0. + */ + int32_t yearStart(int32_t year); + + /** + * Return the day # on which the given month starts. Days are counted + * from the Hijri epoch, origin 0. + * + * @param year The hijri year + * @param year The hijri month, 0-based + */ + int32_t monthStart(int32_t year, int32_t month) const; + + /** + * Find the day number on which a particular month of the true/lunar + * Islamic calendar starts. + * + * @param month The month in question, origin 0 from the Hijri epoch + * + * @return The day number on which the given month starts. + */ + int32_t trueMonthStart(int32_t month) const; + + /** + * Return the "age" of the moon at the given time; this is the difference + * in ecliptic latitude between the moon and the sun. This method simply + * calls CalendarAstronomer.moonAge, converts to degrees, + * and adjusts the resultto be in the range [-180, 180]. + * + * @param time The time at which the moon's age is desired, + * in millis since 1/1/1970. + */ + static double moonAge(UDate time); + + //------------------------------------------------------------------------- + // Internal data.... + // + + /** + * CIVIL if this object uses the fixed-cycle Islamic civil calendar, + * and ASTRONOMICAL if it approximates the true religious calendar using + * astronomical calculations for the time of the new moon. + */ + ECivil civil; + + //---------------------------------------------------------------------- + // Calendar framework + //---------------------------------------------------------------------- + protected: + /** + * @internal + */ + virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const; + + /** + * Return the length (in days) of the given month. + * + * @param year The hijri year + * @param year The hijri month, 0-based + * @internal + */ + virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const; + + /** + * Return the number of days in the given Islamic year + * @internal + */ + virtual int32_t handleGetYearLength(int32_t extendedYear) const; + + //------------------------------------------------------------------------- + // Functions for converting from field values to milliseconds.... + //------------------------------------------------------------------------- + + // Return JD of start of given month/year + /** + * @internal + */ + virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth) const; + + //------------------------------------------------------------------------- + // Functions for converting from milliseconds to field values + //------------------------------------------------------------------------- + + /** + * @internal + */ + virtual int32_t handleGetExtendedYear(); + + /** + * Override Calendar to compute several fields specific to the Islamic + * calendar system. These are: + * + *

    • ERA + *
    • YEAR + *
    • MONTH + *
    • DAY_OF_MONTH + *
    • DAY_OF_YEAR + *
    • EXTENDED_YEAR
    + * + * The DAY_OF_WEEK and DOW_LOCAL fields are already set when this + * method is called. The getGregorianXxx() methods return Gregorian + * calendar equivalents for the given Julian day. + * @internal + */ + virtual void handleComputeFields(int32_t julianDay, UErrorCode &status); + + // UObject stuff + public: + /** + * @return The class ID for this object. All objects of a given class have the + * same class ID. Objects of other classes have different class IDs. + * @internal + */ + virtual UClassID getDynamicClassID(void) const; + + /** + * Return the class ID for this class. This is useful only for comparing to a return + * value from getDynamicClassID(). For example: + * + * Base* polymorphic_pointer = createPolymorphicObject(); + * if (polymorphic_pointer->getDynamicClassID() == + * Derived::getStaticClassID()) ... + * + * @return The class ID for all objects of this class. + * @internal + */ + static UClassID U_EXPORT2 getStaticClassID(void); + + /** + * return the calendar type, "buddhist". + * + * @return calendar type + * @internal + */ + virtual const char * getType() const; + + private: + IslamicCalendar(); // default constructor not implemented + + // Default century. + protected: + + /** + * (Overrides Calendar) Return true if the current date for this Calendar is in + * Daylight Savings Time. Recognizes DST_OFFSET, if it is set. + * + * @param status Fill-in parameter which receives the status of this operation. + * @return True if the current date for this Calendar is in Daylight Savings Time, + * false, otherwise. + * @internal + */ + virtual UBool inDaylightTime(UErrorCode& status) const; + + + /** + * Returns TRUE because the Islamic Calendar does have a default century + * @internal + */ + virtual UBool haveDefaultCentury() const; + + /** + * Returns the date of the start of the default century + * @return start of century - in milliseconds since epoch, 1970 + * @internal + */ + virtual UDate defaultCenturyStart() const; + + /** + * Returns the year in which the default century begins + * @internal + */ + virtual int32_t defaultCenturyStartYear() const; + + private: // default century stuff. + /** + * The system maintains a static default century start date. This is initialized + * the first time it is used. Before then, it is set to SYSTEM_DEFAULT_CENTURY to + * indicate an uninitialized state. Once the system default century date and year + * are set, they do not change. + */ + static UDate fgSystemDefaultCenturyStart; + + /** + * See documentation for systemDefaultCenturyStart. + */ + static int32_t fgSystemDefaultCenturyStartYear; + + /** + * Default value that indicates the defaultCenturyStartYear is unitialized + */ + static const int32_t fgSystemDefaultCenturyYear; + + /** + * start of default century, as a date + */ + static const UDate fgSystemDefaultCentury; + + /** + * Returns the beginning date of the 100-year window that dates + * with 2-digit years are considered to fall within. + */ + UDate internalGetDefaultCenturyStart(void) const; + + /** + * Returns the first year of the 100-year window that dates with + * 2-digit years are considered to fall within. + */ + int32_t internalGetDefaultCenturyStartYear(void) const; + + /** + * Initializes the 100-year window that dates with 2-digit years + * are considered to fall within so that its start date is 80 years + * before the current time. + */ + static void initializeSystemDefaultCentury(void); +}; + +U_NAMESPACE_END + +#endif +#endif + + + diff --git a/icuSources/i18n/japancal.cpp b/icuSources/i18n/japancal.cpp index b4e83165..a8e51db4 100644 --- a/icuSources/i18n/japancal.cpp +++ b/icuSources/i18n/japancal.cpp @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 2003, International Business Machines Corporation and * +* Copyright (C) 2003-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* * @@ -17,6 +17,8 @@ #include "japancal.h" #include "unicode/gregocal.h" +#include "mutex.h" +#include "uassert.h" //#define U_DEBUG_JCAL @@ -26,7 +28,7 @@ U_NAMESPACE_BEGIN -const char JapaneseCalendar::fgClassID = 0; // Value is irrelevant +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(JapaneseCalendar) // Gregorian date of each emperor's ascension // Years are AD, months are 1-based. @@ -199,10 +201,10 @@ static const struct { { 1370, 7, 24 }, // Kentoku 160 { 1372, 4, 1 }, // Bunch\u0169 { 1375, 5, 27 }, // Tenju + { 1379, 3, 22 }, // Koryaku { 1381, 2, 10 }, // Kowa { 1384, 4, 28 }, // Gench\u0169 { 1384, 2, 27 }, // Meitoku - { 1379, 3, 22 }, // Koryaku { 1387, 8, 23 }, // Kakei { 1389, 2, 9 }, // Koo { 1390, 3, 26 }, // Meitoku @@ -309,48 +311,12 @@ const char *JapaneseCalendar::getType() const return "japanese"; } - -int32_t -JapaneseCalendar::getMaximum(UCalendarDateFields field) const -{ - if(field == UCAL_ERA) { - return kCurrentEra; - } else { - return GregorianCalendar::getMaximum(field); - } -} - -int32_t -JapaneseCalendar::getLeastMaximum(UCalendarDateFields field) const -{ - if(field == UCAL_ERA) { - return kCurrentEra; - } else { - return GregorianCalendar::getLeastMaximum(field); - } -} - -int32_t -JapaneseCalendar::monthLength(int32_t month, int32_t year) const -{ - return GregorianCalendar::monthLength(month,year); -} - - -int32_t -JapaneseCalendar::monthLength(int32_t month) const -{ - UErrorCode status = U_ZERO_ERROR; - int32_t year = internalGet(UCAL_YEAR); - // ignore era - return GregorianCalendar::monthLength(month, getGregorianYear(status)); -} - -int32_t JapaneseCalendar::getDefaultMonthInYear() const +int32_t JapaneseCalendar::getDefaultMonthInYear() { UErrorCode status = U_ZERO_ERROR; int32_t era = internalGetEra(); - int32_t year = getGregorianYear(status); + computeFields(status); // slow + int32_t year = getGregorianYear(); // TODO do we assume we can trust 'era'? What if it is denormalized? int32_t month = GregorianCalendar::getDefaultMonthInYear(); @@ -362,19 +328,15 @@ int32_t JapaneseCalendar::getDefaultMonthInYear() const return kEraInfo[era].month-1; } - if(era < kCurrentEra) { - // if we're not in the current era, - // fail_here; - } - return month; } -int32_t JapaneseCalendar::getDefaultDayInMonth(int32_t month) const +int32_t JapaneseCalendar::getDefaultDayInMonth(int32_t month) { UErrorCode status = U_ZERO_ERROR; int32_t era = internalGetEra(); - int32_t year = getGregorianYear(status); + computeFields(status); // slow + int32_t year = getGregorianYear(); int32_t day = GregorianCalendar::getDefaultDayInMonth(month); if(year == kEraInfo[era].year) { @@ -389,37 +351,31 @@ int32_t JapaneseCalendar::getDefaultDayInMonth(int32_t month) const int32_t JapaneseCalendar::internalGetEra() const { - return isSet(UCAL_ERA) ? internalGet(UCAL_ERA) : kCurrentEra; + return internalGet(UCAL_ERA, kCurrentEra); } -int32_t -JapaneseCalendar::getGregorianYear(UErrorCode &status) const +int32_t JapaneseCalendar::handleGetExtendedYear() { - int32_t year = (fStamp[UCAL_YEAR] != kUnset) ? internalGet(UCAL_YEAR) : 1; // default year = 1 - int32_t era = kCurrentEra; - if (fStamp[UCAL_ERA] != kUnset) { - era = internalGet(UCAL_ERA); + int32_t year; + + if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR && + newerField(UCAL_EXTENDED_YEAR, UCAL_ERA) == UCAL_EXTENDED_YEAR) { + year = internalGet(UCAL_EXTENDED_YEAR, 1); + } else { + // Subtract one because year starts at 1 + year = internalGet(UCAL_YEAR) + kEraInfo[internalGet(UCAL_ERA)].year - 1; } + return year; - if ((era<0)||(era>kCurrentEra)) { - status = U_ILLEGAL_ARGUMENT_ERROR; - return 0 ; - } - return year + kEraInfo[era].year - 1; } -void JapaneseCalendar::timeToFields(UDate theTime, UBool quick, UErrorCode& status) + +void JapaneseCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status) { - GregorianCalendar::timeToFields(theTime, quick, status); - - // these are the gregorian era and year - int32_t era = internalGet(UCAL_ERA); - int32_t year = internalGet(UCAL_YEAR); - if(era == GregorianCalendar::BC) { - year = 1 - year; - } + //Calendar::timeToFields(theTime, quick, status); + GregorianCalendar::handleComputeFields(julianDay, status); + int32_t year = internalGet(UCAL_EXTENDED_YEAR); // Gregorian year - // grego [e+y] -> e+y int32_t low = 0; // Short circuit for recent years. Most modern computations will @@ -512,6 +468,71 @@ int32_t JapaneseCalendar::defaultCenturyStartYear() const return 0; } +static int32_t gJapanCalendarLimits[2][4] = { + // Minimum Greatest min Least max Greatest max + { 0, 0, JapaneseCalendar::kCurrentEra, JapaneseCalendar::kCurrentEra }, // ERA + { 1, 1, 0, 0 }, // YEAR least-max/greatest-max computed at runtime +}; + +static UBool gJapanYearLimitsKnown = FALSE; + +int32_t JapaneseCalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) const +{ + switch(field) { + case UCAL_YEAR: + { + UBool needCalc = FALSE; + { + Mutex m; + needCalc = (gJapanYearLimitsKnown == FALSE); + } + if(needCalc) { + int32_t min = kEraInfo[1].year - kEraInfo[0].year; + int32_t max = min; + for (uint32_t i=2; i= 0); + if (d < min) { + min = d; + } + if (d > max) { + max = d; + } + } + U_ASSERT(min >= 0 && max > min); + { + Mutex m; + if(gJapanYearLimitsKnown==FALSE) { + gJapanCalendarLimits[field][UCAL_LIMIT_LEAST_MAXIMUM] = ++min; // 1-based + gJapanCalendarLimits[field][UCAL_LIMIT_MAXIMUM] = ++max; // 1-based + gJapanYearLimitsKnown = TRUE; + } + } + } + return gJapanCalendarLimits[field][limitType]; + } + + case UCAL_ERA: + return gJapanCalendarLimits[field][limitType]; + + case UCAL_EXTENDED_YEAR: // extended year limits + switch(limitType) { + case UCAL_LIMIT_GREATEST_MINIMUM: + case UCAL_LIMIT_MINIMUM: + return kEraInfo[0].year; /* minimum is 1st era year */ + + case UCAL_LIMIT_LEAST_MAXIMUM: + case UCAL_LIMIT_MAXIMUM: + /* use Gregorian calendar max */ + default: + return GregorianCalendar::handleGetLimit(field,limitType); + } + break; + + default: + return GregorianCalendar::handleGetLimit(field,limitType); + } +} U_NAMESPACE_END diff --git a/icuSources/i18n/japancal.h b/icuSources/i18n/japancal.h index 44587839..7ae515e9 100644 --- a/icuSources/i18n/japancal.h +++ b/icuSources/i18n/japancal.h @@ -1,15 +1,16 @@ /* -* Copyright (C) 2003, International Business Machines Corporation and others. All Rights Reserved. -******************************************************************************** -* -* File JAPANCAL.H -* -* Modification History: -* -* Date Name Description -* 05/13/2003 srl copied from gregocal.h -******************************************************************************** -*/ + * Copyright (C) 2003-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ******************************************************************************** + * + * File JAPANCAL.H + * + * Modification History: + * + * Date Name Description + * 05/13/2003 srl copied from gregocal.h + ******************************************************************************** + */ #ifndef JAPANCAL_H #define JAPANCAL_H @@ -99,10 +100,14 @@ public: */ virtual Calendar* clone(void) const; - + /** + * Return the extended year defined by the current fields. In the + * Japanese calendar case, this is equal to the equivalent extended Gregorian year. + * @internal + */ + virtual int32_t handleGetExtendedYear(); public: - /** * Override Calendar Returns a unique class ID POLYMORPHICALLY. Pure virtual * override. This method is to implement a simple version of RTTI, since not all C++ @@ -126,7 +131,7 @@ public: * @return The class ID for all objects of this class. * @internal */ - static inline UClassID getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(void); /** * return the calendar type, "japanese". @@ -137,74 +142,65 @@ public: virtual const char * getType() const; /** + * @return FALSE - no default century in Japanese * @internal - * @return TRUE if this calendar has the notion of a default century */ virtual UBool haveDefaultCentury() const; - virtual UDate defaultCenturyStart() const; - virtual int32_t defaultCenturyStartYear() const; - /** + /** + * Not used - no default century. + * @internal + */ + virtual UDate defaultCenturyStart() const; + /** + * Not used - no default century. * @internal - * API overrides */ - int32_t getMaximum(UCalendarDateFields field) const; - int32_t getLeastMaximum(UCalendarDateFields field) const; - inline virtual int32_t getMaximum(EDateFields field) const { return getMaximum((UCalendarDateFields)field); } - inline virtual int32_t getLeastMaximum(EDateFields field) const { return getLeastMaximum((UCalendarDateFields)field); } + virtual int32_t defaultCenturyStartYear() const; private: JapaneseCalendar(); // default constructor not implemented - static const char fgClassID; - protected: - virtual int32_t monthLength(int32_t month) const; - virtual int32_t monthLength(int32_t month, int32_t year) const; - int32_t getGregorianYear(UErrorCode& status) const; + /** + * Calculate the era for internal computation + * @internal + */ virtual int32_t internalGetEra() const; - virtual void timeToFields(UDate theTime, UBool quick, UErrorCode& status); /** - * (Overrides Calendar) Converts Calendar's time field values to GMT as - * milliseconds. In this case, we have to be concerned with filling in inconsistent - * information. For example, if the year and era only are set, need to make sure - * month & date are set correctly. Ex, 'Heisei 1' starts Jan 8th, not Jan 1st. - * Default month and date values will end up giving the wrong Era. - * - * @param status Output param set to success/failure code on exit. If any value - * previously set in the time field is invalid, this will be set to - * an error status. - * @stable ICU 2.0 + * Compute fields from the JD + * @internal */ + virtual void handleComputeFields(int32_t julianDay, UErrorCode& status); + + /** + * Calculate the limit for a specified type of limit and field + * @internal + */ + virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const; /*** * Called by computeJulianDay. Returns the default month (0-based) for the year, - * taking year and era into account. Defaults to 0 for Gregorian, which doesn't care. + * taking year and era into account. Will return the first month of the given era, if + * the current year is an ascension year. + * @internal */ - virtual int32_t getDefaultMonthInYear() const; - + virtual int32_t getDefaultMonthInYear(); /*** * Called by computeJulianDay. Returns the default day (1-based) for the month, - * taking currently-set year and era into account. Defaults to 1 for Gregorian, which doesn't care. + * taking currently-set year and era into account. Will return the first day of the given + * era, if the current month is an ascension year and month. + * @internal */ - virtual int32_t getDefaultDayInMonth(int32_t month) const; + virtual int32_t getDefaultDayInMonth(int32_t month); }; -inline UClassID -JapaneseCalendar::getStaticClassID(void) -{ return (UClassID)&fgClassID; } - -inline UClassID -JapaneseCalendar::getDynamicClassID(void) const -{ return JapaneseCalendar::getStaticClassID(); } - - U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ -#endif // _GREGOCAL +#endif //eof diff --git a/icuSources/i18n/measfmt.cpp b/icuSources/i18n/measfmt.cpp new file mode 100644 index 00000000..eaa37a24 --- /dev/null +++ b/icuSources/i18n/measfmt.cpp @@ -0,0 +1,44 @@ +/* +********************************************************************** +* Copyright (c) 2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Author: Alan Liu +* Created: April 20, 2004 +* Since: ICU 3.0 +********************************************************************** +*/ +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/measfmt.h" +#include "currfmt.h" + +U_NAMESPACE_BEGIN + +MeasureFormat::MeasureFormat() {} + +MeasureFormat* U_EXPORT2 MeasureFormat::createCurrencyFormat(const Locale& locale, + UErrorCode& ec) { + CurrencyFormat* fmt = NULL; + if (U_SUCCESS(ec)) { + fmt = new CurrencyFormat(locale, ec); + if (U_FAILURE(ec)) { + delete fmt; + fmt = NULL; + } + } + return fmt; +} + +MeasureFormat* U_EXPORT2 MeasureFormat::createCurrencyFormat(UErrorCode& ec) { + if (U_FAILURE(ec)) { + return NULL; + } + return MeasureFormat::createCurrencyFormat(Locale::getDefault(), ec); +} + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/i18n/measure.cpp b/icuSources/i18n/measure.cpp new file mode 100644 index 00000000..03e6a7cb --- /dev/null +++ b/icuSources/i18n/measure.cpp @@ -0,0 +1,65 @@ +/* +********************************************************************** +* Copyright (c) 2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Author: Alan Liu +* Created: April 26, 2004 +* Since: ICU 3.0 +********************************************************************** +*/ +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/measure.h" +#include "unicode/measunit.h" + +U_NAMESPACE_BEGIN + +Measure::Measure() {} + +Measure::Measure(const Formattable& _number, MeasureUnit* adoptedUnit, + UErrorCode& ec) : + number(_number), unit(adoptedUnit) { + if (U_SUCCESS(ec) && + (!number.isNumeric() || adoptedUnit == 0)) { + ec = U_ILLEGAL_ARGUMENT_ERROR; + } +} + +Measure::Measure(const Measure& other) : + UObject(other), unit(0) { + *this = other; +} + +Measure& Measure::operator=(const Measure& other) { + if (this != &other) { + delete unit; + number = other.number; + unit = (MeasureUnit*) other.unit->clone(); + } + return *this; +} + +Measure::~Measure() { + delete unit; +} + +UBool Measure::operator==(const UObject& other) const { + const Measure* m = (const Measure*) &other; + return getDynamicClassID() == other.getDynamicClassID() && + number == m->getNumber() && + *unit == m->getUnit(); +} + +//---------------------------------------------------------------------- +// MeasureUnit implementation + +MeasureUnit:: MeasureUnit() {} + +MeasureUnit::~MeasureUnit() {} + +U_NAMESPACE_END + +#endif // !UCONFIG_NO_FORMATTING diff --git a/icuSources/i18n/msgfmt.cpp b/icuSources/i18n/msgfmt.cpp index 477a72de..5e639b28 100644 --- a/icuSources/i18n/msgfmt.cpp +++ b/icuSources/i18n/msgfmt.cpp @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 1997-2003, International Business Machines Corporation and * +* Copyright (C) 1997-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* * @@ -31,9 +31,10 @@ #include "unicode/ustring.h" #include "unicode/ucnv_err.h" #include "unicode/uchar.h" +#include "unicode/rbnf.h" #include "ustrfmt.h" #include "cmemory.h" -#include "uprops.h" +#include "util.h" #include "uassert.h" // ***************************************************************************** @@ -48,6 +49,10 @@ //--------------------------------------- // static data +static const UChar ID_EMPTY[] = { + 0 /* empty string, used for default so that null can mark end of list */ +}; + static const UChar ID_NUMBER[] = { 0x6E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0 /* "number" */ }; @@ -60,14 +65,27 @@ static const UChar ID_TIME[] = { static const UChar ID_CHOICE[] = { 0x63, 0x68, 0x6F, 0x69, 0x63, 0x65, 0 /* "choice" */ }; +static const UChar ID_SPELLOUT[] = { + 0x73, 0x70, 0x65, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0 /* "spellout" */ +}; +static const UChar ID_ORDINAL[] = { + 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0 /* "ordinal" */ +}; +static const UChar ID_DURATION[] = { + 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0 /* "duration" */ +}; // MessageFormat Type List Number, Date, Time or Choice static const UChar * const TYPE_IDS[] = { - NULL, + ID_EMPTY, ID_NUMBER, ID_DATE, ID_TIME, - ID_CHOICE + ID_CHOICE, + ID_SPELLOUT, + ID_ORDINAL, + ID_DURATION, + NULL, }; static const UChar ID_CURRENCY[] = { @@ -82,13 +100,13 @@ static const UChar ID_INTEGER[] = { // NumberFormat modifier list, default, currency, percent or integer static const UChar * const NUMBER_STYLE_IDS[] = { - NULL, + ID_EMPTY, ID_CURRENCY, ID_PERCENT, ID_INTEGER, NULL, }; - + static const UChar ID_SHORT[] = { 0x73, 0x68, 0x6F, 0x72, 0x74, 0 /* "short" */ }; @@ -104,11 +122,12 @@ static const UChar ID_FULL[] = { // DateFormat modifier list, default, short, medium, long or full static const UChar * const DATE_STYLE_IDS[] = { - NULL, + ID_EMPTY, ID_SHORT, ID_MEDIUM, ID_LONG, - ID_FULL + ID_FULL, + NULL, }; static const DateFormat::EStyle DATE_STYLES[] = { @@ -119,14 +138,12 @@ static const DateFormat::EStyle DATE_STYLES[] = { DateFormat::kFull, }; -static const int32_t ID_LIST_LENGTH = 5; - static const int32_t DEFAULT_INITIAL_CAPACITY = 10; U_NAMESPACE_BEGIN // ------------------------------------- -const char MessageFormat::fgClassID = 0; // Value is irrelevant +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(MessageFormat) //-------------------------------------------------------------------- @@ -187,6 +204,7 @@ MessageFormat::MessageFormat(const UnicodeString& pattern, return; } applyPattern(pattern, success); + setLocaleIDs(fLocale.getName(), fLocale.getName()); } MessageFormat::MessageFormat(const UnicodeString& pattern, @@ -210,6 +228,7 @@ MessageFormat::MessageFormat(const UnicodeString& pattern, return; } applyPattern(pattern, success); + setLocaleIDs(fLocale.getName(), fLocale.getName()); } MessageFormat::MessageFormat(const UnicodeString& pattern, @@ -234,6 +253,7 @@ MessageFormat::MessageFormat(const UnicodeString& pattern, return; } applyPattern(pattern, parseError, success); + setLocaleIDs(fLocale.getName(), fLocale.getName()); } MessageFormat::MessageFormat(const MessageFormat& that) @@ -389,7 +409,6 @@ MessageFormat::operator==(const Format& rhs) const // Check class ID before checking MessageFormat members if (!Format::operator==(rhs) || - getDynamicClassID() != that.getDynamicClassID() || fPattern != that.fPattern || fLocale != that.fLocale) { return FALSE; @@ -427,6 +446,7 @@ MessageFormat::setLocale(const Locale& theLocale) defaultDateFormat = NULL; } fLocale = theLocale; + setLocaleIDs(fLocale.getName(), fLocale.getName()); } // ------------------------------------- @@ -975,15 +995,20 @@ MessageFormat::format(const Formattable* arguments, } } // If the obj data type is a number, use a NumberFormat instance. - else if ((type == Formattable::kDouble) || (type == Formattable::kLong)) { + else if ((type == Formattable::kDouble) || + (type == Formattable::kLong) || + (type == Formattable::kInt64)) { + const NumberFormat* nf = getDefaultNumberFormat(success); if (nf == NULL) { return appendTo; } if (type == Formattable::kDouble) { nf->format(obj->getDouble(), appendTo); - } else { + } else if (type == Formattable::kLong) { nf->format(obj->getLong(), appendTo); + } else { + nf->format(obj->getInt64(), appendTo); } } // If the obj data type is a Date instance, use a DateFormat instance. @@ -1145,6 +1170,17 @@ MessageFormat::parseObject( const UnicodeString& source, } // ------------------------------------- + +static Format* makeRBNF(URBNFRuleSetTag tag, const Locale& locale, const UnicodeString& defaultRuleSet, UErrorCode& ec) { + RuleBasedNumberFormat* fmt = new RuleBasedNumberFormat(tag, locale, ec); + if (U_SUCCESS(ec) && defaultRuleSet.length() > 0) { + fmt->setDefaultRuleSet(defaultRuleSet, ec); + if (U_FAILURE(ec)) { // ignore unrecognized default rule set + ec = U_ZERO_ERROR; + } + } + return fmt; +} /** * Reads the segments[] array (see applyPattern()) and parses the @@ -1238,6 +1274,18 @@ MessageFormat::makeFormat(int32_t formatNumber, fmt = new ChoiceFormat(segments[3], parseError, ec); break; + case 5: // spellout + argType = Formattable::kDouble; + fmt = makeRBNF(URBNF_SPELLOUT, fLocale, segments[3], ec); + break; + case 6: // ordinal + argType = Formattable::kDouble; + fmt = makeRBNF(URBNF_ORDINAL, fLocale, segments[3], ec); + break; + case 7: // duration + argType = Formattable::kDouble; + fmt = makeRBNF(URBNF_DURATION, fLocale, segments[3], ec); + break; default: argType = Formattable::kString; ec = U_ILLEGAL_ARGUMENT_ERROR; @@ -1278,15 +1326,16 @@ int32_t MessageFormat::findKeyword(const UnicodeString& s, const UChar * const *list) { if (s.length() == 0) - return 0; + return 0; // default UnicodeString buffer = s; // Trims the space characters and turns all characters // in s to lower case. buffer.trim().toLower(); - for (int32_t i = 0; i < ID_LIST_LENGTH; ++i) { - if (list[i] && !buffer.compare(list[i], u_strlen(list[i]))) + for (int32_t i = 0; list[i]; ++i) { + if (!buffer.compare(list[i], u_strlen(list[i]))) { return i; + } } return -1; } diff --git a/icuSources/i18n/name2uni.cpp b/icuSources/i18n/name2uni.cpp index 8a6f2d9c..255a4bc6 100644 --- a/icuSources/i18n/name2uni.cpp +++ b/icuSources/i18n/name2uni.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2001, International Business Machines +* Copyright (C) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -22,21 +22,49 @@ U_NAMESPACE_BEGIN -const char NameUnicodeTransliterator::fgClassID=0; - -const char NameUnicodeTransliterator::_ID[] = "Name-Any"; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(NameUnicodeTransliterator) static const UChar OPEN[] = {92,78,126,123,126,0}; // "\N~{~" static const UChar OPEN_DELIM = 92; // '\\' first char of OPEN static const UChar CLOSE_DELIM = 125; // '}' static const UChar SPACE = 32; // ' ' +U_CDECL_BEGIN + +// USetAdder implementation +// Does not use uset.h to reduce code dependencies +static void U_CALLCONV +_set_add(USet *set, UChar32 c) { + ((UnicodeSet *)set)->add(c); +} + +static void U_CALLCONV +_set_addRange(USet *set, UChar32 start, UChar32 end) { + ((UnicodeSet *)set)->add(start, end); +} + +static void U_CALLCONV +_set_addString(USet *set, const UChar *str, int32_t length) { + ((UnicodeSet *)set)->add(UnicodeString((UBool)(length<0), str, length)); +} + +U_CDECL_END + /** * Constructs a transliterator with the default delimiters '{' and * '}'. */ NameUnicodeTransliterator::NameUnicodeTransliterator(UnicodeFilter* adoptedFilter) : - Transliterator(_ID, adoptedFilter) { + Transliterator(UNICODE_STRING("Name-Any", 8), adoptedFilter) { + + // Get the legal character set + USetAdder sa = { + (USet *)&legal, // USet* == UnicodeSet* + _set_add, + _set_addRange, + _set_addString + }; + uprv_getCharNameCharacters(&sa); } /** @@ -48,7 +76,7 @@ NameUnicodeTransliterator::~NameUnicodeTransliterator() {} * Copy constructor. */ NameUnicodeTransliterator::NameUnicodeTransliterator(const NameUnicodeTransliterator& o) : - Transliterator(o) {} + Transliterator(o), legal(o.legal) {} /** * Assignment operator. @@ -56,6 +84,7 @@ NameUnicodeTransliterator::NameUnicodeTransliterator(const NameUnicodeTransliter NameUnicodeTransliterator& NameUnicodeTransliterator::operator=( const NameUnicodeTransliterator& o) { Transliterator::operator=(o); + // not necessary: the legal sets should all be the same -- legal=o.legal; return *this; } @@ -92,10 +121,6 @@ void NameUnicodeTransliterator::handleTransliterate(Replaceable& text, UTransPos UnicodeString openPat(TRUE, OPEN, -1); UnicodeString str, name; - // Get the legal character set - UnicodeSet legal; - uprv_getCharNameCharacters((USet*) &legal); // USet* == UnicodeSet* - int32_t cursor = offsets.start; int32_t limit = offsets.limit; diff --git a/icuSources/i18n/name2uni.h b/icuSources/i18n/name2uni.h index cae74336..96f337bf 100644 --- a/icuSources/i18n/name2uni.h +++ b/icuSources/i18n/name2uni.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2001, International Business Machines +* Copyright (C) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -15,6 +15,7 @@ #if !UCONFIG_NO_TRANSLITERATION #include "unicode/translit.h" +#include "unicode/uniset.h" U_NAMESPACE_BEGIN @@ -24,14 +25,7 @@ U_NAMESPACE_BEGIN * @author Alan Liu */ class U_I18N_API NameUnicodeTransliterator : public Transliterator { - - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; - - public: +public: /** * Constructs a transliterator. @@ -58,21 +52,21 @@ class U_I18N_API NameUnicodeTransliterator : public Transliterator { * Transliterator API. * @return A copy of the object. */ - Transliterator* clone(void) const; + virtual Transliterator* clone(void) const; /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * * @draft ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * * @draft ICU 2.2 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } + static UClassID U_EXPORT2 getStaticClassID(); protected: @@ -88,9 +82,10 @@ class U_I18N_API NameUnicodeTransliterator : public Transliterator { virtual void handleTransliterate(Replaceable& text, UTransPosition& offset, UBool isIncremental) const; - private: - - static const char _ID[]; + /** + * Set of characters which occur in Unicode character names. + */ + UnicodeSet legal; }; U_NAMESPACE_END diff --git a/icuSources/i18n/nfrs.cpp b/icuSources/i18n/nfrs.cpp index 814a03aa..a066614f 100644 --- a/icuSources/i18n/nfrs.cpp +++ b/icuSources/i18n/nfrs.cpp @@ -1,6 +1,6 @@ /* ****************************************************************************** -* Copyright (C) 1997-2001, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. ****************************************************************************** * file name: nfrs.cpp @@ -25,7 +25,7 @@ #include "cmemory.h" #endif -#include "uprops.h" +#include "util.h" U_NAMESPACE_BEGIN @@ -120,6 +120,7 @@ NFRuleSet::NFRuleSet(UnicodeString* descriptions, int32_t index, UErrorCode& sta , negativeNumberRule(NULL) , fIsFractionRuleSet(FALSE) , fIsPublic(FALSE) + , fRecursionCount(0) { for (int i = 0; i < 3; ++i) { fractionRules[i] = NULL; @@ -131,6 +132,12 @@ NFRuleSet::NFRuleSet(UnicodeString* descriptions, int32_t index, UErrorCode& sta UnicodeString& description = descriptions[index]; // !!! make sure index is valid + if (description.length() == 0) { + // throw new IllegalArgumentException("Empty rule set description"); + status = U_PARSE_ERROR; + return; + } + // if the description begins with a rule set name (the rule set // name can be omitted in formatter descriptions that consist // of only one rule set), copy it out into our "name" member @@ -147,7 +154,7 @@ NFRuleSet::NFRuleSet(UnicodeString* descriptions, int32_t index, UErrorCode& sta description.remove(0, pos); } } else { - name.setTo("%default"); + name.setTo(UNICODE_STRING_SIMPLE("%default")); } if (description.length() == 0) { @@ -208,7 +215,7 @@ NFRuleSet::parseRules(UnicodeString& description, const RuleBasedNumberFormat* o // same as the preceding rule's base value in fraction // rule sets) case NFRule::kNoBase: - rule->setBaseValue(defaultBaseValue); + rule->setBaseValue(defaultBaseValue, status); if (!isFractionRuleSet()) { ++defaultBaseValue; } @@ -266,7 +273,7 @@ NFRuleSet::~NFRuleSet() delete fractionRules[2]; } -UBool +static UBool util_equalRules(const NFRule* rule1, const NFRule* rule2) { if (rule1) { @@ -300,18 +307,38 @@ NFRuleSet::operator==(const NFRuleSet& rhs) const return FALSE; } +#define RECURSION_LIMIT 50 + void NFRuleSet::format(int64_t number, UnicodeString& toAppendTo, int32_t pos) const { NFRule *rule = findNormalRule(number); - rule->doFormat(number, toAppendTo, pos); + if (rule) { // else error, but can't report it + NFRuleSet* ncThis = (NFRuleSet*)this; + if (ncThis->fRecursionCount++ >= RECURSION_LIMIT) { + // stop recursion + ncThis->fRecursionCount = 0; + } else { + rule->doFormat(number, toAppendTo, pos); + ncThis->fRecursionCount--; + } + } } void NFRuleSet::format(double number, UnicodeString& toAppendTo, int32_t pos) const { NFRule *rule = findDoubleRule(number); - rule->doFormat(number, toAppendTo, pos); + if (rule) { // else error, but can't report it + NFRuleSet* ncThis = (NFRuleSet*)this; + if (ncThis->fRecursionCount++ >= RECURSION_LIMIT) { + // stop recursion + ncThis->fRecursionCount = 0; + } else { + rule->doFormat(number, toAppendTo, pos); + ncThis->fRecursionCount--; + } + } } NFRule* @@ -408,6 +435,10 @@ NFRuleSet::findNormalRule(int64_t number) const lo = mid + 1; } } + if (hi == 0) { // bad rule set, minimum base > 0 + return NULL; // want to throw exception here + } + NFRule *result = rules[hi - 1]; // use shouldRollBack() to see whether we need to invoke the @@ -416,6 +447,9 @@ NFRuleSet::findNormalRule(int64_t number) const // one rule and return that one instead of the one we'd normally // return if (result->shouldRollBack((double)number)) { + if (hi == 1) { // bad rule set, no prior rule to rollback to from this base + return NULL; + } result = rules[hi - 2]; } return result; diff --git a/icuSources/i18n/nfrs.h b/icuSources/i18n/nfrs.h index 512734bd..d28fde1d 100644 --- a/icuSources/i18n/nfrs.h +++ b/icuSources/i18n/nfrs.h @@ -1,6 +1,6 @@ /* ****************************************************************************** -* Copyright (C) 1997-2001, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. ****************************************************************************** * file name: nfrs.h @@ -64,6 +64,7 @@ class NFRuleSet : public UMemory { NFRule *fractionRules[3]; UBool fIsFractionRuleSet; UBool fIsPublic; + int32_t fRecursionCount; NFRuleSet(const NFRuleSet &other); // forbid copying of this class NFRuleSet &operator=(const NFRuleSet &other); // forbid copying of this class diff --git a/icuSources/i18n/nfrule.cpp b/icuSources/i18n/nfrule.cpp index 438dfcac..e5c863de 100644 --- a/icuSources/i18n/nfrule.cpp +++ b/icuSources/i18n/nfrule.cpp @@ -1,6 +1,6 @@ /* ****************************************************************************** -* Copyright (C) 1997-2001, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. ****************************************************************************** * file name: nfrule.cpp @@ -25,7 +25,7 @@ #include "nfrlist.h" #include "nfsubs.h" -#include "uprops.h" +#include "util.h" U_NAMESPACE_BEGIN @@ -228,7 +228,7 @@ NFRule::parseRuleDescriptor(UnicodeString& description, UErrorCode& status) // it's omitted, just set the base value to 0. int32_t p = description.indexOf(gColon); if (p == -1) { - setBaseValue((int32_t)0); + setBaseValue((int32_t)0, status); } else { // copy the descriptor out into its own string and strip it, // along with any trailing whitespace, out of the original @@ -291,7 +291,7 @@ NFRule::parseRuleDescriptor(UnicodeString& description, UErrorCode& status) } // we have the base value, so set it - setBaseValue(val); + setBaseValue(val, status); // if we stopped the previous loop on a slash, we're // now parsing the rule's radix. Again, accumulate digits @@ -321,7 +321,7 @@ NFRule::parseRuleDescriptor(UnicodeString& description, UErrorCode& status) // tempValue now contain's the rule's radix. Set it // accordingly, and recalculate the rule's exponent - radix = (int16_t)val; + radix = (int32_t)val; if (radix == 0) { // throw new IllegalArgumentException("Rule can't have radix of 0"); status = U_PARSE_ERROR; @@ -456,7 +456,7 @@ NFRule::extractSubstitution(const NFRuleSet* ruleSet, * @param The new base value for the rule. */ void -NFRule::setBaseValue(int64_t newBaseValue) +NFRule::setBaseValue(int64_t newBaseValue, UErrorCode& status) { // set the base value baseValue = newBaseValue; @@ -475,10 +475,10 @@ NFRule::setBaseValue(int64_t newBaseValue) // has substitutions, and some substitutions hold on to copies // of the rule's divisor. Fix their copies of the divisor. if (sub1 != NULL) { - sub1->setDivisor(radix, exponent); + sub1->setDivisor(radix, exponent, status); } if (sub2 != NULL) { - sub2->setDivisor(radix, exponent); + sub2->setDivisor(radix, exponent, status); } // if this is a special rule, its radix and exponent are basically diff --git a/icuSources/i18n/nfrule.h b/icuSources/i18n/nfrule.h index 9599782c..757a524a 100644 --- a/icuSources/i18n/nfrule.h +++ b/icuSources/i18n/nfrule.h @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 1997-2001, International Business Machines Corporation and others. All Rights Reserved. +* Copyright (C) 1997-2004, International Business Machines Corporation and others. All Rights Reserved. ******************************************************************************* */ @@ -14,6 +14,7 @@ #include "unicode/utypes.h" #include "unicode/uobject.h" #include "unicode/unistr.h" +#include "putilimp.h" U_NAMESPACE_BEGIN @@ -55,7 +56,7 @@ public: void setType(ERuleType ruleType) { baseValue = (int32_t)ruleType; } int64_t getBaseValue() const { return baseValue; } - void setBaseValue(int64_t value); + void setBaseValue(int64_t value, UErrorCode& status); double getDivisor() const { return uprv_pow(radix, exponent); } @@ -91,7 +92,7 @@ private: private: int64_t baseValue; - int16_t radix; + int32_t radix; int16_t exponent; UnicodeString ruleText; NFSubstitution* sub1; diff --git a/icuSources/i18n/nfsubs.cpp b/icuSources/i18n/nfsubs.cpp index b75c1fb9..25461981 100644 --- a/icuSources/i18n/nfsubs.cpp +++ b/icuSources/i18n/nfsubs.cpp @@ -1,6 +1,6 @@ /* ****************************************************************************** -* Copyright (C) 1997-2003, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. ****************************************************************************** * file name: nfsubs.cpp @@ -14,6 +14,9 @@ */ #include "nfsubs.h" +#include "digitlst.h" + +#include #if U_HAVE_RBNF @@ -168,22 +171,22 @@ NFSubstitution::NFSubstitution(int32_t _pos, // that pattern (then set it to use the DecimalFormatSymbols // belonging to our formatter) else if (workingDescription.charAt(0) == gPound || workingDescription.charAt(0) ==gZero) { - DecimalFormatSymbols* sym = formatter->getDecimalFormatSymbols(); - if (!sym) { - status = U_MISSING_RESOURCE_ERROR; - return; - } + DecimalFormatSymbols* sym = formatter->getDecimalFormatSymbols(); + if (!sym) { + status = U_MISSING_RESOURCE_ERROR; + return; + } this->numberFormat = new DecimalFormat(workingDescription, *sym, status); /* test for NULL */ if (this->numberFormat == 0) { status = U_MEMORY_ALLOCATION_ERROR; return; } - if (U_FAILURE(status)) { - delete (DecimalFormat*)this->numberFormat; - this->numberFormat = NULL; - return; - } + if (U_FAILURE(status)) { + delete (DecimalFormat*)this->numberFormat; + this->numberFormat = NULL; + return; + } // this->numberFormat->setDecimalFormatSymbols(formatter->getDecimalFormatSymbols()); } // if the description is ">>>", this substitution bypasses the @@ -218,7 +221,7 @@ NFSubstitution::~NFSubstitution() * @param exponent The exponent of the divisor */ void -NFSubstitution::setDivisor(int32_t /*radix*/, int32_t /*exponent*/) { +NFSubstitution::setDivisor(int32_t /*radix*/, int32_t /*exponent*/, UErrorCode& /*status*/) { // a no-op for all substitutions except multiplier and modulus substitutions } @@ -437,9 +440,8 @@ NFSubstitution::doParse(const UnicodeString& text, // of its own). Derive a parse result and return it as a Long, // if possible, or a Double if (parsePosition.getIndex() != 0) { - double tempResult = (result.getType() == Formattable::kLong) ? - (double)result.getLong() : - result.getDouble(); + UErrorCode status = U_ZERO_ERROR; + double tempResult = result.getDouble(status); // composeRuleValue() produces a full parse result from // the partial parse result passed to this function from @@ -562,6 +564,10 @@ ModulusSubstitution::ModulusSubstitution(int32_t _pos, // substitution: rather than keeping a backpointer to the rule, // we keep a copy of the divisor + if (ldivisor == 0) { + status = U_PARSE_ERROR; + } + if (description == gGreaterGreaterGreaterThan) { // the >>> token doesn't alter how this substituion calculates the // values it uses for formatting and parsing, but it changes @@ -748,35 +754,63 @@ FractionalPartSubstitution::FractionalPartSubstitution(int32_t _pos, void FractionalPartSubstitution::doSubstitution(double number, UnicodeString& toInsertInto, int32_t _pos) const { - // if we're not in "byDigits" mode, just use the inherited - // doSubstitution() routine - if (!byDigits) { - NFSubstitution::doSubstitution(number, toInsertInto, _pos); + // if we're not in "byDigits" mode, just use the inherited + // doSubstitution() routine + if (!byDigits) { + NFSubstitution::doSubstitution(number, toInsertInto, _pos); + + // if we're in "byDigits" mode, transform the value into an integer + // by moving the decimal point eight places to the right and + // pulling digits off the right one at a time, formatting each digit + // as an integer using this substitution's owning rule set + // (this is slower, but more accurate, than doing it from the + // other end) + } else { + // int32_t numberToFormat = (int32_t)uprv_round(transformNumber(number) * uprv_pow(10, kMaxDecimalDigits)); + // // this flag keeps us from formatting trailing zeros. It starts + // // out false because we're pulling from the right, and switches + // // to true the first time we encounter a non-zero digit + // UBool doZeros = FALSE; + // for (int32_t i = 0; i < kMaxDecimalDigits; i++) { + // int64_t digit = numberToFormat % 10; + // if (digit != 0 || doZeros) { + // if (doZeros && useSpaces) { + // toInsertInto.insert(_pos + getPos(), gSpace); + // } + // doZeros = TRUE; + // getRuleSet()->format(digit, toInsertInto, _pos + getPos()); + // } + // numberToFormat /= 10; + // } + + DigitList dl; + dl.set(number, 20, TRUE); + + UBool pad = FALSE; + while (dl.fCount > (dl.fDecimalAt <= 0 ? 0 : dl.fDecimalAt)) { + if (pad && useSpaces) { + toInsertInto.insert(_pos + getPos(), gSpace); + } else { + pad = TRUE; + } + getRuleSet()->format((int64_t)(dl.fDigits[--dl.fCount] - '0'), toInsertInto, _pos + getPos()); + } + while (dl.fDecimalAt < 0) { + if (pad && useSpaces) { + toInsertInto.insert(_pos + getPos(), gSpace); + } else { + pad = TRUE; + } + getRuleSet()->format((int64_t)0, toInsertInto, _pos + getPos()); + ++dl.fDecimalAt; + } - // if we're in "byDigits" mode, transform the value into an integer - // by moving the decimal point eight places to the right and - // pulling digits off the right one at a time, formatting each digit - // as an integer using this substitution's owning rule set - // (this is slower, but more accurate, than doing it from the - // other end) - } else { - int32_t numberToFormat = (int32_t)uprv_round(transformNumber(number) * uprv_pow(10, kMaxDecimalDigits)); - // this flag keeps us from formatting trailing zeros. It starts - // out false because we're pulling from the right, and switches - // to true the first time we encounter a non-zero digit - UBool doZeros = FALSE; - for (int32_t i = 0; i < kMaxDecimalDigits; i++) { - int64_t digit = numberToFormat % 10; - if (digit != 0 || doZeros) { - if (doZeros && useSpaces) { - toInsertInto.insert(_pos + getPos(), gSpace); - } - doZeros = TRUE; - getRuleSet()->format(digit, toInsertInto, _pos + getPos()); - } - numberToFormat /= 10; - } + if (!pad) { + // hack around lack of precision in digitlist. if we would end up with + // "foo point" make sure we add a " zero" to the end. + getRuleSet()->format((int64_t)0, toInsertInto, _pos + getPos()); } + } } //----------------------------------------------------------------------- @@ -822,20 +856,23 @@ FractionalPartSubstitution::doParse(const UnicodeString& text, ParsePosition workPos(1); double result = 0; int32_t digit; - double p10 = 0.1; +// double p10 = 0.1; + DigitList dl; NumberFormat* fmt = NULL; while (workText.length() > 0 && workPos.getIndex() != 0) { workPos.setIndex(0); Formattable temp; getRuleSet()->parse(workText, workPos, 10, temp); - digit = temp.getType() == Formattable::kLong ? - temp.getLong() : - (int32_t)temp.getDouble(); + UErrorCode status = U_ZERO_ERROR; + digit = temp.getLong(status); +// digit = temp.getType() == Formattable::kLong ? +// temp.getLong() : +// (int32_t)temp.getDouble(); if (lenientParse && workPos.getIndex() == 0) { if (!fmt) { - UErrorCode status = U_ZERO_ERROR; + status = U_ZERO_ERROR; fmt = NumberFormat::createInstance(status); if (U_FAILURE(status)) { delete fmt; @@ -849,8 +886,9 @@ FractionalPartSubstitution::doParse(const UnicodeString& text, } if (workPos.getIndex() != 0) { - result += digit * p10; - p10 /= 10; + dl.append((char)('0' + digit)); +// result += digit * p10; +// p10 /= 10; parsePosition.setIndex(parsePosition.getIndex() + workPos.getIndex()); workText.removeBetween(0, workPos.getIndex()); while (workText.length() > 0 && workText.charAt(0) == gSpace) { @@ -860,6 +898,7 @@ FractionalPartSubstitution::doParse(const UnicodeString& text, } } delete fmt; + result = dl.fCount == 0 ? 0 : dl.getDouble(); result = composeRuleValue(result, baseValue); resVal.setDouble(result); diff --git a/icuSources/i18n/nfsubs.h b/icuSources/i18n/nfsubs.h index 6cbf8920..ec03fee9 100644 --- a/icuSources/i18n/nfsubs.h +++ b/icuSources/i18n/nfsubs.h @@ -1,6 +1,6 @@ /* ****************************************************************************** -* Copyright (C) 1997-2001, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. ****************************************************************************** * file name: nfsubs.h @@ -90,7 +90,7 @@ public: * @param radix The radix of the divisor * @param exponent The exponent of the divisor */ - virtual void setDivisor(int32_t radix, int32_t exponent); + virtual void setDivisor(int32_t radix, int32_t exponent, UErrorCode& status); /** * Replaces result with the string describing the substitution. @@ -267,11 +267,11 @@ public: const UnicodeString& description, UErrorCode& status); - int64_t transformNumber(int64_t number) const { return number; } - double transformNumber(double number) const { return number; } - double composeRuleValue(double newRuleValue, double /*oldRuleValue*/) const { return newRuleValue; } - double calcUpperBound(double oldUpperBound) const { return oldUpperBound; } - UChar tokenChar() const { return (UChar)0x003d; } // '=' + virtual int64_t transformNumber(int64_t number) const { return number; } + virtual double transformNumber(double number) const { return number; } + virtual double composeRuleValue(double newRuleValue, double /*oldRuleValue*/) const { return newRuleValue; } + virtual double calcUpperBound(double oldUpperBound) const { return oldUpperBound; } + virtual UChar tokenChar() const { return (UChar)0x003d; } // '=' private: static const char fgClassID; @@ -294,30 +294,37 @@ public: : NFSubstitution(_pos, _ruleSet, formatter, description, status), divisor(_divisor) { ldivisor = util64_fromDouble(divisor); + if (divisor == 0) { + status = U_PARSE_ERROR; + } } - void setDivisor(int32_t radix, int32_t exponent) { + virtual void setDivisor(int32_t radix, int32_t exponent, UErrorCode& status) { divisor = uprv_pow(radix, exponent); ldivisor = util64_fromDouble(divisor); + + if(divisor == 0) { + status = U_PARSE_ERROR; + } } - UBool operator==(const NFSubstitution& rhs) const; + virtual UBool operator==(const NFSubstitution& rhs) const; - int64_t transformNumber(int64_t number) const { + virtual int64_t transformNumber(int64_t number) const { return number / ldivisor; } - double transformNumber(double number) const { + virtual double transformNumber(double number) const { return uprv_floor(number / divisor); } - double composeRuleValue(double newRuleValue, double /*oldRuleValue*/) const { + virtual double composeRuleValue(double newRuleValue, double /*oldRuleValue*/) const { return newRuleValue * divisor; } - double calcUpperBound(double /*oldUpperBound*/) const { return divisor; } + virtual double calcUpperBound(double /*oldUpperBound*/) const { return divisor; } - UChar tokenChar() const { return (UChar)0x003c; } // '<' + virtual UChar tokenChar() const { return (UChar)0x003c; } // '<' private: static const char fgClassID; @@ -339,35 +346,39 @@ public: const UnicodeString& description, UErrorCode& status); - void setDivisor(int32_t radix, int32_t exponent) { + virtual void setDivisor(int32_t radix, int32_t exponent, UErrorCode& status) { divisor = uprv_pow(radix, exponent); ldivisor = util64_fromDouble(divisor); + + if (divisor == 0) { + status = U_PARSE_ERROR; + } } - UBool operator==(const NFSubstitution& rhs) const; + virtual UBool operator==(const NFSubstitution& rhs) const; - void doSubstitution(int64_t number, UnicodeString& toInsertInto, int32_t pos) const; - void doSubstitution(double number, UnicodeString& toInsertInto, int32_t pos) const; + virtual void doSubstitution(int64_t number, UnicodeString& toInsertInto, int32_t pos) const; + virtual void doSubstitution(double number, UnicodeString& toInsertInto, int32_t pos) const; - int64_t transformNumber(int64_t number) const { return number % ldivisor; } - double transformNumber(double number) const { return uprv_fmod(number, divisor); } + virtual int64_t transformNumber(int64_t number) const { return number % ldivisor; } + virtual double transformNumber(double number) const { return uprv_fmod(number, divisor); } - UBool doParse(const UnicodeString& text, + virtual UBool doParse(const UnicodeString& text, ParsePosition& parsePosition, double baseValue, double upperBound, UBool lenientParse, Formattable& result) const; - double composeRuleValue(double newRuleValue, double oldRuleValue) const { + virtual double composeRuleValue(double newRuleValue, double oldRuleValue) const { return oldRuleValue - uprv_fmod(oldRuleValue, divisor) + newRuleValue; } - double calcUpperBound(double /*oldUpperBound*/) const { return divisor; } + virtual double calcUpperBound(double /*oldUpperBound*/) const { return divisor; } - UBool isModulusSubstitution() const { return TRUE; } + virtual UBool isModulusSubstitution() const { return TRUE; } - UChar tokenChar() const { return (UChar)0x003e; } // '>' + virtual UChar tokenChar() const { return (UChar)0x003e; } // '>' private: static const char fgClassID; @@ -385,11 +396,11 @@ public: UErrorCode& status) : NFSubstitution(_pos, _ruleSet, formatter, description, status) {} - int64_t transformNumber(int64_t number) const { return number; } - double transformNumber(double number) const { return uprv_floor(number); } - double composeRuleValue(double newRuleValue, double oldRuleValue) const { return newRuleValue + oldRuleValue; } - double calcUpperBound(double /*oldUpperBound*/) const { return DBL_MAX; } - UChar tokenChar() const { return (UChar)0x003c; } // '<' + virtual int64_t transformNumber(int64_t number) const { return number; } + virtual double transformNumber(double number) const { return uprv_floor(number); } + virtual double composeRuleValue(double newRuleValue, double oldRuleValue) const { return newRuleValue + oldRuleValue; } + virtual double calcUpperBound(double /*oldUpperBound*/) const { return DBL_MAX; } + virtual UChar tokenChar() const { return (UChar)0x003c; } // '<' private: static const char fgClassID; @@ -409,23 +420,23 @@ public: const UnicodeString& description, UErrorCode& status); - UBool operator==(const NFSubstitution& rhs) const; + virtual UBool operator==(const NFSubstitution& rhs) const; - void doSubstitution(double number, UnicodeString& toInsertInto, int32_t pos) const; - void doSubstitution(int64_t /*number*/, UnicodeString& /*toInsertInto*/, int32_t /*_pos*/) const {} - int64_t transformNumber(int64_t /*number*/) const { return 0; } - double transformNumber(double number) const { return number - uprv_floor(number); } + virtual void doSubstitution(double number, UnicodeString& toInsertInto, int32_t pos) const; + virtual void doSubstitution(int64_t /*number*/, UnicodeString& /*toInsertInto*/, int32_t /*_pos*/) const {} + virtual int64_t transformNumber(int64_t /*number*/) const { return 0; } + virtual double transformNumber(double number) const { return number - uprv_floor(number); } - UBool doParse(const UnicodeString& text, + virtual UBool doParse(const UnicodeString& text, ParsePosition& parsePosition, double baseValue, double upperBound, UBool lenientParse, Formattable& result) const; - double composeRuleValue(double newRuleValue, double oldRuleValue) const { return newRuleValue + oldRuleValue; } - double calcUpperBound(double /*oldUpperBound*/) const { return 0.0; } - UChar tokenChar() const { return (UChar)0x003e; } // '>' + virtual double composeRuleValue(double newRuleValue, double oldRuleValue) const { return newRuleValue + oldRuleValue; } + virtual double calcUpperBound(double /*oldUpperBound*/) const { return 0.0; } + virtual UChar tokenChar() const { return (UChar)0x003e; } // '>' private: static const char fgClassID; @@ -443,11 +454,11 @@ public: UErrorCode& status) : NFSubstitution(_pos, _ruleSet, formatter, description, status) {} - int64_t transformNumber(int64_t number) const { return number >= 0 ? number : -number; } - double transformNumber(double number) const { return uprv_fabs(number); } - double composeRuleValue(double newRuleValue, double /*oldRuleValue*/) const { return -newRuleValue; } - double calcUpperBound(double /*oldUpperBound*/) const { return DBL_MAX; } - UChar tokenChar() const { return (UChar)0x003e; } // '>' + virtual int64_t transformNumber(int64_t number) const { return number >= 0 ? number : -number; } + virtual double transformNumber(double number) const { return uprv_fabs(number); } + virtual double composeRuleValue(double newRuleValue, double /*oldRuleValue*/) const { return -newRuleValue; } + virtual double calcUpperBound(double /*oldUpperBound*/) const { return DBL_MAX; } + virtual UChar tokenChar() const { return (UChar)0x003e; } // '>' private: static const char fgClassID; @@ -471,12 +482,12 @@ public: ldenominator = util64_fromDouble(denominator); } - UBool operator==(const NFSubstitution& rhs) const; + virtual UBool operator==(const NFSubstitution& rhs) const; - int64_t transformNumber(int64_t number) const { return number * ldenominator; } - double transformNumber(double number) const { return uprv_round(number * denominator); } + virtual int64_t transformNumber(int64_t number) const { return number * ldenominator; } + virtual double transformNumber(double number) const { return uprv_round(number * denominator); } - UBool doParse(const UnicodeString& text, + virtual UBool doParse(const UnicodeString& text, ParsePosition& parsePosition, double baseValue, double upperBound, @@ -488,9 +499,9 @@ public: // it SERIOUSLY messes up the algorithm return NFSubstitution::doParse(text, parsePosition, baseValue, upperBound, FALSE, result); } - double composeRuleValue(double newRuleValue, double oldRuleValue) const { return newRuleValue / oldRuleValue; } - double calcUpperBound(double /*oldUpperBound*/) const { return denominator; } - UChar tokenChar() const { return (UChar)0x003c; } // '<' + virtual double composeRuleValue(double newRuleValue, double oldRuleValue) const { return newRuleValue / oldRuleValue; } + virtual double calcUpperBound(double /*oldUpperBound*/) const { return denominator; } + virtual UChar tokenChar() const { return (UChar)0x003c; } // '<' private: static const char fgClassID; @@ -508,22 +519,22 @@ public: UErrorCode& status) : NFSubstitution(_pos, _ruleSet, formatter, description, status) {} - void toString(UnicodeString& /*result*/) const {} - void doSubstitution(double /*number*/, UnicodeString& /*toInsertInto*/, int32_t /*_pos*/) const {} - void doSubstitution(int64_t /*number*/, UnicodeString& /*toInsertInto*/, int32_t /*_pos*/) const {} - int64_t transformNumber(int64_t /*number*/) const { return 0; } - double transformNumber(double /*number*/) const { return 0; } - UBool doParse(const UnicodeString& /*text*/, + virtual void toString(UnicodeString& /*result*/) const {} + virtual void doSubstitution(double /*number*/, UnicodeString& /*toInsertInto*/, int32_t /*_pos*/) const {} + virtual void doSubstitution(int64_t /*number*/, UnicodeString& /*toInsertInto*/, int32_t /*_pos*/) const {} + virtual int64_t transformNumber(int64_t /*number*/) const { return 0; } + virtual double transformNumber(double /*number*/) const { return 0; } + virtual UBool doParse(const UnicodeString& /*text*/, ParsePosition& /*parsePosition*/, double baseValue, double /*upperBound*/, UBool /*lenientParse*/, Formattable& result) const { result.setDouble(baseValue); return TRUE; } - double composeRuleValue(double /*newRuleValue*/, double /*oldRuleValue*/) const { return 0.0; } // never called - double calcUpperBound(double /*oldUpperBound*/) const { return 0; } // never called - UBool isNullSubstitution() const { return TRUE; } - UChar tokenChar() const { return (UChar)0x0020; } // ' ' never called + virtual double composeRuleValue(double /*newRuleValue*/, double /*oldRuleValue*/) const { return 0.0; } // never called + virtual double calcUpperBound(double /*oldUpperBound*/) const { return 0; } // never called + virtual UBool isNullSubstitution() const { return TRUE; } + virtual UChar tokenChar() const { return (UChar)0x0020; } // ' ' never called private: static const char fgClassID; diff --git a/icuSources/i18n/nortrans.cpp b/icuSources/i18n/nortrans.cpp index 19189c1e..36c62c8e 100644 --- a/icuSources/i18n/nortrans.cpp +++ b/icuSources/i18n/nortrans.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2001, International Business Machines +* Copyright (C) 2001-2003, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -21,7 +21,7 @@ U_NAMESPACE_BEGIN -const char NormalizationTransliterator::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(NormalizationTransliterator) /** * System registration hook. diff --git a/icuSources/i18n/nortrans.h b/icuSources/i18n/nortrans.h index 1e76deb3..786ffc73 100644 --- a/icuSources/i18n/nortrans.h +++ b/icuSources/i18n/nortrans.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2001-2002, International Business Machines +* Copyright (C) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -35,12 +35,6 @@ class U_I18N_API NormalizationTransliterator : public Transliterator { */ int32_t options; - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; - public: /** @@ -62,21 +56,21 @@ class U_I18N_API NormalizationTransliterator : public Transliterator { * Transliterator API. * @return A copy of the object. */ - Transliterator* clone(void) const; + virtual Transliterator* clone(void) const; /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * * @draft ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * * @draft ICU 2.2 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } + static UClassID U_EXPORT2 getStaticClassID(); protected: diff --git a/icuSources/i18n/nultrans.cpp b/icuSources/i18n/nultrans.cpp index 42af942e..1e1010e6 100644 --- a/icuSources/i18n/nultrans.cpp +++ b/icuSources/i18n/nultrans.cpp @@ -16,7 +16,7 @@ U_NAMESPACE_BEGIN -const char NullTransliterator::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(NullTransliterator) // "Any-Null" const UChar NullTransliterator::ID[] = {65,110,121,45,0x4E, 0x75, 0x6C, 0x6C, 0x00}; @@ -24,6 +24,10 @@ const UChar NullTransliterator::ID[] = {65,110,121,45,0x4E, 0x75, 0x6C, 0x6C, 0x // "Null" const UChar NullTransliterator::SHORT_ID[] = {0x4E, 0x75, 0x6C, 0x6C, 0x00}; +NullTransliterator::NullTransliterator() : Transliterator(ID, 0) {} + +NullTransliterator::~NullTransliterator() {} + Transliterator* NullTransliterator::clone(void) const { return new NullTransliterator(); } diff --git a/icuSources/i18n/nultrans.h b/icuSources/i18n/nultrans.h index cd008631..3af6939d 100644 --- a/icuSources/i18n/nultrans.h +++ b/icuSources/i18n/nultrans.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (c) 2000-2003, International Business Machines +* Copyright (c) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -55,7 +55,7 @@ public: * Transliterator API. * @internal Use transliterator factory methods instead since this class will be removed in that release. */ - Transliterator* clone(void) const; + virtual Transliterator* clone(void) const; /** * Implements {@link Transliterator#handleTransliterate}. @@ -69,36 +69,17 @@ public: * * @draft ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const; + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * * @draft ICU 2.2 */ - static inline UClassID getStaticClassID(); + static UClassID U_EXPORT2 getStaticClassID(); -private: - - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; -inline NullTransliterator::NullTransliterator() : Transliterator(ID, 0) {} - -inline NullTransliterator::~NullTransliterator() {} - -inline UClassID -NullTransliterator::getStaticClassID() -{ return (UClassID)&fgClassID; } - -inline UClassID -NullTransliterator::getDynamicClassID() const -{ return NullTransliterator::getStaticClassID(); } - U_NAMESPACE_END #endif /* #if !UCONFIG_NO_TRANSLITERATION */ diff --git a/icuSources/i18n/numfmt.cpp b/icuSources/i18n/numfmt.cpp index 5987bb48..59a548be 100644 --- a/icuSources/i18n/numfmt.cpp +++ b/icuSources/i18n/numfmt.cpp @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 1997-2003, International Business Machines Corporation and * +* Copyright (C) 1997-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* * @@ -28,15 +28,35 @@ #include "unicode/numfmt.h" #include "unicode/locid.h" -#include "unicode/resbund.h" +#include "unicode/ures.h" #include "unicode/dcfmtsym.h" #include "unicode/decimfmt.h" #include "unicode/ustring.h" +#include "unicode/ucurr.h" +#include "unicode/curramt.h" #include "uhash.h" +#include "cmemory.h" #include "iculserv.h" #include "ucln_in.h" +#include "cstring.h" +#include "putilimp.h" #include +//#define FMT_DEBUG + +#ifdef FMT_DEBUG +#include +static void debugout(UnicodeString s) { + char buf[2000]; + s.extract((int32_t) 0, s.length(), buf); + printf("%s", buf); +} +#define debug(x) printf("%s", x); +#else +#define debugout(x) +#define debug(x) +#endif + // If no number pattern can be located for a locale, this is the last // resort. static const UChar gLastResortDecimalPat[] = { @@ -57,8 +77,7 @@ static const UChar gLastResortScientificPat[] = { U_NAMESPACE_BEGIN -const char NumberFormat::fgClassID = 0; // Value is irrelevant - +UOBJECT_DEFINE_ABSTRACT_RTTI_IMPLEMENTATION(NumberFormat) // If the maximum base 10 exponent were 4, then the largest number would // be 99,999 which has 5 digits. const int32_t NumberFormat::fgMaxIntegerDigits = DBL_MAX_10_EXP + 1; // Should be ~40 ? --srl @@ -74,9 +93,36 @@ const UChar * const NumberFormat::fgLastResortNumberPatterns[] = gLastResortScientificPat }; +#if !UCONFIG_NO_SERVICE // ------------------------------------- -// default constructor +// SimpleNumberFormatFactory implementation +NumberFormatFactory::~NumberFormatFactory() {} +SimpleNumberFormatFactory::SimpleNumberFormatFactory(const Locale& locale, UBool visible) + : _visible(visible) + , _id(locale.getName()) +{ +} + +SimpleNumberFormatFactory::~SimpleNumberFormatFactory() {} + +UBool SimpleNumberFormatFactory::visible(void) const { + return _visible; +} + +const UnicodeString * +SimpleNumberFormatFactory::getSupportedIDs(int32_t &count, UErrorCode& status) const +{ + if (U_SUCCESS(status)) { + count = 1; + return &_id; + } + count = 0; + return NULL; +} +#endif /* #if !UCONFIG_NO_SERVICE */ +// ------------------------------------- +// default constructor NumberFormat::NumberFormat() : fGroupingUsed(TRUE), fMaxIntegerDigits(fgMaxIntegerDigits), @@ -85,6 +131,7 @@ NumberFormat::NumberFormat() fMinFractionDigits(0), fParseIntegerOnly(FALSE) { + fCurrency[0] = 0; } // ------------------------------------- @@ -116,6 +163,7 @@ NumberFormat::operator=(const NumberFormat& rhs) fMaxFractionDigits = rhs.fMaxFractionDigits; fMinFractionDigits = rhs.fMinFractionDigits; fParseIntegerOnly = rhs.fParseIntegerOnly; + u_strncpy(fCurrency, rhs.fCurrency, 4); } return *this; } @@ -125,20 +173,54 @@ NumberFormat::operator=(const NumberFormat& rhs) UBool NumberFormat::operator==(const Format& that) const { + // Format::operator== guarantees this cast is safe NumberFormat* other = (NumberFormat*)&that; +#ifdef FMT_DEBUG + // This code makes it easy to determine why two format objects that should + // be equal aren't. + UBool first = TRUE; + if (!Format::operator==(that)) { + if (first) { printf("[ "); first = FALSE; } else { printf(", "); } + debug("Format::!="); + } + if (!(fMaxIntegerDigits == other->fMaxIntegerDigits && + fMinIntegerDigits == other->fMinIntegerDigits)) { + if (first) { printf("[ "); first = FALSE; } else { printf(", "); } + debug("Integer digits !="); + } + if (!(fMaxFractionDigits == other->fMaxFractionDigits && + fMinFractionDigits == other->fMinFractionDigits)) { + if (first) { printf("[ "); first = FALSE; } else { printf(", "); } + debug("Fraction digits !="); + } + if (!(fGroupingUsed == other->fGroupingUsed)) { + if (first) { printf("[ "); first = FALSE; } else { printf(", "); } + debug("fGroupingUsed != "); + } + if (!(fParseIntegerOnly == other->fParseIntegerOnly)) { + if (first) { printf("[ "); first = FALSE; } else { printf(", "); } + debug("fParseIntegerOnly != "); + } + if (!(u_strcmp(fCurrency, other->fCurrency) == 0)) { + if (first) { printf("[ "); first = FALSE; } else { printf(", "); } + debug("fCurrency !="); + } + if (!first) { printf(" ]"); } +#endif + return ((this == &that) || ((Format::operator==(that) && - getDynamicClassID()== that.getDynamicClassID() && fMaxIntegerDigits == other->fMaxIntegerDigits && fMinIntegerDigits == other->fMinIntegerDigits && fMaxFractionDigits == other->fMaxFractionDigits && fMinFractionDigits == other->fMinFractionDigits && fGroupingUsed == other->fGroupingUsed && - fParseIntegerOnly == other->fParseIntegerOnly))); + fParseIntegerOnly == other->fParseIntegerOnly && + u_strcmp(fCurrency, other->fCurrency) == 0))); } -// ------------------------------------- +// -------------------------------------x // Formats the number object and save the format // result in the toAppendTo string buffer. @@ -150,17 +232,57 @@ NumberFormat::format(const Formattable& obj, { if (U_FAILURE(status)) return appendTo; - if (obj.getType() == Formattable::kDouble) { - return format(obj.getDouble(), appendTo, pos); - } - else if (obj.getType() == Formattable::kLong) { - return format(obj.getLong(), appendTo, pos); + NumberFormat* nonconst = (NumberFormat*) this; + const Formattable* n = &obj; + + UChar save[4]; + UBool setCurr = FALSE; + const UObject* o = obj.getObject(); // most commonly o==NULL + if (o != NULL && + o->getDynamicClassID() == CurrencyAmount::getStaticClassID()) { + // getISOCurrency() returns a pointer to internal storage, so we + // copy it to retain it across the call to setCurrency(). + const CurrencyAmount* amt = (const CurrencyAmount*) o; + const UChar* curr = amt->getISOCurrency(); + u_strcpy(save, getCurrency()); + setCurr = (u_strcmp(curr, save) != 0); + if (setCurr) { + nonconst->setCurrency(curr, status); + } + n = &amt->getNumber(); } - // can't try to format a non-numeric object - else { + + switch (n->getType()) { + case Formattable::kDouble: + format(n->getDouble(), appendTo, pos); + break; + case Formattable::kLong: + format(n->getLong(), appendTo, pos); + break; + case Formattable::kInt64: + format(n->getInt64(), appendTo, pos); + break; + default: status = U_INVALID_FORMAT_ERROR; - return appendTo; + break; } + + if (setCurr) { + UErrorCode ok = U_ZERO_ERROR; + nonconst->setCurrency(save, ok); // always restore currency + } + return appendTo; +} + +// ------------------------------------- + +UnicodeString& +NumberFormat::format(int64_t number, + UnicodeString& appendTo, + FieldPosition& pos) const +{ + // default so we don't introduce a new abstract method + return format((int32_t)number, appendTo, pos); } // ------------------------------------- @@ -195,6 +317,16 @@ NumberFormat::format(int32_t number, UnicodeString& appendTo) const return format(number, appendTo, pos); } +// ------------------------------------- +// Formats a long number and save the result in a string. + +UnicodeString& +NumberFormat::format(int64_t number, UnicodeString& appendTo) const +{ + FieldPosition pos(0); + return format(number, appendTo, pos); +} + // ------------------------------------- // Parses the text and save the result object. If the returned // parse position is 0, that means the parsing failed, the status @@ -215,6 +347,27 @@ NumberFormat::parse(const UnicodeString& text, } } +Formattable& NumberFormat::parseCurrency(const UnicodeString& text, + Formattable& result, + ParsePosition& pos) const { + // Default implementation only -- subclasses should override + int32_t start = pos.getIndex(); + parse(text, result, pos); + if (pos.getIndex() != start) { + UChar curr[4]; + UErrorCode ec = U_ZERO_ERROR; + getEffectiveCurrency(curr, ec); + if (U_SUCCESS(ec)) { + Formattable n(result); + result.adoptObject(new CurrencyAmount(n, curr, ec)); + if (U_FAILURE(ec)) { + pos.setIndex(start); // indicate failure + } + } + } + return result; +} + // ------------------------------------- // Sets to only parse integers. @@ -227,7 +380,7 @@ NumberFormat::setParseIntegerOnly(UBool value) // ------------------------------------- // Create a number style NumberFormat instance with the default locale. -NumberFormat* +NumberFormat* U_EXPORT2 NumberFormat::createInstance(UErrorCode& status) { return createInstance(Locale::getDefault(), kNumberStyle, status); @@ -236,7 +389,7 @@ NumberFormat::createInstance(UErrorCode& status) // ------------------------------------- // Create a number style NumberFormat instance with the inLocale locale. -NumberFormat* +NumberFormat* U_EXPORT2 NumberFormat::createInstance(const Locale& inLocale, UErrorCode& status) { return createInstance(inLocale, kNumberStyle, status); @@ -245,25 +398,25 @@ NumberFormat::createInstance(const Locale& inLocale, UErrorCode& status) // ------------------------------------- // Create a currency style NumberFormat instance with the default locale. -NumberFormat* +NumberFormat* U_EXPORT2 NumberFormat::createCurrencyInstance(UErrorCode& status) { - return createInstance(Locale::getDefault(), kCurrencyStyle, status); + return createCurrencyInstance(Locale::getDefault(), status); } // ------------------------------------- // Create a currency style NumberFormat instance with the inLocale locale. -NumberFormat* +NumberFormat* U_EXPORT2 NumberFormat::createCurrencyInstance(const Locale& inLocale, UErrorCode& status) -{ +{ return createInstance(inLocale, kCurrencyStyle, status); } // ------------------------------------- // Create a percent style NumberFormat instance with the default locale. -NumberFormat* +NumberFormat* U_EXPORT2 NumberFormat::createPercentInstance(UErrorCode& status) { return createInstance(Locale::getDefault(), kPercentStyle, status); @@ -272,7 +425,7 @@ NumberFormat::createPercentInstance(UErrorCode& status) // ------------------------------------- // Create a percent style NumberFormat instance with the inLocale locale. -NumberFormat* +NumberFormat* U_EXPORT2 NumberFormat::createPercentInstance(const Locale& inLocale, UErrorCode& status) { return createInstance(inLocale, kPercentStyle, status); @@ -281,7 +434,7 @@ NumberFormat::createPercentInstance(const Locale& inLocale, UErrorCode& status) // ------------------------------------- // Create a scientific style NumberFormat instance with the default locale. -NumberFormat* +NumberFormat* U_EXPORT2 NumberFormat::createScientificInstance(UErrorCode& status) { return createInstance(Locale::getDefault(), kScientificStyle, status); @@ -290,7 +443,7 @@ NumberFormat::createScientificInstance(UErrorCode& status) // ------------------------------------- // Create a scientific style NumberFormat instance with the inLocale locale. -NumberFormat* +NumberFormat* U_EXPORT2 NumberFormat::createScientificInstance(const Locale& inLocale, UErrorCode& status) { return createInstance(inLocale, kScientificStyle, status); @@ -298,7 +451,7 @@ NumberFormat::createScientificInstance(const Locale& inLocale, UErrorCode& statu // ------------------------------------- -const Locale* +const Locale* U_EXPORT2 NumberFormat::getAvailableLocales(int32_t& count) { return Locale::getAvailableLocales(count); @@ -310,111 +463,125 @@ NumberFormat::getAvailableLocales(int32_t& count) // //------------------------------------------- +#if !UCONFIG_NO_SERVICE static ICULocaleService* gService = NULL; +/** + * Release all static memory held by numberformat. + */ +U_CDECL_BEGIN +static UBool U_CALLCONV numfmt_cleanup(void) { + if (gService) { + delete gService; + gService = NULL; + } + return TRUE; +} +U_CDECL_END + // ------------------------------------- class ICUNumberFormatFactory : public ICUResourceBundleFactory { protected: - virtual UObject* handleCreate(const Locale& loc, int32_t kind, const ICUService* service, UErrorCode& status) const { -// !!! kind is not an EStyles, need to determine how to handle this - return NumberFormat::makeInstance(loc, (NumberFormat::EStyles)kind, status); - } + virtual UObject* handleCreate(const Locale& loc, int32_t kind, const ICUService* /* service */, UErrorCode& status) const { + // !!! kind is not an EStyles, need to determine how to handle this + return NumberFormat::makeInstance(loc, (NumberFormat::EStyles)kind, status); + } }; // ------------------------------------- class NFFactory : public LocaleKeyFactory { private: - NumberFormatFactory* _delegate; - Hashtable* _ids; + NumberFormatFactory* _delegate; + Hashtable* _ids; public: - NFFactory(NumberFormatFactory* delegate) - : LocaleKeyFactory(delegate->visible() ? VISIBLE : INVISIBLE) - , _delegate(delegate) - , _ids(NULL) - { - } - - virtual ~NFFactory() - { - delete _delegate; - delete _ids; - } + NFFactory(NumberFormatFactory* delegate) + : LocaleKeyFactory(delegate->visible() ? VISIBLE : INVISIBLE) + , _delegate(delegate) + , _ids(NULL) + { + } - virtual UObject* create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const - { - if (handlesKey(key, status)) { - const LocaleKey& lkey = (const LocaleKey&)key; - Locale loc; - lkey.canonicalLocale(loc); - int32_t kind = lkey.kind(); + virtual ~NFFactory() + { + delete _delegate; + delete _ids; + } - UObject* result = _delegate->createFormat(loc, (UNumberFormatStyle)(kind+1)); - if (result == NULL) { - result = service->getKey((ICUServiceKey&)key /* cast away const */, NULL, this, status); - } - return result; + virtual UObject* create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const + { + if (handlesKey(key, status)) { + const LocaleKey& lkey = (const LocaleKey&)key; + Locale loc; + lkey.canonicalLocale(loc); + int32_t kind = lkey.kind(); + + UObject* result = _delegate->createFormat(loc, (UNumberFormatStyle)(kind+1)); + if (result == NULL) { + result = service->getKey((ICUServiceKey&)key /* cast away const */, NULL, this, status); + } + return result; + } + return NULL; } - return NULL; - } protected: - /** - * Return the set of ids that this factory supports (visible or - * otherwise). This can be called often and might need to be - * cached if it is expensive to create. - */ - virtual const Hashtable* getSupportedIDs(UErrorCode& status) const - { - if (U_SUCCESS(status)) { - if (!_ids) { - int32_t count = 0; - const UnicodeString * const idlist = _delegate->getSupportedIDs(count, status); - ((NFFactory*)this)->_ids = new Hashtable(status); /* cast away const */ - if (_ids) { - for (int i = 0; i < count; ++i) { - _ids->put(idlist[i], (void*)this, status); - } + /** + * Return the set of ids that this factory supports (visible or + * otherwise). This can be called often and might need to be + * cached if it is expensive to create. + */ + virtual const Hashtable* getSupportedIDs(UErrorCode& status) const + { + if (U_SUCCESS(status)) { + if (!_ids) { + int32_t count = 0; + const UnicodeString * const idlist = _delegate->getSupportedIDs(count, status); + ((NFFactory*)this)->_ids = new Hashtable(status); /* cast away const */ + if (_ids) { + for (int i = 0; i < count; ++i) { + _ids->put(idlist[i], (void*)this, status); + } + } + } + return _ids; } - } - return _ids; + return NULL; } - return NULL; - } }; class ICUNumberFormatService : public ICULocaleService { public: - ICUNumberFormatService() - : ICULocaleService("Number Format") - { - UErrorCode status = U_ZERO_ERROR; - registerFactory(new ICUNumberFormatFactory(), status); - } + ICUNumberFormatService() + : ICULocaleService("Number Format") + { + UErrorCode status = U_ZERO_ERROR; + registerFactory(new ICUNumberFormatFactory(), status); + } - virtual UObject* cloneInstance(UObject* instance) const { - return ((NumberFormat*)instance)->clone(); - } + virtual UObject* cloneInstance(UObject* instance) const { + return ((NumberFormat*)instance)->clone(); + } - virtual UObject* handleDefault(const ICUServiceKey& key, UnicodeString* actualID, UErrorCode& status) const { - LocaleKey& lkey = (LocaleKey&)key; - int32_t kind = lkey.kind(); - Locale loc; - lkey.currentLocale(loc); - return NumberFormat::makeInstance(loc, (NumberFormat::EStyles)kind, status); - } + virtual UObject* handleDefault(const ICUServiceKey& key, UnicodeString* /* actualID */, UErrorCode& status) const { + LocaleKey& lkey = (LocaleKey&)key; + int32_t kind = lkey.kind(); + Locale loc; + lkey.currentLocale(loc); + return NumberFormat::makeInstance(loc, (NumberFormat::EStyles)kind, status); + } - virtual UBool isDefault() const { - return countFactories() == 1; - } + virtual UBool isDefault() const { + return countFactories() == 1; + } }; // ------------------------------------- static ICULocaleService* -getService(void) +getNumberFormatService(void) { UBool needInit; { @@ -434,7 +601,9 @@ getService(void) delete newservice; } else { // we won the contention, this thread can register cleanup. - ucln_i18n_registerCleanup(); +#if !UCONFIG_NO_SERVICE + ucln_i18n_registerCleanup(UCLN_I18N_NUMFMT, numfmt_cleanup); +#endif } } return gService; @@ -442,26 +611,10 @@ getService(void) // ------------------------------------- -NumberFormat* -NumberFormat::createInstance(const Locale& loc, EStyles kind, UErrorCode& status) -{ - umtx_lock(NULL); - UBool haveService = gService != NULL; - umtx_unlock(NULL); - if (haveService) { - return (NumberFormat*)gService->get(loc, kind, status); - } else { - return makeInstance(loc, kind, status); - } -} - - -// ------------------------------------- - -URegistryKey +URegistryKey U_EXPORT2 NumberFormat::registerFactory(NumberFormatFactory* toAdopt, UErrorCode& status) { - ICULocaleService *service = getService(); + ICULocaleService *service = getNumberFormatService(); if (service) { return service->registerFactory(new NFFactory(toAdopt), status); } @@ -471,7 +624,7 @@ NumberFormat::registerFactory(NumberFormatFactory* toAdopt, UErrorCode& status) // ------------------------------------- -UBool +UBool U_EXPORT2 NumberFormat::unregister(URegistryKey key, UErrorCode& status) { if (U_SUCCESS(status)) { @@ -487,15 +640,35 @@ NumberFormat::unregister(URegistryKey key, UErrorCode& status) } // ------------------------------------- -StringEnumeration* +StringEnumeration* U_EXPORT2 NumberFormat::getAvailableLocales(void) { - ICULocaleService *service = getService(); + ICULocaleService *service = getNumberFormatService(); if (service) { return service->getAvailableLocales(); } return NULL; // no way to return error condition } +#endif /* UCONFIG_NO_SERVICE */ +// ------------------------------------- + +NumberFormat* U_EXPORT2 +NumberFormat::createInstance(const Locale& loc, EStyles kind, UErrorCode& status) +{ +#if !UCONFIG_NO_SERVICE + umtx_lock(NULL); + UBool haveService = gService != NULL; + umtx_unlock(NULL); + if (haveService) { + return (NumberFormat*)gService->get(loc, kind, status); + } + else +#endif + { + return makeInstance(loc, kind, status); + } +} + // ------------------------------------- // Checks if the thousand/10 thousand grouping is used in the @@ -606,17 +779,34 @@ NumberFormat::setMinimumFractionDigits(int32_t newValue) // ------------------------------------- -void NumberFormat::setCurrency(const UChar* theCurrency) { +void NumberFormat::setCurrency(const UChar* theCurrency, UErrorCode& ec) { + if (U_FAILURE(ec)) { + return; + } if (theCurrency) { - u_strncpy(currency, theCurrency, 3); - currency[3] = 0; + u_strncpy(fCurrency, theCurrency, 3); + fCurrency[3] = 0; } else { - currency[0] = 0; + fCurrency[0] = 0; } } const UChar* NumberFormat::getCurrency() const { - return currency; + return fCurrency; +} + +void NumberFormat::getEffectiveCurrency(UChar* result, UErrorCode& ec) const { + const UChar* c = getCurrency(); + if (*c != 0) { + u_strncpy(result, c, 3); + result[3] = 0; + } else { + const char* loc = getLocaleID(ULOC_VALID_LOCALE, ec); + if (loc == NULL) { + loc = uloc_getDefault(); + } + ucurr_forLocale(loc, result, 4, &ec); + } } // ------------------------------------- @@ -635,81 +825,94 @@ NumberFormat::makeInstance(const Locale& desiredLocale, return NULL; } - ResourceBundle resource((char *)0, desiredLocale, status); - NumberFormat* f; + NumberFormat* f = NULL; + DecimalFormatSymbols* symbolsToAdopt = NULL; + UnicodeString pattern; + UResourceBundle *resource = ures_open((char *)0, desiredLocale.getName(), &status); + UResourceBundle *numberPatterns = ures_getByKey(resource, DecimalFormat::fgNumberPatterns, NULL, &status); - if (U_FAILURE(status)) - { + if (U_FAILURE(status)) { // We don't appear to have resource data available -- use the last-resort data status = U_USING_FALLBACK_WARNING; - - // Use the DecimalFormatSymbols constructor which uses last-resort data - DecimalFormatSymbols* symbolsToAdopt = new DecimalFormatSymbols(status); - if (symbolsToAdopt == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - return NULL; - } - if (U_FAILURE(status)) { - delete symbolsToAdopt; // This should never happen - return NULL; - } + // When the data is unavailable, and locale isn't passed in, last resort data is used. + symbolsToAdopt = new DecimalFormatSymbols(status); // Creates a DecimalFormat instance with the last resort number patterns. - f = new DecimalFormat(fgLastResortNumberPatterns[style], symbolsToAdopt, status); - if (f == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - return NULL; - } - if (U_FAILURE(status)) { - delete f; - f = NULL; - } - return f; + pattern.setTo(TRUE, fgLastResortNumberPatterns[style], -1); } + else { + // If not all the styled patterns exists for the NumberFormat in this locale, + // sets the status code to failure and returns nil. + if (ures_getSize(numberPatterns) < fgNumberPatternsCount) { + status = U_INVALID_FORMAT_ERROR; + goto cleanup; + } - ResourceBundle numberPatterns(resource.get(DecimalFormat::fgNumberPatterns, status)); - // If not all the styled patterns exists for the NumberFormat in this locale, - // sets the status code to failure and returns nil. - //if (patternCount < fgNumberPatternsCount) status = U_INVALID_FORMAT_ERROR; - if (numberPatterns.getSize() < fgNumberPatternsCount) - status = U_INVALID_FORMAT_ERROR; - if (U_FAILURE(status)) - return NULL; + // Loads the decimal symbols of the desired locale. + symbolsToAdopt = new DecimalFormatSymbols(desiredLocale, status); - // Loads the decimal symbols of the desired locale. - DecimalFormatSymbols* symbolsToAdopt = new DecimalFormatSymbols(desiredLocale, status); - if (symbolsToAdopt == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - return NULL; + int32_t patLen = 0; + const UChar *patResStr = ures_getStringByIndex(numberPatterns, (int32_t)style, &patLen, &status); + // Creates the specified decimal format style of the desired locale. + pattern.setTo(TRUE, patResStr, patLen); } - if (U_FAILURE(status)) { - delete symbolsToAdopt; - return NULL; + if (U_FAILURE(status) || symbolsToAdopt == NULL) { + goto cleanup; } - // Creates the specified decimal format style of the desired locale. - if (style < numberPatterns.getSize()) { - const UnicodeString pattern(numberPatterns.getStringEx(style, status)); - if (U_SUCCESS(status)) { - f = new DecimalFormat(pattern, symbolsToAdopt, status); - } - else { - return NULL; + // Here we assume that the locale passed in is in the canonical + // form, e.g: pt_PT_@currency=PTE not pt_PT_PREEURO + if(style==kCurrencyStyle){ + char currencyCode[8]={0}; + int32_t currencyCodeCap = sizeof(currencyCode); + const char* locName = desiredLocale.getName(); + currencyCodeCap = uloc_getKeywordValue(locName, "currency", currencyCode, currencyCodeCap, &status); + if(U_SUCCESS(status) && currencyCodeCap > 0) { + /* An explicit currency was requested */ + UErrorCode localStatus = U_ZERO_ERROR; + UResourceBundle *currency = ures_getByKeyWithFallback(resource, "Currencies", NULL, &localStatus); + currency = ures_getByKeyWithFallback(currency, currencyCode, currency, &localStatus); + if(U_SUCCESS(localStatus) && ures_getSize(currency)>2) { + currency = ures_getByIndex(currency, 2, currency, &localStatus); + int32_t currPatternLen = 0; + const UChar *currPattern = ures_getStringByIndex(currency, (int32_t)0, &currPatternLen, &localStatus); + UnicodeString decimalSep = ures_getStringByIndex(currency, (int32_t)1, NULL, &localStatus); + UnicodeString groupingSep = ures_getStringByIndex(currency, (int32_t)2, NULL, &localStatus); + if(U_SUCCESS(localStatus)){ + symbolsToAdopt->setSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol, groupingSep); + symbolsToAdopt->setSymbol(DecimalFormatSymbols::kMonetarySeparatorSymbol, decimalSep); + pattern.setTo(TRUE, currPattern, currPatternLen); + status = localStatus; + } + } + ures_close(currency); + /* else An explicit currency was requested and is unknown or locale data is malformed. */ + /* ucurr_* API will get the correct value later on. */ } + /* else no currency keyword used. */ } - else { - // If the requested style doesn't exist, use a last-resort style. - // This is to support scientific styles before we have all the - // resource data in place. - f = new DecimalFormat(fgLastResortNumberPatterns[style], symbolsToAdopt, status); + f = new DecimalFormat(pattern, symbolsToAdopt, status); + if (U_FAILURE(status) || f == NULL) { + goto cleanup; } - if (f == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; + f->setLocaleIDs(ures_getLocaleByType(numberPatterns, ULOC_VALID_LOCALE, &status), + ures_getLocaleByType(numberPatterns, ULOC_ACTUAL_LOCALE, &status)); +cleanup: + ures_close(numberPatterns); + ures_close(resource); + if (U_FAILURE(status)) { + /* If f exists, then it will delete the symbols */ + if (f==NULL) { + delete symbolsToAdopt; + } + else { + delete f; + } return NULL; } - if (U_FAILURE(status)) { - delete f; + if (f == NULL || symbolsToAdopt == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; f = NULL; } return f; @@ -717,19 +920,6 @@ NumberFormat::makeInstance(const Locale& desiredLocale, U_NAMESPACE_END -// defined in ucln_cmn.h - -/** - * Release all static memory held by numberformat. - */ -U_CFUNC UBool numfmt_cleanup(void) { - if (gService) { - delete gService; - gService = NULL; - } - return TRUE; -} - #endif /* #if !UCONFIG_NO_FORMATTING */ //eof diff --git a/icuSources/i18n/olsontz.cpp b/icuSources/i18n/olsontz.cpp new file mode 100644 index 00000000..c2665dc7 --- /dev/null +++ b/icuSources/i18n/olsontz.cpp @@ -0,0 +1,492 @@ +/* +********************************************************************** +* Copyright (c) 2003-2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Author: Alan Liu +* Created: July 21 2003 +* Since: ICU 2.8 +********************************************************************** +*/ + +#include "olsontz.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/ures.h" +#include "unicode/simpletz.h" +#include "unicode/gregocal.h" +#include "gregoimp.h" +#include "cmemory.h" +#include "uassert.h" +#include // DBL_MAX + +#ifdef U_DEBUG_TZ +# include +# include "uresimp.h" // for debugging + +static void debug_tz_loc(const char *f, int32_t l) +{ + fprintf(stderr, "%s:%d: ", f, l); +} + +static void debug_tz_msg(const char *pat, ...) +{ + va_list ap; + va_start(ap, pat); + vfprintf(stderr, pat, ap); + fflush(stderr); +} +// must use double parens, i.e.: U_DEBUG_TZ_MSG(("four is: %d",4)); +#define U_DEBUG_TZ_MSG(x) {debug_tz_loc(__FILE__,__LINE__);debug_tz_msg x;} +#else +#define U_DEBUG_TZ_MSG(x) +#endif + +U_NAMESPACE_BEGIN + +#define SECONDS_PER_DAY (24*60*60) + +static const int32_t ZEROS[] = {0,0}; + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(OlsonTimeZone) + +/** + * Default constructor. Creates a time zone with an empty ID and + * a fixed GMT offset of zero. + */ +OlsonTimeZone::OlsonTimeZone() : finalYear(INT32_MAX), finalMillis(DBL_MAX), finalZone(0) { + constructEmpty(); +} + +/** + * Construct a GMT+0 zone with no transitions. This is done when a + * constructor fails so the resultant object is well-behaved. + */ +void OlsonTimeZone::constructEmpty() { + transitionCount = 0; + typeCount = 1; + transitionTimes = typeOffsets = ZEROS; + typeData = (const uint8_t*) ZEROS; +} + +/** + * Construct from a resource bundle + * @param top the top-level zoneinfo resource bundle. This is used + * to lookup the rule that `res' may refer to, if there is one. + * @param res the resource bundle of the zone to be constructed + * @param ec input-output error code + */ +OlsonTimeZone::OlsonTimeZone(const UResourceBundle* top, + const UResourceBundle* res, + UErrorCode& ec) : + finalYear(INT32_MAX), finalMillis(DBL_MAX), finalZone(0) +{ + U_DEBUG_TZ_MSG(("OlsonTimeZone(%s)\n", ures_getKey((UResourceBundle*)res))); + if ((top == NULL || res == NULL) && U_SUCCESS(ec)) { + ec = U_ILLEGAL_ARGUMENT_ERROR; + } + if (U_SUCCESS(ec)) { + // TODO -- clean up -- Doesn't work if res points to an alias + // // TODO remove nonconst casts below when ures_* API is fixed + // setID(ures_getKey((UResourceBundle*) res)); // cast away const + + // Size 1 is an alias TO another zone (int) + // HOWEVER, the caller should dereference this and never pass it in to us + // Size 3 is a purely historical zone (no final rules) + // Size 4 is like size 3, but with an alias list at the end + // Size 5 is a hybrid zone, with historical and final elements + // Size 6 is like size 5, but with an alias list at the end + int32_t size = ures_getSize((UResourceBundle*) res); // cast away const + if (size < 3 || size > 6) { + ec = U_INVALID_FORMAT_ERROR; + } + + // Transitions list may be empty + int32_t i; + UResourceBundle* r = ures_getByIndex(res, 0, NULL, &ec); + transitionTimes = ures_getIntVector(r, &i, &ec); + ures_close(r); + if ((i<0 || i>0x7FFF) && U_SUCCESS(ec)) { + ec = U_INVALID_FORMAT_ERROR; + } + transitionCount = (int16_t) i; + + // Type offsets list must be of even size, with size >= 2 + r = ures_getByIndex(res, 1, NULL, &ec); + typeOffsets = ures_getIntVector(r, &i, &ec); + ures_close(r); + if ((i<2 || i>0x7FFE || ((i&1)!=0)) && U_SUCCESS(ec)) { + ec = U_INVALID_FORMAT_ERROR; + } + typeCount = (int16_t) i >> 1; + + // Type data must be of the same size as the transitions list + r = ures_getByIndex(res, 2, NULL, &ec); + int32_t len; + typeData = ures_getBinary(r, &len, &ec); + ures_close(r); + if (len != transitionCount && U_SUCCESS(ec)) { + ec = U_INVALID_FORMAT_ERROR; + } + +#if defined (U_DEBUG_TZ) + U_DEBUG_TZ_MSG(("OlsonTimeZone(%s) - size = %d, typecount %d transitioncount %d - err %s\n", ures_getKey((UResourceBundle*)res), size, typeCount, transitionCount, u_errorName(ec))); + if(U_SUCCESS(ec)) { + int32_t jj; + for(jj=0;jj= 5) { + int32_t ruleidLen = 0; + const UChar* idUStr = ures_getStringByIndex(res, 3, &ruleidLen, &ec); + UnicodeString ruleid(TRUE, idUStr, ruleidLen); + r = ures_getByIndex(res, 4, NULL, &ec); + const int32_t* data = ures_getIntVector(r, &len, &ec); +#if defined U_DEBUG_TZ + const char *rKey = ures_getKey(r); + const char *zKey = ures_getKey((UResourceBundle*)res); +#endif + ures_close(r); + if (U_SUCCESS(ec)) { + if (data != 0 && len == 2) { + int32_t rawOffset = data[0] * U_MILLIS_PER_SECOND; + // Subtract one from the actual final year; we + // actually store final year - 1, and compare + // using > rather than >=. This allows us to use + // INT32_MAX as an exclusive upper limit for all + // years, including INT32_MAX. + U_ASSERT(data[1] > INT32_MIN); + finalYear = data[1] - 1; + // Also compute the millis for Jan 1, 0:00 GMT of the + // finalYear. This reduces runtime computations. + finalMillis = Grego::fieldsToDay(data[1], 0, 1) * U_MILLIS_PER_DAY; + U_DEBUG_TZ_MSG(("zone%s|%s: {%d,%d}, finalYear%d, finalMillis%.1lf\n", + zKey,rKey, data[0], data[1], finalYear, finalMillis)); + r = TimeZone::loadRule(top, ruleid, NULL, ec); + if (U_SUCCESS(ec)) { + // 3, 1, -1, 7200, 0, 9, -31, -1, 7200, 0, 3600 + data = ures_getIntVector(r, &len, &ec); + if (U_SUCCESS(ec) && len == 11) { + UnicodeString emptyStr; + U_DEBUG_TZ_MSG(("zone%s, rule%s: {%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d}", zKey, ures_getKey(r), + data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8], data[9], data[10])); + finalZone = new SimpleTimeZone(rawOffset, emptyStr, + (int8_t)data[0], (int8_t)data[1], (int8_t)data[2], + data[3] * U_MILLIS_PER_SECOND, + (SimpleTimeZone::TimeMode) data[4], + (int8_t)data[5], (int8_t)data[6], (int8_t)data[7], + data[8] * U_MILLIS_PER_SECOND, + (SimpleTimeZone::TimeMode) data[9], + data[10] * U_MILLIS_PER_SECOND, ec); + } else { + ec = U_INVALID_FORMAT_ERROR; + } + } + ures_close(r); + } else { + ec = U_INVALID_FORMAT_ERROR; + } + } + } + } + + if (U_FAILURE(ec)) { + constructEmpty(); + } +} + +/** + * Copy constructor + */ +OlsonTimeZone::OlsonTimeZone(const OlsonTimeZone& other) : + TimeZone(other), finalZone(0) { + *this = other; +} + +/** + * Assignment operator + */ +OlsonTimeZone& OlsonTimeZone::operator=(const OlsonTimeZone& other) { + transitionCount = other.transitionCount; + typeCount = other.typeCount; + transitionTimes = other.transitionTimes; + typeOffsets = other.typeOffsets; + typeData = other.typeData; + finalYear = other.finalYear; + finalMillis = other.finalMillis; + delete finalZone; + finalZone = (other.finalZone != 0) ? + (SimpleTimeZone*) other.finalZone->clone() : 0; + return *this; +} + +/** + * Destructor + */ +OlsonTimeZone::~OlsonTimeZone() { + delete finalZone; +} + +/** + * Returns true if the two TimeZone objects are equal. + */ +UBool OlsonTimeZone::operator==(const TimeZone& other) const { + const OlsonTimeZone* z = (const OlsonTimeZone*) &other; + + return TimeZone::operator==(other) && + // [sic] pointer comparison: typeData points into + // memory-mapped or DLL space, so if two zones have the same + // pointer, they are equal. + (typeData == z->typeData || + // If the pointers are not equal, the zones may still + // be equal if their rules and transitions are equal + (finalYear == z->finalYear && + // Don't compare finalMillis; if finalYear is ==, so is finalMillis + ((finalZone == 0 && z->finalZone == 0) || + (finalZone != 0 && z->finalZone != 0 && + *finalZone == *z->finalZone)) && + transitionCount == z->transitionCount && + typeCount == z->typeCount && + uprv_memcmp(transitionTimes, z->transitionTimes, + sizeof(transitionTimes[0]) * transitionCount) == 0 && + uprv_memcmp(typeOffsets, z->typeOffsets, + (sizeof(typeOffsets[0]) * typeCount) << 1) == 0 && + uprv_memcmp(typeData, z->typeData, + (sizeof(typeData[0]) * typeCount)) == 0 + )); +} + +/** + * TimeZone API. + */ +TimeZone* OlsonTimeZone::clone() const { + return new OlsonTimeZone(*this); +} + +/** + * TimeZone API. + */ +int32_t OlsonTimeZone::getOffset(uint8_t era, int32_t year, int32_t month, + int32_t dom, uint8_t dow, + int32_t millis, UErrorCode& ec) const { + if (month < UCAL_JANUARY || month > UCAL_DECEMBER) { + if (U_SUCCESS(ec)) { + ec = U_ILLEGAL_ARGUMENT_ERROR; + } + return 0; + } else { + return getOffset(era, year, month, dom, dow, millis, + Grego::monthLength(year, month), + ec); + } +} + +/** + * TimeZone API. + */ +int32_t OlsonTimeZone::getOffset(uint8_t era, int32_t year, int32_t month, + int32_t dom, uint8_t dow, + int32_t millis, int32_t monthLength, + UErrorCode& ec) const { + if (U_FAILURE(ec)) { + return 0; + } + + if ((era != GregorianCalendar::AD && era != GregorianCalendar::BC) + || month < UCAL_JANUARY + || month > UCAL_DECEMBER + || dom < 1 + || dom > monthLength + || dow < UCAL_SUNDAY + || dow > UCAL_SATURDAY + || millis < 0 + || millis >= U_MILLIS_PER_DAY + || monthLength < 28 + || monthLength > 31) { + ec = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + if (era == GregorianCalendar::BC) { + year = -year; + } + + if (year > finalYear) { // [sic] >, not >=; see above + U_ASSERT(finalZone != 0); + return finalZone->getOffset(era, year, month, dom, dow, + millis, monthLength, ec); + } + + // Compute local epoch seconds from input fields + double time = Grego::fieldsToDay(year, month, dom) * SECONDS_PER_DAY + + uprv_floor(millis / (double) U_MILLIS_PER_SECOND); + + return zoneOffset(findTransition(time, TRUE)) * U_MILLIS_PER_SECOND; +} + +/** + * TimeZone API. + */ +void OlsonTimeZone::getOffset(UDate date, UBool local, int32_t& rawoff, + int32_t& dstoff, UErrorCode& ec) const { + if (U_FAILURE(ec)) { + return; + } + + // The check against finalMillis will suffice most of the time, except + // for the case in which finalMillis == DBL_MAX, date == DBL_MAX, + // and finalZone == 0. For this case we add "&& finalZone != 0". + if (date >= finalMillis && finalZone != 0) { + int32_t year, month, dom, dow; + double millis; + double days = Math::floorDivide(date, (double)U_MILLIS_PER_DAY, millis); + + Grego::dayToFields(days, year, month, dom, dow); + + rawoff = finalZone->getRawOffset(); + + if (!local) { + // Adjust from GMT to local + date += rawoff; + double days2 = Math::floorDivide(date, (double)U_MILLIS_PER_DAY, millis); + if (days2 != days) { + Grego::dayToFields(days2, year, month, dom, dow); + } + } + + dstoff = finalZone->getOffset( + GregorianCalendar::AD, year, month, + dom, (uint8_t) dow, (int32_t) millis, ec) - rawoff; + return; + } + + double secs = uprv_floor(date / U_MILLIS_PER_SECOND); + int16_t i = findTransition(secs, local); + rawoff = rawOffset(i) * U_MILLIS_PER_SECOND; + dstoff = dstOffset(i) * U_MILLIS_PER_SECOND; +} + +/** + * TimeZone API. + */ +void OlsonTimeZone::setRawOffset(int32_t /*offsetMillis*/) { + // We don't support this operation, since OlsonTimeZones are + // immutable (except for the ID, which is in the base class). + + // Nothing to do! +} + +/** + * TimeZone API. + */ +int32_t OlsonTimeZone::getRawOffset() const { + UErrorCode ec = U_ZERO_ERROR; + int32_t raw, dst; + getOffset((double) uprv_getUTCtime() * U_MILLIS_PER_SECOND, + FALSE, raw, dst, ec); + return raw; +} + +/** + * Find the smallest i (in 0..transitionCount-1) such that time >= + * transition(i), where transition(i) is either the GMT or the local + * transition time, as specified by `local'. + * @param time epoch seconds, either GMT or local wall + * @param local if TRUE, `time' is in local wall units, otherwise it + * is GMT + * @return an index i, where 0 <= i < transitionCount, and + * transition(i) <= time < transition(i+1), or i == 0 if + * transitionCount == 0 or time < transition(0). + */ +int16_t OlsonTimeZone::findTransition(double time, UBool local) const { + int16_t i = 0; + + if (transitionCount != 0) { + // Linear search from the end is the fastest approach, since + // most lookups will happen at/near the end. + for (i = transitionCount - 1; i > 0; --i) { + int32_t transition = transitionTimes[i]; + if (local) { + transition += zoneOffset(typeData[i]); + } + if (time >= transition) { + break; + } + } + + U_ASSERT(i>=0 && i= transitionTimes[i]); + U_ASSERT(local || i == transitionCount-1 || time < transitionTimes[i+1]); + + i = typeData[i]; + } + + U_ASSERT(i>=0 && i finalYear) { // [sic] >, not >=; see above + U_ASSERT(finalZone != 0 && finalZone->useDaylightTime()); + return TRUE; + } + + // Find start of this year, and start of next year + int32_t start = (int32_t) Grego::fieldsToDay(year, 0, 1) * SECONDS_PER_DAY; + int32_t limit = (int32_t) Grego::fieldsToDay(year+1, 0, 1) * SECONDS_PER_DAY; + + // Return TRUE if DST is observed at any time during the current + // year. + for (int16_t i=0; i= limit) { + break; + } + if (transitionTimes[i] >= start && + dstOffset(typeData[i]) != 0) { + return TRUE; + } + } + return FALSE; +} + +/** + * TimeZone API. + */ +UBool OlsonTimeZone::inDaylightTime(UDate date, UErrorCode& ec) const { + int32_t raw, dst; + getOffset(date, FALSE, raw, dst, ec); + return dst != 0; +} + +U_NAMESPACE_END + +#endif // !UCONFIG_NO_FORMATTING + +//eof diff --git a/icuSources/i18n/olsontz.h b/icuSources/i18n/olsontz.h new file mode 100644 index 00000000..ef19ee2a --- /dev/null +++ b/icuSources/i18n/olsontz.h @@ -0,0 +1,302 @@ +/* +********************************************************************** +* Copyright (c) 2003-2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Author: Alan Liu +* Created: July 21 2003 +* Since: ICU 2.8 +********************************************************************** +*/ +#ifndef OLSONTZ_H +#define OLSONTZ_H + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/timezone.h" + +struct UResourceBundle; + +U_NAMESPACE_BEGIN + +class SimpleTimeZone; + +/** + * A time zone based on the Olson database. Olson time zones change + * behavior over time. The raw offset, rules, presence or absence of + * daylight savings time, and even the daylight savings amount can all + * vary. + * + * This class uses a resource bundle named "zoneinfo". Zoneinfo is a + * table containing different kinds of resources. In several places, + * zones are referred to using integers. A zone's integer is a number + * from 0..n-1, where n is the number of zones, with the zones sorted + * in lexicographic order. + * + * 1. Zones. These have keys corresponding to the Olson IDs, e.g., + * "Asia/Shanghai". Each resource describes the behavior of the given + * zone. Zones come in several formats, which are differentiated + * based on length. + * + * a. Alias (int, length 1). An alias zone is an int resource. The + * integer is the zone number of the target zone. The key of this + * resource is an alternate name for the target zone. Aliases + * represent Olson links and ICU compatibility IDs. + * + * b. Simple zone (array, length 3). The three subelements are: + * + * i. An intvector of transitions. These are given in epoch + * seconds. This may be an empty invector (length 0). If the + * transtions list is empty, then the zone's behavior is fixed and + * given by the offset list, which will contain exactly one pair. + * Otherwise each transtion indicates a time after which (inclusive) + * the associated offset pair is in effect. + * + * ii. An intvector of offsets. These are in pairs of raw offset / + * DST offset, in units of seconds. There will be at least one pair + * (length >= 2 && length % 2 == 0). + * + * iii. A binary resource. This is of the same length as the + * transitions vector, so length may be zero. Each unsigned byte + * corresponds to one transition, and has a value of 0..n-1, where n + * is the number of pairs in the offset vector. This forms a map + * between transitions and offset pairs. + * + * c. Simple zone with aliases (array, length 4). This is like a + * simple zone, but also contains a fourth element: + * + * iv. An intvector of aliases. This list includes this zone + * itself, and lists all aliases of this zone. + * + * d. Complex zone (array, length 5). This is like a simple zone, + * but contains two more elements: + * + * iv. A string, giving the name of a rule. This is the "final + * rule", which governs the zone's behavior beginning in the "final + * year". The rule ID is given without leading underscore, e.g., + * "EU". + * + * v. An intvector of length 2, containing the raw offset for the + * final rule (in seconds), and the final year. The final rule + * takes effect for years >= the final year. + * + * e. Complex zone with aliases (array, length 6). This is like a + * complex zone, but also contains a sixth element: + * + * vi. An intvector of aliases. This list includes this zone + * itself, and lists all aliases of this zone. + * + * 2. Rules. These have keys corresponding to the Olson rule IDs, + * with an underscore prepended, e.g., "_EU". Each resource describes + * the behavior of the given rule using an intvector, containing the + * onset list, the cessation list, and the DST savings. The onset and + * cessation lists consist of the month, dowim, dow, time, and time + * mode. The end result is that the 11 integers describing the rule + * can be passed directly into the SimpleTimeZone 13-argument + * constructor (the other two arguments will be the raw offset, taken + * from the complex zone element 5, and the ID string, which is not + * used), with the times and the DST savings multiplied by 1000 to + * scale from seconds to milliseconds. + * + * 3. Countries. These have keys corresponding to the 2-letter ISO + * country codes, with a percent sign prepended, e.g., "%US". Each + * resource is an intvector listing the zones associated with the + * given country. The special entry "%" corresponds to "no country", + * that is, the category of zones assigned to no country in the Olson + * DB. + * + * 4. Metadata. Metadata is stored under the key "_". It is an + * intvector of length three containing the number of zones resources, + * rule resources, and country resources. For the purposes of this + * count, the metadata entry itself is considered a rule resource, + * since its key begins with an underscore. + */ +class U_I18N_API OlsonTimeZone: public TimeZone { + public: + /** + * Construct from a resource bundle. + * @param top the top-level zoneinfo resource bundle. This is used + * to lookup the rule that `res' may refer to, if there is one. + * @param res the resource bundle of the zone to be constructed + * @param ec input-output error code + */ + OlsonTimeZone(const UResourceBundle* top, + const UResourceBundle* res, UErrorCode& ec); + + /** + * Copy constructor + */ + OlsonTimeZone(const OlsonTimeZone& other); + + /** + * Destructor + */ + virtual ~OlsonTimeZone(); + + /** + * Assignment operator + */ + OlsonTimeZone& operator=(const OlsonTimeZone& other); + + /** + * Returns true if the two TimeZone objects are equal. + */ + virtual UBool operator==(const TimeZone& other) const; + + /** + * TimeZone API. + */ + virtual TimeZone* clone() const; + + /** + * TimeZone API. + */ + static UClassID U_EXPORT2 getStaticClassID(); + + /** + * TimeZone API. + */ + virtual UClassID getDynamicClassID() const; + + /** + * TimeZone API. Do not call this; prefer getOffset(UDate,...). + */ + virtual int32_t getOffset(uint8_t era, int32_t year, int32_t month, + int32_t day, uint8_t dayOfWeek, + int32_t millis, UErrorCode& ec) const; + + /** + * TimeZone API. Do not call this; prefer getOffset(UDate,...). + */ + virtual int32_t getOffset(uint8_t era, int32_t year, int32_t month, + int32_t day, uint8_t dayOfWeek, + int32_t millis, int32_t monthLength, + UErrorCode& ec) const; + + /** + * TimeZone API. + */ + virtual void getOffset(UDate date, UBool local, int32_t& rawOffset, + int32_t& dstOffset, UErrorCode& ec) const; + + /** + * TimeZone API. This method has no effect since objects of this + * class are quasi-immutable (the base class allows the ID to be + * changed). + */ + virtual void setRawOffset(int32_t offsetMillis); + + /** + * TimeZone API. For a historical zone, the raw offset can change + * over time, so this API is not useful. In order to approximate + * expected behavior, this method returns the raw offset for the + * current moment in time. + */ + virtual int32_t getRawOffset() const; + + /** + * TimeZone API. For a historical zone, whether DST is used or + * not varies over time. In order to approximate expected + * behavior, this method returns TRUE if DST is observed at any + * point in the current year. + */ + virtual UBool useDaylightTime() const; + + /** + * TimeZone API. + */ + virtual UBool inDaylightTime(UDate date, UErrorCode& ec) const; + + protected: + /** + * Default constructor. Creates a time zone with an empty ID and + * a fixed GMT offset of zero. + */ + OlsonTimeZone(); + + private: + + void constructEmpty(); + + int16_t findTransition(double time, UBool local) const; + + int32_t zoneOffset(int16_t index) const; + int32_t rawOffset(int16_t index) const; + int32_t dstOffset(int16_t index) const; + + /** + * Number of transitions, 0..~370 + */ + int16_t transitionCount; + + /** + * Number of types, 1..255 + */ + int16_t typeCount; + + /** + * Time of each transition in seconds from 1970 epoch. + * Length is transitionCount int32_t's. + */ + const int32_t *transitionTimes; // alias into res; do not delete + + /** + * Offset from GMT in seconds for each type. + * Length is typeCount int32_t's. + */ + const int32_t *typeOffsets; // alias into res; do not delete + + /** + * Type description data, consisting of transitionCount uint8_t + * type indices (from 0..typeCount-1). + * Length is transitionCount int8_t's. + */ + const uint8_t *typeData; // alias into res; do not delete + + /** + * The last year for which the transitions data are to be used + * rather than the finalZone. If there is no finalZone, then this + * is set to INT32_MAX. NOTE: This corresponds to the year _before_ + * the one indicated by finalMillis. + */ + int32_t finalYear; + + /** + * The millis for the start of the first year for which finalZone + * is to be used, or DBL_MAX if finalZone is 0. NOTE: This is + * 0:00 GMT Jan 1, (not ). + */ + double finalMillis; + + /** + * A SimpleTimeZone that governs the behavior for years > finalYear. + * If and only if finalYear == INT32_MAX then finalZone == 0. + */ + SimpleTimeZone *finalZone; // owned, may be NULL + +}; + +inline int32_t +OlsonTimeZone::zoneOffset(int16_t index) const { + index <<= 1; + return typeOffsets[index] + typeOffsets[index+1]; +} + +inline int32_t +OlsonTimeZone::rawOffset(int16_t index) const { + return typeOffsets[(uint32_t)(index << 1)]; +} + +inline int32_t +OlsonTimeZone::dstOffset(int16_t index) const { + return typeOffsets[(uint32_t)((index << 1) + 1)]; +} + +U_NAMESPACE_END + +#endif // !UCONFIG_NO_FORMATTING +#endif // OLSONTZ_H + +//eof diff --git a/icuSources/i18n/quant.cpp b/icuSources/i18n/quant.cpp index 81bc0b55..9a5606da 100644 --- a/icuSources/i18n/quant.cpp +++ b/icuSources/i18n/quant.cpp @@ -1,5 +1,5 @@ /* -* Copyright (C) 2001, International Business Machines Corporation and others. All Rights Reserved. +* Copyright (C) 2001-2003, International Business Machines Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description * 07/26/01 aliu Creation. @@ -16,7 +16,7 @@ U_NAMESPACE_BEGIN -const char Quantifier::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(Quantifier) Quantifier::Quantifier(UnicodeFunctor *adoptedMatcher, uint32_t _minCount, uint32_t _maxCount) { @@ -29,6 +29,7 @@ Quantifier::Quantifier(UnicodeFunctor *adoptedMatcher, Quantifier::Quantifier(const Quantifier& o) : UnicodeFunctor(o), + UnicodeMatcher(o), matcher(o.matcher->clone()), minCount(o.minCount), maxCount(o.maxCount) @@ -125,7 +126,7 @@ UBool Quantifier::matchesIndexValue(uint8_t v) const { */ void Quantifier::addMatchSetTo(UnicodeSet& toUnionTo) const { if (maxCount > 0) { - matcher->toMatcher()->addMatchSetTo(toUnionTo); + matcher->toMatcher()->addMatchSetTo(toUnionTo); } } diff --git a/icuSources/i18n/quant.h b/icuSources/i18n/quant.h index c627e08e..532a9fe0 100644 --- a/icuSources/i18n/quant.h +++ b/icuSources/i18n/quant.h @@ -1,10 +1,11 @@ /* -* Copyright (C) 2001, International Business Machines Corporation and others. All Rights Reserved. -********************************************************************** -* Date Name Description -* 07/26/01 aliu Creation. -********************************************************************** -*/ + * Copyright (C) 2001-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ********************************************************************** + * Date Name Description + * 07/26/01 aliu Creation. + ********************************************************************** + */ #ifndef QUANT_H #define QUANT_H @@ -101,14 +102,14 @@ class Quantifier : public UnicodeFunctor, public UnicodeMatcher { * * @draft ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * * @draft ICU 2.2 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } + static UClassID U_EXPORT2 getStaticClassID(); private: @@ -119,12 +120,6 @@ class Quantifier : public UnicodeFunctor, public UnicodeMatcher { uint32_t minCount; uint32_t maxCount; - - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; U_NAMESPACE_END diff --git a/icuSources/i18n/rbnf.cpp b/icuSources/i18n/rbnf.cpp index c53a7b0c..ad2d71b6 100644 --- a/icuSources/i18n/rbnf.cpp +++ b/icuSources/i18n/rbnf.cpp @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 1997-2003, International Business Machines Corporation and others. All Rights Reserved. +* Copyright (C) 1997-2004, International Business Machines Corporation and others. All Rights Reserved. ******************************************************************************* */ @@ -17,12 +17,21 @@ #include "unicode/ures.h" #include "unicode/ustring.h" #include "unicode/utf16.h" - +#include "unicode/udata.h" #include "nfrs.h" #include "cmemory.h" #include "cstring.h" -#include "uprops.h" +#include "util.h" + +// debugging +// #define DEBUG + +#ifdef DEBUG +#include "stdio.h" +#endif + +#define U_ICUDATA_RBNF U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "rbnf" static const UChar gPercentPercent[] = { @@ -45,9 +54,584 @@ static const UChar gSemiPercent[] = #define kHalfMaxDouble (double)(1 << kSomeNumberOfBitsDiv2) #define kMaxDouble (kHalfMaxDouble * kHalfMaxDouble) -const char RuleBasedNumberFormat::fgClassID = 0; +U_NAMESPACE_BEGIN + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(RuleBasedNumberFormat) + +class LocalizationInfo : public UObject { +protected: + virtual ~LocalizationInfo() {}; + uint32_t refcount; + +public: + LocalizationInfo() : refcount(0) {} + + LocalizationInfo* ref(void) { + ++refcount; + return this; + } + + LocalizationInfo* unref(void) { + if (refcount && --refcount == 0) { + delete this; + } + return NULL; + } + + virtual UBool operator==(const LocalizationInfo* rhs) const; + inline UBool operator!=(const LocalizationInfo* rhs) const { return !operator==(rhs); } + + virtual int32_t getNumberOfRuleSets(void) const = 0; + virtual const UChar* getRuleSetName(int32_t index) const = 0; + virtual int32_t getNumberOfDisplayLocales(void) const = 0; + virtual const UChar* getLocaleName(int32_t index) const = 0; + virtual const UChar* getDisplayName(int32_t localeIndex, int32_t ruleIndex) const = 0; + + virtual int32_t indexForLocale(const UChar* locale) const; + virtual int32_t indexForRuleSet(const UChar* ruleset) const; + + virtual UClassID getDynamicClassID() const = 0; + static UClassID getStaticClassID(void); +}; + +UOBJECT_DEFINE_ABSTRACT_RTTI_IMPLEMENTATION(LocalizationInfo) + +// if both strings are NULL, this returns TRUE +static UBool +streq(const UChar* lhs, const UChar* rhs) { + if (rhs == lhs) { + return TRUE; + } + if (lhs && rhs) { + return u_strcmp(lhs, rhs) == 0; + } + return FALSE; +} + +UBool +LocalizationInfo::operator==(const LocalizationInfo* rhs) const { + if (rhs) { + if (this == rhs) { + return TRUE; + } + + int32_t rsc = getNumberOfRuleSets(); + if (rsc == rhs->getNumberOfRuleSets()) { + for (int i = 0; i < rsc; ++i) { + if (!streq(getRuleSetName(i), rhs->getRuleSetName(i))) { + return FALSE; + } + } + int32_t dlc = getNumberOfDisplayLocales(); + if (dlc == rhs->getNumberOfDisplayLocales()) { + for (int i = 0; i < dlc; ++i) { + const UChar* locale = getLocaleName(i); + int32_t ix = rhs->indexForLocale(locale); + // if no locale, ix is -1, getLocaleName returns null, so streq returns false + if (!streq(locale, rhs->getLocaleName(ix))) { + return FALSE; + } + for (int j = 0; j < rsc; ++j) { + if (!streq(getDisplayName(i, j), rhs->getDisplayName(ix, j))) { + return FALSE; + } + } + } + return TRUE; + } + } + } + return FALSE; +} + +int32_t +LocalizationInfo::indexForLocale(const UChar* locale) const { + for (int i = 0; i < getNumberOfDisplayLocales(); ++i) { + if (streq(locale, getLocaleName(i))) { + return i; + } + } + return -1; +} + +int32_t +LocalizationInfo::indexForRuleSet(const UChar* ruleset) const { + if (ruleset) { + for (int i = 0; i < getNumberOfRuleSets(); ++i) { + if (streq(ruleset, getRuleSetName(i))) { + return i; + } + } + } + return -1; +} + + +typedef void (*Fn_Deleter)(void*); + +class VArray { + void** buf; + int32_t cap; + int32_t size; + Fn_Deleter deleter; +public: + VArray() : buf(NULL), cap(0), size(0), deleter(NULL) {} + + VArray(Fn_Deleter del) : buf(NULL), cap(0), size(0), deleter(del) {} + + ~VArray() { + if (deleter) { + for (int i = 0; i < size; ++i) { + (*deleter)(buf[i]); + } + } + uprv_free(buf); + } + + int32_t length() { + return size; + } + + void add(void* elem, UErrorCode& status) { + if (U_SUCCESS(status)) { + if (size == cap) { + if (cap == 0) { + cap = 1; + } else if (cap < 256) { + cap *= 2; + } else { + cap += 256; + } + if (buf == NULL) { + buf = (void**)uprv_malloc(cap * sizeof(void*)); + } else { + buf = (void**)uprv_realloc(buf, cap * sizeof(void*)); + } + if (buf == NULL) { + // if we couldn't realloc, we leak the memory we've already allocated, but we're in deep trouble anyway + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + void* start = &buf[size]; + size_t count = (cap - size) * sizeof(void*); + uprv_memset(start, 0, count); // fill with nulls, just because + } + buf[size++] = elem; + } + } + + void** release(void) { + void** result = buf; + buf = NULL; + cap = 0; + size = 0; + return result; + } +}; + +class LocDataParser; + +class StringLocalizationInfo : public LocalizationInfo { + UChar* info; + UChar*** data; + int32_t numRuleSets; + int32_t numLocales; + +friend class LocDataParser; + + StringLocalizationInfo(UChar* i, UChar*** d, int32_t numRS, int32_t numLocs) + : info(i), data(d), numRuleSets(numRS), numLocales(numLocs) + { + } + +public: + static StringLocalizationInfo* create(const UnicodeString& info, UParseError& perror, UErrorCode& status); + + virtual ~StringLocalizationInfo(); + virtual int32_t getNumberOfRuleSets(void) const { return numRuleSets; } + virtual const UChar* getRuleSetName(int32_t index) const; + virtual int32_t getNumberOfDisplayLocales(void) const { return numLocales; } + virtual const UChar* getLocaleName(int32_t index) const; + virtual const UChar* getDisplayName(int32_t localeIndex, int32_t ruleIndex) const; + + virtual UClassID getDynamicClassID() const; + static UClassID getStaticClassID(void); + +private: + void init(UErrorCode& status) const; +}; + + +enum { + OPEN_ANGLE = 0x003c, /* '<' */ + CLOSE_ANGLE = 0x003e, /* '>' */ + COMMA = 0x002c, + TICK = 0x0027, + QUOTE = 0x0022, + SPACE = 0x0020 +}; + +/** + * Utility for parsing a localization string and returning a StringLocalizationInfo*. + */ +class LocDataParser { + UChar* data; + const UChar* e; + UChar* p; + UChar ch; + UParseError& pe; + UErrorCode& ec; + +public: + LocDataParser(UParseError& parseError, UErrorCode& status) + : data(NULL), e(NULL), p(NULL), ch(0xffff), pe(parseError), ec(status) {} + ~LocDataParser() {} + + /* + * On a successful parse, return a StringLocalizationInfo*, otherwise delete locData, set perror and status, + * and return NULL. The StringLocalizationInfo will adopt locData if it is created. + */ + StringLocalizationInfo* parse(UChar* data, int32_t len); + +private: + + void inc(void) { ++p; ch = 0xffff; } + UBool checkInc(UChar c) { if (p < e && (ch == c || *p == c)) { inc(); return TRUE; } return FALSE; } + UBool check(UChar c) { return p < e && (ch == c || *p == c); } + void skipWhitespace(void) { while (p < e && uprv_isRuleWhiteSpace(ch != 0xffff ? ch : *p)) inc();} + UBool inList(UChar c, const UChar* list) const { + if (*list == SPACE && uprv_isRuleWhiteSpace(c)) return TRUE; + while (*list && *list != c) ++list; return *list == c; + } + void parseError(const char* msg); + + StringLocalizationInfo* doParse(void); + + UChar** nextArray(int32_t& requiredLength); + UChar* nextString(void); +}; + +#ifdef DEBUG +#define ERROR(msg) parseError(msg); return NULL; +#else +#define ERROR(msg) parseError(NULL); return NULL; +#endif + + +static const UChar DQUOTE_STOPLIST[] = { + QUOTE, 0 +}; + +static const UChar SQUOTE_STOPLIST[] = { + TICK, 0 +}; + +static const UChar NOQUOTE_STOPLIST[] = { + SPACE, COMMA, CLOSE_ANGLE, OPEN_ANGLE, TICK, QUOTE, 0 +}; + +static void +DeleteFn(void* p) { + uprv_free(p); +} + +StringLocalizationInfo* +LocDataParser::parse(UChar* _data, int32_t len) { + if (U_FAILURE(ec)) { + if (_data) uprv_free(_data); + return NULL; + } + + pe.line = 0; + pe.offset = -1; + pe.postContext[0] = 0; + pe.preContext[0] = 0; + + if (_data == NULL) { + ec = U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + + if (len <= 0) { + ec = U_ILLEGAL_ARGUMENT_ERROR; + uprv_free(_data); + return NULL; + } + + data = _data; + e = data + len; + p = _data; + ch = 0xffff; + + return doParse(); +} + + +StringLocalizationInfo* +LocDataParser::doParse(void) { + skipWhitespace(); + if (!checkInc(OPEN_ANGLE)) { + ERROR("Missing open angle"); + } else { + VArray array(DeleteFn); + UBool mightHaveNext = TRUE; + int32_t requiredLength = -1; + while (mightHaveNext) { + mightHaveNext = FALSE; + UChar** elem = nextArray(requiredLength); + skipWhitespace(); + UBool haveComma = check(COMMA); + if (elem) { + array.add(elem, ec); + if (haveComma) { + inc(); + mightHaveNext = TRUE; + } + } else if (haveComma) { + ERROR("Unexpected character"); + } + } + + skipWhitespace(); + if (!checkInc(CLOSE_ANGLE)) { + if (check(OPEN_ANGLE)) { + ERROR("Missing comma in outer array"); + } else { + ERROR("Missing close angle bracket in outer array"); + } + } + + skipWhitespace(); + if (p != e) { + ERROR("Extra text after close of localization data"); + } + + array.add(NULL, ec); + if (U_SUCCESS(ec)) { + int32_t numLocs = array.length() - 2; // subtract first, NULL + UChar*** result = (UChar***)array.release(); + + return new StringLocalizationInfo(data, result, requiredLength-2, numLocs); // subtract first, NULL + } + } + + ERROR("Unknown error"); +} + +UChar** +LocDataParser::nextArray(int32_t& requiredLength) { + if (U_FAILURE(ec)) { + return NULL; + } + + skipWhitespace(); + if (!checkInc(OPEN_ANGLE)) { + ERROR("Missing open angle"); + } + + VArray array; + UBool mightHaveNext = TRUE; + while (mightHaveNext) { + mightHaveNext = FALSE; + UChar* elem = nextString(); + skipWhitespace(); + UBool haveComma = check(COMMA); + if (elem) { + array.add(elem, ec); + if (haveComma) { + inc(); + mightHaveNext = TRUE; + } + } else if (haveComma) { + ERROR("Unexpected comma"); + } + } + skipWhitespace(); + if (!checkInc(CLOSE_ANGLE)) { + if (check(OPEN_ANGLE)) { + ERROR("Missing close angle bracket in inner array"); + } else { + ERROR("Missing comma in inner array"); + } + } + + array.add(NULL, ec); + if (U_SUCCESS(ec)) { + if (requiredLength == -1) { + requiredLength = array.length() + 1; + } else if (array.length() != requiredLength) { + ec = U_ILLEGAL_ARGUMENT_ERROR; + ERROR("Array not of required length"); + } + + return (UChar**)array.release(); + } + ERROR("Unknown Error"); +} + +UChar* +LocDataParser::nextString() { + UChar* result = NULL; + + skipWhitespace(); + if (p < e) { + const UChar* terminators; + UChar c = *p; + UBool haveQuote = c == QUOTE || c == TICK; + if (haveQuote) { + inc(); + terminators = c == QUOTE ? DQUOTE_STOPLIST : SQUOTE_STOPLIST; + } else { + terminators = NOQUOTE_STOPLIST; + } + UChar* start = p; + while (p < e && !inList(*p, terminators)) ++p; + if (p == e) { + ERROR("Unexpected end of data"); + } + + UChar x = *p; + if (p > start) { + ch = x; + *p = 0x0; // terminate by writing to data + result = start; // just point into data + } + if (haveQuote) { + if (x != c) { + ERROR("Missing matching quote"); + } else if (p == start) { + ERROR("Empty string"); + } + inc(); + } else if (x == OPEN_ANGLE || x == TICK || x == QUOTE) { + ERROR("Unexpected character in string"); + } + } + + // ok for there to be no next string + return result; +} + +void +LocDataParser::parseError(const char* /*str*/) { + if (!data) { + return; + } -RuleBasedNumberFormat::RuleBasedNumberFormat(const UnicodeString& description, const Locale& alocale, UParseError& perror, UErrorCode& status) + const UChar* start = p - U_PARSE_CONTEXT_LEN - 1; + if (start < data) + start = data; + for (UChar* x = p; --x >= start;) + if (!*x) { + start = x+1; + break; + } + const UChar* limit = p + U_PARSE_CONTEXT_LEN - 1; + if (limit > e) + limit = e; + u_strncpy(pe.preContext, start, p-start); + pe.preContext[p-start] = 0; + u_strncpy(pe.postContext, p, limit-p); + pe.postContext[limit-p] = 0; + pe.offset = p - data; + +#ifdef DEBUG + fprintf(stderr, "%s at or near character %d: ", str, p-data); + + UnicodeString msg; + msg.append(start, p - start); + msg.append((UChar)0x002f); /* SOLIDUS/SLASH */ + msg.append(p, limit-p); + msg.append("'"); + + char buf[128]; + int32_t len = msg.extract(0, msg.length(), buf, 128); + if (len >= 128) { + buf[127] = 0; + } else { + buf[len] = 0; + } + fprintf(stderr, "%s\n", buf); + fflush(stderr); +#endif + + uprv_free(data); + data = NULL; + p = NULL; + e = NULL; + + if (U_SUCCESS(ec)) { + ec = U_PARSE_ERROR; + } +} + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(StringLocalizationInfo) + +StringLocalizationInfo* +StringLocalizationInfo::create(const UnicodeString& info, UParseError& perror, UErrorCode& status) { + if (U_FAILURE(status)) { + return NULL; + } + + int32_t len = info.length(); + if (len == 0) { + return NULL; // no error; + } + + UChar* p = (UChar*)uprv_malloc(len * sizeof(UChar)); + if (!p) { + status = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + info.extract(p, len, status); + if (!U_FAILURE(status)) { + status = U_ZERO_ERROR; // clear warning about non-termination + } + + LocDataParser parser(perror, status); + return parser.parse(p, len); +} + +StringLocalizationInfo::~StringLocalizationInfo() { + for (UChar*** p = (UChar***)data; *p; ++p) { + // remaining data is simply pointer into our unicode string data. + if (*p) uprv_free(*p); + } + if (data) uprv_free(data); + if (info) uprv_free(info); +} + + +const UChar* +StringLocalizationInfo::getRuleSetName(int32_t index) const { + if (index >= 0 && index < getNumberOfRuleSets()) { + return data[0][index]; + } + return NULL; +} + +const UChar* +StringLocalizationInfo::getLocaleName(int32_t index) const { + if (index >= 0 && index < getNumberOfDisplayLocales()) { + return data[index+1][0]; + } + return NULL; +} + +const UChar* +StringLocalizationInfo::getDisplayName(int32_t localeIndex, int32_t ruleIndex) const { + if (localeIndex >= 0 && localeIndex < getNumberOfDisplayLocales() && + ruleIndex >= 0 && ruleIndex < getNumberOfRuleSets()) { + return data[localeIndex+1][ruleIndex+1]; + } + return NULL; +} + +// ---------- + +RuleBasedNumberFormat::RuleBasedNumberFormat(const UnicodeString& description, + const UnicodeString& locs, + const Locale& alocale, UParseError& perror, UErrorCode& status) : ruleSets(NULL) , defaultRuleSet(NULL) , locale(alocale) @@ -55,8 +639,72 @@ RuleBasedNumberFormat::RuleBasedNumberFormat(const UnicodeString& description, c , decimalFormatSymbols(NULL) , lenient(FALSE) , lenientParseRules(NULL) + , localizations(NULL) +{ + LocalizationInfo* locinfo = StringLocalizationInfo::create(locs, perror, status); + init(description, locinfo, perror, status); +} + +RuleBasedNumberFormat::RuleBasedNumberFormat(const UnicodeString& description, + const UnicodeString& locs, + UParseError& perror, UErrorCode& status) + : ruleSets(NULL) + , defaultRuleSet(NULL) + , locale(Locale::getDefault()) + , collator(NULL) + , decimalFormatSymbols(NULL) + , lenient(FALSE) + , lenientParseRules(NULL) + , localizations(NULL) +{ + LocalizationInfo* locinfo = StringLocalizationInfo::create(locs, perror, status); + init(description, locinfo, perror, status); +} + +RuleBasedNumberFormat::RuleBasedNumberFormat(const UnicodeString& description, + LocalizationInfo* info, + const Locale& alocale, UParseError& perror, UErrorCode& status) + : ruleSets(NULL) + , defaultRuleSet(NULL) + , locale(alocale) + , collator(NULL) + , decimalFormatSymbols(NULL) + , lenient(FALSE) + , lenientParseRules(NULL) + , localizations(NULL) +{ + init(description, info, perror, status); +} + +RuleBasedNumberFormat::RuleBasedNumberFormat(const UnicodeString& description, + UParseError& perror, + UErrorCode& status) + : ruleSets(NULL) + , defaultRuleSet(NULL) + , locale(Locale::getDefault()) + , collator(NULL) + , decimalFormatSymbols(NULL) + , lenient(FALSE) + , lenientParseRules(NULL) + , localizations(NULL) +{ + init(description, NULL, perror, status); +} + +RuleBasedNumberFormat::RuleBasedNumberFormat(const UnicodeString& description, + const Locale& aLocale, + UParseError& perror, + UErrorCode& status) + : ruleSets(NULL) + , defaultRuleSet(NULL) + , locale(aLocale) + , collator(NULL) + , decimalFormatSymbols(NULL) + , lenient(FALSE) + , lenientParseRules(NULL) + , localizations(NULL) { - init(description, perror, status); + init(description, NULL, perror, status); } RuleBasedNumberFormat::RuleBasedNumberFormat(URBNFRuleSetTag tag, const Locale& alocale, UErrorCode& status) @@ -67,6 +715,7 @@ RuleBasedNumberFormat::RuleBasedNumberFormat(URBNFRuleSetTag tag, const Locale& , decimalFormatSymbols(NULL) , lenient(FALSE) , lenientParseRules(NULL) + , localizations(NULL) { if (U_FAILURE(status)) { return; @@ -80,19 +729,19 @@ RuleBasedNumberFormat::RuleBasedNumberFormat(URBNFRuleSetTag tag, const Locale& default: status = U_ILLEGAL_ARGUMENT_ERROR; return; } - // the following didn't work for aliased resources, but Vladimir supposedly fixed it... - // const UChar* description = ures_getStringByKey(nfrb, fmt_tag, &len, &status); + // TODO: read localization info from resource + LocalizationInfo* locinfo = NULL; + int32_t len = 0; - UResourceBundle* nfrb = ures_open(NULL, locale.getName(), &status); - // UResourceBundle* yuck = ures_getByKey(nfrb, fmt_tag, NULL, &status); - // const UChar* description = ures_getString(yuck, &len, &status); - const UChar* description = ures_getStringByKey(nfrb, fmt_tag, &len, &status); + UResourceBundle* nfrb = ures_open(U_ICUDATA_RBNF, locale.getName(), &status); if (U_SUCCESS(status)) { + setLocaleIDs(ures_getLocaleByType(nfrb, ULOC_VALID_LOCALE, &status), + ures_getLocaleByType(nfrb, ULOC_ACTUAL_LOCALE, &status)); + const UChar* description = ures_getStringByKey(nfrb, fmt_tag, &len, &status); UnicodeString desc(description, len); UParseError perror; - init (desc, perror, status); + init (desc, locinfo, perror, status); } - // ures_close(yuck); ures_close(nfrb); } @@ -105,20 +754,25 @@ RuleBasedNumberFormat::RuleBasedNumberFormat(const RuleBasedNumberFormat& rhs) , decimalFormatSymbols(NULL) , lenient(FALSE) , lenientParseRules(NULL) + , localizations(NULL) { this->operator=(rhs); } +// -------- + RuleBasedNumberFormat& RuleBasedNumberFormat::operator=(const RuleBasedNumberFormat& rhs) { UErrorCode status = U_ZERO_ERROR; dispose(); locale = rhs.locale; + lenient = rhs.lenient; + UnicodeString rules = rhs.getRules(); UParseError perror; - init(rules, perror, status); - lenient = rhs.lenient; + init(rules, rhs.localizations ? rhs.localizations->ref() : NULL, perror, status); + return *this; } @@ -134,7 +788,7 @@ RuleBasedNumberFormat::clone(void) const UnicodeString rules = getRules(); UErrorCode status = U_ZERO_ERROR; UParseError perror; - result = new RuleBasedNumberFormat(rules, locale, perror, status); + result = new RuleBasedNumberFormat(rules, localizations, locale, perror, status); /* test for NULL */ if (result == 0) { status = U_MEMORY_ALLOCATION_ERROR; @@ -159,13 +813,18 @@ RuleBasedNumberFormat::operator==(const Format& other) const if (other.getDynamicClassID() == getStaticClassID()) { const RuleBasedNumberFormat& rhs = (const RuleBasedNumberFormat&)other; if (locale == rhs.locale && - lenient == rhs.lenient) { + lenient == rhs.lenient && + (localizations == NULL + ? rhs.localizations == NULL + : (rhs.localizations == NULL + ? FALSE + : *localizations == rhs.localizations))) { + NFRuleSet** p = ruleSets; NFRuleSet** q = rhs.ruleSets; - if ((p == NULL) != (q == NULL)) { - return TRUE; - } if (p == NULL) { + return q == NULL; + } else if (q == NULL) { return FALSE; } while (*p && *q && (**p == **q)) { @@ -194,8 +853,11 @@ RuleBasedNumberFormat::getRules() const UnicodeString RuleBasedNumberFormat::getRuleSetName(int32_t index) const { - UnicodeString result; - if (ruleSets) { + if (localizations) { + UnicodeString string(TRUE, localizations->getRuleSetName(index), (int32_t)-1); + return string; + } else if (ruleSets) { + UnicodeString result; for (NFRuleSet** p = ruleSets; *p; ++p) { NFRuleSet* rs = *p; if (rs->isPublic()) { @@ -206,14 +868,17 @@ RuleBasedNumberFormat::getRuleSetName(int32_t index) const } } } - return result; + UnicodeString empty; + return empty; } int32_t RuleBasedNumberFormat::getNumberOfRuleSetNames() const { int32_t result = 0; - if (ruleSets) { + if (localizations) { + result = localizations->getNumberOfRuleSets(); + } else if (ruleSets) { for (NFRuleSet** p = ruleSets; *p; ++p) { if ((**p).isPublic()) { ++result; @@ -223,6 +888,81 @@ RuleBasedNumberFormat::getNumberOfRuleSetNames() const return result; } +int32_t +RuleBasedNumberFormat::getNumberOfRuleSetDisplayNameLocales(void) const { + if (localizations) { + return localizations->getNumberOfDisplayLocales(); + } + return 0; +} + +Locale +RuleBasedNumberFormat::getRuleSetDisplayNameLocale(int32_t index, UErrorCode& status) const { + if (U_FAILURE(status)) { + return Locale(); + } + if (localizations && index >= 0 && index < localizations->getNumberOfDisplayLocales()) { + UnicodeString name(TRUE, localizations->getLocaleName(index), -1); + char buffer[64]; + int32_t cap = name.length() + 1; + char* bp = buffer; + if (cap > 64) { + bp = (char *)uprv_malloc(cap); + if (bp == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + return Locale(); + } + } + name.extract(0, name.length(), bp, cap, UnicodeString::kInvariant); + Locale retLocale(bp); + if (bp != buffer) { + uprv_free(bp); + } + return retLocale; + } + status = U_ILLEGAL_ARGUMENT_ERROR; + Locale retLocale; + return retLocale; +} + +UnicodeString +RuleBasedNumberFormat::getRuleSetDisplayName(int32_t index, const Locale& localeParam) { + if (localizations && index >= 0 && index < localizations->getNumberOfRuleSets()) { + UnicodeString localeName(localeParam.getBaseName(), -1, UnicodeString::kInvariant); + int32_t len = localeName.length(); + UChar* localeStr = localeName.getBuffer(len + 1); + while (len >= 0) { + localeStr[len] = 0; + int32_t ix = localizations->indexForLocale(localeStr); + if (ix >= 0) { + UnicodeString name(TRUE, localizations->getDisplayName(ix, index), -1); + return name; + } + + // trim trailing portion, skipping over ommitted sections + do { --len;} while (len > 0 && localeStr[len] != 0x005f); // underscore + while (len > 0 && localeStr[len-1] == 0x005F) --len; + } + UnicodeString name(TRUE, localizations->getRuleSetName(index), -1); + return name; + } + UnicodeString bogus; + bogus.setToBogus(); + return bogus; +} + +UnicodeString +RuleBasedNumberFormat::getRuleSetDisplayName(const UnicodeString& ruleSetName, const Locale& localeParam) { + if (localizations) { + UnicodeString rsn(ruleSetName); + int32_t ix = localizations->indexForRuleSet(rsn.getTerminatedBuffer()); + return getRuleSetDisplayName(ix, localeParam); + } + UnicodeString bogus; + bogus.setToBogus(); + return bogus; +} + NFRuleSet* RuleBasedNumberFormat::findRuleSet(const UnicodeString& name, UErrorCode& status) const { @@ -241,7 +981,7 @@ RuleBasedNumberFormat::findRuleSet(const UnicodeString& name, UErrorCode& status UnicodeString& RuleBasedNumberFormat::format(int32_t number, UnicodeString& toAppendTo, - FieldPosition& pos) const + FieldPosition& /* pos */) const { if (defaultRuleSet) defaultRuleSet->format((int64_t)number, toAppendTo, toAppendTo.length()); return toAppendTo; @@ -251,7 +991,7 @@ RuleBasedNumberFormat::format(int32_t number, UnicodeString& RuleBasedNumberFormat::format(int64_t number, UnicodeString& toAppendTo, - FieldPosition& pos) const + FieldPosition& /* pos */) const { if (defaultRuleSet) defaultRuleSet->format(number, toAppendTo, toAppendTo.length()); return toAppendTo; @@ -261,7 +1001,7 @@ RuleBasedNumberFormat::format(int64_t number, UnicodeString& RuleBasedNumberFormat::format(double number, UnicodeString& toAppendTo, - FieldPosition& pos) const + FieldPosition& /* pos */) const { if (defaultRuleSet) defaultRuleSet->format(number, toAppendTo, toAppendTo.length()); return toAppendTo; @@ -272,7 +1012,7 @@ UnicodeString& RuleBasedNumberFormat::format(int32_t number, const UnicodeString& ruleSetName, UnicodeString& toAppendTo, - FieldPosition& pos, + FieldPosition& /* pos */, UErrorCode& status) const { // return format((int64_t)number, ruleSetName, toAppendTo, pos, status); @@ -295,7 +1035,7 @@ UnicodeString& RuleBasedNumberFormat::format(int64_t number, const UnicodeString& ruleSetName, UnicodeString& toAppendTo, - FieldPosition& pos, + FieldPosition& /* pos */, UErrorCode& status) const { if (U_SUCCESS(status)) { @@ -327,7 +1067,7 @@ UnicodeString& RuleBasedNumberFormat::format(double number, const UnicodeString& ruleSetName, UnicodeString& toAppendTo, - FieldPosition& pos, + FieldPosition& /* pos */, UErrorCode& status) const { if (U_SUCCESS(status)) { @@ -354,31 +1094,34 @@ RuleBasedNumberFormat::parse(const UnicodeString& text, return; } - ParsePosition high_pp; + UnicodeString workingText(text, parsePosition.getIndex()); + ParsePosition workingPos(0); + + ParsePosition high_pp(0); Formattable high_result; for (NFRuleSet** p = ruleSets; *p; ++p) { NFRuleSet *rp = *p; if (rp->isPublic()) { - ParsePosition working_pp = parsePosition; + ParsePosition working_pp(0); Formattable working_result; - rp->parse(text, working_pp, kMaxDouble, working_result); + rp->parse(workingText, working_pp, kMaxDouble, working_result); if (working_pp.getIndex() > high_pp.getIndex()) { high_pp = working_pp; high_result = working_result; - if (high_pp.getIndex() == text.length()) { + if (high_pp.getIndex() == workingText.length()) { break; } } } } - if (high_pp.getIndex() > parsePosition.getIndex()) { - high_pp.setErrorIndex(-1); + parsePosition.setIndex(parsePosition.getIndex() + high_pp.getIndex()); + if (high_pp.getIndex() > 0) { + parsePosition.setErrorIndex(-1); } - parsePosition = high_pp; result = high_result; if (result.getType() == Formattable::kDouble) { int32_t r = (int32_t)result.getDouble(); @@ -406,8 +1149,13 @@ void RuleBasedNumberFormat::setDefaultRuleSet(const UnicodeString& ruleSetName, UErrorCode& status) { if (U_SUCCESS(status)) { if (ruleSetName.isEmpty()) { + if (localizations) { + UnicodeString name(TRUE, localizations->getRuleSetName(0), -1); + defaultRuleSet = findRuleSet(name, status); + } else { initDefaultRuleSet(); - } else if (ruleSetName.startsWith("%%")) { + } + } else if (ruleSetName.startsWith(UNICODE_STRING_SIMPLE("%%"))) { status = U_ILLEGAL_ARGUMENT_ERROR; } else { NFRuleSet* result = findRuleSet(ruleSetName, status); @@ -418,13 +1166,26 @@ RuleBasedNumberFormat::setDefaultRuleSet(const UnicodeString& ruleSetName, UErro } } +UnicodeString +RuleBasedNumberFormat::getDefaultRuleSetName() const { + UnicodeString result; + if (defaultRuleSet && defaultRuleSet->isPublic()) { + defaultRuleSet->getName(result); + } else { + result.setToBogus(); + } + return result; +} + void RuleBasedNumberFormat::initDefaultRuleSet() { + defaultRuleSet = NULL; if (!ruleSets) { - defaultRuleSet = NULL; + return; } - NFRuleSet**p = &ruleSets[1]; + + NFRuleSet**p = &ruleSets[0]; while (*p) { ++p; } @@ -442,7 +1203,8 @@ RuleBasedNumberFormat::initDefaultRuleSet() void -RuleBasedNumberFormat::init(const UnicodeString& rules, UParseError& pErr, UErrorCode& status) +RuleBasedNumberFormat::init(const UnicodeString& rules, LocalizationInfo* localizationInfos, + UParseError& /* pErr */, UErrorCode& status) { // TODO: implement UParseError // Note: this can leave ruleSets == NULL, so remaining code should check @@ -450,6 +1212,8 @@ RuleBasedNumberFormat::init(const UnicodeString& rules, UParseError& pErr, UErro return; } + this->localizations = localizationInfos == NULL ? NULL : localizationInfos->ref(); + UnicodeString description(rules); if (!description.length()) { status = U_MEMORY_ALLOCATION_ERROR; @@ -568,7 +1332,11 @@ RuleBasedNumberFormat::init(const UnicodeString& rules, UParseError& pErr, UErro // rather than the first so that a user can create a new formatter // from an existing formatter and change its default behavior just // by appending more rule sets to the end) - initDefaultRuleSet(); + + // {dlf} Initialization of a fraction rule set requires the default rule + // set to be known. For purposes of initialization, this is always the + // last public rule set, no matter what the localization data says. + initDefaultRuleSet(); // finally, we can go back through the temporary descriptions // list and finish seting up the substructure (and we throw @@ -580,6 +1348,30 @@ RuleBasedNumberFormat::init(const UnicodeString& rules, UParseError& pErr, UErro } delete[] ruleSetDescriptions; + + // Now that the rules are initialized, the 'real' default rule + // set can be adjusted by the localization data. + + // The C code keeps the localization array as is, rather than building + // a separate array of the public rule set names, so we have less work + // to do here-- but we still need to check the names. + + if (localizationInfos) { + // confirm the names, if any aren't in the rules, that's an error + // it is ok if the rules contain public rule sets that are not in this list + for (int32_t i = 0; i < localizationInfos->getNumberOfRuleSets(); ++i) { + UnicodeString name(TRUE, localizationInfos->getRuleSetName(i), -1); + NFRuleSet* rs = findRuleSet(name, status); + if (rs == NULL) { + break; // error + } + if (i == 0) { + defaultRuleSet = rs; + } + } + } else { + defaultRuleSet = getDefaultRuleSet(); + } } void @@ -644,6 +1436,8 @@ RuleBasedNumberFormat::dispose() delete lenientParseRules; lenientParseRules = NULL; + + if (localizations) localizations = localizations->unref(); } @@ -730,5 +1524,7 @@ RuleBasedNumberFormat::getDecimalFormatSymbols() const return decimalFormatSymbols; } +U_NAMESPACE_END + /* U_HAVE_RBNF */ #endif diff --git a/icuSources/i18n/rbt.cpp b/icuSources/i18n/rbt.cpp index 1b54056c..a7d26356 100644 --- a/icuSources/i18n/rbt.cpp +++ b/icuSources/i18n/rbt.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -18,16 +18,20 @@ #include "rbt_data.h" #include "rbt_rule.h" #include "rbt.h" +#include "umutex.h" U_NAMESPACE_BEGIN -const char RuleBasedTransliterator::fgClassID = 0; // Value is irrelevant +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(RuleBasedTransliterator) + +static UMTX transliteratorDataMutex = NULL; +static Replaceable *gLockedText = NULL; void RuleBasedTransliterator::_construct(const UnicodeString& rules, UTransDirection direction, UParseError& parseError, UErrorCode& status) { - data = 0; + fData = 0; isDataOwned = TRUE; if (U_FAILURE(status)) { return; @@ -45,17 +49,99 @@ void RuleBasedTransliterator::_construct(const UnicodeString& rules, return; } - data = parser.orphanData(); - setMaximumContextLength(data->ruleSet.getMaximumContextLength()); + fData = parser.orphanData(); + setMaximumContextLength(fData->ruleSet.getMaximumContextLength()); +} + +/** + * Constructs a new transliterator from the given rules. + * @param id the id for the transliterator. + * @param rules rules, separated by ';' + * @param direction either FORWARD or REVERSE. + * @param adoptedFilter the filter for this transliterator. + * @param parseError Struct to recieve information on position + * of error if an error is encountered + * @param status Output param set to success/failure code. + * @exception IllegalArgumentException if rules are malformed + * or direction is invalid. + */ +RuleBasedTransliterator::RuleBasedTransliterator( + const UnicodeString& id, + const UnicodeString& rules, + UTransDirection direction, + UnicodeFilter* adoptedFilter, + UParseError& parseError, + UErrorCode& status) : + Transliterator(id, adoptedFilter) { + _construct(rules, direction,parseError,status); +} + +/** + * Constructs a new transliterator from the given rules. + * @param id the id for the transliterator. + * @param rules rules, separated by ';' + * @param direction either FORWARD or REVERSE. + * @param adoptedFilter the filter for this transliterator. + * @param status Output param set to success/failure code. + * @exception IllegalArgumentException if rules are malformed + * or direction is invalid. + */ +RuleBasedTransliterator::RuleBasedTransliterator( + const UnicodeString& id, + const UnicodeString& rules, + UTransDirection direction, + UnicodeFilter* adoptedFilter, + UErrorCode& status) : + Transliterator(id, adoptedFilter) { + UParseError parseError; + _construct(rules, direction,parseError, status); +} + +/** + * Covenience constructor with no filter. + */ +RuleBasedTransliterator::RuleBasedTransliterator( + const UnicodeString& id, + const UnicodeString& rules, + UTransDirection direction, + UErrorCode& status) : + Transliterator(id, 0) { + UParseError parseError; + _construct(rules, direction,parseError, status); +} + +/** + * Covenience constructor with no filter and FORWARD direction. + */ +RuleBasedTransliterator::RuleBasedTransliterator( + const UnicodeString& id, + const UnicodeString& rules, + UErrorCode& status) : + Transliterator(id, 0) { + UParseError parseError; + _construct(rules, UTRANS_FORWARD, parseError, status); +} + +/** + * Covenience constructor with FORWARD direction. + */ +RuleBasedTransliterator::RuleBasedTransliterator( + const UnicodeString& id, + const UnicodeString& rules, + UnicodeFilter* adoptedFilter, + UErrorCode& status) : + Transliterator(id, adoptedFilter) { + UParseError parseError; + _construct(rules, UTRANS_FORWARD,parseError, status); } RuleBasedTransliterator::RuleBasedTransliterator(const UnicodeString& id, const TransliterationRuleData* theData, UnicodeFilter* adoptedFilter) : Transliterator(id, adoptedFilter), - data((TransliterationRuleData*)theData), // cast away const + fData((TransliterationRuleData*)theData), // cast away const isDataOwned(FALSE) { - setMaximumContextLength(data->ruleSet.getMaximumContextLength()); + setMaximumContextLength(fData->ruleSet.getMaximumContextLength()); } /** @@ -65,9 +151,9 @@ RuleBasedTransliterator::RuleBasedTransliterator(const UnicodeString& id, TransliterationRuleData* theData, UBool isDataAdopted) : Transliterator(id, 0), - data(theData), + fData(theData), isDataOwned(isDataAdopted) { - setMaximumContextLength(data->ruleSet.getMaximumContextLength()); + setMaximumContextLength(fData->ruleSet.getMaximumContextLength()); } /** @@ -75,7 +161,7 @@ RuleBasedTransliterator::RuleBasedTransliterator(const UnicodeString& id, */ RuleBasedTransliterator::RuleBasedTransliterator( const RuleBasedTransliterator& other) : - Transliterator(other), data(other.data), + Transliterator(other), fData(other.fData), isDataOwned(other.isDataOwned) { // The data object may or may not be owned. If it is not owned we @@ -88,7 +174,7 @@ RuleBasedTransliterator::RuleBasedTransliterator( // will be later deleted. System transliterators contain // non-owned data. if (isDataOwned) { - data = new TransliterationRuleData(*other.data); + fData = new TransliterationRuleData(*other.fData); } } @@ -98,7 +184,7 @@ RuleBasedTransliterator::RuleBasedTransliterator( RuleBasedTransliterator::~RuleBasedTransliterator() { // Delete the data object only if we own it. if (isDataOwned) { - delete data; + delete fData; } } @@ -145,30 +231,61 @@ RuleBasedTransliterator::handleTransliterate(Replaceable& text, UTransPosition& loopLimit <<= 4; } + // Transliterator locking. Rule-based Transliterators are not thread safe; concurrent + // operations must be prevented. + // A Complication: compound transliterators can result in recursive entries to this + // function, sometimes with different "This" objects, always with the same text. + // Double-locking must be prevented in these cases. + // + + // If the transliteration data is exclusively owned by this transliterator object, + // we don't need to do any locking. No sharing between transliterators is possible, + // so no concurrent access from multiple threads is possible. + UBool lockedMutexAtThisLevel = FALSE; + if (isDataOwned == FALSE) { + umtx_lock(NULL); + // Test whether this request is operating on the same text string as some + // some other transliteration that is still in progress and holding the + // transliteration mutex. If so, do not lock the transliteration + // mutex again. + UBool needToLock = (&text != gLockedText); + umtx_unlock(NULL); + if (needToLock) { + umtx_lock(&transliteratorDataMutex); + gLockedText = &text; + lockedMutexAtThisLevel = TRUE; + } + } + + while (index.start < index.limit && loopCount <= loopLimit && - data->ruleSet.transliterate(text, index, isIncremental)) { + fData->ruleSet.transliterate(text, index, isIncremental)) { ++loopCount; } + if (lockedMutexAtThisLevel) { + gLockedText = NULL; + umtx_unlock(&transliteratorDataMutex); + } } UnicodeString& RuleBasedTransliterator::toRules(UnicodeString& rulesSource, UBool escapeUnprintable) const { - return data->ruleSet.toRules(rulesSource, escapeUnprintable); + return fData->ruleSet.toRules(rulesSource, escapeUnprintable); } /** * Implement Transliterator framework */ void RuleBasedTransliterator::handleGetSourceSet(UnicodeSet& result) const { - data->ruleSet.getSourceTargetSet(result, FALSE); + fData->ruleSet.getSourceTargetSet(result, FALSE); } /** * Override Transliterator framework */ UnicodeSet& RuleBasedTransliterator::getTargetSet(UnicodeSet& result) const { - return data->ruleSet.getSourceTargetSet(result, TRUE); + return fData->ruleSet.getSourceTargetSet(result, TRUE); } U_NAMESPACE_END diff --git a/icuSources/i18n/rbt.h b/icuSources/i18n/rbt.h index db5405f0..9d17c146 100644 --- a/icuSources/i18n/rbt.h +++ b/icuSources/i18n/rbt.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -17,6 +17,9 @@ #include "unicode/translit.h" #include "unicode/utypes.h" #include "unicode/parseerr.h" +#include "unicode/udata.h" + +#define U_ICUDATA_TRANSLIT U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "translit" U_NAMESPACE_BEGIN @@ -284,12 +287,13 @@ class TransliterationRuleData; * @internal Use transliterator factory methods instead since this class will be removed in that release. */ class U_I18N_API RuleBasedTransliterator : public Transliterator { - +private: /** * The data object is immutable, so we can freely share it with * other instances of RBT, as long as we do NOT own this object. + * TODO: data is no longer immutable. See bugs #1866, 2155 */ - TransliterationRuleData* data; + TransliterationRuleData* fData; /** * If true, we own the data object and must delete it. @@ -350,7 +354,7 @@ public: const UnicodeString& rules, UnicodeFilter* adoptedFilter, UErrorCode& status); - private: +private: friend class TransliteratorRegistry; // to access TransliterationRuleData convenience ctor /** @@ -376,7 +380,7 @@ public: TransliterationRuleData* data, UBool isDataAdopted); - public: +public: /** * Copy constructor. @@ -390,9 +394,9 @@ public: * Implement Transliterator API. * @internal Use transliterator factory methods instead since this class will be removed in that release. */ - Transliterator* clone(void) const; + virtual Transliterator* clone(void) const; - protected: +protected: /** * Implements {@link Transliterator#handleTransliterate}. * @internal Use transliterator factory methods instead since this class will be removed in that release. @@ -400,7 +404,7 @@ public: virtual void handleTransliterate(Replaceable& text, UTransPosition& offsets, UBool isIncremental) const; - public: +public: /** * Return a representation of this transliterator as source rules. * These rules will produce an equivalent transliterator if used @@ -416,13 +420,13 @@ public: virtual UnicodeString& toRules(UnicodeString& result, UBool escapeUnprintable) const; - protected: +protected: /** * Implement Transliterator framework */ virtual void handleGetSourceSet(UnicodeSet& result) const; - public: +public: /** * Override Transliterator framework */ @@ -439,7 +443,7 @@ public: * @return The class ID for all objects of this class. * @internal Use transliterator factory methods instead since this class will be removed in that release. */ - static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; } + static UClassID U_EXPORT2 getStaticClassID(void); /** * Returns a unique class ID polymorphically. This method @@ -447,118 +451,20 @@ public: * compilers support genuine RTTI. Polymorphic operator==() and * clone() methods call this method. * - *

    Concrete subclasses of Transliterator that wish clients to - * be able to identify them should implement getDynamicClassID() - * and also a static method and data member: - * - *

    -     * static UClassID getStaticClassID() { return (UClassID)&fgClassID; }
    -     * static char fgClassID;
    -     * 
    - * - * Subclasses that do not implement this method will have a - * dynamic class ID of Transliterator::getStatisClassID(). - * * @return The class ID for this object. All objects of a given * class have the same class ID. Objects of other classes have * different class IDs. */ - virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); }; + virtual UClassID getDynamicClassID(void) const; private: - /** - * Class identifier for RuleBasedTransliterator. - */ - static const char fgClassID; - void _construct(const UnicodeString& rules, UTransDirection direction, UParseError& parseError, UErrorCode& status); }; -/** - * Constructs a new transliterator from the given rules. - * @param id the id for the transliterator. - * @param rules rules, separated by ';' - * @param direction either FORWARD or REVERSE. - * @param adoptedFilter the filter for this transliterator. - * @param parseError Struct to recieve information on position - * of error if an error is encountered - * @param status Output param set to success/failure code. - * @exception IllegalArgumentException if rules are malformed - * or direction is invalid. - */ -inline RuleBasedTransliterator::RuleBasedTransliterator( - const UnicodeString& id, - const UnicodeString& rules, - UTransDirection direction, - UnicodeFilter* adoptedFilter, - UParseError& parseError, - UErrorCode& status) : - Transliterator(id, adoptedFilter) { - _construct(rules, direction,parseError,status); -} - -/** - * Constructs a new transliterator from the given rules. - * @param id the id for the transliterator. - * @param rules rules, separated by ';' - * @param direction either FORWARD or REVERSE. - * @param adoptedFilter the filter for this transliterator. - * @param status Output param set to success/failure code. - * @exception IllegalArgumentException if rules are malformed - * or direction is invalid. - */ -inline RuleBasedTransliterator::RuleBasedTransliterator( - const UnicodeString& id, - const UnicodeString& rules, - UTransDirection direction, - UnicodeFilter* adoptedFilter, - UErrorCode& status) : - Transliterator(id, adoptedFilter) { - UParseError parseError; - _construct(rules, direction,parseError, status); -} - -/** - * Covenience constructor with no filter. - */ -inline RuleBasedTransliterator::RuleBasedTransliterator( - const UnicodeString& id, - const UnicodeString& rules, - UTransDirection direction, - UErrorCode& status) : - Transliterator(id, 0) { - UParseError parseError; - _construct(rules, direction,parseError, status); -} - -/** - * Covenience constructor with no filter and FORWARD direction. - */ -inline RuleBasedTransliterator::RuleBasedTransliterator( - const UnicodeString& id, - const UnicodeString& rules, - UErrorCode& status) : - Transliterator(id, 0) { - UParseError parseError; - _construct(rules, UTRANS_FORWARD, parseError, status); -} - -/** - * Covenience constructor with FORWARD direction. - */ -inline RuleBasedTransliterator::RuleBasedTransliterator( - const UnicodeString& id, - const UnicodeString& rules, - UnicodeFilter* adoptedFilter, - UErrorCode& status) : - Transliterator(id, adoptedFilter) { - UParseError parseError; - _construct(rules, UTRANS_FORWARD,parseError, status); -} U_NAMESPACE_END diff --git a/icuSources/i18n/rbt_data.cpp b/icuSources/i18n/rbt_data.cpp index 42fa1ab9..7902cbe4 100644 --- a/icuSources/i18n/rbt_data.cpp +++ b/icuSources/i18n/rbt_data.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -9,6 +9,7 @@ */ #include "unicode/utypes.h" +#include "umutex.h" #if !UCONFIG_NO_TRANSLITERATION @@ -103,6 +104,7 @@ TransliterationRuleData::lookupReplacer(UChar32 standIn) const { return (f != 0) ? f->toReplacer() : 0; } + U_NAMESPACE_END #endif /* #if !UCONFIG_NO_TRANSLITERATION */ diff --git a/icuSources/i18n/rbt_data.h b/icuSources/i18n/rbt_data.h index 9ceaf812..9da86890 100644 --- a/icuSources/i18n/rbt_data.h +++ b/icuSources/i18n/rbt_data.h @@ -1,5 +1,5 @@ /* -* Copyright (C) {1999}, International Business Machines Corporation and others. All Rights Reserved. +* Copyright (C) 1999-2004, International Business Machines Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description * 11/17/99 aliu Creation. @@ -9,6 +9,7 @@ #define RBT_DATA_H #include "unicode/utypes.h" +#include "unicode/uclean.h" #if !UCONFIG_NO_TRANSLITERATION @@ -129,6 +130,7 @@ public: */ UnicodeReplacer* lookupReplacer(UChar32 standIn) const; + private: TransliterationRuleData &operator=(const TransliterationRuleData &other); // forbid copying of this class }; diff --git a/icuSources/i18n/rbt_pars.cpp b/icuSources/i18n/rbt_pars.cpp index 8f599198..61177a27 100644 --- a/icuSources/i18n/rbt_pars.cpp +++ b/icuSources/i18n/rbt_pars.cpp @@ -1,12 +1,12 @@ /* -********************************************************************** -* Copyright (C) 1999-2003, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -* Date Name Description -* 11/17/99 aliu Creation. -********************************************************************** -*/ + ********************************************************************** + * Copyright (C) 1999-2004, International Business Machines + * Corporation and others. All Rights Reserved. + ********************************************************************** + * Date Name Description + * 11/17/99 aliu Creation. + ********************************************************************** + */ #include "unicode/utypes.h" @@ -29,12 +29,13 @@ #include "rbt_rule.h" #include "strmatch.h" #include "strrepl.h" -#include "symtable.h" +#include "unicode/symtable.h" #include "tridpars.h" #include "uvector.h" #include "util.h" #include "cmemory.h" #include "uprops.h" +#include "putilimp.h" // Operators #define VARIABLE_DEF_OP ((UChar)0x003D) /*=*/ @@ -953,7 +954,7 @@ void TransliteratorParser::parseRules(const UnicodeString& rule, int32_t p = pos; TransliteratorIDParser::SingleID* id = - TransliteratorIDParser::parseSingleID(rule, p, direction); + TransliteratorIDParser::parseSingleID(rule, p, direction, status); if (p != pos && ICU_Utility::parseChar(rule, p, END_OF_RULE)) { // Successful ::ID parse. @@ -1093,7 +1094,7 @@ UBool TransliteratorParser::checkVariableRange(UChar32 ch) const { * Set the maximum backup to 'backup', in response to a pragma * statement. */ -void TransliteratorParser::pragmaMaximumBackup(int32_t backup) { +void TransliteratorParser::pragmaMaximumBackup(int32_t /*backup*/) { //TODO Finish } @@ -1101,7 +1102,7 @@ void TransliteratorParser::pragmaMaximumBackup(int32_t backup) { * Begin normalizing all rules using the given mode, in response * to a pragma statement. */ -void TransliteratorParser::pragmaNormalizeRules(UNormalizationMode mode) { +void TransliteratorParser::pragmaNormalizeRules(UNormalizationMode /*mode*/) { //TODO Finish } @@ -1417,7 +1418,7 @@ int32_t TransliteratorParser::syntaxError(UErrorCode parseErrorCode, */ UChar TransliteratorParser::parseSet(const UnicodeString& rule, ParsePosition& pos) { - UnicodeSet* set = new UnicodeSet(rule, pos, *parseData, status); + UnicodeSet* set = new UnicodeSet(rule, pos, USET_IGNORE_SPACE, parseData, status); set->compact(); return generateStandInFor(set); } diff --git a/icuSources/i18n/rbt_rule.cpp b/icuSources/i18n/rbt_rule.cpp index cf1c06af..bf16248c 100644 --- a/icuSources/i18n/rbt_rule.cpp +++ b/icuSources/i18n/rbt_rule.cpp @@ -1,12 +1,12 @@ /* -********************************************************************** -* Copyright (C) 1999-2001, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -* Date Name Description -* 11/17/99 aliu Creation. -********************************************************************** -*/ + ********************************************************************** + * Copyright (C) 1999-2004, International Business Machines + * Corporation and others. All Rights Reserved. + ********************************************************************** + * Date Name Description + * 11/17/99 aliu Creation. + ********************************************************************** + */ #include "unicode/utypes.h" @@ -21,6 +21,7 @@ #include "strmatch.h" #include "strrepl.h" #include "util.h" +#include "putilimp.h" static const UChar FORWARD_OP[] = {32,62,32,0}; // " > " @@ -528,14 +529,14 @@ void TransliterationRule::setData(const TransliterationRuleData* d) { void TransliterationRule::addSourceSetTo(UnicodeSet& toUnionTo) const { int32_t limit = anteContextLength + keyLength; for (int32_t i=anteContextLength; ilookupMatcher(ch); - if (matcher == NULL) { - toUnionTo.add(ch); - } else { - matcher->addMatchSetTo(toUnionTo); - } + UChar32 ch = pattern.char32At(i); + i += UTF_CHAR_LENGTH(ch); + const UnicodeMatcher* matcher = data->lookupMatcher(ch); + if (matcher == NULL) { + toUnionTo.add(ch); + } else { + matcher->addMatchSetTo(toUnionTo); + } } } diff --git a/icuSources/i18n/rbt_set.cpp b/icuSources/i18n/rbt_set.cpp index 2d637065..0999cc21 100644 --- a/icuSources/i18n/rbt_set.cpp +++ b/icuSources/i18n/rbt_set.cpp @@ -1,12 +1,12 @@ /* -********************************************************************** -* Copyright (C) 1999, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -* Date Name Description -* 11/17/99 aliu Creation. -********************************************************************** -*/ + ********************************************************************** + * Copyright (C) 1999-2004, International Business Machines + * Corporation and others. All Rights Reserved. + ********************************************************************** + * Date Name Description + * 11/17/99 aliu Creation. + ********************************************************************** + */ #include "unicode/utypes.h" @@ -17,6 +17,7 @@ #include "rbt_set.h" #include "rbt_rule.h" #include "cmemory.h" +#include "putilimp.h" U_CDECL_BEGIN static void U_EXPORT2 U_CALLCONV _deleteRule(void *rule) { @@ -433,17 +434,17 @@ UnicodeString& TransliterationRuleSet::toRules(UnicodeString& ruleSource, * (getTarget=false) or emitted (getTarget=true) by this set. */ UnicodeSet& TransliterationRuleSet::getSourceTargetSet(UnicodeSet& result, - UBool getTarget) const { + UBool getTarget) const { result.clear(); int32_t count = ruleVector->size(); for (int32_t i=0; ielementAt(i); - if (getTarget) { - r->addTargetSetTo(result); - } else { - r->addSourceSetTo(result); - } + TransliterationRule* r = + (TransliterationRule*) ruleVector->elementAt(i); + if (getTarget) { + r->addTargetSetTo(result); + } else { + r->addSourceSetTo(result); + } } return result; } diff --git a/icuSources/i18n/rbt_set.h b/icuSources/i18n/rbt_set.h index 3a7c5d21..45ce7c1e 100644 --- a/icuSources/i18n/rbt_set.h +++ b/icuSources/i18n/rbt_set.h @@ -149,7 +149,7 @@ public: * (getTarget=false) or emitted (getTarget=true) by this set. */ UnicodeSet& getSourceTargetSet(UnicodeSet& result, - UBool getTarget) const; + UBool getTarget) const; private: diff --git a/icuSources/i18n/regexcmp.cpp b/icuSources/i18n/regexcmp.cpp index 8611f702..f126adb4 100644 --- a/icuSources/i18n/regexcmp.cpp +++ b/icuSources/i18n/regexcmp.cpp @@ -2,7 +2,7 @@ // // file: regexcmp.cpp // -// Copyright (C) 2002-2003 International Business Machines Corporation and others. +// Copyright (C) 2002-2004 International Business Machines Corporation and others. // All Rights Reserved. // // This file contains the ICU regular expression compiler, which is responsible @@ -21,7 +21,7 @@ #include "unicode/parsepos.h" #include "unicode/parseerr.h" #include "unicode/regex.h" -#include "uprops.h" +#include "util.h" #include "cmemory.h" #include "cstring.h" #include "uvectr32.h" @@ -82,19 +82,6 @@ RegexCompile::RegexCompile(RegexPattern *rxp, UErrorCode &status) : fParenStack( RegexCompile::~RegexCompile() { } - - -//---------------------------------------------------------------------------------------- -// -// cleanup. Called (indirectly) by u_cleanup to free all cached memory -// -//---------------------------------------------------------------------------------------- -void RegexCompile::cleanup() { - delete RegexStaticSets::gStaticSets; - RegexStaticSets::gStaticSets = NULL; -} - - //--------------------------------------------------------------------------------- // // Compile regex pattern. The state machine for rexexp pattern parsing is here. @@ -159,12 +146,12 @@ void RegexCompile::compile( // the search will stop there, if not before. // tableEl = &gRuleParseStateTable[state]; - REGEX_SCAN_DEBUG_PRINTF( "char, line, col = (\'%c\', %d, %d) state=%s ", - fC.fChar, fLineNum, fCharNum, RegexStateNames[state]); + REGEX_SCAN_DEBUG_PRINTF(("char, line, col = (\'%c\', %d, %d) state=%s ", + fC.fChar, fLineNum, fCharNum, RegexStateNames[state])); for (;;) { // loop through table rows belonging to this state, looking for one // that matches the current input char. - REGEX_SCAN_DEBUG_PRINTF( "."); + REGEX_SCAN_DEBUG_PRINTF((".")); if (tableEl->fCharClass < 127 && fC.fQuoted == FALSE && tableEl->fCharClass == fC.fChar) { // Table row specified an individual character, not a set, and // the input character is not quoted, and @@ -198,7 +185,7 @@ void RegexCompile::compile( // No match on this row, advance to the next row for this state, tableEl++; } - REGEX_SCAN_DEBUG_PRINTF("\n"); + REGEX_SCAN_DEBUG_PRINTF(("\n")); // // We've found the row of the state table that matches the current input @@ -215,7 +202,7 @@ void RegexCompile::compile( fStackPtr++; if (fStackPtr >= kStackSize) { error(U_REGEX_INTERNAL_ERROR); - REGEX_SCAN_DEBUG_PRINTF( "RegexCompile::parse() - state stack overflow.\n"); + REGEX_SCAN_DEBUG_PRINTF(("RegexCompile::parse() - state stack overflow.\n")); fStackPtr--; } fStack[fStackPtr] = tableEl->fPushState; @@ -318,19 +305,6 @@ void RegexCompile::compile( fRXPat->fSets8[i].init(s); } - // - // A stupid bit of non-sense to prevent code coverage testing from complaining - // about the pattern.dump() debug function. Go through the motions of dumping, - // even though, without the #define set, it will do nothing. - // -#ifndef REGEX_DUMP_DEBUG - static UBool phonyDumpDone = FALSE; - if (phonyDumpDone==FALSE) { - fRXPat->dump(); - phonyDumpDone = TRUE; - } -#endif - } @@ -988,7 +962,7 @@ UBool RegexCompile::doParseActions(EParseAction action) int32_t digitValue = u_charDigitValue(fC.fChar); U_ASSERT(digitValue >= 0); fIntervalUpper = fIntervalUpper*10 + digitValue; - if (fIntervalLow < 0) { + if (fIntervalUpper < 0) { error(U_REGEX_NUMBER_TOO_BIG); } } @@ -1089,11 +1063,27 @@ UBool RegexCompile::doParseActions(EParseAction action) break; case doBackslashB: - fRXPat->fCompiledPat->addElement(URX_BUILD(URX_BACKSLASH_B, 1), *fStatus); + { + #if UCONFIG_NO_BREAK_ITERATION==1 + if (fModeFlags & UREGEX_UWORD) { + error(U_UNSUPPORTED_ERROR); + } + #endif + int32_t op = (fModeFlags & UREGEX_UWORD)? URX_BACKSLASH_BU : URX_BACKSLASH_B; + fRXPat->fCompiledPat->addElement(URX_BUILD(op, 1), *fStatus); + } break; case doBackslashb: - fRXPat->fCompiledPat->addElement(URX_BUILD(URX_BACKSLASH_B, 0), *fStatus); + { + #if UCONFIG_NO_BREAK_ITERATION==1 + if (fModeFlags & UREGEX_UWORD) { + error(U_UNSUPPORTED_ERROR); + } + #endif + int32_t op = (fModeFlags & UREGEX_UWORD)? URX_BACKSLASH_BU : URX_BACKSLASH_B; + fRXPat->fCompiledPat->addElement(URX_BUILD(op, 0), *fStatus); + } break; case doBackslashD: @@ -1197,7 +1187,7 @@ UBool RegexCompile::doParseActions(EParseAction action) // the compiled code for it. // Because capture groups can be forward-referenced by back-references, // we fill the operand with the capture group number. At the end - // of compilation, it will be changed to the variables location. + // of compilation, it will be changed to the variable's location. U_ASSERT(groupNum > 0); int32_t op; if (fModeFlags & UREGEX_CASE_INSENSITIVE) { @@ -1210,12 +1200,6 @@ UBool RegexCompile::doParseActions(EParseAction action) break; - case doOctal: - error(U_REGEX_UNIMPLEMENTED); - break; - - - case doPossessivePlus: // Possessive ++ quantifier. // Compiles to @@ -1331,6 +1315,7 @@ UBool RegexCompile::doParseActions(EParseAction action) case 0x69: /* 'i' */ bit = UREGEX_CASE_INSENSITIVE; break; case 0x6d: /* 'm' */ bit = UREGEX_MULTILINE; break; case 0x73: /* 's' */ bit = UREGEX_DOTALL; break; + case 0x77: /* 'w' */ bit = UREGEX_UWORD; break; case 0x78: /* 'x' */ bit = UREGEX_COMMENTS; break; case 0x2d: /* '-' */ fSetModeFlag = FALSE; break; default: @@ -1382,6 +1367,10 @@ UBool RegexCompile::doParseActions(EParseAction action) } break; + case doBadModeFlag: + error(U_REGEX_INVALID_FLAG); + break; + case doSuppressComments: // We have just scanned a '(?'. We now need to prevent the character scanner from // treating a '#' as a to-the-end-of-line comment. @@ -1672,8 +1661,7 @@ int32_t RegexCompile::blockTopLoc(UBool reserveLoc) { // The item just processed is a parenthesized block. theLoc = fMatchOpenParen; // A slot is already reserved for us. U_ASSERT(theLoc > 0); - uint32_t opAtTheLoc = fRXPat->fCompiledPat->elementAti(theLoc); - U_ASSERT(URX_TYPE(opAtTheLoc) == URX_NOP); + U_ASSERT(URX_TYPE(((uint32_t)fRXPat->fCompiledPat->elementAti(theLoc))) == URX_NOP); } else { // Item just compiled is a single thing, a ".", or a single char, or a set reference. @@ -1682,7 +1670,7 @@ int32_t RegexCompile::blockTopLoc(UBool reserveLoc) { fixLiterals(TRUE); // If last item was a string, separate the last char. theLoc = fRXPat->fCompiledPat->size()-1; if (reserveLoc) { - int32_t opAtTheLoc = fRXPat->fCompiledPat->elementAti(theLoc); + /*int32_t opAtTheLoc = fRXPat->fCompiledPat->elementAti(theLoc);*/ int32_t nop = URX_BUILD(URX_NOP, 0); fRXPat->fCompiledPat->insertElementAt(nop, theLoc, *fStatus); } @@ -1992,12 +1980,14 @@ void RegexCompile::compileInterval(int32_t InitOp, int32_t LoopOp) op = URX_BUILD(LoopOp, topOfBlock); fRXPat->fCompiledPat->addElement(op, *fStatus); + if ((fIntervalLow & 0xff000000) != 0 || + fIntervalUpper > 0 && (fIntervalUpper & 0xff000000) != 0) { + error(U_REGEX_NUMBER_TOO_BIG); + } + if (fIntervalLow > fIntervalUpper && fIntervalUpper != -1) { error(U_REGEX_MAX_LT_MIN); } - - - } @@ -2121,6 +2111,7 @@ void RegexCompile::matchStartType() { case URX_START_CAPTURE: case URX_END_CAPTURE: case URX_BACKSLASH_B: + case URX_BACKSLASH_BU: case URX_BACKSLASH_G: case URX_BACKSLASH_Z: case URX_DOLLAR: @@ -2398,10 +2389,15 @@ void RegexCompile::matchStartType() { loopEndLoc = URX_VAL(loopEndLoc); int32_t minLoopCount = fRXPat->fCompiledPat->elementAti(loc+2); if (minLoopCount == 0) { - loc = loopEndLoc; - } else { - loc+=3; // Skips over operands of CTR_INIT - } + // Min Loop Count of 0, treat like a forward branch and + // move the current minimum length up to the target + // (end of loop) location. + U_ASSERT(loopEndLoc <= end+1); + if (forwardedLength.elementAti(loopEndLoc) > currentLen) { + forwardedLength.setElementAt(currentLen, loopEndLoc); + } + } + loc+=3; // Skips over operands of CTR_INIT } atStart = FALSE; break; @@ -2499,7 +2495,7 @@ void RegexCompile::matchStartType() { fRXPat->fStartType = START_STRING; fRXPat->fInitialChar = c; } else if (fRXPat->fStartType == START_LINE) { - // Match at start of line in Mulit-Line mode. + // Match at start of line in Multi-Line mode. // Nothing to do here; everything is already set. } else if (fRXPat->fMinMatchLen == 0) { // Zero length match possible. We could start anywhere. @@ -2586,6 +2582,7 @@ int32_t RegexCompile::minMatchLength(int32_t start, int32_t end) { case URX_START_CAPTURE: case URX_END_CAPTURE: case URX_BACKSLASH_B: + case URX_BACKSLASH_BU: case URX_BACKSLASH_G: case URX_BACKSLASH_Z: case URX_CARET: @@ -2825,6 +2822,7 @@ int32_t RegexCompile::maxMatchLength(int32_t start, int32_t end) { case URX_START_CAPTURE: case URX_END_CAPTURE: case URX_BACKSLASH_B: + case URX_BACKSLASH_BU: case URX_BACKSLASH_G: case URX_BACKSLASH_Z: case URX_CARET: @@ -3078,6 +3076,7 @@ void RegexCompile::stripNOPs() { case URX_DOTANY: case URX_FAIL: case URX_BACKSLASH_B: + case URX_BACKSLASH_BU: case URX_BACKSLASH_G: case URX_BACKSLASH_X: case URX_BACKSLASH_Z: @@ -3445,11 +3444,11 @@ UnicodeSet *RegexCompile::scanSet() { } uset = new UnicodeSet(fRXPat->fPattern, pos, - usetFlags, localStatus); + usetFlags, NULL, localStatus); if (U_FAILURE(localStatus)) { // TODO: Get more accurate position of the error from UnicodeSet's return info. // UnicodeSet appears to not be reporting correctly at this time. - REGEX_SCAN_DEBUG_PRINTF( "UnicodeSet parse postion.ErrorIndex = %d\n", pos.getIndex()); + REGEX_SCAN_DEBUG_PRINTF(("UnicodeSet parse postion.ErrorIndex = %d\n", pos.getIndex())); error(localStatus); delete uset; return NULL; @@ -3518,7 +3517,7 @@ UnicodeSet *RegexCompile::scanProp() { } // Build the UnicodeSet from the set pattern we just built up in a string. - uset = new UnicodeSet(setPattern, usetFlags, *fStatus); + uset = new UnicodeSet(setPattern, usetFlags, NULL, *fStatus); if (U_FAILURE(*fStatus)) { delete uset; uset = NULL; diff --git a/icuSources/i18n/regexcst.h b/icuSources/i18n/regexcst.h index 8847c468..6cca8453 100644 --- a/icuSources/i18n/regexcst.h +++ b/icuSources/i18n/regexcst.h @@ -32,7 +32,6 @@ enum Regex_PatternParseAction { doRuleError, doIntevalLowerDigit, doBackslashs, - doOctal, doNGOpt, doBackslashw, doMismatchedParenErr, @@ -80,6 +79,7 @@ enum Regex_PatternParseAction { doExit, doNGInterval, doPatStart, + doBadModeFlag, doBackslashb, doPossessiveStar, doBackslashd, @@ -112,15 +112,15 @@ static const struct RegexTableEl gRuleParseStateTable[] = { , {doDotAny, 46 /* . */, 14,0, TRUE} // 6 , {doCaret, 94 /* ^ */, 2,0, TRUE} // 7 , {doDollar, 36 /* $ */, 2,0, TRUE} // 8 - , {doNOP, 92 /* \ */, 79,0, TRUE} // 9 + , {doNOP, 92 /* \ */, 81,0, TRUE} // 9 , {doOrOperator, 124 /* | */, 2,0, TRUE} // 10 , {doCloseParen, 41 /* ) */, 255,0, TRUE} // 11 , {doPatFinish, 253, 2,0, FALSE} // 12 - , {doRuleError, 255, 100,0, FALSE} // 13 - , {doNOP, 42 /* * */, 57,0, TRUE} // 14 expr-quant - , {doNOP, 43 /* + */, 60,0, TRUE} // 15 - , {doNOP, 63 /* ? */, 63,0, TRUE} // 16 - , {doIntervalInit, 123 /* { */, 66,0, TRUE} // 17 + , {doRuleError, 255, 101,0, FALSE} // 13 + , {doNOP, 42 /* * */, 59,0, TRUE} // 14 expr-quant + , {doNOP, 43 /* + */, 62,0, TRUE} // 15 + , {doNOP, 63 /* ? */, 65,0, TRUE} // 16 + , {doIntervalInit, 123 /* { */, 68,0, TRUE} // 17 , {doNOP, 40 /* ( */, 23,0, TRUE} // 18 , {doNOP, 255, 20,0, FALSE} // 19 , {doOrOperator, 124 /* | */, 2,0, TRUE} // 20 expr-cont @@ -128,7 +128,7 @@ static const struct RegexTableEl gRuleParseStateTable[] = { , {doNOP, 255, 2,0, FALSE} // 22 , {doSuppressComments, 63 /* ? */, 25,0, TRUE} // 23 open-paren-quant , {doNOP, 255, 27,0, FALSE} // 24 - , {doNOP, 35 /* # */, 46, 14, TRUE} // 25 open-paren-quant2 + , {doNOP, 35 /* # */, 47, 14, TRUE} // 25 open-paren-quant2 , {doNOP, 255, 29,0, FALSE} // 26 , {doSuppressComments, 63 /* ? */, 29,0, TRUE} // 27 open-paren , {doOpenCaptureParen, 255, 2, 14, FALSE} // 28 @@ -136,74 +136,75 @@ static const struct RegexTableEl gRuleParseStateTable[] = { , {doOpenAtomicParen, 62 /* > */, 2, 14, TRUE} // 30 , {doOpenLookAhead, 61 /* = */, 2, 20, TRUE} // 31 , {doOpenLookAheadNeg, 33 /* ! */, 2, 20, TRUE} // 32 - , {doNOP, 60 /* < */, 43,0, TRUE} // 33 - , {doNOP, 35 /* # */, 46, 2, TRUE} // 34 - , {doBeginMatchMode, 105 /* i */, 49,0, FALSE} // 35 - , {doBeginMatchMode, 109 /* m */, 49,0, FALSE} // 36 - , {doBeginMatchMode, 115 /* s */, 49,0, FALSE} // 37 - , {doBeginMatchMode, 120 /* x */, 49,0, FALSE} // 38 - , {doBeginMatchMode, 45 /* - */, 49,0, FALSE} // 39 - , {doConditionalExpr, 40 /* ( */, 100,0, TRUE} // 40 - , {doPerlInline, 123 /* { */, 100,0, TRUE} // 41 - , {doBadOpenParenType, 255, 100,0, FALSE} // 42 - , {doOpenLookBehind, 61 /* = */, 2, 20, TRUE} // 43 open-paren-lookbehind - , {doOpenLookBehindNeg, 33 /* ! */, 2, 20, TRUE} // 44 - , {doBadOpenParenType, 255, 100,0, FALSE} // 45 - , {doNOP, 41 /* ) */, 255,0, TRUE} // 46 paren-comment - , {doMismatchedParenErr, 253, 100,0, FALSE} // 47 - , {doNOP, 255, 46,0, TRUE} // 48 - , {doMatchMode, 105 /* i */, 49,0, TRUE} // 49 paren-flag - , {doMatchMode, 109 /* m */, 49,0, TRUE} // 50 - , {doMatchMode, 115 /* s */, 49,0, TRUE} // 51 - , {doMatchMode, 120 /* x */, 49,0, TRUE} // 52 - , {doMatchMode, 45 /* - */, 49,0, TRUE} // 53 - , {doSetMatchMode, 41 /* ) */, 2,0, TRUE} // 54 - , {doMatchModeParen, 58 /* : */, 2, 14, TRUE} // 55 - , {doNOP, 255, 100,0, FALSE} // 56 - , {doNGStar, 63 /* ? */, 20,0, TRUE} // 57 quant-star - , {doPossessiveStar, 43 /* + */, 20,0, TRUE} // 58 - , {doStar, 255, 20,0, FALSE} // 59 - , {doNGPlus, 63 /* ? */, 20,0, TRUE} // 60 quant-plus - , {doPossessivePlus, 43 /* + */, 20,0, TRUE} // 61 - , {doPlus, 255, 20,0, FALSE} // 62 - , {doNGOpt, 63 /* ? */, 20,0, TRUE} // 63 quant-opt - , {doPossessiveOpt, 43 /* + */, 20,0, TRUE} // 64 - , {doOpt, 255, 20,0, FALSE} // 65 - , {doNOP, 129, 66,0, TRUE} // 66 interval-open - , {doNOP, 128, 69,0, FALSE} // 67 - , {doIntervalError, 255, 100,0, FALSE} // 68 - , {doIntevalLowerDigit, 128, 69,0, TRUE} // 69 interval-lower - , {doNOP, 44 /* , */, 73,0, TRUE} // 70 - , {doIntervalSame, 125 /* } */, 76,0, TRUE} // 71 - , {doIntervalError, 255, 100,0, FALSE} // 72 - , {doIntervalUpperDigit, 128, 73,0, TRUE} // 73 interval-upper - , {doNOP, 125 /* } */, 76,0, TRUE} // 74 - , {doIntervalError, 255, 100,0, FALSE} // 75 - , {doNGInterval, 63 /* ? */, 20,0, TRUE} // 76 interval-type - , {doPossessiveInterval, 43 /* + */, 20,0, TRUE} // 77 - , {doInterval, 255, 20,0, FALSE} // 78 - , {doBackslashA, 65 /* A */, 2,0, TRUE} // 79 backslash - , {doBackslashB, 66 /* B */, 2,0, TRUE} // 80 - , {doBackslashb, 98 /* b */, 2,0, TRUE} // 81 - , {doBackslashd, 100 /* d */, 14,0, TRUE} // 82 - , {doBackslashD, 68 /* D */, 14,0, TRUE} // 83 - , {doBackslashG, 71 /* G */, 2,0, TRUE} // 84 - , {doProperty, 78 /* N */, 14,0, FALSE} // 85 - , {doProperty, 112 /* p */, 14,0, FALSE} // 86 - , {doProperty, 80 /* P */, 14,0, FALSE} // 87 - , {doEnterQuoteMode, 81 /* Q */, 2,0, TRUE} // 88 - , {doBackslashS, 83 /* S */, 14,0, TRUE} // 89 - , {doBackslashs, 115 /* s */, 14,0, TRUE} // 90 - , {doBackslashW, 87 /* W */, 14,0, TRUE} // 91 - , {doBackslashw, 119 /* w */, 14,0, TRUE} // 92 - , {doBackslashX, 88 /* X */, 14,0, TRUE} // 93 - , {doBackslashZ, 90 /* Z */, 2,0, TRUE} // 94 - , {doBackslashz, 122 /* z */, 2,0, TRUE} // 95 - , {doOctal, 48 /* 0 */, 14,0, TRUE} // 96 - , {doBackRef, 128, 14,0, TRUE} // 97 - , {doEscapeError, 253, 100,0, FALSE} // 98 - , {doLiteralChar, 255, 14,0, TRUE} // 99 - , {doExit, 255, 100,0, TRUE} // 100 errorDeath + , {doNOP, 60 /* < */, 44,0, TRUE} // 33 + , {doNOP, 35 /* # */, 47, 2, TRUE} // 34 + , {doBeginMatchMode, 105 /* i */, 50,0, FALSE} // 35 + , {doBeginMatchMode, 109 /* m */, 50,0, FALSE} // 36 + , {doBeginMatchMode, 115 /* s */, 50,0, FALSE} // 37 + , {doBeginMatchMode, 119 /* w */, 50,0, FALSE} // 38 + , {doBeginMatchMode, 120 /* x */, 50,0, FALSE} // 39 + , {doBeginMatchMode, 45 /* - */, 50,0, FALSE} // 40 + , {doConditionalExpr, 40 /* ( */, 101,0, TRUE} // 41 + , {doPerlInline, 123 /* { */, 101,0, TRUE} // 42 + , {doBadOpenParenType, 255, 101,0, FALSE} // 43 + , {doOpenLookBehind, 61 /* = */, 2, 20, TRUE} // 44 open-paren-lookbehind + , {doOpenLookBehindNeg, 33 /* ! */, 2, 20, TRUE} // 45 + , {doBadOpenParenType, 255, 101,0, FALSE} // 46 + , {doNOP, 41 /* ) */, 255,0, TRUE} // 47 paren-comment + , {doMismatchedParenErr, 253, 101,0, FALSE} // 48 + , {doNOP, 255, 47,0, TRUE} // 49 + , {doMatchMode, 105 /* i */, 50,0, TRUE} // 50 paren-flag + , {doMatchMode, 109 /* m */, 50,0, TRUE} // 51 + , {doMatchMode, 115 /* s */, 50,0, TRUE} // 52 + , {doMatchMode, 119 /* w */, 50,0, TRUE} // 53 + , {doMatchMode, 120 /* x */, 50,0, TRUE} // 54 + , {doMatchMode, 45 /* - */, 50,0, TRUE} // 55 + , {doSetMatchMode, 41 /* ) */, 2,0, TRUE} // 56 + , {doMatchModeParen, 58 /* : */, 2, 14, TRUE} // 57 + , {doBadModeFlag, 255, 101,0, FALSE} // 58 + , {doNGStar, 63 /* ? */, 20,0, TRUE} // 59 quant-star + , {doPossessiveStar, 43 /* + */, 20,0, TRUE} // 60 + , {doStar, 255, 20,0, FALSE} // 61 + , {doNGPlus, 63 /* ? */, 20,0, TRUE} // 62 quant-plus + , {doPossessivePlus, 43 /* + */, 20,0, TRUE} // 63 + , {doPlus, 255, 20,0, FALSE} // 64 + , {doNGOpt, 63 /* ? */, 20,0, TRUE} // 65 quant-opt + , {doPossessiveOpt, 43 /* + */, 20,0, TRUE} // 66 + , {doOpt, 255, 20,0, FALSE} // 67 + , {doNOP, 129, 68,0, TRUE} // 68 interval-open + , {doNOP, 128, 71,0, FALSE} // 69 + , {doIntervalError, 255, 101,0, FALSE} // 70 + , {doIntevalLowerDigit, 128, 71,0, TRUE} // 71 interval-lower + , {doNOP, 44 /* , */, 75,0, TRUE} // 72 + , {doIntervalSame, 125 /* } */, 78,0, TRUE} // 73 + , {doIntervalError, 255, 101,0, FALSE} // 74 + , {doIntervalUpperDigit, 128, 75,0, TRUE} // 75 interval-upper + , {doNOP, 125 /* } */, 78,0, TRUE} // 76 + , {doIntervalError, 255, 101,0, FALSE} // 77 + , {doNGInterval, 63 /* ? */, 20,0, TRUE} // 78 interval-type + , {doPossessiveInterval, 43 /* + */, 20,0, TRUE} // 79 + , {doInterval, 255, 20,0, FALSE} // 80 + , {doBackslashA, 65 /* A */, 2,0, TRUE} // 81 backslash + , {doBackslashB, 66 /* B */, 2,0, TRUE} // 82 + , {doBackslashb, 98 /* b */, 2,0, TRUE} // 83 + , {doBackslashd, 100 /* d */, 14,0, TRUE} // 84 + , {doBackslashD, 68 /* D */, 14,0, TRUE} // 85 + , {doBackslashG, 71 /* G */, 2,0, TRUE} // 86 + , {doProperty, 78 /* N */, 14,0, FALSE} // 87 + , {doProperty, 112 /* p */, 14,0, FALSE} // 88 + , {doProperty, 80 /* P */, 14,0, FALSE} // 89 + , {doEnterQuoteMode, 81 /* Q */, 2,0, TRUE} // 90 + , {doBackslashS, 83 /* S */, 14,0, TRUE} // 91 + , {doBackslashs, 115 /* s */, 14,0, TRUE} // 92 + , {doBackslashW, 87 /* W */, 14,0, TRUE} // 93 + , {doBackslashw, 119 /* w */, 14,0, TRUE} // 94 + , {doBackslashX, 88 /* X */, 14,0, TRUE} // 95 + , {doBackslashZ, 90 /* Z */, 2,0, TRUE} // 96 + , {doBackslashz, 122 /* z */, 2,0, TRUE} // 97 + , {doBackRef, 128, 14,0, TRUE} // 98 + , {doEscapeError, 253, 101,0, FALSE} // 99 + , {doLiteralChar, 255, 14,0, TRUE} // 100 + , {doExit, 255, 101,0, TRUE} // 101 errorDeath }; static const char * const RegexStateNames[] = { 0, "start", @@ -247,6 +248,7 @@ static const char * const RegexStateNames[] = { 0, 0, 0, 0, + 0, 0, "open-paren-lookbehind", 0, @@ -261,6 +263,7 @@ static const char * const RegexStateNames[] = { 0, 0, 0, 0, + 0, 0, "quant-star", 0, @@ -303,7 +306,6 @@ static const char * const RegexStateNames[] = { 0, 0, 0, 0, - 0, 0, "errorDeath", 0}; diff --git a/icuSources/i18n/regexcst.txt b/icuSources/i18n/regexcst.txt index f1c98786..fec788c1 100644 --- a/icuSources/i18n/regexcst.txt +++ b/icuSources/i18n/regexcst.txt @@ -135,6 +135,7 @@ open-paren-extended: 'i' paren-flag doBeginMatchMode 'm' paren-flag doBeginMatchMode 's' paren-flag doBeginMatchMode + 'w' paren-flag doBeginMatchMode 'x' paren-flag doBeginMatchMode '-' paren-flag doBeginMatchMode '(' n errorDeath doConditionalExpr @@ -163,11 +164,12 @@ paren-flag: 'i' n paren-flag doMatchMode 'm' n paren-flag doMatchMode 's' n paren-flag doMatchMode + 'w' n paren-flag doMatchMode 'x' n paren-flag doMatchMode '-' n paren-flag doMatchMode ')' n term doSetMatchMode ':' n term ^expr-quant doMatchModeParen - default errorDeath + default errorDeath doBadModeFlag # @@ -248,7 +250,6 @@ backslash: 'X' n expr-quant doBackslashX 'Z' n term doBackslashZ 'z' n term doBackslashz - '0' n expr-quant doOctal digit_char n expr-quant doBackRef # Will scan multiple digits eof errorDeath doEscapeError default n expr-quant doLiteralChar # Escaped literal char. diff --git a/icuSources/i18n/regeximp.h b/icuSources/i18n/regeximp.h index d527f2f6..5446e88f 100644 --- a/icuSources/i18n/regeximp.h +++ b/icuSources/i18n/regeximp.h @@ -1,5 +1,5 @@ // -// Copyright (C) 2002-2003 International Business Machines Corporation +// Copyright (C) 2002-2004 International Business Machines Corporation // and others. All rights reserved. // // file: regeximp.h @@ -16,38 +16,37 @@ U_NAMESPACE_BEGIN +#ifdef REGEX_DEBUG /* For debugging, define REGEX_DEBUG in regex.h, not here in this file. */ // -// debugging support. Enable one or more of the #defines immediately following +// debugging options. Enable one or more of the three #defines immediately following // -#ifdef _DEBUG + //#define REGEX_SCAN_DEBUG -//#define REGEX_DUMP_DEBUG -//#define REGEX_RUN_DEBUG -#endif +#define REGEX_DUMP_DEBUG +#define REGEX_RUN_DEBUG + // End of #defines inteded to be directly set. -#if defined(REGEX_SCAN_DEBUG) || defined(REGEX_RUN_DEBUG) || defined(REGEX_DUMP_DEBUG) -#define REGEX_DEBUG 1 #include #endif #ifdef REGEX_SCAN_DEBUG -#define REGEX_SCAN_DEBUG_PRINTF printf +#define REGEX_SCAN_DEBUG_PRINTF(a) printf a #else -#define REGEX_SCAN_DEBUG_PRINTF +#define REGEX_SCAN_DEBUG_PRINTF(a) #endif #ifdef REGEX_DUMP_DEBUG -#define REGEX_DUMP_DEBUG_PRINTF printf +#define REGEX_DUMP_DEBUG_PRINTF(a) printf a #else -#define REGEX_DUMP_DEBUG_PRINTF +#define REGEX_DUMP_DEBUG_PRINTF(a) #endif #ifdef REGEX_RUN_DEBUG -#define REGEX_RUN_DEBUG_PRINTF printf -#define REGEX_DUMP_DEBUG_PRINTF printf +#define REGEX_RUN_DEBUG_PRINTF(a) printf a +#define REGEX_DUMP_DEBUG_PRINTF(a) printf a #else -#define REGEX_RUN_DEBUG_PRINTF +#define REGEX_RUN_DEBUG_PRINTF(a) #endif @@ -165,10 +164,12 @@ enum { URX_LOOP_C = 51, // Continue a [set]* or OneChar* loop. // Operand is a matcher static data location. // Must always immediately follow LOOP_x_I instruction. - URX_LOOP_DOT_I = 52 // .*, initialization of the optimized loop. + URX_LOOP_DOT_I = 52, // .*, initialization of the optimized loop. // Operand value: // 0: Normal (. doesn't match new-line) mode. // 1: . matches new-line mode. + URX_BACKSLASH_BU = 53 // \b or \B in UREGEX_UWORD mode, using Unicode style + // word boundaries. }; @@ -227,7 +228,8 @@ enum { "STAT_SETREF_N", \ "LOOP_SR_I", \ "LOOP_C", \ - "LOOP_DOT_I" + "LOOP_DOT_I", \ + "BACKSLASH_BU" // @@ -324,7 +326,7 @@ inline void Regex8BitSet::add(UChar32 c) { inline void Regex8BitSet::init(const UnicodeSet *s) { if (s != NULL) { - for (int i=0; i<255; i++) { + for (int i=0; i<=255; i++) { if (s->contains(i)) { this->add(i); } diff --git a/icuSources/i18n/regexst.cpp b/icuSources/i18n/regexst.cpp index ca5456e7..e874f2ad 100644 --- a/icuSources/i18n/regexst.cpp +++ b/icuSources/i18n/regexst.cpp @@ -1,7 +1,7 @@ // // regexst.h // -// Copyright (C) 2003, International Business Machines Corporation and others. +// Copyright (C) 2004, International Business Machines Corporation and others. // All Rights Reserved. // // This file contains class RegexStaticSets @@ -86,20 +86,22 @@ static const UChar gRuleWhiteSpacePattern[] = { // Unicode Set Definitions for Regular Expression \w // static const UChar gIsWordPattern[] = { -// [ \ p { L l } \ p { L u } - 0x5b, 0x5c, 0x70, 0x7b, 0x4c, 0x6c, 0x7d, 0x5c, 0x70, 0x7b, 0x4c, 0x75, 0x7d, -// \ p { L t } \ p { L o } - 0x5c, 0x70, 0x7b, 0x4c, 0x74, 0x7d, 0x5c, 0x70, 0x7b, 0x4c, 0x6f, 0x7d, -// \ p { N d } _ ] - 0x5c, 0x70, 0x7b, 0x4e, 0x64, 0x7d, 0x5f, 0x5d, 0}; +// [ \ p { A l p h a b e t i c } + 0x5b, 0x5c, 0x70, 0x7b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x62, 0x65, 0x74, 0x69, 0x63, 0x7d, +// \ p { M } Mark + 0x5c, 0x70, 0x7b, 0x4d, 0x7d, +// \ p { N d } Digit_Numeric + 0x5c, 0x70, 0x7b, 0x4e, 0x64, 0x7d, +// \ p { P c } ] Connector_Punctuation + 0x5c, 0x70, 0x7b, 0x50, 0x63, 0x7d, 0x5d, 0}; // // Unicode Set Definitions for Regular Expression \s // static const UChar gIsSpacePattern[] = { -// [ \ t \ n \ f \ r \ p { Z } ] - 0x5b, 0x5c, 0x74, 0x5c, 0x6e, 0x5c, 0x66, 0x5c, 0x72, 0x5c, 0x70, 0x7b, 0x5a, 0x7d, 0x5d, 0}; +// [ \ p { W h i t e S p a c e } ] + 0x5b, 0x5c, 0x70, 0x7b, 0x57, 0x68, 0x69, 0x74, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x7d, 0x5d, 0}; // @@ -108,8 +110,12 @@ static const UChar gIsWordPattern[] = { static const UChar gGC_ControlPattern[] = { // [ [ : Z l : ] [ : Z p : ] 0x5b, 0x5b, 0x3a, 0x5A, 0x6c, 0x3a, 0x5d, 0x5b, 0x3a, 0x5A, 0x70, 0x3a, 0x5d, -// [ : C c : ] [ : C f : ] ] - 0x5b, 0x3a, 0x43, 0x63, 0x3a, 0x5d, 0x5b, 0x3a, 0x43, 0x66, 0x3a, 0x5d, 0x5d, 0}; +// [ : C c : ] [ : C f : ] - + 0x5b, 0x3a, 0x43, 0x63, 0x3a, 0x5d, 0x5b, 0x3a, 0x43, 0x66, 0x3a, 0x5d, 0x2d, +// [ : G r a p h e m e _ + 0x5b, 0x3a, 0x47, 0x72, 0x61, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x5f, +// E x t e n d : ] ] + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x3a, 0x5d, 0x5d, 0}; static const UChar gGC_ExtendPattern[] = { // [ \ p { G r a p h e m e _ @@ -212,7 +218,7 @@ RegexStaticSets::RegexStaticSets(UErrorCode *status) { // Empty UnicodeString, for use by matchers with NULL input. fEmptyString = new UnicodeString; -}; +} RegexStaticSets::~RegexStaticSets() { @@ -232,8 +238,28 @@ RegexStaticSets::~RegexStaticSets() { fRuleDigits = NULL; delete fEmptyString; fEmptyString = NULL; -}; +} + + +//---------------------------------------------------------------------------------- +// +// regex_cleanup Memory cleanup function, free/delete all +// cached memory. Called by ICU's u_cleanup() function. +// +//---------------------------------------------------------------------------------- +UBool +RegexStaticSets::cleanup(void) { + delete RegexStaticSets::gStaticSets; + RegexStaticSets::gStaticSets = NULL; + return TRUE; +} +U_CDECL_BEGIN +static UBool U_CALLCONV +regex_cleanup(void) { + return RegexStaticSets::cleanup(); +} +U_CDECL_END void RegexStaticSets::initGlobals(UErrorCode *status) { umtx_lock(NULL); @@ -254,7 +280,7 @@ void RegexStaticSets::initGlobals(UErrorCode *status) { if (p) { delete p; } - ucln_i18n_registerCleanup(); + ucln_i18n_registerCleanup(UCLN_I18N_REGEX, regex_cleanup); } } diff --git a/icuSources/i18n/regexst.h b/icuSources/i18n/regexst.h index f48c3268..aaba34d5 100644 --- a/icuSources/i18n/regexst.h +++ b/icuSources/i18n/regexst.h @@ -1,7 +1,7 @@ // // regexst.h // -// Copyright (C) 2003, International Business Machines Corporation and others. +// Copyright (C) 2003-2004, International Business Machines Corporation and others. // All Rights Reserved. // // This file contains declarations for the class RegexStaticSets @@ -36,6 +36,7 @@ public: RegexStaticSets(UErrorCode *status); ~RegexStaticSets(); static void initGlobals(UErrorCode *status); + static UBool cleanup(); UnicodeSet *fPropSets[URX_LAST_SET]; // The sets for common regex items, e.g. \s Regex8BitSet fPropSets8[URX_LAST_SET]; // Fast bitmap sets for latin-1 range for above. diff --git a/icuSources/i18n/rematch.cpp b/icuSources/i18n/rematch.cpp index 7fc42a2b..aabbadf9 100644 --- a/icuSources/i18n/rematch.cpp +++ b/icuSources/i18n/rematch.cpp @@ -6,7 +6,7 @@ // /* ************************************************************************** -* Copyright (C) 2002-2003 International Business Machines Corporation * +* Copyright (C) 2002-2004 International Business Machines Corporation * * and others. All rights reserved. * ************************************************************************** */ @@ -18,6 +18,7 @@ #include "unicode/uniset.h" #include "unicode/uchar.h" #include "unicode/ustring.h" +#include "unicode/rbbi.h" #include "uassert.h" #include "cmemory.h" #include "uvector.h" @@ -42,6 +43,7 @@ RegexMatcher::RegexMatcher(const RegexPattern *pat) { fDeferredStatus = U_ZERO_ERROR; fStack = new UVector32(fDeferredStatus); fData = fSmallData; + fWordBreakItr = NULL; if (pat==NULL) { fDeferredStatus = U_ILLEGAL_ARGUMENT_ERROR; return; @@ -67,6 +69,7 @@ RegexMatcher::RegexMatcher(const UnicodeString ®exp, const UnicodeString &inp fDeferredStatus = U_ZERO_ERROR; fStack = new UVector32(status); fData = fSmallData; + fWordBreakItr = NULL; if (U_FAILURE(status)) { return; } @@ -89,6 +92,7 @@ RegexMatcher::RegexMatcher(const UnicodeString ®exp, fData = fSmallData; fPatternOwned = RegexPattern::compile(regexp, flags, pe, status); fPattern = fPatternOwned; + fWordBreakItr = NULL; if (U_FAILURE(status)) { return; } @@ -107,7 +111,7 @@ RegexMatcher::RegexMatcher(const UnicodeString ®exp, RegexMatcher::~RegexMatcher() { delete fStack; if (fData != fSmallData) { - delete fData; + uprv_free(fData); fData = NULL; } if (fPatternOwned) { @@ -115,6 +119,9 @@ RegexMatcher::~RegexMatcher() { fPatternOwned = NULL; fPattern = NULL; } + #if UCONFIG_NO_BREAK_ITERATION==0 + delete fWordBreakItr; + #endif } @@ -142,10 +149,11 @@ RegexMatcher &RegexMatcher::appendReplacement(UnicodeString &dest, } // Copy input string from the end of previous match to start of current match - int32_t len = fMatchStart-fLastMatchEnd; + int32_t len = fMatchStart-fLastReplaceEnd; if (len > 0) { - dest.append(*fInput, fLastMatchEnd, len); + dest.append(*fInput, fLastReplaceEnd, len); } + fLastReplaceEnd = fMatchEnd; // scan the replacement text, looking for substitutions ($n) and \escapes. @@ -172,7 +180,6 @@ RegexMatcher &RegexMatcher::appendReplacement(UnicodeString &dest, UChar32 escapedChar = replacement.unescapeAt(replIdx); if (escapedChar != (UChar32)0xFFFFFFFF) { dest.append(escapedChar); - replIdx += (c==0x55? 9: 5); // TODO: Report errors for mal-formed \u escapes? // As this is, the original sequence is output, which may be OK. continue; @@ -306,9 +313,36 @@ UBool RegexMatcher::find() { } int32_t startPos = fMatchEnd; + + if (fMatch) { + // Save the position of any previous successful match. + fLastMatchEnd = fMatchEnd; + + if (fMatchStart == fMatchEnd) { + // Previous match had zero length. Move start position up one position + // to avoid sending find() into a loop on zero-length matches. + if (startPos == fInput->length()) { + fMatch = FALSE; + return FALSE; + } + startPos = fInput->moveIndex32(startPos, 1); + } + } else { + if (fLastMatchEnd >= 0) { + // A previous find() failed to match. Don't try again. + // (without this test, a pattern with a zero-length match + // could match again at the end of an input string.) + return FALSE; + } + } + int32_t inputLen = fInput->length(); + + // Compute the position in the input string beyond which a match can not begin, because + // the minimum length match would extend past the end of the input. int32_t testLen = inputLen - fPattern->fMinMatchLen; if (startPos > testLen) { + fMatch = FALSE; return FALSE; } @@ -342,6 +376,7 @@ UBool RegexMatcher::find() { // Matches are only possible at the start of the input string // (pattern begins with ^ or \A) if (startPos > 0) { + fMatch = FALSE; return FALSE; } MatchAt(startPos, fDeferredStatus); @@ -369,6 +404,7 @@ UBool RegexMatcher::find() { } } if (pos >= testLen) { + fMatch = FALSE; return FALSE; } } @@ -394,6 +430,7 @@ UBool RegexMatcher::find() { } } if (pos >= testLen) { + fMatch = FALSE; return FALSE; } } @@ -415,19 +452,22 @@ UBool RegexMatcher::find() { } for (;;) { - UChar32 c = inputBuf[startPos-1]; + c = inputBuf[startPos-1]; if (((c & 0x7f) <= 0x29) && // First quickly bypass as many chars as possible - (c == 0x0a || c==0x0c || c==0x85 ||c==0x2028 || c==0x2029 || - c == 0x0d && startPos+1 < inputLen && inputBuf[startPos+1] != 0x0a)) { - MatchAt(startPos, fDeferredStatus); - if (U_FAILURE(fDeferredStatus)) { - return FALSE; - } - if (fMatch) { - return TRUE; - } + (c == 0x0a || c == 0x0d || c==0x0c || c==0x85 ||c==0x2028 || c==0x2029 )) { + if (c == 0x0d && startPos < inputLen && inputBuf[startPos] == 0x0a) { + startPos++; + } + MatchAt(startPos, fDeferredStatus); + if (U_FAILURE(fDeferredStatus)) { + return FALSE; + } + if (fMatch) { + return TRUE; + } } if (startPos >= testLen) { + fMatch = FALSE; return FALSE; } U16_NEXT(inputBuf, startPos, inputLen, c); // like c = inputBuf[startPos++]; @@ -456,7 +496,7 @@ UBool RegexMatcher::find(int32_t start, UErrorCode &status) { return FALSE; } int32_t inputLen = fInput->length(); - if (start < 0 || start >= inputLen) { + if (start < 0 || start > inputLen) { status = U_INDEX_OUTOFBOUNDS_ERROR; return FALSE; } @@ -516,6 +556,11 @@ const UnicodeString &RegexMatcher::input() const { +//-------------------------------------------------------------------------------- +// +// lookingAt() +// +//-------------------------------------------------------------------------------- UBool RegexMatcher::lookingAt(UErrorCode &status) { if (U_FAILURE(status)) { return FALSE; @@ -530,7 +575,30 @@ UBool RegexMatcher::lookingAt(UErrorCode &status) { } +UBool RegexMatcher::lookingAt(int32_t start, UErrorCode &status) { + if (U_FAILURE(status)) { + return FALSE; + } + if (U_FAILURE(fDeferredStatus)) { + status = fDeferredStatus; + return FALSE; + } + if (start < 0 || start > fInput->length()) { + status = U_INDEX_OUTOFBOUNDS_ERROR; + return FALSE; + } + reset(); + MatchAt(start, status); + return fMatch; +} + + +//-------------------------------------------------------------------------------- +// +// matches() +// +//-------------------------------------------------------------------------------- UBool RegexMatcher::matches(UErrorCode &status) { if (U_FAILURE(status)) { return FALSE; @@ -546,6 +614,24 @@ UBool RegexMatcher::matches(UErrorCode &status) { } +UBool RegexMatcher::matches(int32_t start, UErrorCode &status) { + if (U_FAILURE(status)) { + return FALSE; + } + if (U_FAILURE(fDeferredStatus)) { + status = fDeferredStatus; + return FALSE; + } + if (start < 0 || start > fInput->length()) { + status = U_INDEX_OUTOFBOUNDS_ERROR; + return FALSE; + } + reset(); + MatchAt(start, status); + UBool success = (fMatch && fMatchEnd==fInput->length()); + return success; +} + const RegexPattern &RegexMatcher::pattern() const { @@ -614,10 +700,11 @@ UnicodeString RegexMatcher::replaceFirst(const UnicodeString &replacement, UErro // //-------------------------------------------------------------------------------- RegexMatcher &RegexMatcher::reset() { - fMatchStart = 0; - fMatchEnd = 0; - fLastMatchEnd = 0; - fMatch = FALSE; + fMatchStart = 0; + fMatchEnd = 0; + fLastMatchEnd = -1; + fLastReplaceEnd = 0; + fMatch = FALSE; resetStack(); return *this; } @@ -627,27 +714,37 @@ RegexMatcher &RegexMatcher::reset() { RegexMatcher &RegexMatcher::reset(const UnicodeString &input) { fInput = &input; reset(); + if (fWordBreakItr != NULL) { + #if UCONFIG_NO_BREAK_ITERATION==0 + fWordBreakItr->setText(input); + #endif + } return *this; } +RegexMatcher &RegexMatcher::reset(const UChar *) { + fDeferredStatus = U_INTERNAL_PROGRAM_ERROR; + return *this; +} -REStackFrame *RegexMatcher::resetStack() { - // Discard any previous contents of the state save stack, and initialize a - // new stack frame to all -1. The -1s are needed for capture group limits, where - // they indicate that a group has not yet matched anything. - fStack->removeAllElements(); - - int32_t *iFrame = fStack->reserveBlock(fPattern->fFrameSize, fDeferredStatus); - int i; - for (i=0; ifFrameSize; i++) { - iFrame[i] = -1; +RegexMatcher &RegexMatcher::reset(int32_t position, UErrorCode &status) { + if (U_FAILURE(status)) { + return *this; } - return (REStackFrame *)iFrame; + reset(); + if (position < 0 || position >= fInput->length()) { + status = U_INDEX_OUTOFBOUNDS_ERROR; + return *this; + } + fMatchEnd = position; + return *this; } + + //-------------------------------------------------------------------------------- // // setTrace @@ -792,6 +889,37 @@ int32_t RegexMatcher::start(int group, UErrorCode &status) const { +//================================================================================ +// +// Code following this point in this file is the internal +// Match Engine Implementation. +// +//================================================================================ + + +//-------------------------------------------------------------------------------- +// +// resetStack +// Discard any previous contents of the state save stack, and initialize a +// new stack frame to all -1. The -1s are needed for capture group limits, +// where they indicate that a group has not yet matched anything. +//-------------------------------------------------------------------------------- +REStackFrame *RegexMatcher::resetStack() { + // Discard any previous contents of the state save stack, and initialize a + // new stack frame to all -1. The -1s are needed for capture group limits, where + // they indicate that a group has not yet matched anything. + fStack->removeAllElements(); + + int32_t *iFrame = fStack->reserveBlock(fPattern->fFrameSize, fDeferredStatus); + int i; + for (i=0; ifFrameSize; i++) { + iFrame[i] = -1; + } + return (REStackFrame *)iFrame; +} + + + //-------------------------------------------------------------------------------- // // isWordBoundary @@ -804,9 +932,6 @@ int32_t RegexMatcher::start(int group, UErrorCode &status) const { // opposite in membership in \w set // // parameters: pos - the current position in the input buffer -// start - the position where the match operation started. -// don't backup before this position when looking back -// for a preceding base char. // //-------------------------------------------------------------------------------- UBool RegexMatcher::isWordBoundary(int32_t pos) { @@ -845,6 +970,36 @@ UBool RegexMatcher::isWordBoundary(int32_t pos) { return isBoundary; } +//-------------------------------------------------------------------------------- +// +// isUWordBoundary +// +// Test for a word boundary using RBBI word break. +// +// parameters: pos - the current position in the input buffer +// +//-------------------------------------------------------------------------------- +UBool RegexMatcher::isUWordBoundary(int32_t pos) { + UBool returnVal = FALSE; +#if UCONFIG_NO_BREAK_ITERATION==0 + UErrorCode status = U_ZERO_ERROR; + + // If we haven't yet created a break iterator for this matcher, do it now. + if (fWordBreakItr == NULL) { + fWordBreakItr = + (RuleBasedBreakIterator *)BreakIterator::createWordInstance(Locale::getEnglish(), status); + if (U_FAILURE(status)) { + // TODO: reliable error reporting for BI failures. + return FALSE; + } + fWordBreakItr->setText(*fInput); + } + + returnVal = fWordBreakItr->isBoundary(pos); +#endif + return returnVal; +} + //-------------------------------------------------------------------------------- // // StateSave @@ -1080,7 +1235,11 @@ void RegexMatcher::MatchAt(int32_t startIdx, UErrorCode &status) { if (fp->fInputIdx == inputLen-1) { UChar32 c = fInput->char32At(fp->fInputIdx); if (c == 0x0a || c==0x0d || c==0x0c || c==0x85 ||c==0x2028 || c==0x2029) { - break; // At new-line at end of input. Success + // If not in the middle of a CR/LF sequence + if ( !(c==0x0a && fp->fInputIdx>0 && inputBuf[fp->fInputIdx-1]==0x0d)) { + break; + // At new-line at end of input. Success + } } } @@ -1101,12 +1260,16 @@ void RegexMatcher::MatchAt(int32_t startIdx, UErrorCode &status) { // We really are at the end of input. Success. break; } - // If we are positioned just before a new-line , succeed. + // If we are positioned just before a new-line, succeed. // It makes no difference where the new-line is within the input. UChar32 c = inputBuf[fp->fInputIdx]; if (c == 0x0a || c==0x0d || c==0x0c || c==0x85 ||c==0x2028 || c==0x2029) { - break; // At new-line at end of input. Success + // At a line end, except for the odd chance of being in the middle of a CR/LF sequence + if ( !(c==0x0a && fp->fInputIdx>0 && inputBuf[fp->fInputIdx-1]==0x0d)) { + break; // At new-line at end of input. Success + } } + // not at a new line. Fail. fp = (REStackFrame *)fStack->popFrame(frameSize); } @@ -1151,6 +1314,17 @@ void RegexMatcher::MatchAt(int32_t startIdx, UErrorCode &status) { break; + case URX_BACKSLASH_BU: // Test for word boundaries, Unicode-style + { + UBool success = isUWordBoundary(fp->fInputIdx); + success ^= (opValue != 0); // flip sense for \B + if (!success) { + fp = (REStackFrame *)fStack->popFrame(frameSize); + } + } + break; + + case URX_BACKSLASH_D: // Test for decimal digit { if (fp->fInputIdx >= inputLen) { @@ -1352,7 +1526,7 @@ GC_Done: break; } } - } + } // Either at end of input, or the character wasn't in the set. // Either way, we need to back track out. fp = (REStackFrame *)fStack->popFrame(frameSize); @@ -1639,14 +1813,7 @@ GC_Done: // we do too. break; } - /* - if ((fp->fInputIdx + len > inputLen) || - u_strncmp(inputBuf+groupStartIdx, inputBuf+fp->fInputIdx, len) != 0) { - fp = (REStackFrame *)fStack->popFrame(frameSize); // FAIL, no match. - } else { - fp->fInputIdx += len; // Match. Advance current input position. - } - */ + UBool haveMatch = FALSE; if (fp->fInputIdx + len <= inputLen) { if (opType == URX_BACKREF) { @@ -1729,7 +1896,7 @@ GC_Done: if (u_foldCase(c, U_FOLD_CASE_DEFAULT) == opValue) { break; } - } + } fp = (REStackFrame *)fStack->popFrame(frameSize); break; @@ -1747,17 +1914,18 @@ GC_Done: opValue = URX_VAL(op); U_ASSERT(opType == URX_STRING_LEN); stringLen = opValue; - + int32_t stringEndIndex = fp->fInputIdx + stringLen; - if (stringEndIndex <= inputLen && - u_strncasecmp(inputBuf+fp->fInputIdx, litText+stringStartIdx, - stringLen, U_FOLD_CASE_DEFAULT) == 0) { - // Success. Advance the current input position. - fp->fInputIdx = stringEndIndex; - } else { - // No match. Back up matching to a saved state - fp = (REStackFrame *)fStack->popFrame(frameSize); - } + if (stringEndIndex <= inputLen) { + if (u_strncasecmp(inputBuf+fp->fInputIdx, litText+stringStartIdx, + stringLen, U_FOLD_CASE_DEFAULT) == 0) { + // Success. Advance the current input position. + fp->fInputIdx = stringEndIndex; + break; + } + } + // No match. Back up matching to a saved state + fp = (REStackFrame *)fStack->popFrame(frameSize); } break; @@ -2003,13 +2171,17 @@ GC_Done: { // Loop through input until the input is exhausted (we reach an end-of-line) // In multi-line mode, we can just go straight to the end of the input. - int32_t ix = inputLen; - if (opValue == 0) { + int32_t ix; + if (opValue == 1) { + // Multi-line mode. + ix = inputLen; + } else { // NOT multi-line mode. Line endings do not match '.' // Scan forward until a line ending or end of input. ix = fp->fInputIdx; for (;;) { if (ix >= inputLen) { + ix = inputLen; break; } UChar32 c; @@ -2103,13 +2275,13 @@ breakFromLoop: fMatchStart = startIdx; fMatchEnd = fp->fInputIdx; if (fTraceDebug) { - REGEX_RUN_DEBUG_PRINTF("Match. start=%d end=%d\n\n", fMatchStart, fMatchEnd); + REGEX_RUN_DEBUG_PRINTF(("Match. start=%d end=%d\n\n", fMatchStart, fMatchEnd)); } } else { if (fTraceDebug) { - REGEX_RUN_DEBUG_PRINTF("No match\n\n"); + REGEX_RUN_DEBUG_PRINTF(("No match\n\n")); } } @@ -2122,7 +2294,7 @@ breakFromLoop: -const char RegexMatcher::fgClassID = 0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(RegexMatcher) U_NAMESPACE_END diff --git a/icuSources/i18n/remtrans.cpp b/icuSources/i18n/remtrans.cpp index 04c7372c..5c97883e 100644 --- a/icuSources/i18n/remtrans.cpp +++ b/icuSources/i18n/remtrans.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (c) 2001, International Business Machines +* Copyright (c) 2001-2003, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -18,7 +18,7 @@ static const UChar ID[] = {65, 110, 121, 45, 0x52, 0x65, 0x6D, 0x6F, 0x76, 0x65, U_NAMESPACE_BEGIN -const char RemoveTransliterator::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(RemoveTransliterator) /** * System registration hook. @@ -34,8 +34,9 @@ void RemoveTransliterator::registerIDs() { /** * Factory method */ -Transliterator* RemoveTransliterator::_create(const UnicodeString& ID, +Transliterator* RemoveTransliterator::_create(const UnicodeString& /*ID*/, Token /*context*/) { + /* We don't need the ID or context. We just remove data */ return new RemoveTransliterator(); } diff --git a/icuSources/i18n/remtrans.h b/icuSources/i18n/remtrans.h index 78add4b6..d63cd13e 100644 --- a/icuSources/i18n/remtrans.h +++ b/icuSources/i18n/remtrans.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (c) 2001, International Business Machines +* Copyright (c) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -45,7 +45,7 @@ public: * Transliterator API. * @return A copy of the object. */ - Transliterator* clone(void) const; + virtual Transliterator* clone(void) const; /** * Implements {@link Transliterator#handleTransliterate}. @@ -64,14 +64,14 @@ public: * * @draft ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * * @draft ICU 2.2 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } + static UClassID U_EXPORT2 getStaticClassID(); private: @@ -79,12 +79,6 @@ public: * Factory method */ static Transliterator* _create(const UnicodeString& ID, Token context); - - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; U_NAMESPACE_END diff --git a/icuSources/i18n/repattrn.cpp b/icuSources/i18n/repattrn.cpp index 462a4b3e..ba0c4ae2 100644 --- a/icuSources/i18n/repattrn.cpp +++ b/icuSources/i18n/repattrn.cpp @@ -3,7 +3,7 @@ // /* *************************************************************************** -* Copyright (C) 2002-2003 International Business Machines Corporation * +* Copyright (C) 2002-2004 International Business Machines Corporation * * and others. All rights reserved. * *************************************************************************** */ @@ -13,6 +13,7 @@ #if !UCONFIG_NO_REGULAR_EXPRESSIONS #include "unicode/regex.h" +#include "unicode/uclean.h" #include "uassert.h" #include "uvector.h" #include "uvectr32.h" @@ -28,6 +29,8 @@ U_NAMESPACE_BEGIN // //-------------------------------------------------------------------------- RegexPattern::RegexPattern() { + UErrorCode status = U_ZERO_ERROR; + u_init(&status); // Init all of this instances data. init(); @@ -72,15 +75,18 @@ RegexPattern &RegexPattern::operator = (const RegexPattern &other) { fLiteralText = other.fLiteralText; fDeferredStatus = other.fDeferredStatus; fMinMatchLen = other.fMinMatchLen; + fFrameSize = other.fFrameSize; + fDataSize = other.fDataSize; fMaxCaptureDigits = other.fMaxCaptureDigits; fStaticSets = other.fStaticSets; + fStaticSets8 = other.fStaticSets8; fStartType = other.fStartType; fInitialStringIdx = other.fInitialStringIdx; fInitialStringLen = other.fInitialStringLen; *fInitialChars = *other.fInitialChars; - *fInitialChars8 = *other.fInitialChars8; fInitialChar = other.fInitialChar; + *fInitialChars8 = *other.fInitialChars8; // Copy the pattern. It's just values, nothing deep to copy. fCompiledPat->assign(*other.fCompiledPat, fDeferredStatus); @@ -118,20 +124,26 @@ RegexPattern &RegexPattern::operator = (const RegexPattern &other) { // //-------------------------------------------------------------------------- void RegexPattern::init() { + fPattern.remove(); fFlags = 0; + fCompiledPat = 0; + fLiteralText.remove(); + fSets = NULL; + fSets8 = NULL; fDeferredStatus = U_ZERO_ERROR; fMinMatchLen = 0; - fMaxCaptureDigits = 1; - fStaticSets = NULL; fFrameSize = 0; fDataSize = 0; + fGroupMap = NULL; + fMaxCaptureDigits = 1; + fStaticSets = NULL; + fStaticSets8 = NULL; fStartType = START_NO_INFO; fInitialStringIdx = 0; fInitialStringLen = 0; fInitialChars = NULL; - fInitialChars8 = NULL; fInitialChar = 0; - fSets8 = NULL; + fInitialChars8 = NULL; fCompiledPat = new UVector32(fDeferredStatus); fGroupMap = new UVector32(fDeferredStatus); @@ -170,14 +182,14 @@ void RegexPattern::zap() { } delete fSets; fSets = NULL; + delete[] fSets8; + fSets8 = NULL; delete fGroupMap; fGroupMap = NULL; delete fInitialChars; fInitialChars = NULL; delete fInitialChars8; fInitialChars8 = NULL; - delete[] fSets8; - fSets8 = NULL; } @@ -220,18 +232,19 @@ UBool RegexPattern::operator ==(const RegexPattern &other) const { // compile // //--------------------------------------------------------------------- -RegexPattern *RegexPattern::compile( - const UnicodeString ®ex, - uint32_t flags, - UParseError &pe, - UErrorCode &status) { +RegexPattern * U_EXPORT2 +RegexPattern::compile(const UnicodeString ®ex, + uint32_t flags, + UParseError &pe, + UErrorCode &status) +{ if (U_FAILURE(status)) { return NULL; } const uint32_t allFlags = UREGEX_CANON_EQ | UREGEX_CASE_INSENSITIVE | UREGEX_COMMENTS | - UREGEX_DOTALL | UREGEX_MULTILINE; + UREGEX_DOTALL | UREGEX_MULTILINE | UREGEX_UWORD; if ((flags & ~allFlags) != 0) { status = U_REGEX_INVALID_FLAG; @@ -263,9 +276,10 @@ RegexPattern *RegexPattern::compile( // // compile with default flags. // -RegexPattern *RegexPattern::compile( const UnicodeString ®ex, - UParseError &pe, - UErrorCode &err) +RegexPattern * U_EXPORT2 +RegexPattern::compile(const UnicodeString ®ex, + UParseError &pe, + UErrorCode &err) { return compile(regex, 0, pe, err); } @@ -275,7 +289,8 @@ RegexPattern *RegexPattern::compile( const UnicodeString ®ex, // // compile with no UParseErr parameter. // -RegexPattern *RegexPattern::compile( const UnicodeString ®ex, +RegexPattern * U_EXPORT2 +RegexPattern::compile( const UnicodeString ®ex, uint32_t flags, UErrorCode &err) { @@ -309,6 +324,15 @@ RegexMatcher *RegexPattern::matcher(const UnicodeString &input, return retMatcher; }; +RegexMatcher *RegexPattern::matcher(const UChar * /*input*/, + UErrorCode &status) const +{ + /* This should never get called. The API with UnicodeString should be called instead. */ + if (U_SUCCESS(status)) { + status = U_UNSUPPORTED_ERROR; + } + return NULL; +} //--------------------------------------------------------------------- @@ -343,7 +367,7 @@ RegexMatcher *RegexPattern::matcher(UErrorCode &status) const { // with a pattern string and a data string. // //--------------------------------------------------------------------- -UBool RegexPattern::matches(const UnicodeString ®ex, +UBool U_EXPORT2 RegexPattern::matches(const UnicodeString ®ex, const UnicodeString &input, UParseError &pe, UErrorCode &status) { @@ -405,8 +429,8 @@ int32_t RegexPattern::split(const UnicodeString &input, // Debugging function only. // //--------------------------------------------------------------------- -void RegexPattern::dumpOp(int32_t index) const { #if defined(REGEX_DEBUG) +void RegexPattern::dumpOp(int32_t index) const { static const char * const opNames[] = {URX_OPCODE_NAMES}; int32_t op = fCompiledPat->elementAti(index); int32_t val = URX_VAL(op); @@ -416,7 +440,7 @@ void RegexPattern::dumpOp(int32_t index) const { pinnedType = 0; } - REGEX_DUMP_DEBUG_PRINTF("%4d %08x %-15s ", index, op, opNames[pinnedType]); + REGEX_DUMP_DEBUG_PRINTF(("%4d %08x %-15s ", index, op, opNames[pinnedType])); switch (type) { case URX_NOP: case URX_DOTANY: @@ -442,6 +466,7 @@ void RegexPattern::dumpOp(int32_t index) const { case URX_JMP_SAV: case URX_JMP_SAV_X: case URX_BACKSLASH_B: + case URX_BACKSLASH_BU: case URX_BACKSLASH_D: case URX_BACKSLASH_Z: case URX_STRING_LEN: @@ -466,12 +491,12 @@ void RegexPattern::dumpOp(int32_t index) const { case URX_LOOP_C: case URX_LOOP_DOT_I: // types with an integer operand field. - REGEX_DUMP_DEBUG_PRINTF("%d", val); + REGEX_DUMP_DEBUG_PRINTF(("%d", val)); break; case URX_ONECHAR: case URX_ONECHAR_I: - REGEX_DUMP_DEBUG_PRINTF("%c", val<256?val:'?'); + REGEX_DUMP_DEBUG_PRINTF(("%c", val<256?val:'?')); break; case URX_STRING: @@ -484,7 +509,7 @@ void RegexPattern::dumpOp(int32_t index) const { for (i=val; i= 256) {c = '.';} - REGEX_DUMP_DEBUG_PRINTF("%c", c); + REGEX_DUMP_DEBUG_PRINTF(("%c", c)); } } break; @@ -496,7 +521,7 @@ void RegexPattern::dumpOp(int32_t index) const { UnicodeSet *set = (UnicodeSet *)fSets->elementAt(val); set->toPattern(s, TRUE); for (int32_t i=0; itoPattern(s, TRUE); for (int32_t i=0; ifPattern.length(); i++) { + REGEX_DUMP_DEBUG_PRINTF(("%c", This->fPattern.charAt(i))); } - REGEX_DUMP_DEBUG_PRINTF("\n"); - REGEX_DUMP_DEBUG_PRINTF(" Min Match Length: %d\n", fMinMatchLen); - REGEX_DUMP_DEBUG_PRINTF(" Match Start Type: %s\n", START_OF_MATCH_STR(fStartType)); - if (fStartType == START_STRING) { - REGEX_DUMP_DEBUG_PRINTF(" Initial match sting: \""); - for (i=fInitialStringIdx; ifMinMatchLen)); + REGEX_DUMP_DEBUG_PRINTF((" Match Start Type: %s\n", START_OF_MATCH_STR(This->fStartType))); + if (This->fStartType == START_STRING) { + REGEX_DUMP_DEBUG_PRINTF((" Initial match sting: \"")); + for (i=This->fInitialStringIdx; ifInitialStringIdx+This->fInitialStringLen; i++) { + REGEX_DUMP_DEBUG_PRINTF(("%c", This->fLiteralText[i])); // TODO: non-printables, surrogates. } - } else if (fStartType == START_SET) { - int32_t numSetChars = fInitialChars->size(); + } else if (This->fStartType == START_SET) { + int32_t numSetChars = This->fInitialChars->size(); if (numSetChars > 20) { numSetChars = 20; } - REGEX_DUMP_DEBUG_PRINTF(" Match First Chars : "); + REGEX_DUMP_DEBUG_PRINTF((" Match First Chars : ")); for (i=0; icharAt(i); + UChar32 c = This->fInitialChars->charAt(i); if (0x20size()) { - REGEX_DUMP_DEBUG_PRINTF(" ..."); + if (numSetChars < This->fInitialChars->size()) { + REGEX_DUMP_DEBUG_PRINTF((" ...")); } - REGEX_DUMP_DEBUG_PRINTF("\n"); + REGEX_DUMP_DEBUG_PRINTF(("\n")); - } else if (fStartType == START_CHAR) { - REGEX_DUMP_DEBUG_PRINTF(" First char of Match : "); - if (0x20 < fInitialChar && fInitialChar<0x7e) { - REGEX_DUMP_DEBUG_PRINTF("%c\n", fInitialChar); + } else if (This->fStartType == START_CHAR) { + REGEX_DUMP_DEBUG_PRINTF((" First char of Match : ")); + if (0x20 < This->fInitialChar && This->fInitialChar<0x7e) { + REGEX_DUMP_DEBUG_PRINTF(("%c\n", This->fInitialChar)); } else { - REGEX_DUMP_DEBUG_PRINTF("%#x\n", fInitialChar); + REGEX_DUMP_DEBUG_PRINTF(("%#x\n", This->fInitialChar)); } } - REGEX_DUMP_DEBUG_PRINTF("\nIndex Binary Type Operand\n" - "-------------------------------------------\n"); - for (index = 0; indexsize(); index++) { - dumpOp(index); + REGEX_DUMP_DEBUG_PRINTF(("\nIndex Binary Type Operand\n" \ + "-------------------------------------------\n")); + for (index = 0; indexfCompiledPat->size(); index++) { + This->dumpOp(index); } - REGEX_DUMP_DEBUG_PRINTF("\n\n"); -#endif + REGEX_DUMP_DEBUG_PRINTF(("\n\n")); }; +#endif -const char RegexPattern::fgClassID = 0; - -//---------------------------------------------------------------------------------- -// -// regex_cleanup Memory cleanup function, free/delete all -// cached memory. Called by ICU's u_cleanup() function. -// -//---------------------------------------------------------------------------------- -U_CFUNC UBool -regex_cleanup(void) { - RegexCompile::cleanup(); - return TRUE; -}; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(RegexPattern) U_NAMESPACE_END #endif // !UCONFIG_NO_REGULAR_EXPRESSIONS diff --git a/icuSources/i18n/search.cpp b/icuSources/i18n/search.cpp index fca18fe7..c190e94b 100644 --- a/icuSources/i18n/search.cpp +++ b/icuSources/i18n/search.cpp @@ -235,14 +235,14 @@ int32_t SearchIterator::next(UErrorCode &status) } if (matchlength > 0) { - // if matchlength is 0 we are at the start of the iteration - if (m_search_->isOverlap) { - offset ++; - } - else { - offset += matchlength; - } - } + // if matchlength is 0 we are at the start of the iteration + if (m_search_->isOverlap) { + offset ++; + } + else { + offset += matchlength; + } + } return handleNext(offset, status); } return USEARCH_DONE; diff --git a/icuSources/i18n/simpletz.cpp b/icuSources/i18n/simpletz.cpp index 03b710b3..393d339d 100644 --- a/icuSources/i18n/simpletz.cpp +++ b/icuSources/i18n/simpletz.cpp @@ -27,17 +27,16 @@ #include "unicode/simpletz.h" #include "unicode/gregocal.h" -#include "tzdat.h" U_NAMESPACE_BEGIN -const char SimpleTimeZone::fgClassID = 0; // Value is irrelevant +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SimpleTimeZone) // WARNING: assumes that no rule is measured from the end of February, // since we don't handle leap years. Could handle assuming always // Gregorian, since we know they didn't have daylight time when // Gregorian calendar started. -const int8_t SimpleTimeZone::staticMonthLength[] = {31,28,31,30,31,30,31,31,30,31,30,31}; +const int8_t SimpleTimeZone::STATICMONTHLENGTH[] = {31,29,31,30,31,30,31,31,30,31,30,31}; // ***************************************************************************** // class SimpleTimeZone @@ -121,40 +120,6 @@ SimpleTimeZone::SimpleTimeZone(int32_t rawOffsetGMT, const UnicodeString& ID, savingsDST, status); } -/** - * Construct from memory-mapped data. For private use by TimeZone. - */ -SimpleTimeZone::SimpleTimeZone(const StandardZone& stdZone, - const UnicodeString& ID) -: TimeZone(ID) -{ - UErrorCode status = U_ZERO_ERROR; - construct(stdZone.gmtOffset, - 0, 0, 0, 0, WALL_TIME, - 0, 0, 0, 0, WALL_TIME, - 0, status); -} - -/** - * Construct from memory-mapped data. For private use by TimeZone. - */ -SimpleTimeZone::SimpleTimeZone(const DSTZone& dstZone, - const UnicodeString& ID) -: TimeZone(ID) -{ - UErrorCode status = U_ZERO_ERROR; - construct(dstZone.gmtOffset, - dstZone.onsetRule.month, dstZone.onsetRule.dowim, - dstZone.onsetRule.dow, - dstZone.onsetRule.time * (int32_t)60000, - (TimeMode)dstZone.onsetRule.mode, - dstZone.ceaseRule.month, dstZone.ceaseRule.dowim, - dstZone.ceaseRule.dow, - dstZone.ceaseRule.time * (int32_t)60000, - (TimeMode)dstZone.ceaseRule.mode, - dstZone.dstSavings * (int32_t)60000, status); -} - /** * Internal construction method. */ @@ -403,7 +368,7 @@ int32_t SimpleTimeZone::getOffset(uint8_t era, int32_t year, int32_t month, int32_t day, uint8_t dayOfWeek, int32_t millis, UErrorCode& status) const { - // Check the month before indexing into staticMonthLength. This + // Check the month before indexing into STATICMONTHLENGTH. This // duplicates the test that occurs in the 7-argument getOffset(), // however, this is unavoidable. We don't mind because this method, in // fact, should not be called; internal code should always call the @@ -415,14 +380,14 @@ SimpleTimeZone::getOffset(uint8_t era, int32_t year, int32_t month, int32_t day, return 0; } - return getOffset(era, year, month, day, dayOfWeek, millis, staticMonthLength[month], status); + return getOffset(era, year, month, day, dayOfWeek, millis, STATICMONTHLENGTH[month], status); } int32_t SimpleTimeZone::getOffset(uint8_t era, int32_t year, int32_t month, int32_t day, uint8_t dayOfWeek, int32_t millis, int32_t monthLength, UErrorCode& status) const { - // Check the month before indexing into staticMonthLength. This + // Check the month before indexing into STATICMONTHLENGTH. This // duplicates a test that occurs in the 9-argument getOffset(), // however, this is unavoidable. We don't mind because this method, in // fact, should not be called; internal code should always call the @@ -436,7 +401,7 @@ SimpleTimeZone::getOffset(uint8_t era, int32_t year, int32_t month, int32_t day, } // TODO FIX We don't handle leap years yet! - int32_t prevMonthLength = (month >= 1) ? staticMonthLength[month - 1] : 31; + int32_t prevMonthLength = (month >= 1) ? STATICMONTHLENGTH[month - 1] : 31; return getOffset(era, year, month, day, dayOfWeek, millis, monthLength, prevMonthLength, status); @@ -460,7 +425,9 @@ SimpleTimeZone::getOffset(uint8_t era, int32_t year, int32_t month, int32_t day, || millis < 0 || millis >= U_MILLIS_PER_DAY || monthLength < 28 - || monthLength > 31) { + || monthLength > 31 + || prevMonthLength < 28 + || prevMonthLength > 31) { status = U_ILLEGAL_ARGUMENT_ERROR; return -1; } @@ -579,7 +546,7 @@ SimpleTimeZone::compareToRule(int8_t month, int8_t monthLen, int8_t prevMonthLen // if ruleDay is negative (we assume it's not zero here), we have to do // the same calculation figuring backward from the last day of the month. - // (staticMonthLength gives us that last day. We don't take leap years + // (STATICMONTHLENGTH gives us that last day. We don't take leap years // into account, so this may not work right for February.) else { @@ -855,7 +822,7 @@ SimpleTimeZone::decodeStartRule(UErrorCode& status) status = U_ILLEGAL_ARGUMENT_ERROR; return; } - } else if (startDay > staticMonthLength[startMonth]) { + } else if (startDay > STATICMONTHLENGTH[startMonth]) { status = U_ILLEGAL_ARGUMENT_ERROR; return; } @@ -910,7 +877,7 @@ SimpleTimeZone::decodeEndRule(UErrorCode& status) status = U_ILLEGAL_ARGUMENT_ERROR; return; } - } else if (endDay > staticMonthLength[endMonth]) { + } else if (endDay > STATICMONTHLENGTH[endMonth]) { status = U_ILLEGAL_ARGUMENT_ERROR; return; } diff --git a/icuSources/i18n/smpdtfmt.cpp b/icuSources/i18n/smpdtfmt.cpp index a8387677..f4e81130 100644 --- a/icuSources/i18n/smpdtfmt.cpp +++ b/icuSources/i18n/smpdtfmt.cpp @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 1997-2003, International Business Machines Corporation and * +* Copyright (C) 1997-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* * @@ -30,7 +30,7 @@ #include "unicode/smpdtfmt.h" #include "unicode/dtfmtsym.h" -#include "unicode/resbund.h" +#include "unicode/ures.h" #include "unicode/msgfmt.h" #include "unicode/calendar.h" #include "unicode/gregocal.h" @@ -39,25 +39,35 @@ #include "unicode/dcfmtsym.h" #include "unicode/uchar.h" #include "unicode/ustring.h" -#include "uprops.h" +#include "util.h" +#include "gregoimp.h" +#include "cstring.h" +#include "uassert.h" #include +#if defined( U_DEBUG_CALSVC ) || defined (U_DEBUG_CAL) +#include +#endif + // ***************************************************************************** // class SimpleDateFormat // ***************************************************************************** U_NAMESPACE_BEGIN +/** + * Last-resort string to use for "GMT" when constructing time zone strings. + */ // For time zones that have no names, use strings GMT+minutes and // GMT-minutes. For instance, in France the time zone is GMT+60. // Also accepted are GMT+H:MM or GMT-H:MM. -const UChar SimpleDateFormat::fgGmt[] = {0x0047, 0x004D, 0x0054, 0x0000}; // "GMT" -const UChar SimpleDateFormat::fgGmtPlus[] = {0x0047, 0x004D, 0x0054, 0x002B, 0x0000}; // "GMT+" -const UChar SimpleDateFormat::fgGmtMinus[] = {0x0047, 0x004D, 0x0054, 0x002D, 0x0000}; // "GMT-" +static const UChar gGmt[] = {0x0047, 0x004D, 0x0054, 0x0000}; // "GMT" +static const UChar gGmtPlus[] = {0x0047, 0x004D, 0x0054, 0x002B, 0x0000}; // "GMT+" +static const UChar gGmtMinus[] = {0x0047, 0x004D, 0x0054, 0x002D, 0x0000}; // "GMT-" // This is a pattern-of-last-resort used when we can't load a usable pattern out // of a resource. -const UChar SimpleDateFormat::fgDefaultPattern[] = +static const UChar gDefaultPattern[] = { 0x79, 0x79, 0x79, 0x79, 0x4D, 0x4D, 0x64, 0x64, 0x20, 0x68, 0x68, 0x3A, 0x6D, 0x6D, 0x20, 0x61, 0 }; /* "yyyyMMdd hh:mm a" */ @@ -71,15 +81,9 @@ static const UChar SUPPRESS_NEGATIVE_PREFIX[] = {0xAB00, 0}; * These are the tags we expect to see in normal resource bundle files associated * with a locale. */ -const char SimpleDateFormat::fgDateTimePatternsTag[]="DateTimePatterns"; +static const char gDateTimePatternsTag[]="DateTimePatterns"; -const char SimpleDateFormat::fgClassID = 0; // Value is irrelevant - -/** - * This value of defaultCenturyStart indicates that the system default is to be - * used. To be removed in 2.8 - */ -const UDate SimpleDateFormat::fgSystemDefaultCentury = DBL_MIN; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SimpleDateFormat) static const UChar QUOTE = 0x27; // Single quote @@ -179,7 +183,7 @@ SimpleDateFormat::SimpleDateFormat(EStyle timeStyle, */ SimpleDateFormat::SimpleDateFormat(const Locale& locale, UErrorCode& status) -: fPattern(fgDefaultPattern), +: fPattern(gDefaultPattern), fLocale(locale), fSymbols(NULL) { @@ -247,9 +251,8 @@ SimpleDateFormat::clone() const UBool SimpleDateFormat::operator==(const Format& other) const { - if (DateFormat::operator==(other) && - other.getDynamicClassID() == getStaticClassID()) - { + if (DateFormat::operator==(other)) { + // DateFormat::operator== guarantees following cast is safe SimpleDateFormat* that = (SimpleDateFormat*)&other; return (fPattern == that->fPattern && fSymbols != NULL && // Check for pathological object @@ -269,27 +272,24 @@ void SimpleDateFormat::construct(EStyle timeStyle, UErrorCode& status) { // called by several constructors to load pattern data from the resources - if (U_FAILURE(status)) return; - // load up the DateTimePatterns resource from the appropriate locale (throw - // an error if for some weird reason the resource is malformed) - - ResourceBundle resources((char *)0, locale, status); - // We will need the calendar to know what type of symbols to load. initializeCalendar(NULL, locale, status); - // use Date Format Symbols' helper function to do the actual load. - ResourceBundle dateTimePatterns = DateFormatSymbols::getData(resources, fgDateTimePatternsTag, fCalendar?fCalendar->getType():NULL, status); + CalendarData calData(locale, fCalendar?fCalendar->getType():NULL, status); + UResourceBundle *dateTimePatterns = calData.getByKey(gDateTimePatternsTag, status); if (U_FAILURE(status)) return; - if (dateTimePatterns.getSize() <= kDateTime) + if (ures_getSize(dateTimePatterns) <= kDateTime) { status = U_INVALID_FORMAT_ERROR; return; } + setLocaleIDs(ures_getLocaleByType(dateTimePatterns, ULOC_VALID_LOCALE, &status), + ures_getLocaleByType(dateTimePatterns, ULOC_ACTUAL_LOCALE, &status)); + // create a symbols object from the locale initializeSymbols(locale,fCalendar, status); if (U_FAILURE(status)) return; @@ -299,52 +299,43 @@ void SimpleDateFormat::construct(EStyle timeStyle, return; } - UnicodeString str; - - // Move dateStyle from the range [0, 3] to [4, 7] if necessary - //if (dateStyle >= 0 && dateStyle < DATE_OFFSET) dateStyle = (EStyle)(dateStyle + DATE_OFFSET); + const UChar *resStr; + int32_t resStrLen = 0; // if the pattern should include both date and time information, use the date/time // pattern string as a guide to tell use how to glue together the appropriate date // and time pattern strings. The actual gluing-together is handled by a convenience // method on MessageFormat. - if ((timeStyle != kNone) && - (dateStyle != kNone)) + if ((timeStyle != kNone) && (dateStyle != kNone)) { - // Object[] dateTimeArgs = { - // dateTimePatterns[timeStyle], dateTimePatterns[dateStyle] - // }; - // pattern = MessageFormat.format(dateTimePatterns[8], dateTimeArgs); + Formattable timeDateArray[2]; - Formattable *timeDateArray = new Formattable[2]; - /* test for NULL */ - if (timeDateArray == 0) { - status = U_MEMORY_ALLOCATION_ERROR; - return; - } - //timeDateArray[0].setString(UnicodeString(dateTimePatterns[timeStyle])); - //timeDateArray[1].setString(UnicodeString(dateTimePatterns[dateStyle])); // use Formattable::adoptString() so that we can use fastCopyFrom() // instead of Formattable::setString()'s unaware, safe, deep string clone // see Jitterbug 2296 - timeDateArray[0].adoptString(&(new UnicodeString)->fastCopyFrom(dateTimePatterns.getStringEx(timeStyle, status))); - timeDateArray[1].adoptString(&(new UnicodeString)->fastCopyFrom(dateTimePatterns.getStringEx(dateStyle, status))); + resStr = ures_getStringByIndex(dateTimePatterns, (int32_t)timeStyle, &resStrLen, &status); + timeDateArray[0].adoptString(new UnicodeString(TRUE, resStr, resStrLen)); + resStr = ures_getStringByIndex(dateTimePatterns, (int32_t)dateStyle, &resStrLen, &status); + timeDateArray[1].adoptString(new UnicodeString(TRUE, resStr, resStrLen)); - //MessageFormat::format(UnicodeString(dateTimePatterns[kDateTime]), timeDateArray, 2, fPattern, status); - MessageFormat::format(dateTimePatterns.getStringEx(kDateTime, status), timeDateArray, 2, fPattern, status); - delete [] timeDateArray; + resStr = ures_getStringByIndex(dateTimePatterns, (int32_t)kDateTime, &resStrLen, &status); + MessageFormat::format(UnicodeString(TRUE, resStr, resStrLen), timeDateArray, 2, fPattern, status); } - // if the pattern includes just time data or just date date, load the appropriate // pattern string from the resources - //else if (timeStyle != kNone) fPattern = UnicodeString(dateTimePatterns[timeStyle]); - //else if (dateStyle != kNone) fPattern = UnicodeString(dateTimePatterns[dateStyle]); - // fastCopyFrom() - see DateFormatSymbols::assignArray comments - else if (timeStyle != kNone) fPattern.fastCopyFrom(dateTimePatterns.getStringEx(timeStyle, status)); - else if (dateStyle != kNone) fPattern.fastCopyFrom(dateTimePatterns.getStringEx(dateStyle, status)); + // setTo() - see DateFormatSymbols::assignArray comments + else if (timeStyle != kNone) { + resStr = ures_getStringByIndex(dateTimePatterns, (int32_t)timeStyle, &resStrLen, &status); + fPattern.setTo(TRUE, resStr, resStrLen); + } + else if (dateStyle != kNone) { + resStr = ures_getStringByIndex(dateTimePatterns, (int32_t)dateStyle, &resStrLen, &status); + fPattern.setTo(TRUE, resStr, resStrLen); + } // and if it includes _neither_, that's an error - else status = U_INVALID_FORMAT_ERROR; + else + status = U_INVALID_FORMAT_ERROR; // finally, finish initializing by creating a Calendar and a NumberFormat initialize(locale, status); @@ -525,33 +516,44 @@ SimpleDateFormat::format(const Formattable& obj, const UCalendarDateFields SimpleDateFormat::fgPatternIndexToCalendarField[] = { - UCAL_ERA, UCAL_YEAR, UCAL_MONTH, UCAL_DATE, - UCAL_HOUR_OF_DAY, UCAL_HOUR_OF_DAY, UCAL_MINUTE, - UCAL_SECOND, UCAL_MILLISECOND, UCAL_DAY_OF_WEEK, - UCAL_DAY_OF_YEAR, UCAL_DAY_OF_WEEK_IN_MONTH, - UCAL_WEEK_OF_YEAR, UCAL_WEEK_OF_MONTH, - UCAL_AM_PM, UCAL_HOUR, UCAL_HOUR, UCAL_ZONE_OFFSET, - UCAL_YEAR_WOY, UCAL_DOW_LOCAL + /*GyM*/ UCAL_ERA, UCAL_YEAR, UCAL_MONTH, + /*dkH*/ UCAL_DATE, UCAL_HOUR_OF_DAY, UCAL_HOUR_OF_DAY, + /*msS*/ UCAL_MINUTE, UCAL_SECOND, UCAL_MILLISECOND, + /*EDF*/ UCAL_DAY_OF_WEEK, UCAL_DAY_OF_YEAR, UCAL_DAY_OF_WEEK_IN_MONTH, + /*wWa*/ UCAL_WEEK_OF_YEAR, UCAL_WEEK_OF_MONTH, UCAL_AM_PM, + /*hKz*/ UCAL_HOUR, UCAL_HOUR, UCAL_ZONE_OFFSET, + /*Yeu*/ UCAL_YEAR_WOY, UCAL_DOW_LOCAL, UCAL_EXTENDED_YEAR, + /*gAZ*/ UCAL_JULIAN_DAY, UCAL_MILLISECONDS_IN_DAY, UCAL_ZONE_OFFSET }; // Map index into pattern character string to DateFormat field number -const DateFormat::EField +const UDateFormatField SimpleDateFormat::fgPatternIndexToDateFormatField[] = { - DateFormat::kEraField, DateFormat::kYearField, DateFormat::kMonthField, - DateFormat::kDateField, DateFormat::kHourOfDay1Field, - DateFormat::kHourOfDay0Field, DateFormat::kMinuteField, - DateFormat::kSecondField, DateFormat::kMillisecondField, - DateFormat::kDayOfWeekField, DateFormat::kDayOfYearField, - DateFormat::kDayOfWeekInMonthField, DateFormat::kWeekOfYearField, - DateFormat::kWeekOfMonthField, DateFormat::kAmPmField, - DateFormat::kHour1Field, DateFormat::kHour0Field, - DateFormat::kTimezoneField, DateFormat::kYearWOYField, - DateFormat::kDOWLocalField + /*GyM*/ UDAT_ERA_FIELD, UDAT_YEAR_FIELD, UDAT_MONTH_FIELD, + /*dkH*/ UDAT_DATE_FIELD, UDAT_HOUR_OF_DAY1_FIELD, UDAT_HOUR_OF_DAY0_FIELD, + /*msS*/ UDAT_MINUTE_FIELD, UDAT_SECOND_FIELD, UDAT_FRACTIONAL_SECOND_FIELD, + /*EDF*/ UDAT_DAY_OF_WEEK_FIELD, UDAT_DAY_OF_YEAR_FIELD, UDAT_DAY_OF_WEEK_IN_MONTH_FIELD, + /*wWa*/ UDAT_WEEK_OF_YEAR_FIELD, UDAT_WEEK_OF_MONTH_FIELD, UDAT_AM_PM_FIELD, + /*hKz*/ UDAT_HOUR1_FIELD, UDAT_HOUR0_FIELD, UDAT_TIMEZONE_FIELD, + /*Yeu*/ UDAT_YEAR_WOY_FIELD, UDAT_DOW_LOCAL_FIELD, UDAT_EXTENDED_YEAR_FIELD, + /*gAZ*/ UDAT_JULIAN_DAY_FIELD, UDAT_MILLISECONDS_IN_DAY_FIELD, UDAT_TIMEZONE_RFC_FIELD }; - //---------------------------------------------------------------------- +/** + * Append symbols[value] to dst. Make sure the array index is not out + * of bounds. + */ +inline void +_appendSymbol(UnicodeString& dst, + int32_t value, + const UnicodeString* symbols, + int32_t symbolsCount) { + U_ASSERT(value >= 0 && value < symbolsCount); + dst += symbols[value]; +} + void SimpleDateFormat::subFormat(UnicodeString &appendTo, UChar ch, @@ -560,11 +562,15 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, Calendar& cal, UErrorCode& status) const { + if (U_FAILURE(status)) { + return; + } + // this function gets called by format() to produce the appropriate substitution // text for an individual pattern symbol (e.g., "HH" or "yyyy") UChar *patternCharPtr = u_strchr(DateFormatSymbols::getPatternUChars(), ch); - EField patternCharIndex; + UDateFormatField patternCharIndex; const int32_t maxIntCount = 10; int32_t beginOffset = appendTo.length(); @@ -572,9 +578,10 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, if (patternCharPtr == NULL) { status = U_INVALID_FORMAT_ERROR; + return; } - patternCharIndex = (EField)(patternCharPtr - DateFormatSymbols::getPatternUChars()); + patternCharIndex = (UDateFormatField)(patternCharPtr - DateFormatSymbols::getPatternUChars()); UCalendarDateFields field = fgPatternIndexToCalendarField[patternCharIndex]; int32_t value = cal.get(field, status); if (U_FAILURE(status)) { @@ -584,13 +591,13 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, switch (patternCharIndex) { // for any "G" symbol, write out the appropriate era string - case kEraField: - appendTo += fSymbols->fEras[value]; + case UDAT_ERA_FIELD: + _appendSymbol(appendTo, value, fSymbols->fEras, fSymbols->fErasCount); break; // for "yyyy", write out the whole year; for "yy", write out the last 2 digits - case kYearField: - case kYearWOYField: + case UDAT_YEAR_FIELD: + case UDAT_YEAR_WOY_FIELD: if (count >= 4) zeroPaddingNumber(appendTo, value, 4, maxIntCount); else if(count == 1) @@ -602,51 +609,63 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, // for "MMMM", write out the whole month name, for "MMM", write out the month // abbreviation, for "M" or "MM", write out the month as a number with the // appropriate number of digits - case kMonthField: + case UDAT_MONTH_FIELD: if (count >= 4) - appendTo += fSymbols->fMonths[value]; + _appendSymbol(appendTo, value, fSymbols->fMonths, + fSymbols->fMonthsCount); else if (count == 3) - appendTo += fSymbols->fShortMonths[value]; + _appendSymbol(appendTo, value, fSymbols->fShortMonths, + fSymbols->fShortMonthsCount); else zeroPaddingNumber(appendTo, value + 1, count, maxIntCount); break; // for "k" and "kk", write out the hour, adjusting midnight to appear as "24" - case kHourOfDay1Field: + case UDAT_HOUR_OF_DAY1_FIELD: if (value == 0) zeroPaddingNumber(appendTo, cal.getMaximum(UCAL_HOUR_OF_DAY) + 1, count, maxIntCount); else zeroPaddingNumber(appendTo, value, count, maxIntCount); break; - // for "SS" and "S", we want to truncate digits so that you still see the MOST - // significant digits rather than the LEAST (as is the case with the year) - case kMillisecondField: - if (count > 3) - count = 3; - else if (count == 2) - value = value / 10; - else if (count == 1) - value = value / 100; - zeroPaddingNumber(appendTo, value, count, maxIntCount); + case UDAT_FRACTIONAL_SECOND_FIELD: + // Fractional seconds left-justify + { + fNumberFormat->setMinimumIntegerDigits((count > 3) ? 3 : count); + fNumberFormat->setMaximumIntegerDigits(maxIntCount); + if (count == 1) { + value = (value + 50) / 100; + } else if (count == 2) { + value = (value + 5) / 10; + } + FieldPosition p(0); + fNumberFormat->format(value, appendTo, p); + if (count > 3) { + fNumberFormat->setMinimumIntegerDigits(count - 3); + fNumberFormat->format((int32_t)0, appendTo, p); + } + } break; // for "EEEE", write out the day-of-the-week name; otherwise, use the abbreviation - case kDayOfWeekField: + case UDAT_DAY_OF_WEEK_FIELD: if (count >= 4) - appendTo += fSymbols->fWeekdays[value]; + _appendSymbol(appendTo, value, fSymbols->fWeekdays, + fSymbols->fWeekdaysCount); else - appendTo += fSymbols->fShortWeekdays[value]; + _appendSymbol(appendTo, value, fSymbols->fShortWeekdays, + fSymbols->fShortWeekdaysCount); break; // for and "a" symbol, write out the whole AM/PM string - case kAmPmField: - appendTo += fSymbols->fAmPms[value]; + case UDAT_AM_PM_FIELD: + _appendSymbol(appendTo, value, fSymbols->fAmPms, + fSymbols->fAmPmsCount); break; // for "h" and "hh", write out the hour, adjusting noon and midnight to show up // as "12" - case kHour1Field: + case UDAT_HOUR1_FIELD: if (value == 0) zeroPaddingNumber(appendTo, cal.getLeastMaximum(UCAL_HOUR) + 1, count, maxIntCount); else @@ -659,7 +678,7 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, // since the name will be different). If we don't have a localized time zone name, // then the time zone shows up as "GMT+hh:mm" or "GMT-hh:mm" (where "hh:mm" is the // offset from GMT) regardless of how many z's were in the pattern symbol - case kTimezoneField: { + case UDAT_TIMEZONE_FIELD: { UnicodeString str; int32_t zoneIndex = fSymbols->getZoneIndex(cal.getTimeZone().getID(str)); if (zoneIndex == -1) { @@ -667,11 +686,11 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, cal.get(UCAL_DST_OFFSET, status); if (value < 0) { - appendTo += fgGmtMinus; + appendTo += gGmtMinus; value = -value; // suppress the '-' sign for text display. } else - appendTo += fgGmtPlus; + appendTo += gGmtPlus; zeroPaddingNumber(appendTo, (int32_t)(value/U_MILLIS_PER_HOUR), 2, 2); appendTo += (UChar)0x003A /*':'*/; @@ -692,30 +711,34 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, } break; + case 23: // 'Z' - TIMEZONE_RFC + { + UChar sign = 43/*'+'*/; + value = (cal.get(UCAL_ZONE_OFFSET, status) + + cal.get(UCAL_DST_OFFSET, status)) / U_MILLIS_PER_MINUTE; + if (value < 0) { + value = -value; + sign = 45/*'-'*/; + } + value = (value / 3) * 5 + (value % 60); // minutes => KKmm + appendTo += sign; + zeroPaddingNumber(appendTo, value, 4, 4); + } + break; + // all of the other pattern symbols can be formatted as simple numbers with // appropriate zero padding default: - // case kDateField: - // case kHourOfDay0Field: - // case kMinuteField: - // case kSecondField: - // case kDayOfYearField: - // case kDayOfWeekInMonthField: - // case kWeekOfYearField: - // case kWeekOfMonthField: - // case kHour0Field: - // case kDOWLocalField: zeroPaddingNumber(appendTo, value, count, maxIntCount); break; } // if the field we're formatting is the one the FieldPosition says it's interested // in, fill in the FieldPosition with this field's positions - if (pos.getField() == fgPatternIndexToDateFormatField[patternCharIndex]) { - if (pos.getBeginIndex() == 0 && pos.getEndIndex() == 0) { - pos.setBeginIndex(beginOffset); - pos.setEndIndex(appendTo.length()); - } + if (pos.getBeginIndex() == pos.getEndIndex() && + pos.getField() == fgPatternIndexToDateFormatField[patternCharIndex]) { + pos.setBeginIndex(beginOffset); + pos.setEndIndex(appendTo.length()); } } @@ -1015,19 +1038,23 @@ int32_t SimpleDateFormat::matchString(const UnicodeString& text, // {sfb} kludge to support case-insensitive comparison // {markus 2002oct11} do not just use caseCompareBetween because we do not know // the length of the match after case folding - UnicodeString lcaseText; - lcaseText.fastCopyFrom(text).foldCase(); + // {alan 20040607} don't case change the whole string, since the length + // can change + // TODO we need a case-insensitive startsWith function + UnicodeString lcase, lcaseText; + text.extract(start, INT32_MAX, lcaseText); + lcaseText.foldCase(); for (; i < count; ++i) { - int32_t length = data[i].length(); // Always compare if we have no match yet; otherwise only compare // against potentially better matches (longer strings). - UnicodeString lcase; lcase.fastCopyFrom(data[i]).foldCase(); + int32_t length = lcase.length(); - if (length > bestMatchLength && (lcaseText.compareBetween(start, start + length, lcase, 0, length)) == 0) + if (length > bestMatchLength && + lcaseText.compareBetween(0, length, lcase, 0, length) == 0) { bestMatch = i; bestMatchLength = length; @@ -1036,7 +1063,33 @@ int32_t SimpleDateFormat::matchString(const UnicodeString& text, if (bestMatch >= 0) { cal.set(field, bestMatch); - return start + bestMatchLength; + + // Once we have a match, we have to determine the length of the + // original source string. This will usually be == the length of + // the case folded string, but it may differ (e.g. sharp s). + lcase.fastCopyFrom(data[bestMatch]).foldCase(); + + // Most of the time, the length will be the same as the length + // of the string from the locale data. Sometimes it will be + // different, in which case we will have to figure it out by + // adding a character at a time, until we have a match. We do + // this all in one loop, where we try 'len' first (at index + // i==0). + int32_t len = data[bestMatch].length(); // 99+% of the time + int32_t n = text.length() - start; + for (i=0; i<=n; ++i) { + int32_t j=i; + if (i == 0) { + j = len; + } else if (i == len) { + continue; // already tried this when i was 0 + } + text.extract(start, j, lcaseText); + lcaseText.foldCase(); + if (lcase == lcaseText) { + return start + j; + } + } } return -start; @@ -1071,11 +1124,15 @@ int32_t SimpleDateFormat::subParse(const UnicodeString& text, int32_t& start, UC UnicodeString temp; UChar *patternCharPtr = u_strchr(DateFormatSymbols::getPatternUChars(), ch); +#if defined (U_DEBUG_CAL) + //fprintf(stderr, "%s:%d - [%c] st=%d \n", __FILE__, __LINE__, (char) ch, start); +#endif + if (patternCharPtr == NULL) { return -start; } - patternCharIndex = (EField)(patternCharPtr - DateFormatSymbols::getPatternUChars()); + patternCharIndex = (UDateFormatField)(patternCharPtr - DateFormatSymbols::getPatternUChars()); UCalendarDateFields field = fgPatternIndexToCalendarField[patternCharIndex]; @@ -1097,13 +1154,14 @@ int32_t SimpleDateFormat::subParse(const UnicodeString& text, int32_t& start, UC // a number value. We handle further, more generic cases below. We need // to handle some of them here because some fields require extra processing on // the parsed value. - if (patternCharIndex == kHourOfDay1Field /*HOUR_OF_DAY1_FIELD*/ || - patternCharIndex == kHour1Field /*HOUR1_FIELD*/ || - (patternCharIndex == kMonthField /*MONTH_FIELD*/ && count <= 2) || - patternCharIndex == kYearField /*YEAR*/ || - patternCharIndex == kYearWOYField) + if (patternCharIndex == UDAT_HOUR_OF_DAY1_FIELD || + patternCharIndex == UDAT_HOUR1_FIELD || + (patternCharIndex == UDAT_MONTH_FIELD && count <= 2) || + patternCharIndex == UDAT_YEAR_FIELD || + patternCharIndex == UDAT_YEAR_WOY_FIELD || + patternCharIndex == UDAT_FRACTIONAL_SECOND_FIELD) { - int32_t parseStart = pos.getIndex(); // WORK AROUND BUG IN NUMBER FORMAT IN 1.2B3 + int32_t parseStart = pos.getIndex(); // It would be good to unify this with the obeyCount logic below, // but that's going to be difficult. const UnicodeString* src; @@ -1118,15 +1176,14 @@ int32_t SimpleDateFormat::subParse(const UnicodeString& text, int32_t& start, UC } parseInt(*src, number, pos, allowNegative); if (pos.getIndex() == parseStart) - // WORK AROUND BUG IN NUMBER FORMAT IN 1.2B3 return -start; value = number.getLong(); } switch (patternCharIndex) { - case kEraField: + case UDAT_ERA_FIELD: return matchString(text, start, UCAL_ERA, fSymbols->fEras, fSymbols->fErasCount, cal); - case kYearField: + case UDAT_YEAR_FIELD: // If there are 3 or more YEAR pattern characters, this indicates // that the year value is to be treated literally, without any // two-digit year adjustments (e.g., from "01" to 2001). Otherwise @@ -1154,8 +1211,8 @@ int32_t SimpleDateFormat::subParse(const UnicodeString& text, int32_t& start, UC } cal.set(UCAL_YEAR, value); return pos.getIndex(); - case kYearWOYField: - // Comment is the same as for kYearFields - look above + case UDAT_YEAR_WOY_FIELD: + // Comment is the same as for UDAT_Year_FIELDs - look above if (count <= 2 && (pos.getIndex() - start) == 2 && u_isdigit(text.charAt(start)) && u_isdigit(text.charAt(start+1)) @@ -1168,7 +1225,7 @@ int32_t SimpleDateFormat::subParse(const UnicodeString& text, int32_t& start, UC } cal.set(UCAL_YEAR_WOY, value); return pos.getIndex(); - case kMonthField: + case UDAT_MONTH_FIELD: if (count <= 2) // i.e., M or MM. { // Don't want to parse the month if it is a string @@ -1190,13 +1247,31 @@ int32_t SimpleDateFormat::subParse(const UnicodeString& text, int32_t& start, UC return matchString(text, start, UCAL_MONTH, fSymbols->fShortMonths, fSymbols->fShortMonthsCount, cal); } - case kHourOfDay1Field: + case UDAT_HOUR_OF_DAY1_FIELD: // [We computed 'value' above.] if (value == cal.getMaximum(UCAL_HOUR_OF_DAY) + 1) value = 0; cal.set(UCAL_HOUR_OF_DAY, value); return pos.getIndex(); - case kDayOfWeekField: + case UDAT_FRACTIONAL_SECOND_FIELD: + // Fractional seconds left-justify + i = pos.getIndex() - start; + if (i < 3) { + while (i < 3) { + value *= 10; + i++; + } + } else { + int32_t a = 1; + while (i > 3) { + a *= 10; + i--; + } + value = (value + (a>>1)) / a; + } + cal.set(UCAL_MILLISECOND, value); + return pos.getIndex(); + case UDAT_DAY_OF_WEEK_FIELD: { // Want to be able to parse both short and long forms. // Try count == 4 (DDDD) first: @@ -1208,15 +1283,16 @@ int32_t SimpleDateFormat::subParse(const UnicodeString& text, int32_t& start, UC return matchString(text, start, UCAL_DAY_OF_WEEK, fSymbols->fShortWeekdays, fSymbols->fShortWeekdaysCount, cal); } - case kAmPmField: + case UDAT_AM_PM_FIELD: return matchString(text, start, UCAL_AM_PM, fSymbols->fAmPms, fSymbols->fAmPmsCount, cal); - case kHour1Field: + case UDAT_HOUR1_FIELD: // [We computed 'value' above.] if (value == cal.getLeastMaximum(UCAL_HOUR)+1) value = 0; cal.set(UCAL_HOUR, value); return pos.getIndex(); - case kTimezoneField: + case UDAT_TIMEZONE_FIELD: + case UDAT_TIMEZONE_RFC_FIELD: { // First try to parse generic forms such as GMT-07:00. Do this first // in case localized DateFormatZoneData contains the string "GMT" @@ -1224,7 +1300,7 @@ int32_t SimpleDateFormat::subParse(const UnicodeString& text, int32_t& start, UC // characters of GMT+/-HH:MM etc. UnicodeString lcaseText(text); - UnicodeString lcaseGMT(fgGmt); + UnicodeString lcaseGMT(gGmt); int32_t sign = 0; int32_t offset; int32_t gmtLen = lcaseGMT.length(); @@ -1257,23 +1333,19 @@ int32_t SimpleDateFormat::subParse(const UnicodeString& text, int32_t& start, UC // Look for hours:minutes or hhmm. pos.setIndex(pos.getIndex() + 1); - // WORK AROUND BUG IN NUMBER FORMAT IN 1.2B3 int32_t parseStart = pos.getIndex(); Formattable tzNumber; fNumberFormat->parse(text, tzNumber, pos); if( pos.getIndex() == parseStart) { - // WORK AROUND BUG IN NUMBER FORMAT IN 1.2B3 return -start; } if( text[pos.getIndex()] == 0x003A /*':'*/ ) { // This is the hours:minutes case offset = tzNumber.getLong() * 60; pos.setIndex(pos.getIndex() + 1); - // WORK AROUND BUG IN NUMBER FORMAT IN 1.2B3 parseStart = pos.getIndex(); fNumberFormat->parse(text, tzNumber, pos); if( pos.getIndex() == parseStart) { - // WORK AROUND BUG IN NUMBER FORMAT IN 1.2B3 return -start; } offset += tzNumber.getLong(); @@ -1325,16 +1397,14 @@ int32_t SimpleDateFormat::subParse(const UnicodeString& text, int32_t& start, UC // a little more permissive than RFC 822. It will try to do // its best with numbers that aren't strictly 4 digits long. UErrorCode status = U_ZERO_ERROR; - DecimalFormat *fmt = new DecimalFormat("+####;-####", status); + DecimalFormat fmt(UNICODE_STRING_SIMPLE("+####;-####"), status); if(U_FAILURE(status)) return -start; - fmt->setParseIntegerOnly(TRUE); - // WORK AROUND BUG IN NUMBER FORMAT IN 1.2B3 + fmt.setParseIntegerOnly(TRUE); int32_t parseStart = pos.getIndex(); Formattable tzNumber; - fmt->parse( text, tzNumber, pos ); + fmt.parse( text, tzNumber, pos ); if( pos.getIndex() == parseStart) { - // WORK AROUND BUG IN NUMBER FORMAT IN 1.2B3 return -start; // Wasn't actually a number. } offset = tzNumber.getLong(); @@ -1371,21 +1441,8 @@ int32_t SimpleDateFormat::subParse(const UnicodeString& text, int32_t& start, UC return -start; } default: - // case 3: // 'd' - DATE - // case 5: // 'H' - HOUR_OF_DAY:0-based. eg, 23:59 + 1 hour =>> 00:59 - // case 6: // 'm' - MINUTE - // case 7: // 's' - SECOND - // case 8: // 'S' - MILLISECOND - // case 10: // 'D' - DAY_OF_YEAR - // case 11: // 'F' - DAY_OF_WEEK_IN_MONTH - // case 12: // 'w' - WEEK_OF_YEAR - // case 13: // 'W' - WEEK_OF_MONTH - // case 16: // 'K' - HOUR: 0-based. eg, 11PM + 1 hour =>> 0 AM - // 'e' - DOW_LOCAL - - // WORK AROUND BUG IN NUMBER FORMAT IN 1.2B3 - int32_t parseStart = pos.getIndex(); // Handle "generic" fields + int32_t parseStart = pos.getIndex(); const UnicodeString* src; if (obeyCount) { if ((start+count) > text.length()) { @@ -1398,7 +1455,6 @@ int32_t SimpleDateFormat::subParse(const UnicodeString& text, int32_t& start, UC } parseInt(*src, number, pos, allowNegative); if (pos.getIndex() != parseStart) { - // WORK AROUND BUG IN NUMBER FORMAT IN 1.2B3 cal.set(field, number.getLong()); return pos.getIndex(); } @@ -1549,7 +1605,6 @@ void SimpleDateFormat::adoptCalendar(Calendar* calendarToAdopt) initializeDefaultCentury(); // we need a new century (possibly) } - U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/i18n/sortkey.cpp b/icuSources/i18n/sortkey.cpp index a07ae9da..62546841 100644 --- a/icuSources/i18n/sortkey.cpp +++ b/icuSources/i18n/sortkey.cpp @@ -43,7 +43,7 @@ U_NAMESPACE_BEGIN #define kInvalidHashCode ((int32_t)0) #define kEmptyHashCode ((int32_t)1) -const char CollationKey::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(CollationKey) CollationKey::CollationKey() : UObject(), fBogus(FALSE), fCount(0), fCapacity(0), diff --git a/icuSources/i18n/strmatch.cpp b/icuSources/i18n/strmatch.cpp index bfd2e672..8286c7ea 100644 --- a/icuSources/i18n/strmatch.cpp +++ b/icuSources/i18n/strmatch.cpp @@ -1,5 +1,7 @@ /* -* Copyright (C) 2001, International Business Machines Corporation and others. All Rights Reserved. +********************************************************************** +* Copyright (c) 2001-2004, International Business Machines Corporation +* and others. All Rights Reserved. ********************************************************************** * Date Name Description * 07/23/01 aliu Creation. @@ -17,9 +19,9 @@ U_NAMESPACE_BEGIN -const UChar EMPTY[] = { 0 }; // empty string: "" +static const UChar EMPTY[] = { 0 }; // empty string: "" -const char StringMatcher::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(StringMatcher) StringMatcher::StringMatcher(const UnicodeString& theString, int32_t start, @@ -35,7 +37,9 @@ StringMatcher::StringMatcher(const UnicodeString& theString, } StringMatcher::StringMatcher(const StringMatcher& o) : + UnicodeFunctor(o), UnicodeMatcher(o), + UnicodeReplacer(o), pattern(o.pattern), data(o.data), segmentNumber(o.segmentNumber), @@ -193,13 +197,13 @@ UBool StringMatcher::matchesIndexValue(uint8_t v) const { void StringMatcher::addMatchSetTo(UnicodeSet& toUnionTo) const { UChar32 ch; for (int32_t i=0; ilookupMatcher(ch); - if (matcher == NULL) { - toUnionTo.add(ch); - } else { - matcher->addMatchSetTo(toUnionTo); - } + ch = pattern.char32At(i); + const UnicodeMatcher* matcher = data->lookupMatcher(ch); + if (matcher == NULL) { + toUnionTo.add(ch); + } else { + matcher->addMatchSetTo(toUnionTo); + } } } @@ -209,7 +213,7 @@ void StringMatcher::addMatchSetTo(UnicodeSet& toUnionTo) const { int32_t StringMatcher::replace(Replaceable& text, int32_t start, int32_t limit, - int32_t& cursor) { + int32_t& /*cursor*/) { int32_t outLen = 0; @@ -233,7 +237,7 @@ int32_t StringMatcher::replace(Replaceable& text, * UnicodeReplacer API */ UnicodeString& StringMatcher::toReplacerPattern(UnicodeString& rule, - UBool escapeUnprintable) const { + UBool /*escapeUnprintable*/) const { // assert(segmentNumber > 0); rule.truncate(0); rule.append((UChar)0x0024 /*$*/); @@ -254,7 +258,7 @@ UnicodeString& StringMatcher::toReplacerPattern(UnicodeString& rule, * into the given set. * @param toUnionTo the set into which to union the output characters */ -void StringMatcher::addReplacementSetTo(UnicodeSet& toUnionTo) const { +void StringMatcher::addReplacementSetTo(UnicodeSet& /*toUnionTo*/) const { // The output of this replacer varies; it is the source text between // matchStart and matchLimit. Since this varies depending on the // input text, we can't compute it here. We can either do nothing diff --git a/icuSources/i18n/strmatch.h b/icuSources/i18n/strmatch.h index ba5edba0..90cba0c1 100644 --- a/icuSources/i18n/strmatch.h +++ b/icuSources/i18n/strmatch.h @@ -1,10 +1,11 @@ /* -* Copyright (C) 2001, International Business Machines Corporation and others. All Rights Reserved. -********************************************************************** -* Date Name Description -* 07/23/01 aliu Creation. -********************************************************************** -*/ + * Copyright (C) 2001-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ********************************************************************** + * Date Name Description + * 07/23/01 aliu Creation. + ********************************************************************** + */ #ifndef STRMATCH_H #define STRMATCH_H @@ -198,14 +199,14 @@ class StringMatcher : public UnicodeFunctor, public UnicodeMatcher, public Unico * * @draft ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * * @draft ICU 2.2 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } + static UClassID U_EXPORT2 getStaticClassID(); /** * Union the set of all characters that may output by this object @@ -244,11 +245,6 @@ class StringMatcher : public UnicodeFunctor, public UnicodeMatcher, public Unico */ int32_t matchLimit; - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; U_NAMESPACE_END diff --git a/icuSources/i18n/strrepl.cpp b/icuSources/i18n/strrepl.cpp index 7da7665f..4ae12b05 100644 --- a/icuSources/i18n/strrepl.cpp +++ b/icuSources/i18n/strrepl.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (c) 2002, International Business Machines Corporation +* Copyright (c) 2002-2004, International Business Machines Corporation * and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -19,9 +19,10 @@ U_NAMESPACE_BEGIN -const UChar EMPTY[] = { 0 }; // empty string: "" +static const UChar EMPTY[] = { 0 }; // empty string: "" -const char StringReplacer::fgClassID=0; +UnicodeReplacer::~UnicodeReplacer() {} +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(StringReplacer) /** * Construct a StringReplacer that sets the emits the given output @@ -65,7 +66,10 @@ StringReplacer::StringReplacer(const UnicodeString& theOutput, /** * Copy constructor. */ -StringReplacer::StringReplacer(const StringReplacer& other) { +StringReplacer::StringReplacer(const StringReplacer& other) : + UnicodeFunctor(other), + UnicodeReplacer(other) +{ output = other.output; cursorPos = other.cursorPos; hasCursor = other.hasCursor; @@ -291,13 +295,13 @@ UnicodeString& StringReplacer::toReplacerPattern(UnicodeString& rule, void StringReplacer::addReplacementSetTo(UnicodeSet& toUnionTo) const { UChar32 ch; for (int32_t i=0; ilookupReplacer(ch); - if (r == NULL) { - toUnionTo.add(ch); - } else { - r->addReplacementSetTo(toUnionTo); - } + ch = output.char32At(i); + UnicodeReplacer* r = data->lookupReplacer(ch); + if (r == NULL) { + toUnionTo.add(ch); + } else { + r->addReplacementSetTo(toUnionTo); + } } } diff --git a/icuSources/i18n/strrepl.h b/icuSources/i18n/strrepl.h index 161bf5c4..67a93e96 100644 --- a/icuSources/i18n/strrepl.h +++ b/icuSources/i18n/strrepl.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (c) 2002, International Business Machines Corporation +* Copyright (c) 2002-2004, International Business Machines Corporation * and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -67,12 +67,6 @@ class StringReplacer : public UnicodeFunctor, public UnicodeReplacer { */ const TransliterationRuleData* data; - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; - public: /** @@ -148,18 +142,18 @@ class StringReplacer : public UnicodeFunctor, public UnicodeReplacer { virtual void setData(const TransliterationRuleData*); /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. + * ICU "poor man's RTTI", returns a UClassID for this class. * * @draft ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + static UClassID U_EXPORT2 getStaticClassID(); /** - * ICU "poor man's RTTI", returns a UClassID for this class. + * ICU "poor man's RTTI", returns a UClassID for the actual class. * * @draft ICU 2.2 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } + virtual UClassID getDynamicClassID() const; }; U_NAMESPACE_END diff --git a/icuSources/i18n/stsearch.cpp b/icuSources/i18n/stsearch.cpp index a19e9394..0b2b08c9 100644 --- a/icuSources/i18n/stsearch.cpp +++ b/icuSources/i18n/stsearch.cpp @@ -17,7 +17,7 @@ U_NAMESPACE_BEGIN -const char StringSearch::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(StringSearch) // public constructors and destructors ----------------------------------- @@ -42,15 +42,15 @@ StringSearch::StringSearch(const UnicodeString &pattern, uprv_free(m_search_); m_search_ = NULL; - // !!! dlf m_collator_ is an odd beast. basically it is an aliasing - // wrapper around the internal collator and rules, which (here) are - // owned by this stringsearch object. this means 1) it's destructor - // _should not_ delete the ucollator or rules, and 2) changes made - // to the exposed collator (setStrength etc) _should_ modify the - // ucollator. thus the collator is not a copy-on-write alias, and it - // needs to distinguish itself not merely from 'stand alone' colators - // but also from copy-on-write ones. it needs additional state, which - // setUCollator should set. + // !!! dlf m_collator_ is an odd beast. basically it is an aliasing + // wrapper around the internal collator and rules, which (here) are + // owned by this stringsearch object. this means 1) it's destructor + // _should not_ delete the ucollator or rules, and 2) changes made + // to the exposed collator (setStrength etc) _should_ modify the + // ucollator. thus the collator is not a copy-on-write alias, and it + // needs to distinguish itself not merely from 'stand alone' colators + // but also from copy-on-write ones. it needs additional state, which + // setUCollator should set. if (U_SUCCESS(status)) { int32_t length; @@ -212,6 +212,11 @@ StringSearch::~StringSearch() } } +StringSearch * +StringSearch::clone() const { + return new StringSearch(*this); +} + // operator overloading --------------------------------------------- StringSearch & StringSearch::operator=(const StringSearch &that) { @@ -360,11 +365,21 @@ int32_t StringSearch::handleNext(int32_t position, UErrorCode &status) // StringSearch instead of SearchIterator because m_strsrch_ is // not accessible in SearchIterator if (position + m_strsrch_->pattern.defaultShiftSize - > m_search_->textLength) { + > m_search_->textLength) { setMatchNotFound(); return USEARCH_DONE; } - ucol_setOffset(m_strsrch_->textIter, position, &status); + if (m_search_->matchedLength <= 0) { + // the flipping direction issue has already been handled + // in next() + // for boundary check purposes. this will ensure that the + // next match will not preceed the current offset + // note search->matchedIndex will always be set to something + // in the code + m_search_->matchedIndex = position - 1; + } + + ucol_setOffset(m_strsrch_->textIter, position, &status); while (TRUE) { if (m_search_->isCanonicalMatch) { // can't use exact here since extra accents are allowed. @@ -385,14 +400,14 @@ int32_t StringSearch::handleNext(int32_t position, UErrorCode &status) m_search_->matchedLength)) #endif ) { - if (m_search_->matchedIndex == USEARCH_DONE) { - ucol_setOffset(m_strsrch_->textIter, - m_search_->textLength, &status); - } - else { - ucol_setOffset(m_strsrch_->textIter, - m_search_->matchedIndex, &status); - } + if (m_search_->matchedIndex == USEARCH_DONE) { + ucol_setOffset(m_strsrch_->textIter, + m_search_->textLength, &status); + } + else { + ucol_setOffset(m_strsrch_->textIter, + m_search_->matchedIndex, &status); + } return m_search_->matchedIndex; } } diff --git a/icuSources/i18n/tblcoll.cpp b/icuSources/i18n/tblcoll.cpp index f6014bb7..14f7ad17 100644 --- a/icuSources/i18n/tblcoll.cpp +++ b/icuSources/i18n/tblcoll.cpp @@ -1,6 +1,6 @@ /* ****************************************************************************** -* Copyright (C) {1996-2003}, International Business Machines Corporation and * +* Copyright (C) 1996-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ****************************************************************************** */ @@ -60,13 +60,14 @@ #include "unicode/tblcoll.h" #include "unicode/coleitr.h" -#include "unicode/resbund.h" +#include "unicode/ures.h" #include "unicode/uset.h" #include "ucol_imp.h" #include "uresimp.h" #include "uhash.h" #include "cmemory.h" #include "cstring.h" +#include "putilimp.h" /* public RuleBasedCollator constructor ---------------------------------- */ @@ -75,79 +76,79 @@ U_NAMESPACE_BEGIN /** * Copy constructor, aliasing, not write-through */ -RuleBasedCollator::RuleBasedCollator(const RuleBasedCollator& that) - : Collator(that) - , dataIsOwned(FALSE) - , isWriteThroughAlias(FALSE) - , ucollator(that.ucollator) - , urulestring(that.urulestring) +RuleBasedCollator::RuleBasedCollator(const RuleBasedCollator& that) +: Collator(that) +, dataIsOwned(FALSE) +, isWriteThroughAlias(FALSE) +, ucollator(that.ucollator) +, urulestring(that.urulestring) { } RuleBasedCollator::RuleBasedCollator(const UnicodeString& rules, - UErrorCode& status) : - dataIsOwned(FALSE) + UErrorCode& status) : +dataIsOwned(FALSE) { - construct(rules, - UCOL_DEFAULT_STRENGTH, - UCOL_DEFAULT, - status); + construct(rules, + UCOL_DEFAULT_STRENGTH, + UCOL_DEFAULT, + status); } RuleBasedCollator::RuleBasedCollator(const UnicodeString& rules, - ECollationStrength collationStrength, - UErrorCode& status) : dataIsOwned(FALSE) + ECollationStrength collationStrength, + UErrorCode& status) : dataIsOwned(FALSE) { - construct(rules, - getUCollationStrength(collationStrength), - UCOL_DEFAULT, - status); + construct(rules, + getUCollationStrength(collationStrength), + UCOL_DEFAULT, + status); } RuleBasedCollator::RuleBasedCollator(const UnicodeString& rules, UColAttributeValue decompositionMode, UErrorCode& status) : - dataIsOwned(FALSE) +dataIsOwned(FALSE) { - construct(rules, - UCOL_DEFAULT_STRENGTH, - decompositionMode, - status); + construct(rules, + UCOL_DEFAULT_STRENGTH, + decompositionMode, + status); } RuleBasedCollator::RuleBasedCollator(const UnicodeString& rules, - ECollationStrength collationStrength, - UColAttributeValue decompositionMode, - UErrorCode& status) : dataIsOwned(FALSE) + ECollationStrength collationStrength, + UColAttributeValue decompositionMode, + UErrorCode& status) : dataIsOwned(FALSE) { - construct(rules, - getUCollationStrength(collationStrength), - decompositionMode, - status); + construct(rules, + getUCollationStrength(collationStrength), + decompositionMode, + status); } void RuleBasedCollator::setRuleStringFromCollator(UErrorCode& status) { - urulestring = NULL; - if (U_SUCCESS(status)) - { - int32_t length; - const UChar *r = ucol_getRules(ucollator, &length); - - if (length > 0) { - // alias the rules string - urulestring = new UnicodeString(TRUE, r, length); - } - else { - urulestring = new UnicodeString(); - } - /* test for NULL */ - if (urulestring == 0) { - status = U_MEMORY_ALLOCATION_ERROR; - return; + urulestring = NULL; + if (U_SUCCESS(status)) + { + int32_t length; + const UChar *r = ucol_getRules(ucollator, &length); + + if (length > 0) { + // alias the rules string + urulestring = new UnicodeString(TRUE, r, length); + } + else { + urulestring = new UnicodeString(); + } + /* test for NULL */ + if (urulestring == 0) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } } - } } // not aliasing, not write-through @@ -157,28 +158,28 @@ RuleBasedCollator::construct(const UnicodeString& rules, UColAttributeValue decompositionMode, UErrorCode& status) { - urulestring = 0; - ucollator = ucol_openRules(rules.getBuffer(), rules.length(), - decompositionMode, collationStrength, - NULL, &status); + urulestring = 0; + ucollator = ucol_openRules(rules.getBuffer(), rules.length(), + decompositionMode, collationStrength, + NULL, &status); - dataIsOwned = TRUE; // since we own a collator now, we need to get rid of it - isWriteThroughAlias = FALSE; + dataIsOwned = TRUE; // since we own a collator now, we need to get rid of it + isWriteThroughAlias = FALSE; - setRuleStringFromCollator(status); + setRuleStringFromCollator(status); } /* RuleBasedCollator public destructor ----------------------------------- */ RuleBasedCollator::~RuleBasedCollator() { - if (dataIsOwned) - { - ucol_close(ucollator); - delete urulestring; - } - ucollator = 0; - urulestring = 0; + if (dataIsOwned) + { + ucol_close(ucollator); + delete urulestring; + } + ucollator = 0; + urulestring = 0; } /* RuleBaseCollator public methods --------------------------------------- */ @@ -207,24 +208,29 @@ UBool RuleBasedCollator::operator==(const Collator& that) const */ } +UBool RuleBasedCollator::operator!=(const Collator& other) const +{ + return !(*this == other); +} + // aliasing, not write-through RuleBasedCollator& RuleBasedCollator::operator=(const RuleBasedCollator& that) { - if (this != &that) - { - if (dataIsOwned) + if (this != &that) { - ucol_close(ucollator); - ucollator = NULL; - delete urulestring; - } + if (dataIsOwned) + { + ucol_close(ucollator); + ucollator = NULL; + delete urulestring; + } - dataIsOwned = FALSE; - isWriteThroughAlias = FALSE; - ucollator = that.ucollator; - urulestring = that.urulestring; - } - return *this; + dataIsOwned = FALSE; + isWriteThroughAlias = FALSE; + ucollator = that.ucollator; + urulestring = that.urulestring; + } + return *this; } // aliasing, not write-through @@ -236,15 +242,15 @@ Collator* RuleBasedCollator::clone() const CollationElementIterator* RuleBasedCollator::createCollationElementIterator (const UnicodeString& source) const { - UErrorCode status = U_ZERO_ERROR; - CollationElementIterator *result = new CollationElementIterator(source, this, - status); - if (U_FAILURE(status)) { - delete result; - return NULL; - } + UErrorCode status = U_ZERO_ERROR; + CollationElementIterator *result = new CollationElementIterator(source, this, + status); + if (U_FAILURE(status)) { + delete result; + return NULL; + } - return result; + return result; } /** @@ -255,16 +261,16 @@ CollationElementIterator* RuleBasedCollator::createCollationElementIterator CollationElementIterator* RuleBasedCollator::createCollationElementIterator (const CharacterIterator& source) const { - UErrorCode status = U_ZERO_ERROR; - CollationElementIterator *result = new CollationElementIterator(source, this, - status); + UErrorCode status = U_ZERO_ERROR; + CollationElementIterator *result = new CollationElementIterator(source, this, + status); - if (U_FAILURE(status)) { - delete result; - return NULL; - } + if (U_FAILURE(status)) { + delete result; + return NULL; + } - return result; + return result; } /** @@ -286,11 +292,11 @@ void RuleBasedCollator::getRules(UColRuleOption delta, UnicodeString &buffer) if (rulesize > 0) { UChar *rules = (UChar*) uprv_malloc( sizeof(UChar) * (rulesize) ); if(rules != NULL) { - ucol_getRulesEx(ucollator, delta, rules, rulesize); - buffer.setTo(rules, rulesize); - uprv_free(rules); + ucol_getRulesEx(ucollator, delta, rules, rulesize); + buffer.setTo(rules, rulesize); + uprv_free(rules); } else { // couldn't allocate - buffer.remove(); + buffer.remove(); } } else { @@ -301,10 +307,10 @@ void RuleBasedCollator::getRules(UColRuleOption delta, UnicodeString &buffer) UnicodeSet * RuleBasedCollator::getTailoredSet(UErrorCode &status) const { - if(U_FAILURE(status)) { - return NULL; - } - return (UnicodeSet *)ucol_getTailoredSet(this->ucollator, &status); + if(U_FAILURE(status)) { + return NULL; + } + return (UnicodeSet *)ucol_getTailoredSet(this->ucollator, &status); } @@ -320,17 +326,17 @@ Collator::EComparisonResult RuleBasedCollator::compare( const UnicodeString& target, int32_t length) const { - UErrorCode status = U_ZERO_ERROR; - return getEComparisonResult(compare(source.getBuffer(), uprv_min(length,source.length()), target.getBuffer(), uprv_min(length,target.length()), status)); + UErrorCode status = U_ZERO_ERROR; + return getEComparisonResult(compare(source.getBuffer(), uprv_min(length,source.length()), target.getBuffer(), uprv_min(length,target.length()), status)); } UCollationResult RuleBasedCollator::compare( const UnicodeString& source, const UnicodeString& target, - int32_t length, + int32_t length, UErrorCode &status) const { - return compare(source.getBuffer(), uprv_min(length,source.length()), target.getBuffer(), uprv_min(length,target.length()), status); + return compare(source.getBuffer(), uprv_min(length,source.length()), target.getBuffer(), uprv_min(length,target.length()), status); } Collator::EComparisonResult RuleBasedCollator::compare(const UChar* source, @@ -339,21 +345,21 @@ Collator::EComparisonResult RuleBasedCollator::compare(const UChar* source, int32_t targetLength) const { - return getEComparisonResult(ucol_strcoll(ucollator, source, sourceLength, - target, targetLength)); + return getEComparisonResult(ucol_strcoll(ucollator, source, sourceLength, + target, targetLength)); } UCollationResult RuleBasedCollator::compare(const UChar* source, int32_t sourceLength, const UChar* target, - int32_t targetLength, + int32_t targetLength, UErrorCode &status) const { - if(U_SUCCESS(status)) { - return ucol_strcoll(ucollator, source, sourceLength, target, targetLength); - } else { - return UCOL_EQUAL; - } + if(U_SUCCESS(status)) { + return ucol_strcoll(ucollator, source, sourceLength, target, targetLength); + } else { + return UCOL_EQUAL; + } } /** @@ -363,21 +369,21 @@ Collator::EComparisonResult RuleBasedCollator::compare( const UnicodeString& source, const UnicodeString& target) const { - return getEComparisonResult(ucol_strcoll(ucollator, source.getBuffer(), source.length(), - target.getBuffer(), target.length())); + return getEComparisonResult(ucol_strcoll(ucollator, source.getBuffer(), source.length(), + target.getBuffer(), target.length())); } UCollationResult RuleBasedCollator::compare( const UnicodeString& source, - const UnicodeString& target, + const UnicodeString& target, UErrorCode &status) const { - if(U_SUCCESS(status)) { - return ucol_strcoll(ucollator, source.getBuffer(), source.length(), - target.getBuffer(), target.length()); - } else { - return UCOL_EQUAL; - } + if(U_SUCCESS(status)) { + return ucol_strcoll(ucollator, source.getBuffer(), source.length(), + target.getBuffer(), target.length()); + } else { + return UCOL_EQUAL; + } } /** @@ -390,7 +396,7 @@ UCollationResult RuleBasedCollator::compare( * character in the source string, convert them to an ASCII representation, and * put them into the collation key. But it's trickier than that. Each * collation element in a string has three components: primary ('A' vs 'B'), -* secondary ('u' vs 'ü'), and tertiary ('A' vs 'a'), and a primary difference +* secondary ('u' vs '\u00FC'), and tertiary ('A' vs 'a'), and a primary difference * at the end of a string takes precedence over a secondary or tertiary * difference earlier in the string. * @@ -402,7 +408,7 @@ UCollationResult RuleBasedCollator::compare( * Here's a hypothetical example, with the collation element represented as a * three-digit number, one digit for primary, one for secondary, etc. * -* String: A a B É +* String: A a B \u00C9 * Collation Elements: 101 100 201 511 * Collation Key: 112500011011 * @@ -418,7 +424,7 @@ CollationKey& RuleBasedCollator::getCollationKey( CollationKey& sortkey, UErrorCode& status) const { - return getCollationKey(source.getBuffer(), source.length(), sortkey, status); + return getCollationKey(source.getBuffer(), source.length(), sortkey, status); } CollationKey& RuleBasedCollator::getCollationKey(const UChar* source, @@ -426,22 +432,22 @@ CollationKey& RuleBasedCollator::getCollationKey(const UChar* source, CollationKey& sortkey, UErrorCode& status) const { - if (U_FAILURE(status)) - { - return sortkey.setToBogus(); - } + if (U_FAILURE(status)) + { + return sortkey.setToBogus(); + } - if ((!source) || (sourceLen == 0)) { - return sortkey.reset(); - } + if ((!source) || (sourceLen == 0)) { + return sortkey.reset(); + } - uint8_t *result; - int32_t resultLen = ucol_getSortKeyWithAllocation(ucollator, - source, sourceLen, - &result, - &status); - sortkey.adopt(result, resultLen); - return sortkey; + uint8_t *result; + int32_t resultLen = ucol_getSortKeyWithAllocation(ucollator, + source, sourceLen, + &result, + &status); + sortkey.adopt(result, resultLen); + return sortkey; } /** @@ -455,48 +461,48 @@ CollationKey& RuleBasedCollator::getCollationKey(const UChar* source, */ int32_t RuleBasedCollator::getMaxExpansion(int32_t order) const { - uint8_t result; - UCOL_GETMAXEXPANSION(ucollator, (uint32_t)order, result); - return result; + uint8_t result; + UCOL_GETMAXEXPANSION(ucollator, (uint32_t)order, result); + return result; } uint8_t* RuleBasedCollator::cloneRuleData(int32_t &length, UErrorCode &status) { - return ucol_cloneRuleData(ucollator, &length, &status); + return ucol_cloneRuleData(ucollator, &length, &status); } void RuleBasedCollator::setAttribute(UColAttribute attr, UColAttributeValue value, UErrorCode &status) { - if (U_FAILURE(status)) - return; - checkOwned(); - ucol_setAttribute(ucollator, attr, value, &status); + if (U_FAILURE(status)) + return; + checkOwned(); + ucol_setAttribute(ucollator, attr, value, &status); } UColAttributeValue RuleBasedCollator::getAttribute(UColAttribute attr, UErrorCode &status) { - if (U_FAILURE(status)) - return UCOL_DEFAULT; - return ucol_getAttribute(ucollator, attr, &status); + if (U_FAILURE(status)) + return UCOL_DEFAULT; + return ucol_getAttribute(ucollator, attr, &status); } uint32_t RuleBasedCollator::setVariableTop(const UChar *varTop, int32_t len, UErrorCode &status) { - checkOwned(); - return ucol_setVariableTop(ucollator, varTop, len, &status); + checkOwned(); + return ucol_setVariableTop(ucollator, varTop, len, &status); } uint32_t RuleBasedCollator::setVariableTop(const UnicodeString varTop, UErrorCode &status) { - checkOwned(); - return ucol_setVariableTop(ucollator, varTop.getBuffer(), varTop.length(), &status); + checkOwned(); + return ucol_setVariableTop(ucollator, varTop.getBuffer(), varTop.length(), &status); } void RuleBasedCollator::setVariableTop(const uint32_t varTop, UErrorCode &status) { - checkOwned(); - ucol_restoreVariableTop(ucollator, varTop, &status); + checkOwned(); + ucol_restoreVariableTop(ucollator, varTop, &status); } uint32_t RuleBasedCollator::getVariableTop(UErrorCode &status) const { @@ -505,20 +511,20 @@ uint32_t RuleBasedCollator::getVariableTop(UErrorCode &status) const { Collator* RuleBasedCollator::safeClone(void) { - UErrorCode intStatus = U_ZERO_ERROR; - int32_t buffersize = U_COL_SAFECLONE_BUFFERSIZE; - UCollator *ucol = ucol_safeClone(ucollator, NULL, &buffersize, - &intStatus); - if (U_FAILURE(intStatus)) { - return NULL; - } + UErrorCode intStatus = U_ZERO_ERROR; + int32_t buffersize = U_COL_SAFECLONE_BUFFERSIZE; + UCollator *ucol = ucol_safeClone(ucollator, NULL, &buffersize, + &intStatus); + if (U_FAILURE(intStatus)) { + return NULL; + } - UnicodeString *r = new UnicodeString(*urulestring); - RuleBasedCollator *result = new RuleBasedCollator(ucol, r); - result->dataIsOwned = TRUE; - result->isWriteThroughAlias = FALSE; + UnicodeString *r = new UnicodeString(*urulestring); + RuleBasedCollator *result = new RuleBasedCollator(ucol, r); + result->dataIsOwned = TRUE; + result->isWriteThroughAlias = FALSE; - return result; + return result; } @@ -526,29 +532,29 @@ int32_t RuleBasedCollator::getSortKey(const UnicodeString& source, uint8_t *result, int32_t resultLength) const { - return ucol_getSortKey(ucollator, source.getBuffer(), source.length(), result, resultLength); + return ucol_getSortKey(ucollator, source.getBuffer(), source.length(), result, resultLength); } int32_t RuleBasedCollator::getSortKey(const UChar *source, int32_t sourceLength, uint8_t *result, int32_t resultLength) const { - return ucol_getSortKey(ucollator, source, sourceLength, result, resultLength); + return ucol_getSortKey(ucollator, source, sourceLength, result, resultLength); } Collator::ECollationStrength RuleBasedCollator::getStrength(void) const { - UErrorCode intStatus = U_ZERO_ERROR; - return getECollationStrength(ucol_getAttribute(ucollator, UCOL_STRENGTH, - &intStatus)); + UErrorCode intStatus = U_ZERO_ERROR; + return getECollationStrength(ucol_getAttribute(ucollator, UCOL_STRENGTH, + &intStatus)); } void RuleBasedCollator::setStrength(ECollationStrength newStrength) { - checkOwned(); - UErrorCode intStatus = U_ZERO_ERROR; - UCollationStrength strength = getUCollationStrength(newStrength); - ucol_setAttribute(ucollator, UCOL_STRENGTH, strength, &intStatus); + checkOwned(); + UErrorCode intStatus = U_ZERO_ERROR; + UCollationStrength strength = getUCollationStrength(newStrength); + ucol_setAttribute(ucollator, UCOL_STRENGTH, strength, &intStatus); } /** @@ -557,28 +563,28 @@ void RuleBasedCollator::setStrength(ECollationStrength newStrength) */ int32_t RuleBasedCollator::hashCode() const { - int32_t length; - const UChar *rules = ucol_getRules(ucollator, &length); - return uhash_hashUCharsN(rules, length); + int32_t length; + const UChar *rules = ucol_getRules(ucollator, &length); + return uhash_hashUCharsN(rules, length); } /** * return the locale of this collator */ const Locale RuleBasedCollator::getLocale(ULocDataLocaleType type, UErrorCode &status) const { - const char *result = ucol_getLocale(ucollator, type, &status); - if(result == NULL) { - Locale res(""); - res.setToBogus(); - return res; - } else { - return Locale(result); - } + const char *result = ucol_getLocale(ucollator, type, &status); + if(result == NULL) { + Locale res(""); + res.setToBogus(); + return res; + } else { + return Locale(result); + } } void RuleBasedCollator::setLocales(const Locale& requestedLocale, const Locale& validLocale) { - checkOwned(); + checkOwned(); size_t rlen = uprv_strlen(requestedLocale.getName()); char* rloc = (char *)uprv_malloc((rlen+1)*sizeof(char)); if (rloc) { @@ -596,107 +602,105 @@ RuleBasedCollator::setLocales(const Locale& requestedLocale, const Locale& valid // RuleBaseCollatorNew private constructor ---------------------------------- -RuleBasedCollator::RuleBasedCollator() +RuleBasedCollator::RuleBasedCollator() : dataIsOwned(FALSE), isWriteThroughAlias(FALSE), ucollator(0), urulestring(0) { } RuleBasedCollator::RuleBasedCollator(UCollator *collator, UnicodeString *rule) - : dataIsOwned(FALSE), isWriteThroughAlias(FALSE), urulestring(0) + : dataIsOwned(FALSE), isWriteThroughAlias(FALSE), urulestring(0) { - ucollator = collator; - urulestring = rule; + ucollator = collator; + urulestring = rule; } RuleBasedCollator::RuleBasedCollator(const Locale& desiredLocale, UErrorCode& status) : dataIsOwned(FALSE), ucollator(0), urulestring(0) { - if (U_FAILURE(status)) - return; - - /* - Try to load, in order: - 1. The desired locale's collation. - 2. A fallback of the desired locale. - 3. The default locale's collation. - 4. A fallback of the default locale. - 5. The default collation rules, which contains en_US collation rules. - - To reiterate, we try: - Specific: - language+country+variant - language+country - language - Default: - language+country+variant - language+country - language - Root: (aka DEFAULTRULES) - steps 1-5 are handled by resource bundle fallback mechanism. - however, in a very unprobable situation that no resource bundle - data exists, step 5 is repeated with hardcoded default rules. - */ - - setUCollator(desiredLocale, status); + if (U_FAILURE(status)) + return; - if (U_FAILURE(status)) - { - status = U_ZERO_ERROR; + /* + Try to load, in order: + 1. The desired locale's collation. + 2. A fallback of the desired locale. + 3. The default locale's collation. + 4. A fallback of the default locale. + 5. The default collation rules, which contains en_US collation rules. + + To reiterate, we try: + Specific: + language+country+variant + language+country + language + Default: + language+country+variant + language+country + language + Root: (aka DEFAULTRULES) + steps 1-5 are handled by resource bundle fallback mechanism. + however, in a very unprobable situation that no resource bundle + data exists, step 5 is repeated with hardcoded default rules. + */ + + setUCollator(desiredLocale, status); + + if (U_FAILURE(status)) + { + status = U_ZERO_ERROR; - setUCollator(kRootLocaleName, status); - if (status == U_ZERO_ERROR) { - status = U_USING_DEFAULT_WARNING; + setUCollator(kRootLocaleName, status); + if (status == U_ZERO_ERROR) { + status = U_USING_DEFAULT_WARNING; + } } - } - if (U_SUCCESS(status)) - { - int32_t length; - const UChar *r = ucol_getRules(ucollator, &length); - if (length > 0) { - // alias the rules string - urulestring = new UnicodeString(TRUE, r, length); - } - else { - urulestring = new UnicodeString(); - } - /* test for NULL */ - if (urulestring == 0) { - status = U_MEMORY_ALLOCATION_ERROR; - return; + if (U_SUCCESS(status)) + { + int32_t length; + const UChar *r = ucol_getRules(ucollator, &length); + if (length > 0) { + // alias the rules string + urulestring = new UnicodeString(TRUE, r, length); + } + else { + urulestring = new UnicodeString(); + } + /* test for NULL */ + if (urulestring == 0) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + dataIsOwned = TRUE; + isWriteThroughAlias = FALSE; } - dataIsOwned = TRUE; - isWriteThroughAlias = FALSE; - } - - return; } void RuleBasedCollator::setUCollator(const char *locale, UErrorCode &status) { - if (U_FAILURE(status)) - return; - if (ucollator && dataIsOwned) - ucol_close(ucollator); - ucollator = ucol_open_internal(locale, &status); - dataIsOwned = TRUE; - isWriteThroughAlias = FALSE; + if (U_FAILURE(status)) + return; + if (ucollator && dataIsOwned) + ucol_close(ucollator); + ucollator = ucol_open_internal(locale, &status); + dataIsOwned = TRUE; + isWriteThroughAlias = FALSE; } void RuleBasedCollator::checkOwned() { - if (!(dataIsOwned || isWriteThroughAlias)) { - UErrorCode status = U_ZERO_ERROR; - ucollator = ucol_safeClone(ucollator, NULL, NULL, &status); - setRuleStringFromCollator(status); - dataIsOwned = TRUE; - isWriteThroughAlias = FALSE; - } + if (!(dataIsOwned || isWriteThroughAlias)) { + UErrorCode status = U_ZERO_ERROR; + ucollator = ucol_safeClone(ucollator, NULL, NULL, &status); + setRuleStringFromCollator(status); + dataIsOwned = TRUE; + isWriteThroughAlias = FALSE; + } } /* RuleBasedCollator private data members -------------------------------- */ @@ -751,12 +755,7 @@ const int32_t RuleBasedCollator::RESETTERTIARY = 0x00000002; const int32_t RuleBasedCollator::PRIMIGNORABLE = 0x0202; -/* unique file id for parity check */ -const int16_t RuleBasedCollator::FILEID = 0x5443; -/* binary collation file extension */ -const char RuleBasedCollator::kFilenameSuffix[] = ".col"; -/* class id ? Value is irrelevant */ -const char RuleBasedCollator::fgClassID = 0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(RuleBasedCollator) U_NAMESPACE_END diff --git a/icuSources/i18n/timezone.cpp b/icuSources/i18n/timezone.cpp index 12aa249f..837f4d0e 100644 --- a/icuSources/i18n/timezone.cpp +++ b/icuSources/i18n/timezone.cpp @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 1997-2003, International Business Machines Corporation and * +* Copyright (C) 1997-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* * @@ -36,73 +36,83 @@ *********************************************************************************/ #include "unicode/utypes.h" +#include "unicode/ustring.h" + +#ifdef U_DEBUG_TZ +# include +# include "uresimp.h" // for debugging + +static void debug_tz_loc(const char *f, int32_t l) +{ + fprintf(stderr, "%s:%d: ", f, l); +} + +static void debug_tz_msg(const char *pat, ...) +{ + va_list ap; + va_start(ap, pat); + vfprintf(stderr, pat, ap); + fflush(stderr); +} +static char gStrBuf[256]; +#define U_DEBUG_TZ_STR(x) u_austrncpy(gStrBuf,x,sizeof(gStrBuf)-1) +// must use double parens, i.e.: U_DEBUG_TZ_MSG(("four is: %d",4)); +#define U_DEBUG_TZ_MSG(x) {debug_tz_loc(__FILE__,__LINE__);debug_tz_msg x;} +#else +#define U_DEBUG_TZ_MSG(x) +#endif #if !UCONFIG_NO_FORMATTING #include "unicode/simpletz.h" #include "unicode/smpdtfmt.h" #include "unicode/calendar.h" +#include "unicode/gregocal.h" +#include "unicode/ures.h" +#include "gregoimp.h" +#include "uresimp.h" // struct UResourceBundle +#include "olsontz.h" #include "mutex.h" #include "unicode/udata.h" -#include "tzdat.h" #include "ucln_in.h" #include "cstring.h" #include "cmemory.h" #include "unicode/strenum.h" #include "uassert.h" -/** - * udata callback to verify the zone data. - */ -U_CDECL_BEGIN -static UBool U_CALLCONV -isTimeZoneDataAcceptable(void * /*context*/, - const char * /*type*/, const char * /*name*/, - const UDataInfo *pInfo) { - return - pInfo->size >= sizeof(UDataInfo) && - pInfo->isBigEndian == U_IS_BIG_ENDIAN && - pInfo->charsetFamily == U_CHARSET_FAMILY && - pInfo->dataFormat[0] == TZ_SIG_0 && - pInfo->dataFormat[1] == TZ_SIG_1 && - pInfo->dataFormat[2] == TZ_SIG_2 && - pInfo->dataFormat[3] == TZ_SIG_3 && - pInfo->formatVersion[0] == TZ_FORMAT_VERSION; -} -U_CDECL_END +#define kZONEINFO "zoneinfo" +#define kREGIONS "Regions" +#define kZONES "Zones" +#define kRULES "Rules" +#define kNAMES "Names" +#define kDEFAULT "Default" // Static data and constants static const UChar GMT_ID[] = {0x47, 0x4D, 0x54, 0x00}; /* "GMT" */ +static const UChar Z_STR[] = {0x7A, 0x00}; /* "z" */ +static const UChar ZZZZ_STR[] = {0x7A, 0x7A, 0x7A, 0x7A, 0x00}; /* "zzzz" */ static const int32_t GMT_ID_LENGTH = 3; static const UChar CUSTOM_ID[] = { 0x43, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x00 /* "Custom" */ }; -// See header file for documentation of the following -static const TZHeader * DATA = NULL; // alias into UDATA_MEMORY -static const uint32_t* INDEX_BY_ID = 0; // alias into UDATA_MEMORY -static const OffsetIndex* INDEX_BY_OFFSET = 0; // alias into UDATA_MEMORY -static const CountryIndex* INDEX_BY_COUNTRY = 0; // alias into UDATA_MEMORY - -static UDataMemory* UDATA_MEMORY = 0; static UMTX LOCK; static TimeZone* DEFAULT_ZONE = NULL; static TimeZone* _GMT = NULL; // cf. TimeZone::GMT -static UnicodeString* ZONE_IDS = 0; -const char TimeZone::fgClassID = 0; // Value is irrelevant -UBool timeZone_cleanup() -{ - // Aliases into UDATA_MEMORY; do NOT delete - DATA = NULL; - INDEX_BY_ID = NULL; - INDEX_BY_OFFSET = NULL; - INDEX_BY_COUNTRY = NULL; +#ifdef U_USE_TIMEZONE_OBSOLETE_2_8 +static UnicodeString* OLSON_IDS = 0; +#endif - delete []ZONE_IDS; - ZONE_IDS = NULL; +U_CDECL_BEGIN +static UBool U_CALLCONV timeZone_cleanup() +{ +#ifdef U_USE_TIMEZONE_OBSOLETE_2_8 + delete []OLSON_IDS; + OLSON_IDS = 0; +#endif delete DEFAULT_ZONE; DEFAULT_ZONE = NULL; @@ -110,11 +120,6 @@ UBool timeZone_cleanup() delete _GMT; _GMT = NULL; - if (UDATA_MEMORY) { - udata_close(UDATA_MEMORY); - UDATA_MEMORY = NULL; - } - if (LOCK) { umtx_destroy(&LOCK); LOCK = NULL; @@ -122,119 +127,238 @@ UBool timeZone_cleanup() return TRUE; } +U_CDECL_END U_NAMESPACE_BEGIN /** - * Load the system time zone data from icudata.dll (or its - * equivalent). If this call succeeds, it will return TRUE and - * UDATA_MEMORY will be non-null, and DATA and INDEX_BY_* will be set - * to point into it. If this call fails, either because the data - * could not be opened, or because the ID array could not be - * allocated, then it will return FALSE. - * - * Must be called OUTSIDE mutex. + * The Olson data is stored the "zoneinfo" resource bundle. + * Sub-resources are organized into three ranges of data: Zones, final + * rules, and country tables. There is also a meta-data resource + * which has 3 integers: The number of zones, rules, and countries, + * respectively. The country count includes the non-country 'Default'. */ -static UBool loadZoneData() { +static int32_t OLSON_ZONE_START = -1; // starting index of zones +static int32_t OLSON_ZONE_COUNT = 0; // count of zones - // Open a data memory object, to be closed either later in this - // function or in timeZone_cleanup(). Purify (etc.) may - // mistakenly report this as a leak. - UErrorCode status = U_ZERO_ERROR; - UDataMemory* udata = udata_openChoice(0, TZ_DATA_TYPE, TZ_DATA_NAME, - (UDataMemoryIsAcceptable*)isTimeZoneDataAcceptable, 0, &status); - if (U_FAILURE(status)) { - U_ASSERT(udata==0); - return FALSE; +/** + * Given a pointer to an open "zoneinfo" resource, load up the Olson + * meta-data. Return TRUE if successful. + */ +static UBool getOlsonMeta(const UResourceBundle* top) { + if (OLSON_ZONE_START < 0) { + UErrorCode ec = U_ZERO_ERROR; + UResourceBundle res; + ures_initStackObject(&res); + ures_getByKey(top, kZONES, &res, &ec); + if(U_SUCCESS(ec)) { + OLSON_ZONE_COUNT = ures_getSize(&res); + OLSON_ZONE_START = 0; + U_DEBUG_TZ_MSG(("OZC%d OZS%d\n",OLSON_ZONE_COUNT, OLSON_ZONE_START)); + } + ures_close(&res); } + return (OLSON_ZONE_START >= 0); +} - U_ASSERT(udata!=0); - TZHeader* tzh = (TZHeader*)udata_getMemory(udata); - U_ASSERT(tzh!=0); - - const uint32_t* index_by_id = - (const uint32_t*)((int8_t*)tzh + tzh->nameIndexDelta); - const OffsetIndex* index_by_offset = - (const OffsetIndex*)((int8_t*)tzh + tzh->offsetIndexDelta); - const CountryIndex* index_by_country = - (const CountryIndex*)((int8_t*)tzh + tzh->countryIndexDelta); - - // Construct the available IDs array. The ordering - // of this array conforms to the ordering of the - // index by name table. - UnicodeString* zone_ids = new UnicodeString[tzh->count ? tzh->count : 1]; - if (zone_ids == 0) { - udata_close(udata); - return FALSE; - } - // Find start of name table, and walk through it - // linearly. If you're wondering why we don't use - // the INDEX_BY_ID, it's because that indexes the - // zone objects, not the name table. The name - // table is unindexed. - const char* name = (const char*)tzh + tzh->nameTableDelta; - int32_t length; - for (uint32_t i=0; icount; ++i) { - zone_ids[i] = UnicodeString(name, ""); // invariant converter - length = zone_ids[i].length(); // add a NUL but don't count it so that - zone_ids[i].append((UChar)0); // getBuffer() gets a terminated string - zone_ids[i].truncate(length); - name += uprv_strlen(name) + 1; +/** + * Load up the Olson meta-data. Return TRUE if successful. + */ +static UBool getOlsonMeta() { + if (OLSON_ZONE_START < 0) { + UErrorCode ec = U_ZERO_ERROR; + UResourceBundle *top = ures_openDirect(0, kZONEINFO, &ec); + if (U_SUCCESS(ec)) { + getOlsonMeta(top); + } + ures_close(top); } + return (OLSON_ZONE_START >= 0); +} - // Keep mutexed operations as short as possible by doing all - // computations first, then doing pointer copies within the mutex. - umtx_lock(&LOCK); - if (UDATA_MEMORY == 0) { - UDATA_MEMORY = udata; - DATA = tzh; - INDEX_BY_ID = index_by_id; - INDEX_BY_OFFSET = index_by_offset; - INDEX_BY_COUNTRY = index_by_country; - ZONE_IDS = zone_ids; - - udata = NULL; - zone_ids = NULL; +static int32_t findInStringArray(UResourceBundle* array, const UnicodeString& id, UErrorCode &status) +{ + UnicodeString copy; + copy.fastCopyFrom(id); + const UChar* buf = copy.getTerminatedBuffer(); + const UChar* u = NULL; + + int32_t count = ures_getSize(array); + int32_t start = 0; + int32_t i; + int32_t len; + int32_t limit = count; + if(U_FAILURE(status) || (count < 1)) { + return -1; } - umtx_unlock(&LOCK); + U_DEBUG_TZ_MSG(("fisa: Looking for %s, between %d and %d\n", U_DEBUG_TZ_STR(buf), start, limit)); + + while(U_SUCCESS(status) && (start kRULES [%s]\n", key, u_errorName(status))); + r = ures_getByKey(r, key, r, &status); + U_DEBUG_TZ_MSG(("loadRule(%s) -> item [%s]\n", key, u_errorName(status))); + return r; } /** - * Inline function that returns TRUE if we have zone data, loading it - * if necessary. The only time this function will return false is if - * loadZoneData() fails, and UDATA_MEMORY and associated pointers are - * NULL (rare). - * - * The difference between this function and loadZoneData() is that - * this is an inline function that expands to code which avoids making - * a function call in the case where the data is already loaded (the - * common case). - * - * Must be called OUTSIDE mutex. + * Given an ID, open the appropriate resource for the given time zone. + * Dereference aliases if necessary. + * @param id zone id + * @param res resource, which must be ready for use (initialized but not open) + * @param ec input-output error code + * @return top-level resource bundle */ -static inline UBool haveZoneData() { - umtx_init(&LOCK); /* This is here to prevent race conditions. */ +static UResourceBundle* openOlsonResource(const UnicodeString& id, + UResourceBundle& res, + UErrorCode& ec) +{ +#if U_DEBUG_TZ + char buf[128]; + id.extract(0, sizeof(buf)-1, buf, sizeof(buf), ""); +#endif + UResourceBundle *top = ures_openDirect(0, kZONEINFO, &ec); + U_DEBUG_TZ_MSG(("pre: res sz=%d\n", ures_getSize(&res))); + /* &res = */ getZoneByName(top, id, &res, ec); + // Dereference if this is an alias. Docs say result should be 1 + // but it is 0 in 2.8 (?). + U_DEBUG_TZ_MSG(("Loading zone '%s' (%s, size %d) - %s\n", buf, ures_getKey((UResourceBundle*)&res), ures_getSize(&res), u_errorName(ec))); + if (ures_getSize(&res) <= 1 && getOlsonMeta(top)) { + int32_t deref = ures_getInt(&res, &ec) + 0; + U_DEBUG_TZ_MSG(("getInt: %s - type is %d\n", u_errorName(ec), ures_getType(&res))); + UResourceBundle *ares = ures_getByKey(top, kZONES, NULL, &ec); // dereference Zones section + ures_getByIndex(ares, deref, &res, &ec); + ures_close(ares); + U_DEBUG_TZ_MSG(("alias to #%d (%s) - %s\n", deref, "??", u_errorName(ec))); + } else { + U_DEBUG_TZ_MSG(("not an alias - size %d\n", ures_getSize(&res))); + } + U_DEBUG_TZ_MSG(("%s - final status is %s\n", buf, u_errorName(ec))); + return top; +} + +#ifdef U_USE_TIMEZONE_OBSOLETE_2_8 + +/** + * Load all the ids from the "zoneinfo" resource bundle into a static + * array that we hang onto. This is _only_ used to implement the + * deprecated createAvailableIDs() API. + */ +static UBool loadOlsonIDs() { + if (OLSON_IDS != 0) { + return TRUE; + } + + UErrorCode ec = U_ZERO_ERROR; + UnicodeString* ids = 0; + int32_t count = 0; + UResourceBundle *top = ures_openDirect(0, kZONEINFO, &ec); + UResourceBundle *nres = ures_getByKey(top, kNAMES, NULL, &ec); // dereference Names section + if (U_SUCCESS(ec)) { + getOlsonMeta(top); + int32_t start = 0; + count = ures_getSize(nres); + ids = new UnicodeString[(count > 0) ? count : 1]; + for (int32_t i=0; iclone(); } return result; } -/** - * Lookup the given ID in the system time zone equivalency group table. - * Return a pointer to the equivalency group, or NULL if not found. - * DATA MUST BE INITIALIZED AND NON-NULL. - */ -static const TZEquivalencyGroup* -lookupEquivalencyGroup(const UnicodeString& id) { - // Perform a binary search. Possible optimization: Unroll the - // search. Not worth it given the small number of zones (416 in - // 1999j). - uint32_t low = 0; - uint32_t high = DATA->count; - while (high > low) { - // Invariant: match, if present, must be in the range [low, - // high). - uint32_t i = (low + high) / 2; - int8_t c = id.compare(ZONE_IDS[i]); - if (c == 0) { - return (TZEquivalencyGroup*) ((int8_t*)DATA + INDEX_BY_ID[i]); - } else if (c < 0) { - high = i; - } else { - low = i + 1; - } - } - return 0; -} - /** * Lookup the given name in our system zone table. If found, * instantiate a new zone of that name and return it. If not * found, return 0. - * - * The caller must ensure that haveZoneData() returns TRUE before - * calling. */ TimeZone* -TimeZone::createSystemTimeZone(const UnicodeString& name) { - U_ASSERT(UDATA_MEMORY != 0); - const TZEquivalencyGroup *eg = lookupEquivalencyGroup(name); - if (eg != NULL) { - return eg->isDST ? - new SimpleTimeZone(eg->u.d.zone, name) : - new SimpleTimeZone(eg->u.s.zone, name); +TimeZone::createSystemTimeZone(const UnicodeString& id) { + TimeZone* z = 0; + UErrorCode ec = U_ZERO_ERROR; + UResourceBundle res; + ures_initStackObject(&res); + U_DEBUG_TZ_MSG(("pre-err=%s\n", u_errorName(ec))); + UResourceBundle *top = openOlsonResource(id, res, ec); + U_DEBUG_TZ_MSG(("post-err=%s\n", u_errorName(ec))); + if (U_SUCCESS(ec)) { + z = new OlsonTimeZone(top, &res, ec); + if (z) { + z->setID(id); + } else { + U_DEBUG_TZ_MSG(("cstz: olson time zone failed to initialize - err %s\n", u_errorName(ec))); + } + } + ures_close(&res); + ures_close(top); + if (U_FAILURE(ec)) { + U_DEBUG_TZ_MSG(("cstz: failed to create, err %s\n", u_errorName(ec))); + delete z; + z = 0; } - return NULL; + return z; } // ------------------------------------- @@ -407,45 +520,59 @@ TimeZone::initDefault() TimeZone* default_zone = NULL; - if (haveZoneData()) { - default_zone = createSystemTimeZone(hostID); - - // If we couldn't get the time zone ID from the host, use - // the default host timezone offset. Further refinements - // to this include querying the host to determine if DST - // is in use or not and possibly using the host locale to - // select from multiple zones at a the same offset. We - // don't do any of this now, but we could easily add this. - if (default_zone == NULL) { - // Use the designated default in the time zone list that has the - // appropriate GMT offset, if there is one. - - const OffsetIndex* index = INDEX_BY_OFFSET; - - for (;;) { - if (index->gmtOffset > rawOffset) { - // Went past our desired offset; no match found - break; - } - if (index->gmtOffset == rawOffset) { - // Found our desired offset - default_zone = createSystemTimeZone(ZONE_IDS[index->defaultZone]); - break; - } - // Compute the position of the next entry. If the delta value - // in this entry is zero, then there is no next entry. - uint16_t delta = index->nextEntryDelta; - if (delta == 0) { - break; - } - index = (const OffsetIndex*)((int8_t*)index + delta); + /* Make sure that the string is NULL terminated to prevent BoundsChecker/Purify warnings. */ + UnicodeString hostStrID(hostID, -1, US_INV); + hostStrID.append((UChar)0); + hostStrID.truncate(hostStrID.length()-1); + default_zone = createSystemTimeZone(hostStrID); + +#if 0 + // NOTE: As of ICU 2.8, we no longer have an offsets table, since + // historical zones can change offset over time. If we add + // build-time heuristics to infer the "most frequent" raw offset + // of a zone, we can build tables and institute defaults, as done + // in ICU <= 2.6. + + // If we couldn't get the time zone ID from the host, use + // the default host timezone offset. Further refinements + // to this include querying the host to determine if DST + // is in use or not and possibly using the host locale to + // select from multiple zones at a the same offset. We + // don't do any of this now, but we could easily add this. + if (default_zone == NULL) { + // Use the designated default in the time zone list that has the + // appropriate GMT offset, if there is one. + + const OffsetIndex* index = INDEX_BY_OFFSET; + + for (;;) { + if (index->gmtOffset > rawOffset) { + // Went past our desired offset; no match found + break; + } + if (index->gmtOffset == rawOffset) { + // Found our desired offset + default_zone = createSystemTimeZone(ZONE_IDS[index->defaultZone]); + break; } + // Compute the position of the next entry. If the delta value + // in this entry is zero, then there is no next entry. + uint16_t delta = index->nextEntryDelta; + if (delta == 0) { + break; + } + index = (const OffsetIndex*)((int8_t*)index + delta); } } +#endif - // If we _still_ don't have a time zone, use GMT. This - // can only happen if the raw offset returned by - // uprv_timezone() does not correspond to any system zone. + // Construct a fixed standard zone with the host's ID + // and raw offset. + if (default_zone == NULL) { + default_zone = new SimpleTimeZone(rawOffset, hostStrID); + } + + // If we _still_ don't have a time zone, use GMT. if (default_zone == NULL) { default_zone = getGMT()->clone(); } @@ -455,6 +582,7 @@ TimeZone::initDefault() if (DEFAULT_ZONE == NULL) { DEFAULT_ZONE = default_zone; default_zone = NULL; + ucln_i18n_registerCleanup(UCLN_I18N_TIMEZONE, timeZone_cleanup); } umtx_unlock(&LOCK); @@ -463,7 +591,7 @@ TimeZone::initDefault() // ------------------------------------- -TimeZone* +TimeZone* U_EXPORT2 TimeZone::createDefault() { umtx_init(&LOCK); /* This is here to prevent race conditions. */ @@ -480,7 +608,7 @@ TimeZone::createDefault() // ------------------------------------- -void +void U_EXPORT2 TimeZone::adoptDefault(TimeZone* zone) { if (zone != NULL) @@ -494,246 +622,239 @@ TimeZone::adoptDefault(TimeZone* zone) umtx_unlock(&LOCK); delete old; + ucln_i18n_registerCleanup(UCLN_I18N_TIMEZONE, timeZone_cleanup); } } // ------------------------------------- -void +void U_EXPORT2 TimeZone::setDefault(const TimeZone& zone) { adoptDefault(zone.clone()); } +//---------------------------------------------------------------------- + +/** + * This is the default implementation for subclasses that do not + * override this method. This implementation calls through to the + * 8-argument getOffset() method after suitable computations, and + * correctly adjusts GMT millis to local millis when necessary. + */ +void TimeZone::getOffset(UDate date, UBool local, int32_t& rawOffset, + int32_t& dstOffset, UErrorCode& ec) const { + if (U_FAILURE(ec)) { + return; + } + + rawOffset = getRawOffset(); + + // Convert to local wall millis if necessary + if (!local) { + date += rawOffset; // now in local standard millis + } + + // When local==FALSE, we might have to recompute. This loop is + // executed once, unless a recomputation is required; then it is + // executed twice. + for (int32_t pass=0; ; ++pass) { + int32_t year, month, dom, dow; + double day = uprv_floor(date / U_MILLIS_PER_DAY); + int32_t millis = (int32_t) (date - day * U_MILLIS_PER_DAY); + + Grego::dayToFields(day, year, month, dom, dow); + + dstOffset = getOffset(GregorianCalendar::AD, year, month, dom, + (uint8_t) dow, millis, + Grego::monthLength(year, month), + ec) - rawOffset; + + // Recompute if local==FALSE, dstOffset!=0, and addition of + // the dstOffset puts us in a different day. + if (pass!=0 || local || dstOffset==0) { + break; + } + date += dstOffset; + if (uprv_floor(date / U_MILLIS_PER_DAY) == day) { + break; + } + } +} + // ------------------------------------- // New available IDs API as of ICU 2.4. Uses StringEnumeration API. class TZEnumeration : public StringEnumeration { - // Map into to ZONE_IDS. Our results are ZONE_IDS[map[i]] for - // i=0..len-1. If map==NULL then our results are ZONE_IDS[i] - // for i=0..len-1. Len will be zero iff the zone data could - // not be loaded. + // Map into to zones. Our results are zone[map[i]] for + // i=0..len-1, where zone[i] is the i-th Olson zone. If map==NULL + // then our results are zone[i] for i=0..len-1. Len will be zero + // iff the zone data could not be loaded. int32_t* map; int32_t len; int32_t pos; - void* _bufp; - int32_t _buflen; public: - TZEnumeration() { - map = NULL; - _bufp = NULL; - len = pos = _buflen = 0; - if (haveZoneData()) { - len = DATA->count; + TZEnumeration() : map(NULL), len(0), pos(0) { + if (getOlsonMeta()) { + len = OLSON_ZONE_COUNT; } } - TZEnumeration(int32_t rawOffset) { - map = NULL; - _bufp = NULL; - len = pos = _buflen = 0; + TZEnumeration(int32_t rawOffset) : map(NULL), len(0), pos(0) { + if (!getOlsonMeta()) { + return; + } - if (!haveZoneData()) { + // Allocate more space than we'll need. The end of the array will + // be blank. + map = (int32_t*)uprv_malloc(OLSON_ZONE_COUNT * sizeof(int32_t)); + if (map == 0) { return; } - /* The offset index table is a table of variable-sized objects. - * Each entry has an offset to the next entry; the last entry has - * a next entry offset of zero. - * - * The entries are sorted in ascending numerical order of GMT - * offset. Each entry lists all the system zones at that offset, - * in lexicographic order of ID. Note that this ordering is - * somewhat significant in that the _first_ zone in each list is - * what will be chosen as the default under certain fallback - * conditions. We currently just let that be the - * lexicographically first zone, but we could also adjust the list - * to pick which zone was first for this situation -- probably not - * worth the trouble. - * - * The list of zones is actually just a list of integers, from - * 0..n-1, where n is the total number of system zones. The - * numbering corresponds exactly to the ordering of ZONE_IDS. - */ - const OffsetIndex* index = INDEX_BY_OFFSET; - - for (;;) { - if (index->gmtOffset > rawOffset) { - // Went past our desired offset; no match found - break; - } - if (index->gmtOffset == rawOffset) { - // Found our desired offset - map = (int32_t*)uprv_malloc(sizeof(int32_t) * index->count); - if (map != NULL) { - len = index->count; - const uint16_t* zoneNumberArray = &(index->zoneNumber); - for (uint16_t i=0; igetID(s) == unistr && + z->getRawOffset() == rawOffset) { + map[len++] = i; } + delete z; } - // Compute the position of the next entry. If the delta value - // in this entry is zero, then there is no next entry. - uint16_t delta = index->nextEntryDelta; - if (delta == 0) { - break; - } - index = (const OffsetIndex*)((int8_t*)index + delta); } } - TZEnumeration(const char* country) { - map = NULL; - _bufp = NULL; - len = pos = _buflen = 0; - - if (!haveZoneData()) { + TZEnumeration(const char* country) : map(NULL), len(0), pos(0) { + if (!getOlsonMeta()) { return; } - /* The country index table is a table of variable-sized objects. - * Each entry has an offset to the next entry; the last entry has - * a next entry offset of zero. - * - * The entries are sorted in ascending numerical order of intcode. - * This is an integer representation of the 2-letter ISO 3166 - * country code. It is computed as (c1-'A')*32 + (c0-'A'), where - * the country code is c1 c0, with 'A' <= ci <= 'Z'. - * - * The list of zones is a list of integers, from 0..n-1, where n - * is the total number of system zones. The numbering corresponds - * exactly to the ordering of ZONE_IDS. - */ - const CountryIndex* index = INDEX_BY_COUNTRY; - - uint16_t intcode = 0; - if (country != NULL && *country != 0) { - intcode = (uint16_t)((U_UPPER_ORDINAL(country[0]) << 5) - + U_UPPER_ORDINAL(country[1])); + char key[] = {0, 0, 0, 0,0, 0, 0,0, 0, 0,0}; // e.g., "US", or "Default" for no country + if (country) { + uprv_strncat(key, country, 2); + } else { + uprv_strcpy(key, kDEFAULT); } - for (;;) { - if (index->intcode > intcode) { - // Went past our desired country; no match found - break; - } - if (index->intcode == intcode) { - // Found our desired country - map = (int32_t*)uprv_malloc(sizeof(int32_t) * index->count); - if (map != NULL) { - len = index->count; - const uint16_t* zoneNumberArray = &(index->zoneNumber); + UErrorCode ec = U_ZERO_ERROR; + UResourceBundle *top = ures_openDirect(0, kZONEINFO, &ec); + top = ures_getByKey(top, kREGIONS, top, &ec); // dereference 'Regions' section + if (U_SUCCESS(ec)) { + UResourceBundle res; + ures_initStackObject(&res); + ures_getByKey(top, key, &res, &ec); + // The list of zones is a list of integers, from 0..n-1, + // where n is the total number of system zones. + const int32_t* v = ures_getIntVector(&res, &len, &ec); + if (U_SUCCESS(ec)) { + U_ASSERT(len > 0); + map = (int32_t*)uprv_malloc(sizeof(int32_t) * len); + if (map != 0) { for (uint16_t i=0; i= 0 && v[i] < OLSON_ZONE_COUNT); + map[i] = v[i]; } } + } else { + U_DEBUG_TZ_MSG(("Failed to load tz for region %s: %s\n", country, u_errorName(ec))); } - // Compute the position of the next entry. If the delta value - // in this entry is zero, then there is no next entry. - uint16_t delta = index->nextEntryDelta; - if (delta == 0) { - break; + ures_close(&res); + } + ures_close(top); + } + + TZEnumeration(const TZEnumeration &other) : StringEnumeration(), map(NULL), len(0), pos(0) { + if(other.len > 0) { + if(other.map != NULL) { + map = (int32_t *)uprv_malloc(other.len * sizeof(int32_t)); + if(map != NULL) { + len = other.len; + uprv_memcpy(map, other.map, len * sizeof(int32_t)); + pos = other.pos; + } + } else { + len = other.len; + pos = other.pos; } - index = (const CountryIndex*)((int8_t*)index + delta); } } virtual ~TZEnumeration() { uprv_free(map); - uprv_free(_bufp); } - int32_t count(UErrorCode& status) const { - return U_FAILURE(status) ? 0 : len; - } - - const char* next(int32_t* resultLength, UErrorCode& status) { - // TODO: Later a subclass of StringEnumeration will be available - // that implements next() and unext() in terms of snext(). - // Inherit from that class when available and remove this method - // (and its declaration). - const UnicodeString* us = snext(status); - int32_t newlen; - if (us != NULL && ensureCapacity((newlen=us->length()) + 1)) { - us->extract(0, INT32_MAX, (char*) _bufp, ""); - if (resultLength) { - resultLength[0] = newlen; - } - return (const char*)_bufp; - } - return NULL; + virtual StringEnumeration *clone() const { + return new TZEnumeration(*this); } - const UChar* unext(int32_t* resultLength, UErrorCode& status) { - const UnicodeString* us = snext(status); - if (us != NULL) { - if (resultLength) { - resultLength[0] = us->length(); - } - // TimeZone terminates the ID strings when it builds them - return us->getBuffer(); - } - return NULL; + virtual int32_t count(UErrorCode& status) const { + return U_FAILURE(status) ? 0 : len; } - const UnicodeString* snext(UErrorCode& status) { + virtual const UnicodeString* snext(UErrorCode& status) { if (U_SUCCESS(status) && pos < len) { - return (map != NULL) ? - &ZONE_IDS[map[pos++]] : &ZONE_IDS[pos++]; + getID((map == 0) ? pos : map[pos]); + ++pos; + return &unistr; } - return NULL; + return 0; } - void reset(UErrorCode& /*status*/) { + virtual void reset(UErrorCode& /*status*/) { pos = 0; } private: - static const char fgClassID; -public: - static inline UClassID getStaticClassID(void) { return (UClassID)&fgClassID; } - virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); } -private: - /** - * Guarantee that _bufp is allocated to include _buflen characters - * where _buflen >= minlen. Return TRUE if successful, FALSE - * otherwise. - */ - UBool ensureCapacity(int32_t minlen) { - if (_bufp != NULL && _buflen >= minlen) { - return TRUE; + UBool getID(int32_t i) { + UErrorCode ec = U_ZERO_ERROR; + int32_t idLen = 0; + const UChar* id = NULL; + UResourceBundle *top = ures_openDirect(0, kZONEINFO, &ec); + top = ures_getByKey(top, kNAMES, top, &ec); // dereference Zones section + id = ures_getStringByIndex(top, i, &idLen, &ec); + if(U_FAILURE(ec)) { + unistr.truncate(0); } - _buflen = minlen + 8; // add 8 to prevent thrashing - _bufp = (_bufp == NULL) ? uprv_malloc(_buflen) - : uprv_realloc(_bufp, _buflen); - return _bufp != NULL; + else { + unistr.fastCopyFrom(UnicodeString(TRUE, id, idLen)); + } + ures_close(top); + return U_SUCCESS(ec); } + +public: + static UClassID U_EXPORT2 getStaticClassID(void); + virtual UClassID getDynamicClassID(void) const; }; -const char TZEnumeration::fgClassID = '\0'; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(TZEnumeration) -StringEnumeration* +StringEnumeration* U_EXPORT2 TimeZone::createEnumeration() { return new TZEnumeration(); } -StringEnumeration* +StringEnumeration* U_EXPORT2 TimeZone::createEnumeration(int32_t rawOffset) { return new TZEnumeration(rawOffset); } -StringEnumeration* +StringEnumeration* U_EXPORT2 TimeZone::createEnumeration(const char* country) { return new TZEnumeration(country); } // ------------------------------------- -// TODO: #ifdef out this code after 8-Nov-2003 -// #ifdef ICU_TIMEZONE_USE_DEPRECATES +#ifdef U_USE_TIMEZONE_OBSOLETE_2_8 const UnicodeString** TimeZone::createAvailableIDs(int32_t rawOffset, int32_t& numIDs) @@ -741,61 +862,36 @@ TimeZone::createAvailableIDs(int32_t rawOffset, int32_t& numIDs) // We are creating a new array to existing UnicodeString pointers. // The caller will delete the array when done, but not the pointers // in the array. - - if (!haveZoneData()) { - numIDs = 0; + + numIDs = 0; + if (!loadOlsonIDs()) { return 0; } - /* The offset index table is a table of variable-sized objects. - * Each entry has an offset to the next entry; the last entry has - * a next entry offset of zero. - * - * The entries are sorted in ascending numerical order of GMT - * offset. Each entry lists all the system zones at that offset, - * in lexicographic order of ID. Note that this ordering is - * somewhat significant in that the _first_ zone in each list is - * what will be chosen as the default under certain fallback - * conditions. We currently just let that be the - * lexicographically first zone, but we could also adjust the list - * to pick which zone was first for this situation -- probably not - * worth the trouble. - * - * The list of zones is actually just a list of integers, from - * 0..n-1, where n is the total number of system zones. The - * numbering corresponds exactly to the ordering of ZONE_IDS. - */ - const OffsetIndex* index = INDEX_BY_OFFSET; + // Allocate more space than we'll need. The end of the array will + // be blank. + const UnicodeString** ids = + (const UnicodeString** )uprv_malloc(OLSON_ZONE_COUNT * sizeof(UnicodeString *)); + if (ids == 0) { + return 0; + } - for (;;) { - if (index->gmtOffset > rawOffset) { - // Went past our desired offset; no match found - break; - } - if (index->gmtOffset == rawOffset) { - // Found our desired offset - const UnicodeString** result = - (const UnicodeString**)uprv_malloc(index->count * sizeof(UnicodeString *)); - const uint16_t* zoneNumberArray = &(index->zoneNumber); - for (uint16_t i=0; icount; ++i) { - // Pointer assignment - use existing UnicodeString object! - // Don't create a new UnicodeString on the heap here! - result[i] = &ZONE_IDS[zoneNumberArray[i]]; - } - numIDs = index->count; - return result; + uprv_memset(ids, 0, sizeof(UnicodeString*) * OLSON_ZONE_COUNT); + + UnicodeString s; + for (int32_t i=0; igetID(s) == OLSON_IDS[i] && + z->getRawOffset() == rawOffset) { + ids[numIDs++] = &OLSON_IDS[i]; // [sic] } - // Compute the position of the next entry. If the delta value - // in this entry is zero, then there is no next entry. - uint16_t delta = index->nextEntryDelta; - if (delta == 0) { - break; - } - index = (const OffsetIndex*)((int8_t*)index + delta); + delete z; } - numIDs = 0; - return 0; + return ids; } // ------------------------------------- @@ -806,62 +902,53 @@ TimeZone::createAvailableIDs(const char* country, int32_t& numIDs) { // We are creating a new array to existing UnicodeString pointers. // The caller will delete the array when done, but not the pointers // in the array. - - if (!haveZoneData()) { - numIDs = 0; - return 0; - } - /* The country index table is a table of variable-sized objects. - * Each entry has an offset to the next entry; the last entry has - * a next entry offset of zero. - * - * The entries are sorted in ascending numerical order of intcode. - * This is an integer representation of the 2-letter ISO 3166 - * country code. It is computed as (c1-'A')*32 + (c0-'A'), where - * the country code is c1 c0, with 'A' <= ci <= 'Z'. - * - * The list of zones is a list of integers, from 0..n-1, where n - * is the total number of system zones. The numbering corresponds - * exactly to the ordering of ZONE_IDS. - */ - const CountryIndex* index = INDEX_BY_COUNTRY; - - uint16_t intcode = 0; - if (country != NULL && *country != 0) { - intcode = (uint16_t)((U_UPPER_ORDINAL(country[0]) << 5) - + U_UPPER_ORDINAL(country[1])); + numIDs = 0; + if (!loadOlsonIDs()) { + return 0; } - for (;;) { - if (index->intcode > intcode) { - // Went past our desired country; no match found - break; - } - if (index->intcode == intcode) { - // Found our desired country - const UnicodeString** result = - (const UnicodeString**)uprv_malloc(index->count * sizeof(UnicodeString *)); - const uint16_t* zoneNumberArray = &(index->zoneNumber); - for (uint16_t i=0; icount; ++i) { - // Pointer assignment - use existing UnicodeString object! - // Don't create a new UnicodeString on the heap here! - result[i] = &ZONE_IDS[zoneNumberArray[i]]; + char key[] = { 0, 0, 0,0, 0, 0,0, 0, 0 }; // e.g., "US", or "Default" for non-country zones + if (country) { + uprv_strncat(key, country, 2); + } else { + uprv_strcpy(key, kDEFAULT); + } + + const UnicodeString** ids = 0; + + UErrorCode ec = U_ZERO_ERROR; + UResourceBundle *top = ures_openDirect(0, kZONEINFO, &ec); + UResourceBundle *ares = ures_getByKey(top, kREGIONS, NULL, &ec); // dereference Regions section + if (U_SUCCESS(ec)) { + getOlsonMeta(top); + UResourceBundle res; + ures_initStackObject(&res); + ures_getByKey(ares, key, &res, &ec); + U_DEBUG_TZ_MSG(("caI: on %s, err %s\n", country, u_errorName(ec))); + if (U_SUCCESS(ec)) { + /* The list of zones is a list of integers, from 0..n-1, + * where n is the total number of system zones. The + * numbering corresponds exactly to the ordering of + * OLSON_IDS. + */ + const int32_t* v = ures_getIntVector(&res, &numIDs, &ec); + ids = (const UnicodeString**) + uprv_malloc(numIDs * sizeof(UnicodeString*)); + if (ids == 0) { + numIDs = 0; + } else { + for (int32_t i=0; icount; - return result; } - // Compute the position of the next entry. If the delta value - // in this entry is zero, then there is no next entry. - uint16_t delta = index->nextEntryDelta; - if (delta == 0) { - break; - } - index = (const CountryIndex*)((int8_t*)index + delta); + ures_close(&res); } + ures_close(ares); + ures_close(top); - numIDs = 0; - return 0; + return ids; } // ------------------------------------- @@ -872,60 +959,97 @@ TimeZone::createAvailableIDs(int32_t& numIDs) // We are creating a new array to existing UnicodeString pointers. // The caller will delete the array when done, but not the pointers // in the array. - // - // This is really unnecessary, given the fact that we have an - // array of the IDs already constructed, and we could just return - // that. However, that would be a breaking API change, and some - // callers familiar with the original API might try to delete it. - - if (!haveZoneData()) { - numIDs = 0; + numIDs = 0; + if (!loadOlsonIDs()) { return 0; } - - const UnicodeString** result = - (const UnicodeString** )uprv_malloc(DATA->count * sizeof(UnicodeString *)); - - // Create a list of pointers to each and every zone ID - for (uint32_t i=0; icount; ++i) { - // Pointer assignment - use existing UnicodeString object! - // Don't create a new UnicodeString on the heap here! - result[i] = &ZONE_IDS[i]; + + const UnicodeString** ids = + (const UnicodeString** )uprv_malloc(OLSON_ZONE_COUNT * sizeof(UnicodeString *)); + if (ids != 0) { + numIDs = OLSON_ZONE_COUNT; + for (int32_t i=0; icount; - return result; + return ids; } -// ICU_TIMEZONE_USE_DEPRECATES -// #endif -// see above +#endif // --------------------------------------- -int32_t +int32_t U_EXPORT2 TimeZone::countEquivalentIDs(const UnicodeString& id) { - if (!haveZoneData()) { - return 0; + int32_t result = 0; + UErrorCode ec = U_ZERO_ERROR; + UResourceBundle res; + ures_initStackObject(&res); + U_DEBUG_TZ_MSG(("countEquivalentIDs..\n")); + UResourceBundle *top = openOlsonResource(id, res, ec); + if (U_SUCCESS(ec)) { + int32_t size = ures_getSize(&res); + U_DEBUG_TZ_MSG(("cEI: success (size %d, key %s)..\n", size, ures_getKey(&res))); + if (size == 4 || size == 6) { + UResourceBundle r; + ures_initStackObject(&r); + ures_getByIndex(&res, size-1, &r, &ec); + //result = ures_getSize(&r); // doesn't work + ures_getIntVector(&r, &result, &ec); + U_DEBUG_TZ_MSG(("ceI: result %d, err %s\n", result, u_errorName(ec))); + ures_close(&r); + } + } else { + U_DEBUG_TZ_MSG(("cEI: fail, %s\n", u_errorName(ec))); } - const TZEquivalencyGroup *eg = lookupEquivalencyGroup(id); - return (eg != 0) ? (eg->isDST ? eg->u.d.count : eg->u.s.count) : 0; + ures_close(&res); + ures_close(top); + return result; } // --------------------------------------- -const UnicodeString +const UnicodeString U_EXPORT2 TimeZone::getEquivalentID(const UnicodeString& id, int32_t index) { - if (haveZoneData()) { - const TZEquivalencyGroup *eg = lookupEquivalencyGroup(id); - if (eg != 0) { - const uint16_t *p = eg->isDST ? &eg->u.d.count : &eg->u.s.count; - if (index >= 0 && index < *p) { - return ZONE_IDS[p[index+1]]; + U_DEBUG_TZ_MSG(("gEI(%d)\n", index)); + UnicodeString result; + UErrorCode ec = U_ZERO_ERROR; + UResourceBundle res; + ures_initStackObject(&res); + UResourceBundle *top = openOlsonResource(id, res, ec); + int32_t zone = -1; + if (U_SUCCESS(ec)) { + int32_t size = ures_getSize(&res); + if (size == 4 || size == 6) { + UResourceBundle r; + ures_initStackObject(&r); + ures_getByIndex(&res, size-1, &r, &ec); + const int32_t* v = ures_getIntVector(&r, &size, &ec); + if (index >= 0 && index < size && getOlsonMeta()) { + zone = v[index]; } + ures_close(&r); + } + } + ures_close(&res); + if (zone >= 0) { + UResourceBundle *ares = ures_getByKey(top, kNAMES, NULL, &ec); // dereference Zones section + if (U_SUCCESS(ec)) { + int32_t idLen = 0; + const UChar* id = ures_getStringByIndex(ares, zone, &idLen, &ec); + result.fastCopyFrom(UnicodeString(TRUE, id, idLen)); + U_DEBUG_TZ_MSG(("gei(%d) -> %d, len%d, %s\n", index, zone, result.length(), u_errorName(ec))); } + ures_close(ares); + } + ures_close(top); +#if defined(U_DEBUG_TZ) + if(result.length() ==0) { + U_DEBUG_TZ_MSG(("equiv [__, #%d] -> 0 (%s)\n", index, u_errorName(ec))); } - return UnicodeString(); +#endif + return result; } // --------------------------------------- @@ -954,13 +1078,20 @@ TimeZone::getDisplayName(UBool daylight, EDisplayType style, const Locale& local { // SRL TODO: cache the SDF, just like java. UErrorCode status = U_ZERO_ERROR; - - SimpleDateFormat format(style == LONG ? "zzzz" : "z",locale,status); - +#ifdef U_DEBUG_TZ + char buf[128]; + fID.extract(0, sizeof(buf)-1, buf, sizeof(buf), ""); +#endif + SimpleDateFormat format(style == LONG ? ZZZZ_STR : Z_STR,locale,status); + U_DEBUG_TZ_MSG(("getDisplayName(%s)\n", buf)); if(!U_SUCCESS(status)) { - // *** SRL what do I do here?!! - return result.remove(); +#ifdef U_DEBUG_TZ + char buf2[128]; + result.extract(0, sizeof(buf2)-1, buf2, sizeof(buf2), ""); + U_DEBUG_TZ_MSG(("getDisplayName(%s) -> %s\n", buf, buf2)); +#endif + return result.remove(); } // Create a new SimpleTimeZone as a stand-in for this zone; the @@ -976,7 +1107,7 @@ TimeZone::getDisplayName(UBool daylight, EDisplayType style, const Locale& local UCAL_DECEMBER , 31, 0, U_MILLIS_PER_DAY, status) : new SimpleTimeZone(getRawOffset(), getID(tempID)); - format.applyPattern(style == LONG ? "zzzz" : "z"); + format.applyPattern(style == LONG ? ZZZZ_STR : Z_STR); Calendar *myCalendar = (Calendar*)format.getCalendar(); myCalendar->setTimeZone(*tz); // copy diff --git a/icuSources/i18n/titletrn.cpp b/icuSources/i18n/titletrn.cpp index 99e40dda..dd3375b9 100644 --- a/icuSources/i18n/titletrn.cpp +++ b/icuSources/i18n/titletrn.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2001-2003, International Business Machines +* Copyright (C) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -17,84 +17,32 @@ #include "unicode/ustring.h" #include "titletrn.h" #include "umutex.h" -#include "ucln_in.h" -#include "ustr_imp.h" +#include "ucase.h" #include "cpputils.h" U_NAMESPACE_BEGIN -const char TitlecaseTransliterator::fgClassID=0; - -/** - * ID for this transliterator. - */ -const char TitlecaseTransliterator::_ID[] = "Any-Title"; - -/** - * The set of characters we skip. These are neither cased nor - * non-cased, to us; we copy them verbatim. INVARIANT: Either SKIP - * and CASED are both NULL, or neither is NULL. - */ -static UnicodeSet* SKIP = NULL; - -/** - * The set of characters that cause the next non-SKIP character to be - * lowercased. INVARIANT: Either SKIP and CASED are both NULL, or - * neither is NULL. - */ -static UnicodeSet* CASED = NULL; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(TitlecaseTransliterator) TitlecaseTransliterator::TitlecaseTransliterator(const Locale& theLoc) : - Transliterator(_ID, 0), - loc(theLoc), - buffer(0) + CaseMapTransliterator(theLoc, UNICODE_STRING("Any-Title", 9), NULL) { - buffer = (UChar *)uprv_malloc(u_getMaxCaseExpansion()*sizeof(buffer[0])); // Need to look back 2 characters in the case of "can't" setMaximumContextLength(2); - - umtx_lock(NULL); - UBool f = (SKIP == NULL); - umtx_unlock(NULL); - - if (f) { - UErrorCode ec = U_ZERO_ERROR; - UnicodeSet* skip = - new UnicodeSet(UNICODE_STRING_SIMPLE("[\\u00AD \\u2019 \\' [:Mn:] [:Me:] [:Cf:] [:Lm:] [:Sk:]]"), ec); - UnicodeSet* cased = - new UnicodeSet(UNICODE_STRING_SIMPLE("[[:Lu:] [:Ll:] [:Lt:]]"), ec); - if (skip != NULL && cased != NULL && U_SUCCESS(ec)) { - umtx_lock(NULL); - if (SKIP == NULL) { - SKIP = skip; - CASED = cased; - skip = cased = NULL; - } - umtx_unlock(NULL); - } - delete skip; - delete cased; - ucln_i18n_registerCleanup(); - } } /** * Destructor. */ TitlecaseTransliterator::~TitlecaseTransliterator() { - uprv_free(buffer); } /** * Copy constructor. */ TitlecaseTransliterator::TitlecaseTransliterator(const TitlecaseTransliterator& o) : - Transliterator(o), - loc(o.loc), - buffer(0) + CaseMapTransliterator(o) { - buffer = (UChar *)uprv_malloc(u_getMaxCaseExpansion()*sizeof(buffer[0])); - uprv_arrayCopy(o.buffer, 0, this->buffer, 0, u_getMaxCaseExpansion()); } /** @@ -102,9 +50,7 @@ TitlecaseTransliterator::TitlecaseTransliterator(const TitlecaseTransliterator& */ TitlecaseTransliterator& TitlecaseTransliterator::operator=( const TitlecaseTransliterator& o) { - Transliterator::operator=(o); - loc = o.loc; - uprv_arrayCopy(o.buffer, 0, this->buffer, 0, u_getMaxCaseExpansion()); + CaseMapTransliterator::operator=(o); return *this; } @@ -120,89 +66,99 @@ Transliterator* TitlecaseTransliterator::clone(void) const { */ void TitlecaseTransliterator::handleTransliterate( Replaceable& text, UTransPosition& offsets, - UBool isIncremental) const { - if (SKIP == NULL) { + UBool isIncremental) const +{ + // TODO reimplement, see ustrcase.c + // using a real word break iterator + // instead of just looking for a transition between cased and uncased characters + // call CaseMapTransliterator::handleTransliterate() for lowercasing? (set fMap) + // needs to take isIncremental into account because case mappings are context-sensitive + // also detect when lowercasing function did not finish because of context + + if (offsets.start >= offsets.limit) { return; } + // case type: >0 cased (UCASE_LOWER etc.) ==0 uncased <0 case-ignorable + int32_t type; + // Our mode; we are either converting letter toTitle or // toLower. UBool doTitle = TRUE; - // Determine if there is a preceding context of CASED SKIP*, + // Determine if there is a preceding context of cased case-ignorable*, // in which case we want to start in toLower mode. If the // prior context is anything else (including empty) then start // in toTitle mode. UChar32 c; int32_t start; - for (start = offsets.start - 1; start >= offsets.contextStart; start -= UTF_CHAR_LENGTH(c)) { + for (start = offsets.start - 1; start >= offsets.contextStart; start -= U16_LENGTH(c)) { c = text.char32At(start); - if (SKIP->contains(c)) { - continue; + type=ucase_getTypeOrIgnorable(fCsp, c); + if(type>0) { // cased + doTitle=FALSE; + break; + } else if(type==0) { // uncased but not ignorable + break; } - doTitle = !CASED->contains(c); - break; + // else (type<0) case-ignorable: continue } - // Convert things after a CASED character toLower; things - // after a non-CASED, non-SKIP character toTitle. SKIP + // Convert things after a cased character toLower; things + // after an uncased, non-case-ignorable character toTitle. Case-ignorable // characters are copied directly and do not change the mode. - int32_t textPos = offsets.start; - if (textPos >= offsets.limit) return; - - UnicodeString original; - text.extractBetween(offsets.contextStart, offsets.contextLimit, original); - - UCharIterator iter; - uiter_setReplaceable(&iter, &text); - iter.start = offsets.contextStart; - iter.limit = offsets.contextLimit; - - // Walk through original string - // If there is a case change, modify corresponding position in replaceable - - int32_t i = textPos - offsets.contextStart; - int32_t limit = offsets.limit - offsets.contextStart; - UChar32 cp; - int32_t oldLen; - int32_t newLen; - - for (; i < limit; ) { - UTF_GET_CHAR(original.getBuffer(), 0, i, original.length(), cp); - oldLen = UTF_CHAR_LENGTH(cp); - i += oldLen; - iter.index = i; // Point _past_ current char - if (!SKIP->contains(cp)) { - if (doTitle) { - newLen = u_internalToTitle(cp, &iter, buffer, u_getMaxCaseExpansion(), loc.getName()); + UCaseContext csc; + uprv_memset(&csc, 0, sizeof(csc)); + csc.p = &text; + csc.start = offsets.contextStart; + csc.limit = offsets.contextLimit; + + UnicodeString tmp; + const UChar *s; + int32_t textPos, delta, result, locCache=0; + + for(textPos=offsets.start; textPos=0) { // not case-ignorable + if(doTitle) { + result=ucase_toFullTitle(fCsp, c, utrans_rep_caseContextIterator, &csc, &s, fLocName, &locCache); } else { - newLen = u_internalToLower(cp, &iter, buffer, u_getMaxCaseExpansion(), loc.getName()); + result=ucase_toFullLower(fCsp, c, utrans_rep_caseContextIterator, &csc, &s, fLocName, &locCache); } - doTitle = !CASED->contains(cp); - if (newLen >= 0) { - UnicodeString temp(buffer, newLen); - text.handleReplaceBetween(textPos, textPos + oldLen, temp); - if (newLen != oldLen) { - textPos += newLen; - offsets.limit += newLen - oldLen; - offsets.contextLimit += newLen - oldLen; - continue; + doTitle = (UBool)(type==0); // doTitle=isUncased + + if(csc.b1 && isIncremental) { + // fMap() tried to look beyond the context limit + // wait for more input + break; + } + + if(result>=0) { + // replace the current code point with its full case mapping result + // see UCASE_MAX_STRING_LENGTH + if(result<=UCASE_MAX_STRING_LENGTH) { + // string s[result] + tmp.setTo(FALSE, s, result); + delta=result-U16_LENGTH(c); + } else { + // single code point + tmp.setTo(result); + delta=tmp.length()-U16_LENGTH(c); + } + text.handleReplaceBetween(csc.cpStart, textPos, tmp); + if(delta!=0) { + textPos+=delta; + csc.limit=offsets.contextLimit+=delta; + offsets.limit+=delta; } } } - textPos += oldLen; - } - offsets.start = offsets.limit; -} - -/** - * Static memory cleanup function. - */ -void TitlecaseTransliterator::cleanup() { - if (SKIP != NULL) { - delete SKIP; SKIP = NULL; - delete CASED; CASED = NULL; } + offsets.start=textPos; } U_NAMESPACE_END diff --git a/icuSources/i18n/titletrn.h b/icuSources/i18n/titletrn.h index 4a5ac416..b8c67d6e 100644 --- a/icuSources/i18n/titletrn.h +++ b/icuSources/i18n/titletrn.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2001, International Business Machines +* Copyright (C) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -16,6 +16,8 @@ #include "unicode/translit.h" #include "unicode/locid.h" +#include "ucase.h" +#include "casetrn.h" U_NAMESPACE_BEGIN @@ -26,13 +28,7 @@ U_NAMESPACE_BEGIN * case using u_totitle(). * @author Alan Liu */ -class U_I18N_API TitlecaseTransliterator : public Transliterator { - - /** - * ID for this transliterator. - */ - static const char _ID[]; - +class U_I18N_API TitlecaseTransliterator : public CaseMapTransliterator { public: /** @@ -60,21 +56,21 @@ class U_I18N_API TitlecaseTransliterator : public Transliterator { * Transliterator API. * @return a copy of the object. */ - Transliterator* clone(void) const; + virtual Transliterator* clone(void) const; /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * * @draft ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * * @draft ICU 2.2 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } + static UClassID U_EXPORT2 getStaticClassID(); protected: @@ -87,25 +83,8 @@ class U_I18N_API TitlecaseTransliterator : public Transliterator { * @param incremental if true, assume more text may be coming after * pos.contextLimit. Otherwise, assume the text is complete. */ - void handleTransliterate(Replaceable& text, UTransPosition& offset, + virtual void handleTransliterate(Replaceable& text, UTransPosition& offset, UBool isIncremental) const; - - public: - - /** - * Static memory cleanup function. FOR INTERNAL USE ONLY; DO NOT - * CALL. - */ - static void cleanup(); - private: - Locale loc; - UChar* buffer; - - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; U_NAMESPACE_END diff --git a/icuSources/i18n/tolowtrn.cpp b/icuSources/i18n/tolowtrn.cpp index 1187412e..6eab680c 100644 --- a/icuSources/i18n/tolowtrn.cpp +++ b/icuSources/i18n/tolowtrn.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2001, International Business Machines +* Copyright (C) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -20,34 +20,28 @@ U_NAMESPACE_BEGIN -const char LowercaseTransliterator::fgClassID=0; - -const char LowercaseTransliterator::_ID[] = "Any-Lower"; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LowercaseTransliterator) /** * Constructs a transliterator. */ -LowercaseTransliterator::LowercaseTransliterator(const Locale& theLoc) : Transliterator(_ID, 0), - loc(theLoc) , buffer(0) +LowercaseTransliterator::LowercaseTransliterator(const Locale& theLoc) : + CaseMapTransliterator(theLoc, UNICODE_STRING("Any-Lower", 9), ucase_toFullLower) { - buffer = (UChar *)uprv_malloc(u_getMaxCaseExpansion()*sizeof(buffer[0])); } /** * Destructor. */ LowercaseTransliterator::~LowercaseTransliterator() { - uprv_free(buffer); } /** * Copy constructor. */ LowercaseTransliterator::LowercaseTransliterator(const LowercaseTransliterator& o) : - Transliterator(o), - loc(o.loc), buffer(0) + CaseMapTransliterator(o) { - buffer = (UChar *)uprv_malloc(u_getMaxCaseExpansion()*sizeof(buffer[0])); } /** @@ -55,9 +49,7 @@ LowercaseTransliterator::LowercaseTransliterator(const LowercaseTransliterator& */ LowercaseTransliterator& LowercaseTransliterator::operator=( const LowercaseTransliterator& o) { - Transliterator::operator=(o); - loc = o.loc; - uprv_arrayCopy((const UChar*)o.buffer, 0, this->buffer, 0, u_getMaxCaseExpansion()); + CaseMapTransliterator::operator=(o); return *this; } @@ -68,54 +60,6 @@ Transliterator* LowercaseTransliterator::clone(void) const { return new LowercaseTransliterator(*this); } -/** - * Implements {@link Transliterator#handleTransliterate}. - */ -void LowercaseTransliterator::handleTransliterate(Replaceable& text, - UTransPosition& offsets, - UBool isIncremental) const -{ - int32_t textPos = offsets.start; - if (textPos >= offsets.limit) return; - - // get string for context - - UnicodeString original; - text.extractBetween(offsets.contextStart, offsets.contextLimit, original); - - UCharIterator iter; - uiter_setReplaceable(&iter, &text); - iter.start = offsets.contextStart; - iter.limit = offsets.contextLimit; - - // Walk through original string - // If there is a case change, modify corresponding position in replaceable - - int32_t i = textPos - offsets.contextStart; - int32_t limit = offsets.limit - offsets.contextStart; - UChar32 cp; - int32_t oldLen; - - for (; i < limit; ) { - UTF_GET_CHAR(original.getBuffer(), 0, i, original.length(), cp); - oldLen = UTF_CHAR_LENGTH(cp); - i += oldLen; - iter.index = i; // Point _past_ current char - int32_t newLen = u_internalToLower(cp, &iter, buffer, u_getMaxCaseExpansion(), loc.getName()); - if (newLen >= 0) { - UnicodeString temp(buffer, newLen); - text.handleReplaceBetween(textPos, textPos + oldLen, temp); - if (newLen != oldLen) { - textPos += newLen; - offsets.limit += newLen - oldLen; - offsets.contextLimit += newLen - oldLen; - continue; - } - } - textPos += oldLen; - } - offsets.start = offsets.limit; -} U_NAMESPACE_END #endif /* #if !UCONFIG_NO_TRANSLITERATION */ diff --git a/icuSources/i18n/tolowtrn.h b/icuSources/i18n/tolowtrn.h index 791781aa..c5bccc03 100644 --- a/icuSources/i18n/tolowtrn.h +++ b/icuSources/i18n/tolowtrn.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2001, International Business Machines +* Copyright (C) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -16,6 +16,7 @@ #include "unicode/translit.h" #include "unicode/locid.h" +#include "casetrn.h" U_NAMESPACE_BEGIN @@ -24,7 +25,7 @@ U_NAMESPACE_BEGIN * case mapping. * @author Alan Liu */ -class U_I18N_API LowercaseTransliterator : public Transliterator { +class U_I18N_API LowercaseTransliterator : public CaseMapTransliterator { public: @@ -53,48 +54,21 @@ class U_I18N_API LowercaseTransliterator : public Transliterator { * Transliterator API. * @return a copy of the object. */ - Transliterator* clone(void) const; + virtual Transliterator* clone(void) const; /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * * @draft ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * * @draft ICU 2.2 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } - - protected: - - /** - * Implements {@link Transliterator#handleTransliterate}. - * @param text the buffer holding transliterated and - * untransliterated text - * @param offset the start and limit of the text, the position - * of the cursor, and the start and limit of transliteration. - * @param incremental if true, assume more text may be coming after - * pos.contextLimit. Otherwise, assume the text is complete. - */ - virtual void handleTransliterate(Replaceable& text, - UTransPosition& offsets, - UBool isIncremental) const; - - private: - - Locale loc; - UChar* buffer; - static const char _ID[]; - - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; + static UClassID U_EXPORT2 getStaticClassID(); }; U_NAMESPACE_END diff --git a/icuSources/i18n/toupptrn.cpp b/icuSources/i18n/toupptrn.cpp index cf283566..3d099da2 100644 --- a/icuSources/i18n/toupptrn.cpp +++ b/icuSources/i18n/toupptrn.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2001, International Business Machines +* Copyright (C) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -20,38 +20,28 @@ U_NAMESPACE_BEGIN -const char UppercaseTransliterator::fgClassID=0; - -const char UppercaseTransliterator::_ID[] = "Any-Upper"; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(UppercaseTransliterator) /** * Constructs a transliterator. */ UppercaseTransliterator::UppercaseTransliterator(const Locale& theLoc) : - Transliterator(_ID, 0), - loc(theLoc), - buffer(0) + CaseMapTransliterator(theLoc, UNICODE_STRING("Any-Upper", 9), ucase_toFullUpper) { - buffer = (UChar *)uprv_malloc(u_getMaxCaseExpansion()*sizeof(buffer[0])); } /** * Destructor. */ UppercaseTransliterator::~UppercaseTransliterator() { - uprv_free(buffer); } /** * Copy constructor. */ UppercaseTransliterator::UppercaseTransliterator(const UppercaseTransliterator& o) : - Transliterator(o), - loc(o.loc), - buffer(0) + CaseMapTransliterator(o) { - buffer = (UChar *)uprv_malloc(u_getMaxCaseExpansion()*sizeof(buffer[0])); - uprv_arrayCopy(o.buffer, 0, this->buffer, 0, u_getMaxCaseExpansion()); } /** @@ -59,9 +49,7 @@ UppercaseTransliterator::UppercaseTransliterator(const UppercaseTransliterator& */ UppercaseTransliterator& UppercaseTransliterator::operator=( const UppercaseTransliterator& o) { - Transliterator::operator=(o); - loc = o.loc; - uprv_arrayCopy(o.buffer, 0, this->buffer, 0, u_getMaxCaseExpansion()); + CaseMapTransliterator::operator=(o); return *this; } @@ -72,54 +60,6 @@ Transliterator* UppercaseTransliterator::clone(void) const { return new UppercaseTransliterator(*this); } -/** - * Implements {@link Transliterator#handleTransliterate}. - */ -void UppercaseTransliterator::handleTransliterate(Replaceable& text, - UTransPosition& offsets, - UBool isIncremental) const { - int32_t textPos = offsets.start; - if (textPos >= offsets.limit) return; - - // get string for context - - UnicodeString original; - text.extractBetween(offsets.contextStart, offsets.contextLimit, original); - - UCharIterator iter; - uiter_setReplaceable(&iter, &text); - iter.start = offsets.contextStart; - iter.limit = offsets.contextLimit; - - // Walk through original string - // If there is a case change, modify corresponding position in replaceable - - int32_t i = textPos - offsets.contextStart; - int32_t limit = offsets.limit - offsets.contextStart; - UChar32 cp; - int32_t oldLen; - - for (; i < limit; ) { - UTF_GET_CHAR(original.getBuffer(), 0, i, original.length(), cp); - oldLen = UTF_CHAR_LENGTH(cp); - i += oldLen; - iter.index = i; // Point _past_ current char - int32_t newLen = u_internalToUpper(cp, &iter, buffer, u_getMaxCaseExpansion(), loc.getName()); - if (newLen >= 0) { - UnicodeString temp(buffer, newLen); - text.handleReplaceBetween(textPos, textPos + oldLen, temp); - if (newLen != oldLen) { - textPos += newLen; - offsets.limit += newLen - oldLen; - offsets.contextLimit += newLen - oldLen; - continue; - } - } - textPos += oldLen; - } - offsets.start = offsets.limit; -} - U_NAMESPACE_END #endif /* #if !UCONFIG_NO_TRANSLITERATION */ diff --git a/icuSources/i18n/toupptrn.h b/icuSources/i18n/toupptrn.h index cf828b72..d1796832 100644 --- a/icuSources/i18n/toupptrn.h +++ b/icuSources/i18n/toupptrn.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2001, International Business Machines +* Copyright (C) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -16,6 +16,7 @@ #include "unicode/translit.h" #include "unicode/locid.h" +#include "casetrn.h" U_NAMESPACE_BEGIN @@ -24,7 +25,7 @@ U_NAMESPACE_BEGIN * case mapping. * @author Alan Liu */ -class U_I18N_API UppercaseTransliterator : public Transliterator { +class U_I18N_API UppercaseTransliterator : public CaseMapTransliterator { public: @@ -53,49 +54,21 @@ class U_I18N_API UppercaseTransliterator : public Transliterator { * Transliterator API. * @return a copy of the object. */ - Transliterator* clone(void) const; + virtual Transliterator* clone(void) const; /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * * @draft ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * * @draft ICU 2.2 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } - - protected: - - - /** - * Implements {@link Transliterator#handleTransliterate}. - * @param text the buffer holding transliterated and - * untransliterated text - * @param offset the start and limit of the text, the position - * of the cursor, and the start and limit of transliteration. - * @param incremental if true, assume more text may be coming after - * pos.contextLimit. Otherwise, assume the text is complete. - */ - virtual void handleTransliterate(Replaceable& text, - UTransPosition& offsets, - UBool isIncremental) const; - - private: - - Locale loc; - UChar* buffer; - static const char _ID[]; - - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; + static UClassID U_EXPORT2 getStaticClassID(); }; U_NAMESPACE_END diff --git a/icuSources/i18n/translit.cpp b/icuSources/i18n/translit.cpp index f5e8a56e..874bff99 100644 --- a/icuSources/i18n/translit.cpp +++ b/icuSources/i18n/translit.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -19,9 +19,9 @@ #include "unicode/rep.h" #include "unicode/resbund.h" #include "unicode/unifilt.h" -#include "unicode/unifltlg.h" #include "unicode/uniset.h" #include "unicode/uscript.h" +#include "unicode/strenum.h" #include "cpdtrans.h" #include "nultrans.h" #include "rbt_data.h" @@ -100,11 +100,7 @@ static const UChar EMPTY[] = {0}; //"" U_NAMESPACE_BEGIN -/** - * Class identifier for subclasses of Transliterator that do not - * define their class (anonymous subclasses). - */ -const char Transliterator::fgClassID = 0; // Value is irrelevant +UOBJECT_DEFINE_ABSTRACT_RTTI_IMPLEMENTATION(Transliterator) /** * Return TRUE if the given UTransPosition is valid for text of @@ -129,7 +125,11 @@ inline UBool positionIsValid(UTransPosition& index, int32_t len) { Transliterator::Transliterator(const UnicodeString& theID, UnicodeFilter* adoptedFilter) : UObject(), ID(theID), filter(adoptedFilter), - maximumContextLength(0) {} + maximumContextLength(0) { + + // NUL-terminate the ID string + ID.getTerminatedBuffer(); +} /** * Destructor. @@ -144,6 +144,10 @@ Transliterator::~Transliterator() { Transliterator::Transliterator(const Transliterator& other) : UObject(other), ID(other.ID), filter(0), maximumContextLength(other.maximumContextLength) { + + // NUL-terminate the ID string + ID.getTerminatedBuffer(); + if (other.filter != 0) { // We own the filter, so we must have our own copy filter = (UnicodeFilter*) other.filter->clone(); @@ -155,6 +159,9 @@ Transliterator::Transliterator(const Transliterator& other) : */ Transliterator& Transliterator::operator=(const Transliterator& other) { ID = other.ID; + // NUL-terminate the ID string + ID.getTerminatedBuffer(); + maximumContextLength = other.maximumContextLength; adoptFilter((other.filter == 0) ? 0 : (UnicodeFilter*) other.filter->clone()); return *this; @@ -690,7 +697,7 @@ const UnicodeString& Transliterator::getID(void) const { * display to the user in the default locale. See {@link * #getDisplayName(Locale)} for details. */ -UnicodeString& Transliterator::getDisplayName(const UnicodeString& ID, +UnicodeString& U_EXPORT2 Transliterator::getDisplayName(const UnicodeString& ID, UnicodeString& result) { return getDisplayName(ID, Locale::getDefault(), result); } @@ -713,12 +720,12 @@ UnicodeString& Transliterator::getDisplayName(const UnicodeString& ID, * localized. * @see java.text.MessageFormat */ -UnicodeString& Transliterator::getDisplayName(const UnicodeString& id, +UnicodeString& U_EXPORT2 Transliterator::getDisplayName(const UnicodeString& id, const Locale& inLocale, UnicodeString& result) { UErrorCode status = U_ZERO_ERROR; - ResourceBundle bundle(u_getDataDirectory(), inLocale, status); + ResourceBundle bundle(U_ICUDATA_TRANSLIT, inLocale, status); // Suspend checking status until later... @@ -865,9 +872,11 @@ Transliterator* Transliterator::createInverse(UErrorCode& status) const { return Transliterator::createInstance(ID, UTRANS_REVERSE,parseError,status); } -Transliterator* Transliterator::createInstance(const UnicodeString& ID, - UTransDirection dir, - UErrorCode& status) { +Transliterator* U_EXPORT2 +Transliterator::createInstance(const UnicodeString& ID, + UTransDirection dir, + UErrorCode& status) +{ UParseError parseError; return createInstance(ID, dir, parseError, status); } @@ -883,10 +892,12 @@ Transliterator* Transliterator::createInstance(const UnicodeString& ID, * @see #getAvailableIDs * @see #getID */ -Transliterator* Transliterator::createInstance(const UnicodeString& ID, - UTransDirection dir, - UParseError& parseError, - UErrorCode& status) { +Transliterator* U_EXPORT2 +Transliterator::createInstance(const UnicodeString& ID, + UTransDirection dir, + UParseError& parseError, + UErrorCode& status) +{ if (U_FAILURE(status)) { return 0; } @@ -950,28 +961,58 @@ Transliterator* Transliterator::createBasicInstance(const UnicodeString& id, UErrorCode ec = U_ZERO_ERROR; TransliteratorAlias* alias = 0; Transliterator* t = 0; - + umtx_init(®istryMutex); umtx_lock(®istryMutex); if (HAVE_REGISTRY) { - t = registry->get(id, alias, pe, ec); + t = registry->get(id, alias, ec); } umtx_unlock(®istryMutex); if (U_FAILURE(ec)) { delete t; delete alias; - return NULL; + return 0; } - if (alias != 0) { - // Instantiate an alias + // We may have not gotten a transliterator: Because we can't + // instantiate a transliterator from inside TransliteratorRegistry:: + // get() (that would deadlock), we sometimes pass back an alias. This + // contains the data we need to finish the instantiation outside the + // registry mutex. The alias may, in turn, generate another alias, so + // we handle aliases in a loop. The max times through the loop is two. + // [alan] + while (alias != 0) { U_ASSERT(t==0); - t = alias->create(pe, ec); - delete alias; + // Rule-based aliases are handled with TransliteratorAlias:: + // parse(), followed by TransliteratorRegistry::reget(). + // Other aliases are handled with TransliteratorAlias::create(). + if (alias->isRuleBased()) { + // Step 1. parse + TransliteratorParser parser; + alias->parse(parser, pe, ec); + delete alias; + alias = 0; + + // Step 2. reget + umtx_lock(®istryMutex); + if (HAVE_REGISTRY) { + t = registry->reget(id, parser, alias, ec); + } + umtx_unlock(®istryMutex); + + // Step 3. Loop back around! + } else { + t = alias->create(pe, ec); + delete alias; + alias = 0; + break; + } if (U_FAILURE(ec)) { delete t; + delete alias; t = NULL; + break; } } @@ -990,11 +1031,13 @@ Transliterator* Transliterator::createBasicInstance(const UnicodeString& id, * NullTransliterator, if it contains ID blocks which parse as * empty for the given direction. */ -Transliterator* Transliterator::createFromRules(const UnicodeString& ID, - const UnicodeString& rules, - UTransDirection dir, - UParseError& parseError, - UErrorCode& status) { +Transliterator* U_EXPORT2 +Transliterator::createFromRules(const UnicodeString& ID, + const UnicodeString& rules, + UTransDirection dir, + UParseError& parseError, + UErrorCode& status) +{ Transliterator* t = NULL; TransliteratorParser parser; @@ -1033,7 +1076,7 @@ Transliterator* Transliterator::createFromRules(const UnicodeString& ID, } else { // idBlock and data -- this is a compound // RBT - UnicodeString id("_", ""); + UnicodeString id((UChar)0x005F); // '_' t = new RuleBasedTransliterator(id, parser.orphanData(), TRUE); // TRUE == adopt data object /* test for NULL */ if (t == 0) { @@ -1084,6 +1127,28 @@ UnicodeString& Transliterator::toRules(UnicodeString& rulesSource, return rulesSource; } +int32_t Transliterator::countElements() const { + return (this->getDynamicClassID() == + CompoundTransliterator::getStaticClassID()) ? + ((const CompoundTransliterator*) this)->getCount() : 0; +} + +const Transliterator& Transliterator::getElement(int32_t index, UErrorCode& ec) const { + if (U_FAILURE(ec)) { + return *this; + } + const CompoundTransliterator* cpd = + (this->getDynamicClassID() == CompoundTransliterator::getStaticClassID()) ? + (const CompoundTransliterator*) this : 0; + int32_t n = (cpd == NULL) ? 1 : cpd->getCount(); + if (index < 0 || index >= n) { + ec = U_INDEX_OUTOFBOUNDS_ERROR; + return *this; + } else { + return (n == 1) ? *this : cpd->getTransliterator(index); + } +} + UnicodeSet& Transliterator::getSourceSet(UnicodeSet& result) const { handleGetSourceSet(result); if (filter != NULL) { @@ -1115,7 +1180,7 @@ UnicodeSet& Transliterator::getTargetSet(UnicodeSet& result) const { } // For public consumption -void Transliterator::registerFactory(const UnicodeString& id, +void U_EXPORT2 Transliterator::registerFactory(const UnicodeString& id, Transliterator::Factory factory, Transliterator::Token context) { umtx_init(®istryMutex); @@ -1138,7 +1203,8 @@ void Transliterator::_registerFactory(const UnicodeString& id, void Transliterator::_registerSpecialInverse(const UnicodeString& target, const UnicodeString& inverseTarget, UBool bidirectional) { - TransliteratorIDParser::registerSpecialInverse(target, inverseTarget, bidirectional); + UErrorCode status = U_ZERO_ERROR; + TransliteratorIDParser::registerSpecialInverse(target, inverseTarget, bidirectional, status); } /** @@ -1154,7 +1220,7 @@ void Transliterator::_registerSpecialInverse(const UnicodeString& target, * @see #getInstance * @see #unregister */ -void Transliterator::registerInstance(Transliterator* adoptedPrototype) { +void U_EXPORT2 Transliterator::registerInstance(Transliterator* adoptedPrototype) { umtx_init(®istryMutex); Mutex lock(®istryMutex); if (HAVE_REGISTRY) { @@ -1174,7 +1240,7 @@ void Transliterator::_registerInstance(Transliterator* adoptedPrototype) { * @see #registerInstance */ -void Transliterator::unregister(const UnicodeString& ID) { +void U_EXPORT2 Transliterator::unregister(const UnicodeString& ID) { umtx_init(®istryMutex); Mutex lock(®istryMutex); if (HAVE_REGISTRY) { @@ -1183,22 +1249,24 @@ void Transliterator::unregister(const UnicodeString& ID) { } /** + * == OBSOLETE - remove in ICU 3.4 == * Return the number of IDs currently registered with the system. * To retrieve the actual IDs, call getAvailableID(i) with * i from 0 to countAvailableIDs() - 1. */ -int32_t Transliterator::countAvailableIDs(void) { +int32_t U_EXPORT2 Transliterator::countAvailableIDs(void) { umtx_init(®istryMutex); Mutex lock(®istryMutex); return HAVE_REGISTRY ? registry->countAvailableIDs() : 0; } /** + * == OBSOLETE - remove in ICU 3.4 == * Return the index-th available ID. index must be between 0 * and countAvailableIDs() - 1, inclusive. If index is out of * range, the result of getAvailableID(0) is returned. */ -const UnicodeString& Transliterator::getAvailableID(int32_t index) { +const UnicodeString& U_EXPORT2 Transliterator::getAvailableID(int32_t index) { const UnicodeString* result = NULL; umtx_init(®istryMutex); umtx_lock(®istryMutex); @@ -1210,13 +1278,28 @@ const UnicodeString& Transliterator::getAvailableID(int32_t index) { return *result; } -int32_t Transliterator::countAvailableSources(void) { +StringEnumeration* U_EXPORT2 Transliterator::getAvailableIDs(UErrorCode& ec) { + if (U_FAILURE(ec)) return NULL; + StringEnumeration* result = NULL; + umtx_init(®istryMutex); + umtx_lock(®istryMutex); + if (HAVE_REGISTRY) { + result = registry->getAvailableIDs(); + } + umtx_unlock(®istryMutex); + if (result == NULL) { + ec = U_INTERNAL_TRANSLITERATOR_ERROR; + } + return result; +} + +int32_t U_EXPORT2 Transliterator::countAvailableSources(void) { umtx_init(®istryMutex); Mutex lock(®istryMutex); return HAVE_REGISTRY ? _countAvailableSources() : 0; } -UnicodeString& Transliterator::getAvailableSource(int32_t index, +UnicodeString& U_EXPORT2 Transliterator::getAvailableSource(int32_t index, UnicodeString& result) { umtx_init(®istryMutex); Mutex lock(®istryMutex); @@ -1226,13 +1309,13 @@ UnicodeString& Transliterator::getAvailableSource(int32_t index, return result; } -int32_t Transliterator::countAvailableTargets(const UnicodeString& source) { +int32_t U_EXPORT2 Transliterator::countAvailableTargets(const UnicodeString& source) { umtx_init(®istryMutex); Mutex lock(®istryMutex); return HAVE_REGISTRY ? _countAvailableTargets(source) : 0; } -UnicodeString& Transliterator::getAvailableTarget(int32_t index, +UnicodeString& U_EXPORT2 Transliterator::getAvailableTarget(int32_t index, const UnicodeString& source, UnicodeString& result) { umtx_init(®istryMutex); @@ -1243,14 +1326,14 @@ UnicodeString& Transliterator::getAvailableTarget(int32_t index, return result; } -int32_t Transliterator::countAvailableVariants(const UnicodeString& source, +int32_t U_EXPORT2 Transliterator::countAvailableVariants(const UnicodeString& source, const UnicodeString& target) { umtx_init(®istryMutex); Mutex lock(®istryMutex); return HAVE_REGISTRY ? _countAvailableVariants(source, target) : 0; } -UnicodeString& Transliterator::getAvailableVariant(int32_t index, +UnicodeString& U_EXPORT2 Transliterator::getAvailableVariant(int32_t index, const UnicodeString& source, const UnicodeString& target, UnicodeString& result) { @@ -1335,13 +1418,23 @@ UBool Transliterator::initializeRegistry() { } /* The following code parses the index table located in - * icu/data/translit_index.txt. The index is an n x 4 table + * icu/data/translit/root.txt. The index is an n x 4 table * that follows this format: - * - * :file:: - * :internal:: - * :alias:: - * + * { + * file{ + * resource{""} + * direction{""} + * } + * } + * { + * internal{ + * resource{""} + * direction{"{ + * alias{" is the ID of the system transliterator being defined. These * are public IDs enumerated by Transliterator.getAvailableIDs(), * unless the second field is "internal". @@ -1358,10 +1451,10 @@ UBool Transliterator::initializeRegistry() { * * The extra blank field on "alias" lines is to make the array square. */ - static const char translit_index[] = "translit_index"; + //static const char translit_index[] = "translit_index"; UResourceBundle *bundle, *transIDs, *colBund; - bundle = ures_openDirect(0, translit_index, &status); + bundle = ures_open(U_ICUDATA_TRANSLIT, NULL/*open root bundle*/, &status); transIDs = ures_getByKey(bundle, RB_RULE_BASED_IDS, 0, &status); int32_t row, maxRows; @@ -1369,11 +1462,12 @@ UBool Transliterator::initializeRegistry() { maxRows = ures_getSize(transIDs); for (row = 0; row < maxRows; row++) { colBund = ures_getByIndex(transIDs, row, 0, &status); - - if (U_SUCCESS(status) && ures_getSize(colBund) == 4) { - UnicodeString id = ures_getUnicodeStringByIndex(colBund, 0, &status); - UChar type = ures_getUnicodeStringByIndex(colBund, 1, &status).charAt(0); - UnicodeString resString = ures_getUnicodeStringByIndex(colBund, 2, &status); + if (U_SUCCESS(status)) { + UnicodeString id(ures_getKey(colBund)); + UResourceBundle* res = ures_getNextResource(colBund, NULL, &status); + const char* typeStr = ures_getKey(res); + UChar type; + u_charsToUChars(typeStr, &type, 1); if (U_SUCCESS(status)) { switch (type) { @@ -1382,9 +1476,11 @@ UBool Transliterator::initializeRegistry() { // 'file' or 'internal'; // row[2]=resource, row[3]=direction { + + UnicodeString resString = ures_getUnicodeStringByKey(res, "resource", &status); UBool visible = (type == 0x0066 /*f*/); UTransDirection dir = - (ures_getUnicodeStringByIndex(colBund, 3, &status).charAt(0) == + (ures_getUnicodeStringByKey(res, "direction", &status).charAt(0) == 0x0046 /*F*/) ? UTRANS_FORWARD : UTRANS_REVERSE; registry->put(id, resString, dir, visible); @@ -1392,12 +1488,13 @@ UBool Transliterator::initializeRegistry() { break; case 0x61: // 'a' // 'alias'; row[2]=createInstance argument + UnicodeString resString = ures_getUnicodeString(res, &status); registry->put(id, resString, TRUE); break; } } + ures_close(res); } - ures_close(colBund); } } @@ -1424,10 +1521,12 @@ UBool Transliterator::initializeRegistry() { _registerSpecialInverse(NullTransliterator::SHORT_ID, NullTransliterator::SHORT_ID, FALSE); - _registerSpecialInverse("Upper", "Lower", TRUE); - _registerSpecialInverse("Title", "Lower", FALSE); + _registerSpecialInverse(UNICODE_STRING_SIMPLE("Upper"), + UNICODE_STRING_SIMPLE("Lower"), TRUE); + _registerSpecialInverse(UNICODE_STRING_SIMPLE("Title"), + UNICODE_STRING_SIMPLE("Lower"), FALSE); - ucln_i18n_registerCleanup(); + ucln_i18n_registerCleanup(UCLN_I18N_TRANSLITERATOR, transliterator_cleanup); return TRUE; } @@ -1442,7 +1541,6 @@ U_NAMESPACE_END * user, because RBTs hold pointers to common data objects. */ U_CFUNC UBool transliterator_cleanup(void) { - TitlecaseTransliterator::cleanup(); TransliteratorIDParser::cleanup(); if (registry) { delete registry; diff --git a/icuSources/i18n/transreg.cpp b/icuSources/i18n/transreg.cpp index 1760c896..781ea87a 100644 --- a/icuSources/i18n/transreg.cpp +++ b/icuSources/i18n/transreg.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (c) 2001-2003, International Business Machines +* Copyright (c) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -27,6 +27,7 @@ #include "rbt_pars.h" #include "tridpars.h" #include "charstr.h" +#include "uassert.h" // Enable the following symbol to add debugging code that tracks the // allocation, deletion, and use of Entry objects. BoundsChecker has @@ -64,7 +65,8 @@ TransliteratorAlias::TransliteratorAlias(const UnicodeString& theAliasID) : aliasID(theAliasID), trans(0), compoundFilter(0), - idSplitPoint(-1) { + idSplitPoint(-1), + type(TransliteratorAlias::SIMPLE) { } TransliteratorAlias::TransliteratorAlias(const UnicodeString& theID, @@ -76,7 +78,19 @@ TransliteratorAlias::TransliteratorAlias(const UnicodeString& theID, aliasID(idBlock), trans(adopted), compoundFilter(cpdFilter), - idSplitPoint(theIDSplitPoint) { + idSplitPoint(theIDSplitPoint), + type(TransliteratorAlias::COMPOUND) { +} + +TransliteratorAlias::TransliteratorAlias(const UnicodeString& theID, + const UnicodeString& rules, + UTransDirection dir) : + ID(theID), + aliasID(rules), // bad name -- rename aliasID! + trans(0), + compoundFilter(0), + idSplitPoint((int32_t) dir), // bad name -- rename idSplitPoint! + type(TransliteratorAlias::RULES) { } TransliteratorAlias::~TransliteratorAlias() { @@ -86,10 +100,15 @@ TransliteratorAlias::~TransliteratorAlias() { Transliterator* TransliteratorAlias::create(UParseError& pe, UErrorCode& ec) { - Transliterator *t; - if (trans == 0) { + if (U_FAILURE(ec)) { + return 0; + } + Transliterator *t = NULL; + switch (type) { + case SIMPLE: t = Transliterator::createInstance(aliasID, UTRANS_FORWARD, pe, ec); - } else { + break; + case COMPOUND: t = new CompoundTransliterator(ID, aliasID, idSplitPoint, trans, ec); /* test for NULL */ @@ -99,12 +118,36 @@ Transliterator* TransliteratorAlias::create(UParseError& pe, } trans = 0; // so we don't delete it later if (compoundFilter) { + // TODO: Is this right? Are we leaking memory here? + // I'm suspicious because of the "trans = 0" line above; + // doesn't seem to fit the cloning here. Don't have time + // to track this down right now. [alan 3.0] t->adoptFilter((UnicodeSet*) compoundFilter->clone()); } + break; + case RULES: + U_ASSERT(FALSE); // don't call create() if isRuleBased() returns TRUE! + break; } return t; } +UBool TransliteratorAlias::isRuleBased() const { + return type == RULES; +} + +void TransliteratorAlias::parse(TransliteratorParser& parser, + UParseError& pe, UErrorCode& ec) const { + U_ASSERT(type == RULES); + if (U_FAILURE(ec)) { + return; + } + + // aliasID is really rules -- rename it! + // idSplitPoint is really UTransDirection -- rename it! + parser.parse(aliasID, (UTransDirection) idSplitPoint, pe, ec); +} + //---------------------------------------------------------------------- // class Spec //---------------------------------------------------------------------- @@ -159,7 +202,7 @@ Spec::Spec(const UnicodeString& theSpec) : top(theSpec) { UErrorCode status = U_ZERO_ERROR; CharString topch(top); Locale toploc(topch); - res = new ResourceBundle(u_getDataDirectory(), toploc, status); + res = new ResourceBundle(U_ICUDATA_TRANSLIT, toploc, status); /* test for NULL */ if (res == 0) { return; @@ -423,8 +466,8 @@ U_CDECL_END //---------------------------------------------------------------------- TransliteratorRegistry::TransliteratorRegistry(UErrorCode& status) : - registry(TRUE), - specDAG(TRUE), + registry(TRUE, status), + specDAG(TRUE, status), availableIDs(status) { registry.setValueDeleter(deleteEntry); @@ -439,11 +482,83 @@ TransliteratorRegistry::~TransliteratorRegistry() { Transliterator* TransliteratorRegistry::get(const UnicodeString& ID, TransliteratorAlias*& aliasReturn, - UParseError& parseError, UErrorCode& status) { + U_ASSERT(aliasReturn == NULL); Entry *entry = find(ID); return (entry == 0) ? 0 - : instantiateEntry(ID, entry, aliasReturn, parseError,status); + : instantiateEntry(ID, entry, aliasReturn, status); +} + +Transliterator* TransliteratorRegistry::reget(const UnicodeString& ID, + TransliteratorParser& parser, + TransliteratorAlias*& aliasReturn, + UErrorCode& status) { + U_ASSERT(aliasReturn == NULL); + Entry *entry = find(ID); + + if (entry == 0) { + // We get to this point if there are two threads, one of which + // is instantiating an ID, and another of which is removing + // the same ID from the registry, and the timing is just right. + return 0; + } + + // The usage model for the caller is that they will first call + // reg->get() inside the mutex, they'll get back an alias, they call + // alias->isRuleBased(), and if they get TRUE, they call alias->parse() + // outside the mutex, then reg->reget() inside the mutex again. A real + // mess, but it gets things working for ICU 3.0. [alan]. + + // Note: It's possible that in between the caller calling + // alias->parse() and reg->reget(), that another thread will have + // called reg->reget(), and the entry will already have been fixed up. + // We have to detect this so we don't stomp over existing entry + // data members and potentially leak memory (u.data and compoundFilter). + + if (entry->entryType == Entry::RULES_FORWARD || + entry->entryType == Entry::RULES_REVERSE || + entry->entryType == Entry::LOCALE_RULES) { + + entry->u.data = parser.orphanData(); + entry->stringArg = parser.idBlock; + entry->intArg = parser.idSplitPoint; + entry->compoundFilter = parser.orphanCompoundFilter(); + + // Reset entry->entryType to encapsulate the parsed data. The + // next time we instantiate this ID (including this very next + // time, at the end of this function) we won't have to parse + // again. + // NOTE: The logic here matches that in + // Transliterator::createFromRules(). + if (entry->stringArg.length() == 0) { + if (entry->u.data == 0) { + // No idBlock, no data -- this is just an + // alias for Null + entry->entryType = Entry::ALIAS; + entry->stringArg = NullTransliterator::ID; + } else { + // No idBlock, data != 0 -- this is an + // ordinary RBT_DATA + entry->entryType = Entry::RBT_DATA; + } + } else { + if (entry->u.data == 0) { + // idBlock, no data -- this is an alias. The ID has + // been munged from reverse into forward mode, if + // necessary, so instantiate the ID in the forward + // direction. + entry->entryType = Entry::ALIAS; + } else { + // idBlock and data -- this is a compound + // RBT + entry->entryType = Entry::COMPOUND_RBT; + } + } + } + + Transliterator *t = + instantiateEntry(ID, entry, aliasReturn, status); + return t; } void TransliteratorRegistry::put(Transliterator* adoptedProto, @@ -499,32 +614,38 @@ void TransliteratorRegistry::remove(const UnicodeString& ID) { //---------------------------------------------------------------------- /** + * == OBSOLETE - remove in ICU 3.4 == * Return the number of IDs currently registered with the system. * To retrieve the actual IDs, call getAvailableID(i) with * i from 0 to countAvailableIDs() - 1. */ -int32_t TransliteratorRegistry::countAvailableIDs(void) { +int32_t TransliteratorRegistry::countAvailableIDs(void) const { return availableIDs.size(); } /** + * == OBSOLETE - remove in ICU 3.4 == * Return the index-th available ID. index must be between 0 * and countAvailableIDs() - 1, inclusive. If index is out of * range, the result of getAvailableID(0) is returned. */ -const UnicodeString& TransliteratorRegistry::getAvailableID(int32_t index) { +const UnicodeString& TransliteratorRegistry::getAvailableID(int32_t index) const { if (index < 0 || index >= availableIDs.size()) { index = 0; } return *(const UnicodeString*) availableIDs[index]; } -int32_t TransliteratorRegistry::countAvailableSources(void) { +StringEnumeration* TransliteratorRegistry::getAvailableIDs() const { + return new Enumeration(*this); +} + +int32_t TransliteratorRegistry::countAvailableSources(void) const { return specDAG.count(); } UnicodeString& TransliteratorRegistry::getAvailableSource(int32_t index, - UnicodeString& result) { + UnicodeString& result) const { int32_t pos = -1; const UHashElement *e = 0; while (index-- >= 0) { @@ -541,14 +662,14 @@ UnicodeString& TransliteratorRegistry::getAvailableSource(int32_t index, return result; } -int32_t TransliteratorRegistry::countAvailableTargets(const UnicodeString& source) { +int32_t TransliteratorRegistry::countAvailableTargets(const UnicodeString& source) const { Hashtable *targets = (Hashtable*) specDAG.get(source); return (targets == 0) ? 0 : targets->count(); } UnicodeString& TransliteratorRegistry::getAvailableTarget(int32_t index, const UnicodeString& source, - UnicodeString& result) { + UnicodeString& result) const { Hashtable *targets = (Hashtable*) specDAG.get(source); if (targets == 0) { result.truncate(0); // invalid source @@ -571,7 +692,7 @@ UnicodeString& TransliteratorRegistry::getAvailableTarget(int32_t index, } int32_t TransliteratorRegistry::countAvailableVariants(const UnicodeString& source, - const UnicodeString& target) { + const UnicodeString& target) const { Hashtable *targets = (Hashtable*) specDAG.get(source); if (targets == 0) { return 0; @@ -584,7 +705,7 @@ int32_t TransliteratorRegistry::countAvailableVariants(const UnicodeString& sour UnicodeString& TransliteratorRegistry::getAvailableVariant(int32_t index, const UnicodeString& source, const UnicodeString& target, - UnicodeString& result) { + UnicodeString& result) const { Hashtable *targets = (Hashtable*) specDAG.get(source); if (targets == 0) { result.truncate(0); // invalid source @@ -604,6 +725,54 @@ UnicodeString& TransliteratorRegistry::getAvailableVariant(int32_t index, return result; } +//---------------------------------------------------------------------- +// class TransliteratorRegistry::Enumeration +//---------------------------------------------------------------------- + +TransliteratorRegistry::Enumeration::Enumeration(const TransliteratorRegistry& _reg) : + index(0), reg(_reg) { +} + +TransliteratorRegistry::Enumeration::~Enumeration() { +} + +int32_t TransliteratorRegistry::Enumeration::count(UErrorCode& /*status*/) const { + return reg.availableIDs.size(); +} + +const UnicodeString* TransliteratorRegistry::Enumeration::snext(UErrorCode& status) { + // This is sloppy but safe -- if we get out of sync with the underlying + // registry, we will still return legal strings, but they might not + // correspond to the snapshot at construction time. So there could be + // duplicate IDs or omitted IDs if insertions or deletions occur in one + // thread while another is iterating. To be more rigorous, add a timestamp, + // which is incremented with any modification, and validate this iterator + // against the timestamp at construction time. This probably isn't worth + // doing as long as there is some possibility of removing this code in favor + // of some new code based on Doug's service framework. + if (U_FAILURE(status)) { + return NULL; + } + int32_t n = reg.availableIDs.size(); + if (index > n) { + status = U_ENUM_OUT_OF_SYNC_ERROR; + } + // index == n is okay -- this means we've reached the end + if (index < n) { + // Copy the string! This avoids lifetime problems. + unistr = *(const UnicodeString*)reg.availableIDs[index++]; + return &unistr; + } else { + return NULL; + } +} + +void TransliteratorRegistry::Enumeration::reset(UErrorCode& /*status*/) { + index = 0; +} + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(TransliteratorRegistry::Enumeration) + //---------------------------------------------------------------------- // class TransliteratorRegistry: internal //---------------------------------------------------------------------- @@ -655,7 +824,10 @@ void TransliteratorRegistry::registerEntry(const UnicodeString& ID, if (visible) { registerSTV(source, target, variant); if (!availableIDs.contains((void*) &ID)) { - availableIDs.addElement(new UnicodeString(ID), status); + UnicodeString *newID = (UnicodeString *)ID.clone(); + // NUL-terminate the ID string + newID->getTerminatedBuffer(); + availableIDs.addElement(newID, status); } } else { removeSTV(source, target, variant); @@ -677,8 +849,8 @@ void TransliteratorRegistry::registerSTV(const UnicodeString& source, UErrorCode status = U_ZERO_ERROR; Hashtable *targets = (Hashtable*) specDAG.get(source); if (targets == 0) { - targets = new Hashtable(TRUE); - if (targets == 0) { + targets = new Hashtable(TRUE, status); + if (U_FAILURE(status) || targets == 0) { return; } targets->setValueDeleter(uhash_deleteUVector); @@ -739,7 +911,7 @@ void TransliteratorRegistry::removeSTV(const UnicodeString& source, */ Entry* TransliteratorRegistry::findInDynamicStore(const Spec& src, const Spec& trg, - const UnicodeString& variant) { + const UnicodeString& variant) const { UnicodeString ID; TransliteratorIDParser::STVtoID(src, trg, variant, ID); Entry *e = (Entry*) registry.get(ID); @@ -971,115 +1143,101 @@ Entry* TransliteratorRegistry::find(UnicodeString& source, Transliterator* TransliteratorRegistry::instantiateEntry(const UnicodeString& ID, Entry *entry, TransliteratorAlias* &aliasReturn, - UParseError& parseError, UErrorCode& status) { + Transliterator *t = 0; + U_ASSERT(aliasReturn == 0); - for (;;) { - if (entry->entryType == Entry::RBT_DATA) { - return new RuleBasedTransliterator(ID, entry->u.data); - } else if (entry->entryType == Entry::PROTOTYPE) { - return entry->u.prototype->clone(); - } else if (entry->entryType == Entry::ALIAS) { - aliasReturn = new TransliteratorAlias(entry->stringArg); - /* test for NULL */ - if (aliasReturn == 0) { - status = U_MEMORY_ALLOCATION_ERROR; - } - return 0; - } else if (entry->entryType == Entry::FACTORY) { - return entry->u.factory.function(ID, entry->u.factory.context); - } else if (entry->entryType == Entry::COMPOUND_RBT) { - UnicodeString id("_", ""); + switch (entry->entryType) { + case Entry::RBT_DATA: + t = new RuleBasedTransliterator(ID, entry->u.data); + if (t == 0) { + status = U_MEMORY_ALLOCATION_ERROR; + } + return t; + case Entry::PROTOTYPE: + t = entry->u.prototype->clone(); + if (t == 0) { + status = U_MEMORY_ALLOCATION_ERROR; + } + return t; + case Entry::ALIAS: + aliasReturn = new TransliteratorAlias(entry->stringArg); + if (aliasReturn == 0) { + status = U_MEMORY_ALLOCATION_ERROR; + } + return 0; + case Entry::FACTORY: + t = entry->u.factory.function(ID, entry->u.factory.context); + if (t == 0) { + status = U_MEMORY_ALLOCATION_ERROR; + } + return t; + case Entry::COMPOUND_RBT: + { + UnicodeString id((UChar)0x005F); /* "_" */ Transliterator *t = new RuleBasedTransliterator(id, entry->u.data); - /* test for NULL */ if (t == 0) { status = U_MEMORY_ALLOCATION_ERROR; return 0; } aliasReturn = new TransliteratorAlias(ID, entry->stringArg, t, entry->intArg, entry->compoundFilter); - return 0; } - - TransliteratorParser parser; - - if (entry->entryType == Entry::LOCALE_RULES) { - parser.parse(entry->stringArg, (UTransDirection) entry->intArg, - parseError, status); - } else { - // At this point entry type must be either RULES_FORWARD or - // RULES_REVERSE. We process the rule data into a - // TransliteratorRuleData object, and possibly also into an - // ::id header and/or footer. Then we modify the registry with - // the parsed data and retry. - UBool isReverse = (entry->entryType == Entry::RULES_REVERSE); + if (aliasReturn == 0) { + status = U_MEMORY_ALLOCATION_ERROR; + } + return 0; + case Entry::LOCALE_RULES: + aliasReturn = new TransliteratorAlias(ID, entry->stringArg, + (UTransDirection) entry->intArg); + if (aliasReturn == 0) { + status = U_MEMORY_ALLOCATION_ERROR; + } + return 0; + case Entry::RULES_FORWARD: + case Entry::RULES_REVERSE: + // Process the rule data into a TransliteratorRuleData object, + // and possibly also into an ::id header and/or footer. Then + // we modify the registry with the parsed data and retry. + { + TransliteratorParser parser; // We use the file name, taken from another resource bundle // 2-d array at static init time, as a locale language. We're // just using the locale mechanism to map through to a file // name; this in no way represents an actual locale. - CharString ch(entry->stringArg); - UResourceBundle *bundle = ures_openDirect(0, ch, &status); - UnicodeString rules = ures_getUnicodeStringByKey(bundle, RB_RULE, &status); - ures_close(bundle); - - // If the status indicates a failure, then we don't have any - // rules -- there is probably an installation error. The list - // in the root locale should correspond to all the installed - // transliterators; if it lists something that's not - // installed, we'll get an error from ResourceBundle. + //CharString ch(entry->stringArg); + //UResourceBundle *bundle = ures_openDirect(0, ch, &status); + UnicodeString rules = entry->stringArg; + //ures_close(bundle); - parser.parse(rules, isReverse ? UTRANS_REVERSE : UTRANS_FORWARD, - parseError, status); - } - - if (U_FAILURE(status)) { - // We have a failure of some kind. Remove the ID from the - // registry so we don't keep trying. NOTE: This will throw off - // anyone who is, at the moment, trying to iterate over the - // available IDs. That's acceptable since we should never - // really get here except under installation, configuration, - // or unrecoverable run time memory failures. - remove(ID); - break; - } - - entry->u.data = parser.orphanData(); - entry->stringArg = parser.idBlock; - entry->intArg = parser.idSplitPoint; - entry->compoundFilter = parser.orphanCompoundFilter(); - - // Reset entry->entryType to something that we process at the - // top of the loop, then loop back to the top. As long as we - // do this, we only loop through twice at most. - // NOTE: The logic here matches that in - // Transliterator::createFromRules(). - if (entry->stringArg.length() == 0) { - if (entry->u.data == 0) { - // No idBlock, no data -- this is just an - // alias for Null - entry->entryType = Entry::ALIAS; - entry->stringArg = NullTransliterator::ID; - } else { - // No idBlock, data != 0 -- this is an - // ordinary RBT_DATA - entry->entryType = Entry::RBT_DATA; - } - } else { - if (entry->u.data == 0) { - // idBlock, no data -- this is an alias. The ID has - // been munged from reverse into forward mode, if - // necessary, so instantiate the ID in the forward - // direction. - entry->entryType = Entry::ALIAS; - } else { - // idBlock and data -- this is a compound - // RBT - entry->entryType = Entry::COMPOUND_RBT; - } + //if (U_FAILURE(status)) { + // We have a failure of some kind. Remove the ID from the + // registry so we don't keep trying. NOTE: This will throw off + // anyone who is, at the moment, trying to iterate over the + // available IDs. That's acceptable since we should never + // really get here except under installation, configuration, + // or unrecoverable run time memory failures. + // remove(ID); + //} else { + + // If the status indicates a failure, then we don't have any + // rules -- there is probably an installation error. The list + // in the root locale should correspond to all the installed + // transliterators; if it lists something that's not + // installed, we'll get an error from ResourceBundle. + aliasReturn = new TransliteratorAlias(ID, rules, + ((entry->entryType == Entry::RULES_REVERSE) ? + UTRANS_REVERSE : UTRANS_FORWARD)); + if (aliasReturn == 0) { + status = U_MEMORY_ALLOCATION_ERROR; + } + //} } + return 0; + default: + U_ASSERT(FALSE); // can't get here + return 0; } - - return 0; // failed } U_NAMESPACE_END diff --git a/icuSources/i18n/transreg.h b/icuSources/i18n/transreg.h index fc26e144..866ce8f4 100644 --- a/icuSources/i18n/transreg.h +++ b/icuSources/i18n/transreg.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (c) 2001, International Business Machines +* Copyright (c) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -41,29 +41,61 @@ class UnicodeString; class TransliteratorAlias : public UMemory { public: /** - * Construct a simple alias. + * Construct a simple alias (type == SIMPLE) * @param aliasID the given id. */ TransliteratorAlias(const UnicodeString& aliasID); - + /** - * Construct a compound RBT alias. + * Construct a compound RBT alias (type == COMPOUND) */ TransliteratorAlias(const UnicodeString& ID, const UnicodeString& idBlock, Transliterator* adopted, int32_t idSplitPoint, const UnicodeSet* compoundFilter); + /** + * Construct a rules alias (type = RULES) + */ + TransliteratorAlias(const UnicodeString& theID, + const UnicodeString& rules, + UTransDirection dir); + ~TransliteratorAlias(); - + /** * The whole point of create() is that the caller must invoke * it when the registry mutex is NOT held, to prevent deadlock. * It may only be called once. + * + * Note: Only call create() if isRuleBased() returns FALSE. + * + * This method must be called *outside* of the TransliteratorRegistry + * mutex. */ Transliterator* create(UParseError&, UErrorCode&); - + + /** + * Return TRUE if this alias is rule-based. If so, the caller + * must call parse() on it, then call TransliteratorRegistry::reget(). + */ + UBool isRuleBased() const; + + /** + * If isRuleBased() returns TRUE, then the caller must call this + * method, followed by TransliteratorRegistry::reget(). The latter + * method must be called inside the TransliteratorRegistry mutex. + * + * Note: Only call parse() if isRuleBased() returns TRUE. + * + * This method must be called *outside* of the TransliteratorRegistry + * mutex, because it can instantiate Transliterators embedded in + * the rules via the "&Latin-Arabic()" syntax. + */ + void parse(TransliteratorParser& parser, + UParseError& pe, UErrorCode& ec) const; + private: - // We actually come in two flavors: + // We actually come in three flavors: // 1. Simple alias // Here aliasID is the alias string. Everything else is // null, zero, empty. @@ -72,11 +104,15 @@ class TransliteratorAlias : public UMemory { // contained RBT, and idSplitPoint is the offet in aliasID // where the contained RBT goes. compoundFilter is the // compound filter, and it is _not_ owned. + // 3. Rules + // Here ID is the ID, aliasID is the rules string. + // idSplitPoint is the UTransDirection. UnicodeString ID; - UnicodeString aliasID; + UnicodeString aliasID; // rename! holds rules for RULES type Transliterator* trans; // owned const UnicodeSet* compoundFilter; // alias - int32_t idSplitPoint; + int32_t idSplitPoint; // rename! holds UTransDirection for RULES type + enum { SIMPLE, COMPOUND, RULES } type; TransliteratorAlias(const TransliteratorAlias &other); // forbid copying of this class TransliteratorAlias &operator=(const TransliteratorAlias &other); // forbid copying of this class @@ -130,16 +166,36 @@ class TransliteratorRegistry : public UMemory { * filters or compounds, which we do not understand. Caller should * make aliasReturn NULL before calling. * @param ID the given ID - * @param aliasReturn the given TransliteratorAlias - * @param parseError Struct to recieve information on position + * @param aliasReturn output param to receive TransliteratorAlias; + * should be NULL on entry + * @param parseError Struct to recieve information on position * of error if an error is encountered * @param status Output param set to success/failure code. */ Transliterator* get(const UnicodeString& ID, TransliteratorAlias*& aliasReturn, - UParseError& parseError, UErrorCode& status); + /** + * The caller must call this after calling get(), if [a] calling get() + * returns an alias, and [b] the alias is rule based. In that + * situation the caller must call alias->parse() to do the parsing + * OUTSIDE THE REGISTRY MUTEX, then call this method to retry + * instantiating the transliterator. + * + * Note: Another alias might be returned by this method. + * + * This method (like all public methods of this class) must be called + * from within the TransliteratorRegistry mutex. + * + * @param aliasReturn output param to receive TransliteratorAlias; + * should be NULL on entry + */ + Transliterator* reget(const UnicodeString& ID, + TransliteratorParser& parser, + TransliteratorAlias*& aliasReturn, + UErrorCode& status); + /** * Register a prototype (adopted). This adds an entry to the * dynamic store, or replaces an existing entry. Any entry in the @@ -190,15 +246,24 @@ class TransliteratorRegistry : public UMemory { //------------------------------------------------------------------ /** + * Return a StringEnumeration over the IDs currently registered + * with the system. + * @internal + */ + StringEnumeration* getAvailableIDs() const; + + /** + * == OBSOLETE - remove in ICU 3.4 == * Return the number of IDs currently registered with the system. * To retrieve the actual IDs, call getAvailableID(i) with * i from 0 to countAvailableIDs() - 1. * @return the number of IDs currently registered with the system. * @internal */ - int32_t countAvailableIDs(void); + int32_t countAvailableIDs(void) const; /** + * == OBSOLETE - remove in ICU 3.4 == * Return the index-th available ID. index must be between 0 * and countAvailableIDs() - 1, inclusive. If index is out of * range, the result of getAvailableID(0) is returned. @@ -208,14 +273,14 @@ class TransliteratorRegistry : public UMemory { * range, the result of getAvailableID(0) is returned. * @internal */ - const UnicodeString& getAvailableID(int32_t index); + const UnicodeString& getAvailableID(int32_t index) const; /** * Return the number of registered source specifiers. * @return the number of registered source specifiers. */ - int32_t countAvailableSources(void); - + int32_t countAvailableSources(void) const; + /** * Return a registered source specifier. * @param index which specifier to return, from 0 to n-1, where @@ -225,8 +290,8 @@ class TransliteratorRegistry : public UMemory { * @return reference to result */ UnicodeString& getAvailableSource(int32_t index, - UnicodeString& result); - + UnicodeString& result) const; + /** * Return the number of registered target specifiers for a given * source specifier. @@ -234,8 +299,8 @@ class TransliteratorRegistry : public UMemory { * @return the number of registered target specifiers for a given * source specifier. */ - int32_t countAvailableTargets(const UnicodeString& source); - + int32_t countAvailableTargets(const UnicodeString& source) const; + /** * Return a registered target specifier for a given source. * @param index which specifier to return, from 0 to n-1, where @@ -248,8 +313,8 @@ class TransliteratorRegistry : public UMemory { */ UnicodeString& getAvailableTarget(int32_t index, const UnicodeString& source, - UnicodeString& result); - + UnicodeString& result) const; + /** * Return the number of registered variant specifiers for a given * source-target pair. There is always at least one variant: If @@ -262,8 +327,8 @@ class TransliteratorRegistry : public UMemory { * source-target pair. */ int32_t countAvailableVariants(const UnicodeString& source, - const UnicodeString& target); - + const UnicodeString& target) const; + /** * Return a registered variant specifier for a given source-target * pair. If NO_VARIANT is one of the variants, then it will be @@ -280,7 +345,7 @@ class TransliteratorRegistry : public UMemory { UnicodeString& getAvailableVariant(int32_t index, const UnicodeString& source, const UnicodeString& target, - UnicodeString& result); + UnicodeString& result) const; private: @@ -289,14 +354,14 @@ class TransliteratorRegistry : public UMemory { //---------------------------------------------------------------- Entry* find(const UnicodeString& ID); - + Entry* find(UnicodeString& source, UnicodeString& target, UnicodeString& variant); Entry* findInDynamicStore(const Spec& src, const Spec& trg, - const UnicodeString& variant); + const UnicodeString& variant) const; Entry* findInStaticStore(const Spec& src, const Spec& trg, @@ -317,7 +382,7 @@ class TransliteratorRegistry : public UMemory { Entry* adopted, UBool visible); - void registerEntry(const UnicodeString& ID, + void registerEntry(const UnicodeString& ID, const UnicodeString& source, const UnicodeString& target, const UnicodeString& variant, @@ -335,9 +400,26 @@ class TransliteratorRegistry : public UMemory { Transliterator* instantiateEntry(const UnicodeString& ID, Entry *entry, TransliteratorAlias*& aliasReturn, - UParseError& parseError, UErrorCode& status); + /** + * A StringEnumeration over the registered IDs in this object. + */ + class Enumeration : public StringEnumeration { + public: + Enumeration(const TransliteratorRegistry& reg); + virtual ~Enumeration(); + virtual int32_t count(UErrorCode& status) const; + virtual const UnicodeString* snext(UErrorCode& status); + virtual void reset(UErrorCode& status); + static UClassID U_EXPORT2 getStaticClassID(); + virtual UClassID getDynamicClassID() const; + private: + int32_t index; + const TransliteratorRegistry& reg; + }; + friend class Enumeration; + private: /** @@ -347,7 +429,7 @@ class TransliteratorRegistry : public UMemory { * specDAG or not. */ Hashtable registry; - + /** * DAG of visible IDs by spec. Hashtable: source => (Hashtable: * target => (UVector: variant)) The UVector of variants is never @@ -356,7 +438,7 @@ class TransliteratorRegistry : public UMemory { * the UVector. */ Hashtable specDAG; - + /** * Vector of public full IDs. */ diff --git a/icuSources/i18n/tridpars.cpp b/icuSources/i18n/tridpars.cpp index 33c5b263..3aadb70c 100644 --- a/icuSources/i18n/tridpars.cpp +++ b/icuSources/i18n/tridpars.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (c) 2002-2003, International Business Machines Corporation +* Copyright (c) 2002-2004, International Business Machines Corporation * and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -105,7 +105,7 @@ Transliterator* TransliteratorIDParser::SingleID::createInstance() { */ TransliteratorIDParser::SingleID* TransliteratorIDParser::parseSingleID(const UnicodeString& id, int32_t& pos, - int32_t dir) { + int32_t dir, UErrorCode& status) { int32_t start = pos; @@ -167,7 +167,7 @@ TransliteratorIDParser::parseSingleID(const UnicodeString& id, int32_t& pos, if (dir == FORWARD) { single = specsToID(specsA, FORWARD); } else { - single = specsToSpecialInverse(*specsA); + single = specsToSpecialInverse(*specsA, status); if (single == NULL) { single = specsToID(specsA, REVERSE); } @@ -251,7 +251,7 @@ UnicodeSet* TransliteratorIDParser::parseGlobalFilter(const UnicodeString& id, i if (UnicodeSet::resemblesPattern(id, pos)) { ParsePosition ppos(pos); UErrorCode ec = U_ZERO_ERROR; - filter = new UnicodeSet(id, ppos, USET_IGNORE_SPACE, ec); + filter = new UnicodeSet(id, ppos, USET_IGNORE_SPACE, NULL, ec); /* test for NULL */ if (filter == 0) { pos = start; @@ -301,7 +301,7 @@ static void U_CALLCONV _deleteSingleID(void* obj) { delete (TransliteratorIDParser::SingleID*) obj; } -static void U_CALLCONV _deleteTransliterator(void* obj) { +static void U_CALLCONV _deleteTransliteratorTrIDPars(void* obj) { delete (Transliterator*) obj; } U_CDECL_END @@ -360,7 +360,7 @@ UBool TransliteratorIDParser::parseCompoundID(const UnicodeString& id, int32_t d UBool sawDelimiter = TRUE; for (;;) { - SingleID* single = parseSingleID(id, pos, dir); + SingleID* single = parseSingleID(id, pos, dir, ec); if (single == NULL) { break; } @@ -458,7 +458,7 @@ int32_t TransliteratorIDParser::instantiateList(UVector& list, if (U_FAILURE(ec)) { goto RETURN; } - tlist.setDeleter(_deleteTransliterator); + tlist.setDeleter(_deleteTransliteratorTrIDPars); Transliterator* t; int32_t i; @@ -512,7 +512,7 @@ int32_t TransliteratorIDParser::instantiateList(UVector& list, list.removeAllElements(); if (U_SUCCESS(ec)) { - list.setDeleter(_deleteTransliterator); + list.setDeleter(_deleteTransliteratorTrIDPars); while (tlist.size() > 0) { t = (Transliterator*) tlist.orphanElementAt(0); @@ -637,8 +637,12 @@ void TransliteratorIDParser::STVtoID(const UnicodeString& source, */ void TransliteratorIDParser::registerSpecialInverse(const UnicodeString& target, const UnicodeString& inverseTarget, - UBool bidirectional) { - init(); + UBool bidirectional, + UErrorCode &status) { + init(status); + if (U_FAILURE(status)) { + return; + } // If target == inverseTarget then force bidirectional => FALSE if (bidirectional && 0==target.caseCompare(inverseTarget, U_FOLD_CASE_DEFAULT)) { @@ -648,10 +652,9 @@ void TransliteratorIDParser::registerSpecialInverse(const UnicodeString& target, umtx_init(&LOCK); Mutex lock(&LOCK); - UErrorCode ec = U_ZERO_ERROR; - SPECIAL_INVERSES->put(target, new UnicodeString(inverseTarget), ec); + SPECIAL_INVERSES->put(target, new UnicodeString(inverseTarget), status); if (bidirectional) { - SPECIAL_INVERSES->put(inverseTarget, new UnicodeString(target), ec); + SPECIAL_INVERSES->put(inverseTarget, new UnicodeString(target), status); } } @@ -705,7 +708,7 @@ TransliteratorIDParser::parseFilterID(const UnicodeString& id, int32_t& pos, ParsePosition ppos(pos); UErrorCode ec = U_ZERO_ERROR; - UnicodeSet set(id, ppos, USET_IGNORE_SPACE, ec); + UnicodeSet set(id, ppos, USET_IGNORE_SPACE, NULL, ec); if (U_FAILURE(ec)) { pos = start; return NULL; @@ -830,11 +833,11 @@ TransliteratorIDParser::specsToID(const Specs* specs, int32_t dir) { * 'filter' field of NULL. */ TransliteratorIDParser::SingleID* -TransliteratorIDParser::specsToSpecialInverse(const Specs& specs) { +TransliteratorIDParser::specsToSpecialInverse(const Specs& specs, UErrorCode &status) { if (0!=specs.source.caseCompare(ANY, U_FOLD_CASE_DEFAULT)) { return NULL; } - init(); + init(status); UnicodeString* inverseTarget; @@ -880,12 +883,12 @@ Transliterator* TransliteratorIDParser::createBasicInstance(const UnicodeString& /** * Initialize static memory. */ -void TransliteratorIDParser::init() { +void TransliteratorIDParser::init(UErrorCode &status) { if (SPECIAL_INVERSES != NULL) { return; } - Hashtable* special_inverses = new Hashtable(TRUE); + Hashtable* special_inverses = new Hashtable(TRUE, status); special_inverses->setValueDeleter(uhash_deleteUnicodeString); umtx_init(&LOCK); @@ -897,7 +900,7 @@ void TransliteratorIDParser::init() { umtx_unlock(&LOCK); delete special_inverses; - ucln_i18n_registerCleanup(); + ucln_i18n_registerCleanup(UCLN_I18N_TRANSLITERATOR, transliterator_cleanup); } /** diff --git a/icuSources/i18n/tridpars.h b/icuSources/i18n/tridpars.h index 050ac23e..b916a9a9 100644 --- a/icuSources/i18n/tridpars.h +++ b/icuSources/i18n/tridpars.h @@ -1,12 +1,12 @@ /* -********************************************************************** -* Copyright (c) 2002, International Business Machines Corporation -* and others. All Rights Reserved. -********************************************************************** -* Date Name Description -* 01/28/2002 aliu Creation. -********************************************************************** -*/ + ************************************************************************** + * Copyright (c) 2002-2004, International Business Machines Corporation * + * and others. All Rights Reserved. * + ************************************************************************** + * Date Name Description * + * 01/28/2002 aliu Creation. * + ************************************************************************** + */ #ifndef TRIDPARS_H #define TRIDPARS_H @@ -135,7 +135,7 @@ class TransliteratorIDParser /* not : public UObject because all methods are sta * @return a SingleID object or null */ static SingleID* parseSingleID(const UnicodeString& id, int32_t& pos, - int32_t dir); + int32_t dir, UErrorCode& status); /** * Parse a global filter of the form "[f]" or "([f])", depending @@ -287,7 +287,8 @@ class TransliteratorIDParser /* not : public UObject because all methods are sta */ static void registerSpecialInverse(const UnicodeString& target, const UnicodeString& inverseTarget, - UBool bidirectional); + UBool bidirectional, + UErrorCode &status); /** * Free static memory. @@ -343,7 +344,7 @@ class TransliteratorIDParser /* not : public UObject because all methods are sta * @return a SingleID or null. Returned object always has * 'filter' field of null. */ - static SingleID* specsToSpecialInverse(const Specs& specs); + static SingleID* specsToSpecialInverse(const Specs& specs, UErrorCode &status); /** * Glue method to get around access problems in C++. @@ -356,7 +357,7 @@ class TransliteratorIDParser /* not : public UObject because all methods are sta /** * Initialize static memory. */ - static void init(); + static void init(UErrorCode &status); friend class SingleID; }; diff --git a/icuSources/i18n/tzdat.h b/icuSources/i18n/tzdat.h deleted file mode 100644 index 0a81592c..00000000 --- a/icuSources/i18n/tzdat.h +++ /dev/null @@ -1,268 +0,0 @@ -/* -********************************************************************** -* Copyright (C) 1999-2003, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -* Date Name Description -* 11/24/99 aliu Creation. -* 12/13/1999 srl Padded OffsetIndex to 4 byte values -* 02/01/01 aliu Added country index -********************************************************************** -*/ - -#ifndef TZDAT_H -#define TZDAT_H - -#include "unicode/utypes.h" - -/* This file defines the format of the memory-mapped data file - * containing system time zone data for icu. See also gentz - * and tz.pl. - * - * The format is designed specifically to allow certain operations: - * - * 1. Performing a fast binary search by name, and locating the - * corresponding zone data. This is the most important operation. - * It corresponds to the TimeZone::createTimeZone() method. - * - * 2. Performing a fast iteration over zones having a specific GMT - * offset. For this operation, the zone data need not be - * retrieved, just the IDs. This corresponds to the - * TimeZone::createAvailableIDs(int32_t) method. - * - * 3. Iterating over all zone IDs. This corresponds to the - * TimeZone::createAvailableIDs() method. - * - * The createAvailableIDs() methods return arrays of pointers to - * existing static UnicodeString IDs that it owns. Thus - * createAvailableIDs() needs a way to reference one of these IDs when - * iterating. Note that these IDs are _not_ stored in the - * memory-mapped data file, so we cannot store offsets. To solve this - * problem, we define a canonical index number for each zone. This - * index number runs from 0..n-1, where n is the total number of - * zones. The name table is stored in index number order, and we - * provide a table that is sorted by GMT offset with keys being GMT - * offset values and values being canonical index numbers. - * - * (Later, we might change createAvailableIDs() to return char* - * strings rather than UnicodeString pointers. In that case, this - * data structure could be modified to index into the name table - * directly.) - * - * Any field with a name ending in "delta" is an offset value - * from the first byte of the TZHeader structure, unless otherwise - * specified. - * - * When using the name index table and the offset index table, - * code can determine whether an indexed zone is a standard - * zone or a DST zone by examining its delta. If the delta is - * less than dstDelta, it is a standard zone. Otherwise it - * is a DST zone. - */ - -/* tz.icu data file format - * - * Here is the overall structure of the tz.icu file, expressed as a - * pseudo-C-struct. Refer to actual struct declarations below for - * more details on each subelement of tz.icu. Many of the elements - * are of variable size. Padding is used when necessary to align - * words and longs properly; see structure declarations for details. - * - * struct tz.icu { - * - * // The header gives offsets to various tables within tz.icu. - * - * struct TZHeader header; - * - * // The equivalency groups; repeated; one element for each - * // equivalency group. Each one is of variable size. Typically, - * // an equivalency group is found given an ID index. The index is - * // used to find an entry of nameToEquiv[]. That entry is added to - * // the start of the header to obtain a pointer to one of the - * // entries equivTable[i]. The number of equivalency groups (n1) - * // is not stored anywhere; it can be discovered by walking the - * // table. - * - * struct TZEquivalencyGroup equivTable[n1]; - * - * // An index which groups timezones having the same raw offset - * // together; repeated; one element for each raw offset struct. - * // Typically the code walks through this table starting at the - * // beginning until the desired index is found or the end of the - * // table is reached. The number of offset groups (n2) is not - * // stored anywhere; it can be discovered by walking the table. - * - * struct OffsetIndex offsetIndex[n2]; - * - * // An index which groups timezones having the same country - * // together; repeated; one element for each country. Typically - * // the code walks through this table starting at the beginning - * // until the desired country is found or the end of the table is - * // reached. The number of offset groups (n3) is not stored - * // anywhere; it can be discovered by walking the table. - * - * struct CountryIndex countryIndex[n3]; - * - * // An array of offsets, one for each name. Each offset, when - * // added to the start of the header, gives a pointer to an entry - * // equivTable[i], the equivalency group struct for the given zone. - * // The nubmer of names is given by TZHeader.count. The order of - * // entries is the same as nameTable[]. - * - * uint32 nameToEquiv[header.count]; - * - * // All the time zone IDs, in sorted order, with 0 termination. - * // The number of entries is given by TZHeader.count. The total - * // number of characters in this table (n4) is not stored anywhere; - * // it can be discovered by walking the table. The order of - * // entries is the same as nameToEquiv[]. - * - * char nameTable[n4]; - * }; - */ - -// Information used to identify and validate the data - -#define TZ_DATA_NAME "tz" -#define TZ_DATA_TYPE "icu" - -#if !UCONFIG_NO_FORMATTING - -// Fields in UDataInfo: - -// TZ_SIG[] is encoded as numeric literals for compatibility with the HP compiler -static const uint8_t TZ_SIG_0 = 0x7a; // z -static const uint8_t TZ_SIG_1 = 0x6f; // o -static const uint8_t TZ_SIG_2 = 0x6e; // n -static const uint8_t TZ_SIG_3 = 0x65; // e - -// This must match the version number at the top of tz.txt as -// well as the version number in the udata header. -static const int8_t TZ_FORMAT_VERSION = 4; // formatVersion[0] - -struct TZHeader { - uint16_t versionYear; // e.g. "1999j" -> 1999 - uint16_t versionSuffix; // e.g. "1999j" -> 10 - - uint32_t count; // standardCount + dstCount - - uint32_t equivTableDelta; // delta to equivalency group table - uint32_t offsetIndexDelta; // delta to gmtOffset index table - - uint32_t countryIndexDelta; // delta to country code index table - - uint32_t nameIndexDelta; // delta to name index table - // The name index table is an array of 'count' 32-bit offsets from - // the start of this header to equivalency group table entries. - - uint32_t nameTableDelta; // delta to name (aka ID) table - // The name table contains all zone IDs, in sort order, each name - // terminated by a zero byte. -}; - -struct StandardZone { - int32_t gmtOffset; // gmt offset in milliseconds -}; - -struct TZRule { - uint8_t month; // month - int8_t dowim; // dowim - int8_t dow; // dow - uint16_t time; // time in minutes - int8_t mode; // (w/s/u) == TimeZone::TimeMode enum as int -}; - -struct DSTZone { - int32_t gmtOffset; // gmtoffset in milliseconds - uint16_t dstSavings; // savings in minutes - TZRule onsetRule; // onset rule - TZRule ceaseRule; // cease rule -}; - -/** - * This variable-sized struct represents a time zone equivalency group. - * This is a set of one or more zones that are identical in GMT offset - * and rules, but differ in ID. The struct has a variable size because - * the standard zone has no rule data, and also because it contains a - * variable number of index values listing the zones in the group. - * The struct is padded to take up 4n bytes so that 4-byte integers - * within the struct stay 4-aligned (namely, the gmtOffset members of - * the zone structs). - */ -struct TZEquivalencyGroup { - uint16_t nextEntryDelta; // 0 for last entry - uint8_t isDST; // != 0 for DSTZone - uint8_t reserved; - union { - struct { - StandardZone zone; - uint16_t count; - uint16_t index; // There are actually 'count' uint16_t's here - } s; - struct { - DSTZone zone; - uint16_t count; - uint16_t index; // There are actually 'count' uint16_t's here - } d; - } u; - // There may be two bytes of padding HERE to make the whole struct - // have size 4n bytes. -}; - -/** - * This variable-sized struct makes up the offset index table. To get - * from one table entry to the next, add the nextEntryDelta. If the - * nextEntryDelta is zero then this is the last entry. The offset - * index table is designed for sequential access, not random access. - * Given the small number of distinct offsets (39 in 1999j), this - * suffices. - * - * The value of default is the zone within this list that should be - * selected as the default zone in the absence of any other - * discriminating information. This information comes from the file - * tz.default. Note that this is itself a zone number, like - * those in the array starting at &zoneNumber. - * - * The gmtOffset field must be 4-aligned for some architectures. To - * ensure this, we do two things: 1. The entire struct is 4-aligned. - * 2. The gmtOffset is placed at a 4-aligned position within the - * struct. 3. The size of the whole structure is padded out to 4n - * bytes. We achieve this last condition by adding two bytes of - * padding after the last zoneNumber, if count is _even_. That is, - * the struct size is 10+2count+padding, where padding is (count%2==0 - * ? 2:0). See gentz for implementation. - */ -struct OffsetIndex { - int32_t gmtOffset; // in ms - 4-aligned - uint16_t nextEntryDelta; - uint16_t defaultZone; // a zone number from 0..TZHeader.count-1 - uint16_t count; - uint16_t zoneNumber; // There are actually 'count' uint16_t's here - // Following the 'count' uint16_t's starting with zoneNumber, - // there may be two bytes of padding to make the whole struct have - // a size of 4n. nextEntryDelta skips over any padding. -}; - -/** - * This variable-sized struct makes up the country index table. To get - * from one table entry to the next, add the nextEntryDelta. If the - * nextEntryDelta is zero then this is the last entry. The country - * index table is designed for sequential access, not random access. - * - * The intcode is an integer representation of the two-letter country - * code. It is computed as (c1-'A')*32 + (c0-'A') where the country - * code is a two-character string c1 c0, 'A' <= ci <= 'Z'. - * - * There are no 4-byte integers in this table, so we don't 4-align the - * entries. - */ -struct CountryIndex { - uint16_t intcode; // see above - uint16_t nextEntryDelta; - uint16_t count; - uint16_t zoneNumber; // There are actually 'count' uint16_t's here -}; - -#endif /* #if !UCONFIG_NO_FORMATTING */ - -#endif diff --git a/icuSources/i18n/ucal.cpp b/icuSources/i18n/ucal.cpp index be6f0e0d..5d8590f0 100644 --- a/icuSources/i18n/ucal.cpp +++ b/icuSources/i18n/ucal.cpp @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 1996-2003, International Business Machines +* Copyright (C) 1996-2004, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************* */ @@ -29,7 +29,9 @@ _createTimeZone(const UChar* zoneID, int32_t len, UErrorCode* ec) { // behavior is by design and goes back to the JDK. The only // failure we will see is a memory allocation failure. int32_t l = (len<0 ? u_strlen(zoneID) : len); - zone = TimeZone::createTimeZone(UnicodeString(zoneID, l)); + UnicodeString zoneStrID; + zoneStrID.setTo((UBool)(len < 0), zoneID, l); /* temporary read-only alias */ + zone = TimeZone::createTimeZone(zoneStrID); if (zone == NULL) { *ec = U_MEMORY_ALLOCATION_ERROR; } @@ -76,14 +78,32 @@ U_CAPI int32_t U_EXPORT2 ucal_getDSTSavings(const UChar* zoneID, UErrorCode* ec) { int32_t result = 0; TimeZone* zone = _createTimeZone(zoneID, -1, ec); - if (U_SUCCESS(*ec) && - zone->getDynamicClassID() == SimpleTimeZone::getStaticClassID()) { - result = ((SimpleTimeZone*) zone)->getDSTSavings(); + if (U_SUCCESS(*ec)) { + if (zone->getDynamicClassID() == SimpleTimeZone::getStaticClassID()) { + result = ((SimpleTimeZone*) zone)->getDSTSavings(); + } else { + // Since there is no getDSTSavings on TimeZone, we use a + // heuristic: Starting with the current time, march + // forwards for one year, looking for DST savings. + // Stepping by weeks is sufficient. + UDate d = Calendar::getNow(); + for (int32_t i=0; i<53; ++i, d+=U_MILLIS_PER_DAY*7.0) { + int32_t raw, dst; + zone->getOffset(d, FALSE, raw, dst, *ec); + if (U_FAILURE(*ec)) { + break; + } else if (dst != 0) { + result = dst; + break; + } + } + } } delete zone; return result; } +#ifdef U_USE_UCAL_OBSOLETE_2_8 U_CAPI const UChar* U_EXPORT2 ucal_getAvailableTZIDs( int32_t rawOffset, int32_t index, @@ -129,6 +149,7 @@ ucal_countAvailableTZIDs(int32_t rawOffset) uprv_free(tzs); return count; } +#endif U_CAPI UDate U_EXPORT2 ucal_getNow() @@ -451,4 +472,16 @@ ucal_getLimit( const UCalendar* cal, return -1; } +U_CAPI const char * U_EXPORT2 +ucal_getLocaleByType(const UCalendar *cal, ULocDataLocaleType type, UErrorCode* status) +{ + if (cal == NULL) { + if (U_SUCCESS(*status)) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + } + return NULL; + } + return ((Calendar*)cal)->getLocaleID(type, *status); +} + #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/i18n/ucln_in.c b/icuSources/i18n/ucln_in.c index 1f92321c..34653e07 100644 --- a/icuSources/i18n/ucln_in.c +++ b/icuSources/i18n/ucln_in.c @@ -1,11 +1,11 @@ /* ****************************************************************************** * * -* Copyright (C) 2001-2003, International Business Machines * +* Copyright (C) 2001-2004, International Business Machines * * Corporation and others. All Rights Reserved. * * * ****************************************************************************** -* file name: ucln_cmn.c +* file name: ucln_in.c * encoding: US-ASCII * tab size: 8 (not used) * indentation:4 @@ -16,38 +16,35 @@ #include "ucln.h" #include "ucln_in.h" +#include "uassert.h" /* Leave this copyright notice here! It needs to go somewhere in this library. */ static const char copyright[] = U_COPYRIGHT_STRING; +static cleanupFunc *gCleanupFunctions[UCLN_I18N_COUNT]; + static UBool i18n_cleanup(void) { -#if !UCONFIG_NO_TRANSLITERATION - transliterator_cleanup(); -#endif - -#if !UCONFIG_NO_REGULAR_EXPRESSIONS - regex_cleanup(); -#endif - -#if !UCONFIG_NO_FORMATTING - calendar_cleanup(); - numfmt_cleanup(); - currency_cleanup(); - timeZone_cleanup(); -#endif - -#if !UCONFIG_NO_COLLATION - collator_cleanup(); - ucol_cleanup(); - ucol_bld_cleanup(); -#endif - + ECleanupI18NType libType; + + for (libType = UCLN_I18N_START+1; libType @@ -60,10 +63,18 @@ U_NAMESPACE_USE #define ZERO_CC_LIMIT_ 0xC0 -static UCollator* UCA = NULL; -static UCAConstants *UCAconsts = NULL; +// static UCA. There is only one. Collators don't use it. +// It is referenced only in ucol_initUCA and ucol_cleanup +static UCollator* _staticUCA = NULL; +// static pointer to udata memory. Inited in ucol_initUCA +// used for cleanup in ucol_cleanup static UDataMemory* UCA_DATA_MEM = NULL; +// this is static pointer to the normalizer fcdTrieIndex +// it is always the same between calls to u_cleanup +// and therefore writing to it is not synchronized. +// It is cleaned in ucol_cleanup +static const uint16_t *fcdTrieIndex=NULL; U_CDECL_BEGIN static UBool U_CALLCONV @@ -74,15 +85,15 @@ isAcceptableUCA(void * /*context*/, if( pInfo->size>=20 && pInfo->isBigEndian==U_IS_BIG_ENDIAN && pInfo->charsetFamily==U_CHARSET_FAMILY && - pInfo->dataFormat[0]==ucaDataInfo.dataFormat[0] && /* dataFormat="UCol" */ - pInfo->dataFormat[1]==ucaDataInfo.dataFormat[1] && - pInfo->dataFormat[2]==ucaDataInfo.dataFormat[2] && - pInfo->dataFormat[3]==ucaDataInfo.dataFormat[3] && - pInfo->formatVersion[0]==ucaDataInfo.formatVersion[0] && - pInfo->formatVersion[1]>=ucaDataInfo.formatVersion[1]// && - //pInfo->formatVersion[1]==ucaDataInfo.formatVersion[1] && - //pInfo->formatVersion[2]==ucaDataInfo.formatVersion[2] && // Too harsh - //pInfo->formatVersion[3]==ucaDataInfo.formatVersion[3] && // Too harsh + pInfo->dataFormat[0]==UCA_DATA_FORMAT_0 && /* dataFormat="UCol" */ + pInfo->dataFormat[1]==UCA_DATA_FORMAT_1 && + pInfo->dataFormat[2]==UCA_DATA_FORMAT_2 && + pInfo->dataFormat[3]==UCA_DATA_FORMAT_3 && + pInfo->formatVersion[0]==UCA_FORMAT_VERSION_0 && + pInfo->formatVersion[1]>=UCA_FORMAT_VERSION_1// && + //pInfo->formatVersion[1]==UCA_FORMAT_VERSION_1 && + //pInfo->formatVersion[2]==UCA_FORMAT_VERSION_2 && // Too harsh + //pInfo->formatVersion[3]==UCA_FORMAT_VERSION_3 && // Too harsh ) { UVersionInfo UCDVersion; u_getUnicodeVersion(UCDVersion); @@ -127,7 +138,7 @@ inline void IInit_collIterate(const UCollator *collator, const UChar *sourceStr (s)->coll = (collator); (s)->fcdPosition = 0; if(collator->normalizationMode == UCOL_ON) { - (s)->flags |= UCOL_ITER_NORM; + (s)->flags |= UCOL_ITER_NORM; } if(collator->hiraganaQ == UCOL_ON && collator->strength >= UCOL_QUATERNARY) { (s)->flags |= UCOL_HIRAGANA_Q; @@ -339,47 +350,76 @@ tryOpeningFromRules(UResourceBundle *collElem, UErrorCode *status) { U_CAPI UCollator* ucol_open(const char *loc, - UErrorCode *status) + UErrorCode *status) { + UTRACE_ENTRY_OC(UTRACE_UCOL_OPEN); + UTRACE_DATA1(UTRACE_INFO, "locale = \"%s\"", loc); UCollator *result = NULL; - if (status && U_SUCCESS(*status)) { - result = Collator::createUCollator(loc, status); - if (result) { - return result; - } + + u_init(status); +#if !UCONFIG_NO_SERVICE + result = Collator::createUCollator(loc, status); + if (result == NULL) +#endif + { + result = ucol_open_internal(loc, status); } - return ucol_open_internal(loc, status); + UTRACE_EXIT_PTR_STATUS(result, *status); + return result; } // API in ucol_imp.h U_CFUNC UCollator* ucol_open_internal(const char *loc, - UErrorCode *status) + UErrorCode *status) { - ucol_initUCA(status); + const UCollator* UCA = ucol_initUCA(status); /* New version */ if(U_FAILURE(*status)) return 0; + + UCollator *result = NULL; - UResourceBundle *b = ures_open(NULL, loc, status); - UResourceBundle *collElem = ures_getByKey(b, "CollationElements", NULL, status); + UResourceBundle *b = ures_open(U_ICUDATA_COLL, loc, status); + + /* we try to find stuff from keyword */ + UResourceBundle *collations = ures_getByKey(b, "collations", NULL, status); + UResourceBundle *collElem = NULL; + char keyBuffer[256]; + // if there is a keyword, we pick it up and try to get elements + if(!uloc_getKeywordValue(loc, "collation", keyBuffer, 256, status)) { + // no keyword. we try to find the default setting, which will give us the keyword value + UResourceBundle *defaultColl = ures_getByKeyWithFallback(collations, "default", NULL, status); + if(U_SUCCESS(*status)) { + int32_t defaultKeyLen = 0; + const UChar *defaultKey = ures_getString(defaultColl, &defaultKeyLen, status); + u_UCharsToChars(defaultKey, keyBuffer, defaultKeyLen); + keyBuffer[defaultKeyLen] = 0; + } else { + *status = U_INTERNAL_PROGRAM_ERROR; + return NULL; + } + ures_close(defaultColl); + } + collElem = ures_getByKeyWithFallback(collations, keyBuffer, collElem, status); + UResourceBundle *binary = NULL; - UErrorCode binaryStatus = U_ZERO_ERROR; + UErrorCode binaryStatus = U_ZERO_ERROR; if(*status == U_MISSING_RESOURCE_ERROR) { /* We didn't find the tailoring data, we fallback to the UCA */ *status = U_USING_DEFAULT_WARNING; - result = ucol_initCollator(UCA->image, result, status); + result = ucol_initCollator(UCA->image, result, UCA, status); // if we use UCA, real locale is root - result->rb = ures_open(NULL, "", status); - result->elements = ures_open(NULL, "", status); + result->rb = ures_open(U_ICUDATA_COLL, "", status); + result->elements = ures_open(U_ICUDATA_COLL, "", status); if(U_FAILURE(*status)) { goto clean; } ures_close(b); result->hasRealData = FALSE; - } else if(U_SUCCESS(*status)) { + } else if(U_SUCCESS(*status)) { binary = ures_getByKey(collElem, "%%CollationBin", NULL, &binaryStatus); if(binaryStatus == U_MISSING_RESOURCE_ERROR) { /* we didn't find the binary image, we should use the rules */ @@ -402,13 +442,13 @@ ucol_open_internal(const char *loc, goto clean; } if((uint32_t)len > (paddedsize(sizeof(UCATableHeader)) + paddedsize(sizeof(UColOptionSet)))) { - result = ucol_initCollator((const UCATableHeader *)inData, result, status); + result = ucol_initCollator((const UCATableHeader *)inData, result, UCA, status); if(U_FAILURE(*status)){ goto clean; } result->hasRealData = TRUE; } else { - result = ucol_initCollator(UCA->image, result, status); + result = ucol_initCollator(UCA->image, result, UCA, status); ucol_setOptionsFromHeader(result, (UColOptionSet *)(inData+((const UCATableHeader *)inData)->options), status); if(U_FAILURE(*status)){ goto clean; @@ -424,6 +464,7 @@ ucol_open_internal(const char *loc, clean: ures_close(b); ures_close(collElem); + ures_close(collations); ures_close(binary); return NULL; } @@ -436,29 +477,32 @@ clean: result->requestedLocale = (char *)uprv_malloc((uprv_strlen(loc)+1)*sizeof(char)); /* test for NULL */ if (result->requestedLocale == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - ures_close(b); // ??? appears needed + *status = U_MEMORY_ALLOCATION_ERROR; + ures_close(b); // ??? appears needed ures_close(collElem); + ures_close(collations); ures_close(binary); // ??? appears needed - return NULL; + return NULL; } uprv_strcpy(result->requestedLocale, loc); ures_close(binary); + ures_close(collations); //??? we have to decide on that. Probably affects something :) return result; } + U_CAPI void U_EXPORT2 ucol_setReqValidLocales(UCollator *coll, char *requestedLocaleToAdopt, char *validLocaleToAdopt) { if (coll) { if (coll->validLocale) { uprv_free(coll->validLocale); - } + } coll->validLocale = validLocaleToAdopt; if (coll->requestedLocale) { // should always have uprv_free(coll->requestedLocale); - } + } coll->requestedLocale = requestedLocaleToAdopt; } } @@ -466,49 +510,53 @@ ucol_setReqValidLocales(UCollator *coll, char *requestedLocaleToAdopt, char *val U_CAPI void U_EXPORT2 ucol_close(UCollator *coll) { + UTRACE_ENTRY_OC(UTRACE_UCOL_CLOSE); + UTRACE_DATA1(UTRACE_INFO, "coll = %p", coll); if(coll != NULL) { - // these are always owned by each UCollator struct, - // so we always free them - if(coll->validLocale != NULL) { - uprv_free(coll->validLocale); - } - if(coll->requestedLocale != NULL) { - uprv_free(coll->requestedLocale); - } + // these are always owned by each UCollator struct, + // so we always free them + if(coll->validLocale != NULL) { + uprv_free(coll->validLocale); + } + if(coll->requestedLocale != NULL) { + uprv_free(coll->requestedLocale); + } - /* Here, it would be advisable to close: */ - /* - UData for UCA (unless we stuff it in the root resb */ - /* Again, do we need additional housekeeping... HMMM! */ - if(coll->freeOnClose == FALSE){ - return; /* for safeClone, if freeOnClose is FALSE, - don't free the other instance data */ - } - if(coll->freeOptionsOnClose != FALSE) { - if(coll->options != NULL) { - uprv_free(coll->options); + /* Here, it would be advisable to close: */ + /* - UData for UCA (unless we stuff it in the root resb */ + /* Again, do we need additional housekeeping... HMMM! */ + UTRACE_DATA1(UTRACE_INFO, "coll->freeOnClose: %d", coll->freeOnClose); + if(coll->freeOnClose){ + /* for safeClone, if freeOnClose is FALSE, + don't free the other instance data */ + if(coll->freeOptionsOnClose != FALSE) { + if(coll->options != NULL) { + uprv_free(coll->options); + } + } + if(coll->mapping != NULL) { + /*ucmpe32_close(coll->mapping);*/ + uprv_free(coll->mapping); + } + if(coll->rules != NULL && coll->freeRulesOnClose) { + uprv_free((UChar *)coll->rules); + } + if(coll->rb != NULL) { /* pointing to read-only memory */ + ures_close(coll->rb); + } + if(coll->freeImageOnClose == TRUE) { + uprv_free((UCATableHeader *)coll->image); + } + if(coll->elements != NULL) { + ures_close(coll->elements); + } + if(coll->latinOneCEs != NULL) { + uprv_free(coll->latinOneCEs); + } + uprv_free(coll); } - } - if(coll->mapping != NULL) { - /*ucmpe32_close(coll->mapping);*/ - uprv_free(coll->mapping); - } - if(coll->rules != NULL && coll->freeRulesOnClose) { - uprv_free((UChar *)coll->rules); - } - if(coll->rb != NULL) { /* pointing to read-only memory */ - ures_close(coll->rb); - } - if(coll->freeImageOnClose == TRUE) { - uprv_free((UCATableHeader *)coll->image); - } - if(coll->elements != NULL) { - ures_close(coll->elements); - } - if(coll->latinOneCEs != NULL) { - uprv_free(coll->latinOneCEs); - } - uprv_free(coll); } + UTRACE_EXIT(); } U_CAPI UCollator* U_EXPORT2 @@ -523,11 +571,16 @@ ucol_openRules( const UChar *rules, UColTokenParser src; UColAttributeValue norm; UParseError tErr; - + if(status == NULL || U_FAILURE(*status)){ return 0; } + u_init(status); + if (U_FAILURE(*status)) { + return NULL; + } + if(rulesLength < -1 || (rules == NULL && rulesLength != 0)) { *status = U_ILLEGAL_ARGUMENT_ERROR; return 0; @@ -540,7 +593,7 @@ ucol_openRules( const UChar *rules, if(parseError == NULL){ parseError = &tErr; } - + switch(normalizationMode) { case UCOL_OFF: case UCOL_ON: @@ -552,7 +605,7 @@ ucol_openRules( const UChar *rules, return 0; } - ucol_initUCA(status); + UCollator *UCA = ucol_initUCA(status); if(U_FAILURE(*status)){ return NULL; @@ -590,14 +643,14 @@ ucol_openRules( const UChar *rules, u_getUnicodeVersion(table->UCDVersion); // set UCA version uprv_memcpy(table->UCAVersion, UCA->image->UCAVersion, sizeof(UVersionInfo)); - result = ucol_initCollator(table,0,status); + result = ucol_initCollator(table, 0, UCA, status); result->hasRealData = TRUE; result->freeImageOnClose = TRUE; } } else { /* no rules, but no error either */ // must be only options - // We will init the collator from UCA - result = ucol_initCollator(UCA->image,0,status); + // We will init the collator from UCA + result = ucol_initCollator(UCA->image, 0, UCA, status); // And set only the options UColOptionSet *opts = (UColOptionSet *)uprv_malloc(sizeof(UColOptionSet)); /* test for NULL */ @@ -677,7 +730,37 @@ ucol_cloneRuleData(const UCollator *coll, int32_t *length, UErrorCode *status) *status = U_MEMORY_ALLOCATION_ERROR; return NULL; } - uprv_memcpy(result, UCA->image, sizeof(UCATableHeader)); + + /* build the UCATableHeader with minimal entries */ + /* do not copy the header from the UCA file because its values are wrong! */ + /* uprv_memcpy(result, UCA->image, sizeof(UCATableHeader)); */ + + /* reset everything */ + uprv_memset(result, 0, *length); + + /* set the tailoring-specific values */ + UCATableHeader *myData = (UCATableHeader *)result; + myData->size = *length; + + /* offset for the options, the only part of the data that is present after the header */ + myData->options = sizeof(UCATableHeader); + + /* need to always set the expansion value for an upper bound of the options */ + myData->expansion = myData->options + sizeof(UColOptionSet); + + myData->magic = UCOL_HEADER_MAGIC; + myData->isBigEndian = U_IS_BIG_ENDIAN; + myData->charSetFamily = U_CHARSET_FAMILY; + + /* copy UCA's version; genrb will override all but the builder version with tailoring data */ + uprv_memcpy(myData->version, coll->image->version, sizeof(UVersionInfo)); + + uprv_memcpy(myData->UCAVersion, coll->image->UCAVersion, sizeof(UVersionInfo)); + uprv_memcpy(myData->UCDVersion, coll->image->UCDVersion, sizeof(UVersionInfo)); + uprv_memcpy(myData->formatVersion, coll->image->formatVersion, sizeof(UVersionInfo)); + myData->jamoSpecial = coll->image->jamoSpecial; + + /* copy the collator options */ uprv_memcpy(result+paddedsize(sizeof(UCATableHeader)), coll->options, sizeof(UColOptionSet)); } return result; @@ -729,8 +812,6 @@ void ucol_putOptionsToHeader(UCollator* result, UColOptionSet * opts, UErrorCode } #endif -static const uint16_t *fcdTrieIndex=NULL; - /** * Approximate determination if a character is at a contraction end. @@ -776,7 +857,7 @@ inline uint8_t i_getCombiningClass(UChar c, const UCollator *coll) { } -UCollator* ucol_initCollator(const UCATableHeader *image, UCollator *fillIn, UErrorCode *status) { +UCollator* ucol_initCollator(const UCATableHeader *image, UCollator *fillIn, const UCollator *UCA, UErrorCode *status) { UChar c; UCollator *result = fillIn; if(U_FAILURE(*status) || image == NULL) { @@ -797,7 +878,7 @@ UCollator* ucol_initCollator(const UCATableHeader *image, UCollator *fillIn, UEr result->image = image; const uint8_t *mapping = (uint8_t*)result->image+result->image->mappingPosition; /*CompactEIntArray *newUCAmapping = ucmpe32_openFromData(&mapping, status);*/ - UTrie *newUCAmapping = (UTrie *)uprv_malloc(sizeof(UTrie)); + UTrie *newUCAmapping = (UTrie *)uprv_malloc(sizeof(UTrie)); if(newUCAmapping != NULL) { utrie_unserialize(newUCAmapping, mapping, result->image->endExpansionCE - result->image->mappingPosition, status); } else { @@ -880,9 +961,6 @@ UCollator* ucol_initCollator(const UCATableHeader *image, UCollator *fillIn, UEr result->expansionCESize = (uint8_t*)result->image + result->image->expansionCESize; - if (fcdTrieIndex == NULL) { - fcdTrieIndex = unorm_getFCDTrie(status); - } //result->errorCode = *status; @@ -890,6 +968,7 @@ UCollator* ucol_initCollator(const UCATableHeader *image, UCollator *fillIn, UEr result->latinOneRegenTable = FALSE; result->latinOneFailed = FALSE; + result->UCA = UCA; ucol_updateInternalState(result, status); @@ -897,67 +976,74 @@ UCollator* ucol_initCollator(const UCATableHeader *image, UCollator *fillIn, UEr return result; } -U_CFUNC UBool -ucol_cleanup(void) -{ - if (UCA_DATA_MEM) { - udata_close(UCA_DATA_MEM); - UCA_DATA_MEM = NULL; - } - if (UCA) { - ucol_close(UCA); - UCA = NULL; - } - return TRUE; -} +/* new Mark's code */ +/** + * For generation of Implicit CEs + * @author Davis + * + * Cleaned up so that changes can be made more easily. + * Old values: +# First Implicit: E26A792D +# Last Implicit: E3DC70C0 +# First CJK: E0030300 +# Last CJK: E0A9DD00 +# First CJK_A: E0A9DF00 +# Last CJK_A: E0DE3100 + */ /* Following is a port of Mark's code for new treatment of implicits. - * It is positioned here, since ucol_initUCA need to initialize the + * It is positioned here, since ucol_initUCA need to initialize the * variables below according to the data in the fractional UCA. */ - + /** - * Function used to: - * a) collapse the 2 different Han ranges from UCA into one (in the right order), and - * b) bump any non-CJK characters by 10FFFF. - * The relevant blocks are: - * A: 4E00..9FFF; CJK Unified Ideographs - * F900..FAFF; CJK Compatibility Ideographs - * B: 3400..4DBF; CJK Unified Ideographs Extension A - * 20000..XX; CJK Unified Ideographs Extension B (and others later on) - * As long as - * no new B characters are allocated between 4E00 and FAFF, and - * no new A characters are outside of this range, - * (very high probability) this simple code will work. - * The reordered blocks are: - * Block1 is CJK - * Block2 is CJK_COMPAT_USED - * Block3 is CJK_A - * Any other CJK gets its normal code point - * Any non-CJK gets +10FFFF - * When we reorder Block1, we make sure that it is at the very start, - * so that it will use a 3-byte form. - */ + * Function used to: + * a) collapse the 2 different Han ranges from UCA into one (in the right order), and + * b) bump any non-CJK characters by 10FFFF. + * The relevant blocks are: + * A: 4E00..9FFF; CJK Unified Ideographs + * F900..FAFF; CJK Compatibility Ideographs + * B: 3400..4DBF; CJK Unified Ideographs Extension A + * 20000..XX; CJK Unified Ideographs Extension B (and others later on) + * As long as + * no new B characters are allocated between 4E00 and FAFF, and + * no new A characters are outside of this range, + * (very high probability) this simple code will work. + * The reordered blocks are: + * Block1 is CJK + * Block2 is CJK_COMPAT_USED + * Block3 is CJK_A + * (all contiguous) + * Any other CJK gets its normal code point + * Any non-CJK gets +10FFFF + * When we reorder Block1, we make sure that it is at the very start, + * so that it will use a 3-byte form. + * Warning: the we only pick up the compatibility characters that are + * NOT decomposed, so that block is smaller! + */ // CONSTANTS -static const uint32_t +static const UChar32 NON_CJK_OFFSET = 0x110000, - BYTES_TO_AVOID = 3, - OTHER_COUNT = 256 - BYTES_TO_AVOID, - LAST_COUNT = OTHER_COUNT / 2, - LAST_COUNT2 = OTHER_COUNT / 21, // room for intervening, without expanding to 5 bytes - IMPLICIT_3BYTE_COUNT = 1; - -// These depend on initUCA, and are initialized at that time -static uint32_t - IMPLICIT_BASE_BYTE = 0, - IMPLICIT_LIMIT_BYTE = 0, // leave room for 1 3-byte and 2 4-byte forms - - IMPLICIT_4BYTE_BOUNDARY = 0, - LAST_MULTIPLIER = 0, - LAST2_MULTIPLIER = 0, - IMPLICIT_BASE_3BYTE = 0, - IMPLICIT_BASE_4BYTE = 0; + UCOL_MAX_INPUT = 0x220001; // 2 * Unicode range + 2 + +/** + * Precomputed by constructor + */ +static int32_t + final3Multiplier = 0, + final4Multiplier = 0, + final3Count = 0, + final4Count = 0, + medialCount = 0, + min3Primary = 0, + min4Primary = 0, + max4Primary = 0, + minTrail = 0, + maxTrail = 0, + max3Trail = 0, + max4Trail = 0, + min4Boundary = 0; static const UChar32 CJK_BASE = 0x4E00, @@ -969,105 +1055,282 @@ static const UChar32 CJK_B_BASE = 0x20000, CJK_B_LIMIT = 0x2A6DF+1; -static inline UChar32 swapCJK(UChar32 cp) { - - if (cp >= CJK_BASE) { - if (cp < CJK_LIMIT) return cp - CJK_BASE; - - if (cp < CJK_COMPAT_USED_BASE) return cp + NON_CJK_OFFSET; - - if (cp < CJK_COMPAT_USED_LIMIT) return cp - CJK_COMPAT_USED_BASE - + (CJK_LIMIT - CJK_BASE); - if (cp < CJK_B_BASE) return cp + NON_CJK_OFFSET; - - if (cp < CJK_B_LIMIT) return cp; // non-BMP-CJK - - return cp + NON_CJK_OFFSET; // non-CJK - } - if (cp < CJK_A_BASE) return cp + NON_CJK_OFFSET; - - if (cp < CJK_A_LIMIT) return cp - CJK_A_BASE - + (CJK_LIMIT - CJK_BASE) - + (CJK_COMPAT_USED_LIMIT - CJK_COMPAT_USED_BASE); - return cp + NON_CJK_OFFSET; // non-CJK +static UChar32 swapCJK(UChar32 i) { + + if (i >= CJK_BASE) { + if (i < CJK_LIMIT) return i - CJK_BASE; + + if (i < CJK_COMPAT_USED_BASE) return i + NON_CJK_OFFSET; + + if (i < CJK_COMPAT_USED_LIMIT) return i - CJK_COMPAT_USED_BASE + + (CJK_LIMIT - CJK_BASE); + if (i < CJK_B_BASE) return i + NON_CJK_OFFSET; + + if (i < CJK_B_LIMIT) return i; // non-BMP-CJK + + return i + NON_CJK_OFFSET; // non-CJK + } + if (i < CJK_A_BASE) return i + NON_CJK_OFFSET; + + if (i < CJK_A_LIMIT) return i - CJK_A_BASE + + (CJK_LIMIT - CJK_BASE) + + (CJK_COMPAT_USED_LIMIT - CJK_COMPAT_USED_BASE); + return i + NON_CJK_OFFSET; // non-CJK +} + +U_CAPI UChar32 U_EXPORT2 +uprv_uca_getRawFromCodePoint(UChar32 i) { + return swapCJK(i)+1; +} + +U_CAPI UChar32 U_EXPORT2 +uprv_uca_getCodePointFromRaw(UChar32 i) { + i--; + UChar32 result = 0; + if(i >= NON_CJK_OFFSET) { + result = i - NON_CJK_OFFSET; + } else if(i >= CJK_B_BASE) { + result = i; + } else if(i < CJK_A_LIMIT + (CJK_LIMIT - CJK_BASE) + (CJK_COMPAT_USED_LIMIT - CJK_COMPAT_USED_BASE)) { // rest of CJKs, compacted + if(i < CJK_LIMIT - CJK_BASE) { + result = i + CJK_BASE; + } else if(i < (CJK_LIMIT - CJK_BASE) + (CJK_COMPAT_USED_LIMIT - CJK_COMPAT_USED_BASE)) { + result = i + CJK_COMPAT_USED_BASE - (CJK_LIMIT - CJK_BASE); + } else { + result = i + CJK_A_BASE - (CJK_LIMIT - CJK_BASE) - (CJK_COMPAT_USED_LIMIT - CJK_COMPAT_USED_BASE); + } + } else { + result = -1; + } + return result; } - // GET IMPLICIT PRIMARY WEIGHTS // Return value is left justified primary key +U_CAPI uint32_t U_EXPORT2 +uprv_uca_getImplicitFromRaw(UChar32 cp) { + /* + if (cp < 0 || cp > UCOL_MAX_INPUT) { + throw new IllegalArgumentException("Code point out of range " + Utility.hex(cp)); + } + */ + int32_t last0 = cp - min4Boundary; + if (last0 < 0) { + int32_t last1 = cp / final3Count; + last0 = cp % final3Count; -static inline uint32_t getImplicitPrimary(UChar32 cp) { + int32_t last2 = last1 / medialCount; + last1 %= medialCount; - //if (DEBUG) System.out.println("Incoming: " + Utility.hex(cp)); - - cp = swapCJK(cp); - - //if (DEBUG) System.out.println("CJK swapped: " + Utility.hex(cp)); - - // we now have a range of numbers from 0 to 21FFFF. - - // we must skip all 00, 01, 02 bytes, so most bytes have 253 values - // we must leave a gap of 01 between all values of the last byte, so the last byte has 126 values (3 byte case) - // we shift so that HAN all has the same first primary, for compression. - // for the 4 byte case, we make the gap as large as we can fit. - // Three byte forms are EC xx xx, ED xx xx, EE xx xx (with a gap of 1) - // Four byte forms (most supplementaries) are EF xx xx xx (with a gap of LAST2_MULTIPLIER == 14) - - int32_t last0 = cp - IMPLICIT_4BYTE_BOUNDARY; - if (last0 < 0) { - int32_t last1 = cp / LAST_COUNT; - last0 = cp % LAST_COUNT; - - int32_t last2 = last1 / OTHER_COUNT; - last1 %= OTHER_COUNT; + last0 = minTrail + last0*final3Multiplier; // spread out, leaving gap at start + last1 = minTrail + last1; // offset + last2 = min3Primary + last2; // offset /* - if (DEBUG || last2 > 0xFF-BYTES_TO_AVOID) System.out.println("3B: " + Utility.hex(cp) + " => " - + Utility.hex(last2) + ", " - + Utility.hex(last1) + ", " - + Utility.hex(last0) + ", " - ); + if (last2 >= min4Primary) { + throw new IllegalArgumentException("4-byte out of range: " + Utility.hex(cp) + ", " + Utility.hex(last2)); + } */ - - return IMPLICIT_BASE_3BYTE + (last2 << 24) + (last1 << 16) + ((last0*LAST_MULTIPLIER) << 8); + return (last2 << 24) + (last1 << 16) + (last0 << 8); } else { - int32_t last1 = last0 / LAST_COUNT2; - last0 %= LAST_COUNT2; - - int32_t last2 = last1 / OTHER_COUNT; - last1 %= OTHER_COUNT; - - int32_t last3 = last2 / OTHER_COUNT; - last2 %= OTHER_COUNT; + int32_t last1 = last0 / final4Count; + last0 %= final4Count; + int32_t last2 = last1 / medialCount; + last1 %= medialCount; + + int32_t last3 = last2 / medialCount; + last2 %= medialCount; + + last0 = minTrail + last0*final4Multiplier; // spread out, leaving gap at start + last1 = minTrail + last1; // offset + last2 = minTrail + last2; // offset + last3 = min4Primary + last3; // offset /* - if (DEBUG || last3 > 0xFF-BYTES_TO_AVOID) System.out.println("4B: " + Utility.hex(cp) + " => " - + Utility.hex(last3) + ", " - + Utility.hex(last2) + ", " - + Utility.hex(last1) + ", " - + Utility.hex(last0 * LAST2_MULTIPLIER) + ", " - ); + if (last3 > max4Primary) { + throw new IllegalArgumentException("4-byte out of range: " + Utility.hex(cp) + ", " + Utility.hex(last3)); + } */ - - return IMPLICIT_BASE_4BYTE + (last3 << 24) + (last2 << 16) + (last1 << 8) + (last0 * LAST2_MULTIPLIER); + return (last3 << 24) + (last2 << 16) + (last1 << 8) + last0; } } +U_CAPI uint32_t U_EXPORT2 +uprv_uca_getImplicitPrimary(UChar32 cp) { + //if (DEBUG) System.out.println("Incoming: " + Utility.hex(cp)); + + cp = swapCJK(cp); + cp++; + // we now have a range of numbers from 0 to 21FFFF. + + //if (DEBUG) System.out.println("CJK swapped: " + Utility.hex(cp)); + + return uprv_uca_getImplicitFromRaw(cp); +} + +/** + * Converts implicit CE into raw integer ("code point") + * @param implicit + * @return -1 if illegal format + */ +U_CAPI UChar32 U_EXPORT2 +uprv_uca_getRawFromImplicit(uint32_t implicit) { + UChar32 result; + UChar32 b3 = implicit & 0xFF; + implicit >>= 8; + UChar32 b2 = implicit & 0xFF; + implicit >>= 8; + UChar32 b1 = implicit & 0xFF; + implicit >>= 8; + UChar32 b0 = implicit & 0xFF; + + // simple parameter checks + if (b0 < min3Primary || b0 > max4Primary + || b1 < minTrail || b1 > maxTrail) return -1; + // normal offsets + b1 -= minTrail; + + // take care of the final values, and compose + if (b0 < min4Primary) { + if (b2 < minTrail || b2 > max3Trail || b3 != 0) return -1; + b2 -= minTrail; + UChar32 remainder = b2 % final3Multiplier; + if (remainder != 0) return -1; + b0 -= min3Primary; + b2 /= final3Multiplier; + result = ((b0 * medialCount) + b1) * final3Count + b2; + } else { + if (b2 < minTrail || b2 > maxTrail + || b3 < minTrail || b3 > max4Trail) return -1; + b2 -= minTrail; + b3 -= minTrail; + UChar32 remainder = b3 % final4Multiplier; + if (remainder != 0) return -1; + b3 /= final4Multiplier; + b0 -= min4Primary; + result = (((b0 * medialCount) + b1) * medialCount + b2) * final4Count + b3 + min4Boundary; + } + // final check + if (result < 0 || result > UCOL_MAX_INPUT) return -1; + return result; +} + + +static inline int32_t divideAndRoundUp(int a, int b) { + return 1 + (a-1)/b; +} + /* this function is either called from initUCA or from genUCA before * doing canonical closure for the UCA. */ -U_CAPI void U_EXPORT2 -uprv_uca_initImplicitConstants(uint32_t baseByte) + +/** + * Set up to generate implicits. + * @param minPrimary + * @param maxPrimary + * @param minTrail final byte + * @param maxTrail final byte + * @param gap3 the gap we leave for tailoring for 3-byte forms + * @param gap4 the gap we leave for tailoring for 4-byte forms + */ +static void initImplicitConstants(int minPrimary, int maxPrimary, + int minTrailIn, int maxTrailIn, + int gap3, int primaries3count, + UErrorCode *status) { + // some simple parameter checks + if (minPrimary < 0 || minPrimary >= maxPrimary || maxPrimary > 0xFF) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return; + }; + if (minTrailIn < 0 || minTrailIn >= maxTrailIn || maxTrailIn > 0xFF) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return; + }; + if (primaries3count < 1) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return; + }; + + minTrail = minTrailIn; + maxTrail = maxTrailIn; + + min3Primary = minPrimary; + max4Primary = maxPrimary; + // compute constants for use later. + // number of values we can use in trailing bytes + // leave room for empty values between AND above, e.g. if gap = 2 + // range 3..7 => +3 -4 -5 -6 -7: so 1 value + // range 3..8 => +3 -4 -5 +6 -7 -8: so 2 values + // range 3..9 => +3 -4 -5 +6 -7 -8 -9: so 2 values + final3Multiplier = gap3 + 1; + final3Count = (maxTrail - minTrail + 1) / final3Multiplier; + max3Trail = minTrail + (final3Count - 1) * final3Multiplier; + + // medials can use full range + medialCount = (maxTrail - minTrail + 1); + // find out how many values fit in each form + int32_t threeByteCount = medialCount * final3Count; + // now determine where the 3/4 boundary is. + // we use 3 bytes below the boundary, and 4 above + int32_t primariesAvailable = maxPrimary - minPrimary + 1; + int32_t primaries4count = primariesAvailable - primaries3count; + + + int32_t min3ByteCoverage = primaries3count * threeByteCount; + min4Primary = minPrimary + primaries3count; + min4Boundary = min3ByteCoverage; + // Now expand out the multiplier for the 4 bytes, and redo. + + int32_t totalNeeded = UCOL_MAX_INPUT - min4Boundary; + int32_t neededPerPrimaryByte = divideAndRoundUp(totalNeeded, primaries4count); + //if (DEBUG) System.out.println("neededPerPrimaryByte: " + neededPerPrimaryByte); + int32_t neededPerFinalByte = divideAndRoundUp(neededPerPrimaryByte, medialCount * medialCount); + //if (DEBUG) System.out.println("neededPerFinalByte: " + neededPerFinalByte); + int32_t gap4 = (maxTrail - minTrail - 1) / neededPerFinalByte; + //if (DEBUG) System.out.println("expandedGap: " + gap4); + if (gap4 < 1) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + final4Multiplier = gap4 + 1; + final4Count = neededPerFinalByte; + max4Trail = minTrail + (final4Count - 1) * final4Multiplier; + /* + if (DEBUG) { + System.out.println("final4Count: " + final4Count); + for (int counter = 0; counter <= final4Count; ++counter) { + int value = minTrail + (1 + counter)*final4Multiplier; + System.out.println(counter + "\t" + value + "\t" + Utility.hex(value)); + } + } + */ +} + + /** + * Supply parameters for generating implicit CEs + */ +U_CAPI void U_EXPORT2 +uprv_uca_initImplicitConstants(int32_t minPrimary, int32_t maxPrimary, UErrorCode *status) { + // 13 is the largest 4-byte gap we can use without getting 2 four-byte forms. + initImplicitConstants(minPrimary, maxPrimary, 0x04, 0xFE, 1, 1, status); +} + +U_CDECL_BEGIN +static UBool U_CALLCONV +ucol_cleanup(void) { - IMPLICIT_BASE_BYTE = baseByte; - IMPLICIT_LIMIT_BYTE = IMPLICIT_BASE_BYTE + 4; // leave room for 1 3-byte and 2 4-byte forms - - IMPLICIT_4BYTE_BOUNDARY = IMPLICIT_3BYTE_COUNT * OTHER_COUNT * LAST_COUNT; - LAST_MULTIPLIER = OTHER_COUNT / LAST_COUNT; - LAST2_MULTIPLIER = OTHER_COUNT / LAST_COUNT2; - IMPLICIT_BASE_3BYTE = (IMPLICIT_BASE_BYTE << 24) + 0x030300; - IMPLICIT_BASE_4BYTE = ((IMPLICIT_BASE_BYTE + IMPLICIT_3BYTE_COUNT) << 24) + 0x030303; + if (UCA_DATA_MEM) { + udata_close(UCA_DATA_MEM); + UCA_DATA_MEM = NULL; + } + if (_staticUCA) { + ucol_close(_staticUCA); + _staticUCA = NULL; + } + fcdTrieIndex = NULL; + return TRUE; } - +U_CDECL_END + /* do not close UCA returned by ucol_initUCA! */ UCollator * ucol_initUCA(UErrorCode *status) { @@ -1075,57 +1338,63 @@ ucol_initUCA(UErrorCode *status) { return NULL; } umtx_lock(NULL); - UBool f = (UCA == NULL); + UBool f = (_staticUCA == NULL); umtx_unlock(NULL); - + if(f) { UCollator *newUCA = NULL; UDataMemory *result = udata_openChoice(NULL, UCA_DATA_TYPE, UCA_DATA_NAME, isAcceptableUCA, NULL, status); - + if(U_FAILURE(*status)) { if (result) { udata_close(result); } uprv_free(newUCA); } - + + // init FCD data + if (fcdTrieIndex == NULL) { + fcdTrieIndex = unorm_getFCDTrie(status); + ucln_i18n_registerCleanup(UCLN_I18N_UCOL, ucol_cleanup); + } + if(result != NULL) { /* It looks like sometimes we can fail to find the data file */ - newUCA = ucol_initCollator((const UCATableHeader *)udata_getMemory(result), newUCA, status); + newUCA = ucol_initCollator((const UCATableHeader *)udata_getMemory(result), newUCA, newUCA, status); if(U_SUCCESS(*status)){ newUCA->rb = NULL; - newUCA->elements = NULL; - newUCA->validLocale = NULL; - newUCA->requestedLocale = NULL; - newUCA->hasRealData = FALSE; // real data lives in .dat file... + newUCA->elements = NULL; + newUCA->validLocale = NULL; + newUCA->requestedLocale = NULL; + newUCA->hasRealData = FALSE; // real data lives in .dat file... newUCA->freeImageOnClose = FALSE; umtx_lock(NULL); - if(UCA == NULL) { - UCA = newUCA; + if(_staticUCA == NULL) { + _staticUCA = newUCA; UCA_DATA_MEM = result; result = NULL; newUCA = NULL; } umtx_unlock(NULL); - + if(newUCA != NULL) { udata_close(result); uprv_free(newUCA); } else { - ucln_i18n_registerCleanup(); + ucln_i18n_registerCleanup(UCLN_I18N_UCOL, ucol_cleanup); } // Initalize variables for implicit generation - UCAconsts = (UCAConstants *)((uint8_t *)UCA->image + UCA->image->UCAConsts); - uprv_uca_initImplicitConstants(UCAconsts->UCA_PRIMARY_IMPLICIT_MIN); - UCA->mapping->getFoldingOffset = _getFoldingOffset; + const UCAConstants *UCAconsts = (UCAConstants *)((uint8_t *)_staticUCA->image + _staticUCA->image->UCAConsts); + uprv_uca_initImplicitConstants(UCAconsts->UCA_PRIMARY_IMPLICIT_MIN, UCAconsts->UCA_PRIMARY_IMPLICIT_MAX, status); + _staticUCA->mapping->getFoldingOffset = _getFoldingOffset; }else{ udata_close(result); uprv_free(newUCA); - UCA= NULL; + _staticUCA= NULL; } } } - return UCA; + return _staticUCA; } @@ -1191,7 +1460,7 @@ inline void normalizeIterator(collIterate *collationSource) { UBool wasNormalized = FALSE; //int32_t iterIndex = collationSource->iterator->getIndex(collationSource->iterator, UITER_CURRENT); uint32_t iterIndex = collationSource->iterator->getState(collationSource->iterator); - int32_t normLen = unorm_next(collationSource->iterator, collationSource->writableBuffer, + int32_t normLen = unorm_next(collationSource->iterator, collationSource->writableBuffer, (int32_t)collationSource->writableBufSize, UNORM_FCD, 0, TRUE, &wasNormalized, &status); if(status == U_BUFFER_OVERFLOW_ERROR || normLen == (int32_t)collationSource->writableBufSize) { // reallocate and terminate @@ -1208,11 +1477,11 @@ inline void normalizeIterator(collIterate *collationSource) { status = U_ZERO_ERROR; //collationSource->iterator->move(collationSource->iterator, iterIndex, UITER_ZERO); collationSource->iterator->setState(collationSource->iterator, iterIndex, &status); - normLen = unorm_next(collationSource->iterator, collationSource->writableBuffer, + normLen = unorm_next(collationSource->iterator, collationSource->writableBuffer, (int32_t)collationSource->writableBufSize, UNORM_FCD, 0, TRUE, &wasNormalized, &status); } // Terminate the buffer - we already checked that it is big enough - collationSource->writableBuffer[normLen] = 0; + collationSource->writableBuffer[normLen] = 0; if(collationSource->writableBuffer != collationSource->stackWritableBuffer) { collationSource->flags |= UCOL_ITER_ALLOCATED; } @@ -1462,12 +1731,12 @@ inline uint32_t ucol_IGetNextCE(const UCollator *coll, collIterate *collationSou if(order > UCOL_NOT_FOUND) { /* if a CE is special */ order = ucol_prv_getSpecialCE(coll, ch, order, collationSource, status); /* and try to get the special CE */ } - if(order == UCOL_NOT_FOUND) { /* We couldn't find a good CE in the tailoring */ + if(order == UCOL_NOT_FOUND && coll->UCA) { /* We couldn't find a good CE in the tailoring */ /* if we got here, the codepoint MUST be over 0xFF - so we look directly in the trie */ - order = UTRIE_GET32_FROM_LEAD(UCA->mapping, ch); + order = UTRIE_GET32_FROM_LEAD(coll->UCA->mapping, ch); if(order > UCOL_NOT_FOUND) { /* UCA also gives us a special CE */ - order = ucol_prv_getSpecialCE(UCA, ch, order, collationSource, status); + order = ucol_prv_getSpecialCE(coll->UCA, ch, order, collationSource, status); } } } @@ -1478,7 +1747,7 @@ inline uint32_t ucol_IGetNextCE(const UCollator *coll, collIterate *collationSou U_CAPI uint32_t U_EXPORT2 ucol_getNextCE(const UCollator *coll, collIterate *collationSource, UErrorCode *status) { return ucol_IGetNextCE(coll, collationSource, status); - } +} /** @@ -1627,7 +1896,7 @@ inline UBool collPrevIterFCD(collIterate *data) * Handles both normal and iterative cases. * No error checking - caller beware! */ -inline static +inline static UChar peekCharacter(collIterate *source, int32_t offset) { if(source->pos != NULL) { return *(source->pos + offset); @@ -1662,6 +1931,26 @@ inline UBool isAtStartPrevIterate(collIterate *data) { *(data->pos - 1) == 0 && data->fcdPosition == NULL); } +static +inline void goBackOne(collIterate *data) { +# if 0 + // somehow, it looks like we need to keep iterator synced up + // at all times, as above. + if(data->pos) { + data->pos--; + } + if(data->iterator) { + data->iterator->previous(data->iterator); + } +#endif + if(data->iterator && (data->flags & UCOL_USE_ITERATOR)) { + data->iterator->previous(data->iterator); + } + if(data->pos) { + data->pos --; + } +} + /** * Inline function that gets a simple CE. * So what it does is that it will first check the expansion buffer. If the @@ -1677,7 +1966,7 @@ static inline uint32_t ucol_IGetPrevCE(const UCollator *coll, collIterate *data, UErrorCode *status) { - uint32_t result = UCOL_NULLORDER; + uint32_t result = (uint32_t)UCOL_NULLORDER; if (data->toReturn > data->CEs) { data->toReturn --; result = *(data->toReturn); @@ -1744,19 +2033,19 @@ inline uint32_t ucol_IGetPrevCE(const UCollator *coll, collIterate *data, data->flags &= ~UCOL_WAS_HIRAGANA; } } - + /* - * got a character to determine if there's fcd and/or normalization + * got a character to determine if there's fcd and/or normalization * stuff to do. * if the current character is not fcd. * if current character is at the start of the string * Trailing combining class == 0. * Note if pos is in the writablebuffer, norm is always 0 */ - if (ch < ZERO_CC_LIMIT_ || + if (ch < ZERO_CC_LIMIT_ || // this should propel us out of the loop in the iterator case (data->flags & UCOL_ITER_NORM) == 0 || - (data->fcdPosition != NULL && data->fcdPosition <= data->pos) + (data->fcdPosition != NULL && data->fcdPosition <= data->pos) || data->string == data->pos) { break; } @@ -1797,29 +2086,54 @@ inline uint32_t ucol_IGetPrevCE(const UCollator *coll, collIterate *data, result = ucol_prv_getSpecialPrevCE(coll, ch, UCOL_CONTRACTION, data, status); } else { - if (ch <= 0xFF) { - result = coll->latinOneMapping[ch]; - if (result > UCOL_NOT_FOUND) { - result = ucol_prv_getSpecialPrevCE(coll, ch, result, data, status); - } - } - else { // TODO: fix me for THAI - I reference *(data->pos-1) if ((data->flags & UCOL_ITER_INNORMBUF) == 0 && /*UCOL_ISTHAIBASECONSONANT(ch) &&*/ // This is from the old specs - we now rearrange unconditionally - data->pos > data->string && + // makes sure that we're not at the beggining of the string + //data->pos > data->string && + !collIter_bos(data) && UCOL_ISTHAIPREVOWEL(peekCharacter(data, -1))) //UCOL_ISTHAIPREVOWEL(*(data->pos -1))) { - result = UCOL_THAI; + collIterateState entryState; + backupState(data, &entryState); + // we have to check if the previous character is also Thai + // if not, we can just set the result + goBackOne(data); + if(collIter_bos(data) || !UCOL_ISTHAIPREVOWEL(peekCharacter(data, -1))) { + loadState(data, &entryState, FALSE); + result = UCOL_THAI; + } else { // previous is also reordered + // we need to go back as long as they are being reordered + // count over the range of reorderable characters and see + // if there is an even or odd number of them + // if even, we should not reorder. If odd we should reorder. + int32_t noReordered = 1; // the one we already detected + while(!collIter_bos(data) && UCOL_ISTHAIPREVOWEL(peekCharacter(data, -1))) { + noReordered++; + goBackOne(data); + } + if(noReordered & 1) { // odd number of reorderables + result = UCOL_THAI; + } else { + result = UTRIE_GET32_FROM_LEAD(coll->mapping, ch); + } + loadState(data, &entryState, FALSE); + } } + else if (ch <= 0xFF) { + result = coll->latinOneMapping[ch]; + //if (result > UCOL_NOT_FOUND) { + //result = ucol_prv_getSpecialPrevCE(coll, ch, result, data, status); + //} + } else { /*result = ucmpe32_get(coll->mapping, ch);*/ result = UTRIE_GET32_FROM_LEAD(coll->mapping, ch); } - if (result > UCOL_NOT_FOUND) { - result = ucol_prv_getSpecialPrevCE(coll, ch, result, data, status); - } + if (result > UCOL_NOT_FOUND) { + result = ucol_prv_getSpecialPrevCE(coll, ch, result, data, status); + } if (result == UCOL_NOT_FOUND) { if (!isAtStartPrevIterate(data) && ucol_contractionEndCP(ch, data->coll)) { @@ -1827,16 +2141,17 @@ inline uint32_t ucol_IGetPrevCE(const UCollator *coll, collIterate *data, } else { /*result = ucmpe32_get(UCA->mapping, ch);*/ - result = UTRIE_GET32_FROM_LEAD(UCA->mapping, ch); + if(coll->UCA) { + result = UTRIE_GET32_FROM_LEAD(coll->UCA->mapping, ch); + } } - if (result > UCOL_NOT_FOUND) { - result = ucol_prv_getSpecialPrevCE(UCA, ch, result, data, status); + if (result > UCOL_NOT_FOUND && coll->UCA) { + result = ucol_prv_getSpecialPrevCE(coll->UCA, ch, result, data, status); } } } } - } return result; } @@ -2054,10 +2369,10 @@ inline UChar getNextNormalizedChar(collIterate *data) } else { if (innormbuf) { - // inside the normalization buffer, but at the end - // (since we encountered zero). This means, in the - // case we're using char iterator, that we need to - // do another round of normalization. + // inside the normalization buffer, but at the end + // (since we encountered zero). This means, in the + // case we're using char iterator, that we need to + // do another round of normalization. //if(data->origFlags & UCOL_USE_ITERATOR) { // we need to restore original flags, // otherwise, we'll lose them @@ -2136,25 +2451,6 @@ inline UChar getNextNormalizedChar(collIterate *data) return ch; } -static -inline void goBackOne(collIterate *data) { -# if 0 - // somehow, it looks like we need to keep iterator synced up - // at all times, as above. - if(data->pos) { - data->pos--; - } - if(data->iterator) { - data->iterator->previous(data->iterator); - } -#endif - if(data->iterator && (data->flags & UCOL_USE_ITERATOR)) { - data->iterator->previous(data->iterator); - } - if(data->pos) { - data->pos --; - } -} /** @@ -2334,7 +2630,7 @@ inline uint32_t getImplicit(UChar32 cp, collIterate *collationSource) { if(isNonChar(cp)) { return 0; } - uint32_t r = getImplicitPrimary(cp); + uint32_t r = uprv_uca_getImplicitPrimary(cp); *(collationSource->CEpos++) = ((r & 0x0000FFFF)<<16) | 0x000000C0; return (r & UCOL_PRIMARYMASK) | 0x00000505; // This was 'order' } @@ -2584,7 +2880,7 @@ uint32_t ucol_prv_getSpecialCE(const UCollator *coll, UChar ch, uint32_t CE, col collIterateState state; backupState(source, &state); if (collIter_eos(source) || !(UTF16_IS_TRAIL((trail = getNextNormalizedChar(source))))) { - // we chould have stepped one char forward and it might have turned that it + // we chould have stepped one char forward and it might have turned that it // was not a trail surrogate. In that case, we have to backup. loadState(source, &state, TRUE); return 0; @@ -2595,7 +2891,7 @@ uint32_t ucol_prv_getSpecialCE(const UCollator *coll, UChar ch, uint32_t CE, col // We need to backup loadState(source, &state, TRUE); return CE; - } + } // calculate the supplementary code point value, if surrogate was not tailored cp = ((((uint32_t)ch)<<10UL)+(trail)-(((uint32_t)0xd800<<10UL)+0xdc00-0x10000)); } @@ -2604,9 +2900,7 @@ uint32_t ucol_prv_getSpecialCE(const UCollator *coll, UChar ch, uint32_t CE, col case THAI_TAG: /* Thai/Lao reordering */ if (((source->flags) & UCOL_ITER_INNORMBUF) /* Already Swapped || */ - || (source->iterator && !source->iterator->hasNext(source->iterator)) - || (source->pos && source->endp == source->pos) /* At end of string. No swap possible || */ - /*|| UCOL_ISTHAIBASECONSONANT(*(source->pos)) == 0*/) /* next char not Thai base cons.*/ // This is from the old specs - we now rearrange unconditionally + || collIter_eos(source)) /* At end of string. No swap possible */ { // Treat Thai as a length one expansion */ CEOffset = (uint32_t *)coll->image+getExpansionOffset(CE); /* find the offset to expansion table */ @@ -2614,33 +2908,88 @@ uint32_t ucol_prv_getSpecialCE(const UCollator *coll, UChar ch, uint32_t CE, col } else { - // Move the prevowel and the following base Consonant into the normalization buffer - // with their order swapped - - source->writableBuffer[0] = peekCharacter(source, 0); - source->writableBuffer[1] = peekCharacter(source, -1); - source->writableBuffer[2] = 0; - + // Move the prevowel and the following base Consonant into the normalization buffer + // with their order swapped + // Note: this operation might activate the normalization buffer. We have to check for + // that and act accordingly. + UChar thCh = getNextNormalizedChar(source); + UChar32 cp = 0; + if(U16_IS_LEAD(thCh)) { + if(!collIter_eos(source)) { + collIterateState thaiState; + backupState(source, &thaiState); + UChar trailCh = getNextNormalizedChar(source); + if(U16_IS_TRAIL(trailCh)) { + cp = U16_GET_SUPPLEMENTARY(thCh, trailCh); + } else { + loadState(source, &thaiState, TRUE); + cp = (UChar32)thCh; + } + } else { + cp = (UChar32)thCh; + } + } else { + cp = (UChar32)thCh; + } + // Now we have the character that needs to be decomposed + // if the normalizing buffer was not used, we can just use our structure and be happy. + if((source->flags & UCOL_ITER_INNORMBUF) == 0) { + // decompose into writable buffer + int32_t decompLen = unorm_getDecomposition(cp, FALSE, &(source->writableBuffer[1]), UCOL_WRITABLE_BUFFER_SIZE-1); + if(decompLen < 0) { + decompLen = -decompLen; + } + // reorder Thai and the character after it + if(decompLen >= 2 && U16_IS_LEAD(source->writableBuffer[1]) && U16_IS_TRAIL(source->writableBuffer[2])) { + source->writableBuffer[0] = source->writableBuffer[1]; + source->writableBuffer[1] = source->writableBuffer[2]; + source->writableBuffer[2] = ch; + } else { + source->writableBuffer[0] = source->writableBuffer[1]; + source->writableBuffer[1] = ch; + } + // zero terminate, since normalization buffer is always zero terminated + source->writableBuffer[decompLen+1] = 0; // we added the prevowel if(source->pos) { - source->fcdPosition = source->pos+1; // Indicate where to continue in main input string + source->fcdPosition = source->pos; // Indicate where to continue in main input string // after exhausting the writableBuffer - } else if(source->iterator) { - source->iterator->next(source->iterator); } - source->pos = source->writableBuffer; + source->pos = source->writableBuffer; source->origFlags = source->flags; source->flags |= UCOL_ITER_INNORMBUF; source->flags &= ~(UCOL_ITER_NORM | UCOL_ITER_HASLEN | UCOL_USE_ITERATOR); - - CE = UCOL_IGNORABLE; + } + else { + // stuff is already normalized... what to do here??? + + // if we are in the normalization buffer, thCh must be in it + // prove by contradiction + // if thCh is not in the normalization buffer, + // that means that trailCh is the normalization buffer + // that means that trailCh is a trail surrogate by the above + // bounding if block, this is a contradiction because there + // are no characters at the moment that decomposes to an + // unmatched surrogate. qed. + if (cp >= 0x10000) { + source->writableBuffer[0] = source->writableBuffer[1]; + source->writableBuffer[1] = source->writableBuffer[2]; + source->writableBuffer[2] = ch; + } + else { + source->writableBuffer[0] = source->writableBuffer[1]; + source->writableBuffer[1] = ch; + } + source->pos = source->writableBuffer; + } + CE = UCOL_IGNORABLE; } break; case SPEC_PROC_TAG: { // Special processing is getting a CE that is preceded by a certain prefix // Currently this is only needed for optimizing Japanese length and iteration marks. - // When we encouter a special processing tag, we go backwards and try to see if - // we have a match. + // When we encouter a special processing tag, we go backwards and try to see if + // we have a match. // Contraction tables are used - so the whole process is not unlike contraction. // prefix data is stored backwards in the table. const UChar *UCharOffset; @@ -2653,9 +3002,9 @@ uint32_t ucol_prv_getSpecialCE(const UCollator *coll, UChar ch, uint32_t CE, col for(;;) { // This loop will run once per source string character, for as long as we - // are matching a potential contraction sequence + // are matching a potential contraction sequence - // First we position ourselves at the begining of contraction sequence + // First we position ourselves at the begining of contraction sequence const UChar *ContractionStart = UCharOffset = (UChar *)coll->image+getContractOffset(CE); if (collIter_bos(source)) { CE = *(coll->contractionCEs + (UCharOffset - coll->contractionIndex)); @@ -2676,7 +3025,7 @@ uint32_t ucol_prv_getSpecialCE(const UCollator *coll, UChar ch, uint32_t CE, col } else { - // if there is a completely ignorable code point in the middle of + // if there is a completely ignorable code point in the middle of // a prefix, we need to act as if it's not there // assumption: 'real' noncharacters (*fffe, *ffff, fdd0-fdef are set to zero) // lone surrogates cannot be set to zero as it would break other processing @@ -2759,10 +3108,10 @@ uint32_t ucol_prv_getSpecialCE(const UCollator *coll, UChar ch, uint32_t CE, col // So we'll pick whatever we have at the point... if (CE == UCOL_NOT_FOUND) { // back up the source over all the chars we scanned going into this contraction. - CE = firstCE; + CE = firstCE; loadState(source, &state, TRUE); if(source->origFlags & UCOL_USE_ITERATOR) { - source->flags = source->origFlags; + source->flags = source->origFlags; } } break; @@ -2784,12 +3133,12 @@ uint32_t ucol_prv_getSpecialCE(const UCollator *coll, UChar ch, uint32_t CE, col } else { - // if there is a completely ignorable code point in the middle of + // if there is a completely ignorable code point in the middle of // contraction, we need to act as if it's not there uint32_t isZeroCE = UTRIE_GET32_FROM_LEAD(coll->mapping, schar); // it's easy for BMP code points if(isZeroCE == 0) { - continue; + continue; } else if(UTF_IS_LEAD(schar)) { if(!collIter_eos(source)) { backupState(source, &state); @@ -2807,9 +3156,9 @@ uint32_t ucol_prv_getSpecialCE(const UCollator *coll, UChar ch, uint32_t CE, col continue; } loadState(source, &state, TRUE); - } else { // no more characters, so broken surrogate pair... + } else { // no more characters, so broken surrogate pair... // this contraction will ultimately fail, but not because of us - continue; + continue; } } // else if(UTF_IS_LEAD(schar)) @@ -2817,14 +3166,14 @@ uint32_t ucol_prv_getSpecialCE(const UCollator *coll, UChar ch, uint32_t CE, col // Unless we have a discontiguous contraction, we have finished // with this contraction. uint8_t sCC; - if (schar < 0x300 || + if (schar < 0x300 || maxCC == 0 || (sCC = i_getCombiningClass(schar, coll)) == 0 || - sCC>maxCC || + sCC>maxCC || (allSame != 0 && sCC == maxCC) || collIter_eos(source)) { - // Contraction can not be discontiguous. - goBackOne(source); // back up the source string by one, + // Contraction can not be discontiguous. + goBackOne(source); // back up the source string by one, // because the character we just looked at was // not part of the contraction. */ CE = *(coll->contractionCEs + @@ -2856,12 +3205,9 @@ uint32_t ucol_prv_getSpecialCE(const UCollator *coll, UChar ch, uint32_t CE, col /* scanned through what ultimately proved to not be a contraction. */ loadState(source, &state, TRUE); CE = firstCE; - if(source->origFlags & UCOL_USE_ITERATOR) { - source->flags = source->origFlags; - } break; } - + if(!isContraction(CE)) { // The source string char was in the contraction table, and the corresponding // CE is not a contraction CE. We completed the contraction, break @@ -2870,7 +3216,7 @@ uint32_t ucol_prv_getSpecialCE(const UCollator *coll, UChar ch, uint32_t CE, col // the contraction. break; } - + // The source string char was in the contraction table, and the corresponding // CE is IS a contraction CE. We will continue looping to check the source @@ -2878,7 +3224,7 @@ uint32_t ucol_prv_getSpecialCE(const UCollator *coll, UChar ch, uint32_t CE, col uint32_t tempCE = *(coll->contractionCEs + (ContractionStart - coll->contractionIndex)); if(tempCE != UCOL_NOT_FOUND) { // We have scanned a a section of source string for which there is a - // CE from the contraction table. Remember the CE and scan position, so + // CE from the contraction table. Remember the CE and scan position, so // that we can return to this point if further scanning fails to // match a longer contraction sequence. firstCE = tempCE; @@ -2895,9 +3241,9 @@ uint32_t ucol_prv_getSpecialCE(const UCollator *coll, UChar ch, uint32_t CE, col //loadState(source, &tempState, TRUE); // The problem is that for incomplete contractions we have to remember the previous - // position. Before, the only thing I needed to do was state.pos--; + // position. Before, the only thing I needed to do was state.pos--; // After iterator introduction and especially after introduction of normalizing - // iterators, it became much more difficult to decrease the saved state. + // iterators, it became much more difficult to decrease the saved state. // I'm not yet sure which of the two methods above is faster. } } // for(;;) @@ -2923,209 +3269,237 @@ uint32_t ucol_prv_getSpecialCE(const UCollator *coll, UChar ch, uint32_t CE, col for(i = 1; iCEpos++) = *CEOffset++; } - } else { /* else, we do */ - while(*CEOffset != 0) { - *(source->CEpos++) = *CEOffset++; + } else { /* else, we do */ + while(*CEOffset != 0) { + *(source->CEpos++) = *CEOffset++; + } + } + return CE; + } + case DIGIT_TAG: + { + /* + We do a check to see if we want to collate digits as numbers; if so we generate + a custom collation key. Otherwise we pull out the value stored in the expansion table. + */ + uint32_t size; + uint32_t i; /* general counter */ + collIterateState digitState; + + if (source->coll->numericCollation == UCOL_ON){ + UChar32 char32 = 0; + + uint32_t digIndx = 0; + uint32_t endIndex = 0; + uint32_t trailingZeroIndex = 0; + + uint32_t primWeight = 0; + + int32_t digVal = 0; + uint8_t collateVal = 0; + + UBool nonZeroValReached = FALSE; + + uint8_t *numTempBuf; + uint8_t stackNumTempBuf[UCOL_MAX_BUFFER]; // I just need a temporary place to store my generated CEs. + uint32_t numTempBufSize = UCOL_MAX_BUFFER; + + numTempBuf = stackNumTempBuf; + /* + We parse the source string until we hit a char that's NOT a digit. + Use this u_charDigitValue. This might be slow because we have to + handle surrogates... + */ +/* + if (U16_IS_LEAD(ch)){ + if (!collIter_eos(source)) { + backupState(source, &digitState); + UChar trail = getNextNormalizedChar(source); + if(U16_IS_TRAIL(trail)) { + char32 = U16_GET_SUPPLEMENTARY(ch, trail); + } else { + loadState(source, &digitState, TRUE); + char32 = ch; + } + } else { + char32 = ch; + } + } else { + char32 = ch; + } + digVal = u_charDigitValue(char32); +*/ + digVal = u_charDigitValue(cp); // if we have arrived here, we have + // already processed possible supplementaries that trigered the digit tag - + // all supplementaries are marked in the UCA. + /* + We pad a zero in front of the first element anyways. This takes + care of the (probably) most common case where people are sorting things followed + by a single digit + */ + digIndx++; + for(;;){ + // Make sure we have enough space. + if (digIndx >= ((numTempBufSize - 2) * 2) + 1) + { + numTempBufSize *= 2; + if (numTempBuf == stackNumTempBuf){ + numTempBuf = (uint8_t *)uprv_malloc(sizeof(uint8_t) * numTempBufSize); + uprv_memcpy(numTempBuf, stackNumTempBuf, UCOL_MAX_BUFFER); + }else + uprv_realloc(numTempBuf, numTempBufSize); + } + + // Skipping over leading zeroes. + if (digVal != 0 || nonZeroValReached){ + if (digVal != 0 && !nonZeroValReached) + nonZeroValReached = TRUE; + + /* + We parse the digit string into base 100 numbers (this fits into a byte). + We only add to the buffer in twos, thus if we are parsing an odd character, + that serves as the 'tens' digit while the if we are parsing an even one, that + is the 'ones' digit. We dumped the parsed base 100 value (collateVal) into + a buffer. We multiply each collateVal by 2 (to give us room) and add 5 (to avoid + overlapping magic CE byte values). The last byte we subtract 1 to ensure it is less + than all the other bytes. + */ + + if (digIndx % 2 == 1){ + collateVal += (uint8_t)digVal; + + // We don't enter the low-order-digit case unless we've already seen + // the high order, or for the first digit, which is always non-zero. + if (collateVal != 0) + trailingZeroIndex = 0; + + numTempBuf[(digIndx/2) + 2] = collateVal*2 + 6; + collateVal = 0; + } + else{ + // We drop the collation value into the buffer so if we need to do + // a "front patch" we don't have to check to see if we're hitting the + // last element. + collateVal = (uint8_t)(digVal * 10); + + // Check for trailing zeroes. + if (collateVal == 0) + { + if (!trailingZeroIndex) + trailingZeroIndex = (digIndx/2) + 2; + } + else + trailingZeroIndex = 0; + + numTempBuf[(digIndx/2) + 2] = collateVal*2 + 6; + } + digIndx++; + } + + // Get next character. + if (!collIter_eos(source)){ + ch = getNextNormalizedChar(source); + if (U16_IS_LEAD(ch)){ + if (!collIter_eos(source)) { + backupState(source, &digitState); + UChar trail = getNextNormalizedChar(source); + if(U16_IS_TRAIL(trail)) { + char32 = U16_GET_SUPPLEMENTARY(ch, trail); + } else { + loadState(source, &digitState, TRUE); + char32 = ch; + } + } + } else { + char32 = ch; + } + + if ((digVal = u_charDigitValue(char32)) == -1){ + // Resetting position to point to the next unprocessed char. We + // overshot it when doing our test/set for numbers. + if (char32 > 0xFFFF) { // For surrogates. + loadState(source, &digitState, TRUE); + //goBackOne(source); + } + goBackOne(source); + break; + } + } else { + break; + } + } + + if (nonZeroValReached == FALSE){ + digIndx = 2; + numTempBuf[2] = 6; } + + endIndex = trailingZeroIndex ? trailingZeroIndex : ((digIndx/2) + 2) ; + if (digIndx % 2 != 0){ + /* + We missed a value. Since digIndx isn't even, stuck too many values into the buffer (this is what + we get for padding the first byte with a zero). "Front-patch" now by pushing all nybbles forward. + Doing it this way ensures that at least 50% of the time (statistically speaking) we'll only be doing a + single pass and optimizes for strings with single digits. I'm just assuming that's the more common case. + */ + + for(i = 2; i < endIndex; i++){ + numTempBuf[i] = (((((numTempBuf[i] - 6)/2) % 10) * 10) + + (((numTempBuf[i+1])-6)/2) / 10) * 2 + 6; + } + --digIndx; + } + + // Subtract one off of the last byte. + numTempBuf[endIndex-1] -= 1; + + /* + We want to skip over the first two slots in the buffer. The first slot + is reserved for the header byte UCOL_CODAN_PLACEHOLDER. The second slot is for the + sign/exponent byte: 0x80 + (decimalPos/2) & 7f. + */ + numTempBuf[0] = UCOL_CODAN_PLACEHOLDER; + numTempBuf[1] = (uint8_t)(0x80 + ((digIndx/2) & 0x7F)); + + // Now transfer the collation key to our collIterate struct. + // The total size for our collation key is endIndx bumped up to the next largest even value divided by two. + size = ((endIndex+1) & ~1)/2; + CE = (((numTempBuf[0] << 8) | numTempBuf[1]) << UCOL_PRIMARYORDERSHIFT) | //Primary weight + (UCOL_BYTE_COMMON << UCOL_SECONDARYORDERSHIFT) | // Secondary weight + UCOL_BYTE_COMMON; // Tertiary weight. + i = 2; // Reset the index into the buffer. + while(i < endIndex) + { + primWeight = numTempBuf[i++] << 8; + if ( i < endIndex) + primWeight |= numTempBuf[i++]; + *(source->CEpos++) = (primWeight << UCOL_PRIMARYORDERSHIFT) | UCOL_CONTINUATION_MARKER; + } + + if (numTempBuf != stackNumTempBuf) + uprv_free(numTempBuf); + } else { + // no numeric mode, we'll just switch to whatever we stashed and continue + CEOffset = (uint32_t *)coll->image+getExpansionOffset(CE); /* find the offset to expansion table */ + CE = *CEOffset++; + break; +#if 0 + CEOffset = (uint32_t *)coll->image+getExpansionOffset(CE); /* find the offset to expansion table */ + size = getExpansionCount(CE); + CE = *CEOffset++; + if(size != 0) { /* if there are less than 16 elements in expansion, we don't terminate */ + for(i = 1; iCEpos++) = *CEOffset++; + } + } else { /* else, we do */ + while(*CEOffset != 0) { + *(source->CEpos++) = *CEOffset++; + } + } +#endif } return CE; } - case DIGIT_TAG: - { - /* - We do a check to see if we want to collate digits as numbers; if so we generate - a custom collation key. Otherwise we pull out the value stored in the expansion table. - */ - uint32_t size; - uint32_t i; /* general counter */ - - if (coll->numericCollation == UCOL_ON){ - UChar32 char32 = 0; - - uint32_t digIndx = 0; - uint32_t endIndex = 0; - uint32_t trailingZeroIndex = 0; - - uint32_t primWeight = 0; - - uint32_t digVal = 0; - uint8_t collateVal = 0; - - UBool nonZeroValReached = false; - - uint8_t *numTempBuf; - uint8_t stackNumTempBuf[UCOL_MAX_BUFFER]; // I just need a temporary place to store my generated CEs. - uint32_t numTempBufSize = UCOL_MAX_BUFFER; - - numTempBuf = stackNumTempBuf; - /* - We parse the source string until we hit a char that's NOT a digit. - Use this u_charDigitValue. This might be slow because we have to - handle surrogates... - */ - - if (U16_IS_LEAD(ch)){ - if (!collIter_eos(source)) - char32 = U16_GET_SUPPLEMENTARY(ch, getNextNormalizedChar(source)); - else - char32 = ch; - } - else - char32 = ch; - digVal = u_charDigitValue(char32); - - /* - We pad a zero in front of the first element anyways. This takes - care of the (probably) most common case where people are sorting things followed - by a single digit - */ - digIndx++; - for(;;){ - // Make sure we have enough space. - if (digIndx >= ((numTempBufSize - 2) * 2) + 1) - { - numTempBufSize *= 2; - if (numTempBuf == stackNumTempBuf){ - numTempBuf = (uint8_t *)malloc(sizeof(uint8_t) * numTempBufSize); - memcpy(numTempBuf, stackNumTempBuf, UCOL_MAX_BUFFER); - }else - realloc(numTempBuf, numTempBufSize); - } - - // Skipping over leading zeroes. - if (digVal != 0 || nonZeroValReached){ - if (digVal != 0 && !nonZeroValReached) - nonZeroValReached = true; - - /* - We parse the digit string into base 100 numbers (this fits into a byte). - We only add to the buffer in twos, thus if we are parsing an odd character, - that serves as the 'tens' digit while the if we are parsing an even one, that - is the 'ones' digit. We dumped the parsed base 100 value (collateVal) into - a buffer. We multiply each collateVal by 2 (to give us room) and add 5 (to avoid - overlapping magic CE byte values). The last byte we subtract 1 to ensure it is less - than all the other bytes. - */ - - if (digIndx % 2 == 1){ - collateVal += (uint8_t)digVal; - - // We don't enter the low-order-digit case unless we've already seen - // the high order, or for the first digit, which is always non-zero. - if (collateVal != 0) - trailingZeroIndex = 0; - - numTempBuf[(digIndx/2) + 2] = collateVal*2 + 6; - collateVal = 0; - } - else{ - // We drop the collation value into the buffer so if we need to do - // a "front patch" we don't have to check to see if we're hitting the - // last element. - collateVal = (uint8_t)(digVal * 10); - - // Check for trailing zeroes. - if (collateVal == 0) - { - if (!trailingZeroIndex) - trailingZeroIndex = (digIndx/2) + 2; - } - else - trailingZeroIndex = 0; - - numTempBuf[(digIndx/2) + 2] = collateVal*2 + 6; - } - digIndx++; - } - - // Get next character. - if (!collIter_eos(source)){ - ch = getNextNormalizedChar(source); - if (U16_IS_LEAD(ch)){ - if (!collIter_eos(source)) - char32 = U16_GET_SUPPLEMENTARY(ch, getNextNormalizedChar(source)); - } - else - char32 = ch; - - if ((digVal = u_charDigitValue(char32)) == -1){ - // Resetting position to point to the next unprocessed char. We - // overshot it when doing our test/set for numbers. - goBackOne(source); - if (char32 > 0xFFFF) // For surrogates. - goBackOne(source); - break; - } - }else - break; - } - - if (nonZeroValReached == false){ - digIndx = 2; - numTempBuf[2] = 6; - } - - endIndex = trailingZeroIndex ? trailingZeroIndex : ((digIndx/2) + 2) ; - if (digIndx % 2 != 0){ - /* - We missed a value. Since digIndx isn't even, stuck too many values into the buffer (this is what - we get for padding the first byte with a zero). "Front-patch" now by pushing all nybbles forward. - Doing it this way ensures that at least 50% of the time (statistically speaking) we'll only be doing a - single pass and optimizes for strings with single digits. I'm just assuming that's the more common case. - */ - - for(i = 2; i < endIndex; i++){ - numTempBuf[i] = (((((numTempBuf[i] - 6)/2) % 10) * 10) + - (((numTempBuf[i+1])-6)/2) / 10) * 2 + 6; - } - --digIndx; - } - - // Subtract one off of the last byte. - numTempBuf[endIndex-1] -= 1; - - /* - We want to skip over the first two slots in the buffer. The first slot - is reserved for the header byte 0x1B. The second slot is for the - sign/exponent byte: 0x80 + (decimalPos/2) & 7f. - */ - numTempBuf[0] = 0x1B; - numTempBuf[1] = (uint8_t)(0x80 + ((digIndx/2) & 0x7F)); - - // Now transfer the collation key to our collIterate struct. - // The total size for our collation key is endIndx bumped up to the next largest even value divided by two. - size = ((endIndex+1) & ~1)/2; - CE = (((numTempBuf[0] << 8) | numTempBuf[1]) << UCOL_PRIMARYORDERSHIFT) | //Primary weight - (UCOL_BYTE_COMMON << UCOL_SECONDARYORDERSHIFT) | // Secondary weight - UCOL_BYTE_COMMON; // Tertiary weight. - i = 2; // Reset the index into the buffer. - while(i < endIndex) - { - primWeight = numTempBuf[i++] << 8; - if ( i < endIndex) - primWeight |= numTempBuf[i++]; - *(source->CEpos++) = (primWeight << UCOL_PRIMARYORDERSHIFT) | UCOL_CONTINUATION_MARKER; - } - - if (numTempBuf != stackNumTempBuf) - free(numTempBuf); - } - else{ - CEOffset = (uint32_t *)coll->image+getExpansionOffset(CE); /* find the offset to expansion table */ - size = getExpansionCount(CE); - CE = *CEOffset++; - if(size != 0) { /* if there are less than 16 elements in expansion, we don't terminate */ - for(i = 1; iCEpos++) = *CEOffset++; - } - } else { /* else, we do */ - while(*CEOffset != 0) { - *(source->CEpos++) = *CEOffset++; - } - } - } - return CE; - } /* various implicits optimization */ // TODO: remove CJK_IMPLICIT_TAG completely - handled by the getImplicit case CJK_IMPLICIT_TAG: /* 0x3400-0x4DB5, 0x4E00-0x9FA5, 0xF900-0xFA2D*/ @@ -3160,7 +3534,7 @@ uint32_t ucol_prv_getSpecialCE(const UCollator *coll, UChar ch, uint32_t CE, col const uint32_t SBase = 0xAC00, LBase = 0x1100, VBase = 0x1161, TBase = 0x11A7; //const uint32_t LCount = 19; - const uint32_t VCount = 21; + const uint32_t VCount = 21; const uint32_t TCount = 28; //const uint32_t NCount = VCount * TCount; // 588 //const uint32_t SCount = LCount * NCount; // 11172 @@ -3196,12 +3570,12 @@ uint32_t ucol_prv_getSpecialCE(const UCollator *coll, UChar ch, uint32_t CE, col return UTRIE_GET32_FROM_LEAD(coll->mapping, L); } else { // Jamo is Special - // Since Hanguls pass the FCD check, it is + // Since Hanguls pass the FCD check, it is // guaranteed that we won't be in // the normalization buffer if something like this happens // However, if we are using a uchar iterator and normalization // is ON, the Hangul that lead us here is going to be in that - // normalization buffer. Here we want to restore the uchar + // normalization buffer. Here we want to restore the uchar // iterator state and pull out of the normalization buffer if(source->iterator != NULL && source->flags & UCOL_ITER_INNORMBUF) { source->flags = source->origFlags; // restore the iterator @@ -3249,7 +3623,7 @@ inline uint32_t getPrevImplicit(UChar32 cp, collIterate *collationSource) { return 0; } - uint32_t r = getImplicitPrimary(cp); + uint32_t r = uprv_uca_getImplicitPrimary(cp); *(collationSource->CEpos++) = (r & UCOL_PRIMARYMASK) | 0x00000505; collationSource->toReturn = collationSource->CEpos; @@ -3306,12 +3680,40 @@ uint32_t ucol_prv_getSpecialPrevCE(const UCollator *coll, UChar ch, uint32_t CE, Move the prevowel and the following base Consonant into the normalization buffer with their order swapped */ + UChar32 cp = (UChar32)peekCharacter(source, 0); + UBool reorder = TRUE; + + int32_t decompLen = unorm_getDecomposition(cp, FALSE, source->writableBuffer, UCOL_WRITABLE_BUFFER_SIZE-1); + if(decompLen < 0) { + decompLen = -decompLen; // there was no decomposition + } else { // we need to check if we will hit a contraction trigger because of decomposition + int32_t i = decompLen; + for(i = 0; i < decompLen; i++) { + if(ucol_contractionEndCP(source->writableBuffer[i], coll)) { + reorder = FALSE; + } + } + } + + UChar *tempbuffer = source->writableBuffer + + (source->writableBufSize - 1); + uprv_memcpy(tempbuffer-decompLen + 1, source->writableBuffer, sizeof(UChar)*decompLen); + if(reorder) { + *(tempbuffer - decompLen) = *(tempbuffer - decompLen + 1); + *(tempbuffer - decompLen + 1) = peekCharacter(source, -1); + } else { + *(tempbuffer - decompLen) = peekCharacter(source, -1); + } + *(tempbuffer - decompLen - 1) = 0; + + +/* UChar *tempbuffer = source->writableBuffer + (source->writableBufSize - 1); *(tempbuffer - 2) = 0; *(tempbuffer - 1) = peekCharacter(source, 0); *(tempbuffer) = peekCharacter(source, -1); - +*/ /* Indicate where to continue in main input string after exhausting the writableBuffer @@ -3322,7 +3724,7 @@ uint32_t ucol_prv_getSpecialPrevCE(const UCollator *coll, UChar ch, uint32_t CE, source->fcdPosition = source->pos-2; } - source->pos = tempbuffer; + source->pos = tempbuffer+1; // we're doing predecrement, right? source->origFlags = source->flags; source->flags |= UCOL_ITER_INNORMBUF; source->flags &= ~(UCOL_ITER_NORM | UCOL_ITER_HASLEN); @@ -3335,8 +3737,8 @@ uint32_t ucol_prv_getSpecialPrevCE(const UCollator *coll, UChar ch, uint32_t CE, { // Special processing is getting a CE that is preceded by a certain prefix // Currently this is only needed for optimizing Japanese length and iteration marks. - // When we encouter a special processing tag, we go backwards and try to see if - // we have a match. + // When we encouter a special processing tag, we go backwards and try to see if + // we have a match. // Contraction tables are used - so the whole process is not unlike contraction. // prefix data is stored backwards in the table. const UChar *UCharOffset; @@ -3345,9 +3747,9 @@ uint32_t ucol_prv_getSpecialPrevCE(const UCollator *coll, UChar ch, uint32_t CE, backupState(source, &prefixState); for(;;) { // This loop will run once per source string character, for as long as we - // are matching a potential contraction sequence + // are matching a potential contraction sequence - // First we position ourselves at the begining of contraction sequence + // First we position ourselves at the begining of contraction sequence const UChar *ContractionStart = UCharOffset = (UChar *)coll->image+getContractOffset(CE); if (collIter_bos(source)) { @@ -3368,8 +3770,8 @@ uint32_t ucol_prv_getSpecialPrevCE(const UCollator *coll, UChar ch, uint32_t CE, (UCharOffset - coll->contractionIndex)); } else - { - // if there is a completely ignorable code point in the middle of + { + // if there is a completely ignorable code point in the middle of // a prefix, we need to act as if it's not there // assumption: 'real' noncharacters (*fffe, *ffff, fdd0-fdef are set to zero) // lone surrogates cannot be set to zero as it would break other processing @@ -3445,7 +3847,9 @@ uint32_t ucol_prv_getSpecialPrevCE(const UCollator *coll, UChar ch, uint32_t CE, *(UCharOffset --) = 0; noChars = 0; // have to swap thai characters - while (ucol_unsafeCP(schar, coll) || UCOL_ISTHAIBASECONSONANT(schar)) { + while (ucol_unsafeCP(schar, coll) || UCOL_ISTHAIPREVOWEL(peekCharacter(source, -1))) { + // we might have ended here after trying to reorder Thai, but seeing that there are unsafe points + // in the backward processing *(UCharOffset) = schar; noChars++; UCharOffset --; @@ -3467,11 +3871,11 @@ uint32_t ucol_prv_getSpecialPrevCE(const UCollator *coll, UChar ch, uint32_t CE, } strbuffer = (UChar *)uprv_malloc(sizeof(UChar) * (newsize + UCOL_MAX_BUFFER)); - /* test for NULL */ - if (strbuffer == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - return UCOL_NO_MORE_CES; - } + /* test for NULL */ + if (strbuffer == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return UCOL_NO_MORE_CES; + } UCharOffset = strbuffer + newsize; uprv_memcpy(UCharOffset, buffer, UCOL_MAX_BUFFER * sizeof(UChar)); @@ -3488,7 +3892,7 @@ uint32_t ucol_prv_getSpecialPrevCE(const UCollator *coll, UChar ch, uint32_t CE, *(UCharOffset) = schar; noChars++; - /* a new collIterate is used to simply things, since using the current + /* a new collIterate is used to simplify things, since using the current collIterate will mean that the forward and backwards iteration will share and change the same buffers. we don't want to get into that. */ collIterate temp; @@ -3510,7 +3914,7 @@ uint32_t ucol_prv_getSpecialPrevCE(const UCollator *coll, UChar ch, uint32_t CE, if (strbuffer != buffer) { uprv_free(strbuffer); } - return UCOL_NULLORDER; + return (uint32_t)UCOL_NULLORDER; } CE = ucol_IGetNextCE(coll, &temp, status); } @@ -3555,230 +3959,258 @@ uint32_t ucol_prv_getSpecialPrevCE(const UCollator *coll, UChar ch, uint32_t CE, } } source->toReturn = source->CEpos - 1; - // in case of one element expansion, we + // in case of one element expansion, we // want to immediately return CEpos if(source->toReturn == source->CEs) { source->CEpos = source->CEs; } return *(source->toReturn); - case DIGIT_TAG: + case DIGIT_TAG: { - /* - We do a check to see if we want to collate digits as numbers; if so we generate + /* + We do a check to see if we want to collate digits as numbers; if so we generate a custom collation key. Otherwise we pull out the value stored in the expansion table. */ - uint32_t size; + //uint32_t size; uint32_t i; /* general counter */ - - if (coll->numericCollation == UCOL_ON){ - UChar32 char32 = 0; - - uint32_t digIndx = 0; - uint32_t endIndex = 0; - uint32_t leadingZeroIndex = 0; - uint32_t trailingZeroCount = 0; - - uint32_t primWeight = 0; - - uint32_t digVal = 0; - uint8_t collateVal = 0; - - UBool nonZeroValReached = false; - - uint8_t *numTempBuf; - uint8_t stackNumTempBuf[UCOL_MAX_BUFFER]; // I just need a temporary place to store my generated CEs. - uint32_t numTempBufSize = UCOL_MAX_BUFFER; - - numTempBuf = stackNumTempBuf; - /* - We parse the source string until we hit a char that's NOT a digit. - Use this u_charDigitValue. This might be slow because we have to - handle surrogates... - */ - - if (U16_IS_TRAIL (ch)){ - if (!collIter_bos(source)){ - char32 = U16_GET_SUPPLEMENTARY(getPrevNormalizedChar(source),ch); - goBackOne(source); - } - else - char32 = ch; - } - else - char32 = ch; - digVal = u_charDigitValue(char32); - - for(;;){ - // Make sure we have enough space. - if (digIndx >= ((numTempBufSize - 2) * 2) + 1) - { - numTempBufSize *= 2; - if (numTempBuf == stackNumTempBuf){ - numTempBuf = (uint8_t *)malloc(sizeof(uint8_t) * numTempBufSize); - memcpy(numTempBuf, stackNumTempBuf, UCOL_MAX_BUFFER); - }else - realloc(numTempBuf, numTempBufSize); - } - - // Skip over trailing zeroes, and keep a count of them. - if (digVal != 0) - nonZeroValReached = true; - if (nonZeroValReached){ - /* - We parse the digit string into base 100 numbers (this fits into a byte). - We only add to the buffer in twos, thus if we are parsing an odd character, - that serves as the 'tens' digit while the if we are parsing an even one, that - is the 'ones' digit. We dumped the parsed base 100 value (collateVal) into - a buffer. We multiply each collateVal by 2 (to give us room) and add 5 (to avoid - overlapping magic CE byte values). The last byte we subtract 1 to ensure it is less - than all the other bytes. - - Since we're doing in this reverse we want to put the first digit encountered into the - ones place and the second digit encountered into the tens place. - */ - - if ((digIndx + trailingZeroCount) % 2 == 1){ - // High-order digit case (tens place) - collateVal += digVal * 10; - - // We cannot set leadingZeroIndex unless it has been set for the - // low-order digit. Therefore, all we can do for the high-order - // digit is turn it off, never on. - // The only time we will have a high digit without a low is for - // the very first non-zero digit, so no zero check is necessary. - if (collateVal != 0) - leadingZeroIndex = 0; - - numTempBuf[(digIndx/2) + 2] = collateVal*2 + 6; - collateVal = 0; - } - else{ - // Low-order digit case (ones place) - collateVal = digVal; - - // Check for leading zeroes. - if (collateVal == 0) - { - if (!leadingZeroIndex) - leadingZeroIndex = (digIndx/2) + 2; - } - else - leadingZeroIndex = 0; - - // No need to write to buffer; the case of a last odd digit - // is handled below. - } - ++digIndx; - } - else - ++trailingZeroCount; - - if (!collIter_bos(source)){ - ch = getPrevNormalizedChar(source); - goBackOne(source); - if (U16_IS_TRAIL(ch)){ - if (!collIter_bos(source)) - { - char32 = U16_GET_SUPPLEMENTARY(getPrevNormalizedChar(source),ch); - goBackOne(source); - } - } - else - char32 = ch; - - if ((digVal = u_charDigitValue(char32)) == -1){ - // Don't need to "reverse" the goBackOne call, - // as this points to the next position to process.. - if (char32 > 0xFFFF) // For surrogates. - getNextNormalizedChar(source); - break; - } - }else - break; - } - - if (nonZeroValReached == false){ - digIndx = 2; - trailingZeroCount = 0; - numTempBuf[2] = 6; - } - - if ((digIndx + trailingZeroCount) % 2 != 0){ - numTempBuf[((digIndx)/2) + 2] = collateVal*2 + 6; - digIndx += 1; - } - - endIndex = leadingZeroIndex ? leadingZeroIndex : ((digIndx/2) + 2) ; - - // Subtract one off of the last byte. Really the first byte here, but it's reversed... - numTempBuf[2] -= 1; - - /* - We want to skip over the first two slots in the buffer. The first slot - is reserved for the header byte 0x1B. The second slot is for the - sign/exponent byte: 0x80 + (decimalPos/2) & 7f. - The exponent must be adjusted by the number of leading zeroes, and the number of - trailing zeroes. - */ - numTempBuf[0] = 0x1B; - uint32_t exponent = (digIndx+trailingZeroCount)/2; - if (leadingZeroIndex) - exponent -= ((digIndx/2) + 2 - leadingZeroIndex); - numTempBuf[1] = 0x80 + (exponent & 0x7F); - - // Now transfer the collation key to our collIterate struct. - // The total size for our collation key is endIndx bumped up to the next largest even value divided by two. - //size = ((endIndex+1) & ~1)/2; - *(source->CEpos++) = (((numTempBuf[0] << 8) | numTempBuf[1]) << UCOL_PRIMARYORDERSHIFT) | //Primary weight - (UCOL_BYTE_COMMON << UCOL_SECONDARYORDERSHIFT) | // Secondary weight - UCOL_BYTE_COMMON; // Tertiary weight. - i = endIndex - 1; // Reset the index into the buffer. - while(i >= 2) - { - primWeight = numTempBuf[i--] << 8; - if ( i >= 2) - primWeight |= numTempBuf[i--]; - *(source->CEpos++) = (primWeight << UCOL_PRIMARYORDERSHIFT) | UCOL_CONTINUATION_MARKER; - } - if (numTempBuf != stackNumTempBuf) - free(numTempBuf); - - source->toReturn = source->CEpos -1; - return *(source->toReturn); + collIterateState state; + + if (source->coll->numericCollation == UCOL_ON){ + UChar32 char32 = 0; + + uint32_t digIndx = 0; + uint32_t endIndex = 0; + uint32_t leadingZeroIndex = 0; + uint32_t trailingZeroCount = 0; + + uint32_t primWeight = 0; + + int32_t digVal = 0; + uint8_t collateVal = 0; + + UBool nonZeroValReached = FALSE; + + uint8_t *numTempBuf; + uint8_t stackNumTempBuf[UCOL_MAX_BUFFER]; // I just need a temporary place to store my generated CEs. + uint32_t numTempBufSize = UCOL_MAX_BUFFER; + + numTempBuf = stackNumTempBuf; + /* + We parse the source string until we hit a char that's NOT a digit. + Use this u_charDigitValue. This might be slow because we have to + handle surrogates... + */ + + if (U16_IS_TRAIL (ch)){ + if (!collIter_bos(source)){ + UChar lead = getPrevNormalizedChar(source); + if(U16_IS_LEAD(lead)) { + char32 = U16_GET_SUPPLEMENTARY(lead,ch); + goBackOne(source); + } else { + char32 = ch; + } + } else { + char32 = ch; + } + } else { + char32 = ch; + } + digVal = u_charDigitValue(char32); + + for(;;){ + // Make sure we have enough space. + if (digIndx >= ((numTempBufSize - 2) * 2) + 1) + { + numTempBufSize *= 2; + if (numTempBuf == stackNumTempBuf){ + numTempBuf = (uint8_t *)uprv_malloc(sizeof(uint8_t) * numTempBufSize); + uprv_memcpy(numTempBuf, stackNumTempBuf, UCOL_MAX_BUFFER); + }else + uprv_realloc(numTempBuf, numTempBufSize); + } + + // Skip over trailing zeroes, and keep a count of them. + if (digVal != 0) + nonZeroValReached = TRUE; + if (nonZeroValReached){ + /* + We parse the digit string into base 100 numbers (this fits into a byte). + We only add to the buffer in twos, thus if we are parsing an odd character, + that serves as the 'tens' digit while the if we are parsing an even one, that + is the 'ones' digit. We dumped the parsed base 100 value (collateVal) into + a buffer. We multiply each collateVal by 2 (to give us room) and add 5 (to avoid + overlapping magic CE byte values). The last byte we subtract 1 to ensure it is less + than all the other bytes. + + Since we're doing in this reverse we want to put the first digit encountered into the + ones place and the second digit encountered into the tens place. + */ + + if ((digIndx + trailingZeroCount) % 2 == 1){ + // High-order digit case (tens place) + collateVal += (uint8_t)(digVal * 10); + + // We cannot set leadingZeroIndex unless it has been set for the + // low-order digit. Therefore, all we can do for the high-order + // digit is turn it off, never on. + // The only time we will have a high digit without a low is for + // the very first non-zero digit, so no zero check is necessary. + if (collateVal != 0) + leadingZeroIndex = 0; + + numTempBuf[(digIndx/2) + 2] = collateVal*2 + 6; + collateVal = 0; + } + else{ + // Low-order digit case (ones place) + collateVal = (uint8_t)digVal; + + // Check for leading zeroes. + if (collateVal == 0) + { + if (!leadingZeroIndex) + leadingZeroIndex = (digIndx/2) + 2; + } + else + leadingZeroIndex = 0; + + // No need to write to buffer; the case of a last odd digit + // is handled below. + } + ++digIndx; + } + else + ++trailingZeroCount; + + if (!collIter_bos(source)){ + ch = getPrevNormalizedChar(source); + //goBackOne(source); + if (U16_IS_TRAIL(ch)){ + backupState(source, &state); + if (!collIter_bos(source)) + { + goBackOne(source); + UChar lead = getPrevNormalizedChar(source); + if(U16_IS_LEAD(lead)) { + char32 = U16_GET_SUPPLEMENTARY(lead,ch); + } else { + loadState(source, &state, FALSE); + char32 = ch; + } + } + } + else + char32 = ch; + + if ((digVal = u_charDigitValue(char32)) == -1){ + if (char32 > 0xFFFF) {// For surrogates. + loadState(source, &state, FALSE); + } + // Don't need to "reverse" the goBackOne call, + // as this points to the next position to process.. + //if (char32 > 0xFFFF) // For surrogates. + //getNextNormalizedChar(source); + break; + } + goBackOne(source); + }else + break; + } + + if (nonZeroValReached == FALSE){ + digIndx = 2; + trailingZeroCount = 0; + numTempBuf[2] = 6; + } + + if ((digIndx + trailingZeroCount) % 2 != 0){ + numTempBuf[((digIndx)/2) + 2] = collateVal*2 + 6; + digIndx += 1; // The implicit leading zero + } + if (trailingZeroCount % 2 != 0){ + // We had to consume one trailing zero for the low digit + // of the least significant byte + digIndx += 1; // The trailing zero not in the exponent + trailingZeroCount -= 1; + } + + endIndex = leadingZeroIndex ? leadingZeroIndex : ((digIndx/2) + 2) ; + + // Subtract one off of the last byte. Really the first byte here, but it's reversed... + numTempBuf[2] -= 1; + + /* + We want to skip over the first two slots in the buffer. The first slot + is reserved for the header byte UCOL_CODAN_PLACEHOLDER. The second slot is for the + sign/exponent byte: 0x80 + (decimalPos/2) & 7f. + The exponent must be adjusted by the number of leading zeroes, and the number of + trailing zeroes. + */ + numTempBuf[0] = UCOL_CODAN_PLACEHOLDER; + uint32_t exponent = (digIndx+trailingZeroCount)/2; + if (leadingZeroIndex) + exponent -= ((digIndx/2) + 2 - leadingZeroIndex); + numTempBuf[1] = (uint8_t)(0x80 + (exponent & 0x7F)); + + // Now transfer the collation key to our collIterate struct. + // The total size for our collation key is endIndx bumped up to the next largest even value divided by two. + //size = ((endIndex+1) & ~1)/2; + *(source->CEpos++) = (((numTempBuf[0] << 8) | numTempBuf[1]) << UCOL_PRIMARYORDERSHIFT) | //Primary weight + (UCOL_BYTE_COMMON << UCOL_SECONDARYORDERSHIFT) | // Secondary weight + UCOL_BYTE_COMMON; // Tertiary weight. + i = endIndex - 1; // Reset the index into the buffer. + while(i >= 2) + { + primWeight = numTempBuf[i--] << 8; + if ( i >= 2) + primWeight |= numTempBuf[i--]; + *(source->CEpos++) = (primWeight << UCOL_PRIMARYORDERSHIFT) | UCOL_CONTINUATION_MARKER; + } + if (numTempBuf != stackNumTempBuf) + uprv_free(numTempBuf); + + source->toReturn = source->CEpos -1; + return *(source->toReturn); } - else{ - /* find the offset to expansion table */ - CEOffset = (uint32_t *)coll->image + getExpansionOffset(CE); - size = getExpansionCount(CE); - if (size != 0) { - /* - if there are less than 16 elements in expansion, we don't terminate - */ - uint32_t count; - for (count = 0; count < size; count++) { - *(source->CEpos ++) = *CEOffset++; - } - } - else { - /* else, we do */ - while (*CEOffset != 0) { - *(source->CEpos ++) = *CEOffset ++; - } - } - source->toReturn = source->CEpos - 1; - // in case of one element expansion, we + else { + CEOffset = (uint32_t *)coll->image + getExpansionOffset(CE); + CE = *(CEOffset++); + break; +#if 0 + /* find the offset to expansion table */ + CEOffset = (uint32_t *)coll->image + getExpansionOffset(CE); + size = getExpansionCount(CE); + if (size != 0) { + /* + if there are less than 16 elements in expansion, we don't terminate + */ + uint32_t count; + for (count = 0; count < size; count++) { + *(source->CEpos ++) = *CEOffset++; + } + } + else { + /* else, we do */ + while (*CEOffset != 0) { + *(source->CEpos ++) = *CEOffset ++; + } + } + source->toReturn = source->CEpos - 1; + // in case of one element expansion, we // want to immediately return CEpos if(source->toReturn == source->CEs) { source->CEpos = source->CEs; } - return *(source->toReturn); - } - } + return *(source->toReturn); +#endif + } + } case HANGUL_SYLLABLE_TAG: /* AC00-D7AF*/ { const uint32_t SBase = 0xAC00, LBase = 0x1100, VBase = 0x1161, TBase = 0x11A7; - //const uint32_t LCount = 19; + //const uint32_t LCount = 19; const uint32_t VCount = 21; const uint32_t TCount = 28; //const uint32_t NCount = VCount * TCount; /* 588 */ @@ -3819,13 +4251,13 @@ uint32_t ucol_prv_getSpecialPrevCE(const UCollator *coll, UChar ch, uint32_t CE, source->toReturn = source->CEpos - 1; return *(source->toReturn); } else { - // Since Hanguls pass the FCD check, it is + // Since Hanguls pass the FCD check, it is // guaranteed that we won't be in // the normalization buffer if something like this happens // Move Jamos into normalization buffer /* Move the Jamos into the - normalization buffer + normalization buffer */ UChar *tempbuffer = source->writableBuffer + (source->writableBufSize - 1); @@ -4076,21 +4508,33 @@ ucol_getSortKey(const UCollator *coll, uint8_t *result, int32_t resultLength) { + UTRACE_ENTRY(UTRACE_UCOL_GET_SORTKEY); + if (UTRACE_LEVEL(UTRACE_VERBOSE)) { + int32_t actualSrcLen = sourceLength; + if (actualSrcLen==-1 && source!=NULL) { + actualSrcLen = u_strlen(source); + } + UTRACE_DATA3(UTRACE_VERBOSE, "coll=%p, source string = %vh ", coll, source, actualSrcLen); + } + UErrorCode status = U_ZERO_ERROR; + int32_t keySize = 0; - if(source == NULL) { - // this is actually an error situation, but we would need to - // have an error code to return it. Until we introduce a new - // API, it stays like this - return 0; - } - /* this uses the function pointer that is set in updateinternalstate */ - /* currently, there are two funcs: */ - /*ucol_calcSortKey(...);*/ - /*ucol_calcSortKeySimpleTertiary(...);*/ + if(source != NULL) { + // source == NULL is actually an error situation, but we would need to + // have an error code to return it. Until we introduce a new + // API, it stays like this - int32_t keySize = coll->sortKeyGen(coll, source, sourceLength, &result, resultLength, FALSE, &status); - //((UCollator *)coll)->errorCode = status; /*semantically const */ + /* this uses the function pointer that is set in updateinternalstate */ + /* currently, there are two funcs: */ + /*ucol_calcSortKey(...);*/ + /*ucol_calcSortKeySimpleTertiary(...);*/ + + keySize = coll->sortKeyGen(coll, source, sourceLength, &result, resultLength, FALSE, &status); + //((UCollator *)coll)->errorCode = status; /*semantically const */ + } + UTRACE_DATA2(UTRACE_VERBOSE, "Sort Key = %vb", result, keySize); + UTRACE_EXIT_STATUS(status); return keySize; } @@ -4110,6 +4554,7 @@ ucol_getSortKeyWithAllocation(const UCollator *coll, /* or if we run out of space while making a sortkey and want to return ASAP */ int32_t ucol_getSortKeySize(const UCollator *coll, collIterate *s, int32_t currentSize, UColAttributeValue strength, int32_t len) { UErrorCode status = U_ZERO_ERROR; + const UCAConstants *UCAconsts = (UCAConstants *)((uint8_t *)coll->UCA->image + coll->image->UCAConsts); uint8_t compareSec = (uint8_t)((strength >= UCOL_SECONDARY)?0:0xFF); uint8_t compareTer = (uint8_t)((strength >= UCOL_TERTIARY)?0:0xFF); uint8_t compareQuad = (uint8_t)((strength >= UCOL_QUATERNARY)?0:0xFF); @@ -4125,7 +4570,7 @@ int32_t ucol_getSortKeySize(const UCollator *coll, collIterate *s, int32_t curre uint8_t *frenchStartPtr = NULL, *frenchEndPtr = NULL; uint32_t variableTopValue = coll->variableTopValue; - uint8_t UCOL_COMMON_BOT4 = (uint8_t)((coll->variableTopValue>>8)+1); + uint8_t UCOL_COMMON_BOT4 = (uint8_t)((coll->variableTopValue>>8)+1); if(doHiragana) { UCOL_COMMON_BOT4++; /* allocate one more space for hiragana */ @@ -4173,7 +4618,7 @@ int32_t ucol_getSortKeySize(const UCollator *coll, collIterate *s, int32_t curre if(shifted && ((notIsContinuation && order <= variableTopValue && primary1 > 0) - || (!notIsContinuation && wasShifted)) + || (!notIsContinuation && wasShifted)) || (wasShifted && primary1 == 0)) { /* amendment to the UCA says that primary ignorables */ /* and other ignorables should be removed if following a shifted code point */ if(primary1 == 0) { /* if we were shifted and we got an ignorable code point */ @@ -4392,14 +4837,14 @@ inline void addWithIncrement(uint8_t *&primaries, uint8_t *limit, uint32_t &size } } -// Packs the secondary buffer when processing French locale. Adds the terminator. +// Packs the secondary buffer when processing French locale. Adds the terminator. static inline uint8_t *packFrench(uint8_t *primaries, uint8_t *primEnd, uint8_t *secondaries, uint32_t *secsize, uint8_t *frenchStartPtr, uint8_t *frenchEndPtr) { uint8_t secondary; int32_t count2 = 0; uint32_t i = 0, size = 0; // we use i here since the key size already accounts for terminators, so we'll discard the increment - addWithIncrement(primaries, primEnd, i, UCOL_LEVELTERMINATOR); + addWithIncrement(primaries, primEnd, i, UCOL_LEVELTERMINATOR); /* If there are any unresolved continuation secondaries, reverse them here so that we can reverse the whole secondary thing */ if(frenchStartPtr != NULL) { uprv_ucol_reverse_buffer(uint8_t, frenchStartPtr, frenchEndPtr); @@ -4450,6 +4895,8 @@ ucol_calcSortKey(const UCollator *coll, UBool allocateSKBuffer, UErrorCode *status) { + const UCAConstants *UCAconsts = (UCAConstants *)((uint8_t *)coll->UCA->image + coll->image->UCAConsts); + uint32_t i = 0; /* general purpose counter */ /* Stack allocated buffers for buffers we use */ @@ -5004,7 +5451,7 @@ ucol_calcSortKey(const UCollator *coll, if(U_SUCCESS(*status)) { *result = primStart; *(primaries++) = UCOL_LEVELTERMINATOR; - u_writeIdenticalLevelRun(s.string, len, primaries); + u_writeIdenticalLevelRun(s.string, len, primaries); } } else { *status = U_BUFFER_OVERFLOW_ERROR; @@ -5028,11 +5475,11 @@ ucol_calcSortKey(const UCollator *coll, if(allocateSKBuffer == TRUE) { *result = (uint8_t*)uprv_malloc(sortKeySize); - /* test for NULL */ - if (*result == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - return sortKeySize; - } + /* test for NULL */ + if (*result == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return sortKeySize; + } uprv_memcpy(*result, primStart, sortKeySize); if(primStart != prim) { uprv_free(primStart); @@ -5053,6 +5500,8 @@ ucol_calcSortKeySimpleTertiary(const UCollator *coll, UErrorCode *status) { U_ALIGN_CODE(16); + + const UCAConstants *UCAconsts = (UCAConstants *)((uint8_t *)coll->UCA->image + coll->image->UCAConsts); uint32_t i = 0; /* general purpose counter */ /* Stack allocated buffers for buffers we use */ @@ -5190,7 +5639,7 @@ ucol_calcSortKeySimpleTertiary(const UCollator *coll, *primaries++ = primary1; leadPrimary = 0; } else if(primary1 (UCOL_RESET_TOP_VALUE>>24) && primary1 < (UCOL_NEXT_TOP_VALUE>>24))) + //(primary1 > (UCOL_RESET_TOP_VALUE>>24) && primary1 < (UCOL_NEXT_TOP_VALUE>>24))) (primary1 > (*UCAconsts->UCA_LAST_NON_VARIABLE>>24) && primary1 < (*UCAconsts->UCA_FIRST_IMPLICIT>>24))) { /* not compressible */ leadPrimary = 0; @@ -5392,11 +5841,11 @@ ucol_calcSortKeySimpleTertiary(const UCollator *coll, if(allocateSKBuffer == TRUE) { *result = (uint8_t*)uprv_malloc(sortKeySize); - /* test for NULL */ - if (*result == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - return sortKeySize; - } + /* test for NULL */ + if (*result == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return sortKeySize; + } uprv_memcpy(*result, primStart, sortKeySize); if(primStart != prim) { uprv_free(primStart); @@ -5409,7 +5858,7 @@ ucol_calcSortKeySimpleTertiary(const UCollator *coll, static inline UBool isShiftedCE(uint32_t CE, uint32_t LVT, UBool *wasShifted) { UBool notIsContinuation = !isContinuation(CE); - uint8_t primary1 = (uint8_t)((CE >> 24) & 0xFF); + uint8_t primary1 = (uint8_t)((CE >> 24) & 0xFF); if(LVT && ((notIsContinuation && (CE & 0xFFFF0000)<= LVT && primary1 > 0) || (!notIsContinuation && *wasShifted)) || (*wasShifted && primary1 == 0)) { /* amendment to the UCA says that primary ignorables */ @@ -5448,8 +5897,8 @@ enum { UCOL_PSK_LIMIT }; -/** collation state enum. *_SHIFT value is how much to shift right - * to get the state piece to the right. *_MASK value should be +/** collation state enum. *_SHIFT value is how much to shift right + * to get the state piece to the right. *_MASK value should be * ANDed with the shifted state. This data is stored in state[1] * field. */ @@ -5457,7 +5906,7 @@ enum { UCOL_PSK_LEVEL_SHIFT = 0, /** level identificator. stores an enum value from above */ UCOL_PSK_LEVEL_MASK = 7, /** three bits */ UCOL_PSK_BYTE_COUNT_OR_FRENCH_DONE_SHIFT = 3, /** number of bytes of primary or quaternary already written */ - UCOL_PSK_BYTE_COUNT_OR_FRENCH_DONE_MASK = 1, + UCOL_PSK_BYTE_COUNT_OR_FRENCH_DONE_MASK = 1, /** can be only 0 or 1, since we get up to two bytes from primary or quaternary * This field is also used to denote that the French secondary level is finished */ @@ -5466,7 +5915,7 @@ enum { UCOL_PSK_USED_FRENCH_SHIFT = 5,/** how many French bytes have we already written */ UCOL_PSK_USED_FRENCH_MASK = 3, /** up to 4 bytes. See comment just below */ /** When we do French we need to reverse secondary values. However, continuations - * need to stay the same. So if you had abc1c2c3de, you need to have edc1c2c3ba + * need to stay the same. So if you had abc1c2c3de, you need to have edc1c2c3ba */ UCOL_PSK_USED_ELEMENTS_SHIFT = 7, UCOL_PSK_USED_ELEMENTS_MASK = 0x3FF, @@ -5475,28 +5924,28 @@ enum { }; -/** main sortkey part procedure. On the first call, - * you should pass in a collator, an iterator, empty state +/** main sortkey part procedure. On the first call, + * you should pass in a collator, an iterator, empty state * state[0] == state[1] == 0, a buffer to hold results * number of bytes you need and an error code pointer. * Make sure your buffer is big enough to hold the wanted - * number of sortkey bytes. I don't check. - * The only meaningful status you can get back is - * U_BUFFER_OVERFLOW_ERROR, which basically means that you + * number of sortkey bytes. I don't check. + * The only meaningful status you can get back is + * U_BUFFER_OVERFLOW_ERROR, which basically means that you * have been dealt a raw deal and that you probably won't * be able to use partial sortkey generation for this * particular combination of string and collator. This * is highly unlikely, but you should still check the error code. - * Any other status means that you're not in a sane situation - * anymore. After the first call, preserve state values and + * Any other status means that you're not in a sane situation + * anymore. After the first call, preserve state values and * use them on subsequent calls to obtain more bytes of a sortkey. * Use until the number of bytes written is smaller than the requested * number of bytes. Generated sortkey is not compatible with the * one generated by ucol_getSortKey, as we don't do any compression. * However, levels are still terminated by a 1 (one) and the sortkey * is terminated by a 0 (zero). Identical level is the same as in the - * regular sortkey - internal bocu-1 implementation is used. - * For curious, although you cannot do much about this, here is + * regular sortkey - internal bocu-1 implementation is used. + * For curious, although you cannot do much about this, here is * the structure of state words. * state[0] - iterator state. Depends on the iterator implementation, * but allows the iterator to continue where it stopped in @@ -5511,16 +5960,16 @@ enum { * 4 - was shifted. Whether the previous iteration finished in the * shifted state. * 5, 6 - French continuation bytes written. See the comment in the enum - * 7..16 - Used elements. Number of CEs that were already used from the - * expansion buffer or number of bytes from a bocu sequence on + * 7..16 - Used elements. Number of CEs that were already used from the + * expansion buffer or number of bytes from a bocu sequence on * the identical level. - * 17..31 - iterator skip. Number of move operations iterator needs to + * 17..31 - iterator skip. Number of move operations iterator needs to * skip from the current state in order to continue. This is used * only if normalization is turned on, since the normalizing iterator - * can return undefined state, which means that it's in the middle + * can return undefined state, which means that it's in the middle * of normalizing sequence. */ -U_CAPI int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 ucol_nextSortKeyPart(const UCollator *coll, UCharIterator *iter, uint32_t state[2], @@ -5530,6 +5979,7 @@ ucol_nextSortKeyPart(const UCollator *coll, if(status==NULL || U_FAILURE(*status)) { return 0; } + UTRACE_ENTRY(UTRACE_UCOL_NEXTSORTKEYPART); if( coll==NULL || iter==NULL || state==NULL || count<0 || (count>0 && dest==NULL) @@ -5537,9 +5987,12 @@ ucol_nextSortKeyPart(const UCollator *coll, *status=U_ILLEGAL_ARGUMENT_ERROR; } + UTRACE_DATA6(UTRACE_VERBOSE, "coll=%p, iter=%p, state=%d %d, dest=%p, count=%d", + coll, iter, state[0], state[1], dest, count); if(count==0) { /* nothing to do */ + UTRACE_EXIT_VALUE(0); return 0; } @@ -5552,19 +6005,19 @@ ucol_nextSortKeyPart(const UCollator *coll, int32_t level= (state[1] >> UCOL_PSK_LEVEL_SHIFT) & UCOL_PSK_LEVEL_MASK; // Have we written only one byte from a two byte primary in the previous iteration? // Also on secondary level - have we finished with the French secondary? - int32_t byteCountOrFrenchDone = (state[1] >> UCOL_PSK_BYTE_COUNT_OR_FRENCH_DONE_SHIFT) & UCOL_PSK_BYTE_COUNT_OR_FRENCH_DONE_MASK; + int32_t byteCountOrFrenchDone = (state[1] >> UCOL_PSK_BYTE_COUNT_OR_FRENCH_DONE_SHIFT) & UCOL_PSK_BYTE_COUNT_OR_FRENCH_DONE_MASK; // number of bytes in the continuation buffer for French int32_t usedFrench = (state[1] >> UCOL_PSK_USED_FRENCH_SHIFT) & UCOL_PSK_USED_FRENCH_MASK; // Skip the CEs that we got from an extraction // and delivered in the previous call int32_t usedElements = (state[1] >> UCOL_PSK_USED_ELEMENTS_SHIFT) & UCOL_PSK_USED_ELEMENTS_MASK; // Number of times to skip because the iterator returned - // UITER_NO_STATE when it was stopped in the last iteration, so we had to save the + // UITER_NO_STATE when it was stopped in the last iteration, so we had to save the // last valid state. int32_t iterSkips = (state[1] >> UCOL_PSK_ITER_SKIP_SHIFT) & UCOL_PSK_ITER_SKIP_MASK; /** values that depend on the collator attributes */ - // strength of the collator. + // strength of the collator. int32_t strength = ucol_getAttribute(coll, UCOL_STRENGTH, status); // maximal level of the partial sortkey. Need to take whether case level is done int32_t maxLevel = 0; @@ -5584,7 +6037,7 @@ ucol_nextSortKeyPart(const UCollator *coll, } } // value for the quaternary level if Hiragana is encountered. Used for JIS X 4061 collation - uint8_t UCOL_HIRAGANA_QUAD = + uint8_t UCOL_HIRAGANA_QUAD = (ucol_getAttribute(coll, UCOL_HIRAGANA_QUATERNARY_MODE, status) == UCOL_ON)?0xFE:0xFF; // Boundary value that decides whether a CE is shifted or not uint32_t LVT = (coll->alternateHandling == UCOL_SHIFTED)?(coll->variableTopValue<<16):0; @@ -5600,7 +6053,7 @@ ucol_nextSortKeyPart(const UCollator *coll, s.iterator = iter; s.flags |= UCOL_USE_ITERATOR; // This variable tells us whether we have produced some other levels in this iteration - // before we moved to the identical level. In that case, we need to switch the + // before we moved to the identical level. In that case, we need to switch the // type of the iterator. UBool doingIdenticalFromStart = FALSE; // Normalizing iterator @@ -5616,15 +6069,17 @@ ucol_nextSortKeyPart(const UCollator *coll, s.iterator = unorm_setIter(normIter, iter, UNORM_FCD, status); s.flags &= ~UCOL_ITER_NORM; if(U_FAILURE(*status)) { + UTRACE_EXIT_STATUS(*status); return 0; } } else if(level == UCOL_PSK_IDENTICAL) { - // for identical level, we need a NFD iterator. We need to instantiate it here, since we + // for identical level, we need a NFD iterator. We need to instantiate it here, since we // will be updating the state - and this cannot be done on an ordinary iterator. normIter = unorm_openIter(stackNormIter, sizeof(stackNormIter), status); s.iterator = unorm_setIter(normIter, iter, UNORM_NFD, status); s.flags &= ~UCOL_ITER_NORM; if(U_FAILURE(*status)) { + UTRACE_EXIT_STATUS(*status); return 0; } doingIdenticalFromStart = TRUE; @@ -5649,6 +6104,7 @@ ucol_nextSortKeyPart(const UCollator *coll, /* reset to previous state */ s.iterator->setState(s.iterator, iterState, status); if(U_FAILURE(*status)) { + UTRACE_EXIT_STATUS(*status); return 0; } } @@ -5667,7 +6123,7 @@ ucol_nextSortKeyPart(const UCollator *coll, // Number of expansion CEs that were already consumed in the // previous iteration for the last code point processed. We - // want to clean out the expansion buffer, so that we can + // want to clean out the expansion buffer, so that we can // get correct CEs. This value is persistent over iterations, // since we can have several iterations on the one expansion // buffer. @@ -5677,13 +6133,13 @@ ucol_nextSortKeyPart(const UCollator *coll, // shares the state field with consumedExpansionCEs value, since // they cannot simultanously appear on the same level int32_t bocsuBytesUsed = 0; - // Clean out the expansion buffer unless we are on + // Clean out the expansion buffer unless we are on // identical level. In that case we use this field // to store the number of bytes already written // from the previous bocsu sequence. if(level < UCOL_PSK_IDENTICAL && usedElements != 0) { while(usedElements-->0) { - // If we're doing French and we are on the secondary level, + // If we're doing French and we are on the secondary level, // we go backwards. if(level == UCOL_PSK_SECONDARY && doingFrench) { CE = ucol_IGetPrevCE(coll, &s, status); @@ -5693,6 +6149,7 @@ ucol_nextSortKeyPart(const UCollator *coll, if(CE==UCOL_NO_MORE_CES) { /* should not happen */ *status=U_INTERNAL_PROGRAM_ERROR; + UTRACE_EXIT_STATUS(*status); return 0; } } @@ -5701,20 +6158,20 @@ ucol_nextSortKeyPart(const UCollator *coll, } // This variable prevents the adjusting of iterator - // skip variable when we are the first time on a + // skip variable when we are the first time on a // level. I hope there is a better way to do it, but // I could not think of it. UBool firstTimeOnLevel = TRUE; // French secondary needs to know whether the iterator state of zero came from previous level OR // from a new invocation... UBool wasDoingPrimary = FALSE; - // Case level is kind of goofy. This variable tells us that + // Case level is kind of goofy. This variable tells us that // we are still not done with the case level. - UBool dontAdvanceIteratorBecauseWeNeedALevelTerminator = FALSE; + UBool dontAdvanceIteratorBecauseWeNeedALevelTerminator = FALSE; // destination buffer byte counter. When this guy // gets to count, we're done with the iteration - int32_t i = 0; - // used to count the zero bytes written after we + int32_t i = 0; + // used to count the zero bytes written after we // have finished with the sort key int32_t j = 0; @@ -5726,7 +6183,7 @@ ucol_nextSortKeyPart(const UCollator *coll, // way to exit is a goto saveState, which happens when we have filled // out our buffer. switch(level) { - case UCOL_PSK_PRIMARY: + case UCOL_PSK_PRIMARY: wasDoingPrimary = TRUE; for(;;) { if(i==count) { @@ -5777,14 +6234,14 @@ ucol_nextSortKeyPart(const UCollator *coll, } } } - if(s.CEpos - s.toReturn || (s.pos && *s.pos != 0)) { + if(s.CEpos - s.toReturn || (s.pos && *s.pos != 0)) { // s.pos != NULL means there is a normalization buffer in effect // in iterative case, this means that we are doing Thai (maybe discontiguos) consumedExpansionCEs++; } else { consumedExpansionCEs = 0; } - if(s.pos && *s.pos == 0) { + if(s.pos && *s.pos == 0) { // maybe it is the end of Thai - we have to have // an extra skip iterSkips++; @@ -5820,7 +6277,7 @@ ucol_nextSortKeyPart(const UCollator *coll, byteCountOrFrenchDone=0; // Restart the iteration an move to the // second level - s.iterator->move(s.iterator, 0, UITER_START); + s.iterator->move(s.iterator, 0, UITER_START); level = UCOL_PSK_CASE; break; } @@ -5835,7 +6292,7 @@ ucol_nextSortKeyPart(const UCollator *coll, } else { consumedExpansionCEs = 0; } - if(s.pos && *s.pos == 0) { + if(s.pos && *s.pos == 0) { iterSkips++; } } @@ -5843,8 +6300,8 @@ ucol_nextSortKeyPart(const UCollator *coll, uint8_t frenchBuff[UCOL_MAX_BUFFER]; int32_t frenchIndex = 0; // Here we are going backwards. - // If the iterator is at the beggining, it should be - // moved to end. + // If the iterator is at the beggining, it should be + // moved to end. if(wasDoingPrimary) { s.iterator->move(s.iterator, 0, UITER_LIMIT); } @@ -5857,7 +6314,7 @@ ucol_nextSortKeyPart(const UCollator *coll, if(newState != UITER_NO_STATE) { iterState = newState; iterSkips = 0; - } else { + } else { if(!firstTimeOnLevel) { iterSkips++; } @@ -5874,11 +6331,11 @@ ucol_nextSortKeyPart(const UCollator *coll, level = UCOL_PSK_CASE; break; } - if(isContinuation(CE)) { // if it's a continuation, we want to save it and + if(isContinuation(CE)) { // if it's a continuation, we want to save it and // reverse when we get a first non-continuation CE. CE >>= 8; frenchBuff[frenchIndex++] = (uint8_t)CE; - } else if(!isShiftedCE(CE, LVT, &wasShifted)) { + } else if(!isShiftedCE(CE, LVT, &wasShifted)) { CE >>= 8; /* get secondary */ if(!frenchIndex) { if(CE != 0) { @@ -5941,7 +6398,7 @@ ucol_nextSortKeyPart(const UCollator *coll, dest[i++] = caseByte; } // This is kind of tricky - situation where - // we need to keep the iterator in the old + // we need to keep the iterator in the old // state, but don't need to bring anything // to the next invocation if(i < count) { @@ -5961,7 +6418,7 @@ ucol_nextSortKeyPart(const UCollator *coll, if(!isContinuation(CE)) { CE = (uint8_t)(CE & UCOL_BYTE_SIZE_MASK); caseBits = (uint8_t)(CE & 0xC0); - // this copies the case level logic from the + // this copies the case level logic from the // sort key generation code if(CE != 0) { if(coll->caseFirst == UCOL_UPPER_FIRST) { @@ -6096,7 +6553,7 @@ ucol_nextSortKeyPart(const UCollator *coll, if(CE==UCOL_NO_MORE_CES) { // Add the level separator terminatePSKLevel(level, maxLevel, i, dest); - //dest[i++] = UCOL_LEVELTERMINATOR; + //dest[i++] = UCOL_LEVELTERMINATOR; byteCountOrFrenchDone=0; // Restart the iteration an move to the // second level @@ -6153,7 +6610,7 @@ ucol_nextSortKeyPart(const UCollator *coll, if(strength >= UCOL_IDENTICAL) { UChar32 first, second; int32_t bocsuBytesWritten = 0; - // We always need to do identical on + // We always need to do identical on // the NFD form of the string. if(normIter == NULL) { // we arrived from the level below and @@ -6161,10 +6618,10 @@ ucol_nextSortKeyPart(const UCollator *coll, // therefore, we need to make a fresh NFD iterator normIter = unorm_openIter(stackNormIter, sizeof(stackNormIter), status); s.iterator = unorm_setIter(normIter, iter, UNORM_NFD, status); - } else if(!doingIdenticalFromStart) { + } else if(!doingIdenticalFromStart) { // there is an iterator, but we did some other levels. - // therefore, we have a FCD iterator - need to make - // a NFD one. + // therefore, we have a FCD iterator - need to make + // a NFD one. // normIter being at the beginning does not guarantee // that the underlying iterator is at the beginning iter->move(iter, 0, UITER_START); @@ -6173,6 +6630,7 @@ ucol_nextSortKeyPart(const UCollator *coll, // At this point we have a NFD iterator that is positioned // in the right place if(U_FAILURE(*status)) { + UTRACE_EXIT_STATUS(*status); return 0; } first = uiter_previous32(s.iterator); @@ -6192,7 +6650,7 @@ ucol_nextSortKeyPart(const UCollator *coll, goto saveState; } - // On identical level, we will always save + // On identical level, we will always save // the state if we reach this point, since // we don't depend on getNextCE for content // all the content is in our buffer and we @@ -6242,20 +6700,21 @@ ucol_nextSortKeyPart(const UCollator *coll, break; default: *status = U_INTERNAL_PROGRAM_ERROR; + UTRACE_EXIT_STATUS(*status); return 0; } saveState: // Now we need to return stuff. First we want to see whether we have // done everything for the current state of iterator. - if(consumedExpansionCEs || byteCountOrFrenchDone + if(consumedExpansionCEs || byteCountOrFrenchDone || dontAdvanceIteratorBecauseWeNeedALevelTerminator) { - // Any of above mean that the previous transaction - // wasn't finished and that we should store the + // Any of above mean that the previous transaction + // wasn't finished and that we should store the // previous iterator state. state[0] = iterState; } else { - // The transaction is complete. We will continue in + // The transaction is complete. We will continue in // next iteration. if((newState = s.iterator->getState(s.iterator))!= UITER_NO_STATE) { state[0] = s.iterator->getState(s.iterator); @@ -6281,7 +6740,7 @@ saveState: } // Next we put in the level of comparison - state[1] |= ((level & UCOL_PSK_LEVEL_MASK) << UCOL_PSK_LEVEL_SHIFT); + state[1] |= ((level & UCOL_PSK_LEVEL_MASK) << UCOL_PSK_LEVEL_SHIFT); // If we are doing French, we need to store whether we have just finished the French level if(level == UCOL_PSK_SECONDARY && doingFrench) { @@ -6315,13 +6774,16 @@ saveState: } // Return number of meaningful sortkey bytes. + UTRACE_DATA4(UTRACE_VERBOSE, "dest = %vb, state=%d %d", + dest,i, state[0], state[1]); + UTRACE_EXIT_VALUE(i); return i; } /** * Produce a bound for a given sortkey and a number of levels. */ -U_CAPI int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 ucol_getBound(const uint8_t *source, int32_t sourceLength, UColBoundMode boundType, @@ -6329,7 +6791,7 @@ ucol_getBound(const uint8_t *source, uint8_t *result, int32_t resultLength, UErrorCode *status) { - // consistency checks + // consistency checks if(status == NULL || U_FAILURE(*status)) { return 0; } @@ -6345,7 +6807,7 @@ ucol_getBound(const uint8_t *source, if(source[sourceIndex] == UCOL_LEVELTERMINATOR) { noOfLevels--; } - } while (noOfLevels > 0 + } while (noOfLevels > 0 && (source[sourceIndex] != 0 || sourceIndex < sourceLength)); if((source[sourceIndex] == 0 || sourceIndex == sourceLength) @@ -6356,7 +6818,7 @@ ucol_getBound(const uint8_t *source, // READ ME: this code assumes that the values for boundType // enum will not changes. They are set so that the enum value - // corresponds to the number of extra bytes each bound type + // corresponds to the number of extra bytes each bound type // needs. if(result != NULL && resultLength >= sourceIndex+boundType) { uprv_memcpy(result, source, sourceIndex); @@ -6381,7 +6843,7 @@ ucol_getBound(const uint8_t *source, return sourceIndex; } else { - return sourceIndex+boundType+1; + return sourceIndex+boundType+1; } } @@ -6406,7 +6868,7 @@ U_CAPI char* U_EXPORT2 ucol_sortKeyToString(const UCollator *coll, const uint8_t while(strength <= UCOL_QUATERNARY && strength <= coll->strength) { if(strength > UCOL_PRIMARY) { - strcat(current, " . "); + uprv_strcat(current, " . "); } while(*currentSk != 0x01 && *currentSk != 0x00) { /* print a level */ uprv_appendByteToHexString(current, *currentSk++); @@ -6484,7 +6946,7 @@ ucol_addLatinOneEntry(UCollator *coll, UChar ch, uint32_t CE, if(reverseSecondary && coll->frenchCollation == UCOL_ON) { // reverse secondary coll->latinOneCEs[coll->latinOneTableLen+ch] >>= 8; // make space for secondary coll->latinOneCEs[coll->latinOneTableLen+ch] |= (secondary << 24); - } else { // normal case + } else { // normal case coll->latinOneCEs[coll->latinOneTableLen+ch] |= (secondary << *secShift); } *secShift -= 8; @@ -6540,8 +7002,8 @@ ucol_setUpLatinOne(UCollator *coll, UErrorCode *status) { CE = coll->latinOneMapping[ch]; } else { CE = UTRIE_GET32_FROM_LEAD(coll->mapping, ch); - if(CE == UCOL_NOT_FOUND) { - CE = UTRIE_GET32_FROM_LEAD(UCA->mapping, ch); + if(CE == UCOL_NOT_FOUND && coll->UCA) { + CE = UTRIE_GET32_FROM_LEAD(coll->UCA->mapping, ch); } } if(CE < UCOL_NOT_FOUND) { @@ -6549,8 +7011,9 @@ ucol_setUpLatinOne(UCollator *coll, UErrorCode *status) { } else { switch (getCETag(CE)) { case EXPANSION_TAG: + case DIGIT_TAG: ucol_setText(it, &ch, 1, status); - while((CE = ucol_next(it, status)) != UCOL_NULLORDER) { + while((int32_t)(CE = ucol_next(it, status)) != UCOL_NULLORDER) { if(primShift < 0 || secShift < 0 || terShift < 0) { coll->latinOneCEs[ch] = UCOL_BAIL_OUT_CE; coll->latinOneCEs[coll->latinOneTableLen+ch] = UCOL_BAIL_OUT_CE; @@ -6569,13 +7032,14 @@ ucol_setUpLatinOne(UCollator *coll, UErrorCode *status) { { if((CE & 0x00FFF000) != 0) { *status = U_UNSUPPORTED_ERROR; + coll->latinOneFailed = TRUE; return FALSE; } const UChar *UCharOffset = (UChar *)coll->image+getContractOffset(CE); CE |= (contractionOffset & 0xFFF) << 12; // insert the offset in latin-1 table - + coll->latinOneCEs[ch] = CE; coll->latinOneCEs[coll->latinOneTableLen+ch] = CE; coll->latinOneCEs[2*coll->latinOneTableLen+ch] = CE; @@ -6585,7 +7049,7 @@ ucol_setUpLatinOne(UCollator *coll, UErrorCode *status) { do { CE = *(coll->contractionCEs + (UCharOffset - coll->contractionIndex)); - if(getCETag(CE) == EXPANSION_TAG) { + if(CE > UCOL_NOT_FOUND && getCETag(CE) == EXPANSION_TAG) { uint32_t size; uint32_t i; /* general counter */ uint32_t *CEOffset = (uint32_t *)coll->image+getExpansionOffset(CE); /* find the offset to expansion table */ @@ -6620,11 +7084,12 @@ ucol_setUpLatinOne(UCollator *coll, UErrorCode *status) { coll->latinOneCEs[coll->latinOneTableLen+(UChar)contractionOffset] = UCOL_BAIL_OUT_CE; coll->latinOneCEs[2*coll->latinOneTableLen+(UChar)contractionOffset] = UCOL_BAIL_OUT_CE; contractionOffset++; - } + } UCharOffset++; primShift = 24; secShift = 24; terShift = 24; if(contractionOffset == coll->latinOneTableLen) { // we need to reallocate if(!ucol_resizeLatinOneTable(coll, 2*coll->latinOneTableLen, status)) { + coll->latinOneFailed = TRUE; return FALSE; } } @@ -6642,7 +7107,8 @@ ucol_setUpLatinOne(UCollator *coll, UErrorCode *status) { // compact table if(contractionOffset < coll->latinOneTableLen) { if(!ucol_resizeLatinOneTable(coll, contractionOffset, status)) { - return FALSE; + coll->latinOneFailed = TRUE; + return FALSE; } } return result; @@ -6687,7 +7153,7 @@ void ucol_updateInternalState(UCollator *coll, UErrorCode *status) { } else { coll->sortKeyGen = ucol_calcSortKey; } - if(coll->caseLevel == UCOL_OFF && coll->strength <= UCOL_TERTIARY + if(coll->caseLevel == UCOL_OFF && coll->strength <= UCOL_TERTIARY && coll->numericCollation == UCOL_OFF && coll->alternateHandling == UCOL_NON_IGNORABLE && !coll->latinOneFailed) { if(coll->latinOneCEs == NULL || coll->latinOneRegenTable) { if(ucol_setUpLatinOne(coll, status)) { // if we succeed in building latin1 table, we'll use it @@ -6696,12 +7162,15 @@ void ucol_updateInternalState(UCollator *coll, UErrorCode *status) { } else { coll->latinOneUse = FALSE; } + if(*status == U_UNSUPPORTED_ERROR) { + *status = U_ZERO_ERROR; + } } else { // latin1Table exists and it doesn't need to be regenerated, just use it coll->latinOneUse = TRUE; } } else { coll->latinOneUse = FALSE; - } + } } } @@ -6738,8 +7207,10 @@ ucol_setVariableTop(UCollator *coll, const UChar *varTop, int32_t len, UErrorCod *status = U_PRIMARY_TOO_LONG_ERROR; return 0; } - - coll->variableTopValue = (CE & UCOL_PRIMARYMASK)>>16; + if(coll->variableTopValue != (CE & UCOL_PRIMARYMASK)>>16) { + coll->variableTopValueisDefault = FALSE; + coll->variableTopValue = (CE & UCOL_PRIMARYMASK)>>16; + } return CE & UCOL_PRIMARYMASK; } @@ -6756,7 +7227,11 @@ ucol_restoreVariableTop(UCollator *coll, const uint32_t varTop, UErrorCode *stat if(U_FAILURE(*status) || coll == NULL) { return; } - coll->variableTopValue = (varTop & UCOL_PRIMARYMASK)>>16; + + if(coll->variableTopValue != (varTop & UCOL_PRIMARYMASK)>>16) { + coll->variableTopValueisDefault = FALSE; + coll->variableTopValue = (varTop & UCOL_PRIMARYMASK)>>16; + } } /* Attribute setter API */ U_CAPI void U_EXPORT2 @@ -6886,7 +7361,7 @@ ucol_setAttribute(UCollator *coll, UColAttribute attr, UColAttributeValue value, } if(oldFrench != coll->frenchCollation || oldCaseFirst != coll->caseFirst) { coll->latinOneRegenTable = TRUE; - } else { + } else { coll->latinOneRegenTable = FALSE; } ucol_updateInternalState(coll, status); @@ -6899,7 +7374,7 @@ ucol_getAttribute(const UCollator *coll, UColAttribute attr, UErrorCode *status) } switch(attr) { case UCOL_NUMERIC_COLLATION: - return coll->numericCollation; + return coll->numericCollation; case UCOL_HIRAGANA_QUATERNARY_MODE: return coll->hiraganaQ; case UCOL_FRENCH_COLLATION: /* attribute for direction of secondary weights*/ @@ -6987,10 +7462,10 @@ ucol_safeClone(const UCollator *coll, void *stackBuffer, int32_t * pBufferSize, } } else { localCollator = (UCollator *)stackBuffer; - memcpy(localCollator, coll, sizeof(UCollator)); + uprv_memcpy(localCollator, coll, sizeof(UCollator)); localCollator->freeOnClose = FALSE; - localCollator->requestedLocale = NULL; // zero copies of pointers - localCollator->validLocale = NULL; + localCollator->requestedLocale = NULL; // zero copies of pointers + localCollator->validLocale = NULL; } return localCollator; } @@ -7006,6 +7481,13 @@ ucol_getRulesEx(const UCollator *coll, UColRuleOption delta, UChar *buffer, int3 /* take the UCA rules and append real rules at the end */ /* UCA rules will be probably coming from the root RB */ ucaRules = ures_getStringByKey(coll->rb,"%%UCARULES",&UCAlen,&status); + /* + UResourceBundle* cresb = ures_getByKeyWithFallback(coll->rb, "collations", NULL, &status); + UResourceBundle* uca = ures_getByKeyWithFallback(cresb, "UCA", NULL, &status); + ucaRules = ures_getStringByKey(uca,"Sequence",&UCAlen,&status); + ures_close(uca); + ures_close(cresb); + */ } if(U_FAILURE(status)) { return 0; @@ -7033,14 +7515,12 @@ ucol_getRules( const UCollator *coll, return coll->rules; } else { UErrorCode status = U_ZERO_ERROR; - if(coll->rb != NULL) { - UResourceBundle *collElem = ures_getByKey(coll->rb, "CollationElements", NULL, &status); + if(coll->elements != NULL) { if(U_SUCCESS(status)) { /*Semantic const */ - ((UCollator *)coll)->rules = ures_getStringByKey(collElem, "Sequence", length, &status); + ((UCollator *)coll)->rules = ures_getStringByKey(coll->elements, "Sequence", length, &status); ((UCollator *)coll)->rulesLength = *length; ((UCollator *)coll)->freeRulesOnClose = FALSE; - ures_close(collElem); return coll->rules; } } @@ -7080,6 +7560,61 @@ ucol_countAvailable() return uloc_countAvailable(); } +#if !UCONFIG_NO_SERVICE +U_CAPI UEnumeration* U_EXPORT2 +ucol_openAvailableLocales(UErrorCode *status) { + // This is a wrapper over Collator::getAvailableLocales() + if (U_FAILURE(*status)) { + return NULL; + } + StringEnumeration *s = Collator::getAvailableLocales(); + if (s == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + return uenum_openStringEnumeration(s, status); +} +#endif + +// Note: KEYWORDS[0] != RESOURCE_NAME - alan + +static const char* RESOURCE_NAME = "collations"; + +static const char* KEYWORDS[] = { "collation" }; + +#define KEYWORD_COUNT (sizeof(KEYWORDS)/sizeof(KEYWORDS[0])) + +U_CAPI UEnumeration* U_EXPORT2 +ucol_getKeywords(UErrorCode *status) { + UEnumeration *result = NULL; + if (U_SUCCESS(*status)) { + return uenum_openCharStringsEnumeration(KEYWORDS, KEYWORD_COUNT, status); + } + return result; +} + +U_CAPI UEnumeration* U_EXPORT2 +ucol_getKeywordValues(const char *keyword, UErrorCode *status) { + // hard-coded to accept exactly one collation keyword + // modify if additional collation keyword is added later + if (U_SUCCESS(*status) && + keyword==NULL || uprv_strcmp(keyword, KEYWORDS[0])!=0) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + return ures_getKeywordValues(U_ICUDATA_COLL, RESOURCE_NAME, status); +} + +U_CAPI int32_t U_EXPORT2 +ucol_getFunctionalEquivalent(char* result, int32_t resultCapacity, + const char* keyword, const char* locale, + UBool* isAvailable, UErrorCode* status) { + // N.B.: Resource name is "collations" but keyword is "collation" + return ures_getFunctionalEquivalent(result, resultCapacity, U_ICUDATA_COLL, + "collations", keyword, locale, + isAvailable, TRUE, status); +} + U_CAPI void U_EXPORT2 ucol_getVersion(const UCollator* coll, UVersionInfo versionInfo) @@ -7102,7 +7637,11 @@ ucol_getVersion(const UCollator* coll, versionInfo[0] = (uint8_t)(cmbVersion>>8); versionInfo[1] = (uint8_t)cmbVersion; versionInfo[2] = coll->image->version[1]; - versionInfo[3] = UCA->image->UCAVersion[0]; + if(coll->UCA) { + versionInfo[3] = coll->UCA->image->UCAVersion[0]; + } else { + versionInfo[3] = 0; + } } @@ -7112,11 +7651,11 @@ ucol_isTailored(const UCollator *coll, const UChar u, UErrorCode *status) { uint32_t CE = UCOL_NOT_FOUND; const UChar *ContractionStart = NULL; if(U_SUCCESS(*status) && coll != NULL) { - if(coll == UCA) { + if(coll == coll->UCA) { return FALSE; } else if(u < 0x100) { /* latin-1 */ CE = coll->latinOneMapping[u]; - if(CE == UCA->latinOneMapping[u]) { + if(coll->UCA && CE == coll->UCA->latinOneMapping[u]) { return FALSE; } } else { /* regular */ @@ -7162,13 +7701,13 @@ static UCollationResult ucol_checkIdent(collIterate *sColl, collIterate *tColl, UBool normalize, UErrorCode *status) { - // TODO: When we have an UChar iterator, we need to access the whole string. One + // TODO: When we have an UChar iterator, we need to access the whole string. One // useful modification would be a UChar iterator extract API, since reset next next... // is not optimal. // TODO: Handle long strings. Do the same in compareUsingSortKeys. // When we arrive here, we can have normal strings or UCharIterators. Currently they are both - // of same type, but that doesn't really mean that it will stay that way. + // of same type, but that doesn't really mean that it will stay that way. // The division for the array length may truncate the array size to // a little less than UNORM_ITER_SIZE, but that size is dimensioned too high @@ -7414,7 +7953,7 @@ static UCollationResult ucol_compareUsingSortKeys(collIterate *sColl, } -static inline UCollationResult +static inline UCollationResult ucol_strcollRegular( collIterate *sColl, collIterate *tColl, // const UCollator *coll, // const UChar *source, @@ -7492,7 +8031,7 @@ ucol_strcollRegular( collIterate *sColl, collIterate *tColl, } if(doHiragana && hirResult == UCOL_EQUAL) { if((sColl->flags & UCOL_WAS_HIRAGANA) != (tColl->flags & UCOL_WAS_HIRAGANA)) { - hirResult = ((sColl->flags & UCOL_WAS_HIRAGANA) > (tColl->flags & UCOL_WAS_HIRAGANA)) + hirResult = ((sColl->flags & UCOL_WAS_HIRAGANA) > (tColl->flags & UCOL_WAS_HIRAGANA)) ? UCOL_LESS:UCOL_GREATER; } } @@ -7513,8 +8052,8 @@ ucol_strcollRegular( collIterate *sColl, collIterate *tColl, if(sOrder == UCOL_NO_MORE_CES) { UCOL_CEBUF_PUT(&sCEs, sOrder, sColl); break; - } else if(sOrder == 0 - || (sInShifted && (sOrder & UCOL_PRIMARYMASK) == 0)) { + } else if(sOrder == 0 + || (sInShifted && (sOrder & UCOL_PRIMARYMASK) == 0)) { /* UCA amendment - ignore ignorables that follow shifted code points */ continue; } else if(isContinuation(sOrder)) { @@ -7562,7 +8101,7 @@ ucol_strcollRegular( collIterate *sColl, collIterate *tColl, UCOL_CEBUF_PUT(&tCEs, tOrder, tColl); break; } else if(tOrder == 0 - || (tInShifted && (tOrder & UCOL_PRIMARYMASK) == 0)) { + || (tInShifted && (tOrder & UCOL_PRIMARYMASK) == 0)) { /* UCA amendment - ignore ignorables that follow shifted code points */ continue; } else if(isContinuation(tOrder)) { @@ -7608,7 +8147,7 @@ ucol_strcollRegular( collIterate *sColl, collIterate *tColl, /* if(doHiragana && hirResult == UCOL_EQUAL) { if((sColl.flags & UCOL_WAS_HIRAGANA) != (tColl.flags & UCOL_WAS_HIRAGANA)) { - hirResult = ((sColl.flags & UCOL_WAS_HIRAGANA) > (tColl.flags & UCOL_WAS_HIRAGANA)) + hirResult = ((sColl.flags & UCOL_WAS_HIRAGANA) > (tColl.flags & UCOL_WAS_HIRAGANA)) ? UCOL_LESS:UCOL_GREATER; } } @@ -7884,8 +8423,8 @@ commonReturn: } -static inline uint32_t -ucol_getLatinOneContraction(const UCollator *coll, int32_t strength, +static inline uint32_t +ucol_getLatinOneContraction(const UCollator *coll, int32_t strength, uint32_t CE, const UChar *s, int32_t *index, int32_t len) { const UChar *UCharOffset = (UChar *)coll->image+getContractOffset(CE&0xFFF); int32_t latinOneOffset = (CE & 0x00FFF000) >> 12; @@ -7933,22 +8472,22 @@ ucol_getLatinOneContraction(const UCollator *coll, int32_t strength, } -/** - * This is a fast strcoll, geared towards text in Latin-1. +/** + * This is a fast strcoll, geared towards text in Latin-1. * It supports contractions of size two, French secondaries * and case switching. You can use it with strengths primary * to tertiary. It does not support shifted and case level. * It relies on the table build by setupLatin1Table. If it * doesn't understand something, it will go to the regular - * strcoll. + * strcoll. */ -static inline UCollationResult +static inline UCollationResult ucol_strcollUseLatin1( const UCollator *coll, const UChar *source, int32_t sLen, const UChar *target, int32_t tLen, - UErrorCode *status) + UErrorCode *status) { U_ALIGN_CODE(16); int32_t strength = coll->strength; @@ -8009,10 +8548,10 @@ ucol_strcollUseLatin1( const UCollator *coll, if(tLen==-1) { // handling zero terminated strings tChar=target[tIndex++]; if(tChar==0) { - if(endOfSource) { // this is different than source loop, + if(endOfSource) { // this is different than source loop, // as we already know that source loop is done here, // so we can either finish the primary loop if both - // strings are done or anounce the result if only + // strings are done or anounce the result if only // target is done. Same below. goto endOfPrimLoop; } else { @@ -8071,11 +8610,11 @@ ucol_strcollUseLatin1( const UCollator *coll, // top bytes match, continue with following bytes sOrder<<=8; tOrder<<=8; - } + } } endOfPrimLoop: - // after primary loop, we definitely know the sizes of strings, + // after primary loop, we definitely know the sizes of strings, // so we set it and use simpler loop for secondaries and tertiaries sLen = sIndex; tLen = tIndex; if(strength >= UCOL_SECONDARY) { @@ -8085,8 +8624,8 @@ endOfPrimLoop: if(coll->frenchCollation == UCOL_OFF) { // non French // This loop is a simplified copy of primary loop - // at this point we know that whole strings are latin-1, so we don't - // check for that. We also know that we only have contractions as + // at this point we know that whole strings are latin-1, so we don't + // check for that. We also know that we only have contractions as // specials. sIndex = 0; tIndex = 0; for(;;) { @@ -8134,7 +8673,7 @@ endOfPrimLoop: } sOrder<<=8; tOrder<<=8; - } + } } } else { // French if(haveContractions) { // if we have contractions, we have to bail out @@ -8185,10 +8724,10 @@ endOfPrimLoop: } sOrder<<=8; tOrder<<=8; - } + } } } - } + } endOfSecLoop: if(strength >= UCOL_TERTIARY) { @@ -8238,9 +8777,9 @@ endOfSecLoop: } sOrder<<=8; tOrder<<=8; - } + } } - } + } return UCOL_EQUAL; returnRegular: @@ -8249,7 +8788,7 @@ returnRegular: IInit_collIterate(coll, source, sLen, &sColl); IInit_collIterate(coll, target, tLen, &tColl); - return ucol_strcollRegular(&sColl, &tColl, status); + return ucol_strcollRegular(&sColl, &tColl, status); } @@ -8258,11 +8797,20 @@ ucol_strcollIter( const UCollator *coll, UCharIterator *sIter, UCharIterator *tIter, UErrorCode *status) { - if(!status || U_FAILURE(*status) || sIter == tIter) { + if(!status || U_FAILURE(*status)) { + return UCOL_EQUAL; + } + + UTRACE_ENTRY(UTRACE_UCOL_STRCOLLITER); + UTRACE_DATA3(UTRACE_VERBOSE, "coll=%p, sIter=%p, tIter=%p", coll, sIter, tIter); + + if (sIter == tIter) { + UTRACE_EXIT_VALUE_STATUS(UCOL_EQUAL, *status) return UCOL_EQUAL; } if(sIter == NULL || tIter == NULL || coll == NULL) { *status = U_ILLEGAL_ARGUMENT_ERROR; + UTRACE_EXIT_VALUE_STATUS(UCOL_EQUAL, *status) return UCOL_EQUAL; } @@ -8295,9 +8843,12 @@ ucol_strcollIter( const UCollator *coll, } UChar32 sChar = U_SENTINEL, tChar = U_SENTINEL; - - while((sChar = sColl.iterator->next(sColl.iterator)) == + + while((sChar = sColl.iterator->next(sColl.iterator)) == (tChar = tColl.iterator->next(tColl.iterator))) { + if(UCOL_ISTHAIPREVOWEL(sChar)) { + break; + } if(sChar == U_SENTINEL) { result = UCOL_EQUAL; goto end_compare; @@ -8339,6 +8890,7 @@ end_compare: unorm_closeIter(tNormIter); } + UTRACE_EXIT_VALUE_STATUS(result, *status) return result; } @@ -8354,10 +8906,19 @@ ucol_strcoll( const UCollator *coll, const UChar *target, int32_t targetLength) { U_ALIGN_CODE(16); + + UTRACE_ENTRY(UTRACE_UCOL_STRCOLL); + if (UTRACE_LEVEL(UTRACE_VERBOSE)) { + UTRACE_DATA3(UTRACE_VERBOSE, "coll=%p, source=%p, target=%p", coll, source, target); + UTRACE_DATA2(UTRACE_VERBOSE, "source string = %vh ", source, sourceLength); + UTRACE_DATA2(UTRACE_VERBOSE, "target string = %vh ", target, targetLength); + } + UErrorCode status = U_ZERO_ERROR; if(source == NULL || target == NULL) { - // do not crash, but return. Should have + // do not crash, but return. Should have // status argument to return error. + UTRACE_EXIT_VALUE(UTRACE_UCOL_STRCOLL); return UCOL_EQUAL; } collIterate sColl, tColl; @@ -8374,6 +8935,7 @@ ucol_strcoll( const UCollator *coll, // Check for them being the same string, and scan through // any leading equal portion. if (source==target) { + UTRACE_EXIT_VALUE(UCOL_EQUAL); return UCOL_EQUAL; } @@ -8381,10 +8943,14 @@ ucol_strcoll( const UCollator *coll, if ( *pSrc != *pTarg || *pSrc == 0) { break; } + if(UCOL_ISTHAIPREVOWEL(*pSrc)) { + break; + } pSrc++; pTarg++; } if (*pSrc == 0 && *pTarg == 0) { + UTRACE_EXIT_VALUE(UCOL_EQUAL); return UCOL_EQUAL; } equalLength = pSrc - source; @@ -8395,6 +8961,7 @@ ucol_strcoll( const UCollator *coll, /* check if source and target are same strings */ if (source==target && sourceLength==targetLength) { + UTRACE_EXIT_VALUE(UCOL_EQUAL); return UCOL_EQUAL; } const UChar *pSrcEnd = source + sourceLength; @@ -8412,6 +8979,9 @@ ucol_strcoll( const UCollator *coll, if (*pSrc != *pTarg) { break; } + if(UCOL_ISTHAIPREVOWEL(*pSrc)) { // they are the same here, so any will do + break; + } pSrc++; pTarg++; } @@ -8420,6 +8990,7 @@ ucol_strcoll( const UCollator *coll, // If we made it all the way through both strings, we are done. They are == if ((pSrc ==pSrcEnd || (pSrcEnd latinOneUse || (sourceLength > 0 && *source&0xff00) || (targetLength > 0 && *target&0xff00)) { // Preparing the context objects for iterating over strings IInit_collIterate(coll, source, sourceLength, &sColl); IInit_collIterate(coll, target, targetLength, &tColl); - return ucol_strcollRegular(&sColl, &tColl, &status); + returnVal = ucol_strcollRegular(&sColl, &tColl, &status); } else { - return ucol_strcollUseLatin1(coll, source, sourceLength, target, targetLength, &status); + returnVal = ucol_strcollUseLatin1(coll, source, sourceLength, target, targetLength, &status); } + UTRACE_EXIT_VALUE(returnVal); + return returnVal; } /* convenience function for comparing strings */ @@ -8502,10 +9076,18 @@ ucol_equal( const UCollator *coll, /* returns the locale name the collation data comes from */ U_CAPI const char * U_EXPORT2 ucol_getLocale(const UCollator *coll, ULocDataLocaleType type, UErrorCode *status) { + return ucol_getLocaleByType(coll, type, status); +} + +U_CAPI const char * U_EXPORT2 +ucol_getLocaleByType(const UCollator *coll, ULocDataLocaleType type, UErrorCode *status) { const char *result = NULL; if(status == NULL || U_FAILURE(*status)) { return NULL; } + UTRACE_ENTRY(UTRACE_UCOL_GETLOCALE); + UTRACE_DATA1(UTRACE_INFO, "coll=%p", coll); + switch(type) { case ULOC_ACTUAL_LOCALE: // validLocale is set only if service registration has explicitly set the @@ -8522,7 +9104,7 @@ ucol_getLocale(const UCollator *coll, ULocDataLocaleType type, UErrorCode *statu result = coll->validLocale; } else if(coll->rb != NULL) { result = ures_getLocale(coll->rb, status); - } + } break; case ULOC_REQUESTED_LOCALE: result = coll->requestedLocale; @@ -8530,16 +9112,18 @@ ucol_getLocale(const UCollator *coll, ULocDataLocaleType type, UErrorCode *statu default: *status = U_ILLEGAL_ARGUMENT_ERROR; } + UTRACE_DATA1(UTRACE_INFO, "result = %s", result); + UTRACE_EXIT_STATUS(*status); return result; } U_CAPI USet * U_EXPORT2 -ucol_getTailoredSet(const UCollator *coll, UErrorCode *status) +ucol_getTailoredSet(const UCollator *coll, UErrorCode *status) { if(status == NULL || U_FAILURE(*status)) { return NULL; } - if(coll == NULL) { + if(coll == NULL || coll->UCA == NULL) { *status = U_ILLEGAL_ARGUMENT_ERROR; } UParseError parseError; @@ -8554,12 +9138,13 @@ ucol_getTailoredSet(const UCollator *coll, UErrorCode *status) // 3. USet is internally really UnicodeSet, C is just a wrapper UnicodeSet *tailored = new UnicodeSet(); UnicodeString pattern; - CanonicalIterator it("", *status); + UnicodeString empty; + CanonicalIterator it(empty, *status); // The idea is to tokenize the rule set. For each non-reset token, - // we add all the canonicaly equivalent FCD sequences - ucol_tok_initTokenList(&src, rules, rulesLen, UCA, status); + // we add all the canonicaly equivalent FCD sequences + ucol_tok_initTokenList(&src, rules, rulesLen, coll->UCA, status); while ((current = ucol_tok_parseNextToken(&src, startOfRules, &parseError, status)) != NULL) { startOfRules = FALSE; if(src.parsedToken.strength != UCOL_TOK_RESET) { @@ -8600,14 +9185,14 @@ ucol_equals(const UCollator *source, const UCollator *target) { if(sourceRulesLen == targetRulesLen && u_strncmp(sourceRules, targetRules, sourceRulesLen) == 0) { // all the attributes are equal and the rules are equal - collators are equal return(TRUE); - } + } // hard part, need to construct tree from rules and see if they yield the same tailoring UBool result = TRUE; UParseError parseError; UColTokenParser sourceParser, targetParser; int32_t sourceListLen = 0, targetListLen = 0; - ucol_tok_initTokenList(&sourceParser, sourceRules, sourceRulesLen, UCA, &status); - ucol_tok_initTokenList(&targetParser, targetRules, targetRulesLen, UCA, &status); + ucol_tok_initTokenList(&sourceParser, sourceRules, sourceRulesLen, source->UCA, &status); + ucol_tok_initTokenList(&targetParser, targetRules, targetRulesLen, target->UCA, &status); sourceListLen = ucol_tok_assembleTokenList(&sourceParser, &parseError, &status); targetListLen = ucol_tok_assembleTokenList(&targetParser, &parseError, &status); @@ -8687,4 +9272,119 @@ returnResult: return result; } + +U_CAPI void U_EXPORT2 +ucol_getUCAVersion(const UCollator* coll, UVersionInfo info) { + if(coll && coll->UCA) { + uprv_memcpy(info, coll->UCA->image->UCAVersion, sizeof(UVersionInfo)); + } +} + +U_CAPI int32_t U_EXPORT2 +ucol_cloneBinary(const UCollator *coll, + uint8_t *buffer, int32_t capacity, + UErrorCode *status) +{ + int32_t length = 0; + if(U_FAILURE(*status)) { + return length; + } + if(coll->hasRealData == TRUE) { + length = coll->image->size; + if(length <= capacity) { + uprv_memcpy(buffer, coll->image, length); + } + } else { + length = (int32_t)(paddedsize(sizeof(UCATableHeader))+paddedsize(sizeof(UColOptionSet))); + if(length <= capacity) { + /* build the UCATableHeader with minimal entries */ + /* do not copy the header from the UCA file because its values are wrong! */ + /* uprv_memcpy(result, UCA->image, sizeof(UCATableHeader)); */ + + /* reset everything */ + uprv_memset(buffer, 0, length); + + /* set the tailoring-specific values */ + UCATableHeader *myData = (UCATableHeader *)buffer; + myData->size = length; + + /* offset for the options, the only part of the data that is present after the header */ + myData->options = sizeof(UCATableHeader); + + /* need to always set the expansion value for an upper bound of the options */ + myData->expansion = myData->options + sizeof(UColOptionSet); + + myData->magic = UCOL_HEADER_MAGIC; + myData->isBigEndian = U_IS_BIG_ENDIAN; + myData->charSetFamily = U_CHARSET_FAMILY; + + /* copy UCA's version; genrb will override all but the builder version with tailoring data */ + uprv_memcpy(myData->version, coll->image->version, sizeof(UVersionInfo)); + + uprv_memcpy(myData->UCAVersion, coll->image->UCAVersion, sizeof(UVersionInfo)); + uprv_memcpy(myData->UCDVersion, coll->image->UCDVersion, sizeof(UVersionInfo)); + uprv_memcpy(myData->formatVersion, coll->image->formatVersion, sizeof(UVersionInfo)); + myData->jamoSpecial = coll->image->jamoSpecial; + + /* copy the collator options */ + uprv_memcpy(buffer+paddedsize(sizeof(UCATableHeader)), coll->options, sizeof(UColOptionSet)); + } + } + return length; +} + +U_CAPI UCollator* U_EXPORT2 +ucol_openBinary(const uint8_t *bin, int32_t length, + const UCollator *base, + UErrorCode *status) +{ + UCollator *result = NULL; + if(U_FAILURE(*status)){ + return NULL; + } + if(base == NULL) { + // we don't support null base yet + *status = U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + UCATableHeader *colData = (UCATableHeader *)bin; + // do we want version check here? We're trying to figure out whether collators are compatible + if(uprv_memcmp(colData->UCAVersion, base->image->UCAVersion, sizeof(UVersionInfo)) != 0 || + uprv_memcmp(colData->UCDVersion, base->image->UCDVersion, sizeof(UVersionInfo)) != 0 || + colData->version[0] != UCOL_BUILDER_VERSION) { + *status = U_COLLATOR_VERSION_MISMATCH; + return NULL; + } else { + if((uint32_t)length > (paddedsize(sizeof(UCATableHeader)) + paddedsize(sizeof(UColOptionSet)))) { + result = ucol_initCollator((const UCATableHeader *)bin, result, base, status); + if(U_FAILURE(*status)){ + return NULL; + } + result->hasRealData = TRUE; + } else { + if(base) { + result = ucol_initCollator(base->image, result, base, status); + ucol_setOptionsFromHeader(result, (UColOptionSet *)(bin+((const UCATableHeader *)bin)->options), status); + if(U_FAILURE(*status)){ + return NULL; + } + result->hasRealData = FALSE; + } else { + *status = U_USELESS_COLLATOR_ERROR; + return NULL; + } + } + result->freeImageOnClose = FALSE; + } + result->validLocale = NULL; + result->requestedLocale = NULL; + result->rules = NULL; + result->rulesLength = 0; + result->freeRulesOnClose = FALSE; + result->rb = NULL; + result->elements = NULL; + return result; +} + #endif /* #if !UCONFIG_NO_COLLATION */ + diff --git a/icuSources/i18n/ucol_bld.cpp b/icuSources/i18n/ucol_bld.cpp index f9bc084e..cfc5d6d3 100644 --- a/icuSources/i18n/ucol_bld.cpp +++ b/icuSources/i18n/ucol_bld.cpp @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2001-2003, International Business Machines +* Copyright (C) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -28,7 +28,7 @@ #include "umutex.h" #include "unicode/uniset.h" -static const InverseUCATableHeader* invUCA = NULL; +static const InverseUCATableHeader* _staticInvUCA = NULL; static UDataMemory* invUCA_DATA_MEM = NULL; U_CDECL_BEGIN @@ -40,15 +40,15 @@ isAcceptableInvUCA(void * /*context*/, if( pInfo->size>=20 && pInfo->isBigEndian==U_IS_BIG_ENDIAN && pInfo->charsetFamily==U_CHARSET_FAMILY && - pInfo->dataFormat[0]==invUcaDataInfo.dataFormat[0] && /* dataFormat="InvC" */ - pInfo->dataFormat[1]==invUcaDataInfo.dataFormat[1] && - pInfo->dataFormat[2]==invUcaDataInfo.dataFormat[2] && - pInfo->dataFormat[3]==invUcaDataInfo.dataFormat[3] && - pInfo->formatVersion[0]==invUcaDataInfo.formatVersion[0] && - pInfo->formatVersion[1]>=invUcaDataInfo.formatVersion[1] //&& - //pInfo->formatVersion[1]==invUcaDataInfo.formatVersion[1] && - //pInfo->formatVersion[2]==invUcaDataInfo.formatVersion[2] && - //pInfo->formatVersion[3]==invUcaDataInfo.formatVersion[3] && + pInfo->dataFormat[0]==INVUCA_DATA_FORMAT_0 && /* dataFormat="InvC" */ + pInfo->dataFormat[1]==INVUCA_DATA_FORMAT_1 && + pInfo->dataFormat[2]==INVUCA_DATA_FORMAT_2 && + pInfo->dataFormat[3]==INVUCA_DATA_FORMAT_3 && + pInfo->formatVersion[0]==INVUCA_FORMAT_VERSION_0 && + pInfo->formatVersion[1]>=INVUCA_FORMAT_VERSION_1 //&& + //pInfo->formatVersion[1]==INVUCA_FORMAT_VERSION_1 && + //pInfo->formatVersion[2]==INVUCA_FORMAT_VERSION_2 && + //pInfo->formatVersion[3]==INVUCA_FORMAT_VERSION_3 && ) { UVersionInfo UCDVersion; u_getUnicodeVersion(UCDVersion); @@ -68,11 +68,11 @@ isAcceptableInvUCA(void * /*context*/, U_CDECL_END static -int32_t ucol_inv_findCE(uint32_t CE, uint32_t SecondCE) { - uint32_t bottom = 0, top = invUCA->tableSize; +int32_t ucol_inv_findCE(const UColTokenParser *src, uint32_t CE, uint32_t SecondCE) { + uint32_t bottom = 0, top = src->invUCA->tableSize; uint32_t i = 0; uint32_t first = 0, second = 0; - uint32_t *CETable = (uint32_t *)((uint8_t *)invUCA+invUCA->table); + uint32_t *CETable = (uint32_t *)((uint8_t *)src->invUCA+src->invUCA->table); while(bottom < top-1) { i = (top+bottom)/2; @@ -116,13 +116,14 @@ static const uint32_t strengthMask[UCOL_CE_STRENGTH_LIMIT] = { 0xFFFFFFFF }; -U_CAPI int32_t U_EXPORT2 ucol_inv_getNextCE(uint32_t CE, uint32_t contCE, +U_CAPI int32_t U_EXPORT2 ucol_inv_getNextCE(const UColTokenParser *src, + uint32_t CE, uint32_t contCE, uint32_t *nextCE, uint32_t *nextContCE, uint32_t strength) { - uint32_t *CETable = (uint32_t *)((uint8_t *)invUCA+invUCA->table); + uint32_t *CETable = (uint32_t *)((uint8_t *)src->invUCA+src->invUCA->table); int32_t iCE; - iCE = ucol_inv_findCE(CE, contCE); + iCE = ucol_inv_findCE(src, CE, contCE); if(iCE<0) { *nextCE = UCOL_NOT_FOUND; @@ -144,13 +145,14 @@ U_CAPI int32_t U_EXPORT2 ucol_inv_getNextCE(uint32_t CE, uint32_t contCE, return iCE; } -U_CAPI int32_t U_EXPORT2 ucol_inv_getPrevCE(uint32_t CE, uint32_t contCE, +U_CAPI int32_t U_EXPORT2 ucol_inv_getPrevCE(const UColTokenParser *src, + uint32_t CE, uint32_t contCE, uint32_t *prevCE, uint32_t *prevContCE, uint32_t strength) { - uint32_t *CETable = (uint32_t *)((uint8_t *)invUCA+invUCA->table); + uint32_t *CETable = (uint32_t *)((uint8_t *)src->invUCA+src->invUCA->table); int32_t iCE; - iCE = ucol_inv_findCE(CE, contCE); + iCE = ucol_inv_findCE(src, CE, contCE); if(iCE<0) { *prevCE = UCOL_NOT_FOUND; @@ -174,17 +176,30 @@ U_CAPI int32_t U_EXPORT2 ucol_inv_getPrevCE(uint32_t CE, uint32_t contCE, return iCE; } +U_CAPI uint32_t U_EXPORT2 ucol_getCEStrengthDifference(uint32_t CE, uint32_t contCE, + uint32_t prevCE, uint32_t prevContCE) { + uint32_t strength = UCOL_TERTIARY; + while(((prevCE & strengthMask[strength]) != (CE & strengthMask[strength]) + || (prevContCE & strengthMask[strength]) != (contCE & strengthMask[strength])) + && strength) { + strength--; + } + return strength; + +} + + static -inline int32_t ucol_inv_getPrevious(UColTokListHeader *lh, uint32_t strength) { +inline int32_t ucol_inv_getPrevious(UColTokenParser *src, UColTokListHeader *lh, uint32_t strength) { uint32_t CE = lh->baseCE; uint32_t SecondCE = lh->baseContCE; - uint32_t *CETable = (uint32_t *)((uint8_t *)invUCA+invUCA->table); + uint32_t *CETable = (uint32_t *)((uint8_t *)src->invUCA+src->invUCA->table); uint32_t previousCE, previousContCE; int32_t iCE; - iCE = ucol_inv_findCE(CE, SecondCE); + iCE = ucol_inv_findCE(src, CE, SecondCE); if(iCE<0) { return -1; @@ -207,15 +222,15 @@ inline int32_t ucol_inv_getPrevious(UColTokListHeader *lh, uint32_t strength) { } static -inline int32_t ucol_inv_getNext(UColTokListHeader *lh, uint32_t strength) { +inline int32_t ucol_inv_getNext(UColTokenParser *src, UColTokListHeader *lh, uint32_t strength) { uint32_t CE = lh->baseCE; uint32_t SecondCE = lh->baseContCE; - uint32_t *CETable = (uint32_t *)((uint8_t *)invUCA+invUCA->table); + uint32_t *CETable = (uint32_t *)((uint8_t *)src->invUCA+src->invUCA->table); uint32_t nextCE, nextContCE; int32_t iCE; - iCE = ucol_inv_findCE(CE, SecondCE); + iCE = ucol_inv_findCE(src, CE, SecondCE); if(iCE<0) { return -1; @@ -242,7 +257,7 @@ inline int32_t ucol_inv_getNext(UColTokListHeader *lh, uint32_t strength) { U_CFUNC void ucol_inv_getGapPositions(UColTokenParser *src, UColTokListHeader *lh, UErrorCode *status) { /* reset all the gaps */ int32_t i = 0; - uint32_t *CETable = (uint32_t *)((uint8_t *)invUCA+invUCA->table); + uint32_t *CETable = (uint32_t *)((uint8_t *)src->invUCA+src->invUCA->table); uint32_t st = 0; uint32_t t1, t2; int32_t pos; @@ -265,7 +280,7 @@ U_CFUNC void ucol_inv_getGapPositions(UColTokenParser *src, UColTokListHeader *l UCAConstants *consts = (UCAConstants *)((uint8_t *)src->UCA->image + src->UCA->image->UCAConsts); - if(lh->baseCE >= (consts->UCA_PRIMARY_IMPLICIT_MIN<<24) && lh->baseCE < (consts->UCA_PRIMARY_IMPLICIT_MAX<<24) ) { /* implicits - */ + if((lh->baseCE & 0xFF000000)>= (consts->UCA_PRIMARY_IMPLICIT_MIN<<24) && (lh->baseCE & 0xFF000000) <= (consts->UCA_PRIMARY_IMPLICIT_MAX<<24) ) { /* implicits - */ //if(lh->baseCE >= PRIMARY_IMPLICIT_MIN && lh->baseCE < PRIMARY_IMPLICIT_MAX ) { /* implicits - */ lh->pos[0] = 0; t1 = lh->baseCE; @@ -273,16 +288,12 @@ U_CFUNC void ucol_inv_getGapPositions(UColTokenParser *src, UColTokListHeader *l lh->gapsLo[0] = (t1 & UCOL_PRIMARYMASK) | (t2 & UCOL_PRIMARYMASK) >> 16; lh->gapsLo[1] = (t1 & UCOL_SECONDARYMASK) << 16 | (t2 & UCOL_SECONDARYMASK) << 8; lh->gapsLo[2] = (UCOL_TERTIARYORDER(t1)) << 24 | (UCOL_TERTIARYORDER(t2)) << 16; - if(lh->baseCE < 0xEF000000) { - /* first implicits have three byte primaries, with a gap of one */ - /* so we esentially need to add 2 to the top byte in lh->baseContCE */ - t2 += 0x02000000; - } else { - /* second implicits have four byte primaries, with a gap of IMPLICIT_LAST2_MULTIPLIER_ */ - /* Now, this guy is not really accessible here, so until we find a better way to pass it */ - /* around, we'll assume that the gap is 1 */ - t2 += 0x00020000; - } + uint32_t primaryCE = t1 & UCOL_PRIMARYMASK | (t2 & UCOL_PRIMARYMASK) >> 16; + primaryCE = uprv_uca_getImplicitFromRaw(uprv_uca_getRawFromImplicit(primaryCE)+1); + + t1 = primaryCE & UCOL_PRIMARYMASK | 0x0505; + t2 = (primaryCE << 16) & UCOL_PRIMARYMASK | UCOL_CONTINUATION_MARKER; + lh->gapsHi[0] = (t1 & UCOL_PRIMARYMASK) | (t2 & UCOL_PRIMARYMASK) >> 16; lh->gapsHi[1] = (t1 & UCOL_SECONDARYMASK) << 16 | (t2 & UCOL_SECONDARYMASK) << 8; lh->gapsHi[2] = (UCOL_TERTIARYORDER(t1)) << 24 | (UCOL_TERTIARYORDER(t2)) << 16; @@ -302,7 +313,7 @@ U_CFUNC void ucol_inv_getGapPositions(UColTokenParser *src, UColTokListHeader *l } else { for(;;) { if(tokStrength < UCOL_CE_STRENGTH_LIMIT) { - if((lh->pos[tokStrength] = ucol_inv_getNext(lh, tokStrength)) >= 0) { + if((lh->pos[tokStrength] = ucol_inv_getNext(src, lh, tokStrength)) >= 0) { lh->fStrToken[tokStrength] = tok; } else { /* The CE must be implicit, since it's not in the table */ /* Error */ @@ -339,9 +350,11 @@ U_CFUNC void ucol_inv_getGapPositions(UColTokenParser *src, UColTokListHeader *l lh->gapsHi[3*st+1] = (t1 & UCOL_SECONDARYMASK) << 16 | (t2 & UCOL_SECONDARYMASK) << 8; //lh->gapsHi[3*st+2] = (UCOL_TERTIARYORDER(t1)) << 24 | (UCOL_TERTIARYORDER(t2)) << 16; lh->gapsHi[3*st+2] = (t1&0x3f) << 24 | (t2&0x3f) << 16; - pos--; - t1 = *(CETable+3*(pos)); - t2 = *(CETable+3*(pos)+1); + //pos--; + //t1 = *(CETable+3*(pos)); + //t2 = *(CETable+3*(pos)+1); + t1 = lh->baseCE; + t2 = lh->baseContCE; lh->gapsLo[3*st] = (t1 & UCOL_PRIMARYMASK) | (t2 & UCOL_PRIMARYMASK) >> 16; lh->gapsLo[3*st+1] = (t1 & UCOL_SECONDARYMASK) << 16 | (t2 & UCOL_SECONDARYMASK) << 8; lh->gapsLo[3*st+2] = (t1&0x3f) << 24 | (t2&0x3f) << 16; @@ -402,7 +415,14 @@ U_CFUNC uint32_t ucol_getCEGenerator(ucolCEGenerator *g, uint32_t* lows, uint32_ uint32_t strength = tok->strength; uint32_t low = lows[fStrength*3+strength]; uint32_t high = highs[fStrength*3+strength]; - uint32_t maxByte = (strength == UCOL_TERTIARY)?0x3F:0xFF; + uint32_t maxByte = 0; + if(strength == UCOL_TERTIARY) { + maxByte = 0x3F; + } else if(strength == UCOL_PRIMARY) { + maxByte = 0xFE; + } else { + maxByte = 0xFF; + } uint32_t count = tok->toInsert; @@ -439,9 +459,10 @@ U_CFUNC uint32_t ucol_getCEGenerator(ucolCEGenerator *g, uint32_t* lows, uint32_ if(high > (UCOL_COMMON_BOT2<<24) && high < (uint32_t)(UCOL_COMMON_TOP2<<24)) { high = UCOL_COMMON_TOP2<<24; } - if(low < UCOL_COMMON_BOT2<<24) { - g->noOfRanges = ucol_allocWeights(UCOL_COMMON_TOP2<<24, high, count, maxByte, g->ranges); - g->current = UCOL_COMMON_BOT2; + if(low < (UCOL_COMMON_BOT2<<24)) { + g->noOfRanges = ucol_allocWeights(UCOL_BYTE_UNSHIFTED_MIN<<24, high, count, maxByte, g->ranges); + g->current = ucol_nextWeight(g->ranges, &g->noOfRanges); + //g->current = UCOL_COMMON_BOT2<<24; return g->current; } } @@ -454,7 +475,127 @@ U_CFUNC uint32_t ucol_getCEGenerator(ucolCEGenerator *g, uint32_t* lows, uint32_ return g->current; } -U_CFUNC void ucol_doCE(uint32_t *CEparts, UColToken *tok) { +static +uint32_t u_toLargeKana(const UChar *source, const uint32_t sourceLen, UChar *resBuf, const uint32_t resLen, UErrorCode *status) { + uint32_t i = 0; + UChar c; + + if(U_FAILURE(*status)) { + return 0; + } + + if(sourceLen > resLen) { + *status = U_MEMORY_ALLOCATION_ERROR; + return 0; + } + + for(i = 0; i < sourceLen; i++) { + c = source[i]; + if(0x3042 < c && c < 0x30ef) { /* Kana range */ + switch(c - 0x3000) { + case 0x41: case 0x43: case 0x45: case 0x47: case 0x49: case 0x63: case 0x83: case 0x85: case 0x8E: + case 0xA1: case 0xA3: case 0xA5: case 0xA7: case 0xA9: case 0xC3: case 0xE3: case 0xE5: case 0xEE: + c++; + break; + case 0xF5: + c = 0x30AB; + break; + case 0xF6: + c = 0x30B1; + break; + } + } + resBuf[i] = c; + } + return sourceLen; +} + +static +uint32_t u_toSmallKana(const UChar *source, const uint32_t sourceLen, UChar *resBuf, const uint32_t resLen, UErrorCode *status) { + uint32_t i = 0; + UChar c; + + if(U_FAILURE(*status)) { + return 0; + } + + if(sourceLen > resLen) { + *status = U_MEMORY_ALLOCATION_ERROR; + return 0; + } + + for(i = 0; i < sourceLen; i++) { + c = source[i]; + if(0x3042 < c && c < 0x30ef) { /* Kana range */ + switch(c - 0x3000) { + case 0x42: case 0x44: case 0x46: case 0x48: case 0x4A: case 0x64: case 0x84: case 0x86: case 0x8F: + case 0xA2: case 0xA4: case 0xA6: case 0xA8: case 0xAA: case 0xC4: case 0xE4: case 0xE6: case 0xEF: + c--; + break; + case 0xAB: + c = 0x30F5; + break; + case 0xB1: + c = 0x30F6; + break; + } + } + resBuf[i] = c; + } + return sourceLen; +} + +static +uint8_t ucol_uprv_getCaseBits(const UCollator *UCA, const UChar *src, uint32_t len, UErrorCode *status) { + uint32_t i = 0; + UChar n[128]; + uint32_t nLen = 0; + uint32_t uCount = 0, lCount = 0; + + collIterate s; + uint32_t order = 0; + + if(U_FAILURE(*status)) { + return UCOL_LOWER_CASE; + } + + nLen = unorm_normalize(src, len, UNORM_NFKD, 0, n, 128, status); + if(U_SUCCESS(*status)) { + for(i = 0; i < nLen; i++) { + uprv_init_collIterate(UCA, &n[i], 1, &s); + order = ucol_getNextCE(UCA, &s, status); + if(isContinuation(order)) { + *status = U_INTERNAL_PROGRAM_ERROR; + return UCOL_LOWER_CASE; + } + if((order&UCOL_CASE_BIT_MASK)== UCOL_UPPER_CASE) { + uCount++; + } else { + if(u_islower(n[i])) { + lCount++; + } else { + UChar sk[1], lk[1]; + u_toSmallKana(&n[i], 1, sk, 1, status); + u_toLargeKana(&n[i], 1, lk, 1, status); + if(sk[0] == n[i] && lk[0] != n[i]) { + lCount++; + } + } + } + } + } + + if(uCount != 0 && lCount != 0) { + return UCOL_MIXED_CASE; + } else if(uCount != 0) { + return UCOL_UPPER_CASE; + } else { + return UCOL_LOWER_CASE; + } +} + + +U_CFUNC void ucol_doCE(UColTokenParser *src, uint32_t *CEparts, UColToken *tok, UErrorCode *status) { /* this one makes the table and stuff */ uint32_t noOfBytes[3]; uint32_t i; @@ -494,6 +635,22 @@ U_CFUNC void ucol_doCE(uint32_t *CEparts, UColToken *tok) { tok->noOfCEs = CEi; } + + // we want to set case bits here and now, not later. + // Case bits handling + tok->CEs[0] &= 0xFFFFFF3F; // Clean the case bits field + int32_t cSize = (tok->source & 0xFF000000) >> 24; + UChar *cPoints = (tok->source & 0x00FFFFFF) + src->source; + + if(cSize > 1) { + // Do it manually + tok->CEs[0] |= ucol_uprv_getCaseBits(src->UCA, cPoints, cSize, status); + } else { + // Copy it from the UCA + uint32_t caseCE = ucol_getFirstCE(src->UCA, cPoints[0], status); + tok->CEs[0] |= (caseCE & 0xC0); + } + #if UCOL_DEBUG==2 fprintf(stderr, "%04X str: %i, [%08X, %08X, %08X]: tok: ", tok->debugSource, tok->strength, CEparts[0] >> (32-8*noOfBytes[0]), CEparts[1] >> (32-8*noOfBytes[1]), CEparts[2]>> (32-8*noOfBytes[2])); for(i = 0; inoOfCEs; i++) { @@ -604,130 +761,11 @@ U_CFUNC void ucol_initBuffers(UColTokenParser *src, UColTokListHeader *lh, UErro CEparts[UCOL_TERTIARY] = ucol_getSimpleCEGenerator(&Gens[UCOL_TERTIARY], tok, UCOL_TERTIARY, status); } } - ucol_doCE(CEparts, tok); + ucol_doCE(src, CEparts, tok, status); tok = tok->next; } } -static -uint32_t u_toLargeKana(const UChar *source, const uint32_t sourceLen, UChar *resBuf, const uint32_t resLen, UErrorCode *status) { - uint32_t i = 0; - UChar c; - - if(U_FAILURE(*status)) { - return 0; - } - - if(sourceLen > resLen) { - *status = U_MEMORY_ALLOCATION_ERROR; - return 0; - } - - for(i = 0; i < sourceLen; i++) { - c = source[i]; - if(0x3042 < c && c < 0x30ef) { /* Kana range */ - switch(c - 0x3000) { - case 0x41: case 0x43: case 0x45: case 0x47: case 0x49: case 0x63: case 0x83: case 0x85: case 0x8E: - case 0xA1: case 0xA3: case 0xA5: case 0xA7: case 0xA9: case 0xC3: case 0xE3: case 0xE5: case 0xEE: - c++; - break; - case 0xF5: - c = 0x30AB; - break; - case 0xF6: - c = 0x30B1; - break; - } - } - resBuf[i] = c; - } - return sourceLen; -} - -static -uint32_t u_toSmallKana(const UChar *source, const uint32_t sourceLen, UChar *resBuf, const uint32_t resLen, UErrorCode *status) { - uint32_t i = 0; - UChar c; - - if(U_FAILURE(*status)) { - return 0; - } - - if(sourceLen > resLen) { - *status = U_MEMORY_ALLOCATION_ERROR; - return 0; - } - - for(i = 0; i < sourceLen; i++) { - c = source[i]; - if(0x3042 < c && c < 0x30ef) { /* Kana range */ - switch(c - 0x3000) { - case 0x42: case 0x44: case 0x46: case 0x48: case 0x4A: case 0x64: case 0x84: case 0x86: case 0x8F: - case 0xA2: case 0xA4: case 0xA6: case 0xA8: case 0xAA: case 0xC4: case 0xE4: case 0xE6: case 0xEF: - c--; - break; - case 0xAB: - c = 0x30F5; - break; - case 0xB1: - c = 0x30F6; - break; - } - } - resBuf[i] = c; - } - return sourceLen; -} - -static -uint8_t ucol_uprv_getCaseBits(const UCollator *UCA, const UChar *src, uint32_t len, UErrorCode *status) { - uint32_t i = 0; - UChar n[128]; - uint32_t nLen = 0; - uint32_t uCount = 0, lCount = 0; - - collIterate s; - uint32_t order = 0; - - if(U_FAILURE(*status)) { - return UCOL_LOWER_CASE; - } - - nLen = unorm_normalize(src, len, UNORM_NFKD, 0, n, 128, status); - if(U_SUCCESS(*status)) { - for(i = 0; i < nLen; i++) { - uprv_init_collIterate(UCA, &n[i], 1, &s); - order = ucol_getNextCE(UCA, &s, status); - if(isContinuation(order)) { - *status = U_INTERNAL_PROGRAM_ERROR; - return UCOL_LOWER_CASE; - } - if((order&UCOL_CASE_BIT_MASK)== UCOL_UPPER_CASE) { - uCount++; - } else { - if(u_islower(n[i])) { - lCount++; - } else { - UChar sk[1], lk[1]; - u_toSmallKana(&n[i], 1, sk, 1, status); - u_toLargeKana(&n[i], 1, lk, 1, status); - if(sk[0] == n[i] && lk[0] != n[i]) { - lCount++; - } - } - } - } - } - - if(uCount != 0 && lCount != 0) { - return UCOL_MIXED_CASE; - } else if(uCount != 0) { - return UCOL_UPPER_CASE; - } else { - return UCOL_LOWER_CASE; - } -} - U_CFUNC void ucol_createElements(UColTokenParser *src, tempUCATable *t, UColTokListHeader *lh, UErrorCode *status) { UCAElements el; UColToken *tok = lh->first; @@ -834,6 +872,8 @@ U_CFUNC void ucol_createElements(UColTokenParser *src, tempUCATable *t, UColTokL } } +#if 0 + // we do case bits in doCE now, since we will mess up expansions otherwise. // Case bits handling el.CEs[0] &= 0xFFFFFF3F; // Clean the case bits field if(el.cSize > 1) { @@ -844,6 +884,7 @@ U_CFUNC void ucol_createElements(UColTokenParser *src, tempUCATable *t, UColTokL uint32_t caseCE = ucol_getFirstCE(src->UCA, el.cPoints[0], status); el.CEs[0] |= (caseCE & 0xC0); } +#endif /* and then, add it */ #if UCOL_DEBUG==2 @@ -1036,7 +1077,12 @@ UCATableHeader *ucol_assembleTailoringTable(UColTokenParser *src, UErrorCode *st /* We stuff the initial value in the buffers, and increase the appropriate buffer */ /* According to strength */ if(U_SUCCESS(*status)) { - ucol_initBuffers(src, &src->lh[i], status); + if(src->lh[i].first) { // if there are any elements + // due to the way parser works, subsequent tailorings + // may remove all the elements from a sequence, therefore + // leaving an empty tailoring sequence. + ucol_initBuffers(src, &src->lh[i], status); + } } if(U_FAILURE(*status)) { return NULL; @@ -1062,7 +1108,7 @@ UCATableHeader *ucol_assembleTailoringTable(UColTokenParser *src, UErrorCode *st } - tempUCATable *t = uprv_uca_initTempTable(image, src->opts, src->UCA, NOT_FOUND_TAG, status); + tempUCATable *t = uprv_uca_initTempTable(image, src->opts, src->UCA, NOT_FOUND_TAG, NOT_FOUND_TAG, status); /* After this, we have assigned CE values to all regular CEs */ @@ -1129,7 +1175,7 @@ UCATableHeader *ucol_assembleTailoringTable(UColTokenParser *src, UErrorCode *st el.cSize = 2; } ucol_setText(ucaEl, el.uchars, el.cSize, status); - while ((el.CEs[el.noOfCEs] = ucol_next(ucaEl, status)) != UCOL_NULLORDER) { + while ((int32_t)(el.CEs[el.noOfCEs] = ucol_next(ucaEl, status)) != UCOL_NULLORDER) { el.noOfCEs++; } uprv_uca_addAnElement(t, &el, status); @@ -1161,14 +1207,16 @@ UCATableHeader *ucol_assembleTailoringTable(UColTokenParser *src, UErrorCode *st return myData; } -UBool +U_CDECL_BEGIN +static UBool U_CALLCONV ucol_bld_cleanup(void) { udata_close(invUCA_DATA_MEM); invUCA_DATA_MEM = NULL; - invUCA = NULL; + _staticInvUCA = NULL; return TRUE; } +U_CDECL_END U_CAPI const InverseUCATableHeader * U_EXPORT2 ucol_initInverseUCA(UErrorCode *status) @@ -1176,7 +1224,7 @@ ucol_initInverseUCA(UErrorCode *status) if(U_FAILURE(*status)) return NULL; umtx_lock(NULL); - UBool f = (invUCA == NULL); + UBool f = (_staticInvUCA == NULL); umtx_unlock(NULL); if(f) { @@ -1203,8 +1251,8 @@ ucol_initInverseUCA(UErrorCode *status) } umtx_lock(NULL); - if(invUCA == NULL) { - invUCA = newInvUCA; + if(_staticInvUCA == NULL) { + _staticInvUCA = newInvUCA; invUCA_DATA_MEM = result; result = NULL; newInvUCA = NULL; @@ -1218,11 +1266,11 @@ ucol_initInverseUCA(UErrorCode *status) //uprv_free(newInvUCA); } else { - ucln_i18n_registerCleanup(); + ucln_i18n_registerCleanup(UCLN_I18N_UCOL_BLD, ucol_bld_cleanup); } } } - return invUCA; + return _staticInvUCA; } #endif /* #if !UCONFIG_NO_COLLATION */ diff --git a/icuSources/i18n/ucol_cnt.cpp b/icuSources/i18n/ucol_cnt.cpp index 5f9bfb32..0e57a3bb 100644 --- a/icuSources/i18n/ucol_cnt.cpp +++ b/icuSources/i18n/ucol_cnt.cpp @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2001, International Business Machines +* Copyright (C) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -28,7 +28,7 @@ U_NAMESPACE_BEGIN -void uprv_growTable(ContractionTable *tbl, UErrorCode *status) { +static void uprv_growTable(ContractionTable *tbl, UErrorCode *status) { if(tbl->position == tbl->size) { uint32_t *newData = (uint32_t *)uprv_realloc(tbl->CEs, 2*tbl->size*sizeof(uint32_t)); if(newData == NULL) { @@ -212,7 +212,11 @@ uprv_cnttab_constructTable(CntTable *table, uint32_t mainOffset, UErrorCode *sta CEPointer += size; } - + // TODO: this one apparently updates the contraction CEs to point to a real address (relative to the + // start of the flat file). However, what is done below is just wrong and it affects building of + // tailorings that have constructions in a bad way. At least, one should enumerate the trie. Also, + // keeping a list of code points that are contractions might be smart, although I'm not sure if it's + // feasible. uint32_t CE; for(i = 0; i<=0x10FFFF; i++) { /*CE = ucmpe32_get(table->mapping, i);*/ @@ -228,7 +232,7 @@ uprv_cnttab_constructTable(CntTable *table, uint32_t mainOffset, UErrorCode *sta return table->position; } -ContractionTable *uprv_cnttab_cloneContraction(ContractionTable *t, UErrorCode *status) { +static ContractionTable *uprv_cnttab_cloneContraction(ContractionTable *t, UErrorCode *status) { ContractionTable *r = (ContractionTable *)uprv_malloc(sizeof(ContractionTable)); if(r == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; diff --git a/icuSources/i18n/ucol_elm.cpp b/icuSources/i18n/ucol_elm.cpp index 60adbbcb..dd070391 100644 --- a/icuSources/i18n/ucol_elm.cpp +++ b/icuSources/i18n/ucol_elm.cpp @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2001-2003, International Business Machines +* Copyright (C) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -108,7 +108,7 @@ static int32_t uprv_uca_addExpansion(ExpansionTable *expansions, uint32_t value, } U_CAPI tempUCATable* U_EXPORT2 -uprv_uca_initTempTable(UCATableHeader *image, UColOptionSet *opts, const UCollator *UCA, UColCETags initTag, UErrorCode *status) { +uprv_uca_initTempTable(UCATableHeader *image, UColOptionSet *opts, const UCollator *UCA, UColCETags initTag, UColCETags supplementaryInitTag, UErrorCode *status) { tempUCATable *t = (tempUCATable *)uprv_malloc(sizeof(tempUCATable)); /* test for NULL */ if (t == NULL) { @@ -147,7 +147,12 @@ uprv_uca_initTempTable(UCATableHeader *image, UColOptionSet *opts, const UCollat } uprv_memset(t->expansions, 0, sizeof(ExpansionTable)); /*t->mapping = ucmpe32_open(UCOL_SPECIAL_FLAG | (initTag<<24), UCOL_SPECIAL_FLAG | (SURROGATE_TAG<<24), UCOL_SPECIAL_FLAG | (LEAD_SURROGATE_TAG<<24), status);*/ - t->mapping = utrie_open(NULL, NULL, 0x100000, UCOL_SPECIAL_FLAG | (initTag<<24), TRUE); // Do your own mallocs for the structure, array and have linear Latin 1 + /*t->mapping = utrie_open(NULL, NULL, 0x100000, UCOL_SPECIAL_FLAG | (initTag<<24), TRUE); // Do your own mallocs for the structure, array and have linear Latin 1*/ + + t->mapping = utrie_open(NULL, NULL, 0x100000, + UCOL_SPECIAL_FLAG | (initTag<<24), + UCOL_SPECIAL_FLAG | (supplementaryInitTag << 24), + TRUE); // Do your own mallocs for the structure, array and have linear Latin 1 t->prefixLookup = uhash_open(prefixLookupHash, prefixLookupComp, status); uhash_setValueDeleter(t->prefixLookup, uhash_freeBlock); @@ -254,7 +259,7 @@ uprv_uca_cloneTempTable(tempUCATable *t, UErrorCode *status) { *status = U_MEMORY_ALLOCATION_ERROR; return NULL; } - uprv_memcpy(r->expansions->CEs, t->expansions->CEs, sizeof(uint32_t)*t->expansions->size); + uprv_memcpy(r->expansions->CEs, t->expansions->CEs, sizeof(uint32_t)*t->expansions->position); } else { r->expansions->CEs = NULL; } @@ -281,7 +286,7 @@ uprv_uca_cloneTempTable(tempUCATable *t, UErrorCode *status) { *status = U_MEMORY_ALLOCATION_ERROR; return NULL; } - uprv_memcpy(r->maxExpansions->endExpansionCE, t->maxExpansions->endExpansionCE, t->maxExpansions->size*sizeof(uint32_t)); + uprv_memcpy(r->maxExpansions->endExpansionCE, t->maxExpansions->endExpansionCE, t->maxExpansions->position*sizeof(uint32_t)); } else { r->maxExpansions->endExpansionCE = NULL; } @@ -292,7 +297,7 @@ uprv_uca_cloneTempTable(tempUCATable *t, UErrorCode *status) { *status = U_MEMORY_ALLOCATION_ERROR; return NULL; } - uprv_memcpy(r->maxExpansions->expansionCESize, t->maxExpansions->expansionCESize, t->maxExpansions->size*sizeof(uint8_t)); + uprv_memcpy(r->maxExpansions->expansionCESize, t->maxExpansions->expansionCESize, t->maxExpansions->position*sizeof(uint8_t)); } else { r->maxExpansions->expansionCESize = NULL; } @@ -317,14 +322,14 @@ uprv_uca_cloneTempTable(tempUCATable *t, UErrorCode *status) { *status = U_MEMORY_ALLOCATION_ERROR; return NULL; } - uprv_memcpy(r->maxJamoExpansions->endExpansionCE, t->maxJamoExpansions->endExpansionCE, t->maxJamoExpansions->size*sizeof(uint32_t)); + uprv_memcpy(r->maxJamoExpansions->endExpansionCE, t->maxJamoExpansions->endExpansionCE, t->maxJamoExpansions->position*sizeof(uint32_t)); r->maxJamoExpansions->isV = (UBool *)uprv_malloc(sizeof(UBool)*t->maxJamoExpansions->size); /* test for NULL */ if (r->maxJamoExpansions->isV == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; return NULL; } - uprv_memcpy(r->maxJamoExpansions->isV, t->maxJamoExpansions->isV, t->maxJamoExpansions->size*sizeof(UBool)); + uprv_memcpy(r->maxJamoExpansions->isV, t->maxJamoExpansions->isV, t->maxJamoExpansions->position*sizeof(UBool)); } else { r->maxJamoExpansions->endExpansionCE = NULL; r->maxJamoExpansions->isV = NULL; @@ -401,7 +406,7 @@ uprv_uca_closeTempTable(tempUCATable *t) { * @param status error status * @returns size of the maxexpansion and maxsize used. */ -int uprv_uca_setMaxExpansion(uint32_t endexpansion, +static int uprv_uca_setMaxExpansion(uint32_t endexpansion, uint8_t expansionsize, MaxExpansionTable *maxexpansion, UErrorCode *status) @@ -465,7 +470,7 @@ int uprv_uca_setMaxExpansion(uint32_t endexpansion, start = mid; } } - + if (*start == endexpansion) { result = start - pendexpansionce; } @@ -473,7 +478,7 @@ int uprv_uca_setMaxExpansion(uint32_t endexpansion, if (*limit == endexpansion) { result = limit - pendexpansionce; } - + if (result > -1) { /* found the ce in expansion, we'll just modify the size if it is smaller */ @@ -489,9 +494,9 @@ int uprv_uca_setMaxExpansion(uint32_t endexpansion, int shiftsize = (pendexpansionce + pos) - start; uint32_t *shiftpos = start + 1; uint8_t *sizeshiftpos = pexpansionsize + (shiftpos - pendexpansionce); - + /* okay need to rearrange the array into sorted order */ - if (shiftsize == 0 || *(pendexpansionce + pos) < endexpansion) { + if (shiftsize == 0 /*|| *(pendexpansionce + pos) < endexpansion*/) { /* the commented part is actually both redundant and dangerous */ *(pendexpansionce + pos + 1) = endexpansion; *(pexpansionsize + pos + 1) = expansionsize; } @@ -543,7 +548,7 @@ int uprv_uca_setMaxExpansion(uint32_t endexpansion, * @param status error status * @returns size of the maxexpansion and maxsize used. */ -int uprv_uca_setMaxJamoExpansion(UChar ch, +static int uprv_uca_setMaxJamoExpansion(UChar ch, uint32_t endexpansion, uint8_t expansionsize, MaxJamoExpansionTable *maxexpansion, @@ -626,7 +631,7 @@ int uprv_uca_setMaxJamoExpansion(UChar ch, *(pendexpansionce + maxexpansion->position) = endexpansion; *(maxexpansion->isV + maxexpansion->position) = isV; maxexpansion->position ++; - + return maxexpansion->position; } @@ -700,7 +705,7 @@ static void uprv_uca_unsafeCPAddCCNZ(tempUCATable *t, UErrorCode *status) { } } -uint32_t uprv_uca_addPrefix(tempUCATable *t, uint32_t CE, +static uint32_t uprv_uca_addPrefix(tempUCATable *t, uint32_t CE, UCAElements *element, UErrorCode *status) { // currently the longest prefix we're supporting in Japanese is two characters // long. Although this table could quite easily mimic complete contraction stuff @@ -820,7 +825,7 @@ uint32_t uprv_uca_addPrefix(tempUCATable *t, uint32_t CE, // in the contraction, it is going to be handled as a pair of code units, // as it doesn't affect the performance AND handling surrogates specially // would complicate code way too much. -uint32_t uprv_uca_addContraction(tempUCATable *t, uint32_t CE, +static uint32_t uprv_uca_addContraction(tempUCATable *t, uint32_t CE, UCAElements *element, UErrorCode *status) { CntTable *contractions = t->contractions; UChar32 cp; @@ -1007,26 +1012,12 @@ uprv_uca_addAnElement(tempUCATable *t, UCAElements *element, UErrorCode *status) if(U_FAILURE(*status)) { return 0xFFFF; } + + element->mapCE = 0; // clear mapCE so that we can catch expansions + if(element->noOfCEs == 1) { if(element->isThai == FALSE) { - UChar32 uniChar = 0; - //printElement(element); - if ((element->cSize == 2) && U16_IS_LEAD(element->uchars[0])){ - uniChar = U16_GET_SUPPLEMENTARY(element->uchars[0], element->uchars[1]); - - } else if (element->cSize == 1){ - uniChar = element->uchars[0]; - - } - - if (uniChar != 0 && u_isdigit(uniChar)){ - expansion = (uint32_t)(UCOL_SPECIAL_FLAG | (DIGIT_TAG<CEs[0], status)+(headersize>>2))<<4) - | 0x1); - element->mapCE = expansion; - unsafeCPSet(t->unsafeCP, uniChar); - }else - element->mapCE = element->CEs[0]; + element->mapCE = element->CEs[0]; } else { /* add thai - totally bad here */ expansion = (uint32_t)(UCOL_SPECIAL_FLAG | (THAI_TAG<CEs[0], status)+(headersize>>2))<<4) @@ -1060,27 +1051,10 @@ uprv_uca_addAnElement(tempUCATable *t, UCAElements *element, UErrorCode *status) | ((element->CEs[0]>>8) & 0xFFFF00) // first and second byte of primary | ((element->CEs[1]>>24) & 0xFF); // third byte of primary } else { - - /* Checking here to see if we should insert the DIGIT_TAG or the EXPANSION_TAG */ - UChar32 uniChar = 0; - - if ((element->cSize == 2) && U16_IS_LEAD(element->uchars[0])){ - uniChar = U16_GET_SUPPLEMENTARY(element->uchars[0], element->uchars[1]); - } else if (element->cSize == 1){ - uniChar = element->uchars[0]; - } - - if (uniChar != 0 && u_isdigit(uniChar)){ - expansion = (uint32_t)(UCOL_SPECIAL_FLAG | (DIGIT_TAG<CEs[0], status)+(headersize>>2))<<4) - | 0x1); - unsafeCPSet(t->unsafeCP, uniChar); - }else{ - expansion = (uint32_t)(UCOL_SPECIAL_FLAG | (EXPANSION_TAG<CEs[0], status)+(headersize>>2))<<4) - & 0xFFFFF0); - } - + expansion = (uint32_t)(UCOL_SPECIAL_FLAG | (EXPANSION_TAG<CEs[0], status)+(headersize>>2))<<4) + & 0xFFFFF0); + for(i = 1; inoOfCEs; i++) { uprv_uca_addExpansion(expansions, element->CEs[i], status); } @@ -1105,6 +1079,37 @@ uprv_uca_addAnElement(tempUCATable *t, UCAElements *element, UErrorCode *status) } } + // We treat digits differently - they are "uber special" and should be + // processed differently if numeric collation is on. + UChar32 uniChar = 0; + //printElement(element); + if ((element->cSize == 2) && U16_IS_LEAD(element->uchars[0])){ + uniChar = U16_GET_SUPPLEMENTARY(element->uchars[0], element->uchars[1]); + } else if (element->cSize == 1){ + uniChar = element->uchars[0]; + } + + // Here, we either have one normal CE OR mapCE is set. Therefore, we stuff only + // one element to the expansion buffer. When we encounter a digit and we don't + // do numeric collation, we will just pick the CE we have and break out of case + // (see ucol.cpp ucol_prv_getSpecialCE && ucol_prv_getSpecialPrevCE). If we picked + // a special, further processing will occur. If it's a simple CE, we'll return due + // to how the loop is constructed. + if (uniChar != 0 && u_isdigit(uniChar)){ + expansion = (uint32_t)(UCOL_SPECIAL_FLAG | (DIGIT_TAG<mapCE) { // if there is an expansion, we'll pick it here + expansion |= ((uprv_uca_addExpansion(expansions, element->mapCE, status)+(headersize>>2))<<4); + } else { + expansion |= ((uprv_uca_addExpansion(expansions, element->CEs[0], status)+(headersize>>2))<<4); + } + element->mapCE = expansion; + + // Need to go back to the beginning of the digit string if in the middle! + if(uniChar <= 0xFFFF) { // supplementaries are always unsafe. API takes UChars + unsafeCPSet(t->unsafeCP, (UChar)uniChar); + } + } + // here we want to add the prefix structure. // I will try to process it as a reverse contraction, if possible. // prefix buffer is already reversed. @@ -1176,7 +1181,7 @@ uprv_uca_addAnElement(tempUCATable *t, UCAElements *element, UErrorCode *status) /*void uprv_uca_getMaxExpansionJamo(CompactEIntArray *mapping, */ -void uprv_uca_getMaxExpansionJamo(UNewTrie *mapping, +static void uprv_uca_getMaxExpansionJamo(UNewTrie *mapping, MaxExpansionTable *maxexpansion, MaxJamoExpansionTable *maxjamoexpansion, UBool jamospecial, @@ -1186,7 +1191,7 @@ void uprv_uca_getMaxExpansionJamo(UNewTrie *mapping, const uint32_t TBASE = 0x11A8; const uint32_t VCOUNT = 21; const uint32_t TCOUNT = 28; - + uint32_t v = VBASE + VCOUNT - 1; uint32_t t = TBASE + TCOUNT - 1; uint32_t ce; @@ -1346,7 +1351,20 @@ uprv_uca_assembleTable(tempUCATable *t, UErrorCode *status) { } UCATableHeader *myData = (UCATableHeader *)dataStart; - uprv_memcpy(myData, t->image, sizeof(UCATableHeader)); + // Please, do reset all the fields! + uprv_memset(dataStart, 0, toAllocate); + // Make sure we know this is reset + myData->magic = UCOL_HEADER_MAGIC; + myData->isBigEndian = U_IS_BIG_ENDIAN; + myData->charSetFamily = U_CHARSET_FAMILY; + myData->formatVersion[0] = UCA_FORMAT_VERSION_0; + myData->formatVersion[1] = UCA_FORMAT_VERSION_1; + myData->formatVersion[2] = UCA_FORMAT_VERSION_2; + myData->formatVersion[3] = UCA_FORMAT_VERSION_3; + myData->jamoSpecial = t->image->jamoSpecial; + + // Don't copy stuff from UCA header! + //uprv_memcpy(myData, t->image, sizeof(UCATableHeader)); myData->contractionSize = contractionsSize; @@ -1377,7 +1395,7 @@ uprv_uca_assembleTable(tempUCATable *t, UErrorCode *status) { tableOffset += (uint32_t)(paddedsize(contractionsSize*sizeof(uint32_t))); } else { myData->contractionIndex = 0; - myData->contractionIndex = 0; + myData->contractionCEs = 0; } /* copy mapping table */ @@ -1391,11 +1409,13 @@ uprv_uca_assembleTable(tempUCATable *t, UErrorCode *status) { // This is debug code to dump the contents of the trie. It needs two functions defined above { UTrie UCAt = { 0 }; + uint32_t trieWord; utrie_unserialize(&UCAt, dataStart+tableOffset, 9999999, status); UCAt.getFoldingOffset = myGetFoldingOffset; if(U_SUCCESS(*status)) { utrie_enum(&UCAt, NULL, enumRange, NULL); } + trieWord = UTRIE_GET32_FROM_LEAD(UCAt, 0xDC01) } #endif tableOffset += paddedsize(mappingSize); @@ -1510,7 +1530,7 @@ _enumCategoryRangeClosureCategory(const void *context, UChar32 start, UChar32 li el.prefixSize = 0; el.noOfCEs = 0; ucol_setText(colEl, decomp, noOfDec, status); - while((el.CEs[el.noOfCEs] = ucol_next(colEl, status)) != UCOL_NULLORDER) { + while((el.CEs[el.noOfCEs] = ucol_next(colEl, status)) != (uint32_t)UCOL_NULLORDER) { el.noOfCEs++; } } else { @@ -1551,7 +1571,7 @@ uprv_uca_canonicalClosure(tempUCATable *t, UErrorCode *status) tempUCATable *tempTable = uprv_uca_cloneTempTable(t, status); UCATableHeader *tempData = uprv_uca_assembleTable(tempTable, status); - tempColl = ucol_initCollator(tempData, 0, status); + tempColl = ucol_initCollator(tempData, 0, t->UCA, status); uprv_uca_closeTempTable(tempTable); if(U_SUCCESS(*status)) { @@ -1582,4 +1602,6 @@ uprv_uca_canonicalClosure(tempUCATable *t, UErrorCode *status) U_NAMESPACE_END -#endif /* #if !UCONFIG_NO_COLLATION */ \ No newline at end of file +#endif /* #if !UCONFIG_NO_COLLATION */ + + diff --git a/icuSources/i18n/ucol_elm.h b/icuSources/i18n/ucol_elm.h index ef07c553..3ffd204a 100644 --- a/icuSources/i18n/ucol_elm.h +++ b/icuSources/i18n/ucol_elm.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2000-2001, International Business Machines +* Copyright (C) 2000-2003, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -91,7 +91,7 @@ typedef struct { UHashtable *prefixLookup; } tempUCATable; -U_CAPI tempUCATable * U_EXPORT2 uprv_uca_initTempTable(UCATableHeader *image, UColOptionSet *opts, const UCollator *UCA, UColCETags initTag, UErrorCode *status); +U_CAPI tempUCATable * U_EXPORT2 uprv_uca_initTempTable(UCATableHeader *image, UColOptionSet *opts, const UCollator *UCA, UColCETags initTag, UColCETags supplementaryInitTag, UErrorCode *status); U_CAPI tempUCATable * U_EXPORT2 uprv_uca_cloneTempTable(tempUCATable *t, UErrorCode *status); U_CAPI void U_EXPORT2 uprv_uca_closeTempTable(tempUCATable *t); U_CAPI uint32_t U_EXPORT2 uprv_uca_addAnElement(tempUCATable *t, UCAElements *element, UErrorCode *status); diff --git a/icuSources/i18n/ucol_imp.h b/icuSources/i18n/ucol_imp.h index ddf8ac7d..f8b11c66 100644 --- a/icuSources/i18n/ucol_imp.h +++ b/icuSources/i18n/ucol_imp.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1998-2003, International Business Machines +* Copyright (C) 1998-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -33,6 +33,12 @@ #define INVC_DATA_TYPE "icu" #define INVC_DATA_NAME "invuca" +/** + * Convenience string denoting the Collation data tree + * @internal ICU 3.0 + */ +#define U_ICUDATA_COLL U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "coll" + #if !UCONFIG_NO_COLLATION #include "unicode/ucol.h" @@ -54,43 +60,64 @@ * Substructures are described in the collation design document at * http://oss.software.ibm.com/cvs/icu/~checkout~/icuhtml/design/collation/ICU_collation_design.htm * + * ------------------------------------------------------------- + * * Here is the format of binary collation image. * + * Physical order of structures: + * - header (UCATableHeader) + * - options (UColOptionSet) + * - expansions (CE[]) + * - contractions (UChar[contractionSize] + CE[contractionSize]) + * - serialized UTrie with mappings of code points to CEs + * - max expansion tables (CE[endExpansionCECount] + uint8_t[endExpansionCECount]) + * - two bit sets for backward processing in strcoll (identical prefixes) + * and for backward CE iteration (each set is uint8_t[UCOL_UNSAFECP_TABLE_SIZE]) + * - UCA constants (UCAConstants) + * - UCA contractions (UChar[contractionUCACombosSize][contractionUCACombosWidth]) + * + * UCATableHeader fields: + * * int32_t size; - image size in bytes * * Offsets to interesting data. All offsets are in bytes. * to get the address add to the header address and cast properly. - * Offsets are in ascending order if non-zero. + * Some offsets are zero if the corresponding structures are empty. * - * uint32_t options; - offset to default collator options (UColOptionSet *), 1 signed 3-bit value, followed by 7 unsigned 32-bit values, - * followed by 64 reserved bytes (could be considered 16 32-bit values). See declaration of UColOptionSet for more details + * Tailoring binaries that only set options and contain no mappings etc. + * will have all offsets 0 except for the options and expansion offsets, + * which give the position and length of the options array. * - * uint32_t UCAConsts; - only used in UCA image - structure which holds values for indirect positioning and implicit ranges - * See declaration of UCAConstants structure. This is a field of 37 unsigned 32-bit values used to store + * uint32_t options; - offset to default collator options (UColOptionSet *), + * a set of 32-bit values. See declaration of UColOptionSet for more details + * + * uint32_t UCAConsts; - only used (!=0) in UCA image - structure which holds values for indirect positioning and implicit ranges + * See declaration of UCAConstants structure. This is a set of unsigned 32-bit values used to store * important constant values that are defined in the UCA and used for building and runtime. * - * uint32_t contractionUCACombos; - only used in UCA image - list of UCA contractions. This is a zero terminated array of UChar[3], + * uint32_t contractionUCACombos; - only used (!=0) in UCA image - list of UCA contractions. This is a zero terminated array of UChar[contractionUCACombosWidth], * containing contractions from the UCA. These are needed in the build process to copy UCA contractions * in case the base contraction symbol is tailored. * - * uint32_t unusedReserved1; - reserved for future use + * uint32_t magic; - must contain UCOL_HEADER_MAGIC (formatVersion 2.3) * * uint32_t mappingPosition; - offset to UTrie (const uint8_t *mappingPosition). This is a serialized UTrie and should be treated as such. * Used as a primary lookup table for collation elements. * - * uint32_t expansion; - offset to expansion table (uint32_t *expansion). This is an array of expansion CEs. + * uint32_t expansion; - offset to expansion table (uint32_t *expansion). This is an array of expansion CEs. Never 0. * * uint32_t contractionIndex; - offset to contraction table (UChar *contractionIndex). Used to look up contraction sequences. Contents - * are aligned with the contents of contractionCEs table. + * are aligned with the contents of contractionCEs table. 0 if no contractions. * * uint32_t contractionCEs; - offset to resulting contraction CEs (uint32_t *contractionCEs). When a contraction is resolved in the * in the contractionIndex table, the resulting index is used to look up corresponding CE in this table. - * + * 0 if no contractions. * uint32_t contractionSize; - size of contraction table in elements (both Index and CEs). * * Tables described below are used for Boyer-Moore searching algorithm - they define the size of longest expansion * and last CEs in expansions. - * uint32_t endExpansionCE; - offset to array of last collation element in expansion (uint32_t *). . + * uint32_t endExpansionCE; - offset to array of last collation element in expansion (uint32_t *). + * Never 0. * uint32_t expansionCESize; - array of maximum expansion sizes (uint8_t *) * int32_t endExpansionCECount; - size of endExpansionCE. See UCOL_GETMAXEXPANSION * for the usage model @@ -99,27 +126,31 @@ * uint32_t unsafeCP; - hash table of unsafe code points (uint8_t *). See ucol_unsafeCP function. * uint32_t contrEndCP; - hash table of final code points in contractions (uint8_t *). See ucol_contractionEndCP. * - * int32_t CEcount; - currently unused - * + * int32_t contractionUCACombosSize; - number of UChar[contractionUCACombosWidth] in contractionUCACombos + * (formatVersion 2.3) * UBool jamoSpecial; - Jamo special indicator (uint8_t). If TRUE, Jamos are special, so we cannot use simple Hangul decomposition. - * uint8_t padding[3]; - padding 3 uint8_t + * UBool isBigEndian; - endianness of this collation binary (formatVersion 2.3) + * uint8_t charSetFamily; - charset family of this collation binary (formatVersion 2.3) + * uint8_t contractionUCACombosWidth; - number of UChars per UCA contraction in contractionUCACombos (formatVersion 2.3) * * Various version fields * UVersionInfo version; - version 4 uint8_t * UVersionInfo UCAVersion; - version 4 uint8_t * UVersionInfo UCDVersion; - version 4 uint8_t + * UVersionInfo formatVersion; - version of the format of the collation binary + * same formatVersion as in ucadata.icu's UDataInfo header + * (formatVersion 2.3) * - * char charsetName[32]; - currently unused 32 uint8_t - * uint8_t reserved[56]; - currently unused 64 uint8_t + * uint8_t reserved[84]; - currently unused * - * This header is followed by data addressed by offsets in the header. + * ------------------------------------------------------------- * * Inverse UCA is used for constructing collators from rules. It is always an individual file * and always has a UDataInfo header. * here is the structure: * * uint32_t byteSize; - size of inverse UCA image in bytes - * uint32_t tableSize; - size of inverse table (number of (inverse elements + 2)*3 + * uint32_t tableSize; - length of inverse table (number of uint32_t[3] rows) * uint32_t contsSize; - size of continuation table (number of UChars in table) * * uint32_t table; - offset to inverse table (uint32_t *) @@ -135,42 +166,32 @@ * Header is followed by the table and continuation table. */ +/* let us know whether reserved fields are reset to zero or junked */ +#define UCOL_HEADER_MAGIC 0x20030618 + /* UDataInfo for UCA mapping table */ -static const UDataInfo ucaDataInfo={ - sizeof(UDataInfo), - 0, - - U_IS_BIG_ENDIAN, - U_CHARSET_FAMILY, - sizeof(UChar), - 0, - - {0x55, 0x43, 0x6f, 0x6c}, /* dataFormat="UCol" */ - /* 03/26/2002 bumped up version since format has changed */ - /* 09/16/2002 bumped up version since we went from UColAttributeValue */ - /* to int32_t in UColOptionSet */ - /* 05/13/2003 This one also updated since we added UCA and UCD versions */ - /* to header */ - {2, 2, 0, 0}, /* formatVersion */ - {3, 0, 0, 0} /* dataVersion = Unicode Version*/ -}; +/* dataFormat="UCol" */ +#define UCA_DATA_FORMAT_0 ((uint8_t)0x55) +#define UCA_DATA_FORMAT_1 ((uint8_t)0x43) +#define UCA_DATA_FORMAT_2 ((uint8_t)0x6f) +#define UCA_DATA_FORMAT_3 ((uint8_t)0x6c) + +#define UCA_FORMAT_VERSION_0 ((uint8_t)2) +#define UCA_FORMAT_VERSION_1 ((uint8_t)3) +#define UCA_FORMAT_VERSION_2 ((uint8_t)0) +#define UCA_FORMAT_VERSION_3 ((uint8_t)0) /* UDataInfo for inverse UCA table */ -static const UDataInfo invUcaDataInfo={ - sizeof(UDataInfo), - 0, - - U_IS_BIG_ENDIAN, - U_CHARSET_FAMILY, - sizeof(UChar), - 0, - - {0x49, 0x6E, 0x76, 0x43}, /* dataFormat="InvC" */ - /* 03/26/2002 bumped up version since format has changed */ - /* 04/29/2003 2.1 format - we have added UCA version to header */ - {2, 1, 0, 0}, /* formatVersion */ - {3, 0, 0, 0} /* dataVersion = Unicode Version*/ -}; +/* dataFormat="InvC" */ +#define INVUCA_DATA_FORMAT_0 ((uint8_t)0x49) +#define INVUCA_DATA_FORMAT_1 ((uint8_t)0x6E) +#define INVUCA_DATA_FORMAT_2 ((uint8_t)0x76) +#define INVUCA_DATA_FORMAT_3 ((uint8_t)0x43) + +#define INVUCA_FORMAT_VERSION_0 ((uint8_t)2) +#define INVUCA_FORMAT_VERSION_1 ((uint8_t)1) +#define INVUCA_FORMAT_VERSION_2 ((uint8_t)0) +#define INVUCA_FORMAT_VERSION_3 ((uint8_t)0) /* This is the size of the stack allocated buffer for sortkey generation and similar operations */ /* if it is too small, heap allocation will occur.*/ @@ -537,6 +558,7 @@ enum { UCOL_BYTE_FIRST_TAILORED = 0x04, UCOL_BYTE_COMMON = 0x05, UCOL_BYTE_FIRST_UCA = UCOL_BYTE_COMMON, + UCOL_CODAN_PLACEHOLDER = 0x24, UCOL_BYTE_LAST_LATIN_PRIMARY = 0x4C, UCOL_BYTE_FIRST_NON_LATIN_PRIMARY = 0x4D, UCOL_BYTE_UNSHIFTED_MAX = 0xFF @@ -636,8 +658,8 @@ typedef enum { /* It fits in a single 32 bit CE and is used instead of expansion to save */ /* space without affecting the performance (hopefully) */ - DIGIT_TAG = 13, /* COllate Digits As Numbers (CODAN) implementation */ - + DIGIT_TAG = 13, /* COllate Digits As Numbers (CODAN) implementation */ + CE_TAGS_COUNT } UColCETags; @@ -657,8 +679,8 @@ typedef struct { /*UColAttributeValue*/ int32_t normalizationMode; /* attribute for normalization */ /*UColAttributeValue*/ int32_t strength; /* attribute for strength */ /*UColAttributeValue*/ int32_t hiraganaQ; /* attribute for special Hiragana */ - /*UColAttributeValue*/ int32_t numericCollation; - uint8_t reserved[64]; /* for future use */ + /*UColAttributeValue*/ int32_t numericCollation; /* attribute for numeric collation */ + uint32_t reserved[15]; /* for future use */ } UColOptionSet; typedef struct { @@ -706,7 +728,7 @@ typedef struct { uint32_t options; /* these are the default options for the collator */ uint32_t UCAConsts; /* structure which holds values for indirect positioning and implicit ranges */ uint32_t contractionUCACombos; /* this one is needed only for UCA, to copy the appropriate contractions */ - uint32_t unusedReserved1; /* reserved for future use */ + uint32_t magic; /* magic number - lets us know whether reserved data is reset or junked */ uint32_t mappingPosition; /* const uint8_t *mappingPosition; */ uint32_t expansion; /* uint32_t *expansion; */ uint32_t contractionIndex; /* UChar *contractionIndex; */ @@ -725,14 +747,17 @@ typedef struct { uint32_t contrEndCP; /* hash table of final code points */ /* in contractions. */ - int32_t CEcount; + int32_t contractionUCACombosSize; /* number of UCA contraction items. */ + /*Length is contractionUCACombosSize*contractionUCACombosWidth*sizeof(UChar) */ UBool jamoSpecial; /* is jamoSpecial */ - uint8_t padding[3]; /* for guaranteed alignment */ + UBool isBigEndian; /* is this data big endian? from the UDataInfo header*/ + uint8_t charSetFamily; /* what is the charset family of this data from the UDataInfo header*/ + uint8_t contractionUCACombosWidth; /* width of UCA combos field */ UVersionInfo version; UVersionInfo UCAVersion; /* version of the UCA, read from file */ UVersionInfo UCDVersion; /* UCD version, obtained by u_getUnicodeVersion */ - char charsetName[32]; /* for charset CEs */ - uint8_t reserved[56]; /* for future use */ + UVersionInfo formatVersion; /* format version from the UDataInfo header */ + uint8_t reserved[84]; /* for future use */ } UCATableHeader; #define U_UNKNOWN_STATE 0 @@ -899,6 +924,7 @@ struct UCollator { uint8_t tertiaryBottomCount; UDataInfo dataInfo; /* Data info of UCA table */ + const UCollator *UCA; }; @@ -911,7 +937,7 @@ U_CFUNC UCollator* ucol_initUCA(UErrorCode *status); U_CFUNC -UCollator* ucol_initCollator(const UCATableHeader *image, UCollator *fillIn, UErrorCode *status); +UCollator* ucol_initCollator(const UCATableHeader *image, UCollator *fillIn, const UCollator *UCA, UErrorCode *status); U_CFUNC void ucol_setOptionsFromHeader(UCollator* result, UColOptionSet * opts, UErrorCode *status); @@ -932,24 +958,26 @@ U_CAPI char* U_EXPORT2 ucol_sortKeyToString(const UCollator *coll, const uint8_t U_CAPI UBool U_EXPORT2 ucol_isTailored(const UCollator *coll, const UChar u, UErrorCode *status); U_CAPI const InverseUCATableHeader* U_EXPORT2 ucol_initInverseUCA(UErrorCode *status); -U_CAPI int32_t U_EXPORT2 ucol_inv_getNextCE(uint32_t CE, uint32_t contCE, - uint32_t *nextCE, uint32_t *nextContCE, - uint32_t strength); -U_CAPI int32_t U_EXPORT2 ucol_inv_getPrevCE(uint32_t CE, uint32_t contCE, - uint32_t *prevCE, uint32_t *prevContCE, - uint32_t strength); + U_CAPI void U_EXPORT2 -uprv_uca_initImplicitConstants(uint32_t baseByte); - -/** Check whether two collators are equal. Collators are considered equal if they - * will sort strings the same. This means that both the current attributes and the - * rules must be equivalent. Currently used for RuleBasedCollator::operator==. - * @param source first collator - * @param target second collator - * @return TRUE or FALSE - */ -U_CAPI UBool U_EXPORT2 -ucol_equals(const UCollator *source, const UCollator *target); +uprv_uca_initImplicitConstants(int32_t minPrimary, int32_t maxPrimary, UErrorCode *status); + +U_CAPI uint32_t U_EXPORT2 +uprv_uca_getImplicitFromRaw(UChar32 cp); + +U_CAPI uint32_t U_EXPORT2 +uprv_uca_getImplicitPrimary(UChar32 cp); + +U_CAPI UChar32 U_EXPORT2 +uprv_uca_getRawFromImplicit(uint32_t implicit); + +U_CAPI UChar32 U_EXPORT2 +uprv_uca_getRawFromCodePoint(UChar32 i); + +U_CAPI UChar32 U_EXPORT2 +uprv_uca_getCodePointFromRaw(UChar32 i); + + #ifdef XP_CPLUSPLUS /* diff --git a/icuSources/i18n/ucol_sit.cpp b/icuSources/i18n/ucol_sit.cpp new file mode 100644 index 00000000..a27ef83c --- /dev/null +++ b/icuSources/i18n/ucol_sit.cpp @@ -0,0 +1,1062 @@ +/* +******************************************************************************* +* Copyright (C) 2004, International Business Machines +* Corporation and others. All Rights Reserved. +******************************************************************************* +* file name: ucol_sit.cpp +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* Modification history +* Date Name Comments +* 03/12/2004 weiv Creation +*/ + +#include "utracimp.h" +#include "ucol_imp.h" +#include "ucol_tok.h" +#include "unormimp.h" +#include "cmemory.h" +#include "cstring.h" + +#if !UCONFIG_NO_COLLATION + +enum OptionsList { + UCOL_SIT_LANGUAGE = 0, + UCOL_SIT_SCRIPT, + UCOL_SIT_REGION, + UCOL_SIT_VARIANT, + UCOL_SIT_KEYWORD, + UCOL_SIT_RFC3166BIS, + UCOL_SIT_STRENGTH, + UCOL_SIT_CASE_LEVEL, + UCOL_SIT_CASE_FIRST, + UCOL_SIT_NUMERIC_COLLATION, + UCOL_SIT_ALTERNATE_HANDLING, + UCOL_SIT_NORMALIZATION_MODE, + UCOL_SIT_FRENCH_COLLATION, + UCOL_SIT_HIRAGANA_QUATERNARY, + UCOL_SIT_VARIABLE_TOP, + UCOL_SIT_VARIABLE_TOP_VALUE, + UCOL_SIT_ITEMS_COUNT +}; + +/* list of locales for packing of a collator to an integer. + * This list corresponds to ICU 3.0. If more collation bearing + * locales are added in the future, this won't be a simple array + * but a mapping allowing forward and reverse lookup would have to + * be established. Currently, the mapping is from locale name to + * index. + */ +static const char* const locales[] = { +/* 00 - 09 */ "ar", "be", "bg", "ca", "cs", "da", "de", "de__PHONEBOOK", "el", "en", +/* 10 - 19 */ "en_BE", "eo", "es", "es__TRADITIONAL", "et", "fa", "fa_AF", "fi", "fo", "fr", +/* 20 - 29 */ "gu", "he", "hi", "hi__DIRECT", "hr", "hu", "is", "it", "ja", "kk", +/* 30 - 39 */ "kl", "kn", "ko", "lt", "lv", "mk", "mr", "mt", "nb", "nn", +/* 40 - 49 */ "om", "pa", "pl", "ps", "ro", "root", "ru", "sh", "sk", "sl", +/* 50 - 59 */ "sq", "sr", "sv", "ta", "te", "th", "tr", "uk", "vi", "zh", +/* 60 - 64 */ "zh_HK", "zh_MO", "zh_TW", "zh_TW_STROKE", "zh__PINYIN" +}; + +static const char* const keywords[] = { +/* 00 */ "", +/* 01 */ "direct", +/* 02 */ "phonebook", +/* 03 */ "pinyin", +/* 04 */ "standard", +/* 05 */ "stroke", +/* 06 */ "traditional" +}; + + +/* option starters chars. */ +static const char alternateHArg = 'A'; +static const char variableTopValArg = 'B'; +static const char caseFirstArg = 'C'; +static const char numericCollArg = 'D'; +static const char caseLevelArg = 'E'; +static const char frenchCollArg = 'F'; +static const char hiraganaQArg = 'H'; +static const char keywordArg = 'K'; +static const char languageArg = 'L'; +static const char normArg = 'N'; +static const char regionArg = 'R'; +static const char strengthArg = 'S'; +static const char variableTopArg = 'T'; +static const char variantArg = 'V'; +static const char RFC3066Arg = 'X'; +static const char scriptArg = 'Z'; + +static const char collationKeyword[] = "@collation="; + +static const int32_t locElementCount = 5; +static const int32_t locElementCapacity = 32; +static const int32_t loc3066Capacity = 256; +static const int32_t internalBufferSize = 512; + +/* structure containing specification of a collator. Initialized + * from a short string. Also used to construct a short string from a + * collator instance + */ +struct CollatorSpec { + char locElements[locElementCount][locElementCapacity]; + char locale[loc3066Capacity]; + UColAttributeValue options[UCOL_ATTRIBUTE_COUNT]; + uint32_t variableTopValue; + UChar variableTopString[locElementCapacity]; + int32_t variableTopStringLen; + UBool variableTopSet; + struct { + const char *start; + int32_t len; + } entries[UCOL_SIT_ITEMS_COUNT]; +}; + + +/* structure for converting between character attribute + * representation and real collation attribute value. + */ +struct AttributeConversion { + char letter; + UColAttributeValue value; +}; + +static const AttributeConversion conversions[12] = { + { '1', UCOL_PRIMARY }, + { '2', UCOL_SECONDARY }, + { '3', UCOL_TERTIARY }, + { '4', UCOL_QUATERNARY }, + { 'D', UCOL_DEFAULT }, + { 'I', UCOL_IDENTICAL }, + { 'L', UCOL_LOWER_FIRST }, + { 'N', UCOL_NON_IGNORABLE }, + { 'O', UCOL_ON }, + { 'S', UCOL_SHIFTED }, + { 'U', UCOL_UPPER_FIRST }, + { 'X', UCOL_OFF } +}; + + +static char +ucol_sit_attributeValueToLetter(UColAttributeValue value, UErrorCode *status) { + uint32_t i = 0; + for(i = 0; i < sizeof(conversions)/sizeof(conversions[0]); i++) { + if(conversions[i].value == value) { + return conversions[i].letter; + } + } + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; +} + +static UColAttributeValue +ucol_sit_letterToAttributeValue(char letter, UErrorCode *status) { + uint32_t i = 0; + for(i = 0; i < sizeof(conversions)/sizeof(conversions[0]); i++) { + if(conversions[i].letter == letter) { + return conversions[i].value; + } + } + *status = U_ILLEGAL_ARGUMENT_ERROR; + return UCOL_DEFAULT; +} + +/* function prototype for functions used to parse a short string */ +U_CDECL_BEGIN +typedef const char* U_CALLCONV +ActionFunction(CollatorSpec *spec, uint32_t value1, const char* string, + UErrorCode *status); +U_CDECL_END + +U_CDECL_BEGIN +static const char* U_CALLCONV +_processLocaleElement(CollatorSpec *spec, uint32_t value, const char* string, + UErrorCode *status) +{ + int32_t len = 0; + do { + if(value == 0 || value == 4) { + spec->locElements[value][len++] = uprv_tolower(*string); + } else { + spec->locElements[value][len++] = *string; + } + } while(*(++string) != '_' && *string && len < locElementCapacity); + if(len >= locElementCapacity) { + *status = U_BUFFER_OVERFLOW_ERROR; + return string; + } + // don't skip the underscore at the end + return string; +} +U_CDECL_END + +U_CDECL_BEGIN +static const char* U_CALLCONV +_processRFC3066Locale(CollatorSpec *spec, uint32_t, const char* string, + UErrorCode *status) +{ + char terminator = *string; + string++; + const char *end = uprv_strchr(string+1, terminator); + if(end == NULL || end - string >= loc3066Capacity) { + *status = U_BUFFER_OVERFLOW_ERROR; + return string; + } else { + uprv_strncpy(spec->locale, string, end-string); + return end+1; + } +} + +U_CDECL_END + +U_CDECL_BEGIN +static const char* U_CALLCONV +_processCollatorOption(CollatorSpec *spec, uint32_t option, const char* string, + UErrorCode *status) +{ + spec->options[option] = ucol_sit_letterToAttributeValue(*string, status); + if((*(++string) != '_' && *string) || U_FAILURE(*status)) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + } + return string; +} +U_CDECL_END + + +static UChar +readHexCodeUnit(const char **string, UErrorCode *status) +{ + UChar result = 0; + int32_t value = 0; + char c; + int32_t noDigits = 0; + while((c = **string) != 0 && noDigits < 4) { + if( c >= '0' && c <= '9') { + value = c - '0'; + } else if ( c >= 'a' && c <= 'f') { + value = c - 'a' + 10; + } else if ( c >= 'A' && c <= 'F') { + value = c - 'A' + 10; + } else { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + result = (result << 4) | (UChar)value; + noDigits++; + (*string)++; + } + // if the string was terminated before we read 4 digits, set an error + if(noDigits < 4) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + } + return result; +} + +U_CDECL_BEGIN +static const char* U_CALLCONV +_processVariableTop(CollatorSpec *spec, uint32_t value1, const char* string, UErrorCode *status) +{ + // get four digits + int32_t i = 0; + if(!value1) { + while(U_SUCCESS(*status) && i < locElementCapacity && *string != 0 && *string != '_') { + spec->variableTopString[i++] = readHexCodeUnit(&string, status); + } + spec->variableTopStringLen = i; + if(i == locElementCapacity && (*string != 0 || *string != '_')) { + *status = U_BUFFER_OVERFLOW_ERROR; + } + } else { + spec->variableTopValue = readHexCodeUnit(&string, status); + } + if(U_SUCCESS(*status)) { + spec->variableTopSet = TRUE; + } + return string; +} +U_CDECL_END + + +/* Table for parsing short strings */ +struct ShortStringOptions { + char optionStart; + ActionFunction *action; + uint32_t attr; +}; + +static const ShortStringOptions options[UCOL_SIT_ITEMS_COUNT] = +{ +/* 10 ALTERNATE_HANDLING */ {alternateHArg, _processCollatorOption, UCOL_ALTERNATE_HANDLING }, // alternate N, S, D +/* 15 VARIABLE_TOP_VALUE */ {variableTopValArg, _processVariableTop, 1 }, +/* 08 CASE_FIRST */ {caseFirstArg, _processCollatorOption, UCOL_CASE_FIRST }, // case first L, U, X, D +/* 09 NUMERIC_COLLATION */ {numericCollArg, _processCollatorOption, UCOL_NUMERIC_COLLATION }, // codan O, X, D +/* 07 CASE_LEVEL */ {caseLevelArg, _processCollatorOption, UCOL_CASE_LEVEL }, // case level O, X, D +/* 12 FRENCH_COLLATION */ {frenchCollArg, _processCollatorOption, UCOL_FRENCH_COLLATION }, // french O, X, D +/* 13 HIRAGANA_QUATERNARY] */ {hiraganaQArg, _processCollatorOption, UCOL_HIRAGANA_QUATERNARY_MODE }, // hiragana O, X, D +/* 04 KEYWORD */ {keywordArg, _processLocaleElement, 4 }, // keyword +/* 00 LANGUAGE */ {languageArg, _processLocaleElement, 0 }, // language +/* 11 NORMALIZATION_MODE */ {normArg, _processCollatorOption, UCOL_NORMALIZATION_MODE }, // norm O, X, D +/* 02 REGION */ {regionArg, _processLocaleElement, 2 }, // region +/* 06 STRENGTH */ {strengthArg, _processCollatorOption, UCOL_STRENGTH }, // strength 1, 2, 3, 4, I, D +/* 14 VARIABLE_TOP */ {variableTopArg, _processVariableTop, 0 }, +/* 03 VARIANT */ {variantArg, _processLocaleElement, 3 }, // variant +/* 05 RFC3066BIS */ {RFC3066Arg, _processRFC3066Locale, 0 }, // rfc3066bis locale name +/* 01 SCRIPT */ {scriptArg, _processLocaleElement, 1 } // script +}; + + +static +const char* ucol_sit_readOption(const char *start, CollatorSpec *spec, + UErrorCode *status) +{ + int32_t i = 0; + + for(i = 0; i < UCOL_SIT_ITEMS_COUNT; i++) { + if(*start == options[i].optionStart) { + spec->entries[i].start = start; + const char* end = options[i].action(spec, options[i].attr, start+1, status); + spec->entries[i].len = end - start; + return end; + } + } + *status = U_ILLEGAL_ARGUMENT_ERROR; + return start; +} + +static +void ucol_sit_initCollatorSpecs(CollatorSpec *spec) +{ + // reset everything + uprv_memset(spec, 0, sizeof(CollatorSpec)); + // set collation options to default + int32_t i = 0; + for(i = 0; i < UCOL_ATTRIBUTE_COUNT; i++) { + spec->options[i] = UCOL_DEFAULT; + } +} + +static const char* +ucol_sit_readSpecs(CollatorSpec *s, const char *string, + UParseError *parseError, UErrorCode *status) +{ + const char *definition = string; + while(U_SUCCESS(*status) && *string) { + string = ucol_sit_readOption(string, s, status); + // advance over '_' + while(*string && *string == '_') { + string++; + } + } + if(U_FAILURE(*status)) { + parseError->offset = string - definition; + } + return string; +} + +static +int32_t ucol_sit_dumpSpecs(CollatorSpec *s, char *destination, int32_t capacity, UErrorCode *status) +{ + int32_t i = 0, j = 0; + int32_t len = 0; + char optName; + if(U_SUCCESS(*status)) { + for(i = 0; i < UCOL_SIT_ITEMS_COUNT; i++) { + if(s->entries[i].start) { + if(len) { + if(len < capacity) { + uprv_strcat(destination, "_"); + } + len++; + } + optName = *(s->entries[i].start); + if(optName == languageArg || optName == regionArg || optName == variantArg || optName == keywordArg) { + for(j = 0; j < s->entries[i].len; j++) { + if(len + j < capacity) { + destination[len+j] = uprv_toupper(*(s->entries[i].start+j)); + } + } + len += s->entries[i].len; + } else { + len += s->entries[i].len; + if(len < capacity) { + uprv_strncat(destination,s->entries[i].start, s->entries[i].len); + } + } + } + } + return len; + } else { + return 0; + } +} + +static void +ucol_sit_calculateWholeLocale(CollatorSpec *s) { + // put the locale together, unless we have a done + // locale + if(s->locale[0] == 0) { + // first the language + uprv_strcat(s->locale, s->locElements[0]); + // then the script, if present + if(*(s->locElements[1])) { + uprv_strcat(s->locale, "_"); + uprv_strcat(s->locale, s->locElements[1]); + } + // then the region, if present + if(*(s->locElements[2])) { + uprv_strcat(s->locale, "_"); + uprv_strcat(s->locale, s->locElements[2]); + } else if(*(s->locElements[3])) { // if there is a variant, we need an underscore + uprv_strcat(s->locale, "_"); + } + // add variant, if there + if(*(s->locElements[3])) { + uprv_strcat(s->locale, "_"); + uprv_strcat(s->locale, s->locElements[3]); + } + + // if there is a collation keyword, add that too + if(*(s->locElements[4])) { + uprv_strcat(s->locale, collationKeyword); + uprv_strcat(s->locale, s->locElements[4]); + } + } +} + +U_CAPI UCollator* U_EXPORT2 +ucol_openFromShortString( const char *definition, + UBool forceDefaults, + UParseError *parseError, + UErrorCode *status) +{ + UTRACE_ENTRY_OC(UTRACE_UCOL_OPEN_FROM_SHORT_STRING); + UTRACE_DATA1(UTRACE_INFO, "short string = \"%s\"", definition); + + if(U_FAILURE(*status)) return 0; + + UParseError internalParseError; + + if(!parseError) { + parseError = &internalParseError; + } + parseError->line = 0; + parseError->offset = 0; + parseError->preContext[0] = 0; + parseError->postContext[0] = 0; + + + // first we want to pick stuff out of short string. + // we'll end up with an UCA version, locale and a bunch of + // settings + + // analyse the string in order to get everything we need. + const char *string = definition; + CollatorSpec s; + ucol_sit_initCollatorSpecs(&s); + string = ucol_sit_readSpecs(&s, definition, parseError, status); + ucol_sit_calculateWholeLocale(&s); + + char buffer[internalBufferSize]; + uprv_memset(buffer, 0, internalBufferSize); + uloc_canonicalize(s.locale, buffer, internalBufferSize, status); + + UCollator *result = ucol_open(s.locale, status); + int32_t i = 0; + + for(i = 0; i < UCOL_ATTRIBUTE_COUNT; i++) { + if(s.options[i] != UCOL_DEFAULT) { + if(forceDefaults || ucol_getAttribute(result, (UColAttribute)i, status) != s.options[i]) { + ucol_setAttribute(result, (UColAttribute)i, s.options[i], status); + } + + if(U_FAILURE(*status)) { + parseError->offset = string - definition; + ucol_close(result); + return NULL; + } + + } + } + if(s.variableTopSet) { + if(s.variableTopString[0]) { + ucol_setVariableTop(result, s.variableTopString, s.variableTopStringLen, status); + } else { // we set by value, using 'B' + ucol_restoreVariableTop(result, s.variableTopValue, status); + } + } + + + if(U_FAILURE(*status)) { // here it can only be a bogus value + ucol_close(result); + result = NULL; + } + + UTRACE_EXIT_PTR_STATUS(result, *status); + return result; +} + + +static void appendShortStringElement(const char *src, int32_t len, char *result, int32_t *resultSize, int32_t capacity, char arg) +{ + if(len) { + if(*resultSize) { + if(*resultSize < capacity) { + uprv_strcat(result, "_"); + } + (*resultSize)++; + } + *resultSize += len + 1; + if(*resultSize < capacity) { + uprv_strncat(result, &arg, 1); + uprv_strncat(result, src, len); + } + } +} + +U_CAPI int32_t U_EXPORT2 +ucol_getShortDefinitionString(const UCollator *coll, + const char *locale, + char *dst, + int32_t capacity, + UErrorCode *status) +{ + if(U_FAILURE(*status)) return 0; + char buffer[internalBufferSize]; + uprv_memset(buffer, 0, internalBufferSize*sizeof(char)); + int32_t resultSize = 0; + char tempbuff[internalBufferSize]; + char locBuff[internalBufferSize]; + uprv_memset(buffer, 0, internalBufferSize*sizeof(char)); + int32_t elementSize = 0; + UBool isAvailable = 0; + CollatorSpec s; + ucol_sit_initCollatorSpecs(&s); + + if(!locale) { + locale = ucol_getLocale(coll, ULOC_VALID_LOCALE, status); + } + elementSize = ucol_getFunctionalEquivalent(locBuff, internalBufferSize, "collation", locale, &isAvailable, status); + + if(elementSize) { + // we should probably canonicalize here... + elementSize = uloc_getLanguage(locBuff, tempbuff, internalBufferSize, status); + appendShortStringElement(tempbuff, elementSize, buffer, &resultSize, capacity, languageArg); + elementSize = uloc_getCountry(locBuff, tempbuff, internalBufferSize, status); + appendShortStringElement(tempbuff, elementSize, buffer, &resultSize, capacity, regionArg); + elementSize = uloc_getScript(locBuff, tempbuff, internalBufferSize, status); + appendShortStringElement(tempbuff, elementSize, buffer, &resultSize, capacity, scriptArg); + elementSize = uloc_getVariant(locBuff, tempbuff, internalBufferSize, status); + appendShortStringElement(tempbuff, elementSize, buffer, &resultSize, capacity, variantArg); + elementSize = uloc_getKeywordValue(locBuff, "collation", tempbuff, internalBufferSize, status); + appendShortStringElement(tempbuff, elementSize, buffer, &resultSize, capacity, keywordArg); + } + + int32_t i = 0; + UColAttributeValue attribute = UCOL_DEFAULT; + for(i = 0; i < UCOL_SIT_ITEMS_COUNT; i++) { + if(options[i].action == _processCollatorOption) { + attribute = ucol_getAttributeOrDefault(coll, (UColAttribute)options[i].attr, status); + if(attribute != UCOL_DEFAULT) { + char letter = ucol_sit_attributeValueToLetter(attribute, status); + appendShortStringElement(&letter, 1, + buffer, &resultSize, capacity, options[i].optionStart); + } + } + } + if(coll->variableTopValueisDefault == FALSE) { + //s.variableTopValue = ucol_getVariableTop(coll, status); + elementSize = T_CString_integerToString(tempbuff, coll->variableTopValue, 16); + appendShortStringElement(tempbuff, elementSize, buffer, &resultSize, capacity, variableTopValArg); + } + + UParseError parseError; + return ucol_normalizeShortDefinitionString(buffer, dst, capacity, &parseError, status); +} + +U_CAPI int32_t U_EXPORT2 +ucol_normalizeShortDefinitionString(const char *definition, + char *destination, + int32_t capacity, + UParseError *parseError, + UErrorCode *status) +{ + + if(U_FAILURE(*status)) { + return 0; + } + + if(destination) { + uprv_memset(destination, 0, capacity*sizeof(char)); + } + + UParseError pe; + if(!parseError) { + parseError = &pe; + } + + // validate + CollatorSpec s; + ucol_sit_initCollatorSpecs(&s); + ucol_sit_readSpecs(&s, definition, parseError, status); + return ucol_sit_dumpSpecs(&s, destination, capacity, status); +} + +// structure for packing the bits of the attributes in the +// identifier number. +// locale is packed separately +struct bitPacking { + char letter; + uint32_t offset; + uint32_t width; + UColAttribute attribute; + UColAttributeValue values[6]; +}; + +static const bitPacking attributesToBits[UCOL_ATTRIBUTE_COUNT] = { + /* french */ { frenchCollArg, 29, 2, UCOL_FRENCH_COLLATION, { UCOL_DEFAULT, UCOL_OFF, UCOL_ON }}, + /* alternate */ { alternateHArg, 27, 2, UCOL_ALTERNATE_HANDLING, { UCOL_DEFAULT, UCOL_NON_IGNORABLE, UCOL_SHIFTED }}, + /* case first */ { caseFirstArg, 25, 2, UCOL_CASE_FIRST, { UCOL_DEFAULT, UCOL_OFF, UCOL_LOWER_FIRST, UCOL_UPPER_FIRST }}, + /* case level */ { caseLevelArg, 23, 2, UCOL_CASE_LEVEL, { UCOL_DEFAULT, UCOL_OFF, UCOL_ON }}, + /* normalization */ { normArg, 21, 2, UCOL_NORMALIZATION_MODE, { UCOL_DEFAULT, UCOL_OFF, UCOL_ON }}, + /* strength */ { strengthArg, 18, 3, UCOL_STRENGTH, { UCOL_DEFAULT, UCOL_PRIMARY, UCOL_SECONDARY, UCOL_TERTIARY, UCOL_QUATERNARY, UCOL_IDENTICAL }}, + /* hiragana */ { hiraganaQArg, 16, 2, UCOL_HIRAGANA_QUATERNARY_MODE, { UCOL_DEFAULT, UCOL_OFF, UCOL_ON }}, + /* numeric coll */ { numericCollArg, 14, 2, UCOL_NUMERIC_COLLATION, { UCOL_DEFAULT, UCOL_OFF, UCOL_ON }} +}; + +static const uint32_t keywordShift = 9; +static const uint32_t keywordWidth = 5; +static const uint32_t localeShift = 0; +static const uint32_t localeWidth = 7; + + +static uint32_t ucol_sit_putLocaleInIdentifier(uint32_t result, const char* locale, UErrorCode* status) { + char buffer[internalBufferSize], keywordBuffer[internalBufferSize], + baseName[internalBufferSize], localeBuffer[internalBufferSize]; + int32_t len = 0, keywordLen = 0, + baseNameLen = 0, localeLen = 0; + uint32_t i = 0; + UBool isAvailable = FALSE; + if(locale) { + len = uloc_canonicalize(locale, buffer, internalBufferSize, status); + localeLen = ucol_getFunctionalEquivalent(localeBuffer, internalBufferSize, "collation", buffer, &isAvailable, status); + keywordLen = uloc_getKeywordValue(buffer, "collation", keywordBuffer, internalBufferSize, status); + baseNameLen = uloc_getBaseName(buffer, baseName, internalBufferSize, status); + + /*Binary search for the map entry for normal cases */ + + uint32_t low = 0; + uint32_t high = sizeof(locales)/sizeof(locales[0]); + uint32_t mid = high; + uint32_t oldmid = 0; + int32_t compVal = 0; + + + while (high > low) /*binary search*/{ + + mid = (high+low) >> 1; /*Finds median*/ + + if (mid == oldmid) + return UCOL_SIT_COLLATOR_NOT_ENCODABLE; // we didn't find it + + compVal = uprv_strcmp(baseName, locales[mid]); + if (compVal < 0){ + high = mid; + } + else if (compVal > 0){ + low = mid; + } + else /*we found it*/{ + break; + } + oldmid = mid; + } + + result |= (mid & ((1 << localeWidth) - 1)) << localeShift; + } + + if(keywordLen) { + for(i = 1; i < sizeof(keywords)/sizeof(keywords[0]); i++) { + if(uprv_strcmp(keywords[i], keywordBuffer) == 0) { + result |= (i & ((1 << keywordWidth) - 1)) << keywordShift; + break; + } + } + } + return result; +} + +U_CAPI uint32_t U_EXPORT2 +ucol_collatorToIdentifier(const UCollator *coll, + const char *locale, + UErrorCode *status) +{ + uint32_t result = 0; + uint32_t i = 0, j = 0; + UColAttributeValue attrValue = UCOL_DEFAULT; + + // if variable top is not default, we need to use strings + if(coll->variableTopValueisDefault != TRUE) { + return UCOL_SIT_COLLATOR_NOT_ENCODABLE; + } + + if(locale == NULL) { + locale = ucol_getLocale(coll, ULOC_VALID_LOCALE, status); + } + + result = ucol_sit_putLocaleInIdentifier(result, locale, status); + + for(i = 0; i < sizeof(attributesToBits)/sizeof(attributesToBits[0]); i++) { + attrValue = ucol_getAttributeOrDefault(coll, attributesToBits[i].attribute, status); + j = 0; + while(attributesToBits[i].values[j] != attrValue) { + j++; + } + result |= (j & ((1 << attributesToBits[i].width) - 1)) << attributesToBits[i].offset; + } + + return result; +} + +U_CAPI UCollator* U_EXPORT2 +ucol_openFromIdentifier(uint32_t identifier, + UBool forceDefaults, + UErrorCode *status) +{ + uint32_t i = 0; + int32_t value = 0, keyword = 0; + char locale[internalBufferSize]; + + value = (identifier >> localeShift) & ((1 << localeWidth) - 1); + keyword = (identifier >> keywordShift) & ((1 << keywordWidth) - 1); + + uprv_strcpy(locale, locales[value]); + + if(keyword) { + uprv_strcat(locale, collationKeyword); + uprv_strcat(locale, keywords[keyword]); + } + + UColAttributeValue attrValue = UCOL_DEFAULT; + + UCollator *result = ucol_open(locale, status); + + // variable top is not set in the identifier, so we can easily skip that on + + for(i = 0; i < sizeof(attributesToBits)/sizeof(attributesToBits[0]); i++) { + value = (identifier >> attributesToBits[i].offset) & ((1 << attributesToBits[i].width) - 1); + attrValue = attributesToBits[i].values[value]; + // the collator is all default, so we will set only the values that will differ from + // the default values. + if(attrValue != UCOL_DEFAULT) { + if(forceDefaults || + ucol_getAttribute(result, attributesToBits[i].attribute, status) != attrValue) { + ucol_setAttribute(result, attributesToBits[i].attribute, attrValue, status); + } + } + } + + return result; +} + +U_CAPI int32_t U_EXPORT2 +ucol_identifierToShortString(uint32_t identifier, + char *buffer, + int32_t capacity, + UBool forceDefaults, + UErrorCode *status) +{ + int32_t locIndex = (identifier >> localeShift) & ((1 << localeWidth) - 1); + int32_t keywordIndex = (identifier >> keywordShift) & ((1 << keywordWidth) - 1); + CollatorSpec s; + ucol_sit_initCollatorSpecs(&s); + uprv_strcpy(s.locale, locales[locIndex]); + if(keywordIndex) { + uprv_strcat(s.locale, collationKeyword); + uprv_strcat(s.locale, keywords[keywordIndex]); + } + UCollator *coll = ucol_openFromIdentifier(identifier, forceDefaults, status); + int32_t resultLen = ucol_getShortDefinitionString(coll, s.locale, buffer, capacity, status); + ucol_close(coll); + return resultLen; + +#if 0 + // TODO: Crumy, crumy, crumy... Very hard to currently go algorithmically from + // identifier to short string. Do rethink + if(forceDefaults == FALSE) { + UCollator *coll = ucol_openFromIdentifier(identifier, FALSE, status); + int32_t resultLen = ucol_getShortDefinitionString(coll, s.locale, buffer, capacity, status); + ucol_close(coll); + return resultLen; + } else { // forceDefaults == TRUE + char letter; + UColAttributeValue value; + int32_t i = 0; + for(i = 0; i < sizeof(attributesToBits)/sizeof(attributesToBits[0]); i++) { + value = attributesToBits[i].values[(identifier >> attributesToBits[i].offset) & ((1 << attributesToBits[i].width) - 1)]; + if(value != UCOL_DEFAULT) { + uprv_strcat(buffer, "_"); + uprv_strncat(buffer, &attributesToBits[i].letter, 1); + letter = ucol_sit_attributeValueToLetter(value, status); + uprv_strncat(buffer, &letter, 1); + } + } + return ucol_sit_dumpSpecs(&s, buffer, capacity, status); + } +#endif +} + +U_CAPI uint32_t U_EXPORT2 +ucol_shortStringToIdentifier(const char *definition, + UBool forceDefaults, + UErrorCode *status) +{ + UParseError parseError; + CollatorSpec s; + uint32_t result = 0; + uint32_t i = 0, j = 0; + ucol_sit_initCollatorSpecs(&s); + + ucol_sit_readSpecs(&s, definition, &parseError, status); + ucol_sit_calculateWholeLocale(&s); + + char locBuffer[internalBufferSize]; + UBool isAvailable = FALSE; + UColAttributeValue attrValue = UCOL_DEFAULT; + + ucol_getFunctionalEquivalent(locBuffer, internalBufferSize, "collation", s.locale, &isAvailable, status); + + if(forceDefaults == FALSE) { + UCollator *coll = ucol_openFromShortString(definition, FALSE, &parseError, status); + result = ucol_collatorToIdentifier(coll, locBuffer, status); + ucol_close(coll); + } else { // forceDefaults == TRUE + result = ucol_sit_putLocaleInIdentifier(result, locBuffer, status); + + for(i = 0; i < sizeof(attributesToBits)/sizeof(attributesToBits[0]); i++) { + attrValue = s.options[i]; + j = 0; + while(attributesToBits[i].values[j] != attrValue) { + j++; + } + result |= (j & ((1 << attributesToBits[i].width) - 1)) << attributesToBits[i].offset; + } + + } + return result; + +} + +U_CAPI UColAttributeValue U_EXPORT2 +ucol_getAttributeOrDefault(const UCollator *coll, UColAttribute attr, UErrorCode *status) +{ + if(U_FAILURE(*status) || coll == NULL) { + return UCOL_DEFAULT; + } + switch(attr) { + case UCOL_NUMERIC_COLLATION: + return coll->numericCollationisDefault?UCOL_DEFAULT:coll->numericCollation; + case UCOL_HIRAGANA_QUATERNARY_MODE: + return coll->hiraganaQisDefault?UCOL_DEFAULT:coll->hiraganaQ; + case UCOL_FRENCH_COLLATION: /* attribute for direction of secondary weights*/ + return coll->frenchCollationisDefault?UCOL_DEFAULT:coll->frenchCollation; + case UCOL_ALTERNATE_HANDLING: /* attribute for handling variable elements*/ + return coll->alternateHandlingisDefault?UCOL_DEFAULT:coll->alternateHandling; + case UCOL_CASE_FIRST: /* who goes first, lower case or uppercase */ + return coll->caseFirstisDefault?UCOL_DEFAULT:coll->caseFirst; + case UCOL_CASE_LEVEL: /* do we have an extra case level */ + return coll->caseLevelisDefault?UCOL_DEFAULT:coll->caseLevel; + case UCOL_NORMALIZATION_MODE: /* attribute for normalization */ + return coll->normalizationModeisDefault?UCOL_DEFAULT:coll->normalizationMode; + case UCOL_STRENGTH: /* attribute for strength */ + return coll->strengthisDefault?UCOL_DEFAULT:coll->strength; + case UCOL_ATTRIBUTE_COUNT: + default: + *status = U_ILLEGAL_ARGUMENT_ERROR; + break; + } + return UCOL_DEFAULT; +} + + +struct contContext { + const UCollator *coll; + USet *conts; + USet *removedContractions; + UErrorCode *status; +}; + + + +static void +addContraction(const UCollator *coll, USet *contractions, UChar *buffer, int32_t bufLen, + uint32_t CE, int32_t rightIndex, UErrorCode *status) +{ + if(rightIndex == bufLen-1) { + *status = U_INTERNAL_PROGRAM_ERROR; + return; + } + const UChar *UCharOffset = (UChar *)coll->image+getContractOffset(CE); + uint32_t newCE = *(coll->contractionCEs + (UCharOffset - coll->contractionIndex)); + // we might have a contraction that ends from previous level + if(newCE != UCOL_NOT_FOUND && rightIndex > 1) { + uset_addString(contractions, buffer, rightIndex); + } + + UCharOffset++; + while(*UCharOffset != 0xFFFF) { + newCE = *(coll->contractionCEs + (UCharOffset - coll->contractionIndex)); + buffer[rightIndex] = *UCharOffset; + if(isSpecial(newCE) && getCETag(newCE) == CONTRACTION_TAG) { + addContraction(coll, contractions, buffer, bufLen, newCE, rightIndex + 1, status); + } else { + uset_addString(contractions, buffer, rightIndex + 1); + } + UCharOffset++; + } +} + +U_CDECL_BEGIN +static UBool U_CALLCONV +_processContractions(const void *context, UChar32 start, UChar32 limit, uint32_t CE) +{ + UErrorCode *status = ((contContext *)context)->status; + USet *unsafe = ((contContext *)context)->conts; + USet *removed = ((contContext *)context)->removedContractions; + const UCollator *coll = ((contContext *)context)->coll; + UChar contraction[internalBufferSize]; + if(isSpecial(CE) && getCETag(CE) == CONTRACTION_TAG) { + while(start < limit && U_SUCCESS(*status)) { + // if there are suppressed contractions, we don't + // want to add them. + if(removed && uset_contains(removed, start)) { + start++; + continue; + } + // we start our contraction from middle, since we don't know if it + // will grow toward right or left + contraction[0] = (UChar)start; + addContraction(coll, unsafe, contraction, internalBufferSize, CE, 1, status); + start++; + } + } + if(U_FAILURE(*status)) { + return FALSE; + } else { + return TRUE; + } +} + +static int32_t U_CALLCONV +_getTrieFoldingOffset(uint32_t data) +{ + return (int32_t)(data&0xFFFFFF); +} +U_CDECL_END + + + +/** + * Get a set containing the contractions defined by the collator. The set includes + * both the UCA contractions and the contractions defined by the collator + * @param coll collator + * @param conts the set to hold the result + * @param status to hold the error code + * @return the size of the contraction set + * + * @draft ICU 3.0 + */ +U_CAPI int32_t U_EXPORT2 +ucol_getContractions( const UCollator *coll, + USet *contractions, + UErrorCode *status) +{ + if(U_FAILURE(*status)) { + return 0; + } + if(coll == NULL || contractions == NULL) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + uset_clear(contractions); + int32_t rulesLen = 0; + const UChar* rules = ucol_getRules(coll, &rulesLen); + UColTokenParser src; + ucol_tok_initTokenList(&src, rules, rulesLen, coll->UCA, status); + + contContext c = { NULL, contractions, src.removeSet, status }; + + coll->mapping->getFoldingOffset = _getTrieFoldingOffset; + + // TODO: if you're supressing contractions in the tailoring + // you want to remove (or rather not include) contractions + // from the UCA. + // Probably want to pass a set of contraction starters that + // are suppressed. However, we don't want a dependency on + // the builder, so this is going to be hard to pull off. + + // Add the UCA contractions + c.coll = coll->UCA; + utrie_enum(coll->UCA->mapping, NULL, _processContractions, &c); + + // This is collator specific. Add contractions from a collator + c.coll = coll; + c.removedContractions = NULL; + utrie_enum(coll->mapping, NULL, _processContractions, &c); + ucol_tok_closeTokenList(&src); + + return uset_getItemCount(contractions); + +} + + +U_CAPI int32_t U_EXPORT2 +ucol_getUnsafeSet( const UCollator *coll, + USet *unsafe, + UErrorCode *status) +{ + UChar buffer[internalBufferSize]; + int32_t len = 0; + + uset_clear(unsafe); + + // cccpattern = "[[:^tccc=0:][:^lccc=0:]]", unfortunately variant + static const UChar cccpattern[25] = { 0x5b, 0x5b, 0x3a, 0x5e, 0x74, 0x63, 0x63, 0x63, 0x3d, 0x30, 0x3a, 0x5d, + 0x5b, 0x3a, 0x5e, 0x6c, 0x63, 0x63, 0x63, 0x3d, 0x30, 0x3a, 0x5d, 0x5d, 0x00 }; + + // add chars that fail the fcd check + uset_applyPattern(unsafe, cccpattern, 24, USET_IGNORE_SPACE, status); + + // add Thai/Lao prevowels + uset_addRange(unsafe, 0xe40, 0xe44); + uset_addRange(unsafe, 0xec0, 0xec4); + // add lead/trail surrogates + uset_addRange(unsafe, 0xd800, 0xdfff); + + USet *contractions = uset_open(0,0); + + int32_t i = 0, j = 0; + int32_t contsSize = ucol_getContractions(coll, contractions, status); + UChar32 c = 0; + // Contraction set consists only of strings + // to get unsafe code points, we need to + // break the strings apart and add them to the unsafe set + for(i = 0; i < contsSize; i++) { + len = uset_getItem(contractions, i, NULL, NULL, buffer, internalBufferSize, status); + if(len > 0) { + j = 0; + while(j < len) { + U16_NEXT(buffer, j, len, c); + if(j < len) { + uset_add(unsafe, c); + } + } + } + } + + uset_close(contractions); + + return uset_size(unsafe); +} +#endif diff --git a/icuSources/i18n/ucol_tok.cpp b/icuSources/i18n/ucol_tok.cpp index d804c5c2..c0f460a8 100644 --- a/icuSources/i18n/ucol_tok.cpp +++ b/icuSources/i18n/ucol_tok.cpp @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2001-2003, International Business Machines +* Copyright (C) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -13,9 +13,9 @@ * created 02/22/2001 * created by: Vladimir Weinstein * -* This module reads a tailoring rule string and produces a list of +* This module reads a tailoring rule string and produces a list of * tokens that will be turned into collation elements -* +* */ #include "unicode/utypes.h" @@ -25,10 +25,10 @@ #include "unicode/ustring.h" #include "unicode/uchar.h" #include "unicode/uniset.h" - + #include "ucol_tok.h" #include "cmemory.h" -#include "uprops.h" +#include "util.h" U_CDECL_BEGIN static int32_t U_EXPORT2 U_CALLCONV @@ -41,10 +41,10 @@ uhash_hashTokens(const UHashTok k) //int32_t len = (key & 0xFF000000)>>24; int32_t len = (key->source & 0xFF000000)>>24; int32_t inc = ((len - 32) / 32) + 1; - + //const UChar *p = (key & 0x00FFFFFF) + rulesToParse; const UChar *p = (key->source & 0x00FFFFFF) + key->rulesToParse; - const UChar *limit = p + len; + const UChar *limit = p + len; while (poffset = pos; parseError->line = 0 ; /* we are not using line numbers */ - + // for pre-context int32_t start = (pos <=U_PARSE_CONTEXT_LEN)? 0 : (pos - (U_PARSE_CONTEXT_LEN-1)); int32_t stop = pos; - + u_memcpy(parseError->preContext,rules+start,stop-start); //null terminate the buffer parseError->preContext[stop-start] = 0; - + //for post-context start = pos+1; - stop = ((pos+U_PARSE_CONTEXT_LEN)<= rulesLen )? (pos+(U_PARSE_CONTEXT_LEN-1)) : - u_strlen(rules); + stop = ((pos+U_PARSE_CONTEXT_LEN)<= rulesLen )? (pos+(U_PARSE_CONTEXT_LEN-1)) : + rulesLen; - u_memcpy(parseError->postContext,rules+start,stop-start); - //null terminate the buffer - parseError->postContext[stop-start]= 0; + if(start < stop) { + u_memcpy(parseError->postContext,rules+start,stop-start); + //null terminate the buffer + parseError->postContext[stop-start]= 0; + } else { + parseError->postContext[0] = 0; + } } static @@ -213,8 +217,8 @@ void ucol_uprv_tok_setOptionInImage(UColOptionSet *opts, UColAttribute attrib, U opts->strength = value; break; case UCOL_NUMERIC_COLLATION: - opts->numericCollation = value; - break; + opts->numericCollation = value; + break; case UCOL_ATTRIBUTE_COUNT: default: break; @@ -250,33 +254,33 @@ U_STRING_DECL(suboption_17, "trailing", 8); U_STRING_DECL(option_00, "undefined", 9); -U_STRING_DECL(option_01, "rearrange", 9); +U_STRING_DECL(option_01, "rearrange", 9); U_STRING_DECL(option_02, "alternate", 9); -U_STRING_DECL(option_03, "backwards", 9); -U_STRING_DECL(option_04, "variable top", 12); -U_STRING_DECL(option_05, "top", 3); -U_STRING_DECL(option_06, "normalization", 13); -U_STRING_DECL(option_07, "caseLevel", 9); -U_STRING_DECL(option_08, "caseFirst", 9); -U_STRING_DECL(option_09, "scriptOrder", 11); -U_STRING_DECL(option_10, "charsetname", 11); -U_STRING_DECL(option_11, "charset", 7); -U_STRING_DECL(option_12, "before", 6); +U_STRING_DECL(option_03, "backwards", 9); +U_STRING_DECL(option_04, "variable top", 12); +U_STRING_DECL(option_05, "top", 3); +U_STRING_DECL(option_06, "normalization", 13); +U_STRING_DECL(option_07, "caseLevel", 9); +U_STRING_DECL(option_08, "caseFirst", 9); +U_STRING_DECL(option_09, "scriptOrder", 11); +U_STRING_DECL(option_10, "charsetname", 11); +U_STRING_DECL(option_11, "charset", 7); +U_STRING_DECL(option_12, "before", 6); U_STRING_DECL(option_13, "hiraganaQ", 9); U_STRING_DECL(option_14, "strength", 8); U_STRING_DECL(option_15, "first", 5); U_STRING_DECL(option_16, "last", 4); U_STRING_DECL(option_17, "optimize", 8); U_STRING_DECL(option_18, "suppressContractions", 20); -U_STRING_DECL(option_19, "numericOrdering", 15); +U_STRING_DECL(option_19, "numericOrdering", 15); /* -[last variable] last variable value -[last primary ignorable] largest CE for primary ignorable -[last secondary ignorable] largest CE for secondary ignorable -[last tertiary ignorable] largest CE for tertiary ignorable -[top] guaranteed to be above all implicit CEs, for now and in the future (in 1.8) +[last variable] last variable value +[last primary ignorable] largest CE for primary ignorable +[last secondary ignorable] largest CE for secondary ignorable +[last tertiary ignorable] largest CE for tertiary ignorable +[top] guaranteed to be above all implicit CEs, for now and in the future (in 1.8) */ @@ -356,7 +360,7 @@ static const ucolTokOption rulesOptions[UTOK_OPTION_COUNT] = { /*04*/ {option_06, 13, onOffSub, 2, UCOL_NORMALIZATION_MODE}, /*"normalization" */ /*05*/ {option_13, 9, onOffSub, 2, UCOL_HIRAGANA_QUATERNARY_MODE}, /*"hiraganaQ" */ /*06*/ {option_14, 8, strengthSub, 5, UCOL_STRENGTH}, /*"strength" */ - /*07*/ {option_19, 15, onOffSub, 2, UCOL_NUMERIC_COLLATION}, /*"numericOrdering"*/ + /*07*/ {option_19, 15, onOffSub, 2, UCOL_NUMERIC_COLLATION}, /*"numericOrdering"*/ /*08*/ {option_04, 12, NULL, 0, UCOL_ATTRIBUTE_COUNT}, /*"variable top" */ /*09*/ {option_01, 9, NULL, 0, UCOL_ATTRIBUTE_COUNT}, /*"rearrange" */ /*10*/ {option_12, 6, beforeSub, 3, UCOL_ATTRIBUTE_COUNT}, /*"before" */ @@ -372,9 +376,9 @@ static const ucolTokOption rulesOptions[UTOK_OPTION_COUNT] = { }; static -int32_t u_strncmpNoCase(const UChar *s1, - const UChar *s2, - int32_t n) +int32_t u_strncmpNoCase(const UChar *s1, + const UChar *s2, + int32_t n) { if(n > 0) { int32_t rc; @@ -417,25 +421,25 @@ void ucol_uprv_tok_initData() { U_STRING_INIT(option_00, "undefined", 9); - U_STRING_INIT(option_01, "rearrange", 9); + U_STRING_INIT(option_01, "rearrange", 9); U_STRING_INIT(option_02, "alternate", 9); - U_STRING_INIT(option_03, "backwards", 9); - U_STRING_INIT(option_04, "variable top", 12); - U_STRING_INIT(option_05, "top", 3); - U_STRING_INIT(option_06, "normalization", 13); - U_STRING_INIT(option_07, "caseLevel", 9); - U_STRING_INIT(option_08, "caseFirst", 9); - U_STRING_INIT(option_09, "scriptOrder", 11); - U_STRING_INIT(option_10, "charsetname", 11); - U_STRING_INIT(option_11, "charset", 7); - U_STRING_INIT(option_12, "before", 6); + U_STRING_INIT(option_03, "backwards", 9); + U_STRING_INIT(option_04, "variable top", 12); + U_STRING_INIT(option_05, "top", 3); + U_STRING_INIT(option_06, "normalization", 13); + U_STRING_INIT(option_07, "caseLevel", 9); + U_STRING_INIT(option_08, "caseFirst", 9); + U_STRING_INIT(option_09, "scriptOrder", 11); + U_STRING_INIT(option_10, "charsetname", 11); + U_STRING_INIT(option_11, "charset", 7); + U_STRING_INIT(option_12, "before", 6); U_STRING_INIT(option_13, "hiraganaQ", 9); U_STRING_INIT(option_14, "strength", 8); U_STRING_INIT(option_15, "first", 5); U_STRING_INIT(option_16, "last", 4); U_STRING_INIT(option_17, "optimize", 8); U_STRING_INIT(option_18, "suppressContractions", 20); - U_STRING_INIT(option_19, "numericOrdering", 15); + U_STRING_INIT(option_19, "numericOrdering", 15); didInit = TRUE; } } @@ -444,8 +448,8 @@ void ucol_uprv_tok_initData() { // This function reads basic options to set in the runtime collator // used by data driven tests. Should not support build time options U_CAPI const UChar * U_EXPORT2 -ucol_tok_getNextArgument(const UChar *start, const UChar *end, - UColAttribute *attrib, UColAttributeValue *value, +ucol_tok_getNextArgument(const UChar *start, const UChar *end, + UColAttribute *attrib, UColAttributeValue *value, UErrorCode *status) { uint32_t i = 0; int32_t j=0; @@ -476,7 +480,7 @@ ucol_tok_getNextArgument(const UChar *start, const UChar *end, while(u_isWhitespace(*optionArg)) { /* eat whitespace */ optionArg++; } - } + } break; } i++; @@ -511,12 +515,12 @@ ucol_tok_getNextArgument(const UChar *start, const UChar *end, return NULL; } -static +static USet *ucol_uprv_tok_readAndSetUnicodeSet(const UChar *start, const UChar *end, UErrorCode *status) { while(*start != 0x005b) { /* advance while we find the first '[' */ start++; } - // now we need to get a balanced set of '[]'. The problem is that a set can have + // now we need to get a balanced set of '[]'. The problem is that a set can have // many, and *end point to the first closing '[' int32_t noOpenBraces = 1; int32_t current = 1; // skip the opening brace @@ -540,6 +544,8 @@ USet *ucol_uprv_tok_readAndSetUnicodeSet(const UChar *start, const UChar *end, U static int32_t ucol_uprv_tok_readOption(const UChar *start, const UChar *end, const UChar **optionArg) { int32_t i = 0; + ucol_uprv_tok_initData(); + while(u_isWhitespace(*start)) { /* eat whitespace */ start++; } @@ -550,14 +556,14 @@ int32_t ucol_uprv_tok_readOption(const UChar *start, const UChar *end, const UCh while(u_isWhitespace(**optionArg)) { /* eat whitespace */ (*optionArg)++; } - } + } break; } i++; } if(i == UTOK_OPTION_COUNT) { i = -1; // didn't find an option - } + } return i; } @@ -567,7 +573,7 @@ int32_t ucol_uprv_tok_readOption(const UChar *start, const UChar *end, const UCh // However, some of the options take an UnicodeSet definition // which needs to duplicate the closing ']' // for example: '[copy [\uAC00-\uD7FF]]' -// These options will move end to the second ']' and the +// These options will move end to the second ']' and the // caller will set the current to it. static uint8_t ucol_uprv_tok_readAndSetOption(UColTokenParser *src, UErrorCode *status) { @@ -578,8 +584,6 @@ uint8_t ucol_uprv_tok_readAndSetOption(UColTokenParser *src, UErrorCode *status) uint8_t result = 0; - ucol_uprv_tok_initData(); - start++; /*skip opening '['*/ i = ucol_uprv_tok_readOption(start, src->end, &optionArg); if(optionArg) { @@ -606,7 +610,7 @@ uint8_t ucol_uprv_tok_readAndSetOption(UColTokenParser *src, UErrorCode *status) result = UCOL_TOK_SUCCESS; } } - } + } if(result == 0) { *status = U_ILLEGAL_ARGUMENT_ERROR; } @@ -671,29 +675,72 @@ uint8_t ucol_uprv_tok_readAndSetOption(UColTokenParser *src, UErrorCode *status) return result; } -inline UBool ucol_tok_doSetTop(UColTokenParser *src) { + +inline void ucol_tok_addToExtraCurrent(UColTokenParser *src, const UChar *stuff, int32_t len, UErrorCode *status) { + if(src->extraCurrent+len >= src->extraEnd) { + /* reallocate */ + UChar *newSrc = (UChar *)uprv_realloc(src->source, (src->extraEnd-src->source)*2*sizeof(UChar)); + if(newSrc != NULL) { + src->current = newSrc + (src->current - src->source); + src->extraCurrent = newSrc + (src->extraCurrent - src->source); + src->end = newSrc + (src->end - src->source); + src->extraEnd = newSrc + (src->extraEnd-src->source)*2; + src->sourceCurrent = newSrc + (src->sourceCurrent-src->source); + src->source = newSrc; + } else { + *status = U_MEMORY_ALLOCATION_ERROR; + } + } + if(len == 1) { + *src->extraCurrent++ = *stuff; + } else { + uprv_memcpy(src->extraCurrent, stuff, len*sizeof(UChar)); + src->extraCurrent += len; + } + + +} + +inline UBool ucol_tok_doSetTop(UColTokenParser *src, UErrorCode *status) { /* top = TRUE; */ + UChar buff[5]; src->parsedToken.charsOffset = (uint32_t)(src->extraCurrent - src->source); - *src->extraCurrent++ = 0xFFFE; - *src->extraCurrent++ = (UChar)(ucolIndirectBoundaries[src->parsedToken.indirectIndex].startCE >> 16); - *src->extraCurrent++ = (UChar)(ucolIndirectBoundaries[src->parsedToken.indirectIndex].startCE & 0xFFFF); + buff[0] = 0xFFFE; + buff[1] = (UChar)(ucolIndirectBoundaries[src->parsedToken.indirectIndex].startCE >> 16); + buff[2] = (UChar)(ucolIndirectBoundaries[src->parsedToken.indirectIndex].startCE & 0xFFFF); if(ucolIndirectBoundaries[src->parsedToken.indirectIndex].startContCE == 0) { src->parsedToken.charsLen = 3; + ucol_tok_addToExtraCurrent(src, buff, 3, status); } else { - *src->extraCurrent++ = (UChar)(ucolIndirectBoundaries[src->parsedToken.indirectIndex].startContCE >> 16); - *src->extraCurrent++ = (UChar)(ucolIndirectBoundaries[src->parsedToken.indirectIndex].startContCE & 0xFFFF); + buff[3] = (UChar)(ucolIndirectBoundaries[src->parsedToken.indirectIndex].startContCE >> 16); + buff[4] = (UChar)(ucolIndirectBoundaries[src->parsedToken.indirectIndex].startContCE & 0xFFFF); src->parsedToken.charsLen = 5; - } + ucol_tok_addToExtraCurrent(src, buff, 5, status); + } return TRUE; } +static UBool isCharNewLine(UChar c){ + switch(c){ + case 0x000A: /* LF */ + case 0x000D: /* CR */ + case 0x000C: /* FF */ + case 0x0085: /* NEL */ + case 0x2028: /* LS */ + case 0x2029: /* PS */ + return TRUE; + default: + return FALSE; + } +} + U_CAPI const UChar* U_EXPORT2 -ucol_tok_parseNextToken(UColTokenParser *src, +ucol_tok_parseNextToken(UColTokenParser *src, UBool startOfRules, UParseError *parseError, - UErrorCode *status) { + UErrorCode *status) { /* parsing part */ UBool variableTop = FALSE; UBool top = FALSE; @@ -709,7 +756,8 @@ ucol_tok_parseNextToken(UColTokenParser *src, // more time (around 2020 probably). uint32_t newExtensionLen = 0; uint32_t extensionOffset = 0; - uint32_t newStrength = UCOL_TOK_UNSET; + uint32_t newStrength = UCOL_TOK_UNSET; + UChar buff[10]; src->parsedToken.charsOffset = 0; src->parsedToken.charsLen = 0; src->parsedToken.prefixOffset = 0; src->parsedToken.prefixLen = 0; @@ -737,11 +785,11 @@ ucol_tok_parseNextToken(UColTokenParser *src, }else if(isEscaped){ isEscaped =FALSE; if (newStrength == UCOL_TOK_UNSET) { - *status = U_INVALID_FORMAT_ERROR; + *status = U_INVALID_FORMAT_ERROR; syntaxError(src->source,(int32_t)(src->current-src->source),(int32_t)(src->end-src->source),parseError); return NULL; // enabling rules to start with non-tokens a < b - // newStrength = UCOL_TOK_RESET; + // newStrength = UCOL_TOK_RESET; } if(ch != 0x0000 && src->current != src->end) { if (inChars) { @@ -760,7 +808,7 @@ ucol_tok_parseNextToken(UColTokenParser *src, if(!uprv_isRuleWhiteSpace(ch)) { /* Sets the strength for this entry */ switch (ch) { - case 0x003D/*'='*/ : + case 0x003D/*'='*/ : if (newStrength != UCOL_TOK_UNSET) { goto EndOfLoop; } @@ -768,14 +816,14 @@ ucol_tok_parseNextToken(UColTokenParser *src, /* if we start with strength, we'll reset to top */ if(startOfRules == TRUE) { src->parsedToken.indirectIndex = 5; - top = ucol_tok_doSetTop(src); + top = ucol_tok_doSetTop(src, status); newStrength = UCOL_TOK_RESET; goto EndOfLoop; } newStrength = UCOL_IDENTICAL; break; - case 0x002C/*','*/: + case 0x002C/*','*/: if (newStrength != UCOL_TOK_UNSET) { goto EndOfLoop; } @@ -783,7 +831,7 @@ ucol_tok_parseNextToken(UColTokenParser *src, /* if we start with strength, we'll reset to top */ if(startOfRules == TRUE) { src->parsedToken.indirectIndex = 5; - top = ucol_tok_doSetTop(src); + top = ucol_tok_doSetTop(src, status); newStrength = UCOL_TOK_RESET; goto EndOfLoop; } @@ -798,14 +846,14 @@ ucol_tok_parseNextToken(UColTokenParser *src, /* if we start with strength, we'll reset to top */ if(startOfRules == TRUE) { src->parsedToken.indirectIndex = 5; - top = ucol_tok_doSetTop(src); + top = ucol_tok_doSetTop(src, status); newStrength = UCOL_TOK_RESET; goto EndOfLoop; } newStrength = UCOL_SECONDARY; break; - case 0x003C/*'<'*/: + case 0x003C/*'<'*/: if (newStrength != UCOL_TOK_UNSET) { goto EndOfLoop; } @@ -813,7 +861,7 @@ ucol_tok_parseNextToken(UColTokenParser *src, /* if we start with strength, we'll reset to top */ if(startOfRules == TRUE) { src->parsedToken.indirectIndex = 5; - top = ucol_tok_doSetTop(src); + top = ucol_tok_doSetTop(src, status); newStrength = UCOL_TOK_RESET; goto EndOfLoop; } @@ -832,7 +880,7 @@ ucol_tok_parseNextToken(UColTokenParser *src, } break; - case 0x0026/*'&'*/: + case 0x0026/*'&'*/: if (newStrength != UCOL_TOK_UNSET) { /**/ goto EndOfLoop; @@ -848,12 +896,13 @@ ucol_tok_parseNextToken(UColTokenParser *src, //src->current = optionEnd; if(U_SUCCESS(*status)) { if(result & UCOL_TOK_TOP) { - if(newStrength == UCOL_TOK_RESET) { - top = ucol_tok_doSetTop(src); + if(newStrength == UCOL_TOK_RESET) { + top = ucol_tok_doSetTop(src, status); if(before) { // This is a combination of before and indirection like '&[before 2][first regular]extraCurrent++ = 0x002d; - *src->extraCurrent++ = before; src->parsedToken.charsLen+=2; + buff[0] = 0x002d; + buff[1] = before; + ucol_tok_addToExtraCurrent(src, buff, 2, status); } src->current++; @@ -867,7 +916,8 @@ ucol_tok_parseNextToken(UColTokenParser *src, variableTop = TRUE; src->parsedToken.charsOffset = (uint32_t)(src->extraCurrent - src->source); src->parsedToken.charsLen = 1; - *src->extraCurrent++ = 0xFFFF; + buff[0] = 0xFFFF; + ucol_tok_addToExtraCurrent(src, buff, 1, status); src->current++; goto EndOfLoop; } else { @@ -882,7 +932,7 @@ ucol_tok_parseNextToken(UColTokenParser *src, syntaxError(src->source,(int32_t)(src->current-src->source),(int32_t)(src->end-src->source),parseError); } - } + } } else { *status = U_INVALID_FORMAT_ERROR; syntaxError(src->source,(int32_t)(src->current-src->source),(int32_t)(src->end-src->source),parseError); @@ -890,8 +940,8 @@ ucol_tok_parseNextToken(UColTokenParser *src, } } break; - case 0x0021/*! skip java thai modifier reordering*/: - break; + case 0x0021/*! skip java thai modifier reordering*/: + break; case 0x002F/*'/'*/: wasInQuote = FALSE; /* if we were copying source characters, we want to stop now */ inChars = FALSE; /* we're now processing expansion */ @@ -902,10 +952,10 @@ ucol_tok_parseNextToken(UColTokenParser *src, /* found a quote, we're gonna start copying */ case 0x0027/*'\''*/: if (newStrength == UCOL_TOK_UNSET) { /* quote is illegal until we have a strength */ - *status = U_INVALID_FORMAT_ERROR; + *status = U_INVALID_FORMAT_ERROR; syntaxError(src->source,(int32_t)(src->current-src->source),(int32_t)(src->end-src->source),parseError); return NULL; - // enabling rules to start with a non-token character a < b + // enabling rules to start with a non-token character a < b // newStrength = UCOL_TOK_RESET; } @@ -916,8 +966,7 @@ ucol_tok_parseNextToken(UColTokenParser *src, src->parsedToken.charsOffset = (uint32_t)(src->extraCurrent - src->source); } if (src->parsedToken.charsLen != 0) { - uprv_memcpy(src->extraCurrent, src->current - src->parsedToken.charsLen, src->parsedToken.charsLen*sizeof(UChar)); - src->extraCurrent += src->parsedToken.charsLen; + ucol_tok_addToExtraCurrent(src, src->current - src->parsedToken.charsLen, src->parsedToken.charsLen, status); } src->parsedToken.charsLen++; } else { /* we're doing an expansion */ @@ -925,17 +974,16 @@ ucol_tok_parseNextToken(UColTokenParser *src, extensionOffset = (uint32_t)(src->extraCurrent - src->source); } if (newExtensionLen != 0) { - uprv_memcpy(src->extraCurrent, src->current - newExtensionLen, newExtensionLen*sizeof(UChar)); - src->extraCurrent += newExtensionLen; + ucol_tok_addToExtraCurrent(src, src->current - newExtensionLen, newExtensionLen, status); } newExtensionLen++; } wasInQuote = TRUE; - ch = *(++(src->current)); + ch = *(++(src->current)); if(ch == 0x0027) { /* copy the double quote */ - *src->extraCurrent++ = ch; + ucol_tok_addToExtraCurrent(src, &ch, 1, status); inQuote = FALSE; } break; @@ -951,7 +999,7 @@ ucol_tok_parseNextToken(UColTokenParser *src, case 0x007C /*|*/: /* this means we have actually been reading prefix part */ // we want to store read characters to the prefix part and continue reading // the characters (proper way would be to restart reading the chars, but in - // that case we would have to complicate the token hasher, which I do not + // that case we would have to complicate the token hasher, which I do not // intend to play with. Instead, we will do prefixes when prefixes are due // (before adding the elements). src->parsedToken.prefixOffset = src->parsedToken.charsOffset; @@ -962,8 +1010,7 @@ ucol_tok_parseNextToken(UColTokenParser *src, src->parsedToken.charsOffset = (uint32_t)(src->extraCurrent - src->source); } if (src->parsedToken.charsLen != 0) { - uprv_memcpy(src->extraCurrent, src->current - src->parsedToken.charsLen, src->parsedToken.charsLen*sizeof(UChar)); - src->extraCurrent += src->parsedToken.charsLen; + ucol_tok_addToExtraCurrent(src, src->current - src->parsedToken.charsLen, src->parsedToken.charsLen, status); } src->parsedToken.charsLen++; } @@ -971,18 +1018,24 @@ ucol_tok_parseNextToken(UColTokenParser *src, wasInQuote = TRUE; do { - ch = *(++(src->current)); + ch = *(++(src->current)); // skip whitespace between '|' and the character } while (uprv_isRuleWhiteSpace(ch)); break; - + //charsOffset = 0; //newCharsLen = 0; //break; // We want to store the whole prefix/character sequence. If we break // the '|' is going to get lost. + case 0x0023 /*#*/: /* this is a comment, skip everything through the end of line */ + do { + ch = *(++(src->current)); + } while (!isCharNewLine(ch)); + + break; default: if (newStrength == UCOL_TOK_UNSET) { - *status = U_INVALID_FORMAT_ERROR; + *status = U_INVALID_FORMAT_ERROR; syntaxError(src->source,(int32_t)(src->current-src->source),(int32_t)(src->end-src->source),parseError); return NULL; } @@ -1010,28 +1063,15 @@ ucol_tok_parseNextToken(UColTokenParser *src, } break; - } + } } } if(wasInQuote) { if(ch != 0x27) { - *src->extraCurrent++ = ch; - } - if(src->extraCurrent > src->extraEnd) { - /* reallocate */ - UChar *newSrc = (UChar *)uprv_realloc(src->source, (src->extraEnd-src->source)*2*sizeof(UChar)); - if(newSrc != NULL) { - src->current = newSrc + (src->current - src->source); - src->extraCurrent = newSrc + (src->extraCurrent - src->source); - src->end = newSrc + (src->end - src->source); - src->extraEnd = newSrc + (src->extraEnd-src->source)*2; - src->sourceCurrent = newSrc + (src->sourceCurrent-src->source); - src->source = newSrc; - } else { - *status = U_MEMORY_ALLOCATION_ERROR; - return NULL; - } + if(inQuote || !uprv_isRuleWhiteSpace(ch)) { + ucol_tok_addToExtraCurrent(src, &ch, 1, status); + } } } @@ -1045,12 +1085,12 @@ ucol_tok_parseNextToken(UColTokenParser *src, } if (src->parsedToken.charsLen == 0 && top == FALSE) { - syntaxError(src->source,(int32_t)(src->current-src->source),(int32_t)(src->end-src->source),parseError); + syntaxError(src->source,(int32_t)(src->current-src->source),(int32_t)(src->end-src->source),parseError); *status = U_INVALID_FORMAT_ERROR; return NULL; } - src->parsedToken.strength = newStrength; + src->parsedToken.strength = newStrength; src->parsedToken.extensionOffset = extensionOffset; src->parsedToken.extensionLen = newExtensionLen; src->parsedToken.flags = (UCOL_TOK_VARIABLE_TOP * (variableTop?1:0)) | (UCOL_TOK_TOP * (top?1:0)) | before; @@ -1060,11 +1100,11 @@ ucol_tok_parseNextToken(UColTokenParser *src, /* Processing Description - 1 Build a ListList. Each list has a header, which contains two lists (positive - and negative), a reset token, a baseCE, nextCE, and previousCE. The lists and - reset may be null. - 2 As you process, you keep a LAST pointer that points to the last token you - handled. + 1 Build a ListList. Each list has a header, which contains two lists (positive + and negative), a reset token, a baseCE, nextCE, and previousCE. The lists and + reset may be null. + 2 As you process, you keep a LAST pointer that points to the last token you + handled. */ static UColToken *ucol_tok_initAReset(UColTokenParser *src, UChar *expand, uint32_t *expandNext, @@ -1092,8 +1132,11 @@ static UColToken *ucol_tok_initAReset(UColTokenParser *src, UChar *expand, uint3 sourceToken->debugSource = *(src->source + src->parsedToken.charsOffset); sourceToken->debugExpansion = *(src->source + src->parsedToken.extensionOffset); + // keep the flags around so that we know about before + sourceToken->flags = src->parsedToken.flags; + if(src->parsedToken.prefixOffset != 0) { - // this is a syntax error + // this is a syntax error *status = U_INVALID_FORMAT_ERROR; syntaxError(src->source,src->parsedToken.charsOffset-1,src->parsedToken.charsOffset+src->parsedToken.charsLen,parseError); return 0; @@ -1117,13 +1160,13 @@ static UColToken *ucol_tok_initAReset(UColTokenParser *src, UChar *expand, uint3 src->lh[src->resultLen].reset = sourceToken; /* - 3 Consider each item: relation, source, and expansion: e.g. ...< x / y ... - First convert all expansions into normal form. Examples: - If "xy" doesn't occur earlier in the list or in the UCA, convert &xy * c * - d * ... into &x * c/y * d * ... - Note: reset values can never have expansions, although they can cause the - very next item to have one. They may be contractions, if they are found - earlier in the list. + 3 Consider each item: relation, source, and expansion: e.g. ...< x / y ... + First convert all expansions into normal form. Examples: + If "xy" doesn't occur earlier in the list or in the UCA, convert &xy * c * + d * ... into &x * c/y * d * ... + Note: reset values can never have expansions, although they can cause the + very next item to have one. They may be contractions, if they are found + earlier in the list. */ if(expand != NULL) { /* check to see if there is an expansion */ @@ -1155,9 +1198,9 @@ inline UColToken *getVirginBefore(UColTokenParser *src, UColToken *sourceToken, uint32_t CE, SecondCE; uint32_t invPos; if(sourceToken != NULL) { - uprv_init_collIterate(src->UCA, src->source+((sourceToken->source)&0xFFFFFF), 1, &s); + uprv_init_collIterate(src->UCA, src->source+((sourceToken->source)&0xFFFFFF), 1, &s); } else { - uprv_init_collIterate(src->UCA, src->source+src->parsedToken.charsOffset /**charsOffset*/, 1, &s); + uprv_init_collIterate(src->UCA, src->source+src->parsedToken.charsOffset /**charsOffset*/, 1, &s); } baseCE = ucol_getNextCE(src->UCA, &s, status) & 0xFFFFFF3F; @@ -1166,58 +1209,146 @@ inline UColToken *getVirginBefore(UColTokenParser *src, UColToken *sourceToken, baseContCE = 0; } - invPos = ucol_inv_getPrevCE(baseCE, baseContCE, &CE, &SecondCE, strength); - - uint32_t *CETable = (uint32_t *)((uint8_t *)src->invUCA+src->invUCA->table); - uint32_t ch = CETable[3*invPos+2]; - - if((ch & UCOL_INV_SIZEMASK) != 0) { - uint16_t *conts = (uint16_t *)((uint8_t *)src->invUCA+src->invUCA->conts); - uint32_t offset = (ch & UCOL_INV_OFFSETMASK); - ch = conts[offset]; - } - *src->extraCurrent++ = (UChar)ch; - src->parsedToken.charsOffset = (uint32_t)(src->extraCurrent - src->source - 1); - src->parsedToken.charsLen = 1; - - // We got an UCA before. However, this might have been tailored. - // example: - // &\u30ca = \u306a - // &[before 3]\u306a<<<\u306a|\u309d - - - // uint32_t key = (*newCharsLen << 24) | *charsOffset; - UColToken key; + + UCAConstants *consts = (UCAConstants *)((uint8_t *)src->UCA->image + src->UCA->image->UCAConsts); + uint32_t ch = 0; uint32_t expandNext = 0; - key.source = (src->parsedToken.charsLen/**newCharsLen*/ << 24) | src->parsedToken.charsOffset/**charsOffset*/; - key.rulesToParse = src->source; - - //sourceToken = (UColToken *)uhash_iget(src->tailored, (int32_t)key); - sourceToken = (UColToken *)uhash_get(src->tailored, &key); - - // if we found a tailored thing, we have to use the UCA value and construct - // a new reset token with constructed name - if(sourceToken != NULL && sourceToken->strength != UCOL_TOK_RESET) { - // character to which we want to anchor is already tailored. - // We need to construct a new token which will be the anchor - // point - *(src->extraCurrent-1) = 0xFFFE; - *src->extraCurrent++ = (UChar)ch; - src->parsedToken.charsLen++; - src->lh[src->resultLen].baseCE = CE & 0xFFFFFF3F; - if(isContinuation(SecondCE)) { - src->lh[src->resultLen].baseContCE = SecondCE; - } else { - src->lh[src->resultLen].baseContCE = 0; - } - src->lh[src->resultLen].nextCE = 0; - src->lh[src->resultLen].nextContCE = 0; - src->lh[src->resultLen].previousCE = 0; - src->lh[src->resultLen].previousContCE = 0; + UColToken key; + + if((baseCE & 0xFF000000) >= (consts->UCA_PRIMARY_IMPLICIT_MIN<<24) && (baseCE & 0xFF000000) <= (consts->UCA_PRIMARY_IMPLICIT_MAX<<24) ) { /* implicits - */ + uint32_t primary = baseCE & UCOL_PRIMARYMASK | (baseContCE & UCOL_PRIMARYMASK) >> 16; + uint32_t raw = uprv_uca_getRawFromImplicit(primary); + ch = uprv_uca_getCodePointFromRaw(raw-1); + uint32_t primaryCE = uprv_uca_getImplicitFromRaw(raw-1); + CE = primaryCE & UCOL_PRIMARYMASK | 0x0505; + SecondCE = (primaryCE << 16) & UCOL_PRIMARYMASK | UCOL_CONTINUATION_MARKER; + + src->parsedToken.charsOffset = (uint32_t)(src->extraCurrent - src->source); + *src->extraCurrent++ = 0xFFFE; + *src->extraCurrent++ = (UChar)ch; + src->parsedToken.charsLen++; + + key.source = (src->parsedToken.charsLen/**newCharsLen*/ << 24) | src->parsedToken.charsOffset/**charsOffset*/; + key.rulesToParse = src->source; + + //sourceToken = (UColToken *)uhash_iget(src->tailored, (int32_t)key); + sourceToken = (UColToken *)uhash_get(src->tailored, &key); + + if(sourceToken == NULL) { + src->lh[src->resultLen].baseCE = CE & 0xFFFFFF3F; + if(isContinuation(SecondCE)) { + src->lh[src->resultLen].baseContCE = SecondCE; + } else { + src->lh[src->resultLen].baseContCE = 0; + } + src->lh[src->resultLen].nextCE = 0; + src->lh[src->resultLen].nextContCE = 0; + src->lh[src->resultLen].previousCE = 0; + src->lh[src->resultLen].previousContCE = 0; + + src->lh[src->resultLen].indirect = FALSE; + + sourceToken = ucol_tok_initAReset(src, 0, &expandNext, parseError, status); + } + + } else { + invPos = ucol_inv_getPrevCE(src, baseCE, baseContCE, &CE, &SecondCE, strength); + + // we got the previous CE. Now we need to see if the difference between + // the two CEs is really of the requested strength. + // if it's a bigger difference (we asked for secondary and got primary), we + // need to modify the CE. + if(ucol_getCEStrengthDifference(baseCE, baseContCE, CE, SecondCE) < strength) { + // adjust the strength + // now we are in the situation where our baseCE should actually be modified in + // order to get the CE in the right position. + if(strength == UCOL_SECONDARY) { + CE = baseCE - 0x0200; + } else { // strength == UCOL_TERTIARY + CE = baseCE - 0x02; + } + if(baseContCE) { + if(strength == UCOL_SECONDARY) { + SecondCE = baseContCE - 0x0200; + } else { // strength == UCOL_TERTIARY + SecondCE = baseContCE - 0x02; + } + } + } + +#if 0 + // the code below relies on getting a code point from the inverse table, in order to be + // able to merge the situations like &x < 9 &[before 1]a < d. This won't work: + // 1. There are many code points that have the same CE + // 2. The CE to codepoint table (things pointed to by CETable[3*invPos+2] are broken. + // Also, in case when there is no equivalent strength before an element, we have to actually + // construct one. For example, &[before 2]a << x won't result in x << a, because the element + // before a is a primary difference. + + //uint32_t *CETable = (uint32_t *)((uint8_t *)src->invUCA+src->invUCA->table); + + + ch = CETable[3*invPos+2]; + + if((ch & UCOL_INV_SIZEMASK) != 0) { + uint16_t *conts = (uint16_t *)((uint8_t *)src->invUCA+src->invUCA->conts); + uint32_t offset = (ch & UCOL_INV_OFFSETMASK); + ch = conts[offset]; + } + + *src->extraCurrent++ = (UChar)ch; + src->parsedToken.charsOffset = (uint32_t)(src->extraCurrent - src->source - 1); + src->parsedToken.charsLen = 1; + + // We got an UCA before. However, this might have been tailored. + // example: + // &\u30ca = \u306a + // &[before 3]\u306a<<<\u306a|\u309d + + + // uint32_t key = (*newCharsLen << 24) | *charsOffset; + key.source = (src->parsedToken.charsLen/**newCharsLen*/ << 24) | src->parsedToken.charsOffset/**charsOffset*/; + key.rulesToParse = src->source; + + //sourceToken = (UColToken *)uhash_iget(src->tailored, (int32_t)key); + sourceToken = (UColToken *)uhash_get(src->tailored, &key); +#endif + + // here is how it should be. The situation such as &[before 1]a < x, should be + // resolved exactly as if we wrote &a > x. + // therefore, I don't really care if the UCA value before a has been changed. + // However, I do care if the strength between my element and the previous element + // is bigger then I wanted. So, if CE < baseCE and I wanted &[before 2], then i'll + // have to construct the base CE. + + + + // if we found a tailored thing, we have to use the UCA value and construct + // a new reset token with constructed name + //if(sourceToken != NULL && sourceToken->strength != UCOL_TOK_RESET) { + // character to which we want to anchor is already tailored. + // We need to construct a new token which will be the anchor + // point + //*(src->extraCurrent-1) = 0xFFFE; + //*src->extraCurrent++ = (UChar)ch; + // grab before + src->parsedToken.charsOffset -= 10; + src->parsedToken.charsLen += 10; + src->lh[src->resultLen].baseCE = CE & 0xFFFFFF3F; + if(isContinuation(SecondCE)) { + src->lh[src->resultLen].baseContCE = SecondCE; + } else { + src->lh[src->resultLen].baseContCE = 0; + } + src->lh[src->resultLen].nextCE = 0; + src->lh[src->resultLen].nextContCE = 0; + src->lh[src->resultLen].previousCE = 0; + src->lh[src->resultLen].previousContCE = 0; - src->lh[src->resultLen].indirect = FALSE; + src->lh[src->resultLen].indirect = FALSE; - sourceToken = ucol_tok_initAReset(src, 0, &expandNext, parseError, status); + sourceToken = ucol_tok_initAReset(src, 0, &expandNext, parseError, status); + //} } return sourceToken; @@ -1233,7 +1364,7 @@ uint32_t ucol_tok_assembleTokenList(UColTokenParser *src, UParseError *parseErro uint16_t specs = 0; UColTokListHeader *ListList = NULL; - src->parsedToken.strength = UCOL_TOK_UNSET; + src->parsedToken.strength = UCOL_TOK_UNSET; ListList = src->lh; @@ -1243,8 +1374,8 @@ uint32_t ucol_tok_assembleTokenList(UColTokenParser *src, UParseError *parseErro while(src->current < src->end) { src->parsedToken.prefixOffset = 0; - - parseEnd = ucol_tok_parseNextToken(src, + + parseEnd = ucol_tok_parseNextToken(src, (UBool)(lastToken == NULL), parseError, status); @@ -1259,7 +1390,7 @@ uint32_t ucol_tok_assembleTokenList(UColTokenParser *src, UParseError *parseErro UColToken *sourceToken = NULL; //uint32_t key = 0; uint32_t lastStrength = UCOL_TOK_UNSET; - + if(lastToken != NULL ) { lastStrength = lastToken->strength; } @@ -1300,6 +1431,8 @@ uint32_t ucol_tok_assembleTokenList(UColTokenParser *src, UParseError *parseErro sourceToken->previous = NULL; sourceToken->noOfCEs = 0; sourceToken->noOfExpCEs = 0; + // keep the flags around so that we know about before + sourceToken->flags = src->parsedToken.flags; uhash_put(src->tailored, sourceToken, sourceToken, status); } else { /* we could have fished out a reset here */ @@ -1328,12 +1461,12 @@ uint32_t ucol_tok_assembleTokenList(UColTokenParser *src, UParseError *parseErro sourceToken->listHeader = lastToken->listHeader; /* - 1. Find the strongest strength in each list, and set strongestP and strongestN - accordingly in the headers. + 1. Find the strongest strength in each list, and set strongestP and strongestN + accordingly in the headers. */ - if(lastStrength == UCOL_TOK_RESET + if(lastStrength == UCOL_TOK_RESET || sourceToken->listHeader->first == 0) { - /* If LAST is a reset + /* If LAST is a reset insert sourceToken in the list. */ if(sourceToken->listHeader->first == 0) { sourceToken->listHeader->first = sourceToken; @@ -1361,12 +1494,12 @@ uint32_t ucol_tok_assembleTokenList(UColTokenParser *src, UParseError *parseErro } } } else { - /* Otherwise (when LAST is not a reset) - if polarity (LAST) == polarity(relation), insert sourceToken after LAST, - otherwise insert before. - when inserting after or before, search to the next position with the same + /* Otherwise (when LAST is not a reset) + if polarity (LAST) == polarity(relation), insert sourceToken after LAST, + otherwise insert before. + when inserting after or before, search to the next position with the same strength in that direction. (This is called postpone insertion). */ - if(sourceToken != lastToken) { + if(sourceToken != lastToken) { if(lastToken->polarity == sourceToken->polarity) { while(lastToken->next != NULL && lastToken->next->strength > sourceToken->strength) { lastToken = lastToken->next; @@ -1407,8 +1540,8 @@ uint32_t ucol_tok_assembleTokenList(UColTokenParser *src, UParseError *parseErro } // Treat the expansions. - // There are two types of expansions: explicit (x / y) and reset based propagating expansions - // (&abc * d * e <=> &ab * d / c * e / c) + // There are two types of expansions: explicit (x / y) and reset based propagating expansions + // (&abc * d * e <=> &ab * d / c * e / c) // if both of them are in effect for a token, they are combined. sourceToken->expansion = src->parsedToken.extensionLen << 24 | src->parsedToken.extensionOffset; @@ -1432,6 +1565,19 @@ uint32_t ucol_tok_assembleTokenList(UColTokenParser *src, UParseError *parseErro } else { sourceToken->debugExpansion = 0; } + // if the previous token was a reset before, the strength of this + // token must match the strength of before. Otherwise we have an + // undefined situation. + // In other words, we currently have a cludge which we use to + // represent &a >> x. This is written as &[before 2]a << x. + if((lastToken->flags & UCOL_TOK_BEFORE) != 0) { + uint8_t beforeStrength = (lastToken->flags & UCOL_TOK_BEFORE) - 1; + if(beforeStrength != sourceToken->strength) { + *status = U_INVALID_FORMAT_ERROR; + syntaxError(src->source,0,(int32_t)(src->end-src->source),parseError); + return 0; + } + } } else { if(lastToken != NULL && lastStrength == UCOL_TOK_RESET) { /* if the previous token was also a reset, */ @@ -1460,7 +1606,7 @@ uint32_t ucol_tok_assembleTokenList(UColTokenParser *src, UParseError *parseErro if((specs & UCOL_TOK_BEFORE) != 0) { /* we're doing before */ if(top == FALSE) { /* there is no indirection */ uint8_t strength = (specs & UCOL_TOK_BEFORE) - 1; - if(sourceToken != NULL && sourceToken->strength != UCOL_TOK_RESET) { + if(sourceToken != NULL && sourceToken->strength != UCOL_TOK_RESET) { /* this is a before that is already ordered in the UCA - so we need to get the previous with good strength */ while(sourceToken->strength > strength && sourceToken->previous != NULL) { sourceToken = sourceToken->previous; @@ -1471,7 +1617,7 @@ uint32_t ucol_tok_assembleTokenList(UColTokenParser *src, UParseError *parseErro sourceToken = sourceToken->previous; } else { /* start of list */ sourceToken = sourceToken->listHeader->reset; - } + } } else { /* we hit NULL */ /* we should be doing the else part */ sourceToken = sourceToken->listHeader->reset; @@ -1493,8 +1639,17 @@ uint32_t ucol_tok_assembleTokenList(UColTokenParser *src, UParseError *parseErro uint32_t baseContCE = ucolIndirectBoundaries[src->parsedToken.indirectIndex].startContCE;//&0xFFFFFF3F; uint32_t CE = UCOL_NOT_FOUND, SecondCE = UCOL_NOT_FOUND; - /*int32_t invPos = ucol_inv_getPrevCE(baseCE, baseContCE, &CE, &SecondCE, strength);*/ - ucol_inv_getPrevCE(baseCE, baseContCE, &CE, &SecondCE, strength); + UCAConstants *consts = (UCAConstants *)((uint8_t *)src->UCA->image + src->UCA->image->UCAConsts); + if((baseCE & 0xFF000000) >= (consts->UCA_PRIMARY_IMPLICIT_MIN<<24) && (baseCE & 0xFF000000) <= (consts->UCA_PRIMARY_IMPLICIT_MAX<<24) ) { /* implicits - */ + uint32_t primary = baseCE & UCOL_PRIMARYMASK | (baseContCE & UCOL_PRIMARYMASK) >> 16; + uint32_t raw = uprv_uca_getRawFromImplicit(primary); + uint32_t primaryCE = uprv_uca_getImplicitFromRaw(raw-1); + CE = primaryCE & UCOL_PRIMARYMASK | 0x0505; + SecondCE = (primaryCE << 16) & UCOL_PRIMARYMASK | UCOL_CONTINUATION_MARKER; + } else { + /*int32_t invPos = ucol_inv_getPrevCE(baseCE, baseContCE, &CE, &SecondCE, strength);*/ + ucol_inv_getPrevCE(src, baseCE, baseContCE, &CE, &SecondCE, strength); + } ListList[src->resultLen].baseCE = CE; ListList[src->resultLen].baseContCE = SecondCE; @@ -1506,19 +1661,19 @@ uint32_t ucol_tok_assembleTokenList(UColTokenParser *src, UParseError *parseErro } - /* 5 If the relation is a reset: - If sourceToken is null - Create new list, create new sourceToken, make the baseCE from source, put + /* 5 If the relation is a reset: + If sourceToken is null + Create new list, create new sourceToken, make the baseCE from source, put the sourceToken in ListHeader of the new list */ if(sourceToken == NULL) { /* - 3 Consider each item: relation, source, and expansion: e.g. ...< x / y ... - First convert all expansions into normal form. Examples: - If "xy" doesn't occur earlier in the list or in the UCA, convert &xy * c * - d * ... into &x * c/y * d * ... - Note: reset values can never have expansions, although they can cause the - very next item to have one. They may be contractions, if they are found - earlier in the list. + 3 Consider each item: relation, source, and expansion: e.g. ...< x / y ... + First convert all expansions into normal form. Examples: + If "xy" doesn't occur earlier in the list or in the UCA, convert &xy * c * + d * ... into &x * c/y * d * ... + Note: reset values can never have expansions, although they can cause the + very next item to have one. They may be contractions, if they are found + earlier in the list. */ if(top == FALSE) { collIterate s; @@ -1560,7 +1715,7 @@ uint32_t ucol_tok_assembleTokenList(UColTokenParser *src, UParseError *parseErro top = FALSE; } } - /* 7 After all this, set LAST to point to sourceToken, and goto step 3. */ + /* 7 After all this, set LAST to point to sourceToken, and goto step 3. */ lastToken = sourceToken; } else { if(U_FAILURE(*status)) { @@ -1575,16 +1730,16 @@ uint32_t ucol_tok_assembleTokenList(UColTokenParser *src, UParseError *parseErro return src->resultLen; } -void ucol_tok_initTokenList(UColTokenParser *src, const UChar *rules, const uint32_t rulesLength, UCollator *UCA, UErrorCode *status) { +void ucol_tok_initTokenList(UColTokenParser *src, const UChar *rules, const uint32_t rulesLength, const UCollator *UCA, UErrorCode *status) { uint32_t nSize = 0; uint32_t estimatedSize = (2*rulesLength+UCOL_TOK_EXTRA_RULE_SPACE_SIZE); if(U_FAILURE(*status)) { return; } - + // set everything to zero, so that we can clean up gracefully uprv_memset(src, 0, sizeof(UColTokenParser)); - + // first we need to find options that don't like to be normalized, // like copy and remove... //const UChar *openBrace = rules; @@ -1632,6 +1787,7 @@ void ucol_tok_initTokenList(UColTokenParser *src, const UChar *rules, const uint *status = U_MEMORY_ALLOCATION_ERROR; return; } + uprv_memset(src->source, 0, estimatedSize*sizeof(UChar)); nSize = unorm_normalize(rules, rulesLength, UNORM_NFD, 0, src->source, estimatedSize, status); if(nSize > estimatedSize || *status == U_BUFFER_OVERFLOW_ERROR) { *status = U_ZERO_ERROR; @@ -1646,7 +1802,7 @@ void ucol_tok_initTokenList(UColTokenParser *src, const UChar *rules, const uint src->current = src->source; src->end = src->source+nSize; src->sourceCurrent = src->source; - src->extraCurrent = src->end; + src->extraCurrent = src->end+1; // Preserve terminating zero in the rule string so that option scanning works correctly src->extraEnd = src->source+estimatedSize; //src->end+UCOL_TOK_EXTRA_RULE_SPACE_SIZE; src->varTop = NULL; src->UCA = UCA; @@ -1688,12 +1844,13 @@ void ucol_tok_initTokenList(UColTokenParser *src, const UChar *rules, const uint *status = U_MEMORY_ALLOCATION_ERROR; return; } + uprv_memset(src->lh, 0, src->listCapacity*sizeof(UColTokListHeader)); src->resultLen = 0; UCAConstants *consts = (UCAConstants *)((uint8_t *)src->UCA->image + src->UCA->image->UCAConsts); // UCOL_RESET_TOP_VALUE - setIndirectBoundaries(0, consts->UCA_LAST_NON_VARIABLE, consts->UCA_FIRST_IMPLICIT); + setIndirectBoundaries(0, consts->UCA_LAST_NON_VARIABLE, consts->UCA_FIRST_IMPLICIT); // UCOL_FIRST_PRIMARY_IGNORABLE setIndirectBoundaries(1, consts->UCA_FIRST_PRIMARY_IGNORABLE, 0); // UCOL_LAST_PRIMARY_IGNORABLE diff --git a/icuSources/i18n/ucol_tok.h b/icuSources/i18n/ucol_tok.h index 8ea66c0a..3a598488 100644 --- a/icuSources/i18n/ucol_tok.h +++ b/icuSources/i18n/ucol_tok.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2001-2003, International Business Machines +* Copyright (C) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -83,6 +83,7 @@ struct UColToken { UColToken* previous; UColToken* next; UChar *rulesToParse; + uint16_t flags; }; /* @@ -151,7 +152,7 @@ uint32_t ucol_tok_assembleTokenList(UColTokenParser *src, UErrorCode *status); U_CFUNC -void ucol_tok_initTokenList(UColTokenParser *src, const UChar *rules, const uint32_t rulesLength, UCollator *UCA, UErrorCode *status); +void ucol_tok_initTokenList(UColTokenParser *src, const UChar *rules, const uint32_t rulesLength, const UCollator *UCA, UErrorCode *status); U_CFUNC void ucol_tok_closeTokenList(UColTokenParser *src); @@ -164,6 +165,18 @@ U_CAPI const UChar * U_EXPORT2 ucol_tok_getNextArgument(const UChar *start, const UChar *end, UColAttribute *attrib, UColAttributeValue *value, UErrorCode *status); +U_CAPI int32_t U_EXPORT2 ucol_inv_getNextCE(const UColTokenParser *src, + uint32_t CE, uint32_t contCE, + uint32_t *nextCE, uint32_t *nextContCE, + uint32_t strength); +U_CAPI int32_t U_EXPORT2 ucol_inv_getPrevCE(const UColTokenParser *src, + uint32_t CE, uint32_t contCE, + uint32_t *prevCE, uint32_t *prevContCE, + uint32_t strength); + +U_CAPI uint32_t U_EXPORT2 ucol_getCEStrengthDifference(uint32_t CE, uint32_t contCE, + uint32_t prevCE, uint32_t prevContCE); + #endif /* #if !UCONFIG_NO_COLLATION */ diff --git a/icuSources/i18n/ucol_wgt.c b/icuSources/i18n/ucol_wgt.c index aaf8d8cc..c0fbaaaf 100644 --- a/icuSources/i18n/ucol_wgt.c +++ b/icuSources/i18n/ucol_wgt.c @@ -25,14 +25,12 @@ #include "ucol_imp.h" #include "ucol_wgt.h" #include "cmemory.h" +#include "uarrsort.h" #ifdef UCOL_DEBUG # include #endif -/* we are using qsort() */ -#include - #if defined(UCOL_DEBUG) && defined(WIN32) /* turn off "unreferenced formal parameter" */ # pragma warning(disable: 4100) @@ -42,7 +40,7 @@ /* helper functions for CE weights */ -static int32_t +static U_INLINE int32_t lengthOfWeight(uint32_t weight) { if((weight&0xffffff)==0) { return 1; @@ -55,23 +53,23 @@ lengthOfWeight(uint32_t weight) { } } -static uint32_t +static U_INLINE uint32_t getWeightTrail(uint32_t weight, int32_t length) { return (uint32_t)(weight>>(8*(4-length)))&0xff; } -static uint32_t +static U_INLINE uint32_t setWeightTrail(uint32_t weight, int32_t length, uint32_t trail) { length=8*(4-length); return (uint32_t)((weight&(0xffffff00<start; @@ -146,7 +144,7 @@ compareRanges(const void *left, const void *right) { * possible ranges of weights between the two limits, excluding them * for weights with up to 4 bytes there are up to 2*4-1=7 ranges */ -static int32_t +static U_INLINE int32_t getWeightRanges(uint32_t lowerLimit, uint32_t upperLimit, uint32_t maxByte, uint32_t countBytes, WeightRange ranges[7]) { @@ -318,7 +316,7 @@ ucol_allocWeights(uint32_t lowerLimit, uint32_t upperLimit, uint32_t lengthCounts[6]; /* [0] unused, [5] to make index checks unnecessary */ uint32_t maxCount; - int32_t i, rangeCount, minLength, maxLength; + int32_t i, rangeCount, minLength/*, maxLength*/; /* countBytes to the power of index */ uint32_t powers[5]; @@ -391,8 +389,7 @@ ucol_allocWeights(uint32_t lowerLimit, uint32_t upperLimit, /* easy case, just make this one range large enough by lengthening it once more, possibly split it */ uint32_t count1, count2, power_1, power; - rangeCount=1; - maxLength=minLength+1; + /*maxLength=minLength+1;*/ /* calculate how to split the range between maxLength-1 (count1) and maxLength (count2) */ power_1=powers[minLength-ranges[0].length]; @@ -405,6 +402,8 @@ ucol_allocWeights(uint32_t lowerLimit, uint32_t upperLimit, printf("split the first range %ld:%ld\n", count1, count2); #endif if(count1<1) { + rangeCount=1; + /* lengthen the entire range to maxLength */ lengthenRange(ranges, maxByte, countBytes); } else { @@ -464,7 +463,9 @@ ucol_allocWeights(uint32_t lowerLimit, uint32_t upperLimit, if(rangeCount>1) { /* sort the ranges by weight values */ - qsort(ranges, rangeCount, sizeof(WeightRange), compareRanges); + UErrorCode errorCode=U_ZERO_ERROR; + uprv_sortArray(ranges, rangeCount, sizeof(WeightRange), compareRanges, NULL, FALSE, &errorCode); + /* ignore error code: we know that the internal sort function will not fail here */ } #ifdef UCOL_DEBUG diff --git a/icuSources/i18n/ucoleitr.cpp b/icuSources/i18n/ucoleitr.cpp index 51515b4b..f386fb4e 100644 --- a/icuSources/i18n/ucoleitr.cpp +++ b/icuSources/i18n/ucoleitr.cpp @@ -243,6 +243,7 @@ ucol_setOffset(UCollationElements *elems, ci->flags |= UCOL_ITER_HASLEN; } ci->fcdPosition = NULL; + elems->reset_ = FALSE; } U_CAPI int32_t U_EXPORT2 diff --git a/icuSources/i18n/ucurr.cpp b/icuSources/i18n/ucurr.cpp index 4eb42de4..29332db1 100644 --- a/icuSources/i18n/ucurr.cpp +++ b/icuSources/i18n/ucurr.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (c) 2002-2003, International Business Machines +* Copyright (c) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** */ @@ -11,12 +11,15 @@ #include "unicode/ucurr.h" #include "unicode/locid.h" -#include "unicode/resbund.h" +#include "unicode/ures.h" #include "unicode/ustring.h" +#include "unicode/choicfmt.h" +#include "unicode/parsepos.h" +#include "ustr_imp.h" #include "cmemory.h" #include "cstring.h" #include "uassert.h" -#include "iculserv.h" +#include "mutex.h" #include "ucln_in.h" //------------------------------------------------------------ @@ -38,7 +41,9 @@ static const int32_t MAX_POW10 = (sizeof(POW10)/sizeof(POW10[0])) - 1; //------------------------------------------------------------ // Resource tags +// +static const char CURRENCY_DATA[] = "CurrencyData"; // Tag for meta-data, in root. static const char CURRENCY_META[] = "CurrencyMeta"; @@ -57,6 +62,13 @@ static const char VAR_EURO[] = "EURO"; // Variant delimiter static const char VAR_DELIM[] = "_"; +// Variant for legacy euro mapping in CurrencyMap +static const char VAR_DELIM_EURO[] = "_EURO"; + +#define VARIANT_IS_EMPTY 0 +#define VARIANT_IS_EURO 0x1 +#define VARIANT_IS_PREEURO 0x2 + // Tag for localized display names (symbols) of currencies static const char CURRENCIES[] = "Currencies"; @@ -87,41 +99,86 @@ myUCharsToChars(char* resultOfLen4, const UChar* currency) { * units of 10^(-fraction_digits). */ static const int32_t* -_findMetaData(const UChar* currency) { +_findMetaData(const UChar* currency, UErrorCode& ec) { + + if (currency == 0 || *currency == 0) { + if (U_SUCCESS(ec)) { + ec = U_ILLEGAL_ARGUMENT_ERROR; + } + return LAST_RESORT_DATA; + } // Get CurrencyMeta resource out of root locale file. [This may // move out of the root locale file later; if it does, update this // code.] - UErrorCode ec = U_ZERO_ERROR; - ResourceBundle currencyMeta = - ResourceBundle((char*)0, Locale(""), ec).get(CURRENCY_META, ec); - + UResourceBundle* currencyData = ures_openDirect(NULL, CURRENCY_DATA, &ec); + UResourceBundle* currencyMeta = ures_getByKey(currencyData, CURRENCY_META, currencyData, &ec); + if (U_FAILURE(ec)) { + ures_close(currencyMeta); // Config/build error; return hard-coded defaults return LAST_RESORT_DATA; } // Look up our currency, or if that's not available, then DEFAULT char buf[ISO_COUNTRY_CODE_LENGTH+1]; - ResourceBundle rb = currencyMeta.get(myUCharsToChars(buf, currency), ec); - if (U_FAILURE(ec)) { - rb = currencyMeta.get(DEFAULT_META, ec); + UErrorCode ec2 = U_ZERO_ERROR; // local error code: soft failure + UResourceBundle* rb = ures_getByKey(currencyMeta, myUCharsToChars(buf, currency), NULL, &ec2); + if (U_FAILURE(ec2)) { + ures_close(rb); + rb = ures_getByKey(currencyMeta,DEFAULT_META, NULL, &ec); if (U_FAILURE(ec)) { + ures_close(currencyMeta); + ures_close(rb); // Config/build error; return hard-coded defaults return LAST_RESORT_DATA; } } int32_t len; - const int32_t *data = rb.getIntVector(len, ec); - if (U_FAILURE(ec) || len < 2) { + const int32_t *data = ures_getIntVector(rb, &len, &ec); + if (U_FAILURE(ec) || len != 2) { // Config/build error; return hard-coded defaults + if (U_SUCCESS(ec)) { + ec = U_INVALID_FORMAT_ERROR; + } + ures_close(currencyMeta); + ures_close(rb); return LAST_RESORT_DATA; } + ures_close(currencyMeta); + ures_close(rb); return data; } +// ------------------------------------- + +/** + * @see VARIANT_IS_EURO + * @see VARIANT_IS_PREEURO + */ +static uint32_t +idForLocale(const char* locale, char* countryAndVariant, int capacity, UErrorCode* ec) +{ + uint32_t variantType = 0; + // !!! this is internal only, assumes buffer is not null and capacity is sufficient + // Extract the country name and variant name. We only + // recognize two variant names, EURO and PREEURO. + char variant[ULOC_FULLNAME_CAPACITY]; + uloc_getCountry(locale, countryAndVariant, capacity, ec); + uloc_getVariant(locale, variant, sizeof(variant), ec); + if (variant[0] != 0) { + variantType = (0 == uprv_strcmp(variant, VAR_EURO)) + | ((0 == uprv_strcmp(variant, VAR_PRE_EURO)) << 1); + if (variantType) + { + uprv_strcat(countryAndVariant, VAR_DELIM); + uprv_strcat(countryAndVariant, variant); + } + } + return variantType; +} // ------------------------------------------ // @@ -131,6 +188,10 @@ _findMetaData(const UChar* currency) { // don't use ICUService since we don't need fallback +#if !UCONFIG_NO_SERVICE +U_CDECL_BEGIN +static UBool U_CALLCONV currency_cleanup(void); +U_CDECL_END struct CReg; /* Remember to call umtx_init(&gCRegLock) before using it! */ @@ -141,11 +202,11 @@ struct CReg : public UMemory { CReg *next; UChar iso[ISO_COUNTRY_CODE_LENGTH+1]; char id[ULOC_FULLNAME_CAPACITY]; - + CReg(const UChar* _iso, const char* _id) : next(0) { - int32_t len = uprv_strlen(_id); + int32_t len = (int32_t)uprv_strlen(_id); if (len > (int32_t)(sizeof(id)-1)) { len = (sizeof(id)-1); } @@ -154,7 +215,7 @@ struct CReg : public UMemory { uprv_memcpy(iso, _iso, ISO_COUNTRY_CODE_LENGTH * sizeof(const UChar)); iso[ISO_COUNTRY_CODE_LENGTH] = 0; } - + static UCurrRegistryKey reg(const UChar* _iso, const char* _id, UErrorCode* status) { if (status && U_SUCCESS(*status) && _iso && _id) { @@ -163,7 +224,8 @@ struct CReg : public UMemory { umtx_init(&gCRegLock); Mutex mutex(&gCRegLock); if (!gCRegHead) { - ucln_i18n_registerCleanup(); + /* register for the first time */ + ucln_i18n_registerCleanup(UCLN_I18N_CURRENCY, currency_cleanup); } n->next = gCRegHead; gCRegHead = n; @@ -173,7 +235,7 @@ struct CReg : public UMemory { } return 0; } - + static UBool unreg(UCurrRegistryKey key) { umtx_init(&gCRegLock); Mutex mutex(&gCRegLock); @@ -182,24 +244,27 @@ struct CReg : public UMemory { delete (CReg*)key; return TRUE; } - + CReg* p = gCRegHead; while (p) { if (p->next == key) { p->next = ((CReg*)key)->next; - delete (CReg*)key; + delete (CReg*)key; return TRUE; } p = p->next; } - + return FALSE; } - + static const UChar* get(const char* id) { umtx_init(&gCRegLock); Mutex mutex(&gCRegLock); CReg* p = gCRegHead; + + /* register cleanup of the mutex */ + ucln_i18n_registerCleanup(UCLN_I18N_CURRENCY, currency_cleanup); while (p) { if (uprv_strcmp(id, p->id) == 0) { return p->iso; @@ -220,29 +285,22 @@ struct CReg : public UMemory { } }; -// ------------------------------------- - -static void -idForLocale(const char* locale, char* buffer, int capacity, UErrorCode* ec) -{ - // !!! this is internal only, assumes buffer is not null and capacity is sufficient - // Extract the country name and variant name. We only - // recognize two variant names, EURO and PREEURO. - char variant[ULOC_FULLNAME_CAPACITY]; - uloc_getCountry(locale, buffer, capacity, ec); - uloc_getVariant(locale, variant, sizeof(variant), ec); - if (0 == uprv_strcmp(variant, VAR_PRE_EURO) || - 0 == uprv_strcmp(variant, VAR_EURO)) - { - uprv_strcat(buffer, VAR_DELIM); - uprv_strcat(buffer, variant); - } +/** + * Release all static memory held by currency. + */ +U_CDECL_BEGIN +static UBool U_CALLCONV currency_cleanup(void) { +#if !UCONFIG_NO_SERVICE + CReg::cleanup(); +#endif + return TRUE; } +U_CDECL_END // ------------------------------------- U_CAPI UCurrRegistryKey U_EXPORT2 -ucurr_register(const UChar* isoCode, const char* locale, UErrorCode *status) +ucurr_register(const UChar* isoCode, const char* locale, UErrorCode *status) { if (status && U_SUCCESS(*status)) { char id[ULOC_FULLNAME_CAPACITY]; @@ -255,43 +313,88 @@ ucurr_register(const UChar* isoCode, const char* locale, UErrorCode *status) // ------------------------------------- U_CAPI UBool U_EXPORT2 -ucurr_unregister(UCurrRegistryKey key, UErrorCode* status) +ucurr_unregister(UCurrRegistryKey key, UErrorCode* status) { if (status && U_SUCCESS(*status)) { return CReg::unreg(key); } return FALSE; } +#endif /* UCONFIG_NO_SERVICE */ // ------------------------------------- -U_CAPI const UChar* U_EXPORT2 -ucurr_forLocale(const char* locale, UErrorCode* ec) { +U_CAPI int32_t U_EXPORT2 +ucurr_forLocale(const char* locale, + UChar* buff, + int32_t buffCapacity, + UErrorCode* ec) +{ + int32_t resLen = 0; + const UChar* s = NULL; if (ec != NULL && U_SUCCESS(*ec)) { - char id[ULOC_FULLNAME_CAPACITY]; - idForLocale(locale, id, sizeof(id), ec); - if (U_FAILURE(*ec)) { - return NULL; - } - - const UChar* result = CReg::get(id); - if (result) { - return result; - } - - // Look up the CurrencyMap element in the root bundle. - UResourceBundle* rb = ures_open(NULL, "", ec); - UResourceBundle* cm = ures_getByKey(rb, CURRENCY_MAP, NULL, ec); - int32_t len; - const UChar* s = ures_getStringByKey(cm, id, &len, ec); - ures_close(cm); - ures_close(rb); - - if (U_SUCCESS(*ec)) { - return s; + if ((buff && buffCapacity) || !buffCapacity) { + UErrorCode localStatus = U_ZERO_ERROR; + char id[ULOC_FULLNAME_CAPACITY]; + if ((resLen = uloc_getKeywordValue(locale, "currency", id, ULOC_FULLNAME_CAPACITY, &localStatus))) { + // there is a currency keyword. Try to see if it's valid + if(buffCapacity > resLen) { + u_charsToUChars(id, buff, resLen); + } + } else { + // get country or country_variant in `id' + uint32_t variantType = idForLocale(locale, id, sizeof(id), ec); + + if (U_FAILURE(*ec)) { + return 0; + } + +#if !UCONFIG_NO_SERVICE + const UChar* result = CReg::get(id); + if (result) { + if(buffCapacity > u_strlen(result)) { + u_strcpy(buff, result); + } + return u_strlen(result); + } +#endif + + // Look up the CurrencyMap element in the root bundle. + UResourceBundle *rb = ures_openDirect(NULL, CURRENCY_DATA, &localStatus); + UResourceBundle *cm = ures_getByKey(rb, CURRENCY_MAP, rb, &localStatus); + s = ures_getStringByKey(cm, id, &resLen, &localStatus); + + if ((s == NULL || U_FAILURE(localStatus)) && variantType != VARIANT_IS_EMPTY + && (id[0] != 0)) + { + // We don't know about it. Check to see if we support the variant. + if (variantType & VARIANT_IS_EURO) { + s = ures_getStringByKey(cm, VAR_DELIM_EURO, &resLen, ec); + } + else { + uloc_getParent(locale, id, sizeof(id), ec); + *ec = U_USING_FALLBACK_WARNING; + ures_close(cm); + return ucurr_forLocale(id, buff, buffCapacity, ec); + } + } + else if (*ec == U_ZERO_ERROR || localStatus != U_ZERO_ERROR) { + // There is nothing to fallback to. Report the failure/warning if possible. + *ec = localStatus; + } + if (U_SUCCESS(*ec)) { + if(buffCapacity > resLen) { + u_strcpy(buff, s); + } + } + ures_close(cm); + } + return u_terminateUChars(buff, buffCapacity, resLen, ec); + } else { + *ec = U_ILLEGAL_ARGUMENT_ERROR; } } - return NULL; + return resLen; } // end registration @@ -308,7 +411,7 @@ static UBool fallback(char *loc) { return FALSE; } UErrorCode status = U_ZERO_ERROR; - uloc_getParent(loc, loc, uprv_strlen(loc), &status); + uloc_getParent(loc, loc, (int32_t)uprv_strlen(loc), &status); /* char *i = uprv_strrchr(loc, '_'); if (i == NULL) { @@ -331,7 +434,7 @@ ucurr_getName(const UChar* currency, // Look up the Currencies resource for the given locale. The // Currencies locale data looks like this: //|en { - //| Currencies { + //| Currencies { //| USD { "US$", "US Dollar" } //| CHF { "Sw F", "Swiss Franc" } //| INR { "=0#Rs|1#Re|1 0 && s[0] == CHOICE_FORMAT_MARK) { + ++s; + --len; + if (len > 0 && s[0] != CHOICE_FORMAT_MARK) { + isChoice = TRUE; + } + } + if (isChoice) { + Formattable temp; + ChoiceFormat fmt(s, ec2); + fmt.parse(text, temp, pos); + len = pos.getIndex() - start; + pos.setIndex(start); + } else if (len > max && + text.compare(pos.getIndex(), len, s) != 0) { + len = 0; + } + if (len > max) { + iso = ures_getKey(names); + max = len; + } + ures_close(names); + } + ures_close(curr); + ures_close(rb); + + // Try to fallback. If that fails (because we are already at + // root) then exit. + if (!fallback(loc)) { + break; + } + } + + if (iso != NULL) { + u_charsToUChars(iso, result, 4); + } + + // If display name parse fails or if it matches fewer than 3 + // characters, try to parse 3-letter ISO. Do this after the + // display name processing so 3-letter display names are + // preferred. Consider /[A-Z]{3}/ to be valid ISO, and parse + // it manually--UnicodeSet/regex are too slow and heavy. + if (max < 3 && (text.length() - start) >= 3) { + UBool valid = TRUE; + for (int32_t k=0; k<3; ++k) { + UChar ch = text.charAt(start + k); // 16-bit ok + if (ch < 0x41/*'A'*/ || ch > 0x5A/*'Z'*/) { + valid = FALSE; + break; + } + } + if (valid) { + text.extract(start, 3, result); + result[3] = 0; + max = 3; + } + } + + pos.setIndex(start + max); +} + +U_NAMESPACE_END + +/** + * Internal method. Given a currency ISO code and a locale, return + * the "static" currency name. This is usually the same as the + * UCURR_SYMBOL_NAME, but if the latter is a choice format, then the + * format is applied to the number 2.0 (to yield the more common + * plural) to return a static name. + * + * This is used for backward compatibility with old currency logic in + * DecimalFormat and DecimalFormatSymbols. + */ +U_CAPI void +uprv_getStaticCurrencyName(const UChar* iso, const char* loc, + UnicodeString& result, UErrorCode& ec) +{ + UBool isChoiceFormat; + int32_t len; + const UChar* currname = ucurr_getName(iso, loc, UCURR_SYMBOL_NAME, + &isChoiceFormat, &len, &ec); + if (U_SUCCESS(ec)) { + // If this is a ChoiceFormat currency, then format an + // arbitrary value; pick something != 1; more common. + result.truncate(0); + if (isChoiceFormat) { + ChoiceFormat f(currname, ec); + if (U_SUCCESS(ec)) { + f.format(2.0, result); + } else { + result = iso; + } + } else { + result = currname; + } + } +} U_CAPI int32_t U_EXPORT2 -ucurr_getDefaultFractionDigits(const UChar* currency) { - return (_findMetaData(currency))[0]; +ucurr_getDefaultFractionDigits(const UChar* currency, UErrorCode* ec) { + return (_findMetaData(currency, *ec))[0]; } U_CAPI double U_EXPORT2 -ucurr_getRoundingIncrement(const UChar* currency) { - const int32_t *data = _findMetaData(currency); +ucurr_getRoundingIncrement(const UChar* currency, UErrorCode* ec) { + const int32_t *data = _findMetaData(currency, *ec); - // If there is no rounding, or if the meta data is invalid, - // return 0.0 to indicate no rounding. A rounding value - // (data[1]) of 0 or 1 indicates no rounding. - if (data[1] < 2 || data[0] < 0 || data[0] > MAX_POW10) { + // If the meta data is invalid, return 0.0. + if (data[0] < 0 || data[0] > MAX_POW10) { + if (U_SUCCESS(*ec)) { + *ec = U_INVALID_FORMAT_ERROR; + } + return 0.0; + } + + // If there is no rounding, return 0.0 to indicate no rounding. A + // rounding value (data[1]) of 0 or 1 indicates no rounding. + if (data[1] < 2) { return 0.0; } @@ -453,14 +719,6 @@ ucurr_getRoundingIncrement(const UChar* currency) { return double(data[1]) / POW10[data[0]]; } -/** - * Release all static memory held by currency. - */ -U_CFUNC UBool currency_cleanup(void) { - CReg::cleanup(); - return TRUE; -} - #endif /* #if !UCONFIG_NO_FORMATTING */ //eof diff --git a/icuSources/i18n/ucurrimp.h b/icuSources/i18n/ucurrimp.h new file mode 100644 index 00000000..a8515e05 --- /dev/null +++ b/icuSources/i18n/ucurrimp.h @@ -0,0 +1,29 @@ +/* +********************************************************************** +* Copyright (c) 2002-2003, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +*/ + +#ifndef _UCURR_IMP_H_ +#define _UCURR_IMP_H_ + +#include "unicode/utypes.h" + +/** + * Internal method. Given a currency ISO code and a locale, return + * the "static" currency name. This is usually the same as the + * UCURR_SYMBOL_NAME, but if the latter is a choice format, then the + * format is applied to the number 2.0 (to yield the more common + * plural) to return a static name. + * + * This is used for backward compatibility with old currency logic in + * DecimalFormat and DecimalFormatSymbols. + */ +U_CAPI void +uprv_getStaticCurrencyName(const UChar* iso, const char* loc, + UnicodeString& result, UErrorCode& ec); + +#endif /* #ifndef _UCURR_IMP_H_ */ + +//eof diff --git a/icuSources/i18n/udat.cpp b/icuSources/i18n/udat.cpp index e1e62beb..eb6966f7 100644 --- a/icuSources/i18n/udat.cpp +++ b/icuSources/i18n/udat.cpp @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 1996-2001, International Business Machines +* Copyright (C) 1996-2004, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************* */ @@ -35,80 +35,77 @@ udat_open(UDateFormatStyle timeStyle, int32_t patternLength, UErrorCode *status) { - - if(U_FAILURE(*status)) - { - return 0; - } - if(timeStyle != UDAT_IGNORE) - { - DateFormat *fmt; - if(locale == 0) - fmt = DateFormat::createDateTimeInstance((DateFormat::EStyle)dateStyle, - (DateFormat::EStyle)timeStyle); - else - fmt = DateFormat::createDateTimeInstance((DateFormat::EStyle)dateStyle, - (DateFormat::EStyle)timeStyle, - Locale(locale)); - - if(fmt == 0) { - *status = U_MEMORY_ALLOCATION_ERROR; + if(U_FAILURE(*status)) + { return 0; - } - - if(tzID != 0) { - TimeZone *zone = TimeZone::createTimeZone(UnicodeString((UBool)(tzIDLength == -1), tzID, tzIDLength)); - if(zone == 0) { - *status = U_MEMORY_ALLOCATION_ERROR; - delete fmt; - return 0; + } + if(timeStyle != UDAT_IGNORE) + { + DateFormat *fmt; + if(locale == 0) + fmt = DateFormat::createDateTimeInstance((DateFormat::EStyle)dateStyle, + (DateFormat::EStyle)timeStyle); + else + fmt = DateFormat::createDateTimeInstance((DateFormat::EStyle)dateStyle, + (DateFormat::EStyle)timeStyle, + Locale(locale)); + + if(fmt == 0) { + *status = U_MEMORY_ALLOCATION_ERROR; + return 0; } - fmt->adoptTimeZone(zone); - } - - return (UDateFormat*)fmt; - } - else - { - const UnicodeString pat = UnicodeString((UBool)(patternLength == -1), pattern, patternLength); - UDateFormat *retVal = 0; - - if(locale == 0) - retVal = (UDateFormat*)new SimpleDateFormat(pat, *status); - else - retVal = (UDateFormat*)new SimpleDateFormat(pat, Locale(locale), *status); - - if(retVal == 0) { - *status = U_MEMORY_ALLOCATION_ERROR; - return 0; - } - return retVal; - } + + if(tzID != 0) { + TimeZone *zone = TimeZone::createTimeZone(UnicodeString((UBool)(tzIDLength == -1), tzID, tzIDLength)); + if(zone == 0) { + *status = U_MEMORY_ALLOCATION_ERROR; + delete fmt; + return 0; + } + fmt->adoptTimeZone(zone); + } + + return (UDateFormat*)fmt; + } + else + { + const UnicodeString pat = UnicodeString((UBool)(patternLength == -1), pattern, patternLength); + UDateFormat *retVal = 0; + + if(locale == 0) + retVal = (UDateFormat*)new SimpleDateFormat(pat, *status); + else + retVal = (UDateFormat*)new SimpleDateFormat(pat, Locale(locale), *status); + + if(retVal == 0) { + *status = U_MEMORY_ALLOCATION_ERROR; + return 0; + } + return retVal; + } } U_CAPI void U_EXPORT2 udat_close(UDateFormat* format) { - - delete (DateFormat*)format; + delete (DateFormat*)format; } U_CAPI UDateFormat* U_EXPORT2 udat_clone(const UDateFormat *fmt, UErrorCode *status) { + if(U_FAILURE(*status)) return 0; - if(U_FAILURE(*status)) return 0; + Format *res = ((SimpleDateFormat*)fmt)->clone(); - Format *res = ((SimpleDateFormat*)fmt)->clone(); - - if(res == 0) { - *status = U_MEMORY_ALLOCATION_ERROR; - return 0; - } + if(res == 0) { + *status = U_MEMORY_ALLOCATION_ERROR; + return 0; + } - return (UDateFormat*) res; + return (UDateFormat*) res; } U_CAPI int32_t U_EXPORT2 @@ -119,29 +116,28 @@ udat_format( const UDateFormat* format, UFieldPosition* position, UErrorCode* status) { + if(U_FAILURE(*status)) return -1; + + UnicodeString res; + if(!(result==NULL && resultLength==0)) { + // NULL destination for pure preflighting: empty dummy string + // otherwise, alias the destination buffer + res.setTo(result, 0, resultLength); + } + + FieldPosition fp; - if(U_FAILURE(*status)) return -1; - - UnicodeString res; - if(!(result==NULL && resultLength==0)) { - // NULL destination for pure preflighting: empty dummy string - // otherwise, alias the destination buffer - res.setTo(result, 0, resultLength); - } - - FieldPosition fp; - - if(position != 0) - fp.setField(position->field); - - ((DateFormat*)format)->format(dateToFormat, res, fp); - - if(position != 0) { - position->beginIndex = fp.getBeginIndex(); - position->endIndex = fp.getEndIndex(); - } - - return res.extract(result, resultLength, *status); + if(position != 0) + fp.setField(position->field); + + ((DateFormat*)format)->format(dateToFormat, res, fp); + + if(position != 0) { + position->beginIndex = fp.getBeginIndex(); + position->endIndex = fp.getEndIndex(); + } + + return res.extract(result, resultLength, *status); } U_CAPI UDate U_EXPORT2 @@ -151,28 +147,29 @@ udat_parse( const UDateFormat* format, int32_t *parsePos, UErrorCode *status) { + if(U_FAILURE(*status)) return (UDate)0; - if(U_FAILURE(*status)) return (UDate)0; + const UnicodeString src((UBool)(textLength == -1), text, textLength); + ParsePosition pp; + int32_t stackParsePos = 0; + UDate res; - const UnicodeString src((UBool)(textLength == -1), text, textLength); - ParsePosition pp; - UDate res; + if(parsePos == NULL) { + parsePos = &stackParsePos; + } - if(parsePos != 0) pp.setIndex(*parsePos); - res = ((DateFormat*)format)->parse(src, pp); + res = ((DateFormat*)format)->parse(src, pp); - if(parsePos != 0) { if(pp.getErrorIndex() == -1) - *parsePos = pp.getIndex(); + *parsePos = pp.getIndex(); else { - *parsePos = pp.getErrorIndex(); - *status = U_PARSE_ERROR; + *parsePos = pp.getErrorIndex(); + *status = U_PARSE_ERROR; } - } - - return res; + + return res; } U_CAPI void U_EXPORT2 @@ -183,104 +180,92 @@ udat_parseCalendar(const UDateFormat* format, int32_t *parsePos, UErrorCode *status) { + if(U_FAILURE(*status)) return; - if(U_FAILURE(*status)) return; + const UnicodeString src((UBool)(textLength == -1), text, textLength); + ParsePosition pp; - const UnicodeString src((UBool)(textLength == -1), text, textLength); - ParsePosition pp; + if(parsePos != 0) + pp.setIndex(*parsePos); - if(parsePos != 0) - pp.setIndex(*parsePos); + ((DateFormat*)format)->parse(src, *(Calendar*)calendar, pp); - ((DateFormat*)format)->parse(src, *(Calendar*)calendar, pp); - - if(parsePos != 0) { - if(pp.getErrorIndex() == -1) - *parsePos = pp.getIndex(); - else { - *parsePos = pp.getErrorIndex(); - *status = U_PARSE_ERROR; + if(parsePos != 0) { + if(pp.getErrorIndex() == -1) + *parsePos = pp.getIndex(); + else { + *parsePos = pp.getErrorIndex(); + *status = U_PARSE_ERROR; + } } - } - - return; } U_CAPI UBool U_EXPORT2 udat_isLenient(const UDateFormat* fmt) { - - return ((DateFormat*)fmt)->isLenient(); + return ((DateFormat*)fmt)->isLenient(); } U_CAPI void U_EXPORT2 udat_setLenient( UDateFormat* fmt, UBool isLenient) { - - ((DateFormat*)fmt)->setLenient(isLenient); + ((DateFormat*)fmt)->setLenient(isLenient); } U_CAPI const UCalendar* U_EXPORT2 udat_getCalendar(const UDateFormat* fmt) { - - return (const UCalendar*) ((DateFormat*)fmt)->getCalendar(); + return (const UCalendar*) ((DateFormat*)fmt)->getCalendar(); } U_CAPI void U_EXPORT2 -udat_setCalendar( UDateFormat* fmt, - const UCalendar* calendarToSet) +udat_setCalendar(UDateFormat* fmt, + const UCalendar* calendarToSet) { - - ((DateFormat*)fmt)->setCalendar(*((Calendar*)calendarToSet)); + ((DateFormat*)fmt)->setCalendar(*((Calendar*)calendarToSet)); } U_CAPI const UNumberFormat* U_EXPORT2 udat_getNumberFormat(const UDateFormat* fmt) { - - return (const UNumberFormat*) ((DateFormat*)fmt)->getNumberFormat(); + return (const UNumberFormat*) ((DateFormat*)fmt)->getNumberFormat(); } U_CAPI void U_EXPORT2 -udat_setNumberFormat( UDateFormat* fmt, - const UNumberFormat* numberFormatToSet) +udat_setNumberFormat(UDateFormat* fmt, + const UNumberFormat* numberFormatToSet) { - - ((DateFormat*)fmt)->setNumberFormat(*((NumberFormat*)numberFormatToSet)); + ((DateFormat*)fmt)->setNumberFormat(*((NumberFormat*)numberFormatToSet)); } U_CAPI const char* U_EXPORT2 udat_getAvailable(int32_t index) { - return uloc_getAvailable(index); + return uloc_getAvailable(index); } U_CAPI int32_t U_EXPORT2 udat_countAvailable() { - - return uloc_countAvailable(); + return uloc_countAvailable(); } U_CAPI UDate U_EXPORT2 udat_get2DigitYearStart( const UDateFormat *fmt, - UErrorCode *status) + UErrorCode *status) { - - if(U_FAILURE(*status)) return (UDate)0; - return ((SimpleDateFormat*)fmt)->get2DigitYearStart(*status); + if(U_FAILURE(*status)) return (UDate)0; + return ((SimpleDateFormat*)fmt)->get2DigitYearStart(*status); } U_CAPI void U_EXPORT2 udat_set2DigitYearStart( UDateFormat *fmt, - UDate d, - UErrorCode *status) + UDate d, + UErrorCode *status) { - - if(U_FAILURE(*status)) return; - ((SimpleDateFormat*)fmt)->set2DigitYearStart(d, *status); + if(U_FAILURE(*status)) return; + ((SimpleDateFormat*)fmt)->set2DigitYearStart(d, *status); } U_CAPI int32_t U_EXPORT2 @@ -290,156 +275,152 @@ udat_toPattern( const UDateFormat *fmt, int32_t resultLength, UErrorCode *status) { + if(U_FAILURE(*status)) return -1; - if(U_FAILURE(*status)) return -1; - - UnicodeString res; - if(!(result==NULL && resultLength==0)) { - // NULL destination for pure preflighting: empty dummy string - // otherwise, alias the destination buffer - res.setTo(result, 0, resultLength); - } + UnicodeString res; + if(!(result==NULL && resultLength==0)) { + // NULL destination for pure preflighting: empty dummy string + // otherwise, alias the destination buffer + res.setTo(result, 0, resultLength); + } - if(localized) - ((SimpleDateFormat*)fmt)->toLocalizedPattern(res, *status); - else - ((SimpleDateFormat*)fmt)->toPattern(res); + if(localized) + ((SimpleDateFormat*)fmt)->toLocalizedPattern(res, *status); + else + ((SimpleDateFormat*)fmt)->toPattern(res); - return res.extract(result, resultLength, *status); + return res.extract(result, resultLength, *status); } // TBD: should this take an UErrorCode? U_CAPI void U_EXPORT2 -udat_applyPattern( UDateFormat *format, +udat_applyPattern( UDateFormat *format, UBool localized, const UChar *pattern, int32_t patternLength) { + const UnicodeString pat((UBool)(patternLength == -1), pattern, patternLength); + UErrorCode status = U_ZERO_ERROR; - const UnicodeString pat((UBool)(patternLength == -1), pattern, patternLength); - UErrorCode status = U_ZERO_ERROR; - - if(localized) - ((SimpleDateFormat*)format)->applyLocalizedPattern(pat, status); - else - ((SimpleDateFormat*)format)->applyPattern(pat); + if(localized) + ((SimpleDateFormat*)format)->applyLocalizedPattern(pat, status); + else + ((SimpleDateFormat*)format)->applyPattern(pat); } U_CAPI int32_t U_EXPORT2 -udat_getSymbols(const UDateFormat *fmt, - UDateFormatSymbolType type, - int32_t index, - UChar *result, - int32_t resultLength, - UErrorCode *status) +udat_getSymbols(const UDateFormat *fmt, + UDateFormatSymbolType type, + int32_t index, + UChar *result, + int32_t resultLength, + UErrorCode *status) { + if(U_FAILURE(*status)) return -1; + + const DateFormatSymbols *syms = + ((SimpleDateFormat*)fmt)->getDateFormatSymbols(); + int32_t count; + const UnicodeString *res; + + switch(type) { + case UDAT_ERAS: + res = syms->getEras(count); + if(index < count) { + return res[index].extract(result, resultLength, *status); + } + break; - if(U_FAILURE(*status)) return -1; - - const DateFormatSymbols *syms = - ((SimpleDateFormat*)fmt)->getDateFormatSymbols(); - int32_t count; - const UnicodeString *res; - - switch(type) { - case UDAT_ERAS: - res = syms->getEras(count); - if(index < count) { - return res[index].extract(result, resultLength, *status); - } - break; - - case UDAT_MONTHS: - res = syms->getMonths(count); - if(index < count) { - return res[index].extract(result, resultLength, *status); - } - break; + case UDAT_MONTHS: + res = syms->getMonths(count); + if(index < count) { + return res[index].extract(result, resultLength, *status); + } + break; - case UDAT_SHORT_MONTHS: - res = syms->getShortMonths(count); - if(index < count) { - return res[index].extract(result, resultLength, *status); - } - break; + case UDAT_SHORT_MONTHS: + res = syms->getShortMonths(count); + if(index < count) { + return res[index].extract(result, resultLength, *status); + } + break; - case UDAT_WEEKDAYS: - res = syms->getWeekdays(count); - if(index < count) { - return res[index].extract(result, resultLength, *status); - } - break; + case UDAT_WEEKDAYS: + res = syms->getWeekdays(count); + if(index < count) { + return res[index].extract(result, resultLength, *status); + } + break; - case UDAT_SHORT_WEEKDAYS: - res = syms->getShortWeekdays(count); - if(index < count) { - return res[index].extract(result, resultLength, *status); - } - break; + case UDAT_SHORT_WEEKDAYS: + res = syms->getShortWeekdays(count); + if(index < count) { + return res[index].extract(result, resultLength, *status); + } + break; - case UDAT_AM_PMS: - res = syms->getAmPmStrings(count); - if(index < count) { - return res[index].extract(result, resultLength, *status); + case UDAT_AM_PMS: + res = syms->getAmPmStrings(count); + if(index < count) { + return res[index].extract(result, resultLength, *status); + } + break; + + case UDAT_LOCALIZED_CHARS: + { + UnicodeString res1; + if(!(result==NULL && resultLength==0)) { + // NULL destination for pure preflighting: empty dummy string + // otherwise, alias the destination buffer + res1.setTo(result, 0, resultLength); + } + syms->getLocalPatternChars(res1); + return res1.extract(result, resultLength, *status); + } } - break; - case UDAT_LOCALIZED_CHARS: - { - UnicodeString res1; - if(!(result==NULL && resultLength==0)) { - // NULL destination for pure preflighting: empty dummy string - // otherwise, alias the destination buffer - res1.setTo(result, 0, resultLength); - } - syms->getLocalPatternChars(res1); - return res1.extract(result, resultLength, *status); - } - } - - return 0; + return 0; } U_CAPI int32_t U_EXPORT2 udat_countSymbols( const UDateFormat *fmt, UDateFormatSymbolType type) { + const DateFormatSymbols *syms = + ((SimpleDateFormat*)fmt)->getDateFormatSymbols(); + int32_t count = 0; + + switch(type) { + case UDAT_ERAS: + syms->getEras(count); + break; + + case UDAT_MONTHS: + syms->getMonths(count); + break; + + case UDAT_SHORT_MONTHS: + syms->getShortMonths(count); + break; + + case UDAT_WEEKDAYS: + syms->getWeekdays(count); + break; + + case UDAT_SHORT_WEEKDAYS: + syms->getShortWeekdays(count); + break; + + case UDAT_AM_PMS: + syms->getAmPmStrings(count); + break; + + case UDAT_LOCALIZED_CHARS: + count = 1; + break; + } - const DateFormatSymbols *syms = - ((SimpleDateFormat*)fmt)->getDateFormatSymbols(); - int32_t count = 0; - - switch(type) { - case UDAT_ERAS: - syms->getEras(count); - break; - - case UDAT_MONTHS: - syms->getMonths(count); - break; - - case UDAT_SHORT_MONTHS: - syms->getShortMonths(count); - break; - - case UDAT_WEEKDAYS: - syms->getWeekdays(count); - break; - - case UDAT_SHORT_WEEKDAYS: - syms->getShortWeekdays(count); - break; - - case UDAT_AM_PMS: - syms->getAmPmStrings(count); - break; - - case UDAT_LOCALIZED_CHARS: - count = 1; - break; - } - - return count; + return count; } U_NAMESPACE_BEGIN @@ -470,61 +451,69 @@ U_NAMESPACE_BEGIN */ class DateFormatSymbolsSingleSetter /* not : public UObject because all methods are static */ { public: - static void - setSymbol(UnicodeString *array, int32_t count, int32_t index, - const UChar *value, int32_t valueLength, UErrorCode &errorCode) { - if(array!=NULL) { - if(index>=count) { - errorCode=U_INDEX_OUTOFBOUNDS_ERROR; - } else if(value==NULL) { - errorCode=U_ILLEGAL_ARGUMENT_ERROR; - } else { - array[index].setTo(value, valueLength); - } + static void + setSymbol(UnicodeString *array, int32_t count, int32_t index, + const UChar *value, int32_t valueLength, UErrorCode &errorCode) + { + if(array!=NULL) { + if(index>=count) { + errorCode=U_INDEX_OUTOFBOUNDS_ERROR; + } else if(value==NULL) { + errorCode=U_ILLEGAL_ARGUMENT_ERROR; + } else { + array[index].setTo(value, valueLength); + } + } + } + + static void + setEra(DateFormatSymbols *syms, int32_t index, + const UChar *value, int32_t valueLength, UErrorCode &errorCode) + { + setSymbol(syms->fEras, syms->fErasCount, index, value, valueLength, errorCode); + } + + static void + setMonth(DateFormatSymbols *syms, int32_t index, + const UChar *value, int32_t valueLength, UErrorCode &errorCode) + { + setSymbol(syms->fMonths, syms->fMonthsCount, index, value, valueLength, errorCode); + } + + static void + setShortMonth(DateFormatSymbols *syms, int32_t index, + const UChar *value, int32_t valueLength, UErrorCode &errorCode) + { + setSymbol(syms->fShortMonths, syms->fShortMonthsCount, index, value, valueLength, errorCode); + } + + static void + setWeekday(DateFormatSymbols *syms, int32_t index, + const UChar *value, int32_t valueLength, UErrorCode &errorCode) + { + setSymbol(syms->fWeekdays, syms->fWeekdaysCount, index, value, valueLength, errorCode); + } + + static void + setShortWeekday(DateFormatSymbols *syms, int32_t index, + const UChar *value, int32_t valueLength, UErrorCode &errorCode) + { + setSymbol(syms->fShortWeekdays, syms->fShortWeekdaysCount, index, value, valueLength, errorCode); + } + + static void + setAmPm(DateFormatSymbols *syms, int32_t index, + const UChar *value, int32_t valueLength, UErrorCode &errorCode) + { + setSymbol(syms->fAmPms, syms->fAmPmsCount, index, value, valueLength, errorCode); + } + + static void + setLocalPatternChars(DateFormatSymbols *syms, + const UChar *value, int32_t valueLength, UErrorCode &errorCode) + { + setSymbol(&syms->fLocalPatternChars, 1, 0, value, valueLength, errorCode); } - } - - static void - setEra(DateFormatSymbols *syms, int32_t index, - const UChar *value, int32_t valueLength, UErrorCode &errorCode) { - setSymbol(syms->fEras, syms->fErasCount, index, value, valueLength, errorCode); - } - - static void - setMonth(DateFormatSymbols *syms, int32_t index, - const UChar *value, int32_t valueLength, UErrorCode &errorCode) { - setSymbol(syms->fMonths, syms->fMonthsCount, index, value, valueLength, errorCode); - } - - static void - setShortMonth(DateFormatSymbols *syms, int32_t index, - const UChar *value, int32_t valueLength, UErrorCode &errorCode) { - setSymbol(syms->fShortMonths, syms->fShortMonthsCount, index, value, valueLength, errorCode); - } - - static void - setWeekday(DateFormatSymbols *syms, int32_t index, - const UChar *value, int32_t valueLength, UErrorCode &errorCode) { - setSymbol(syms->fWeekdays, syms->fWeekdaysCount, index, value, valueLength, errorCode); - } - - static void - setShortWeekday(DateFormatSymbols *syms, int32_t index, - const UChar *value, int32_t valueLength, UErrorCode &errorCode) { - setSymbol(syms->fShortWeekdays, syms->fShortWeekdaysCount, index, value, valueLength, errorCode); - } - - static void - setAmPm(DateFormatSymbols *syms, int32_t index, - const UChar *value, int32_t valueLength, UErrorCode &errorCode) { - setSymbol(syms->fAmPms, syms->fAmPmsCount, index, value, valueLength, errorCode); - } - - static void - setLocalPatternChars(DateFormatSymbols *syms, - const UChar *value, int32_t valueLength, UErrorCode &errorCode) { - setSymbol(&syms->fLocalPatternChars, 1, 0, value, valueLength, errorCode); - } }; U_NAMESPACE_END @@ -537,40 +526,52 @@ udat_setSymbols( UDateFormat *format, int32_t valueLength, UErrorCode *status) { + if(U_FAILURE(*status)) return; - if(U_FAILURE(*status)) return; - - DateFormatSymbols *syms = (DateFormatSymbols *)((SimpleDateFormat *)format)->getDateFormatSymbols(); + DateFormatSymbols *syms = (DateFormatSymbols *)((SimpleDateFormat *)format)->getDateFormatSymbols(); - switch(type) { - case UDAT_ERAS: - DateFormatSymbolsSingleSetter::setEra(syms, index, value, valueLength, *status); - break; + switch(type) { + case UDAT_ERAS: + DateFormatSymbolsSingleSetter::setEra(syms, index, value, valueLength, *status); + break; - case UDAT_MONTHS: - DateFormatSymbolsSingleSetter::setMonth(syms, index, value, valueLength, *status); - break; + case UDAT_MONTHS: + DateFormatSymbolsSingleSetter::setMonth(syms, index, value, valueLength, *status); + break; - case UDAT_SHORT_MONTHS: - DateFormatSymbolsSingleSetter::setShortMonth(syms, index, value, valueLength, *status); - break; + case UDAT_SHORT_MONTHS: + DateFormatSymbolsSingleSetter::setShortMonth(syms, index, value, valueLength, *status); + break; - case UDAT_WEEKDAYS: - DateFormatSymbolsSingleSetter::setWeekday(syms, index, value, valueLength, *status); - break; + case UDAT_WEEKDAYS: + DateFormatSymbolsSingleSetter::setWeekday(syms, index, value, valueLength, *status); + break; - case UDAT_SHORT_WEEKDAYS: - DateFormatSymbolsSingleSetter::setShortWeekday(syms, index, value, valueLength, *status); - break; + case UDAT_SHORT_WEEKDAYS: + DateFormatSymbolsSingleSetter::setShortWeekday(syms, index, value, valueLength, *status); + break; - case UDAT_AM_PMS: - DateFormatSymbolsSingleSetter::setAmPm(syms, index, value, valueLength, *status); - break; + case UDAT_AM_PMS: + DateFormatSymbolsSingleSetter::setAmPm(syms, index, value, valueLength, *status); + break; - case UDAT_LOCALIZED_CHARS: - DateFormatSymbolsSingleSetter::setLocalPatternChars(syms, value, valueLength, *status); - break; - } + case UDAT_LOCALIZED_CHARS: + DateFormatSymbolsSingleSetter::setLocalPatternChars(syms, value, valueLength, *status); + break; + } } +U_CAPI const char* U_EXPORT2 +udat_getLocaleByType(const UDateFormat *fmt, + ULocDataLocaleType type, + UErrorCode* status) +{ + if (fmt == NULL) { + if (U_SUCCESS(*status)) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + } + return NULL; + } + return ((Format*)fmt)->getLocaleID(type, *status); +} #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/i18n/ulocdata.c b/icuSources/i18n/ulocdata.c new file mode 100644 index 00000000..fffe2faa --- /dev/null +++ b/icuSources/i18n/ulocdata.c @@ -0,0 +1,111 @@ +/* +****************************************************************************** +* * +* Copyright (C) 2003-2004, International Business Machines * +* Corporation and others. All Rights Reserved. * +* * +****************************************************************************** +* file name: ulocdata.c +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2003Oct21 +* created by: Ram Viswanadha +*/ + +#include "unicode/ulocdata.h" + +#define EXEMPLAR_CHARS "ExemplarCharacters" +#define MEASUREMENT_SYSTEM "MeasurementSystem" +#define PAPER_SIZE "PaperSize" + +U_CAPI USet* U_EXPORT2 +ulocdata_getExemplarSet(USet *fillIn, const char *localeID, + uint32_t options, UErrorCode *status){ + + UResourceBundle *bundle = NULL; + const UChar *exemplarChars = NULL; + int32_t len = 0; + UErrorCode localStatus = U_ZERO_ERROR; + + if (U_FAILURE(*status)){ + return NULL; + } + + bundle = ures_open(NULL, localeID, status); + if (U_FAILURE(*status)) { + return NULL; + } + + exemplarChars = ures_getStringByKey(bundle, EXEMPLAR_CHARS, &len, &localStatus); + if (U_FAILURE(localStatus) || (*status != U_USING_DEFAULT_WARNING && localStatus != U_ZERO_ERROR)) { + *status = localStatus; + } + + if(fillIn != NULL){ + uset_applyPattern(fillIn, exemplarChars, len, + USET_IGNORE_SPACE | options, status); + }else{ + fillIn = uset_openPatternOptions(exemplarChars, len, + USET_IGNORE_SPACE | options, status); + } + + ures_close(bundle); + + return fillIn; + +} + +U_CAPI UMeasurementSystem U_EXPORT2 +ulocdata_getMeasurementSystem(const char *localeID, UErrorCode *status){ + + UResourceBundle* bundle=NULL; + UResourceBundle* measurement=NULL; + UMeasurementSystem system = UMS_LIMIT; + + if(status == NULL || U_FAILURE(*status)){ + return system; + } + + bundle = ures_open(NULL, localeID, status); + + measurement = ures_getByKey(bundle, MEASUREMENT_SYSTEM, NULL, status); + + system = (UMeasurementSystem) ures_getInt(measurement, status); + + ures_close(bundle); + ures_close(measurement); + + return system; + +} + +U_CAPI void U_EXPORT2 +ulocdata_getPaperSize(const char* localeID, int32_t *height, int32_t *width, UErrorCode *status){ + UResourceBundle* bundle=NULL; + UResourceBundle* paperSizeBundle = NULL; + const int32_t* paperSize=NULL; + int32_t len = 0; + + if(status == NULL || U_FAILURE(*status)){ + return; + } + + bundle = ures_open(NULL, localeID, status); + paperSizeBundle = ures_getByKey(bundle, PAPER_SIZE, NULL, status); + paperSize = ures_getIntVector(paperSizeBundle, &len, status); + + if(U_SUCCESS(*status)){ + if(len < 2){ + *status = U_INTERNAL_PROGRAM_ERROR; + }else{ + *height = paperSize[0]; + *width = paperSize[1]; + } + } + + ures_close(bundle); + ures_close(paperSizeBundle); + +} diff --git a/icuSources/i18n/umsg.cpp b/icuSources/i18n/umsg.cpp index a4e1c33d..2e3ea198 100644 --- a/icuSources/i18n/umsg.cpp +++ b/icuSources/i18n/umsg.cpp @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -29,6 +29,7 @@ #include "unicode/msgfmt.h" #include "unicode/unistr.h" #include "cpputils.h" +#include "uassert.h" U_NAMESPACE_USE @@ -227,7 +228,7 @@ umsg_open( const UChar *pattern, UnicodeString patString((patternLength == -1 ? TRUE:FALSE), pattern,len); - retVal = (UMessageFormat*) new MessageFormat(pattern,Locale(locale),*parseError,*status); + retVal = (UMessageFormat*) new MessageFormat(patString,Locale(locale),*parseError,*status); if(retVal == 0) { *status = U_MEMORY_ALLOCATION_ERROR; @@ -277,13 +278,13 @@ umsg_setLocale(UMessageFormat *fmt, const char* locale) } U_CAPI const char* U_EXPORT2 -umsg_getLocale(UMessageFormat *fmt) +umsg_getLocale(const UMessageFormat *fmt) { //check arguments if(fmt==NULL){ return ""; } - return ((MessageFormat*)fmt)->getLocale().getName(); + return ((const MessageFormat*)fmt)->getLocale().getName(); } U_CAPI void U_EXPORT2 @@ -314,7 +315,7 @@ umsg_applyPattern(UMessageFormat *fmt, } U_CAPI int32_t U_EXPORT2 -umsg_toPattern(UMessageFormat *fmt, +umsg_toPattern(const UMessageFormat *fmt, UChar* result, int32_t resultLength, UErrorCode* status) @@ -335,12 +336,12 @@ umsg_toPattern(UMessageFormat *fmt, // otherwise, alias the destination buffer res.setTo(result, 0, resultLength); } - ((MessageFormat*)fmt)->toPattern(res); + ((const MessageFormat*)fmt)->toPattern(res); return res.extract(result, resultLength, *status); } U_CAPI int32_t -umsg_format( UMessageFormat *fmt, +umsg_format( const UMessageFormat *fmt, UChar *result, int32_t resultLength, UErrorCode *status, @@ -383,7 +384,7 @@ MessageFormatAdapter::getArgTypeList(const MessageFormat& m, U_NAMESPACE_END U_CAPI int32_t U_EXPORT2 -umsg_vformat( UMessageFormat *fmt, +umsg_vformat( const UMessageFormat *fmt, UChar *result, int32_t resultLength, va_list ap, @@ -401,7 +402,7 @@ umsg_vformat( UMessageFormat *fmt, int32_t count =0; const Formattable::Type* argTypes = - MessageFormatAdapter::getArgTypeList(*(MessageFormat*)fmt, count); + MessageFormatAdapter::getArgTypeList(*(const MessageFormat*)fmt, count); // Allocate at least one element. Allocating an array of length // zero causes problems on some platforms (e.g. Win32). Formattable* args = new Formattable[count ? count : 1]; @@ -412,6 +413,7 @@ umsg_vformat( UMessageFormat *fmt, UChar *stringVal; double tDouble=0; int32_t tInt =0; + int64_t tInt64 = 0; UDate tempDate = 0; switch(argTypes[i]) { case Formattable::kDate: @@ -428,6 +430,11 @@ umsg_vformat( UMessageFormat *fmt, tInt = va_arg(ap, int32_t); args[i].setLong(tInt); break; + + case Formattable::kInt64: + tInt64 = va_arg(ap, int64_t); + args[i].setInt64(tInt64); + break; case Formattable::kString: // For some reason, a temporary is needed @@ -447,13 +454,20 @@ umsg_vformat( UMessageFormat *fmt, va_arg(ap, int); break; + case Formattable::kObject: + // This will never happen because MessageFormat doesn't + // support kObject. When MessageFormat is changed to + // understand MeasureFormats, modify this code to do the + // right thing. [alan] + U_ASSERT(FALSE); + break; } } UnicodeString resultStr; FieldPosition fieldPosition(0); /* format the message */ - ((MessageFormat*)fmt)->format(args,count,resultStr,fieldPosition,*status); + ((const MessageFormat*)fmt)->format(args,count,resultStr,fieldPosition,*status); delete[] args; @@ -465,7 +479,7 @@ umsg_vformat( UMessageFormat *fmt, } U_CAPI void -umsg_parse( UMessageFormat *fmt, +umsg_parse( const UMessageFormat *fmt, const UChar *source, int32_t sourceLength, int32_t *count, @@ -487,7 +501,7 @@ umsg_parse( UMessageFormat *fmt, } U_CAPI void U_EXPORT2 -umsg_vparse(UMessageFormat *fmt, +umsg_vparse(const UMessageFormat *fmt, const UChar *source, int32_t sourceLength, int32_t *count, @@ -508,11 +522,12 @@ umsg_vparse(UMessageFormat *fmt, } UnicodeString srcString(source,sourceLength); - Formattable *args = ((MessageFormat*)fmt)->parse(source,*count,*status); + Formattable *args = ((const MessageFormat*)fmt)->parse(source,*count,*status); UDate *aDate; double *aDouble; UChar *aString; int32_t* aInt; + int64_t* aInt64; UnicodeString temp; int len =0; // assign formattables to varargs @@ -538,7 +553,6 @@ umsg_vparse(UMessageFormat *fmt, break; case Formattable::kLong: - aInt = va_arg(ap, int32_t*); if(aInt){ *aInt = (int32_t) args[i].getLong(); @@ -547,6 +561,15 @@ umsg_vparse(UMessageFormat *fmt, } break; + case Formattable::kInt64: + aInt64 = va_arg(ap, int64_t*); + if(aInt64){ + *aInt64 = args[i].getInt64(); + }else{ + *status=U_ILLEGAL_ARGUMENT_ERROR; + } + break; + case Formattable::kString: aString = va_arg(ap, UChar*); if(aString){ @@ -559,9 +582,17 @@ umsg_vparse(UMessageFormat *fmt, } break; + case Formattable::kObject: + // This will never happen because MessageFormat doesn't + // support kObject. When MessageFormat is changed to + // understand MeasureFormats, modify this code to do the + // right thing. [alan] + U_ASSERT(FALSE); + break; + // better not happen! case Formattable::kArray: - // DIE + U_ASSERT(FALSE); break; } } @@ -570,4 +601,18 @@ umsg_vparse(UMessageFormat *fmt, delete [] args; } +U_CAPI const char* U_EXPORT2 +umsg_getLocaleByType(const UMessageFormat *fmt, + ULocDataLocaleType type, + UErrorCode* status) +{ + if (fmt == NULL) { + if (U_SUCCESS(*status)) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + } + return NULL; + } + return ((Format*)fmt)->getLocaleID(type, *status); +} + #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/i18n/unesctrn.cpp b/icuSources/i18n/unesctrn.cpp index ad8904bd..93008b00 100644 --- a/icuSources/i18n/unesctrn.cpp +++ b/icuSources/i18n/unesctrn.cpp @@ -1,12 +1,12 @@ /* -********************************************************************** -* Copyright (c) 2001, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -* Date Name Description -* 11/19/2001 aliu Creation. -********************************************************************** -*/ + ********************************************************************** + * Copyright (c) 2001-2004, International Business Machines + * Corporation and others. All Rights Reserved. + ********************************************************************** + * Date Name Description + * 11/19/2001 aliu Creation. + ********************************************************************** + */ #include "unicode/utypes.h" @@ -73,7 +73,7 @@ static const UChar SPEC_Any[] = { END }; -const char UnescapeTransliterator::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(UnescapeTransliterator) /** * Factory methods. Ignore the context. @@ -107,19 +107,19 @@ Transliterator* UnescapeTransliterator::_createAny(const UnicodeString& ID, Toke void UnescapeTransliterator::registerIDs() { Token t = integerToken(0); - Transliterator::_registerFactory("Hex-Any/Unicode", _createUnicode, t); + Transliterator::_registerFactory(UNICODE_STRING_SIMPLE("Hex-Any/Unicode"), _createUnicode, t); - Transliterator::_registerFactory("Hex-Any/Java", _createJava, t); + Transliterator::_registerFactory(UNICODE_STRING_SIMPLE("Hex-Any/Java"), _createJava, t); - Transliterator::_registerFactory("Hex-Any/C", _createC, t); + Transliterator::_registerFactory(UNICODE_STRING_SIMPLE("Hex-Any/C"), _createC, t); - Transliterator::_registerFactory("Hex-Any/XML", _createXML, t); + Transliterator::_registerFactory(UNICODE_STRING_SIMPLE("Hex-Any/XML"), _createXML, t); - Transliterator::_registerFactory("Hex-Any/XML10", _createXML10, t); + Transliterator::_registerFactory(UNICODE_STRING_SIMPLE("Hex-Any/XML10"), _createXML10, t); - Transliterator::_registerFactory("Hex-Any/Perl", _createPerl, t); + Transliterator::_registerFactory(UNICODE_STRING_SIMPLE("Hex-Any/Perl"), _createPerl, t); - Transliterator::_registerFactory("Hex-Any", _createAny, t); + Transliterator::_registerFactory(UNICODE_STRING_SIMPLE("Hex-Any"), _createAny, t); } /** diff --git a/icuSources/i18n/unesctrn.h b/icuSources/i18n/unesctrn.h index 73f820c7..69184899 100644 --- a/icuSources/i18n/unesctrn.h +++ b/icuSources/i18n/unesctrn.h @@ -1,12 +1,12 @@ /* -********************************************************************** -* Copyright (c) 2001-2002, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -* Date Name Description -* 11/20/2001 aliu Creation. -********************************************************************** -*/ + ********************************************************************** + * Copyright (c) 2001-2004, International Business Machines + * Corporation and others. All Rights Reserved. + ********************************************************************** + * Date Name Description + * 11/20/2001 aliu Creation. + ********************************************************************** + */ #ifndef UNESCTRN_H #define UNESCTRN_H @@ -82,14 +82,14 @@ class U_I18N_API UnescapeTransliterator : public Transliterator { * * @draft ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * * @draft ICU 2.2 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } + static UClassID U_EXPORT2 getStaticClassID(); protected: @@ -120,11 +120,6 @@ class U_I18N_API UnescapeTransliterator : public Transliterator { static UChar* copySpec(const UChar* spec); - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; U_NAMESPACE_END diff --git a/icuSources/i18n/uni2name.cpp b/icuSources/i18n/uni2name.cpp index 324f2513..648e466c 100644 --- a/icuSources/i18n/uni2name.cpp +++ b/icuSources/i18n/uni2name.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2001, International Business Machines +* Copyright (C) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -21,9 +21,7 @@ U_NAMESPACE_BEGIN -const char UnicodeNameTransliterator::fgClassID=0; - -const char UnicodeNameTransliterator::_ID[] = "Any-Name"; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(UnicodeNameTransliterator) static const UChar OPEN_DELIM[] = {92,78,123,0}; // "\N{" static const UChar CLOSE_DELIM = 125; // "}" @@ -33,7 +31,7 @@ static const UChar CLOSE_DELIM = 125; // "}" * Constructs a transliterator. */ UnicodeNameTransliterator::UnicodeNameTransliterator(UnicodeFilter* adoptedFilter) : - Transliterator(_ID, adoptedFilter) { + Transliterator(UNICODE_STRING("Any-Name", 8), adoptedFilter) { } /** diff --git a/icuSources/i18n/uni2name.h b/icuSources/i18n/uni2name.h index d5cc88f3..84551151 100644 --- a/icuSources/i18n/uni2name.h +++ b/icuSources/i18n/uni2name.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2001, International Business Machines +* Copyright (C) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -51,21 +51,21 @@ class U_I18N_API UnicodeNameTransliterator : public Transliterator { /** * Transliterator API. */ - Transliterator* clone(void) const; + virtual Transliterator* clone(void) const; /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * * @draft ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * * @draft ICU 2.2 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } + static UClassID U_EXPORT2 getStaticClassID(); protected: @@ -81,15 +81,6 @@ class U_I18N_API UnicodeNameTransliterator : public Transliterator { virtual void handleTransliterate(Replaceable& text, UTransPosition& offset, UBool isIncremental) const; - private: - - static const char _ID[]; - - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; U_NAMESPACE_END diff --git a/icuSources/i18n/unicode/calendar.h b/icuSources/i18n/unicode/calendar.h index 92ffb94c..c9743587 100644 --- a/icuSources/i18n/unicode/calendar.h +++ b/icuSources/i18n/unicode/calendar.h @@ -1,6 +1,6 @@ /* ******************************************************************************** -* Copyright (C) 1997-2003, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************** * @@ -18,6 +18,7 @@ * 11/15/99 weiv added YEAR_WOY and DOW_LOCAL * to EDateFields * 8/19/2002 srl Removed Javaisms +* 11/07/2003 srl Update, clean up documentation. ******************************************************************************** */ @@ -42,6 +43,11 @@ class ICUServiceFactory; */ typedef const void* URegistryKey; +/** + * @internal + */ +typedef int32_t UFieldResolutionTable[12][8]; + /** * Calendar is an abstract base class for converting between * a UDate object and a set of integer fields such as @@ -52,26 +58,26 @@ typedef const void* URegistryKey; * *

    * Subclasses of Calendar interpret a UDate - * according to the rules of a specific calendar system. + * according to the rules of a specific calendar system. * The most commonly used subclass of Calendar is * GregorianCalendar. Other subclasses could represent * the various types of lunar calendars in use in many parts of the world. - * + * *

    * NOTE: (ICU 2.6) The subclass interface should be considered unstable - * - it WILL change. + * - it WILL change. * *

    * Like other locale-sensitive classes, Calendar provides a * static method, createInstance, for getting a generally useful - * object of this type. Calendar's createInstance method + * object of this type. Calendar's createInstance method * returns the appropriate Calendar subclass whose * time fields have been initialized with the current date and time: - *

    + * \htmlonly
    \endhtmlonly *
      * Calendar *rightNow = Calendar::createInstance(errCode);
      * 
    - *
    + * \htmlonly
    \endhtmlonly * *

    * A Calendar object can produce all the time field values @@ -98,7 +104,7 @@ typedef const void* URegistryKey; * combinations of fields. The most recent combination, as determined by the * most recently set single field, will be used. * - *

    + * \htmlonly
    \endhtmlonly *
      * MONTH + DAY_OF_MONTH
      * MONTH + WEEK_OF_MONTH + DAY_OF_WEEK
    @@ -106,16 +112,16 @@ typedef const void* URegistryKey;
      * DAY_OF_YEAR
      * DAY_OF_WEEK + WEEK_OF_YEAR
      * 
    - *
    + * \htmlonly
    \endhtmlonly * * For the time of day: * - *
    + * \htmlonly
    \endhtmlonly *
      * HOUR_OF_DAY
      * AM_PM + HOUR
      * 
    - *
    + * \htmlonly
    \endhtmlonly * *

    * Note: for some non-Gregorian calendars, different @@ -183,12 +189,10 @@ public: MILLISECOND, // Example: 0..999 ZONE_OFFSET, // Example: -12*U_MILLIS_PER_HOUR..12*U_MILLIS_PER_HOUR DST_OFFSET, // Example: 0 or U_MILLIS_PER_HOUR -// here will go names for 'Y' and 'e' - YEAR_WOY, // 'Y' Example: 1..big number - DOW_LOCAL, // 'e' Example: 1..7 - FIELD_COUNT, + YEAR_WOY, // 'Y' Example: 1..big number - Year of Week of Year + DOW_LOCAL, // 'e' Example: 1..7 - Day of Week / Localized - DAY_OF_MONTH = DATE // Synonyms + FIELD_COUNT = UCAL_FIELD_COUNT // See ucal.h for other fields. }; /** @@ -261,7 +265,7 @@ public: * @return A Calendar if created successfully. NULL otherwise. * @stable ICU 2.0 */ - static Calendar* createInstance(UErrorCode& success); + static Calendar* U_EXPORT2 createInstance(UErrorCode& success); /** * Creates a Calendar using the given timezone and the default locale. @@ -275,7 +279,7 @@ public: * @return A Calendar if created successfully. NULL otherwise. * @stable ICU 2.0 */ - static Calendar* createInstance(TimeZone* zoneToAdopt, UErrorCode& success); + static Calendar* U_EXPORT2 createInstance(TimeZone* zoneToAdopt, UErrorCode& success); /** * Creates a Calendar using the given timezone and the default locale. The TimeZone @@ -288,7 +292,7 @@ public: * @return A Calendar if created successfully. NULL otherwise. * @stable ICU 2.0 */ - static Calendar* createInstance(const TimeZone& zone, UErrorCode& success); + static Calendar* U_EXPORT2 createInstance(const TimeZone& zone, UErrorCode& success); /** * Creates a Calendar using the default timezone and the given locale. @@ -300,7 +304,7 @@ public: * @return A Calendar if created successfully. NULL otherwise. * @stable ICU 2.0 */ - static Calendar* createInstance(const Locale& aLocale, UErrorCode& success); + static Calendar* U_EXPORT2 createInstance(const Locale& aLocale, UErrorCode& success); /** * Creates a Calendar using the given timezone and given locale. @@ -315,7 +319,7 @@ public: * @return A Calendar if created successfully. NULL otherwise. * @stable ICU 2.0 */ - static Calendar* createInstance(TimeZone* zoneToAdopt, const Locale& aLocale, UErrorCode& success); + static Calendar* U_EXPORT2 createInstance(TimeZone* zoneToAdopt, const Locale& aLocale, UErrorCode& success); /** * Gets a Calendar using the given timezone and given locale. The TimeZone @@ -329,7 +333,7 @@ public: * @return A Calendar if created successfully. NULL otherwise. * @stable ICU 2.0 */ - static Calendar* createInstance(const TimeZone& zoneToAdopt, const Locale& aLocale, UErrorCode& success); + static Calendar* U_EXPORT2 createInstance(const TimeZone& zoneToAdopt, const Locale& aLocale, UErrorCode& success); /** * Returns a list of the locales for which Calendars are installed. @@ -340,16 +344,16 @@ public: * the caller must NOT delete it. Does not include user-registered Calendars. * @stable ICU 2.0 */ - static const Locale* getAvailableLocales(int32_t& count); + static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count); /** - * Returns the current UTC (GMT) time measured in milliseconds since 0:00:00 on 1/1/70 + * Returns the current UTC (GMT) time measured in milliseconds since 0:00:00 on 1/1/70 * (derived from the system time). * * @return The current UTC time in milliseconds. * @stable ICU 2.0 */ - static UDate getNow(void); + static UDate U_EXPORT2 getNow(void); /** * Gets this Calendar's time as milliseconds. May involve recalculation of time due @@ -408,8 +412,8 @@ public: * the operator==() method to return TRUE, the other Calendar must * be set to the same time. * - * @param other the Calendar to be compared with this Calendar - * @draft ICU 2.4 + * @param other the Calendar to be compared with this Calendar + * @stable ICU 2.4 */ virtual UBool isEquivalentTo(const Calendar& other) const; @@ -476,7 +480,7 @@ public: * leniency, this will be set to an error status. * @deprecated ICU 2.6. use add(UCalendarDateFields field, int32_t amount, UErrorCode& status) instead. */ - virtual void add(EDateFields field, int32_t amount, UErrorCode& status) = 0; + virtual void add(EDateFields field, int32_t amount, UErrorCode& status); /** * UDate Arithmetic function. Adds the specified (signed) amount of time to the given @@ -493,9 +497,9 @@ public: * @param status Output param set to success/failure code on exit. If any value * previously set in the time field is invalid or restricted by * leniency, this will be set to an error status. - * @draft ICU 2.6. + * @stable ICU 2.6. */ - virtual void add(UCalendarDateFields field, int32_t amount, UErrorCode& status) = 0; + virtual void add(UCalendarDateFields field, int32_t amount, UErrorCode& status); /** * Time Field Rolling function. Rolls (up/down) a single unit of time on the given @@ -543,7 +547,7 @@ public: * @param status Output param set to success/failure code on exit. If any value * previously set in the time field is invalid or restricted by * leniency, this will be set to an error status. - * @draft ICU 2.6. + * @stable ICU 2.6. */ inline void roll(UCalendarDateFields field, UBool up, UErrorCode& status); @@ -569,7 +573,7 @@ public: * an error status. * @deprecated ICU 2.6. Use roll(UCalendarDateFields field, int32_t amount, UErrorCode& status) instead. */ - virtual void roll(EDateFields field, int32_t amount, UErrorCode& status) = 0; + virtual void roll(EDateFields field, int32_t amount, UErrorCode& status); /** * Time Field Rolling function. Rolls by the given amount on the given @@ -591,9 +595,9 @@ public: * @param status Output param set to success/failure code on exit. If any value * previously set in the time field is invalid, this will be set to * an error status. - * @draft ICU 2.6. + * @stable ICU 2.6. */ - virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode& status) = 0; + virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode& status); /** * Return the difference between the given time and the time this @@ -705,7 +709,7 @@ public: * @return the difference, either positive or negative, between * this calendar's time and when, in terms of * field. - * @draft ICU 2.6. + * @stable ICU 2.6. */ virtual int32_t fieldDifference(UDate when, UCalendarDateFields field, UErrorCode& status); @@ -792,7 +796,7 @@ public: * Sets what the first day of the week is; e.g., Sunday in US, Monday in France. * * @param value The given first day of the week. - * @draft ICU 2.6. + * @stable ICU 2.6. */ void setFirstDayOfWeek(UCalendarDaysOfWeek value); @@ -809,7 +813,7 @@ public: * * @param status error code * @return The first day of the week. - * @draft ICU 2.6 + * @stable ICU 2.6 */ UCalendarDaysOfWeek getFirstDayOfWeek(UErrorCode &status) const; @@ -843,7 +847,7 @@ public: * @return The minimum value for the given time field. * @deprecated ICU 2.6. Use getMinimum(UCalendarDateFields field) instead. */ - virtual int32_t getMinimum(EDateFields field) const = 0; + virtual int32_t getMinimum(EDateFields field) const; /** * Gets the minimum value for the given time field. e.g., for Gregorian @@ -851,9 +855,9 @@ public: * * @param field The given time field. * @return The minimum value for the given time field. - * @draft ICU 2.6. + * @stable ICU 2.6. */ - virtual int32_t getMinimum(UCalendarDateFields field) const = 0; + virtual int32_t getMinimum(UCalendarDateFields field) const; /** * Gets the maximum value for the given time field. e.g. for Gregorian DAY_OF_MONTH, @@ -863,7 +867,7 @@ public: * @return The maximum value for the given time field. * @deprecated ICU 2.6. Use getMaximum(UCalendarDateFields field) instead. */ - virtual int32_t getMaximum(EDateFields field) const = 0; + virtual int32_t getMaximum(EDateFields field) const; /** * Gets the maximum value for the given time field. e.g. for Gregorian DAY_OF_MONTH, @@ -871,9 +875,9 @@ public: * * @param field The given time field. * @return The maximum value for the given time field. - * @draft ICU 2.6. + * @stable ICU 2.6. */ - virtual int32_t getMaximum(UCalendarDateFields field) const = 0; + virtual int32_t getMaximum(UCalendarDateFields field) const; /** * Gets the highest minimum value for the given field if varies. Otherwise same as @@ -883,7 +887,7 @@ public: * @return The highest minimum value for the given time field. * @deprecated ICU 2.6. Use getGreatestMinimum(UCalendarDateFields field) instead. */ - virtual int32_t getGreatestMinimum(EDateFields field) const = 0; + virtual int32_t getGreatestMinimum(EDateFields field) const; /** * Gets the highest minimum value for the given field if varies. Otherwise same as @@ -891,9 +895,9 @@ public: * * @param field The given time field. * @return The highest minimum value for the given time field. - * @draft ICU 2.6. + * @stable ICU 2.6. */ - virtual int32_t getGreatestMinimum(UCalendarDateFields field) const = 0; + virtual int32_t getGreatestMinimum(UCalendarDateFields field) const; /** * Gets the lowest maximum value for the given field if varies. Otherwise same as @@ -903,7 +907,7 @@ public: * @return The lowest maximum value for the given time field. * @deprecated ICU 2.6. Use getLeastMaximum(UCalendarDateFields field) instead. */ - virtual int32_t getLeastMaximum(EDateFields field) const = 0; + virtual int32_t getLeastMaximum(EDateFields field) const; /** * Gets the lowest maximum value for the given field if varies. Otherwise same as @@ -911,9 +915,9 @@ public: * * @param field The given time field. * @return The lowest maximum value for the given time field. - * @draft ICU 2.6. + * @stable ICU 2.6. */ - virtual int32_t getLeastMaximum(UCalendarDateFields field) const = 0; + virtual int32_t getLeastMaximum(UCalendarDateFields field) const; /** * Return the minimum value that this field could have, given the current date. @@ -943,7 +947,7 @@ public: * @param field the field to determine the minimum of * @param status Fill-in parameter which receives the status of this operation. * @return the minimum of the given field for the current date of this Calendar - * @draft ICU 2.6. + * @stable ICU 2.6. */ int32_t getActualMinimum(UCalendarDateFields field, UErrorCode& status) const; @@ -979,7 +983,7 @@ public: * @param field the field to determine the maximum of * @param status Fill-in parameter which receives the status of this operation. * @return the maximum of the given field for the current date of this Calendar - * @draft ICU 2.6. + * @stable ICU 2.6. */ int32_t getActualMaximum(UCalendarDateFields field, UErrorCode& status) const; @@ -1009,7 +1013,7 @@ public: * @param status Fill-in parameter which receives the status of the operation. * @return The value for the given time field, or zero if the field is unset, * and set() has been called for any other field. - * @draft ICU 2.6. + * @stable ICU 2.6. */ int32_t get(UCalendarDateFields field, UErrorCode& status) const; @@ -1029,7 +1033,7 @@ public: * * @param field The given time field. * @return True if the given time field has a value set; false otherwise. - * @draft ICU 2.6. + * @stable ICU 2.6. */ UBool isSet(UCalendarDateFields field) const; @@ -1047,7 +1051,7 @@ public: * * @param field The given time field. * @param value The value to be set for the given time field. - * @draft ICU 2.6. + * @stable ICU 2.6. */ void set(UCalendarDateFields field, int32_t value); @@ -1116,7 +1120,7 @@ public: * time into time fields. * * @param field The time field to be cleared. - * @draft ICU 2.6. + * @stable ICU 2.6. */ void clear(UCalendarDateFields field); @@ -1128,7 +1132,7 @@ public: * Concrete subclasses of Calendar must implement getDynamicClassID() and also a * static method and data member: * - * static UClassID getStaticClassID() { return (UClassID)&fgClassID; } + * static UClassID getStaticClassID() { return (UClassID)&fgClassID; } * static char fgClassID; * * @return The class ID for this object. All objects of a given class have the @@ -1140,7 +1144,7 @@ public: /** * Returns the resource key string used for this calendar type. * For example, prepending "Eras_" to this string could return "Eras_japanese" - * or "Eras_gregorian". + * or "Eras_gregorian". * * @returns static string, for example, "gregorian" or "japanese" * @internal @@ -1206,7 +1210,7 @@ protected: * leniency, this will be set to an error status. * @stable ICU 2.0 */ - virtual void computeTime(UErrorCode& status) = 0; + virtual void computeTime(UErrorCode& status); /** * Converts GMT as milliseconds to time field values. This allows you to sync up the @@ -1219,7 +1223,7 @@ protected: * leniency, this will be set to an error status. * @stable ICU 2.0 */ - virtual void computeFields(UErrorCode& status) = 0; + virtual void computeFields(UErrorCode& status); /** * Gets this Calendar's current time as a long. @@ -1263,13 +1267,25 @@ protected: */ inline int32_t internalGet(EDateFields field) const {return fFields[field];} + /** + * Gets the value for a given time field. Subclasses can use this function to get + * field values without forcing recomputation of time. If the field's stamp is UNSET, + * the defaultValue is used. + * + * @param field The given time field. + * @param defaultValue a default value used if the field is unset. + * @return The value for the given time field. + * @internal + */ + inline int32_t internalGet(UCalendarDateFields field, int32_t defaultValue) const {return fStamp[field]>kUnset ? fFields[field] : defaultValue;} + /** * Gets the value for a given time field. Subclasses can use this function to get * field values without forcing recomputation of time. * * @param field The given time field. * @return The value for the given time field. - * @draft ICU 2.6. + * @internal */ inline int32_t internalGet(UCalendarDateFields field) const {return fFields[field];} @@ -1291,10 +1307,255 @@ protected: * * @param field The given time field. * @param value The value for the given time field. - * @draft ICU 2.6. + * @stable ICU 2.6. */ inline void internalSet(UCalendarDateFields field, int32_t value); + /** + * Prepare this calendar for computing the actual minimum or maximum. + * This method modifies this calendar's fields; it is called on a + * temporary calendar. + * @internal + */ + virtual void prepareGetActual(UCalendarDateFields field, UBool isMinimum, UErrorCode &status); + + /** + * Limit enums. Not in sync with UCalendarLimitType (refers to internal fields). + * @internal + */ + enum ELimitType { + UCAL_LIMIT_MINIMUM = 0, + UCAL_LIMIT_GREATEST_MINIMUM, + UCAL_LIMIT_LEAST_MAXIMUM, + UCAL_LIMIT_MAXIMUM, + UCAL_LIMIT_COUNT + }; + + /** + * Subclass API for defining limits of different types. + * Subclasses must implement this method to return limits for the + * following fields: + * + *

    UCAL_ERA
    +     * UCAL_YEAR
    +     * UCAL_MONTH
    +     * UCAL_WEEK_OF_YEAR
    +     * UCAL_WEEK_OF_MONTH
    +     * UCAL_DATE (DAY_OF_MONTH on Java)
    +     * UCAL_DAY_OF_YEAR
    +     * UCAL_DAY_OF_WEEK_IN_MONTH
    +     * UCAL_YEAR_WOY
    +     * UCAL_EXTENDED_YEAR
    + * + * @param field one of the above field numbers + * @param limitType one of MINIMUM, GREATEST_MINIMUM, + * LEAST_MAXIMUM, or MAXIMUM + * @internal + */ + virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const = 0; + + /** + * Return a limit for a field. + * @param field the field, from 0..UCAL_MAX_FIELD + * @param limitType the type specifier for the limit + * @see #ELimitType + * @internal + */ + virtual int32_t getLimit(UCalendarDateFields field, ELimitType limitType) const; + + + /** + * Return the Julian day number of day before the first day of the + * given month in the given extended year. Subclasses should override + * this method to implement their calendar system. + * @param eyear the extended year + * @param month the zero-based month, or 0 if useMonth is false + * @param useMonth if false, compute the day before the first day of + * the given year, otherwise, compute the day before the first day of + * the given month + * @return the Julian day number of the day before the first + * day of the given month and year + * @internal + */ + virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month, + UBool useMonth) const = 0; + + /** + * Return the number of days in the given month of the given extended + * year of this calendar system. Subclasses should override this + * method if they can provide a more correct or more efficient + * implementation than the default implementation in Calendar. + * @internal + */ + virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const ; + + /** + * Return the number of days in the given extended year of this + * calendar system. Subclasses should override this method if they can + * provide a more correct or more efficient implementation than the + * default implementation in Calendar. + * @stable ICU 2.0 + */ + virtual int32_t handleGetYearLength(int32_t eyear) const; + + + /** + * Return the extended year defined by the current fields. This will + * use the UCAL_EXTENDED_YEAR field or the UCAL_YEAR and supra-year fields (such + * as UCAL_ERA) specific to the calendar system, depending on which set of + * fields is newer. + * @return the extended year + * @internal + */ + virtual int32_t handleGetExtendedYear() = 0; + + /** + * Subclasses may override this. This method calls + * handleGetMonthLength() to obtain the calendar-specific month + * length. + * @param bestField which field to use to calculate the date + * @return julian day specified by calendar fields. + * @internal + */ + virtual int32_t handleComputeJulianDay(UCalendarDateFields bestField); + + /** + * Subclasses must override this to convert from week fields + * (YEAR_WOY and WEEK_OF_YEAR) to an extended year in the case + * where YEAR, EXTENDED_YEAR are not set. + * The Calendar implementation assumes yearWoy is in extended gregorian form + * @internal + * @return the extended year, UCAL_EXTENDED_YEAR + */ + virtual int32_t handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy); + + /** + * Compute the Julian day from fields. Will determine whether to use + * the JULIAN_DAY field directly, or other fields. + * @return the julian day + * @internal + */ + int32_t computeJulianDay(); + + /** + * Compute the milliseconds in the day from the fields. This is a + * value from 0 to 23:59:59.999 inclusive, unless fields are out of + * range, in which case it can be an arbitrary value. This value + * reflects local zone wall time. + * @internal + */ + int32_t computeMillisInDay(); + + /** + * This method can assume EXTENDED_YEAR has been set. + * @param millis milliseconds of the date fields + * @param millisInDay milliseconds of the time fields; may be out + * or range. + * @param ec Output param set to failure code on function return + * when this function fails. + * @internal + */ + int32_t computeZoneOffset(double millis, int32_t millisInDay, UErrorCode &ec); + + + /** + * Determine the best stamp in a range. + * @param start first enum to look at + * @param end last enum to look at + * @param bestSoFar stamp prior to function call + * @return the stamp value of the best stamp + * @internal + */ + int32_t newestStamp(UCalendarDateFields start, UCalendarDateFields end, int32_t bestSoFar) const; + + /** + * Values for field resolution tables + * @see #resolveFields + * @internal + */ + enum { + /** Marker for end of resolve set (row or group). */ + kResolveSTOP = -1, + /** Value to be bitwised "ORed" against resolve table field values for remapping. Example: (UCAL_DATE | kResolveRemap) in 1st column will cause 'UCAL_DATE' to be returned, but will not examine the value of UCAL_DATE. */ + kResolveRemap = 32 + }; + + /** + * Precedence table for Dates + * @see #resolveFields + * @internal + */ + static const UFieldResolutionTable kDatePrecedence[]; + + /** + * Precedence table for Year + * @see #resolveFields + * @internal + */ + static const UFieldResolutionTable kYearPrecedence[]; + + /** + * Precedence table for Day of Week + * @see #resolveFields + * @internal + */ + static const UFieldResolutionTable kDOWPrecedence[]; + + /** + * Given a precedence table, return the newest field combination in + * the table, or UCAL_FIELD_COUNT if none is found. + * + *

    The precedence table is a 3-dimensional array of integers. It + * may be thought of as an array of groups. Each group is an array of + * lines. Each line is an array of field numbers. Within a line, if + * all fields are set, then the time stamp of the line is taken to be + * the stamp of the most recently set field. If any field of a line is + * unset, then the line fails to match. Within a group, the line with + * the newest time stamp is selected. The first field of the line is + * returned to indicate which line matched. + * + *

    In some cases, it may be desirable to map a line to field that + * whose stamp is NOT examined. For example, if the best field is + * DAY_OF_WEEK then the DAY_OF_WEEK_IN_MONTH algorithm may be used. In + * order to do this, insert the value kResolveRemap | F at + * the start of the line, where F is the desired return + * field value. This field will NOT be examined; it only determines + * the return value if the other fields in the line are the newest. + * + *

    If all lines of a group contain at least one unset field, then no + * line will match, and the group as a whole will fail to match. In + * that case, the next group will be processed. If all groups fail to + * match, then UCAL_FIELD_COUNT is returned. + * @internal + */ + UCalendarDateFields resolveFields(const UFieldResolutionTable *precedenceTable); + + + /** + * @internal + */ + virtual const UFieldResolutionTable* getFieldResolutionTable() const; + + /** + * Return the field that is newer, either defaultField, or + * alternateField. If neither is newer or neither is set, return defaultField. + * @internal + */ + UCalendarDateFields newerField(UCalendarDateFields defaultField, UCalendarDateFields alternateField) const; + + +private: + /** + * Helper function for calculating limits by trial and error + * @param field The field being investigated + * @param startValue starting (least max) value of field + * @param endValue ending (greatest max) value of field + * @param status return type + * @internal + */ + int32_t getActualHelper(UCalendarDateFields field, int32_t startValue, int32_t endValue, UErrorCode &status) const; + + protected: /** * The flag which indicates if the current time is set in the calendar. @@ -1321,6 +1582,15 @@ protected: */ UBool fAreAllFieldsSet; + /** + * True if all fields have been virtually set, but have not yet been + * computed. This occurs only in setTimeInMillis(). A calendar set + * to this state will compute all fields from the time if it becomes + * necessary, but otherwise will delay such computation. + * @draft ICU 3.0 + */ + UBool fAreFieldsVirtuallySet; + /** * Get the current time without recomputing. * @@ -1346,7 +1616,7 @@ protected: /** * The flags which tell if a specified time field for the calendar is set. - * @stable ICU 2.0 + * @deprecated ICU 2.8 use (fStamp[n]!=kUnset) */ UBool fIsSet[UCAL_FIELD_COUNT]; @@ -1367,9 +1637,213 @@ protected: */ int32_t fStamp[UCAL_FIELD_COUNT]; + /** + * Subclasses may override this method to compute several fields + * specific to each calendar system. These are: + * + *

    • ERA + *
    • YEAR + *
    • MONTH + *
    • DAY_OF_MONTH + *
    • DAY_OF_YEAR + *
    • EXTENDED_YEAR
    + * + * Subclasses can refer to the DAY_OF_WEEK and DOW_LOCAL fields, which + * will be set when this method is called. Subclasses can also call + * the getGregorianXxx() methods to obtain Gregorian calendar + * equivalents for the given Julian day. + * + *

    In addition, subclasses should compute any subclass-specific + * fields, that is, fields from BASE_FIELD_COUNT to + * getFieldCount() - 1. + * + *

    The default implementation in Calendar implements + * a pure proleptic Gregorian calendar. + * @internal + */ + virtual void handleComputeFields(int32_t julianDay, UErrorCode &status); + + /** + * Return the extended year on the Gregorian calendar as computed by + * computeGregorianFields(). + * @see #computeGregorianFields + * @internal + */ + int32_t getGregorianYear() const { + return fGregorianYear; + } + + /** + * Return the month (0-based) on the Gregorian calendar as computed by + * computeGregorianFields(). + * @see #computeGregorianFields + * @internal + */ + int32_t getGregorianMonth() const { + return fGregorianMonth; + } + + /** + * Return the day of year (1-based) on the Gregorian calendar as + * computed by computeGregorianFields(). + * @see #computeGregorianFields + * @internal + */ + int32_t getGregorianDayOfYear() const { + return fGregorianDayOfYear; + } + + /** + * Return the day of month (1-based) on the Gregorian calendar as + * computed by computeGregorianFields(). + * @see #computeGregorianFields + * @internal + */ + int32_t getGregorianDayOfMonth() const { + return fGregorianDayOfMonth; + } + + /** + * Called by computeJulianDay. Returns the default month (0-based) for the year, + * taking year and era into account. Defaults to 0 for Gregorian, which doesn't care. + * @internal + * @internal + */ + virtual int32_t getDefaultMonthInYear() ; + + + /** + * Called by computeJulianDay. Returns the default day (1-based) for the month, + * taking currently-set year and era into account. Defaults to 1 for Gregorian. + * @internal + */ + virtual int32_t getDefaultDayInMonth(int32_t /*month*/); + + //------------------------------------------------------------------------- + // Protected utility methods for use by subclasses. These are very handy + // for implementing add, roll, and computeFields. + //------------------------------------------------------------------------- + + /** + * Adjust the specified field so that it is within + * the allowable range for the date to which this calendar is set. + * For example, in a Gregorian calendar pinning the {@link #UCalendarDateFields DAY_OF_MONTH} + * field for a calendar set to April 31 would cause it to be set + * to April 30. + *

    + * Subclassing: + *
    + * This utility method is intended for use by subclasses that need to implement + * their own overrides of {@link #roll roll} and {@link #add add}. + *

    + * Note: + * pinField is implemented in terms of + * {@link #getActualMinimum getActualMinimum} + * and {@link #getActualMaximum getActualMaximum}. If either of those methods uses + * a slow, iterative algorithm for a particular field, it would be + * unwise to attempt to call pinField for that field. If you + * really do need to do so, you should override this method to do + * something more efficient for that field. + *

    + * @param field The calendar field whose value should be pinned. + * @param status Output param set to failure code on function return + * when this function fails. + * + * @see #getActualMinimum + * @see #getActualMaximum + * @stable ICU 2.0 + */ + virtual void pinField(UCalendarDateFields field, UErrorCode& status); + + /** + * Return the week number of a day, within a period. This may be the week number in + * a year or the week number in a month. Usually this will be a value >= 1, but if + * some initial days of the period are excluded from week 1, because + * {@link #getMinimalDaysInFirstWeek getMinimalDaysInFirstWeek} is > 1, then + * the week number will be zero for those + * initial days. This method requires the day number and day of week for some + * known date in the period in order to determine the day of week + * on the desired day. + *

    + * Subclassing: + *
    + * This method is intended for use by subclasses in implementing their + * {@link #computeTime computeTime} and/or {@link #computeFields computeFields} methods. + * It is often useful in {@link #getActualMinimum getActualMinimum} and + * {@link #getActualMaximum getActualMaximum} as well. + *

    + * This variant is handy for computing the week number of some other + * day of a period (often the first or last day of the period) when its day + * of the week is not known but the day number and day of week for some other + * day in the period (e.g. the current date) is known. + *

    + * @param desiredDay The {@link #UCalendarDateFields DAY_OF_YEAR} or + * {@link #UCalendarDateFields DAY_OF_MONTH} whose week number is desired. + * Should be 1 for the first day of the period. + * + * @param dayOfPeriod The {@link #UCalendarDateFields DAY_OF_YEAR} + * or {@link #UCalendarDateFields DAY_OF_MONTH} for a day in the period whose + * {@link #UCalendarDateFields DAY_OF_WEEK} is specified by the + * knownDayOfWeek parameter. + * Should be 1 for first day of period. + * + * @param dayOfWeek The {@link #UCalendarDateFields DAY_OF_WEEK} for the day + * corresponding to the knownDayOfPeriod parameter. + * 1-based with 1=Sunday. + * + * @return The week number (one-based), or zero if the day falls before + * the first week because + * {@link #getMinimalDaysInFirstWeek getMinimalDaysInFirstWeek} + * is more than one. + * + * @draft ICU 2.8 + */ + int32_t weekNumber(int32_t desiredDay, int32_t dayOfPeriod, int32_t dayOfWeek); + + + /** + * Return the week number of a day, within a period. This may be the week number in + * a year, or the week number in a month. Usually this will be a value >= 1, but if + * some initial days of the period are excluded from week 1, because + * {@link #getMinimalDaysInFirstWeek getMinimalDaysInFirstWeek} is > 1, + * then the week number will be zero for those + * initial days. This method requires the day of week for the given date in order to + * determine the result. + *

    + * Subclassing: + *
    + * This method is intended for use by subclasses in implementing their + * {@link #computeTime computeTime} and/or {@link #computeFields computeFields} methods. + * It is often useful in {@link #getActualMinimum getActualMinimum} and + * {@link #getActualMaximum getActualMaximum} as well. + *

    + * @param dayOfPeriod The {@link #UCalendarDateFields DAY_OF_YEAR} or + * {@link #UCalendarDateFields DAY_OF_MONTH} whose week number is desired. + * Should be 1 for the first day of the period. + * + * @param dayOfWeek The {@link #UCalendarDateFields DAY_OF_WEEK} for the day + * corresponding to the dayOfPeriod parameter. + * 1-based with 1=Sunday. + * + * @return The week number (one-based), or zero if the day falls before + * the first week because + * {@link #getMinimalDaysInFirstWeek getMinimalDaysInFirstWeek} + * is more than one. + * @internal + */ + inline int32_t weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek); + + /** + * returns the local DOW, valid range 0..6 + * @internal + */ + int32_t getLocalDOW(); + private: - // The next available value for stampp[] + /** + * The next available value for fStamp[] + */ int32_t fNextStamp;// = MINIMUM_USER_STAMP; /** @@ -1404,11 +1878,12 @@ private: * time. * * @param desiredLocale The given locale. + * @param type The calendar type identifier, e.g: gregorian, buddhist, etc. * @param success Indicates the status of setting the week count data from * the resource for the given locale. Returns U_ZERO_ERROR if * constructed successfully. */ - void setWeekCountData(const Locale& desiredLocale, UErrorCode& success); + void setWeekCountData(const Locale& desiredLocale, const char *type, UErrorCode& success); /** * Recompute the time and update the status fields isTimeSet @@ -1431,13 +1906,130 @@ private: */ static const char kDefaultCalendar[]; + + /** + * The Gregorian year, as computed by computeGregorianFields() and + * returned by getGregorianYear(). + */ + int32_t fGregorianYear; + + /** + * The Gregorian month, as computed by computeGregorianFields() and + * returned by getGregorianMonth(). + */ + int32_t fGregorianMonth; + + /** + * The Gregorian day of the year, as computed by + * computeGregorianFields() and returned by getGregorianDayOfYear(). + */ + int32_t fGregorianDayOfYear; + + /** + * The Gregorian day of the month, as computed by + * computeGregorianFields() and returned by getGregorianDayOfMonth(). + */ + int32_t fGregorianDayOfMonth; + + /* calculations */ + + /** + * Compute the Gregorian calendar year, month, and day of month from + * the given Julian day. These values are not stored in fields, but in + * member variables gregorianXxx. Also compute the DAY_OF_WEEK and + * DOW_LOCAL fields. + */ + void computeGregorianAndDOWFields(int32_t julianDay, UErrorCode &ec); + + /** + * Compute the Gregorian calendar year, month, and day of month from the + * Julian day. These values are not stored in fields, but in member + * variables gregorianXxx. They are used for time zone computations and by + * subclasses that are Gregorian derivatives. Subclasses may call this + * method to perform a Gregorian calendar millis->fields computation. + * To perform a Gregorian calendar fields->millis computation, call + * computeGregorianMonthStart(). + * @see #computeGregorianMonthStart + */ + void computeGregorianFields(int32_t julianDay, UErrorCode &ec); + + /** + * Compute the fields WEEK_OF_YEAR, YEAR_WOY, WEEK_OF_MONTH, + * DAY_OF_WEEK_IN_MONTH, and DOW_LOCAL from EXTENDED_YEAR, YEAR, + * DAY_OF_WEEK, and DAY_OF_YEAR. The latter fields are computed by the + * subclass based on the calendar system. + * + *

    The YEAR_WOY field is computed simplistically. It is equal to YEAR + * most of the time, but at the year boundary it may be adjusted to YEAR-1 + * or YEAR+1 to reflect the overlap of a week into an adjacent year. In + * this case, a simple increment or decrement is performed on YEAR, even + * though this may yield an invalid YEAR value. For instance, if the YEAR + * is part of a calendar system with an N-year cycle field CYCLE, then + * incrementing the YEAR may involve incrementing CYCLE and setting YEAR + * back to 0 or 1. This is not handled by this code, and in fact cannot be + * simply handled without having subclasses define an entire parallel set of + * fields for fields larger than or equal to a year. This additional + * complexity is not warranted, since the intention of the YEAR_WOY field is + * to support ISO 8601 notation, so it will typically be used with a + * proleptic Gregorian calendar, which has no field larger than a year. + */ + void computeWeekFields(UErrorCode &ec); + + + /** + * Ensure that each field is within its valid range by calling {@link + * #validateField(int, int&)} on each field that has been set. This method + * should only be called if this calendar is not lenient. + * @see #isLenient + * @see #validateField(int, int&) + * @internal + */ + void validateFields(UErrorCode &status); + + /** + * Validate a single field of this calendar. Subclasses should + * override this method to validate any calendar-specific fields. + * Generic fields can be handled by + * Calendar.validateField(). + * @see #validateField(int, int, int, int&) + * @internal + */ + virtual void validateField(UCalendarDateFields field, UErrorCode &status); + + /** + * Validate a single field of this calendar given its minimum and + * maximum allowed value. If the field is out of range, + * U_ILLEGAL_ARGUMENT_ERROR will be set. Subclasses may + * use this method in their implementation of {@link + * #validateField(int, int&)}. + * @internal + */ + void validateField(UCalendarDateFields field, int32_t min, int32_t max, UErrorCode& status); + + protected: + /** + * Convert a quasi Julian date to the day of the week. The Julian date used here is + * not a true Julian date, since it is measured from midnight, not noon. Return + * value is one-based. + * + * @param julian The given Julian date number. + * @return Day number from 1..7 (SUN..SAT). + * @internal + */ + static uint8_t julianDayToDayOfWeek(double julian); + + private: + char validLocale[ULOC_FULLNAME_CAPACITY]; + char actualLocale[ULOC_FULLNAME_CAPACITY]; + public: - /** +#if !UCONFIG_NO_SERVICE + /** * INTERNAL FOR 2.6 -- Registration. */ /** - * Return a StringEnumeration over the locales available at the time of the call, + * Return a StringEnumeration over the locales available at the time of the call, * including registered locales. * @return a StringEnumeration over the locales available at the time of the call * @internal @@ -1465,27 +2057,28 @@ private: * @internal */ static UBool unregister(URegistryKey key, UErrorCode& status); - + /** * Multiple Calendar Implementation - * @internal + * @internal */ friend class CalendarFactory; /** * Multiple Calendar Implementation - * @internal + * @internal */ friend class CalendarService; /** * Multiple Calendar Implementation - * @internal + * @internal */ friend class DefaultCalendarFactory; +#endif /* !UCONFIG_NO_SERVICE */ /** - * @internal + * @internal * @return TRUE if this calendar has a default century (i.e. 03 -> 2003) */ virtual UBool haveDefaultCentury() const = 0; @@ -1496,11 +2089,27 @@ private: */ virtual UDate defaultCenturyStart() const = 0; /** - * @internal + * @internal * @return the beginning year of the default century, as a year */ virtual int32_t defaultCenturyStartYear() const = 0; - + + /** Get the locale for this calendar object. You can choose between valid and actual locale. + * @param type type of the locale we're looking for (valid or actual) + * @param status error code for the operation + * @return the locale + * @draft ICU 2.8 likely to change in ICU 3.0, based on feedback + */ + Locale getLocale(ULocDataLocaleType type, UErrorCode &status) const; + + /** Get the locale for this calendar object. You can choose between valid and actual locale. + * @param type type of the locale we're looking for (valid or actual) + * @param status error code for the operation + * @return the locale + * @internal + */ + const char* getLocaleID(ULocDataLocaleType type, UErrorCode &status) const; + }; // ------------------------------------- @@ -1514,7 +2123,7 @@ Calendar::createInstance(TimeZone* zone, UErrorCode& errorCode) // ------------------------------------- -inline void +inline void Calendar::roll(UCalendarDateFields field, UBool up, UErrorCode& status) { roll(field, (int32_t)(up ? +1 : -1), status); @@ -1526,6 +2135,7 @@ Calendar::roll(EDateFields field, UBool up, UErrorCode& status) roll((UCalendarDateFields) field, up, status); } + // ------------------------------------- /** @@ -1537,6 +2147,8 @@ inline void Calendar::internalSet(UCalendarDateFields field, int32_t value) { fFields[field] = value; + fStamp[field] = kInternallySet; + fIsSet[field] = TRUE; // Remove later } inline void @@ -1545,6 +2157,12 @@ Calendar::internalSet(EDateFields field, int32_t value) internalSet((UCalendarDateFields) field, value); } +inline int32_t Calendar::weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek) +{ + return weekNumber(dayOfPeriod, dayOfPeriod, dayOfWeek); +} + + U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/i18n/unicode/choicfmt.h b/icuSources/i18n/unicode/choicfmt.h index 1a6011c0..410ff19d 100644 --- a/icuSources/i18n/unicode/choicfmt.h +++ b/icuSources/i18n/unicode/choicfmt.h @@ -1,6 +1,6 @@ /* ******************************************************************************** -* Copyright (C) 1997-2003, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************** * @@ -131,9 +131,9 @@ class MessageFormat; * X and and index value j in the range * 0..n-1, where n is the number of ranges:

    * - *
    X matches j if and only if + * \htmlonly
    \endhtmlonlyX matches j if and only if * limit[j] <= X < limit[j+1] - *
    + * \htmlonly
    \endhtmlonly * *

    (This assumes that all closures are FALSE. If some * closures are TRUE then the relations must be changed to @@ -246,6 +246,10 @@ class MessageFormat; * return 0; * } * \endcode + * + *

    User subclasses are not supported. While clients may write + * subclasses, such code will not necessarily work and will not be + * guaranteed to work stably from release to release. */ class U_I18N_API ChoiceFormat: public NumberFormat { public: @@ -291,7 +295,7 @@ public: * then the limit belongs to the range below it. * @param formats Array of formats * @param count Size of 'limits', 'closures', and 'formats' arrays - * @draft ICU 2.4 + * @stable ICU 2.4 */ ChoiceFormat(const double* limits, const UBool* closures, @@ -430,7 +434,7 @@ public: * @param closures Array of limit booleans * @param formats Array of format string * @param count The size of the above arrays - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual void setChoices(const double* limits, const UBool* closures, @@ -452,7 +456,7 @@ public: * * @param count The size of the arrays * @return the closures - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual const UBool* getClosures(int32_t& count) const; @@ -493,6 +497,22 @@ public: virtual UnicodeString& format(int32_t number, UnicodeString& appendTo, FieldPosition& pos) const; + + /** + * Format an int64_t number using this object's choices. + * + * @param number The value to be formatted. + * @param appendTo Output parameter to receive result. + * Result is appended to existing contents. + * @param pos On input: an alignment field, if desired. + * On output: the offsets of the alignment field. + * @return Reference to 'appendTo' parameter. + * @draft ICU 2.8 + */ + virtual UnicodeString& format(int64_t number, + UnicodeString& appendTo, + FieldPosition& pos) const; + /** * Format an array of objects using this object's choices. * @@ -642,7 +662,7 @@ public: * @return The class ID for all objects of this class. * @stable ICU 2.0 */ - static inline UClassID getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(void); private: // static cache management (thread-safe) @@ -666,13 +686,6 @@ private: */ static UnicodeString& dtos(double value, UnicodeString& string); - //static UMTX fgMutex; - //static NumberFormat* fgNumberFormat; - static const char fgClassID; - - static const UChar fgPositiveInfinity[]; - static const UChar fgNegativeInfinity[]; - ChoiceFormat(); // default constructor not implemented /** @@ -734,18 +747,6 @@ private: int32_t fCount; }; -inline UClassID -ChoiceFormat::getStaticClassID(void) -{ - return (UClassID)&fgClassID; -} - -inline UClassID -ChoiceFormat::getDynamicClassID() const -{ - return ChoiceFormat::getStaticClassID(); -} - inline UnicodeString& ChoiceFormat::format(const Formattable& obj, UnicodeString& appendTo, diff --git a/icuSources/i18n/unicode/coleitr.h b/icuSources/i18n/unicode/coleitr.h index 9a890266..2c2d61d9 100644 --- a/icuSources/i18n/unicode/coleitr.h +++ b/icuSources/i18n/unicode/coleitr.h @@ -1,9 +1,9 @@ /* -****************************************************************************** -* Copyright (C) 1997-2003, International Business Machines -* Corporation and others. All Rights Reserved. -****************************************************************************** -*/ + ****************************************************************************** + * Copyright (C) 1997-2004, International Business Machines + * Corporation and others. All Rights Reserved. + ****************************************************************************** + */ /** * File coleitr.h @@ -121,248 +121,235 @@ U_NAMESPACE_BEGIN class U_I18N_API CollationElementIterator : public UObject { public: - // CollationElementIterator public data member ------------------------------ - - /** - * NULLORDER indicates that an error has occured while processing - * @stable ICU 2.0 - */ - static int32_t const NULLORDER; - - // CollationElementIterator public constructor/destructor ------------------- - - /** - * Copy constructor. - * - * @param other the object to be copied from - * @stable ICU 2.0 - */ - CollationElementIterator(const CollationElementIterator& other); - - /** - * Destructor - * @stable ICU 2.0 - */ - ~CollationElementIterator(); - - // CollationElementIterator public methods ---------------------------------- - - /** - * Returns true if "other" is the same as "this" - * - * @param other the object to be compared - * @return true if "other" is the same as "this" - * @stable ICU 2.0 - */ - UBool operator==(const CollationElementIterator& other) const; - - /** - * Returns true if "other" is not the same as "this". - * - * @param other the object to be compared - * @return true if "other" is not the same as "this" - * @stable ICU 2.0 - */ - UBool operator!=(const CollationElementIterator& other) const; - - /** - * Resets the cursor to the beginning of the string. - * @stable ICU 2.0 - */ - void reset(void); - - /** - * Gets the ordering priority of the next character in the string. - * @param status the error code status. - * @return the next character's ordering. otherwise returns NULLORDER if an - * error has occured or if the end of string has been reached - * @stable ICU 2.0 - */ - int32_t next(UErrorCode& status); - - /** - * Get the ordering priority of the previous collation element in the string. - * @param status the error code status. - * @return the previous element's ordering. otherwise returns NULLORDER if an - * error has occured or if the start of string has been reached - * @stable ICU 2.0 - */ - int32_t previous(UErrorCode& status); - - /** - * Gets the primary order of a collation order. - * @param order the collation order - * @return the primary order of a collation order. - * @stable ICU 2.0 - */ - static int32_t primaryOrder(int32_t order); - - /** - * Gets the secondary order of a collation order. - * @param order the collation order - * @return the secondary order of a collation order. - * @stable ICU 2.0 - */ - static int32_t secondaryOrder(int32_t order); - - /** - * Gets the tertiary order of a collation order. - * @param order the collation order - * @return the tertiary order of a collation order. - * @stable ICU 2.0 - */ - static int32_t tertiaryOrder(int32_t order); - - /** - * Return the maximum length of any expansion sequences that end with the - * specified comparison order. - * @param order a collation order returned by previous or next. - * @return maximum size of the expansion sequences ending with the collation - * element or 1 if collation element does not occur at the end of any - * expansion sequence - * @stable ICU 2.0 - */ - int32_t getMaxExpansion(int32_t order) const; - - /** - * Gets the comparison order in the desired strength. Ignore the other - * differences. - * @param order The order value - * @stable ICU 2.0 - */ - int32_t strengthOrder(int32_t order) const; - - /** - * Sets the source string. - * @param str the source string. - * @param status the error code status. - * @stable ICU 2.0 - */ - void setText(const UnicodeString& str, UErrorCode& status); - - /** - * Sets the source string. - * @param str the source character iterator. - * @param status the error code status. - * @stable ICU 2.0 - */ - void setText(CharacterIterator& str, UErrorCode& status); - - /** - * Checks if a comparison order is ignorable. - * @param order the collation order. - * @return TRUE if a character is ignorable, FALSE otherwise. - * @stable ICU 2.0 - */ - static UBool isIgnorable(int32_t order); - - /** - * Gets the offset of the currently processed character in the source string. - * @return the offset of the character. - * @stable ICU 2.0 - */ - int32_t getOffset(void) const; - - /** - * Sets the offset of the currently processed character in the source string. - * @param newOffset the new offset. - * @param status the error code status. - * @return the offset of the character. - * @stable ICU 2.0 - */ - void setOffset(int32_t newOffset, UErrorCode& status); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @draft ICU 2.2 - */ - virtual inline UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @draft ICU 2.2 - */ - static inline UClassID getStaticClassID(); + // CollationElementIterator public data member ------------------------------ + + /** + * NULLORDER indicates that an error has occured while processing + * @stable ICU 2.0 + */ + static int32_t const NULLORDER; + + // CollationElementIterator public constructor/destructor ------------------- + + /** + * Copy constructor. + * + * @param other the object to be copied from + * @stable ICU 2.0 + */ + CollationElementIterator(const CollationElementIterator& other); + + /** + * Destructor + * @stable ICU 2.0 + */ + virtual ~CollationElementIterator(); + + // CollationElementIterator public methods ---------------------------------- + + /** + * Returns true if "other" is the same as "this" + * + * @param other the object to be compared + * @return true if "other" is the same as "this" + * @stable ICU 2.0 + */ + UBool operator==(const CollationElementIterator& other) const; + + /** + * Returns true if "other" is not the same as "this". + * + * @param other the object to be compared + * @return true if "other" is not the same as "this" + * @stable ICU 2.0 + */ + UBool operator!=(const CollationElementIterator& other) const; + + /** + * Resets the cursor to the beginning of the string. + * @stable ICU 2.0 + */ + void reset(void); + + /** + * Gets the ordering priority of the next character in the string. + * @param status the error code status. + * @return the next character's ordering. otherwise returns NULLORDER if an + * error has occured or if the end of string has been reached + * @stable ICU 2.0 + */ + int32_t next(UErrorCode& status); + + /** + * Get the ordering priority of the previous collation element in the string. + * @param status the error code status. + * @return the previous element's ordering. otherwise returns NULLORDER if an + * error has occured or if the start of string has been reached + * @stable ICU 2.0 + */ + int32_t previous(UErrorCode& status); + + /** + * Gets the primary order of a collation order. + * @param order the collation order + * @return the primary order of a collation order. + * @stable ICU 2.0 + */ + static inline int32_t primaryOrder(int32_t order); + + /** + * Gets the secondary order of a collation order. + * @param order the collation order + * @return the secondary order of a collation order. + * @stable ICU 2.0 + */ + static inline int32_t secondaryOrder(int32_t order); + + /** + * Gets the tertiary order of a collation order. + * @param order the collation order + * @return the tertiary order of a collation order. + * @stable ICU 2.0 + */ + static inline int32_t tertiaryOrder(int32_t order); + + /** + * Return the maximum length of any expansion sequences that end with the + * specified comparison order. + * @param order a collation order returned by previous or next. + * @return maximum size of the expansion sequences ending with the collation + * element or 1 if collation element does not occur at the end of any + * expansion sequence + * @stable ICU 2.0 + */ + int32_t getMaxExpansion(int32_t order) const; + + /** + * Gets the comparison order in the desired strength. Ignore the other + * differences. + * @param order The order value + * @stable ICU 2.0 + */ + int32_t strengthOrder(int32_t order) const; + + /** + * Sets the source string. + * @param str the source string. + * @param status the error code status. + * @stable ICU 2.0 + */ + void setText(const UnicodeString& str, UErrorCode& status); + + /** + * Sets the source string. + * @param str the source character iterator. + * @param status the error code status. + * @stable ICU 2.0 + */ + void setText(CharacterIterator& str, UErrorCode& status); + + /** + * Checks if a comparison order is ignorable. + * @param order the collation order. + * @return TRUE if a character is ignorable, FALSE otherwise. + * @stable ICU 2.0 + */ + static inline UBool isIgnorable(int32_t order); + + /** + * Gets the offset of the currently processed character in the source string. + * @return the offset of the character. + * @stable ICU 2.0 + */ + int32_t getOffset(void) const; + + /** + * Sets the offset of the currently processed character in the source string. + * @param newOffset the new offset. + * @param status the error code status. + * @return the offset of the character. + * @stable ICU 2.0 + */ + void setOffset(int32_t newOffset, UErrorCode& status); + + /** + * ICU "poor man's RTTI", returns a UClassID for the actual class. + * + * @stable ICU 2.2 + */ + virtual UClassID getDynamicClassID() const; + + /** + * ICU "poor man's RTTI", returns a UClassID for this class. + * + * @stable ICU 2.2 + */ + static UClassID U_EXPORT2 getStaticClassID(); protected: - // CollationElementIterator protected constructors -------------------------- - /** - * @stable ICU 2.0 - */ - friend class RuleBasedCollator; - - /** - * CollationElementIterator constructor. This takes the source string and the - * collation object. The cursor will walk thru the source string based on the - * predefined collation rules. If the source string is empty, NULLORDER will - * be returned on the calls to next(). - * @param sourceText the source string. - * @param order the collation object. - * @param status the error code status. - * @stable ICU 2.0 - */ - CollationElementIterator(const UnicodeString& sourceText, - const RuleBasedCollator* order, UErrorCode& status); - - /** - * CollationElementIterator constructor. This takes the source string and the - * collation object. The cursor will walk thru the source string based on the - * predefined collation rules. If the source string is empty, NULLORDER will - * be returned on the calls to next(). - * @param sourceText the source string. - * @param order the collation object. - * @param status the error code status. - * @stable ICU 2.0 - */ - CollationElementIterator(const CharacterIterator& sourceText, - const RuleBasedCollator* order, UErrorCode& status); - - // CollationElementIterator protected methods ------------------------------- - - /** - * Assignment operator - * - * @param other the object to be copied - * @stable ICU 2.0 - */ - const CollationElementIterator& - operator=(const CollationElementIterator& other); + // CollationElementIterator protected constructors -------------------------- + /** + * @stable ICU 2.0 + */ + friend class RuleBasedCollator; + + /** + * CollationElementIterator constructor. This takes the source string and the + * collation object. The cursor will walk thru the source string based on the + * predefined collation rules. If the source string is empty, NULLORDER will + * be returned on the calls to next(). + * @param sourceText the source string. + * @param order the collation object. + * @param status the error code status. + * @stable ICU 2.0 + */ + CollationElementIterator(const UnicodeString& sourceText, + const RuleBasedCollator* order, UErrorCode& status); + + /** + * CollationElementIterator constructor. This takes the source string and the + * collation object. The cursor will walk thru the source string based on the + * predefined collation rules. If the source string is empty, NULLORDER will + * be returned on the calls to next(). + * @param sourceText the source string. + * @param order the collation object. + * @param status the error code status. + * @stable ICU 2.0 + */ + CollationElementIterator(const CharacterIterator& sourceText, + const RuleBasedCollator* order, UErrorCode& status); + + // CollationElementIterator protected methods ------------------------------- + + /** + * Assignment operator + * + * @param other the object to be copied + * @stable ICU 2.0 + */ + const CollationElementIterator& + operator=(const CollationElementIterator& other); private: - CollationElementIterator(); // default constructor not implemented + CollationElementIterator(); // default constructor not implemented - // CollationElementIterator private data members ---------------------------- + // CollationElementIterator private data members ---------------------------- - /** - * Data wrapper for collation elements - */ - UCollationElements *m_data_; + /** + * Data wrapper for collation elements + */ + UCollationElements *m_data_; - /** - * Indicates if m_data_ belongs to this object. - */ - UBool isDataOwned_; + /** + * Indicates if m_data_ belongs to this object. + */ + UBool isDataOwned_; - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; // CollationElementIterator inline method defination -------------------------- -inline UClassID -CollationElementIterator::getStaticClassID() -{ return (UClassID)&fgClassID; } - -inline UClassID -CollationElementIterator::getDynamicClassID() const -{ return CollationElementIterator::getStaticClassID(); } - /** * Get the primary order of a collation order. * @param order the collation order @@ -370,8 +357,8 @@ CollationElementIterator::getDynamicClassID() const */ inline int32_t CollationElementIterator::primaryOrder(int32_t order) { - order &= RuleBasedCollator::PRIMARYORDERMASK; - return (order >> RuleBasedCollator::PRIMARYORDERSHIFT); + order &= RuleBasedCollator::PRIMARYORDERMASK; + return (order >> RuleBasedCollator::PRIMARYORDERSHIFT); } /** @@ -381,8 +368,8 @@ inline int32_t CollationElementIterator::primaryOrder(int32_t order) */ inline int32_t CollationElementIterator::secondaryOrder(int32_t order) { - order = order & RuleBasedCollator::SECONDARYORDERMASK; - return (order >> RuleBasedCollator::SECONDARYORDERSHIFT); + order = order & RuleBasedCollator::SECONDARYORDERMASK; + return (order >> RuleBasedCollator::SECONDARYORDERSHIFT); } /** @@ -392,17 +379,17 @@ inline int32_t CollationElementIterator::secondaryOrder(int32_t order) */ inline int32_t CollationElementIterator::tertiaryOrder(int32_t order) { - return (order &= RuleBasedCollator::TERTIARYORDERMASK); + return (order &= RuleBasedCollator::TERTIARYORDERMASK); } inline int32_t CollationElementIterator::getMaxExpansion(int32_t order) const { - return ucol_getMaxExpansion(m_data_, (uint32_t)order); + return ucol_getMaxExpansion(m_data_, (uint32_t)order); } inline UBool CollationElementIterator::isIgnorable(int32_t order) { - return (primaryOrder(order) == RuleBasedCollator::PRIMIGNORABLE); + return (primaryOrder(order) == RuleBasedCollator::PRIMIGNORABLE); } U_NAMESPACE_END diff --git a/icuSources/i18n/unicode/coll.h b/icuSources/i18n/unicode/coll.h index 22687c6f..d72d23f4 100644 --- a/icuSources/i18n/unicode/coll.h +++ b/icuSources/i18n/unicode/coll.h @@ -1,13 +1,13 @@ /* ****************************************************************************** -* Copyright (C) 1996-2003, International Business Machines * +* Copyright (C) 1996-2004, International Business Machines * * Corporation and others. All Rights Reserved. * ****************************************************************************** */ /** * File coll.h -* +* * Created by: Helena Shih * * Modification History: @@ -32,13 +32,13 @@ * 02/10/98 damiba Added compare() with length as parameter. * 04/23/99 stephen Removed EDecompositionMode, merged with * Normalizer::EMode. -* 11/02/99 helena Collator performance enhancements. Eliminates the +* 11/02/99 helena Collator performance enhancements. Eliminates the * UnicodeString construction and special case for NO_OP. * 11/23/99 srl More performance enhancements. Inlining of * critical accessors. -* 05/15/00 helena Added version information API. -* 01/29/01 synwee Modified into a C++ wrapper which calls C apis -* (ucoll.h). +* 05/15/00 helena Added version information API. +* 01/29/01 synwee Modified into a C++ wrapper which calls C apis +* (ucoll.h). */ #ifndef COLL_H @@ -58,15 +58,17 @@ U_NAMESPACE_BEGIN class StringEnumeration; +#if !UCONFIG_NO_SERVICE /** - * @draft ICU 2.6 + * @stable ICU 2.6 */ typedef const void* URegistryKey; /** - * @draft ICU 2.6 + * @stable ICU 2.6 */ class CollatorFactory; +#endif /** * @stable ICU 2.0 @@ -74,32 +76,32 @@ class CollatorFactory; class CollationKey; /** -* The Collator class performs locale-sensitive string +* The Collator class performs locale-sensitive string * comparison.
    -* You use this class to build searching and sorting routines for natural +* You use this class to build searching and sorting routines for natural * language text.
    -* Important: The ICU collation service has been reimplemented -* in order to achieve better performance and UCA compliance. -* For details, see the +* Important: The ICU collation service has been reimplemented +* in order to achieve better performance and UCA compliance. +* For details, see the * * collation design document. *

    -* Collator is an abstract base class. Subclasses implement -* specific collation strategies. One subclass, -* RuleBasedCollator, is currently provided and is applicable -* to a wide set of languages. Other subclasses may be created to handle more +* Collator is an abstract base class. Subclasses implement +* specific collation strategies. One subclass, +* RuleBasedCollator, is currently provided and is applicable +* to a wide set of languages. Other subclasses may be created to handle more * specialized needs. *

    -* Like other locale-sensitive classes, you can use the static factory method, -* createInstance, to obtain the appropriate -* Collator object for a given locale. You will only need to -* look at the subclasses of Collator if you need to -* understand the details of a particular collation strategy or if you need to +* Like other locale-sensitive classes, you can use the static factory method, +* createInstance, to obtain the appropriate +* Collator object for a given locale. You will only need to +* look at the subclasses of Collator if you need to +* understand the details of a particular collation strategy or if you need to * modify that strategy. *

    -* The following example shows how to compare two strings using the +* The following example shows how to compare two strings using the * Collator for the default locale. -*

    +* \htmlonly
    \endhtmlonly *
     * \code
     * // Compare two strings in the default locale
    @@ -111,57 +113,54 @@ class CollationKey;
     *   cout << "abc is greater than or equal to ABC" << endl;
     * \endcode
     * 
    -*
    +* \htmlonly
    \endhtmlonly *

    -* You can set a Collator's strength property to -* determine the level of difference considered significant in comparisons. -* Five strengths are provided: PRIMARY, SECONDARY, -* TERTIARY, QUATERNARY and IDENTICAL. The exact assignment of -* strengths to language features is locale dependant. For example, in Czech, -* "e" and "f" are considered primary differences, while "e" and "\u00EA" are -* secondary differences, "e" and "E" are tertiary differences and "e" and "e" -* are identical. The following shows how both case and accents could be -* ignored for US English. -*

    +* You can set a Collator's strength property to +* determine the level of difference considered significant in comparisons. +* Five strengths are provided: PRIMARY, SECONDARY, +* TERTIARY, QUATERNARY and IDENTICAL. +* The exact assignment of strengths to language features is locale dependant. +* For example, in Czech, "e" and "f" are considered primary differences, +* while "e" and "\u00EA" are secondary differences, "e" and "E" are tertiary +* differences and "e" and "e" are identical. The following shows how both case +* and accents could be ignored for US English. +* \htmlonly
    \endhtmlonly *
     * \code
    -* //Get the Collator for US English and set its strength to PRIMARY 
    +* //Get the Collator for US English and set its strength to PRIMARY
     * UErrorCode success = U_ZERO_ERROR;
    -* Collator* usCollator = 
    -*                            Collator::createInstance(Locale::US, success);
    +* Collator* usCollator = Collator::createInstance(Locale::US, success);
     * usCollator->setStrength(Collator::PRIMARY);
     * if (usCollator->compare("abc", "ABC") == 0)
    -*   cout << 
    -* "'abc' and 'ABC' strings are equivalent with strength PRIMARY" << 
    -* endl;
    +*     cout << "'abc' and 'ABC' strings are equivalent with strength PRIMARY" << endl;
     * \endcode
     * 
    -*
    +* \htmlonly
    \endhtmlonly *

    -* For comparing strings exactly once, the compare method -* provides the best performance. When sorting a list of strings however, it -* is generally necessary to compare each string multiple times. In this case, -* sort keys provide better performance. The getSortKey methods -* convert a string to a series of bytes that can be compared bitwise against -* other sort keys using strcmp(). Sort keys are written as -* zero-terminated byte strings. They consist of several substrings, one for +* For comparing strings exactly once, the compare method +* provides the best performance. When sorting a list of strings however, it +* is generally necessary to compare each string multiple times. In this case, +* sort keys provide better performance. The getSortKey methods +* convert a string to a series of bytes that can be compared bitwise against +* other sort keys using strcmp(). Sort keys are written as +* zero-terminated byte strings. They consist of several substrings, one for * each collation strength level, that are delimited by 0x01 bytes. -* If the string code points are appended for UCOL_IDENTICAL, then they are -* processed for correct code point order comparison and may contain 0x01 +* If the string code points are appended for UCOL_IDENTICAL, then they are +* processed for correct code point order comparison and may contain 0x01 * bytes but not zero bytes. *

    *

    -* An older set of APIs returns a CollationKey object that wraps +* An older set of APIs returns a CollationKey object that wraps * the sort key bytes instead of returning the bytes themselves. -* Its use is deprecated, but it is still available for compatibility with +* Its use is deprecated, but it is still available for compatibility with * Java. *

    *

    * Note: Collators with different Locale, -* and CollationStrength settings will return different sort -* orders for the same set of strings. Locales have specific collation rules, -* and the way in which secondary and tertiary differences are taken into -* account, for example, will result in a different sorting order for same +* and CollationStrength settings will return different sort +* orders for the same set of strings. Locales have specific collation rules, +* and the way in which secondary and tertiary differences are taken into +* account, for example, will result in a different sorting order for same * strings. *

    * @see RuleBasedCollator @@ -175,616 +174,671 @@ class CollationKey; class U_I18N_API Collator : public UObject { public: - // Collator public enums ----------------------------------------------- - - /** - * Base letter represents a primary difference. Set comparison level to - * PRIMARY to ignore secondary and tertiary differences.
    - * Use this to set the strength of a Collator object.
    - * Example of primary difference, "abc" < "abd" - * - * Diacritical differences on the same base letter represent a secondary - * difference. Set comparison level to SECONDARY to ignore tertiary - * differences. Use this to set the strength of a Collator object.
    - * Example of secondary difference, "ä" >> "a". - * - * Uppercase and lowercase versions of the same character represents a - * tertiary difference. Set comparison level to TERTIARY to include all - * comparison differences. Use this to set the strength of a Collator - * object.
    - * Example of tertiary difference, "abc" <<< "ABC". - * - * Two characters are considered "identical" when they have the same unicode - * spellings.
    - * For example, "ä" == "ä". - * - * UCollationStrength is also used to determine the strength of sort keys - * generated from Collator objects. - * @stable ICU 2.0 - */ - enum ECollationStrength - { - PRIMARY = 0, - SECONDARY = 1, - TERTIARY = 2, - QUATERNARY = 3, - IDENTICAL = 15 - }; - - /** - * LESS is returned if source string is compared to be less than target - * string in the compare() method. - * EQUAL is returned if source string is compared to be equal to target - * string in the compare() method. - * GREATER is returned if source string is compared to be greater than - * target string in the compare() method. - * @see Collator#compare - * @deprecated ICU 2.6. Use C enum UCollationResult defined in ucol.h - */ - enum EComparisonResult - { - LESS = -1, - EQUAL = 0, - GREATER = 1 - }; - - // Collator public destructor ----------------------------------------- - - /** - * Destructor - * @stable ICU 2.0 - */ - virtual ~Collator(); - - // Collator public methods -------------------------------------------- - - /** - * Returns true if "other" is the same as "this" - * @param other Collator object to be compared - * @return true if other is the same as this. - * @stable ICU 2.0 - */ - virtual UBool operator==(const Collator& other) const; - - /** - * Returns true if "other" is not the same as "this". - * @param other Collator object to be compared - * @return true if other is not the same as this. - * @stable ICU 2.0 - */ - virtual UBool operator!=(const Collator& other) const; - - /** - * Makes a shallow copy of the current object. - * @return a copy of this object - * @stable ICU 2.0 - */ - virtual Collator* clone(void) const = 0; - - /** - * Creates the Collator object for the current default locale. - * The default locale is determined by Locale::getDefault. - * The UErrorCode& err parameter is used to return status information to the user. - * To check whether the construction succeeded or not, you should check the - * value of U_SUCCESS(err). If you wish more detailed information, you can - * check for informational error results which still indicate success. - * U_USING_FALLBACK_ERROR indicates that a fall back locale was used. For - * example, 'de_CH' was requested, but nothing was found there, so 'de' was - * used. U_USING_DEFAULT_ERROR indicates that the default locale data was - * used; neither the requested locale nor any of its fall back locales - * could be found. - * The caller owns the returned object and is responsible for deleting it. - * - * @param err the error code status. - * @return the collation object of the default locale.(for example, en_US) - * @see Locale#getDefault - * @stable ICU 2.0 - */ - static Collator* createInstance(UErrorCode& err); - - /** - * Gets the table-based collation object for the desired locale. The - * resource of the desired locale will be loaded by ResourceLoader. - * Locale::ENGLISH is the base collation table and all other languages are - * built on top of it with additional language-specific modifications. - * The UErrorCode& err parameter is used to return status information to the user. - * To check whether the construction succeeded or not, you should check - * the value of U_SUCCESS(err). If you wish more detailed information, you - * can check for informational error results which still indicate success. - * U_USING_FALLBACK_ERROR indicates that a fall back locale was used. For - * example, 'de_CH' was requested, but nothing was found there, so 'de' was - * used. U_USING_DEFAULT_ERROR indicates that the default locale data was - * used; neither the requested locale nor any of its fall back locales - * could be found. - * The caller owns the returned object and is responsible for deleting it. - * @param loc The locale ID for which to open a collator. - * @param err the error code status. - * @return the created table-based collation object based on the desired - * locale. - * @see Locale - * @see ResourceLoader - * @stable ICU 2.2 - */ - static Collator* createInstance(const Locale& loc, UErrorCode& err); - - /** - * Create a Collator with a specific version. - * This is the same as createInstance(loc, err) except that getVersion() of - * the returned object is guaranteed to be the same as the version - * parameter. - * This is designed to be used to open the same collator for a given - * locale even when ICU is updated. - * The same locale and version guarantees the same sort keys and - * comparison results. - *

    - * Note: this API will be removed in a future release. Use - * createInstance(const Locale&, UErrorCode&) instead.

    - * - * @param loc The locale ID for which to open a collator. - * @param version The requested collator version. - * @param err A reference to a UErrorCode, - * must not indicate a failure before calling this function. - * @return A pointer to a Collator, or 0 if an error occurred - * or a collator with the requested version is not available. - * - * @see getVersion - * @obsolete ICU 2.6 - */ - static Collator *createInstance(const Locale &loc, UVersionInfo version, UErrorCode &err); - - /** - * The comparison function compares the character data stored in two - * different strings. Returns information about whether a string is less - * than, greater than or equal to another string. - * @param source the source string to be compared with. - * @param target the string that is to be compared with the source string. - * @return Returns a byte value. GREATER if source is greater - * than target; EQUAL if source is equal to target; LESS if source is less - * than target - * @deprecated ICU 2.6 use the overload with UErrorCode & - **/ - virtual EComparisonResult compare(const UnicodeString& source, - const UnicodeString& target) const; - - /** - * The comparison function compares the character data stored in two - * different strings. Returns information about whether a string is less - * than, greater than or equal to another string. - * @param source the source string to be compared with. - * @param target the string that is to be compared with the source string. - * @param status possible error code - * @return Returns an enum value. UCOL_GREATER if source is greater - * than target; UCOL_EQUAL if source is equal to target; UCOL_LESS if source is less - * than target - * @draft ICU 2.6 - **/ - virtual UCollationResult compare(const UnicodeString& source, - const UnicodeString& target, - UErrorCode &status) const = 0; - - /** - * Does the same thing as compare but limits the comparison to a specified - * length - * @param source the source string to be compared with. - * @param target the string that is to be compared with the source string. - * @param length the length the comparison is limited to - * @return Returns a byte value. GREATER if source (up to the specified - * length) is greater than target; EQUAL if source (up to specified - * length) is equal to target; LESS if source (up to the specified - * length) is less than target. - * @deprecated ICU 2.6 use the overload with UErrorCode & - */ - virtual EComparisonResult compare(const UnicodeString& source, - const UnicodeString& target, - int32_t length) const; - - /** - * Does the same thing as compare but limits the comparison to a specified - * length - * @param source the source string to be compared with. - * @param target the string that is to be compared with the source string. - * @param length the length the comparison is limited to - * @param status possible error code - * @return Returns an enum value. UCOL_GREATER if source (up to the specified - * length) is greater than target; UCOL_EQUAL if source (up to specified - * length) is equal to target; UCOL_LESS if source (up to the specified - * length) is less than target. - * @draft ICU 2.6 - */ - virtual UCollationResult compare(const UnicodeString& source, - const UnicodeString& target, - int32_t length, - UErrorCode &status) const = 0; - - /** - * The comparison function compares the character data stored in two - * different string arrays. Returns information about whether a string array - * is less than, greater than or equal to another string array. - * @param source the source string array to be compared with. - * @param sourceLength the length of the source string array. If this value - * is equal to -1, the string array is null-terminated. - * @param target the string that is to be compared with the source string. - * @param targetLength the length of the target string array. If this value - * is equal to -1, the string array is null-terminated. - * @return Returns a byte value. GREATER if source is greater than target; - * EQUAL if source is equal to target; LESS if source is less than - * target - * @deprecated ICU 2.6 use the overload with UErrorCode & - */ - virtual EComparisonResult compare(const UChar* source, int32_t sourceLength, - const UChar* target, int32_t targetLength) - const; - - /** - * The comparison function compares the character data stored in two - * different string arrays. Returns information about whether a string array - * is less than, greater than or equal to another string array. - * @param source the source string array to be compared with. - * @param sourceLength the length of the source string array. If this value - * is equal to -1, the string array is null-terminated. - * @param target the string that is to be compared with the source string. - * @param targetLength the length of the target string array. If this value - * is equal to -1, the string array is null-terminated. - * @param status possible error code - * @return Returns an enum value. UCOL_GREATER if source is greater - * than target; UCOL_EQUAL if source is equal to target; UCOL_LESS if source is less - * than target - * @draft ICU 2.6 - */ - virtual UCollationResult compare(const UChar* source, int32_t sourceLength, - const UChar* target, int32_t targetLength, - UErrorCode &status) const = 0; - /** - * Transforms the string into a series of characters that can be compared - * with CollationKey::compareTo. It is not possible to restore the original - * string from the chars in the sort key. The generated sort key handles - * only a limited number of ignorable characters. - *

    Use CollationKey::equals or CollationKey::compare to compare the - * generated sort keys. - * If the source string is null, a null collation key will be returned. - * @param source the source string to be transformed into a sort key. - * @param key the collation key to be filled in - * @param status the error code status. - * @return the collation key of the string based on the collation rules. - * @see CollationKey#compare - * @stable ICU 2.0 - */ - virtual CollationKey& getCollationKey(const UnicodeString& source, - CollationKey& key, - UErrorCode& status) const = 0; - - /** - * Transforms the string into a series of characters that can be compared - * with CollationKey::compareTo. It is not possible to restore the original - * string from the chars in the sort key. The generated sort key handles - * only a limited number of ignorable characters. - *

    Use CollationKey::equals or CollationKey::compare to compare the - * generated sort keys. - *

    If the source string is null, a null collation key will be returned. - * @param source the source string to be transformed into a sort key. - * @param sourceLength length of the collation key - * @param key the collation key to be filled in - * @param status the error code status. - * @return the collation key of the string based on the collation rules. - * @see CollationKey#compare - * @stable ICU 2.0 - */ - virtual CollationKey& getCollationKey(const UChar*source, - int32_t sourceLength, - CollationKey& key, - UErrorCode& status) const = 0; - /** - * Generates the hash code for the collation object - * @stable ICU 2.0 - */ - virtual int32_t hashCode(void) const = 0; - - /** - * Gets the locale of the Collator - * - * @param type can be either requested, valid or actual locale. For more - * information see the definition of ULocDataLocaleType in - * uloc.h - * @param status the error code status. - * @return locale where the collation data lives. If the collator - * was instantiated from rules, locale is empty. - * @stable ICU 2.1 - */ - virtual const Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const = 0; - - /** - * Convenience method for comparing two strings based on the collation rules. - * @param source the source string to be compared with. - * @param target the target string to be compared with. - * @return true if the first string is greater than the second one, - * according to the collation rules. false, otherwise. - * @see Collator#compare - * @stable ICU 2.0 - */ - UBool greater(const UnicodeString& source, const UnicodeString& target) - const; - - /** - * Convenience method for comparing two strings based on the collation rules. - * @param source the source string to be compared with. - * @param target the target string to be compared with. - * @return true if the first string is greater than or equal to the second - * one, according to the collation rules. false, otherwise. - * @see Collator#compare - * @stable ICU 2.0 - */ - UBool greaterOrEqual(const UnicodeString& source, - const UnicodeString& target) const; - /** - * Convenience method for comparing two strings based on the collation rules. - * @param source the source string to be compared with. - * @param target the target string to be compared with. - * @return true if the strings are equal according to the collation rules. - * false, otherwise. - * @see Collator#compare - * @stable ICU 2.0 - */ - UBool equals(const UnicodeString& source, const UnicodeString& target) const; - - /** - * Determines the minimum strength that will be use in comparison or - * transformation. - *

    E.g. with strength == SECONDARY, the tertiary difference is ignored - *

    E.g. with strength == PRIMARY, the secondary and tertiary difference - * are ignored. - * @return the current comparison level. - * @see Collator#setStrength - * @deprecated ICU 2.6 Use getAttribute(UCOL_STRENGTH...) instead - */ - virtual ECollationStrength getStrength(void) const = 0; - - /** - * Sets the minimum strength to be used in comparison or transformation. - *

    Example of use: - *

    -  *  \code
    -  *  UErrorCode status = U_ZERO_ERROR;
    -  *  Collator*myCollation = Collator::createInstance(Locale::US, 
    -  *                                                         status);
    -  *  if (U_FAILURE(status)) return;
    -  *  myCollation->setStrength(Collator::PRIMARY);
    -  *  // result will be "abc" == "ABC"
    -  *  // tertiary differences will be ignored
    -  *  Collator::ComparisonResult result = myCollation->compare("abc", 
    -  *                                                              "ABC");
    -  * \endcode 
    -  * 
    - * @see Collator#getStrength - * @param newStrength the new comparison level. - * @deprecated ICU 2.6 Use setAttribute(UCOL_STRENGTH...) instead - */ - virtual void setStrength(ECollationStrength newStrength) = 0; - - /** - * Get name of the object for the desired Locale, in the desired langauge - * @param objectLocale must be from getAvailableLocales - * @param displayLocale specifies the desired locale for output - * @param name the fill-in parameter of the return value - * @return display-able name of the object for the object locale in the - * desired language - * @stable ICU 2.0 - */ - static UnicodeString& getDisplayName(const Locale& objectLocale, - const Locale& displayLocale, - UnicodeString& name); - /** - * Get name of the object for the desired Locale, in the langauge of the - * default locale. - * @param objectLocale must be from getAvailableLocales - * @param name the fill-in parameter of the return value - * @return name of the object for the desired locale in the default language - * @stable ICU 2.0 - */ - static UnicodeString& getDisplayName(const Locale& objectLocale, - UnicodeString& name); - - /** - * Get the set of Locales for which Collations are installed. - * - *

    Note this does not include locales supported by registered collators. - * If collators might have been registered, use the overload of getAvailableLocales - * that returns a StringEnumeration.

    - * - * @param count the output parameter of number of elements in the locale list - * @return the list of available locales for which collations are installed - * @stable ICU 2.0 - */ - static const Locale* getAvailableLocales(int32_t& count); - - /** - * Return a StringEnumeration over the locales available at the time of the call, - * including registered locales. If a severe error occurs (such as out of memory - * condition) this will return null. If there is no locale data, an empty enumeration - * will be returned. - * @return a StringEnumeration over the locales available at the time of the call - * @draft ICU 2.6 - */ - static StringEnumeration* getAvailableLocales(void); - - /** - * Register a new Collator. The collator will be adopted. - * @param toAdopt the Collator instance to be adopted - * @param locale the locale with which the collator will be associated - * @param status the in/out status code, no special meanings are assigned - * @return a registry key that can be used to unregister this collator - * @draft ICU 2.6 - */ - static URegistryKey registerInstance(Collator* toAdopt, const Locale& locale, UErrorCode& status); - - /** - * Register a new CollatorFactory. The factory will be adopted. - * @param toAdopt the CollatorFactory instance to be adopted - * @param status the in/out status code, no special meanings are assigned - * @return a registry key that can be used to unregister this collator - * @draft ICU 2.6 - */ - static URegistryKey registerFactory(CollatorFactory* toAdopt, UErrorCode& status); - - /** - * Unregister a previously-registered Collator or CollatorFactory - * using the key returned from the register call. Key becomes - * invalid after a successful call and should not be used again. - * The object corresponding to the key will be deleted. - * @param key the registry key returned by a previous call to registerInstance - * @param status the in/out status code, no special meanings are assigned - * @return TRUE if the collator for the key was successfully unregistered - * @draft ICU 2.6 - */ - static UBool unregister(URegistryKey key, UErrorCode& status); - - /** - * Gets the version information for a Collator. - * @param info the version # information, the result will be filled in - * @stable ICU 2.0 - */ - virtual void getVersion(UVersionInfo info) const = 0; - - /** - * Returns a unique class ID POLYMORPHICALLY. Pure virtual method. - * This method is to implement a simple version of RTTI, since not all C++ - * compilers support genuine RTTI. Polymorphic operator==() and clone() - * methods call this method. - * Concrete subclasses of Format must implement getDynamicClassID() and also - * a static method and data member: - * static UClassID getStaticClassID() - * { - * return (UClassID)&fgClassID; - * } - * static char fgClassID; - * @return The class ID for this object. All objects of a given class have - * the same class ID. Objects of other classes have different class - * IDs. - * @stable ICU 2.0 - */ - virtual UClassID getDynamicClassID(void) const = 0; - - /** - * Universal attribute setter - * @param attr attribute type - * @param value attribute value - * @param status to indicate whether the operation went on smoothly or - * there were errors - * @stable ICU 2.2 - */ - virtual void setAttribute(UColAttribute attr, UColAttributeValue value, - UErrorCode &status) = 0; - - /** - * Universal attribute getter - * @param attr attribute type - * @param status to indicate whether the operation went on smoothly or - * there were errors - * @return attribute value - * @stable ICU 2.2 - */ - virtual UColAttributeValue getAttribute(UColAttribute attr, - UErrorCode &status) = 0; - - /** - * Sets the variable top to a collation element value of a string supplied. - * @param varTop one or more (if contraction) UChars to which the variable top should be set - * @param len length of variable top string. If -1 it is considered to be zero terminated. - * @param status error code. If error code is set, the return value is undefined. Errors set by this function are:
    - * U_CE_NOT_FOUND_ERROR if more than one character was passed and there is no such a contraction
    - * U_PRIMARY_TOO_LONG_ERROR if the primary for the variable top has more than two bytes - * @return a 32 bit value containing the value of the variable top in upper 16 bits. Lower 16 bits are undefined - * @stable ICU 2.0 - */ - virtual uint32_t setVariableTop(const UChar *varTop, int32_t len, UErrorCode &status) = 0; - - /** - * Sets the variable top to a collation element value of a string supplied. - * @param varTop an UnicodeString size 1 or more (if contraction) of UChars to which the variable top should be set - * @param status error code. If error code is set, the return value is undefined. Errors set by this function are:
    - * U_CE_NOT_FOUND_ERROR if more than one character was passed and there is no such a contraction
    - * U_PRIMARY_TOO_LONG_ERROR if the primary for the variable top has more than two bytes - * @return a 32 bit value containing the value of the variable top in upper 16 bits. Lower 16 bits are undefined - * @stable ICU 2.0 - */ - virtual uint32_t setVariableTop(const UnicodeString varTop, UErrorCode &status) = 0; - - /** - * Sets the variable top to a collation element value supplied. Variable top is set to the upper 16 bits. - * Lower 16 bits are ignored. - * @param varTop CE value, as returned by setVariableTop or ucol)getVariableTop - * @param status error code (not changed by function) - * @stable ICU 2.0 - */ - virtual void setVariableTop(const uint32_t varTop, UErrorCode &status) = 0; - - /** - * Gets the variable top value of a Collator. - * Lower 16 bits are undefined and should be ignored. - * @param status error code (not changed by function). If error code is set, the return value is undefined. - * @stable ICU 2.0 - */ - virtual uint32_t getVariableTop(UErrorCode &status) const = 0; - - /** - * Get an UnicodeSet that contains all the characters and sequences - * tailored in this collator. - * @param status error code of the operation - * @return a pointer to a UnicodeSet object containing all the - * code points and sequences that may sort differently than - * in the UCA. The object must be disposed of by using delete - * @draft ICU 2.4 - */ - virtual UnicodeSet *getTailoredSet(UErrorCode &status) const; - - - /** - * Thread safe cloning operation - * @return pointer to the new clone, user should remove it. - * @stable ICU 2.2 - */ - virtual Collator* safeClone(void) = 0; - - /** - * Get the sort key as an array of bytes from an UnicodeString. - * Sort key byte arrays are zero-terminated and can be compared using - * strcmp(). - * @param source string to be processed. - * @param result buffer to store result in. If NULL, number of bytes needed - * will be returned. - * @param resultLength length of the result buffer. If if not enough the - * buffer will be filled to capacity. - * @return Number of bytes needed for storing the sort key - * @stable ICU 2.2 - */ - virtual int32_t getSortKey(const UnicodeString& source, - uint8_t* result, - int32_t resultLength) const = 0; - - /** - * Get the sort key as an array of bytes from an UChar buffer. - * Sort key byte arrays are zero-terminated and can be compared using - * strcmp(). - * @param source string to be processed. - * @param sourceLength length of string to be processed. - * If -1, the string is 0 terminated and length will be decided by the - * function. - * @param result buffer to store result in. If NULL, number of bytes needed - * will be returned. - * @param resultLength length of the result buffer. If if not enough the - * buffer will be filled to capacity. - * @return Number of bytes needed for storing the sort key - * @stable ICU 2.2 - */ - virtual int32_t getSortKey(const UChar*source, int32_t sourceLength, - uint8_t*result, int32_t resultLength) const = 0; + // Collator public enums ----------------------------------------------- + + /** + * Base letter represents a primary difference. Set comparison level to + * PRIMARY to ignore secondary and tertiary differences.
    + * Use this to set the strength of a Collator object.
    + * Example of primary difference, "abc" < "abd" + * + * Diacritical differences on the same base letter represent a secondary + * difference. Set comparison level to SECONDARY to ignore tertiary + * differences. Use this to set the strength of a Collator object.
    + * Example of secondary difference, "ä" >> "a". + * + * Uppercase and lowercase versions of the same character represents a + * tertiary difference. Set comparison level to TERTIARY to include all + * comparison differences. Use this to set the strength of a Collator + * object.
    + * Example of tertiary difference, "abc" <<< "ABC". + * + * Two characters are considered "identical" when they have the same unicode + * spellings.
    + * For example, "ä" == "ä". + * + * UCollationStrength is also used to determine the strength of sort keys + * generated from Collator objects. + * @stable ICU 2.0 + */ + enum ECollationStrength + { + PRIMARY = 0, + SECONDARY = 1, + TERTIARY = 2, + QUATERNARY = 3, + IDENTICAL = 15 + }; + + /** + * LESS is returned if source string is compared to be less than target + * string in the compare() method. + * EQUAL is returned if source string is compared to be equal to target + * string in the compare() method. + * GREATER is returned if source string is compared to be greater than + * target string in the compare() method. + * @see Collator#compare + * @deprecated ICU 2.6. Use C enum UCollationResult defined in ucol.h + */ + enum EComparisonResult + { + LESS = -1, + EQUAL = 0, + GREATER = 1 + }; + + // Collator public destructor ----------------------------------------- + + /** + * Destructor + * @stable ICU 2.0 + */ + virtual ~Collator(); + + // Collator public methods -------------------------------------------- + + /** + * Returns true if "other" is the same as "this" + * @param other Collator object to be compared + * @return true if other is the same as this. + * @stable ICU 2.0 + */ + virtual UBool operator==(const Collator& other) const; + + /** + * Returns true if "other" is not the same as "this". + * @param other Collator object to be compared + * @return true if other is not the same as this. + * @stable ICU 2.0 + */ + virtual UBool operator!=(const Collator& other) const; + + /** + * Makes a shallow copy of the current object. + * @return a copy of this object + * @stable ICU 2.0 + */ + virtual Collator* clone(void) const = 0; + + /** + * Creates the Collator object for the current default locale. + * The default locale is determined by Locale::getDefault. + * The UErrorCode& err parameter is used to return status information to the user. + * To check whether the construction succeeded or not, you should check the + * value of U_SUCCESS(err). If you wish more detailed information, you can + * check for informational error results which still indicate success. + * U_USING_FALLBACK_ERROR indicates that a fall back locale was used. For + * example, 'de_CH' was requested, but nothing was found there, so 'de' was + * used. U_USING_DEFAULT_ERROR indicates that the default locale data was + * used; neither the requested locale nor any of its fall back locales + * could be found. + * The caller owns the returned object and is responsible for deleting it. + * + * @param err the error code status. + * @return the collation object of the default locale.(for example, en_US) + * @see Locale#getDefault + * @stable ICU 2.0 + */ + static Collator* U_EXPORT2 createInstance(UErrorCode& err); + + /** + * Gets the table-based collation object for the desired locale. The + * resource of the desired locale will be loaded by ResourceLoader. + * Locale::ENGLISH is the base collation table and all other languages are + * built on top of it with additional language-specific modifications. + * The UErrorCode& err parameter is used to return status information to the user. + * To check whether the construction succeeded or not, you should check + * the value of U_SUCCESS(err). If you wish more detailed information, you + * can check for informational error results which still indicate success. + * U_USING_FALLBACK_ERROR indicates that a fall back locale was used. For + * example, 'de_CH' was requested, but nothing was found there, so 'de' was + * used. U_USING_DEFAULT_ERROR indicates that the default locale data was + * used; neither the requested locale nor any of its fall back locales + * could be found. + * The caller owns the returned object and is responsible for deleting it. + * @param loc The locale ID for which to open a collator. + * @param err the error code status. + * @return the created table-based collation object based on the desired + * locale. + * @see Locale + * @see ResourceLoader + * @stable ICU 2.2 + */ + static Collator* U_EXPORT2 createInstance(const Locale& loc, UErrorCode& err); + +#ifdef U_USE_COLLATION_OBSOLETE_2_6 + /** + * Create a Collator with a specific version. + * This is the same as createInstance(loc, err) except that getVersion() of + * the returned object is guaranteed to be the same as the version + * parameter. + * This is designed to be used to open the same collator for a given + * locale even when ICU is updated. + * The same locale and version guarantees the same sort keys and + * comparison results. + *

    + * Note: this API will be removed in a future release. Use + * createInstance(const Locale&, UErrorCode&) instead.

    + * + * @param loc The locale ID for which to open a collator. + * @param version The requested collator version. + * @param err A reference to a UErrorCode, + * must not indicate a failure before calling this function. + * @return A pointer to a Collator, or 0 if an error occurred + * or a collator with the requested version is not available. + * + * @see getVersion + * @obsolete ICU 2.6 + */ + static Collator *createInstance(const Locale &loc, UVersionInfo version, UErrorCode &err); +#endif + + /** + * The comparison function compares the character data stored in two + * different strings. Returns information about whether a string is less + * than, greater than or equal to another string. + * @param source the source string to be compared with. + * @param target the string that is to be compared with the source string. + * @return Returns a byte value. GREATER if source is greater + * than target; EQUAL if source is equal to target; LESS if source is less + * than target + * @deprecated ICU 2.6 use the overload with UErrorCode & + */ + virtual EComparisonResult compare(const UnicodeString& source, + const UnicodeString& target) const; + + /** + * The comparison function compares the character data stored in two + * different strings. Returns information about whether a string is less + * than, greater than or equal to another string. + * @param source the source string to be compared with. + * @param target the string that is to be compared with the source string. + * @param status possible error code + * @return Returns an enum value. UCOL_GREATER if source is greater + * than target; UCOL_EQUAL if source is equal to target; UCOL_LESS if source is less + * than target + * @stable ICU 2.6 + */ + virtual UCollationResult compare(const UnicodeString& source, + const UnicodeString& target, + UErrorCode &status) const = 0; + + /** + * Does the same thing as compare but limits the comparison to a specified + * length + * @param source the source string to be compared with. + * @param target the string that is to be compared with the source string. + * @param length the length the comparison is limited to + * @return Returns a byte value. GREATER if source (up to the specified + * length) is greater than target; EQUAL if source (up to specified + * length) is equal to target; LESS if source (up to the specified + * length) is less than target. + * @deprecated ICU 2.6 use the overload with UErrorCode & + */ + virtual EComparisonResult compare(const UnicodeString& source, + const UnicodeString& target, + int32_t length) const; + + /** + * Does the same thing as compare but limits the comparison to a specified + * length + * @param source the source string to be compared with. + * @param target the string that is to be compared with the source string. + * @param length the length the comparison is limited to + * @param status possible error code + * @return Returns an enum value. UCOL_GREATER if source (up to the specified + * length) is greater than target; UCOL_EQUAL if source (up to specified + * length) is equal to target; UCOL_LESS if source (up to the specified + * length) is less than target. + * @stable ICU 2.6 + */ + virtual UCollationResult compare(const UnicodeString& source, + const UnicodeString& target, + int32_t length, + UErrorCode &status) const = 0; + + /** + * The comparison function compares the character data stored in two + * different string arrays. Returns information about whether a string array + * is less than, greater than or equal to another string array. + * @param source the source string array to be compared with. + * @param sourceLength the length of the source string array. If this value + * is equal to -1, the string array is null-terminated. + * @param target the string that is to be compared with the source string. + * @param targetLength the length of the target string array. If this value + * is equal to -1, the string array is null-terminated. + * @return Returns a byte value. GREATER if source is greater than target; + * EQUAL if source is equal to target; LESS if source is less than + * target + * @deprecated ICU 2.6 use the overload with UErrorCode & + */ + virtual EComparisonResult compare(const UChar* source, int32_t sourceLength, + const UChar* target, int32_t targetLength) + const; + + /** + * The comparison function compares the character data stored in two + * different string arrays. Returns information about whether a string array + * is less than, greater than or equal to another string array. + * @param source the source string array to be compared with. + * @param sourceLength the length of the source string array. If this value + * is equal to -1, the string array is null-terminated. + * @param target the string that is to be compared with the source string. + * @param targetLength the length of the target string array. If this value + * is equal to -1, the string array is null-terminated. + * @param status possible error code + * @return Returns an enum value. UCOL_GREATER if source is greater + * than target; UCOL_EQUAL if source is equal to target; UCOL_LESS if source is less + * than target + * @stable ICU 2.6 + */ + virtual UCollationResult compare(const UChar* source, int32_t sourceLength, + const UChar* target, int32_t targetLength, + UErrorCode &status) const = 0; + + /** + * Transforms the string into a series of characters that can be compared + * with CollationKey::compareTo. It is not possible to restore the original + * string from the chars in the sort key. The generated sort key handles + * only a limited number of ignorable characters. + *

    Use CollationKey::equals or CollationKey::compare to compare the + * generated sort keys. + * If the source string is null, a null collation key will be returned. + * @param source the source string to be transformed into a sort key. + * @param key the collation key to be filled in + * @param status the error code status. + * @return the collation key of the string based on the collation rules. + * @see CollationKey#compare + * @deprecated ICU 2.8 Use getSortKey(...) instead + */ + virtual CollationKey& getCollationKey(const UnicodeString& source, + CollationKey& key, + UErrorCode& status) const = 0; + + /** + * Transforms the string into a series of characters that can be compared + * with CollationKey::compareTo. It is not possible to restore the original + * string from the chars in the sort key. The generated sort key handles + * only a limited number of ignorable characters. + *

    Use CollationKey::equals or CollationKey::compare to compare the + * generated sort keys. + *

    If the source string is null, a null collation key will be returned. + * @param source the source string to be transformed into a sort key. + * @param sourceLength length of the collation key + * @param key the collation key to be filled in + * @param status the error code status. + * @return the collation key of the string based on the collation rules. + * @see CollationKey#compare + * @deprecated ICU 2.8 Use getSortKey(...) instead + */ + virtual CollationKey& getCollationKey(const UChar*source, + int32_t sourceLength, + CollationKey& key, + UErrorCode& status) const = 0; + /** + * Generates the hash code for the collation object + * @stable ICU 2.0 + */ + virtual int32_t hashCode(void) const = 0; + + /** + * Gets the locale of the Collator + * + * @param type can be either requested, valid or actual locale. For more + * information see the definition of ULocDataLocaleType in + * uloc.h + * @param status the error code status. + * @return locale where the collation data lives. If the collator + * was instantiated from rules, locale is empty. + * @deprecated ICU 2.8 This API is under consideration for revision + * in ICU 3.0. + */ + virtual const Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const = 0; + + /** + * Convenience method for comparing two strings based on the collation rules. + * @param source the source string to be compared with. + * @param target the target string to be compared with. + * @return true if the first string is greater than the second one, + * according to the collation rules. false, otherwise. + * @see Collator#compare + * @stable ICU 2.0 + */ + UBool greater(const UnicodeString& source, const UnicodeString& target) + const; + + /** + * Convenience method for comparing two strings based on the collation rules. + * @param source the source string to be compared with. + * @param target the target string to be compared with. + * @return true if the first string is greater than or equal to the second + * one, according to the collation rules. false, otherwise. + * @see Collator#compare + * @stable ICU 2.0 + */ + UBool greaterOrEqual(const UnicodeString& source, + const UnicodeString& target) const; + + /** + * Convenience method for comparing two strings based on the collation rules. + * @param source the source string to be compared with. + * @param target the target string to be compared with. + * @return true if the strings are equal according to the collation rules. + * false, otherwise. + * @see Collator#compare + * @stable ICU 2.0 + */ + UBool equals(const UnicodeString& source, const UnicodeString& target) const; + + /** + * Determines the minimum strength that will be use in comparison or + * transformation. + *

    E.g. with strength == SECONDARY, the tertiary difference is ignored + *

    E.g. with strength == PRIMARY, the secondary and tertiary difference + * are ignored. + * @return the current comparison level. + * @see Collator#setStrength + * @deprecated ICU 2.6 Use getAttribute(UCOL_STRENGTH...) instead + */ + virtual ECollationStrength getStrength(void) const = 0; + + /** + * Sets the minimum strength to be used in comparison or transformation. + *

    Example of use: + *

    +     *  \code
    +     *  UErrorCode status = U_ZERO_ERROR;
    +     *  Collator*myCollation = Collator::createInstance(Locale::US, status);
    +     *  if (U_FAILURE(status)) return;
    +     *  myCollation->setStrength(Collator::PRIMARY);
    +     *  // result will be "abc" == "ABC"
    +     *  // tertiary differences will be ignored
    +     *  Collator::ComparisonResult result = myCollation->compare("abc", "ABC");
    +     * \endcode
    +     * 
    + * @see Collator#getStrength + * @param newStrength the new comparison level. + * @deprecated ICU 2.6 Use setAttribute(UCOL_STRENGTH...) instead + */ + virtual void setStrength(ECollationStrength newStrength) = 0; + + /** + * Get name of the object for the desired Locale, in the desired langauge + * @param objectLocale must be from getAvailableLocales + * @param displayLocale specifies the desired locale for output + * @param name the fill-in parameter of the return value + * @return display-able name of the object for the object locale in the + * desired language + * @stable ICU 2.0 + */ + static UnicodeString& U_EXPORT2 getDisplayName(const Locale& objectLocale, + const Locale& displayLocale, + UnicodeString& name); + + /** + * Get name of the object for the desired Locale, in the langauge of the + * default locale. + * @param objectLocale must be from getAvailableLocales + * @param name the fill-in parameter of the return value + * @return name of the object for the desired locale in the default language + * @stable ICU 2.0 + */ + static UnicodeString& U_EXPORT2 getDisplayName(const Locale& objectLocale, + UnicodeString& name); + + /** + * Get the set of Locales for which Collations are installed. + * + *

    Note this does not include locales supported by registered collators. + * If collators might have been registered, use the overload of getAvailableLocales + * that returns a StringEnumeration.

    + * + * @param count the output parameter of number of elements in the locale list + * @return the list of available locales for which collations are installed + * @stable ICU 2.0 + */ + static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count); + +#if !UCONFIG_NO_SERVICE + /** + * Return a StringEnumeration over the locales available at the time of the call, + * including registered locales. If a severe error occurs (such as out of memory + * condition) this will return null. If there is no locale data, an empty enumeration + * will be returned. + * @return a StringEnumeration over the locales available at the time of the call + * @stable ICU 2.6 + */ + static StringEnumeration* U_EXPORT2 getAvailableLocales(void); +#endif + + /** + * Create a string enumerator of all possible keywords that are relevant to + * collation. At this point, the only recognized keyword for this + * service is "collation". + * @param status input-output error code + * @return a string enumeration over locale strings. The caller is + * responsible for closing the result. + * @draft ICU 3.0 + */ + static StringEnumeration* U_EXPORT2 getKeywords(UErrorCode& status); + + /** + * Given a keyword, create a string enumeration of all values + * for that keyword that are currently in use. + * @param keyword a particular keyword as enumerated by + * ucol_getKeywords. If any other keyword is passed in, status is set + * to U_ILLEGAL_ARGUMENT_ERROR. + * @param status input-output error code + * @return a string enumeration over collation keyword values, or NULL + * upon error. The caller is responsible for deleting the result. + * @draft ICU 3.0 + */ + static StringEnumeration* U_EXPORT2 getKeywordValues(const char *keyword, UErrorCode& status); + + /** + * Return the functionally equivalent locale for the given + * requested locale, with respect to given keyword, for the + * collation service. If two locales return the same result, then + * collators instantiated for these locales will behave + * equivalently. The converse is not always true; two collators + * may in fact be equivalent, but return different results, due to + * internal details. The return result has no other meaning than + * that stated above, and implies nothing as to the relationship + * between the two locales. This is intended for use by + * applications who wish to cache collators, or otherwise reuse + * collators when possible. The functional equivalent may change + * over time. For more information, please see the + * Locales and Services section of the ICU User Guide. + * @param keyword a particular keyword as enumerated by + * ucol_getKeywords. + * @param locale the requested locale + * @param isAvailable reference to a fillin parameter that + * indicates whether the requested locale was 'available' to the + * collation service. A locale is defined as 'available' if it + * physically exists within the collation locale data. + * @param status reference to input-output error code + * @return the functionally equivalent collation locale, or the root + * locale upon error. + * @draft ICU 3.0 + */ + static Locale U_EXPORT2 getFunctionalEquivalent(const char* keyword, const Locale& locale, + UBool& isAvailable, UErrorCode& status); + +#if !UCONFIG_NO_SERVICE + /** + * Register a new Collator. The collator will be adopted. + * @param toAdopt the Collator instance to be adopted + * @param locale the locale with which the collator will be associated + * @param status the in/out status code, no special meanings are assigned + * @return a registry key that can be used to unregister this collator + * @stable ICU 2.6 + */ + static URegistryKey U_EXPORT2 registerInstance(Collator* toAdopt, const Locale& locale, UErrorCode& status); + + /** + * Register a new CollatorFactory. The factory will be adopted. + * @param toAdopt the CollatorFactory instance to be adopted + * @param status the in/out status code, no special meanings are assigned + * @return a registry key that can be used to unregister this collator + * @stable ICU 2.6 + */ + static URegistryKey U_EXPORT2 registerFactory(CollatorFactory* toAdopt, UErrorCode& status); + + /** + * Unregister a previously-registered Collator or CollatorFactory + * using the key returned from the register call. Key becomes + * invalid after a successful call and should not be used again. + * The object corresponding to the key will be deleted. + * @param key the registry key returned by a previous call to registerInstance + * @param status the in/out status code, no special meanings are assigned + * @return TRUE if the collator for the key was successfully unregistered + * @stable ICU 2.6 + */ + static UBool U_EXPORT2 unregister(URegistryKey key, UErrorCode& status); +#endif /* UCONFIG_NO_SERVICE */ + + /** + * Gets the version information for a Collator. + * @param info the version # information, the result will be filled in + * @stable ICU 2.0 + */ + virtual void getVersion(UVersionInfo info) const = 0; + + /** + * Returns a unique class ID POLYMORPHICALLY. Pure virtual method. + * This method is to implement a simple version of RTTI, since not all C++ + * compilers support genuine RTTI. Polymorphic operator==() and clone() + * methods call this method. + * @return The class ID for this object. All objects of a given class have + * the same class ID. Objects of other classes have different class + * IDs. + * @stable ICU 2.0 + */ + virtual UClassID getDynamicClassID(void) const = 0; + + /** + * Universal attribute setter + * @param attr attribute type + * @param value attribute value + * @param status to indicate whether the operation went on smoothly or + * there were errors + * @stable ICU 2.2 + */ + virtual void setAttribute(UColAttribute attr, UColAttributeValue value, + UErrorCode &status) = 0; + + /** + * Universal attribute getter + * @param attr attribute type + * @param status to indicate whether the operation went on smoothly or + * there were errors + * @return attribute value + * @stable ICU 2.2 + */ + virtual UColAttributeValue getAttribute(UColAttribute attr, + UErrorCode &status) = 0; + + /** + * Sets the variable top to a collation element value of a string supplied. + * @param varTop one or more (if contraction) UChars to which the variable top should be set + * @param len length of variable top string. If -1 it is considered to be zero terminated. + * @param status error code. If error code is set, the return value is undefined. Errors set by this function are:
    + * U_CE_NOT_FOUND_ERROR if more than one character was passed and there is no such a contraction
    + * U_PRIMARY_TOO_LONG_ERROR if the primary for the variable top has more than two bytes + * @return a 32 bit value containing the value of the variable top in upper 16 bits. Lower 16 bits are undefined + * @stable ICU 2.0 + */ + virtual uint32_t setVariableTop(const UChar *varTop, int32_t len, UErrorCode &status) = 0; + + /** + * Sets the variable top to a collation element value of a string supplied. + * @param varTop an UnicodeString size 1 or more (if contraction) of UChars to which the variable top should be set + * @param status error code. If error code is set, the return value is undefined. Errors set by this function are:
    + * U_CE_NOT_FOUND_ERROR if more than one character was passed and there is no such a contraction
    + * U_PRIMARY_TOO_LONG_ERROR if the primary for the variable top has more than two bytes + * @return a 32 bit value containing the value of the variable top in upper 16 bits. Lower 16 bits are undefined + * @stable ICU 2.0 + */ + virtual uint32_t setVariableTop(const UnicodeString varTop, UErrorCode &status) = 0; + + /** + * Sets the variable top to a collation element value supplied. Variable top is set to the upper 16 bits. + * Lower 16 bits are ignored. + * @param varTop CE value, as returned by setVariableTop or ucol)getVariableTop + * @param status error code (not changed by function) + * @stable ICU 2.0 + */ + virtual void setVariableTop(const uint32_t varTop, UErrorCode &status) = 0; + + /** + * Gets the variable top value of a Collator. + * Lower 16 bits are undefined and should be ignored. + * @param status error code (not changed by function). If error code is set, the return value is undefined. + * @stable ICU 2.0 + */ + virtual uint32_t getVariableTop(UErrorCode &status) const = 0; + + /** + * Get an UnicodeSet that contains all the characters and sequences + * tailored in this collator. + * @param status error code of the operation + * @return a pointer to a UnicodeSet object containing all the + * code points and sequences that may sort differently than + * in the UCA. The object must be disposed of by using delete + * @stable ICU 2.4 + */ + virtual UnicodeSet *getTailoredSet(UErrorCode &status) const; + + + /** + * Thread safe cloning operation + * @return pointer to the new clone, user should remove it. + * @stable ICU 2.2 + */ + virtual Collator* safeClone(void) = 0; + + /** + * Get the sort key as an array of bytes from an UnicodeString. + * Sort key byte arrays are zero-terminated and can be compared using + * strcmp(). + * @param source string to be processed. + * @param result buffer to store result in. If NULL, number of bytes needed + * will be returned. + * @param resultLength length of the result buffer. If if not enough the + * buffer will be filled to capacity. + * @return Number of bytes needed for storing the sort key + * @stable ICU 2.2 + */ + virtual int32_t getSortKey(const UnicodeString& source, + uint8_t* result, + int32_t resultLength) const = 0; + + /** + * Get the sort key as an array of bytes from an UChar buffer. + * Sort key byte arrays are zero-terminated and can be compared using + * strcmp(). + * @param source string to be processed. + * @param sourceLength length of string to be processed. + * If -1, the string is 0 terminated and length will be decided by the + * function. + * @param result buffer to store result in. If NULL, number of bytes needed + * will be returned. + * @param resultLength length of the result buffer. If if not enough the + * buffer will be filled to capacity. + * @return Number of bytes needed for storing the sort key + * @stable ICU 2.2 + */ + virtual int32_t getSortKey(const UChar*source, int32_t sourceLength, + uint8_t*result, int32_t resultLength) const = 0; /** * Produce a bound for a given sortkey and a number of levels. - * Return value is always the number of bytes needed, regardless of + * Return value is always the number of bytes needed, regardless of * whether the result buffer was big enough or even valid.
    * Resulting bounds can be used to produce a range of strings that are * between upper and lower bounds. For example, if bounds are produced - * for a sortkey of string "smith", strings between upper and lower + * for a sortkey of string "smith", strings between upper and lower * bounds with one level would include "Smith", "SMITH", "sMiTh".
    * There are two upper bounds that can be produced. If UCOL_BOUND_UPPER * is produced, strings matched would be as above. However, if bound @@ -794,28 +848,28 @@ public: * TestBounds. * Sort keys may be compared using strcmp. * @param source The source sortkey. - * @param sourceLength The length of source, or -1 if null-terminated. - * (If an unmodified sortkey is passed, it is always null + * @param sourceLength The length of source, or -1 if null-terminated. + * (If an unmodified sortkey is passed, it is always null * terminated). - * @param boundType Type of bound required. It can be UCOL_BOUND_LOWER, which - * produces a lower inclusive bound, UCOL_BOUND_UPPER, that - * produces upper bound that matches strings of the same length - * or UCOL_BOUND_UPPER_LONG that matches strings that have the + * @param boundType Type of bound required. It can be UCOL_BOUND_LOWER, which + * produces a lower inclusive bound, UCOL_BOUND_UPPER, that + * produces upper bound that matches strings of the same length + * or UCOL_BOUND_UPPER_LONG that matches strings that have the * same starting substring as the source string. - * @param noOfLevels Number of levels required in the resulting bound (for most - * uses, the recommended value is 1). See users guide for + * @param noOfLevels Number of levels required in the resulting bound (for most + * uses, the recommended value is 1). See users guide for * explanation on number of levels a sortkey can have. * @param result A pointer to a buffer to receive the resulting sortkey. * @param resultLength The maximum size of result. - * @param status Used for returning error code if something went wrong. If the + * @param status Used for returning error code if something went wrong. If the * number of levels requested is higher than the number of levels - * in the source key, a warning (U_SORT_KEY_TOO_SHORT_WARNING) is + * in the source key, a warning (U_SORT_KEY_TOO_SHORT_WARNING) is * issued. - * @return The size needed to fully store the bound. + * @return The size needed to fully store the bound. * @see ucol_keyHashCode * @stable ICU 2.1 */ - static int32_t getBound(const uint8_t *source, + static int32_t U_EXPORT2 getBound(const uint8_t *source, int32_t sourceLength, UColBoundMode boundType, uint32_t noOfLevels, @@ -826,86 +880,88 @@ public: protected: - // Collator protected constructors ------------------------------------- - - /** - * Default constructor. - * Constructor is different from the old default Collator constructor. - * The task for determing the default collation strength and normalization - * mode is left to the child class. - * @stable ICU 2.0 - */ - Collator(); - - /** - * Constructor. - * Empty constructor, does not handle the arguments. - * This constructor is done for backward compatibility with 1.7 and 1.8. - * The task for handling the argument collation strength and normalization - * mode is left to the child class. - * @param collationStrength collation strength - * @param decompositionMode - * @deprecated ICU 2.4. Subclasses should use the default constructor - * instead and handle the strength and normalization mode themselves. - */ - Collator(UCollationStrength collationStrength, - UNormalizationMode decompositionMode); - - /** - * Copy constructor. - * @param other Collator object to be copied from - * @stable ICU 2.0 - */ - Collator(const Collator& other); - - // Collator protected methods ----------------------------------------- - - - /** - * Used internally by registraton to define the requested and valid locales. - * @param requestedLocale the requsted locale - * @param validLocale the valid locale - * @internal - */ - virtual void setLocales(const Locale& requestedLocale, const Locale& validLocale); + // Collator protected constructors ------------------------------------- + + /** + * Default constructor. + * Constructor is different from the old default Collator constructor. + * The task for determing the default collation strength and normalization + * mode is left to the child class. + * @stable ICU 2.0 + */ + Collator(); + + /** + * Constructor. + * Empty constructor, does not handle the arguments. + * This constructor is done for backward compatibility with 1.7 and 1.8. + * The task for handling the argument collation strength and normalization + * mode is left to the child class. + * @param collationStrength collation strength + * @param decompositionMode + * @deprecated ICU 2.4. Subclasses should use the default constructor + * instead and handle the strength and normalization mode themselves. + */ + Collator(UCollationStrength collationStrength, + UNormalizationMode decompositionMode); + + /** + * Copy constructor. + * @param other Collator object to be copied from + * @stable ICU 2.0 + */ + Collator(const Collator& other); + + // Collator protected methods ----------------------------------------- + -public: /** - * used only by ucol_open, not for public use - * @internal - */ - static UCollator* createUCollator(const char* loc, UErrorCode* status); + * Used internally by registraton to define the requested and valid locales. + * @param requestedLocale the requsted locale + * @param validLocale the valid locale + * @internal + */ + virtual void setLocales(const Locale& requestedLocale, const Locale& validLocale); +public: +#if !UCONFIG_NO_SERVICE + /** + * used only by ucol_open, not for public use + * @internal + */ + static UCollator* createUCollator(const char* loc, UErrorCode* status); +#endif private: - /** - * Assignment operator. Private for now. - * @internal - */ - Collator& operator=(const Collator& other); - - friend class CFactory; - friend class SimpleCFactory; - friend class ICUCollatorFactory; - friend class ICUCollatorService; - static Collator* makeInstance(const Locale& desiredLocale, - UErrorCode& status); - - // Collator private data members --------------------------------------- - - /* - synwee : removed as attributes to be handled by child class - UCollationStrength strength; - Normalizer::EMode decmp; - */ + /** + * Assignment operator. Private for now. + * @internal + */ + Collator& operator=(const Collator& other); + + friend class CFactory; + friend class SimpleCFactory; + friend class ICUCollatorFactory; + friend class ICUCollatorService; + static Collator* makeInstance(const Locale& desiredLocale, + UErrorCode& status); + + // Collator private data members --------------------------------------- + + /* + synwee : removed as attributes to be handled by child class + UCollationStrength strength; + Normalizer::EMode decmp; + */ /* This is useless information */ /* static const UVersionInfo fVersion;*/ }; +#if !UCONFIG_NO_SERVICE /** * A factory, used with registerFactory, the creates multiple collators and provides * display names for them. A factory supports some number of locales-- these are the * locales for which it can create collators. The factory can be visible, in which - * case the supported locales will be enumerated by getAvailableLocales, or invisible, + * case the supported locales will be enumerated by getAvailableLocales, or invisible, * in which they are not. Invisible locales are still supported, they are just not * listed by getAvailableLocales. *

    @@ -915,17 +971,23 @@ private: * Note: if the collators are to be used from C APIs, they must be instances * of RuleBasedCollator.

    * - * @draft ICU 2.6 + * @stable ICU 2.6 */ class U_I18N_API CollatorFactory : public UObject { public: + /** + * Destructor + * @draft ICU 3.0 + */ + virtual ~CollatorFactory(); + /** * Return true if this factory is visible. Default is true. * If not visible, the locales supported by this factory will not * be listed by getAvailableLocales. * @return true if the factory is visible. - @draft ICU 2.6 + * @stable ICU 2.6 */ virtual UBool visible(void) const; @@ -934,7 +996,7 @@ public: * is not supported, return NULL. * @param loc the locale identifying the collator to be created. * @return a new collator if the locale is supported, otherwise NULL. - * @draft ICU 2.6 + * @stable ICU 2.6 */ virtual Collator* createCollator(const Locale& loc) = 0; @@ -946,57 +1008,27 @@ public: * @param displayLocale the locale for which the display name of the collator should be localized * @param result an output parameter for the display name, set to bogus if not supported. * @return the display name - * @draft ICU 2.6 + * @stable ICU 2.6 */ - virtual UnicodeString& getDisplayName(const Locale& objectLocale, + virtual UnicodeString& getDisplayName(const Locale& objectLocale, const Locale& displayLocale, UnicodeString& result); - + /** - * Return an array of all the locale names directly supported by this factory. - * The number of names is returned in count. This array is owned by the factory. + * Return an array of all the locale names directly supported by this factory. + * The number of names is returned in count. This array is owned by the factory. * Its contents must never change. * @param count output parameter for the number of locales supported by the factory * @param status the in/out error code * @return a pointer to an array of count UnicodeStrings. - * @draft ICU 2.6 + * @stable ICU 2.6 */ virtual const UnicodeString * getSupportedIDs(int32_t &count, UErrorCode& status) = 0; }; +#endif /* UCONFIG_NO_SERVICE */ // Collator inline methods ----------------------------------------------- -inline UBool Collator::operator==(const Collator& other) const -{ - return (UBool)(this == &other); -} - -inline UBool Collator::operator!=(const Collator& other) const -{ - return (UBool)!(*this == other); -} - -inline UnicodeSet *Collator::getTailoredSet(UErrorCode &status) const -{ - if(U_FAILURE(status)) { - return NULL; - } - // everything can be changed - return new UnicodeSet(0, 0x10FFFF); -} - -/* -synwee : removed since there's no attribute to be retrieved here -inline UCollationStrength Collator::getStrength() const -{ - return strength; -} - -inline Normalizer::EMode Collator::getDecomposition() const -{ - return decmp; -} -*/ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_COLLATION */ diff --git a/icuSources/i18n/unicode/curramt.h b/icuSources/i18n/unicode/curramt.h new file mode 100644 index 00000000..5c66064c --- /dev/null +++ b/icuSources/i18n/unicode/curramt.h @@ -0,0 +1,124 @@ +/* +********************************************************************** +* Copyright (c) 2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Author: Alan Liu +* Created: April 26, 2004 +* Since: ICU 3.0 +********************************************************************** +*/ +#ifndef __CURRENCYAMOUNT_H__ +#define __CURRENCYAMOUNT_H__ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/measure.h" +#include "unicode/currunit.h" + +U_NAMESPACE_BEGIN + +/** + * A currency together with a numeric amount, such as 200 USD. + * + * @author Alan Liu + * @draft ICU 3.0 + */ +class U_I18N_API CurrencyAmount: public Measure { + public: + /** + * Construct an object with the given numeric amount and the given + * ISO currency code. + * @param amount a numeric object; amount.isNumeric() must be TRUE + * @param isoCode the 3-letter ISO 4217 currency code; must not be + * NULL and must have length 3 + * @param ec input-output error code. If the amount or the isoCode + * is invalid, then this will be set to a failing value. + * @draft ICU 3.0 + */ + CurrencyAmount(const Formattable& amount, const UChar* isoCode, + UErrorCode &ec); + + /** + * Construct an object with the given numeric amount and the given + * ISO currency code. + * @param amount the amount of the given currency + * @param isoCode the 3-letter ISO 4217 currency code; must not be + * NULL and must have length 3 + * @param ec input-output error code. If the isoCode is invalid, + * then this will be set to a failing value. + * @draft ICU 3.0 + */ + CurrencyAmount(double amount, const UChar* isoCode, + UErrorCode &ec); + + /** + * Copy constructor + * @draft ICU 3.0 + */ + CurrencyAmount(const CurrencyAmount& other); + + /** + * Assignment operator + * @draft ICU 3.0 + */ + CurrencyAmount& operator=(const CurrencyAmount& other); + + /** + * Return a polymorphic clone of this object. The result will + * have the same class as returned by getDynamicClassID(). + * @draft ICU 3.0 + */ + virtual UObject* clone() const; + + /** + * Destructor + * @draft ICU 3.0 + */ + virtual ~CurrencyAmount(); + + /** + * Returns a unique class ID for this object POLYMORPHICALLY. + * This method implements a simple form of RTTI used by ICU. + * @return The class ID for this object. All objects of a given + * class have the same class ID. Objects of other classes have + * different class IDs. + * @draft ICU 3.0 + */ + virtual UClassID getDynamicClassID() const; + + /** + * Returns the class ID for this class. This is used to compare to + * the return value of getDynamicClassID(). + * @return The class ID for all objects of this class. + * @draft ICU 3.0 + */ + static UClassID U_EXPORT2 getStaticClassID(); + + /** + * Return the currency unit object of this object. + * @draft ICU 3.0 + */ + inline const CurrencyUnit& getCurrency() const; + + /** + * Return the ISO currency code of this object. + * @draft ICU 3.0 + */ + inline const UChar* getISOCurrency() const; +}; + +inline const CurrencyUnit& CurrencyAmount::getCurrency() const { + return (const CurrencyUnit&) getUnit(); +} + +inline const UChar* CurrencyAmount::getISOCurrency() const { + return getCurrency().getISOCurrency(); +} + +U_NAMESPACE_END + +#endif // !UCONFIG_NO_FORMATTING +#endif // __CURRENCYAMOUNT_H__ diff --git a/icuSources/i18n/unicode/currunit.h b/icuSources/i18n/unicode/currunit.h new file mode 100644 index 00000000..a4e6df7d --- /dev/null +++ b/icuSources/i18n/unicode/currunit.h @@ -0,0 +1,112 @@ +/* +********************************************************************** +* Copyright (c) 2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Author: Alan Liu +* Created: April 26, 2004 +* Since: ICU 3.0 +********************************************************************** +*/ +#ifndef __CURRENCYUNIT_H__ +#define __CURRENCYUNIT_H__ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/measunit.h" + +U_NAMESPACE_BEGIN + +/** + * A unit of currency, such as USD (U.S. dollars) or JPY (Japanese + * yen). This class is a thin wrapper over a UChar string that + * subclasses MeasureUnit, for use with Measure and MeasureFormat. + * + * @author Alan Liu + * @draft ICU 3.0 + */ +class U_I18N_API CurrencyUnit: public MeasureUnit { + public: + /** + * Construct an object with the given ISO currency code. + * @param isoCode the 3-letter ISO 4217 currency code; must not be + * NULL and must have length 3 + * @param ec input-output error code. If the isoCode is invalid, + * then this will be set to a failing value. + * @draft ICU 3.0 + */ + CurrencyUnit(const UChar* isoCode, UErrorCode &ec); + + /** + * Copy constructor + * @draft ICU 3.0 + */ + CurrencyUnit(const CurrencyUnit& other); + + /** + * Assignment operator + * @draft ICU 3.0 + */ + CurrencyUnit& operator=(const CurrencyUnit& other); + + /** + * Return a polymorphic clone of this object. The result will + * have the same class as returned by getDynamicClassID(). + * @draft ICU 3.0 + */ + virtual UObject* clone() const; + + /** + * Destructor + * @draft ICU 3.0 + */ + virtual ~CurrencyUnit(); + + /** + * Equality operator. Return true if this object is equal + * to the given object. + * @draft ICU 3.0 + */ + UBool operator==(const UObject& other) const; + + /** + * Returns a unique class ID for this object POLYMORPHICALLY. + * This method implements a simple form of RTTI used by ICU. + * @return The class ID for this object. All objects of a given + * class have the same class ID. Objects of other classes have + * different class IDs. + * @draft ICU 3.0 + */ + virtual UClassID getDynamicClassID() const; + + /** + * Returns the class ID for this class. This is used to compare to + * the return value of getDynamicClassID(). + * @return The class ID for all objects of this class. + * @draft ICU 3.0 + */ + static UClassID U_EXPORT2 getStaticClassID(); + + /** + * Return the ISO currency code of this object. + * @draft ICU 3.0 + */ + inline const UChar* getISOCurrency() const; + + private: + /** + * The ISO 4217 code of this object. + */ + UChar isoCode[4]; +}; + +inline const UChar* CurrencyUnit::getISOCurrency() const { + return isoCode; +} + +U_NAMESPACE_END + +#endif // !UCONFIG_NO_FORMATTING +#endif // __CURRENCYUNIT_H__ diff --git a/icuSources/i18n/unicode/datefmt.h b/icuSources/i18n/unicode/datefmt.h index a53a6999..e2959225 100644 --- a/icuSources/i18n/unicode/datefmt.h +++ b/icuSources/i18n/unicode/datefmt.h @@ -1,6 +1,6 @@ /* ******************************************************************************** -* Copyright (C) 1997-2003, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************** * @@ -18,11 +18,12 @@ #ifndef DATEFMT_H #define DATEFMT_H - + #include "unicode/utypes.h" #if !UCONFIG_NO_FORMATTING +#include "unicode/udat.h" #include "unicode/calendar.h" #include "unicode/numfmt.h" #include "unicode/format.h" @@ -123,84 +124,20 @@ class TimeZone; *
  • Align any particular field, or find out where it is for selection * on the screen. * + * + *

    User subclasses are not supported. While clients may write + * subclasses, such code will not necessarily work and will not be + * guaranteed to work stably from release to release. */ class U_I18N_API DateFormat : public Format { public: - /** - * The following enum values are used in FieldPosition with date/time formatting. - * They are also used to index into DateFormatSymbols::fgPatternChars, which - * is the list of standard internal-representation pattern characters, and - * the resource bundle localPatternChars data. For this reason, this enum - * should be treated with care; don't change the order or contents of it - * unless you really know what you are doing. You'll probably have to change - * the code in DateFormatSymbols, SimpleDateFormat, and all the locale - * resource bundle data files. - * @draft ICU 2.4 - */ - enum EField - { - kEraField = 0, // ERA field alignment. - kYearField, // YEAR field alignment. - kMonthField, // MONTH field alignment. - kDateField, // DATE field alignment. - kHourOfDay1Field, // One-based HOUR_OF_DAY field alignment. - // kHourOfDay1Field is used for the one-based 24-hour clock. - // For example, 23:59 + 01:00 results in 24:59. - kHourOfDay0Field, // Zero-based HOUR_OF_DAY field alignment. - // HOUR_OF_DAY0_FIELD is used for the zero-based 24-hour clock. - // For example, 23:59 + 01:00 results in 00:59. - kMinuteField, // MINUTE field alignment. - kSecondField, // SECOND field alignment. - kMillisecondField, // MILLISECOND field alignment. - kDayOfWeekField, // DAY_OF_WEEK field alignment. - kDayOfYearField, // DAY_OF_YEAR field alignment. - kDayOfWeekInMonthField,// DAY_OF_WEEK_IN_MONTH field alignment. - kWeekOfYearField, // WEEK_OF_YEAR field alignment. - kWeekOfMonthField, // WEEK_OF_MONTH field alignment. - kAmPmField, // AM_PM field alignment. - kHour1Field, // One-based HOUR field alignment. - // HOUR1_FIELD is used for the one-based 12-hour clock. - // For example, 11:30 PM + 1 hour results in 12:30 AM. - kHour0Field, // Zero-based HOUR field alignment. - // HOUR0_FIELD is used for the zero-based 12-hour clock. - // For example, 11:30 PM + 1 hour results in 00:30 AM. - kTimezoneField, // TIMEZONE field alignment. - kYearWOYField, // Corrected year for week representation - kDOWLocalField, // localized day of week - - - - /** - * These constants are provided for backwards compatibility only. - * Please use the C++ style constants defined above. - */ - ERA_FIELD = kEraField, - YEAR_FIELD = kYearField, - MONTH_FIELD = kMonthField, - DATE_FIELD = kDateField, - HOUR_OF_DAY1_FIELD = kHourOfDay1Field, - HOUR_OF_DAY0_FIELD = kHourOfDay0Field, - MINUTE_FIELD = kMinuteField, - SECOND_FIELD = kSecondField, - MILLISECOND_FIELD = kMillisecondField, - DAY_OF_WEEK_FIELD = kDayOfWeekField, - DAY_OF_YEAR_FIELD = kDayOfYearField, - DAY_OF_WEEK_IN_MONTH_FIELD = kDayOfWeekInMonthField, - WEEK_OF_YEAR_FIELD = kWeekOfYearField, - WEEK_OF_MONTH_FIELD = kWeekOfMonthField, - AM_PM_FIELD = kAmPmField, - HOUR1_FIELD = kHour1Field, - HOUR0_FIELD = kHour0Field, - TIMEZONE_FIELD = kTimezoneField - - }; /** * Constants for various style patterns. These reflect the order of items in * the DateTimePatterns resource. There are 4 time patterns, 4 date patterns, * and then the date-time pattern. Each block of 4 values in the resource occurs * in the order full, long, medium, short. - * @draft ICU 2.4 + * @stable ICU 2.4 */ enum EStyle { @@ -221,12 +158,12 @@ public: kDefault = kMedium, - - + + /** * These constants are provided for backwards compatibility only. * Please use the C++ style constants defined above. - */ + */ FULL = kFull, LONG = kLong, MEDIUM = kMedium, @@ -274,11 +211,11 @@ public: *

    * On input, the FieldPosition parameter may have its "field" member filled with * an enum value specifying a field. On output, the FieldPosition will be filled - * in with the text offsets for that field. + * in with the text offsets for that field. *

    For example, given a time text * "1996.07.10 AD at 15:08:56 PDT", if the given fieldPosition.field is - * DateFormat::kYearField, the offsets fieldPosition.beginIndex and - * statfieldPositionus.getEndIndex will be set to 0 and 4, respectively. + * UDAT_YEAR_FIELD, the offsets fieldPosition.beginIndex and + * statfieldPositionus.getEndIndex will be set to 0 and 4, respectively. *

    Notice * that if the same time field appears more than once in a pattern, the status will * be set for the first occurence of that time field. For instance, @@ -306,11 +243,11 @@ public: *

    * On input, the FieldPosition parameter may have its "field" member filled with * an enum value specifying a field. On output, the FieldPosition will be filled - * in with the text offsets for that field. + * in with the text offsets for that field. *

    For example, given a time text * "1996.07.10 AD at 15:08:56 PDT", if the given fieldPosition.field is - * DateFormat::kYearField, the offsets fieldPosition.beginIndex and - * statfieldPositionus.getEndIndex will be set to 0 and 4, respectively. + * UDAT_YEAR_FIELD, the offsets fieldPosition.beginIndex and + * statfieldPositionus.getEndIndex will be set to 0 and 4, respectively. *

    Notice * that if the same time field appears more than once in a pattern, the status will * be set for the first occurence of that time field. For instance, @@ -456,38 +393,38 @@ public: * @return A date/time formatter which the caller owns. * @stable ICU 2.0 */ - static DateFormat* createInstance(void); + static DateFormat* U_EXPORT2 createInstance(void); /** * Creates a time formatter with the given formatting style for the given * locale. - * + * * @param style The given formatting style. For example, * SHORT for "h:mm a" in the US locale. * @param aLocale The given locale. * @return A time formatter which the caller owns. * @stable ICU 2.0 */ - static DateFormat* createTimeInstance(EStyle style = kDefault, + static DateFormat* U_EXPORT2 createTimeInstance(EStyle style = kDefault, const Locale& aLocale = Locale::getDefault()); /** * Creates a date formatter with the given formatting style for the given * const locale. - * + * * @param style The given formatting style. For example, * SHORT for "M/d/yy" in the US locale. * @param aLocale The given locale. * @return A date formatter which the caller owns. * @stable ICU 2.0 */ - static DateFormat* createDateInstance(EStyle style = kDefault, + static DateFormat* U_EXPORT2 createDateInstance(EStyle style = kDefault, const Locale& aLocale = Locale::getDefault()); /** * Creates a date/time formatter with the given formatting styles for the * given locale. - * + * * @param dateStyle The given formatting style for the date portion of the result. * For example, SHORT for "M/d/yy" in the US locale. * @param timeStyle The given formatting style for the time portion of the result. @@ -496,7 +433,7 @@ public: * @return A date/time formatter which the caller owns. * @stable ICU 2.0 */ - static DateFormat* createDateTimeInstance(EStyle dateStyle = kDefault, + static DateFormat* U_EXPORT2 createDateTimeInstance(EStyle dateStyle = kDefault, EStyle timeStyle = kDefault, const Locale& aLocale = Locale::getDefault()); @@ -507,8 +444,8 @@ public: * does NOT own this list and must not delete it. * @stable ICU 2.0 */ - static const Locale* getAvailableLocales(int32_t& count); - + static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count); + /** * Returns true if the formatter is set for lenient parsing. * @stable ICU 2.0 @@ -520,20 +457,20 @@ public: * parsing, the parser may use heuristics to interpret inputs that do not * precisely match this object's format. With strict parsing, inputs must * match this object's format. - * + * * @param lenient True specifies date/time interpretation to be lenient. * @see Calendar::setLenient * @stable ICU 2.0 */ virtual void setLenient(UBool lenient); - + /** * Gets the calendar associated with this date/time formatter. * @return the calendar associated with this date/time formatter. * @stable ICU 2.0 */ virtual const Calendar* getCalendar(void) const; - + /** * Set the calendar to be used by this date format. Initially, the default * calendar for the specified or default locale is used. The caller should @@ -554,7 +491,7 @@ public: */ virtual void setCalendar(const Calendar& newCalendar); - + /** * Gets the number formatter which this date/time formatter uses to format * and parse the numeric portions of the pattern. @@ -562,7 +499,7 @@ public: * @stable ICU 2.0 */ virtual const NumberFormat* getNumberFormat(void) const; - + /** * Allows you to set the number formatter. The caller should * not delete the NumberFormat object after it is adopted by this call. @@ -584,7 +521,7 @@ public: * @stable ICU 2.0 */ virtual const TimeZone& getTimeZone(void) const; - + /** * Sets the time zone for the calendar of this DateFormat object. The caller * no longer owns the TimeZone object and should not delete it after this call. @@ -600,7 +537,6 @@ public: */ virtual void setTimeZone(const TimeZone& zone); - protected: /** * Default constructor. Creates a DateFormat with no Calendar or NumberFormat @@ -626,7 +562,7 @@ protected: * The calendar that DateFormat uses to produce the time field values needed * to implement date/time formatting. Subclasses should generally initialize * this to the default calendar for the locale associated with this DateFormat. - * @draft ICU 2.4 + * @stable ICU 2.4 */ Calendar* fCalendar; @@ -634,7 +570,7 @@ protected: * The number formatter that DateFormat uses to format numbers in dates and * times. Subclasses should generally initialize this to the default number * format for the locale associated with this DateFormat. - * @draft ICU 2.4 + * @stable ICU 2.4 */ NumberFormat* fNumberFormat; @@ -647,7 +583,61 @@ private: * @param inLocale the given locale. * @return a date/time formatter, or 0 on failure. */ - static DateFormat* create(EStyle timeStyle, EStyle dateStyle, const Locale&); + static DateFormat* U_EXPORT2 create(EStyle timeStyle, EStyle dateStyle, const Locale&); + +public: + /** + * Field selector for FieldPosition for DateFormat fields. + * @obsolete ICU 3.4 use UDateFormatField instead, since this API will be + * removed in that release + */ + enum EField + { + // Obsolete; use UDateFormatField instead + kEraField = UDAT_ERA_FIELD, + kYearField = UDAT_YEAR_FIELD, + kMonthField = UDAT_MONTH_FIELD, + kDateField = UDAT_DATE_FIELD, + kHourOfDay1Field = UDAT_HOUR_OF_DAY1_FIELD, + kHourOfDay0Field = UDAT_HOUR_OF_DAY0_FIELD, + kMinuteField = UDAT_MINUTE_FIELD, + kSecondField = UDAT_SECOND_FIELD, + kMillisecondField = UDAT_FRACTIONAL_SECOND_FIELD, + kDayOfWeekField = UDAT_DAY_OF_WEEK_FIELD, + kDayOfYearField = UDAT_DAY_OF_YEAR_FIELD, + kDayOfWeekInMonthField = UDAT_DAY_OF_WEEK_IN_MONTH_FIELD, + kWeekOfYearField = UDAT_WEEK_OF_YEAR_FIELD, + kWeekOfMonthField = UDAT_WEEK_OF_MONTH_FIELD, + kAmPmField = UDAT_AM_PM_FIELD, + kHour1Field = UDAT_HOUR1_FIELD, + kHour0Field = UDAT_HOUR0_FIELD, + kTimezoneField = UDAT_TIMEZONE_FIELD, + kYearWOYField = UDAT_YEAR_WOY_FIELD, + kDOWLocalField = UDAT_DOW_LOCAL_FIELD, + kExtendedYearField = UDAT_EXTENDED_YEAR_FIELD, + kJulianDayField = UDAT_JULIAN_DAY_FIELD, + kMillisecondsInDayField = UDAT_MILLISECONDS_IN_DAY_FIELD, + + // Obsolete; use UDateFormatField instead + ERA_FIELD = UDAT_ERA_FIELD, + YEAR_FIELD = UDAT_YEAR_FIELD, + MONTH_FIELD = UDAT_MONTH_FIELD, + DATE_FIELD = UDAT_DATE_FIELD, + HOUR_OF_DAY1_FIELD = UDAT_HOUR_OF_DAY1_FIELD, + HOUR_OF_DAY0_FIELD = UDAT_HOUR_OF_DAY0_FIELD, + MINUTE_FIELD = UDAT_MINUTE_FIELD, + SECOND_FIELD = UDAT_SECOND_FIELD, + MILLISECOND_FIELD = UDAT_FRACTIONAL_SECOND_FIELD, + DAY_OF_WEEK_FIELD = UDAT_DAY_OF_WEEK_FIELD, + DAY_OF_YEAR_FIELD = UDAT_DAY_OF_YEAR_FIELD, + DAY_OF_WEEK_IN_MONTH_FIELD = UDAT_DAY_OF_WEEK_IN_MONTH_FIELD, + WEEK_OF_YEAR_FIELD = UDAT_WEEK_OF_YEAR_FIELD, + WEEK_OF_MONTH_FIELD = UDAT_WEEK_OF_MONTH_FIELD, + AM_PM_FIELD = UDAT_AM_PM_FIELD, + HOUR1_FIELD = UDAT_HOUR1_FIELD, + HOUR0_FIELD = UDAT_HOUR0_FIELD, + TIMEZONE_FIELD = UDAT_TIMEZONE_FIELD + }; }; inline UnicodeString& diff --git a/icuSources/i18n/unicode/dcfmtsym.h b/icuSources/i18n/unicode/dcfmtsym.h index ee7f75d7..80375d70 100644 --- a/icuSources/i18n/unicode/dcfmtsym.h +++ b/icuSources/i18n/unicode/dcfmtsym.h @@ -1,6 +1,6 @@ /* ******************************************************************************** -* Copyright (C) 1997-2003, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************** * @@ -112,6 +112,9 @@ public: kInfinitySymbol, /** Nan symbol */ kNaNSymbol, + /** Significant digit symbol + * @draft ICU 3.0 */ + kSignificantDigitSymbol, /** count symbol constants */ kFormatSymbolCount }; @@ -154,7 +157,7 @@ public: * Destructor. * @stable ICU 2.0 */ - ~DecimalFormatSymbols(); + virtual ~DecimalFormatSymbols(); /** * Return true if another object is semantically equal to this one. @@ -183,7 +186,7 @@ public: * @return the format symbols by the param 'symbol' * @stable ICU 2.0 */ - UnicodeString getSymbol(ENumberFormatSymbol symbol) const; + inline UnicodeString getSymbol(ENumberFormatSymbol symbol) const; /** * Set one of the format symbols by its enum constant. @@ -202,19 +205,26 @@ public: */ inline Locale getLocale() const; + /** + * Returns the locale for this object. Two flavors are available: + * valid and actual locale. + * @draft ICU 2.8 likely to change in ICU 3.0, based on feedback + */ + Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const; + /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const; + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ - static inline UClassID getStaticClassID(); + static UClassID U_EXPORT2 getStaticClassID(); private: DecimalFormatSymbols(); // default constructor not implemented @@ -238,7 +248,7 @@ private: * @param numberElements the number format symbols * @param numberElementsLength length of numberElements */ - void initialize(const UnicodeString* numberElements, int32_t numberElementsLength); + void initialize(const UChar** numberElements, int32_t *numberElementsStrLen, int32_t numberElementsLength); /** * Initialize the symbols with default values. @@ -287,41 +297,32 @@ private: Locale locale; - static const char fgNumberElements[]; - - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; + char actualLocale[ULOC_FULLNAME_CAPACITY]; + char validLocale[ULOC_FULLNAME_CAPACITY]; }; -inline UClassID -DecimalFormatSymbols::getStaticClassID() -{ return (UClassID)&fgClassID; } - -inline UClassID -DecimalFormatSymbols::getDynamicClassID() const -{ return DecimalFormatSymbols::getStaticClassID(); } - // ------------------------------------- inline UnicodeString DecimalFormatSymbols::getSymbol(ENumberFormatSymbol symbol) const { - if(symbol - * Normally, you get the proper NumberFormat for a specific locale - * (including the default locale) using the NumberFormat factory methods, - * rather than constructing a DecimalNumberFormat directly. - *

    - * Either the prefixes or the suffixes must be different for the parse - * to distinguish positive from negative. Parsing will be unreliable - * if the digits, thousands or decimal separators are the same, or if - * any of them occur in the prefixes or suffixes. - *

    - * [Special cases:] - *

    - * NaN is formatted as a single character, typically \\uFFFD. - *

    - * +/-Infinity is formatted as a single character, typically \\u221E, - * plus the positive and negative pre/suffixes. - *

    - * Note: this class is designed for common users; for very large or small - * numbers, use a format that can express exponential values. - *

    - * [Example:] - *

    + * DecimalFormat is a concrete subclass of NumberFormat that formats decimal
    + * numbers. It has a variety of features designed to make it possible to parse
    + * and format numbers in any locale, including support for Western, Arabic, or
    + * Indic digits.  It also supports different flavors of numbers, including
    + * integers ("123"), fixed-point numbers ("123.4"), scientific notation
    + * ("1.23E4"), percentages ("12%"), and currency amounts ("$123").  All of these
    + * flavors can be easily localized.
    + *
    + * 

    To obtain a NumberFormat for a specific locale (including the default + * locale) call one of NumberFormat's factory methods such as + * createInstance(). Do not call the DecimalFormat constructors directly, unless + * you know what you are doing, since the NumberFormat factory methods may + * return subclasses other than DecimalFormat. + * + *

    Example Usage + * * \code - * // normally we would have a GUI with a menu for this + * // Normally we would have a GUI with a menu for this * int32_t locCount; * const Locale* locales = NumberFormat::getAvailableLocales(locCount); - * if (locCount > 12) locCount = 12; //limit output * * double myNumber = -1234.56; * UErrorCode success = U_ZERO_ERROR; - * NumberFormat* form; //= NumberFormat::createInstance(success); + * NumberFormat* form; * - * // just for fun, we print out a number with the locale number, currency - * // and percent format for each locale we can. + * // Print out a number with the localized number, currency and percent + * // format for each locale. * UnicodeString countryName; * UnicodeString displayName; * UnicodeString str; @@ -87,11 +78,11 @@ class ChoiceFormat; * continue; * } * switch (j) { - * default: + * case 0: * form = NumberFormat::createInstance(locales[i], success ); break; * case 1: * form = NumberFormat::createCurrencyInstance(locales[i], success ); break; - * case 0: + * default: * form = NumberFormat::createPercentInstance(locales[i], success ); break; * } * if (form) { @@ -100,106 +91,535 @@ class ChoiceFormat; * cout << locales[i].getDisplayName(displayName) << ": " << pattern; * cout << " -> " << form->format(myNumber,str) << endl; * form->parse(form->format(myNumber,str), fmtable, success); - * //cout << " parsed: " << fmtable << endl; * delete form; * } * } * } * \endcode - *

    - * [The following shows the structure of the pattern.] - *
    - * \code
    - *     pattern    := subpattern{;subpattern}
    - *     subpattern := {prefix}integer{.fraction}{suffix}
    - *     
    - *     prefix     := '\\u0000'..'\\uFFFD' - specialCharacters
    - *     suffix     := '\\u0000'..'\\uFFFD' - specialCharacters
    - *     integer    := '#'* '0'* '0'
    - *     fraction   := '0'* '#'*
    - *   
    - *  Notation:
    - *     X*       0 or more instances of X
    - *     (X | Y)  either X or Y.
    - *     X..Y     any character from X up to Y, inclusive.
    - *     S - T    characters in S, except those in T
    - * \code
    - * /pre>
    - * The first subpattern is for positive numbers. The second (optional)
    - * subpattern is used for negative numbers. (In both cases, ',' can
    - * occur inside the integer portion--it is just too messy to indicate
    - * in BNF.)  For the second subpattern, only the PREFIX and SUFFIX are
    - * noted; other attributes are taken only from the first subpattern.
    - * 

    - * Here are the special characters used in the parts of the - * subpattern, with notes on their usage. + * + *

    Patterns + * + *

    A DecimalFormat consists of a pattern and a set of + * symbols. The pattern may be set directly using + * applyPattern(), or indirectly using other API methods which + * manipulate aspects of the pattern, such as the minimum number of integer + * digits. The symbols are stored in a DecimalFormatSymbols + * object. When using the NumberFormat factory methods, the + * pattern and symbols are read from ICU's locale data. + * + *

    Special Pattern Characters + * + *

    Many characters in a pattern are taken literally; they are matched during + * parsing and output unchanged during formatting. Special characters, on the + * other hand, stand for other characters, strings, or classes of characters. + * For example, the '#' character is replaced by a localized digit. Often the + * replacement character is the same as the pattern character; in the U.S. locale, + * the ',' grouping character is replaced by ','. However, the replacement is + * still happening, and if the symbols are modified, the grouping character + * changes. Some special characters affect the behavior of the formatter by + * their presence; for example, if the percent character is seen, then the + * value is multiplied by 100 before being displayed. + * + *

    To insert a special character in a pattern as a literal, that is, without + * any special meaning, the character must be quoted. There are some exceptions to + * this which are noted below. + * + *

    The characters listed here are used in non-localized patterns. Localized + * patterns use the corresponding characters taken from this formatter's + * DecimalFormatSymbols object instead, and these characters lose + * their special status. Two exceptions are the currency sign and quote, which + * are not localized. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    Symbol + * Location + * Localized? + * Meaning + *
    0 + * Number + * Yes + * Digit + *
    1-9 + * Number + * Yes + * '1' through '9' indicate rounding. + *
    \htmlonly@\endhtmlonly + * Number + * No + * Significant digit + *
    # + * Number + * Yes + * Digit, zero shows as absent + *
    . + * Number + * Yes + * Decimal separator or monetary decimal separator + *
    - + * Number + * Yes + * Minus sign + *
    , + * Number + * Yes + * Grouping separator + *
    E + * Number + * Yes + * Separates mantissa and exponent in scientific notation. + * Need not be quoted in prefix or suffix. + *
    + + * Exponent + * Yes + * Prefix positive exponents with localized plus sign. + * Need not be quoted in prefix or suffix. + *
    ; + * Subpattern boundary + * Yes + * Separates positive and negative subpatterns + *
    \% + * Prefix or suffix + * Yes + * Multiply by 100 and show as percentage + *
    \\u2030 + * Prefix or suffix + * Yes + * Multiply by 1000 and show as per mille + *
    \htmlonly¤\endhtmlonly (\\u00A4) + * Prefix or suffix + * No + * Currency sign, replaced by currency symbol. If + * doubled, replaced by international currency symbol. + * If present in a pattern, the monetary decimal separator + * is used instead of the decimal separator. + *
    ' + * Prefix or suffix + * No + * Used to quote special characters in a prefix or suffix, + * for example, "'#'#" formats 123 to + * "#123". To create a single quote + * itself, use two in a row: "# o''clock". + *
    * + * Prefix or suffix boundary + * Yes + * Pad escape, precedes pad character + *
    + * + *

    A DecimalFormat pattern contains a postive and negative + * subpattern, for example, "#,##0.00;(#,##0.00)". Each subpattern has a + * prefix, a numeric part, and a suffix. If there is no explicit negative + * subpattern, the negative subpattern is the localized minus sign prefixed to the + * positive subpattern. That is, "0.00" alone is equivalent to "0.00;-0.00". If there + * is an explicit negative subpattern, it serves only to specify the negative + * prefix and suffix; the number of digits, minimal digits, and other + * characteristics are ignored in the negative subpattern. That means that + * "#,##0.0#;(#)" has precisely the same result as "#,##0.0#;(#,##0.0#)". + * + *

    The prefixes, suffixes, and various symbols used for infinity, digits, + * thousands separators, decimal separators, etc. may be set to arbitrary + * values, and they will appear properly during formatting. However, care must + * be taken that the symbols and strings do not conflict, or parsing will be + * unreliable. For example, either the positive and negative prefixes or the + * suffixes must be distinct for parse() to be able + * to distinguish positive from negative values. Another example is that the + * decimal separator and thousands separator should be distinct characters, or + * parsing will be impossible. + * + *

    The grouping separator is a character that separates clusters of + * integer digits to make large numbers more legible. It commonly used for + * thousands, but in some locales it separates ten-thousands. The grouping + * size is the number of digits between the grouping separators, such as 3 + * for "100,000,000" or 4 for "1 0000 0000". There are actually two different + * grouping sizes: One used for the least significant integer digits, the + * primary grouping size, and one used for all others, the + * secondary grouping size. In most locales these are the same, but + * sometimes they are different. For example, if the primary grouping interval + * is 3, and the secondary is 2, then this corresponds to the pattern + * "#,##,##0", and the number 123456789 is formatted as "12,34,56,789". If a + * pattern contains multiple grouping separators, the interval between the last + * one and the end of the integer defines the primary grouping size, and the + * interval between the last two defines the secondary grouping size. All others + * are ignored, so "#,##,###,####" == "###,###,####" == "##,#,###,####". + * + *

    Illegal patterns, such as "#.#.#" or "#.###,###", will cause + * DecimalFormat to set a failing UErrorCode. + * + *

    Pattern BNF + * *

    - * \code
    - *     Symbol   Meaning
    - *       0      a digit, showing up a zero if it is zero
    - *       #      a digit, supressed if zero
    - *       .      placeholder for decimal separator
    - *       ,      placeholder for grouping separator.
    - *       E      separates mantissa and exponent for exponential formats.
    - *       ;      separates formats.
    - *       -      default negative prefix.
    - *       %      multiply by 100 and show as percentage
    - *       \u2030 multiply by 1000 and show as per mille
    - *       \u00A4 currency sign; replaced by currency symbol; if
    - *              doubled, replaced by international currency symbol.
    - *              If present in a pattern, the monetary decimal separator
    - *              is used instead of the decimal separator.
    - *       X      any other characters can be used in the prefix or suffix
    - *       '      used to quote special characters in a prefix or suffix.
    - * \endcode
    + * pattern    := subpattern (';' subpattern)?
    + * subpattern := prefix? number exponent? suffix?
    + * number     := (integer ('.' fraction)?) | sigDigits
    + * prefix     := '\\u0000'..'\\uFFFD' - specialCharacters
    + * suffix     := '\\u0000'..'\\uFFFD' - specialCharacters
    + * integer    := '#'* '0'* '0'
    + * fraction   := '0'* '#'*
    + * sigDigits  := '#'* '@' '@'* '#'*
    + * exponent   := 'E' '+'? '0'* '0'
    + * padSpec    := '*' padChar
    + * padChar    := '\\u0000'..'\\uFFFD' - quote
    + *  
    + * Notation:
    + *   X*       0 or more instances of X
    + *   X?       0 or 1 instances of X
    + *   X|Y      either X or Y
    + *   C..D     any character from C up to D, inclusive
    + *   S-T      characters in S, except those in T
      * 
    - * [Notes] - *

    - * If there is no explicit negative subpattern, - is prefixed to the - * positive form. That is, "0.00" alone is equivalent to "0.00;-0.00". - *

    - * Illegal formats, such as "#.#.#" in the same format, will cause a - * failing UErrorCode to be returned. - *

    - * The grouping separator is commonly used for thousands, but in some - * countries for ten-thousands. The interval is a constant number of - * digits between the grouping characters, such as 100,000,000 or 1,0000,0000. - * If you supply a pattern with multiple grouping characters, the interval - * between the last one and the end of the integer determines the primary - * grouping size, and the interval between the last two determines - * the secondary grouping size (see below); all others are ignored. - * So "#,##,###,####" == "###,###,####" == "##,#,###,####". - *

    - * Some locales have two different grouping intervals: One used for the - * least significant integer digits (the primary grouping size), and - * one used for all others (the secondary grouping size). For example, - * if the primary grouping interval is 3, and the secondary is 2, then - * this corresponds to the pattern "#,##,##0", and the number 123456789 - * is formatted as "12,34,56,789". - *

    - * This class only handles localized digits where the 10 digits are - * contiguous in Unicode, from 0 to 9. Other digits sets (such as - * superscripts) would need a different subclass. + * The first subpattern is for positive numbers. The second (optional) + * subpattern is for negative numbers. + * + *

    Not indicated in the BNF syntax above: + * + *

    • The grouping separator ',' can occur inside the integer and + * sigDigits elements, between any two pattern characters of that + * element, as long as the integer or sigDigits element is not + * followed by the exponent element. + * + *
    • Two grouping intervals are recognized: That between the + * decimal point and the first grouping symbol, and that + * between the first and second grouping symbols. These + * intervals are identical in most locales, but in some + * locales they differ. For example, the pattern + * "#,##,###" formats the number 123456789 as + * "12,34,56,789".
    • + * + *
    • The pad specifier padSpec may appear before the prefix, + * after the prefix, before the suffix, after the suffix, or not at all. + * + *
    • In place of '0', the digits '1' through '9' may be used to + * indicate a rounding increment. + *
    + * + *

    Parsing + * + *

    DecimalFormat parses all Unicode characters that represent + * decimal digits, as defined by u_charDigitValue(). In addition, + * DecimalFormat also recognizes as digits the ten consecutive + * characters starting with the localized zero digit defined in the + * DecimalFormatSymbols object. During formatting, the + * DecimalFormatSymbols-based digits are output. + * + *

    During parsing, grouping separators are ignored. + * + *

    If parse(UnicodeString&,Formattable&,ParsePosition&) + * fails to parse a string, it leaves the parse position unchanged. + * The convenience method parse(UnicodeString&,Formattable&,UErrorCode&) + * indicates parse failure by setting a failing + * UErrorCode. + * + *

    Formatting + * + *

    Formatting is guided by several parameters, all of which can be + * specified either using a pattern or using the API. The following + * description applies to formats that do not use scientific + * notation or significant digits. + * + *

    • If the number of actual integer digits exceeds the + * maximum integer digits, then only the least significant + * digits are shown. For example, 1997 is formatted as "97" if the + * maximum integer digits is set to 2. + * + *
    • If the number of actual integer digits is less than the + * minimum integer digits, then leading zeros are added. For + * example, 1997 is formatted as "01997" if the minimum integer digits + * is set to 5. + * + *
    • If the number of actual fraction digits exceeds the maximum + * fraction digits, then half-even rounding it performed to the + * maximum fraction digits. For example, 0.125 is formatted as "0.12" + * if the maximum fraction digits is 2. This behavior can be changed + * by specifying a rounding increment and a rounding mode. + * + *
    • If the number of actual fraction digits is less than the + * minimum fraction digits, then trailing zeros are added. + * For example, 0.125 is formatted as "0.1250" if the mimimum fraction + * digits is set to 4. + * + *
    • Trailing fractional zeros are not displayed if they occur + * j positions after the decimal, where j is less + * than the maximum fraction digits. For example, 0.10004 is + * formatted as "0.1" if the maximum fraction digits is four or less. + *
    + * + *

    Special Values + * + *

    NaN is represented as a single character, typically + * \\uFFFD. This character is determined by the + * DecimalFormatSymbols object. This is the only value for which + * the prefixes and suffixes are not used. + * + *

    Infinity is represented as a single character, typically + * \\u221E, with the positive or negative prefixes and suffixes + * applied. The infinity character is determined by the + * DecimalFormatSymbols object. + * + * Scientific Notation + * + *

    Numbers in scientific notation are expressed as the product of a mantissa + * and a power of ten, for example, 1234 can be expressed as 1.234 x 103. The + * mantissa is typically in the half-open interval [1.0, 10.0) or sometimes [0.0, 1.0), + * but it need not be. DecimalFormat supports arbitrary mantissas. + * DecimalFormat can be instructed to use scientific + * notation through the API or through the pattern. In a pattern, the exponent + * character immediately followed by one or more digit characters indicates + * scientific notation. Example: "0.###E0" formats the number 1234 as + * "1.234E3". + * + *

      + *
    • The number of digit characters after the exponent character gives the + * minimum exponent digit count. There is no maximum. Negative exponents are + * formatted using the localized minus sign, not the prefix and suffix + * from the pattern. This allows patterns such as "0.###E0 m/s". To prefix + * positive exponents with a localized plus sign, specify '+' between the + * exponent and the digits: "0.###E+0" will produce formats "1E+1", "1E+0", + * "1E-1", etc. (In localized patterns, use the localized plus sign rather than + * '+'.) + * + *
    • The minimum number of integer digits is achieved by adjusting the + * exponent. Example: 0.00123 formatted with "00.###E0" yields "12.3E-4". This + * only happens if there is no maximum number of integer digits. If there is a + * maximum, then the minimum number of integer digits is fixed at one. + * + *
    • The maximum number of integer digits, if present, specifies the exponent + * grouping. The most common use of this is to generate engineering + * notation, in which the exponent is a multiple of three, e.g., + * "##0.###E0". The number 12345 is formatted using "##0.####E0" as "12.345E3". + * + *
    • When using scientific notation, the formatter controls the + * digit counts using significant digits logic. The maximum number of + * significant digits limits the total number of integer and fraction + * digits that will be shown in the mantissa; it does not affect + * parsing. For example, 12345 formatted with "##0.##E0" is "12.3E3". + * See the section on significant digits for more details. + * + *
    • The number of significant digits shown is determined as + * follows: If areSignificantDigitsUsed() returns false, then the + * minimum number of significant digits shown is one, and the maximum + * number of significant digits shown is the sum of the minimum + * integer and maximum fraction digits, and is + * unaffected by the maximum integer digits. If this sum is zero, + * then all significant digits are shown. If + * areSignificantDigitsUsed() returns true, then the significant digit + * counts are specified by getMinimumSignificantDigits() and + * getMaximumSignificantDigits(). In this case, the number of + * integer digits is fixed at one, and there is no exponent grouping. + * + *
    • Exponential patterns may not contain grouping separators. + *
    + * + * Significant Digits + * + * DecimalFormat has two ways of controlling how many + * digits are shows: (a) significant digits counts, or (b) integer and + * fraction digit counts. Integer and fraction digit counts are + * described above. When a formatter is using significant digits + * counts, the number of integer and fraction digits is not specified + * directly, and the formatter settings for these counts are ignored. + * Instead, the formatter uses however many integer and fraction + * digits are required to display the specified number of significant + * digits. Examples: + * + * + * + * + * + * + * + *
    Pattern + * Minimum significant digits + * Maximum significant digits + * Number + * Output of format() + *
    \@\@\@ + * 3 + * 3 + * 12345 + * 12300 + *
    \@\@\@ + * 3 + * 3 + * 0.12345 + * 0.123 + *
    \@\@## + * 2 + * 4 + * 3.14159 + * 3.142 + *
    \@\@## + * 2 + * 4 + * 1.23004 + * 1.23 + *
    + * + *
      + *
    • Significant digit counts may be expressed using patterns that + * specify a minimum and maximum number of significant digits. These + * are indicated by the '@' and '#' + * characters. The minimum number of significant digits is the number + * of '@' characters. The maximum number of significant + * digits is the number of '@' characters plus the number + * of '#' characters following on the right. For + * example, the pattern "@@@" indicates exactly 3 + * significant digits. The pattern "@##" indicates from + * 1 to 3 significant digits. Trailing zero digits to the right of + * the decimal separator are suppressed after the minimum number of + * significant digits have been shown. For example, the pattern + * "@##" formats the number 0.1203 as + * "0.12". + * + *
    • If a pattern uses significant digits, it may not contain a + * decimal separator, nor the '0' pattern character. + * Patterns such as "@00" or "@.###" are + * disallowed. + * + *
    • Any number of '#' characters may be prepended to + * the left of the leftmost '@' character. These have no + * effect on the minimum and maximum significant digits counts, but + * may be used to position grouping separators. For example, + * "#,#@#" indicates a minimum of one significant digits, + * a maximum of two significant digits, and a grouping size of three. + * + *
    • In order to enable significant digits formatting, use a pattern + * containing the '@' pattern character. Alternatively, + * call setSignificantDigitsUsed(TRUE). + * + *
    • In order to disable significant digits formatting, use a + * pattern that does not contain the '@' pattern + * character. Alternatively, call setSignificantDigitsUsed(FALSE). + * + *
    • The number of significant digits has no effect on parsing. + * + *
    • Significant digits may be used together with exponential notation. Such + * patterns are equivalent to a normal exponential pattern with a minimum and + * maximum integer digit count of one, a minimum fraction digit count of + * getMinimumSignificantDigits() - 1, and a maximum fraction digit + * count of getMaximumSignificantDigits() - 1. For example, the + * pattern "@@###E0" is equivalent to "0.0###E0". + * + *
    • If signficant digits are in use, then the integer and fraction + * digit counts, as set via the API, are ignored. If significant + * digits are not in use, then the signficant digit counts, as set via + * the API, are ignored. + * + *
    + * + *

    Padding + * + *

    DecimalFormat supports padding the result of + * format() to a specific width. Padding may be specified either + * through the API or through the pattern syntax. In a pattern the pad escape + * character, followed by a single pad character, causes padding to be parsed + * and formatted. The pad escape character is '*' in unlocalized patterns, and + * can be localized using DecimalFormatSymbols::setSymbol() with a + * DecimalFormatSymbols::kPadEscapeSymbol + * selector. For example, "$*x#,##0.00" formats 123 to + * "$xx123.00", and 1234 to "$1,234.00". + * + *

      + *
    • When padding is in effect, the width of the positive subpattern, + * including prefix and suffix, determines the format width. For example, in + * the pattern "* #0 o''clock", the format width is 10. + * + *
    • The width is counted in 16-bit code units (UChars). + * + *
    • Some parameters which usually do not matter have meaning when padding is + * used, because the pattern width is significant with padding. In the pattern + * "* ##,##,#,##0.##", the format width is 14. The initial characters "##,##," + * do not affect the grouping size or maximum integer digits, but they do affect + * the format width. + * + *
    • Padding may be inserted at one of four locations: before the prefix, + * after the prefix, before the suffix, or after the suffix. If padding is + * specified in any other location, applyPattern() + * sets a failing UErrorCode. If there is no prefix, + * before the prefix and after the prefix are equivalent, likewise for the + * suffix. + * + *
    • When specified in a pattern, the 32-bit code point immediately + * following the pad escape is the pad character. This may be any character, + * including a special pattern character. That is, the pad escape + * escapes the following character. If there is no character after + * the pad escape, then the pattern is illegal. + * + *
    + * + *

    Rounding + * + *

    DecimalFormat supports rounding to a specific increment. For + * example, 1230 rounded to the nearest 50 is 1250. 1.234 rounded to the + * nearest 0.65 is 1.3. The rounding increment may be specified through the API + * or in a pattern. To specify a rounding increment in a pattern, include the + * increment in the pattern itself. "#,#50" specifies a rounding increment of + * 50. "#,##0.05" specifies a rounding increment of 0.05. + * + *

      + *
    • Rounding only affects the string produced by formatting. It does + * not affect parsing or change any numerical values. + * + *
    • A rounding mode determines how values are rounded; see + * DecimalFormat::ERoundingMode. Rounding increments specified in + * patterns use the default mode, DecimalFormat::kRoundHalfEven. + * + *
    • Some locales use rounding in their currency formats to reflect the + * smallest currency denomination. + * + *
    • In a pattern, digits '1' through '9' specify rounding, but otherwise + * behave identically to digit '0'. + *
    + * + *

    Synchronization + * + *

    DecimalFormat objects are not synchronized. Multiple + * threads should not access one formatter concurrently. + * + *

    Subclassing + * + *

    User subclasses are not supported. While clients may write + * subclasses, such code will not necessarily work and will not be + * guaranteed to work stably from release to release. */ class U_I18N_API DecimalFormat: public NumberFormat { public: - /** Rounding mode - * @draft ICU 2.4 - */ + /** + * Rounding mode. + * @stable ICU 2.4 + */ enum ERoundingMode { - kRoundCeiling, - kRoundFloor, - kRoundDown, - kRoundUp, - kRoundHalfEven, - kRoundHalfDown, - kRoundHalfUp + kRoundCeiling, /**< Round towards positive infinity */ + kRoundFloor, /**< Round towards negative infinity */ + kRoundDown, /**< Round towards zero */ + kRoundUp, /**< Round away from zero */ + kRoundHalfEven, /**< Round towards the nearest integer, or + towards the nearest even integer if equidistant */ + kRoundHalfDown, /**< Round towards the nearest integer, or + towards zero if equidistant */ + kRoundHalfUp /**< Round towards the nearest integer, or + away from zero if equidistant */ // We don't support ROUND_UNNECESSARY }; - /** Pad position - * @draft ICU 2.4 - */ + /** + * Pad position. + * @stable ICU 2.4 + */ enum EPadPosition { kPadBeforePrefix, kPadAfterPrefix, @@ -374,6 +794,21 @@ public: virtual UnicodeString& format(int32_t number, UnicodeString& appendTo, FieldPosition& pos) const; + /** + * Format an int64 number using base-10 representation. + * + * @param number The value to be formatted. + * @param appendTo Output parameter to receive result. + * Result is appended to existing contents. + * @param pos On input: an alignment field, if desired. + * On output: the offsets of the alignment field. + * @return Reference to 'appendTo' parameter. + * @draft ICU 2.8 + */ + virtual UnicodeString& format(int64_t number, + UnicodeString& appendTo, + FieldPosition& pos) const; + /** * Format a Formattable using base-10 representation. * @@ -433,12 +868,25 @@ public: UnicodeString& format(int32_t number, UnicodeString& appendTo) const; + /** + * Redeclared NumberFormat method. + * Format an int64 number. These methods call the NumberFormat + * pure virtual format() methods with the default FieldPosition. + * + * @param number The value to be formatted. + * @param appendTo Output parameter to receive result. + * Result is appended to existing contents. + * @return Reference to 'appendTo' parameter. + * @draft ICU 2.8 + */ + UnicodeString& format(int64_t number, + UnicodeString& appendTo) const; /** * Parse the given string using this object's choices. The method * does string comparisons to try to find an optimal match. * If no object can be parsed, index is unchanged, and NULL is * returned. The result is returned as the most parsimonious - * type of Formattable that will accomodate all of the + * type of Formattable that will accomodate all of the * necessary precision. For example, if the result is exactly 12, * it will be returned as a long. However, if it is 1.5, it will * be returned as a double. @@ -469,6 +917,29 @@ public: Formattable& result, UErrorCode& status) const; + /** + * Parses text from the given string as a currency amount. Unlike + * the parse() method, this method will attempt to parse a generic + * currency name, searching for a match of this object's locale's + * currency display names, or for a 3-letter ISO currency code. + * This method will fail if this format is not a currency format, + * that is, if it does not contain the currency pattern symbol + * (U+00A4) in its prefix or suffix. + * + * @param text the string to parse + * @param result output parameter to receive result. This will have + * its currency set to the parsed ISO currency code. + * @param pos input-output position; on input, the position within + * text to match; must have 0 <= pos.getIndex() < text.length(); + * on output, the position after the last matched character. If + * the parse fails, the position in unchanged upon output. + * @return a reference to result + * @internal + */ + virtual Formattable& parseCurrency(const UnicodeString& text, + Formattable& result, + ParsePosition& pos) const; + /** * Returns the decimal format symbols, which is generally not changed * by the programmer or user. @@ -575,7 +1046,7 @@ public: * Get the multiplier for use in percent, permill, etc. * For a percentage, set the suffixes to have "%" and the multiplier to be 100. * (For Arabic, use arabic percent symbol). - * For a permill, set the suffixes to have "\u2031" and the multiplier to be 1000. + * For a permill, set the suffixes to have "\\u2031" and the multiplier to be 1000. * * @return the multiplier for use in percent, permill, etc. * Examples: with 100, 1.23 -> "123", and "123" -> 1.23 @@ -587,7 +1058,7 @@ public: * Set the multiplier for use in percent, permill, etc. * For a percentage, set the suffixes to have "%" and the multiplier to be 100. * (For Arabic, use arabic percent symbol). - * For a permill, set the suffixes to have "\u2031" and the multiplier to be 1000. + * For a permill, set the suffixes to have "\\u2031" and the multiplier to be 1000. * * @param newValue the new value of the multiplier for use in percent, permill, etc. * Examples: with 100, 1.23 -> "123", and "123" -> 1.23 @@ -604,7 +1075,7 @@ public: * @see #setRoundingMode * @stable ICU 2.0 */ - virtual double getRoundingIncrement(void); + virtual double getRoundingIncrement(void) const; /** * Set the rounding increment. This method also controls whether @@ -626,7 +1097,7 @@ public: * @see #setRoundingMode * @stable ICU 2.0 */ - virtual ERoundingMode getRoundingMode(void); + virtual ERoundingMode getRoundingMode(void) const; /** * Set the rounding mode. This has no effect unless the rounding @@ -640,7 +1111,8 @@ public: virtual void setRoundingMode(ERoundingMode roundingMode); /** - * Get the width to which the output of format() is padded. + * Get the width to which the output of format() is padded. + * The width is counted in 16-bit code units. * @return the format width, or zero if no padding is in effect * @see #setFormatWidth * @see #getPadCharacter @@ -649,13 +1121,14 @@ public: * @see #setPadPosition * @stable ICU 2.0 */ - virtual int32_t getFormatWidth(void); + virtual int32_t getFormatWidth(void) const; /** - * Set the width to which the output of format() is padded. + * Set the width to which the output of format() is padded. + * The width is counted in 16-bit code units. * This method also controls whether padding is enabled. * @param width the width to which to pad the result of - * format(), or zero to disable padding. A negative + * format(), or zero to disable padding. A negative * width is equivalent to 0. * @see #getFormatWidth * @see #getPadCharacter @@ -667,11 +1140,10 @@ public: virtual void setFormatWidth(int32_t width); /** - * Get the grapheme string (a character, possibly with modifier letters) - * used to pad to the format width. The default is " ". - * Note: The current implementation only stores the first code unit of the - * pad string. - * @return the pad grapheme string + * Get the pad character used to pad to the format width. The + * default is ' '. + * @return a string containing the pad character. This will always + * have a length of one 32-bit code point. * @see #setFormatWidth * @see #getFormatWidth * @see #setPadCharacter @@ -679,15 +1151,15 @@ public: * @see #setPadPosition * @stable ICU 2.0 */ - virtual UnicodeString getPadCharacterString(); + virtual UnicodeString getPadCharacterString() const; /** - * Set the grapheme string (a character, possibly with modifier letters) - * used to pad to the format width. This has no effect - * unless padding is enabled. - * Note: The current implementation only stores the first code unit of the - * pad string. - * @param padChar the pad grapheme + * Set the character used to pad to the format width. If padding + * is not enabled, then this will take effect if padding is later + * enabled. + * @param padChar a string containing the pad charcter. If the string + * has length 0, then the pad characer is set to ' '. Otherwise + * padChar.char32At(0) will be used as the pad character. * @see #setFormatWidth * @see #getFormatWidth * @see #getPadCharacter @@ -699,11 +1171,11 @@ public: /** * Get the position at which padding will take place. This is the location - * at which padding will be inserted if the result of format() + * at which padding will be inserted if the result of format() * is shorter than the format width. - * @return the pad position, one of kPadBeforePrefix, - * kPadAfterPrefix, kPadBeforeSuffix, or - * kPadAfterSuffix. + * @return the pad position, one of kPadBeforePrefix, + * kPadAfterPrefix, kPadBeforeSuffix, or + * kPadAfterSuffix. * @see #setFormatWidth * @see #getFormatWidth * @see #setPadCharacter @@ -715,17 +1187,16 @@ public: * @see #kPadAfterSuffix * @stable ICU 2.0 */ - virtual EPadPosition getPadPosition(void); + virtual EPadPosition getPadPosition(void) const; /** - * NEW * Set the position at which padding will take place. This is the location - * at which padding will be inserted if the result of format() + * at which padding will be inserted if the result of format() * is shorter than the format width. This has no effect unless padding is * enabled. - * @param padPos the pad position, one of kPadBeforePrefix, - * kPadAfterPrefix, kPadBeforeSuffix, or - * kPadAfterSuffix. + * @param padPos the pad position, one of kPadBeforePrefix, + * kPadAfterPrefix, kPadBeforeSuffix, or + * kPadAfterSuffix. * @see #setFormatWidth * @see #getFormatWidth * @see #setPadCharacter @@ -752,7 +1223,11 @@ public: virtual UBool isScientificNotation(void); /** - * Set whether or not scientific notation is used. + * Set whether or not scientific notation is used. When scientific notation + * is used, the effective maximum number of integer digits is <= 8. If the + * maximum number of integer digits is set to more than 8, the effective + * maximum will be 1. This allows this call to generate a 'default' scientific + * number format without additional changes. * @param useScientific TRUE if this object formats and parses scientific * notation * @see #isScientificNotation @@ -774,7 +1249,7 @@ public: * @see #setExponentSignAlwaysShown * @stable ICU 2.0 */ - virtual int8_t getMinimumExponentDigits(void); + virtual int8_t getMinimumExponentDigits(void) const; /** * Set the minimum exponent digits that will be shown. This has no @@ -852,7 +1327,7 @@ public: * others (the secondary grouping size). A formatter supporting a * secondary grouping size will return a positive integer unequal * to the primary grouping size returned by - * getGroupingSize(). For example, if the primary + * getGroupingSize(). For example, if the primary * grouping size is 4, and the secondary grouping size is 2, then * the number 123456789 formats as "1,23,45,6789", and the pattern * appears as "#,##,###0". @@ -861,7 +1336,7 @@ public: * @see setSecondaryGroupingSize * @see NumberFormat::isGroupingUsed * @see DecimalFormatSymbols::getGroupingSeparator - * @draft ICU 2.4 + * @stable ICU 2.4 */ int32_t getSecondaryGroupingSize(void) const; @@ -874,7 +1349,7 @@ public: * @see getSecondaryGroupingSize * @see NumberFormat#setGroupingUsed * @see DecimalFormatSymbols::setGroupingSeparator - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual void setSecondaryGroupingSize(int32_t newValue); @@ -1056,6 +1531,65 @@ public: */ virtual void setMinimumFractionDigits(int32_t newValue); + /** + * Returns the minimum number of significant digits that will be + * displayed. This value has no effect unless areSignificantDigitsUsed() + * returns true. + * @return the fewest significant digits that will be shown + * @draft ICU 3.0 + */ + int32_t getMinimumSignificantDigits() const; + + /** + * Returns the maximum number of significant digits that will be + * displayed. This value has no effect unless areSignificantDigitsUsed() + * returns true. + * @return the most significant digits that will be shown + * @draft ICU 3.0 + */ + int32_t getMaximumSignificantDigits() const; + + /** + * Sets the minimum number of significant digits that will be + * displayed. If min is less than one then it is set + * to one. If the maximum significant digits count is less than + * min, then it is set to min. This + * value has no effect unless areSignificantDigits() returns true. + * @param min the fewest significant digits to be shown + * @draft ICU 3.0 + */ + void setMinimumSignificantDigits(int32_t min); + + /** + * Sets the maximum number of significant digits that will be + * displayed. If max is less than one then it is set + * to one. If the minimum significant digits count is greater + * than max, then it is set to max. + * This value has no effect unless areSignificantDigits() returns + * true. + * @param max the most significant digits to be shown + * @draft ICU 3.0 + */ + void setMaximumSignificantDigits(int32_t max); + + /** + * Returns true if significant digits are in use, or false if + * integer and fraction digit counts are in use. + * @return true if significant digits are in use + * @draft ICU 3.0 + */ + UBool areSignificantDigitsUsed() const; + + /** + * Sets whether significant digits are in use, or integer and + * fraction digit counts are in use. + * @param useSignificantDigits true to use significant digits, or + * false to use integer and fraction digit counts + * @draft ICU 3.0 + */ + void setSignificantDigitsUsed(UBool useSignificantDigits); + + public: /** * Sets the currency used to display currency * amounts. This takes effect immediately, if this format is a @@ -1063,8 +1597,17 @@ public: * the currency is used if and when this object becomes a * currency format through the application of a new pattern. * @param theCurrency a 3-letter ISO code indicating new currency - * to use. It need not be null-terminated. - * @draft ICU 2.2 + * to use. It need not be null-terminated. May be the empty + * string or NULL to indicate no currency. + * @param ec input-output error code + * @draft ICU 3.0 + */ + virtual void setCurrency(const UChar* theCurrency, UErrorCode& ec); + + /** + * Sets the currency used to display currency amounts. See + * setCurrency(const UChar*, UErrorCode&). + * @deprecated ICU 3.0. Use setCurrency(const UChar*, UErrorCode&). */ virtual void setCurrency(const UChar* theCurrency); @@ -1088,7 +1631,7 @@ public: * @return The class ID for all objects of this class. * @stable ICU 2.0 */ - static inline UClassID getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(void); /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. @@ -1104,10 +1647,10 @@ public: virtual UClassID getDynamicClassID(void) const; private: - static const char fgClassID; - DecimalFormat(); // default constructor not implemented + int32_t precision(UBool isIntegral) const; + /** * Do real work of constructing a new DecimalFormat. */ @@ -1157,32 +1700,27 @@ private: DigitList& digits, UBool isInteger) const; + void parse(const UnicodeString& text, + Formattable& result, + ParsePosition& pos, + UBool parseCurrency) const; + enum { fgStatusInfinite, fgStatusLength // Leave last in list. } StatusFlags; - /** - * Parse the given text into a number. The text is parsed beginning at - * parsePosition, until an unparseable character is seen. - * @param text The string to parse. - * @param parsePosition The position at which to being parsing. Upon - * return, the first unparseable character. - * @param digits The DigitList to set to the parsed value. - * @param isExponent If true, parse an exponent. This means no - * infinite values and integer only. - * @param status Upon return contains boolean status flags indicating - * whether the value was infinite and whether it was positive. - */ UBool subparse(const UnicodeString& text, ParsePosition& parsePosition, - DigitList& digits, UBool* status) const; + DigitList& digits, UBool* status, + UChar* currency) const; int32_t skipPadding(const UnicodeString& text, int32_t position) const; int32_t compareAffix(const UnicodeString& input, int32_t pos, UBool isNegative, - UBool isPrefix) const; + UBool isPrefix, + UChar* currency) const; static int32_t compareSimpleAffix(const UnicodeString& affix, const UnicodeString& input, @@ -1194,7 +1732,8 @@ private: int32_t compareComplexAffix(const UnicodeString& affixPat, const UnicodeString& input, - int32_t pos) const; + int32_t pos, + UChar* currency) const; static int32_t match(const UnicodeString& text, int32_t pos, UChar32 ch); @@ -1267,13 +1806,17 @@ private: int32_t fMultiplier; int32_t fGroupingSize; int32_t fGroupingSize2; - UBool fDecimalSeparatorAlwaysShown; - /*transient*/ UBool fIsCurrencyFormat; + UBool fDecimalSeparatorAlwaysShown; + /*transient*/ UBool fIsCurrencyFormat; DecimalFormatSymbols* fSymbols; - UBool fUseExponentialNotation; + UBool fUseSignificantDigits; + int32_t fMinSignificantDigits; + int32_t fMaxSignificantDigits; + + UBool fUseExponentialNotation; int8_t fMinExponentDigits; - UBool fExponentSignAlwaysShown; + UBool fExponentSignAlwaysShown; /* If fRoundingIncrement is NULL, there is no rounding. Otherwise, round to * fRoundingIncrement.getDouble(). Since this operation may be expensive, @@ -1287,47 +1830,39 @@ private: int32_t fFormatWidth; EPadPosition fPadPosition; - // Constants for characters used in programmatic (unlocalized) patterns. - static const UChar kPatternZeroDigit; - static const UChar kPatternGroupingSeparator; - static const UChar kPatternDecimalSeparator; - static const UChar kPatternPerMill; - static const UChar kPatternPercent; - static const UChar kPatternDigit; - static const UChar kPatternSeparator; - static const UChar kPatternExponent; - static const UChar kPatternPlus; - static const UChar kPatternMinus; - static const UChar kPatternPadEscape; - - /** - * The CURRENCY_SIGN is the standard Unicode symbol for currency. It - * is used in patterns and substitued with either the currency symbol, - * or if it is doubled, with the international currency symbol. If the - * CURRENCY_SIGN is seen in a pattern, then the decimal separator is - * replaced with the monetary decimal separator. - */ - static const UChar kCurrencySign; - static const UChar kQuote; - protected: + + /** + * Returns the currency in effect for this formatter. Subclasses + * should override this method as needed. Unlike getCurrency(), + * this method should never return "". + * @result output parameter for null-terminated result, which must + * have a capacity of at least 4 + * @internal + */ + virtual void getEffectiveCurrency(UChar* result, UErrorCode& ec) const; + /** number of integer digits - * @draft ICU 2.4 + * @stable ICU 2.4 */ static const int32_t kDoubleIntegerDigits; /** number of fraction digits - * @draft ICU 2.4 + * @stable ICU 2.4 */ static const int32_t kDoubleFractionDigits; -}; -inline UClassID -DecimalFormat::getStaticClassID(void) -{ return (UClassID)&fgClassID; } - -inline UClassID -DecimalFormat::getDynamicClassID(void) const -{ return DecimalFormat::getStaticClassID(); } + /** + * When someone turns on scientific mode, we assume that more than this + * number of digits is due to flipping from some other mode that didn't + * restrict the maximum, and so we force 1 integer digit. We don't bother + * to track and see if someone is using exponential notation with more than + * this number, it wouldn't make sense anyway, and this is just to make sure + * that someone turning on scientific mode with default settings doesn't + * end up with lots of zeroes. + * @draft ICU 2.8 + */ + static const int32_t kMaxScientificIntegerDigits; +}; inline UnicodeString& DecimalFormat::format(const Formattable& obj, @@ -1349,7 +1884,7 @@ inline UnicodeString& DecimalFormat::format(int32_t number, UnicodeString& appendTo) const { FieldPosition pos(0); - return format(number, appendTo, pos); + return format((int64_t)number, appendTo, pos); } inline const UnicodeString & diff --git a/icuSources/i18n/unicode/dtfmtsym.h b/icuSources/i18n/unicode/dtfmtsym.h index 80eb670d..dfe3b868 100644 --- a/icuSources/i18n/unicode/dtfmtsym.h +++ b/icuSources/i18n/unicode/dtfmtsym.h @@ -1,6 +1,6 @@ /* ******************************************************************************** -* Copyright (C) 1997-2003, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************** * @@ -24,7 +24,7 @@ #include "unicode/uobject.h" #include "unicode/locid.h" -#include "unicode/resbund.h" +#include "unicode/ures.h" U_NAMESPACE_BEGIN @@ -150,7 +150,7 @@ public: * subclassed. * @stable ICU 2.0 */ - ~DateFormatSymbols(); + virtual ~DateFormatSymbols(); /** * Return true if another object is semantically equal to this one. @@ -292,7 +292,7 @@ public: * @return the non-localized date-time pattern characters * @stable ICU 2.0 */ - static const UChar *getPatternUChars(void); + static const UChar * U_EXPORT2 getPatternUChars(void); /** * Gets localized date-time pattern characters. For example: 'u', 't', etc. @@ -310,33 +310,28 @@ public: */ void setLocalPatternChars(const UnicodeString& newLocalPatternChars); + /** + * Returns the locale for this object. Two flavors are available: + * valid and actual locale. + * @draft ICU 2.8 likely to change in ICU 3.0, based on feedback + */ + Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const; + /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const; + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ - static inline UClassID getStaticClassID(); + static UClassID U_EXPORT2 getStaticClassID(); private: - /** - * Tag names used by this class. - */ - static const char fgErasTag[]; // resource bundle tag for era names - static const char fgMonthNamesTag[]; // resource bundle tag for month names - static const char fgMonthAbbreviationsTag[]; // resource bundle tag for month abbreviations - static const char fgDayNamesTag[]; // resource bundle tag for day names - static const char fgDayAbbreviationsTag[]; // resource bundle tag for day abbreviations - static const char fgAmPmMarkersTag[]; // resource bundle tag for AM/PM strings - - static const char fgZoneStringsTag[]; // resource bundle tag for time zone names - static const char fgLocalPatternCharsTag[]; // resource bundle tag for localized pattern characters friend class SimpleDateFormat; friend class DateFormatSymbolsSingleSetter; // see udat.cpp @@ -389,13 +384,13 @@ private: */ UnicodeString fLocalPatternChars; - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". +private: + /** valid/actual locale information + * these are always ICU locales, so the length should not be a problem */ - static const char fgClassID; + char validLocale[ULOC_FULLNAME_CAPACITY]; + char actualLocale[ULOC_FULLNAME_CAPACITY]; -private: /* Sizes for the last resort string arrays */ typedef enum LastResortSize { @@ -417,22 +412,9 @@ private: DateFormatSymbols(); // default constructor not implemented - void initField(UnicodeString **field, int32_t& length, const ResourceBundle data, UErrorCode &status); + void initField(UnicodeString **field, int32_t& length, const UResourceBundle *data, UErrorCode &status); void initField(UnicodeString **field, int32_t& length, const UChar *data, LastResortSize numStr, LastResortSize strLen, UErrorCode &status); - /** - * Load data for specified 'type', falling back to gregorian if needed - * - * @param rb ResourceBundle - * @param tag Resource key to data - * @param type Calendar type - * @param status Error Status - * @internal - */ - static ResourceBundle - getData(ResourceBundle &rb, const char *tag, const char *type, UErrorCode& status); - - /** * Called by the constructors to actually load data from the resources * @@ -510,14 +492,6 @@ private: void disposeZoneStrings(void); }; -inline UClassID -DateFormatSymbols::getStaticClassID() -{ return (UClassID)&fgClassID; } - -inline UClassID -DateFormatSymbols::getDynamicClassID() const -{ return DateFormatSymbols::getStaticClassID(); } - U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/i18n/unicode/fieldpos.h b/icuSources/i18n/unicode/fieldpos.h index 97eea64f..bb46a970 100644 --- a/icuSources/i18n/unicode/fieldpos.h +++ b/icuSources/i18n/unicode/fieldpos.h @@ -1,19 +1,20 @@ /* -******************************************************************************** -* Copyright (C) 1997-2003, International Business Machines -* Corporation and others. All Rights Reserved. -******************************************************************************** -* -* File FIELDPOS.H -* -* Modification History: -* -* Date Name Description -* 02/25/97 aliu Converted from java. -* 03/17/97 clhuang Updated per Format implementation. -* 07/17/98 stephen Added default/copy ctors, and operators =, ==, != -******************************************************************************** -*/ + ******************************************************************************** + * Copyright (C) 1997-2004, International Business Machines + * Corporation and others. All Rights Reserved. + ******************************************************************************** + * + * File FIELDPOS.H + * + * Modification History: + * + * Date Name Description + * 02/25/97 aliu Converted from java. + * 03/17/97 clhuang Updated per Format implementation. + * 07/17/98 stephen Added default/copy ctors, and operators =, ==, != + ******************************************************************************** + */ + // ***************************************************************************** // This file was generated from the java source file FieldPosition.java // ***************************************************************************** @@ -50,6 +51,8 @@ U_NAMESPACE_BEGIN * to perform partial formatting or to get information about the * formatted output (such as the position of a field). * + * The FieldPosition class is not suitable for subclassing. + * *

    * Below is an example of using FieldPosition to aid * alignment of an array of formatted floating-point numbers on @@ -94,7 +97,7 @@ U_NAMESPACE_BEGIN * 1.234 * \endcode *

    -*/ + */ class U_I18N_API FieldPosition : public UObject { public: /** @@ -136,7 +139,7 @@ public: * Destructor * @stable ICU 2.0 */ - ~FieldPosition() {} + virtual ~FieldPosition(); /** * Assignment operator @@ -161,6 +164,19 @@ public: */ UBool operator!=(const FieldPosition& that) const; + /** + * Clone this object. + * Clones can be used concurrently in multiple threads. + * If an error occurs, then NULL is returned. + * The caller must delete the clone. + * + * @return a clone of this object + * + * @see getDynamicClassID + * @draft ICU 2.8 + */ + FieldPosition *clone() const; + /** * Retrieve the field identifier. * @return the field identifier. @@ -208,16 +224,16 @@ public: /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const; + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ - static inline UClassID getStaticClassID(); + static UClassID U_EXPORT2 getStaticClassID(); private: /** @@ -237,20 +253,8 @@ private: * If the field does not occur in the text, 0 is returned. */ int32_t fEndIndex; - - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; -inline UClassID FieldPosition::getStaticClassID() -{ return (UClassID)&fgClassID; } - -inline UClassID FieldPosition::getDynamicClassID() const -{ return FieldPosition::getStaticClassID(); } - inline FieldPosition& FieldPosition::operator=(const FieldPosition& copy) { diff --git a/icuSources/i18n/unicode/fmtable.h b/icuSources/i18n/unicode/fmtable.h index 02179ac9..c2aeec7f 100644 --- a/icuSources/i18n/unicode/fmtable.h +++ b/icuSources/i18n/unicode/fmtable.h @@ -1,6 +1,6 @@ /* ******************************************************************************** -* Copyright (C) 1997-2003, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************** * @@ -15,14 +15,11 @@ #ifndef FMTABLE_H #define FMTABLE_H - #include "unicode/utypes.h" +#include "unicode/unistr.h" #if !UCONFIG_NO_FORMATTING -#include "unicode/uobject.h" -#include "unicode/unistr.h" - U_NAMESPACE_BEGIN /** @@ -30,16 +27,18 @@ U_NAMESPACE_BEGIN * its subclasses for formatting. Formattable is a thin wrapper * class which interconverts between the primitive numeric types * (double, long, etc.) as well as UDate and UnicodeString. - *

    - * Note that this is fundamentally different from the Java behavior, since - * in this case the various formattable objects do not occupy a hierarchy, - * but are all wrapped within this one class. Formattable encapsulates all - * the polymorphism in itself. - *

    - * It would be easy to change this so that Formattable was an abstract base - * class of a genuine hierarchy, and that would clean up the code that - * currently must explicitly check for type, but that seems like overkill at - * this point. + * + *

    Internally, a Formattable object is a union of primitive types. + * As such, it can only store one flavor of data at a time. To + * determine what flavor of data it contains, use the getType method. + * + *

    As of ICU 3.0, Formattable may also wrap a UObject pointer, + * which it owns. This allows an instance of any ICU class to be + * encapsulated in a Formattable. For legacy reasons and for + * efficiency, primitive numeric types are still stored directly + * within a Formattable. + * + *

    The Formattable class is not suitable for subclassing. */ class U_I18N_API Formattable : public UObject { public: @@ -50,15 +49,16 @@ public: * since UDate is currently typedefed to be either double or long. * If UDate is changed later to be a bonafide class * or struct, then we no longer need this enum. - * @draft ICU 2.4 + * @stable ICU 2.4 */ enum ISDATE { kIsDate }; /** * Default constructor - * @draft ICU 2.4 + * @stable ICU 2.4 */ Formattable(); // Type kLong, value 0 + /** * Creates a Formattable object with a UDate instance. * @param d the UDate instance. @@ -66,18 +66,28 @@ public: * @stable ICU 2.0 */ Formattable(UDate d, ISDATE flag); + /** * Creates a Formattable object with a double number. * @param d the double number. * @stable ICU 2.0 */ Formattable(double d); + /** * Creates a Formattable object with a long number. * @param l the long number. * @stable ICU 2.0 */ Formattable(int32_t l); + + /** + * Creates a Formattable object with an int64_t number + * @param ll the int64_t number. + * @draft ICU 2.8 + */ + Formattable(int64_t ll); + /** * Creates a Formattable object with a char string pointer. * Assumes that the char string is null terminated. @@ -85,18 +95,21 @@ public: * @stable ICU 2.0 */ Formattable(const char* strToCopy); + /** * Creates a Formattable object with a UnicodeString object to copy from. * @param strToCopy the UnicodeString string. * @stable ICU 2.0 */ Formattable(const UnicodeString& strToCopy); + /** * Creates a Formattable object with a UnicodeString object to adopt from. * @param strToAdopt the UnicodeString string. * @stable ICU 2.0 */ Formattable(UnicodeString* strToAdopt); + /** * Creates a Formattable object with an array of Formattable objects. * @param arrayToCopy the Formattable object array. @@ -105,17 +118,26 @@ public: */ Formattable(const Formattable* arrayToCopy, int32_t count); + /** + * Creates a Formattable object that adopts the given UObject. + * @param objectToAdopt the UObject to set this object to + * @draft ICU 3.0 + */ + Formattable(UObject* objectToAdopt); + /** * Copy constructor. * @stable ICU 2.0 */ Formattable(const Formattable&); + /** * Assignment operator. * @param rhs The Formattable object to copy into this object. * @stable ICU 2.0 */ Formattable& operator=(const Formattable &rhs); + /** * Equality comparison. * @param other the object to be compared with. @@ -139,17 +161,75 @@ public: */ virtual ~Formattable(); + /** + * Clone this object. + * Clones can be used concurrently in multiple threads. + * If an error occurs, then NULL is returned. + * The caller must delete the clone. + * + * @return a clone of this object + * + * @see getDynamicClassID + * @draft ICU 2.8 + */ + Formattable *clone() const; + /** - * The list of possible data types of this Formattable object. - * @draft ICU 2.4 + * Selector for flavor of data type contained within a + * Formattable object. Formattable is a union of several + * different types, and at any time contains exactly one type. + * @stable ICU 2.4 */ enum Type { - kDate, // Date - kDouble, // double - kLong, // long - kString, // UnicodeString - kArray // Formattable[] - }; + /** + * Selector indicating a UDate value. Use getDate to retrieve + * the value. + * @stable ICU 2.4 + */ + kDate, + + /** + * Selector indicating a double value. Use getDouble to + * retrieve the value. + * @stable ICU 2.4 + */ + kDouble, + + /** + * Selector indicating a 32-bit integer value. Use getLong to + * retrieve the value. + * @stable ICU 2.4 + */ + kLong, + + /** + * Selector indicating a UnicodeString value. Use getString + * to retrieve the value. + * @stable ICU 2.4 + */ + kString, + + /** + * Selector indicating an array of Formattables. Use getArray + * to retrieve the value. + * @stable ICU 2.4 + */ + kArray, + + /** + * Selector indicating a 64-bit integer value. Use getInt64 + * to retrieve the value. + * @draft ICU 2.8 + */ + kInt64, + + /** + * Selector indicating a UObject value. Use getObject to + * retrieve the value. + * @draft ICU 3.0 + */ + kObject + }; /** * Gets the data type of this Formattable object. @@ -159,26 +239,107 @@ public: Type getType(void) const; /** - * Gets the double value of this object. + * Returns TRUE if the data type of this Formattable object + * is kDouble, kLong, or kInt64. + * @return TRUE if this is a pure numeric object + * @draft ICU 3.0 + */ + UBool isNumeric() const; + + /** + * Gets the double value of this object. If this object is not of type + * kDouble then the result is undefined. * @return the double value of this object. * @stable ICU 2.0 */ double getDouble(void) const { return fValue.fDouble; } + + /** + * Gets the double value of this object. If this object is of type + * long or int64 then a casting conversion is peformed, with + * possible loss of precision. If the type is kObject and the + * object is a Measure, then the result of + * getNumber().getDouble(status) is returned. If this object is + * neither a numeric type nor a Measure, then 0 is returned and + * the status is set to U_INVALID_FORMAT_ERROR. + * @param status the error code + * @return the double value of this object. + * @draft ICU 3.0 + */ + double getDouble(UErrorCode& status) const; + /** - * Gets the long value of this object. + * Gets the long value of this object. If this object is not of type + * kLong then the result is undefined. * @return the long value of this object. * @stable ICU 2.0 */ - int32_t getLong(void) const { return fValue.fLong; } + int32_t getLong(void) const { return (int32_t)fValue.fInt64; } + + /** + * Gets the long value of this object. If the magnitude is too + * large to fit in a long, then the maximum or minimum long value, + * as appropriate, is returned and the status is set to + * U_INVALID_FORMAT_ERROR. If this object is of type kInt64 and + * it fits within a long, then no precision is lost. If it is of + * type kDouble, then a casting conversion is peformed, with + * truncation of any fractional part. If the type is kObject and + * the object is a Measure, then the result of + * getNumber().getLong(status) is returned. If this object is + * neither a numeric type nor a Measure, then 0 is returned and + * the status is set to U_INVALID_FORMAT_ERROR. + * @param status the error code + * @return the long value of this object. + * @draft ICU 3.0 + */ + int32_t getLong(UErrorCode& status) const; + + /** + * Gets the int64 value of this object. If this object is not of type + * kInt64 then the result is undefined. + * @return the int64 value of this object. + * @draft ICU 2.8 + */ + int64_t getInt64(void) const { return fValue.fInt64; } + + /** + * Gets the int64 value of this object. If this object is of type + * kDouble and the magnitude is too large to fit in an int64, then + * the maximum or minimum int64 value, as appropriate, is returned + * and the status is set to U_INVALID_FORMAT_ERROR. If the + * magnitude fits in an int64, then a casting conversion is + * peformed, with truncation of any fractional part. If the type + * is kObject and the object is a Measure, then the result of + * getNumber().getDouble(status) is returned. If this object is + * neither a numeric type nor a Measure, then 0 is returned and + * the status is set to U_INVALID_FORMAT_ERROR. + * @param status the error code + * @return the int64 value of this object. + * @draft ICU 3.0 + */ + int64_t getInt64(UErrorCode& status) const; + /** - * Gets the Date value of this object. + * Gets the Date value of this object. If this object is not of type + * kDate then the result is undefined. * @return the Date value of this object. * @stable ICU 2.0 */ - UDate getDate(void) const { return fValue.fDate; } + UDate getDate() const { return fValue.fDate; } /** - * Gets the string value of this object. + * Gets the Date value of this object. If the type is not a date, + * status is set to U_INVALID_FORMAT_ERROR and the return value is + * undefined. + * @param status the error code. + * @return the Date value of this object. + * @draft ICU 3.0 + */ + UDate getDate(UErrorCode& status) const; + + /** + * Gets the string value of this object. If this object is not of type + * kString then the result is undefined. * @param result Output param to receive the Date value of this object. * @return A reference to 'result'. * @stable ICU 2.0 @@ -187,21 +348,56 @@ public: { result=*fValue.fString; return result; } /** - * Gets a const reference to the string value of this object. + * Gets the string value of this object. If the type is not a + * string, status is set to U_INVALID_FORMAT_ERROR and a bogus + * string is returned. + * @param result Output param to receive the Date value of this object. + * @param status the error code. + * @return A reference to 'result'. + * @draft ICU 3.0 + */ + UnicodeString& getString(UnicodeString& result, UErrorCode& status) const; + + /** + * Gets a const reference to the string value of this object. If + * this object is not of type kString then the result is + * undefined. * @return a const reference to the string value of this object. * @stable ICU 2.0 */ inline const UnicodeString& getString(void) const; /** - * Gets a reference to the string value of this object. + * Gets a const reference to the string value of this object. If + * the type is not a string, status is set to + * U_INVALID_FORMAT_ERROR and the result is a bogus string. + * @param status the error code. + * @return a const reference to the string value of this object. + * @draft ICU 3.0 + */ + const UnicodeString& getString(UErrorCode& status) const; + + /** + * Gets a reference to the string value of this object. If this + * object is not of type kString then the result is undefined. * @return a reference to the string value of this object. * @stable ICU 2.0 */ inline UnicodeString& getString(void); /** - * Gets the array value and count of this object. + * Gets a reference to the string value of this object. If the + * type is not a string, status is set to U_INVALID_FORMAT_ERROR + * and the result is a bogus string. + * @param status the error code. + * @return a reference to the string value of this object. + * @draft ICU 3.0 + */ + UnicodeString& getString(UErrorCode& status); + + /** + * Gets the array value and count of this object. If this object + * is not of type kArray then the result is undefined. * @param count fill-in with the count of this object. * @return the array value of this object. * @stable ICU 2.0 @@ -210,69 +406,128 @@ public: { count=fValue.fArrayAndCount.fCount; return fValue.fArrayAndCount.fArray; } /** - * Accesses the specified element in the array value of this Formattable object. + * Gets the array value and count of this object. If the type is + * not an array, status is set to U_INVALID_FORMAT_ERROR, count is + * set to 0, and the result is NULL. + * @param count fill-in with the count of this object. + * @param status the error code. + * @return the array value of this object. + * @draft ICU 3.0 + */ + const Formattable* getArray(int32_t& count, UErrorCode& status) const; + + /** + * Accesses the specified element in the array value of this + * Formattable object. If this object is not of type kArray then + * the result is undefined. * @param index the specified index. * @return the accessed element in the array. * @stable ICU 2.0 */ Formattable& operator[](int32_t index) { return fValue.fArrayAndCount.fArray[index]; } + + /** + * Returns a pointer to the UObject contained within this + * formattable, or NULL if this object does not contain a UObject. + * @return a UObject pointer, or NULL + * @draft ICU 3.0 + */ + const UObject* getObject() const; /** - * Sets the double value of this object. + * Sets the double value of this object and changes the type to + * kDouble. * @param d the new double value to be set. * @stable ICU 2.0 */ void setDouble(double d); + /** - * Sets the long value of this object. + * Sets the long value of this object and changes the type to + * kLong. * @param l the new long value to be set. * @stable ICU 2.0 */ void setLong(int32_t l); + + /** + * Sets the int64 value of this object and changes the type to + * kInt64. + * @param ll the new int64 value to be set. + * @draft ICU 2.8 + */ + void setInt64(int64_t ll); + /** - * Sets the Date value of this object. + * Sets the Date value of this object and changes the type to + * kDate. * @param d the new Date value to be set. * @stable ICU 2.0 */ void setDate(UDate d); + /** - * Sets the string value of this object. + * Sets the string value of this object and changes the type to + * kString. * @param stringToCopy the new string value to be set. * @stable ICU 2.0 */ void setString(const UnicodeString& stringToCopy); + /** - * Sets the array value and count of this object. + * Sets the array value and count of this object and changes the + * type to kArray. * @param array the array value. * @param count the number of array elements to be copied. * @stable ICU 2.0 */ void setArray(const Formattable* array, int32_t count); + /** - * Sets and adopts the string value and count of this object. + * Sets and adopts the string value and count of this object and + * changes the type to kArray. * @param stringToAdopt the new string value to be adopted. * @stable ICU 2.0 */ void adoptString(UnicodeString* stringToAdopt); + /** - * Sets and adopts the array value and count of this object. + * Sets and adopts the array value and count of this object and + * changes the type to kArray. * @stable ICU 2.0 */ void adoptArray(Formattable* array, int32_t count); - + + /** + * Sets and adopts the UObject value of this object and changes + * the type to kObject. After this call, the caller must not + * delete the given object. + * @param objectToAdopt the UObject value to be adopted + * @draft ICU 3.0 + */ + void adoptObject(UObject* objectToAdopt); + /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const; + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ - static inline UClassID getStaticClassID(); + static UClassID U_EXPORT2 getStaticClassID(); + + /** + * Deprecated variant of getLong(UErrorCode&). + * @param status the error code + * @return the long value of this object. + * @deprecated ICU 3.0 use getLong(UErrorCode&) instead + */ + inline int32_t getLong(UErrorCode* status) const; private: /** @@ -290,36 +545,24 @@ private: */ static Formattable* createArrayCopy(const Formattable* array, int32_t count); - // Note: For now, we do not handle unsigned long and unsigned - // double types. Smaller unsigned types, such as unsigned - // short, can fit within a long. + UnicodeString* getBogus() const; + union { + UObject* fObject; UnicodeString* fString; double fDouble; - int32_t fLong; - UDate fDate; - struct - { + int64_t fInt64; + UDate fDate; + struct { Formattable* fArray; - int32_t fCount; + int32_t fCount; } fArrayAndCount; - } fValue; + } fValue; Type fType; - - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; + UnicodeString fBogus; // Bogus string when it's needed. }; -inline UClassID Formattable::getStaticClassID() -{ return (UClassID)&fgClassID; } - -inline UClassID Formattable::getDynamicClassID() const -{ return Formattable::getStaticClassID(); } - inline Formattable* Formattable::createArrayCopy(const Formattable* array, int32_t count) { @@ -328,6 +571,16 @@ Formattable::createArrayCopy(const Formattable* array, int32_t count) return result; } +inline UDate Formattable::getDate(UErrorCode& status) const { + if (fType != kDate) { + if (U_SUCCESS(status)) { + status = U_INVALID_FORMAT_ERROR; + } + return 0; + } + return fValue.fDate; +} + inline const UnicodeString& Formattable::getString(void) const { return *fValue.fString; } @@ -336,10 +589,14 @@ inline UnicodeString& Formattable::getString(void) { return *fValue.fString; } +inline int32_t Formattable::getLong(UErrorCode* status) const { + return getLong(*status); +} + U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ #endif //_FMTABLE //eof - + diff --git a/icuSources/i18n/unicode/format.h b/icuSources/i18n/unicode/format.h index b773b7a0..180c1f2a 100644 --- a/icuSources/i18n/unicode/format.h +++ b/icuSources/i18n/unicode/format.h @@ -1,6 +1,6 @@ /* ******************************************************************************** -* Copyright (C) {1997-2003}, International Business Machines Corporation and others. All Rights Reserved. +* Copyright (C) {1997-2004}, International Business Machines Corporation and others. All Rights Reserved. ******************************************************************************** * * File FORMAT.H @@ -25,14 +25,15 @@ #if !UCONFIG_NO_FORMATTING -#include "unicode/uobject.h" #include "unicode/unistr.h" #include "unicode/fmtable.h" #include "unicode/fieldpos.h" #include "unicode/parsepos.h" #include "unicode/parseerr.h" +#include "unicode/locid.h" U_NAMESPACE_BEGIN + /** * Base class for all formats. This is an abstract base class which * specifies the protocol for classes which convert other objects or @@ -79,19 +80,15 @@ U_NAMESPACE_BEGIN * retured for methods which take no ParsePosition. For the method * that takes a ParsePosition, the index parameter is left unchanged. *

    - * [Subclassing.] All base classes that provide static functions that - * create objects for Locales must implement the following static: - *

    - * \code
    - *       public static const Locale* getAvailableLocales(long&)
    - * \endcode
    - * 
    + * User subclasses are not supported. While clients may write + * subclasses, such code will not necessarily work and will not be + * guaranteed to work stably from release to release. */ class U_I18N_API Format : public UObject { public: /** Destructor - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual ~Format(); @@ -221,12 +218,7 @@ public: * This method is to implement a simple version of RTTI, since not all * C++ compilers support genuine RTTI. Polymorphic operator==() and * clone() methods call this method. - *

    * Concrete subclasses of Format must implement getDynamicClassID() - * and also a static method and data member: - * - * static UClassID getStaticClassID() { return (UClassID)&fgClassID; } - * static char fgClassID; * * @return The class ID for this object. All objects of a * given class have the same class ID. Objects of @@ -235,6 +227,26 @@ public: */ virtual UClassID getDynamicClassID() const = 0; + /** Get the locale for this format object. You can choose between valid and actual locale. + * @param type type of the locale we're looking for (valid or actual) + * @param status error code for the operation + * @return the locale + * @draft ICU 2.8 likely to change in ICU 3.0, based on feedback + */ + Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const; + + /** Get the locale for this format object. You can choose between valid and actual locale. + * @param type type of the locale we're looking for (valid or actual) + * @param status error code for the operation + * @return the locale + * @internal + */ + const char* getLocaleID(ULocDataLocaleType type, UErrorCode &status) const; + + protected: + /** @draft ICU 2.8 */ + void setLocaleIDs(const char* valid, const char* actual); + protected: /** * Default constructor for subclass use only. Does nothing. @@ -259,11 +271,15 @@ protected: * @param pattern The pattern to copy into the parseError * @param pos The position in pattern where the error occured * @param parseError The UParseError object to fill in - * @draft ICU 2.4 + * @stable ICU 2.4 */ static void syntaxError(const UnicodeString& pattern, int32_t pos, UParseError& parseError); + + private: + char actualLocale[ULOC_FULLNAME_CAPACITY]; + char validLocale[ULOC_FULLNAME_CAPACITY]; }; U_NAMESPACE_END diff --git a/icuSources/i18n/unicode/gregocal.h b/icuSources/i18n/unicode/gregocal.h index 6f8e6d53..5cd03910 100644 --- a/icuSources/i18n/unicode/gregocal.h +++ b/icuSources/i18n/unicode/gregocal.h @@ -1,5 +1,5 @@ /* -* Copyright (C) {1997-2003}, International Business Machines Corporation and others. All Rights Reserved. +* Copyright (C) {1997-2004}, International Business Machines Corporation and others. All Rights Reserved. ******************************************************************************** * * File GREGOCAL.H @@ -16,6 +16,7 @@ * Added documentation of WEEK_OF_YEAR computation. * 10/15/99 aliu Fixed j32, cannot set date to Feb 29 2000 AD. * {JDK bug 4210209 4209272} +* 11/07/2003 srl Update, clean up documentation. ******************************************************************************** */ @@ -66,10 +67,10 @@ U_NAMESPACE_BEGIN *

      * \code
      *     // get the supported ids for GMT-08:00 (Pacific Standard Time)
    - *     int32_t idsCount;
    - *     const UnicodeString** ids = TimeZone::createAvailableIDs(-8 * 60 * 60 * 1000, idsCount);
    + *     UErrorCode success = U_ZERO_ERROR;
    + *     const StringEnumeration *ids = TimeZone::createEnumeration(-8 * 60 * 60 * 1000);
      *     // if no ids were returned, something is wrong. get out.
    - *     if (idsCount == 0) {
    + *     if (ids == 0 || ids->count(success) == 0) {
      *         return;
      *     }
      *
    @@ -77,7 +78,7 @@ U_NAMESPACE_BEGIN
      *     cout << "Current Time" << endl;
      *
      *     // create a Pacific Standard Time time zone
    - *     SimpleTimeZone* pdt = new SimpleTimeZone(-8 * 60 * 60 * 1000, *(ids[0]));
    + *     SimpleTimeZone* pdt = new SimpleTimeZone(-8 * 60 * 60 * 1000, ids->unext(NULL, success)));
      *
      *     // set up rules for daylight savings time
      *     pdt->setStartRule(Calendar::APRIL, 1, Calendar::SUNDAY, 2 * 60 * 60 * 1000);
    @@ -85,7 +86,6 @@ U_NAMESPACE_BEGIN
      *
      *     // create a GregorianCalendar with the Pacific Daylight time zone
      *     // and the current date and time
    - *     UErrorCode success = U_ZERO_ERROR;
      *     Calendar* calendar = new GregorianCalendar( pdt, success );
      *
      *     // print out a bunch of interesting things
    @@ -130,7 +130,11 @@ U_NAMESPACE_BEGIN
      *     cout << "ZONE_OFFSET: " << (calendar->get( Calendar::ZONE_OFFSET, success )/(60*60*1000)) << endl; // in hours
      *     cout << "DST_OFFSET: " << (calendar->get( Calendar::DST_OFFSET, success )/(60*60*1000)) << endl; // in hours
      *
    - *     delete[] ids;
    + *     if (U_FAILURE(success)) {
    + *         cout << "An error occured. success=" << u_errorName(success) << endl;
    + *     }
    + *
    + *     delete ids;
      *     delete calendar; // also deletes pdt
      * \endcode
      * 
    @@ -334,38 +338,10 @@ public: * one. Calendar override. * * @param other the Calendar to be compared with this Calendar - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UBool isEquivalentTo(const Calendar& other) const; - /** - * (Overrides Calendar) UDate Arithmetic function. Adds the specified (signed) amount - * of time to the given time field, based on the calendar's rules. For more - * information, see the documentation for Calendar::add(). - * - * @param field The time field. - * @param amount The amount of date or time to be added to the field. - * @param status Output param set to success/failure code on exit. If any value - * previously set in the time field is invalid, this will be set to - * an error status. - * @deprecated ICU 2.6. Use add(UCalendarDateFields field, int32_t amount, UErrorCode& status) instead. - */ - virtual void add(EDateFields field, int32_t amount, UErrorCode& status); - - /** - * (Overrides Calendar) UDate Arithmetic function. Adds the specified (signed) amount - * of time to the given time field, based on the calendar's rules. For more - * information, see the documentation for Calendar::add(). - * - * @param field The time field. - * @param amount The amount of date or time to be added to the field. - * @param status Output param set to success/failure code on exit. If any value - * previously set in the time field is invalid, this will be set to - * an error status. - * @draft ICU 2.6. - */ - virtual void add(UCalendarDateFields field, int32_t amount, UErrorCode& status); - /** * (Overrides Calendar) Rolls up or down by the given amount in the specified field. * For more information, see the documentation for Calendar::roll(). @@ -388,103 +364,38 @@ public: * @param status Output param set to success/failure code on exit. If any value * previously set in the time field is invalid, this will be set to * an error status. - * @draft ICU 2.6. + * @stable ICU 2.6. */ virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode& status); /** - * (Overrides Calendar) Returns minimum value for the given field. e.g. for - * Gregorian DAY_OF_MONTH, 1. - * @param field the time field. - * @return minimum value for the given field - * @deprecated ICU 2.6. Use getMinimum(UCalendarDateFields field) instead. - */ - virtual int32_t getMinimum(EDateFields field) const; - - /** - * (Overrides Calendar) Returns minimum value for the given field. e.g. for - * Gregorian DAY_OF_MONTH, 1. - * @param field the time field. - * @return minimum value for the given field - * @draft ICU 2.6. - */ - virtual int32_t getMinimum(UCalendarDateFields field) const; - - /** - * (Overrides Calendar) Returns maximum value for the given field. e.g. for - * Gregorian DAY_OF_MONTH, 31. - * @param field the time field. - * @return maximum value for the given field - * @deprecated ICU 2.6. Use getMaximum(UCalendarDateFields field) instead. - */ - virtual int32_t getMaximum(EDateFields field) const; - - /** - * (Overrides Calendar) Returns maximum value for the given field. e.g. for - * Gregorian DAY_OF_MONTH, 31. - * @param field the time field. - * @return maximum value for the given field - * @draft ICU 2.6. - */ - virtual int32_t getMaximum(UCalendarDateFields field) const; - - /** - * (Overrides Calendar) Returns highest minimum value for the given field if varies. - * Otherwise same as getMinimum(). For Gregorian, no difference. - * @param field the time field. - * @return highest minimum value for the given field if varies. - * Otherwise same as getMinimum(). - * @deprecated ICU 2.6. Use getGreatestMinimum(UCalendarDateFields field) instead. - */ - virtual int32_t getGreatestMinimum(EDateFields field) const; - - /** - * (Overrides Calendar) Returns highest minimum value for the given field if varies. - * Otherwise same as getMinimum(). For Gregorian, no difference. - * @param field the time field. - * @return highest minimum value for the given field if varies. - * Otherwise same as getMinimum(). - * @draft ICU 2.6. - */ - virtual int32_t getGreatestMinimum(UCalendarDateFields field) const; - - /** - * (Overrides Calendar) Returns lowest maximum value for the given field if varies. - * Otherwise same as getMaximum(). For Gregorian DAY_OF_MONTH, 28. - * @param field the time field. - * @return lowest maximum value for the given field if varies. - * Otherwise same as getMaximum(). - * @deprecated ICU 2.6. Use getLeastMaximum(UCalendarDateFields field) instead. - */ - virtual int32_t getLeastMaximum(EDateFields field) const; - - /** - * (Overrides Calendar) Returns lowest maximum value for the given field if varies. - * Otherwise same as getMaximum(). For Gregorian DAY_OF_MONTH, 28. + * Return the minimum value that this field could have, given the current date. + * For the Gregorian calendar, this is the same as getMinimum() and getGreatestMinimum(). * @param field the time field. - * @return lowest maximum value for the given field if varies. - * Otherwise same as getMaximum(). - * @draft ICU 2.6. + * @return the minimum value that this field could have, given the current date. + * @deprecated ICU 2.6. Use getActualMinimum(UCalendarDateFields field) instead. */ - virtual int32_t getLeastMaximum(UCalendarDateFields field) const; + int32_t getActualMinimum(EDateFields field) const; /** * Return the minimum value that this field could have, given the current date. * For the Gregorian calendar, this is the same as getMinimum() and getGreatestMinimum(). * @param field the time field. + * @param status * @return the minimum value that this field could have, given the current date. - * @deprecated ICU 2.6. Use getActualMinimum(UCalendarDateFields field) instead. + * @deprecated ICU 2.6. Use getActualMinimum(UCalendarDateFields field) instead. (Added to ICU 3.0 for signature consistency) */ - int32_t getActualMinimum(EDateFields field) const; + int32_t getActualMinimum(EDateFields field, UErrorCode& status) const; /** * Return the minimum value that this field could have, given the current date. * For the Gregorian calendar, this is the same as getMinimum() and getGreatestMinimum(). * @param field the time field. + * @param status error result. * @return the minimum value that this field could have, given the current date. - * @draft ICU 2.6. + * @draft ICU 3.0 */ - int32_t getActualMinimum(UCalendarDateFields field) const; + int32_t getActualMinimum(UCalendarDateFields field, UErrorCode &status) const; /** * Return the maximum value that this field could have, given the current date. @@ -503,10 +414,11 @@ public: * maximum would be 28; for "Feb 3, 1996" it s 29. Similarly for a Hebrew calendar, * for some years the actual maximum for MONTH is 12, and for others 13. * @param field the time field. + * @param status returns any errors that may result from this function call. * @return the maximum value that this field could have, given the current date. - * @draft ICU 2.6. + * @stable ICU 2.6 */ - int32_t getActualMaximum(UCalendarDateFields field) const; + virtual int32_t getActualMaximum(UCalendarDateFields field, UErrorCode& status) const; /** * (Overrides Calendar) Return true if the current date for this Calendar is in @@ -544,7 +456,7 @@ public: * @return The class ID for all objects of this class. * @stable ICU 2.0 */ - static inline UClassID getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(void); /** * Get the calendar type, "gregorian", for use in DateFormatSymbols. @@ -557,56 +469,66 @@ public: protected: /** - * Called by computeFields. Converts calendar's year into Gregorian Extended Year (where negative = BC) - * @return Current year in Gregorian years, where -3 means 4 BC (1-bcyear) - * @internal + * (Overrides Calendar) Converts GMT as milliseconds to time field values. + * @param status Fill-in parameter which receives the status of this operation. + * @stable ICU 2.0 */ - virtual int32_t getGregorianYear(UErrorCode &status) const; + private: + GregorianCalendar(); // default constructor not implemented + + protected: /** - * Called by computeJulianDay. Returns the default month (0-based) for the year, - * taking year and era into account. Defaults to 0 for Gregorian, which doesn't care. + * Return the ERA. We need a special method for this because the + * default ERA is AD, but a zero (unset) ERA is BC. + * @return the ERA. * @internal */ - virtual inline int32_t getDefaultMonthInYear() const { return 0; } - + virtual int32_t internalGetEra() const; /** - * Called by computeJulianDay. Returns the default day (1-based) for the month, - * taking currently-set year and era into account. Defaults to 1 for Gregorian, which doesn't care. + * Return the Julian day number of day before the first day of the + * given month in the given extended year. Subclasses should override + * this method to implement their calendar system. + * @param eyear the extended year + * @param month the zero-based month, or 0 if useMonth is false + * @param useMonth if false, compute the day before the first day of + * the given year, otherwise, compute the day before the first day of + * the given month + * @return the Julian day number of the day before the first + * day of the given month and year * @internal */ - virtual inline int32_t getDefaultDayInMonth(int32_t /*month*/) const { return 1; } + virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month, + UBool useMonth) const; /** - * (Overrides Calendar) Converts GMT as milliseconds to time field values. - * @param status Fill-in parameter which receives the status of this operation. - * @stable ICU 2.0 + * Subclasses may override this. This method calls + * handleGetMonthLength() to obtain the calendar-specific month + * length. + * @param bestField which field to use to calculate the date + * @return julian day specified by calendar fields. + * @internal */ - virtual void computeFields(UErrorCode& status); + virtual int32_t handleComputeJulianDay(UCalendarDateFields bestField) ; /** - * (Overrides Calendar) Converts Calendar's time field values to GMT as - * milliseconds. - * - * @param status Output param set to success/failure code on exit. If any value - * previously set in the time field is invalid, this will be set to - * an error status. - * @stable ICU 2.0 + * Return the number of days in the given month of the given extended + * year of this calendar system. Subclasses should override this + * method if they can provide a more correct or more efficient + * implementation than the default implementation in Calendar. + * @internal */ - virtual void computeTime(UErrorCode& status); - - private: - GregorianCalendar(); // default constructor not implemented + virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const; - protected: /** - * Return the ERA. We need a special method for this because the - * default ERA is AD, but a zero (unset) ERA is BC. - * @return the ERA. - * @internal + * Return the number of days in the given extended year of this + * calendar system. Subclasses should override this method if they can + * provide a more correct or more efficient implementation than the + * default implementation in Calendar. + * @stable ICU 2.0 */ - virtual int32_t internalGetEra() const; + virtual int32_t handleGetYearLength(int32_t eyear) const; /** * return the length of the given month. @@ -659,17 +581,65 @@ protected: virtual UDate getEpochDay(UErrorCode& status); /** - * Compute the date-based fields given the milliseconds since the epoch start. Do - * not compute the time-based fields (HOUR, MINUTE, etc.). + * Subclass API for defining limits of different types. + * Subclasses must implement this method to return limits for the + * following fields: * - * @param theTime the time in wall millis (either Standard or DST), - * whichever is in effect - * @param quick if true, only compute the ERA, YEAR, MONTH, DATE, - * DAY_OF_WEEK, and DAY_OF_YEAR. - * @param status Fill-in parameter which receives the status of this operation. + *
    UCAL_ERA
    +     * UCAL_YEAR
    +     * UCAL_MONTH
    +     * UCAL_WEEK_OF_YEAR
    +     * UCAL_WEEK_OF_MONTH
    +     * UCAL_DATE (DAY_OF_MONTH on Java)
    +     * UCAL_DAY_OF_YEAR
    +     * UCAL_DAY_OF_WEEK_IN_MONTH
    +     * UCAL_YEAR_WOY
    +     * UCAL_EXTENDED_YEAR
    + * + * @param field one of the above field numbers + * @param limitType one of MINIMUM, GREATEST_MINIMUM, + * LEAST_MAXIMUM, or MAXIMUM + * @internal + */ + virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const; + + /** + * Return the extended year defined by the current fields. This will + * use the UCAL_EXTENDED_YEAR field or the UCAL_YEAR and supra-year fields (such + * as UCAL_ERA) specific to the calendar system, depending on which set of + * fields is newer. + * @return the extended year + * @internal + */ + virtual int32_t handleGetExtendedYear(); + + /** + * Subclasses may override this to convert from week fields + * (YEAR_WOY and WEEK_OF_YEAR) to an extended year in the case + * where YEAR, EXTENDED_YEAR are not set. + * The Gregorian implementation assumes a yearWoy in gregorian format, according to the current era. + * @return the extended year, UCAL_EXTENDED_YEAR * @internal */ - virtual void timeToFields(UDate theTime, UBool quick, UErrorCode& status); + virtual int32_t handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy); + + + /** + * Subclasses may override this method to compute several fields + * specific to each calendar system. These are: + * + *
    • ERA + *
    • YEAR + *
    • MONTH + *
    • DAY_OF_MONTH + *
    • DAY_OF_YEAR + *
    • EXTENDED_YEAR
    + * + *

    The GregorianCalendar implementation implements + * a calendar with the specified Julian/Gregorian cutover date. + * @internal + */ + virtual void handleComputeFields(int32_t julianDay, UErrorCode &status); private: /** @@ -682,59 +652,6 @@ protected: static double computeJulianDayOfYear(UBool isGregorian, int32_t year, UBool& isLeap); - /** - * Compute the day of week, relative to the first day of week, from - * 0..6, of the current DOW_LOCAL or DAY_OF_WEEK fields. This is - * equivalent to get(DOW_LOCAL) - 1. - * @return the day of week, relative to the first day of week. - */ - int32_t computeRelativeDOW() const; - - /** - * Compute the day of week, relative to the first day of week, - * from 0..6 of the given julian day. - * @param julianDay the given julian day. - * @return the day of week, relative to the first day of week. - */ - int32_t computeRelativeDOW(double julianDay) const; - - /** - * Compute the DOY using the WEEK_OF_YEAR field and the julian day - * of the day BEFORE January 1 of a year (a return value from - * computeJulianDayOfYear). - * @param julianDayOfYear the given julian day of the day BEFORE - * January 1 of a year. - * @return the DOY using the WEEK_OF_YEAR field. - */ - int32_t computeDOYfromWOY(double julianDayOfYear) const; - - /** - * Compute the Julian day number under either the Gregorian or the - * Julian calendar, using the given year and the remaining fields. - * @param isGregorian if true, use the Gregorian calendar - * @param year the adjusted year number, with 0 indicating the - * year 1 BC, -1 indicating 2 BC, etc. - * @return the Julian day number - */ - double computeJulianDay(UBool isGregorian, int32_t year); - - - /** - * Return the week number of a day, within a period. This may be the week number in - * a year, or the week number in a month. Usually this will be a value >= 1, but if - * some initial days of the period are excluded from week 1, because - * minimalDaysInFirstWeek is > 1, then the week number will be zero for those - * initial days. Requires the day of week for the given date in order to determine - * the day of week of the first day of the period. - * - * @param date Day-of-year or day-of-month. Should be 1 for first day of period. - * @param day Day-of-week for given dayOfPeriod. 1-based with 1=Sunday. - * @return Week number, one-based, or zero if the day falls in part of the - * month before the first week, when there are days before the first - * week because the minimum days in the first week is more than one. - */ - int32_t weekNumber(int32_t date, int32_t day); - /** * Validates the values of the set time fields. True if they're all valid. * @return True if the set time fields are all valid. @@ -762,11 +679,16 @@ protected: * milliseconds from the standard epoch. Default is October 15, 1582 * (Gregorian) 00:00:00 UTC, that is, October 4, 1582 (Julian) is followed * by October 15, 1582 (Gregorian). This corresponds to Julian day number - * 2299161. + * 2299161. This is measured from the standard epoch, not in Julian Days. + * @internal */ - // This is measured from the standard epoch, not in Julian Days. UDate fGregorianCutover; + /** + * Julian day number of the Gregorian cutover + */ + int32_t fCutoverJulianDay; + /** * Midnight, local time (using this Calendar's TimeZone) at or before the * gregorianCutover. This is a pure date value with no time of day or @@ -780,7 +702,11 @@ protected: */ int32_t fGregorianCutoverYear;// = 1582; - static const char fgClassID; + /** + * The year of the gregorianCutover, with 0 representing + * 1 BC, -1 representing 2 BC, etc. + */ + int32_t fGregorianCutoverJulianDay;// = 2299161; /** * Converts time as milliseconds to Julian date. The Julian date used here is not a @@ -801,70 +727,18 @@ protected: static UDate julianDayToMillis(double julian); /** - * Convert a quasi Julian date to the day of the week. The Julian date used here is - * not a true Julian date, since it is measured from midnight, not noon. Return - * value is one-based. - * - * @param julian The given Julian date number. - * @return Day number from 1..7 (SUN..SAT). - */ - static uint8_t julianDayToDayOfWeek(double julian); - - /** - * Divide two long integers, returning the floor of the quotient. - *

    - * Unlike the built-in division, this is mathematically well-behaved. - * E.g., -1/4 => 0 - * but floorDivide(-1,4) => -1. - * @param numerator the numerator - * @param denominator a divisor which must be > 0 - * @return the floor of the quotient. - */ - static double floorDivide(double numerator, double denominator); - - /** - * Divide two integers, returning the floor of the quotient. - *

    - * Unlike the built-in division, this is mathematically well-behaved. - * E.g., -1/4 => 0 - * but floorDivide(-1,4) => -1. - * @param numerator the numerator - * @param denominator a divisor which must be > 0 - * @return the floor of the quotient. - */ - static int32_t floorDivide(int32_t numerator, int32_t denominator); - - /** - * Divide two integers, returning the floor of the quotient, and - * the modulus remainder. - *

    - * Unlike the built-in division, this is mathematically well-behaved. - * E.g., -1/4 => 0 and -1%4 => -1, - * but floorDivide(-1,4) => -1 with remainder[0] => 3. - * @param numerator the numerator - * @param denominator a divisor which must be > 0 - * @param remainder an array of at least one element in which the value - * numerator mod denominator is returned. Unlike numerator - * % denominator, this will always be non-negative. - * @return the floor of the quotient. - */ - static int32_t floorDivide(int32_t numerator, int32_t denominator, int32_t remainder[]); - - /** - * Divide two integers, returning the floor of the quotient, and - * the modulus remainder. - *

    - * Unlike the built-in division, this is mathematically well-behaved. - * E.g., -1/4 => 0 and -1%4 => -1, - * but floorDivide(-1,4) => -1 with remainder[0] => 3. - * @param numerator the numerator - * @param denominator a divisor which must be > 0 - * @param remainder an array of at least one element in which the value - * numerator mod denominator is returned. Unlike numerator - * % denominator, this will always be non-negative. - * @return the floor of the quotient. - */ - static int32_t floorDivide(double numerator, int32_t denominator, int32_t remainder[]); + * Used by handleComputeJulianDay() and handleComputeMonthStart(). + * Temporary field indicating whether the calendar is currently Gregorian as opposed to Julian. + */ + UBool fIsGregorian; + + /** + * Used by handleComputeJulianDay() and handleComputeMonthStart(). + * Temporary field indicating that the sense of the gregorian cutover should be inverted + * to handle certain calculations on and around the cutover date. + */ + UBool fInvertGregorian; + public: // internal implementation @@ -906,9 +780,9 @@ protected: static const int32_t fgSystemDefaultCenturyYear; /** - * TODO: (ICU 2.8) use this value instead of SimpleDateFormat::fgSystemDefaultCentury + * Default value that indicates the UDate of the beginning of the system default century */ - //static const UDate fgSystemDefaultCentury; + static const UDate fgSystemDefaultCentury; /** * Returns the beginning date of the 100-year window that dates with 2-digit years @@ -934,24 +808,6 @@ protected: }; -inline UClassID -GregorianCalendar::getStaticClassID(void) -{ return (UClassID)&fgClassID; } - -inline UClassID -GregorianCalendar::getDynamicClassID(void) const -{ return GregorianCalendar::getStaticClassID(); } - -inline uint8_t GregorianCalendar::julianDayToDayOfWeek(double julian) -{ - // If julian is negative, then julian%7 will be negative, so we adjust - // accordingly. We add 1 because Julian day 0 is Monday. - int8_t dayOfWeek = (int8_t) uprv_fmod(julian + 1, 7); - - uint8_t result = (uint8_t)(dayOfWeek + ((dayOfWeek < 0) ? (7 + UCAL_SUNDAY) : UCAL_SUNDAY)); - return result; -} - U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/i18n/unicode/measfmt.h b/icuSources/i18n/unicode/measfmt.h new file mode 100644 index 00000000..f3adae5d --- /dev/null +++ b/icuSources/i18n/unicode/measfmt.h @@ -0,0 +1,71 @@ +/* +********************************************************************** +* Copyright (c) 2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Author: Alan Liu +* Created: April 20, 2004 +* Since: ICU 3.0 +********************************************************************** +*/ +#ifndef MEASUREFORMAT_H +#define MEASUREFORMAT_H + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/format.h" + +U_NAMESPACE_BEGIN + +/** + * A formatter for measure objects. This is an abstract base class. + * + *

    To format or parse a measure object, first create a formatter + * object using a MeasureFormat factory method. Then use that + * object's format and parse methods. + * + *

    This is an abstract class. + * + * @see Format + * @author Alan Liu + * @draft ICU 3.0 + */ +class U_I18N_API MeasureFormat : public Format { + + public: + + /** + * Return a formatter for CurrencyAmount objects in the given + * locale. + * @param locale desired locale + * @param ec input-output error code + * @return a formatter object, or NULL upon error + * @draft ICU 3.0 + */ + static MeasureFormat* U_EXPORT2 createCurrencyFormat(const Locale& locale, + UErrorCode& ec); + + /** + * Return a formatter for CurrencyAmount objects in the default + * locale. + * @param ec input-output error code + * @return a formatter object, or NULL upon error + * @draft ICU 3.0 + */ + static MeasureFormat* U_EXPORT2 createCurrencyFormat(UErrorCode& ec); + + protected: + + /** + * Default constructor. + * @draft ICU 3.0 + */ + MeasureFormat(); +}; + +U_NAMESPACE_END + +#endif // #if !UCONFIG_NO_FORMATTING +#endif // #ifndef MEASUREFORMAT_H diff --git a/icuSources/i18n/unicode/measunit.h b/icuSources/i18n/unicode/measunit.h new file mode 100644 index 00000000..7e884b19 --- /dev/null +++ b/icuSources/i18n/unicode/measunit.h @@ -0,0 +1,66 @@ +/* +********************************************************************** +* Copyright (c) 2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Author: Alan Liu +* Created: April 26, 2004 +* Since: ICU 3.0 +********************************************************************** +*/ +#ifndef __MEASUREUNIT_H__ +#define __MEASUREUNIT_H__ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/fmtable.h" + +U_NAMESPACE_BEGIN + +/** + * A unit such as length, mass, volume, currency, etc. A unit is + * coupled with a numeric amount to produce a Measure. + * + *

    This is an abstract class. + * + * @author Alan Liu + * @draft ICU 3.0 + */ +class U_I18N_API MeasureUnit: public UObject { + public: + /** + * Return a polymorphic clone of this object. The result will + * have the same class as returned by getDynamicClassID(). + * @draft ICU 3.0 + */ + virtual UObject* clone() const = 0; + + /** + * Destructor + * @draft ICU 3.0 + */ + virtual ~MeasureUnit(); + + /** + * Equality operator. Return true if this object is equal + * to the given object. + * @draft ICU 3.0 + */ + virtual UBool operator==(const UObject& other) const = 0; + + protected: + /** + * Default constructor. + * @draft ICU 3.0 + */ + MeasureUnit(); +}; + +U_NAMESPACE_END + +// NOTE: There is no measunit.cpp. For implementation, see measure.cpp. [alan] + +#endif // !UCONFIG_NO_FORMATTING +#endif // __MEASUREUNIT_H__ diff --git a/icuSources/i18n/unicode/measure.h b/icuSources/i18n/unicode/measure.h new file mode 100644 index 00000000..10f6daf8 --- /dev/null +++ b/icuSources/i18n/unicode/measure.h @@ -0,0 +1,132 @@ +/* +********************************************************************** +* Copyright (c) 2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Author: Alan Liu +* Created: April 26, 2004 +* Since: ICU 3.0 +********************************************************************** +*/ +#ifndef __MEASURE_H__ +#define __MEASURE_H__ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/fmtable.h" + +U_NAMESPACE_BEGIN + +class MeasureUnit; + +/** + * An amount of a specified unit, consisting of a number and a Unit. + * For example, a length measure consists of a number and a length + * unit, such as feet or meters. This is an abstract class. + * Subclasses specify a concrete Unit type. + * + *

    Measure objects are parsed and formatted by subclasses of + * MeasureFormat. + * + *

    Measure objects are immutable. + * + *

    This is an abstract class. + * + * @author Alan Liu + * @draft ICU 3.0 + */ +class U_I18N_API Measure: public UObject { + public: + /** + * Construct an object with the given numeric amount and the given + * unit. After this call, the caller must not delete the given + * unit object. + * @param number a numeric object; amount.isNumeric() must be TRUE + * @param adoptedUnit the unit object, which must not be NULL + * @param ec input-output error code. If the amount or the unit + * is invalid, then this will be set to a failing value. + * @draft ICU 3.0 + */ + Measure(const Formattable& number, MeasureUnit* adoptedUnit, + UErrorCode& ec); + + /** + * Copy constructor + * @draft ICU 3.0 + */ + Measure(const Measure& other); + + /** + * Assignment operator + * @draft ICU 3.0 + */ + Measure& operator=(const Measure& other); + + /** + * Return a polymorphic clone of this object. The result will + * have the same class as returned by getDynamicClassID(). + * @draft ICU 3.0 + */ + virtual UObject* clone() const = 0; + + /** + * Destructor + * @draft ICU 3.0 + */ + virtual ~Measure(); + + /** + * Equality operator. Return true if this object is equal + * to the given object. + * @draft ICU 3.0 + */ + UBool operator==(const UObject& other) const; + + /** + * Return a reference to the numeric value of this object. The + * numeric value may be of any numeric type supported by + * Formattable. + * @draft ICU 3.0 + */ + inline const Formattable& getNumber() const; + + /** + * Return a reference to the unit of this object. + * @draft ICU 3.0 + */ + inline const MeasureUnit& getUnit() const; + + protected: + /** + * Default constructor. + * @draft ICU 3.0 + */ + Measure(); + + private: + /** + * The numeric value of this object, e.g. 2.54 or 100. + */ + Formattable number; + + /** + * The unit of this object, e.g., "millimeter" or "JPY". This is + * owned by this object. + */ + MeasureUnit* unit; +}; + +inline const Formattable& Measure::getNumber() const { + return number; +} + +inline const MeasureUnit& Measure::getUnit() const { + return *unit; +} + +U_NAMESPACE_END + +#endif // !UCONFIG_NO_FORMATTING +#endif // __MEASURE_H__ diff --git a/icuSources/i18n/unicode/msgfmt.h b/icuSources/i18n/unicode/msgfmt.h index 3fa678fd..3ba4d37b 100644 --- a/icuSources/i18n/unicode/msgfmt.h +++ b/icuSources/i18n/unicode/msgfmt.h @@ -1,5 +1,5 @@ /* -* Copyright (C) {1997-2003}, International Business Machines Corporation and others. All Rights Reserved. +* Copyright (C) {1997-2004}, International Business Machines Corporation and others. All Rights Reserved. ******************************************************************************** * * File MSGFMT.H @@ -227,7 +227,7 @@ class DateFormat; * the string patterns), then be careful not to produce a format that * recurses on itself, which will cause an infinite loop. *

    - * Note:Subformats are numbered by their order in the pattern. + * Note: Subformats are numbered by their order in the pattern. * This is not the same as the argumentIndex. *

      * \code
    @@ -238,6 +238,10 @@ class DateFormat;
      *    format2 affects the second variable {0}
      * \endcode
      * 
    + * + *

    User subclasses are not supported. While clients may write + * subclasses, such code will not necessarily work and will not be + * guaranteed to work stably from release to release. */ class U_I18N_API MessageFormat : public Format { public: @@ -593,10 +597,9 @@ public: * @return The class ID for all objects of this class. * @stable ICU 2.0 */ - static inline UClassID getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(void); private: - static const char fgClassID; Locale fLocale; UnicodeString fPattern; @@ -605,7 +608,7 @@ private: MessageFormat(); // default constructor not implemented - /** + /* * A structure representing one subformat of this MessageFormat. * Each subformat has a Format object, an offset into the plain * pattern text fPattern, and an argument number. The argument @@ -768,15 +771,6 @@ private: friend class MessageFormatAdapter; // getFormatTypeList() access }; -inline UClassID -MessageFormat::getStaticClassID(void) -{ return (UClassID)&fgClassID; } - -inline UClassID -MessageFormat::getDynamicClassID() const -{ return MessageFormat::getStaticClassID(); } - - inline UnicodeString& MessageFormat::format(const Formattable& obj, UnicodeString& appendTo, @@ -789,3 +783,4 @@ U_NAMESPACE_END #endif // _MSGFMT //eof + diff --git a/icuSources/i18n/unicode/numfmt.h b/icuSources/i18n/unicode/numfmt.h index 8a515b2c..248c7b01 100644 --- a/icuSources/i18n/unicode/numfmt.h +++ b/icuSources/i18n/unicode/numfmt.h @@ -1,5 +1,5 @@ /* -* Copyright (C) {1997-2003}, International Business Machines Corporation and others. All Rights Reserved. +* Copyright (C) {1997-2004}, International Business Machines Corporation and others. All Rights Reserved. ******************************************************************************** * * File NUMFMT.H @@ -31,10 +31,15 @@ U_NAMESPACE_BEGIN +#if !UCONFIG_NO_SERVICE class NumberFormatFactory; class StringEnumeration; +/** + * @internal + */ typedef const void* URegistryKey; +#endif /** * Abstract base class for all number formats. Provides interface for @@ -76,7 +81,7 @@ typedef const void* URegistryKey; * myString += " ; "; * } * cout << " Example 2: " << myString << endl; - * \endcide + * \endcode * * To format a number for a different Locale, specify it in the * call to createInstance(). @@ -128,6 +133,11 @@ typedef const void* URegistryKey; * widthToAlignmentPoint) before drawing the text. It also works * where there is no decimal, but possibly additional characters at * the end, e.g. with parentheses in negative numbers: "(12)" for -12. + *

    + * User subclasses are not supported. While clients may write + * subclasses, such code will not necessarily work and will not be + * guaranteed to work stably from release to release. + * * @stable ICU 2.0 */ class U_I18N_API NumberFormat : public Format { @@ -196,8 +206,8 @@ public: *

    * Before calling, set parse_pos.index to the offset you want to * start parsing at in the source. After calling, parse_pos.index - * is the end of the text you parsed. If error occurs, index is - * unchanged. + * indicates the position after the successfully parsed text. If + * an error occurs, parse_pos.index is unchanged. *

    * When parsing, leading whitespace is discarded (with successful * parse), while trailing whitespace is left as is. @@ -247,6 +257,19 @@ public: UnicodeString& format( int32_t number, UnicodeString& appendTo) const; + /** + * Format an int64 number. These methods call the NumberFormat + * pure virtual format() methods with the default FieldPosition. + * + * @param number The value to be formatted. + * @param appendTo Output parameter to receive result. + * Result is appended to existing contents. + * @return Reference to 'appendTo' parameter. + * @draft ICU 2.8 + */ + UnicodeString& format( int64_t number, + UnicodeString& appendTo) const; + /** * Format a double number. Concrete subclasses must implement * these pure virtual methods. @@ -278,6 +301,22 @@ public: UnicodeString& appendTo, FieldPosition& pos) const = 0; + /** + * Format an int64 number. (Not abstract to retain compatibility + * with earlier releases, however subclasses should override this + * method as it just delegates to format(int32_t number...); + * + * @param number The value to be formatted. + * @param appendTo Output parameter to receive result. + * Result is appended to existing contents. + * @param pos On input: an alignment field, if desired. + * On output: the offsets of the alignment field. + * @return Reference to 'appendTo' parameter. + * @draft ICU 2.8 + */ + virtual UnicodeString& format(int64_t number, + UnicodeString& appendTo, + FieldPosition& pos) const; /** * Redeclared Format method. * @param obj The object to be formatted. @@ -336,6 +375,29 @@ public: Formattable& result, UErrorCode& status) const; + /** + * Parses text from the given string as a currency amount. Unlike + * the parse() method, this method will attempt to parse a generic + * currency name, searching for a match of this object's locale's + * currency display names, or for a 3-letter ISO currency code. + * This method will fail if this format is not a currency format, + * that is, if it does not contain the currency pattern symbol + * (U+00A4) in its prefix or suffix. + * + * @param text the string to parse + * @param result output parameter to receive result. This will have + * its currency set to the parsed ISO currency code. + * @param pos input-output position; on input, the position within + * text to match; must have 0 <= pos.getIndex() < text.length(); + * on output, the position after the last matched character. If + * the parse fails, the position in unchanged upon output. + * @return a reference to result + * @internal + */ + virtual Formattable& parseCurrency(const UnicodeString& text, + Formattable& result, + ParsePosition& pos) const; + /** * Return true if this format will parse numbers as integers * only. For example in the English locale, with ParseIntegerOnly @@ -344,7 +406,7 @@ public: * the exact format accepted by the parse operation is locale * dependant and determined by sub-classes of NumberFormat. * @return true if this format will parse numbers as integers - * only. + * only. * @stable ICU 2.0 */ UBool isParseIntegerOnly(void) const; @@ -366,7 +428,7 @@ public: * is locale dependant. * @stable ICU 2.0 */ - static NumberFormat* createInstance(UErrorCode&); + static NumberFormat* U_EXPORT2 createInstance(UErrorCode&); /** * Returns the default number format for the specified locale. @@ -376,49 +438,49 @@ public: * @param inLocale the given locale. * @stable ICU 2.0 */ - static NumberFormat* createInstance(const Locale& inLocale, + static NumberFormat* U_EXPORT2 createInstance(const Locale& inLocale, UErrorCode&); /** * Returns a currency format for the current default locale. * @stable ICU 2.0 */ - static NumberFormat* createCurrencyInstance(UErrorCode&); + static NumberFormat* U_EXPORT2 createCurrencyInstance(UErrorCode&); /** * Returns a currency format for the specified locale. * @param inLocale the given locale. * @stable ICU 2.0 */ - static NumberFormat* createCurrencyInstance(const Locale& inLocale, + static NumberFormat* U_EXPORT2 createCurrencyInstance(const Locale& inLocale, UErrorCode&); /** * Returns a percentage format for the current default locale. * @stable ICU 2.0 */ - static NumberFormat* createPercentInstance(UErrorCode&); + static NumberFormat* U_EXPORT2 createPercentInstance(UErrorCode&); /** * Returns a percentage format for the specified locale. * @param inLocale the given locale. * @stable ICU 2.0 */ - static NumberFormat* createPercentInstance(const Locale& inLocale, + static NumberFormat* U_EXPORT2 createPercentInstance(const Locale& inLocale, UErrorCode&); /** * Returns a scientific format for the current default locale. * @stable ICU 2.0 */ - static NumberFormat* createScientificInstance(UErrorCode&); + static NumberFormat* U_EXPORT2 createScientificInstance(UErrorCode&); /** * Returns a scientific format for the specified locale. * @param inLocale the given locale. * @stable ICU 2.0 */ - static NumberFormat* createScientificInstance(const Locale& inLocale, + static NumberFormat* U_EXPORT2 createScientificInstance(const Locale& inLocale, UErrorCode&); /** @@ -426,16 +488,17 @@ public: * @param count Output param to receive the size of the locales * @stable ICU 2.0 */ - static const Locale* getAvailableLocales(int32_t& count); + static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count); +#if !UCONFIG_NO_SERVICE /** * Register a new NumberFormatFactory. The factory will be adopted. * @param toAdopt the NumberFormatFactory instance to be adopted * @param status the in/out status code, no special meanings are assigned * @return a registry key that can be used to unregister this factory - * @draft ICU 2.6 + * @stable ICU 2.6 */ - static URegistryKey registerFactory(NumberFormatFactory* toAdopt, UErrorCode& status); + static URegistryKey U_EXPORT2 registerFactory(NumberFormatFactory* toAdopt, UErrorCode& status); /** * Unregister a previously-registered NumberFormatFactory using the key returned from the @@ -444,17 +507,18 @@ public: * @param key the registry key returned by a previous call to registerFactory * @param status the in/out status code, no special meanings are assigned * @return TRUE if the factory for the key was successfully unregistered - * @draft ICU 2.6 + * @stable ICU 2.6 */ - static UBool unregister(URegistryKey key, UErrorCode& status); + static UBool U_EXPORT2 unregister(URegistryKey key, UErrorCode& status); /** - * Return a StringEnumeration over the locales available at the time of the call, + * Return a StringEnumeration over the locales available at the time of the call, * including registered locales. * @return a StringEnumeration over the locales available at the time of the call - * @draft ICU 2.6 + * @stable ICU 2.6 */ - static StringEnumeration* getAvailableLocales(void); + static StringEnumeration* U_EXPORT2 getAvailableLocales(void); +#endif /* UCONFIG_NO_SERVICE */ /** * Returns true if grouping is used in this format. For example, @@ -469,7 +533,7 @@ public: /** * Set whether or not grouping will be used in this format. - * @param newValue True, grouping will be used in this format. + * @param newValue True, grouping will be used in this format. * @see getGroupingUsed * @stable ICU 2.0 */ @@ -492,7 +556,7 @@ public: * of minimumIntegerDigits, then minimumIntegerDigits will also be set to * the new value. * - * @param newValue the new value for the maximum number of digits + * @param newValue the new value for the maximum number of digits * allowed in the integer portion of a number. * @see getMaximumIntegerDigits * @stable ICU 2.0 @@ -574,33 +638,31 @@ public: * @param theCurrency a 3-letter ISO code indicating new currency * to use. It need not be null-terminated. May be the empty * string or NULL to indicate no currency. - * @draft ICU 2.6 + * @param ec input-output error code + * @draft ICU 3.0 */ - virtual void setCurrency(const UChar* theCurrency); + virtual void setCurrency(const UChar* theCurrency, UErrorCode& ec); /** * Gets the currency used to display currency * amounts. This may be an empty string for some subclasses. * @return a 3-letter null-terminated ISO code indicating * the currency in use, or a pointer to the empty string. - * @draft ICU 2.6 + * @stable ICU 2.6 */ const UChar* getCurrency() const; public: /** - * Return the class ID for this class. This is useful only for - * comparing to a return value from getDynamicClassID(). For example: - *

    -     * .   Base* polymorphic_pointer = createPolymorphicObject();
    -     * .   if (polymorphic_pointer->getDynamicClassID() ==
    -     * .       Derived::getStaticClassID()) ...
    -     * 
    + * Return the class ID for this class. This is useful for + * comparing to a return value from getDynamicClassID(). Note that, + * because NumberFormat is an abstract base class, no fully constructed object + * will have the class ID returned by NumberFormat::getStaticClassID(). * @return The class ID for all objects of this class. * @stable ICU 2.0 */ - static inline UClassID getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(void); /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. @@ -635,12 +697,21 @@ protected: */ NumberFormat& operator=(const NumberFormat&); + /** + * Returns the currency in effect for this formatter. Subclasses + * should override this method as needed. Unlike getCurrency(), + * this method should never return "". + * @result output parameter for null-terminated result, which must + * have a capacity of at least 4 + * @internal + */ + virtual void getEffectiveCurrency(UChar* result, UErrorCode& ec) const; + private: static const int32_t fgMaxIntegerDigits; static const int32_t fgMinIntegerDigits; private: - static const char fgClassID; enum EStyles { kNumberStyle, @@ -649,17 +720,17 @@ private: kScientificStyle, kStyleCount // ALWAYS LAST ENUM: number of styles }; - + /** * Creates the specified decimal format style of the desired locale. - * Hook for service registration, uses makeInstance directly if no services - * registered. + * Hook for service registration, uses makeInstance directly if no services + * registered. * @param desiredLocale the given locale. * @param choice the given style. * @param success Output param filled with success/failure status. * @return A new NumberFormat instance. */ - static NumberFormat* createInstance(const Locale& desiredLocale, EStyles choice, UErrorCode& success); + static NumberFormat* U_EXPORT2 createInstance(const Locale& desiredLocale, EStyles choice, UErrorCode& success); /** * Creates the specified decimal format style of the desired locale. @@ -668,7 +739,7 @@ private: * @param success Output param filled with success/failure status. * @return A new NumberFormat instance. */ - static NumberFormat* makeInstance(const Locale& desiredLocale, EStyles choice, UErrorCode& success); + static NumberFormat* makeInstance(const Locale& desiredLocale, EStyles choice, UErrorCode& success); static const int32_t fgNumberPatternsCount; static const UChar* const fgLastResortNumberPatterns[]; @@ -680,104 +751,98 @@ private: UBool fParseIntegerOnly; // ISO currency code - UChar currency[4]; + UChar fCurrency[4]; - friend class ICUNumberFormatFactory; // access to makeInstance, EStyles - friend class ICUNumberFormatService; + friend class ICUNumberFormatFactory; // access to makeInstance, EStyles + friend class ICUNumberFormatService; }; +#if !UCONFIG_NO_SERVICE /** * A NumberFormatFactory is used to register new number formats. The factory * should be able to create any of the predefined formats for each locale it * supports. When registered, the locales it supports extend or override the * locale already supported by ICU. * - * @prototype + * @stable ICU 2.6 */ class U_I18N_API NumberFormatFactory : public UObject { public: + /** + * Destructor + * @draft ICU 3.0 + */ + virtual ~NumberFormatFactory(); + /** * Return true if this factory will be visible. Default is true. * If not visible, the locales supported by this factory will not * be listed by getAvailableLocales. - * @draft ICU 2.6 + * @stable ICU 2.6 */ virtual UBool visible(void) const = 0; /** * Return the locale names directly supported by this factory. The number of names * is returned in count; - * @draft ICU 2.6 + * @stable ICU 2.6 */ - virtual const UnicodeString * const getSupportedIDs(int32_t &count, UErrorCode& status) const = 0; + virtual const UnicodeString * getSupportedIDs(int32_t &count, UErrorCode& status) const = 0; /** * Return a number format of the appropriate type. If the locale * is not supported, return null. If the locale is supported, but * the type is not provided by this service, return null. Otherwise * return an appropriate instance of NumberFormat. - * @draft ICU 2.6 + * @stable ICU 2.6 */ virtual NumberFormat* createFormat(const Locale& loc, UNumberFormatStyle formatType) = 0; }; - /** - * A NumberFormatFactory that supports a single locale. It can be visible or invisible. - * @prototype - */ +/** + * A NumberFormatFactory that supports a single locale. It can be visible or invisible. + * @draft ICU 3.0 + */ class U_I18N_API SimpleNumberFormatFactory : public NumberFormatFactory { protected: /** * True if the locale supported by this factory is visible. - * @draft ICU 2.6 + * @stable ICU 2.6 */ const UBool _visible; /** * The locale supported by this factory, as a UnicodeString. - * @draft ICU 2.6 + * @stable ICU 2.6 */ UnicodeString _id; public: /** - * @draft ICU 2.6 + * @stable ICU 2.6 */ - SimpleNumberFormatFactory(const Locale& locale, UBool visible = TRUE) - : _visible(visible) - , _id(locale.getName()) - { - } + SimpleNumberFormatFactory(const Locale& locale, UBool visible = TRUE); /** - * @draft ICU 2.6 + * @draft ICU 3.0 */ - virtual UBool visible(void) const { - return _visible; - } + virtual ~SimpleNumberFormatFactory(); /** - * @draft ICU 2.6 + * @stable ICU 2.6 */ - virtual const UnicodeString * const getSupportedIDs(int32_t &count, UErrorCode& status) const - { - if (U_SUCCESS(status)) { - count = 1; - return &_id; - } - count = 0; - return NULL; - } -}; + virtual UBool visible(void) const; + /** + * @stable ICU 2.6 + */ + virtual const UnicodeString * getSupportedIDs(int32_t &count, UErrorCode& status) const; +}; +#endif /* #if !UCONFIG_NO_SERVICE */ // ------------------------------------- -inline UClassID -NumberFormat::getStaticClassID(void) -{ return (UClassID)&fgClassID; } - inline UBool NumberFormat::isParseIntegerOnly() const { diff --git a/icuSources/i18n/unicode/rbnf.h b/icuSources/i18n/unicode/rbnf.h index 11034862..56b0f8fc 100644 --- a/icuSources/i18n/unicode/rbnf.h +++ b/icuSources/i18n/unicode/rbnf.h @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 1997-2003, International Business Machines Corporation and others. +* Copyright (C) 1997-2004, International Business Machines Corporation and others. * All Rights Reserved. ******************************************************************************* */ @@ -10,6 +10,13 @@ #include "unicode/utypes.h" +/** + * \def U_HAVE_RBNF + * This will be 0 if RBNF support is not included in ICU + * and 1 if it is. + * + * @stable ICU 2.4 + */ #if defined(U_INT64_T_UNAVAILABLE) || UCONFIG_NO_FORMATTING #define U_HAVE_RBNF 0 #else @@ -21,12 +28,18 @@ #include "unicode/locid.h" #include "unicode/numfmt.h" #include "unicode/unistr.h" +#include "unicode/strenum.h" U_NAMESPACE_BEGIN class NFRuleSet; +class LocalizationInfo; -/** Tags for the predefined rulesets. */ +/** + * Tags for the predefined rulesets. + * + * @stable ICU 2.2 + */ enum URBNFRuleSetTag { URBNF_SPELLOUT, URBNF_ORDINAL, @@ -134,7 +147,7 @@ class Collator; * * * - * + * * * * @@ -435,7 +448,8 @@ class Collator; * * * "; - $_ .= _emitHTMLZone($zone->{$eg->[0]}, $rule); - # Don't sort @$eg -- output in native order - $_ .= ""; - $_ .= "\n"; - $_; -} - -# Emit a zone description without ID, alias info etc. -# Param: zone OBJECT hash ref -# Param: rule hash ref -sub _emitHTMLZone { - my ($zone, $rules) = @_; - my $gmtoff = "GMT" . formatOffset(TZ::ParseOffset($zone->{gmtoff})); - local $_ = ""; - if ($zone->{rule} ne $TZ::STANDARD) { - my $rule = $rules->{$zone->{rule}}; - $_ .= ""; - $_ .= ""; - $_ .= ""; - } else { - $_ .= ""; - } - $_; -} - -# Emit a single zone description as HTML table row. Return the string. -# Param: Zone name -# Param: Zone hash object ref -# Param: Ref to rules hash -# Param: ref to offset index -# Param: ref to alias hash -# Param: ref to reverse alias hash -sub emitHTMLZone { - my ($name, $zone, $rules, $offsetIndex, $aliases, $revaliases) = @_; - my $isDefault = isDefault($name, $zone->{gmtoff}, $offsetIndex); - my $alias = exists $aliases->{$name} ? $aliases->{$name} : ''; - my $revalias = exists $revaliases->{$name} ? $revaliases->{$name} : ''; - local $_ = ""; - $_ .= _emitHTMLZone($zone, $rules); - if ($alias) { - $_ .= ""; - } elsif ($revalias) { - $_ .= ""; - } else { - $_ .= ""; - } - $_ .= "\n"; - $_; -} - -# Emit a zone rule as HTML. Return the string. -# Param: Rule hash object ref -sub emitHTMLRule { - my $rule = shift; - $rule->{in} ." ". $rule->{on} ." ". $rule->{at}; -} - -# Read the alias list and create clones with alias names. This -# sub should be called AFTER all standard zones have been read in. -# Param: File name of alias list -# Param: Ref to zone hash -# Param: Ref to LINK hash -# Return: Ref to hash of {alias name -> zone name} -sub incorporateAliases { - my $aliasFile = shift; - my $zones = shift; - my $links = shift; - my $n = 0; - my %hash; - local *IN; - open(IN,$aliasFile) or die "Can't open $aliasFile: $!"; - while () { - s/\#.*//; # Trim comments - next unless (/\S/); # Skip blank lines - if (/^\s*(\S+)\s+(\S+)\s*$/) { - my ($alias, $original) = ($1, $2); - if (exists $zones->{$alias}) { - die "Bad alias in $aliasFile: $alias is a standard UNIX zone. " . - "Please remove $alias from the alias table.\n"; - } - if (!exists $zones->{$original}) { - die "Bad alias in $aliasFile: $alias maps to the nonexistent " . - "zone $original. Please fix this entry in the alias table.\n"; - } - if (exists $links->{$alias} && - $links->{$alias} ne $original) { - print STDERR "Warning: Alias $alias for $original exists as link for ", - $links->{$alias}, "\n"; - } - # Create the alias! - $zones->{$alias} = $zones->{$original}; - $hash{$alias} = $original; - $n++; - } else { - die "Bad line in alias table $aliasFile: $_\n"; - } - } - print "Incorporated $n aliases from $aliasFile\n"; - close(IN); - \%hash; -} - -# Format a time zone as a machine-readable line of text. Another -# tool will read this line to construct a binary data structure -# representing this zone. -# Param: Zone name -# Param: Zone hash -# Param: Ref to hash of all rules -# Return: Two array refs, one to the specs, one to the notes -sub formatZone { # ($z, $ZONES{$z}, \%RULES) - my $name = shift; - my $zone = shift; - my $rules = shift; - - my @spec; - #my @notes = ( $name ); - my @notes; - - # GMT offset - push @notes, ($zone->{gmtoff}=~/^-/?"GMT":"GMT+") . $zone->{gmtoff}; - push @spec, TZ::ParseOffset($zone->{gmtoff}); - - #|rawOffset The new SimpleTimeZone's raw GMT offset - #|ID The new SimpleTimeZone's time zone ID. - #|startMonth The daylight savings starting month. Month is - #| 0-based. eg, 0 for January. - #|startDay The daylight savings starting - #| day-of-week-in-month. See setStartRule() for a - #| complete explanation. - #|startDayOfWeek The daylight savings starting day-of-week. See - #| setStartRule() for a complete explanation. - #|startTime The daylight savings starting time, expressed as the - #| number of milliseconds after midnight. - #|endMonth The daylight savings ending month. Month is - #| 0-based. eg, 0 for January. - #|endDay The daylight savings ending day-of-week-in-month. - #| See setStartRule() for a complete explanation. - #|endDayOfWeek The daylight savings ending day-of-week. See - #| setStartRule() for a complete explanation. - #|endTime The daylight savings ending time, expressed as the - #| number of milliseconds after midnight. - - my $rule = $zone->{rule}; - if ($rule ne $TZ::STANDARD) { - $rule = $rules->{$rule}; - # $rule is now an array ref, with [0] being the onset and - # [1] being the cease. - - if (@{$rule} >= 4 && ($rule->[3] & 1) && ($rule->[3] & 2)) { - - formatRule($rule->[0], \@spec, \@notes); # Onset - formatRule($rule->[1], \@spec, \@notes); # Cease - - my @a = parseTime($rule->[0]->{save}); - if ($a[1] ne 'w') { - die "Strange DST savings value: \"$rule->[0]->{save}\""; - } - push @notes, $rule->[0]->{save}; - push @spec, $a[0]; - } - } - - (\@spec, \@notes); -} - -# Format a rule and return the string -# Param: reference to rule hash -# Param: ref to spec array (this is a result param) -# Param: ref to annotation array (this is a result param) -sub formatRule { - my $rule = shift; - my $spec = shift; - my $notes = shift; - push @$notes, $rule->{in}, $rule->{on}, $rule->{at}; - push @$spec, parseMonth($rule->{in}); # Month - push @$spec, parseDaySpecifier($rule->{on}); # Day - push @$spec, parseTime($rule->{at}); # Time -} - -# Format an offset in seconds and return a string of the form -# /[+-]\d{1,2}:\d\d(:\d\d)?/. -# Param: Offset in seconds -# Return: String -sub formatOffset { - local $_ = shift; - my $result = $_<0 ? "-":"+"; - $_ = -$_ if ($_ < 0); - my $sec = $_ % 60; $_ = ($_ - $sec) / 60; - my $min = $_ % 60; $_ = ($_ - $min) / 60; - $min = "0$min" if ($min < 10); - $sec = $sec ? ($sec < 10 ? ":0$sec" : ":$sec") : ""; - $result . $_ . ":" . $min . $sec; -} - -# Parse a time of the format dd:dds, where s is a suffix character. -# Return the time, in minutes, and the suffix, in an array. -# Only the suffixes 's' and 'u' are recognized. -# Param: String, with optional suffix -# Return: Array ( seconds, suffix ). If no suffix, 'w' is used. -sub parseTime { - local $_ = shift; - if (/^(\d{1,2}):(\d\d)([su])?$/) { - my $a = ($1*60) + $2; - my $s = defined $3?$3:'w'; - return ( $a, $s ); - } else { - die "Cannot parse time \"$_\""; - } -} - -# Given a month string, return an integer from 0 (Jan) to 11 (Dec). -# Param: Str -# Return: Int 0..11. -sub parseMonth { - local $_ = shift; - for (my $i=0; $i<12; $i++) { - return $i if (/$MONTH[$i]/i); - } - die "Can't parse month \"$_\""; -} - -# Given a specifier for the day of the month on which a rule triggers, -# return an array of two integers encoding that information. We use -# the ICU/java.util.SimpleTimeZone encoding scheme using two integers. -# We return the two integers in an array of ( dowim dow ). -# Param: String, such as -# 1, 12, 15, 18, 2, 20, 21, 22, 23, 25, 28, 3, 30, 31, 4, 7, Fri>=1, -# Fri>=15, Sat>=1, Sat>=15, Sun<=14, Sun>=1, Sun>=10, Sun>=11, Sun>=15, -# Sun>=16, Sun>=23, Sun>=8, Sun>=9, lastFri, lastSun, lastThu -# This is the {on} field of the rule hash. -# Return: Array of two integers, ( dowim dow ). -# The dow has Sunday = 1 .. Saturday = 7. -sub parseDaySpecifier { - local $_ = shift; - - #|+If both dayOfWeekInMonth and dayOfWeek are positive, they specify the - #| day of week in the month (e.g., (2, WEDNESDAY) is the second Wednesday - #| of the month). - #|+If dayOfWeek is positive and dayOfWeekInMonth is negative, they specify - #| the day of week in the month counting backward from the end of the month. - #| (e.g., (-1, MONDAY) is the last Monday in the month) - #|+If dayOfWeek is zero and dayOfWeekInMonth is positive, dayOfWeekInMonth - #| specifies the day of the month, regardless of what day of the week it is. - #| (e.g., (10, 0) is the tenth day of the month) - #|+If dayOfWeek is zero and dayOfWeekInMonth is negative, dayOfWeekInMonth - #| specifies the day of the month counting backward from the end of the - #| month, regardless of what day of the week it is (e.g., (-2, 0) is the - #| next-to-last day of the month). - #|+If dayOfWeek is negative and dayOfWeekInMonth is positive, they specify the - #| first specified day of the week on or after the specfied day of the month. - #| (e.g., (15, -SUNDAY) is the first Sunday after the 15th of the month - #| [or the 15th itself if the 15th is a Sunday].) - #|+If dayOfWeek and dayOfWeekInMonth are both negative, they specify the - #| last specified day of the week on or before the specified day of the month. - #| (e.g., (-20, -TUESDAY) is the last Tuesday before the 20th of the month - #| [or the 20th itself if the 20th is a Tuesday].) - - # dowim dow - # >0 >0 day of week in month - # <0 >0 day of week in month (from end) - # >0 0 day of month - # <0 0 day of month (from end; -1 is last dom) - # >0 <0 first dow on or after dom - # <0 <0 last dow on or before dom - - my $dowim; - my $dow = 0; - - # Check for straight DOM - if (/^\d+$/) { - $dowim = $_; - $dow = 0; - return ( $dowim, $dow ); - } - - # Anything else must have a dow embedded in it; parse it out - my @DOW = ( 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ); - for (my $i=0; $i<@DOW; $i++) { - if (s/$DOW[$i]//) { - $dow = $i + 1; - last; - } - } - if ($dow == 0) { - die "Cannot parse day specifier \"$_\""; - } - - # Now we have either >=n, <=n, last, or first. - if (/^last$/) { - $dowim = -1; - } elsif (/^first$/) { - $dowim = 1; - } elsif (/^>=(\d+)$/) { - $dowim = $1; - $dow = -$dow; - } elsif (/^<=(\d+)$/) { - $dowim = -$1; - $dow = -$dow; - } else { - die "Cannot parse day specifier \"$_\""; - } - - ( $dowim, $dow ); -} - -# Confirm that the given ID contains only invariant characters. -# See utypes.h for an explanation. -# Param: string to be checked -sub assertInvariantChars { - local $_ = shift; - if (/[^A-Za-z0-9 \"%&\'()*+,-.\/:;<=>?_]/) { - die "Error: Zone ID \"$_\" contains non-invariant characters\n"; - } -} - -# Map ID to equivalency table index. Return the index of the given ID -# in the equivalency array. The array contains array refs. Each ref -# points to an array of strings. -# Param: ID to find -# Param: Ref to equiv array (ref to array of refs to arrays of IDs) -# Return: Index into array where ID is found, or -1 if not found -# NOTE: This function can be eliminated by generating a reverse -# mapping hash when we create the equivalency table. -sub equivIndexOf { - my $id = shift; - my $a = shift; - for (my $i=0; $i < scalar @{$a}; ++$i) { - my $aa = $a->[$i]; - foreach (@$aa) { - return $i if ($_ eq $id); - } - } - return -1; -} - -__END__ diff --git a/icuSources/tools/gentz/tzparse.pm b/icuSources/tools/gentz/tzparse.pm deleted file mode 100644 index a30ccc5d..00000000 --- a/icuSources/tools/gentz/tzparse.pm +++ /dev/null @@ -1,328 +0,0 @@ -###################################################################### -# Copyright (C) 1999-2001, International Business Machines -# Corporation and others. All Rights Reserved. -###################################################################### -# See: ftp://elsie.nci.nih.gov/pub/tzdata -# where is "1999b" or a similar string. -###################################################################### -# This package handles the parsing of time zone files. -# Author: Alan Liu -###################################################################### -# Usage: -# Call ParseFile for each file to be imported. Then call ParseZoneTab -# to add country data. Then call Postprocess to remove unused rules. - -package TZ; -use strict; -use Carp; -use vars qw(@ISA @EXPORT $VERSION $YEAR $STANDARD); -require 'dumpvar.pl'; - -@ISA = qw(Exporter); -@EXPORT = qw(ParseFile - Postprocess - ParseZoneTab - ); -$VERSION = '0.2'; - -$STANDARD = '-'; # Name of the Standard Time rule - -###################################################################### -# Read the tzdata zone.tab file and add a {country} field to zones -# in the given hash. -# Param: File name (/zone.tab) -# Param: Ref to hash of zones -# Param: Ref to hash of links -sub ParseZoneTab { - my ($FILE, $ZONES, $LINKS) = @_; - - my %linkEntries; - - local(*FILE); - open(FILE,"<$FILE") or confess "Can't open $FILE: $!"; - while () { - # Handle comments - s/\#.*//; - next if (!/\S/); - - if (/^\s*([A-Z]{2})\s+[-+0-9]+\s+(\S+)/) { - my ($country, $zone) = ($1, $2); - if (exists $ZONES->{$zone}) { - $ZONES->{$zone}->{country} = $country; - } elsif (exists $LINKS->{$zone}) { - # We have a country mapping for a zone that isn't in - # our hash. This means it is a link entry. Save this - # then handle it below. - $linkEntries{$zone} = $country; - } else { - print STDERR "Nonexistent zone $zone in $FILE\n"; - } - } else { - confess "Can't parse line \"$_\" of $FILE"; - } - } - close(FILE); - - # Now that we have mapped all of the zones in %$ZONES (except - # those without country affiliations), process the link entries. - # For those zones in the table that differ by country from their - # source zone, instantiate a new zone in the new country. An - # example is Europe/Vatican, which is linked to Europe/Rome. If - # we don't instantiate it, we have nothing for Vatican City. - # Another example is America/Shiprock, which links to - # America/Denver. These are identical and both in the US, so we - # don't instantiate America/Shiprock. - foreach my $zone (keys %linkEntries) { - my $country = $linkEntries{$zone}; - my $linkZone = $LINKS->{$zone}; - my $linkCountry = $ZONES->{$linkZone}->{country}; - if ($linkCountry ne $country) { - # print "Cloning $zone ($country) from $linkZone ($linkCountry)\n"; - _CloneZone($ZONES, $LINKS->{$zone}, $zone); - $ZONES->{$zone}->{country} = $country; - } - } -} - -###################################################################### -# Param: File name -# Param: Ref to hash of zones -# Param: Ref to hash of rules -# Parma: Ref to hash of links -# Param: Current year -sub ParseFile { - my ($FILE, $ZONES, $RULES, $LINKS, $YEAR) = @_; - - local(*FILE); - open(FILE,"<$FILE") or confess "Can't open $FILE: $!"; - my $zone; # Current zone - my $badLineCount = 0; - while () { - # Handle comments and blanks - s/\#.*//; - next if (!/\S/); - - #|# Zone NAME GMTOFF RULES FORMAT [UNTIL] - #|Zone America/Montreal -4:54:16 - LMT 1884 - #| -5:00 Mont E%sT - #|Zone America/Thunder_Bay -5:57:00 - LMT 1895 - #| -5:00 Canada E%sT 1970 - #| -5:00 Mont E%sT 1973 - #| -5:00 - EST 1974 - #| -5:00 Canada E%sT - my ($zoneGmtoff, $zoneRule, $zoneFormat, $zoneUntil); - if (/^zone/i) { - # Zone block start - if (/^zone\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/i - || /^zone\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)()/i) { - $zone = $1; - ($zoneGmtoff, $zoneRule, $zoneFormat, $zoneUntil) = - ($2, $3, $4, $5); - } else { - print STDERR "Can't parse in $FILE: $_"; - ++$badLineCount; - } - } elsif (/^\s/ && $zone) { - # Zone continuation - if (/^\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/ - || /^\s+(\S+)\s+(\S+)\s+(\S+)()/) { - ($zoneGmtoff, $zoneRule, $zoneFormat, $zoneUntil) = - ($1, $2, $3, $4); - } else { - print STDERR "Can't parse in $FILE: $_"; - ++$badLineCount; - } - } elsif (/^rule/i) { - # Here is where we parse a single line of the rule table. - # Our goal is to accept only rules applying to the current - # year. This is normally a matter of accepting rules - # that match the current year. However, in some cases this - # is more complicated. For example: - #|# Tonga - #|# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S - #|Rule Tonga 1999 max - Oct Sat>=1 2:00s 1:00 S - #|Rule Tonga 2000 max - Apr Sun>=16 2:00s 0 - - # To handle this properly, we save every rule we encounter - # (thus overwriting older ones with newer ones, since rules - # are listed in order), and also use slot [2] to mark when - # we see a current year rule. When that happens, we stop - # saving rules. Thus we match the latest rule we see, or - # a matching rule if we find one. The format of slot [2] - # is just a 2 bit flag ([2]&1 means slot [0] matched, - # [2]&2 means slot [1] matched). - - # Note that later, when the rules are post processed - # (see Postprocess), the slot [2] will be overwritten - # with the compressed rule string used to implement - # equality testing. - - $zone = undef; - # Rule - #|# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S - #|Rule US 1918 1919 - Mar lastSun 2:00 1:00 W # War - #|Rule US 1918 1919 - Oct lastSun 2:00 0 S - #|Rule US 1942 only - Feb 9 2:00 1:00 W # War - #|Rule US 1945 only - Sep 30 2:00 0 S - #|Rule US 1967 max - Oct lastSun 2:00 0 S - #|Rule US 1967 1973 - Apr lastSun 2:00 1:00 D - #|Rule US 1974 only - Jan 6 2:00 1:00 D - #|Rule US 1975 only - Feb 23 2:00 1:00 D - #|Rule US 1976 1986 - Apr lastSun 2:00 1:00 D - #|Rule US 1987 max - Apr Sun>=1 2:00 1:00 D - if (/^rule\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+ - (\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/xi) { - my ($name, $from, $to, $type, $in, $on, $at, $save, $letter) = - ($1, $2, $3, $4, $5, $6, $7, $8, $9); - my $i = $save ? 0:1; - - if (!exists $RULES->{$name}) { - $RULES->{$name} = []; - } - my $ruleArray = $RULES->{$name}; - - # Check our bit mask to see if we've already matched - # a current rule. If so, do nothing. If not, then - # save this rule line as the best one so far. - if (@{$ruleArray} < 3 || - !($ruleArray->[2] & 1 << $i)) { - my $h = $ruleArray->[$i]; - $ruleArray->[$i]->{from} = $from; - $ruleArray->[$i]->{to} = $to; - $ruleArray->[$i]->{type} = $type; - $ruleArray->[$i]->{in} = $in; - $ruleArray->[$i]->{on} = $on; - $ruleArray->[$i]->{at} = $at; - $ruleArray->[$i]->{save} = $save; - $ruleArray->[$i]->{letter} = $letter; - - # Does this rule match the current year? If so, - # set the bit mask so we don't overwrite this rule. - # This makes us ingore rules for subsequent years - # that are already listed in the database -- as long - # as we have an overriding rule for the current year. - if (($from == $YEAR && $to =~ /only/i) || - ($from <= $YEAR && - (($to =~ /^\d/ && $YEAR <= $to) || $to =~ /max/i))) { - $ruleArray->[2] |= 1 << $i; - $ruleArray->[3] |= 1 << $i; - } - } - } else { - print STDERR "Can't parse in $FILE: $_"; - ++$badLineCount; - } - } elsif (/^link/i) { - #|# Old names, for S5 users - #| - #|# Link LINK-FROM LINK-TO - #|Link America/New_York EST5EDT - #|Link America/Chicago CST6CDT - #|Link America/Denver MST7MDT - #|Link America/Los_Angeles PST8PDT - #|Link America/Indianapolis EST - #|Link America/Phoenix MST - #|Link Pacific/Honolulu HST - # - # There are also links for country-specific zones. - # These are zones the differ only in that they belong - # to a different country. E.g., - #|Link Europe/Rome Europe/Vatican - #|Link Europe/Rome Europe/San_Marino - if (/^link\s+(\S+)\s+(\S+)/i) { - my ($from, $to) = ($1, $2); - # Record all links in $%LINKS - $LINKS->{$to} = $from; - } else { - print STDERR "Can't parse in $FILE: $_"; - ++$badLineCount; - } - } else { - # Unexpected line - print STDERR "Ignoring in $FILE: $_"; - ++$badLineCount; - } - if ($zoneRule && - ($zoneUntil !~ /\S/ || ($zoneUntil =~ /^\d/ && - $zoneUntil >= $YEAR))) { - $ZONES->{$zone}->{gmtoff} = $zoneGmtoff; - $ZONES->{$zone}->{rule} = $zoneRule; - $ZONES->{$zone}->{format} = $zoneFormat; - $ZONES->{$zone}->{until} = $zoneUntil; - } - } - close(FILE); -} - -###################################################################### -# Param: Ref to hash of zones -# Param: Ref to hash of rules -sub Postprocess { - my ($ZONES, $RULES) = @_; - my %ruleInUse; - -# We no longer store links in the zone hash, so we don't need to do this. -# # Eliminate zone links that have no corresponding zone -# foreach (keys %$ZONES) { -# if (exists $ZONES->{$_}->{link} && !exists $ZONES->{$_}->{rule}) { -# if (0) { -# print STDERR -# "Deleting link from historical/nonexistent zone: ", -# $_, " -> ", $ZONES->{$_}->{link}, "\n"; -# } -# delete $ZONES->{$_}; -# } -# } - - # Check that each zone has a corresponding rule. At the same - # time, build up a hash that marks each rule that is in use. - foreach (sort keys %$ZONES) { - my $ruleName = $ZONES->{$_}->{rule}; - next if ($ruleName eq $STANDARD); - if (exists $RULES->{$ruleName}) { - $ruleInUse{$ruleName} = 1; - } else { - # This means the zone is using the standard rule now - $ZONES->{$_}->{rule} = $STANDARD; - } - } - - # Check that both parts are there for rules - # Check for unused rules - # Make coded string for comparisons - foreach (keys %$RULES) { - if (!exists $ruleInUse{$_}) { - if (0) { - print STDERR "Deleting historical/unused rule: $_\n"; - } - delete $RULES->{$_}; - } elsif (!$RULES->{$_}->[0] || !$RULES->{$_}->[1]) { - print STDERR "Rule doesn't have both parts: $_\n"; - } else { - # Generate coded string - # This has all the data about a rule; it can be used - # to see if two rules behave identically - $RULES->{$_}->[2] = - lc($RULES->{$_}->[0]->{in} . "," . - $RULES->{$_}->[0]->{on} . "," . - $RULES->{$_}->[0]->{at} . "," . - $RULES->{$_}->[0]->{save} . ";" . - $RULES->{$_}->[1]->{in} . "," . - $RULES->{$_}->[1]->{on} . "," . - $RULES->{$_}->[1]->{at}); # [1]->{save} is always zero - } - } -} - -###################################################################### -# Create a clone of the zone $oldID named $newID in the hash $ZONES. -# Param: ref to hash of zones -# Param: ID of zone to clone -# Param: ID of new zone -sub _CloneZone { - my $ZONES = shift; - my $oldID = shift; - my $newID = shift; - for my $field (keys %{$ZONES->{$oldID}}) { - $ZONES->{$newID}->{$field} = $ZONES->{$oldID}->{$field}; - } -} diff --git a/icuSources/tools/gentz/tzutil.pm b/icuSources/tools/gentz/tzutil.pm deleted file mode 100644 index 05631aca..00000000 --- a/icuSources/tools/gentz/tzutil.pm +++ /dev/null @@ -1,238 +0,0 @@ -###################################################################### -# Copyright (C) 1999-2001, International Business Machines -# Corporation and others. All Rights Reserved. -###################################################################### -# See: ftp://elsie.nci.nih.gov/pub/tzdata -# where is "1999b" or a similar string. -###################################################################### -# This package contains utility functions for time zone data. -# Author: Alan Liu - -###################################################################### -# Zones - A time zone object is a hash with the following keys: -# {gmtoff} The offset from GMT, e.g. "-5:00" -# {rule} The name of the rule, e.g. "-", "Canada", "EU", "US" -# {format} The local abbreviation, e.g. "E%sT" -# {until} Data is good until this year, e.g., "2000". Often blank. - -# These correspond to file entries: -#|# Zone NAME GMTOFF RULES FORMAT [UNTIL] -#|Zone America/Montreal -4:54:16 - LMT 1884 -#| -5:00 Mont E%sT - -# Links come from the file entries: -#|# Link LINK-FROM LINK-TO -#|Link America/New_York EST5EDT -#|Link America/Chicago CST6CDT -# Link data is _not_ stored in the zone hash. Instead, links are -# kept in a separate hash and resolved after all zones are defined. -# In general, we ignore links, but they provide critical data when -# generating country information. - -# The name of the zone itself is not kept in the zone object. -# Instead, zones are kept in a big hash. The keys are the names; the -# values are references to the zone objects. The big hash of all -# zones is referred to in all caps: %ZONES ($ZONES if it's a -# reference). - -# Example: $ZONES->{"America/Los_Angeles"} = -# 'format' => 'P%sT' -# 'gmtoff' => '-8:00' -# 'rule' => 'US' -# 'until' => '' - -###################################################################### -# Rules - A time zone rule is an array with the following elements: -# [0] Onset rule -# [1] Cease rule -# [2] Encoded string - -# The onset rule and cease rule have the same format. They are each -# references to a hash with keys: -# {from} Start year -# {to} End year, or "only" or "max" -# {type} Unknown, usually "-" -# {in} Month, 3 letters -# {on} Day specifier, e.g. "lastSun", "Sun>=1", "23" -# {at} Time, e.g. "2:00", "1:00u" -# {save} Amount of savings, for the onset; 0 for the cease -# {letter} Guess: the letter that goes into %s in the zone {format} - -# These correspond to the file entries thus: -#|# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S -#|Rule US 1942 only - Feb 9 2:00 1:00 W # War -#|Rule US 1945 only - Sep 30 2:00 0 S -#|Rule US 1967 max - Oct lastSun 2:00 0 S -#|Rule US 1967 1973 - Apr lastSun 2:00 1:00 D -#|Rule US 1974 only - Jan 6 2:00 1:00 D -#|Rule US 1975 only - Feb 23 2:00 1:00 D -#|Rule US 1976 1986 - Apr lastSun 2:00 1:00 D -#|Rule US 1987 max - Apr Sun>=1 2:00 1:00 D - -# Entry [2], the encoded string, is used to see if two rules are the -# same. It consists of "[0]->{in},[0]->{on},[0]->{at},[0]->{save}; -# [1]->{in},[1]->{on},[1]->{at}". Note that the separator between -# values is a comma, between onset and cease is a semicolon. Also -# note that the cease {save} is not used as this is always 0. The -# whole string is forced to lowercase. - -# Rules don't contain their own name. Like zones, rules are kept in a -# big hash; the keys are the names, the values the references to the -# arrays. This hash of all rules is referred to in all caps, %RULES -# or for a reference, $RULES. - -# Example: $RULES->{"US"} = -# 0 HASH(0x8fa03c) -# 'at' => '2:00' -# 'from' => 1987 -# 'in' => 'Apr' -# 'letter' => 'D' -# 'on' => 'Sun>=1' -# 'save' => '1:00' -# 'to' => 'max' -# 'type' => '-' -# 1 HASH(0x8f9fc4) -# 'at' => '2:00' -# 'from' => 1967 -# 'in' => 'Oct' -# 'letter' => 'S' -# 'on' => 'lastSun' -# 'save' => 0 -# 'to' => 'max' -# 'type' => '-' -# 2 'apr,sun>=1,2:00,1:00;oct,lastsun,2:00' - -package TZ; -use strict; -use Carp; -use vars qw(@ISA @EXPORT $VERSION $STANDARD); -require 'dumpvar.pl'; - -@ISA = qw(Exporter); -@EXPORT = qw(ZoneEquals - RuleEquals - ZoneCompare - RuleCompare - FormZoneEquivalencyGroups - ParseOffset - ); -$VERSION = '0.1'; - -$STANDARD = '-'; # Name of the Standard Time rule - -###################################################################### -# Param: zone object (hash ref) -# Param: zone object (hash ref) -# Param: ref to hash of all rules -# Return: 0, -1, or 1 -sub ZoneCompare { - my $z1 = shift; - my $z2 = shift; - my $RULES = shift; - - ($z1, $z2) = ($z1->{rule}, $z2->{rule}); - - return RuleCompare($RULES->{$z1}, $RULES->{$z2}); -} - -###################################################################### -# Param: rule object (hash ref) -# Param: rule object (hash ref) -# Return: 0, -1, or 1 -sub RuleCompare { - my $r1 = shift; - my $r2 = shift; - - # Just compare the precomputed encoding strings. - # defined() catches undefined rules. The only undefined - # rule is $STANDARD; any others would be caught by - # Postprocess(). - - defined($r1) - ? (defined($r2) ? ($r1->[2] cmp $r2->[2]) : 1) - : (defined($r2) ? -1 : 0); - - # In theory, there's actually one more level of equivalency - # analysis we could do. This is to recognize that Sun >=1 is the - # same as First Sun. We don't do this yet, but it doesn't matter; - # such a date is always referred to as Sun>=1, never as firstSun. -} - -###################################################################### -# Param: zone object (hash ref) -# Param: zone object (hash ref) -# Param: ref to hash of all rules -# Return: true if two zones are equivalent -sub ZoneEquals { - ZoneCompare(@_) == 0; -} - -###################################################################### -# Param: rule object (hash ref) -# Param: rule object (hash ref) -# Return: true if two rules are equivalent -sub RuleEquals { - RuleCompare(@_) == 0; -} - -###################################################################### -# Given a hash of all zones and a hash of all rules, create a list -# of equivalency groups. These are groups of zones with the same -# offset and equivalent rules. Equivalency is tested with -# ZoneEquals and RuleEquals. The resultant equivalency list is an -# array of refs to groups. Each group is an array of one or more -# zone names. -# Param: IN ref to hash of all zones -# Param: IN ref to hash of all rules -# Param: OUT ref to array to receive group refs -sub FormZoneEquivalencyGroups { - my ($zones, $rules, $equiv) = @_; - - # Group the zones by offset. This improves efficiency greatly; - # instead of an n^2 computation, we just need to do n^2 within - # each offset; a much smaller total number. - my %zones_by_offset; - foreach (keys %$zones) { - push @{$zones_by_offset{ParseOffset($zones->{$_}->{gmtoff})}}, $_; - } - - # Find equivalent rules - foreach my $gmtoff (keys %zones_by_offset) { - # Make an array of equivalency groups - # (array of refs to array of names) - my @equiv; - foreach my $name1 (@{$zones_by_offset{$gmtoff}}) { - my $found = 0; - foreach my $group (@equiv) { - my $name2 = $group->[0]; - if (ZoneEquals($zones->{$name1}, $zones->{$name2}, $rules)) { - push @$group, $name1; - $found = 1; - last; - } - } - if (!$found) { - my @newGroup = ( $name1 ); - push @equiv, \@newGroup; - } - } - push @$equiv, @equiv; - } -} - -###################################################################### -# Parse an offset of the form d, d:dd, or d:dd:dd, or any of the above -# preceded by a '-'. Return the total number of seconds represented. -# Param: String -# Return: Integer number of seconds -sub ParseOffset { - local $_ = shift; - if (/^(-)?(\d{1,2})(:(\d\d))?(:(\d\d))?$/) { - # 1 2 3 4 5 6 - my $a = (($2 * 60) + (defined $4?$4:0)) * 60 + (defined $6?$6:0); - $a = -$a if (defined $1 && $1 eq '-'); - return $a; - } else { - confess "Cannot parse offset \"$_\""; - } -} diff --git a/icuSources/tools/genuca/Makefile.in b/icuSources/tools/genuca/Makefile.in index aaf16504..3ec6f6b8 100644 --- a/icuSources/tools/genuca/Makefile.in +++ b/icuSources/tools/genuca/Makefile.in @@ -1,5 +1,5 @@ ## Makefile.in for ICU - tools/genuca -## Copyright (c) 1999-2003, International Business Machines Corporation and +## Copyright (c) 1999-2004, International Business Machines Corporation and ## others. All Rights Reserved. ## Source directory information @@ -12,18 +12,20 @@ include $(top_builddir)/icudefs.mk ## +TARGET_STUB_NAME = genuca + SECTION = 8 -MAN_FILES = $(TARGET:$(EXEEXT)=).$(SECTION) +MAN_FILES = $(TARGET_STUB_NAME).$(SECTION) ## Build directory information subdir = tools/genuca ## Extra files to remove for 'make clean' -CLEANFILES = *~ $(MAN_FILES) $(DEPS) +CLEANFILES = *~ $(MAN_FILES) $(DEPS) ## Target information -TARGET = genuca$(EXEEXT) +TARGET = $(BINDIR)/$(TARGET_STUB_NAME)$(EXEEXT) CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common -I$(top_srcdir)/i18n -I$(srcdir)/../toolutil LIBS = $(LIBICUI18N) $(LIBICUTOOLUTIL) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M) @@ -53,9 +55,9 @@ all-local: $(TARGET) $(MAN_FILES) install-local: all-local install-man $(MKINSTALLDIRS) $(DESTDIR)$(sbindir) - $(INSTALL) $(TARGET) $(DESTDIR)$(sbindir)/$(TARGET) + $(INSTALL) $(TARGET) $(DESTDIR)$(sbindir) - #include "unicode/utypes.h" +#include "unicode/putil.h" #include "unicode/udata.h" +#include "unicode/uclean.h" #include "ucol_imp.h" #include "genuca.h" #include "uoptions.h" @@ -34,6 +35,8 @@ #include "cstring.h" #include "cmemory.h" +#include + /* * Global - verbosity */ @@ -60,6 +63,42 @@ static UDataInfo dummyDataInfo = { #else +static const UDataInfo ucaDataInfo={ + sizeof(UDataInfo), + 0, + + U_IS_BIG_ENDIAN, + U_CHARSET_FAMILY, + sizeof(UChar), + 0, + + {UCA_DATA_FORMAT_0, UCA_DATA_FORMAT_1, UCA_DATA_FORMAT_2, UCA_DATA_FORMAT_3}, /* dataFormat="UCol" */ + /* 03/26/2002 bumped up version since format has changed */ + /* 09/16/2002 bumped up version since we went from UColAttributeValue */ + /* to int32_t in UColOptionSet */ + /* 05/13/2003 This one also updated since we added UCA and UCD versions */ + /* to header */ + /* 09/11/2003 Adding information required by data swapper */ + {UCA_FORMAT_VERSION_0, UCA_FORMAT_VERSION_1, UCA_FORMAT_VERSION_2, UCA_FORMAT_VERSION_3}, /* formatVersion */ + {0, 0, 0, 0} /* dataVersion = Unicode Version*/ +}; + +static const UDataInfo invUcaDataInfo={ + sizeof(UDataInfo), + 0, + + U_IS_BIG_ENDIAN, + U_CHARSET_FAMILY, + sizeof(UChar), + 0, + + {INVUCA_DATA_FORMAT_0, INVUCA_DATA_FORMAT_1, INVUCA_DATA_FORMAT_2, INVUCA_DATA_FORMAT_3}, /* dataFormat="InvC" */ + /* 03/26/2002 bumped up version since format has changed */ + /* 04/29/2003 2.1 format - we have added UCA version to header */ + {INVUCA_FORMAT_VERSION_0, INVUCA_FORMAT_VERSION_1, INVUCA_FORMAT_VERSION_2, INVUCA_FORMAT_VERSION_3}, /* formatVersion */ + {0, 0, 0, 0} /* dataVersion = Unicode Version*/ +}; + UCAElements le; int32_t readElement(char **from, char *to, char separator, UErrorCode *status) { @@ -217,10 +256,58 @@ static void addToExistingInverse(UCAElements *element, uint32_t position, UError } } +/* + * Takes two CEs (lead and continuation) and + * compares them as CEs should be compared: + * primary vs. primary, secondary vs. secondary + * tertiary vs. tertiary + */ +static int32_t compareCEs(uint32_t *source, uint32_t *target) { + uint32_t s1 = source[0], s2, t1 = target[0], t2; + if(isContinuation(source[1])) { + s2 = source[1]; + } else { + s2 = 0; + } + if(isContinuation(target[1])) { + t2 = target[1]; + } else { + t2 = 0; + } + + uint32_t s = 0, t = 0; + if(s1 == t1 && s2 == t2) { + return 0; + } + s = (s1 & 0xFFFF0000)|((s2 & 0xFFFF0000)>>16); + t = (t1 & 0xFFFF0000)|((t2 & 0xFFFF0000)>>16); + if(s < t) { + return -1; + } else if(s > t) { + return 1; + } else { + s = (s1 & 0x0000FF00) | (s2 & 0x0000FF00)>>8; + t = (t1 & 0x0000FF00) | (t2 & 0x0000FF00)>>8; + if(s < t) { + return -1; + } else if(s > t) { + return 1; + } else { + s = (s1 & 0x000000FF)<<8 | (s2 & 0x000000FF); + t = (t1 & 0x000000FF)<<8 | (t2 & 0x000000FF); + if(s < t) { + return -1; + } else { + return 1; + } + } + } +} + static uint32_t addToInverse(UCAElements *element, UErrorCode *status) { - uint32_t comp = 0; uint32_t position = inversePos; uint32_t saveElement = element->CEs[0]; + int32_t compResult = 0; element->CEs[0] &= 0xFFFFFF3F; if(element->noOfCEs == 1) { element->CEs[1] = 0; @@ -228,42 +315,17 @@ static uint32_t addToInverse(UCAElements *element, UErrorCode *status) { if(inversePos == 0) { inverseTable[0][0] = inverseTable[0][1] = inverseTable[0][2] = 0; addNewInverse(element, status); - } else if(inverseTable[inversePos][0] > element->CEs[0]) { - while(inverseTable[--position][0] > element->CEs[0]) {} - if(VERBOSE) { fprintf(stdout, "p:%i ", position); } - if(inverseTable[position][0] == element->CEs[0]) { - if(isContinuation(element->CEs[1])) { - comp = element->CEs[1]; - } else { - comp = 0; - } - if(inverseTable[position][1] > comp) { - while(inverseTable[--position][1] > comp) {} - } - if(inverseTable[position][1] == comp) { - addToExistingInverse(element, position, status); - } else { - insertInverse(element, position+1, status); - } - } else { - if(VERBOSE) { fprintf(stdout, "ins"); } + } else if(compareCEs(inverseTable[inversePos], element->CEs) > 0) { + while((compResult = compareCEs(inverseTable[--position], element->CEs)) > 0); + if(VERBOSE) { fprintf(stdout, "p:%u ", (int)position); } + if(compResult == 0) { + addToExistingInverse(element, position, status); + } else { insertInverse(element, position+1, status); } - } else if(inverseTable[inversePos][0] == element->CEs[0]) { - if(element->noOfCEs > 1 && isContinuation(element->CEs[1])) { - comp = element->CEs[1]; - if(inverseTable[position][1] > comp) { - while(inverseTable[--position][1] > comp) {} - } - if(inverseTable[position][1] == comp) { - addToExistingInverse(element, position, status); - } else { - insertInverse(element, position+1, status); - } - } else { - addToExistingInverse(element, inversePos, status); - } - } else { + } else if(compareCEs(inverseTable[inversePos], element->CEs) == 0) { + addToExistingInverse(element, inversePos, status); + } else { addNewInverse(element, status); } element->CEs[0] = saveElement; @@ -280,6 +342,7 @@ static InverseUCATableHeader *assembleInverseTable(UErrorCode *status) uint32_t i = 0; result = (InverseUCATableHeader *)uprv_malloc(headerByteSize + inverseTableByteSize + contsByteSize); + uprv_memset(result, 0, headerByteSize + inverseTableByteSize + contsByteSize); if(result != NULL) { result->byteSize = headerByteSize + inverseTableByteSize + contsByteSize; @@ -290,10 +353,10 @@ static InverseUCATableHeader *assembleInverseTable(UErrorCode *status) inversePos++; for(i = 2; i inverseTable[i][0]) { - fprintf(stderr, "Error at %i: %08X & %08X\n", i, inverseTable[i-1][0], inverseTable[i][0]); + if(compareCEs(inverseTable[i-1], inverseTable[i]) > 0) { + fprintf(stderr, "Error at %i: %08X & %08X\n", (int)i, (int)inverseTable[i-1][0], (int)inverseTable[i][0]); } else if(inverseTable[i-1][0] == inverseTable[i][0] && !(inverseTable[i-1][1] < inverseTable[i][1])) { - fprintf(stderr, "Continuation error at %i: %08X %08X & %08X %08X\n", i, inverseTable[i-1][0], inverseTable[i-1][1], inverseTable[i][0], inverseTable[i][1]); + fprintf(stderr, "Continuation error at %i: %08X %08X & %08X %08X\n", (int)i, (int)inverseTable[i-1][0], (int)inverseTable[i-1][1], (int)inverseTable[i][0], (int)inverseTable[i][1]); } } @@ -328,18 +391,18 @@ static void writeOutInverseData(InverseUCATableHeader *data, uprv_memcpy(&invUcaInfo, &invUcaDataInfo, sizeof(UDataInfo)); u_getUnicodeVersion(invUcaInfo.dataVersion); - pData=udata_create(outputDir, INVC_DATA_TYPE, U_ICUDATA_NAME "_" INVC_DATA_NAME, &invUcaInfo, + pData=udata_create(outputDir, INVC_DATA_TYPE, INVC_DATA_NAME, &invUcaInfo, copyright, status); if(U_FAILURE(*status)) { - fprintf(stderr, "Error: unable to create data memory, error %d\n", *status); + fprintf(stderr, "Error: unable to create %s"INVC_DATA_NAME", error %s\n", outputDir, u_errorName(*status)); return; } /* write the data to the file */ if (VERBOSE) { fprintf(stdout, "Writing out inverse UCA table: %s%c%s.%s\n", outputDir, U_FILE_SEP_CHAR, - U_ICUDATA_NAME "_" INVC_DATA_NAME, + INVC_DATA_NAME, INVC_DATA_TYPE); } udata_writeBlock(pData, data, data->byteSize); @@ -377,7 +440,7 @@ UCAElements *readAnElement(FILE *data, tempUCATable *t, UCAConstants *consts, UE char *endCodePoint = NULL; char *spacePointer = NULL; char *result = fgets(buffer, 2048, data); - int32_t buflen = uprv_strlen(buffer); + int32_t buflen = (int32_t)uprv_strlen(buffer); if(U_FAILURE(*status)) { return 0; } @@ -620,7 +683,8 @@ UCAElements *readAnElement(FILE *data, tempUCATable *t, UCAConstants *consts, UE // we don't want any strange stuff after useful data! while(pointer < commentStart) { - if(*pointer != ' ') { + if(*pointer != ' ' && *pointer != '\t') + { *status=U_INVALID_FORMAT_ERROR; break; } @@ -628,7 +692,7 @@ UCAElements *readAnElement(FILE *data, tempUCATable *t, UCAConstants *consts, UE } if(U_FAILURE(*status)) { - fprintf(stderr, "problem putting stuff in hash table\n"); + fprintf(stderr, "problem putting stuff in hash table %s\n", u_errorName(*status)); *status = U_INTERNAL_PROGRAM_ERROR; return NULL; } @@ -651,6 +715,9 @@ void writeOutData(UCATableHeader *data, uint32_t size = data->size; + data->UCAConsts = data->size; + data->size += paddedsize(sizeof(UCAConstants)); + if(noOfcontractions != 0) { contractions[noOfcontractions][0] = 0; contractions[noOfcontractions][1] = 0; @@ -658,9 +725,9 @@ void writeOutData(UCATableHeader *data, noOfcontractions++; - data->UCAConsts = data->size; - data->size += paddedsize(sizeof(UCAConstants)); data->contractionUCACombos = data->size; + data->contractionUCACombosWidth = 3; + data->contractionUCACombosSize = noOfcontractions; data->size += paddedsize((noOfcontractions*3*sizeof(UChar))); } @@ -671,11 +738,11 @@ void writeOutData(UCATableHeader *data, uprv_memcpy(&ucaInfo, &ucaDataInfo, sizeof(UDataInfo)); u_getUnicodeVersion(ucaInfo.dataVersion); - pData=udata_create(outputDir, UCA_DATA_TYPE, U_ICUDATA_NAME "_" UCA_DATA_NAME, &ucaInfo, + pData=udata_create(outputDir, UCA_DATA_TYPE, UCA_DATA_NAME, &ucaInfo, copyright, status); if(U_FAILURE(*status)) { - fprintf(stderr, "Error: unable to create data memory, error %d\n", *status); + fprintf(stderr, "Error: unable to create %s"UCA_DATA_NAME", error %s\n", outputDir, u_errorName(*status)); return; } @@ -716,22 +783,26 @@ write_uca_table(const char *filename, UChar variableTopValue = 0; UCATableHeader *myD = (UCATableHeader *)uprv_malloc(sizeof(UCATableHeader)); /* test for NULL */ - if(myD == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - fclose(data); - return 0; - } + if(myD == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + fclose(data); + return 0; + } + uprv_memset(myD, 0, sizeof(UCATableHeader)); UColOptionSet *opts = (UColOptionSet *)uprv_malloc(sizeof(UColOptionSet)); /* test for NULL */ - if(opts == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - uprv_free(myD); - fclose(data); - return 0; - } + if(opts == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + uprv_free(myD); + fclose(data); + return 0; + } + uprv_memset(opts, 0, sizeof(UColOptionSet)); UChar contractionCEs[256][3]; + uprv_memset(contractionCEs, 0, 256*3*sizeof(UChar)); uint32_t noOfContractions = 0; UCAConstants consts; + uprv_memset(&consts, 0, sizeof(consts)); #if 0 UCAConstants consts = { UCOL_RESET_TOP_VALUE, @@ -770,7 +841,7 @@ write_uca_table(const char *filename, return -1; } - memset(inverseTable, 0xDA, sizeof(int32_t)*3*0xFFFF); + uprv_memset(inverseTable, 0xDA, sizeof(int32_t)*3*0xFFFF); opts->variableTopValue = variableTopValue; opts->strength = UCOL_TERTIARY; @@ -780,9 +851,10 @@ write_uca_table(const char *filename, opts->caseLevel = UCOL_OFF; /* do we have an extra case level */ opts->normalizationMode = UCOL_OFF; /* attribute for normalization */ opts->hiraganaQ = UCOL_OFF; /* attribute for JIS X 4061, used only in Japanese */ + opts->numericCollation = UCOL_OFF; myD->jamoSpecial = FALSE; - tempUCATable *t = uprv_uca_initTempTable(myD, opts, NULL, IMPLICIT_TAG, status); + tempUCATable *t = uprv_uca_initTempTable(myD, opts, NULL, IMPLICIT_TAG, LEAD_SURROGATE_TAG, status); if(U_FAILURE(*status)) { fprintf(stderr, "Failed to init UCA temp table: %s\n", u_errorName(*status)); @@ -816,7 +888,7 @@ struct { {0x2F800, 0x2FA1D, UCOL_SPECIAL_FLAG | (CJK_IMPLICIT_TAG << 24) }, //7 CJK_IMPLICIT_TAG, /* 0x2F800-0x2FA1D*/ #endif {0xAC00, 0xD7B0, UCOL_SPECIAL_FLAG | (HANGUL_SYLLABLE_TAG << 24) }, //0 HANGUL_SYLLABLE_TAG,/* AC00-D7AF*/ - {0xD800, 0xDC00, UCOL_SPECIAL_FLAG | (LEAD_SURROGATE_TAG << 24) }, //1 LEAD_SURROGATE_TAG, /* D800-DBFF*/ + //{0xD800, 0xDC00, UCOL_SPECIAL_FLAG | (LEAD_SURROGATE_TAG << 24) }, //1 LEAD_SURROGATE_TAG, /* D800-DBFF*/ {0xDC00, 0xE000, UCOL_SPECIAL_FLAG | (TRAIL_SURROGATE_TAG << 24) }, //2 TRAIL_SURROGATE DC00-DFFF // Now directly handled in the collation code by the swapCJK function. //{0x3400, 0x4DB6, UCOL_SPECIAL_FLAG | (CJK_IMPLICIT_TAG << 24) }, //3 CJK_IMPLICIT_TAG, /* 0x3400-0x4DB5*/ @@ -836,15 +908,15 @@ struct { int32_t surrogateCount = 0; while(!feof(data)) { if(U_FAILURE(*status)) { - fprintf(stderr, "Something returned an error %i (%s) while processing line %i of %s. Exiting...\n", - *status, u_errorName(*status), line, filename); + fprintf(stderr, "Something returned an error %i (%s) while processing line %u of %s. Exiting...\n", + *status, u_errorName(*status), (int)line, filename); exit(*status); } element = readAnElement(data, t, &consts, status); line++; if(VERBOSE) { - fprintf(stdout, "%i ", line); + fprintf(stdout, "%u ", (int)line); } if(element != NULL) { // we have read the line, now do something sensible with the read data! @@ -883,26 +955,28 @@ struct { fprintf(stderr, "UCA version not specified. Cannot create data file!\n"); return -1; } - +/* { + uint32_t trieWord = utrie_get32(t->mapping, 0xDC01, NULL); + }*/ if (VERBOSE) { - fprintf(stdout, "\nLines read: %i\n", line); - fprintf(stdout, "Surrogate count: %i\n", surrogateCount); + fprintf(stdout, "\nLines read: %u\n", (int)line); + fprintf(stdout, "Surrogate count: %i\n", (int)surrogateCount); fprintf(stdout, "Raw data breakdown:\n"); /*fprintf(stdout, "Compact array stage1 top: %i, stage2 top: %i\n", t->mapping->stage1Top, t->mapping->stage2Top);*/ - fprintf(stdout, "Number of contractions: %i\n", noOfContractions); - fprintf(stdout, "Contraction image size: %i\n", t->image->contractionSize); - fprintf(stdout, "Expansions size: %i\n", t->expansions->position); + fprintf(stdout, "Number of contractions: %u\n", (int)noOfContractions); + fprintf(stdout, "Contraction image size: %u\n", (int)t->image->contractionSize); + fprintf(stdout, "Expansions size: %i\n", (int)t->expansions->position); } /* produce canonical closure for table */ /* first set up constants for implicit calculation */ - uprv_uca_initImplicitConstants(consts.UCA_PRIMARY_IMPLICIT_MIN); + uprv_uca_initImplicitConstants(consts.UCA_PRIMARY_IMPLICIT_MIN, consts.UCA_PRIMARY_IMPLICIT_MAX, status); /* do the closure */ int32_t noOfClosures = uprv_uca_canonicalClosure(t, status); if(noOfClosures != 0) { - fprintf(stderr, "Warning: %i canonical closures occured!\n", noOfClosures); + fprintf(stderr, "Warning: %i canonical closures occured!\n", (int)noOfClosures); } /* test */ @@ -911,9 +985,14 @@ struct { if (VERBOSE) { fprintf(stdout, "Compacted data breakdown:\n"); /*fprintf(stdout, "Compact array stage1 top: %i, stage2 top: %i\n", t->mapping->stage1Top, t->mapping->stage2Top);*/ - fprintf(stdout, "Number of contractions: %i\n", noOfContractions); - fprintf(stdout, "Contraction image size: %i\n", t->image->contractionSize); - fprintf(stdout, "Expansions size: %i\n", t->expansions->position); + fprintf(stdout, "Number of contractions: %u\n", (int)noOfContractions); + fprintf(stdout, "Contraction image size: %u\n", (int)t->image->contractionSize); + fprintf(stdout, "Expansions size: %i\n", (int)t->expansions->position); + } + + if(U_FAILURE(*status)) { + fprintf(stderr, "Error creating table: %s\n", u_errorName(*status)); + return -1; } /* populate the version info struct with version info*/ @@ -1000,17 +1079,15 @@ int main(int argc, char* argv[]) { argv[0], u_getDataDirectory()); return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR; } - if(options[3].doesOccur) { - fprintf(stdout, "genuca version %hu.%hu, ICU tool to read UCA text data and create UCA data tables for collation.\n", + fprintf(stdout, "genuca version %hu.%hu, ICU tool to read UCA text data and create UCA data tables for collation.\n", #if UCONFIG_NO_COLLATION 0, 0 #else - ucaDataInfo.formatVersion[0], ucaDataInfo.formatVersion[1] + UCA_FORMAT_VERSION_0, UCA_FORMAT_VERSION_1 #endif ); - fprintf(stdout, "Copyright (C) 2000-2001, International Business Machines\n"); - fprintf(stdout, "Corporation and others. All Rights Reserved.\n"); + fprintf(stdout, U_COPYRIGHT_STRING"\n"); exit(0); } @@ -1026,6 +1103,15 @@ int main(int argc, char* argv[]) { if (options[7].doesOccur) { u_setDataDirectory(options[7].value); } + /* Initialize ICU */ + u_init(&status); + if (U_FAILURE(status) && status != U_FILE_ACCESS_ERROR) { + fprintf(stderr, "%s: can not initialize ICU. status = %s\n", + argv[0], u_errorName(status)); + exit(1); + } + status = U_ZERO_ERROR; + /* prepare the filename beginning with the source dir */ uprv_strcpy(filename, srcDir); @@ -1055,16 +1141,16 @@ int main(int argc, char* argv[]) { UNewDataMemory *pData; const char *msg; - msg = "genuca writes dummy " U_ICUDATA_NAME "_" UCA_DATA_NAME "." UCA_DATA_TYPE " because of UCONFIG_NO_COLLATION, see uconfig.h"; + msg = "genuca writes dummy " UCA_DATA_NAME "." UCA_DATA_TYPE " because of UCONFIG_NO_COLLATION, see uconfig.h"; fprintf(stderr, "%s\n", msg); - pData = udata_create(destdir, UCA_DATA_TYPE, U_ICUDATA_NAME "_" UCA_DATA_NAME, &dummyDataInfo, + pData = udata_create(destdir, UCA_DATA_TYPE, UCA_DATA_NAME, &dummyDataInfo, NULL, &status); udata_writeBlock(pData, msg, strlen(msg)); udata_finish(pData, &status); - msg = "genuca writes dummy " U_ICUDATA_NAME "_" INVC_DATA_NAME "." INVC_DATA_TYPE " because of UCONFIG_NO_COLLATION, see uconfig.h"; + msg = "genuca writes dummy " INVC_DATA_NAME "." INVC_DATA_TYPE " because of UCONFIG_NO_COLLATION, see uconfig.h"; fprintf(stderr, "%s\n", msg); - pData = udata_create(destdir, INVC_DATA_TYPE, U_ICUDATA_NAME "_" INVC_DATA_NAME, &dummyDataInfo, + pData = udata_create(destdir, INVC_DATA_TYPE, INVC_DATA_NAME, &dummyDataInfo, NULL, &status); udata_writeBlock(pData, msg, strlen(msg)); udata_finish(pData, &status); diff --git a/icuSources/tools/genuca/genuca.dsp b/icuSources/tools/genuca/genuca.dsp index ed6d55f4..189aafe6 100644 --- a/icuSources/tools/genuca/genuca.dsp +++ b/icuSources/tools/genuca/genuca.dsp @@ -116,7 +116,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\common" /I "..\..\i18n" /I "..\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\common" /I "..\..\i18n" /I "..\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -151,7 +151,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\common" /I "..\..\i18n" /I "..\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\common" /I "..\..\i18n" /I "..\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe diff --git a/icuSources/tools/genuca/genuca.h b/icuSources/tools/genuca/genuca.h index 501be4e0..a98e6699 100644 --- a/icuSources/tools/genuca/genuca.h +++ b/icuSources/tools/genuca/genuca.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2000-2001, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -33,7 +33,6 @@ #include "unicode/uchar.h" #include "ucol_imp.h" #include "uhash.h" -#include "umemstrm.h" #include "unewdata.h" diff --git a/icuSources/tools/genuca/genuca.vcproj b/icuSources/tools/genuca/genuca.vcproj index c77f7d5d..e4962744 100644 --- a/icuSources/tools/genuca/genuca.vcproj +++ b/icuSources/tools/genuca/genuca.vcproj @@ -1,7 +1,7 @@ - + @@ -39,17 +39,14 @@ CompileAs="0"/> + Outputs="..\..\..\bin\$(TargetFileName)"/> @@ -68,8 +65,14 @@ Culture="1033"/> + + + + Outputs="..\..\..\bin\$(TargetFileName)"/> + + + + + +#include +#include + +/* swapping implementations in i18n */ + +/* definitions */ + +#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) + +static UOption options[]={ + UOPTION_HELP_H, + UOPTION_HELP_QUESTION_MARK, + UOPTION_DEF("type", 't', UOPT_REQUIRES_ARG) +}; + +enum { + OPT_HELP_H, + OPT_HELP_QUESTION_MARK, + OPT_OUT_TYPE +}; + +static int32_t +fileSize(FILE *f) { + int32_t size; + + fseek(f, 0, SEEK_END); + size=(int32_t)ftell(f); + fseek(f, 0, SEEK_SET); + return size; +} + +/** + * Identifies and then transforms the ICU data piece in-place, or determines + * its length. See UDataSwapFn. + * This function handles .dat data packages as well as single data pieces + * and internally dispatches to per-type swap functions. + * Sets a U_UNSUPPORTED_ERROR if the data format is not recognized. + * + * @see UDataSwapFn + * @see udata_openSwapper + * @see udata_openSwapperForInputData + * @draft ICU 2.8 + */ +static int32_t +udata_swap(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode); + +/** + * Swap an ICU .dat package, including swapping of enclosed items. + */ +U_CFUNC int32_t U_CALLCONV +udata_swapPackage(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode); + +/* + * udata_swapPackage() needs to rename ToC name entries from the old package + * name to the new one. + * We store the filenames here, and udata_swapPackage() will extract the + * package names. + */ +static const char *inFilename, *outFilename; + +U_CDECL_BEGIN +static void U_CALLCONV +printError(void *context, const char *fmt, va_list args) { + vfprintf((FILE *)context, fmt, args); +} +U_CDECL_END + +static int +printUsage(const char *pname, UBool ishelp) { + fprintf(stderr, + "%csage: %s [ -h, -?, --help ] -tl|-tb|-te|--type=b|... infilename outfilename\n", + ishelp ? 'U' : 'u', pname); + if(ishelp) { + fprintf(stderr, + "\nOptions: -h, -?, --help print this message and exit\n" + " Read the input file, swap its platform properties according\n" + " to the -t or --type option, and write the result to the output file.\n" + " -tl change to little-endian/ASCII charset family\n" + " -tb change to big-endian/ASCII charset family\n" + " -te change to big-endian/EBCDIC charset family\n"); + } + + return !ishelp; +} + +extern int +main(int argc, char *argv[]) { + FILE *in, *out; + const char *pname; + char *data; + int32_t length; + UBool ishelp; + int rc; + + UDataSwapper *ds; + UErrorCode errorCode; + uint8_t outCharset; + UBool outIsBigEndian; + + U_MAIN_INIT_ARGS(argc, argv); + + /* get the program basename */ + pname=strrchr(argv[0], U_FILE_SEP_CHAR); + if(pname==NULL) { + pname=strrchr(argv[0], '/'); + } + if(pname!=NULL) { + ++pname; + } else { + pname=argv[0]; + } + + argc=u_parseArgs(argc, argv, LENGTHOF(options), options); + ishelp=options[OPT_HELP_H].doesOccur || options[OPT_HELP_QUESTION_MARK].doesOccur; + if(ishelp || argc!=3) { + return printUsage(pname, ishelp); + } + + /* parse the output type option */ + data=(char *)options[OPT_OUT_TYPE].value; + if(data[0]==0 || data[1]!=0) { + /* the type must be exactly one letter */ + return printUsage(pname, FALSE); + } + switch(data[0]) { + case 'l': + outIsBigEndian=FALSE; + outCharset=U_ASCII_FAMILY; + break; + case 'b': + outIsBigEndian=TRUE; + outCharset=U_ASCII_FAMILY; + break; + case 'e': + outIsBigEndian=TRUE; + outCharset=U_EBCDIC_FAMILY; + break; + default: + return printUsage(pname, FALSE); + } + + in=out=NULL; + data=NULL; + + /* udata_swapPackage() needs the filenames */ + inFilename=argv[1]; + outFilename=argv[2]; + + /* open the input file, get its length, allocate memory for it, read the file */ + in=fopen(argv[1], "rb"); + if(in==NULL) { + fprintf(stderr, "%s: unable to open input file \"%s\"\n", pname, argv[1]); + rc=2; + goto done; + } + + length=fileSize(in); + if(length<=0) { + fprintf(stderr, "%s: empty input file \"%s\"\n", pname, argv[1]); + rc=2; + goto done; + } + + /* + * +15: udata_swapPackage() may need to add a few padding bytes to the + * last item if charset swapping is done, + * because the last item may be resorted into the middle and then needs + * additional padding bytes + */ + data=(char *)malloc(length+15); + if(data==NULL) { + fprintf(stderr, "%s: error allocating memory for \"%s\"\n", pname, argv[1]); + rc=2; + goto done; + } + + /* set the last 15 bytes to the usual padding byte, see udata_swapPackage() */ + uprv_memset(data+length-15, 0xaa, 15); + + if(length!=(int32_t)fread(data, 1, length, in)) { + fprintf(stderr, "%s: error reading \"%s\"\n", pname, argv[1]); + rc=3; + goto done; + } + + fclose(in); + in=NULL; + + /* swap the data in-place */ + errorCode=U_ZERO_ERROR; + ds=udata_openSwapperForInputData(data, length, outIsBigEndian, outCharset, &errorCode); + if(U_FAILURE(errorCode)) { + fprintf(stderr, "%s: udata_openSwapperForInputData(\"%s\") failed - %s\n", + pname, argv[1], u_errorName(errorCode)); + rc=4; + goto done; + } + + ds->printError=printError; + ds->printErrorContext=stderr; + + length=udata_swap(ds, data, length, data, &errorCode); + udata_closeSwapper(ds); + if(U_FAILURE(errorCode)) { + fprintf(stderr, "%s: udata_swap(\"%s\") failed - %s\n", + pname, argv[1], u_errorName(errorCode)); + rc=4; + goto done; + } + + out=fopen(argv[2], "wb"); + if(out==NULL) { + fprintf(stderr, "%s: unable to open output file \"%s\"\n", pname, argv[2]); + rc=5; + goto done; + } + + if(length!=(int32_t)fwrite(data, 1, length, out)) { + fprintf(stderr, "%s: error writing \"%s\"\n", pname, argv[2]); + rc=6; + goto done; + } + + fclose(out); + out=NULL; + + /* all done */ + rc=0; + +done: + if(in!=NULL) { + fclose(in); + } + if(out!=NULL) { + fclose(out); + } + if(data!=NULL) { + free(data); + } + return rc; +} + +/* swap the data ------------------------------------------------------------ */ + +static const struct { + uint8_t dataFormat[4]; + UDataSwapFn *swapFn; +} swapFns[]={ + { { 0x52, 0x65, 0x73, 0x42 }, ures_swap }, /* dataFormat="ResB" */ +#if !UCONFIG_NO_LEGACY_CONVERSION + { { 0x63, 0x6e, 0x76, 0x74 }, ucnv_swap }, /* dataFormat="cnvt" */ + { { 0x43, 0x76, 0x41, 0x6c }, ucnv_swapAliases }, /* dataFormat="CvAl" */ +#endif + { { 0x43, 0x6d, 0x6e, 0x44 }, udata_swapPackage }, /* dataFormat="CmnD" */ +#if !UCONFIG_NO_IDNA + { { 0x53, 0x50, 0x52, 0x50 }, usprep_swap }, /* dataFormat="SPRP" */ +#endif + /* insert data formats here, descending by expected frequency of occurrence */ + { { 0x55, 0x50, 0x72, 0x6f }, uprops_swap }, /* dataFormat="UPro" */ + + { { UCASE_FMT_0, UCASE_FMT_1, UCASE_FMT_2, UCASE_FMT_3 }, + ucase_swap }, /* dataFormat="cAsE" */ + +#if !UCONFIG_NO_NORMALIZATION + { { 0x4e, 0x6f, 0x72, 0x6d }, unorm_swap }, /* dataFormat="Norm" */ +#endif +#if !UCONFIG_NO_COLLATION + { { 0x55, 0x43, 0x6f, 0x6c }, ucol_swap }, /* dataFormat="UCol" */ + { { 0x49, 0x6e, 0x76, 0x43 }, ucol_swapInverseUCA },/* dataFormat="InvC" */ +#endif +#if !UCONFIG_NO_BREAK_ITERATION + { { 0x42, 0x72, 0x6b, 0x20 }, ubrk_swap }, /* dataFormat="Brk " */ +#endif + { { 0x70, 0x6e, 0x61, 0x6d }, upname_swap }, /* dataFormat="pnam" */ + { { 0x75, 0x6e, 0x61, 0x6d }, uchar_swapNames } /* dataFormat="unam" */ +}; + +static int32_t +udata_swap(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + char dataFormatChars[4]; + const UDataInfo *pInfo; + int32_t headerSize, i, swappedLength; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + + /* + * Preflight the header first; checks for illegal arguments, too. + * Do not swap the header right away because the format-specific swapper + * will swap it, get the headerSize again, and also use the header + * information. Otherwise we would have to pass some of the information + * and not be able to use the UDataSwapFn signature. + */ + headerSize=udata_swapDataHeader(ds, inData, -1, NULL, pErrorCode); + + /* + * If we wanted udata_swap() to also handle non-loadable data like a UTrie, + * then we could check here for further known magic values and structures. + */ + if(U_FAILURE(*pErrorCode)) { + return 0; /* the data format was not recognized */ + } + + pInfo=(const UDataInfo *)((const char *)inData+4); + + { + /* convert the data format from ASCII to Unicode to the system charset */ + UChar u[4]={ + pInfo->dataFormat[0], pInfo->dataFormat[1], + pInfo->dataFormat[2], pInfo->dataFormat[3] + }; + + if(uprv_isInvariantUString(u, 4)) { + u_UCharsToChars(u, dataFormatChars, 4); + } else { + dataFormatChars[0]=dataFormatChars[1]=dataFormatChars[2]=dataFormatChars[3]='?'; + } + } + + /* dispatch to the swap function for the dataFormat */ + for(i=0; idataFormat, 4)) { + swappedLength=swapFns[i].swapFn(ds, inData, length, outData, pErrorCode); + + if(U_FAILURE(*pErrorCode)) { + udata_printError(ds, "udata_swap(): failure swapping data format %02x.%02x.%02x.%02x (\"%c%c%c%c\") - %s\n", + pInfo->dataFormat[0], pInfo->dataFormat[1], + pInfo->dataFormat[2], pInfo->dataFormat[3], + dataFormatChars[0], dataFormatChars[1], + dataFormatChars[2], dataFormatChars[3], + u_errorName(*pErrorCode)); + } else if(swappedLength<(length-15)) { + /* swapped less than expected */ + udata_printError(ds, "udata_swap() warning: swapped only %d out of %d bytes - data format %02x.%02x.%02x.%02x (\"%c%c%c%c\")\n", + swappedLength, length, + pInfo->dataFormat[0], pInfo->dataFormat[1], + pInfo->dataFormat[2], pInfo->dataFormat[3], + dataFormatChars[0], dataFormatChars[1], + dataFormatChars[2], dataFormatChars[3], + u_errorName(*pErrorCode)); + } + + return swappedLength; + } + } + + /* the dataFormat was not recognized */ + udata_printError(ds, "udata_swap(): unknown data format %02x.%02x.%02x.%02x (\"%c%c%c%c\")\n", + pInfo->dataFormat[0], pInfo->dataFormat[1], + pInfo->dataFormat[2], pInfo->dataFormat[3], + dataFormatChars[0], dataFormatChars[1], + dataFormatChars[2], dataFormatChars[3]); + + *pErrorCode=U_UNSUPPORTED_ERROR; + return 0; +} + +/* swap .dat package files -------------------------------------------------- */ + +static int32_t +extractPackageName(const UDataSwapper *ds, const char *filename, + char pkg[], int32_t capacity, + UErrorCode *pErrorCode) { + const char *basename; + int32_t len; + + if(U_FAILURE(*pErrorCode)) { + return 0; + } + + basename=findBasename(filename); + len=(int32_t)uprv_strlen(basename)-4; /* -4: subtract the length of ".dat" */ + + if(len<=0 || 0!=uprv_strcmp(basename+len, ".dat")) { + udata_printError(ds, "udata_swapPackage(): \"%s\" is not recognized as a package filename (must end with .dat)\n", + basename); + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + if(len>=capacity) { + udata_printError(ds, "udata_swapPackage(): the package name \"%s\" is too long (>=%ld)\n", + (long)capacity); + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + uprv_memcpy(pkg, basename, len); + pkg[len]=0; + return len; +} + +struct ToCEntry { + uint32_t nameOffset, inOffset, outOffset, length; +}; + +U_CDECL_BEGIN +static int32_t U_CALLCONV +compareToCEntries(const void *context, const void *left, const void *right) { + const char *chars=(const char *)context; + return (int32_t)uprv_strcmp(chars+((const ToCEntry *)left)->nameOffset, + chars+((const ToCEntry *)right)->nameOffset); +} +U_CDECL_END + +U_CFUNC int32_t U_CALLCONV +udata_swapPackage(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const UDataInfo *pInfo; + int32_t headerSize; + + const uint8_t *inBytes; + uint8_t *outBytes; + + uint32_t itemCount, offset, i; + int32_t itemLength; + + const UDataOffsetTOCEntry *inEntries; + UDataOffsetTOCEntry *outEntries; + + ToCEntry *table; + + char inPkgName[32], outPkgName[32]; + int32_t inPkgNameLength, outPkgNameLength; + + /* udata_swapDataHeader checks the arguments */ + headerSize=udata_swapDataHeader(ds, inData, length, outData, pErrorCode); + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + + /* check data format and format version */ + pInfo=(const UDataInfo *)((const char *)inData+4); + if(!( + pInfo->dataFormat[0]==0x43 && /* dataFormat="CmnD" */ + pInfo->dataFormat[1]==0x6d && + pInfo->dataFormat[2]==0x6e && + pInfo->dataFormat[3]==0x44 && + pInfo->formatVersion[0]==1 + )) { + udata_printError(ds, "udata_swapPackage(): data format %02x.%02x.%02x.%02x (format version %02x) is not recognized as an ICU .dat package\n", + pInfo->dataFormat[0], pInfo->dataFormat[1], + pInfo->dataFormat[2], pInfo->dataFormat[3], + pInfo->formatVersion[0]); + *pErrorCode=U_UNSUPPORTED_ERROR; + return 0; + } + + /* + * We need to change the ToC name entries so that they have the correct + * package name prefix. + * Extract the package names from the in/out filenames. + */ + inPkgNameLength=extractPackageName( + ds, inFilename, + inPkgName, (int32_t)sizeof(inPkgName), + pErrorCode); + outPkgNameLength=extractPackageName( + ds, outFilename, + outPkgName, (int32_t)sizeof(outPkgName), + pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return 0; + } + + /* + * It is possible to work with inPkgNameLength!=outPkgNameLength, + * but then the length of the data file would change more significantly, + * which we are not currently prepared for. + */ + if(inPkgNameLength!=outPkgNameLength) { + udata_printError(ds, "udata_swapPackage(): the package names \"%s\" and \"%s\" must have the same length\n", + inPkgName, outPkgName); + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + inBytes=(const uint8_t *)inData+headerSize; + inEntries=(const UDataOffsetTOCEntry *)(inBytes+4); + + if(length<0) { + /* preflighting */ + itemCount=ds->readUInt32(*(const uint32_t *)inBytes); + if(itemCount==0) { + /* no items: count only the item count and return */ + return headerSize+4; + } + + /* read the last item's offset and preflight it */ + offset=ds->readUInt32(inEntries[itemCount-1].dataOffset); + itemLength=udata_swap(ds, inBytes+offset, -1, NULL, pErrorCode); + + if(U_SUCCESS(*pErrorCode)) { + return headerSize+offset+(uint32_t)itemLength; + } else { + return 0; + } + } else { + /* check that the itemCount fits, then the ToC table, then at least the header of the last item */ + length-=headerSize; + if(length<4) { + /* itemCount does not fit */ + offset=0xffffffff; + itemCount=0; /* make compilers happy */ + } else { + itemCount=ds->readUInt32(*(const uint32_t *)inBytes); + if(itemCount==0) { + offset=4; + } else if((uint32_t)length<(4+8*itemCount)) { + /* ToC table does not fit */ + offset=0xffffffff; + } else { + /* offset of the last item plus at least 20 bytes for its header */ + offset=20+ds->readUInt32(inEntries[itemCount-1].dataOffset); + } + } + if((uint32_t)lengthswapArray32(ds, inBytes, 4, outBytes, pErrorCode); + + if(itemCount==0) { + /* no items: just return now */ + return headerSize+4; + } + + /* swap the item name strings */ + offset=4+8*itemCount; + itemLength=(int32_t)(ds->readUInt32(inEntries[0].dataOffset)-offset); + udata_swapInvStringBlock(ds, inBytes+offset, itemLength, outBytes+offset, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + udata_printError(ds, "udata_swapPackage() failed to swap the data item name strings\n"); + return 0; + } + /* keep offset and itemLength in case we allocate and copy the strings below */ + + /* swap the package names into the output charset */ + if(ds->outCharset!=U_CHARSET_FAMILY) { + UDataSwapper *ds2; + ds2=udata_openSwapper(TRUE, U_CHARSET_FAMILY, TRUE, ds->outCharset, pErrorCode); + ds2->swapInvChars(ds2, inPkgName, inPkgNameLength, inPkgName, pErrorCode); + ds2->swapInvChars(ds2, outPkgName, outPkgNameLength, outPkgName, pErrorCode); + udata_closeSwapper(ds2); + if(U_FAILURE(*pErrorCode)) { + udata_printError(ds, "udata_swapPackage() failed to swap the input/output package names\n"); + } + } + + /* change the prefix of each ToC entry name from the old to the new package name */ + { + char *entryName; + + for(i=0; ireadUInt32(inEntries[i].nameOffset); + + if(0==uprv_memcmp(entryName, inPkgName, inPkgNameLength)) { + uprv_memcpy(entryName, outPkgName, inPkgNameLength); + } else { + udata_printError(ds, "udata_swapPackage() failed: ToC item %ld does not have the input package name as a prefix\n", + (long)i); + *pErrorCode=U_INVALID_FORMAT_ERROR; + return 0; + } + } + } + + /* + * Allocate the ToC table and, if necessary, a temporary buffer for + * pseudo-in-place swapping. + * + * We cannot swap in-place because: + * + * 1. If the swapping of an item fails mid-way, then in-place swapping + * has destroyed its data. + * Out-of-place swapping allows us to then copy its original data. + * + * 2. If swapping changes the charset family, then we must resort + * not only the ToC table but also the data items themselves. + * This requires a permutation and is best done with separate in/out + * buffers. + * + * We swapped the strings above to avoid the malloc below if string swapping fails. + */ + if(inData==outData) { + /* +15: prepare for extra padding of a newly-last item */ + table=(ToCEntry *)uprv_malloc(itemCount*sizeof(ToCEntry)+length+15); + if(table!=NULL) { + outBytes=(uint8_t *)(table+itemCount); + + /* copy the item count and the swapped strings */ + uprv_memcpy(outBytes, inBytes, 4); + uprv_memcpy(outBytes+offset, inBytes+offset, itemLength); + } + } else { + table=(ToCEntry *)uprv_malloc(itemCount*sizeof(ToCEntry)); + } + if(table==NULL) { + udata_printError(ds, "udata_swapPackage(): out of memory allocating %d bytes\n", + inData==outData ? + itemCount*sizeof(ToCEntry)+length+15 : + itemCount*sizeof(ToCEntry)); + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + return 0; + } + outEntries=(UDataOffsetTOCEntry *)(outBytes+4); + + /* read the ToC table */ + for(i=0; ireadUInt32(inEntries[i].nameOffset); + table[i].inOffset=ds->readUInt32(inEntries[i].dataOffset); + if(i>0) { + table[i-1].length=table[i].inOffset-table[i-1].inOffset; + } + } + table[itemCount-1].length=(uint32_t)length-table[itemCount-1].inOffset; + + if(ds->inCharset==ds->outCharset) { + /* no charset swapping, no resorting: keep item offsets the same */ + for(i=0; iwriteUInt32(&outEntries[i].nameOffset, table[i].nameOffset); + ds->writeUInt32(&outEntries[i].dataOffset, table[i].outOffset); + } + + /* swap each data item */ + for(i=0; ioutCharset==U_CHARSET_FAMILY) { + udata_printError(ds, "warning: udata_swapPackage() failed to swap item \"%s\"\n" + " at inOffset 0x%x length 0x%x - %s\n" + " the data item will be copied, not swapped\n\n", + (char *)outBytes+table[i].nameOffset, + table[i].inOffset, table[i].length, u_errorName(*pErrorCode)); + } else { + udata_printError(ds, "warning: udata_swapPackage() failed to swap an item\n" + " at inOffset 0x%x length 0x%x - %s\n" + " the data item will be copied, not swapped\n\n", + table[i].inOffset, table[i].length, u_errorName(*pErrorCode)); + } + /* reset the error code, copy the data item, and continue */ + *pErrorCode=U_ZERO_ERROR; + uprv_memcpy(outBytes+table[i].outOffset, inBytes+table[i].inOffset, table[i].length); + } + } + + if(inData==outData) { + /* copy the data from the temporary buffer to the in-place buffer */ + uprv_memcpy((uint8_t *)outData+headerSize, outBytes, length); + } + uprv_free(table); + + return headerSize+length; + } +} + +/* + * Hey, Emacs, please set the following: + * + * Local Variables: + * indent-tabs-mode: nil + * End: + * + */ diff --git a/icuSources/test/ieeetest/ieeetest.dsp b/icuSources/tools/icuswap/icuswap.dsp similarity index 57% rename from icuSources/test/ieeetest/ieeetest.dsp rename to icuSources/tools/icuswap/icuswap.dsp index a230d2b2..c419c7c6 100644 --- a/icuSources/test/ieeetest/ieeetest.dsp +++ b/icuSources/tools/icuswap/icuswap.dsp @@ -1,26 +1,26 @@ -# Microsoft Developer Studio Project File - Name="ieeetest" - Package Owner=<4> +# Microsoft Developer Studio Project File - Name="icuswap" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 -CFG=ieeetest - Win32 Debug +CFG=icuswap - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE -!MESSAGE NMAKE /f "ieeetest.mak". +!MESSAGE NMAKE /f "icuswap.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE -!MESSAGE NMAKE /f "ieeetest.mak" CFG="ieeetest - Win32 Debug" +!MESSAGE NMAKE /f "icuswap.mak" CFG="icuswap - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE -!MESSAGE "ieeetest - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "ieeetest - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE "ieeetest - Win64 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "ieeetest - Win64 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "icuswap - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "icuswap - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "icuswap - Win64 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "icuswap - Win64 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project @@ -30,7 +30,7 @@ CFG=ieeetest - Win32 Debug CPP=cl.exe RSC=rc.exe -!IF "$(CFG)" == "ieeetest - Win32 Release" +!IF "$(CFG)" == "icuswap - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 @@ -41,10 +41,11 @@ RSC=rc.exe # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /G6 /MD /Za /W3 /GX /O2 /I "..\..\include" /I "..\..\source\common" /I "..\..\..\include" /I "..\..\common" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c +# ADD CPP /nologo /G6 /MD /Za /W3 /GX /O2 /I "..\..\common" /I "..\toolutil" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -52,9 +53,19 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 icuuc.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\..\lib" +# ADD LINK32 icuin.lib icuuc.lib icutu.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\..\lib" +# Begin Custom Build +TargetPath=.\Release\icuswap.exe +InputPath=.\Release\icuswap.exe +InputName=icuswap +SOURCE="$(InputPath)" -!ELSEIF "$(CFG)" == "ieeetest - Win32 Debug" +"..\..\..\bin\$(InputName).exe" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(TargetPath) ..\..\..\bin + +# End Custom Build + +!ELSEIF "$(CFG)" == "icuswap - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 @@ -65,10 +76,11 @@ LINK32=link.exe # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /G6 /MDd /Za /W3 /Gm /GX /ZI /Od /I "..\..\..\include" /I "..\..\common" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /FD /GZ /c +# ADD CPP /nologo /G6 /MDd /Za /W3 /Gm /GX /ZI /Od /I "..\..\common" /I "..\toolutil" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe @@ -76,9 +88,19 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 icuucd.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\lib" +# ADD LINK32 icuind.lib icuucd.lib icutud.lib kernel32.lib user32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\lib" +# Begin Custom Build +TargetPath=.\Debug\icuswap.exe +InputPath=.\Debug\icuswap.exe +InputName=icuswap +SOURCE="$(InputPath)" + +"..\..\..\bin\$(InputName).exe" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(TargetPath) ..\..\..\bin + +# End Custom Build -!ELSEIF "$(CFG)" == "ieeetest - Win64 Release" +!ELSEIF "$(CFG)" == "icuswap - Win64 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 @@ -92,7 +114,7 @@ LINK32=link.exe # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /MT /Za /W3 /GX /Zi /O2 /I "..\..\include" /I "..\..\source\common" /I "..\..\..\include" /I "..\..\common" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -100,9 +122,19 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:IX86 /machine:IA64 -# ADD LINK32 icuuc.lib /nologo /subsystem:console /machine:IX86 /libpath:"..\..\..\lib" /machine:IA64 +# ADD LINK32 icuin.lib icuuc.lib icutu.lib /nologo /subsystem:console /machine:IX86 /libpath:"..\..\..\lib" /machine:IA64 +# Begin Custom Build +TargetPath=.\Release\icuswap.exe +InputPath=.\Release\icuswap.exe +InputName=icuswap +SOURCE="$(InputPath)" -!ELSEIF "$(CFG)" == "ieeetest - Win64 Debug" +"..\..\..\bin\$(InputName).exe" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(TargetPath) ..\..\..\bin + +# End Custom Build + +!ELSEIF "$(CFG)" == "icuswap - Win64 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 @@ -113,10 +145,11 @@ LINK32=link.exe # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /MTd /Za /W3 /Gm /GX /Zi /Od /I "..\..\..\include" /I "..\..\common" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe @@ -124,35 +157,29 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:IX86 /pdbtype:sept /machine:IA64 -# ADD LINK32 icuucd.lib /nologo /subsystem:console /incremental:no /debug /machine:IX86 /pdbtype:sept /libpath:"..\..\..\lib" /machine:IA64 - -!ENDIF +# ADD LINK32 icuind.lib icuucd.lib icutud.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:IX86 /pdbtype:sept /libpath:"..\..\..\lib" /machine:IA64 +# Begin Custom Build +TargetPath=.\Debug\icuswap.exe +InputPath=.\Debug\icuswap.exe +InputName=icuswap +SOURCE="$(InputPath)" -# Begin Target +"..\..\..\bin\$(InputName).exe" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(TargetPath) ..\..\..\bin -# Name "ieeetest - Win32 Release" -# Name "ieeetest - Win32 Debug" -# Name "ieeetest - Win64 Release" -# Name "ieeetest - Win64 Debug" -# Begin Group "Source Files" +# End Custom Build -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File +!ENDIF -SOURCE=.\ieeetest.cpp -# End Source File -# End Group -# Begin Group "Header Files" +# Begin Target -# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Name "icuswap - Win32 Release" +# Name "icuswap - Win32 Debug" +# Name "icuswap - Win64 Release" +# Name "icuswap - Win64 Debug" # Begin Source File -SOURCE=.\ieeetest.h +SOURCE=.\icuswap.cpp # End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group # End Target # End Project diff --git a/icuSources/tools/gentz/gentz.vcproj b/icuSources/tools/icuswap/icuswap.vcproj similarity index 71% rename from icuSources/tools/gentz/gentz.vcproj rename to icuSources/tools/icuswap/icuswap.vcproj index c3ee1512..030a991d 100644 --- a/icuSources/tools/gentz/gentz.vcproj +++ b/icuSources/tools/icuswap/icuswap.vcproj @@ -1,8 +1,8 @@ - + @@ -11,51 +11,45 @@ + Outputs="..\..\..\bin\$(TargetFileName)"/> + TypeLibraryName=".\Release/icuswap.tlb"/> + + + + Outputs="..\..\..\bin\$(TargetFileName)"/> + TypeLibraryName=".\Debug/icuswap.tlb"/> + + + + + + RelativePath=".\icuswap.cpp"> +#include "unicode/utypes.h" +#include "unicode/ustring.h" +#include "cstring.h" +#include "cmemory.h" +#include "ucnv_cnv.h" +#include "ucnvmbcs.h" +#include "toolutil.h" +#include "unewdata.h" +#include "ucm.h" +#include "makeconv.h" +#include "genmbcs.h" + +#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) + +static void +CnvExtClose(NewConverter *cnvData); + +static UBool +CnvExtIsValid(NewConverter *cnvData, + const uint8_t *bytes, int32_t length); + +static UBool +CnvExtAddTable(NewConverter *cnvData, UCMTable *table, UConverterStaticData *staticData); + +static uint32_t +CnvExtWrite(NewConverter *cnvData, const UConverterStaticData *staticData, + UNewDataMemory *pData, int32_t tableType); + +typedef struct CnvExtData { + NewConverter newConverter; + + UCMFile *ucm; + + /* toUnicode (state table in ucm->states) */ + UToolMemory *toUTable, *toUUChars; + + /* fromUnicode */ + UToolMemory *fromUTableUChars, *fromUTableValues, *fromUBytes; + + uint16_t stage1[MBCS_STAGE_1_SIZE]; + uint16_t stage2[MBCS_STAGE_2_SIZE]; + uint16_t stage3[0x10000< |2 mappings */ + uint16_t stage3Sub1Block; + + /* statistics */ + int32_t + maxInBytes, maxOutBytes, maxBytesPerUChar, + maxInUChars, maxOutUChars, maxUCharsPerByte; +} CnvExtData; + +NewConverter * +CnvExtOpen(UCMFile *ucm) { + CnvExtData *extData; + + extData=(CnvExtData *)uprv_malloc(sizeof(CnvExtData)); + if(extData!=NULL) { + uprv_memset(extData, 0, sizeof(CnvExtData)); + + extData->ucm=ucm; /* aliased, not owned */ + + extData->newConverter.close=CnvExtClose; + extData->newConverter.isValid=CnvExtIsValid; + extData->newConverter.addTable=CnvExtAddTable; + extData->newConverter.write=CnvExtWrite; + } + return &extData->newConverter; +} + +static void +CnvExtClose(NewConverter *cnvData) { + CnvExtData *extData=(CnvExtData *)cnvData; + if(extData!=NULL) { + utm_close(extData->toUTable); + utm_close(extData->toUUChars); + utm_close(extData->fromUTableUChars); + utm_close(extData->fromUTableValues); + utm_close(extData->fromUBytes); + } +} + +/* we do not expect this to be called */ +static UBool +CnvExtIsValid(NewConverter *cnvData, + const uint8_t *bytes, int32_t length) { + return FALSE; +} + +static uint32_t +CnvExtWrite(NewConverter *cnvData, const UConverterStaticData *staticData, + UNewDataMemory *pData, int32_t tableType) { + CnvExtData *extData=(CnvExtData *)cnvData; + int32_t length, top, headerSize; + + int32_t indexes[UCNV_EXT_INDEXES_MIN_LENGTH]={ 0 }; + + if(tableType&TABLE_BASE) { + headerSize=0; + } else { + _MBCSHeader header={ { 0, 0, 0, 0 }, 0, 0, 0, 0, 0, 0, 0 }; + + /* write the header and base table name for an extension-only table */ + length=(int32_t)uprv_strlen(extData->ucm->baseName)+1; + while(length&3) { + /* add padding */ + extData->ucm->baseName[length++]=0; + } + + headerSize=sizeof(header)+length; + + /* fill the header */ + header.version[0]=4; + header.version[1]=2; + header.flags=(uint32_t)((headerSize<<8)|MBCS_OUTPUT_EXT_ONLY); + + /* write the header and the base table name */ + udata_writeBlock(pData, &header, sizeof(header)); + udata_writeBlock(pData, extData->ucm->baseName, length); + } + + /* fill indexes[] - offsets/indexes are in units of the target array */ + top=0; + + indexes[UCNV_EXT_INDEXES_LENGTH]=length=UCNV_EXT_INDEXES_MIN_LENGTH; + top+=length*4; + + indexes[UCNV_EXT_TO_U_INDEX]=top; + indexes[UCNV_EXT_TO_U_LENGTH]=length=utm_countItems(extData->toUTable); + top+=length*4; + + indexes[UCNV_EXT_TO_U_UCHARS_INDEX]=top; + indexes[UCNV_EXT_TO_U_UCHARS_LENGTH]=length=utm_countItems(extData->toUUChars); + top+=length*2; + + indexes[UCNV_EXT_FROM_U_UCHARS_INDEX]=top; + length=utm_countItems(extData->fromUTableUChars); + top+=length*2; + + if(top&3) { + /* add padding */ + *((UChar *)utm_alloc(extData->fromUTableUChars))=0; + *((uint32_t *)utm_alloc(extData->fromUTableValues))=0; + ++length; + top+=2; + } + indexes[UCNV_EXT_FROM_U_LENGTH]=length; + + indexes[UCNV_EXT_FROM_U_VALUES_INDEX]=top; + top+=length*4; + + indexes[UCNV_EXT_FROM_U_BYTES_INDEX]=top; + length=utm_countItems(extData->fromUBytes); + top+=length; + + if(top&1) { + /* add padding */ + *((uint8_t *)utm_alloc(extData->fromUBytes))=0; + ++length; + ++top; + } + indexes[UCNV_EXT_FROM_U_BYTES_LENGTH]=length; + + indexes[UCNV_EXT_FROM_U_STAGE_12_INDEX]=top; + indexes[UCNV_EXT_FROM_U_STAGE_1_LENGTH]=length=extData->stage1Top; + indexes[UCNV_EXT_FROM_U_STAGE_12_LENGTH]=length+=extData->stage2Top; + top+=length*2; + + indexes[UCNV_EXT_FROM_U_STAGE_3_INDEX]=top; + length=extData->stage3Top; + top+=length*2; + + if(top&3) { + /* add padding */ + extData->stage3[extData->stage3Top++]=0; + ++length; + top+=2; + } + indexes[UCNV_EXT_FROM_U_STAGE_3_LENGTH]=length; + + indexes[UCNV_EXT_FROM_U_STAGE_3B_INDEX]=top; + indexes[UCNV_EXT_FROM_U_STAGE_3B_LENGTH]=length=extData->stage3bTop; + top+=length*4; + + indexes[UCNV_EXT_SIZE]=top; + + /* statistics */ + indexes[UCNV_EXT_COUNT_BYTES]= + (extData->maxInBytes<<16)| + (extData->maxOutBytes<<8)| + extData->maxBytesPerUChar; + indexes[UCNV_EXT_COUNT_UCHARS]= + (extData->maxInUChars<<16)| + (extData->maxOutUChars<<8)| + extData->maxUCharsPerByte; + + indexes[UCNV_EXT_FLAGS]=extData->ucm->ext->unicodeMask; + + /* write the extension data */ + udata_writeBlock(pData, indexes, sizeof(indexes)); + udata_writeBlock(pData, utm_getStart(extData->toUTable), indexes[UCNV_EXT_TO_U_LENGTH]*4); + udata_writeBlock(pData, utm_getStart(extData->toUUChars), indexes[UCNV_EXT_TO_U_UCHARS_LENGTH]*2); + + udata_writeBlock(pData, utm_getStart(extData->fromUTableUChars), indexes[UCNV_EXT_FROM_U_LENGTH]*2); + udata_writeBlock(pData, utm_getStart(extData->fromUTableValues), indexes[UCNV_EXT_FROM_U_LENGTH]*4); + udata_writeBlock(pData, utm_getStart(extData->fromUBytes), indexes[UCNV_EXT_FROM_U_BYTES_LENGTH]); + + udata_writeBlock(pData, extData->stage1, extData->stage1Top*2); + udata_writeBlock(pData, extData->stage2, extData->stage2Top*2); + udata_writeBlock(pData, extData->stage3, extData->stage3Top*2); + udata_writeBlock(pData, extData->stage3b, extData->stage3bTop*4); + +#if 0 + { + int32_t i, j; + + length=extData->stage1Top; + printf("\nstage1[%x]:\n", length); + + for(i=0; istage1[i]!=length) { + printf("stage1[%04x]=%04x\n", i, extData->stage1[i]); + } + } + + j=length; + length=extData->stage2Top; + printf("\nstage2[%x]:\n", length); + + for(i=0; istage2[i]!=0) { + printf("stage12[%04x]=%04x\n", j, extData->stage2[i]); + } + } + + length=extData->stage3Top; + printf("\nstage3[%x]:\n", length); + + for(i=0; istage3[i]!=0) { + printf("stage3[%04x]=%04x\n", i, extData->stage3[i]); + } + } + + length=extData->stage3bTop; + printf("\nstage3b[%x]:\n", length); + + for(i=0; istage3b[i]!=0) { + printf("stage3b[%04x]=%08x\n", i, extData->stage3b[i]); + } + } + } +#endif + + if(VERBOSE) { + printf("size of extension data: %ld\n", (long)top); + } + + /* return the number of bytes that should have been written */ + return (uint32_t)(headerSize+top); +} + +/* to Unicode --------------------------------------------------------------- */ + +/* + * Remove fromUnicode fallbacks and SUB mappings which are irrelevant for + * the toUnicode table. + * The table must be sorted. + * Destroys previous data in the reverseMap. + */ +static int32_t +reduceToUMappings(UCMTable *table) { + UCMapping *mappings; + int32_t *map; + int32_t i, j, count; + int8_t flag; + + mappings=table->mappings; + map=table->reverseMap; + count=table->mappingsLength; + + /* leave the map alone for the initial mappings with desired flags */ + for(i=j=0; iuLen==1) { + u16Length=U16_LENGTH(m->u); + value=(uint32_t)(UCNV_EXT_TO_U_MIN_CODE_POINT+m->u); + } else { + /* the parser enforces m->uLen<=UCNV_EXT_MAX_UCHARS */ + + /* get the result code point string and its 16-bit string length */ + u32=UCM_GET_CODE_POINTS(table, m); + errorCode=U_ZERO_ERROR; + u_strFromUTF32(NULL, 0, &u16Length, u32, m->uLen, &errorCode); + if(U_FAILURE(errorCode) && errorCode!=U_BUFFER_OVERFLOW_ERROR) { + exit(errorCode); + } + + /* allocate it and put its length and index into the value */ + value= + (((uint32_t)m->uLen+UCNV_EXT_TO_U_LENGTH_OFFSET)<toUUChars)); + u=utm_allocN(extData->toUUChars, u16Length); + + /* write the result 16-bit string */ + errorCode=U_ZERO_ERROR; + u_strFromUTF32(u, u16Length, NULL, u32, m->uLen, &errorCode); + if(U_FAILURE(errorCode) && errorCode!=U_BUFFER_OVERFLOW_ERROR) { + exit(errorCode); + } + } + if(m->f==0) { + value|=UCNV_EXT_TO_U_ROUNDTRIP_FLAG; + } + + /* update statistics */ + if(m->bLen>extData->maxInBytes) { + extData->maxInBytes=m->bLen; + } + if(u16Length>extData->maxOutUChars) { + extData->maxOutUChars=u16Length; + } + + ratio=(u16Length+(m->bLen-1))/m->bLen; + if(ratio>extData->maxUCharsPerByte) { + extData->maxUCharsPerByte=ratio; + } + + return value; +} + +/* + * Recursive toUTable generator core function. + * Preconditions: + * - start0: if there is one mapping with an input unit sequence of unitIndex+1 + * then defaultValue=compute the mapping result for this whole sequence + * else defaultValue=0 + * + * recurse into the subsection + */ +static UBool +generateToUTable(CnvExtData *extData, UCMTable *table, + int32_t start, int32_t limit, int32_t unitIndex, + uint32_t defaultValue) { + UCMapping *mappings, *m; + int32_t *map; + int32_t i, j, uniqueCount, count, subStart, subLimit; + + uint8_t *bytes; + int32_t low, high, prev; + + uint32_t *section; + + mappings=table->mappings; + map=table->reverseMap; + + /* step 1: examine the input units; set low, high, uniqueCount */ + m=mappings+map[start]; + bytes=UCM_GET_BYTES(table, m); + low=bytes[unitIndex]; + uniqueCount=1; + + prev=high=low; + for(i=start+1; i=(3*count)/4) { + /* + * for the root table and for fairly full tables: + * allocate for direct, linear array access + * by keeping count, to write an entry for each unit value + * from low to high + */ + } else { + count=uniqueCount; + } + + /* allocate the section: 1 entry for the header + count for the items */ + section=(uint32_t *)utm_allocN(extData->toUTable, 1+count); + + /* write the section header */ + *section++=((uint32_t)count<uniqueCount) { + /* write empty subsections for unused units in a linear table */ + while(++prevbLen==unitIndex+1) { + /* do not include this in generateToUTable() */ + ++subStart; + + if(subStarttoUTable); + + /* recurse */ + if(!generateToUTable(extData, table, subStart, subLimit, unitIndex+1, defaultValue)) { + return FALSE; + } + } + } + return TRUE; +} + +/* + * Generate the toUTable and toUUChars from the input table. + * The input table must be sorted, and all precision flags must be 0..3. + * This function will modify the table's reverseMap. + */ +static UBool +makeToUTable(CnvExtData *extData, UCMTable *table) { + int32_t toUCount; + + toUCount=reduceToUMappings(table); + + extData->toUTable=utm_open("cnv extension toUTable", 0x10000, UCNV_EXT_TO_U_MIN_CODE_POINT, 4); + extData->toUUChars=utm_open("cnv extension toUUChars", 0x10000, UCNV_EXT_TO_U_INDEX_MASK+1, 2); + + return generateToUTable(extData, table, 0, toUCount, 0, 0); +} + +/* from Unicode ------------------------------------------------------------- */ + +/* + * preprocessing: + * rebuild reverseMap with mapping indexes for mappings relevant for from Unicode + * change each Unicode string to encode all but the first code point in 16-bit form + * + * generation: + * for each unique code point + * write an entry in the 3-stage trie + * check that there is only one single-code point sequence + * start recursion for following 16-bit input units + */ + +/* + * Remove toUnicode fallbacks and non- SUB mappings + * which are irrelevant for the fromUnicode extension table. + * Overwrite the reverseMap with an index array to the relevant mappings. + * Modify the code point sequences to a generator-friendly format where + * the first code points remains unchanged but the following are recoded + * into 16-bit Unicode string form. + * The table must be sorted. + * Destroys previous data in the reverseMap. + */ +static int32_t +prepareFromUMappings(UCMTable *table) { + UCMapping *mappings, *m; + int32_t *map; + int32_t i, j, count; + int8_t flag; + + mappings=table->mappings; + map=table->reverseMap; + count=table->mappingsLength; + + /* + * we do not go through the map on input because the mappings are + * sorted lexically + */ + m=mappings; + + for(i=j=0; if; + if(flag==0 || flag==1 || (flag==2 && m->bLen==1)) { + map[j++]=i; + + if(m->uLen>1) { + /* recode all but the first code point to 16-bit Unicode */ + UChar32 *u32; + UChar *u; + UChar32 c; + int32_t q, r; + + u32=UCM_GET_CODE_POINTS(table, m); + u=(UChar *)u32; /* destructive in-place recoding */ + for(r=2, q=1; quLen; ++q) { + c=u32[q]; + U16_APPEND_UNSAFE(u, r, c); + } + + /* counts the first code point always at 2 - the first 16-bit unit is at 16-bit index 2 */ + m->uLen=(int8_t)r; + } + } + } + + return j; +} + +static uint32_t +getFromUBytesValue(CnvExtData *extData, UCMTable *table, UCMapping *m) { + uint8_t *bytes, *resultBytes; + uint32_t value; + int32_t u16Length, ratio; + + if(m->f==2) { + /* + * no mapping, preferred + * + * no need to count in statistics because the subchars are already + * counted for maxOutBytes and maxBytesPerUChar in UConverterStaticData, + * and this non-mapping does not count for maxInUChars which are always + * trivially at least two if counting unmappable supplementary code points + */ + return UCNV_EXT_FROM_U_SUBCHAR1; + } + + bytes=UCM_GET_BYTES(table, m); + value=0; + switch(m->bLen) { + /* 1..3: store the bytes in the value word */ + case 3: + value=((uint32_t)*bytes++)<<16; + case 2: + value|=((uint32_t)*bytes++)<<8; + case 1: + value|=*bytes; + break; + default: + /* the parser enforces m->bLen<=UCNV_EXT_MAX_BYTES */ + /* store the bytes in fromUBytes[] and the index in the value word */ + value=(uint32_t)utm_countItems(extData->fromUBytes); + resultBytes=utm_allocN(extData->fromUBytes, m->bLen); + uprv_memcpy(resultBytes, bytes, m->bLen); + break; + } + value|=(uint32_t)m->bLen<f==0) { + value|=UCNV_EXT_FROM_U_ROUNDTRIP_FLAG; + } + + /* calculate the real UTF-16 length (see recoding in prepareFromUMappings()) */ + if(m->uLen==1) { + u16Length=U16_LENGTH(m->u); + } else { + u16Length=U16_LENGTH(UCM_GET_CODE_POINTS(table, m)[0])+(m->uLen-2); + } + + /* update statistics */ + if(u16Length>extData->maxInUChars) { + extData->maxInUChars=u16Length; + } + if(m->bLen>extData->maxOutBytes) { + extData->maxOutBytes=m->bLen; + } + + ratio=(m->bLen+(u16Length-1))/u16Length; + if(ratio>extData->maxBytesPerUChar) { + extData->maxBytesPerUChar=ratio; + } + + return value; +} + +/* + * works like generateToUTable(), except that the + * output section consists of two arrays, one for input UChars and one + * for result values + * + * also, fromUTable sections are always stored in a compact form for + * access via binary search + */ +static UBool +generateFromUTable(CnvExtData *extData, UCMTable *table, + int32_t start, int32_t limit, int32_t unitIndex, + uint32_t defaultValue) { + UCMapping *mappings, *m; + int32_t *map; + int32_t i, j, uniqueCount, count, subStart, subLimit; + + UChar *uchars; + UChar32 low, high, prev; + + UChar *sectionUChars; + uint32_t *sectionValues; + + mappings=table->mappings; + map=table->reverseMap; + + /* step 1: examine the input units; set low, high, uniqueCount */ + m=mappings+map[start]; + uchars=(UChar *)UCM_GET_CODE_POINTS(table, m); + low=uchars[unitIndex]; + uniqueCount=1; + + prev=high=low; + for(i=start+1; ifromUTableUChars, 1+count); + sectionValues=(uint32_t *)utm_allocN(extData->fromUTableValues, 1+count); + + /* write the section header */ + *sectionUChars++=(UChar)count; + *sectionValues++=defaultValue; + + /* step 3: write temporary section table with subsection starts */ + prev=low-1; /* just before low to prevent empty subsections before low */ + j=0; /* section table index */ + for(i=start; iuLen==unitIndex+1) { + /* do not include this in generateToUTable() */ + ++subStart; + + if(subStartfromUTableValues); + + /* recurse */ + if(!generateFromUTable(extData, table, subStart, subLimit, unitIndex+1, defaultValue)) { + return FALSE; + } + } + } + return TRUE; +} + +/* + * add entries to the fromUnicode trie, + * assume to be called with code points in ascending order + * and use that to build the trie in precompacted form + */ +static void +addFromUTrieEntry(CnvExtData *extData, UChar32 c, uint32_t value) { + int32_t i1, i2, i3, i3b, nextOffset, min, newBlock; + + if(value==0) { + return; + } + + /* + * compute the index for each stage, + * allocate a stage block if necessary, + * and write the stage value + */ + i1=c>>10; + if(i1>=extData->stage1Top) { + extData->stage1Top=i1+1; + } + + nextOffset=(c>>4)&0x3f; + + if(extData->stage1[i1]==0) { + /* allocate another block in stage 2; overlap with the previous block */ + newBlock=extData->stage2Top; + min=newBlock-nextOffset; /* minimum block start with overlap */ + while(minstage2[newBlock-1]==0) { + --newBlock; + } + + extData->stage1[i1]=(uint16_t)newBlock; + extData->stage2Top=newBlock+MBCS_STAGE_2_BLOCK_SIZE; + if(extData->stage2Top>LENGTHOF(extData->stage2)) { + fprintf(stderr, "error: too many stage 2 entries at U+%04x\n", (int)c); + exit(U_MEMORY_ALLOCATION_ERROR); + } + } + + i2=extData->stage1[i1]+nextOffset; + nextOffset=c&0xf; + + if(extData->stage2[i2]==0) { + /* allocate another block in stage 3; overlap with the previous block */ + newBlock=extData->stage3Top; + min=newBlock-nextOffset; /* minimum block start with overlap */ + while(minstage3[newBlock-1]==0) { + --newBlock; + } + + /* round up to a multiple of stage 3 granularity >1 (similar to utrie.c) */ + newBlock=(newBlock+(UCNV_EXT_STAGE_3_GRANULARITY-1))&~(UCNV_EXT_STAGE_3_GRANULARITY-1); + extData->stage2[i2]=(uint16_t)(newBlock>>UCNV_EXT_STAGE_2_LEFT_SHIFT); + + extData->stage3Top=newBlock+MBCS_STAGE_3_BLOCK_SIZE; + if(extData->stage3Top>LENGTHOF(extData->stage3)) { + fprintf(stderr, "error: too many stage 3 entries at U+%04x\n", (int)c); + exit(U_MEMORY_ALLOCATION_ERROR); + } + } + + i3=((int32_t)extData->stage2[i2]<stage3[i3]==0 because we get + * code points in strictly ascending order + */ + + if(value==UCNV_EXT_FROM_U_SUBCHAR1) { + /* SUB mapping, see getFromUBytesValue() and prepareFromUMappings() */ + extData->stage3[i3]=1; + + /* + * precompaction is not optimal for |2 mappings because + * stage3 values for them are all the same, unlike for other mappings + * which all have unique values; + * use a simple compaction of reusing a whole block filled with these + * mappings + */ + + /* is the entire block filled with |2 mappings? */ + if(nextOffset==MBCS_STAGE_3_BLOCK_SIZE-1) { + for(min=i3-nextOffset; + minstage3[min]==1; + ++min) {} + + if(min==i3) { + /* the entire block is filled with these mappings */ + if(extData->stage3Sub1Block!=0) { + /* point to the previous such block and remove this block from stage3 */ + extData->stage2[i2]=extData->stage3Sub1Block; + extData->stage3Top-=MBCS_STAGE_3_BLOCK_SIZE; + uprv_memset(extData->stage3+extData->stage3Top, 0, MBCS_STAGE_3_BLOCK_SIZE*2); + } else { + /* remember this block's stage2 entry */ + extData->stage3Sub1Block=extData->stage2[i2]; + } + } + } + } else { + if((i3b=extData->stage3bTop++)>=LENGTHOF(extData->stage3b)) { + fprintf(stderr, "error: too many stage 3b entries at U+%04x\n", (int)c); + exit(U_MEMORY_ALLOCATION_ERROR); + } + + /* roundtrip or fallback mapping */ + extData->stage3[i3]=(uint16_t)i3b; + extData->stage3b[i3b]=value; + } +} + +static UBool +generateFromUTrie(CnvExtData *extData, UCMTable *table, int32_t mapLength) { + UCMapping *mappings, *m; + int32_t *map; + uint32_t value; + int32_t subStart, subLimit; + + UChar32 *codePoints; + UChar32 c, next; + + if(mapLength==0) { + return TRUE; + } + + mappings=table->mappings; + map=table->reverseMap; + + /* + * iterate over same-initial-code point mappings, + * enter the initial code point into the trie, + * and start a recursion on the corresponding mappings section + * with generateFromUTable() + */ + m=mappings+map[0]; + codePoints=UCM_GET_CODE_POINTS(table, m); + next=codePoints[0]; + subLimit=0; + while(subLimituLen==1) { + /* do not include this in generateFromUTable() */ + ++subStart; + + if(subStartfromUTableValues)); + + /* recurse, starting from 16-bit-unit index 2, the first 16-bit unit after c */ + if(!generateFromUTable(extData, table, subStart, subLimit, 2, value)) { + return FALSE; + } + } + } + return TRUE; +} + +/* + * Generate the fromU data structures from the input table. + * The input table must be sorted, and all precision flags must be 0..3. + * This function will modify the table's reverseMap. + */ +static UBool +makeFromUTable(CnvExtData *extData, UCMTable *table) { + uint16_t *stage1; + int32_t i, stage1Top, fromUCount; + + fromUCount=prepareFromUMappings(table); + + extData->fromUTableUChars=utm_open("cnv extension fromUTableUChars", 0x10000, UCNV_EXT_FROM_U_DATA_MASK+1, 2); + extData->fromUTableValues=utm_open("cnv extension fromUTableValues", 0x10000, UCNV_EXT_FROM_U_DATA_MASK+1, 4); + extData->fromUBytes=utm_open("cnv extension fromUBytes", 0x10000, UCNV_EXT_FROM_U_DATA_MASK+1, 1); + + /* allocate all-unassigned stage blocks */ + extData->stage2Top=MBCS_STAGE_2_FIRST_ASSIGNED; + extData->stage3Top=MBCS_STAGE_3_FIRST_ASSIGNED; + + /* + * stage 3b stores only unique values, and in + * index 0: 0 for "no mapping" + * index 1: "no mapping" with preference for rather than + */ + extData->stage3b[1]=UCNV_EXT_FROM_U_SUBCHAR1; + extData->stage3bTop=2; + + /* allocate the first entry in the fromUTable because index 0 means "no result" */ + utm_alloc(extData->fromUTableUChars); + utm_alloc(extData->fromUTableValues); + + if(!generateFromUTrie(extData, table, fromUCount)) { + return FALSE; + } + + /* + * offset the stage 1 trie entries by stage1Top because they will + * be stored in a single array + */ + stage1=extData->stage1; + stage1Top=extData->stage1Top; + for(i=0; iunicodeMask&UCNV_HAS_SURROGATES) { + fprintf(stderr, "error: contains mappings for surrogate code points\n"); + return FALSE; + } + + staticData->conversionType=UCNV_MBCS; + + extData=(CnvExtData *)cnvData; + + /* + * assume that the table is sorted + * + * call the functions in this order because + * makeToUTable() modifies the original reverseMap, + * makeFromUTable() writes a whole new mapping into reverseMap + */ + return + makeToUTable(extData, table) && + makeFromUTable(extData, table); +} diff --git a/icuSources/tools/makeconv/genmbcs.c b/icuSources/tools/makeconv/genmbcs.c index dfd0174a..41d01011 100644 --- a/icuSources/tools/makeconv/genmbcs.c +++ b/icuSources/tools/makeconv/genmbcs.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2000-2003, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -21,49 +21,26 @@ #include "unewdata.h" #include "ucnv_cnv.h" #include "ucnvmbcs.h" +#include "ucm.h" #include "makeconv.h" #include "genmbcs.h" -enum { - MBCS_STATE_FLAG_DIRECT=1, - MBCS_STATE_FLAG_SURROGATES, - - MBCS_STATE_FLAG_READY=16 -}; - -enum { - MBCS_STAGE_2_BLOCK_SIZE=0x40, /* 64; 64=1<<6 for 6 bits in stage 2 */ - MBCS_STAGE_2_BLOCK_SIZE_SHIFT=6, /* log2(MBCS_STAGE_2_BLOCK_SIZE) */ - MBCS_STAGE_1_SIZE=0x440, /* 0x110000>>10, or 17*64 for one entry per 1k code points */ - MBCS_STAGE_2_SIZE=0xfbc0, /* 0x10000-MBCS_STAGE_1_SIZE */ - MBCS_MAX_STAGE_2_TOP=MBCS_STAGE_2_SIZE, - MBCS_STAGE_2_MAX_BLOCKS=MBCS_STAGE_2_SIZE>>MBCS_STAGE_2_BLOCK_SIZE_SHIFT, - - MBCS_STAGE_2_ALL_UNASSIGNED_INDEX=0, /* stage 1 entry for the all-unassigned stage 2 block */ - MBCS_STAGE_2_FIRST_ASSIGNED=MBCS_STAGE_2_BLOCK_SIZE, /* start of the first stage 2 block after the all-unassigned one */ - - MBCS_MAX_STATE_COUNT=128, - MBCS_MAX_FALLBACK_COUNT=8192 -}; - typedef struct MBCSData { NewConverter newConverter; - /* toUnicode */ - int32_t stateTable[MBCS_MAX_STATE_COUNT][256]; - uint32_t stateFlags[MBCS_MAX_STATE_COUNT], - stateOffsetSum[MBCS_MAX_STATE_COUNT]; + UCMFile *ucm; + + /* toUnicode (state table in ucm->states) */ _MBCSToUFallback toUFallbacks[MBCS_MAX_FALLBACK_COUNT]; + int32_t countToUFallbacks; uint16_t *unicodeCodeUnits; - _MBCSHeader header; - int32_t countToUCodeUnits; /* fromUnicode */ uint16_t stage1[MBCS_STAGE_1_SIZE]; uint16_t stage2Single[MBCS_STAGE_2_SIZE]; /* stage 2 for single-byte codepages */ uint32_t stage2[MBCS_STAGE_2_SIZE]; /* stage 2 for MBCS */ uint8_t *fromUBytes; - uint32_t stage2Top, stage3Top, maxCharLength; + uint32_t stage2Top, stage3Top; } MBCSData; /* prototypes */ @@ -71,64 +48,80 @@ static void MBCSClose(NewConverter *cnvData); static UBool -MBCSProcessStates(NewConverter *cnvData); +MBCSStartMappings(MBCSData *mbcsData); static UBool -MBCSAddToUnicode(NewConverter *cnvData, +MBCSAddToUnicode(MBCSData *mbcsData, const uint8_t *bytes, int32_t length, - UChar32 c, uint32_t b, - int8_t isFallback); + UChar32 c, + int8_t flag); static UBool MBCSIsValid(NewConverter *cnvData, - const uint8_t *bytes, int32_t length, - uint32_t b); + const uint8_t *bytes, int32_t length); static UBool -MBCSSingleAddFromUnicode(NewConverter *cnvData, +MBCSSingleAddFromUnicode(MBCSData *mbcsData, const uint8_t *bytes, int32_t length, - UChar32 c, uint32_t b, - int8_t isFallback); + UChar32 c, + int8_t flag); static UBool -MBCSAddFromUnicode(NewConverter *cnvData, +MBCSAddFromUnicode(MBCSData *mbcsData, const uint8_t *bytes, int32_t length, - UChar32 c, uint32_t b, - int8_t isFallback); + UChar32 c, + int8_t flag); static void -MBCSPostprocess(NewConverter *cnvData, const UConverterStaticData *staticData); +MBCSPostprocess(MBCSData *mbcsData, const UConverterStaticData *staticData); + +static UBool +MBCSAddTable(NewConverter *cnvData, UCMTable *table, UConverterStaticData *staticData); static uint32_t -MBCSWrite(NewConverter *cnvData, const UConverterStaticData *staticData, UNewDataMemory *pData); +MBCSWrite(NewConverter *cnvData, const UConverterStaticData *staticData, + UNewDataMemory *pData, int32_t tableType); + +/* helper ------------------------------------------------------------------- */ + +static U_INLINE char +hexDigit(uint8_t digit) { + return digit<=9 ? (char)('0'+digit) : (char)('a'-10+digit); +} + +static U_INLINE char * +printBytes(char *buffer, const uint8_t *bytes, int32_t length) { + char *s=buffer; + while(length>0) { + *s++=hexDigit((uint8_t)(*bytes>>4)); + *s++=hexDigit((uint8_t)(*bytes&0xf)); + ++bytes; + --length; + } + + *s=0; + return buffer; +} /* implementation ----------------------------------------------------------- */ static void -MBCSInit(MBCSData *mbcsData, uint8_t maxCharLength) { - int i; +MBCSInit(MBCSData *mbcsData, UCMFile *ucm) { + int32_t i, maxCharLength; uprv_memset(mbcsData, 0, sizeof(MBCSData)); + maxCharLength=ucm->states.maxCharLength; + + mbcsData->ucm=ucm; /* aliased, not owned */ + mbcsData->newConverter.close=MBCSClose; - mbcsData->newConverter.startMappings=MBCSProcessStates; mbcsData->newConverter.isValid=MBCSIsValid; - mbcsData->newConverter.addToUnicode=MBCSAddToUnicode; - if(maxCharLength==1) { - mbcsData->newConverter.addFromUnicode=MBCSSingleAddFromUnicode; - } else { - mbcsData->newConverter.addFromUnicode=MBCSAddFromUnicode; - } - mbcsData->newConverter.finishMappings=MBCSPostprocess; + mbcsData->newConverter.addTable=MBCSAddTable; mbcsData->newConverter.write=MBCSWrite; - mbcsData->header.version[0]=4; - mbcsData->header.version[1]=1; - mbcsData->stateFlags[0]=MBCS_STATE_FLAG_DIRECT; mbcsData->stage2Top=MBCS_STAGE_2_FIRST_ASSIGNED; /* after stage 1 and one all-unassigned stage 2 block */ mbcsData->stage3Top=16*maxCharLength; /* after one all-unassigned stage 3 block */ - mbcsData->maxCharLength=maxCharLength; - mbcsData->header.flags=maxCharLength-1; /* outputType */ /* point all entries in stage 1 to the "all-unassigned" first block in stage 2 */ for(i=0; inewConverter; } @@ -149,366 +142,22 @@ static void MBCSClose(NewConverter *cnvData) { MBCSData *mbcsData=(MBCSData *)cnvData; if(mbcsData!=NULL) { - if(mbcsData->unicodeCodeUnits!=NULL) { - uprv_free(mbcsData->unicodeCodeUnits); - } - if(mbcsData->fromUBytes!=NULL) { - uprv_free(mbcsData->fromUBytes); - } + uprv_free(mbcsData->unicodeCodeUnits); + uprv_free(mbcsData->fromUBytes); uprv_free(mbcsData); } } -static const char * -skipWhitespace(const char *s) { - while(*s==' ' || *s=='\t') { - ++s; - } - return s; -} - -/* - * state table row grammar (ebnf-style): - * (whitespace is allowed between all tokens) - * - * row=[[firstentry ','] entry (',' entry)*] - * firstentry="initial" | "surrogates" - * (initial state (default for state 0), output is all surrogate pairs) - * entry=range [':' nextstate] ['.' action] - * range=number ['-' number] - * nextstate=number - * (0..7f) - * action='u' | 's' | 'p' | 'i' - * (unassigned, state change only, surrogate pair, illegal) - * number=(1- or 2-digit hexadecimal number) - */ -static const char * -parseState(const char *s, int32_t state[256], uint32_t *pFlags) { - const char *t; - uint32_t start, end, i; - int32_t entry; - - /* initialize the state: all illegal with U+ffff */ - for(i=0; i<256; ++i) { - state[i]=MBCS_ENTRY_FINAL(0, MBCS_STATE_ILLEGAL, 0xffff); - } - - /* skip leading white space */ - s=skipWhitespace(s); - - /* is there an "initial" or "surrogates" directive? */ - if(uprv_strncmp("initial", s, 7)==0) { - *pFlags=MBCS_STATE_FLAG_DIRECT; - s=skipWhitespace(s+7); - if(*s++!=',') { - return s-1; - } - } else if(*pFlags==0 && uprv_strncmp("surrogates", s, 10)==0) { - *pFlags=MBCS_STATE_FLAG_SURROGATES; - s=skipWhitespace(s+10); - if(*s++!=',') { - return s-1; - } - } else if(*s==0) { - /* empty state row: all-illegal */ - return NULL; - } - - for(;;) { - /* read an entry, the start of the range first */ - s=skipWhitespace(s); - start=uprv_strtoul(s, (char **)&t, 16); - if(s==t || 0xffheader.countStates==MBCS_MAX_STATE_COUNT) { - fprintf(stderr, "error: too many states (maximum %u)\n", MBCS_MAX_STATE_COUNT); - return FALSE; - } - - error=parseState(s, mbcsData->stateTable[mbcsData->header.countStates], - &mbcsData->stateFlags[mbcsData->header.countStates]); - if(error!=NULL) { - fprintf(stderr, "parse error in state definition at '%s'\n", error); - return FALSE; - } - - ++mbcsData->header.countStates; - return TRUE; -} - -static int32_t -sumUpStates(MBCSData *mbcsData) { - int32_t entry, sum; - int state, cell, count; - UBool allStatesReady; - - /* - * Sum up the offsets for all states. - * In each final state (where there are only final entries), - * the offsets add up directly. - * In all other state table rows, for each transition entry to another state, - * the offsets sum of that state needs to be added. - * This is achieved in at most countStates iterations. - */ - allStatesReady=FALSE; - for(count=mbcsData->header.countStates; !allStatesReady && count>=0; --count) { - allStatesReady=TRUE; - for(state=mbcsData->header.countStates-1; state>=0; --state) { - if(!(mbcsData->stateFlags[state]&MBCS_STATE_FLAG_READY)) { - allStatesReady=FALSE; - sum=0; - - /* at first, add up only the final delta offsets to keep them <512 */ - for(cell=0; cell<256; ++cell) { - entry=mbcsData->stateTable[state][cell]; - if(MBCS_ENTRY_IS_FINAL(entry)) { - switch(MBCS_ENTRY_FINAL_ACTION(entry)) { - case MBCS_STATE_VALID_16: - mbcsData->stateTable[state][cell]=MBCS_ENTRY_FINAL_SET_VALUE(entry, sum); - sum+=1; - break; - case MBCS_STATE_VALID_16_PAIR: - mbcsData->stateTable[state][cell]=MBCS_ENTRY_FINAL_SET_VALUE(entry, sum); - sum+=2; - break; - default: - /* no addition */ - break; - } - } - } - - /* now, add up the delta offsets for the transitional entries */ - for(cell=0; cell<256; ++cell) { - entry=mbcsData->stateTable[state][cell]; - if(MBCS_ENTRY_IS_TRANSITION(entry)) { - if(mbcsData->stateFlags[MBCS_ENTRY_TRANSITION_STATE(entry)]&MBCS_STATE_FLAG_READY) { - mbcsData->stateTable[state][cell]=MBCS_ENTRY_TRANSITION_SET_OFFSET(entry, sum); - sum+=mbcsData->stateOffsetSum[MBCS_ENTRY_TRANSITION_STATE(entry)]; - } else { - /* that next state does not have a sum yet, we cannot finish the one for this state */ - sum=-1; - break; - } - } - } - - if(sum!=-1) { - mbcsData->stateOffsetSum[state]=sum; - mbcsData->stateFlags[state]|=MBCS_STATE_FLAG_READY; - } - } - } - } - - if(!allStatesReady) { - fprintf(stderr, "error: the state table contains loops\n"); - return -1; - } - - /* - * For all "direct" (i.e., initial) states>0, - * the offsets need to be increased by the sum of - * the previous initial states. - */ - sum=mbcsData->stateOffsetSum[0]; - for(state=1; state<(int)mbcsData->header.countStates; ++state) { - if((mbcsData->stateFlags[state]&0xf)==MBCS_STATE_FLAG_DIRECT) { - int32_t sum2=sum; - sum+=mbcsData->stateOffsetSum[state]; - for(cell=0; cell<256; ++cell) { - entry=mbcsData->stateTable[state][cell]; - if(MBCS_ENTRY_IS_TRANSITION(entry)) { - mbcsData->stateTable[state][cell]=MBCS_ENTRY_TRANSITION_ADD_OFFSET(entry, sum2); - } - } - } - } - if(VERBOSE) { - printf("the total number of offsets is 0x%lx=%ld\n", - (unsigned long)sum, (long)sum); - } - - /* round up to the next even number to have the following data 32-bit-aligned */ - sum=(sum+1)&~1; - return mbcsData->countToUCodeUnits=sum; -} - static UBool -MBCSProcessStates(NewConverter *cnvData) { - MBCSData *mbcsData=(MBCSData *)cnvData; - int32_t i, entry, sum; - int state, cell; - - /* - * first make sure that all "next state" values are within limits - * and that all next states after final ones have the "direct" - * flag of initial states - */ - for(state=mbcsData->header.countStates-1; state>=0; --state) { - for(cell=0; cell<256; ++cell) { - entry=mbcsData->stateTable[state][cell]; - if((uint8_t)MBCS_ENTRY_STATE(entry)>=mbcsData->header.countStates) { - fprintf(stderr, "error: state table entry [%x][%x] has a next state of %x that is too high\n", - state, cell, MBCS_ENTRY_STATE(entry)); - return FALSE; - } - if(MBCS_ENTRY_IS_FINAL(entry) && (mbcsData->stateFlags[MBCS_ENTRY_STATE(entry)]&0xf)!=MBCS_STATE_FLAG_DIRECT) { - fprintf(stderr, "error: state table entry [%x][%x] is final but has a non-initial next state of %x\n", - state, cell, MBCS_ENTRY_STATE(entry)); - return FALSE; - } else if(MBCS_ENTRY_IS_TRANSITION(entry) && (mbcsData->stateFlags[MBCS_ENTRY_STATE(entry)]&0xf)==MBCS_STATE_FLAG_DIRECT) { - fprintf(stderr, "error: state table entry [%x][%x] is not final but has an initial next state of %x\n", - state, cell, MBCS_ENTRY_STATE(entry)); - return FALSE; - } - } - } +MBCSStartMappings(MBCSData *mbcsData) { + int32_t i, sum; - /* is this an SI/SO (like EBCDIC-stateful) state table? */ - if(mbcsData->header.countStates>=2 && (mbcsData->stateFlags[1]&0xf)==MBCS_STATE_FLAG_DIRECT) { - if(mbcsData->maxCharLength!=2) { - fprintf(stderr, "error: SI/SO codepages must have max 2 bytes/char (not %x)\n", mbcsData->maxCharLength); - return FALSE; - } - if(mbcsData->header.countStates<3) { - fprintf(stderr, "error: SI/SO codepages must have at least 3 states (not %x)\n", mbcsData->header.countStates); - return FALSE; - } - /* are the SI/SO all in the right places? */ - if( mbcsData->stateTable[0][0xe]==MBCS_ENTRY_FINAL(1, MBCS_STATE_CHANGE_ONLY, 0) && - mbcsData->stateTable[0][0xf]==MBCS_ENTRY_FINAL(0, MBCS_STATE_CHANGE_ONLY, 0) && - mbcsData->stateTable[1][0xe]==MBCS_ENTRY_FINAL(1, MBCS_STATE_CHANGE_ONLY, 0) && - mbcsData->stateTable[1][0xf]==MBCS_ENTRY_FINAL(0, MBCS_STATE_CHANGE_ONLY, 0) - ) { - mbcsData->header.flags=MBCS_OUTPUT_2_SISO; - } else { - fprintf(stderr, "error: SI/SO codepages must have in states 0 and 1 transitions e:1.s, f:0.s\n"); - return FALSE; - } - state=2; - } else { - state=1; - } - - /* check that no unexpected state is a "direct" one */ - while(state<(int)mbcsData->header.countStates) { - if((mbcsData->stateFlags[state]&0xf)==MBCS_STATE_FLAG_DIRECT) { - fprintf(stderr, "error: state %d is 'initial' - not supported except for SI/SO codepages\n", state); - return FALSE; - } - ++state; - } - - sum=sumUpStates(mbcsData); - if(sum<0) { - return FALSE; + /* allocate the code unit array and prefill it with "unassigned" values */ + sum=mbcsData->ucm->states.countToUCodeUnits; + if(VERBOSE) { + printf("the total number of offsets is 0x%lx=%ld\n", (long)sum, (long)sum); } - /* allocate the code unit array and prefill it with "unassigned" values */ if(sum>0) { mbcsData->unicodeCodeUnits=(uint16_t *)uprv_malloc(sum*sizeof(uint16_t)); if(mbcsData->unicodeCodeUnits==NULL) { @@ -522,17 +171,16 @@ MBCSProcessStates(NewConverter *cnvData) { } /* allocate the codepage mappings and preset the first 16 characters to 0 */ - if(mbcsData->maxCharLength==1) { + if(mbcsData->ucm->states.maxCharLength==1) { /* allocate 64k 16-bit results for single-byte codepages */ sum=0x20000; } else { /* allocate 1M * maxCharLength bytes for at most 1M mappings */ - sum=0x100000*mbcsData->maxCharLength; + sum=0x100000*mbcsData->ucm->states.maxCharLength; } mbcsData->fromUBytes=(uint8_t *)uprv_malloc(sum); if(mbcsData->fromUBytes==NULL) { - fprintf(stderr, "error: out of memory allocating %ldMB for target mappings\n", - (long)sum); + fprintf(stderr, "error: out of memory allocating %ld B for target mappings\n", (long)sum); return FALSE; } /* initialize the all-unassigned first stage 3 block */ @@ -541,46 +189,24 @@ MBCSProcessStates(NewConverter *cnvData) { return TRUE; } -/* find a fallback for this offset; return the index or -1 if not found */ -static int32_t -findFallback(MBCSData *mbcsData, uint32_t offset) { - _MBCSToUFallback *toUFallbacks; - int32_t i, limit; - - limit=mbcsData->header.countToUFallbacks; - if(limit==0) { - /* shortcut: most codepages do not have fallbacks from codepage to Unicode */ - return -1; - } - - /* do a linear search for the fallback mapping (the table is not yet sorted) */ - toUFallbacks=mbcsData->toUFallbacks; - for(i=0; itoUFallbacks, mbcsData->countToUFallbacks, offset); if(i>=0) { /* if there is already a fallback for this offset, then overwrite it */ mbcsData->toUFallbacks[i].codePoint=c; return TRUE; } else { /* if there is no fallback for this offset, then add one */ - i=mbcsData->header.countToUFallbacks; + i=mbcsData->countToUFallbacks; if(i>=MBCS_MAX_FALLBACK_COUNT) { - fprintf(stderr, "error: too many toUnicode fallbacks, currently at: U+%x\n", c); + fprintf(stderr, "error: too many toUnicode fallbacks, currently at: U+%x\n", (int)c); return FALSE; } else { mbcsData->toUFallbacks[i].offset=offset; mbcsData->toUFallbacks[i].codePoint=c; - mbcsData->header.countToUFallbacks=i+1; + mbcsData->countToUFallbacks=i+1; return TRUE; } } @@ -589,19 +215,19 @@ setFallback(MBCSData *mbcsData, uint32_t offset, UChar32 c) { /* remove fallback if there is one with this offset; return the code point if there was such a fallback, otherwise -1 */ static int32_t removeFallback(MBCSData *mbcsData, uint32_t offset) { - int32_t i=findFallback(mbcsData, offset); + int32_t i=ucm_findFallback(mbcsData->toUFallbacks, mbcsData->countToUFallbacks, offset); if(i>=0) { _MBCSToUFallback *toUFallbacks; int32_t limit, old; toUFallbacks=mbcsData->toUFallbacks; - limit=mbcsData->header.countToUFallbacks; + limit=mbcsData->countToUFallbacks; old=(int32_t)toUFallbacks[i].codePoint; /* copy the last fallback entry here to keep the list contiguous */ toUFallbacks[i].offset=toUFallbacks[limit-1].offset; toUFallbacks[i].codePoint=toUFallbacks[limit-1].codePoint; - mbcsData->header.countToUFallbacks=limit-1; + mbcsData->countToUFallbacks=limit-1; return old; } else { return -1; @@ -615,22 +241,22 @@ removeFallback(MBCSData *mbcsData, uint32_t offset) { * -1 the precision of this mapping is not specified */ static UBool -MBCSAddToUnicode(NewConverter *cnvData, +MBCSAddToUnicode(MBCSData *mbcsData, const uint8_t *bytes, int32_t length, - UChar32 c, uint32_t b, - int8_t isFallback) { - MBCSData *mbcsData=(MBCSData *)cnvData; + UChar32 c, + int8_t flag) { + char buffer[10]; uint32_t offset=0; int32_t i=0, entry, old; uint8_t state=0; - if(mbcsData->header.countStates==0) { + if(mbcsData->ucm->states.countStates==0) { fprintf(stderr, "error: there is no state information!\n"); return FALSE; } /* for SI/SO (like EBCDIC-stateful), double-byte sequences start in state 1 */ - if(length==2 && (mbcsData->header.flags&0xff)==MBCS_OUTPUT_2_SISO) { + if(length==2 && mbcsData->ucm->states.outputType==MBCS_OUTPUT_2_SISO) { state=1; } @@ -640,33 +266,33 @@ MBCSAddToUnicode(NewConverter *cnvData, * We assume that c<=0x10ffff. */ for(i=0;;) { - entry=mbcsData->stateTable[state][bytes[i++]]; + entry=mbcsData->ucm->states.stateTable[state][bytes[i++]]; if(MBCS_ENTRY_IS_TRANSITION(entry)) { if(i==length) { - fprintf(stderr, "error: byte sequence too short, ends in non-final state %hu: 0x%02lx (U+%x)\n", - state, (unsigned long)b, c); + fprintf(stderr, "error: byte sequence too short, ends in non-final state %hu: 0x%s (U+%x)\n", + (short)state, printBytes(buffer, bytes, length), (int)c); return FALSE; } state=(uint8_t)MBCS_ENTRY_TRANSITION_STATE(entry); offset+=MBCS_ENTRY_TRANSITION_OFFSET(entry); } else { if(i0x%02lx\n", - c, (unsigned long)b); + fprintf(stderr, "error: byte sequence ends in illegal state at U+%04x<->0x%s\n", + (int)c, printBytes(buffer, bytes, length)); return FALSE; case MBCS_STATE_CHANGE_ONLY: - fprintf(stderr, "error: byte sequence ends in state-change-only at U+%04x<->0x%02lx\n", - c, (unsigned long)b); + fprintf(stderr, "error: byte sequence ends in state-change-only at U+%04x<->0x%s\n", + (int)c, printBytes(buffer, bytes, length)); return FALSE; case MBCS_STATE_UNASSIGNED: - fprintf(stderr, "error: byte sequence ends in unassigned state at U+%04x<->0x%02lx\n", - c, (unsigned long)b); + fprintf(stderr, "error: byte sequence ends in unassigned state at U+%04x<->0x%s\n", + (int)c, printBytes(buffer, bytes, length)); return FALSE; case MBCS_STATE_FALLBACK_DIRECT_16: case MBCS_STATE_VALID_DIRECT_16: @@ -679,13 +305,13 @@ MBCSAddToUnicode(NewConverter *cnvData, } else { old=0x10000+MBCS_ENTRY_FINAL_VALUE(entry); } - if(isFallback>=0) { - fprintf(stderr, "error: duplicate codepage byte sequence at U+%04x<->0x%02lx see U+%04lx\n", - c, (unsigned long)b, (long)old); + if(flag>=0) { + fprintf(stderr, "error: duplicate codepage byte sequence at U+%04x<->0x%s see U+%04x\n", + (int)c, printBytes(buffer, bytes, length), (int)old); return FALSE; } else if(VERBOSE) { - fprintf(stderr, "duplicate codepage byte sequence at U+%04x<->0x%02lx see U+%04lx\n", - c, (unsigned long)b, (long)old); + fprintf(stderr, "duplicate codepage byte sequence at U+%04x<->0x%s see U+%04x\n", + (int)c, printBytes(buffer, bytes, length), (int)old); } /* * Continue after the above warning @@ -693,7 +319,7 @@ MBCSAddToUnicode(NewConverter *cnvData, */ } /* reassign the correct action code */ - entry=MBCS_ENTRY_FINAL_SET_ACTION(entry, (MBCS_STATE_VALID_DIRECT_16+(isFallback>0 ? 2 : 0)+(c>=0x10000 ? 1 : 0))); + entry=MBCS_ENTRY_FINAL_SET_ACTION(entry, (MBCS_STATE_VALID_DIRECT_16+(flag==3 ? 2 : 0)+(c>=0x10000 ? 1 : 0))); /* put the code point into bits 22..7 for BMP, c-0x10000 into 26..7 for others */ if(c<=0xffff) { @@ -701,7 +327,7 @@ MBCSAddToUnicode(NewConverter *cnvData, } else { entry=MBCS_ENTRY_FINAL_SET_VALUE(entry, c-0x10000); } - mbcsData->stateTable[state][bytes[i-1]]=entry; + mbcsData->ucm->states.stateTable[state][bytes[i-1]]=entry; break; case MBCS_STATE_VALID_16: /* bits 26..16 are not used, 0 */ @@ -709,21 +335,21 @@ MBCSAddToUnicode(NewConverter *cnvData, offset+=MBCS_ENTRY_FINAL_VALUE_16(entry); /* check that this byte sequence is still unassigned */ if((old=mbcsData->unicodeCodeUnits[offset])!=0xfffe || (old=removeFallback(mbcsData, offset))!=-1) { - if(isFallback>=0) { - fprintf(stderr, "error: duplicate codepage byte sequence at U+%04x<->0x%02lx see U+%04lx\n", - c, (unsigned long)b, (long)old); + if(flag>=0) { + fprintf(stderr, "error: duplicate codepage byte sequence at U+%04x<->0x%s see U+%04x\n", + (int)c, printBytes(buffer, bytes, length), (int)old); return FALSE; } else if(VERBOSE) { - fprintf(stderr, "duplicate codepage byte sequence at U+%04x<->0x%02lx see U+%04lx\n", - c, (unsigned long)b, (long)old); + fprintf(stderr, "duplicate codepage byte sequence at U+%04x<->0x%s see U+%04x\n", + (int)c, printBytes(buffer, bytes, length), (int)old); } } if(c>=0x10000) { - fprintf(stderr, "error: code point does not fit into valid-16-bit state at U+%04x<->0x%02lx\n", - c, (unsigned long)b); + fprintf(stderr, "error: code point does not fit into valid-16-bit state at U+%04x<->0x%s\n", + (int)c, printBytes(buffer, bytes, length)); return FALSE; } - if(isFallback>0) { + if(flag>0) { /* assign only if there is no precise mapping */ if(mbcsData->unicodeCodeUnits[offset]==0xfffe) { return setFallback(mbcsData, offset, c); @@ -747,16 +373,16 @@ MBCSAddToUnicode(NewConverter *cnvData, } else /* old<=0xe001 */ { real=mbcsData->unicodeCodeUnits[offset+1]; } - if(isFallback>=0) { - fprintf(stderr, "error: duplicate codepage byte sequence at U+%04x<->0x%02lx see U+%04lx\n", - c, (unsigned long)b, (long)real); + if(flag>=0) { + fprintf(stderr, "error: duplicate codepage byte sequence at U+%04x<->0x%s see U+%04x\n", + (int)c, printBytes(buffer, bytes, length), (int)real); return FALSE; } else if(VERBOSE) { - fprintf(stderr, "duplicate codepage byte sequence at U+%04x<->0x%02lx see U+%04lx\n", - c, (unsigned long)b, (long)real); + fprintf(stderr, "duplicate codepage byte sequence at U+%04x<->0x%s see U+%04x\n", + (int)c, printBytes(buffer, bytes, length), (int)real); } } - if(isFallback>0) { + if(flag>0) { /* assign only if there is no precise mapping */ if(old<=0xdbff || old==0xe000) { /* do nothing */ @@ -786,8 +412,8 @@ MBCSAddToUnicode(NewConverter *cnvData, break; default: /* reserved, must never occur */ - fprintf(stderr, "internal error: byte sequence reached reserved action code, entry0x%02lx: 0x%02lx (U+%x)\n", - (unsigned long)entry, (unsigned long)b, c); + fprintf(stderr, "internal error: byte sequence reached reserved action code, entry 0x%02x: 0x%s (U+%x)\n", + (int)entry, printBytes(buffer, bytes, length), (int)c); return FALSE; } @@ -799,83 +425,26 @@ MBCSAddToUnicode(NewConverter *cnvData, /* is this byte sequence valid? (this is almost the same as MBCSAddToUnicode()) */ static UBool MBCSIsValid(NewConverter *cnvData, - const uint8_t *bytes, int32_t length, - uint32_t b) { + const uint8_t *bytes, int32_t length) { MBCSData *mbcsData=(MBCSData *)cnvData; - uint32_t offset=0; - int32_t i=0, entry; - uint8_t state=0; - - if(mbcsData->header.countStates==0) { - fprintf(stderr, "error: there is no state information!\n"); - return FALSE; - } - - /* for SI/SO (like EBCDIC-stateful), double-byte sequences start in state 1 */ - if(length==2 && (mbcsData->header.flags&0xff)==MBCS_OUTPUT_2_SISO) { - state=1; - } - /* - * Walk down the state table like in conversion, - * much like getNextUChar(). - * We assume that c<=0x10ffff. - */ - for(i=0;;) { - entry=mbcsData->stateTable[state][bytes[i++]]; - if(MBCS_ENTRY_IS_TRANSITION(entry)) { - if(i==length) { - fprintf(stderr, "error: byte sequence too short, ends in non-final state %hu: 0x%02lx\n", - state, (unsigned long)b); - return FALSE; - } - state=(uint8_t)MBCS_ENTRY_TRANSITION_STATE(entry); - offset+=MBCS_ENTRY_TRANSITION_OFFSET(entry); - } else { - if(iucm->states, bytes, length)); } static UBool -MBCSSingleAddFromUnicode(NewConverter *cnvData, +MBCSSingleAddFromUnicode(MBCSData *mbcsData, const uint8_t *bytes, int32_t length, - UChar32 c, uint32_t b, - int8_t isFallback) { - MBCSData *mbcsData=(MBCSData *)cnvData; + UChar32 c, + int8_t flag) { uint16_t *p; uint32_t index; uint16_t old; + uint8_t b; + + /* ignore |2 SUB mappings */ + if(flag==2) { + return TRUE; + } /* * Walk down the triple-stage compact array ("trie") and @@ -883,14 +452,14 @@ MBCSSingleAddFromUnicode(NewConverter *cnvData, * Note that the first stage 2 and 3 blocks are reserved for all-unassigned mappings. * We assume that length<=maxCharLength and that c<=0x10ffff. */ + b=*bytes; /* inspect stage 1 */ index=c>>10; if(mbcsData->stage1[index]==MBCS_STAGE_2_ALL_UNASSIGNED_INDEX) { /* allocate another block in stage 2 */ if(mbcsData->stage2Top>=MBCS_MAX_STAGE_2_TOP) { - fprintf(stderr, "error: too many stage 2 entries at U+%04x<->0x%02lx\n", - c, (unsigned long)b); + fprintf(stderr, "error: too many stage 2 entries at U+%04x<->0x%02x\n", (int)c, b); return FALSE; } @@ -907,8 +476,7 @@ MBCSSingleAddFromUnicode(NewConverter *cnvData, if(mbcsData->stage2Single[index]==0) { /* allocate another block in stage 3 */ if(mbcsData->stage3Top>=0x10000) { - fprintf(stderr, "error: too many code points at U+%04x<->0x%02lx\n", - c, (unsigned long)b); + fprintf(stderr, "error: too many code points at U+%04x<->0x%02x\n", (int)c, b); return FALSE; } /* each block has 16 uint16_t entries */ @@ -920,7 +488,7 @@ MBCSSingleAddFromUnicode(NewConverter *cnvData, /* write the codepage entry into stage 3 and get the previous entry */ p=(uint16_t *)mbcsData->fromUBytes+mbcsData->stage2Single[index]+(c&0xf); old=*p; - if(isFallback<=0) { + if(flag<=0) { *p=(uint16_t)(0xf00|b); } else if(IS_PRIVATE_USE(c)) { *p=(uint16_t)(0xc00|b); @@ -930,13 +498,13 @@ MBCSSingleAddFromUnicode(NewConverter *cnvData, /* check that this Unicode code point was still unassigned */ if(old>=0x100) { - if(isFallback>=0) { - fprintf(stderr, "error: duplicate Unicode code point at U+%04x<->0x%02lx see 0x%02x\n", - c, (unsigned long)b, old&0xff); + if(flag>=0) { + fprintf(stderr, "error: duplicate Unicode code point at U+%04x<->0x%02x see 0x%02x\n", + (int)c, b, old&0xff); return FALSE; } else if(VERBOSE) { - fprintf(stderr, "duplicate Unicode code point at U+%04x<->0x%02lx see 0x%02x\n", - c, (unsigned long)b, old&0xff); + fprintf(stderr, "duplicate Unicode code point at U+%04x<->0x%02x see 0x%02x\n", + (int)c, b, old&0xff); } /* continue after the above warning if the precision of the mapping is unspecified */ } @@ -945,21 +513,41 @@ MBCSSingleAddFromUnicode(NewConverter *cnvData, } static UBool -MBCSAddFromUnicode(NewConverter *cnvData, +MBCSAddFromUnicode(MBCSData *mbcsData, const uint8_t *bytes, int32_t length, - UChar32 c, uint32_t b, - int8_t isFallback) { - MBCSData *mbcsData=(MBCSData *)cnvData; + UChar32 c, + int8_t flag) { + char buffer[10]; + const uint8_t *pb; uint8_t *p; - uint32_t index, old; + uint32_t index, b, old; + int32_t maxCharLength; + + /* ignore |2 SUB mappings */ + if(flag==2) { + return TRUE; + } + + maxCharLength=mbcsData->ucm->states.maxCharLength; + + if(maxCharLength==1) { + return MBCSSingleAddFromUnicode(mbcsData, bytes, length, c, flag); + } - if( (mbcsData->header.flags&0xff)==MBCS_OUTPUT_2_SISO && + if( mbcsData->ucm->states.outputType==MBCS_OUTPUT_2_SISO && (*bytes==0xe || *bytes==0xf) ) { - fprintf(stderr, "error: illegal mapping to SI or SO for SI/SO codepage: U+%04x<->0x%02lx\n", - c, (unsigned long)b); + fprintf(stderr, "error: illegal mapping to SI or SO for SI/SO codepage: U+%04x<->0x%s\n", + (int)c, printBytes(buffer, bytes, length)); return FALSE; } + + if(flag==1 && length==1 && *bytes==0) { + fprintf(stderr, "error: unable to encode a |1 fallback from U+%04x to 0x%02x\n", + (int)c, *bytes); + return FALSE; + } + /* * Walk down the triple-stage compact array ("trie") and * allocate parts as necessary. @@ -973,8 +561,8 @@ MBCSAddFromUnicode(NewConverter *cnvData, if(mbcsData->stage1[index]==MBCS_STAGE_2_ALL_UNASSIGNED_INDEX) { /* allocate another block in stage 2 */ if(mbcsData->stage2Top>=MBCS_MAX_STAGE_2_TOP) { - fprintf(stderr, "error: too many stage 2 entries at U+%04x<->0x%02lx\n", - c, (unsigned long)b); + fprintf(stderr, "error: too many stage 2 entries at U+%04x<->0x%s\n", + (int)c, printBytes(buffer, bytes, length)); return FALSE; } @@ -990,21 +578,38 @@ MBCSAddFromUnicode(NewConverter *cnvData, index=mbcsData->stage1[index]+((c>>4)&0x3f); if(mbcsData->stage2[index]==0) { /* allocate another block in stage 3 */ - if(mbcsData->stage3Top>=0x100000*mbcsData->maxCharLength) { - fprintf(stderr, "error: too many code points at U+%04x<->0x%02lx\n", - c, (unsigned long)b); + if(mbcsData->stage3Top>=0x100000*(uint32_t)maxCharLength) { + fprintf(stderr, "error: too many code points at U+%04x<->0x%s\n", + (int)c, printBytes(buffer, bytes, length)); return FALSE; } /* each block has 16*maxCharLength bytes */ - mbcsData->stage2[index]=(mbcsData->stage3Top/16)/mbcsData->maxCharLength; - uprv_memset(mbcsData->fromUBytes+mbcsData->stage3Top, 0, 16*mbcsData->maxCharLength); - mbcsData->stage3Top+=16*mbcsData->maxCharLength; + mbcsData->stage2[index]=(mbcsData->stage3Top/16)/maxCharLength; + uprv_memset(mbcsData->fromUBytes+mbcsData->stage3Top, 0, 16*maxCharLength); + mbcsData->stage3Top+=16*maxCharLength; } /* write the codepage bytes into stage 3 and get the previous bytes */ + + /* assemble the bytes into a single integer */ + pb=bytes; + b=0; + switch(length) { + case 4: + b=*pb++; + case 3: + b=(b<<8)|*pb++; + case 2: + b=(b<<8)|*pb++; + case 1: + default: + b=(b<<8)|*pb++; + break; + } + old=0; - p=mbcsData->fromUBytes+(16*(uint32_t)(uint16_t)mbcsData->stage2[index]+(c&0xf))*mbcsData->maxCharLength; - switch(mbcsData->maxCharLength) { + p=mbcsData->fromUBytes+(16*(uint32_t)(uint16_t)mbcsData->stage2[index]+(c&0xf))*maxCharLength; + switch(maxCharLength) { case 2: old=*(uint16_t *)p; *(uint16_t *)p=(uint16_t)b; @@ -1028,338 +633,101 @@ MBCSAddFromUnicode(NewConverter *cnvData, /* check that this Unicode code point was still unassigned */ if((mbcsData->stage2[index]&(1UL<<(16+(c&0xf))))!=0 || old!=0) { - if(isFallback>=0) { - fprintf(stderr, "error: duplicate Unicode code point at U+%04x<->0x%02lx see 0x%02lx\n", - c, (unsigned long)b, (unsigned long)old); + if(flag>=0) { + fprintf(stderr, "error: duplicate Unicode code point at U+%04x<->0x%s see 0x%02x\n", + (int)c, printBytes(buffer, bytes, length), (int)old); return FALSE; } else if(VERBOSE) { - fprintf(stderr, "duplicate Unicode code point at U+%04x<->0x%02lx see 0x%02lx\n", - c, (unsigned long)b, (unsigned long)old); + fprintf(stderr, "duplicate Unicode code point at U+%04x<->0x%s see 0x%02x\n", + (int)c, printBytes(buffer, bytes, length), (int)old); } /* continue after the above warning if the precision of the mapping is unspecified */ } - if(isFallback<=0) { - /* set the "assigned" flag */ + if(flag<=0) { + /* set the roundtrip flag */ mbcsData->stage2[index]|=(1UL<<(16+(c&0xf))); } return TRUE; } -static int -compareFallbacks(const void *fb1, const void *fb2) { - return ((const _MBCSToUFallback *)fb1)->offset-((const _MBCSToUFallback *)fb2)->offset; -} - -/* - * This function tries to compact toUnicode tables for 2-byte codepages - * by finding lead bytes with all-unassigned trail bytes and adding another state - * for them. - */ -static void -compactToUnicode2(MBCSData *mbcsData) { - int32_t (*oldStateTable)[256]; - uint16_t count[256]; - uint16_t *oldUnicodeCodeUnits; - int32_t entry, offset, oldOffset, trailOffset, oldTrailOffset, savings, sum; - int32_t i, j, leadState, trailState, newState, fallback; - uint16_t unit; - - /* find the lead state */ - if((mbcsData->header.flags&0xff)==MBCS_OUTPUT_2_SISO) { - /* use the DBCS lead state for SI/SO codepages */ - leadState=1; - } else { - leadState=0; - } - - /* find the main trail state: the most used target state */ - uprv_memset(count, 0, sizeof(count)); - for(i=0; i<256; ++i) { - entry=mbcsData->stateTable[leadState][i]; - if(MBCS_ENTRY_IS_TRANSITION(entry)) { - ++count[MBCS_ENTRY_TRANSITION_STATE(entry)]; - } - } - trailState=0; - for(i=1; i<(int)mbcsData->header.countStates; ++i) { - if(count[i]>count[trailState]) { - trailState=i; - } - } - - /* count possible savings from lead bytes with all-unassigned results in all trail bytes */ - uprv_memset(count, 0, sizeof(count)); - savings=0; - /* for each lead byte */ - for(i=0; i<256; ++i) { - entry=mbcsData->stateTable[leadState][i]; - if(MBCS_ENTRY_IS_TRANSITION(entry) && (MBCS_ENTRY_TRANSITION_STATE(entry))==trailState) { - /* the offset is different for each lead byte */ - offset=MBCS_ENTRY_TRANSITION_OFFSET(entry); - /* for each trail byte for this lead byte */ - for(j=0; j<256; ++j) { - entry=mbcsData->stateTable[trailState][j]; - switch(MBCS_ENTRY_FINAL_ACTION(entry)) { - case MBCS_STATE_VALID_16: - entry=offset+MBCS_ENTRY_FINAL_VALUE_16(entry); - if(mbcsData->unicodeCodeUnits[entry]==0xfffe && findFallback(mbcsData, entry)<0) { - ++count[i]; - } else { - j=999; /* do not count for this lead byte because there are assignments */ - } - break; - case MBCS_STATE_VALID_16_PAIR: - entry=offset+MBCS_ENTRY_FINAL_VALUE_16(entry); - if(mbcsData->unicodeCodeUnits[entry]==0xfffe) { - count[i]+=2; - } else { - j=999; /* do not count for this lead byte because there are assignments */ - } - break; - default: - break; - } - } - if(j==256) { - /* all trail bytes for this lead byte are unassigned */ - savings+=count[i]; - } else { - count[i]=0; - } - } - } - /* subtract from the possible savings the cost of an additional state */ - savings=savings*2-1024; /* count bytes, not 16-bit words */ - if(savings<=0) { - return; - } - if(VERBOSE) { - printf("compacting toUnicode data saves %ld bytes\n", (long)savings); - } - if(mbcsData->header.countStates>=MBCS_MAX_STATE_COUNT) { - fprintf(stderr, "cannot compact toUnicode because the maximum number of states is reached\n"); - return; - } - - /* make a copy of the state table */ - oldStateTable=(int32_t (*)[256])uprv_malloc(mbcsData->header.countStates*1024); - if(oldStateTable==NULL) { - fprintf(stderr, "cannot compact toUnicode: out of memory\n"); - return; - } - uprv_memcpy(oldStateTable, mbcsData->stateTable, mbcsData->header.countStates*1024); - - /* add the new state */ - /* - * this function does not catch the degenerate case where all lead bytes - * have all-unassigned trail bytes and the lead state could be removed - */ - newState=mbcsData->header.countStates++; - mbcsData->stateFlags[newState]=0; - /* copy the old trail state, turning all assigned states into unassigned ones */ - for(i=0; i<256; ++i) { - entry=mbcsData->stateTable[trailState][i]; - switch(MBCS_ENTRY_FINAL_ACTION(entry)) { - case MBCS_STATE_VALID_16: - case MBCS_STATE_VALID_16_PAIR: - mbcsData->stateTable[newState][i]=MBCS_ENTRY_FINAL_SET_ACTION_VALUE(entry, MBCS_STATE_UNASSIGNED, 0xfffe); - break; - default: - mbcsData->stateTable[newState][i]=entry; - break; - } - } - - /* in the lead state, redirect all lead bytes with all-unassigned trail bytes to the new state */ - for(i=0; i<256; ++i) { - if(count[i]>0) { - mbcsData->stateTable[leadState][i]=MBCS_ENTRY_SET_STATE(mbcsData->stateTable[leadState][i], newState); - } +/* we can assume that the table only contains 1:1 mappings with <=4 bytes each */ +static UBool +MBCSAddTable(NewConverter *cnvData, UCMTable *table, UConverterStaticData *staticData) { + MBCSData *mbcsData; + UCMapping *m; + UChar32 c; + int32_t i; + UBool isOK; + + staticData->unicodeMask=table->unicodeMask; + if(staticData->unicodeMask==3) { + fprintf(stderr, "error: contains mappings for both supplementary and surrogate code points\n"); + return FALSE; } - /* sum up the new state table */ - for(i=0; i<(int)mbcsData->header.countStates; ++i) { - mbcsData->stateFlags[i]&=~MBCS_STATE_FLAG_READY; - } - sum=sumUpStates(mbcsData); - - /* allocate a new, smaller code units array */ - oldUnicodeCodeUnits=mbcsData->unicodeCodeUnits; - if(sum==0) { - mbcsData->unicodeCodeUnits=NULL; - if(oldUnicodeCodeUnits!=NULL) { - uprv_free(oldUnicodeCodeUnits); - } - uprv_free(oldStateTable); - return; - } - mbcsData->unicodeCodeUnits=(uint16_t *)uprv_malloc(sum*sizeof(uint16_t)); - if(mbcsData->unicodeCodeUnits==NULL) { - fprintf(stderr, "cannot compact toUnicode: out of memory allocating %ld 16-bit code units\n", - (long)sum); - /* revert to the old state table */ - mbcsData->unicodeCodeUnits=oldUnicodeCodeUnits; - --mbcsData->header.countStates; - uprv_memcpy(mbcsData->stateTable, oldStateTable, mbcsData->header.countStates*1024); - uprv_free(oldStateTable); - return; - } - for(i=0; iunicodeCodeUnits[i]=0xfffe; - } + staticData->conversionType=UCNV_MBCS; - /* copy the code units for all assigned characters */ - /* - * The old state table has the same lead _and_ trail states for assigned characters! - * The differences are in the offsets, and in the trail states for some unassigned characters. - * For each character with an assigned state in the new table, it was assigned in the old one. - * Only still-assigned characters are copied. - * Note that fallback mappings need to get their offset values adjusted. - */ + mbcsData=(MBCSData *)cnvData; - /* for each initial state */ - for(leadState=0; leadState<(int)mbcsData->header.countStates; ++leadState) { - if((mbcsData->stateFlags[leadState]&0xf)==MBCS_STATE_FLAG_DIRECT) { - /* for each lead byte from there */ - for(i=0; i<256; ++i) { - entry=mbcsData->stateTable[leadState][i]; - if(MBCS_ENTRY_IS_TRANSITION(entry)) { - trailState=(uint8_t)MBCS_ENTRY_TRANSITION_STATE(entry); - /* the new state does not have assigned states */ - if(trailState!=newState) { - trailOffset=MBCS_ENTRY_TRANSITION_OFFSET(entry); - oldTrailOffset=MBCS_ENTRY_TRANSITION_OFFSET(oldStateTable[leadState][i]); - /* for each trail byte */ - for(j=0; j<256; ++j) { - entry=mbcsData->stateTable[trailState][j]; - /* copy assigned-character code units and adjust fallback offsets */ - switch(MBCS_ENTRY_FINAL_ACTION(entry)) { - case MBCS_STATE_VALID_16: - offset=trailOffset+MBCS_ENTRY_FINAL_VALUE_16(entry); - /* find the old offset according to the old state table */ - oldOffset=oldTrailOffset+MBCS_ENTRY_FINAL_VALUE_16(oldStateTable[trailState][j]); - unit=mbcsData->unicodeCodeUnits[offset]=oldUnicodeCodeUnits[oldOffset]; - if(unit==0xfffe && (fallback=findFallback(mbcsData, oldOffset))>=0) { - mbcsData->toUFallbacks[fallback].offset=0x80000000|offset; - } - break; - case MBCS_STATE_VALID_16_PAIR: - offset=trailOffset+MBCS_ENTRY_FINAL_VALUE_16(entry); - /* find the old offset according to the old state table */ - oldOffset=oldTrailOffset+MBCS_ENTRY_FINAL_VALUE_16(oldStateTable[trailState][j]); - mbcsData->unicodeCodeUnits[offset++]=oldUnicodeCodeUnits[oldOffset++]; - mbcsData->unicodeCodeUnits[offset]=oldUnicodeCodeUnits[oldOffset]; - break; - default: - break; - } - } - } - } - } - } + if(!MBCSStartMappings(mbcsData)) { + return FALSE; } - /* remove temporary flags from fallback offsets that protected them from being modified twice */ - sum=mbcsData->header.countToUFallbacks; - for(i=0; itoUFallbacks[i].offset&=0x7fffffff; - } + isOK=TRUE; - /* free temporary memory */ - uprv_free(oldUnicodeCodeUnits); - uprv_free(oldStateTable); -} + m=table->mappings; + for(i=0; imappingsLength; ++m, ++i) { + c=m->u; -/* - * recursive sub-function of compactToUnicodeHelper() - * returns: - * >0 number of bytes that are used in unicodeCodeUnits[] that could be saved, - * if all sequences from this state are unassigned, returns the - * <0 there are assignments in unicodeCodeUnits[] - * 0 no use of unicodeCodeUnits[] - */ -static int32_t -findUnassigned(MBCSData *mbcsData, int32_t state, int32_t offset, uint32_t b) { - int32_t i, entry, savings, localSavings, belowSavings; - UBool haveAssigned; - - localSavings=belowSavings=0; - haveAssigned=FALSE; - for(i=0; i<256; ++i) { - entry=mbcsData->stateTable[state][i]; - if(MBCS_ENTRY_IS_TRANSITION(entry)) { - savings=findUnassigned(mbcsData, MBCS_ENTRY_TRANSITION_STATE(entry), offset+MBCS_ENTRY_TRANSITION_OFFSET(entry), (b<<8)|(uint32_t)i); - if(savings<0) { - haveAssigned=TRUE; - } else if(savings>0) { - printf(" all-unassigned sequences from prefix 0x%02lx state %ld use %ld bytes\n", - (unsigned long)((b<<8)|i), (long)state, (long)savings); - belowSavings+=savings; - } - } else if(!haveAssigned) { - switch(MBCS_ENTRY_FINAL_ACTION(entry)) { - case MBCS_STATE_VALID_16: - entry=offset+MBCS_ENTRY_FINAL_VALUE_16(entry); - if(mbcsData->unicodeCodeUnits[entry]==0xfffe && findFallback(mbcsData, entry)<0) { - localSavings+=2; - } else { - haveAssigned=TRUE; - } - break; - case MBCS_STATE_VALID_16_PAIR: - entry=offset+MBCS_ENTRY_FINAL_VALUE_16(entry); - if(mbcsData->unicodeCodeUnits[entry]==0xfffe) { - localSavings+=4; - } else { - haveAssigned=TRUE; - } - break; - default: - break; - } + switch(m->f) { + case -1: + /* there was no precision/fallback indicator */ + /* fall through to set the mappings */ + case 0: + /* set roundtrip mappings */ + isOK&=MBCSAddToUnicode(mbcsData, m->b.bytes, m->bLen, c, m->f) && + MBCSAddFromUnicode(mbcsData, m->b.bytes, m->bLen, c, m->f); + break; + case 1: + /* set only a fallback mapping from Unicode to codepage */ + staticData->hasFromUnicodeFallback=TRUE; + isOK&=MBCSAddFromUnicode(mbcsData, m->b.bytes, m->bLen, c, m->f); + break; + case 2: + /* ignore |2 SUB mappings */ + break; + case 3: + /* set only a fallback mapping from codepage to Unicode */ + staticData->hasToUnicodeFallback=TRUE; + isOK&=MBCSAddToUnicode(mbcsData, m->b.bytes, m->bLen, c, m->f); + break; + default: + /* will not occur because the parser checked it already */ + fprintf(stderr, "error: illegal fallback indicator %d\n", m->f); + return FALSE; } } - if(haveAssigned) { - return -1; - } else { - return localSavings+belowSavings; - } -} - -/* helper function for finding compaction opportunities */ -static void -compactToUnicodeHelper(MBCSData *mbcsData) { - int32_t state, savings; - if(!VERBOSE) { - return; - } + MBCSPostprocess(mbcsData, staticData); - /* for each initial state */ - for(state=0; state<(int)mbcsData->header.countStates; ++state) { - if((mbcsData->stateFlags[state]&0xf)==MBCS_STATE_FLAG_DIRECT) { - savings=findUnassigned(mbcsData, state, 0, 0); - if(savings>0) { - printf(" all-unassigned sequences from initial state %ld use %ld bytes\n", - (long)state, (long)savings); - } - } - } + return isOK; } static UBool transformEUC(MBCSData *mbcsData) { uint8_t *p8; - uint32_t i, value, oldLength=mbcsData->maxCharLength, old3Top=mbcsData->stage3Top, new3Top; + uint32_t i, value, oldLength, old3Top, new3Top; uint8_t b; + oldLength=mbcsData->ucm->states.maxCharLength; if(oldLength<3) { return FALSE; } + old3Top=mbcsData->stage3Top; + /* careful: 2-byte and 4-byte codes are stored in platform endianness! */ /* test if all first bytes are in {0, 0x8e, 0x8f} */ @@ -1382,7 +750,7 @@ transformEUC(MBCSData *mbcsData) { p8=mbcsData->fromUBytes; /* modify outputType and adjust stage3Top */ - mbcsData->header.flags=MBCS_OUTPUT_3_EUC+oldLength-3; + mbcsData->ucm->states.outputType=(int8_t)(MBCS_OUTPUT_3_EUC+oldLength-3); mbcsData->stage3Top=new3Top=(old3Top*(oldLength-1))/oldLength; /* @@ -1608,54 +976,28 @@ compactStage2(MBCSData *mbcsData) { } static void -MBCSPostprocess(NewConverter *cnvData, const UConverterStaticData *staticData) { - MBCSData *mbcsData=(MBCSData *)cnvData; - int32_t entry; - int state, cell; +MBCSPostprocess(MBCSData *mbcsData, const UConverterStaticData *staticData) { + UCMStates *states; + int32_t maxCharLength; + + states=&mbcsData->ucm->states; + maxCharLength=states->maxCharLength; /* this needs to be printed before the EUC transformation because later maxCharLength might not be correct */ if(VERBOSE) { printf("number of codepage characters in 16-blocks: 0x%lx=%lu\n", - (unsigned long)mbcsData->stage3Top/mbcsData->maxCharLength, - (unsigned long)mbcsData->stage3Top/mbcsData->maxCharLength); - } - - /* test each state table entry */ - for(state=0; state<(int)mbcsData->header.countStates; ++state) { - for(cell=0; cell<256; ++cell) { - entry=mbcsData->stateTable[state][cell]; - /* - * if the entry is a final one with an MBCS_STATE_VALID_DIRECT_16 action code - * and the code point is "unassigned" (0xfffe), then change it to - * the "unassigned" action code with bits 26..23 set to zero and U+fffe. - */ - if(MBCS_ENTRY_SET_STATE(entry, 0)==MBCS_ENTRY_FINAL(0, MBCS_STATE_VALID_DIRECT_16, 0xfffe)) { - mbcsData->stateTable[state][cell]=MBCS_ENTRY_FINAL_SET_ACTION(entry, MBCS_STATE_UNASSIGNED); - } - } - } - - /* try to compact the toUnicode tables */ - if(mbcsData->maxCharLength==2) { - compactToUnicode2(mbcsData); - } else if(mbcsData->maxCharLength>2) { - compactToUnicodeHelper(mbcsData); + (unsigned long)mbcsData->stage3Top/maxCharLength, + (unsigned long)mbcsData->stage3Top/maxCharLength); } - /* sort toUFallbacks */ - /* - * It should be safe to sort them before compactToUnicode2() is called, - * because it should not change the relative order of the offset values - * that it adjusts, but they need to be sorted at some point, and - * it is safest here. - */ - if(mbcsData->header.countToUFallbacks>0) { - qsort(mbcsData->toUFallbacks, mbcsData->header.countToUFallbacks, sizeof(_MBCSToUFallback), compareFallbacks); - } + ucm_optimizeStates(states, + &mbcsData->unicodeCodeUnits, + mbcsData->toUFallbacks, mbcsData->countToUFallbacks, + VERBOSE); /* try to compact the fromUnicode tables */ transformEUC(mbcsData); - if(mbcsData->maxCharLength==1) { + if(maxCharLength==1) { singleCompactStage3(mbcsData); singleCompactStage2(mbcsData); } else { @@ -1664,12 +1006,16 @@ MBCSPostprocess(NewConverter *cnvData, const UConverterStaticData *staticData) { } static uint32_t -MBCSWrite(NewConverter *cnvData, const UConverterStaticData *staticData, UNewDataMemory *pData) { +MBCSWrite(NewConverter *cnvData, const UConverterStaticData *staticData, + UNewDataMemory *pData, int32_t tableType) { MBCSData *mbcsData=(MBCSData *)cnvData; + uint32_t top; int32_t i, stage1Top; + _MBCSHeader header={ { 0, 0, 0, 0 }, 0, 0, 0, 0, 0, 0, 0 }; + /* adjust stage 1 entries to include the size of stage 1 in the offsets to stage 2 */ - if(mbcsData->maxCharLength==1) { + if(mbcsData->ucm->states.maxCharLength==1) { if(staticData->unicodeMask&UCNV_HAS_SUPPLEMENTARY) { stage1Top=MBCS_STAGE_1_SIZE; /* 0x440==1088 */ } else { @@ -1705,26 +1051,44 @@ MBCSWrite(NewConverter *cnvData, const UConverterStaticData *staticData, UNewDat mbcsData->stage3Top=(mbcsData->stage3Top+3)&~3; /* fill the header */ - mbcsData->header.offsetToUCodeUnits= + header.version[0]=4; + header.version[1]=2; + header.countStates=mbcsData->ucm->states.countStates; + header.countToUFallbacks=mbcsData->countToUFallbacks; + + header.offsetToUCodeUnits= sizeof(_MBCSHeader)+ - mbcsData->header.countStates*1024+ - mbcsData->header.countToUFallbacks*sizeof(_MBCSToUFallback); - mbcsData->header.offsetFromUTable= - mbcsData->header.offsetToUCodeUnits+ - mbcsData->countToUCodeUnits*2; - mbcsData->header.offsetFromUBytes= - mbcsData->header.offsetFromUTable+ + mbcsData->ucm->states.countStates*1024+ + mbcsData->countToUFallbacks*sizeof(_MBCSToUFallback); + header.offsetFromUTable= + header.offsetToUCodeUnits+ + mbcsData->ucm->states.countToUCodeUnits*2; + header.offsetFromUBytes= + header.offsetFromUTable+ stage1Top*2+ mbcsData->stage2Top; - mbcsData->header.fromUBytesLength=mbcsData->stage3Top; + header.fromUBytesLength=mbcsData->stage3Top; + + top=header.offsetFromUBytes+header.fromUBytesLength; + + header.flags=(uint8_t)(mbcsData->ucm->states.outputType); + + if(tableType&TABLE_EXT) { + if(top>0xffffff) { + fprintf(stderr, "error: offset 0x%lx to extension table exceeds 0xffffff\n", (long)top); + return 0; + } + + header.flags|=top<<8; + } /* write the MBCS data */ - udata_writeBlock(pData, &mbcsData->header, sizeof(_MBCSHeader)); - udata_writeBlock(pData, mbcsData->stateTable, mbcsData->header.countStates*1024); - udata_writeBlock(pData, mbcsData->toUFallbacks, mbcsData->header.countToUFallbacks*sizeof(_MBCSToUFallback)); - udata_writeBlock(pData, mbcsData->unicodeCodeUnits, mbcsData->countToUCodeUnits*2); + udata_writeBlock(pData, &header, sizeof(_MBCSHeader)); + udata_writeBlock(pData, mbcsData->ucm->states.stateTable, header.countStates*1024); + udata_writeBlock(pData, mbcsData->toUFallbacks, mbcsData->countToUFallbacks*sizeof(_MBCSToUFallback)); + udata_writeBlock(pData, mbcsData->unicodeCodeUnits, mbcsData->ucm->states.countToUCodeUnits*2); udata_writeBlock(pData, mbcsData->stage1, stage1Top*2); - if(mbcsData->maxCharLength==1) { + if(mbcsData->ucm->states.maxCharLength==1) { udata_writeBlock(pData, mbcsData->stage2Single, mbcsData->stage2Top); } else { udata_writeBlock(pData, mbcsData->stage2, mbcsData->stage2Top); @@ -1732,5 +1096,5 @@ MBCSWrite(NewConverter *cnvData, const UConverterStaticData *staticData, UNewDat udata_writeBlock(pData, mbcsData->fromUBytes, mbcsData->stage3Top); /* return the number of bytes that should have been written */ - return mbcsData->header.offsetFromUBytes+mbcsData->header.fromUBytesLength; + return header.offsetFromUBytes+header.fromUBytesLength; } diff --git a/icuSources/tools/makeconv/genmbcs.h b/icuSources/tools/makeconv/genmbcs.h index c2ab1994..93132026 100644 --- a/icuSources/tools/makeconv/genmbcs.h +++ b/icuSources/tools/makeconv/genmbcs.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2000, International Business Machines +* Copyright (C) 2000-2003, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -19,10 +19,27 @@ #include "makeconv.h" +enum { + MBCS_STAGE_2_BLOCK_SIZE=0x40, /* 64; 64=1<<6 for 6 bits in stage 2 */ + MBCS_STAGE_2_BLOCK_SIZE_SHIFT=6, /* log2(MBCS_STAGE_2_BLOCK_SIZE) */ + MBCS_STAGE_1_SIZE=0x440, /* 0x110000>>10, or 17*64 for one entry per 1k code points */ + MBCS_STAGE_2_SIZE=0xfbc0, /* 0x10000-MBCS_STAGE_1_SIZE */ + MBCS_MAX_STAGE_2_TOP=MBCS_STAGE_2_SIZE, + MBCS_STAGE_2_MAX_BLOCKS=MBCS_STAGE_2_SIZE>>MBCS_STAGE_2_BLOCK_SIZE_SHIFT, + + MBCS_STAGE_2_ALL_UNASSIGNED_INDEX=0, /* stage 1 entry for the all-unassigned stage 2 block */ + MBCS_STAGE_2_FIRST_ASSIGNED=MBCS_STAGE_2_BLOCK_SIZE, /* start of the first stage 2 block after the all-unassigned one */ + + MBCS_STAGE_3_BLOCK_SIZE=16, /* 16; 16=1<<4 for 4 bits in stage 3 */ + MBCS_STAGE_3_FIRST_ASSIGNED=MBCS_STAGE_3_BLOCK_SIZE, /* start of the first stage 3 block after the all-unassigned one */ + + MBCS_MAX_FALLBACK_COUNT=8192 +}; + U_CFUNC NewConverter * -MBCSOpen(uint8_t maxCharLength); +MBCSOpen(UCMFile *ucm); -U_CFUNC UBool -MBCSAddState(NewConverter *cnvData, const char *s); +U_CFUNC NewConverter * +CnvExtOpen(UCMFile *ucm); #endif diff --git a/icuSources/tools/makeconv/makeconv.c b/icuSources/tools/makeconv/makeconv.c index 328cda43..f3b64430 100644 --- a/icuSources/tools/makeconv/makeconv.c +++ b/icuSources/tools/makeconv/makeconv.c @@ -1,7 +1,7 @@ /* ******************************************************************************** * - * Copyright (C) 1998-2003, International Business Machines + * Copyright (C) 1998-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************** @@ -24,17 +24,50 @@ #include "ucnv_cnv.h" #include "cstring.h" #include "cmemory.h" +#include "uinvchar.h" #include "filestrm.h" #include "toolutil.h" #include "uoptions.h" #include "unicode/udata.h" #include "unewdata.h" -#include "ucmpwrit.h" +#include "uparse.h" +#include "ucm.h" #include "makeconv.h" #include "genmbcs.h" #define DEBUG 0 +typedef struct ConvData { + UCMFile *ucm; + NewConverter *cnvData, *extData; + UConverterSharedData sharedData; + UConverterStaticData staticData; +} ConvData; + +static void +initConvData(ConvData *data) { + uprv_memset(data, 0, sizeof(ConvData)); + data->sharedData.structSize=sizeof(UConverterSharedData); + data->staticData.structSize=sizeof(UConverterStaticData); + data->sharedData.staticData=&data->staticData; +} + +static void +cleanupConvData(ConvData *data) { + if(data!=NULL) { + if(data->cnvData!=NULL) { + data->cnvData->close(data->cnvData); + data->cnvData=NULL; + } + if(data->extData!=NULL) { + data->extData->close(data->extData); + data->extData=NULL; + } + ucm_close(data->ucm); + data->ucm=NULL; + } +} + /* * from ucnvstat.c - static prototypes of data-based converters */ @@ -46,137 +79,14 @@ extern const UConverterStaticData * ucnv_converterStaticData[UCNV_NUMBER_OF_SUPP UBool VERBOSE = FALSE; UBool TOUCHFILE = FALSE; -/*Reads the header of the table file and fills in basic knowledge about the converter - *in "converter" - */ -static void readHeaderFromFile(UConverterSharedData* myConverter, FileStream* convFile, const char* converterName, UErrorCode* err); - -/*Reads the rest of the file, and fills up the shared objects if necessary -Returns the UConverterTable. */ -static void loadTableFromFile(FileStream* convFile, UConverterSharedData* sharedData, UErrorCode* err); - -/* creates a UConverterSharedData from a mapping file. - * Fills in: *staticData, *table. Converter is NOT otherwise useful. - */ -static UConverterSharedData* createConverterFromTableFile(const char* realName, UErrorCode* err); +static void +createConverter(ConvData *data, const char* converterName, UErrorCode *pErrorCode); /* * Set up the UNewData and write the converter.. */ -void writeConverterData(UConverterSharedData *mySharedData, const char *cnvName, const char *cnvDir, UErrorCode *status); - -static const char NLTC_SEPARATORS[9] = { '\r', '\n', '\t', ' ', '<', '>' ,'"' , 'U', '\0' }; -static const char FALLBACK_SEPARATOR = '|'; -static const char CODEPOINT_SEPARATORS[8] = { '\r', '>', '\\', 'x', '\n', ' ', '\t', '\0' }; -static const char UNICODE_CODEPOINT_SEPARATORS[6] = { '<', '>', 'U', ' ', '\t', '\0' }; - -static const char * -skipWhitespace(const char *s) { - while(*s==' ' || *s=='\t') { - ++s; - } - return s; -} - -static int32_t -parseCodepageBytes(const char *s, uint32_t *pBytes, const char **pEnd) { - char *end; - int32_t length=0; - uint32_t bytes=0, value; - - while(s[0]=='\\' && s[1]=='x') { - if(length==4) { - return -1; - } - value=uprv_strtoul(s+2, &end, 16); - s+=4; - if(end!=s) { - return -1; - } - bytes=(bytes<<8)|value; - ++length; - } - if(length==0) { - return -1; - } - if(pEnd!=NULL) { - *pEnd=s; - } - *pBytes=bytes; - return length; -} - -/* Remove all characters followed by '#'. There is an exception if there - * is a fallback sign '|' after the comment and the comment does not - * start in column 0. In this case, we just blank from '#' to just - * before the '|' in order to support the fact that IBM official .ucm - * files have the fallback information in comments! - */ -static char * - removeComments (char *line) -{ - char *pound; - - line = (char*)skipWhitespace(line); - pound = uprv_strchr (line, '#'); - if (pound != NULL) - { - char *fallback = pound == line ? 0 : uprv_strchr(pound + 1, '|'); - if (fallback != NULL) - { - uprv_memset(pound, ' ', fallback-pound); - } - else - { - *pound = '\0'; - } - } - return line; -} - -/* Returns true in c is a in set 'setOfChars', false otherwise - */ -static UBool - isInSet (char c, const char *setOfChars) -{ - uint8_t i = 0; - - while (setOfChars[i] != '\0') - { - if (c == setOfChars[i++]) - return TRUE; - } - - return FALSE; -} - -/* Returns pointer to the next non-whitespace (or non-separator) - */ -static int32_t - nextTokenOffset (const char *line, const char *separators) -{ - int32_t i = 0; - - while (line[i] && isInSet(line[i], separators)) - i++; - - return i; -} - -/* Returns pointer to the next token based on the set of separators - */ -static char * - getToken (char *token, char *line, const char *separators) -{ - int32_t i = nextTokenOffset (line, separators); - int8_t j = 0; - - while (line[i] && (!isInSet(line[i], separators))) - token[j++] = line[i++]; - token[j] = '\0'; - - return line + i; -} +static void +writeConverterData(ConvData *data, const char *cnvName, const char *cnvDir, UErrorCode *status); UBool haveCopyright=TRUE; @@ -194,20 +104,27 @@ static UDataInfo dataInfo={ {0, 0, 0, 0} /* dataVersion (calculated at runtime) */ }; -void writeConverterData(UConverterSharedData *mySharedData, - const char *cnvName, - const char *cnvDir, - UErrorCode *status) +static void +writeConverterData(ConvData *data, const char *cnvName, const char *cnvDir, UErrorCode *status) { UNewDataMemory *mem = NULL; uint32_t sz2; uint32_t size = 0; + int32_t tableType; if(U_FAILURE(*status)) { return; } + tableType=TABLE_NONE; + if(data->cnvData!=NULL) { + tableType|=TABLE_BASE; + } + if(data->extData!=NULL) { + tableType|=TABLE_EXT; + } + mem = udata_create(cnvDir, "cnv", cnvName, &dataInfo, haveCopyright ? U_COPYRIGHT_STRING : NULL, status); if(U_FAILURE(*status)) @@ -224,21 +141,27 @@ void writeConverterData(UConverterSharedData *mySharedData, fprintf(stderr, "- Opened udata %s.%s\n", cnvName, "cnv"); } + /* all read only, clean, platform independent data. Mmmm. :) */ - udata_writeBlock(mem, mySharedData->staticData, sizeof(UConverterStaticData)); + udata_writeBlock(mem, &data->staticData, sizeof(UConverterStaticData)); size += sizeof(UConverterStaticData); /* Is 4-aligned - by size */ /* Now, write the table */ - size += ((NewConverter *)mySharedData->table)->write((NewConverter *)mySharedData->table, mySharedData->staticData, mem); + if(tableType&TABLE_BASE) { + size += data->cnvData->write(data->cnvData, &data->staticData, mem, tableType); + } + if(tableType&TABLE_EXT) { + size += data->extData->write(data->extData, &data->staticData, mem, tableType); + } sz2 = udata_finish(mem, status); if(size != sz2) { - fprintf(stderr, "error: wrote %d bytes to the .cnv file but counted %d bytes\n", sz2, size); + fprintf(stderr, "error: wrote %u bytes to the .cnv file but counted %u bytes\n", (int)sz2, (int)size); *status=U_INTERNAL_PROGRAM_ERROR; } if(VERBOSE) { - fprintf(stderr, "- Wrote %d bytes to the udata.\n", sz2); + fprintf(stderr, "- Wrote %u bytes to the udata.\n", (int)sz2); } } @@ -250,13 +173,13 @@ static UOption options[]={ UOPTION_DESTDIR, /* 4 */ UOPTION_VERBOSE, /* 5 */ UOPTION_PACKAGE_NAME, /* 6 */ - UOPTION_DEF( "touchfile", 't', UOPT_NO_ARG) /* 7 */ + UOPTION_DEF( "touchfile", 't', UOPT_NO_ARG) /* 7 */ }; int main(int argc, char* argv[]) { - UConverterSharedData* mySharedData = NULL; - UErrorCode err = U_ZERO_ERROR; + ConvData data; + UErrorCode err = U_ZERO_ERROR, localError; char outFileName[UCNV_MAX_FULL_FILE_NAME_LENGTH]; char touchFileName[UCNV_MAX_FULL_FILE_NAME_LENGTH]; const char* destdir, *arg; @@ -266,6 +189,9 @@ int main(int argc, char* argv[]) char cnvName[UCNV_MAX_FULL_FILE_NAME_LENGTH]; char cnvNameWithPkg[UCNV_MAX_FULL_FILE_NAME_LENGTH]; UVersionInfo icuVersion; + UBool printFilename; + + err = U_ZERO_ERROR; U_MAIN_INIT_ARGS(argc, argv); @@ -316,9 +242,7 @@ int main(int argc, char* argv[]) if(!options[6].doesOccur) { - fprintf(stderr, "%s : option -p (package name) is required.\n", - argv[0]); - exit(1); + pkgName=NULL; } else { @@ -370,140 +294,150 @@ int main(int argc, char* argv[]) } #endif - for (++argv; --argc; ++argv) + err = U_ZERO_ERROR; + printFilename = (UBool) (argc > 2 || VERBOSE); + for (++argv; --argc; ++argv) { - err = U_ZERO_ERROR; - arg = getLongPathname(*argv); + arg = getLongPathname(*argv); - /*produces the right destination path for display*/ - if (destdirlen != 0) + /*produces the right destination path for display*/ + if (destdirlen != 0) { - const char *basename; - - /* find the last file sepator */ - basename = uprv_strrchr(arg, U_FILE_SEP_CHAR); - if (basename == NULL) { - basename = arg; - } else { - ++basename; - } + const char *basename; - uprv_strcpy(outBasename, basename); + /* find the last file sepator */ + basename = findBasename(arg); + uprv_strcpy(outBasename, basename); } - else + else { - uprv_strcpy(outFileName, arg); + uprv_strcpy(outFileName, arg); } - /*removes the extension if any is found*/ - dot = uprv_strrchr(outBasename, '.'); - if (dot) + /*removes the extension if any is found*/ + dot = uprv_strrchr(outBasename, '.'); + if (dot) { - *dot = '\0'; + *dot = '\0'; } - /* the basename without extension is the converter name */ - uprv_strcpy(cnvName, outBasename); + /* the basename without extension is the converter name */ + uprv_strcpy(cnvName, outBasename); - if(TOUCHFILE) - { - uprv_strcpy(touchFileName, outBasename); - uprv_strcat(touchFileName, ".cnv"); - } + if(TOUCHFILE) + { + uprv_strcpy(touchFileName, outBasename); + uprv_strcat(touchFileName, ".cnv"); + } - if(pkgName != NULL) - { - /* changes both baename and filename */ - uprv_strcpy(outBasename, pkgName); - uprv_strcat(outBasename, "_"); - uprv_strcat(outBasename, cnvName); - } + if(pkgName != NULL) + { + /* changes both basename and filename */ + uprv_strcpy(outBasename, pkgName); + uprv_strcat(outBasename, "_"); + uprv_strcat(outBasename, cnvName); + } - /*Adds the target extension*/ - uprv_strcat(outBasename, CONVERTER_FILE_EXTENSION); + /*Adds the target extension*/ + uprv_strcat(outBasename, CONVERTER_FILE_EXTENSION); #if DEBUG printf("makeconv: processing %s ...\n", arg); fflush(stdout); #endif - mySharedData = createConverterFromTableFile(arg, &err); + localError = U_ZERO_ERROR; + initConvData(&data); + createConverter(&data, arg, &localError); - if (U_FAILURE(err) || (mySharedData == NULL)) + if (U_FAILURE(localError)) { - /* if an error is found, print out an error msg and keep going */ - fprintf(stderr, "Error creating converter for \"%s\" file for \"%s\" (error code %d - %s)\n", outFileName, arg, err, - u_errorName(err)); - err = U_ZERO_ERROR; + /* if an error is found, print out an error msg and keep going */ + fprintf(stderr, "Error creating converter for \"%s\" file for \"%s\" (%s)\n", outFileName, arg, + u_errorName(localError)); + if(U_SUCCESS(err)) { + err = localError; + } } - else + else { - /* Make the static data name equal to the file name */ - if( /*VERBOSE && */ uprv_stricmp(cnvName,mySharedData->staticData->name)) - { - fprintf(stderr, "Warning: %s%s claims to be '%s'\n", + /* Make the static data name equal to the file name */ + if( /*VERBOSE && */ uprv_stricmp(cnvName,data.staticData.name)) + { + fprintf(stderr, "Warning: %s%s claims to be '%s'\n", cnvName, CONVERTER_FILE_EXTENSION, - mySharedData->staticData->name); - } - - uprv_strcpy((char*)mySharedData->staticData->name, cnvName); - - if(pkgName == NULL) - { - uprv_strcpy(cnvNameWithPkg, cnvName); - } - else - { - uprv_strcpy(cnvNameWithPkg, pkgName); - uprv_strcat(cnvNameWithPkg, "_"); - uprv_strcat(cnvNameWithPkg, cnvName); - } - - writeConverterData(mySharedData, cnvNameWithPkg, destdir, &err); - ((NewConverter *)mySharedData->table)->close((NewConverter *)mySharedData->table); - if(TOUCHFILE) - { - FileStream *q; - char msg[1024]; - - sprintf(msg, "This empty file tells nmake that %s in package %s has been updated.\n", - cnvName, pkgName); - - q = T_FileStream_open(touchFileName, "w"); - if(q == NULL) - { - fprintf(stderr, "Error writing touchfile \"%s\"\n", touchFileName); - err = U_FILE_ACCESS_ERROR; - } - - else - { - T_FileStream_write(q, msg, uprv_strlen(msg)); - T_FileStream_close(q); - } - } - - /* write the information data */ - uprv_free((UConverterStaticData *)mySharedData->staticData); - uprv_free(mySharedData); - - if(U_FAILURE(err)) - { - /* if an error is found, print out an error msg and keep going*/ - fprintf(stderr, "Error writing \"%s\" file for \"%s\" (error code %d - %s)\n", outFileName, arg, err, - u_errorName(err)); - } - else - { - puts(outFileName); - } + data.staticData.name); + } + + uprv_strcpy((char*)data.staticData.name, cnvName); + + if(!uprv_isInvariantString((char*)data.staticData.name, -1)) { + fprintf(stderr, + "Error: A converter name must contain only invariant characters.\n" + "%s is not a valid converter name.\n", + data.staticData.name); + if(U_SUCCESS(err)) { + err = U_INVALID_TABLE_FORMAT; + } + } + + if(pkgName == NULL) + { + uprv_strcpy(cnvNameWithPkg, cnvName); + } + else + { + uprv_strcpy(cnvNameWithPkg, pkgName); + uprv_strcat(cnvNameWithPkg, "_"); + uprv_strcat(cnvNameWithPkg, cnvName); + } + + localError = U_ZERO_ERROR; + writeConverterData(&data, cnvNameWithPkg, destdir, &localError); + if(TOUCHFILE) + { + FileStream *q; + char msg[1024]; + + sprintf(msg, "This empty file tells nmake that %s in package %s has been updated.\n", + cnvName, pkgName); + + q = T_FileStream_open(touchFileName, "w"); + if(q == NULL) + { + fprintf(stderr, "Error writing touchfile \"%s\"\n", touchFileName); + localError = U_FILE_ACCESS_ERROR; + } + + else + { + T_FileStream_write(q, msg, (int32_t)uprv_strlen(msg)); + T_FileStream_close(q); + } + } + + if(U_FAILURE(localError)) + { + /* if an error is found, print out an error msg and keep going*/ + fprintf(stderr, "Error writing \"%s\" file for \"%s\" (%s)\n", outFileName, arg, + u_errorName(localError)); + if(U_SUCCESS(err)) { + err = localError; + } + } + else if (printFilename) + { + puts(outFileName); + } } - fflush(stdout); - fflush(stderr); + fflush(stdout); + fflush(stderr); + + cleanupConvData(&data); } - return err; + return err; } static void @@ -524,517 +458,368 @@ getPlatformAndCCSIDFromName(const char *name, int8_t *pPlatform, int32_t *pCCSID } } -/*Reads the header of the table file and fills in basic knowledge about the converter in "converter"*/ -void readHeaderFromFile(UConverterSharedData* mySharedData, - FileStream* convFile, - const char* converterName, - UErrorCode *pErrorCode) -{ +static void +readHeader(ConvData *data, + FileStream* convFile, + const char* converterName, + UErrorCode *pErrorCode) { char line[200]; - char *s, *end, *key, *value; + char *s, *key, *value; + const UConverterStaticData *prototype; UConverterStaticData *staticData; - char c; if(U_FAILURE(*pErrorCode)) { return; } - staticData=(UConverterStaticData *)mySharedData->staticData; - staticData->conversionType=UCNV_UNSUPPORTED_CONVERTER; + staticData=&data->staticData; staticData->platform=UCNV_IBM; staticData->subCharLen=0; while(T_FileStream_readLine(convFile, line, sizeof(line))) { - /* remove comments and trailing CR and LF and remove whitespace from the end */ - for(end=line; (c=*end)!=0; ++end) { - if(c=='#' || c=='\r' || c=='\n') { - break; - } - } - while(end>line && (*(end-1)==' ' || *(end-1)=='\t')) { - --end; - } - *end=0; - - /* skip leading white space and ignore empty lines */ - s=(char *)skipWhitespace(line); - if(*s==0) { + /* basic parsing and handling of state-related items */ + if(ucm_parseHeaderLine(data->ucm, line, &key, &value)) { continue; } /* stop at the beginning of the mapping section */ - if(uprv_memcmp(s, "CHARMAP", 7)==0) { + if(uprv_strcmp(line, "CHARMAP")==0) { break; } - /* get the key name, bracketed in <> */ - if(*s!='<') { - fprintf(stderr, "error: no header field in line \"%s\"\n", line); - *pErrorCode=U_INVALID_TABLE_FORMAT; - return; - } - key=++s; - while(*s!='>') { - if(*s==0) { - fprintf(stderr, "error: incomplete header field in line \"%s\"\n", line); - *pErrorCode=U_INVALID_TABLE_FORMAT; - return; - } - ++s; - } - *s=0; - - /* get the value string, possibly quoted */ - s=(char *)skipWhitespace(s+1); - if(*s!='"') { - value=s; - } else { - /* remove the quotes */ - value=s+1; - if(end>value && *(end-1)=='"') { - *--end=0; - } - } - /* collect the information from the header field, ignore unknown keys */ if(uprv_strcmp(key, "code_set_name")==0) { if(*value!=0) { - uprv_strcpy((char*)staticData->name, value); + uprv_strcpy((char *)staticData->name, value); getPlatformAndCCSIDFromName(value, &staticData->platform, &staticData->codepage); } - } else if(uprv_strcmp(key, "uconv_class")==0) { - const UConverterStaticData *prototype; - - if(uprv_strcmp(value, "DBCS")==0) { - staticData->conversionType=UCNV_DBCS; - } else if(uprv_strcmp(value, "SBCS")==0) { - staticData->conversionType = UCNV_SBCS; - } else if(uprv_strcmp(value, "MBCS")==0) { - staticData->conversionType = UCNV_MBCS; - } else if(uprv_strcmp(value, "EBCDIC_STATEFUL")==0) { - staticData->conversionType = UCNV_EBCDIC_STATEFUL; - } else { - fprintf(stderr, "error: unknown %s\n", value); - *pErrorCode=U_INVALID_TABLE_FORMAT; - return; - } - - /* Now that we know the type, copy any 'default' values from the table. */ - prototype=ucnv_converterStaticData[staticData->conversionType]; - if(prototype!=NULL) { - if(staticData->name[0]==0) { - uprv_strcpy((char*)staticData->name, prototype->name); - } - - if(staticData->codepage==0) { - staticData->codepage = prototype->codepage; - } - - if(staticData->platform==0) { - staticData->platform = prototype->platform; - } - - if(staticData->minBytesPerChar==0) { - staticData->minBytesPerChar = prototype->minBytesPerChar; - } - - if(staticData->maxBytesPerChar==0) { - staticData->maxBytesPerChar = prototype->maxBytesPerChar; - } - - if(staticData->subCharLen==0) { - staticData->subCharLen=prototype->subCharLen; - if(prototype->subCharLen>0) { - uprv_memcpy(staticData->subChar, prototype->subChar, prototype->subCharLen); - } - } - } - } else if(uprv_strcmp(key, "mb_cur_max")==0) { - if('1'<=*value && *value<='4' && value[1]==0) { - staticData->maxBytesPerChar=(int8_t)(*value-'0'); - } else { - fprintf(stderr, "error: illegal %s\n", value); - *pErrorCode=U_INVALID_TABLE_FORMAT; - return; - } - } else if(uprv_strcmp(key, "mb_cur_min")==0) { - if('1'<=*value && *value<='4' && value[1]==0) { - staticData->minBytesPerChar=(int8_t)(*value-'0'); - } else { - fprintf(stderr, "error: illegal %s\n", value); - *pErrorCode=U_INVALID_TABLE_FORMAT; - return; - } } else if(uprv_strcmp(key, "subchar")==0) { - uint32_t bytes; - int32_t length; - - length=parseCodepageBytes(value, &bytes, (const char **)&end); - if(length>0 && *end==0) { - staticData->subCharLen=(int8_t)length; - do { - staticData->subChar[--length]=(uint8_t)bytes; - bytes>>=8; - } while(length>0); + uint8_t bytes[UCNV_EXT_MAX_BYTES]; + int8_t length; + + s=value; + length=ucm_parseBytes(bytes, line, (const char **)&s); + if(1<=length && length<=4 && *s==0) { + staticData->subCharLen=length; + uprv_memcpy(staticData->subChar, bytes, length); } else { fprintf(stderr, "error: illegal %s\n", value); *pErrorCode=U_INVALID_TABLE_FORMAT; return; } } else if(uprv_strcmp(key, "subchar1")==0) { - uint32_t bytes; + uint8_t bytes[UCNV_EXT_MAX_BYTES]; - if(1==parseCodepageBytes(value, &bytes, (const char **)&end) && *end==0) { - staticData->subChar1=(uint8_t)bytes; + s=value; + if(1==ucm_parseBytes(bytes, line, (const char **)&s) && *s==0) { + staticData->subChar1=bytes[0]; } else { fprintf(stderr, "error: illegal %s\n", value); *pErrorCode=U_INVALID_TABLE_FORMAT; return; } - } else if(uprv_strcmp(key, "icu:state")==0) { - /* if an SBCS/DBCS/EBCDIC_STATEFUL converter has icu:state, then turn it into MBCS */ - switch(staticData->conversionType) { - case UCNV_SBCS: - case UCNV_DBCS: - case UCNV_EBCDIC_STATEFUL: - staticData->conversionType = UCNV_MBCS; - break; - case UCNV_MBCS: - break; - default: - fprintf(stderr, "error: entry for non-MBCS table or before the line\n"); - *pErrorCode=U_INVALID_TABLE_FORMAT; - return; + } + } + + /* copy values from the UCMFile to the static data */ + staticData->maxBytesPerChar=(int8_t)data->ucm->states.maxCharLength; + staticData->minBytesPerChar=(int8_t)data->ucm->states.minCharLength; + staticData->conversionType=data->ucm->states.conversionType; + + if(staticData->conversionType==UCNV_UNSUPPORTED_CONVERTER) { + fprintf(stderr, "ucm error: missing conversion type ()\n"); + *pErrorCode=U_INVALID_TABLE_FORMAT; + return; + } + + /* + * Now that we know the type, copy any 'default' values from the table. + * We need not check the type any further because the parser only + * recognizes what we have prototypes for. + * + * For delta (extension-only) tables, copy values from the base file + * instead, see createConverter(). + */ + if(data->ucm->baseName[0]==0) { + prototype=ucnv_converterStaticData[staticData->conversionType]; + if(prototype!=NULL) { + if(staticData->name[0]==0) { + uprv_strcpy((char *)staticData->name, prototype->name); + } + + if(staticData->codepage==0) { + staticData->codepage=prototype->codepage; + } + + if(staticData->platform==0) { + staticData->platform=prototype->platform; + } + + if(staticData->minBytesPerChar==0) { + staticData->minBytesPerChar=prototype->minBytesPerChar; } if(staticData->maxBytesPerChar==0) { - fprintf(stderr, "error: before the line\n"); - *pErrorCode=U_INVALID_TABLE_FORMAT; - return; + staticData->maxBytesPerChar=prototype->maxBytesPerChar; } - if(mySharedData->table==NULL) { - mySharedData->table=(UConverterTable *)MBCSOpen(staticData->maxBytesPerChar); - if(mySharedData->table==NULL) { - *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - return; + + if(staticData->subCharLen==0) { + staticData->subCharLen=prototype->subCharLen; + if(prototype->subCharLen>0) { + uprv_memcpy(staticData->subChar, prototype->subChar, prototype->subCharLen); } } - if(!MBCSAddState((NewConverter *)mySharedData->table, value)) { - *pErrorCode=U_INVALID_TABLE_FORMAT; - return; - } } } - if(staticData->conversionType==UCNV_UNSUPPORTED_CONVERTER) { - *pErrorCode=U_INVALID_TABLE_FORMAT; - } else if(staticData->conversionType==UCNV_MBCS && mySharedData->table==NULL) { - fprintf(stderr, "error: missing state table information () for MBCS\n"); - *pErrorCode=U_INVALID_TABLE_FORMAT; - } else if(staticData->subChar1!=0 && - !staticData->conversionType==UCNV_MBCS && - !staticData->conversionType==UCNV_EBCDIC_STATEFUL + if(data->ucm->states.outputType<0) { + data->ucm->states.outputType=(int8_t)data->ucm->states.maxCharLength-1; + } + + if( staticData->subChar1!=0 && + (staticData->minBytesPerChar>1 || + (staticData->conversionType!=UCNV_MBCS && + staticData->conversionType!=UCNV_EBCDIC_STATEFUL)) ) { fprintf(stderr, "error: defined for a type other than MBCS or EBCDIC_STATEFUL\n"); *pErrorCode=U_INVALID_TABLE_FORMAT; } } -void loadTableFromFile(FileStream* convFile, UConverterSharedData* sharedData, UErrorCode* err) -{ - char storageLine[200]; - char* line = NULL; - UConverterStaticData *staticData=(UConverterStaticData *)sharedData->staticData; - NewConverter *cnvData = (NewConverter *)sharedData->table; - UChar32 unicodeValue, codepageValue; - uint8_t mbcsBytes[8]; - int32_t mbcsLength; - char codepointBytes[20]; - UBool isOK = TRUE; - uint8_t precisionMask = 0, unicodeMask = 0; - char endOfLine; - - if(cnvData->startMappings!=NULL) - { - if(!cnvData->startMappings(cnvData)) { - *err = U_INVALID_TABLE_FORMAT; - return; - } - } +/* return TRUE if a base table was read, FALSE for an extension table */ +static UBool +readFile(ConvData *data, const char* converterName, + UErrorCode *pErrorCode) { + char line[200]; + char *end; + FileStream *convFile; - if(cnvData->isValid!=NULL) - { - const uint8_t *p = staticData->subChar; - codepageValue = 0; - switch(staticData->subCharLen) { - case 4: codepageValue = (codepageValue << 8) | *p++; - case 3: codepageValue = (codepageValue << 8) | *p++; - case 2: codepageValue = (codepageValue << 8) | *p++; - case 1: codepageValue = (codepageValue << 8) | *p; - default: break; /* must never occur */ - } - if(!cnvData->isValid(cnvData, staticData->subChar, staticData->subCharLen, codepageValue)) { - fprintf(stderr, " the substitution character byte sequence is illegal in this codepage structure!\n"); - *err = U_INVALID_TABLE_FORMAT; - isOK = FALSE; - } - } + UCMStates *baseStates; + UBool dataIsBase; - staticData->hasFromUnicodeFallback = staticData->hasToUnicodeFallback = FALSE; + if(U_FAILURE(*pErrorCode)) { + return FALSE; + } - while (T_FileStream_readLine(convFile, storageLine, sizeof(storageLine))) - { - removeComments(storageLine); - line = storageLine; - if (line[nextTokenOffset(line, NLTC_SEPARATORS)] != '\0') - { - /* get the Unicode code point */ - line = getToken(codepointBytes, line, UNICODE_CODEPOINT_SEPARATORS); - if (uprv_strcmp(codepointBytes, "END") == 0) - { - break; - } - unicodeValue = (UChar32)T_CString_stringToInteger(codepointBytes, 16); + data->ucm=ucm_open(); - /* get the codepage bytes */ - codepageValue = 0; - mbcsLength = 0; - do - { - line = getToken(codepointBytes, line, CODEPOINT_SEPARATORS); - mbcsBytes[mbcsLength] = (uint8_t)T_CString_stringToInteger(codepointBytes, 16); - codepageValue = codepageValue << 8 | mbcsBytes[mbcsLength++]; - - /* End of line could be \0 or | (if fallback) */ - endOfLine= line[nextTokenOffset(line, CODEPOINT_SEPARATORS)]; - } while((endOfLine != '\0') && (endOfLine != FALLBACK_SEPARATOR)); - - if(unicodeValue>=0x10000) { - unicodeMask|=UCNV_HAS_SUPPLEMENTARY; /* there are supplementary code points */ - } else if(UTF_IS_SURROGATE(unicodeValue)) { - unicodeMask|=UCNV_HAS_SURROGATES; /* there are single surrogates */ - } + convFile=T_FileStream_open(converterName, "r"); + if(convFile==NULL) { + *pErrorCode=U_FILE_ACCESS_ERROR; + return FALSE; + } - if((uint32_t)unicodeValue > 0x10ffff) - { - fprintf(stderr, "error: Unicode code point > U+10ffff in '%s'\n", storageLine); - isOK = FALSE; - } - else if(endOfLine == FALLBACK_SEPARATOR) - { - /* we know that there is a fallback separator */ - precisionMask |= 1; - line = uprv_strchr(line, FALLBACK_SEPARATOR) + 1; - switch(*line) - { - case '0': - /* set roundtrip mappings */ - isOK &= cnvData->addToUnicode(cnvData, mbcsBytes, mbcsLength, unicodeValue, codepageValue, 0) && - cnvData->addFromUnicode(cnvData, mbcsBytes, mbcsLength, unicodeValue, codepageValue, 0); - break; - case '1': - /* set only a fallback mapping from Unicode to codepage */ - staticData->hasFromUnicodeFallback = TRUE; - isOK &= cnvData->addFromUnicode(cnvData, mbcsBytes, mbcsLength, unicodeValue, codepageValue, 1); - break; - case '2': - /* skip subchar mappings */ - break; - case '3': - /* set only a fallback mapping from codepage to Unicode */ - staticData->hasToUnicodeFallback = TRUE; - isOK &= cnvData->addToUnicode(cnvData, mbcsBytes, mbcsLength, unicodeValue, codepageValue, 1); - break; - default: - fprintf(stderr, "error: illegal fallback indicator '%s' in '%s'\n", line - 1, storageLine); - *err = U_INVALID_TABLE_FORMAT; - break; - } - } - else - { - precisionMask |= 2; - /* set the mappings */ - isOK &= cnvData->addToUnicode(cnvData, mbcsBytes, mbcsLength, unicodeValue, codepageValue, -1) && - cnvData->addFromUnicode(cnvData, mbcsBytes, mbcsLength, unicodeValue, codepageValue, -1); - } - } + readHeader(data, convFile, converterName, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return FALSE; } - if(unicodeMask == 3) - { - fprintf(stderr, "warning: contains mappings to both supplementary code points and single surrogates\n"); + if(data->ucm->baseName[0]==0) { + dataIsBase=TRUE; + baseStates=&data->ucm->states; + ucm_processStates(baseStates); + } else { + dataIsBase=FALSE; + baseStates=NULL; } - staticData->unicodeMask = unicodeMask; - if(cnvData->finishMappings!=NULL) - { - cnvData->finishMappings(cnvData, staticData); + /* read the base table */ + ucm_readTable(data->ucm, convFile, dataIsBase, baseStates, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return FALSE; } - if(!isOK) - { - *err = U_INVALID_TABLE_FORMAT; + /* read an extension table if there is one */ + while(T_FileStream_readLine(convFile, line, sizeof(line))) { + end=uprv_strchr(line, 0); + while(lineucm, convFile, FALSE, baseStates, pErrorCode); + } else { + fprintf(stderr, "unexpected text after the base mapping table\n"); + } + break; } - else if(precisionMask == 3) - { + + T_FileStream_close(convFile); + + if(data->ucm->base->flagsType==UCM_FLAGS_MIXED || data->ucm->ext->flagsType==UCM_FLAGS_MIXED) { fprintf(stderr, "error: some entries have the mapping precision (with '|'), some do not\n"); - *err = U_INVALID_TABLE_FORMAT; + *pErrorCode=U_INVALID_TABLE_FORMAT; } + + return dataIsBase; } -/*creates a UConverterStaticData, fills in necessary links to it the appropriate function pointers*/ -UConverterSharedData* createConverterFromTableFile(const char* converterName, UErrorCode* err) -{ - FileStream* convFile = NULL; - UConverterSharedData* mySharedData = NULL; - UConverterStaticData* myStaticData = NULL; +static void +createConverter(ConvData *data, const char *converterName, UErrorCode *pErrorCode) { + ConvData baseData; + UBool dataIsBase; - if (U_FAILURE(*err)) return NULL; + UConverterStaticData *staticData; + UCMStates *states, *baseStates; - convFile = T_FileStream_open(converterName, "r"); - if (convFile == NULL) - { - *err = U_FILE_ACCESS_ERROR; - return NULL; + if(U_FAILURE(*pErrorCode)) { + return; } + initConvData(data); - mySharedData = (UConverterSharedData*) uprv_malloc(sizeof(UConverterSharedData)); - if (mySharedData == NULL) - { - *err = U_MEMORY_ALLOCATION_ERROR; - T_FileStream_close(convFile); - return NULL; + dataIsBase=readFile(data, converterName, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return; } - uprv_memset(mySharedData, 0, sizeof(UConverterSharedData)); - - mySharedData->structSize = sizeof(UConverterSharedData); + staticData=&data->staticData; + states=&data->ucm->states; - myStaticData = (UConverterStaticData*) uprv_malloc(sizeof(UConverterStaticData)); - if (myStaticData == NULL) - { - *err = U_MEMORY_ALLOCATION_ERROR; - T_FileStream_close(convFile); - return NULL; - } - uprv_memset(myStaticData, 0, sizeof(UConverterStaticData)); - mySharedData->staticData = myStaticData; - myStaticData->structSize = sizeof(UConverterStaticData); - /* mySharedData->staticDataOwned = FALSE; */ /* not owned if in udata */ - mySharedData->sharedDataCached = FALSE; + if(dataIsBase) { + data->cnvData=MBCSOpen(data->ucm); + if(data->cnvData==NULL) { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - mySharedData->dataMemory = NULL; /* for init */ + } else if(!data->cnvData->isValid(data->cnvData, + staticData->subChar, staticData->subCharLen) + ) { + fprintf(stderr, " the substitution character byte sequence is illegal in this codepage structure!\n"); + *pErrorCode=U_INVALID_TABLE_FORMAT; - readHeaderFromFile(mySharedData, convFile, converterName, err); + } else if(staticData->subChar1!=0 && + !data->cnvData->isValid(data->cnvData, &staticData->subChar1, 1) + ) { + fprintf(stderr, " the subchar1 byte is illegal in this codepage structure!\n"); + *pErrorCode=U_INVALID_TABLE_FORMAT; - if (U_FAILURE(*err)) return NULL; + } else if(data->ucm->ext->mappingsLength>0) { + /* prepare the extension table, if there is one */ + data->extData=CnvExtOpen(data->ucm); + if(data->extData==NULL) { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - switch (myStaticData->conversionType) - { - case UCNV_SBCS: - { - /* SBCS: use MBCS data structure with a default state table */ - if(mySharedData->staticData->maxBytesPerChar!=1) { - fprintf(stderr, "error: SBCS codepage with max bytes/char!=1\n"); - *err = U_INVALID_TABLE_FORMAT; - break; - } - myStaticData->conversionType = UCNV_MBCS; - if(mySharedData->table == NULL) { - NewConverter *sharedDataTable = MBCSOpen(1); - if(sharedDataTable != NULL) { - if(!MBCSAddState(sharedDataTable, "0-ff")) { - *err = U_INVALID_TABLE_FORMAT; - sharedDataTable->close(sharedDataTable); - } else { - mySharedData->table = (UConverterTable *)sharedDataTable; - } - } else { - *err = U_MEMORY_ALLOCATION_ERROR; + } else if( + !ucm_checkBaseExt(states, data->ucm->base, data->ucm->ext, data->ucm->ext, FALSE) || + !data->extData->addTable(data->extData, data->ucm->ext, &data->staticData) + ) { + *pErrorCode=U_INVALID_TABLE_FORMAT; } } - break; - } - case UCNV_MBCS: - { - /* MBCSOpen() was called by readHeaderFromFile() */ - break; - } - case UCNV_EBCDIC_STATEFUL: - { - /* EBCDIC_STATEFUL: use MBCS data structure with a default state table */ - if(mySharedData->staticData->maxBytesPerChar!=2) { - fprintf(stderr, "error: DBCS codepage with max bytes/char!=2\n"); - *err = U_INVALID_TABLE_FORMAT; - break; + + /* add the base table after ucm_checkBaseExt()! */ + if( U_SUCCESS(*pErrorCode) && + !data->cnvData->addTable(data->cnvData, data->ucm->base, &data->staticData) + ) { + *pErrorCode=U_INVALID_TABLE_FORMAT; } - myStaticData->conversionType = UCNV_MBCS; - if(mySharedData->table == NULL) { - NewConverter *sharedDataTable = MBCSOpen(2); - if(sharedDataTable != NULL) { - if( !MBCSAddState(sharedDataTable, "0-ff, e:1.s, f:0.s") || - !MBCSAddState(sharedDataTable, "initial, 0-3f:4, e:1.s, f:0.s, 40:3, 41-fe:2, ff:4") || - !MBCSAddState(sharedDataTable, "0-40:1.i, 41-fe:1., ff:1.i") || - !MBCSAddState(sharedDataTable, "0-ff:1.i, 40:1.") || - !MBCSAddState(sharedDataTable, "0-ff:1.i") + } else { + char baseFilename[500]; + char *basename; + + initConvData(&baseData); + + /* assemble a path/filename for data->ucm->baseName */ + uprv_strcpy(baseFilename, converterName); + basename=(char *)findBasename(baseFilename); + uprv_strcpy(basename, data->ucm->baseName); + uprv_strcat(basename, ".ucm"); + + /* read the base table */ + dataIsBase=readFile(&baseData, baseFilename, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return; + } else if(!dataIsBase) { + fprintf(stderr, "error: the file \"%s\" is not a base table file\n", baseFilename); + *pErrorCode=U_INVALID_TABLE_FORMAT; + } else { + /* prepare the extension table */ + data->extData=CnvExtOpen(data->ucm); + if(data->extData==NULL) { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + + } else { + /* fill in gaps in extension file header fields */ + UCMapping *m, *mLimit; + uint8_t fallbackFlags; + + baseStates=&baseData.ucm->states; + if(states->conversionType==UCNV_DBCS) { + staticData->minBytesPerChar=(int8_t)(states->minCharLength=2); + } else if(states->minCharLength==0) { + staticData->minBytesPerChar=(int8_t)(states->minCharLength=baseStates->minCharLength); + } + if(states->maxCharLengthminCharLength) { + staticData->maxBytesPerChar=(int8_t)(states->maxCharLength=baseStates->maxCharLength); + } + + if(staticData->subCharLen==0) { + uprv_memcpy(staticData->subChar, baseData.staticData.subChar, 4); + staticData->subCharLen=baseData.staticData.subCharLen; + } + /* + * do not copy subChar1 - + * only use what is explicitly specified + * because it cannot be unset in the extension file header + */ + + /* get the fallback flags */ + fallbackFlags=0; + for(m=baseData.ucm->base->mappings, mLimit=m+baseData.ucm->base->mappingsLength; + mclose(sharedDataTable); - } else { - mySharedData->table = (UConverterTable *)sharedDataTable; + if(m->f==1) { + fallbackFlags|=1; + } else if(m->f==3) { + fallbackFlags|=2; + } } - } else { - *err = U_MEMORY_ALLOCATION_ERROR; - } - } - break; - } - case UCNV_DBCS: - { - /* DBCS: use MBCS data structure with a default state table */ - if(mySharedData->staticData->maxBytesPerChar!=2) { - fprintf(stderr, "error: DBCS codepage with max bytes/char!=2\n"); - *err = U_INVALID_TABLE_FORMAT; - break; - } - myStaticData->conversionType = UCNV_MBCS; - if(mySharedData->table == NULL) { - NewConverter *sharedDataTable = MBCSOpen(2); - if(sharedDataTable != NULL) { - if( !MBCSAddState(sharedDataTable, "0-3f:3, 40:2, 41-fe:1, ff:3") || - !MBCSAddState(sharedDataTable, "41-fe") || - !MBCSAddState(sharedDataTable, "40") || - !MBCSAddState(sharedDataTable, "") + for(m=data->ucm->base->mappings, mLimit=m+data->ucm->base->mappingsLength; + mclose(sharedDataTable); - } else { - mySharedData->table = (UConverterTable *)sharedDataTable; + if(m->f==1) { + fallbackFlags|=1; + } else if(m->f==3) { + fallbackFlags|=2; + } } - } else { - *err = U_MEMORY_ALLOCATION_ERROR; - } - } - break; - } - default : - fprintf(stderr, "error: omitted\n"); - *err = U_INVALID_TABLE_FORMAT; - mySharedData->table = NULL; - break; - }; + if(fallbackFlags&1) { + staticData->hasFromUnicodeFallback=TRUE; + } + if(fallbackFlags&2) { + staticData->hasToUnicodeFallback=TRUE; + } - if(U_SUCCESS(*err) && mySharedData->table != NULL) - { - loadTableFromFile(convFile, mySharedData, err); - } + if(1!=ucm_countChars(baseStates, staticData->subChar, staticData->subCharLen)) { + fprintf(stderr, " the substitution character byte sequence is illegal in this codepage structure!\n"); + *pErrorCode=U_INVALID_TABLE_FORMAT; - T_FileStream_close(convFile); + } else if(1!=ucm_countChars(baseStates, &staticData->subChar1, 1)) { + fprintf(stderr, " the subchar1 byte is illegal in this codepage structure!\n"); + *pErrorCode=U_INVALID_TABLE_FORMAT; - return mySharedData; + } else if( + !ucm_checkValidity(data->ucm->ext, baseStates) || + !ucm_checkBaseExt(baseStates, baseData.ucm->base, data->ucm->ext, data->ucm->ext, FALSE) || + !data->extData->addTable(data->extData, data->ucm->ext, &data->staticData) + ) { + *pErrorCode=U_INVALID_TABLE_FORMAT; + } + } + } + + cleanupConvData(&baseData); + } } /* diff --git a/icuSources/tools/makeconv/makeconv.dsp b/icuSources/tools/makeconv/makeconv.dsp index c1506d20..7ac61a5f 100644 --- a/icuSources/tools/makeconv/makeconv.dsp +++ b/icuSources/tools/makeconv/makeconv.dsp @@ -115,7 +115,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\..\include" /I "..\..\..\source\common" /I "..\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\..\include" /I "..\..\..\source\common" /I "..\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -150,7 +150,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\..\include" /I "..\..\..\source\common" /I "..\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\..\include" /I "..\..\..\source\common" /I "..\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe @@ -183,6 +183,10 @@ SOURCE="$(InputPath)" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File +SOURCE=.\gencnvex.c +# End Source File +# Begin Source File + SOURCE=.\genmbcs.c # End Source File # Begin Source File diff --git a/icuSources/tools/makeconv/makeconv.h b/icuSources/tools/makeconv/makeconv.h index cb4825b3..bb6c5004 100644 --- a/icuSources/tools/makeconv/makeconv.h +++ b/icuSources/tools/makeconv/makeconv.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2000-2001, International Business Machines +* Copyright (C) 2000-2003, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -20,10 +20,19 @@ #include "unicode/utypes.h" #include "ucnv_bld.h" #include "unewdata.h" +#include "ucm.h" /* exports from makeconv.c */ U_CFUNC UBool VERBOSE; +/* converter table type for writing */ +enum { + TABLE_NONE, + TABLE_BASE, + TABLE_EXT, + TABLE_BASE_AND_EXT +}; + /* abstract converter generator struct, C++ - style */ struct NewConverter; typedef struct NewConverter NewConverter; @@ -32,32 +41,17 @@ struct NewConverter { void (*close)(NewConverter *cnvData); - UBool - (*startMappings)(NewConverter *cnvData); - /** is this byte sequence valid? */ UBool (*isValid)(NewConverter *cnvData, - const uint8_t *bytes, int32_t length, - uint32_t b); + const uint8_t *bytes, int32_t length); UBool - (*addToUnicode)(NewConverter *cnvData, - const uint8_t *bytes, int32_t length, - UChar32 c, uint32_t b, - int8_t isFallback); - - UBool - (*addFromUnicode)(NewConverter *cnvData, - const uint8_t *bytes, int32_t length, - UChar32 c, uint32_t b, - int8_t isFallback); - - void - (*finishMappings)(NewConverter *cnvData, const UConverterStaticData *staticData); + (*addTable)(NewConverter *cnvData, UCMTable *table, UConverterStaticData *staticData); uint32_t - (*write)(NewConverter *cnvData, const UConverterStaticData *staticData, UNewDataMemory *pData); + (*write)(NewConverter *cnvData, const UConverterStaticData *staticData, + UNewDataMemory *pData, int32_t tableType); }; #endif diff --git a/icuSources/tools/makeconv/makeconv.vcproj b/icuSources/tools/makeconv/makeconv.vcproj index 393cf361..614528a6 100644 --- a/icuSources/tools/makeconv/makeconv.vcproj +++ b/icuSources/tools/makeconv/makeconv.vcproj @@ -1,7 +1,7 @@ - + @@ -39,17 +39,14 @@ CompileAs="0"/> + Outputs="..\..\..\bin\$(TargetFileName)"/> @@ -68,8 +65,14 @@ Culture="1033"/> + + + + Outputs="..\..\..\bin\$(TargetFileName)"/> + + + + + + + diff --git a/icuSources/tools/makeconv/readme.htm b/icuSources/tools/makeconv/readme.htm deleted file mode 100644 index 99223da9..00000000 --- a/icuSources/tools/makeconv/readme.htm +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - -ReadMe: Character Set Conversion Tool for Unicode - - - - -

    ReadMe: The Character Set Conversion Tool -for Unicode

    - -

    Version: 10/01/98
    -

    - -
    - -

    COPYRIGHT:
    -(C) Copyright International Business Machines Corporation, 1998
    -Licensed Material - Program-Property of IBM - All Rights -Reserved.
    -US Government Users Restricted Rights - Use, duplication, or -disclosure restricted by GSA ADP Schedule Contract with IBM Corp. -
    -

    - -
    - -

    Introduction

    - -

    makeconv is a tool that converts character set -conversion data into binary files for use by the UnicodeConverter -C code. The UnicodeConverter code will not function with text -format data files. The user of charset conversion library will -need to convert all the data files in text format into binary -format.

    - -

    For a IBM registered code page to/from Unicode conversion data -file in the specified data path, it generates .cnv files, which -it puts in the same directory. The tool takes a list of file -names as argument, with their absolute or relative path, and will -generate a corresponding ".cnv" file with the same -path. On Unix shells one can easily convert all the -".cnv" files from the text files in the data directory -by using wildcards (e.g. makeconv ../../data/locales/*.ucm). -On Win32 we have provided a batch file "mkcnvfle.bat" -in the same directory you will find makeconv.c. mkcnvfle -converts all the ".ucm" files in intlwork/data/locales -to ".cnv" files. It requires one argument : Debug or -Release so it knows where to look for the makeconv.exe.
    -(Win32 usage: \intlwork\tools\makeconv\mkcnvfle.bat Debug -for debug build, \intlwork\tools\makeconv\mkcnvfle.bat Release, -otherwise.)

    - -
      -
    • Create a binary file for codepage IBM-949 in the data - path "\intlwork\data\locales\": type in at - the command prompt, "makeconv \intlwork\data\locales\ibm-949.ucm". - The generated binary file will be located in the - same directory.
    • -
    • Look for the codepage IBM-949 data file in the current - working directory: type in at the command prompt, - "makeconv ibm-949.ucm". - The tool will try to locate the file "ibm-949.ucm" in the current - directory. The generated binary file, "ibm-949.cnv" will be located - in current working directory.
    • -
    - -

    Building the Tool

    - -

    To build the tool on Win32 environment is very -easy, simply open the "makeconv.dsw" workspace project -file in MSVC++ 5.0 compiler.
    -On Unix the process of building the tool and the ".cnv" -files is included in the build process of the library. The -provided makefiles will
    -attempt to build makeconv as it builds other parts of the -library. It will also convert all the initial ".ucm" -files in data/locales to ".cnv" files.

    - -

    Limitations

    - -

    The tools uses stdio.h functions to communicate success or -failure to the user. Platforms that don't support stdio will have -to adapt
    -that portion of the code.

    - - diff --git a/icuSources/tools/pkgdata/Makefile.in b/icuSources/tools/pkgdata/Makefile.in index 826f496c..a2b3463f 100644 --- a/icuSources/tools/pkgdata/Makefile.in +++ b/icuSources/tools/pkgdata/Makefile.in @@ -1,5 +1,5 @@ ## Makefile.in for ICU - tools/pkgdata -## Copyright (c) 1999-2003, International Business Machines Corporation and +## Copyright (c) 1999-2004, International Business Machines Corporation and ## others. All Rights Reserved. ## Steven R. Loomis @@ -16,28 +16,34 @@ subdir = tools/pkgdata ## +TARGET_STUB_NAME = pkgdata + SECTION = 1 -MANX_FILES = $(TARGET:$(EXEEXT)=).$(SECTION) +MANX_FILES = $(TARGET_STUB_NAME).$(SECTION) ALL_MAN_FILES = $(MANX_FILES) ## Extra files to remove for 'make clean' -CLEANFILES = *~ $(DEPS) $(RES_FILES) $(TEST_FILES) mkmap.tmp $(ALL_MAN_FILES) +CLEANFILES = *~ $(DEPS) $(ALL_MAN_FILES) + +ifneq ($(PKGDATA_DEFS),) +DEFS += $(PKGDATA_DEFS) +endif ## Target information -TARGET = pkgdata$(EXEEXT) +TARGET = $(BINDIR)/$(TARGET_STUB_NAME)$(EXEEXT) CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common -I$(srcdir)/../toolutil DEFS += -DUDATA_SO_SUFFIX=\".$(SO)\" -DSTATIC_O=\"$(STATIC_O)\" LIBS = $(LIBICUTOOLUTIL) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M) -OBJECTS = pkgdata.o pkgtypes.o gmake.o dllmode.o cmnmode.o filemode.o sttcmode.o winmode.o +OBJECTS = pkgdata.o pkgtypes.o make.o dllmode.o cmnmode.o filemode.o sttcmode.o winmode.o DEPS = $(OBJECTS:.o=.d) ## List of phony targets -.PHONY : all all-local install install-local clean clean-local \ +.PHONY : all all-local install install-local clean clean-local \ distclean distclean-local dist dist-local check \ check-local install-man install-manx @@ -52,11 +58,11 @@ distclean : distclean-local dist: dist-local check: all check-local -all-local: $(TARGET) $(RES_FILES) $(TRANSLIT_RES) $(TEST_FILES) $(ALL_MAN_FILES) +all-local: $(TARGET) $(ALL_MAN_FILES) install-local: all-local install-man $(MKINSTALLDIRS) $(DESTDIR)$(bindir) - $(INSTALL) $(TARGET) $(DESTDIR)$(bindir)/$(TARGET) + $(INSTALL) $(TARGET) $(DESTDIR)$(bindir) # man page install-man: install-manx diff --git a/icuSources/tools/pkgdata/cmnmode.c b/icuSources/tools/pkgdata/cmnmode.c index 85ca9ebb..2104e9e7 100644 --- a/icuSources/tools/pkgdata/cmnmode.c +++ b/icuSources/tools/pkgdata/cmnmode.c @@ -1,6 +1,6 @@ /****************************************************************************** * -* Copyright (C) 2000, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -19,6 +19,7 @@ #include #include #include "unicode/utypes.h" +#include "unicode/putil.h" #include "cmemory.h" #include "cstring.h" #include "filestrm.h" @@ -75,8 +76,13 @@ void pkg_mode_common(UPKGOptions *o, FileStream *makefile, UErrorCode *status) sprintf(tmp, "all: $(TARGET)\n\n"); T_FileStream_writeLine(makefile, tmp); + if(!o->embed) { T_FileStream_writeLine(makefile, "$(TARGET): $(CMNLIST) $(DATAFILEPATHS)\n" - "\t$(INVOKE) $(GENCMN) -n $(CNAME) -c -d $(TARGETDIR) 0 $(CMNLIST)\n\n"); + "\t$(INVOKE) $(GENCMN) -n $(CNAME) -c -s $(SRCDIR) -d $(TARGETDIR) 0 $(CMNLIST)\n\n"); + } else { + T_FileStream_writeLine(makefile, "$(TARGET): $(CMNLIST) $(DATAFILEPATHS)\n" + "\t$(INVOKE) $(GENCMN) -n $(CNAME) -c -d $(TARGETDIR) 0 -E $(CMNLIST)\n\n"); + } if(o->hadStdin == FALSE) { /* shortcut */ T_FileStream_writeLine(makefile, "$(CMNLIST): $(LISTFILES)\n" diff --git a/icuSources/tools/pkgdata/dllmode.c b/icuSources/tools/pkgdata/dllmode.c index e7c8e4c6..f3b70432 100644 --- a/icuSources/tools/pkgdata/dllmode.c +++ b/icuSources/tools/pkgdata/dllmode.c @@ -1,6 +1,6 @@ /****************************************************************************** * -* Copyright (C) 2000-2003, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -19,6 +19,9 @@ #include #include #include "unicode/utypes.h" +#include "unicode/putil.h" + +#ifndef U_MAKE_IS_NMAKE #include "cmemory.h" #include "cstring.h" #include "filestrm.h" @@ -39,7 +42,7 @@ void pkg_mode_dll(UPKGOptions *o, FileStream *makefile, UErrorCode *status) return; } - uprv_strcpy(tmp, LIB_PREFIX "$(NAME)" UDATA_SO_SUFFIX); + uprv_strcpy(tmp, LIB_PREFIX "$(LIBNAME)" UDATA_SO_SUFFIX); /* We should be the only item. So we don't care about the order. */ o->outFiles = pkg_appendToList(o->outFiles, &tail, uprv_strdup(tmp)); @@ -58,11 +61,11 @@ void pkg_mode_dll(UPKGOptions *o, FileStream *makefile, UErrorCode *status) /*390port start*/ #ifdef OS390BATCH - if (uprv_strcmp(o->shortName, U_LIBICUDATA_NAME) == 0) + if (uprv_strcmp(o->libName, U_LIBICUDATA_NAME) == 0) sprintf(tmp, "# File to make:\nBATCH_TARGET=\"//'${LOADMOD}(IXMI" U_ICU_VERSION_SHORT "DA)'\"\n\n"); - else if (uprv_strcmp(o->shortName, "testdata") == 0) + else if (uprv_strcmp(o->libName, "testdata") == 0) sprintf(tmp, "# File to make:\nBATCH_TARGET=\"//'${LOADMOD}(IXMI" U_ICU_VERSION_SHORT "TE)'\"\n\n"); - else if (uprv_strcmp(o->shortName, U_LIBICUDATA_NAME"_stub") == 0) + else if (uprv_strcmp(o->libName, U_LIBICUDATA_NAME"_stub") == 0) sprintf(tmp, "# File to make:\nBATCH_TARGET=\"//'${LOADMOD}(IXMI" U_ICU_VERSION_SHORT "D1)'\"\n\n"); T_FileStream_writeLine(makefile, tmp); #endif @@ -101,7 +104,19 @@ void pkg_mode_dll(UPKGOptions *o, FileStream *makefile, UErrorCode *status) T_FileStream_writeLine(makefile, "FINAL_SO_TARGET=$(TARGET)\n"); T_FileStream_writeLine(makefile, "MIDDLE_SO_TARGET=$(TARGET)\n"); } + + T_FileStream_writeLine(makefile, "DYNAMICCPPFLAGS=$(SHAREDLIBCPPFLAGS)\n"); + T_FileStream_writeLine(makefile, "DYNAMICCFLAGS=$(SHAREDLIBCFLAGS)\n"); + T_FileStream_writeLine(makefile, "DYNAMICCXXFLAGS=$(SHAREDLIBCXXFLAGS)\n"); + T_FileStream_writeLine(makefile, "\n"); +#ifdef OS400 + sprintf(tmp, "# Force override for iSeries compilation since data does not need to be\n" + "# nor can excessively large files be compiled for debug\n" + "override COMPILE.c= $(CC) $(DEFS) $(CPPFLAGS) -O4 -c -qTERASPACE=*YES -qSTGMDL=*INHERIT -qPFROPT=*STRDONLY\n\n"); + T_FileStream_writeLine(makefile, tmp); +#endif + uprv_strcpy(tmp, "all: $(TARGETDIR)/$(FINAL_SO_TARGET) $(BATCH_TARGET)"); if (o->version) { uprv_strcat(tmp, " $(TARGETDIR)/$(MIDDLE_SO_TARGET) $(TARGETDIR)/$(SO_TARGET)"); @@ -109,6 +124,13 @@ void pkg_mode_dll(UPKGOptions *o, FileStream *makefile, UErrorCode *status) uprv_strcat(tmp, "\n\n"); T_FileStream_writeLine(makefile, tmp); +#ifdef OS400 + /* New for iSeries: All packaged data in one .c */ + sprintf(tmp, "# Create a file which contains all .c data files/structures\n" + "$(TEMP_DIR)/$(NAME)all.c: $(CMNLIST)\n\n"); + T_FileStream_writeLine(makefile, tmp); +#endif + /* Write compile rules */ pkg_mak_writeObjRules(o, makefile, &objects, OBJ_SUFFIX); @@ -130,32 +152,57 @@ void pkg_mode_dll(UPKGOptions *o, FileStream *makefile, UErrorCode *status) "\tdone;\n\n"); } + pkg_mak_writeAssemblyHeader(makefile, o); + sprintf(tmp,"$(TEMP_DIR)/$(NAME)_dat.o : $(TEMP_DIR)/$(NAME)_dat.c\n" - "\t$(COMPILE.c) -o $@ $<\n\n"); + "\t$(COMPILE.c) $(DYNAMICCPPFLAGS) $(DYNAMICCXXFLAGS) -o $@ $<\n\n"); T_FileStream_writeLine(makefile, tmp); T_FileStream_writeLine(makefile, "# 'TOCOBJ' contains C Table of Contents objects [if any]\n"); - sprintf(tmp, "$(TEMP_DIR)/$(NAME)_dat.c: $(CMNLIST)\n" - "\t$(INVOKE) $(GENCMN) -e $(ENTRYPOINT) -n $(NAME) -S -d $(TEMP_DIR) 0 $(CMNLIST)\n\n"); - + if(!o->embed) { + sprintf(tmp, "$(TEMP_DIR)/$(NAME)_dat.c: $(CMNLIST)\n" + "\t$(INVOKE) $(GENCMN) -e $(ENTRYPOINT) -n $(NAME) -S -s $(SRCDIR) -d $(TEMP_DIR) 0 $(CMNLIST)\n\n"); + } else { + sprintf(tmp, "$(TEMP_DIR)/$(NAME)_dat.c: $(CMNLIST)\n" + "\t$(INVOKE) $(GENCMN) -e $(ENTRYPOINT) -n $(NAME) -S -E -d $(TEMP_DIR) 0 $(CMNLIST)\n\n"); + } + T_FileStream_writeLine(makefile, tmp); sprintf(tmp, "TOCOBJ= $(NAME)_dat%s \n\n", OBJ_SUFFIX); T_FileStream_writeLine(makefile, tmp); + +#ifdef OS400 + /* New for iSeries: All packaged data in one .c */ + sprintf(tmp, "$(TEMP_DIR)/$(NAME)all.o : $(TEMP_DIR)/$(NAME)all.c\n" + "\t$(COMPILE.c) $(DYNAMICCPPFLAGS) $(DYNAMICCXXFLAGS) -o $@ $<\n\n"); + T_FileStream_writeLine(makefile, tmp); + + T_FileStream_writeLine(makefile, "# 'ALLDATAOBJ' contains all .c data structures\n"); + + sprintf(tmp, "ALLDATAOBJ= $(NAME)all%s \n\n", OBJ_SUFFIX); + T_FileStream_writeLine(makefile, tmp); +#endif + sprintf(tmp, "TOCSYM= %s_dat \n\n", o->entryName); /* entrypoint not always shortname! */ T_FileStream_writeLine(makefile, tmp); T_FileStream_writeLine(makefile, "BASE_OBJECTS= $(TOCOBJ) "); - +#ifdef OS400 + T_FileStream_writeLine(makefile, "$(ALLDATAOBJ) "); +#else pkg_writeCharListWrap(makefile, objects, " ", " \\\n",0); +#endif + pkg_mak_writeAssemblyFooter(makefile, o); + T_FileStream_writeLine(makefile, "\n\n"); T_FileStream_writeLine(makefile, "OBJECTS=$(BASE_OBJECTS:%=$(TEMP_DIR)/%)\n\n"); - T_FileStream_writeLine(makefile,"$(TEMP_DIR)/%.o: $(TEMP_DIR)/%.c\n\t $(COMPILE.c) -o $@ $<\n\n"); + T_FileStream_writeLine(makefile,"$(TEMP_DIR)/%.o: $(TEMP_DIR)/%.c\n\t$(COMPILE.c) $(DYNAMICCPPFLAGS) $(DYNAMICCXXFLAGS) -o $@ $<\n\n"); T_FileStream_writeLine(makefile,"build-objs: $(SOURCES) $(OBJECTS)\n\n$(OBJECTS): $(SOURCES)\n\n"); -#ifdef HPUX +#ifdef U_HPUX T_FileStream_writeLine(makefile, "$(TARGETDIR)/$(FINAL_SO_TARGET): $(OBJECTS) $(HPUX_JUNK_OBJ) $(LISTFILES) $(DLL_DEPS)\n" "\t$(SHLIB.cc) -o $@ $(OBJECTS) $(HPUX_JUNK_OBJ) $(DLL_LDFLAGS)\n" "\t-ls -l $@\n\n"); @@ -164,7 +211,7 @@ void pkg_mode_dll(UPKGOptions *o, FileStream *makefile, UErrorCode *status) "\techo \"void to_emit_cxx_stuff_in_the_linker(){}\" >> $(TEMP_DIR)/hpux_junk_obj.cpp\n" "\n" "$(TEMP_DIR)/hpux_junk_obj.o: $(TEMP_DIR)/hpux_junk_obj.cpp\n" - "\t$(COMPILE.cc) -o $@ $<\n" + "\t$(COMPILE.cc) $(DYNAMICCPPFLAGS) $(DYNAMICCXXFLAGS) -o $@ $<\n" "\n"); #else @@ -229,7 +276,7 @@ void pkg_mode_dll(UPKGOptions *o, FileStream *makefile, UErrorCode *status) T_FileStream_writeLine(makefile, "$(NAME).map:\n\techo \"{global: $(TOCSYM); local: *; };\" > $@\n\n"); #endif -#ifdef AIX +#ifdef U_AIX T_FileStream_writeLine(makefile, "$(NAME).map:\n\techo \"$(TOCSYM)\" > $@\n\n"); #endif @@ -238,5 +285,5 @@ void pkg_mode_dll(UPKGOptions *o, FileStream *makefile, UErrorCode *status) } - +#endif /* #ifndef U_MAKE_IS_NMAKE */ diff --git a/icuSources/tools/pkgdata/filemode.c b/icuSources/tools/pkgdata/filemode.c index f8f242fa..0bf94c77 100644 --- a/icuSources/tools/pkgdata/filemode.c +++ b/icuSources/tools/pkgdata/filemode.c @@ -1,6 +1,6 @@ /****************************************************************************** * -* Copyright (C) 2000-2001, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -55,7 +55,7 @@ install: all void pkg_mode_files(UPKGOptions *o, FileStream *makefile, UErrorCode *status) { - char tmp[1024], tmp2[1024]; + char tmp[1024], tmp2[1024], srcPath[1024]; char stanza[3072]; CharList *tail = NULL, *infiles = NULL; @@ -68,69 +68,79 @@ void pkg_mode_files(UPKGOptions *o, FileStream *makefile, UErrorCode *status) CharList *copyFilesRightTail = NULL; CharList *copyFilesInstallTail = NULL; + CharList *copyDirs = NULL; /* list of dirs to create for copying */ + CharList *installDirs = NULL; /* list of dirs to create for installation */ + /* CharList *copyCommands = NULL;*/ const char *baseName; T_FileStream_writeLine(makefile, "\n.PHONY: $(NAME) all install clean\n\nall: $(NAME)\n\n"); - /* Dont' copy files already in tmp */ - for(infiles = o->filePaths;infiles;infiles = infiles->next) - { - baseName = findBasename(infiles->str); + if(o->embed) { + infiles = o->filePaths; + } else { + infiles = o->files; /* raw files - no paths other than tree paths */ + } + /* Dont' copy files already in tmp */ + for(;infiles;infiles = infiles->next) + { uprv_strcpy(tmp, o->targetDir); uprv_strcat(tmp, U_FILE_SEP_STRING); + if(o->embed) { + baseName = findBasename(infiles->str); + uprv_strcpy(srcPath, baseName); + } else { + baseName = infiles->str; + uprv_strcat(tmp, o->shortName); + uprv_strcat(tmp, U_FILE_SEP_STRING); + uprv_strcpy(srcPath, "$(SRCDIR)/"); + uprv_strcat(srcPath, infiles->str); + } uprv_strcat(tmp, baseName); + copyDirs = pkg_appendUniqueDirToList(copyDirs, NULL, tmp); + o->outFiles = pkg_appendToList(o->outFiles, &tail, uprv_strdup(tmp)); if(strcmp(tmp, infiles->str) == 0) { - /* fprintf(stderr, "### NOT copying: %s\n", tmp); */ - /* no copy needed.. */ - continue; - } - - sprintf(stanza, "%s: %s\n\t$(INSTALL_DATA) $< $@\n", tmp, infiles->str); - T_FileStream_writeLine(makefile, stanza); - - uprv_strcpy(tmp2, o->targetDir); - uprv_strcat(tmp2, U_FILE_SEP_STRING); - uprv_strcat(tmp2, U_FILE_SEP_STRING); - uprv_strcat(tmp2, baseName); - - if(strcmp(tmp2, infiles->str) == 0) - { - /* fprintf(stderr, "### NOT copying: %s\n", tmp2); */ + /* fprintf(stderr, "### NOT copying: %s\n", tmp); */ /* no copy needed.. */ - continue; + } else { + sprintf(stanza, "%s: %s\n\t$(INSTALL_DATA) $< $@\n", tmp, srcPath); + T_FileStream_writeLine(makefile, stanza); } uprv_strcpy(tmp2, "$(INSTALLTO)" U_FILE_SEP_STRING); + if(!o->embed) { + uprv_strcat(tmp2, o->shortName); + uprv_strcat(tmp2, U_FILE_SEP_STRING); + } uprv_strcat(tmp2, baseName); - if(strcmp(tmp2, infiles->str) == 0) - { - /* fprintf(stderr, "### NOT copying: %s\n", tmp2); */ + installDirs = pkg_appendUniqueDirToList(installDirs, NULL, tmp2); + + if(strcmp(tmp2, infiles->str) == 0) { + /* fprintf(stderr, "### NOT copying: %s\n", tmp2); */ /* no copy needed.. */ - continue; + } else { + sprintf(stanza, "%s: %s\n\t$(INSTALL_DATA) $< $@\n", tmp2, tmp); + T_FileStream_writeLine(makefile, stanza); + + /* left hand side: target path, target name */ + copyFilesLeft = pkg_appendToList(copyFilesLeft, ©FilesLeftTail, uprv_strdup(tmp)); + + /* fprintf(stderr, "##### COPY %s from %s\n", tmp, infiles->str); */ + /* rhs: source path */ + copyFilesRight = pkg_appendToList(copyFilesRight, ©FilesRightTail, uprv_strdup(infiles->str)); + + /* install: installed path */ + copyFilesInstall = pkg_appendToList(copyFilesInstall, ©FilesInstallTail, uprv_strdup(tmp2)); } - - sprintf(stanza, "%s: %s\n\t$(INSTALL_DATA) $< $@\n", tmp2, tmp); - T_FileStream_writeLine(makefile, stanza); - - /* left hand side: target path, target name */ - copyFilesLeft = pkg_appendToList(copyFilesLeft, ©FilesLeftTail, uprv_strdup(tmp)); - - /* fprintf(stderr, "##### COPY %s from %s\n", tmp, infiles->str); */ - /* rhs: source path */ - copyFilesRight = pkg_appendToList(copyFilesRight, ©FilesRightTail, uprv_strdup(infiles->str)); - - /* install: installed path */ - copyFilesInstall = pkg_appendToList(copyFilesInstall, ©FilesInstallTail, uprv_strdup(tmp2)); } - + if(o->nooutput || o->verbose) { CharList *i; fprintf(stdout, "# Output files: "); @@ -155,9 +165,18 @@ void pkg_mode_files(UPKGOptions *o, FileStream *makefile, UErrorCode *status) pkg_writeCharListWrap(makefile, copyFilesInstall, " ", " \\\n", 0); T_FileStream_writeLine(makefile, "\n\n"); + T_FileStream_writeLine(makefile, "COPYDIRS= "); + pkg_writeCharListWrap(makefile, copyDirs, " ", " \\\n", 0); + T_FileStream_writeLine(makefile, "\n\n"); + + + T_FileStream_writeLine(makefile, "INSTALLDIRS= "); + pkg_writeCharListWrap(makefile, installDirs, " ", " \\\n", 0); + T_FileStream_writeLine(makefile, "\n\n"); + if(copyFilesRight != NULL) { - T_FileStream_writeLine(makefile, "$(NAME): $(COPIEDDEST)\n\n"); + T_FileStream_writeLine(makefile, "$(NAME): copy-dirs $(COPIEDDEST)\n\n"); T_FileStream_writeLine(makefile, "clean:\n\t-$(RMV) $(COPIEDDEST) $(MAKEFILE)"); T_FileStream_writeLine(makefile, "\n\n"); @@ -167,6 +186,8 @@ void pkg_mode_files(UPKGOptions *o, FileStream *makefile, UErrorCode *status) { T_FileStream_writeLine(makefile, "clean:\n\n"); } - T_FileStream_writeLine(makefile, "install: $(INSTALLEDDEST)\n\n"); + T_FileStream_writeLine(makefile, "install: install-dirs $(INSTALLEDDEST)\n\n"); + T_FileStream_writeLine(makefile, "install-dirs:\n\t$(MKINSTALLDIRS) $(INSTALLDIRS)\n\n"); + T_FileStream_writeLine(makefile, "copy-dirs:\n\t$(MKINSTALLDIRS) $(COPYDIRS)\n\n"); } diff --git a/icuSources/tools/pkgdata/gmake.c b/icuSources/tools/pkgdata/gmake.c deleted file mode 100644 index 5af36f2a..00000000 --- a/icuSources/tools/pkgdata/gmake.c +++ /dev/null @@ -1,221 +0,0 @@ -/************************************************************************** -* -* Copyright (C) 2000, International Business Machines -* Corporation and others. All Rights Reserved. -* -*************************************************************************** -* file name: gmake.c -* encoding: ANSI X3.4 (1968) -* tab size: 8 (not used) -* indentation:4 -* -* created on: 2000may17 -* created by: Steven \u24C7 Loomis -* -* Emit a GNU makefile -*/ - -#include "unicode/utypes.h" -#include "cmemory.h" -#include "cstring.h" -#include "filestrm.h" -#include "toolutil.h" -#include "unewdata.h" -#include "uoptions.h" -#include "pkgtypes.h" -#include "makefile.h" -#include -#include - -char linebuf[2048]; - -/* Write any setup/initialization stuff */ -void -pkg_mak_writeHeader(FileStream *f, const UPKGOptions *o) -{ - sprintf(linebuf, "## Makefile for %s created by pkgdata\n" - "## from ICU Version %s\n" - "\n", - o->shortName, - U_ICU_VERSION); - T_FileStream_writeLine(f, linebuf); - - sprintf(linebuf, "NAME=%s\n" - "CNAME=%s\n" - "TARGETDIR=%s\n" - "TEMP_DIR=%s\n" - "srcdir=$(TEMP_DIR)\n" - "MODE=%s\n" - "MAKEFILE=%s\n" - "ENTRYPOINT=%s\n" - "include %s\n" - "\n\n\n", - o->shortName, - o->cShortName, - o->targetDir, - o->tmpDir, - o->mode, - o->makeFile, - o->entryName, - o->options); - T_FileStream_writeLine(f, linebuf); - - /* TEMP_PATH and TARG_PATH will be empty if the respective dir is . */ - /* Avoid //'s and .'s which confuse make ! */ - if(!strcmp(o->tmpDir,".")) - { - T_FileStream_writeLine(f, "TEMP_PATH=\n"); - } - else - { - T_FileStream_writeLine(f, "TEMP_PATH=$(TEMP_DIR)/\n"); - } - - if(!strcmp(o->targetDir,".")) - { - T_FileStream_writeLine(f, "TARG_PATH=\n"); - } - else - { - T_FileStream_writeLine(f, "TARG_PATH=$(TARGETDIR)/\n"); - } - - sprintf(linebuf, "## List files [%d] containing data files to process (note: - means stdin)\n" - "LISTFILES= ", - pkg_countCharList(o->fileListFiles)); - T_FileStream_writeLine(f, linebuf); - - pkg_writeCharListWrap(f, o->fileListFiles, " ", " \\\n",0); - - T_FileStream_writeLine(f, "\n\n\n"); - - sprintf(linebuf, "## Data Files [%d]\n" - "DATAFILES= ", - pkg_countCharList(o->files)); - - T_FileStream_writeLine(f, linebuf); - - pkg_writeCharListWrap(f, o->files, " ", " \\\n",-1); - - T_FileStream_writeLine(f, "\n\n\n"); - - sprintf(linebuf, "## Data File Paths [%d]\n" - "DATAFILEPATHS= ", - pkg_countCharList(o->filePaths)); - - T_FileStream_writeLine(f, linebuf); - - pkg_writeCharListWrap(f, o->filePaths, " ", " \\\n",0); - - T_FileStream_writeLine(f, "\n\n\n"); - -} - -/* Write a stanza in the makefile, with specified "target: parents... \n\n\tcommands" [etc] */ -void -pkg_mak_writeStanza(FileStream *f, const UPKGOptions *o, - const char *target, - CharList* parents, - CharList* commands) -{ - T_FileStream_write(f, target, strlen(target)); - T_FileStream_write(f, " : ", 3); - pkg_writeCharList(f, parents, " ",0); - T_FileStream_write(f, "\n", 1); - - if(commands) - { - T_FileStream_write(f, "\t", 1); - pkg_writeCharList(f, commands, "\n\t",0); - } - T_FileStream_write(f, "\n\n", 2); -} - -/* write any cleanup/post stuff */ -void -pkg_mak_writeFooter(FileStream *f, const UPKGOptions *o) -{ - /* nothing */ -} - - -void -pkg_mak_writeObjRules(UPKGOptions *o, FileStream *makefile, CharList **objects, const char* objSuffix) -{ - const char *p, *baseName; - char *tmpPtr; - char tmp[1024]; - char stanza[1024]; - char cfile[1024]; - CharList *oTail = NULL; - CharList *infiles; - CharList *parents = NULL, *commands = NULL; - int32_t genFileOffset = 0; /* offset from beginning of .c and .o file name, use to chop off package name for AS/400 */ - - infiles = o->filePaths; - -#if defined (OS400) - if(infiles != NULL) { - baseName = findBasename(infiles->str); - p = uprv_strchr(baseName, '_'); - if(p != NULL) { - genFileOffset = (p-baseName)+1; /* "package_" - name + underscore */ - } - } -#endif - - for(;infiles;infiles = infiles->next) { - baseName = findBasename(infiles->str); - p = uprv_strrchr(baseName, '.'); - if( (p == NULL) || (*p == '\0' ) ) { - continue; - } - - uprv_strncpy(tmp, baseName, p-baseName); - p++; - - uprv_strcpy(tmp+(p-1-baseName), "_"); /* to append */ - uprv_strcat(tmp, p); - uprv_strcat(tmp, objSuffix ); - - /* iSeries cannot have '-' in the .o objects. */ - for( tmpPtr = tmp; *tmpPtr; tmpPtr++ ) { - if ( *tmpPtr == '-' ) { - *tmpPtr = '_'; - } - } - - *objects = pkg_appendToList(*objects, &oTail, uprv_strdup(tmp + genFileOffset)); /* Offset for AS/400 */ - - /* write source list */ - strcpy(cfile,tmp); - strcpy(cfile+strlen(cfile)-strlen(objSuffix), ".c" ); /* replace .o with .c */ - - /* Make up parents.. */ - parents = pkg_appendToList(parents, NULL, uprv_strdup(infiles->str)); - - /* make up commands.. */ - sprintf(stanza, "@$(INVOKE) $(GENCCODE) -n $(ENTRYPOINT) -d $(TEMP_DIR) $<"); - commands = pkg_appendToList(commands, NULL, uprv_strdup(stanza)); - - if(genFileOffset > 0) { /* for AS/400 */ - sprintf(stanza, "@mv $(TEMP_PATH)%s $(TEMP_PATH)%s", cfile, cfile+genFileOffset); - commands = pkg_appendToList(commands, NULL, uprv_strdup(stanza)); - } - - sprintf(stanza, "@$(COMPILE.c) -o $@ $(TEMP_DIR)/%s", cfile+genFileOffset); /* for AS/400 */ - commands = pkg_appendToList(commands, NULL, uprv_strdup(stanza)); - - sprintf(stanza, "@$(RMV) $(TEMP_DIR)/%s", cfile+genFileOffset); - commands = pkg_appendToList(commands, NULL, uprv_strdup(stanza)); - - sprintf(stanza, "$(TEMP_PATH)%s", tmp+genFileOffset); /* for AS/400 */ - pkg_mak_writeStanza(makefile, o, stanza, parents, commands); - - pkg_deleteList(parents); - pkg_deleteList(commands); - parents = NULL; - commands = NULL; - } - -} diff --git a/icuSources/tools/pkgdata/make.c b/icuSources/tools/pkgdata/make.c new file mode 100644 index 00000000..0d794ecc --- /dev/null +++ b/icuSources/tools/pkgdata/make.c @@ -0,0 +1,444 @@ +/************************************************************************** +* +* Copyright (C) 2000-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +*************************************************************************** +* file name: make.c +* encoding: ANSI X3.4 (1968) +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2000jul18 +* created by: Vladimir Weinstein +* created on: 2000may17 +* created by: Steven \u24C7 Loomis +* merged on: 2003sep14 +* merged by: George Rhoten +* merged from nmake.c and gmake.c +* +* Emit a NMAKE or GNU makefile +*/ + +#include "unicode/utypes.h" +#include "unicode/putil.h" +#include "makefile.h" +#include "cstring.h" +#include + +#ifdef U_MAKE_IS_NMAKE + +char linebuf[2048]; + +/* Write any setup/initialization stuff */ +void +pkg_mak_writeHeader(FileStream *f, const UPKGOptions *o) +{ + const char *appendVersion = NULL; + if(o->version && !uprv_strstr(o->shortName,o->version)) { /* do not append version if + already contained in the name */ + appendVersion = o->version; + } + + sprintf(linebuf, "## Makefile for %s (%s) created by pkgdata\n" + "## from ICU Version %s\n" + "\n", + o->shortName, + o->libName, + U_ICU_VERSION); + T_FileStream_writeLine(f, linebuf); + + sprintf(linebuf, "NAME=%s%s\n" + "CNAME=%s\n" + "LIBNAME=%s\n" + "SRCDIR=%s\n" + "TARGETDIR=%s\n" + "TEMP_DIR=%s\n" + "MODE=%s\n" + "MAKEFILE=%s\n" + "ENTRYPOINT=%s\n" + "TARGET_VERSION=%s\n" + "MKINSTALLDIRS=mkdir\n" + "\n\n\n", + o->shortName, + (appendVersion ? appendVersion : ""), + o->cShortName, + o->libName, + o->srcDir, + o->targetDir, + o->tmpDir, + o->mode, + o->makeFile, + o->entryName, + o->version); + T_FileStream_writeLine(f, linebuf); + + sprintf(linebuf, "## List files [%d] containing data files to process (note: - means stdin)\n" + "LISTFILES= ", + pkg_countCharList(o->fileListFiles)); + T_FileStream_writeLine(f, linebuf); + + pkg_writeCharListWrap(f, o->fileListFiles, " ", " \\\n", 0); + + T_FileStream_writeLine(f, "\n\n\n"); + + sprintf(linebuf, "## Data Files [%d]\n" + "DATAFILES= ", + pkg_countCharList(o->files)); + + T_FileStream_writeLine(f, linebuf); + + pkg_writeCharListWrap(f, o->files, " ", " \\\n", -1); + + T_FileStream_writeLine(f, "\n\n\n"); + + sprintf(linebuf, "## Data File Paths [%d]\n" + "DATAFILEPATHS= ", + pkg_countCharList(o->filePaths)); + + T_FileStream_writeLine(f, linebuf); + + pkg_writeCharListWrap(f, o->filePaths, " ", " \\\n", 1); + + T_FileStream_writeLine(f, "\n\n\n"); + +} + +/* Write a stanza in the makefile, with specified "target: parents... \n\n\tcommands" [etc] */ +void +pkg_mak_writeStanza(FileStream *f, const UPKGOptions *o, + const char *target, + CharList* parents, + CharList* commands ) +{ + T_FileStream_write(f, target, (int32_t)uprv_strlen(target)); + T_FileStream_write(f, " : ", 3); + pkg_writeCharList(f, parents, " ",1); + T_FileStream_write(f, "\n", 1); + + if(commands) + { + T_FileStream_write(f, "\t", 1); + pkg_writeCharList(f, commands, "\n\t",0); + } + T_FileStream_write(f, "\n\n", 2); +} + +/* write any cleanup/post stuff */ +void +pkg_mak_writeFooter(FileStream *f, const UPKGOptions *o) +{ + char buf[256]; + sprintf(buf, "\n\n# End of makefile for %s [%s mode]\n\n", o->shortName, o->mode); + T_FileStream_write(f, buf, (int32_t)uprv_strlen(buf)); +} + +#else /* #ifdef WIN32 */ + +#include "cmemory.h" +#include "filestrm.h" +#include "toolutil.h" +#include "unewdata.h" +#include "uoptions.h" +#include "pkgtypes.h" +#include + +char linebuf[2048]; + +/* Write any setup/initialization stuff */ +void +pkg_mak_writeHeader(FileStream *f, const UPKGOptions *o) +{ + sprintf(linebuf, "## Makefile for %s created by pkgdata\n" + "## from ICU Version %s\n" + "\n", + o->shortName, + U_ICU_VERSION); + T_FileStream_writeLine(f, linebuf); + + sprintf(linebuf, "NAME=%s\n" + "LIBNAME=%s\n" + "CNAME=%s\n" + "TARGETDIR=%s\n" + "TEMP_DIR=%s\n" + "srcdir=$(TEMP_DIR)\n" + "SRCDIR=%s\n" + "MODE=%s\n" + "MAKEFILE=%s\n" + "ENTRYPOINT=%s\n" + "include %s\n" + "\n\n\n", + o->shortName, + o->libName, + o->cShortName, + o->targetDir, + o->tmpDir, + o->srcDir, + o->mode, + o->makeFile, + o->entryName, + o->options); + T_FileStream_writeLine(f, linebuf); + + /* TEMP_PATH and TARG_PATH will be empty if the respective dir is . */ + /* Avoid //'s and .'s which confuse make ! */ + if(!strcmp(o->tmpDir,".")) + { + T_FileStream_writeLine(f, "TEMP_PATH=\n"); + } + else + { + T_FileStream_writeLine(f, "TEMP_PATH=$(TEMP_DIR)/\n"); + } + + if(!strcmp(o->targetDir,".")) + { + T_FileStream_writeLine(f, "TARG_PATH=\n"); + } + else + { + T_FileStream_writeLine(f, "TARG_PATH=$(TARGETDIR)/\n"); + } + + sprintf(linebuf, "## List files [%u] containing data files to process (note: - means stdin)\n" + "LISTFILES= ", + (int)pkg_countCharList(o->fileListFiles)); + T_FileStream_writeLine(f, linebuf); + + pkg_writeCharListWrap(f, o->fileListFiles, " ", " \\\n",0); + + T_FileStream_writeLine(f, "\n\n\n"); + + sprintf(linebuf, "## Data Files [%u]\n" + "DATAFILES= ", + (int)pkg_countCharList(o->files)); + + T_FileStream_writeLine(f, linebuf); + + pkg_writeCharListWrap(f, o->files, " ", " \\\n",-1); + + T_FileStream_writeLine(f, "\n\n\n"); + + sprintf(linebuf, "## Data File Paths [%u]\n" + "DATAFILEPATHS= ", + (int)pkg_countCharList(o->filePaths)); + + T_FileStream_writeLine(f, linebuf); + + pkg_writeCharListWrap(f, o->filePaths, " ", " \\\n",0); + + T_FileStream_writeLine(f, "\n\n\n"); + +} + +/* Write a stanza in the makefile, with specified "target: parents... \n\n\tcommands" [etc] */ +void +pkg_mak_writeStanza(FileStream *f, const UPKGOptions *o, + const char *target, + CharList* parents, + CharList* commands) +{ + T_FileStream_write(f, target, uprv_strlen(target)); + T_FileStream_write(f, " : ", 3); + pkg_writeCharList(f, parents, " ",0); + T_FileStream_write(f, "\n", 1); + + if(commands) + { + T_FileStream_write(f, "\t", 1); + pkg_writeCharList(f, commands, "\n\t",0); + } + T_FileStream_write(f, "\n\n", 2); +} + +/* write any cleanup/post stuff */ +void +pkg_mak_writeFooter(FileStream *f, const UPKGOptions *o) +{ + T_FileStream_writeLine(f, "\nrebuild: clean all\n"); +} + + +void +pkg_mak_writeObjRules(UPKGOptions *o, FileStream *makefile, CharList **objects, const char* objSuffix) +{ + const char *p, *baseName; + char *tmpPtr; + char tmp[1024]; + char stanza[1024]; + char cfile[1024]; + CharList *oTail = NULL; + CharList *infiles; + CharList *parents = NULL, *commands = NULL; + int32_t genFileOffset = 0; /* offset from beginning of .c and .o file name, use to chop off package name for AS/400 */ + static int serNo = 0; /* counter for numeric file names */ + char serName[100]; + + if(o->embed) { + infiles = o->filePaths; + } else { + infiles = o->files; /* raw files - no paths other than tree paths */ + } + +#if defined (OS400) + if(infiles != NULL) { + baseName = findBasename(infiles->str); + p = uprv_strchr(baseName, '_'); + if(p != NULL) { + genFileOffset = (p-baseName)+1; /* "package_" - name + underscore */ + } + } +#endif + + for(;infiles;infiles = infiles->next) { + if(o->embed) { + baseName = findBasename(infiles->str); + } else { + baseName = infiles->str; /* skip the icudt28b/ part */ + } + p = uprv_strrchr(baseName, '.'); + if( (p == NULL) || (*p == '\0' ) ) { + continue; + } + + if(o->numeric) { + sprintf(serName, "t%04x", serNo++); + uprv_strcpy(tmp,serName); + uprv_strcat(tmp, objSuffix); + } else { + uprv_strncpy(tmp, baseName, p-baseName); + p++; + + uprv_strcpy(tmp+(p-1-baseName), "_"); /* to append */ + uprv_strcat(tmp, p); + uprv_strcat(tmp, objSuffix ); + + /* iSeries cannot have '-' in the .o objects. */ + for( tmpPtr = tmp; *tmpPtr; tmpPtr++ ) { + if ( *tmpPtr == U_FILE_SEP_CHAR ) { /* map tree names with underscores */ + *tmpPtr = '_'; + } + if ( *tmpPtr == '-' ) { + *tmpPtr = '_'; + } + } + } + + *objects = pkg_appendToList(*objects, &oTail, uprv_strdup(tmp + genFileOffset)); /* Offset for AS/400 */ + + /* write source list */ + uprv_strcpy(cfile,tmp); + uprv_strcpy(cfile+uprv_strlen(cfile)-uprv_strlen(objSuffix), ".c" ); /* replace .o with .c */ + + /* Make up parents.. */ + if(!o->embed) { + char *parentPath; + parentPath = uprv_malloc(1+uprv_strlen(baseName) + uprv_strlen("$(SRCDIR)/")); + sprintf(parentPath, "$(SRCDIR)/%s", baseName); + parents = pkg_appendToList(parents, NULL, parentPath); + } else { + parents = pkg_appendToList(parents, NULL, uprv_strdup(infiles->str)); + } + + /* make up commands.. */ + if(!o->embed) { + /* search for tree.. */ + const char *tchar; + char tree[1024]; + if((tchar=uprv_strchr(baseName, '/'))) { + tree[0]='_'; + strncpy(tree+1,baseName,tchar-baseName); + tree[tchar-baseName+1]=0; + } else { + tree[0] = 0; + } +#ifdef OS400 + sprintf(stanza, "$(INVOKE) $(GENCCODE) -n $(CNAME)%s -d $(TEMP_DIR) $(SRCDIR)/%s", tree, infiles->str); +#else + sprintf(stanza, "$(INVOKE) $(GENCCODE) -n $(CNAME)%s -d $(TEMP_DIR) $<", tree); +#endif + } else { +#ifdef OS400 + sprintf(stanza, "$(INVOKE) $(GENCCODE) -d $(TEMP_DIR) %s", infiles->str); +#else + sprintf(stanza, "$(INVOKE) $(GENCCODE) -d $(TEMP_DIR) $<"); +#endif + } + + if(o->numeric) { + strcat(stanza, " -f "); + strcat(stanza,serName); + } else if(!o->embed && uprv_strchr(baseName, '/')) { + /* append actual file - ex: coll_en_res otherwise the tree name will be lost */ + strcat(stanza, " -f "); + strncat(stanza, tmp, (strlen(tmp)-strlen(objSuffix))); + } + + commands = pkg_appendToList(commands, NULL, uprv_strdup(stanza)); + +#ifdef OS400 + /* This builds the file into one .c file */ + sprintf(stanza, "@cat $(TEMP_PATH)%s >> $(TEMP_PATH)/$(NAME)all.c", cfile); + commands = pkg_appendToList(commands, NULL, uprv_strdup(stanza)); + + sprintf(stanza, "@$(RMV) $(TEMP_DIR)/%s", cfile); + commands = pkg_appendToList(commands, NULL, uprv_strdup(stanza)); + + T_FileStream_write(makefile, "\t", 1); + pkg_writeCharList(makefile, commands, "\n\t",0); + T_FileStream_write(makefile, "\n\n", 2); +#else + if(genFileOffset > 0) { /* for AS/400 */ + sprintf(stanza, "@mv $(TEMP_PATH)%s $(TEMP_PATH)%s", cfile, cfile+genFileOffset); + commands = pkg_appendToList(commands, NULL, uprv_strdup(stanza)); + } + + sprintf(stanza, "@$(COMPILE.c) -o $@ $(TEMP_DIR)/%s", cfile+genFileOffset); /* for AS/400 */ + commands = pkg_appendToList(commands, NULL, uprv_strdup(stanza)); + + sprintf(stanza, "@$(RMV) $(TEMP_DIR)/%s", cfile+genFileOffset); + commands = pkg_appendToList(commands, NULL, uprv_strdup(stanza)); + + sprintf(stanza, "$(TEMP_PATH)%s", tmp+genFileOffset); /* for AS/400 */ + pkg_mak_writeStanza(makefile, o, stanza, parents, commands); +#endif + + pkg_deleteList(parents); + pkg_deleteList(commands); + parents = NULL; + commands = NULL; + } +} + +#endif /* #ifdef WIN32 */ + +void +pkg_mak_writeAssemblyHeader(FileStream *f, const UPKGOptions *o) +{ + T_FileStream_writeLine(f, "\n"); + T_FileStream_writeLine(f, "ifneq ($(GENCCODE_ASSEMBLY),)\n"); + T_FileStream_writeLine(f, "\n"); + T_FileStream_writeLine(f, "BASE_OBJECTS=$(NAME)_dat.o\n"); + T_FileStream_writeLine(f, "\n"); + T_FileStream_writeLine(f, "$(TEMP_DIR)/$(NAME).dat: $(CMNLIST) $(DATAFILEPATHS)\n"); + if(!o->embed) { + T_FileStream_writeLine(f, "\t$(INVOKE) $(GENCMN) -c -e $(ENTRYPOINT) -n $(NAME) -s $(SRCDIR) -t dat -d $(TEMP_DIR) 0 $(CMNLIST)\n"); + } else { + T_FileStream_writeLine(f, "\t$(INVOKE) $(GENCMN) -c -e $(ENTRYPOINT) -n $(NAME) -E -t dat -d $(TEMP_DIR) 0 $(CMNLIST)\n"); + } + T_FileStream_writeLine(f, "\n"); + T_FileStream_writeLine(f, "$(TEMP_DIR)/$(NAME)_dat.o : $(TEMP_DIR)/$(NAME).dat\n"); + T_FileStream_writeLine(f, "\t$(INVOKE) $(GENCCODE) $(GENCCODE_ASSEMBLY) -n $(NAME) -e $(ENTRYPOINT) -d $(TEMP_DIR) $<\n"); + T_FileStream_writeLine(f, "\t$(COMPILE.c) $(DYNAMICCPPFLAGS) $(DYNAMICCXXFLAGS) -o $@ $(TEMP_DIR)/$(NAME)_dat"ASM_SUFFIX"\n"); + T_FileStream_writeLine(f, "\t$(RMV) $(TEMP_DIR)/$(NAME)_dat"ASM_SUFFIX"\n"); + T_FileStream_writeLine(f, "\n"); + T_FileStream_writeLine(f, "else\n"); + T_FileStream_writeLine(f, "\n"); +} + +void +pkg_mak_writeAssemblyFooter(FileStream *f, const UPKGOptions *o) +{ + T_FileStream_writeLine(f, "\nendif\n"); +} + diff --git a/icuSources/tools/pkgdata/makefile.h b/icuSources/tools/pkgdata/makefile.h index 21d4e56c..0b1bbe97 100644 --- a/icuSources/tools/pkgdata/makefile.h +++ b/icuSources/tools/pkgdata/makefile.h @@ -1,6 +1,6 @@ /************************************************************************** * -* Copyright (C) 2000, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. * *************************************************************************** @@ -41,9 +41,9 @@ pkg_mak_writeFooter(FileStream *f, const UPKGOptions *o); -#ifdef WIN32 +#ifdef U_MAKE_IS_NMAKE extern void pkg_mode_windows(UPKGOptions *o, FileStream *makefile, UErrorCode *status); -#else /*#ifdef WIN32*/ +#else /*#ifdef U_MAKE_IS_NMAKE*/ /** * Write stanzas for generating .o (and .c) files for each data file in 'o->filePaths'. * @param o Package options struct @@ -63,4 +63,9 @@ extern void pkg_mode_common(UPKGOptions* o, FileStream *stream, UErrorCode *stat extern void pkg_mode_files(UPKGOptions* o, FileStream *stream, UErrorCode *status); +extern void +pkg_mak_writeAssemblyHeader(FileStream *f, const UPKGOptions *o); +extern void +pkg_mak_writeAssemblyFooter(FileStream *f, const UPKGOptions *o); + #endif diff --git a/icuSources/tools/pkgdata/nmake.c b/icuSources/tools/pkgdata/nmake.c deleted file mode 100644 index efaf30b4..00000000 --- a/icuSources/tools/pkgdata/nmake.c +++ /dev/null @@ -1,110 +0,0 @@ -/************************************************************************** -* -* Copyright (C) 2000, International Business Machines -* Corporation and others. All Rights Reserved. -* -*************************************************************************** -* file name: nmake.c -* encoding: ANSI X3.4 (1968) -* tab size: 8 (not used) -* indentation:4 -* -* created on: 2000jul18 -* created by: Vladimir Weinstein -* -* Emit a NMAKE makefile -*/ - -#include "makefile.h" -#include "cstring.h" -#include - -char linebuf[2048]; - -/* Write any setup/initialization stuff */ -void -pkg_mak_writeHeader(FileStream *f, const UPKGOptions *o) -{ - sprintf(linebuf, "## Makefile for %s created by pkgdata\n" - "## from ICU Version %s\n" - "\n", - o->shortName, - U_ICU_VERSION); - T_FileStream_writeLine(f, linebuf); - - sprintf(linebuf, "NAME=%s\n" - "CNAME=%s\n" - "TARGETDIR=%s\n" - "TEMP_DIR=%s\n" - "MODE=%s\n" - "MAKEFILE=%s\n" - "ENTRYPOINT=%s\n" - "\n\n\n", - o->shortName, - o->cShortName, - o->targetDir, - o->tmpDir, - o->mode, - o->makeFile, - o->entryName); - T_FileStream_writeLine(f, linebuf); - - sprintf(linebuf, "## List files [%d] containing data files to process (note: - means stdin)\n" - "LISTFILES= ", - pkg_countCharList(o->fileListFiles)); - T_FileStream_writeLine(f, linebuf); - - pkg_writeCharListWrap(f, o->fileListFiles, " ", " \\\n", 0); - - T_FileStream_writeLine(f, "\n\n\n"); - - sprintf(linebuf, "## Data Files [%d]\n" - "DATAFILES= ", - pkg_countCharList(o->files)); - - T_FileStream_writeLine(f, linebuf); - - pkg_writeCharListWrap(f, o->files, " ", " \\\n", -1); - - T_FileStream_writeLine(f, "\n\n\n"); - - sprintf(linebuf, "## Data File Paths [%d]\n" - "DATAFILEPATHS= ", - pkg_countCharList(o->filePaths)); - - T_FileStream_writeLine(f, linebuf); - - pkg_writeCharListWrap(f, o->filePaths, " ", " \\\n", 1); - - T_FileStream_writeLine(f, "\n\n\n"); - -} - -/* Write a stanza in the makefile, with specified "target: parents... \n\n\tcommands" [etc] */ -void -pkg_mak_writeStanza(FileStream *f, const UPKGOptions *o, - const char *target, - CharList* parents, - CharList* commands ) -{ - T_FileStream_write(f, target, uprv_strlen(target)); - T_FileStream_write(f, " : ", 3); - pkg_writeCharList(f, parents, " ",1); - T_FileStream_write(f, "\n", 1); - - if(commands) - { - T_FileStream_write(f, "\t", 1); - pkg_writeCharList(f, commands, "\n\t",0); - } - T_FileStream_write(f, "\n\n", 2); -} - -/* write any cleanup/post stuff */ -void -pkg_mak_writeFooter(FileStream *f, const UPKGOptions *o) -{ - char buf[256]; - sprintf(buf, "\n\n# End of makefile for %s [%s mode]\n\n", o->shortName, o->mode); - T_FileStream_write(f, buf, uprv_strlen(buf)); -} diff --git a/icuSources/tools/pkgdata/pkgdata.1.in b/icuSources/tools/pkgdata/pkgdata.1.in index 1c3eb7f3..b8b68a57 100644 --- a/icuSources/tools/pkgdata/pkgdata.1.in +++ b/icuSources/tools/pkgdata/pkgdata.1.in @@ -2,7 +2,7 @@ .\" .\" pkgdata.1: manual page for the pkgdata utility .\" -.\" Copyright (C) 2000-2002 IBM, Inc. and others. +.\" Copyright (C) 2000-2003 IBM, Inc. and others. .\" .\" Manual page by Yves Arrouye . .\" Modified by Steven R. Loomis . @@ -51,6 +51,9 @@ .BI "\-n\fP, \fB\-\-nooutput" ] [ +.BI "\-N\fP, \fB\-\-numaric" +] +[ .BI "\-s\fP, \fB\-\-sourcedir" " source" ] [ @@ -250,6 +253,12 @@ is set it will be used for installation. .BI "\-n\fP, \fB\-\-nooutput" Do not produce any output but simply a list of affected files. .TP +.BI "\-N\fP, \fB\-\-numeric" +Instead of using temporary filenames similar to the input symbols, use numeric filenames such +as t0002.c, etc. May be needed for systems which don't allow many similar long filenames, or +for systems that tend to run out of argument space. Note, using this option +implies "\-F\fP, \fB\-\-rebuild" - all packaging will be rebuilt every time pkgdata is run. +.TP .BI "\-s\fP, \fB\-\-sourcedir" " source" Set the source directory to .IR source . @@ -275,5 +284,5 @@ Yves Arrouye .SH VERSION @VERSION@ .SH COPYRIGHT -Copyright (C) 2000-2002 IBM, Inc. and others. +Copyright (C) 2000-2003 IBM, Inc. and others. diff --git a/icuSources/tools/pkgdata/pkgdata.c b/icuSources/tools/pkgdata/pkgdata.c index 2427c4fc..041ebdbf 100644 --- a/icuSources/tools/pkgdata/pkgdata.c +++ b/icuSources/tools/pkgdata/pkgdata.c @@ -1,6 +1,6 @@ /****************************************************************************** * -* Copyright (C) 2000-2003, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -16,20 +16,28 @@ * (DLL, common data, etc.) */ -#include -#include #include "unicode/utypes.h" #include "unicode/putil.h" #include "cmemory.h" #include "cstring.h" #include "filestrm.h" #include "toolutil.h" +#include "unicode/uclean.h" #include "unewdata.h" #include "uoptions.h" #if U_HAVE_POPEN +/* + We define __USE_POSIX2 so that we can get popen and pclose when + --enable-strict is used +*/ +# ifndef __USE_POSIX2 +# define __USE_POSIX2 1 +# endif # include #endif +#include +#include U_CDECL_BEGIN #include "pkgtypes.h" @@ -51,17 +59,17 @@ static struct } modes[] = { { "files", 0, pkg_mode_files, "Uses raw data files (no effect). Installation copies all files to the target location." }, -#ifdef WIN32 +#ifdef U_MAKE_IS_NMAKE { "dll", "library", pkg_mode_windows, "Generates one common data file and one shared library, .dll"}, { "common", "archive", pkg_mode_windows, "Generates just the common file, .dat"}, { "static", "static", pkg_mode_windows, "Generates one statically linked library, " LIB_PREFIX "" UDATA_LIB_SUFFIX } -#else /*#ifdef WIN32*/ +#else /*#ifdef U_MAKE_IS_NMAKE*/ #ifdef UDATA_SO_SUFFIX { "dll", "library", pkg_mode_dll, "Generates one shared library, " UDATA_SO_SUFFIX }, #endif { "common", "archive", pkg_mode_common, "Generates one common data file, .dat" }, { "static", "static", pkg_mode_static, "Generates one statically linked library, " LIB_PREFIX "" UDATA_LIB_SUFFIX } -#endif /*#ifdef WIN32*/ +#endif /*#ifdef U_MAKE_IS_NMAKE*/ }; static UOption options[]={ @@ -83,13 +91,17 @@ static UOption options[]={ /*15*/ UOPTION_DEF( "entrypoint", 'e', UOPT_REQUIRES_ARG), /*16*/ UOPTION_DEF( "revision", 'r', UOPT_REQUIRES_ARG), /*17*/ UOPTION_DEF( 0, 'M', UOPT_REQUIRES_ARG), - /*18*/ UOPTION_DEF( "force-prefix", 'f', UOPT_NO_ARG) + /*18*/ UOPTION_DEF( "force-prefix", 'f', UOPT_NO_ARG), + /*19*/ UOPTION_DEF( "numerictmp", 'N', UOPT_NO_ARG), + /*20*/ UOPTION_DEF( "embed", 'E', UOPT_NO_ARG), + /*21*/ UOPTION_DEF( "libname", 'L', UOPT_REQUIRES_ARG), + /*22*/ UOPTION_DEF( "quiet", 'q', UOPT_NO_ARG) }; -const char options_help[][160]={ +const char options_help[][320]={ "Set the data name", -#ifdef WIN32 - "R:icupath for release version or D:icupath for debug version, where icupath is the directory where ICU is located", +#ifdef U_MAKE_IS_NMAKE + "The directory where the ICU is located (e.g. which contains the bin directory)", #else "Specify options for the builder. (Autdetected if icu-config is available)", #endif @@ -109,7 +121,11 @@ const char options_help[][160]={ "Specify a custom entrypoint name (default: short name)", "Specify a version when packaging in DLL or static mode", "Pass the next argument to make(1)", - "Add package to all file names if not present" + "Add package to all file names if not present", + "Use short numeric temporary file names such as t1234.c", + "Use Embedded paths (such as 'mypackage_') - for compatibility.", + "Library name to build (if different than package name)", + "Quite mode. (e.g. Do not output a readme file for static libraries)" }; const char *progname = "PKGDATA"; @@ -152,21 +168,28 @@ main(int argc, char* argv[]) { } if(!options[1].doesOccur) { - /* Try to fill in from icu-config or equivalent */ - fillInMakefileFromICUConfig(&options[1]); + /* Try to fill in from icu-config or equivalent */ + fillInMakefileFromICUConfig(&options[1]); + } +#ifdef U_MAKE_IS_NMAKE + else { + fprintf(stderr, "Warning: You are using the deprecated -O option\n" + "\tYou can fix this warning by installing pkgdata, gencmn and genccode\n" + "\tinto the same directory and not specifying the -O option to pkgdata.\n"); } +#endif if(!options[1].doesOccur) { - fprintf(stderr, " required parameter is missing: -O is required \n"); - fprintf(stderr, "Run '%s --help' for help.\n", progname); - return 1; + fprintf(stderr, " required parameter is missing: -O is required \n"); + fprintf(stderr, "Run '%s --help' for help.\n", progname); + return 1; } - + if(!options[0].doesOccur) /* -O we already have - don't report it. */ { - fprintf(stderr, " required parameter -p is missing \n"); - fprintf(stderr, "Run '%s --help' for help.\n", progname); - return 1; + fprintf(stderr, " required parameter -p is missing \n"); + fprintf(stderr, "Run '%s --help' for help.\n", progname); + return 1; } if(argc == 1) { @@ -188,7 +211,7 @@ main(int argc, char* argv[]) { fprintf(stderr, "\n options:\n"); for(i=0;i<(sizeof(options)/sizeof(options[0]));i++) { fprintf(stderr, "%-5s -%c %s%-10s %s\n", - (i<2?"[REQ]":""), + (i<1?"[REQ]":""), options[i].shortName, options[i].longName ? "or --" : " ", options[i].longName ? options[i].longName : "", @@ -234,8 +257,8 @@ main(int argc, char* argv[]) { } o.shortName = options[0].value; - /**/ { - int len = uprv_strlen(o.shortName); + { + int32_t len = (int32_t)uprv_strlen(o.shortName); char *csname, *cp; const char *sp; @@ -251,32 +274,48 @@ main(int argc, char* argv[]) { o.cShortName = csname; } -#ifdef WIN32 /* format is R:pathtoICU or D:pathtoICU */ + if(options[21].doesOccur) { /* get libname from shortname, or explicit -L parameter */ + o.libName = options[21].value; + } else { + o.libName = o.shortName; + } + + if(options[22].doesOccur) { + o.quiet = TRUE; + } else { + o.quiet = FALSE; + } + + o.verbose = options[5].doesOccur; +#ifdef U_MAKE_IS_NMAKE /* format is R:pathtoICU or D:pathtoICU */ { char *pathstuff = (char *)options[1].value; if(options[1].value[uprv_strlen(options[1].value)-1] == '\\') { pathstuff[uprv_strlen(options[1].value)-1] = '\0'; } - if(*pathstuff == 'R' || *pathstuff == 'D') { + if(*pathstuff == PKGDATA_DERIVED_PATH || *pathstuff == 'R' || *pathstuff == 'D') { o.options = pathstuff; pathstuff++; if(*pathstuff == ':') { *pathstuff = '\0'; pathstuff++; - } else { - fprintf(stderr, "Error: invalid windows build mode, should be R (release) or D (debug).\n", o.mode, progname); + } + else { + fprintf(stderr, "Error: invalid windows build mode, should be R (release) or D (debug).\n"); return 1; } } else { - fprintf(stderr, "Error: invalid windows build mode, should be R (release) or D (debug).\n", o.mode, progname); + fprintf(stderr, "Error: invalid windows build mode, should be R (release) or D (debug).\n"); return 1; } o.icuroot = pathstuff; + if (o.verbose) { + fprintf(stdout, "# ICUROOT is %s\n", o.icuroot); + } } #else /* on UNIX, we'll just include the file... */ o.options = options[1].value; #endif - o.verbose = options[5].doesOccur; if(options[6].doesOccur) { o.comment = U_COPYRIGHT_STRING; } else if (options[7].doesOccur) { @@ -292,6 +331,12 @@ main(int argc, char* argv[]) { o.clean = options[9].doesOccur; o.nooutput = options[10].doesOccur; o.rebuild = options[11].doesOccur; + o.numeric = options[19].doesOccur; + if(o.numeric) { + o.rebuild = TRUE; /* force rebuild if numeric */ + } + + o.embed = options[20].doesOccur; if( options[12].doesOccur ) { o.tmpDir = options[12].value; @@ -439,12 +484,12 @@ static void loadLists(UPKGOptions *o, UErrorCode *status) char line[16384]; char *linePtr, *lineNext; const uint32_t lineMax = 16300; - char tmp[1024], tmp2[1024]; + char tmp[1024]; char pkgPrefix[1024]; int32_t pkgPrefixLen; const char *baseName; char *s; - int32_t ln; + int32_t ln=0; /* line number */ UBool fixPrefix; @@ -452,187 +497,218 @@ static void loadLists(UPKGOptions *o, UErrorCode *status) strcpy(pkgPrefix, o->shortName); strcat(pkgPrefix, "_"); - pkgPrefixLen=uprv_strlen(pkgPrefix); + pkgPrefixLen=(int32_t)uprv_strlen(pkgPrefix); for(l = o->fileListFiles; l; l = l->next) { if(o->verbose) { fprintf(stdout, "# Reading %s..\n", l->str); } /* TODO: stdin */ - in = T_FileStream_open(l->str, "r"); + in = T_FileStream_open(l->str, "r"); /* open files list */ if(!in) { fprintf(stderr, "Error opening <%s>.\n", l->str); *status = U_FILE_ACCESS_ERROR; return; } - - ln = 0; - - while(T_FileStream_readLine(in, line, sizeof(line))!=NULL) { - ln++; - if(uprv_strlen(line)>lineMax) { - fprintf(stderr, "%s:%d - line too long (over %d chars)\n", l->str, ln, lineMax); - exit(1); + + while(T_FileStream_readLine(in, line, sizeof(line))!=NULL) { /* for each line */ + if((ln == 0) && (!o->embed)) { + /* determine if we need to run in 'embed' (compatibility) mode */ + if(!strncmp(findBasename(line), pkgPrefix, pkgPrefixLen)) { + fprintf(stderr, "Warning: Found path '%s' in file name. Assuming compatibility (-E) mode.\n", pkgPrefix); + o->embed = 1; } - /* remove spaces at the beginning */ - linePtr = line; - while(isspace(*linePtr)) { - linePtr++; + } + ln++; + if(uprv_strlen(line)>lineMax) { + fprintf(stderr, "%s:%d - line too long (over %d chars)\n", l->str, (int)ln, (int)lineMax); + exit(1); + } + /* remove spaces at the beginning */ + linePtr = line; + while(isspace(*linePtr)) { + linePtr++; + } + s=linePtr; + /* remove trailing newline characters */ + while(*s!=0) { + if(*s=='\r' || *s=='\n') { + *s=0; + break; } - s=linePtr; - /* remove trailing newline characters */ - while(*s!=0) { - if(*s=='\r' || *s=='\n') { - *s=0; - break; - } ++s; + } + if((*linePtr == 0) || (*linePtr == '#')) { + continue; /* comment or empty line */ + } + + /* Now, process the line */ + lineNext = NULL; + + while(linePtr && *linePtr) { /* process space-separated items */ + while(*linePtr == ' ') { + linePtr++; } - if((*linePtr == 0) || (*linePtr == '#')) { - continue; /* comment or empty line */ - } - - /* Now, process the line */ - lineNext = NULL; - - while(linePtr && *linePtr) { - while(*linePtr == ' ') { - linePtr++; - } - /* Find the next */ - if(linePtr[0] == '"') - { - lineNext = uprv_strchr(linePtr+1, '"'); - if(lineNext == NULL) { - fprintf(stderr, "%s:%d - missing trailing double quote (\")\n", - l->str, ln); - exit(1); - } else { - lineNext++; - if(*lineNext) { - if(*lineNext != ' ') { - fprintf(stderr, "%s:%d - malformed quoted line at position %d, expected ' ' got '%c'\n", - l->str, ln, lineNext-line, (*lineNext)?*lineNext:'0'); - exit(1); - } - *lineNext = 0; - lineNext++; - } - } + /* Find the next quote */ + if(linePtr[0] == '"') + { + lineNext = uprv_strchr(linePtr+1, '"'); + if(lineNext == NULL) { + fprintf(stderr, "%s:%d - missing trailing double quote (\")\n", + l->str, (int)ln); + exit(1); } else { - lineNext = uprv_strchr(linePtr, ' '); - if(lineNext) { - *lineNext = 0; /* terminate at space */ - lineNext++; - } - } - - /* add the file */ - s = (char*)getLongPathname(linePtr); - - baseName = findBasename(s); - - if(s != baseName) { - /* s was something 'long' with a path */ - if(fixPrefix && uprv_strncmp(pkgPrefix, baseName, pkgPrefixLen)) { - /* path don't have the prefix, add package prefix to short and longname */ - uprv_strcpy(tmp, pkgPrefix); - uprv_strcpy(tmp+pkgPrefixLen, baseName); - - uprv_strncpy(tmp2, s, uprv_strlen(s)-uprv_strlen(baseName)); /* should be: dirpath only, ending in sep */ - tmp2[uprv_strlen(s)-uprv_strlen(baseName)]=0; - uprv_strcat(tmp2, pkgPrefix); - uprv_strcat(tmp2, baseName); - - o->files = pkg_appendToList(o->files, &tail, uprv_strdup(tmp)); - o->filePaths = pkg_appendToList(o->filePaths, &tail2, uprv_strdup(tmp2)); - } else { - /* paths already have the prefix */ - o->files = pkg_appendToList(o->files, &tail, uprv_strdup(baseName)); - o->filePaths = pkg_appendToList(o->filePaths, &tail2, uprv_strdup(s)); - } - - } else { /* s was just a basename, we want to prepend source dir*/ - /* check for prefix of package */ - uprv_strcpy(tmp, o->srcDir); - uprv_strcat(tmp, o->srcDir[uprv_strlen(o->srcDir)-1]==U_FILE_SEP_CHAR?"":U_FILE_SEP_STRING); - - if(fixPrefix && strncmp(pkgPrefix,s, pkgPrefixLen)) { - /* didn't have the prefix - add it */ - uprv_strcat(tmp, pkgPrefix); - /* make up a new basename */ - uprv_strcpy(tmp2, pkgPrefix); - uprv_strcat(tmp2, s); - o->files = pkg_appendToList(o->files, &tail, uprv_strdup(tmp2)); - } else { - o->files = pkg_appendToList(o->files, &tail, uprv_strdup(baseName)); + lineNext++; + if(*lineNext) { + if(*lineNext != ' ') { + fprintf(stderr, "%s:%d - malformed quoted line at position %d, expected ' ' got '%c'\n", + l->str, (int)ln, lineNext-line, (*lineNext)?*lineNext:'0'); + exit(1); } - uprv_strcat(tmp, s); - o->filePaths = pkg_appendToList(o->filePaths, &tail2, uprv_strdup(tmp)); + *lineNext = 0; + lineNext++; + } } - linePtr = lineNext; + } else { + lineNext = uprv_strchr(linePtr, ' '); + if(lineNext) { + *lineNext = 0; /* terminate at space */ + lineNext++; + } } - } + + /* add the file */ + s = (char*)getLongPathname(linePtr); + + if(o->embed == 0) { + /* normal mode.. o->files is just the bare list without package names */ + o->files = pkg_appendToList(o->files, &tail, uprv_strdup(linePtr)); + uprv_strcpy(tmp, o->srcDir); + uprv_strcat(tmp, o->srcDir[uprv_strlen(o->srcDir)-1]==U_FILE_SEP_CHAR?"":U_FILE_SEP_STRING); + uprv_strcat(tmp, s); + o->filePaths = pkg_appendToList(o->filePaths, &tail2, uprv_strdup(tmp)); + } else {/* embedded package_ mode */ + baseName = findBasename(s); + + if(s != baseName) { + /* s was something 'long' with a path */ + /* paths already have the prefix */ + o->files = pkg_appendToList(o->files, &tail, uprv_strdup(baseName)); + o->filePaths = pkg_appendToList(o->filePaths, &tail2, uprv_strdup(s)); + } else { /* s was just a basename, we want to prepend source dir*/ + /* check for prefix of package */ + uprv_strcpy(tmp, o->srcDir); + uprv_strcat(tmp, o->srcDir[uprv_strlen(o->srcDir)-1]==U_FILE_SEP_CHAR?"":U_FILE_SEP_STRING); + o->files = pkg_appendToList(o->files, &tail, uprv_strdup(baseName)); + uprv_strcat(tmp, s); + o->filePaths = pkg_appendToList(o->filePaths, &tail2, uprv_strdup(tmp)); + } + } /* end compatibility mode */ + linePtr = lineNext; + } /* for each entry on line */ + } /* for each line */ T_FileStream_close(in); - } + } /* for each file list file */ } /* Try calling icu-config directly to get information */ -void fillInMakefileFromICUConfig(UOption *option) +static void fillInMakefileFromICUConfig(UOption *option) { #if U_HAVE_POPEN - FILE *p; - size_t n; - static char buf[512] = ""; - static const char cmd[] = "icu-config --incfile"; - - if(options[5].doesOccur) - { - /* informational */ - fprintf(stderr, "%s: No -O option found, trying '%s'.\n", progname, cmd); - } - - p = popen(cmd, "r"); - - if(p == NULL) - { - fprintf(stderr, "%s: icu-config: No icu-config found. (fix PATH or use -O option)\n", progname); - return; - } - - n = fread(buf, 1, 511, p); - - pclose(p); - - if(n<=0) - { - fprintf(stderr,"%s: icu-config: Could not read from icu-config. (fix PATH or use -O option)\n", progname); - return; - } - - if(buf[strlen(buf)-1]=='\n') - { - buf[strlen(buf)-1]=0; - } - - if(buf[0] == 0) - { - fprintf(stderr, "%s: icu-config: invalid response from icu-config (fix PATH or use -O option)\n", progname); - return; - } - - if(options[5].doesOccur) - { - /* informational */ - fprintf(stderr, "%s: icu-config: using '-O %s'\n", progname, buf); - } - option->value = buf; - option->doesOccur = TRUE; + FILE *p; + size_t n; + static char buf[512] = ""; + static const char cmd[] = "icu-config --incfile"; + + if(options[5].doesOccur) + { + /* informational */ + fprintf(stderr, "%s: No -O option found, trying '%s'.\n", progname, cmd); + } + + p = popen(cmd, "r"); + + if(p == NULL) + { + fprintf(stderr, "%s: icu-config: No icu-config found. (fix PATH or use -O option)\n", progname); + return; + } + + n = fread(buf, 1, 511, p); + + pclose(p); + + if(n<=0) + { + fprintf(stderr,"%s: icu-config: Could not read from icu-config. (fix PATH or use -O option)\n", progname); + return; + } + + if(buf[strlen(buf)-1]=='\n') + { + buf[strlen(buf)-1]=0; + } + + if(buf[0] == 0) + { + fprintf(stderr, "%s: icu-config: invalid response from icu-config (fix PATH or use -O option)\n", progname); + return; + } + + if(options[5].doesOccur) + { + /* informational */ + fprintf(stderr, "%s: icu-config: using '-O %s'\n", progname, buf); + } + option->value = buf; + option->doesOccur = TRUE; #else /* ! U_HAVE_POPEN */ - /* no popen available */ - /* Put other OS specific ways to search for the Makefile.inc type - information or else fail.. */ +#ifdef WIN32 + char pathbuffer[_MAX_PATH] = {0}; + char *fullEXEpath = NULL; + char *pathstuff = NULL; + + if (strchr(progname, U_FILE_SEP_CHAR) != NULL || strchr(progname, U_FILE_ALT_SEP_CHAR) != NULL) { + /* pkgdata was executed with relative path */ + fullEXEpath = _fullpath(pathbuffer, progname, sizeof(pathbuffer)); + pathstuff = (char *)options[1].value; + + if (fullEXEpath) { + pathstuff = strrchr(fullEXEpath, U_FILE_SEP_CHAR); + if (pathstuff) { + pathstuff[1] = 0; + uprv_memmove(fullEXEpath + 2, fullEXEpath, uprv_strlen(fullEXEpath)+1); + fullEXEpath[0] = PKGDATA_DERIVED_PATH; + fullEXEpath[1] = ':'; + option->value = uprv_strdup(fullEXEpath); + option->doesOccur = TRUE; + } + } + } + else { + /* pkgdata was executed from the path */ + /* Search for file in PATH environment variable: */ + _searchenv("pkgdata.exe", "PATH", pathbuffer ); + if( *pathbuffer != '\0' ) { + fullEXEpath = pathbuffer; + pathstuff = strrchr(pathbuffer, U_FILE_SEP_CHAR); + if (pathstuff) { + pathstuff[1] = 0; + uprv_memmove(fullEXEpath + 2, fullEXEpath, uprv_strlen(fullEXEpath)+1); + fullEXEpath[0] = PKGDATA_DERIVED_PATH; + fullEXEpath[1] = ':'; + option->value = uprv_strdup(fullEXEpath); + option->doesOccur = TRUE; + } + } + } + /* else can't determine the path */ +#endif + + /* no popen available */ + /* Put other OS specific ways to search for the Makefile.inc type + information or else fail.. */ #endif } diff --git a/icuSources/tools/pkgdata/pkgdata.dsp b/icuSources/tools/pkgdata/pkgdata.dsp index 0e862081..006719d2 100644 --- a/icuSources/tools/pkgdata/pkgdata.dsp +++ b/icuSources/tools/pkgdata/pkgdata.dsp @@ -115,7 +115,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "../../../include" /I "../../common" /I "../toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "../../../include" /I "../../common" /I "../toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # ADD BASE RSC /l 0x411 /d "NDEBUG" # ADD RSC /l 0x411 /d "NDEBUG" BSC32=bscmake.exe @@ -150,7 +150,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "../../../include" /I "../../common" /I "../toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "../../../include" /I "../../common" /I "../toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /Wp64 /Zm600 /c # ADD BASE RSC /l 0x411 /d "_DEBUG" # ADD RSC /l 0x411 /d "_DEBUG" BSC32=bscmake.exe @@ -187,7 +187,7 @@ SOURCE=.\filemode.c # End Source File # Begin Source File -SOURCE=.\nmake.c +SOURCE=.\make.c # End Source File # Begin Source File diff --git a/icuSources/tools/pkgdata/pkgdata.vcproj b/icuSources/tools/pkgdata/pkgdata.vcproj index c7df61f1..89b358af 100644 --- a/icuSources/tools/pkgdata/pkgdata.vcproj +++ b/icuSources/tools/pkgdata/pkgdata.vcproj @@ -1,7 +1,7 @@ - + @@ -39,17 +39,14 @@ CompileAs="0"/> + Outputs="..\..\..\bin\$(TargetFileName)"/> @@ -68,8 +65,14 @@ Culture="1041"/> + + + + Outputs="..\..\..\bin\$(TargetFileName)"/> + + + + +
    + RelativePath=".\make.c"> diff --git a/icuSources/tools/pkgdata/pkgtypes.c b/icuSources/tools/pkgdata/pkgtypes.c index 5a114266..728020a5 100644 --- a/icuSources/tools/pkgdata/pkgtypes.c +++ b/icuSources/tools/pkgdata/pkgtypes.c @@ -1,6 +1,6 @@ /************************************************************************** * -* Copyright (C) 2000, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. * *************************************************************************** @@ -18,6 +18,7 @@ #include #include #include "unicode/utypes.h" +#include "unicode/putil.h" #include "cmemory.h" #include "cstring.h" #include "pkgtypes.h" @@ -27,7 +28,7 @@ const char *pkg_writeCharListWrap(FileStream *s, CharList *l, const char *delim, { int32_t ln = 0; char buffer[1024]; - const CharList *ol = NULL; + const CharList *ol = NULL; while(l != NULL) { if(l->str) @@ -51,20 +52,20 @@ const char *pkg_writeCharListWrap(FileStream *s, CharList *l, const char *delim, uprv_strcat(buffer, "\""); } } - T_FileStream_write(s, buffer, uprv_strlen(buffer)); + T_FileStream_write(s, buffer, (int32_t)uprv_strlen(buffer)); } - ln += uprv_strlen(l->str); + ln += (int32_t)uprv_strlen(l->str); - ol = l; + ol = l; if(l->next && delim) { if(ln > 60 && brk) { ln = 0; - T_FileStream_write(s, brk, uprv_strlen(brk)); + T_FileStream_write(s, brk, (int32_t)uprv_strlen(brk)); } - T_FileStream_write(s, delim, uprv_strlen(delim)); + T_FileStream_write(s, delim, (int32_t)uprv_strlen(delim)); } l = l->next; } @@ -103,12 +104,12 @@ const char *pkg_writeCharList(FileStream *s, CharList *l, const char *delim, int uprv_strcat(buffer, "\""); } } - T_FileStream_write(s, buffer, uprv_strlen(buffer)); + T_FileStream_write(s, buffer, (int32_t)uprv_strlen(buffer)); } if(l->next && delim) { - T_FileStream_write(s, delim, uprv_strlen(delim)); + T_FileStream_write(s, delim, (int32_t)uprv_strlen(delim)); } l = l->next; } @@ -198,6 +199,72 @@ CharList *pkg_appendToList(CharList *l, CharList** end, const char *str) return l; } +CharList *pkg_appendUniqueDirToList(CharList *l, CharList** end, const char *strAlias) { + char aBuf[1024]; + char *rPtr; + rPtr = uprv_strrchr(strAlias, U_FILE_SEP_CHAR); +#if defined(U_FILE_ALT_SEP_CHAR) && (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR) + { + char *aPtr = uprv_strrchr(strAlias, U_FILE_ALT_SEP_CHAR); + if(!rPtr || /* regular char wasn't found or.. */ + (aPtr && (aPtr > rPtr))) + { /* alt ptr exists and is to the right of r ptr */ + rPtr = aPtr; /* may copy NULL which is OK */ + } + } +#endif + if(!rPtr) { + return l; /* no dir path */ + } + if((rPtr-strAlias) > (sizeof(aBuf)/sizeof(aBuf[0]))) { + fprintf(stderr, "## ERR: Path too long [%d chars]: %s\n", sizeof(aBuf), strAlias); + return l; + } + strncpy(aBuf, strAlias,(rPtr-strAlias)); + aBuf[rPtr-strAlias]=0; /* no trailing slash */ + + if(!pkg_listContains(l, aBuf)) { + return pkg_appendToList(l, end, uprv_strdup(aBuf)); + } else { + return l; /* already found */ + } +} + +#if 0 +static CharList * +pkg_appendFromStrings(CharList *l, CharList** end, const char *s, int32_t len) +{ + CharList *endptr = NULL; + const char *p; + char *t; + const char *targ; + if(end == NULL) { + end = &endptr; + } + + if(len==-1) { + len = uprv_strlen(s); + } + targ = s+len; + + while(*s && sshortName, o->shortName, uloc_getDefault()); + " ... ures_open( \"%s\", NULL /* Get the default locale */, &err ); \n", + libName, o->shortName, o->shortName); T_FileStream_writeLine(out, tmp); T_FileStream_close(out); } -#ifndef WIN32 +#ifndef U_MAKE_IS_NMAKE #include "makefile.h" @@ -120,13 +121,15 @@ void pkg_mode_static(UPKGOptions *o, FileStream *makefile, UErrorCode *status) return; } - uprv_strcpy(tmp, LIB_PREFIX); - uprv_strcat(tmp, o->cShortName); + uprv_strcpy(tmp, LIB_STATIC_PREFIX); + uprv_strcat(tmp, o->libName); uprv_strcat(tmp, UDATA_LIB_SUFFIX); o->outFiles = pkg_appendToList(o->outFiles, &tail, uprv_strdup(tmp)); - pkg_sttc_writeReadme(o, tmp, status); + if (!o->quiet) { + pkg_sttc_writeReadme(o, tmp, status); + } if(U_FAILURE(*status)) { return; } @@ -165,6 +168,13 @@ void pkg_mode_static(UPKGOptions *o, FileStream *makefile, UErrorCode *status) uprv_strcat(tmp, "\n\n"); T_FileStream_writeLine(makefile, tmp); +#ifdef OS400 + /* New for iSeries: All packaged data in one .c */ + sprintf(tmp, "# Create a file which contains all .c data files/structures\n" + "$(TEMP_DIR)/$(NAME)all.c: $(CMNLIST)\n\n"); + T_FileStream_writeLine(makefile, tmp); +#endif + /* Write compile rules */ pkg_mak_writeObjRules(o, makefile, &objects, ".$(STATIC_O)"); /* use special .o suffix */ @@ -186,24 +196,50 @@ void pkg_mode_static(UPKGOptions *o, FileStream *makefile, UErrorCode *status) "\tdone;\n\n"); } + pkg_mak_writeAssemblyHeader(makefile, o); + sprintf(tmp,"$(TEMP_PATH)$(NAME)_dat.$(STATIC_O) : $(TEMP_PATH)$(NAME)_dat.c\n" "\t$(COMPILE.c) -o $@ $<\n\n"); T_FileStream_writeLine(makefile, tmp); T_FileStream_writeLine(makefile, "# 'TOCOBJ' contains C Table of Contents objects [if any]\n"); + if(!o->embed) { sprintf(tmp, "$(TEMP_PATH)$(NAME)_dat.c: $(CMNLIST)\n" - "\t$(INVOKE) $(GENCMN) -e $(ENTRYPOINT) -n $(NAME) -S -d $(TEMP_DIR) 0 $(CMNLIST)\n\n"); + "\t$(INVOKE) $(GENCMN) -e $(ENTRYPOINT) -n $(NAME) -S -s $(SRCDIR) -d $(TEMP_DIR) 0 $(CMNLIST)\n\n"); + } else { + sprintf(tmp, "$(TEMP_PATH)$(NAME)_dat.c: $(CMNLIST)\n" + "\t$(INVOKE) $(GENCMN) -e $(ENTRYPOINT) -n $(NAME) -S -E -d $(TEMP_DIR) 0 $(CMNLIST)\n\n"); + } + T_FileStream_writeLine(makefile, tmp); + + sprintf(tmp, "TOCOBJ= $(NAME)_dat.$(STATIC_O)\n\n"); T_FileStream_writeLine(makefile, tmp); - sprintf(tmp, "TOCOBJ= $(NAME)_dat%s \n\n", OBJ_SUFFIX); +#ifdef OS400 + /* New for iSeries: All packaged data in one .c */ + sprintf(tmp,"$(TEMP_PATH)$(NAME)all.$(STATIC_O) : $(TEMP_PATH)$(NAME)all.c\n" + "\t$(COMPILE.c) -o $@ $<\n\n"); T_FileStream_writeLine(makefile, tmp); + + T_FileStream_writeLine(makefile, "# 'ALLDATAOBJ' contains all .c data structures\n"); + + sprintf(tmp, "ALLDATAOBJ= $(NAME)all%s \n\n", OBJ_SUFFIX); + T_FileStream_writeLine(makefile, tmp); +#endif + sprintf(tmp, "TOCSYM= $(ENTRYPOINT)_dat \n\n"); /* entrypoint not always shortname! */ T_FileStream_writeLine(makefile, tmp); T_FileStream_writeLine(makefile, "BASE_OBJECTS= $(TOCOBJ) "); +#ifdef OS400 + T_FileStream_writeLine(makefile, "$(ALLDATAOBJ) "); +#else pkg_writeCharListWrap(makefile, objects, " ", " \\\n",0); +#endif + pkg_mak_writeAssemblyFooter(makefile, o); + T_FileStream_writeLine(makefile, "\n\n"); T_FileStream_writeLine(makefile, "OBJECTS=$(BASE_OBJECTS:%=$(TEMP_PATH)%)\n\n"); diff --git a/icuSources/tools/pkgdata/winmode.c b/icuSources/tools/pkgdata/winmode.c index f2e5bc14..11e922ca 100644 --- a/icuSources/tools/pkgdata/winmode.c +++ b/icuSources/tools/pkgdata/winmode.c @@ -1,6 +1,6 @@ /****************************************************************************** * -* Copyright (C) 2000-2003, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -16,9 +16,10 @@ * (DLL, common data, etc.) */ -#include -#include #include "unicode/utypes.h" + +#ifdef U_MAKE_IS_NMAKE + #include "unicode/putil.h" #include "cmemory.h" #include "cstring.h" @@ -28,19 +29,30 @@ #include "uoptions.h" #include "pkgtypes.h" #include "makefile.h" +#include +#include -#ifdef WIN32 -#define WINBUILDMODE (*(o->options)=='R'?"Release":"Debug") +/*#define WINBUILDMODE (*(o->options)=='R'?"Release":"Debug")*/ +#define CONTAINS_REAL_PATH(o) (*(o->options)==PKGDATA_DERIVED_PATH) void writeCmnRules(UPKGOptions *o, FileStream *makefile) { char tmp[1024]; CharList *infiles; - infiles = o->filePaths; - - sprintf(tmp, "\"$(TARGETDIR)\\$(CMNTARGET)\" : $(DATAFILEPATHS)\n\t@\"$(GENCMN)\" -C \"%s\" -d \"%s\" -n \"$(NAME)\" 0 <<\n", - o->comment, o->targetDir); + if(!o->embed) { + infiles = o->files; + } else { + infiles = o->filePaths; + } + sprintf(tmp, "\"$(TARGETDIR)\\$(CMNTARGET)\" : $(DATAFILEPATHS)\n" + "\t%s\"$(GENCMN)\" %s%s%s-d \"$(TARGETDIR)\" %s %s -n \"$(NAME)\" 0 <<\n", + (o->verbose ? "" : "@"), + (o->comment ? "-C \"" : ""), + (o->comment ? o->comment : ""), + (o->comment ? "\" " : ""), + (o->embed ? "-E" : ""), + o->embed ? "" : "-s \"$(SRCDIR)\""); T_FileStream_writeLine(makefile, tmp); pkg_writeCharList(makefile, infiles, "\n", -1); @@ -74,13 +86,22 @@ void pkg_mode_windows(UPKGOptions *o, FileStream *makefile, UErrorCode *status) sprintf(tmp2, "ICUROOT=%s\n\n", o->icuroot); T_FileStream_writeLine(makefile, tmp2); - sprintf(tmp2, - "GENCMN = $(ICUROOT)%sbin\\gencmn.exe\n", separator); + if (CONTAINS_REAL_PATH(o)) { + sprintf(tmp2, + "GENCMN = $(ICUROOT)%sgencmn.exe\n", separator); + } + else { + sprintf(tmp2, + "GENCMN = $(ICUROOT)%sbin\\gencmn.exe\n", separator); + } T_FileStream_writeLine(makefile, tmp2); if(isDll) { uprv_strcpy(tmp, LIB_PREFIX); - uprv_strcat(tmp, o->cShortName); + uprv_strcat(tmp, o->libName); + if (o->version) { + uprv_strcat(tmp, "$(TARGET_VERSION)"); + } uprv_strcat(tmp, UDATA_SO_SUFFIX); if(o->nooutput || o->verbose) { @@ -97,19 +118,29 @@ void pkg_mode_windows(UPKGOptions *o, FileStream *makefile, UErrorCode *status) sprintf(tmp2, "LINK32 = link.exe\n" - "LINK32_FLAGS = /nologo /out:\"$(TARGETDIR)\\$(DLLTARGET)\" /DLL /NOENTRY /base:\"0x4ad00000\" /implib:\"$(TARGETDIR)\\$(ENTRYPOINT).lib\" /comment:\"%s\"\n", + "LINK32_FLAGS = /nologo /out:\"$(TARGETDIR)\\$(DLLTARGET)\" /DLL /NOENTRY /base:\"0x4ad00000\" /implib:\"$(TARGETDIR)\\$(LIBNAME).lib\" %s%s%s\n", + (o->comment ? "/comment:\"" : ""), + (o->comment ? o->comment : ""), + (o->comment ? "\"" : ""), o->comment ); T_FileStream_writeLine(makefile, tmp2); - sprintf(tmp2, - "GENCCODE = $(ICUROOT)%sbin\\genccode.exe\n", separator); + if (CONTAINS_REAL_PATH(o)) { + sprintf(tmp2, + "GENCCODE = $(ICUROOT)%sgenccode.exe\n", separator); + } + else { + sprintf(tmp2, + "GENCCODE = $(ICUROOT)%sbin\\genccode.exe\n", separator); + } T_FileStream_writeLine(makefile, tmp2); + /* If you modify this, remember to modify makedata.mak too. */ T_FileStream_writeLine(makefile, "\n" "# Windows specific DLL version information.\n" - "!IF EXISTS(\".\\$(NAME)_icudata.res\")\n" - "DATA_VER_INFO=\".\\$(NAME)_icudata.res\"\n" + "!IF EXISTS(\"$(TEMP_DIR)\\icudata.res\")\n" + "DATA_VER_INFO=\"$(TEMP_DIR)\\icudata.res\"\n" "!ELSE\n" "DATA_VER_INFO=\n" "!ENDIF\n\n"); @@ -123,10 +154,12 @@ void pkg_mode_windows(UPKGOptions *o, FileStream *makefile, UErrorCode *status) else if (isStatic) { uprv_strcpy(tmp, LIB_PREFIX); - uprv_strcat(tmp, o->cShortName); + uprv_strcat(tmp, o->libName); uprv_strcat(tmp, UDATA_LIB_SUFFIX); - pkg_sttc_writeReadme(o, tmp, status); + if (!o->quiet) { + pkg_sttc_writeReadme(o, tmp, status); + } if(U_FAILURE(*status)) { return; @@ -147,30 +180,31 @@ void pkg_mode_windows(UPKGOptions *o, FileStream *makefile, UErrorCode *status) sprintf(tmp2, "LINK32 = LIB.exe\n" "LINK32_FLAGS = /nologo /out:\"$(TARGETDIR)\\$(DLLTARGET)\" /EXPORT:\"%s\"\n", - o->cShortName + o->libName ); T_FileStream_writeLine(makefile, tmp2); - sprintf(tmp2, - "GENCCODE = $(ICUROOT)%sbin\\genccode.exe\n", separator); - T_FileStream_writeLine(makefile, tmp2); - - T_FileStream_writeLine(makefile, "\n" - "# Windows specific LIB version information.\n" - "!IF EXISTS(\".\\$(NAME)_icudata.res\")\n" - "DATA_VER_INFO=\".\\$(NAME)_icudata.res\"\n" - "!ELSE\n" - "DATA_VER_INFO=\n" - "!ENDIF\n\n"); + if (CONTAINS_REAL_PATH(o)) { + sprintf(tmp2, + "GENCCODE = $(ICUROOT)%sgenccode.exe\n", separator); + } + else { + sprintf(tmp2, + "GENCCODE = $(ICUROOT)%sbin\\genccode.exe\n", separator); + } + T_FileStream_writeLine(makefile, tmp2); uprv_strcpy(tmp, UDATA_CMN_PREFIX "$(NAME)" UDATA_CMN_INTERMEDIATE_SUFFIX OBJ_SUFFIX); - sprintf(tmp2, "# intermediate obj file:\nCMNOBJTARGET=%s\n\n", tmp); + sprintf(tmp2, "# intermediate obj file\nCMNOBJTARGET=%s\n\n", tmp); T_FileStream_writeLine(makefile, tmp2); } uprv_strcpy(tmp, UDATA_CMN_PREFIX); uprv_strcat(tmp, o->cShortName); + if (o->version && !uprv_strstr(o->shortName,o->version)) { + uprv_strcat(tmp, "$(TARGET_VERSION)"); + } uprv_strcat(tmp, UDATA_CMN_SUFFIX); if(o->nooutput || o->verbose) { @@ -190,11 +224,11 @@ void pkg_mode_windows(UPKGOptions *o, FileStream *makefile, UErrorCode *status) sprintf(tmp, "all: \"$(TARGETDIR)\\$(DLLTARGET)\"\n\n"); T_FileStream_writeLine(makefile, tmp); - sprintf(tmp, "\"$(TARGETDIR)\\$(DLLTARGET)\": \"$(TARGETDIR)\\$(CMNOBJTARGET)\"\n" - "\t$(LINK32) $(LINK32_FLAGS) \"$(TARGETDIR)\\$(CMNOBJTARGET)\" $(DATA_VER_INFO)\n\n"); + sprintf(tmp, "\"$(TARGETDIR)\\$(DLLTARGET)\": \"$(TEMP_DIR)\\$(CMNOBJTARGET)\"\n" + "\t$(LINK32) $(LINK32_FLAGS) \"$(TEMP_DIR)\\$(CMNOBJTARGET)\" $(DATA_VER_INFO)\n\n"); T_FileStream_writeLine(makefile, tmp); - sprintf(tmp, "\"$(TARGETDIR)\\$(CMNOBJTARGET)\": \"$(TARGETDIR)\\$(CMNTARGET)\"\n" - "\t@\"$(GENCCODE)\" $(GENCOPTIONS) -e $(ENTRYPOINT) -o -d \"$(TARGETDIR)\" \"$(TARGETDIR)\\$(CMNTARGET)\"\n\n"); + sprintf(tmp, "\"$(TEMP_DIR)\\$(CMNOBJTARGET)\": \"$(TARGETDIR)\\$(CMNTARGET)\"\n" + "\t@\"$(GENCCODE)\" $(GENCOPTIONS) -e $(ENTRYPOINT) -o -d \"$(TEMP_DIR)\" \"$(TARGETDIR)\\$(CMNTARGET)\"\n\n"); T_FileStream_writeLine(makefile, tmp); sprintf(tmp2, @@ -203,6 +237,9 @@ void pkg_mode_windows(UPKGOptions *o, FileStream *makefile, UErrorCode *status) "\t-@erase \"$(TARGETDIR)\\$(CMNOBJTARGET)\"\n" "\t-@erase \"$(TARGETDIR)\\$(CMNTARGET)\"\n\n"); T_FileStream_writeLine(makefile, tmp2); + + T_FileStream_writeLine(makefile, "install: \"$(TARGETDIR)\\$(DLLTARGET)\"\n" + "\tcopy \"$(TARGETDIR)\\$(DLLTARGET)\" \"$(INSTALLTO)\\$(DLLTARGET)\"\n\n"); } else { /* common */ sprintf(tmp, "all: \"$(TARGETDIR)\\$(CMNTARGET)\"\n\n"); T_FileStream_writeLine(makefile, tmp); @@ -211,10 +248,12 @@ void pkg_mode_windows(UPKGOptions *o, FileStream *makefile, UErrorCode *status) "clean:\n" "\t-@erase \"$(TARGETDIR)\\$(CMNTARGET)\"\n\n"); T_FileStream_writeLine(makefile, tmp2); + + T_FileStream_writeLine(makefile, "install: \"$(TARGETDIR)\\$(CMNTARGET)\"\n" + "\tcopy \"$(TARGETDIR)\\$(CMNTARGET)\" \"$(INSTALLTO)\\$(CMNTARGET)\"\n\n"); } - sprintf(tmp2, "rebuild: clean all\n\n"); - T_FileStream_writeLine(makefile, tmp2); + T_FileStream_writeLine(makefile, "rebuild: clean all\n\n"); /* Write compile rules */ writeCmnRules(o, makefile); diff --git a/icuSources/tools/toolutil/Makefile.in b/icuSources/tools/toolutil/Makefile.in index b41a9e95..0c1a43fb 100644 --- a/icuSources/tools/toolutil/Makefile.in +++ b/icuSources/tools/toolutil/Makefile.in @@ -1,4 +1,4 @@ -## Copyright (C) 1999-2003, International Business Machines Corporation +## Copyright (C) 1999-2004, International Business Machines Corporation ## and others. All Rights Reserved. ## Makefile.in for ICU - tools/toolutil @@ -16,16 +16,18 @@ include $(top_builddir)/icudefs.mk subdir = tools/toolutil ## Extra files to remove for 'make clean' -CLEANFILES = *~ $(DEPS) +CLEANFILES = *~ $(DEPS) $(IMPORT_LIB) $(MIDDLE_IMPORT_LIB) $(FINAL_IMPORT_LIB) ## Target information +TARGET_STUBNAME=$(TOOLUTIL_STUBNAME) + ifneq ($(ENABLE_STATIC),) -TARGET = $(LIBICU)toolutil$(ICULIBSUFFIX).a +TARGET = $(LIBDIR)/$(LIBSICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX).$(A) endif ifneq ($(ENABLE_SHARED),) -SO_TARGET = $(LIBICU)toolutil$(ICULIBSUFFIX).$(SO) +SO_TARGET = $(LIBDIR)/$(LIBICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX).$(SO) ALL_SO_TARGETS = $(SO_TARGET) $(MIDDLE_SO_TARGET) $(FINAL_SO_TARGET) endif @@ -35,10 +37,11 @@ DYNAMICCPPFLAGS = $(SHAREDLIBCPPFLAGS) DYNAMICCFLAGS = $(SHAREDLIBCFLAGS) DYNAMICCXXFLAGS = $(SHAREDLIBCXXFLAGS) -CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common -I$(top_srcdir)/i18n -I$(top_srcdir)/tools/ctestfw $(LIBCPPFLAGS) +LDFLAGS += $(LDFLAGSICUTOOLUTIL) +CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common $(LIBCPPFLAGS) LIBS = $(LIBICUUC) $(DEFAULT_LIBS) -OBJECTS = toolutil.o unewdata.o ucmpwrit.o uoptions.o uparse.o ucbuf.o uperf.o +OBJECTS = propsvec.o toolutil.o unewdata.o ucm.o ucmstate.o ucmpwrit.o uoptions.o uparse.o ucbuf.o uperf.o STATIC_OBJECTS = $(OBJECTS:.o=.$(STATIC_O)) @@ -66,13 +69,15 @@ install-local: install-library install-library: all-local $(MKINSTALLDIRS) $(DESTDIR)$(libdir) ifneq ($(ENABLE_STATIC),) - $(INSTALL-L) $(TARGET) $(DESTDIR)$(libdir)/$(TARGET) + $(INSTALL-L) $(TARGET) $(DESTDIR)$(libdir) endif ifneq ($(ENABLE_SHARED),) - $(INSTALL-L) $(FINAL_SO_TARGET) $(DESTDIR)$(libdir)/$(FINAL_SO_TARGET) + $(INSTALL-L) $(FINAL_SO_TARGET) $(DESTDIR)$(libdir) ifneq ($(FINAL_SO_TARGET),$(SO_TARGET)) - cd $(DESTDIR)$(libdir) && $(RM) $(MIDDLE_SO_TARGET) && ln -s $(FINAL_SO_TARGET) $(MIDDLE_SO_TARGET) - cd $(DESTDIR)$(libdir) && $(RM) $(SO_TARGET) && ln -s $(FINAL_SO_TARGET) $(SO_TARGET) + cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(SO_TARGET)) && ln -s $(notdir $(FINAL_SO_TARGET)) $(notdir $(SO_TARGET)) +ifneq ($(FINAL_SO_TARGET),$(MIDDLE_SO_TARGET)) + cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(MIDDLE_SO_TARGET)) && ln -s $(notdir $(FINAL_SO_TARGET)) $(notdir $(MIDDLE_SO_TARGET)) +endif endif endif diff --git a/icuSources/tools/genprops/propsvec.c b/icuSources/tools/toolutil/propsvec.c similarity index 72% rename from icuSources/tools/genprops/propsvec.c rename to icuSources/tools/toolutil/propsvec.c index 699fb8fc..84fb3311 100644 --- a/icuSources/tools/genprops/propsvec.c +++ b/icuSources/tools/toolutil/propsvec.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2002, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -20,26 +20,49 @@ #include "unicode/utypes.h" #include "cmemory.h" #include "utrie.h" -#include "uprops.h" +#include "uarrsort.h" #include "propsvec.h" static uint32_t * -_findRow(uint32_t *pv, uint32_t rangeStart) { +_findRow(uint32_t *pv, UChar32 rangeStart) { uint32_t *row; - int32_t columns, i, start, limit; - - columns=(int32_t)pv[UPVEC_COLUMNS]; - limit=(int32_t)pv[UPVEC_ROWS]; + int32_t *hdr; + int32_t columns, i, start, limit, prevRow, rows; + + hdr=(int32_t *)pv; + columns=hdr[UPVEC_COLUMNS]; + limit=hdr[UPVEC_ROWS]; + prevRow=hdr[UPVEC_PREV_ROW]; + rows=hdr[UPVEC_ROWS]; pv+=UPVEC_HEADER_LENGTH; + /* check the vicinity of the last-seen row */ + if(prevRow=(UChar32)row[0]) { + if(rangeStart<(UChar32)row[1]) { + /* same row as last seen */ + return row; + } else if( + ++prevRow=(UChar32)(row+=columns)[0] && rangeStart<(UChar32)row[1] + ) { + /* next row after the last one */ + hdr[UPVEC_PREV_ROW]=prevRow; + return row; + } + } + } + /* do a binary search for the start of the range */ start=0; while(startlimit || limit>0x110000 || + start<0 || start>limit || limit>0x110000 || column<0 || (uint32_t)(column+1)>=pv[UPVEC_COLUMNS] ) { *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; @@ -116,7 +140,7 @@ upvec_setValue(uint32_t *pv, } /* initialize */ - columns=pv[UPVEC_COLUMNS]; + columns=(int32_t)pv[UPVEC_COLUMNS]; column+=2; /* skip range start and limit columns */ value&=mask; @@ -127,7 +151,7 @@ upvec_setValue(uint32_t *pv, /* find the last row, always successful */ lastRow=firstRow; - while(limit>lastRow[1]) { + while(limit>(UChar32)lastRow[1]) { lastRow+=columns; } @@ -136,8 +160,8 @@ upvec_setValue(uint32_t *pv, * input range (only possible for the first and last rows) * and if their value differs from the input value. */ - splitFirstRow= (UBool)(start!=firstRow[0] && value!=(firstRow[column]&mask)); - splitLastRow= (UBool)(limit!=lastRow[1] && value!=(lastRow[column]&mask)); + splitFirstRow= (UBool)(start!=(UChar32)firstRow[0] && value!=(firstRow[column]&mask)); + splitLastRow= (UBool)(limit!=(UChar32)lastRow[1] && value!=(lastRow[column]&mask)); /* split first/last rows if necessary */ if(splitFirstRow || splitLastRow) { @@ -167,7 +191,7 @@ upvec_setValue(uint32_t *pv, lastRow+=columns; /* split the range and move the firstRow pointer */ - firstRow[1]=firstRow[columns]=start; + firstRow[1]=firstRow[columns]=(uint32_t)start; firstRow+=columns; } @@ -177,10 +201,13 @@ upvec_setValue(uint32_t *pv, uprv_memcpy(lastRow+columns, lastRow, columns*4); /* split the range and move the firstRow pointer */ - lastRow[1]=lastRow[columns]=limit; + lastRow[1]=lastRow[columns]=(uint32_t)limit; } } + /* set the "row last seen" to the last row for the range */ + pv[UPVEC_PREV_ROW]=(uint32_t)((lastRow-(pv+UPVEC_HEADER_LENGTH))/columns); + /* set the input value in all remaining rows */ firstRow+=column; lastRow+=column; @@ -195,9 +222,20 @@ upvec_setValue(uint32_t *pv, return TRUE; } -U_CFUNC uint32_t * +U_CAPI uint32_t U_EXPORT2 +upvec_getValue(uint32_t *pv, UChar32 c, int32_t column) { + uint32_t *row; + + if(pv==NULL || c<0 || c>=0x110000) { + return 0; + } + row=_findRow(pv, c); + return row[2+column]; +} + +U_CAPI uint32_t * U_EXPORT2 upvec_getRow(uint32_t *pv, int32_t rowIndex, - uint32_t *pRangeStart, uint32_t *pRangeLimit) { + UChar32 *pRangeStart, UChar32 *pRangeLimit) { uint32_t *row; int32_t columns; @@ -205,7 +243,7 @@ upvec_getRow(uint32_t *pv, int32_t rowIndex, return NULL; } - columns=pv[UPVEC_COLUMNS]; + columns=(int32_t)pv[UPVEC_COLUMNS]; row=pv+UPVEC_HEADER_LENGTH+rowIndex*columns; if(pRangeStart!=NULL) { *pRangeStart=row[0]; @@ -216,12 +254,13 @@ upvec_getRow(uint32_t *pv, int32_t rowIndex, return row+2; } -static int -upvec_compareRows(const void *l, const void *r) { +static int32_t U_CALLCONV +upvec_compareRows(const void *context, const void *l, const void *r) { const uint32_t *left=(const uint32_t *)l, *right=(const uint32_t *)r; + const uint32_t *pv=(const uint32_t *)context; int32_t i, count, columns; - count=columns=2+UPROPS_VECTOR_WORDS; + count=columns=(int32_t)pv[UPVEC_COLUMNS]; /* includes start/limit columns */ /* start comparing after start/limit but wrap around to them */ i=2; @@ -237,7 +276,7 @@ upvec_compareRows(const void *l, const void *r) { return 0; } -U_CFUNC int32_t +U_CAPI int32_t U_EXPORT2 upvec_toTrie(uint32_t *pv, UNewTrie *trie, UErrorCode *pErrorCode) { uint32_t *row; int32_t columns, valueColumns, rows, count; @@ -258,7 +297,11 @@ upvec_toTrie(uint32_t *pv, UNewTrie *trie, UErrorCode *pErrorCode) { /* sort the properties vectors to find unique vector values */ if(rows>1) { - qsort(pv+UPVEC_HEADER_LENGTH, rows, columns*4, upvec_compareRows); + uprv_sortArray(pv+UPVEC_HEADER_LENGTH, rows, columns*4, + upvec_compareRows, pv, FALSE, pErrorCode); + } + if(U_FAILURE(*pErrorCode)) { + return 0; } /* diff --git a/icuSources/tools/genprops/propsvec.h b/icuSources/tools/toolutil/propsvec.h similarity index 70% rename from icuSources/tools/genprops/propsvec.h rename to icuSources/tools/toolutil/propsvec.h index 05f10ead..86d214f9 100644 --- a/icuSources/tools/genprops/propsvec.h +++ b/icuSources/tools/toolutil/propsvec.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2002, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -39,31 +39,40 @@ * but self-contained rows allow to later sort them by contents. */ enum { + /* stores number of columns, plus two for start & limit values */ UPVEC_COLUMNS, UPVEC_MAXROWS, UPVEC_ROWS, - UPVEC_RESERVED, + /* search optimization: remember last row seen */ + UPVEC_PREV_ROW, UPVEC_HEADER_LENGTH }; -U_CFUNC uint32_t * +U_CAPI uint32_t * U_EXPORT2 upvec_open(int32_t columns, int32_t maxRows); -U_CFUNC void +U_CAPI void U_EXPORT2 upvec_close(uint32_t *pv); -U_CFUNC UBool +U_CAPI UBool U_EXPORT2 upvec_setValue(uint32_t *pv, - uint32_t start, uint32_t limit, + UChar32 start, UChar32 limit, int32_t column, uint32_t value, uint32_t mask, UErrorCode *pErrorCode); -U_CFUNC uint32_t * +U_CAPI uint32_t U_EXPORT2 +upvec_getValue(uint32_t *pv, UChar32 c, int32_t column); + +/* + * pRangeStart and pRangeLimit can be NULL. + * @return NULL if rowIndex out of range and for illegal arguments + */ +U_CAPI uint32_t * U_EXPORT2 upvec_getRow(uint32_t *pv, int32_t rowIndex, - uint32_t *pRangeStart, uint32_t *pRangeLimit); + UChar32 *pRangeStart, UChar32 *pRangeLimit); -U_CFUNC int32_t +U_CAPI int32_t U_EXPORT2 upvec_toTrie(uint32_t *pv, UNewTrie *trie, UErrorCode *pErrorCode); #endif diff --git a/icuSources/tools/toolutil/toolutil.c b/icuSources/tools/toolutil/toolutil.c index 900a43a0..8703445c 100644 --- a/icuSources/tools/toolutil/toolutil.c +++ b/icuSources/tools/toolutil/toolutil.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -19,13 +19,13 @@ #ifdef WIN32 # define VC_EXTRALEAN # define WIN32_LEAN_AND_MEAN -# define NOGDI # define NOUSER # define NOSERVICE # define NOIME # define NOMCX # include #endif +#include #include "unicode/utypes.h" #include "unicode/putil.h" #include "cmemory.h" @@ -58,18 +58,133 @@ getLongPathname(const char *pathname) { U_CAPI const char * U_EXPORT2 findBasename(const char *filename) { const char *basename=uprv_strrchr(filename, U_FILE_SEP_CHAR); - if(basename!=NULL) { - return basename+1; - } else { -#ifdef WIN32 + +#if U_FILE_ALT_SEP_CHAR!=U_FILE_SEP_CHAR + if(basename==NULL) { /* Use lenient matching on Windows, which can accept either \ or / - This is useful for CygWin environments which has both + This is useful for environments like Win32+CygWin which have both. */ - basename=uprv_strrchr(filename, '/'); - if(basename!=NULL) { - return basename+1; - } + basename=uprv_strrchr(filename, U_FILE_ALT_SEP_CHAR); + } #endif + + if(basename!=NULL) { + return basename+1; + } else { return filename; } } + +/* tool memory helper ------------------------------------------------------- */ + +struct UToolMemory { + char name[64]; + int32_t capacity, maxCapacity, size, index; + void *array; + UAlignedMemory staticArray[1]; +}; + +U_CAPI UToolMemory * U_EXPORT2 +utm_open(const char *name, int32_t initialCapacity, int32_t maxCapacity, int32_t size) { + UToolMemory *mem; + + if(maxCapacityarray=mem->staticArray; + + uprv_strcpy(mem->name, name); + mem->capacity=initialCapacity; + mem->maxCapacity=maxCapacity; + mem->size=size; + mem->index=0; + return mem; +} + +U_CAPI void U_EXPORT2 +utm_close(UToolMemory *mem) { + if(mem!=NULL) { + if(mem->array!=mem->staticArray) { + uprv_free(mem->array); + } + uprv_free(mem); + } +} + + +U_CAPI void * U_EXPORT2 +utm_getStart(UToolMemory *mem) { + return (char *)mem->array; +} + +U_CAPI int32_t U_EXPORT2 +utm_countItems(UToolMemory *mem) { + return mem->index; +} + + +static UBool +utm_hasCapacity(UToolMemory *mem, int32_t capacity) { + if(mem->capacitymaxCapacityname, (long)mem->maxCapacity); + exit(U_MEMORY_ALLOCATION_ERROR); + } + + /* try to allocate a larger array */ + if(capacity>=2*mem->capacity) { + newCapacity=capacity; + } else if(mem->capacity<=mem->maxCapacity/3) { + newCapacity=2*mem->capacity; + } else { + newCapacity=mem->maxCapacity; + } + + if(mem->array==mem->staticArray) { + mem->array=uprv_malloc(newCapacity*mem->size); + if(mem->array!=NULL) { + uprv_memcpy(mem->array, mem->staticArray, mem->index*mem->size); + } + } else { + mem->array=uprv_realloc(mem->array, newCapacity*mem->size); + } + + if(mem->array==NULL) { + fprintf(stderr, "error: %s - out of memory\n", mem->name); + exit(U_MEMORY_ALLOCATION_ERROR); + } + } + + return TRUE; +} + +U_CAPI void * U_EXPORT2 +utm_alloc(UToolMemory *mem) { + char *p=(char *)mem->array+mem->index*mem->size; + int32_t newIndex=mem->index+1; + if(utm_hasCapacity(mem, newIndex)) { + mem->index=newIndex; + uprv_memset(p, 0, mem->size); + } + return p; +} + +U_CAPI void * U_EXPORT2 +utm_allocN(UToolMemory *mem, int32_t n) { + char *p=(char *)mem->array+mem->index*mem->size; + int32_t newIndex=mem->index+n; + if(utm_hasCapacity(mem, newIndex)) { + mem->index=newIndex; + uprv_memset(p, 0, n*mem->size); + } + return p; +} diff --git a/icuSources/tools/toolutil/toolutil.dsp b/icuSources/tools/toolutil/toolutil.dsp index 003abf1f..1ff0f1a1 100644 --- a/icuSources/tools/toolutil/toolutil.dsp +++ b/icuSources/tools/toolutil/toolutil.dsp @@ -56,7 +56,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 kernel32.lib /nologo /dll /machine:I386 /out:"..\..\..\bin\icutu26.dll" /implib:"..\..\..\lib/icutu.lib" /libpath:"..\..\..\lib" +# ADD LINK32 kernel32.lib /nologo /dll /machine:I386 /out:"..\..\..\bin\icutu32.dll" /implib:"..\..\..\lib/icutu.lib" /libpath:"..\..\..\lib" # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "toolutil - Win32 Debug" @@ -84,7 +84,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib /nologo /dll /debug /machine:I386 /out:"..\..\..\bin\icutu26d.dll" /implib:"..\..\..\lib/icutud.lib" /pdbtype:sept /libpath:"..\..\..\lib" +# ADD LINK32 kernel32.lib /nologo /dll /debug /machine:I386 /out:"..\..\..\bin\icutu32d.dll" /implib:"..\..\..\lib/icutud.lib" /pdbtype:sept /libpath:"..\..\..\lib" # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "toolutil - Win64 Release" @@ -101,7 +101,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TOOLUTIL_EXPORTS" /FD /c -# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /Op /I "..\..\common" /D "NDEBUG" /D "WIN64" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Zm600 /c +# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /Op /I "..\..\common" /D "NDEBUG" /D "WIN64" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Zm600 /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win64 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win64 @@ -112,7 +112,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:IX86 /machine:IA64 -# ADD LINK32 kernel32.lib /nologo /dll /machine:IX86 /out:"..\..\..\bin\icutu26.dll" /implib:"..\..\..\lib/icutu.lib" /libpath:"..\..\..\lib" /machine:IA64 +# ADD LINK32 kernel32.lib /nologo /dll /machine:IX86 /out:"..\..\..\bin\icutu32.dll" /implib:"..\..\..\lib/icutu.lib" /libpath:"..\..\..\lib" /machine:IA64 !ELSEIF "$(CFG)" == "toolutil - Win64 Debug" @@ -128,7 +128,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TOOLUTIL_EXPORTS" /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /Op /I "..\..\common" /D "_DEBUG" /D "WIN64" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /GZ /QIA64_fmaopt /Zm600 /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /Op /I "..\..\common" /D "_DEBUG" /D "WIN64" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /GZ /Zm600 /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win64 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win64 @@ -139,7 +139,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:IX86 /pdbtype:sept /machine:IA64 -# ADD LINK32 kernel32.lib /nologo /dll /incremental:no /debug /machine:IX86 /out:"..\..\..\bin\icutu26d.dll" /implib:"..\..\..\lib/icutud.lib" /pdbtype:sept /libpath:"..\..\..\lib" /machine:IA64 +# ADD LINK32 kernel32.lib /nologo /dll /incremental:no /debug /machine:IX86 /out:"..\..\..\bin\icutu32d.dll" /implib:"..\..\..\lib/icutud.lib" /pdbtype:sept /libpath:"..\..\..\lib" /machine:IA64 !ENDIF @@ -154,6 +154,10 @@ LINK32=link.exe # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File +SOURCE=.\propsvec.c +# End Source File +# Begin Source File + SOURCE=.\toolutil.c # ADD CPP /Ze # End Source File @@ -163,10 +167,18 @@ SOURCE=.\ucbuf.c # End Source File # Begin Source File +SOURCE=.\ucm.c +# End Source File +# Begin Source File + SOURCE=.\ucmpwrit.c # End Source File # Begin Source File +SOURCE=.\ucmstate.c +# End Source File +# Begin Source File + SOURCE=.\unewdata.c # End Source File # Begin Source File @@ -187,6 +199,10 @@ SOURCE=.\uperf.cpp # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File +SOURCE=.\propsvec.h +# End Source File +# Begin Source File + SOURCE=.\toolutil.h # End Source File # Begin Source File @@ -195,6 +211,10 @@ SOURCE=.\ucbuf.h # End Source File # Begin Source File +SOURCE=.\ucm.h +# End Source File +# Begin Source File + SOURCE=.\ucmpwrit.h # End Source File # Begin Source File diff --git a/icuSources/tools/toolutil/toolutil.h b/icuSources/tools/toolutil/toolutil.h index 23263396..147d2aa5 100644 --- a/icuSources/tools/toolutil/toolutil.h +++ b/icuSources/tools/toolutil/toolutil.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1999-2000, International Business Machines +* Copyright (C) 1999-2003, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -21,8 +21,6 @@ #include "unicode/utypes.h" - - /* * For Windows, a path/filename may be the short (8.3) version * of the "real", long one. In this case, the short one @@ -51,4 +49,55 @@ getLongPathname(const char *pathname); U_CAPI const char * U_EXPORT2 findBasename(const char *filename); +/* + * UToolMemory is used for generic, custom memory management. + * It is allocated with enough space for count*size bytes starting + * at array. + * The array is declared with a union of large data types so + * that its base address is aligned for any types. + * If size is a multiple of a data type size, then such items + * can be safely allocated inside the array, at offsets that + * are themselves multiples of size. + */ +struct UToolMemory; +typedef struct UToolMemory UToolMemory; + +/** + * Open a UToolMemory object for allocation of initialCapacity to maxCapacity + * items with size bytes each. + */ +U_CAPI UToolMemory * U_EXPORT2 +utm_open(const char *name, int32_t initialCapacity, int32_t maxCapacity, int32_t size); + +/** + * Close a UToolMemory object. + */ +U_CAPI void U_EXPORT2 +utm_close(UToolMemory *mem); + +/** + * Get the pointer to the beginning of the array of items. + * The pointer becomes invalid after allocation of new items. + */ +U_CAPI void * U_EXPORT2 +utm_getStart(UToolMemory *mem); + +/** + * Get the current number of items. + */ +U_CAPI int32_t U_EXPORT2 +utm_countItems(UToolMemory *mem); + +/** + * Allocate one more item and return the pointer to its start in the array. + */ +U_CAPI void * U_EXPORT2 +utm_alloc(UToolMemory *mem); + +/** + * Allocate n items and return the pointer to the start of the first one in the array. + */ +U_CAPI void * U_EXPORT2 +utm_allocN(UToolMemory *mem, int32_t n); + #endif diff --git a/icuSources/tools/toolutil/toolutil.vcproj b/icuSources/tools/toolutil/toolutil.vcproj index 3dff7d8e..bdb70d41 100644 --- a/icuSources/tools/toolutil/toolutil.vcproj +++ b/icuSources/tools/toolutil/toolutil.vcproj @@ -1,7 +1,7 @@ - + @@ -39,19 +39,20 @@ + ProgramDatabaseFile=".\..\..\..\lib\icutu32.pdb" + BaseAddress="0x4ac00000" + ImportLibrary="..\..\..\lib\icutu.lib"/> + TypeLibraryName=".\..\..\..\lib\icutu.tlb"/> + + + + ProgramDatabaseFile=".\..\..\..\lib\icutu32d.pdb" + BaseAddress="0x4ac00000" + ImportLibrary="..\..\..\lib\icutud.lib"/> + TypeLibraryName=".\..\..\..\lib\icutud.tlb"/> + + + + + + + + + + + @@ -155,12 +180,18 @@ + + + + diff --git a/icuSources/tools/toolutil/ucbuf.c b/icuSources/tools/toolutil/ucbuf.c index 17a77894..111fd584 100644 --- a/icuSources/tools/toolutil/ucbuf.c +++ b/icuSources/tools/toolutil/ucbuf.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1998-2003, International Business Machines +* Copyright (C) 1998-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -16,6 +16,7 @@ */ #include "unicode/utypes.h" +#include "unicode/putil.h" #include "unicode/ucnv.h" #include "unicode/ucnv_err.h" #include "filestrm.h" @@ -76,7 +77,7 @@ ucbuf_autodetect_fs(FileStream* in, const char** cp, UConverter** conv, int32_t* pTarget = target; pStart = start; ucnv_toUnicode(*conv, &pTarget, target+1, &pStart, start+*signatureLength, NULL, FALSE, error); - *signatureLength = pStart - start; + *signatureLength = (int32_t)(pStart - start); if(*error==U_BUFFER_OVERFLOW_ERROR) { *error=U_ZERO_ERROR; } @@ -87,7 +88,6 @@ ucbuf_autodetect_fs(FileStream* in, const char** cp, UConverter** conv, int32_t* } - return TRUE; } static UBool ucbuf_isCPKnown(const char* cp){ @@ -112,13 +112,10 @@ static UBool ucbuf_isCPKnown(const char* cp){ if(ucnv_compareNames("UTF-32LE",cp)==0){ return TRUE; } - if(ucnv_compareNames("UTF-32BE",cp)==0){ - return TRUE; - } if(ucnv_compareNames("SCSU",cp)==0){ return TRUE; } - if(ucnv_compareNames("BOCU",cp)==0){ + if(ucnv_compareNames("BOCU-1",cp)==0){ return TRUE; } if(ucnv_compareNames("UTF-7",cp)==0){ @@ -305,6 +302,7 @@ ucbuf_fillucbuf( UCHARBUF* buf,UErrorCode* error){ } buf->currentPos = pTarget; buf->bufLimit=pTarget+outputWritten; + *buf->bufLimit=0; /*NUL terminate*/ if(cbuf!=carr){ uprv_free(cbuf); } @@ -410,16 +408,16 @@ ucbuf_getcx32(UCHARBUF* buf,UErrorCode* error) { * to c32 or not */ if(c32==0xFFFFFFFF){ - if(buf->showWarning) { - char context[20]; - int32_t len = 20; - if(length < len) { - len = length; - } - context[len]= 0 ; /* null terminate the buffer */ - u_UCharsToChars( buf->currentPos, context, len); - fprintf(stderr,"Bad escape: [%c%s]...\n", c1,context); - } + if(buf->showWarning) { + char context[20]; + int32_t len = 20; + if(length < len) { + len = length; + } + context[len]= 0 ; /* null terminate the buffer */ + u_UCharsToChars( buf->currentPos, context, len); + fprintf(stderr,"Bad escape: [%c%s]...\n", (int)c1, context); + } *error= U_ILLEGAL_ESCAPE_SEQUENCE; return c1; }else if(c32!=c2 || (c32==0x0075 && c2==0x0075 && c1==0x005C) /* for \u0075 c2=0x0075 and c32==0x0075*/){ @@ -487,12 +485,11 @@ ucbuf_open(const char* fileName,const char** cp,UBool showWarning, UBool buffere } buf->remaining=fileSize-buf->signatureLength; if(buf->isBuffered){ - buf->buffer=(UChar*) uprv_malloc(U_SIZEOF_UCHAR* MAX_U_BUF); buf->bufCapacity=MAX_U_BUF; }else{ - buf->buffer=(UChar*) uprv_malloc(U_SIZEOF_UCHAR * (buf->remaining+buf->signatureLength)); - buf->bufCapacity=buf->remaining+buf->signatureLength; + buf->bufCapacity=buf->remaining+buf->signatureLength+1/*for terminating nul*/; } + buf->buffer=(UChar*) uprv_malloc(U_SIZEOF_UCHAR * buf->bufCapacity ); if (buf->buffer == NULL) { *error = U_MEMORY_ALLOCATION_ERROR; return NULL; @@ -611,7 +608,7 @@ ucbuf_size(UCHARBUF* buf){ if(buf->isBuffered){ return (T_FileStream_size(buf->in)-buf->signatureLength)/ucnv_getMinCharSize(buf->conv); }else{ - return buf->bufLimit-buf->buffer; + return (int32_t)(buf->bufLimit - buf->buffer); } } return 0; @@ -626,7 +623,7 @@ ucbuf_getBuffer(UCHARBUF* buf,int32_t* len,UErrorCode* error){ *error = U_ILLEGAL_ARGUMENT_ERROR; return NULL; } - *len = buf->bufLimit-buf->buffer; + *len = (int32_t)(buf->bufLimit - buf->buffer); return buf->buffer; } @@ -712,13 +709,13 @@ ucbuf_readline(UCHARBUF* buf,int32_t* len,UErrorCode* err){ UChar* savePos =NULL; UChar c=0x0000; if(buf->isBuffered){ - /* The input is buffered we have to do more - * for returning a pointer U_TRUNCATED_CHAR_FOUND + /* The input is buffered we have to do more + * for returning a pointer U_TRUNCATED_CHAR_FOUND */ for(;;){ c = *temp++; if(buf->remaining==0){ - *err = (UErrorCode) U_EOF; + return NULL; /* end of file is reached return NULL */ } if(temp>=buf->bufLimit && buf->currentPos == buf->buffer){ *err= U_TRUNCATED_CHAR_FOUND; @@ -726,7 +723,7 @@ ucbuf_readline(UCHARBUF* buf,int32_t* len,UErrorCode* err){ }else{ ucbuf_fillucbuf(buf,err); if(U_FAILURE(*err)){ - return NULL; + return NULL; } } /* @@ -735,7 +732,7 @@ ucbuf_readline(UCHARBUF* buf,int32_t* len,UErrorCode* err){ */ /* Windows CR LF */ if(c ==0x0d && temp+1<=buf->bufLimit && *(temp+1) == 0x0a ){ - *len = temp++ - buf->currentPos; + *len = (int32_t)(temp++ - buf->currentPos); savePos = buf->currentPos; buf->currentPos = temp; return savePos; @@ -743,7 +740,7 @@ ucbuf_readline(UCHARBUF* buf,int32_t* len,UErrorCode* err){ /* else */ if (temp>=buf->bufLimit|| ucbuf_isCharNewLine(c)){ /* Unipad inserts 2028 line separators! */ - *len = temp - buf->currentPos; + *len = (int32_t)(temp - buf->currentPos); savePos = buf->currentPos; buf->currentPos = temp; return savePos; @@ -757,19 +754,18 @@ ucbuf_readline(UCHARBUF* buf,int32_t* len,UErrorCode* err){ c = *temp++; if(buf->currentPos==buf->bufLimit){ - *err = (UErrorCode) U_EOF; - return NULL; + return NULL; /* end of file is reached return NULL */ } /* Windows CR LF */ if(c ==0x0d && temp+1<=buf->bufLimit && *(temp+1) == 0x0a ){ - *len = temp++ - buf->currentPos; + *len = (int32_t)(temp++ - buf->currentPos); savePos = buf->currentPos; buf->currentPos = temp; return savePos; } /* else */ if (temp>=buf->bufLimit|| ucbuf_isCharNewLine(c)) { /* Unipad inserts 2028 line separators! */ - *len = temp - buf->currentPos; + *len = (int32_t)(temp - buf->currentPos); savePos = buf->currentPos; buf->currentPos = temp; return savePos; diff --git a/icuSources/tools/toolutil/ucbuf.h b/icuSources/tools/toolutil/ucbuf.h index e8d5a768..069cd1a4 100644 --- a/icuSources/tools/toolutil/ucbuf.h +++ b/icuSources/tools/toolutil/ucbuf.h @@ -103,7 +103,7 @@ ucbuf_getcx32(UCHARBUF* buf,UErrorCode* err); * indicates a failure on entry, the function will immediately return. * On exit the value will indicate the success of the operation. * Error: U_TRUNCATED_CHAR_FOUND - * @return Pointer to the internal buffer + * @return Pointer to the internal buffer, NULL if EOF */ U_CAPI const UChar* U_EXPORT2 ucbuf_readline(UCHARBUF* buf,int32_t* len, UErrorCode* err); diff --git a/icuSources/tools/toolutil/ucm.c b/icuSources/tools/toolutil/ucm.c new file mode 100644 index 00000000..108e4325 --- /dev/null +++ b/icuSources/tools/toolutil/ucm.c @@ -0,0 +1,1177 @@ +/* +******************************************************************************* +* +* Copyright (C) 2003-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: ucm.c +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2003jun20 +* created by: Markus W. Scherer +* +* This file reads a .ucm file, stores its mappings and sorts them. +* It implements handling of Unicode conversion mappings from .ucm files +* for makeconv, canonucm, rptp2ucm, etc. +* +* Unicode code point sequences with a length of more than 1, +* as well as byte sequences with more than 4 bytes or more than one complete +* character sequence are handled to support m:n mappings. +*/ + +#include "unicode/utypes.h" +#include "unicode/ustring.h" +#include "cstring.h" +#include "cmemory.h" +#include "filestrm.h" +#include "uarrsort.h" +#include "ucnvmbcs.h" +#include "ucnv_bld.h" +#include "ucnv_ext.h" +#include "uparse.h" +#include "ucm.h" +#include + +/* -------------------------------------------------------------------------- */ + +static void +printMapping(UCMapping *m, UChar32 *codePoints, uint8_t *bytes, FILE *f) { + int32_t j; + + for(j=0; juLen; ++j) { + fprintf(f, "", (long)codePoints[j]); + } + + fputc(' ', f); + + for(j=0; jbLen; ++j) { + fprintf(f, "\\x%02X", bytes[j]); + } + + if(m->f>=0) { + fprintf(f, " |%u\n", m->f); + } else { + fputs("\n", f); + } +} + +U_CAPI void U_EXPORT2 +ucm_printMapping(UCMTable *table, UCMapping *m, FILE *f) { + printMapping(m, UCM_GET_CODE_POINTS(table, m), UCM_GET_BYTES(table, m), f); +} + +U_CAPI void U_EXPORT2 +ucm_printTable(UCMTable *table, FILE *f, UBool byUnicode) { + UCMapping *m; + int32_t i, length; + + m=table->mappings; + length=table->mappingsLength; + if(byUnicode) { + for(i=0; ireverseMap; + for(i=0; iuLen==1 && r->uLen==1) { + /* compare two single code points */ + return l->u-r->u; + } + + /* get pointers to the code point sequences */ + lu=UCM_GET_CODE_POINTS(lTable, l); + ru=UCM_GET_CODE_POINTS(rTable, r); + + /* get the minimum length */ + if(l->uLen<=r->uLen) { + length=l->uLen; + } else { + length=r->uLen; + } + + /* compare the code points */ + for(i=0; iuLen-r->uLen; +} + +static int32_t +compareBytes(UCMTable *lTable, const UCMapping *l, + UCMTable *rTable, const UCMapping *r, + UBool lexical) { + const uint8_t *lb, *rb; + int32_t result, i, length; + + /* + * A lexical comparison is used for sorting in the builder, to allow + * an efficient search for a byte sequence that could be a prefix + * of a previously entered byte sequence. + * + * Comparing by lengths first is for compatibility with old .ucm tools + * like canonucm and rptp2ucm. + */ + if(lexical) { + /* get the minimum length and continue */ + if(l->bLen<=r->bLen) { + length=l->bLen; + } else { + length=r->bLen; + } + } else { + /* compare lengths first */ + result=l->bLen-r->bLen; + if(result!=0) { + return result; + } else { + length=l->bLen; + } + } + + /* get pointers to the byte sequences */ + lb=UCM_GET_BYTES(lTable, l); + rb=UCM_GET_BYTES(rTable, r); + + /* compare the bytes */ + for(i=0; ibLen-r->bLen; +} + +/* compare UCMappings for sorting */ +static int32_t +compareMappings(UCMTable *lTable, const UCMapping *l, + UCMTable *rTable, const UCMapping *r, + UBool uFirst) { + int32_t result; + + /* choose which side to compare first */ + if(uFirst) { + /* Unicode then bytes */ + result=compareUnicode(lTable, l, rTable, r); + if(result==0) { + result=compareBytes(lTable, l, rTable, r, FALSE); /* not lexically, like canonucm */ + } + } else { + /* bytes then Unicode */ + result=compareBytes(lTable, l, rTable, r, TRUE); /* lexically, for builder */ + if(result==0) { + result=compareUnicode(lTable, l, rTable, r); + } + } + + if(result!=0) { + return result; + } + + /* compare the flags */ + return l->f-r->f; +} + +/* sorting by Unicode first sorts mappings directly */ +static int32_t +compareMappingsUnicodeFirst(const void *context, const void *left, const void *right) { + return compareMappings( + (UCMTable *)context, (const UCMapping *)left, + (UCMTable *)context, (const UCMapping *)right, TRUE); +} + +/* sorting by bytes first sorts the reverseMap; use indirection to mappings */ +static int32_t +compareMappingsBytesFirst(const void *context, const void *left, const void *right) { + UCMTable *table=(UCMTable *)context; + int32_t l=*(const int32_t *)left, r=*(const int32_t *)right; + return compareMappings( + table, table->mappings+l, + table, table->mappings+r, FALSE); +} + +U_CAPI void U_EXPORT2 +ucm_sortTable(UCMTable *t) { + UErrorCode errorCode; + int32_t i; + + if(t->isSorted) { + return; + } + + errorCode=U_ZERO_ERROR; + + /* 1. sort by Unicode first */ + uprv_sortArray(t->mappings, t->mappingsLength, sizeof(UCMapping), + compareMappingsUnicodeFirst, t, + FALSE, &errorCode); + + /* build the reverseMap */ + if(t->reverseMap==NULL) { + /* + * allocate mappingsCapacity instead of mappingsLength so that + * if mappings are added, the reverseMap need not be + * reallocated each time + * (see moveMappings() and ucm_addMapping()) + */ + t->reverseMap=(int32_t *)uprv_malloc(t->mappingsCapacity*sizeof(int32_t)); + if(t->reverseMap==NULL) { + fprintf(stderr, "ucm error: unable to allocate reverseMap\n"); + exit(U_MEMORY_ALLOCATION_ERROR); + } + } + for(i=0; imappingsLength; ++i) { + t->reverseMap[i]=i; + } + + /* 2. sort reverseMap by mappings bytes first */ + uprv_sortArray(t->reverseMap, t->mappingsLength, sizeof(int32_t), + compareMappingsBytesFirst, t, + FALSE, &errorCode); + + if(U_FAILURE(errorCode)) { + fprintf(stderr, "ucm error: sortTable()/uprv_sortArray() fails - %s\n", + u_errorName(errorCode)); + exit(errorCode); + } + + t->isSorted=TRUE; +} + +enum { + MOVE_TO_EXT=1, + REMOVE_MAPPING=2 +}; + +/* + * move mappings with their move flag set from the base table + * and optionally to the extension table + * + * works only with explicit precision flags because it uses some of the + * flags bits + */ +static void +moveMappings(UCMTable *base, UCMTable *ext) { + UCMapping *mb, *mbLimit; + int8_t flag; + + mb=base->mappings; + mbLimit=mb+base->mappingsLength; + + while(mbmoveFlag; + if(flag!=0) { + /* reset the move flag */ + mb->moveFlag=0; + + if(ext!=NULL && (flag&MOVE_TO_EXT)) { + /* add the mapping to the extension table */ + ucm_addMapping(ext, mb, UCM_GET_CODE_POINTS(base, mb), UCM_GET_BYTES(base, mb)); + } + + /* move the last base mapping down and overwrite the current one */ + if(mb<(mbLimit-1)) { + uprv_memcpy(mb, mbLimit-1, sizeof(UCMapping)); + } + --mbLimit; + --base->mappingsLength; + base->isSorted=FALSE; + } else { + ++mb; + } + } +} + +enum { + NEEDS_MOVE=1, + HAS_ERRORS=2 +}; + +static uint8_t +checkBaseExtUnicode(UCMStates *baseStates, UCMTable *base, UCMTable *ext, + UBool moveToExt, UBool intersectBase) { + UCMapping *mb, *me, *mbLimit, *meLimit; + int32_t cmp; + uint8_t result; + + mb=base->mappings; + mbLimit=mb+base->mappingsLength; + + me=ext->mappings; + meLimit=me+ext->mappingsLength; + + result=0; + + for(;;) { + /* skip irrelevant mappings on both sides */ + for(;;) { + if(mb==mbLimit) { + return result; + } + + if(0<=mb->f && mb->f<=2) { + break; + } + + ++mb; + } + + for(;;) { + if(me==meLimit) { + return result; + } + + if(0<=me->f && me->f<=2) { + break; + } + + ++me; + } + + /* compare the base and extension mappings */ + cmp=compareUnicode(base, mb, ext, me); + if(cmp<0) { + if(intersectBase && (intersectBase!=2 || mb->bLen>1)) { + /* + * mapping in base but not in ext, move it + * + * if ext is DBCS, move DBCS mappings here + * and check SBCS ones for Unicode prefix below + */ + mb->moveFlag|=MOVE_TO_EXT; + result|=NEEDS_MOVE; + + /* does mb map from an input sequence that is a prefix of me's? */ + } else if( mb->uLenuLen && + 0==uprv_memcmp(UCM_GET_CODE_POINTS(base, mb), UCM_GET_CODE_POINTS(ext, me), 4*mb->uLen) + ) { + if(moveToExt) { + /* mark this mapping to be moved to the extension table */ + mb->moveFlag|=MOVE_TO_EXT; + result|=NEEDS_MOVE; + } else { + fprintf(stderr, + "ucm error: the base table contains a mapping whose input sequence\n" + " is a prefix of the input sequence of an extension mapping\n"); + ucm_printMapping(base, mb, stderr); + ucm_printMapping(ext, me, stderr); + result|=HAS_ERRORS; + } + } + + ++mb; + } else if(cmp==0) { + /* + * same output: remove the extension mapping, + * otherwise treat as an error + */ + if( mb->f==me->f && mb->bLen==me->bLen && + 0==uprv_memcmp(UCM_GET_BYTES(base, mb), UCM_GET_BYTES(ext, me), mb->bLen) + ) { + me->moveFlag|=REMOVE_MAPPING; + result|=NEEDS_MOVE; + } else if(intersectBase) { + /* mapping in base but not in ext, move it */ + mb->moveFlag|=MOVE_TO_EXT; + result|=NEEDS_MOVE; + } else { + fprintf(stderr, + "ucm error: the base table contains a mapping whose input sequence\n" + " is the same as the input sequence of an extension mapping\n" + " but it maps differently\n"); + ucm_printMapping(base, mb, stderr); + ucm_printMapping(ext, me, stderr); + result|=HAS_ERRORS; + } + + ++mb; + } else /* cmp>0 */ { + ++me; + } + } +} + +static uint8_t +checkBaseExtBytes(UCMStates *baseStates, UCMTable *base, UCMTable *ext, + UBool moveToExt, UBool intersectBase) { + UCMapping *mb, *me; + int32_t *baseMap, *extMap; + int32_t b, e, bLimit, eLimit, cmp; + uint8_t result; + UBool isSISO; + + baseMap=base->reverseMap; + extMap=ext->reverseMap; + + b=e=0; + bLimit=base->mappingsLength; + eLimit=ext->mappingsLength; + + result=0; + + isSISO=(UBool)(baseStates->outputType==MBCS_OUTPUT_2_SISO); + + for(;;) { + /* skip irrelevant mappings on both sides */ + for(;; ++b) { + if(b==bLimit) { + return result; + } + mb=base->mappings+baseMap[b]; + + if(intersectBase==2 && mb->bLen==1) { + /* + * comparing a base against a DBCS extension: + * leave SBCS base mappings alone + */ + continue; + } + + if(mb->f==0 || mb->f==3) { + break; + } + } + + for(;;) { + if(e==eLimit) { + return result; + } + me=ext->mappings+extMap[e]; + + if(me->f==0 || me->f==3) { + break; + } + + ++e; + } + + /* compare the base and extension mappings */ + cmp=compareBytes(base, mb, ext, me, TRUE); + if(cmp<0) { + if(intersectBase) { + /* mapping in base but not in ext, move it */ + mb->moveFlag|=MOVE_TO_EXT; + result|=NEEDS_MOVE; + + /* + * does mb map from an input sequence that is a prefix of me's? + * for SI/SO tables, a single byte is never a prefix because it + * occurs in a separate single-byte state + */ + } else if( mb->bLenbLen && + (!isSISO || mb->bLen>1) && + 0==uprv_memcmp(UCM_GET_BYTES(base, mb), UCM_GET_BYTES(ext, me), mb->bLen) + ) { + if(moveToExt) { + /* mark this mapping to be moved to the extension table */ + mb->moveFlag|=MOVE_TO_EXT; + result|=NEEDS_MOVE; + } else { + fprintf(stderr, + "ucm error: the base table contains a mapping whose input sequence\n" + " is a prefix of the input sequence of an extension mapping\n"); + ucm_printMapping(base, mb, stderr); + ucm_printMapping(ext, me, stderr); + result|=HAS_ERRORS; + } + } + + ++b; + } else if(cmp==0) { + /* + * same output: remove the extension mapping, + * otherwise treat as an error + */ + if( mb->f==me->f && mb->uLen==me->uLen && + 0==uprv_memcmp(UCM_GET_CODE_POINTS(base, mb), UCM_GET_CODE_POINTS(ext, me), 4*mb->uLen) + ) { + me->moveFlag|=REMOVE_MAPPING; + result|=NEEDS_MOVE; + } else if(intersectBase) { + /* mapping in base but not in ext, move it */ + mb->moveFlag|=MOVE_TO_EXT; + result|=NEEDS_MOVE; + } else { + fprintf(stderr, + "ucm error: the base table contains a mapping whose input sequence\n" + " is the same as the input sequence of an extension mapping\n" + " but it maps differently\n"); + ucm_printMapping(base, mb, stderr); + ucm_printMapping(ext, me, stderr); + result|=HAS_ERRORS; + } + + ++b; + } else /* cmp>0 */ { + ++e; + } + } +} + +U_CAPI UBool U_EXPORT2 +ucm_checkValidity(UCMTable *table, UCMStates *baseStates) { + UCMapping *m, *mLimit; + int32_t count; + UBool isOK; + + m=table->mappings; + mLimit=m+table->mappingsLength; + isOK=TRUE; + + while(mbLen); + if(count<1) { + ucm_printMapping(table, m, stderr); + isOK=FALSE; + } + ++m; + } + + return isOK; +} + +U_CAPI UBool U_EXPORT2 +ucm_checkBaseExt(UCMStates *baseStates, + UCMTable *base, UCMTable *ext, UCMTable *moveTarget, + UBool intersectBase) { + uint8_t result; + + /* if we have an extension table, we must always use precision flags */ + if(base->flagsType&UCM_FLAGS_IMPLICIT) { + fprintf(stderr, "ucm error: the base table contains mappings without precision flags\n"); + return FALSE; + } + if(ext->flagsType&UCM_FLAGS_IMPLICIT) { + fprintf(stderr, "ucm error: extension table contains mappings without precision flags\n"); + return FALSE; + } + + /* checking requires both tables to be sorted */ + ucm_sortTable(base); + ucm_sortTable(ext); + + /* check */ + result= + checkBaseExtUnicode(baseStates, base, ext, (UBool)(moveTarget!=NULL), intersectBase)| + checkBaseExtBytes(baseStates, base, ext, (UBool)(moveTarget!=NULL), intersectBase); + + if(result&HAS_ERRORS) { + return FALSE; + } + + if(result&NEEDS_MOVE) { + moveMappings(ext, NULL); + moveMappings(base, moveTarget); + ucm_sortTable(base); + ucm_sortTable(ext); + if(moveTarget!=NULL) { + ucm_sortTable(moveTarget); + } + } + + return TRUE; +} + +/* merge tables for rptp2ucm ------------------------------------------------ */ + +U_CAPI void U_EXPORT2 +ucm_mergeTables(UCMTable *fromUTable, UCMTable *toUTable, + const uint8_t *subchar, int32_t subcharLength, + uint8_t subchar1) { + UCMapping *fromUMapping, *toUMapping; + int32_t fromUIndex, toUIndex, fromUTop, toUTop, cmp; + + ucm_sortTable(fromUTable); + ucm_sortTable(toUTable); + + fromUMapping=fromUTable->mappings; + toUMapping=toUTable->mappings; + + fromUTop=fromUTable->mappingsLength; + toUTop=toUTable->mappingsLength; + + fromUIndex=toUIndex=0; + + while(fromUIndexcodepage + */ + if( (fromUMapping->bLen==subcharLength && + 0==uprv_memcmp(UCM_GET_BYTES(fromUTable, fromUMapping), subchar, subcharLength)) || + (subchar1!=0 && fromUMapping->bLen==1 && fromUMapping->b.bytes[0]==subchar1) + ) { + fromUMapping->f=2; /* SUB mapping */ + } else { + fromUMapping->f=1; /* normal fallback */ + } + + ++fromUMapping; + ++fromUIndex; + } else { + /* + * the toU mapping does not have a fromU counterpart: + * (reverse) fallback codepage->Unicode, copy it to the fromU table + */ + + /* ignore reverse fallbacks to Unicode SUB */ + if(!(toUMapping->uLen==1 && (toUMapping->u==0xfffd || toUMapping->u==0x1a))) { + toUMapping->f=3; /* reverse fallback */ + ucm_addMapping(fromUTable, toUMapping, UCM_GET_CODE_POINTS(toUTable, toUMapping), UCM_GET_BYTES(toUTable, toUMapping)); + + /* the table may have been reallocated */ + fromUMapping=fromUTable->mappings+fromUIndex; + } + + ++toUMapping; + ++toUIndex; + } + } + + /* either one or both tables are exhausted */ + while(fromUIndexbLen==subcharLength && + 0==uprv_memcmp(UCM_GET_BYTES(fromUTable, fromUMapping), subchar, subcharLength)) || + (subchar1!=0 && fromUMapping->bLen==1 && fromUMapping->b.bytes[0]==subchar1) + ) { + fromUMapping->f=2; /* SUB mapping */ + } else { + fromUMapping->f=1; /* normal fallback */ + } + + ++fromUMapping; + ++fromUIndex; + } + + while(toUIndexuLen==1 && (toUMapping->u==0xfffd || toUMapping->u==0x1a))) { + toUMapping->f=3; /* reverse fallback */ + ucm_addMapping(fromUTable, toUMapping, UCM_GET_CODE_POINTS(toUTable, toUMapping), UCM_GET_BYTES(toUTable, toUMapping)); + } + + ++toUMapping; + ++toUIndex; + } + + fromUTable->isSorted=FALSE; +} + +/* separate extension mappings out of base table for rptp2ucm --------------- */ + +U_CAPI UBool U_EXPORT2 +ucm_separateMappings(UCMFile *ucm, UBool isSISO) { + UCMTable *table; + UCMapping *m, *mLimit; + int32_t type; + UBool needsMove, isOK; + + table=ucm->base; + m=table->mappings; + mLimit=m+table->mappingsLength; + + needsMove=FALSE; + isOK=TRUE; + + for(; mbLen==1 && (m->b.bytes[0]==0xe || m->b.bytes[0]==0xf)) { + fprintf(stderr, "warning: removing illegal mapping from an SI/SO-stateful table\n"); + ucm_printMapping(table, m, stderr); + m->moveFlag|=REMOVE_MAPPING; + needsMove=TRUE; + continue; + } + + type=ucm_mappingType( + &ucm->states, m, + UCM_GET_CODE_POINTS(table, m), UCM_GET_BYTES(table, m)); + if(type<0) { + /* illegal byte sequence */ + printMapping(m, UCM_GET_CODE_POINTS(table, m), UCM_GET_BYTES(table, m), stderr); + isOK=FALSE; + } else if(type>0) { + m->moveFlag|=MOVE_TO_EXT; + needsMove=TRUE; + } + } + + if(!isOK) { + return FALSE; + } + if(needsMove) { + moveMappings(ucm->base, ucm->ext); + return ucm_checkBaseExt(&ucm->states, ucm->base, ucm->ext, ucm->ext, FALSE); + } else { + ucm_sortTable(ucm->base); + return TRUE; + } +} + +/* ucm parser --------------------------------------------------------------- */ + +U_CAPI int8_t U_EXPORT2 +ucm_parseBytes(uint8_t bytes[UCNV_EXT_MAX_BYTES], const char *line, const char **ps) { + const char *s=*ps; + char *end; + uint8_t byte; + int8_t bLen; + + bLen=0; + for(;;) { + /* skip an optional plus sign */ + if(bLen>0 && *s=='+') { + ++s; + } + if(*s!='\\') { + break; + } + + if( s[1]!='x' || + (byte=(uint8_t)uprv_strtoul(s+2, &end, 16), end)!=s+4 + ) { + fprintf(stderr, "ucm error: byte must be formatted as \\xXX (2 hex digits) - \"%s\"\n", line); + return -1; + } + + if(bLen==UCNV_EXT_MAX_BYTES) { + fprintf(stderr, "ucm error: too many bytes on \"%s\"\n", line); + return -1; + } + bytes[bLen++]=byte; + s=end; + } + + *ps=s; + return bLen; +} + +/* parse a mapping line; must not be empty */ +U_CAPI UBool U_EXPORT2 +ucm_parseMappingLine(UCMapping *m, + UChar32 codePoints[UCNV_EXT_MAX_UCHARS], + uint8_t bytes[UCNV_EXT_MAX_BYTES], + const char *line) { + const char *s; + char *end; + UChar32 cp; + int32_t u16Length; + int8_t uLen, bLen, f; + + s=line; + uLen=bLen=0; + + /* parse code points */ + for(;;) { + /* skip an optional plus sign */ + if(uLen>0 && *s=='+') { + ++s; + } + if(*s!='<') { + break; + } + + if( s[1]!='U' || + (cp=(UChar32)uprv_strtoul(s+2, &end, 16), end)==s+2 || + *end!='>' + ) { + fprintf(stderr, "ucm error: Unicode code point must be formatted as (1..6 hex digits) - \"%s\"\n", line); + return FALSE; + } + if((uint32_t)cp>0x10ffff || U_IS_SURROGATE(cp)) { + fprintf(stderr, "ucm error: Unicode code point must be 0..d7ff or e000..10ffff - \"%s\"\n", line); + return FALSE; + } + + if(uLen==UCNV_EXT_MAX_UCHARS) { + fprintf(stderr, "ucm error: too many code points on \"%s\"\n", line); + return FALSE; + } + codePoints[uLen++]=cp; + s=end+1; + } + + if(uLen==0) { + fprintf(stderr, "ucm error: no Unicode code points on \"%s\"\n", line); + return FALSE; + } else if(uLen==1) { + m->u=codePoints[0]; + } else { + UErrorCode errorCode=U_ZERO_ERROR; + u_strFromUTF32(NULL, 0, &u16Length, codePoints, uLen, &errorCode); + if( (U_FAILURE(errorCode) && errorCode!=U_BUFFER_OVERFLOW_ERROR) || + u16Length>UCNV_EXT_MAX_UCHARS + ) { + fprintf(stderr, "ucm error: too many UChars on \"%s\"\n", line); + return FALSE; + } + } + + s=u_skipWhitespace(s); + + /* parse bytes */ + bLen=ucm_parseBytes(bytes, line, &s); + + if(bLen<0) { + return FALSE; + } else if(bLen==0) { + fprintf(stderr, "ucm error: no bytes on \"%s\"\n", line); + return FALSE; + } else if(bLen<=4) { + uprv_memcpy(m->b.bytes, bytes, bLen); + } + + /* skip everything until the fallback indicator, even the start of a comment */ + for(;;) { + if(*s==0) { + f=-1; /* no fallback indicator */ + break; + } else if(*s=='|') { + f=(int8_t)(s[1]-'0'); + if((uint8_t)f>3) { + fprintf(stderr, "ucm error: fallback indicator must be |0..|3 - \"%s\"\n", line); + return FALSE; + } + break; + } + ++s; + } + + m->uLen=uLen; + m->bLen=bLen; + m->f=f; + return TRUE; +} + +/* general APIs ------------------------------------------------------------- */ + +U_CAPI UCMTable * U_EXPORT2 +ucm_openTable() { + UCMTable *table=(UCMTable *)uprv_malloc(sizeof(UCMTable)); + if(table==NULL) { + fprintf(stderr, "ucm error: unable to allocate a UCMTable\n"); + exit(U_MEMORY_ALLOCATION_ERROR); + } + + memset(table, 0, sizeof(UCMTable)); + return table; +} + +U_CAPI void U_EXPORT2 +ucm_closeTable(UCMTable *table) { + if(table!=NULL) { + uprv_free(table->mappings); + uprv_free(table->codePoints); + uprv_free(table->bytes); + uprv_free(table->reverseMap); + uprv_free(table); + } +} + +U_CAPI void U_EXPORT2 +ucm_resetTable(UCMTable *table) { + if(table!=NULL) { + table->mappingsLength=0; + table->flagsType=0; + table->unicodeMask=0; + table->bytesLength=table->codePointsLength=0; + table->isSorted=FALSE; + } +} + +U_CAPI void U_EXPORT2 +ucm_addMapping(UCMTable *table, + UCMapping *m, + UChar32 codePoints[UCNV_EXT_MAX_UCHARS], + uint8_t bytes[UCNV_EXT_MAX_BYTES]) { + UCMapping *tm; + UChar32 c; + int32_t index; + + if(table->mappingsLength>=table->mappingsCapacity) { + /* make the mappings array larger */ + if(table->mappingsCapacity==0) { + table->mappingsCapacity=1000; + } else { + table->mappingsCapacity*=10; + } + table->mappings=(UCMapping *)uprv_realloc(table->mappings, + table->mappingsCapacity*sizeof(UCMapping)); + if(table->mappings==NULL) { + fprintf(stderr, "ucm error: unable to allocate %d UCMappings\n", + (int)table->mappingsCapacity); + exit(U_MEMORY_ALLOCATION_ERROR); + } + + if(table->reverseMap!=NULL) { + /* the reverseMap must be reallocated in a new sort */ + uprv_free(table->reverseMap); + table->reverseMap=NULL; + } + } + + if(m->uLen>1 && table->codePointsCapacity==0) { + table->codePointsCapacity=10000; + table->codePoints=(UChar32 *)uprv_malloc(table->codePointsCapacity*4); + if(table->codePoints==NULL) { + fprintf(stderr, "ucm error: unable to allocate %d UChar32s\n", + (int)table->codePointsCapacity); + exit(U_MEMORY_ALLOCATION_ERROR); + } + } + + if(m->bLen>4 && table->bytesCapacity==0) { + table->bytesCapacity=10000; + table->bytes=(uint8_t *)uprv_malloc(table->bytesCapacity); + if(table->bytes==NULL) { + fprintf(stderr, "ucm error: unable to allocate %d bytes\n", + (int)table->bytesCapacity); + exit(U_MEMORY_ALLOCATION_ERROR); + } + } + + if(m->uLen>1) { + index=table->codePointsLength; + table->codePointsLength+=m->uLen; + if(table->codePointsLength>table->codePointsCapacity) { + fprintf(stderr, "ucm error: too many code points in multiple-code point mappings\n"); + exit(U_MEMORY_ALLOCATION_ERROR); + } + + uprv_memcpy(table->codePoints+index, codePoints, m->uLen*4); + m->u=index; + } + + if(m->bLen>4) { + index=table->bytesLength; + table->bytesLength+=m->bLen; + if(table->bytesLength>table->bytesCapacity) { + fprintf(stderr, "ucm error: too many bytes in mappings with >4 charset bytes\n"); + exit(U_MEMORY_ALLOCATION_ERROR); + } + + uprv_memcpy(table->bytes+index, bytes, m->bLen); + m->b.index=index; + } + + /* set unicodeMask */ + for(index=0; indexuLen; ++index) { + c=codePoints[index]; + if(c>=0x10000) { + table->unicodeMask|=UCNV_HAS_SUPPLEMENTARY; /* there are supplementary code points */ + } else if(U_IS_SURROGATE(c)) { + table->unicodeMask|=UCNV_HAS_SURROGATES; /* there are surrogate code points */ + } + } + + /* set flagsType */ + if(m->f<0) { + table->flagsType|=UCM_FLAGS_IMPLICIT; + } else { + table->flagsType|=UCM_FLAGS_EXPLICIT; + } + + tm=table->mappings+table->mappingsLength++; + uprv_memcpy(tm, m, sizeof(UCMapping)); + + table->isSorted=FALSE; +} + +U_CAPI UCMFile * U_EXPORT2 +ucm_open() { + UCMFile *ucm=(UCMFile *)uprv_malloc(sizeof(UCMFile)); + if(ucm==NULL) { + fprintf(stderr, "ucm error: unable to allocate a UCMFile\n"); + exit(U_MEMORY_ALLOCATION_ERROR); + } + + memset(ucm, 0, sizeof(UCMFile)); + + ucm->base=ucm_openTable(); + ucm->ext=ucm_openTable(); + + ucm->states.stateFlags[0]=MBCS_STATE_FLAG_DIRECT; + ucm->states.conversionType=UCNV_UNSUPPORTED_CONVERTER; + ucm->states.outputType=-1; + ucm->states.minCharLength=ucm->states.maxCharLength=1; + + return ucm; +} + +U_CAPI void U_EXPORT2 +ucm_close(UCMFile *ucm) { + if(ucm!=NULL) { + uprv_free(ucm->base); + uprv_free(ucm->ext); + uprv_free(ucm); + } +} + +U_CAPI int32_t U_EXPORT2 +ucm_mappingType(UCMStates *baseStates, + UCMapping *m, + UChar32 codePoints[UCNV_EXT_MAX_UCHARS], + uint8_t bytes[UCNV_EXT_MAX_BYTES]) { + /* check validity of the bytes and count the characters in them */ + int32_t count=ucm_countChars(baseStates, bytes, m->bLen); + if(count<1) { + /* illegal byte sequence */ + return -1; + } + + /* + * Suitable for an ICU conversion base table means: + * - a 1:1 mapping + * - not a |2 SUB mappings for + * - not a |1 fallback to 0x00 + * - no leading 0x00 bytes + */ + if( m->uLen==1 && count==1 && + !((m->f==2 && m->bLen==1 && baseStates->maxCharLength>1) || + (m->f==1 && m->bLen==1 && bytes[0]==0) || + (m->bLen>1 && bytes[0]==0)) + ) { + return 0; /* suitable for a base table */ + } else { + return 1; /* needs to go into an extension table */ + } +} + +U_CAPI UBool U_EXPORT2 +ucm_addMappingAuto(UCMFile *ucm, UBool forBase, UCMStates *baseStates, + UCMapping *m, + UChar32 codePoints[UCNV_EXT_MAX_UCHARS], + uint8_t bytes[UCNV_EXT_MAX_BYTES]) { + int32_t type; + + if(m->f==2 && m->uLen>1) { + fprintf(stderr, "ucm error: illegal |2 mapping from multiple code points\n"); + printMapping(m, codePoints, bytes, stderr); + return FALSE; + } + + if(baseStates!=NULL) { + /* check validity of the bytes and count the characters in them */ + type=ucm_mappingType(baseStates, m, codePoints, bytes); + if(type<0) { + /* illegal byte sequence */ + printMapping(m, codePoints, bytes, stderr); + return FALSE; + } + } else { + /* not used - adding a mapping for an extension-only table before its base table is read */ + type=1; + } + + /* + * Add the mapping to the base table if this is requested and suitable. + * Otherwise, add it to the extension table. + */ + if(forBase && type==0) { + ucm_addMapping(ucm->base, m, codePoints, bytes); + } else { + ucm_addMapping(ucm->ext, m, codePoints, bytes); + } + + return TRUE; +} + +U_CAPI UBool U_EXPORT2 +ucm_addMappingFromLine(UCMFile *ucm, const char *line, UBool forBase, UCMStates *baseStates) { + UCMapping m={ 0 }; + UChar32 codePoints[UCNV_EXT_MAX_UCHARS]; + uint8_t bytes[UCNV_EXT_MAX_BYTES]; + + const char *s; + + /* ignore empty and comment lines */ + if(line[0]=='#' || *(s=u_skipWhitespace(line))==0 || *s=='\n' || *s=='\r') { + return TRUE; + } + + return + ucm_parseMappingLine(&m, codePoints, bytes, line) && + ucm_addMappingAuto(ucm, forBase, baseStates, &m, codePoints, bytes); +} + +U_CAPI void U_EXPORT2 +ucm_readTable(UCMFile *ucm, FileStream* convFile, + UBool forBase, UCMStates *baseStates, + UErrorCode *pErrorCode) { + char line[500]; + char *end; + UBool isOK; + + if(U_FAILURE(*pErrorCode)) { + return; + } + + isOK=TRUE; + + for(;;) { + /* read the next line */ + if(!T_FileStream_readLine(convFile, line, sizeof(line))) { + fprintf(stderr, "incomplete charmap section\n"); + isOK=FALSE; + break; + } + + /* remove CR LF */ + end=uprv_strchr(line, 0); + while(line + +U_CDECL_BEGIN + +/* + * Per-mapping data structure + * + * u if uLen==1: Unicode code point + * else index to uLen code points + * b if bLen<=4: up to 4 bytes + * else index to bLen bytes + * uLen number of code points + * bLen number of words containing left-justified bytes + * bIsMultipleChars indicates that the bytes contain more than one sequence + * according to the state table + * f flag for roundtrip (0), fallback (1), sub mapping (2), reverse fallback (3) + * same values as in the source file after | + */ +typedef struct UCMapping { + UChar32 u; + union { + uint32_t index; + uint8_t bytes[4]; + } b; + int8_t uLen, bLen, f, moveFlag; +} UCMapping; + +enum { + UCM_FLAGS_INITIAL, /* no mappings parsed yet */ + UCM_FLAGS_EXPLICIT, /* .ucm file has mappings with | fallback indicators */ + UCM_FLAGS_IMPLICIT, /* .ucm file has mappings without | fallback indicators, later wins */ + UCM_FLAGS_MIXED /* both implicit and explicit */ +}; + +typedef struct UCMTable { + UCMapping *mappings; + int32_t mappingsCapacity, mappingsLength; + + UChar32 *codePoints; + int32_t codePointsCapacity, codePointsLength; + + uint8_t *bytes; + int32_t bytesCapacity, bytesLength; + + /* index map for mapping by bytes first */ + int32_t *reverseMap; + + uint8_t unicodeMask; + int8_t flagsType; /* UCM_FLAGS_INITIAL etc. */ + UBool isSorted; +} UCMTable; + +enum { + MBCS_STATE_FLAG_DIRECT=1, + MBCS_STATE_FLAG_SURROGATES, + + MBCS_STATE_FLAG_READY=16 +}; + +typedef struct UCMStates { + int32_t stateTable[MBCS_MAX_STATE_COUNT][256]; + uint32_t stateFlags[MBCS_MAX_STATE_COUNT], + stateOffsetSum[MBCS_MAX_STATE_COUNT]; + + int32_t countStates, minCharLength, maxCharLength, countToUCodeUnits; + int8_t conversionType, outputType; +} UCMStates; + +typedef struct UCMFile { + UCMTable *base, *ext; + UCMStates states; + + char baseName[UCNV_MAX_CONVERTER_NAME_LENGTH]; +} UCMFile; + +/* simple accesses ---------------------------------------------------------- */ + +#define UCM_GET_CODE_POINTS(t, m) \ + (((m)->uLen==1) ? &(m)->u : (t)->codePoints+(m)->u) + +#define UCM_GET_BYTES(t, m) \ + (((m)->bLen<=4) ? (m)->b.bytes : (t)->bytes+(m)->b.index) + +/* APIs --------------------------------------------------------------------- */ + +U_CAPI UCMFile * U_EXPORT2 +ucm_open(void); + +U_CAPI void U_EXPORT2 +ucm_close(UCMFile *ucm); + +U_CAPI UBool U_EXPORT2 +ucm_parseHeaderLine(UCMFile *ucm, + char *line, char **pKey, char **pValue); + +/* @return -1 illegal bytes 0 suitable for base table 1 needs to go into extension table */ +U_CAPI int32_t U_EXPORT2 +ucm_mappingType(UCMStates *baseStates, + UCMapping *m, + UChar32 codePoints[UCNV_EXT_MAX_UCHARS], + uint8_t bytes[UCNV_EXT_MAX_BYTES]); + +/* add a mapping to the base or extension table as appropriate */ +U_CAPI UBool U_EXPORT2 +ucm_addMappingAuto(UCMFile *ucm, UBool forBase, UCMStates *baseStates, + UCMapping *m, + UChar32 codePoints[UCNV_EXT_MAX_UCHARS], + uint8_t bytes[UCNV_EXT_MAX_BYTES]); + +U_CAPI UBool U_EXPORT2 +ucm_addMappingFromLine(UCMFile *ucm, const char *line, UBool forBase, UCMStates *baseStates); + + +U_CAPI UCMTable * U_EXPORT2 +ucm_openTable(void); + +U_CAPI void U_EXPORT2 +ucm_closeTable(UCMTable *table); + +U_CAPI void U_EXPORT2 +ucm_resetTable(UCMTable *table); + +U_CAPI void U_EXPORT2 +ucm_sortTable(UCMTable *t); + +/** + * Read a table from a .ucm file, from after the CHARMAP line to + * including the END CHARMAP line. + */ +U_CAPI void U_EXPORT2 +ucm_readTable(UCMFile *ucm, FileStream* convFile, + UBool forBase, UCMStates *baseStates, + UErrorCode *pErrorCode); + +/** + * Check the validity of mappings against a base table's states; + * necessary for extension-only tables that were read before their base tables. + */ +U_CAPI UBool U_EXPORT2 +ucm_checkValidity(UCMTable *ext, UCMStates *baseStates); + +/** + * Check a base table against an extension table. + * Set the moveTarget!=NULL if it is possible to move mappings from the base. + * This is the case where base and extension tables are parsed from a single file + * (moveTarget==ext) + * or when delta file mappings are subtracted from a base table. + * + * When a base table cannot be modified because a delta file is parsed in makeconv, + * then set moveTarget=NULL. + * + * if(intersectBase) then mappings that exist in the base table but not in + * the extension table are moved to moveTarget instead of showing an error. + * + * Special mode: + * If intersectBase==2 for a DBCS extension table, then SBCS mappings are + * not moved out of the base unless their Unicode input requires it. + * This helps ucmkbase generate base tables for DBCS-only extension .cnv files. + * + * For both tables in the same file, the extension table is automatically + * built. + * For separate files, the extension file can use a complete mapping table, + * so that common mappings need not be stripped out manually. + * + * + * Sort both tables, and then for each mapping direction: + * + * If intersectBase is TRUE and the base table contains a mapping + * that does not exist in the extension table, then this mapping is moved + * to moveTarget. + * + * - otherwise - + * + * If the base table contains a mapping for which the input sequence is + * the same as the extension input, then + * - if the output is the same: remove the extension mapping + * - else: error + * + * If the base table contains a mapping for which the input sequence is + * a prefix of the extension input, then + * - if moveTarget!=NULL: move the base mapping to the moveTarget table + * - else: error + * + * @return FALSE in case of an irreparable error + */ +U_CAPI UBool U_EXPORT2 +ucm_checkBaseExt(UCMStates *baseStates, UCMTable *base, UCMTable *ext, + UCMTable *moveTarget, UBool intersectBase); + +U_CAPI void U_EXPORT2 +ucm_printTable(UCMTable *table, FILE *f, UBool byUnicode); + +U_CAPI void U_EXPORT2 +ucm_printMapping(UCMTable *table, UCMapping *m, FILE *f); + + +U_CAPI void U_EXPORT2 +ucm_addState(UCMStates *states, const char *s); + +U_CAPI void U_EXPORT2 +ucm_processStates(UCMStates *states); + +U_CAPI int32_t U_EXPORT2 +ucm_countChars(UCMStates *states, + const uint8_t *bytes, int32_t length); + + +U_CAPI int8_t U_EXPORT2 +ucm_parseBytes(uint8_t bytes[UCNV_EXT_MAX_BYTES], const char *line, const char **ps); + +U_CAPI UBool U_EXPORT2 +ucm_parseMappingLine(UCMapping *m, + UChar32 codePoints[UCNV_EXT_MAX_UCHARS], + uint8_t bytes[UCNV_EXT_MAX_BYTES], + const char *line); + +U_CAPI void U_EXPORT2 +ucm_addMapping(UCMTable *table, + UCMapping *m, + UChar32 codePoints[UCNV_EXT_MAX_UCHARS], + uint8_t bytes[UCNV_EXT_MAX_BYTES]); + +/* very makeconv-specific functions ----------------------------------------- */ + +/* finalize and optimize states after the toUnicode mappings are processed */ +U_CAPI void U_EXPORT2 +ucm_optimizeStates(UCMStates *states, + uint16_t **pUnicodeCodeUnits, + _MBCSToUFallback *toUFallbacks, int32_t countToUFallbacks, + UBool verbose); + +/* moved here because it is used inside ucmstate.c */ +U_CAPI int32_t U_EXPORT2 +ucm_findFallback(_MBCSToUFallback *toUFallbacks, int32_t countToUFallbacks, + uint32_t offset); + +/* very rptp2ucm-specific functions ----------------------------------------- */ + +/* + * Input: Separate tables with mappings from/to Unicode, + * subchar and subchar1 (0 if none). + * All mappings must have flag 0. + * + * Output: fromUTable will contain the union of mappings with the correct + * precision flags, and be sorted. + */ +U_CAPI void U_EXPORT2 +ucm_mergeTables(UCMTable *fromUTable, UCMTable *toUTable, + const uint8_t *subchar, int32_t subcharLength, + uint8_t subchar1); + +U_CAPI UBool U_EXPORT2 +ucm_separateMappings(UCMFile *ucm, UBool isSISO); + +U_CDECL_END + +#endif diff --git a/icuSources/tools/toolutil/ucmpwrit.h b/icuSources/tools/toolutil/ucmpwrit.h index 310d7d55..f75c7b58 100644 --- a/icuSources/tools/toolutil/ucmpwrit.h +++ b/icuSources/tools/toolutil/ucmpwrit.h @@ -1,6 +1,6 @@ /******************************************************************** * -* Copyright (C) 1997-2000, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. * *********************************************************************/ @@ -15,20 +15,11 @@ #include "unicode/utypes.h" #include "unewdata.h" -#include "umemstrm.h" #include "ucmp8.h" -#if 0 -#include "ucmp16.h" -#include "ucmp32.h" -#endif /* udata filestream variants */ U_CAPI uint32_t U_EXPORT2 udata_write_ucmp8 (UNewDataMemory *pData, const CompactByteArray* array); -#if 0 -U_CAPI uint32_t U_EXPORT2 udata_write_ucmp16(UNewDataMemory *pData, const CompactShortArray* array); -U_CAPI uint32_t U_EXPORT2 udata_write_ucmp32(UNewDataMemory *pData, const CompactIntArray* array); -#endif #endif diff --git a/icuSources/tools/toolutil/ucmstate.c b/icuSources/tools/toolutil/ucmstate.c new file mode 100644 index 00000000..81e3b3a3 --- /dev/null +++ b/icuSources/tools/toolutil/ucmstate.c @@ -0,0 +1,1042 @@ +/* +******************************************************************************* +* +* Copyright (C) 2003-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: ucmstate.c +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2003oct09 +* created by: Markus W. Scherer +* +* This file handles ICU .ucm file state information as part of the ucm module. +* Most of this code used to be in makeconv.c. +*/ + +#include "unicode/utypes.h" +#include "cstring.h" +#include "cmemory.h" +#include "uarrsort.h" +#include "ucnvmbcs.h" +#include "ucnv_ext.h" +#include "uparse.h" +#include "ucm.h" +#include + +/* MBCS state handling ------------------------------------------------------ */ + +/* + * state table row grammar (ebnf-style): + * (whitespace is allowed between all tokens) + * + * row=[[firstentry ','] entry (',' entry)*] + * firstentry="initial" | "surrogates" + * (initial state (default for state 0), output is all surrogate pairs) + * entry=range [':' nextstate] ['.' action] + * range=number ['-' number] + * nextstate=number + * (0..7f) + * action='u' | 's' | 'p' | 'i' + * (unassigned, state change only, surrogate pair, illegal) + * number=(1- or 2-digit hexadecimal number) + */ +static const char * +parseState(const char *s, int32_t state[256], uint32_t *pFlags) { + const char *t; + uint32_t start, end, i; + int32_t entry; + + /* initialize the state: all illegal with U+ffff */ + for(i=0; i<256; ++i) { + state[i]=MBCS_ENTRY_FINAL(0, MBCS_STATE_ILLEGAL, 0xffff); + } + + /* skip leading white space */ + s=u_skipWhitespace(s); + + /* is there an "initial" or "surrogates" directive? */ + if(uprv_strncmp("initial", s, 7)==0) { + *pFlags=MBCS_STATE_FLAG_DIRECT; + s=u_skipWhitespace(s+7); + if(*s++!=',') { + return s-1; + } + } else if(*pFlags==0 && uprv_strncmp("surrogates", s, 10)==0) { + *pFlags=MBCS_STATE_FLAG_SURROGATES; + s=u_skipWhitespace(s+10); + if(*s++!=',') { + return s-1; + } + } else if(*s==0) { + /* empty state row: all-illegal */ + return NULL; + } + + for(;;) { + /* read an entry, the start of the range first */ + s=u_skipWhitespace(s); + start=uprv_strtoul(s, (char **)&t, 16); + if(s==t || 0xffcountStates==MBCS_MAX_STATE_COUNT) { + fprintf(stderr, "ucm error: too many states (maximum %u)\n", MBCS_MAX_STATE_COUNT); + exit(U_INVALID_TABLE_FORMAT); + } + + error=parseState(s, states->stateTable[states->countStates], + &states->stateFlags[states->countStates]); + if(error!=NULL) { + fprintf(stderr, "ucm error: parse error in state definition at '%s'\n", error); + exit(U_INVALID_TABLE_FORMAT); + } + + ++states->countStates; +} + +U_CAPI UBool U_EXPORT2 +ucm_parseHeaderLine(UCMFile *ucm, + char *line, char **pKey, char **pValue) { + UCMStates *states; + char *s, *end; + char c; + + states=&ucm->states; + + /* remove comments and trailing CR and LF and remove whitespace from the end */ + for(end=line; (c=*end)!=0; ++end) { + if(c=='#' || c=='\r' || c=='\n') { + break; + } + } + while(end>line && (*(end-1)==' ' || *(end-1)=='\t')) { + --end; + } + *end=0; + + /* skip leading white space and ignore empty lines */ + s=(char *)u_skipWhitespace(line); + if(*s==0) { + return TRUE; + } + + /* stop at the beginning of the mapping section */ + if(uprv_memcmp(s, "CHARMAP", 7)==0) { + return FALSE; + } + + /* get the key name, bracketed in <> */ + if(*s!='<') { + fprintf(stderr, "ucm error: no header field in line \"%s\"\n", line); + exit(U_INVALID_TABLE_FORMAT); + } + *pKey=++s; + while(*s!='>') { + if(*s==0) { + fprintf(stderr, "ucm error: incomplete header field in line \"%s\"\n", line); + exit(U_INVALID_TABLE_FORMAT); + } + ++s; + } + *s=0; + + /* get the value string, possibly quoted */ + s=(char *)u_skipWhitespace(s+1); + if(*s!='"') { + *pValue=s; + } else { + /* remove the quotes */ + *pValue=s+1; + if(end>*pValue && *(end-1)=='"') { + *--end=0; + } + } + + /* collect the information from the header field, ignore unknown keys */ + if(uprv_strcmp(*pKey, "uconv_class")==0) { + if(uprv_strcmp(*pValue, "DBCS")==0) { + states->conversionType=UCNV_DBCS; + } else if(uprv_strcmp(*pValue, "SBCS")==0) { + states->conversionType = UCNV_SBCS; + } else if(uprv_strcmp(*pValue, "MBCS")==0) { + states->conversionType = UCNV_MBCS; + } else if(uprv_strcmp(*pValue, "EBCDIC_STATEFUL")==0) { + states->conversionType = UCNV_EBCDIC_STATEFUL; + } else { + fprintf(stderr, "ucm error: unknown %s\n", *pValue); + exit(U_INVALID_TABLE_FORMAT); + } + return TRUE; + } else if(uprv_strcmp(*pKey, "mb_cur_max")==0) { + c=**pValue; + if('1'<=c && c<='4' && (*pValue)[1]==0) { + states->maxCharLength=(int8_t)(c-'0'); + states->outputType=(int8_t)(states->maxCharLength-1); + } else { + fprintf(stderr, "ucm error: illegal %s\n", *pValue); + exit(U_INVALID_TABLE_FORMAT); + } + return TRUE; + } else if(uprv_strcmp(*pKey, "mb_cur_min")==0) { + c=**pValue; + if('1'<=c && c<='4' && (*pValue)[1]==0) { + states->minCharLength=(int8_t)(c-'0'); + } else { + fprintf(stderr, "ucm error: illegal %s\n", *pValue); + exit(U_INVALID_TABLE_FORMAT); + } + return TRUE; + } else if(uprv_strcmp(*pKey, "icu:state")==0) { + /* if an SBCS/DBCS/EBCDIC_STATEFUL converter has icu:state, then turn it into MBCS */ + switch(states->conversionType) { + case UCNV_SBCS: + case UCNV_DBCS: + case UCNV_EBCDIC_STATEFUL: + states->conversionType=UCNV_MBCS; + break; + case UCNV_MBCS: + break; + default: + fprintf(stderr, "ucm error: entry for non-MBCS table or before the line\n"); + exit(U_INVALID_TABLE_FORMAT); + } + + if(states->maxCharLength==0) { + fprintf(stderr, "ucm error: before the line\n"); + exit(U_INVALID_TABLE_FORMAT); + } + ucm_addState(states, *pValue); + return TRUE; + } else if(uprv_strcmp(*pKey, "icu:base")==0) { + if(**pValue==0) { + fprintf(stderr, "ucm error: without a base table name\n"); + exit(U_INVALID_TABLE_FORMAT); + } + uprv_strcpy(ucm->baseName, *pValue); + return TRUE; + } + + return FALSE; +} + +/* post-processing ---------------------------------------------------------- */ + +static int32_t +sumUpStates(UCMStates *states) { + int32_t entry, sum, state, cell, count; + UBool allStatesReady; + + /* + * Sum up the offsets for all states. + * In each final state (where there are only final entries), + * the offsets add up directly. + * In all other state table rows, for each transition entry to another state, + * the offsets sum of that state needs to be added. + * This is achieved in at most countStates iterations. + */ + allStatesReady=FALSE; + for(count=states->countStates; !allStatesReady && count>=0; --count) { + allStatesReady=TRUE; + for(state=states->countStates-1; state>=0; --state) { + if(!(states->stateFlags[state]&MBCS_STATE_FLAG_READY)) { + allStatesReady=FALSE; + sum=0; + + /* at first, add up only the final delta offsets to keep them <512 */ + for(cell=0; cell<256; ++cell) { + entry=states->stateTable[state][cell]; + if(MBCS_ENTRY_IS_FINAL(entry)) { + switch(MBCS_ENTRY_FINAL_ACTION(entry)) { + case MBCS_STATE_VALID_16: + states->stateTable[state][cell]=MBCS_ENTRY_FINAL_SET_VALUE(entry, sum); + sum+=1; + break; + case MBCS_STATE_VALID_16_PAIR: + states->stateTable[state][cell]=MBCS_ENTRY_FINAL_SET_VALUE(entry, sum); + sum+=2; + break; + default: + /* no addition */ + break; + } + } + } + + /* now, add up the delta offsets for the transitional entries */ + for(cell=0; cell<256; ++cell) { + entry=states->stateTable[state][cell]; + if(MBCS_ENTRY_IS_TRANSITION(entry)) { + if(states->stateFlags[MBCS_ENTRY_TRANSITION_STATE(entry)]&MBCS_STATE_FLAG_READY) { + states->stateTable[state][cell]=MBCS_ENTRY_TRANSITION_SET_OFFSET(entry, sum); + sum+=states->stateOffsetSum[MBCS_ENTRY_TRANSITION_STATE(entry)]; + } else { + /* that next state does not have a sum yet, we cannot finish the one for this state */ + sum=-1; + break; + } + } + } + + if(sum!=-1) { + states->stateOffsetSum[state]=sum; + states->stateFlags[state]|=MBCS_STATE_FLAG_READY; + } + } + } + } + + if(!allStatesReady) { + fprintf(stderr, "ucm error: the state table contains loops\n"); + exit(U_INVALID_TABLE_FORMAT); + } + + /* + * For all "direct" (i.e., initial) states>0, + * the offsets need to be increased by the sum of + * the previous initial states. + */ + sum=states->stateOffsetSum[0]; + for(state=1; statecountStates; ++state) { + if((states->stateFlags[state]&0xf)==MBCS_STATE_FLAG_DIRECT) { + int32_t sum2=sum; + sum+=states->stateOffsetSum[state]; + for(cell=0; cell<256; ++cell) { + entry=states->stateTable[state][cell]; + if(MBCS_ENTRY_IS_TRANSITION(entry)) { + states->stateTable[state][cell]=MBCS_ENTRY_TRANSITION_ADD_OFFSET(entry, sum2); + } + } + } + } + + /* round up to the next even number to have the following data 32-bit-aligned */ + return states->countToUCodeUnits=(sum+1)&~1; +} + +U_CAPI void U_EXPORT2 +ucm_processStates(UCMStates *states) { + int32_t entry, state, cell, count; + + if(states->conversionType==UCNV_UNSUPPORTED_CONVERTER) { + fprintf(stderr, "ucm error: missing conversion type ()\n"); + exit(U_INVALID_TABLE_FORMAT); + } + + if(states->countStates==0) { + switch(states->conversionType) { + case UCNV_SBCS: + /* SBCS: use MBCS data structure with a default state table */ + if(states->maxCharLength!=1) { + fprintf(stderr, "error: SBCS codepage with max B/char!=1\n"); + exit(U_INVALID_TABLE_FORMAT); + } + states->conversionType=UCNV_MBCS; + ucm_addState(states, "0-ff"); + break; + case UCNV_MBCS: + fprintf(stderr, "ucm error: missing state table information () for MBCS\n"); + exit(U_INVALID_TABLE_FORMAT); + break; + case UCNV_EBCDIC_STATEFUL: + /* EBCDIC_STATEFUL: use MBCS data structure with a default state table */ + if(states->minCharLength!=1 || states->maxCharLength!=2) { + fprintf(stderr, "error: DBCS codepage with min B/char!=1 or max B/char!=2\n"); + exit(U_INVALID_TABLE_FORMAT); + } + states->conversionType=UCNV_MBCS; + ucm_addState(states, "0-ff, e:1.s, f:0.s"); + ucm_addState(states, "initial, 0-3f:4, e:1.s, f:0.s, 40:3, 41-fe:2, ff:4"); + ucm_addState(states, "0-40:1.i, 41-fe:1., ff:1.i"); + ucm_addState(states, "0-ff:1.i, 40:1."); + ucm_addState(states, "0-ff:1.i"); + break; + case UCNV_DBCS: + /* DBCS: use MBCS data structure with a default state table */ + if(states->minCharLength!=2 || states->maxCharLength!=2) { + fprintf(stderr, "error: DBCS codepage with min or max B/char!=2\n"); + exit(U_INVALID_TABLE_FORMAT); + } + states->conversionType = UCNV_MBCS; + ucm_addState(states, "0-3f:3, 40:2, 41-fe:1, ff:3"); + ucm_addState(states, "41-fe"); + ucm_addState(states, "40"); + ucm_addState(states, ""); + break; + default: + fprintf(stderr, "ucm error: unknown charset structure\n"); + exit(U_INVALID_TABLE_FORMAT); + break; + } + } + + /* + * check that the min/max character lengths are reasonable; + * to do this right, all paths through the state table would have to be + * recursively walked while keeping track of the sequence lengths, + * but these simple checks cover most state tables in practice + */ + if(states->maxCharLengthminCharLength) { + fprintf(stderr, "ucm error: max B/char < min B/char\n"); + exit(U_INVALID_TABLE_FORMAT); + } + + /* count non-direct states and compare with max B/char */ + count=0; + for(state=0; statecountStates; ++state) { + if((states->stateFlags[state]&0xf)!=MBCS_STATE_FLAG_DIRECT) { + ++count; + } + } + if(states->maxCharLength>count+1) { + fprintf(stderr, "ucm error: max B/char too large\n"); + exit(U_INVALID_TABLE_FORMAT); + } + + if(states->minCharLength==1) { + int32_t action; + + /* + * if there are single-byte characters, + * then the initial state must have direct result states + */ + for(cell=0; cell<256; ++cell) { + entry=states->stateTable[0][cell]; + if( MBCS_ENTRY_IS_FINAL(entry) && + ((action=MBCS_ENTRY_FINAL_ACTION(entry))==MBCS_STATE_VALID_DIRECT_16 || + action==MBCS_STATE_UNASSIGNED) + ) { + break; + } + } + + if(cell==256) { + fprintf(stderr, "ucm warning: min B/char too small\n"); + } + } + + /* + * make sure that all "next state" values are within limits + * and that all next states after final ones have the "direct" + * flag of initial states + */ + for(state=states->countStates-1; state>=0; --state) { + for(cell=0; cell<256; ++cell) { + entry=states->stateTable[state][cell]; + if((uint8_t)MBCS_ENTRY_STATE(entry)>=states->countStates) { + fprintf(stderr, "ucm error: state table entry [%x][%x] has a next state of %x that is too high\n", + (int)state, (int)cell, (int)MBCS_ENTRY_STATE(entry)); + exit(U_INVALID_TABLE_FORMAT); + } + if(MBCS_ENTRY_IS_FINAL(entry) && (states->stateFlags[MBCS_ENTRY_STATE(entry)]&0xf)!=MBCS_STATE_FLAG_DIRECT) { + fprintf(stderr, "ucm error: state table entry [%x][%x] is final but has a non-initial next state of %x\n", + (int)state, (int)cell, (int)MBCS_ENTRY_STATE(entry)); + exit(U_INVALID_TABLE_FORMAT); + } else if(MBCS_ENTRY_IS_TRANSITION(entry) && (states->stateFlags[MBCS_ENTRY_STATE(entry)]&0xf)==MBCS_STATE_FLAG_DIRECT) { + fprintf(stderr, "ucm error: state table entry [%x][%x] is not final but has an initial next state of %x\n", + (int)state, (int)cell, (int)MBCS_ENTRY_STATE(entry)); + exit(U_INVALID_TABLE_FORMAT); + } + } + } + + /* is this an SI/SO (like EBCDIC-stateful) state table? */ + if(states->countStates>=2 && (states->stateFlags[1]&0xf)==MBCS_STATE_FLAG_DIRECT) { + if(states->maxCharLength!=2) { + fprintf(stderr, "ucm error: SI/SO codepages must have max 2 bytes/char (not %x)\n", (int)states->maxCharLength); + exit(U_INVALID_TABLE_FORMAT); + } + if(states->countStates<3) { + fprintf(stderr, "ucm error: SI/SO codepages must have at least 3 states (not %x)\n", (int)states->countStates); + exit(U_INVALID_TABLE_FORMAT); + } + /* are the SI/SO all in the right places? */ + if( states->stateTable[0][0xe]==MBCS_ENTRY_FINAL(1, MBCS_STATE_CHANGE_ONLY, 0) && + states->stateTable[0][0xf]==MBCS_ENTRY_FINAL(0, MBCS_STATE_CHANGE_ONLY, 0) && + states->stateTable[1][0xe]==MBCS_ENTRY_FINAL(1, MBCS_STATE_CHANGE_ONLY, 0) && + states->stateTable[1][0xf]==MBCS_ENTRY_FINAL(0, MBCS_STATE_CHANGE_ONLY, 0) + ) { + states->outputType=MBCS_OUTPUT_2_SISO; + } else { + fprintf(stderr, "ucm error: SI/SO codepages must have in states 0 and 1 transitions e:1.s, f:0.s\n"); + exit(U_INVALID_TABLE_FORMAT); + } + state=2; + } else { + state=1; + } + + /* check that no unexpected state is a "direct" one */ + while(statecountStates) { + if((states->stateFlags[state]&0xf)==MBCS_STATE_FLAG_DIRECT) { + fprintf(stderr, "ucm error: state %d is 'initial' - not supported except for SI/SO codepages\n", (int)state); + exit(U_INVALID_TABLE_FORMAT); + } + ++state; + } + + sumUpStates(states); +} + +/* find a fallback for this offset; return the index or -1 if not found */ +U_CAPI int32_t U_EXPORT2 +ucm_findFallback(_MBCSToUFallback *toUFallbacks, int32_t countToUFallbacks, + uint32_t offset) { + int32_t i; + + if(countToUFallbacks==0) { + /* shortcut: most codepages do not have fallbacks from codepage to Unicode */ + return -1; + } + + /* do a linear search for the fallback mapping (the table is not yet sorted) */ + for(i=0; ioutputType==MBCS_OUTPUT_2_SISO) { + /* use the DBCS lead state for SI/SO codepages */ + leadState=1; + } else { + leadState=0; + } + + /* find the main trail state: the most used target state */ + uprv_memset(count, 0, sizeof(count)); + for(i=0; i<256; ++i) { + entry=states->stateTable[leadState][i]; + if(MBCS_ENTRY_IS_TRANSITION(entry)) { + ++count[MBCS_ENTRY_TRANSITION_STATE(entry)]; + } + } + trailState=0; + for(i=1; icountStates; ++i) { + if(count[i]>count[trailState]) { + trailState=i; + } + } + + /* count possible savings from lead bytes with all-unassigned results in all trail bytes */ + uprv_memset(count, 0, sizeof(count)); + savings=0; + /* for each lead byte */ + for(i=0; i<256; ++i) { + entry=states->stateTable[leadState][i]; + if(MBCS_ENTRY_IS_TRANSITION(entry) && (MBCS_ENTRY_TRANSITION_STATE(entry))==trailState) { + /* the offset is different for each lead byte */ + offset=MBCS_ENTRY_TRANSITION_OFFSET(entry); + /* for each trail byte for this lead byte */ + for(j=0; j<256; ++j) { + entry=states->stateTable[trailState][j]; + switch(MBCS_ENTRY_FINAL_ACTION(entry)) { + case MBCS_STATE_VALID_16: + entry=offset+MBCS_ENTRY_FINAL_VALUE_16(entry); + if((*pUnicodeCodeUnits)[entry]==0xfffe && ucm_findFallback(toUFallbacks, countToUFallbacks, entry)<0) { + ++count[i]; + } else { + j=999; /* do not count for this lead byte because there are assignments */ + } + break; + case MBCS_STATE_VALID_16_PAIR: + entry=offset+MBCS_ENTRY_FINAL_VALUE_16(entry); + if((*pUnicodeCodeUnits)[entry]==0xfffe) { + count[i]+=2; + } else { + j=999; /* do not count for this lead byte because there are assignments */ + } + break; + default: + break; + } + } + if(j==256) { + /* all trail bytes for this lead byte are unassigned */ + savings+=count[i]; + } else { + count[i]=0; + } + } + } + /* subtract from the possible savings the cost of an additional state */ + savings=savings*2-1024; /* count bytes, not 16-bit words */ + if(savings<=0) { + return; + } + if(verbose) { + printf("compacting toUnicode data saves %ld bytes\n", (long)savings); + } + if(states->countStates>=MBCS_MAX_STATE_COUNT) { + fprintf(stderr, "cannot compact toUnicode because the maximum number of states is reached\n"); + return; + } + + /* make a copy of the state table */ + oldStateTable=(int32_t (*)[256])uprv_malloc(states->countStates*1024); + if(oldStateTable==NULL) { + fprintf(stderr, "cannot compact toUnicode: out of memory\n"); + return; + } + uprv_memcpy(oldStateTable, states->stateTable, states->countStates*1024); + + /* add the new state */ + /* + * this function does not catch the degenerate case where all lead bytes + * have all-unassigned trail bytes and the lead state could be removed + */ + newState=states->countStates++; + states->stateFlags[newState]=0; + /* copy the old trail state, turning all assigned states into unassigned ones */ + for(i=0; i<256; ++i) { + entry=states->stateTable[trailState][i]; + switch(MBCS_ENTRY_FINAL_ACTION(entry)) { + case MBCS_STATE_VALID_16: + case MBCS_STATE_VALID_16_PAIR: + states->stateTable[newState][i]=MBCS_ENTRY_FINAL_SET_ACTION_VALUE(entry, MBCS_STATE_UNASSIGNED, 0xfffe); + break; + default: + states->stateTable[newState][i]=entry; + break; + } + } + + /* in the lead state, redirect all lead bytes with all-unassigned trail bytes to the new state */ + for(i=0; i<256; ++i) { + if(count[i]>0) { + states->stateTable[leadState][i]=MBCS_ENTRY_SET_STATE(states->stateTable[leadState][i], newState); + } + } + + /* sum up the new state table */ + for(i=0; icountStates; ++i) { + states->stateFlags[i]&=~MBCS_STATE_FLAG_READY; + } + sum=sumUpStates(states); + + /* allocate a new, smaller code units array */ + oldUnicodeCodeUnits=*pUnicodeCodeUnits; + if(sum==0) { + *pUnicodeCodeUnits=NULL; + if(oldUnicodeCodeUnits!=NULL) { + uprv_free(oldUnicodeCodeUnits); + } + uprv_free(oldStateTable); + return; + } + *pUnicodeCodeUnits=(uint16_t *)uprv_malloc(sum*sizeof(uint16_t)); + if(*pUnicodeCodeUnits==NULL) { + fprintf(stderr, "cannot compact toUnicode: out of memory allocating %ld 16-bit code units\n", + (long)sum); + /* revert to the old state table */ + *pUnicodeCodeUnits=oldUnicodeCodeUnits; + --states->countStates; + uprv_memcpy(states->stateTable, oldStateTable, states->countStates*1024); + uprv_free(oldStateTable); + return; + } + for(i=0; icountStates; ++leadState) { + if((states->stateFlags[leadState]&0xf)==MBCS_STATE_FLAG_DIRECT) { + /* for each lead byte from there */ + for(i=0; i<256; ++i) { + entry=states->stateTable[leadState][i]; + if(MBCS_ENTRY_IS_TRANSITION(entry)) { + trailState=(uint8_t)MBCS_ENTRY_TRANSITION_STATE(entry); + /* the new state does not have assigned states */ + if(trailState!=newState) { + trailOffset=MBCS_ENTRY_TRANSITION_OFFSET(entry); + oldTrailOffset=MBCS_ENTRY_TRANSITION_OFFSET(oldStateTable[leadState][i]); + /* for each trail byte */ + for(j=0; j<256; ++j) { + entry=states->stateTable[trailState][j]; + /* copy assigned-character code units and adjust fallback offsets */ + switch(MBCS_ENTRY_FINAL_ACTION(entry)) { + case MBCS_STATE_VALID_16: + offset=trailOffset+MBCS_ENTRY_FINAL_VALUE_16(entry); + /* find the old offset according to the old state table */ + oldOffset=oldTrailOffset+MBCS_ENTRY_FINAL_VALUE_16(oldStateTable[trailState][j]); + unit=(*pUnicodeCodeUnits)[offset]=oldUnicodeCodeUnits[oldOffset]; + if(unit==0xfffe && (fallback=ucm_findFallback(toUFallbacks, countToUFallbacks, oldOffset))>=0) { + toUFallbacks[fallback].offset=0x80000000|offset; + } + break; + case MBCS_STATE_VALID_16_PAIR: + offset=trailOffset+MBCS_ENTRY_FINAL_VALUE_16(entry); + /* find the old offset according to the old state table */ + oldOffset=oldTrailOffset+MBCS_ENTRY_FINAL_VALUE_16(oldStateTable[trailState][j]); + (*pUnicodeCodeUnits)[offset++]=oldUnicodeCodeUnits[oldOffset++]; + (*pUnicodeCodeUnits)[offset]=oldUnicodeCodeUnits[oldOffset]; + break; + default: + break; + } + } + } + } + } + } + } + + /* remove temporary flags from fallback offsets that protected them from being modified twice */ + for(i=0; i0 number of bytes that are used in unicodeCodeUnits[] that could be saved, + * if all sequences from this state are unassigned, returns the + * <0 there are assignments in unicodeCodeUnits[] + * 0 no use of unicodeCodeUnits[] + */ +static int32_t +findUnassigned(UCMStates *states, + uint16_t *unicodeCodeUnits, + _MBCSToUFallback *toUFallbacks, int32_t countToUFallbacks, + int32_t state, int32_t offset, uint32_t b) { + int32_t i, entry, savings, localSavings, belowSavings; + UBool haveAssigned; + + localSavings=belowSavings=0; + haveAssigned=FALSE; + for(i=0; i<256; ++i) { + entry=states->stateTable[state][i]; + if(MBCS_ENTRY_IS_TRANSITION(entry)) { + savings=findUnassigned(states, + unicodeCodeUnits, + toUFallbacks, countToUFallbacks, + MBCS_ENTRY_TRANSITION_STATE(entry), + offset+MBCS_ENTRY_TRANSITION_OFFSET(entry), + (b<<8)|(uint32_t)i); + if(savings<0) { + haveAssigned=TRUE; + } else if(savings>0) { + printf(" all-unassigned sequences from prefix 0x%02lx state %ld use %ld bytes\n", + (unsigned long)((b<<8)|i), (long)state, (long)savings); + belowSavings+=savings; + } + } else if(!haveAssigned) { + switch(MBCS_ENTRY_FINAL_ACTION(entry)) { + case MBCS_STATE_VALID_16: + entry=offset+MBCS_ENTRY_FINAL_VALUE_16(entry); + if(unicodeCodeUnits[entry]==0xfffe && ucm_findFallback(toUFallbacks, countToUFallbacks, entry)<0) { + localSavings+=2; + } else { + haveAssigned=TRUE; + } + break; + case MBCS_STATE_VALID_16_PAIR: + entry=offset+MBCS_ENTRY_FINAL_VALUE_16(entry); + if(unicodeCodeUnits[entry]==0xfffe) { + localSavings+=4; + } else { + haveAssigned=TRUE; + } + break; + default: + break; + } + } + } + if(haveAssigned) { + return -1; + } else { + return localSavings+belowSavings; + } +} + +/* helper function for finding compaction opportunities */ +static void +compactToUnicodeHelper(UCMStates *states, + uint16_t *unicodeCodeUnits, + _MBCSToUFallback *toUFallbacks, int32_t countToUFallbacks) { + int32_t state, savings; + + /* for each initial state */ + for(state=0; statecountStates; ++state) { + if((states->stateFlags[state]&0xf)==MBCS_STATE_FLAG_DIRECT) { + savings=findUnassigned(states, + unicodeCodeUnits, + toUFallbacks, countToUFallbacks, + state, 0, 0); + if(savings>0) { + printf(" all-unassigned sequences from initial state %ld use %ld bytes\n", + (long)state, (long)savings); + } + } + } +} + +static int32_t +compareFallbacks(const void *context, const void *fb1, const void *fb2) { + return ((const _MBCSToUFallback *)fb1)->offset-((const _MBCSToUFallback *)fb2)->offset; +} + +U_CAPI void U_EXPORT2 +ucm_optimizeStates(UCMStates *states, + uint16_t **pUnicodeCodeUnits, + _MBCSToUFallback *toUFallbacks, int32_t countToUFallbacks, + UBool verbose) { + UErrorCode errorCode; + int32_t state, cell, entry; + + /* test each state table entry */ + for(state=0; statecountStates; ++state) { + for(cell=0; cell<256; ++cell) { + entry=states->stateTable[state][cell]; + /* + * if the entry is a final one with an MBCS_STATE_VALID_DIRECT_16 action code + * and the code point is "unassigned" (0xfffe), then change it to + * the "unassigned" action code with bits 26..23 set to zero and U+fffe. + */ + if(MBCS_ENTRY_SET_STATE(entry, 0)==MBCS_ENTRY_FINAL(0, MBCS_STATE_VALID_DIRECT_16, 0xfffe)) { + states->stateTable[state][cell]=MBCS_ENTRY_FINAL_SET_ACTION(entry, MBCS_STATE_UNASSIGNED); + } + } + } + + /* try to compact the toUnicode tables */ + if(states->maxCharLength==2) { + compactToUnicode2(states, pUnicodeCodeUnits, toUFallbacks, countToUFallbacks, verbose); + } else if(states->maxCharLength>2) { + if(verbose) { + compactToUnicodeHelper(states, *pUnicodeCodeUnits, toUFallbacks, countToUFallbacks); + } + } + + /* sort toUFallbacks */ + /* + * It should be safe to sort them before compactToUnicode2() is called, + * because it should not change the relative order of the offset values + * that it adjusts, but they need to be sorted at some point, and + * it is safest here. + */ + if(countToUFallbacks>0) { + errorCode=U_ZERO_ERROR; /* nothing bad will happen... */ + uprv_sortArray(toUFallbacks, countToUFallbacks, + sizeof(_MBCSToUFallback), + compareFallbacks, NULL, FALSE, &errorCode); + } +} + +/* use a complete state table ----------------------------------------------- */ + +U_CAPI int32_t U_EXPORT2 +ucm_countChars(UCMStates *states, + const uint8_t *bytes, int32_t length) { + uint32_t offset; + int32_t i, entry, count; + uint8_t state; + + offset=0; + i=count=0; + state=0; + + if(states->countStates==0) { + fprintf(stderr, "ucm error: there is no state information!\n"); + return -1; + } + + /* for SI/SO (like EBCDIC-stateful), double-byte sequences start in state 1 */ + if(length==2 && states->outputType==MBCS_OUTPUT_2_SISO) { + state=1; + } + + /* + * Walk down the state table like in conversion, + * much like getNextUChar(). + * We assume that c<=0x10ffff. + */ + for(i=0; istateTable[state][bytes[i]]; + if(MBCS_ENTRY_IS_TRANSITION(entry)) { + state=(uint8_t)MBCS_ENTRY_TRANSITION_STATE(entry); + offset+=MBCS_ENTRY_TRANSITION_OFFSET(entry); + } else { + switch(MBCS_ENTRY_FINAL_ACTION(entry)) { + case MBCS_STATE_ILLEGAL: + fprintf(stderr, "ucm error: byte sequence ends in illegal state\n"); + return -1; + case MBCS_STATE_CHANGE_ONLY: + fprintf(stderr, "ucm error: byte sequence ends in state-change-only\n"); + return -1; + case MBCS_STATE_UNASSIGNED: + case MBCS_STATE_FALLBACK_DIRECT_16: + case MBCS_STATE_VALID_DIRECT_16: + case MBCS_STATE_FALLBACK_DIRECT_20: + case MBCS_STATE_VALID_DIRECT_20: + case MBCS_STATE_VALID_16: + case MBCS_STATE_VALID_16_PAIR: + /* count a complete character and prepare for a new one */ + ++count; + state=(uint8_t)MBCS_ENTRY_FINAL_STATE(entry); + offset=0; + break; + default: + /* reserved, must never occur */ + fprintf(stderr, "ucm error: byte sequence reached reserved action code, entry: 0x%02lx\n", (unsigned long)entry); + return -1; + } + } + } + + if(offset!=0) { + fprintf(stderr, "ucm error: byte sequence too short, ends in non-final state %hu\n", state); + return -1; + } + + /* + * for SI/SO (like EBCDIC-stateful), multiple-character results + * must consist of only double-byte sequences + */ + if(count>1 && states->outputType==MBCS_OUTPUT_2_SISO && length!=2*count) { + fprintf(stderr, "ucm error: SI/SO (like EBCDIC-stateful) result with %d characters does not contain all DBCS\n", (int)count); + return -1; + } + + return count; +} diff --git a/icuSources/tools/toolutil/unewdata.c b/icuSources/tools/toolutil/unewdata.c index c95c49b0..5666c87f 100644 --- a/icuSources/tools/toolutil/unewdata.c +++ b/icuSources/tools/toolutil/unewdata.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1999,2001, International Business Machines +* Copyright (C) 1999,2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -167,7 +167,7 @@ udata_writeBlock(UNewDataMemory *pData, const void *s, int32_t length) { U_CAPI void U_EXPORT2 udata_writePadding(UNewDataMemory *pData, int32_t length) { - static uint8_t padding[16]={ + static const uint8_t padding[16]={ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, diff --git a/icuSources/tools/toolutil/uparse.c b/icuSources/tools/toolutil/uparse.c index 9f31e74a..0a49ecb9 100644 --- a/icuSources/tools/toolutil/uparse.c +++ b/icuSources/tools/toolutil/uparse.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2000-2003, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -313,79 +313,13 @@ u_parseCodePointRange(const char *s, } } - -U_CAPI const UChar * U_EXPORT2 -u_strSkipWhiteSpace(const UChar *s, int32_t length) { - int32_t i = 0, toReturn = 0; - UChar32 c = 0; - if(s == NULL) { - return NULL; - } - if(length == 0) { - return s; - } - if(length > 0) { - for(;;) { - if(i >= length) { - break; - } - toReturn = i; - U16_NEXT(s, i, length, c); - if(!(c == 0x20 || u_isUWhiteSpace(c))) { - break; - } - } - } else { - for(;;) { - toReturn = i; - U16_NEXT(s, i, length, c); - if(!(c == 0x20 || u_isUWhiteSpace(c)) || c == 0) { - break; - } - } - } - return s+toReturn; -} - - -U_CAPI const UChar * U_EXPORT2 -u_strTrailingWhiteSpaceStart(const UChar *s, int32_t length) { - int32_t i = 0, toReturn = 0; - UChar32 c = 0; - - if(s == NULL) { - return NULL; - } - if(length == 0) { - return s; - } - - if(length < 0) { - length = u_strlen(s); - } - - i = length; - for(;;) { - toReturn = i; - if(i <= 0) { - break; - } - U16_PREV(s, 0, i, c); - if(!(c == 0x20 || u_isUWhiteSpace(c))) { - break; - } - } - - return s+toReturn; -} - U_CAPI int32_t U_EXPORT2 u_parseUTF8(const char *source, int32_t sLen, char *dest, int32_t destCapacity, UErrorCode *status) { const char *read = source; int32_t i = 0; unsigned int value = 0; if(sLen == -1) { - sLen = strlen(source); + sLen = (int32_t)strlen(source); } while(read < source+sLen) { diff --git a/icuSources/tools/toolutil/uparse.h b/icuSources/tools/toolutil/uparse.h index 7f7b8f3d..dc3e0b8c 100644 --- a/icuSources/tools/toolutil/uparse.h +++ b/icuSources/tools/toolutil/uparse.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2000-2003, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -118,13 +118,6 @@ u_parseCodePointRange(const char *s, UErrorCode *pErrorCode); -U_CAPI const UChar * U_EXPORT2 -u_strSkipWhiteSpace(const UChar *s, int32_t length); - - -U_CAPI const UChar * U_EXPORT2 -u_strTrailingWhiteSpaceStart(const UChar *s, int32_t length); - U_CAPI int32_t U_EXPORT2 u_parseUTF8(const char *source, int32_t sLen, char *dest, int32_t destCapacity, UErrorCode *status); diff --git a/icuSources/tools/toolutil/uperf.cpp b/icuSources/tools/toolutil/uperf.cpp index bfd6a9b1..3493ae29 100644 --- a/icuSources/tools/toolutil/uperf.cpp +++ b/icuSources/tools/toolutil/uperf.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 2002-2003, International Business Machines Corporation and + * Copyright (c) 2002-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -9,9 +9,25 @@ static const char delim = '/'; static int32_t execCount = 0; UPerfTest* UPerfTest::gTest = NULL; -static const int MAXLINES = 40000; -//static const char *currDir = "."; - +static const int MAXLINES = 40000; +const char UPerfTest::gUsageString[] = + "Usage: %s [OPTIONS] [FILES]\n" + "\tReads the input file and prints out time taken in seconds\n" + "Options:\n" + "\t-h or -? or --help this usage text\n" + "\t-v or --verbose print extra information when processing files\n" + "\t-s or --sourcedir source directory for files followed by path\n" + "\t followed by path\n" + "\t-e or --encoding encoding of source files\n" + "\t-u or --uselen perform timing analysis on non-null terminated buffer using length\n" + "\t-f or --file-name file to be used as input data\n" + "\t-p or --passes Number of passes to be performed. Requires Numeric argument. Cannot be used with --time\n" + "\t-i or --iterations Number of iterations to be performed. Requires Numeric argument\n" + "\t-t or --time Threshold time for looping until in seconds. Requires Numeric argument.Cannot be used with --iterations\n" + "\t-l or --line-mode The data file should be processed in line mode\n" + "\t-b or --bulk-mode The data file should be processed in file based. Cannot be used with --line-mode\n" + "\t-L or --locale Locale for the test\n"; + enum { HELP1, @@ -31,20 +47,20 @@ enum static UOption options[]={ - UOPTION_HELP_H, - UOPTION_HELP_QUESTION_MARK, - UOPTION_VERBOSE, - UOPTION_SOURCEDIR, - UOPTION_ENCODING, - UOPTION_DEF( "uselen", 'u', UOPT_NO_ARG), - UOPTION_DEF( "file-name", 'f', UOPT_REQUIRES_ARG), - UOPTION_DEF( "passes", 'p', UOPT_REQUIRES_ARG), - UOPTION_DEF( "iterations", 'i', UOPT_REQUIRES_ARG), - UOPTION_DEF( "time", 't', UOPT_REQUIRES_ARG), - UOPTION_DEF( "line-mode", 'l', UOPT_NO_ARG), - UOPTION_DEF( "bulk-mode", 'b', UOPT_NO_ARG), - UOPTION_DEF( "locale", 'L', UOPT_REQUIRES_ARG) - }; + UOPTION_HELP_H, + UOPTION_HELP_QUESTION_MARK, + UOPTION_VERBOSE, + UOPTION_SOURCEDIR, + UOPTION_ENCODING, + UOPTION_DEF( "uselen", 'u', UOPT_NO_ARG), + UOPTION_DEF( "file-name", 'f', UOPT_REQUIRES_ARG), + UOPTION_DEF( "passes", 'p', UOPT_REQUIRES_ARG), + UOPTION_DEF( "iterations", 'i', UOPT_REQUIRES_ARG), + UOPTION_DEF( "time", 't', UOPT_REQUIRES_ARG), + UOPTION_DEF( "line-mode", 'l', UOPT_NO_ARG), + UOPTION_DEF( "bulk-mode", 'b', UOPT_NO_ARG), + UOPTION_DEF( "locale", 'L', UOPT_REQUIRES_ARG) +}; UPerfTest::UPerfTest(int32_t argc, const char* argv[], UErrorCode& status){ @@ -156,33 +172,30 @@ ULine* UPerfTest::getLines(UErrorCode& status){ const UChar* line=NULL; int32_t len =0; for (;;) { - line = ucbuf_readline(ucharBuf,&len,&status); - if(status == U_EOF||U_FAILURE(status)){ - break; - } - lines[numLines].name = new UChar[len]; - lines[numLines].len = len; - memcpy(lines[numLines].name, line, len * U_SIZEOF_UCHAR); - - numLines++; - len = 0; - if (numLines >= maxLines) { - maxLines += MAXLINES; - ULine *newLines = new ULine[maxLines]; - if(newLines == NULL) { - fprintf(stderr, "Out of memory reading line %d.\n", numLines); - status= U_MEMORY_ALLOCATION_ERROR; - delete lines; - return NULL; - } - - memcpy(newLines, lines, numLines*sizeof(ULine)); + line = ucbuf_readline(ucharBuf,&len,&status); + if(line == NULL || U_FAILURE(status)){ + break; + } + lines[numLines].name = new UChar[len]; + lines[numLines].len = len; + memcpy(lines[numLines].name, line, len * U_SIZEOF_UCHAR); + + numLines++; + len = 0; + if (numLines >= maxLines) { + maxLines += MAXLINES; + ULine *newLines = new ULine[maxLines]; + if(newLines == NULL) { + fprintf(stderr, "Out of memory reading line %d.\n", (int)numLines); + status= U_MEMORY_ALLOCATION_ERROR; delete lines; - lines = newLines; + return NULL; } - } - if(status==U_EOF){ - status =U_ZERO_ERROR; + + memcpy(newLines, lines, numLines*sizeof(ULine)); + delete lines; + lines = newLines; + } } return lines; } @@ -309,85 +322,85 @@ UBool UPerfTest::runTestLoop( char* testname, char* par ) return FALSE; } if(iterations == 0) { - n = time; - // Run for specified duration in seconds - if(verbose==TRUE){ - fprintf(stdout,"= %s calibrating %i seconds \n" ,name, n); - } - - //n *= 1000; // s => ms - //System.out.println("# " + meth.getName() + " " + n + " sec"); - int32_t failsafe = 1; // last resort for very fast methods - t = 0; - while (t < (int)(n * 0.9)) { // 90% is close enough - if (loops == 0 || t == 0) { - loops = failsafe; - failsafe *= 10; - } else { - //System.out.println("# " + meth.getName() + " x " + loops + " = " + t); - loops = (int)((double)n / t * loops + 0.5); - if (loops == 0) { - fprintf(stderr,"Unable to converge on desired duration"); - return FALSE; - } - } - //System.out.println("# " + meth.getName() + " x " + loops); - t = testFunction->time(loops,&status); - if(U_FAILURE(status)){ - printf("Performance test failed with error: %s \n", u_errorName(status)); - break; - } - } + n = time; + // Run for specified duration in seconds + if(verbose==TRUE){ + fprintf(stdout,"= %s calibrating %i seconds \n", name, (int)n); + } + + //n *= 1000; // s => ms + //System.out.println("# " + meth.getName() + " " + n + " sec"); + int32_t failsafe = 1; // last resort for very fast methods + t = 0; + while (t < (int)(n * 0.9)) { // 90% is close enough + if (loops == 0 || t == 0) { + loops = failsafe; + failsafe *= 10; + } else { + //System.out.println("# " + meth.getName() + " x " + loops + " = " + t); + loops = (int)((double)n / t * loops + 0.5); + if (loops == 0) { + fprintf(stderr,"Unable to converge on desired duration"); + return FALSE; + } + } + //System.out.println("# " + meth.getName() + " x " + loops); + t = testFunction->time(loops,&status); + if(U_FAILURE(status)){ + printf("Performance test failed with error: %s \n", u_errorName(status)); + break; + } + } } else { - loops = iterations; + loops = iterations; } for(int32_t ps =0; ps < passes; ps++){ - long events = -1; - fprintf(stdout,"= %s begin " ,name); - if(verbose==TRUE){ - if(iterations > 0) { - fprintf(stdout, "%i\n", loops); - } else { - fprintf(stdout, "%i\n", n); - } - } else { - fprintf(stdout, "\n"); - } - t = testFunction->time(loops, &status); - if(U_FAILURE(status)){ - printf("Performance test failed with error: %s \n", u_errorName(status)); - break; - } - events = testFunction->getEventsPerIteration(); - //print info only in verbose mode - if(verbose==TRUE){ + long events = -1; + fprintf(stdout,"= %s begin " ,name); + if(verbose==TRUE){ + if(iterations > 0) { + fprintf(stdout, "%i\n", (int)loops); + } else { + fprintf(stdout, "%i\n", (int)n); + } + } else { + fprintf(stdout, "\n"); + } + t = testFunction->time(loops, &status); + if(U_FAILURE(status)){ + printf("Performance test failed with error: %s \n", u_errorName(status)); + break; + } + events = testFunction->getEventsPerIteration(); + //print info only in verbose mode + if(verbose==TRUE){ /* - if(events == -1){ - fprintf(stdout,"= %s end %f %i %i\n",name , t , loops, testFunction->getOperationsPerIteration()); - }else{ - fprintf(stdout,"= %s end %f %i %i %i\n",name , t , loops, testFunction->getOperationsPerIteration(), events); - } + if(events == -1){ + fprintf(stdout,"= %s end %f %i %i\n",name , t , loops, testFunction->getOperationsPerIteration()); + }else{ + fprintf(stdout,"= %s end %f %i %i %i\n",name , t , loops, testFunction->getOperationsPerIteration(), events); + } */ - if(events == -1){ - fprintf(stdout,"= %s end: %f loops: %i operations: %li \n",name , t , loops, testFunction->getOperationsPerIteration()); - }else{ - fprintf(stdout,"= %s end: %f loops: %i operations: %li events: %li\n",name , t , loops, testFunction->getOperationsPerIteration(), events); - } - }else{ + if(events == -1){ + fprintf(stdout, "= %s end: %f loops: %i operations: %li \n", name, t, (int)loops, testFunction->getOperationsPerIteration()); + }else{ + fprintf(stdout, "= %s end: %f loops: %i operations: %li events: %li\n", name, t, (int)loops, testFunction->getOperationsPerIteration(), events); + } + }else{ /* - if(events == -1){ - fprintf(stdout,"= %f %i %i \n", t , loops, testFunction->getOperationsPerIteration()); - }else{ - fprintf(stdout,"= %f %i %i %i\n", t , loops, testFunction->getOperationsPerIteration(), events); - } + if(events == -1){ + fprintf(stdout,"= %f %i %i \n", t , loops, testFunction->getOperationsPerIteration()); + }else{ + fprintf(stdout,"= %f %i %i %i\n", t , loops, testFunction->getOperationsPerIteration(), events); + } */ - if(events == -1){ - fprintf(stdout,"= %s end %f %i %li\n",name , t , loops, testFunction->getOperationsPerIteration()); - }else{ - fprintf(stdout,"= %s end %f %i %li %li\n",name , t , loops, testFunction->getOperationsPerIteration(), events); - } - } + if(events == -1){ + fprintf(stdout,"= %s end %f %i %li\n", name, t, (int)loops, testFunction->getOperationsPerIteration()); + }else{ + fprintf(stdout,"= %s end %f %i %li %li\n", name, t, (int)loops, testFunction->getOperationsPerIteration(), events); + } + } } delete testFunction; } @@ -412,7 +425,8 @@ void UPerfTest::usage( void ) const char* name = NULL; do{ this->runIndexedTest( index, FALSE, name ); - if (!name) break; + if (!name) + break; fprintf(stdout,name); fprintf(stdout,"\n"); index++; diff --git a/icuSources/tools/toolutil/uperf.h b/icuSources/tools/toolutil/uperf.h index 94d58fdb..939f873a 100644 --- a/icuSources/tools/toolutil/uperf.h +++ b/icuSources/tools/toolutil/uperf.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (c) 2002-2003, International Business Machines +* Copyright (c) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** ********************************************************************** @@ -152,26 +152,8 @@ private: // static members public: static UPerfTest* gTest; - static const char* gUsageString; + static const char gUsageString[]; }; -const char* UPerfTest::gUsageString = - "Usage: %s [OPTIONS] [FILES]\n" - "\tReads the input file and prints out time taken in seconds\n" - "Options:\n" - "\t-h or -? or --help this usage text\n" - "\t-v or --verbose print extra information when processing files\n" - "\t-s or --sourcedir source directory for files followed by path\n" - "\t followed by path\n" - "\t-e or --encoding encoding of source files\n" - "\t-u or --uselen perform timing analysis on non-null terminated buffer using length\n" - "\t-f or --file-name file to be used as input data\n" - "\t-p or --passes Number of passes to be performed. Requires Numeric argument. Cannot be used with --time\n" - "\t-i or --iterations Number of iterations to be performed. Requires Numeric argument\n" - "\t-t or --time Threshold time for looping until in seconds. Requires Numeric argument.Cannot be used with --iterations\n" - "\t-l or --line-mode The data file should be processed in line mode\n" - "\t-b or --bulk-mode The data file should be processed in file based. Cannot be used with --line-mode\n" - "\t-L or --locale Locale for the test\n"; - #endif diff --git a/icuSources/tools/toolutil/utimer.h b/icuSources/tools/toolutil/utimer.h index be76d4a7..6926cdfe 100644 --- a/icuSources/tools/toolutil/utimer.h +++ b/icuSources/tools/toolutil/utimer.h @@ -1,6 +1,6 @@ /* ************************************************************************ -* Copyright (c) 1997-2002, International Business Machines +* Copyright (c) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. ************************************************************************ */ @@ -9,8 +9,11 @@ #define _UTIMER_H #if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) +# define VC_EXTRALEAN +# define WIN32_LEAN_AND_MEAN # include #else +# include # include # include #endif diff --git a/icuSources/tools/tzcode/patch-icu-tzcode b/icuSources/tools/tzcode/patch-icu-tzcode new file mode 100644 index 00000000..37da1380 --- /dev/null +++ b/icuSources/tools/tzcode/patch-icu-tzcode @@ -0,0 +1,475 @@ +diff -u -r ../tzcode.orig/Makefile ./Makefile +--- ../tzcode.orig/Makefile 2003-12-15 06:33:34.000000000 -0800 ++++ ./Makefile 2004-05-24 14:30:31.659356800 -0700 +@@ -40,7 +40,7 @@ + # (and subdirectories). + # Use an absolute path name for TZDIR unless you're just testing the software. + +-TZDIR= $(TOPDIR)/etc/zoneinfo ++TZDIR= zoneinfo + + # The "tzselect", "zic", and "zdump" commands get installed in. . . + +@@ -239,9 +239,11 @@ + + ############################################################################### + +-cc= cc ++cc= gcc + CC= $(cc) -DTZDIR=\"$(TZDIR)\" + ++CPP= g++ ++ + TZCSRCS= zic.c localtime.c asctime.c scheck.c ialloc.c + TZCOBJS= zic.o localtime.o asctime.o scheck.o ialloc.o + TZDSRCS= zdump.c localtime.c asctime.c ialloc.c +@@ -275,7 +277,10 @@ + + SHELL= /bin/sh + +-all: tzselect zic zdump $(LIBOBJS) ++LS= /usr/bin/ls ++SED= /usr/bin/sed ++ ++all: tzselect zic zdump $(LIBOBJS) tz2icu + + ALL: all date + +@@ -308,9 +313,12 @@ + zdump: $(TZDOBJS) + $(CC) $(CFLAGS) $(LFLAGS) $(TZDOBJS) $(LDLIBS) -o $@ + +-zic: $(TZCOBJS) yearistype ++zic: $(TZCOBJS) yearistype tz2icu.h + $(CC) $(CFLAGS) $(LFLAGS) $(TZCOBJS) $(LDLIBS) -o $@ + ++tz2icu: tz2icu.cpp tz2icu.h ++ $(CPP) -W -Wall -pedantic tz2icu.cpp -o $@ ++ + yearistype: yearistype.sh + cp yearistype.sh yearistype + chmod +x yearistype +@@ -321,6 +329,9 @@ + right_only: zic leapseconds $(TDATA) + $(ZIC) -y $(YEARISTYPE) -d $(TZDIR) -L leapseconds $(TDATA) + ++icu_data: tz2icu posix_only ++ ./tz2icu zoneinfo zone.tab `$(LS) tzdata*.tar.gz | $(SED) -e "s/^tzdata//;s/\.tar\.gz$$//"` ++ + # In earlier versions of this makefile, the other two directories were + # subdirectories of $(TZDIR). However, this led to configuration errors. + # For example, with posix_right under the earlier scheme, +diff -u -r ../tzcode.orig/zic.c ./zic.c +--- ../tzcode.orig/zic.c 2003-12-15 06:36:35.000000000 -0800 ++++ ./zic.c 2004-05-24 14:03:43.937566400 -0700 +@@ -13,6 +13,20 @@ + #define MKDIR_UMASK 0755 + #endif + ++/* Enable extensions and modifications for ICU. */ ++#define ICU ++ ++/* Continue executing after link failure. Even if ICU is undefined ++ * (for vanilla zic behavior), ICU_LINKS should be defined, since zic ++ * appears to fail on the 2003 data the first time through during the ++ * linking phase. Running zic twice, with ICU_LINKS defined, causes ++ * links to be handled correctly. */ ++#define ICU_LINKS ++ ++#ifdef ICU ++#include "tz2icu.h" ++#endif ++ + /* + ** On some ancient hosts, predicates like `isspace(C)' are defined + ** only if isascii(C) || C == EOF. Modern hosts obey the C Standard, +@@ -86,8 +100,14 @@ + extern int optind; + + static void addtt P((time_t starttime, int type)); ++#ifdef ICU ++static int addtype P((long gmtoff, long rawoff, long dstoff, ++ const char * abbr, int isdst, ++ int ttisstd, int ttisgmt)); ++#else + static int addtype P((long gmtoff, const char * abbr, int isdst, + int ttisstd, int ttisgmt)); ++#endif + static void leapadd P((time_t t, int positive, int rolling, int count)); + static void adjleap P((void)); + static void associate P((void)); +@@ -256,6 +276,18 @@ + const int l_value; + }; + ++#ifdef ICU ++ ++/* Indices into rules[] for final rules. They will occur in pairs, ++ * with finalRules[i] occurring before finalRules[i+1] in the year. ++ * Each zone need only store a start year, a standard offset, and an ++ * index into finalRules[]. FinalRules[] are aliases into rules[]. */ ++ ++static const struct rule ** finalRules; ++static int finalRulesCount; ++ ++#endif ++ + static struct lookup const * byword P((const char * string, + const struct lookup * lp)); + +@@ -338,6 +370,11 @@ + unsigned char type; + } attypes[TZ_MAX_TIMES]; + static long gmtoffs[TZ_MAX_TYPES]; ++#ifdef ICU ++/* gmtoffs[i] = rawoffs[i] + dstoffs[i] */ ++static long rawoffs[TZ_MAX_TYPES]; ++static long dstoffs[TZ_MAX_TYPES]; ++#endif + static char isdsts[TZ_MAX_TYPES]; + static unsigned char abbrinds[TZ_MAX_TYPES]; + static char ttisstds[TZ_MAX_TYPES]; +@@ -447,6 +484,62 @@ + (void) exit(EXIT_FAILURE); + } + ++#ifdef ICU ++ ++/* File into which we will write supplemental ICU data. */ ++static FILE * icuFile; ++ ++void emit_icu_zone(FILE* f, const char* zoneName, int zoneOffset, ++ const struct rule* rule, ++ int ruleIndex, int startYear) { ++ /* machine-readable section */ ++ fprintf(f, "zone %s %d %d %s", zoneName, zoneOffset, startYear, rule->r_name); ++ ++ /* human-readable section */ ++ fprintf(f, " # zone %s, offset %d, year >= %d, rule %s (%d)\n", ++ zoneName, zoneOffset, startYear, ++ rule->r_name, ruleIndex); ++} ++ ++void emit_icu_link(FILE* f, const char* from, const char* to) { ++ /* machine-readable section */ ++ fprintf(f, "link %s %s\n", from, to); ++} ++ ++static const char* DYCODE[] = {"DOM", "DOWGEQ", "DOWLEQ"}; ++ ++void emit_icu_rule(FILE* f, const struct rule* r, int ruleIndex) { ++ if (r->r_yrtype != NULL) { ++ warning("year types not supported by ICU"); ++ fprintf(stderr, "rule %s, file %s, line %d\n", ++ r->r_name, r->r_filename, r->r_linenum); ++ } ++ ++ /* machine-readable section */ ++ fprintf(f, "rule %s %s %d %d %d %d %d %d %d", ++ r->r_name, DYCODE[r->r_dycode], ++ r->r_month, r->r_dayofmonth, ++ (r->r_dycode == DC_DOM ? -1 : r->r_wday), ++ r->r_tod, r->r_todisstd, r->r_todisgmt, r->r_stdoff ++ ); ++ ++ /* human-readable section */ ++ fprintf(f, " # %d: %s, file %s, line %d", ++ ruleIndex, r->r_name, r->r_filename, r->r_linenum); ++ fprintf(f, ", mode %s", DYCODE[r->r_dycode]); ++ fprintf(f, ", %s, dom %d", mon_names[r->r_month].l_word, r->r_dayofmonth); ++ if (r->r_dycode != DC_DOM) { ++ fprintf(f, ", %s", wday_names[r->r_wday].l_word); ++ } ++ fprintf(f, ", time %d", r->r_tod); ++ fprintf(f, ", isstd %d", r->r_todisstd); ++ fprintf(f, ", isgmt %d", r->r_todisgmt); ++ fprintf(f, ", offset %ld", r->r_stdoff); ++ fprintf(f, "\n"); ++} ++ ++#endif ++ + static const char * psxrules; + static const char * lcltime; + static const char * directory; +@@ -554,6 +647,14 @@ + adjleap(); + } + ++#ifdef ICU ++ if ((icuFile = fopen(ICU_ZONE_FILE, "w")) == NULL) { ++ const char *e = strerror(errno); ++ (void) fprintf(stderr, _("%s: Can't open %s: %s\n"), ++ progname, ICU_ZONE_FILE, e); ++ (void) exit(EXIT_FAILURE); ++ } ++#endif + for (i = optind; i < argc; ++i) + infile(argv[i]); + if (errors) +@@ -573,6 +674,9 @@ + for (i = 0; i < nlinks; ++i) { + eat(links[i].l_filename, links[i].l_linenum); + dolink(links[i].l_from, links[i].l_to); ++#ifdef ICU ++ emit_icu_link(icuFile, links[i].l_from, links[i].l_to); ++#endif + } + if (lcltime != NULL) { + eat("command line", 1); +@@ -582,6 +686,11 @@ + eat("command line", 1); + dolink(psxrules, TZDEFRULES); + } ++#ifdef ICU ++ for (i=0; iz_filename, zp->z_linenum); + *startbuf = '\0'; + startoff = zp->z_gmtoff; ++#ifdef ICU ++ finalRuleYear = finalRuleIndex = -1; ++ finalRule1 = finalRule2 = NULL; ++ if (i == (zonecount - 1)) { /* !useuntil */ ++ /* Look for exactly 2 rules that end at 'max' and ++ * note them. Determine max(r_loyear) for the 2 of ++ * them. */ ++ for (j=0; jz_nrules; ++j) { ++ rp = &zp->z_rules[j]; ++ if (rp->r_hiyear == INT_MAX) { ++ if (finalRule1 == NULL) { ++ finalRule1 = rp; ++ finalRuleYear = rp->r_loyear; ++ } else if (finalRule2 == NULL) { ++ finalRule2 = rp; ++ if (rp->r_loyear > finalRuleYear) { ++ finalRuleYear = rp->r_loyear; ++ } ++ } else { ++ error("more than two max rules found (ICU)"); ++ exit(EXIT_FAILURE); ++ } ++ } ++ } ++ if (finalRule1 != NULL && finalRule2 == NULL) { ++ error("only one max rule found (ICU)"); ++ exit(EXIT_FAILURE); ++ } ++ if (finalRule1 != NULL) { ++ /* Swap if necessary so finalRule1 occurs before ++ * finalRule2 */ ++ if (finalRule1->r_month > finalRule2->r_month) { ++ const struct rule* t = finalRule1; ++ finalRule1 = finalRule2; ++ finalRule2 = t; ++ } ++ /* Add final rule to our list */ ++ finalRuleIndex = add_icu_final_rules(finalRule1, finalRule2); ++ } ++ } ++#endif + if (zp->z_nrules == 0) { + stdoff = zp->z_stdoff; + doabbr(startbuf, zp->z_format, + (char *) NULL, stdoff != 0); + type = addtype(oadd(zp->z_gmtoff, stdoff), ++#ifdef ICU ++ zp->z_gmtoff, stdoff, ++#endif + startbuf, stdoff != 0, startttisstd, + startttisgmt); + if (usestart) { +@@ -1708,6 +1896,15 @@ + break; /* go on to next year */ + rp = &zp->z_rules[k]; + rp->r_todo = FALSE; ++#ifdef ICU ++ if (year >= finalRuleYear && rp == finalRule1) { ++ emit_icu_zone(icuFile, ++ zpfirst->z_name, zp->z_gmtoff, ++ rp, finalRuleIndex, year); ++ /* only emit this for the first year */ ++ finalRule1 = NULL; ++ } ++#endif + if (useuntil && ktime >= untiltime) + break; + stdoff = rp->r_stdoff; +@@ -1735,8 +1932,14 @@ + doabbr(buf, zp->z_format, rp->r_abbrvar, + rp->r_stdoff != 0); + offset = oadd(zp->z_gmtoff, rp->r_stdoff); ++#ifdef ICU ++ type = addtype(offset, zp->z_gmtoff, rp->r_stdoff, ++ buf, rp->r_stdoff != 0, ++ rp->r_todisstd, rp->r_todisgmt); ++#else + type = addtype(offset, buf, rp->r_stdoff != 0, + rp->r_todisstd, rp->r_todisgmt); ++#endif + addtt(ktime, type); + } + } +@@ -1750,10 +1953,19 @@ + if (*startbuf == '\0') + error(_("can't determine time zone abbreviation to use just after until time")); + else addtt(starttime, ++#ifdef ICU ++ addtype(startoff, ++ zp->z_gmtoff, startoff - zp->z_gmtoff, ++ startbuf, ++ startoff != zp->z_gmtoff, ++ startttisstd, ++ startttisgmt)); ++#else + addtype(startoff, startbuf, + startoff != zp->z_gmtoff, + startttisstd, + startttisgmt)); ++#endif + } + /* + ** Now we may get to set starttime for the next zone line. +@@ -1779,6 +1991,10 @@ + if (starttime <= min_time || + (timecnt == 1 && attypes[0].at < min_time)) { + gmtoffs[0] = gmtoffs[type]; ++#ifdef ICU ++ rawoffs[0] = rawoffs[type]; ++ dstoffs[0] = dstoffs[type]; ++#endif + isdsts[0] = isdsts[type]; + ttisstds[0] = ttisstds[type]; + ttisgmts[0] = ttisgmts[type]; +@@ -1800,8 +2016,15 @@ + } + + static int ++#ifdef ICU ++addtype(gmtoff, rawoff, dstoff, abbr, isdst, ttisstd, ttisgmt) ++const long gmtoff; ++const long rawoff; ++const long dstoff; ++#else + addtype(gmtoff, abbr, isdst, ttisstd, ttisgmt) + const long gmtoff; ++#endif + const char * const abbr; + const int isdst; + const int ttisstd; +@@ -1821,12 +2044,25 @@ + error(_("internal error - addtype called with bad ttisgmt")); + (void) exit(EXIT_FAILURE); + } ++#ifdef ICU ++ if (isdst != (dstoff != 0)) { ++ error(_("internal error - addtype called with bad isdst/dstoff")); ++ (void) exit(EXIT_FAILURE); ++ } ++ if (gmtoff != (rawoff + dstoff)) { ++ error(_("internal error - addtype called with bad gmt/raw/dstoff")); ++ (void) exit(EXIT_FAILURE); ++ } ++#endif + /* + ** See if there's already an entry for this zone type. + ** If so, just return its index. + */ + for (i = 0; i < typecnt; ++i) { + if (gmtoff == gmtoffs[i] && isdst == isdsts[i] && ++#ifdef ICU ++ rawoff == rawoffs[i] && dstoff == dstoffs[i] && ++#endif + strcmp(abbr, &chars[abbrinds[i]]) == 0 && + ttisstd == ttisstds[i] && + ttisgmt == ttisgmts[i]) +@@ -1841,6 +2077,10 @@ + (void) exit(EXIT_FAILURE); + } + gmtoffs[i] = gmtoff; ++#ifdef ICU ++ rawoffs[i] = rawoff; ++ dstoffs[i] = dstoff; ++#endif + isdsts[i] = isdst; + ttisstds[i] = ttisstd; + ttisgmts[i] = ttisgmt; diff --git a/icuSources/tools/tzcode/readme.txt b/icuSources/tools/tzcode/readme.txt new file mode 100644 index 00000000..d13b1468 --- /dev/null +++ b/icuSources/tools/tzcode/readme.txt @@ -0,0 +1,146 @@ +********************************************************************** +* Copyright (c) 2003-2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Author: Alan Liu +* Created: August 18 2003 +* Since: ICU 2.8 +********************************************************************** + +---------------------------------------------------------------------- +OVERVIEW + +This file describes the tools in icu/source/tools/tzcode + +The purpose of these tools is to process the zoneinfo or "Olson" time +zone database into a form usable by ICU4C (release 2.8 and later). +Unlike earlier releases, ICU4C 2.8 supports historical time zone +behavior, as well as the full set of Olson compatibility IDs. + +References: + +ICU4C: http://oss.software.ibm.com/icu/ +Olson: ftp://elsie.nci.nih.gov/pub/ + +---------------------------------------------------------------------- +ICU4C vs. ICU4J + +For ICU releases >= 2.8, both ICU4C and ICU4J implement full +historical time zones, based on Olson data. The implementations in C +and Java are somewhat different. The C implementation is a +self-contained implementation, whereas ICU4J uses the underlying JDK +1.3 or 1.4 time zone implementation. + +Older versions of ICU (C and Java <= 2.6) implement a "present day +snapshot". This only reflects current time zone behavior, without +historical variation. Furthermore, it lacks the full set of Olson +compatibility IDs. + +---------------------------------------------------------------------- +BACKGROUND + +The zoneinfo or "Olson" time zone package is used by various systems +to describe the behavior of time zones. The package consists of +several parts. E.g.: + + Index of ftp://elsie.nci.nih.gov/pub/ + + classictzcode.tar.gz 65 KB 12/10/1994 12:00:00 AM + classictzdata.tar.gz 67 KB 12/10/1994 12:00:00 AM + e5+57.tar.gz 2909 KB 3/22/1993 12:00:00 AM + iso8601.ps.gz 16 KB 7/27/1996 12:00:00 AM + leastsq.xls 49 KB 4/24/1997 12:00:00 AM + ltroff.tar.gz 36 KB 7/16/1993 12:00:00 AM + pi.shar.gz 4 KB 3/9/1994 12:00:00 AM + tzarchive.gz 3412 KB 8/18/2003 4:00:00 AM + tzcode2003a.tar.gz 98 KB 3/24/2003 2:32:00 PM + tzdata2003a.tar.gz 132 KB 3/24/2003 2:32:00 PM + +ICU only uses the tzcodeYYYYV.tar.gz and tzdataYYYYV.tar.gz files, +where YYYY is the year and V is the version letter ('a'...'z'). + +---------------------------------------------------------------------- +HOWTO + +1. Obtain the current versions of tzcodeYYYYV.tar.gz (aka `tzcode') + and tzdataYYYYV.tar.gz (aka `tzdata') from the FTP site given + above. Either manually download or use wget: + + $ cd {path_to}/icu/source/tools/tzcode + $ wget "ftp://elsie.nci.nih.gov/pub/tz*.tar.gz" + +2. Unpack tzcode and tzdata directly into the directory tzcode: + + $ tar xzvf tzcode*.tar.gz + $ tar xzvf tzdata*.tar.gz + + *** Make sure you only have ONE FILE named tzdata*.tar.gz in the + directory. + *** Do NOT delete the tzdata*.tar.gz file. + + The Makefile looks in the current directory to determine the + version of Olson data it is building by looking for tzdata*.tar.gz. + +3. Apply the ICU patch to zic.c: + + $ patch < patch-icu-tzcode + + If patch complains at this point, there is a mismatch that must be + manually addressed. See the CVS log of `patch-icu-tzcode' for + version details. + +4. Build: + + $ make icu_data + +5. Copy the data files to the correct location in the ICU4C/ICU4J + source trees: + + $ cp zoneinfo.txt ../../../data/misc/ + $ cp ZoneMetaData.java {path_to}/icu4j/src/com/ibm/icu/impl + +6. Rebuild ICU: + + $ cd ../../../ + $ {*make} + +7. Don't forget to check in the new zoneinfo.txt (from its location at + {path_to}/icu/source/data/misc/zoneinfo.txt) into CVS. + +---------------------------------------------------------------------- +HOWTO regenerate patch-icu-tzcode + +If you need to edit any of the tzcode* files, you will need to +regenerate the patch file as follows. + +1. Follow the above instructions to extract and patch the tzcode* + files in {path_to}/icu/source/tools/tzcode. Modify any of the + tzcode files. + +2. Extract a clean set of the tzcode* files into a new directory, + ../tzcode.orig/: + + $ mkdir ../tzcode.orig + $ cd ../tzcode.orig + $ tar xzf ../tzcode/tzcode*.tar.gz + $ cd ../tzcode + +3. Compute diffs, ignoring files that are in only one directory: + + $ diff -ur ../tzcode.orig . | grep -vE -e "^Only in " > patch-icu-tzcode + +4. Test the patch-icu-tzcode file by regenerating and diffing the + files again in another directory. The expected output from the + final diff command is *nothing*. + + $ mkdir ../tzcode.new + $ cd ../tzcode.new + $ tar xzf ../tzcode/tzcode*.tar.gz + $ patch < ../tzcode/patch-icu-tzcode + $ cd ../tzcode + $ diff -ur ../tzcode.new . | grep -vE -e "^Only in " + +5. Check in the new patch-icu-tzcode file. + +---------------------------------------------------------------------- +eof diff --git a/icuSources/tools/gentz/tz.alias b/icuSources/tools/tzcode/tz.alias similarity index 73% rename from icuSources/tools/gentz/tz.alias rename to icuSources/tools/tzcode/tz.alias index e36c067d..ed5199eb 100644 --- a/icuSources/tools/gentz/tz.alias +++ b/icuSources/tools/tzcode/tz.alias @@ -1,5 +1,5 @@ ###################################################################### -# Copyright (C) 1999-2001, International Business Machines +# Copyright (C) 1999-2004, International Business Machines # Corporation and others. All Rights Reserved. ###################################################################### # A simple alias list. We use this to retain backward compatibility. @@ -7,11 +7,13 @@ # the zone America/Los_Angeles. Unless we continue to have a zone with # this ID, legacy code may break. # -# This list is read by tz.pl and the alias names listed here are -# incorporated into the tz.txt file as clones. +# This list is read by tz2icu to incorporate legacy ICU zone aliases +# into the ICU system zone data. # # Format: alias_name unix_name # optional comment +#### Aliases that conflict with Olson compatibility links + ACT Australia/Darwin AET Australia/Sydney AGT America/Buenos_Aires @@ -26,14 +28,14 @@ CTT Asia/Shanghai EAT Africa/Addis_Ababa ECT Europe/Paris # EET Europe/Istanbul # EET is a standard UNIX zone -EST America/New_York # Linked to America/Indianapolis in Olson -HST Pacific/Honolulu # Olson LINK +#### EST America/New_York # Linked to America/Indianapolis in Olson +# HST Pacific/Honolulu # Olson LINK IET America/Indianapolis IST Asia/Calcutta JST Asia/Tokyo # MET Asia/Tehran # MET is a standard UNIX zone MIT Pacific/Apia -MST America/Denver # Linked to America/Phoenix in Olson +#### MST America/Denver # Linked to America/Phoenix in Olson NET Asia/Yerevan NST Pacific/Auckland PLT Asia/Karachi @@ -41,5 +43,5 @@ PNT America/Phoenix PRT America/Puerto_Rico PST America/Los_Angeles SST Pacific/Guadalcanal -UTC Etc/UTC # Olson LINK +# UTC Etc/UTC # Olson LINK VST Asia/Saigon diff --git a/icuSources/tools/tzcode/tz2icu.cpp b/icuSources/tools/tzcode/tz2icu.cpp new file mode 100644 index 00000000..91d634db --- /dev/null +++ b/icuSources/tools/tzcode/tz2icu.cpp @@ -0,0 +1,1560 @@ +/* +********************************************************************** +* Copyright (c) 2003-2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Author: Alan Liu +* Created: July 10 2003 +* Since: ICU 2.8 +********************************************************************** +*/ +#include "tzfile.h" // from Olson tzcode archive, copied to this dir + +#ifdef WIN32 + + #include + #undef min // windows.h/STL conflict + #undef max // windows.h/STL conflict + // "identifier was truncated to 'number' characters" warning + #pragma warning(disable: 4786) + +#else + + #include + #include + #include + #include + #include + +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "tz2icu.h" + +using namespace std; + +//-------------------------------------------------------------------- +// Time utilities +//-------------------------------------------------------------------- + +const long SECS_PER_YEAR = 31536000; // 365 days +const long SECS_PER_LEAP_YEAR = 31622400; // 366 days + +bool isLeap(int y) { + return (y%4 == 0) && ((y%100 != 0) || (y%400 == 0)); // Gregorian +} + +long secsPerYear(int y) { + return isLeap(y) ? SECS_PER_LEAP_YEAR : SECS_PER_YEAR; +} + +/** + * Given a calendar year, return the GMT epoch seconds for midnight + * GMT of January 1 of that year. yearToSeconds(1970) == 0. + */ +long yearToSeconds(int year) { + // inefficient but foolproof + long s = 0; + int y = 1970; + while (y < year) { + s += secsPerYear(y++); + } + while (y > year) { + s -= secsPerYear(--y); + } + return s; +} + +/** + * Given 1970 GMT epoch seconds, return the calendar year containing + * that time. secondsToYear(0) == 1970. + */ +int secondsToYear(long seconds) { + // inefficient but foolproof + int y = 1970; + long s = 0; + if (seconds >= 0) { + for (;;) { + s += secsPerYear(y++); + if (s > seconds) break; + } + --y; + } else { + for (;;) { + s -= secsPerYear(--y); + if (s <= seconds) break; + } + } + return y; +} + +//-------------------------------------------------------------------- +// Types +//-------------------------------------------------------------------- + +struct FinalZone; +struct FinalRule; +struct SimplifiedZoneType; + +// A transition from one ZoneType to another +// Minimal size = 5 bytes (4+1) +struct Transition { + long time; // seconds, 1970 epoch + int type; // index into 'ZoneInfo.types' 0..255 + Transition(long _time, int _type) { + time = _time; + type = _type; + } +}; + +// A behavior mode (what zic calls a 'type') of a time zone. +// Minimal size = 6 bytes (4+1+3bits) +// SEE: SimplifiedZoneType +struct ZoneType { + long rawoffset; // raw seconds offset from GMT + long dstoffset; // dst seconds offset from GMT + + // We don't really need any of the following, but they are + // retained for possible future use. See SimplifiedZoneType. + int abbr; // index into ZoneInfo.abbrs 0..n-1 + bool isdst; + bool isstd; + bool isgmt; + + ZoneType(const SimplifiedZoneType&); // used by optimizeTypeList + + ZoneType() : rawoffset(-1), dstoffset(-1), abbr(-1) {} + + // A restricted equality, of just the raw and dst offset + bool matches(const ZoneType& other) { + return rawoffset == other.rawoffset && + dstoffset == other.dstoffset; + } +}; + +// A collection of transitions from one ZoneType to another, together +// with a list of the ZoneTypes. A ZoneInfo object may have a long +// list of transitions between a smaller list of ZoneTypes. +// +// This object represents the contents of a single zic-created +// zoneinfo file. +struct ZoneInfo { + vector transitions; + vector types; + vector abbrs; + + string finalRuleID; + int finalOffset; + int finalYear; // -1 if none + + // If this is an alias, then all other fields are meaningless, and + // this field will point to the "real" zone 0..n-1. + int aliasTo; // -1 if this is a "real" zone + + // If there are aliases TO this zone, then the following set will + // contain their index numbers (each index >= 0). + set aliases; + + ZoneInfo() : finalYear(-1), aliasTo(-1) {} + + void mergeFinalData(const FinalZone& fz); + + void optimizeTypeList(); + + // Set this zone to be an alias TO another zone. + void setAliasTo(int index); + + // Clear the list of aliases OF this zone. + void clearAliases(); + + // Add an alias to the list of aliases OF this zone. + void addAlias(int index); + + // Is this an alias to another zone? + bool isAlias() const { + return aliasTo >= 0; + } + + // Retrieve alias list + const set& getAliases() const { + return aliases; + } + + void print(ostream& os, const string& id) const; +}; + +void ZoneInfo::clearAliases() { + assert(aliasTo < 0); + aliases.clear(); +} + +void ZoneInfo::addAlias(int index) { + assert(aliasTo < 0 && index >= 0 && aliases.find(index) == aliases.end()); + aliases.insert(index); +} + +void ZoneInfo::setAliasTo(int index) { + assert(index >= 0); + assert(aliases.size() == 0); + aliasTo = index; +} + +typedef map ZoneMap; + +typedef ZoneMap::const_iterator ZoneMapIter; + +//-------------------------------------------------------------------- +// ZONEINFO +//-------------------------------------------------------------------- + +// Global map holding all our ZoneInfo objects, indexed by id. +ZoneMap ZONEINFO; + +//-------------------------------------------------------------------- +// zoneinfo file parsing +//-------------------------------------------------------------------- + +// Read zic-coded 32-bit integer from file +long readcoded(ifstream& file, long minv=numeric_limits::min(), + long maxv=numeric_limits::max()) { + unsigned char buf[4]; // must be UNSIGNED + long val=0; + file.read((char*)buf, 4); + for(int i=0,shift=24;i<4;++i,shift-=8) { + val |= buf[i] << shift; + } + if (val < minv || val > maxv) { + ostringstream os; + os << "coded value out-of-range: " << val << ", expected [" + << minv << ", " << maxv << "]"; + throw out_of_range(os.str()); + } + return val; +} + +// Read a boolean value +bool readbool(ifstream& file) { + char c; + file.read(&c, 1); + if (c!=0 && c!=1) { + ostringstream os; + os << "boolean value out-of-range: " << (int)c; + throw out_of_range(os.str()); + } + return (c!=0); +} + +/** + * Read the zoneinfo file structure (see tzfile.h) into a ZoneInfo + * @param file an already-open file stream + */ +void readzoneinfo(ifstream& file, ZoneInfo& info) { + int i; + + // Check for TZ_ICU_MAGIC signature at file start. If we get a + // signature mismatch, it means we're trying to read a file which + // isn't a ICU-modified-zic-created zoneinfo file. Typically this + // means the user is passing in a "normal" zoneinfo directory, or + // a zoneinfo directory that is polluted with other files, or that + // the user passed in the wrong directory. + char buf[32]; + file.read(buf, 4); + if (strncmp(buf, TZ_ICU_MAGIC, 4) != 0) { + throw invalid_argument("TZ_ICU_MAGIC signature missing"); + } + + // Read reserved bytes. The first of these will be a version byte. + file.read(buf, 16); + if (*(ICUZoneinfoVersion*)&buf != TZ_ICU_VERSION) { + throw invalid_argument("File version mismatch"); + } + + // Read array sizes + long isgmtcnt = readcoded(file, 0); + long isdstcnt = readcoded(file, 0); + long leapcnt = readcoded(file, 0); + long timecnt = readcoded(file, 0); + long typecnt = readcoded(file, 0); + long charcnt = readcoded(file, 0); + + // Confirm sizes that we assume to be equal. These assumptions + // are drawn from a reading of the zic source (2003a), so they + // should hold unless the zic source changes. + if (isgmtcnt != typecnt || isdstcnt != typecnt) { + throw invalid_argument("count mismatch between tzh_ttisgmtcnt, tzh_ttisdstcnt, tth_typecnt"); + } + + // Used temporarily to store transition times and types. We need + // to do this because the times and types are stored in two + // separate arrays. + vector transitionTimes(timecnt, -1); // temporary + vector transitionTypes(timecnt, -1); // temporary + + // Read transition times + for (i=0; i= typecnt) { + ostringstream os; + os << "illegal type: " << t << ", expected [0, " << (typecnt-1) << "]"; + throw out_of_range(os.str()); + } + transitionTypes[i] = t; + } + + // Build transitions vector out of corresponding times and types. + for (i=0; i abbroffset; + char *limit=str+charcnt; + for (char* p=str; p 0,1,2,3. + + // Keep track of which abbreviations get used. + vector abbrseen(abbroffset.size(), false); + + for (vector::iterator it=info.types.begin(); + it!=info.types.end(); + ++it) { + vector::const_iterator x= + find(abbroffset.begin(), abbroffset.end(), it->abbr); + if (x==abbroffset.end()) { + // TODO: Modify code to add a new string to the end of + // the abbr list when a middle offset is given, e.g., + // "abc*def*" where * == '\0', take offset of 1 and + // make the array "abc", "def", "bc", and translate 1 + // => 2. NOT CRITICAL since we don't even use the + // abbr at this time. +#if 0 + // TODO: Re-enable this warning if we start using + // the Olson abbr data, or if the above TODO is completed. + ostringstream os; + os << "Warning: unusual abbr offset " << it->abbr + << ", expected one of"; + for (vector::const_iterator y=abbroffset.begin(); + y!=abbroffset.end(); ++y) { + os << ' ' << *y; + } + cerr << os.str() << "; using 0" << endl; +#endif + it->abbr = 0; + } else { + int index = x - abbroffset.begin(); + it->abbr = index; + abbrseen[index] = true; + } + } + + for (int ii=0;ii<(int) abbrseen.size();++ii) { + if (!abbrseen[ii]) { + cerr << "Warning: unused abbreviation: " << ii << endl; + } + } + } + + // Read leap second info, if any. + // *** We discard leap second data. *** + for (i=0; i subdirs; + vector subfiles; + + if ((dp = opendir(dir.c_str())) == NULL) { + cerr << "Error: Invalid directory: " << dir << endl; + exit(1); + } + if (!getcwd(pwd, sizeof(pwd))) { + cerr << "Error: Directory name too long" << endl; + exit(1); + } + chdir(dir.c_str()); + while ((dir_entry = readdir(dp)) != NULL) { + string name = dir_entry->d_name; + string path = dir + "/" + name; + lstat(dir_entry->d_name,&stat_info); + if (S_ISDIR(stat_info.st_mode)) { + if (name != "." && name != "..") { + subdirs.push_back(path); + subdirs.push_back(prefix + name + "/"); + // scandir(path, prefix + name + "/"); + } + } else { + try { + string id = prefix + name; + subfiles.push_back(path); + subfiles.push_back(id); + // handleFile(path, id); + } catch (const exception& e) { + cerr << "Error: While processing \"" << path << "\", " + << e.what() << endl; + exit(1); + } + } + } + closedir(dp); + chdir(pwd); + + for(int i=0;i<(int)subfiles.size();i+=2) { + try { + handleFile(subfiles[i], subfiles[i+1]); + } catch (const exception& e) { + cerr << "Error: While processing \"" << subfiles[i] << "\", " + << e.what() << endl; + exit(1); + } + } + for(int i=0;i<(int)subdirs.size();i+=2) { + scandir(subdirs[i], subdirs[i+1]); + } +} + +#endif + +//-------------------------------------------------------------------- +// Final zone and rule info +//-------------------------------------------------------------------- + +/** + * Read and discard the current line. + */ +void consumeLine(istream& in) { + int c; + do { + c = in.get(); + } while (c != EOF && c != '\n'); +} + +enum { + DOM = 0, + DOWGEQ = 1, + DOWLEQ = 2 +}; + +const char* TIME_MODE[] = {"w", "s", "u"}; + +const int MONTH_LEN[] = {31,28,31,30,31,30,31,31,30,31,30,31}; + +const int HOUR = 3600; + +struct FinalZone { + int offset; // raw offset + int year; // takes effect for y >= year + string ruleid; + set aliases; + FinalZone(int _offset, int _year, const string& _ruleid) : + offset(_offset), year(_year), ruleid(_ruleid) { + if (offset <= -16*HOUR || offset >= 16*HOUR || + year < 1900 || year >= 2050) { + throw invalid_argument("Invalid input arguments"); + } + } + FinalZone() : offset(-1), year(-1) {} + void addLink(const string& alias) { + if (aliases.find(alias) != aliases.end()) { + throw invalid_argument("Duplicate alias"); + } + aliases.insert(alias); + } +}; + +struct FinalRulePart { + int mode; + int month; + int dom; + int dow; + int time; + int offset; // dst offset, usually either 0 or 1:00 + + // Isstd and isgmt only have 3 valid states, corresponding to local + // wall time, local standard time, and GMT standard time. + // Here is how the isstd & isgmt flags are set by zic: + //| case 's': /* Standard */ + //| rp->r_todisstd = TRUE; + //| rp->r_todisgmt = FALSE; + //| case 'w': /* Wall */ + //| rp->r_todisstd = FALSE; + //| rp->r_todisgmt = FALSE; + //| case 'g': /* Greenwich */ + //| case 'u': /* Universal */ + //| case 'z': /* Zulu */ + //| rp->r_todisstd = TRUE; + //| rp->r_todisgmt = TRUE; + bool isstd; + bool isgmt; + + bool isset; // used during building; later ignored + + FinalRulePart() : isset(false) {} + void set(const string& _mode, + int _month, + int _dom, + int _dow, + int _time, + bool _isstd, + bool _isgmt, + int _offset) { + if (isset) { + throw invalid_argument("FinalRulePart set twice"); + } + isset = true; + if (_mode == "DOWLEQ") { + mode = DOWLEQ; + } else if (_mode == "DOWGEQ") { + mode = DOWGEQ; + } else if (_mode == "DOM") { + mode = DOM; + } else { + throw invalid_argument("Unrecognized FinalRulePart mode"); + } + month = _month; + dom = _dom; + dow = _dow; + time = _time; + isstd = _isstd; + isgmt = _isgmt; + offset = _offset; + if (month < 0 || month >= 12 || dom < 1 || dom > MONTH_LEN[month] || + (mode != DOM && (dow < 0 || dow >= 7)) || + offset < 0 || offset > HOUR || + (isgmt && !isstd)) { + throw invalid_argument("Invalid input arguments"); + } + } + + /** + * Return the time mode as an ICU SimpleTimeZone int from 0..2; + * see simpletz.h. + */ + int timemode() const { + if (isgmt) { + assert(isstd); + return 2; // gmt standard + } + if (isstd) { + return 1; // local standard + } + return 0; // local wall + } + + // The SimpleTimeZone encoding method for rules is as follows: + // stz_dowim stz_dow + // DOM: dom 0 + // DOWGEQ: dom -(dow+1) + // DOWLEQ: -dom -(dow+1) + // E.g., to encode Mon>=7, use stz_dowim=7, stz_dow=-2 + // to encode Mon<=7, use stz_dowim=-7, stz_dow=-2 + // to encode 7, use stz_dowim=7, stz_dow=0 + // Note that for this program and for SimpleTimeZone, 0==Jan, + // but for this program 0==Sun while for SimpleTimeZone 1==Sun. + + /** + * Return a "dowim" param suitable for SimpleTimeZone. + */ + int stz_dowim() const { + return (mode == DOWLEQ) ? -dom : dom; + } + + /** + * Return a "dow" param suitable for SimpleTimeZone. + */ + int stz_dow() const { + return (mode == DOM) ? 0 : -(dow+1); + } +}; + +struct FinalRule { + FinalRulePart part[2]; + + bool isset() const { + return part[0].isset && part[1].isset; + } + + void print(ostream& os) const; +}; + +map finalZones; +map finalRules; + +map > links; +map reverseLinks; +map linkSource; // id => "Olson link" or "ICU alias" + +/** + * Predicate used to find FinalRule objects that do not have both + * sub-parts set (indicating an error in the input file). + */ +bool isNotSet(const pair& p) { + return !p.second.isset(); +} + +/** + * Predicate used to find FinalZone objects that do not map to a known + * rule (indicating an error in the input file). + */ +bool mapsToUnknownRule(const pair& p) { + return finalRules.find(p.second.ruleid) == finalRules.end(); +} + +/** + * This set is used to make sure each rule in finalRules is used at + * least once. First we populate it with all the rules from + * finalRules; then we remove all the rules referred to in + * finaleZones. + */ +set ruleIDset; + +void insertRuleID(const pair& p) { + ruleIDset.insert(p.first); +} + +void eraseRuleID(const pair& p) { + ruleIDset.erase(p.second.ruleid); +} + +/** + * Populate finalZones and finalRules from the given istream. + */ +void readFinalZonesAndRules(istream& in) { + + for (;;) { + string token; + in >> token; + if (in.eof() || !in) { + break; + } else if (token == "zone") { + // zone Africa/Cairo 7200 1995 Egypt # zone Africa/Cairo, offset 7200, year >= 1995, rule Egypt (0) + string id, ruleid; + int offset, year; + in >> id >> offset >> year >> ruleid; + consumeLine(in); + finalZones[id] = FinalZone(offset, year, ruleid); + } else if (token == "rule") { + // rule US DOWGEQ 3 1 0 7200 0 0 3600 # 52: US, file data/northamerica, line 119, mode DOWGEQ, April, dom 1, Sunday, time 7200, isstd 0, isgmt 0, offset 3600 + // rule US DOWLEQ 9 31 0 7200 0 0 0 # 53: US, file data/northamerica, line 114, mode DOWLEQ, October, dom 31, Sunday, time 7200, isstd 0, isgmt 0, offset 0 + string id, mode; + int month, dom, dow, time, offset; + bool isstd, isgmt; + in >> id >> mode >> month >> dom >> dow >> time >> isstd >> isgmt >> offset; + consumeLine(in); + FinalRule& fr = finalRules[id]; + int p = fr.part[0].isset ? 1 : 0; + fr.part[p].set(mode, month, dom, dow, time, isstd, isgmt, offset); + } else if (token == "link") { + string fromid, toid; // fromid == "real" zone, toid == alias + in >> fromid >> toid; + // DO NOT consumeLine(in); + if (finalZones.find(toid) != finalZones.end()) { + throw invalid_argument("Bad link: `to' id is a \"real\" zone"); + } + + links[fromid].insert(toid); + reverseLinks[toid] = fromid; + + linkSource[fromid] = "Olson link"; + linkSource[toid] = "Olson link"; + } else if (token.length() > 0 && token[0] == '#') { + consumeLine(in); + } else { + throw invalid_argument("Unrecognized keyword"); + } + } + + if (!in.eof() && !in) { + throw invalid_argument("Parse failure"); + } + + // Perform validity check: Each rule should have data for 2 parts. + if (count_if(finalRules.begin(), finalRules.end(), isNotSet) != 0) { + throw invalid_argument("One or more incomplete rule pairs"); + } + + // Perform validity check: Each zone should map to a known rule. + if (count_if(finalZones.begin(), finalZones.end(), mapsToUnknownRule) != 0) { + throw invalid_argument("One or more zones refers to an unknown rule"); + } + + // Perform validity check: Each rule should be referred to by a zone. + ruleIDset.clear(); + for_each(finalRules.begin(), finalRules.end(), insertRuleID); + for_each(finalZones.begin(), finalZones.end(), eraseRuleID); + if (ruleIDset.size() != 0) { + throw invalid_argument("Unused rules"); + } +} + +//-------------------------------------------------------------------- +// Resource bundle output +//-------------------------------------------------------------------- + +// SEE olsontz.h FOR RESOURCE BUNDLE DATA LAYOUT + +void ZoneInfo::print(ostream& os, const string& id) const { + // Implement compressed format #2: + + os << " /* " << id << " */ "; + + if (aliasTo >= 0) { + assert(aliases.size() == 0); + os << ":int { " << aliasTo << " } "; // No endl - save room for comment. + return; + } + + os << ":array {" << endl; + + vector::const_iterator trn; + vector::const_iterator typ; + + bool first=true; + os << " :intvector { "; + for (trn = transitions.begin(); trn != transitions.end(); ++trn) { + if (!first) os << ", "; + first = false; + os << trn->time; + } + os << " }" << endl; + + first=true; + os << " :intvector { "; + for (typ = types.begin(); typ != types.end(); ++typ) { + if (!first) os << ", "; + first = false; + os << typ->rawoffset << ", " << typ->dstoffset; + } + os << " }" << endl; + + os << " :bin { \"" << hex << setfill('0'); + for (trn = transitions.begin(); trn != transitions.end(); ++trn) { + os << setw(2) << trn->type; + } + os << dec << "\" }" << endl; + + // Final zone info, if any + if (finalYear != -1) { + os << " \"" << finalRuleID << "\"" << endl; + os << " :intvector { " << finalOffset << ", " + << finalYear << " }" << endl; + } + + // Alias list, if any + if (aliases.size() != 0) { + first = true; + os << " :intvector { "; + for (set::const_iterator i=aliases.begin(); i!=aliases.end(); ++i) { + if (!first) os << ", "; + first = false; + os << *i; + } + os << " }" << endl; + } + + os << " } "; // no trailing 'endl', so comments can be placed. +} + +inline ostream& +operator<<(ostream& os, const ZoneMap& zoneinfo) { + int c = 0; + for (ZoneMapIter it = zoneinfo.begin(); + it != zoneinfo.end(); + ++it) { + if(c) os << ","; + it->second.print(os, it->first); + os << "//Z#" << c++ << endl; + } + return os; +} + +// print the string list +ostream& printStringList( ostream& os, const ZoneMap& zoneinfo) { + int n = 0; // count + int col = 0; // column + os << " Names {" << endl + << " "; + for (ZoneMapIter it = zoneinfo.begin(); + it != zoneinfo.end(); + ++it) { + if(n) { + os << ","; + col ++; + } + const string& id = it->first; + os << "\"" << id << "\""; + col += id.length() + 2; + if(col >= 50) { + os << " // " << n << endl + << " "; + col = 0; + } + n++; + } + os << " // " << (n-1) << endl + << " }" << endl; + + return os; +} + +//-------------------------------------------------------------------- +// main +//-------------------------------------------------------------------- + +// Unary predicate for finding transitions after a given time +bool isAfter(const Transition t, long thresh) { + return t.time >= thresh; +} + +/** + * A zone type that contains only the raw and dst offset. Used by the + * optimizeTypeList() method. + */ +struct SimplifiedZoneType { + long rawoffset; + long dstoffset; + SimplifiedZoneType() : rawoffset(-1), dstoffset(-1) {} + SimplifiedZoneType(const ZoneType& t) : rawoffset(t.rawoffset), + dstoffset(t.dstoffset) {} + bool operator<(const SimplifiedZoneType& t) const { + return rawoffset < t.rawoffset || + (rawoffset == t.rawoffset && + dstoffset < t.dstoffset); + } +}; + +/** + * Construct a ZoneType from a SimplifiedZoneType. Note that this + * discards information; the new ZoneType will have meaningless + * (empty) abbr, isdst, isstd, and isgmt flags; this is appropriate, + * since ignoring these is how we do optimization (we have no use for + * these in historical transitions). + */ +ZoneType::ZoneType(const SimplifiedZoneType& t) : + rawoffset(t.rawoffset), dstoffset(t.dstoffset), + abbr(-1), isdst(false), isstd(false), isgmt(false) {} + +/** + * Optimize the type list to remove excess entries. The type list may + * contain entries that are distinct only in terms of their dst, std, + * or gmt flags. Since we don't care about those flags, we can reduce + * the type list to a set of unique raw/dst offset pairs, and remap + * the type indices in the transition list, which stores, for each + * transition, a transition time and a type index. + */ +void ZoneInfo::optimizeTypeList() { + // Assemble set of unique types; only those in the `transitions' + // list, since there may be unused types in the `types' list + // corresponding to transitions that have been trimmed (during + // merging of final data). + + if (aliasTo >= 0) return; // Nothing to do for aliases + + // If there are zero transitions and one type, then leave that as-is. + if (transitions.size() == 0) { + if (types.size() != 1) { + cerr << "Error: transition count = 0, type count = " << types.size() << endl; + } + return; + } + + set simpleset; + for (vector::const_iterator i=transitions.begin(); + i!=transitions.end(); ++i) { + assert(i->type < (int)types.size()); + simpleset.insert(types[i->type]); + } + + // Map types to integer indices + map simplemap; + int n=0; + for (set::const_iterator i=simpleset.begin(); + i!=simpleset.end(); ++i) { + simplemap[*i] = n++; + } + + // Remap transitions + for (vector::iterator i=transitions.begin(); + i!=transitions.end(); ++i) { + assert(i->type < (int)types.size()); + ZoneType oldtype = types[i->type]; + SimplifiedZoneType newtype(oldtype); + assert(simplemap.find(newtype) != simplemap.end()); + i->type = simplemap[newtype]; + } + + // Replace type list + types.clear(); + copy(simpleset.begin(), simpleset.end(), back_inserter(types)); +} + +/** + * Merge final zone data into this zone. + */ +void ZoneInfo::mergeFinalData(const FinalZone& fz) { + int year = fz.year; + long seconds = yearToSeconds(year); + vector::iterator it = + find_if(transitions.begin(), transitions.end(), + bind2nd(ptr_fun(isAfter), seconds)); + transitions.erase(it, transitions.end()); + + if (finalYear != -1) { + throw invalid_argument("Final zone already merged in"); + } + finalYear = fz.year; + finalOffset = fz.offset; + finalRuleID = fz.ruleid; +} + +/** + * Merge the data from the given final zone into the core zone data by + * calling the ZoneInfo member function mergeFinalData. + */ +void mergeOne(const string& zoneid, const FinalZone& fz) { + if (ZONEINFO.find(zoneid) == ZONEINFO.end()) { + throw invalid_argument("Unrecognized final zone ID"); + } + ZONEINFO[zoneid].mergeFinalData(fz); +} + +/** + * Visitor function that merges the final zone data into the main zone + * data structures. It calls mergeOne for each final zone and its + * list of aliases. + */ +void mergeFinalZone(const pair& p) { + const string& id = p.first; + const FinalZone& fz = p.second; + + mergeOne(id, fz); +} + +/** + * Print this rule in resource bundle format to os. ID and enclosing + * braces handled elsewhere. + */ +void FinalRule::print(ostream& os) const { + // First print the rule part that enters DST; then the rule part + // that exits it. + int whichpart = (part[0].offset != 0) ? 0 : 1; + assert(part[whichpart].offset != 0); + assert(part[1-whichpart].offset == 0); + + os << " "; + for (int i=0; i<2; ++i) { + const FinalRulePart& p = part[whichpart]; + whichpart = 1-whichpart; + os << p.month << ", " << p.stz_dowim() << ", " << p.stz_dow() << ", " + << p.time << ", " << p.timemode() << ", "; + } + os << part[whichpart].offset << endl; +} + +int main(int argc, char *argv[]) { + string rootpath, zonetab, version; + + if (argc != 4) { + cout << "Usage: tz2icu " << endl + << " path to zoneinfo file tree generated by" << endl + << " ICU-patched version of zic" << endl + << " country map, from tzdata archive," << endl + << " typically named \"zone.tab\"" << endl + << " version string, such as \"2003e\"" << endl; + exit(1); + } else { + rootpath = argv[1]; + zonetab = argv[2]; + version = argv[3]; + } + + cout << "Olson data version: " << version << endl; + + try { + ifstream finals(ICU_ZONE_FILE); + if (finals) { + readFinalZonesAndRules(finals); + + cout << "Finished reading " << finalZones.size() + << " final zones and " << finalRules.size() + << " final rules from " ICU_ZONE_FILE << endl; + } else { + cerr << "Error: Unable to open " ICU_ZONE_FILE << endl; + return 1; + } + } catch (const exception& error) { + cerr << "Error: While reading " ICU_ZONE_FILE ": " << error.what() << endl; + return 1; + } + + // Read the legacy alias list and process it. Treat the legacy mappings + // like links, but also record them in the "legacy" hash. + try { + ifstream aliases(ICU_TZ_ALIAS); + if (!aliases) { + cerr << "Error: Unable to open " ICU_TZ_ALIAS << endl; + return 1; + } + int n = 0; + string line; + while (getline(aliases, line)) { + string::size_type lb = line.find('#'); + if (lb != string::npos) { + line.resize(lb); // trim comments + } + vector a; + istringstream is(line); + copy(istream_iterator(is),istream_iterator(), + back_inserter(a)); + if (a.size() == 0) continue; // blank line + if (a.size() != 2) { + cerr << "Error: Can't parse \"" << line << "\" in " + ICU_TZ_ALIAS << endl; + exit(1); + } + ++n; + + string alias(a[0]), olson(a[1]); + if (links.find(alias) != links.end()) { + cerr << "Error: Alias \"" << alias + << "\" is an Olson zone in " + ICU_TZ_ALIAS << endl; + return 1; + } + if (reverseLinks.find(alias) != reverseLinks.end()) { + cerr << "Error: Alias \"" << alias + << "\" is an Olson link to \"" << reverseLinks[olson] + << "\" in " << ICU_TZ_ALIAS << endl; + return 1; + } + + // Record source for error reporting + if (linkSource.find(olson) == linkSource.end()) { + linkSource[olson] = "ICU alias"; + } + assert(linkSource.find(alias) == linkSource.end()); + linkSource[alias] = "ICU alias"; + + links[olson].insert(alias); + reverseLinks[alias] = olson; + } + cout << "Finished reading " << n + << " aliases from " ICU_TZ_ALIAS << endl; + } catch (const exception& error) { + cerr << "Error: While reading " ICU_TZ_ALIAS ": " << error.what() << endl; + return 1; + } + + try { + // Recursively scan all files below the given path, accumulating + // their data into ZONEINFO. All files must be TZif files. Any + // failure along the way will result in a call to exit(1). + scandir(rootpath); + } catch (const exception& error) { + cerr << "Error: While scanning " << rootpath << ": " << error.what() << endl; + return 1; + } + + cout << "Finished reading " << ZONEINFO.size() << " zoneinfo files [" + << (ZONEINFO.begin())->first << ".." + << (--ZONEINFO.end())->first << "]" << endl; + + try { + for_each(finalZones.begin(), finalZones.end(), mergeFinalZone); + } catch (const exception& error) { + cerr << "Error: While merging final zone data: " << error.what() << endl; + return 1; + } + + // Process links (including ICU aliases). For each link set we have + // a canonical ID (e.g., America/Los_Angeles) and a set of one or more + // aliases (e.g., PST, PST8PDT, ...). + + // 1. Add all aliases as zone objects in ZONEINFO + for (map >::const_iterator i = links.begin(); + i!=links.end(); ++i) { + const string& olson = i->first; + const set& aliases = i->second; + if (ZONEINFO.find(olson) == ZONEINFO.end()) { + cerr << "Error: Invalid " << linkSource[olson] << " to non-existent \"" + << olson << "\"" << endl; + return 1; + } + for (set::const_iterator j=aliases.begin(); + j!=aliases.end(); ++j) { + ZONEINFO[*j] = ZoneInfo(); + } + } + + // 2. Create a mapping from zones to index numbers 0..n-1. + map zoneIDs; + vector zoneIDlist; + int z=0; + for (ZoneMap::iterator i=ZONEINFO.begin(); i!=ZONEINFO.end(); ++i) { + zoneIDs[i->first] = z++; + zoneIDlist.push_back(i->first); + } + assert(z == (int) ZONEINFO.size()); + + // 3. Merge aliases. Sometimes aliases link to other aliases; we + // resolve these into simplest possible sets. + map > links2; + map reverse2; + for (map >::const_iterator i = links.begin(); + i!=links.end(); ++i) { + string olson = i->first; + while (reverseLinks.find(olson) != reverseLinks.end()) { + olson = reverseLinks[olson]; + } + for (set::const_iterator j=i->second.begin(); j!=i->second.end(); ++j) { + links2[olson].insert(*j); + reverse2[*j] = olson; + } + } + links = links2; + reverseLinks = reverse2; + + if (false) { // Debugging: Emit link map + for (map >::const_iterator i = links.begin(); + i!=links.end(); ++i) { + cout << i->first << ": "; + for (set::const_iterator j=i->second.begin(); j!=i->second.end(); ++j) { + cout << *j << ", "; + } + cout << endl; + } + } + + // 4. Update aliases + for (map >::const_iterator i = links.begin(); + i!=links.end(); ++i) { + const string& olson = i->first; + const set& aliases = i->second; + ZONEINFO[olson].clearAliases(); + ZONEINFO[olson].addAlias(zoneIDs[olson]); + for (set::const_iterator j=aliases.begin(); + j!=aliases.end(); ++j) { + assert(zoneIDs.find(olson) != zoneIDs.end()); + assert(zoneIDs.find(*j) != zoneIDs.end()); + assert(ZONEINFO.find(*j) != ZONEINFO.end()); + ZONEINFO[*j].setAliasTo(zoneIDs[olson]); + ZONEINFO[olson].addAlias(zoneIDs[*j]); + } + } + + // Once merging of final data is complete, we can optimize the type list + for (ZoneMap::iterator i=ZONEINFO.begin(); i!=ZONEINFO.end(); ++i) { + i->second.optimizeTypeList(); + } + + // Create the country map + map > countryMap; // country -> set of zones + map reverseCountryMap; // zone -> country + try { + ifstream f(zonetab.c_str()); + if (!f) { + cerr << "Error: Unable to open " << zonetab << endl; + return 1; + } + int n = 0; + string line; + while (getline(f, line)) { + string::size_type lb = line.find('#'); + if (lb != string::npos) { + line.resize(lb); // trim comments + } + string country, coord, zone; + istringstream is(line); + is >> country >> coord >> zone; + if (country.size() == 0) continue; + if (country.size() != 2 || zone.size() < 1) { + cerr << "Error: Can't parse " << line << " in " << zonetab << endl; + return 1; + } + if (ZONEINFO.find(zone) == ZONEINFO.end()) { + cerr << "Error: Country maps to invalid zone " << zone + << " in " << zonetab << endl; + return 1; + } + countryMap[country].insert(zone); + reverseCountryMap[zone] = country; + //cerr << (n+1) << ": " << country << " <=> " << zone << endl; + ++n; + } + cout << "Finished reading " << n + << " country entries from " << zonetab << endl; + } catch (const exception& error) { + cerr << "Error: While reading " << zonetab << ": " << error.what() << endl; + return 1; + } + + // Merge ICU aliases into country map. Don't merge any alias + // that already has a country map, since that doesn't make sense. + // E.g. "Link Europe/Oslo Arctic/Longyearbyen" doesn't mean we + // should cross-map the countries between these two zones. + for (map >::const_iterator i = links.begin(); + i!=links.end(); ++i) { + const string& olson(i->first); + if (reverseCountryMap.find(olson) == reverseCountryMap.end()) { + continue; + } + string c = reverseCountryMap[olson]; + const set& aliases(i->second); + for (set::const_iterator j=aliases.begin(); + j != aliases.end(); ++j) { + if (reverseCountryMap.find(*j) == reverseCountryMap.end()) { + countryMap[c].insert(*j); + reverseCountryMap[*j] = c; + //cerr << "Aliased country: " << c << " <=> " << *j << endl; + } + } + } + + // Create a pseudo-country containing all zones belonging to no country + set nocountry; + for (ZoneMap::iterator i=ZONEINFO.begin(); i!=ZONEINFO.end(); ++i) { + if (reverseCountryMap.find(i->first) == reverseCountryMap.end()) { + nocountry.insert(i->first); + } + } + countryMap[""] = nocountry; + + // Get local time & year for below + time_t sec; + time(&sec); + struct tm* now = localtime(&sec); + int thisYear = now->tm_year + 1900; + + // Write out a resource-bundle source file containing data for + // all zones. + ofstream file(ICU_TZ_RESOURCE ".txt"); + if (file) { + file << "//---------------------------------------------------------" << endl + << "// Copyright (C) 2003"; + if (thisYear > 2003) { + file << "-" << thisYear; + } + file << ", International Business Machines" << endl + << "// Corporation and others. All Rights Reserved." << endl + << "//---------------------------------------------------------" << endl + << "// Build tool: tz2icu" << endl + << "// Build date: " << asctime(now) /* << endl -- asctime emits CR */ + << "// Olson source: ftp://elsie.nci.nih.gov/pub/" << endl + << "// Olson version: " << version << endl + << "//---------------------------------------------------------" << endl + << "// >> !!! >> THIS IS A MACHINE-GENERATED FILE << !!! <<" << endl + << "// >> !!! >>> DO NOT EDIT <<< !!! <<" << endl + << "//---------------------------------------------------------" << endl + << endl + << ICU_TZ_RESOURCE " {" << endl + << " Zones:array { " << endl + << ZONEINFO // Zones (the actual data) + << " }" << endl; + + // Names correspond to the Zones list, used for binary searching. + printStringList ( file, ZONEINFO ); // print the Names list + + // Final Rules are used if requested by the zone + file << " Rules { " << endl; + // Emit final rules + int frc = 0; + for(map::iterator i=finalRules.begin(); + i!=finalRules.end(); ++i) { + const string& id = i->first; + const FinalRule& r = i->second; + file << " " << id << ":intvector {" << endl; + r.print(file); + file << " } //_#" << frc++ << endl; + } + file << " }" << endl; + + // Emit country (region) map. Emitting the string zone IDs results + // in a 188 kb binary resource; emitting the zone index numbers + // trims this to 171 kb. More work for the runtime code, but + // a smaller data footprint. + file << " Regions { " << endl; + int rc = 0; + for (map >::const_iterator i=countryMap.begin(); + i != countryMap.end(); ++i) { + string country = i->first; + const set& zones(i->second); + file << " "; + if(country[0]==0) { + file << "Default"; + } + file << country << ":intvector { "; + bool first = true; + for (set::const_iterator j=zones.begin(); + j != zones.end(); ++j) { + if (!first) file << ", "; + first = false; + if (zoneIDs.find(*j) == zoneIDs.end()) { + cerr << "Error: Nonexistent zone in country map: " << *j << endl; + return 1; + } + file << zoneIDs[*j]; // emit the zone's index number + } + file << " } //R#" << rc++ << endl; + } + file << " }" << endl; + + file << "}" << endl; + } + + file.close(); + + if (file) { // recheck error bit + cout << "Finished writing " ICU_TZ_RESOURCE ".txt" << endl; + } else { + cerr << "Error: Unable to open/write to " ICU_TZ_RESOURCE ".txt" << endl; + return 1; + } + +#define ICU4J_TZ_CLASS "ZoneMetaData" + + // Write out a Java source file containing only a few pieces of + // meta-data missing from the core JDK: the equivalency lists and + // the country map. + ofstream java(ICU4J_TZ_CLASS ".java"); + if (java) { + java << "//---------------------------------------------------------" << endl + << "// Copyright (C) 2003"; + if (thisYear > 2003) { + java << "-" << thisYear; + } + java << ", International Business Machines" << endl + << "// Corporation and others. All Rights Reserved." << endl + << "//---------------------------------------------------------" << endl + << "// Build tool: tz2icu" << endl + << "// Build date: " << asctime(now) /* << endl -- asctime emits CR */ + << "// Olson source: ftp://elsie.nci.nih.gov/pub/" << endl + << "// Olson version: " << version << endl + << "//---------------------------------------------------------" << endl + << "// >> !!! >> THIS IS A MACHINE-GENERATED FILE << !!! <<" << endl + << "// >> !!! >>> DO NOT EDIT <<< !!! <<" << endl + << "//---------------------------------------------------------" << endl + << endl + << "package com.ibm.icu.impl;" << endl + << endl + << "public final class " ICU4J_TZ_CLASS " {" << endl; + + // Emit equivalency lists + bool first1 = true; + java << " public static final String[][] EQUIV = {" << endl; + for (ZoneMap::const_iterator i=ZONEINFO.begin(); i!=ZONEINFO.end(); ++i) { + if (i->second.isAlias() || i->second.getAliases().size() == 0) { + continue; + } + if (!first1) java << "," << endl; + first1 = false; + // The ID of this zone (the canonical zone, to which the + // aliases point) will be sorted into the list, so it + // won't be at position 0. If we want to know which is + // the canonical zone, we should move it to position 0. + java << " { "; + bool first2 = true; + const set& s = i->second.getAliases(); + for (set::const_iterator j=s.begin(); j!=s.end(); ++j) { + if (!first2) java << ", "; + java << '"' << zoneIDlist[*j] << '"'; + first2 = false; + } + java << " }"; + } + java << endl + << " };" << endl; + + // Emit country map. + first1 = true; + java << " public static final String[][] COUNTRY = {" << endl; + for (map >::const_iterator i=countryMap.begin(); + i != countryMap.end(); ++i) { + if (!first1) java << "," << endl; + first1 = false; + string country = i->first; + const set& zones(i->second); + java << " { \"" << country << '"'; + for (set::const_iterator j=zones.begin(); + j != zones.end(); ++j) { + java << ", \"" << *j << '"'; + } + java << " }"; + } + java << endl + << " };" << endl; + + java << "}" << endl; + } + + java.close(); + + if (java) { // recheck error bit + cout << "Finished writing " ICU4J_TZ_CLASS ".java" << endl; + } else { + cerr << "Error: Unable to open/write to " ICU4J_TZ_CLASS ".java" << endl; + return 1; + } + + return 0; +} + +//eof diff --git a/icuSources/tools/tzcode/tz2icu.h b/icuSources/tools/tzcode/tz2icu.h new file mode 100644 index 00000000..d3cfa641 --- /dev/null +++ b/icuSources/tools/tzcode/tz2icu.h @@ -0,0 +1,43 @@ +/* +********************************************************************** +* Copyright (c) 2003-2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Author: Alan Liu +* Created: July 10 2003 +* Since: ICU 2.8 +********************************************************************** +*/ + +#ifndef _TZ2ICU_H_ +#define _TZ2ICU_H_ + +/* We have modified the zoneinfo binary format (we write raw offset + * and DST offset separately instead of their sum) so we notate the + * file with a distinct signature. This prevents someone from trying + * to use our output files as normal zoneinfo files, and also prevents + * someone from trying to use normal zoneinfo files for ICU. We also + * use the first byte of the reserved section as a version integer, to + * be incremented each time the data format changes. + */ + +#define TZ_ICU_MAGIC "TZic" /* cf. TZ_MAGIC = "TZif" */ + +typedef unsigned char ICUZoneinfoVersion; + +#define TZ_ICU_VERSION ((ICUZoneinfoVersion) 1) + +/* File into which we will write supplemental ICU data. This allows + * zic to communicate final zone data to tz2icu. */ +#define ICU_ZONE_FILE "icu_zone.txt" + +/* File containing legacy aliases. Read by tz2icu. */ +#define ICU_TZ_ALIAS "tz.alias" + +/* Output resource name. This determines both the file name and the + * resource name within the file. That is, the output will be to the + * file ICU_TZ_RESOURCE ".txt" and the resource within it will be + * ICU_TZ_RESOURCE. */ +#define ICU_TZ_RESOURCE "zoneinfo" + +#endif diff --git a/icudt26l.dat b/icudt26l.dat deleted file mode 100644 index dcedc4ed3095bc9c0bfd937fc20d698756b0d6ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8383736 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
    mI*9!GK0xLLF?*&$Bfa~dN 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

    6=3(=QdDJ{+9yd>z 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

    sh8cjFYq; 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 z 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�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

    << thousand >><< thousand >>[the rule whose base value is 1,000 is applicable to 25,340]
    nothingPerform the mathematical operation on the number, and format the result using the rule - * set containing the current rule, except:
      + * set containing the current rule, except: + *
        *
      • You can't have an empty substitution descriptor with a == substitution.
      • *
      • If you omit the substitution descriptor in a >> substitution in a fraction rule, * format the result one digit at a time using the rule set containing the current rule.
      • @@ -457,6 +471,28 @@ class Collator; *

        See the resource data and the demo program for annotated examples of real rule sets * using these features.

        * + *

        User subclasses are not supported. While clients may write + * subclasses, such code will not necessarily work and will not be + * guaranteed to work stably from release to release. + * + *

        Localizations

        + *

        Constructors are available that allow the specification of localizations for the + * public rule sets (and also allow more control over what public rule sets are available). + * Localization data is represented as a textual description. The description represents + * an array of arrays of string. The first element is an array of the public rule set names, + * each of these must be one of the public rule set names that appear in the rules. Only + * names in this array will be treated as public rule set names by the API. Each subsequent + * element is an array of localizations of these names. The first element of one of these + * subarrays is the locale name, and the remaining elements are localizations of the + * public rule set names, in the same order as they were listed in the first arrray.

        + *

        In the syntax, angle brackets '<', '>' are used to delimit the arrays, and comma ',' is used + * to separate elements of an array. Whitespace is ignored, unless quoted.

        + *

        For example:

        + * < < %foo, %bar, %baz >, 
        + *   < en, Foo, Bar, Baz >, 
        + *   < fr, 'le Foo', 'le Bar', 'le Baz' > 
        + *   < zh, \\u7532, \\u4e59, \\u4e19 > >
        + * 

        * @author Richard Gillam * @see NumberFormat * @see DecimalFormat @@ -469,6 +505,44 @@ public: // constructors //----------------------------------------------------------------------- + /** + * Creates a RuleBasedNumberFormat that behaves according to the description + * passed in. The formatter uses the default locale. + * @param rules A description of the formatter's desired behavior. + * See the class documentation for a complete explanation of the description + * syntax. + * @param perror The parse error if an error was encountered. + * @param status The status indicating whether the constructor succeeded. + * @draft ICU 3.2 + */ + RuleBasedNumberFormat(const UnicodeString& rules, UParseError& perror, UErrorCode& status); + + /** + * Creates a RuleBasedNumberFormat that behaves according to the description + * passed in. The formatter uses the default locale. + *

        + * The localizations data provides information about the public + * rule sets and their localized display names for different + * locales. The first element in the list is an array of the names + * of the public rule sets. The first element in this array is + * the initial default ruleset. The remaining elements in the + * list are arrays of localizations of the names of the public + * rule sets. Each of these is one longer than the initial array, + * with the first String being the ULocale ID, and the remaining + * Strings being the localizations of the rule set names, in the + * same order as the initial array. Arrays are NULL-terminated. + * @param rules A description of the formatter's desired behavior. + * See the class documentation for a complete explanation of the description + * syntax. + * @param localizations the localization information. + * names in the description. These will be copied by the constructor. + * @param perror The parse error if an error was encountered. + * @param status The status indicating whether the constructor succeeded. + * @draft ICU 3.2 + */ + RuleBasedNumberFormat(const UnicodeString& rules, const UnicodeString& localizations, + UParseError& perror, UErrorCode& status); + /** * Creates a RuleBasedNumberFormat that behaves according to the rules * passed in. The formatter uses the specified locale to determine the @@ -477,16 +551,45 @@ public: * @param rules The formatter rules. * See the class documentation for a complete explanation of the rule * syntax. - * @param locale A locale, that governs which characters are used for - * formatting values in numerals, and which characters are equivalent in + * @param locale A locale that governs which characters are used for + * formatting values in numerals and which characters are equivalent in * lenient parsing. * @param perror The parse error if an error was encountered. * @param status The status indicating whether the constructor succeeded. * @stable ICU 2.0 */ - RuleBasedNumberFormat(const UnicodeString& rules, const Locale& locale, + RuleBasedNumberFormat(const UnicodeString& rules, const Locale& locale, UParseError& perror, UErrorCode& status); + /** + * Creates a RuleBasedNumberFormat that behaves according to the description + * passed in. The formatter uses the default locale. + *

        + * The localizations data provides information about the public + * rule sets and their localized display names for different + * locales. The first element in the list is an array of the names + * of the public rule sets. The first element in this array is + * the initial default ruleset. The remaining elements in the + * list are arrays of localizations of the names of the public + * rule sets. Each of these is one longer than the initial array, + * with the first String being the ULocale ID, and the remaining + * Strings being the localizations of the rule set names, in the + * same order as the initial array. Arrays are NULL-terminated. + * @param rules A description of the formatter's desired behavior. + * See the class documentation for a complete explanation of the description + * syntax. + * @param localizations a list of localizations for the rule set + * names in the description. These will be copied by the constructor. + * @param locale A locale that governs which characters are used for + * formatting values in numerals and which characters are equivalent in + * lenient parsing. + * @param perror The parse error if an error was encountered. + * @param status The status indicating whether the constructor succeeded. + * @draft ICU 3.2 + */ + RuleBasedNumberFormat(const UnicodeString& rules, const UnicodeString& localizations, + const Locale& locale, UParseError& perror, UErrorCode& status); + /** * Creates a RuleBasedNumberFormat from a predefined ruleset. The selector * code choosed among three possible predefined formats: spellout, ordinal, @@ -554,6 +657,13 @@ public: */ virtual UnicodeString getRules() const; + /** + * Return the number of public rule set names. + * @return the number of public rule set names. + * @stable ICU 2.0 + */ + virtual int32_t getNumberOfRuleSetNames() const; + /** * Return the name of the index'th public ruleSet. If index is not valid, * the function returns null. @@ -564,11 +674,48 @@ public: virtual UnicodeString getRuleSetName(int32_t index) const; /** - * Return the number of public rule set names. - * @return the number of public rule set names. - * @stable ICU 2.0 + * Return the number of locales for which we have localized rule set display names. + * @return the number of locales for which we have localized rule set display names. + * @draft ICU 3.2 */ - virtual int32_t getNumberOfRuleSetNames() const; + virtual int32_t getNumberOfRuleSetDisplayNameLocales(void) const; + + /** + * Return the index'th display name locale. + * @param index the index of the locale + * @param status set to a failure code when this function fails + * @return the locale + * @see #getNumberOfRuleSetDisplayNameLocales + * @draft ICU 3.2 + */ + virtual Locale getRuleSetDisplayNameLocale(int32_t index, UErrorCode& status) const; + + /** + * Return the rule set display names for the provided locale. These are in the same order + * as those returned by getRuleSetName. The locale is matched against the locales for + * which there is display name data, using normal fallback rules. If no locale matches, + * the default display names are returned. (These are the internal rule set names minus + * the leading '%'.) + * @param index the index of the rule set + * @param locale the locale (returned by getRuleSetDisplayNameLocales) for which the localized + * display name is desired + * @return the display name for the given index, which might be bogus if there is an error + * @see #getRuleSetName + * @draft ICU 3.2 + */ + virtual UnicodeString getRuleSetDisplayName(int32_t index, + const Locale& locale = Locale::getDefault()); + + /** + * Return the rule set display name for the provided rule set and locale. + * The locale is matched against the locales for which there is display name data, using + * normal fallback rules. If no locale matches, the default display name is returned. + * @return the display name for the rule set + * @draft ICU 3.2 + * @see #getRuleSetDisplayNames + */ + virtual UnicodeString getRuleSetDisplayName(const UnicodeString& ruleSetName, + const Locale& locale = Locale::getDefault()); /** * Formats the specified 32-bit number using the default ruleset. @@ -717,7 +864,7 @@ public: Formattable& result, ParsePosition& parsePosition) const; - + /** * Redeclared Format method. * @param text The string to parse @@ -782,36 +929,57 @@ public: * to the initial default rule set. If the rule set is not a public rule set name, * U_ILLEGAL_ARGUMENT_ERROR is returned in status. * @param ruleSetName the name of the rule set, or null to reset the initial default. - * @param status Output param set to failure code when a problem occurs. - * @draft ICU 2.6 + * @param status set to failure code when a problem occurs. + * @stable ICU 2.6 */ virtual void setDefaultRuleSet(const UnicodeString& ruleSetName, UErrorCode& status); -private: - RuleBasedNumberFormat(); // default constructor not implemented - - void init(const UnicodeString& rules, UParseError& perror, UErrorCode& status); - void dispose(); - void stripWhitespace(UnicodeString& src); - void initDefaultRuleSet(); - void format(double number, NFRuleSet& ruleSet); - NFRuleSet* findRuleSet(const UnicodeString& name, UErrorCode& status) const; + /** + * Return the name of the current default rule set. If the current rule set is + * not public, returns a bogus (and empty) UnicodeString. + * @return the name of the current default rule set + * @draft ICU 3.0 + */ + virtual UnicodeString getDefaultRuleSetName() const; - /* friend access */ - friend class NFSubstitution; - friend class NFRule; - friend class FractionalPartSubstitution; +public: + /** + * ICU "poor man's RTTI", returns a UClassID for this class. + * + * @stable ICU 2.8 + */ + static UClassID U_EXPORT2 getStaticClassID(void); - inline NFRuleSet * getDefaultRuleSet() const; - Collator * getCollator() const; - DecimalFormatSymbols * getDecimalFormatSymbols() const; + /** + * ICU "poor man's RTTI", returns a UClassID for the actual class. + * + * @stable ICU 2.8 + */ + virtual UClassID getDynamicClassID(void) const; private: - static const char fgClassID; + RuleBasedNumberFormat(); // default constructor not implemented -public: - static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; } - virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); } + // this will ref the localizations if they are not NULL + // caller must deref to get adoption + RuleBasedNumberFormat(const UnicodeString& description, LocalizationInfo* localizations, + const Locale& locale, UParseError& perror, UErrorCode& status); + + void init(const UnicodeString& rules, LocalizationInfo* localizations, UParseError& perror, UErrorCode& status); + void dispose(); + void stripWhitespace(UnicodeString& src); + void initDefaultRuleSet(); + void format(double number, NFRuleSet& ruleSet); + NFRuleSet* findRuleSet(const UnicodeString& name, UErrorCode& status) const; + + /* friend access */ + friend class NFSubstitution; + friend class NFRule; + friend class FractionalPartSubstitution; + + inline NFRuleSet * getDefaultRuleSet() const; + Collator * getCollator() const; + DecimalFormatSymbols * getDecimalFormatSymbols() const; private: NFRuleSet **ruleSets; @@ -821,6 +989,7 @@ private: DecimalFormatSymbols* decimalFormatSymbols; UBool lenient; UnicodeString* lenientParseRules; + LocalizationInfo* localizations; }; // --------------- @@ -858,16 +1027,16 @@ RuleBasedNumberFormat::parse(const UnicodeString& text, Formattable& result, UEr #if !UCONFIG_NO_COLLATION -inline UBool -RuleBasedNumberFormat::isLenient(void) const { - return lenient; +inline UBool +RuleBasedNumberFormat::isLenient(void) const { + return lenient; } #endif -inline NFRuleSet* -RuleBasedNumberFormat::getDefaultRuleSet() const { - return defaultRuleSet; +inline NFRuleSet* +RuleBasedNumberFormat::getDefaultRuleSet() const { + return defaultRuleSet; } U_NAMESPACE_END diff --git a/icuSources/i18n/unicode/regex.h b/icuSources/i18n/unicode/regex.h index a2dd88cb..cfea208e 100644 --- a/icuSources/i18n/unicode/regex.h +++ b/icuSources/i18n/unicode/regex.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2002-2003, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * file name: regex.h @@ -16,6 +16,7 @@ #ifndef REGEX_H #define REGEX_H +//#define REGEX_DEBUG /** * \file @@ -27,13 +28,18 @@ * RegexPattern and RegexMatcher. * RegexPattern objects represent a pre-processed, or compiled * regular expression. They are created from a regular expression pattern string, - * and can be used to create objects for the pattern.

        + * and can be used to create RegexMatcher objects for the pattern.

        * *

        Class RegexMatcher bundles together a regular expression * pattern and a target string to which the search pattern will be applied. * RegexMatcher includes API for doing plain find or search * operations, for search and replace operations, and for obtaining detailed * information about bounds of a match.

        + * + *

        Note that by constructing RegexMatcher objects directly from regular + * expression pattern strings application code can be simplified and the explicit + * need for RegexPattern objects can usually be eliminated. + *

        */ #include "unicode/utypes.h" @@ -44,43 +50,36 @@ #include "unicode/unistr.h" #include "unicode/parseerr.h" +#include "unicode/uregex.h" + U_NAMESPACE_BEGIN // Forward Declarations... class RegexMatcher; +class RegexPattern; class UVector; class UVector32; class UnicodeSet; struct REStackFrame; struct Regex8BitSet; +class RuleBasedBreakIterator; +class RegexCImpl; -/** - * Constants for Regular Expression Match Modes. - * @draft ICU 2.4 - */ -enum { - /** Forces normalization of pattern and strings. @draft ICU 2.4 */ - UREGEX_CANON_EQ = 128, - /** Enable case insensitive matching. @draft ICU 2.4 */ - UREGEX_CASE_INSENSITIVE = 2, - /** Allow white space and comments within patterns @draft ICU 2.4 */ - UREGEX_COMMENTS = 4, - - /** If set, '.' matches line terminators, otherwise '.' matching stops at line end. - * @draft ICU 2.4 */ - UREGEX_DOTALL = 32, - - /** Control behavior of "$" and "^" - * If set, recognize line terminators within string, - * otherwise, match only at start and end of input string. - * @draft ICU 2.4 */ - UREGEX_MULTILINE = 8 -}; +/** + * RBBIPatternDump Debug function, displays the compiled form of a pattern. + * @internal + */ +#ifdef REGEX_DEBUG +U_INTERNAL void U_EXPORT2 + RegexPatternDump(const RegexPattern *pat); +#else + #define RegexPatternDump(pat) +#endif @@ -93,58 +92,59 @@ enum { * *

        Class RegexPattern is not intended to be subclassed.

        * - * @draft ICU 2.4 + * @stable ICU 2.4 */ class U_I18N_API RegexPattern: public UObject { public: /** - * default constructor. Create a RegexPattern object that refers to no actual - * pattern. Not normally needed; RegexPattern objects are usually - * created using the factory method compile(). - * - * @draft ICU 2.4 - */ + * default constructor. Create a RegexPattern object that refers to no actual + * pattern. Not normally needed; RegexPattern objects are usually + * created using the factory method compile(). + * + * @stable ICU 2.4 + */ RegexPattern(); /** - * Copy Constructor. Create a new RegexPattern object that is equivalent - * to the source object. - * @draft ICU 2.4 - */ + * Copy Constructor. Create a new RegexPattern object that is equivalent + * to the source object. + * @param source the pattern object to be copied. + * @stable ICU 2.4 + */ RegexPattern(const RegexPattern &source); /** - * Destructor. Note that a RegexPattern object must persist so long as any - * RegexMatcher objects that were created from the RegexPattern are active. - * @draft ICU 2.4 - */ + * Destructor. Note that a RegexPattern object must persist so long as any + * RegexMatcher objects that were created from the RegexPattern are active. + * @stable ICU 2.4 + */ virtual ~RegexPattern(); /** - * Comparison operator. Two RegexPattern objects are considered equal if they - * were constructed from identical source patterns using the same match flag - * settings. - * @param that a RegexPattern object to compare with "this". - * @return TRUE if the objects are equivalent. - * @draft ICU 2.4 - */ + * Comparison operator. Two RegexPattern objects are considered equal if they + * were constructed from identical source patterns using the same match flag + * settings. + * @param that a RegexPattern object to compare with "this". + * @return TRUE if the objects are equivalent. + * @stable ICU 2.4 + */ UBool operator==(const RegexPattern& that) const; /** - * Comparison operator. Two RegexPattern objects are considered equal if they - * were constructed from identical source patterns using the same match flag - * settings. - * @param that a RegexPattern object to compare with "this". - * @return TRUE if the objects are different. - * @draft ICU 2.4 - */ + * Comparison operator. Two RegexPattern objects are considered equal if they + * were constructed from identical source patterns using the same match flag + * settings. + * @param that a RegexPattern object to compare with "this". + * @return TRUE if the objects are different. + * @stable ICU 2.4 + */ inline UBool operator!=(const RegexPattern& that) const {return ! operator ==(that);}; /** * Assignment operator. After assignment, this RegexPattern will behave identically * to the source object. - * @draft ICU 2.4 + * @stable ICU 2.4 */ RegexPattern &operator =(const RegexPattern &source); @@ -153,136 +153,169 @@ public: * intended to be subclasses, clone() and the copy construction are * equivalent operations. * @return the copy of this RegexPattern - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual RegexPattern *clone() const; /** - * Compiles the regular expression in string form into a RegexPattern - * object. These compile methods, rather than the constructors, are the usual - * way that RegexPattern objects are created. + * Compiles the regular expression in string form into a RegexPattern + * object. These compile methods, rather than the constructors, are the usual + * way that RegexPattern objects are created. * - *

        Note that RegexPattern objects must not be deleted while RegexMatcher - * objects created from the pattern are active. RegexMatchers keep a pointer - * back to their pattern, so premature deletion of the pattern is a - * catastrophic error.

        + *

        Note that RegexPattern objects must not be deleted while RegexMatcher + * objects created from the pattern are active. RegexMatchers keep a pointer + * back to their pattern, so premature deletion of the pattern is a + * catastrophic error.

        * - *

        All pattern match mode flags are set to their default values.

        + *

        All pattern match mode flags are set to their default values.

        * - * @param regex The regular expression to be compiled. - * @param pe Receives the position (line and column nubers) of any error - * within the regular expression.) - * @param status A reference to a UErrorCode to receive any errors. - * @return A regexPattern object for the compiled pattern. + *

        Note that it is often more convenient to construct a RegexMatcher directly + * from a pattern string rather than separately compiling the pattern and + * then creating a RegexMatcher object from the pattern.

        * - * @draft ICU 2.4 + * @param regex The regular expression to be compiled. + * @param pe Receives the position (line and column nubers) of any error + * within the regular expression.) + * @param status A reference to a UErrorCode to receive any errors. + * @return A regexPattern object for the compiled pattern. + * + * @stable ICU 2.4 */ - static RegexPattern *compile( const UnicodeString ®ex, + static RegexPattern * U_EXPORT2 compile( const UnicodeString ®ex, UParseError &pe, UErrorCode &status); /** - * Compiles the regular expression in string form into a RegexPattern - * object using the specified match mode flags. These compile methods, - * rather than the constructors, are the usual way that RegexPattern objects - * are created. - * - *

        Note that RegexPattern objects must not be deleted while RegexMatcher - * objects created from the pattern are active. RegexMatchers keep a pointer - * back to their pattern, so premature deletion of the pattern is a - * catastrophic error.

        - * - * @param regex The regular expression to be compiled. - * @param flags The match mode flags to be used. - * @param pe Receives the position (line and column nubers) of any error - * within the regular expression.) - * @param status A reference to a UErrorCode to receive any errors. - * @return A regexPattern object for the compiled pattern. - * - * @draft ICU 2.4 - */ - static RegexPattern *compile( const UnicodeString ®ex, + * Compiles the regular expression in string form into a RegexPattern + * object using the specified match mode flags. These compile methods, + * rather than the constructors, are the usual way that RegexPattern objects + * are created. + * + *

        Note that RegexPattern objects must not be deleted while RegexMatcher + * objects created from the pattern are active. RegexMatchers keep a pointer + * back to their pattern, so premature deletion of the pattern is a + * catastrophic error.

        + * + *

        Note that it is often more convenient to construct a RegexMatcher directly + * from a pattern string instead of than separately compiling the pattern and + * then creating a RegexMatcher object from the pattern.

        + * + * @param regex The regular expression to be compiled. + * @param flags The match mode flags to be used. + * @param pe Receives the position (line and column nubers) of any error + * within the regular expression.) + * @param status A reference to a UErrorCode to receive any errors. + * @return A regexPattern object for the compiled pattern. + * + * @stable ICU 2.4 + */ + static RegexPattern * U_EXPORT2 compile( const UnicodeString ®ex, uint32_t flags, UParseError &pe, UErrorCode &status); /** - * Compiles the regular expression in string form into a RegexPattern - * object using the specified match mode flags. These compile methods, - * rather than the constructors, are the usual way that RegexPattern objects - * are created. - * - *

        Note that RegexPattern objects must not be deleted while RegexMatcher - * objects created from the pattern are active. RegexMatchers keep a pointer - * back to their pattern, so premature deletion of the pattern is a - * catastrophic error.

        - * - * @param regex The regular expression to be compiled. - * @param flags The match mode flags to be used. - * @param status A reference to a UErrorCode to receive any errors. - * @return A regexPattern object for the compiled pattern. - * - * @draft ICU 2.6 + * Compiles the regular expression in string form into a RegexPattern + * object using the specified match mode flags. These compile methods, + * rather than the constructors, are the usual way that RegexPattern objects + * are created. + * + *

        Note that RegexPattern objects must not be deleted while RegexMatcher + * objects created from the pattern are active. RegexMatchers keep a pointer + * back to their pattern, so premature deletion of the pattern is a + * catastrophic error.

        + * + *

        Note that it is often more convenient to construct a RegexMatcher directly + * from a pattern string instead of than separately compiling the pattern and + * then creating a RegexMatcher object from the pattern.

        + * + * @param regex The regular expression to be compiled. + * @param flags The match mode flags to be used. + * @param status A reference to a UErrorCode to receive any errors. + * @return A regexPattern object for the compiled pattern. + * + * @stable ICU 2.6 */ - static RegexPattern *compile( const UnicodeString ®ex, + static RegexPattern * U_EXPORT2 compile( const UnicodeString ®ex, uint32_t flags, UErrorCode &status); /** - * Get the match mode flags that were used when compiling this pattern. - * @return the match mode flags - * @draft ICU 2.4 + * Get the match mode flags that were used when compiling this pattern. + * @return the match mode flags + * @stable ICU 2.4 */ virtual uint32_t flags() const; /** - * Creates a RegexMatcher that will match the given input against this pattern. The - * RegexMatcher can then be used to perform match, find or replace operations - * on the input. Note that a RegexPattern object must not be deleted while - * RegexMatchers created from it still exist and might possibly be used again. - * - * @param input The input string to which the regular expression will be applied. - * @param status A reference to a UErrorCode to receive any errors. - * @return A RegexMatcher object for this pattern and input. - * - * @draft ICU 2.4 + * Creates a RegexMatcher that will match the given input against this pattern. The + * RegexMatcher can then be used to perform match, find or replace operations + * on the input. Note that a RegexPattern object must not be deleted while + * RegexMatchers created from it still exist and might possibly be used again. + *

        + * The matcher will retain a reference to the supplied input string, and all regexp + * pattern matching operations happen directly on this original string. It is + * critical that the string not be altered or deleted before use by the regular + * expression operations is complete. + * + * @param input The input string to which the regular expression will be applied. + * @param status A reference to a UErrorCode to receive any errors. + * @return A RegexMatcher object for this pattern and input. + * + * @stable ICU 2.4 */ virtual RegexMatcher *matcher(const UnicodeString &input, UErrorCode &status) const; +private: + /** + * Cause a compilation error if an application accidently attempts to + * create a matcher with a (UChar *) string as input rather than + * a UnicodeString. Avoids a dangling reference to a temporary string. + *

        + * To efficiently work with UChar *strings, wrap the data in a UnicodeString + * using one of the aliasing constructors, such as + * UnicodeString(UBool isTerminated, const UChar *text, int32_t textLength); + * + * @internal + */ + virtual RegexMatcher *matcher(const UChar *input, + UErrorCode &status) const; +public: + /** - * Creates a RegexMatcher that will match against this pattern. The - * RegexMatcher can be used to perform match, find or replace operations. - * Note that a RegexPattern object must not be deleted while - * RegexMatchers created from it still exist and might possibly be used again. + * Creates a RegexMatcher that will match against this pattern. The + * RegexMatcher can be used to perform match, find or replace operations. + * Note that a RegexPattern object must not be deleted while + * RegexMatchers created from it still exist and might possibly be used again. * - * @param status A reference to a UErrorCode to receive any errors. - * @return A RegexMatcher object for this pattern and input. + * @param status A reference to a UErrorCode to receive any errors. + * @return A RegexMatcher object for this pattern and input. * - * @draft ICU 2.6 + * @stable ICU 2.6 */ virtual RegexMatcher *matcher(UErrorCode &status) const; /** - * Test whether a string matches a regular expression. This convenience function - * both compiles the reguluar expression and applies it in a single operation. - * Note that if the same pattern needs to be applied repeatedly, this method will be - * less efficient than creating and reusing a RegexPattern object. - * - * @param regex The regular expression - * @param input The string data to be matched - * @param pe Receives the position of any syntax errors within the regular expression - * @param status A reference to a UErrorCode to receive any errors. - * @return True if the regular expression exactly matches the full input string. - * - * @draft ICU 2.4 + * Test whether a string matches a regular expression. This convenience function + * both compiles the reguluar expression and applies it in a single operation. + * Note that if the same pattern needs to be applied repeatedly, this method will be + * less efficient than creating and reusing a RegexMatcher object. + * + * @param regex The regular expression + * @param input The string data to be matched + * @param pe Receives the position of any syntax errors within the regular expression + * @param status A reference to a UErrorCode to receive any errors. + * @return True if the regular expression exactly matches the full input string. + * + * @stable ICU 2.4 */ - static UBool matches(const UnicodeString ®ex, + static UBool U_EXPORT2 matches(const UnicodeString ®ex, const UnicodeString &input, UParseError &pe, UErrorCode &status); @@ -290,7 +323,7 @@ public: /** * Returns the regular expression from which this pattern was compiled. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UnicodeString pattern() const; @@ -303,7 +336,7 @@ public: *

        * For the best performance on split() operations, * RegexMatcher::split is perferable to this function - * + * * @param input The string to be split into fields. The field delimiters * match the pattern (in the "this" object) * @param dest An array of UnicodeStrings to receive the results of the split. @@ -318,7 +351,7 @@ public: * field delimiters, is placed in the last destination string. * @param status A reference to a UErrorCode to receive any errors. * @return The number of fields into which the input string was split. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual int32_t split(const UnicodeString &input, UnicodeString dest[], @@ -326,26 +359,19 @@ public: UErrorCode &status) const; - - /** - * dump Debug function, displays the compiled form of a pattern. - * @internal - */ - void dump() const; - /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.4 + * @stable ICU 2.4 */ - virtual inline UClassID getDynamicClassID() const; + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.4 + * @stable ICU 2.4 */ - static inline UClassID getStaticClassID(); + static UClassID U_EXPORT2 getStaticClassID(); private: // @@ -389,39 +415,30 @@ private: // sets for predefined regex classes. int32_t fStartType; // Info on how a match must start. - int32_t fInitialStringIdx; // + int32_t fInitialStringIdx; // int32_t fInitialStringLen; - UnicodeSet *fInitialChars; + UnicodeSet *fInitialChars; UChar32 fInitialChar; Regex8BitSet *fInitialChars8; - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; - friend class RegexCompile; friend class RegexMatcher; + friend class RegexCImpl; // // Implementation Methods // void init(); // Common initialization, for use by constructors. void zap(); // Common cleanup +#ifdef REGEX_DEBUG void dumpOp(int32_t index) const; - + friend void U_EXPORT2 RegexPatternDump(const RegexPattern *); +#endif }; - - - - - - /** * class RegexMatcher bundles together a reular expression pattern and * input text to which the expression can be applied. It includes methods @@ -429,7 +446,7 @@ private: * *

        Class RegexMatcher is not intended to be subclassed.

        * - * @draft ICU 2.4 + * @stable ICU 2.4 */ class U_I18N_API RegexMatcher: public UObject { public: @@ -446,7 +463,7 @@ public: * @param flags Regular expression options, such as case insensitive matching. * @see UREGEX_CASE_INSENSITIVE * @param status Any errors are reported by setting this UErrorCode variable. - * @draft ICU 2.6 + * @stable ICU 2.6 */ RegexMatcher(const UnicodeString ®exp, uint32_t flags, UErrorCode &status); @@ -457,22 +474,44 @@ public: * created for the same expression, it will be more efficient to * separately create and cache a RegexPattern object, and use * its matcher() method to create the RegexMatcher objects. + *

        + * The matcher will retain a reference to the supplied input string, and all regexp + * pattern matching operations happen directly on the original string. It is + * critical that the string not be altered or deleted before use by the regular + * expression operations is complete. * - * @param regexp The Regular Expression to be compiled. - * @param input The string to match + * @param regexp The Regular Expression to be compiled. + * @param input The string to match. The matcher retains a reference to the + * caller's string; mo copy is made. * @param flags Regular expression options, such as case insensitive matching. * @see UREGEX_CASE_INSENSITIVE * @param status Any errors are reported by setting this UErrorCode variable. - * @draft ICU 2.6 + * @stable ICU 2.6 */ RegexMatcher(const UnicodeString ®exp, const UnicodeString &input, uint32_t flags, UErrorCode &status); +private: + /** + * Cause a compilation error if an application accidently attempts to + * create a matcher with a (UChar *) string as input rather than + * a UnicodeString. Avoids a dangling reference to a temporary string. + *

        + * To efficiently work with UChar *strings, wrap the data in a UnicodeString + * using one of the aliasing constructors, such as + * UnicodeString(UBool isTerminated, const UChar *text, int32_t textLength); + * + * @internal + */ + RegexMatcher(const UnicodeString ®exp, const UChar *input, + uint32_t flags, UErrorCode &status); +public: + /** - * Destructor. + * Destructor. * - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual ~RegexMatcher(); @@ -481,10 +520,21 @@ public: * Attempts to match the entire input string against the pattern. * @param status A reference to a UErrorCode to receive any errors. * @return TRUE if there is a match - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UBool matches(UErrorCode &status); + /** + * Attempts to match the input string, beginning at startIndex, against the pattern. + * The match must extend to the end of the input string. + * @param startIndex The input string index at which to begin matching. + * @param status A reference to a UErrorCode to receive any errors. + * @return TRUE if there is a match + * @draft ICU 2.8 + */ + virtual UBool matches(int32_t startIndex, UErrorCode &status); + + /** @@ -497,11 +547,26 @@ public: * * @param status A reference to a UErrorCode to receive any errors. * @return TRUE if there is a match at the start of the input string. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UBool lookingAt(UErrorCode &status); + /** + * Attempts to match the input string, starting from the specified index, against the pattern. + * The match may be of any length, and is not required to extend to the end + * of the input string. Contrast with match(). + * + *

        If the match succeeds then more information can be obtained via the start(), + * end(), and group() functions.

        + * + * @param startIndex The input string index at which to begin matching. + * @param status A reference to a UErrorCode to receive any errors. + * @return TRUE if there is a match. + * @draft ICU 2.8 + */ + virtual UBool lookingAt(int32_t startIndex, UErrorCode &status); + /** * Find the next pattern match in the input string. * The find begins searching the input at the location following the end of @@ -512,7 +577,7 @@ public: * use find(startPos, status) instead of find(), because the saved starting * position may not be valid with the altered input string.

        * @return TRUE if a match is found. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UBool find(); @@ -524,7 +589,7 @@ public: * @param start the position in the input string to begin the search * @param status A reference to a UErrorCode to receive any errors. * @return TRUE if a match is found. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UBool find(int32_t start, UErrorCode &status); @@ -536,7 +601,7 @@ public: * Possible errors are U_REGEX_INVALID_STATE if no match * has been attempted or the last match failed. * @return a string containing the matched input text. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UnicodeString group(UErrorCode &status) const; @@ -551,7 +616,7 @@ public: * has been attempted or the last match failed and * U_INDEX_OUTOFBOUNDS_ERROR for a bad capture group number. * @return the captured text - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UnicodeString group(int32_t groupNum, UErrorCode &status) const; @@ -559,7 +624,7 @@ public: /** * Returns the number of capturing groups in this matcher's pattern. * @return the number of capture groups - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual int32_t groupCount() const; @@ -569,7 +634,7 @@ public: * during the previous match operation. * @param status a reference to a UErrorCode to receive any errors. * @return The position in the input string of the start of the last match. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual int32_t start(UErrorCode &status) const; @@ -585,19 +650,19 @@ public: * attempted or the last match failed, and * U_INDEX_OUTOFBOUNDS_ERROR for a bad capture group number * @return the start position of substring matched by the specified group. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual int32_t start(int group, UErrorCode &status) const; /** - * Returns the index in the input string of the character following the + * Returns the index in the input string of the first character following the * text matched during the previous match operation. * @param status A reference to a UErrorCode to receive any errors. Possible * errors are U_REGEX_INVALID_STATE if no match has been * attempted or the last match failed. * @return the index of the last character matched, plus one. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual int32_t end(UErrorCode &status) const; @@ -610,10 +675,10 @@ public: * errors are U_REGEX_INVALID_STATE if no match has been * attempted or the last match failed and * U_INDEX_OUTOFBOUNDS_ERROR for a bad capture group number - * @return the index of the last character, plus one, of the text + * @return the index of the first character following the text * captured by the specifed group during the previous match operation. - * Return -1 if the capture group was not part of the match. - * @draft ICU 2.4 + * Return -1 if the capture group exists in the pattern but was not part of the match. + * @stable ICU 2.4 */ virtual int32_t end(int group, UErrorCode &status) const; @@ -624,26 +689,58 @@ public: * the input string. * * @return this RegexMatcher. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual RegexMatcher &reset(); + /** + * Resets this matcher, and set the current input position. + * The effect is to remove any memory of previous matches, + * and to cause subsequent find() operations to begin at + * the specified position in the input string. + * + * @return this RegexMatcher. + * @draft ICU 2.8 + */ + virtual RegexMatcher &reset(int32_t index, UErrorCode &status); + + /** * Resets this matcher with a new input string. This allows instances of RegexMatcher * to be reused, which is more efficient than creating a new RegexMatcher for - * each input string to be processed. + * each input string to be processed. + * @param input The new string on which subsequent pattern matches will operate. + * The matcher retains a reference to the callers string, and operates + * directly on that. Ownership of the string remains with the caller. + * Because no copy of the string is made, it is essential that the + * caller not delete the string until after regexp operations on it + * are done. * @return this RegexMatcher. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual RegexMatcher &reset(const UnicodeString &input); +private: + /** + * Cause a compilation error if an application accidently attempts to + * reset a matcher with a (UChar *) string as input rather than + * a UnicodeString. Avoids a dangling reference to a temporary string. + *

        + * To efficiently work with UChar *strings, wrap the data in a UnicodeString + * using one of the aliasing constructors, such as + * UnicodeString(UBool isTerminated, const UChar *text, int32_t textLength); + * + * @internal + */ + virtual RegexMatcher &reset(const UChar *input); +public: /** * Returns the input string being matched. The returned string is not a copy, * but the live input string. It should not be altered or deleted. * @return the input string - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual const UnicodeString &input() const; @@ -651,7 +748,7 @@ public: /** * Returns the pattern that is interpreted by this matcher. * @return the RegexPattern for this RegexMatcher - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual const RegexPattern &pattern() const; @@ -670,7 +767,7 @@ public: * @param replacement a string containing the replacement text. * @param status a reference to a UErrorCode to receive any errors. * @return a string containing the results of the find and replace. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UnicodeString replaceAll(const UnicodeString &replacement, UErrorCode &status); @@ -693,7 +790,7 @@ public: * @param replacement a string containing the replacement text. * @param status a reference to a UErrorCode to receive any errors. * @return a string containing the results of the find and replace. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UnicodeString replaceFirst(const UnicodeString &replacement, UErrorCode &status); @@ -701,7 +798,7 @@ public: * Implements a replace operation intended to be used as part of an * incremental find-and-replace. * - *

        The input string, starting from the end of the previous match and ending at + *

        The input string, starting from the end of the previous replacement and ending at * the start of the current match, is appended to the destination string. Then the * replacement string is appended to the output string, * including handling any substitutions of captured text.

        @@ -710,7 +807,7 @@ public: * operations, see replaceFirst() or replaceAll().

        * * @param dest A UnicodeString to which the results of the find-and-replace are appended. - * @param replacement A UnicodeString that provides the text to be substitured for + * @param replacement A UnicodeString that provides the text to be substituted for * the input text that matched the regexp pattern. The replacement * text may contain references to captured text from the * input. @@ -721,7 +818,7 @@ public: * does not exist in the pattern. * * @return this RegexMatcher - * @draft ICU 2.4 + * @stable ICU 2.4 * */ virtual RegexMatcher &appendReplacement(UnicodeString &dest, @@ -730,13 +827,13 @@ public: /** * As the final step in a find-and-replace operation, append the remainder - * of the input string, starting at the position following the last match, + * of the input string, starting at the position following the last appendReplacement(), * to the destination string. appendTail() is intended to be invoked after one * or more invocations of the RegexMatcher::appendReplacement(). * * @param dest A UnicodeString to which the results of the find-and-replace are appended. * @return the destination string. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UnicodeString &appendTail(UnicodeString &dest); @@ -748,7 +845,7 @@ public: * into fields. The input data between the matches becomes the * fields themselves. *

        - * + * * @param input The string to be split into fields. The field delimiters * match the pattern (in the "this" object). This matcher * will be reset to this input string. @@ -764,7 +861,7 @@ public: * field delimiters, is placed in the last destination string. * @param status A reference to a UErrorCode to receive any errors. * @return The number of fields into which the input string was split. - * @draft ICU 2.6 + * @stable ICU 2.6 */ virtual int32_t split(const UnicodeString &input, UnicodeString dest[], @@ -784,16 +881,16 @@ public: /** * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ - static inline UClassID getStaticClassID(); + static UClassID U_EXPORT2 getStaticClassID(); /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const; + virtual UClassID getDynamicClassID() const; private: // Constructors and other object boilerplate are private. @@ -803,7 +900,7 @@ private: RegexMatcher(const RegexMatcher &other); RegexMatcher &operator =(const RegexMatcher &rhs); friend class RegexPattern; - + friend class RegexCImpl; // // MatchAt This is the internal interface to the match engine itself. @@ -811,7 +908,8 @@ private: // void MatchAt(int32_t startIdx, UErrorCode &status); inline void backTrack(int32_t &inputIdx, int32_t &patIdx); - UBool isWordBoundary(int32_t pos); // perform the \b test + UBool isWordBoundary(int32_t pos); // perform Perl-like \b test + UBool isUWordBoundary(int32_t pos); // perform RBBI based \b test REStackFrame *resetStack(); inline REStackFrame *StateSave(REStackFrame *fp, int32_t savePatIdx, int32_t frameSize, UErrorCode &status); @@ -825,7 +923,9 @@ private: UBool fMatch; // True if the last match was successful. int32_t fMatchStart; // Position of the start of the most recent match int32_t fMatchEnd; // First position after the end of the most recent match - int32_t fLastMatchEnd; // First position after the end of the previous match. + int32_t fLastMatchEnd; // First position after the end of the previous match, + // or -1 if there was no previous match. + int32_t fLastReplaceEnd; // First position after the end of the previous appendReplacement(); UVector32 *fStack; REStackFrame *fFrame; // After finding a match, the last active stack @@ -840,22 +940,11 @@ private: UErrorCode fDeferredStatus; // Save error state if that cannot be immediately // reported, or that permanently disables this matcher. - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; + RuleBasedBreakIterator *fWordBreakItr; }; -inline UClassID RegexPattern::getStaticClassID() { return (UClassID)&fgClassID; } -inline UClassID RegexPattern::getDynamicClassID() const { return getStaticClassID(); } - -inline UClassID RegexMatcher::getStaticClassID() { return (UClassID)&fgClassID; } -inline UClassID RegexMatcher::getDynamicClassID() const { return getStaticClassID(); } - - U_NAMESPACE_END #endif // UCONFIG_NO_REGULAR_EXPRESSIONS #endif diff --git a/icuSources/i18n/unicode/search.h b/icuSources/i18n/unicode/search.h index 16b990e1..474ae91e 100644 --- a/icuSources/i18n/unicode/search.h +++ b/icuSources/i18n/unicode/search.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2001 IBM and others. All rights reserved. +* Copyright (C) 2001-2003 IBM and others. All rights reserved. ********************************************************************** * Date Name Description * 03/22/2000 helena Creation. @@ -100,7 +100,7 @@ public: * string accordingly without checking if the index is pointing to a * valid starting point to begin searching. * @param position within the text to be set. If position is less - * than or greater than the text range for searching, + * than or greater than the text range for searching, * an U_INDEX_OUTOFBOUNDS_ERROR will be returned * @param status for errors if it occurs * @stable ICU 2.0 @@ -307,7 +307,7 @@ public: * USEARCH_DONE will be returned and the iterator will be * adjusted to the index USEARCH_DONE * @param position where search if to start from. If position is less - * than or greater than the text range for searching, + * than or greater than the text range for searching, * an U_INDEX_OUTOFBOUNDS_ERROR will be returned * @param status for errors if it occurs * @return The character index of the first match following @@ -341,7 +341,7 @@ public: * USEARCH_DONE will be returned and the iterator will be * adjusted to the index USEARCH_DONE * @param position where search is to start from. If position is less - * than or greater than the text range for searching, + * than or greater than the text range for searching, * an U_INDEX_OUTOFBOUNDS_ERROR will be returned * @param status for errors if it occurs * @return The character index of the first match preceding @@ -440,7 +440,7 @@ protected: * is NULL, no break detection is attempted. * @see #handleNext * @see #handlePrev - * @stable ICU 2.0 + * @stable ICU 2.0 */ SearchIterator(const UnicodeString &text, BreakIterator *breakiter = NULL); @@ -462,7 +462,7 @@ protected: * is NULL, no break detection is attempted. * @see #handleNext * @see #handlePrev - * @stable ICU 2.0 + * @stable ICU 2.0 */ SearchIterator(CharacterIterator &text, BreakIterator *breakiter = NULL); @@ -472,7 +472,7 @@ protected: * Assignment operator. Sets this iterator to have the same behavior, * and iterate over the same text, as the one passed in. * @param that instance to be copied. - * @stable ICU 2.0 + * @stable ICU 2.0 */ SearchIterator & operator=(const SearchIterator &that); @@ -493,7 +493,7 @@ protected: * @return index at which the match starts, else if match is not found * USEARCH_DONE is returned * @see #setMatchLength - * @stable ICU 2.0 + * @stable ICU 2.0 */ virtual int32_t handleNext(int32_t position, UErrorCode &status) = 0; @@ -515,7 +515,7 @@ protected: * @return index at which the match starts, else if match is not found * USEARCH_DONE is returned * @see #setMatchLength - * @stable ICU 2.0 + * @stable ICU 2.0 */ virtual int32_t handlePrev(int32_t position, UErrorCode &status) = 0; @@ -528,7 +528,7 @@ protected: * @param length length of the matched text. * @see #handleNext * @see #handlePrev - * @stable ICU 2.0 + * @stable ICU 2.0 */ virtual void setMatchLength(int32_t length); @@ -540,7 +540,7 @@ protected: * @param position start offset of the matched text. * @see #handleNext * @see #handlePrev - * @stable ICU 2.0 + * @stable ICU 2.0 */ virtual void setMatchStart(int32_t position); diff --git a/icuSources/i18n/unicode/simpletz.h b/icuSources/i18n/unicode/simpletz.h index 97d4a429..a9af38e5 100644 --- a/icuSources/i18n/unicode/simpletz.h +++ b/icuSources/i18n/unicode/simpletz.h @@ -1,5 +1,5 @@ /* -* Copyright (C) {1997-2003}, International Business Machines Corporation and others. All Rights Reserved. +* Copyright (C) {1997-2004}, International Business Machines Corporation and others. All Rights Reserved. * * ******************************************************************************** * @@ -29,13 +29,8 @@ #include "unicode/timezone.h" -struct StandardZone; -struct DSTZone; - U_NAMESPACE_BEGIN -class TimeZone; - /** * SimpleTimeZone is a concrete subclass of TimeZone * that represents a time zone for use with a Gregorian calendar. This @@ -267,28 +262,30 @@ public: * setStartRule(TimeFields.APRIL, 1, TimeFields.SUNDAY, 2*60*60*1000); * The dayOfWeekInMonth and dayOfWeek parameters together specify how to calculate * the exact starting date. Their exact meaning depend on their respective signs, - * allowing various types of rules to be constructed, as follows:

          + * allowing various types of rules to be constructed, as follows: + *
            *
          • If both dayOfWeekInMonth and dayOfWeek are positive, they specify the * day of week in the month (e.g., (2, WEDNESDAY) is the second Wednesday - * of the month). + * of the month).
          • *
          • If dayOfWeek is positive and dayOfWeekInMonth is negative, they specify * the day of week in the month counting backward from the end of the month. - * (e.g., (-1, MONDAY) is the last Monday in the month) + * (e.g., (-1, MONDAY) is the last Monday in the month)
          • *
          • If dayOfWeek is zero and dayOfWeekInMonth is positive, dayOfWeekInMonth * specifies the day of the month, regardless of what day of the week it is. - * (e.g., (10, 0) is the tenth day of the month) + * (e.g., (10, 0) is the tenth day of the month)
          • *
          • If dayOfWeek is zero and dayOfWeekInMonth is negative, dayOfWeekInMonth * specifies the day of the month counting backward from the end of the * month, regardless of what day of the week it is (e.g., (-2, 0) is the - * next-to-last day of the month). + * next-to-last day of the month).
          • *
          • If dayOfWeek is negative and dayOfWeekInMonth is positive, they specify the * first specified day of the week on or after the specfied day of the month. * (e.g., (15, -SUNDAY) is the first Sunday after the 15th of the month - * [or the 15th itself if the 15th is a Sunday].) + * [or the 15th itself if the 15th is a Sunday].)
          • *
          • If dayOfWeek and DayOfWeekInMonth are both negative, they specify the * last specified day of the week on or before the specified day of the month. * (e.g., (-20, -TUESDAY) is the last Tuesday before the 20th of the month - * [or the 20th itself if the 20th is a Tuesday].)
          + * [or the 20th itself if the 20th is a Tuesday].) + *
        * @param month the daylight savings starting month. Month is 0-based. * eg, 0 for January. * @param dayOfWeekInMonth the daylight savings starting @@ -309,28 +306,30 @@ public: * setStartRule(TimeFields.APRIL, 1, TimeFields.SUNDAY, 2*60*60*1000); * The dayOfWeekInMonth and dayOfWeek parameters together specify how to calculate * the exact starting date. Their exact meaning depend on their respective signs, - * allowing various types of rules to be constructed, as follows:
          + * allowing various types of rules to be constructed, as follows: + *
            *
          • If both dayOfWeekInMonth and dayOfWeek are positive, they specify the * day of week in the month (e.g., (2, WEDNESDAY) is the second Wednesday - * of the month). + * of the month).
          • *
          • If dayOfWeek is positive and dayOfWeekInMonth is negative, they specify * the day of week in the month counting backward from the end of the month. - * (e.g., (-1, MONDAY) is the last Monday in the month) + * (e.g., (-1, MONDAY) is the last Monday in the month)
          • *
          • If dayOfWeek is zero and dayOfWeekInMonth is positive, dayOfWeekInMonth * specifies the day of the month, regardless of what day of the week it is. - * (e.g., (10, 0) is the tenth day of the month) + * (e.g., (10, 0) is the tenth day of the month)
          • *
          • If dayOfWeek is zero and dayOfWeekInMonth is negative, dayOfWeekInMonth * specifies the day of the month counting backward from the end of the * month, regardless of what day of the week it is (e.g., (-2, 0) is the - * next-to-last day of the month). + * next-to-last day of the month).
          • *
          • If dayOfWeek is negative and dayOfWeekInMonth is positive, they specify the * first specified day of the week on or after the specfied day of the month. * (e.g., (15, -SUNDAY) is the first Sunday after the 15th of the month - * [or the 15th itself if the 15th is a Sunday].) + * [or the 15th itself if the 15th is a Sunday].)
          • *
          • If dayOfWeek and DayOfWeekInMonth are both negative, they specify the * last specified day of the week on or before the specified day of the month. * (e.g., (-20, -TUESDAY) is the last Tuesday before the 20th of the month - * [or the 20th itself if the 20th is a Tuesday].)
          + * [or the 20th itself if the 20th is a Tuesday].) + *
        * @param month the daylight savings starting month. Month is 0-based. * eg, 0 for January. * @param dayOfWeekInMonth the daylight savings starting @@ -598,6 +597,14 @@ public: int32_t monthLength, int32_t prevMonthLength, UErrorCode& status) const; + /** + * Redeclared TimeZone method. This implementation simply calls + * the base class method, which otherwise would be hidden. + * @draft ICU 2.8 + */ + virtual void getOffset(UDate date, UBool local, int32_t& rawOffset, + int32_t& dstOffset, UErrorCode& ec) const; + /** * Returns the TimeZone's raw GMT offset (i.e., the number of milliseconds to add * to GMT to get local time, before taking daylight savings time into account). @@ -701,7 +708,7 @@ public: * @return The class ID for all objects of this class. * @stable ICU 2.0 */ - static UClassID getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(void); private: /** @@ -715,16 +722,8 @@ private: DOW_LE_DOM_MODE }; - friend class TimeZone; // for access to these 2 constructors: - SimpleTimeZone(); // default constructor not implemented - /** - * Construct from memory-mapped data. - */ - SimpleTimeZone(const StandardZone& stdZone, const UnicodeString& id); - SimpleTimeZone(const DSTZone& dstZone, const UnicodeString& id); - /** * Internal construction method. * @param rawOffsetGMT The new SimpleTimeZone's raw GMT offset @@ -785,8 +784,6 @@ private: void decodeStartRule(UErrorCode& status); void decodeEndRule(UErrorCode& status); - static const char fgClassID; - int8_t startMonth, startDay, startDayOfWeek; // the month, day, DOW, and time DST starts int32_t startTime; TimeMode startTimeMode, endTimeMode; // Mode for startTime, endTime; see TimeMode @@ -795,7 +792,7 @@ private: int32_t startYear; // the year these DST rules took effect int32_t rawOffset; // the TimeZone's raw GMT offset UBool useDaylight; // flag indicating whether this TimeZone uses DST - static const int8_t staticMonthLength[12]; // lengths of the months + static const int8_t STATICMONTHLENGTH[12]; // lengths of the months EMode startMode, endMode; // flags indicating what kind of rules the DST rules are /** @@ -805,14 +802,6 @@ private: int32_t dstSavings; }; -inline UClassID -SimpleTimeZone::getStaticClassID(void) -{ return (UClassID)&fgClassID; } - -inline UClassID -SimpleTimeZone::getDynamicClassID(void) const -{ return SimpleTimeZone::getStaticClassID(); } - inline void SimpleTimeZone::setStartRule(int32_t month, int32_t dayOfWeekInMonth, int32_t dayOfWeek, int32_t time, UErrorCode& status) { @@ -847,6 +836,12 @@ inline void SimpleTimeZone::setEndRule(int32_t month, int32_t dayOfMonth, int32_ setEndRule(month, dayOfMonth, dayOfWeek, time, WALL_TIME, after, status); } +inline void +SimpleTimeZone::getOffset(UDate date, UBool local, int32_t& rawOffsetRef, + int32_t& dstOffsetRef, UErrorCode& ec) const { + TimeZone::getOffset(date, local, rawOffsetRef, dstOffsetRef, ec); +} + U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/i18n/unicode/smpdtfmt.h b/icuSources/i18n/unicode/smpdtfmt.h index b8966c58..335c7651 100644 --- a/icuSources/i18n/unicode/smpdtfmt.h +++ b/icuSources/i18n/unicode/smpdtfmt.h @@ -1,5 +1,5 @@ /* -* Copyright (C) {1997-2003}, International Business Machines Corporation and others. All Rights Reserved. +* Copyright (C) {1997-2004}, International Business Machines Corporation and others. All Rights Reserved. ******************************************************************************* * * File SMPDTFMT.H @@ -56,30 +56,34 @@ class DateFormat; * as the following: *
          * \code
        - *    Symbol   Meaning                 Presentation       Example
        - *    ------   -------                 ------------       -------
        - *    G        era designator          (Text)             AD
        - *    y        year                    (Number)           1996
        - *    Y        year/week of year       (Number)           1996
        - *    M        month in year           (Text & Number)    July & 07
        - *    d        day in month            (Number)           10
        - *    h        hour in am/pm (1~12)    (Number)           12
        - *    H        hour in day (0~23)      (Number)           0
        - *    m        minute in hour          (Number)           30
        - *    s        second in minute        (Number)           55
        - *    S        millisecond             (Number)           978
        - *    E        day of week             (Text)             Tuesday
        - *    e        day of week/local (1~7) (Number)           2
        - *    D        day of year             (Number)           189
        - *    F        day of week in month    (Number)           2 (2nd Wed in July)
        - *    w        week in year            (Number)           27
        - *    W        week in month           (Number)           2
        - *    a        am/pm marker            (Text)             PM
        - *    k        hour in day (1~24)      (Number)           24
        - *    K        hour in am/pm (0~11)    (Number)           0
        - *    z        time zone               (Text)             Pacific Standard Time
        - *    '        escape for text
        - *    ''       single quote                               '
        + * Symbol   Meaning                 Presentation        Example
        + * ------   -------                 ------------        -------
        + * G        era designator          (Text)              AD
        + * y        year                    (Number)            1996
        + * Y        year (week of year)     (Number)            1997
        + * u        extended year           (Number)            4601
        + * M        month in year           (Text & Number)     July & 07
        + * d        day in month            (Number)            10
        + * h        hour in am/pm (1~12)    (Number)            12
        + * H        hour in day (0~23)      (Number)            0
        + * m        minute in hour          (Number)            30
        + * s        second in minute        (Number)            55
        + * S        fractional second       (Number)            978
        + * E        day of week             (Text)              Tuesday
        + * e        day of week (local 1~7) (Number)            2
        + * D        day in year             (Number)            189
        + * F        day of week in month    (Number)            2 (2nd Wed in July)
        + * w        week in year            (Number)            27
        + * W        week in month           (Number)            2
        + * a        am/pm marker            (Text)              PM
        + * k        hour in day (1~24)      (Number)            24
        + * K        hour in am/pm (0~11)    (Number)            0
        + * z        time zone               (Text)              Pacific Standard Time
        + * Z        time zone (RFC 822)     (Number)            -0800
        + * g        Julian day              (Number)            2451334
        + * A        milliseconds in day     (Number)            69540000
        + * '        escape for text         (Delimiter)         'Date='
        + * ''       single quote            (Literal)           'o''clock'
          * \endcode
          * 
        * The count of pattern letters determine the format. @@ -91,6 +95,7 @@ class DateFormat; * this amount (e.g. if "m" produces "6", "mm" produces "06"). Year is handled * specially; that is, if the count of 'y' is 2, the Year will be truncated to 2 digits. * (e.g., if "yyyy" produces "1997", "yy" produces "97".) + * Unlike other fields, fractional seconds are padded on the right with zero. *

        * (Text & Number): 3 or over, use text, otherwise use number. (e.g., "M" produces "1", * "MM" produces "01", "MMM" produces "Jan", and "MMMM" produces "January".) @@ -186,6 +191,10 @@ class DateFormat; * year, whether hours are zero based or not (0 vs 12 or 24), and the timezone. * There is one common number format to handle all the numbers; the digit count * is handled programmatically according to the pattern. + * + *

        User subclasses are not supported. While clients may write + * subclasses, such code will not necessarily work and will not be + * guaranteed to work stably from release to release. */ class U_I18N_API SimpleDateFormat: public DateFormat { public: @@ -557,7 +566,7 @@ public: * @return The class ID for all objects of this class. * @stable ICU 2.0 */ - static inline UClassID getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(void); /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This @@ -584,12 +593,6 @@ public: virtual void adoptCalendar(Calendar* calendarToAdopt); private: - static const char fgClassID; - - static const char fgDateTimePatternsTag[]; // resource bundle tag for default date and time patterns - - static const UChar fgDefaultPattern[]; // date/time pattern of last resort - friend class DateFormat; void initializeDefaultCentury(void); @@ -744,7 +747,7 @@ private: * @param translatedPattern Output param to receive the translited pattern. * @param from the characters to be translited from. * @param to the characters to be translited to. - * @param status Receives a status code, which will be U_ZERO_ERROR + * @param status Receives a status code, which will be U_ZERO_ERROR * if the operation succeeds. */ static void translatePattern(const UnicodeString& originalPattern, @@ -757,21 +760,11 @@ private: * Sets the starting date of the 100-year window that dates with 2-digit years * are considered to fall within. * @param startDate the start date - * @param status Receives a status code, which will be U_ZERO_ERROR + * @param status Receives a status code, which will be U_ZERO_ERROR * if the operation succeeds. */ void parseAmbiguousDatesAsAfter(UDate startDate, UErrorCode& status); - - /** - * Last-resort string to use for "GMT" when constructing time zone strings. - */ - // For time zones that have no names, use strings GMT+minutes and - // GMT-minutes. For instance, in France the time zone is GMT+60. - static const UChar fgGmtPlus[]; - static const UChar fgGmtMinus[]; - static const UChar fgGmt[]; - /** * Used to map pattern characters to Calendar field identifiers. */ @@ -780,7 +773,7 @@ private: /** * Map index into pattern character string to DateFormat field number */ - static const DateFormat::EField fgPatternIndexToDateFormatField[]; + static const UDateFormatField fgPatternIndexToDateFormatField[]; /** * The formatting pattern for this formatter. @@ -812,28 +805,10 @@ private: * See documentation for defaultCenturyStart. */ /*transient*/ int32_t fDefaultCenturyStartYear; - - UBool fHaveDefaultCentury; -public: - /** - * If a start date is set to this value, that indicates that the system default - * start is in effect for this instance. - * @internal - * @obsolete ICU 2.8 Use parseAmbiguousDatesAsAfter instead, since this member will be removed in that release. - */ - static const UDate fgSystemDefaultCentury; - // TODO Not supposed to be public: make it private in 2.8! + UBool fHaveDefaultCentury; }; -inline UClassID -SimpleDateFormat::getStaticClassID(void) -{ return (UClassID)&fgClassID; } - -inline UClassID -SimpleDateFormat::getDynamicClassID(void) const -{ return SimpleDateFormat::getStaticClassID(); } - inline UDate SimpleDateFormat::get2DigitYearStart(UErrorCode& /*status*/) const { diff --git a/icuSources/i18n/unicode/sortkey.h b/icuSources/i18n/unicode/sortkey.h index 28fbfb0b..4e550450 100644 --- a/icuSources/i18n/unicode/sortkey.h +++ b/icuSources/i18n/unicode/sortkey.h @@ -1,23 +1,21 @@ /* -* Copyright (C) {1996-2003}, International Business Machines Corporation and others. All Rights Reserved. -***************************************************************************************** -*/ -//=============================================================================== -// -// File sortkey.h -// -// -// -// Created by: Helena Shih -// -// Modification History: -// -// Date Name Description -// -// 6/20/97 helena Java class name change. -// 8/18/97 helena Added internal API documentation. -// 6/26/98 erm Changed to use byte arrays and memcmp. -//=============================================================================== + * Copyright (C) 1996-2004, International Business Machines Corporation and others. + * All Rights Reserved. + ***************************************************************************************** + * + * File sortkey.h + * + * Created by: Helena Shih + * + * Modification History: + * + * Date Name Description + * + * 6/20/97 helena Java class name change. + * 8/18/97 helena Added internal API documentation. + * 6/26/98 erm Changed to use byte arrays and memcmp. + ***************************************************************************************** + */ #ifndef SORTKEY_H #define SORTKEY_H @@ -86,6 +84,7 @@ class RuleBasedCollator; * @see RuleBasedCollator * @version 1.3 12/18/96 * @author Helena Shih + * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead */ class U_I18N_API CollationKey : public UObject { public: @@ -94,7 +93,7 @@ public: * collation key contains no sorting information. When comparing two empty * collation keys, the result is Collator::EQUAL. Comparing empty collation key * with non-empty collation key is always Collator::LESS. - * @stable ICU 2.0 + * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead */ CollationKey(); @@ -104,7 +103,7 @@ public: * @param values the collation key values * @param count number of collation key values, including trailing nulls. * @see #createBits - * @stable ICU 2.0 + * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead */ CollationKey(const uint8_t* values, int32_t count); @@ -112,20 +111,20 @@ public: /** * Copy constructor. * @param other the object to be copied. - * @stable ICU 2.0 + * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead */ CollationKey(const CollationKey& other); /** * Sort key destructor. - * @stable ICU 2.0 + * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead */ - ~CollationKey(); + virtual ~CollationKey(); /** * Assignment operator * @param other the object to be copied. - * @stable ICU 2.0 + * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead */ const CollationKey& operator=(const CollationKey& other); @@ -133,7 +132,7 @@ public: * Compare if two collation keys are the same. * @param source the collation key to compare to. * @return Returns true if two collation keys are equal, false otherwise. - * @stable ICU 2.0 + * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead */ UBool operator==(const CollationKey& source) const; @@ -141,7 +140,7 @@ public: * Compare if two collation keys are not the same. * @param source the collation key to compare to. * @return Returns TRUE if two collation keys are different, FALSE otherwise. - * @stable ICU 2.0 + * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead */ UBool operator!=(const CollationKey& source) const; @@ -150,7 +149,7 @@ public: * Test to see if the key is in an invalid state. The key will be in an * invalid state if it couldn't allocate memory for some operation. * @return Returns TRUE if the key is in an invalid, FALSE otherwise. - * @stable ICU 2.0 + * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead */ UBool isBogus(void) const; @@ -161,7 +160,7 @@ public: * @param count the output parameter of number of collation key values, * including any trailing nulls. * @return a pointer to the collation key values. - * @stable ICU 2.0 + * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead */ const uint8_t* getByteArray(int32_t& count) const; @@ -195,7 +194,7 @@ public: * @return Returns UCOL_LESS if sourceKey < targetKey, * UCOL_GREATER if sourceKey > targetKey and UCOL_EQUAL * otherwise. - * @draft ICU 2.6 + * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead */ UCollationResult compareTo(const CollationKey& target, UErrorCode &status) const; @@ -217,23 +216,21 @@ public: * * @return the hash value based on the string's collation order. * @see UnicodeString#hashCode - * @stable ICU 2.0 + * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead */ int32_t hashCode(void) const; /** * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @draft ICU 2.2 + * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead */ - virtual inline UClassID getDynamicClassID() const; + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @draft ICU 2.2 + * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead */ - static inline UClassID getStaticClassID(); + static UClassID U_EXPORT2 getStaticClassID(); private: /** @@ -249,65 +246,52 @@ private: * Creates a collation key with a string. */ - /** - * If this CollationKey has capacity less than newSize, - * its internal capacity will be increased to newSize. - * @param newSize minimum size this CollationKey has to have - * @return this CollationKey - */ + /** + * If this CollationKey has capacity less than newSize, + * its internal capacity will be increased to newSize. + * @param newSize minimum size this CollationKey has to have + * @return this CollationKey + */ CollationKey& ensureCapacity(int32_t newSize); - /** - * Set the CollationKey to a "bogus" or invalid state - * @return this CollationKey - */ + /** + * Set the CollationKey to a "bogus" or invalid state + * @return this CollationKey + */ CollationKey& setToBogus(void); - /** - * Resets this CollationKey to an empty state - * @return this CollationKey - */ + /** + * Resets this CollationKey to an empty state + * @return this CollationKey + */ CollationKey& reset(void); - - /** - * Allow private access to RuleBasedCollator - */ + + /** + * Allow private access to RuleBasedCollator + */ friend class RuleBasedCollator; - /** - * Bogus status - */ + /** + * Bogus status + */ UBool fBogus; - /** - * Size of fBytes used to store the sortkey. i.e. up till the - * null-termination. - */ + /** + * Size of fBytes used to store the sortkey. i.e. up till the + * null-termination. + */ int32_t fCount; - /** - * Full size of the fBytes - */ + /** + * Full size of the fBytes + */ int32_t fCapacity; - /** - * Unique hash value of this CollationKey - */ + /** + * Unique hash value of this CollationKey + */ int32_t fHashCode; - /** - * Array to store the sortkey - */ + /** + * Array to store the sortkey + */ uint8_t* fBytes; - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; -inline UClassID -CollationKey::getStaticClassID() -{ return (UClassID)&fgClassID; } - -inline UClassID -CollationKey::getDynamicClassID() const -{ return CollationKey::getStaticClassID(); } - inline UBool CollationKey::operator!=(const CollationKey& other) const { diff --git a/icuSources/i18n/unicode/stsearch.h b/icuSources/i18n/unicode/stsearch.h index 3625c82b..565f1e6a 100644 --- a/icuSources/i18n/unicode/stsearch.h +++ b/icuSources/i18n/unicode/stsearch.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2001-2003 IBM and others. All rights reserved. +* Copyright (C) 2001-2004 IBM and others. All rights reserved. ********************************************************************** * Date Name Description * 03/22/2000 helena Creation. @@ -32,7 +32,7 @@ U_NAMESPACE_BEGIN *

        * The algorithm implemented is a modified form of the Boyer Moore's search. * For more information see - * + * * "Efficient Text Searching in Java", published in Java Report * in February, 1999, for further information on the algorithm. *

        @@ -261,6 +261,19 @@ public: */ virtual ~StringSearch(void); + /** + * Clone this object. + * Clones can be used concurrently in multiple threads. + * If an error occurs, then NULL is returned. + * The caller must delete the clone. + * + * @return a clone of this object + * + * @see getDynamicClassID + * @draft ICU 2.8 + */ + StringSearch *clone() const; + // operator overloading --------------------------------------------- /** @@ -291,7 +304,7 @@ public: * string accordingly without checking if the index is pointing to a * valid starting point to begin searching. * @param position within the text to be set. If position is less - * than or greater than the text range for searching, + * than or greater than the text range for searching, * an U_INDEX_OUTOFBOUNDS_ERROR will be returned * @param status for errors if it occurs * @stable ICU 2.0 @@ -341,8 +354,8 @@ public: * Gets the collator used for the language rules. *

        * Caller may modify but must not delete the RuleBasedCollator! - * Modifications to this collator will affect the original collator passed in to - * the StringSearch>/tt> constructor or to setCollator, if any. + * Modifications to this collator will affect the original collator passed in to + * the StringSearch> constructor or to setCollator, if any. * @return collator used for string search * @stable ICU 2.0 */ @@ -403,16 +416,16 @@ public: /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const; + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.2 */ - static inline UClassID getStaticClassID(); + static UClassID U_EXPORT2 getStaticClassID(); protected: @@ -421,15 +434,15 @@ protected: /** * Search forward for matching text, starting at a given location. * Clients should not call this method directly; instead they should - * call {@link SearchIterator#next}. + * call {@link SearchIterator#next }. *

        * If a match is found, this method returns the index at which the match - * starts and calls {@link SearchIterator#setMatchLength} with the number + * starts and calls {@link SearchIterator#setMatchLength } with the number * of characters in the target text that make up the match. If no match * is found, the method returns USEARCH_DONE. *

        * The StringSearch is adjusted so that its current index - * (as returned by {@link #getOffset()}) is the match position if one was + * (as returned by {@link #getOffset }) is the match position if one was * found. * If a match is not found, USEARCH_DONE will be returned and * the StringSearch will be adjusted to the index USEARCH_DONE. @@ -448,12 +461,12 @@ protected: * SearchIterator.previous(), which this method overrides. *

        * If a match is found, this method returns the index at which the match - * starts and calls {@link SearchIterator#setMatchLength} with the number + * starts and calls {@link SearchIterator#setMatchLength } with the number * of characters in the target text that make up the match. If no match * is found, the method returns USEARCH_DONE. *

        * The StringSearch is adjusted so that its current index - * (as returned by {@link #getOffset()}) is the match position if one was + * (as returned by {@link #getOffset }) is the match position if one was * found. * If a match is not found, USEARCH_DONE will be returned and * the StringSearch will be adjusted to the index USEARCH_DONE. @@ -492,21 +505,8 @@ private : */ UStringSearch *m_strsrch_; - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; -inline UClassID -StringSearch::getStaticClassID() -{ return (UClassID)&fgClassID; } - -inline UClassID -StringSearch::getDynamicClassID() const -{ return StringSearch::getStaticClassID(); } - U_NAMESPACE_END #endif /* #if !UCONFIG_NO_COLLATION */ diff --git a/icuSources/i18n/unicode/tblcoll.h b/icuSources/i18n/unicode/tblcoll.h index 9ccad375..531a6996 100644 --- a/icuSources/i18n/unicode/tblcoll.h +++ b/icuSources/i18n/unicode/tblcoll.h @@ -1,6 +1,6 @@ /* ****************************************************************************** -* Copyright (C) 1996-2003, International Business Machines Corporation and +* Copyright (C) 1996-2004, International Business Machines Corporation and * others. All Rights Reserved. ****************************************************************************** */ @@ -108,720 +108,698 @@ public: // constructor ------------------------------------------------------------- - /** - * RuleBasedCollator constructor. This takes the table rules and builds a - * collation table out of them. Please see RuleBasedCollator class - * description for more details on the collation rule syntax. - * @param rules the collation rules to build the collation table from. - * @param status reporting a success or an error. - * @see Locale - * @stable ICU 2.0 - */ + /** + * RuleBasedCollator constructor. This takes the table rules and builds a + * collation table out of them. Please see RuleBasedCollator class + * description for more details on the collation rule syntax. + * @param rules the collation rules to build the collation table from. + * @param status reporting a success or an error. + * @see Locale + * @stable ICU 2.0 + */ RuleBasedCollator(const UnicodeString& rules, UErrorCode& status); - /** - * RuleBasedCollator constructor. This takes the table rules and builds a - * collation table out of them. Please see RuleBasedCollator class - * description for more details on the collation rule syntax. - * @param rules the collation rules to build the collation table from. - * @param collationStrength default strength for comparison - * @param status reporting a success or an error. - * @see Locale - * @stable ICU 2.0 - */ - RuleBasedCollator(const UnicodeString& rules, + /** + * RuleBasedCollator constructor. This takes the table rules and builds a + * collation table out of them. Please see RuleBasedCollator class + * description for more details on the collation rule syntax. + * @param rules the collation rules to build the collation table from. + * @param collationStrength default strength for comparison + * @param status reporting a success or an error. + * @see Locale + * @stable ICU 2.0 + */ + RuleBasedCollator(const UnicodeString& rules, ECollationStrength collationStrength, UErrorCode& status); - /** - * RuleBasedCollator constructor. This takes the table rules and builds a - * collation table out of them. Please see RuleBasedCollator class - * description for more details on the collation rule syntax. - * @param rules the collation rules to build the collation table from. - * @param decompositionMode the normalisation mode - * @param status reporting a success or an error. - * @see Locale - * @stable ICU 2.0 - */ - RuleBasedCollator(const UnicodeString& rules, + /** + * RuleBasedCollator constructor. This takes the table rules and builds a + * collation table out of them. Please see RuleBasedCollator class + * description for more details on the collation rule syntax. + * @param rules the collation rules to build the collation table from. + * @param decompositionMode the normalisation mode + * @param status reporting a success or an error. + * @see Locale + * @stable ICU 2.0 + */ + RuleBasedCollator(const UnicodeString& rules, UColAttributeValue decompositionMode, UErrorCode& status); - /** - * RuleBasedCollator constructor. This takes the table rules and builds a - * collation table out of them. Please see RuleBasedCollator class - * description for more details on the collation rule syntax. - * @param rules the collation rules to build the collation table from. - * @param collationStrength default strength for comparison - * @param decompositionMode the normalisation mode - * @param status reporting a success or an error. - * @see Locale - * @stable ICU 2.0 - */ - RuleBasedCollator(const UnicodeString& rules, + /** + * RuleBasedCollator constructor. This takes the table rules and builds a + * collation table out of them. Please see RuleBasedCollator class + * description for more details on the collation rule syntax. + * @param rules the collation rules to build the collation table from. + * @param collationStrength default strength for comparison + * @param decompositionMode the normalisation mode + * @param status reporting a success or an error. + * @see Locale + * @stable ICU 2.0 + */ + RuleBasedCollator(const UnicodeString& rules, ECollationStrength collationStrength, UColAttributeValue decompositionMode, UErrorCode& status); - /** - * Copy constructor. - * @param other the RuleBasedCollator object to be copied - * @see Locale - * @stable ICU 2.0 - */ + /** + * Copy constructor. + * @param other the RuleBasedCollator object to be copied + * @see Locale + * @stable ICU 2.0 + */ RuleBasedCollator(const RuleBasedCollator& other); - // destructor -------------------------------------------------------------- + // destructor -------------------------------------------------------------- - /** - * Destructor. - * @stable ICU 2.0 - */ + /** + * Destructor. + * @stable ICU 2.0 + */ virtual ~RuleBasedCollator(); - // public methods ---------------------------------------------------------- + // public methods ---------------------------------------------------------- - /** - * Assignment operator. - * @param other other RuleBasedCollator object to compare with. - * @stable ICU 2.0 - */ + /** + * Assignment operator. + * @param other other RuleBasedCollator object to compare with. + * @stable ICU 2.0 + */ RuleBasedCollator& operator=(const RuleBasedCollator& other); - /** - * Returns true if argument is the same as this object. - * @param other Collator object to be compared. - * @return true if arguments is the same as this object. - * @stable ICU 2.0 - */ - virtual UBool operator==(const Collator& other) const; - - /** - * Returns true if argument is not the same as this object. - * @param other Collator object to be compared - * @return returns true if argument is not the same as this object. - * @stable ICU 2.0 - */ - virtual UBool operator!=(const Collator& other) const; - - /** - * Makes a deep copy of the object. - * The caller owns the returned object. - * @return the cloned object. - * @stable ICU 2.0 - */ - virtual Collator* clone(void) const; - - /** - * Creates a collation element iterator for the source string. The caller of - * this method is responsible for the memory management of the return - * pointer. - * @param source the string over which the CollationElementIterator will - * iterate. - * @return the collation element iterator of the source string using this as - * the based Collator. - * @stable ICU 2.2 - */ + /** + * Returns true if argument is the same as this object. + * @param other Collator object to be compared. + * @return true if arguments is the same as this object. + * @stable ICU 2.0 + */ + virtual UBool operator==(const Collator& other) const; + + /** + * Returns true if argument is not the same as this object. + * @param other Collator object to be compared + * @return returns true if argument is not the same as this object. + * @stable ICU 2.0 + */ + virtual UBool operator!=(const Collator& other) const; + + /** + * Makes a deep copy of the object. + * The caller owns the returned object. + * @return the cloned object. + * @stable ICU 2.0 + */ + virtual Collator* clone(void) const; + + /** + * Creates a collation element iterator for the source string. The caller of + * this method is responsible for the memory management of the return + * pointer. + * @param source the string over which the CollationElementIterator will + * iterate. + * @return the collation element iterator of the source string using this as + * the based Collator. + * @stable ICU 2.2 + */ virtual CollationElementIterator* createCollationElementIterator( const UnicodeString& source) const; - /** - * Creates a collation element iterator for the source. The caller of this - * method is responsible for the memory management of the returned pointer. - * @param source the CharacterIterator which produces the characters over - * which the CollationElementItgerator will iterate. - * @return the collation element iterator of the source using this as the - * based Collator. - * @stable ICU 2.2 - */ - virtual CollationElementIterator* createCollationElementIterator( - const CharacterIterator& source) const; - - /** - * Compares a range of character data stored in two different strings based - * on the collation rules. Returns information about whether a string is - * less than, greater than or equal to another string in a language. - * This can be overriden in a subclass. - * @param source the source string. - * @param target the target string to be compared with the source string. - * @return the comparison result. GREATER if the source string is greater - * than the target string, LESS if the source is less than the - * target. Otherwise, returns EQUAL. - * @deprecated ICU 2.6 Use overload with UErrorCode& - */ - virtual EComparisonResult compare(const UnicodeString& source, - const UnicodeString& target) const; - - - /** - * The comparison function compares the character data stored in two - * different strings. Returns information about whether a string is less - * than, greater than or equal to another string. - * @param source the source string to be compared with. - * @param target the string that is to be compared with the source string. - * @param status possible error code - * @return Returns an enum value. UCOL_GREATER if source is greater - * than target; UCOL_EQUAL if source is equal to target; UCOL_LESS if source is less - * than target - * @draft ICU 2.6 - **/ - virtual UCollationResult compare(const UnicodeString& source, - const UnicodeString& target, - UErrorCode &status) const; - /** - * Compares a range of character data stored in two different strings based - * on the collation rules up to the specified length. Returns information - * about whether a string is less than, greater than or equal to another - * string in a language. This can be overriden in a subclass. - * @param source the source string. - * @param target the target string to be compared with the source string. - * @param length compares up to the specified length - * @return the comparison result. GREATER if the source string is greater - * than the target string, LESS if the source is less than the - * target. Otherwise, returns EQUAL. - * @deprecated ICU 2.6 Use overload with UErrorCode& - */ - virtual EComparisonResult compare(const UnicodeString& source, - const UnicodeString& target, - int32_t length) const; - - /** - * Does the same thing as compare but limits the comparison to a specified - * length - * @param source the source string to be compared with. - * @param target the string that is to be compared with the source string. - * @param length the length the comparison is limited to - * @param status possible error code - * @return Returns an enum value. UCOL_GREATER if source (up to the specified - * length) is greater than target; UCOL_EQUAL if source (up to specified - * length) is equal to target; UCOL_LESS if source (up to the specified - * length) is less than target. - * @draft ICU 2.6 - */ - virtual UCollationResult compare(const UnicodeString& source, - const UnicodeString& target, - int32_t length, - UErrorCode &status) const; - - /** - * The comparison function compares the character data stored in two - * different string arrays. Returns information about whether a string array - * is less than, greater than or equal to another string array. - *

        Example of use: - *

        -   * .       UChar ABC[] = {0x41, 0x42, 0x43, 0};  // = "ABC"
        -   * .       UChar abc[] = {0x61, 0x62, 0x63, 0};  // = "abc"
        -   * .       UErrorCode status = U_ZERO_ERROR;
        -   * .       Collator *myCollation =
        -   * .                         Collator::createInstance(Locale::US, status);
        -   * .       if (U_FAILURE(status)) return;
        -   * .       myCollation->setStrength(Collator::PRIMARY);
        -   * .       // result would be Collator::EQUAL ("abc" == "ABC")
        -   * .       // (no primary difference between "abc" and "ABC")
        -   * .       Collator::EComparisonResult result =
        -   * .                             myCollation->compare(abc, 3, ABC, 3);
        -   * .       myCollation->setStrength(Collator::TERTIARY);
        -   * .       // result would be Collator::LESS ("abc" <<< "ABC")
        -   * .       // (with tertiary difference between "abc" and "ABC")
        -   * .       result =  myCollation->compare(abc, 3, ABC, 3);
        -   * 
        - * @param source the source string array to be compared with. - * @param sourceLength the length of the source string array. If this value - * is equal to -1, the string array is null-terminated. - * @param target the string that is to be compared with the source string. - * @param targetLength the length of the target string array. If this value - * is equal to -1, the string array is null-terminated. - * @return Returns a byte value. GREATER if source is greater than target; - * EQUAL if source is equal to target; LESS if source is less than - * target - * @deprecated ICU 2.6 Use overload with UErrorCode& - */ - virtual EComparisonResult compare(const UChar* source, int32_t sourceLength, - const UChar* target, int32_t targetLength) - const; - - /** - * The comparison function compares the character data stored in two - * different string arrays. Returns information about whether a string array - * is less than, greater than or equal to another string array. - * @param source the source string array to be compared with. - * @param sourceLength the length of the source string array. If this value - * is equal to -1, the string array is null-terminated. - * @param target the string that is to be compared with the source string. - * @param targetLength the length of the target string array. If this value - * is equal to -1, the string array is null-terminated. - * @param status possible error code - * @return Returns an enum value. UCOL_GREATER if source is greater - * than target; UCOL_EQUAL if source is equal to target; UCOL_LESS if source is less - * than target - * @draft ICU 2.6 - */ - virtual UCollationResult compare(const UChar* source, int32_t sourceLength, - const UChar* target, int32_t targetLength, - UErrorCode &status) const; - - /** - * Transforms a specified region of the string into a series of characters - * that can be compared with CollationKey.compare. Use a CollationKey when - * you need to do repeated comparisions on the same string. For a single - * comparison the compare method will be faster. - * @param source the source string. - * @param key the transformed key of the source string. - * @param status the error code status. - * @return the transformed key. - * @see CollationKey - * @stable ICU 2.0 - */ - virtual CollationKey& getCollationKey(const UnicodeString& source, - CollationKey& key, - UErrorCode& status) const; - - /** - * Transforms a specified region of the string into a series of characters - * that can be compared with CollationKey.compare. Use a CollationKey when - * you need to do repeated comparisions on the same string. For a single - * comparison the compare method will be faster. - * @param source the source string. - * @param sourceLength the length of the source string. - * @param key the transformed key of the source string. - * @param status the error code status. - * @return the transformed key. - * @see CollationKey - * @stable ICU 2.0 - */ - virtual CollationKey& getCollationKey(const UChar *source, - int32_t sourceLength, - CollationKey& key, - UErrorCode& status) const; - - /** - * Generates the hash code for the rule-based collation object. - * @return the hash code. - * @stable ICU 2.0 - */ - virtual int32_t hashCode(void) const; - - /** - * Gets the locale of the Collator - * @param type can be either requested, valid or actual locale. For more - * information see the definition of ULocDataLocaleType in - * uloc.h - * @param status the error code status. - * @return locale where the collation data lives. If the collator - * was instantiated from rules, locale is empty. - * @stable ICU 2.1 - */ - virtual const Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const; - - /** - * Gets the table-based rules for the collation object. - * @return returns the collation rules that the table collation object was - * created from. - * @stable ICU 2.0 - */ - const UnicodeString& getRules(void) const; - - /** - * Gets the version information for a Collator. - * @param info the version # information, the result will be filled in - * @stable ICU 2.0 - */ - virtual void getVersion(UVersionInfo info) const; - - /** - * Return the maximum length of any expansion sequences that end with the - * specified comparison order. - * @param order a collation order returned by previous or next. - * @return maximum size of the expansion sequences ending with the collation - * element or 1 if collation element does not occur at the end of - * any expansion sequence - * @see CollationElementIterator#getMaxExpansion - * @stable ICU 2.0 - */ - int32_t getMaxExpansion(int32_t order) const; - - /** - * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This - * method is to implement a simple version of RTTI, since not all C++ - * compilers support genuine RTTI. Polymorphic operator==() and clone() - * methods call this method. - * @return The class ID for this object. All objects of a given class have - * the same class ID. Objects of other classes have different class - * IDs. - * @stable ICU 2.0 - */ - virtual UClassID getDynamicClassID(void) const; - - /** - * Returns the class ID for this class. This is useful only for comparing to - * a return value from getDynamicClassID(). For example: - *
        -   * Base* polymorphic_pointer = createPolymorphicObject();
        -   * if (polymorphic_pointer->getDynamicClassID() ==
        -   *                                          Derived::getStaticClassID()) ...
        -   * 
        - * @return The class ID for all objects of this class. - * @stable ICU 2.0 - */ - static UClassID getStaticClassID(void); - - /** - * Returns the binary format of the class's rules. The format is that of - * .col files. - * @param length Returns the length of the data, in bytes - * @param status the error code status. - * @return memory, owned by the caller, of size 'length' bytes. - * @stable ICU 2.2 - */ - uint8_t *cloneRuleData(int32_t &length, UErrorCode &status); - - /** - * Returns current rules. Delta defines whether full rules are returned or - * just the tailoring. - * @param delta one of UCOL_TAILORING_ONLY, UCOL_FULL_RULES. - * @param buffer UnicodeString to store the result rules - * @stable ICU 2.2 - */ - void getRules(UColRuleOption delta, UnicodeString &buffer); - - /** - * Universal attribute setter - * @param attr attribute type - * @param value attribute value - * @param status to indicate whether the operation went on smoothly or there were errors - * @stable ICU 2.2 - */ - virtual void setAttribute(UColAttribute attr, UColAttributeValue value, - UErrorCode &status); - - /** - * Universal attribute getter. - * @param attr attribute type - * @param status to indicate whether the operation went on smoothly or there were errors - * @return attribute value - * @stable ICU 2.2 - */ - virtual UColAttributeValue getAttribute(UColAttribute attr, - UErrorCode &status); - - /** - * Sets the variable top to a collation element value of a string supplied. - * @param varTop one or more (if contraction) UChars to which the variable top should be set - * @param len length of variable top string. If -1 it is considered to be zero terminated. - * @param status error code. If error code is set, the return value is undefined. Errors set by this function are:
        - * U_CE_NOT_FOUND_ERROR if more than one character was passed and there is no such a contraction
        - * U_PRIMARY_TOO_LONG_ERROR if the primary for the variable top has more than two bytes - * @return a 32 bit value containing the value of the variable top in upper 16 bits. Lower 16 bits are undefined - * @stable ICU 2.0 - */ - virtual uint32_t setVariableTop(const UChar *varTop, int32_t len, UErrorCode &status); - - /** - * Sets the variable top to a collation element value of a string supplied. - * @param varTop an UnicodeString size 1 or more (if contraction) of UChars to which the variable top should be set - * @param status error code. If error code is set, the return value is undefined. Errors set by this function are:
        - * U_CE_NOT_FOUND_ERROR if more than one character was passed and there is no such a contraction
        - * U_PRIMARY_TOO_LONG_ERROR if the primary for the variable top has more than two bytes - * @return a 32 bit value containing the value of the variable top in upper 16 bits. Lower 16 bits are undefined - * @stable ICU 2.0 - */ - virtual uint32_t setVariableTop(const UnicodeString varTop, UErrorCode &status); - - /** - * Sets the variable top to a collation element value supplied. Variable top is set to the upper 16 bits. - * Lower 16 bits are ignored. - * @param varTop CE value, as returned by setVariableTop or ucol)getVariableTop - * @param status error code (not changed by function) - * @stable ICU 2.0 - */ - virtual void setVariableTop(const uint32_t varTop, UErrorCode &status); - - /** - * Gets the variable top value of a Collator. - * Lower 16 bits are undefined and should be ignored. - * @param status error code (not changed by function). If error code is set, the return value is undefined. - * @stable ICU 2.0 - */ - virtual uint32_t getVariableTop(UErrorCode &status) const; - - /** - * Get an UnicodeSet that contains all the characters and sequences tailored in - * this collator. - * @param status error code of the operation - * @return a pointer to a UnicodeSet object containing all the - * code points and sequences that may sort differently than - * in the UCA. The object must be disposed of by using delete - * @draft ICU 2.4 - */ - virtual UnicodeSet *getTailoredSet(UErrorCode &status) const; - - /** - * Thread safe cloning operation. - * @return pointer to the new clone, user should remove it. - * @stable ICU 2.2 - */ - virtual Collator* safeClone(void); - - /** - * Get the sort key as an array of bytes from an UnicodeString. - * @param source string to be processed. - * @param result buffer to store result in. If NULL, number of bytes needed - * will be returned. - * @param resultLength length of the result buffer. If if not enough the - * buffer will be filled to capacity. - * @return Number of bytes needed for storing the sort key - * @stable ICU 2.0 - */ - virtual int32_t getSortKey(const UnicodeString& source, uint8_t *result, - int32_t resultLength) const; - - /** - * Get the sort key as an array of bytes from an UChar buffer. - * @param source string to be processed. - * @param sourceLength length of string to be processed. If -1, the string - * is 0 terminated and length will be decided by the function. - * @param result buffer to store result in. If NULL, number of bytes needed - * will be returned. - * @param resultLength length of the result buffer. If if not enough the - * buffer will be filled to capacity. - * @return Number of bytes needed for storing the sort key - * @stable ICU 2.2 - */ - virtual int32_t getSortKey(const UChar *source, int32_t sourceLength, - uint8_t *result, int32_t resultLength) const; - - /** - * Determines the minimum strength that will be use in comparison or - * transformation. - *

        E.g. with strength == SECONDARY, the tertiary difference is ignored - *

        E.g. with strength == PRIMARY, the secondary and tertiary difference - * are ignored. - * @return the current comparison level. - * @see RuleBasedCollator#setStrength - * @deprecated ICU 2.6 Use getAttribute(UCOL_STRENGTH...) instead - */ - virtual ECollationStrength getStrength(void) const; - - /** - * Sets the minimum strength to be used in comparison or transformation. - * @see RuleBasedCollator#getStrength - * @param newStrength the new comparison level. - * @deprecated ICU 2.6 Use setAttribute(UCOL_STRENGTH...) instead - */ - virtual void setStrength(ECollationStrength newStrength); + /** + * Creates a collation element iterator for the source. The caller of this + * method is responsible for the memory management of the returned pointer. + * @param source the CharacterIterator which produces the characters over + * which the CollationElementItgerator will iterate. + * @return the collation element iterator of the source using this as the + * based Collator. + * @stable ICU 2.2 + */ + virtual CollationElementIterator* createCollationElementIterator( + const CharacterIterator& source) const; + + /** + * Compares a range of character data stored in two different strings based + * on the collation rules. Returns information about whether a string is + * less than, greater than or equal to another string in a language. + * This can be overriden in a subclass. + * @param source the source string. + * @param target the target string to be compared with the source string. + * @return the comparison result. GREATER if the source string is greater + * than the target string, LESS if the source is less than the + * target. Otherwise, returns EQUAL. + * @deprecated ICU 2.6 Use overload with UErrorCode& + */ + virtual EComparisonResult compare(const UnicodeString& source, + const UnicodeString& target) const; + + + /** + * The comparison function compares the character data stored in two + * different strings. Returns information about whether a string is less + * than, greater than or equal to another string. + * @param source the source string to be compared with. + * @param target the string that is to be compared with the source string. + * @param status possible error code + * @return Returns an enum value. UCOL_GREATER if source is greater + * than target; UCOL_EQUAL if source is equal to target; UCOL_LESS if source is less + * than target + * @stable ICU 2.6 + **/ + virtual UCollationResult compare(const UnicodeString& source, + const UnicodeString& target, + UErrorCode &status) const; + + /** + * Compares a range of character data stored in two different strings based + * on the collation rules up to the specified length. Returns information + * about whether a string is less than, greater than or equal to another + * string in a language. This can be overriden in a subclass. + * @param source the source string. + * @param target the target string to be compared with the source string. + * @param length compares up to the specified length + * @return the comparison result. GREATER if the source string is greater + * than the target string, LESS if the source is less than the + * target. Otherwise, returns EQUAL. + * @deprecated ICU 2.6 Use overload with UErrorCode& + */ + virtual EComparisonResult compare(const UnicodeString& source, + const UnicodeString& target, + int32_t length) const; + + /** + * Does the same thing as compare but limits the comparison to a specified + * length + * @param source the source string to be compared with. + * @param target the string that is to be compared with the source string. + * @param length the length the comparison is limited to + * @param status possible error code + * @return Returns an enum value. UCOL_GREATER if source (up to the specified + * length) is greater than target; UCOL_EQUAL if source (up to specified + * length) is equal to target; UCOL_LESS if source (up to the specified + * length) is less than target. + * @stable ICU 2.6 + */ + virtual UCollationResult compare(const UnicodeString& source, + const UnicodeString& target, + int32_t length, + UErrorCode &status) const; + + /** + * The comparison function compares the character data stored in two + * different string arrays. Returns information about whether a string array + * is less than, greater than or equal to another string array. + *

        Example of use: + *

        +     * .       UChar ABC[] = {0x41, 0x42, 0x43, 0};  // = "ABC"
        +     * .       UChar abc[] = {0x61, 0x62, 0x63, 0};  // = "abc"
        +     * .       UErrorCode status = U_ZERO_ERROR;
        +     * .       Collator *myCollation =
        +     * .                         Collator::createInstance(Locale::US, status);
        +     * .       if (U_FAILURE(status)) return;
        +     * .       myCollation->setStrength(Collator::PRIMARY);
        +     * .       // result would be Collator::EQUAL ("abc" == "ABC")
        +     * .       // (no primary difference between "abc" and "ABC")
        +     * .       Collator::EComparisonResult result =
        +     * .                             myCollation->compare(abc, 3, ABC, 3);
        +     * .       myCollation->setStrength(Collator::TERTIARY);
        +     * .       // result would be Collator::LESS ("abc" <<< "ABC")
        +     * .       // (with tertiary difference between "abc" and "ABC")
        +     * .       result =  myCollation->compare(abc, 3, ABC, 3);
        +     * 
        + * @param source the source string array to be compared with. + * @param sourceLength the length of the source string array. If this value + * is equal to -1, the string array is null-terminated. + * @param target the string that is to be compared with the source string. + * @param targetLength the length of the target string array. If this value + * is equal to -1, the string array is null-terminated. + * @return Returns a byte value. GREATER if source is greater than target; + * EQUAL if source is equal to target; LESS if source is less than + * target + * @deprecated ICU 2.6 Use overload with UErrorCode& + */ + virtual EComparisonResult compare(const UChar* source, int32_t sourceLength, + const UChar* target, int32_t targetLength) + const; + + /** + * The comparison function compares the character data stored in two + * different string arrays. Returns information about whether a string array + * is less than, greater than or equal to another string array. + * @param source the source string array to be compared with. + * @param sourceLength the length of the source string array. If this value + * is equal to -1, the string array is null-terminated. + * @param target the string that is to be compared with the source string. + * @param targetLength the length of the target string array. If this value + * is equal to -1, the string array is null-terminated. + * @param status possible error code + * @return Returns an enum value. UCOL_GREATER if source is greater + * than target; UCOL_EQUAL if source is equal to target; UCOL_LESS if source is less + * than target + * @stable ICU 2.6 + */ + virtual UCollationResult compare(const UChar* source, int32_t sourceLength, + const UChar* target, int32_t targetLength, + UErrorCode &status) const; + + /** + * Transforms a specified region of the string into a series of characters + * that can be compared with CollationKey.compare. Use a CollationKey when + * you need to do repeated comparisions on the same string. For a single + * comparison the compare method will be faster. + * @param source the source string. + * @param key the transformed key of the source string. + * @param status the error code status. + * @return the transformed key. + * @see CollationKey + * @deprecated ICU 2.8 Use getSortKey(...) instead + */ + virtual CollationKey& getCollationKey(const UnicodeString& source, + CollationKey& key, + UErrorCode& status) const; + + /** + * Transforms a specified region of the string into a series of characters + * that can be compared with CollationKey.compare. Use a CollationKey when + * you need to do repeated comparisions on the same string. For a single + * comparison the compare method will be faster. + * @param source the source string. + * @param sourceLength the length of the source string. + * @param key the transformed key of the source string. + * @param status the error code status. + * @return the transformed key. + * @see CollationKey + * @deprecated ICU 2.8 Use getSortKey(...) instead + */ + virtual CollationKey& getCollationKey(const UChar *source, + int32_t sourceLength, + CollationKey& key, + UErrorCode& status) const; + + /** + * Generates the hash code for the rule-based collation object. + * @return the hash code. + * @stable ICU 2.0 + */ + virtual int32_t hashCode(void) const; + + /** + * Gets the locale of the Collator + * @param type can be either requested, valid or actual locale. For more + * information see the definition of ULocDataLocaleType in + * uloc.h + * @param status the error code status. + * @return locale where the collation data lives. If the collator + * was instantiated from rules, locale is empty. + * @deprecated ICU 2.8 likely to change in ICU 3.0, based on feedback + */ + virtual const Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const; + + /** + * Gets the table-based rules for the collation object. + * @return returns the collation rules that the table collation object was + * created from. + * @stable ICU 2.0 + */ + const UnicodeString& getRules(void) const; + + /** + * Gets the version information for a Collator. + * @param info the version # information, the result will be filled in + * @stable ICU 2.0 + */ + virtual void getVersion(UVersionInfo info) const; + + /** + * Return the maximum length of any expansion sequences that end with the + * specified comparison order. + * @param order a collation order returned by previous or next. + * @return maximum size of the expansion sequences ending with the collation + * element or 1 if collation element does not occur at the end of + * any expansion sequence + * @see CollationElementIterator#getMaxExpansion + * @stable ICU 2.0 + */ + int32_t getMaxExpansion(int32_t order) const; + + /** + * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This + * method is to implement a simple version of RTTI, since not all C++ + * compilers support genuine RTTI. Polymorphic operator==() and clone() + * methods call this method. + * @return The class ID for this object. All objects of a given class have + * the same class ID. Objects of other classes have different class + * IDs. + * @stable ICU 2.0 + */ + virtual UClassID getDynamicClassID(void) const; + + /** + * Returns the class ID for this class. This is useful only for comparing to + * a return value from getDynamicClassID(). For example: + *
        +     * Base* polymorphic_pointer = createPolymorphicObject();
        +     * if (polymorphic_pointer->getDynamicClassID() ==
        +     *                                          Derived::getStaticClassID()) ...
        +     * 
        + * @return The class ID for all objects of this class. + * @stable ICU 2.0 + */ + static UClassID U_EXPORT2 getStaticClassID(void); + + /** + * Returns the binary format of the class's rules. The format is that of + * .col files. + * @param length Returns the length of the data, in bytes + * @param status the error code status. + * @return memory, owned by the caller, of size 'length' bytes. + * @stable ICU 2.2 + */ + uint8_t *cloneRuleData(int32_t &length, UErrorCode &status); + + /** + * Returns current rules. Delta defines whether full rules are returned or + * just the tailoring. + * @param delta one of UCOL_TAILORING_ONLY, UCOL_FULL_RULES. + * @param buffer UnicodeString to store the result rules + * @stable ICU 2.2 + */ + void getRules(UColRuleOption delta, UnicodeString &buffer); + + /** + * Universal attribute setter + * @param attr attribute type + * @param value attribute value + * @param status to indicate whether the operation went on smoothly or there were errors + * @stable ICU 2.2 + */ + virtual void setAttribute(UColAttribute attr, UColAttributeValue value, + UErrorCode &status); + + /** + * Universal attribute getter. + * @param attr attribute type + * @param status to indicate whether the operation went on smoothly or there were errors + * @return attribute value + * @stable ICU 2.2 + */ + virtual UColAttributeValue getAttribute(UColAttribute attr, + UErrorCode &status); + + /** + * Sets the variable top to a collation element value of a string supplied. + * @param varTop one or more (if contraction) UChars to which the variable top should be set + * @param len length of variable top string. If -1 it is considered to be zero terminated. + * @param status error code. If error code is set, the return value is undefined. Errors set by this function are:
        + * U_CE_NOT_FOUND_ERROR if more than one character was passed and there is no such a contraction
        + * U_PRIMARY_TOO_LONG_ERROR if the primary for the variable top has more than two bytes + * @return a 32 bit value containing the value of the variable top in upper 16 bits. Lower 16 bits are undefined + * @stable ICU 2.0 + */ + virtual uint32_t setVariableTop(const UChar *varTop, int32_t len, UErrorCode &status); + + /** + * Sets the variable top to a collation element value of a string supplied. + * @param varTop an UnicodeString size 1 or more (if contraction) of UChars to which the variable top should be set + * @param status error code. If error code is set, the return value is undefined. Errors set by this function are:
        + * U_CE_NOT_FOUND_ERROR if more than one character was passed and there is no such a contraction
        + * U_PRIMARY_TOO_LONG_ERROR if the primary for the variable top has more than two bytes + * @return a 32 bit value containing the value of the variable top in upper 16 bits. Lower 16 bits are undefined + * @stable ICU 2.0 + */ + virtual uint32_t setVariableTop(const UnicodeString varTop, UErrorCode &status); + + /** + * Sets the variable top to a collation element value supplied. Variable top is set to the upper 16 bits. + * Lower 16 bits are ignored. + * @param varTop CE value, as returned by setVariableTop or ucol)getVariableTop + * @param status error code (not changed by function) + * @stable ICU 2.0 + */ + virtual void setVariableTop(const uint32_t varTop, UErrorCode &status); + + /** + * Gets the variable top value of a Collator. + * Lower 16 bits are undefined and should be ignored. + * @param status error code (not changed by function). If error code is set, the return value is undefined. + * @stable ICU 2.0 + */ + virtual uint32_t getVariableTop(UErrorCode &status) const; + + /** + * Get an UnicodeSet that contains all the characters and sequences tailored in + * this collator. + * @param status error code of the operation + * @return a pointer to a UnicodeSet object containing all the + * code points and sequences that may sort differently than + * in the UCA. The object must be disposed of by using delete + * @stable ICU 2.4 + */ + virtual UnicodeSet *getTailoredSet(UErrorCode &status) const; + + /** + * Thread safe cloning operation. + * @return pointer to the new clone, user should remove it. + * @stable ICU 2.2 + */ + virtual Collator* safeClone(void); + + /** + * Get the sort key as an array of bytes from an UnicodeString. + * @param source string to be processed. + * @param result buffer to store result in. If NULL, number of bytes needed + * will be returned. + * @param resultLength length of the result buffer. If if not enough the + * buffer will be filled to capacity. + * @return Number of bytes needed for storing the sort key + * @stable ICU 2.0 + */ + virtual int32_t getSortKey(const UnicodeString& source, uint8_t *result, + int32_t resultLength) const; + + /** + * Get the sort key as an array of bytes from an UChar buffer. + * @param source string to be processed. + * @param sourceLength length of string to be processed. If -1, the string + * is 0 terminated and length will be decided by the function. + * @param result buffer to store result in. If NULL, number of bytes needed + * will be returned. + * @param resultLength length of the result buffer. If if not enough the + * buffer will be filled to capacity. + * @return Number of bytes needed for storing the sort key + * @stable ICU 2.2 + */ + virtual int32_t getSortKey(const UChar *source, int32_t sourceLength, + uint8_t *result, int32_t resultLength) const; + + /** + * Determines the minimum strength that will be use in comparison or + * transformation. + *

        E.g. with strength == SECONDARY, the tertiary difference is ignored + *

        E.g. with strength == PRIMARY, the secondary and tertiary difference + * are ignored. + * @return the current comparison level. + * @see RuleBasedCollator#setStrength + * @deprecated ICU 2.6 Use getAttribute(UCOL_STRENGTH...) instead + */ + virtual ECollationStrength getStrength(void) const; + + /** + * Sets the minimum strength to be used in comparison or transformation. + * @see RuleBasedCollator#getStrength + * @param newStrength the new comparison level. + * @deprecated ICU 2.6 Use setAttribute(UCOL_STRENGTH...) instead + */ + virtual void setStrength(ECollationStrength newStrength); private: - // private static constants ----------------------------------------------- - - static const int32_t UNMAPPED; - static const int32_t CHARINDEX; // need look up in .commit() - static const int32_t EXPANDCHARINDEX; // Expand index follows - static const int32_t CONTRACTCHARINDEX; // contract indexes follow - - static const int32_t PRIMARYORDERINCREMENT; - static const int32_t SECONDARYORDERINCREMENT; - static const int32_t TERTIARYORDERINCREMENT; - static const int32_t PRIMARYORDERMASK; - static const int32_t SECONDARYORDERMASK; - static const int32_t TERTIARYORDERMASK; - static const int32_t IGNORABLEMASK; - static const int32_t PRIMARYDIFFERENCEONLY; - static const int32_t SECONDARYDIFFERENCEONLY; - static const int32_t PRIMARYORDERSHIFT; - static const int32_t SECONDARYORDERSHIFT; - - static const int32_t COLELEMENTSTART; - static const int32_t PRIMARYLOWZEROMASK; - static const int32_t RESETSECONDARYTERTIARY; - static const int32_t RESETTERTIARY; - - static const int32_t PRIMIGNORABLE; - - static const int16_t FILEID; - static const char kFilenameSuffix[]; - - // private static variables ----------------------------------------------- - - /** - * static class id - */ - static const char fgClassID; - - // private data members --------------------------------------------------- - - UBool dataIsOwned; - - UBool isWriteThroughAlias; - - /** - * c struct for collation. All initialisation for it has to be done through - * setUCollator(). - */ - UCollator *ucollator; - - /** - * Rule UnicodeString - */ - UnicodeString *urulestring; - - // friend classes -------------------------------------------------------- - - /** - * Used to iterate over collation elements in a character source. - */ - friend class CollationElementIterator; - - /** - * Collator ONLY needs access to RuleBasedCollator(const Locale&, - * UErrorCode&) - */ - friend class Collator; - - /** - * Searching over collation elements in a character source - */ - friend class StringSearch; - - // private constructors -------------------------------------------------- - - /** - * Default constructor - */ - RuleBasedCollator(); - - /** - * Constructor that takes in a UCollator struct - * @param collator UCollator struct - * @param rule the rule for the collator. - */ - RuleBasedCollator(UCollator *collator, UnicodeString *rule); - - /** - * RuleBasedCollator constructor. This constructor takes a locale. The - * only caller of this class should be Collator::createInstance(). If - * createInstance() happens to know that the requested locale's collation is - * implemented as a RuleBasedCollator, it can then call this constructor. - * OTHERWISE IT SHOULDN'T, since this constructor ALWAYS RETURNS A VALID - * COLLATION TABLE. It does this by falling back to defaults. - * @param desiredLocale locale used - * @param status error code status - */ - RuleBasedCollator(const Locale& desiredLocale, UErrorCode& status); - - /** - * common constructor implementation - * - * @param rules the collation rules to build the collation table from. - * @param collationStrength default strength for comparison - * @param decompositionMode the normalisation mode - * @param status reporting a success or an error. - */ - void - construct(const UnicodeString& rules, - UColAttributeValue collationStrength, - UColAttributeValue decompositionMode, - UErrorCode& status); - - // private methods ------------------------------------------------------- - - /** - * Creates the c struct for ucollator - * @param locale desired locale - * @param status error status - */ - void setUCollator(const Locale& locale, UErrorCode& status); - - /** - * Creates the c struct for ucollator - * @param locale desired locale name - * @param status error status - */ - void setUCollator(const char* locale, UErrorCode& status); - - /** - * Creates the c struct for ucollator. This used internally by StringSearch. - * Hence the responsibility of cleaning up the ucollator is not done by - * this RuleBasedCollator. The isDataOwned flag is set to FALSE. - * @param collator new ucollator data - * @param rules corresponding collation rules - */ - void setUCollator(UCollator *collator, UnicodeString *rules); + // private static constants ----------------------------------------------- + + static const int32_t UNMAPPED; + static const int32_t CHARINDEX; // need look up in .commit() + static const int32_t EXPANDCHARINDEX; // Expand index follows + static const int32_t CONTRACTCHARINDEX; // contract indexes follow + + static const int32_t PRIMARYORDERINCREMENT; + static const int32_t SECONDARYORDERINCREMENT; + static const int32_t TERTIARYORDERINCREMENT; + static const int32_t PRIMARYORDERMASK; + static const int32_t SECONDARYORDERMASK; + static const int32_t TERTIARYORDERMASK; + static const int32_t IGNORABLEMASK; + static const int32_t PRIMARYDIFFERENCEONLY; + static const int32_t SECONDARYDIFFERENCEONLY; + static const int32_t PRIMARYORDERSHIFT; + static const int32_t SECONDARYORDERSHIFT; + + static const int32_t COLELEMENTSTART; + static const int32_t PRIMARYLOWZEROMASK; + static const int32_t RESETSECONDARYTERTIARY; + static const int32_t RESETTERTIARY; + + static const int32_t PRIMIGNORABLE; + + // private data members --------------------------------------------------- + + UBool dataIsOwned; + + UBool isWriteThroughAlias; + + /** + * c struct for collation. All initialisation for it has to be done through + * setUCollator(). + */ + UCollator *ucollator; + + /** + * Rule UnicodeString + */ + UnicodeString *urulestring; + + // friend classes -------------------------------------------------------- + + /** + * Used to iterate over collation elements in a character source. + */ + friend class CollationElementIterator; + + /** + * Collator ONLY needs access to RuleBasedCollator(const Locale&, + * UErrorCode&) + */ + friend class Collator; + + /** + * Searching over collation elements in a character source + */ + friend class StringSearch; + + // private constructors -------------------------------------------------- + + /** + * Default constructor + */ + RuleBasedCollator(); + + /** + * Constructor that takes in a UCollator struct + * @param collator UCollator struct + * @param rule the rule for the collator. + */ + RuleBasedCollator(UCollator *collator, UnicodeString *rule); + + /** + * RuleBasedCollator constructor. This constructor takes a locale. The + * only caller of this class should be Collator::createInstance(). If + * createInstance() happens to know that the requested locale's collation is + * implemented as a RuleBasedCollator, it can then call this constructor. + * OTHERWISE IT SHOULDN'T, since this constructor ALWAYS RETURNS A VALID + * COLLATION TABLE. It does this by falling back to defaults. + * @param desiredLocale locale used + * @param status error code status + */ + RuleBasedCollator(const Locale& desiredLocale, UErrorCode& status); + + /** + * common constructor implementation + * + * @param rules the collation rules to build the collation table from. + * @param collationStrength default strength for comparison + * @param decompositionMode the normalisation mode + * @param status reporting a success or an error. + */ + void + construct(const UnicodeString& rules, + UColAttributeValue collationStrength, + UColAttributeValue decompositionMode, + UErrorCode& status); + + // private methods ------------------------------------------------------- + + /** + * Creates the c struct for ucollator + * @param locale desired locale + * @param status error status + */ + void setUCollator(const Locale& locale, UErrorCode& status); + + /** + * Creates the c struct for ucollator + * @param locale desired locale name + * @param status error status + */ + void setUCollator(const char* locale, UErrorCode& status); + + /** + * Creates the c struct for ucollator. This used internally by StringSearch. + * Hence the responsibility of cleaning up the ucollator is not done by + * this RuleBasedCollator. The isDataOwned flag is set to FALSE. + * @param collator new ucollator data + * @param rules corresponding collation rules + */ + void setUCollator(UCollator *collator, UnicodeString *rules); public: - /** - * Get UCollator data struct. Used only by StringSearch & intltest. - * @return UCollator data struct - * @internal - */ - const UCollator * getUCollator(); + /** + * Get UCollator data struct. Used only by StringSearch & intltest. + * @return UCollator data struct + * @internal + */ + const UCollator * getUCollator(); protected: - /** - * Used internally by registraton to define the requested and valid locales. - * @param requestedLocale the requsted locale - * @param validLocale the valid locale - * @internal - */ - virtual void setLocales(const Locale& requestedLocale, const Locale& validLocale); + /** + * Used internally by registraton to define the requested and valid locales. + * @param requestedLocale the requsted locale + * @param validLocale the valid locale + * @internal + */ + virtual void setLocales(const Locale& requestedLocale, const Locale& validLocale); private: - // if not owned and not a write through alias, copy the ucollator - void checkOwned(void); - - // utility to init rule string used by checkOwned and construct - void setRuleStringFromCollator(UErrorCode& status); - - /** - * Converts C's UCollationResult to EComparisonResult - * @param result member of the enum UComparisonResult - * @return EComparisonResult equivalent of UCollationResult - * @deprecated ICU 2.6. We will not need it. - */ - Collator::EComparisonResult getEComparisonResult( - const UCollationResult &result) const; - - /** - * Converts C's UCollationStrength to ECollationStrength - * @param strength member of the enum UCollationStrength - * @return ECollationStrength equivalent of UCollationStrength - */ - Collator::ECollationStrength getECollationStrength( - const UCollationStrength &strength) const; - - /** - * Converts C++'s ECollationStrength to UCollationStrength - * @param strength member of the enum ECollationStrength - * @return UCollationStrength equivalent of ECollationStrength - */ - UCollationStrength getUCollationStrength( - const Collator::ECollationStrength &strength) const; + // if not owned and not a write through alias, copy the ucollator + void checkOwned(void); + + // utility to init rule string used by checkOwned and construct + void setRuleStringFromCollator(UErrorCode& status); + + /** + * Converts C's UCollationResult to EComparisonResult + * @param result member of the enum UComparisonResult + * @return EComparisonResult equivalent of UCollationResult + * @deprecated ICU 2.6. We will not need it. + */ + Collator::EComparisonResult getEComparisonResult( + const UCollationResult &result) const; + + /** + * Converts C's UCollationStrength to ECollationStrength + * @param strength member of the enum UCollationStrength + * @return ECollationStrength equivalent of UCollationStrength + */ + Collator::ECollationStrength getECollationStrength( + const UCollationStrength &strength) const; + + /** + * Converts C++'s ECollationStrength to UCollationStrength + * @param strength member of the enum ECollationStrength + * @return UCollationStrength equivalent of ECollationStrength + */ + UCollationStrength getUCollationStrength( + const Collator::ECollationStrength &strength) const; }; // inline method implementation --------------------------------------------- -inline UClassID -RuleBasedCollator::getStaticClassID(void) -{ return (UClassID)&fgClassID; } - -inline UClassID -RuleBasedCollator::getDynamicClassID(void) const -{ return RuleBasedCollator::getStaticClassID(); } - -inline UBool RuleBasedCollator::operator!=(const Collator& other) const -{ - return !(*this == other); -} - inline void RuleBasedCollator::setUCollator(const Locale &locale, UErrorCode &status) { - setUCollator(locale.getName(), status); + setUCollator(locale.getName(), status); } -inline void RuleBasedCollator::setUCollator(UCollator *collator, +inline void RuleBasedCollator::setUCollator(UCollator *collator, UnicodeString *rules) { if (ucollator && dataIsOwned) { @@ -831,7 +809,7 @@ inline void RuleBasedCollator::setUCollator(UCollator *collator, ucollator = collator; urulestring = rules; dataIsOwned = FALSE; - isWriteThroughAlias = TRUE; + isWriteThroughAlias = TRUE; } inline const UCollator * RuleBasedCollator::getUCollator() @@ -842,51 +820,51 @@ inline const UCollator * RuleBasedCollator::getUCollator() inline Collator::EComparisonResult RuleBasedCollator::getEComparisonResult( const UCollationResult &result) const { - switch (result) - { - case UCOL_LESS : - return Collator::LESS; - case UCOL_EQUAL : - return Collator::EQUAL; - default : - return Collator::GREATER; - } + switch (result) + { + case UCOL_LESS : + return Collator::LESS; + case UCOL_EQUAL : + return Collator::EQUAL; + default : + return Collator::GREATER; + } } inline Collator::ECollationStrength RuleBasedCollator::getECollationStrength( const UCollationStrength &strength) const { - switch (strength) - { - case UCOL_PRIMARY : - return Collator::PRIMARY; - case UCOL_SECONDARY : - return Collator::SECONDARY; - case UCOL_TERTIARY : - return Collator::TERTIARY; - case UCOL_QUATERNARY : - return Collator::QUATERNARY; - default : - return Collator::IDENTICAL; - } + switch (strength) + { + case UCOL_PRIMARY : + return Collator::PRIMARY; + case UCOL_SECONDARY : + return Collator::SECONDARY; + case UCOL_TERTIARY : + return Collator::TERTIARY; + case UCOL_QUATERNARY : + return Collator::QUATERNARY; + default : + return Collator::IDENTICAL; + } } inline UCollationStrength RuleBasedCollator::getUCollationStrength( const Collator::ECollationStrength &strength) const { - switch (strength) - { - case Collator::PRIMARY : - return UCOL_PRIMARY; - case Collator::SECONDARY : - return UCOL_SECONDARY; - case Collator::TERTIARY : - return UCOL_TERTIARY; - case Collator::QUATERNARY : - return UCOL_QUATERNARY; - default : - return UCOL_IDENTICAL; - } + switch (strength) + { + case Collator::PRIMARY : + return UCOL_PRIMARY; + case Collator::SECONDARY : + return UCOL_SECONDARY; + case Collator::TERTIARY : + return UCOL_TERTIARY; + case Collator::QUATERNARY : + return UCOL_QUATERNARY; + default : + return UCOL_IDENTICAL; + } } U_NAMESPACE_END diff --git a/icuSources/i18n/unicode/timezone.h b/icuSources/i18n/unicode/timezone.h index 2aacc35b..79838e90 100644 --- a/icuSources/i18n/unicode/timezone.h +++ b/icuSources/i18n/unicode/timezone.h @@ -1,5 +1,5 @@ /* -* Copyright (C) {1997-2003}, International Business Machines Corporation and others. All Rights Reserved. +* Copyright (C) {1997-2004}, International Business Machines Corporation and others. All Rights Reserved. ******************************************************************************** * * File TIMEZONE.H @@ -32,6 +32,7 @@ #include "unicode/uobject.h" #include "unicode/unistr.h" +#include "unicode/ures.h" U_NAMESPACE_BEGIN @@ -52,11 +53,11 @@ class StringEnumeration; * with a time zone ID. For instance, the time zone ID for the Pacific * Standard Time zone is "PST". So, you can get a PST TimeZone object * with: - *

        + * \htmlonly
        \endhtmlonly *
          * TimeZone *tz = TimeZone::createTimeZone("PST");
          * 
        - *
        + * \htmlonly
        \endhtmlonly * You can use getAvailableIDs method to iterate through * all the supported time zone IDs. You can then choose a * supported ID to get a TimeZone. @@ -64,11 +65,11 @@ class StringEnumeration; * supported IDs, then you can create a custom time zone ID with * the following syntax: * - *
        + * \htmlonly
        \endhtmlonly *
          * GMT[+|-]hh[[:]mm]
          * 
        - *
        + * \htmlonly
        \endhtmlonly * * For example, you might specify GMT+14:00 as a custom * time zone ID. The TimeZone that is returned @@ -77,14 +78,16 @@ class StringEnumeration; * * TimeZone is an abstract class representing a time zone. A TimeZone is needed for * Calendar to produce local time for a particular time zone. A TimeZone comprises - * three basic pieces of information:
          + * three basic pieces of information: + *
            *
          • A time zone offset; that, is the number of milliseconds to add or subtract * from a time expressed in terms of GMT to convert it to the same time in that - * time zone (without taking daylight savings time into account). + * time zone (without taking daylight savings time into account).
          • *
          • Logic necessary to take daylight savings time into account if daylight savings * time is observed in that time zone (e.g., the days and hours on which daylight - * savings time begins and ends). - *
          • An ID. This is a text string that uniquely identifies the time zone.
          + * savings time begins and ends). + *
        • An ID. This is a text string that uniquely identifies the time zone.
        • + *
        * * (Only the ID is actually implemented in TimeZone; subclasses of TimeZone may handle * daylight savings time and GMT offset in different ways. Currently we only have one @@ -122,7 +125,7 @@ public: * @return the GMT time zone. * @stable ICU 2.0 */ - static const TimeZone* getGMT(void); + static const TimeZone* U_EXPORT2 getGMT(void); /** * Creates a TimeZone for the given ID. @@ -135,16 +138,16 @@ public: * return result. * @stable ICU 2.0 */ - static TimeZone* createTimeZone(const UnicodeString& ID); + static TimeZone* U_EXPORT2 createTimeZone(const UnicodeString& ID); /** * Returns an enumeration over all recognized time zone IDs. (i.e., * all strings that createTimeZone() accepts) * * @return an enumeration object, owned by the caller. - * @draft ICU 2.4 + * @stable ICU 2.4 */ - static StringEnumeration* createEnumeration(); + static StringEnumeration* U_EXPORT2 createEnumeration(); /** * Returns an enumeration over time zone IDs with a given raw @@ -160,10 +163,10 @@ public: * * @param rawOffset an offset from GMT in milliseconds, ignoring * the effect of daylight savings time, if any - * @return an enumeration object, owned by the caller - * @draft ICU 2.4 + * @return an enumeration object, owned by the caller + * @stable ICU 2.4 */ - static StringEnumeration* createEnumeration(int32_t rawOffset); + static StringEnumeration* U_EXPORT2 createEnumeration(int32_t rawOffset); /** * Returns an enumeration over time zone IDs associated with the @@ -172,11 +175,12 @@ public: * * @param country The ISO 3166 two-letter country code, or NULL to * retrieve zones not affiliated with any country. - * @return an enumeration object, owned by the caller - * @draft ICU 2.4 + * @return an enumeration object, owned by the caller + * @stable ICU 2.4 */ - static StringEnumeration* createEnumeration(const char* country); + static StringEnumeration* U_EXPORT2 createEnumeration(const char* country); +#ifdef U_USE_TIMEZONE_OBSOLETE_2_8 /** * Returns a list of time zone IDs, one for each time zone with a given GMT offset. * The return value is a list because there may be several times zones with the same @@ -240,6 +244,7 @@ public: * @obsolete ICU 2.8. Use createEnumeration(void) instead since this API will be removed in that release. */ static const UnicodeString** createAvailableIDs(int32_t& numIDs); +#endif /** * Returns the number of IDs in the equivalency group that @@ -255,7 +260,7 @@ public: * @see #getEquivalentID * @stable ICU 2.0 */ - static int32_t countEquivalentIDs(const UnicodeString& id); + static int32_t U_EXPORT2 countEquivalentIDs(const UnicodeString& id); /** * Returns an ID in the equivalency group that @@ -276,7 +281,7 @@ public: * @see #countEquivalentIDs * @stable ICU 2.0 */ - static const UnicodeString getEquivalentID(const UnicodeString& id, + static const UnicodeString U_EXPORT2 getEquivalentID(const UnicodeString& id, int32_t index); /** @@ -291,7 +296,7 @@ public: * object returned. * @stable ICU 2.0 */ - static TimeZone* createDefault(void); + static TimeZone* U_EXPORT2 createDefault(void); /** * Sets the default time zone (i.e., what's returned by getDefault()) to be the @@ -302,7 +307,7 @@ public: * @param zone A pointer to the new TimeZone object to use as the default. * @stable ICU 2.0 */ - static void adoptDefault(TimeZone* zone); + static void U_EXPORT2 adoptDefault(TimeZone* zone); /** * Same as adoptDefault(), except that the TimeZone object passed in is NOT adopted; @@ -311,7 +316,7 @@ public: * @param zone The given timezone. * @system */ - static void setDefault(const TimeZone& zone); + static void U_EXPORT2 setDefault(const TimeZone& zone); /** * Returns true if the two TimeZones are equal. (The TimeZone version only compares @@ -343,14 +348,18 @@ public: * that is returned (in other words, what is the adjusted GMT offset in this time zone * at this particular date and time?). For the time zones produced by createTimeZone(), * the reference data is specified according to the Gregorian calendar, and the date - * and time fields are in GMT, NOT local time. + * and time fields are local standard time. + * + *

        Note: Don't call this method. Instead, call the getOffset(UDate...) overload, + * which returns both the raw and the DST offset for a given time. This method + * is retained only for backward compatibility. * * @param era The reference date's era * @param year The reference date's year * @param month The reference date's month (0-based; 0 is January) * @param day The reference date's day-in-month (1-based) * @param dayOfWeek The reference date's day-of-week (1-based; 1 is Sunday) - * @param millis The reference date's milliseconds in day, UTT (NOT local time). + * @param millis The reference date's milliseconds in day, local standard time * @param status Output param to filled in with a success or an error. * @return The offset in milliseconds to add to GMT to get local time. * @stable ICU 2.0 @@ -361,6 +370,11 @@ public: /** * Gets the time zone offset, for current date, modified in case of * daylight savings. This is the offset to add *to* UTC to get local time. + * + *

        Note: Don't call this method. Instead, call the getOffset(UDate...) overload, + * which returns both the raw and the DST offset for a given time. This method + * is retained only for backward compatibility. + * * @param era the era of the given date. * @param year the year in the given date. * @param month the month in the given date. @@ -377,6 +391,32 @@ public: uint8_t dayOfWeek, int32_t milliseconds, int32_t monthLength, UErrorCode& status) const = 0; + /** + * Returns the time zone raw and GMT offset for the given moment + * in time. Upon return, local-millis = GMT-millis + rawOffset + + * dstOffset. All computations are performed in the proleptic + * Gregorian calendar. The default implementation in the TimeZone + * class delegates to the 8-argument getOffset(). + * + * @param date moment in time for which to return offsets, in + * units of milliseconds from January 1, 1970 0:00 GMT, either GMT + * time or local wall time, depending on `local'. + * @param local if true, `date' is local wall time; otherwise it + * is in GMT time. + * @param rawOffset output parameter to receive the raw offset, that + * is, the offset not including DST adjustments + * @param dstOffset output parameter to receive the DST offset, + * that is, the offset to be added to `rawOffset' to obtain the + * total offset between local and GMT time. If DST is not in + * effect, this value is zero; otherwise it is a positive value, + * typically one hour. + * @param ec input-output error code + * + * @draft ICU 2.8 + */ + virtual void getOffset(UDate date, UBool local, int32_t& rawOffset, + int32_t& dstOffset, UErrorCode& ec) const; + /** * Sets the TimeZone's raw GMT offset (i.e., the number of milliseconds to add * to GMT to get local time, before taking daylight savings time into account). @@ -410,7 +450,7 @@ public: * blockquote>

              * .     TimeZone* foo = TimeZone::createTimeZone("America/New_York");
              * .     foo.setID("America/Los_Angeles");
        -     * 
        + * \htmlonly\endhtmlonly * the time zone's GMT offset and daylight-savings rules don't change to those for * Los Angeles. They're still those for New York. Only the ID has changed.) * @@ -421,17 +461,17 @@ public: /** * Enum for use with getDisplayName - * @draft ICU 2.4 + * @stable ICU 2.4 */ enum EDisplayType { /** * Selector for short display name - * @draft ICU 2.4 + * @stable ICU 2.4 */ SHORT = 1, /** * Selector for long display name - * @draft ICU 2.4 + * @stable ICU 2.4 */ LONG }; @@ -538,28 +578,19 @@ public: /** * Return the class ID for this class. This is useful only for - * comparing to a return value from getDynamicClassID(). For example: - *
        -     * .   Base* polymorphic_pointer = createPolymorphicObject();
        -     * .   if (polymorphic_pointer->getDynamicClassID() ==
        -     * .       Derived::getStaticClassID()) ...
        -     * 
        + * comparing to a return value from getDynamicClassID(). * @return The class ID for all objects of this class. * @stable ICU 2.0 */ - static inline UClassID getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(void); /** - * Returns a unique class ID POLYMORPHICALLY. Pure virtual method. This method is to + * Returns a unique class ID POLYMORPHICALLY. This method is to * implement a simple version of RTTI, since not all C++ compilers support genuine * RTTI. Polymorphic operator==() and clone() methods call this method. *

        - * Concrete subclasses of TimeZone must implement getDynamicClassID() and also a - * static method and data member: - *

        -     * .     static UClassID getStaticClassID() { return (UClassID)&fgClassID; }
        -     * .     static char fgClassID;
        -     * 
        + * Concrete subclasses of TimeZone must use the UOBJECT_DEFINE_RTTI_IMPLEMENTATION + * macro from uobject.h in their implementation to provide correct RTTI information. * @return The class ID for this object. All objects of a given class have the * same class ID. Objects of other classes have different class IDs. * @stable ICU 2.0 @@ -595,9 +626,18 @@ protected: */ TimeZone& operator=(const TimeZone& right); -private: - static const char fgClassID; + /** + * Utility function. For internally loading rule data. + * @param top Top resource bundle for tz data + * @param ruleid ID of rule to load + * @param oldbundle Old bundle to reuse or NULL + * @param status Status parameter + * @return either a new bundle or *oldbundle + * @internal + */ + static UResourceBundle* loadRule(const UResourceBundle* top, const UnicodeString& ruleid, UResourceBundle* oldbundle, UErrorCode&status); +private: static TimeZone* createCustomTimeZone(const UnicodeString&); // Creates a time zone based on the string. /** @@ -621,10 +661,6 @@ private: }; -inline UClassID -TimeZone::getStaticClassID(void) -{ return (UClassID)&fgClassID; } - // ------------------------------------- inline UnicodeString& diff --git a/icuSources/i18n/unicode/translit.h b/icuSources/i18n/unicode/translit.h index 667af5c6..415c0885 100644 --- a/icuSources/i18n/unicode/translit.h +++ b/icuSources/i18n/unicode/translit.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -18,6 +18,7 @@ #include "unicode/unistr.h" #include "unicode/parseerr.h" #include "unicode/utrans.h" // UTransPosition, UTransDirection +#include "unicode/strenum.h" U_NAMESPACE_BEGIN @@ -68,12 +69,12 @@ class TransliteratorIDParser; * transliteration. For example, given a string input * and a transliterator t, the call * - *
        String result = t.transliterate(input); - *
        + * \htmlonly
        \endhtmlonlyString result = t.transliterate(input); + * \htmlonly
        \endhtmlonly * * will transliterate it and return the result. Other methods allow * the client to specify a substring to be transliterated and to use - * {@link Replaceable} objects instead of strings, in order to + * {@link Replaceable } objects instead of strings, in order to * preserve out-of-band information (such as text styles). * *

        Keyboard transliteration @@ -91,20 +92,20 @@ class TransliteratorIDParser; * *

        Consider the simple RuleBasedTransliterator: * - *

        + * \htmlonly
        \endhtmlonly * th>{theta}
        * t>{tau} - *
        + *
        \htmlonly
        \endhtmlonly * * When the user types 't', nothing will happen, since the * transliterator is waiting to see if the next character is 'h'. To * remedy this, we introduce the notion of a cursor, marked by a '|' * in the output string: * - *
        + * \htmlonly
        \endhtmlonly * t>|{tau}
        * {tau}h>{theta} - *
        + *
        \htmlonly
        \endhtmlonly * * Now when the user types 't', tau appears, and if the next character * is 'h', the tau changes to a theta. This is accomplished by @@ -163,13 +164,13 @@ class TransliteratorIDParser; * to 'B', and BA, which transliterates 'B' to 'A'. It might * seem that these are exact inverses, since * - *
        "A" x AB -> "B"
        - * "B" x BA -> "A"
        + * \htmlonly
        \endhtmlonly"A" x AB -> "B"
        + * "B" x BA -> "A"\htmlonly
        \endhtmlonly * * where 'x' represents transliteration. However, * - *
        "ABCD" x AB -> "BBCD"
        - * "BBCD" x BA -> "AACD"
        + * \htmlonly
        \endhtmlonly"ABCD" x AB -> "BBCD"
        + * "BBCD" x BA -> "AACD"\htmlonly
        \endhtmlonly * * so AB composed with BA is not the * identity. Nonetheless, BA may be usefully considered to be @@ -195,26 +196,26 @@ class TransliteratorIDParser; * *

        In addition to programmatic IDs, transliterator objects have * display names for presentation in user interfaces, returned by - * {@link #getDisplayName()}. + * {@link #getDisplayName }. * *

        Factory methods and registration * *

        In general, client code should use the factory method - * {@link #createInstance()} to obtain an instance of a + * {@link #createInstance } to obtain an instance of a * transliterator given its ID. Valid IDs may be enumerated using * getAvailableIDs(). Since transliterators are mutable, - * multiple calls to {@link #createInstance()} with the same ID will + * multiple calls to {@link #createInstance } with the same ID will * return distinct objects. * *

        In addition to the system transliterators registered at startup, * user transliterators may be registered by calling * registerInstance() at run time. A registered instance - * acts a template; future calls to {@link #createInstance()} with the ID + * acts a template; future calls to {@link #createInstance } with the ID * of the registered object return clones of that object. Thus any * object passed to registerInstance() must implement * clone() propertly. To register a transliterator subclass * without instantiating it (until it is needed), users may call - * registerClass(). In this case, the objects are + * {@link #registerFactory }. In this case, the objects are * instantiated by invoking the zero-argument public constructor of * the class. * @@ -255,17 +256,17 @@ private: /** * A context integer or pointer for a factory function, passed by * value. - * @draft ICU 2.4 + * @stable ICU 2.4 */ union Token { /** * This token, interpreted as a 32-bit integer. - * @draft ICU 2.4 + * @stable ICU 2.4 */ int32_t integer; /** * This token, interpreted as a native pointer. - * @draft ICU 2.4 + * @stable ICU 2.4 */ void* pointer; }; @@ -273,14 +274,14 @@ private: /** * Return a token containing an integer. * @return a token containing an integer. - * @draft ICU 2.4 + * @internal */ inline static Token integerToken(int32_t); /** * Return a token containing a pointer. * @return a token containing a pointer. - * @draft ICU 2.4 + * @internal */ inline static Token pointerToken(void*); @@ -297,9 +298,9 @@ private: * @param context a context pointer that will be stored and * later passed to the factory function when an ID matching * the registration ID is being instantiated with this factory. - * @draft ICU 2.4 + * @stable ICU 2.4 */ - typedef Transliterator* (*Factory)(const UnicodeString& ID, Token context); + typedef Transliterator* (U_EXPORT2 *Factory)(const UnicodeString& ID, Token context); protected: @@ -310,22 +311,22 @@ protected: * filter.contains() returns false will not be * altered by this transliterator. If filter is * null then no filtering is applied. - * @draft ICU 2.4 + * @stable ICU 2.4 */ Transliterator(const UnicodeString& ID, UnicodeFilter* adoptedFilter); /** * Copy constructor. - * @draft ICU 2.4 + * @stable ICU 2.4 */ Transliterator(const Transliterator&); /** * Assignment operator. - * @draft ICU 2.4 + * @stable ICU 2.4 */ Transliterator& operator=(const Transliterator&); - + /** * Create a transliterator from a basic ID. This is an ID * containing only the forward direction source, target, and @@ -335,7 +336,7 @@ protected: * NULL to leave the ID unchanged * @return a newly created Transliterator or null if the ID is * invalid. - * @draft ICU 2.4 + * @stable ICU 2.4 */ static Transliterator* createBasicInstance(const UnicodeString& id, const UnicodeString* canon); @@ -355,7 +356,7 @@ public: * Implements Cloneable. * All subclasses are encouraged to implement this method if it is * possible and reasonable to do so. Subclasses that are to be - * registered with the system using registerInstance() + * registered with the system using registerInstance() * are required to implement this method. If a subclass does not * implement clone() properly and is registered with the system * using registerInstance(), then the default clone() implementation @@ -425,7 +426,7 @@ public: * method, there may be untransliterated text that is waiting for * more input to resolve an ambiguity. In order to perform these * pending transliterations, clients should call {@link - * #finishTransliteration()} after the last call to this + * #finishTransliteration } after the last call to this * method has been made. * * @param text the buffer holding transliterated and untransliterated text @@ -465,16 +466,17 @@ public: * transliterated unambiguosly after a new character has been * inserted, typically as a result of a keyboard event. This is a * convenience method; see {@link - * #transliterate(Replaceable, UTransPosition, UnicodeString)} for details. + * #transliterate(Replaceable&, UTransPosition&, const UnicodeString&, UErrorCode&) const} + * for details. * @param text the buffer holding transliterated and * untransliterated text * @param index an array of three integers. See {@link - * #transliterate(Replaceable, UTransPosition, UnicodeString)}. + * #transliterate(Replaceable&, UTransPosition&, const UnicodeString&, UErrorCode&) const }. * @param insertion text to be inserted and possibly * transliterated into the translation buffer at * index.limit. * @param status Output param to filled in with a success or an error. - * @see #transliterate(Replaceable, UTransPosition, UnicodeString) + * @see #transliterate(Replaceable&, UTransPosition&, const UnicodeString&, UErrorCode&) const * @stable ICU 2.0 */ virtual void transliterate(Replaceable& text, UTransPosition& index, @@ -484,12 +486,13 @@ public: /** * Transliterates the portion of the text buffer that can be * transliterated unambiguosly. This is a convenience method; see - * {@link #transliterate(Replaceable, UTransPosition, UnicodeString)} for - * details. + * {@link + * #transliterate(Replaceable&, UTransPosition&, const UnicodeString&, UErrorCode&) const } + * for details. * @param text the buffer holding transliterated and * untransliterated text * @param index an array of three integers. See {@link - * #transliterate(Replaceable, UTransPosition, UnicodeString)}. + * #transliterate(Replaceable&, UTransPosition&, const UnicodeString&, UErrorCode&) const }. * @param status Output param to filled in with a success or an error. * @see #transliterate(Replaceable, int[], String) * @stable ICU 2.0 @@ -505,7 +508,7 @@ public: * @param text the buffer holding transliterated and * untransliterated text. * @param index the array of indices previously passed to {@link - * #transliterate()} + * #transliterate } * @stable ICU 2.0 */ virtual void finishTransliteration(Replaceable& text, @@ -541,7 +544,7 @@ protected: * incremental and non-incremental transliteration. Let * originalStart refer to the value of * pos.start upon entry. - * + * *

          *
        • If incremental is false, then this method * should transliterate all characters between @@ -561,7 +564,7 @@ protected: * transliterator and characters [pos.start, * pos.limit) are unchanged.
        • *
        - * + * *

        Implementations of this method should also obey the * following invariants:

        * @@ -584,13 +587,13 @@ protected: *
      • Text before pos.contextStart and text after * pos.contextLimit should be ignored.
      • *
      - * + * *

      Subclasses may safely assume that all characters in * [pos.start, pos.limit) are filtered. * In other words, the filter has already been applied by the time * this method is called. See * filteredTransliterate(). - * + * *

      This method is not for public consumption. Calling * this method directly will transliterate * [pos.start, pos.limit) without @@ -598,21 +601,21 @@ protected: * transliterate() instead of this method. Subclass code * should call filteredTransliterate() instead of * this method.

      - * + * * @param text the buffer holding transliterated and * untransliterated text - * + * * @param pos the indices indicating the start, limit, context * start, and context limit of the text. - * + * * @param incremental if true, assume more text may be inserted at * pos.limit and act accordingly. Otherwise, * transliterate all text between pos.start and * pos.limit and move pos.start up to * pos.limit. - * + * * @see #transliterate - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual void handleTransliterate(Replaceable& text, UTransPosition& pos, @@ -627,7 +630,7 @@ protected: * @param incremental if TRUE, then assume more characters may be inserted * at index.limit, and postpone processing to accomodate future incoming * characters - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual void filteredTransliterate(Replaceable& text, UTransPosition& index, @@ -644,7 +647,7 @@ private: * public API methods eventually call this method with a rollback argument * of TRUE. Other entities may call this method but rollback should be * FALSE. - * + * *

      If this transliterator has a filter, break up the input text into runs * of unfiltered characters. Pass each run to * .handleTransliterate(). @@ -693,7 +696,7 @@ protected: * Method for subclasses to use to set the maximum context length. * @param maxContextLength the new value to be set. * @see #getMaximumContextLength - * @draft ICU 2.4 + * @stable ICU 2.4 */ void setMaximumContextLength(int32_t maxContextLength); @@ -705,7 +708,7 @@ public: * will return this object, if it has been registered. * @return a programmatic identifier for this transliterator. * @see #registerInstance - * @see #registerClass + * @see #registerFactory * @see #getAvailableIDs * @stable ICU 2.0 */ @@ -714,13 +717,13 @@ public: /** * Returns a name for this transliterator that is appropriate for * display to the user in the default locale. See {@link - * #getDisplayName()} for details. + * #getDisplayName } for details. * @param ID the string identifier for this transliterator * @param result Output param to receive the display name * @return A reference to 'result'. * @stable ICU 2.0 */ - static UnicodeString& getDisplayName(const UnicodeString& ID, + static UnicodeString& U_EXPORT2 getDisplayName(const UnicodeString& ID, UnicodeString& result); /** @@ -744,7 +747,7 @@ public: * @return A reference to 'result'. * @stable ICU 2.0 */ - static UnicodeString& getDisplayName(const UnicodeString& ID, + static UnicodeString& U_EXPORT2 getDisplayName(const UnicodeString& ID, const Locale& inLocale, UnicodeString& result); @@ -764,7 +767,7 @@ public: * NULL. * @return the filter used by this transliterator, or NULL if this * transliterator uses no filter. - * @draft ICU 2.4 + * @stable ICU 2.4 */ UnicodeFilter* orphanFilter(void); @@ -808,7 +811,7 @@ public: * * @param ID a valid ID, as enumerated by getAvailableIDs() * @param dir either FORWARD or REVERSE. - * @param parseError Struct to recieve information on position + * @param parseError Struct to recieve information on position * of error if an error is encountered * @param status Output param to filled in with a success or an error. * @return A Transliterator object with the given ID @@ -817,7 +820,7 @@ public: * @see #getID * @stable ICU 2.0 */ - static Transliterator* createInstance(const UnicodeString& ID, + static Transliterator* U_EXPORT2 createInstance(const UnicodeString& ID, UTransDirection dir, UParseError& parseError, UErrorCode& status); @@ -832,9 +835,10 @@ public: * @return A Transliterator object with the given ID * @stable ICU 2.0 */ - static Transliterator* createInstance(const UnicodeString& ID, + static Transliterator* U_EXPORT2 createInstance(const UnicodeString& ID, UTransDirection dir, UErrorCode& status); + /** * Returns a Transliterator object constructed from * the given rule string. This will be a RuleBasedTransliterator, @@ -845,12 +849,12 @@ public: * @param ID the id for the transliterator. * @param rules rules, separated by ';' * @param dir either FORWARD or REVERSE. - * @param parseError Struct to recieve information on position + * @param parseError Struct to recieve information on position * of error if an error is encountered * @param status Output param set to success/failure code. * @stable ICU 2.0 */ - static Transliterator* createFromRules(const UnicodeString& ID, + static Transliterator* U_EXPORT2 createFromRules(const UnicodeString& ID, const UnicodeString& rules, UTransDirection dir, UParseError& parseError, @@ -862,28 +866,63 @@ public: * @param result the string to receive the rules. Previous * contents will be deleted. * @param escapeUnprintable if TRUE then convert unprintable - * character to their hex escape representations, \uxxxx or - * \Uxxxxxxxx. Unprintable characters are those other than + * character to their hex escape representations, \\uxxxx or + * \\Uxxxxxxxx. Unprintable characters are those other than * U+000A, U+0020..U+007E. * @stable ICU 2.0 */ virtual UnicodeString& toRules(UnicodeString& result, UBool escapeUnprintable) const; + /** + * Return the number of elements that make up this transliterator. + * For example, if the transliterator "NFD;Jamo-Latin;Latin-Greek" + * were created, the return value of this method would be 3. + * + *

      If this transliterator is not composed of other + * transliterators, then this method returns 1. + * @return the number of transliterators that compose this + * transliterator, or 1 if this transliterator is not composed of + * multiple transliterators + * @draft ICU 3.0 + */ + int32_t countElements() const; + + /** + * Return an element that makes up this transliterator. For + * example, if the transliterator "NFD;Jamo-Latin;Latin-Greek" + * were created, the return value of this method would be one + * of the three transliterator objects that make up that + * transliterator: [NFD, Jamo-Latin, Latin-Greek]. + * + *

      If this transliterator is not composed of other + * transliterators, then this method will return a reference to + * this transliterator when given the index 0. + * @param index a value from 0..countElements()-1 indicating the + * transliterator to return + * @param ec input-output error code + * @return one of the transliterators that makes up this + * transliterator, if this transliterator is made up of multiple + * transliterators, otherwise a reference to this object if given + * an index of 0 + * @draft ICU 3.0 + */ + const Transliterator& getElement(int32_t index, UErrorCode& ec) const; + /** * Returns the set of all characters that may be modified in the * input text by this Transliterator. This incorporates this * object's current filter; if the filter is changed, the return * value of this function will change. The default implementation * returns an empty set. Some subclasses may override {@link - * #handleGetSourceSet()} to return a more precise result. The + * #handleGetSourceSet } to return a more precise result. The * return result is approximate in any case and is intended for * use by tests, tools, or utilities. * @param result receives result set; previous contents lost * @return a reference to result * @see #getTargetSet * @see #handleGetSourceSet - * @draft ICU 2.4 + * @stable ICU 2.4 */ UnicodeSet& getSourceSet(UnicodeSet& result) const; @@ -899,7 +938,7 @@ public: * @param result receives result set; previous contents lost * @see #getSourceSet * @see #getTargetSet - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual void handleGetSourceSet(UnicodeSet& result) const; @@ -914,7 +953,7 @@ public: * @param result receives result set; previous contents lost * @return a reference to result * @see #getTargetSet - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UnicodeSet& getTargetSet(UnicodeSet& result) const; @@ -931,7 +970,7 @@ public: * the registration ID is being instantiated with this factory. * @stable ICU 2.0 */ - static void registerFactory(const UnicodeString& id, + static void U_EXPORT2 registerFactory(const UnicodeString& id, Factory factory, Token context); @@ -948,11 +987,11 @@ public: * @param adoptedObj an instance of subclass of * Transliterator that defines clone() * @see #createInstance - * @see #registerClass + * @see #registerFactory * @see #unregister * @stable ICU 2.0 */ - static void registerInstance(Transliterator* adoptedObj); + static void U_EXPORT2 registerInstance(Transliterator* adoptedObj); protected: @@ -1023,41 +1062,31 @@ public: * @return the Object that was registered with * ID, or null if none was * @see #registerInstance - * @see #registerClass + * @see #registerFactory * @stable ICU 2.0 */ - static void unregister(const UnicodeString& ID); + static void U_EXPORT2 unregister(const UnicodeString& ID); public: /** - * Return the number of IDs currently registered with the system. - * To retrieve the actual IDs, call getAvailableID(i) with - * i from 0 to countAvailableIDs() - 1. - * @return the number of IDs currently registered with the system. - * @stable ICU 2.0 + * Return a StringEnumeration over the IDs available at the time of the + * call, including user-registered IDs. + * @param ec input-output error code + * @return a newly-created StringEnumeration over the transliterators + * available at the time of the call. The caller should delete this object + * when done using it. + * @draft ICU 3.0 */ - static int32_t countAvailableIDs(void); - - /** - * Return the index-th available ID. index must be between 0 - * and countAvailableIDs() - 1, inclusive. If index is out of - * range, the result of getAvailableID(0) is returned. - * @param index the given ID index. - * @return the index-th available ID. index must be between 0 - * and countAvailableIDs() - 1, inclusive. If index is out of - * range, the result of getAvailableID(0) is returned. - * @stable ICU 2.0 - */ - static const UnicodeString& getAvailableID(int32_t index); + static StringEnumeration* U_EXPORT2 getAvailableIDs(UErrorCode& ec); /** * Return the number of registered source specifiers. * @return the number of registered source specifiers. * @stable ICU 2.0 */ - static int32_t countAvailableSources(void); - + static int32_t U_EXPORT2 countAvailableSources(void); + /** * Return a registered source specifier. * @param index which specifier to return, from 0 to n-1, where @@ -1067,9 +1096,9 @@ public: * @return reference to result * @stable ICU 2.0 */ - static UnicodeString& getAvailableSource(int32_t index, + static UnicodeString& U_EXPORT2 getAvailableSource(int32_t index, UnicodeString& result); - + /** * Return the number of registered target specifiers for a given * source specifier. @@ -1078,8 +1107,8 @@ public: * source specifier. * @stable ICU 2.0 */ - static int32_t countAvailableTargets(const UnicodeString& source); - + static int32_t U_EXPORT2 countAvailableTargets(const UnicodeString& source); + /** * Return a registered target specifier for a given source. * @param index which specifier to return, from 0 to n-1, where @@ -1091,10 +1120,10 @@ public: * @return reference to result * @stable ICU 2.0 */ - static UnicodeString& getAvailableTarget(int32_t index, + static UnicodeString& U_EXPORT2 getAvailableTarget(int32_t index, const UnicodeString& source, UnicodeString& result); - + /** * Return the number of registered variant specifiers for a given * source-target pair. @@ -1102,9 +1131,9 @@ public: * @param target the target specifiers. * @stable ICU 2.0 */ - static int32_t countAvailableVariants(const UnicodeString& source, + static int32_t U_EXPORT2 countAvailableVariants(const UnicodeString& source, const UnicodeString& target); - + /** * Return a registered variant specifier for a given source-target * pair. @@ -1118,7 +1147,7 @@ public: * @return reference to result * @stable ICU 2.0 */ - static UnicodeString& getAvailableVariant(int32_t index, + static UnicodeString& U_EXPORT2 getAvailableVariant(int32_t index, const UnicodeString& source, const UnicodeString& target, UnicodeString& result); @@ -1130,43 +1159,43 @@ protected: * @internal */ static int32_t _countAvailableSources(void); - + /** * Non-mutexed internal method * @internal */ static UnicodeString& _getAvailableSource(int32_t index, - UnicodeString& result); - + UnicodeString& result); + /** * Non-mutexed internal method * @internal */ static int32_t _countAvailableTargets(const UnicodeString& source); - + /** * Non-mutexed internal method * @internal */ static UnicodeString& _getAvailableTarget(int32_t index, - const UnicodeString& source, - UnicodeString& result); - + const UnicodeString& source, + UnicodeString& result); + /** * Non-mutexed internal method * @internal */ static int32_t _countAvailableVariants(const UnicodeString& source, - const UnicodeString& target); - + const UnicodeString& target); + /** * Non-mutexed internal method * @internal */ static UnicodeString& _getAvailableVariant(int32_t index, - const UnicodeString& source, - const UnicodeString& target, - UnicodeString& result); + const UnicodeString& source, + const UnicodeString& target, + UnicodeString& result); protected: @@ -1174,7 +1203,7 @@ protected: * Set the ID of this transliterators. Subclasses shouldn't do * this, unless the underlying script behavior has changed. * @param id the new id t to be set. - * @draft ICU 2.4 + * @stable ICU 2.4 */ void setID(const UnicodeString& id); @@ -1182,34 +1211,25 @@ public: /** * Return the class ID for this class. This is useful only for - * comparing to a return value from getDynamicClassID(). For example: - *

      -     * .      Base* polymorphic_pointer = createPolymorphicObject();
      -     * .      if (polymorphic_pointer->getDynamicClassID() ==
      -     * .          Derived::getStaticClassID()) ...
      -     * 
      - * @return The class ID for all objects of this class. + * comparing to a return value from getDynamicClassID(). + * Note that Transliterator is an abstract base class, and therefor + * no fully constructed object will have a dynamic + * UCLassID that equals the UClassID returned from + * TRansliterator::getStaticClassID(). + * @return The class ID for class Transliterator. * @stable ICU 2.0 */ - static inline UClassID getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(void); /** * Returns a unique class ID polymorphically. This method * is to implement a simple version of RTTI, since not all C++ * compilers support genuine RTTI. Polymorphic operator==() and * clone() methods call this method. - * - *

      Concrete subclasses of Transliterator that wish clients to - * be able to identify them should implement getDynamicClassID() - * and also a static method and data member: - * - *

      -     * static UClassID getStaticClassID() { return (UClassID)&fgClassID; }
      -     * static char fgClassID;
      -     * 
      * - * Subclasses that do not implement this method will have a - * dynamic class ID of Transliterator::getStatisClassID(). + *

      Concrete subclasses of Transliterator must use the + * UOBJECT_DEFINE_RTTI_IMPLEMENTATION macro from + * uobject.h to provide the RTTI functions. * * @return The class ID for this object. All objects of a given * class have the same class ID. Objects of other classes have @@ -1219,28 +1239,41 @@ public: virtual UClassID getDynamicClassID(void) const = 0; private: + static UBool initializeRegistry(void); +public: /** - * Class identifier for subclasses of Transliterator that do not - * define their class (anonymous subclasses). + * Return the number of IDs currently registered with the system. + * To retrieve the actual IDs, call getAvailableID(i) with + * i from 0 to countAvailableIDs() - 1. + * @return the number of IDs currently registered with the system. + * @obsolete ICU 3.4 use getAvailableIDs() instead */ - static const char fgClassID; - -private: - static UBool initializeRegistry(void); + static int32_t U_EXPORT2 countAvailableIDs(void); + /** + * Return the index-th available ID. index must be between 0 + * and countAvailableIDs() - 1, inclusive. If index is out of + * range, the result of getAvailableID(0) is returned. + * @param index the given ID index. + * @return the index-th available ID. index must be between 0 + * and countAvailableIDs() - 1, inclusive. If index is out of + * range, the result of getAvailableID(0) is returned. + * @obsolete ICU 3.4 use getAvailableIDs() instead; this function + * is not thread safe, since it returns a reference to storage that + * may become invalid if another thread calls unregister + */ + static const UnicodeString& U_EXPORT2 getAvailableID(int32_t index); }; -inline UClassID -Transliterator::getStaticClassID(void) -{ return (UClassID)&fgClassID; } - inline int32_t Transliterator::getMaximumContextLength(void) const { return maximumContextLength; } inline void Transliterator::setID(const UnicodeString& id) { ID = id; + // NUL-terminate the ID string + ID.getTerminatedBuffer(); } inline Transliterator::Token Transliterator::integerToken(int32_t i) { diff --git a/icuSources/i18n/unicode/ucal.h b/icuSources/i18n/unicode/ucal.h index a492dc41..8bde9109 100644 --- a/icuSources/i18n/unicode/ucal.h +++ b/icuSources/i18n/unicode/ucal.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 1996-2003, International Business Machines Corporation and others. All Rights Reserved. +* Copyright (C) 1996-2004, International Business Machines Corporation and others. All Rights Reserved. ******************************************************************************* */ @@ -8,6 +8,7 @@ #include "unicode/utypes.h" #include "unicode/uenum.h" +#include "unicode/uloc.h" #if !UCONFIG_NO_FORMATTING @@ -26,7 +27,7 @@ * *

      * Types of UCalendar interpret a UDate - * according to the rules of a specific calendar system. The U_CAPI + * according to the rules of a specific calendar system. The U_STABLE * provides the enum UCalendarType with UCAL_TRADITIONAL and * UCAL_GREGORIAN. *

      @@ -35,7 +36,7 @@ * UCalendar whose time fields have been initialized * with the current date and time. We need to specify the type of * calendar to be opened and the timezoneId. - *

      + * \htmlonly
      \endhtmlonly *
        * \code
        * UCalendar *caldef;
      @@ -46,7 +47,7 @@
        * caldef=ucal_open(tzID, u_strlen(tzID), NULL, UCAL_TRADITIONAL, &status);
        * \endcode
        * 
      - *
      + * \htmlonly
      \endhtmlonly * *

      * A UCalendar object can produce all the time field values @@ -73,7 +74,7 @@ * combinations of fields. The most recent combination, as determined by the * most recently set single field, will be used. * - *

      + * \htmlonly
      \endhtmlonly *
        * \code
        * UCAL_MONTH + UCAL_DAY_OF_MONTH
      @@ -83,18 +84,18 @@
        * UCAL_DAY_OF_WEEK + UCAL_WEEK_OF_YEAR
        * \endcode
        * 
      - *
      + * \htmlonly
      \endhtmlonly * * For the time of day: * - *
      + * \htmlonly
      \endhtmlonly *
        * \code
        * UCAL_HOUR_OF_DAY
        * UCAL_AM_PM + UCAL_HOUR
        * \endcode
        * 
      - *
      + * \htmlonly
      \endhtmlonly * *

      * Note: for some non-Gregorian calendars, different @@ -159,46 +160,136 @@ typedef enum UCalendarType UCalendarType; * @stable ICU 2.0 */ enum UCalendarDateFields { - /** Era field */ + /** + * Era field + * @stable ICU 2.6 + */ UCAL_ERA, - /** Year field */ + /** + * Year field + * @stable ICU 2.6 + */ UCAL_YEAR, - /** Month field */ + /** + * Month field + * @stable ICU 2.6 + */ UCAL_MONTH, - /** Week of year field */ + /** + * Week of year field + * @stable ICU 2.6 + */ UCAL_WEEK_OF_YEAR, - /** Week of month field */ + /** + * Week of month field + * @stable ICU 2.6 + */ UCAL_WEEK_OF_MONTH, - /** Date field */ + /** + * Date field + * @stable ICU 2.6 + */ UCAL_DATE, - /** Day of year field */ + /** + * Day of year field + * @stable ICU 2.6 + */ UCAL_DAY_OF_YEAR, - /** Day of week field */ + /** + * Day of week field + * @stable ICU 2.6 + */ UCAL_DAY_OF_WEEK, - /** Day of week in month field */ + /** + * Day of week in month field + * @stable ICU 2.6 + */ UCAL_DAY_OF_WEEK_IN_MONTH, - /** AM/PM field */ + /** + * AM/PM field + * @stable ICU 2.6 + */ UCAL_AM_PM, - /** Hour field */ + /** + * Hour field + * @stable ICU 2.6 + */ UCAL_HOUR, - /** Hour of day field */ + /** + * Hour of day field + * @stable ICU 2.6 + */ UCAL_HOUR_OF_DAY, - /** Minute field */ + /** + * Minute field + * @stable ICU 2.6 + */ UCAL_MINUTE, - /** Second field */ + /** + * Second field + * @stable ICU 2.6 + */ UCAL_SECOND, - /** Millisecond field */ + /** + * Millisecond field + * @stable ICU 2.6 + */ UCAL_MILLISECOND, - /** Zone offset field */ + /** + * Zone offset field + * @stable ICU 2.6 + */ UCAL_ZONE_OFFSET, - /** DST offset field */ + /** + * DST offset field + * @stable ICU 2.6 + */ UCAL_DST_OFFSET, - /** Year / week of year */ + /** + * Year / week of year + * @stable ICU 2.6 + */ UCAL_YEAR_WOY, - /** Day of week, localized (1..7) */ + /** + * Day of week, localized (1..7) + * @stable ICU 2.6 + */ +#ifndef U_HIDE_DRAFT_API + UCAL_DOW_LOCAL, - /** Field count */ - UCAL_FIELD_COUNT + /** + * Year of this calendar system, encompassing all supra-year fields. For example, in Gregorian/Julian calendars, positive Extended Year values indicate years AD, 1 BC = 0 extended, 2 BC = -1 extended, and so on. + * @draft ICU 2.8 + */ + UCAL_EXTENDED_YEAR, + /** + * Modified Julian day number, encompassing all date-related fields. Demarcates at local midnight. + * @draft ICU 2.8 + */ + UCAL_JULIAN_DAY, + /** + * Ranges from 0 to 23:59:59.999 (regardless of DST). This field behaves exactly like a composite of all time-related fields, not including the zone fields. As such, it also reflects discontinuities of those fields on DST transition days. On a day of DST onset, it will jump forward. On a day of DST cessation, it will jump backward. This reflects the fact that is must be combined with the DST_OFFSET field to obtain a unique local time value. + * @draft ICU 2.8 + */ + UCAL_MILLISECONDS_IN_DAY, + +#endif /* U_HIDE_DRAFT_API */ + + /** + * Field count + * @stable ICU 2.6 + */ + UCAL_FIELD_COUNT, + +#ifndef U_HIDE_DRAFT_API + + /** + * Synonym for UCAL_DATE + * @draft ICU 2.8 + **/ + UCAL_DAY_OF_MONTH=UCAL_DATE + +#endif /*U_HIDE_DRAFT_API*/ }; /** @stable ICU 2.0 */ @@ -288,9 +379,9 @@ typedef enum UCalendarAMPMs UCalendarAMPMs; * uenum_close(), or NULL upon failure. In case of failure *ec will * indicate the error. * - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI UEnumeration* U_EXPORT2 +U_DRAFT UEnumeration* U_EXPORT2 ucal_openTimeZones(UErrorCode* ec); /** @@ -307,9 +398,9 @@ ucal_openTimeZones(UErrorCode* ec); * uenum_close(), or NULL upon failure. In case of failure *ec will * indicate the error. * - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI UEnumeration* U_EXPORT2 +U_DRAFT UEnumeration* U_EXPORT2 ucal_openCountryTimeZones(const char* country, UErrorCode* ec); /** @@ -326,9 +417,9 @@ ucal_openCountryTimeZones(const char* country, UErrorCode* ec); * @return The result string length, not including the terminating * null * - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI int32_t U_EXPORT2 +U_DRAFT int32_t U_EXPORT2 ucal_getDefaultTimeZone(UChar* result, int32_t resultCapacity, UErrorCode* ec); /** @@ -338,9 +429,9 @@ ucal_getDefaultTimeZone(UChar* result, int32_t resultCapacity, UErrorCode* ec); * * @param ec input/output error code * - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI void U_EXPORT2 +U_DRAFT void U_EXPORT2 ucal_setDefaultTimeZone(const UChar* zoneID, UErrorCode* ec); /** @@ -357,9 +448,9 @@ ucal_setDefaultTimeZone(const UChar* zoneID, UErrorCode* ec); * effect. This is always a non-negative number, most commonly either * 3,600,000 (one hour) or zero. * - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI int32_t U_EXPORT2 +U_DRAFT int32_t U_EXPORT2 ucal_getDSTSavings(const UChar* zoneID, UErrorCode* ec); /** @@ -368,7 +459,7 @@ ucal_getDSTSavings(const UChar* zoneID, UErrorCode* ec); * @return The current date and time. * @stable ICU 2.0 */ -U_CAPI UDate U_EXPORT2 +U_STABLE UDate U_EXPORT2 ucal_getNow(void); /** @@ -383,7 +474,7 @@ ucal_getNow(void); * @return A pointer to a UCalendar, or 0 if an error occurred. * @stable ICU 2.0 */ -U_CAPI UCalendar* U_EXPORT2 +U_STABLE UCalendar* U_EXPORT2 ucal_open(const UChar* zoneID, int32_t len, const char* locale, @@ -396,7 +487,7 @@ ucal_open(const UChar* zoneID, * @param cal The UCalendar to close. * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucal_close(UCalendar *cal); /** @@ -408,7 +499,7 @@ ucal_close(UCalendar *cal); * @param status A pointer to an UErrorCode to receive any errors. * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucal_setTimeZone(UCalendar* cal, const UChar* zoneID, int32_t len, @@ -445,7 +536,7 @@ typedef enum UCalendarDisplayNameType UCalendarDisplayNameType; * @return The total buffer size needed; if greater than resultLength, the output was truncated. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucal_getTimeZoneDisplayName(const UCalendar* cal, UCalendarDisplayNameType type, const char* locale, @@ -461,7 +552,7 @@ ucal_getTimeZoneDisplayName(const UCalendar* cal, * @return TRUE if cal is currently in daylight savings time, FALSE otherwise * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 ucal_inDaylightTime(const UCalendar* cal, UErrorCode* status ); @@ -492,7 +583,7 @@ typedef enum UCalendarAttribute UCalendarAttribute; * @see ucal_setAttribute * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucal_getAttribute(const UCalendar* cal, UCalendarAttribute attr); @@ -507,7 +598,7 @@ ucal_getAttribute(const UCalendar* cal, * @see ucal_getAttribute * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucal_setAttribute(UCalendar* cal, UCalendarAttribute attr, int32_t newValue); @@ -521,18 +612,18 @@ ucal_setAttribute(UCalendar* cal, * @see ucal_countAvailable * @stable ICU 2.0 */ -U_CAPI const char* U_EXPORT2 +U_STABLE const char* U_EXPORT2 ucal_getAvailable(int32_t index); /** * Determine how many locales have calendars available. * This function is most useful as determining the loop ending condition for - * calls to \Ref{ucal_getAvailable}. + * calls to \ref ucal_getAvailable. * @return The number of locales for which calendars are available. * @see ucal_getAvailable * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucal_countAvailable(void); /** @@ -546,7 +637,7 @@ ucal_countAvailable(void); * @see ucal_setDateTime * @stable ICU 2.0 */ -U_CAPI UDate U_EXPORT2 +U_STABLE UDate U_EXPORT2 ucal_getMillis(const UCalendar* cal, UErrorCode* status); @@ -561,7 +652,7 @@ ucal_getMillis(const UCalendar* cal, * @see ucal_setDateTime * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucal_setMillis(UCalendar* cal, UDate dateTime, UErrorCode* status ); @@ -580,7 +671,7 @@ ucal_setMillis(UCalendar* cal, * @see ucal_setDateTime * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucal_setDate(UCalendar* cal, int32_t year, int32_t month, @@ -604,7 +695,7 @@ ucal_setDate(UCalendar* cal, * @see ucal_setDate * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucal_setDateTime(UCalendar* cal, int32_t year, int32_t month, @@ -623,7 +714,7 @@ ucal_setDateTime(UCalendar* cal, * @return TRUE if cal1 and cal2 are equivalent, FALSE otherwise. * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 ucal_equivalentTo(const UCalendar* cal1, const UCalendar* cal2); @@ -642,7 +733,7 @@ ucal_equivalentTo(const UCalendar* cal1, * @see ucal_roll * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucal_add(UCalendar* cal, UCalendarDateFields field, int32_t amount, @@ -663,7 +754,7 @@ ucal_add(UCalendar* cal, * @see ucal_add * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucal_roll(UCalendar* cal, UCalendarDateFields field, int32_t amount, @@ -685,7 +776,7 @@ ucal_roll(UCalendar* cal, * @see ucal_clear * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucal_get(const UCalendar* cal, UCalendarDateFields field, UErrorCode* status ); @@ -705,7 +796,7 @@ ucal_get(const UCalendar* cal, * @see ucal_clear * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucal_set(UCalendar* cal, UCalendarDateFields field, int32_t value); @@ -725,7 +816,7 @@ ucal_set(UCalendar* cal, * @see ucal_clear * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 ucal_isSet(const UCalendar* cal, UCalendarDateFields field); @@ -743,7 +834,7 @@ ucal_isSet(const UCalendar* cal, * @see ucal_clear * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucal_clearField(UCalendar* cal, UCalendarDateFields field); @@ -757,7 +848,7 @@ ucal_clearField(UCalendar* cal, * @see ucal_clearField * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucal_clear(UCalendar* calendar); /** @@ -796,12 +887,13 @@ typedef enum UCalendarLimitType UCalendarLimitType; * @return The requested value. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucal_getLimit(const UCalendar* cal, UCalendarDateFields field, UCalendarLimitType type, UErrorCode* status); +#ifdef U_USE_UCAL_OBSOLETE_2_8 /** * Get an available TimeZone ID. * A Timezone ID is a string of the form "America/Los Angeles". @@ -812,7 +904,7 @@ ucal_getLimit(const UCalendar* cal, * @see ucal_countAvailableTZIDs * @obsolete ICU 2.8. Use ucal_openTimeZoneEnumeration instead since this API will be removed in that release. */ -U_CAPI const UChar* U_EXPORT2 +U_OBSOLETE const UChar* U_EXPORT2 ucal_getAvailableTZIDs(int32_t rawOffset, int32_t index, UErrorCode* status); @@ -820,14 +912,25 @@ ucal_getAvailableTZIDs(int32_t rawOffset, /** * Determine how many TimeZones exist with a certain offset. * This function is most useful as determining the loop ending condition for - * calls to \Ref{ucal_getAvailableTZIDs}. + * calls to \ref ucal_getAvailableTZIDs. * @param rawOffset The desired GMT offset. * @return The number of TimeZones with rawOffset. * @see ucal_getAvailableTZIDs * @obsolete ICU 2.8. Use ucal_openTimeZoneEnumeration instead since this API will be removed in that release. */ -U_CAPI int32_t U_EXPORT2 +U_OBSOLETE int32_t U_EXPORT2 ucal_countAvailableTZIDs(int32_t rawOffset); +#endif + +/** Get the locale for this calendar object. You can choose between valid and actual locale. + * @param cal The calendar object + * @param type type of the locale we're looking for (valid or actual) + * @param status error code for the operation + * @return the locale name + * @draft ICU 2.8 likely to change in ICU 3.0, based on feedback + */ +U_DRAFT const char * U_EXPORT2 +ucal_getLocaleByType(const UCalendar *cal, ULocDataLocaleType type, UErrorCode* status); #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/i18n/unicode/ucol.h b/icuSources/i18n/unicode/ucol.h index 8820cbab..7ef0cb62 100644 --- a/icuSources/i18n/unicode/ucol.h +++ b/icuSources/i18n/unicode/ucol.h @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (c) 1996-2003, International Business Machines Corporation and others. +* Copyright (c) 1996-2004, International Business Machines Corporation and others. * All Rights Reserved. ******************************************************************************* */ @@ -252,7 +252,7 @@ typedef enum { * Open a UCollator for comparing strings. * The UCollator pointer is used in all the calls to the Collation * service. After finished, collator must be disposed of by calling - * \Ref{ucol_close}. + * {@link #ucol_close }. * @param loc The locale containing the required collation rules. * Special values for locales can be passed in - * if NULL is passed for the locale, the default locale @@ -265,14 +265,14 @@ typedef enum { * @see ucol_close * @stable ICU 2.0 */ -U_CAPI UCollator* U_EXPORT2 +U_STABLE UCollator* U_EXPORT2 ucol_open(const char *loc, UErrorCode *status); /** * Produce an UCollator instance according to the rules supplied. * The rules are used to change the default ordering, defined in the * UCA in a process called tailoring. The resulting UCollator pointer - * can be used in the same way as the one obtained by \Ref{ucol_strcoll}. + * can be used in the same way as the one obtained by {@link #ucol_strcoll }. * @param rules A string describing the collation rules. For the syntax * of the rules please see users guide. * @param rulesLength The length of rules, or -1 if null-terminated. @@ -293,7 +293,7 @@ ucol_open(const char *loc, UErrorCode *status); * @see ucol_close * @stable ICU 2.0 */ -U_CAPI UCollator* U_EXPORT2 +U_STABLE UCollator* U_EXPORT2 ucol_openRules( const UChar *rules, int32_t rulesLength, UColAttributeValue normalizationMode, @@ -301,6 +301,65 @@ ucol_openRules( const UChar *rules, UParseError *parseError, UErrorCode *status); +/** + * Open a collator defined by a short form string. + * The structure and the syntax of the string is defined in the "Naming collators" + * section of the users guide: + * http://oss.software.ibm.com/icu/userguide/Collate_Concepts.html#Naming_Collators + * Attributes are overriden by the subsequent attributes. So, for "S2_S3", final + * strength will be 3. 3066bis locale overrides individual locale parts. + * The call to this function is equivalent to a call to ucol_open, followed by a + * series of calls to ucol_setAttribute and ucol_setVariableTop. + * @param definition A short string containing a locale and a set of attributes. + * Attributes not explicitly mentioned are left at the default + * state for a locale. + * @param parseError if not NULL, structure that will get filled with error's pre + * and post context in case of error. + * @param forceDefaults if FALSE, the settings that are the same as the collator + * default settings will not be applied (for example, setting + * French secondary on a French collator would not be executed). + * If TRUE, all the settings will be applied regardless of the + * collator default value. If the definition + * strings are to be cached, should be set to FALSE. + * @param status Error code. Apart from regular error conditions connected to + * instantiating collators (like out of memory or similar), this + * API will return an error if an invalid attribute or attribute/value + * combination is specified. + * @return A pointer to a UCollator or 0 if an error occured (including an + * invalid attribute). + * @see ucol_open + * @see ucol_setAttribute + * @see ucol_setVariableTop + * @see ucol_getShortDefinitionString + * @see ucol_normalizeShortDefinitionString + * @draft ICU 3.0 + * + */ +U_CAPI UCollator* U_EXPORT2 +ucol_openFromShortString( const char *definition, + UBool forceDefaults, + UParseError *parseError, + UErrorCode *status); + +/** + * Get a set containing the contractions defined by the collator. The set includes + * both the UCA contractions and the contractions defined by the collator. This set + * will contain only strings. If a tailoring explicitly suppresses contractions from + * the UCA (like Russian), removed contractions will not be in the resulting set. + * @param coll collator + * @param conts the set to hold the result. It gets emptied before + * contractions are added. + * @param status to hold the error code + * @return the size of the contraction set + * + * @draft ICU 3.0 + */ +U_CAPI int32_t U_EXPORT2 +ucol_getContractions( const UCollator *coll, + USet *conts, + UErrorCode *status); + + /** * Close a UCollator. * Once closed, a UCollator should not be used.\ Every open collator should @@ -311,7 +370,7 @@ ucol_openRules( const UChar *rules, * @see ucol_safeClone * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucol_close(UCollator *coll); /** @@ -329,7 +388,7 @@ ucol_close(UCollator *coll); * @see ucol_equal * @stable ICU 2.0 */ -U_CAPI UCollationResult U_EXPORT2 +U_STABLE UCollationResult U_EXPORT2 ucol_strcoll( const UCollator *coll, const UChar *source, int32_t sourceLength, @@ -338,7 +397,7 @@ ucol_strcoll( const UCollator *coll, /** * Determine if one string is greater than another. - * This function is equivalent to \Ref{ucol_strcoll} == UCOL_GREATER + * This function is equivalent to {@link #ucol_strcoll } == UCOL_GREATER * @param coll The UCollator containing the comparison rules. * @param source The source string. * @param sourceLength The length of source, or -1 if null-terminated. @@ -350,14 +409,14 @@ ucol_strcoll( const UCollator *coll, * @see ucol_equal * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 ucol_greater(const UCollator *coll, const UChar *source, int32_t sourceLength, const UChar *target, int32_t targetLength); /** * Determine if one string is greater than or equal to another. - * This function is equivalent to \Ref{ucol_strcoll} != UCOL_LESS + * This function is equivalent to {@link #ucol_strcoll } != UCOL_LESS * @param coll The UCollator containing the comparison rules. * @param source The source string. * @param sourceLength The length of source, or -1 if null-terminated. @@ -369,14 +428,14 @@ ucol_greater(const UCollator *coll, * @see ucol_equal * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 ucol_greaterOrEqual(const UCollator *coll, const UChar *source, int32_t sourceLength, const UChar *target, int32_t targetLength); /** * Compare two strings for equality. - * This function is equivalent to \Ref{ucol_strcoll} == UCOL_EQUAL + * This function is equivalent to {@link #ucol_strcoll } == UCOL_EQUAL * @param coll The UCollator containing the comparison rules. * @param source The source string. * @param sourceLength The length of source, or -1 if null-terminated. @@ -388,7 +447,7 @@ ucol_greaterOrEqual(const UCollator *coll, * @see ucol_greaterOrEqual * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 ucol_equal(const UCollator *coll, const UChar *source, int32_t sourceLength, const UChar *target, int32_t targetLength); @@ -403,9 +462,9 @@ ucol_equal(const UCollator *coll, * UCOL_GREATER, UCOL_LESS * @param status A pointer to an UErrorCode to receive any errors * @see ucol_strcoll - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI UCollationResult U_EXPORT2 +U_STABLE UCollationResult U_EXPORT2 ucol_strcollIter( const UCollator *coll, UCharIterator *sIter, UCharIterator *tIter, @@ -420,7 +479,7 @@ ucol_strcollIter( const UCollator *coll, * @see ucol_setStrength * @stable ICU 2.0 */ -U_CAPI UCollationStrength U_EXPORT2 +U_STABLE UCollationStrength U_EXPORT2 ucol_getStrength(const UCollator *coll); /** @@ -432,7 +491,7 @@ ucol_getStrength(const UCollator *coll); * @see ucol_getStrength * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucol_setStrength(UCollator *coll, UCollationStrength strength); @@ -448,7 +507,7 @@ ucol_setStrength(UCollator *coll, * the output was truncated. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucol_getDisplayName( const char *objLoc, const char *dispLoc, UChar *result, @@ -464,20 +523,94 @@ ucol_getDisplayName( const char *objLoc, * @see ucol_countAvailable * @stable ICU 2.0 */ -U_CAPI const char* U_EXPORT2 +U_STABLE const char* U_EXPORT2 ucol_getAvailable(int32_t index); /** * Determine how many locales have collation rules available. * This function is most useful as determining the loop ending condition for - * calls to \Ref{ucol_getAvailable}. + * calls to {@link #ucol_getAvailable }. * @return The number of locales for which collation rules are available. * @see ucol_getAvailable * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucol_countAvailable(void); +#if !UCONFIG_NO_SERVICE +/** + * Create a string enumerator of all locales for which a valid + * collator may be opened. + * @param status input-output error code + * @return a string enumeration over locale strings. The caller is + * responsible for closing the result. + * @draft ICU 3.0 + */ +U_DRAFT UEnumeration* U_EXPORT2 +ucol_openAvailableLocales(UErrorCode *status); +#endif + +/** + * Create a string enumerator of all possible keywords that are relevant to + * collation. At this point, the only recognized keyword for this + * service is "collation". + * @param status input-output error code + * @return a string enumeration over locale strings. The caller is + * responsible for closing the result. + * @draft ICU 3.0 + */ +U_DRAFT UEnumeration* U_EXPORT2 +ucol_getKeywords(UErrorCode *status); + +/** + * Given a keyword, create a string enumeration of all values + * for that keyword that are currently in use. + * @param keyword a particular keyword as enumerated by + * ucol_getKeywords. If any other keyword is passed in, *status is set + * to U_ILLEGAL_ARGUMENT_ERROR. + * @param status input-output error code + * @return a string enumeration over collation keyword values, or NULL + * upon error. The caller is responsible for closing the result. + * @draft ICU 3.0 + */ +U_DRAFT UEnumeration* U_EXPORT2 +ucol_getKeywordValues(const char *keyword, UErrorCode *status); + +/** + * Return the functionally equivalent locale for the given + * requested locale, with respect to given keyword, for the + * collation service. If two locales return the same result, then + * collators instantiated for these locales will behave + * equivalently. The converse is not always true; two collators + * may in fact be equivalent, but return different results, due to + * internal details. The return result has no other meaning than + * that stated above, and implies nothing as to the relationship + * between the two locales. This is intended for use by + * applications who wish to cache collators, or otherwise reuse + * collators when possible. The functional equivalent may change + * over time. For more information, please see the + * Locales and Services section of the ICU User Guide. + * @param result fillin for the functionally equivalent locale + * @param resultCapacity capacity of the fillin buffer + * @param keyword a particular keyword as enumerated by + * ucol_getKeywords. + * @param locale the requested locale + * @param isAvailable if non-NULL, pointer to a fillin parameter that + * indicates whether the requested locale was 'available' to the + * collation service. A locale is defined as 'available' if it + * physically exists within the collation locale data. + * @param status pointer to input-output error code + * @return the actual buffer size needed for the locale. If greater + * than resultCapacity, the returned full name will be truncated and + * an error code will be returned. + * @draft ICU 3.0 + */ +U_DRAFT int32_t U_EXPORT2 +ucol_getFunctionalEquivalent(char* result, int32_t resultCapacity, + const char* keyword, const char* locale, + UBool* isAvailable, UErrorCode* status); + /** * Get the collation rules from a UCollator. * The rules will follow the rule syntax. @@ -486,10 +619,65 @@ ucol_countAvailable(void); * @return The collation rules. * @stable ICU 2.0 */ -U_CAPI const UChar* U_EXPORT2 +U_STABLE const UChar* U_EXPORT2 ucol_getRules( const UCollator *coll, int32_t *length); +/** Get the short definition string for a collator. This API harvests the collator's + * locale and the attribute set and produces a string that can be used for opening + * a collator with the same properties using the ucol_openFromShortString API. + * This string will be normalized. + * The structure and the syntax of the string is defined in the "Naming collators" + * section of the users guide: + * http://oss.software.ibm.com/icu/userguide/Collate_Concepts.html#Naming_Collators + * This API supports preflighting. + * @param coll a collator + * @param locale a locale that will appear as a collators locale in the resulting + * short string definition. If NULL, the locale will be harvested + * from the collator. + * @param buffer space to hold the resulting string + * @param capacity capacity of the buffer + * @param status for returning errors. All the preflighting errors are featured + * @return length of the resulting string + * @see ucol_openFromShortString + * @see ucol_normalizeShortDefinitionString + * @draft ICU 3.0 + */ +U_CAPI int32_t U_EXPORT2 +ucol_getShortDefinitionString(const UCollator *coll, + const char *locale, + char *buffer, + int32_t capacity, + UErrorCode *status); + +/** Verifies and normalizes short definition string. + * Normalized short definition string has all the option sorted by the argument name, + * so that equivalent definition strings are the same. + * This API supports preflighting. + * @param source definition string + * @param destination space to hold the resulting string + * @param capacity capacity of the buffer + * @param parseError if not NULL, structure that will get filled with error's pre + * and post context in case of error. + * @param status Error code. This API will return an error if an invalid attribute + * or attribute/value combination is specified. All the preflighting + * errors are also featured + * @return length of the resulting normalized string. + * + * @see ucol_openFromShortString + * @see ucol_getShortDefinitionString + * + * @draft ICU 3.0 + */ + +U_CAPI int32_t U_EXPORT2 +ucol_normalizeShortDefinitionString(const char *source, + char *destination, + int32_t capacity, + UParseError *parseError, + UErrorCode *status); + + /** * Get a sort key for a string from a UCollator. * Sort keys may be compared using strcmp. @@ -502,7 +690,7 @@ ucol_getRules( const UCollator *coll, * @see ucol_keyHashCode * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucol_getSortKey(const UCollator *coll, const UChar *source, int32_t sourceLength, @@ -528,9 +716,9 @@ ucol_getSortKey(const UCollator *coll, * @return the actual number of bytes of a sortkey. It can be * smaller than count if we have reached the end of * the sort key. - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucol_nextSortKeyPart(const UCollator *coll, UCharIterator *iter, uint32_t state[2], @@ -591,7 +779,7 @@ typedef enum { * @see ucol_keyHashCode * @stable ICU 2.1 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucol_getBound(const uint8_t *source, int32_t sourceLength, UColBoundMode boundType, @@ -608,9 +796,18 @@ ucol_getBound(const uint8_t *source, * @param info the version # information, the result will be filled in * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucol_getVersion(const UCollator* coll, UVersionInfo info); +/** + * Gets the UCA version information for a Collator. Version is the + * UCA version number (3.1.1, 4.0). + * @param coll The UCollator to query. + * @param info the version # information, the result will be filled in + * @draft ICU 2.8 + */ +U_DRAFT void U_EXPORT2 +ucol_getUCAVersion(const UCollator* coll, UVersionInfo info); /** * Merge two sort keys. The levels are merged with their corresponding counterparts @@ -634,7 +831,7 @@ ucol_getVersion(const UCollator* coll, UVersionInfo info); * src1Length+src2Length-1 * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucol_mergeSortkeys(const uint8_t *src1, int32_t src1Length, const uint8_t *src2, int32_t src2Length, uint8_t *dest, int32_t destCapacity); @@ -650,7 +847,7 @@ ucol_mergeSortkeys(const uint8_t *src1, int32_t src1Length, * @see ucol_getAttribute * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucol_setAttribute(UCollator *coll, UColAttribute attr, UColAttributeValue value, UErrorCode *status); /** @@ -664,7 +861,7 @@ ucol_setAttribute(UCollator *coll, UColAttribute attr, UColAttributeValue value, * @see ucol_setAttribute * @stable ICU 2.0 */ -U_CAPI UColAttributeValue U_EXPORT2 +U_STABLE UColAttributeValue U_EXPORT2 ucol_getAttribute(const UCollator *coll, UColAttribute attr, UErrorCode *status); /** Variable top @@ -686,7 +883,7 @@ ucol_getAttribute(const UCollator *coll, UColAttribute attr, UErrorCode *status) * @see ucol_restoreVariableTop * @stable ICU 2.0 */ -U_CAPI uint32_t U_EXPORT2 +U_STABLE uint32_t U_EXPORT2 ucol_setVariableTop(UCollator *coll, const UChar *varTop, int32_t len, UErrorCode *status); @@ -702,7 +899,7 @@ ucol_setVariableTop(UCollator *coll, * @see ucol_restoreVariableTop * @stable ICU 2.0 */ -U_CAPI uint32_t U_EXPORT2 ucol_getVariableTop(const UCollator *coll, UErrorCode *status); +U_STABLE uint32_t U_EXPORT2 ucol_getVariableTop(const UCollator *coll, UErrorCode *status); /** * Sets the variable top to a collation element value supplied. Variable top is @@ -715,7 +912,7 @@ U_CAPI uint32_t U_EXPORT2 ucol_getVariableTop(const UCollator *coll, UErrorCode * @see ucol_setVariableTop * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucol_restoreVariableTop(UCollator *coll, const uint32_t varTop, UErrorCode *status); /** @@ -740,7 +937,7 @@ ucol_restoreVariableTop(UCollator *coll, const uint32_t varTop, UErrorCode *stat * @see ucol_close * @stable ICU 2.0 */ -U_CAPI UCollator* U_EXPORT2 +U_STABLE UCollator* U_EXPORT2 ucol_safeClone(const UCollator *coll, void *stackBuffer, int32_t *pBufferSize, @@ -762,7 +959,7 @@ ucol_safeClone(const UCollator *coll, * @return current rules * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucol_getRulesEx(const UCollator *coll, UColRuleOption delta, UChar *buffer, int32_t bufferLen); /** @@ -777,12 +974,29 @@ ucol_getRulesEx(const UCollator *coll, UColRuleOption delta, UChar *buffer, int3 * @return real locale name from which the collation data comes. * If the collator was instantiated from rules, returns * NULL. - * @stable ICU 2.1 + * @deprecated ICU 2.8 Use ucol_getLocaleByType instead */ -U_CAPI const char * U_EXPORT2 +U_DEPRECATED const char * U_EXPORT2 ucol_getLocale(const UCollator *coll, ULocDataLocaleType type, UErrorCode *status); +/** + * gets the locale name of the collator. If the collator + * is instantiated from the rules, then this function returns + * NULL. + * @param coll The UCollator for which the locale is needed + * @param type You can choose between requested, valid and actual + * locale. For description see the definition of + * ULocDataLocaleType in uloc.h + * @param status error code of the operation + * @return real locale name from which the collation data comes. + * If the collator was instantiated from rules, returns + * NULL. + * @draft ICU 2.8 likely to change in ICU 3.0, based on feedback + */ +U_DRAFT const char * U_EXPORT2 +ucol_getLocaleByType(const UCollator *coll, ULocDataLocaleType type, UErrorCode *status); + /** * Get an Unicode set that contains all the characters and sequences tailored in * this collator. The result must be disposed of by using uset_close. @@ -791,11 +1005,179 @@ ucol_getLocale(const UCollator *coll, ULocDataLocaleType type, UErrorCode *statu * @return a pointer to newly created USet. Must be be disposed by using uset_close * @see ucol_openRules * @see uset_close - * @draft ICU 2.4 + * @stable ICU 2.4 */ -U_CAPI USet * U_EXPORT2 +U_STABLE USet * U_EXPORT2 ucol_getTailoredSet(const UCollator *coll, UErrorCode *status); +/** + * Returned by ucol_collatorToIdentifier to signify that collator is + * not encodable as an identifier. + * @internal ICU 3.0 + */ +#define UCOL_SIT_COLLATOR_NOT_ENCODABLE 0x80000000 + +/** + * Get a 31-bit identifier given a collator. + * @param coll UCollator + * @param locale a locale that will appear as a collators locale in the resulting + * short string definition. If NULL, the locale will be harvested + * from the collator. + * @param status holds error messages + * @return 31-bit identifier. MSB is used if the collator cannot be encoded. In that + * case UCOL_SIT_COLLATOR_NOT_ENCODABLE is returned + * @see ucol_openFromIdentifier + * @see ucol_identifierToShortString + * @internal ICU 3.0 + */ +U_INTERNAL uint32_t U_EXPORT2 +ucol_collatorToIdentifier(const UCollator *coll, + const char *locale, + UErrorCode *status); + +/** + * Open a collator given a 31-bit identifier + * @param identifier 31-bit identifier, encoded by calling ucol_collatorToIdentifier + * @param forceDefaults if FALSE, the settings that are the same as the collator + * default settings will not be applied (for example, setting + * French secondary on a French collator would not be executed). + * If TRUE, all the settings will be applied regardless of the + * collator default value. If the definition + * strings that can be produced from a collator instantiated by + * calling this API are to be cached, should be set to FALSE. + * @param status for returning errors + * @return UCollator object + * @see ucol_collatorToIdentifier + * @see ucol_identifierToShortString + * @internal ICU 3.0 + */ +U_INTERNAL UCollator* U_EXPORT2 +ucol_openFromIdentifier(uint32_t identifier, + UBool forceDefaults, + UErrorCode *status); + + +/** + * Calculate the short definition string given an identifier. Supports preflighting. + * @param identifier 31-bit identifier, encoded by calling ucol_collatorToIdentifier + * @param buffer buffer to store the result + * @param capacity buffer capacity + * @param forceDefaults whether the settings that are the same as the default setting + * should be forced anyway. Setting this argument to FALSE reduces + * the number of different configurations, but decreases performace + * as a collator has to be instantiated. + * @param status for returning errors + * @return length of the short definition string + * @see ucol_collatorToIdentifier + * @see ucol_openFromIdentifier + * @see ucol_shortStringToIdentifier + * @internal ICU 3.0 + */ +U_INTERNAL int32_t U_EXPORT2 +ucol_identifierToShortString(uint32_t identifier, + char *buffer, + int32_t capacity, + UBool forceDefaults, + UErrorCode *status); + +/** + * Calculate the identifier given a short definition string. Supports preflighting. + * @param definition short string definition + * @param forceDefaults whether the settings that are the same as the default setting + * should be forced anyway. Setting this argument to FALSE reduces + * the number of different configurations, but decreases performace + * as a collator has to be instantiated. + * @param status for returning errors + * @return identifier + * @see ucol_collatorToIdentifier + * @see ucol_openFromIdentifier + * @see ucol_identifierToShortString + * @internal ICU 3.0 + */ +U_INTERNAL uint32_t U_EXPORT2 +ucol_shortStringToIdentifier(const char *definition, + UBool forceDefaults, + UErrorCode *status); + + + +/** + * Universal attribute getter that returns UCOL_DEFAULT if the value is default + * @param coll collator which attributes are to be changed + * @param attr attribute type + * @return attribute value or UCOL_DEFAULT if the value is default + * @param status to indicate whether the operation went on smoothly or there were errors + * @see UColAttribute + * @see UColAttributeValue + * @see ucol_setAttribute + * @internal ICU 3.0 + */ +U_INTERNAL UColAttributeValue U_EXPORT2 +ucol_getAttributeOrDefault(const UCollator *coll, UColAttribute attr, UErrorCode *status); + +/** Check whether two collators are equal. Collators are considered equal if they + * will sort strings the same. This means that both the current attributes and the + * rules must be equivalent. Currently used for RuleBasedCollator::operator==. + * @param source first collator + * @param target second collator + * @return TRUE or FALSE + * @internal ICU 3.0 + */ +U_INTERNAL UBool U_EXPORT2 +ucol_equals(const UCollator *source, const UCollator *target); + +/** Calculates the set of unsafe code points, given a collator. + * @param coll Collator + * @param unsafe a fill-in set to receive the unsafe points + * @param status for catching errors + * @return number of elements in the set + * @internal ICU 3.0 + */ +U_INTERNAL int32_t U_EXPORT2 +ucol_getUnsafeSet( const UCollator *coll, + USet *unsafe, + UErrorCode *status); + +/** Creates a binary image of a collator. This binary image can be stored and + * later used to instantiate a collator using ucol_openBinary. + * This API supports preflighting. + * @param coll Collator + * @param buffer a fill-in buffer to receive the binary image + * @param capacity capacity of the destination buffer + * @param status for catching errors + * @return size of the image + * @see ucol_openBinary + * @draft ICU 3.2 + */ +U_DRAFT int32_t U_EXPORT2 +ucol_cloneBinary(const UCollator *coll, + uint8_t *buffer, int32_t capacity, + UErrorCode *status); + +/** Opens a collator from a collator binary image created using + * ucol_cloneBinary. Binary image used in instantiation of the + * collator remains owned by the user and should stay around for + * the lifetime of the collator. The API also takes a base collator + * which usualy should be UCA. + * @param bin binary image owned by the user and required through the + * lifetime of the collator + * @param length size of the image. If negative, the API will try to + * figure out the length of the image + * @param base fallback collator, usually UCA. Base is required to be + * present through the lifetime of the collator. Currently + * it cannot be NULL. + * @param status for catching errors + * @return newly created collator + * @see ucol_cloneBinary + * @draft ICU 3.2 + */ +U_DRAFT UCollator* U_EXPORT2 +ucol_openBinary(const uint8_t *bin, int32_t length, + const UCollator *base, + UErrorCode *status); + + #endif /* #if !UCONFIG_NO_COLLATION */ -#endif \ No newline at end of file +#endif + diff --git a/icuSources/i18n/unicode/ucoleitr.h b/icuSources/i18n/unicode/ucoleitr.h index 78f31250..7184e96a 100644 --- a/icuSources/i18n/unicode/ucoleitr.h +++ b/icuSources/i18n/unicode/ucoleitr.h @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 2001-2003, International Business Machines +* Copyright (C) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************* * @@ -25,7 +25,7 @@ * to be returned. * @stable ICU 2.0 */ -#define UCOL_NULLORDER 0xFFFFFFFF +#define UCOL_NULLORDER ((int32_t)0xFFFFFFFF) #include "unicode/ucol.h" @@ -107,7 +107,7 @@ typedef struct UCollationElements UCollationElements; * @return a struct containing collation element information * @stable ICU 2.0 */ -U_CAPI UCollationElements* U_EXPORT2 +U_STABLE UCollationElements* U_EXPORT2 ucol_openElements(const UCollator *coll, const UChar *text, int32_t textLength, @@ -120,7 +120,7 @@ ucol_openElements(const UCollator *coll, * @return the hash code. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucol_keyHashCode(const uint8_t* key, int32_t length); /** @@ -129,7 +129,7 @@ ucol_keyHashCode(const uint8_t* key, int32_t length); * @param elems The UCollationElements to close. * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucol_closeElements(UCollationElements *elems); /** @@ -141,7 +141,7 @@ ucol_closeElements(UCollationElements *elems); * @see ucol_previous * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucol_reset(UCollationElements *elems); /** @@ -153,7 +153,7 @@ ucol_reset(UCollationElements *elems); * if an error has occured or if the end of string has been reached * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucol_next(UCollationElements *elems, UErrorCode *status); /** @@ -172,7 +172,7 @@ ucol_next(UCollationElements *elems, UErrorCode *status); * been reached. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucol_previous(UCollationElements *elems, UErrorCode *status); /** @@ -186,7 +186,7 @@ ucol_previous(UCollationElements *elems, UErrorCode *status); * expansion sequence * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucol_getMaxExpansion(const UCollationElements *elems, int32_t order); /** @@ -201,7 +201,7 @@ ucol_getMaxExpansion(const UCollationElements *elems, int32_t order); * @see ucol_getText * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucol_setText( UCollationElements *elems, const UChar *text, int32_t textLength, @@ -216,7 +216,7 @@ ucol_setText( UCollationElements *elems, * @see ucol_setOffset * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucol_getOffset(const UCollationElements *elems); /** @@ -231,7 +231,7 @@ ucol_getOffset(const UCollationElements *elems); * @see ucol_getOffset * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 ucol_setOffset(UCollationElements *elems, int32_t offset, UErrorCode *status); @@ -240,27 +240,27 @@ ucol_setOffset(UCollationElements *elems, * Get the primary order of a collation order. * @param order the collation order * @return the primary order of a collation order. -* @draft ICU 2.6 +* @stable ICU 2.6 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucol_primaryOrder (int32_t order); /** * Get the secondary order of a collation order. * @param order the collation order * @return the secondary order of a collation order. -* @draft ICU 2.6 +* @stable ICU 2.6 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucol_secondaryOrder (int32_t order); /** * Get the tertiary order of a collation order. * @param order the collation order * @return the tertiary order of a collation order. -* @draft ICU 2.6 +* @stable ICU 2.6 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ucol_tertiaryOrder (int32_t order); #endif /* #if !UCONFIG_NO_COLLATION */ diff --git a/icuSources/i18n/unicode/ucurr.h b/icuSources/i18n/unicode/ucurr.h index e2b96d0b..2718dc73 100644 --- a/icuSources/i18n/unicode/ucurr.h +++ b/icuSources/i18n/unicode/ucurr.h @@ -1,11 +1,8 @@ /* ********************************************************************** -* Copyright (c) 2002-2003, International Business Machines +* Copyright (c) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** -* $Source: /cvs/root/ICU/icuSources/i18n/unicode/ucurr.h,v $ -* $Revision: 1.1.1.2 $ -********************************************************************** */ #ifndef _UCURR_H_ #define _UCURR_H_ @@ -14,8 +11,6 @@ #if !UCONFIG_NO_FORMATTING -typedef const void* UCurrRegistryKey; - /** * The ucurr API encapsulates information about a currency, as defined by * ISO 4217. A currency is represented by a 3-character string @@ -34,40 +29,54 @@ typedef const void* UCurrRegistryKey; */ /** - * Returns a currency code for the default currency in the given - * locale. - * @param locale the locale for which to retrieve a currency code + * Finds a currency code for the given locale. + * @param locale the locale for which to retrieve a currency code. + * Currency can be specified by the "currency" keyword + * in which case it overrides the default currency code + * @param buff fill in buffer. Can be NULL for preflighting. + * @param buffCapacity capacity of the fill in buffer. Can be 0 for + * preflighting. If it is non-zero, the buff parameter + * must not be NULL. * @param ec error code - * @return a pointer to a 3-character ISO 4217 currency code, or - * NULL if none is found. - * @draft ICU 2.2 + * @return length of the currency string. It should always be 3. If 0, + * currency couldn't be found or the input values are + * invalid. + * @draft ICU 2.8 */ -U_CAPI const UChar* U_EXPORT2 +U_DRAFT int32_t U_EXPORT2 ucurr_forLocale(const char* locale, + UChar* buff, + int32_t buffCapacity, UErrorCode* ec); /** * Selector constants for ucurr_getName(). * * @see ucurr_getName - * @draft ICU 2.6 + * @stable ICU 2.6 */ typedef enum UCurrNameStyle { /** * Selector for ucurr_getName indicating a symbolic name for a * currency, such as "$" for USD. - * @draft ICU 2.6 + * @stable ICU 2.6 */ UCURR_SYMBOL_NAME, /** * Selector for ucurr_getName indicating the long name for a * currency, such as "US Dollar" for USD. - * @draft ICU 2.6 + * @stable ICU 2.6 */ UCURR_LONG_NAME } UCurrNameStyle; +#if !UCONFIG_NO_SERVICE +/** + * @internal + */ +typedef const void* UCurrRegistryKey; + /** * Register an (existing) ISO 4217 currency code for the given locale. * Only the country code and the two variants EURO and PRE_EURO are @@ -77,10 +86,10 @@ typedef enum UCurrNameStyle { * @param status the in/out status code * @return a registry key that can be used to unregister this currency code, or NULL * if there was an error. - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI UCurrRegistryKey U_EXPORT2 - ucurr_register(const UChar* isoCode, +U_STABLE UCurrRegistryKey U_EXPORT2 +ucurr_register(const UChar* isoCode, const char* locale, UErrorCode* status); /** @@ -92,9 +101,11 @@ U_CAPI UCurrRegistryKey U_EXPORT2 * @param key the registry key returned by a previous call to ucurr_register * @param status the in/out status code, no special meanings are assigned * @return TRUE if the currency for this key was successfully unregistered + * @stable ICU 2.6 */ -U_CAPI UBool U_EXPORT2 - ucurr_unregister(UCurrRegistryKey key, UErrorCode* status); +U_STABLE UBool U_EXPORT2 +ucurr_unregister(UCurrRegistryKey key, UErrorCode* status); +#endif /* UCONFIG_NO_SERVICE */ /** * Returns the display name for the given currency in the @@ -111,9 +122,9 @@ U_CAPI UBool U_EXPORT2 * data contains no entry for 'currency', then 'currency' itself is * returned. If *isChoiceFormat is TRUE, then the result is a * ChoiceFormat pattern. Otherwise it is a static string. - * @draft ICU 2.6 + * @stable ICU 2.6 */ -U_CAPI const UChar* U_EXPORT2 +U_STABLE const UChar* U_EXPORT2 ucurr_getName(const UChar* currency, const char* locale, UCurrNameStyle nameStyle, @@ -125,22 +136,61 @@ ucurr_getName(const UChar* currency, * Returns the number of the number of fraction digits that should * be displayed for the given currency. * @param currency null-terminated 3-letter ISO 4217 code + * @param ec input-output error code * @return a non-negative number of fraction digits to be - * displayed - * @draft ICU 2.2 + * displayed, or 0 if there is an error + * @draft ICU 3.0 */ -U_CAPI int32_t U_EXPORT2 -ucurr_getDefaultFractionDigits(const UChar* currency); +U_DRAFT int32_t U_EXPORT2 +ucurr_getDefaultFractionDigits(const UChar* currency, + UErrorCode* ec); /** * Returns the rounding increment for the given currency, or 0.0 if no * rounding is done by the currency. * @param currency null-terminated 3-letter ISO 4217 code - * @return the non-negative rounding increment, or 0.0 if none - * @draft ICU 2.2 + * @param ec input-output error code + * @return the non-negative rounding increment, or 0.0 if none, + * or 0.0 if there is an error + * @draft ICU 3.0 */ -U_CAPI double U_EXPORT2 -ucurr_getRoundingIncrement(const UChar* currency); +U_DRAFT double U_EXPORT2 +ucurr_getRoundingIncrement(const UChar* currency, + UErrorCode* ec); + +#ifdef XP_CPLUSPLUS +#include "unicode/unistr.h" +#include "unicode/parsepos.h" +U_NAMESPACE_BEGIN + +/** + * Attempt to parse the given string as a currency, either as a + * display name in the given locale, or as a 3-letter ISO 4217 + * code. If multiple display names match, then the longest one is + * selected. If both a display name and a 3-letter ISO code + * match, then the display name is preferred, unless it's length + * is less than 3. + * + * @param locale the locale of the display names to match + * @param text the text to parse + * @param pos input-output position; on input, the position within + * text to match; must have 0 <= pos.getIndex() < text.length(); + * on output, the position after the last matched character. If + * the parse fails, the position in unchanged upon output. + * @return the ISO 4217 code, as a string, of the best match, or + * null if there is no match + * + * @internal + */ +void +uprv_parseCurrency(const char* locale, + const UnicodeString& text, + ParsePosition& pos, + UChar* result, + UErrorCode& ec); + +U_NAMESPACE_END +#endif #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/i18n/unicode/udat.h b/icuSources/i18n/unicode/udat.h index 4ed8529a..ab63378c 100644 --- a/icuSources/i18n/unicode/udat.h +++ b/icuSources/i18n/unicode/udat.h @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 1996-2003, International Business Machines Corporation and others. All Rights Reserved. +* Copyright (C) 1996-2004, International Business Machines Corporation and others. All Rights Reserved. ******************************************************************************* */ @@ -157,14 +157,210 @@ typedef enum UDateFormatStyle { } UDateFormatStyle; +/** + * FieldPosition and UFieldPosition selectors for format fields + * defined by DateFormat and UDateFormat. + * @draft ICU 3.0 + */ +typedef enum UDateFormatField { + /** + * FieldPosition and UFieldPosition selector for 'G' field alignment, + * corresponding to the UCAL_ERA field. + * @draft ICU 3.0 + */ + UDAT_ERA_FIELD = 0, + + /** + * FieldPosition and UFieldPosition selector for 'y' field alignment, + * corresponding to the UCAL_YEAR field. + * @draft ICU 3.0 + */ + UDAT_YEAR_FIELD = 1, + + /** + * FieldPosition and UFieldPosition selector for 'M' field alignment, + * corresponding to the UCAL_MONTH field. + * @draft ICU 3.0 + */ + UDAT_MONTH_FIELD = 2, + + /** + * FieldPosition and UFieldPosition selector for 'd' field alignment, + * corresponding to the UCAL_DATE field. + * @draft ICU 3.0 + */ + UDAT_DATE_FIELD = 3, + + /** + * FieldPosition and UFieldPosition selector for 'k' field alignment, + * corresponding to the UCAL_HOUR_OF_DAY field. + * UDAT_HOUR_OF_DAY1_FIELD is used for the one-based 24-hour clock. + * For example, 23:59 + 01:00 results in 24:59. + * @draft ICU 3.0 + */ + UDAT_HOUR_OF_DAY1_FIELD = 4, + + /** + * FieldPosition and UFieldPosition selector for 'H' field alignment, + * corresponding to the UCAL_HOUR_OF_DAY field. + * UDAT_HOUR_OF_DAY0_FIELD is used for the zero-based 24-hour clock. + * For example, 23:59 + 01:00 results in 00:59. + * @draft ICU 3.0 + */ + UDAT_HOUR_OF_DAY0_FIELD = 5, + + /** + * FieldPosition and UFieldPosition selector for 'm' field alignment, + * corresponding to the UCAL_MINUTE field. + * @draft ICU 3.0 + */ + UDAT_MINUTE_FIELD = 6, + + /** + * FieldPosition and UFieldPosition selector for 's' field alignment, + * corresponding to the UCAL_SECOND field. + * @draft ICU 3.0 + */ + UDAT_SECOND_FIELD = 7, + + /** + * FieldPosition and UFieldPosition selector for 'S' field alignment, + * corresponding to the UCAL_MILLISECOND field. + * @draft ICU 3.0 + */ + UDAT_FRACTIONAL_SECOND_FIELD = 8, + + /** + * FieldPosition and UFieldPosition selector for 'E' field alignment, + * corresponding to the UCAL_DAY_OF_WEEK field. + * @draft ICU 3.0 + */ + UDAT_DAY_OF_WEEK_FIELD = 9, + + /** + * FieldPosition and UFieldPosition selector for 'D' field alignment, + * corresponding to the UCAL_DAY_OF_YEAR field. + * @draft ICU 3.0 + */ + UDAT_DAY_OF_YEAR_FIELD = 10, + + /** + * FieldPosition and UFieldPosition selector for 'F' field alignment, + * corresponding to the UCAL_DAY_OF_WEEK_IN_MONTH field. + * @draft ICU 3.0 + */ + UDAT_DAY_OF_WEEK_IN_MONTH_FIELD = 11, + + /** + * FieldPosition and UFieldPosition selector for 'w' field alignment, + * corresponding to the UCAL_WEEK_OF_YEAR field. + * @draft ICU 3.0 + */ + UDAT_WEEK_OF_YEAR_FIELD = 12, + + /** + * FieldPosition and UFieldPosition selector for 'W' field alignment, + * corresponding to the UCAL_WEEK_OF_MONTH field. + * @draft ICU 3.0 + */ + UDAT_WEEK_OF_MONTH_FIELD = 13, + + /** + * FieldPosition and UFieldPosition selector for 'a' field alignment, + * corresponding to the UCAL_AM_PM field. + * @draft ICU 3.0 + */ + UDAT_AM_PM_FIELD = 14, + + /** + * FieldPosition and UFieldPosition selector for 'h' field alignment, + * corresponding to the UCAL_HOUR field. + * UDAT_HOUR1_FIELD is used for the one-based 12-hour clock. + * For example, 11:30 PM + 1 hour results in 12:30 AM. + * @draft ICU 3.0 + */ + UDAT_HOUR1_FIELD = 15, + + /** + * FieldPosition and UFieldPosition selector for 'K' field alignment, + * corresponding to the UCAL_HOUR field. + * UDAT_HOUR0_FIELD is used for the zero-based 12-hour clock. + * For example, 11:30 PM + 1 hour results in 00:30 AM. + * @draft ICU 3.0 + */ + UDAT_HOUR0_FIELD = 16, + + /** + * FieldPosition and UFieldPosition selector for 'z' field alignment, + * corresponding to the UCAL_ZONE_OFFSET and + * UCAL_DST_OFFSET fields. + * @draft ICU 3.0 + */ + UDAT_TIMEZONE_FIELD = 17, + + /** + * FieldPosition and UFieldPosition selector for 'Y' field alignment, + * corresponding to the UCAL_YEAR_WOY field. + * @draft ICU 3.0 + */ + UDAT_YEAR_WOY_FIELD = 18, + + /** + * FieldPosition and UFieldPosition selector for 'e' field alignment, + * corresponding to the UCAL_DOW_LOCAL field. + * @draft ICU 3.0 + */ + UDAT_DOW_LOCAL_FIELD = 19, + + /** + * FieldPosition and UFieldPosition selector for 'u' field alignment, + * corresponding to the UCAL_EXTENDED_YEAR field. + * @draft ICU 3.0 + */ + UDAT_EXTENDED_YEAR_FIELD = 20, + + /** + * FieldPosition and UFieldPosition selector for 'g' field alignment, + * corresponding to the UCAL_JULIAN_DAY field. + * @draft ICU 3.0 + */ + UDAT_JULIAN_DAY_FIELD = 21, + + /** + * FieldPosition and UFieldPosition selector for 'A' field alignment, + * corresponding to the UCAL_MILLISECONDS_IN_DAY field. + * @draft ICU 3.0 + */ + UDAT_MILLISECONDS_IN_DAY_FIELD = 22, + + /** + * FieldPosition and UFieldPosition selector for 'Z' field alignment, + * corresponding to the UCAL_ZONE_OFFSET and + * UCAL_DST_OFFSET fields. + * @draft ICU 3.0 + */ + UDAT_TIMEZONE_RFC_FIELD = 23, + + /** + * Number of FieldPosition and UFieldPosition selectors for + * DateFormat and UDateFormat. + * Valid selectors range from 0 to UDAT_FIELD_COUNT-1. + * This value is subject to change if new fields are defined + * in the future. + * @draft ICU 3.0 + */ + UDAT_FIELD_COUNT = 24 + +} UDateFormatField; + /** * Open a new UDateFormat for formatting and parsing dates and times. - * A UDateFormat may be used to format dates in calls to \Ref{udat_format}, - * and to parse dates in calls to \Ref{udat_parse}. - * @param timeStyle The style used to format times; one of UDAT_FULL_STYLE, UDAT_LONG_STYLE, - * UDAT_MEDIUM_STYLE, UDAT_SHORT_STYLE, or UDAT_DEFAULT_STYLE - * @param dateStyle The style used to format dates; one of UDAT_FULL_STYLE, UDAT_LONG_STYLE, - * UDAT_MEDIUM_STYLE, UDAT_SHORT_STYLE, or UDAT_DEFAULT_STYLE + * A UDateFormat may be used to format dates in calls to {@link #udat_format }, + * and to parse dates in calls to {@link #udat_parse }. + * @param timeStyle The style used to format times; one of UDAT_FULL, UDAT_LONG, + * UDAT_MEDIUM, UDAT_SHORT, or UDAT_DEFAULT + * @param dateStyle The style used to format dates; one of UDAT_FULL, UDAT_LONG, + * UDAT_MEDIUM, UDAT_SHORT, or UDAT_DEFAULT * @param locale The locale specifying the formatting conventions * @param tzID A timezone ID specifying the timezone to use. If 0, use * the default timezone. @@ -176,7 +372,7 @@ typedef enum UDateFormatStyle { * an error occurred. * @stable ICU 2.0 */ -U_CAPI UDateFormat* U_EXPORT2 +U_STABLE UDateFormat* U_EXPORT2 udat_open(UDateFormatStyle timeStyle, UDateFormatStyle dateStyle, const char *locale, @@ -193,7 +389,7 @@ udat_open(UDateFormatStyle timeStyle, * @param format The formatter to close. * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 udat_close(UDateFormat* format); /** @@ -204,13 +400,13 @@ udat_close(UDateFormat* format); * @return A pointer to a UDateFormat identical to fmt. * @stable ICU 2.0 */ -U_CAPI UDateFormat* U_EXPORT2 +U_STABLE UDateFormat* U_EXPORT2 udat_clone(const UDateFormat *fmt, UErrorCode *status); /** * Format a date using an UDateFormat. -* The date will be formatted using the conventions specified in \Ref{udat_open} +* The date will be formatted using the conventions specified in {@link #udat_open } * @param format The formatter to use * @param dateToFormat The date to format * @param result A pointer to a buffer to receive the formatted number. @@ -226,7 +422,7 @@ udat_clone(const UDateFormat *fmt, * @see UFieldPosition * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 udat_format( const UDateFormat* format, UDate dateToFormat, UChar* result, @@ -236,7 +432,7 @@ udat_format( const UDateFormat* format, /** * Parse a string into an date/time using a UDateFormat. -* The date will be parsed using the conventions specified in \Ref{udat_open} +* The date will be parsed using the conventions specified in {@link #udat_open } * @param format The formatter to use. * @param text The text to parse. * @param textLength The length of text, or -1 if null-terminated. @@ -247,7 +443,7 @@ udat_format( const UDateFormat* format, * @see udat_format * @stable ICU 2.0 */ -U_CAPI UDate U_EXPORT2 +U_STABLE UDate U_EXPORT2 udat_parse( const UDateFormat* format, const UChar* text, int32_t textLength, @@ -256,7 +452,7 @@ udat_parse( const UDateFormat* format, /** * Parse a string into an date/time using a UDateFormat. -* The date will be parsed using the conventions specified in \Ref{udat_open} +* The date will be parsed using the conventions specified in {@link #udat_open } * @param format The formatter to use. * @param calendar The calendar in which to store the parsed data. * @param text The text to parse. @@ -267,7 +463,7 @@ udat_parse( const UDateFormat* format, * @see udat_format * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 udat_parseCalendar(const UDateFormat* format, UCalendar* calendar, const UChar* text, @@ -284,7 +480,7 @@ udat_parseCalendar(const UDateFormat* format, * @see udat_setLenient * @stable ICU 2.0 */ -U_CAPI UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 udat_isLenient(const UDateFormat* fmt); /** @@ -296,7 +492,7 @@ udat_isLenient(const UDateFormat* fmt); * @see dat_isLenient * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 udat_setLenient( UDateFormat* fmt, UBool isLenient); @@ -309,7 +505,7 @@ udat_setLenient( UDateFormat* fmt, * @see udat_setCalendar * @stable ICU 2.0 */ -U_CAPI const UCalendar* U_EXPORT2 +U_STABLE const UCalendar* U_EXPORT2 udat_getCalendar(const UDateFormat* fmt); /** @@ -321,7 +517,7 @@ udat_getCalendar(const UDateFormat* fmt); * @see udat_setCalendar * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 udat_setCalendar( UDateFormat* fmt, const UCalendar* calendarToSet); @@ -334,7 +530,7 @@ udat_setCalendar( UDateFormat* fmt, * @see udat_setNumberFormat * @stable ICU 2.0 */ -U_CAPI const UNumberFormat* U_EXPORT2 +U_STABLE const UNumberFormat* U_EXPORT2 udat_getNumberFormat(const UDateFormat* fmt); /** @@ -346,7 +542,7 @@ udat_getNumberFormat(const UDateFormat* fmt); * @see udat_getNumberFormat * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 udat_setNumberFormat( UDateFormat* fmt, const UNumberFormat* numberFormatToSet); @@ -359,18 +555,18 @@ udat_setNumberFormat( UDateFormat* fmt, * @see udat_countAvailable * @stable ICU 2.0 */ -U_CAPI const char* U_EXPORT2 +U_STABLE const char* U_EXPORT2 udat_getAvailable(int32_t index); /** * Determine how many locales have date/time formatting patterns available. * This function is most useful as determining the loop ending condition for -* calls to \Ref{udat_getAvailable}. +* calls to {@link #udat_getAvailable }. * @return The number of locales for which date/time formatting patterns are available. * @see udat_getAvailable * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 udat_countAvailable(void); /** @@ -383,7 +579,7 @@ udat_countAvailable(void); * @see udat_Set2DigitYearStart * @stable ICU 2.0 */ -U_CAPI UDate U_EXPORT2 +U_STABLE UDate U_EXPORT2 udat_get2DigitYearStart( const UDateFormat *fmt, UErrorCode *status); @@ -397,7 +593,7 @@ udat_get2DigitYearStart( const UDateFormat *fmt, * @see udat_Set2DigitYearStart * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 udat_set2DigitYearStart( UDateFormat *fmt, UDate d, UErrorCode *status); @@ -414,7 +610,7 @@ udat_set2DigitYearStart( UDateFormat *fmt, * @see udat_applyPattern * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 udat_toPattern( const UDateFormat *fmt, UBool localized, UChar *result, @@ -431,7 +627,7 @@ udat_toPattern( const UDateFormat *fmt, * @see udat_toPattern * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 udat_applyPattern( UDateFormat *format, UBool localized, const UChar *pattern, @@ -481,7 +677,7 @@ typedef struct UDateFormatSymbols UDateFormatSymbols; * @see udat_setSymbols * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 udat_getSymbols(const UDateFormat *fmt, UDateFormatSymbolType type, int32_t index, @@ -492,7 +688,7 @@ udat_getSymbols(const UDateFormat *fmt, /** * Count the number of particular symbols for an UDateFormat. * This function is most useful as for detemining the loop termination condition -* for calls to \Ref{udat_getSymbols}. +* for calls to {@link #udat_getSymbols }. * @param fmt The formatter to query. * @param type The type of symbols to count. One of UDAT_ERAS, UDAT_MONTHS, UDAT_SHORT_MONTHS, * UDAT_WEEKDAYS, UDAT_SHORT_WEEKDAYS, UDAT_AM_PMS, or UDAT_LOCALIZED_CHARS @@ -501,7 +697,7 @@ udat_getSymbols(const UDateFormat *fmt, * @see udat_setSymbols * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 udat_countSymbols( const UDateFormat *fmt, UDateFormatSymbolType type); @@ -520,7 +716,7 @@ udat_countSymbols( const UDateFormat *fmt, * @see udat_countSymbols * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 udat_setSymbols( UDateFormat *format, UDateFormatSymbolType type, int32_t index, @@ -528,24 +724,19 @@ udat_setSymbols( UDateFormat *format, int32_t valueLength, UErrorCode *status); -/********************* Obsolete API ************************************/ /** - * TODO: Remove after Aug 2002 + * Get the locale for this date format object. + * You can choose between valid and actual locale. + * @param fmt The formatter to get the locale from + * @param type type of the locale we're looking for (valid or actual) + * @param status error code for the operation + * @return the locale name + * @draft ICU 2.8 likely to change in ICU 3.0, based on feedback */ -#ifdef U_USE_DEPRECATED_FORMAT_API -#if ((U_ICU_VERSION_MAJOR_NUM != 2) || (U_ICU_VERSION_MINOR_NUM != 2)) -# error "ICU version has changed. Please redefine the macros under U_USE_DEPRECATED_FORMAT_API pre-processor definition" -#else - static UDateFormat* - udat_openPattern(const UChar* pattern,int32_t patternLength,const char* locale,UErrorCode *status) - { - return udat_open(UDAT_IGNORE,UDAT_IGNORE,locale,NULL,0,pattern,patternLength,status); - } - -# define udat_open_2_2(timeStyle,dateStyle,locale,tzId,tzIdLength,status) udat_open(timeStyle,dateStyle,locale,tzId,tzIdLength,NULL,0,status) -#endif -#endif -/********************* End **********************************************/ +U_DRAFT const char* U_EXPORT2 +udat_getLocaleByType(const UDateFormat *fmt, + ULocDataLocaleType type, + UErrorCode* status); #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/i18n/unicode/ulocdata.h b/icuSources/i18n/unicode/ulocdata.h new file mode 100644 index 00000000..edcdcb9f --- /dev/null +++ b/icuSources/i18n/unicode/ulocdata.h @@ -0,0 +1,95 @@ +/* +****************************************************************************** +* * +* Copyright (C) 2003-2004, International Business Machines * +* Corporation and others. All Rights Reserved. * +* * +****************************************************************************** +* file name: ulocdata.h +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2003Oct21 +* created by: Ram Viswanadha +*/ + +#ifndef __ULOCDATA_H__ +#define __ULOCDATA_H__ + +#include "unicode/ures.h" +#include "unicode/uloc.h" +#include "unicode/uset.h" + + +/** + * Returns the set of exemplar characters for a locale. + * + * @param fillIn Pointer to a USet object to receive the + * exemplar character set for the given locale. Previous + * contents of fillIn are lost. If fillIn is NULL, + * then a new USet is created and returned. The caller + * owns the result and must dispose of it by calling + * uset_close. + * @param localeID Locale id for which the exemplar character set + * is to be retrieved. + * @param options Bitmask for options to apply to the exemplar pattern. + * Specify zero to retrieve the exemplar set as it is + * defined in the locale data. Specify + * USET_CASE_INSENSITIVE to retrieve a case-folded + * exemplar set. See uset_applyPattern for a complete + * list of valid options. The USET_IGNORE_SPACE bit is + * always set, regardless of the value of 'options'. + * @param status Pointer to an input-output error code value; + * must not be NULL. + * @return USet* Either fillIn, or if fillIn is NULL, a pointer to + * a newly-allocated USet that the user must close. + * @draft ICU 3.0 + */ +U_DRAFT USet* U_EXPORT2 +ulocdata_getExemplarSet(USet *fillIn, const char *localeID, + uint32_t options, UErrorCode *status); + +#ifndef U_HIDE_DRAFT_API +/** + * Enumeration for representing the measurement systems. + * @draft ICU 2.8 + */ +typedef enum UMeasurementSystem { + UMS_SI, /** Measurement system specified by SI otherwise known as Metric system. */ + UMS_US, /** Measurement system followed in the United States of America. */ + UMS_LIMIT +} UMeasurementSystem; +#endif /*U_HIDE_DRAFT_API */ + +/** + * Returns the measurement system used in the locale specified by the localeID. + * + * @param localeID The id of the locale for which the measurement system to be retrieved. + * @param status Must be a valid pointer to an error code value, + * which must not indicate a failure before the function call. + * @return UMeasurementSystem the measurement system used in the locale. + * @draft ICU 2.8 + */ +U_DRAFT UMeasurementSystem U_EXPORT2 +ulocdata_getMeasurementSystem(const char *localeID, UErrorCode *status); + +/** + * Returns the element gives the normal business letter size, and customary units. + * The units for the numbers are always in milli-meters. + * For US since 8.5 and 11 do not yeild an integral value when converted to milli-meters, + * the values are rounded off. + * So for A4 size paper the height and width are 297 mm and 210 mm repectively, + * and for US letter size the height and width are 279 mm and 216 mm respectively. + * + * @param localeID The id of the locale for which the paper size information to be retrieved. + * @param height A pointer to int to recieve the height information. + * @param width A pointer to int to recieve the width information. + * @param status Must be a valid pointer to an error code value, + * which must not indicate a failure before the function call. + * @draft ICU 2.8 + */ +U_DRAFT void U_EXPORT2 +ulocdata_getPaperSize(const char *localeID, int32_t *height, int32_t *width, UErrorCode *status); + +#endif diff --git a/icuSources/i18n/unicode/umsg.h b/icuSources/i18n/unicode/umsg.h index 9bcc8f65..cd160e2e 100644 --- a/icuSources/i18n/unicode/umsg.h +++ b/icuSources/i18n/unicode/umsg.h @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 1996-2003, International Business Machines Corporation and others. All Rights Reserved. +* Copyright (C) 1996-2004, International Business Machines Corporation and others. All Rights Reserved. ******************************************************************************* * * file name: umsg.h @@ -22,6 +22,7 @@ #if !UCONFIG_NO_FORMATTING +#include "unicode/uloc.h" #include "unicode/parseerr.h" #include /** @@ -199,7 +200,7 @@ * @see u_parseMessage * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_formatMessage(const char *locale, const UChar *pattern, int32_t patternLength, @@ -226,7 +227,7 @@ u_formatMessage(const char *locale, * @see u_parseMessage * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_vformatMessage( const char *locale, const UChar *pattern, int32_t patternLength, @@ -239,7 +240,7 @@ u_vformatMessage( const char *locale, * Parse a message. * For numeric arguments, this function will always use doubles. Integer types * should not be passed. - * This function is not able to parse all output from \Ref{u_formatMessage}. + * This function is not able to parse all output from {@link #u_formatMessage }. * @param locale The locale for which the message is formatted * @param pattern The pattern specifying the message's format * @param patternLength The length of pattern @@ -251,7 +252,7 @@ u_vformatMessage( const char *locale, * @see u_formatMessage * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 u_parseMessage( const char *locale, const UChar *pattern, int32_t patternLength, @@ -264,7 +265,7 @@ u_parseMessage( const char *locale, * Parse a message. * For numeric arguments, this function will always use doubles. Integer types * should not be passed. - * This function is not able to parse all output from \Ref{u_formatMessage}. + * This function is not able to parse all output from {@link #u_formatMessage }. * @param locale The locale for which the message is formatted * @param pattern The pattern specifying the message's format * @param patternLength The length of pattern @@ -276,7 +277,7 @@ u_parseMessage( const char *locale, * @see u_formatMessage * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 u_vparseMessage(const char *locale, const UChar *pattern, int32_t patternLength, @@ -305,7 +306,7 @@ u_vparseMessage(const char *locale, * @see u_parseMessage * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_formatMessageWithError( const char *locale, const UChar *pattern, int32_t patternLength, @@ -334,7 +335,7 @@ u_formatMessageWithError( const char *locale, * output was truncated. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 u_vformatMessageWithError( const char *locale, const UChar *pattern, int32_t patternLength, @@ -348,7 +349,7 @@ u_vformatMessageWithError( const char *locale, * Parse a message. * For numeric arguments, this function will always use doubles. Integer types * should not be passed. - * This function is not able to parse all output from \Ref{u_formatMessage}. + * This function is not able to parse all output from {@link #u_formatMessage }. * @param locale The locale for which the message is formatted * @param pattern The pattern specifying the message's format * @param patternLength The length of pattern @@ -362,7 +363,7 @@ u_vformatMessageWithError( const char *locale, * @see u_formatMessage * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 u_parseMessageWithError(const char *locale, const UChar *pattern, int32_t patternLength, @@ -376,7 +377,7 @@ u_parseMessageWithError(const char *locale, * Parse a message. * For numeric arguments, this function will always use doubles. Integer types * should not be passed. - * This function is not able to parse all output from \Ref{u_formatMessage}. + * This function is not able to parse all output from {@link #u_formatMessage }. * @param locale The locale for which the message is formatted * @param pattern The pattern specifying the message's format * @param patternLength The length of pattern @@ -390,7 +391,7 @@ u_parseMessageWithError(const char *locale, * @see u_formatMessage * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 u_vparseMessageWithError(const char *locale, const UChar *pattern, int32_t patternLength, @@ -420,7 +421,7 @@ typedef void* UMessageFormat; * messages, or 0 if an error occurred. * @stable ICU 2.0 */ -U_CAPI UMessageFormat* U_EXPORT2 +U_STABLE UMessageFormat* U_EXPORT2 umsg_open( const UChar *pattern, int32_t patternLength, const char *locale, @@ -433,7 +434,7 @@ umsg_open( const UChar *pattern, * @param format The formatter to close. * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 umsg_close(UMessageFormat* format); /** @@ -444,7 +445,7 @@ umsg_close(UMessageFormat* format); * @return A pointer to a UDateFormat identical to fmt. * @stable ICU 2.0 */ -U_CAPI UMessageFormat U_EXPORT2 +U_STABLE UMessageFormat U_EXPORT2 umsg_clone(const UMessageFormat *fmt, UErrorCode *status); @@ -455,7 +456,7 @@ umsg_clone(const UMessageFormat *fmt, * @param locale The locale the formatter should use. * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 umsg_setLocale(UMessageFormat *fmt, const char* locale); @@ -466,8 +467,8 @@ umsg_setLocale(UMessageFormat *fmt, * @return the locale. * @stable ICU 2.0 */ -U_CAPI const char* U_EXPORT2 -umsg_getLocale(UMessageFormat *fmt); +U_STABLE const char* U_EXPORT2 +umsg_getLocale(const UMessageFormat *fmt); /** * Sets the pattern. @@ -481,7 +482,7 @@ umsg_getLocale(UMessageFormat *fmt); * set to a failure result. * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 umsg_applyPattern( UMessageFormat *fmt, const UChar* pattern, int32_t patternLength, @@ -499,8 +500,8 @@ umsg_applyPattern( UMessageFormat *fmt, * @return the pattern of the format * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 -umsg_toPattern(UMessageFormat *fmt, +U_STABLE int32_t U_EXPORT2 +umsg_toPattern(const UMessageFormat *fmt, UChar* result, int32_t resultLength, UErrorCode* status); @@ -520,8 +521,8 @@ umsg_toPattern(UMessageFormat *fmt, * the output was truncated. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 -umsg_format( UMessageFormat *fmt, +U_STABLE int32_t U_EXPORT2 +umsg_format( const UMessageFormat *fmt, UChar *result, int32_t resultLength, UErrorCode *status, @@ -542,8 +543,8 @@ umsg_format( UMessageFormat *fmt, * the output was truncated. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 -umsg_vformat( UMessageFormat *fmt, +U_STABLE int32_t U_EXPORT2 +umsg_vformat( const UMessageFormat *fmt, UChar *result, int32_t resultLength, va_list ap, @@ -553,7 +554,7 @@ umsg_vformat( UMessageFormat *fmt, * Parse a message. * For numeric arguments, this function will always use doubles. Integer types * should not be passed. - * This function is not able to parse all output from \Ref{umsg_format}. + * This function is not able to parse all output from {@link #umsg_format }. * @param fmt The formatter to use * @param source The text to parse. * @param sourceLength The length of source, or -1 if null-terminated. @@ -563,8 +564,8 @@ umsg_vformat( UMessageFormat *fmt, * specified in pattern. * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 -umsg_parse( UMessageFormat *fmt, +U_STABLE void U_EXPORT2 +umsg_parse( const UMessageFormat *fmt, const UChar *source, int32_t sourceLength, int32_t *count, @@ -575,7 +576,7 @@ umsg_parse( UMessageFormat *fmt, * Parse a message. * For numeric arguments, this function will always use doubles. Integer types * should not be passed. - * This function is not able to parse all output from \Ref{umsg_format}. + * This function is not able to parse all output from {@link #umsg_format }. * @param fmt The formatter to use * @param source The text to parse. * @param sourceLength The length of source, or -1 if null-terminated. @@ -586,14 +587,29 @@ umsg_parse( UMessageFormat *fmt, * @see u_formatMessage * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 -umsg_vparse(UMessageFormat *fmt, +U_STABLE void U_EXPORT2 +umsg_vparse(const UMessageFormat *fmt, const UChar *source, int32_t sourceLength, int32_t *count, va_list ap, UErrorCode *status); + +/** + * Get the locale for this message format object. + * You can choose between valid and actual locale. + * @param fmt The formatter to get the locale from + * @param type type of the locale we're looking for (valid or actual) + * @param status error code for the operation + * @return the locale name + * @draft ICU 2.8 likely to change in ICU 3.0, based on feedback + */ +U_STABLE const char* U_EXPORT2 +umsg_getLocaleByType(const UMessageFormat *fmt, + ULocDataLocaleType type, + UErrorCode* status); + #endif /* #if !UCONFIG_NO_FORMATTING */ #endif diff --git a/icuSources/i18n/unicode/unifltlg.h b/icuSources/i18n/unicode/unifltlg.h deleted file mode 100644 index d9411bfd..00000000 --- a/icuSources/i18n/unicode/unifltlg.h +++ /dev/null @@ -1,111 +0,0 @@ -/* -********************************************************************** -* Copyright (C) 1999, International Business Machines Corporation and others. All Rights Reserved. -********************************************************************** -* Date Name Description -* 11/17/99 aliu Creation. -********************************************************************** -*/ - -////////////////////////////////////////////////////////////// -// -// NOTICE - Do not use -// -// This entire file has been marked obsolete as of ICU 2.4. -// This will be removed as of ICU 2.8. Use UnicodeSet methods instead. -// -////////////////////////////////////////////////////////////// - -#ifndef UNIFLTLG_H -#define UNIFLTLG_H - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_TRANSLITERATION - -#include "unicode/uobject.h" - -U_NAMESPACE_BEGIN - -class UnicodeFilter; - -/** - * UnicodeFilterLogic provides logical operators on - * {@link UnicodeFilter} objects. This class cannot be instantiated; - * it consists only of static methods. The static methods return - * filter objects that perform logical inversion (not), - * intersection (and), or union (or) of the given - * filter objects. - * - * If a UnicodeFilter* f is passed in, where f == NULL, then that - * is treated as a filter that contains all Unicode characters. - * Therefore, createNot(NULL) returns a filter that contains no - * Unicode characters. Likewise, createAnd(g, NULL) returns g->clone(), - * and createAnd(NULL, NULL) returns NULL. - * - * @obsolete ICU 2.8. Use UnicodeSet methods instead since this class will be removed in that release. - */ -class U_I18N_API UnicodeFilterLogic /* not : public UObject because all methods are static */ { - -public: - - /** - * Returns a UnicodeFilter that implements the inverse of - * the given filter. - * @param f may be NULL - * @result always non-NULL - * @obsolete ICU 2.8. Use UnicodeSet methods instead since this class will be removed in that release. - */ - static UnicodeFilter* createNot(const UnicodeFilter* f); - - /** - * Returns a UnicodeFilter that implements a short - * circuit AND of the result of the two given filters. That is, - * if f.contains() is false, then g.contains() - * is not called, and contains() returns false. - * @param f may be NULL - * @param g may be NULL - * @result will be NULL if and only if f == g == NULL - * @obsolete ICU 2.8. Use UnicodeSet methods instead since this class will be removed in that release. - */ - static UnicodeFilter* createAnd(const UnicodeFilter* f, - const UnicodeFilter* g); - - /** - * Returns a UnicodeFilter that implements a short - * circuit AND of the result of the two given filters. That is, - * if f.contains() is false, then g.contains() - * is not called, and contains() returns false. - * @param adoptedF may be NULL; this argument is adopted - * @param adoptedG may be NULL; this argument is adopted - * @result will be NULL if and only if f == g == NULL - * @obsolete ICU 2.8. Use UnicodeSet methods instead since this class will be removed in that release. - */ - static UnicodeFilter* createAdoptingAnd(UnicodeFilter* adoptedF, - UnicodeFilter* adoptedG); - - /** - * Returns a UnicodeFilter that implements a short - * circuit OR of the result of the two given filters. That is, if - * f.contains() is true, then g.contains() is - * not called, and contains() returns true. - * @param f may be NULL - * @param g may be NULL - * @result will be NULL if and only if f == g == NULL - * @obsolete ICU 2.8. Use UnicodeSet methods instead since this class will be removed in that release. - */ - static UnicodeFilter* createOr(const UnicodeFilter* f, - const UnicodeFilter* g); - -private: - // Disallow instantiation - UnicodeFilterLogic(); -}; - -inline UnicodeFilterLogic::UnicodeFilterLogic() {} - -U_NAMESPACE_END - -#endif /* #if !UCONFIG_NO_TRANSLITERATION */ - -#endif diff --git a/icuSources/i18n/unicode/unirepl.h b/icuSources/i18n/unicode/unirepl.h index 3ac7cf27..668e42eb 100644 --- a/icuSources/i18n/unicode/unirepl.h +++ b/icuSources/i18n/unicode/unirepl.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (c) 2002, International Business Machines Corporation +* Copyright (c) 2002-2004, International Business Machines Corporation * and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -26,7 +26,7 @@ class UnicodeSet; * *

      This is a mixin class. * @author Alan Liu - * @draft ICU 2.4 + * @stable ICU 2.4 */ class U_I18N_API UnicodeReplacer /* not : public UObject because this is an interface/mixin class */ { @@ -34,9 +34,9 @@ class U_I18N_API UnicodeReplacer /* not : public UObject because this is an inte /** * Destructor. - * @draft ICU 2.4 + * @stable ICU 2.4 */ - virtual inline ~UnicodeReplacer() {}; + virtual ~UnicodeReplacer(); /** * Replace characters in 'text' from 'start' to 'limit' with the @@ -54,7 +54,7 @@ class U_I18N_API UnicodeReplacer /* not : public UObject because this is an inte * of a transliteration rule, at least one must update it. * @return the number of 16-bit code units in the text replacing * the characters at offsets start..(limit-1) in text - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual int32_t replace(Replaceable& text, int32_t start, @@ -73,7 +73,7 @@ class U_I18N_API UnicodeReplacer /* not : public UObject because this is an inte * \\Uxxxxxxxx. Unprintable characters are defined by * Utility.isUnprintable(). * @return a reference to 'result'. - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual UnicodeString& toReplacerPattern(UnicodeString& result, UBool escapeUnprintable) const = 0; @@ -82,7 +82,7 @@ class U_I18N_API UnicodeReplacer /* not : public UObject because this is an inte * Union the set of all characters that may output by this object * into the given set. * @param toUnionTo the set into which to union the output characters - * @draft ICU 2.4 + * @stable ICU 2.4 */ virtual void addReplacementSetTo(UnicodeSet& toUnionTo) const = 0; }; diff --git a/icuSources/i18n/unicode/unum.h b/icuSources/i18n/unicode/unum.h index d8b7b54f..387ed951 100644 --- a/icuSources/i18n/unicode/unum.h +++ b/icuSources/i18n/unicode/unum.h @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 1997-2003, International Business Machines Corporation and others. All Rights Reserved. +* Copyright (C) 1997-2004, International Business Machines Corporation and others. All Rights Reserved. * Modification History: * * Date Name Description @@ -15,6 +15,7 @@ #if !UCONFIG_NO_FORMATTING +#include "unicode/uloc.h" #include "unicode/umisc.h" #include "unicode/parseerr.h" /** @@ -99,9 +100,13 @@ * to get a format for displaying percentages. With this format, a * fraction from 0.53 is displayed as 53%. *

      + * Use a pattern to create either a DecimalFormat or a RuleBasedNumberFormat + * formatter. The pattern must conform to the syntax defined for those + * formatters. + *

      * You can also control the display of numbers with such function as - * unum_getAttribues() and unum_setAtributes(). where in you can set the - * miminum fraction digits, grouping used etc. + * unum_getAttribues() and unum_setAtributes(), which let you set the + * miminum fraction digits, grouping, etc. * @see UNumberFormatAttributes for more details *

      * You can also use forms of the parse and format methods with @@ -126,8 +131,11 @@ typedef void* UNumberFormat; * @stable ICU 2.0 */ typedef enum UNumberFormatStyle { - /** Ignore style specification and open the pattern */ - UNUM_IGNORE=0, + /** + * Decimal format defined by pattern + * @draft ICU 3.0 + */ + UNUM_PATTERN_DECIMAL=0, /** Decimal format */ UNUM_DECIMAL=1, /** Currency format */ @@ -136,10 +144,27 @@ typedef enum UNumberFormatStyle { UNUM_PERCENT, /** Scientific format */ UNUM_SCIENTIFIC, - /** Spellout format */ + /** Spellout rule-based format */ UNUM_SPELLOUT, + /** + * Ordinal rule-based format + * @draft ICU 3.0 + */ + UNUM_ORDINAL, + /** + * Duration rule-based format + * @draft ICU 3.0 + */ + UNUM_DURATION, + /** + * Rule-based format defined by pattern + * @draft ICU 3.0 + */ + UNUM_PATTERN_RULEBASED, /** Default format */ - UNUM_DEFAULT = UNUM_DECIMAL + UNUM_DEFAULT = UNUM_DECIMAL, + /** (Alias for UNUM_PATTERN_DECIMAL) */ + UNUM_IGNORE = UNUM_PATTERN_DECIMAL } UNumberFormatStyle; /** The possible number format rounding modes. @@ -166,24 +191,36 @@ typedef enum UNumberFormatPadPosition { } UNumberFormatPadPosition; /** -* Open a new UNumberFormat for formatting and parsing numbers. -* A UNumberFormat may be used to format numbers in calls to \Ref{unum_format}, -* and to parse numbers in calls to \Ref{unum_parse}. -* @param style The type of number format to open: one of UNUM_DECIMAL, UNUM_CURRENCY, -* UNUM_PERCENT, UNUM_SPELLOUT, UNUM_DEFAULT or UNUM_IGNORE. If UNUM_IGNORE is passed -* then the style specification is ignored and a number format is opened with the pattern. -* @param pattern A pattern specifying the format to use. -* @param patternLength The number of characters in the pattern, or -1 if null-terminated. -* @param locale The locale specifying the formatting conventions -* @param parseErr a pointer to a UParseError struct to receive the -* details of any parsing errors. This parameter may be NULL if no -* parsing error details are desired. -* @param status A pointer to an UErrorCode to receive any errors -* @return A pointer to a UNumberFormat to use for formatting numbers, or 0 if -* an error occurred. -* @see unum_open -* @stable ICU 2.0 -*/ + * Create and return a new UNumberFormat for formatting and parsing + * numbers. A UNumberFormat may be used to format numbers by calling + * {@link #unum_format }, and to parse numbers by calling {@link #unum_parse }. + * The caller must call {@link #unum_close } when done to release resources + * used by this object. + * @param style The type of number format to open: one of + * UNUM_DECIMAL, UNUM_CURRENCY, UNUM_PERCENT, UNUM_SCIENTIFIC, UNUM_SPELLOUT, + * UNUM_PATTERN_DECIMAL, UNUM_PATTERN_RULEBASED, or UNUM_DEFAULT. + * If UNUM_PATTERN_DECIMAL or UNUM_PATTERN_RULEBASED is passed then the + * number format is opened using the given pattern, which must conform + * to the syntax described in DecimalFormat or RuleBasedNumberFormat, + * respectively. + * @param pattern A pattern specifying the format to use. + * This parameter is ignored unless the style is + * UNUM_PATTERN_DECIMAL or UNUM_PATTERN_RULEBASED. + * @param patternLength The number of characters in the pattern, or -1 + * if null-terminated. This parameter is ignored unless the style is + * UNUM_PATTERN. + * @param locale A locale identifier to use to determine formatting + * and parsing conventions, or NULL to use the default locale. + * @param parseErr A pointer to a UParseError struct to receive the + * details of any parsing errors, or NULL if no parsing error details + * are desired. + * @param status A pointer to an input-output UErrorCode. + * @return A pointer to a newly created UNumberFormat, or NULL if an + * error occurred. + * @see unum_close + * @see DecimalFormat + * @stable ICU 2.0 + */ U_CAPI UNumberFormat* U_EXPORT2 unum_open( UNumberFormatStyle style, const UChar* pattern, @@ -227,8 +264,10 @@ unum_clone(const UNumberFormat *fmt, * a field exists. This parameter may be NULL, in which case no field * @param status A pointer to an UErrorCode to receive any errors * @return The total buffer size needed; if greater than resultLength, the output was truncated. +* @see unum_formatInt64 * @see unum_formatDouble * @see unum_parse +* @see unum_parseInt64 * @see unum_parseDouble * @see UFieldPosition * @stable ICU 2.0 @@ -241,6 +280,35 @@ unum_format( const UNumberFormat* fmt, UFieldPosition *pos, UErrorCode* status); +/** +* Format an int64 using a UNumberFormat. +* The int64 will be formatted according to the UNumberFormat's locale. +* @param fmt The formatter to use. +* @param number The number to format. +* @param result A pointer to a buffer to receive the formatted number. +* @param resultLength The maximum size of result. +* @param pos A pointer to a UFieldPosition. On input, position->field +* is read. On output, position->beginIndex and position->endIndex indicate +* the beginning and ending indices of field number position->field, if such +* a field exists. This parameter may be NULL, in which case no field +* @param status A pointer to an UErrorCode to receive any errors +* @return The total buffer size needed; if greater than resultLength, the output was truncated. +* @see unum_format +* @see unum_formatDouble +* @see unum_parse +* @see unum_parseInt64 +* @see unum_parseDouble +* @see UFieldPosition +* @stable ICU 2.0 +*/ +U_CAPI int32_t U_EXPORT2 +unum_formatInt64(const UNumberFormat *fmt, + int64_t number, + UChar* result, + int32_t resultLength, + UFieldPosition *pos, + UErrorCode* status); + /** * Format a double using a UNumberFormat. * The double will be formatted according to the UNumberFormat's locale. @@ -255,7 +323,9 @@ unum_format( const UNumberFormat* fmt, * @param status A pointer to an UErrorCode to receive any errors * @return The total buffer size needed; if greater than resultLength, the output was truncated. * @see unum_format +* @see unum_formatInt64 * @see unum_parse +* @see unum_parseInt64 * @see unum_parseDouble * @see UFieldPosition * @stable ICU 2.0 @@ -268,6 +338,36 @@ unum_formatDouble( const UNumberFormat* fmt, UFieldPosition *pos, /* 0 if ignore */ UErrorCode* status); +/** + * Format a double currency amount using a UNumberFormat. + * The double will be formatted according to the UNumberFormat's locale. + * @param fmt the formatter to use + * @param number the number to format + * @param currency the 3-letter null-terminated ISO 4217 currency code + * @param result a pointer to the buffer to receive the formatted number + * @param resultLength the maximum number of UChars to write to result + * @param pos a pointer to a UFieldPosition. On input, + * position->field is read. On output, position->beginIndex and + * position->endIndex indicate the beginning and ending indices of + * field number position->field, if such a field exists. This + * parameter may be NULL, in which case it is ignored. + * @param status a pointer to an input-output UErrorCode + * @return the total buffer size needed; if greater than resultLength, + * the output was truncated. + * @see unum_formatDouble + * @see unum_parseDoubleCurrency + * @see UFieldPosition + * @draft ICU 3.0 + */ +U_DRAFT int32_t U_EXPORT2 +unum_formatDoubleCurrency(const UNumberFormat* fmt, + double number, + UChar* currency, + UChar* result, + int32_t resultLength, + UFieldPosition* pos, /* ignored if 0 */ + UErrorCode* status); + /** * Parse a string into an integer using a UNumberFormat. * The string will be parsed according to the UNumberFormat's locale. @@ -278,8 +378,10 @@ unum_formatDouble( const UNumberFormat* fmt, * to begin parsing. If not 0, on output the offset at which parsing ended. * @param status A pointer to an UErrorCode to receive any errors * @return The value of the parsed integer +* @see unum_parseInt64 * @see unum_parseDouble * @see unum_format +* @see unum_formatInt64 * @see unum_formatDouble * @stable ICU 2.0 */ @@ -290,6 +392,30 @@ unum_parse( const UNumberFormat* fmt, int32_t *parsePos /* 0 = start */, UErrorCode *status); +/** +* Parse a string into an int64 using a UNumberFormat. +* The string will be parsed according to the UNumberFormat's locale. +* @param fmt The formatter to use. +* @param text The text to parse. +* @param textLength The length of text, or -1 if null-terminated. +* @param parsePos If not 0, on input a pointer to an integer specifying the offset at which +* to begin parsing. If not 0, on output the offset at which parsing ended. +* @param status A pointer to an UErrorCode to receive any errors +* @return The value of the parsed integer +* @see unum_parse +* @see unum_parseDouble +* @see unum_format +* @see unum_formatInt64 +* @see unum_formatDouble +* @draft ICU 2.8 +*/ +U_CAPI int64_t U_EXPORT2 +unum_parseInt64(const UNumberFormat* fmt, + const UChar* text, + int32_t textLength, + int32_t *parsePos /* 0 = start */, + UErrorCode *status); + /** * Parse a string into a double using a UNumberFormat. * The string will be parsed according to the UNumberFormat's locale. @@ -301,7 +427,9 @@ unum_parse( const UNumberFormat* fmt, * @param status A pointer to an UErrorCode to receive any errors * @return The value of the parsed double * @see unum_parse +* @see unum_parseInt64 * @see unum_format +* @see unum_formatInt64 * @see unum_formatDouble * @stable ICU 2.0 */ @@ -313,18 +441,48 @@ unum_parseDouble( const UNumberFormat* fmt, UErrorCode *status); /** -* Set the pattern used by an UNumberFormat. -* The pattern should follow the pattern syntax rules. -* @param format The formatter to set. -* @param localized TRUE if the pattern is localized, FALSE otherwise. -* @param pattern The new pattern -* @param parseError A pointer to UParseError to recieve information about errors -* occurred during parsing. -* @param patternLength The length of pattern, or -1 if null-terminated. -* @param status A pointer to an UErrorCode to receive any errors -* @see unum_toPattern -* @stable ICU 2.0 -*/ + * Parse a string into a double and a currency using a UNumberFormat. + * The string will be parsed according to the UNumberFormat's locale. + * @param fmt the formatter to use + * @param text the text to parse + * @param textLength the length of text, or -1 if null-terminated + * @param parsePos a pointer to an offset index into text at which to + * begin parsing. On output, *parsePos will point after the last + * parsed character. This parameter may be 0, in which case parsing + * begins at offset 0. + * @param currency a pointer to the buffer to receive the parsed null- + * terminated currency. This buffer must have a capacity of at least + * 4 UChars. + * @param status a pointer to an input-output UErrorCode + * @return the parsed double + * @see unum_parseDouble + * @see unum_formatDoubleCurrency + * @draft ICU 3.0 + */ +U_DRAFT double U_EXPORT2 +unum_parseDoubleCurrency(const UNumberFormat* fmt, + const UChar* text, + int32_t textLength, + int32_t* parsePos, /* 0 = start */ + UChar* currency, + UErrorCode* status); + +/** + * Set the pattern used by a UNumberFormat. This can only be used + * on a DecimalFormat, other formats return U_ILLEGAL_ARGUMENT_ERROR + * in the status. + * @param format The formatter to set. + * @param localized TRUE if the pattern is localized, FALSE otherwise. + * @param pattern The new pattern + * @param patternLength The length of pattern, or -1 if null-terminated. + * @param parseError A pointer to UParseError to recieve information + * about errors occurred during parsing, or NULL if no parse error + * information is desired. + * @param status A pointer to an input-output UErrorCode. + * @see unum_toPattern + * @see DecimalFormat + * @stable ICU 2.0 + */ U_CAPI void U_EXPORT2 unum_applyPattern( UNumberFormat *format, UBool localized, @@ -335,9 +493,10 @@ unum_applyPattern( UNumberFormat *format, ); /** -* Get a locale for which number formatting patterns are available. +* Get a locale for which decimal formatting patterns are available. * A UNumberFormat in a locale returned by this function will perform the correct -* formatting and parsing for the locale. +* formatting and parsing for the locale. The results of this call are not +* valid for rule-based number formats. * @param index The index of the desired locale. * @return A locale for which number formatting patterns are available, or 0 if none. * @see unum_countAvailable @@ -347,10 +506,11 @@ U_CAPI const char* U_EXPORT2 unum_getAvailable(int32_t index); /** -* Determine how many locales have number formatting patterns available. -* This function is most useful as determining the loop ending condition for -* calls to \Ref{unum_getAvailable}. -* @return The number of locales for which number formatting patterns are available. +* Determine how many locales have decimal formatting patterns available. The +* results of this call are not valid for rule-based number formats. +* This function is useful for determining the loop ending condition for +* calls to {@link #unum_getAvailable }. +* @return The number of locales for which decimal formatting patterns are available. * @see unum_getAvailable * @stable ICU 2.0 */ @@ -390,7 +550,20 @@ typedef enum UNumberFormatAttribute { /** The position at which padding will take place. */ UNUM_PADDING_POSITION, /** Secondary grouping size */ - UNUM_SECONDARY_GROUPING_SIZE + UNUM_SECONDARY_GROUPING_SIZE, + /** Use significant digits + * @draft ICU 3.0 */ + UNUM_SIGNIFICANT_DIGITS_USED, + /** Minimum significant digits + * @draft ICU 3.0 */ + UNUM_MIN_SIGNIFICANT_DIGITS, + /** Maximum significant digits + * @draft ICU 3.0 */ + UNUM_MAX_SIGNIFICANT_DIGITS, + /** Lenient parse mode used by rule-based formats. + * @draft ICU 3.0 + */ + UNUM_LENIENT_PARSE } UNumberFormatAttribute; /** @@ -415,12 +588,15 @@ unum_getAttribute(const UNumberFormat* fmt, /** * Set a numeric attribute associated with a UNumberFormat. -* An example of a numeric attribute is the number of integer digits a formatter will produce. +* An example of a numeric attribute is the number of integer digits a formatter will produce. If the +* formatter does not understand the attribute, the call is ignored. Rule-based formatters only understand +* the lenient-parse attribute. * @param fmt The formatter to set. * @param attr The attribute to set; one of UNUM_PARSE_INT_ONLY, UNUM_GROUPING_USED, * UNUM_DECIMAL_ALWAYS_SHOWN, UNUM_MAX_INTEGER_DIGITS, UNUM_MIN_INTEGER_DIGITS, UNUM_INTEGER_DIGITS, * UNUM_MAX_FRACTION_DIGITS, UNUM_MIN_FRACTION_DIGITS, UNUM_FRACTION_DIGITS, UNUM_MULTIPLIER, -* UNUM_GROUPING_SIZE, UNUM_ROUNDING_MODE, UNUM_FORMAT_WIDTH, UNUM_PADDING_POSITION, UNUM_SECONDARY_GROUPING_SIZE. +* UNUM_GROUPING_SIZE, UNUM_ROUNDING_MODE, UNUM_FORMAT_WIDTH, UNUM_PADDING_POSITION, UNUM_SECONDARY_GROUPING_SIZE, +* or UNUM_LENIENT_PARSE. * @param newValue The new value of attr. * @see unum_getAttribute * @see unum_getDoubleAttribute @@ -438,6 +614,7 @@ unum_setAttribute( UNumberFormat* fmt, /** * Get a numeric attribute associated with a UNumberFormat. * An example of a numeric attribute is the number of integer digits a formatter will produce. +* If the formatter does not understand the attribute, -1 is returned. * @param fmt The formatter to query. * @param attr The attribute to query; e.g. UNUM_ROUNDING_INCREMENT. * @return The value of attr. @@ -455,6 +632,7 @@ unum_getDoubleAttribute(const UNumberFormat* fmt, /** * Set a numeric attribute associated with a UNumberFormat. * An example of a numeric attribute is the number of integer digits a formatter will produce. +* If the formatter does not understand the attribute, this call is ignored. * @param fmt The formatter to set. * @param attr The attribute to set; e.g. UNUM_ROUNDING_INCREMENT. * @param newValue The new value of attr. @@ -483,15 +661,30 @@ typedef enum UNumberFormatTextAttribute { /** The character used to pad to the format width. */ UNUM_PADDING_CHARACTER, /** The ISO currency code */ - UNUM_CURRENCY_CODE + UNUM_CURRENCY_CODE, + /** + * The default rule set. This is only available with rule-based formatters. + * @draft ICU 3.0 + */ + UNUM_DEFAULT_RULESET, + /** + * The public rule sets. This is only available with rule-based formatters. + * This is a read-only attribute. The public rulesets are returned as a + * single string, with each ruleset name delimited by ';' (semicolon). + * @draft ICU 3.0 + */ + UNUM_PUBLIC_RULESETS } UNumberFormatTextAttribute; /** * Get a text attribute associated with a UNumberFormat. -* An example of a text attribute is the suffix for positive numbers. +* An example of a text attribute is the suffix for positive numbers. If the formatter +* does not understand the attributre, U_UNSUPPORTED_ERROR is returned as the status. +* Rule-based formatters only understand UNUM_DEFAULT_RULESET and UNUM_PUBLIC_RULESETS. * @param fmt The formatter to query. * @param tag The attribute to query; one of UNUM_POSITIVE_PREFIX, UNUM_POSITIVE_SUFFIX, -* UNUM_NEGATIVE_PREFIX, UNUM_NEGATIVE_SUFFIX +* UNUM_NEGATIVE_PREFIX, UNUM_NEGATIVE_SUFFIX, UNUM_PADDING_CHARACTER, UNUM_CURRENCY_CODE, +* UNUM_DEFAULT_RULESET, or UNUM_PUBLIC_RULESETS. * @param result A pointer to a buffer to receive the attribute. * @param resultLength The maximum size of result. * @param status A pointer to an UErrorCode to receive any errors @@ -510,10 +703,12 @@ unum_getTextAttribute( const UNumberFormat* fmt, /** * Set a text attribute associated with a UNumberFormat. -* An example of a text attribute is the suffix for positive numbers. +* An example of a text attribute is the suffix for positive numbers. Rule-based formatters +* only understand UNUM_DEFAULT_RULESET. * @param fmt The formatter to set. * @param tag The attribute to set; one of UNUM_POSITIVE_PREFIX, UNUM_POSITIVE_SUFFIX, -* UNUM_NEGATIVE_PREFIX, UNUM_NEGATIVE_SUFFIX +* UNUM_NEGATIVE_PREFIX, UNUM_NEGATIVE_SUFFIX, UNUM_PADDING_CHARACTER, UNUM_CURRENCY_CODE, +* or UNUM_DEFAULT_RULESET. * @param newValue The new value of attr. * @param newValueLength The length of newValue, or -1 if null-terminated. * @param status A pointer to an UErrorCode to receive any errors @@ -530,16 +725,21 @@ unum_setTextAttribute( UNumberFormat* fmt, UErrorCode *status); /** -* Extract the pattern from a UNumberFormat. -* The pattern will follow the pattern syntax. -* @param fmt The formatter to query. -* @param isPatternLocalized TRUE if the pattern should be localized, FALSE otherwise. -* @param result A pointer to a buffer to receive the pattern. -* @param resultLength The maximum size of result. -* @param status A pointer to an UErrorCode to receive any errors -* @return The total buffer size needed; if greater than resultLength, the output was truncated. -* @stable ICU 2.0 -*/ + * Extract the pattern from a UNumberFormat. The pattern will follow + * the DecimalFormat pattern syntax. + * @param fmt The formatter to query. + * @param isPatternLocalized TRUE if the pattern should be localized, + * FALSE otherwise. This is ignored if the formatter is a rule-based + * formatter. + * @param result A pointer to a buffer to receive the pattern. + * @param resultLength The maximum size of result. + * @param status A pointer to an input-output UErrorCode. + * @return The total buffer size needed; if greater than resultLength, + * the output was truncated. + * @see unum_applyPattern + * @see DecimalFormat + * @stable ICU 2.0 + */ U_CAPI int32_t U_EXPORT2 unum_toPattern( const UNumberFormat* fmt, UBool isPatternLocalized, @@ -587,6 +787,9 @@ typedef enum UNumberFormatSymbol { UNUM_INFINITY_SYMBOL, /** Nan symbol */ UNUM_NAN_SYMBOL, + /** Significant digit symbol + * @draft ICU 3.0 */ + UNUM_SIGNIFICANT_DIGIT_SYMBOL, /** count symbol constants */ UNUM_FORMAT_SYMBOL_COUNT } UNumberFormatSymbol; @@ -594,7 +797,8 @@ typedef enum UNumberFormatSymbol { /** * Get a symbol associated with a UNumberFormat. * A UNumberFormat uses symbols to represent the special locale-dependent -* characters in a number, for example the percent sign. +* characters in a number, for example the percent sign. This API is not +* supported for rule-based formatters. * @param fmt The formatter to query. * @param symbol The UNumberFormatSymbol constant for the symbol to get * @param buffer The string buffer that will receive the symbol string; @@ -607,7 +811,7 @@ typedef enum UNumberFormatSymbol { * @stable ICU 2.0 */ U_CAPI int32_t U_EXPORT2 -unum_getSymbol(UNumberFormat *fmt, +unum_getSymbol(const UNumberFormat *fmt, UNumberFormatSymbol symbol, UChar *buffer, int32_t size, @@ -616,7 +820,8 @@ unum_getSymbol(UNumberFormat *fmt, /** * Set a symbol associated with a UNumberFormat. * A UNumberFormat uses symbols to represent the special locale-dependent -* characters in a number, for example the percent sign. +* characters in a number, for example the percent sign. This API is not +* supported for rule-based formatters. * @param fmt The formatter to set. * @param symbol The UNumberFormatSymbol constant for the symbol to set * @param value The string to set the symbol to @@ -633,27 +838,19 @@ unum_setSymbol(UNumberFormat *fmt, UErrorCode *status); -/******************* Obsolete API ***************************/ /** - * TODO: Remove after Aug 2002 + * Get the locale for this number format object. + * You can choose between valid and actual locale. + * @param fmt The formatter to get the locale from + * @param type type of the locale we're looking for (valid or actual) + * @param status error code for the operation + * @return the locale name + * @draft ICU 2.8 likely to change in ICU 3.0, based on feedback */ -#ifdef U_USE_DEPRECATED_FORMAT_API - -#if ((U_ICU_VERSION_MAJOR_NUM != 2) || (U_ICU_VERSION_MINOR_NUM != 2)) -# error "ICU version has changed. Please redefine the macros under U_USE_DEPRECATED_FORMAT_API pre-processor definition" -#else - static UNumberFormat* - unum_openPattern(const UChar* pattern, int32_t patternLength,const char* locale,UErrorCode* status) - { - return unum_open(0,pattern,patternLength,locale,NULL,status); - } - -# define unum_open_2_2(style,locale,status) unum_open(style, NULL, 0, locale, NULL, status) -# define unum_applyPattern_2_2(format,localized,pattern,patternLength) unum_applyPattern(format,localized,pattern,patternLength,NULL,NULL) -#endif - -#endif -/******************** End ************************************/ +U_CAPI const char* U_EXPORT2 +unum_getLocaleByType(const UNumberFormat *fmt, + ULocDataLocaleType type, + UErrorCode* status); #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/i18n/unicode/uregex.h b/icuSources/i18n/unicode/uregex.h new file mode 100644 index 00000000..5c37bc84 --- /dev/null +++ b/icuSources/i18n/unicode/uregex.h @@ -0,0 +1,630 @@ +/* +********************************************************************** +* Copyright (C) 2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* file name: regex.h +* encoding: US-ASCII +* indentation:4 +* +* created on: 2004mar09 +* created by: Andy Heninger +* +* ICU Regular Expressions, API for C +*/ + +/** + * \file + * \brief C API: Regular Expressions + * + *

      This is a C wrapper around the C++ RegexPattern and RegexMatcher classes.

      + */ + +#ifndef UREGEX_H +#define UREGEX_H + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_REGULAR_EXPRESSIONS + +#include "unicode/parseerr.h" + +#ifndef U_HIDE_DRAFT_API + +struct URegularExpression; +/** + * Structure represeting a compiled regular rexpression, plus the results + * of a match operation. + * @draft ICU 3.0 + */ +typedef struct URegularExpression URegularExpression; + +#endif /* U_HIDE_DRAFT_API */ + + +/** + * Constants for Regular Expression Match Modes. + * @stable ICU 2.4 + */ +typedef enum URegexpFlag{ + /** Forces normalization of pattern and strings. @draft ICU 2.4 */ + UREGEX_CANON_EQ = 128, + + /** Enable case insensitive matching. @stable ICU 2.4 */ + UREGEX_CASE_INSENSITIVE = 2, + + /** Allow white space and comments within patterns @stable ICU 2.4 */ + UREGEX_COMMENTS = 4, + + /** If set, '.' matches line terminators, otherwise '.' matching stops at line end. + * @stable ICU 2.4 */ + UREGEX_DOTALL = 32, + + /** Control behavior of "$" and "^" + * If set, recognize line terminators within string, + * otherwise, match only at start and end of input string. + * @stable ICU 2.4 */ + UREGEX_MULTILINE = 8, + + /** Unicode word boundaries. + * If set, \b uses the Unicode TR 29 definition of word boundaries. + * Warning: Unicode word boundaries are quite different from + * traditional regular expression word boundaries. See + * http://unicode.org/reports/tr29/#Word_Boundaries + * @draft ICU 2.8 + */ + UREGEX_UWORD = 256 +} URegexpFlag; + +/** + * Open (compile) an ICU regular expression. Compiles the regular expression in + * string form into an internal representation using the specified match mode flags. + * The resulting regular expression handle can then be used to perform various + * matching operations. + * + * @param pattern The Regular Expression pattern to be compiled. + * @param patternLength The length of the pattern, or -1 if the pattern is + * NUL termintated. + * @param flags Flags that alter the default matching behavior for + * the regular expression, UREGEX_CASE_INSENSITIVE, for + * example. For default behavior, set this parameter to zero. + * See enum URegexpFlag. All desired flags + * are bitwise-ORed together. + * @param pe Receives the position (line and column nubers) of any syntax + * error within the source regular expression string. If this + * information is not wanted, pass NULL for this parameter. + * @param status Receives error detected by this function. + * @draft ICU 3.0 + * + */ +U_DRAFT URegularExpression * U_EXPORT2 +uregex_open( const UChar *pattern, + int32_t patternLength, + uint32_t flags, + UParseError *pe, + UErrorCode *status); + +/** + * Open (compile) an ICU regular expression. The resulting regular expression + * handle can then be used to perform various matching operations. + *

      + * This function is the same as uregex_open, except that the pattern + * is supplied as an 8 bit char * string in the default code page. + * + * @param pattern The Regular Expression pattern to be compiled, + * NUL termintated. + * @param flags Flags that alter the default matching behavior for + * the regular expression, UREGEX_CASE_INSENSITIVE, for + * example. For default behavior, set this parameter to zero. + * See enum URegexpFlag. All desired flags + * are bitwise-ORed together. + * @param pe Receives the position (line and column nubers) of any syntax + * error within the source regular expression string. If this + * information is not wanted, pass NULL for this parameter. + * @param status Receives errors detected by this function. + * @return The URegularExpression object representing the compiled + * pattern. + * + * @draft ICU 3.0 + */ +U_DRAFT URegularExpression * U_EXPORT2 +uregex_openC( const char *pattern, + uint32_t flags, + UParseError *pe, + UErrorCode *status); + + + + +/** + * Close the regular expression, recovering all resources (memory) it + * was holding. + * + * @param regexp The regular expression to be closed. + * @draft ICU 3.0 + */ +U_DRAFT void U_EXPORT2 +uregex_close(URegularExpression *regexp); + +/** + * Make a copy of a compiled regular expression. Cloning a regular + * expression is faster than opening a second instance from the source + * form of the expression, and requires less memory. + *

      + * Note that the current input string and the position of any matched text + * within it are not cloned; only the pattern itself and and the + * match mode flags are copied. + *

      + * Cloning can be particularly useful to threaded applications that perform + * multiple match operations in parallel. Each concurrent RE + * operation requires its own instance of a URegularExpression. + * + * @param regexp The compiled regular expression to be cloned. + * @param status Receives indication of any errors encountered + * @return the cloned copy of the compiled regular expression. + * @draft ICU 3.0 + */ +U_DRAFT URegularExpression * U_EXPORT2 +uregex_clone(const URegularExpression *regexp, UErrorCode *status); + +/** + * Return a pointer to the source form of the pattern for this regular expression. + * + * @param regexp The compiled regular expression. + * @param patLength This output parameter will be set to the length of the + * pattern string. A NULL pointer may be used here if the + * pattern length is not needed, as would be the case if + * the pattern is known in advance to be a NUL terminated + * string. + * @param status Receives errors detected by this function. + * @return a pointer to the pattern string. The storage for the string is + * owned by the regular expression object, and must not be + * altered or deleted by the application. The returned string + * will remain valid until the regular expression is closed. + * @draft ICU 3.0 + */ +U_DRAFT const UChar * U_EXPORT2 +uregex_pattern(const URegularExpression *regexp, + int32_t *patLength, + UErrorCode *status); + + +/** + * Get the match mode flags that were specified when compiling this regular expression. + * @param status Receives errors detected by this function. + * @param regexp The compiled regular expression. + * @return The match mode flags + * @see URegexpFlag + * @draft ICU 3.0 + */ +U_DRAFT int32_t U_EXPORT2 +uregex_flags(const URegularExpression *regexp, + UErrorCode *status); + + +/** + * Set the subject text string upon which the regular expression will look for matches. + * This function may be called any number of times, allowing the regular + * expression pattern to be applied to different strings. + *

      + * Regular expression matching operations work directly on the application's + * string data. No copy is made. The subject string data must not be + * altered after calling this function until after all regular expression + * operations involving this string data are completed. + *

      + * Zero length strings are permitted. In this case, no subsequent match + * operation will dereference the text string pointer. + * + * @param regexp The compiled regular expression. + * @param text The subject text string. + * @param textLength The length of the subject text, or -1 if the string + * is NUL terminated. + * @param status Receives errors detected by this function. + * @draft ICU 3.0 + */ +U_DRAFT void U_EXPORT2 +uregex_setText(URegularExpression *regexp, + const UChar *text, + int32_t textLength, + UErrorCode *status); + +/** + * Get the subject text that is currently associated with this + * regular expression object. This simply returns whatever string + * pointer was previously supplied via uregex_setText(). + * + * @param regexp The compiled regular expression. + * @param textLength The length of the string is returned in this output parameter. + * A NULL pointer may be used here if the + * text length is not needed, as would be the case if + * the text is known in advance to be a NUL terminated + * string. + * @param status Receives errors detected by this function. + * @return Poiner to the subject text string currently associated with + * this regular expression. + * @draft ICU 3.0 + */ +U_DRAFT const UChar * U_EXPORT2 +uregex_getText(URegularExpression *regexp, + int32_t *textLength, + UErrorCode *status); + +/** + * Attempts to match the input string, beginning at startIndex, against the pattern. + * To succeed, the match must extend to the end of the input string. + * + * @param regexp The compiled regular expression. + * @param startIndex The input string index at which to begin matching. + * @param status Receives errors detected by this function. + * @return TRUE if there is a match + * @draft ICU 3.0 + */ +U_DRAFT UBool U_EXPORT2 +uregex_matches(URegularExpression *regexp, + int32_t startIndex, + UErrorCode *status); + +/** + * Attempts to match the input string, starting from the specified index, against the pattern. + * The match may be of any length, and is not required to extend to the end + * of the input string. Contrast with uregex_matches(). + * + *

      If the match succeeds then more information can be obtained via the + * uregexp_start(), uregexp_end(), + * and uregexp_group() functions.

      + * + * @param regexp The compiled regular expression. + * @param startIndex The input string index at which to begin matching. + * @param status A reference to a UErrorCode to receive any errors. + * @return TRUE if there is a match. + * @draft ICU 3.0 + */ +U_DRAFT UBool U_EXPORT2 +uregex_lookingAt(URegularExpression *regexp, + int32_t startIndex, + UErrorCode *status); + +/** + * Find the first matching substring of the input string that matches the pattern. + * The search for a match begins at the specified index. + * If a match is found, uregex_start(), uregex_end(), and + * uregex_group() will provide more information regarding the match. + * + * @param regexp The compiled regular expression. + * @param startIndex The position in the input string to begin the search + * @param status A reference to a UErrorCode to receive any errors. + * @return TRUE if a match is found. + * @draft ICU 3.0 + */ +U_DRAFT UBool U_EXPORT2 +uregex_find(URegularExpression *regexp, + int32_t startIndex, + UErrorCode *status); + +/** + * Find the next pattern match in the input string. + * Begin searching the input at the location following the end of + * the previous match, or at the start of the string if there is no previous match. + * If a match is found, uregex_start(), uregex_end(), and + * uregex_group() will provide more information regarding the match. + * + * @param regexp The compiled regular expression. + * @param status A reference to a UErrorCode to receive any errors. + * @return TRUE if a match is found. + * @see uregex_reset + * @draft ICU 3.0 + */ +U_DRAFT UBool U_EXPORT2 +uregex_findNext(URegularExpression *regexp, + UErrorCode *status); + +/** + * Get the number of capturing groups in this regular expression's pattern. + * @param regexp The compiled regular expression. + * @param status A reference to a UErrorCode to receive any errors. + * @return the number of capture groups + * @draft ICU 3.0 + */ +U_DRAFT int32_t U_EXPORT2 +uregex_groupCount(URegularExpression *regexp, + UErrorCode *status); + +/** Extract the string for the specified matching expression or subexpression. + * Group #0 is the complete string of matched text. + * Group #1 is the text matched by the first set of capturing parentheses. + * + * @param regexp The compiled regular expression. + * @param groupNum The capture group to extract. Group 0 is the complete + * match. The value of this parameter must be + * less than or equal to the number of capture groups in + * the pattern. + * @param dest Buffer to receive the matching string data + * @param destCapacity Capacity of the dest buffer. + * @param status A reference to a UErrorCode to receive any errors. + * @return Length of matching data, + * or -1 if no applicable match. + * @draft ICU 3.0 + */ +U_DRAFT int32_t U_EXPORT2 +uregex_group(URegularExpression *regexp, + int32_t groupNum, + UChar *dest, + int32_t destCapacity, + UErrorCode *status); + + +/** + * Returns the index in the input string of the start of the text matched by the + * specified capture group during the previous match operation. Return -1 if + * the capture group was not part of the last match. + * Group #0 refers to the complete range of matched text. + * Group #1 refers to the text matched by the first set of capturing parentheses. + * + * @param regexp The compiled regular expression. + * @param groupNum The capture group number + * @param status A reference to a UErrorCode to receive any errors. + * @return the starting position in the input of the text matched + * by the specified group. + * @draft ICU 3.0 + */ +U_DRAFT int32_t U_EXPORT2 +uregex_start(URegularExpression *regexp, + int32_t groupNum, + UErrorCode *status); + +/** + * Returns the index in the input string of the position following the end + * of the text matched by the specified capture group. + * Return -1 if the capture group was not part of the last match. + * Group #0 refers to the complete range of matched text. + * Group #1 refers to the text matched by the first set of capturing parentheses. + * + * @param regexp The compiled regular expression. + * @param groupNum The capture group number + * @param status A reference to a UErrorCode to receive any errors. + * @return the index of the position following the last matched character. + * @draft ICU 3.0 + */ +U_DRAFT int32_t U_EXPORT2 +uregex_end(URegularExpression *regexp, + int32_t groupNum, + UErrorCode *status); + +/** + * Reset any saved state from the previous match. Has the effect of + * causing uregex_findNext to begin at the specified index, and causing + * uregex_start(), uregex_end() and uregex_group() to return an error + * indicating that there is no match information available. + * + * @param regexp The compiled regular expression. + * @param index The position in the text at which a + * uregex_findNext() should begin searching. + * @param status A reference to a UErrorCode to receive any errors. + * @draft ICU 3.0 + */ +U_DRAFT void U_EXPORT2 +uregex_reset(URegularExpression *regexp, + int32_t index, + UErrorCode *status); + +/** + * Replaces every substring of the input that matches the pattern + * with the given replacement string. This is a convenience function that + * provides a complete find-and-replace-all operation. + * + * This method scans the input string looking for matches of the pattern. + * Input that is not part of any match is copied unchanged to the + * destination buffer. Matched regions are replaced in the output + * buffer by the replacement string. The replacement string may contain + * references to capture groups; these take the form of $1, $2, etc. + * + * @param regexp The compiled regular expression. + * @param replacementText A string containing the replacement text. + * @param replacementLength The length of the replacement string, or + * -1 if it is NUL terminated. + * @param destBuf A (UChar *) buffer that will receive the result. + * @param destCapacity The capacity of the desitnation buffer. + * @param status A reference to a UErrorCode to receive any errors. + * @return The length of the string resulting from the find + * and replace operation. In the event that the + * destination capacity is inadequate, the return value + * is still the full length of the untruncated string. + * @draft ICU 3.0 + */ +U_DRAFT int32_t U_EXPORT2 +uregex_replaceAll(URegularExpression *regexp, + UChar *replacementText, + int32_t replacementLength, + UChar *destBuf, + int32_t destCapacity, + UErrorCode *status); + + +/** + * Replaces the first substring of the input that matches the pattern + * with the given replacement string. This is a convenience function that + * provides a complete find-and-replace operation. + * + * This method scans the input string looking for a match of the pattern. + * All input that is not part of the match is copied unchanged to the + * destination buffer. The matched region is replaced in the output + * buffer by the replacement string. The replacement string may contain + * references to capture groups; these take the form of $1, $2, etc. + * + * @param regexp The compiled regular expression. + * @param replacementText A string containing the replacement text. + * @param replacementLength The length of the replacement string, or + * -1 if it is NUL terminated. + * @param destBuf A (UChar *) buffer that will receive the result. + * @param destCapacity The capacity of the desitnation buffer. + * @param status a reference to a UErrorCode to receive any errors. + * @return The length of the string resulting from the find + * and replace operation. In the event that the + * destination capacity is inadequate, the return value + * is still the full length of the untruncated string. + * @draft ICU 3.0 + */ +U_DRAFT int32_t U_EXPORT2 +uregex_replaceFirst(URegularExpression *regexp, + UChar *replacementText, + int32_t replacementLength, + UChar *destBuf, + int32_t destCapacity, + UErrorCode *status); + + +/** + * Implements a replace operation intended to be used as part of an + * incremental find-and-replace. + * + *

      The input string, starting from the end of the previous match and ending at + * the start of the current match, is appended to the destination string. Then the + * replacement string is appended to the output string, + * including handling any substitutions of captured text.

      + * + *

      A note on preflight computation of buffersize and error handling: + * Calls to uregex_appendReplacement() and uregex_appendTail() are + * designed to be chained, one after another, with the destination + * buffer pointer and buffer capacity updated after each in preparation + * to for the next. If the destination buffer is exhausted partway through such a + * sequence, a U_BUFFER_OVERFLOW_ERROR status will be returned. Normal + * ICU conventions are for a function to perform no action if it is + * called with an error status, but for this one case, uregex_appendRepacement() + * will operate normally so that buffer size computations will complete + * correctly. + * + *

      For simple, prepackaged, non-incremental find-and-replace + * operations, see replaceFirst() or replaceAll().

      + * + * @param regexp The regular expression object. + * @param replacementText The string that will replace the matched portion of the + * input string as it is copied to the destination buffer. + * The replacement text may contain references ($1, for + * example) to capture groups from the match. + * @param replacementLength The length of the replacement text string, + * or -1 if the string is NUL terminated. + * @param destBuf The buffer into which the results of the + * find-and-replace are placed. On return, this pointer + * will be updated to refer to the beginning of the + * unused portion of buffer, leaving it in position for + * a subsequent call to this function. + * @param destCapacity The size of the output buffer, On return, this + * parameter will be updated to reflect the space remaining + * unused in the output buffer. + * @param status A reference to a UErrorCode to receive any errors. + * @return The length of the result string. In the event that + * destCapacity is inadequate, the full length of the + * untruncated output string is returned. + * + * @draft ICU 3.0 + * + */ +U_DRAFT int32_t U_EXPORT2 +uregex_appendReplacement(URegularExpression *regexp, + UChar *replacementText, + int32_t replacementLength, + UChar **destBuf, + int32_t *destCapacity, + UErrorCode *status); + + +/** + * As the final step in a find-and-replace operation, append the remainder + * of the input string, starting at the position following the last match, + * to the destination string. uregex_appendTail() is intended + * to be invoked after one or more invocations of the + * uregex_appendReplacement() function. + * + * @param regexp The regular expression object. This is needed to + * obtain the input string and with the position + * of the last match within it. + * @param destBuf The buffer in which the results of the + * find-and-replace are placed. On return, the pointer + * will be updated to refer to the beginning of the + * unused portion of buffer. + * @param destCapacity The size of the output buffer, On return, this + * value will be updated to reflect the space remaining + * unused in the output buffer. + * @param status A reference to a UErrorCode to receive any errors. + * @return The length of the result string. In the event that + * destCapacity is inadequate, the full length of the + * untruncated output string is returned. + * + * @draft ICU 3.0 + */ +U_DRAFT int32_t U_EXPORT2 +uregex_appendTail(URegularExpression *regexp, + UChar **destBuf, + int32_t *destCapacity, + UErrorCode *status); + + + + + /** + * Split a string into fields. Somewhat like split() from Perl. + * The pattern matches identify delimiters that separate the input + * into fields. The input data between the matches becomes the + * fields themselves. + *

      + * Each of the fields is copied from the input string to the destination + * buffer, and the NUL terminated. The position of each field within + * the destination buffer is returned in the destFields array. + * + * @param regexp The compiled regular expression. + * @param destBuf A (UChar *) buffer to receive the fields that + * are extracted from the input string. These + * field pointers will refer to positions within the + * destination buffer supplied by the caller. Any + * extra positions within the destFields array will be + * set to NULL. + * @param destCapacity The capacity of the destBuf. + * @param requiredCapacity The actual capacity required of the destBuf. + * If destCapacity is too small, requiredCapacity will return + * the total capacity required to hold all of the output, and + * a U_BUFFER_OVERFLOW_ERROR will be returned. + * @param destFields An array to be filled with the position of each + * of the extracted fields within destBuf. + * @param destFieldsCapacity The number of elements in the destFields array. + * If the number of fields found is less than destFieldsCapacity, + * the extra destFields elements are set to zero. + * If destFieldsCapacity is too small, the trailing part of the + * input, including any field delimiters, is treated as if it + * were the last field - it is copied to the destBuf, and + * its position is in the destBuf is stored in the last element + * of destFields. This behavior mimics that of Perl. It is not + * an error condition, and no error status is returned when all destField + * positions are used. + * @param status A reference to a UErrorCode to receive any errors. + * @return The number of fields into which the input string was split. + * @draft ICU 3.0 + * + * Note: another choice for the design of this function would be to not + * copy the resulting fields at all, but to return indexes and + * lengths within the source text. + * Advantages would be + * o Faster. No Copying. + * o Nothing extra needed when field data may contain embedded NUL chars. + * o Less memory needed if working on large data. + * Disadvantages + * o Less consistent with C++ split, which copies into an + * array of UnicodeStrings. + * o No NUL termination, extracted fields would be less convenient + * to use in most cases. + * o Possible problems in the future, when support Unicode Normalization + * could cause the fields to not correspond exactly to + * a range of the source text. + */ +U_DRAFT int32_t U_EXPORT2 +uregex_split( URegularExpression *regexp, + UChar *destBuf, + int32_t destCapacity, + int32_t *requiredCapacity, + UChar *destFields[], + int32_t destFieldsCapacity, + UErrorCode *status); + + + +#endif /* !UCONFIG_NO_REGULAR_EXPRESSIONS */ +#endif /* UREGEX_H */ diff --git a/icuSources/i18n/unicode/usearch.h b/icuSources/i18n/unicode/usearch.h index 07243706..61637871 100644 --- a/icuSources/i18n/unicode/usearch.h +++ b/icuSources/i18n/unicode/usearch.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2001-2003 IBM and others. All rights reserved. +* Copyright (C) 2001-2004 IBM and others. All rights reserved. ********************************************************************** * Date Name Description * 06/28/2001 synwee Creation. @@ -197,7 +197,7 @@ typedef enum { * @return search iterator data structure, or NULL if there is an error. * @stable ICU 2.4 */ -U_CAPI UStringSearch * U_EXPORT2 usearch_open(const UChar *pattern, +U_STABLE UStringSearch * U_EXPORT2 usearch_open(const UChar *pattern, int32_t patternlength, const UChar *text, int32_t textlength, @@ -209,6 +209,8 @@ U_CAPI UStringSearch * U_EXPORT2 usearch_open(const UChar *pattern, * Creating a search iterator data struct using the argument collator language * rule set. Note, user retains the ownership of this collator, thus the * responsibility of deletion lies with the user. +* NOTE: string search cannot be instantiated from a collator that has +* collate digits as numbers (CODAN) turned on. * @param pattern for matching * @param patternlength length of the pattern, -1 for null-termination * @param text text string @@ -227,7 +229,7 @@ U_CAPI UStringSearch * U_EXPORT2 usearch_open(const UChar *pattern, * @return search iterator data structure, or NULL if there is an error. * @stable ICU 2.4 */ -U_CAPI UStringSearch * U_EXPORT2 usearch_openFromCollator( +U_STABLE UStringSearch * U_EXPORT2 usearch_openFromCollator( const UChar *pattern, int32_t patternlength, const UChar *text, @@ -242,7 +244,7 @@ U_CAPI UStringSearch * U_EXPORT2 usearch_openFromCollator( * @param searchiter data struct to clean up * @stable ICU 2.4 */ -U_CAPI void U_EXPORT2 usearch_close(UStringSearch *searchiter); +U_STABLE void U_EXPORT2 usearch_close(UStringSearch *searchiter); /* get and set methods -------------------------------------------------- */ @@ -256,12 +258,12 @@ U_CAPI void U_EXPORT2 usearch_close(UStringSearch *searchiter); * header comments * @param strsrch search iterator data struct * @param position position to start next search from. If position is less -* than or greater than the text range for searching, +* than or greater than the text range for searching, * an U_INDEX_OUTOFBOUNDS_ERROR will be returned * @param status error status if any. * @stable ICU 2.4 */ -U_CAPI void U_EXPORT2 usearch_setOffset(UStringSearch *strsrch, +U_STABLE void U_EXPORT2 usearch_setOffset(UStringSearch *strsrch, int32_t position, UErrorCode *status); @@ -273,7 +275,7 @@ U_CAPI void U_EXPORT2 usearch_setOffset(UStringSearch *strsrch, * @see #USEARCH_DONE * @stable ICU 2.4 */ -U_CAPI int32_t U_EXPORT2 usearch_getOffset(const UStringSearch *strsrch); +U_STABLE int32_t U_EXPORT2 usearch_getOffset(const UStringSearch *strsrch); /** * Sets the text searching attributes located in the enum USearchAttribute @@ -286,7 +288,7 @@ U_CAPI int32_t U_EXPORT2 usearch_getOffset(const UStringSearch *strsrch); * @see #usearch_getAttribute * @stable ICU 2.4 */ -U_CAPI void U_EXPORT2 usearch_setAttribute(UStringSearch *strsrch, +U_STABLE void U_EXPORT2 usearch_setAttribute(UStringSearch *strsrch, USearchAttribute attribute, USearchAttributeValue value, UErrorCode *status); @@ -299,7 +301,7 @@ U_CAPI void U_EXPORT2 usearch_setAttribute(UStringSearch *strsrch, * @see #usearch_setAttribute * @stable ICU 2.4 */ -U_CAPI USearchAttributeValue U_EXPORT2 usearch_getAttribute( +U_STABLE USearchAttributeValue U_EXPORT2 usearch_getAttribute( const UStringSearch *strsrch, USearchAttribute attribute); @@ -322,7 +324,7 @@ U_CAPI USearchAttributeValue U_EXPORT2 usearch_getAttribute( * @see #USEARCH_DONE * @stable ICU 2.4 */ -U_CAPI int32_t U_EXPORT2 usearch_getMatchedStart( +U_STABLE int32_t U_EXPORT2 usearch_getMatchedStart( const UStringSearch *strsrch); /** @@ -342,7 +344,7 @@ U_CAPI int32_t U_EXPORT2 usearch_getMatchedStart( * @see #USEARCH_DONE * @stable ICU 2.4 */ -U_CAPI int32_t U_EXPORT2 usearch_getMatchedLength( +U_STABLE int32_t U_EXPORT2 usearch_getMatchedLength( const UStringSearch *strsrch); /** @@ -370,7 +372,7 @@ U_CAPI int32_t U_EXPORT2 usearch_getMatchedLength( * @see #USEARCH_DONE * @stable ICU 2.4 */ -U_CAPI int32_t U_EXPORT2 usearch_getMatchedText(const UStringSearch *strsrch, +U_STABLE int32_t U_EXPORT2 usearch_getMatchedText(const UStringSearch *strsrch, UChar *result, int32_t resultCapacity, UErrorCode *status); @@ -392,7 +394,7 @@ U_CAPI int32_t U_EXPORT2 usearch_getMatchedText(const UStringSearch *strsrch, * @see #usearch_getBreakIterator * @stable ICU 2.4 */ -U_CAPI void U_EXPORT2 usearch_setBreakIterator(UStringSearch *strsrch, +U_STABLE void U_EXPORT2 usearch_setBreakIterator(UStringSearch *strsrch, UBreakIterator *breakiter, UErrorCode *status); @@ -407,7 +409,7 @@ U_CAPI void U_EXPORT2 usearch_setBreakIterator(UStringSearch *strsrch, * @see #usearch_setBreakIterator * @stable ICU 2.4 */ -U_CAPI const UBreakIterator * U_EXPORT2 usearch_getBreakIterator( +U_STABLE const UBreakIterator * U_EXPORT2 usearch_getBreakIterator( const UStringSearch *strsrch); #endif @@ -425,7 +427,7 @@ U_CAPI const UBreakIterator * U_EXPORT2 usearch_getBreakIterator( * @see #usearch_getText * @stable ICU 2.4 */ -U_CAPI void U_EXPORT2 usearch_setText( UStringSearch *strsrch, +U_STABLE void U_EXPORT2 usearch_setText( UStringSearch *strsrch, const UChar *text, int32_t textlength, UErrorCode *status); @@ -438,7 +440,7 @@ U_CAPI void U_EXPORT2 usearch_setText( UStringSearch *strsrch, * @see #usearch_setText * @stable ICU 2.4 */ -U_CAPI const UChar * U_EXPORT2 usearch_getText(const UStringSearch *strsrch, +U_STABLE const UChar * U_EXPORT2 usearch_getText(const UStringSearch *strsrch, int32_t *length); /** @@ -451,7 +453,7 @@ U_CAPI const UChar * U_EXPORT2 usearch_getText(const UStringSearch *strsrch, * @return collator * @stable ICU 2.4 */ -U_CAPI UCollator * U_EXPORT2 usearch_getCollator( +U_STABLE UCollator * U_EXPORT2 usearch_getCollator( const UStringSearch *strsrch); /** @@ -464,7 +466,7 @@ U_CAPI UCollator * U_EXPORT2 usearch_getCollator( * @param status for errors if it occurs * @stable ICU 2.4 */ -U_CAPI void U_EXPORT2 usearch_setCollator( UStringSearch *strsrch, +U_STABLE void U_EXPORT2 usearch_setCollator( UStringSearch *strsrch, const UCollator *collator, UErrorCode *status); @@ -480,7 +482,7 @@ U_CAPI void U_EXPORT2 usearch_setCollator( UStringSearch *strsrch, * done to strsrch. * @stable ICU 2.4 */ -U_CAPI void U_EXPORT2 usearch_setPattern( UStringSearch *strsrch, +U_STABLE void U_EXPORT2 usearch_setPattern( UStringSearch *strsrch, const UChar *pattern, int32_t patternlength, UErrorCode *status); @@ -493,7 +495,7 @@ U_CAPI void U_EXPORT2 usearch_setPattern( UStringSearch *strsrch, * @return pattern string * @stable ICU 2.4 */ -U_CAPI const UChar * U_EXPORT2 usearch_getPattern( +U_STABLE const UChar * U_EXPORT2 usearch_getPattern( const UStringSearch *strsrch, int32_t *length); @@ -514,7 +516,7 @@ U_CAPI const UChar * U_EXPORT2 usearch_getPattern( * @see #USEARCH_DONE * @stable ICU 2.4 */ -U_CAPI int32_t U_EXPORT2 usearch_first(UStringSearch *strsrch, +U_STABLE int32_t U_EXPORT2 usearch_first(UStringSearch *strsrch, UErrorCode *status); /** @@ -538,7 +540,7 @@ U_CAPI int32_t U_EXPORT2 usearch_first(UStringSearch *strsrch, * @see #USEARCH_DONE * @stable ICU 2.4 */ -U_CAPI int32_t U_EXPORT2 usearch_following(UStringSearch *strsrch, +U_STABLE int32_t U_EXPORT2 usearch_following(UStringSearch *strsrch, int32_t position, UErrorCode *status); @@ -557,7 +559,7 @@ U_CAPI int32_t U_EXPORT2 usearch_following(UStringSearch *strsrch, * @see #USEARCH_DONE * @stable ICU 2.4 */ -U_CAPI int32_t U_EXPORT2 usearch_last(UStringSearch *strsrch, +U_STABLE int32_t U_EXPORT2 usearch_last(UStringSearch *strsrch, UErrorCode *status); /** @@ -580,7 +582,7 @@ U_CAPI int32_t U_EXPORT2 usearch_last(UStringSearch *strsrch, * @see #USEARCH_DONE * @stable ICU 2.4 */ -U_CAPI int32_t U_EXPORT2 usearch_preceding(UStringSearch *strsrch, +U_STABLE int32_t U_EXPORT2 usearch_preceding(UStringSearch *strsrch, int32_t position, UErrorCode *status); @@ -601,7 +603,7 @@ U_CAPI int32_t U_EXPORT2 usearch_preceding(UStringSearch *strsrch, * @see #USEARCH_DONE * @stable ICU 2.4 */ -U_CAPI int32_t U_EXPORT2 usearch_next(UStringSearch *strsrch, +U_STABLE int32_t U_EXPORT2 usearch_next(UStringSearch *strsrch, UErrorCode *status); /** @@ -621,7 +623,7 @@ U_CAPI int32_t U_EXPORT2 usearch_next(UStringSearch *strsrch, * @see #USEARCH_DONE * @stable ICU 2.4 */ -U_CAPI int32_t U_EXPORT2 usearch_previous(UStringSearch *strsrch, +U_STABLE int32_t U_EXPORT2 usearch_previous(UStringSearch *strsrch, UErrorCode *status); /** @@ -634,7 +636,7 @@ U_CAPI int32_t U_EXPORT2 usearch_previous(UStringSearch *strsrch, * @see #usearch_first * @stable ICU 2.4 */ -U_CAPI void U_EXPORT2 usearch_reset(UStringSearch *strsrch); +U_STABLE void U_EXPORT2 usearch_reset(UStringSearch *strsrch); #endif /* #if !UCONFIG_NO_COLLATION */ diff --git a/icuSources/i18n/unicode/utmscale.h b/icuSources/i18n/unicode/utmscale.h new file mode 100644 index 00000000..dd3ffb30 --- /dev/null +++ b/icuSources/i18n/unicode/utmscale.h @@ -0,0 +1,459 @@ +/* +******************************************************************************* +* Copyright (C) 2004, International Business Machines Corporation and +* others. All Rights Reserved. +******************************************************************************* +*/ + +#ifndef UTMSCALE_H +#define UTMSCALE_H + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +/** + * \file + * \brief C API: Universal Time Scale + * + * There are quite a few different conventions for binary datetime, depending on different + * platforms and protocols. Some of these have severe drawbacks. For example, people using + * Unix time (seconds since Jan 1, 1970) think that they are safe until near the year 2038. + * But cases can and do arise where arithmetic manipulations causes serious problems. Consider + * the computation of the average of two datetimes, for example: if one calculates them with + * averageTime = (time1 + time2)/2, there will be overflow even with dates + * around the present. Moreover, even if these problems don't occur, there is the issue of + * conversion back and forth between different systems. + * + *

      + * Binary datetimes differ in a number of ways: the datatype, the unit, + * and the epoch (origin). We'll refer to these as time scales. For example: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
      Table 1: Binary Time Scales
      SourceDatatypeUnitEpoch
      JAVA_TIMEint64_tmillisecondsJan 1, 1970
      UNIX_TIMEint32_t or int64_tsecondsJan 1, 1970
      ICU4C_TIMEdoublemillisecondsJan 1, 1970
      WINDOWS_FILE_TIMEint64_tticks (100 nanoseconds)Jan 1, 1601
      WINDOWS_DATE_TIMEint64_tticks (100 nanoseconds)Jan 1, 0001
      MAC_OLD_TIMEint32_tsecondsJan 1, 1904
      MAC_TIMEdoublesecondsJan 1, 2001
      EXCEL_TIME?daysDec 31, 1899
      DB2_TIME?daysDec 31, 1899
      + * + *

      + * All of the epochs start at 00:00 am (the earliest possible time on the day in question), + * and are assumed to be UTC. + * + *

      + * The ranges for different datatypes are given in the following table (all values in years). + * The range of years includes the entire range expressible with positive and negative + * values of the datatype. The range of years for double is the range that would be allowed + * without losing precision to the corresponding unit. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
      Unitsint64_tdoubleint32_t
      1 sec5.84542x1011285,420,920.94136.10
      1 millisecond584,542,046.09285,420.920.14
      1 microsecond584,542.05285.420.00
      100 nanoseconds (tick)58,454.2028.540.00
      1 nanosecond584.54204610.28540.00
      + * + *

      + * These functions implement a universal time scale which can be used as a 'pivot', + * and provide conversion functions to and from all other major time scales. + * This datetimes to be converted to the pivot time, safely manipulated, + * and converted back to any other datetime time scale. + * + *

      + * So what to use for this pivot? Java time has plenty of range, but cannot represent + * Windows datetimes without severe loss of precision. ICU4C time addresses this by using a + * double that is otherwise equivalent to the Java time. However, there are disadvantages + * with doubles. They provide for much more graceful degradation in arithmetic operations. + * But they only have 53 bits of accuracy, which means that they will lose precision when + * converting back and forth to ticks. What would really be nice would be a + * long double (80 bits -- 64 bit mantissa), but that is not supported on most systems. + * + *

      + * The Unix extended time uses a structure with two components: time in seconds and a + * fractional field (microseconds). However, this is clumsy, slow, and + * prone to error (you always have to keep track of overflow and underflow in the + * fractional field). BigDecimal would allow for arbitrary precision and arbitrary range, + * but we do not want to use this as the normal type, because it is slow and does not + * have a fixed size. + * + *

      + * Because of these issues, we ended up concluding that the Windows datetime would be the + * best pivot. However, we use the full range allowed by the datatype, allowing for + * datetimes back to 29,000 BC and up to 29,000 AD. This time scale is very fine grained, + * does not lose precision, and covers a range that will meet almost all requirements. + * It will not handle the range that Java times do, but frankly, being able to handle dates + * before 29,000 BC or after 29,000 AD is of very limited interest. + * + */ + +/** + * UDateTimeScale values are used to specify the time scale used for + * conversion into or out if the universal time scale. + * + * @draft ICU 3.2 + */ +typedef enum UDateTimeScale { + /** + * Used in the JDK. Data is a Java long (int64_t). Value + * is milliseconds since January 1, 1970. + * + * @draft ICU 3.2 + */ + UDTS_JAVA_TIME = 0, + + /** + * Used on Unix systems. Data is int32_t or int64_t. Value + * is seconds since January 1, 1970. + * + * @draft ICU 3.2 + */ + UDTS_UNIX_TIME, + + /** + * Used in IUC4C. Data is a double. Value + * is milliseconds since January 1, 1970. + * + * @draft ICU 3.2 + */ + UDTS_ICU4C_TIME, + + /** + * Used in Windows for file times. Data is an int64_t. Value + * is ticks (1 tick == 100 nanoseconds) since January 1, 1601. + * + * @draft ICU 3.2 + */ + UDTS_WINDOWS_FILE_TIME, + + /** + * Used in Windows for dates and times (?). Data is an int64_t. Value + * is ticks (1 tick == 100 nanoseconds) since January 1, 0001. + * + * @draft ICU 3.2 + */ + UDTS_WINDOWS_DATE_TIME, + + /** + * Used in older Macintosh systems. Data is an int32_t. Value + * is seconds since January 1, 1904. + * + * @draft ICU 3.2 + */ + UDTS_MAC_OLD_TIME, + + /** + * Used in newer Macintosh systems. Data is a double. Value + * is seconds since January 1, 2001. + * + * @draft ICU 3.2 + */ + UDTS_MAC_TIME, + + /** + * Used in Excel. Data is an ?unknown?. Value + * is days since December 31, 1899. + * + * @draft ICU 3.2 + */ + UDTS_EXCEL_TIME, + + /** + * Used in DB2. Data is an ?unknown?. Value + * is days since December 31, 1899. + * + * @draft ICU 3.2 + */ + UDTS_DB2_TIME, + + /** + * The first unused time scale value. + * + * @draft ICU 3.2 + */ + UDTS_MAX_SCALE +} UDateTimeScale; + +typedef enum UTimeScaleValue { + /** + * The constant used to select the units vale + * for a time scale. + * + * @see utms_getTimeScaleValue + * + * @draft ICU 3.2 + */ + UTSV_UNITS_VALUE = 0, + + /** + * The constant used to select the epoch offset value + * for a time scale. + * + * @see utms_getTimeScaleValue + * + * @draft ICU 3.2 + */ + UTSV_EPOCH_OFFSET_VALUE, + + /** + * The constant used to select the minimum from value + * for a time scale. + * + * @see utms_getTimeScaleValue + * + * @draft ICU 3.2 + */ + UTSV_FROM_MIN_VALUE, + + /** + * The constant used to select the maximum from value + * for a time scale. + * + * @see utms_getTimeScaleValue + * + * @draft ICU 3.2 + */ + UTSV_FROM_MAX_VALUE, + + /** + * The constant used to select the minimum to value + * for a time scale. + * + * @see utms_getTimeScaleValue + * + * @draft ICU 3.2 + */ + UTSV_TO_MIN_VALUE, + + /** + * The constant used to select the maximum to value + * for a time scale. + * + * @see utms_getTimeScaleValue + * + * @draft ICU 3.2 + */ + UTSV_TO_MAX_VALUE, + + /** + * The constant used to select the epoch plus one value + * for a time scale. + * + * NOTE: This is an internal value. DO NOT USE IT. May not + * actually be equal to the epoch offset value plus one. + * + * @see utms_getTimeScaleValue + * + * @draft ICU 3.2 + */ + UTSV_EPOCH_OFFSET_PLUS_1_VALUE, + + /** + * The constant used to select the epoch plus one value + * for a time scale. + * + * NOTE: This is an internal value. DO NOT USE IT. May not + * actually be equal to the epoch offset value plus one. + * + * @see utms_getTimeScaleValue + * + * @draft ICU 3.2 + */ + UTSV_EPOCH_OFFSET_MINUS_1_VALUE, + + /** + * The constant used to select the units round value + * for a time scale. + * + * NOTE: This is an internal value. DO NOT USE IT. + * + * @see utms_getTimeScaleValue + * + * @internal + */ + UTSV_UNITS_ROUND_VALUE, + + /** + * The constant used to select the minimum safe rounding value + * for a time scale. + * + * NOTE: This is an internal value. DO NOT USE IT. + * + * @see utms_getTimeScaleValue + * + * @internal + */ + UTSV_MIN_ROUND_VALUE, + + /** + * The constant used to select the maximum safe rounding value + * for a time scale. + * + * NOTE: This is an internal value. DO NOT USE IT. + * + * @see utms_getTimeScaleValue + * + * @internal + */ + UTSV_MAX_ROUND_VALUE, + + /** + * The number of time scale values. + * + * NOTE: This is an internal value. DO NOT USE IT. + * + * @see utms_getTimeScaleValue + * + * @internal + */ + UTSV_MAX_SCALE_VALUE +} UTimeScaleValue; + +/** + * Get a value associated with a particular time scale. + * + * @param timeScale The time scale + * @param value A constant representing the value to get + * @param status The status code. Set to U_ILLEGAL_ARGUMENT_ERROR if arguments are invalid. + * @return - the value. + * + * @draft ICU 3.2 + */ +U_DRAFT int64_t U_EXPORT2 + utmscale_getTimeScaleValue(UDateTimeScale timeScale, UTimeScaleValue value, UErrorCode *status); + +/* Conversion to 'universal time scale' */ + +/** + * Convert a int64_t datetime from the given time scale to the universal time scale. + * + * @param otherTime The int64_t datetime + * @param timeScale The time scale to convert from + * @param status The status code. Set to U_ILLEGAL_ARGUMENT_ERROR if the conversion is out of range. + * + * @return The datetime converted to the universal time scale + * + * @draft ICU 3.2 + */ +U_DRAFT int64_t U_EXPORT2 + utmscale_fromInt64(int64_t otherTime, UDateTimeScale timeScale, UErrorCode *status); + +/* Conversion from 'universal time scale' */ + +/** + * Convert a datetime from the universal time scale to a int64_t in the given time scale. + * + * @param universalTime The datetime in the universal time scale + * @param timeScale The time scale to convert to + * @param status The status code. Set to U_ILLEGAL_ARGUMENT_ERROR if the conversion is out of range. + * + * @return The datetime converted to the given time scale + * + * @draft ICU 3.2 + */ +U_DRAFT int64_t U_EXPORT2 + utmscale_toInt64(int64_t universalTime, UDateTimeScale timeScale, UErrorCode *status); + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif + diff --git a/icuSources/i18n/unicode/utrans.h b/icuSources/i18n/unicode/utrans.h index 6d5986c0..dc0597ee 100644 --- a/icuSources/i18n/unicode/utrans.h +++ b/icuSources/i18n/unicode/utrans.h @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 1997-2003, International Business Machines +* Copyright (C) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************* * Date Name Description @@ -17,6 +17,7 @@ #include "unicode/urep.h" #include "unicode/parseerr.h" +#include "unicode/uenum.h" /******************************************************************** * General Notes @@ -37,6 +38,18 @@ * services are available to C code through this header. In order to * access more complex transliteration services, refer to the C++ * headers and documentation. + * + * There are two sets of functions for working with transliterator IDs: + * + * An old, deprecated set uses char * IDs, which works for true and pure + * identifiers that these APIs were designed for, + * for example "Cyrillic-Latin". + * It does not work when the ID contains filters ("[:Script=Cyrl:]") + * or even a complete set of rules because then the ID string contains more + * than just "invariant" characters (see utypes.h). + * + * A new set of functions replaces the old ones and uses UChar * IDs, + * paralleling the UnicodeString IDs in the C++ API. (New in ICU 2.8.) */ /******************************************************************** @@ -63,16 +76,16 @@ typedef void* UTransliterator; typedef enum UTransDirection { /** - * UTRANS_FORWARD means from to for a - * transliterator with ID -. For a transliterator + * UTRANS_FORWARD means from <source> to <target> for a + * transliterator with ID <source>-<target>. For a transliterator * opened using a rule, it means forward direction rules, e.g., * "A > B". */ UTRANS_FORWARD, /** - * UTRANS_REVERSE means from to for a - * transliterator with ID -. For a transliterator + * UTRANS_REVERSE means from <target> to <source> for a + * transliterator with ID <source>-<target>. For a transliterator * opened using a rule, it means reverse direction rules, e.g., * "A < B". */ @@ -110,7 +123,7 @@ typedef struct UTransPosition { * anything before this index. INPUT/OUTPUT parameter: This parameter * is updated by a transliteration operation to reflect the maximum * amount of antecontext needed by a transliterator. - * @draft ICU 2.4 + * @stable ICU 2.4 */ int32_t contextStart; @@ -120,7 +133,7 @@ typedef struct UTransPosition { * anything at or after this index. INPUT/OUTPUT parameter: This * parameter is updated to reflect changes in the length of the * text, but points to the same logical position in the text. - * @draft ICU 2.4 + * @stable ICU 2.4 */ int32_t contextLimit; @@ -129,7 +142,7 @@ typedef struct UTransPosition { * INPUT/OUTPUT parameter: This parameter is advanced past * characters that have already been transliterated by a * transliteration operation. - * @draft ICU 2.4 + * @stable ICU 2.4 */ int32_t start; @@ -138,7 +151,7 @@ typedef struct UTransPosition { * INPUT/OUTPUT parameter: This parameter is updated to reflect * changes in the length of the text, but points to the same * logical position in the text. - * @draft ICU 2.4 + * @stable ICU 2.4 */ int32_t limit; @@ -155,29 +168,30 @@ typedef struct UTransPosition { * Any non-NULL result from this function should later be closed with * utrans_close(). * - * @param id a valid ID, as returned by utrans_getAvailableID() + * @param id a valid transliterator ID + * @param idLength the length of the ID string, or -1 if NUL-terminated * @param dir the desired direction - * @param rules the transliterator rules. See the C++ header rbt.h - * for rules syntax. If NULL then a system transliterator matching - * the ID is returned. + * @param rules the transliterator rules. See the C++ header rbt.h for + * rules syntax. If NULL then a system transliterator matching + * the ID is returned. * @param rulesLength the length of the rules, or -1 if the rules - * are zero-terminated. - * @param dir the desired direction - * @param parseError a pointer to a UParseError struct to receive the - * details of any parsing errors. This parameter may be NULL if no - * parsing error details are desired. - * @param status a pointer to the UErrorCode + * are NUL-terminated. + * @param parseError a pointer to a UParseError struct to receive the details + * of any parsing errors. This parameter may be NULL if no + * parsing error details are desired. + * @param pErrorCode a pointer to the UErrorCode * @return a transliterator pointer that may be passed to other - * utrans_xxx() functions, or NULL if the open call fails. - * @stable ICU 2.0 + * utrans_xxx() functions, or NULL if the open call fails. + * @draft ICU 2.8 */ -U_CAPI UTransliterator* U_EXPORT2 -utrans_open(const char* id, - UTransDirection dir, - const UChar* rules, /* may be Null */ - int32_t rulesLength, /* -1 if null-terminated */ - UParseError* parseError, /* may be Null */ - UErrorCode* status); +U_DRAFT UTransliterator* U_EXPORT2 +utrans_openU(const UChar *id, + int32_t idLength, + UTransDirection dir, + const UChar *rules, + int32_t rulesLength, + UParseError *parseError, + UErrorCode *pErrorCode); /** * Open an inverse of an existing transliterator. For this to work, @@ -194,7 +208,7 @@ utrans_open(const char* id, * inverse of trans, or NULL if the open call fails. * @stable ICU 2.0 */ -U_CAPI UTransliterator* U_EXPORT2 +U_STABLE UTransliterator* U_EXPORT2 utrans_openInverse(const UTransliterator* trans, UErrorCode* status); @@ -208,7 +222,7 @@ utrans_openInverse(const UTransliterator* trans, * utrans_xxx() functions, or NULL if the clone call fails. * @stable ICU 2.0 */ -U_CAPI UTransliterator* U_EXPORT2 +U_STABLE UTransliterator* U_EXPORT2 utrans_clone(const UTransliterator* trans, UErrorCode* status); @@ -218,27 +232,26 @@ utrans_clone(const UTransliterator* trans, * @param trans the transliterator to be closed. * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 utrans_close(UTransliterator* trans); /** * Return the programmatic identifier for this transliterator. - * If this identifier is passed to utrans_open(), it will open + * If this identifier is passed to utrans_openU(), it will open * a transliterator equivalent to this one, if the ID has been * registered. + * * @param trans the transliterator to return the ID of. - * @param buf the buffer in which to receive the ID. This may be - * NULL, in which case no characters are copied. - * @param bufCapacity the capacity of the buffer. Ignored if buf is - * NULL. - * @return the actual length of the ID, not including - * zero-termination. This may be greater than bufCapacity. - * @stable ICU 2.0 + * @param resultLength pointer to an output variable receiving the length + * of the ID string; can be NULL + * @return the NUL-terminated ID string. This pointer remains + * valid until utrans_close() is called on this transliterator. + * + * @draft ICU 2.8 */ -U_CAPI int32_t U_EXPORT2 -utrans_getID(const UTransliterator* trans, - char* buf, - int32_t bufCapacity); +U_DRAFT const UChar * U_EXPORT2 +utrans_getUnicodeID(const UTransliterator *trans, + int32_t *resultLength); /** * Register an open transliterator with the system. When @@ -254,20 +267,21 @@ utrans_getID(const UTransliterator* trans, * @param status a pointer to the UErrorCode * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 utrans_register(UTransliterator* adoptedTrans, UErrorCode* status); /** * Unregister a transliterator from the system. After this call the * system will no longer recognize the given ID when passed to - * utrans_open(). If the id is invalid then nothing is done. + * utrans_open(). If the ID is invalid then nothing is done. * - * @param id a zero-terminated ID - * @stable ICU 2.0 + * @param id an ID to unregister + * @param idLength the length of id, or -1 if id is zero-terminated + * @draft ICU 2.8 */ -U_CAPI void U_EXPORT2 -utrans_unregister(const char* id); +U_DRAFT void U_EXPORT2 +utrans_unregisterID(const UChar* id, int32_t idLength); /** * Set the filter used by a transliterator. A filter can be used to @@ -287,7 +301,7 @@ utrans_unregister(const char* id); * @see UnicodeSet * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 utrans_setFilter(UTransliterator* trans, const UChar* filterPattern, int32_t filterPatternLen, @@ -295,33 +309,25 @@ utrans_setFilter(UTransliterator* trans, /** * Return the number of system transliterators. + * It is recommended to use utrans_openIDs() instead. + * * @return the number of system transliterators. * @stable ICU 2.0 */ -U_CAPI int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 utrans_countAvailableIDs(void); /** - * Return the ID of the index-th system transliterator. The result - * is placed in the given buffer. If the given buffer is too small, - * the initial substring is copied to buf. The result in buf is - * always zero-terminated. + * Return a UEnumeration for the available transliterators. * - * @param index the number of the transliterator to return. Must - * satisfy 0 <= index < utrans_countAvailableIDs(). If index is out - * of range then it is treated as if it were 0. - * @param buf the buffer in which to receive the ID. This may be - * NULL, in which case no characters are copied. - * @param bufCapacity the capacity of the buffer. Ignored if buf is - * NULL. - * @return the actual length of the index-th ID, not including - * zero-termination. This may be greater than bufCapacity. - * @stable ICU 2.0 + * @param pErrorCode Pointer to the UErrorCode in/out parameter. + * @return UEnumeration for the available transliterators. + * Close with uenum_close(). + * + * @draft ICU 2.8 */ -U_CAPI int32_t U_EXPORT2 -utrans_getAvailableID(int32_t index, - char* buf, - int32_t bufCapacity); +U_DRAFT UEnumeration * U_EXPORT2 +utrans_openIDs(UErrorCode *pErrorCode); /******************************************************************** * Transliteration API @@ -350,7 +356,7 @@ utrans_getAvailableID(int32_t index, * @param status a pointer to the UErrorCode * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 utrans_trans(const UTransliterator* trans, UReplaceable* rep, UReplaceableCallbacks* repFunc, @@ -401,7 +407,7 @@ utrans_trans(const UTransliterator* trans, * @param status a pointer to the UErrorCode * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 utrans_transIncremental(const UTransliterator* trans, UReplaceable* rep, UReplaceableCallbacks* repFunc, @@ -439,7 +445,7 @@ utrans_transIncremental(const UTransliterator* trans, * @param status a pointer to the UErrorCode * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 utrans_transUChars(const UTransliterator* trans, UChar* text, int32_t* textLength, @@ -474,7 +480,7 @@ utrans_transUChars(const UTransliterator* trans, * @see utrans_transIncremental * @stable ICU 2.0 */ -U_CAPI void U_EXPORT2 +U_STABLE void U_EXPORT2 utrans_transIncrementalUChars(const UTransliterator* trans, UChar* text, int32_t* textLength, @@ -482,32 +488,95 @@ utrans_transIncrementalUChars(const UTransliterator* trans, UTransPosition* pos, UErrorCode* status); +/* deprecated API ----------------------------------------------------------- */ + +/* see utrans.h documentation for why these functions are deprecated */ -/********************* Obsolete API ************************************/ /** - * TODO: Remove after Aug 2002 + * Deprecated, use utrans_openU() instead. + * Open a custom transliterator, given a custom rules string + * OR + * a system transliterator, given its ID. + * Any non-NULL result from this function should later be closed with + * utrans_close(). + * + * @param id a valid ID, as returned by utrans_getAvailableID() + * @param dir the desired direction + * @param rules the transliterator rules. See the C++ header rbt.h + * for rules syntax. If NULL then a system transliterator matching + * the ID is returned. + * @param rulesLength the length of the rules, or -1 if the rules + * are zero-terminated. + * @param parseError a pointer to a UParseError struct to receive the + * details of any parsing errors. This parameter may be NULL if no + * parsing error details are desired. + * @param status a pointer to the UErrorCode + * @return a transliterator pointer that may be passed to other + * utrans_xxx() functions, or NULL if the open call fails. + * @deprecated ICU 2.8 Use utrans_openU() instead, see utrans.h */ +U_DEPRECATED UTransliterator* U_EXPORT2 +utrans_open(const char* id, + UTransDirection dir, + const UChar* rules, /* may be Null */ + int32_t rulesLength, /* -1 if null-terminated */ + UParseError* parseError, /* may be Null */ + UErrorCode* status); -#ifdef U_USE_DEPRECATED_FORMAT_API - -#if ((U_ICU_VERSION_MAJOR_NUM != 2) || (U_ICU_VERSION_MINOR_NUM != 2)) -# error "ICU version has changed. Please redefine the macros under U_USE_DEPRECATED_FORMAT_API pre-processor definition" -#else - U_CAPI UTransliterator* U_EXPORT2 - utrans_openRules(const char* id, - const UChar* rules, - int32_t rulesLength, /* -1 if null-terminated */ - UTransDirection dir, - UParseError* parseErr, /* may be NULL */ - UErrorCode* status){ - return utrans_open(id,dir,rules,rulesLength,parseErr,status); - } +/** + * Deprecated, use utrans_getUnicodeID() instead. + * Return the programmatic identifier for this transliterator. + * If this identifier is passed to utrans_open(), it will open + * a transliterator equivalent to this one, if the ID has been + * registered. + * @param trans the transliterator to return the ID of. + * @param buf the buffer in which to receive the ID. This may be + * NULL, in which case no characters are copied. + * @param bufCapacity the capacity of the buffer. Ignored if buf is + * NULL. + * @return the actual length of the ID, not including + * zero-termination. This may be greater than bufCapacity. + * @deprecated ICU 2.8 Use utrans_getUnicodeID() instead, see utrans.h + */ +U_DEPRECATED int32_t U_EXPORT2 +utrans_getID(const UTransliterator* trans, + char* buf, + int32_t bufCapacity); -# define utrans_open_2_2(id,dir,status) utrans_open(id,dir,NULL,0,NULL,status) +/** + * Deprecated, use utrans_unregisterID() instead. + * Unregister a transliterator from the system. After this call the + * system will no longer recognize the given ID when passed to + * utrans_open(). If the id is invalid then nothing is done. + * + * @param id a zero-terminated ID + * @deprecated ICU 2.8 Use utrans_unregisterID() instead, see utrans.h + */ +U_DEPRECATED void U_EXPORT2 +utrans_unregister(const char* id); -#endif -#endif -/********************* End **********************************************/ +/** + * Deprecated, use utrans_openIDs() instead. + * Return the ID of the index-th system transliterator. The result + * is placed in the given buffer. If the given buffer is too small, + * the initial substring is copied to buf. The result in buf is + * always zero-terminated. + * + * @param index the number of the transliterator to return. Must + * satisfy 0 <= index < utrans_countAvailableIDs(). If index is out + * of range then it is treated as if it were 0. + * @param buf the buffer in which to receive the ID. This may be + * NULL, in which case no characters are copied. + * @param bufCapacity the capacity of the buffer. Ignored if buf is + * NULL. + * @return the actual length of the index-th ID, not including + * zero-termination. This may be greater than bufCapacity. + * @deprecated ICU 2.8 Use utrans_openIDs() instead, see utrans.h + */ +U_DEPRECATED int32_t U_EXPORT2 +utrans_getAvailableID(int32_t index, + char* buf, + int32_t bufCapacity); #endif /* #if !UCONFIG_NO_TRANSLITERATION */ diff --git a/icuSources/i18n/unifltlg.cpp b/icuSources/i18n/unifltlg.cpp deleted file mode 100644 index b010ae75..00000000 --- a/icuSources/i18n/unifltlg.cpp +++ /dev/null @@ -1,200 +0,0 @@ -/* -********************************************************************** -* Copyright (C) 1999-2001, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -* Date Name Description -* 11/17/99 aliu Creation. -********************************************************************** -*/ - -////////////////////////////////////////////////////////////// -// -// NOTICE - Do not use -// -// This entire file has been deprecated as of ICU 2.4. -// -////////////////////////////////////////////////////////////// - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_TRANSLITERATION - -#include "unicode/unifltlg.h" -#include "unicode/unifilt.h" - -U_NAMESPACE_BEGIN - -/** - * This class stubs out UnicodeMatcher API that we don't implement. - */ -class _UF: public UnicodeFilter { - - // Stubs - virtual UnicodeString& toPattern(UnicodeString& result, - UBool escapeUnprintable) const { - return result; - } - virtual UBool matchesIndexValue(uint8_t v) const { - return FALSE; - } - virtual void addMatchSetTo(UnicodeSet& toUnionTo) const {} -}; - -/** - * A NullFilter always returns a fixed value, either TRUE or FALSE. - * A filter value of 0 (that is, a UnicodeFilter* f, where f == 0) - * is equivalent to a NullFilter(TRUE). - */ -static const char gNullFilterClassID = 0; -class NullFilter : public _UF { - UBool result; -public: - virtual UClassID getDynamicClassID() const { return getStaticClassID(); } - static inline UClassID getStaticClassID() { return (UClassID)&gNullFilterClassID; } - NullFilter(UBool r) { result = r; } - NullFilter(const NullFilter& f) : _UF(f) { result = f.result; } - virtual ~NullFilter() {} - virtual UBool contains(UChar32 /*c*/) const { return result; } - virtual UnicodeFunctor* clone() const { return new NullFilter(*this); } -}; - -static const char gUnicodeNotFilterClassID = 0; -class UnicodeNotFilter : public _UF { - UnicodeFilter* filt; -public: - virtual UClassID getDynamicClassID() const { return getStaticClassID(); } - static inline UClassID getStaticClassID() { return (UClassID)&gUnicodeNotFilterClassID; } - UnicodeNotFilter(UnicodeFilter* adopted); - UnicodeNotFilter(const UnicodeNotFilter&); - virtual ~UnicodeNotFilter(); - virtual UBool contains(UChar32 c) const; - virtual UnicodeFunctor* clone() const; -}; - -UnicodeNotFilter::UnicodeNotFilter(UnicodeFilter* adopted) : filt(adopted) {} -UnicodeNotFilter::UnicodeNotFilter(const UnicodeNotFilter& f) - : _UF(f), filt((UnicodeFilter*) f.filt->clone()) {} -UnicodeNotFilter::~UnicodeNotFilter() { delete filt; } -UBool UnicodeNotFilter::contains(UChar32 c) const { return !filt->contains(c); } -UnicodeFunctor* UnicodeNotFilter::clone() const { return new UnicodeNotFilter(*this); } - -/** - * Returns a UnicodeFilter that implements the inverse of - * the given filter. - */ -UnicodeFilter* UnicodeFilterLogic::createNot(const UnicodeFilter* f) { - if (f == 0) { - return new NullFilter(FALSE); - } else { - return new UnicodeNotFilter((UnicodeFilter*)f->clone()); - } -} - -static const char gUnicodeAndFilterClassID = 0; -class UnicodeAndFilter : public _UF { - UnicodeFilter* filt1; - UnicodeFilter* filt2; -public: - virtual UClassID getDynamicClassID() const { return getStaticClassID(); } - static inline UClassID getStaticClassID() { return (UClassID)&gUnicodeAndFilterClassID; } - UnicodeAndFilter(UnicodeFilter* adopted1, UnicodeFilter* adopted2); - UnicodeAndFilter(const UnicodeAndFilter&); - virtual ~UnicodeAndFilter(); - virtual UBool contains(UChar32 c) const; - virtual UnicodeFunctor* clone() const; -}; - -UnicodeAndFilter::UnicodeAndFilter(UnicodeFilter* f1, UnicodeFilter* f2) : filt1(f1), filt2(f2) {} -UnicodeAndFilter::UnicodeAndFilter(const UnicodeAndFilter& f) - : _UF(f), filt1((UnicodeFilter*)f.filt1->clone()), filt2((UnicodeFilter*)f.filt2->clone()) {} -UnicodeAndFilter::~UnicodeAndFilter() { delete filt1; delete filt2; } -UBool UnicodeAndFilter::contains(UChar32 c) const { return filt1->contains(c) && filt2->contains(c); } -UnicodeFunctor* UnicodeAndFilter::clone() const { return new UnicodeAndFilter(*this); } - -/** - * Returns a UnicodeFilter that implements a short - * circuit AND of the result of the two given filters. That is, - * if f.contains() is false, then g.contains() - * is not called, and contains() returns false. - */ -UnicodeFilter* UnicodeFilterLogic::createAnd(const UnicodeFilter* f, - const UnicodeFilter* g) { - if (f == 0) { - if (g == 0) { - return NULL; - } - return (UnicodeFilter*)g->clone(); - } - if (g == 0) { - return (UnicodeFilter*)f->clone(); - } - return new UnicodeAndFilter((UnicodeFilter*)f->clone(), (UnicodeFilter*)g->clone()); -} - -/** - * Returns a UnicodeFilter that implements a short - * circuit AND of the result of the two given filters. That is, - * if f.contains() is false, then g.contains() - * is not called, and contains() returns false. - * - * ADOPTS both arguments. - */ -UnicodeFilter* UnicodeFilterLogic::createAdoptingAnd(UnicodeFilter* f, - UnicodeFilter* g) { - if (f == 0) { - if (g == 0) { - return NULL; - } - return g; - } - if (g == 0) { - return f; - } - return new UnicodeAndFilter(f, g); -} - -static const char gUnicodeOrFilterClassID = 0; -class UnicodeOrFilter : public _UF { - UnicodeFilter* filt1; - UnicodeFilter* filt2; -public: - virtual UClassID getDynamicClassID() const { return getStaticClassID(); } - static inline UClassID getStaticClassID() { return (UClassID)&gUnicodeOrFilterClassID; } - UnicodeOrFilter(UnicodeFilter* adopted1, UnicodeFilter* adopted2); - UnicodeOrFilter(const UnicodeOrFilter&); - virtual ~UnicodeOrFilter(); - virtual UBool contains(UChar32 c) const; - virtual UnicodeFunctor* clone() const; -}; - -UnicodeOrFilter::UnicodeOrFilter(UnicodeFilter* f1, UnicodeFilter* f2) : filt1(f1), filt2(f2) {} -UnicodeOrFilter::UnicodeOrFilter(const UnicodeOrFilter& f) - : _UF(f), filt1((UnicodeFilter*)f.filt1->clone()), filt2((UnicodeFilter*)f.filt2->clone()) {} -UnicodeOrFilter::~UnicodeOrFilter() { delete filt1; delete filt2; } -UBool UnicodeOrFilter::contains(UChar32 c) const { return filt1->contains(c) || filt2->contains(c); } -UnicodeFunctor* UnicodeOrFilter::clone() const { return new UnicodeOrFilter(*this); } - -/** - * Returns a UnicodeFilter that implements a short - * circuit OR of the result of the two given filters. That is, if - * f.contains() is true, then g.contains() is - * not called, and contains() returns true. - */ -UnicodeFilter* UnicodeFilterLogic::createOr(const UnicodeFilter* f, - const UnicodeFilter* g) { - if (f == 0) { - if (g == 0) { - return NULL; - } - return (UnicodeFilter*)g->clone(); - } - if (g == 0) { - return (UnicodeFilter*)f->clone(); - } - return new UnicodeOrFilter((UnicodeFilter*)f->clone(), (UnicodeFilter*)g->clone()); -} - -U_NAMESPACE_END - -#endif /* #if !UCONFIG_NO_TRANSLITERATION */ diff --git a/icuSources/i18n/unitohex.cpp b/icuSources/i18n/unitohex.cpp deleted file mode 100644 index d68309c6..00000000 --- a/icuSources/i18n/unitohex.cpp +++ /dev/null @@ -1,272 +0,0 @@ -/* -********************************************************************** -* Copyright (C) 1999-2003, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -* Date Name Description -* 11/17/99 aliu Creation. -********************************************************************** -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_TRANSLITERATION - -#include "unicode/rep.h" -#include "unicode/unifilt.h" -#include "unitohex.h" - -U_NAMESPACE_BEGIN - -const char UnicodeToHexTransliterator::fgClassID=0; - -/** - * ID for this transliterator. - */ -const char UnicodeToHexTransliterator::_ID[] = "Any-Hex"; - -const UChar UnicodeToHexTransliterator::HEX_DIGITS[32] = { - // Use Unicode hex values for EBCDIC compatibility - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, // 01234567 - 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, // 89abcdef - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, // 01234567 - 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, // 89ABCDEF -}; - -/** - * Constructs a transliterator. - */ -UnicodeToHexTransliterator::UnicodeToHexTransliterator( - const UnicodeString& thePattern, - UBool isUppercase, - UnicodeFilter* adoptedFilter, - UErrorCode& status) : - Transliterator(_ID, adoptedFilter), - uppercase(isUppercase) { - - if (U_FAILURE(status)) { - return; - } - applyPattern(thePattern, status); -} - -/** - * Constructs a transliterator. - */ -UnicodeToHexTransliterator::UnicodeToHexTransliterator( - const UnicodeString& thePattern, - UErrorCode& status) : - Transliterator(_ID, 0), - uppercase(TRUE) { - - if (U_FAILURE(status)) { - return; - } - applyPattern(thePattern, status); -} - -/** - * Constructs a transliterator with the default prefix "\u" - * that outputs four uppercase hex digits. - */ -UnicodeToHexTransliterator::UnicodeToHexTransliterator( - UnicodeFilter* adoptedFilter) : - Transliterator(_ID, adoptedFilter), - pattern("\\\\u0000", ""), - prefix("\\u", 2, ""), - suffix(), - minDigits(4), - uppercase(TRUE) { -} - -/** - * Copy constructor. - */ -UnicodeToHexTransliterator::UnicodeToHexTransliterator( - const UnicodeToHexTransliterator& other) : - Transliterator(other), - pattern(other.pattern), - prefix(other.prefix), - suffix(other.suffix), - minDigits(other.minDigits), - uppercase(other.uppercase) { -} - -/** - * Assignment operator. - */ -UnicodeToHexTransliterator& -UnicodeToHexTransliterator::operator=(const UnicodeToHexTransliterator& other) { - Transliterator::operator=(other); - pattern = other.pattern; - prefix = other.prefix; - suffix = other.suffix; - minDigits = other.minDigits; - uppercase = other.uppercase; - return *this; -} - -Transliterator* -UnicodeToHexTransliterator::clone(void) const { - return new UnicodeToHexTransliterator(*this); -} - -void UnicodeToHexTransliterator::applyPattern(const UnicodeString& thePattern, - UErrorCode& status) { - if (U_FAILURE(status)) { - return; - } - - // POSSIBILE FUTURE MODIFICATION - // Parse thePattern, and if this succeeds, set pattern to thePattern. - // If it fails, call applyPattern(pattern) to restore the original - // conditions. - - pattern = thePattern; - prefix.truncate(0); - suffix.truncate(0); - minDigits = 0; - int32_t maxDigits = 0; - - /* The mode specifies where we are in each spec. - * mode 0 = in prefix - * mode 1 = in optional digits (#) - * mode 2 = in required digits (0) - * mode 3 = in suffix - */ - int32_t mode = 0; - - for (int32_t i=0; i 4) { - // Invalid min/max digit count - status = U_ILLEGAL_ARGUMENT_ERROR; - return; - } -} - -const UnicodeString& UnicodeToHexTransliterator::toPattern(void) const { - return pattern; -} - -/** - * Returns true if this transliterator outputs uppercase hex digits. - */ -UBool UnicodeToHexTransliterator::isUppercase(void) const { - return uppercase; -} - -/** - * Sets if this transliterator outputs uppercase hex digits. - * - *

      Callers must take care if a transliterator is in use by - * multiple threads. The uppercase mode should not be changed by - * one thread while another thread may be transliterating. - * @param outputUppercase if true, then this transliterator - * outputs uppercase hex digits. - */ -void UnicodeToHexTransliterator::setUppercase(UBool outputUppercase) { - uppercase = outputUppercase; -} - -/** - * Implements {@link Transliterator#handleTransliterate}. - */ -void UnicodeToHexTransliterator::handleTransliterate(Replaceable& text, UTransPosition& offsets, - UBool /*isIncremental*/) const { - /** - * Performs transliteration changing all characters to - * Unicode hexadecimal escapes. For example, '@' -> "U+0040", - * assuming the prefix is "U+". - */ - int32_t cursor = offsets.start; - int32_t limit = offsets.limit; - - UnicodeString hex; - - while (cursor < limit) { - UChar c = text.charAt(cursor); - - hex = prefix; - UBool showRest = FALSE; - for (int32_t i=3; i>=0; --i) { - /* Get each nibble from left to right */ - int32_t d = (c >> (i<<2)) & 0xF; - if (showRest || (d != 0) || minDigits > i) { - hex.append(HEX_DIGITS[uppercase ? (d|16) : d]); - showRest = TRUE; - } - } - hex.append(suffix); - - text.handleReplaceBetween(cursor, cursor+1, hex); - int32_t len = hex.length(); - cursor += len; // Advance cursor by 1 and adjust for new text - --len; - limit += len; - } - - offsets.contextLimit += limit - offsets.limit; - offsets.limit = limit; - offsets.start = cursor; -} - -U_NAMESPACE_END - -#endif /* #if !UCONFIG_NO_TRANSLITERATION */ diff --git a/icuSources/i18n/unitohex.h b/icuSources/i18n/unitohex.h deleted file mode 100644 index b8128fd9..00000000 --- a/icuSources/i18n/unitohex.h +++ /dev/null @@ -1,238 +0,0 @@ -/* -********************************************************************** -* Copyright (C) 1999-2003, International Business Machines Corporation and others. All Rights Reserved. -********************************************************************** -* Date Name Description -* 11/17/99 aliu Creation. -********************************************************************** -*/ -#ifndef UNITOHEX_H -#define UNITOHEX_H - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_TRANSLITERATION - -#include "unicode/translit.h" -#include "unicode/unistr.h" - -U_NAMESPACE_BEGIN - -class UnicodeFilter; - -/** - * A transliterator that converts from Unicode characters to - * hexadecimal Unicode escape sequences. It outputs a - * prefix specified in the constructor and optionally converts the hex - * digits to uppercase. - * - *

      The format of the output is set by a pattern. This pattern - * follows the same syntax as HexToUnicodeTransliterator, - * except it does not allow multiple specifications. The pattern sets - * the prefix string, suffix string, and minimum and maximum digit - * count. There are no setters or getters for these attributes; they - * are set only through the pattern. - * - *

      The setUppercase() and isUppercase() methods control whether 'a' - * through 'f' or 'A' through 'F' are output as hex digits. This is - * not controlled through the pattern; only through the methods. The - * default is uppercase. - * - * @author Alan Liu - * @internal Use transliterator factory methods instead since this class will be removed in that release. - */ -class U_I18N_API UnicodeToHexTransliterator : public Transliterator { - -private: - - // Character constants defined here to avoid ASCII dependency - enum { - ZERO = 0x0030, // '0' - POUND = 0x0023, // '#' - BACKSLASH = 0x005C // '\\' - }; - - static const UChar HEX_DIGITS[32]; - - /** - * ID for this transliterator. - */ - static const char _ID[]; - - /** - * The pattern set by applyPattern() and returned by toPattern(). - */ - UnicodeString pattern; - - /** - * The string preceding the hex digits, parsed from the pattern. - */ - UnicodeString prefix; - - /** - * The string following the hex digits, parsed from the pattern. - */ - UnicodeString suffix; - - /** - * The minimum number of hex digits to output, between 1 and 4, - * inclusive. Parsed from the pattern. - */ - int8_t minDigits; - - /** - * If TRUE, output uppercase hex digits; otherwise output - * lowercase. Set by setUppercase() and returned by isUppercase(). - */ - UBool uppercase; - - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; - -public: - - /** - * Constructs a transliterator. - * @param pattern The pattern for this transliterator. See - * applyPattern() for pattern syntax. - * @param isUppercase if true, the four hex digits will be - * converted to uppercase; otherwise they will be lowercase. - * @param adoptedFilter the filter for this transliterator, or - * NULL if none. Adopted by this transliterator. - * @param status Error code indicating success or failure - * to parse pattern. - * @internal Use transliterator factory methods instead since this class will be removed in that release. - */ - UnicodeToHexTransliterator(const UnicodeString& pattern, - UBool isUppercase, - UnicodeFilter* adoptedFilter, - UErrorCode& status); - - /** - * Constructs an uppercase transliterator with no filter. - * @param pattern The pattern for this transliterator. See - * applyPattern() for pattern syntax. - * @param status Error code indicating success or failure - * to parse pattern. - * @internal Use transliterator factory methods instead since this class will be removed in that release. - */ - UnicodeToHexTransliterator(const UnicodeString& pattern, - UErrorCode& status); - - /** - * Constructs a transliterator with the default prefix "\u" - * that outputs uppercase hex digits. - * @internal Use transliterator factory methods instead since this class will be removed in that release. - */ - UnicodeToHexTransliterator(UnicodeFilter* adoptedFilter = 0); - - /** - * Destructor. - * @internal Use transliterator factory methods instead since this class will be removed in that release. - */ - virtual ~UnicodeToHexTransliterator(); - - /** - * Copy constructor. - * @internal Use transliterator factory methods instead since this class will be removed in that release. - */ - UnicodeToHexTransliterator(const UnicodeToHexTransliterator&); - - /** - * Assignment operator. - * @stable ICU 2.0 - */ - UnicodeToHexTransliterator& operator=(const UnicodeToHexTransliterator&); - - /** - * Transliterator API. - * @internal Use transliterator factory methods instead since this class will be removed in that release. - */ - virtual Transliterator* clone(void) const; - - /** - * Set the pattern recognized by this transliterator. The pattern - * must contain zero or more prefix characters, one or more digit - * characters, and zero or more suffix characters. The digit - * characters indicates optional digits ('#') followed by required - * digits ('0'). The total number of digits cannot exceed 4, and - * must be at least 1 required digit. Use a backslash ('\\') to - * escape any of the special characters. An empty pattern is not - * allowed. - * - *

      Example: "U+0000" specifies a prefix of "U+", exactly four - * digits, and no suffix. "<###0>" has a prefix of "<", between - * one and four digits, and a suffix of ">". - * - *

      -     * pattern := prefix-char* digit-spec suffix-char*
      -     * digit-spec := '#'* '0'+
      -     * prefix-char := [^special-char] | '\\' special-char
      -     * suffix-char := [^special-char] | '\\' special-char
      -     * special-char := ';' | '0' | '#' | '\\'
      -     * 
      - * - *

      Limitations: There is no way to set the uppercase attribute - * in the pattern. (applyPattern() does not alter the uppercase - * attribute.) - * @internal Use transliterator factory methods instead since this class will be removed in that release. - */ - void applyPattern(const UnicodeString& thePattern, UErrorCode& status); - - /** - * Return this transliterator's pattern. - * @internal Use transliterator factory methods instead since this class will be removed in that release. - */ - const UnicodeString& toPattern(void) const; - - /** - * Returns true if this transliterator outputs uppercase hex digits. - * @internal Use transliterator factory methods instead since this class will be removed in that release. - */ - virtual UBool isUppercase(void) const; - - /** - * Sets if this transliterator outputs uppercase hex digits. - * @internal Use transliterator factory methods instead since this class will be removed in that release. - */ - virtual void setUppercase(UBool outputUppercase); - - /** - * Implements {@link Transliterator#handleTransliterate}. - * @internal Use transliterator factory methods instead since this class will be removed in that release. - */ - virtual void handleTransliterate(Replaceable& text, UTransPosition& offsets, - UBool isIncremental) const; - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @draft ICU 2.2 - */ - virtual inline UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @draft ICU 2.2 - */ - static inline UClassID getStaticClassID(); -}; - -inline UnicodeToHexTransliterator::~UnicodeToHexTransliterator() {} - -inline UClassID -UnicodeToHexTransliterator::getStaticClassID() -{ return (UClassID)&fgClassID; } - -inline UClassID -UnicodeToHexTransliterator::getDynamicClassID() const -{ return UnicodeToHexTransliterator::getStaticClassID(); } - -U_NAMESPACE_END -#endif /* #if !UCONFIG_NO_TRANSLITERATION */ - -#endif diff --git a/icuSources/i18n/unum.cpp b/icuSources/i18n/unum.cpp index e39ac880..b587cfb9 100644 --- a/icuSources/i18n/unum.cpp +++ b/icuSources/i18n/unum.cpp @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 1996-2003, International Business Machines +* Copyright (C) 1996-2004, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************* * Modification History: @@ -23,72 +23,12 @@ #include "unicode/ustring.h" #include "unicode/fmtable.h" #include "unicode/dcfmtsym.h" +#include "unicode/curramt.h" +#include "uassert.h" #include "cpputils.h" -U_NAMESPACE_USE -/* -U_CAPI UNumberFormat* -unum_open( UNumberFormatStyle style, - const char* locale, - UErrorCode* status) -{ - if(U_FAILURE(*status)) - return 0; - UNumberFormat *retVal = 0; - - switch(style) { - case UNUM_DECIMAL: - if(locale == 0) - retVal = (UNumberFormat*)NumberFormat::createInstance(*status); - else - retVal = (UNumberFormat*)NumberFormat::createInstance(Locale(locale), - *status); - break; - - case UNUM_CURRENCY: - if(locale == 0) - retVal = (UNumberFormat*)NumberFormat::createCurrencyInstance(*status); - else - retVal = (UNumberFormat*)NumberFormat::createCurrencyInstance(Locale(locale), - *status); - break; - - case UNUM_PERCENT: - if(locale == 0) - retVal = (UNumberFormat*)NumberFormat::createPercentInstance(*status); - else - retVal = (UNumberFormat*)NumberFormat::createPercentInstance(Locale(locale), - *status); - break; - - case UNUM_SPELLOUT: - // Todo: TBD: Add spellout support - //retVal = (UNumberFormat*)new NumberSpelloutFormat(); - //break; - *status = U_UNSUPPORTED_ERROR; - return 0; - default: - *status = U_UNSUPPORTED_ERROR; - return 0; - } - if(retVal == 0) { - *status = U_MEMORY_ALLOCATION_ERROR; - return 0; - } - - return retVal; -} - -U_CAPI UNumberFormat* -unum_openPattern( const UChar* pattern, - int32_t patternLength, - const char* locale, - UErrorCode* status) -{ - UParseError parseError; - return unum_openPatternWithError( pattern,patternLength,locale,&parseError,status); -}*/ +U_NAMESPACE_USE U_CAPI UNumberFormat* U_EXPORT2 @@ -100,152 +40,181 @@ unum_open( UNumberFormatStyle style, UErrorCode* status) { - if(U_FAILURE(*status)) - { - return 0; - } - if(style!=UNUM_IGNORE){ - UNumberFormat *retVal = 0; - - switch(style) { - case UNUM_DECIMAL: + if(U_FAILURE(*status)) + { + return 0; + } + + UNumberFormat *retVal = 0; + + switch(style) { + case UNUM_DECIMAL: if(locale == 0) - retVal = (UNumberFormat*)NumberFormat::createInstance(*status); + retVal = (UNumberFormat*)NumberFormat::createInstance(*status); else - retVal = (UNumberFormat*)NumberFormat::createInstance(Locale(locale), - *status); + retVal = (UNumberFormat*)NumberFormat::createInstance(Locale(locale), + *status); break; - case UNUM_CURRENCY: + case UNUM_CURRENCY: if(locale == 0) - retVal = (UNumberFormat*)NumberFormat::createCurrencyInstance(*status); + retVal = (UNumberFormat*)NumberFormat::createCurrencyInstance(*status); else - retVal = (UNumberFormat*)NumberFormat::createCurrencyInstance(Locale(locale), - *status); + retVal = (UNumberFormat*)NumberFormat::createCurrencyInstance(Locale(locale), + *status); break; - case UNUM_PERCENT: + case UNUM_PERCENT: if(locale == 0) - retVal = (UNumberFormat*)NumberFormat::createPercentInstance(*status); + retVal = (UNumberFormat*)NumberFormat::createPercentInstance(*status); else - retVal = (UNumberFormat*)NumberFormat::createPercentInstance(Locale(locale), - *status); + retVal = (UNumberFormat*)NumberFormat::createPercentInstance(Locale(locale), + *status); break; - case UNUM_SCIENTIFIC: + case UNUM_SCIENTIFIC: if(locale == 0) - retVal = (UNumberFormat*)NumberFormat::createScientificInstance(*status); + retVal = (UNumberFormat*)NumberFormat::createScientificInstance(*status); else - retVal = (UNumberFormat*)NumberFormat::createScientificInstance(Locale(locale), - *status); + retVal = (UNumberFormat*)NumberFormat::createScientificInstance(Locale(locale), + *status); break; - case UNUM_SPELLOUT: + case UNUM_PATTERN_DECIMAL: { + UParseError tErr; + /* UnicodeString can handle the case when patternLength = -1. */ + const UnicodeString pat(pattern, patternLength); + DecimalFormatSymbols *syms = 0; + + if(parseErr==NULL){ + parseErr = &tErr; + } + + if(locale == 0) + syms = new DecimalFormatSymbols(*status); + else + syms = new DecimalFormatSymbols(Locale(locale), *status); + + if(syms == 0) { + *status = U_MEMORY_ALLOCATION_ERROR; + return 0; + } + + retVal = (UNumberFormat*)new DecimalFormat(pat, syms, *parseErr, *status); + if(retVal == 0) { + delete syms; + } + } break; + #if U_HAVE_RBNF - return (UNumberFormat*)new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale(locale), *status); -#else - // fall through -#endif - default: - *status = U_UNSUPPORTED_ERROR; - return 0; - } + case UNUM_PATTERN_RULEBASED: { + UParseError tErr; + /* UnicodeString can handle the case when patternLength = -1. */ + const UnicodeString pat(pattern, patternLength); + + if(parseErr==NULL){ + parseErr = &tErr; + } + + retVal = (UNumberFormat*)new RuleBasedNumberFormat(pat, Locale(locale), *parseErr, *status); + } break; + + case UNUM_SPELLOUT: + retVal = (UNumberFormat*)new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale(locale), *status); + break; - if(retVal == 0) { - *status = U_MEMORY_ALLOCATION_ERROR; - return 0; - } + case UNUM_ORDINAL: + retVal = (UNumberFormat*)new RuleBasedNumberFormat(URBNF_ORDINAL, Locale(locale), *status); + break; - return retVal; - }else{ - /* we don't support RBNF patterns yet */ - UParseError tErr; - int32_t len = (patternLength == -1 ? u_strlen(pattern) : patternLength); - const UnicodeString pat((UChar*)pattern, len, len); - DecimalFormatSymbols *syms = 0; - - if(parseErr==NULL){ - parseErr = &tErr; - } - - if(locale == 0) - syms = new DecimalFormatSymbols(*status); - else - syms = new DecimalFormatSymbols(Locale(locale), - *status); - - if(syms == 0) { - *status = U_MEMORY_ALLOCATION_ERROR; + case UNUM_DURATION: + retVal = (UNumberFormat*)new RuleBasedNumberFormat(URBNF_DURATION, Locale(locale), *status); + break; +#endif + + default: + *status = U_UNSUPPORTED_ERROR; return 0; - } + } - DecimalFormat *fmt = 0; - fmt = new DecimalFormat(pat, syms, *parseErr, *status); - if(fmt == 0) { + if(retVal == 0 && U_SUCCESS(*status)) { *status = U_MEMORY_ALLOCATION_ERROR; - delete syms; - return 0; - } + } - return (UNumberFormat*) fmt; - } + return retVal; } U_CAPI void U_EXPORT2 unum_close(UNumberFormat* fmt) { - - delete (NumberFormat*) fmt; + delete (NumberFormat*) fmt; } U_CAPI UNumberFormat* U_EXPORT2 unum_clone(const UNumberFormat *fmt, UErrorCode *status) { - - if(U_FAILURE(*status)) return 0; - - Format *res = ((DecimalFormat*)fmt)->clone(); - - if(res == 0) { - *status = U_MEMORY_ALLOCATION_ERROR; - return 0; - } + if(U_FAILURE(*status)) + return 0; + + Format *res = 0; + if (((const NumberFormat*)fmt)->getDynamicClassID() == DecimalFormat::getStaticClassID()) { + res = ((const DecimalFormat*)fmt)->clone(); + } else { + U_ASSERT(((const NumberFormat*)fmt)->getDynamicClassID() == RuleBasedNumberFormat::getStaticClassID()); + res = ((const RuleBasedNumberFormat*)fmt)->clone(); + } - return (UNumberFormat*) res; + if(res == 0) { + *status = U_MEMORY_ALLOCATION_ERROR; + return 0; + } + + return (UNumberFormat*) res; } U_CAPI int32_t U_EXPORT2 unum_format( const UNumberFormat* fmt, - int32_t number, + int32_t number, UChar* result, - int32_t resultLength, + int32_t resultLength, UFieldPosition *pos, - UErrorCode* status) + UErrorCode* status) { - - if(U_FAILURE(*status)) return -1; - - UnicodeString res; - if(!(result==NULL && resultLength==0)) { - // NULL destination for pure preflighting: empty dummy string - // otherwise, alias the destination buffer - res.setTo(result, 0, resultLength); - } + return unum_formatInt64(fmt, number, result, resultLength, pos, status); +} - FieldPosition fp; - - if(pos != 0) - fp.setField(pos->field); - - ((NumberFormat*)fmt)->format(number, res, fp); - - if(pos != 0) { - pos->beginIndex = fp.getBeginIndex(); - pos->endIndex = fp.getEndIndex(); - } - - return res.extract(result, resultLength, *status); +U_CAPI int32_t U_EXPORT2 +unum_formatInt64(const UNumberFormat* fmt, + int64_t number, + UChar* result, + int32_t resultLength, + UFieldPosition *pos, + UErrorCode* status) +{ + if(U_FAILURE(*status)) + return -1; + + UnicodeString res; + if(!(result==NULL && resultLength==0)) { + // NULL destination for pure preflighting: empty dummy string + // otherwise, alias the destination buffer + res.setTo(result, 0, resultLength); + } + + FieldPosition fp; + + if(pos != 0) + fp.setField(pos->field); + + ((const NumberFormat*)fmt)->format(number, res, fp); + + if(pos != 0) { + pos->beginIndex = fp.getBeginIndex(); + pos->endIndex = fp.getEndIndex(); + } + + return res.extract(result, resultLength, *status); } U_CAPI int32_t U_EXPORT2 @@ -271,7 +240,7 @@ unum_formatDouble( const UNumberFormat* fmt, if(pos != 0) fp.setField(pos->field); - ((NumberFormat*)fmt)->format(number, res, fp); + ((const NumberFormat*)fmt)->format(number, res, fp); if(pos != 0) { pos->beginIndex = fp.getBeginIndex(); @@ -281,6 +250,74 @@ unum_formatDouble( const UNumberFormat* fmt, return res.extract(result, resultLength, *status); } +U_DRAFT int32_t U_EXPORT2 +unum_formatDoubleCurrency(const UNumberFormat* fmt, + double number, + UChar* currency, + UChar* result, + int32_t resultLength, + UFieldPosition* pos, /* ignored if 0 */ + UErrorCode* status) { + if (U_FAILURE(*status)) return -1; + + UnicodeString res; + if (!(result==NULL && resultLength==0)) { + // NULL destination for pure preflighting: empty dummy string + // otherwise, alias the destination buffer + res.setTo(result, 0, resultLength); + } + + FieldPosition fp; + if (pos != 0) { + fp.setField(pos->field); + } + + Formattable n(new CurrencyAmount(number, currency, *status)); + ((const NumberFormat*)fmt)->format(n, res, fp, *status); + + if (pos != 0) { + pos->beginIndex = fp.getBeginIndex(); + pos->endIndex = fp.getEndIndex(); + } + + return res.extract(result, resultLength, *status); +} + +static void +parseRes(Formattable& res, + const UNumberFormat* fmt, + const UChar* text, + int32_t textLength, + int32_t *parsePos /* 0 = start */, + UBool parseCurrency, + UErrorCode *status) +{ + if(U_FAILURE(*status)) + return; + + int32_t len = (textLength == -1 ? u_strlen(text) : textLength); + const UnicodeString src((UChar*)text, len, len); + ParsePosition pp; + + if(parsePos != 0) + pp.setIndex(*parsePos); + + if (parseCurrency) { + ((const NumberFormat*)fmt)->parseCurrency(src, res, pp); + } else { + ((const NumberFormat*)fmt)->parse(src, res, pp); + } + + if(parsePos != 0) { + if(pp.getErrorIndex() == -1) + *parsePos = pp.getIndex(); + else { + *parsePos = pp.getErrorIndex(); + *status = U_PARSE_ERROR; + } + } +} + U_CAPI int32_t U_EXPORT2 unum_parse( const UNumberFormat* fmt, const UChar* text, @@ -288,32 +325,21 @@ unum_parse( const UNumberFormat* fmt, int32_t *parsePos /* 0 = start */, UErrorCode *status) { - - if(U_FAILURE(*status)) return 0; - - int32_t len = (textLength == -1 ? u_strlen(text) : textLength); - const UnicodeString src((UChar*)text, len, len); - ParsePosition pp; - Formattable res; - - if(parsePos != 0) - pp.setIndex(*parsePos); - - ((NumberFormat*)fmt)->parse(src, res, pp); - - if(parsePos != 0) { - if(pp.getErrorIndex() == -1) - *parsePos = pp.getIndex(); - else { - *parsePos = pp.getErrorIndex(); - *status = U_PARSE_ERROR; - } - } + Formattable res; + parseRes(res, fmt, text, textLength, parsePos, FALSE, status); + return res.getLong(*status); +} - /* return the actual type of the result, cast to a long */ - return (res.getType() == Formattable::kLong) - ? res.getLong() - : (int32_t) res.getDouble(); +U_CAPI int64_t U_EXPORT2 +unum_parseInt64( const UNumberFormat* fmt, + const UChar* text, + int32_t textLength, + int32_t *parsePos /* 0 = start */, + UErrorCode *status) +{ + Formattable res; + parseRes(res, fmt, text, textLength, parsePos, FALSE, status); + return res.getInt64(*status); } U_CAPI double U_EXPORT2 @@ -323,103 +349,117 @@ unum_parseDouble( const UNumberFormat* fmt, int32_t *parsePos /* 0 = start */, UErrorCode *status) { - - if(U_FAILURE(*status)) - return 0; - - int32_t len = (textLength < 0 ? u_strlen(text) : textLength); - const UnicodeString src((UChar*)text, len, len); - ParsePosition pp; - Formattable res; - - if(parsePos != 0) - pp.setIndex(*parsePos); - - ((NumberFormat*)fmt)->parse(src, res, pp); + Formattable res; + parseRes(res, fmt, text, textLength, parsePos, FALSE, status); + return res.getDouble(*status); +} - if(parsePos != 0) { - if(pp.getErrorIndex() == -1) - *parsePos = pp.getIndex(); - else { - *parsePos = pp.getErrorIndex(); - *status = U_PARSE_ERROR; +U_DRAFT double U_EXPORT2 +unum_parseDoubleCurrency(const UNumberFormat* fmt, + const UChar* text, + int32_t textLength, + int32_t* parsePos, /* 0 = start */ + UChar* currency, + UErrorCode* status) { + Formattable res; + parseRes(res, fmt, text, textLength, parsePos, TRUE, status); + currency[0] = 0; + if (res.getType() == Formattable::kObject && + res.getObject()->getDynamicClassID() == CurrencyAmount::getStaticClassID()) { + const CurrencyAmount* c = (const CurrencyAmount*) res.getObject(); + u_strcpy(currency, c->getISOCurrency()); } - } - - /* return the actual type of the result, cast to a double */ - return (res.getType() == Formattable::kDouble) - ? res.getDouble() - : (double) res.getLong(); + return res.getDouble(*status); } U_CAPI const char* U_EXPORT2 unum_getAvailable(int32_t index) { - - return uloc_getAvailable(index); + return uloc_getAvailable(index); } U_CAPI int32_t U_EXPORT2 unum_countAvailable() { - - return uloc_countAvailable(); + return uloc_countAvailable(); } U_CAPI int32_t U_EXPORT2 unum_getAttribute(const UNumberFormat* fmt, UNumberFormatAttribute attr) { - - switch(attr) { - case UNUM_PARSE_INT_ONLY: - return ((NumberFormat*)fmt)->isParseIntegerOnly(); - - case UNUM_GROUPING_USED: - return ((NumberFormat*)fmt)->isGroupingUsed(); - - case UNUM_DECIMAL_ALWAYS_SHOWN: - return ((DecimalFormat*)fmt)->isDecimalSeparatorAlwaysShown(); - - case UNUM_MAX_INTEGER_DIGITS: - return ((NumberFormat*)fmt)->getMaximumIntegerDigits(); - - case UNUM_MIN_INTEGER_DIGITS: - return ((NumberFormat*)fmt)->getMinimumIntegerDigits(); - - case UNUM_INTEGER_DIGITS: - // TBD: what should this return? - return ((NumberFormat*)fmt)->getMinimumIntegerDigits(); - - case UNUM_MAX_FRACTION_DIGITS: - return ((NumberFormat*)fmt)->getMaximumFractionDigits(); - - case UNUM_MIN_FRACTION_DIGITS: - return ((NumberFormat*)fmt)->getMinimumFractionDigits(); - - case UNUM_FRACTION_DIGITS: - // TBD: what should this return? - return ((NumberFormat*)fmt)->getMinimumFractionDigits(); - - case UNUM_MULTIPLIER: - return ((DecimalFormat*)fmt)->getMultiplier(); - - case UNUM_GROUPING_SIZE: - return ((DecimalFormat*)fmt)->getGroupingSize(); - - case UNUM_ROUNDING_MODE: - return ((DecimalFormat*)fmt)->getRoundingMode(); - - case UNUM_FORMAT_WIDTH: - return ((DecimalFormat*)fmt)->getFormatWidth(); - - /** The position at which padding will take place. */ - case UNUM_PADDING_POSITION: - return ((DecimalFormat*)fmt)->getPadPosition(); - - default: - break; + if (((const NumberFormat*)fmt)->getDynamicClassID() == DecimalFormat::getStaticClassID()) { + const DecimalFormat* df = (const DecimalFormat*) fmt; + switch(attr) { + case UNUM_PARSE_INT_ONLY: + return df->isParseIntegerOnly(); + + case UNUM_GROUPING_USED: + return df->isGroupingUsed(); + + case UNUM_DECIMAL_ALWAYS_SHOWN: + return df->isDecimalSeparatorAlwaysShown(); + + case UNUM_MAX_INTEGER_DIGITS: + return df->getMaximumIntegerDigits(); + + case UNUM_MIN_INTEGER_DIGITS: + return df->getMinimumIntegerDigits(); + + case UNUM_INTEGER_DIGITS: + // TBD: what should this return? + return df->getMinimumIntegerDigits(); + + case UNUM_MAX_FRACTION_DIGITS: + return df->getMaximumFractionDigits(); + + case UNUM_MIN_FRACTION_DIGITS: + return df->getMinimumFractionDigits(); + + case UNUM_FRACTION_DIGITS: + // TBD: what should this return? + return df->getMinimumFractionDigits(); + + case UNUM_SIGNIFICANT_DIGITS_USED: + return df->areSignificantDigitsUsed(); + + case UNUM_MAX_SIGNIFICANT_DIGITS: + return df->getMaximumSignificantDigits(); + + case UNUM_MIN_SIGNIFICANT_DIGITS: + return df->getMinimumSignificantDigits(); + + case UNUM_MULTIPLIER: + return df->getMultiplier(); + + case UNUM_GROUPING_SIZE: + return df->getGroupingSize(); + + case UNUM_ROUNDING_MODE: + return df->getRoundingMode(); + + case UNUM_FORMAT_WIDTH: + return df->getFormatWidth(); + + case UNUM_PADDING_POSITION: + return df->getPadPosition(); + + case UNUM_SECONDARY_GROUPING_SIZE: + return df->getSecondaryGroupingSize(); + + default: + /* enums out of sync? unsupported enum? */ + break; + } + } else { + U_ASSERT(((const NumberFormat*)fmt)->getDynamicClassID() == RuleBasedNumberFormat::getStaticClassID()); + if (attr == UNUM_LENIENT_PARSE) { +#if !UCONFIG_NO_COLLATION + return ((const RuleBasedNumberFormat*)fmt)->isLenient(); +#endif + } } + return -1; } @@ -428,74 +468,95 @@ unum_setAttribute( UNumberFormat* fmt, UNumberFormatAttribute attr, int32_t newValue) { - - switch(attr) { - case UNUM_PARSE_INT_ONLY: - ((NumberFormat*)fmt)->setParseIntegerOnly((UBool)newValue); - break; - - case UNUM_GROUPING_USED: - ((NumberFormat*)fmt)->setGroupingUsed((UBool)newValue); - break; - - case UNUM_DECIMAL_ALWAYS_SHOWN: - ((DecimalFormat*)fmt)->setDecimalSeparatorAlwaysShown((UBool)newValue); - break; - - case UNUM_MAX_INTEGER_DIGITS: - ((NumberFormat*)fmt)->setMaximumIntegerDigits(newValue); - break; - - case UNUM_MIN_INTEGER_DIGITS: - ((NumberFormat*)fmt)->setMinimumIntegerDigits(newValue); - break; - - case UNUM_INTEGER_DIGITS: - ((NumberFormat*)fmt)->setMinimumIntegerDigits(newValue); - ((NumberFormat*)fmt)->setMaximumIntegerDigits(newValue); - break; - - case UNUM_MAX_FRACTION_DIGITS: - ((NumberFormat*)fmt)->setMaximumFractionDigits(newValue); - break; - - case UNUM_MIN_FRACTION_DIGITS: - ((NumberFormat*)fmt)->setMinimumFractionDigits(newValue); - break; - - case UNUM_FRACTION_DIGITS: - ((NumberFormat*)fmt)->setMinimumFractionDigits(newValue); - ((NumberFormat*)fmt)->setMaximumFractionDigits(newValue); - break; - - case UNUM_MULTIPLIER: - ((DecimalFormat*)fmt)->setMultiplier(newValue); - break; - - case UNUM_GROUPING_SIZE: - ((DecimalFormat*)fmt)->setGroupingSize(newValue); - break; - - case UNUM_ROUNDING_MODE: - ((DecimalFormat*)fmt)->setRoundingMode((DecimalFormat::ERoundingMode)newValue); - break; - - case UNUM_FORMAT_WIDTH: - ((DecimalFormat*)fmt)->setFormatWidth(newValue); - break; - - /** The position at which padding will take place. */ - case UNUM_PADDING_POSITION: - ((DecimalFormat*)fmt)->setPadPosition((DecimalFormat::EPadPosition)newValue); - break; - - case UNUM_SECONDARY_GROUPING_SIZE: - ((DecimalFormat*)fmt)->setSecondaryGroupingSize(newValue); - break; - - default: - /* Shouldn't get here anyway */ - break; + if (((NumberFormat*)fmt)->getDynamicClassID() == DecimalFormat::getStaticClassID()) { + DecimalFormat* df = (DecimalFormat*) fmt; + switch(attr) { + case UNUM_PARSE_INT_ONLY: + df->setParseIntegerOnly(newValue!=0); + break; + + case UNUM_GROUPING_USED: + df->setGroupingUsed(newValue!=0); + break; + + case UNUM_DECIMAL_ALWAYS_SHOWN: + df->setDecimalSeparatorAlwaysShown(newValue!=0); + break; + + case UNUM_MAX_INTEGER_DIGITS: + df->setMaximumIntegerDigits(newValue); + break; + + case UNUM_MIN_INTEGER_DIGITS: + df->setMinimumIntegerDigits(newValue); + break; + + case UNUM_INTEGER_DIGITS: + df->setMinimumIntegerDigits(newValue); + df->setMaximumIntegerDigits(newValue); + break; + + case UNUM_MAX_FRACTION_DIGITS: + df->setMaximumFractionDigits(newValue); + break; + + case UNUM_MIN_FRACTION_DIGITS: + df->setMinimumFractionDigits(newValue); + break; + + case UNUM_FRACTION_DIGITS: + df->setMinimumFractionDigits(newValue); + df->setMaximumFractionDigits(newValue); + break; + + case UNUM_SIGNIFICANT_DIGITS_USED: + df->setSignificantDigitsUsed(newValue!=0); + break; + + case UNUM_MAX_SIGNIFICANT_DIGITS: + df->setMaximumSignificantDigits(newValue); + break; + + case UNUM_MIN_SIGNIFICANT_DIGITS: + df->setMinimumSignificantDigits(newValue); + break; + + case UNUM_MULTIPLIER: + df->setMultiplier(newValue); + break; + + case UNUM_GROUPING_SIZE: + df->setGroupingSize(newValue); + break; + + case UNUM_ROUNDING_MODE: + df->setRoundingMode((DecimalFormat::ERoundingMode)newValue); + break; + + case UNUM_FORMAT_WIDTH: + df->setFormatWidth(newValue); + break; + + case UNUM_PADDING_POSITION: + /** The position at which padding will take place. */ + df->setPadPosition((DecimalFormat::EPadPosition)newValue); + break; + + case UNUM_SECONDARY_GROUPING_SIZE: + df->setSecondaryGroupingSize(newValue); + break; + + default: + /* Shouldn't get here anyway */ + break; + } + } else { + U_ASSERT(((NumberFormat*)fmt)->getDynamicClassID() == RuleBasedNumberFormat::getStaticClassID()); + if (attr == UNUM_LENIENT_PARSE) { +#if !UCONFIG_NO_COLLATION + ((RuleBasedNumberFormat*)fmt)->setLenient((UBool)newValue); +#endif + } } } @@ -503,12 +564,12 @@ U_CAPI double U_EXPORT2 unum_getDoubleAttribute(const UNumberFormat* fmt, UNumberFormatAttribute attr) { - - if (attr == UNUM_ROUNDING_INCREMENT) { - return ((DecimalFormat*)fmt)->getRoundingIncrement(); - } else { - return -1.0; - } + if (((const NumberFormat*)fmt)->getDynamicClassID() == DecimalFormat::getStaticClassID() && + attr == UNUM_ROUNDING_INCREMENT) { + return ((const DecimalFormat*)fmt)->getRoundingIncrement(); + } else { + return -1.0; + } } U_CAPI void U_EXPORT2 @@ -516,10 +577,10 @@ unum_setDoubleAttribute( UNumberFormat* fmt, UNumberFormatAttribute attr, double newValue) { - - if (attr == UNUM_ROUNDING_INCREMENT) { - ((DecimalFormat*)fmt)->setRoundingIncrement(newValue); - } + if (((NumberFormat*)fmt)->getDynamicClassID() == DecimalFormat::getStaticClassID() && + attr == UNUM_ROUNDING_INCREMENT) { + ((DecimalFormat*)fmt)->setRoundingIncrement(newValue); + } } U_CAPI int32_t U_EXPORT2 @@ -529,48 +590,65 @@ unum_getTextAttribute(const UNumberFormat* fmt, int32_t resultLength, UErrorCode* status) { - - if(U_FAILURE(*status)) - return -1; - - UnicodeString res; - if(!(result==NULL && resultLength==0)) { - // NULL destination for pure preflighting: empty dummy string - // otherwise, alias the destination buffer - res.setTo(result, 0, resultLength); - } - - switch(tag) { - case UNUM_POSITIVE_PREFIX: - ((DecimalFormat*)fmt)->getPositivePrefix(res); - break; - - case UNUM_POSITIVE_SUFFIX: - ((DecimalFormat*)fmt)->getPositiveSuffix(res); - break; - - case UNUM_NEGATIVE_PREFIX: - ((DecimalFormat*)fmt)->getNegativePrefix(res); - break; - - case UNUM_NEGATIVE_SUFFIX: - ((DecimalFormat*)fmt)->getNegativeSuffix(res); - break; - - case UNUM_PADDING_CHARACTER: - res = ((DecimalFormat*)fmt)->getPadCharacterString(); - break; - - case UNUM_CURRENCY_CODE: - res = UnicodeString(((DecimalFormat*)fmt)->getCurrency()); - break; + if(U_FAILURE(*status)) + return -1; + + UnicodeString res; + if(!(result==NULL && resultLength==0)) { + // NULL destination for pure preflighting: empty dummy string + // otherwise, alias the destination buffer + res.setTo(result, 0, resultLength); + } - default: - *status = U_UNSUPPORTED_ERROR; - return -1; - } + if (((const NumberFormat*)fmt)->getDynamicClassID() == DecimalFormat::getStaticClassID()) { + const DecimalFormat* df = (const DecimalFormat*) fmt; + switch(tag) { + case UNUM_POSITIVE_PREFIX: + df->getPositivePrefix(res); + break; + + case UNUM_POSITIVE_SUFFIX: + df->getPositiveSuffix(res); + break; + + case UNUM_NEGATIVE_PREFIX: + df->getNegativePrefix(res); + break; + + case UNUM_NEGATIVE_SUFFIX: + df->getNegativeSuffix(res); + break; + + case UNUM_PADDING_CHARACTER: + res = df->getPadCharacterString(); + break; + + case UNUM_CURRENCY_CODE: + res = UnicodeString(df->getCurrency()); + break; + + default: + *status = U_UNSUPPORTED_ERROR; + return -1; + } + } else { + U_ASSERT(((const NumberFormat*)fmt)->getDynamicClassID() == RuleBasedNumberFormat::getStaticClassID()); + const RuleBasedNumberFormat* rbnf = (const RuleBasedNumberFormat*)fmt; + if (tag == UNUM_DEFAULT_RULESET) { + res = rbnf->getDefaultRuleSetName(); + } else if (tag == UNUM_PUBLIC_RULESETS) { + int32_t count = rbnf->getNumberOfRuleSetNames(); + for (int i = 0; i < count; ++i) { + res += rbnf->getRuleSetName(i); + res += (UChar)0x003b; // semicolon + } + } else { + *status = U_UNSUPPORTED_ERROR; + return -1; + } + } - return res.extract(result, resultLength, *status); + return res.extract(result, resultLength, *status); } U_CAPI void U_EXPORT2 @@ -580,41 +658,51 @@ unum_setTextAttribute( UNumberFormat* fmt, int32_t newValueLength, UErrorCode *status) { - - if(U_FAILURE(*status)) return; - - int32_t len = (newValueLength == -1 ? u_strlen(newValue) : newValueLength); - const UnicodeString val((UChar*)newValue, len, len); - - switch(tag) { - case UNUM_POSITIVE_PREFIX: - ((DecimalFormat*)fmt)->setPositivePrefix(val); - break; - - case UNUM_POSITIVE_SUFFIX: - ((DecimalFormat*)fmt)->setPositiveSuffix(val); - break; - - case UNUM_NEGATIVE_PREFIX: - ((DecimalFormat*)fmt)->setNegativePrefix(val); - break; - - case UNUM_NEGATIVE_SUFFIX: - ((DecimalFormat*)fmt)->setNegativeSuffix(val); - break; - - case UNUM_PADDING_CHARACTER: - ((DecimalFormat*)fmt)->setPadCharacter(*newValue); - break; - - case UNUM_CURRENCY_CODE: - ((DecimalFormat*)fmt)->setCurrency(newValue); - break; - - default: + if(U_FAILURE(*status)) + return; + + int32_t len = (newValueLength == -1 ? u_strlen(newValue) : newValueLength); + const UnicodeString val((UChar*)newValue, len, len); + + if (((NumberFormat*)fmt)->getDynamicClassID() == DecimalFormat::getStaticClassID()) { + DecimalFormat* df = (DecimalFormat*) fmt; + switch(tag) { + case UNUM_POSITIVE_PREFIX: + df->setPositivePrefix(val); + break; + + case UNUM_POSITIVE_SUFFIX: + df->setPositiveSuffix(val); + break; + + case UNUM_NEGATIVE_PREFIX: + df->setNegativePrefix(val); + break; + + case UNUM_NEGATIVE_SUFFIX: + df->setNegativeSuffix(val); + break; + + case UNUM_PADDING_CHARACTER: + df->setPadCharacter(*newValue); + break; + + case UNUM_CURRENCY_CODE: + df->setCurrency(newValue, *status); + break; + + default: + *status = U_UNSUPPORTED_ERROR; + break; + } + } else { + U_ASSERT(((NumberFormat*)fmt)->getDynamicClassID() == RuleBasedNumberFormat::getStaticClassID()); + if (tag == UNUM_DEFAULT_RULESET) { + ((RuleBasedNumberFormat*)fmt)->setDefaultRuleSet(newValue, *status); + } else { *status = U_UNSUPPORTED_ERROR; - break; - } + } + } } U_CAPI int32_t U_EXPORT2 @@ -624,42 +712,51 @@ unum_toPattern( const UNumberFormat* fmt, int32_t resultLength, UErrorCode* status) { - - if(U_FAILURE(*status)) return -1; - - UnicodeString pat; - if(!(result==NULL && resultLength==0)) { - // NULL destination for pure preflighting: empty dummy string - // otherwise, alias the destination buffer - pat.setTo(result, 0, resultLength); - } - - if(isPatternLocalized) - ((DecimalFormat*)fmt)->toLocalizedPattern(pat); - else - ((DecimalFormat*)fmt)->toPattern(pat); + if(U_FAILURE(*status)) + return -1; + + UnicodeString pat; + if(!(result==NULL && resultLength==0)) { + // NULL destination for pure preflighting: empty dummy string + // otherwise, alias the destination buffer + pat.setTo(result, 0, resultLength); + } - return pat.extract(result, resultLength, *status); + if (((const NumberFormat*)fmt)->getDynamicClassID() == DecimalFormat::getStaticClassID()) { + const DecimalFormat* df = (const DecimalFormat*) fmt; + if(isPatternLocalized) + df->toLocalizedPattern(pat); + else + df->toPattern(pat); + } else { + U_ASSERT(((const NumberFormat*)fmt)->getDynamicClassID() == RuleBasedNumberFormat::getStaticClassID()); + pat = ((const RuleBasedNumberFormat*)fmt)->getRules(); + } + return pat.extract(result, resultLength, *status); } U_CAPI int32_t U_EXPORT2 -unum_getSymbol(UNumberFormat *fmt, +unum_getSymbol(const UNumberFormat *fmt, UNumberFormatSymbol symbol, UChar *buffer, int32_t size, - UErrorCode *status) { - - if(status==NULL || U_FAILURE(*status)) { - return 0; - } + UErrorCode *status) +{ + if(status==NULL || U_FAILURE(*status)) { + return 0; + } + + if(fmt==NULL || (uint16_t)symbol>=UNUM_FORMAT_SYMBOL_COUNT) { + *status=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } - if(fmt==NULL || (uint16_t)symbol>=UNUM_FORMAT_SYMBOL_COUNT) { - *status=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } + if (((const NumberFormat*)fmt)->getDynamicClassID() != DecimalFormat::getStaticClassID()) { + *status = U_UNSUPPORTED_ERROR; + return 0; + } - return - ((const DecimalFormat *)fmt)-> + return ((const DecimalFormat *)fmt)-> getDecimalFormatSymbols()-> getConstSymbol((DecimalFormatSymbols::ENumberFormatSymbol)symbol). extract(buffer, size, *status); @@ -670,36 +767,27 @@ unum_setSymbol(UNumberFormat *fmt, UNumberFormatSymbol symbol, const UChar *value, int32_t length, - UErrorCode *status) { - - if(status==NULL || U_FAILURE(*status)) { - return; - } - - if(fmt==NULL || (uint16_t)symbol>=UNUM_FORMAT_SYMBOL_COUNT || value==NULL || length<-1) { - *status=U_ILLEGAL_ARGUMENT_ERROR; - return; - } - - DecimalFormatSymbols symbols(*((DecimalFormat *)fmt)->getDecimalFormatSymbols()); - symbols.setSymbol((DecimalFormatSymbols::ENumberFormatSymbol)symbol, - length>=0 ? UnicodeString(value, length) : UnicodeString(value)); - ((DecimalFormat *)fmt)->setDecimalFormatSymbols(symbols); -} - -/* -U_CAPI void -unum_applyPattern( UNumberFormat *format, - UBool localized, - const UChar *pattern, - int32_t patternLength - ) + UErrorCode *status) { - UErrorCode status = U_ZERO_ERROR; - UParseError parseError; - unum_applyPatternWithError(format,localized,pattern,patternLength,&parseError,&status); + if(status==NULL || U_FAILURE(*status)) { + return; + } + + if(fmt==NULL || (uint16_t)symbol>=UNUM_FORMAT_SYMBOL_COUNT || value==NULL || length<-1) { + *status=U_ILLEGAL_ARGUMENT_ERROR; + return; + } + + if (((NumberFormat*)fmt)->getDynamicClassID() != DecimalFormat::getStaticClassID()) { + *status = U_UNSUPPORTED_ERROR; + return; + } + + DecimalFormatSymbols symbols(*((DecimalFormat *)fmt)->getDecimalFormatSymbols()); + symbols.setSymbol((DecimalFormatSymbols::ENumberFormatSymbol)symbol, + UnicodeString(value, length)); /* UnicodeString can handle the case when length = -1. */ + ((DecimalFormat *)fmt)->setDecimalFormatSymbols(symbols); } -*/ U_CAPI void U_EXPORT2 unum_applyPattern( UNumberFormat *format, @@ -709,31 +797,45 @@ unum_applyPattern( UNumberFormat *format, UParseError *parseError, UErrorCode* status) { - - UErrorCode tStatus = U_ZERO_ERROR; - UParseError tParseError; - - if(parseError == NULL){ - parseError = &tParseError; - } - - if(status==NULL){ - status = &tStatus; - } - - int32_t len = (patternLength == -1 ? u_strlen(pattern) : patternLength); - const UnicodeString pat((UChar*)pattern, len, len); - - // Verify if the object passed is a DecimalFormat object - if(((NumberFormat*)format)->getDynamicClassID()!= DecimalFormat::getStaticClassID()){ - *status = U_ILLEGAL_ARGUMENT_ERROR; + UErrorCode tStatus = U_ZERO_ERROR; + UParseError tParseError; + + if(parseError == NULL){ + parseError = &tParseError; + } + + if(status==NULL){ + status = &tStatus; + } + + int32_t len = (patternLength == -1 ? u_strlen(pattern) : patternLength); + const UnicodeString pat((UChar*)pattern, len, len); + + // Verify if the object passed is a DecimalFormat object + if (((NumberFormat*)format)->getDynamicClassID() == DecimalFormat::getStaticClassID()) { + if(localized) { + ((DecimalFormat*)format)->applyLocalizedPattern(pat,*parseError, *status); + } else { + ((DecimalFormat*)format)->applyPattern(pat,*parseError, *status); + } + } else { + *status = U_UNSUPPORTED_ERROR; return; - } - - if(localized) - ((DecimalFormat*)format)->applyLocalizedPattern(pat,*parseError, *status); - else - ((DecimalFormat*)format)->applyPattern(pat,*parseError, *status); + } +} + +U_CAPI const char* U_EXPORT2 +unum_getLocaleByType(const UNumberFormat *fmt, + ULocDataLocaleType type, + UErrorCode* status) +{ + if (fmt == NULL) { + if (U_SUCCESS(*status)) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + } + return NULL; + } + return ((const Format*)fmt)->getLocaleID(type, *status); } #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/i18n/uregex.cpp b/icuSources/i18n/uregex.cpp new file mode 100644 index 00000000..c249d676 --- /dev/null +++ b/icuSources/i18n/uregex.cpp @@ -0,0 +1,1131 @@ +/* +******************************************************************************* +* Copyright (C) 1996-2004, International Business Machines +* Corporation and others. All Rights Reserved. +******************************************************************************* +* file name: regex.cpp +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_REGULAR_EXPRESSIONS + +#include "unicode/regex.h" +#include "unicode/uregex.h" +#include "unicode/unistr.h" +#include "unicode/ustring.h" +#include "unicode/uchar.h" +#include "unicode/uobject.h" +#include "umutex.h" +#include "uassert.h" +#include "cmemory.h" + +struct URegularExpression: public UMemory { +public: + URegularExpression(); + ~URegularExpression(); + int32_t fMagic; + RegexPattern *fPat; + int32_t *fPatRefCount; + UChar *fPatString; + int32_t fPatStringLen; + RegexMatcher *fMatcher; + const UChar *fText; // Text from setText() + int32_t fTextLength; // Length provided by user with setText(), which + // may be -1. + + UnicodeString fTextString; // The setText(text) is wrapped into a UnicodeString. + // TODO: regexp engine should not depend on UnicodeString. +}; + +static const int32_t REXP_MAGIC = 0x72657870; // "rexp" in ASCII + +U_NAMESPACE_USE + +URegularExpression::URegularExpression() { + fMagic = REXP_MAGIC; + fPat = NULL; + fPatRefCount = NULL; + fPatString = NULL; + fPatStringLen = 0; + fMatcher = NULL; + fText = NULL; + fTextLength = 0; +} + +URegularExpression::~URegularExpression() { + delete fMatcher; + fMatcher = NULL; + if (fPatRefCount!=NULL && umtx_atomic_dec(fPatRefCount)==0) { + delete fPat; + uprv_free(fPatString); + uprv_free(fPatRefCount); + } + fMagic = 0; +} + +//---------------------------------------------------------------------------------------- +// +// validateRE Do boilerplate style checks on API function parameters. +// Return TRUE if they look OK. +//---------------------------------------------------------------------------------------- +static UBool validateRE(const URegularExpression *re, UErrorCode *status, UBool requiresText = TRUE) { + if (U_FAILURE(*status)) { + return FALSE; + } + if (re == NULL || re->fMagic != REXP_MAGIC) { + // U_ASSERT(FALSE); + *status = U_ILLEGAL_ARGUMENT_ERROR; + return FALSE; + } + if (requiresText && re->fText == NULL) { + *status = U_REGEX_INVALID_STATE; + return FALSE; + } + return TRUE; +} + +//---------------------------------------------------------------------------------------- +// +// uregex_open +// +//---------------------------------------------------------------------------------------- +U_CAPI URegularExpression * U_EXPORT2 +uregex_open( const UChar *pattern, + int32_t patternLength, + uint32_t flags, + UParseError *pe, + UErrorCode *status) { + + if (U_FAILURE(*status)) { + return NULL; + } + if (pattern == NULL || patternLength < -1 || patternLength == 0) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + int32_t actualPatLen = patternLength; + if (actualPatLen == -1) { + actualPatLen = u_strlen(pattern); + } + + URegularExpression *re = new URegularExpression; + int32_t *refC = (int32_t *)uprv_malloc(sizeof(int32_t)); + UChar *patBuf = (UChar *)uprv_malloc(sizeof(UChar)*(actualPatLen+1)); + if (re == NULL || refC == NULL || patBuf == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + delete re; + uprv_free(refC); + uprv_free(patBuf); + return NULL; + } + re->fPatRefCount = refC; + *re->fPatRefCount = 1; + + // + // Make a copy of the pattern string, so we can return it later if asked. + // For compiling the pattern, we will use a read-only-aliased UnicodeString + // of this local copy, to avoid making even more copies. + // + re->fPatString = patBuf; + re->fPatStringLen = patternLength; + u_memcpy(patBuf, pattern, actualPatLen); + patBuf[actualPatLen] = 0; + UnicodeString patString(patternLength==-1, patBuf, patternLength); + + // + // Compile the pattern + // + if (pe != NULL) { + re->fPat = RegexPattern::compile(patString, flags, *pe, *status); + } else { + re->fPat = RegexPattern::compile(patString, flags, *status); + } + if (U_FAILURE(*status)) { + goto ErrorExit; + } + + // + // Create the matcher object + // + re->fMatcher = re->fPat->matcher(*status); + if (U_SUCCESS(*status)) { + return re; + } + +ErrorExit: + delete re; + return NULL; + +} + + + + +//---------------------------------------------------------------------------------------- +// +// uregex_openC +// +//---------------------------------------------------------------------------------------- +U_CAPI URegularExpression * U_EXPORT2 +uregex_openC( const char *pattern, + uint32_t flags, + UParseError *pe, + UErrorCode *status) { + if (U_FAILURE(*status)) { + return NULL; + } + if (pattern == NULL) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + + UnicodeString patString(pattern); + URegularExpression *re = uregex_open(patString.getBuffer(), patString.length(), flags, pe, status); + return re; +} + +//---------------------------------------------------------------------------------------- +// +// uregex_close +// +//---------------------------------------------------------------------------------------- +U_CAPI void U_EXPORT2 +uregex_close(URegularExpression *re) { + UErrorCode status = U_ZERO_ERROR; + if (validateRE(re, &status, FALSE) == FALSE) { + return; + } + delete re; +} + + +//---------------------------------------------------------------------------------------- +// +// uregex_clone +// +//---------------------------------------------------------------------------------------- +U_CAPI URegularExpression * U_EXPORT2 +uregex_clone(const URegularExpression *source, UErrorCode *status) { + if (validateRE(source, status, FALSE) == FALSE) { + return NULL; + } + + URegularExpression *clone = new URegularExpression; + if (clone == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + + clone->fMatcher = source->fPat->matcher(*status); + if (U_FAILURE(*status)) { + delete clone; + return NULL; + } + if (clone == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + + clone->fPat = source->fPat; + clone->fPatRefCount = source->fPatRefCount; + clone->fPatString = source->fPatString; + clone->fPatStringLen = source->fPatStringLen; + umtx_atomic_inc(source->fPatRefCount); + // Note: fText is not cloned. + + return clone; +}; + + + + +//---------------------------------------------------------------------------------------- +// +// uregex_pattern +// +//---------------------------------------------------------------------------------------- +U_CAPI const UChar * U_EXPORT2 +uregex_pattern(const URegularExpression *regexp, + int32_t *patLength, + UErrorCode *status) { + + if (validateRE(regexp, status, FALSE) == FALSE) { + return NULL; + } + if (patLength != NULL) { + *patLength = regexp->fPatStringLen; + } + return regexp->fPatString; +}; + + +//---------------------------------------------------------------------------------------- +// +// uregex_flags +// +//---------------------------------------------------------------------------------------- +U_CAPI int32_t U_EXPORT2 +uregex_flags(const URegularExpression *regexp, UErrorCode *status) { + if (validateRE(regexp, status, FALSE) == FALSE) { + return 0; + } + int32_t flags = regexp->fPat->flags(); + return flags; +}; + + +//---------------------------------------------------------------------------------------- +// +// uregex_setText +// +//---------------------------------------------------------------------------------------- +U_CAPI void U_EXPORT2 +uregex_setText(URegularExpression *regexp, + const UChar *text, + int32_t textLength, + UErrorCode *status) { + if (validateRE(regexp, status, FALSE) == FALSE) { + return; + } + if (text == NULL || textLength < -1) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + regexp->fText = text; + regexp->fTextLength = textLength; + UBool isTerminated = (textLength == -1); + + regexp->fTextString.setTo(isTerminated, text, textLength); + regexp->fMatcher->reset(regexp->fTextString); +}; + + + +//---------------------------------------------------------------------------------------- +// +// uregex_getText +// +//---------------------------------------------------------------------------------------- +U_CAPI const UChar * U_EXPORT2 +uregex_getText(URegularExpression *regexp, + int32_t *textLength, + UErrorCode *status) { + if (validateRE(regexp, status, FALSE) == FALSE) { + return NULL; + } + if (textLength != NULL) { + *textLength = regexp->fTextLength; + } + return regexp->fText; +}; + + +//---------------------------------------------------------------------------------------- +// +// uregex_matches +// +//---------------------------------------------------------------------------------------- +U_CAPI UBool U_EXPORT2 +uregex_matches(URegularExpression *regexp, + int32_t startIndex, + UErrorCode *status) { + if (validateRE(regexp, status) == FALSE) { + return FALSE; + } + UBool result = regexp->fMatcher->matches(startIndex, *status); + return result; +}; + + + +//---------------------------------------------------------------------------------------- +// +// uregex_lookingAt +// +//---------------------------------------------------------------------------------------- +U_CAPI UBool U_EXPORT2 +uregex_lookingAt(URegularExpression *regexp, + int32_t startIndex, + UErrorCode *status) { + if (validateRE(regexp, status) == FALSE) { + return FALSE; + } + UBool result = regexp->fMatcher->lookingAt(startIndex, *status); + return result; +}; + + + +//---------------------------------------------------------------------------------------- +// +// uregex_find +// +//---------------------------------------------------------------------------------------- +U_CAPI UBool U_EXPORT2 +uregex_find(URegularExpression *regexp, + int32_t startIndex, + UErrorCode *status) { + if (validateRE(regexp, status) == FALSE) { + return FALSE; + } + UBool result = regexp->fMatcher->find(startIndex, *status); + return result; +}; + +//---------------------------------------------------------------------------------------- +// +// uregex_findNext +// +//---------------------------------------------------------------------------------------- +U_CAPI UBool U_EXPORT2 +uregex_findNext(URegularExpression *regexp, + UErrorCode *status) { + if (validateRE(regexp, status) == FALSE) { + return FALSE; + } + UBool result = regexp->fMatcher->find(); + return result; +}; + +//---------------------------------------------------------------------------------------- +// +// uregex_groupCount +// +//---------------------------------------------------------------------------------------- +U_CAPI int32_t U_EXPORT2 +uregex_groupCount(URegularExpression *regexp, + UErrorCode *status) { + if (validateRE(regexp, status, FALSE) == FALSE) { + return 0; + } + int32_t result = regexp->fMatcher->groupCount(); + return result; +}; + + +//---------------------------------------------------------------------------------------- +// +// uregex_group +// +//---------------------------------------------------------------------------------------- +U_CAPI int32_t U_EXPORT2 +uregex_group(URegularExpression *regexp, + int32_t groupNum, + UChar *dest, + int32_t destCapacity, + UErrorCode *status) { + if (validateRE(regexp, status) == FALSE) { + return 0; + } + if (destCapacity < 0 || (destCapacity > 0 && dest == NULL)) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + // + // Pick up the range of characters from the matcher + // + int32_t startIx = regexp->fMatcher->start(groupNum, *status); + int32_t endIx = regexp->fMatcher->end (groupNum, *status); + if (U_FAILURE(*status)) { + return 0; + } + + // + // Trim length based on buffer capacity + // + int32_t fullLength = endIx - startIx; + int32_t copyLength = fullLength; + if (copyLength < destCapacity) { + dest[copyLength] = 0; + } else if (copyLength == destCapacity) { + *status = U_STRING_NOT_TERMINATED_WARNING; + } else { + copyLength = destCapacity; + *status = U_BUFFER_OVERFLOW_ERROR; + } + + // + // Copy capture group to user's buffer + // + if (copyLength > 0) { + u_memcpy(dest, ®exp->fText[startIx], copyLength); + } + return fullLength; +}; + + +//---------------------------------------------------------------------------------------- +// +// uregex_start +// +//---------------------------------------------------------------------------------------- +U_CAPI int32_t U_EXPORT2 +uregex_start(URegularExpression *regexp, + int32_t groupNum, + UErrorCode *status) { + if (validateRE(regexp, status) == FALSE) { + return 0; + } + int32_t result = regexp->fMatcher->start(groupNum, *status); + return result; +}; + + +//---------------------------------------------------------------------------------------- +// +// uregex_end +// +//---------------------------------------------------------------------------------------- +U_CAPI int32_t U_EXPORT2 +uregex_end(URegularExpression *regexp, + int32_t groupNum, + UErrorCode *status) { + if (validateRE(regexp, status) == FALSE) { + return 0; + } + int32_t result = regexp->fMatcher->end(groupNum, *status); + return result; +}; + +//---------------------------------------------------------------------------------------- +// +// uregex_reset +// +//---------------------------------------------------------------------------------------- +U_CAPI void U_EXPORT2 +uregex_reset(URegularExpression *regexp, + int32_t index, + UErrorCode *status) { + if (validateRE(regexp, status) == FALSE) { + return; + } + regexp->fMatcher->reset(index, *status); +}; + + +//---------------------------------------------------------------------------------------- +// +// uregex_replaceAll +// +//---------------------------------------------------------------------------------------- +U_CAPI int32_t U_EXPORT2 +uregex_replaceAll(URegularExpression *regexp, + UChar *replacementText, + int32_t replacementLength, + UChar *destBuf, + int32_t destCapacity, + UErrorCode *status) { + if (validateRE(regexp, status) == FALSE) { + return 0; + } + if (replacementText == NULL || replacementLength < -1 || + destBuf == NULL && destCapacity > 0 || + destCapacity < 0) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + int32_t len = 0; + uregex_reset(regexp, 0, status); + while (uregex_findNext(regexp, status)) { + len += uregex_appendReplacement(regexp, replacementText, replacementLength, + &destBuf, &destCapacity, status); + } + len += uregex_appendTail(regexp, &destBuf, &destCapacity, status); + + return len; +}; + + +//---------------------------------------------------------------------------------------- +// +// uregex_replaceFirst +// +//---------------------------------------------------------------------------------------- +U_CAPI int32_t U_EXPORT2 +uregex_replaceFirst(URegularExpression *regexp, + UChar *replacementText, + int32_t replacementLength, + UChar *destBuf, + int32_t destCapacity, + UErrorCode *status) { + if (validateRE(regexp, status) == FALSE) { + return 0; + } + if (replacementText == NULL || replacementLength < -1 || + destBuf == NULL && destCapacity > 0 || + destCapacity < 0) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + int32_t len = 0; + UBool findSucceeded; + uregex_reset(regexp, 0, status); + findSucceeded = uregex_find(regexp, 0, status); + if (findSucceeded) { + len = uregex_appendReplacement(regexp, replacementText, replacementLength, + &destBuf, &destCapacity, status); + } + len += uregex_appendTail(regexp, &destBuf, &destCapacity, status); + + return len; +}; + + +//---------------------------------------------------------------------------------------- +// +// uregex_appendReplacement +// +//---------------------------------------------------------------------------------------- + + +// +// Dummy class, because these functions need to be friends of class RegexMatcher, +// and stand-alone C functions don't work as friends +// +U_NAMESPACE_BEGIN +class RegexCImpl { + public: + inline static int32_t appendReplacement(URegularExpression *regexp, + UChar *replacementText, + int32_t replacementLength, + UChar **destBuf, + int32_t *destCapacity, + UErrorCode *status); + + inline static int32_t appendTail(URegularExpression *regexp, + UChar **destBuf, + int32_t *destCapacity, + UErrorCode *status); +}; +U_NAMESPACE_END + + +// +// Call-back function for u_unescapeAt(), used when we encounter +// \uxxxx or \Uxxxxxxxxx escapes in the replacement text. +// +U_CDECL_BEGIN +static UChar U_CALLCONV +unescape_charAt(int32_t offset, void *context) { + UChar c16 = ((UChar *)context)[offset]; + return c16; +} +U_CDECL_END + + +static const UChar BACKSLASH = 0x5c; +static const UChar DOLLARSIGN = 0x24; + +// +// Move a character to an output buffer, with bounds checking on the index. +// Index advances even if capacity is exceeded, for preflight size computations. +// This little sequence is used a LOT. +// +static inline void appendToBuf(UChar c, int32_t *idx, UChar *buf, int32_t bufCapacity) { + if (*idx < bufCapacity) { + buf[*idx] = c; + } + (*idx)++; +} + + +// +// appendReplacement, the actual implementation. +// +int32_t RegexCImpl::appendReplacement(URegularExpression *regexp, + UChar *replacementText, + int32_t replacementLength, + UChar **destBuf, + int32_t *destCapacity, + UErrorCode *status) { + + // If we come in with a buffer overflow error, don't suppress the operation. + // A series of appendReplacements, appendTail need to correctly preflight + // the buffer size when an overflow happens somewhere in the middle. + UBool pendingBufferOverflow = FALSE; + if (*status == U_BUFFER_OVERFLOW_ERROR && destCapacity == 0) { + pendingBufferOverflow = TRUE; + *status = U_ZERO_ERROR; + } + + // + // Validate all paramters + // + if (validateRE(regexp, status) == FALSE) { + return 0; + } + if (replacementText == NULL || replacementLength < -1 || + destCapacity == NULL || destBuf == NULL || + *destBuf == NULL && *destCapacity > 0 || + *destCapacity < 0) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + RegexMatcher *m = regexp->fMatcher; + if (m->fMatch == FALSE) { + *status = U_REGEX_INVALID_STATE; + return 0; + } + + UChar *dest = *destBuf; + int32_t capacity = *destCapacity; + int32_t destIdx = 0; + int32_t i; + + // If it wasn't supplied by the caller, get the length of the replacement text. + // TODO: slightly smarter logic in the copy loop could watch for the NUL on + // the fly and avoid this step. + if (replacementLength == -1) { + replacementLength = u_strlen(replacementText); + } + + // Copy input string from the end of previous match to start of current match + for (i=m->fLastMatchEnd; ifMatchStart; i++) { + appendToBuf(regexp->fText[i], &destIdx, dest, capacity); + } + + + + // scan the replacement text, looking for substitutions ($n) and \escapes. + int32_t replIdx = 0; + while (replIdx < replacementLength) { + UChar c = replacementText[replIdx]; + replIdx++; + if (c != DOLLARSIGN && c != BACKSLASH) { + // Common case, no substitution, no escaping, + // just copy the char to the dest buf. + appendToBuf(c, &destIdx, dest, capacity); + continue; + } + + if (c == BACKSLASH) { + // Backslash Escape. Copy the following char out without further checks. + // Note: Surrogate pairs don't need any special handling + // The second half wont be a '$' or a '\', and + // will move to the dest normally on the next + // loop iteration. + if (replIdx >= replacementLength) { + break; + } + c = replacementText[replIdx]; + + if (c==0x55/*U*/ || c==0x75/*u*/) { + // We have a \udddd or \Udddddddd escape sequence. + UChar32 escapedChar = + u_unescapeAt(unescape_charAt, + &replIdx, // Index is updated by unescapeAt + replacementLength, // Length of replacement text + replacementText); + + if (escapedChar != (UChar32)0xFFFFFFFF) { + if (escapedChar <= 0xffff) { + appendToBuf((UChar)escapedChar, &destIdx, dest, capacity); + } else { + appendToBuf(U16_LEAD(escapedChar), &destIdx, dest, capacity); + appendToBuf(U16_TRAIL(escapedChar), &destIdx, dest, capacity); + } + continue; + } + // Note: if the \u escape was invalid, just fall through and + // treat it as a plain \ escape. + } + + // Plain backslash escape. Just put out the escaped character. + appendToBuf(c, &destIdx, dest, capacity); + + replIdx++; + continue; + } + + + + // We've got a $. Pick up a capture group number if one follows. + // Consume at most the number of digits necessary for the largest capture + // number that is valid for this pattern. + + int32_t numDigits = 0; + int32_t groupNum = 0; + UChar32 digitC; + for (;;) { + if (replIdx >= replacementLength) { + break; + } + U16_GET(replacementText, 0, replIdx, replacementLength, digitC); + if (u_isdigit(digitC) == FALSE) { + break; + } + + U16_FWD_1(replacementText, replIdx, replacementLength); + groupNum=groupNum*10 + u_charDigitValue(digitC); + numDigits++; + if (numDigits >= m->fPattern->fMaxCaptureDigits) { + break; + } + } + + + if (numDigits == 0) { + // The $ didn't introduce a group number at all. + // Treat it as just part of the substitution text. + appendToBuf(DOLLARSIGN, &destIdx, dest, capacity); + continue; + } + + // Finally, append the capture group data to the destination. + int32_t capacityRemaining = capacity - destIdx; + if (capacityRemaining < 0) { + capacityRemaining = 0; + } + destIdx += uregex_group(regexp, groupNum, dest+destIdx, capacityRemaining, status); + if (*status == U_BUFFER_OVERFLOW_ERROR) { + // Ignore buffer overflow when extracting the group. We need to + // continue on to get full size of the untruncated result. We will + // raise our own buffer overflow error at the end. + *status = U_ZERO_ERROR; + } + + if (U_FAILURE(*status)) { + // Can fail if group number is out of range. + break; + } + + } + + // + // Nul Terminate the dest buffer if possible. + // Set the appropriate buffer overflow or not terminated error, if needed. + // + if (destIdx < capacity) { + dest[destIdx] = 0; + } else if (destIdx == *destCapacity) { + *status = U_STRING_NOT_TERMINATED_WARNING; + } else { + *status = U_BUFFER_OVERFLOW_ERROR; + } + + // + // Return an updated dest buffer and capacity to the caller. + // + if (destIdx > 0 && *destCapacity > 0) { + if (destIdx < capacity) { + *destBuf += destIdx; + *destCapacity -= destIdx; + } else { + *destBuf += capacity; + *destCapacity = 0; + } + } + + // If we came in with a buffer overflow, make sure we go out with one also. + // (A zero length match right at the end of the previous match could + // make this function succeed even though a previous call had overflowed the buf) + if (pendingBufferOverflow && U_SUCCESS(*status)) { + *status = U_BUFFER_OVERFLOW_ERROR; + } + + return destIdx; +} + +// +// appendReplacement the acutal API function, +// +U_CAPI int32_t U_EXPORT2 +uregex_appendReplacement(URegularExpression *regexp, + UChar *replacementText, + int32_t replacementLength, + UChar **destBuf, + int32_t *destCapacity, + UErrorCode *status) { + return RegexCImpl::appendReplacement( + regexp, replacementText, replacementLength,destBuf, destCapacity, status); +} + + +//---------------------------------------------------------------------------------------- +// +// uregex_appendTail +// +//---------------------------------------------------------------------------------------- +int32_t RegexCImpl::appendTail(URegularExpression *regexp, + UChar **destBuf, + int32_t *destCapacity, + UErrorCode *status) { + + // If we come in with a buffer overflow error, don't suppress the operation. + // A series of appendReplacements, appendTail need to correctly preflight + // the buffer size when an overflow happens somewhere in the middle. + UBool pendingBufferOverflow = FALSE; + if (*status == U_BUFFER_OVERFLOW_ERROR && *destCapacity == 0) { + pendingBufferOverflow = TRUE; + *status = U_ZERO_ERROR; + } + + if (validateRE(regexp, status) == FALSE) { + return 0; + } + if (destCapacity == NULL || destBuf == NULL || + *destBuf == NULL && *destCapacity > 0 || + *destCapacity < 0) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + RegexMatcher *m = regexp->fMatcher; + + int32_t srcIdx; + if (m->fMatch) { + // The most recent call to find() succeeded. + srcIdx = m->fMatchEnd; + } else { + // The last call to find() on this matcher failed(). + // Look back to the end of the last find() that succeeded for src index. + srcIdx = m->fLastMatchEnd; + if (srcIdx == -1) { + // There has been no successful match with this matcher. + // We want to copy the whole string. + srcIdx = 0; + } + } + + int32_t destIdx = 0; + int32_t destCap = *destCapacity; + UChar *dest = *destBuf; + + for (;;) { + if (srcIdx == regexp->fTextLength) { + break; + } + UChar c = regexp->fText[srcIdx]; + if (c == 0 && regexp->fTextLength == -1) { + break; + } + if (destIdx < destCap) { + dest[destIdx] = c; + } else { + // We've overflowed the dest buffer. + // If the total input string length is known, we can + // compute the total buffer size needed without scanning through the string. + if (regexp->fTextLength > 0) { + destIdx += (regexp->fTextLength - srcIdx); + break; + } + } + srcIdx++; + destIdx++; + } + + // + // NUL terminate the output string, if possible, otherwise issue the + // appropriate error or warning. + // + if (destIdx < destCap) { + dest[destIdx] = 0; + } else if (destIdx == destCap) { + *status = U_STRING_NOT_TERMINATED_WARNING; + } else { + *status = U_BUFFER_OVERFLOW_ERROR; + } + + // + // Update the user's buffer ptr and capacity vars to reflect the + // amount used. + // + if (destIdx < destCap) { + *destBuf += destIdx; + *destCapacity -= destIdx; + } else { + *destBuf += destCap; + *destCapacity = 0; + } + + if (pendingBufferOverflow && U_SUCCESS(*status)) { + *status = U_BUFFER_OVERFLOW_ERROR; + } + + return destIdx; +}; + + +U_CAPI int32_t U_EXPORT2 +uregex_appendTail(URegularExpression *regexp, + UChar **destBuf, + int32_t *destCapacity, + UErrorCode *status) { + return RegexCImpl::appendTail(regexp, destBuf, destCapacity, status); +} + + +//---------------------------------------------------------------------------------------- +// +// copyString Internal utility to copy a string to an output buffer, +// while managing buffer overflow and preflight size +// computation. NUL termination is added to destination, +// and the NUL is counted in the output size. +// +//---------------------------------------------------------------------------------------- +static void copyString(UChar *destBuffer, // Destination buffer. + int32_t destCapacity, // Total capacity of dest buffer + int32_t *destIndex, // Index into dest buffer. Updated on return. + // Update not clipped to destCapacity. + const UChar *srcPtr, // Pointer to source string + int32_t srcLen) // Source string len. +{ + int32_t si; + int32_t di = *destIndex; + UChar c; + + for (si=0; si 0 || + destCapacity < 0 || + destFields == NULL || + destFieldsCapacity < 1 ) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + // + // Reset for the input text + // + regexp->fMatcher->reset(); + int32_t inputLen = regexp->fTextString.length(); + int32_t nextOutputStringStart = 0; + if (inputLen == 0) { + return 0; + } + + + // + // Loop through the input text, searching for the delimiter pattern + // + int32_t i; // Index of the field being processed. + int32_t destIdx = 0; // Next available position in destBuf; + int32_t numCaptureGroups = regexp->fMatcher->groupCount(); + for (i=0; ; i++) { + if (i>=destFieldsCapacity-1) { + // There are one or zero output string left. + // Fill the last output string with whatever is left from the input, then exit the loop. + // ( i will be == destFieldsCapacity if we filled the output array while processing + // capture groups of the delimiter expression, in which case we will discard the + // last capture group saved in favor of the unprocessed remainder of the + // input string.) + int32_t remainingLength = inputLen-nextOutputStringStart; + if (remainingLength > 0) { + } + if (i >= destFieldsCapacity) { + // No fields are left. Recycle the last one for holding the trailing part of + // the input string. + i = destFieldsCapacity-1; + destIdx = (int32_t)(destFields[i] - destFields[0]); + } + + destFields[i] = &destBuf[destIdx]; + copyString(destBuf, destCapacity, &destIdx, + ®exp->fText[nextOutputStringStart], remainingLength); + break; + } + + if (regexp->fMatcher->find()) { + // We found another delimiter. Move everything from where we started looking + // up until the start of the delimiter into the next output string. + int32_t fieldLen = regexp->fMatcher->start(*status) - nextOutputStringStart; + destFields[i] = &destBuf[destIdx]; + copyString(destBuf, destCapacity, &destIdx, + ®exp->fText[nextOutputStringStart], fieldLen); + nextOutputStringStart = regexp->fMatcher->end(*status); + + // If the delimiter pattern has capturing parentheses, the captured + // text goes out into the next n destination strings. + int32_t groupNum; + for (groupNum=1; groupNum<=numCaptureGroups; groupNum++) { + // If we've run out of output string slots, bail out. + if (i==destFieldsCapacity-1) { + break; + } + i++; + + // Set up to extract the capture group contents into the dest buffer. + UErrorCode tStatus = U_ZERO_ERROR; // Want to ignore any buffer overflow + // error while extracting this group. + int32_t remainingCapacity = destCapacity - destIdx; + if (remainingCapacity < 0) { + remainingCapacity = 0; + } + destFields[i] = &destBuf[destIdx]; + int32_t t = uregex_group(regexp, groupNum, destFields[i], remainingCapacity, &tStatus); + destIdx += t + 1; // Record the space used in the output string buffer. + // +1 for the NUL that terminates the string. + } + + if (nextOutputStringStart == inputLen) { + // The delimiter was at the end of the string. We're done. + break; + } + + } + else + { + // We ran off the end of the input while looking for the next delimiter. + // All the remaining text goes into the current output string. + destFields[i] = &destBuf[destIdx]; + copyString(destBuf, destCapacity, &destIdx, + ®exp->fText[nextOutputStringStart], inputLen-nextOutputStringStart); + break; + } + } + + // Zero out any unused portion of the destFields array + int j; + for (j=i+1; j destCapacity) { + *status = U_BUFFER_OVERFLOW_ERROR; + } + return i+1; +} + + + + + + +#endif // !UCONFIG_NO_REGULAR_EXPRESSIONS diff --git a/icuSources/i18n/usearch.cpp b/icuSources/i18n/usearch.cpp index 9c06182b..8c14c0b9 100644 --- a/icuSources/i18n/usearch.cpp +++ b/icuSources/i18n/usearch.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2001-2003 IBM and others. All rights reserved. +* Copyright (C) 2001-2004 IBM and others. All rights reserved. ********************************************************************** * Date Name Description * 07/02/2001 synwee Creation. @@ -18,6 +18,7 @@ #include "ucol_imp.h" #include "usrchimp.h" #include "cmemory.h" +#include "ucln_in.h" // internal definition --------------------------------------------------- @@ -39,13 +40,13 @@ static inline void setColEIterOffset(UCollationElements *elems, int32_t offset) { - collIterate *ci = &(elems->iteratordata_); - ci->pos = ci->string + offset; - ci->CEpos = ci->toReturn = ci->CEs; - if (ci->flags & UCOL_ITER_INNORMBUF) { - ci->flags = ci->origFlags; - } - ci->fcdPosition = NULL; + collIterate *ci = &(elems->iteratordata_); + ci->pos = ci->string + offset; + ci->CEpos = ci->toReturn = ci->CEs; + if (ci->flags & UCOL_ITER_INNORMBUF) { + ci->flags = ci->origFlags; + } + ci->fcdPosition = NULL; } /** @@ -83,6 +84,14 @@ inline int hash(uint32_t ce) return UCOL_PRIMARYORDER(ce) % MAX_TABLE_SIZE_; } +U_CDECL_BEGIN +static UBool U_CALLCONV +usearch_cleanup(void) { + FCD_ = NULL; + return TRUE; +} +U_CDECL_END + /** * Initializing the fcd tables. * Internal method, status assumed to be a success. @@ -94,6 +103,7 @@ inline void initializeFCD(UErrorCode *status) { if (FCD_ == NULL) { FCD_ = unorm_getFCDTrie(status); + ucln_i18n_registerCleanup(UCLN_I18N_USEARCH, usearch_cleanup); } } @@ -138,7 +148,7 @@ inline uint16_t getFCD(const UChar *str, int32_t *offset, * @return the modified collation element */ static -inline uint32_t getCE(const UStringSearch *strsrch, uint32_t sourcece) +inline int32_t getCE(const UStringSearch *strsrch, uint32_t sourcece) { // note for tertiary we can't use the collator->tertiaryMask, that // is a preprocessed mask that takes into account case options. since @@ -199,22 +209,22 @@ inline void * allocateMemory(uint32_t size, UErrorCode *status) * @return new destination array, destination if there was no new allocation */ static -inline uint32_t * addTouint32_tArray(uint32_t *destination, - uint32_t offset, - uint32_t *destinationlength, - uint32_t value, - uint32_t increments, - UErrorCode *status) +inline int32_t * addTouint32_tArray(int32_t *destination, + uint32_t offset, + uint32_t *destinationlength, + uint32_t value, + uint32_t increments, + UErrorCode *status) { uint32_t newlength = *destinationlength; if (offset + 1 == newlength) { newlength += increments; - uint32_t *temp = (uint32_t *)allocateMemory( - sizeof(uint32_t) * newlength, status); + int32_t *temp = (int32_t *)allocateMemory( + sizeof(int32_t) * newlength, status); if (U_FAILURE(*status)) { return NULL; } - uprv_memcpy(temp, destination, sizeof(uint32_t) * offset); + uprv_memcpy(temp, destination, sizeof(int32_t) * offset); *destinationlength = newlength; destination = temp; } @@ -240,7 +250,7 @@ inline uint16_t initializePatternCETable(UStringSearch *strsrch, { UPattern *pattern = &(strsrch->pattern); uint32_t cetablesize = INITIAL_ARRAY_SIZE_; - uint32_t *cetable = pattern->CEBuffer; + int32_t *cetable = pattern->CEBuffer; uint32_t patternlength = pattern->textLength; UCollationElements *coleiter = strsrch->utilIter; @@ -264,13 +274,13 @@ inline uint16_t initializePatternCETable(UStringSearch *strsrch, uint16_t offset = 0; uint16_t result = 0; - uint32_t ce; + int32_t ce; while ((ce = ucol_next(coleiter, status)) != UCOL_NULLORDER && U_SUCCESS(*status)) { uint32_t newce = getCE(strsrch, ce); if (newce) { - uint32_t *temp = addTouint32_tArray(cetable, offset, &cetablesize, + int32_t *temp = addTouint32_tArray(cetable, offset, &cetablesize, newce, patternlength - ucol_getOffset(coleiter) + 1, status); @@ -332,7 +342,7 @@ inline int16_t initializePattern(UStringSearch *strsrch, UErrorCode *status) */ static inline void setShiftTable(int16_t shift[], int16_t backshift[], - uint32_t *cetable, int32_t cesize, + int32_t *cetable, int32_t cesize, int16_t expansionsize, int16_t defaultforward, int16_t defaultbackward) @@ -404,7 +414,7 @@ inline void initialize(UStringSearch *strsrch, UErrorCode *status) int32_t cesize = pattern->CELength; int16_t minlength = cesize > expandlength - ? (int16_t)cesize - expandlength : 1; + ? (int16_t)cesize - expandlength : 1; pattern->defaultShiftSize = minlength; setShiftTable(pattern->shift, pattern->backShift, pattern->CE, cesize, expandlength, minlength, minlength); @@ -452,7 +462,7 @@ inline UBool isBreakUnit(const UStringSearch *strsrch, int32_t start, ucol_setText(coleiter, text, end - start, &status); for (int32_t count = 0; count < strsrch->pattern.CELength; count ++) { - uint32_t ce = getCE(strsrch, ucol_next(coleiter, &status)); + int32_t ce = getCE(strsrch, ucol_next(coleiter, &status)); if (ce == UCOL_IGNORABLE) { count --; continue; @@ -461,7 +471,7 @@ inline UBool isBreakUnit(const UStringSearch *strsrch, int32_t start, return FALSE; } } - uint32_t nextce = ucol_next(coleiter, &status); + int32_t nextce = ucol_next(coleiter, &status); while (ucol_getOffset(coleiter) == (end - start) && getCE(strsrch, nextce) == UCOL_IGNORABLE) { nextce = ucol_next(coleiter, &status); @@ -522,7 +532,7 @@ static inline int32_t getNextUStringSearchBaseOffset(UStringSearch *strsrch, int32_t textoffset) { - int32_t textlength = strsrch->search->textLength; + int32_t textlength = strsrch->search->textLength; if (strsrch->pattern.hasSuffixAccents && textoffset < textlength) { int32_t temp = textoffset; @@ -550,10 +560,10 @@ inline int32_t getNextUStringSearchBaseOffset(UStringSearch *strsrch, static inline int32_t shiftForward(UStringSearch *strsrch, int32_t textoffset, - uint32_t ce, + int32_t ce, int32_t patternceindex) { - UPattern *pattern = &(strsrch->pattern); + UPattern *pattern = &(strsrch->pattern); if (ce != UCOL_NULLORDER) { int32_t shift = pattern->shift[hash(ce)]; // this is to adjust for characters in the middle of the @@ -743,11 +753,11 @@ UBool hasAccentsBeforeMatch(const UStringSearch *strsrch, int32_t start, UErrorCode status = U_ZERO_ERROR; // we have been iterating forwards previously uint32_t ignorable = TRUE; - uint32_t firstce = strsrch->pattern.CE[0]; + int32_t firstce = strsrch->pattern.CE[0]; - setColEIterOffset(coleiter, start); - uint32_t ce = getCE(strsrch, ucol_next(coleiter, &status)); - if (U_FAILURE(status)) { + setColEIterOffset(coleiter, start); + int32_t ce = getCE(strsrch, ucol_next(coleiter, &status)); + if (U_FAILURE(status)) { return TRUE; } while (ce != firstce) { @@ -759,26 +769,26 @@ UBool hasAccentsBeforeMatch(const UStringSearch *strsrch, int32_t start, return TRUE; } } - if (!ignorable && inNormBuf(coleiter)) { + if (!ignorable && inNormBuf(coleiter)) { // within normalization buffer, discontiguous handled here - return TRUE; + return TRUE; } - // within text + // within text int32_t temp = start; - // original code - // accent = (getFCD(strsrch->search->text, &temp, + // original code + // accent = (getFCD(strsrch->search->text, &temp, // strsrch->search->textLength) - // >> SECOND_LAST_BYTE_SHIFT_); - // however this code does not work well with VC7 .net in release mode. - // maybe the inlines for getFCD combined with shifting has bugs in - // VC7. anyways this is a work around. - UBool accent = getFCD(strsrch->search->text, &temp, + // >> SECOND_LAST_BYTE_SHIFT_); + // however this code does not work well with VC7 .net in release mode. + // maybe the inlines for getFCD combined with shifting has bugs in + // VC7. anyways this is a work around. + UBool accent = getFCD(strsrch->search->text, &temp, strsrch->search->textLength) > 0xFF; if (!accent) { - return checkExtraMatchAccents(strsrch, start, end, &status); + return checkExtraMatchAccents(strsrch, start, end, &status); } - if (!ignorable) { + if (!ignorable) { return TRUE; } if (start > 0) { @@ -825,7 +835,7 @@ UBool hasAccentsAfterMatch(const UStringSearch *strsrch, int32_t start, int32_t textlength = strsrch->search->textLength; UTF_BACK_1(text, 0, temp); if (getFCD(text, &temp, textlength) & LAST_BYTE_MASK_) { - uint32_t firstce = strsrch->pattern.CE[0]; + int32_t firstce = strsrch->pattern.CE[0]; UCollationElements *coleiter = strsrch->textIter; UErrorCode status = U_ZERO_ERROR; setColEIterOffset(coleiter, start); @@ -846,7 +856,7 @@ UBool hasAccentsAfterMatch(const UStringSearch *strsrch, int32_t start, } count ++; } - uint32_t ce = getCE(strsrch, ucol_next(coleiter, &status)); + int32_t ce = getCE(strsrch, ucol_next(coleiter, &status)); if (U_FAILURE(status)) { return TRUE; } @@ -937,7 +947,7 @@ inline UBool checkRepeatedMatch(UStringSearch *strsrch, else { result = start >= lastmatchindex; } - if (!strsrch->search->isOverlap) { + if (!result && !strsrch->search->isOverlap) { if (strsrch->search->isForwardSearching) { result = start < lastmatchindex + strsrch->search->matchedLength; } @@ -993,13 +1003,13 @@ UBool checkNextExactContractionMatch(UStringSearch *strsrch, const UChar *text = strsrch->search->text; // This part checks if either ends of the match contains potential // contraction. If so we'll have to iterate through them - // The start contraction needs to be checked since ucol_previous dumps - // all characters till the first safe character into the buffer. - // *start + 1 is used to test for the unsafe characters instead of *start - // because ucol_prev takes all unsafe characters till the first safe - // character ie *start. so by testing *start + 1, we can estimate if - // excess prefix characters has been included in the potential search - // results. + // The start contraction needs to be checked since ucol_previous dumps + // all characters till the first safe character into the buffer. + // *start + 1 is used to test for the unsafe characters instead of *start + // because ucol_prev takes all unsafe characters till the first safe + // character ie *start. so by testing *start + 1, we can estimate if + // excess prefix characters has been included in the potential search + // results. if ((*end < textlength && ucol_unsafeCP(text[*end], collator)) || (*start + 1 < textlength && ucol_unsafeCP(text[*start + 1], collator))) { @@ -1015,9 +1025,9 @@ UBool checkNextExactContractionMatch(UStringSearch *strsrch, // we are only looking for acute and ring \u030A and \u0301, we'll // have to skip the first ce in the expansion buffer. ucol_next(coleiter, status); - if (U_FAILURE(*status)) { - return FALSE; - } + if (U_FAILURE(*status)) { + return FALSE; + } if (ucol_getOffset(coleiter) != temp) { *start = temp; temp = ucol_getOffset(coleiter); @@ -1025,11 +1035,11 @@ UBool checkNextExactContractionMatch(UStringSearch *strsrch, expansion --; } - uint32_t *patternce = strsrch->pattern.CE; + int32_t *patternce = strsrch->pattern.CE; int32_t patterncelength = strsrch->pattern.CELength; int32_t count = 0; while (count < patterncelength) { - uint32_t ce = getCE(strsrch, ucol_next(coleiter, status)); + int32_t ce = getCE(strsrch, ucol_next(coleiter, status)); if (ce == UCOL_IGNORABLE) { continue; } @@ -1075,8 +1085,8 @@ inline UBool checkNextExactMatch(UStringSearch *strsrch, UCollationElements *coleiter = strsrch->textIter; int32_t start = getColElemIterOffset(coleiter, FALSE); - if (!checkNextExactContractionMatch(strsrch, &start, textoffset, status)) { - return FALSE; + if (!checkNextExactContractionMatch(strsrch, &start, textoffset, status)) { + return FALSE; } // this totally matches, however we need to check if it is repeating @@ -1085,16 +1095,16 @@ inline UBool checkNextExactMatch(UStringSearch *strsrch, hasAccentsBeforeMatch(strsrch, start, *textoffset) || !checkIdentical(strsrch, start, *textoffset) || hasAccentsAfterMatch(strsrch, start, *textoffset)) { - - (*textoffset) ++; + + (*textoffset) ++; *textoffset = getNextUStringSearchBaseOffset(strsrch, *textoffset); - return FALSE; + return FALSE; } // totally match, we will get rid of the ending ignorables. strsrch->search->matchedIndex = start; strsrch->search->matchedLength = *textoffset - start; - return TRUE; + return TRUE; } /** @@ -1224,10 +1234,10 @@ inline UBool checkCollationMatch(const UStringSearch *strsrch, UCollationElements *coleiter) { int patternceindex = strsrch->pattern.CELength; - uint32_t *patternce = strsrch->pattern.CE; + int32_t *patternce = strsrch->pattern.CE; UErrorCode status = U_ZERO_ERROR; while (patternceindex > 0) { - uint32_t ce = getCE(strsrch, ucol_next(coleiter, &status)); + int32_t ce = getCE(strsrch, ucol_next(coleiter, &status)); if (ce == UCOL_IGNORABLE) { continue; } @@ -1288,7 +1298,7 @@ int32_t doNextCanonicalPrefixMatch(UStringSearch *strsrch, int32_t accentsindex[INITIAL_ARRAY_SIZE_]; int32_t accentsize = getUnblockedAccentIndex(accents, accentsindex); - int32_t count = (2 << (accentsize - 1)) - 2; + int32_t count = (2 << (accentsize - 1)) - 1; UChar buffer[INITIAL_ARRAY_SIZE_]; UCollationElements *coleiter = strsrch->utilIter; while (U_SUCCESS(*status) && count > 0) { @@ -1423,13 +1433,13 @@ int32_t doNextCanonicalSuffixMatch(UStringSearch *strsrch, ucol_setText(coleiter, safetext, safetextlength, status); // status checked in loop below - uint32_t *ce = strsrch->pattern.CE; - uint32_t celength = strsrch->pattern.CELength; + int32_t *ce = strsrch->pattern.CE; + int32_t celength = strsrch->pattern.CELength; int ceindex = celength - 1; UBool isSafe = TRUE; // indication flag for position in safe zone while (ceindex >= 0) { - uint32_t textce = ucol_previous(coleiter, status); + int32_t textce = ucol_previous(coleiter, status); if (U_FAILURE(*status)) { if (isSafe) { cleanUpSafeText(strsrch, safetext, safebuffer); @@ -1560,8 +1570,8 @@ UBool doNextCanonicalMatch(UStringSearch *strsrch, int32_t accentsindex[INITIAL_ARRAY_SIZE_]; int32_t size = getUnblockedAccentIndex(accents, accentsindex); - // 2 power n - 1 minus the full set of accents - int32_t count = (2 << (size - 1)) - 2; + // 2 power n - 1 plus the full set of accents + int32_t count = (2 << (size - 1)) - 1; while (U_SUCCESS(*status) && count > 0) { UChar *rearrange = strsrch->canonicalSuffixAccents; // copy the base characters @@ -1638,7 +1648,7 @@ UBool checkNextCanonicalContractionMatch(UStringSearch *strsrch, const UChar *text = strsrch->search->text; // This part checks if either ends of the match contains potential // contraction. If so we'll have to iterate through them - if ((*end < textlength && ucol_unsafeCP(text[*end], collator)) || + if ((*end < textlength && ucol_unsafeCP(text[*end], collator)) || (*start + 1 < textlength && ucol_unsafeCP(text[*start + 1], collator))) { int32_t expansion = getExpansionPrefix(coleiter); @@ -1653,9 +1663,9 @@ UBool checkNextCanonicalContractionMatch(UStringSearch *strsrch, // we are only looking for acute and ring \u030A and \u0301, we'll // have to skip the first ce in the expansion buffer. ucol_next(coleiter, status); - if (U_FAILURE(*status)) { - return FALSE; - } + if (U_FAILURE(*status)) { + return FALSE; + } if (ucol_getOffset(coleiter) != temp) { *start = temp; temp = ucol_getOffset(coleiter); @@ -1663,12 +1673,12 @@ UBool checkNextCanonicalContractionMatch(UStringSearch *strsrch, expansion --; } - uint32_t *patternce = strsrch->pattern.CE; + int32_t *patternce = strsrch->pattern.CE; int32_t patterncelength = strsrch->pattern.CELength; int32_t count = 0; int32_t textlength = strsrch->search->textLength; while (count < patterncelength) { - uint32_t ce = getCE(strsrch, ucol_next(coleiter, status)); + int32_t ce = getCE(strsrch, ucol_next(coleiter, status)); // status checked below, note that if status is a failure // ucol_next returns UCOL_NULLORDER if (ce == UCOL_IGNORABLE) { @@ -1683,7 +1693,7 @@ UBool checkNextCanonicalContractionMatch(UStringSearch *strsrch, // accents may have extra starting ces, this occurs when a // pure accent pattern is matched without rearrangement // text \u0325\u0300 and looking for \u0300 - uint32_t expected = patternce[0]; + int32_t expected = patternce[0]; if (getFCD(text, start, textlength) & LAST_BYTE_MASK_) { ce = getCE(strsrch, ucol_next(coleiter, status)); while (U_SUCCESS(*status) && ce != expected && @@ -1781,7 +1791,7 @@ inline UBool checkNextCanonicalMatch(UStringSearch *strsrch, static inline int32_t reverseShift(UStringSearch *strsrch, int32_t textoffset, - uint32_t ce, + int32_t ce, int32_t patternceindex) { if (strsrch->search->isOverlap) { @@ -1835,9 +1845,9 @@ UBool checkPreviousExactContractionMatch(UStringSearch *strsrch, const UChar *text = strsrch->search->text; // This part checks if either if the start of the match contains potential // contraction. If so we'll have to iterate through them - // Since we used ucol_next while previously looking for the potential - // match, this guarantees that our end will not be a partial contraction, - // or a partial supplementary character. + // Since we used ucol_next while previously looking for the potential + // match, this guarantees that our end will not be a partial contraction, + // or a partial supplementary character. if (*start < textlength && ucol_unsafeCP(text[*start], collator)) { int32_t expansion = getExpansionSuffix(coleiter); UBool expandflag = expansion > 0; @@ -1851,9 +1861,9 @@ UBool checkPreviousExactContractionMatch(UStringSearch *strsrch, // we are only looking for A ring A\u030A, we'll have to skip the // last ce in the expansion buffer ucol_previous(coleiter, status); - if (U_FAILURE(*status)) { - return FALSE; - } + if (U_FAILURE(*status)) { + return FALSE; + } if (ucol_getOffset(coleiter) != temp) { *end = temp; temp = ucol_getOffset(coleiter); @@ -1861,11 +1871,11 @@ UBool checkPreviousExactContractionMatch(UStringSearch *strsrch, expansion --; } - uint32_t *patternce = strsrch->pattern.CE; + int32_t *patternce = strsrch->pattern.CE; int32_t patterncelength = strsrch->pattern.CELength; int32_t count = patterncelength; while (count > 0) { - uint32_t ce = getCE(strsrch, ucol_previous(coleiter, status)); + int32_t ce = getCE(strsrch, ucol_previous(coleiter, status)); // status checked below, note that if status is a failure // ucol_previous returns UCOL_NULLORDER if (ce == UCOL_IGNORABLE) { @@ -1984,7 +1994,7 @@ int32_t doPreviousCanonicalSuffixMatch(UStringSearch *strsrch, int32_t accentsindex[INITIAL_ARRAY_SIZE_]; int32_t accentsize = getUnblockedAccentIndex(accents, accentsindex); - int32_t count = (2 << (accentsize - 1)) - 2; + int32_t count = (2 << (accentsize - 1)) - 1; UChar buffer[INITIAL_ARRAY_SIZE_]; UCollationElements *coleiter = strsrch->utilIter; while (U_SUCCESS(*status) && count > 0) { @@ -2080,14 +2090,14 @@ int32_t doPreviousCanonicalPrefixMatch(UStringSearch *strsrch, ucol_setText(coleiter, safetext, safetextlength, status); // status checked in loop below - uint32_t *ce = strsrch->pattern.CE; + int32_t *ce = strsrch->pattern.CE; int32_t celength = strsrch->pattern.CELength; int ceindex = 0; UBool isSafe = TRUE; // safe zone indication flag for position int32_t prefixlength = u_strlen(strsrch->canonicalPrefixAccents); while (ceindex < celength) { - uint32_t textce = ucol_next(coleiter, status); + int32_t textce = ucol_next(coleiter, status); if (U_FAILURE(*status)) { if (isSafe) { cleanUpSafeText(strsrch, safetext, safebuffer); @@ -2217,8 +2227,8 @@ UBool doPreviousCanonicalMatch(UStringSearch *strsrch, int32_t accentsindex[INITIAL_ARRAY_SIZE_]; int32_t size = getUnblockedAccentIndex(accents, accentsindex); - // 2 power n - 1 minus the full set of accents - int32_t count = (2 << (size - 1)) - 2; + // 2 power n - 1 plus the full set of accents + int32_t count = (2 << (size - 1)) - 1; while (U_SUCCESS(*status) && count > 0) { UChar *rearrange = strsrch->canonicalPrefixAccents; // copy the base characters @@ -2267,11 +2277,11 @@ UBool checkPreviousCanonicalContractionMatch(UStringSearch *strsrch, int32_t temp = *end; const UCollator *collator = strsrch->collator; const UChar *text = strsrch->search->text; - // This part checks if either if the start of the match contains potential + // This part checks if either if the start of the match contains potential // contraction. If so we'll have to iterate through them - // Since we used ucol_next while previously looking for the potential - // match, this guarantees that our end will not be a partial contraction, - // or a partial supplementary character. + // Since we used ucol_next while previously looking for the potential + // match, this guarantees that our end will not be a partial contraction, + // or a partial supplementary character. if (*start < textlength && ucol_unsafeCP(text[*start], collator)) { int32_t expansion = getExpansionSuffix(coleiter); UBool expandflag = expansion > 0; @@ -2285,9 +2295,9 @@ UBool checkPreviousCanonicalContractionMatch(UStringSearch *strsrch, // we are only looking for A ring A\u030A, we'll have to skip the // last ce in the expansion buffer ucol_previous(coleiter, status); - if (U_FAILURE(*status)) { - return FALSE; - } + if (U_FAILURE(*status)) { + return FALSE; + } if (ucol_getOffset(coleiter) != temp) { *end = temp; temp = ucol_getOffset(coleiter); @@ -2295,11 +2305,11 @@ UBool checkPreviousCanonicalContractionMatch(UStringSearch *strsrch, expansion --; } - uint32_t *patternce = strsrch->pattern.CE; + int32_t *patternce = strsrch->pattern.CE; int32_t patterncelength = strsrch->pattern.CELength; int32_t count = patterncelength; while (count > 0) { - uint32_t ce = getCE(strsrch, ucol_previous(coleiter, status)); + int32_t ce = getCE(strsrch, ucol_previous(coleiter, status)); // status checked below, note that if status is a failure // ucol_previous returns UCOL_NULLORDER if (ce == UCOL_IGNORABLE) { @@ -2314,7 +2324,7 @@ UBool checkPreviousCanonicalContractionMatch(UStringSearch *strsrch, ce != patternce[patterncelength - 1]) { // accents may have extra starting ces, this occurs when a // pure accent pattern is matched without rearrangement - uint32_t expected = patternce[patterncelength - 1]; + int32_t expected = patternce[patterncelength - 1]; UTF_BACK_1(text, 0, *end); if (getFCD(text, end, textlength) & LAST_BYTE_MASK_) { ce = getCE(strsrch, ucol_previous(coleiter, status)); @@ -2462,6 +2472,11 @@ U_CAPI UStringSearch * U_EXPORT2 usearch_openFromCollator( *status = U_ILLEGAL_ARGUMENT_ERROR; } + // string search does not really work when numeric collation is turned on + if(ucol_getAttribute(collator, UCOL_NUMERIC_COLLATION, status) == UCOL_ON) { + *status = U_UNSUPPORTED_ERROR; + } + if (U_SUCCESS(*status)) { initializeFCD(status); if (U_FAILURE(*status)) { @@ -2739,10 +2754,10 @@ U_CAPI void U_EXPORT2 usearch_setText( UStringSearch *strsrch, strsrch->search->matchedLength = 0; strsrch->search->reset = TRUE; #if !UCONFIG_NO_BREAK_ITERATION - if (strsrch->search->breakIter != NULL) { - ubrk_setText(strsrch->search->breakIter, text, - textlength, status); - } + if (strsrch->search->breakIter != NULL) { + ubrk_setText(strsrch->search->breakIter, text, + textlength, status); + } #endif } } @@ -2787,7 +2802,7 @@ U_CAPI void U_EXPORT2 usearch_setCollator( UStringSearch *strsrch, uprv_init_collIterate(collator, strsrch->search->text, strsrch->search->textLength, &(strsrch->textIter->iteratordata_)); - strsrch->utilIter->iteratordata_.coll = collator; + strsrch->utilIter->iteratordata_.coll = collator; } } } @@ -2921,17 +2936,18 @@ U_CAPI int32_t U_EXPORT2 usearch_next(UStringSearch *strsrch, UErrorCode *status) { if (U_SUCCESS(*status) && strsrch) { - int32_t offset = usearch_getOffset(strsrch); - USearch *search = strsrch->search; - search->reset = FALSE; - int32_t textlength = search->textLength; - int32_t matchedindex = search->matchedIndex; + // note offset is either equivalent to the start of the previous match + // or is set by the user + int32_t offset = usearch_getOffset(strsrch); + USearch *search = strsrch->search; + search->reset = FALSE; + int32_t textlength = search->textLength; if (search->isForwardSearching) { - if (offset == textlength || matchedindex == textlength || - (!search->isOverlap && + if (offset == textlength + || (!search->isOverlap && (offset + strsrch->pattern.defaultShiftSize > textlength || - (matchedindex != USEARCH_DONE && - matchedindex + search->matchedLength >= textlength)))) { + (search->matchedIndex != USEARCH_DONE && + offset + search->matchedLength >= textlength)))) { // not enough characters to match setMatchNotFound(strsrch); return USEARCH_DONE; @@ -2944,16 +2960,16 @@ U_CAPI int32_t U_EXPORT2 usearch_next(UStringSearch *strsrch, // string. the iterator would have been set to offset 0 if a // match is not found. search->isForwardSearching = TRUE; - if (matchedindex != USEARCH_DONE) { + if (search->matchedIndex != USEARCH_DONE) { // there's no need to set the collation element iterator // the next call to next will set the offset. - return matchedindex; + return search->matchedIndex; } } if (U_SUCCESS(*status)) { if (strsrch->pattern.CELength == 0) { - if (matchedindex == USEARCH_DONE) { + if (search->matchedIndex == USEARCH_DONE) { search->matchedIndex = offset; } else { // moves by codepoints @@ -2968,30 +2984,37 @@ U_CAPI int32_t U_EXPORT2 usearch_next(UStringSearch *strsrch, } } else { - if (search->matchedLength > 0) { - // if matchlength is 0 we are at the start of the iteration - int offset = ucol_getOffset(strsrch->textIter); - if (search->isOverlap) { - ucol_setOffset(strsrch->textIter, offset + 1, status); - } - else { - ucol_setOffset(strsrch->textIter, - offset + search->matchedLength, status); - } - } - if (search->isCanonicalMatch) { - // can't use exact here since extra accents are allowed. - usearch_handleNextCanonical(strsrch, status); - } - else { - usearch_handleNextExact(strsrch, status); - } - } - + if (search->matchedLength > 0) { + // if matchlength is 0 we are at the start of the iteration + if (search->isOverlap) { + ucol_setOffset(strsrch->textIter, offset + 1, status); + } + else { + ucol_setOffset(strsrch->textIter, + offset + search->matchedLength, status); + } + } + else { + // for boundary check purposes. this will ensure that the + // next match will not preceed the current offset + // note search->matchedIndex will always be set to something + // in the code + search->matchedIndex = offset - 1; + } + + if (search->isCanonicalMatch) { + // can't use exact here since extra accents are allowed. + usearch_handleNextCanonical(strsrch, status); + } + else { + usearch_handleNextExact(strsrch, status); + } + } + if (U_FAILURE(*status)) { return USEARCH_DONE; } - + return search->matchedIndex; } } @@ -3135,26 +3158,26 @@ UBool usearch_handleNextExact(UStringSearch *strsrch, UErrorCode *status) return FALSE; } - UCollationElements *coleiter = strsrch->textIter; + UCollationElements *coleiter = strsrch->textIter; int32_t textlength = strsrch->search->textLength; - uint32_t *patternce = strsrch->pattern.CE; + int32_t *patternce = strsrch->pattern.CE; int32_t patterncelength = strsrch->pattern.CELength; int32_t textoffset = ucol_getOffset(coleiter); - // status used in setting coleiter offset, since offset is checked in - // shiftForward before setting the coleiter offset, status never - // a failure + // status used in setting coleiter offset, since offset is checked in + // shiftForward before setting the coleiter offset, status never + // a failure textoffset = shiftForward(strsrch, textoffset, UCOL_NULLORDER, patterncelength); while (textoffset <= textlength) { uint32_t patternceindex = patterncelength - 1; - uint32_t targetce; + int32_t targetce; UBool found = FALSE; - uint32_t lastce = UCOL_NULLORDER; - - setColEIterOffset(coleiter, textoffset); - + int32_t lastce = UCOL_NULLORDER; + + setColEIterOffset(coleiter, textoffset); + while (TRUE) { // finding the last pattern ce match, imagine composite characters // for example: search for pattern A in text \u00C0 @@ -3202,24 +3225,24 @@ UBool usearch_handleNextExact(UStringSearch *strsrch, UErrorCode *status) } if (!found) { - if (U_FAILURE(*status)) { - break; - } - textoffset = shiftForward(strsrch, textoffset, targetce, + if (U_FAILURE(*status)) { + break; + } + textoffset = shiftForward(strsrch, textoffset, lastce, patternceindex); // status checked at loop. patternceindex = patterncelength; continue; } - - if (checkNextExactMatch(strsrch, &textoffset, status)) { + + if (checkNextExactMatch(strsrch, &textoffset, status)) { // status checked in ucol_setOffset - setColEIterOffset(coleiter, strsrch->search->matchedIndex); - return TRUE; + setColEIterOffset(coleiter, strsrch->search->matchedIndex); + return TRUE; } } setMatchNotFound(strsrch); - return FALSE; + return FALSE; } UBool usearch_handleNextCanonical(UStringSearch *strsrch, UErrorCode *status) @@ -3231,9 +3254,9 @@ UBool usearch_handleNextCanonical(UStringSearch *strsrch, UErrorCode *status) UCollationElements *coleiter = strsrch->textIter; int32_t textlength = strsrch->search->textLength; - uint32_t *patternce = strsrch->pattern.CE; + int32_t *patternce = strsrch->pattern.CE; int32_t patterncelength = strsrch->pattern.CELength; - int32_t textoffset = ucol_getOffset(coleiter); + int32_t textoffset = ucol_getOffset(coleiter); UBool hasPatternAccents = strsrch->pattern.hasSuffixAccents || strsrch->pattern.hasPrefixAccents; @@ -3245,13 +3268,13 @@ UBool usearch_handleNextCanonical(UStringSearch *strsrch, UErrorCode *status) while (textoffset <= textlength) { int32_t patternceindex = patterncelength - 1; - uint32_t targetce; + int32_t targetce; UBool found = FALSE; - uint32_t lastce = UCOL_NULLORDER; - - setColEIterOffset(coleiter, textoffset); - - while (TRUE) { + int32_t lastce = UCOL_NULLORDER; + + setColEIterOffset(coleiter, textoffset); + + for (;;) { // finding the last pattern ce match, imagine composite characters // for example: search for pattern A in text \u00C0 // we'll have to skip \u0300 the grave first before we get to A @@ -3274,7 +3297,6 @@ UBool usearch_handleNextCanonical(UStringSearch *strsrch, UErrorCode *status) break; } } - targetce = lastce; while (found && patternceindex > 0) { targetce = ucol_previous(coleiter, status); @@ -3295,17 +3317,17 @@ UBool usearch_handleNextCanonical(UStringSearch *strsrch, UErrorCode *status) if (hasPatternAccents && !found) { strsrch->canonicalPrefixAccents[0] = 0; strsrch->canonicalSuffixAccents[0] = 0; - if (U_FAILURE(*status)) { - break; - } + if (U_FAILURE(*status)) { + break; + } found = doNextCanonicalMatch(strsrch, textoffset, status); } if (!found) { - if (U_FAILURE(*status)) { - break; - } - textoffset = shiftForward(strsrch, textoffset, targetce, + if (U_FAILURE(*status)) { + break; + } + textoffset = shiftForward(strsrch, textoffset, lastce, patternceindex); // status checked at loop patternceindex = patterncelength; @@ -3329,9 +3351,9 @@ UBool usearch_handlePreviousExact(UStringSearch *strsrch, UErrorCode *status) } UCollationElements *coleiter = strsrch->textIter; - uint32_t *patternce = strsrch->pattern.CE; + int32_t *patternce = strsrch->pattern.CE; int32_t patterncelength = strsrch->pattern.CELength; - int32_t textoffset = ucol_getOffset(coleiter); + int32_t textoffset = ucol_getOffset(coleiter); // shifting it check for setting offset // if setOffset is called previously or there was no previous match, we @@ -3346,14 +3368,14 @@ UBool usearch_handlePreviousExact(UStringSearch *strsrch, UErrorCode *status) while (textoffset >= 0) { int32_t patternceindex = 1; - uint32_t targetce; + int32_t targetce; UBool found = FALSE; - uint32_t firstce = UCOL_NULLORDER; + int32_t firstce = UCOL_NULLORDER; - // if status is a failure, ucol_setOffset does nothing + // if status is a failure, ucol_setOffset does nothing setColEIterOffset(coleiter, textoffset); - - while (TRUE) { + + for (;;) { // finding the first pattern ce match, imagine composite // characters. for example: search for pattern \u0300 in text // \u00C0, we'll have to skip A first before we get to @@ -3399,9 +3421,9 @@ UBool usearch_handlePreviousExact(UStringSearch *strsrch, UErrorCode *status) } if (!found) { - if (U_FAILURE(*status)) { - break; - } + if (U_FAILURE(*status)) { + break; + } textoffset = reverseShift(strsrch, textoffset, targetce, patternceindex); patternceindex = 0; @@ -3426,9 +3448,9 @@ UBool usearch_handlePreviousCanonical(UStringSearch *strsrch, } UCollationElements *coleiter = strsrch->textIter; - uint32_t *patternce = strsrch->pattern.CE; + int32_t *patternce = strsrch->pattern.CE; int32_t patterncelength = strsrch->pattern.CELength; - int32_t textoffset = ucol_getOffset(coleiter); + int32_t textoffset = ucol_getOffset(coleiter); UBool hasPatternAccents = strsrch->pattern.hasSuffixAccents || strsrch->pattern.hasPrefixAccents; @@ -3447,9 +3469,9 @@ UBool usearch_handlePreviousCanonical(UStringSearch *strsrch, while (textoffset >= 0) { int32_t patternceindex = 1; - uint32_t targetce; + int32_t targetce; UBool found = FALSE; - uint32_t firstce = UCOL_NULLORDER; + int32_t firstce = UCOL_NULLORDER; setColEIterOffset(coleiter, textoffset); while (TRUE) { @@ -3500,14 +3522,14 @@ UBool usearch_handlePreviousCanonical(UStringSearch *strsrch, if (hasPatternAccents && !found) { strsrch->canonicalPrefixAccents[0] = 0; strsrch->canonicalSuffixAccents[0] = 0; - if (U_FAILURE(*status)) { + if (U_FAILURE(*status)) { break; } found = doPreviousCanonicalMatch(strsrch, textoffset, status); } if (!found) { - if (U_FAILURE(*status)) { + if (U_FAILURE(*status)) { break; } textoffset = reverseShift(strsrch, textoffset, targetce, diff --git a/icuSources/i18n/usrchimp.h b/icuSources/i18n/usrchimp.h index 30683e5b..94968a71 100644 --- a/icuSources/i18n/usrchimp.h +++ b/icuSources/i18n/usrchimp.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2001 IBM and others. All rights reserved. +* Copyright (C) 2001-2004 IBM and others. All rights reserved. ********************************************************************** * Date Name Description * 08/13/2001 synwee Creation. @@ -42,8 +42,8 @@ struct UPattern { int32_t textLength; // exact length // length required for backwards ce comparison int32_t CELength; - uint32_t *CE; - uint32_t CEBuffer[INITIAL_ARRAY_SIZE_]; + int32_t *CE; + int32_t CEBuffer[INITIAL_ARRAY_SIZE_]; UBool hasPrefixAccents; UBool hasSuffixAccents; int16_t defaultShiftSize; diff --git a/icuSources/i18n/utmscale.c b/icuSources/i18n/utmscale.c new file mode 100644 index 00000000..12ff5794 --- /dev/null +++ b/icuSources/i18n/utmscale.c @@ -0,0 +1,175 @@ +/* +******************************************************************************* +* Copyright (C) 2004, International Business Machines Corporation and +* others. All Rights Reserved. +******************************************************************************* +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/utmscale.h" + +#define ticks INT64_C(1) +#define microseconds (ticks * 10) +#define milliseconds (microseconds * 1000) +#define seconds (milliseconds * 1000) +#define minutes (seconds * 60) +#define hours (minutes * 60) +#define days (hours * 24) + +#define TIME_SCALE_CHECK(scale,status) \ + if(scale < 0 || scale >= UDTS_MAX_SCALE) { \ + *status = U_ILLEGAL_ARGUMENT_ERROR; \ + return 0; \ + } + +typedef struct +{ + int64_t units; + int64_t epochOffset; + + int64_t fromMin; + int64_t fromMax; + int64_t toMin; + int64_t toMax; + + int64_t epochOffsetP1; + int64_t epochOffsetM1; + int64_t unitsRound; + int64_t minRound; + int64_t maxRound; +} InternalTimeScaleData; + +static const InternalTimeScaleData timeScaleTable[] = { + /* units epochOffset fromMin fromMax toMin toMax epochOffsetP1 epochOffsetM1 unitsRound minRound maxRound */ + {milliseconds, INT64_C(62135769600000), INT64_C(-984472973285477), INT64_C(860201434085477), INT64_C(-9223372036854774999), INT64_C(9223372036854774999), INT64_C(62135769600001), INT64_C(62135769599999), INT64_C(5000), INT64_C(-9223372036854770808), INT64_C(9223372036854770807)}, + {seconds, INT64_C(62135769600), INT64_C(-984472973285), INT64_C(860201434085), U_INT64_MIN, INT64_C(9223372036854775807), INT64_C(62135769601), INT64_C(62135769599), INT64_C(5000000), INT64_C(-9223372036849775808), INT64_C(9223372036849775807)}, + {milliseconds, INT64_C(62135769600000), INT64_C(-984472973285477), INT64_C(860201434085477), INT64_C(-9223372036854774999), INT64_C(9223372036854774999), INT64_C(62135769600001), INT64_C(62135769599999), INT64_C(5000), INT64_C(-9223372036854770808), INT64_C(9223372036854770807)}, + {ticks, INT64_C(504912960000000000), U_INT64_MIN, INT64_C(8718459076854775807), INT64_C(-8718459076854775808), INT64_C(9223372036854775807), INT64_C(504912960000000000), INT64_C(504912960000000000), INT64_C(0), U_INT64_MIN, INT64_C(9223372036854775807)}, + {ticks, INT64_C(0), U_INT64_MIN, INT64_C(9223372036854775807), U_INT64_MIN, INT64_C(9223372036854775807), INT64_C(0), INT64_C(0), INT64_C(0), U_INT64_MIN, INT64_C(9223372036854775807)}, + {seconds, INT64_C(60052924800), INT64_C(-982390128485), INT64_C(862284278885), U_INT64_MIN, INT64_C(9223372036854775807), INT64_C(60052924801), INT64_C(60052924799), INT64_C(5000000), INT64_C(-9223372036849775808), INT64_C(9223372036849775807)}, + {seconds, INT64_C(63114076800), INT64_C(-985451280485), INT64_C(859223126885), U_INT64_MIN, INT64_C(9223372036854775807), INT64_C(63114076801), INT64_C(63114076799), INT64_C(5000000), INT64_C(-9223372036849775808), INT64_C(9223372036849775807)}, + {days, INT64_C(693596), INT64_C(-11368795), INT64_C(9981603), U_INT64_MIN, INT64_C(9223372036854775807), INT64_C(693597), INT64_C(693595), INT64_C(432000000000), INT64_C(-9223371604854775808), INT64_C(9223371604854775807)}, + {days, INT64_C(693596), INT64_C(-11368795), INT64_C(9981603), U_INT64_MIN, INT64_C(9223372036854775807), INT64_C(693597), INT64_C(693595), INT64_C(432000000000), INT64_C(-9223371604854775808), INT64_C(9223371604854775807)}, +}; + +U_CAPI int64_t U_EXPORT2 +utmscale_getTimeScaleValue(UDateTimeScale timeScale, UTimeScaleValue value, UErrorCode *status) +{ + const InternalTimeScaleData *internalData; + + if (status == NULL || U_FAILURE(*status)) { + return 0; + } + + if (timeScale < 0 || timeScale >= UDTS_MAX_SCALE) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + internalData = &timeScaleTable[timeScale]; + + switch (value) + { + case UTSV_UNITS_VALUE: + return internalData->units; + + case UTSV_EPOCH_OFFSET_VALUE: + return internalData->epochOffset; + + case UTSV_FROM_MIN_VALUE: + return internalData->fromMin; + + case UTSV_FROM_MAX_VALUE: + return internalData->fromMax; + + case UTSV_TO_MIN_VALUE: + return internalData->toMin; + + case UTSV_TO_MAX_VALUE: + return internalData->toMax; + + case UTSV_EPOCH_OFFSET_PLUS_1_VALUE: + return internalData->epochOffsetP1; + + case UTSV_EPOCH_OFFSET_MINUS_1_VALUE: + return internalData->epochOffsetM1; + + case UTSV_UNITS_ROUND_VALUE: + return internalData->unitsRound; + + case UTSV_MIN_ROUND_VALUE: + return internalData->minRound; + + case UTSV_MAX_ROUND_VALUE: + return internalData->maxRound; + + default: + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } +} + +U_CAPI int64_t U_EXPORT2 +utmscale_fromInt64(int64_t otherTime, UDateTimeScale timeScale, UErrorCode *status) +{ + const InternalTimeScaleData *data; + + if (status == NULL || U_FAILURE(*status)) { + return 0; + } + + if (timeScale < 0 || timeScale >= UDTS_MAX_SCALE) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + data = &timeScaleTable[timeScale]; + + if (otherTime < data->fromMin || otherTime > data->fromMax) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + return (otherTime + data->epochOffset) * data->units; +} + +U_CAPI int64_t U_EXPORT2 +utmscale_toInt64(int64_t universalTime, UDateTimeScale timeScale, UErrorCode *status) +{ + const InternalTimeScaleData *data; + + if (status == NULL || U_FAILURE(*status)) { + return 0; + } + + if (timeScale < 0 || timeScale >= UDTS_MAX_SCALE) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + data = &timeScaleTable[timeScale]; + + if (universalTime < data->toMin || universalTime > data->toMax) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + if (universalTime < 0) { + if (universalTime < data->minRound) { + return (universalTime + data->unitsRound) / data->units - data->epochOffsetP1; + } + + return (universalTime - data->unitsRound) / data->units - data->epochOffset; + } + + if (universalTime > data->maxRound) { + return (universalTime - data->unitsRound) / data->units - data->epochOffsetM1; + } + + return (universalTime + data->unitsRound) / data->units - data->epochOffset; +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/i18n/utrans.cpp b/icuSources/i18n/utrans.cpp index ff1a3637..3535117a 100644 --- a/icuSources/i18n/utrans.cpp +++ b/icuSources/i18n/utrans.cpp @@ -1,12 +1,12 @@ /* -******************************************************************************* -* Copyright (C) 1997-2003, International Business Machines -* Corporation and others. All Rights Reserved. -******************************************************************************* -* Date Name Description -* 06/21/00 aliu Creation. -******************************************************************************* -*/ + ******************************************************************************* + * Copyright (C) 1997-2004, International Business Machines + * Corporation and others. All Rights Reserved. + ******************************************************************************* + * Date Name Description + * 06/21/00 aliu Creation. + ******************************************************************************* + */ #include "unicode/utypes.h" @@ -19,6 +19,8 @@ #include "unicode/unifilt.h" #include "unicode/uniset.h" #include "unicode/ustring.h" +#include "unicode/uenum.h" +#include "uenumimp.h" #include "cpputils.h" #include "rbt.h" @@ -38,12 +40,6 @@ class ReplaceableGlue : public Replaceable { UReplaceable *rep; UReplaceableCallbacks *func; - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; - public: ReplaceableGlue(UReplaceable *replaceable, @@ -68,14 +64,14 @@ public: * * @draft ICU 2.2 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual inline UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * * @draft ICU 2.2 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } + static inline UClassID U_EXPORT2 getStaticClassID(); protected: @@ -86,8 +82,7 @@ protected: virtual UChar32 getChar32At(int32_t offset) const; }; - -const char ReplaceableGlue::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ReplaceableGlue) ReplaceableGlue::ReplaceableGlue(UReplaceable *replaceable, UReplaceableCallbacks *funcCallback) @@ -132,84 +127,18 @@ U_NAMESPACE_END * General API ********************************************************************/ U_NAMESPACE_USE -#if 0 - -U_CAPI UTransliterator* -utrans_open(const char* id, - UTransDirection dir, - UParseError* parseError, - UErrorCode* status) { - - utrans_ENTRY(status) NULL; - - if (id == NULL) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - return NULL; - } - - UnicodeString ID(id, ""); // use invariant converter - Transliterator *trans = NULL; - - trans = Transliterator::createInstance(ID, dir, *parseError, *status); - - if (trans == NULL) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - } - return (UTransliterator*) trans; -} - -U_CAPI UTransliterator* -utrans_openRules(const char* id, - const UChar* rules, - int32_t rulesLength, /* -1 if null-terminated */ - UTransDirection dir, - UParseError* parseErr, /* may be NULL */ - UErrorCode* status) { - utrans_ENTRY(status) NULL; - - if (id == NULL || rules == NULL) { - *status = U_ILLEGAL_ARGUMENT_ERROR; +U_CAPI UTransliterator* U_EXPORT2 +utrans_openU(const UChar *id, + int32_t idLength, + UTransDirection dir, + const UChar *rules, + int32_t rulesLength, + UParseError *parseError, + UErrorCode *status) { + if(status==NULL || U_FAILURE(*status)) { return NULL; } - - UnicodeString ID(id, ""); // use invariant converter - UnicodeString ruleStr(rulesLength < 0, - rules, - rulesLength); // r-o alias - - RuleBasedTransliterator *trans = NULL; - - // Use if() to avoid construction of ParseError object on stack - // unless it is called for by user. - if (parseErr != NULL) { - trans = new RuleBasedTransliterator(ID, ruleStr, dir, - NULL, *parseErr, *status); - } else { - trans = new RuleBasedTransliterator(ID, ruleStr, dir, - NULL, *status); - } - - if (trans == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - } else if (U_FAILURE(*status)) { - delete trans; - trans = NULL; - } - return (UTransliterator*) trans; -} -#endif - -U_CAPI UTransliterator* U_EXPORT2 -utrans_open(const char* id, - UTransDirection dir, - const UChar* rules, /* may be Null */ - int32_t rulesLength, /* -1 if null-terminated */ - UParseError* parseError, /* may be Null */ - UErrorCode* status) { - - utrans_ENTRY(status) NULL; - if (id == NULL) { *status = U_ILLEGAL_ARGUMENT_ERROR; return NULL; @@ -220,7 +149,7 @@ utrans_open(const char* id, parseError = &temp; } - UnicodeString ID(id, ""); // use invariant converter + UnicodeString ID(idLength<0, id, idLength); // r-o alias if(rules==NULL){ @@ -250,6 +179,19 @@ utrans_open(const char* id, } } +U_CAPI UTransliterator* U_EXPORT2 +utrans_open(const char* id, + UTransDirection dir, + const UChar* rules, /* may be Null */ + int32_t rulesLength, /* -1 if null-terminated */ + UParseError* parseError, /* may be Null */ + UErrorCode* status) { + UnicodeString ID(id, ""); // use invariant converter + return utrans_openU(ID.getBuffer(), ID.length(), dir, + rules, rulesLength, + parseError, status); +} + U_CAPI UTransliterator* U_EXPORT2 utrans_openInverse(const UTransliterator* trans, UErrorCode* status) { @@ -285,6 +227,17 @@ utrans_close(UTransliterator* trans) { delete (Transliterator*) trans; } +U_CAPI const UChar * U_EXPORT2 +utrans_getUnicodeID(const UTransliterator *trans, + int32_t *resultLength) { + // Transliterator keeps its ID NUL-terminated + const UnicodeString &ID=((Transliterator*) trans)->getID(); + if(resultLength!=NULL) { + *resultLength=ID.length(); + } + return ID.getBuffer(); +} + U_CAPI int32_t U_EXPORT2 utrans_getID(const UTransliterator* trans, char* buf, @@ -300,6 +253,12 @@ utrans_register(UTransliterator* adoptedTrans, Transliterator::registerInstance((Transliterator*) adoptedTrans); } +U_CAPI void U_EXPORT2 +utrans_unregisterID(const UChar* id, int32_t idLength) { + UnicodeString ID(idLength<0, id, idLength); // r-o alias + Transliterator::unregister(ID); +} + U_CAPI void U_EXPORT2 utrans_unregister(const char* id) { UnicodeString ID(id, ""); // use invariant converter @@ -343,6 +302,95 @@ utrans_getAvailableID(int32_t index, return Transliterator::getAvailableID(index).extract(0, 0x7fffffff, buf, bufCapacity, ""); } +/* Transliterator UEnumeration ---------------------------------------------- */ + +typedef struct UTransEnumeration { + UEnumeration uenum; + int32_t index, count; +} UTransEnumeration; + +U_CDECL_BEGIN +static int32_t U_CALLCONV +utrans_enum_count(UEnumeration *uenum, UErrorCode *pErrorCode) { + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + return ((UTransEnumeration *)uenum)->count; +} + +static const UChar* U_CALLCONV +utrans_enum_unext(UEnumeration *uenum, + int32_t* resultLength, + UErrorCode *pErrorCode) { + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + + UTransEnumeration *ute=(UTransEnumeration *)uenum; + int32_t index=ute->index; + if(indexcount) { + const UnicodeString &ID=Transliterator::getAvailableID(index); + ute->index=index+1; + if(resultLength!=NULL) { + *resultLength=ID.length(); + } + // Transliterator keeps its ID NUL-terminated + return ID.getBuffer(); + } + + if(resultLength!=NULL) { + *resultLength=0; + } + return NULL; +} + +static void U_CALLCONV +utrans_enum_reset(UEnumeration *uenum, UErrorCode *pErrorCode) { + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return; + } + + UTransEnumeration *ute=(UTransEnumeration *)uenum; + ute->index=0; + ute->count=Transliterator::countAvailableIDs(); +} + +static void U_CALLCONV +utrans_enum_close(UEnumeration *uenum) { + uprv_free(uenum); +} +U_CDECL_END + +static const UEnumeration utransEnumeration={ + NULL, + NULL, + utrans_enum_close, + utrans_enum_count, + utrans_enum_unext, + uenum_nextDefault, + utrans_enum_reset +}; + +U_CAPI UEnumeration * U_EXPORT2 +utrans_openIDs(UErrorCode *pErrorCode) { + UTransEnumeration *ute; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return NULL; + } + + ute=(UTransEnumeration *)uprv_malloc(sizeof(UTransEnumeration)); + if(ute==NULL) { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + + ute->uenum=utransEnumeration; + ute->index=0; + ute->count=Transliterator::countAvailableIDs(); + return (UEnumeration *)ute; +} + /******************************************************************** * Transliteration API ********************************************************************/ diff --git a/icuSources/icudefs.mk.in b/icuSources/icudefs.mk.in index 7117d6a9..331c8363 100644 --- a/icuSources/icudefs.mk.in +++ b/icuSources/icudefs.mk.in @@ -3,7 +3,7 @@ # # Yves Arrouye. # -# Copyright (C) 2000-2003, International Business Machines Corporation and others. +# Copyright (C) 2000-2004, International Business Machines Corporation and others. # All Rights Reserved. # @@ -36,7 +36,7 @@ SO_TARGET_VERSION = @LIB_VERSION@ SO_TARGET_VERSION_MAJOR = @LIB_VERSION_MAJOR@ # The ICU data external name is usually icudata; the entry point name is -# the version-dependent name (for no particula reason except it was easier +# the version-dependent name (for no particular reason except it was easier # to change the build this way). When building in common mode, the data # name is the versioned platform-dependent one. @@ -45,6 +45,7 @@ ICUDATA_DIR = @pkgicudatadir@/$(PACKAGE)$(ICULIBSUFFIX)/$(VERSION) ICUDATA_BASENAME_VERSION = $(ICUPREFIX)dt@LIB_VERSION_MAJOR@ ICUDATA_ENTRY_POINT = $(ICUDATA_BASENAME_VERSION) ICUDATA_PLATFORM_NAME = $(ICUDATA_BASENAME_VERSION)@ICUDATA_CHAR@ +PKGDATA_LIBSTATICNAME = -L $(STATIC_PREFIX)$(ICUPREFIX)$(DATA_STUBNAME)$(ICULIBSUFFIX) ifeq ($(strip $(PKGDATA_MODE)),) PKGDATA_MODE=@DATA_PACKAGING_MODE@ endif @@ -53,14 +54,22 @@ ICUDATA_NAME = $(ICUDATA_PLATFORM_NAME) ICUPKGDATA_DIR = $(ICUDATA_DIR) else ifeq ($(PKGDATA_MODE),dll) -ICUDATA_NAME = $(ICUPREFIX)data$(ICULIBSUFFIX) +ICUDATA_NAME = $(ICUDATA_PLATFORM_NAME) +PKGDATA_LIBNAME = -L $(ICUPREFIX)$(DATA_STUBNAME)$(ICULIBSUFFIX) ICUPKGDATA_DIR = $(libdir) else -ICUDATA_NAME = $(ICUPREFIX)data +ICUDATA_NAME = $(ICUDATA_PLATFORM_NAME) ICUPKGDATA_DIR = $(ICUDATA_DIR) endif endif +# These are defined here because mh-cygwin-msvc needs to override these values. +ICUPKGDATA_INSTALL_DIR = $(DESTDIR)$(ICUPKGDATA_DIR) +ICUPKGDATA_INSTALL_LIBDIR = $(DESTDIR)$(libdir) + +# If defined to a valid value, pkgdata will generate a data library more quickly +GENCCODE_ASSEMBLY = @GENCCODE_ASSEMBLY@ + # ICU specific directories pkgdatadir = $(datadir)/$(PACKAGE)$(ICULIBSUFFIX)/$(VERSION) @@ -82,6 +91,8 @@ ICULIBSUFFIX=@ICULIBSUFFIX@ # Compiler and tools +ENABLE_DEBUG = @ENABLE_DEBUG@ +ENABLE_RELEASE = @ENABLE_RELEASE@ EXEEXT = @EXEEXT@ CC = @CC@ CXX = @CXX@ @@ -93,8 +104,10 @@ COMPILE_LINK_ENVVAR = @COMPILE_LINK_ENVVAR@ # Various flags for the tools -# DEFS is for common macro definitions -DEFS = @DEFS@ +# DEFS is for common macro definitions. +# configure prevents user defined DEFS, and configure's DEFS is not needed +# So we ignore the DEFS that comes from configure +DEFS = # CFLAGS is for C only flags CFLAGS = @CFLAGS@ # CXXFLAGS is for C++ only flags @@ -120,8 +133,8 @@ ENABLE_SHARED = @ENABLE_SHARED@ # Echo w/o newline -ECHO_N = @ECHO_N@ -ECHO_C = @ECHO_C@ +#ECHO_N = @ECHO_N@ +#ECHO_C = @ECHO_C@ # Commands to compile COMPILE.c= $(CC) $(CPPFLAGS) $(DEFS) $(CFLAGS) -c @@ -145,27 +158,71 @@ MIDDLE_SO_TARGET = $(SO_TARGET).$(SO_TARGET_VERSION_MAJOR) ## How ICU libraries are named... ex. $(LIBICU)uc$(SO) # Prefix for the ICU library names ICUPREFIX = icu -LIBICU = lib$(ICUPREFIX) +LIBPREFIX = lib +LIBICU = $(LIBPREFIX)$(ICUPREFIX) + +## If we can't use the shared libraries, use the static libraries +ifneq ($(ENABLE_SHARED),YES) +STATIC_PREFIX_WHEN_USED = s +else +STATIC_PREFIX_WHEN_USED = +endif + +# Static library prefix and file extension +STATIC_PREFIX = s +LIBSICU = $(LIBPREFIX)$(STATIC_PREFIX)$(ICUPREFIX) +A = a # Force removal [for make clean] RMV = rm -rf + # Platform commands to remove or move executable and library targets +# INSTALL-L installs libraries. Override in mh-* file to INSTALL_PROGRAM +# when the library needs to have executable permissions INSTALL-S = $(INSTALL_PROGRAM) INSTALL-L = $(INSTALL_DATA) +# Location of the libraries before "make install" is used +LIBDIR=$(top_builddir)/lib + +# Location of the executables before "make install" is used +BINDIR=$(top_builddir)/bin + +# Current full path directory. +CURR_FULL_DIR=$(shell pwd) +# Current full path directory for use in source code in a -D compiler option. +CURR_SRCCODE_FULL_DIR=$(shell pwd) + +# Name flexibility for the library naming scheme. Any modifications should +# be made in the mh- file for the specific platform. +DATA_STUBNAME = data +COMMON_STUBNAME = uc +I18N_STUBNAME = i18n +LAYOUT_STUBNAME = le +LAYOUTEX_STUBNAME = lx +IO_STUBNAME = io +TOOLUTIL_STUBNAME = tu +CTESTFW_STUBNAME = test + # Link commands to link to ICU libs -LIBICUDT= -L$(top_builddir)/data/out -L$(top_builddir)/stubdata -l$(ICUPREFIX)data$(ICULIBSUFFIX)$(SO_TARGET_VERSION_SUFFIX) -LIBICUUC= -L$(top_builddir)/common -l$(ICUPREFIX)uc$(ICULIBSUFFIX)$(SO_TARGET_VERSION_SUFFIX) $(LIBICUDT) -LIBICUI18N= -L$(top_builddir)/i18n -l$(ICUPREFIX)i18n$(ICULIBSUFFIX)$(SO_TARGET_VERSION_SUFFIX) -LIBICULE= -L$(top_builddir)/layout -l$(ICUPREFIX)le$(ICULIBSUFFIX)$(SO_TARGET_VERSION_SUFFIX) -LIBICULX= -L$(top_builddir)/layoutex -l$(ICUPREFIX)lx$(ICULIBSUFFIX)$(SO_TARGET_VERSION_SUFFIX) -LIBCTESTFW= -L$(top_builddir)/tools/ctestfw -l$(ICUPREFIX)ctestfw$(ICULIBSUFFIX)$(SO_TARGET_VERSION_SUFFIX) -LIBICUTOOLUTIL= -L$(top_builddir)/tools/toolutil -l$(ICUPREFIX)toolutil$(ICULIBSUFFIX)$(SO_TARGET_VERSION_SUFFIX) -LIBUSTDIO= -L$(top_builddir)/extra/ustdio -licuio$(ICULIBSUFFIX)$(SO_TARGET_VERSION_SUFFIX) +LIBICUDT= -L$(LIBDIR) -L$(top_builddir)/stubdata -l$(STATIC_PREFIX_WHEN_USED)$(ICUPREFIX)$(DATA_STUBNAME)$(ICULIBSUFFIX)$(SO_TARGET_VERSION_SUFFIX) +LIBICUUC= -L$(LIBDIR) -l$(STATIC_PREFIX_WHEN_USED)$(ICUPREFIX)$(COMMON_STUBNAME)$(ICULIBSUFFIX)$(SO_TARGET_VERSION_SUFFIX) $(LIBICUDT) +LIBICUI18N= -L$(LIBDIR) -l$(STATIC_PREFIX_WHEN_USED)$(ICUPREFIX)$(I18N_STUBNAME)$(ICULIBSUFFIX)$(SO_TARGET_VERSION_SUFFIX) +LIBICULE= -L$(LIBDIR) -l$(STATIC_PREFIX_WHEN_USED)$(ICUPREFIX)$(LAYOUT_STUBNAME)$(ICULIBSUFFIX)$(SO_TARGET_VERSION_SUFFIX) +LIBICULX= -L$(LIBDIR) -l$(STATIC_PREFIX_WHEN_USED)$(ICUPREFIX)$(LAYOUTEX_STUBNAME)$(ICULIBSUFFIX)$(SO_TARGET_VERSION_SUFFIX) +LIBCTESTFW= -L$(top_builddir)/tools/ctestfw -l$(STATIC_PREFIX_WHEN_USED)$(ICUPREFIX)$(CTESTFW_STUBNAME)$(ICULIBSUFFIX)$(SO_TARGET_VERSION_SUFFIX) +LIBICUTOOLUTIL= -L$(LIBDIR) -l$(STATIC_PREFIX_WHEN_USED)$(ICUPREFIX)$(TOOLUTIL_STUBNAME)$(ICULIBSUFFIX)$(SO_TARGET_VERSION_SUFFIX) +LIBICUIO= -L$(LIBDIR) -l$(STATIC_PREFIX_WHEN_USED)$(ICUPREFIX)$(IO_STUBNAME)$(ICULIBSUFFIX)$(SO_TARGET_VERSION_SUFFIX) # Invoke, set library path for all ICU libraries. -INVOKE = $(LDLIBRARYPATH_ENVVAR)=$(top_builddir)/common:$(top_builddir)/i18n:$(top_builddir)/tools/toolutil:$(top_builddir)/layout:$(top_builddir)/layoutex:$(top_builddir)/extra/ustdio:$(top_builddir)/tools/ctestfw:$(top_builddir)/data/out:$(top_builddir)/data:$(top_builddir)/stubdata/:$$$(LDLIBRARYPATH_ENVVAR) $(LEAK_CHECKER) +INVOKE = $(LDLIBRARYPATH_ENVVAR)=$(LIBDIR):$(top_builddir)/stubdata:$(top_builddir)/tools/ctestfw:$$$(LDLIBRARYPATH_ENVVAR) $(LEAK_CHECKER) # Platform-specific setup include @platform_make_fragment@ +# When shared libraries are disabled and static libraries are enabled, +# the C++ compiler must be used to link in the libraries for the tools. +ifneq ($(ENABLE_SHARED),YES) +LINK.c = $(LINK.cc) +endif + diff --git a/icuSources/extra/ustdio/Makefile.in b/icuSources/io/Makefile.in similarity index 65% rename from icuSources/extra/ustdio/Makefile.in rename to icuSources/io/Makefile.in index 877108fa..5f7a42aa 100644 --- a/icuSources/extra/ustdio/Makefile.in +++ b/icuSources/io/Makefile.in @@ -1,41 +1,45 @@ #****************************************************************************** # -# Copyright (C) 1999-2003, International Business Machines +# Copyright (C) 1999-2004, International Business Machines # Corporation and others. All Rights Reserved. # #****************************************************************************** -## Makefile.in for ICU - extra/ustdio/libustdio.so +## Makefile.in for ICU - io/libustdio.so ## Stephen F. Booth ## Source directory information srcdir = @srcdir@ top_srcdir = @top_srcdir@ -top_builddir = ../.. +top_builddir = .. ## All the flags and other definitions are included here. include $(top_builddir)/icudefs.mk ## Build directory information -subdir = extra/ustdio +subdir = io ## Extra files to remove for 'make clean' -CLEANFILES = *~ $(DEPS) +CLEANFILES = *~ $(DEPS) $(IMPORT_LIB) $(MIDDLE_IMPORT_LIB) $(FINAL_IMPORT_LIB) ## Target information -TARGET_STUBNAME=io +TARGET_STUBNAME=$(IO_STUBNAME) ifneq ($(ENABLE_STATIC),) -TARGET = $(LIBICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX).a +TARGET = $(LIBDIR)/$(LIBSICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX).$(A) endif ifneq ($(ENABLE_SHARED),) -SO_TARGET = $(LIBICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX).$(SO) +SO_TARGET = $(LIBDIR)/$(LIBICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX).$(SO) ALL_SO_TARGETS = $(SO_TARGET) $(MIDDLE_SO_TARGET) $(FINAL_SO_TARGET) +ifeq ($(ENABLE_SO_VERSION_DATA),1) +SO_VERSION_DATA = io.res +endif + ifeq ($(OS390BATCH),1) -BATCH_TARGET = $(BATCH_USTDIO_TARGET) +BATCH_TARGET = $(BATCH_ICUIO_TARGET) BATCH_LIBS = $(BATCH_LIBICUUC) $(BATCH_LIBICUI18N) -lm endif # OS390BATCH @@ -47,13 +51,14 @@ DYNAMICCPPFLAGS = $(SHAREDLIBCPPFLAGS) DYNAMICCFLAGS = $(SHAREDLIBCFLAGS) DYNAMICCXXFLAGS = $(SHAREDLIBCXXFLAGS) +LDFLAGS += $(LDFLAGSICUIO) CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common -I$(top_srcdir)/i18n $(LIBCPPFLAGS) -DEFS += -DU_USTDIO_IMPLEMENTATION +DEFS += -DU_IO_IMPLEMENTATION LIBS = $(LIBICUUC) $(LIBICUI18N) $(DEFAULT_LIBS) -OBJECTS = locbund.o loccache.o ufile.o ufmt_cmn.o uprintf.o uprntf_p.o \ -uscanf.o uscanf_p.o uscanset.o ustdio.o sprintf.o sprntf_p.o \ -sscanf.o sscanf_p.o ustream.o +OBJECTS = locbund.o ufile.o ufmt_cmn.o uprintf.o uprntf_p.o \ +uscanf.o uscanf_p.o ustdio.o sprintf.o sscanf.o \ +ustream.o STATIC_OBJECTS = $(OBJECTS:.o=.$(STATIC_O)) @@ -83,22 +88,24 @@ install-local: all-local install-headers install-library install-library: all-local $(MKINSTALLDIRS) $(DESTDIR)$(libdir) ifneq ($(ENABLE_STATIC),) - $(INSTALL-L) $(TARGET) $(DESTDIR)$(libdir)/$(TARGET) + $(INSTALL-L) $(TARGET) $(DESTDIR)$(libdir) endif ifneq ($(ENABLE_SHARED),) - $(INSTALL-L) $(FINAL_SO_TARGET) $(DESTDIR)$(libdir)/$(FINAL_SO_TARGET) + $(INSTALL-L) $(FINAL_SO_TARGET) $(DESTDIR)$(libdir) ifneq ($(FINAL_SO_TARGET),$(SO_TARGET)) - cd $(DESTDIR)$(libdir) && $(RM) $(SO_TARGET) && ln -s $(FINAL_SO_TARGET) $(SO_TARGET) + cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(SO_TARGET)) && ln -s $(notdir $(FINAL_SO_TARGET)) $(notdir $(SO_TARGET)) ifneq ($(FINAL_SO_TARGET),$(MIDDLE_SO_TARGET)) - cd $(DESTDIR)$(libdir) && $(RM) $(MIDDLE_SO_TARGET) && ln -s $(FINAL_SO_TARGET) $(MIDDLE_SO_TARGET) + cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(MIDDLE_SO_TARGET)) && ln -s $(notdir $(FINAL_SO_TARGET)) $(notdir $(MIDDLE_SO_TARGET)) endif endif endif ifneq ($(IMPORT_LIB_EXT),) - $(INSTALL-L) $(FINAL_IMPORT_LIB) $(DESTDIR)$(libdir)/$(FINAL_IMPORT_LIB) - cd $(DESTDIR)$(libdir) && $(RM) $(IMPORT_LIB) && ln -s $(FINAL_IMPORT_LIB) $(IMPORT_LIB) + $(INSTALL-L) $(FINAL_IMPORT_LIB) $(DESTDIR)$(libdir) +ifneq ($(IMPORT_LIB),$(FINAL_IMPORT_LIB)) + cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(IMPORT_LIB)) && ln -s $(notdir $(FINAL_IMPORT_LIB)) $(notdir $(IMPORT_LIB)) +endif ifneq ($(MIDDLE_IMPORT_LIB),$(FINAL_IMPORT_LIB)) - cd $(DESTDIR)$(libdir) && $(RM) $(MIDDLE_IMPORT_LIB) && ln -s $(FINAL_IMPORT_LIB) $(MIDDLE_IMPORT_LIB) + cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(MIDDLE_IMPORT_LIB)) && ln -s $(notdir $(FINAL_IMPORT_LIB)) $(notdir $(MIDDLE_IMPORT_LIB)) endif endif @@ -114,7 +121,7 @@ dist-local: clean-local: test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES) - $(RMV) $(OBJECTS) $(STATIC_OBJECTS) $(ALL_TARGETS) + $(RMV) $(OBJECTS) $(STATIC_OBJECTS) $(ALL_TARGETS) $(SO_VERSION_DATA) distclean-local: clean-local $(RMV) Makefile @@ -131,7 +138,7 @@ $(TARGET): $(TARGET)($(STATIC_OBJECTS)) endif ifneq ($(ENABLE_SHARED),) -$(FINAL_SO_TARGET): $(OBJECTS) +$(FINAL_SO_TARGET): $(OBJECTS) $(SO_VERSION_DATA) $(SHLIB.cc) $(LD_SONAME) $(OUTOPT)$@ $^ $(LIBS) ifeq ($(OS390BATCH),1) diff --git a/icuSources/extra/ustdio/ustdio.dsp b/icuSources/io/io.dsp similarity index 57% rename from icuSources/extra/ustdio/ustdio.dsp rename to icuSources/io/io.dsp index 597c4dff..4dc7c965 100644 --- a/icuSources/extra/ustdio/ustdio.dsp +++ b/icuSources/io/io.dsp @@ -1,26 +1,26 @@ -# Microsoft Developer Studio Project File - Name="ustdio" - Package Owner=<4> +# Microsoft Developer Studio Project File - Name="io" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 -CFG=ustdio - Win32 Debug +CFG=io - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE -!MESSAGE NMAKE /f "ustdio.mak". +!MESSAGE NMAKE /f "io.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE -!MESSAGE NMAKE /f "ustdio.mak" CFG="ustdio - Win32 Debug" +!MESSAGE NMAKE /f "io.mak" CFG="io - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE -!MESSAGE "ustdio - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "ustdio - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "ustdio - Win64 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "ustdio - Win64 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "io - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "io - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "io - Win64 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "io - Win64 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project @@ -31,7 +31,7 @@ CPP=cl.exe MTL=midl.exe RSC=rc.exe -!IF "$(CFG)" == "ustdio - Win32 Release" +!IF "$(CFG)" == "io - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 @@ -40,25 +40,25 @@ RSC=rc.exe # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 -# PROP Output_Dir "..\..\..\lib" +# PROP Output_Dir "..\..\lib" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "USTDIO_EXPORTS" /FD /c -# ADD CPP /nologo /G6 /MD /Za /W3 /GX /O2 /Ob2 /I "..\..\..\include" /I "..\..\common" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "USTDIO_EXPORTS" /D "U_USTDIO_IMPLEMENTATION" /FD /GF /c +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "IO_EXPORTS" /FD /c +# ADD CPP /nologo /G6 /MD /Za /W3 /GX /O2 /Ob2 /I "..\..\include" /I "..\common" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "IO_EXPORTS" /D "U_IO_IMPLEMENTATION" /FD /GF /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /i "..\..\common" /d "NDEBUG" +# ADD RSC /l 0x409 /i "..\common" /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 icuuc.lib icuin.lib /nologo /dll /machine:I386 /out:"..\..\..\bin\icuio26.dll" /implib:"..\..\..\lib/icuio.lib" /libpath:"..\..\..\lib\\" +# ADD LINK32 icuuc.lib icuin.lib /nologo /dll /machine:I386 /out:"..\..\bin\icuio32.dll" /implib:"..\..\lib/icuio.lib" /libpath:"..\..\lib\\" # SUBTRACT LINK32 /pdb:none -!ELSEIF "$(CFG)" == "ustdio - Win32 Debug" +!ELSEIF "$(CFG)" == "io - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 @@ -67,25 +67,25 @@ LINK32=link.exe # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 -# PROP Output_Dir "..\..\..\lib" +# PROP Output_Dir "..\..\lib" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "USTDIO_EXPORTS" /FD /GZ /c -# ADD CPP /nologo /G6 /MDd /Za /W3 /Gm /GX /ZI /Od /I "..\..\..\include" /I "..\..\common" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "USTDIO_EXPORTS" /D "U_USTDIO_IMPLEMENTATION" /FR /FD /GF /GZ /c +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "IO_EXPORTS" /FD /GZ /c +# ADD CPP /nologo /G6 /MDd /Za /W3 /Gm /GX /ZI /Od /I "..\..\include" /I "..\common" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "IO_EXPORTS" /D "U_IO_IMPLEMENTATION" /FR /FD /GF /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /i "..\..\common" /d "_DEBUG" +# ADD RSC /l 0x409 /i "..\common" /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 icuucd.lib icuind.lib /nologo /dll /debug /machine:I386 /out:"..\..\..\bin\icuio26d.dll" /implib:"..\..\..\lib\icuiod.lib" /pdbtype:sept /libpath:"debug" /libpath:"..\..\..\lib\\" +# ADD LINK32 icuucd.lib icuind.lib /nologo /dll /debug /machine:I386 /out:"..\..\bin\icuio32d.dll" /implib:"..\..\lib\icuiod.lib" /pdbtype:sept /libpath:"debug" /libpath:"..\..\lib\\" # SUBTRACT LINK32 /pdb:none -!ELSEIF "$(CFG)" == "ustdio - Win64 Release" +!ELSEIF "$(CFG)" == "io - Win64 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 @@ -94,24 +94,24 @@ LINK32=link.exe # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 -# PROP Output_Dir "..\..\..\lib" +# PROP Output_Dir "..\..\lib" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "USTDIO_EXPORTS" /FD /c -# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\..\include" /I "..\..\common" /D "WIN64" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "USTDIO_EXPORTS" /D "U_USTDIO_IMPLEMENTATION" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /GF /QIA64_fmaopt /Zm600 /c +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "IO_EXPORTS" /FD /c +# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\include" /I "..\common" /D "WIN64" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "IO_EXPORTS" /D "U_IO_IMPLEMENTATION" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /GF /Zm600 /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win64 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win64 # ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /i "..\..\common" /d "NDEBUG" +# ADD RSC /l 0x409 /i "..\common" /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:IX86 /machine:IA64 -# ADD LINK32 icuuc.lib icuin.lib /nologo /dll /machine:IX86 /out:"..\..\..\bin\icuio26.dll" /implib:"..\..\..\lib/icuio.lib" /libpath:"..\..\..\lib\\" /machine:IA64 +# ADD LINK32 icuuc.lib icuin.lib /nologo /dll /machine:IX86 /out:"..\..\bin\icuio32.dll" /implib:"..\..\lib/icuio.lib" /libpath:"..\..\lib\\" /machine:IA64 -!ELSEIF "$(CFG)" == "ustdio - Win64 Debug" +!ELSEIF "$(CFG)" == "io - Win64 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 @@ -120,31 +120,31 @@ LINK32=link.exe # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 -# PROP Output_Dir "..\..\..\lib" +# PROP Output_Dir "..\..\lib" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "USTDIO_EXPORTS" /FD /GZ /c -# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\..\include" /I "..\..\common" /D "WIN64" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "USTDIO_EXPORTS" /D "U_USTDIO_IMPLEMENTATION" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GF /GZ /QIA64_fmaopt /Zm600 /c +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "IO_EXPORTS" /FD /GZ /c +# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\include" /I "..\common" /D "WIN64" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "IO_EXPORTS" /D "U_IO_IMPLEMENTATION" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GF /GZ /Zm600 /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win64 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win64 # ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /i "..\..\common" /d "_DEBUG" +# ADD RSC /l 0x409 /i "..\common" /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:IX86 /pdbtype:sept /machine:IA64 -# ADD LINK32 icuucd.lib icuind.lib /nologo /dll /incremental:no /debug /machine:IX86 /out:"..\..\..\bin\icuio26d.dll" /implib:"..\..\..\lib\icuiod.lib" /pdbtype:sept /libpath:"debug" /libpath:"..\..\..\lib\\" /machine:IA64 +# ADD LINK32 icuucd.lib icuind.lib /nologo /dll /incremental:no /debug /machine:IX86 /out:"..\..\bin\icuio32d.dll" /implib:"..\..\lib\icuiod.lib" /pdbtype:sept /libpath:"debug" /libpath:"..\..\lib\\" /machine:IA64 !ENDIF # Begin Target -# Name "ustdio - Win32 Release" -# Name "ustdio - Win32 Debug" -# Name "ustdio - Win64 Release" -# Name "ustdio - Win64 Debug" +# Name "io - Win32 Release" +# Name "io - Win32 Debug" +# Name "io - Win64 Release" +# Name "io - Win64 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" @@ -154,26 +154,14 @@ SOURCE=.\locbund.c # End Source File # Begin Source File -SOURCE=.\loccache.c -# End Source File -# Begin Source File - SOURCE=.\sprintf.c # End Source File # Begin Source File -SOURCE=.\sprntf_p.c -# End Source File -# Begin Source File - SOURCE=.\sscanf.c # End Source File # Begin Source File -SOURCE=.\sscanf_p.c -# End Source File -# Begin Source File - SOURCE=.\ufile.c # End Source File # Begin Source File @@ -198,10 +186,6 @@ SOURCE=.\uscanf_p.c # End Source File # Begin Source File -SOURCE=.\uscanset.c -# End Source File -# Begin Source File - SOURCE=.\ustdio.c # End Source File # Begin Source File @@ -219,26 +203,10 @@ SOURCE=.\locbund.h # End Source File # Begin Source File -SOURCE=.\loccache.h -# End Source File -# Begin Source File - SOURCE=.\sprintf.h # End Source File # Begin Source File -SOURCE=.\sprntf_p.h -# End Source File -# Begin Source File - -SOURCE=.\sscanf.h -# End Source File -# Begin Source File - -SOURCE=.\sscanf_p.h -# End Source File -# Begin Source File - SOURCE=.\ufile.h # End Source File # Begin Source File @@ -263,49 +231,45 @@ SOURCE=.\uscanf_p.h # End Source File # Begin Source File -SOURCE=.\uscanset.h -# End Source File -# Begin Source File - SOURCE=.\unicode\ustdio.h -!IF "$(CFG)" == "ustdio - Win32 Release" +!IF "$(CFG)" == "io - Win32 Release" # Begin Custom Build InputPath=.\unicode\ustdio.h -"..\..\..\include\unicode\ustdio.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - copy $(InputPath) ..\..\..\include\unicode +"..\..\include\unicode\ustdio.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode # End Custom Build -!ELSEIF "$(CFG)" == "ustdio - Win32 Debug" +!ELSEIF "$(CFG)" == "io - Win32 Debug" # Begin Custom Build InputPath=.\unicode\ustdio.h -"..\..\..\include\unicode\ustdio.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - copy $(InputPath) ..\..\..\include\unicode +"..\..\include\unicode\ustdio.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode # End Custom Build -!ELSEIF "$(CFG)" == "ustdio - Win64 Release" +!ELSEIF "$(CFG)" == "io - Win64 Release" # Begin Custom Build InputPath=.\unicode\ustdio.h -"..\..\..\include\unicode\ustdio.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - copy $(InputPath) ..\..\..\include\unicode +"..\..\include\unicode\ustdio.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode # End Custom Build -!ELSEIF "$(CFG)" == "ustdio - Win64 Debug" +!ELSEIF "$(CFG)" == "io - Win64 Debug" # Begin Custom Build InputPath=.\unicode\ustdio.h -"..\..\..\include\unicode\ustdio.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - copy $(InputPath) ..\..\..\include\unicode +"..\..\include\unicode\ustdio.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode # End Custom Build @@ -316,43 +280,43 @@ InputPath=.\unicode\ustdio.h SOURCE=.\unicode\ustream.h -!IF "$(CFG)" == "ustdio - Win32 Release" +!IF "$(CFG)" == "io - Win32 Release" # Begin Custom Build InputPath=.\unicode\ustream.h -"..\..\..\include\unicode\ustream.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - copy $(InputPath) ..\..\..\include\unicode +"..\..\include\unicode\ustream.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode # End Custom Build -!ELSEIF "$(CFG)" == "ustdio - Win32 Debug" +!ELSEIF "$(CFG)" == "io - Win32 Debug" # Begin Custom Build InputPath=.\unicode\ustream.h -"..\..\..\include\unicode\ustream.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - copy $(InputPath) ..\..\..\include\unicode +"..\..\include\unicode\ustream.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode # End Custom Build -!ELSEIF "$(CFG)" == "ustdio - Win64 Release" +!ELSEIF "$(CFG)" == "io - Win64 Release" # Begin Custom Build InputPath=.\unicode\ustream.h -"..\..\..\include\unicode\ustream.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - copy $(InputPath) ..\..\..\include\unicode +"..\..\include\unicode\ustream.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode # End Custom Build -!ELSEIF "$(CFG)" == "ustdio - Win64 Debug" +!ELSEIF "$(CFG)" == "io - Win64 Debug" # Begin Custom Build InputPath=.\unicode\ustream.h -"..\..\..\include\unicode\ustream.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - copy $(InputPath) ..\..\..\include\unicode +"..\..\include\unicode\ustream.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\unicode # End Custom Build @@ -365,7 +329,7 @@ InputPath=.\unicode\ustream.h # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # Begin Source File -SOURCE=.\ustdio.rc +SOURCE=.\io.rc # End Source File # End Group # End Target diff --git a/icuSources/extra/ustdio/ustdio.rc b/icuSources/io/io.rc similarity index 75% rename from icuSources/extra/ustdio/ustdio.rc rename to icuSources/io/io.rc index 7274956c..a2064930 100644 --- a/icuSources/extra/ustdio/ustdio.rc +++ b/icuSources/io/io.rc @@ -1,29 +1,50 @@ -// Version Resource file for ICU usdtio library. - // Do not edit with Microsoft Developer Studio Resource Editor. // It will permanently substitute version numbers that are intended to be // picked up by the pre-processor during each build. -// Copyright (c) 2001-2003 International Business Machines +// Copyright (c) 2001-2004 International Business Machines // Corporation and others. All Rights Reserved. // +#include "../common/msvcres.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // -#include "winresrc.h" - +#include ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// -// +// LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #pragma code_page(1252) -#include "unicode\uversion.h" +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "../../common/msvcres.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include \0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + ///////////////////////////////////////////////////////////////////////////// // @@ -51,7 +72,7 @@ BEGIN BEGIN VALUE "Comments", "http://oss.software.ibm.com/icu/\0" VALUE "CompanyName", "IBM Corporation and others\0" - VALUE "FileDescription", "IBM ICU ustdio DLL\0" + VALUE "FileDescription", "IBM ICU I/O DLL\0" VALUE "FileVersion", CommaVersionString(U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, 0) VALUE "LegalCopyright", U_COPYRIGHT_STRING "\0" #ifdef _DEBUG @@ -59,7 +80,6 @@ BEGIN #else VALUE "OriginalFilename", "icuio" U_ICU_VERSION_SHORT ".dll\0") #endif - VALUE "PrivateBuild", "\0" VALUE "ProductName", "International Components for Unicode\0" VALUE "ProductVersion", CommaVersionString(U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, 0) @@ -74,3 +94,15 @@ END ///////////////////////////////////////////////////////////////////////////// + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/icuSources/extra/ustdio/ustdio.vcproj b/icuSources/io/io.vcproj similarity index 66% rename from icuSources/extra/ustdio/ustdio.vcproj rename to icuSources/io/io.vcproj index 845aa552..d7a576f1 100644 --- a/icuSources/extra/ustdio/ustdio.vcproj +++ b/icuSources/io/io.vcproj @@ -1,8 +1,8 @@ - + @@ -12,7 +12,7 @@ @@ -39,21 +41,19 @@ Name="VCCustomBuildTool"/> + ProgramDatabaseFile=".\..\..\lib\icuio32.pdb" + BaseAddress="0x4ab00000" + ImportLibrary="..\..\lib\icuio.lib"/> + TypeLibraryName=".\..\..\lib\icuio.tlb"/> + AdditionalIncludeDirectories="..\common"/> + + + + ProgramDatabaseFile=".\..\..\lib\icuio32d.pdb" + BaseAddress="0x4ab00000" + ImportLibrary="..\..\lib\icuiod.lib"/> + TypeLibraryName=".\..\..\lib\icuio.tlb"/> + AdditionalIncludeDirectories="..\common"/> + + + + + - - - - - - @@ -174,9 +178,6 @@ - - @@ -202,21 +203,6 @@ - - - - - - - - - - @@ -226,35 +212,26 @@ - - - - - - + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> + Outputs="..\..\include\unicode\$(InputFileName)"/> @@ -281,7 +258,7 @@ Name="Resource Files" Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"> + RelativePath=".\io.rc"> diff --git a/icuSources/io/locbund.c b/icuSources/io/locbund.c new file mode 100644 index 00000000..3d0f9cf5 --- /dev/null +++ b/icuSources/io/locbund.c @@ -0,0 +1,139 @@ +/* +******************************************************************************* +* +* Copyright (C) 1998-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* +* File locbund.c +* +* Modification History: +* +* Date Name Description +* 11/18/98 stephen Creation. +* 12/10/1999 bobbyr@optiosoftware.com Fix for memory leak + string allocation bugs +******************************************************************************* +*/ + +#include + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "locbund.h" + +#include "cmemory.h" +#include "unicode/ustring.h" +#include "unicode/uloc.h" + +ULocaleBundle* +u_locbund_init(ULocaleBundle *result, const char *loc) +{ + int32_t len; + + if(result == 0) + return 0; + + if (loc == NULL) { + loc = uloc_getDefault(); + } + + uprv_memset(result, 0, sizeof(ULocaleBundle)); + + len = (int32_t)strlen(loc); + result->fLocale = (char*) uprv_malloc(len + 1); + if(result->fLocale == 0) { + return 0; + } + + strcpy(result->fLocale, loc); + + return result; +} + +/*ULocaleBundle* +u_locbund_new(const char *loc) +{ + ULocaleBundle *result = (ULocaleBundle*) uprv_malloc(sizeof(ULocaleBundle)); + return u_locbund_init(result, loc); +} + +ULocaleBundle* +u_locbund_clone(const ULocaleBundle *bundle) +{ + ULocaleBundle *result = (ULocaleBundle*)uprv_malloc(sizeof(ULocaleBundle)); + UErrorCode status = U_ZERO_ERROR; + int32_t styleIdx; + + if(result == 0) + return 0; + + result->fLocale = (char*) uprv_malloc(strlen(bundle->fLocale) + 1); + if(result->fLocale == 0) { + uprv_free(result); + return 0; + } + + strcpy(result->fLocale, bundle->fLocale ); + + for (styleIdx = 0; styleIdx < ULOCALEBUNDLE_NUMBERFORMAT_COUNT; styleIdx++) { + status = U_ZERO_ERROR; + if (result->fNumberFormat[styleIdx]) { + result->fNumberFormat[styleIdx] = unum_clone(bundle->fNumberFormat[styleIdx], &status); + if (U_FAILURE(status)) { + result->fNumberFormat[styleIdx] = NULL; + } + } + else { + result->fNumberFormat[styleIdx] = NULL; + } + } + result->fDateFormat = (bundle->fDateFormat == 0 ? 0 : + udat_clone(bundle->fDateFormat, &status)); + result->fTimeFormat = (bundle->fTimeFormat == 0 ? 0 : + udat_clone(bundle->fTimeFormat, &status)); + + return result; +}*/ + +void +u_locbund_close(ULocaleBundle *bundle) +{ + int32_t styleIdx; + + uprv_free(bundle->fLocale); + + for (styleIdx = 0; styleIdx < ULOCALEBUNDLE_NUMBERFORMAT_COUNT; styleIdx++) { + if (bundle->fNumberFormat[styleIdx]) { + unum_close(bundle->fNumberFormat[styleIdx]); + } + } + + uprv_memset(bundle, 0, sizeof(ULocaleBundle)); +/* uprv_free(bundle);*/ +} + +UNumberFormat* +u_locbund_getNumberFormat(ULocaleBundle *bundle, UNumberFormatStyle style) +{ + UNumberFormat *formatAlias = NULL; + if (style >= UNUM_IGNORE) { + formatAlias = bundle->fNumberFormat[style-1]; + if (formatAlias == NULL) { + UErrorCode status = U_ZERO_ERROR; + formatAlias = unum_open(style, NULL, 0, bundle->fLocale, NULL, &status); + if (U_FAILURE(status)) { + unum_close(formatAlias); + formatAlias = NULL; + } + else { + bundle->fNumberFormat[style-1] = formatAlias; + } + } + } + return formatAlias; +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/io/locbund.h b/icuSources/io/locbund.h new file mode 100644 index 00000000..5ec24edf --- /dev/null +++ b/icuSources/io/locbund.h @@ -0,0 +1,79 @@ +/* +******************************************************************************* +* +* Copyright (C) 1998-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* +* File locbund.h +* +* Modification History: +* +* Date Name Description +* 10/16/98 stephen Creation. +* 02/25/99 stephen Modified for new C API. +******************************************************************************* +*/ + +#ifndef LOCBUND_H +#define LOCBUND_H + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/unum.h" + +#define ULOCALEBUNDLE_NUMBERFORMAT_COUNT ((int32_t)UNUM_SPELLOUT) + +typedef struct ULocaleBundle { + char *fLocale; + + UNumberFormat *fNumberFormat[ULOCALEBUNDLE_NUMBERFORMAT_COUNT]; +} ULocaleBundle; + + +/** + * Initialize a ULocaleBundle, initializing all formatters to 0. + * @param result A ULocaleBundle to initialize. + * @param loc The locale of the ULocaleBundle. + * @return A pointer to a ULocaleBundle, or 0 if loc was invalid. + */ +ULocaleBundle* +u_locbund_init(ULocaleBundle *result, const char *loc); + +/** + * Create a new ULocaleBundle, initializing all formatters to 0. + * @param loc The locale of the ULocaleBundle. + * @return A pointer to a ULocaleBundle, or 0 if loc was invalid. + */ +/*ULocaleBundle* +u_locbund_new(const char *loc);*/ + +/** + * Create a deep copy of this ULocaleBundle; + * @param bundle The ULocaleBundle to clone. + * @return A new ULocaleBundle. + */ +/*ULocaleBundle* +u_locbund_clone(const ULocaleBundle *bundle);*/ + +/** + * Delete the specified ULocaleBundle, freeing all associated memory. + * @param bundle The ULocaleBundle to delete + */ +void +u_locbund_close(ULocaleBundle *bundle); + +/** + * Get the NumberFormat used to format and parse numbers in a ULocaleBundle. + * @param bundle The ULocaleBundle to use + * @return A pointer to the NumberFormat used for number formatting and parsing. + */ +UNumberFormat* +u_locbund_getNumberFormat(ULocaleBundle *bundle, UNumberFormatStyle style); + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif diff --git a/icuSources/io/sprintf.c b/icuSources/io/sprintf.c new file mode 100644 index 00000000..0d90b561 --- /dev/null +++ b/icuSources/io/sprintf.c @@ -0,0 +1,250 @@ +/* +****************************************************************************** +* +* Copyright (C) 2001-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +****************************************************************************** +* +* File sprintf.c +* +* Modification History: +* +* Date Name Description +* 02/08/2001 george Creation. Copied from uprintf.c +* 03/27/2002 Mark Schneckloth Many fixes regarding alignment, null termination +* (mschneckloth@atomz.com) and other various problems. +* 08/07/2003 george Reunify printf implementations +******************************************************************************* +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/ustdio.h" +#include "unicode/ustring.h" +#include "unicode/putil.h" + +#include "uprintf.h" +#include "locbund.h" + +#include "cmemory.h" +#include + +/* u_minstrncpy copies the minimum number of code units of (count or output->available) */ +static int32_t +u_sprintf_write(void *context, + const UChar *str, + int32_t count) +{ + u_localized_print_string *output = (u_localized_print_string *)context; + int32_t size = ufmt_min(count, output->available); + + u_strncpy(output->str + (output->len - output->available), str, size); + output->available -= size; + return size; +} + +static int32_t +u_sprintf_pad_and_justify(void *context, + const u_printf_spec_info *info, + const UChar *result, + int32_t resultLen) +{ + u_localized_print_string *output = (u_localized_print_string *)context; + int32_t written = 0; + + resultLen = ufmt_min(resultLen, output->available); + + /* pad and justify, if needed */ + if(info->fWidth != -1 && resultLen < info->fWidth) { + int32_t paddingLeft = info->fWidth - resultLen; + int32_t outputPos = output->len - output->available; + + if (paddingLeft + resultLen > output->available) { + paddingLeft = output->available - resultLen; + if (paddingLeft < 0) { + paddingLeft = 0; + } + /* paddingLeft = output->available - resultLen;*/ + } + written += paddingLeft; + + /* left justify */ + if(info->fLeft) { + written += u_sprintf_write(output, result, resultLen); + u_memset(&output->str[outputPos + resultLen], info->fPadChar, paddingLeft); + output->available -= paddingLeft; + } + /* right justify */ + else { + u_memset(&output->str[outputPos], info->fPadChar, paddingLeft); + output->available -= paddingLeft; + written += u_sprintf_write(output, result, resultLen); + } + } + /* just write the formatted output */ + else { + written = u_sprintf_write(output, result, resultLen); + } + + return written; +} + +U_CAPI int32_t U_EXPORT2 +u_sprintf(UChar *buffer, + const char *patternSpecification, + ... ) +{ + va_list ap; + int32_t written; + + va_start(ap, patternSpecification); + written = u_vsnprintf(buffer, INT32_MAX, patternSpecification, ap); + va_end(ap); + + return written; +} + +U_CAPI int32_t U_EXPORT2 +u_sprintf_u(UChar *buffer, + const UChar *patternSpecification, + ... ) +{ + va_list ap; + int32_t written; + + va_start(ap, patternSpecification); + written = u_vsnprintf_u(buffer, INT32_MAX, patternSpecification, ap); + va_end(ap); + + return written; +} + +U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ +u_vsprintf(UChar *buffer, + const char *patternSpecification, + va_list ap) +{ + return u_vsnprintf(buffer, INT32_MAX, patternSpecification, ap); +} + +U_CAPI int32_t U_EXPORT2 +u_snprintf(UChar *buffer, + int32_t count, + const char *patternSpecification, + ... ) +{ + va_list ap; + int32_t written; + + va_start(ap, patternSpecification); + written = u_vsnprintf(buffer, count, patternSpecification, ap); + va_end(ap); + + return written; +} + +U_CAPI int32_t U_EXPORT2 +u_snprintf_u(UChar *buffer, + int32_t count, + const UChar *patternSpecification, + ... ) +{ + va_list ap; + int32_t written; + + va_start(ap, patternSpecification); + written = u_vsnprintf_u(buffer, count, patternSpecification, ap); + va_end(ap); + + return written; +} + +U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ +u_vsnprintf(UChar *buffer, + int32_t count, + const char *patternSpecification, + va_list ap) +{ + int32_t written; + UChar *pattern; + UChar patBuffer[UFMT_DEFAULT_BUFFER_SIZE]; + int32_t size = (int32_t)strlen(patternSpecification) + 1; + + /* convert from the default codepage to Unicode */ + if (size >= MAX_UCHAR_BUFFER_SIZE(patBuffer)) { + pattern = (UChar *)uprv_malloc(size * sizeof(UChar)); + if(pattern == 0) { + return 0; + } + } + else { + pattern = patBuffer; + } + u_charsToUChars(patternSpecification, pattern, size); + + /* do the work */ + written = u_vsnprintf_u(buffer, count, pattern, ap); + + /* clean up */ + if (pattern != patBuffer) { + uprv_free(pattern); + } + + return written; +} + +U_CAPI int32_t U_EXPORT2 +u_vsprintf_u(UChar *buffer, + const UChar *patternSpecification, + va_list ap) +{ + return u_vsnprintf_u(buffer, INT32_MAX, patternSpecification, ap); +} + +static const u_printf_stream_handler g_sprintf_stream_handler = { + u_sprintf_write, + u_sprintf_pad_and_justify +}; + +U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ +u_vsnprintf_u(UChar *buffer, + int32_t count, + const UChar *patternSpecification, + va_list ap) +{ + int32_t written = 0; /* haven't written anything yet */ + + u_localized_print_string outStr; + + if (count < 0) { + count = INT32_MAX; + } + + outStr.str = buffer; + outStr.len = count; + outStr.available = count; + + if(u_locbund_init(&outStr.fBundle, "en_US_POSIX") == 0) { + return 0; + } + + /* parse and print the whole format string */ + u_printf_parse(&g_sprintf_stream_handler, patternSpecification, &outStr, &outStr, &outStr.fBundle, &written, ap); + + /* Terminate the buffer, if there's room. */ + if (outStr.available > 0) { + buffer[outStr.len - outStr.available] = 0x0000; + } + + /* Release the cloned bundle, if we cloned it. */ + u_locbund_close(&outStr.fBundle); + + /* return # of UChars written */ + return written; +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ + diff --git a/icuSources/io/sscanf.c b/icuSources/io/sscanf.c new file mode 100644 index 00000000..eb0bedfb --- /dev/null +++ b/icuSources/io/sscanf.c @@ -0,0 +1,128 @@ +/* +****************************************************************************** +* +* Copyright (C) 2000-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +****************************************************************************** +* +* File sscanf.c +* +* Modification History: +* +* Date Name Description +* 02/08/00 george Creation. Copied from uscanf.c +****************************************************************************** +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/putil.h" +#include "unicode/ustdio.h" +#include "unicode/ustring.h" +#include "uscanf.h" +#include "ufile.h" +#include "ufmt_cmn.h" + +#include "cmemory.h" +#include "cstring.h" + + +U_CAPI int32_t U_EXPORT2 +u_sscanf(const UChar *buffer, + const char *patternSpecification, + ... ) +{ + va_list ap; + int32_t converted; + + va_start(ap, patternSpecification); + converted = u_vsscanf(buffer, patternSpecification, ap); + va_end(ap); + + return converted; +} + +U_CAPI int32_t U_EXPORT2 +u_sscanf_u(const UChar *buffer, + const UChar *patternSpecification, + ... ) +{ + va_list ap; + int32_t converted; + + va_start(ap, patternSpecification); + converted = u_vsscanf_u(buffer, patternSpecification, ap); + va_end(ap); + + return converted; +} + +U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ +u_vsscanf(const UChar *buffer, + const char *patternSpecification, + va_list ap) +{ + int32_t converted; + UChar *pattern; + UChar patBuffer[UFMT_DEFAULT_BUFFER_SIZE]; + int32_t size = (int32_t)uprv_strlen(patternSpecification) + 1; + + /* convert from the default codepage to Unicode */ + if (size >= MAX_UCHAR_BUFFER_SIZE(patBuffer)) { + pattern = (UChar *)uprv_malloc(size * sizeof(UChar)); + if(pattern == 0) { + return 0; + } + } + else { + pattern = patBuffer; + } + u_charsToUChars(patternSpecification, pattern, size); + + /* do the work */ + converted = u_vsscanf_u(buffer, pattern, ap); + + /* clean up */ + if (pattern != patBuffer) { + uprv_free(pattern); + } + + return converted; +} + +U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ +u_vsscanf_u(const UChar *buffer, + const UChar *patternSpecification, + va_list ap) +{ + int32_t converted; + UFILE inStr; + + inStr.fConverter = NULL; + inStr.fFile = NULL; + inStr.fOwnFile = FALSE; +#if !UCONFIG_NO_TRANSLITERATION + inStr.fTranslit = NULL; +#endif + inStr.fUCBuffer[0] = 0; + inStr.str.fBuffer = (UChar *)buffer; + inStr.str.fPos = (UChar *)buffer; + inStr.str.fLimit = buffer + u_strlen(buffer); + + if(u_locbund_init(&inStr.str.fBundle, "en_US_POSIX") == 0) { + return 0; + } + + converted = u_scanf_parse(&inStr, patternSpecification, ap); + + u_locbund_close(&inStr.str.fBundle); + + /* return # of items converted */ + return converted; +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ + diff --git a/icuSources/extra/ustdio/ufile.c b/icuSources/io/ufile.c similarity index 52% rename from icuSources/extra/ustdio/ufile.c rename to icuSources/io/ufile.c index 686935b8..c1870ecb 100644 --- a/icuSources/extra/ustdio/ufile.c +++ b/icuSources/io/ufile.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1998-2001, International Business Machines +* Copyright (C) 1998-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -18,41 +18,84 @@ ****************************************************************************** */ +/* define for fileno. */ +#ifndef _XOPEN_SOURCE +#define _XOPEN_SOURCE 4 +#endif + #include "locmap.h" #include "unicode/ustdio.h" #include "ufile.h" #include "unicode/uloc.h" -#include "loccache.h" #include "unicode/ures.h" #include "unicode/ucnv.h" #include "cstring.h" #include "cmemory.h" +#ifdef WIN32 +/* Windows likes to rename Unix-like functions */ +#define fileno _fileno +#endif -static UBool hasICUData(const char *cp) { - UErrorCode status = U_ZERO_ERROR; - UConverter *cnv = NULL; -#if 0 - UResourceBundle *r = NULL; +U_CAPI UFILE* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ +u_finit(FILE *f, + const char *locale, + const char *codepage) +{ + UErrorCode status = U_ZERO_ERROR; + UFILE *result = (UFILE*) uprv_malloc(sizeof(UFILE)); + if(result == NULL || f == NULL) { + return 0; + } - r = ures_open(NULL, NULL, &status); - if(U_FAILURE(status)) { - return FALSE; - } else { - ures_close(r); + uprv_memset(result, 0, sizeof(UFILE)); + result->fFileno = fileno(f); + +#ifdef WIN32 + if (0 <= result->fFileno && result->fFileno <= 2) { + /* stdin, stdout and stderr need to be special cased for Windows 98 */ + result->fFile = &_iob[_fileno(f)]; } + else #endif - cnv = ucnv_open(cp, &status); - if(cnv == NULL) { - return FALSE; - } else { - ucnv_close(cnv); + { + result->fFile = f; } - return TRUE; -} + result->str.fBuffer = result->fUCBuffer; + result->str.fPos = result->fUCBuffer; + result->str.fLimit = result->fUCBuffer; +#if !UCONFIG_NO_FORMATTING + /* if locale is 0, use the default */ + if(locale == 0) { + locale = uloc_getDefault(); + } + if(u_locbund_init(&result->str.fBundle, locale) == 0) { + /* DO NOT FCLOSE HERE! */ + uprv_free(result); + return 0; + } +#endif + + /* If the codepage is not "" use the ucnv_open default behavior */ + if(codepage == NULL || *codepage != '\0') { + result->fConverter = ucnv_open(codepage, &status); + } + /* else result->fConverter is already memset'd to NULL. */ + + if(U_FAILURE(status)) { +#if !UCONFIG_NO_FORMATTING + u_locbund_close(&result->str.fBundle); +#endif + /* DO NOT fclose here!!!!!! */ + uprv_free(result); + result = NULL; + } + + return result; +} U_CAPI UFILE* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ u_fopen(const char *filename, @@ -71,82 +114,88 @@ u_fopen(const char *filename, if (result) { result->fOwnFile = TRUE; } + else { + /* Something bad happened. + Maybe the converter couldn't be opened. */ + fclose(systemFile); + } return result; } -U_CAPI UFILE* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ -u_finit(FILE *f, - const char *locale, - const char *codepage) +U_CAPI UFILE* U_EXPORT2 +u_fstropen(UChar *stringBuf, + int32_t capacity, + const char *locale) { - UErrorCode status = U_ZERO_ERROR; - UBool useSysCP = (UBool)(locale == NULL && codepage == NULL); - UFILE *result = (UFILE*) uprv_malloc(sizeof(UFILE)); - if(result == NULL || f == NULL) { - return 0; + UFILE *result; + + if (capacity < 0) { + return NULL; } + result = (UFILE*) uprv_malloc(sizeof(UFILE)); uprv_memset(result, 0, sizeof(UFILE)); + result->str.fBuffer = stringBuf; + result->str.fPos = stringBuf; + result->str.fLimit = stringBuf+capacity; -#ifdef WIN32 - result->fFile = &_iob[_fileno(f)]; -#else - result->fFile = f; -#endif - result->fUCPos = result->fUCBuffer; - result->fUCLimit = result->fUCBuffer; - - if(hasICUData(codepage)) { #if !UCONFIG_NO_FORMATTING - /* if locale is 0, use the default */ - if(locale == 0) { - locale = uloc_getDefault(); - } - - result->fBundle = u_loccache_get(locale); - if(result->fBundle == 0) { - /* DO NOT FCLOSE HERE! */ - uprv_free(result); - return 0; - } -#endif - } else { - /* bootstrap mode */ - return result; + /* if locale is 0, use the default */ + if(locale == 0) { + locale = uloc_getDefault(); } - /* if the codepage is NULL, use the default for the locale */ - if(codepage == NULL) { - if(!useSysCP) { /* if both locale and codepage are NULL, use the system default codepage */ - codepage = uprv_defaultCodePageForLocale(locale); - } - - /* if the codepage is still NULL, the default codepage will be used */ - result->fConverter = ucnv_open(codepage, &status); - if(U_FAILURE(status) || result->fConverter == NULL) { - /* DO NOT fclose here!!!!!! */ - uprv_free(result); - return 0; - } - } else if (*codepage != '\0') { - result->fConverter = ucnv_open(codepage, &status); - if(U_FAILURE(status) || result->fConverter == NULL) { - /* DO NOT fclose here!!!!!! */ - uprv_free(result); - return 0; - } + if(u_locbund_init(&result->str.fBundle, locale) == 0) { + /* DO NOT FCLOSE HERE! */ + uprv_free(result); + return 0; } +#endif + return result; } +U_CAPI UBool U_EXPORT2 +u_feof(UFILE *f) +{ + UBool endOfBuffer; + if (f == NULL) { + return TRUE; + } + endOfBuffer = (UBool)(f->str.fPos >= f->str.fLimit); + if (f->fFile != NULL) { + return endOfBuffer && feof(f->fFile); + } + return endOfBuffer; +} U_CAPI void U_EXPORT2 u_fflush(UFILE *file) { - ufile_flush_translit(file); - fflush(file->fFile); - /* TODO: flush input */ + ufile_flush_translit(file); + if (file->fFile) { + fflush(file->fFile); + } + else if (file->str.fPos < file->str.fLimit) { + *(file->str.fPos++) = 0; + } + /* TODO: flush input */ +} + +U_CAPI void +u_frewind(UFILE *file) +{ + u_fflush(file); + ucnv_reset(file->fConverter); + if (file->fFile) { + rewind(file->fFile); + file->str.fLimit = file->fUCBuffer; + file->str.fPos = file->fUCBuffer; + } + else { + file->str.fPos = file->str.fBuffer; + } } U_CAPI void U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ @@ -159,8 +208,7 @@ u_fclose(UFILE *file) fclose(file->fFile); #if !UCONFIG_NO_FORMATTING - if(file->fOwnBundle) - u_locbund_delete(file->fBundle); + u_locbund_close(&file->str.fBundle); #endif ucnv_close(file->fConverter); @@ -178,20 +226,16 @@ u_fgetfile( UFILE *f) U_CAPI const char* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ u_fgetlocale( UFILE *file) { - return file->fBundle->fLocale; + return file->str.fBundle.fLocale; } U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ -u_fsetlocale(const char *locale, - UFILE *file) +u_fsetlocale(UFILE *file, + const char *locale) { - if(file->fOwnBundle) - u_locbund_delete(file->fBundle); + u_locbund_close(&file->str.fBundle); - file->fBundle = u_loccache_get(locale); - file->fOwnBundle = FALSE; - - return file->fBundle == 0 ? -1 : 0; + return u_locbund_init(&file->str.fBundle, locale) == 0 ? -1 : 0; } #endif @@ -215,21 +259,17 @@ u_fsetcodepage( const char *codepage, UFILE *file) { UErrorCode status = U_ZERO_ERROR; - -#if !UCONFIG_NO_FORMATTING - /* if the codepage is 0, use the default for the locale */ - if(codepage == 0) { - codepage = uprv_defaultCodePageForLocale(file->fBundle->fLocale); - - /* if the codepage is still 0, fall back on the default codepage */ + int32_t retVal = -1; + + /* We use the normal default codepage for this system, and not the one for the locale. */ + if ((file->str.fPos == file->str.fBuffer) && (file->str.fLimit == file->str.fBuffer)) { + ucnv_close(file->fConverter); + file->fConverter = ucnv_open(codepage, &status); + if(U_SUCCESS(status)) { + retVal = 0; + } } -#endif - - ucnv_close(file->fConverter); - file->fConverter = ucnv_open(codepage, &status); - if(U_FAILURE(status)) - return -1; - return 0; + return retVal; } @@ -238,3 +278,4 @@ u_fgetConverter(UFILE *file) { return file->fConverter; } + diff --git a/icuSources/io/ufile.h b/icuSources/io/ufile.h new file mode 100644 index 00000000..8be6d731 --- /dev/null +++ b/icuSources/io/ufile.h @@ -0,0 +1,124 @@ +/* +******************************************************************************* +* +* Copyright (C) 1998-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* +* File ufile.h +* +* Modification History: +* +* Date Name Description +* 12/01/98 stephen Creation. +* 03/12/99 stephen Modified for new C API. +******************************************************************************* +*/ + +#ifndef UFILE_H +#define UFILE_H + +#include "unicode/utypes.h" +#include "unicode/ucnv.h" +#include "unicode/utrans.h" +#include "locbund.h" + +/* The buffer size for fromUnicode calls */ +#define UFILE_CHARBUFFER_SIZE 1024 + +/* The buffer size for toUnicode calls */ +#define UFILE_UCHARBUFFER_SIZE 1024 + +/* A UFILE */ + +#if !UCONFIG_NO_TRANSLITERATION + +typedef struct { + UChar *buffer; /* Beginning of buffer */ + int32_t capacity; /* Capacity of buffer */ + int32_t pos; /* Beginning of untranslitted data */ + int32_t length; /* Length *from beginning of buffer* of untranslitted data */ + UTransliterator *translit; +} UFILETranslitBuffer; + +#endif + +typedef struct u_localized_string { + UChar *fPos; /* current pos in fUCBuffer */ + const UChar *fLimit; /* data limit in fUCBuffer */ + UChar *fBuffer; /* Place to write the string */ + +#if !UCONFIG_NO_FORMATTING + ULocaleBundle fBundle; /* formatters */ +#endif +} u_localized_string; + +struct UFILE { +#if !UCONFIG_NO_TRANSLITERATION + UFILETranslitBuffer *fTranslit; +#endif + + FILE *fFile; /* the actual filesystem interface */ + + UConverter *fConverter; /* for codeset conversion */ + + u_localized_string str; /* struct to handle strings for number formatting */ + + UChar fUCBuffer[UFILE_UCHARBUFFER_SIZE];/* buffer used for toUnicode */ + + UBool fOwnFile; /* TRUE if fFile should be closed */ + + int32_t fFileno; /* File number. Useful to determine if it's stdin. */ +}; + +/** + * Like u_file_write but takes a flush parameter + */ +U_CAPI int32_t U_EXPORT2 +u_file_write_flush( const UChar *chars, + int32_t count, + UFILE *f, + UBool flush); + +/** + * Fill a UFILE's buffer with converted codepage data. + * @param f The UFILE containing the buffer to fill. + */ +void +ufile_fill_uchar_buffer(UFILE *f); + +/** + * Get one code unit and detect whether the end of file has been reached. + * @param f The UFILE containing the characters. + * @param ch The read in character + * @return TRUE if the character is valid, or FALSE when EOF has been detected + */ +U_CFUNC UBool U_EXPORT2 +ufile_getch(UFILE *f, UChar *ch); + +/** + * Get one character and detect whether the end of file has been reached. + * @param f The UFILE containing the characters. + * @param ch The read in character + * @return TRUE if the character is valid, or FALSE when EOF has been detected + */ +U_CFUNC UBool U_EXPORT2 +ufile_getch32(UFILE *f, UChar32 *ch); + +/** + * Close out the transliterator and flush any data therein. + * @param f flu + */ +void +ufile_close_translit(UFILE *f); + +/** + * Flush the buffer in the transliterator + * @param f UFile to flush + */ +void +ufile_flush_translit(UFILE *f); + + +#endif diff --git a/icuSources/extra/ustdio/ufmt_cmn.c b/icuSources/io/ufmt_cmn.c similarity index 63% rename from icuSources/extra/ustdio/ufmt_cmn.c rename to icuSources/io/ufmt_cmn.c index db43ff24..855f1475 100644 --- a/icuSources/extra/ustdio/ufmt_cmn.c +++ b/icuSources/io/ufmt_cmn.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1998-2003, International Business Machines +* Copyright (C) 1998-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -23,7 +23,7 @@ #include "ufmt_cmn.h" #include "unicode/uchar.h" #include "unicode/ucnv.h" -#include "ustr_imp.h" +#include "ustr_cnv.h" #define DIGIT_0 0x0030 #define DIGIT_9 0x0039 @@ -56,14 +56,14 @@ ufmt_isdigit(UChar c, return (UBool)(digitVal < radix && digitVal >= 0); } -#define TO_UC_DIGIT(a) a <= 9 ? (0x0030 + a) : (0x0030 + a + 7) -#define TO_LC_DIGIT(a) a <= 9 ? (0x0030 + a) : (0x0030 + a + 39) +#define TO_UC_DIGIT(a) a <= 9 ? (0x0030 + a) : (0x0037 + a) +#define TO_LC_DIGIT(a) a <= 9 ? (0x0030 + a) : (0x0057 + a) void -ufmt_ltou(UChar *buffer, +ufmt_64tou(UChar *buffer, int32_t *len, - uint32_t value, - uint32_t radix, + uint64_t value, + uint8_t radix, UBool uselower, int32_t minDigits) { @@ -72,7 +72,7 @@ ufmt_ltou(UChar *buffer, UChar *left, *right, temp; do { - digit = value % radix; + digit = (uint32_t)(value % radix); value = value / radix; buffer[length++] = (UChar)(uselower ? TO_LC_DIGIT(digit) : TO_UC_DIGIT(digit)); @@ -96,20 +96,52 @@ ufmt_ltou(UChar *buffer, *len = length; } -long -ufmt_utol(const UChar *buffer, +void +ufmt_ptou(UChar *buffer, + int32_t *len, + void *value, + UBool uselower) +{ + int32_t i; + int32_t length = 0; + uint8_t *ptrIdx = (uint8_t *)&value; + +#if U_IS_BIG_ENDIAN + for (i = 0; i < (int32_t)sizeof(void *); i++) +#else + for (i = (int32_t)sizeof(void *)-1; i >= 0 ; i--) +#endif + { + uint8_t byteVal = ptrIdx[i]; + uint16_t firstNibble = (uint16_t)(byteVal>>4); + uint16_t secondNibble = (uint16_t)(byteVal&0xF); + if (uselower) { + buffer[length++]=TO_LC_DIGIT(firstNibble); + buffer[length++]=TO_LC_DIGIT(secondNibble); + } + else { + buffer[length++]=TO_UC_DIGIT(firstNibble); + buffer[length++]=TO_UC_DIGIT(secondNibble); + } + } + + *len = length; +} + +int64_t +ufmt_uto64(const UChar *buffer, int32_t *len, - int32_t radix) + int8_t radix) { const UChar *limit; int32_t count; - long result; + int64_t result; /* intialize parameters */ limit = buffer + *len; count = 0; - result = 0; + result = 0; /* iterate through buffer */ while(ufmt_isdigit(*buffer, radix) && buffer < limit) { @@ -126,6 +158,39 @@ ufmt_utol(const UChar *buffer, return result; } +void * +ufmt_utop(const UChar *buffer, + int32_t *len) +{ + /* + TODO: Fix this code so that it will work with pointers that are 2<=sizeof(void*)<=16 + */ + const UChar *limit; + int32_t count; + int64_t result; + + + /* intialize parameters */ + limit = buffer + *len; + count = 0; + result = 0; + + /* iterate through buffer */ + /* limit to sixteen iterations since that is the max that an int64_t can contain for pointer work */ + while(ufmt_isdigit(*buffer, 16) && buffer < limit) { + + /* read the next digit */ + result *= 16; + result += ufmt_digitvalue(*buffer++); + + /* increment our count */ + ++count; + } + + *len = count; + return (void *)result; +} + UChar* ufmt_defaultCPToUnicode(const char *s, int32_t sSize, UChar *target, int32_t tSize) @@ -158,37 +223,4 @@ ufmt_defaultCPToUnicode(const char *s, int32_t sSize, return target; } -char* -ufmt_unicodeToDefaultCP(const UChar *s, - int32_t len) -{ - int32_t size; - char *target, *alias; - UErrorCode status = U_ZERO_ERROR; - UConverter *defConverter = u_getDefaultConverter(&status); - - if(U_FAILURE(status) || defConverter == 0) - return 0; - - /* perform the conversion in one swoop */ - target = (char*) - uprv_malloc((len + 1) * ucnv_getMaxCharSize(defConverter) * sizeof(char)); - size = (len) * ucnv_getMaxCharSize(defConverter) * sizeof(char); - if(target != 0) { - - alias = target; - ucnv_fromUnicode(defConverter, &alias, alias + size, &s, s + len, - NULL, TRUE, &status); - - - /* add the null terminator */ - *alias = 0x00; - } - - u_releaseDefaultConverter(defConverter); - - return target; -} - - diff --git a/icuSources/extra/ustdio/ufmt_cmn.h b/icuSources/io/ufmt_cmn.h similarity index 58% rename from icuSources/extra/ustdio/ufmt_cmn.h rename to icuSources/io/ufmt_cmn.h index b16d90b7..29a4a07f 100644 --- a/icuSources/extra/ustdio/ufmt_cmn.h +++ b/icuSources/io/ufmt_cmn.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1998-2003, International Business Machines +* Copyright (C) 1998-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -22,45 +22,42 @@ #include "unicode/utypes.h" -#define UFMT_DEFAULT_BUFFER_SIZE 64 +#define UFMT_DEFAULT_BUFFER_SIZE 128 #define MAX_UCHAR_BUFFER_SIZE(buffer) (sizeof(buffer)/(UTF_MAX_CHAR_LENGTH*sizeof(UChar))) #define MAX_UCHAR_BUFFER_NEEDED(strLen) ((strLen+1)*UTF_MAX_CHAR_LENGTH*sizeof(UChar)) /** * Enum representing the possible argument types for uprintf/uscanf */ -enum ufmt_type_info -{ - ufmt_empty = 0, - ufmt_simple_percent, /* %% do nothing */ - ufmt_count, /* special flag for count */ - ufmt_int, /* int */ - ufmt_char, /* int, cast to char */ - ufmt_wchar, /* wchar_t */ - ufmt_string, /* char* */ - ufmt_wstring, /* wchar_t* */ - ufmt_pointer, /* void* */ - ufmt_float, /* float */ - ufmt_double, /* double */ - ufmt_date, /* Date */ - ufmt_uchar, /* int, cast to UChar */ - ufmt_ustring, /* UChar* */ - ufmt_last -}; -typedef enum ufmt_type_info ufmt_type_info; +typedef enum ufmt_type_info { + ufmt_empty = 0, + ufmt_simple_percent, /* %% do nothing */ + ufmt_count, /* special flag for count */ + ufmt_int, /* int */ + ufmt_char, /* int, cast to char */ + ufmt_string, /* char* */ + ufmt_pointer, /* void* */ + ufmt_float, /* float */ + ufmt_double, /* double */ + ufmt_uchar, /* int, cast to UChar */ + ufmt_ustring /* UChar* */ + /*ufmt_wchar,*/ /* wchar_t */ + /*ufmt_wstring,*/ /* wchar_t* */ + /*ufmt_date,*/ /* Date */ + /*ufmt_last*/ +} ufmt_type_info; /** * Union representing a uprintf/uscanf argument */ -union ufmt_args { - signed int intValue; /* int, UChar */ /* TODO: Should int32_t be used instead of int? */ - float floatValue; /* float */ - double doubleValue; /* double */ - void *ptrValue; /* any pointer - void*, char*, wchar_t*, UChar* */ - wchar_t wcharValue; /* wchar_t */ /* TODO: Should wchar_t be used? */ - UDate dateValue; /* Date */ -}; -typedef union ufmt_args ufmt_args; +typedef union ufmt_args { + int64_t int64Value; /* int, UChar */ + float floatValue; /* float */ + double doubleValue; /* double */ + void *ptrValue; /* any pointer - void*, char*, wchar_t*, UChar* */ + /*wchar_t wcharValue;*/ /* wchar_t */ /* TODO: Should wchar_t be used? */ + /*UDate dateValue;*/ /* Date */ +} ufmt_args; /** * Macro for determining the minimum of two numbers. @@ -89,7 +86,7 @@ ufmt_isdigit(UChar c, int32_t radix); /** - * Convert a long to a UChar* in a specified radix + * Convert an int64_t to a UChar* in a specified radix * @param buffer The target buffer * @param len On input, the size of buffer. On output, * the number of UChars written to buffer. @@ -100,25 +97,48 @@ ufmt_isdigit(UChar c, * which will be padded with zeroes. -1 means do not pad. */ void -ufmt_ltou(UChar *buffer, +ufmt_64tou(UChar *buffer, int32_t *len, - uint32_t value, - uint32_t radix, + uint64_t value, + uint8_t radix, UBool uselower, int32_t minDigits); /** - * Convert a UChar* in a specified radix to a long. + * It's like ufmt_64tou, but with a pointer. + * This functions avoids size constraints of 64-bit types. + * Pointers can be at 32-128 bits in size. + */ +void +ufmt_ptou(UChar *buffer, + int32_t *len, + void *value, + UBool uselower); + +/** + * Convert a UChar* in a specified radix to an int64_t. * @param buffer The target buffer * @param len On input, the size of buffer. On output, * the number of UChars read from buffer. * @param radix The desired radix * @return The numeric value. */ -long -ufmt_utol(const UChar *buffer, +int64_t +ufmt_uto64(const UChar *buffer, int32_t *len, - int32_t radix); + int8_t radix); + +/** + * Convert a UChar* in a specified radix to a pointer, + * @param buffer The target buffer + * @param len On input, the size of buffer. On output, + * the number of UChars read from buffer. + * @param radix The desired radix + * @return The pointer value. + */ +void * +ufmt_utop(const UChar *buffer, + int32_t *len); /** * Convert a string from the default codepage to Unicode. @@ -134,30 +154,6 @@ ufmt_defaultCPToUnicode(const char *s, int32_t sSize, UChar *target, int32_t tSize); -/** - * Convert a string from the Unicode to the default codepage. - * @param s The string to convert. - * @param len The number of characters in s. - * @return A pointer to a newly allocated converted version of s, or 0 - * on error. - */ -char* -ufmt_unicodeToDefaultCP(const UChar *s, - int32_t len); - -/** - * Get the number of fraction digits based on the requested precision. - * This is a shortcoming of the formatting API, which doesn't - * support precision - * @param num The number to look at - * @param precision The requested precision - * @return The fraction digits size to use on the formatting API. - */ -int32_t -ufmt_getFractionDigits(double num, int32_t precision); #endif - - - diff --git a/icuSources/extra/ustdio/unicode/ustdio.h b/icuSources/io/unicode/ustdio.h similarity index 66% rename from icuSources/extra/ustdio/unicode/ustdio.h rename to icuSources/io/unicode/ustdio.h index 7576235d..cc0b6d7a 100644 --- a/icuSources/extra/ustdio/unicode/ustdio.h +++ b/icuSources/io/unicode/ustdio.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1998-2001, International Business Machines +* Copyright (C) 1998-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -34,29 +34,13 @@ The following is a small list as to what is currently wrong/suggestions for ustdio. - * %D and %T printf uses the current timezone, but the scanf version uses GMT. - * %p should be deprecated. Pointers are 2-16 bytes big and scanf should - really read them. - * The format specification should use int32_t and ICU type variants instead of - the compiler dependent int. - * We should consider using Microsoft's wprintf and wscanf format - specification. - * %C and %S are aliases of %lc and %ls, which are used for wchar_t. - We should consider using this for UChar and replace %K and %U, - or we should make them use wchar_t. - * + in printf format specification is incomplete. - * Make sure that #, blank and precision in the printf format specification - works. - * Make sure that * in the scanf format specification works. - * Each UFILE takes up at least 2KB. This should be really reduced. + * Make sure that * in the scanf format specification works for all formats. + * Each UFILE takes up at least 2KB. + Look into adding setvbuf() for configurable buffers. * This library does buffering. The OS should do this for us already. Check on this, and remove it from this library, if this is the case. Double buffering wastes a lot of time and space. - * Make sure that surrogates are supported. It doesn't look like %[], %s or %U - properly handle surrogates in both scanf()'s. - * The ustream header should also include operator<< and - operator>> for UDate (not double). This may not work on some compilers - that use these operators on a double. + * Test stdin and stdout with the u_f* functions * Testing should be done for reading and writing multi-byte encodings, and make sure that a character that is contained across buffer boundries works even for incomplete characters. @@ -74,51 +58,121 @@ without memory leaks and the unconvertable characters are valid substitution or are escaped characters. * u_fungetc() can't unget a character when it's at the beginning of the - internal conversion buffer, and it shouldn't be writing new - characters to this buffer because they might be different characters. - This can be tested by writing a file, and reading it backwards by - using u_fgetc and two u_fungetc() calls with incorrect data. - FYI The behavior is undefined for ungetc() when an incorrect character - is put back, when its called multiple times in a row, or when - a its called without a read operation. + internal conversion buffer. For example, read the buffer size # of + characters, and then ungetc to get the previous character that was + at the end of the last buffer. * u_fflush() and u_fclose should return an int32_t like C99 functions. 0 is returned if the operation was successful and EOF otherwise. * u_fsettransliterator does not support U_READ side of transliteration. * The format specifier should limit the size of a format or honor it in - order to prevent buffer overruns. (e.g. %1000.1000d). - * u_fgets is different from stdio. The UChar and UFile arguments are swapped. + order to prevent buffer overruns. (e.g. %256.256d). * u_fread and u_fwrite don't exist. They're needed for reading and writing data structures without any conversion. * u_file_read and u_file_write are used for writing strings. u_fgets and u_fputs or u_fread and u_fwrite should be used to do this. - * u_fgetcx isn't really needed anymore because the transliterator is a - part of the file API. It allows multiple kinds of escape sequences - to be unescaped. - * We should consider using a UnicodeSet for scanset. - * scanset has a buffer overflow and underflow bug for both string and file - APIs. - * The width '*' parameter for all scanf formats, including scanset, needs + * The width parameter for all scanf formats, including scanset, needs better testing. This prevents buffer overflows. - * u_fgetc() and u_fungetc() should use UChar32 instead of UChar, or at - least 32-bit versions should be available. - * More testing is needed. + * Figure out what is suppose to happen when a codepage is changed midstream. + Maybe a flush or a rewind are good enough. + * Make sure that a UFile opened with "rw" can be used after using + u_fflush with a u_frewind. + * scanf(%i) should detect what type of number to use. + * Add more testing of the alternate format, %# + * Look at newline handling of fputs/puts + * Think more about codeunit/codepoint error handling/support in %S,%s,%C,%c,%[] + * Complete the file documentation with proper doxygen formatting. + See http://oss.software.ibm.com/pipermail/icu/2003-July/005647.html */ +/** + * \file + * \brief C API: Unicode stdio-like API + * + *

      Unicode stdio-like C API

      +General printf format:
      +%[format modifier][width][.precision][type modifier][format] + +General scanf format:
      +%[*][format modifier][width][type modifier][format] + + + + + + + + + + + + + + + + + + + + + + +
      formatdefault
      type
      description
      %EdoubleScientific with an uppercase exponent
      %edoubleScientific with a lowercase exponent
      %GdoubleUse %E or %f for best format
      %gdoubleUse %e or %f for best format
      %fdoubleSimple floating point without the exponent
      %Xint32_tustdio special uppercase hex radix formatting
      %xint32_tustdio special lowercase hex radix formatting
      %dint32_tDecimal format
      %iint32_tSame as %d
      %nint32_tcount (write the number of UTF-16 codeunits read/written)
      %oint32_tustdio special octal radix formatting
      %uuint32_tDecimal format
      %pvoid *Prints the pointer value
      %schar *Use default converter or specified converter from fopen
      %ccharUse default converter or specified converter from fopen
      +When width is specified, this acts like a non-NULL-terminated char * string.
      +By default, only one char is written.
      %SUChar *Null terminated UTF-16 string
      %CUChar16-bit Unicode code unit
      +When width is specified, this acts like a non-NULL-terminated UChar * string
      +By default, only one codepoint is written.
      %[]UChar *(scanf only) Null terminated UTF-16 string which contains the filtered set of characters specified by the UnicodeSet
      %%N/AShow a percent sign
      + +Format modifiers + + + + + + + + + + + + + + + + + + + + + + +
      modifierformatstypecomments
      %h%d, %i, %o, %xint16_tshort format
      %h%uuint16_tshort format
      %hcchar(Unimplemented) Use invariant converter
      %hschar *(Unimplemented) Use invariant converter
      %hCchar(Unimplemented) 8-bit Unicode code unit
      %hSchar *(Unimplemented) Null terminated UTF-8 string
      %l%d, %i, %o, %xint32_tlong format (no effect)
      %l%uuint32_tlong format (no effect)
      %lcN/A(Unimplemented) Reserved for future implementation
      %lsN/A(Unimplemented) Reserved for future implementation
      %lCUChar32(Unimplemented) 32-bit Unicode code unit
      %lSUChar32 *(Unimplemented) Null terminated UTF-32 string
      %ll%d, %i, %o, %xint64_tlong long format
      %ll%uuint64_t(Unimplemented) long long format
      %-allN/ALeft justify
      %+%d, %i, %o, %x, %e, %f, %g, %E, %GN/AAlways show the plus or minus sign. Needs data for plus sign.
      % %d, %i, %o, %x, %e, %f, %g, %E, %GN/AInstead of a "+" output a blank character for positive numbers.
      %#%d, %i, %o, %x, %e, %f, %g, %E, %GN/APrecede octal value with 0, hex with 0x and show the + decimal point for floats.
      %nallN/AWidth of input/output. num is an actual number from 0 to + some large number.
      %.n%e, %f, %g, %E, %F, %GN/ASignificant digits precision. num is an actual number from + 0 to some large number.
      If * is used in printf, then the precision is passed in as an argument before the number to be formatted.
      + +printf modifier +%* int32_t Next argument after this one specifies the width + +scanf modifier +%* N/A This field is scanned, but not stored + + */ + /** * When an end of file is encountered, this value can be returned. * @see u_fgetc - * @draft + * @draft 3.0 */ #define U_EOF 0xFFFF -/** Forward declaration of a Unicode-aware file @draft */ +/** Forward declaration of a Unicode-aware file @draft 3.0 */ typedef struct UFILE UFILE; /** * Enum for which direction of stream a transliterator applies to. * @see u_fsettransliterator - * @draft + * @draft 3.0 */ typedef enum { U_READ = 1, @@ -138,11 +192,10 @@ typedef enum { * and parse output. If this parameter is NULL, the default locale will * be used. * @param codepage The codepage in which data will be written to and - * read from the file. If this paramter is NULL, data will be written and - * read using the default codepage for locale, unless locale - * is NULL, in which case the system default codepage will be used. + * read from the file. If this paramter is NULL the system default codepage + * will be used. * @return A new UFILE, or NULL if an error occurred. - * @draft + * @draft 3.0 */ U_CAPI UFILE* U_EXPORT2 u_fopen(const char *filename, @@ -161,37 +214,75 @@ u_fopen(const char *filename, * read using the default codepage for locale, unless locale * is NULL, in which case the system default codepage will be used. * @return A new UFILE, or NULL if an error occurred. - * @draft + * @draft 3.0 */ U_CAPI UFILE* U_EXPORT2 u_finit(FILE *f, const char *locale, const char *codepage); +/** + * Create a UFILE that can be used for localized formatting or parsing. + * The u_sprintf and u_sscanf functions do not read or write numbers for a + * specific locale. The ustdio.h file functions can be used on this UFILE. + * The string is usable once u_fclose or u_fflush has been called on the + * returned UFILE. + * @param stringBuf The string used for reading or writing. + * @param capacity The number of code units available for use in stringBuf + * @param locale The locale whose conventions will be used to format + * and parse output. If this parameter is NULL, the default locale will + * be used. + * @return A new UFILE, or NULL if an error occurred. + * @draft 3.0 + */ +U_CAPI UFILE* U_EXPORT2 +u_fstropen(UChar *stringBuf, + int32_t capacity, + const char *locale); + /** * Close a UFILE. * @param file The UFILE to close. - * @draft + * @draft 3.0 */ U_CAPI void U_EXPORT2 u_fclose(UFILE *file); +/** + * Tests if the UFILE is at the end of the file stream. + * @param f The UFILE from which to read. + * @return Returns TRUE after the first read operation that attempts to + * read past the end of the file. It returns FALSE if the current position is + * not end of file. + * @draft 3.0 +*/ +U_CAPI UBool U_EXPORT2 +u_feof(UFILE *f); + /** * Flush output of a UFILE. Implies a flush of * converter/transliterator state. (That is, a logical break is * made in the output stream - for example if a different type of * output is desired.) The underlying OS level file is also flushed. * @param file The UFILE to flush. - * @draft + * @draft 3.0 */ U_CAPI void U_EXPORT2 u_fflush(UFILE *file); +/** + * Rewind the file pointer to the beginning of the file. + * @param file The UFILE to rewind. + * @draft 3.0 + */ +U_CAPI void +u_frewind(UFILE *file); + /** * Get the FILE* associated with a UFILE. * @param f The UFILE * @return A FILE*, owned by the UFILE. The FILE must not be closed. - * @draft + * @draft 3.0 */ U_CAPI FILE* U_EXPORT2 u_fgetfile(UFILE *f); @@ -204,7 +295,7 @@ u_fgetfile(UFILE *f); * or u_fopen. * @param file The UFILE to set. * @return The locale whose conventions are used to format and parse output. - * @draft + * @draft 3.0 */ U_CAPI const char* U_EXPORT2 u_fgetlocale(UFILE *file); @@ -215,11 +306,11 @@ u_fgetlocale(UFILE *file); * and parse output. * @param file The UFILE to query. * @return NULL if successful, otherwise a negative number. - * @draft + * @draft 3.0 */ U_CAPI int32_t U_EXPORT2 -u_fsetlocale(const char *locale, - UFILE *file); +u_fsetlocale(UFILE *file, + const char *locale); #endif @@ -230,7 +321,7 @@ u_fsetlocale(const char *locale, * @param file The UFILE to query. * @return The codepage in which data is written to and read from the UFILE, * or NULL if an error occurred. - * @draft + * @draft 3.0 */ U_CAPI const char* U_EXPORT2 u_fgetcodepage(UFILE *file); @@ -238,28 +329,33 @@ u_fgetcodepage(UFILE *file); /** * Set the codepage in which data will be written to and read from the UFILE. * All Unicode data written to the UFILE will be converted to this codepage - * before it is written to the underlying FILE*. + * before it is written to the underlying FILE*. It it generally a bad idea to + * mix codepages within a file. This should only be called right + * after opening the UFile, or after calling u_frewind. * @param codepage The codepage in which data will be written to * and read from the file. For example "latin-1" or "ibm-943. * A value of NULL means the default codepage for the UFILE's current * locale will be used. * @param file The UFILE to set. - * @return NULL if successful, otherwise a negative number. - * @draft + * @return 0 if successful, otherwise a negative number. + * @see u_frewind + * @draft 3.0 */ U_CAPI int32_t U_EXPORT2 -u_fsetcodepage(const char *codepage, - UFILE *file); +u_fsetcodepage(const char *codepage, + UFILE *file); /** * Returns an alias to the converter being used for this file. - * @param file The UFILE to set. + * @param f The UFILE to get the value from * @return alias to the converter - * @draft + * @draft 3.0 */ U_CAPI UConverter* U_EXPORT2 u_fgetConverter(UFILE *f); +#if !UCONFIG_NO_FORMATTING + /* Output functions */ /** @@ -268,29 +364,29 @@ U_CAPI UConverter* U_EXPORT2 u_fgetConverter(UFILE *f); * @param patternSpecification A pattern specifying how u_fprintf will * interpret the variable arguments received and format the data. * @return The number of Unicode characters written to f. - * @draft + * @draft 3.0 */ U_CAPI int32_t U_EXPORT2 -u_fprintf( UFILE *f, - const char *patternSpecification, - ... ); +u_fprintf(UFILE *f, + const char *patternSpecification, + ... ); /** * Write formatted data to a UFILE. * This is identical to u_fprintf, except that it will - * not call va_start/TT> and va_end. + * not call va_start and va_end. * @param f The UFILE to which to write. * @param patternSpecification A pattern specifying how u_fprintf will * interpret the variable arguments received and format the data. * @param ap The argument list to use. * @return The number of Unicode characters written to f. * @see u_fprintf - * @draft + * @draft 3.0 */ U_CAPI int32_t U_EXPORT2 -u_vfprintf( UFILE *f, - const char *patternSpecification, - va_list ap); +u_vfprintf(UFILE *f, + const char *patternSpecification, + va_list ap); /** * Write formatted data to a UFILE. @@ -298,30 +394,30 @@ u_vfprintf( UFILE *f, * @param patternSpecification A pattern specifying how u_fprintf will * interpret the variable arguments received and format the data. * @return The number of Unicode characters written to f. - * @draft + * @draft 3.0 */ U_CAPI int32_t U_EXPORT2 -u_fprintf_u( UFILE *f, - const UChar *patternSpecification, - ... ); +u_fprintf_u(UFILE *f, + const UChar *patternSpecification, + ... ); /** * Write formatted data to a UFILE. * This is identical to u_fprintf_u, except that it will - * not call va_start/TT> and va_end. + * not call va_start and va_end. * @param f The UFILE to which to write. * @param patternSpecification A pattern specifying how u_fprintf will * interpret the variable arguments received and format the data. * @param ap The argument list to use. * @return The number of Unicode characters written to f. * @see u_fprintf_u - * @draft + * @draft 3.0 */ U_CAPI int32_t U_EXPORT2 -u_vfprintf_u( UFILE *f, - const UChar *patternSpecification, - va_list ap); - +u_vfprintf_u(UFILE *f, + const UChar *patternSpecification, + va_list ap); +#endif /** * Write a Unicode to a UFILE. The null (U+0000) terminated UChar* * s will be written to f, excluding the NULL terminator. @@ -329,40 +425,43 @@ u_vfprintf_u( UFILE *f, * @param s The UChar* to write. * @param f The UFILE to which to write. * @return A non-negative number if successful, EOF otherwise. - * @draft + * @see u_file_write + * @draft 3.0 */ U_CAPI int32_t U_EXPORT2 -u_fputs(const UChar *s, - UFILE *f); +u_fputs(const UChar *s, + UFILE *f); /** * Write a UChar to a UFILE. * @param uc The UChar to write. * @param f The UFILE to which to write. * @return The character written if successful, EOF otherwise. - * @draft + * @draft 3.0 */ -U_CAPI int32_t U_EXPORT2 -u_fputc(UChar uc, - UFILE *f); +U_CAPI UChar32 U_EXPORT2 +u_fputc(UChar32 uc, + UFILE *f); /** * Write Unicode to a UFILE. * The ustring passed in will be converted to the UFILE's underlying * codepage before it is written. - * @param chars A pointer to the Unicode data to write. + * @param ustring A pointer to the Unicode data to write. * @param count The number of Unicode characters to write * @param f The UFILE to which to write. * @return The number of Unicode characters written. - * @draft + * @see u_fputs + * @draft 3.0 */ U_CAPI int32_t U_EXPORT2 -u_file_write(const UChar *chars, - int32_t count, - UFILE *f); +u_file_write(const UChar *ustring, + int32_t count, + UFILE *f); /* Input functions */ +#if !UCONFIG_NO_FORMATTING /** * Read formatted data from a UFILE. @@ -371,17 +470,17 @@ u_file_write(const UChar *chars, * interpret the variable arguments received and parse the data. * @return The number of items successfully converted and assigned, or EOF * if an error occurred. - * @draft + * @draft 3.0 */ U_CAPI int32_t U_EXPORT2 -u_fscanf( UFILE *f, - const char *patternSpecification, - ... ); +u_fscanf(UFILE *f, + const char *patternSpecification, + ... ); /** * Read formatted data from a UFILE. * This is identical to u_fscanf, except that it will - * not call va_start/TT> and va_end. + * not call va_start and va_end. * @param f The UFILE from which to read. * @param patternSpecification A pattern specifying how u_fscanf will * interpret the variable arguments received and parse the data. @@ -389,12 +488,12 @@ u_fscanf( UFILE *f, * @return The number of items successfully converted and assigned, or EOF * if an error occurred. * @see u_fscanf - * @draft + * @draft 3.0 */ U_CAPI int32_t U_EXPORT2 -u_vfscanf( UFILE *f, - const char *patternSpecification, - va_list ap); +u_vfscanf(UFILE *f, + const char *patternSpecification, + va_list ap); /** * Read formatted data from a UFILE. @@ -403,17 +502,17 @@ u_vfscanf( UFILE *f, * interpret the variable arguments received and parse the data. * @return The number of items successfully converted and assigned, or EOF * if an error occurred. - * @draft + * @draft 3.0 */ U_CAPI int32_t U_EXPORT2 -u_fscanf_u( UFILE *f, - const UChar *patternSpecification, - ... ); +u_fscanf_u(UFILE *f, + const UChar *patternSpecification, + ... ); /** * Read formatted data from a UFILE. * This is identical to u_fscanf_u, except that it will - * not call va_start/TT> and va_end. + * not call va_start and va_end. * @param f The UFILE from which to read. * @param patternSpecification A pattern specifying how u_fscanf will * interpret the variable arguments received and parse the data. @@ -421,12 +520,13 @@ u_fscanf_u( UFILE *f, * @return The number of items successfully converted and assigned, or EOF * if an error occurred. * @see u_fscanf_u - * @draft + * @draft 3.0 */ U_CAPI int32_t U_EXPORT2 -u_vfscanf_u( UFILE *f, - const UChar *patternSpecification, - va_list ap); +u_vfscanf_u(UFILE *f, + const UChar *patternSpecification, + va_list ap); +#endif /** * Read one line of text into a UChar* string from a UFILE. The newline @@ -438,61 +538,62 @@ u_vfscanf_u( UFILE *f, * stored successively in s until a newline or EOF is * reached. A null character (U+0000) will be appended to s. * @return A pointer to s, or NULL if no characters were available. - * @draft + * @draft 3.0 */ U_CAPI UChar* U_EXPORT2 -u_fgets(UFILE *f, - int32_t n, - UChar *s); +u_fgets(UChar *s, + int32_t n, + UFILE *f); /** - * Read a UChar from a UFILE. + * Read a UChar from a UFILE. It is recommended that u_fgetcx + * used instead for proper parsing functions, but sometimes reading + * code units is needed instead of codepoints. + * * @param f The UFILE from which to read. * @return The UChar value read, or U+FFFF if no character was available. - * @draft + * @draft 3.0 */ U_CAPI UChar U_EXPORT2 -u_fgetc(UFILE *f); +u_fgetc(UFILE *f); /** - * Read a UChar from a UFILE and process escape sequences. If the - * next character is not a backslash, this is the same as calling - * u_fgetc(). If it is, then additional characters comprising the - * escape sequence will be read from the UFILE, parsed, and the - * resultant UChar returned. Ill-formed escape sequences return - * U+FFFFFFFF. + * Read a UChar32 from a UFILE. + * * @param f The UFILE from which to read. - * @return The UChar value read, or U+FFFF if no character was - * available, or U+FFFFFFFF if an ill-formed escape sequence was + * @return The UChar32 value read, or U_EOF if no character was + * available, or U+FFFFFFFF if an ill-formed character was * encountered. * @see u_unescape() - * @draft + * @draft 3.0 */ U_CAPI UChar32 U_EXPORT2 -u_fgetcx(UFILE *f); +u_fgetcx(UFILE *f); /** * Unget a UChar from a UFILE. * If this function is not the first to operate on f after a call * to u_fgetc, the results are undefined. + * If this function is passed a character that was not recieved from the + * previous u_fgetc or u_fgetcx call, the results are undefined. * @param c The UChar to put back on the stream. * @param f The UFILE to receive c. - * @return The UChar value put back if successful, U+FFFF otherwise. - * @draft + * @return The UChar32 value put back if successful, U_EOF otherwise. + * @draft 3.0 */ -U_CAPI UChar U_EXPORT2 -u_fungetc(UChar c, +U_CAPI UChar32 U_EXPORT2 +u_fungetc(UChar32 c, UFILE *f); /** * Read Unicode from a UFILE. * Bytes will be converted from the UFILE's underlying codepage, with - * subsequent conversion to Unicode. + * subsequent conversion to Unicode. The data will not be NULL terminated. * @param chars A pointer to receive the Unicode data. * @param count The number of Unicode characters to read. * @param f The UFILE from which to read. * @return The number of Unicode characters read. - * @draft + * @draft 3.0 */ U_CAPI int32_t U_EXPORT2 u_file_read(UChar *chars, @@ -516,7 +617,7 @@ u_file_read(UChar *chars, * caller. If U_READWRITE is specified, only the WRITE transliterator * is returned. In most cases, the caller should call utrans_close() * on the result of this function. - * @draft + * @draft 3.0 */ U_CAPI UTransliterator* U_EXPORT2 u_fsettransliterator(UFILE *file, UFileDirection direction, @@ -526,23 +627,21 @@ u_fsettransliterator(UFILE *file, UFileDirection direction, /* Output string functions */ +#if !UCONFIG_NO_FORMATTING /** * Write formatted data to a Unicode string. * * @param buffer The Unicode String to which to write. - * @param locale The locale to use for formatting the numbers, dates and other - * locale specific information. * @param patternSpecification A pattern specifying how u_sprintf will * interpret the variable arguments received and format the data. * @return The number of Unicode code units written to buffer. This * does not include the terminating null character. - * @draft + * @draft 3.0 */ U_CAPI int32_t U_EXPORT2 u_sprintf(UChar *buffer, - const char *locale, const char *patternSpecification, ... ); @@ -556,46 +655,40 @@ u_sprintf(UChar *buffer, * * @param buffer The Unicode String to which to write. * @param count The number of code units to read. - * @param locale The locale to use for formatting the numbers, dates and other - * locale specific information. * @param patternSpecification A pattern specifying how u_sprintf will * interpret the variable arguments received and format the data. * @return The number of Unicode code units written to buffer. This * does not include the terminating null character. - * @draft + * @draft 3.0 */ U_CAPI int32_t U_EXPORT2 u_snprintf(UChar *buffer, int32_t count, - const char *locale, const char *patternSpecification, ... ); /** * Write formatted data to a Unicode string. * This is identical to u_sprintf, except that it will - * not call va_start/TT> and va_end. + * not call va_start and va_end. * * @param buffer The Unicode string to which to write. - * @param locale The locale to use for formatting the numbers, dates and other - * locale specific information. * @param patternSpecification A pattern specifying how u_sprintf will * interpret the variable arguments received and format the data. * @param ap The argument list to use. * @return The number of Unicode characters written to buffer. * @see u_sprintf - * @draft + * @draft 3.0 */ U_CAPI int32_t U_EXPORT2 u_vsprintf(UChar *buffer, - const char *locale, const char *patternSpecification, va_list ap); /** * Write formatted data to a Unicode string. * This is identical to u_snprintf, except that it will - * not call va_start/TT> and va_end.

      + * not call va_start and va_end.

      * When the number of code units required to store the data exceeds * count, then count code units of data are stored in * buffer and a negative value is returned. When the number of code @@ -604,19 +697,16 @@ u_vsprintf(UChar *buffer, * * @param buffer The Unicode string to which to write. * @param count The number of code units to read. - * @param locale The locale to use for formatting the numbers, dates and other - * locale specific information. * @param patternSpecification A pattern specifying how u_sprintf will * interpret the variable arguments received and format the data. * @param ap The argument list to use. * @return The number of Unicode characters written to buffer. * @see u_sprintf - * @draft + * @draft 3.0 */ U_CAPI int32_t U_EXPORT2 u_vsnprintf(UChar *buffer, int32_t count, - const char *locale, const char *patternSpecification, va_list ap); @@ -624,16 +714,13 @@ u_vsnprintf(UChar *buffer, * Write formatted data to a Unicode string. * * @param buffer The Unicode string to which to write. - * @param locale The locale to use for formatting the numbers, dates and other - * locale specific information. * @param patternSpecification A pattern specifying how u_sprintf will * interpret the variable arguments received and format the data. * @return The number of Unicode characters written to buffer. - * @draft + * @draft 3.0 */ U_CAPI int32_t U_EXPORT2 u_sprintf_u(UChar *buffer, - const char *locale, const UChar *patternSpecification, ... ); @@ -647,46 +734,39 @@ u_sprintf_u(UChar *buffer, * * @param buffer The Unicode string to which to write. * @param count The number of code units to read. - * @param locale The locale to use for formatting the numbers, dates and other - * locale specific information. * @param patternSpecification A pattern specifying how u_sprintf will * interpret the variable arguments received and format the data. * @return The number of Unicode characters written to buffer. - * @draft + * @draft 3.0 */ U_CAPI int32_t U_EXPORT2 u_snprintf_u(UChar *buffer, int32_t count, - const char *locale, const UChar *patternSpecification, ... ); /** * Write formatted data to a Unicode string. * This is identical to u_sprintf_u, except that it will - * not call va_start/TT> and va_end. + * not call va_start and va_end. * * @param buffer The Unicode string to which to write. - * @param count The number of code units to read. - * @param locale The locale to use for formatting the numbers, dates and other - * locale specific information. * @param patternSpecification A pattern specifying how u_sprintf will * interpret the variable arguments received and format the data. * @param ap The argument list to use. * @return The number of Unicode characters written to f. * @see u_sprintf_u - * @draft + * @draft 3.0 */ U_CAPI int32_t U_EXPORT2 u_vsprintf_u(UChar *buffer, - const char *locale, const UChar *patternSpecification, va_list ap); /** * Write formatted data to a Unicode string. * This is identical to u_snprintf_u, except that it will - * not call va_start/TT> and va_end. + * not call va_start and va_end. * When the number of code units required to store the data exceeds * count, then count code units of data are stored in * buffer and a negative value is returned. When the number of code @@ -694,19 +774,17 @@ u_vsprintf_u(UChar *buffer, * null terminated and count is returned. * * @param buffer The Unicode string to which to write. - * @param locale The locale to use for formatting the numbers, dates and other - * locale specific information. + * @param count The number of code units to read. * @param patternSpecification A pattern specifying how u_sprintf will * interpret the variable arguments received and format the data. * @param ap The argument list to use. * @return The number of Unicode characters written to f. * @see u_sprintf_u - * @draft + * @draft 3.0 */ U_CAPI int32_t U_EXPORT2 u_vsnprintf_u(UChar *buffer, int32_t count, - const char *locale, const UChar *patternSpecification, va_list ap); @@ -716,39 +794,33 @@ u_vsnprintf_u(UChar *buffer, * Read formatted data from a Unicode string. * * @param buffer The Unicode string from which to read. - * @param locale The locale to use for parsing the numbers, dates and other - * locale specific information. * @param patternSpecification A pattern specifying how u_sscanf will * interpret the variable arguments received and parse the data. * @return The number of items successfully converted and assigned, or EOF * if an error occurred. - * @draft + * @draft 3.0 */ U_CAPI int32_t U_EXPORT2 u_sscanf(const UChar *buffer, - const char *locale, const char *patternSpecification, ... ); /** * Read formatted data from a Unicode string. * This is identical to u_sscanf, except that it will - * not call va_start/TT> and va_end. + * not call va_start and va_end. * * @param buffer The Unicode string from which to read. - * @param locale The locale to use for parsing the numbers, dates and other - * locale specific information. * @param patternSpecification A pattern specifying how u_sscanf will * interpret the variable arguments received and parse the data. * @param ap The argument list to use. * @return The number of items successfully converted and assigned, or EOF * if an error occurred. * @see u_sscanf - * @draft + * @draft 3.0 */ U_CAPI int32_t U_EXPORT2 u_vsscanf(const UChar *buffer, - const char *locale, const char *patternSpecification, va_list ap); @@ -756,44 +828,37 @@ u_vsscanf(const UChar *buffer, * Read formatted data from a Unicode string. * * @param buffer The Unicode string from which to read. - * @param locale The locale to use for parsing the numbers, dates and other - * locale specific information. * @param patternSpecification A pattern specifying how u_sscanf will * interpret the variable arguments received and parse the data. * @return The number of items successfully converted and assigned, or EOF * if an error occurred. - * @draft + * @draft 3.0 */ U_CAPI int32_t U_EXPORT2 u_sscanf_u(const UChar *buffer, - const char *locale, const UChar *patternSpecification, ... ); /** * Read formatted data from a Unicode string. * This is identical to u_sscanf_u, except that it will - * not call va_start/TT> and va_end. + * not call va_start and va_end. * - * @param buffer The UFILE from which to read. - * @param locale The locale to use for parsing the numbers, dates and other - * locale specific information. + * @param buffer The Unicode string from which to read. * @param patternSpecification A pattern specifying how u_sscanf will * interpret the variable arguments received and parse the data. * @param ap The argument list to use. * @return The number of items successfully converted and assigned, or EOF * if an error occurred. * @see u_sscanf_u - * @draft + * @draft 3.0 */ U_CAPI int32_t U_EXPORT2 u_vsscanf_u(const UChar *buffer, - const char *locale, const UChar *patternSpecification, va_list ap); - #endif - +#endif diff --git a/icuSources/extra/ustdio/unicode/ustream.h b/icuSources/io/unicode/ustream.h similarity index 67% rename from icuSources/extra/ustdio/unicode/ustream.h rename to icuSources/io/unicode/ustream.h index 0fff27f6..e620da13 100644 --- a/icuSources/extra/ustdio/unicode/ustream.h +++ b/icuSources/io/unicode/ustream.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2001, International Business Machines +* Copyright (C) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * FILE NAME : ustream.h @@ -17,9 +17,7 @@ #include "unicode/unistr.h" -U_NAMESPACE_USE -// for unistrm.h /** * Write the contents of a UnicodeString to an ostream. This functions writes * the characters in a UnicodeString to an ostream. The UChars in the @@ -28,17 +26,24 @@ U_NAMESPACE_USE */ #if U_IOSTREAM_SOURCE >= 199711 #include -U_USTDIO_API std::ostream &operator<<(std::ostream& stream, const UnicodeString& s); -U_USTDIO_API std::istream &operator>>(std::istream& stream, UnicodeString& s); +U_NAMESPACE_BEGIN +U_IO_API std::ostream & U_EXPORT2 operator<<(std::ostream& stream, const UnicodeString& s); + +U_IO_API std::istream & U_EXPORT2 operator>>(std::istream& stream, UnicodeString& s); +U_NAMESPACE_END + #elif U_IOSTREAM_SOURCE >= 198506 #include -U_USTDIO_API ostream &operator<<(ostream& stream, const UnicodeString& s); -U_USTDIO_API istream &operator>>(istream& stream, UnicodeString& s); +U_NAMESPACE_BEGIN +U_IO_API ostream & U_EXPORT2 operator<<(ostream& stream, const UnicodeString& s); + +U_IO_API istream & U_EXPORT2 operator>>(istream& stream, UnicodeString& s); +U_NAMESPACE_END + #endif -/* TODO: We should add the operator<< and the operator>> for UDate. */ /* No operator for UChar because it can conflict with wchar_t */ #endif diff --git a/icuSources/io/uprintf.c b/icuSources/io/uprintf.c new file mode 100644 index 00000000..d95c02c6 --- /dev/null +++ b/icuSources/io/uprintf.c @@ -0,0 +1,163 @@ +/* +****************************************************************************** +* +* Copyright (C) 1998-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +****************************************************************************** +* +* File uprintf.c +* +* Modification History: +* +* Date Name Description +* 11/19/98 stephen Creation. +* 03/12/99 stephen Modified for new C API. +* Added conversion from default codepage. +* 08/07/2003 george Reunify printf implementations +****************************************************************************** +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/ustdio.h" +#include "unicode/ustring.h" +#include "unicode/unum.h" +#include "unicode/udat.h" +#include "unicode/putil.h" + +#include "uprintf.h" +#include "ufile.h" +#include "locbund.h" + +#include "cmemory.h" + +static int32_t U_EXPORT2 +u_printf_write(void *context, + const UChar *str, + int32_t count) +{ + return u_file_write(str, count, (UFILE *)context); +} + +static int32_t +u_printf_pad_and_justify(void *context, + const u_printf_spec_info *info, + const UChar *result, + int32_t resultLen) +{ + UFILE *output = (UFILE *)context; + int32_t written, i; + + /* pad and justify, if needed */ + if(info->fWidth != -1 && resultLen < info->fWidth) { + /* left justify */ + if(info->fLeft) { + written = u_file_write(result, resultLen, output); + for(i = 0; i < info->fWidth - resultLen; ++i) { + written += u_file_write(&info->fPadChar, 1, output); + } + } + /* right justify */ + else { + written = 0; + for(i = 0; i < info->fWidth - resultLen; ++i) { + written += u_file_write(&info->fPadChar, 1, output); + } + written += u_file_write(result, resultLen, output); + } + } + /* just write the formatted output */ + else { + written = u_file_write(result, resultLen, output); + } + + return written; +} + +U_CAPI int32_t U_EXPORT2 +u_fprintf( UFILE *f, + const char *patternSpecification, + ... ) +{ + va_list ap; + int32_t count; + + va_start(ap, patternSpecification); + count = u_vfprintf(f, patternSpecification, ap); + va_end(ap); + + return count; +} + +U_CAPI int32_t U_EXPORT2 +u_fprintf_u( UFILE *f, + const UChar *patternSpecification, + ... ) +{ + va_list ap; + int32_t count; + + va_start(ap, patternSpecification); + count = u_vfprintf_u(f, patternSpecification, ap); + va_end(ap); + + return count; +} + +U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ +u_vfprintf( UFILE *f, + const char *patternSpecification, + va_list ap) +{ + int32_t count; + UChar *pattern; + UChar buffer[UFMT_DEFAULT_BUFFER_SIZE]; + int32_t size = (int32_t)strlen(patternSpecification) + 1; + + /* convert from the default codepage to Unicode */ + if (size >= MAX_UCHAR_BUFFER_SIZE(buffer)) { + pattern = (UChar *)uprv_malloc(size * sizeof(UChar)); + if(pattern == 0) { + return 0; + } + } + else { + pattern = buffer; + } + u_charsToUChars(patternSpecification, pattern, size); + + /* do the work */ + count = u_vfprintf_u(f, pattern, ap); + + /* clean up */ + if (pattern != buffer) { + uprv_free(pattern); + } + + return count; +} + +static const u_printf_stream_handler g_stream_handler = { + u_printf_write, + u_printf_pad_and_justify +}; + +U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ +u_vfprintf_u( UFILE *f, + const UChar *patternSpecification, + va_list ap) +{ + int32_t written = 0; /* haven't written anything yet */ + + /* parse and print the whole format string */ + u_printf_parse(&g_stream_handler, patternSpecification, f, NULL, &f->str.fBundle, &written, ap); + + /* return # of UChars written */ + return written; +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ + diff --git a/icuSources/io/uprintf.h b/icuSources/io/uprintf.h new file mode 100644 index 00000000..6d38cc37 --- /dev/null +++ b/icuSources/io/uprintf.h @@ -0,0 +1,100 @@ +/* +****************************************************************************** +* +* Copyright (C) 1998-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +****************************************************************************** +* +* File uprintf.h +* +* Modification History: +* +* Date Name Description +* 11/19/98 stephen Creation. +* 03/12/99 stephen Modified for new C API. +****************************************************************************** +*/ + +#ifndef UPRINTF_H +#define UPRINTF_H + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/ustdio.h" +#include "ufmt_cmn.h" +#include "locbund.h" + +/** + * Struct encapsulating a single uprintf format specification. + */ +typedef struct u_printf_spec_info { + int32_t fPrecision; /* Precision */ + int32_t fWidth; /* Width */ + + UChar fSpec; /* Conversion specification */ + UChar fPadChar; /* Padding character */ + + UBool fAlt; /* # flag */ + UBool fSpace; /* Space flag */ + UBool fLeft; /* - flag */ + UBool fShowSign; /* + flag */ + UBool fZero; /* 0 flag */ + + UBool fIsLongDouble; /* L flag */ + UBool fIsShort; /* h flag */ + UBool fIsLong; /* l flag */ + UBool fIsLongLong; /* ll flag */ +} u_printf_spec_info; + +typedef int32_t U_EXPORT2 +u_printf_write_stream(void *context, + const UChar *str, + int32_t count); + +typedef int32_t U_EXPORT2 +u_printf_pad_and_justify_stream(void *context, + const u_printf_spec_info *info, + const UChar *result, + int32_t resultLen); + +typedef struct u_printf_stream_handler { + u_printf_write_stream *write; + u_printf_pad_and_justify_stream *pad_and_justify; +} u_printf_stream_handler; + +/* Used by sprintf */ +typedef struct u_localized_print_string { + UChar *str; /* Place to write the string */ + int32_t available;/* Number of codeunits available to write to */ + int32_t len; /* Maximum number of code units that can be written to output */ + + ULocaleBundle fBundle; /* formatters */ +} u_localized_print_string; + +#define UP_PERCENT 0x0025 + +/** + * Parse a single u_printf format string. + * @param fmt A pointer to a '%' character in a u_printf format specification. + * @param spec A pointer to a u_printf_spec to receive the parsed + * format specifier. + * @param locStringContext If present, will make sure that it will only write + * to the buffer when space is available. It's done this way because + * va_list sometimes can't be passed by pointer. + * @return The number of characters contained in this specifier. + */ +U_CFUNC int32_t +u_printf_parse(const u_printf_stream_handler *streamHandler, + const UChar *fmt, + void *context, + u_localized_print_string *locStringContext, + ULocaleBundle *formatBundle, + int32_t *written, + va_list ap); + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif diff --git a/icuSources/io/uprntf_p.c b/icuSources/io/uprntf_p.c new file mode 100644 index 00000000..a1fb9459 --- /dev/null +++ b/icuSources/io/uprntf_p.c @@ -0,0 +1,1404 @@ +/* +****************************************************************************** +* +* Copyright (C) 1998-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +****************************************************************************** +* +* File uprntf_p.c +* +* Modification History: +* +* Date Name Description +* 11/23/98 stephen Creation. +* 03/12/99 stephen Modified for new C API. +* 08/07/2003 george Reunify printf implementations +****************************************************************************** +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/ustring.h" + +#include "uprintf.h" +#include "ufmt_cmn.h" +#include "cmemory.h" +#include "putilimp.h" + +/* ANSI style formatting */ +/* Use US-ASCII characters only for formatting */ + +/* % */ +#define UFMT_SIMPLE_PERCENT {ufmt_simple_percent, u_printf_simple_percent_handler} +/* s */ +#define UFMT_STRING {ufmt_string, u_printf_string_handler} +/* c */ +#define UFMT_CHAR {ufmt_char, u_printf_char_handler} +/* d, i */ +#define UFMT_INT {ufmt_int, u_printf_integer_handler} +/* u */ +#define UFMT_UINT {ufmt_int, u_printf_uinteger_handler} +/* o */ +#define UFMT_OCTAL {ufmt_int, u_printf_octal_handler} +/* x, X */ +#define UFMT_HEX {ufmt_int, u_printf_hex_handler} +/* f */ +#define UFMT_DOUBLE {ufmt_double, u_printf_double_handler} +/* e, E */ +#define UFMT_SCIENTIFIC {ufmt_double, u_printf_scientific_handler} +/* g, G */ +#define UFMT_SCIDBL {ufmt_double, u_printf_scidbl_handler} +/* n */ +#define UFMT_COUNT {ufmt_count, u_printf_count_handler} + +/* non-ANSI extensions */ +/* Use US-ASCII characters only for formatting */ + +/* p */ +#define UFMT_POINTER {ufmt_pointer, u_printf_pointer_handler} +/* V */ +#define UFMT_SPELLOUT {ufmt_double, u_printf_spellout_handler} +/* P */ +#define UFMT_PERCENT {ufmt_double, u_printf_percent_handler} +/* C K is old format */ +#define UFMT_UCHAR {ufmt_uchar, u_printf_uchar_handler} +/* S U is old format */ +#define UFMT_USTRING {ufmt_ustring, u_printf_ustring_handler} + + +#define UFMT_EMPTY {ufmt_empty, NULL} + +/** + * A u_printf handler function. + * A u_printf handler is responsible for handling a single u_printf + * format specification, for example 'd' or 's'. + * @param stream The UFILE to which to write output. + * @param info A pointer to a u_printf_spec_info struct containing + * information on the format specification. + * @param args A pointer to the argument data + * @return The number of Unicode characters written to stream. + */ +typedef int32_t U_EXPORT2 +u_printf_handler(const u_printf_stream_handler *handler, + + void *context, + ULocaleBundle *formatBundle, + const u_printf_spec_info *info, + const ufmt_args *args); + +typedef struct u_printf_info { + ufmt_type_info info; + u_printf_handler *handler; +} u_printf_info; + +/** + * Struct encapsulating a single uprintf format specification. + */ +typedef struct u_printf_spec { + u_printf_spec_info fInfo; /* Information on this spec */ + int32_t fWidthPos; /* Position of width in arg list */ + int32_t fPrecisionPos; /* Position of precision in arg list */ + int32_t fArgPos; /* Position of data in arg list */ +} u_printf_spec; + +#define UPRINTF_NUM_FMT_HANDLERS 108 + +/* We do not use handlers for 0-0x1f */ +#define UPRINTF_BASE_FMT_HANDLERS 0x20 + +/* buffer size for formatting */ +#define UPRINTF_BUFFER_SIZE 1024 +#define UPRINTF_SYMBOL_BUFFER_SIZE 8 + +static const UChar gNullStr[] = {0x28, 0x6E, 0x75, 0x6C, 0x6C, 0x29, 0}; /* "(null)" */ +static const UChar gSpaceStr[] = {0x20, 0}; /* " " */ + +/* Sets the sign of a format based on u_printf_spec_info */ +/* TODO: Is setting the prefix symbol to a positive sign a good idea in all locales? */ +static void +u_printf_set_sign(UNumberFormat *format, + const u_printf_spec_info *info, + UChar *prefixBuffer, + int32_t *prefixBufLen, + UErrorCode *status) +{ + if(info->fShowSign) { + *prefixBufLen = unum_getTextAttribute(format, + UNUM_POSITIVE_PREFIX, + prefixBuffer, + *prefixBufLen, + status); + if (info->fSpace) { + /* Setting UNUM_PLUS_SIGN_SYMBOL affects the exponent too. */ + /* unum_setSymbol(format, UNUM_PLUS_SIGN_SYMBOL, gSpaceStr, 1, &status); */ + unum_setTextAttribute(format, UNUM_POSITIVE_PREFIX, gSpaceStr, 1, status); + } + else { + UChar plusSymbol[UPRINTF_SYMBOL_BUFFER_SIZE]; + int32_t symbolLen; + + symbolLen = unum_getSymbol(format, + UNUM_PLUS_SIGN_SYMBOL, + plusSymbol, + sizeof(plusSymbol)/sizeof(*plusSymbol), + status); + unum_setTextAttribute(format, + UNUM_POSITIVE_PREFIX, + plusSymbol, + symbolLen, + status); + } + } + else { + *prefixBufLen = 0; + } +} + +static void +u_printf_reset_sign(UNumberFormat *format, + const u_printf_spec_info *info, + UChar *prefixBuffer, + int32_t *prefixBufLen, + UErrorCode *status) +{ + if(info->fShowSign) { + unum_setTextAttribute(format, + UNUM_POSITIVE_PREFIX, + prefixBuffer, + *prefixBufLen, + status); + } +} + + +/* handle a '%' */ +static int32_t +u_printf_simple_percent_handler(const u_printf_stream_handler *handler, + void *context, + ULocaleBundle *formatBundle, + const u_printf_spec_info *info, + const ufmt_args *args) +{ + static const UChar PERCENT[] = { UP_PERCENT }; + + /* put a single '%' onto the output */ + return handler->write(context, PERCENT, 1); +} + +/* handle 's' */ +static int32_t +u_printf_string_handler(const u_printf_stream_handler *handler, + void *context, + ULocaleBundle *formatBundle, + const u_printf_spec_info *info, + const ufmt_args *args) +{ + UChar *s; + UChar buffer[UFMT_DEFAULT_BUFFER_SIZE]; + int32_t len, written; + int32_t argSize; + const char *arg = (const char*)(args[0].ptrValue); + + /* convert from the default codepage to Unicode */ + if (arg) { + argSize = (int32_t)strlen(arg) + 1; + if (argSize >= MAX_UCHAR_BUFFER_SIZE(buffer)) { + s = ufmt_defaultCPToUnicode(arg, argSize, + (UChar *)uprv_malloc(MAX_UCHAR_BUFFER_NEEDED(argSize)), + MAX_UCHAR_BUFFER_NEEDED(argSize)); + if(s == NULL) { + return 0; + } + } + else { + s = ufmt_defaultCPToUnicode(arg, argSize, buffer, + sizeof(buffer)/sizeof(UChar)); + } + } + else { + s = (UChar *)gNullStr; + } + len = u_strlen(s); + + /* width = minimum # of characters to write */ + /* precision = maximum # of characters to write */ + + /* precision takes precedence over width */ + /* determine if the string should be truncated */ + if(info->fPrecision != -1 && len > info->fPrecision) { + written = handler->write(context, s, info->fPrecision); + } + /* determine if the string should be padded */ + else { + written = handler->pad_and_justify(context, info, s, len); + } + + /* clean up */ + if (gNullStr != s && buffer != s) { + uprv_free(s); + } + + return written; +} + +static int32_t +u_printf_char_handler(const u_printf_stream_handler *handler, + void *context, + ULocaleBundle *formatBundle, + const u_printf_spec_info *info, + const ufmt_args *args) +{ + UChar s[UTF_MAX_CHAR_LENGTH+1]; + int32_t len = 1, written; + unsigned char arg = (unsigned char)(args[0].int64Value); + + /* convert from default codepage to Unicode */ + ufmt_defaultCPToUnicode((const char *)&arg, 2, s, sizeof(s)/sizeof(UChar)); + + /* Remember that this may be an MBCS character */ + if (arg != 0) { + len = u_strlen(s); + } + + /* width = minimum # of characters to write */ + /* precision = maximum # of characters to write */ + + /* precision takes precedence over width */ + /* determine if the string should be truncated */ + if(info->fPrecision != -1 && len > info->fPrecision) { + written = handler->write(context, s, info->fPrecision); + } + else { + /* determine if the string should be padded */ + written = handler->pad_and_justify(context, info, s, len); + } + + return written; +} + +static int32_t +u_printf_double_handler(const u_printf_stream_handler *handler, + void *context, + ULocaleBundle *formatBundle, + const u_printf_spec_info *info, + const ufmt_args *args) +{ + double num = (double) (args[0].doubleValue); + UNumberFormat *format; + UChar result[UPRINTF_BUFFER_SIZE]; + UChar prefixBuffer[UPRINTF_BUFFER_SIZE]; + int32_t prefixBufferLen = sizeof(prefixBuffer); + int32_t minDecimalDigits; + int32_t maxDecimalDigits; + int32_t resultLen; + UErrorCode status = U_ZERO_ERROR; + + prefixBuffer[0] = 0; + + /* mask off any necessary bits */ + /* if(! info->fIsLongDouble) + num &= DBL_MAX;*/ + + /* get the formatter */ + format = u_locbund_getNumberFormat(formatBundle, UNUM_DECIMAL); + + /* handle error */ + if(format == 0) + return 0; + + /* save the formatter's state */ + minDecimalDigits = unum_getAttribute(format, UNUM_MIN_FRACTION_DIGITS); + maxDecimalDigits = unum_getAttribute(format, UNUM_MAX_FRACTION_DIGITS); + + /* set the appropriate flags and number of decimal digits on the formatter */ + if(info->fPrecision != -1) { + /* set the # of decimal digits */ + unum_setAttribute(format, UNUM_FRACTION_DIGITS, info->fPrecision); + } + else if(info->fAlt) { + /* '#' means always show decimal point */ + /* copy of printf behavior on Solaris - '#' shows 6 digits */ + unum_setAttribute(format, UNUM_FRACTION_DIGITS, 6); + } + else { + /* # of decimal digits is 6 if precision not specified regardless of locale */ + unum_setAttribute(format, UNUM_FRACTION_DIGITS, 6); + } + + /* set whether to show the sign */ + if (info->fShowSign) { + u_printf_set_sign(format, info, prefixBuffer, &prefixBufferLen, &status); + } + + /* format the number */ + resultLen = unum_formatDouble(format, num, result, UPRINTF_BUFFER_SIZE, 0, &status); + + if (U_FAILURE(status)) { + resultLen = 0; + } + + /* restore the number format */ + /* TODO: Is this needed? */ + unum_setAttribute(format, UNUM_MIN_FRACTION_DIGITS, minDecimalDigits); + unum_setAttribute(format, UNUM_MAX_FRACTION_DIGITS, maxDecimalDigits); + + if (info->fShowSign) { + /* Reset back to original value regardless of what the error was */ + UErrorCode localStatus = U_ZERO_ERROR; + u_printf_reset_sign(format, info, prefixBuffer, &prefixBufferLen, &localStatus); + } + + return handler->pad_and_justify(context, info, result, resultLen); +} + +/* HSYS */ +static int32_t +u_printf_integer_handler(const u_printf_stream_handler *handler, + void *context, + ULocaleBundle *formatBundle, + const u_printf_spec_info *info, + const ufmt_args *args) +{ + int64_t num = args[0].int64Value; + UNumberFormat *format; + UChar result[UPRINTF_BUFFER_SIZE]; + UChar prefixBuffer[UPRINTF_BUFFER_SIZE]; + int32_t prefixBufferLen = sizeof(prefixBuffer); + int32_t minDigits = -1; + int32_t resultLen; + UErrorCode status = U_ZERO_ERROR; + + prefixBuffer[0] = 0; + + /* mask off any necessary bits */ + if (info->fIsShort) + num = (int16_t)num; + else if (!info->fIsLongLong) + num = (int32_t)num; + + /* get the formatter */ + format = u_locbund_getNumberFormat(formatBundle, UNUM_DECIMAL); + + /* handle error */ + if(format == 0) + return 0; + + /* set the appropriate flags on the formatter */ + + /* set the minimum integer digits */ + if(info->fPrecision != -1) { + /* set the minimum # of digits */ + minDigits = unum_getAttribute(format, UNUM_MIN_INTEGER_DIGITS); + unum_setAttribute(format, UNUM_MIN_INTEGER_DIGITS, info->fPrecision); + } + + /* set whether to show the sign */ + if(info->fShowSign) { + u_printf_set_sign(format, info, prefixBuffer, &prefixBufferLen, &status); + } + + /* format the number */ + resultLen = unum_formatInt64(format, num, result, UPRINTF_BUFFER_SIZE, 0, &status); + + if (U_FAILURE(status)) { + resultLen = 0; + } + + /* restore the number format */ + if (minDigits != -1) { + unum_setAttribute(format, UNUM_MIN_INTEGER_DIGITS, minDigits); + } + + if (info->fShowSign) { + /* Reset back to original value regardless of what the error was */ + UErrorCode localStatus = U_ZERO_ERROR; + u_printf_reset_sign(format, info, prefixBuffer, &prefixBufferLen, &localStatus); + } + + return handler->pad_and_justify(context, info, result, resultLen); +} + +static int32_t +u_printf_hex_handler(const u_printf_stream_handler *handler, + void *context, + ULocaleBundle *formatBundle, + const u_printf_spec_info *info, + const ufmt_args *args) +{ + int64_t num = args[0].int64Value; + UChar result[UPRINTF_BUFFER_SIZE]; + int32_t len = UPRINTF_BUFFER_SIZE; + + + /* mask off any necessary bits */ + if (info->fIsShort) + num &= UINT16_MAX; + else if (!info->fIsLongLong) + num &= UINT32_MAX; + + /* format the number, preserving the minimum # of digits */ + ufmt_64tou(result, &len, num, 16, + (UBool)(info->fSpec == 0x0078), + (info->fPrecision == -1 && info->fZero) ? info->fWidth : info->fPrecision); + + /* convert to alt form, if desired */ + if(num != 0 && info->fAlt && len < UPRINTF_BUFFER_SIZE - 2) { + /* shift the formatted string right by 2 chars */ + memmove(result + 2, result, len * sizeof(UChar)); + result[0] = 0x0030; + result[1] = info->fSpec; + len += 2; + } + + return handler->pad_and_justify(context, info, result, len); +} + +static int32_t +u_printf_octal_handler(const u_printf_stream_handler *handler, + void *context, + ULocaleBundle *formatBundle, + const u_printf_spec_info *info, + const ufmt_args *args) +{ + int64_t num = args[0].int64Value; + UChar result[UPRINTF_BUFFER_SIZE]; + int32_t len = UPRINTF_BUFFER_SIZE; + + + /* mask off any necessary bits */ + if (info->fIsShort) + num &= UINT16_MAX; + else if (!info->fIsLongLong) + num &= UINT32_MAX; + + /* format the number, preserving the minimum # of digits */ + ufmt_64tou(result, &len, num, 8, + FALSE, /* doesn't matter for octal */ + info->fPrecision == -1 && info->fZero ? info->fWidth : info->fPrecision); + + /* convert to alt form, if desired */ + if(info->fAlt && result[0] != 0x0030 && len < UPRINTF_BUFFER_SIZE - 1) { + /* shift the formatted string right by 1 char */ + memmove(result + 1, result, len * sizeof(UChar)); + result[0] = 0x0030; + len += 1; + } + + return handler->pad_and_justify(context, info, result, len); +} + +static int32_t +u_printf_uinteger_handler(const u_printf_stream_handler *handler, + void *context, + ULocaleBundle *formatBundle, + const u_printf_spec_info *info, + const ufmt_args *args) +{ + int64_t num = args[0].int64Value; + UNumberFormat *format; + UChar result[UPRINTF_BUFFER_SIZE]; + int32_t minDigits = -1; + int32_t resultLen; + UErrorCode status = U_ZERO_ERROR; + + /* TODO: Fix this once uint64_t can be formatted. */ + if (info->fIsShort) + num &= UINT16_MAX; + else if (!info->fIsLongLong) + num &= UINT32_MAX; + + /* get the formatter */ + format = u_locbund_getNumberFormat(formatBundle, UNUM_DECIMAL); + + /* handle error */ + if(format == 0) + return 0; + + /* set the appropriate flags on the formatter */ + + /* set the minimum integer digits */ + if(info->fPrecision != -1) { + /* set the minimum # of digits */ + minDigits = unum_getAttribute(format, UNUM_MIN_INTEGER_DIGITS); + unum_setAttribute(format, UNUM_MIN_INTEGER_DIGITS, info->fPrecision); + } + + /* To mirror other stdio implementations, we ignore the sign argument */ + + /* format the number */ + resultLen = unum_formatInt64(format, num, result, UPRINTF_BUFFER_SIZE, 0, &status); + + if (U_FAILURE(status)) { + resultLen = 0; + } + + /* restore the number format */ + if (minDigits != -1) { + unum_setAttribute(format, UNUM_MIN_INTEGER_DIGITS, minDigits); + } + + return handler->pad_and_justify(context, info, result, resultLen); +} + +static int32_t +u_printf_pointer_handler(const u_printf_stream_handler *handler, + void *context, + ULocaleBundle *formatBundle, + const u_printf_spec_info *info, + const ufmt_args *args) +{ + UChar result[UPRINTF_BUFFER_SIZE]; + int32_t len = UPRINTF_BUFFER_SIZE; + + /* format the pointer in hex */ + ufmt_ptou(result, &len, args[0].ptrValue, TRUE/*, info->fPrecision*/); + + return handler->pad_and_justify(context, info, result, len); +} + +static int32_t +u_printf_scientific_handler(const u_printf_stream_handler *handler, + void *context, + ULocaleBundle *formatBundle, + const u_printf_spec_info *info, + const ufmt_args *args) +{ + double num = (double) (args[0].doubleValue); + UNumberFormat *format; + UChar result[UPRINTF_BUFFER_SIZE]; + UChar prefixBuffer[UPRINTF_BUFFER_SIZE]; + int32_t prefixBufferLen = sizeof(prefixBuffer); + int32_t minDecimalDigits; + int32_t maxDecimalDigits; + UErrorCode status = U_ZERO_ERROR; + UChar srcExpBuf[UPRINTF_SYMBOL_BUFFER_SIZE]; + int32_t srcLen, expLen; + int32_t resultLen; + UChar expBuf[UPRINTF_SYMBOL_BUFFER_SIZE]; + + prefixBuffer[0] = 0; + + /* mask off any necessary bits */ + /* if(! info->fIsLongDouble) + num &= DBL_MAX;*/ + + /* get the formatter */ + format = u_locbund_getNumberFormat(formatBundle, UNUM_SCIENTIFIC); + + /* handle error */ + if(format == 0) + return 0; + + /* set the appropriate flags on the formatter */ + + srcLen = unum_getSymbol(format, + UNUM_EXPONENTIAL_SYMBOL, + srcExpBuf, + sizeof(srcExpBuf), + &status); + + /* Upper/lower case the e */ + if (info->fSpec == (UChar)0x65 /* e */) { + expLen = u_strToLower(expBuf, (int32_t)sizeof(expBuf), + srcExpBuf, srcLen, + formatBundle->fLocale, + &status); + } + else { + expLen = u_strToUpper(expBuf, (int32_t)sizeof(expBuf), + srcExpBuf, srcLen, + formatBundle->fLocale, + &status); + } + + unum_setSymbol(format, + UNUM_EXPONENTIAL_SYMBOL, + expBuf, + expLen, + &status); + + /* save the formatter's state */ + minDecimalDigits = unum_getAttribute(format, UNUM_MIN_FRACTION_DIGITS); + maxDecimalDigits = unum_getAttribute(format, UNUM_MAX_FRACTION_DIGITS); + + /* set the appropriate flags and number of decimal digits on the formatter */ + if(info->fPrecision != -1) { + /* set the # of decimal digits */ + unum_setAttribute(format, UNUM_FRACTION_DIGITS, info->fPrecision); + } + else if(info->fAlt) { + /* '#' means always show decimal point */ + /* copy of printf behavior on Solaris - '#' shows 6 digits */ + unum_setAttribute(format, UNUM_FRACTION_DIGITS, 6); + } + else { + /* # of decimal digits is 6 if precision not specified */ + unum_setAttribute(format, UNUM_FRACTION_DIGITS, 6); + } + + /* set whether to show the sign */ + if (info->fShowSign) { + u_printf_set_sign(format, info, prefixBuffer, &prefixBufferLen, &status); + } + + /* format the number */ + resultLen = unum_formatDouble(format, num, result, UPRINTF_BUFFER_SIZE, 0, &status); + + if (U_FAILURE(status)) { + resultLen = 0; + } + + /* restore the number format */ + /* TODO: Is this needed? */ + unum_setAttribute(format, UNUM_MIN_FRACTION_DIGITS, minDecimalDigits); + unum_setAttribute(format, UNUM_MAX_FRACTION_DIGITS, maxDecimalDigits); + + /* Since we're the only one using the scientific + format, we don't need to save the old exponent value. */ + /*unum_setSymbol(format, + UNUM_EXPONENTIAL_SYMBOL, + srcExpBuf, + srcLen, + &status);*/ + + if (info->fShowSign) { + /* Reset back to original value regardless of what the error was */ + UErrorCode localStatus = U_ZERO_ERROR; + u_printf_reset_sign(format, info, prefixBuffer, &prefixBufferLen, &localStatus); + } + + return handler->pad_and_justify(context, info, result, resultLen); +} + +static int32_t +u_printf_percent_handler(const u_printf_stream_handler *handler, + void *context, + ULocaleBundle *formatBundle, + const u_printf_spec_info *info, + const ufmt_args *args) +{ + double num = (double) (args[0].doubleValue); + UNumberFormat *format; + UChar result[UPRINTF_BUFFER_SIZE]; + UChar prefixBuffer[UPRINTF_BUFFER_SIZE]; + int32_t prefixBufferLen = sizeof(prefixBuffer); + int32_t minDecimalDigits; + int32_t maxDecimalDigits; + int32_t resultLen; + UErrorCode status = U_ZERO_ERROR; + + prefixBuffer[0] = 0; + + /* mask off any necessary bits */ + /* if(! info->fIsLongDouble) + num &= DBL_MAX;*/ + + /* get the formatter */ + format = u_locbund_getNumberFormat(formatBundle, UNUM_PERCENT); + + /* handle error */ + if(format == 0) + return 0; + + /* save the formatter's state */ + minDecimalDigits = unum_getAttribute(format, UNUM_MIN_FRACTION_DIGITS); + maxDecimalDigits = unum_getAttribute(format, UNUM_MAX_FRACTION_DIGITS); + + /* set the appropriate flags and number of decimal digits on the formatter */ + if(info->fPrecision != -1) { + /* set the # of decimal digits */ + unum_setAttribute(format, UNUM_FRACTION_DIGITS, info->fPrecision); + } + else if(info->fAlt) { + /* '#' means always show decimal point */ + /* copy of printf behavior on Solaris - '#' shows 6 digits */ + unum_setAttribute(format, UNUM_FRACTION_DIGITS, 6); + } + else { + /* # of decimal digits is 6 if precision not specified */ + unum_setAttribute(format, UNUM_FRACTION_DIGITS, 6); + } + + /* set whether to show the sign */ + if (info->fShowSign) { + u_printf_set_sign(format, info, prefixBuffer, &prefixBufferLen, &status); + } + + /* format the number */ + resultLen = unum_formatDouble(format, num, result, UPRINTF_BUFFER_SIZE, 0, &status); + + if (U_FAILURE(status)) { + resultLen = 0; + } + + /* restore the number format */ + /* TODO: Is this needed? */ + unum_setAttribute(format, UNUM_MIN_FRACTION_DIGITS, minDecimalDigits); + unum_setAttribute(format, UNUM_MAX_FRACTION_DIGITS, maxDecimalDigits); + + if (info->fShowSign) { + /* Reset back to original value regardless of what the error was */ + UErrorCode localStatus = U_ZERO_ERROR; + u_printf_reset_sign(format, info, prefixBuffer, &prefixBufferLen, &localStatus); + } + + return handler->pad_and_justify(context, info, result, resultLen); +} + +static int32_t +u_printf_ustring_handler(const u_printf_stream_handler *handler, + void *context, + ULocaleBundle *formatBundle, + const u_printf_spec_info *info, + const ufmt_args *args) +{ + int32_t len, written; + const UChar *arg = (const UChar*)(args[0].ptrValue); + + /* allocate enough space for the buffer */ + if (arg == NULL) { + arg = gNullStr; + } + len = u_strlen(arg); + + /* width = minimum # of characters to write */ + /* precision = maximum # of characters to write */ + + /* precision takes precedence over width */ + /* determine if the string should be truncated */ + if(info->fPrecision != -1 && len > info->fPrecision) { + written = handler->write(context, arg, info->fPrecision); + } + else { + /* determine if the string should be padded */ + written = handler->pad_and_justify(context, info, arg, len); + } + + return written; +} + +static int32_t +u_printf_uchar_handler(const u_printf_stream_handler *handler, + void *context, + ULocaleBundle *formatBundle, + const u_printf_spec_info *info, + const ufmt_args *args) +{ + int32_t written = 0; + UChar arg = (UChar)(args[0].int64Value); + + + /* width = minimum # of characters to write */ + /* precision = maximum # of characters to write */ + + /* precision takes precedence over width */ + /* determine if the char should be printed */ + if(info->fPrecision != -1 && info->fPrecision < 1) { + /* write nothing */ + written = 0; + } + else { + /* determine if the string should be padded */ + written = handler->pad_and_justify(context, info, &arg, 1); + } + + return written; +} + +static int32_t +u_printf_scidbl_handler(const u_printf_stream_handler *handler, + void *context, + ULocaleBundle *formatBundle, + const u_printf_spec_info *info, + const ufmt_args *args) +{ + u_printf_spec_info scidbl_info; + double num = args[0].doubleValue; + int32_t retVal; + + memcpy(&scidbl_info, info, sizeof(u_printf_spec_info)); + + /* determine whether to use 'd', 'e' or 'f' notation */ + if (scidbl_info.fPrecision == -1 && num == uprv_trunc(num)) + { + /* use 'f' notation */ + scidbl_info.fSpec = 0x0066; + scidbl_info.fPrecision = 0; + /* call the double handler */ + retVal = u_printf_double_handler(handler, context, formatBundle, &scidbl_info, args); + } + else if(num < 0.0001 || (scidbl_info.fPrecision < 1 && 1000000.0 <= num) + || (scidbl_info.fPrecision != -1 && num > uprv_pow10(scidbl_info.fPrecision))) + { + /* use 'e' or 'E' notation */ + scidbl_info.fSpec = scidbl_info.fSpec - 2; + if (scidbl_info.fPrecision == -1) { + scidbl_info.fPrecision = 5; + } + /* call the scientific handler */ + retVal = u_printf_scientific_handler(handler, context, formatBundle, &scidbl_info, args); + } + else { + UNumberFormat *format = u_locbund_getNumberFormat(formatBundle, UNUM_DECIMAL); + int32_t maxSigDecimalDigits = unum_getAttribute(format, UNUM_MAX_SIGNIFICANT_DIGITS); + int32_t significantDigits = scidbl_info.fPrecision; + + /* use 'f' notation */ + scidbl_info.fSpec = 0x0066; + if (significantDigits == -1) { + significantDigits = 6; + } + unum_setAttribute(format, UNUM_SIGNIFICANT_DIGITS_USED, TRUE); + unum_setAttribute(format, UNUM_MAX_SIGNIFICANT_DIGITS, significantDigits); + /* call the double handler */ + retVal = u_printf_double_handler(handler, context, formatBundle, &scidbl_info, args); + unum_setAttribute(format, UNUM_MAX_SIGNIFICANT_DIGITS, maxSigDecimalDigits); + unum_setAttribute(format, UNUM_SIGNIFICANT_DIGITS_USED, FALSE); + } + return retVal; +} + +static int32_t +u_printf_count_handler(const u_printf_stream_handler *handler, + void *context, + ULocaleBundle *formatBundle, + const u_printf_spec_info *info, + const ufmt_args *args) +{ + int32_t *count = (int32_t*)(args[0].ptrValue); + + /* in the special case of count, the u_printf_spec_info's width */ + /* will contain the # of chars written thus far */ + *count = info->fWidth; + + return 0; +} + +static int32_t +u_printf_spellout_handler(const u_printf_stream_handler *handler, + void *context, + ULocaleBundle *formatBundle, + const u_printf_spec_info *info, + const ufmt_args *args) +{ + double num = (double) (args[0].doubleValue); + UNumberFormat *format; + UChar result[UPRINTF_BUFFER_SIZE]; + UChar prefixBuffer[UPRINTF_BUFFER_SIZE]; + int32_t prefixBufferLen = sizeof(prefixBuffer); + int32_t minDecimalDigits; + int32_t maxDecimalDigits; + int32_t resultLen; + UErrorCode status = U_ZERO_ERROR; + + prefixBuffer[0] = 0; + + /* mask off any necessary bits */ + /* if(! info->fIsLongDouble) + num &= DBL_MAX;*/ + + /* get the formatter */ + format = u_locbund_getNumberFormat(formatBundle, UNUM_SPELLOUT); + + /* handle error */ + if(format == 0) + return 0; + + /* save the formatter's state */ + minDecimalDigits = unum_getAttribute(format, UNUM_MIN_FRACTION_DIGITS); + maxDecimalDigits = unum_getAttribute(format, UNUM_MAX_FRACTION_DIGITS); + + /* set the appropriate flags and number of decimal digits on the formatter */ + if(info->fPrecision != -1) { + /* set the # of decimal digits */ + unum_setAttribute(format, UNUM_FRACTION_DIGITS, info->fPrecision); + } + else if(info->fAlt) { + /* '#' means always show decimal point */ + /* copy of printf behavior on Solaris - '#' shows 6 digits */ + unum_setAttribute(format, UNUM_FRACTION_DIGITS, 6); + } + else { + /* # of decimal digits is 6 if precision not specified */ + unum_setAttribute(format, UNUM_FRACTION_DIGITS, 6); + } + + /* set whether to show the sign */ + if (info->fShowSign) { + u_printf_set_sign(format, info, prefixBuffer, &prefixBufferLen, &status); + } + + /* format the number */ + resultLen = unum_formatDouble(format, num, result, UPRINTF_BUFFER_SIZE, 0, &status); + + if (U_FAILURE(status)) { + resultLen = 0; + } + + /* restore the number format */ + /* TODO: Is this needed? */ + unum_setAttribute(format, UNUM_MIN_FRACTION_DIGITS, minDecimalDigits); + unum_setAttribute(format, UNUM_MAX_FRACTION_DIGITS, maxDecimalDigits); + + if (info->fShowSign) { + /* Reset back to original value regardless of what the error was */ + UErrorCode localStatus = U_ZERO_ERROR; + u_printf_reset_sign(format, info, prefixBuffer, &prefixBufferLen, &localStatus); + } + + return handler->pad_and_justify(context, info, result, resultLen); +} + +/* Use US-ASCII characters only for formatting. Most codepages have + characters 20-7F from Unicode. Using any other codepage specific + characters will make it very difficult to format the string on + non-Unicode machines */ +static const u_printf_info g_u_printf_infos[UPRINTF_NUM_FMT_HANDLERS] = { +/* 0x20 */ + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, + UFMT_EMPTY, UFMT_SIMPLE_PERCENT,UFMT_EMPTY, UFMT_EMPTY, + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, + +/* 0x30 */ + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, + +/* 0x40 */ + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_UCHAR, + UFMT_EMPTY, UFMT_SCIENTIFIC, UFMT_EMPTY, UFMT_SCIDBL, +#ifdef U_USE_OBSOLETE_IO_FORMATTING + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_UCHAR/*deprecated*/, +#else + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, +#endif + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, + +/* 0x50 */ + UFMT_PERCENT, UFMT_EMPTY, UFMT_EMPTY, UFMT_USTRING, +#ifdef U_USE_OBSOLETE_IO_FORMATTING + UFMT_EMPTY, UFMT_USTRING/*deprecated*/,UFMT_SPELLOUT, UFMT_EMPTY, +#else + UFMT_EMPTY, UFMT_EMPTY, UFMT_SPELLOUT, UFMT_EMPTY, +#endif + UFMT_HEX, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, + +/* 0x60 */ + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_CHAR, + UFMT_INT, UFMT_SCIENTIFIC, UFMT_DOUBLE, UFMT_SCIDBL, + UFMT_EMPTY, UFMT_INT, UFMT_EMPTY, UFMT_EMPTY, + UFMT_EMPTY, UFMT_EMPTY, UFMT_COUNT, UFMT_OCTAL, + +/* 0x70 */ + UFMT_POINTER, UFMT_EMPTY, UFMT_EMPTY, UFMT_STRING, + UFMT_EMPTY, UFMT_UINT, UFMT_EMPTY, UFMT_EMPTY, + UFMT_HEX, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, +}; + +/* flag characters for uprintf */ +#define FLAG_MINUS 0x002D +#define FLAG_PLUS 0x002B +#define FLAG_SPACE 0x0020 +#define FLAG_POUND 0x0023 +#define FLAG_ZERO 0x0030 +#define FLAG_PAREN 0x0028 + +#define ISFLAG(s) (s) == FLAG_MINUS || \ + (s) == FLAG_PLUS || \ + (s) == FLAG_SPACE || \ + (s) == FLAG_POUND || \ + (s) == FLAG_ZERO || \ + (s) == FLAG_PAREN + +/* special characters for uprintf */ +#define SPEC_ASTERISK 0x002A +#define SPEC_DOLLARSIGN 0x0024 +#define SPEC_PERIOD 0x002E +#define SPEC_PERCENT 0x0025 + +/* unicode digits */ +#define DIGIT_ZERO 0x0030 +#define DIGIT_ONE 0x0031 +#define DIGIT_TWO 0x0032 +#define DIGIT_THREE 0x0033 +#define DIGIT_FOUR 0x0034 +#define DIGIT_FIVE 0x0035 +#define DIGIT_SIX 0x0036 +#define DIGIT_SEVEN 0x0037 +#define DIGIT_EIGHT 0x0038 +#define DIGIT_NINE 0x0039 + +#define ISDIGIT(s) (s) == DIGIT_ZERO || \ + (s) == DIGIT_ONE || \ + (s) == DIGIT_TWO || \ + (s) == DIGIT_THREE || \ + (s) == DIGIT_FOUR || \ + (s) == DIGIT_FIVE || \ + (s) == DIGIT_SIX || \ + (s) == DIGIT_SEVEN || \ + (s) == DIGIT_EIGHT || \ + (s) == DIGIT_NINE + +/* u_printf modifiers */ +#define MOD_H 0x0068 +#define MOD_LOWERL 0x006C +#define MOD_L 0x004C + +#define ISMOD(s) (s) == MOD_H || \ + (s) == MOD_LOWERL || \ + (s) == MOD_L + +/* We parse the argument list in Unicode */ +U_CFUNC int32_t +u_printf_parse(const u_printf_stream_handler *streamHandler, + const UChar *fmt, + void *context, + u_localized_print_string *locStringContext, + ULocaleBundle *formatBundle, + int32_t *written, + va_list ap) +{ + uint16_t handlerNum; + ufmt_args args; + ufmt_type_info argType; + u_printf_handler *handler; + u_printf_spec spec; + u_printf_spec_info *info = &(spec.fInfo); + + const UChar *alias = fmt; + const UChar *backup; + const UChar *lastAlias; + + /* iterate through the pattern */ + while(!locStringContext || locStringContext->available > 0) { + + /* find the next '%' */ + lastAlias = alias; + while(*alias != UP_PERCENT && *alias != 0x0000) { + alias++; + } + + /* write any characters before the '%' */ + if(alias > lastAlias) { + *written += (streamHandler->write)(context, lastAlias, (int32_t)(alias - lastAlias)); + } + + /* break if at end of string */ + if(*alias == 0x0000) { + break; + } + + /* initialize spec to default values */ + spec.fWidthPos = -1; + spec.fPrecisionPos = -1; + spec.fArgPos = -1; + + info->fPrecision = -1; + info->fWidth = -1; + info->fSpec = 0x0000; + info->fPadChar = 0x0020; + info->fAlt = FALSE; + info->fSpace = FALSE; + info->fLeft = FALSE; + info->fShowSign = FALSE; + info->fZero = FALSE; + info->fIsLongDouble = FALSE; + info->fIsShort = FALSE; + info->fIsLong = FALSE; + info->fIsLongLong = FALSE; + + /* skip over the initial '%' */ + alias++; + + /* Check for positional argument */ + if(ISDIGIT(*alias)) { + + /* Save the current position */ + backup = alias; + + /* handle positional parameters */ + if(ISDIGIT(*alias)) { + spec.fArgPos = (int) (*alias++ - DIGIT_ZERO); + + while(ISDIGIT(*alias)) { + spec.fArgPos *= 10; + spec.fArgPos += (int) (*alias++ - DIGIT_ZERO); + } + } + + /* if there is no '$', don't read anything */ + if(*alias != SPEC_DOLLARSIGN) { + spec.fArgPos = -1; + alias = backup; + } + /* munge the '$' */ + else + alias++; + } + + /* Get any format flags */ + while(ISFLAG(*alias)) { + switch(*alias++) { + + /* left justify */ + case FLAG_MINUS: + info->fLeft = TRUE; + break; + + /* always show sign */ + case FLAG_PLUS: + info->fShowSign = TRUE; + break; + + /* use space if no sign present */ + case FLAG_SPACE: + info->fShowSign = TRUE; + info->fSpace = TRUE; + break; + + /* use alternate form */ + case FLAG_POUND: + info->fAlt = TRUE; + break; + + /* pad with leading zeroes */ + case FLAG_ZERO: + info->fZero = TRUE; + info->fPadChar = 0x0030; + break; + + /* pad character specified */ + case FLAG_PAREN: + + /* TODO test that all four are numbers */ + /* first four characters are hex values for pad char */ + info->fPadChar = (UChar)ufmt_digitvalue(*alias++); + info->fPadChar = (UChar)((info->fPadChar * 16) + ufmt_digitvalue(*alias++)); + info->fPadChar = (UChar)((info->fPadChar * 16) + ufmt_digitvalue(*alias++)); + info->fPadChar = (UChar)((info->fPadChar * 16) + ufmt_digitvalue(*alias++)); + + /* final character is ignored */ + alias++; + + break; + } + } + + /* Get the width */ + + /* width is specified out of line */ + if(*alias == SPEC_ASTERISK) { + + info->fWidth = -2; + + /* Skip the '*' */ + alias++; + + /* Save the current position */ + backup = alias; + + /* handle positional parameters */ + if(ISDIGIT(*alias)) { + spec.fWidthPos = (int) (*alias++ - DIGIT_ZERO); + + while(ISDIGIT(*alias)) { + spec.fWidthPos *= 10; + spec.fWidthPos += (int) (*alias++ - DIGIT_ZERO); + } + } + + /* if there is no '$', don't read anything */ + if(*alias != SPEC_DOLLARSIGN) { + spec.fWidthPos = -1; + alias = backup; + } + /* munge the '$' */ + else + alias++; + } + /* read the width, if present */ + else if(ISDIGIT(*alias)){ + info->fWidth = (int) (*alias++ - DIGIT_ZERO); + + while(ISDIGIT(*alias)) { + info->fWidth *= 10; + info->fWidth += (int) (*alias++ - DIGIT_ZERO); + } + } + + /* Get the precision */ + + if(*alias == SPEC_PERIOD) { + + /* eat up the '.' */ + alias++; + + /* precision is specified out of line */ + if(*alias == SPEC_ASTERISK) { + + info->fPrecision = -2; + + /* Skip the '*' */ + alias++; + + /* save the current position */ + backup = alias; + + /* handle positional parameters */ + if(ISDIGIT(*alias)) { + spec.fPrecisionPos = (int) (*alias++ - DIGIT_ZERO); + + while(ISDIGIT(*alias)) { + spec.fPrecisionPos *= 10; + spec.fPrecisionPos += (int) (*alias++ - DIGIT_ZERO); + } + + /* if there is no '$', don't read anything */ + if(*alias != SPEC_DOLLARSIGN) { + spec.fPrecisionPos = -1; + alias = backup; + } + else { + /* munge the '$' */ + alias++; + } + } + } + /* read the precision */ + else if(ISDIGIT(*alias)){ + info->fPrecision = (int) (*alias++ - DIGIT_ZERO); + + while(ISDIGIT(*alias)) { + info->fPrecision *= 10; + info->fPrecision += (int) (*alias++ - DIGIT_ZERO); + } + } + } + + /* Get any modifiers */ + if(ISMOD(*alias)) { + switch(*alias++) { + + /* short */ + case MOD_H: + info->fIsShort = TRUE; + break; + + /* long or long long */ + case MOD_LOWERL: + if(*alias == MOD_LOWERL) { + info->fIsLongLong = TRUE; + /* skip over the next 'l' */ + alias++; + } + else + info->fIsLong = TRUE; + break; + + /* long double */ + case MOD_L: + info->fIsLongDouble = TRUE; + break; + } + } + + /* finally, get the specifier letter */ + info->fSpec = *alias++; + + /* fill in the precision and width, if specified out of line */ + + /* width specified out of line */ + if(spec.fInfo.fWidth == -2) { + if(spec.fWidthPos == -1) { + /* read the width from the argument list */ + info->fWidth = va_arg(ap, int32_t); + } + else { + /* handle positional parameter */ + } + + /* if it's negative, take the absolute value and set left alignment */ + if(info->fWidth < 0) { + info->fWidth *= -1; + info->fLeft = TRUE; + } + } + + /* precision specified out of line */ + if(info->fPrecision == -2) { + if(spec.fPrecisionPos == -1) { + /* read the precision from the argument list */ + info->fPrecision = va_arg(ap, int32_t); + } + else { + /* handle positional parameter */ + } + + /* if it's negative, set it to zero */ + if(info->fPrecision < 0) + info->fPrecision = 0; + } + + handlerNum = (uint16_t)(info->fSpec - UPRINTF_BASE_FMT_HANDLERS); + if (handlerNum < UPRINTF_NUM_FMT_HANDLERS) { + /* query the info function for argument information */ + argType = g_u_printf_infos[ handlerNum ].info; + switch(argType) { + case ufmt_count: + /* set the spec's width to the # of chars written */ + info->fWidth = *written; + /* fall through to set the pointer */ + case ufmt_string: + case ufmt_ustring: + case ufmt_pointer: + args.ptrValue = va_arg(ap, void*); + break; + case ufmt_char: + case ufmt_uchar: + case ufmt_int: + if (info->fIsLongLong) { + args.int64Value = va_arg(ap, int64_t); + } + else { + args.int64Value = va_arg(ap, int32_t); + } + break; + case ufmt_float: + args.floatValue = (float) va_arg(ap, double); + break; + case ufmt_double: + args.doubleValue = va_arg(ap, double); + break; + default: + /* else args is ignored */ + args.ptrValue = NULL; + break; + } + + /* call the handler function */ + handler = g_u_printf_infos[ handlerNum ].handler; + if(handler != 0) { + *written += (*handler)(streamHandler, context, formatBundle, info, &args); + } + else { + /* just echo unknown tags */ + *written += (streamHandler->write)(context, fmt, (int32_t)(alias - lastAlias)); + } + } + else { + /* just echo unknown tags */ + *written += (streamHandler->write)(context, fmt, (int32_t)(alias - lastAlias)); + } + } + /* return # of characters in this format that have been parsed. */ + return (int32_t)(alias - fmt); +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/io/uscanf.c b/icuSources/io/uscanf.c new file mode 100644 index 00000000..5743f651 --- /dev/null +++ b/icuSources/io/uscanf.c @@ -0,0 +1,106 @@ +/* +****************************************************************************** +* +* Copyright (C) 1998-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +****************************************************************************** +* +* File uscanf.c +* +* Modification History: +* +* Date Name Description +* 12/02/98 stephen Creation. +* 03/13/99 stephen Modified for new C API. +****************************************************************************** +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/putil.h" +#include "unicode/ustdio.h" +#include "unicode/ustring.h" +#include "uscanf.h" +#include "ufile.h" +#include "ufmt_cmn.h" + +#include "cmemory.h" +#include "cstring.h" + + +U_CAPI int32_t U_EXPORT2 +u_fscanf(UFILE *f, + const char *patternSpecification, + ... ) +{ + va_list ap; + int32_t converted; + + va_start(ap, patternSpecification); + converted = u_vfscanf(f, patternSpecification, ap); + va_end(ap); + + return converted; +} + +U_CAPI int32_t U_EXPORT2 +u_fscanf_u(UFILE *f, + const UChar *patternSpecification, + ... ) +{ + va_list ap; + int32_t converted; + + va_start(ap, patternSpecification); + converted = u_vfscanf_u(f, patternSpecification, ap); + va_end(ap); + + return converted; +} + +U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ +u_vfscanf(UFILE *f, + const char *patternSpecification, + va_list ap) +{ + int32_t converted; + UChar *pattern; + UChar patBuffer[UFMT_DEFAULT_BUFFER_SIZE]; + int32_t size = (int32_t)uprv_strlen(patternSpecification) + 1; + + /* convert from the default codepage to Unicode */ + if (size >= MAX_UCHAR_BUFFER_SIZE(patBuffer)) { + pattern = (UChar *)uprv_malloc(size * sizeof(UChar)); + if(pattern == 0) { + return 0; + } + } + else { + pattern = patBuffer; + } + u_charsToUChars(patternSpecification, pattern, size); + + /* do the work */ + converted = u_vfscanf_u(f, pattern, ap); + + /* clean up */ + if (pattern != patBuffer) { + uprv_free(pattern); + } + + return converted; +} + +U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ +u_vfscanf_u(UFILE *f, + const UChar *patternSpecification, + va_list ap) +{ + return u_scanf_parse(f, patternSpecification, ap); +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ + diff --git a/icuSources/extra/ustdio/loccache.h b/icuSources/io/uscanf.h similarity index 51% rename from icuSources/extra/ustdio/loccache.h rename to icuSources/io/uscanf.h index 362e09f7..dd8b8546 100644 --- a/icuSources/extra/ustdio/loccache.h +++ b/icuSources/io/uscanf.h @@ -1,36 +1,36 @@ /* -******************************************************************************* +****************************************************************************** * -* Copyright (C) 1998-2003, International Business Machines +* Copyright (C) 1998-2004, International Business Machines * Corporation and others. All Rights Reserved. * -******************************************************************************* +****************************************************************************** * -* File loccache.h +* File uscanf.h * * Modification History: * * Date Name Description -* 11/18/98 stephen Creation. -* 03/11/99 stephen Modified for new C API. -******************************************************************************* +* 12/02/98 stephen Creation. +* 03/13/99 stephen Modified for new C API. +****************************************************************************** */ -#ifndef LOCCACHE_H -#define LOCCACHE_H +#ifndef USCANF_H +#define USCANF_H #include "unicode/utypes.h" #if !UCONFIG_NO_FORMATTING -#include "locbund.h" +#include "unicode/ustdio.h" -ULocaleBundle* -u_loccache_get(const char *loc); - -/* Main library cleanup function. */ -U_CFUNC void ucln_ustdio_registerCleanup(void); +U_CFUNC int32_t +u_scanf_parse(UFILE *f, + const UChar *patternSpecification, + va_list ap); #endif /* #if !UCONFIG_NO_FORMATTING */ #endif + diff --git a/icuSources/io/uscanf_p.c b/icuSources/io/uscanf_p.c new file mode 100644 index 00000000..17e98138 --- /dev/null +++ b/icuSources/io/uscanf_p.c @@ -0,0 +1,1320 @@ +/* +******************************************************************************* +* +* Copyright (C) 1998-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* +* File uscnnf_p.c +* +* Modification History: +* +* Date Name Description +* 12/02/98 stephen Creation. +* 03/13/99 stephen Modified for new C API. +******************************************************************************* +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/uchar.h" +#include "unicode/ustring.h" +#include "unicode/unum.h" +#include "unicode/udat.h" +#include "unicode/uset.h" +#include "uscanf.h" +#include "ufmt_cmn.h" +#include "ufile.h" +#include "locbund.h" + +#include "cmemory.h" +#include "ustr_cnv.h" + +/* flag characters for u_scanf */ +#define FLAG_ASTERISK 0x002A +#define FLAG_PAREN 0x0028 + +#define ISFLAG(s) (s) == FLAG_ASTERISK || \ + (s) == FLAG_PAREN + +/* special characters for u_scanf */ +#define SPEC_DOLLARSIGN 0x0024 + +/* unicode digits */ +#define DIGIT_ZERO 0x0030 +#define DIGIT_ONE 0x0031 +#define DIGIT_TWO 0x0032 +#define DIGIT_THREE 0x0033 +#define DIGIT_FOUR 0x0034 +#define DIGIT_FIVE 0x0035 +#define DIGIT_SIX 0x0036 +#define DIGIT_SEVEN 0x0037 +#define DIGIT_EIGHT 0x0038 +#define DIGIT_NINE 0x0039 + +#define ISDIGIT(s) (s) == DIGIT_ZERO || \ + (s) == DIGIT_ONE || \ + (s) == DIGIT_TWO || \ + (s) == DIGIT_THREE || \ + (s) == DIGIT_FOUR || \ + (s) == DIGIT_FIVE || \ + (s) == DIGIT_SIX || \ + (s) == DIGIT_SEVEN || \ + (s) == DIGIT_EIGHT || \ + (s) == DIGIT_NINE + +/* u_scanf modifiers */ +#define MOD_H 0x0068 +#define MOD_LOWERL 0x006C +#define MOD_L 0x004C + +#define ISMOD(s) (s) == MOD_H || \ + (s) == MOD_LOWERL || \ + (s) == MOD_L + +/** + * Struct encapsulating a single uscanf format specification. + */ +typedef struct u_scanf_spec_info { + int32_t fWidth; /* Width */ + + UChar fSpec; /* Format specification */ + + UChar fPadChar; /* Padding character */ + + UBool fSkipArg; /* TRUE if arg should be skipped */ + UBool fIsLongDouble; /* L flag */ + UBool fIsShort; /* h flag */ + UBool fIsLong; /* l flag */ + UBool fIsLongLong; /* ll flag */ + UBool fIsString; /* TRUE if this is a NULL-terminated string. */ +} u_scanf_spec_info; + + +/** + * Struct encapsulating a single u_scanf format specification. + */ +typedef struct u_scanf_spec { + u_scanf_spec_info fInfo; /* Information on this spec */ + int32_t fArgPos; /* Position of data in arg list */ +} u_scanf_spec; + +/** + * Parse a single u_scanf format specifier in Unicode. + * @param fmt A pointer to a '%' character in a u_scanf format specification. + * @param spec A pointer to a u_scanf_spec to receive the parsed + * format specifier. + * @return The number of characters contained in this specifier. + */ +static int32_t +u_scanf_parse_spec (const UChar *fmt, + u_scanf_spec *spec) +{ + const UChar *s = fmt; + const UChar *backup; + u_scanf_spec_info *info = &(spec->fInfo); + + /* initialize spec to default values */ + spec->fArgPos = -1; + + info->fWidth = -1; + info->fSpec = 0x0000; + info->fPadChar = 0x0020; + info->fSkipArg = FALSE; + info->fIsLongDouble = FALSE; + info->fIsShort = FALSE; + info->fIsLong = FALSE; + info->fIsLongLong = FALSE; + info->fIsString = TRUE; + + + /* skip over the initial '%' */ + s++; + + /* Check for positional argument */ + if(ISDIGIT(*s)) { + + /* Save the current position */ + backup = s; + + /* handle positional parameters */ + if(ISDIGIT(*s)) { + spec->fArgPos = (int) (*s++ - DIGIT_ZERO); + + while(ISDIGIT(*s)) { + spec->fArgPos *= 10; + spec->fArgPos += (int) (*s++ - DIGIT_ZERO); + } + } + + /* if there is no '$', don't read anything */ + if(*s != SPEC_DOLLARSIGN) { + spec->fArgPos = -1; + s = backup; + } + /* munge the '$' */ + else + s++; + } + + /* Get any format flags */ + while(ISFLAG(*s)) { + switch(*s++) { + + /* skip argument */ + case FLAG_ASTERISK: + info->fSkipArg = TRUE; + break; + + /* pad character specified */ + case FLAG_PAREN: + + /* first four characters are hex values for pad char */ + info->fPadChar = (UChar)ufmt_digitvalue(*s++); + info->fPadChar = (UChar)((info->fPadChar * 16) + ufmt_digitvalue(*s++)); + info->fPadChar = (UChar)((info->fPadChar * 16) + ufmt_digitvalue(*s++)); + info->fPadChar = (UChar)((info->fPadChar * 16) + ufmt_digitvalue(*s++)); + + /* final character is ignored */ + s++; + + break; + } + } + + /* Get the width */ + if(ISDIGIT(*s)){ + info->fWidth = (int) (*s++ - DIGIT_ZERO); + + while(ISDIGIT(*s)) { + info->fWidth *= 10; + info->fWidth += (int) (*s++ - DIGIT_ZERO); + } + } + + /* Get any modifiers */ + if(ISMOD(*s)) { + switch(*s++) { + + /* short */ + case MOD_H: + info->fIsShort = TRUE; + break; + + /* long or long long */ + case MOD_LOWERL: + if(*s == MOD_LOWERL) { + info->fIsLongLong = TRUE; + /* skip over the next 'l' */ + s++; + } + else + info->fIsLong = TRUE; + break; + + /* long double */ + case MOD_L: + info->fIsLongDouble = TRUE; + break; + } + } + + /* finally, get the specifier letter */ + info->fSpec = *s++; + + /* return # of characters in this specifier */ + return (int32_t)(s - fmt); +} + +#define UP_PERCENT 0x0025 + + +/* ANSI style formatting */ +/* Use US-ASCII characters only for formatting */ + +/* % */ +#define UFMT_SIMPLE_PERCENT {ufmt_simple_percent, u_scanf_simple_percent_handler} +/* s */ +#define UFMT_STRING {ufmt_string, u_scanf_string_handler} +/* c */ +#define UFMT_CHAR {ufmt_string, u_scanf_char_handler} +/* d, i */ +#define UFMT_INT {ufmt_int, u_scanf_integer_handler} +/* u */ +#define UFMT_UINT {ufmt_int, u_scanf_uinteger_handler} +/* o */ +#define UFMT_OCTAL {ufmt_int, u_scanf_octal_handler} +/* x, X */ +#define UFMT_HEX {ufmt_int, u_scanf_hex_handler} +/* f */ +#define UFMT_DOUBLE {ufmt_double, u_scanf_double_handler} +/* e, E */ +#define UFMT_SCIENTIFIC {ufmt_double, u_scanf_scientific_handler} +/* g, G */ +#define UFMT_SCIDBL {ufmt_double, u_scanf_scidbl_handler} +/* n */ +#define UFMT_COUNT {ufmt_count, u_scanf_count_handler} +/* [ */ +#define UFMT_SCANSET {ufmt_string, u_scanf_scanset_handler} + +/* non-ANSI extensions */ +/* Use US-ASCII characters only for formatting */ + +/* p */ +#define UFMT_POINTER {ufmt_pointer, u_scanf_pointer_handler} +/* V */ +#define UFMT_SPELLOUT {ufmt_double, u_scanf_spellout_handler} +/* P */ +#define UFMT_PERCENT {ufmt_double, u_scanf_percent_handler} +/* C K is old format */ +#define UFMT_UCHAR {ufmt_uchar, u_scanf_uchar_handler} +/* S U is old format */ +#define UFMT_USTRING {ufmt_ustring, u_scanf_ustring_handler} + + +#define UFMT_EMPTY {ufmt_empty, NULL} + +/** + * A u_scanf handler function. + * A u_scanf handler is responsible for handling a single u_scanf + * format specification, for example 'd' or 's'. + * @param stream The UFILE to which to write output. + * @param info A pointer to a u_scanf_spec_info struct containing + * information on the format specification. + * @param args A pointer to the argument data + * @param fmt A pointer to the first character in the format string + * following the spec. + * @param fmtConsumed On output, set to the number of characters consumed + * in fmt. Do nothing, if the argument isn't variable width. + * @param argConverted The number of arguments converted and assigned, or -1 if an + * error occurred. + * @return The number of code points consumed during reading. + */ +typedef int32_t (*u_scanf_handler) (UFILE *stream, + u_scanf_spec_info *info, + ufmt_args *args, + const UChar *fmt, + int32_t *fmtConsumed, + int32_t *argConverted); + +typedef struct u_scanf_info { + ufmt_type_info info; + u_scanf_handler handler; +} u_scanf_info; + +#define USCANF_NUM_FMT_HANDLERS 108 + +/* We do not use handlers for 0-0x1f */ +#define USCANF_BASE_FMT_HANDLERS 0x20 + + +static int32_t +u_scanf_skip_leading_ws(UFILE *input, + UChar pad) +{ + UChar c; + int32_t count = 0; + UBool isNotEOF; + + /* skip all leading ws in the input */ + while( (isNotEOF = ufile_getch(input, &c)) && (c == pad || u_isWhitespace(c)) ) + { + count++; + } + + /* put the final character back on the input */ + if(isNotEOF) + u_fungetc(c, input); + + return count; +} + +static int32_t +u_scanf_simple_percent_handler(UFILE *input, + u_scanf_spec_info *info, + ufmt_args *args, + const UChar *fmt, + int32_t *fmtConsumed, + int32_t *argConverted) +{ + /* make sure the next character in the input is a percent */ + *argConverted = 0; + if(u_fgetc(input) != 0x0025) { + *argConverted = -1; + } + return 1; +} + +static int32_t +u_scanf_count_handler(UFILE *input, + u_scanf_spec_info *info, + ufmt_args *args, + const UChar *fmt, + int32_t *fmtConsumed, + int32_t *argConverted) +{ + /* in the special case of count, the u_scanf_spec_info's width */ + /* will contain the # of items converted thus far */ + if (!info->fSkipArg) { + if (info->fIsShort) + *(int16_t*)(args[0].ptrValue) = (int16_t)(UINT16_MAX & info->fWidth); + else if (info->fIsLongLong) + *(int64_t*)(args[0].ptrValue) = info->fWidth; + else + *(int32_t*)(args[0].ptrValue) = (int32_t)(UINT32_MAX & info->fWidth); + } + + /* we converted 0 args */ + return 0; +} + +static int32_t +u_scanf_double_handler(UFILE *input, + u_scanf_spec_info *info, + ufmt_args *args, + const UChar *fmt, + int32_t *fmtConsumed, + int32_t *argConverted) +{ + int32_t len; + double num; + UNumberFormat *format; + int32_t parsePos = 0; + UErrorCode status = U_ZERO_ERROR; + + + /* skip all ws in the input */ + u_scanf_skip_leading_ws(input, info->fPadChar); + + /* fill the input's internal buffer */ + ufile_fill_uchar_buffer(input); + + /* determine the size of the input's buffer */ + len = input->str.fLimit - input->str.fPos; + + /* truncate to the width, if specified */ + if(info->fWidth != -1) + len = ufmt_min(len, info->fWidth); + + /* get the formatter */ + format = u_locbund_getNumberFormat(&input->str.fBundle, UNUM_DECIMAL); + + /* handle error */ + if(format == 0) + return 0; + + /* parse the number */ + num = unum_parseDouble(format, input->str.fPos, len, &parsePos, &status); + + if (!info->fSkipArg) { + *(double*)(args[0].ptrValue) = num; + } + + /* mask off any necessary bits */ + /* if(! info->fIsLong_double) + num &= DBL_MAX;*/ + + /* update the input's position to reflect consumed data */ + input->str.fPos += parsePos; + + /* we converted 1 arg */ + *argConverted = !info->fSkipArg; + return parsePos; +} + +static int32_t +u_scanf_scientific_handler(UFILE *input, + u_scanf_spec_info *info, + ufmt_args *args, + const UChar *fmt, + int32_t *fmtConsumed, + int32_t *argConverted) +{ + int32_t len; + double num; + UNumberFormat *format; + int32_t parsePos = 0; + UErrorCode status = U_ZERO_ERROR; + + + /* skip all ws in the input */ + u_scanf_skip_leading_ws(input, info->fPadChar); + + /* fill the input's internal buffer */ + ufile_fill_uchar_buffer(input); + + /* determine the size of the input's buffer */ + len = input->str.fLimit - input->str.fPos; + + /* truncate to the width, if specified */ + if(info->fWidth != -1) + len = ufmt_min(len, info->fWidth); + + /* get the formatter */ + format = u_locbund_getNumberFormat(&input->str.fBundle, UNUM_SCIENTIFIC); + + /* handle error */ + if(format == 0) + return 0; + + /* parse the number */ + num = unum_parseDouble(format, input->str.fPos, len, &parsePos, &status); + + if (!info->fSkipArg) { + *(double*)(args[0].ptrValue) = num; + } + + /* mask off any necessary bits */ + /* if(! info->fIsLong_double) + num &= DBL_MAX;*/ + + /* update the input's position to reflect consumed data */ + input->str.fPos += parsePos; + + /* we converted 1 arg */ + *argConverted = !info->fSkipArg; + return parsePos; +} + +static int32_t +u_scanf_scidbl_handler(UFILE *input, + u_scanf_spec_info *info, + ufmt_args *args, + const UChar *fmt, + int32_t *fmtConsumed, + int32_t *argConverted) +{ + int32_t len; + double num; + UNumberFormat *scientificFormat, *genericFormat; + /*int32_t scientificResult, genericResult;*/ + double scientificResult, genericResult; + int32_t scientificParsePos = 0, genericParsePos = 0, parsePos = 0; + UErrorCode scientificStatus = U_ZERO_ERROR; + UErrorCode genericStatus = U_ZERO_ERROR; + + + /* since we can't determine by scanning the characters whether */ + /* a number was formatted in the 'f' or 'g' styles, parse the */ + /* string with both formatters, and assume whichever one */ + /* parsed the most is the correct formatter to use */ + + + /* skip all ws in the input */ + u_scanf_skip_leading_ws(input, info->fPadChar); + + /* fill the input's internal buffer */ + ufile_fill_uchar_buffer(input); + + /* determine the size of the input's buffer */ + len = input->str.fLimit - input->str.fPos; + + /* truncate to the width, if specified */ + if(info->fWidth != -1) + len = ufmt_min(len, info->fWidth); + + /* get the formatters */ + scientificFormat = u_locbund_getNumberFormat(&input->str.fBundle, UNUM_SCIENTIFIC); + genericFormat = u_locbund_getNumberFormat(&input->str.fBundle, UNUM_DECIMAL); + + /* handle error */ + if(scientificFormat == 0 || genericFormat == 0) + return 0; + + /* parse the number using each format*/ + + scientificResult = unum_parseDouble(scientificFormat, input->str.fPos, len, + &scientificParsePos, &scientificStatus); + + genericResult = unum_parseDouble(genericFormat, input->str.fPos, len, + &genericParsePos, &genericStatus); + + /* determine which parse made it farther */ + if(scientificParsePos > genericParsePos) { + /* stash the result in num */ + num = scientificResult; + /* update the input's position to reflect consumed data */ + parsePos += scientificParsePos; + } + else { + /* stash the result in num */ + num = genericResult; + /* update the input's position to reflect consumed data */ + parsePos += genericParsePos; + } + input->str.fPos += parsePos; + + if (!info->fSkipArg) { + *(double*)(args[0].ptrValue) = num; + } + + /* mask off any necessary bits */ + /* if(! info->fIsLong_double) + num &= DBL_MAX;*/ + + /* we converted 1 arg */ + *argConverted = !info->fSkipArg; + return parsePos; +} + +static int32_t +u_scanf_integer_handler(UFILE *input, + u_scanf_spec_info *info, + ufmt_args *args, + const UChar *fmt, + int32_t *fmtConsumed, + int32_t *argConverted) +{ + int32_t len; + void *num = (void*) (args[0].ptrValue); + UNumberFormat *format; + int32_t parsePos = 0; + UErrorCode status = U_ZERO_ERROR; + int64_t result; + + + /* skip all ws in the input */ + u_scanf_skip_leading_ws(input, info->fPadChar); + + /* fill the input's internal buffer */ + ufile_fill_uchar_buffer(input); + + /* determine the size of the input's buffer */ + len = input->str.fLimit - input->str.fPos; + + /* truncate to the width, if specified */ + if(info->fWidth != -1) + len = ufmt_min(len, info->fWidth); + + /* get the formatter */ + format = u_locbund_getNumberFormat(&input->str.fBundle, UNUM_DECIMAL); + + /* handle error */ + if(format == 0) + return 0; + + /* parse the number */ + result = unum_parseInt64(format, input->str.fPos, len, &parsePos, &status); + + /* mask off any necessary bits */ + if (!info->fSkipArg) { + if (info->fIsShort) + *(int16_t*)num = (int16_t)(UINT16_MAX & result); + else if (info->fIsLongLong) + *(int64_t*)num = result; + else + *(int32_t*)num = (int32_t)(UINT32_MAX & result); + } + + /* update the input's position to reflect consumed data */ + input->str.fPos += parsePos; + + /* we converted 1 arg */ + *argConverted = !info->fSkipArg; + return parsePos; +} + +static int32_t +u_scanf_uinteger_handler(UFILE *input, + u_scanf_spec_info *info, + ufmt_args *args, + const UChar *fmt, + int32_t *fmtConsumed, + int32_t *argConverted) +{ + /* TODO Fix this when Numberformat handles uint64_t */ + return u_scanf_integer_handler(input, info, args, fmt, fmtConsumed, argConverted); +} + +static int32_t +u_scanf_percent_handler(UFILE *input, + u_scanf_spec_info *info, + ufmt_args *args, + const UChar *fmt, + int32_t *fmtConsumed, + int32_t *argConverted) +{ + int32_t len; + double num; + UNumberFormat *format; + int32_t parsePos = 0; + UErrorCode status = U_ZERO_ERROR; + + + /* skip all ws in the input */ + u_scanf_skip_leading_ws(input, info->fPadChar); + + /* fill the input's internal buffer */ + ufile_fill_uchar_buffer(input); + + /* determine the size of the input's buffer */ + len = input->str.fLimit - input->str.fPos; + + /* truncate to the width, if specified */ + if(info->fWidth != -1) + len = ufmt_min(len, info->fWidth); + + /* get the formatter */ + format = u_locbund_getNumberFormat(&input->str.fBundle, UNUM_PERCENT); + + /* handle error */ + if(format == 0) + return 0; + + /* parse the number */ + num = unum_parseDouble(format, input->str.fPos, len, &parsePos, &status); + + if (!info->fSkipArg) { + *(double*)(args[0].ptrValue) = num; + } + + /* mask off any necessary bits */ + /* if(! info->fIsLong_double) + num &= DBL_MAX;*/ + + /* update the input's position to reflect consumed data */ + input->str.fPos += parsePos; + + /* we converted 1 arg */ + *argConverted = !info->fSkipArg; + return parsePos; +} + +static int32_t +u_scanf_string_handler(UFILE *input, + u_scanf_spec_info *info, + ufmt_args *args, + const UChar *fmt, + int32_t *fmtConsumed, + int32_t *argConverted) +{ + const UChar *source; + UConverter *conv; + char *arg = (char*)(args[0].ptrValue); + char *alias = arg; + char *limit; + UErrorCode status = U_ZERO_ERROR; + int32_t count; + UChar c; + UBool isNotEOF = FALSE; + + /* skip all ws in the input */ + if (info->fIsString) { + u_scanf_skip_leading_ws(input, info->fPadChar); + } + + /* get the string one character at a time, truncating to the width */ + count = 0; + + /* open the default converter */ + conv = u_getDefaultConverter(&status); + + if(U_FAILURE(status)) + return -1; + + while( (info->fWidth == -1 || count < info->fWidth) + && (isNotEOF = ufile_getch(input, &c)) + && (!info->fIsString || (c != info->fPadChar && !u_isWhitespace(c)))) + { + + if (!info->fSkipArg) { + /* put the character from the input onto the target */ + source = &c; + /* Since we do this one character at a time, do it this way. */ + if (info->fWidth > 0) { + limit = alias + info->fWidth - count; + } + else { + limit = alias + ucnv_getMaxCharSize(conv); + } + + /* convert the character to the default codepage */ + ucnv_fromUnicode(conv, &alias, limit, &source, source + 1, + NULL, TRUE, &status); + + if(U_FAILURE(status)) { + /* clean up */ + u_releaseDefaultConverter(conv); + return -1; + } + } + + /* increment the count */ + ++count; + } + + /* put the final character we read back on the input */ + if (!info->fSkipArg) { + if ((info->fWidth == -1 || count < info->fWidth) && isNotEOF) + u_fungetc(c, input); + + /* add the terminator */ + if (info->fIsString) { + *alias = 0x00; + } + } + + /* clean up */ + u_releaseDefaultConverter(conv); + + /* we converted 1 arg */ + *argConverted = !info->fSkipArg; + return count; +} + +static int32_t +u_scanf_char_handler(UFILE *input, + u_scanf_spec_info *info, + ufmt_args *args, + const UChar *fmt, + int32_t *fmtConsumed, + int32_t *argConverted) +{ + if (info->fWidth < 0) { + info->fWidth = 1; + } + info->fIsString = FALSE; + return u_scanf_string_handler(input, info, args, fmt, fmtConsumed, argConverted); +} + +static int32_t +u_scanf_ustring_handler(UFILE *input, + u_scanf_spec_info *info, + ufmt_args *args, + const UChar *fmt, + int32_t *fmtConsumed, + int32_t *argConverted) +{ + UChar *arg = (UChar*)(args[0].ptrValue); + UChar *alias = arg; + int32_t count; + UChar c; + UBool isNotEOF = FALSE; + + /* skip all ws in the input */ + if (info->fIsString) { + u_scanf_skip_leading_ws(input, info->fPadChar); + } + + /* get the string one character at a time, truncating to the width */ + count = 0; + + while( (info->fWidth == -1 || count < info->fWidth) + && (isNotEOF = ufile_getch(input, &c)) + && (!info->fIsString || (c != info->fPadChar && !u_isWhitespace(c)))) + { + + /* put the character from the input onto the target */ + if (!info->fSkipArg) { + *alias++ = c; + } + + /* increment the count */ + ++count; + } + + /* put the final character we read back on the input */ + if (!info->fSkipArg) { + if((info->fWidth == -1 || count < info->fWidth) && isNotEOF) { + u_fungetc(c, input); + } + + /* add the terminator */ + if (info->fIsString) { + *alias = 0x0000; + } + } + + /* we converted 1 arg */ + *argConverted = !info->fSkipArg; + return count; +} + +static int32_t +u_scanf_uchar_handler(UFILE *input, + u_scanf_spec_info *info, + ufmt_args *args, + const UChar *fmt, + int32_t *fmtConsumed, + int32_t *argConverted) +{ + if (info->fWidth < 0) { + info->fWidth = 1; + } + info->fIsString = FALSE; + return u_scanf_ustring_handler(input, info, args, fmt, fmtConsumed, argConverted); +} + +static int32_t +u_scanf_spellout_handler(UFILE *input, + u_scanf_spec_info *info, + ufmt_args *args, + const UChar *fmt, + int32_t *fmtConsumed, + int32_t *argConverted) +{ + int32_t len; + double num; + UNumberFormat *format; + int32_t parsePos = 0; + UErrorCode status = U_ZERO_ERROR; + + + /* skip all ws in the input */ + u_scanf_skip_leading_ws(input, info->fPadChar); + + /* fill the input's internal buffer */ + ufile_fill_uchar_buffer(input); + + /* determine the size of the input's buffer */ + len = input->str.fLimit - input->str.fPos; + + /* truncate to the width, if specified */ + if(info->fWidth != -1) + len = ufmt_min(len, info->fWidth); + + /* get the formatter */ + format = u_locbund_getNumberFormat(&input->str.fBundle, UNUM_SPELLOUT); + + /* handle error */ + if(format == 0) + return 0; + + /* parse the number */ + num = unum_parseDouble(format, input->str.fPos, len, &parsePos, &status); + + if (!info->fSkipArg) { + *(double*)(args[0].ptrValue) = num; + } + + /* mask off any necessary bits */ + /* if(! info->fIsLong_double) + num &= DBL_MAX;*/ + + /* update the input's position to reflect consumed data */ + input->str.fPos += parsePos; + + /* we converted 1 arg */ + *argConverted = !info->fSkipArg; + return parsePos; +} + +static int32_t +u_scanf_hex_handler(UFILE *input, + u_scanf_spec_info *info, + ufmt_args *args, + const UChar *fmt, + int32_t *fmtConsumed, + int32_t *argConverted) +{ + int32_t len; + void *num = (void*) (args[0].ptrValue); + int64_t result; + + /* skip all ws in the input */ + u_scanf_skip_leading_ws(input, info->fPadChar); + + /* fill the input's internal buffer */ + ufile_fill_uchar_buffer(input); + + /* determine the size of the input's buffer */ + len = input->str.fLimit - input->str.fPos; + + /* truncate to the width, if specified */ + if(info->fWidth != -1) + len = ufmt_min(len, info->fWidth); + + /* check for alternate form */ + if( *(input->str.fPos) == 0x0030 && + (*(input->str.fPos + 1) == 0x0078 || *(input->str.fPos + 1) == 0x0058) ) { + + /* skip the '0' and 'x' or 'X' if present */ + input->str.fPos += 2; + len -= 2; + } + + /* parse the number */ + result = ufmt_uto64(input->str.fPos, &len, 16); + + /* update the input's position to reflect consumed data */ + input->str.fPos += len; + + /* mask off any necessary bits */ + if (!info->fSkipArg) { + if (info->fIsShort) + *(int16_t*)num = (int16_t)(UINT16_MAX & result); + else if (info->fIsLongLong) + *(int64_t*)num = result; + else + *(int32_t*)num = (int32_t)(UINT32_MAX & result); + } + + /* we converted 1 arg */ + *argConverted = !info->fSkipArg; + return len; +} + +static int32_t +u_scanf_octal_handler(UFILE *input, + u_scanf_spec_info *info, + ufmt_args *args, + const UChar *fmt, + int32_t *fmtConsumed, + int32_t *argConverted) +{ + int32_t len; + void *num = (void*) (args[0].ptrValue); + int64_t result; + + /* skip all ws in the input */ + u_scanf_skip_leading_ws(input, info->fPadChar); + + /* fill the input's internal buffer */ + ufile_fill_uchar_buffer(input); + + /* determine the size of the input's buffer */ + len = input->str.fLimit - input->str.fPos; + + /* truncate to the width, if specified */ + if(info->fWidth != -1) + len = ufmt_min(len, info->fWidth); + + /* parse the number */ + result = ufmt_uto64(input->str.fPos, &len, 8); + + /* update the input's position to reflect consumed data */ + input->str.fPos += len; + + /* mask off any necessary bits */ + if (!info->fSkipArg) { + if (info->fIsShort) + *(int16_t*)num = (int16_t)(UINT16_MAX & result); + else if (info->fIsLongLong) + *(int64_t*)num = result; + else + *(int32_t*)num = (int32_t)(UINT32_MAX & result); + } + + /* we converted 1 arg */ + *argConverted = !info->fSkipArg; + return len; +} + +static int32_t +u_scanf_pointer_handler(UFILE *input, + u_scanf_spec_info *info, + ufmt_args *args, + const UChar *fmt, + int32_t *fmtConsumed, + int32_t *argConverted) +{ + int32_t len; + void *result; + void **p = (void**)(args[0].ptrValue); + + + /* skip all ws in the input */ + u_scanf_skip_leading_ws(input, info->fPadChar); + + /* fill the input's internal buffer */ + ufile_fill_uchar_buffer(input); + + /* determine the size of the input's buffer */ + len = input->str.fLimit - input->str.fPos; + + /* truncate to the width, if specified */ + if(info->fWidth != -1) { + len = ufmt_min(len, info->fWidth); + } + +#ifdef OS400 + /* TODO: Fix this code so that it will work on all platforms */ + { + int64_t result[2]; + int32_t lenOrig = len; + + /* Make sure that we don't consume too much */ + if (len > (int32_t)(sizeof(int64_t)*2)) { + len = (int32_t)(sizeof(int64_t)*2); + } + + /* parse the pointer - set first half of big endian pointer */ + result[0] = (int64_t)ufmt_utop(input->str.fPos, &len); + + /* update the input's position to reflect consumed data */ + input->str.fPos += len; + len = lenOrig - len; + + /* Make sure that we don't consume too much */ + if (len > (int32_t)(sizeof(int64_t)*2)) { + len = (int32_t)(sizeof(int64_t)*2); + } + + /* parse the pointer - set second half of big endian pointer */ + result[1] = (int64_t)ufmt_utop(input->str.fPos, &len); + + if (!info->fSkipArg) { + p = *((void **)result); + } + } +#else + /* Make sure that we don't consume too much */ + if (len > (int32_t)(sizeof(void*)*2)) { + len = (int32_t)(sizeof(void*)*2); + } + + /* parse the pointer - assign to temporary value */ + result = ufmt_utop(input->str.fPos, &len); + + if (!info->fSkipArg) { + *p = result; + } + +#endif + + /* update the input's position to reflect consumed data */ + input->str.fPos += len; + + /* we converted 1 arg */ + *argConverted = !info->fSkipArg; + return len; +} + +static int32_t +u_scanf_scanset_handler(UFILE *input, + u_scanf_spec_info *info, + ufmt_args *args, + const UChar *fmt, + int32_t *fmtConsumed, + int32_t *argConverted) +{ + USet *scanset; + UErrorCode status = U_ZERO_ERROR; + int32_t chLeft = INT32_MAX; + UChar32 c; + UChar *alias = (UChar*) (args[0].ptrValue); + UBool isNotEOF = FALSE; + UBool readCharacter = FALSE; + + /* Create an empty set */ + scanset = uset_open(0, -1); + + /* Back up one to get the [ */ + fmt--; + + /* truncate to the width, if specified and alias the target */ + if(info->fWidth >= 0) { + chLeft = info->fWidth; + } + + /* parse the scanset from the fmt string */ + *fmtConsumed = uset_applyPattern(scanset, fmt, -1, 0, &status); + + /* verify that the parse was successful */ + if (U_SUCCESS(status)) { + c=0; + + /* grab characters one at a time and make sure they are in the scanset */ + while(chLeft > 0) { + if ((isNotEOF = ufile_getch32(input, &c)) && uset_contains(scanset, c)) { + readCharacter = TRUE; + if (!info->fSkipArg) { + int32_t idx = 0; + UBool isError = FALSE; + + U16_APPEND(alias, idx, chLeft, c, isError); + if (isError) { + break; + } + alias += idx; + } + chLeft -= (1 + U_IS_SUPPLEMENTARY(c)); + } + else { + /* if the character's not in the scanset, break out */ + break; + } + } + + /* put the final character we read back on the input */ + if(isNotEOF && chLeft > 0) { + u_fungetc(c, input); + } + } + + uset_close(scanset); + + /* if we didn't match at least 1 character, fail */ + if(!readCharacter) + return -1; + /* otherwise, add the terminator */ + else if (!info->fSkipArg) { + *alias = 0x00; + } + + /* we converted 1 arg */ + *argConverted = !info->fSkipArg; + return (info->fWidth >= 0 ? info->fWidth : INT32_MAX) - chLeft; +} + +/* Use US-ASCII characters only for formatting. Most codepages have + characters 20-7F from Unicode. Using any other codepage specific + characters will make it very difficult to format the string on + non-Unicode machines */ +static const u_scanf_info g_u_scanf_infos[USCANF_NUM_FMT_HANDLERS] = { +/* 0x20 */ + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, + UFMT_EMPTY, UFMT_SIMPLE_PERCENT,UFMT_EMPTY, UFMT_EMPTY, + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, + +/* 0x30 */ + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, + +/* 0x40 */ + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_UCHAR, + UFMT_EMPTY, UFMT_SCIENTIFIC, UFMT_EMPTY, UFMT_SCIDBL, +#ifdef U_USE_OBSOLETE_IO_FORMATTING + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_UCHAR/*deprecated*/, +#else + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, +#endif + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, + +/* 0x50 */ + UFMT_PERCENT, UFMT_EMPTY, UFMT_EMPTY, UFMT_USTRING, +#ifdef U_USE_OBSOLETE_IO_FORMATTING + UFMT_EMPTY, UFMT_USTRING/*deprecated*/,UFMT_SPELLOUT, UFMT_EMPTY, +#else + UFMT_EMPTY, UFMT_EMPTY, UFMT_SPELLOUT, UFMT_EMPTY, +#endif + UFMT_HEX, UFMT_EMPTY, UFMT_EMPTY, UFMT_SCANSET, + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, + +/* 0x60 */ + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_CHAR, + UFMT_INT, UFMT_SCIENTIFIC, UFMT_DOUBLE, UFMT_SCIDBL, + UFMT_EMPTY, UFMT_INT, UFMT_EMPTY, UFMT_EMPTY, + UFMT_EMPTY, UFMT_EMPTY, UFMT_COUNT, UFMT_OCTAL, + +/* 0x70 */ + UFMT_POINTER, UFMT_EMPTY, UFMT_EMPTY, UFMT_STRING, + UFMT_EMPTY, UFMT_UINT, UFMT_EMPTY, UFMT_EMPTY, + UFMT_HEX, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, + UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, UFMT_EMPTY, +}; + +U_CFUNC int32_t +u_scanf_parse(UFILE *f, + const UChar *patternSpecification, + va_list ap) +{ + const UChar *alias; + int32_t count, converted, argConsumed, cpConsumed; + uint16_t handlerNum; + + ufmt_args args; + u_scanf_spec spec; + ufmt_type_info info; + u_scanf_handler handler; + + /* alias the pattern */ + alias = patternSpecification; + + /* haven't converted anything yet */ + argConsumed = 0; + converted = 0; + cpConsumed = 0; + + /* iterate through the pattern */ + for(;;) { + + /* match any characters up to the next '%' */ + while(*alias != UP_PERCENT && *alias != 0x0000 && u_fgetc(f) == *alias) { + alias++; + } + + /* if we aren't at a '%', or if we're at end of string, break*/ + if(*alias != UP_PERCENT || *alias == 0x0000) + break; + + /* parse the specifier */ + count = u_scanf_parse_spec(alias, &spec); + + /* update the pointer in pattern */ + alias += count; + + handlerNum = (uint16_t)(spec.fInfo.fSpec - USCANF_BASE_FMT_HANDLERS); + if (handlerNum < USCANF_NUM_FMT_HANDLERS) { + /* skip the argument, if necessary */ + /* query the info function for argument information */ + info = g_u_scanf_infos[ handlerNum ].info; + if (info != ufmt_count && u_feof(f)) { + break; + } + else if(spec.fInfo.fSkipArg) { + args.ptrValue = NULL; + } + else { + switch(info) { + case ufmt_count: + /* set the spec's width to the # of items converted */ + spec.fInfo.fWidth = cpConsumed; + /* fall through to next case */ + case ufmt_char: + case ufmt_uchar: + case ufmt_int: + case ufmt_string: + case ufmt_ustring: + case ufmt_pointer: + case ufmt_float: + case ufmt_double: + args.ptrValue = va_arg(ap, void*); + break; + + default: + /* else args is ignored */ + args.ptrValue = NULL; + break; + } + } + + /* call the handler function */ + handler = g_u_scanf_infos[ handlerNum ].handler; + if(handler != 0) { + + /* reset count to 1 so that += for alias works. */ + count = 1; + + cpConsumed += (*handler)(f, &spec.fInfo, &args, alias, &count, &argConsumed); + + /* if the handler encountered an error condition, break */ + if(argConsumed < 0) { + converted = -1; + break; + } + + /* add to the # of items converted */ + converted += argConsumed; + + /* update the pointer in pattern */ + alias += count-1; + } + /* else do nothing */ + } + /* else do nothing */ + + /* just ignore unknown tags */ + } + + /* return # of items converted */ + return converted; +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/extra/ustdio/ustdio.c b/icuSources/io/ustdio.c similarity index 60% rename from icuSources/extra/ustdio/ustdio.c rename to icuSources/io/ustdio.c index af6fce64..8ffd9050 100644 --- a/icuSources/extra/ustdio/ustdio.c +++ b/icuSources/io/ustdio.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1998-2003, International Business Machines +* Copyright (C) 1998-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -20,6 +20,7 @@ #include "unicode/ustdio.h" #include "unicode/putil.h" #include "cmemory.h" +#include "cstring.h" #include "ufile.h" #include "ufmt_cmn.h" #include "unicode/ucnv.h" @@ -27,22 +28,36 @@ #include -#define DELIM_CR 0x000D #define DELIM_LF 0x000A +#define DELIM_VT 0x000B +#define DELIM_FF 0x000C +#define DELIM_CR 0x000D +#define DELIM_NEL 0x0085 +#define DELIM_LS 0x2028 +#define DELIM_PS 0x2029 /* Leave this copyright notice here! */ static const char copyright[] = U_COPYRIGHT_STRING; +/* TODO: is this correct for all codepages? Should we just use \n and let the converter handle it? */ #ifdef WIN32 static const UChar DELIMITERS [] = { DELIM_CR, DELIM_LF, 0x0000 }; static const uint32_t DELIMITERS_LEN = 2; +/* TODO: Default newline writing should be detected based upon the converter being used. */ #else static const UChar DELIMITERS [] = { DELIM_LF, 0x0000 }; static const uint32_t DELIMITERS_LEN = 1; #endif -#define IS_STRING_DELIMITER(s) (UBool)( (s) == DELIM_CR || \ -(s) == DELIM_LF ) +#define IS_FIRST_STRING_DELIMITER(c1) \ + (UBool)((DELIM_LF <= (c1) && (c1) <= DELIM_CR) \ + || (c1) == DELIM_NEL \ + || (c1) == DELIM_LS \ + || (c1) == DELIM_PS) +#define CAN_HAVE_COMBINED_STRING_DELIMITER(c1) (UBool)((c1) == DELIM_CR) +#define IS_COMBINED_STRING_DELIMITER(c1, c2) \ + (UBool)((c1) == DELIM_CR && (c2) == DELIM_LF) + #if !UCONFIG_NO_TRANSLITERATION @@ -52,7 +67,7 @@ u_fsettransliterator(UFILE *file, UFileDirection direction, { UTransliterator *old = NULL; - if(file==NULL || U_FAILURE(*status)) + if(U_FAILURE(*status)) { return adopt; } @@ -176,14 +191,6 @@ static const UChar * u_file_translit(UFILE *f, const UChar *src, int32_t *count, &pos, &status); -#ifdef _DEBUG - if(U_FAILURE(status)) - { - fprintf(stderr, " Gack. Translit blew up with a %s\n", u_errorName(status)); - return src; - } -#endif - /* now: start/limit point to the transliterated text */ /* Transliterated is [buffer..pos.start) */ *count = pos.start; @@ -205,14 +212,6 @@ static const UChar * u_file_translit(UFILE *f, const UChar *src, int32_t *count, &textLimit, &status); -#ifdef _DEBUG - if(U_FAILURE(status)) - { - fprintf(stderr, " Gack. Translit(flush) blew up with a %s\n", u_errorName(status)); - return src; - } -#endif - /* out: converted len */ *count = textLimit; @@ -274,11 +273,19 @@ u_fputs(const UChar *s, return count; } -U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ -u_fputc(UChar uc, +U_CAPI UChar32 U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ +u_fputc(UChar32 uc, UFILE *f) { - return u_file_write(&uc, 1, f) == 1 ? uc : EOF; + UChar buf[2]; + int32_t idx = 0; + UBool isError = FALSE; + + U16_APPEND(buf, idx, sizeof(buf)/sizeof(*buf), uc, isError); + if (isError) { + return EOF; + } + return u_file_write(buf, idx, f) == idx ? uc : EOF; } @@ -289,14 +296,30 @@ u_file_write_flush( const UChar *chars, UBool flush) { /* Set up conversion parameters */ - UErrorCode status = U_ZERO_ERROR; - const UChar *mySource = chars; - const UChar *sourceAlias = chars; - const UChar *mySourceEnd = chars + count; - char *myTarget = f->fCharBuffer; - int32_t bufferSize = UFILE_CHARBUFFER_SIZE; - int32_t written = 0; - int32_t numConverted = 0; + UErrorCode status = U_ZERO_ERROR; + const UChar *mySource = chars; + const UChar *sourceAlias = chars; + const UChar *mySourceEnd; + char charBuffer[UFILE_CHARBUFFER_SIZE]; + char *myTarget = charBuffer; + int32_t written = 0; + int32_t numConverted = 0; + + if (!f->fFile) { + int32_t charsLeft = f->str.fLimit - f->str.fPos; + if (flush && charsLeft > count) { + count++; + } + written = ufmt_min(count, charsLeft); + u_strncpy(f->str.fPos, chars, written); + f->str.fPos += written; + return written; + } + + if (count < 0) { + count = u_strlen(chars); + } + mySourceEnd = chars + count; #if !UCONFIG_NO_TRANSLITERATION if((f->fTranslit) && (f->fTranslit->translit)) @@ -315,7 +338,7 @@ u_file_write_flush( const UChar *chars, if(f->fConverter != NULL) { /* We have a valid converter */ ucnv_fromUnicode(f->fConverter, &myTarget, - f->fCharBuffer + bufferSize, + charBuffer + UFILE_CHARBUFFER_SIZE, &mySource, mySourceEnd, NULL, @@ -325,18 +348,18 @@ u_file_write_flush( const UChar *chars, u_UCharsToChars(mySource, myTarget, count); myTarget += count; } - numConverted = (int32_t)(myTarget - f->fCharBuffer); + numConverted = (int32_t)(myTarget - charBuffer); if (numConverted > 0) { /* write the converted bytes */ - fwrite(f->fCharBuffer, + fwrite(charBuffer, sizeof(char), numConverted, f->fFile); written += numConverted; } - myTarget = f->fCharBuffer; + myTarget = charBuffer; } while(status == U_BUFFER_OVERFLOW_ERROR); @@ -357,23 +380,33 @@ u_file_write( const UChar *chars, void ufile_fill_uchar_buffer(UFILE *f) { - UErrorCode status; - const char *mySource; - const char *mySourceEnd; - UChar *myTarget; - int32_t bufferSize; - int32_t maxCPBytes; - int32_t bytesRead; - int32_t availLength; - int32_t dataSize; + UErrorCode status; + const char *mySource; + const char *mySourceEnd; + UChar *myTarget; + int32_t bufferSize; + int32_t maxCPBytes; + int32_t bytesRead; + int32_t availLength; + int32_t dataSize; + char charBuffer[UFILE_CHARBUFFER_SIZE]; + u_localized_string *str; + + if (f->fFile == NULL) { + /* There is nothing to do. It's a string. */ + return; + } + str = &f->str; + dataSize = (int32_t)(str->fLimit - str->fPos); + if (f->fFileno == 0 && dataSize > 0) { + /* Don't read from stdin too many times. There is still some data. */ + return; + } /* shift the buffer if it isn't empty */ - dataSize = (int32_t)(f->fUCLimit - f->fUCPos); if(dataSize != 0) { - memmove(f->fUCBuffer, - f->fUCPos, - dataSize * sizeof(UChar)); + uprv_memmove(f->fUCBuffer, str->fPos, dataSize * sizeof(UChar)); } @@ -385,15 +418,23 @@ ufile_fill_uchar_buffer(UFILE *f) maxCPBytes = availLength / (f->fConverter!=NULL?(2*ucnv_getMinCharSize(f->fConverter)):1); /* Read in the data to convert */ - bytesRead = (int32_t)fread(f->fCharBuffer, - sizeof(char), - ufmt_min(maxCPBytes, UFILE_CHARBUFFER_SIZE), - f->fFile); + if (f->fFileno == 0) { + /* Special case. Read from stdin one line at a time. */ + char *retStr = fgets(charBuffer, ufmt_min(maxCPBytes, UFILE_CHARBUFFER_SIZE), f->fFile); + bytesRead = (retStr ? uprv_strlen(charBuffer) : 0); + } + else { + /* A normal file */ + bytesRead = (int32_t)fread(charBuffer, + sizeof(char), + ufmt_min(maxCPBytes, UFILE_CHARBUFFER_SIZE), + f->fFile); + } /* Set up conversion parameters */ status = U_ZERO_ERROR; - mySource = f->fCharBuffer; - mySourceEnd = f->fCharBuffer + bytesRead; + mySource = charBuffer; + mySourceEnd = charBuffer + bytesRead; myTarget = f->fUCBuffer + dataSize; bufferSize = UFILE_UCHARBUFFER_SIZE; @@ -414,20 +455,22 @@ ufile_fill_uchar_buffer(UFILE *f) } /* update the pointers into our array */ - f->fUCPos = f->fUCBuffer; - f->fUCLimit = myTarget; + str->fPos = str->fBuffer; + str->fLimit = myTarget; } U_CAPI UChar* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ -u_fgets(UFILE *f, - int32_t n, - UChar *s) +u_fgets(UChar *s, + int32_t n, + UFILE *f) { int32_t dataSize; int32_t count; UChar *alias; - UChar *limit; + const UChar *limit; UChar *sItr; + UChar currDelim = 0; + u_localized_string *str; if (n <= 0) { /* Caller screwed up. We need to write the null terminatior. */ @@ -435,7 +478,8 @@ u_fgets(UFILE *f, } /* fill the buffer if needed */ - if (f->fUCPos >= f->fUCLimit) { + str = &f->str; + if (str->fPos >= str->fLimit) { ufile_fill_uchar_buffer(f); } @@ -443,7 +487,7 @@ u_fgets(UFILE *f, --n; /* determine the amount of data in the buffer */ - dataSize = (int32_t)(f->fUCLimit - f->fUCPos); + dataSize = (int32_t)(str->fLimit - str->fPos); /* if 0 characters were left, return 0 */ if (dataSize == 0) @@ -452,34 +496,50 @@ u_fgets(UFILE *f, /* otherwise, iteratively fill the buffer and copy */ count = 0; sItr = s; + currDelim = 0; while (dataSize > 0 && count < n) { - alias = f->fUCPos; + alias = str->fPos; /* Find how much to copy */ if (dataSize < n) { - limit = f->fUCLimit; + limit = str->fLimit; } else { limit = alias + n; } - /* Copy UChars until we find the first occurrence of a delimiter character */ - while (alias < limit && !IS_STRING_DELIMITER(*alias)) { - count++; - *(sItr++) = *(alias++); + if (!currDelim) { + /* Copy UChars until we find the first occurrence of a delimiter character */ + while (alias < limit && !IS_FIRST_STRING_DELIMITER(*alias)) { + count++; + *(sItr++) = *(alias++); + } + /* Preserve the newline */ + if (alias < limit && IS_FIRST_STRING_DELIMITER(*alias)) { + if (CAN_HAVE_COMBINED_STRING_DELIMITER(*alias)) { + currDelim = *alias; + } + count++; + *(sItr++) = *(alias++); + } } - /* Preserve the newline */ - if (alias < limit && IS_STRING_DELIMITER(*alias)) { - count++; - *(sItr++) = *(alias++); + /* If we have a CRLF combination, preserve that too. */ + if (alias < limit) { + if (currDelim && IS_COMBINED_STRING_DELIMITER(currDelim, *alias)) { + count++; + *(sItr++) = *(alias++); + } + currDelim = 1; /* This isn't a newline, but it's used to say + that we should break later. We've checked all + possible newline combinations even across buffer + boundaries. */ } /* update the current buffer position */ - f->fUCPos = alias; + str->fPos = alias; /* if we found a delimiter */ - if (alias < f->fUCLimit) { - + if (currDelim == 1) { /* break out */ break; } @@ -488,7 +548,7 @@ u_fgets(UFILE *f, ufile_fill_uchar_buffer(f); /* determine the amount of data in the buffer */ - dataSize = (int32_t)(f->fUCLimit - f->fUCPos); + dataSize = (int32_t)(str->fLimit - str->fPos); } /* add the terminator and return s */ @@ -496,87 +556,110 @@ u_fgets(UFILE *f, return s; } -U_CAPI UChar U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ -u_fgetc(UFILE *f) +U_CFUNC UBool U_EXPORT2 +ufile_getch(UFILE *f, UChar *ch) { + UBool isValidChar = FALSE; + + *ch = U_EOF; /* if we have an available character in the buffer, return it */ - if(f->fUCPos < f->fUCLimit) - return *(f->fUCPos)++; - /* otherwise, fill the buffer and return the next character */ - else { - ufile_fill_uchar_buffer(f); - if(f->fUCPos < f->fUCLimit) - return *(f->fUCPos)++; - else - return 0xFFFF; + if(f->str.fPos < f->str.fLimit){ + *ch = *(f->str.fPos)++; + isValidChar = TRUE; } + else if (f) { + /* otherwise, fill the buffer and return the next character */ + if(f->str.fPos >= f->str.fLimit) { + ufile_fill_uchar_buffer(f); + } + if(f->str.fPos < f->str.fLimit) { + *ch = *(f->str.fPos)++; + isValidChar = TRUE; + } + } + return isValidChar; } -/* u_unescapeAt() callback to return a UChar from a UFILE */ -static UChar U_CALLCONV -_charAt(int32_t offset, void *context) { - return ((UFILE*) context)->fUCPos[offset]; +U_CAPI UChar U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ +u_fgetc(UFILE *f) +{ + UChar ch; + ufile_getch(f, &ch); + return ch; } -/* Read a UChar from a UFILE and process escape sequences */ -U_CAPI UChar32 U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ -u_fgetcx(UFILE *f) +U_CFUNC UBool U_EXPORT2 +ufile_getch32(UFILE *f, UChar32 *c32) { - int32_t length; - int32_t offset; - UChar32 c32; - UChar c16; + UBool isValidChar = FALSE; + u_localized_string *str; + + *c32 = U_EOF; /* Fill the buffer if it is empty */ - if (f->fUCPos >= f->fUCLimit) { + str = &f->str; + if (f && str->fPos + 1 >= str->fLimit) { ufile_fill_uchar_buffer(f); } /* Get the next character in the buffer */ - if (f->fUCPos < f->fUCLimit) { - c16 = *(f->fUCPos)++; - } else { - c16 = U_EOF; - } - - /* If it isn't a backslash, return it */ - if (c16 != 0x005C /*'\\'*/) { - return c16; - } - - /* Determine the amount of data in the buffer */ - length = (int32_t)(f->fUCLimit - f->fUCPos); - - /* The longest escape sequence is \Uhhhhhhhh; make sure - we have at least that many characters */ - if (length < 10) { - /* fill the buffer */ - ufile_fill_uchar_buffer(f); - length = (int32_t)(f->fUCLimit - f->fUCPos); + if (str->fPos < str->fLimit) { + *c32 = *(str->fPos)++; + if (U_IS_LEAD(*c32)) { + if (str->fPos < str->fLimit) { + UChar c16 = *(str->fPos)++; + *c32 = U16_GET_SUPPLEMENTARY(*c32, c16); + isValidChar = TRUE; + } + else { + *c32 = U_EOF; + } + } + else { + isValidChar = TRUE; + } } - /* Process the escape */ - offset = 0; - c32 = u_unescapeAt(_charAt, &offset, length, (void*)f); - - /* Update the current buffer position */ - f->fUCPos += offset; + return isValidChar; +} - return c32; +U_CAPI UChar32 U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ +u_fgetcx(UFILE *f) +{ + UChar32 ch; + ufile_getch32(f, &ch); + return ch; } -U_CAPI UChar U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ -u_fungetc(UChar c, +U_CAPI UChar32 U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ +u_fungetc(UChar32 ch, UFILE *f) { + u_localized_string *str; + + str = &f->str; + /* if we're at the beginning of the buffer, sorry! */ - if(f->fUCPos == f->fUCBuffer) - return 0xFFFF; - /* otherwise, put the character back */ + if (str->fPos == str->fBuffer + || (U_IS_LEAD(ch) && (str->fPos - 1) == str->fBuffer)) + { + ch = U_EOF; + } else { - *--(f->fUCPos) = c; - return c; + /* otherwise, put the character back */ + /* Remember, read them back on in the reverse order. */ + if (U_IS_LEAD(ch)) { + if (*--(str->fPos) != U16_TRAIL(ch) + || *--(str->fPos) != U16_LEAD(ch)) + { + ch = U_EOF; + } + } + else if (*--(str->fPos) != ch) { + ch = U_EOF; + } } + return ch; } U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ @@ -585,45 +668,34 @@ u_file_read( UChar *chars, UFILE *f) { int32_t dataSize; - int32_t read; - - /* fill the buffer */ - ufile_fill_uchar_buffer(f); - - /* determine the amount of data in the buffer */ - dataSize = (int32_t)(f->fUCLimit - f->fUCPos); - - /* if the buffer contains the amount requested, just copy */ - if(dataSize > count) { - memcpy(chars, f->fUCPos, count * sizeof(UChar)); - - /* update the current buffer position */ - f->fUCPos += count; + int32_t read = 0; + u_localized_string *str = &f->str; - /* return # of chars read */ - return count; - } - - /* otherwise, iteratively fill the buffer and copy */ - read = 0; do { /* determine the amount of data in the buffer */ - dataSize = (int32_t)(f->fUCLimit - f->fUCPos); + dataSize = (int32_t)(str->fLimit - str->fPos); + if (dataSize <= 0) { + /* fill the buffer */ + ufile_fill_uchar_buffer(f); + dataSize = (int32_t)(str->fLimit - str->fPos); + } + + /* Make sure that we don't read too much */ + if (dataSize > (count - read)) { + dataSize = count - read; + } /* copy the current data in the buffer */ - memcpy(chars + read, f->fUCPos, dataSize * sizeof(UChar)); + memcpy(chars + read, str->fPos, dataSize * sizeof(UChar)); /* update number of items read */ read += dataSize; /* update the current buffer position */ - f->fUCPos += dataSize; - - /* refill the buffer */ - ufile_fill_uchar_buffer(f); - - } while(dataSize != 0 && read < count); + str->fPos += dataSize; + } + while (dataSize != 0 && read < count); return read; } diff --git a/icuSources/io/ustream.cpp b/icuSources/io/ustream.cpp new file mode 100644 index 00000000..2a547ad4 --- /dev/null +++ b/icuSources/io/ustream.cpp @@ -0,0 +1,137 @@ +/* +********************************************************************** +* Copyright (C) 2001-2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* FILE NAME : ustream.cpp +* +* Modification History: +* +* Date Name Description +* 06/25/2001 grhoten Move iostream from unistr.h to here +****************************************************************************** +*/ + + +#include "unicode/utypes.h" +#include "unicode/uobject.h" +#include "unicode/ustream.h" +#include "unicode/ucnv.h" +#include "unicode/uchar.h" +#include "ustr_cnv.h" +#include + +// console IO + +#if U_IOSTREAM_SOURCE >= 198506 + +#if U_IOSTREAM_SOURCE >= 199711 +#define STD_NAMESPACE std:: +#else +#define STD_NAMESPACE +#endif + +#define STD_OSTREAM STD_NAMESPACE ostream +#define STD_ISTREAM STD_NAMESPACE istream + +U_NAMESPACE_BEGIN + +U_IO_API STD_OSTREAM & U_EXPORT2 +operator<<(STD_OSTREAM& stream, const UnicodeString& str) +{ + if(str.length() > 0) { + char buffer[200]; + UConverter *converter; + UErrorCode errorCode = U_ZERO_ERROR; + + // use the default converter to convert chunks of text + converter = u_getDefaultConverter(&errorCode); + if(U_SUCCESS(errorCode)) { + const UChar *us = str.getBuffer(); + const UChar *uLimit = us + str.length(); + char *s, *sLimit = buffer + sizeof(buffer); + do { + errorCode = U_ZERO_ERROR; + s = buffer; + ucnv_fromUnicode(converter, &s, sLimit, &us, uLimit, 0, FALSE, &errorCode); + + // write this chunk + if(s > buffer) { + stream.write(buffer, s - buffer); + } + } while(errorCode == U_BUFFER_OVERFLOW_ERROR); + u_releaseDefaultConverter(converter); + } + } + +/* stream.flush();*/ + return stream; +} + +U_IO_API STD_ISTREAM & U_EXPORT2 +operator>>(STD_ISTREAM& stream, UnicodeString& str) +{ + /* ipfx should eat whitespace when ios::skipws is set */ + UChar uBuffer[16]; + char buffer[16]; + int32_t idx = 0; + UConverter *converter; + UErrorCode errorCode = U_ZERO_ERROR; + + str.truncate(0); + // use the default converter to convert chunks of text + converter = u_getDefaultConverter(&errorCode); + if(U_SUCCESS(errorCode)) { + UChar *us = uBuffer; + const UChar *uLimit = uBuffer + sizeof(uBuffer)/sizeof(*uBuffer); + const char *s, *sLimit; + char ch; + UChar ch32; + UBool intialWhitespace = TRUE; + + /* We need to consume one byte at a time to see what is considered whitespace. */ + while (!stream.eof()) { + ch = stream.get(); + sLimit = &ch + 1; + errorCode = U_ZERO_ERROR; + us = uBuffer; + s = &ch; + ucnv_toUnicode(converter, &us, uLimit, &s, sLimit, 0, FALSE, &errorCode); + if(U_FAILURE(errorCode)) { + /* Something really bad happened */ + return stream; + } + /* Was the character consumed? */ + if (us != uBuffer) { + U16_GET(uBuffer, 0, 0, us-uBuffer, ch32); + if (u_isWhitespace(ch32)) { + if (!intialWhitespace) { + buffer[idx++] = ch; + while (idx > 0) { + stream.putback(buffer[--idx]); + } + break; + } + /* else skip intialWhitespace */ + } + else { + str.append(ch32); + intialWhitespace = FALSE; + } + idx = 0; + } + else { + buffer[idx++] = ch; + } + } + u_releaseDefaultConverter(converter); + } + +/* stream.flush();*/ + return stream; +} + +U_NAMESPACE_END + +#endif + diff --git a/icuSources/layout/AlternateSubstSubtables.cpp b/icuSources/layout/AlternateSubstSubtables.cpp index 9239db3d..81989cdd 100644 --- a/icuSources/layout/AlternateSubstSubtables.cpp +++ b/icuSources/layout/AlternateSubstSubtables.cpp @@ -1,7 +1,6 @@ /* - * @(#)AlternateSubstSubtables.cpp 1.7 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/AlternateSubstSubtables.h b/icuSources/layout/AlternateSubstSubtables.h index 403f3172..41e3bc94 100644 --- a/icuSources/layout/AlternateSubstSubtables.h +++ b/icuSources/layout/AlternateSubstSubtables.h @@ -1,7 +1,6 @@ /* - * @(#)AlternateSubstSubtables.h 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/AnchorTables.cpp b/icuSources/layout/AnchorTables.cpp index d9f6fb1b..94980da6 100644 --- a/icuSources/layout/AnchorTables.cpp +++ b/icuSources/layout/AnchorTables.cpp @@ -1,7 +1,6 @@ /* - * @(#)AnchorTables.cpp 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998, 1999, 2000, 2001 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -42,6 +41,9 @@ void AnchorTable::getAnchor(LEGlyphID glyphID, const LEFontInstance *fontInstanc } default: + // Unknown format, set the anchor point to (0, 0) + anchor.fX = 0; + anchor.fY = 0; break; } } diff --git a/icuSources/layout/AnchorTables.h b/icuSources/layout/AnchorTables.h index bdaf70c2..71825c5c 100644 --- a/icuSources/layout/AnchorTables.h +++ b/icuSources/layout/AnchorTables.h @@ -1,7 +1,6 @@ /* - * @(#)AnchorTables.h 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/ArabicLayoutEngine.cpp b/icuSources/layout/ArabicLayoutEngine.cpp index 7f65b988..265d884a 100644 --- a/icuSources/layout/ArabicLayoutEngine.cpp +++ b/icuSources/layout/ArabicLayoutEngine.cpp @@ -1,18 +1,19 @@ /* - * %W% %E% * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ #include "LETypes.h" #include "LEScripts.h" #include "LEGlyphFilter.h" +#include "LEGlyphStorage.h" #include "LayoutEngine.h" #include "OpenTypeLayoutEngine.h" #include "ArabicLayoutEngine.h" #include "ScriptAndLanguageTags.h" +#include "CharSubstitutionFilter.h" #include "GlyphSubstitutionTables.h" #include "GlyphDefinitionTables.h" @@ -21,41 +22,22 @@ #include "GDEFMarkFilter.h" #include "ArabicShaping.h" -#include "HebrewShaping.h" +#include "CanonShaping.h" U_NAMESPACE_BEGIN -class CharSubstitutionFilter : public UMemory, public LEGlyphFilter -{ -private: - const LEFontInstance *fFontInstance; - - CharSubstitutionFilter(const CharSubstitutionFilter &other); // forbid copying of this class - CharSubstitutionFilter &operator=(const CharSubstitutionFilter &other); // forbid copying of this class - -public: - CharSubstitutionFilter(const LEFontInstance *fontInstance); - le_bool accept(LEGlyphID glyph) const; -}; - -CharSubstitutionFilter::CharSubstitutionFilter(const LEFontInstance *fontInstance) - : fFontInstance(fontInstance) -{ - // nothing to do -} - le_bool CharSubstitutionFilter::accept(LEGlyphID glyph) const { return fFontInstance->canDisplay((LEUnicode) glyph); } -const char ArabicOpenTypeLayoutEngine::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ArabicOpenTypeLayoutEngine) ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const GlyphSubstitutionTableHeader *gsubTable) : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, gsubTable) { - // fFeatureOrder = ArabicShaping::getFeatureOrder(); + /**/ fFeatureOrder = ArabicShaping::getFeatureOrder(); } ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode) @@ -73,7 +55,7 @@ ArabicOpenTypeLayoutEngine::~ArabicOpenTypeLayoutEngine() // Output: characters, char indices, tags // Returns: output character count le_int32 ArabicOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&/*outChars*/, le_int32 *&/*charIndices*/, const LETag **&featureTags, LEErrorCode &success) + LEUnicode *&/*outChars*/, LEGlyphStorage &glyphStorage, LEErrorCode &success) { if (LE_FAILURE(success)) { return 0; @@ -84,90 +66,50 @@ le_int32 ArabicOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[] return 0; } - featureTags = LE_NEW_ARRAY(const LETag *, count); + glyphStorage.adoptGlyphCount(count); + glyphStorage.allocateAuxData(success); - if (featureTags == NULL) { + if (LE_FAILURE(success)) { success = LE_MEMORY_ALLOCATION_ERROR; return 0; } - switch (fScriptCode) { - case arabScriptCode: - { - GlyphShaper shaper(featureTags); - - // NOTE: may not need seperate shaper if always use tags... - // NOTE: shaper could allocate the feature tags... - ArabicShaping::shape(chars, offset, count, max, rightToLeft, shaper); - break; - } - - case hebrScriptCode: - HebrewShaping::shape(chars, offset, count, max, rightToLeft, featureTags); - break; - } + ArabicShaping::shape(chars, offset, count, max, rightToLeft, glyphStorage); return count; } void ArabicOpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, - LEGlyphID glyphs[], le_int32 glyphCount, float positions[], LEErrorCode &success) + LEGlyphStorage &glyphStorage, LEErrorCode &success) { if (LE_FAILURE(success)) { return; } - if (chars == NULL || glyphs == NULL || positions == NULL || offset < 0 || count < 0) { + if (chars == NULL || offset < 0 || count < 0) { success = LE_ILLEGAL_ARGUMENT_ERROR; return; } if (fGPOSTable != NULL) { - OpenTypeLayoutEngine::adjustGlyphPositions(chars, offset, count, reverse, glyphs, glyphCount, positions, success); + OpenTypeLayoutEngine::adjustGlyphPositions(chars, offset, count, reverse, glyphStorage, success); } else if (fGDEFTable != NULL) { GDEFMarkFilter filter(fGDEFTable); - adjustMarkGlyphs(glyphs, glyphCount, false, &filter, positions, success); + adjustMarkGlyphs(glyphStorage, &filter, success); } else { - GlyphDefinitionTableHeader *gdefTable = (GlyphDefinitionTableHeader *) ArabicShaping::glyphDefinitionTable; + GlyphDefinitionTableHeader *gdefTable = (GlyphDefinitionTableHeader *) CanonShaping::glyphDefinitionTable; GDEFMarkFilter filter(gdefTable); - LEGlyphID *tempGlyphs; - - // FIXME: we could avoid the memory allocation and copying here by - // making a clone of the adjustMarkGlyphs method which took characters - // directly... - tempGlyphs = LE_NEW_ARRAY(LEGlyphID, count); - - if (tempGlyphs == NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; - return; - } - for (le_int32 i = 0; i < count; i += 1) { - tempGlyphs[i] = (LEGlyphID) chars[offset + i]; - } - - adjustMarkGlyphs(tempGlyphs, count, reverse, &filter, positions, success); - - LE_DELETE_ARRAY(tempGlyphs); + adjustMarkGlyphs(&chars[offset], count, reverse, glyphStorage, &filter, success); } } UnicodeArabicOpenTypeLayoutEngine::UnicodeArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode) : ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode) { - switch (scriptCode) { - case arabScriptCode: - fGSUBTable = (const GlyphSubstitutionTableHeader *) ArabicShaping::glyphSubstitutionTable; - fGDEFTable = (const GlyphDefinitionTableHeader *) ArabicShaping::glyphDefinitionTable; - break; - - case hebrScriptCode: - fGSUBTable = (const GlyphSubstitutionTableHeader *) HebrewShaping::glyphSubstitutionTable; - fGDEFTable = (const GlyphDefinitionTableHeader *) HebrewShaping::glyphDefinitionTable; - break; - } - + fGSUBTable = (const GlyphSubstitutionTableHeader *) CanonShaping::glyphSubstitutionTable; + fGDEFTable = (const GlyphDefinitionTableHeader *) CanonShaping::glyphDefinitionTable; fSubstitutionFilter = new CharSubstitutionFilter(fontInstance); } @@ -178,21 +120,16 @@ UnicodeArabicOpenTypeLayoutEngine::~UnicodeArabicOpenTypeLayoutEngine() } // "glyphs", "indices" -> glyphs, indices -le_int32 UnicodeArabicOpenTypeLayoutEngine::glyphPostProcessing(LEGlyphID tempGlyphs[], le_int32 tempCharIndices[], le_int32 tempGlyphCount, - LEGlyphID *&glyphs, le_int32 *&charIndices, LEErrorCode &success) +le_int32 UnicodeArabicOpenTypeLayoutEngine::glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success) { if (LE_FAILURE(success)) { return 0; } - if (tempGlyphs == NULL || tempCharIndices == NULL ||tempGlyphCount < 0) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - // FIXME: we could avoid the memory allocation and copy if we // made a clone of mapCharsToGlyphs which took the fake glyphs // directly. + le_int32 tempGlyphCount = tempGlyphStorage.getGlyphCount(); LEUnicode *tempChars = LE_NEW_ARRAY(LEUnicode, tempGlyphCount); if (tempChars == NULL) { @@ -201,19 +138,19 @@ le_int32 UnicodeArabicOpenTypeLayoutEngine::glyphPostProcessing(LEGlyphID tempGl } for (le_int32 i = 0; i < tempGlyphCount; i += 1) { - tempChars[i] = (LEUnicode) LE_GET_GLYPH(tempGlyphs[i]); + tempChars[i] = (LEUnicode) LE_GET_GLYPH(tempGlyphStorage[i]); } - charIndices = tempCharIndices; + glyphStorage.adoptCharIndicesArray(tempGlyphStorage); - ArabicOpenTypeLayoutEngine::mapCharsToGlyphs(tempChars, 0, tempGlyphCount, false, true, glyphs, charIndices, success); + ArabicOpenTypeLayoutEngine::mapCharsToGlyphs(tempChars, 0, tempGlyphCount, FALSE, TRUE, glyphStorage, success); LE_DELETE_ARRAY(tempChars); return tempGlyphCount; } -void UnicodeArabicOpenTypeLayoutEngine::mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, le_bool /*mirror*/, LEGlyphID *&glyphs, le_int32 *&charIndices, LEErrorCode &success) +void UnicodeArabicOpenTypeLayoutEngine::mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, le_bool /*mirror*/, LEGlyphStorage &glyphStorage, LEErrorCode &success) { if (LE_FAILURE(success)) { return; @@ -224,68 +161,35 @@ void UnicodeArabicOpenTypeLayoutEngine::mapCharsToGlyphs(const LEUnicode chars[] return; } - le_int32 i, dir, out; - - out = 0; - dir = 1; + le_int32 i, dir = 1, out = 0; if (reverse) { out = count - 1; dir = -1; } - glyphs = LE_NEW_ARRAY(LEGlyphID, count); - - if (glyphs == NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; - return; - } - - charIndices = LE_NEW_ARRAY(le_int32, count); - - if (charIndices == NULL) { - LE_DELETE_ARRAY(glyphs); - success = LE_MEMORY_ALLOCATION_ERROR; - return; - } + glyphStorage.allocateGlyphArray(count, reverse, success); for (i = 0; i < count; i += 1, out += dir) { - glyphs[out] = (LEGlyphID) chars[offset + i]; - charIndices[out] = i; + glyphStorage[out] = (LEGlyphID) chars[offset + i]; } } void UnicodeArabicOpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, - LEGlyphID glyphs[], le_int32 glyphCount, float positions[], LEErrorCode &success) + LEGlyphStorage &glyphStorage, LEErrorCode &success) { if (LE_FAILURE(success)) { return; } - if (chars == NULL || glyphs == NULL || positions == NULL || offset < 0 || count < 0 || glyphCount < 0) { + if (chars == NULL || offset < 0 || count < 0) { success = LE_ILLEGAL_ARGUMENT_ERROR; return; } GDEFMarkFilter filter(fGDEFTable); - // FIXME: we could avoid the memory allocation and copying here by - // making a clone of the adjustMarkGlyphs method which took characters - // directly... - LEGlyphID *tempGlyphs = LE_NEW_ARRAY(LEGlyphID, count); - - if (tempGlyphs == NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; - return; - } - - for (le_int32 i = 0; i < count; i += 1) { - tempGlyphs[i] = (LEGlyphID) chars[offset + i]; - } - - adjustMarkGlyphs(tempGlyphs, count, reverse, &filter, positions, success); - - LE_DELETE_ARRAY(tempGlyphs); + adjustMarkGlyphs(&chars[offset], count, reverse, glyphStorage, &filter, success); } U_NAMESPACE_END diff --git a/icuSources/layout/ArabicLayoutEngine.h b/icuSources/layout/ArabicLayoutEngine.h index 7cd7fe78..3a115567 100644 --- a/icuSources/layout/ArabicLayoutEngine.h +++ b/icuSources/layout/ArabicLayoutEngine.h @@ -1,8 +1,7 @@ /* - * @(#)ArabicLayoutEngine.h 1.3 00/03/15 * - * (C) Copyright IBM Corp. 1998, 1999, 2000, 2001, 2002 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -77,16 +76,16 @@ public: /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } + static UClassID getStaticClassID(); protected: @@ -99,7 +98,7 @@ protected: * @param offset - the index of the first character to process * @param count - the number of characters to process * @param max - the number of characters in the input context - * @param rightToLeft - true if the characters are in a right to left directional run + * @param rightToLeft - TRUE if the characters are in a right to left directional run * * Output parameters: * @param outChars - the output character arrayt @@ -112,7 +111,7 @@ protected: * @internal */ virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, le_int32 *&charIndices, const LETag **&featureTags, LEErrorCode &success); + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); /** * This method applies the GPOS table if it is present, otherwise it ensures that all vowel @@ -123,7 +122,7 @@ protected: * @param chars - the input character context * @param offset - the offset of the first character to process * @param count - the number of characters to process - * @param reverse - true if the glyphs in the glyph array have been reordered + * @param reverse - TRUE if the glyphs in the glyph array have been reordered * @param glyphs - the input glyph array * @param glyphCount - the number of glyphs * @param positions - the position array, will be updated as needed @@ -131,15 +130,10 @@ protected: * * @internal */ - virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphID glyphs[], le_int32 glyphCount, float positions[], LEErrorCode &success); + virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success); -private: + // static void adjustMarkGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success); - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; /** @@ -199,8 +193,7 @@ protected: * * @internal */ - virtual le_int32 glyphPostProcessing(LEGlyphID tempGlyphs[], le_int32 tempCharIndices[], le_int32 tempGlyphCount, - LEGlyphID *&glyphs, le_int32 *&charIndices, LEErrorCode &success); + virtual le_int32 glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success); /** * This method copies the input characters into the output glyph index array, @@ -210,18 +203,16 @@ protected: * @param chars - the input character context * @param offset - the offset of the first character to be mapped * @param count - the number of characters to be mapped - * @param reverse - if true, the output will be in reverse order - * @param mirror - if true, do character mirroring + * @param reverse - if TRUE, the output will be in reverse order + * @param mirror - if TRUE, do character mirroring + * @param glyphStorage - the glyph storage object. Glyph and char index arrays will be updated. * - * Output parameters: - * @param glyphs - the glyph array - * @param charIndices - the character index array * @param success - set to an error code if the operation fails * * @internal */ virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, le_bool mirror, - LEGlyphID *&glyphs, le_int32 *&charIndices, LEErrorCode &success); + LEGlyphStorage &glyphStorage, LEErrorCode &success); /** * This method ensures that all vowel and accent glyphs have a zero advance width by calling @@ -231,15 +222,13 @@ protected: * @param chars - the input character context * @param offset - the offset of the first character to process * @param count - the number of characters to process - * @param reverse - true if the glyphs in the glyph array have been reordered - * @param glyphs - the input glyph array - * @param glyphCount - the number of glyphs - * @param positions - the position array, will be updated as needed + * @param reverse - TRUE if the glyphs in the glyph array have been reordered + * @param glyphStorage - the glyph storage object. The glyph positions will be updated as needed. * @param success - output parameter set to an error code if the operation fails * * @internal */ - virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphID glyphs[], le_int32 glyphCount, float positions[], LEErrorCode &success); + virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success); }; U_NAMESPACE_END diff --git a/icuSources/layout/ArabicLigatureData.cpp b/icuSources/layout/ArabicLigatureData.cpp deleted file mode 100644 index 76f4cc3d..00000000 --- a/icuSources/layout/ArabicLigatureData.cpp +++ /dev/null @@ -1,365 +0,0 @@ -/* - * %W% %E% - * - * (C) Copyright IBM Corp. 1998, 1999, 2000, 2001, 2002 - All Rights Reserved - * - * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS - * YOU REALLY KNOW WHAT YOU'RE DOING. - * - */ - -#include "LETypes.h" -#include "ArabicShaping.h" - -U_NAMESPACE_BEGIN - -const le_uint8 ArabicShaping::glyphSubstitutionTable[] = { - 0x00, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x24, 0x00, 0x56, 0x00, 0x01, 0x61, 0x72, 0x61, 0x62, - 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, - 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x66, 0x69, 0x6E, 0x61, 0x00, 0x1A, 0x69, 0x6E, 0x69, 0x74, - 0x00, 0x20, 0x6C, 0x69, 0x67, 0x61, 0x00, 0x26, 0x6D, 0x65, 0x64, 0x69, 0x00, 0x2C, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x0A, 0x00, 0xD4, 0x01, 0x9E, 0x02, 0xD8, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x62, 0x00, 0x2E, 0xFE, 0x8B, - 0xFE, 0x91, 0xFE, 0x97, 0xFE, 0x9B, 0xFE, 0x9F, 0xFE, 0xA3, 0xFE, 0xA7, 0xFE, 0xB3, 0xFE, 0xB7, - 0xFE, 0xBB, 0xFE, 0xBF, 0xFE, 0xC3, 0xFE, 0xC7, 0xFE, 0xCB, 0xFE, 0xCF, 0xFE, 0xD3, 0xFE, 0xD7, - 0xFE, 0xDB, 0xFE, 0xDF, 0xFE, 0xE3, 0xFE, 0xE7, 0xFE, 0xEB, 0xFB, 0xE8, 0xFE, 0xF3, 0xFB, 0x68, - 0xFB, 0x60, 0xFB, 0x54, 0xFB, 0x58, 0xFB, 0x64, 0xFB, 0x5C, 0xFB, 0x78, 0xFB, 0x74, 0xFB, 0x7C, - 0xFB, 0x80, 0xFB, 0x6C, 0xFB, 0x70, 0xFB, 0x90, 0xFB, 0xD5, 0xFB, 0x94, 0xFB, 0x9C, 0xFB, 0x98, - 0xFB, 0xA2, 0xFB, 0xAC, 0xFB, 0xA8, 0xFB, 0xFE, 0xFB, 0xE6, 0x00, 0x01, 0x00, 0x2E, 0x06, 0x26, - 0x06, 0x28, 0x06, 0x2A, 0x06, 0x2B, 0x06, 0x2C, 0x06, 0x2D, 0x06, 0x2E, 0x06, 0x33, 0x06, 0x34, - 0x06, 0x35, 0x06, 0x36, 0x06, 0x37, 0x06, 0x38, 0x06, 0x39, 0x06, 0x3A, 0x06, 0x41, 0x06, 0x42, - 0x06, 0x43, 0x06, 0x44, 0x06, 0x45, 0x06, 0x46, 0x06, 0x47, 0x06, 0x49, 0x06, 0x4A, 0x06, 0x79, - 0x06, 0x7A, 0x06, 0x7B, 0x06, 0x7E, 0x06, 0x7F, 0x06, 0x80, 0x06, 0x83, 0x06, 0x84, 0x06, 0x86, - 0x06, 0x87, 0x06, 0xA4, 0x06, 0xA6, 0x06, 0xA9, 0x06, 0xAD, 0x06, 0xAF, 0x06, 0xB1, 0x06, 0xB3, - 0x06, 0xBB, 0x06, 0xBE, 0x06, 0xC1, 0x06, 0xCC, 0x06, 0xD0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x08, 0x00, 0x02, 0x00, 0x62, 0x00, 0x2E, 0xFE, 0x8C, 0xFE, 0x92, 0xFE, 0x98, 0xFE, 0x9C, - 0xFE, 0xA0, 0xFE, 0xA4, 0xFE, 0xA8, 0xFE, 0xB4, 0xFE, 0xB8, 0xFE, 0xBC, 0xFE, 0xC0, 0xFE, 0xC4, - 0xFE, 0xC8, 0xFE, 0xCC, 0xFE, 0xD0, 0xFE, 0xD4, 0xFE, 0xD8, 0xFE, 0xDC, 0xFE, 0xE0, 0xFE, 0xE4, - 0xFE, 0xE8, 0xFE, 0xEC, 0xFB, 0xE9, 0xFE, 0xF4, 0xFB, 0x69, 0xFB, 0x61, 0xFB, 0x55, 0xFB, 0x59, - 0xFB, 0x65, 0xFB, 0x5D, 0xFB, 0x79, 0xFB, 0x75, 0xFB, 0x7D, 0xFB, 0x81, 0xFB, 0x6D, 0xFB, 0x71, - 0xFB, 0x91, 0xFB, 0xD6, 0xFB, 0x95, 0xFB, 0x9D, 0xFB, 0x99, 0xFB, 0xA3, 0xFB, 0xAD, 0xFB, 0xA9, - 0xFB, 0xFF, 0xFB, 0xE7, 0x00, 0x01, 0x00, 0x2E, 0x06, 0x26, 0x06, 0x28, 0x06, 0x2A, 0x06, 0x2B, - 0x06, 0x2C, 0x06, 0x2D, 0x06, 0x2E, 0x06, 0x33, 0x06, 0x34, 0x06, 0x35, 0x06, 0x36, 0x06, 0x37, - 0x06, 0x38, 0x06, 0x39, 0x06, 0x3A, 0x06, 0x41, 0x06, 0x42, 0x06, 0x43, 0x06, 0x44, 0x06, 0x45, - 0x06, 0x46, 0x06, 0x47, 0x06, 0x49, 0x06, 0x4A, 0x06, 0x79, 0x06, 0x7A, 0x06, 0x7B, 0x06, 0x7E, - 0x06, 0x7F, 0x06, 0x80, 0x06, 0x83, 0x06, 0x84, 0x06, 0x86, 0x06, 0x87, 0x06, 0xA4, 0x06, 0xA6, - 0x06, 0xA9, 0x06, 0xAD, 0x06, 0xAF, 0x06, 0xB1, 0x06, 0xB3, 0x06, 0xBB, 0x06, 0xBE, 0x06, 0xC1, - 0x06, 0xCC, 0x06, 0xD0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x9A, - 0x00, 0x4A, 0xFE, 0x82, 0xFE, 0x84, 0xFE, 0x86, 0xFE, 0x88, 0xFE, 0x8A, 0xFE, 0x8E, 0xFE, 0x90, - 0xFE, 0x94, 0xFE, 0x96, 0xFE, 0x9A, 0xFE, 0x9E, 0xFE, 0xA2, 0xFE, 0xA6, 0xFE, 0xAA, 0xFE, 0xAC, - 0xFE, 0xAE, 0xFE, 0xB0, 0xFE, 0xB2, 0xFE, 0xB6, 0xFE, 0xBA, 0xFE, 0xBE, 0xFE, 0xC2, 0xFE, 0xC6, - 0xFE, 0xCA, 0xFE, 0xCE, 0xFE, 0xD2, 0xFE, 0xD6, 0xFE, 0xDA, 0xFE, 0xDE, 0xFE, 0xE2, 0xFE, 0xE6, - 0xFE, 0xEA, 0xFE, 0xEE, 0xFE, 0xF0, 0xFE, 0xF2, 0xFB, 0x51, 0xFB, 0x67, 0xFB, 0x5F, 0xFB, 0x53, - 0xFB, 0x57, 0xFB, 0x63, 0xFB, 0x5B, 0xFB, 0x77, 0xFB, 0x73, 0xFB, 0x7B, 0xFB, 0x7F, 0xFB, 0x89, - 0xFB, 0x85, 0xFB, 0x83, 0xFB, 0x87, 0xFB, 0x8D, 0xFB, 0x8B, 0xFB, 0x6B, 0xFB, 0x6F, 0xFB, 0x8F, - 0xFB, 0xD4, 0xFB, 0x93, 0xFB, 0x9B, 0xFB, 0x97, 0xFB, 0x9F, 0xFB, 0xA1, 0xFB, 0xAB, 0xFB, 0xA5, - 0xFB, 0xA7, 0xFB, 0xE1, 0xFB, 0xDA, 0xFB, 0xD8, 0xFB, 0xDC, 0xFB, 0xE3, 0xFB, 0xDF, 0xFB, 0xFD, - 0xFB, 0xE5, 0xFB, 0xAF, 0xFB, 0xB1, 0x00, 0x01, 0x00, 0x4A, 0x06, 0x22, 0x06, 0x23, 0x06, 0x24, - 0x06, 0x25, 0x06, 0x26, 0x06, 0x27, 0x06, 0x28, 0x06, 0x29, 0x06, 0x2A, 0x06, 0x2B, 0x06, 0x2C, - 0x06, 0x2D, 0x06, 0x2E, 0x06, 0x2F, 0x06, 0x30, 0x06, 0x31, 0x06, 0x32, 0x06, 0x33, 0x06, 0x34, - 0x06, 0x35, 0x06, 0x36, 0x06, 0x37, 0x06, 0x38, 0x06, 0x39, 0x06, 0x3A, 0x06, 0x41, 0x06, 0x42, - 0x06, 0x43, 0x06, 0x44, 0x06, 0x45, 0x06, 0x46, 0x06, 0x47, 0x06, 0x48, 0x06, 0x49, 0x06, 0x4A, - 0x06, 0x71, 0x06, 0x79, 0x06, 0x7A, 0x06, 0x7B, 0x06, 0x7E, 0x06, 0x7F, 0x06, 0x80, 0x06, 0x83, - 0x06, 0x84, 0x06, 0x86, 0x06, 0x87, 0x06, 0x88, 0x06, 0x8C, 0x06, 0x8D, 0x06, 0x8E, 0x06, 0x91, - 0x06, 0x98, 0x06, 0xA4, 0x06, 0xA6, 0x06, 0xA9, 0x06, 0xAD, 0x06, 0xAF, 0x06, 0xB1, 0x06, 0xB3, - 0x06, 0xBA, 0x06, 0xBB, 0x06, 0xBE, 0x06, 0xC0, 0x06, 0xC1, 0x06, 0xC5, 0x06, 0xC6, 0x06, 0xC7, - 0x06, 0xC8, 0x06, 0xC9, 0x06, 0xCB, 0x06, 0xCC, 0x06, 0xD0, 0x06, 0xD2, 0x06, 0xD3, 0x00, 0x04, - 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x10, 0xEA, 0x00, 0x38, 0x00, 0x76, 0x00, 0xB4, - 0x00, 0xD4, 0x00, 0xDE, 0x00, 0xE8, 0x01, 0x72, 0x01, 0xE4, 0x02, 0x06, 0x02, 0x10, 0x02, 0x6A, - 0x02, 0xC0, 0x03, 0x60, 0x03, 0xE8, 0x04, 0x12, 0x04, 0x54, 0x04, 0xA4, 0x04, 0xE8, 0x05, 0x1A, - 0x05, 0x4A, 0x05, 0x84, 0x05, 0x96, 0x05, 0xA0, 0x05, 0xB6, 0x06, 0x4A, 0x06, 0xBE, 0x07, 0x3E, - 0x07, 0xD2, 0x08, 0x70, 0x08, 0xA8, 0x09, 0x0C, 0x09, 0x44, 0x09, 0x8A, 0x09, 0xB8, 0x09, 0xCA, - 0x09, 0xD4, 0x0A, 0x26, 0x0A, 0x60, 0x0A, 0x92, 0x0A, 0xC2, 0x0B, 0x1E, 0x0B, 0x44, 0x0B, 0x8A, - 0x0B, 0xBA, 0x0C, 0x2E, 0x0C, 0x7C, 0x0D, 0x28, 0x0D, 0xC4, 0x0E, 0x68, 0x0E, 0xA2, 0x0F, 0x1A, - 0x0F, 0xAC, 0x0F, 0xFA, 0x10, 0x08, 0x10, 0x12, 0x10, 0x1C, 0x10, 0x80, 0x00, 0x06, 0x00, 0x0E, - 0x00, 0x16, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2E, 0x00, 0x36, 0xFC, 0x5E, 0x00, 0x03, 0x06, 0x51, - 0x06, 0x4C, 0xFC, 0x5F, 0x00, 0x03, 0x06, 0x51, 0x06, 0x4D, 0xFC, 0x60, 0x00, 0x03, 0x06, 0x51, - 0x06, 0x4E, 0xFC, 0x61, 0x00, 0x03, 0x06, 0x51, 0x06, 0x4F, 0xFC, 0x62, 0x00, 0x03, 0x06, 0x51, - 0x06, 0x50, 0xFC, 0x63, 0x00, 0x03, 0x06, 0x51, 0x06, 0x70, 0x00, 0x03, 0x00, 0x08, 0x00, 0x10, - 0x00, 0x18, 0xFC, 0xF2, 0x00, 0x03, 0x06, 0x51, 0x06, 0x4E, 0xFC, 0xF3, 0x00, 0x03, 0x06, 0x51, - 0x06, 0x4F, 0xFC, 0xF4, 0x00, 0x03, 0x06, 0x51, 0x06, 0x50, 0x00, 0x01, 0x00, 0x04, 0xFB, 0xEC, - 0x00, 0x02, 0x06, 0xD5, 0x00, 0x01, 0x00, 0x04, 0xFB, 0xED, 0x00, 0x02, 0x06, 0xD5, 0x00, 0x11, - 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, - 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6C, 0x00, 0x72, 0x00, 0x78, 0x00, 0x7E, - 0x00, 0x84, 0xFB, 0xF0, 0x00, 0x02, 0xFB, 0xD8, 0xFB, 0xF2, 0x00, 0x02, 0xFB, 0xDA, 0xFB, 0xF4, - 0x00, 0x02, 0xFB, 0xDC, 0xFB, 0xF6, 0x00, 0x02, 0xFB, 0xE5, 0xFB, 0xF8, 0x00, 0x02, 0xFB, 0xE7, - 0xFB, 0xEA, 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x00, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0x97, 0x00, 0x02, - 0xFE, 0xA0, 0xFC, 0x01, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0x98, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x99, - 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x02, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0x9A, 0x00, 0x02, 0xFE, 0xE4, - 0xFC, 0x9B, 0x00, 0x02, 0xFE, 0xEC, 0xFB, 0xEE, 0x00, 0x02, 0xFE, 0xEE, 0xFC, 0x03, 0x00, 0x02, - 0xFE, 0xF0, 0xFC, 0x04, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, - 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, - 0x00, 0x60, 0x00, 0x66, 0x00, 0x6C, 0xFB, 0xF1, 0x00, 0x02, 0xFB, 0xD8, 0xFB, 0xF3, 0x00, 0x02, - 0xFB, 0xDA, 0xFB, 0xF5, 0x00, 0x02, 0xFB, 0xDC, 0xFB, 0xF7, 0x00, 0x02, 0xFB, 0xE5, 0xFB, 0xEB, - 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x64, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x65, 0x00, 0x02, 0xFE, 0xB0, - 0xFC, 0x66, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xDF, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x67, 0x00, 0x02, - 0xFE, 0xE6, 0xFC, 0xE0, 0x00, 0x02, 0xFE, 0xEC, 0xFB, 0xEF, 0x00, 0x02, 0xFE, 0xEE, 0xFC, 0x68, - 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x69, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, - 0x00, 0x18, 0xFD, 0x3D, 0x00, 0x02, 0x06, 0x4B, 0xFD, 0xF3, 0x00, 0x04, 0xFE, 0xDB, 0xFE, 0x92, - 0xFE, 0xAE, 0xFD, 0xF2, 0x00, 0x04, 0xFE, 0xDF, 0xFE, 0xE0, 0xFE, 0xEA, 0x00, 0x01, 0x00, 0x04, - 0xFD, 0x3C, 0x00, 0x02, 0x06, 0x4B, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, - 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0xFC, 0x05, - 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0x9C, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x06, 0x00, 0x02, 0xFE, 0xA2, - 0xFC, 0x9D, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x07, 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0x9E, 0x00, 0x02, - 0xFE, 0xA8, 0xFC, 0x08, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0x9F, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xA0, - 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x09, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x0A, 0x00, 0x02, 0xFE, 0xF2, - 0x00, 0x0A, 0x00, 0x16, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, - 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0xFD, 0xC2, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x9E, - 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, 0xFC, 0x6A, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x6B, 0x00, 0x02, - 0xFE, 0xB0, 0xFC, 0x6C, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xE1, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x6D, - 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xE2, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x6E, 0x00, 0x02, 0xFE, 0xF0, - 0xFC, 0x6F, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x12, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3A, - 0x00, 0x40, 0x00, 0x48, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6A, 0x00, 0x70, - 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x8E, 0x00, 0x94, 0x00, 0x9A, 0xFC, 0x0B, 0x00, 0x02, - 0xFE, 0x9E, 0xFD, 0x50, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xA1, 0x00, 0x02, 0xFE, 0xA0, - 0xFC, 0x0C, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x52, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA0, 0xFD, 0x53, - 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4, 0xFC, 0xA2, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x0D, 0x00, 0x02, - 0xFE, 0xA6, 0xFD, 0x54, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xA3, 0x00, 0x02, 0xFE, 0xA8, - 0xFC, 0x0E, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x55, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA0, 0xFD, 0x56, - 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFD, 0x57, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA8, 0xFC, 0xA4, - 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xA5, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x0F, 0x00, 0x02, 0xFE, 0xF0, - 0xFC, 0x10, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0F, 0x00, 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, - 0x00, 0x40, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x70, - 0x00, 0x76, 0x00, 0x7C, 0x00, 0x82, 0xFD, 0xA0, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF0, 0xFD, 0x9F, - 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x51, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0x9E, 0xFD, 0xA2, - 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF0, 0xFD, 0xA1, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, 0xFC, 0x70, - 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x71, 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x72, 0x00, 0x02, 0xFE, 0xE2, - 0xFD, 0xA4, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0xA3, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, - 0xFC, 0xE3, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x73, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xE4, 0x00, 0x02, - 0xFE, 0xEC, 0xFC, 0x74, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x75, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, - 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0xFC, 0x11, 0x00, 0x02, 0xFE, 0x9E, - 0xFC, 0x12, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xA6, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x13, 0x00, 0x02, - 0xFE, 0xF0, 0xFC, 0x14, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, - 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0xFC, 0x76, 0x00, 0x02, 0xFE, 0xAE, - 0xFC, 0x77, 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x78, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xE5, 0x00, 0x02, - 0xFE, 0xE4, 0xFC, 0x79, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xE6, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x7A, - 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x7B, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, - 0x00, 0x1E, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0xFC, 0x15, 0x00, 0x02, - 0xFE, 0xA2, 0xFC, 0xA7, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0xFB, 0x00, 0x08, 0xFE, 0xDE, 0x00, 0x20, - 0xFE, 0x9F, 0xFE, 0xE0, 0xFE, 0x8E, 0xFE, 0xDF, 0xFE, 0xEA, 0xFC, 0x16, 0x00, 0x02, 0xFE, 0xE2, - 0xFD, 0x59, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFC, 0xA8, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x01, - 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x02, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x07, 0x00, 0x10, 0x00, 0x18, - 0x00, 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0xFD, 0xA6, 0x00, 0x03, 0xFE, 0xA4, - 0xFE, 0xF0, 0xFD, 0xBE, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x58, 0x00, 0x03, 0xFE, 0xE4, - 0xFE, 0xA2, 0xFD, 0xA7, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0xA5, 0x00, 0x03, 0xFE, 0xE4, - 0xFE, 0xF2, 0xFD, 0x1D, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x1E, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, - 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0xFC, 0x17, 0x00, 0x02, - 0xFE, 0x9E, 0xFC, 0xA9, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x18, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xAA, - 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xFF, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x00, 0x00, 0x02, 0xFE, 0xF2, - 0x00, 0x05, 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0xFD, 0xBF, 0x00, 0x03, - 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x5B, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0x5A, 0x00, 0x03, - 0xFE, 0xE4, 0xFE, 0xF2, 0xFD, 0x1B, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x1C, 0x00, 0x02, 0xFE, 0xF2, - 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, - 0xFC, 0x19, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xAB, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x1A, 0x00, 0x02, - 0xFE, 0xA2, 0xFC, 0x1B, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xAC, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x03, - 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x04, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, - 0xFD, 0x1F, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x20, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x01, 0x00, 0x04, - 0xFC, 0x5B, 0x00, 0x02, 0x06, 0x70, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFC, 0x5C, 0x00, 0x02, - 0x06, 0x70, 0xFD, 0xF6, 0x00, 0x04, 0xFE, 0xB3, 0xFE, 0xEE, 0xFE, 0xDD, 0x00, 0x11, 0x00, 0x24, - 0x00, 0x2A, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, - 0x00, 0x5E, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x88, 0x00, 0x8E, - 0xFC, 0x1C, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x5D, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA4, 0xFC, 0xAD, - 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x1D, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x5C, 0x00, 0x03, 0xFE, 0xA4, - 0xFE, 0xA0, 0xFC, 0xAE, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x1E, 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0xAF, - 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x0E, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x1F, 0x00, 0x02, 0xFE, 0xE2, - 0xFD, 0x61, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA0, 0xFD, 0x60, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, - 0xFD, 0x63, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xB0, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x31, - 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0xFB, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xFC, 0x00, 0x02, 0xFE, 0xF2, - 0x00, 0x0D, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x46, - 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, 0xFD, 0x5E, 0x00, 0x03, - 0xFE, 0xA0, 0xFE, 0xF0, 0xFD, 0x34, 0x00, 0x02, 0xFE, 0xA0, 0xFD, 0x35, 0x00, 0x02, 0xFE, 0xA4, - 0xFD, 0xA8, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF0, 0xFD, 0xC6, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, - 0xFD, 0x36, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x2A, 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x5F, 0x00, 0x03, - 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0x62, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFC, 0xE7, 0x00, 0x02, - 0xFE, 0xE4, 0xFC, 0xE8, 0x00, 0x02, 0xFE, 0xEC, 0xFD, 0x17, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x18, - 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0F, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x3A, - 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x60, 0x00, 0x68, 0x00, 0x6E, - 0x00, 0x74, 0x00, 0x7A, 0xFD, 0x09, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x2D, 0x00, 0x02, 0xFE, 0xA0, - 0xFD, 0x0A, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x68, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4, 0xFD, 0x2E, - 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0x0B, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x2F, 0x00, 0x02, 0xFE, 0xA8, - 0xFD, 0x0D, 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x0C, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x6B, 0x00, 0x03, - 0xFE, 0xE4, 0xFE, 0xA8, 0xFD, 0x6D, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFD, 0x30, 0x00, 0x02, - 0xFE, 0xE4, 0xFD, 0x32, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0xFD, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xFE, - 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x11, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, - 0x00, 0x46, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6C, 0x00, 0x74, - 0x00, 0x7C, 0x00, 0x82, 0x00, 0x88, 0x00, 0x8E, 0xFD, 0x25, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x69, - 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x37, 0x00, 0x02, 0xFE, 0xA0, 0xFD, 0x26, 0x00, 0x02, - 0xFE, 0xA2, 0xFD, 0x67, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE2, 0xFD, 0xAA, 0x00, 0x03, 0xFE, 0xA4, - 0xFE, 0xF2, 0xFD, 0x38, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0x27, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x39, - 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x29, 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x28, 0x00, 0x02, 0xFE, 0xE2, - 0xFD, 0x6A, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA6, 0xFD, 0x6C, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, - 0xFC, 0xE9, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xEA, 0x00, 0x02, 0xFE, 0xEC, 0xFD, 0x19, 0x00, 0x02, - 0xFE, 0xF0, 0xFD, 0x1A, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C, - 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x50, 0x00, 0x76, 0x00, 0x7E, 0x00, 0x84, - 0x00, 0x8C, 0x00, 0x92, 0x00, 0x98, 0xFC, 0x20, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x65, 0x00, 0x03, - 0xFE, 0xA4, 0xFE, 0xA4, 0xFC, 0xB1, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0xB2, 0x00, 0x02, 0xFE, 0xA8, - 0xFD, 0x0F, 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0xF0, 0x00, 0x03, 0xFE, 0xE0, 0xFB, 0xAF, 0xFD, 0xF5, - 0x00, 0x04, 0xFE, 0xE0, 0xFE, 0xCC, 0xFE, 0xE2, 0xFD, 0xFA, 0x00, 0x12, 0xFE, 0xE0, 0xFE, 0xF0, - 0x00, 0x20, 0xFE, 0x8D, 0xFE, 0xDF, 0xFE, 0xE0, 0xFE, 0xEA, 0x00, 0x20, 0xFE, 0xCB, 0xFE, 0xE0, - 0xFE, 0xF4, 0xFE, 0xEA, 0x00, 0x20, 0xFE, 0xED, 0xFE, 0xB3, 0xFE, 0xE0, 0xFE, 0xE2, 0xFD, 0xF9, - 0x00, 0x03, 0xFE, 0xE0, 0xFE, 0xF0, 0xFC, 0x21, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xC5, 0x00, 0x03, - 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xB3, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x05, 0x00, 0x02, 0xFE, 0xF0, - 0xFD, 0x06, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x16, 0x00, 0x1E, 0x00, 0x24, - 0x00, 0x2C, 0x00, 0x32, 0xFD, 0x64, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA2, 0xFD, 0xA9, 0x00, 0x03, - 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x2B, 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x66, 0x00, 0x03, 0xFE, 0xE4, - 0xFE, 0xE2, 0xFD, 0x21, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x22, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0C, - 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x40, 0x00, 0x46, - 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, 0xFC, 0x22, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xB4, - 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x23, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xB5, 0x00, 0x02, 0xFE, 0xA4, - 0xFC, 0x24, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x70, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xB6, - 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x10, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x25, 0x00, 0x02, 0xFE, 0xE2, - 0xFC, 0xB7, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x07, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x08, 0x00, 0x02, - 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x16, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, - 0xFD, 0x6E, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF0, 0xFD, 0xAB, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, - 0xFD, 0x6F, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE2, 0xFD, 0x2C, 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x23, - 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x24, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, - 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0xFC, 0x26, 0x00, 0x02, - 0xFE, 0xA2, 0xFC, 0xB8, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x27, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x72, - 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFD, 0x73, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFD, 0x33, - 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xF5, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xF6, 0x00, 0x02, 0xFE, 0xF2, - 0x00, 0x05, 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0xFD, 0x71, 0x00, 0x03, - 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0x74, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFD, 0x3A, 0x00, 0x02, - 0xFE, 0xE4, 0xFD, 0x11, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x12, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x02, - 0x00, 0x06, 0x00, 0x0C, 0xFC, 0x28, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xB9, 0x00, 0x02, 0xFE, 0xE4, - 0x00, 0x01, 0x00, 0x04, 0xFD, 0x3B, 0x00, 0x02, 0xFE, 0xE4, 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, - 0x00, 0x22, 0x00, 0x28, 0x00, 0x32, 0x00, 0x38, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0xFC, 0x29, - 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0xC4, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xBA, 0x00, 0x02, - 0xFE, 0xA0, 0xFD, 0xF7, 0x00, 0x04, 0xFE, 0xE0, 0xFE, 0xF4, 0xFE, 0xEA, 0xFC, 0x2A, 0x00, 0x02, - 0xFE, 0xE2, 0xFD, 0x77, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xBB, 0x00, 0x02, 0xFE, 0xE4, - 0xFC, 0xF7, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xF8, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, - 0x00, 0x16, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2E, 0x00, 0x34, 0xFD, 0x75, 0x00, 0x03, 0xFE, 0xA0, - 0xFE, 0xE2, 0xFD, 0x76, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0x78, 0x00, 0x03, 0xFE, 0xE4, - 0xFE, 0xF0, 0xFD, 0xB6, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFD, 0x13, 0x00, 0x02, 0xFE, 0xF0, - 0xFD, 0x14, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, - 0x00, 0x26, 0x00, 0x2C, 0xFC, 0x2B, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xBC, 0x00, 0x02, 0xFE, 0xA0, - 0xFC, 0x2C, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xBD, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xF9, 0x00, 0x02, - 0xFE, 0xF0, 0xFC, 0xFA, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, - 0x00, 0x24, 0x00, 0x2A, 0xFD, 0x79, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0x7B, 0x00, 0x03, - 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0x7A, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFD, 0x15, 0x00, 0x02, - 0xFE, 0xF0, 0xFD, 0x16, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, - 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, - 0xFC, 0x2D, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xBE, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x2E, 0x00, 0x02, - 0xFE, 0xA2, 0xFC, 0xBF, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x2F, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x7D, - 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xC0, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x30, 0x00, 0x02, - 0xFE, 0xE2, 0xFC, 0xC1, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x31, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x32, - 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x12, 0x00, 0x1A, 0x00, 0x20, 0xFD, 0x7C, - 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE2, 0xFD, 0xC1, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0x7C, - 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x7D, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, - 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0xFC, 0x33, 0x00, 0x02, - 0xFE, 0xA2, 0xFC, 0xC2, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0xF1, 0x00, 0x03, 0xFE, 0xE0, 0xFB, 0xAF, - 0xFC, 0x34, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xB4, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFC, 0xC3, - 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x35, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x36, 0x00, 0x02, 0xFE, 0xF2, - 0x00, 0x05, 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0xFD, 0x7E, 0x00, 0x03, - 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0x7F, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0xB2, 0x00, 0x03, - 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0x7E, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x7F, 0x00, 0x02, 0xFE, 0xF2, - 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, - 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, 0xFC, 0x37, - 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x38, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xC4, 0x00, 0x02, 0xFE, 0xA0, - 0xFC, 0x39, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xC5, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x3A, 0x00, 0x02, - 0xFE, 0xA6, 0xFC, 0xC6, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x3B, 0x00, 0x02, 0xFE, 0xDE, 0xFC, 0xC7, - 0x00, 0x02, 0xFE, 0xE0, 0xFC, 0x3C, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xC3, 0x00, 0x03, 0xFE, 0xE4, - 0xFE, 0xE4, 0xFC, 0xC8, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x3D, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x3E, - 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, - 0x00, 0x34, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0xFC, 0x80, 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x81, - 0x00, 0x02, 0xFE, 0xDE, 0xFC, 0xEB, 0x00, 0x02, 0xFE, 0xE0, 0xFC, 0x82, 0x00, 0x02, 0xFE, 0xE2, - 0xFD, 0xBB, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0xB7, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, - 0xFC, 0xEC, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x83, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x84, 0x00, 0x02, - 0xFE, 0xF2, 0x00, 0x14, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, - 0x00, 0x50, 0x00, 0x58, 0x00, 0x5E, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x72, 0x00, 0x78, 0x00, 0x80, - 0x00, 0x86, 0x00, 0x8C, 0x00, 0x94, 0x00, 0x9A, 0x00, 0xA0, 0x00, 0xA6, 0xFE, 0xF5, 0x00, 0x02, - 0xFE, 0x82, 0xFE, 0xF7, 0x00, 0x02, 0xFE, 0x84, 0xFE, 0xF9, 0x00, 0x02, 0xFE, 0x88, 0xFE, 0xFB, - 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x3F, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x83, 0x00, 0x03, 0xFE, 0xA0, - 0xFE, 0xA0, 0xFD, 0xBA, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xC9, 0x00, 0x02, 0xFE, 0xA0, - 0xFC, 0x40, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0xB5, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4, 0xFC, 0xCA, - 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x41, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x86, 0x00, 0x03, 0xFE, 0xA8, - 0xFE, 0xE4, 0xFC, 0xCB, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x42, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x88, - 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFC, 0xCC, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xCD, 0x00, 0x02, - 0xFE, 0xEC, 0xFC, 0x43, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x44, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x11, - 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, - 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7A, 0x00, 0x82, 0x00, 0x8A, 0x00, 0x90, - 0x00, 0x96, 0xFE, 0xF6, 0x00, 0x02, 0xFE, 0x82, 0xFE, 0xF8, 0x00, 0x02, 0xFE, 0x84, 0xFE, 0xFA, - 0x00, 0x02, 0xFE, 0x88, 0xFE, 0xFC, 0x00, 0x02, 0xFE, 0x8E, 0xFD, 0x84, 0x00, 0x03, 0xFE, 0xA0, - 0xFE, 0x9E, 0xFD, 0xBC, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE2, 0xFD, 0xAC, 0x00, 0x03, 0xFE, 0xA0, - 0xFE, 0xF2, 0xFD, 0x80, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE2, 0xFD, 0x82, 0x00, 0x03, 0xFE, 0xA4, - 0xFE, 0xF0, 0xFD, 0x81, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x85, 0x00, 0x03, 0xFE, 0xA8, - 0xFE, 0xE2, 0xFC, 0x85, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x87, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA2, - 0xFD, 0xAD, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xED, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x86, - 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x87, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x12, 0x00, 0x26, 0x00, 0x2C, - 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x58, 0x00, 0x62, 0x00, 0x6A, - 0x00, 0x70, 0x00, 0x76, 0x00, 0x7E, 0x00, 0x86, 0x00, 0x8C, 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, - 0xFC, 0x45, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x8C, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA4, 0xFD, 0x92, - 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA8, 0xFD, 0x8D, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xCE, - 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x46, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x89, 0x00, 0x03, 0xFE, 0xA4, - 0xFE, 0xA0, 0xFD, 0xF4, 0x00, 0x04, 0xFE, 0xA4, 0xFE, 0xE4, 0xFE, 0xAA, 0xFD, 0x8A, 0x00, 0x03, - 0xFE, 0xA4, 0xFE, 0xE4, 0xFC, 0xCF, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x47, 0x00, 0x02, 0xFE, 0xA6, - 0xFD, 0x8E, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xA0, 0xFD, 0x8F, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4, - 0xFC, 0xD0, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x48, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xD1, 0x00, 0x02, - 0xFE, 0xE4, 0xFC, 0x49, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x4A, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, - 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2C, 0x00, 0x32, 0xFC, 0x88, 0x00, 0x02, - 0xFE, 0x8E, 0xFD, 0xC0, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x8B, 0x00, 0x03, 0xFE, 0xA4, - 0xFE, 0xF2, 0xFD, 0xB9, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, 0xFC, 0x89, 0x00, 0x02, 0xFE, 0xE2, - 0xFD, 0xB1, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C, - 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, - 0x00, 0x66, 0x00, 0x6C, 0x00, 0x72, 0xFC, 0x4B, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0xB8, 0x00, 0x03, - 0xFE, 0xA0, 0xFE, 0xA4, 0xFD, 0x98, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xD2, 0x00, 0x02, - 0xFE, 0xA0, 0xFC, 0x4C, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x95, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4, - 0xFC, 0xD3, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x4D, 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0xD4, 0x00, 0x02, - 0xFE, 0xA8, 0xFC, 0x4E, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xD5, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xD6, - 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x4F, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x50, 0x00, 0x02, 0xFE, 0xF2, - 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x32, 0x00, 0x3A, 0x00, 0x42, 0x00, 0x4A, 0x00, 0x52, - 0x00, 0x58, 0x00, 0x5E, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, - 0x00, 0x8C, 0xFD, 0xBD, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA2, 0xFD, 0x97, 0x00, 0x03, 0xFE, 0xA0, - 0xFE, 0xE2, 0xFD, 0x99, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF0, 0xFD, 0xC7, 0x00, 0x03, 0xFE, 0xA0, - 0xFE, 0xF2, 0xFD, 0x96, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF0, 0xFD, 0xB3, 0x00, 0x03, 0xFE, 0xA4, - 0xFE, 0xF2, 0xFC, 0x8A, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x8B, 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x8C, - 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x9B, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0x9A, 0x00, 0x03, - 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xEE, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x8D, 0x00, 0x02, 0xFE, 0xE6, - 0xFC, 0xEF, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x8E, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x8F, 0x00, 0x02, - 0xFE, 0xF2, 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, - 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0xFC, 0xD9, 0x00, 0x02, 0x06, 0x70, 0xFC, 0x51, 0x00, 0x02, - 0xFE, 0x9E, 0xFC, 0xD7, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x52, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x93, - 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA0, 0xFD, 0x94, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xD8, - 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x53, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x54, 0x00, 0x02, 0xFE, 0xF2, - 0x00, 0x01, 0x00, 0x04, 0xFD, 0xF8, 0x00, 0x04, 0xFE, 0xB3, 0xFE, 0xE0, 0xFE, 0xE2, 0x00, 0x01, - 0x00, 0x04, 0xFC, 0x5D, 0x00, 0x02, 0x06, 0x70, 0x00, 0x01, 0x00, 0x04, 0xFC, 0x90, 0x00, 0x02, - 0x06, 0x70, 0x00, 0x0C, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, - 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, 0xFC, 0x55, 0x00, 0x02, - 0xFE, 0x9E, 0xFC, 0xDA, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x56, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xDB, - 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x57, 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0xDC, 0x00, 0x02, 0xFE, 0xA8, - 0xFC, 0x58, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x9D, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xDD, - 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xDE, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x59, 0x00, 0x02, 0xFE, 0xF0, - 0xFC, 0x5A, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0C, 0x00, 0x1A, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, - 0x00, 0x36, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, 0x00, 0x64, - 0xFD, 0xAF, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0xAE, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, - 0xFC, 0x91, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x92, 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x93, 0x00, 0x02, - 0xFE, 0xE2, 0xFD, 0x9C, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0xB0, 0x00, 0x03, 0xFE, 0xE4, - 0xFE, 0xF2, 0xFC, 0xF0, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x94, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xF1, - 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x95, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x96, 0x00, 0x02, 0xFE, 0xF2, - 0x00, 0x01, 0x00, 0x38, 0x00, 0x20, 0x06, 0x40, 0xFE, 0x89, 0xFE, 0x8A, 0xFE, 0x8B, 0xFE, 0x8C, - 0xFE, 0x8D, 0xFE, 0x8E, 0xFE, 0x91, 0xFE, 0x92, 0xFE, 0x97, 0xFE, 0x98, 0xFE, 0x9B, 0xFE, 0x9C, - 0xFE, 0x9F, 0xFE, 0xA0, 0xFE, 0xA3, 0xFE, 0xA4, 0xFE, 0xA7, 0xFE, 0xA8, 0xFE, 0xAB, 0xFE, 0xAD, - 0xFE, 0xB3, 0xFE, 0xB4, 0xFE, 0xB7, 0xFE, 0xB8, 0xFE, 0xBB, 0xFE, 0xBC, 0xFE, 0xBF, 0xFE, 0xC0, - 0xFE, 0xC3, 0xFE, 0xC4, 0xFE, 0xC7, 0xFE, 0xC8, 0xFE, 0xCB, 0xFE, 0xCC, 0xFE, 0xCF, 0xFE, 0xD0, - 0xFE, 0xD3, 0xFE, 0xD4, 0xFE, 0xD7, 0xFE, 0xD8, 0xFE, 0xDB, 0xFE, 0xDC, 0xFE, 0xDF, 0xFE, 0xE0, - 0xFE, 0xE3, 0xFE, 0xE4, 0xFE, 0xE7, 0xFE, 0xE8, 0xFE, 0xEB, 0xFE, 0xED, 0xFE, 0xEF, 0xFE, 0xF0, - 0xFE, 0xF3, 0xFE, 0xF4 -}; - -const le_uint8 ArabicShaping::glyphDefinitionTable[] = { - 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1E, - 0x06, 0x0C, 0x06, 0x0C, 0x00, 0x01, 0x06, 0x1B, 0x06, 0x1B, 0x00, 0x01, 0x06, 0x1F, 0x06, 0x1F, - 0x00, 0x01, 0x06, 0x21, 0x06, 0x3A, 0x00, 0x01, 0x06, 0x40, 0x06, 0x4A, 0x00, 0x01, 0x06, 0x4B, - 0x06, 0x52, 0x00, 0x03, 0x06, 0x60, 0x06, 0x6D, 0x00, 0x01, 0x06, 0x70, 0x06, 0x70, 0x00, 0x03, - 0x06, 0x71, 0x06, 0xB7, 0x00, 0x01, 0x06, 0xBA, 0x06, 0xBE, 0x00, 0x01, 0x06, 0xC0, 0x06, 0xCE, - 0x00, 0x01, 0x06, 0xD0, 0x06, 0xD5, 0x00, 0x01, 0x06, 0xD6, 0x06, 0xE4, 0x00, 0x03, 0x06, 0xE5, - 0x06, 0xE6, 0x00, 0x01, 0x06, 0xE7, 0x06, 0xE8, 0x00, 0x03, 0x06, 0xE9, 0x06, 0xE9, 0x00, 0x01, - 0x06, 0xEA, 0x06, 0xED, 0x00, 0x03, 0x06, 0xF0, 0x06, 0xF9, 0x00, 0x01, 0xFB, 0x50, 0xFB, 0xB1, - 0x00, 0x01, 0xFB, 0xD3, 0xFB, 0xE9, 0x00, 0x01, 0xFB, 0xEA, 0xFB, 0xFB, 0x00, 0x02, 0xFB, 0xFC, - 0xFB, 0xFF, 0x00, 0x01, 0xFC, 0x00, 0xFD, 0x3D, 0x00, 0x02, 0xFD, 0x50, 0xFD, 0x8F, 0x00, 0x02, - 0xFD, 0x92, 0xFD, 0xC7, 0x00, 0x02, 0xFD, 0xF0, 0xFD, 0xFB, 0x00, 0x02, 0xFE, 0x70, 0xFE, 0x72, - 0x00, 0x01, 0xFE, 0x74, 0xFE, 0x74, 0x00, 0x01, 0xFE, 0x76, 0xFE, 0xF4, 0x00, 0x01, 0xFE, 0xF5, - 0xFE, 0xFC, 0x00, 0x02 -}; - -U_NAMESPACE_END diff --git a/icuSources/layout/ArabicShaping.cpp b/icuSources/layout/ArabicShaping.cpp index 1e75088d..c26bb57e 100644 --- a/icuSources/layout/ArabicShaping.cpp +++ b/icuSources/layout/ArabicShaping.cpp @@ -1,13 +1,13 @@ /* - * @(#)ArabicShaping.cpp 1.10 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ #include "LETypes.h" #include "OpenTypeTables.h" #include "ArabicShaping.h" +#include "LEGlyphStorage.h" U_NAMESPACE_BEGIN @@ -22,24 +22,25 @@ enum { const ArabicShaping::ShapeType ArabicShaping::shapeTypes[] = { - _n_, _r_, _r_, _r_, _r_, _d_, _r_, _d_, _r_, _d_, _d_, _d_, _d_, _d_, _r_, _r_, // 0x621 - 0x630 - _r_, _r_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _x_, _x_, _x_, _x_, _x_, _c_, // 0x631 - 0x640 - _d_, _d_, _d_, _d_, _d_, _d_, _d_, _r_, _d_, _d_, _t_, _t_, _t_, _t_, _t_, _t_, // 0x641 - 0x650 - _t_, _t_, _t_, _t_, _t_, _x_, _x_, _x_, _x_, _x_, _x_, _x_, _x_, _x_, _x_, _n_, // 0x651 - 0x660 - _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _x_, _x_, _t_, // 0x661 - 0x670 - _r_, _r_, _r_, _x_, _r_, _r_, _r_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, // 0x671 - 0x680 - _d_, _d_, _d_, _d_, _d_, _d_, _d_, _r_, _r_, _r_, _r_, _r_, _r_, _r_, _r_, _r_, // 0x681 - 0x690 - _r_, _r_, _r_, _r_, _r_, _r_, _r_, _r_, _r_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, // 0x691 - 0x6a0 - _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, // 0x6a1 - 0x6b0 - _d_, _d_, _d_, _d_, _d_, _d_, _d_, _x_, _x_, _d_, _d_, _d_, _d_, _d_, _x_, _r_, // 0x6b1 - 0x6c0 - _d_, _r_, _r_, _r_, _r_, _r_, _r_, _r_, _r_, _r_, _r_, _d_, _r_, _d_, _x_, _d_, // 0x6c1 - 0x6d0 - _d_, _r_, _r_, _x_, _x_, _t_, _t_, _t_, _t_, _t_, _t_, _t_, _t_, _t_, _t_, _t_, // 0x6d1 - 0x6e0 - _t_, _t_, _t_, _t_, _n_, _n_, _t_, _t_, _n_, _t_, _t_, _t_, _t_, _x_, _x_, _n_, // 0x6e1 - 0x6f0 - _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _x_, _x_, _x_, _x_, _x_, _x_ // 0x6f1 - 0x6ff + _t_, _t_, _t_, _t_, _t_, _t_, _x_, _x_, _x_, _x_, _x_, _n_, _x_, _x_, _x_, _n_, // 0x610 - 0x61f + _x_, _n_, _r_, _r_, _r_, _r_, _d_, _r_, _d_, _r_, _d_, _d_, _d_, _d_, _d_, _r_, // 0x620 - 0x62f + _r_, _r_, _r_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _x_, _x_, _x_, _x_, _x_, // 0x630 - 0x63f + _c_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _r_, _d_, _d_, _t_, _t_, _t_, _t_, _t_, // 0x640 - 0x64f + _t_, _t_, _t_, _t_, _t_, _t_, _t_, _t_, _t_, _x_, _x_, _x_, _x_, _x_, _x_, _x_, // 0x650 - 0x65f + _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _d_, _d_, // 0x660 - 0x66f + _t_, _r_, _r_, _r_, _n_, _r_, _r_, _r_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, // 0x670 - 0x67f + _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _r_, _r_, _r_, _r_, _r_, _r_, _r_, _r_, // 0x680 - 0x68f + _r_, _r_, _r_, _r_, _r_, _r_, _r_, _r_, _r_, _r_, _d_, _d_, _d_, _d_, _d_, _d_, // 0x690 - 0x69f + _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, // 0x6a0 - 0x6af + _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, // 0x6b0 - 0x6bf + _r_, _d_, _r_, _r_, _r_, _r_, _r_, _r_, _r_, _r_, _r_, _r_, _d_, _r_, _d_, _r_, // 0x6c0 - 0x6cf + _d_, _d_, _r_, _r_, _n_, _r_, _t_, _t_, _t_, _t_, _t_, _t_, _t_, _x_, _t_, _t_, // 0x6d0 - 0x6df + _t_, _t_, _t_, _t_, _t_, _n_, _n_, _t_, _t_, _n_, _t_, _t_, _t_, _t_, _r_, _r_, // 0x6e0 - 0x6ef + _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _d_, _d_, _d_, _n_, _n_, _d_ // 0x6f0 - 0x6ff }; /* - shaping array holds types for arabic chars between 0621 and 0700 + shaping array holds types for Arabic chars between 0610 and 0700 other values are either unshaped, or transparent if a mark or format code, except for format codes 200c (zero-width non-joiner) and 200d (dual-width joiner) which are both unshaped and non_joining or @@ -47,9 +48,9 @@ const ArabicShaping::ShapeType ArabicShaping::shapeTypes[] = */ ArabicShaping::ShapeType ArabicShaping::getShapeType(LEUnicode c) { - if (c >= 0x0621 && c <= 0x206f) { + if (c >= 0x0610 && c <= 0x206f) { if (c < 0x0700) { - return shapeTypes[c - 0x0621]; + return shapeTypes[c - 0x0610]; } else if (c == 0x200c) { // ZWNJ return ST_NOSHAPE_NONE; } else if (c == 0x200d) { // ZWJ @@ -64,32 +65,32 @@ ArabicShaping::ShapeType ArabicShaping::getShapeType(LEUnicode c) return ST_NOSHAPE_NONE; } -const LETag isolFeatureTag = LE_ISOL_FEATURE_TAG; -const LETag initFeatureTag = LE_INIT_FEATURE_TAG; -const LETag mediFeatureTag = LE_MEDI_FEATURE_TAG; -const LETag finaFeatureTag = LE_FINA_FEATURE_TAG; -const LETag ligaFeatureTag = LE_LIGA_FEATURE_TAG; -const LETag msetFeatureTag = LE_MSET_FEATURE_TAG; -const LETag markFeatureTag = LE_MARK_FEATURE_TAG; -const LETag ccmpFeatureTag = LE_CCMP_FEATURE_TAG; -const LETag rligFeatureTag = LE_RLIG_FEATURE_TAG; -const LETag caltFeatureTag = LE_CALT_FEATURE_TAG; -const LETag dligFeatureTag = LE_DLIG_FEATURE_TAG; -const LETag cswhFeatureTag = LE_CSWH_FEATURE_TAG; -const LETag cursFeatureTag = LE_CURS_FEATURE_TAG; -const LETag kernFeatureTag = LE_KERN_FEATURE_TAG; -const LETag mkmkFeatureTag = LE_MKMK_FEATURE_TAG; - -const LETag emptyTag = 0x00000000; // '' - -const LETag featureOrder[] = +static const LETag isolFeatureTag = LE_ISOL_FEATURE_TAG; +static const LETag initFeatureTag = LE_INIT_FEATURE_TAG; +static const LETag mediFeatureTag = LE_MEDI_FEATURE_TAG; +static const LETag finaFeatureTag = LE_FINA_FEATURE_TAG; +static const LETag ligaFeatureTag = LE_LIGA_FEATURE_TAG; +static const LETag msetFeatureTag = LE_MSET_FEATURE_TAG; +static const LETag markFeatureTag = LE_MARK_FEATURE_TAG; +static const LETag ccmpFeatureTag = LE_CCMP_FEATURE_TAG; +static const LETag rligFeatureTag = LE_RLIG_FEATURE_TAG; +static const LETag caltFeatureTag = LE_CALT_FEATURE_TAG; +static const LETag dligFeatureTag = LE_DLIG_FEATURE_TAG; +static const LETag cswhFeatureTag = LE_CSWH_FEATURE_TAG; +static const LETag cursFeatureTag = LE_CURS_FEATURE_TAG; +static const LETag kernFeatureTag = LE_KERN_FEATURE_TAG; +static const LETag mkmkFeatureTag = LE_MKMK_FEATURE_TAG; + +static const LETag emptyTag = 0x00000000; // '' + +static const LETag featureOrder[] = { ccmpFeatureTag, isolFeatureTag, finaFeatureTag, mediFeatureTag, initFeatureTag, rligFeatureTag, caltFeatureTag, ligaFeatureTag, dligFeatureTag, cswhFeatureTag, msetFeatureTag, cursFeatureTag, kernFeatureTag, markFeatureTag, mkmkFeatureTag, emptyTag }; -const LETag GlyphShaper::tagArray[] = +const LETag ArabicShaping::tagArray[] = { isolFeatureTag, ligaFeatureTag, msetFeatureTag, markFeatureTag, ccmpFeatureTag, rligFeatureTag, caltFeatureTag, dligFeatureTag, cswhFeatureTag, cursFeatureTag, kernFeatureTag, mkmkFeatureTag, emptyTag, @@ -104,15 +105,23 @@ const LETag GlyphShaper::tagArray[] = caltFeatureTag, dligFeatureTag, cswhFeatureTag, cursFeatureTag, kernFeatureTag, mkmkFeatureTag, emptyTag }; -#define TAGS_PER_GLYPH (sizeof GlyphShaper::tagArray / sizeof(LETag) / 4) +#define TAGS_PER_GLYPH ((sizeof ArabicShaping::tagArray / sizeof ArabicShaping::tagArray[0]) / 4) const LETag *ArabicShaping::getFeatureOrder() { return featureOrder; } +void ArabicShaping::adjustTags(le_int32 outIndex, le_int32 shapeOffset, LEGlyphStorage &glyphStorage) +{ + LEErrorCode success = LE_NO_ERROR; + const LETag *glyphTags = (const LETag *) glyphStorage.getAuxData(outIndex, success); + + glyphStorage.setAuxData(outIndex, (void *) &glyphTags[TAGS_PER_GLYPH * shapeOffset], success); +} + void ArabicShaping::shape(const LEUnicode *chars, le_int32 offset, le_int32 charCount, le_int32 charMax, - le_bool rightToLeft, Shaper &shaper) + le_bool rightToLeft, LEGlyphStorage &glyphStorage) { // iterate in logical order, store tags in visible order // @@ -130,6 +139,7 @@ void ArabicShaping::shape(const LEUnicode *chars, le_int32 offset, le_int32 char // shaper.shape(out, 1) (isolate to final) ShapeType rightType = ST_NOSHAPE_NONE, leftType = ST_NOSHAPE_NONE; + LEErrorCode success = LE_NO_ERROR; le_int32 i; for (i = offset - 1; i >= 0; i -= 1) { @@ -150,7 +160,7 @@ void ArabicShaping::shape(const LEUnicode *chars, le_int32 offset, le_int32 char // erout is effective right logical index le_int32 erout = -1; - le_bool rightShapes = false; + le_bool rightShapes = FALSE; le_bool rightCauses = (rightType & MASK_SHAPE_LEFT) != 0; le_int32 in, e, out = 0, dir = 1; @@ -164,7 +174,7 @@ void ArabicShaping::shape(const LEUnicode *chars, le_int32 offset, le_int32 char LEUnicode c = chars[in]; ShapeType t = getShapeType(c); - shaper.init(c, out, (t & (MASK_TRANSPARENT | MASK_NOSHAPE)) == 0); + glyphStorage.setAuxData(out, (void *) tagArray, success); if ((t & MASK_TRANSPARENT) != 0) { continue; @@ -175,11 +185,11 @@ void ArabicShaping::shape(const LEUnicode *chars, le_int32 offset, le_int32 char if (rightCauses && curCauses) { if (rightShapes) { - shaper.shape(erout, 2); + adjustTags(erout, 2, glyphStorage); } if (curShapes) { - shaper.shape(out, 1); + adjustTags(out, 1, glyphStorage); } } @@ -189,83 +199,8 @@ void ArabicShaping::shape(const LEUnicode *chars, le_int32 offset, le_int32 char } if (rightShapes && rightCauses && (leftType & MASK_SHAPE_RIGHT) != 0) { - shaper.shape(erout, 2); + adjustTags(erout, 2, glyphStorage); } } -GlyphShaper::GlyphShaper(const LETag **outputTags) -{ - charTags = outputTags; -} - -GlyphShaper::~GlyphShaper() -{ - // nothing to do -} - -void GlyphShaper::init(LEUnicode /*ch*/, le_int32 outIndex, le_bool /*isloate*/) -{ - charTags[outIndex] = tagArray; -} - -void GlyphShaper::shape(le_int32 outIndex, le_int32 shapeOffset) -{ - charTags[outIndex] = &charTags[outIndex][TAGS_PER_GLYPH * shapeOffset]; -} - -CharShaper::CharShaper(LEUnicode *outputChars) -{ - chars = outputChars; -} - -CharShaper::~CharShaper() -{ - // nothing to do -} - -void CharShaper::init(LEUnicode ch, le_int32 outIndex, le_bool isloate) -{ - if (isloate) { - chars[outIndex] = getToIsolateShape(ch); - } else { - chars[outIndex] = ch; - } -} - -void CharShaper::shape(le_int32 outIndex, le_int32 shapeOffset) -{ - chars[outIndex] += (LEUnicode) shapeOffset; -} - -const LEUnicode CharShaper::isolateShapes[] = -{ - 0xfe80, 0xfe81, 0xfe83, 0xfe85, 0xfe87, 0xfe89, 0xfe8d, 0xfe8f, 0xfe93, 0xfe95, - 0xfe99, 0xfe9d, 0xfea1, 0xfea5, 0xfea9, 0xfeab, 0xfead, 0xfeaf, 0xfeb1, 0xfeb5, - 0xfeb9, 0xfebd, 0xfec1, 0xfec5, 0xfec9, 0xfecd, 0x063b, 0x063c, 0x063d, 0x063e, - 0x063f, 0x0640, 0xfed1, 0xfed5, 0xfed9, 0xfedd, 0xfee1, 0xfee5, 0xfee9, 0xfeed, - 0xfeef, 0xfef1, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, 0x0650, 0x0651, 0x0652, - 0x0653, 0x0654, 0x0655, 0x0656, 0x0657, 0x0658, 0x0659, 0x065a, 0x065b, 0x065c, - 0x065d, 0x065e, 0x065f, 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, - 0x0667, 0x0668, 0x0669, 0x066a, 0x066b, 0x066c, 0x066d, 0x066e, 0x066f, 0x0670, - 0xfb50, 0x0672, 0x0673, 0x0674, 0x0675, 0x0676, 0xfbdd, 0x0678, 0xfb66, 0xfb5e, - 0xfb52, 0x067c, 0x067d, 0xfb56, 0xfb62, 0xfb5a, 0x0681, 0x0682, 0xfb76, 0xfb72, - 0x0685, 0xfb7a, 0xfb7e, 0xfb88, 0x0689, 0x068a, 0x068b, 0xfb84, 0xfb82, 0xfb86, - 0x068f, 0x0690, 0xfb8c, 0x0692, 0x0693, 0x0694, 0x0695, 0x0696, 0x0697, 0xfb8a, - 0x0699, 0x069a, 0x069b, 0x069c, 0x069d, 0x069e, 0x069f, 0x06a0, 0x06a1, 0x06a2, - 0x06a3, 0xfb6a, 0x06a5, 0xfb6e, 0x06a7, 0x06a8, 0xfb8e, 0x06aa, 0x06ab, 0x06ac, - 0xfbd3, 0x06ae, 0xfb92, 0x06b0, 0xfb9a, 0x06b2, 0xfb96, 0x06b4, 0x06b5, 0x06b6, - 0x06b7, 0x06b8, 0x06b9, 0xfb9e, 0xfba0, 0x06bc, 0x06bd, 0xfbaa, 0x06bf, 0xfba4, - 0xfba6, 0x06c2, 0x06c3, 0x06c4, 0xfbe0, 0xfbd9, 0xfbd7, 0xfbdb, 0xfbe2, 0x06ca, - 0xfbde, 0xfbfc, 0x06cd, 0x06ce, 0x06cf, 0xfbe4, 0x06d1, 0xfbae, 0xfbb0 -}; - -LEUnicode CharShaper::getToIsolateShape(LEUnicode ch) -{ - if (ch < 0x0621 || ch > 0x06d3) { - return ch; - } - - return isolateShapes[ch - 0x0621]; -} - U_NAMESPACE_END diff --git a/icuSources/layout/ArabicShaping.h b/icuSources/layout/ArabicShaping.h index b4bfcf96..9a1ad899 100644 --- a/icuSources/layout/ArabicShaping.h +++ b/icuSources/layout/ArabicShaping.h @@ -1,7 +1,6 @@ /* - * @(#)ArabicShaping.h 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -18,12 +17,7 @@ U_NAMESPACE_BEGIN -class Shaper /* not : public UObject because this is an interface/mixin class */ { -public: - virtual inline ~Shaper() {}; - virtual void init(LEUnicode ch, le_int32 outIndex, le_bool isloate) = 0; - virtual void shape(le_int32 outIndex, le_int32 shapeOffset) = 0; -}; +class LEGlyphStorage; class ArabicShaping /* not : public UObject because all methods are static */ { public: @@ -51,59 +45,21 @@ public: typedef le_int32 ShapeType; static void shape(const LEUnicode *chars, le_int32 offset, le_int32 charCount, le_int32 charMax, - le_bool rightToLeft, Shaper &shaper); + le_bool rightToLeft, LEGlyphStorage &glyphStorage); static const LETag *getFeatureOrder(); - static const le_uint8 glyphSubstitutionTable[]; - //static le_uint8 ligatureSubstitutionSubtable[]; - static const le_uint8 glyphDefinitionTable[]; - private: // forbid instantiation ArabicShaping(); - static ShapeType getShapeType(LEUnicode c); - - static const ShapeType shapeTypes[]; -}; - -class GlyphShaper : public UMemory, public Shaper -{ -public: - virtual void init(LEUnicode ch, le_int32 outIndex, le_bool isolate); - virtual void shape(le_int32 outIndex, le_int32 shapeOffset); - - GlyphShaper(const LETag **outputTags); - ~GlyphShaper(); - -private: - const LETag **charTags; - static const LETag tagArray[]; - GlyphShaper(const GlyphShaper &other); // forbid copying of this class - GlyphShaper &operator=(const GlyphShaper &other); // forbid copying of this class -}; - -class CharShaper : public UMemory, public Shaper -{ -public: - virtual void init(LEUnicode ch, le_int32 outIndex, le_bool isolate); - virtual void shape(le_int32 outIndex, le_int32 shapeOffset); - - CharShaper(LEUnicode *outputChars); - ~CharShaper(); - -private: - LEUnicode *chars; - - static const LEUnicode isolateShapes[]; + static ShapeType getShapeType(LEUnicode c); - static LEUnicode getToIsolateShape(LEUnicode ch); + static const ShapeType shapeTypes[]; - CharShaper(const CharShaper &other); // forbid copying of this class - CharShaper &operator=(const CharShaper &other); // forbid copying of this class + static void adjustTags(le_int32 outIndex, le_int32 shapeOffset, LEGlyphStorage &glyphStorage); }; U_NAMESPACE_END diff --git a/icuSources/layout/AttachmentPosnSubtables.h b/icuSources/layout/AttachmentPosnSubtables.h index e15457fa..12849e4f 100644 --- a/icuSources/layout/AttachmentPosnSubtables.h +++ b/icuSources/layout/AttachmentPosnSubtables.h @@ -1,7 +1,6 @@ /* - * @(#)AttachmentPosnSubtables.h 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/CanonData.cpp b/icuSources/layout/CanonData.cpp new file mode 100644 index 00000000..42fc268c --- /dev/null +++ b/icuSources/layout/CanonData.cpp @@ -0,0 +1,3679 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004. All Rights Reserved. + * + * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS + * YOU REALLY KNOW WHAT YOU'RE DOING. + */ + +#include "LETypes.h" +#include "CanonShaping.h" + +U_NAMESPACE_BEGIN + +const le_uint8 CanonShaping::glyphSubstitutionTable[] = { + 0x00, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x01, 0x58, 0x02, 0x86, 0x00, 0x12, 0x61, 0x72, 0x61, 0x62, + 0x00, 0x6E, 0x62, 0x65, 0x6E, 0x67, 0x00, 0x82, 0x63, 0x79, 0x72, 0x6C, 0x00, 0x8E, 0x64, 0x65, + 0x76, 0x61, 0x00, 0x9A, 0x67, 0x72, 0x65, 0x6B, 0x00, 0xA6, 0x67, 0x75, 0x72, 0x75, 0x00, 0xB2, + 0x68, 0x65, 0x62, 0x72, 0x00, 0xBE, 0x68, 0x69, 0x72, 0x61, 0x00, 0xCA, 0x6B, 0x61, 0x6E, 0x61, + 0x00, 0xD6, 0x6B, 0x6E, 0x64, 0x61, 0x00, 0xE2, 0x6C, 0x61, 0x74, 0x6E, 0x00, 0xEE, 0x6D, 0x6C, + 0x79, 0x6D, 0x00, 0xFA, 0x6D, 0x79, 0x6D, 0x72, 0x01, 0x06, 0x6F, 0x72, 0x79, 0x61, 0x01, 0x12, + 0x73, 0x69, 0x6E, 0x68, 0x01, 0x1E, 0x74, 0x61, 0x6D, 0x6C, 0x01, 0x2A, 0x74, 0x65, 0x6C, 0x75, + 0x01, 0x36, 0x74, 0x69, 0x62, 0x74, 0x01, 0x42, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x00, 0x05, 0x00, 0x00, 0x00, 0x13, 0x00, 0x15, 0x00, 0x12, 0x00, 0x14, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x03, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x00, 0x01, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x07, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x00, 0x01, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x0B, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x0D, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x00, 0x01, 0x00, 0x0E, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x0F, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x10, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x11, 0x00, 0x16, 0x63, 0x63, 0x6D, 0x70, 0x00, 0x86, + 0x63, 0x63, 0x6D, 0x70, 0x00, 0x8E, 0x63, 0x63, 0x6D, 0x70, 0x00, 0x96, 0x63, 0x63, 0x6D, 0x70, + 0x00, 0x9E, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xA6, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xAE, 0x63, 0x63, + 0x6D, 0x70, 0x00, 0xB6, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xBE, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xC6, + 0x63, 0x63, 0x6D, 0x70, 0x00, 0xCE, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xD6, 0x63, 0x63, 0x6D, 0x70, + 0x00, 0xDE, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xE6, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xEE, 0x63, 0x63, + 0x6D, 0x70, 0x00, 0xF6, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xFE, 0x63, 0x63, 0x6D, 0x70, 0x01, 0x06, + 0x63, 0x63, 0x6D, 0x70, 0x01, 0x0E, 0x66, 0x69, 0x6E, 0x61, 0x01, 0x16, 0x69, 0x6E, 0x69, 0x74, + 0x01, 0x1C, 0x6C, 0x69, 0x67, 0x61, 0x01, 0x22, 0x6D, 0x65, 0x64, 0x69, 0x01, 0x28, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x08, 0x00, 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x0B, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x0C, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x10, 0x00, 0x11, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x00, 0x13, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x14, 0x00, 0x15, 0x00, 0x00, 0x00, 0x02, 0x00, 0x16, 0x00, 0x17, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1A, 0x00, 0x1B, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x1C, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1E, 0x00, 0x1F, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x20, 0x00, 0x21, 0x00, 0x00, 0x00, 0x02, 0x00, 0x22, 0x00, 0x23, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x24, 0x00, 0x25, 0x00, 0x00, 0x00, 0x02, 0x00, 0x26, 0x00, 0x27, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x28, 0x00, 0x52, 0x00, 0xC8, 0x01, 0x2A, 0x01, 0xF4, + 0x02, 0xBE, 0x03, 0xF8, 0x15, 0x06, 0x15, 0x58, 0x15, 0x9C, 0x18, 0x4E, 0x1A, 0xC4, 0x1B, 0x70, + 0x1B, 0xF0, 0x4F, 0xEA, 0x8E, 0xAE, 0x8F, 0x14, 0x8F, 0x62, 0x91, 0x58, 0x93, 0x26, 0x94, 0x94, + 0x95, 0xB4, 0x96, 0x0A, 0x96, 0x66, 0x98, 0x0C, 0x99, 0x54, 0xB9, 0x0C, 0xDC, 0x92, 0xDC, 0xC8, + 0xDC, 0xF8, 0xDD, 0x18, 0xDD, 0x34, 0xDD, 0x80, 0xDD, 0xC4, 0xDE, 0x0C, 0xDE, 0x5E, 0xDE, 0xA2, + 0xDE, 0xDC, 0xDE, 0xFC, 0xDF, 0x18, 0xE0, 0x36, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, + 0x00, 0x01, 0x00, 0x5E, 0x00, 0x06, 0x00, 0x12, 0x00, 0x2C, 0x00, 0x36, 0x00, 0x40, 0x00, 0x4A, + 0x00, 0x54, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x06, 0x22, 0x00, 0x02, 0x06, 0x53, + 0x06, 0x23, 0x00, 0x02, 0x06, 0x54, 0x06, 0x25, 0x00, 0x02, 0x06, 0x55, 0x00, 0x01, 0x00, 0x04, + 0x06, 0x24, 0x00, 0x02, 0x06, 0x54, 0x00, 0x01, 0x00, 0x04, 0x06, 0x26, 0x00, 0x02, 0x06, 0x54, + 0x00, 0x01, 0x00, 0x04, 0x06, 0xC2, 0x00, 0x02, 0x06, 0x54, 0x00, 0x01, 0x00, 0x04, 0x06, 0xD3, + 0x00, 0x02, 0x06, 0x54, 0x00, 0x01, 0x00, 0x04, 0x06, 0xC0, 0x00, 0x02, 0x06, 0x54, 0x00, 0x01, + 0x00, 0x06, 0x06, 0x27, 0x06, 0x48, 0x06, 0x4A, 0x06, 0xC1, 0x06, 0xD2, 0x06, 0xD5, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x46, 0x00, 0x08, 0x00, 0x16, 0x00, 0x1C, + 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0x00, 0x02, 0x06, 0x27, + 0x06, 0x53, 0x00, 0x02, 0x06, 0x27, 0x06, 0x54, 0x00, 0x02, 0x06, 0x48, 0x06, 0x54, 0x00, 0x02, + 0x06, 0x27, 0x06, 0x55, 0x00, 0x02, 0x06, 0x4A, 0x06, 0x54, 0x00, 0x02, 0x06, 0xD5, 0x06, 0x54, + 0x00, 0x02, 0x06, 0xC1, 0x06, 0x54, 0x00, 0x02, 0x06, 0xD2, 0x06, 0x54, 0x00, 0x01, 0x00, 0x08, + 0x06, 0x22, 0x06, 0x23, 0x06, 0x24, 0x06, 0x25, 0x06, 0x26, 0x06, 0xC0, 0x06, 0xC2, 0x06, 0xD3, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x62, 0x00, 0x2E, 0xFE, 0x8B, + 0xFE, 0x91, 0xFE, 0x97, 0xFE, 0x9B, 0xFE, 0x9F, 0xFE, 0xA3, 0xFE, 0xA7, 0xFE, 0xB3, 0xFE, 0xB7, + 0xFE, 0xBB, 0xFE, 0xBF, 0xFE, 0xC3, 0xFE, 0xC7, 0xFE, 0xCB, 0xFE, 0xCF, 0xFE, 0xD3, 0xFE, 0xD7, + 0xFE, 0xDB, 0xFE, 0xDF, 0xFE, 0xE3, 0xFE, 0xE7, 0xFE, 0xEB, 0xFB, 0xE8, 0xFE, 0xF3, 0xFB, 0x68, + 0xFB, 0x60, 0xFB, 0x54, 0xFB, 0x58, 0xFB, 0x64, 0xFB, 0x5C, 0xFB, 0x78, 0xFB, 0x74, 0xFB, 0x7C, + 0xFB, 0x80, 0xFB, 0x6C, 0xFB, 0x70, 0xFB, 0x90, 0xFB, 0xD5, 0xFB, 0x94, 0xFB, 0x9C, 0xFB, 0x98, + 0xFB, 0xA2, 0xFB, 0xAC, 0xFB, 0xA8, 0xFB, 0xFE, 0xFB, 0xE6, 0x00, 0x01, 0x00, 0x2E, 0x06, 0x26, + 0x06, 0x28, 0x06, 0x2A, 0x06, 0x2B, 0x06, 0x2C, 0x06, 0x2D, 0x06, 0x2E, 0x06, 0x33, 0x06, 0x34, + 0x06, 0x35, 0x06, 0x36, 0x06, 0x37, 0x06, 0x38, 0x06, 0x39, 0x06, 0x3A, 0x06, 0x41, 0x06, 0x42, + 0x06, 0x43, 0x06, 0x44, 0x06, 0x45, 0x06, 0x46, 0x06, 0x47, 0x06, 0x49, 0x06, 0x4A, 0x06, 0x79, + 0x06, 0x7A, 0x06, 0x7B, 0x06, 0x7E, 0x06, 0x7F, 0x06, 0x80, 0x06, 0x83, 0x06, 0x84, 0x06, 0x86, + 0x06, 0x87, 0x06, 0xA4, 0x06, 0xA6, 0x06, 0xA9, 0x06, 0xAD, 0x06, 0xAF, 0x06, 0xB1, 0x06, 0xB3, + 0x06, 0xBB, 0x06, 0xBE, 0x06, 0xC1, 0x06, 0xCC, 0x06, 0xD0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x02, 0x00, 0x62, 0x00, 0x2E, 0xFE, 0x8C, 0xFE, 0x92, 0xFE, 0x98, 0xFE, 0x9C, + 0xFE, 0xA0, 0xFE, 0xA4, 0xFE, 0xA8, 0xFE, 0xB4, 0xFE, 0xB8, 0xFE, 0xBC, 0xFE, 0xC0, 0xFE, 0xC4, + 0xFE, 0xC8, 0xFE, 0xCC, 0xFE, 0xD0, 0xFE, 0xD4, 0xFE, 0xD8, 0xFE, 0xDC, 0xFE, 0xE0, 0xFE, 0xE4, + 0xFE, 0xE8, 0xFE, 0xEC, 0xFB, 0xE9, 0xFE, 0xF4, 0xFB, 0x69, 0xFB, 0x61, 0xFB, 0x55, 0xFB, 0x59, + 0xFB, 0x65, 0xFB, 0x5D, 0xFB, 0x79, 0xFB, 0x75, 0xFB, 0x7D, 0xFB, 0x81, 0xFB, 0x6D, 0xFB, 0x71, + 0xFB, 0x91, 0xFB, 0xD6, 0xFB, 0x95, 0xFB, 0x9D, 0xFB, 0x99, 0xFB, 0xA3, 0xFB, 0xAD, 0xFB, 0xA9, + 0xFB, 0xFF, 0xFB, 0xE7, 0x00, 0x01, 0x00, 0x2E, 0x06, 0x26, 0x06, 0x28, 0x06, 0x2A, 0x06, 0x2B, + 0x06, 0x2C, 0x06, 0x2D, 0x06, 0x2E, 0x06, 0x33, 0x06, 0x34, 0x06, 0x35, 0x06, 0x36, 0x06, 0x37, + 0x06, 0x38, 0x06, 0x39, 0x06, 0x3A, 0x06, 0x41, 0x06, 0x42, 0x06, 0x43, 0x06, 0x44, 0x06, 0x45, + 0x06, 0x46, 0x06, 0x47, 0x06, 0x49, 0x06, 0x4A, 0x06, 0x79, 0x06, 0x7A, 0x06, 0x7B, 0x06, 0x7E, + 0x06, 0x7F, 0x06, 0x80, 0x06, 0x83, 0x06, 0x84, 0x06, 0x86, 0x06, 0x87, 0x06, 0xA4, 0x06, 0xA6, + 0x06, 0xA9, 0x06, 0xAD, 0x06, 0xAF, 0x06, 0xB1, 0x06, 0xB3, 0x06, 0xBB, 0x06, 0xBE, 0x06, 0xC1, + 0x06, 0xCC, 0x06, 0xD0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x9A, + 0x00, 0x4A, 0xFE, 0x82, 0xFE, 0x84, 0xFE, 0x86, 0xFE, 0x88, 0xFE, 0x8A, 0xFE, 0x8E, 0xFE, 0x90, + 0xFE, 0x94, 0xFE, 0x96, 0xFE, 0x9A, 0xFE, 0x9E, 0xFE, 0xA2, 0xFE, 0xA6, 0xFE, 0xAA, 0xFE, 0xAC, + 0xFE, 0xAE, 0xFE, 0xB0, 0xFE, 0xB2, 0xFE, 0xB6, 0xFE, 0xBA, 0xFE, 0xBE, 0xFE, 0xC2, 0xFE, 0xC6, + 0xFE, 0xCA, 0xFE, 0xCE, 0xFE, 0xD2, 0xFE, 0xD6, 0xFE, 0xDA, 0xFE, 0xDE, 0xFE, 0xE2, 0xFE, 0xE6, + 0xFE, 0xEA, 0xFE, 0xEE, 0xFE, 0xF0, 0xFE, 0xF2, 0xFB, 0x51, 0xFB, 0x67, 0xFB, 0x5F, 0xFB, 0x53, + 0xFB, 0x57, 0xFB, 0x63, 0xFB, 0x5B, 0xFB, 0x77, 0xFB, 0x73, 0xFB, 0x7B, 0xFB, 0x7F, 0xFB, 0x89, + 0xFB, 0x85, 0xFB, 0x83, 0xFB, 0x87, 0xFB, 0x8D, 0xFB, 0x8B, 0xFB, 0x6B, 0xFB, 0x6F, 0xFB, 0x8F, + 0xFB, 0xD4, 0xFB, 0x93, 0xFB, 0x9B, 0xFB, 0x97, 0xFB, 0x9F, 0xFB, 0xA1, 0xFB, 0xAB, 0xFB, 0xA5, + 0xFB, 0xA7, 0xFB, 0xE1, 0xFB, 0xDA, 0xFB, 0xD8, 0xFB, 0xDC, 0xFB, 0xE3, 0xFB, 0xDF, 0xFB, 0xFD, + 0xFB, 0xE5, 0xFB, 0xAF, 0xFB, 0xB1, 0x00, 0x01, 0x00, 0x4A, 0x06, 0x22, 0x06, 0x23, 0x06, 0x24, + 0x06, 0x25, 0x06, 0x26, 0x06, 0x27, 0x06, 0x28, 0x06, 0x29, 0x06, 0x2A, 0x06, 0x2B, 0x06, 0x2C, + 0x06, 0x2D, 0x06, 0x2E, 0x06, 0x2F, 0x06, 0x30, 0x06, 0x31, 0x06, 0x32, 0x06, 0x33, 0x06, 0x34, + 0x06, 0x35, 0x06, 0x36, 0x06, 0x37, 0x06, 0x38, 0x06, 0x39, 0x06, 0x3A, 0x06, 0x41, 0x06, 0x42, + 0x06, 0x43, 0x06, 0x44, 0x06, 0x45, 0x06, 0x46, 0x06, 0x47, 0x06, 0x48, 0x06, 0x49, 0x06, 0x4A, + 0x06, 0x71, 0x06, 0x79, 0x06, 0x7A, 0x06, 0x7B, 0x06, 0x7E, 0x06, 0x7F, 0x06, 0x80, 0x06, 0x83, + 0x06, 0x84, 0x06, 0x86, 0x06, 0x87, 0x06, 0x88, 0x06, 0x8C, 0x06, 0x8D, 0x06, 0x8E, 0x06, 0x91, + 0x06, 0x98, 0x06, 0xA4, 0x06, 0xA6, 0x06, 0xA9, 0x06, 0xAD, 0x06, 0xAF, 0x06, 0xB1, 0x06, 0xB3, + 0x06, 0xBA, 0x06, 0xBB, 0x06, 0xBE, 0x06, 0xC0, 0x06, 0xC1, 0x06, 0xC5, 0x06, 0xC6, 0x06, 0xC7, + 0x06, 0xC8, 0x06, 0xC9, 0x06, 0xCB, 0x06, 0xCC, 0x06, 0xD0, 0x06, 0xD2, 0x06, 0xD3, 0x00, 0x04, + 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x10, 0x98, 0x00, 0x35, 0x00, 0x70, 0x00, 0x7A, + 0x01, 0x0C, 0x01, 0x86, 0x01, 0xA8, 0x01, 0xB2, 0x02, 0x0C, 0x02, 0x62, 0x03, 0x02, 0x03, 0x8A, + 0x03, 0xB4, 0x03, 0xF6, 0x04, 0x46, 0x04, 0x8A, 0x04, 0xBC, 0x04, 0xEC, 0x05, 0x26, 0x05, 0x38, + 0x05, 0x42, 0x05, 0x64, 0x05, 0xF8, 0x06, 0x6C, 0x06, 0xEC, 0x07, 0x80, 0x08, 0x1E, 0x08, 0x56, + 0x08, 0xBA, 0x08, 0xF2, 0x09, 0x38, 0x09, 0x66, 0x09, 0x78, 0x09, 0x82, 0x09, 0xD4, 0x0A, 0x0E, + 0x0A, 0x40, 0x0A, 0x70, 0x0A, 0xCC, 0x0A, 0xF2, 0x0B, 0x38, 0x0B, 0x68, 0x0B, 0xDC, 0x0C, 0x2A, + 0x0C, 0xD6, 0x0D, 0x72, 0x0E, 0x16, 0x0E, 0x50, 0x0E, 0xC8, 0x0F, 0x5A, 0x0F, 0xA8, 0x0F, 0xB6, + 0x0F, 0xC0, 0x0F, 0xCA, 0x10, 0x2E, 0x00, 0x01, 0x00, 0x04, 0xFB, 0xDD, 0x00, 0x02, 0x06, 0x74, + 0x00, 0x12, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, + 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x7A, + 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0xFB, 0xEC, 0x00, 0x02, 0x00, 0x01, 0xFB, 0xF0, 0x00, 0x02, + 0xFB, 0xD8, 0xFB, 0xF2, 0x00, 0x02, 0xFB, 0xDA, 0xFB, 0xF4, 0x00, 0x02, 0xFB, 0xDC, 0xFB, 0xF6, + 0x00, 0x02, 0xFB, 0xE5, 0xFB, 0xF8, 0x00, 0x02, 0xFB, 0xE7, 0xFB, 0xEA, 0x00, 0x02, 0xFE, 0x8E, + 0xFC, 0x00, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0x97, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x01, 0x00, 0x02, + 0xFE, 0xA2, 0xFC, 0x98, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x99, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x02, + 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0x9A, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x9B, 0x00, 0x02, 0xFE, 0xEC, + 0xFB, 0xEE, 0x00, 0x02, 0xFE, 0xEE, 0xFB, 0xF9, 0x00, 0x02, 0xFE, 0xF0, 0xFB, 0xFB, 0x00, 0x02, + 0xFE, 0xF2, 0x00, 0x0F, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, + 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, + 0x00, 0x74, 0xFB, 0xED, 0x00, 0x02, 0x00, 0x01, 0xFB, 0xF1, 0x00, 0x02, 0xFB, 0xD8, 0xFB, 0xF3, + 0x00, 0x02, 0xFB, 0xDA, 0xFB, 0xF5, 0x00, 0x02, 0xFB, 0xDC, 0xFB, 0xF7, 0x00, 0x02, 0xFB, 0xE5, + 0xFB, 0xEB, 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x64, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x65, 0x00, 0x02, + 0xFE, 0xB0, 0xFC, 0x66, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xDF, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x67, + 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xE0, 0x00, 0x02, 0xFE, 0xEC, 0xFB, 0xEF, 0x00, 0x02, 0xFE, 0xEE, + 0xFB, 0xFA, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x69, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x03, 0x00, 0x08, + 0x00, 0x0E, 0x00, 0x18, 0xFD, 0x3D, 0x00, 0x02, 0x06, 0x4B, 0xFD, 0xF3, 0x00, 0x04, 0xFE, 0xDB, + 0xFE, 0x92, 0xFE, 0xAE, 0xFD, 0xF2, 0x00, 0x04, 0xFE, 0xDF, 0xFE, 0xE0, 0xFE, 0xEA, 0x00, 0x01, + 0x00, 0x04, 0xFD, 0x3C, 0x00, 0x02, 0x06, 0x4B, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, + 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, + 0xFC, 0x05, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0x9C, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x06, 0x00, 0x02, + 0xFE, 0xA2, 0xFC, 0x9D, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x07, 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0x9E, + 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x08, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0x9F, 0x00, 0x02, 0xFE, 0xE4, + 0xFC, 0xA0, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x09, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x0A, 0x00, 0x02, + 0xFE, 0xF2, 0x00, 0x0A, 0x00, 0x16, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, + 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0xFD, 0xC2, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, + 0xFD, 0x9E, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, 0xFC, 0x6A, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x6B, + 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x6C, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xE1, 0x00, 0x02, 0xFE, 0xE4, + 0xFC, 0x6D, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xE2, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x6E, 0x00, 0x02, + 0xFE, 0xF0, 0xFC, 0x6F, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x12, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, + 0x00, 0x3A, 0x00, 0x40, 0x00, 0x48, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6A, + 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x8E, 0x00, 0x94, 0x00, 0x9A, 0xFC, 0x0B, + 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x50, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xA1, 0x00, 0x02, + 0xFE, 0xA0, 0xFC, 0x0C, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x52, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA0, + 0xFD, 0x53, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4, 0xFC, 0xA2, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x0D, + 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x54, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xA3, 0x00, 0x02, + 0xFE, 0xA8, 0xFC, 0x0E, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x55, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA0, + 0xFD, 0x56, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFD, 0x57, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA8, + 0xFC, 0xA4, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xA5, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x0F, 0x00, 0x02, + 0xFE, 0xF0, 0xFC, 0x10, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0F, 0x00, 0x20, 0x00, 0x28, 0x00, 0x30, + 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, + 0x00, 0x70, 0x00, 0x76, 0x00, 0x7C, 0x00, 0x82, 0xFD, 0xA0, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF0, + 0xFD, 0x9F, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x51, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0x9E, + 0xFD, 0xA2, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF0, 0xFD, 0xA1, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, + 0xFC, 0x70, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x71, 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x72, 0x00, 0x02, + 0xFE, 0xE2, 0xFD, 0xA4, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0xA3, 0x00, 0x03, 0xFE, 0xE4, + 0xFE, 0xF2, 0xFC, 0xE3, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x73, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xE4, + 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x74, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x75, 0x00, 0x02, 0xFE, 0xF2, + 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0xFC, 0x11, 0x00, 0x02, + 0xFE, 0x9E, 0xFC, 0x12, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xA6, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x13, + 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x14, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, + 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0xFC, 0x76, 0x00, 0x02, + 0xFE, 0xAE, 0xFC, 0x77, 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x78, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xE5, + 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x79, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xE6, 0x00, 0x02, 0xFE, 0xEC, + 0xFC, 0x7A, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x7B, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x08, 0x00, 0x12, + 0x00, 0x18, 0x00, 0x1E, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0xFC, 0x15, + 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xA7, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0xFB, 0x00, 0x08, 0xFE, 0xDE, + 0x00, 0x20, 0xFE, 0x9F, 0xFE, 0xE0, 0xFE, 0x8E, 0xFE, 0xDF, 0xFE, 0xEA, 0xFC, 0x16, 0x00, 0x02, + 0xFE, 0xE2, 0xFD, 0x59, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFC, 0xA8, 0x00, 0x02, 0xFE, 0xE4, + 0xFD, 0x01, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x02, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x07, 0x00, 0x10, + 0x00, 0x18, 0x00, 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0xFD, 0xA6, 0x00, 0x03, + 0xFE, 0xA4, 0xFE, 0xF0, 0xFD, 0xBE, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x58, 0x00, 0x03, + 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0xA7, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0xA5, 0x00, 0x03, + 0xFE, 0xE4, 0xFE, 0xF2, 0xFD, 0x1D, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x1E, 0x00, 0x02, 0xFE, 0xF2, + 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0xFC, 0x17, + 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xA9, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x18, 0x00, 0x02, 0xFE, 0xE2, + 0xFC, 0xAA, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xFF, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x00, 0x00, 0x02, + 0xFE, 0xF2, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0xFD, 0xBF, + 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x5B, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0x5A, + 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFD, 0x1B, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x1C, 0x00, 0x02, + 0xFE, 0xF2, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, + 0x00, 0x34, 0xFC, 0x19, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xAB, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x1A, + 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0x1B, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xAC, 0x00, 0x02, 0xFE, 0xE4, + 0xFD, 0x03, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x04, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x02, 0x00, 0x06, + 0x00, 0x0C, 0xFD, 0x1F, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x20, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x01, + 0x00, 0x04, 0xFC, 0x5B, 0x00, 0x02, 0x06, 0x70, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x18, + 0xFC, 0x5C, 0x00, 0x02, 0x06, 0x70, 0xFD, 0xFC, 0x00, 0x04, 0xFB, 0xFE, 0xFE, 0x8E, 0xFE, 0xDD, + 0xFD, 0xF6, 0x00, 0x04, 0xFE, 0xB3, 0xFE, 0xEE, 0xFE, 0xDD, 0x00, 0x11, 0x00, 0x24, 0x00, 0x2A, + 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, + 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x88, 0x00, 0x8E, 0xFC, 0x1C, + 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x5D, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA4, 0xFC, 0xAD, 0x00, 0x02, + 0xFE, 0xA0, 0xFC, 0x1D, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x5C, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA0, + 0xFC, 0xAE, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x1E, 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0xAF, 0x00, 0x02, + 0xFE, 0xA8, 0xFD, 0x0E, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x1F, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x61, + 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA0, 0xFD, 0x60, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFD, 0x63, + 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xB0, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x31, 0x00, 0x02, + 0xFE, 0xEC, 0xFC, 0xFB, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xFC, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0D, + 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, + 0x00, 0x54, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, 0xFD, 0x5E, 0x00, 0x03, 0xFE, 0xA0, + 0xFE, 0xF0, 0xFD, 0x34, 0x00, 0x02, 0xFE, 0xA0, 0xFD, 0x35, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0xA8, + 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF0, 0xFD, 0xC6, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, 0xFD, 0x36, + 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x2A, 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x5F, 0x00, 0x03, 0xFE, 0xE4, + 0xFE, 0xA2, 0xFD, 0x62, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFC, 0xE7, 0x00, 0x02, 0xFE, 0xE4, + 0xFC, 0xE8, 0x00, 0x02, 0xFE, 0xEC, 0xFD, 0x17, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x18, 0x00, 0x02, + 0xFE, 0xF2, 0x00, 0x0F, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x3A, 0x00, 0x40, + 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x60, 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74, + 0x00, 0x7A, 0xFD, 0x09, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x2D, 0x00, 0x02, 0xFE, 0xA0, 0xFD, 0x0A, + 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x68, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4, 0xFD, 0x2E, 0x00, 0x02, + 0xFE, 0xA4, 0xFD, 0x0B, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x2F, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x0D, + 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x0C, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x6B, 0x00, 0x03, 0xFE, 0xE4, + 0xFE, 0xA8, 0xFD, 0x6D, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFD, 0x30, 0x00, 0x02, 0xFE, 0xE4, + 0xFD, 0x32, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0xFD, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xFE, 0x00, 0x02, + 0xFE, 0xF2, 0x00, 0x11, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, + 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C, + 0x00, 0x82, 0x00, 0x88, 0x00, 0x8E, 0xFD, 0x25, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x69, 0x00, 0x03, + 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x37, 0x00, 0x02, 0xFE, 0xA0, 0xFD, 0x26, 0x00, 0x02, 0xFE, 0xA2, + 0xFD, 0x67, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE2, 0xFD, 0xAA, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, + 0xFD, 0x38, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0x27, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x39, 0x00, 0x02, + 0xFE, 0xA8, 0xFD, 0x29, 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x28, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x6A, + 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA6, 0xFD, 0x6C, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFC, 0xE9, + 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xEA, 0x00, 0x02, 0xFE, 0xEC, 0xFD, 0x19, 0x00, 0x02, 0xFE, 0xF0, + 0xFD, 0x1A, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C, 0x00, 0x32, + 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x50, 0x00, 0x76, 0x00, 0x7E, 0x00, 0x84, 0x00, 0x8C, + 0x00, 0x92, 0x00, 0x98, 0xFC, 0x20, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x65, 0x00, 0x03, 0xFE, 0xA4, + 0xFE, 0xA4, 0xFC, 0xB1, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0xB2, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x0F, + 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0xF0, 0x00, 0x03, 0xFE, 0xE0, 0xFB, 0xAF, 0xFD, 0xF5, 0x00, 0x04, + 0xFE, 0xE0, 0xFE, 0xCC, 0xFE, 0xE2, 0xFD, 0xFA, 0x00, 0x12, 0xFE, 0xE0, 0xFE, 0xF0, 0x00, 0x20, + 0xFE, 0x8D, 0xFE, 0xDF, 0xFE, 0xE0, 0xFE, 0xEA, 0x00, 0x20, 0xFE, 0xCB, 0xFE, 0xE0, 0xFE, 0xF4, + 0xFE, 0xEA, 0x00, 0x20, 0xFE, 0xED, 0xFE, 0xB3, 0xFE, 0xE0, 0xFE, 0xE2, 0xFD, 0xF9, 0x00, 0x03, + 0xFE, 0xE0, 0xFE, 0xF0, 0xFC, 0x21, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xC5, 0x00, 0x03, 0xFE, 0xE4, + 0xFE, 0xE4, 0xFC, 0xB3, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x05, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x06, + 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x16, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C, + 0x00, 0x32, 0xFD, 0x64, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA2, 0xFD, 0xA9, 0x00, 0x03, 0xFE, 0xA4, + 0xFE, 0xF2, 0xFD, 0x2B, 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x66, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, + 0xFD, 0x21, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x22, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0C, 0x00, 0x1A, + 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, + 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, 0xFC, 0x22, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xB4, 0x00, 0x02, + 0xFE, 0xA0, 0xFC, 0x23, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xB5, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x24, + 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x70, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xB6, 0x00, 0x02, + 0xFE, 0xA8, 0xFD, 0x10, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x25, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xB7, + 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x07, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x08, 0x00, 0x02, 0xFE, 0xF2, + 0x00, 0x06, 0x00, 0x0E, 0x00, 0x16, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0xFD, 0x6E, + 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF0, 0xFD, 0xAB, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x6F, + 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE2, 0xFD, 0x2C, 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x23, 0x00, 0x02, + 0xFE, 0xF0, 0xFD, 0x24, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, + 0x00, 0x24, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0xFC, 0x26, 0x00, 0x02, 0xFE, 0xA2, + 0xFC, 0xB8, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x27, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x72, 0x00, 0x03, + 0xFE, 0xE4, 0xFE, 0xA4, 0xFD, 0x73, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFD, 0x33, 0x00, 0x02, + 0xFE, 0xE4, 0xFC, 0xF5, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xF6, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, + 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0xFD, 0x71, 0x00, 0x03, 0xFE, 0xE4, + 0xFE, 0xA2, 0xFD, 0x74, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFD, 0x3A, 0x00, 0x02, 0xFE, 0xE4, + 0xFD, 0x11, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x12, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x02, 0x00, 0x06, + 0x00, 0x0C, 0xFC, 0x28, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xB9, 0x00, 0x02, 0xFE, 0xE4, 0x00, 0x01, + 0x00, 0x04, 0xFD, 0x3B, 0x00, 0x02, 0xFE, 0xE4, 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x22, + 0x00, 0x28, 0x00, 0x32, 0x00, 0x38, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0xFC, 0x29, 0x00, 0x02, + 0xFE, 0x9E, 0xFD, 0xC4, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xBA, 0x00, 0x02, 0xFE, 0xA0, + 0xFD, 0xF7, 0x00, 0x04, 0xFE, 0xE0, 0xFE, 0xF4, 0xFE, 0xEA, 0xFC, 0x2A, 0x00, 0x02, 0xFE, 0xE2, + 0xFD, 0x77, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xBB, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xF7, + 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xF8, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x16, + 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2E, 0x00, 0x34, 0xFD, 0x75, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE2, + 0xFD, 0x76, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0x78, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, + 0xFD, 0xB6, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFD, 0x13, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x14, + 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, + 0x00, 0x2C, 0xFC, 0x2B, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xBC, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x2C, + 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xBD, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xF9, 0x00, 0x02, 0xFE, 0xF0, + 0xFC, 0xFA, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24, + 0x00, 0x2A, 0xFD, 0x79, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0x7B, 0x00, 0x03, 0xFE, 0xE4, + 0xFE, 0xF0, 0xFD, 0x7A, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFD, 0x15, 0x00, 0x02, 0xFE, 0xF0, + 0xFD, 0x16, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, + 0x00, 0x30, 0x00, 0x36, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0xFC, 0x2D, + 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xBE, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x2E, 0x00, 0x02, 0xFE, 0xA2, + 0xFC, 0xBF, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x2F, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x7D, 0x00, 0x03, + 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xC0, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x30, 0x00, 0x02, 0xFE, 0xE2, + 0xFC, 0xC1, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x31, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x32, 0x00, 0x02, + 0xFE, 0xF2, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x12, 0x00, 0x1A, 0x00, 0x20, 0xFD, 0x7C, 0x00, 0x03, + 0xFE, 0xA8, 0xFE, 0xE2, 0xFD, 0xC1, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0x7C, 0x00, 0x02, + 0xFE, 0xF0, 0xFC, 0x7D, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, + 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0xFC, 0x33, 0x00, 0x02, 0xFE, 0xA2, + 0xFC, 0xC2, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0xF1, 0x00, 0x03, 0xFE, 0xE0, 0xFB, 0xAF, 0xFC, 0x34, + 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xB4, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFC, 0xC3, 0x00, 0x02, + 0xFE, 0xE4, 0xFC, 0x35, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x36, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, + 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0xFD, 0x7E, 0x00, 0x03, 0xFE, 0xE4, + 0xFE, 0xA2, 0xFD, 0x7F, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0xB2, 0x00, 0x03, 0xFE, 0xE4, + 0xFE, 0xF2, 0xFC, 0x7E, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x7F, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0E, + 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, + 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, 0xFC, 0x37, 0x00, 0x02, + 0xFE, 0x8E, 0xFC, 0x38, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xC4, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x39, + 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xC5, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x3A, 0x00, 0x02, 0xFE, 0xA6, + 0xFC, 0xC6, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x3B, 0x00, 0x02, 0xFE, 0xDE, 0xFC, 0xC7, 0x00, 0x02, + 0xFE, 0xE0, 0xFC, 0x3C, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xC3, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, + 0xFC, 0xC8, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x3D, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x3E, 0x00, 0x02, + 0xFE, 0xF2, 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, + 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0xFC, 0x80, 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x81, 0x00, 0x02, + 0xFE, 0xDE, 0xFC, 0xEB, 0x00, 0x02, 0xFE, 0xE0, 0xFC, 0x82, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xBB, + 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0xB7, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xEC, + 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x83, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x84, 0x00, 0x02, 0xFE, 0xF2, + 0x00, 0x14, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x50, + 0x00, 0x58, 0x00, 0x5E, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x72, 0x00, 0x78, 0x00, 0x80, 0x00, 0x86, + 0x00, 0x8C, 0x00, 0x94, 0x00, 0x9A, 0x00, 0xA0, 0x00, 0xA6, 0xFE, 0xF5, 0x00, 0x02, 0xFE, 0x82, + 0xFE, 0xF7, 0x00, 0x02, 0xFE, 0x84, 0xFE, 0xF9, 0x00, 0x02, 0xFE, 0x88, 0xFE, 0xFB, 0x00, 0x02, + 0xFE, 0x8E, 0xFC, 0x3F, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x83, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA0, + 0xFD, 0xBA, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xC9, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x40, + 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0xB5, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4, 0xFC, 0xCA, 0x00, 0x02, + 0xFE, 0xA4, 0xFC, 0x41, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x86, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4, + 0xFC, 0xCB, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x42, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x88, 0x00, 0x03, + 0xFE, 0xE4, 0xFE, 0xA4, 0xFC, 0xCC, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xCD, 0x00, 0x02, 0xFE, 0xEC, + 0xFC, 0x43, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x44, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x11, 0x00, 0x24, + 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, + 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7A, 0x00, 0x82, 0x00, 0x8A, 0x00, 0x90, 0x00, 0x96, + 0xFE, 0xF6, 0x00, 0x02, 0xFE, 0x82, 0xFE, 0xF8, 0x00, 0x02, 0xFE, 0x84, 0xFE, 0xFA, 0x00, 0x02, + 0xFE, 0x88, 0xFE, 0xFC, 0x00, 0x02, 0xFE, 0x8E, 0xFD, 0x84, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0x9E, + 0xFD, 0xBC, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE2, 0xFD, 0xAC, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, + 0xFD, 0x80, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE2, 0xFD, 0x82, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF0, + 0xFD, 0x81, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x85, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE2, + 0xFC, 0x85, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x87, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0xAD, + 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xED, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x86, 0x00, 0x02, + 0xFE, 0xF0, 0xFC, 0x87, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x12, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, + 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x58, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x70, + 0x00, 0x76, 0x00, 0x7E, 0x00, 0x86, 0x00, 0x8C, 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, 0xFC, 0x45, + 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x8C, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA4, 0xFD, 0x92, 0x00, 0x03, + 0xFE, 0xA0, 0xFE, 0xA8, 0xFD, 0x8D, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xCE, 0x00, 0x02, + 0xFE, 0xA0, 0xFC, 0x46, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x89, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA0, + 0xFD, 0xF4, 0x00, 0x04, 0xFE, 0xA4, 0xFE, 0xE4, 0xFE, 0xAA, 0xFD, 0x8A, 0x00, 0x03, 0xFE, 0xA4, + 0xFE, 0xE4, 0xFC, 0xCF, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x47, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x8E, + 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xA0, 0xFD, 0x8F, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xD0, + 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x48, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xD1, 0x00, 0x02, 0xFE, 0xE4, + 0xFC, 0x49, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x4A, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, + 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2C, 0x00, 0x32, 0xFC, 0x88, 0x00, 0x02, 0xFE, 0x8E, + 0xFD, 0xC0, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x8B, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, + 0xFD, 0xB9, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, 0xFC, 0x89, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xB1, + 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C, 0x00, 0x34, + 0x00, 0x3A, 0x00, 0x40, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, + 0x00, 0x6C, 0x00, 0x72, 0xFC, 0x4B, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0xB8, 0x00, 0x03, 0xFE, 0xA0, + 0xFE, 0xA4, 0xFD, 0x98, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xD2, 0x00, 0x02, 0xFE, 0xA0, + 0xFC, 0x4C, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x95, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4, 0xFC, 0xD3, + 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x4D, 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0xD4, 0x00, 0x02, 0xFE, 0xA8, + 0xFC, 0x4E, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xD5, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xD6, 0x00, 0x02, + 0xFE, 0xEC, 0xFC, 0x4F, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x50, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x10, + 0x00, 0x22, 0x00, 0x2A, 0x00, 0x32, 0x00, 0x3A, 0x00, 0x42, 0x00, 0x4A, 0x00, 0x52, 0x00, 0x58, + 0x00, 0x5E, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, + 0xFD, 0xBD, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA2, 0xFD, 0x97, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE2, + 0xFD, 0x99, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF0, 0xFD, 0xC7, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, + 0xFD, 0x96, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF0, 0xFD, 0xB3, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, + 0xFC, 0x8A, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x8B, 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x8C, 0x00, 0x02, + 0xFE, 0xE2, 0xFD, 0x9B, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0x9A, 0x00, 0x03, 0xFE, 0xE4, + 0xFE, 0xF2, 0xFC, 0xEE, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x8D, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xEF, + 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x8E, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x8F, 0x00, 0x02, 0xFE, 0xF2, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3C, + 0x00, 0x42, 0x00, 0x48, 0xFC, 0xD9, 0x00, 0x02, 0x06, 0x70, 0xFC, 0x51, 0x00, 0x02, 0xFE, 0x9E, + 0xFC, 0xD7, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x52, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x93, 0x00, 0x03, + 0xFE, 0xE4, 0xFE, 0xA0, 0xFD, 0x94, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xD8, 0x00, 0x02, + 0xFE, 0xE4, 0xFC, 0x53, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x54, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x01, + 0x00, 0x04, 0xFD, 0xF8, 0x00, 0x04, 0xFE, 0xB3, 0xFE, 0xE0, 0xFE, 0xE2, 0x00, 0x01, 0x00, 0x04, + 0xFC, 0x5D, 0x00, 0x02, 0x06, 0x70, 0x00, 0x01, 0x00, 0x04, 0xFC, 0x90, 0x00, 0x02, 0x06, 0x70, + 0x00, 0x0C, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, + 0x00, 0x44, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, 0xFC, 0x55, 0x00, 0x02, 0xFE, 0x9E, + 0xFC, 0xDA, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x56, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xDB, 0x00, 0x02, + 0xFE, 0xA4, 0xFC, 0x57, 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0xDC, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x58, + 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x9D, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xDD, 0x00, 0x02, + 0xFE, 0xE4, 0xFC, 0xDE, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x59, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x5A, + 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0C, 0x00, 0x1A, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, + 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, 0x00, 0x64, 0xFD, 0xAF, + 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0xAE, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFC, 0x91, + 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x92, 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x93, 0x00, 0x02, 0xFE, 0xE2, + 0xFD, 0x9C, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0xB0, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, + 0xFC, 0xF0, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x94, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xF1, 0x00, 0x02, + 0xFE, 0xEC, 0xFC, 0x95, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x96, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x01, + 0x00, 0x35, 0xFB, 0xD7, 0xFE, 0x8B, 0xFE, 0x8C, 0xFE, 0x8D, 0xFE, 0x8E, 0xFE, 0x91, 0xFE, 0x92, + 0xFE, 0x97, 0xFE, 0x98, 0xFE, 0x9B, 0xFE, 0x9C, 0xFE, 0x9F, 0xFE, 0xA0, 0xFE, 0xA3, 0xFE, 0xA4, + 0xFE, 0xA7, 0xFE, 0xA8, 0xFE, 0xAB, 0xFE, 0xAD, 0xFE, 0xB3, 0xFE, 0xB4, 0xFE, 0xB7, 0xFE, 0xB8, + 0xFE, 0xBB, 0xFE, 0xBC, 0xFE, 0xBF, 0xFE, 0xC0, 0xFE, 0xC3, 0xFE, 0xC4, 0xFE, 0xC7, 0xFE, 0xC8, + 0xFE, 0xCB, 0xFE, 0xCC, 0xFE, 0xCF, 0xFE, 0xD0, 0xFE, 0xD3, 0xFE, 0xD4, 0xFE, 0xD7, 0xFE, 0xD8, + 0xFE, 0xDB, 0xFE, 0xDC, 0xFE, 0xDF, 0xFE, 0xE0, 0xFE, 0xE3, 0xFE, 0xE4, 0xFE, 0xE7, 0xFE, 0xE8, + 0xFE, 0xEB, 0xFE, 0xED, 0xFE, 0xEF, 0xFE, 0xF0, 0xFE, 0xF3, 0xFE, 0xF4, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x3E, 0x00, 0x04, 0x00, 0x0E, 0x00, 0x18, 0x00, 0x22, + 0x00, 0x2C, 0x00, 0x01, 0x00, 0x04, 0x09, 0xDC, 0x00, 0x02, 0x09, 0xBC, 0x00, 0x01, 0x00, 0x04, + 0x09, 0xDD, 0x00, 0x02, 0x09, 0xBC, 0x00, 0x01, 0x00, 0x04, 0x09, 0xDF, 0x00, 0x02, 0x09, 0xBC, + 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x09, 0xCB, 0x00, 0x02, 0x09, 0xBE, 0x09, 0xCC, 0x00, 0x02, + 0x09, 0xD7, 0x00, 0x01, 0x00, 0x04, 0x09, 0xA1, 0x09, 0xA2, 0x09, 0xAF, 0x09, 0xC7, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x2E, 0x00, 0x05, 0x00, 0x10, 0x00, 0x16, + 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x02, 0x09, 0xC7, 0x09, 0xBE, 0x00, 0x02, 0x09, 0xC7, + 0x09, 0xD7, 0x00, 0x02, 0x09, 0xA1, 0x09, 0xBC, 0x00, 0x02, 0x09, 0xA2, 0x09, 0xBC, 0x00, 0x02, + 0x09, 0xAF, 0x09, 0xBC, 0x00, 0x01, 0x00, 0x05, 0x09, 0xCB, 0x09, 0xCC, 0x09, 0xDC, 0x09, 0xDD, + 0x09, 0xDF, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x02, 0x66, 0x00, 0x20, + 0x00, 0x46, 0x00, 0x50, 0x00, 0x62, 0x00, 0x74, 0x00, 0x96, 0x00, 0xA8, 0x00, 0xB2, 0x00, 0xDC, + 0x00, 0xEE, 0x00, 0xF8, 0x01, 0x1A, 0x01, 0x24, 0x01, 0x2E, 0x01, 0x38, 0x01, 0x4A, 0x01, 0x5C, + 0x01, 0x7E, 0x01, 0x90, 0x01, 0x9A, 0x01, 0xC4, 0x01, 0xD6, 0x01, 0xE0, 0x02, 0x02, 0x02, 0x0C, + 0x02, 0x16, 0x02, 0x20, 0x02, 0x2A, 0x02, 0x34, 0x02, 0x3E, 0x02, 0x48, 0x02, 0x52, 0x02, 0x5C, + 0x00, 0x01, 0x00, 0x04, 0x04, 0x07, 0x00, 0x02, 0x03, 0x08, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, + 0x04, 0xD0, 0x00, 0x02, 0x03, 0x06, 0x04, 0xD2, 0x00, 0x02, 0x03, 0x08, 0x00, 0x02, 0x00, 0x06, + 0x00, 0x0C, 0x04, 0x03, 0x00, 0x02, 0x03, 0x01, 0x04, 0x03, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, + 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x02, 0x03, 0x00, 0x04, 0xD6, + 0x00, 0x02, 0x03, 0x06, 0x04, 0x01, 0x00, 0x02, 0x03, 0x08, 0x04, 0x00, 0x00, 0x02, 0x03, 0x40, + 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x04, 0xC1, 0x00, 0x02, 0x03, 0x06, 0x04, 0xDC, 0x00, 0x02, + 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x04, 0xDE, 0x00, 0x02, 0x03, 0x08, 0x00, 0x05, 0x00, 0x0C, + 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x04, 0x0D, 0x00, 0x02, 0x03, 0x00, 0x04, 0xE2, + 0x00, 0x02, 0x03, 0x04, 0x04, 0x19, 0x00, 0x02, 0x03, 0x06, 0x04, 0xE4, 0x00, 0x02, 0x03, 0x08, + 0x04, 0x0D, 0x00, 0x02, 0x03, 0x40, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x04, 0x0C, 0x00, 0x02, + 0x03, 0x01, 0x04, 0x0C, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x04, 0xE6, 0x00, 0x02, + 0x03, 0x08, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x04, 0xEE, 0x00, 0x02, + 0x03, 0x04, 0x04, 0x0E, 0x00, 0x02, 0x03, 0x06, 0x04, 0xF0, 0x00, 0x02, 0x03, 0x08, 0x04, 0xF2, + 0x00, 0x02, 0x03, 0x0B, 0x00, 0x01, 0x00, 0x04, 0x04, 0xF4, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, + 0x00, 0x04, 0x04, 0xF8, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x04, 0xEC, 0x00, 0x02, + 0x03, 0x08, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x04, 0xD1, 0x00, 0x02, 0x03, 0x06, 0x04, 0xD3, + 0x00, 0x02, 0x03, 0x08, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x04, 0x53, 0x00, 0x02, 0x03, 0x01, + 0x04, 0x53, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, + 0x04, 0x50, 0x00, 0x02, 0x03, 0x00, 0x04, 0xD7, 0x00, 0x02, 0x03, 0x06, 0x04, 0x51, 0x00, 0x02, + 0x03, 0x08, 0x04, 0x50, 0x00, 0x02, 0x03, 0x40, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x04, 0xC2, + 0x00, 0x02, 0x03, 0x06, 0x04, 0xDD, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x04, 0xDF, + 0x00, 0x02, 0x03, 0x08, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, + 0x04, 0x5D, 0x00, 0x02, 0x03, 0x00, 0x04, 0xE3, 0x00, 0x02, 0x03, 0x04, 0x04, 0x39, 0x00, 0x02, + 0x03, 0x06, 0x04, 0xE5, 0x00, 0x02, 0x03, 0x08, 0x04, 0x5D, 0x00, 0x02, 0x03, 0x40, 0x00, 0x02, + 0x00, 0x06, 0x00, 0x0C, 0x04, 0x5C, 0x00, 0x02, 0x03, 0x01, 0x04, 0x5C, 0x00, 0x02, 0x03, 0x41, + 0x00, 0x01, 0x00, 0x04, 0x04, 0xE7, 0x00, 0x02, 0x03, 0x08, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, + 0x00, 0x16, 0x00, 0x1C, 0x04, 0xEF, 0x00, 0x02, 0x03, 0x04, 0x04, 0x5E, 0x00, 0x02, 0x03, 0x06, + 0x04, 0xF1, 0x00, 0x02, 0x03, 0x08, 0x04, 0xF3, 0x00, 0x02, 0x03, 0x0B, 0x00, 0x01, 0x00, 0x04, + 0x04, 0xF5, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x04, 0xF9, 0x00, 0x02, 0x03, 0x08, + 0x00, 0x01, 0x00, 0x04, 0x04, 0xED, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x04, 0x57, + 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x04, 0x76, 0x00, 0x02, 0x03, 0x0F, 0x00, 0x01, + 0x00, 0x04, 0x04, 0x77, 0x00, 0x02, 0x03, 0x0F, 0x00, 0x01, 0x00, 0x04, 0x04, 0xDA, 0x00, 0x02, + 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x04, 0xDB, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, + 0x04, 0xEA, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x04, 0xEB, 0x00, 0x02, 0x03, 0x08, + 0x00, 0x01, 0x00, 0x20, 0x04, 0x06, 0x04, 0x10, 0x04, 0x13, 0x04, 0x15, 0x04, 0x16, 0x04, 0x17, + 0x04, 0x18, 0x04, 0x1A, 0x04, 0x1E, 0x04, 0x23, 0x04, 0x27, 0x04, 0x2B, 0x04, 0x2D, 0x04, 0x30, + 0x04, 0x33, 0x04, 0x35, 0x04, 0x36, 0x04, 0x37, 0x04, 0x38, 0x04, 0x3A, 0x04, 0x3E, 0x04, 0x43, + 0x04, 0x47, 0x04, 0x4B, 0x04, 0x4D, 0x04, 0x56, 0x04, 0x74, 0x04, 0x75, 0x04, 0xD8, 0x04, 0xD9, + 0x04, 0xE8, 0x04, 0xE9, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0A, 0x02, 0x1C, 0x00, 0x01, + 0x01, 0xA6, 0x00, 0x34, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, + 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0, 0x00, 0xB6, 0x00, 0xBC, + 0x00, 0xC2, 0x00, 0xC8, 0x00, 0xCE, 0x00, 0xD4, 0x00, 0xDA, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEC, + 0x00, 0xF2, 0x00, 0xF8, 0x00, 0xFE, 0x01, 0x04, 0x01, 0x0A, 0x01, 0x10, 0x01, 0x16, 0x01, 0x1C, + 0x01, 0x22, 0x01, 0x28, 0x01, 0x2E, 0x01, 0x34, 0x01, 0x3A, 0x01, 0x40, 0x01, 0x46, 0x01, 0x4C, + 0x01, 0x52, 0x01, 0x58, 0x01, 0x5E, 0x01, 0x64, 0x01, 0x6A, 0x01, 0x70, 0x01, 0x76, 0x01, 0x7C, + 0x01, 0x82, 0x01, 0x88, 0x01, 0x8E, 0x01, 0x94, 0x01, 0x9A, 0x01, 0xA0, 0x00, 0x02, 0x04, 0x15, + 0x03, 0x00, 0x00, 0x02, 0x04, 0x15, 0x03, 0x08, 0x00, 0x02, 0x04, 0x13, 0x03, 0x01, 0x00, 0x02, + 0x04, 0x06, 0x03, 0x08, 0x00, 0x02, 0x04, 0x1A, 0x03, 0x01, 0x00, 0x02, 0x04, 0x18, 0x03, 0x00, + 0x00, 0x02, 0x04, 0x23, 0x03, 0x06, 0x00, 0x02, 0x04, 0x18, 0x03, 0x06, 0x00, 0x02, 0x04, 0x38, + 0x03, 0x06, 0x00, 0x02, 0x04, 0x35, 0x03, 0x00, 0x00, 0x02, 0x04, 0x35, 0x03, 0x08, 0x00, 0x02, + 0x04, 0x33, 0x03, 0x01, 0x00, 0x02, 0x04, 0x56, 0x03, 0x08, 0x00, 0x02, 0x04, 0x3A, 0x03, 0x01, + 0x00, 0x02, 0x04, 0x38, 0x03, 0x00, 0x00, 0x02, 0x04, 0x43, 0x03, 0x06, 0x00, 0x02, 0x04, 0x74, + 0x03, 0x0F, 0x00, 0x02, 0x04, 0x75, 0x03, 0x0F, 0x00, 0x02, 0x04, 0x16, 0x03, 0x06, 0x00, 0x02, + 0x04, 0x36, 0x03, 0x06, 0x00, 0x02, 0x04, 0x10, 0x03, 0x06, 0x00, 0x02, 0x04, 0x30, 0x03, 0x06, + 0x00, 0x02, 0x04, 0x10, 0x03, 0x08, 0x00, 0x02, 0x04, 0x30, 0x03, 0x08, 0x00, 0x02, 0x04, 0x15, + 0x03, 0x06, 0x00, 0x02, 0x04, 0x35, 0x03, 0x06, 0x00, 0x02, 0x04, 0xD8, 0x03, 0x08, 0x00, 0x02, + 0x04, 0xD9, 0x03, 0x08, 0x00, 0x02, 0x04, 0x16, 0x03, 0x08, 0x00, 0x02, 0x04, 0x36, 0x03, 0x08, + 0x00, 0x02, 0x04, 0x17, 0x03, 0x08, 0x00, 0x02, 0x04, 0x37, 0x03, 0x08, 0x00, 0x02, 0x04, 0x18, + 0x03, 0x04, 0x00, 0x02, 0x04, 0x38, 0x03, 0x04, 0x00, 0x02, 0x04, 0x18, 0x03, 0x08, 0x00, 0x02, + 0x04, 0x38, 0x03, 0x08, 0x00, 0x02, 0x04, 0x1E, 0x03, 0x08, 0x00, 0x02, 0x04, 0x3E, 0x03, 0x08, + 0x00, 0x02, 0x04, 0xE8, 0x03, 0x08, 0x00, 0x02, 0x04, 0xE9, 0x03, 0x08, 0x00, 0x02, 0x04, 0x2D, + 0x03, 0x08, 0x00, 0x02, 0x04, 0x4D, 0x03, 0x08, 0x00, 0x02, 0x04, 0x23, 0x03, 0x04, 0x00, 0x02, + 0x04, 0x43, 0x03, 0x04, 0x00, 0x02, 0x04, 0x23, 0x03, 0x08, 0x00, 0x02, 0x04, 0x43, 0x03, 0x08, + 0x00, 0x02, 0x04, 0x23, 0x03, 0x0B, 0x00, 0x02, 0x04, 0x43, 0x03, 0x0B, 0x00, 0x02, 0x04, 0x27, + 0x03, 0x08, 0x00, 0x02, 0x04, 0x47, 0x03, 0x08, 0x00, 0x02, 0x04, 0x2B, 0x03, 0x08, 0x00, 0x02, + 0x04, 0x4B, 0x03, 0x08, 0x00, 0x01, 0x00, 0x34, 0x04, 0x00, 0x04, 0x01, 0x04, 0x03, 0x04, 0x07, + 0x04, 0x0C, 0x04, 0x0D, 0x04, 0x0E, 0x04, 0x19, 0x04, 0x39, 0x04, 0x50, 0x04, 0x51, 0x04, 0x53, + 0x04, 0x57, 0x04, 0x5C, 0x04, 0x5D, 0x04, 0x5E, 0x04, 0x76, 0x04, 0x77, 0x04, 0xC1, 0x04, 0xC2, + 0x04, 0xD0, 0x04, 0xD1, 0x04, 0xD2, 0x04, 0xD3, 0x04, 0xD6, 0x04, 0xD7, 0x04, 0xDA, 0x04, 0xDB, + 0x04, 0xDC, 0x04, 0xDD, 0x04, 0xDE, 0x04, 0xDF, 0x04, 0xE2, 0x04, 0xE3, 0x04, 0xE4, 0x04, 0xE5, + 0x04, 0xE6, 0x04, 0xE7, 0x04, 0xEA, 0x04, 0xEB, 0x04, 0xEC, 0x04, 0xED, 0x04, 0xEE, 0x04, 0xEF, + 0x04, 0xF0, 0x04, 0xF1, 0x04, 0xF2, 0x04, 0xF3, 0x04, 0xF4, 0x04, 0xF5, 0x04, 0xF8, 0x04, 0xF9, + 0x00, 0x01, 0x00, 0x46, 0x00, 0x08, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, + 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0x00, 0x02, 0x04, 0x15, 0x03, 0x40, 0x00, 0x02, 0x04, 0x13, + 0x03, 0x41, 0x00, 0x02, 0x04, 0x1A, 0x03, 0x41, 0x00, 0x02, 0x04, 0x18, 0x03, 0x40, 0x00, 0x02, + 0x04, 0x35, 0x03, 0x40, 0x00, 0x02, 0x04, 0x33, 0x03, 0x41, 0x00, 0x02, 0x04, 0x3A, 0x03, 0x41, + 0x00, 0x02, 0x04, 0x38, 0x03, 0x40, 0x00, 0x01, 0x00, 0x08, 0x04, 0x00, 0x04, 0x03, 0x04, 0x0C, + 0x04, 0x0D, 0x04, 0x50, 0x04, 0x53, 0x04, 0x5C, 0x04, 0x5D, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x01, 0x00, 0x8A, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x26, 0x00, 0x30, 0x00, 0x3A, + 0x00, 0x44, 0x00, 0x4E, 0x00, 0x58, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x80, 0x00, 0x01, + 0x00, 0x04, 0x09, 0x58, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x59, 0x00, 0x02, + 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x5A, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, + 0x09, 0x5B, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x5C, 0x00, 0x02, 0x09, 0x3C, + 0x00, 0x01, 0x00, 0x04, 0x09, 0x5D, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x29, + 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x5E, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, + 0x00, 0x04, 0x09, 0x5F, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x31, 0x00, 0x02, + 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x34, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x0B, + 0x09, 0x15, 0x09, 0x16, 0x09, 0x17, 0x09, 0x1C, 0x09, 0x21, 0x09, 0x22, 0x09, 0x28, 0x09, 0x2B, + 0x09, 0x2F, 0x09, 0x30, 0x09, 0x33, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, + 0x00, 0x5E, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x00, 0x3A, + 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x02, 0x09, 0x28, 0x09, 0x3C, + 0x00, 0x02, 0x09, 0x30, 0x09, 0x3C, 0x00, 0x02, 0x09, 0x33, 0x09, 0x3C, 0x00, 0x02, 0x09, 0x15, + 0x09, 0x3C, 0x00, 0x02, 0x09, 0x16, 0x09, 0x3C, 0x00, 0x02, 0x09, 0x17, 0x09, 0x3C, 0x00, 0x02, + 0x09, 0x1C, 0x09, 0x3C, 0x00, 0x02, 0x09, 0x21, 0x09, 0x3C, 0x00, 0x02, 0x09, 0x22, 0x09, 0x3C, + 0x00, 0x02, 0x09, 0x2B, 0x09, 0x3C, 0x00, 0x02, 0x09, 0x2F, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x0B, + 0x09, 0x29, 0x09, 0x31, 0x09, 0x34, 0x09, 0x58, 0x09, 0x59, 0x09, 0x5A, 0x09, 0x5B, 0x09, 0x5C, + 0x09, 0x5D, 0x09, 0x5E, 0x09, 0x5F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, + 0x33, 0x04, 0x00, 0x75, 0x00, 0xF0, 0x01, 0x1A, 0x04, 0x5A, 0x05, 0x0C, 0x08, 0x3C, 0x09, 0x24, + 0x09, 0xD6, 0x09, 0xE0, 0x0A, 0x54, 0x0D, 0x84, 0x0D, 0x8E, 0x0D, 0x98, 0x11, 0x44, 0x11, 0xF6, + 0x15, 0x92, 0x16, 0xBC, 0x17, 0x6E, 0x17, 0x88, 0x18, 0xB2, 0x1C, 0x4E, 0x1C, 0x78, 0x1C, 0xA2, + 0x1C, 0xAC, 0x1C, 0xC6, 0x1D, 0x5C, 0x1D, 0xF2, 0x1D, 0xFC, 0x1E, 0x06, 0x1E, 0x10, 0x1E, 0x1A, + 0x1E, 0x24, 0x1E, 0x2E, 0x1E, 0xC4, 0x1F, 0x5A, 0x1F, 0x64, 0x1F, 0x6E, 0x1F, 0x78, 0x1F, 0x82, + 0x1F, 0x8C, 0x1F, 0x96, 0x1F, 0xB8, 0x1F, 0xDA, 0x1F, 0xFC, 0x20, 0x1E, 0x20, 0xB4, 0x21, 0x4A, + 0x21, 0x54, 0x21, 0x5E, 0x21, 0x68, 0x21, 0x72, 0x21, 0x7C, 0x21, 0x86, 0x22, 0x1C, 0x22, 0xB2, + 0x22, 0xBC, 0x22, 0xC6, 0x22, 0xD0, 0x22, 0xDA, 0x22, 0xE4, 0x22, 0xEE, 0x23, 0x18, 0x23, 0x42, + 0x23, 0x6C, 0x23, 0x96, 0x23, 0xB8, 0x23, 0xDA, 0x23, 0xFC, 0x24, 0x1E, 0x24, 0x48, 0x24, 0x72, + 0x24, 0x9C, 0x25, 0x32, 0x25, 0xC8, 0x25, 0xD2, 0x25, 0xDC, 0x25, 0xE6, 0x25, 0xF0, 0x25, 0xFA, + 0x26, 0x04, 0x26, 0x9A, 0x27, 0x30, 0x27, 0x3A, 0x27, 0x44, 0x27, 0x4E, 0x27, 0x58, 0x27, 0x62, + 0x27, 0x6C, 0x27, 0x76, 0x27, 0x80, 0x27, 0x8A, 0x27, 0x94, 0x27, 0x9E, 0x27, 0xA8, 0x27, 0xD2, + 0x27, 0xFC, 0x28, 0x26, 0x28, 0x50, 0x28, 0x7A, 0x28, 0xA4, 0x28, 0xCE, 0x28, 0xF8, 0x29, 0x22, + 0x29, 0x4C, 0x29, 0x76, 0x29, 0xA0, 0x2A, 0x78, 0x2A, 0x82, 0x2B, 0x32, 0x2C, 0x5C, 0x2C, 0x86, + 0x2D, 0x5E, 0x2D, 0x68, 0x2E, 0x18, 0x2E, 0xF0, 0x2E, 0xFA, 0x2F, 0xAA, 0x2F, 0xD4, 0x00, 0x05, + 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0xED, 0x00, 0x02, 0x03, 0x00, + 0x03, 0x85, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xED, 0x00, 0x02, 0x03, 0x40, 0x03, 0x85, 0x00, 0x02, + 0x03, 0x41, 0x1F, 0xC1, 0x00, 0x02, 0x03, 0x42, 0x00, 0x4C, 0x00, 0x9A, 0x00, 0xA0, 0x00, 0xA6, + 0x00, 0xAC, 0x00, 0xB2, 0x00, 0xBC, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD6, 0x00, 0xE0, 0x00, 0xE8, + 0x00, 0xF2, 0x00, 0xFA, 0x01, 0x04, 0x01, 0x0C, 0x01, 0x16, 0x01, 0x20, 0x01, 0x2A, 0x01, 0x34, + 0x01, 0x3E, 0x01, 0x46, 0x01, 0x4C, 0x01, 0x56, 0x01, 0x5E, 0x01, 0x68, 0x01, 0x70, 0x01, 0x7A, + 0x01, 0x82, 0x01, 0x8C, 0x01, 0x94, 0x01, 0x9E, 0x01, 0xA6, 0x01, 0xB0, 0x01, 0xBA, 0x01, 0xC4, + 0x01, 0xCE, 0x01, 0xD8, 0x01, 0xE0, 0x01, 0xE6, 0x01, 0xEC, 0x01, 0xF2, 0x01, 0xFC, 0x02, 0x04, + 0x02, 0x0E, 0x02, 0x16, 0x02, 0x20, 0x02, 0x28, 0x02, 0x32, 0x02, 0x3A, 0x02, 0x44, 0x02, 0x4C, + 0x02, 0x56, 0x02, 0x60, 0x02, 0x6A, 0x02, 0x74, 0x02, 0x7E, 0x02, 0x86, 0x02, 0x8C, 0x02, 0x96, + 0x02, 0xA0, 0x02, 0xAA, 0x02, 0xB4, 0x02, 0xBE, 0x02, 0xC6, 0x02, 0xD0, 0x02, 0xDA, 0x02, 0xE4, + 0x02, 0xEE, 0x02, 0xF8, 0x03, 0x00, 0x03, 0x0A, 0x03, 0x14, 0x03, 0x1E, 0x03, 0x28, 0x03, 0x32, + 0x03, 0x3A, 0x1F, 0xBA, 0x00, 0x02, 0x03, 0x00, 0x03, 0x86, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xB9, + 0x00, 0x02, 0x03, 0x04, 0x1F, 0xB8, 0x00, 0x02, 0x03, 0x06, 0x1F, 0x8A, 0x00, 0x04, 0x03, 0x13, + 0x03, 0x00, 0x03, 0x45, 0x1F, 0x0A, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x8C, 0x00, 0x04, + 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x0C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x8A, + 0x00, 0x04, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x0A, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, + 0x1F, 0x8C, 0x00, 0x04, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x0C, 0x00, 0x03, 0x03, 0x13, + 0x03, 0x41, 0x1F, 0x8E, 0x00, 0x04, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x0E, 0x00, 0x03, + 0x03, 0x13, 0x03, 0x42, 0x1F, 0x8A, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x8C, + 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x8A, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, + 0x03, 0x40, 0x1F, 0x8C, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x8E, 0x00, 0x04, + 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x88, 0x00, 0x03, 0x03, 0x13, 0x03, 0x45, 0x1F, 0x08, + 0x00, 0x02, 0x03, 0x13, 0x1F, 0x8B, 0x00, 0x04, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x0B, + 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x8D, 0x00, 0x04, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, + 0x1F, 0x0D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x8B, 0x00, 0x04, 0x03, 0x14, 0x03, 0x40, + 0x03, 0x45, 0x1F, 0x0B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x8D, 0x00, 0x04, 0x03, 0x14, + 0x03, 0x41, 0x03, 0x45, 0x1F, 0x0D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x8F, 0x00, 0x04, + 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x0F, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, 0x1F, 0x8B, + 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x8D, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, + 0x03, 0x01, 0x1F, 0x8B, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x1F, 0x8D, 0x00, 0x04, + 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x8F, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, + 0x1F, 0x89, 0x00, 0x03, 0x03, 0x14, 0x03, 0x45, 0x1F, 0x09, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xBA, + 0x00, 0x02, 0x03, 0x40, 0x03, 0x86, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x8A, 0x00, 0x04, 0x03, 0x43, + 0x03, 0x00, 0x03, 0x45, 0x1F, 0x0A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x8C, 0x00, 0x04, + 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x0C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x8A, + 0x00, 0x04, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x0A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, + 0x1F, 0x8C, 0x00, 0x04, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x0C, 0x00, 0x03, 0x03, 0x43, + 0x03, 0x41, 0x1F, 0x8E, 0x00, 0x04, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x0E, 0x00, 0x03, + 0x03, 0x43, 0x03, 0x42, 0x1F, 0x8A, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x8C, + 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x8A, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, + 0x03, 0x40, 0x1F, 0x8C, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x8E, 0x00, 0x04, + 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x88, 0x00, 0x03, 0x03, 0x43, 0x03, 0x45, 0x1F, 0x08, + 0x00, 0x02, 0x03, 0x43, 0x1F, 0x8A, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x8C, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x8A, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, + 0x03, 0x40, 0x1F, 0x8C, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x8E, 0x00, 0x04, + 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x88, 0x00, 0x03, 0x03, 0x45, 0x03, 0x13, 0x1F, 0x8B, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x8D, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, + 0x03, 0x01, 0x1F, 0x8B, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x8D, 0x00, 0x04, + 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x8F, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, + 0x1F, 0x89, 0x00, 0x03, 0x03, 0x45, 0x03, 0x14, 0x1F, 0x8A, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, + 0x03, 0x00, 0x1F, 0x8C, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x8A, 0x00, 0x04, + 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x8C, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, + 0x1F, 0x8E, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x1F, 0x88, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x43, 0x1F, 0xBC, 0x00, 0x02, 0x03, 0x45, 0x00, 0x13, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, + 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x72, + 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0x00, 0x94, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAC, + 0x1F, 0xC8, 0x00, 0x02, 0x03, 0x00, 0x03, 0x88, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x1A, 0x00, 0x03, + 0x03, 0x13, 0x03, 0x00, 0x1F, 0x1C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x1A, 0x00, 0x03, + 0x03, 0x13, 0x03, 0x40, 0x1F, 0x1C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x18, 0x00, 0x02, + 0x03, 0x13, 0x1F, 0x1B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x1D, 0x00, 0x03, 0x03, 0x14, + 0x03, 0x01, 0x1F, 0x1B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x1D, 0x00, 0x03, 0x03, 0x14, + 0x03, 0x41, 0x1F, 0x19, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xC8, 0x00, 0x02, 0x03, 0x40, 0x03, 0x88, + 0x00, 0x02, 0x03, 0x41, 0x1F, 0x1A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x1C, 0x00, 0x03, + 0x03, 0x43, 0x03, 0x01, 0x1F, 0x1A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x1C, 0x00, 0x03, + 0x03, 0x43, 0x03, 0x41, 0x1F, 0x18, 0x00, 0x02, 0x03, 0x43, 0x00, 0x4A, 0x00, 0x96, 0x00, 0x9C, + 0x00, 0xA2, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBE, 0x00, 0xC6, 0x00, 0xD0, 0x00, 0xD8, 0x00, 0xE2, + 0x00, 0xEA, 0x00, 0xF4, 0x00, 0xFC, 0x01, 0x06, 0x01, 0x10, 0x01, 0x1A, 0x01, 0x24, 0x01, 0x2E, + 0x01, 0x36, 0x01, 0x3C, 0x01, 0x46, 0x01, 0x4E, 0x01, 0x58, 0x01, 0x60, 0x01, 0x6A, 0x01, 0x72, + 0x01, 0x7C, 0x01, 0x84, 0x01, 0x8E, 0x01, 0x96, 0x01, 0xA0, 0x01, 0xAA, 0x01, 0xB4, 0x01, 0xBE, + 0x01, 0xC8, 0x01, 0xD0, 0x01, 0xD6, 0x01, 0xDC, 0x01, 0xE2, 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFE, + 0x02, 0x06, 0x02, 0x10, 0x02, 0x18, 0x02, 0x22, 0x02, 0x2A, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x46, + 0x02, 0x50, 0x02, 0x5A, 0x02, 0x64, 0x02, 0x6E, 0x02, 0x76, 0x02, 0x7C, 0x02, 0x86, 0x02, 0x90, + 0x02, 0x9A, 0x02, 0xA4, 0x02, 0xAE, 0x02, 0xB6, 0x02, 0xC0, 0x02, 0xCA, 0x02, 0xD4, 0x02, 0xDE, + 0x02, 0xE8, 0x02, 0xF0, 0x02, 0xFA, 0x03, 0x04, 0x03, 0x0E, 0x03, 0x18, 0x03, 0x22, 0x03, 0x2A, + 0x1F, 0xCA, 0x00, 0x02, 0x03, 0x00, 0x03, 0x89, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x9A, 0x00, 0x04, + 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x2A, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x9C, + 0x00, 0x04, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x2C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, + 0x1F, 0x9A, 0x00, 0x04, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x2A, 0x00, 0x03, 0x03, 0x13, + 0x03, 0x40, 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x2C, 0x00, 0x03, + 0x03, 0x13, 0x03, 0x41, 0x1F, 0x9E, 0x00, 0x04, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x2E, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x9A, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, + 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x9A, 0x00, 0x04, 0x03, 0x13, + 0x03, 0x45, 0x03, 0x40, 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x9E, + 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x98, 0x00, 0x03, 0x03, 0x13, 0x03, 0x45, + 0x1F, 0x28, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x9B, 0x00, 0x04, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, + 0x1F, 0x2B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x9D, 0x00, 0x04, 0x03, 0x14, 0x03, 0x01, + 0x03, 0x45, 0x1F, 0x2D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x9B, 0x00, 0x04, 0x03, 0x14, + 0x03, 0x40, 0x03, 0x45, 0x1F, 0x2B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x9D, 0x00, 0x04, + 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x2D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x9F, + 0x00, 0x04, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x2F, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, + 0x1F, 0x9B, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x9D, 0x00, 0x04, 0x03, 0x14, + 0x03, 0x45, 0x03, 0x01, 0x1F, 0x9B, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x1F, 0x9D, + 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x9F, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, + 0x03, 0x42, 0x1F, 0x99, 0x00, 0x03, 0x03, 0x14, 0x03, 0x45, 0x1F, 0x29, 0x00, 0x02, 0x03, 0x14, + 0x1F, 0xCA, 0x00, 0x02, 0x03, 0x40, 0x03, 0x89, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x9A, 0x00, 0x04, + 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x2A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x9C, + 0x00, 0x04, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x2C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, + 0x1F, 0x9A, 0x00, 0x04, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x2A, 0x00, 0x03, 0x03, 0x43, + 0x03, 0x40, 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x2C, 0x00, 0x03, + 0x03, 0x43, 0x03, 0x41, 0x1F, 0x9E, 0x00, 0x04, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x2E, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0x9A, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, + 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x9A, 0x00, 0x04, 0x03, 0x43, + 0x03, 0x45, 0x03, 0x40, 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x9E, + 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x98, 0x00, 0x03, 0x03, 0x43, 0x03, 0x45, + 0x1F, 0x28, 0x00, 0x02, 0x03, 0x43, 0x1F, 0x9A, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, + 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x9A, 0x00, 0x04, 0x03, 0x45, + 0x03, 0x13, 0x03, 0x40, 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x9E, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x98, 0x00, 0x03, 0x03, 0x45, 0x03, 0x13, + 0x1F, 0x9B, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x9D, 0x00, 0x04, 0x03, 0x45, + 0x03, 0x14, 0x03, 0x01, 0x1F, 0x9B, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x9D, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x9F, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, + 0x03, 0x42, 0x1F, 0x99, 0x00, 0x03, 0x03, 0x45, 0x03, 0x14, 0x1F, 0x9A, 0x00, 0x04, 0x03, 0x45, + 0x03, 0x43, 0x03, 0x00, 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x9A, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, + 0x03, 0x41, 0x1F, 0x9E, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x1F, 0x98, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x43, 0x1F, 0xCC, 0x00, 0x02, 0x03, 0x45, 0x00, 0x19, 0x00, 0x34, 0x00, 0x3A, + 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x72, + 0x00, 0x7A, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA8, 0x00, 0xAE, + 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xCA, 0x00, 0xD2, 0x00, 0xDA, 0x00, 0xE2, 0x1F, 0xDA, + 0x00, 0x02, 0x03, 0x00, 0x03, 0x8A, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xD9, 0x00, 0x02, 0x03, 0x04, + 0x1F, 0xD8, 0x00, 0x02, 0x03, 0x06, 0x03, 0xAA, 0x00, 0x02, 0x03, 0x08, 0x1F, 0x3A, 0x00, 0x03, + 0x03, 0x13, 0x03, 0x00, 0x1F, 0x3C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x3A, 0x00, 0x03, + 0x03, 0x13, 0x03, 0x40, 0x1F, 0x3C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x3E, 0x00, 0x03, + 0x03, 0x13, 0x03, 0x42, 0x1F, 0x38, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x3B, 0x00, 0x03, 0x03, 0x14, + 0x03, 0x00, 0x1F, 0x3D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x3B, 0x00, 0x03, 0x03, 0x14, + 0x03, 0x40, 0x1F, 0x3D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x3F, 0x00, 0x03, 0x03, 0x14, + 0x03, 0x42, 0x1F, 0x39, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xDA, 0x00, 0x02, 0x03, 0x40, 0x03, 0x8A, + 0x00, 0x02, 0x03, 0x41, 0x1F, 0x3A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x3C, 0x00, 0x03, + 0x03, 0x43, 0x03, 0x01, 0x1F, 0x3A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x3C, 0x00, 0x03, + 0x03, 0x43, 0x03, 0x41, 0x1F, 0x3E, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0x38, 0x00, 0x02, + 0x03, 0x43, 0x00, 0x13, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, + 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, + 0x00, 0x8C, 0x00, 0x94, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAC, 0x1F, 0xF8, 0x00, 0x02, 0x03, 0x00, + 0x03, 0x8C, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x4A, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x4C, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x4A, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0x4C, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x48, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x4B, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x00, 0x1F, 0x4D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x4B, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x40, 0x1F, 0x4D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x49, 0x00, 0x02, + 0x03, 0x14, 0x1F, 0xF8, 0x00, 0x02, 0x03, 0x40, 0x03, 0x8C, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x4A, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x4C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x4A, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x4C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x48, + 0x00, 0x02, 0x03, 0x43, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xEC, 0x00, 0x02, 0x03, 0x14, 0x00, 0x0D, + 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x00, 0x3A, 0x00, 0x42, 0x00, 0x4A, + 0x00, 0x52, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, 0x1F, 0xEA, 0x00, 0x02, 0x03, 0x00, + 0x03, 0x8E, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xE9, 0x00, 0x02, 0x03, 0x04, 0x1F, 0xE8, 0x00, 0x02, + 0x03, 0x06, 0x03, 0xAB, 0x00, 0x02, 0x03, 0x08, 0x1F, 0x5B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, + 0x1F, 0x5D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x5B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, + 0x1F, 0x5D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x5F, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, + 0x1F, 0x59, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xEA, 0x00, 0x02, 0x03, 0x40, 0x03, 0x8E, 0x00, 0x02, + 0x03, 0x41, 0x00, 0x4A, 0x00, 0x96, 0x00, 0x9C, 0x00, 0xA2, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBE, + 0x00, 0xC6, 0x00, 0xD0, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF4, 0x00, 0xFC, 0x01, 0x06, + 0x01, 0x10, 0x01, 0x1A, 0x01, 0x24, 0x01, 0x2E, 0x01, 0x36, 0x01, 0x3C, 0x01, 0x46, 0x01, 0x4E, + 0x01, 0x58, 0x01, 0x60, 0x01, 0x6A, 0x01, 0x72, 0x01, 0x7C, 0x01, 0x84, 0x01, 0x8E, 0x01, 0x96, + 0x01, 0xA0, 0x01, 0xAA, 0x01, 0xB4, 0x01, 0xBE, 0x01, 0xC8, 0x01, 0xD0, 0x01, 0xD6, 0x01, 0xDC, + 0x01, 0xE2, 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFE, 0x02, 0x06, 0x02, 0x10, 0x02, 0x18, 0x02, 0x22, + 0x02, 0x2A, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x46, 0x02, 0x50, 0x02, 0x5A, 0x02, 0x64, 0x02, 0x6E, + 0x02, 0x76, 0x02, 0x7C, 0x02, 0x86, 0x02, 0x90, 0x02, 0x9A, 0x02, 0xA4, 0x02, 0xAE, 0x02, 0xB6, + 0x02, 0xC0, 0x02, 0xCA, 0x02, 0xD4, 0x02, 0xDE, 0x02, 0xE8, 0x02, 0xF0, 0x02, 0xFA, 0x03, 0x04, + 0x03, 0x0E, 0x03, 0x18, 0x03, 0x22, 0x03, 0x2A, 0x1F, 0xFA, 0x00, 0x02, 0x03, 0x00, 0x03, 0x8F, + 0x00, 0x02, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x6A, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, + 0x1F, 0x6C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x13, 0x03, 0x40, + 0x03, 0x45, 0x1F, 0x6A, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x13, + 0x03, 0x41, 0x03, 0x45, 0x1F, 0x6C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, + 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x6E, 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0xAA, + 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, + 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, + 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, + 0x1F, 0xA8, 0x00, 0x03, 0x03, 0x13, 0x03, 0x45, 0x1F, 0x68, 0x00, 0x02, 0x03, 0x13, 0x1F, 0xAB, + 0x00, 0x04, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x6B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, + 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x6D, 0x00, 0x03, 0x03, 0x14, + 0x03, 0x01, 0x1F, 0xAB, 0x00, 0x04, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x6B, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x6D, + 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0xAF, 0x00, 0x04, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, + 0x1F, 0x6F, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, 0x1F, 0xAB, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, + 0x03, 0x00, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x1F, 0xAB, 0x00, 0x04, + 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, + 0x1F, 0xAF, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x1F, 0xA9, 0x00, 0x03, 0x03, 0x14, + 0x03, 0x45, 0x1F, 0x69, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xFA, 0x00, 0x02, 0x03, 0x40, 0x03, 0x8F, + 0x00, 0x02, 0x03, 0x41, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x6A, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, + 0x1F, 0x6C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x43, 0x03, 0x40, + 0x03, 0x45, 0x1F, 0x6A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x43, + 0x03, 0x41, 0x03, 0x45, 0x1F, 0x6C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, + 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x6E, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0xAA, + 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, + 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, + 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, + 0x1F, 0xA8, 0x00, 0x03, 0x03, 0x43, 0x03, 0x45, 0x1F, 0x68, 0x00, 0x02, 0x03, 0x43, 0x1F, 0xAA, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, + 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, + 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, + 0x1F, 0xA8, 0x00, 0x03, 0x03, 0x45, 0x03, 0x13, 0x1F, 0xAB, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, + 0x03, 0x00, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x1F, 0xAB, 0x00, 0x04, + 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, + 0x1F, 0xAF, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x1F, 0xA9, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x14, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, + 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, + 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, 0x03, 0x45, + 0x03, 0x43, 0x03, 0x42, 0x1F, 0xA8, 0x00, 0x03, 0x03, 0x45, 0x03, 0x43, 0x1F, 0xFC, 0x00, 0x02, + 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xB4, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, + 0x1F, 0xC4, 0x00, 0x02, 0x03, 0x45, 0x00, 0x57, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xBE, 0x00, 0xC6, + 0x00, 0xCC, 0x00, 0xD2, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF4, 0x00, 0xFC, 0x01, 0x06, + 0x01, 0x0E, 0x01, 0x18, 0x01, 0x20, 0x01, 0x2A, 0x01, 0x32, 0x01, 0x3C, 0x01, 0x46, 0x01, 0x50, + 0x01, 0x5A, 0x01, 0x64, 0x01, 0x6C, 0x01, 0x72, 0x01, 0x7C, 0x01, 0x84, 0x01, 0x8E, 0x01, 0x96, + 0x01, 0xA0, 0x01, 0xA8, 0x01, 0xB2, 0x01, 0xBA, 0x01, 0xC4, 0x01, 0xCC, 0x01, 0xD6, 0x01, 0xE0, + 0x01, 0xEA, 0x01, 0xF4, 0x01, 0xFE, 0x02, 0x06, 0x02, 0x0C, 0x02, 0x14, 0x02, 0x1A, 0x02, 0x22, + 0x02, 0x28, 0x02, 0x30, 0x02, 0x36, 0x02, 0x40, 0x02, 0x48, 0x02, 0x52, 0x02, 0x5A, 0x02, 0x64, + 0x02, 0x6C, 0x02, 0x76, 0x02, 0x7E, 0x02, 0x88, 0x02, 0x90, 0x02, 0x9A, 0x02, 0xA4, 0x02, 0xAE, + 0x02, 0xB8, 0x02, 0xC2, 0x02, 0xCA, 0x02, 0xD0, 0x02, 0xD8, 0x02, 0xE0, 0x02, 0xEA, 0x02, 0xF4, + 0x02, 0xFE, 0x03, 0x08, 0x03, 0x12, 0x03, 0x1A, 0x03, 0x24, 0x03, 0x2E, 0x03, 0x38, 0x03, 0x42, + 0x03, 0x4C, 0x03, 0x54, 0x03, 0x5C, 0x03, 0x64, 0x03, 0x6C, 0x03, 0x76, 0x03, 0x80, 0x03, 0x8A, + 0x03, 0x94, 0x03, 0x9E, 0x03, 0xA6, 0x1F, 0xB2, 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x70, + 0x00, 0x02, 0x03, 0x00, 0x1F, 0xB4, 0x00, 0x03, 0x03, 0x01, 0x03, 0x45, 0x03, 0xAC, 0x00, 0x02, + 0x03, 0x01, 0x1F, 0xB1, 0x00, 0x02, 0x03, 0x04, 0x1F, 0xB0, 0x00, 0x02, 0x03, 0x06, 0x1F, 0x82, + 0x00, 0x04, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x02, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, + 0x1F, 0x84, 0x00, 0x04, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x04, 0x00, 0x03, 0x03, 0x13, + 0x03, 0x01, 0x1F, 0x82, 0x00, 0x04, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x02, 0x00, 0x03, + 0x03, 0x13, 0x03, 0x40, 0x1F, 0x84, 0x00, 0x04, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x04, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x86, 0x00, 0x04, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, + 0x1F, 0x06, 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x82, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, + 0x03, 0x00, 0x1F, 0x84, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x82, 0x00, 0x04, + 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x1F, 0x84, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, + 0x1F, 0x86, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x80, 0x00, 0x03, 0x03, 0x13, + 0x03, 0x45, 0x1F, 0x00, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x83, 0x00, 0x04, 0x03, 0x14, 0x03, 0x00, + 0x03, 0x45, 0x1F, 0x03, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x85, 0x00, 0x04, 0x03, 0x14, + 0x03, 0x01, 0x03, 0x45, 0x1F, 0x05, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x83, 0x00, 0x04, + 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x03, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x85, + 0x00, 0x04, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x05, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, + 0x1F, 0x87, 0x00, 0x04, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x07, 0x00, 0x03, 0x03, 0x14, + 0x03, 0x42, 0x1F, 0x83, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x85, 0x00, 0x04, + 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x83, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, + 0x1F, 0x85, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x87, 0x00, 0x04, 0x03, 0x14, + 0x03, 0x45, 0x03, 0x42, 0x1F, 0x81, 0x00, 0x03, 0x03, 0x14, 0x03, 0x45, 0x1F, 0x01, 0x00, 0x02, + 0x03, 0x14, 0x1F, 0xB2, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x70, 0x00, 0x02, 0x03, 0x40, + 0x1F, 0xB4, 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x03, 0xAC, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xB7, + 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, 0x1F, 0xB6, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x82, 0x00, 0x04, + 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x02, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x84, + 0x00, 0x04, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x04, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, + 0x1F, 0x82, 0x00, 0x04, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x02, 0x00, 0x03, 0x03, 0x43, + 0x03, 0x40, 0x1F, 0x84, 0x00, 0x04, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x04, 0x00, 0x03, + 0x03, 0x43, 0x03, 0x41, 0x1F, 0x86, 0x00, 0x04, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x06, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0x82, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, + 0x1F, 0x84, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x82, 0x00, 0x04, 0x03, 0x43, + 0x03, 0x45, 0x03, 0x40, 0x1F, 0x84, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x86, + 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x80, 0x00, 0x03, 0x03, 0x43, 0x03, 0x45, + 0x1F, 0x00, 0x00, 0x02, 0x03, 0x43, 0x1F, 0xB2, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xB4, + 0x00, 0x03, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x82, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, + 0x1F, 0x84, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x82, 0x00, 0x04, 0x03, 0x45, + 0x03, 0x13, 0x03, 0x40, 0x1F, 0x84, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x86, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x80, 0x00, 0x03, 0x03, 0x45, 0x03, 0x13, + 0x1F, 0x83, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x85, 0x00, 0x04, 0x03, 0x45, + 0x03, 0x14, 0x03, 0x01, 0x1F, 0x83, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x85, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x87, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, + 0x03, 0x42, 0x1F, 0x81, 0x00, 0x03, 0x03, 0x45, 0x03, 0x14, 0x1F, 0xB2, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x40, 0x1F, 0xB4, 0x00, 0x03, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xB7, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x42, 0x1F, 0x82, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x84, 0x00, 0x04, + 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x82, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, + 0x1F, 0x84, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x86, 0x00, 0x04, 0x03, 0x45, + 0x03, 0x43, 0x03, 0x42, 0x1F, 0x80, 0x00, 0x03, 0x03, 0x45, 0x03, 0x43, 0x1F, 0xB3, 0x00, 0x02, + 0x03, 0x45, 0x00, 0x13, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, + 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, + 0x00, 0x8C, 0x00, 0x94, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAC, 0x1F, 0x72, 0x00, 0x02, 0x03, 0x00, + 0x03, 0xAD, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x12, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x14, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x12, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0x14, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x10, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x13, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x00, 0x1F, 0x15, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x13, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x40, 0x1F, 0x15, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x11, 0x00, 0x02, + 0x03, 0x14, 0x1F, 0x72, 0x00, 0x02, 0x03, 0x40, 0x03, 0xAD, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x12, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x14, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x12, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x14, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x10, + 0x00, 0x02, 0x03, 0x43, 0x00, 0x55, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xC8, + 0x00, 0xD2, 0x00, 0xDA, 0x00, 0xE4, 0x00, 0xEC, 0x00, 0xF6, 0x00, 0xFE, 0x01, 0x08, 0x01, 0x10, + 0x01, 0x1A, 0x01, 0x22, 0x01, 0x2C, 0x01, 0x36, 0x01, 0x40, 0x01, 0x4A, 0x01, 0x54, 0x01, 0x5C, + 0x01, 0x62, 0x01, 0x6C, 0x01, 0x74, 0x01, 0x7E, 0x01, 0x86, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA2, + 0x01, 0xAA, 0x01, 0xB4, 0x01, 0xBC, 0x01, 0xC6, 0x01, 0xD0, 0x01, 0xDA, 0x01, 0xE4, 0x01, 0xEE, + 0x01, 0xF6, 0x01, 0xFC, 0x02, 0x04, 0x02, 0x0A, 0x02, 0x12, 0x02, 0x18, 0x02, 0x20, 0x02, 0x26, + 0x02, 0x30, 0x02, 0x38, 0x02, 0x42, 0x02, 0x4A, 0x02, 0x54, 0x02, 0x5C, 0x02, 0x66, 0x02, 0x6E, + 0x02, 0x78, 0x02, 0x80, 0x02, 0x8A, 0x02, 0x94, 0x02, 0x9E, 0x02, 0xA8, 0x02, 0xB2, 0x02, 0xBA, + 0x02, 0xC0, 0x02, 0xC8, 0x02, 0xD0, 0x02, 0xDA, 0x02, 0xE4, 0x02, 0xEE, 0x02, 0xF8, 0x03, 0x02, + 0x03, 0x0A, 0x03, 0x14, 0x03, 0x1E, 0x03, 0x28, 0x03, 0x32, 0x03, 0x3C, 0x03, 0x44, 0x03, 0x4C, + 0x03, 0x54, 0x03, 0x5C, 0x03, 0x66, 0x03, 0x70, 0x03, 0x7A, 0x03, 0x84, 0x03, 0x8E, 0x03, 0x96, + 0x1F, 0xC2, 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x74, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xC4, + 0x00, 0x03, 0x03, 0x01, 0x03, 0x45, 0x03, 0xAE, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x92, 0x00, 0x04, + 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x22, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x94, + 0x00, 0x04, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x24, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, + 0x1F, 0x92, 0x00, 0x04, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x22, 0x00, 0x03, 0x03, 0x13, + 0x03, 0x40, 0x1F, 0x94, 0x00, 0x04, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x24, 0x00, 0x03, + 0x03, 0x13, 0x03, 0x41, 0x1F, 0x96, 0x00, 0x04, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x26, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x92, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, + 0x1F, 0x94, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x92, 0x00, 0x04, 0x03, 0x13, + 0x03, 0x45, 0x03, 0x40, 0x1F, 0x94, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x96, + 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x90, 0x00, 0x03, 0x03, 0x13, 0x03, 0x45, + 0x1F, 0x20, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x93, 0x00, 0x04, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, + 0x1F, 0x23, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x95, 0x00, 0x04, 0x03, 0x14, 0x03, 0x01, + 0x03, 0x45, 0x1F, 0x25, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x93, 0x00, 0x04, 0x03, 0x14, + 0x03, 0x40, 0x03, 0x45, 0x1F, 0x23, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x95, 0x00, 0x04, + 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x25, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x97, + 0x00, 0x04, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x27, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, + 0x1F, 0x93, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x95, 0x00, 0x04, 0x03, 0x14, + 0x03, 0x45, 0x03, 0x01, 0x1F, 0x93, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x1F, 0x95, + 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x97, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, + 0x03, 0x42, 0x1F, 0x91, 0x00, 0x03, 0x03, 0x14, 0x03, 0x45, 0x1F, 0x21, 0x00, 0x02, 0x03, 0x14, + 0x1F, 0xC2, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x74, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xC4, + 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x03, 0xAE, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xC7, 0x00, 0x03, + 0x03, 0x42, 0x03, 0x45, 0x1F, 0xC6, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x92, 0x00, 0x04, 0x03, 0x43, + 0x03, 0x00, 0x03, 0x45, 0x1F, 0x22, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x94, 0x00, 0x04, + 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x24, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x92, + 0x00, 0x04, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x22, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, + 0x1F, 0x94, 0x00, 0x04, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x24, 0x00, 0x03, 0x03, 0x43, + 0x03, 0x41, 0x1F, 0x96, 0x00, 0x04, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x26, 0x00, 0x03, + 0x03, 0x43, 0x03, 0x42, 0x1F, 0x92, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x94, + 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x92, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, + 0x03, 0x40, 0x1F, 0x94, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x96, 0x00, 0x04, + 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x90, 0x00, 0x03, 0x03, 0x43, 0x03, 0x45, 0x1F, 0x20, + 0x00, 0x02, 0x03, 0x43, 0x1F, 0xC2, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xC4, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x01, 0x1F, 0x92, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x94, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x92, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, + 0x03, 0x40, 0x1F, 0x94, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x96, 0x00, 0x04, + 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x90, 0x00, 0x03, 0x03, 0x45, 0x03, 0x13, 0x1F, 0x93, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x95, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, + 0x03, 0x01, 0x1F, 0x93, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x95, 0x00, 0x04, + 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x97, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, + 0x1F, 0x91, 0x00, 0x03, 0x03, 0x45, 0x03, 0x14, 0x1F, 0xC2, 0x00, 0x03, 0x03, 0x45, 0x03, 0x40, + 0x1F, 0xC4, 0x00, 0x03, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xC7, 0x00, 0x03, 0x03, 0x45, 0x03, 0x42, + 0x1F, 0x92, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x94, 0x00, 0x04, 0x03, 0x45, + 0x03, 0x43, 0x03, 0x01, 0x1F, 0x92, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x94, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x96, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, + 0x03, 0x42, 0x1F, 0x90, 0x00, 0x03, 0x03, 0x45, 0x03, 0x43, 0x1F, 0xC3, 0x00, 0x02, 0x03, 0x45, + 0x00, 0x20, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, + 0x00, 0x72, 0x00, 0x7A, 0x00, 0x82, 0x00, 0x88, 0x00, 0x90, 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA8, + 0x00, 0xB0, 0x00, 0xB6, 0x00, 0xBE, 0x00, 0xC6, 0x00, 0xCE, 0x00, 0xD6, 0x00, 0xDE, 0x00, 0xE4, + 0x00, 0xEA, 0x00, 0xF0, 0x00, 0xF6, 0x00, 0xFE, 0x01, 0x06, 0x01, 0x0E, 0x01, 0x16, 0x01, 0x1E, + 0x01, 0x24, 0x1F, 0x76, 0x00, 0x02, 0x03, 0x00, 0x03, 0xAF, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xD1, + 0x00, 0x02, 0x03, 0x04, 0x1F, 0xD0, 0x00, 0x02, 0x03, 0x06, 0x1F, 0xD2, 0x00, 0x03, 0x03, 0x08, + 0x03, 0x00, 0x03, 0x90, 0x00, 0x03, 0x03, 0x08, 0x03, 0x01, 0x1F, 0xD2, 0x00, 0x03, 0x03, 0x08, + 0x03, 0x40, 0x03, 0x90, 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, 0x1F, 0xD7, 0x00, 0x03, 0x03, 0x08, + 0x03, 0x42, 0x03, 0xCA, 0x00, 0x02, 0x03, 0x08, 0x1F, 0x32, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, + 0x1F, 0x34, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x32, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, + 0x1F, 0x34, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x36, 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, + 0x1F, 0x30, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x33, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x35, + 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x33, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x35, + 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x37, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, 0x1F, 0x31, + 0x00, 0x02, 0x03, 0x14, 0x1F, 0x76, 0x00, 0x02, 0x03, 0x40, 0x03, 0xAF, 0x00, 0x02, 0x03, 0x41, + 0x1F, 0xD6, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x32, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x34, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x32, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x34, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x36, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0x30, + 0x00, 0x02, 0x03, 0x43, 0x03, 0x90, 0x00, 0x02, 0x03, 0x44, 0x00, 0x13, 0x00, 0x28, 0x00, 0x2E, + 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, + 0x00, 0x72, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0x00, 0x94, 0x00, 0x9C, 0x00, 0xA4, + 0x00, 0xAC, 0x1F, 0x78, 0x00, 0x02, 0x03, 0x00, 0x03, 0xCC, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x42, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x44, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x42, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0x44, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x40, + 0x00, 0x02, 0x03, 0x13, 0x1F, 0x43, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x45, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x01, 0x1F, 0x43, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x45, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x41, 0x1F, 0x41, 0x00, 0x02, 0x03, 0x14, 0x1F, 0x78, 0x00, 0x02, 0x03, 0x40, + 0x03, 0xCC, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x42, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x44, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x42, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x44, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x40, 0x00, 0x02, 0x03, 0x43, 0x00, 0x03, 0x00, 0x08, + 0x00, 0x0E, 0x00, 0x14, 0x1F, 0xE4, 0x00, 0x02, 0x03, 0x13, 0x1F, 0xE5, 0x00, 0x02, 0x03, 0x14, + 0x1F, 0xE4, 0x00, 0x02, 0x03, 0x43, 0x00, 0x20, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, + 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x82, 0x00, 0x88, 0x00, 0x90, + 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA8, 0x00, 0xB0, 0x00, 0xB6, 0x00, 0xBE, 0x00, 0xC6, 0x00, 0xCE, + 0x00, 0xD6, 0x00, 0xDE, 0x00, 0xE4, 0x00, 0xEA, 0x00, 0xF0, 0x00, 0xF6, 0x00, 0xFE, 0x01, 0x06, + 0x01, 0x0E, 0x01, 0x16, 0x01, 0x1E, 0x01, 0x24, 0x1F, 0x7A, 0x00, 0x02, 0x03, 0x00, 0x03, 0xCD, + 0x00, 0x02, 0x03, 0x01, 0x1F, 0xE1, 0x00, 0x02, 0x03, 0x04, 0x1F, 0xE0, 0x00, 0x02, 0x03, 0x06, + 0x1F, 0xE2, 0x00, 0x03, 0x03, 0x08, 0x03, 0x00, 0x03, 0xB0, 0x00, 0x03, 0x03, 0x08, 0x03, 0x01, + 0x1F, 0xE2, 0x00, 0x03, 0x03, 0x08, 0x03, 0x40, 0x03, 0xB0, 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, + 0x1F, 0xE7, 0x00, 0x03, 0x03, 0x08, 0x03, 0x42, 0x03, 0xCB, 0x00, 0x02, 0x03, 0x08, 0x1F, 0x52, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x54, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x52, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0x54, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x56, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x50, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x53, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x00, 0x1F, 0x55, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x53, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x40, 0x1F, 0x55, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x57, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x42, 0x1F, 0x51, 0x00, 0x02, 0x03, 0x14, 0x1F, 0x7A, 0x00, 0x02, 0x03, 0x40, + 0x03, 0xCD, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xE6, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x52, 0x00, 0x03, + 0x03, 0x43, 0x03, 0x00, 0x1F, 0x54, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x52, 0x00, 0x03, + 0x03, 0x43, 0x03, 0x40, 0x1F, 0x54, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x56, 0x00, 0x03, + 0x03, 0x43, 0x03, 0x42, 0x1F, 0x50, 0x00, 0x02, 0x03, 0x43, 0x03, 0xB0, 0x00, 0x02, 0x03, 0x44, + 0x00, 0x55, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xC8, 0x00, 0xD2, 0x00, 0xDA, + 0x00, 0xE4, 0x00, 0xEC, 0x00, 0xF6, 0x00, 0xFE, 0x01, 0x08, 0x01, 0x10, 0x01, 0x1A, 0x01, 0x22, + 0x01, 0x2C, 0x01, 0x36, 0x01, 0x40, 0x01, 0x4A, 0x01, 0x54, 0x01, 0x5C, 0x01, 0x62, 0x01, 0x6C, + 0x01, 0x74, 0x01, 0x7E, 0x01, 0x86, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA2, 0x01, 0xAA, 0x01, 0xB4, + 0x01, 0xBC, 0x01, 0xC6, 0x01, 0xD0, 0x01, 0xDA, 0x01, 0xE4, 0x01, 0xEE, 0x01, 0xF6, 0x01, 0xFC, + 0x02, 0x04, 0x02, 0x0A, 0x02, 0x12, 0x02, 0x18, 0x02, 0x20, 0x02, 0x26, 0x02, 0x30, 0x02, 0x38, + 0x02, 0x42, 0x02, 0x4A, 0x02, 0x54, 0x02, 0x5C, 0x02, 0x66, 0x02, 0x6E, 0x02, 0x78, 0x02, 0x80, + 0x02, 0x8A, 0x02, 0x94, 0x02, 0x9E, 0x02, 0xA8, 0x02, 0xB2, 0x02, 0xBA, 0x02, 0xC0, 0x02, 0xC8, + 0x02, 0xD0, 0x02, 0xDA, 0x02, 0xE4, 0x02, 0xEE, 0x02, 0xF8, 0x03, 0x02, 0x03, 0x0A, 0x03, 0x14, + 0x03, 0x1E, 0x03, 0x28, 0x03, 0x32, 0x03, 0x3C, 0x03, 0x44, 0x03, 0x4C, 0x03, 0x54, 0x03, 0x5C, + 0x03, 0x66, 0x03, 0x70, 0x03, 0x7A, 0x03, 0x84, 0x03, 0x8E, 0x03, 0x96, 0x1F, 0xF2, 0x00, 0x03, + 0x03, 0x00, 0x03, 0x45, 0x1F, 0x7C, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xF4, 0x00, 0x03, 0x03, 0x01, + 0x03, 0x45, 0x03, 0xCE, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x13, 0x03, 0x00, + 0x03, 0x45, 0x1F, 0x62, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x04, 0x03, 0x13, + 0x03, 0x01, 0x03, 0x45, 0x1F, 0x64, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x04, + 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x62, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0xA4, + 0x00, 0x04, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x64, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, + 0x1F, 0xA6, 0x00, 0x04, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x66, 0x00, 0x03, 0x03, 0x13, + 0x03, 0x42, 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x04, + 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, + 0x1F, 0xA4, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xA6, 0x00, 0x04, 0x03, 0x13, + 0x03, 0x45, 0x03, 0x42, 0x1F, 0xA0, 0x00, 0x03, 0x03, 0x13, 0x03, 0x45, 0x1F, 0x60, 0x00, 0x02, + 0x03, 0x13, 0x1F, 0xA3, 0x00, 0x04, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x63, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x00, 0x1F, 0xA5, 0x00, 0x04, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x65, + 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0xA3, 0x00, 0x04, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, + 0x1F, 0x63, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0xA5, 0x00, 0x04, 0x03, 0x14, 0x03, 0x41, + 0x03, 0x45, 0x1F, 0x65, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0xA7, 0x00, 0x04, 0x03, 0x14, + 0x03, 0x42, 0x03, 0x45, 0x1F, 0x67, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, 0x1F, 0xA3, 0x00, 0x04, + 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xA5, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, + 0x1F, 0xA3, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xA5, 0x00, 0x04, 0x03, 0x14, + 0x03, 0x45, 0x03, 0x41, 0x1F, 0xA7, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x1F, 0xA1, + 0x00, 0x03, 0x03, 0x14, 0x03, 0x45, 0x1F, 0x61, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xF2, 0x00, 0x03, + 0x03, 0x40, 0x03, 0x45, 0x1F, 0x7C, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xF4, 0x00, 0x03, 0x03, 0x41, + 0x03, 0x45, 0x03, 0xCE, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xF7, 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, + 0x1F, 0xF6, 0x00, 0x02, 0x03, 0x42, 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, + 0x1F, 0x62, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x04, 0x03, 0x43, 0x03, 0x01, + 0x03, 0x45, 0x1F, 0x64, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x43, + 0x03, 0x40, 0x03, 0x45, 0x1F, 0x62, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0xA4, 0x00, 0x04, + 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x64, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0xA6, + 0x00, 0x04, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x66, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, + 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x04, 0x03, 0x43, + 0x03, 0x45, 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xA4, + 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xA6, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, + 0x03, 0x42, 0x1F, 0xA0, 0x00, 0x03, 0x03, 0x43, 0x03, 0x45, 0x1F, 0x60, 0x00, 0x02, 0x03, 0x43, + 0x1F, 0xF2, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xF4, 0x00, 0x03, 0x03, 0x45, 0x03, 0x01, + 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x04, 0x03, 0x45, + 0x03, 0x13, 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x1F, 0xA4, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x1F, 0xA6, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, + 0x03, 0x42, 0x1F, 0xA0, 0x00, 0x03, 0x03, 0x45, 0x03, 0x13, 0x1F, 0xA3, 0x00, 0x04, 0x03, 0x45, + 0x03, 0x14, 0x03, 0x00, 0x1F, 0xA5, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x1F, 0xA3, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x1F, 0xA5, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, + 0x03, 0x41, 0x1F, 0xA7, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x1F, 0xA1, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x14, 0x1F, 0xF2, 0x00, 0x03, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xF4, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x41, 0x1F, 0xF7, 0x00, 0x03, 0x03, 0x45, 0x03, 0x42, 0x1F, 0xA2, 0x00, 0x04, + 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, + 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x1F, 0xA4, 0x00, 0x04, 0x03, 0x45, + 0x03, 0x43, 0x03, 0x41, 0x1F, 0xA6, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x1F, 0xA0, + 0x00, 0x03, 0x03, 0x45, 0x03, 0x43, 0x1F, 0xF3, 0x00, 0x02, 0x03, 0x45, 0x00, 0x05, 0x00, 0x0C, + 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0xD2, 0x00, 0x02, 0x03, 0x00, 0x03, 0x90, + 0x00, 0x02, 0x03, 0x01, 0x1F, 0xD2, 0x00, 0x02, 0x03, 0x40, 0x03, 0x90, 0x00, 0x02, 0x03, 0x41, + 0x1F, 0xD7, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, + 0x00, 0x24, 0x1F, 0xE2, 0x00, 0x02, 0x03, 0x00, 0x03, 0xB0, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xE2, + 0x00, 0x02, 0x03, 0x40, 0x03, 0xB0, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xE7, 0x00, 0x02, 0x03, 0x42, + 0x00, 0x01, 0x00, 0x04, 0x1F, 0xF4, 0x00, 0x02, 0x03, 0x45, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, + 0x00, 0x14, 0x03, 0xD3, 0x00, 0x02, 0x03, 0x01, 0x03, 0xD4, 0x00, 0x02, 0x03, 0x08, 0x03, 0xD3, + 0x00, 0x02, 0x03, 0x41, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, + 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, + 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x1F, 0x82, 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x02, + 0x00, 0x02, 0x03, 0x00, 0x1F, 0x84, 0x00, 0x03, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x04, 0x00, 0x02, + 0x03, 0x01, 0x1F, 0x82, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x02, 0x00, 0x02, 0x03, 0x40, + 0x1F, 0x84, 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x04, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x86, + 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x06, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x82, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x00, 0x1F, 0x84, 0x00, 0x03, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x82, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x40, 0x1F, 0x84, 0x00, 0x03, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x86, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x42, 0x1F, 0x80, 0x00, 0x02, 0x03, 0x45, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, + 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, + 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x1F, 0x83, 0x00, 0x03, + 0x03, 0x00, 0x03, 0x45, 0x1F, 0x03, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x85, 0x00, 0x03, 0x03, 0x01, + 0x03, 0x45, 0x1F, 0x05, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x83, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, + 0x1F, 0x03, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x85, 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x05, + 0x00, 0x02, 0x03, 0x41, 0x1F, 0x87, 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x07, 0x00, 0x02, + 0x03, 0x42, 0x1F, 0x83, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x85, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x01, 0x1F, 0x83, 0x00, 0x03, 0x03, 0x45, 0x03, 0x40, 0x1F, 0x85, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x41, 0x1F, 0x87, 0x00, 0x03, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x81, 0x00, 0x02, 0x03, 0x45, + 0x00, 0x01, 0x00, 0x04, 0x1F, 0x82, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x83, + 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x84, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, + 0x00, 0x04, 0x1F, 0x85, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x86, 0x00, 0x02, + 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x87, 0x00, 0x02, 0x03, 0x45, 0x00, 0x10, 0x00, 0x22, + 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, + 0x00, 0x62, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x1F, 0x8A, + 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x0A, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x8C, 0x00, 0x03, + 0x03, 0x01, 0x03, 0x45, 0x1F, 0x0C, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x8A, 0x00, 0x03, 0x03, 0x40, + 0x03, 0x45, 0x1F, 0x0A, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x8C, 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, + 0x1F, 0x0C, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x8E, 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x0E, + 0x00, 0x02, 0x03, 0x42, 0x1F, 0x8A, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x8C, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x01, 0x1F, 0x8A, 0x00, 0x03, 0x03, 0x45, 0x03, 0x40, 0x1F, 0x8C, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x41, 0x1F, 0x8E, 0x00, 0x03, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x88, 0x00, 0x02, + 0x03, 0x45, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, + 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, + 0x00, 0x88, 0x00, 0x90, 0x1F, 0x8B, 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x0B, 0x00, 0x02, + 0x03, 0x00, 0x1F, 0x8D, 0x00, 0x03, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x0D, 0x00, 0x02, 0x03, 0x01, + 0x1F, 0x8B, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x0B, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x8D, + 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x0D, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x8F, 0x00, 0x03, + 0x03, 0x42, 0x03, 0x45, 0x1F, 0x0F, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x8B, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x00, 0x1F, 0x8D, 0x00, 0x03, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x8B, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x40, 0x1F, 0x8D, 0x00, 0x03, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x8F, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x42, 0x1F, 0x89, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x8A, 0x00, 0x02, + 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x8B, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, + 0x1F, 0x8C, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x8D, 0x00, 0x02, 0x03, 0x45, + 0x00, 0x01, 0x00, 0x04, 0x1F, 0x8E, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x8F, + 0x00, 0x02, 0x03, 0x45, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x1F, 0x12, + 0x00, 0x02, 0x03, 0x00, 0x1F, 0x14, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x12, 0x00, 0x02, 0x03, 0x40, + 0x1F, 0x14, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, + 0x1F, 0x13, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x15, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x13, 0x00, 0x02, + 0x03, 0x40, 0x1F, 0x15, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, + 0x00, 0x1C, 0x1F, 0x1A, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x1C, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x1A, + 0x00, 0x02, 0x03, 0x40, 0x1F, 0x1C, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, + 0x00, 0x16, 0x00, 0x1C, 0x1F, 0x1B, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x1D, 0x00, 0x02, 0x03, 0x01, + 0x1F, 0x1B, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x1D, 0x00, 0x02, 0x03, 0x41, 0x00, 0x10, 0x00, 0x22, + 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, + 0x00, 0x62, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x1F, 0x92, + 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x22, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x94, 0x00, 0x03, + 0x03, 0x01, 0x03, 0x45, 0x1F, 0x24, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x92, 0x00, 0x03, 0x03, 0x40, + 0x03, 0x45, 0x1F, 0x22, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x94, 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, + 0x1F, 0x24, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x96, 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x26, + 0x00, 0x02, 0x03, 0x42, 0x1F, 0x92, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x94, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x01, 0x1F, 0x92, 0x00, 0x03, 0x03, 0x45, 0x03, 0x40, 0x1F, 0x94, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x41, 0x1F, 0x96, 0x00, 0x03, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x90, 0x00, 0x02, + 0x03, 0x45, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, + 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, + 0x00, 0x88, 0x00, 0x90, 0x1F, 0x93, 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x23, 0x00, 0x02, + 0x03, 0x00, 0x1F, 0x95, 0x00, 0x03, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x25, 0x00, 0x02, 0x03, 0x01, + 0x1F, 0x93, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x23, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x95, + 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x25, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x97, 0x00, 0x03, + 0x03, 0x42, 0x03, 0x45, 0x1F, 0x27, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x93, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x00, 0x1F, 0x95, 0x00, 0x03, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x93, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x40, 0x1F, 0x95, 0x00, 0x03, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x97, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x42, 0x1F, 0x91, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x92, 0x00, 0x02, + 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x93, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, + 0x1F, 0x94, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x95, 0x00, 0x02, 0x03, 0x45, + 0x00, 0x01, 0x00, 0x04, 0x1F, 0x96, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x97, + 0x00, 0x02, 0x03, 0x45, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, + 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, + 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x1F, 0x9A, 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x2A, + 0x00, 0x02, 0x03, 0x00, 0x1F, 0x9C, 0x00, 0x03, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x2C, 0x00, 0x02, + 0x03, 0x01, 0x1F, 0x9A, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x2A, 0x00, 0x02, 0x03, 0x40, + 0x1F, 0x9C, 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x2C, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x9E, + 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x2E, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x9A, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x00, 0x1F, 0x9C, 0x00, 0x03, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x9A, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x40, 0x1F, 0x9C, 0x00, 0x03, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x9E, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x42, 0x1F, 0x98, 0x00, 0x02, 0x03, 0x45, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, + 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, + 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x1F, 0x9B, 0x00, 0x03, + 0x03, 0x00, 0x03, 0x45, 0x1F, 0x2B, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x9D, 0x00, 0x03, 0x03, 0x01, + 0x03, 0x45, 0x1F, 0x2D, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x9B, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, + 0x1F, 0x2B, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x9D, 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x2D, + 0x00, 0x02, 0x03, 0x41, 0x1F, 0x9F, 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x2F, 0x00, 0x02, + 0x03, 0x42, 0x1F, 0x9B, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x9D, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x01, 0x1F, 0x9B, 0x00, 0x03, 0x03, 0x45, 0x03, 0x40, 0x1F, 0x9D, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x41, 0x1F, 0x9F, 0x00, 0x03, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x99, 0x00, 0x02, 0x03, 0x45, + 0x00, 0x01, 0x00, 0x04, 0x1F, 0x9A, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x9B, + 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x9C, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, + 0x00, 0x04, 0x1F, 0x9D, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x9E, 0x00, 0x02, + 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x9F, 0x00, 0x02, 0x03, 0x45, 0x00, 0x05, 0x00, 0x0C, + 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x32, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x34, + 0x00, 0x02, 0x03, 0x01, 0x1F, 0x32, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x34, 0x00, 0x02, 0x03, 0x41, + 0x1F, 0x36, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, + 0x00, 0x24, 0x1F, 0x33, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x35, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x33, + 0x00, 0x02, 0x03, 0x40, 0x1F, 0x35, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x37, 0x00, 0x02, 0x03, 0x42, + 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x3A, 0x00, 0x02, + 0x03, 0x00, 0x1F, 0x3C, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x3A, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x3C, + 0x00, 0x02, 0x03, 0x41, 0x1F, 0x3E, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, + 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x3B, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x3D, 0x00, 0x02, + 0x03, 0x01, 0x1F, 0x3B, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x3D, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x3F, + 0x00, 0x02, 0x03, 0x42, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x1F, 0x42, + 0x00, 0x02, 0x03, 0x00, 0x1F, 0x44, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x42, 0x00, 0x02, 0x03, 0x40, + 0x1F, 0x44, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, + 0x1F, 0x43, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x45, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x43, 0x00, 0x02, + 0x03, 0x40, 0x1F, 0x45, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, + 0x00, 0x1C, 0x1F, 0x4A, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x4C, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x4A, + 0x00, 0x02, 0x03, 0x40, 0x1F, 0x4C, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, + 0x00, 0x16, 0x00, 0x1C, 0x1F, 0x4B, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x4D, 0x00, 0x02, 0x03, 0x01, + 0x1F, 0x4B, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x4D, 0x00, 0x02, 0x03, 0x41, 0x00, 0x05, 0x00, 0x0C, + 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x52, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x54, + 0x00, 0x02, 0x03, 0x01, 0x1F, 0x52, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x54, 0x00, 0x02, 0x03, 0x41, + 0x1F, 0x56, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, + 0x00, 0x24, 0x1F, 0x53, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x55, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x53, + 0x00, 0x02, 0x03, 0x40, 0x1F, 0x55, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x57, 0x00, 0x02, 0x03, 0x42, + 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x5B, 0x00, 0x02, + 0x03, 0x00, 0x1F, 0x5D, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x5B, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x5D, + 0x00, 0x02, 0x03, 0x41, 0x1F, 0x5F, 0x00, 0x02, 0x03, 0x42, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, + 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, + 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x1F, 0xA2, 0x00, 0x03, + 0x03, 0x00, 0x03, 0x45, 0x1F, 0x62, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x03, 0x03, 0x01, + 0x03, 0x45, 0x1F, 0x64, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, + 0x1F, 0x62, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xA4, 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x64, + 0x00, 0x02, 0x03, 0x41, 0x1F, 0xA6, 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x66, 0x00, 0x02, + 0x03, 0x42, 0x1F, 0xA2, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x03, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xA4, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x41, 0x1F, 0xA6, 0x00, 0x03, 0x03, 0x45, 0x03, 0x42, 0x1F, 0xA0, 0x00, 0x02, 0x03, 0x45, + 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, + 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, + 0x00, 0x90, 0x1F, 0xA3, 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x63, 0x00, 0x02, 0x03, 0x00, + 0x1F, 0xA5, 0x00, 0x03, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x65, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xA3, + 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x63, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xA5, 0x00, 0x03, + 0x03, 0x41, 0x03, 0x45, 0x1F, 0x65, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xA7, 0x00, 0x03, 0x03, 0x42, + 0x03, 0x45, 0x1F, 0x67, 0x00, 0x02, 0x03, 0x42, 0x1F, 0xA3, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, + 0x1F, 0xA5, 0x00, 0x03, 0x03, 0x45, 0x03, 0x01, 0x1F, 0xA3, 0x00, 0x03, 0x03, 0x45, 0x03, 0x40, + 0x1F, 0xA5, 0x00, 0x03, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xA7, 0x00, 0x03, 0x03, 0x45, 0x03, 0x42, + 0x1F, 0xA1, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xA2, 0x00, 0x02, 0x03, 0x45, + 0x00, 0x01, 0x00, 0x04, 0x1F, 0xA3, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xA4, + 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xA5, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, + 0x00, 0x04, 0x1F, 0xA6, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xA7, 0x00, 0x02, + 0x03, 0x45, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, + 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, + 0x00, 0x88, 0x00, 0x90, 0x1F, 0xAA, 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x6A, 0x00, 0x02, + 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x03, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x6C, 0x00, 0x02, 0x03, 0x01, + 0x1F, 0xAA, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x6A, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xAC, + 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x6C, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x03, + 0x03, 0x42, 0x03, 0x45, 0x1F, 0x6E, 0x00, 0x02, 0x03, 0x42, 0x1F, 0xAA, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x03, 0x03, 0x45, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x03, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x42, 0x1F, 0xA8, 0x00, 0x02, 0x03, 0x45, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, + 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, + 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x1F, 0xAB, 0x00, 0x03, 0x03, 0x00, + 0x03, 0x45, 0x1F, 0x6B, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xAD, 0x00, 0x03, 0x03, 0x01, 0x03, 0x45, + 0x1F, 0x6D, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xAB, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x6B, + 0x00, 0x02, 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x6D, 0x00, 0x02, + 0x03, 0x41, 0x1F, 0xAF, 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x6F, 0x00, 0x02, 0x03, 0x42, + 0x1F, 0xAB, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xAD, 0x00, 0x03, 0x03, 0x45, 0x03, 0x01, + 0x1F, 0xAB, 0x00, 0x03, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x03, 0x03, 0x45, 0x03, 0x41, + 0x1F, 0xAF, 0x00, 0x03, 0x03, 0x45, 0x03, 0x42, 0x1F, 0xA9, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, + 0x00, 0x04, 0x1F, 0xAA, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xAB, 0x00, 0x02, + 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xAC, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, + 0x1F, 0xAD, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xAE, 0x00, 0x02, 0x03, 0x45, + 0x00, 0x01, 0x00, 0x04, 0x1F, 0xAF, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xB2, + 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xB4, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, + 0x00, 0x04, 0x1F, 0xC2, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xC4, 0x00, 0x02, + 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xF2, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, + 0x1F, 0xF4, 0x00, 0x02, 0x03, 0x45, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, + 0x00, 0x24, 0x1F, 0x82, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x84, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x82, + 0x00, 0x02, 0x03, 0x40, 0x1F, 0x84, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x86, 0x00, 0x02, 0x03, 0x42, + 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x83, 0x00, 0x02, + 0x03, 0x00, 0x1F, 0x85, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x83, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x85, + 0x00, 0x02, 0x03, 0x41, 0x1F, 0x87, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, + 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x8A, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x8C, 0x00, 0x02, + 0x03, 0x01, 0x1F, 0x8A, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x8C, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x8E, + 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, + 0x1F, 0x8B, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x8D, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x8B, 0x00, 0x02, + 0x03, 0x40, 0x1F, 0x8D, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x8F, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, + 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x92, 0x00, 0x02, 0x03, 0x00, + 0x1F, 0x94, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x92, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x94, 0x00, 0x02, + 0x03, 0x41, 0x1F, 0x96, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, + 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x93, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x95, 0x00, 0x02, 0x03, 0x01, + 0x1F, 0x93, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x95, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x97, 0x00, 0x02, + 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x9A, + 0x00, 0x02, 0x03, 0x00, 0x1F, 0x9C, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x9A, 0x00, 0x02, 0x03, 0x40, + 0x1F, 0x9C, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x9E, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, + 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x9B, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x9D, + 0x00, 0x02, 0x03, 0x01, 0x1F, 0x9B, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x9D, 0x00, 0x02, 0x03, 0x41, + 0x1F, 0x9F, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, + 0x00, 0x24, 0x1F, 0xA2, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xA2, + 0x00, 0x02, 0x03, 0x40, 0x1F, 0xA4, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xA6, 0x00, 0x02, 0x03, 0x42, + 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0xA3, 0x00, 0x02, + 0x03, 0x00, 0x1F, 0xA5, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xA3, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xA5, + 0x00, 0x02, 0x03, 0x41, 0x1F, 0xA7, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, + 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0xAA, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x02, + 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xAE, + 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, + 0x1F, 0xAB, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xAD, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xAB, 0x00, 0x02, + 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xAF, 0x00, 0x02, 0x03, 0x42, 0x00, 0x17, + 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, + 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, + 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB2, 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xCA, 0x00, 0xD2, 0x1F, 0xB2, + 0x00, 0x02, 0x03, 0x00, 0x1F, 0xB4, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x82, 0x00, 0x03, 0x03, 0x13, + 0x03, 0x00, 0x1F, 0x84, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x82, 0x00, 0x03, 0x03, 0x13, + 0x03, 0x40, 0x1F, 0x84, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x86, 0x00, 0x03, 0x03, 0x13, + 0x03, 0x42, 0x1F, 0x80, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x83, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, + 0x1F, 0x85, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x83, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, + 0x1F, 0x85, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x87, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, + 0x1F, 0x81, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xB2, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xB4, 0x00, 0x02, + 0x03, 0x41, 0x1F, 0xB7, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x82, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, + 0x1F, 0x84, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x82, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, + 0x1F, 0x84, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x86, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, + 0x1F, 0x80, 0x00, 0x02, 0x03, 0x43, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xB7, 0x00, 0x02, 0x03, 0x45, + 0x00, 0x12, 0x00, 0x26, 0x00, 0x2E, 0x00, 0x36, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4E, 0x00, 0x54, + 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, + 0x00, 0x9A, 0x00, 0xA2, 0x00, 0xAA, 0x1F, 0x8A, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x8C, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x8A, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0x8C, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x8E, 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x88, + 0x00, 0x02, 0x03, 0x13, 0x1F, 0x8B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x8D, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x01, 0x1F, 0x8B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x8D, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x41, 0x1F, 0x8F, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, 0x1F, 0x89, 0x00, 0x02, + 0x03, 0x14, 0x1F, 0x8A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x8C, 0x00, 0x03, 0x03, 0x43, + 0x03, 0x01, 0x1F, 0x8A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x8C, 0x00, 0x03, 0x03, 0x43, + 0x03, 0x41, 0x1F, 0x8E, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0x88, 0x00, 0x02, 0x03, 0x43, + 0x00, 0x20, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, + 0x00, 0x72, 0x00, 0x7A, 0x00, 0x82, 0x00, 0x88, 0x00, 0x90, 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA8, + 0x00, 0xB0, 0x00, 0xB6, 0x00, 0xBE, 0x00, 0xC6, 0x00, 0xCE, 0x00, 0xD6, 0x00, 0xDE, 0x00, 0xE4, + 0x00, 0xEA, 0x00, 0xF0, 0x00, 0xF6, 0x00, 0xFE, 0x01, 0x06, 0x01, 0x0E, 0x01, 0x16, 0x01, 0x1E, + 0x01, 0x24, 0x1F, 0x76, 0x00, 0x02, 0x03, 0x00, 0x03, 0xAF, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xD1, + 0x00, 0x02, 0x03, 0x04, 0x1F, 0xD0, 0x00, 0x02, 0x03, 0x06, 0x1F, 0xD2, 0x00, 0x03, 0x03, 0x08, + 0x03, 0x00, 0x03, 0x90, 0x00, 0x03, 0x03, 0x08, 0x03, 0x01, 0x1F, 0xD2, 0x00, 0x03, 0x03, 0x08, + 0x03, 0x40, 0x03, 0x90, 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, 0x1F, 0xD7, 0x00, 0x03, 0x03, 0x08, + 0x03, 0x42, 0x03, 0xCA, 0x00, 0x02, 0x03, 0x08, 0x1F, 0x32, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, + 0x1F, 0x34, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x32, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, + 0x1F, 0x34, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x36, 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, + 0x1F, 0x30, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x33, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x35, + 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x33, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x35, + 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x37, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, 0x1F, 0x31, + 0x00, 0x02, 0x03, 0x14, 0x1F, 0x76, 0x00, 0x02, 0x03, 0x40, 0x03, 0xAF, 0x00, 0x02, 0x03, 0x41, + 0x1F, 0xD6, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x32, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x34, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x32, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x34, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x36, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0x30, + 0x00, 0x02, 0x03, 0x43, 0x03, 0x90, 0x00, 0x02, 0x03, 0x44, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, + 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0xCD, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xCE, 0x00, 0x02, + 0x03, 0x01, 0x1F, 0xCD, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xCE, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xCF, + 0x00, 0x02, 0x03, 0x42, 0x00, 0x17, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, + 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x82, 0x00, 0x8A, + 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB2, 0x00, 0xBA, 0x00, 0xC2, + 0x00, 0xCA, 0x00, 0xD2, 0x1F, 0xC2, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x03, 0x01, + 0x1F, 0x92, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x94, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, + 0x1F, 0x92, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0x94, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, + 0x1F, 0x96, 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x90, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x93, + 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x95, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x93, + 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x95, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x97, + 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, 0x1F, 0x91, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xC2, 0x00, 0x02, + 0x03, 0x40, 0x1F, 0xC4, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xC7, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x92, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x94, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x92, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x94, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x96, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0x90, 0x00, 0x02, 0x03, 0x43, 0x00, 0x01, 0x00, 0x04, + 0x1F, 0xC7, 0x00, 0x02, 0x03, 0x45, 0x00, 0x12, 0x00, 0x26, 0x00, 0x2E, 0x00, 0x36, 0x00, 0x3E, + 0x00, 0x46, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C, + 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, 0x00, 0x9A, 0x00, 0xA2, 0x00, 0xAA, 0x1F, 0x9A, 0x00, 0x03, + 0x03, 0x13, 0x03, 0x00, 0x1F, 0x9C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x9A, 0x00, 0x03, + 0x03, 0x13, 0x03, 0x40, 0x1F, 0x9C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x9E, 0x00, 0x03, + 0x03, 0x13, 0x03, 0x42, 0x1F, 0x98, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x9B, 0x00, 0x03, 0x03, 0x14, + 0x03, 0x00, 0x1F, 0x9D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x9B, 0x00, 0x03, 0x03, 0x14, + 0x03, 0x40, 0x1F, 0x9D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x9F, 0x00, 0x03, 0x03, 0x14, + 0x03, 0x42, 0x1F, 0x99, 0x00, 0x02, 0x03, 0x14, 0x1F, 0x9A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, + 0x1F, 0x9C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x9A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, + 0x1F, 0x9C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x9E, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, + 0x1F, 0x98, 0x00, 0x02, 0x03, 0x43, 0x00, 0x17, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x44, + 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x82, + 0x00, 0x8A, 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB2, 0x00, 0xBA, + 0x00, 0xC2, 0x00, 0xCA, 0x00, 0xD2, 0x1F, 0xF2, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xF4, 0x00, 0x02, + 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x03, 0x03, 0x13, + 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0xA4, 0x00, 0x03, 0x03, 0x13, + 0x03, 0x41, 0x1F, 0xA6, 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0xA0, 0x00, 0x02, 0x03, 0x13, + 0x1F, 0xA3, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0xA5, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, + 0x1F, 0xA3, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0xA5, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, + 0x1F, 0xA7, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, 0x1F, 0xA1, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xF2, + 0x00, 0x02, 0x03, 0x40, 0x1F, 0xF4, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xF7, 0x00, 0x02, 0x03, 0x42, + 0x1F, 0xA2, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, + 0x1F, 0xA2, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0xA4, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, + 0x1F, 0xA6, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0xA0, 0x00, 0x02, 0x03, 0x43, 0x00, 0x01, + 0x00, 0x04, 0x1F, 0xF7, 0x00, 0x02, 0x03, 0x45, 0x00, 0x12, 0x00, 0x26, 0x00, 0x2E, 0x00, 0x36, + 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, + 0x00, 0x7C, 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, 0x00, 0x9A, 0x00, 0xA2, 0x00, 0xAA, 0x1F, 0xAA, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0xAA, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0xAE, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0xA8, 0x00, 0x02, 0x03, 0x13, 0x1F, 0xAB, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x00, 0x1F, 0xAD, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0xAB, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0xAF, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x42, 0x1F, 0xA9, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xAA, 0x00, 0x03, 0x03, 0x43, + 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x03, 0x03, 0x43, + 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x03, 0x03, 0x43, + 0x03, 0x42, 0x1F, 0xA8, 0x00, 0x02, 0x03, 0x43, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, + 0x00, 0x1E, 0x00, 0x24, 0x1F, 0xDD, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xDE, 0x00, 0x02, 0x03, 0x01, + 0x1F, 0xDD, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xDE, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xDF, 0x00, 0x02, + 0x03, 0x42, 0x00, 0x4A, 0x00, 0x96, 0x00, 0x9C, 0x00, 0xA2, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBE, + 0x00, 0xC6, 0x00, 0xD0, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF4, 0x00, 0xFC, 0x01, 0x06, + 0x01, 0x10, 0x01, 0x1A, 0x01, 0x24, 0x01, 0x2E, 0x01, 0x36, 0x01, 0x3C, 0x01, 0x46, 0x01, 0x4E, + 0x01, 0x58, 0x01, 0x60, 0x01, 0x6A, 0x01, 0x72, 0x01, 0x7C, 0x01, 0x84, 0x01, 0x8E, 0x01, 0x96, + 0x01, 0xA0, 0x01, 0xAA, 0x01, 0xB4, 0x01, 0xBE, 0x01, 0xC8, 0x01, 0xD0, 0x01, 0xD6, 0x01, 0xDC, + 0x01, 0xE2, 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFE, 0x02, 0x06, 0x02, 0x10, 0x02, 0x18, 0x02, 0x22, + 0x02, 0x2A, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x46, 0x02, 0x50, 0x02, 0x5A, 0x02, 0x64, 0x02, 0x6E, + 0x02, 0x76, 0x02, 0x7C, 0x02, 0x86, 0x02, 0x90, 0x02, 0x9A, 0x02, 0xA4, 0x02, 0xAE, 0x02, 0xB6, + 0x02, 0xC0, 0x02, 0xCA, 0x02, 0xD4, 0x02, 0xDE, 0x02, 0xE8, 0x02, 0xF0, 0x02, 0xFA, 0x03, 0x04, + 0x03, 0x0E, 0x03, 0x18, 0x03, 0x22, 0x03, 0x2A, 0x1F, 0xFA, 0x00, 0x02, 0x03, 0x00, 0x03, 0x8F, + 0x00, 0x02, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x6A, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, + 0x1F, 0x6C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x13, 0x03, 0x40, + 0x03, 0x45, 0x1F, 0x6A, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x13, + 0x03, 0x41, 0x03, 0x45, 0x1F, 0x6C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, + 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x6E, 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0xAA, + 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, + 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, + 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, + 0x1F, 0xA8, 0x00, 0x03, 0x03, 0x13, 0x03, 0x45, 0x1F, 0x68, 0x00, 0x02, 0x03, 0x13, 0x1F, 0xAB, + 0x00, 0x04, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x6B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, + 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x6D, 0x00, 0x03, 0x03, 0x14, + 0x03, 0x01, 0x1F, 0xAB, 0x00, 0x04, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x6B, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x6D, + 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0xAF, 0x00, 0x04, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, + 0x1F, 0x6F, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, 0x1F, 0xAB, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, + 0x03, 0x00, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x1F, 0xAB, 0x00, 0x04, + 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, + 0x1F, 0xAF, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x1F, 0xA9, 0x00, 0x03, 0x03, 0x14, + 0x03, 0x45, 0x1F, 0x69, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xFA, 0x00, 0x02, 0x03, 0x40, 0x03, 0x8F, + 0x00, 0x02, 0x03, 0x41, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x6A, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, + 0x1F, 0x6C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x43, 0x03, 0x40, + 0x03, 0x45, 0x1F, 0x6A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x43, + 0x03, 0x41, 0x03, 0x45, 0x1F, 0x6C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, + 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x6E, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0xAA, + 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, + 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, + 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, + 0x1F, 0xA8, 0x00, 0x03, 0x03, 0x43, 0x03, 0x45, 0x1F, 0x68, 0x00, 0x02, 0x03, 0x43, 0x1F, 0xAA, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, + 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, + 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, + 0x1F, 0xA8, 0x00, 0x03, 0x03, 0x45, 0x03, 0x13, 0x1F, 0xAB, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, + 0x03, 0x00, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x1F, 0xAB, 0x00, 0x04, + 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, + 0x1F, 0xAF, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x1F, 0xA9, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x14, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, + 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, + 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, 0x03, 0x45, + 0x03, 0x43, 0x03, 0x42, 0x1F, 0xA8, 0x00, 0x03, 0x03, 0x45, 0x03, 0x43, 0x1F, 0xFC, 0x00, 0x02, + 0x03, 0x45, 0x00, 0x01, 0x00, 0x75, 0x00, 0xA8, 0x03, 0x91, 0x03, 0x95, 0x03, 0x97, 0x03, 0x99, + 0x03, 0x9F, 0x03, 0xA1, 0x03, 0xA5, 0x03, 0xA9, 0x03, 0xAC, 0x03, 0xAE, 0x03, 0xB1, 0x03, 0xB5, + 0x03, 0xB7, 0x03, 0xB9, 0x03, 0xBF, 0x03, 0xC1, 0x03, 0xC5, 0x03, 0xC9, 0x03, 0xCA, 0x03, 0xCB, + 0x03, 0xCE, 0x03, 0xD2, 0x1F, 0x00, 0x1F, 0x01, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05, + 0x1F, 0x06, 0x1F, 0x07, 0x1F, 0x08, 0x1F, 0x09, 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, 0x0C, 0x1F, 0x0D, + 0x1F, 0x0E, 0x1F, 0x0F, 0x1F, 0x10, 0x1F, 0x11, 0x1F, 0x18, 0x1F, 0x19, 0x1F, 0x20, 0x1F, 0x21, + 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24, 0x1F, 0x25, 0x1F, 0x26, 0x1F, 0x27, 0x1F, 0x28, 0x1F, 0x29, + 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, 0x2C, 0x1F, 0x2D, 0x1F, 0x2E, 0x1F, 0x2F, 0x1F, 0x30, 0x1F, 0x31, + 0x1F, 0x38, 0x1F, 0x39, 0x1F, 0x40, 0x1F, 0x41, 0x1F, 0x48, 0x1F, 0x49, 0x1F, 0x50, 0x1F, 0x51, + 0x1F, 0x59, 0x1F, 0x60, 0x1F, 0x61, 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, 0x1F, 0x66, + 0x1F, 0x67, 0x1F, 0x68, 0x1F, 0x69, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, + 0x1F, 0x6F, 0x1F, 0x70, 0x1F, 0x71, 0x1F, 0x74, 0x1F, 0x75, 0x1F, 0x7C, 0x1F, 0x7D, 0x1F, 0x80, + 0x1F, 0x81, 0x1F, 0x88, 0x1F, 0x89, 0x1F, 0x90, 0x1F, 0x91, 0x1F, 0x98, 0x1F, 0x99, 0x1F, 0xA0, + 0x1F, 0xA1, 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xB3, 0x1F, 0xB6, 0x1F, 0xBC, 0x1F, 0xBE, 0x1F, 0xBF, + 0x1F, 0xC3, 0x1F, 0xC6, 0x1F, 0xCC, 0x1F, 0xF3, 0x1F, 0xF6, 0x1F, 0xFC, 0x1F, 0xFE, 0x21, 0x26, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, 0x4C, 0x0A, 0x10, 0x12, 0x6E, 0x18, 0x84, 0x1E, 0x68, + 0x22, 0x7A, 0x26, 0x68, 0x29, 0x12, 0x2B, 0x5C, 0x2D, 0x24, 0x2F, 0x04, 0x30, 0xB4, 0x32, 0x62, + 0x33, 0xCA, 0x35, 0x32, 0x36, 0x9A, 0x37, 0x76, 0x38, 0x52, 0x39, 0x2E, 0x39, 0xFC, 0x3A, 0xCA, + 0x3B, 0x98, 0x3C, 0x4A, 0x3C, 0xFC, 0x3D, 0x22, 0x3D, 0x48, 0x3D, 0x6E, 0x3D, 0x94, 0x3D, 0xBA, + 0x3D, 0xE0, 0x3E, 0x06, 0x3E, 0x2C, 0x3E, 0x52, 0x3E, 0x78, 0x3E, 0x9E, 0x00, 0x01, 0x07, 0xCE, + 0x00, 0xF9, 0x01, 0xF8, 0x01, 0xFE, 0x02, 0x04, 0x02, 0x0A, 0x02, 0x10, 0x02, 0x16, 0x02, 0x1C, + 0x02, 0x22, 0x02, 0x28, 0x02, 0x2E, 0x02, 0x34, 0x02, 0x3A, 0x02, 0x40, 0x02, 0x46, 0x02, 0x4C, + 0x02, 0x52, 0x02, 0x58, 0x02, 0x5E, 0x02, 0x64, 0x02, 0x6A, 0x02, 0x70, 0x02, 0x76, 0x02, 0x7C, + 0x02, 0x82, 0x02, 0x88, 0x02, 0x8E, 0x02, 0x94, 0x02, 0x9A, 0x02, 0xA0, 0x02, 0xA6, 0x02, 0xAC, + 0x02, 0xB2, 0x02, 0xB8, 0x02, 0xBE, 0x02, 0xC4, 0x02, 0xCA, 0x02, 0xD0, 0x02, 0xD6, 0x02, 0xDC, + 0x02, 0xE2, 0x02, 0xE8, 0x02, 0xEE, 0x02, 0xF4, 0x02, 0xFA, 0x03, 0x00, 0x03, 0x06, 0x03, 0x0C, + 0x03, 0x12, 0x03, 0x18, 0x03, 0x1E, 0x03, 0x24, 0x03, 0x2A, 0x03, 0x30, 0x03, 0x36, 0x03, 0x3C, + 0x03, 0x42, 0x03, 0x48, 0x03, 0x4E, 0x03, 0x54, 0x03, 0x5A, 0x03, 0x60, 0x03, 0x66, 0x03, 0x6C, + 0x03, 0x72, 0x03, 0x78, 0x03, 0x7E, 0x03, 0x84, 0x03, 0x8A, 0x03, 0x90, 0x03, 0x96, 0x03, 0x9C, + 0x03, 0xA2, 0x03, 0xA8, 0x03, 0xAE, 0x03, 0xB4, 0x03, 0xBA, 0x03, 0xC0, 0x03, 0xC6, 0x03, 0xCC, + 0x03, 0xD2, 0x03, 0xD8, 0x03, 0xDE, 0x03, 0xE4, 0x03, 0xEA, 0x03, 0xF0, 0x03, 0xF6, 0x03, 0xFC, + 0x04, 0x02, 0x04, 0x08, 0x04, 0x0E, 0x04, 0x14, 0x04, 0x1A, 0x04, 0x20, 0x04, 0x26, 0x04, 0x2C, + 0x04, 0x32, 0x04, 0x38, 0x04, 0x3E, 0x04, 0x44, 0x04, 0x4A, 0x04, 0x50, 0x04, 0x56, 0x04, 0x5C, + 0x04, 0x62, 0x04, 0x68, 0x04, 0x6E, 0x04, 0x74, 0x04, 0x7A, 0x04, 0x80, 0x04, 0x86, 0x04, 0x8C, + 0x04, 0x92, 0x04, 0x98, 0x04, 0x9E, 0x04, 0xA4, 0x04, 0xAA, 0x04, 0xB0, 0x04, 0xB6, 0x04, 0xBC, + 0x04, 0xC2, 0x04, 0xC8, 0x04, 0xCE, 0x04, 0xD4, 0x04, 0xDA, 0x04, 0xE0, 0x04, 0xE6, 0x04, 0xEC, + 0x04, 0xF2, 0x04, 0xF8, 0x04, 0xFE, 0x05, 0x04, 0x05, 0x0A, 0x05, 0x10, 0x05, 0x16, 0x05, 0x1C, + 0x05, 0x22, 0x05, 0x28, 0x05, 0x2E, 0x05, 0x34, 0x05, 0x3A, 0x05, 0x40, 0x05, 0x46, 0x05, 0x4C, + 0x05, 0x52, 0x05, 0x58, 0x05, 0x5E, 0x05, 0x64, 0x05, 0x6A, 0x05, 0x70, 0x05, 0x76, 0x05, 0x7C, + 0x05, 0x82, 0x05, 0x88, 0x05, 0x8E, 0x05, 0x94, 0x05, 0x9A, 0x05, 0xA0, 0x05, 0xA6, 0x05, 0xAC, + 0x05, 0xB2, 0x05, 0xB8, 0x05, 0xBE, 0x05, 0xC4, 0x05, 0xCA, 0x05, 0xD0, 0x05, 0xD6, 0x05, 0xDC, + 0x05, 0xE2, 0x05, 0xE8, 0x05, 0xEE, 0x05, 0xF4, 0x05, 0xFA, 0x06, 0x00, 0x06, 0x06, 0x06, 0x0C, + 0x06, 0x12, 0x06, 0x18, 0x06, 0x1E, 0x06, 0x24, 0x06, 0x2A, 0x06, 0x30, 0x06, 0x36, 0x06, 0x3C, + 0x06, 0x42, 0x06, 0x48, 0x06, 0x4E, 0x06, 0x54, 0x06, 0x5A, 0x06, 0x60, 0x06, 0x66, 0x06, 0x6C, + 0x06, 0x72, 0x06, 0x78, 0x06, 0x7E, 0x06, 0x84, 0x06, 0x8A, 0x06, 0x90, 0x06, 0x96, 0x06, 0x9C, + 0x06, 0xA2, 0x06, 0xA8, 0x06, 0xAE, 0x06, 0xB4, 0x06, 0xBA, 0x06, 0xC0, 0x06, 0xC6, 0x06, 0xCC, + 0x06, 0xD2, 0x06, 0xD8, 0x06, 0xDE, 0x06, 0xE4, 0x06, 0xEA, 0x06, 0xF0, 0x06, 0xF6, 0x06, 0xFC, + 0x07, 0x02, 0x07, 0x08, 0x07, 0x0E, 0x07, 0x14, 0x07, 0x1A, 0x07, 0x20, 0x07, 0x26, 0x07, 0x2C, + 0x07, 0x32, 0x07, 0x38, 0x07, 0x3E, 0x07, 0x44, 0x07, 0x4A, 0x07, 0x50, 0x07, 0x56, 0x07, 0x5C, + 0x07, 0x62, 0x07, 0x68, 0x07, 0x6E, 0x07, 0x74, 0x07, 0x7A, 0x07, 0x80, 0x07, 0x86, 0x07, 0x8C, + 0x07, 0x92, 0x07, 0x98, 0x07, 0x9E, 0x07, 0xA4, 0x07, 0xAA, 0x07, 0xB0, 0x07, 0xB6, 0x07, 0xBC, + 0x07, 0xC2, 0x07, 0xC8, 0x00, 0x02, 0x00, 0xA8, 0x03, 0x01, 0x00, 0x02, 0x03, 0x91, 0x03, 0x01, + 0x00, 0x02, 0x03, 0x95, 0x03, 0x01, 0x00, 0x02, 0x03, 0x97, 0x03, 0x01, 0x00, 0x02, 0x03, 0x99, + 0x03, 0x01, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x01, 0x00, 0x02, 0x03, 0xA5, 0x03, 0x01, 0x00, 0x02, + 0x03, 0xA9, 0x03, 0x01, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x44, 0x00, 0x02, 0x03, 0x99, 0x03, 0x08, + 0x00, 0x02, 0x03, 0xA5, 0x03, 0x08, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x01, 0x00, 0x02, 0x03, 0xB5, + 0x03, 0x01, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x01, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x01, 0x00, 0x02, + 0x03, 0xC5, 0x03, 0x44, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x08, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x08, + 0x00, 0x02, 0x03, 0xBF, 0x03, 0x01, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x01, 0x00, 0x02, 0x03, 0xC9, + 0x03, 0x01, 0x00, 0x02, 0x03, 0xD2, 0x03, 0x01, 0x00, 0x02, 0x03, 0xD2, 0x03, 0x08, 0x00, 0x02, + 0x03, 0xB1, 0x03, 0x13, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x00, 0x03, 0x00, + 0x00, 0x02, 0x1F, 0x01, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x00, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x01, + 0x03, 0x01, 0x00, 0x02, 0x1F, 0x00, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x42, 0x00, 0x02, + 0x03, 0x91, 0x03, 0x13, 0x00, 0x02, 0x03, 0x91, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x08, 0x03, 0x00, + 0x00, 0x02, 0x1F, 0x09, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x08, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x09, + 0x03, 0x01, 0x00, 0x02, 0x1F, 0x08, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x09, 0x03, 0x42, 0x00, 0x02, + 0x03, 0xB5, 0x03, 0x13, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x10, 0x03, 0x00, + 0x00, 0x02, 0x1F, 0x11, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x10, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x11, + 0x03, 0x01, 0x00, 0x02, 0x03, 0x95, 0x03, 0x13, 0x00, 0x02, 0x03, 0x95, 0x03, 0x14, 0x00, 0x02, + 0x1F, 0x18, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x19, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x18, 0x03, 0x01, + 0x00, 0x02, 0x1F, 0x19, 0x03, 0x01, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x13, 0x00, 0x02, 0x03, 0xB7, + 0x03, 0x14, 0x00, 0x02, 0x1F, 0x20, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x21, 0x03, 0x00, 0x00, 0x02, + 0x1F, 0x20, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x21, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x20, 0x03, 0x42, + 0x00, 0x02, 0x1F, 0x21, 0x03, 0x42, 0x00, 0x02, 0x03, 0x97, 0x03, 0x13, 0x00, 0x02, 0x03, 0x97, + 0x03, 0x14, 0x00, 0x02, 0x1F, 0x28, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x29, 0x03, 0x00, 0x00, 0x02, + 0x1F, 0x28, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x29, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x28, 0x03, 0x42, + 0x00, 0x02, 0x1F, 0x29, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x13, 0x00, 0x02, 0x03, 0xB9, + 0x03, 0x14, 0x00, 0x02, 0x1F, 0x30, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x31, 0x03, 0x00, 0x00, 0x02, + 0x1F, 0x30, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x31, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x30, 0x03, 0x42, + 0x00, 0x02, 0x1F, 0x31, 0x03, 0x42, 0x00, 0x02, 0x03, 0x99, 0x03, 0x13, 0x00, 0x02, 0x03, 0x99, + 0x03, 0x14, 0x00, 0x02, 0x1F, 0x38, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x39, 0x03, 0x00, 0x00, 0x02, + 0x1F, 0x38, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x39, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x38, 0x03, 0x42, + 0x00, 0x02, 0x1F, 0x39, 0x03, 0x42, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x13, 0x00, 0x02, 0x03, 0xBF, + 0x03, 0x14, 0x00, 0x02, 0x1F, 0x40, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x41, 0x03, 0x00, 0x00, 0x02, + 0x1F, 0x40, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x41, 0x03, 0x01, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x13, + 0x00, 0x02, 0x03, 0x9F, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x48, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x49, + 0x03, 0x00, 0x00, 0x02, 0x1F, 0x48, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x49, 0x03, 0x01, 0x00, 0x02, + 0x03, 0xC5, 0x03, 0x13, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x00, + 0x00, 0x02, 0x1F, 0x51, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x51, + 0x03, 0x01, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x51, 0x03, 0x42, 0x00, 0x02, + 0x03, 0xA5, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x59, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x59, 0x03, 0x01, + 0x00, 0x02, 0x1F, 0x59, 0x03, 0x42, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x13, 0x00, 0x02, 0x03, 0xC9, + 0x03, 0x14, 0x00, 0x02, 0x1F, 0x60, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x00, 0x00, 0x02, + 0x1F, 0x60, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x60, 0x03, 0x42, + 0x00, 0x02, 0x1F, 0x61, 0x03, 0x42, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x13, 0x00, 0x02, 0x03, 0xA9, + 0x03, 0x14, 0x00, 0x02, 0x1F, 0x68, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x69, 0x03, 0x00, 0x00, 0x02, + 0x1F, 0x68, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x69, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x68, 0x03, 0x42, + 0x00, 0x02, 0x1F, 0x69, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x00, 0x00, 0x02, 0x03, 0xB1, + 0x03, 0x01, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x00, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x01, 0x00, 0x02, + 0x03, 0xB7, 0x03, 0x00, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x01, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x00, + 0x00, 0x02, 0x03, 0xB9, 0x03, 0x01, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x00, 0x00, 0x02, 0x03, 0xBF, + 0x03, 0x01, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x00, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x01, 0x00, 0x02, + 0x03, 0xC9, 0x03, 0x00, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x00, 0x03, 0x45, + 0x00, 0x02, 0x1F, 0x01, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x02, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x03, + 0x03, 0x45, 0x00, 0x02, 0x1F, 0x04, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x05, 0x03, 0x45, 0x00, 0x02, + 0x1F, 0x06, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x07, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x08, 0x03, 0x45, + 0x00, 0x02, 0x1F, 0x09, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0A, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0B, + 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0C, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0D, 0x03, 0x45, 0x00, 0x02, + 0x1F, 0x0E, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0F, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x20, 0x03, 0x45, + 0x00, 0x02, 0x1F, 0x21, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x22, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x23, + 0x03, 0x45, 0x00, 0x02, 0x1F, 0x24, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x25, 0x03, 0x45, 0x00, 0x02, + 0x1F, 0x26, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x27, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x28, 0x03, 0x45, + 0x00, 0x02, 0x1F, 0x29, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2A, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2B, + 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2C, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2D, 0x03, 0x45, 0x00, 0x02, + 0x1F, 0x2E, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2F, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x60, 0x03, 0x45, + 0x00, 0x02, 0x1F, 0x61, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x62, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x63, + 0x03, 0x45, 0x00, 0x02, 0x1F, 0x64, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x65, 0x03, 0x45, 0x00, 0x02, + 0x1F, 0x66, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x67, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x68, 0x03, 0x45, + 0x00, 0x02, 0x1F, 0x69, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6A, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6B, + 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6C, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6D, 0x03, 0x45, 0x00, 0x02, + 0x1F, 0x6E, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6F, 0x03, 0x45, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x06, + 0x00, 0x02, 0x03, 0xB1, 0x03, 0x04, 0x00, 0x02, 0x1F, 0x70, 0x03, 0x45, 0x00, 0x02, 0x03, 0xB1, + 0x03, 0x45, 0x00, 0x02, 0x03, 0xAC, 0x03, 0x45, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x42, 0x00, 0x02, + 0x1F, 0xB3, 0x03, 0x42, 0x00, 0x02, 0x03, 0x91, 0x03, 0x06, 0x00, 0x02, 0x03, 0x91, 0x03, 0x04, + 0x00, 0x02, 0x03, 0x91, 0x03, 0x00, 0x00, 0x02, 0x03, 0x91, 0x03, 0x01, 0x00, 0x02, 0x03, 0x91, + 0x03, 0x45, 0x00, 0x02, 0x00, 0xA8, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x74, 0x03, 0x45, 0x00, 0x02, + 0x03, 0xB7, 0x03, 0x45, 0x00, 0x02, 0x03, 0xAE, 0x03, 0x45, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x42, + 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x42, 0x00, 0x02, 0x03, 0x95, 0x03, 0x00, 0x00, 0x02, 0x03, 0x95, + 0x03, 0x01, 0x00, 0x02, 0x03, 0x97, 0x03, 0x00, 0x00, 0x02, 0x03, 0x97, 0x03, 0x01, 0x00, 0x02, + 0x03, 0x97, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x01, + 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x06, 0x00, 0x02, 0x03, 0xB9, + 0x03, 0x04, 0x00, 0x02, 0x03, 0xCA, 0x03, 0x00, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x44, 0x00, 0x02, + 0x03, 0xB9, 0x03, 0x42, 0x00, 0x02, 0x03, 0xCA, 0x03, 0x42, 0x00, 0x02, 0x03, 0x99, 0x03, 0x06, + 0x00, 0x02, 0x03, 0x99, 0x03, 0x04, 0x00, 0x02, 0x03, 0x99, 0x03, 0x00, 0x00, 0x02, 0x03, 0x99, + 0x03, 0x01, 0x00, 0x02, 0x1F, 0xFE, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xFE, 0x03, 0x01, 0x00, 0x02, + 0x1F, 0xFE, 0x03, 0x42, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x06, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x04, + 0x00, 0x02, 0x03, 0xCB, 0x03, 0x00, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x44, 0x00, 0x02, 0x03, 0xC1, + 0x03, 0x13, 0x00, 0x02, 0x03, 0xC1, 0x03, 0x14, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x42, 0x00, 0x02, + 0x03, 0xCB, 0x03, 0x42, 0x00, 0x02, 0x03, 0xA5, 0x03, 0x06, 0x00, 0x02, 0x03, 0xA5, 0x03, 0x04, + 0x00, 0x02, 0x03, 0xA5, 0x03, 0x00, 0x00, 0x02, 0x03, 0xA5, 0x03, 0x01, 0x00, 0x02, 0x03, 0xA1, + 0x03, 0x14, 0x00, 0x02, 0x00, 0xA8, 0x03, 0x00, 0x00, 0x02, 0x00, 0xA8, 0x03, 0x01, 0x00, 0x02, + 0x1F, 0x7C, 0x03, 0x45, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x45, 0x00, 0x02, 0x03, 0xCE, 0x03, 0x45, + 0x00, 0x02, 0x03, 0xC9, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x42, 0x00, 0x02, 0x03, 0x9F, + 0x03, 0x00, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x01, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x00, 0x00, 0x02, + 0x03, 0xA9, 0x03, 0x01, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x45, 0x00, 0x01, 0x00, 0xF9, 0x03, 0x85, + 0x03, 0x86, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8A, 0x03, 0x8C, 0x03, 0x8E, 0x03, 0x8F, 0x03, 0x90, + 0x03, 0xAA, 0x03, 0xAB, 0x03, 0xAC, 0x03, 0xAD, 0x03, 0xAE, 0x03, 0xAF, 0x03, 0xB0, 0x03, 0xCA, + 0x03, 0xCB, 0x03, 0xCC, 0x03, 0xCD, 0x03, 0xCE, 0x03, 0xD3, 0x03, 0xD4, 0x1F, 0x00, 0x1F, 0x01, + 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05, 0x1F, 0x06, 0x1F, 0x07, 0x1F, 0x08, 0x1F, 0x09, + 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, 0x0C, 0x1F, 0x0D, 0x1F, 0x0E, 0x1F, 0x0F, 0x1F, 0x10, 0x1F, 0x11, + 0x1F, 0x12, 0x1F, 0x13, 0x1F, 0x14, 0x1F, 0x15, 0x1F, 0x18, 0x1F, 0x19, 0x1F, 0x1A, 0x1F, 0x1B, + 0x1F, 0x1C, 0x1F, 0x1D, 0x1F, 0x20, 0x1F, 0x21, 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24, 0x1F, 0x25, + 0x1F, 0x26, 0x1F, 0x27, 0x1F, 0x28, 0x1F, 0x29, 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, 0x2C, 0x1F, 0x2D, + 0x1F, 0x2E, 0x1F, 0x2F, 0x1F, 0x30, 0x1F, 0x31, 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, + 0x1F, 0x36, 0x1F, 0x37, 0x1F, 0x38, 0x1F, 0x39, 0x1F, 0x3A, 0x1F, 0x3B, 0x1F, 0x3C, 0x1F, 0x3D, + 0x1F, 0x3E, 0x1F, 0x3F, 0x1F, 0x40, 0x1F, 0x41, 0x1F, 0x42, 0x1F, 0x43, 0x1F, 0x44, 0x1F, 0x45, + 0x1F, 0x48, 0x1F, 0x49, 0x1F, 0x4A, 0x1F, 0x4B, 0x1F, 0x4C, 0x1F, 0x4D, 0x1F, 0x50, 0x1F, 0x51, + 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54, 0x1F, 0x55, 0x1F, 0x56, 0x1F, 0x57, 0x1F, 0x59, 0x1F, 0x5B, + 0x1F, 0x5D, 0x1F, 0x5F, 0x1F, 0x60, 0x1F, 0x61, 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, + 0x1F, 0x66, 0x1F, 0x67, 0x1F, 0x68, 0x1F, 0x69, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, + 0x1F, 0x6E, 0x1F, 0x6F, 0x1F, 0x70, 0x1F, 0x71, 0x1F, 0x72, 0x1F, 0x73, 0x1F, 0x74, 0x1F, 0x75, + 0x1F, 0x76, 0x1F, 0x77, 0x1F, 0x78, 0x1F, 0x79, 0x1F, 0x7A, 0x1F, 0x7B, 0x1F, 0x7C, 0x1F, 0x7D, + 0x1F, 0x80, 0x1F, 0x81, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, + 0x1F, 0x88, 0x1F, 0x89, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, + 0x1F, 0x90, 0x1F, 0x91, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, + 0x1F, 0x98, 0x1F, 0x99, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, + 0x1F, 0xA0, 0x1F, 0xA1, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, + 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, + 0x1F, 0xB0, 0x1F, 0xB1, 0x1F, 0xB2, 0x1F, 0xB3, 0x1F, 0xB4, 0x1F, 0xB6, 0x1F, 0xB7, 0x1F, 0xB8, + 0x1F, 0xB9, 0x1F, 0xBA, 0x1F, 0xBB, 0x1F, 0xBC, 0x1F, 0xC1, 0x1F, 0xC2, 0x1F, 0xC3, 0x1F, 0xC4, + 0x1F, 0xC6, 0x1F, 0xC7, 0x1F, 0xC8, 0x1F, 0xC9, 0x1F, 0xCA, 0x1F, 0xCB, 0x1F, 0xCC, 0x1F, 0xCD, + 0x1F, 0xCE, 0x1F, 0xCF, 0x1F, 0xD0, 0x1F, 0xD1, 0x1F, 0xD2, 0x1F, 0xD3, 0x1F, 0xD6, 0x1F, 0xD7, + 0x1F, 0xD8, 0x1F, 0xD9, 0x1F, 0xDA, 0x1F, 0xDB, 0x1F, 0xDD, 0x1F, 0xDE, 0x1F, 0xDF, 0x1F, 0xE0, + 0x1F, 0xE1, 0x1F, 0xE2, 0x1F, 0xE3, 0x1F, 0xE4, 0x1F, 0xE5, 0x1F, 0xE6, 0x1F, 0xE7, 0x1F, 0xE8, + 0x1F, 0xE9, 0x1F, 0xEA, 0x1F, 0xEB, 0x1F, 0xEC, 0x1F, 0xED, 0x1F, 0xEE, 0x1F, 0xF2, 0x1F, 0xF3, + 0x1F, 0xF4, 0x1F, 0xF6, 0x1F, 0xF7, 0x1F, 0xF8, 0x1F, 0xF9, 0x1F, 0xFA, 0x1F, 0xFB, 0x1F, 0xFC, + 0x00, 0x01, 0x06, 0xB8, 0x00, 0xD1, 0x01, 0xA8, 0x01, 0xAE, 0x01, 0xB4, 0x01, 0xBA, 0x01, 0xC0, + 0x01, 0xC6, 0x01, 0xCC, 0x01, 0xD2, 0x01, 0xD8, 0x01, 0xDE, 0x01, 0xE4, 0x01, 0xEA, 0x01, 0xF0, + 0x01, 0xF6, 0x01, 0xFC, 0x02, 0x02, 0x02, 0x08, 0x02, 0x0E, 0x02, 0x14, 0x02, 0x1A, 0x02, 0x20, + 0x02, 0x26, 0x02, 0x2C, 0x02, 0x32, 0x02, 0x38, 0x02, 0x40, 0x02, 0x48, 0x02, 0x4E, 0x02, 0x54, + 0x02, 0x5A, 0x02, 0x60, 0x02, 0x66, 0x02, 0x6E, 0x02, 0x76, 0x02, 0x7C, 0x02, 0x82, 0x02, 0x88, + 0x02, 0x8E, 0x02, 0x94, 0x02, 0x9A, 0x02, 0xA0, 0x02, 0xA6, 0x02, 0xAC, 0x02, 0xB2, 0x02, 0xB8, + 0x02, 0xBE, 0x02, 0xC4, 0x02, 0xCA, 0x02, 0xD0, 0x02, 0xD8, 0x02, 0xE0, 0x02, 0xE6, 0x02, 0xEC, + 0x02, 0xF2, 0x02, 0xF8, 0x02, 0xFE, 0x03, 0x06, 0x03, 0x0E, 0x03, 0x14, 0x03, 0x1A, 0x03, 0x20, + 0x03, 0x26, 0x03, 0x2C, 0x03, 0x32, 0x03, 0x3A, 0x03, 0x42, 0x03, 0x48, 0x03, 0x4E, 0x03, 0x54, + 0x03, 0x5A, 0x03, 0x60, 0x03, 0x68, 0x03, 0x70, 0x03, 0x76, 0x03, 0x7C, 0x03, 0x82, 0x03, 0x88, + 0x03, 0x8E, 0x03, 0x94, 0x03, 0x9A, 0x03, 0xA0, 0x03, 0xA6, 0x03, 0xAC, 0x03, 0xB2, 0x03, 0xB8, + 0x03, 0xBE, 0x03, 0xC4, 0x03, 0xCA, 0x03, 0xD2, 0x03, 0xDA, 0x03, 0xE0, 0x03, 0xE6, 0x03, 0xEE, + 0x03, 0xF4, 0x03, 0xFA, 0x04, 0x00, 0x04, 0x06, 0x04, 0x0C, 0x04, 0x14, 0x04, 0x1C, 0x04, 0x22, + 0x04, 0x28, 0x04, 0x2E, 0x04, 0x34, 0x04, 0x3A, 0x04, 0x40, 0x04, 0x48, 0x04, 0x50, 0x04, 0x56, + 0x04, 0x5C, 0x04, 0x62, 0x04, 0x68, 0x04, 0x6E, 0x04, 0x74, 0x04, 0x7A, 0x04, 0x80, 0x04, 0x86, + 0x04, 0x8C, 0x04, 0x92, 0x04, 0x98, 0x04, 0x9E, 0x04, 0xA4, 0x04, 0xAA, 0x04, 0xB0, 0x04, 0xB6, + 0x04, 0xBC, 0x04, 0xC2, 0x04, 0xC8, 0x04, 0xCE, 0x04, 0xD4, 0x04, 0xDA, 0x04, 0xE0, 0x04, 0xE6, + 0x04, 0xEC, 0x04, 0xF2, 0x04, 0xF8, 0x04, 0xFE, 0x05, 0x04, 0x05, 0x0A, 0x05, 0x10, 0x05, 0x16, + 0x05, 0x1C, 0x05, 0x22, 0x05, 0x28, 0x05, 0x2E, 0x05, 0x34, 0x05, 0x3A, 0x05, 0x40, 0x05, 0x46, + 0x05, 0x4C, 0x05, 0x52, 0x05, 0x58, 0x05, 0x5E, 0x05, 0x64, 0x05, 0x6A, 0x05, 0x70, 0x05, 0x76, + 0x05, 0x7C, 0x05, 0x82, 0x05, 0x88, 0x05, 0x8E, 0x05, 0x94, 0x05, 0x9A, 0x05, 0xA0, 0x05, 0xA6, + 0x05, 0xAC, 0x05, 0xB2, 0x05, 0xB8, 0x05, 0xBE, 0x05, 0xC4, 0x05, 0xCA, 0x05, 0xD0, 0x05, 0xD6, + 0x05, 0xDC, 0x05, 0xE2, 0x05, 0xE8, 0x05, 0xEE, 0x05, 0xF4, 0x05, 0xFA, 0x06, 0x00, 0x06, 0x06, + 0x06, 0x0C, 0x06, 0x12, 0x06, 0x18, 0x06, 0x1E, 0x06, 0x24, 0x06, 0x2A, 0x06, 0x30, 0x06, 0x36, + 0x06, 0x3E, 0x06, 0x44, 0x06, 0x4A, 0x06, 0x50, 0x06, 0x56, 0x06, 0x5C, 0x06, 0x62, 0x06, 0x68, + 0x06, 0x70, 0x06, 0x76, 0x06, 0x7C, 0x06, 0x82, 0x06, 0x88, 0x06, 0x8E, 0x06, 0x94, 0x06, 0x9A, + 0x06, 0xA0, 0x06, 0xA6, 0x06, 0xAC, 0x06, 0xB2, 0x00, 0x02, 0x00, 0xA8, 0x03, 0x41, 0x00, 0x02, + 0x03, 0x91, 0x03, 0x41, 0x00, 0x02, 0x03, 0x95, 0x03, 0x41, 0x00, 0x02, 0x03, 0x97, 0x03, 0x41, + 0x00, 0x02, 0x03, 0x99, 0x03, 0x41, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x41, 0x00, 0x02, 0x03, 0xA5, + 0x03, 0x41, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x41, 0x00, 0x02, 0x03, 0xCA, 0x03, 0x01, 0x00, 0x02, + 0x03, 0xB1, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x41, + 0x00, 0x02, 0x03, 0xB9, 0x03, 0x41, 0x00, 0x02, 0x03, 0xCB, 0x03, 0x01, 0x00, 0x02, 0x1F, 0xBE, + 0x03, 0x08, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x41, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x41, 0x00, 0x02, + 0x03, 0xC9, 0x03, 0x41, 0x00, 0x02, 0x03, 0xD2, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x43, + 0x00, 0x02, 0x1F, 0x00, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x00, + 0x03, 0x41, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x42, + 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0x91, 0x03, 0x43, 0x00, 0x02, + 0x1F, 0x08, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x09, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x08, 0x03, 0x41, + 0x00, 0x02, 0x1F, 0x09, 0x03, 0x41, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, + 0x03, 0x91, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x10, + 0x03, 0x40, 0x00, 0x02, 0x1F, 0x11, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x10, 0x03, 0x41, 0x00, 0x02, + 0x1F, 0x11, 0x03, 0x41, 0x00, 0x02, 0x03, 0x95, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x18, 0x03, 0x40, + 0x00, 0x02, 0x1F, 0x19, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x18, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x19, + 0x03, 0x41, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x20, 0x03, 0x40, 0x00, 0x02, + 0x1F, 0x21, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x20, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x21, 0x03, 0x41, + 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x42, + 0x00, 0x02, 0x03, 0x97, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x28, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x29, + 0x03, 0x40, 0x00, 0x02, 0x1F, 0x28, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x29, 0x03, 0x41, 0x00, 0x03, + 0x03, 0x97, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, + 0x03, 0xB9, 0x03, 0x43, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x30, 0x03, 0x40, + 0x00, 0x02, 0x1F, 0x31, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x30, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x31, + 0x03, 0x41, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x14, + 0x03, 0x42, 0x00, 0x02, 0x03, 0x99, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x38, 0x03, 0x40, 0x00, 0x02, + 0x1F, 0x39, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x38, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x39, 0x03, 0x41, + 0x00, 0x03, 0x03, 0x99, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0x99, 0x03, 0x14, 0x03, 0x42, + 0x00, 0x02, 0x03, 0xBF, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x40, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x41, + 0x03, 0x40, 0x00, 0x02, 0x1F, 0x40, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x41, 0x03, 0x41, 0x00, 0x02, + 0x03, 0x9F, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x48, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x49, 0x03, 0x40, + 0x00, 0x02, 0x1F, 0x48, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x49, 0x03, 0x41, 0x00, 0x02, 0x03, 0xC5, + 0x03, 0x43, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x51, 0x03, 0x40, 0x00, 0x02, + 0x1F, 0x50, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x51, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x13, + 0x03, 0x42, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x59, 0x03, 0x40, + 0x00, 0x02, 0x1F, 0x59, 0x03, 0x41, 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, + 0x03, 0xC9, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x60, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x40, + 0x00, 0x02, 0x1F, 0x60, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, + 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0xA9, + 0x03, 0x43, 0x00, 0x02, 0x21, 0x26, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x68, 0x03, 0x40, 0x00, 0x02, + 0x1F, 0x69, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x68, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x69, 0x03, 0x41, + 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x42, + 0x00, 0x02, 0x03, 0xB1, 0x03, 0x40, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB5, + 0x03, 0x40, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x40, 0x00, 0x02, + 0x03, 0xB7, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x40, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x41, + 0x00, 0x02, 0x03, 0xBF, 0x03, 0x40, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x41, 0x00, 0x02, 0x03, 0xC5, + 0x03, 0x40, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x41, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x40, 0x00, 0x02, + 0x03, 0xC9, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x14, + 0x00, 0x02, 0x1F, 0x80, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x81, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x80, + 0x03, 0x01, 0x00, 0x02, 0x1F, 0x81, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x80, 0x03, 0x42, 0x00, 0x02, + 0x1F, 0x81, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xBC, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xBC, 0x03, 0x14, + 0x00, 0x02, 0x1F, 0x88, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x89, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x88, + 0x03, 0x01, 0x00, 0x02, 0x1F, 0x89, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x88, 0x03, 0x42, 0x00, 0x02, + 0x1F, 0x89, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x14, + 0x00, 0x02, 0x1F, 0x90, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x91, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x90, + 0x03, 0x01, 0x00, 0x02, 0x1F, 0x91, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x42, 0x00, 0x02, + 0x1F, 0x91, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xCC, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xCC, 0x03, 0x14, + 0x00, 0x02, 0x1F, 0x98, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x99, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x98, + 0x03, 0x01, 0x00, 0x02, 0x1F, 0x99, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x98, 0x03, 0x42, 0x00, 0x02, + 0x1F, 0x99, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x14, + 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xA0, + 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x42, 0x00, 0x02, + 0x1F, 0xA1, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xFC, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xFC, 0x03, 0x14, + 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xA9, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xA8, + 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA9, 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x42, 0x00, 0x02, + 0x1F, 0xA9, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x71, 0x03, 0x45, + 0x00, 0x02, 0x1F, 0xB6, 0x03, 0x45, 0x00, 0x02, 0x03, 0x91, 0x03, 0x40, 0x00, 0x02, 0x03, 0x91, + 0x03, 0x41, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x75, 0x03, 0x45, 0x00, 0x02, + 0x1F, 0xC6, 0x03, 0x45, 0x00, 0x02, 0x03, 0x95, 0x03, 0x40, 0x00, 0x02, 0x03, 0x95, 0x03, 0x41, + 0x00, 0x02, 0x03, 0x97, 0x03, 0x40, 0x00, 0x02, 0x03, 0x97, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xBF, + 0x03, 0x40, 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x06, 0x00, 0x02, + 0x1F, 0xBE, 0x03, 0x04, 0x00, 0x02, 0x03, 0xCA, 0x03, 0x40, 0x00, 0x02, 0x03, 0xCA, 0x03, 0x01, + 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x42, 0x00, 0x02, + 0x03, 0x99, 0x03, 0x40, 0x00, 0x02, 0x03, 0x99, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xFE, 0x03, 0x40, + 0x00, 0x02, 0x1F, 0xFE, 0x03, 0x41, 0x00, 0x02, 0x03, 0xCB, 0x03, 0x40, 0x00, 0x02, 0x03, 0xCB, + 0x03, 0x01, 0x00, 0x02, 0x03, 0xC1, 0x03, 0x43, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x42, + 0x00, 0x02, 0x03, 0xA5, 0x03, 0x40, 0x00, 0x02, 0x03, 0xA5, 0x03, 0x41, 0x00, 0x02, 0x00, 0xA8, + 0x03, 0x40, 0x00, 0x02, 0x00, 0xA8, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x00, 0x00, 0x02, + 0x1F, 0x7D, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xF6, 0x03, 0x45, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x40, + 0x00, 0x02, 0x03, 0x9F, 0x03, 0x41, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x40, 0x00, 0x02, 0x03, 0xA9, + 0x03, 0x41, 0x00, 0x02, 0x21, 0x26, 0x03, 0x45, 0x00, 0x01, 0x00, 0xD1, 0x03, 0x85, 0x03, 0x86, + 0x03, 0x88, 0x03, 0x89, 0x03, 0x8A, 0x03, 0x8C, 0x03, 0x8E, 0x03, 0x8F, 0x03, 0x90, 0x03, 0xAC, + 0x03, 0xAD, 0x03, 0xAE, 0x03, 0xAF, 0x03, 0xB0, 0x03, 0xCA, 0x03, 0xCC, 0x03, 0xCD, 0x03, 0xCE, + 0x03, 0xD3, 0x1F, 0x00, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05, 0x1F, 0x06, 0x1F, 0x07, + 0x1F, 0x08, 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, 0x0C, 0x1F, 0x0D, 0x1F, 0x0E, 0x1F, 0x0F, 0x1F, 0x10, + 0x1F, 0x12, 0x1F, 0x13, 0x1F, 0x14, 0x1F, 0x15, 0x1F, 0x18, 0x1F, 0x1A, 0x1F, 0x1B, 0x1F, 0x1C, + 0x1F, 0x1D, 0x1F, 0x20, 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24, 0x1F, 0x25, 0x1F, 0x26, 0x1F, 0x27, + 0x1F, 0x28, 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, 0x2C, 0x1F, 0x2D, 0x1F, 0x2E, 0x1F, 0x2F, 0x1F, 0x30, + 0x1F, 0x31, 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x37, 0x1F, 0x38, + 0x1F, 0x3A, 0x1F, 0x3B, 0x1F, 0x3C, 0x1F, 0x3D, 0x1F, 0x3E, 0x1F, 0x3F, 0x1F, 0x40, 0x1F, 0x42, + 0x1F, 0x43, 0x1F, 0x44, 0x1F, 0x45, 0x1F, 0x48, 0x1F, 0x4A, 0x1F, 0x4B, 0x1F, 0x4C, 0x1F, 0x4D, + 0x1F, 0x50, 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54, 0x1F, 0x55, 0x1F, 0x56, 0x1F, 0x57, 0x1F, 0x5B, + 0x1F, 0x5D, 0x1F, 0x5F, 0x1F, 0x60, 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, 0x1F, 0x66, + 0x1F, 0x67, 0x1F, 0x68, 0x1F, 0x69, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, + 0x1F, 0x6F, 0x1F, 0x70, 0x1F, 0x71, 0x1F, 0x72, 0x1F, 0x73, 0x1F, 0x74, 0x1F, 0x75, 0x1F, 0x76, + 0x1F, 0x77, 0x1F, 0x78, 0x1F, 0x79, 0x1F, 0x7A, 0x1F, 0x7B, 0x1F, 0x7C, 0x1F, 0x7D, 0x1F, 0x80, + 0x1F, 0x81, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, + 0x1F, 0x89, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, + 0x1F, 0x91, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, + 0x1F, 0x99, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, + 0x1F, 0xA1, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, + 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2, + 0x1F, 0xB4, 0x1F, 0xB7, 0x1F, 0xBA, 0x1F, 0xBB, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xC7, 0x1F, 0xC8, + 0x1F, 0xC9, 0x1F, 0xCA, 0x1F, 0xCB, 0x1F, 0xCD, 0x1F, 0xCE, 0x1F, 0xD0, 0x1F, 0xD1, 0x1F, 0xD2, + 0x1F, 0xD3, 0x1F, 0xD6, 0x1F, 0xD7, 0x1F, 0xDA, 0x1F, 0xDB, 0x1F, 0xDD, 0x1F, 0xDE, 0x1F, 0xE2, + 0x1F, 0xE3, 0x1F, 0xE4, 0x1F, 0xE7, 0x1F, 0xEA, 0x1F, 0xEB, 0x1F, 0xED, 0x1F, 0xEE, 0x1F, 0xF2, + 0x1F, 0xF4, 0x1F, 0xF7, 0x1F, 0xF8, 0x1F, 0xF9, 0x1F, 0xFA, 0x1F, 0xFB, 0x1F, 0xFC, 0x00, 0x01, + 0x05, 0x00, 0x00, 0x89, 0x01, 0x18, 0x01, 0x1E, 0x01, 0x24, 0x01, 0x2A, 0x01, 0x30, 0x01, 0x38, + 0x01, 0x40, 0x01, 0x48, 0x01, 0x50, 0x01, 0x58, 0x01, 0x60, 0x01, 0x68, 0x01, 0x70, 0x01, 0x78, + 0x01, 0x80, 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA0, 0x01, 0xA8, 0x01, 0xB0, 0x01, 0xB8, + 0x01, 0xC0, 0x01, 0xC8, 0x01, 0xD0, 0x01, 0xD8, 0x01, 0xE0, 0x01, 0xE8, 0x01, 0xF0, 0x01, 0xF8, + 0x02, 0x00, 0x02, 0x08, 0x02, 0x10, 0x02, 0x16, 0x02, 0x1E, 0x02, 0x26, 0x02, 0x2E, 0x02, 0x36, + 0x02, 0x3E, 0x02, 0x46, 0x02, 0x4E, 0x02, 0x56, 0x02, 0x5E, 0x02, 0x66, 0x02, 0x6E, 0x02, 0x76, + 0x02, 0x7E, 0x02, 0x86, 0x02, 0x8E, 0x02, 0x96, 0x02, 0x9E, 0x02, 0xA6, 0x02, 0xAE, 0x02, 0xB6, + 0x02, 0xBE, 0x02, 0xC6, 0x02, 0xCE, 0x02, 0xD6, 0x02, 0xDE, 0x02, 0xE6, 0x02, 0xEE, 0x02, 0xF6, + 0x02, 0xFE, 0x03, 0x06, 0x03, 0x0E, 0x03, 0x14, 0x03, 0x1C, 0x03, 0x24, 0x03, 0x2C, 0x03, 0x34, + 0x03, 0x3C, 0x03, 0x44, 0x03, 0x4A, 0x03, 0x50, 0x03, 0x56, 0x03, 0x5E, 0x03, 0x64, 0x03, 0x6A, + 0x03, 0x70, 0x03, 0x76, 0x03, 0x7E, 0x03, 0x86, 0x03, 0x8C, 0x03, 0x94, 0x03, 0x9A, 0x03, 0xA0, + 0x03, 0xA6, 0x03, 0xAC, 0x03, 0xB4, 0x03, 0xBC, 0x03, 0xC2, 0x03, 0xCA, 0x03, 0xD0, 0x03, 0xD6, + 0x03, 0xDC, 0x03, 0xE2, 0x03, 0xEA, 0x03, 0xF2, 0x03, 0xF8, 0x04, 0x00, 0x04, 0x06, 0x04, 0x0C, + 0x04, 0x12, 0x04, 0x18, 0x04, 0x20, 0x04, 0x28, 0x04, 0x2E, 0x04, 0x36, 0x04, 0x3C, 0x04, 0x42, + 0x04, 0x48, 0x04, 0x4E, 0x04, 0x56, 0x04, 0x5E, 0x04, 0x64, 0x04, 0x6C, 0x04, 0x72, 0x04, 0x78, + 0x04, 0x7E, 0x04, 0x84, 0x04, 0x8C, 0x04, 0x94, 0x04, 0x9A, 0x04, 0xA0, 0x04, 0xA8, 0x04, 0xAE, + 0x04, 0xB4, 0x04, 0xBC, 0x04, 0xC4, 0x04, 0xCA, 0x04, 0xD2, 0x04, 0xDA, 0x04, 0xE0, 0x04, 0xE6, + 0x04, 0xEC, 0x04, 0xF4, 0x04, 0xFA, 0x00, 0x02, 0x21, 0x26, 0x03, 0x01, 0x00, 0x02, 0x03, 0xCA, + 0x03, 0x41, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x01, 0x00, 0x02, 0x03, 0xCB, 0x03, 0x41, 0x00, 0x03, + 0x03, 0xB1, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, + 0x03, 0xB1, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, + 0x03, 0xB1, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, + 0x03, 0x91, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, + 0x03, 0x91, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, + 0x03, 0xB5, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, + 0x03, 0xB5, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, + 0x03, 0x95, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, + 0x03, 0x95, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, + 0x03, 0xB7, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, + 0x03, 0xB7, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, + 0x03, 0xB7, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, + 0x03, 0x97, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, + 0x03, 0x97, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, 0x03, 0x42, 0x00, 0x02, + 0x1F, 0xBE, 0x03, 0x13, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB9, + 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB9, + 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xBE, + 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0x99, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0x99, + 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0x99, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0x99, + 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0x99, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0xBF, + 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xBF, + 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0x9F, + 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0x9F, + 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, + 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC5, + 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, + 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xA5, + 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC9, + 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, + 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x42, 0x00, 0x02, 0x21, 0x26, + 0x03, 0x13, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x14, + 0x03, 0x00, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x14, + 0x03, 0x01, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x21, 0x26, 0x03, 0x14, + 0x03, 0x42, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x01, 0x00, 0x02, + 0x1F, 0xB3, 0x03, 0x43, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x80, + 0x03, 0x40, 0x00, 0x02, 0x1F, 0x81, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x80, 0x03, 0x41, 0x00, 0x02, + 0x1F, 0x81, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x01, + 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xBC, 0x03, 0x43, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, + 0x03, 0x45, 0x00, 0x02, 0x1F, 0x88, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x89, 0x03, 0x40, 0x00, 0x02, + 0x1F, 0x88, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x89, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x42, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x43, + 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x40, 0x00, 0x02, + 0x1F, 0x91, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x91, 0x03, 0x41, + 0x00, 0x03, 0x1F, 0x20, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x42, 0x03, 0x45, + 0x00, 0x02, 0x1F, 0xCC, 0x03, 0x43, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, + 0x1F, 0x98, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x99, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x98, 0x03, 0x41, + 0x00, 0x02, 0x1F, 0x99, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, + 0x1F, 0x29, 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x43, 0x00, 0x03, 0x03, 0xC9, + 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x40, + 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x60, + 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xFC, + 0x03, 0x43, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x40, + 0x00, 0x02, 0x1F, 0xA9, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xA9, + 0x03, 0x41, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x42, + 0x03, 0x45, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x01, 0x00, 0x03, + 0x03, 0xB1, 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xC3, + 0x03, 0x01, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, + 0x03, 0x00, 0x00, 0x02, 0x03, 0xCA, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x42, + 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x00, 0x00, 0x02, 0x03, 0xCB, 0x03, 0x41, 0x00, 0x02, + 0x1F, 0xF3, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x42, + 0x03, 0x45, 0x00, 0x02, 0x21, 0x26, 0x03, 0x00, 0x00, 0x02, 0x21, 0x26, 0x03, 0x01, 0x00, 0x01, + 0x00, 0x89, 0x03, 0x8F, 0x03, 0x90, 0x03, 0xAF, 0x03, 0xB0, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, + 0x1F, 0x05, 0x1F, 0x06, 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, 0x0C, 0x1F, 0x0D, 0x1F, 0x0E, 0x1F, 0x12, + 0x1F, 0x13, 0x1F, 0x14, 0x1F, 0x15, 0x1F, 0x1A, 0x1F, 0x1B, 0x1F, 0x1C, 0x1F, 0x1D, 0x1F, 0x22, + 0x1F, 0x23, 0x1F, 0x24, 0x1F, 0x25, 0x1F, 0x26, 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, 0x2C, 0x1F, 0x2D, + 0x1F, 0x2E, 0x1F, 0x30, 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x37, + 0x1F, 0x3A, 0x1F, 0x3B, 0x1F, 0x3C, 0x1F, 0x3D, 0x1F, 0x3E, 0x1F, 0x42, 0x1F, 0x43, 0x1F, 0x44, + 0x1F, 0x45, 0x1F, 0x4A, 0x1F, 0x4B, 0x1F, 0x4C, 0x1F, 0x4D, 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54, + 0x1F, 0x55, 0x1F, 0x56, 0x1F, 0x5B, 0x1F, 0x5D, 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, + 0x1F, 0x66, 0x1F, 0x68, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x6F, + 0x1F, 0x76, 0x1F, 0x77, 0x1F, 0x80, 0x1F, 0x81, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, + 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, 0x1F, 0x89, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, + 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, 0x1F, 0x91, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, + 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x99, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, + 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA1, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, + 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, + 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2, 0x1F, 0xB4, 0x1F, 0xB7, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xC7, + 0x1F, 0xD2, 0x1F, 0xD3, 0x1F, 0xD7, 0x1F, 0xE2, 0x1F, 0xE3, 0x1F, 0xF2, 0x1F, 0xF4, 0x1F, 0xF7, + 0x1F, 0xFA, 0x1F, 0xFB, 0x00, 0x01, 0x04, 0xE2, 0x00, 0x7F, 0x01, 0x04, 0x01, 0x0A, 0x01, 0x10, + 0x01, 0x16, 0x01, 0x1E, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x36, 0x01, 0x3E, 0x01, 0x46, 0x01, 0x4E, + 0x01, 0x56, 0x01, 0x5E, 0x01, 0x66, 0x01, 0x6E, 0x01, 0x76, 0x01, 0x7E, 0x01, 0x86, 0x01, 0x8E, + 0x01, 0x96, 0x01, 0x9E, 0x01, 0xA6, 0x01, 0xAE, 0x01, 0xB6, 0x01, 0xBE, 0x01, 0xC6, 0x01, 0xCE, + 0x01, 0xD6, 0x01, 0xDE, 0x01, 0xE4, 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFC, 0x02, 0x04, 0x02, 0x0C, + 0x02, 0x14, 0x02, 0x1C, 0x02, 0x24, 0x02, 0x2C, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x44, 0x02, 0x4C, + 0x02, 0x54, 0x02, 0x5C, 0x02, 0x64, 0x02, 0x6C, 0x02, 0x74, 0x02, 0x7C, 0x02, 0x84, 0x02, 0x8C, + 0x02, 0x94, 0x02, 0x9C, 0x02, 0xA4, 0x02, 0xAC, 0x02, 0xB4, 0x02, 0xBC, 0x02, 0xC2, 0x02, 0xCA, + 0x02, 0xD2, 0x02, 0xDA, 0x02, 0xE2, 0x02, 0xEA, 0x02, 0xF0, 0x02, 0xF6, 0x02, 0xFE, 0x03, 0x06, + 0x03, 0x0E, 0x03, 0x16, 0x03, 0x1E, 0x03, 0x26, 0x03, 0x2E, 0x03, 0x36, 0x03, 0x3E, 0x03, 0x46, + 0x03, 0x4E, 0x03, 0x56, 0x03, 0x5E, 0x03, 0x66, 0x03, 0x6E, 0x03, 0x76, 0x03, 0x7E, 0x03, 0x86, + 0x03, 0x8E, 0x03, 0x96, 0x03, 0x9E, 0x03, 0xA6, 0x03, 0xAE, 0x03, 0xB6, 0x03, 0xBE, 0x03, 0xC6, + 0x03, 0xCE, 0x03, 0xD6, 0x03, 0xDE, 0x03, 0xE6, 0x03, 0xEE, 0x03, 0xF6, 0x03, 0xFE, 0x04, 0x06, + 0x04, 0x0E, 0x04, 0x16, 0x04, 0x1E, 0x04, 0x26, 0x04, 0x2E, 0x04, 0x36, 0x04, 0x3E, 0x04, 0x46, + 0x04, 0x4E, 0x04, 0x56, 0x04, 0x5E, 0x04, 0x66, 0x04, 0x6E, 0x04, 0x76, 0x04, 0x7E, 0x04, 0x84, + 0x04, 0x8C, 0x04, 0x94, 0x04, 0x9A, 0x04, 0xA2, 0x04, 0xAA, 0x04, 0xB0, 0x04, 0xB8, 0x04, 0xC0, + 0x04, 0xC8, 0x04, 0xCE, 0x04, 0xD6, 0x04, 0xDC, 0x00, 0x02, 0x21, 0x26, 0x03, 0x41, 0x00, 0x02, + 0x1F, 0xBE, 0x03, 0x44, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, + 0x03, 0x01, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, + 0x03, 0x40, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, + 0x03, 0x41, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, + 0x03, 0x40, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, + 0x03, 0x41, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14, + 0x03, 0x40, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14, + 0x03, 0x41, 0x00, 0x03, 0x03, 0x95, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14, + 0x03, 0x40, 0x00, 0x03, 0x03, 0x95, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14, + 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, + 0x03, 0x40, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, + 0x03, 0x41, 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, + 0x03, 0x40, 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, + 0x03, 0x41, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x43, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x40, + 0x00, 0x03, 0x03, 0xB9, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x41, + 0x00, 0x03, 0x03, 0xB9, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x13, 0x03, 0x42, + 0x00, 0x03, 0x03, 0x99, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x99, 0x03, 0x14, 0x03, 0x40, + 0x00, 0x03, 0x03, 0x99, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x99, 0x03, 0x14, 0x03, 0x41, + 0x00, 0x03, 0x03, 0xBF, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x40, + 0x00, 0x03, 0x03, 0xBF, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x41, + 0x00, 0x03, 0x03, 0x9F, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x40, + 0x00, 0x03, 0x03, 0x9F, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x41, + 0x00, 0x03, 0x03, 0xC5, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x40, + 0x00, 0x03, 0x03, 0xC5, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x41, + 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14, 0x03, 0x41, + 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x40, + 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x41, + 0x00, 0x02, 0x21, 0x26, 0x03, 0x43, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, + 0x03, 0xA9, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, + 0x03, 0xA9, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x42, 0x00, 0x02, + 0x1F, 0xBE, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x13, + 0x03, 0x45, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x00, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x01, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x45, + 0x03, 0x42, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, + 0x03, 0x45, 0x00, 0x03, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x00, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x01, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x45, + 0x03, 0x42, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13, + 0x03, 0x45, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x00, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x01, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x45, + 0x03, 0x42, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, + 0x03, 0x45, 0x00, 0x03, 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x00, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x01, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x45, + 0x03, 0x42, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, + 0x03, 0x45, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x00, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x01, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x45, + 0x03, 0x42, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, + 0x03, 0x45, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x00, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x01, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x45, + 0x03, 0x42, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x00, + 0x03, 0x45, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x42, + 0x00, 0x03, 0x03, 0xB7, 0x03, 0x00, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x41, 0x00, 0x03, + 0x03, 0xB7, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x40, 0x00, 0x02, + 0x1F, 0xBE, 0x03, 0x44, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC5, + 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x00, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xF3, + 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x42, 0x00, 0x02, 0x21, 0x26, 0x03, 0x40, + 0x00, 0x02, 0x21, 0x26, 0x03, 0x41, 0x00, 0x01, 0x00, 0x7F, 0x03, 0x8F, 0x03, 0x90, 0x03, 0xAF, + 0x03, 0xB0, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05, 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, 0x0C, + 0x1F, 0x0D, 0x1F, 0x12, 0x1F, 0x13, 0x1F, 0x14, 0x1F, 0x15, 0x1F, 0x1A, 0x1F, 0x1B, 0x1F, 0x1C, + 0x1F, 0x1D, 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24, 0x1F, 0x25, 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, 0x2C, + 0x1F, 0x2D, 0x1F, 0x30, 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x3A, + 0x1F, 0x3B, 0x1F, 0x3C, 0x1F, 0x3D, 0x1F, 0x42, 0x1F, 0x43, 0x1F, 0x44, 0x1F, 0x45, 0x1F, 0x4A, + 0x1F, 0x4B, 0x1F, 0x4C, 0x1F, 0x4D, 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54, 0x1F, 0x55, 0x1F, 0x5B, + 0x1F, 0x5D, 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, 0x1F, 0x68, 0x1F, 0x6A, 0x1F, 0x6B, + 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x76, 0x1F, 0x77, 0x1F, 0x80, 0x1F, 0x81, 0x1F, 0x82, + 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, 0x1F, 0x89, 0x1F, 0x8A, + 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, 0x1F, 0x91, 0x1F, 0x92, + 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x99, 0x1F, 0x9A, + 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA1, 0x1F, 0xA2, + 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xAA, + 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2, 0x1F, 0xB4, 0x1F, 0xB7, + 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xC7, 0x1F, 0xD2, 0x1F, 0xD3, 0x1F, 0xE2, 0x1F, 0xE3, 0x1F, 0xF2, + 0x1F, 0xF4, 0x1F, 0xF7, 0x1F, 0xFA, 0x1F, 0xFB, 0x00, 0x01, 0x03, 0x62, 0x00, 0x56, 0x00, 0xB2, + 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xCA, 0x00, 0xD2, 0x00, 0xDA, 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF2, + 0x00, 0xFA, 0x01, 0x02, 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x22, 0x01, 0x2A, 0x01, 0x32, + 0x01, 0x3A, 0x01, 0x42, 0x01, 0x4A, 0x01, 0x52, 0x01, 0x5A, 0x01, 0x62, 0x01, 0x6A, 0x01, 0x72, + 0x01, 0x7A, 0x01, 0x82, 0x01, 0x8A, 0x01, 0x92, 0x01, 0x9A, 0x01, 0xA2, 0x01, 0xAA, 0x01, 0xB2, + 0x01, 0xBA, 0x01, 0xC2, 0x01, 0xCA, 0x01, 0xD2, 0x01, 0xDA, 0x01, 0xE2, 0x01, 0xEA, 0x01, 0xF2, + 0x01, 0xFA, 0x02, 0x02, 0x02, 0x0A, 0x02, 0x12, 0x02, 0x1A, 0x02, 0x22, 0x02, 0x2A, 0x02, 0x32, + 0x02, 0x3A, 0x02, 0x42, 0x02, 0x4A, 0x02, 0x52, 0x02, 0x5A, 0x02, 0x62, 0x02, 0x6A, 0x02, 0x72, + 0x02, 0x7A, 0x02, 0x82, 0x02, 0x8A, 0x02, 0x92, 0x02, 0x9A, 0x02, 0xA2, 0x02, 0xAA, 0x02, 0xB2, + 0x02, 0xBA, 0x02, 0xC2, 0x02, 0xCA, 0x02, 0xD2, 0x02, 0xDA, 0x02, 0xE2, 0x02, 0xEA, 0x02, 0xF2, + 0x02, 0xFA, 0x03, 0x02, 0x03, 0x0A, 0x03, 0x12, 0x03, 0x1A, 0x03, 0x22, 0x03, 0x2A, 0x03, 0x32, + 0x03, 0x3A, 0x03, 0x42, 0x03, 0x4A, 0x03, 0x52, 0x03, 0x5A, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, + 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, + 0x03, 0x00, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, + 0x03, 0x00, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x43, + 0x03, 0x00, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0x95, 0x03, 0x43, + 0x03, 0x00, 0x00, 0x03, 0x03, 0x95, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43, + 0x03, 0x00, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, + 0x03, 0x00, 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x43, + 0x03, 0x00, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x43, + 0x03, 0x01, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, + 0x03, 0x42, 0x00, 0x03, 0x03, 0x99, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0x99, 0x03, 0x43, + 0x03, 0x01, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x43, + 0x03, 0x01, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x43, + 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x43, + 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, + 0x03, 0x01, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x21, 0x26, 0x03, 0x14, + 0x03, 0x00, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x21, 0x26, 0x03, 0x14, + 0x03, 0x01, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x40, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x41, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x14, + 0x03, 0x42, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x40, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x41, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, + 0x03, 0x42, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x40, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x41, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, + 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x40, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x41, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, + 0x03, 0x42, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x40, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x41, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x14, + 0x03, 0x42, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, 0x00, 0x03, 0x21, 0x26, 0x03, 0x14, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x40, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x41, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14, + 0x03, 0x42, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x01, + 0x03, 0x45, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x01, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, + 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x40, + 0x03, 0x45, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x01, 0x03, 0x45, 0x00, 0x01, 0x00, 0x56, 0x03, 0x90, + 0x03, 0xB0, 0x1F, 0x02, 0x1F, 0x04, 0x1F, 0x0A, 0x1F, 0x0C, 0x1F, 0x12, 0x1F, 0x14, 0x1F, 0x1A, + 0x1F, 0x1C, 0x1F, 0x22, 0x1F, 0x24, 0x1F, 0x2A, 0x1F, 0x2C, 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, + 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x3A, 0x1F, 0x3C, 0x1F, 0x42, 0x1F, 0x44, 0x1F, 0x4A, 0x1F, 0x4C, + 0x1F, 0x52, 0x1F, 0x54, 0x1F, 0x62, 0x1F, 0x64, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, + 0x1F, 0x6E, 0x1F, 0x80, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, + 0x1F, 0x88, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, + 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x9A, + 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA2, 0x1F, 0xA3, + 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, + 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2, 0x1F, 0xB4, 0x1F, 0xC2, 0x1F, 0xC4, + 0x1F, 0xD2, 0x1F, 0xD3, 0x1F, 0xE3, 0x1F, 0xF2, 0x1F, 0xF4, 0x00, 0x01, 0x03, 0x46, 0x00, 0x52, + 0x00, 0xAA, 0x00, 0xB2, 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xCA, 0x00, 0xD2, 0x00, 0xDA, 0x00, 0xE2, + 0x00, 0xEA, 0x00, 0xF2, 0x00, 0xFA, 0x01, 0x02, 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x22, + 0x01, 0x2A, 0x01, 0x32, 0x01, 0x3A, 0x01, 0x42, 0x01, 0x4A, 0x01, 0x52, 0x01, 0x5A, 0x01, 0x62, + 0x01, 0x6A, 0x01, 0x72, 0x01, 0x7A, 0x01, 0x82, 0x01, 0x8A, 0x01, 0x92, 0x01, 0x9A, 0x01, 0xA2, + 0x01, 0xAA, 0x01, 0xB2, 0x01, 0xBA, 0x01, 0xC2, 0x01, 0xCA, 0x01, 0xD2, 0x01, 0xDC, 0x01, 0xE4, + 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFC, 0x02, 0x04, 0x02, 0x0C, 0x02, 0x16, 0x02, 0x1E, 0x02, 0x26, + 0x02, 0x2E, 0x02, 0x36, 0x02, 0x3E, 0x02, 0x46, 0x02, 0x50, 0x02, 0x58, 0x02, 0x60, 0x02, 0x68, + 0x02, 0x70, 0x02, 0x78, 0x02, 0x80, 0x02, 0x8A, 0x02, 0x92, 0x02, 0x9A, 0x02, 0xA2, 0x02, 0xAA, + 0x02, 0xB2, 0x02, 0xBA, 0x02, 0xC4, 0x02, 0xCC, 0x02, 0xD4, 0x02, 0xDC, 0x02, 0xE4, 0x02, 0xEC, + 0x02, 0xF4, 0x02, 0xFC, 0x03, 0x06, 0x03, 0x0E, 0x03, 0x16, 0x03, 0x1E, 0x03, 0x26, 0x03, 0x2E, + 0x03, 0x36, 0x03, 0x3E, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0x91, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB5, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0x95, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0x95, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0x97, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB9, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB9, + 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x03, 0x99, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0x99, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0xBF, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0x9F, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC5, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0xA9, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x21, 0x26, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xA9, + 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x21, 0x26, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, + 0x03, 0x45, 0x03, 0x13, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x1F, 0x01, + 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x1F, 0x01, + 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0xB1, + 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x03, 0x91, 0x03, 0x45, 0x03, 0x13, 0x00, 0x03, + 0x1F, 0x08, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, + 0x1F, 0x08, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, + 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, + 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x45, 0x03, 0x00, + 0x00, 0x03, 0x1F, 0x21, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x45, 0x03, 0x01, + 0x00, 0x03, 0x1F, 0x21, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x43, 0x03, 0x42, + 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x03, 0x97, 0x03, 0x45, + 0x03, 0x13, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x45, + 0x03, 0x00, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x45, + 0x03, 0x01, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, + 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x13, 0x00, 0x03, 0x1F, 0x60, + 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x1F, 0x60, + 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xF3, + 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, + 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x00, 0x03, 0x21, 0x26, 0x03, 0x45, 0x03, 0x14, 0x00, 0x03, + 0x1F, 0x68, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, + 0x1F, 0x68, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, + 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, + 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x41, 0x03, 0x45, + 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x41, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x41, + 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x41, 0x03, 0x45, + 0x00, 0x01, 0x00, 0x52, 0x03, 0x90, 0x1F, 0x02, 0x1F, 0x04, 0x1F, 0x0A, 0x1F, 0x0C, 0x1F, 0x12, + 0x1F, 0x14, 0x1F, 0x1A, 0x1F, 0x1C, 0x1F, 0x22, 0x1F, 0x24, 0x1F, 0x2A, 0x1F, 0x2C, 0x1F, 0x32, + 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x3A, 0x1F, 0x3C, 0x1F, 0x42, 0x1F, 0x44, 0x1F, 0x4A, + 0x1F, 0x4C, 0x1F, 0x52, 0x1F, 0x54, 0x1F, 0x62, 0x1F, 0x64, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, + 0x1F, 0x6D, 0x1F, 0x80, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, + 0x1F, 0x88, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, + 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x9A, + 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA2, 0x1F, 0xA3, + 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, + 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2, 0x1F, 0xB4, 0x1F, 0xC2, 0x1F, 0xC4, + 0x1F, 0xD2, 0x1F, 0xD3, 0x1F, 0xF2, 0x1F, 0xF4, 0x00, 0x01, 0x02, 0x3A, 0x00, 0x36, 0x00, 0x72, + 0x00, 0x7A, 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, 0x00, 0x9A, 0x00, 0xA2, 0x00, 0xAA, 0x00, 0xB2, + 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xCC, 0x00, 0xD6, 0x00, 0xDE, 0x00, 0xE6, 0x00, 0xEE, 0x00, 0xF6, + 0x00, 0xFE, 0x01, 0x08, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x22, 0x01, 0x2A, 0x01, 0x32, 0x01, 0x3A, + 0x01, 0x44, 0x01, 0x4E, 0x01, 0x56, 0x01, 0x5E, 0x01, 0x66, 0x01, 0x6E, 0x01, 0x76, 0x01, 0x80, + 0x01, 0x8A, 0x01, 0x92, 0x01, 0x9A, 0x01, 0xA2, 0x01, 0xAA, 0x01, 0xB2, 0x01, 0xBC, 0x01, 0xC6, + 0x01, 0xCE, 0x01, 0xD6, 0x01, 0xDE, 0x01, 0xE6, 0x01, 0xEE, 0x01, 0xF8, 0x02, 0x02, 0x02, 0x0A, + 0x02, 0x12, 0x02, 0x1A, 0x02, 0x22, 0x02, 0x2A, 0x02, 0x32, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, + 0x03, 0x01, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x13, + 0x03, 0x01, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, + 0x03, 0x01, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x45, + 0x03, 0x40, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x45, + 0x03, 0x41, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, + 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, + 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, + 0x1F, 0x09, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, + 0x1F, 0x09, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, + 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, + 0x03, 0x43, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x45, + 0x03, 0x40, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x45, + 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, + 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, + 0x1F, 0x28, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, + 0x1F, 0x28, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, + 0x03, 0x97, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x45, + 0x03, 0x42, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x45, + 0x03, 0x40, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x45, + 0x03, 0x41, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, + 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, + 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, + 0x1F, 0x69, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, + 0x1F, 0x69, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, + 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, + 0x03, 0x40, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, + 0x03, 0x40, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, + 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, + 0x03, 0x01, 0x00, 0x01, 0x00, 0x36, 0x03, 0x90, 0x1F, 0x32, 0x1F, 0x34, 0x1F, 0x6A, 0x1F, 0x6C, + 0x1F, 0x80, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, + 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, 0x1F, 0x92, + 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x9A, 0x1F, 0x9B, + 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, + 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, + 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2, 0x1F, 0xB4, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xD3, 0x1F, 0xF2, + 0x1F, 0xF4, 0x00, 0x01, 0x01, 0xEA, 0x00, 0x2E, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, + 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, 0x00, 0x9A, 0x00, 0xA2, 0x00, 0xAA, 0x00, 0xB4, 0x00, 0xBE, + 0x00, 0xC6, 0x00, 0xCE, 0x00, 0xD6, 0x00, 0xDE, 0x00, 0xE8, 0x00, 0xF2, 0x00, 0xFA, 0x01, 0x02, + 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1C, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x36, 0x01, 0x3E, 0x01, 0x46, + 0x01, 0x50, 0x01, 0x5A, 0x01, 0x62, 0x01, 0x6A, 0x01, 0x72, 0x01, 0x7A, 0x01, 0x84, 0x01, 0x8E, + 0x01, 0x96, 0x01, 0x9E, 0x01, 0xA6, 0x01, 0xAE, 0x01, 0xB6, 0x01, 0xC0, 0x01, 0xCA, 0x01, 0xD2, + 0x01, 0xDA, 0x01, 0xE2, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBE, + 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x21, 0x26, + 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xB3, + 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xB3, + 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB1, + 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, + 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14, 0x03, 0x00, + 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14, 0x03, 0x01, + 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, + 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xC3, + 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xC3, + 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, + 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x00, + 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x01, + 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, + 0x03, 0x42, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xF3, + 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xF3, + 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, + 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, + 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x00, + 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x01, + 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, + 0x03, 0x42, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB1, + 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBE, + 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x41, 0x00, 0x01, 0x00, 0x2E, + 0x03, 0x90, 0x1F, 0x32, 0x1F, 0x34, 0x1F, 0x6A, 0x1F, 0x6C, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, + 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, + 0x1F, 0x8F, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x9A, + 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, + 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, + 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB4, 0x1F, 0xC4, 0x1F, 0xD3, 0x1F, 0xF4, 0x00, 0x01, 0x01, 0x7C, + 0x00, 0x24, 0x00, 0x4E, 0x00, 0x56, 0x00, 0x5E, 0x00, 0x66, 0x00, 0x6E, 0x00, 0x76, 0x00, 0x7E, + 0x00, 0x86, 0x00, 0x8E, 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA8, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC2, + 0x00, 0xCA, 0x00, 0xD2, 0x00, 0xDA, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF4, 0x00, 0xFC, 0x01, 0x04, + 0x01, 0x0C, 0x01, 0x16, 0x01, 0x1E, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x36, 0x01, 0x40, 0x01, 0x48, + 0x01, 0x50, 0x01, 0x58, 0x01, 0x60, 0x01, 0x68, 0x01, 0x72, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, + 0x03, 0x00, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, + 0x03, 0x00, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13, + 0x03, 0x40, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13, + 0x03, 0x41, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, + 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBC, + 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBC, + 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, + 0x1F, 0xC3, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, + 0x1F, 0xC3, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, + 0x03, 0xB7, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x40, + 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x41, + 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x42, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x14, + 0x03, 0x40, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x14, + 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x21, 0x26, + 0x03, 0x43, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xFC, + 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xFC, + 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, + 0x21, 0x26, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x00, 0x01, 0x00, 0x24, 0x1F, 0x32, 0x1F, 0x34, + 0x1F, 0x6A, 0x1F, 0x6C, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x8A, + 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, + 0x1F, 0x96, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0xA2, 0x1F, 0xA3, + 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, + 0x1F, 0xAE, 0x1F, 0xAF, 0x00, 0x01, 0x01, 0x94, 0x00, 0x24, 0x00, 0x4E, 0x00, 0x56, 0x00, 0x5E, + 0x00, 0x66, 0x00, 0x6E, 0x00, 0x76, 0x00, 0x80, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA4, + 0x00, 0xAE, 0x00, 0xB6, 0x00, 0xC0, 0x00, 0xCA, 0x00, 0xD2, 0x00, 0xDC, 0x00, 0xE4, 0x00, 0xEE, + 0x00, 0xF8, 0x01, 0x00, 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1C, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x38, + 0x01, 0x40, 0x01, 0x4A, 0x01, 0x54, 0x01, 0x5C, 0x01, 0x64, 0x01, 0x6E, 0x01, 0x76, 0x01, 0x80, + 0x01, 0x8A, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, + 0x03, 0x41, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, + 0x03, 0x41, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, + 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB1, + 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, + 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x00, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, + 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, + 0x1F, 0xC3, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x01, + 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xCC, + 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, + 0x1F, 0xCC, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, + 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x43, + 0x03, 0x00, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xF3, + 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, + 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, + 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x00, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, + 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, + 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x01, 0x00, 0x24, 0x1F, 0x32, 0x1F, 0x34, + 0x1F, 0x6A, 0x1F, 0x6C, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x8A, + 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, + 0x1F, 0x96, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0xA2, 0x1F, 0xA3, + 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, + 0x1F, 0xAE, 0x1F, 0xAF, 0x00, 0x01, 0x01, 0x6C, 0x00, 0x20, 0x00, 0x46, 0x00, 0x4E, 0x00, 0x58, + 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7C, 0x00, 0x86, 0x00, 0x8E, 0x00, 0x98, 0x00, 0xA2, + 0x00, 0xAA, 0x00, 0xB4, 0x00, 0xBC, 0x00, 0xC6, 0x00, 0xD0, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEA, + 0x00, 0xF4, 0x00, 0xFE, 0x01, 0x06, 0x01, 0x10, 0x01, 0x18, 0x01, 0x22, 0x01, 0x2C, 0x01, 0x34, + 0x01, 0x3C, 0x01, 0x46, 0x01, 0x4E, 0x01, 0x58, 0x01, 0x62, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43, + 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xB3, + 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, + 0x03, 0xB1, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x40, + 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x43, + 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, + 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, + 0x03, 0xB7, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x43, 0x03, 0x41, + 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, + 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, + 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, + 0x03, 0x97, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, + 0x03, 0x42, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, + 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, + 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, + 0x00, 0x03, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x40, + 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x43, + 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, + 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, + 0x00, 0x01, 0x00, 0x20, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x8A, + 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, + 0x1F, 0x96, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0xA2, 0x1F, 0xA3, + 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, + 0x1F, 0xAE, 0x1F, 0xAF, 0x00, 0x01, 0x01, 0x6E, 0x00, 0x1E, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, + 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, + 0x00, 0xB0, 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6, + 0x01, 0x00, 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E, 0x01, 0x28, 0x01, 0x32, 0x01, 0x3C, 0x01, 0x46, + 0x01, 0x50, 0x01, 0x5A, 0x01, 0x64, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, + 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, + 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, + 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x00, + 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, + 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, + 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, + 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, + 0x03, 0xB7, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, + 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0x97, + 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, + 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, + 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, + 0x03, 0xC9, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45, + 0x03, 0x00, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, + 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, + 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, + 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, + 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, + 0x03, 0x42, 0x00, 0x01, 0x00, 0x1E, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, + 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, + 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0xA2, + 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, + 0x1F, 0xAE, 0x00, 0x01, 0x01, 0x32, 0x00, 0x19, 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, + 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, + 0x00, 0xB0, 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6, + 0x01, 0x00, 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E, 0x01, 0x28, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, + 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, + 0x03, 0xB1, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, + 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, + 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, + 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, + 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, + 0x03, 0xB7, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, + 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, + 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, + 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, + 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, + 0x03, 0xC9, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45, + 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, + 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, + 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, + 0x03, 0x42, 0x03, 0x45, 0x00, 0x01, 0x00, 0x19, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, + 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, + 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, + 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01, 0x01, 0x32, 0x00, 0x19, + 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, + 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE, + 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6, 0x01, 0x00, 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E, + 0x01, 0x28, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, + 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, + 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, + 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, + 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, + 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, + 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, + 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, + 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, + 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, + 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xC9, + 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, + 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, + 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, + 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, + 0x03, 0x01, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x01, 0x00, 0x19, + 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, + 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, + 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, + 0x1F, 0xAE, 0x00, 0x01, 0x01, 0x32, 0x00, 0x19, 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, + 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, + 0x00, 0xB0, 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6, + 0x01, 0x00, 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E, 0x01, 0x28, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, + 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, + 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, + 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, + 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, + 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, + 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, + 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, + 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, + 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, + 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, + 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, + 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, + 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, + 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, + 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, + 0x03, 0x42, 0x03, 0x45, 0x00, 0x01, 0x00, 0x19, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, + 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, + 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, + 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01, 0x00, 0xBA, 0x00, 0x0F, + 0x00, 0x24, 0x00, 0x2E, 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A, + 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, 0x00, 0x04, + 0x03, 0xB1, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x01, + 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, + 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, + 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, + 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, + 0x03, 0xC9, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x01, + 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, + 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, + 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, + 0x03, 0x45, 0x03, 0x42, 0x00, 0x01, 0x00, 0x0F, 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, + 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, + 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01, 0x00, 0xBA, 0x00, 0x0F, 0x00, 0x24, 0x00, 0x2E, + 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, + 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, + 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, + 0x03, 0x91, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x41, + 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, + 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, + 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, + 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, + 0x03, 0xA9, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x40, + 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, + 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, + 0x00, 0x01, 0x00, 0x0F, 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, + 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, + 0x1F, 0xAE, 0x00, 0x01, 0x00, 0xBA, 0x00, 0x0F, 0x00, 0x24, 0x00, 0x2E, 0x00, 0x38, 0x00, 0x42, + 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, + 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, + 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, + 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, + 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, + 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, + 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, + 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, + 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, + 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, + 0x03, 0x01, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x01, 0x00, 0x0F, + 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, + 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01, + 0x00, 0xAE, 0x00, 0x0E, 0x00, 0x22, 0x00, 0x2C, 0x00, 0x36, 0x00, 0x40, 0x00, 0x4A, 0x00, 0x54, + 0x00, 0x5E, 0x00, 0x68, 0x00, 0x72, 0x00, 0x7C, 0x00, 0x86, 0x00, 0x90, 0x00, 0x9A, 0x00, 0xA4, + 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, + 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, + 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, + 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, + 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, + 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, + 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, + 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, + 0x03, 0x41, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x01, 0x00, 0x0E, + 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, + 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x00, 0x01, 0x00, 0xAE, + 0x00, 0x0E, 0x00, 0x22, 0x00, 0x2C, 0x00, 0x36, 0x00, 0x40, 0x00, 0x4A, 0x00, 0x54, 0x00, 0x5E, + 0x00, 0x68, 0x00, 0x72, 0x00, 0x7C, 0x00, 0x86, 0x00, 0x90, 0x00, 0x9A, 0x00, 0xA4, 0x00, 0x04, + 0x03, 0xB1, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x13, + 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, + 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, + 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, + 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x04, + 0x03, 0xC9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x13, + 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, + 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, + 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x01, 0x00, 0x0E, 0x1F, 0x82, + 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, + 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x00, 0x01, 0x00, 0xAE, 0x00, 0x0E, + 0x00, 0x22, 0x00, 0x2C, 0x00, 0x36, 0x00, 0x40, 0x00, 0x4A, 0x00, 0x54, 0x00, 0x5E, 0x00, 0x68, + 0x00, 0x72, 0x00, 0x7C, 0x00, 0x86, 0x00, 0x90, 0x00, 0x9A, 0x00, 0xA4, 0x00, 0x04, 0x03, 0xB1, + 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, + 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, + 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, + 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, + 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, + 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, + 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, + 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, + 0x21, 0x26, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x01, 0x00, 0x0E, 0x1F, 0x82, 0x1F, 0x84, + 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, + 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x00, 0x01, 0x00, 0x96, 0x00, 0x0C, 0x00, 0x1E, + 0x00, 0x28, 0x00, 0x32, 0x00, 0x3C, 0x00, 0x46, 0x00, 0x50, 0x00, 0x5A, 0x00, 0x64, 0x00, 0x6E, + 0x00, 0x78, 0x00, 0x82, 0x00, 0x8C, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, + 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, + 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, + 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, + 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, + 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, + 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, + 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x01, + 0x00, 0x0C, 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, + 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x96, 0x00, 0x0C, + 0x00, 0x1E, 0x00, 0x28, 0x00, 0x32, 0x00, 0x3C, 0x00, 0x46, 0x00, 0x50, 0x00, 0x5A, 0x00, 0x64, + 0x00, 0x6E, 0x00, 0x78, 0x00, 0x82, 0x00, 0x8C, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, + 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, + 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, + 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, + 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, + 0x03, 0x97, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, + 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, + 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, + 0x00, 0x01, 0x00, 0x0C, 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, + 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, + 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, + 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, + 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, + 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, + 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, + 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, + 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, + 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, + 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x01, 0x00, 0x02, + 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, + 0x21, 0x26, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x01, + 0x03, 0x45, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, + 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, + 0x21, 0x26, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, + 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, + 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x01, + 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, + 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, + 0x03, 0x45, 0x03, 0x41, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, + 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, + 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, + 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, + 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, + 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, + 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, + 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, + 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, + 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x01, 0x00, 0x02, + 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x4E, + 0x00, 0x06, 0x00, 0x12, 0x00, 0x1C, 0x00, 0x26, 0x00, 0x30, 0x00, 0x3A, 0x00, 0x44, 0x00, 0x01, + 0x00, 0x04, 0x0A, 0x59, 0x00, 0x02, 0x0A, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x0A, 0x5A, 0x00, 0x02, + 0x0A, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x0A, 0x5B, 0x00, 0x02, 0x0A, 0x3C, 0x00, 0x01, 0x00, 0x04, + 0x0A, 0x5E, 0x00, 0x02, 0x0A, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x0A, 0x33, 0x00, 0x02, 0x0A, 0x3C, + 0x00, 0x01, 0x00, 0x04, 0x0A, 0x36, 0x00, 0x02, 0x0A, 0x3C, 0x00, 0x01, 0x00, 0x06, 0x0A, 0x16, + 0x0A, 0x17, 0x0A, 0x1C, 0x0A, 0x2B, 0x0A, 0x32, 0x0A, 0x38, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x01, 0x00, 0x36, 0x00, 0x06, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, + 0x00, 0x2A, 0x00, 0x30, 0x00, 0x02, 0x0A, 0x32, 0x0A, 0x3C, 0x00, 0x02, 0x0A, 0x38, 0x0A, 0x3C, + 0x00, 0x02, 0x0A, 0x16, 0x0A, 0x3C, 0x00, 0x02, 0x0A, 0x17, 0x0A, 0x3C, 0x00, 0x02, 0x0A, 0x1C, + 0x0A, 0x3C, 0x00, 0x02, 0x0A, 0x2B, 0x0A, 0x3C, 0x00, 0x01, 0x00, 0x06, 0x0A, 0x33, 0x0A, 0x36, + 0x0A, 0x59, 0x0A, 0x5A, 0x0A, 0x5B, 0x0A, 0x5E, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, + 0x00, 0x01, 0x01, 0xB6, 0x00, 0x1A, 0x00, 0x3A, 0x00, 0x54, 0x00, 0x66, 0x00, 0x70, 0x00, 0x7A, + 0x00, 0x84, 0x00, 0x96, 0x00, 0xA0, 0x00, 0xAA, 0x00, 0xBC, 0x00, 0xC6, 0x00, 0xD8, 0x00, 0xE2, + 0x00, 0xEC, 0x00, 0xF6, 0x01, 0x00, 0x01, 0x0A, 0x01, 0x1C, 0x01, 0x26, 0x01, 0x30, 0x01, 0x3A, + 0x01, 0x7C, 0x01, 0x86, 0x01, 0x90, 0x01, 0x9A, 0x01, 0xA4, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, + 0x00, 0x14, 0xFB, 0x2E, 0x00, 0x02, 0x05, 0xB7, 0xFB, 0x2F, 0x00, 0x02, 0x05, 0xB8, 0xFB, 0x30, + 0x00, 0x02, 0x05, 0xBC, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFB, 0x31, 0x00, 0x02, 0x05, 0xBC, + 0xFB, 0x4C, 0x00, 0x02, 0x05, 0xBF, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x32, 0x00, 0x02, 0x05, 0xBC, + 0x00, 0x01, 0x00, 0x04, 0xFB, 0x33, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x34, + 0x00, 0x02, 0x05, 0xBC, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFB, 0x4B, 0x00, 0x02, 0x05, 0xB9, + 0xFB, 0x35, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x36, 0x00, 0x02, 0x05, 0xBC, + 0x00, 0x01, 0x00, 0x04, 0xFB, 0x38, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, + 0xFB, 0x1D, 0x00, 0x02, 0x05, 0xB4, 0xFB, 0x39, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, + 0xFB, 0x3A, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFB, 0x3B, 0x00, 0x02, + 0x05, 0xBC, 0xFB, 0x4D, 0x00, 0x02, 0x05, 0xBF, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x3C, 0x00, 0x02, + 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x3E, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, + 0xFB, 0x40, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x41, 0x00, 0x02, 0x05, 0xBC, + 0x00, 0x01, 0x00, 0x04, 0xFB, 0x43, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, + 0xFB, 0x44, 0x00, 0x02, 0x05, 0xBC, 0xFB, 0x4E, 0x00, 0x02, 0x05, 0xBF, 0x00, 0x01, 0x00, 0x04, + 0xFB, 0x46, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x47, 0x00, 0x02, 0x05, 0xBC, + 0x00, 0x01, 0x00, 0x04, 0xFB, 0x48, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x07, 0x00, 0x10, 0x00, 0x18, + 0x00, 0x20, 0x00, 0x26, 0x00, 0x2E, 0x00, 0x34, 0x00, 0x3C, 0xFB, 0x2C, 0x00, 0x03, 0x05, 0xBC, + 0x05, 0xC1, 0xFB, 0x2D, 0x00, 0x03, 0x05, 0xBC, 0x05, 0xC2, 0xFB, 0x49, 0x00, 0x02, 0x05, 0xBC, + 0xFB, 0x2C, 0x00, 0x03, 0x05, 0xC1, 0x05, 0xBC, 0xFB, 0x2A, 0x00, 0x02, 0x05, 0xC1, 0xFB, 0x2D, + 0x00, 0x03, 0x05, 0xC2, 0x05, 0xBC, 0xFB, 0x2B, 0x00, 0x02, 0x05, 0xC2, 0x00, 0x01, 0x00, 0x04, + 0xFB, 0x4A, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x1F, 0x00, 0x02, 0x05, 0xB7, + 0x00, 0x01, 0x00, 0x04, 0xFB, 0x2C, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x2D, + 0x00, 0x02, 0x05, 0xBC, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFB, 0x2C, 0x00, 0x02, 0x05, 0xC1, + 0xFB, 0x2D, 0x00, 0x02, 0x05, 0xC2, 0x00, 0x01, 0x00, 0x1A, 0x05, 0xD0, 0x05, 0xD1, 0x05, 0xD2, + 0x05, 0xD3, 0x05, 0xD4, 0x05, 0xD5, 0x05, 0xD6, 0x05, 0xD8, 0x05, 0xD9, 0x05, 0xDA, 0x05, 0xDB, + 0x05, 0xDC, 0x05, 0xDE, 0x05, 0xE0, 0x05, 0xE1, 0x05, 0xE3, 0x05, 0xE4, 0x05, 0xE6, 0x05, 0xE7, + 0x05, 0xE8, 0x05, 0xE9, 0x05, 0xEA, 0x05, 0xF2, 0xFB, 0x2A, 0xFB, 0x2B, 0xFB, 0x49, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x01, 0x6C, 0x01, 0x8A, 0x01, 0xAC, 0x00, 0x01, 0x01, 0x16, + 0x00, 0x22, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, + 0x00, 0x74, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, + 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0, 0x00, 0xB6, 0x00, 0xBC, 0x00, 0xC2, 0x00, 0xC8, 0x00, 0xCE, + 0x00, 0xD4, 0x00, 0xDA, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEC, 0x00, 0xF2, 0x00, 0xF8, 0x00, 0xFE, + 0x01, 0x04, 0x01, 0x0A, 0x01, 0x10, 0x00, 0x02, 0x05, 0xD9, 0x05, 0xB4, 0x00, 0x02, 0x05, 0xF2, + 0x05, 0xB7, 0x00, 0x02, 0x05, 0xE9, 0x05, 0xC1, 0x00, 0x02, 0x05, 0xE9, 0x05, 0xC2, 0x00, 0x02, + 0xFB, 0x2A, 0x05, 0xBC, 0x00, 0x02, 0xFB, 0x2B, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xD0, 0x05, 0xB7, + 0x00, 0x02, 0x05, 0xD0, 0x05, 0xB8, 0x00, 0x02, 0x05, 0xD0, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xD1, + 0x05, 0xBC, 0x00, 0x02, 0x05, 0xD2, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xD3, 0x05, 0xBC, 0x00, 0x02, + 0x05, 0xD4, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xD5, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xD6, 0x05, 0xBC, + 0x00, 0x02, 0x05, 0xD8, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xD9, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xDA, + 0x05, 0xBC, 0x00, 0x02, 0x05, 0xDB, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xDC, 0x05, 0xBC, 0x00, 0x02, + 0x05, 0xDE, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xE0, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xE1, 0x05, 0xBC, + 0x00, 0x02, 0x05, 0xE3, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xE4, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xE6, + 0x05, 0xBC, 0x00, 0x02, 0x05, 0xE7, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xE8, 0x05, 0xBC, 0x00, 0x02, + 0x05, 0xE9, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xEA, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xD5, 0x05, 0xB9, + 0x00, 0x02, 0x05, 0xD1, 0x05, 0xBF, 0x00, 0x02, 0x05, 0xDB, 0x05, 0xBF, 0x00, 0x02, 0x05, 0xE4, + 0x05, 0xBF, 0x00, 0x01, 0x00, 0x22, 0xFB, 0x1D, 0xFB, 0x1F, 0xFB, 0x2A, 0xFB, 0x2B, 0xFB, 0x2C, + 0xFB, 0x2D, 0xFB, 0x2E, 0xFB, 0x2F, 0xFB, 0x30, 0xFB, 0x31, 0xFB, 0x32, 0xFB, 0x33, 0xFB, 0x34, + 0xFB, 0x35, 0xFB, 0x36, 0xFB, 0x38, 0xFB, 0x39, 0xFB, 0x3A, 0xFB, 0x3B, 0xFB, 0x3C, 0xFB, 0x3E, + 0xFB, 0x40, 0xFB, 0x41, 0xFB, 0x43, 0xFB, 0x44, 0xFB, 0x46, 0xFB, 0x47, 0xFB, 0x48, 0xFB, 0x49, + 0xFB, 0x4A, 0xFB, 0x4B, 0xFB, 0x4C, 0xFB, 0x4D, 0xFB, 0x4E, 0x00, 0x01, 0x00, 0x16, 0x00, 0x02, + 0x00, 0x0A, 0x00, 0x10, 0x00, 0x02, 0xFB, 0x49, 0x05, 0xC1, 0x00, 0x02, 0xFB, 0x49, 0x05, 0xC2, + 0x00, 0x01, 0x00, 0x02, 0xFB, 0x2C, 0xFB, 0x2D, 0x00, 0x01, 0x00, 0x1A, 0x00, 0x02, 0x00, 0x0A, + 0x00, 0x12, 0x00, 0x03, 0x05, 0xE9, 0x05, 0xBC, 0x05, 0xC1, 0x00, 0x03, 0x05, 0xE9, 0x05, 0xBC, + 0x05, 0xC2, 0x00, 0x01, 0x00, 0x02, 0xFB, 0x2C, 0xFB, 0x2D, 0x00, 0x01, 0x00, 0x1A, 0x00, 0x02, + 0x00, 0x0A, 0x00, 0x12, 0x00, 0x03, 0x05, 0xE9, 0x05, 0xC1, 0x05, 0xBC, 0x00, 0x03, 0x05, 0xE9, + 0x05, 0xC2, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x02, 0xFB, 0x2C, 0xFB, 0x2D, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x01, 0x36, 0x00, 0x16, 0x00, 0x32, 0x00, 0x3C, 0x00, 0x46, + 0x00, 0x50, 0x00, 0x5A, 0x00, 0x64, 0x00, 0x6E, 0x00, 0x78, 0x00, 0x82, 0x00, 0x8C, 0x00, 0x96, + 0x00, 0xA0, 0x00, 0xAA, 0x00, 0xB4, 0x00, 0xBE, 0x00, 0xC8, 0x00, 0xD2, 0x00, 0xE4, 0x00, 0xF6, + 0x01, 0x08, 0x01, 0x1A, 0x01, 0x2C, 0x00, 0x01, 0x00, 0x04, 0x30, 0x94, 0x00, 0x02, 0x30, 0x99, + 0x00, 0x01, 0x00, 0x04, 0x30, 0x4C, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x4E, + 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x50, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, + 0x00, 0x04, 0x30, 0x52, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x54, 0x00, 0x02, + 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x56, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, + 0x30, 0x58, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x5A, 0x00, 0x02, 0x30, 0x99, + 0x00, 0x01, 0x00, 0x04, 0x30, 0x5C, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x5E, + 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x60, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, + 0x00, 0x04, 0x30, 0x62, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x65, 0x00, 0x02, + 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x67, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, + 0x30, 0x69, 0x00, 0x02, 0x30, 0x99, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0x70, 0x00, 0x02, + 0x30, 0x99, 0x30, 0x71, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0x73, + 0x00, 0x02, 0x30, 0x99, 0x30, 0x74, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, + 0x30, 0x76, 0x00, 0x02, 0x30, 0x99, 0x30, 0x77, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, + 0x00, 0x0C, 0x30, 0x79, 0x00, 0x02, 0x30, 0x99, 0x30, 0x7A, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, + 0x00, 0x06, 0x00, 0x0C, 0x30, 0x7C, 0x00, 0x02, 0x30, 0x99, 0x30, 0x7D, 0x00, 0x02, 0x30, 0x9A, + 0x00, 0x01, 0x00, 0x04, 0x30, 0x9E, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x16, 0x30, 0x46, + 0x30, 0x4B, 0x30, 0x4D, 0x30, 0x4F, 0x30, 0x51, 0x30, 0x53, 0x30, 0x55, 0x30, 0x57, 0x30, 0x59, + 0x30, 0x5B, 0x30, 0x5D, 0x30, 0x5F, 0x30, 0x61, 0x30, 0x64, 0x30, 0x66, 0x30, 0x68, 0x30, 0x6F, + 0x30, 0x72, 0x30, 0x75, 0x30, 0x78, 0x30, 0x7B, 0x30, 0x9D, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x01, 0x00, 0xDE, 0x00, 0x1B, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, + 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6C, 0x00, 0x72, 0x00, 0x78, 0x00, 0x7E, + 0x00, 0x84, 0x00, 0x8A, 0x00, 0x90, 0x00, 0x96, 0x00, 0x9C, 0x00, 0xA2, 0x00, 0xA8, 0x00, 0xAE, + 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC0, 0x00, 0xC6, 0x00, 0xCC, 0x00, 0xD2, 0x00, 0xD8, 0x00, 0x02, + 0x30, 0x4B, 0x30, 0x99, 0x00, 0x02, 0x30, 0x4D, 0x30, 0x99, 0x00, 0x02, 0x30, 0x4F, 0x30, 0x99, + 0x00, 0x02, 0x30, 0x51, 0x30, 0x99, 0x00, 0x02, 0x30, 0x53, 0x30, 0x99, 0x00, 0x02, 0x30, 0x55, + 0x30, 0x99, 0x00, 0x02, 0x30, 0x57, 0x30, 0x99, 0x00, 0x02, 0x30, 0x59, 0x30, 0x99, 0x00, 0x02, + 0x30, 0x5B, 0x30, 0x99, 0x00, 0x02, 0x30, 0x5D, 0x30, 0x99, 0x00, 0x02, 0x30, 0x5F, 0x30, 0x99, + 0x00, 0x02, 0x30, 0x61, 0x30, 0x99, 0x00, 0x02, 0x30, 0x64, 0x30, 0x99, 0x00, 0x02, 0x30, 0x66, + 0x30, 0x99, 0x00, 0x02, 0x30, 0x68, 0x30, 0x99, 0x00, 0x02, 0x30, 0x6F, 0x30, 0x99, 0x00, 0x02, + 0x30, 0x6F, 0x30, 0x9A, 0x00, 0x02, 0x30, 0x72, 0x30, 0x99, 0x00, 0x02, 0x30, 0x72, 0x30, 0x9A, + 0x00, 0x02, 0x30, 0x75, 0x30, 0x99, 0x00, 0x02, 0x30, 0x75, 0x30, 0x9A, 0x00, 0x02, 0x30, 0x78, + 0x30, 0x99, 0x00, 0x02, 0x30, 0x78, 0x30, 0x9A, 0x00, 0x02, 0x30, 0x7B, 0x30, 0x99, 0x00, 0x02, + 0x30, 0x7B, 0x30, 0x9A, 0x00, 0x02, 0x30, 0x46, 0x30, 0x99, 0x00, 0x02, 0x30, 0x9D, 0x30, 0x99, + 0x00, 0x01, 0x00, 0x1B, 0x30, 0x4C, 0x30, 0x4E, 0x30, 0x50, 0x30, 0x52, 0x30, 0x54, 0x30, 0x56, + 0x30, 0x58, 0x30, 0x5A, 0x30, 0x5C, 0x30, 0x5E, 0x30, 0x60, 0x30, 0x62, 0x30, 0x65, 0x30, 0x67, + 0x30, 0x69, 0x30, 0x70, 0x30, 0x71, 0x30, 0x73, 0x30, 0x74, 0x30, 0x76, 0x30, 0x77, 0x30, 0x79, + 0x30, 0x7A, 0x30, 0x7C, 0x30, 0x7D, 0x30, 0x94, 0x30, 0x9E, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x01, 0x00, 0x44, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x16, 0x00, 0x3A, 0x00, 0x01, + 0x00, 0x04, 0x0C, 0xC0, 0x00, 0x02, 0x0C, 0xD5, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x12, 0x00, 0x18, + 0x00, 0x1E, 0x0C, 0xCB, 0x00, 0x03, 0x0C, 0xC2, 0x0C, 0xD5, 0x0C, 0xCA, 0x00, 0x02, 0x0C, 0xC2, + 0x0C, 0xC7, 0x00, 0x02, 0x0C, 0xD5, 0x0C, 0xC8, 0x00, 0x02, 0x0C, 0xD6, 0x00, 0x01, 0x00, 0x04, + 0x0C, 0xCB, 0x00, 0x02, 0x0C, 0xD5, 0x00, 0x01, 0x00, 0x03, 0x0C, 0xBF, 0x0C, 0xC6, 0x0C, 0xCA, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x46, 0x00, 0x01, 0x00, 0x2E, 0x00, 0x05, + 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x02, 0x0C, 0xBF, 0x0C, 0xD5, + 0x00, 0x02, 0x0C, 0xC6, 0x0C, 0xD5, 0x00, 0x02, 0x0C, 0xC6, 0x0C, 0xD6, 0x00, 0x02, 0x0C, 0xC6, + 0x0C, 0xC2, 0x00, 0x02, 0x0C, 0xCA, 0x0C, 0xD5, 0x00, 0x01, 0x00, 0x05, 0x0C, 0xC0, 0x0C, 0xC7, + 0x0C, 0xC8, 0x0C, 0xCA, 0x0C, 0xCB, 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, 0x00, 0x08, 0x00, 0x03, + 0x0C, 0xC6, 0x0C, 0xC2, 0x0C, 0xD5, 0x00, 0x01, 0x00, 0x01, 0x0C, 0xCB, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x01, 0x66, 0x00, 0x1A, 0x00, 0x3A, 0x00, 0x44, 0x00, 0x4E, + 0x00, 0x58, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x80, 0x00, 0x8A, 0x00, 0x94, 0x00, 0x9E, + 0x00, 0xA8, 0x00, 0xB2, 0x00, 0xBC, 0x00, 0xC6, 0x00, 0xD0, 0x00, 0xDA, 0x00, 0xEC, 0x00, 0xFE, + 0x01, 0x10, 0x01, 0x22, 0x01, 0x34, 0x01, 0x3E, 0x01, 0x48, 0x01, 0x52, 0x01, 0x5C, 0x00, 0x01, + 0x00, 0x04, 0x30, 0xF4, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xAC, 0x00, 0x02, + 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xAE, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, + 0x30, 0xB0, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xB2, 0x00, 0x02, 0x30, 0x99, + 0x00, 0x01, 0x00, 0x04, 0x30, 0xB4, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xB6, + 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xB8, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, + 0x00, 0x04, 0x30, 0xBA, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xBC, 0x00, 0x02, + 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xBE, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, + 0x30, 0xC0, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xC2, 0x00, 0x02, 0x30, 0x99, + 0x00, 0x01, 0x00, 0x04, 0x30, 0xC5, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xC7, + 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xC9, 0x00, 0x02, 0x30, 0x99, 0x00, 0x02, + 0x00, 0x06, 0x00, 0x0C, 0x30, 0xD0, 0x00, 0x02, 0x30, 0x99, 0x30, 0xD1, 0x00, 0x02, 0x30, 0x9A, + 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0xD3, 0x00, 0x02, 0x30, 0x99, 0x30, 0xD4, 0x00, 0x02, + 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0xD6, 0x00, 0x02, 0x30, 0x99, 0x30, 0xD7, + 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0xD9, 0x00, 0x02, 0x30, 0x99, + 0x30, 0xDA, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0xDC, 0x00, 0x02, + 0x30, 0x99, 0x30, 0xDD, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x01, 0x00, 0x04, 0x30, 0xF7, 0x00, 0x02, + 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xF8, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, + 0x30, 0xF9, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xFA, 0x00, 0x02, 0x30, 0x99, + 0x00, 0x01, 0x00, 0x04, 0x30, 0xFE, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x1A, 0x30, 0xA6, + 0x30, 0xAB, 0x30, 0xAD, 0x30, 0xAF, 0x30, 0xB1, 0x30, 0xB3, 0x30, 0xB5, 0x30, 0xB7, 0x30, 0xB9, + 0x30, 0xBB, 0x30, 0xBD, 0x30, 0xBF, 0x30, 0xC1, 0x30, 0xC4, 0x30, 0xC6, 0x30, 0xC8, 0x30, 0xCF, + 0x30, 0xD2, 0x30, 0xD5, 0x30, 0xD8, 0x30, 0xDB, 0x30, 0xEF, 0x30, 0xF0, 0x30, 0xF1, 0x30, 0xF2, + 0x30, 0xFD, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0xFE, 0x00, 0x1F, + 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, + 0x00, 0x74, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, + 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0, 0x00, 0xB6, 0x00, 0xBC, 0x00, 0xC2, 0x00, 0xC8, 0x00, 0xCE, + 0x00, 0xD4, 0x00, 0xDA, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEC, 0x00, 0xF2, 0x00, 0xF8, 0x00, 0x02, + 0x30, 0xAB, 0x30, 0x99, 0x00, 0x02, 0x30, 0xAD, 0x30, 0x99, 0x00, 0x02, 0x30, 0xAF, 0x30, 0x99, + 0x00, 0x02, 0x30, 0xB1, 0x30, 0x99, 0x00, 0x02, 0x30, 0xB3, 0x30, 0x99, 0x00, 0x02, 0x30, 0xB5, + 0x30, 0x99, 0x00, 0x02, 0x30, 0xB7, 0x30, 0x99, 0x00, 0x02, 0x30, 0xB9, 0x30, 0x99, 0x00, 0x02, + 0x30, 0xBB, 0x30, 0x99, 0x00, 0x02, 0x30, 0xBD, 0x30, 0x99, 0x00, 0x02, 0x30, 0xBF, 0x30, 0x99, + 0x00, 0x02, 0x30, 0xC1, 0x30, 0x99, 0x00, 0x02, 0x30, 0xC4, 0x30, 0x99, 0x00, 0x02, 0x30, 0xC6, + 0x30, 0x99, 0x00, 0x02, 0x30, 0xC8, 0x30, 0x99, 0x00, 0x02, 0x30, 0xCF, 0x30, 0x99, 0x00, 0x02, + 0x30, 0xCF, 0x30, 0x9A, 0x00, 0x02, 0x30, 0xD2, 0x30, 0x99, 0x00, 0x02, 0x30, 0xD2, 0x30, 0x9A, + 0x00, 0x02, 0x30, 0xD5, 0x30, 0x99, 0x00, 0x02, 0x30, 0xD5, 0x30, 0x9A, 0x00, 0x02, 0x30, 0xD8, + 0x30, 0x99, 0x00, 0x02, 0x30, 0xD8, 0x30, 0x9A, 0x00, 0x02, 0x30, 0xDB, 0x30, 0x99, 0x00, 0x02, + 0x30, 0xDB, 0x30, 0x9A, 0x00, 0x02, 0x30, 0xA6, 0x30, 0x99, 0x00, 0x02, 0x30, 0xEF, 0x30, 0x99, + 0x00, 0x02, 0x30, 0xF0, 0x30, 0x99, 0x00, 0x02, 0x30, 0xF1, 0x30, 0x99, 0x00, 0x02, 0x30, 0xF2, + 0x30, 0x99, 0x00, 0x02, 0x30, 0xFD, 0x30, 0x99, 0x00, 0x01, 0x00, 0x1F, 0x30, 0xAC, 0x30, 0xAE, + 0x30, 0xB0, 0x30, 0xB2, 0x30, 0xB4, 0x30, 0xB6, 0x30, 0xB8, 0x30, 0xBA, 0x30, 0xBC, 0x30, 0xBE, + 0x30, 0xC0, 0x30, 0xC2, 0x30, 0xC5, 0x30, 0xC7, 0x30, 0xC9, 0x30, 0xD0, 0x30, 0xD1, 0x30, 0xD3, + 0x30, 0xD4, 0x30, 0xD6, 0x30, 0xD7, 0x30, 0xD9, 0x30, 0xDA, 0x30, 0xDC, 0x30, 0xDD, 0x30, 0xF4, + 0x30, 0xF7, 0x30, 0xF8, 0x30, 0xF9, 0x30, 0xFA, 0x30, 0xFE, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x01, 0x1E, 0x9A, 0x00, 0x89, 0x01, 0x18, 0x02, 0x72, 0x02, 0x8C, 0x02, 0xE6, + 0x03, 0x18, 0x04, 0x3E, 0x04, 0x48, 0x04, 0x8A, 0x04, 0xC4, 0x05, 0x6A, 0x05, 0x74, 0x05, 0xA6, + 0x05, 0xF4, 0x06, 0x16, 0x06, 0x70, 0x08, 0x56, 0x08, 0x70, 0x08, 0xCE, 0x09, 0x42, 0x09, 0x7C, + 0x0B, 0x14, 0x0B, 0x26, 0x0B, 0x68, 0x0B, 0x7A, 0x0B, 0xD4, 0x0C, 0x0E, 0x0D, 0x68, 0x0D, 0x82, + 0x0D, 0xDC, 0x0E, 0x0E, 0x0F, 0x34, 0x0F, 0x3E, 0x0F, 0x80, 0x0F, 0xC2, 0x10, 0x60, 0x10, 0x72, + 0x10, 0xA4, 0x10, 0xF2, 0x11, 0x14, 0x11, 0x6E, 0x13, 0x54, 0x13, 0x6E, 0x13, 0xCC, 0x14, 0x40, + 0x14, 0x82, 0x16, 0x1A, 0x16, 0x2C, 0x16, 0x76, 0x16, 0x88, 0x16, 0xEA, 0x17, 0x24, 0x17, 0x5E, + 0x17, 0x68, 0x17, 0x7A, 0x17, 0x94, 0x17, 0xA6, 0x17, 0xE0, 0x17, 0xF2, 0x17, 0xFC, 0x18, 0x06, + 0x18, 0x40, 0x18, 0x6A, 0x18, 0x74, 0x18, 0x86, 0x18, 0x90, 0x18, 0x9A, 0x18, 0xCC, 0x19, 0x06, + 0x19, 0x10, 0x19, 0x22, 0x19, 0x3C, 0x19, 0x4E, 0x19, 0x88, 0x19, 0x9A, 0x19, 0xA4, 0x19, 0xAE, + 0x19, 0xE8, 0x1A, 0x12, 0x1A, 0x1C, 0x1A, 0x2E, 0x1A, 0x38, 0x1A, 0x42, 0x1A, 0x74, 0x1A, 0xAE, + 0x1A, 0xE8, 0x1A, 0xF2, 0x1A, 0xFC, 0x1B, 0x1E, 0x1B, 0x40, 0x1B, 0x4A, 0x1B, 0x54, 0x1B, 0x7E, + 0x1B, 0xA8, 0x1B, 0xB2, 0x1B, 0xBC, 0x1B, 0xC6, 0x1B, 0xD0, 0x1B, 0xEA, 0x1C, 0x04, 0x1C, 0x0E, + 0x1C, 0x18, 0x1C, 0x22, 0x1C, 0x5C, 0x1C, 0x96, 0x1C, 0xD0, 0x1D, 0x0A, 0x1D, 0x14, 0x1D, 0x1E, + 0x1D, 0x28, 0x1D, 0x32, 0x1D, 0x3C, 0x1D, 0x46, 0x1D, 0x50, 0x1D, 0x5A, 0x1D, 0x64, 0x1D, 0x6E, + 0x1D, 0x78, 0x1D, 0x82, 0x1D, 0x8C, 0x1D, 0x96, 0x1D, 0xA0, 0x1D, 0xAA, 0x1D, 0xB4, 0x1D, 0xBE, + 0x1D, 0xD0, 0x1D, 0xE2, 0x1D, 0xEC, 0x1D, 0xF6, 0x1E, 0x08, 0x1E, 0x1A, 0x1E, 0x24, 0x1E, 0x2E, + 0x1E, 0x38, 0x1E, 0x42, 0x1E, 0x4C, 0x1E, 0x56, 0x1E, 0x88, 0x00, 0x26, 0x00, 0x4E, 0x00, 0x54, + 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, + 0x00, 0x98, 0x00, 0x9E, 0x00, 0xA4, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBC, 0x00, 0xC4, 0x00, 0xCC, + 0x00, 0xD4, 0x00, 0xDC, 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF0, 0x00, 0xF8, 0x00, 0xFE, 0x01, 0x04, + 0x01, 0x0C, 0x01, 0x14, 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, + 0x01, 0x42, 0x01, 0x48, 0x01, 0x4E, 0x01, 0x54, 0x00, 0xC0, 0x00, 0x02, 0x03, 0x00, 0x00, 0xC1, + 0x00, 0x02, 0x03, 0x01, 0x1E, 0xA6, 0x00, 0x03, 0x03, 0x02, 0x03, 0x00, 0x1E, 0xA4, 0x00, 0x03, + 0x03, 0x02, 0x03, 0x01, 0x1E, 0xAA, 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, 0x1E, 0xA8, 0x00, 0x03, + 0x03, 0x02, 0x03, 0x09, 0x1E, 0xAC, 0x00, 0x03, 0x03, 0x02, 0x03, 0x23, 0x1E, 0xA6, 0x00, 0x03, + 0x03, 0x02, 0x03, 0x40, 0x1E, 0xA4, 0x00, 0x03, 0x03, 0x02, 0x03, 0x41, 0x00, 0xC2, 0x00, 0x02, + 0x03, 0x02, 0x00, 0xC3, 0x00, 0x02, 0x03, 0x03, 0x01, 0x00, 0x00, 0x02, 0x03, 0x04, 0x1E, 0xB0, + 0x00, 0x03, 0x03, 0x06, 0x03, 0x00, 0x1E, 0xAE, 0x00, 0x03, 0x03, 0x06, 0x03, 0x01, 0x1E, 0xB4, + 0x00, 0x03, 0x03, 0x06, 0x03, 0x03, 0x1E, 0xB2, 0x00, 0x03, 0x03, 0x06, 0x03, 0x09, 0x1E, 0xB6, + 0x00, 0x03, 0x03, 0x06, 0x03, 0x23, 0x1E, 0xB0, 0x00, 0x03, 0x03, 0x06, 0x03, 0x40, 0x1E, 0xAE, + 0x00, 0x03, 0x03, 0x06, 0x03, 0x41, 0x01, 0x02, 0x00, 0x02, 0x03, 0x06, 0x01, 0xE0, 0x00, 0x03, + 0x03, 0x07, 0x03, 0x04, 0x02, 0x26, 0x00, 0x02, 0x03, 0x07, 0x01, 0xDE, 0x00, 0x03, 0x03, 0x08, + 0x03, 0x04, 0x00, 0xC4, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xA2, 0x00, 0x02, 0x03, 0x09, 0x01, 0xFA, + 0x00, 0x03, 0x03, 0x0A, 0x03, 0x01, 0x01, 0xFA, 0x00, 0x03, 0x03, 0x0A, 0x03, 0x41, 0x00, 0xC5, + 0x00, 0x02, 0x03, 0x0A, 0x01, 0xCD, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x00, 0x00, 0x02, 0x03, 0x0F, + 0x02, 0x02, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xAC, 0x00, 0x03, 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB6, + 0x00, 0x03, 0x03, 0x23, 0x03, 0x06, 0x1E, 0xA0, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x00, 0x00, 0x02, + 0x03, 0x25, 0x01, 0x04, 0x00, 0x02, 0x03, 0x28, 0x00, 0xC0, 0x00, 0x02, 0x03, 0x40, 0x00, 0xC1, + 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x02, 0x00, 0x02, + 0x03, 0x07, 0x1E, 0x04, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x06, 0x00, 0x02, 0x03, 0x31, 0x00, 0x0A, + 0x00, 0x16, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3E, 0x00, 0x46, + 0x00, 0x4C, 0x00, 0x54, 0x1E, 0x08, 0x00, 0x03, 0x03, 0x01, 0x03, 0x27, 0x01, 0x06, 0x00, 0x02, + 0x03, 0x01, 0x01, 0x08, 0x00, 0x02, 0x03, 0x02, 0x01, 0x0A, 0x00, 0x02, 0x03, 0x07, 0x01, 0x0C, + 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x08, 0x00, 0x03, 0x03, 0x27, 0x03, 0x01, 0x1E, 0x08, 0x00, 0x03, + 0x03, 0x27, 0x03, 0x41, 0x00, 0xC7, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x08, 0x00, 0x03, 0x03, 0x41, + 0x03, 0x27, 0x01, 0x06, 0x00, 0x02, 0x03, 0x41, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, + 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x0A, 0x00, 0x02, 0x03, 0x07, 0x01, 0x0E, 0x00, 0x02, + 0x03, 0x0C, 0x1E, 0x0C, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x10, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x12, + 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x0E, 0x00, 0x02, 0x03, 0x31, 0x00, 0x21, 0x00, 0x44, 0x00, 0x4A, + 0x00, 0x50, 0x00, 0x58, 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, + 0x00, 0x8E, 0x00, 0x94, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC2, + 0x00, 0xC8, 0x00, 0xCE, 0x00, 0xD4, 0x00, 0xDA, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEC, 0x00, 0xF4, + 0x00, 0xFA, 0x01, 0x02, 0x01, 0x08, 0x01, 0x0E, 0x01, 0x14, 0x01, 0x1A, 0x01, 0x20, 0x00, 0xC8, + 0x00, 0x02, 0x03, 0x00, 0x00, 0xC9, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xC0, 0x00, 0x03, 0x03, 0x02, + 0x03, 0x00, 0x1E, 0xBE, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xC4, 0x00, 0x03, 0x03, 0x02, + 0x03, 0x03, 0x1E, 0xC2, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xC6, 0x00, 0x03, 0x03, 0x02, + 0x03, 0x23, 0x1E, 0xC0, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xBE, 0x00, 0x03, 0x03, 0x02, + 0x03, 0x41, 0x00, 0xCA, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xBC, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x14, + 0x00, 0x03, 0x03, 0x04, 0x03, 0x00, 0x1E, 0x16, 0x00, 0x03, 0x03, 0x04, 0x03, 0x01, 0x1E, 0x14, + 0x00, 0x03, 0x03, 0x04, 0x03, 0x40, 0x1E, 0x16, 0x00, 0x03, 0x03, 0x04, 0x03, 0x41, 0x01, 0x12, + 0x00, 0x02, 0x03, 0x04, 0x1E, 0x1C, 0x00, 0x03, 0x03, 0x06, 0x03, 0x27, 0x01, 0x14, 0x00, 0x02, + 0x03, 0x06, 0x01, 0x16, 0x00, 0x02, 0x03, 0x07, 0x00, 0xCB, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xBA, + 0x00, 0x02, 0x03, 0x09, 0x01, 0x1A, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x04, 0x00, 0x02, 0x03, 0x0F, + 0x02, 0x06, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xC6, 0x00, 0x03, 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB8, + 0x00, 0x02, 0x03, 0x23, 0x1E, 0x1C, 0x00, 0x03, 0x03, 0x27, 0x03, 0x06, 0x02, 0x28, 0x00, 0x02, + 0x03, 0x27, 0x01, 0x18, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x18, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x1A, + 0x00, 0x02, 0x03, 0x30, 0x00, 0xC8, 0x00, 0x02, 0x03, 0x40, 0x00, 0xC9, 0x00, 0x02, 0x03, 0x41, + 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1E, 0x00, 0x02, 0x03, 0x07, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, + 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x01, 0xF4, 0x00, 0x02, + 0x03, 0x01, 0x01, 0x1C, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x20, 0x00, 0x02, 0x03, 0x04, 0x01, 0x1E, + 0x00, 0x02, 0x03, 0x06, 0x01, 0x20, 0x00, 0x02, 0x03, 0x07, 0x01, 0xE6, 0x00, 0x02, 0x03, 0x0C, + 0x01, 0x22, 0x00, 0x02, 0x03, 0x27, 0x01, 0xF4, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, + 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x01, 0x24, 0x00, 0x02, + 0x03, 0x02, 0x1E, 0x22, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x26, 0x00, 0x02, 0x03, 0x08, 0x02, 0x1E, + 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x24, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x28, 0x00, 0x02, 0x03, 0x27, + 0x1E, 0x2A, 0x00, 0x02, 0x03, 0x2E, 0x00, 0x14, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, + 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6A, 0x00, 0x70, + 0x00, 0x76, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x88, 0x00, 0x8E, 0x00, 0x94, 0x00, 0x9A, 0x00, 0xA0, + 0x00, 0xCC, 0x00, 0x02, 0x03, 0x00, 0x00, 0xCD, 0x00, 0x02, 0x03, 0x01, 0x00, 0xCE, 0x00, 0x02, + 0x03, 0x02, 0x01, 0x28, 0x00, 0x02, 0x03, 0x03, 0x01, 0x2A, 0x00, 0x02, 0x03, 0x04, 0x01, 0x2C, + 0x00, 0x02, 0x03, 0x06, 0x01, 0x30, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x2E, 0x00, 0x03, 0x03, 0x08, + 0x03, 0x01, 0x1E, 0x2E, 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, 0x00, 0xCF, 0x00, 0x02, 0x03, 0x08, + 0x1E, 0xC8, 0x00, 0x02, 0x03, 0x09, 0x01, 0xCF, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x08, 0x00, 0x02, + 0x03, 0x0F, 0x02, 0x0A, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xCA, 0x00, 0x02, 0x03, 0x23, 0x01, 0x2E, + 0x00, 0x02, 0x03, 0x28, 0x1E, 0x2C, 0x00, 0x02, 0x03, 0x30, 0x00, 0xCC, 0x00, 0x02, 0x03, 0x40, + 0x00, 0xCD, 0x00, 0x02, 0x03, 0x41, 0x1E, 0x2E, 0x00, 0x02, 0x03, 0x44, 0x00, 0x01, 0x00, 0x04, + 0x01, 0x34, 0x00, 0x02, 0x03, 0x02, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, + 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x30, 0x00, 0x02, 0x03, 0x01, 0x01, 0xE8, 0x00, 0x02, 0x03, 0x0C, + 0x1E, 0x32, 0x00, 0x02, 0x03, 0x23, 0x01, 0x36, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x34, 0x00, 0x02, + 0x03, 0x31, 0x1E, 0x30, 0x00, 0x02, 0x03, 0x41, 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x22, + 0x00, 0x28, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x01, 0x39, 0x00, 0x02, + 0x03, 0x01, 0x1E, 0x38, 0x00, 0x03, 0x03, 0x04, 0x03, 0x23, 0x01, 0x3D, 0x00, 0x02, 0x03, 0x0C, + 0x1E, 0x38, 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x36, 0x00, 0x02, 0x03, 0x23, 0x01, 0x3B, + 0x00, 0x02, 0x03, 0x27, 0x1E, 0x3C, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x3A, 0x00, 0x02, 0x03, 0x31, + 0x01, 0x39, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, + 0x1E, 0x3E, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x40, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x42, 0x00, 0x02, + 0x03, 0x23, 0x1E, 0x3E, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, + 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, + 0x01, 0xF8, 0x00, 0x02, 0x03, 0x00, 0x01, 0x43, 0x00, 0x02, 0x03, 0x01, 0x00, 0xD1, 0x00, 0x02, + 0x03, 0x03, 0x1E, 0x44, 0x00, 0x02, 0x03, 0x07, 0x01, 0x47, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x46, + 0x00, 0x02, 0x03, 0x23, 0x01, 0x45, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x4A, 0x00, 0x02, 0x03, 0x2D, + 0x1E, 0x48, 0x00, 0x02, 0x03, 0x31, 0x01, 0xF8, 0x00, 0x02, 0x03, 0x40, 0x01, 0x43, 0x00, 0x02, + 0x03, 0x41, 0x00, 0x34, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x78, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8E, + 0x00, 0x96, 0x00, 0x9E, 0x00, 0xA6, 0x00, 0xAE, 0x00, 0xB6, 0x00, 0xBE, 0x00, 0xC4, 0x00, 0xCC, + 0x00, 0xD4, 0x00, 0xDC, 0x00, 0xE4, 0x00, 0xEC, 0x00, 0xF2, 0x00, 0xFA, 0x01, 0x02, 0x01, 0x0A, + 0x01, 0x12, 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x42, + 0x01, 0x4A, 0x01, 0x50, 0x01, 0x56, 0x01, 0x5C, 0x01, 0x62, 0x01, 0x68, 0x01, 0x70, 0x01, 0x78, + 0x01, 0x80, 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA0, 0x01, 0xA6, 0x01, 0xAE, 0x01, 0xB6, + 0x01, 0xBC, 0x01, 0xC4, 0x01, 0xCA, 0x01, 0xD2, 0x01, 0xD8, 0x01, 0xE0, 0x1E, 0xDC, 0x00, 0x03, + 0x03, 0x00, 0x03, 0x1B, 0x00, 0xD2, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x01, + 0x03, 0x1B, 0x00, 0xD3, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xD2, 0x00, 0x03, 0x03, 0x02, 0x03, 0x00, + 0x1E, 0xD0, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xD6, 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, + 0x1E, 0xD4, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xD8, 0x00, 0x03, 0x03, 0x02, 0x03, 0x23, + 0x1E, 0xD2, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xD0, 0x00, 0x03, 0x03, 0x02, 0x03, 0x41, + 0x00, 0xD4, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x4C, 0x00, 0x03, 0x03, 0x03, 0x03, 0x01, 0x02, 0x2C, + 0x00, 0x03, 0x03, 0x03, 0x03, 0x04, 0x1E, 0x4E, 0x00, 0x03, 0x03, 0x03, 0x03, 0x08, 0x1E, 0xE0, + 0x00, 0x03, 0x03, 0x03, 0x03, 0x1B, 0x1E, 0x4C, 0x00, 0x03, 0x03, 0x03, 0x03, 0x41, 0x00, 0xD5, + 0x00, 0x02, 0x03, 0x03, 0x1E, 0x50, 0x00, 0x03, 0x03, 0x04, 0x03, 0x00, 0x1E, 0x52, 0x00, 0x03, + 0x03, 0x04, 0x03, 0x01, 0x01, 0xEC, 0x00, 0x03, 0x03, 0x04, 0x03, 0x28, 0x1E, 0x50, 0x00, 0x03, + 0x03, 0x04, 0x03, 0x40, 0x1E, 0x52, 0x00, 0x03, 0x03, 0x04, 0x03, 0x41, 0x01, 0x4C, 0x00, 0x02, + 0x03, 0x04, 0x01, 0x4E, 0x00, 0x02, 0x03, 0x06, 0x02, 0x30, 0x00, 0x03, 0x03, 0x07, 0x03, 0x04, + 0x02, 0x2E, 0x00, 0x02, 0x03, 0x07, 0x02, 0x2A, 0x00, 0x03, 0x03, 0x08, 0x03, 0x04, 0x00, 0xD6, + 0x00, 0x02, 0x03, 0x08, 0x1E, 0xDE, 0x00, 0x03, 0x03, 0x09, 0x03, 0x1B, 0x1E, 0xCE, 0x00, 0x02, + 0x03, 0x09, 0x01, 0x50, 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD1, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x0C, + 0x00, 0x02, 0x03, 0x0F, 0x02, 0x0E, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xDC, 0x00, 0x03, 0x03, 0x1B, + 0x03, 0x00, 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01, 0x1E, 0xE0, 0x00, 0x03, 0x03, 0x1B, + 0x03, 0x03, 0x1E, 0xDE, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09, 0x1E, 0xE2, 0x00, 0x03, 0x03, 0x1B, + 0x03, 0x23, 0x1E, 0xDC, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40, 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x1B, + 0x03, 0x41, 0x01, 0xA0, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xD8, 0x00, 0x03, 0x03, 0x23, 0x03, 0x02, + 0x1E, 0xE2, 0x00, 0x03, 0x03, 0x23, 0x03, 0x1B, 0x1E, 0xCC, 0x00, 0x02, 0x03, 0x23, 0x01, 0xEC, + 0x00, 0x03, 0x03, 0x28, 0x03, 0x04, 0x01, 0xEA, 0x00, 0x02, 0x03, 0x28, 0x1E, 0xDC, 0x00, 0x03, + 0x03, 0x40, 0x03, 0x1B, 0x00, 0xD2, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x41, + 0x03, 0x1B, 0x00, 0xD3, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, + 0x1E, 0x54, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x56, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x54, 0x00, 0x02, + 0x03, 0x41, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, + 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x01, 0x54, 0x00, 0x02, 0x03, 0x01, + 0x1E, 0x5C, 0x00, 0x03, 0x03, 0x04, 0x03, 0x23, 0x1E, 0x58, 0x00, 0x02, 0x03, 0x07, 0x01, 0x58, + 0x00, 0x02, 0x03, 0x0C, 0x02, 0x10, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x12, 0x00, 0x02, 0x03, 0x11, + 0x1E, 0x5C, 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x5A, 0x00, 0x02, 0x03, 0x23, 0x01, 0x56, + 0x00, 0x02, 0x03, 0x27, 0x1E, 0x5E, 0x00, 0x02, 0x03, 0x31, 0x01, 0x54, 0x00, 0x02, 0x03, 0x41, + 0x00, 0x0D, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, + 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6E, 0x1E, 0x64, 0x00, 0x03, + 0x03, 0x01, 0x03, 0x07, 0x01, 0x5A, 0x00, 0x02, 0x03, 0x01, 0x01, 0x5C, 0x00, 0x02, 0x03, 0x02, + 0x1E, 0x68, 0x00, 0x03, 0x03, 0x07, 0x03, 0x23, 0x1E, 0x60, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x66, + 0x00, 0x03, 0x03, 0x0C, 0x03, 0x07, 0x01, 0x60, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x68, 0x00, 0x03, + 0x03, 0x23, 0x03, 0x07, 0x1E, 0x62, 0x00, 0x02, 0x03, 0x23, 0x02, 0x18, 0x00, 0x02, 0x03, 0x26, + 0x01, 0x5E, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x64, 0x00, 0x03, 0x03, 0x41, 0x03, 0x07, 0x01, 0x5A, + 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, + 0x00, 0x2E, 0x00, 0x34, 0x1E, 0x6A, 0x00, 0x02, 0x03, 0x07, 0x01, 0x64, 0x00, 0x02, 0x03, 0x0C, + 0x1E, 0x6C, 0x00, 0x02, 0x03, 0x23, 0x02, 0x1A, 0x00, 0x02, 0x03, 0x26, 0x01, 0x62, 0x00, 0x02, + 0x03, 0x27, 0x1E, 0x70, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x6E, 0x00, 0x02, 0x03, 0x31, 0x00, 0x2D, + 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x78, 0x00, 0x7E, 0x00, 0x86, 0x00, 0x8E, + 0x00, 0x96, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, + 0x00, 0xD0, 0x00, 0xD8, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEE, 0x00, 0xF4, 0x00, 0xFA, 0x01, 0x00, + 0x01, 0x06, 0x01, 0x0C, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x22, 0x01, 0x2A, 0x01, 0x32, 0x01, 0x3A, + 0x01, 0x42, 0x01, 0x4A, 0x01, 0x50, 0x01, 0x58, 0x01, 0x5E, 0x01, 0x64, 0x01, 0x6A, 0x01, 0x70, + 0x01, 0x76, 0x01, 0x7E, 0x01, 0x84, 0x01, 0x8C, 0x01, 0x92, 0x1E, 0xEA, 0x00, 0x03, 0x03, 0x00, + 0x03, 0x1B, 0x00, 0xD9, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE8, 0x00, 0x03, 0x03, 0x01, 0x03, 0x1B, + 0x00, 0xDA, 0x00, 0x02, 0x03, 0x01, 0x00, 0xDB, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x78, 0x00, 0x03, + 0x03, 0x03, 0x03, 0x01, 0x1E, 0xEE, 0x00, 0x03, 0x03, 0x03, 0x03, 0x1B, 0x1E, 0x78, 0x00, 0x03, + 0x03, 0x03, 0x03, 0x41, 0x01, 0x68, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x7A, 0x00, 0x03, 0x03, 0x04, + 0x03, 0x08, 0x01, 0x6A, 0x00, 0x02, 0x03, 0x04, 0x01, 0x6C, 0x00, 0x02, 0x03, 0x06, 0x01, 0xDB, + 0x00, 0x03, 0x03, 0x08, 0x03, 0x00, 0x01, 0xD7, 0x00, 0x03, 0x03, 0x08, 0x03, 0x01, 0x01, 0xD5, + 0x00, 0x03, 0x03, 0x08, 0x03, 0x04, 0x01, 0xD9, 0x00, 0x03, 0x03, 0x08, 0x03, 0x0C, 0x01, 0xDB, + 0x00, 0x03, 0x03, 0x08, 0x03, 0x40, 0x01, 0xD7, 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, 0x00, 0xDC, + 0x00, 0x02, 0x03, 0x08, 0x1E, 0xEC, 0x00, 0x03, 0x03, 0x09, 0x03, 0x1B, 0x1E, 0xE6, 0x00, 0x02, + 0x03, 0x09, 0x01, 0x6E, 0x00, 0x02, 0x03, 0x0A, 0x01, 0x70, 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD3, + 0x00, 0x02, 0x03, 0x0C, 0x02, 0x14, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x16, 0x00, 0x02, 0x03, 0x11, + 0x1E, 0xEA, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x00, 0x1E, 0xE8, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01, + 0x1E, 0xEE, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x03, 0x1E, 0xEC, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09, + 0x1E, 0xF0, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x23, 0x1E, 0xEA, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40, + 0x1E, 0xE8, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x41, 0x01, 0xAF, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xF0, + 0x00, 0x03, 0x03, 0x23, 0x03, 0x1B, 0x1E, 0xE4, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x72, 0x00, 0x02, + 0x03, 0x24, 0x01, 0x72, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x76, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x74, + 0x00, 0x02, 0x03, 0x30, 0x1E, 0xEA, 0x00, 0x03, 0x03, 0x40, 0x03, 0x1B, 0x00, 0xD9, 0x00, 0x02, + 0x03, 0x40, 0x1E, 0xE8, 0x00, 0x03, 0x03, 0x41, 0x03, 0x1B, 0x00, 0xDA, 0x00, 0x02, 0x03, 0x41, + 0x01, 0xD7, 0x00, 0x02, 0x03, 0x44, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x7C, 0x00, 0x02, + 0x03, 0x03, 0x1E, 0x7E, 0x00, 0x02, 0x03, 0x23, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, + 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x1E, 0x80, 0x00, 0x02, 0x03, 0x00, + 0x1E, 0x82, 0x00, 0x02, 0x03, 0x01, 0x01, 0x74, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x86, 0x00, 0x02, + 0x03, 0x07, 0x1E, 0x84, 0x00, 0x02, 0x03, 0x08, 0x1E, 0x88, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x80, + 0x00, 0x02, 0x03, 0x40, 0x1E, 0x82, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, + 0x1E, 0x8A, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x8C, 0x00, 0x02, 0x03, 0x08, 0x00, 0x0B, 0x00, 0x18, + 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, + 0x00, 0x4E, 0x00, 0x54, 0x1E, 0xF2, 0x00, 0x02, 0x03, 0x00, 0x00, 0xDD, 0x00, 0x02, 0x03, 0x01, + 0x01, 0x76, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xF8, 0x00, 0x02, 0x03, 0x03, 0x02, 0x32, 0x00, 0x02, + 0x03, 0x04, 0x1E, 0x8E, 0x00, 0x02, 0x03, 0x07, 0x01, 0x78, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xF6, + 0x00, 0x02, 0x03, 0x09, 0x1E, 0xF4, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xF2, 0x00, 0x02, 0x03, 0x40, + 0x00, 0xDD, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, + 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x01, 0x79, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x90, 0x00, 0x02, + 0x03, 0x02, 0x01, 0x7B, 0x00, 0x02, 0x03, 0x07, 0x01, 0x7D, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x92, + 0x00, 0x02, 0x03, 0x23, 0x1E, 0x94, 0x00, 0x02, 0x03, 0x31, 0x01, 0x79, 0x00, 0x02, 0x03, 0x41, + 0x00, 0x26, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, + 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, 0x00, 0xA4, 0x00, 0xAC, 0x00, 0xB4, + 0x00, 0xBC, 0x00, 0xC4, 0x00, 0xCC, 0x00, 0xD4, 0x00, 0xDC, 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF0, + 0x00, 0xF8, 0x00, 0xFE, 0x01, 0x04, 0x01, 0x0C, 0x01, 0x14, 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, + 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x42, 0x01, 0x48, 0x01, 0x4E, 0x01, 0x54, 0x00, 0xE0, + 0x00, 0x02, 0x03, 0x00, 0x00, 0xE1, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xA7, 0x00, 0x03, 0x03, 0x02, + 0x03, 0x00, 0x1E, 0xA5, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xAB, 0x00, 0x03, 0x03, 0x02, + 0x03, 0x03, 0x1E, 0xA9, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xAD, 0x00, 0x03, 0x03, 0x02, + 0x03, 0x23, 0x1E, 0xA7, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xA5, 0x00, 0x03, 0x03, 0x02, + 0x03, 0x41, 0x00, 0xE2, 0x00, 0x02, 0x03, 0x02, 0x00, 0xE3, 0x00, 0x02, 0x03, 0x03, 0x01, 0x01, + 0x00, 0x02, 0x03, 0x04, 0x1E, 0xB1, 0x00, 0x03, 0x03, 0x06, 0x03, 0x00, 0x1E, 0xAF, 0x00, 0x03, + 0x03, 0x06, 0x03, 0x01, 0x1E, 0xB5, 0x00, 0x03, 0x03, 0x06, 0x03, 0x03, 0x1E, 0xB3, 0x00, 0x03, + 0x03, 0x06, 0x03, 0x09, 0x1E, 0xB7, 0x00, 0x03, 0x03, 0x06, 0x03, 0x23, 0x1E, 0xB1, 0x00, 0x03, + 0x03, 0x06, 0x03, 0x40, 0x1E, 0xAF, 0x00, 0x03, 0x03, 0x06, 0x03, 0x41, 0x01, 0x03, 0x00, 0x02, + 0x03, 0x06, 0x01, 0xE1, 0x00, 0x03, 0x03, 0x07, 0x03, 0x04, 0x02, 0x27, 0x00, 0x02, 0x03, 0x07, + 0x01, 0xDF, 0x00, 0x03, 0x03, 0x08, 0x03, 0x04, 0x00, 0xE4, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xA3, + 0x00, 0x02, 0x03, 0x09, 0x01, 0xFB, 0x00, 0x03, 0x03, 0x0A, 0x03, 0x01, 0x01, 0xFB, 0x00, 0x03, + 0x03, 0x0A, 0x03, 0x41, 0x00, 0xE5, 0x00, 0x02, 0x03, 0x0A, 0x01, 0xCE, 0x00, 0x02, 0x03, 0x0C, + 0x02, 0x01, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x03, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xAD, 0x00, 0x03, + 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB7, 0x00, 0x03, 0x03, 0x23, 0x03, 0x06, 0x1E, 0xA1, 0x00, 0x02, + 0x03, 0x23, 0x1E, 0x01, 0x00, 0x02, 0x03, 0x25, 0x01, 0x05, 0x00, 0x02, 0x03, 0x28, 0x00, 0xE0, + 0x00, 0x02, 0x03, 0x40, 0x00, 0xE1, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, + 0x00, 0x14, 0x1E, 0x03, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x05, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x07, + 0x00, 0x02, 0x03, 0x31, 0x00, 0x0A, 0x00, 0x16, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, + 0x00, 0x36, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x1E, 0x09, 0x00, 0x03, 0x03, 0x01, + 0x03, 0x27, 0x01, 0x07, 0x00, 0x02, 0x03, 0x01, 0x01, 0x09, 0x00, 0x02, 0x03, 0x02, 0x01, 0x0B, + 0x00, 0x02, 0x03, 0x07, 0x01, 0x0D, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x09, 0x00, 0x03, 0x03, 0x27, + 0x03, 0x01, 0x1E, 0x09, 0x00, 0x03, 0x03, 0x27, 0x03, 0x41, 0x00, 0xE7, 0x00, 0x02, 0x03, 0x27, + 0x1E, 0x09, 0x00, 0x03, 0x03, 0x41, 0x03, 0x27, 0x01, 0x07, 0x00, 0x02, 0x03, 0x41, 0x00, 0x06, + 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x0B, 0x00, 0x02, + 0x03, 0x07, 0x01, 0x0F, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x0D, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x11, + 0x00, 0x02, 0x03, 0x27, 0x1E, 0x13, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x0F, 0x00, 0x02, 0x03, 0x31, + 0x00, 0x21, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x58, 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, + 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x8E, 0x00, 0x94, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAC, + 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xC8, 0x00, 0xCE, 0x00, 0xD4, 0x00, 0xDA, 0x00, 0xE0, + 0x00, 0xE6, 0x00, 0xEC, 0x00, 0xF4, 0x00, 0xFA, 0x01, 0x02, 0x01, 0x08, 0x01, 0x0E, 0x01, 0x14, + 0x01, 0x1A, 0x01, 0x20, 0x00, 0xE8, 0x00, 0x02, 0x03, 0x00, 0x00, 0xE9, 0x00, 0x02, 0x03, 0x01, + 0x1E, 0xC1, 0x00, 0x03, 0x03, 0x02, 0x03, 0x00, 0x1E, 0xBF, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, + 0x1E, 0xC5, 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, 0x1E, 0xC3, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, + 0x1E, 0xC7, 0x00, 0x03, 0x03, 0x02, 0x03, 0x23, 0x1E, 0xC1, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, + 0x1E, 0xBF, 0x00, 0x03, 0x03, 0x02, 0x03, 0x41, 0x00, 0xEA, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xBD, + 0x00, 0x02, 0x03, 0x03, 0x1E, 0x15, 0x00, 0x03, 0x03, 0x04, 0x03, 0x00, 0x1E, 0x17, 0x00, 0x03, + 0x03, 0x04, 0x03, 0x01, 0x1E, 0x15, 0x00, 0x03, 0x03, 0x04, 0x03, 0x40, 0x1E, 0x17, 0x00, 0x03, + 0x03, 0x04, 0x03, 0x41, 0x01, 0x13, 0x00, 0x02, 0x03, 0x04, 0x1E, 0x1D, 0x00, 0x03, 0x03, 0x06, + 0x03, 0x27, 0x01, 0x15, 0x00, 0x02, 0x03, 0x06, 0x01, 0x17, 0x00, 0x02, 0x03, 0x07, 0x00, 0xEB, + 0x00, 0x02, 0x03, 0x08, 0x1E, 0xBB, 0x00, 0x02, 0x03, 0x09, 0x01, 0x1B, 0x00, 0x02, 0x03, 0x0C, + 0x02, 0x05, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x07, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xC7, 0x00, 0x03, + 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB9, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x1D, 0x00, 0x03, 0x03, 0x27, + 0x03, 0x06, 0x02, 0x29, 0x00, 0x02, 0x03, 0x27, 0x01, 0x19, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x19, + 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x1B, 0x00, 0x02, 0x03, 0x30, 0x00, 0xE8, 0x00, 0x02, 0x03, 0x40, + 0x00, 0xE9, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1F, 0x00, 0x02, 0x03, 0x07, + 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, + 0x00, 0x3C, 0x01, 0xF5, 0x00, 0x02, 0x03, 0x01, 0x01, 0x1D, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x21, + 0x00, 0x02, 0x03, 0x04, 0x01, 0x1F, 0x00, 0x02, 0x03, 0x06, 0x01, 0x21, 0x00, 0x02, 0x03, 0x07, + 0x01, 0xE7, 0x00, 0x02, 0x03, 0x0C, 0x01, 0x23, 0x00, 0x02, 0x03, 0x27, 0x01, 0xF5, 0x00, 0x02, + 0x03, 0x41, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, + 0x00, 0x36, 0x00, 0x3C, 0x01, 0x25, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x23, 0x00, 0x02, 0x03, 0x07, + 0x1E, 0x27, 0x00, 0x02, 0x03, 0x08, 0x02, 0x1F, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x25, 0x00, 0x02, + 0x03, 0x23, 0x1E, 0x29, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x2B, 0x00, 0x02, 0x03, 0x2E, 0x1E, 0x96, + 0x00, 0x02, 0x03, 0x31, 0x00, 0x13, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, + 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74, + 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0x00, 0x92, 0x00, 0x98, 0x00, 0xEC, 0x00, 0x02, + 0x03, 0x00, 0x00, 0xED, 0x00, 0x02, 0x03, 0x01, 0x00, 0xEE, 0x00, 0x02, 0x03, 0x02, 0x01, 0x29, + 0x00, 0x02, 0x03, 0x03, 0x01, 0x2B, 0x00, 0x02, 0x03, 0x04, 0x01, 0x2D, 0x00, 0x02, 0x03, 0x06, + 0x1E, 0x2F, 0x00, 0x03, 0x03, 0x08, 0x03, 0x01, 0x1E, 0x2F, 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, + 0x00, 0xEF, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xC9, 0x00, 0x02, 0x03, 0x09, 0x01, 0xD0, 0x00, 0x02, + 0x03, 0x0C, 0x02, 0x09, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x0B, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xCB, + 0x00, 0x02, 0x03, 0x23, 0x01, 0x2F, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x2D, 0x00, 0x02, 0x03, 0x30, + 0x00, 0xEC, 0x00, 0x02, 0x03, 0x40, 0x00, 0xED, 0x00, 0x02, 0x03, 0x41, 0x1E, 0x2F, 0x00, 0x02, + 0x03, 0x44, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0x35, 0x00, 0x02, 0x03, 0x02, 0x01, 0xF0, + 0x00, 0x02, 0x03, 0x0C, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, + 0x00, 0x2C, 0x1E, 0x31, 0x00, 0x02, 0x03, 0x01, 0x01, 0xE9, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x33, + 0x00, 0x02, 0x03, 0x23, 0x01, 0x37, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x35, 0x00, 0x02, 0x03, 0x31, + 0x1E, 0x31, 0x00, 0x02, 0x03, 0x41, 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x22, 0x00, 0x28, + 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x01, 0x3A, 0x00, 0x02, 0x03, 0x01, + 0x1E, 0x39, 0x00, 0x03, 0x03, 0x04, 0x03, 0x23, 0x01, 0x3E, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x39, + 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x37, 0x00, 0x02, 0x03, 0x23, 0x01, 0x3C, 0x00, 0x02, + 0x03, 0x27, 0x1E, 0x3D, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x3B, 0x00, 0x02, 0x03, 0x31, 0x01, 0x3A, + 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x1E, 0x3F, + 0x00, 0x02, 0x03, 0x01, 0x1E, 0x41, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x43, 0x00, 0x02, 0x03, 0x23, + 0x1E, 0x3F, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, + 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x01, 0xF9, + 0x00, 0x02, 0x03, 0x00, 0x01, 0x44, 0x00, 0x02, 0x03, 0x01, 0x00, 0xF1, 0x00, 0x02, 0x03, 0x03, + 0x1E, 0x45, 0x00, 0x02, 0x03, 0x07, 0x01, 0x48, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x47, 0x00, 0x02, + 0x03, 0x23, 0x01, 0x46, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x4B, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x49, + 0x00, 0x02, 0x03, 0x31, 0x01, 0xF9, 0x00, 0x02, 0x03, 0x40, 0x01, 0x44, 0x00, 0x02, 0x03, 0x41, + 0x00, 0x34, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x78, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8E, 0x00, 0x96, + 0x00, 0x9E, 0x00, 0xA6, 0x00, 0xAE, 0x00, 0xB6, 0x00, 0xBE, 0x00, 0xC4, 0x00, 0xCC, 0x00, 0xD4, + 0x00, 0xDC, 0x00, 0xE4, 0x00, 0xEC, 0x00, 0xF2, 0x00, 0xFA, 0x01, 0x02, 0x01, 0x0A, 0x01, 0x12, + 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x42, 0x01, 0x4A, + 0x01, 0x50, 0x01, 0x56, 0x01, 0x5C, 0x01, 0x62, 0x01, 0x68, 0x01, 0x70, 0x01, 0x78, 0x01, 0x80, + 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA0, 0x01, 0xA6, 0x01, 0xAE, 0x01, 0xB6, 0x01, 0xBC, + 0x01, 0xC4, 0x01, 0xCA, 0x01, 0xD2, 0x01, 0xD8, 0x01, 0xE0, 0x1E, 0xDD, 0x00, 0x03, 0x03, 0x00, + 0x03, 0x1B, 0x00, 0xF2, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xDB, 0x00, 0x03, 0x03, 0x01, 0x03, 0x1B, + 0x00, 0xF3, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xD3, 0x00, 0x03, 0x03, 0x02, 0x03, 0x00, 0x1E, 0xD1, + 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xD7, 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, 0x1E, 0xD5, + 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xD9, 0x00, 0x03, 0x03, 0x02, 0x03, 0x23, 0x1E, 0xD3, + 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xD1, 0x00, 0x03, 0x03, 0x02, 0x03, 0x41, 0x00, 0xF4, + 0x00, 0x02, 0x03, 0x02, 0x1E, 0x4D, 0x00, 0x03, 0x03, 0x03, 0x03, 0x01, 0x02, 0x2D, 0x00, 0x03, + 0x03, 0x03, 0x03, 0x04, 0x1E, 0x4F, 0x00, 0x03, 0x03, 0x03, 0x03, 0x08, 0x1E, 0xE1, 0x00, 0x03, + 0x03, 0x03, 0x03, 0x1B, 0x1E, 0x4D, 0x00, 0x03, 0x03, 0x03, 0x03, 0x41, 0x00, 0xF5, 0x00, 0x02, + 0x03, 0x03, 0x1E, 0x51, 0x00, 0x03, 0x03, 0x04, 0x03, 0x00, 0x1E, 0x53, 0x00, 0x03, 0x03, 0x04, + 0x03, 0x01, 0x01, 0xED, 0x00, 0x03, 0x03, 0x04, 0x03, 0x28, 0x1E, 0x51, 0x00, 0x03, 0x03, 0x04, + 0x03, 0x40, 0x1E, 0x53, 0x00, 0x03, 0x03, 0x04, 0x03, 0x41, 0x01, 0x4D, 0x00, 0x02, 0x03, 0x04, + 0x01, 0x4F, 0x00, 0x02, 0x03, 0x06, 0x02, 0x31, 0x00, 0x03, 0x03, 0x07, 0x03, 0x04, 0x02, 0x2F, + 0x00, 0x02, 0x03, 0x07, 0x02, 0x2B, 0x00, 0x03, 0x03, 0x08, 0x03, 0x04, 0x00, 0xF6, 0x00, 0x02, + 0x03, 0x08, 0x1E, 0xDF, 0x00, 0x03, 0x03, 0x09, 0x03, 0x1B, 0x1E, 0xCF, 0x00, 0x02, 0x03, 0x09, + 0x01, 0x51, 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD2, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x0D, 0x00, 0x02, + 0x03, 0x0F, 0x02, 0x0F, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xDD, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x00, + 0x1E, 0xDB, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01, 0x1E, 0xE1, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x03, + 0x1E, 0xDF, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09, 0x1E, 0xE3, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x23, + 0x1E, 0xDD, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40, 0x1E, 0xDB, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x41, + 0x01, 0xA1, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xD9, 0x00, 0x03, 0x03, 0x23, 0x03, 0x02, 0x1E, 0xE3, + 0x00, 0x03, 0x03, 0x23, 0x03, 0x1B, 0x1E, 0xCD, 0x00, 0x02, 0x03, 0x23, 0x01, 0xED, 0x00, 0x03, + 0x03, 0x28, 0x03, 0x04, 0x01, 0xEB, 0x00, 0x02, 0x03, 0x28, 0x1E, 0xDD, 0x00, 0x03, 0x03, 0x40, + 0x03, 0x1B, 0x00, 0xF2, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xDB, 0x00, 0x03, 0x03, 0x41, 0x03, 0x1B, + 0x00, 0xF3, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x55, + 0x00, 0x02, 0x03, 0x01, 0x1E, 0x57, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x55, 0x00, 0x02, 0x03, 0x41, + 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, + 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x01, 0x55, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x5D, + 0x00, 0x03, 0x03, 0x04, 0x03, 0x23, 0x1E, 0x59, 0x00, 0x02, 0x03, 0x07, 0x01, 0x59, 0x00, 0x02, + 0x03, 0x0C, 0x02, 0x11, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x13, 0x00, 0x02, 0x03, 0x11, 0x1E, 0x5D, + 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x5B, 0x00, 0x02, 0x03, 0x23, 0x01, 0x57, 0x00, 0x02, + 0x03, 0x27, 0x1E, 0x5F, 0x00, 0x02, 0x03, 0x31, 0x01, 0x55, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0D, + 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, + 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6E, 0x1E, 0x65, 0x00, 0x03, 0x03, 0x01, + 0x03, 0x07, 0x01, 0x5B, 0x00, 0x02, 0x03, 0x01, 0x01, 0x5D, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x69, + 0x00, 0x03, 0x03, 0x07, 0x03, 0x23, 0x1E, 0x61, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x67, 0x00, 0x03, + 0x03, 0x0C, 0x03, 0x07, 0x01, 0x61, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x69, 0x00, 0x03, 0x03, 0x23, + 0x03, 0x07, 0x1E, 0x63, 0x00, 0x02, 0x03, 0x23, 0x02, 0x19, 0x00, 0x02, 0x03, 0x26, 0x01, 0x5F, + 0x00, 0x02, 0x03, 0x27, 0x1E, 0x65, 0x00, 0x03, 0x03, 0x41, 0x03, 0x07, 0x01, 0x5B, 0x00, 0x02, + 0x03, 0x41, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, + 0x00, 0x36, 0x00, 0x3C, 0x1E, 0x6B, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x97, 0x00, 0x02, 0x03, 0x08, + 0x01, 0x65, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x6D, 0x00, 0x02, 0x03, 0x23, 0x02, 0x1B, 0x00, 0x02, + 0x03, 0x26, 0x01, 0x63, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x71, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x6F, + 0x00, 0x02, 0x03, 0x31, 0x00, 0x2D, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x78, + 0x00, 0x7E, 0x00, 0x86, 0x00, 0x8E, 0x00, 0x96, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0, + 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, 0x00, 0xD0, 0x00, 0xD8, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEE, + 0x00, 0xF4, 0x00, 0xFA, 0x01, 0x00, 0x01, 0x06, 0x01, 0x0C, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x22, + 0x01, 0x2A, 0x01, 0x32, 0x01, 0x3A, 0x01, 0x42, 0x01, 0x4A, 0x01, 0x50, 0x01, 0x58, 0x01, 0x5E, + 0x01, 0x64, 0x01, 0x6A, 0x01, 0x70, 0x01, 0x76, 0x01, 0x7E, 0x01, 0x84, 0x01, 0x8C, 0x01, 0x92, + 0x1E, 0xEB, 0x00, 0x03, 0x03, 0x00, 0x03, 0x1B, 0x00, 0xF9, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE9, + 0x00, 0x03, 0x03, 0x01, 0x03, 0x1B, 0x00, 0xFA, 0x00, 0x02, 0x03, 0x01, 0x00, 0xFB, 0x00, 0x02, + 0x03, 0x02, 0x1E, 0x79, 0x00, 0x03, 0x03, 0x03, 0x03, 0x01, 0x1E, 0xEF, 0x00, 0x03, 0x03, 0x03, + 0x03, 0x1B, 0x1E, 0x79, 0x00, 0x03, 0x03, 0x03, 0x03, 0x41, 0x01, 0x69, 0x00, 0x02, 0x03, 0x03, + 0x1E, 0x7B, 0x00, 0x03, 0x03, 0x04, 0x03, 0x08, 0x01, 0x6B, 0x00, 0x02, 0x03, 0x04, 0x01, 0x6D, + 0x00, 0x02, 0x03, 0x06, 0x01, 0xDC, 0x00, 0x03, 0x03, 0x08, 0x03, 0x00, 0x01, 0xD8, 0x00, 0x03, + 0x03, 0x08, 0x03, 0x01, 0x01, 0xD6, 0x00, 0x03, 0x03, 0x08, 0x03, 0x04, 0x01, 0xDA, 0x00, 0x03, + 0x03, 0x08, 0x03, 0x0C, 0x01, 0xDC, 0x00, 0x03, 0x03, 0x08, 0x03, 0x40, 0x01, 0xD8, 0x00, 0x03, + 0x03, 0x08, 0x03, 0x41, 0x00, 0xFC, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xED, 0x00, 0x03, 0x03, 0x09, + 0x03, 0x1B, 0x1E, 0xE7, 0x00, 0x02, 0x03, 0x09, 0x01, 0x6F, 0x00, 0x02, 0x03, 0x0A, 0x01, 0x71, + 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD4, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x15, 0x00, 0x02, 0x03, 0x0F, + 0x02, 0x17, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xEB, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x00, 0x1E, 0xE9, + 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01, 0x1E, 0xEF, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x03, 0x1E, 0xED, + 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09, 0x1E, 0xF1, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x23, 0x1E, 0xEB, + 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40, 0x1E, 0xE9, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x41, 0x01, 0xB0, + 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xF1, 0x00, 0x03, 0x03, 0x23, 0x03, 0x1B, 0x1E, 0xE5, 0x00, 0x02, + 0x03, 0x23, 0x1E, 0x73, 0x00, 0x02, 0x03, 0x24, 0x01, 0x73, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x77, + 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x75, 0x00, 0x02, 0x03, 0x30, 0x1E, 0xEB, 0x00, 0x03, 0x03, 0x40, + 0x03, 0x1B, 0x00, 0xF9, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xE9, 0x00, 0x03, 0x03, 0x41, 0x03, 0x1B, + 0x00, 0xFA, 0x00, 0x02, 0x03, 0x41, 0x01, 0xD8, 0x00, 0x02, 0x03, 0x44, 0x00, 0x02, 0x00, 0x06, + 0x00, 0x0C, 0x1E, 0x7D, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x7F, 0x00, 0x02, 0x03, 0x23, 0x00, 0x09, + 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, + 0x00, 0x44, 0x1E, 0x81, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x83, 0x00, 0x02, 0x03, 0x01, 0x01, 0x75, + 0x00, 0x02, 0x03, 0x02, 0x1E, 0x87, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x85, 0x00, 0x02, 0x03, 0x08, + 0x1E, 0x98, 0x00, 0x02, 0x03, 0x0A, 0x1E, 0x89, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x81, 0x00, 0x02, + 0x03, 0x40, 0x1E, 0x83, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x8B, + 0x00, 0x02, 0x03, 0x07, 0x1E, 0x8D, 0x00, 0x02, 0x03, 0x08, 0x00, 0x0C, 0x00, 0x1A, 0x00, 0x20, + 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, + 0x00, 0x56, 0x00, 0x5C, 0x1E, 0xF3, 0x00, 0x02, 0x03, 0x00, 0x00, 0xFD, 0x00, 0x02, 0x03, 0x01, + 0x01, 0x77, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xF9, 0x00, 0x02, 0x03, 0x03, 0x02, 0x33, 0x00, 0x02, + 0x03, 0x04, 0x1E, 0x8F, 0x00, 0x02, 0x03, 0x07, 0x00, 0xFF, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xF7, + 0x00, 0x02, 0x03, 0x09, 0x1E, 0x99, 0x00, 0x02, 0x03, 0x0A, 0x1E, 0xF5, 0x00, 0x02, 0x03, 0x23, + 0x1E, 0xF3, 0x00, 0x02, 0x03, 0x40, 0x00, 0xFD, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, + 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x01, 0x7A, 0x00, 0x02, + 0x03, 0x01, 0x1E, 0x91, 0x00, 0x02, 0x03, 0x02, 0x01, 0x7C, 0x00, 0x02, 0x03, 0x07, 0x01, 0x7E, + 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x93, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x95, 0x00, 0x02, 0x03, 0x31, + 0x01, 0x7A, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, + 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xA6, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xA4, 0x00, 0x02, + 0x03, 0x01, 0x1E, 0xAA, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xA8, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xAC, + 0x00, 0x02, 0x03, 0x23, 0x1E, 0xA6, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xA4, 0x00, 0x02, 0x03, 0x41, + 0x00, 0x01, 0x00, 0x04, 0x01, 0xDE, 0x00, 0x02, 0x03, 0x04, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, + 0x01, 0xFA, 0x00, 0x02, 0x03, 0x01, 0x01, 0xFA, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, + 0x00, 0x0E, 0x00, 0x14, 0x01, 0xFC, 0x00, 0x02, 0x03, 0x01, 0x01, 0xE2, 0x00, 0x02, 0x03, 0x04, + 0x01, 0xFC, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x08, 0x00, 0x02, + 0x03, 0x01, 0x1E, 0x08, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, + 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xC0, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xBE, + 0x00, 0x02, 0x03, 0x01, 0x1E, 0xC4, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xC2, 0x00, 0x02, 0x03, 0x09, + 0x1E, 0xC6, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xC0, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xBE, 0x00, 0x02, + 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x2E, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x2E, + 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xDC, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, + 0x00, 0x04, 0x1E, 0xDA, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, + 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xD2, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xD0, + 0x00, 0x02, 0x03, 0x01, 0x1E, 0xD6, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xD4, 0x00, 0x02, 0x03, 0x09, + 0x1E, 0xD8, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xD2, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xD0, 0x00, 0x02, + 0x03, 0x41, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1E, 0x4C, + 0x00, 0x02, 0x03, 0x01, 0x02, 0x2C, 0x00, 0x02, 0x03, 0x04, 0x1E, 0x4E, 0x00, 0x02, 0x03, 0x08, + 0x1E, 0xE0, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0x4C, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, + 0x02, 0x2A, 0x00, 0x02, 0x03, 0x04, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0xFE, 0x00, 0x02, + 0x03, 0x01, 0x01, 0xFE, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xEA, 0x00, 0x02, + 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xE8, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x06, 0x00, 0x0E, + 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x01, 0xDB, 0x00, 0x02, 0x03, 0x00, + 0x01, 0xD7, 0x00, 0x02, 0x03, 0x01, 0x01, 0xD5, 0x00, 0x02, 0x03, 0x04, 0x01, 0xD9, 0x00, 0x02, + 0x03, 0x0C, 0x01, 0xDB, 0x00, 0x02, 0x03, 0x40, 0x01, 0xD7, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, + 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xA7, + 0x00, 0x02, 0x03, 0x00, 0x1E, 0xA5, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xAB, 0x00, 0x02, 0x03, 0x03, + 0x1E, 0xA9, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xAD, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xA7, 0x00, 0x02, + 0x03, 0x40, 0x1E, 0xA5, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x01, 0xDF, 0x00, 0x02, + 0x03, 0x04, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0xFB, 0x00, 0x02, 0x03, 0x01, 0x01, 0xFB, + 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x01, 0xFD, 0x00, 0x02, + 0x03, 0x01, 0x01, 0xE3, 0x00, 0x02, 0x03, 0x04, 0x01, 0xFD, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, + 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x09, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x09, 0x00, 0x02, 0x03, 0x41, + 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, + 0x1E, 0xC1, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xBF, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xC5, 0x00, 0x02, + 0x03, 0x03, 0x1E, 0xC3, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xC7, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xC1, + 0x00, 0x02, 0x03, 0x40, 0x1E, 0xBF, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, + 0x1E, 0x2F, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x2F, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, + 0x1E, 0xDD, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xDB, 0x00, 0x02, 0x03, 0x1B, + 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, + 0x1E, 0xD3, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xD1, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xD7, 0x00, 0x02, + 0x03, 0x03, 0x1E, 0xD5, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xD9, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xD3, + 0x00, 0x02, 0x03, 0x40, 0x1E, 0xD1, 0x00, 0x02, 0x03, 0x41, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, + 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1E, 0x4D, 0x00, 0x02, 0x03, 0x01, 0x02, 0x2D, 0x00, 0x02, + 0x03, 0x04, 0x1E, 0x4F, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xE1, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0x4D, + 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x02, 0x2B, 0x00, 0x02, 0x03, 0x04, 0x00, 0x02, + 0x00, 0x06, 0x00, 0x0C, 0x01, 0xFF, 0x00, 0x02, 0x03, 0x01, 0x01, 0xFF, 0x00, 0x02, 0x03, 0x41, + 0x00, 0x01, 0x00, 0x04, 0x1E, 0xEB, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xE9, + 0x00, 0x02, 0x03, 0x1B, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, + 0x00, 0x2C, 0x01, 0xDC, 0x00, 0x02, 0x03, 0x00, 0x01, 0xD8, 0x00, 0x02, 0x03, 0x01, 0x01, 0xD6, + 0x00, 0x02, 0x03, 0x04, 0x01, 0xDA, 0x00, 0x02, 0x03, 0x0C, 0x01, 0xDC, 0x00, 0x02, 0x03, 0x40, + 0x01, 0xD8, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, + 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xB0, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xAE, 0x00, 0x02, + 0x03, 0x01, 0x1E, 0xB4, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xB2, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xB6, + 0x00, 0x02, 0x03, 0x23, 0x1E, 0xB0, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xAE, 0x00, 0x02, 0x03, 0x41, + 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, + 0x1E, 0xB1, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xAF, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xB5, 0x00, 0x02, + 0x03, 0x03, 0x1E, 0xB3, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xB7, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xB1, + 0x00, 0x02, 0x03, 0x40, 0x1E, 0xAF, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x08, + 0x00, 0x02, 0x03, 0x27, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x09, 0x00, 0x02, 0x03, 0x27, 0x00, 0x04, + 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x1E, 0x14, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x16, + 0x00, 0x02, 0x03, 0x01, 0x1E, 0x14, 0x00, 0x02, 0x03, 0x40, 0x1E, 0x16, 0x00, 0x02, 0x03, 0x41, + 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x1E, 0x15, 0x00, 0x02, 0x03, 0x00, + 0x1E, 0x17, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x15, 0x00, 0x02, 0x03, 0x40, 0x1E, 0x17, 0x00, 0x02, + 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1C, 0x00, 0x02, 0x03, 0x27, 0x00, 0x01, 0x00, 0x04, + 0x1E, 0x1D, 0x00, 0x02, 0x03, 0x27, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, + 0x00, 0x24, 0x1E, 0x50, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x52, 0x00, 0x02, 0x03, 0x01, 0x01, 0xEC, + 0x00, 0x02, 0x03, 0x28, 0x1E, 0x50, 0x00, 0x02, 0x03, 0x40, 0x1E, 0x52, 0x00, 0x02, 0x03, 0x41, + 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1E, 0x51, 0x00, 0x02, + 0x03, 0x00, 0x1E, 0x53, 0x00, 0x02, 0x03, 0x01, 0x01, 0xED, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x51, + 0x00, 0x02, 0x03, 0x40, 0x1E, 0x53, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x64, + 0x00, 0x02, 0x03, 0x07, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x65, 0x00, 0x02, 0x03, 0x07, 0x00, 0x01, + 0x00, 0x04, 0x1E, 0x66, 0x00, 0x02, 0x03, 0x07, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x67, 0x00, 0x02, + 0x03, 0x07, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x78, 0x00, 0x02, 0x03, 0x01, + 0x1E, 0xEE, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0x78, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, + 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x79, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xEF, 0x00, 0x02, 0x03, 0x1B, + 0x1E, 0x79, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x7A, 0x00, 0x02, 0x03, 0x08, + 0x00, 0x01, 0x00, 0x04, 0x1E, 0x7B, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x9B, + 0x00, 0x02, 0x03, 0x07, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, + 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xDC, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xDA, 0x00, 0x02, 0x03, 0x01, + 0x1E, 0xE0, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xDE, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xE2, 0x00, 0x02, + 0x03, 0x23, 0x1E, 0xDC, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xDA, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, + 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xDD, + 0x00, 0x02, 0x03, 0x00, 0x1E, 0xDB, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xE1, 0x00, 0x02, 0x03, 0x03, + 0x1E, 0xDF, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xE3, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xDD, 0x00, 0x02, + 0x03, 0x40, 0x1E, 0xDB, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, + 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xEA, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE8, + 0x00, 0x02, 0x03, 0x01, 0x1E, 0xEE, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xEC, 0x00, 0x02, 0x03, 0x09, + 0x1E, 0xF0, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xEA, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xE8, 0x00, 0x02, + 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, + 0x00, 0x34, 0x1E, 0xEB, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE9, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xEF, + 0x00, 0x02, 0x03, 0x03, 0x1E, 0xED, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xF1, 0x00, 0x02, 0x03, 0x23, + 0x1E, 0xEB, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xE9, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, + 0x01, 0xEE, 0x00, 0x02, 0x03, 0x0C, 0x00, 0x01, 0x00, 0x04, 0x01, 0xEC, 0x00, 0x02, 0x03, 0x04, + 0x00, 0x01, 0x00, 0x04, 0x01, 0xED, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x01, 0xE0, + 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x01, 0xE1, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, + 0x00, 0x04, 0x1E, 0x1C, 0x00, 0x02, 0x03, 0x06, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1D, 0x00, 0x02, + 0x03, 0x06, 0x00, 0x01, 0x00, 0x04, 0x02, 0x30, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, + 0x02, 0x31, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x01, 0xEF, 0x00, 0x02, 0x03, 0x0C, + 0x00, 0x01, 0x00, 0x04, 0x1E, 0x38, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x39, + 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x5C, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, + 0x00, 0x04, 0x1E, 0x5D, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x68, 0x00, 0x02, + 0x03, 0x23, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x69, 0x00, 0x02, 0x03, 0x23, 0x00, 0x01, 0x00, 0x04, + 0x1E, 0x68, 0x00, 0x02, 0x03, 0x07, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x69, 0x00, 0x02, 0x03, 0x07, + 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0xAC, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xB6, 0x00, 0x02, + 0x03, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0xAD, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xB7, + 0x00, 0x02, 0x03, 0x06, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xC6, 0x00, 0x02, 0x03, 0x02, 0x00, 0x01, + 0x00, 0x04, 0x1E, 0xC7, 0x00, 0x02, 0x03, 0x02, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0xD8, + 0x00, 0x02, 0x03, 0x02, 0x1E, 0xE2, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, + 0x1E, 0xD9, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xE3, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, + 0x1E, 0xDE, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xDF, 0x00, 0x02, 0x03, 0x1B, + 0x00, 0x01, 0x00, 0x04, 0x1E, 0xF0, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xF1, + 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xEC, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, + 0x00, 0x04, 0x1E, 0xED, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, + 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x30, 0x00, 0x02, 0x03, 0x01, 0x01, 0xE8, 0x00, 0x02, + 0x03, 0x0C, 0x1E, 0x32, 0x00, 0x02, 0x03, 0x23, 0x01, 0x36, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x34, + 0x00, 0x02, 0x03, 0x31, 0x1E, 0x30, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, + 0x01, 0xFA, 0x00, 0x02, 0x03, 0x01, 0x01, 0xFA, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x89, + 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, + 0x00, 0x49, 0x00, 0x4A, 0x00, 0x4B, 0x00, 0x4C, 0x00, 0x4D, 0x00, 0x4E, 0x00, 0x4F, 0x00, 0x50, + 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, + 0x00, 0x5A, 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x67, + 0x00, 0x68, 0x00, 0x69, 0x00, 0x6A, 0x00, 0x6B, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x6E, 0x00, 0x6F, + 0x00, 0x70, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x75, 0x00, 0x76, 0x00, 0x77, 0x00, 0x78, + 0x00, 0x79, 0x00, 0x7A, 0x00, 0xC2, 0x00, 0xC4, 0x00, 0xC5, 0x00, 0xC6, 0x00, 0xC7, 0x00, 0xCA, + 0x00, 0xCF, 0x00, 0xD2, 0x00, 0xD3, 0x00, 0xD4, 0x00, 0xD5, 0x00, 0xD6, 0x00, 0xD8, 0x00, 0xD9, + 0x00, 0xDA, 0x00, 0xDC, 0x00, 0xE2, 0x00, 0xE4, 0x00, 0xE5, 0x00, 0xE6, 0x00, 0xE7, 0x00, 0xEA, + 0x00, 0xEF, 0x00, 0xF2, 0x00, 0xF3, 0x00, 0xF4, 0x00, 0xF5, 0x00, 0xF6, 0x00, 0xF8, 0x00, 0xF9, + 0x00, 0xFA, 0x00, 0xFC, 0x01, 0x02, 0x01, 0x03, 0x01, 0x06, 0x01, 0x07, 0x01, 0x12, 0x01, 0x13, + 0x01, 0x14, 0x01, 0x15, 0x01, 0x4C, 0x01, 0x4D, 0x01, 0x5A, 0x01, 0x5B, 0x01, 0x60, 0x01, 0x61, + 0x01, 0x68, 0x01, 0x69, 0x01, 0x6A, 0x01, 0x6B, 0x01, 0x7F, 0x01, 0xA0, 0x01, 0xA1, 0x01, 0xAF, + 0x01, 0xB0, 0x01, 0xB7, 0x01, 0xEA, 0x01, 0xEB, 0x02, 0x26, 0x02, 0x27, 0x02, 0x28, 0x02, 0x29, + 0x02, 0x2E, 0x02, 0x2F, 0x02, 0x92, 0x1E, 0x36, 0x1E, 0x37, 0x1E, 0x5A, 0x1E, 0x5B, 0x1E, 0x60, + 0x1E, 0x61, 0x1E, 0x62, 0x1E, 0x63, 0x1E, 0xA0, 0x1E, 0xA1, 0x1E, 0xB8, 0x1E, 0xB9, 0x1E, 0xCC, + 0x1E, 0xCD, 0x1E, 0xCE, 0x1E, 0xCF, 0x1E, 0xE4, 0x1E, 0xE5, 0x1E, 0xE6, 0x1E, 0xE7, 0x21, 0x2A, + 0x21, 0x2B, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x14, 0x13, 0x92, 0x1A, 0xA8, 0x1E, 0x46, + 0x21, 0xB8, 0x22, 0x76, 0x23, 0x04, 0x00, 0x01, 0x0F, 0x96, 0x01, 0xF2, 0x03, 0xEA, 0x03, 0xF0, + 0x03, 0xF6, 0x03, 0xFC, 0x04, 0x02, 0x04, 0x08, 0x04, 0x0E, 0x04, 0x14, 0x04, 0x1A, 0x04, 0x20, + 0x04, 0x26, 0x04, 0x2C, 0x04, 0x32, 0x04, 0x38, 0x04, 0x3E, 0x04, 0x44, 0x04, 0x4A, 0x04, 0x50, + 0x04, 0x56, 0x04, 0x5C, 0x04, 0x62, 0x04, 0x68, 0x04, 0x6E, 0x04, 0x74, 0x04, 0x7A, 0x04, 0x80, + 0x04, 0x86, 0x04, 0x8C, 0x04, 0x92, 0x04, 0x98, 0x04, 0x9E, 0x04, 0xA4, 0x04, 0xAA, 0x04, 0xB0, + 0x04, 0xB6, 0x04, 0xBC, 0x04, 0xC2, 0x04, 0xC8, 0x04, 0xCE, 0x04, 0xD4, 0x04, 0xDA, 0x04, 0xE0, + 0x04, 0xE6, 0x04, 0xEC, 0x04, 0xF2, 0x04, 0xF8, 0x04, 0xFE, 0x05, 0x04, 0x05, 0x0A, 0x05, 0x10, + 0x05, 0x16, 0x05, 0x1C, 0x05, 0x22, 0x05, 0x28, 0x05, 0x2E, 0x05, 0x34, 0x05, 0x3A, 0x05, 0x40, + 0x05, 0x46, 0x05, 0x4C, 0x05, 0x52, 0x05, 0x58, 0x05, 0x5E, 0x05, 0x64, 0x05, 0x6A, 0x05, 0x70, + 0x05, 0x76, 0x05, 0x7C, 0x05, 0x82, 0x05, 0x88, 0x05, 0x8E, 0x05, 0x94, 0x05, 0x9A, 0x05, 0xA0, + 0x05, 0xA6, 0x05, 0xAC, 0x05, 0xB2, 0x05, 0xB8, 0x05, 0xBE, 0x05, 0xC4, 0x05, 0xCA, 0x05, 0xD0, + 0x05, 0xD6, 0x05, 0xDC, 0x05, 0xE2, 0x05, 0xE8, 0x05, 0xEE, 0x05, 0xF4, 0x05, 0xFA, 0x06, 0x00, + 0x06, 0x06, 0x06, 0x0C, 0x06, 0x12, 0x06, 0x18, 0x06, 0x1E, 0x06, 0x24, 0x06, 0x2A, 0x06, 0x30, + 0x06, 0x36, 0x06, 0x3C, 0x06, 0x42, 0x06, 0x48, 0x06, 0x4E, 0x06, 0x54, 0x06, 0x5A, 0x06, 0x60, + 0x06, 0x66, 0x06, 0x6C, 0x06, 0x72, 0x06, 0x78, 0x06, 0x7E, 0x06, 0x84, 0x06, 0x8A, 0x06, 0x90, + 0x06, 0x96, 0x06, 0x9C, 0x06, 0xA2, 0x06, 0xA8, 0x06, 0xAE, 0x06, 0xB4, 0x06, 0xBA, 0x06, 0xC0, + 0x06, 0xC6, 0x06, 0xCC, 0x06, 0xD2, 0x06, 0xD8, 0x06, 0xDE, 0x06, 0xE4, 0x06, 0xEA, 0x06, 0xF0, + 0x06, 0xF6, 0x06, 0xFC, 0x07, 0x02, 0x07, 0x08, 0x07, 0x0E, 0x07, 0x14, 0x07, 0x1A, 0x07, 0x20, + 0x07, 0x26, 0x07, 0x2C, 0x07, 0x32, 0x07, 0x38, 0x07, 0x3E, 0x07, 0x44, 0x07, 0x4A, 0x07, 0x50, + 0x07, 0x56, 0x07, 0x5C, 0x07, 0x62, 0x07, 0x68, 0x07, 0x6E, 0x07, 0x74, 0x07, 0x7A, 0x07, 0x80, + 0x07, 0x86, 0x07, 0x8C, 0x07, 0x92, 0x07, 0x98, 0x07, 0x9E, 0x07, 0xA4, 0x07, 0xAA, 0x07, 0xB0, + 0x07, 0xB6, 0x07, 0xBC, 0x07, 0xC2, 0x07, 0xC8, 0x07, 0xCE, 0x07, 0xD4, 0x07, 0xDA, 0x07, 0xE0, + 0x07, 0xE6, 0x07, 0xEC, 0x07, 0xF2, 0x07, 0xF8, 0x07, 0xFE, 0x08, 0x04, 0x08, 0x0A, 0x08, 0x10, + 0x08, 0x16, 0x08, 0x1C, 0x08, 0x22, 0x08, 0x28, 0x08, 0x2E, 0x08, 0x34, 0x08, 0x3A, 0x08, 0x40, + 0x08, 0x46, 0x08, 0x4C, 0x08, 0x52, 0x08, 0x58, 0x08, 0x5E, 0x08, 0x64, 0x08, 0x6A, 0x08, 0x70, + 0x08, 0x76, 0x08, 0x7C, 0x08, 0x82, 0x08, 0x88, 0x08, 0x8E, 0x08, 0x94, 0x08, 0x9A, 0x08, 0xA0, + 0x08, 0xA6, 0x08, 0xAC, 0x08, 0xB2, 0x08, 0xB8, 0x08, 0xBE, 0x08, 0xC4, 0x08, 0xCA, 0x08, 0xD0, + 0x08, 0xD6, 0x08, 0xDC, 0x08, 0xE2, 0x08, 0xE8, 0x08, 0xEE, 0x08, 0xF4, 0x08, 0xFA, 0x09, 0x00, + 0x09, 0x06, 0x09, 0x0C, 0x09, 0x12, 0x09, 0x18, 0x09, 0x1E, 0x09, 0x24, 0x09, 0x2A, 0x09, 0x30, + 0x09, 0x36, 0x09, 0x3C, 0x09, 0x42, 0x09, 0x48, 0x09, 0x4E, 0x09, 0x54, 0x09, 0x5A, 0x09, 0x60, + 0x09, 0x66, 0x09, 0x6C, 0x09, 0x72, 0x09, 0x78, 0x09, 0x7E, 0x09, 0x84, 0x09, 0x8A, 0x09, 0x90, + 0x09, 0x96, 0x09, 0x9C, 0x09, 0xA2, 0x09, 0xA8, 0x09, 0xAE, 0x09, 0xB4, 0x09, 0xBA, 0x09, 0xC0, + 0x09, 0xC6, 0x09, 0xCC, 0x09, 0xD2, 0x09, 0xD8, 0x09, 0xDE, 0x09, 0xE4, 0x09, 0xEA, 0x09, 0xF0, + 0x09, 0xF6, 0x09, 0xFC, 0x0A, 0x02, 0x0A, 0x08, 0x0A, 0x0E, 0x0A, 0x14, 0x0A, 0x1A, 0x0A, 0x20, + 0x0A, 0x26, 0x0A, 0x2C, 0x0A, 0x32, 0x0A, 0x38, 0x0A, 0x3E, 0x0A, 0x44, 0x0A, 0x4A, 0x0A, 0x50, + 0x0A, 0x56, 0x0A, 0x5C, 0x0A, 0x62, 0x0A, 0x68, 0x0A, 0x6E, 0x0A, 0x74, 0x0A, 0x7A, 0x0A, 0x80, + 0x0A, 0x86, 0x0A, 0x8C, 0x0A, 0x92, 0x0A, 0x98, 0x0A, 0x9E, 0x0A, 0xA4, 0x0A, 0xAA, 0x0A, 0xB0, + 0x0A, 0xB6, 0x0A, 0xBC, 0x0A, 0xC2, 0x0A, 0xC8, 0x0A, 0xCE, 0x0A, 0xD4, 0x0A, 0xDA, 0x0A, 0xE0, + 0x0A, 0xE6, 0x0A, 0xEC, 0x0A, 0xF2, 0x0A, 0xF8, 0x0A, 0xFE, 0x0B, 0x04, 0x0B, 0x0A, 0x0B, 0x10, + 0x0B, 0x16, 0x0B, 0x1C, 0x0B, 0x22, 0x0B, 0x28, 0x0B, 0x2E, 0x0B, 0x34, 0x0B, 0x3A, 0x0B, 0x40, + 0x0B, 0x46, 0x0B, 0x4C, 0x0B, 0x52, 0x0B, 0x58, 0x0B, 0x5E, 0x0B, 0x64, 0x0B, 0x6A, 0x0B, 0x70, + 0x0B, 0x76, 0x0B, 0x7C, 0x0B, 0x82, 0x0B, 0x88, 0x0B, 0x8E, 0x0B, 0x94, 0x0B, 0x9A, 0x0B, 0xA0, + 0x0B, 0xA6, 0x0B, 0xAC, 0x0B, 0xB2, 0x0B, 0xB8, 0x0B, 0xBE, 0x0B, 0xC4, 0x0B, 0xCA, 0x0B, 0xD0, + 0x0B, 0xD6, 0x0B, 0xDC, 0x0B, 0xE2, 0x0B, 0xE8, 0x0B, 0xEE, 0x0B, 0xF4, 0x0B, 0xFA, 0x0C, 0x00, + 0x0C, 0x06, 0x0C, 0x0C, 0x0C, 0x12, 0x0C, 0x18, 0x0C, 0x1E, 0x0C, 0x24, 0x0C, 0x2A, 0x0C, 0x30, + 0x0C, 0x36, 0x0C, 0x3C, 0x0C, 0x42, 0x0C, 0x48, 0x0C, 0x4E, 0x0C, 0x54, 0x0C, 0x5A, 0x0C, 0x60, + 0x0C, 0x66, 0x0C, 0x6C, 0x0C, 0x72, 0x0C, 0x78, 0x0C, 0x7E, 0x0C, 0x84, 0x0C, 0x8A, 0x0C, 0x90, + 0x0C, 0x96, 0x0C, 0x9C, 0x0C, 0xA2, 0x0C, 0xA8, 0x0C, 0xAE, 0x0C, 0xB4, 0x0C, 0xBA, 0x0C, 0xC0, + 0x0C, 0xC6, 0x0C, 0xCC, 0x0C, 0xD2, 0x0C, 0xD8, 0x0C, 0xDE, 0x0C, 0xE4, 0x0C, 0xEA, 0x0C, 0xF0, + 0x0C, 0xF6, 0x0C, 0xFC, 0x0D, 0x02, 0x0D, 0x08, 0x0D, 0x0E, 0x0D, 0x14, 0x0D, 0x1A, 0x0D, 0x20, + 0x0D, 0x26, 0x0D, 0x2C, 0x0D, 0x32, 0x0D, 0x38, 0x0D, 0x3E, 0x0D, 0x44, 0x0D, 0x4A, 0x0D, 0x50, + 0x0D, 0x56, 0x0D, 0x5C, 0x0D, 0x62, 0x0D, 0x68, 0x0D, 0x6E, 0x0D, 0x74, 0x0D, 0x7A, 0x0D, 0x80, + 0x0D, 0x86, 0x0D, 0x8C, 0x0D, 0x92, 0x0D, 0x98, 0x0D, 0x9E, 0x0D, 0xA4, 0x0D, 0xAA, 0x0D, 0xB0, + 0x0D, 0xB6, 0x0D, 0xBC, 0x0D, 0xC2, 0x0D, 0xC8, 0x0D, 0xCE, 0x0D, 0xD4, 0x0D, 0xDA, 0x0D, 0xE0, + 0x0D, 0xE6, 0x0D, 0xEC, 0x0D, 0xF2, 0x0D, 0xF8, 0x0D, 0xFE, 0x0E, 0x04, 0x0E, 0x0A, 0x0E, 0x10, + 0x0E, 0x16, 0x0E, 0x1C, 0x0E, 0x22, 0x0E, 0x28, 0x0E, 0x2E, 0x0E, 0x34, 0x0E, 0x3A, 0x0E, 0x40, + 0x0E, 0x46, 0x0E, 0x4C, 0x0E, 0x52, 0x0E, 0x58, 0x0E, 0x5E, 0x0E, 0x64, 0x0E, 0x6A, 0x0E, 0x70, + 0x0E, 0x76, 0x0E, 0x7C, 0x0E, 0x82, 0x0E, 0x88, 0x0E, 0x8E, 0x0E, 0x94, 0x0E, 0x9A, 0x0E, 0xA0, + 0x0E, 0xA6, 0x0E, 0xAC, 0x0E, 0xB2, 0x0E, 0xB8, 0x0E, 0xBE, 0x0E, 0xC4, 0x0E, 0xCA, 0x0E, 0xD0, + 0x0E, 0xD6, 0x0E, 0xDC, 0x0E, 0xE2, 0x0E, 0xE8, 0x0E, 0xEE, 0x0E, 0xF4, 0x0E, 0xFA, 0x0F, 0x00, + 0x0F, 0x06, 0x0F, 0x0C, 0x0F, 0x12, 0x0F, 0x18, 0x0F, 0x1E, 0x0F, 0x24, 0x0F, 0x2A, 0x0F, 0x30, + 0x0F, 0x36, 0x0F, 0x3C, 0x0F, 0x42, 0x0F, 0x48, 0x0F, 0x4E, 0x0F, 0x54, 0x0F, 0x5A, 0x0F, 0x60, + 0x0F, 0x66, 0x0F, 0x6C, 0x0F, 0x72, 0x0F, 0x78, 0x0F, 0x7E, 0x0F, 0x84, 0x0F, 0x8A, 0x0F, 0x90, + 0x00, 0x02, 0x00, 0x41, 0x03, 0x00, 0x00, 0x02, 0x00, 0x41, 0x03, 0x01, 0x00, 0x02, 0x00, 0x41, + 0x03, 0x02, 0x00, 0x02, 0x00, 0x41, 0x03, 0x03, 0x00, 0x02, 0x00, 0x41, 0x03, 0x08, 0x00, 0x02, + 0x00, 0x41, 0x03, 0x0A, 0x00, 0x02, 0x00, 0x43, 0x03, 0x27, 0x00, 0x02, 0x00, 0x45, 0x03, 0x00, + 0x00, 0x02, 0x00, 0x45, 0x03, 0x01, 0x00, 0x02, 0x00, 0x45, 0x03, 0x02, 0x00, 0x02, 0x00, 0x45, + 0x03, 0x08, 0x00, 0x02, 0x00, 0x49, 0x03, 0x00, 0x00, 0x02, 0x00, 0x49, 0x03, 0x01, 0x00, 0x02, + 0x00, 0x49, 0x03, 0x02, 0x00, 0x02, 0x00, 0x49, 0x03, 0x08, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x03, + 0x00, 0x02, 0x00, 0x4F, 0x03, 0x00, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4F, + 0x03, 0x02, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x03, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x08, 0x00, 0x02, + 0x00, 0x55, 0x03, 0x00, 0x00, 0x02, 0x00, 0x55, 0x03, 0x01, 0x00, 0x02, 0x00, 0x55, 0x03, 0x02, + 0x00, 0x02, 0x00, 0x55, 0x03, 0x08, 0x00, 0x02, 0x00, 0x59, 0x03, 0x01, 0x00, 0x02, 0x00, 0x61, + 0x03, 0x00, 0x00, 0x02, 0x00, 0x61, 0x03, 0x01, 0x00, 0x02, 0x00, 0x61, 0x03, 0x02, 0x00, 0x02, + 0x00, 0x61, 0x03, 0x03, 0x00, 0x02, 0x00, 0x61, 0x03, 0x08, 0x00, 0x02, 0x00, 0x61, 0x03, 0x0A, + 0x00, 0x02, 0x00, 0x63, 0x03, 0x27, 0x00, 0x02, 0x00, 0x65, 0x03, 0x00, 0x00, 0x02, 0x00, 0x65, + 0x03, 0x01, 0x00, 0x02, 0x00, 0x65, 0x03, 0x02, 0x00, 0x02, 0x00, 0x65, 0x03, 0x08, 0x00, 0x02, + 0x00, 0x69, 0x03, 0x00, 0x00, 0x02, 0x00, 0x69, 0x03, 0x01, 0x00, 0x02, 0x00, 0x69, 0x03, 0x02, + 0x00, 0x02, 0x00, 0x69, 0x03, 0x08, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x03, 0x00, 0x02, 0x00, 0x6F, + 0x03, 0x00, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x01, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x02, 0x00, 0x02, + 0x00, 0x6F, 0x03, 0x03, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x08, 0x00, 0x02, 0x00, 0x75, 0x03, 0x00, + 0x00, 0x02, 0x00, 0x75, 0x03, 0x01, 0x00, 0x02, 0x00, 0x75, 0x03, 0x02, 0x00, 0x02, 0x00, 0x75, + 0x03, 0x08, 0x00, 0x02, 0x00, 0x79, 0x03, 0x01, 0x00, 0x02, 0x00, 0x79, 0x03, 0x08, 0x00, 0x02, + 0x00, 0x41, 0x03, 0x04, 0x00, 0x02, 0x00, 0x61, 0x03, 0x04, 0x00, 0x02, 0x00, 0x41, 0x03, 0x06, + 0x00, 0x02, 0x00, 0x61, 0x03, 0x06, 0x00, 0x02, 0x00, 0x41, 0x03, 0x28, 0x00, 0x02, 0x00, 0x61, + 0x03, 0x28, 0x00, 0x02, 0x00, 0x43, 0x03, 0x01, 0x00, 0x02, 0x00, 0x63, 0x03, 0x01, 0x00, 0x02, + 0x00, 0x43, 0x03, 0x02, 0x00, 0x02, 0x00, 0x63, 0x03, 0x02, 0x00, 0x02, 0x00, 0x43, 0x03, 0x07, + 0x00, 0x02, 0x00, 0x63, 0x03, 0x07, 0x00, 0x02, 0x00, 0x43, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x63, + 0x03, 0x0C, 0x00, 0x02, 0x00, 0x44, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x64, 0x03, 0x0C, 0x00, 0x02, + 0x00, 0x45, 0x03, 0x04, 0x00, 0x02, 0x00, 0x65, 0x03, 0x04, 0x00, 0x02, 0x00, 0x45, 0x03, 0x06, + 0x00, 0x02, 0x00, 0x65, 0x03, 0x06, 0x00, 0x02, 0x00, 0x45, 0x03, 0x07, 0x00, 0x02, 0x00, 0x65, + 0x03, 0x07, 0x00, 0x02, 0x00, 0x45, 0x03, 0x28, 0x00, 0x02, 0x00, 0x65, 0x03, 0x28, 0x00, 0x02, + 0x00, 0x45, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x65, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x47, 0x03, 0x02, + 0x00, 0x02, 0x00, 0x67, 0x03, 0x02, 0x00, 0x02, 0x00, 0x47, 0x03, 0x06, 0x00, 0x02, 0x00, 0x67, + 0x03, 0x06, 0x00, 0x02, 0x00, 0x47, 0x03, 0x07, 0x00, 0x02, 0x00, 0x67, 0x03, 0x07, 0x00, 0x02, + 0x00, 0x47, 0x03, 0x27, 0x00, 0x02, 0x00, 0x67, 0x03, 0x27, 0x00, 0x02, 0x00, 0x48, 0x03, 0x02, + 0x00, 0x02, 0x00, 0x68, 0x03, 0x02, 0x00, 0x02, 0x00, 0x49, 0x03, 0x03, 0x00, 0x02, 0x00, 0x69, + 0x03, 0x03, 0x00, 0x02, 0x00, 0x49, 0x03, 0x04, 0x00, 0x02, 0x00, 0x69, 0x03, 0x04, 0x00, 0x02, + 0x00, 0x49, 0x03, 0x06, 0x00, 0x02, 0x00, 0x69, 0x03, 0x06, 0x00, 0x02, 0x00, 0x49, 0x03, 0x28, + 0x00, 0x02, 0x00, 0x69, 0x03, 0x28, 0x00, 0x02, 0x00, 0x49, 0x03, 0x07, 0x00, 0x02, 0x00, 0x4A, + 0x03, 0x02, 0x00, 0x02, 0x00, 0x6A, 0x03, 0x02, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x27, 0x00, 0x02, + 0x00, 0x6B, 0x03, 0x27, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x01, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x01, + 0x00, 0x02, 0x00, 0x4C, 0x03, 0x27, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x27, 0x00, 0x02, 0x00, 0x4C, + 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x01, 0x00, 0x02, + 0x00, 0x6E, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x27, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x27, + 0x00, 0x02, 0x00, 0x4E, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4F, + 0x03, 0x04, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x04, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x06, 0x00, 0x02, + 0x00, 0x6F, 0x03, 0x06, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x0B, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x0B, + 0x00, 0x02, 0x00, 0x52, 0x03, 0x01, 0x00, 0x02, 0x00, 0x72, 0x03, 0x01, 0x00, 0x02, 0x00, 0x52, + 0x03, 0x27, 0x00, 0x02, 0x00, 0x72, 0x03, 0x27, 0x00, 0x02, 0x00, 0x52, 0x03, 0x0C, 0x00, 0x02, + 0x00, 0x72, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x53, 0x03, 0x01, 0x00, 0x02, 0x00, 0x73, 0x03, 0x01, + 0x00, 0x02, 0x00, 0x53, 0x03, 0x02, 0x00, 0x02, 0x00, 0x73, 0x03, 0x02, 0x00, 0x02, 0x00, 0x53, + 0x03, 0x27, 0x00, 0x02, 0x00, 0x73, 0x03, 0x27, 0x00, 0x02, 0x00, 0x53, 0x03, 0x0C, 0x00, 0x02, + 0x00, 0x73, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x54, 0x03, 0x27, 0x00, 0x02, 0x00, 0x74, 0x03, 0x27, + 0x00, 0x02, 0x00, 0x54, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x74, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x55, + 0x03, 0x03, 0x00, 0x02, 0x00, 0x75, 0x03, 0x03, 0x00, 0x02, 0x00, 0x55, 0x03, 0x04, 0x00, 0x02, + 0x00, 0x75, 0x03, 0x04, 0x00, 0x02, 0x00, 0x55, 0x03, 0x06, 0x00, 0x02, 0x00, 0x75, 0x03, 0x06, + 0x00, 0x02, 0x00, 0x55, 0x03, 0x0A, 0x00, 0x02, 0x00, 0x75, 0x03, 0x0A, 0x00, 0x02, 0x00, 0x55, + 0x03, 0x0B, 0x00, 0x02, 0x00, 0x75, 0x03, 0x0B, 0x00, 0x02, 0x00, 0x55, 0x03, 0x28, 0x00, 0x02, + 0x00, 0x75, 0x03, 0x28, 0x00, 0x02, 0x00, 0x57, 0x03, 0x02, 0x00, 0x02, 0x00, 0x77, 0x03, 0x02, + 0x00, 0x02, 0x00, 0x59, 0x03, 0x02, 0x00, 0x02, 0x00, 0x79, 0x03, 0x02, 0x00, 0x02, 0x00, 0x59, + 0x03, 0x08, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x01, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x01, 0x00, 0x02, + 0x00, 0x5A, 0x03, 0x07, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x07, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x0C, + 0x00, 0x02, 0x00, 0x7A, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x1B, 0x00, 0x02, 0x00, 0x6F, + 0x03, 0x1B, 0x00, 0x02, 0x00, 0x55, 0x03, 0x1B, 0x00, 0x02, 0x00, 0x75, 0x03, 0x1B, 0x00, 0x02, + 0x00, 0x41, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x61, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x49, 0x03, 0x0C, + 0x00, 0x02, 0x00, 0x69, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6F, + 0x03, 0x0C, 0x00, 0x02, 0x00, 0x55, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x75, 0x03, 0x0C, 0x00, 0x02, + 0x00, 0xDC, 0x03, 0x04, 0x00, 0x02, 0x00, 0xFC, 0x03, 0x04, 0x00, 0x02, 0x00, 0x55, 0x03, 0x44, + 0x00, 0x02, 0x00, 0x75, 0x03, 0x44, 0x00, 0x02, 0x00, 0xDC, 0x03, 0x0C, 0x00, 0x02, 0x00, 0xFC, + 0x03, 0x0C, 0x00, 0x02, 0x00, 0xDC, 0x03, 0x00, 0x00, 0x02, 0x00, 0xFC, 0x03, 0x00, 0x00, 0x02, + 0x00, 0xC4, 0x03, 0x04, 0x00, 0x02, 0x00, 0xE4, 0x03, 0x04, 0x00, 0x02, 0x02, 0x26, 0x03, 0x04, + 0x00, 0x02, 0x02, 0x27, 0x03, 0x04, 0x00, 0x02, 0x00, 0xC6, 0x03, 0x04, 0x00, 0x02, 0x00, 0xE6, + 0x03, 0x04, 0x00, 0x02, 0x00, 0x47, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x67, 0x03, 0x0C, 0x00, 0x02, + 0x00, 0x4B, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x28, + 0x00, 0x02, 0x00, 0x6F, 0x03, 0x28, 0x00, 0x02, 0x01, 0x4C, 0x03, 0x28, 0x00, 0x02, 0x01, 0x4D, + 0x03, 0x28, 0x00, 0x02, 0x01, 0xB7, 0x03, 0x0C, 0x00, 0x02, 0x02, 0x92, 0x03, 0x0C, 0x00, 0x02, + 0x00, 0x6A, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x47, 0x03, 0x01, 0x00, 0x02, 0x00, 0x67, 0x03, 0x01, + 0x00, 0x02, 0x00, 0x4E, 0x03, 0x00, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x00, 0x00, 0x02, 0x00, 0xC5, + 0x03, 0x01, 0x00, 0x02, 0x00, 0xE5, 0x03, 0x01, 0x00, 0x02, 0x00, 0xC6, 0x03, 0x01, 0x00, 0x02, + 0x00, 0xE6, 0x03, 0x01, 0x00, 0x02, 0x00, 0xD8, 0x03, 0x01, 0x00, 0x02, 0x00, 0xF8, 0x03, 0x01, + 0x00, 0x02, 0x00, 0x41, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x61, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x41, + 0x03, 0x11, 0x00, 0x02, 0x00, 0x61, 0x03, 0x11, 0x00, 0x02, 0x00, 0x45, 0x03, 0x0F, 0x00, 0x02, + 0x00, 0x65, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x45, 0x03, 0x11, 0x00, 0x02, 0x00, 0x65, 0x03, 0x11, + 0x00, 0x02, 0x00, 0x49, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x69, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x49, + 0x03, 0x11, 0x00, 0x02, 0x00, 0x69, 0x03, 0x11, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x0F, 0x00, 0x02, + 0x00, 0x6F, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x11, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x11, + 0x00, 0x02, 0x00, 0x52, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x72, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x52, + 0x03, 0x11, 0x00, 0x02, 0x00, 0x72, 0x03, 0x11, 0x00, 0x02, 0x00, 0x55, 0x03, 0x0F, 0x00, 0x02, + 0x00, 0x75, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x55, 0x03, 0x11, 0x00, 0x02, 0x00, 0x75, 0x03, 0x11, + 0x00, 0x02, 0x00, 0x53, 0x03, 0x26, 0x00, 0x02, 0x00, 0x73, 0x03, 0x26, 0x00, 0x02, 0x00, 0x54, + 0x03, 0x26, 0x00, 0x02, 0x00, 0x74, 0x03, 0x26, 0x00, 0x02, 0x00, 0x48, 0x03, 0x0C, 0x00, 0x02, + 0x00, 0x68, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x41, 0x03, 0x07, 0x00, 0x02, 0x00, 0x61, 0x03, 0x07, + 0x00, 0x02, 0x00, 0x45, 0x03, 0x27, 0x00, 0x02, 0x00, 0x65, 0x03, 0x27, 0x00, 0x02, 0x00, 0xD6, + 0x03, 0x04, 0x00, 0x02, 0x00, 0xF6, 0x03, 0x04, 0x00, 0x02, 0x00, 0xD5, 0x03, 0x04, 0x00, 0x02, + 0x00, 0xF5, 0x03, 0x04, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x07, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x07, + 0x00, 0x02, 0x02, 0x2E, 0x03, 0x04, 0x00, 0x02, 0x02, 0x2F, 0x03, 0x04, 0x00, 0x02, 0x00, 0x59, + 0x03, 0x04, 0x00, 0x02, 0x00, 0x79, 0x03, 0x04, 0x00, 0x02, 0x00, 0x41, 0x03, 0x25, 0x00, 0x02, + 0x00, 0x61, 0x03, 0x25, 0x00, 0x02, 0x00, 0x42, 0x03, 0x07, 0x00, 0x02, 0x00, 0x62, 0x03, 0x07, + 0x00, 0x02, 0x00, 0x42, 0x03, 0x23, 0x00, 0x02, 0x00, 0x62, 0x03, 0x23, 0x00, 0x02, 0x00, 0x42, + 0x03, 0x31, 0x00, 0x02, 0x00, 0x62, 0x03, 0x31, 0x00, 0x02, 0x00, 0xC7, 0x03, 0x01, 0x00, 0x02, + 0x00, 0xE7, 0x03, 0x01, 0x00, 0x02, 0x00, 0x44, 0x03, 0x07, 0x00, 0x02, 0x00, 0x64, 0x03, 0x07, + 0x00, 0x02, 0x00, 0x44, 0x03, 0x23, 0x00, 0x02, 0x00, 0x64, 0x03, 0x23, 0x00, 0x02, 0x00, 0x44, + 0x03, 0x31, 0x00, 0x02, 0x00, 0x64, 0x03, 0x31, 0x00, 0x02, 0x00, 0x44, 0x03, 0x27, 0x00, 0x02, + 0x00, 0x64, 0x03, 0x27, 0x00, 0x02, 0x00, 0x44, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x64, 0x03, 0x2D, + 0x00, 0x02, 0x01, 0x12, 0x03, 0x00, 0x00, 0x02, 0x01, 0x13, 0x03, 0x00, 0x00, 0x02, 0x01, 0x12, + 0x03, 0x01, 0x00, 0x02, 0x01, 0x13, 0x03, 0x01, 0x00, 0x02, 0x00, 0x45, 0x03, 0x2D, 0x00, 0x02, + 0x00, 0x65, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x45, 0x03, 0x30, 0x00, 0x02, 0x00, 0x65, 0x03, 0x30, + 0x00, 0x02, 0x01, 0x14, 0x03, 0x27, 0x00, 0x02, 0x01, 0x15, 0x03, 0x27, 0x00, 0x02, 0x00, 0x46, + 0x03, 0x07, 0x00, 0x02, 0x00, 0x66, 0x03, 0x07, 0x00, 0x02, 0x00, 0x47, 0x03, 0x04, 0x00, 0x02, + 0x00, 0x67, 0x03, 0x04, 0x00, 0x02, 0x00, 0x48, 0x03, 0x07, 0x00, 0x02, 0x00, 0x68, 0x03, 0x07, + 0x00, 0x02, 0x00, 0x48, 0x03, 0x23, 0x00, 0x02, 0x00, 0x68, 0x03, 0x23, 0x00, 0x02, 0x00, 0x48, + 0x03, 0x08, 0x00, 0x02, 0x00, 0x68, 0x03, 0x08, 0x00, 0x02, 0x00, 0x48, 0x03, 0x27, 0x00, 0x02, + 0x00, 0x68, 0x03, 0x27, 0x00, 0x02, 0x00, 0x48, 0x03, 0x2E, 0x00, 0x02, 0x00, 0x68, 0x03, 0x2E, + 0x00, 0x02, 0x00, 0x49, 0x03, 0x30, 0x00, 0x02, 0x00, 0x69, 0x03, 0x30, 0x00, 0x02, 0x00, 0x49, + 0x03, 0x44, 0x00, 0x02, 0x00, 0x69, 0x03, 0x44, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x01, 0x00, 0x02, + 0x00, 0x6B, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x23, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x23, + 0x00, 0x02, 0x00, 0x4B, 0x03, 0x31, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x31, 0x00, 0x02, 0x00, 0x4C, + 0x03, 0x23, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x23, 0x00, 0x02, 0x1E, 0x36, 0x03, 0x04, 0x00, 0x02, + 0x1E, 0x37, 0x03, 0x04, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x31, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x31, + 0x00, 0x02, 0x00, 0x4C, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x4D, + 0x03, 0x01, 0x00, 0x02, 0x00, 0x6D, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4D, 0x03, 0x07, 0x00, 0x02, + 0x00, 0x6D, 0x03, 0x07, 0x00, 0x02, 0x00, 0x4D, 0x03, 0x23, 0x00, 0x02, 0x00, 0x6D, 0x03, 0x23, + 0x00, 0x02, 0x00, 0x4E, 0x03, 0x07, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x07, 0x00, 0x02, 0x00, 0x4E, + 0x03, 0x23, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x23, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x31, 0x00, 0x02, + 0x00, 0x6E, 0x03, 0x31, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x2D, + 0x00, 0x02, 0x00, 0xD5, 0x03, 0x01, 0x00, 0x02, 0x00, 0xF5, 0x03, 0x01, 0x00, 0x02, 0x00, 0xD5, + 0x03, 0x08, 0x00, 0x02, 0x00, 0xF5, 0x03, 0x08, 0x00, 0x02, 0x01, 0x4C, 0x03, 0x00, 0x00, 0x02, + 0x01, 0x4D, 0x03, 0x00, 0x00, 0x02, 0x01, 0x4C, 0x03, 0x01, 0x00, 0x02, 0x01, 0x4D, 0x03, 0x01, + 0x00, 0x02, 0x00, 0x50, 0x03, 0x01, 0x00, 0x02, 0x00, 0x70, 0x03, 0x01, 0x00, 0x02, 0x00, 0x50, + 0x03, 0x07, 0x00, 0x02, 0x00, 0x70, 0x03, 0x07, 0x00, 0x02, 0x00, 0x52, 0x03, 0x07, 0x00, 0x02, + 0x00, 0x72, 0x03, 0x07, 0x00, 0x02, 0x00, 0x52, 0x03, 0x23, 0x00, 0x02, 0x00, 0x72, 0x03, 0x23, + 0x00, 0x02, 0x1E, 0x5A, 0x03, 0x04, 0x00, 0x02, 0x1E, 0x5B, 0x03, 0x04, 0x00, 0x02, 0x00, 0x52, + 0x03, 0x31, 0x00, 0x02, 0x00, 0x72, 0x03, 0x31, 0x00, 0x02, 0x00, 0x53, 0x03, 0x07, 0x00, 0x02, + 0x00, 0x73, 0x03, 0x07, 0x00, 0x02, 0x00, 0x53, 0x03, 0x23, 0x00, 0x02, 0x00, 0x73, 0x03, 0x23, + 0x00, 0x02, 0x01, 0x5A, 0x03, 0x07, 0x00, 0x02, 0x01, 0x5B, 0x03, 0x07, 0x00, 0x02, 0x01, 0x60, + 0x03, 0x07, 0x00, 0x02, 0x01, 0x61, 0x03, 0x07, 0x00, 0x02, 0x1E, 0x60, 0x03, 0x23, 0x00, 0x02, + 0x1E, 0x61, 0x03, 0x23, 0x00, 0x02, 0x00, 0x54, 0x03, 0x07, 0x00, 0x02, 0x00, 0x74, 0x03, 0x07, + 0x00, 0x02, 0x00, 0x54, 0x03, 0x23, 0x00, 0x02, 0x00, 0x74, 0x03, 0x23, 0x00, 0x02, 0x00, 0x54, + 0x03, 0x31, 0x00, 0x02, 0x00, 0x74, 0x03, 0x31, 0x00, 0x02, 0x00, 0x54, 0x03, 0x2D, 0x00, 0x02, + 0x00, 0x74, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x55, 0x03, 0x24, 0x00, 0x02, 0x00, 0x75, 0x03, 0x24, + 0x00, 0x02, 0x00, 0x55, 0x03, 0x30, 0x00, 0x02, 0x00, 0x75, 0x03, 0x30, 0x00, 0x02, 0x00, 0x55, + 0x03, 0x2D, 0x00, 0x02, 0x00, 0x75, 0x03, 0x2D, 0x00, 0x02, 0x01, 0x68, 0x03, 0x01, 0x00, 0x02, + 0x01, 0x69, 0x03, 0x01, 0x00, 0x02, 0x01, 0x6A, 0x03, 0x08, 0x00, 0x02, 0x01, 0x6B, 0x03, 0x08, + 0x00, 0x02, 0x00, 0x56, 0x03, 0x03, 0x00, 0x02, 0x00, 0x76, 0x03, 0x03, 0x00, 0x02, 0x00, 0x56, + 0x03, 0x23, 0x00, 0x02, 0x00, 0x76, 0x03, 0x23, 0x00, 0x02, 0x00, 0x57, 0x03, 0x00, 0x00, 0x02, + 0x00, 0x77, 0x03, 0x00, 0x00, 0x02, 0x00, 0x57, 0x03, 0x01, 0x00, 0x02, 0x00, 0x77, 0x03, 0x01, + 0x00, 0x02, 0x00, 0x57, 0x03, 0x08, 0x00, 0x02, 0x00, 0x77, 0x03, 0x08, 0x00, 0x02, 0x00, 0x57, + 0x03, 0x07, 0x00, 0x02, 0x00, 0x77, 0x03, 0x07, 0x00, 0x02, 0x00, 0x57, 0x03, 0x23, 0x00, 0x02, + 0x00, 0x77, 0x03, 0x23, 0x00, 0x02, 0x00, 0x58, 0x03, 0x07, 0x00, 0x02, 0x00, 0x78, 0x03, 0x07, + 0x00, 0x02, 0x00, 0x58, 0x03, 0x08, 0x00, 0x02, 0x00, 0x78, 0x03, 0x08, 0x00, 0x02, 0x00, 0x59, + 0x03, 0x07, 0x00, 0x02, 0x00, 0x79, 0x03, 0x07, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x02, 0x00, 0x02, + 0x00, 0x7A, 0x03, 0x02, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x23, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x23, + 0x00, 0x02, 0x00, 0x5A, 0x03, 0x31, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x31, 0x00, 0x02, 0x00, 0x68, + 0x03, 0x31, 0x00, 0x02, 0x00, 0x74, 0x03, 0x08, 0x00, 0x02, 0x00, 0x77, 0x03, 0x0A, 0x00, 0x02, + 0x00, 0x79, 0x03, 0x0A, 0x00, 0x02, 0x01, 0x7F, 0x03, 0x07, 0x00, 0x02, 0x00, 0x41, 0x03, 0x23, + 0x00, 0x02, 0x00, 0x61, 0x03, 0x23, 0x00, 0x02, 0x00, 0x41, 0x03, 0x09, 0x00, 0x02, 0x00, 0x61, + 0x03, 0x09, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x01, 0x00, 0x02, 0x00, 0xE2, 0x03, 0x01, 0x00, 0x02, + 0x00, 0xC2, 0x03, 0x00, 0x00, 0x02, 0x00, 0xE2, 0x03, 0x00, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x09, + 0x00, 0x02, 0x00, 0xE2, 0x03, 0x09, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x03, 0x00, 0x02, 0x00, 0xE2, + 0x03, 0x03, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x23, 0x00, 0x02, 0x00, 0xE2, 0x03, 0x23, 0x00, 0x02, + 0x01, 0x02, 0x03, 0x01, 0x00, 0x02, 0x01, 0x03, 0x03, 0x01, 0x00, 0x02, 0x01, 0x02, 0x03, 0x00, + 0x00, 0x02, 0x01, 0x03, 0x03, 0x00, 0x00, 0x02, 0x01, 0x02, 0x03, 0x09, 0x00, 0x02, 0x01, 0x03, + 0x03, 0x09, 0x00, 0x02, 0x01, 0x02, 0x03, 0x03, 0x00, 0x02, 0x01, 0x03, 0x03, 0x03, 0x00, 0x02, + 0x01, 0x02, 0x03, 0x23, 0x00, 0x02, 0x01, 0x03, 0x03, 0x23, 0x00, 0x02, 0x00, 0x45, 0x03, 0x23, + 0x00, 0x02, 0x00, 0x65, 0x03, 0x23, 0x00, 0x02, 0x00, 0x45, 0x03, 0x09, 0x00, 0x02, 0x00, 0x65, + 0x03, 0x09, 0x00, 0x02, 0x00, 0x45, 0x03, 0x03, 0x00, 0x02, 0x00, 0x65, 0x03, 0x03, 0x00, 0x02, + 0x00, 0xCA, 0x03, 0x01, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x01, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x00, + 0x00, 0x02, 0x00, 0xEA, 0x03, 0x00, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x09, 0x00, 0x02, 0x00, 0xEA, + 0x03, 0x09, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x03, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x03, 0x00, 0x02, + 0x00, 0xCA, 0x03, 0x23, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x23, 0x00, 0x02, 0x00, 0x49, 0x03, 0x09, + 0x00, 0x02, 0x00, 0x69, 0x03, 0x09, 0x00, 0x02, 0x00, 0x49, 0x03, 0x23, 0x00, 0x02, 0x00, 0x69, + 0x03, 0x23, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x23, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x23, 0x00, 0x02, + 0x00, 0x4F, 0x03, 0x09, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x09, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x01, + 0x00, 0x02, 0x00, 0xF4, 0x03, 0x01, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x00, 0x00, 0x02, 0x00, 0xF4, + 0x03, 0x00, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x09, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x09, 0x00, 0x02, + 0x00, 0xD4, 0x03, 0x03, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x03, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x23, + 0x00, 0x02, 0x00, 0xF4, 0x03, 0x23, 0x00, 0x02, 0x00, 0xD3, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xF3, + 0x03, 0x1B, 0x00, 0x02, 0x00, 0xD2, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xF2, 0x03, 0x1B, 0x00, 0x02, + 0x01, 0xA0, 0x03, 0x09, 0x00, 0x02, 0x01, 0xA1, 0x03, 0x09, 0x00, 0x02, 0x00, 0xD5, 0x03, 0x1B, + 0x00, 0x02, 0x00, 0xF5, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x23, 0x00, 0x02, 0x01, 0xA1, + 0x03, 0x23, 0x00, 0x02, 0x00, 0x55, 0x03, 0x23, 0x00, 0x02, 0x00, 0x75, 0x03, 0x23, 0x00, 0x02, + 0x00, 0x55, 0x03, 0x09, 0x00, 0x02, 0x00, 0x75, 0x03, 0x09, 0x00, 0x02, 0x00, 0xDA, 0x03, 0x1B, + 0x00, 0x02, 0x00, 0xFA, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xD9, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xF9, + 0x03, 0x1B, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x09, 0x00, 0x02, 0x01, 0xB0, 0x03, 0x09, 0x00, 0x02, + 0x01, 0x68, 0x03, 0x1B, 0x00, 0x02, 0x01, 0x69, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x23, + 0x00, 0x02, 0x01, 0xB0, 0x03, 0x23, 0x00, 0x02, 0x00, 0x59, 0x03, 0x00, 0x00, 0x02, 0x00, 0x79, + 0x03, 0x00, 0x00, 0x02, 0x00, 0x59, 0x03, 0x23, 0x00, 0x02, 0x00, 0x79, 0x03, 0x23, 0x00, 0x02, + 0x00, 0x59, 0x03, 0x09, 0x00, 0x02, 0x00, 0x79, 0x03, 0x09, 0x00, 0x02, 0x00, 0x59, 0x03, 0x03, + 0x00, 0x02, 0x00, 0x79, 0x03, 0x03, 0x00, 0x02, 0x00, 0x41, 0x03, 0x0A, 0x00, 0x01, 0x01, 0xF2, + 0x00, 0xC0, 0x00, 0xC1, 0x00, 0xC2, 0x00, 0xC3, 0x00, 0xC4, 0x00, 0xC5, 0x00, 0xC7, 0x00, 0xC8, + 0x00, 0xC9, 0x00, 0xCA, 0x00, 0xCB, 0x00, 0xCC, 0x00, 0xCD, 0x00, 0xCE, 0x00, 0xCF, 0x00, 0xD1, + 0x00, 0xD2, 0x00, 0xD3, 0x00, 0xD4, 0x00, 0xD5, 0x00, 0xD6, 0x00, 0xD9, 0x00, 0xDA, 0x00, 0xDB, + 0x00, 0xDC, 0x00, 0xDD, 0x00, 0xE0, 0x00, 0xE1, 0x00, 0xE2, 0x00, 0xE3, 0x00, 0xE4, 0x00, 0xE5, + 0x00, 0xE7, 0x00, 0xE8, 0x00, 0xE9, 0x00, 0xEA, 0x00, 0xEB, 0x00, 0xEC, 0x00, 0xED, 0x00, 0xEE, + 0x00, 0xEF, 0x00, 0xF1, 0x00, 0xF2, 0x00, 0xF3, 0x00, 0xF4, 0x00, 0xF5, 0x00, 0xF6, 0x00, 0xF9, + 0x00, 0xFA, 0x00, 0xFB, 0x00, 0xFC, 0x00, 0xFD, 0x00, 0xFF, 0x01, 0x00, 0x01, 0x01, 0x01, 0x02, + 0x01, 0x03, 0x01, 0x04, 0x01, 0x05, 0x01, 0x06, 0x01, 0x07, 0x01, 0x08, 0x01, 0x09, 0x01, 0x0A, + 0x01, 0x0B, 0x01, 0x0C, 0x01, 0x0D, 0x01, 0x0E, 0x01, 0x0F, 0x01, 0x12, 0x01, 0x13, 0x01, 0x14, + 0x01, 0x15, 0x01, 0x16, 0x01, 0x17, 0x01, 0x18, 0x01, 0x19, 0x01, 0x1A, 0x01, 0x1B, 0x01, 0x1C, + 0x01, 0x1D, 0x01, 0x1E, 0x01, 0x1F, 0x01, 0x20, 0x01, 0x21, 0x01, 0x22, 0x01, 0x23, 0x01, 0x24, + 0x01, 0x25, 0x01, 0x28, 0x01, 0x29, 0x01, 0x2A, 0x01, 0x2B, 0x01, 0x2C, 0x01, 0x2D, 0x01, 0x2E, + 0x01, 0x2F, 0x01, 0x30, 0x01, 0x34, 0x01, 0x35, 0x01, 0x36, 0x01, 0x37, 0x01, 0x39, 0x01, 0x3A, + 0x01, 0x3B, 0x01, 0x3C, 0x01, 0x3D, 0x01, 0x3E, 0x01, 0x43, 0x01, 0x44, 0x01, 0x45, 0x01, 0x46, + 0x01, 0x47, 0x01, 0x48, 0x01, 0x4C, 0x01, 0x4D, 0x01, 0x4E, 0x01, 0x4F, 0x01, 0x50, 0x01, 0x51, + 0x01, 0x54, 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, 0x58, 0x01, 0x59, 0x01, 0x5A, 0x01, 0x5B, + 0x01, 0x5C, 0x01, 0x5D, 0x01, 0x5E, 0x01, 0x5F, 0x01, 0x60, 0x01, 0x61, 0x01, 0x62, 0x01, 0x63, + 0x01, 0x64, 0x01, 0x65, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6A, 0x01, 0x6B, 0x01, 0x6C, 0x01, 0x6D, + 0x01, 0x6E, 0x01, 0x6F, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, + 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7A, 0x01, 0x7B, 0x01, 0x7C, 0x01, 0x7D, + 0x01, 0x7E, 0x01, 0xA0, 0x01, 0xA1, 0x01, 0xAF, 0x01, 0xB0, 0x01, 0xCD, 0x01, 0xCE, 0x01, 0xCF, + 0x01, 0xD0, 0x01, 0xD1, 0x01, 0xD2, 0x01, 0xD3, 0x01, 0xD4, 0x01, 0xD5, 0x01, 0xD6, 0x01, 0xD7, + 0x01, 0xD8, 0x01, 0xD9, 0x01, 0xDA, 0x01, 0xDB, 0x01, 0xDC, 0x01, 0xDE, 0x01, 0xDF, 0x01, 0xE0, + 0x01, 0xE1, 0x01, 0xE2, 0x01, 0xE3, 0x01, 0xE6, 0x01, 0xE7, 0x01, 0xE8, 0x01, 0xE9, 0x01, 0xEA, + 0x01, 0xEB, 0x01, 0xEC, 0x01, 0xED, 0x01, 0xEE, 0x01, 0xEF, 0x01, 0xF0, 0x01, 0xF4, 0x01, 0xF5, + 0x01, 0xF8, 0x01, 0xF9, 0x01, 0xFA, 0x01, 0xFB, 0x01, 0xFC, 0x01, 0xFD, 0x01, 0xFE, 0x01, 0xFF, + 0x02, 0x00, 0x02, 0x01, 0x02, 0x02, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, 0x07, + 0x02, 0x08, 0x02, 0x09, 0x02, 0x0A, 0x02, 0x0B, 0x02, 0x0C, 0x02, 0x0D, 0x02, 0x0E, 0x02, 0x0F, + 0x02, 0x10, 0x02, 0x11, 0x02, 0x12, 0x02, 0x13, 0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, + 0x02, 0x18, 0x02, 0x19, 0x02, 0x1A, 0x02, 0x1B, 0x02, 0x1E, 0x02, 0x1F, 0x02, 0x26, 0x02, 0x27, + 0x02, 0x28, 0x02, 0x29, 0x02, 0x2A, 0x02, 0x2B, 0x02, 0x2C, 0x02, 0x2D, 0x02, 0x2E, 0x02, 0x2F, + 0x02, 0x30, 0x02, 0x31, 0x02, 0x32, 0x02, 0x33, 0x1E, 0x00, 0x1E, 0x01, 0x1E, 0x02, 0x1E, 0x03, + 0x1E, 0x04, 0x1E, 0x05, 0x1E, 0x06, 0x1E, 0x07, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x0A, 0x1E, 0x0B, + 0x1E, 0x0C, 0x1E, 0x0D, 0x1E, 0x0E, 0x1E, 0x0F, 0x1E, 0x10, 0x1E, 0x11, 0x1E, 0x12, 0x1E, 0x13, + 0x1E, 0x14, 0x1E, 0x15, 0x1E, 0x16, 0x1E, 0x17, 0x1E, 0x18, 0x1E, 0x19, 0x1E, 0x1A, 0x1E, 0x1B, + 0x1E, 0x1C, 0x1E, 0x1D, 0x1E, 0x1E, 0x1E, 0x1F, 0x1E, 0x20, 0x1E, 0x21, 0x1E, 0x22, 0x1E, 0x23, + 0x1E, 0x24, 0x1E, 0x25, 0x1E, 0x26, 0x1E, 0x27, 0x1E, 0x28, 0x1E, 0x29, 0x1E, 0x2A, 0x1E, 0x2B, + 0x1E, 0x2C, 0x1E, 0x2D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, 0x1E, 0x31, 0x1E, 0x32, 0x1E, 0x33, + 0x1E, 0x34, 0x1E, 0x35, 0x1E, 0x36, 0x1E, 0x37, 0x1E, 0x38, 0x1E, 0x39, 0x1E, 0x3A, 0x1E, 0x3B, + 0x1E, 0x3C, 0x1E, 0x3D, 0x1E, 0x3E, 0x1E, 0x3F, 0x1E, 0x40, 0x1E, 0x41, 0x1E, 0x42, 0x1E, 0x43, + 0x1E, 0x44, 0x1E, 0x45, 0x1E, 0x46, 0x1E, 0x47, 0x1E, 0x48, 0x1E, 0x49, 0x1E, 0x4A, 0x1E, 0x4B, + 0x1E, 0x4C, 0x1E, 0x4D, 0x1E, 0x4E, 0x1E, 0x4F, 0x1E, 0x50, 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53, + 0x1E, 0x54, 0x1E, 0x55, 0x1E, 0x56, 0x1E, 0x57, 0x1E, 0x58, 0x1E, 0x59, 0x1E, 0x5A, 0x1E, 0x5B, + 0x1E, 0x5C, 0x1E, 0x5D, 0x1E, 0x5E, 0x1E, 0x5F, 0x1E, 0x60, 0x1E, 0x61, 0x1E, 0x62, 0x1E, 0x63, + 0x1E, 0x64, 0x1E, 0x65, 0x1E, 0x66, 0x1E, 0x67, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x6A, 0x1E, 0x6B, + 0x1E, 0x6C, 0x1E, 0x6D, 0x1E, 0x6E, 0x1E, 0x6F, 0x1E, 0x70, 0x1E, 0x71, 0x1E, 0x72, 0x1E, 0x73, + 0x1E, 0x74, 0x1E, 0x75, 0x1E, 0x76, 0x1E, 0x77, 0x1E, 0x78, 0x1E, 0x79, 0x1E, 0x7A, 0x1E, 0x7B, + 0x1E, 0x7C, 0x1E, 0x7D, 0x1E, 0x7E, 0x1E, 0x7F, 0x1E, 0x80, 0x1E, 0x81, 0x1E, 0x82, 0x1E, 0x83, + 0x1E, 0x84, 0x1E, 0x85, 0x1E, 0x86, 0x1E, 0x87, 0x1E, 0x88, 0x1E, 0x89, 0x1E, 0x8A, 0x1E, 0x8B, + 0x1E, 0x8C, 0x1E, 0x8D, 0x1E, 0x8E, 0x1E, 0x8F, 0x1E, 0x90, 0x1E, 0x91, 0x1E, 0x92, 0x1E, 0x93, + 0x1E, 0x94, 0x1E, 0x95, 0x1E, 0x96, 0x1E, 0x97, 0x1E, 0x98, 0x1E, 0x99, 0x1E, 0x9B, 0x1E, 0xA0, + 0x1E, 0xA1, 0x1E, 0xA2, 0x1E, 0xA3, 0x1E, 0xA4, 0x1E, 0xA5, 0x1E, 0xA6, 0x1E, 0xA7, 0x1E, 0xA8, + 0x1E, 0xA9, 0x1E, 0xAA, 0x1E, 0xAB, 0x1E, 0xAC, 0x1E, 0xAD, 0x1E, 0xAE, 0x1E, 0xAF, 0x1E, 0xB0, + 0x1E, 0xB1, 0x1E, 0xB2, 0x1E, 0xB3, 0x1E, 0xB4, 0x1E, 0xB5, 0x1E, 0xB6, 0x1E, 0xB7, 0x1E, 0xB8, + 0x1E, 0xB9, 0x1E, 0xBA, 0x1E, 0xBB, 0x1E, 0xBC, 0x1E, 0xBD, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0, + 0x1E, 0xC1, 0x1E, 0xC2, 0x1E, 0xC3, 0x1E, 0xC4, 0x1E, 0xC5, 0x1E, 0xC6, 0x1E, 0xC7, 0x1E, 0xC8, + 0x1E, 0xC9, 0x1E, 0xCA, 0x1E, 0xCB, 0x1E, 0xCC, 0x1E, 0xCD, 0x1E, 0xCE, 0x1E, 0xCF, 0x1E, 0xD0, + 0x1E, 0xD1, 0x1E, 0xD2, 0x1E, 0xD3, 0x1E, 0xD4, 0x1E, 0xD5, 0x1E, 0xD6, 0x1E, 0xD7, 0x1E, 0xD8, + 0x1E, 0xD9, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xDE, 0x1E, 0xDF, 0x1E, 0xE0, + 0x1E, 0xE1, 0x1E, 0xE2, 0x1E, 0xE3, 0x1E, 0xE4, 0x1E, 0xE5, 0x1E, 0xE6, 0x1E, 0xE7, 0x1E, 0xE8, + 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x1E, 0xEC, 0x1E, 0xED, 0x1E, 0xEE, 0x1E, 0xEF, 0x1E, 0xF0, + 0x1E, 0xF1, 0x1E, 0xF2, 0x1E, 0xF3, 0x1E, 0xF4, 0x1E, 0xF5, 0x1E, 0xF6, 0x1E, 0xF7, 0x1E, 0xF8, + 0x1E, 0xF9, 0x21, 0x2B, 0x00, 0x01, 0x05, 0xBA, 0x00, 0xAC, 0x01, 0x5E, 0x01, 0x64, 0x01, 0x6A, + 0x01, 0x70, 0x01, 0x76, 0x01, 0x7C, 0x01, 0x82, 0x01, 0x88, 0x01, 0x8E, 0x01, 0x94, 0x01, 0x9A, + 0x01, 0xA0, 0x01, 0xA6, 0x01, 0xAC, 0x01, 0xB2, 0x01, 0xB8, 0x01, 0xBE, 0x01, 0xC4, 0x01, 0xCA, + 0x01, 0xD0, 0x01, 0xD6, 0x01, 0xDC, 0x01, 0xE2, 0x01, 0xE8, 0x01, 0xEE, 0x01, 0xF4, 0x01, 0xFA, + 0x02, 0x00, 0x02, 0x06, 0x02, 0x0C, 0x02, 0x12, 0x02, 0x18, 0x02, 0x1E, 0x02, 0x24, 0x02, 0x2A, + 0x02, 0x30, 0x02, 0x38, 0x02, 0x40, 0x02, 0x46, 0x02, 0x4C, 0x02, 0x54, 0x02, 0x5C, 0x02, 0x62, + 0x02, 0x68, 0x02, 0x70, 0x02, 0x78, 0x02, 0x80, 0x02, 0x88, 0x02, 0x8E, 0x02, 0x94, 0x02, 0x9A, + 0x02, 0xA0, 0x02, 0xA6, 0x02, 0xAC, 0x02, 0xB2, 0x02, 0xB8, 0x02, 0xBE, 0x02, 0xC4, 0x02, 0xCA, + 0x02, 0xD0, 0x02, 0xD6, 0x02, 0xDE, 0x02, 0xE6, 0x02, 0xEE, 0x02, 0xF6, 0x02, 0xFE, 0x03, 0x06, + 0x03, 0x0C, 0x03, 0x12, 0x03, 0x18, 0x03, 0x1E, 0x03, 0x24, 0x03, 0x2A, 0x03, 0x30, 0x03, 0x36, + 0x03, 0x3C, 0x03, 0x42, 0x03, 0x48, 0x03, 0x4E, 0x03, 0x54, 0x03, 0x5A, 0x03, 0x62, 0x03, 0x6A, + 0x03, 0x70, 0x03, 0x76, 0x03, 0x7C, 0x03, 0x82, 0x03, 0x8A, 0x03, 0x92, 0x03, 0x98, 0x03, 0x9E, + 0x03, 0xA4, 0x03, 0xAA, 0x03, 0xB0, 0x03, 0xB6, 0x03, 0xBE, 0x03, 0xC6, 0x03, 0xCE, 0x03, 0xD6, + 0x03, 0xDE, 0x03, 0xE6, 0x03, 0xEC, 0x03, 0xF2, 0x03, 0xF8, 0x03, 0xFE, 0x04, 0x06, 0x04, 0x0E, + 0x04, 0x14, 0x04, 0x1A, 0x04, 0x20, 0x04, 0x26, 0x04, 0x2C, 0x04, 0x32, 0x04, 0x38, 0x04, 0x3E, + 0x04, 0x46, 0x04, 0x4E, 0x04, 0x56, 0x04, 0x5E, 0x04, 0x64, 0x04, 0x6A, 0x04, 0x70, 0x04, 0x76, + 0x04, 0x7C, 0x04, 0x82, 0x04, 0x8A, 0x04, 0x92, 0x04, 0x9A, 0x04, 0xA2, 0x04, 0xA8, 0x04, 0xAE, + 0x04, 0xB4, 0x04, 0xBA, 0x04, 0xC0, 0x04, 0xC6, 0x04, 0xCE, 0x04, 0xD6, 0x04, 0xDE, 0x04, 0xE6, + 0x04, 0xEC, 0x04, 0xF2, 0x04, 0xF8, 0x04, 0xFE, 0x05, 0x04, 0x05, 0x0A, 0x05, 0x12, 0x05, 0x1A, + 0x05, 0x22, 0x05, 0x2A, 0x05, 0x30, 0x05, 0x36, 0x05, 0x3C, 0x05, 0x42, 0x05, 0x48, 0x05, 0x4E, + 0x05, 0x54, 0x05, 0x5A, 0x05, 0x60, 0x05, 0x66, 0x05, 0x6C, 0x05, 0x72, 0x05, 0x78, 0x05, 0x7E, + 0x05, 0x84, 0x05, 0x8A, 0x05, 0x90, 0x05, 0x96, 0x05, 0x9C, 0x05, 0xA2, 0x05, 0xA8, 0x05, 0xAE, + 0x05, 0xB4, 0x00, 0x02, 0x00, 0x41, 0x03, 0x40, 0x00, 0x02, 0x00, 0x41, 0x03, 0x41, 0x00, 0x02, + 0x00, 0x45, 0x03, 0x40, 0x00, 0x02, 0x00, 0x45, 0x03, 0x41, 0x00, 0x02, 0x00, 0x49, 0x03, 0x40, + 0x00, 0x02, 0x00, 0x49, 0x03, 0x41, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x40, 0x00, 0x02, 0x00, 0x4F, + 0x03, 0x41, 0x00, 0x02, 0x00, 0x55, 0x03, 0x40, 0x00, 0x02, 0x00, 0x55, 0x03, 0x41, 0x00, 0x02, + 0x00, 0x59, 0x03, 0x41, 0x00, 0x02, 0x00, 0x61, 0x03, 0x40, 0x00, 0x02, 0x00, 0x61, 0x03, 0x41, + 0x00, 0x02, 0x00, 0x65, 0x03, 0x40, 0x00, 0x02, 0x00, 0x65, 0x03, 0x41, 0x00, 0x02, 0x00, 0x69, + 0x03, 0x40, 0x00, 0x02, 0x00, 0x69, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x40, 0x00, 0x02, + 0x00, 0x6F, 0x03, 0x41, 0x00, 0x02, 0x00, 0x75, 0x03, 0x40, 0x00, 0x02, 0x00, 0x75, 0x03, 0x41, + 0x00, 0x02, 0x00, 0x79, 0x03, 0x41, 0x00, 0x02, 0x00, 0x43, 0x03, 0x41, 0x00, 0x02, 0x00, 0x63, + 0x03, 0x41, 0x00, 0x02, 0x21, 0x2A, 0x03, 0x27, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x41, 0x00, 0x02, + 0x00, 0x6C, 0x03, 0x41, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x41, + 0x00, 0x02, 0x00, 0x52, 0x03, 0x41, 0x00, 0x02, 0x00, 0x72, 0x03, 0x41, 0x00, 0x02, 0x00, 0x53, + 0x03, 0x41, 0x00, 0x02, 0x00, 0x73, 0x03, 0x41, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x41, 0x00, 0x02, + 0x00, 0x7A, 0x03, 0x41, 0x00, 0x03, 0x00, 0x55, 0x03, 0x08, 0x03, 0x04, 0x00, 0x03, 0x00, 0x75, + 0x03, 0x08, 0x03, 0x04, 0x00, 0x02, 0x00, 0xDC, 0x03, 0x01, 0x00, 0x02, 0x00, 0xFC, 0x03, 0x01, + 0x00, 0x03, 0x00, 0x55, 0x03, 0x08, 0x03, 0x0C, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x0C, + 0x00, 0x02, 0x00, 0xDC, 0x03, 0x40, 0x00, 0x02, 0x00, 0xFC, 0x03, 0x40, 0x00, 0x03, 0x00, 0x41, + 0x03, 0x08, 0x03, 0x04, 0x00, 0x03, 0x00, 0x61, 0x03, 0x08, 0x03, 0x04, 0x00, 0x03, 0x00, 0x41, + 0x03, 0x07, 0x03, 0x04, 0x00, 0x03, 0x00, 0x61, 0x03, 0x07, 0x03, 0x04, 0x00, 0x02, 0x21, 0x2A, + 0x03, 0x0C, 0x00, 0x02, 0x01, 0xEA, 0x03, 0x04, 0x00, 0x02, 0x01, 0xEB, 0x03, 0x04, 0x00, 0x02, + 0x00, 0x47, 0x03, 0x41, 0x00, 0x02, 0x00, 0x67, 0x03, 0x41, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x40, + 0x00, 0x02, 0x00, 0x6E, 0x03, 0x40, 0x00, 0x02, 0x00, 0xC5, 0x03, 0x41, 0x00, 0x02, 0x00, 0xE5, + 0x03, 0x41, 0x00, 0x02, 0x00, 0xC6, 0x03, 0x41, 0x00, 0x02, 0x00, 0xE6, 0x03, 0x41, 0x00, 0x02, + 0x00, 0xD8, 0x03, 0x41, 0x00, 0x02, 0x00, 0xF8, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x08, + 0x03, 0x04, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x08, 0x03, 0x04, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, + 0x03, 0x04, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x03, 0x03, 0x04, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x07, + 0x03, 0x04, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x07, 0x03, 0x04, 0x00, 0x02, 0x00, 0xC7, 0x03, 0x41, + 0x00, 0x02, 0x00, 0xE7, 0x03, 0x41, 0x00, 0x02, 0x01, 0x12, 0x03, 0x40, 0x00, 0x02, 0x01, 0x13, + 0x03, 0x40, 0x00, 0x02, 0x01, 0x12, 0x03, 0x41, 0x00, 0x02, 0x01, 0x13, 0x03, 0x41, 0x00, 0x02, + 0x02, 0x28, 0x03, 0x06, 0x00, 0x02, 0x02, 0x29, 0x03, 0x06, 0x00, 0x02, 0x00, 0xCF, 0x03, 0x01, + 0x00, 0x02, 0x00, 0xEF, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6B, + 0x03, 0x41, 0x00, 0x02, 0x21, 0x2A, 0x03, 0x23, 0x00, 0x02, 0x21, 0x2A, 0x03, 0x31, 0x00, 0x03, + 0x00, 0x4C, 0x03, 0x04, 0x03, 0x23, 0x00, 0x03, 0x00, 0x6C, 0x03, 0x04, 0x03, 0x23, 0x00, 0x02, + 0x00, 0x4D, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6D, 0x03, 0x41, 0x00, 0x02, 0x00, 0xD5, 0x03, 0x41, + 0x00, 0x02, 0x00, 0xF5, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, 0x03, 0x08, 0x00, 0x03, + 0x00, 0x6F, 0x03, 0x03, 0x03, 0x08, 0x00, 0x02, 0x01, 0x4C, 0x03, 0x40, 0x00, 0x02, 0x01, 0x4D, + 0x03, 0x40, 0x00, 0x02, 0x01, 0x4C, 0x03, 0x41, 0x00, 0x02, 0x01, 0x4D, 0x03, 0x41, 0x00, 0x02, + 0x00, 0x50, 0x03, 0x41, 0x00, 0x02, 0x00, 0x70, 0x03, 0x41, 0x00, 0x03, 0x00, 0x52, 0x03, 0x04, + 0x03, 0x23, 0x00, 0x03, 0x00, 0x72, 0x03, 0x04, 0x03, 0x23, 0x00, 0x03, 0x00, 0x53, 0x03, 0x01, + 0x03, 0x07, 0x00, 0x03, 0x00, 0x73, 0x03, 0x01, 0x03, 0x07, 0x00, 0x03, 0x00, 0x53, 0x03, 0x0C, + 0x03, 0x07, 0x00, 0x03, 0x00, 0x73, 0x03, 0x0C, 0x03, 0x07, 0x00, 0x02, 0x1E, 0x62, 0x03, 0x07, + 0x00, 0x02, 0x1E, 0x63, 0x03, 0x07, 0x00, 0x02, 0x01, 0x68, 0x03, 0x41, 0x00, 0x02, 0x01, 0x69, + 0x03, 0x41, 0x00, 0x03, 0x00, 0x55, 0x03, 0x04, 0x03, 0x08, 0x00, 0x03, 0x00, 0x75, 0x03, 0x04, + 0x03, 0x08, 0x00, 0x02, 0x00, 0x57, 0x03, 0x40, 0x00, 0x02, 0x00, 0x77, 0x03, 0x40, 0x00, 0x02, + 0x00, 0x57, 0x03, 0x41, 0x00, 0x02, 0x00, 0x77, 0x03, 0x41, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x41, + 0x00, 0x02, 0x00, 0xE2, 0x03, 0x41, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x40, 0x00, 0x02, 0x00, 0xE2, + 0x03, 0x40, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, + 0x03, 0x09, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x03, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, + 0x03, 0x03, 0x00, 0x02, 0x1E, 0xA0, 0x03, 0x02, 0x00, 0x02, 0x1E, 0xA1, 0x03, 0x02, 0x00, 0x02, + 0x01, 0x02, 0x03, 0x41, 0x00, 0x02, 0x01, 0x03, 0x03, 0x41, 0x00, 0x02, 0x01, 0x02, 0x03, 0x40, + 0x00, 0x02, 0x01, 0x03, 0x03, 0x40, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x09, 0x00, 0x03, + 0x00, 0x61, 0x03, 0x06, 0x03, 0x09, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x03, 0x00, 0x03, + 0x00, 0x61, 0x03, 0x06, 0x03, 0x03, 0x00, 0x02, 0x1E, 0xA0, 0x03, 0x06, 0x00, 0x02, 0x1E, 0xA1, + 0x03, 0x06, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x41, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x41, 0x00, 0x02, + 0x00, 0xCA, 0x03, 0x40, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x40, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, + 0x03, 0x09, 0x00, 0x03, 0x00, 0x65, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, + 0x03, 0x03, 0x00, 0x03, 0x00, 0x65, 0x03, 0x02, 0x03, 0x03, 0x00, 0x02, 0x1E, 0xB8, 0x03, 0x02, + 0x00, 0x02, 0x1E, 0xB9, 0x03, 0x02, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x41, 0x00, 0x02, 0x00, 0xF4, + 0x03, 0x41, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x40, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x40, 0x00, 0x03, + 0x00, 0x4F, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, + 0x00, 0x4F, 0x03, 0x02, 0x03, 0x03, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, 0x03, 0x03, 0x00, 0x02, + 0x1E, 0xCC, 0x03, 0x02, 0x00, 0x02, 0x1E, 0xCD, 0x03, 0x02, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x01, + 0x00, 0x02, 0x01, 0xA1, 0x03, 0x01, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x00, 0x00, 0x02, 0x01, 0xA1, + 0x03, 0x00, 0x00, 0x02, 0x1E, 0xCE, 0x03, 0x1B, 0x00, 0x02, 0x1E, 0xCF, 0x03, 0x1B, 0x00, 0x02, + 0x01, 0xA0, 0x03, 0x03, 0x00, 0x02, 0x01, 0xA1, 0x03, 0x03, 0x00, 0x02, 0x1E, 0xCC, 0x03, 0x1B, + 0x00, 0x02, 0x1E, 0xCD, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x01, 0x00, 0x02, 0x01, 0xB0, + 0x03, 0x01, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x00, 0x00, 0x02, 0x01, 0xB0, 0x03, 0x00, 0x00, 0x02, + 0x1E, 0xE6, 0x03, 0x1B, 0x00, 0x02, 0x1E, 0xE7, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x03, + 0x00, 0x02, 0x01, 0xB0, 0x03, 0x03, 0x00, 0x02, 0x1E, 0xE4, 0x03, 0x1B, 0x00, 0x02, 0x1E, 0xE5, + 0x03, 0x1B, 0x00, 0x02, 0x00, 0x59, 0x03, 0x40, 0x00, 0x02, 0x00, 0x79, 0x03, 0x40, 0x00, 0x01, + 0x00, 0xAC, 0x00, 0xC0, 0x00, 0xC1, 0x00, 0xC8, 0x00, 0xC9, 0x00, 0xCC, 0x00, 0xCD, 0x00, 0xD2, + 0x00, 0xD3, 0x00, 0xD9, 0x00, 0xDA, 0x00, 0xDD, 0x00, 0xE0, 0x00, 0xE1, 0x00, 0xE8, 0x00, 0xE9, + 0x00, 0xEC, 0x00, 0xED, 0x00, 0xF2, 0x00, 0xF3, 0x00, 0xF9, 0x00, 0xFA, 0x00, 0xFD, 0x01, 0x06, + 0x01, 0x07, 0x01, 0x36, 0x01, 0x39, 0x01, 0x3A, 0x01, 0x43, 0x01, 0x44, 0x01, 0x54, 0x01, 0x55, + 0x01, 0x5A, 0x01, 0x5B, 0x01, 0x79, 0x01, 0x7A, 0x01, 0xD5, 0x01, 0xD6, 0x01, 0xD7, 0x01, 0xD8, + 0x01, 0xD9, 0x01, 0xDA, 0x01, 0xDB, 0x01, 0xDC, 0x01, 0xDE, 0x01, 0xDF, 0x01, 0xE0, 0x01, 0xE1, + 0x01, 0xE8, 0x01, 0xEC, 0x01, 0xED, 0x01, 0xF4, 0x01, 0xF5, 0x01, 0xF8, 0x01, 0xF9, 0x01, 0xFA, + 0x01, 0xFB, 0x01, 0xFC, 0x01, 0xFD, 0x01, 0xFE, 0x01, 0xFF, 0x02, 0x2A, 0x02, 0x2B, 0x02, 0x2C, + 0x02, 0x2D, 0x02, 0x30, 0x02, 0x31, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x14, 0x1E, 0x15, 0x1E, 0x16, + 0x1E, 0x17, 0x1E, 0x1C, 0x1E, 0x1D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, 0x1E, 0x31, 0x1E, 0x32, + 0x1E, 0x34, 0x1E, 0x38, 0x1E, 0x39, 0x1E, 0x3E, 0x1E, 0x3F, 0x1E, 0x4C, 0x1E, 0x4D, 0x1E, 0x4E, + 0x1E, 0x4F, 0x1E, 0x50, 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53, 0x1E, 0x54, 0x1E, 0x55, 0x1E, 0x5C, + 0x1E, 0x5D, 0x1E, 0x64, 0x1E, 0x65, 0x1E, 0x66, 0x1E, 0x67, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x78, + 0x1E, 0x79, 0x1E, 0x7A, 0x1E, 0x7B, 0x1E, 0x80, 0x1E, 0x81, 0x1E, 0x82, 0x1E, 0x83, 0x1E, 0xA4, + 0x1E, 0xA5, 0x1E, 0xA6, 0x1E, 0xA7, 0x1E, 0xA8, 0x1E, 0xA9, 0x1E, 0xAA, 0x1E, 0xAB, 0x1E, 0xAC, + 0x1E, 0xAD, 0x1E, 0xAE, 0x1E, 0xAF, 0x1E, 0xB0, 0x1E, 0xB1, 0x1E, 0xB2, 0x1E, 0xB3, 0x1E, 0xB4, + 0x1E, 0xB5, 0x1E, 0xB6, 0x1E, 0xB7, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0, 0x1E, 0xC1, 0x1E, 0xC2, + 0x1E, 0xC3, 0x1E, 0xC4, 0x1E, 0xC5, 0x1E, 0xC6, 0x1E, 0xC7, 0x1E, 0xD0, 0x1E, 0xD1, 0x1E, 0xD2, + 0x1E, 0xD3, 0x1E, 0xD4, 0x1E, 0xD5, 0x1E, 0xD6, 0x1E, 0xD7, 0x1E, 0xD8, 0x1E, 0xD9, 0x1E, 0xDA, + 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xDE, 0x1E, 0xDF, 0x1E, 0xE0, 0x1E, 0xE1, 0x1E, 0xE2, + 0x1E, 0xE3, 0x1E, 0xE8, 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x1E, 0xEC, 0x1E, 0xED, 0x1E, 0xEE, + 0x1E, 0xEF, 0x1E, 0xF0, 0x1E, 0xF1, 0x1E, 0xF2, 0x1E, 0xF3, 0x00, 0x01, 0x02, 0xFC, 0x00, 0x4F, + 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, 0x00, 0xD0, 0x00, 0xD6, + 0x00, 0xDE, 0x00, 0xE4, 0x00, 0xEA, 0x00, 0xF2, 0x00, 0xFA, 0x01, 0x02, 0x01, 0x0A, 0x01, 0x12, + 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x44, 0x01, 0x4C, + 0x01, 0x54, 0x01, 0x5C, 0x01, 0x64, 0x01, 0x6C, 0x01, 0x74, 0x01, 0x7C, 0x01, 0x84, 0x01, 0x8C, + 0x01, 0x94, 0x01, 0x9C, 0x01, 0xA4, 0x01, 0xAC, 0x01, 0xB4, 0x01, 0xBC, 0x01, 0xC4, 0x01, 0xCC, + 0x01, 0xD4, 0x01, 0xDC, 0x01, 0xE4, 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFC, 0x02, 0x04, 0x02, 0x0C, + 0x02, 0x14, 0x02, 0x1C, 0x02, 0x24, 0x02, 0x2C, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x44, 0x02, 0x4C, + 0x02, 0x54, 0x02, 0x5C, 0x02, 0x64, 0x02, 0x6C, 0x02, 0x72, 0x02, 0x78, 0x02, 0x7E, 0x02, 0x84, + 0x02, 0x8C, 0x02, 0x94, 0x02, 0x9C, 0x02, 0xA4, 0x02, 0xAC, 0x02, 0xB4, 0x02, 0xBA, 0x02, 0xC0, + 0x02, 0xC6, 0x02, 0xCC, 0x02, 0xD4, 0x02, 0xDC, 0x02, 0xE4, 0x02, 0xEC, 0x02, 0xF4, 0x00, 0x02, + 0x00, 0xDC, 0x03, 0x41, 0x00, 0x02, 0x00, 0xFC, 0x03, 0x41, 0x00, 0x03, 0x00, 0x55, 0x03, 0x08, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x00, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, + 0x03, 0x28, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x04, 0x03, 0x28, 0x00, 0x02, 0x21, 0x2B, 0x03, 0x01, + 0x00, 0x03, 0x00, 0x61, 0x03, 0x0A, 0x03, 0x01, 0x00, 0x02, 0x01, 0x06, 0x03, 0x27, 0x00, 0x02, + 0x01, 0x07, 0x03, 0x27, 0x00, 0x03, 0x00, 0x45, 0x03, 0x04, 0x03, 0x00, 0x00, 0x03, 0x00, 0x65, + 0x03, 0x04, 0x03, 0x00, 0x00, 0x03, 0x00, 0x45, 0x03, 0x04, 0x03, 0x01, 0x00, 0x03, 0x00, 0x65, + 0x03, 0x04, 0x03, 0x01, 0x00, 0x03, 0x00, 0x45, 0x03, 0x06, 0x03, 0x27, 0x00, 0x03, 0x00, 0x65, + 0x03, 0x06, 0x03, 0x27, 0x00, 0x02, 0x00, 0xCF, 0x03, 0x41, 0x00, 0x02, 0x00, 0xEF, 0x03, 0x41, + 0x00, 0x02, 0x21, 0x2A, 0x03, 0x01, 0x00, 0x03, 0x00, 0x4C, 0x03, 0x23, 0x03, 0x04, 0x00, 0x03, + 0x00, 0x6C, 0x03, 0x23, 0x03, 0x04, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, 0x03, 0x01, 0x00, 0x03, + 0x00, 0x6F, 0x03, 0x03, 0x03, 0x01, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x6F, 0x03, 0x04, 0x03, 0x00, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x01, 0x00, 0x03, + 0x00, 0x6F, 0x03, 0x04, 0x03, 0x01, 0x00, 0x03, 0x00, 0x52, 0x03, 0x23, 0x03, 0x04, 0x00, 0x03, + 0x00, 0x72, 0x03, 0x23, 0x03, 0x04, 0x00, 0x03, 0x00, 0x53, 0x03, 0x41, 0x03, 0x07, 0x00, 0x03, + 0x00, 0x73, 0x03, 0x41, 0x03, 0x07, 0x00, 0x03, 0x00, 0x53, 0x03, 0x07, 0x03, 0x23, 0x00, 0x03, + 0x00, 0x73, 0x03, 0x07, 0x03, 0x23, 0x00, 0x03, 0x00, 0x55, 0x03, 0x03, 0x03, 0x01, 0x00, 0x03, + 0x00, 0x75, 0x03, 0x03, 0x03, 0x01, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, + 0x00, 0x61, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x61, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x23, 0x00, 0x03, + 0x00, 0x61, 0x03, 0x02, 0x03, 0x23, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x01, 0x00, 0x03, + 0x00, 0x61, 0x03, 0x06, 0x03, 0x01, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x61, 0x03, 0x06, 0x03, 0x00, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x23, 0x00, 0x03, + 0x00, 0x61, 0x03, 0x06, 0x03, 0x23, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, + 0x00, 0x65, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x65, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x23, 0x00, 0x03, + 0x00, 0x65, 0x03, 0x02, 0x03, 0x23, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, + 0x00, 0x6F, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x6F, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x23, 0x00, 0x03, + 0x00, 0x6F, 0x03, 0x02, 0x03, 0x23, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x41, 0x00, 0x02, 0x01, 0xA1, + 0x03, 0x41, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x40, 0x00, 0x02, 0x01, 0xA1, 0x03, 0x40, 0x00, 0x03, + 0x00, 0x4F, 0x03, 0x09, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x09, 0x03, 0x1B, 0x00, 0x03, + 0x00, 0x4F, 0x03, 0x03, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x03, 0x03, 0x1B, 0x00, 0x03, + 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x23, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x23, 0x00, 0x02, + 0x01, 0xAF, 0x03, 0x41, 0x00, 0x02, 0x01, 0xB0, 0x03, 0x41, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x40, + 0x00, 0x02, 0x01, 0xB0, 0x03, 0x40, 0x00, 0x03, 0x00, 0x55, 0x03, 0x09, 0x03, 0x1B, 0x00, 0x03, + 0x00, 0x75, 0x03, 0x09, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, 0x03, 0x03, 0x03, 0x1B, 0x00, 0x03, + 0x00, 0x75, 0x03, 0x03, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x23, 0x00, 0x03, + 0x00, 0x75, 0x03, 0x1B, 0x03, 0x23, 0x00, 0x01, 0x00, 0x4F, 0x01, 0xD7, 0x01, 0xD8, 0x01, 0xDB, + 0x01, 0xDC, 0x01, 0xEC, 0x01, 0xED, 0x01, 0xFA, 0x01, 0xFB, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x14, + 0x1E, 0x15, 0x1E, 0x16, 0x1E, 0x17, 0x1E, 0x1C, 0x1E, 0x1D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, + 0x1E, 0x38, 0x1E, 0x39, 0x1E, 0x4C, 0x1E, 0x4D, 0x1E, 0x50, 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53, + 0x1E, 0x5C, 0x1E, 0x5D, 0x1E, 0x64, 0x1E, 0x65, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x78, 0x1E, 0x79, + 0x1E, 0xA4, 0x1E, 0xA5, 0x1E, 0xA6, 0x1E, 0xA7, 0x1E, 0xAC, 0x1E, 0xAD, 0x1E, 0xAE, 0x1E, 0xAF, + 0x1E, 0xB0, 0x1E, 0xB1, 0x1E, 0xB6, 0x1E, 0xB7, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0, 0x1E, 0xC1, + 0x1E, 0xC6, 0x1E, 0xC7, 0x1E, 0xD0, 0x1E, 0xD1, 0x1E, 0xD2, 0x1E, 0xD3, 0x1E, 0xD8, 0x1E, 0xD9, + 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xDE, 0x1E, 0xDF, 0x1E, 0xE0, 0x1E, 0xE1, + 0x1E, 0xE2, 0x1E, 0xE3, 0x1E, 0xE8, 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x1E, 0xEC, 0x1E, 0xED, + 0x1E, 0xEE, 0x1E, 0xEF, 0x1E, 0xF0, 0x1E, 0xF1, 0x00, 0x01, 0x02, 0xDC, 0x00, 0x49, 0x00, 0x98, + 0x00, 0xA0, 0x00, 0xA8, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, 0x00, 0xCE, 0x00, 0xD6, + 0x00, 0xDE, 0x00, 0xE6, 0x00, 0xEE, 0x00, 0xF6, 0x00, 0xFE, 0x01, 0x06, 0x01, 0x0E, 0x01, 0x16, + 0x01, 0x1E, 0x01, 0x26, 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x44, 0x01, 0x4C, 0x01, 0x54, + 0x01, 0x5C, 0x01, 0x64, 0x01, 0x6C, 0x01, 0x74, 0x01, 0x7C, 0x01, 0x84, 0x01, 0x8C, 0x01, 0x94, + 0x01, 0x9C, 0x01, 0xA4, 0x01, 0xAC, 0x01, 0xB4, 0x01, 0xBC, 0x01, 0xC4, 0x01, 0xCC, 0x01, 0xD4, + 0x01, 0xDC, 0x01, 0xE4, 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFC, 0x02, 0x04, 0x02, 0x0C, 0x02, 0x14, + 0x02, 0x1C, 0x02, 0x24, 0x02, 0x2C, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x44, 0x02, 0x4C, 0x02, 0x54, + 0x02, 0x5C, 0x02, 0x64, 0x02, 0x6C, 0x02, 0x74, 0x02, 0x7C, 0x02, 0x84, 0x02, 0x8C, 0x02, 0x94, + 0x02, 0x9C, 0x02, 0xA4, 0x02, 0xAC, 0x02, 0xB4, 0x02, 0xBC, 0x02, 0xC4, 0x02, 0xCC, 0x02, 0xD4, + 0x00, 0x03, 0x00, 0x55, 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x01, + 0x00, 0x03, 0x00, 0x55, 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x40, + 0x00, 0x03, 0x00, 0x4F, 0x03, 0x28, 0x03, 0x04, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x28, 0x03, 0x04, + 0x00, 0x02, 0x21, 0x2B, 0x03, 0x41, 0x00, 0x03, 0x00, 0x61, 0x03, 0x0A, 0x03, 0x41, 0x00, 0x03, + 0x00, 0x43, 0x03, 0x01, 0x03, 0x27, 0x00, 0x03, 0x00, 0x63, 0x03, 0x01, 0x03, 0x27, 0x00, 0x03, + 0x00, 0x45, 0x03, 0x04, 0x03, 0x40, 0x00, 0x03, 0x00, 0x65, 0x03, 0x04, 0x03, 0x40, 0x00, 0x03, + 0x00, 0x45, 0x03, 0x04, 0x03, 0x41, 0x00, 0x03, 0x00, 0x65, 0x03, 0x04, 0x03, 0x41, 0x00, 0x03, + 0x00, 0x45, 0x03, 0x27, 0x03, 0x06, 0x00, 0x03, 0x00, 0x65, 0x03, 0x27, 0x03, 0x06, 0x00, 0x03, + 0x00, 0x49, 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, 0x00, 0x69, 0x03, 0x08, 0x03, 0x01, 0x00, 0x02, + 0x21, 0x2A, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, 0x03, 0x41, 0x00, 0x03, 0x00, 0x6F, + 0x03, 0x03, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x40, 0x00, 0x03, 0x00, 0x6F, + 0x03, 0x04, 0x03, 0x40, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x41, 0x00, 0x03, 0x00, 0x6F, + 0x03, 0x04, 0x03, 0x41, 0x00, 0x03, 0x00, 0x53, 0x03, 0x23, 0x03, 0x07, 0x00, 0x03, 0x00, 0x73, + 0x03, 0x23, 0x03, 0x07, 0x00, 0x03, 0x00, 0x55, 0x03, 0x03, 0x03, 0x41, 0x00, 0x03, 0x00, 0x75, + 0x03, 0x03, 0x03, 0x41, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x61, + 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x61, + 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x41, 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x61, + 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x41, 0x00, 0x03, 0x00, 0x61, + 0x03, 0x06, 0x03, 0x41, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x40, 0x00, 0x03, 0x00, 0x61, + 0x03, 0x06, 0x03, 0x40, 0x00, 0x03, 0x00, 0x41, 0x03, 0x23, 0x03, 0x06, 0x00, 0x03, 0x00, 0x61, + 0x03, 0x23, 0x03, 0x06, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x65, + 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x65, + 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x45, 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x65, + 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x6F, + 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x6F, + 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x6F, + 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x01, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, + 0x03, 0x01, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x00, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, + 0x03, 0x00, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x09, 0x00, 0x03, 0x00, 0x6F, + 0x03, 0x1B, 0x03, 0x09, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x03, 0x00, 0x03, 0x00, 0x6F, + 0x03, 0x1B, 0x03, 0x03, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x23, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, + 0x03, 0x23, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, 0x03, 0x01, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, + 0x03, 0x01, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, 0x03, 0x00, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, + 0x03, 0x00, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x09, 0x00, 0x03, 0x00, 0x75, + 0x03, 0x1B, 0x03, 0x09, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x03, 0x00, 0x03, 0x00, 0x75, + 0x03, 0x1B, 0x03, 0x03, 0x00, 0x03, 0x00, 0x55, 0x03, 0x23, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, + 0x03, 0x23, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x49, 0x01, 0xD7, 0x01, 0xD8, 0x01, 0xDB, 0x01, 0xDC, + 0x01, 0xEC, 0x01, 0xED, 0x01, 0xFA, 0x01, 0xFB, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x14, 0x1E, 0x15, + 0x1E, 0x16, 0x1E, 0x17, 0x1E, 0x1C, 0x1E, 0x1D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, 0x1E, 0x4C, + 0x1E, 0x4D, 0x1E, 0x50, 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x78, + 0x1E, 0x79, 0x1E, 0xA4, 0x1E, 0xA5, 0x1E, 0xA6, 0x1E, 0xA7, 0x1E, 0xAC, 0x1E, 0xAD, 0x1E, 0xAE, + 0x1E, 0xAF, 0x1E, 0xB0, 0x1E, 0xB1, 0x1E, 0xB6, 0x1E, 0xB7, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0, + 0x1E, 0xC1, 0x1E, 0xC6, 0x1E, 0xC7, 0x1E, 0xD0, 0x1E, 0xD1, 0x1E, 0xD2, 0x1E, 0xD3, 0x1E, 0xD8, + 0x1E, 0xD9, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xDE, 0x1E, 0xDF, 0x1E, 0xE0, + 0x1E, 0xE1, 0x1E, 0xE2, 0x1E, 0xE3, 0x1E, 0xE8, 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x1E, 0xEC, + 0x1E, 0xED, 0x1E, 0xEE, 0x1E, 0xEF, 0x1E, 0xF0, 0x1E, 0xF1, 0x00, 0x01, 0x00, 0x9C, 0x00, 0x0F, + 0x00, 0x24, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, + 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C, 0x00, 0x84, 0x00, 0x8C, 0x00, 0x94, 0x00, 0x03, + 0x00, 0x55, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, + 0x00, 0x41, 0x03, 0x0A, 0x03, 0x01, 0x00, 0x03, 0x00, 0x43, 0x03, 0x27, 0x03, 0x01, 0x00, 0x03, + 0x00, 0x63, 0x03, 0x27, 0x03, 0x01, 0x00, 0x03, 0x00, 0x49, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, + 0x00, 0x69, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x01, 0x00, 0x03, + 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x01, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x00, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x01, 0x00, 0x03, + 0x00, 0x75, 0x03, 0x1B, 0x03, 0x01, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x75, 0x03, 0x1B, 0x03, 0x00, 0x00, 0x01, 0x00, 0x0F, 0x01, 0xD7, 0x01, 0xD8, 0x01, 0xFA, + 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, + 0x1E, 0xE8, 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x00, 0x01, 0x00, 0x74, 0x00, 0x0B, 0x00, 0x1C, + 0x00, 0x24, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, + 0x00, 0x64, 0x00, 0x6C, 0x00, 0x03, 0x00, 0x41, 0x03, 0x0A, 0x03, 0x41, 0x00, 0x03, 0x00, 0x43, + 0x03, 0x27, 0x03, 0x41, 0x00, 0x03, 0x00, 0x63, 0x03, 0x27, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, + 0x03, 0x1B, 0x03, 0x41, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, + 0x03, 0x1B, 0x03, 0x40, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x40, 0x00, 0x03, 0x00, 0x55, + 0x03, 0x1B, 0x03, 0x41, 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, 0x03, 0x41, 0x00, 0x03, 0x00, 0x55, + 0x03, 0x1B, 0x03, 0x40, 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, 0x03, 0x40, 0x00, 0x01, 0x00, 0x0B, + 0x01, 0xFA, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xE8, + 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x00, 0x01, 0x00, 0x6A, 0x00, 0x0A, 0x00, 0x1A, 0x00, 0x22, + 0x00, 0x2A, 0x00, 0x32, 0x00, 0x3A, 0x00, 0x42, 0x00, 0x4A, 0x00, 0x52, 0x00, 0x5A, 0x00, 0x62, + 0x00, 0x03, 0x00, 0x43, 0x03, 0x41, 0x03, 0x27, 0x00, 0x03, 0x00, 0x63, 0x03, 0x41, 0x03, 0x27, + 0x00, 0x03, 0x00, 0x4F, 0x03, 0x41, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x41, 0x03, 0x1B, + 0x00, 0x03, 0x00, 0x4F, 0x03, 0x40, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x40, 0x03, 0x1B, + 0x00, 0x03, 0x00, 0x55, 0x03, 0x41, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x41, 0x03, 0x1B, + 0x00, 0x03, 0x00, 0x55, 0x03, 0x40, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x40, 0x03, 0x1B, + 0x00, 0x01, 0x00, 0x0A, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, + 0x1E, 0xE8, 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, + 0x00, 0x01, 0x00, 0x26, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x1C, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, + 0x0D, 0x4A, 0x00, 0x02, 0x0D, 0x3E, 0x0D, 0x4C, 0x00, 0x02, 0x0D, 0x57, 0x00, 0x01, 0x00, 0x04, + 0x0D, 0x4B, 0x00, 0x02, 0x0D, 0x3E, 0x00, 0x01, 0x00, 0x02, 0x0D, 0x46, 0x0D, 0x47, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x12, + 0x00, 0x18, 0x00, 0x02, 0x0D, 0x46, 0x0D, 0x3E, 0x00, 0x02, 0x0D, 0x47, 0x0D, 0x3E, 0x00, 0x02, + 0x0D, 0x46, 0x0D, 0x57, 0x00, 0x01, 0x00, 0x03, 0x0D, 0x4A, 0x0D, 0x4B, 0x0D, 0x4C, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, + 0x00, 0x04, 0x10, 0x26, 0x00, 0x02, 0x10, 0x2E, 0x00, 0x01, 0x00, 0x01, 0x10, 0x25, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, + 0x10, 0x25, 0x10, 0x2E, 0x00, 0x01, 0x00, 0x01, 0x10, 0x26, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x01, 0x00, 0x3A, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x16, 0x00, 0x20, 0x00, 0x01, + 0x00, 0x04, 0x0B, 0x5C, 0x00, 0x02, 0x0B, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x0B, 0x5D, 0x00, 0x02, + 0x0B, 0x3C, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x0B, 0x4B, 0x00, 0x02, 0x0B, 0x3E, + 0x0B, 0x48, 0x00, 0x02, 0x0B, 0x56, 0x0B, 0x4C, 0x00, 0x02, 0x0B, 0x57, 0x00, 0x01, 0x00, 0x03, + 0x0B, 0x21, 0x0B, 0x22, 0x0B, 0x47, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, + 0x00, 0x2E, 0x00, 0x05, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x02, + 0x0B, 0x47, 0x0B, 0x56, 0x00, 0x02, 0x0B, 0x47, 0x0B, 0x3E, 0x00, 0x02, 0x0B, 0x47, 0x0B, 0x57, + 0x00, 0x02, 0x0B, 0x21, 0x0B, 0x3C, 0x00, 0x02, 0x0B, 0x22, 0x0B, 0x3C, 0x00, 0x01, 0x00, 0x05, + 0x0B, 0x48, 0x0B, 0x4B, 0x0B, 0x4C, 0x0B, 0x5C, 0x0B, 0x5D, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x01, 0x00, 0x38, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x2E, 0x00, 0x04, 0x00, 0x0A, + 0x00, 0x10, 0x00, 0x18, 0x00, 0x1E, 0x0D, 0xDA, 0x00, 0x02, 0x0D, 0xCA, 0x0D, 0xDD, 0x00, 0x03, + 0x0D, 0xCF, 0x0D, 0xCA, 0x0D, 0xDC, 0x00, 0x02, 0x0D, 0xCF, 0x0D, 0xDE, 0x00, 0x02, 0x0D, 0xDF, + 0x00, 0x01, 0x00, 0x04, 0x0D, 0xDD, 0x00, 0x02, 0x0D, 0xCA, 0x00, 0x01, 0x00, 0x02, 0x0D, 0xD9, + 0x0D, 0xDC, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x3C, 0x00, 0x01, 0x00, 0x26, + 0x00, 0x04, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x02, 0x0D, 0xD9, 0x0D, 0xCA, + 0x00, 0x02, 0x0D, 0xD9, 0x0D, 0xCF, 0x00, 0x02, 0x0D, 0xDC, 0x0D, 0xCA, 0x00, 0x02, 0x0D, 0xD9, + 0x0D, 0xDF, 0x00, 0x01, 0x00, 0x04, 0x0D, 0xDA, 0x0D, 0xDC, 0x0D, 0xDD, 0x0D, 0xDE, 0x00, 0x01, + 0x00, 0x10, 0x00, 0x01, 0x00, 0x08, 0x00, 0x03, 0x0D, 0xD9, 0x0D, 0xCF, 0x0D, 0xCA, 0x00, 0x01, + 0x00, 0x01, 0x0D, 0xDD, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x32, + 0x00, 0x03, 0x00, 0x0C, 0x00, 0x16, 0x00, 0x28, 0x00, 0x01, 0x00, 0x04, 0x0B, 0x94, 0x00, 0x02, + 0x0B, 0xD7, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x0B, 0xCA, 0x00, 0x02, 0x0B, 0xBE, 0x0B, 0xCC, + 0x00, 0x02, 0x0B, 0xD7, 0x00, 0x01, 0x00, 0x04, 0x0B, 0xCB, 0x00, 0x02, 0x0B, 0xBE, 0x00, 0x01, + 0x00, 0x03, 0x0B, 0x92, 0x0B, 0xC6, 0x0B, 0xC7, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, + 0x00, 0x01, 0x00, 0x26, 0x00, 0x04, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x02, + 0x0B, 0x92, 0x0B, 0xD7, 0x00, 0x02, 0x0B, 0xC6, 0x0B, 0xBE, 0x00, 0x02, 0x0B, 0xC7, 0x0B, 0xBE, + 0x00, 0x02, 0x0B, 0xC6, 0x0B, 0xD7, 0x00, 0x01, 0x00, 0x04, 0x0B, 0x94, 0x0B, 0xCA, 0x0B, 0xCB, + 0x0B, 0xCC, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x01, 0x00, 0x04, 0x0C, 0x48, 0x00, 0x02, 0x0C, 0x56, 0x00, 0x01, 0x00, 0x01, + 0x0C, 0x46, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x02, 0x0C, 0x46, 0x0C, 0x56, 0x00, 0x01, 0x00, 0x01, 0x0C, 0x48, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0xEE, 0x00, 0x12, 0x00, 0x2A, 0x00, 0x34, + 0x00, 0x3E, 0x00, 0x48, 0x00, 0x52, 0x00, 0x5C, 0x00, 0x66, 0x00, 0x80, 0x00, 0x8A, 0x00, 0x94, + 0x00, 0x9E, 0x00, 0xA8, 0x00, 0xB2, 0x00, 0xBC, 0x00, 0xC6, 0x00, 0xD0, 0x00, 0xDA, 0x00, 0xE4, + 0x00, 0x01, 0x00, 0x04, 0x0F, 0x69, 0x00, 0x02, 0x0F, 0xB5, 0x00, 0x01, 0x00, 0x04, 0x0F, 0x43, + 0x00, 0x02, 0x0F, 0xB7, 0x00, 0x01, 0x00, 0x04, 0x0F, 0x4D, 0x00, 0x02, 0x0F, 0xB7, 0x00, 0x01, + 0x00, 0x04, 0x0F, 0x52, 0x00, 0x02, 0x0F, 0xB7, 0x00, 0x01, 0x00, 0x04, 0x0F, 0x57, 0x00, 0x02, + 0x0F, 0xB7, 0x00, 0x01, 0x00, 0x04, 0x0F, 0x5C, 0x00, 0x02, 0x0F, 0xB7, 0x00, 0x03, 0x00, 0x08, + 0x00, 0x0E, 0x00, 0x14, 0x0F, 0x73, 0x00, 0x02, 0x0F, 0x72, 0x0F, 0x75, 0x00, 0x02, 0x0F, 0x74, + 0x0F, 0x81, 0x00, 0x02, 0x0F, 0x80, 0x00, 0x01, 0x00, 0x04, 0x0F, 0x73, 0x00, 0x02, 0x0F, 0x71, + 0x00, 0x01, 0x00, 0x04, 0x0F, 0x75, 0x00, 0x02, 0x0F, 0x71, 0x00, 0x01, 0x00, 0x04, 0x0F, 0x81, + 0x00, 0x02, 0x0F, 0x71, 0x00, 0x01, 0x00, 0x04, 0x0F, 0xB9, 0x00, 0x02, 0x0F, 0xB5, 0x00, 0x01, + 0x00, 0x04, 0x0F, 0x93, 0x00, 0x02, 0x0F, 0xB7, 0x00, 0x01, 0x00, 0x04, 0x0F, 0x9D, 0x00, 0x02, + 0x0F, 0xB7, 0x00, 0x01, 0x00, 0x04, 0x0F, 0xA2, 0x00, 0x02, 0x0F, 0xB7, 0x00, 0x01, 0x00, 0x04, + 0x0F, 0xA7, 0x00, 0x02, 0x0F, 0xB7, 0x00, 0x01, 0x00, 0x04, 0x0F, 0xAC, 0x00, 0x02, 0x0F, 0xB7, + 0x00, 0x01, 0x00, 0x04, 0x0F, 0x76, 0x00, 0x02, 0x0F, 0x80, 0x00, 0x01, 0x00, 0x04, 0x0F, 0x78, + 0x00, 0x02, 0x0F, 0x80, 0x00, 0x01, 0x00, 0x12, 0x0F, 0x40, 0x0F, 0x42, 0x0F, 0x4C, 0x0F, 0x51, + 0x0F, 0x56, 0x0F, 0x5B, 0x0F, 0x71, 0x0F, 0x72, 0x0F, 0x74, 0x0F, 0x80, 0x0F, 0x90, 0x0F, 0x92, + 0x0F, 0x9C, 0x0F, 0xA1, 0x0F, 0xA6, 0x0F, 0xAB, 0x0F, 0xB2, 0x0F, 0xB3, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x0A, 0x00, 0xBE, 0x00, 0x01, 0x00, 0x8E, 0x00, 0x11, 0x00, 0x28, 0x00, 0x2E, + 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, + 0x00, 0x64, 0x00, 0x6A, 0x00, 0x70, 0x00, 0x76, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x88, 0x00, 0x02, + 0x0F, 0x42, 0x0F, 0xB7, 0x00, 0x02, 0x0F, 0x4C, 0x0F, 0xB7, 0x00, 0x02, 0x0F, 0x51, 0x0F, 0xB7, + 0x00, 0x02, 0x0F, 0x56, 0x0F, 0xB7, 0x00, 0x02, 0x0F, 0x5B, 0x0F, 0xB7, 0x00, 0x02, 0x0F, 0x40, + 0x0F, 0xB5, 0x00, 0x02, 0x0F, 0x71, 0x0F, 0x72, 0x00, 0x02, 0x0F, 0x71, 0x0F, 0x74, 0x00, 0x02, + 0x0F, 0xB2, 0x0F, 0x80, 0x00, 0x02, 0x0F, 0xB3, 0x0F, 0x80, 0x00, 0x02, 0x0F, 0x71, 0x0F, 0x80, + 0x00, 0x02, 0x0F, 0x92, 0x0F, 0xB7, 0x00, 0x02, 0x0F, 0x9C, 0x0F, 0xB7, 0x00, 0x02, 0x0F, 0xA1, + 0x0F, 0xB7, 0x00, 0x02, 0x0F, 0xA6, 0x0F, 0xB7, 0x00, 0x02, 0x0F, 0xAB, 0x0F, 0xB7, 0x00, 0x02, + 0x0F, 0x90, 0x0F, 0xB5, 0x00, 0x01, 0x00, 0x11, 0x0F, 0x43, 0x0F, 0x4D, 0x0F, 0x52, 0x0F, 0x57, + 0x0F, 0x5C, 0x0F, 0x69, 0x0F, 0x73, 0x0F, 0x75, 0x0F, 0x76, 0x0F, 0x78, 0x0F, 0x81, 0x0F, 0x93, + 0x0F, 0x9D, 0x0F, 0xA2, 0x0F, 0xA7, 0x0F, 0xAC, 0x0F, 0xB9, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x03, + 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x02, 0x0F, 0x72, 0x0F, 0x71, 0x00, 0x02, 0x0F, 0x74, + 0x0F, 0x71, 0x00, 0x02, 0x0F, 0x80, 0x0F, 0x71, 0x00, 0x01, 0x00, 0x03, 0x0F, 0x73, 0x0F, 0x75, + 0x0F, 0x81 +}; + +const le_uint8 CanonShaping::glyphDefinitionTable[] = { + 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x27, + 0x06, 0x0C, 0x06, 0x0F, 0x00, 0x01, 0x06, 0x10, 0x06, 0x15, 0x00, 0x03, 0x06, 0x1B, 0x06, 0x1B, + 0x00, 0x01, 0x06, 0x1F, 0x06, 0x1F, 0x00, 0x01, 0x06, 0x21, 0x06, 0x21, 0x00, 0x01, 0x06, 0x22, + 0x06, 0x26, 0x00, 0x02, 0x06, 0x27, 0x06, 0x3A, 0x00, 0x01, 0x06, 0x40, 0x06, 0x4A, 0x00, 0x01, + 0x06, 0x4B, 0x06, 0x58, 0x00, 0x03, 0x06, 0x60, 0x06, 0x6F, 0x00, 0x01, 0x06, 0x70, 0x06, 0x70, + 0x00, 0x03, 0x06, 0x71, 0x06, 0xBF, 0x00, 0x01, 0x06, 0xC0, 0x06, 0xC0, 0x00, 0x02, 0x06, 0xC1, + 0x06, 0xC1, 0x00, 0x01, 0x06, 0xC2, 0x06, 0xC2, 0x00, 0x02, 0x06, 0xC3, 0x06, 0xD2, 0x00, 0x01, + 0x06, 0xD3, 0x06, 0xD3, 0x00, 0x02, 0x06, 0xD4, 0x06, 0xD5, 0x00, 0x01, 0x06, 0xD6, 0x06, 0xDC, + 0x00, 0x03, 0x06, 0xDE, 0x06, 0xE4, 0x00, 0x03, 0x06, 0xE5, 0x06, 0xE6, 0x00, 0x01, 0x06, 0xE7, + 0x06, 0xE8, 0x00, 0x03, 0x06, 0xE9, 0x06, 0xE9, 0x00, 0x01, 0x06, 0xEA, 0x06, 0xED, 0x00, 0x03, + 0x06, 0xEE, 0x06, 0xFF, 0x00, 0x01, 0xFB, 0x50, 0xFB, 0xB1, 0x00, 0x01, 0xFB, 0xD3, 0xFB, 0xDC, + 0x00, 0x01, 0xFB, 0xDD, 0xFB, 0xDD, 0x00, 0x02, 0xFB, 0xDE, 0xFB, 0xE9, 0x00, 0x01, 0xFB, 0xEA, + 0xFB, 0xFB, 0x00, 0x02, 0xFB, 0xFC, 0xFB, 0xFF, 0x00, 0x01, 0xFC, 0x00, 0xFC, 0x5D, 0x00, 0x02, + 0xFC, 0x64, 0xFC, 0xF1, 0x00, 0x02, 0xFC, 0xF5, 0xFD, 0x3D, 0x00, 0x02, 0xFD, 0x50, 0xFD, 0x8F, + 0x00, 0x02, 0xFD, 0x92, 0xFD, 0xC7, 0x00, 0x02, 0xFD, 0xF0, 0xFD, 0xFC, 0x00, 0x02, 0xFE, 0x80, + 0xFE, 0xF4, 0x00, 0x01, 0xFE, 0xF5, 0xFE, 0xFC, 0x00, 0x02 +}; + +U_NAMESPACE_END diff --git a/icuSources/layout/CanonShaping.h b/icuSources/layout/CanonShaping.h new file mode 100644 index 00000000..6b6c82aa --- /dev/null +++ b/icuSources/layout/CanonShaping.h @@ -0,0 +1,22 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __CANONSHAPING_H +#define __CANONSHAPING_H + +#include "LETypes.h" + +U_NAMESPACE_BEGIN + +class CanonShaping /* not : public UObject because all members are static */ +{ +public: + static const le_uint8 glyphSubstitutionTable[]; + static const le_uint8 glyphDefinitionTable[]; +}; + +U_NAMESPACE_END +#endif diff --git a/icuSources/layout/CharSubstitutionFilter.h b/icuSources/layout/CharSubstitutionFilter.h new file mode 100644 index 00000000..780e8ad2 --- /dev/null +++ b/icuSources/layout/CharSubstitutionFilter.h @@ -0,0 +1,81 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __CHARSUBSTITUTIONFILTER_H +#define __CHARSUBSTITUTIONFILTER_H + +#include "LETypes.h" +#include "LEGlyphFilter.h" + +U_NAMESPACE_BEGIN + +class LEFontInstance; + +/** + * This filter is used by character-based GSUB processors. It + * accepts only those characters which the given font can display. + * + * @internal + */ +class CharSubstitutionFilter : public UMemory, public LEGlyphFilter +{ +private: + /** + * Holds the font which is used to test the characters. + * + * @internal + */ + const LEFontInstance *fFontInstance; + + /** + * The copy constructor. Not allowed! + * + * @internal + */ + CharSubstitutionFilter(const CharSubstitutionFilter &other); // forbid copying of this class + + /** + * The replacement operator. Not allowed! + * + * @internal + */ + CharSubstitutionFilter &operator=(const CharSubstitutionFilter &other); // forbid copying of this class + +public: + /** + * The constructor. + * + * @param fontInstance - the font to use to test the characters. + * + * @internal + */ + CharSubstitutionFilter(const LEFontInstance *fontInstance); + + /** + * The destructor. + * + * @internal + */ + ~CharSubstitutionFilter(); + + /** + * This method is used to test if a particular + * character can be displayed by the filter's + * font. + * + * @param glyph - the Unicode character code to be tested + * + * @return TRUE if the filter's font can display this character. + * + * @internal + */ + le_bool accept(LEGlyphID glyph) const; +}; + +U_NAMESPACE_END +#endif + + diff --git a/icuSources/layout/ClassDefinitionTables.cpp b/icuSources/layout/ClassDefinitionTables.cpp index 83e4a52a..d69aac0e 100644 --- a/icuSources/layout/ClassDefinitionTables.cpp +++ b/icuSources/layout/ClassDefinitionTables.cpp @@ -1,7 +1,6 @@ /* - * @(#)ClassDefinitionTables.cpp 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -83,11 +82,11 @@ le_bool ClassDefFormat1Table::hasGlyphClass(le_int32 glyphClass) const for (i = 0; i < count; i += 1) { if (SWAPW(classValueArray[i]) == glyphClass) { - return true; + return TRUE; } } - return false; + return FALSE; } le_int32 ClassDefFormat2Table::getGlyphClass(LEGlyphID glyphID) const @@ -111,11 +110,11 @@ le_bool ClassDefFormat2Table::hasGlyphClass(le_int32 glyphClass) const for (i = 0; i < rangeCount; i += 1) { if (SWAPW(classRangeRecordArray[i].rangeValue) == glyphClass) { - return true; + return TRUE; } } - return false; + return FALSE; } U_NAMESPACE_END diff --git a/icuSources/layout/ClassDefinitionTables.h b/icuSources/layout/ClassDefinitionTables.h index 96bb76a5..3dfe86e6 100644 --- a/icuSources/layout/ClassDefinitionTables.h +++ b/icuSources/layout/ClassDefinitionTables.h @@ -1,7 +1,6 @@ /* - * @(#)ClassDefinitionTables.h 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/ContextualGlyphInsertion.h b/icuSources/layout/ContextualGlyphInsertion.h index d59c8d10..ead88425 100644 --- a/icuSources/layout/ContextualGlyphInsertion.h +++ b/icuSources/layout/ContextualGlyphInsertion.h @@ -1,7 +1,6 @@ /* - * @(#)ContextualGlyphInsertion.h 1.4 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/ContextualGlyphSubstProc.cpp b/icuSources/layout/ContextualGlyphSubstProc.cpp index 009866da..94c4a60b 100644 --- a/icuSources/layout/ContextualGlyphSubstProc.cpp +++ b/icuSources/layout/ContextualGlyphSubstProc.cpp @@ -1,7 +1,6 @@ /* - * @(#)ContextualGlyphSubstProc.cpp 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -12,11 +11,12 @@ #include "SubtableProcessor.h" #include "StateTableProcessor.h" #include "ContextualGlyphSubstProc.h" +#include "LEGlyphStorage.h" #include "LESwaps.h" U_NAMESPACE_BEGIN -const char ContextualGlyphSubstitutionProcessor::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ContextualGlyphSubstitutionProcessor) ContextualGlyphSubstitutionProcessor::ContextualGlyphSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader) : StateTableProcessor(morphSubtableHeader) @@ -36,7 +36,7 @@ void ContextualGlyphSubstitutionProcessor::beginStateTable() markGlyph = 0; } -ByteOffset ContextualGlyphSubstitutionProcessor::processStateEntry(LEGlyphID *glyphs, le_int32 * /*charIndices*/, le_int32 &currGlyph, le_int32 /*glyphCount*/, EntryTableIndex index) +ByteOffset ContextualGlyphSubstitutionProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index) { const ContextualGlyphSubstitutionStateEntry *entry = &entryTable[index]; ByteOffset newState = SWAPW(entry->newStateOffset); @@ -46,16 +46,18 @@ ByteOffset ContextualGlyphSubstitutionProcessor::processStateEntry(LEGlyphID *gl if (markOffset != 0) { const le_int16 *table = (const le_int16 *) ((char *) &stateTableHeader->stHeader + markOffset * 2); - TTGlyphID newGlyph = SWAPW(table[LE_GET_GLYPH(glyphs[markGlyph])]); + LEGlyphID mGlyph = glyphStorage[markGlyph]; + TTGlyphID newGlyph = SWAPW(table[LE_GET_GLYPH(mGlyph)]); - glyphs[markGlyph] = LE_SET_GLYPH(glyphs[markGlyph], newGlyph); + glyphStorage[markGlyph] = LE_SET_GLYPH(mGlyph, newGlyph); } if (currOffset != 0) { const le_int16 *table = (const le_int16 *) ((char *) &stateTableHeader->stHeader + currOffset * 2); - le_int16 newGlyph = SWAPW(table[LE_GET_GLYPH(glyphs[currGlyph])]); + LEGlyphID thisGlyph = glyphStorage[currGlyph]; + TTGlyphID newGlyph = SWAPW(table[LE_GET_GLYPH(thisGlyph)]); - glyphs[currGlyph] = LE_SET_GLYPH(glyphs[currGlyph], newGlyph); + glyphStorage[currGlyph] = LE_SET_GLYPH(thisGlyph, newGlyph); } if (flags & cgsSetMark) { diff --git a/icuSources/layout/ContextualGlyphSubstProc.h b/icuSources/layout/ContextualGlyphSubstProc.h index 81b5a98a..b0c5a6b3 100644 --- a/icuSources/layout/ContextualGlyphSubstProc.h +++ b/icuSources/layout/ContextualGlyphSubstProc.h @@ -1,7 +1,6 @@ /* - * @(#)ContextualGlyphSubstProc.h 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -21,13 +20,14 @@ U_NAMESPACE_BEGIN +class LEGlyphStorage; + class ContextualGlyphSubstitutionProcessor : public StateTableProcessor { public: virtual void beginStateTable(); - virtual ByteOffset processStateEntry(LEGlyphID *glyphs, le_int32 *charIndices, le_int32 &currGlyph, - le_int32 glyphCount, EntryTableIndex index); + virtual ByteOffset processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index); virtual void endStateTable(); @@ -37,16 +37,16 @@ public: /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } + static UClassID getStaticClassID(); private: ContextualGlyphSubstitutionProcessor(); @@ -59,13 +59,6 @@ protected: const ContextualGlyphSubstitutionHeader *contextualGlyphSubstitutionHeader; -private: - - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; U_NAMESPACE_END diff --git a/icuSources/layout/ContextualGlyphSubstitution.h b/icuSources/layout/ContextualGlyphSubstitution.h index d21bea63..72c23559 100644 --- a/icuSources/layout/ContextualGlyphSubstitution.h +++ b/icuSources/layout/ContextualGlyphSubstitution.h @@ -1,7 +1,6 @@ /* - * @(#)ContextualGlyphSubstitution.h 1.4 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/ContextualSubstSubtables.cpp b/icuSources/layout/ContextualSubstSubtables.cpp index 863b9ab2..a1541b9f 100644 --- a/icuSources/layout/ContextualSubstSubtables.cpp +++ b/icuSources/layout/ContextualSubstSubtables.cpp @@ -1,7 +1,6 @@ /* - * @(#)ContextualSubstSubtables.cpp 1.11 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -57,20 +56,20 @@ le_bool ContextualSubstitutionBase::matchGlyphIDs(const TTGlyphID *glyphArray, l while (glyphCount > 0) { if (! glyphIterator->next()) { - return false; + return FALSE; } TTGlyphID glyph = (TTGlyphID) glyphIterator->getCurrGlyphID(); if (glyph != SWAPW(glyphArray[match])) { - return false; + return FALSE; } glyphCount -= 1; match += direction; } - return true; + return TRUE; } le_bool ContextualSubstitutionBase::matchGlyphClasses(const le_uint16 *classArray, le_uint16 glyphCount, @@ -88,7 +87,7 @@ le_bool ContextualSubstitutionBase::matchGlyphClasses(const le_uint16 *classArra while (glyphCount > 0) { if (! glyphIterator->next()) { - return false; + return FALSE; } LEGlyphID glyph = glyphIterator->getCurrGlyphID(); @@ -101,7 +100,7 @@ le_bool ContextualSubstitutionBase::matchGlyphClasses(const le_uint16 *classArra // table. If we're looking for such a class, pretend that // we found it. if (classDefinitionTable->hasGlyphClass(matchClass)) { - return false; + return FALSE; } } @@ -109,7 +108,7 @@ le_bool ContextualSubstitutionBase::matchGlyphClasses(const le_uint16 *classArra match += direction; } - return true; + return TRUE; } le_bool ContextualSubstitutionBase::matchGlyphCoverages(const Offset *coverageTableOffsetArray, le_uint16 glyphCount, @@ -128,18 +127,18 @@ le_bool ContextualSubstitutionBase::matchGlyphCoverages(const Offset *coverageTa const CoverageTable *coverageTable = (const CoverageTable *) (offsetBase + coverageTableOffset); if (! glyphIterator->next()) { - return false; + return FALSE; } if (coverageTable->getGlyphCoverage((LEGlyphID) glyphIterator->getCurrGlyphID()) < 0) { - return false; + return FALSE; } glyphCount -= 1; glyph += direction; } - return true; + return TRUE; } le_uint32 ContextualSubstitutionSubtable::process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, @@ -326,7 +325,7 @@ le_uint32 ChainingContextualSubstitutionSubtable::process(const LookupProcessor } } -const LETag emptyTag = 0; +static const LETag emptyTag = 0; le_uint32 ChainingContextualSubstitutionFormat1Subtable::process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const @@ -364,7 +363,7 @@ le_uint32 ChainingContextualSubstitutionFormat1Subtable::process(const LookupPro } tempIterator.prev(); - if (! matchGlyphIDs(chainSubRuleTable->backtrackGlyphArray, backtrackGlyphCount, &tempIterator, true)) { + if (! matchGlyphIDs(chainSubRuleTable->backtrackGlyphArray, backtrackGlyphCount, &tempIterator, TRUE)) { continue; } @@ -438,7 +437,7 @@ le_uint32 ChainingContextualSubstitutionFormat2Subtable::process(const LookupPro tempIterator.prev(); if (! matchGlyphClasses(chainSubClassRuleTable->backtrackClassArray, backtrackGlyphCount, - &tempIterator, backtrackClassDefinitionTable, true)) { + &tempIterator, backtrackClassDefinitionTable, TRUE)) { continue; } @@ -485,7 +484,7 @@ le_uint32 ChainingContextualSubstitutionFormat3Subtable::process(const LookupPro tempIterator.prev(); if (! ContextualSubstitutionBase::matchGlyphCoverages(backtrackCoverageTableOffsetArray, - backtrkGlyphCount, &tempIterator, (const char *) this, true)) { + backtrkGlyphCount, &tempIterator, (const char *) this, TRUE)) { return 0; } diff --git a/icuSources/layout/ContextualSubstSubtables.h b/icuSources/layout/ContextualSubstSubtables.h index da3f3e4f..a77a196d 100644 --- a/icuSources/layout/ContextualSubstSubtables.h +++ b/icuSources/layout/ContextualSubstSubtables.h @@ -1,7 +1,6 @@ /* - * @(#)ContextualSubstSubtables.h 1.7 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -32,15 +31,15 @@ struct ContextualSubstitutionBase : GlyphSubstitutionSubtable { static le_bool matchGlyphIDs( const TTGlyphID *glyphArray, le_uint16 glyphCount, GlyphIterator *glyphIterator, - le_bool backtrack = false); + le_bool backtrack = FALSE); static le_bool matchGlyphClasses( const le_uint16 *classArray, le_uint16 glyphCount, GlyphIterator *glyphIterator, - const ClassDefinitionTable *classDefinitionTable, le_bool backtrack = false); + const ClassDefinitionTable *classDefinitionTable, le_bool backtrack = FALSE); static le_bool matchGlyphCoverages( const Offset *coverageTableOffsetArray, le_uint16 glyphCount, - GlyphIterator *glyphIterator, const char *offsetBase, le_bool backtrack = false); + GlyphIterator *glyphIterator, const char *offsetBase, le_bool backtrack = FALSE); static void applySubstitutionLookups( const LookupProcessor *lookupProcessor, diff --git a/icuSources/layout/CoverageTables.cpp b/icuSources/layout/CoverageTables.cpp index ec8b9a5e..3b8cd5b3 100644 --- a/icuSources/layout/CoverageTables.cpp +++ b/icuSources/layout/CoverageTables.cpp @@ -1,7 +1,6 @@ /* - * @(#)CoverageTables.cpp 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/CoverageTables.h b/icuSources/layout/CoverageTables.h index 6f27719d..5e9dbaa1 100644 --- a/icuSources/layout/CoverageTables.h +++ b/icuSources/layout/CoverageTables.h @@ -1,7 +1,6 @@ /* - * @(#)CoverageTables.h 1.4 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/DefaultCharMapper.h b/icuSources/layout/DefaultCharMapper.h index 4ccd6b05..d2449fcb 100644 --- a/icuSources/layout/DefaultCharMapper.h +++ b/icuSources/layout/DefaultCharMapper.h @@ -25,7 +25,7 @@ U_NAMESPACE_BEGIN * * @see LECharMapper */ -class DefaultCharMapper : public LECharMapper +class DefaultCharMapper : public UMemory, public LECharMapper { private: le_bool fFilterControls; diff --git a/icuSources/layout/DeviceTables.cpp b/icuSources/layout/DeviceTables.cpp index 34a08688..1882ede5 100644 --- a/icuSources/layout/DeviceTables.cpp +++ b/icuSources/layout/DeviceTables.cpp @@ -1,7 +1,7 @@ /* * @(#)DeviceTables.cpp 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998, 1999, 2000, 2001 - All Rights Reserved + * (C) Copyright IBM Corp. 1998 - 2004 - All Rights Reserved * */ @@ -36,7 +36,7 @@ le_int16 DeviceTable::getAdjustment(le_uint16 ppem) const result = field; if ((field & fieldSignBits[format]) != 0) { - result |= ! fieldMasks[format]; + result |= ~ fieldMasks[format]; } } diff --git a/icuSources/layout/Features.h b/icuSources/layout/Features.h index 7088b016..47563d9d 100644 --- a/icuSources/layout/Features.h +++ b/icuSources/layout/Features.h @@ -1,7 +1,6 @@ /* - * @(#)Features.h 1.4 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -36,7 +35,7 @@ struct FeatureListTable le_uint16 featureCount; FeatureRecord featureRecordArray[ANY_NUMBER]; - const FeatureTable *getFeatureTable(le_uint16 featureIndex, LETag *featureTag) const; + const FeatureTable *getFeatureTable(le_uint16 featureIndex, LETag *featureTag) const; const FeatureTable *getFeatureTable(LETag featureTag) const; }; diff --git a/icuSources/layout/GDEFMarkFilter.cpp b/icuSources/layout/GDEFMarkFilter.cpp index 256d7d98..344e07ab 100644 --- a/icuSources/layout/GDEFMarkFilter.cpp +++ b/icuSources/layout/GDEFMarkFilter.cpp @@ -1,7 +1,6 @@ /* - * @(#)GDEFMarkFilter.cpp 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998, 1999, 2000, 2001 - All Rights Reserved + * (C) Copyright IBM Corp. 1998 - 2004 - All Rights Reserved * */ diff --git a/icuSources/layout/GDEFMarkFilter.h b/icuSources/layout/GDEFMarkFilter.h index 7059cb90..5ae5b45f 100644 --- a/icuSources/layout/GDEFMarkFilter.h +++ b/icuSources/layout/GDEFMarkFilter.h @@ -1,7 +1,6 @@ /* - * @(#)GDEFMarkFilter.h 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/GXLayoutEngine.cpp b/icuSources/layout/GXLayoutEngine.cpp index 809ecf7a..fbd36677 100644 --- a/icuSources/layout/GXLayoutEngine.cpp +++ b/icuSources/layout/GXLayoutEngine.cpp @@ -1,20 +1,20 @@ /* - * @(#)GXLayoutEngine.cpp 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ #include "LETypes.h" #include "LayoutEngine.h" #include "GXLayoutEngine.h" +#include "LEGlyphStorage.h" #include "MorphTables.h" U_NAMESPACE_BEGIN -const char GXLayoutEngine::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(GXLayoutEngine) GXLayoutEngine::GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const MorphTableHeader *morphTable) : LayoutEngine(fontInstance, scriptCode, languageCode), fMorphTable(morphTable) @@ -28,7 +28,7 @@ GXLayoutEngine::~GXLayoutEngine() } // apply 'mort' table -le_int32 GXLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphID *&glyphs, le_int32 *&charIndices, LEErrorCode &success) +le_int32 GXLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success) { if (LE_FAILURE(success)) { return 0; @@ -39,25 +39,26 @@ le_int32 GXLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, return 0; } - mapCharsToGlyphs(chars, offset, count, false, rightToLeft, glyphs, charIndices, success); + mapCharsToGlyphs(chars, offset, count, FALSE, rightToLeft, glyphStorage, success); if (LE_FAILURE(success)) { return 0; } - fMorphTable->process(glyphs, charIndices, count); + fMorphTable->process(glyphStorage); return count; } // apply positional tables -void GXLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool /*reverse*/, LEGlyphID glyphs[], le_int32 glyphCount, float positions[], LEErrorCode &success) +void GXLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool /*reverse*/, + LEGlyphStorage &/*glyphStorage*/, LEErrorCode &success) { if (LE_FAILURE(success)) { return; } - if (chars == NULL || glyphs == NULL || positions == NULL || offset < 0 || count < 0 || glyphCount < 0) { + if (chars == NULL || offset < 0 || count < 0) { success = LE_ILLEGAL_ARGUMENT_ERROR; return; } diff --git a/icuSources/layout/GXLayoutEngine.h b/icuSources/layout/GXLayoutEngine.h index 45b13734..faa511ab 100644 --- a/icuSources/layout/GXLayoutEngine.h +++ b/icuSources/layout/GXLayoutEngine.h @@ -1,8 +1,7 @@ /* - * @(#)GXLayoutEngine.h 1.4 00/03/15 * - * (C) Copyright IBM Corp. 1998, 1999, 2000, 2001, 2002 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -10,14 +9,15 @@ #define __GXLAYOUTENGINE_H #include "LETypes.h" -#include "LEFontInstance.h" -#include "LEGlyphFilter.h" #include "LayoutEngine.h" #include "MorphTables.h" U_NAMESPACE_BEGIN +class LEFontInstance; +class LEGlyphStorage; + /** * This class implements layout for QuickDraw GX or Apple Advanced Typograyph (AAT) * fonts. A font is a GX or AAT font if it contains a 'mort' table. See Apple's @@ -60,16 +60,16 @@ public: /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } + static UClassID getStaticClassID(); protected: @@ -90,11 +90,10 @@ protected: * @param offset - the index of the first character to process * @param count - the number of characters to process * @param max - the number of characters in the input context - * @param rightToLeft - true if the text is in a right to left directional run + * @param rightToLeft - TRUE if the text is in a right to left directional run + * @param glyphStorage - the glyph storage object. The glyph and char index arrays will be set. * * Output parameters: - * @param glyphs - the glyph index array - * @param charIndices - the character index array * @param success - set to an error code if the operation fails * * @return the number of glyphs in the glyph index array @@ -102,34 +101,23 @@ protected: * @internal */ virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEGlyphID *&glyphs, le_int32 *&charIndices, LEErrorCode &success); + LEGlyphStorage &glyphStorage, LEErrorCode &success); /** * This method adjusts the glyph positions using the font's * 'kern', 'trak', 'bsln', 'opbd' and 'just' tables. * * Input parameters: - * @param glyphs - the input glyph array - * @param glyphCount - the number of glyphs in the glyph array - * @param x - the starting X position - * @param y - the starting Y position + * @param glyphStorage - the object holding the glyph storage. The positions will be updated as needed. * * Output parameters: - * @param positions - the output X and Y positions (two entries per glyph) * @param success - set to an error code if the operation fails * * @internal */ - virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphID glyphs[], - le_int32 glyphCount, float positions[], LEErrorCode &success); - -private: + virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, + LEGlyphStorage &glyphStorage, LEErrorCode &success); - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; U_NAMESPACE_END diff --git a/icuSources/layout/GlyphDefinitionTables.cpp b/icuSources/layout/GlyphDefinitionTables.cpp index 9f96907e..a51e6ba0 100644 --- a/icuSources/layout/GlyphDefinitionTables.cpp +++ b/icuSources/layout/GlyphDefinitionTables.cpp @@ -1,7 +1,6 @@ /* - * @(#)GlyphDefinitionTables.cpp 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998, 1999, 2000, 2001 - All Rights Reserved + * (C) Copyright IBM Corp. 1998 - 2004 - All Rights Reserved * */ diff --git a/icuSources/layout/GlyphDefinitionTables.h b/icuSources/layout/GlyphDefinitionTables.h index 9b5fa2df..e4cbbb6e 100644 --- a/icuSources/layout/GlyphDefinitionTables.h +++ b/icuSources/layout/GlyphDefinitionTables.h @@ -1,7 +1,6 @@ /* - * @(#)GlyphDefinitionTables.h 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/GlyphIterator.cpp b/icuSources/layout/GlyphIterator.cpp index b612e58e..20bcc860 100644 --- a/icuSources/layout/GlyphIterator.cpp +++ b/icuSources/layout/GlyphIterator.cpp @@ -1,7 +1,6 @@ /* - * %W% %E% * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -10,36 +9,40 @@ #include "GlyphDefinitionTables.h" #include "GlyphPositionAdjustments.h" #include "GlyphIterator.h" +#include "LEGlyphStorage.h" #include "Lookups.h" #include "LESwaps.h" U_NAMESPACE_BEGIN -GlyphIterator::GlyphIterator(LEGlyphID *theGlyphs, GlyphPositionAdjustment *theGlyphPositionAdjustments, le_int32 theGlyphCount, - le_bool rightToLeft, le_uint16 theLookupFlags, LETag theFeatureTag, const LETag *theGlyphTags[], +GlyphIterator::GlyphIterator(LEGlyphStorage &theGlyphStorage, GlyphPositionAdjustment *theGlyphPositionAdjustments, le_bool rightToLeft, le_uint16 theLookupFlags, LETag theFeatureTag, const GlyphDefinitionTableHeader *theGlyphDefinitionTableHeader) - : direction(1), position(-1), nextLimit(theGlyphCount), prevLimit(-1), + : direction(1), position(-1), nextLimit(-1), prevLimit(-1), cursiveFirstPosition(-1), cursiveLastPosition(-1), cursiveBaselineAdjustment(0), - glyphs(theGlyphs), glyphPositionAdjustments(theGlyphPositionAdjustments), lookupFlags(theLookupFlags), - featureTag(theFeatureTag), glyphTags(theGlyphTags), - glyphClassDefinitionTable(NULL), - markAttachClassDefinitionTable(NULL) + glyphStorage(theGlyphStorage), glyphPositionAdjustments(theGlyphPositionAdjustments), + srcIndex(-1), destIndex(-1), lookupFlags(theLookupFlags), featureTag(theFeatureTag), + glyphClassDefinitionTable(NULL), markAttachClassDefinitionTable(NULL) { + le_int32 glyphCount = glyphStorage.getGlyphCount(); + if (theGlyphDefinitionTableHeader != NULL) { glyphClassDefinitionTable = theGlyphDefinitionTableHeader->getGlyphClassDefinitionTable(); markAttachClassDefinitionTable = theGlyphDefinitionTableHeader->getMarkAttachClassDefinitionTable(); } + nextLimit = glyphCount; + if (rightToLeft) { direction = -1; - position = theGlyphCount; + position = glyphCount; nextLimit = -1; - prevLimit = theGlyphCount; + prevLimit = glyphCount; } } GlyphIterator::GlyphIterator(GlyphIterator &that) + : glyphStorage(that.glyphStorage) { direction = that.direction; position = that.position; @@ -49,16 +52,17 @@ GlyphIterator::GlyphIterator(GlyphIterator &that) cursiveFirstPosition = that.cursiveFirstPosition; cursiveLastPosition = that.cursiveLastPosition; - glyphs = that.glyphs; glyphPositionAdjustments = that.glyphPositionAdjustments; + srcIndex = that.srcIndex; + destIndex = that.destIndex; lookupFlags = that.lookupFlags; featureTag = that.featureTag; - glyphTags = that.glyphTags; glyphClassDefinitionTable = that.glyphClassDefinitionTable; markAttachClassDefinitionTable = that.markAttachClassDefinitionTable; } GlyphIterator::GlyphIterator(GlyphIterator &that, LETag newFeatureTag) + : glyphStorage(that.glyphStorage) { direction = that.direction; position = that.position; @@ -68,16 +72,17 @@ GlyphIterator::GlyphIterator(GlyphIterator &that, LETag newFeatureTag) cursiveFirstPosition = that.cursiveFirstPosition; cursiveLastPosition = that.cursiveLastPosition; - glyphs = that.glyphs; glyphPositionAdjustments = that.glyphPositionAdjustments; + srcIndex = that.srcIndex; + destIndex = that.destIndex; lookupFlags = that.lookupFlags; featureTag = newFeatureTag; - glyphTags = that.glyphTags; glyphClassDefinitionTable = that.glyphClassDefinitionTable; markAttachClassDefinitionTable = that.markAttachClassDefinitionTable; } GlyphIterator::GlyphIterator(GlyphIterator &that, le_uint16 newLookupFlags) + : glyphStorage(that.glyphStorage) { direction = that.direction; position = that.position; @@ -88,21 +93,43 @@ GlyphIterator::GlyphIterator(GlyphIterator &that, le_uint16 newLookupFlags) cursiveFirstPosition = that.cursiveFirstPosition; cursiveLastPosition = that.cursiveLastPosition; - glyphs = that.glyphs; glyphPositionAdjustments = that.glyphPositionAdjustments; + srcIndex = that.srcIndex; + destIndex = that.destIndex; lookupFlags = newLookupFlags; featureTag = that.featureTag; - glyphTags = that.glyphTags; glyphClassDefinitionTable = that.glyphClassDefinitionTable; markAttachClassDefinitionTable = that.markAttachClassDefinitionTable; } -GlyphIterator::GlyphIterator() +GlyphIterator::~GlyphIterator() { -}; + // nothing to do, right? +} -GlyphIterator::~GlyphIterator() +void GlyphIterator::reset(le_uint16 newLookupFlags, LETag newFeatureTag) +{ + position = prevLimit; + featureTag = newFeatureTag; + lookupFlags = newLookupFlags; +} + +LEGlyphID *GlyphIterator::insertGlyphs(le_int32 count) +{ + return glyphStorage.insertGlyphs(position, count); +} + +le_int32 GlyphIterator::applyInsertions() { + le_int32 newGlyphCount = glyphStorage.applyInsertions(); + + if (direction < 0) { + prevLimit = newGlyphCount; + } else { + nextLimit = newGlyphCount; + } + + return newGlyphCount; } le_int32 GlyphIterator::getCurrStreamPosition() const @@ -147,7 +174,7 @@ LEGlyphID GlyphIterator::getCurrGlyphID() const } } - return glyphs[position]; + return glyphStorage[position]; } LEGlyphID GlyphIterator::getCursiveLastGlyphID() const @@ -162,7 +189,7 @@ LEGlyphID GlyphIterator::getCursiveLastGlyphID() const } } - return glyphs[cursiveLastPosition]; + return glyphStorage[cursiveLastPosition]; } void GlyphIterator::getCursiveLastExitPoint(LEPoint &exitPoint) const @@ -213,7 +240,9 @@ void GlyphIterator::getCursiveLastPositionAdjustment(GlyphPositionAdjustment &ad void GlyphIterator::setCurrGlyphID(TTGlyphID glyphID) { - glyphs[position] = LE_SET_GLYPH(glyphs[position], glyphID); + LEGlyphID glyph = glyphStorage[position]; + + glyphStorage[position] = LE_SET_GLYPH(glyph, glyphID); } void GlyphIterator::setCurrStreamPosition(le_int32 newPosition) @@ -297,6 +326,25 @@ void GlyphIterator::adjustCurrGlyphPositionAdjustment(float xPlacementAdjust, fl glyphPositionAdjustments[position].adjustYAdvance(yAdvanceAdjust); } +void GlyphIterator::setCurrGlyphPositionAdjustment(float xPlacementAdjust, float yPlacementAdjust, + float xAdvanceAdjust, float yAdvanceAdjust) +{ + if (direction < 0) { + if (position <= nextLimit || position >= prevLimit) { + return; + } + } else { + if (position <= prevLimit || position >= nextLimit) { + return; + } + } + + glyphPositionAdjustments[position].setXPlacement(xPlacementAdjust); + glyphPositionAdjustments[position].setYPlacement(yPlacementAdjust); + glyphPositionAdjustments[position].setXAdvance(xAdvanceAdjust); + glyphPositionAdjustments[position].setYAdvance(yAdvanceAdjust); +} + void GlyphIterator::setCursiveFirstExitPoint() { if (direction < 0) { @@ -376,11 +424,11 @@ void GlyphIterator::adjustCursiveLastGlyphPositionAdjustment(float xPlacementAdj le_bool GlyphIterator::filterGlyph(le_uint32 index) const { - LEGlyphID glyphID = glyphs[index]; + LEGlyphID glyphID = glyphStorage[index]; le_int32 glyphClass = gcdNoGlyphClass; if (LE_GET_GLYPH(glyphID) >= 0xFFFE) { - return true; + return TRUE; } if (glyphClassDefinitionTable != NULL) { @@ -390,7 +438,7 @@ le_bool GlyphIterator::filterGlyph(le_uint32 index) const switch (glyphClass) { case gcdNoGlyphClass: - return false; + return FALSE; case gcdSimpleGlyph: return (lookupFlags & lfIgnoreBaseGlyphs) != 0; @@ -401,7 +449,7 @@ le_bool GlyphIterator::filterGlyph(le_uint32 index) const case gcdMarkGlyph: { if ((lookupFlags & lfIgnoreMarks) != 0) { - return true; + return TRUE; } le_uint16 markAttachType = (lookupFlags & lfMarkAttachTypeMask) >> lfMarkAttachTypeShift; @@ -410,37 +458,38 @@ le_bool GlyphIterator::filterGlyph(le_uint32 index) const return markAttachClassDefinitionTable->getGlyphClass(glyphID) != markAttachType; } - return false; + return FALSE; } case gcdComponentGlyph: return (lookupFlags & lfIgnoreBaseGlyphs) != 0; default: - return false; + return FALSE; } } -const LETag emptyTag = 0; -const LETag defaultTag = 0xFFFFFFFF; +static const LETag emptyTag = 0; +static const LETag defaultTag = 0xFFFFFFFF; le_bool GlyphIterator::hasFeatureTag() const { if (featureTag == defaultTag || featureTag == emptyTag) { - return true; + return TRUE; } - if (glyphTags != NULL) { - const LETag *tagList = glyphTags[position]; + LEErrorCode success = LE_NO_ERROR; + const LETag *tagList = (const LETag *) glyphStorage.getAuxData(position, success); + if (tagList != NULL) { for (le_int32 tag = 0; tagList[tag] != emptyTag; tag += 1) { if (tagList[tag] == featureTag) { - return true; + return TRUE; } } } - return false; + return FALSE; } le_bool GlyphIterator::findFeatureTag() @@ -448,11 +497,11 @@ le_bool GlyphIterator::findFeatureTag() while (nextInternal()) { if (hasFeatureTag()) { prevInternal(); - return true; + return TRUE; } } - return false; + return FALSE; } @@ -506,7 +555,7 @@ le_int32 GlyphIterator::getMarkComponent(le_int32 markPosition) const le_int32 posn; for (posn = position; posn != markPosition; posn += direction) { - if (glyphs[posn] == 0xFFFE) { + if (glyphStorage[posn] == 0xFFFE) { component += 1; } } @@ -523,7 +572,7 @@ le_bool GlyphIterator::findMark2Glyph() do { newPosition -= direction; - } while (newPosition != prevLimit && glyphs[newPosition] != 0xFFFE && filterGlyph(newPosition)); + } while (newPosition != prevLimit && glyphStorage[newPosition] != 0xFFFE && filterGlyph(newPosition)); position = newPosition; diff --git a/icuSources/layout/GlyphIterator.h b/icuSources/layout/GlyphIterator.h index 4481c99f..610a0342 100644 --- a/icuSources/layout/GlyphIterator.h +++ b/icuSources/layout/GlyphIterator.h @@ -1,7 +1,6 @@ /* - * %W% %E% * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -20,10 +19,11 @@ U_NAMESPACE_BEGIN +class LEGlyphStorage; + class GlyphIterator : public UMemory { public: - GlyphIterator(LEGlyphID *theGlyphs, GlyphPositionAdjustment *theGlyphPositionAdjustments, le_int32 theGlyphCount, - le_bool rightToLeft, le_uint16 theLookupFlags, LETag theFeatureTag, const LETag *theGlyphTags[], + GlyphIterator(LEGlyphStorage &theGlyphStorage, GlyphPositionAdjustment *theGlyphPositionAdjustments, le_bool rightToLeft, le_uint16 theLookupFlags, LETag theFeatureTag, const GlyphDefinitionTableHeader *theGlyphDefinitionTableHeader); GlyphIterator(GlyphIterator &that); @@ -32,7 +32,9 @@ public: GlyphIterator(GlyphIterator &that, le_uint16 newLookupFlags); - ~GlyphIterator(); + virtual ~GlyphIterator(); + + void reset(le_uint16 newLookupFlags, LETag newFeatureTag); le_bool next(le_uint32 delta = 1); le_bool prev(le_uint32 delta = 1); @@ -61,8 +63,11 @@ public: void setCurrStreamPosition(le_int32 position); void setCurrGlyphPositionAdjustment(const GlyphPositionAdjustment *adjustment); void setCurrGlyphBaseOffset(le_int32 baseOffset); - void adjustCurrGlyphPositionAdjustment(float xPlacmentAdjust, float yPlacementAdjust, - float xAdvanceAdjust, float yAdvanceAdjust); + void adjustCurrGlyphPositionAdjustment(float xPlacementAdjust, float yPlacementAdjust, + float xAdvanceAdjust, float yAdvanceAdjust); + + void setCurrGlyphPositionAdjustment(float xPlacementAdjust, float yPlacementAdjust, + float xAdvanceAdjust, float yAdvanceAdjust); void setCursiveFirstExitPoint(); void resetCursiveLastExitPoint(); @@ -71,8 +76,10 @@ public: void adjustCursiveLastGlyphPositionAdjustment(float xPlacmentAdjust, float yPlacementAdjust, float xAdvanceAdjust, float yAdvanceAdjust); + LEGlyphID *insertGlyphs(le_int32 count); + le_int32 applyInsertions(); + private: - GlyphIterator(); le_bool filterGlyph(le_uint32 index) const; le_bool hasFeatureTag() const; le_bool nextInternal(le_uint32 delta = 1); @@ -86,11 +93,12 @@ private: le_int32 cursiveLastPosition; float cursiveBaselineAdjustment; LEPoint cursiveLastExitPoint; - LEGlyphID *glyphs; + LEGlyphStorage &glyphStorage; GlyphPositionAdjustment *glyphPositionAdjustments; + le_int32 srcIndex; + le_int32 destIndex; le_uint16 lookupFlags; LETag featureTag; - const LETag **glyphTags; const GlyphClassDefinitionTable *glyphClassDefinitionTable; const MarkAttachClassDefinitionTable *markAttachClassDefinitionTable; diff --git a/icuSources/layout/GlyphLookupTables.cpp b/icuSources/layout/GlyphLookupTables.cpp new file mode 100644 index 00000000..fdc646fe --- /dev/null +++ b/icuSources/layout/GlyphLookupTables.cpp @@ -0,0 +1,32 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" +#include "ScriptAndLanguage.h" +#include "GlyphLookupTables.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +le_bool GlyphLookupTableHeader::coversScript(LETag scriptTag) const +{ + const ScriptListTable *scriptListTable = (const ScriptListTable *) ((char *)this + SWAPW(scriptListOffset)); + + return scriptListOffset != 0 && scriptListTable->findScript(scriptTag) != NULL; +} + +le_bool GlyphLookupTableHeader::coversScriptAndLanguage(LETag scriptTag, LETag languageTag, le_bool exactMatch) const +{ + const ScriptListTable *scriptListTable = (const ScriptListTable *) ((char *)this + SWAPW(scriptListOffset)); + const LangSysTable *langSysTable = scriptListTable->findLanguage(scriptTag, languageTag, exactMatch); + + // FIXME: could check featureListOffset, lookupListOffset, and lookup count... + // Note: don't have to SWAPW langSysTable->featureCount to check for non-zero. + return langSysTable != NULL && langSysTable->featureCount != 0; +} + +U_NAMESPACE_END diff --git a/icuSources/layout/GlyphLookupTables.h b/icuSources/layout/GlyphLookupTables.h new file mode 100644 index 00000000..65642d02 --- /dev/null +++ b/icuSources/layout/GlyphLookupTables.h @@ -0,0 +1,34 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __GLYPHLOOKUPTABLES_H +#define __GLYPHLOOKUPTABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" + +U_NAMESPACE_BEGIN + +struct GlyphLookupTableHeader +{ + fixed32 version; + Offset scriptListOffset; + Offset featureListOffset; + Offset lookupListOffset; + + le_bool coversScript(LETag scriptTag) const; + le_bool coversScriptAndLanguage(LETag scriptTag, LETag languageTag, le_bool exactMatch = FALSE) const; +}; + +U_NAMESPACE_END + +#endif + diff --git a/icuSources/layout/GlyphPositionAdjustments.h b/icuSources/layout/GlyphPositionAdjustments.h index 8e9b2007..871eda4a 100644 --- a/icuSources/layout/GlyphPositionAdjustments.h +++ b/icuSources/layout/GlyphPositionAdjustments.h @@ -1,7 +1,6 @@ /* - * @(#)GlyphPositionAdjustments.h 1.8 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/GlyphPositioningTables.cpp b/icuSources/layout/GlyphPositioningTables.cpp index ead6d1e8..5607711d 100644 --- a/icuSources/layout/GlyphPositioningTables.cpp +++ b/icuSources/layout/GlyphPositioningTables.cpp @@ -1,7 +1,6 @@ /* - * @(#)GlyphPositioningTables.cpp 1.7 00/03/15 * - * (C) Copyright IBM Corp. 1998, 1999, 2000, 2001 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -13,19 +12,18 @@ #include "GlyphPositionAdjustments.h" #include "GlyphPositioningTables.h" #include "GlyphPosnLookupProc.h" +#include "LEGlyphStorage.h" U_NAMESPACE_BEGIN -void GlyphPositioningTableHeader::process(LEGlyphID *glyphs, GlyphPositionAdjustment *glyphPositionAdjustments, - const LETag **glyphTags, le_int32 glyphCount, le_bool rightToLeft, +void GlyphPositioningTableHeader::process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustment *glyphPositionAdjustments, le_bool rightToLeft, LETag scriptTag, LETag languageTag, const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, const LEFontInstance *fontInstance, const LETag *featureOrder) const { GlyphPositioningLookupProcessor processor(this, scriptTag, languageTag, featureOrder); - processor.process(glyphs, glyphPositionAdjustments, glyphTags, glyphCount, rightToLeft, - glyphDefinitionTableHeader, fontInstance); + processor.process(glyphStorage, glyphPositionAdjustments, rightToLeft, glyphDefinitionTableHeader, fontInstance); } U_NAMESPACE_END diff --git a/icuSources/layout/GlyphPositioningTables.h b/icuSources/layout/GlyphPositioningTables.h index 7b0ace9e..f79a0bf3 100644 --- a/icuSources/layout/GlyphPositioningTables.h +++ b/icuSources/layout/GlyphPositioningTables.h @@ -1,7 +1,6 @@ /* - * @(#)GlyphPositioningTables.h 1.7 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -17,20 +16,17 @@ #include "LEFontInstance.h" #include "OpenTypeTables.h" #include "Lookups.h" +#include "GlyphLookupTables.h" #include "GlyphDefinitionTables.h" #include "GlyphPositionAdjustments.h" U_NAMESPACE_BEGIN -struct GlyphPositioningTableHeader -{ - fixed32 version; - Offset scriptListOffset; - Offset featureListOffset; - Offset lookupListOffset; +class LEGlyphStorage; - void process(LEGlyphID *glyphs, GlyphPositionAdjustment *glyphPositionAdjustments, - const LETag **glyphTags, le_int32 glyphCount, +struct GlyphPositioningTableHeader : public GlyphLookupTableHeader +{ + void process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustment *glyphPositionAdjustments, le_bool rightToLeft, LETag scriptTag, LETag languageTag, const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, const LEFontInstance *fontInstance, const LETag *featureOrder) const; diff --git a/icuSources/layout/GlyphPosnLookupProc.cpp b/icuSources/layout/GlyphPosnLookupProc.cpp index 50855ebe..71dafed8 100644 --- a/icuSources/layout/GlyphPosnLookupProc.cpp +++ b/icuSources/layout/GlyphPosnLookupProc.cpp @@ -1,7 +1,6 @@ /* - * @(#)GlyphPosnLookupProc.cpp 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998, 1999, 2000, 2001 - All Rights Reserved + * (C) Copyright IBM Corp. 1998 - 2004 - All Rights Reserved * */ diff --git a/icuSources/layout/GlyphPosnLookupProc.h b/icuSources/layout/GlyphPosnLookupProc.h index cf7551ce..08ca7e82 100644 --- a/icuSources/layout/GlyphPosnLookupProc.h +++ b/icuSources/layout/GlyphPosnLookupProc.h @@ -1,7 +1,6 @@ /* - * @(#)GlyphPosnLookupProc.h 1.7 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/GlyphSubstLookupProc.cpp b/icuSources/layout/GlyphSubstLookupProc.cpp index 1d0f0086..a033badf 100644 --- a/icuSources/layout/GlyphSubstLookupProc.cpp +++ b/icuSources/layout/GlyphSubstLookupProc.cpp @@ -1,7 +1,6 @@ /* - * @(#)GlyphSubstLookupProc.cpp 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998, 1999, 2000, 2001 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/GlyphSubstitutionTables.cpp b/icuSources/layout/GlyphSubstitutionTables.cpp index b5231a7d..8ae4fc8f 100644 --- a/icuSources/layout/GlyphSubstitutionTables.cpp +++ b/icuSources/layout/GlyphSubstitutionTables.cpp @@ -1,7 +1,6 @@ /* - * @(#)GlyphSubstitutionTables.cpp 1.9 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -14,32 +13,18 @@ #include "GlyphSubstitutionTables.h" #include "GlyphSubstLookupProc.h" #include "ScriptAndLanguage.h" +#include "LEGlyphStorage.h" #include "LESwaps.h" U_NAMESPACE_BEGIN -void GlyphSubstitutionTableHeader::process(LEGlyphID *glyphs, const LETag **glyphTags, le_int32 glyphCount, - le_bool rightToLeft, LETag scriptTag, LETag languageTag, +le_int32 GlyphSubstitutionTableHeader::process(LEGlyphStorage &glyphStorage, le_bool rightToLeft, LETag scriptTag, LETag languageTag, const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, const LEGlyphFilter *filter, const LETag *featureOrder) const { GlyphSubstitutionLookupProcessor processor(this, scriptTag, languageTag, filter, featureOrder); - processor.process(glyphs, NULL, glyphTags, glyphCount, rightToLeft, glyphDefinitionTableHeader, NULL); -} - -le_bool GlyphSubstitutionTableHeader::coversScript(LETag scriptTag) const -{ - const ScriptListTable *scriptListTable = (const ScriptListTable *) ((char *)this + SWAPW(scriptListOffset)); - - return scriptListTable->findScript(scriptTag) != NULL; -} - -le_bool GlyphSubstitutionTableHeader::coversScriptAndLanguage(LETag scriptTag, LETag languageTag) const -{ - const ScriptListTable *scriptListTable = (const ScriptListTable *) ((char *)this + SWAPW(scriptListOffset)); - - return scriptListTable->findLanguage(scriptTag, languageTag, true) != NULL; + return processor.process(glyphStorage, NULL, rightToLeft, glyphDefinitionTableHeader, NULL); } U_NAMESPACE_END diff --git a/icuSources/layout/GlyphSubstitutionTables.h b/icuSources/layout/GlyphSubstitutionTables.h index d38fa70f..98a33ad2 100644 --- a/icuSources/layout/GlyphSubstitutionTables.h +++ b/icuSources/layout/GlyphSubstitutionTables.h @@ -1,7 +1,6 @@ /* - * @(#)GlyphSubstitutionTables.h 1.9 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -17,25 +16,19 @@ #include "LEGlyphFilter.h" #include "OpenTypeTables.h" #include "Lookups.h" +#include "GlyphLookupTables.h" #include "GlyphDefinitionTables.h" #include "GlyphPositionAdjustments.h" U_NAMESPACE_BEGIN -struct GlyphSubstitutionTableHeader -{ - fixed32 version; - Offset scriptListOffset; - Offset featureListOffset; - Offset lookupListOffset; +class LEGlyphStorage; - void process(LEGlyphID *glyphs, const LETag **glyphTags, le_int32 glyphCount, - le_bool rightToLeft, LETag scriptTag, LETag languageTag, +struct GlyphSubstitutionTableHeader : public GlyphLookupTableHeader +{ + le_int32 process(LEGlyphStorage &glyphStorage, le_bool rightToLeft, LETag scriptTag, LETag languageTag, const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, const LEGlyphFilter *filter = NULL, const LETag *featureOrder = NULL) const; - - le_bool coversScript(LETag scriptTag) const; - le_bool coversScriptAndLanguage(LETag scriptTag, LETag languageTag) const; }; enum GlyphSubstitutionSubtableTypes diff --git a/icuSources/layout/HanLayoutEngine.cpp b/icuSources/layout/HanLayoutEngine.cpp index 05b2cb95..d319b1c5 100644 --- a/icuSources/layout/HanLayoutEngine.cpp +++ b/icuSources/layout/HanLayoutEngine.cpp @@ -1,9 +1,7 @@ /* * HanLayoutEngine.cpp: OpenType processing for Han fonts. * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved. - * - * $Source: /cvs/root/ICU/icuSources/layout/HanLayoutEngine.cpp,v $ $Date: 2003/07/03 18:13:45 $ $Revision: 1.1.1.1 $ + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved. */ #include "LETypes.h" @@ -14,8 +12,11 @@ #include "OpenTypeLayoutEngine.h" #include "HanLayoutEngine.h" #include "ScriptAndLanguageTags.h" +#include "LEGlyphStorage.h" + +U_NAMESPACE_BEGIN -const char HanOpenTypeLayoutEngine::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(HanOpenTypeLayoutEngine) HanOpenTypeLayoutEngine::HanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const GlyphSubstitutionTableHeader *gsubTable) @@ -29,16 +30,16 @@ HanOpenTypeLayoutEngine::~HanOpenTypeLayoutEngine() // nothing to do } -const LETag emptyTag = 0x00000000; +static const LETag emptyTag = 0x00000000; -const LETag loclFeatureTag = LE_LOCL_FEATURE_TAG; -const LETag smplFeatureTag = LE_SMPL_FEATURE_TAG; -const LETag tradFeatureTag = LE_TRAD_FEATURE_TAG; +static const LETag loclFeatureTag = LE_LOCL_FEATURE_TAG; +static const LETag smplFeatureTag = LE_SMPL_FEATURE_TAG; +static const LETag tradFeatureTag = LE_TRAD_FEATURE_TAG; -const LETag features[] = {loclFeatureTag, emptyTag}; +static const LETag features[] = {loclFeatureTag, emptyTag}; le_int32 HanOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool /*rightToLeft*/, - LEUnicode *&/*outChars*/, le_int32 *&/*charIndices*/, const LETag **&featureTags, LEErrorCode &success) + LEUnicode *&/*outChars*/, LEGlyphStorage &glyphStorage, LEErrorCode &success) { if (LE_FAILURE(success)) { return 0; @@ -49,10 +50,10 @@ le_int32 HanOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], l return 0; } - featureTags = LE_NEW_ARRAY(const LETag *, count); + glyphStorage.allocateGlyphArray(count, FALSE, success); + glyphStorage.allocateAuxData(success); - if (featureTags == NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; + if (LE_FAILURE(success)) { return 0; } @@ -61,8 +62,10 @@ le_int32 HanOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], l // flag from the language tag lookups, so we can use these features // with the default LangSys... for (le_int32 i = 0; i < count; i += 1) { - featureTags[i] = features; + glyphStorage.setAuxData(i, (void *) features, success); } return count; } + +U_NAMESPACE_END diff --git a/icuSources/layout/HanLayoutEngine.h b/icuSources/layout/HanLayoutEngine.h index c89c1ae7..eaeb5635 100644 --- a/icuSources/layout/HanLayoutEngine.h +++ b/icuSources/layout/HanLayoutEngine.h @@ -2,9 +2,7 @@ /* * HanLayoutEngine.h: OpenType processing for Han fonts. * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved. - * - * $Source: /cvs/root/ICU/icuSources/layout/HanLayoutEngine.h,v $ $Date: 2003/07/03 18:13:45 $ $Revision: 1.1.1.1 $ + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved. */ #ifndef __HANLAYOUTENGINE_H @@ -19,6 +17,8 @@ U_NAMESPACE_BEGIN +class LEGlyphStorage; + /** * This class implements OpenType layout for Han fonts. It overrides * the characerProcessing method to assign the correct OpenType feature @@ -60,16 +60,16 @@ public: /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } + static UClassID getStaticClassID(); protected: @@ -82,7 +82,8 @@ protected: * @param offset - the index of the first character to process * @param count - the number of characters to process * @param max - the number of characters in the input context - * @param rightToLeft - true if the characters are in a right to left directional run + * @param rightToLeft - TRUE if the characters are in a right to left directional run + * @param glyphStorage - the object holding the glyph storage. The char index and auxillary data arrays will be set. * * Output parameters: * @param outChars - the output character arrayt @@ -95,16 +96,8 @@ protected: * @internal */ virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, le_int32 *&charIndices, const LETag **&featureTags, LEErrorCode &success); - + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); -private: - - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; U_NAMESPACE_END diff --git a/icuSources/layout/HebrewLigatureData.cpp b/icuSources/layout/HebrewLigatureData.cpp deleted file mode 100644 index b1ee1901..00000000 --- a/icuSources/layout/HebrewLigatureData.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/* - * %W% %E% - * - * (C) Copyright IBM Corp. 1998, 1999, 2000, 2001, 2002 - All Rights Reserved - * - * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS - * YOU REALLY KNOW WHAT YOU'RE DOING. - * - */ - -#include "LETypes.h" -#include "HebrewShaping.h" - -U_NAMESPACE_BEGIN - -const le_uint8 HebrewShaping::glyphSubstitutionTable[] = { - 0x00, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x1E, 0x00, 0x2C, 0x00, 0x01, 0x68, 0x65, 0x62, 0x72, - 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, - 0x6C, 0x69, 0x67, 0x61, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x01, 0x62, 0x00, 0x16, 0x00, 0x32, - 0x00, 0x4C, 0x00, 0x5E, 0x00, 0x68, 0x00, 0x72, 0x00, 0x7C, 0x00, 0x8E, 0x00, 0x98, 0x00, 0xA2, - 0x00, 0xAC, 0x00, 0xB6, 0x00, 0xC8, 0x00, 0xD2, 0x00, 0xDC, 0x00, 0xE6, 0x00, 0xF0, 0x00, 0xFA, - 0x01, 0x0C, 0x01, 0x16, 0x01, 0x20, 0x01, 0x2A, 0x01, 0x58, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, - 0x00, 0x14, 0xFB, 0x2E, 0x00, 0x02, 0x05, 0xB7, 0xFB, 0x2F, 0x00, 0x02, 0x05, 0xB8, 0xFB, 0x30, - 0x00, 0x02, 0x05, 0xBC, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFB, 0x31, 0x00, 0x02, 0x05, 0xBC, - 0xFB, 0x4C, 0x00, 0x02, 0x05, 0xBF, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x32, 0x00, 0x02, 0x05, 0xBC, - 0x00, 0x01, 0x00, 0x04, 0xFB, 0x33, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x34, - 0x00, 0x02, 0x05, 0xBC, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFB, 0x4B, 0x00, 0x02, 0x05, 0xB9, - 0xFB, 0x35, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x36, 0x00, 0x02, 0x05, 0xBC, - 0x00, 0x01, 0x00, 0x04, 0xFB, 0x38, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x39, - 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x3A, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x02, - 0x00, 0x06, 0x00, 0x0C, 0xFB, 0x3B, 0x00, 0x02, 0x05, 0xBC, 0xFB, 0x4D, 0x00, 0x02, 0x05, 0xBF, - 0x00, 0x01, 0x00, 0x04, 0xFB, 0x3C, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x3E, - 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x40, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, - 0x00, 0x04, 0xFB, 0x41, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x43, 0x00, 0x02, - 0x05, 0xBC, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFB, 0x44, 0x00, 0x02, 0x05, 0xBC, 0xFB, 0x4E, - 0x00, 0x02, 0x05, 0xBF, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x46, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, - 0x00, 0x04, 0xFB, 0x47, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x48, 0x00, 0x02, - 0x05, 0xBC, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0xFB, 0x2C, - 0x00, 0x03, 0x05, 0xBC, 0x05, 0xC1, 0xFB, 0x2D, 0x00, 0x03, 0x05, 0xBC, 0x05, 0xC2, 0xFB, 0x49, - 0x00, 0x02, 0x05, 0xBC, 0xFB, 0x2A, 0x00, 0x02, 0x05, 0xC1, 0xFB, 0x2B, 0x00, 0x02, 0x05, 0xC2, - 0x00, 0x01, 0x00, 0x04, 0xFB, 0x4A, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x16, 0x05, 0xD0, - 0x05, 0xD1, 0x05, 0xD2, 0x05, 0xD3, 0x05, 0xD4, 0x05, 0xD5, 0x05, 0xD6, 0x05, 0xD8, 0x05, 0xD9, - 0x05, 0xDA, 0x05, 0xDB, 0x05, 0xDC, 0x05, 0xDE, 0x05, 0xE0, 0x05, 0xE1, 0x05, 0xE3, 0x05, 0xE4, - 0x05, 0xE6, 0x05, 0xE7, 0x05, 0xE8, 0x05, 0xE9, 0x05, 0xEA -}; - -const le_uint8 HebrewShaping::glyphDefinitionTable[] = { - 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x15, - 0x05, 0x91, 0x05, 0xA1, 0x00, 0x03, 0x05, 0xA3, 0x05, 0xB9, 0x00, 0x03, 0x05, 0xBB, 0x05, 0xBD, - 0x00, 0x03, 0x05, 0xBE, 0x05, 0xBE, 0x00, 0x01, 0x05, 0xBF, 0x05, 0xBF, 0x00, 0x03, 0x05, 0xC0, - 0x05, 0xC0, 0x00, 0x01, 0x05, 0xC1, 0x05, 0xC2, 0x00, 0x03, 0x05, 0xC3, 0x05, 0xC3, 0x00, 0x01, - 0x05, 0xC4, 0x05, 0xC4, 0x00, 0x03, 0x05, 0xD0, 0x05, 0xEA, 0x00, 0x01, 0x05, 0xF0, 0x05, 0xF2, - 0x00, 0x02, 0x05, 0xF3, 0x05, 0xF4, 0x00, 0x01, 0xFB, 0x1E, 0xFB, 0x1E, 0x00, 0x03, 0xFB, 0x1F, - 0xFB, 0x1F, 0x00, 0x02, 0xFB, 0x20, 0xFB, 0x36, 0x00, 0x01, 0xFB, 0x38, 0xFB, 0x3C, 0x00, 0x01, - 0xFB, 0x3E, 0xFB, 0x3E, 0x00, 0x01, 0xFB, 0x40, 0xFB, 0x41, 0x00, 0x01, 0xFB, 0x43, 0xFB, 0x44, - 0x00, 0x01, 0xFB, 0x46, 0xFB, 0x4E, 0x00, 0x01, 0xFB, 0x4F, 0xFB, 0x4F, 0x00, 0x02 -}; - -U_NAMESPACE_END diff --git a/icuSources/layout/HebrewShaping.cpp b/icuSources/layout/HebrewShaping.cpp deleted file mode 100644 index 4861504d..00000000 --- a/icuSources/layout/HebrewShaping.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/* - * %W% %E% - * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" -#include "HebrewShaping.h" - -U_NAMESPACE_BEGIN - -const LETag ligaFeatureTag = 0x6C696761; // 'liga' -const LETag emptyTag = 0x00000000; // '' - -const LETag hebrewTags[] = -{ - ligaFeatureTag, emptyTag -}; - -void HebrewShaping::shape(const LEUnicode * /*chars*/, le_int32 /*offset*/, le_int32 charCount, le_int32 /*charMax*/, - le_bool rightToLeft, const LETag **tags) -{ - - le_int32 count, out = 0, dir = 1; - - if (rightToLeft) { - out = charCount - 1; - dir = -1; - } - - for (count = 0; count < charCount; count += 1, out += dir) { - tags[out] = hebrewTags; - } -} - -U_NAMESPACE_END diff --git a/icuSources/layout/HebrewShaping.h b/icuSources/layout/HebrewShaping.h deleted file mode 100644 index 25a74b16..00000000 --- a/icuSources/layout/HebrewShaping.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * %W% %E% - * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved - * - */ - -#ifndef __HEBREWSHAPING_H -#define __HEBREWSHAPING_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" - -U_NAMESPACE_BEGIN - -class HebrewShaping /* not : public UObject because all methods are static */ { -public: - static void shape(const LEUnicode *chars, le_int32 offset, le_int32 charCount, le_int32 charMax, - le_bool rightToLeft, const LETag **tags); - - static const le_uint8 glyphSubstitutionTable[]; - static const le_uint8 glyphDefinitionTable[]; - -private: - // forbid instantiation - HebrewShaping(); -}; - -U_NAMESPACE_END -#endif diff --git a/icuSources/layout/HindiFeatureTags.h b/icuSources/layout/HindiFeatureTags.h index fcd80034..de78f485 100644 --- a/icuSources/layout/HindiFeatureTags.h +++ b/icuSources/layout/HindiFeatureTags.h @@ -1,7 +1,6 @@ /* - * @(#)HindiFeatureTags.h 1.4 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/IndicClassTables.cpp b/icuSources/layout/IndicClassTables.cpp index 0800ffd2..46e1b782 100644 --- a/icuSources/layout/IndicClassTables.cpp +++ b/icuSources/layout/IndicClassTables.cpp @@ -1,7 +1,6 @@ /* - * %W% %E% * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -30,18 +29,26 @@ enum // simple classes _xx = IndicClassTable::CC_RESERVED, - _ma = IndicClassTable::CC_MODIFYING_MARK_ABOVE, - _mp = IndicClassTable::CC_MODIFYING_MARK_POST, + _ma = IndicClassTable::CC_VOWEL_MODIFIER | IndicClassTable::CF_POS_ABOVE, + _mp = IndicClassTable::CC_VOWEL_MODIFIER | IndicClassTable::CF_POS_AFTER, + _sa = IndicClassTable::CC_STRESS_MARK | IndicClassTable::CF_POS_ABOVE, + _sb = IndicClassTable::CC_STRESS_MARK | IndicClassTable::CF_POS_BELOW, _iv = IndicClassTable::CC_INDEPENDENT_VOWEL, + _i2 = IndicClassTable::CC_INDEPENDENT_VOWEL_2, _ct = IndicClassTable::CC_CONSONANT | IndicClassTable::CF_CONSONANT, _cn = IndicClassTable::CC_CONSONANT_WITH_NUKTA | IndicClassTable::CF_CONSONANT, _nu = IndicClassTable::CC_NUKTA, _dv = IndicClassTable::CC_DEPENDENT_VOWEL, - _dl = _dv | IndicClassTable::CF_MATRA_PRE, - _db = _dv | IndicClassTable::CF_MATRA_BELOW, - _da = _dv | IndicClassTable::CF_MATRA_ABOVE, - _dr = _dv | IndicClassTable::CF_MATRA_POST, + _dl = _dv | IndicClassTable::CF_POS_BEFORE, + _db = _dv | IndicClassTable::CF_POS_BELOW, + _da = _dv | IndicClassTable::CF_POS_ABOVE, + _dr = _dv | IndicClassTable::CF_POS_AFTER, _lm = _dv | IndicClassTable::CF_LENGTH_MARK, + _l1 = IndicClassTable::CC_SPLIT_VOWEL_PIECE_1 | IndicClassTable::CF_POS_BEFORE, + _a1 = IndicClassTable::CC_SPLIT_VOWEL_PIECE_1 | IndicClassTable::CF_POS_ABOVE, + _r2 = IndicClassTable::CC_SPLIT_VOWEL_PIECE_2 | IndicClassTable::CF_POS_AFTER, + _m2 = IndicClassTable::CC_SPLIT_VOWEL_PIECE_2 | IndicClassTable::CF_LENGTH_MARK, + _m3 = IndicClassTable::CC_SPLIT_VOWEL_PIECE_3 | IndicClassTable::CF_LENGTH_MARK, _vr = IndicClassTable::CC_VIRAMA, // split matras @@ -71,31 +78,31 @@ enum // static const IndicClassTable::CharClass devaCharClasses[] = { - _xx, _ma, _ma, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, // 0900 - 090F + _xx, _ma, _ma, _mp, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, // 0900 - 090F _iv, _iv, _iv, _iv, _iv, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, // 0910 - 091F _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _cn, _ct, _ct, _ct, _ct, _ct, _ct, // 0920 - 092F - _rv, _cn, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _xx, _nu, _xx, _dr, _dl, // 0930 - 093F + _rv, _cn, _ct, _ct, _cn, _ct, _ct, _ct, _ct, _ct, _xx, _xx, _nu, _xx, _dr, _dl, // 0930 - 093F _dr, _db, _db, _db, _db, _da, _da, _da, _da, _dr, _dr, _dr, _dr, _vr, _xx, _xx, // 0940 - 094F - _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _cn, _cn, _cn, _cn, _cn, _cn, _cn, _cn, // 0950 - 095F + _xx, _sa, _sb, _sa, _sa, _xx, _xx, _xx, _cn, _cn, _cn, _cn, _cn, _cn, _cn, _cn, // 0950 - 095F _iv, _iv, _db, _db, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0960 - 096F _xx // 0970 }; static const IndicClassTable::CharClass bengCharClasses[] = { - _xx, _ma, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _iv, // 0980 - 098F + _xx, _ma, _mp, _mp, _xx, _i2, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _i2, // 0980 - 098F _iv, _xx, _xx, _iv, _iv, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, // 0990 - 099F _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _ct, _ct, _bb, _ct, _ct, _pb, // 09A0 - 09AF - _rv, _xx, _ct, _xx, _xx, _xx, _ct, _ct, _ct, _ct, _xx, _xx, _nu, _xx, _dr, _dl, // 09B0 - 09BF - _dr, _db, _db, _db, _db, _xx, _xx, _dl, _dl, _xx, _xx, _s1, _s2, _vr, _xx, _xx, // 09C0 - 09CF - _xx, _xx, _xx, _xx, _xx, _xx, _xx, _dr, _xx, _xx, _xx, _xx, _cn, _cn, _xx, _cn, // 09D0 - 09DF + _rv, _xx, _ct, _xx, _xx, _xx, _ct, _ct, _ct, _ct, _xx, _xx, _nu, _xx, _r2, _dl, // 09B0 - 09BF + _dr, _db, _db, _db, _db, _xx, _xx, _l1, _dl, _xx, _xx, _s1, _s2, _vr, _xx, _xx, // 09C0 - 09CF + _xx, _xx, _xx, _xx, _xx, _xx, _xx, _m2, _xx, _xx, _xx, _xx, _cn, _cn, _xx, _cn, // 09D0 - 09DF _iv, _iv, _dv, _dv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 09E0 - 09EF _ct, _ct, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx // 09F0 - 09FA }; static const IndicClassTable::CharClass punjCharClasses[] = { - _xx, _xx, _ma, _xx, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _xx, _xx, _iv, // 0A00 - 0A0F + _xx, _ma, _ma, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _xx, _xx, _iv, // 0A00 - 0A0F _iv, _xx, _xx, _iv, _iv, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, // 0A10 - 0A1F _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _ct, _ct, _ct, _ct, _ct, _bb, // 0A20 - 0A2F _vt, _xx, _ct, _ct, _xx, _bb, _ct, _xx, _ct, _bb, _xx, _xx, _nu, _xx, _dr, _dl, // 0A30 - 0A3F @@ -121,9 +128,9 @@ static const IndicClassTable::CharClass oryaCharClasses[] = _xx, _ma, _ma, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _iv, // 0B00 - 0B0F _iv, _xx, _xx, _iv, _iv, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, // 0B10 - 0B1F _ct, _ct, _ct, _ct, _bb, _ct, _ct, _ct, _bb, _xx, _ct, _ct, _bb, _bb, _bb, _pb, // 0B20 - 0B2F - _rv, _xx, _bb, _bb, _xx, _xx, _ct, _ct, _ct, _ct, _xx, _xx, _nu, _xx, _dr, _da, // 0B30 - 0B3F - _dr, _db, _db, _db, _xx, _xx, _xx, _dl, _s1, _xx, _xx, _s2, _s3, _vr, _xx, _xx, // 0B40 - 0B4F - _xx, _xx, _xx, _xx, _xx, _xx, _da, _dr, _xx, _xx, _xx, _xx, _cn, _cn, _xx, _cn, // 0B50 - 0B5F + _rv, _xx, _bb, _bb, _xx, _xx, _ct, _ct, _ct, _ct, _xx, _xx, _nu, _xx, _r2, _da, // 0B30 - 0B3F + _dr, _db, _db, _db, _xx, _xx, _xx, _l1, _s1, _xx, _xx, _s2, _s3, _vr, _xx, _xx, // 0B40 - 0B4F + _xx, _xx, _xx, _xx, _xx, _xx, _m2, _m2, _xx, _xx, _xx, _xx, _cn, _cn, _xx, _cn, // 0B50 - 0B5F _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0B60 - 0B6F _xx // 0B70 }; @@ -133,9 +140,9 @@ static const IndicClassTable::CharClass tamlCharClasses[] = _xx, _xx, _ma, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _xx, _iv, _iv, // 0B80 - 0B8F _iv, _xx, _iv, _iv, _iv, _ct, _xx, _xx, _xx, _ct, _ct, _xx, _ct, _xx, _ct, _ct, // 0B90 - 0B9F _xx, _xx, _xx, _ct, _ct, _xx, _xx, _xx, _ct, _ct, _ct, _xx, _xx, _xx, _ct, _ct, // 0BA0 - 0BAF - _ct, _ct, _ct, _ct, _ct, _ct, _xx, _ct, _ct, _ct, _xx, _xx, _xx, _xx, _dr, _dr, // 0BB0 - 0BBF - _da, _dr, _dr, _xx, _xx, _xx, _dl, _dl, _dl, _xx, _s1, _s2, _s3, _vr, _xx, _xx, // 0BC0 - 0BCF - _xx, _xx, _xx, _xx, _xx, _xx, _xx, _dr, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0BD0 - 0BDF + _ct, _ct, _ct, _ct, _ct, _ct, _xx, _ct, _ct, _ct, _xx, _xx, _xx, _xx, _r2, _dr, // 0BB0 - 0BBF + _da, _dr, _dr, _xx, _xx, _xx, _l1, _l1, _dl, _xx, _s1, _s2, _s3, _vr, _xx, _xx, // 0BC0 - 0BCF + _xx, _xx, _xx, _xx, _xx, _xx, _xx, _m2, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0BD0 - 0BDF _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0BE0 - 0BEF _xx, _xx, _xx // 0BF0 - 0BF2 }; @@ -147,20 +154,25 @@ static const IndicClassTable::CharClass teluCharClasses[] = _iv, _xx, _iv, _iv, _iv, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, // 0C10 - 0C1F _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _bb, // 0C20 - 0C2F _bb, _ct, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _xx, _xx, _xx, _xx, _da, _da, // 0C30 - 0C3F - _da, _dr, _dr, _dr, _dr, _xx, _da, _da, _s1, _xx, _da, _da, _da, _vr, _xx, _xx, // 0C40 - 0C4F - _xx, _xx, _xx, _xx, _xx, _da, _db, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0C50 - 0C5F + _da, _dr, _dr, _dr, _dr, _xx, _a1, _da, _s1, _xx, _da, _da, _da, _vr, _xx, _xx, // 0C40 - 0C4F + _xx, _xx, _xx, _xx, _xx, _da, _m2, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0C50 - 0C5F _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx // 0C60 - 0C6F }; -// FIXME: is 0CD5 a dr or an lm?? +// U+CC3 and U+CC4 are _lm here not _dr since the Kannada rendering +// rules want them below and to the right of the entire cluster +// +// There's some information about this in: +// +// http://brahmi.sourceforge.net/docs/KannadaComputing.html static const IndicClassTable::CharClass kndaCharClasses[] = { _xx, _xx, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _iv, // 0C80 - 0C8F _iv, _xx, _iv, _iv, _iv, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, // 0C90 - 0C9F _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _bb, // 0CA0 - 0CAF _rb, _ct, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _xx, _xx, _xx, _xx, _dr, _da, // 0CB0 - 0CBF - _s1, _dr, _dr, _dr, _dr, _xx, _da, _s2, _s3, _xx, _s4, _s5, _da, _vr, _xx, _xx, // 0CC0 - 0CCF - _xx, _xx, _xx, _xx, _xx, _lm, _dr, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _ct, _xx, // 0CD0 - 0CDF + _s1, _dr, _r2, _lm, _lm, _xx, _a1, _s2, _s3, _xx, _s4, _s5, _da, _vr, _xx, _xx, // 0CC0 - 0CCF + _xx, _xx, _xx, _xx, _xx, _m3, _m2, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _ct, _xx, // 0CD0 - 0CDF _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx // 0CE0 - 0CEF }; @@ -170,10 +182,10 @@ static const IndicClassTable::CharClass mlymCharClasses[] = { _xx, _xx, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _iv, _iv, // 0D00 - 0D0F _iv, _xx, _iv, _iv, _iv, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _bb, // 0D10 - 0D1F - _ct, _ct, _ct, _bb, _ct, _bb, _bb, _ct, _ct, _xx, _ct, _ct, _ct, _ct, _ct, _ct, // 0D20 - 0D2F - _pb, _cn, _bb, _ct, _ct, _pb, _ct, _ct, _ct, _ct, _xx, _xx, _xx, _xx, _dr, _dr, // 0D30 - 0D3F - _dr, _db, _db, _db, _xx, _xx, _dl, _dl, _dl, _xx, _s1, _s2, _s3, _vr, _xx, _xx, // 0D40 - 0D4F - _xx, _xx, _xx, _xx, _xx, _xx, _xx, _dr, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0D50 - 0D5F + _ct, _ct, _ct, _bb, _ct, _bb, _bb, _ct, _ct, _xx, _ct, _ct, _ct, _ct, _ct, _pb, // 0D20 - 0D2F + _pb, _cn, _bb, _ct, _ct, _pb, _ct, _ct, _ct, _ct, _xx, _xx, _xx, _xx, _r2, _dr, // 0D30 - 0D3F + _dr, _dr, _dr, _dr, _xx, _xx, _l1, _l1, _dl, _xx, _s1, _s2, _s3, _vr, _xx, _xx, // 0D40 - 0D4F + _xx, _xx, _xx, _xx, _xx, _xx, _xx, _m2, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0D50 - 0D5F _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx // 0D60 - 0D6F }; @@ -234,7 +246,7 @@ static const IndicClassTable mlymClassTable = {0x0D00, 0x0D6F, 3, MLYM_SCRIPT_FL // // IndicClassTable addresses // -static const IndicClassTable *indicClassTables[] = { +static const IndicClassTable * const indicClassTables[] = { NULL, /* 'zyyy' (COMMON) */ NULL, /* 'qaai' (INHERITED) */ NULL, /* 'arab' (ARABIC) */ @@ -288,7 +300,8 @@ static const IndicClassTable *indicClassTables[] = { NULL, /* 'osma' (OSMANYA) */ NULL, /* 'shaw' (SHAVIAN) */ NULL, /* 'tale' (TAI_LE) */ - NULL /* 'ugar' (UGARITIC) */ + NULL, /* 'ugar' (UGARITIC) */ + NULL /* 'hrkt' (KATAKANA_OR_HIRAGANA) */ }; IndicClassTable::CharClass IndicClassTable::getCharClass(LEUnicode ch) const diff --git a/icuSources/layout/IndicLayoutEngine.cpp b/icuSources/layout/IndicLayoutEngine.cpp index 92f53541..3b776a0d 100644 --- a/icuSources/layout/IndicLayoutEngine.cpp +++ b/icuSources/layout/IndicLayoutEngine.cpp @@ -1,8 +1,7 @@ /* - * @(#)IndicLayoutEngine.cpp 1.3 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -17,12 +16,13 @@ #include "GlyphPositioningTables.h" #include "GDEFMarkFilter.h" +#include "LEGlyphStorage.h" #include "IndicReordering.h" U_NAMESPACE_BEGIN -const char IndicOpenTypeLayoutEngine::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(IndicOpenTypeLayoutEngine) IndicOpenTypeLayoutEngine::IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const GlyphSubstitutionTableHeader *gsubTable) @@ -44,8 +44,8 @@ IndicOpenTypeLayoutEngine::~IndicOpenTypeLayoutEngine() // Input: characters, tags // Output: glyphs, char indices -le_int32 IndicOpenTypeLayoutEngine::glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, const LETag **featureTags, - LEGlyphID *&glyphs, le_int32 *&charIndices, LEErrorCode &success) +le_int32 IndicOpenTypeLayoutEngine::glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEGlyphStorage &glyphStorage, LEErrorCode &success) { if (LE_FAILURE(success)) { return 0; @@ -56,13 +56,13 @@ le_int32 IndicOpenTypeLayoutEngine::glyphProcessing(const LEUnicode chars[], le_ return 0; } - le_int32 retCount = OpenTypeLayoutEngine::glyphProcessing(chars, offset, count, max, rightToLeft, featureTags, glyphs, charIndices, success); + le_int32 retCount = OpenTypeLayoutEngine::glyphProcessing(chars, offset, count, max, rightToLeft, glyphStorage, success); if (LE_FAILURE(success)) { return 0; } - IndicReordering::adjustMPres(fMPreFixups, glyphs, charIndices); + IndicReordering::adjustMPres(fMPreFixups, glyphStorage); return retCount; } @@ -70,8 +70,8 @@ le_int32 IndicOpenTypeLayoutEngine::glyphProcessing(const LEUnicode chars[], le_ // Input: characters // Output: characters, char indices, tags // Returns: output character count -le_int32 IndicOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool /*rightToLeft*/, - LEUnicode *&outChars, le_int32 *&charIndices, const LETag **&featureTags, LEErrorCode &success) +le_int32 IndicOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) { if (LE_FAILURE(success)) { return 0; @@ -91,25 +91,20 @@ le_int32 IndicOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], return 0; } - charIndices = LE_NEW_ARRAY(le_int32, worstCase); - if (charIndices == NULL) { - LE_DELETE_ARRAY(outChars); - success = LE_MEMORY_ALLOCATION_ERROR; - return 0; - } + glyphStorage.allocateGlyphArray(worstCase, rightToLeft, success); + glyphStorage.allocateAuxData(success); - featureTags = LE_NEW_ARRAY(const LETag *, worstCase); - - if (featureTags == NULL) { - LE_DELETE_ARRAY(charIndices); + if (LE_FAILURE(success)) { LE_DELETE_ARRAY(outChars); - success = LE_MEMORY_ALLOCATION_ERROR; return 0; } // NOTE: assumes this allocates featureTags... // (probably better than doing the worst case stuff here...) - return IndicReordering::reorder(&chars[offset], count, fScriptCode, outChars, charIndices, featureTags, &fMPreFixups); + le_int32 outCharCount = IndicReordering::reorder(&chars[offset], count, fScriptCode, outChars, glyphStorage, &fMPreFixups); + + glyphStorage.adoptGlyphCount(outCharCount); + return outCharCount; } U_NAMESPACE_END diff --git a/icuSources/layout/IndicLayoutEngine.h b/icuSources/layout/IndicLayoutEngine.h index f7213343..e5abc021 100644 --- a/icuSources/layout/IndicLayoutEngine.h +++ b/icuSources/layout/IndicLayoutEngine.h @@ -1,8 +1,7 @@ /* - * @(#)IndicLayoutEngine.h 1.4 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -19,11 +18,10 @@ #include "GlyphDefinitionTables.h" #include "GlyphPositioningTables.h" -#include - U_NAMESPACE_BEGIN class MPreFixups; +class LEGlyphStorage; /** * This class implements OpenType layout for Indic OpenType fonts, as @@ -84,16 +82,16 @@ public: /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } + static UClassID getStaticClassID(); protected: @@ -108,12 +106,11 @@ protected: * @param offset - the index of the first character to process * @param count - the number of characters to process * @param max - the number of characters in the input context - * @param rightToLeft - true if the characters are in a right to left directional run + * @param rightToLeft - TRUE if the characters are in a right to left directional run + * @param glyphStorage - the glyph storage object. The glyph and character index arrays will be set. + * the auxillary data array will be set to the feature tags. * * Output parameters: - * @param outChars - the output character arrayt - * @param charIndices - the output character index array - * @param featureTags - the output feature tag array * @param success - set to an error code if the operation fails * * @return the output character count @@ -121,7 +118,7 @@ protected: * @internal */ virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, le_int32 *&charIndices, const LETag **&featureTags, LEErrorCode &success); + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); /** * This method does character to glyph mapping, applies the GSUB table and applies @@ -137,12 +134,11 @@ protected: * @param offset - the index of the first character to process * @param count - the number of characters to process * @param max - the number of characters in the input context - * @param rightToLeft - true if the characters are in a right to left directional run + * @param rightToLeft - TRUE if the characters are in a right to left directional run * @param featureTags - the feature tag array + * @param glyphStorage - the glyph storage object. The glyph and char index arrays will be set. * * Output parameters: - * @param glyphs - the output glyph index array - * @param charIndices - the output character index array * @param success - set to an error code if the operation fails * * @return the number of glyphs in the output glyph index array @@ -153,16 +149,10 @@ protected: * @internal */ virtual le_int32 glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - const LETag **featureTags, LEGlyphID *&glyphs, le_int32 *&charIndices, LEErrorCode &success); + LEGlyphStorage &glyphStorage, LEErrorCode &success); private: - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; - MPreFixups *fMPreFixups; }; diff --git a/icuSources/layout/IndicRearrangement.h b/icuSources/layout/IndicRearrangement.h index 8b724f49..48b1d08a 100644 --- a/icuSources/layout/IndicRearrangement.h +++ b/icuSources/layout/IndicRearrangement.h @@ -1,7 +1,6 @@ /* - * @(#)IndicRearrangement.h 1.4 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/IndicRearrangementProcessor.cpp b/icuSources/layout/IndicRearrangementProcessor.cpp index 3d93be03..92202450 100644 --- a/icuSources/layout/IndicRearrangementProcessor.cpp +++ b/icuSources/layout/IndicRearrangementProcessor.cpp @@ -1,7 +1,6 @@ /* - * @(#)IndicRearrangementProcessor.cpp 1.7 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -12,11 +11,12 @@ #include "SubtableProcessor.h" #include "StateTableProcessor.h" #include "IndicRearrangementProcessor.h" +#include "LEGlyphStorage.h" #include "LESwaps.h" U_NAMESPACE_BEGIN -const char IndicRearrangementProcessor::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(IndicRearrangementProcessor) IndicRearrangementProcessor::IndicRearrangementProcessor(const MorphSubtableHeader *morphSubtableHeader) : StateTableProcessor(morphSubtableHeader) @@ -35,8 +35,7 @@ void IndicRearrangementProcessor::beginStateTable() lastGlyph = 0; } -ByteOffset IndicRearrangementProcessor::processStateEntry(LEGlyphID *glyphs, le_int32 *charIndices, le_int32 &currGlyph, - le_int32 /*glyphCount*/, EntryTableIndex index) +ByteOffset IndicRearrangementProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index) { const IndicRearrangementStateEntry *entry = &entryTable[index]; ByteOffset newState = SWAPW(entry->newStateOffset); @@ -50,7 +49,7 @@ ByteOffset IndicRearrangementProcessor::processStateEntry(LEGlyphID *glyphs, le_ lastGlyph = currGlyph; } - doRearrangementAction(glyphs, charIndices, (IndicRearrangementVerb) (flags & irfVerbMask)); + doRearrangementAction(glyphStorage, (IndicRearrangementVerb) (flags & irfVerbMask)); if (!(flags & irfDontAdvance)) { // XXX: Should handle reverse too... @@ -64,10 +63,11 @@ void IndicRearrangementProcessor::endStateTable() { } -void IndicRearrangementProcessor::doRearrangementAction(LEGlyphID *glyphs, le_int32 *charIndices, IndicRearrangementVerb verb) const +void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphStorage, IndicRearrangementVerb verb) const { LEGlyphID a, b, c, d; - le_int32 ia, ib, ic, id, x; + le_int32 ia, ib, ic, id, ix, x; + LEErrorCode success = LE_NO_ERROR; switch(verb) { @@ -75,300 +75,319 @@ void IndicRearrangementProcessor::doRearrangementAction(LEGlyphID *glyphs, le_in break; case irvxA: - a = glyphs[firstGlyph]; - ia = charIndices[firstGlyph]; + a = glyphStorage[firstGlyph]; + ia = glyphStorage.getCharIndex(firstGlyph, success); x = firstGlyph + 1; while (x <= lastGlyph) { - glyphs[x - 1] = glyphs[x]; - charIndices[x - 1] = charIndices[x]; + glyphStorage[x - 1] = glyphStorage[x]; + ix = glyphStorage.getCharIndex(x, success); + glyphStorage.setCharIndex(x - 1, ix, success); x += 1; } - glyphs[lastGlyph] = a; - charIndices[lastGlyph] = ia; + glyphStorage[lastGlyph] = a; + glyphStorage.setCharIndex(lastGlyph, ia, success); break; case irvDx: - d = glyphs[lastGlyph]; - id = charIndices[lastGlyph]; + d = glyphStorage[lastGlyph]; + id = glyphStorage.getCharIndex(lastGlyph, success); x = lastGlyph - 1; while (x >= firstGlyph) { - glyphs[x + 1] = glyphs[x]; - charIndices[x + 1] = charIndices[x]; + glyphStorage[x + 1] = glyphStorage[x]; + ix = glyphStorage.getCharIndex(x, success); + glyphStorage.setCharIndex(x + 1, ix, success); x -= 1; } - glyphs[firstGlyph] = d; - charIndices[firstGlyph] = id; + glyphStorage[firstGlyph] = d; + glyphStorage.setCharIndex(firstGlyph, id, success); break; case irvDxA: - a = glyphs[firstGlyph]; - ia = charIndices[firstGlyph]; + a = glyphStorage[firstGlyph]; + ia = glyphStorage.getCharIndex(firstGlyph, success); + id = glyphStorage.getCharIndex(lastGlyph, success); - glyphs[firstGlyph] = glyphs[lastGlyph]; - glyphs[lastGlyph] = a; + glyphStorage[firstGlyph] = glyphStorage[lastGlyph]; + glyphStorage[lastGlyph] = a; - charIndices[firstGlyph] = charIndices[lastGlyph]; - charIndices[lastGlyph] = ia; + glyphStorage.setCharIndex(firstGlyph, id, success); + glyphStorage.setCharIndex(lastGlyph, ia, success); break; case irvxAB: - a = glyphs[firstGlyph]; - b = glyphs[firstGlyph + 1]; - ia = charIndices[firstGlyph]; - ib = charIndices[firstGlyph + 1]; + a = glyphStorage[firstGlyph]; + b = glyphStorage[firstGlyph + 1]; + ia = glyphStorage.getCharIndex(firstGlyph, success); + ib = glyphStorage.getCharIndex(firstGlyph + 1, success); x = firstGlyph + 2; while (x <= lastGlyph) { - glyphs[x - 2] = glyphs[x]; - charIndices[x - 2] = charIndices[x]; + glyphStorage[x - 2] = glyphStorage[x]; + ix = glyphStorage.getCharIndex(x, success); + glyphStorage.setCharIndex(x - 2, ix, success); x += 1; } - glyphs[lastGlyph - 1] = a; - glyphs[lastGlyph] = b; + glyphStorage[lastGlyph - 1] = a; + glyphStorage[lastGlyph] = b; - charIndices[lastGlyph - 1] = ia; - charIndices[lastGlyph] = ib; + glyphStorage.setCharIndex(lastGlyph - 1, ia, success); + glyphStorage.setCharIndex(lastGlyph, ib, success); break; case irvxBA: - a = glyphs[firstGlyph]; - b = glyphs[firstGlyph + 1]; - ia = charIndices[firstGlyph]; - ib = charIndices[firstGlyph + 1]; + a = glyphStorage[firstGlyph]; + b = glyphStorage[firstGlyph + 1]; + ia = glyphStorage.getCharIndex(firstGlyph, success); + ib = glyphStorage.getCharIndex(firstGlyph + 1, success); x = firstGlyph + 2; while (x <= lastGlyph) { - glyphs[x - 2] = glyphs[x]; - charIndices[x - 2] = charIndices[x]; + glyphStorage[x - 2] = glyphStorage[x]; + ix = glyphStorage.getCharIndex(x, success); + glyphStorage.setCharIndex(x - 2, ix, success); x += 1; } - glyphs[lastGlyph - 1] = b; - glyphs[lastGlyph] = a; + glyphStorage[lastGlyph - 1] = b; + glyphStorage[lastGlyph] = a; - charIndices[lastGlyph - 1] = ib; - charIndices[lastGlyph] = ia; + glyphStorage.setCharIndex(lastGlyph - 1, ib, success); + glyphStorage.setCharIndex(lastGlyph, ia, success); break; case irvCDx: - c = glyphs[lastGlyph - 1]; - d = glyphs[lastGlyph]; - ic = charIndices[lastGlyph - 1]; - id = charIndices[lastGlyph]; + c = glyphStorage[lastGlyph - 1]; + d = glyphStorage[lastGlyph]; + ic = glyphStorage.getCharIndex(lastGlyph - 1, success); + id = glyphStorage.getCharIndex(lastGlyph, success); x = lastGlyph - 2; - while (x >= lastGlyph) { - glyphs[x + 2] = glyphs[x]; - charIndices[x + 2] = charIndices[x]; + while (x >= firstGlyph) { + glyphStorage[x + 2] = glyphStorage[x]; + ix = glyphStorage.getCharIndex(x, success); + glyphStorage.setCharIndex(x + 2, ix, success); x -= 1; } - glyphs[firstGlyph] = c; - glyphs[firstGlyph + 1] = d; + glyphStorage[firstGlyph] = c; + glyphStorage[firstGlyph + 1] = d; - charIndices[firstGlyph] = ic; - charIndices[firstGlyph + 1] = id; + glyphStorage.setCharIndex(firstGlyph, ic, success); + glyphStorage.setCharIndex(firstGlyph + 1, id, success); break; case irvDCx: - c = glyphs[lastGlyph - 1]; - d = glyphs[lastGlyph]; - ic = charIndices[lastGlyph - 1]; - id = charIndices[lastGlyph]; + c = glyphStorage[lastGlyph - 1]; + d = glyphStorage[lastGlyph]; + ic = glyphStorage.getCharIndex(lastGlyph - 1, success); + id = glyphStorage.getCharIndex(lastGlyph, success); x = lastGlyph - 2; - while (x >= lastGlyph) { - glyphs[x + 2] = glyphs[x]; - charIndices[x + 2] = charIndices[x]; + while (x >= firstGlyph) { + glyphStorage[x + 2] = glyphStorage[x]; + ix = glyphStorage.getCharIndex(x, success); + glyphStorage.setCharIndex(x + 2, ix, success); x -= 1; } - glyphs[firstGlyph] = d; - glyphs[firstGlyph + 1] = c; + glyphStorage[firstGlyph] = d; + glyphStorage[firstGlyph + 1] = c; - charIndices[firstGlyph] = id; - charIndices[firstGlyph + 1] = ic; + glyphStorage.setCharIndex(firstGlyph, id, success); + glyphStorage.setCharIndex(firstGlyph + 1, ic, success); break; case irvCDxA: - a = glyphs[firstGlyph]; - c = glyphs[lastGlyph - 1]; - d = glyphs[lastGlyph]; - ia = charIndices[firstGlyph]; - ic = charIndices[lastGlyph - 1]; - id = charIndices[lastGlyph]; + a = glyphStorage[firstGlyph]; + c = glyphStorage[lastGlyph - 1]; + d = glyphStorage[lastGlyph]; + ia = glyphStorage.getCharIndex(firstGlyph, success); + ic = glyphStorage.getCharIndex(lastGlyph - 1, success); + id = glyphStorage.getCharIndex(lastGlyph, success); x = lastGlyph - 2; while (x > firstGlyph) { - glyphs[x + 1] = glyphs[x]; - charIndices[x + 1] = charIndices[x]; + glyphStorage[x + 1] = glyphStorage[x]; + ix = glyphStorage.getCharIndex(x, success); + glyphStorage.setCharIndex(x + 1, ix, success); x -= 1; } - glyphs[firstGlyph] = c; - glyphs[firstGlyph + 1] = d; - glyphs[lastGlyph] = a; + glyphStorage[firstGlyph] = c; + glyphStorage[firstGlyph + 1] = d; + glyphStorage[lastGlyph] = a; - charIndices[firstGlyph] = ic; - charIndices[firstGlyph + 1] = id; - charIndices[lastGlyph] = ia; + glyphStorage.setCharIndex(firstGlyph, ic, success); + glyphStorage.setCharIndex(firstGlyph + 1, id, success); + glyphStorage.setCharIndex(lastGlyph, ia, success); break; case irvDCxA: - a = glyphs[firstGlyph]; - c = glyphs[lastGlyph - 1]; - d = glyphs[lastGlyph]; - ia = charIndices[firstGlyph]; - ic = charIndices[lastGlyph - 1]; - id = charIndices[lastGlyph]; + a = glyphStorage[firstGlyph]; + c = glyphStorage[lastGlyph - 1]; + d = glyphStorage[lastGlyph]; + ia = glyphStorage.getCharIndex(firstGlyph, success); + ic = glyphStorage.getCharIndex(lastGlyph - 1, success); + id = glyphStorage.getCharIndex(lastGlyph, success); x = lastGlyph - 2; while (x > firstGlyph) { - glyphs[x + 1] = glyphs[x]; - charIndices[x + 1] = charIndices[x]; + glyphStorage[x + 1] = glyphStorage[x]; + ix = glyphStorage.getCharIndex(x, success); + glyphStorage.setCharIndex(x + 1, ix, success); x -= 1; } - glyphs[firstGlyph] = d; - glyphs[firstGlyph + 1] = c; - glyphs[lastGlyph] = a; + glyphStorage[firstGlyph] = d; + glyphStorage[firstGlyph + 1] = c; + glyphStorage[lastGlyph] = a; - charIndices[firstGlyph] = id; - charIndices[firstGlyph + 1] = ic; - charIndices[lastGlyph] = ia; + glyphStorage.setCharIndex(firstGlyph, id, success); + glyphStorage.setCharIndex(firstGlyph + 1, ic, success); + glyphStorage.setCharIndex(lastGlyph, ia, success); break; case irvDxAB: - a = glyphs[firstGlyph]; - b = glyphs[firstGlyph + 1]; - d = glyphs[lastGlyph]; - ia = charIndices[firstGlyph]; - ib = charIndices[firstGlyph + 1]; - id = charIndices[lastGlyph]; + a = glyphStorage[firstGlyph]; + b = glyphStorage[firstGlyph + 1]; + d = glyphStorage[lastGlyph]; + ia = glyphStorage.getCharIndex(firstGlyph, success); + ib = glyphStorage.getCharIndex(firstGlyph + 1, success); + id = glyphStorage.getCharIndex(lastGlyph, success); x = firstGlyph + 2; while (x < lastGlyph) { - glyphs[x - 2] = glyphs[x]; - charIndices[x - 2] = charIndices[x]; + glyphStorage[x - 2] = glyphStorage[x]; + ix = glyphStorage.getCharIndex(x, success); + glyphStorage.setCharIndex(x - 2, ix, success); x += 1; } - glyphs[firstGlyph] = d; - glyphs[lastGlyph - 1] = a; - glyphs[lastGlyph] = b; + glyphStorage[firstGlyph] = d; + glyphStorage[lastGlyph - 1] = a; + glyphStorage[lastGlyph] = b; - charIndices[firstGlyph] = id; - charIndices[lastGlyph - 1] = ia; - charIndices[lastGlyph] = ib; + glyphStorage.setCharIndex(firstGlyph, id, success); + glyphStorage.setCharIndex(lastGlyph - 1, ia, success); + glyphStorage.setCharIndex(lastGlyph, ib, success); break; case irvDxBA: - a = glyphs[firstGlyph]; - b = glyphs[firstGlyph + 1]; - d = glyphs[lastGlyph]; - ia = charIndices[firstGlyph]; - ib = charIndices[firstGlyph + 1]; - id = charIndices[lastGlyph]; + a = glyphStorage[firstGlyph]; + b = glyphStorage[firstGlyph + 1]; + d = glyphStorage[lastGlyph]; + ia = glyphStorage.getCharIndex(firstGlyph, success); + ib = glyphStorage.getCharIndex(firstGlyph + 1, success); + id = glyphStorage.getCharIndex(lastGlyph, success); x = firstGlyph + 2; while (x < lastGlyph) { - glyphs[x - 2] = glyphs[x]; - charIndices[x - 2] = charIndices[x]; + glyphStorage[x - 2] = glyphStorage[x]; + ix = glyphStorage.getCharIndex(x, success); + glyphStorage.setCharIndex(x - 2, ix, success); x += 1; } - glyphs[firstGlyph] = d; - glyphs[lastGlyph - 1] = b; - glyphs[lastGlyph] = a; + glyphStorage[firstGlyph] = d; + glyphStorage[lastGlyph - 1] = b; + glyphStorage[lastGlyph] = a; - charIndices[firstGlyph] = id; - charIndices[lastGlyph - 1] = ib; - charIndices[lastGlyph] = ia; + glyphStorage.setCharIndex(firstGlyph, id, success); + glyphStorage.setCharIndex(lastGlyph - 1, ib, success); + glyphStorage.setCharIndex(lastGlyph, ia, success); break; case irvCDxAB: - a = glyphs[firstGlyph]; - b = glyphs[firstGlyph + 1]; + a = glyphStorage[firstGlyph]; + b = glyphStorage[firstGlyph + 1]; - glyphs[firstGlyph] = glyphs[lastGlyph - 1]; - glyphs[firstGlyph + 1] = glyphs[lastGlyph]; + glyphStorage[firstGlyph] = glyphStorage[lastGlyph - 1]; + glyphStorage[firstGlyph + 1] = glyphStorage[lastGlyph]; - glyphs[lastGlyph - 1] = a; - glyphs[lastGlyph] = b; + glyphStorage[lastGlyph - 1] = a; + glyphStorage[lastGlyph] = b; - ia = charIndices[firstGlyph]; - ib = charIndices[firstGlyph + 1]; + ia = glyphStorage.getCharIndex(firstGlyph, success); + ib = glyphStorage.getCharIndex(firstGlyph + 1, success); + ic = glyphStorage.getCharIndex(lastGlyph - 1, success); + id = glyphStorage.getCharIndex(lastGlyph, success); - charIndices[firstGlyph] = charIndices[lastGlyph - 1]; - charIndices[firstGlyph + 1] = charIndices[lastGlyph]; + glyphStorage.setCharIndex(firstGlyph, ic, success); + glyphStorage.setCharIndex(firstGlyph + 1, id, success); - charIndices[lastGlyph - 1] = ia; - charIndices[lastGlyph] = ib; + glyphStorage.setCharIndex(lastGlyph - 1, ia, success); + glyphStorage.setCharIndex(lastGlyph, ib, success); break; case irvCDxBA: - a = glyphs[firstGlyph]; - b = glyphs[firstGlyph + 1]; + a = glyphStorage[firstGlyph]; + b = glyphStorage[firstGlyph + 1]; - glyphs[firstGlyph] = glyphs[lastGlyph - 1]; - glyphs[firstGlyph + 1] = glyphs[lastGlyph]; + glyphStorage[firstGlyph] = glyphStorage[lastGlyph - 1]; + glyphStorage[firstGlyph + 1] = glyphStorage[lastGlyph]; - glyphs[lastGlyph - 1] = b; - glyphs[lastGlyph] = a; + glyphStorage[lastGlyph - 1] = b; + glyphStorage[lastGlyph] = a; - ia = charIndices[firstGlyph]; - ib = charIndices[firstGlyph + 1]; + ia = glyphStorage.getCharIndex(firstGlyph, success); + ib = glyphStorage.getCharIndex(firstGlyph + 1, success); + ic = glyphStorage.getCharIndex(lastGlyph - 1, success); + id = glyphStorage.getCharIndex(lastGlyph, success); - charIndices[firstGlyph] = charIndices[lastGlyph - 1]; - charIndices[firstGlyph + 1] = charIndices[lastGlyph]; + glyphStorage.setCharIndex(firstGlyph, ic, success); + glyphStorage.setCharIndex(firstGlyph + 1, id, success); - charIndices[lastGlyph - 1] = ib; - charIndices[lastGlyph] = ia; + glyphStorage.setCharIndex(lastGlyph - 1, ib, success); + glyphStorage.setCharIndex(lastGlyph, ia, success); break; case irvDCxAB: - a = glyphs[firstGlyph]; - b = glyphs[firstGlyph + 1]; + a = glyphStorage[firstGlyph]; + b = glyphStorage[firstGlyph + 1]; - glyphs[firstGlyph] = glyphs[lastGlyph]; - glyphs[firstGlyph + 1] = glyphs[lastGlyph - 1]; + glyphStorage[firstGlyph] = glyphStorage[lastGlyph]; + glyphStorage[firstGlyph + 1] = glyphStorage[lastGlyph - 1]; - glyphs[lastGlyph - 1] = a; - glyphs[lastGlyph] = b; + glyphStorage[lastGlyph - 1] = a; + glyphStorage[lastGlyph] = b; - ia = charIndices[firstGlyph]; - ib = charIndices[firstGlyph + 1]; + ia = glyphStorage.getCharIndex(firstGlyph, success); + ib = glyphStorage.getCharIndex(firstGlyph + 1, success); + ic = glyphStorage.getCharIndex(lastGlyph - 1, success); + id = glyphStorage.getCharIndex(lastGlyph, success); - charIndices[firstGlyph] = charIndices[lastGlyph]; - charIndices[firstGlyph + 1] = charIndices[lastGlyph - 1]; + glyphStorage.setCharIndex(firstGlyph, id, success); + glyphStorage.setCharIndex(firstGlyph + 1, ic, success); - charIndices[lastGlyph - 1] = ia; - charIndices[lastGlyph] = ib; + glyphStorage.setCharIndex(lastGlyph - 1, ia, success); + glyphStorage.setCharIndex(lastGlyph, ib, success); break; case irvDCxBA: - a = glyphs[firstGlyph]; - b = glyphs[firstGlyph + 1]; + a = glyphStorage[firstGlyph]; + b = glyphStorage[firstGlyph + 1]; - glyphs[firstGlyph] = glyphs[lastGlyph]; - glyphs[firstGlyph + 1] = glyphs[lastGlyph - 1]; + glyphStorage[firstGlyph] = glyphStorage[lastGlyph]; + glyphStorage[firstGlyph + 1] = glyphStorage[lastGlyph - 1]; - glyphs[lastGlyph - 1] = b; - glyphs[lastGlyph] = a; + glyphStorage[lastGlyph - 1] = b; + glyphStorage[lastGlyph] = a; - ia = charIndices[firstGlyph]; - ib = charIndices[firstGlyph + 1]; + ia = glyphStorage.getCharIndex(firstGlyph, success); + ib = glyphStorage.getCharIndex(firstGlyph + 1, success); + ic = glyphStorage.getCharIndex(lastGlyph - 1, success); + id = glyphStorage.getCharIndex(lastGlyph, success); - charIndices[firstGlyph] = charIndices[lastGlyph]; - charIndices[firstGlyph + 1] = charIndices[lastGlyph - 1]; + glyphStorage.setCharIndex(firstGlyph, id, success); + glyphStorage.setCharIndex(firstGlyph + 1, ic, success); - charIndices[lastGlyph - 1] = ib; - charIndices[lastGlyph] = ia; + glyphStorage.setCharIndex(lastGlyph - 1, ib, success); + glyphStorage.setCharIndex(lastGlyph, ia, success); break; default: diff --git a/icuSources/layout/IndicRearrangementProcessor.h b/icuSources/layout/IndicRearrangementProcessor.h index b18baf31..0cb46ddf 100644 --- a/icuSources/layout/IndicRearrangementProcessor.h +++ b/icuSources/layout/IndicRearrangementProcessor.h @@ -1,7 +1,6 @@ /* - * @(#)IndicRearrangementProcessor.h 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -21,17 +20,18 @@ U_NAMESPACE_BEGIN +class LEGlyphStorage; + class IndicRearrangementProcessor : public StateTableProcessor { public: virtual void beginStateTable(); - virtual ByteOffset processStateEntry(LEGlyphID *glyphs, le_int32 *charIndices, le_int32 &currGlyph, - le_int32 glyphCount, EntryTableIndex index); + virtual ByteOffset processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index); virtual void endStateTable(); - void doRearrangementAction(LEGlyphID *glyphs, le_int32 *charIndices, IndicRearrangementVerb verb) const; + void doRearrangementAction(LEGlyphStorage &glyphStorage, IndicRearrangementVerb verb) const; IndicRearrangementProcessor(const MorphSubtableHeader *morphSubtableHeader); virtual ~IndicRearrangementProcessor(); @@ -39,16 +39,16 @@ public: /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } + static UClassID getStaticClassID(); protected: le_int32 firstGlyph; @@ -57,13 +57,6 @@ protected: const IndicRearrangementStateEntry *entryTable; const IndicRearrangementSubtableHeader *indicRearrangementSubtableHeader; -private: - - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; U_NAMESPACE_END diff --git a/icuSources/layout/IndicReordering.cpp b/icuSources/layout/IndicReordering.cpp index c0a77f36..ae290428 100644 --- a/icuSources/layout/IndicReordering.cpp +++ b/icuSources/layout/IndicReordering.cpp @@ -1,9 +1,6 @@ /* - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved * - * $Source: /cvs/root/ICU/icuSources/layout/IndicReordering.cpp,v $ - * $Date: 2003/07/03 18:13:45 $ - * $Revision: 1.1.1.2 $ + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -11,6 +8,7 @@ #include "OpenTypeTables.h" #include "OpenTypeUtilities.h" #include "IndicReordering.h" +#include "LEGlyphStorage.h" #include "MPreFixups.h" U_NAMESPACE_BEGIN @@ -18,43 +16,83 @@ U_NAMESPACE_BEGIN class ReorderingOutput : public UMemory { private: le_int32 fOutIndex; - LEUnicode *fOutChars; - le_int32 *fCharIndices; - const LETag **fCharTags; + + LEGlyphStorage &fGlyphStorage; LEUnicode fMpre; + le_int32 fMpreIndex; + LEUnicode fMbelow; + le_int32 fMbelowIndex; + LEUnicode fMabove; + le_int32 fMaboveIndex; + LEUnicode fMpost; + le_int32 fMpostIndex; + LEUnicode fLengthMark; - le_int32 fMatraIndex; + le_int32 fLengthMarkIndex; + const LETag *fMatraTags; + le_int32 fMPreOutIndex; - MPreFixups *fMPreFixups; - - void saveMatra(LEUnicode matra, IndicClassTable::CharClass matraClass) + + LEUnicode fVMabove; + LEUnicode fVMpost; + le_int32 fVMIndex; + const LETag *fVMTags; + + LEUnicode fSMabove; + LEUnicode fSMbelow; + le_int32 fSMIndex; + const LETag *fSMTags; + + void saveMatra(LEUnicode matra, le_int32 matraIndex, IndicClassTable::CharClass matraClass) { // FIXME: check if already set, or if not a matra... - if (IndicClassTable::isMpre(matraClass)) { - fMpre = matra; - } else if (IndicClassTable::isMbelow(matraClass)) { - fMbelow = matra; - } else if (IndicClassTable::isMabove(matraClass)) { - fMabove = matra; - } else if (IndicClassTable::isMpost(matraClass)) { - fMpost = matra; - } else if (IndicClassTable::isLengthMark(matraClass)) { + if (IndicClassTable::isLengthMark(matraClass)) { fLengthMark = matra; + fLengthMarkIndex = matraIndex; + } else { + switch (matraClass & IndicClassTable::CF_POS_MASK) { + case IndicClassTable::CF_POS_BEFORE: + fMpre = matra; + fMpreIndex = matraIndex; + break; + + case IndicClassTable::CF_POS_BELOW: + fMbelow = matra; + fMbelowIndex = matraIndex; + break; + + case IndicClassTable::CF_POS_ABOVE: + fMabove = matra; + fMaboveIndex = matraIndex; + break; + + case IndicClassTable::CF_POS_AFTER: + fMpost = matra; + fMpostIndex = matraIndex; + break; + + default: + // can't get here... + break; + } } } public: - ReorderingOutput(LEUnicode *outChars, le_int32 *charIndices, const LETag **charTags, MPreFixups *mpreFixups) - : fOutIndex(0), fOutChars(outChars), fCharIndices(charIndices), fCharTags(charTags), - fMpre(0), fMbelow(0), fMabove(0), fMpost(0), fLengthMark(0), - fMatraIndex(0), fMatraTags(NULL), fMPreOutIndex(-1), fMPreFixups(mpreFixups) + ReorderingOutput(LEUnicode *outChars, LEGlyphStorage &glyphStorage, MPreFixups *mpreFixups) + : fOutIndex(0), fOutChars(outChars), fGlyphStorage(glyphStorage), + fMpre(0), fMpreIndex(0), fMbelow(0), fMbelowIndex(0), fMabove(0), fMaboveIndex(0), + fMpost(0), fMpostIndex(0), fLengthMark(0), fLengthMarkIndex(0), fMatraTags(NULL), + fMPreOutIndex(-1), fMPreFixups(mpreFixups), + fVMabove(0), fVMpost(0), fVMIndex(0), fVMTags(NULL), + fSMabove(0), fSMbelow(0), fSMIndex(0), fSMTags(NULL) { // nothing else to do... } @@ -64,14 +102,20 @@ public: // nothing to do here... } - void noteMatra(const IndicClassTable *classTable, LEUnicode matra, le_uint32 matraIndex, const LETag *matraTags) + void reset() { - IndicClassTable::CharClass matraClass = classTable->getCharClass(matra); - fMpre = fMbelow = fMabove = fMpost = fLengthMark = 0; fMPreOutIndex = -1; - fMatraIndex = matraIndex; - fMatraTags = matraTags; + + fVMabove = fVMpost = 0; + fSMabove = fSMbelow = 0; + } + + le_bool noteMatra(const IndicClassTable *classTable, LEUnicode matra, le_uint32 matraIndex, const LETag *matraTags) + { + IndicClassTable::CharClass matraClass = classTable->getCharClass(matra); + + fMatraTags = matraTags; if (IndicClassTable::isMatra(matraClass)) { if (IndicClassTable::isSplitMatra(matraClass)) { @@ -82,11 +126,63 @@ public: LEUnicode piece = (*splitMatra)[i]; IndicClassTable::CharClass pieceClass = classTable->getCharClass(piece); - saveMatra(piece, pieceClass); + saveMatra(piece, matraIndex, pieceClass); } } else { - saveMatra(matra, matraClass); + saveMatra(matra, matraIndex, matraClass); } + + return TRUE; + } + + return FALSE; + } + + void noteVowelModifier(const IndicClassTable *classTable, LEUnicode vowelModifier, le_uint32 vowelModifierIndex, const LETag *vowelModifierTags) + { + IndicClassTable::CharClass vmClass = classTable->getCharClass(vowelModifier); + + fVMIndex = vowelModifierIndex; + fVMTags = vowelModifierTags; + + if (IndicClassTable::isVowelModifier(vmClass)) { + switch (vmClass & IndicClassTable::CF_POS_MASK) { + case IndicClassTable::CF_POS_ABOVE: + fVMabove = vowelModifier; + break; + + case IndicClassTable::CF_POS_AFTER: + fVMpost = vowelModifier; + break; + + default: + // FIXME: this is an error... + break; + } + } + } + + void noteStressMark(const IndicClassTable *classTable, LEUnicode stressMark, le_uint32 stressMarkIndex, const LETag *stressMarkTags) + { + IndicClassTable::CharClass smClass = classTable->getCharClass(stressMark); + + fSMIndex = stressMarkIndex; + fSMTags = stressMarkTags; + + if (IndicClassTable::isStressMark(smClass)) { + switch (smClass & IndicClassTable::CF_POS_MASK) { + case IndicClassTable::CF_POS_ABOVE: + fSMabove = stressMark; + break; + + case IndicClassTable::CF_POS_BELOW: + fSMbelow = stressMark; + break; + + default: + // FIXME: this is an error... + break; + } } } @@ -101,43 +197,74 @@ public: { if (fMpre != 0) { fMPreOutIndex = fOutIndex; - writeChar(fMpre, fMatraIndex, fMatraTags); + writeChar(fMpre, fMpreIndex, fMatraTags); } } void writeMbelow() { if (fMbelow != 0) { - writeChar(fMbelow, fMatraIndex, fMatraTags); + writeChar(fMbelow, fMbelowIndex, fMatraTags); } } void writeMabove() { if (fMabove != 0) { - writeChar(fMabove, fMatraIndex, fMatraTags); + writeChar(fMabove, fMaboveIndex, fMatraTags); } } void writeMpost() { if (fMpost != 0) { - writeChar(fMpost, fMatraIndex, fMatraTags); + writeChar(fMpost, fMpostIndex, fMatraTags); } } void writeLengthMark() { if (fLengthMark != 0) { - writeChar(fLengthMark, fMatraIndex, fMatraTags); + writeChar(fLengthMark, fLengthMarkIndex, fMatraTags); } } - + + void writeVMabove() + { + if (fVMabove != 0) { + writeChar(fVMabove, fVMIndex, fVMTags); + } + } + + void writeVMpost() + { + if (fVMpost != 0) { + writeChar(fVMpost, fVMIndex, fVMTags); + } + } + + void writeSMabove() + { + if (fSMabove != 0) { + writeChar(fSMabove, fSMIndex, fSMTags); + } + } + + void writeSMbelow() + { + if (fSMbelow != 0) { + writeChar(fSMbelow, fSMIndex, fSMTags); + } + } + void writeChar(LEUnicode ch, le_uint32 charIndex, const LETag *charTags) { + LEErrorCode success = LE_NO_ERROR; + fOutChars[fOutIndex] = ch; - fCharIndices[fOutIndex] = charIndex; - fCharTags[fOutIndex] = charTags; + + fGlyphStorage.setCharIndex(fOutIndex, charIndex, success); + fGlyphStorage.setAuxData(fOutIndex, (void *) charTags, success); fOutIndex += 1; } @@ -153,28 +280,28 @@ enum C_DOTTED_CIRCLE = 0x25CC }; -const LETag emptyTag = 0x00000000; // '' - -const LETag nuktFeatureTag = LE_NUKT_FEATURE_TAG; -const LETag akhnFeatureTag = LE_AKHN_FEATURE_TAG; -const LETag rphfFeatureTag = LE_RPHF_FEATURE_TAG; -const LETag blwfFeatureTag = LE_BLWF_FEATURE_TAG; -const LETag halfFeatureTag = LE_HALF_FEATURE_TAG; -const LETag pstfFeatureTag = LE_PSTF_FEATURE_TAG; -const LETag vatuFeatureTag = LE_VATU_FEATURE_TAG; -const LETag presFeatureTag = LE_PRES_FEATURE_TAG; -const LETag blwsFeatureTag = LE_BLWS_FEATURE_TAG; -const LETag abvsFeatureTag = LE_ABVS_FEATURE_TAG; -const LETag pstsFeatureTag = LE_PSTS_FEATURE_TAG; -const LETag halnFeatureTag = LE_HALN_FEATURE_TAG; - -const LETag blwmFeatureTag = LE_BLWM_FEATURE_TAG; -const LETag abvmFeatureTag = LE_ABVM_FEATURE_TAG; -const LETag distFeatureTag = LE_DIST_FEATURE_TAG; +static const LETag emptyTag = 0x00000000; // '' + +static const LETag nuktFeatureTag = LE_NUKT_FEATURE_TAG; +static const LETag akhnFeatureTag = LE_AKHN_FEATURE_TAG; +static const LETag rphfFeatureTag = LE_RPHF_FEATURE_TAG; +static const LETag blwfFeatureTag = LE_BLWF_FEATURE_TAG; +static const LETag halfFeatureTag = LE_HALF_FEATURE_TAG; +static const LETag pstfFeatureTag = LE_PSTF_FEATURE_TAG; +static const LETag vatuFeatureTag = LE_VATU_FEATURE_TAG; +static const LETag presFeatureTag = LE_PRES_FEATURE_TAG; +static const LETag blwsFeatureTag = LE_BLWS_FEATURE_TAG; +static const LETag abvsFeatureTag = LE_ABVS_FEATURE_TAG; +static const LETag pstsFeatureTag = LE_PSTS_FEATURE_TAG; +static const LETag halnFeatureTag = LE_HALN_FEATURE_TAG; + +static const LETag blwmFeatureTag = LE_BLWM_FEATURE_TAG; +static const LETag abvmFeatureTag = LE_ABVM_FEATURE_TAG; +static const LETag distFeatureTag = LE_DIST_FEATURE_TAG; // These are in the order in which the features need to be applied // for correct processing -const LETag featureOrder[] = +static const LETag featureOrder[] = { nuktFeatureTag, akhnFeatureTag, rphfFeatureTag, blwfFeatureTag, halfFeatureTag, pstfFeatureTag, vatuFeatureTag, presFeatureTag, blwsFeatureTag, abvsFeatureTag, pstsFeatureTag, halnFeatureTag, @@ -186,25 +313,27 @@ const LETag featureOrder[] = // FIXME: do we want a seperate tag array for each kind of character?? // FIXME: are there cases where this ordering causes glyphs to get tags // that they shouldn't? -const LETag tagArray[] = +static const LETag tagArray[] = { rphfFeatureTag, blwfFeatureTag, halfFeatureTag, pstfFeatureTag, nuktFeatureTag, akhnFeatureTag, vatuFeatureTag, presFeatureTag, blwsFeatureTag, abvsFeatureTag, pstsFeatureTag, halnFeatureTag, blwmFeatureTag, abvmFeatureTag, distFeatureTag, emptyTag }; -const le_int8 stateTable[][IndicClassTable::CC_COUNT] = +static const le_int8 stateTable[][IndicClassTable::CC_COUNT] = { -// xx ma mp iv ct cn nu dv vr zw - { 1, 1, 1, 5, 3, 2, 1, 1, 1, 1}, - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, - {-1, 6, 1, -1, -1, -1, -1, 5, 4, -1}, - {-1, 6, 1, -1, -1, -1, 2, 5, 4, -1}, - {-1, -1, -1, -1, 3, 2, -1, -1, -1, 8}, - {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1}, - {-1, 7, 1, -1, -1, -1, -1, -1, -1, -1}, - {-1, -1, 1, -1, -1, -1, -1, -1, -1, -1}, - {-1, -1, -1, -1, 3, 2, -1, -1, -1, -1} +// xx vm sm iv i2 ct cn nu dv s1 s2 s3 vr zw + { 1, 1, 1, 5, 8, 3, 2, 1, 5, 9, 5, 1, 1, 1}, // 0 - ground state + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 1 - exit state + {-1, 6, 1, -1, -1, -1, -1, -1, 5, 9, 5, 5, 4, -1}, // 2 - consonant + {-1, 6, 1, -1, -1, -1, -1, 2, 5, 9, 5, 5, 4, -1}, // 3 - consonant with nukta + {-1, -1, -1, -1, -1, 3, 2, -1, -1, -1, -1, -1, -1, 7}, // 4 - consonant virama + {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 5 - dependent vowels + {-1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 6 - vowel mark + {-1, -1, -1, -1, -1, 3, 2, -1, -1, -1, -1, -1, -1, -1}, // 7 - ZWJ, ZWNJ + {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, -1}, // 8 - independent vowels that can take a virama + {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, 10, 5, -1, -1}, // 9 - first part of split vowel + {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, 5, -1, -1} // 10 - second part of split vowel }; @@ -234,7 +363,7 @@ le_int32 IndicReordering::findSyllable(const IndicClassTable *classTable, const } le_int32 IndicReordering::reorder(const LEUnicode *chars, le_int32 charCount, le_int32 scriptCode, - LEUnicode *outChars, le_int32 *charIndices, const LETag **charTags, + LEUnicode *outChars, LEGlyphStorage &glyphStorage, MPreFixups **outMPreFixups) { MPreFixups *mpreFixups = NULL; @@ -244,24 +373,30 @@ le_int32 IndicReordering::reorder(const LEUnicode *chars, le_int32 charCount, le mpreFixups = new MPreFixups(charCount); } - ReorderingOutput output(outChars, charIndices, charTags, mpreFixups); + ReorderingOutput output(outChars, glyphStorage, mpreFixups); le_int32 i, prev = 0; while (prev < charCount) { le_int32 syllable = findSyllable(classTable, chars, prev, charCount); - le_int32 matra, vmabove, vmpost = syllable; + le_int32 matra, markStart = syllable; - while (vmpost > prev && classTable->isVMpost(chars[vmpost - 1])) { - vmpost -= 1; + output.reset(); + + if (classTable->isStressMark(chars[markStart - 1])) { + markStart -= 1; + output.noteStressMark(classTable, chars[markStart], markStart, &tagArray[1]); } - - vmabove = vmpost; - while (vmabove > prev && classTable->isVMabove(chars[vmabove - 1])) { - vmabove -= 1; + + if (classTable->isVowelModifier(chars[markStart - 1])) { + markStart -= 1; + output.noteVowelModifier(classTable, chars[markStart], markStart, &tagArray[1]); } - matra = vmabove - 1; - output.noteMatra(classTable, chars[matra], matra, &tagArray[1]); + matra = markStart - 1; + + while (output.noteMatra(classTable, chars[matra], matra, &tagArray[1]) && matra != prev) { + matra -= 1; + } switch (classTable->getCharClass(chars[prev]) & IndicClassTable::CF_CLASS_MASK) { case IndicClassTable::CC_RESERVED: @@ -273,8 +408,6 @@ le_int32 IndicReordering::reorder(const LEUnicode *chars, le_int32 charCount, le break; - case IndicClassTable::CC_MODIFYING_MARK_ABOVE: - case IndicClassTable::CC_MODIFYING_MARK_POST: case IndicClassTable::CC_NUKTA: case IndicClassTable::CC_VIRAMA: output.writeChar(C_DOTTED_CIRCLE, prev, &tagArray[1]); @@ -282,19 +415,48 @@ le_int32 IndicReordering::reorder(const LEUnicode *chars, le_int32 charCount, le break; case IndicClassTable::CC_DEPENDENT_VOWEL: + case IndicClassTable::CC_SPLIT_VOWEL_PIECE_1: + case IndicClassTable::CC_SPLIT_VOWEL_PIECE_2: + case IndicClassTable::CC_SPLIT_VOWEL_PIECE_3: + case IndicClassTable::CC_VOWEL_MODIFIER: + case IndicClassTable::CC_STRESS_MARK: output.writeMpre(); + output.writeChar(C_DOTTED_CIRCLE, prev, &tagArray[1]); + output.writeMbelow(); + output.writeSMbelow(); output.writeMabove(); - output.writeMpost(); + + if ((classTable->scriptFlags & IndicClassTable::SF_MATRAS_AFTER_BASE) != 0) { + output.writeMpost(); + } + + if ((classTable->scriptFlags & IndicClassTable::SF_REPH_AFTER_BELOW) != 0) { + output.writeVMabove(); + output.writeSMabove(); // FIXME: there are no SM's in these scripts... + } + + if ((classTable->scriptFlags & IndicClassTable::SF_MATRAS_AFTER_BASE) == 0) { + output.writeMpost(); + } + output.writeLengthMark(); + + if ((classTable->scriptFlags & IndicClassTable::SF_REPH_AFTER_BELOW) == 0) { + output.writeVMabove(); + output.writeSMabove(); + } + + output.writeVMpost(); break; + case IndicClassTable::CC_INDEPENDENT_VOWEL_2: case IndicClassTable::CC_CONSONANT: case IndicClassTable::CC_CONSONANT_WITH_NUKTA: { - le_uint32 length = vmabove - prev; - le_int32 lastConsonant = vmabove - 1; + le_uint32 length = markStart - prev; + le_int32 lastConsonant = markStart - 1; le_int32 baseLimit = prev; // Check for REPH at front of syllable @@ -319,8 +481,12 @@ le_int32 IndicReordering::reorder(const LEUnicode *chars, le_int32 charCount, le le_int32 baseConsonant = lastConsonant; le_int32 postBase = lastConsonant + 1; le_int32 postBaseLimit = classTable->scriptFlags & IndicClassTable::SF_POST_BASE_LIMIT_MASK; - le_bool seenVattu = false; - le_bool seenBelowBaseForm = false; + le_bool seenVattu = FALSE; + le_bool seenBelowBaseForm = FALSE; + + if (classTable->isNukta(chars[postBase])) { + postBase += 1; + } while (baseConsonant > baseLimit) { IndicClassTable::CharClass charClass = classTable->getCharClass(chars[baseConsonant]); @@ -341,7 +507,7 @@ le_int32 IndicReordering::reorder(const LEUnicode *chars, le_int32 charCount, le postBase = baseConsonant; } else if (IndicClassTable::hasBelowBaseForm(charClass)) { - seenBelowBaseForm = true; + seenBelowBaseForm = TRUE; } postBaseLimit -= 1; @@ -362,11 +528,12 @@ le_int32 IndicReordering::reorder(const LEUnicode *chars, le_int32 charCount, le } // write any pre-base consonants - le_bool supressVattu = true; + le_bool supressVattu = TRUE; for (i = baseLimit; i < baseConsonant; i += 1) { LEUnicode ch = chars[i]; - const LETag *tag = &tagArray[1]; + // Don't put 'blwf' on first consonant. + const LETag *tag = (i == baseLimit? &tagArray[2] : &tagArray[1]); IndicClassTable::CharClass charClass = classTable->getCharClass(ch); if (IndicClassTable::isConsonant(charClass)) { @@ -385,14 +552,14 @@ le_int32 IndicReordering::reorder(const LEUnicode *chars, le_int32 charCount, le le_int32 bcSpan = baseConsonant + 1; - if (bcSpan < vmabove && classTable->isNukta(chars[bcSpan])) { + if (bcSpan < markStart && classTable->isNukta(chars[bcSpan])) { bcSpan += 1; } - if (baseConsonant == lastConsonant && bcSpan < vmabove && classTable->isVirama(chars[bcSpan])) { + if (baseConsonant == lastConsonant && bcSpan < markStart && classTable->isVirama(chars[bcSpan])) { bcSpan += 1; - if (bcSpan < vmabove && chars[bcSpan] == C_SIGN_ZWNJ) { + if (bcSpan < markStart && chars[bcSpan] == C_SIGN_ZWNJ) { bcSpan += 1; } } @@ -407,6 +574,7 @@ le_int32 IndicReordering::reorder(const LEUnicode *chars, le_int32 charCount, le if ((classTable->scriptFlags & IndicClassTable::SF_MATRAS_AFTER_BASE) != 0) { output.writeMbelow(); + output.writeSMbelow(); // FIXME: there are no SMs in these scripts... output.writeMabove(); output.writeMpost(); } @@ -423,22 +591,21 @@ le_int32 IndicReordering::reorder(const LEUnicode *chars, le_int32 charCount, le } } - // write Mbelow, Mabove + // write Mbelow, SMbelow, Mabove if ((classTable->scriptFlags & IndicClassTable::SF_MATRAS_AFTER_BASE) == 0) { output.writeMbelow(); + output.writeSMbelow(); output.writeMabove(); } - if ((classTable->scriptFlags & IndicClassTable::SF_REPH_AFTER_BELOW) != 0) { + if ((classTable->scriptFlags & IndicClassTable::SF_REPH_AFTER_BELOW) != 0) { if (baseLimit == prev + 2) { output.writeChar(chars[prev], prev, &tagArray[0]); output.writeChar(chars[prev + 1], prev + 1, &tagArray[0]); } - // write VMabove - for (i = vmabove; i < vmpost; i += 1) { - output.writeChar(chars[i], i, &tagArray[1]); - } + output.writeVMabove(); + output.writeSMabove(); // FIXME: there are no SM's in these scripts... } // write post-base consonants @@ -473,16 +640,11 @@ le_int32 IndicReordering::reorder(const LEUnicode *chars, le_int32 charCount, le output.writeChar(chars[prev + 1], prev + 1, &tagArray[0]); } - // write VMabove - for (i = vmabove; i < vmpost; i += 1) { - output.writeChar(chars[i], i, &tagArray[1]); - } + output.writeVMabove(); + output.writeSMabove(); } - // write VMpost - for (i = vmpost; i < syllable; i += 1) { - output.writeChar(chars[i], i, &tagArray[1]); - } + output.writeVMpost(); break; } @@ -499,10 +661,10 @@ le_int32 IndicReordering::reorder(const LEUnicode *chars, le_int32 charCount, le return output.getOutputIndex(); } -void IndicReordering::adjustMPres(MPreFixups *mpreFixups, LEGlyphID *glyphs, le_int32 *charIndices) +void IndicReordering::adjustMPres(MPreFixups *mpreFixups, LEGlyphStorage &glyphStorage) { if (mpreFixups != NULL) { - mpreFixups->apply(glyphs, charIndices); + mpreFixups->apply(glyphStorage); delete mpreFixups; } diff --git a/icuSources/layout/IndicReordering.h b/icuSources/layout/IndicReordering.h index 50cea02b..f38ef936 100644 --- a/icuSources/layout/IndicReordering.h +++ b/icuSources/layout/IndicReordering.h @@ -1,9 +1,6 @@ /* - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved * - * $Source: /cvs/root/ICU/icuSources/layout/IndicReordering.h,v $ - * $Date: 2003/07/03 18:13:45 $ - * $Revision: 1.1.1.2 $ + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -29,23 +26,28 @@ enum typedef LEUnicode SplitMatra[3]; -class MPreFixups; +class MPreFixups; +class LEGlyphStorage; struct IndicClassTable { enum CharClassValues { - CC_RESERVED = 0, - CC_MODIFYING_MARK_ABOVE = 1, - CC_MODIFYING_MARK_POST = 2, - CC_INDEPENDENT_VOWEL = 3, - CC_CONSONANT = 4, - CC_CONSONANT_WITH_NUKTA = 5, - CC_NUKTA = 6, - CC_DEPENDENT_VOWEL = 7, - CC_VIRAMA = 8, - CC_ZERO_WIDTH_MARK = 9, - CC_COUNT = 10 + CC_RESERVED = 0, + CC_VOWEL_MODIFIER = 1, + CC_STRESS_MARK = 2, + CC_INDEPENDENT_VOWEL = 3, + CC_INDEPENDENT_VOWEL_2 = 4, + CC_CONSONANT = 5, + CC_CONSONANT_WITH_NUKTA = 6, + CC_NUKTA = 7, + CC_DEPENDENT_VOWEL = 8, + CC_SPLIT_VOWEL_PIECE_1 = 9, + CC_SPLIT_VOWEL_PIECE_2 = 10, + CC_SPLIT_VOWEL_PIECE_3 = 11, + CC_VIRAMA = 12, + CC_ZERO_WIDTH_MARK = 13, + CC_COUNT = 14 }; enum CharClassFlags @@ -58,17 +60,19 @@ struct IndicClassTable CF_VATTU = 0x20000000, CF_BELOW_BASE = 0x10000000, CF_POST_BASE = 0x08000000, - - CF_MATRA_PRE = 0x04000000, - CF_MATRA_BELOW = 0x02000000, - CF_MATRA_ABOVE = 0x01000000, - CF_MATRA_POST = 0x00800000, - CF_LENGTH_MARK = 0x00400000, + CF_LENGTH_MARK = 0x04000000, + + CF_POS_BEFORE = 0x00300000, + CF_POS_BELOW = 0x00200000, + CF_POS_ABOVE = 0x00100000, + CF_POS_AFTER = 0x00000000, + CF_POS_MASK = 0x00300000, + CF_INDEX_MASK = 0x000F0000, CF_INDEX_SHIFT = 16 }; - typedef le_int32 CharClass; + typedef le_uint32 CharClass; enum ScriptFlagBits { @@ -95,8 +99,8 @@ struct IndicClassTable CharClass getCharClass(LEUnicode ch) const; const SplitMatra *getSplitMatra(CharClass charClass) const; - le_bool isVMabove(LEUnicode ch) const; - le_bool isVMpost(LEUnicode ch) const; + le_bool isVowelModifier(LEUnicode ch) const; + le_bool isStressMark(LEUnicode ch) const; le_bool isConsonant(LEUnicode ch) const; le_bool isReph(LEUnicode ch) const; le_bool isVirama(LEUnicode ch) const; @@ -104,17 +108,13 @@ struct IndicClassTable le_bool isVattu(LEUnicode ch) const; le_bool isMatra(LEUnicode ch) const; le_bool isSplitMatra(LEUnicode ch) const; - le_bool isMpre(LEUnicode ch) const; - le_bool isMbelow(LEUnicode ch) const; - le_bool isMabove(LEUnicode ch) const; - le_bool isMpost(LEUnicode ch) const; le_bool isLengthMark(LEUnicode ch) const; le_bool hasPostOrBelowBaseForm(LEUnicode ch) const; le_bool hasPostBaseForm(LEUnicode ch) const; le_bool hasBelowBaseForm(LEUnicode ch) const; - static le_bool isVMabove(CharClass charClass); - static le_bool isVMpost(CharClass charClass); + static le_bool isVowelModifier(CharClass charClass); + static le_bool isStressMark(CharClass charClass); static le_bool isConsonant(CharClass charClass); static le_bool isReph(CharClass charClass); static le_bool isVirama(CharClass charClass); @@ -122,10 +122,6 @@ struct IndicClassTable static le_bool isVattu(CharClass charClass); static le_bool isMatra(CharClass charClass); static le_bool isSplitMatra(CharClass charClass); - static le_bool isMpre(CharClass charClass); - static le_bool isMbelow(CharClass charClass); - static le_bool isMabove(CharClass charClass); - static le_bool isMpost(CharClass charClass); static le_bool isLengthMark(CharClass charClass); static le_bool hasPostOrBelowBaseForm(CharClass charClass); static le_bool hasPostBaseForm(CharClass charClass); @@ -139,10 +135,10 @@ public: static le_int32 getWorstCaseExpansion(le_int32 scriptCode); static le_int32 reorder(const LEUnicode *theChars, le_int32 charCount, le_int32 scriptCode, - LEUnicode *outChars, le_int32 *charIndices, const LETag **charTags, + LEUnicode *outChars, LEGlyphStorage &glyphStorage, MPreFixups **outMPreFixups); - static void adjustMPres(MPreFixups *mpreFixups, LEGlyphID *glyphs, le_int32 *charIndices); + static void adjustMPres(MPreFixups *mpreFixups, LEGlyphStorage &glyphStorage); static const LETag *getFeatureOrder(); @@ -166,14 +162,14 @@ inline const SplitMatra *IndicClassTable::getSplitMatra(CharClass charClass) con return &splitMatraTable[index - 1]; } -inline le_bool IndicClassTable::isVMabove(CharClass charClass) +inline le_bool IndicClassTable::isVowelModifier(CharClass charClass) { - return (charClass & CF_CLASS_MASK) == CC_MODIFYING_MARK_ABOVE; + return (charClass & CF_CLASS_MASK) == CC_VOWEL_MODIFIER; } -inline le_bool IndicClassTable::isVMpost(CharClass charClass) +inline le_bool IndicClassTable::isStressMark(CharClass charClass) { - return (charClass & CF_CLASS_MASK) == CC_MODIFYING_MARK_POST; + return (charClass & CF_CLASS_MASK) == CC_STRESS_MARK; } inline le_bool IndicClassTable::isConsonant(CharClass charClass) @@ -203,7 +199,9 @@ inline le_bool IndicClassTable::isVattu(CharClass charClass) inline le_bool IndicClassTable::isMatra(CharClass charClass) { - return (charClass & CF_CLASS_MASK) == CC_DEPENDENT_VOWEL; + charClass &= CF_CLASS_MASK; + + return charClass >= CC_DEPENDENT_VOWEL && charClass <= CC_SPLIT_VOWEL_PIECE_3; } inline le_bool IndicClassTable::isSplitMatra(CharClass charClass) @@ -211,26 +209,6 @@ inline le_bool IndicClassTable::isSplitMatra(CharClass charClass) return (charClass & CF_INDEX_MASK) != 0; } -inline le_bool IndicClassTable::isMpre(CharClass charClass) -{ - return (charClass & CF_MATRA_PRE) != 0; -} - -inline le_bool IndicClassTable::isMbelow(CharClass charClass) -{ - return (charClass & CF_MATRA_BELOW) != 0; -} - -inline le_bool IndicClassTable::isMabove(CharClass charClass) -{ - return (charClass & CF_MATRA_ABOVE) != 0; -} - -inline le_bool IndicClassTable::isMpost(CharClass charClass) -{ - return (charClass & CF_MATRA_POST) != 0; -} - inline le_bool IndicClassTable::isLengthMark(CharClass charClass) { return (charClass & CF_LENGTH_MARK) != 0; @@ -251,14 +229,14 @@ inline le_bool IndicClassTable::hasBelowBaseForm(CharClass charClass) return (charClass & CF_BELOW_BASE) != 0; } -inline le_bool IndicClassTable::isVMabove(LEUnicode ch) const +inline le_bool IndicClassTable::isVowelModifier(LEUnicode ch) const { - return isVMabove(getCharClass(ch)); + return isVowelModifier(getCharClass(ch)); } -inline le_bool IndicClassTable::isVMpost(LEUnicode ch) const +inline le_bool IndicClassTable::isStressMark(LEUnicode ch) const { - return isVMpost(getCharClass(ch)); + return isStressMark(getCharClass(ch)); } inline le_bool IndicClassTable::isConsonant(LEUnicode ch) const @@ -296,26 +274,6 @@ inline le_bool IndicClassTable::isSplitMatra(LEUnicode ch) const return isSplitMatra(getCharClass(ch)); } -inline le_bool IndicClassTable::isMpre(LEUnicode ch) const -{ - return isMpre(getCharClass(ch)); -} - -inline le_bool IndicClassTable::isMbelow(LEUnicode ch) const -{ - return isMbelow(getCharClass(ch)); -} - -inline le_bool IndicClassTable::isMabove(LEUnicode ch) const -{ - return isMabove(getCharClass(ch)); -} - -inline le_bool IndicClassTable::isMpost(LEUnicode ch) const -{ - return isMpost(getCharClass(ch)); -} - inline le_bool IndicClassTable::isLengthMark(LEUnicode ch) const { return isLengthMark(getCharClass(ch)); diff --git a/icuSources/layout/LEFontInstance.cpp b/icuSources/layout/LEFontInstance.cpp index 31641718..0bbb6279 100644 --- a/icuSources/layout/LEFontInstance.cpp +++ b/icuSources/layout/LEFontInstance.cpp @@ -1,7 +1,7 @@ /* ******************************************************************************* * - * Copyright (C) 1999-2003, International Business Machines + * Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -14,10 +14,11 @@ #include "LETypes.h" #include "LEScripts.h" #include "LEFontInstance.h" +#include "LEGlyphStorage.h" U_NAMESPACE_BEGIN -const char LEFontInstance::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LEFontInstance) const LEFontInstance *LEFontInstance::getSubFont(const LEUnicode chars[], le_int32 *offset, le_int32 limit, le_int32 script, LEErrorCode &success) const @@ -36,7 +37,7 @@ const LEFontInstance *LEFontInstance::getSubFont(const LEUnicode chars[], le_int } void LEFontInstance::mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, - le_bool reverse, const LECharMapper *mapper, LEGlyphID glyphs[]) const + le_bool reverse, const LECharMapper *mapper, LEGlyphStorage &glyphStorage) const { le_int32 i, out = 0, dir = 1; @@ -57,11 +58,11 @@ void LEFontInstance::mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, } } - glyphs[out] = mapCharToGlyph(code, mapper); + glyphStorage[out] = mapCharToGlyph(code, mapper); if (code >= 0x10000) { i += 1; - glyphs[out += dir] = 0xFFFF; + glyphStorage[out += dir] = 0xFFFF; } } } diff --git a/icuSources/layout/LEFontInstance.h b/icuSources/layout/LEFontInstance.h index 3fc9a659..2a6714eb 100644 --- a/icuSources/layout/LEFontInstance.h +++ b/icuSources/layout/LEFontInstance.h @@ -1,8 +1,7 @@ /* - * @(#)LEFontInstance.h 1.3 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -14,8 +13,8 @@ U_NAMESPACE_BEGIN /** - * Instances of this class are used by LEFontInstance::mapCharsToGlyphs and - * LEFontInstance::mapCharToGlyph to adjust character codes before the character + * Instances of this class are used by LEFontInstance::mapCharsToGlyphs and + * LEFontInstance::mapCharToGlyph to adjust character codes before the character * to glyph mapping process. Examples of this are filtering out control characters * and character mirroring - replacing a character which has both a left and a right * hand form with the opposite form. @@ -38,11 +37,19 @@ public: * * @return the adjusted character * - * @draft ICU 2.2 + * @stable ICU 2.8 */ virtual LEUnicode32 mapChar(LEUnicode32 ch) const = 0; }; +/** + * This is a forward reference to the class which holds the per-glyph + * storage. + * + * @draft ICU 3.0 + */ +class LEGlyphStorage; + /** * This is a virtual base class that serves as the interface between a LayoutEngine * and the platform font environment. It allows a LayoutEngine to access font tables, do @@ -65,7 +72,7 @@ public: * methods with some default behavior such as returning constant values, or using the * values from the first subfont. * - * @draft ICU 2.6 + * @draft ICU 3.0 */ class U_LAYOUT_API LEFontInstance : public UObject { @@ -75,7 +82,7 @@ public: * This virtual destructor is here so that the subclass * destructors can be invoked through the base class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ virtual inline ~LEFontInstance() {}; @@ -150,7 +157,7 @@ public: * @return the address of the table in memory, or NULL * if the table doesn't exist. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ virtual const void *getFontTable(LETag tableTag) const = 0; @@ -161,12 +168,12 @@ public: * to glyph mapping. * * The default implementation of this method will return - * true if mapCharToGlyph(ch) + * TRUE if mapCharToGlyph(ch) * returns a non-zero value. * * @param ch - the character to be tested * - * @return true if the font can render ch. + * @return TRUE if the font can render ch. * * @draft ICU 2.6 */ @@ -178,7 +185,7 @@ public: * * @return the number of design units pre EM. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ virtual le_int32 getUnitsPerEM() const = 0; @@ -186,18 +193,25 @@ public: * This method maps an array of character codes to an array of glyph * indices, using the font's character to glyph map. * + * The default implementation iterates over all of the characters and calls + * mapCharToGlyph(ch, mapper) on each one. It also handles surrogate + * characters, storing the glyph ID for the high surrogate, and a deleted glyph (0xFFFF) + * for the low surrogate. + * + * Most sublcasses will not need to implement this method. + * * @param chars - the character array * @param offset - the index of the first character * @param count - the number of characters - * @param reverse - if true, store the glyph indices in reverse order. + * @param reverse - if TRUE, store the glyph indices in reverse order. * @param mapper - the character mapper. - * @param glyphs - the output glyph array + * @param glyphStorage - the object which contains the output glyph array * * @see LECharMapper * - * @draft ICU 2.6 + * @draft ICU 3.0 */ - virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, const LECharMapper *mapper, LEGlyphID glyphs[]) const; + virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, const LECharMapper *mapper, LEGlyphStorage &glyphStorage) const; /** * This method maps a single character to a glyph index, using the @@ -251,9 +265,9 @@ public: * @param pointNumber - the number of the point * @param point - the point's X and Y pixel values will be stored here * - * @return true if the point coordinates could be stored. + * @return TRUE if the point coordinates could be stored. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ virtual le_bool getGlyphPoint(LEGlyphID glyph, le_int32 pointNumber, LEPoint &point) const = 0; @@ -263,7 +277,7 @@ public: * * @return the pixel width of the EM square * - * @draft ICU 2.2 + * @stable ICU 2.8 */ virtual float getXPixelsPerEm() const = 0; @@ -273,7 +287,7 @@ public: * * @return the pixel height of the EM square * - * @draft ICU 2.2 + * @stable ICU 2.8 */ virtual float getYPixelsPerEm() const = 0; @@ -395,7 +409,7 @@ public: * * @return the floating point value * - * @draft ICU 2.2 + * @stable ICU 2.8 */ static float fixedToFloat(le_int32 fixed); @@ -407,7 +421,7 @@ public: * * @return the fixed point value * - * @draft ICU 2.2 + * @stable ICU 2.8 */ static le_int32 floatToFixed(float theFloat); @@ -464,22 +478,15 @@ public: * * @draft ICU 2.6 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * * @draft ICU 2.6 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } - -private: + static UClassID getStaticClassID(); - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; inline le_bool LEFontInstance::canDisplay(LEUnicode32 ch) const diff --git a/icuSources/layout/LEGlyphFilter.h b/icuSources/layout/LEGlyphFilter.h index 04a844ef..8fbae220 100644 --- a/icuSources/layout/LEGlyphFilter.h +++ b/icuSources/layout/LEGlyphFilter.h @@ -1,7 +1,6 @@ /* - * @(#)LEGlyphFilter.h 1.3 00/03/15 * - * (C) Copyright IBM Corp. 1998, 1999, 2000, 2001, 2002 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -24,7 +23,7 @@ public: * Destructor. * @draft ICU 2.4 */ - virtual inline ~LEGlyphFilter() {}; + virtual ~LEGlyphFilter(); /** * This method is used to test a particular @@ -33,7 +32,7 @@ public: * * @param glyph - the glyph index to be tested * - * @return true if the glyph index is in the set. + * @return TRUE if the glyph index is in the set. * * @internal */ diff --git a/icuSources/layout/LEGlyphStorage.cpp b/icuSources/layout/LEGlyphStorage.cpp new file mode 100644 index 00000000..36da0f7e --- /dev/null +++ b/icuSources/layout/LEGlyphStorage.cpp @@ -0,0 +1,586 @@ +/* + ********************************************************************** + * Copyright (C) 1998-2004, International Business Machines + * Corporation and others. All Rights Reserved. + ********************************************************************** + */ + +#include "LETypes.h" +#include "LEInsertionList.h" +#include "LEGlyphStorage.h" + +U_NAMESPACE_BEGIN + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LEGlyphStorage) + +LEGlyphStorage::LEGlyphStorage() + : fGlyphCount(0), fGlyphs(NULL), fCharIndices(NULL), fPositions(NULL), + fAuxData(NULL), fInsertionList(NULL), fSrcIndex(0), fDestIndex(0) +{ + // nothing else to do! +} + +LEGlyphStorage::~LEGlyphStorage() +{ + reset(); +} + +void LEGlyphStorage::reset() +{ + fGlyphCount = 0; + + if (fPositions != NULL) { + LE_DELETE_ARRAY(fPositions); + fPositions = NULL; + } + + if (fAuxData != NULL) { + LE_DELETE_ARRAY(fAuxData); + fAuxData = NULL; + } + + if (fInsertionList != NULL) { + delete fInsertionList; + fInsertionList = NULL; + } + + if (fCharIndices != NULL) { + LE_DELETE_ARRAY(fCharIndices); + fCharIndices = NULL; + } + + if (fGlyphs != NULL) { + LE_DELETE_ARRAY(fGlyphs); + fGlyphs = NULL; + } +} + +// FIXME: This might get called more than once, for various reasons. Is +// testing for pre-existing glyph and charIndices arrays good enough? +void LEGlyphStorage::allocateGlyphArray(le_int32 initialGlyphCount, le_bool rightToLeft, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return; + } + + if (initialGlyphCount <= 0) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + if (fGlyphs == NULL) { + fGlyphCount = initialGlyphCount; + fGlyphs = LE_NEW_ARRAY(LEGlyphID, fGlyphCount); + + if (fGlyphs == NULL) { + success = LE_MEMORY_ALLOCATION_ERROR; + return; + } + } + + if (fCharIndices == NULL) { + fCharIndices = LE_NEW_ARRAY(le_int32, fGlyphCount); + + if (fCharIndices == NULL) { + LE_DELETE_ARRAY(fGlyphs); + fGlyphs = NULL; + success = LE_MEMORY_ALLOCATION_ERROR; + return; + } + + // Initialize the charIndices array + le_int32 i, count = fGlyphCount, dir = 1, out = 0; + + if (rightToLeft) { + out = fGlyphCount - 1; + dir = -1; + } + + for (i = 0; i < count; i += 1, out += dir) { + fCharIndices[out] = i; + } + } + + if (fInsertionList == NULL) { + // FIXME: check this for failure? + fInsertionList = new LEInsertionList(rightToLeft); + } +} + +// FIXME: do we want to initialize the positions to [0, 0]? +le_int32 LEGlyphStorage::allocatePositions(LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return -1; + } + + fPositions = LE_NEW_ARRAY(float, 2 * (fGlyphCount + 1)); + + if (fPositions == NULL) { + success = LE_MEMORY_ALLOCATION_ERROR; + return -1; + } + + return fGlyphCount; +} + +// FIXME: do we want to initialize the aux data to NULL? +le_int32 LEGlyphStorage::allocateAuxData(LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return -1; + } + + fAuxData = LE_NEW_ARRAY(void *, fGlyphCount); + + if (fAuxData == NULL) { + success = LE_MEMORY_ALLOCATION_ERROR; + return -1; + } + + return fGlyphCount; +} + +void LEGlyphStorage::getCharIndices(le_int32 charIndices[], le_int32 indexBase, LEErrorCode &success) const +{ + le_int32 i; + + if (LE_FAILURE(success)) { + return; + } + + if (charIndices == NULL) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + if (fCharIndices == NULL) { + success = LE_NO_LAYOUT_ERROR; + return; + } + + for (i = 0; i < fGlyphCount; i += 1) { + charIndices[i] = fCharIndices[i] + indexBase; + } +} + +void LEGlyphStorage::getCharIndices(le_int32 charIndices[], LEErrorCode &success) const +{ + if (LE_FAILURE(success)) { + return; + } + + if (charIndices == NULL) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + if (fCharIndices == NULL) { + success = LE_NO_LAYOUT_ERROR; + return; + } + + LE_ARRAY_COPY(charIndices, fCharIndices, fGlyphCount); +} + +// Copy the glyphs into caller's (32-bit) glyph array, OR in extraBits +void LEGlyphStorage::getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, LEErrorCode &success) const +{ + le_int32 i; + + if (LE_FAILURE(success)) { + return; + } + + if (glyphs == NULL) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + if (fGlyphs == NULL) { + success = LE_NO_LAYOUT_ERROR; + return; + } + + for (i = 0; i < fGlyphCount; i += 1) { + glyphs[i] = fGlyphs[i] | extraBits; + } +} + +void LEGlyphStorage::getGlyphs(LEGlyphID glyphs[], LEErrorCode &success) const +{ + if (LE_FAILURE(success)) { + return; + } + + if (glyphs == NULL) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + if (fGlyphs == NULL) { + success = LE_NO_LAYOUT_ERROR; + return; + } + + LE_ARRAY_COPY(glyphs, fGlyphs, fGlyphCount); +} + +LEGlyphID LEGlyphStorage::getGlyphID(le_int32 glyphIndex, LEErrorCode &success) const +{ + if (LE_FAILURE(success)) { + return 0xFFFF; + } + + if (fGlyphs == NULL) { + success = LE_NO_LAYOUT_ERROR; + return 0xFFFF; + } + + if (glyphIndex < 0 || glyphIndex >= fGlyphCount) { + success = LE_INDEX_OUT_OF_BOUNDS_ERROR; + return 0xFFFF; + } + + return fGlyphs[glyphIndex]; +} + +void LEGlyphStorage::setGlyphID(le_int32 glyphIndex, LEGlyphID glyphID, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return; + } + + if (fGlyphs == NULL) { + success = LE_NO_LAYOUT_ERROR; + return; + } + + if (glyphIndex < 0 || glyphIndex >= fGlyphCount) { + success = LE_INDEX_OUT_OF_BOUNDS_ERROR; + return; + } + + fGlyphs[glyphIndex] = glyphID; +} + +le_int32 LEGlyphStorage::getCharIndex(le_int32 glyphIndex, LEErrorCode &success) const +{ + if (LE_FAILURE(success)) { + return -1; + } + + if (fCharIndices == NULL) { + success = LE_NO_LAYOUT_ERROR; + return -1; + } + + if (glyphIndex < 0 || glyphIndex >= fGlyphCount) { + success = LE_INDEX_OUT_OF_BOUNDS_ERROR; + return -1; + } + + return fCharIndices[glyphIndex]; +} + +void LEGlyphStorage::setCharIndex(le_int32 glyphIndex, le_int32 charIndex, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return; + } + + if (fCharIndices == NULL) { + success = LE_NO_LAYOUT_ERROR; + return; + } + + if (glyphIndex < 0 || glyphIndex >= fGlyphCount) { + success = LE_INDEX_OUT_OF_BOUNDS_ERROR; + return; + } + + fCharIndices[glyphIndex] = charIndex; +} + +void LEGlyphStorage::getAuxData(void *auxData[], LEErrorCode &success) const +{ + if (LE_FAILURE(success)) { + return; + } + + if (auxData == NULL) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + if (fAuxData == NULL) { + success = LE_NO_LAYOUT_ERROR; + return; + } + + LE_ARRAY_COPY(auxData, fAuxData, fGlyphCount); +} + +void *LEGlyphStorage::getAuxData(le_int32 glyphIndex, LEErrorCode &success) const +{ + if (LE_FAILURE(success)) { + return NULL; + } + + if (fAuxData == NULL) { + success = LE_NO_LAYOUT_ERROR; + return NULL; + } + + if (glyphIndex < 0 || glyphIndex >= fGlyphCount) { + success = LE_INDEX_OUT_OF_BOUNDS_ERROR; + return NULL; + } + + return fAuxData[glyphIndex]; +} + +void LEGlyphStorage::setAuxData(le_int32 glyphIndex, void *auxData, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return; + } + + if (fAuxData == NULL) { + success = LE_NO_LAYOUT_ERROR; + return; + } + + if (glyphIndex < 0 || glyphIndex >= fGlyphCount) { + success = LE_INDEX_OUT_OF_BOUNDS_ERROR; + return; + } + + fAuxData[glyphIndex] = auxData; +} + +void LEGlyphStorage::getGlyphPositions(float positions[], LEErrorCode &success) const +{ + if (LE_FAILURE(success)) { + return; + } + + if (positions == NULL) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + if (fPositions == NULL) { + success = LE_NO_LAYOUT_ERROR; + return; + } + + LE_ARRAY_COPY(positions, fPositions, fGlyphCount * 2 + 2); +} + +void LEGlyphStorage::getGlyphPosition(le_int32 glyphIndex, float &x, float &y, LEErrorCode &success) const +{ + if (LE_FAILURE(success)) { + return; + } + + if (glyphIndex < 0 || glyphIndex > fGlyphCount) { + success = LE_INDEX_OUT_OF_BOUNDS_ERROR; + return; + } + + if (fPositions == NULL) { + success = LE_NO_LAYOUT_ERROR; + return; + } + + x = fPositions[glyphIndex * 2]; + y = fPositions[glyphIndex * 2 + 1]; +} + +void LEGlyphStorage::setPosition(le_int32 glyphIndex, float x, float y, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return; + } + + if (glyphIndex < 0 || glyphIndex > fGlyphCount) { + success = LE_INDEX_OUT_OF_BOUNDS_ERROR; + return; + } + + fPositions[glyphIndex * 2] = x; + fPositions[glyphIndex * 2 + 1] = y; +} + +void LEGlyphStorage::adjustPosition(le_int32 glyphIndex, float xAdjust, float yAdjust, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return; + } + + if (glyphIndex < 0 || glyphIndex > fGlyphCount) { + success = LE_INDEX_OUT_OF_BOUNDS_ERROR; + return; + } + + fPositions[glyphIndex * 2] += xAdjust; + fPositions[glyphIndex * 2 + 1] += yAdjust; +} + +void LEGlyphStorage::adoptGlyphArray(LEGlyphStorage &from) +{ + if (fGlyphs != NULL) { + LE_DELETE_ARRAY(fGlyphs); + } + + fGlyphs = from.fGlyphs; + from.fGlyphs = NULL; + + if (fInsertionList != NULL) { + delete fInsertionList; + } + + fInsertionList = from.fInsertionList; + from.fInsertionList = NULL; +} + +void LEGlyphStorage::adoptCharIndicesArray(LEGlyphStorage &from) +{ + if (fCharIndices != NULL) { + LE_DELETE_ARRAY(fCharIndices); + } + + fCharIndices = from.fCharIndices; + from.fCharIndices = NULL; +} + +void LEGlyphStorage::adoptPositionArray(LEGlyphStorage &from) +{ + if (fPositions != NULL) { + LE_DELETE_ARRAY(fPositions); + } + + fPositions = from.fPositions; + from.fPositions = NULL; +} + +void LEGlyphStorage::adoptAuxDataArray(LEGlyphStorage &from) +{ + if (fAuxData != NULL) { + LE_DELETE_ARRAY(fAuxData); + } + + fAuxData = from.fAuxData; + from.fAuxData = NULL; +} + +void LEGlyphStorage::adoptGlyphCount(LEGlyphStorage &from) +{ + fGlyphCount = from.fGlyphCount; +} + +void LEGlyphStorage::adoptGlyphCount(le_int32 newGlyphCount) +{ + fGlyphCount = newGlyphCount; +} + +// FIXME: add error checking? +LEGlyphID *LEGlyphStorage::insertGlyphs(le_int32 atIndex, le_int32 insertCount) +{ + return fInsertionList->insert(atIndex, insertCount); +} + +le_int32 LEGlyphStorage::applyInsertions() +{ + le_int32 growAmount = fInsertionList->getGrowAmount(); + + if (growAmount == 0) { + return fGlyphCount; + } + + le_int32 newGlyphCount = fGlyphCount + growAmount; + + fGlyphs = (LEGlyphID *) LE_GROW_ARRAY(fGlyphs, newGlyphCount); + fCharIndices = (le_int32 *) LE_GROW_ARRAY(fCharIndices, newGlyphCount); + + if (fAuxData != NULL) { + fAuxData = (void **) LE_GROW_ARRAY(fAuxData, newGlyphCount); + } + + fSrcIndex = fGlyphCount - 1; + fDestIndex = newGlyphCount - 1; + +#if 0 + // If the current position is at the end of the array + // update it to point to the end of the new array. The + // insertion callback will handle all other cases. + // FIXME: this is left over from GlyphIterator, but there's no easy + // way to implement this here... it seems that GlyphIterator doesn't + // really need it 'cause the insertions don't get applied until after a + // complete pass over the glyphs, after which the iterator gets reset anyhow... + // probably better to just document that for LEGlyphStorage and GlyphIterator... + if (position == glyphCount) { + position = newGlyphCount; + } +#endif + + fInsertionList->applyInsertions(this); + + fInsertionList->reset(); + + return fGlyphCount = newGlyphCount; +} + +le_bool LEGlyphStorage::applyInsertion(le_int32 atPosition, le_int32 count, LEGlyphID newGlyphs[]) +{ +#if 0 + // if the current position is within the block we're shifting + // it needs to be updated to the current glyph's + // new location. + // FIXME: this is left over from GlyphIterator, but there's no easy + // way to implement this here... it seems that GlyphIterator doesn't + // really need it 'cause the insertions don't get applied until after a + // complete pass over the glyphs, after which the iterator gets reset anyhow... + // probably better to just document that for LEGlyphStorage and GlyphIterator... + if (position >= atPosition && position <= fSrcIndex) { + position += fDestIndex - fSrcIndex; + } +#endif + + if (fAuxData != NULL) { + le_int32 src = fSrcIndex, dest = fDestIndex; + + while (src > atPosition) { + fAuxData[dest--] = fAuxData[src--]; + } + + for (le_int32 i = count - 1; i >= 0; i -= 1) { + fAuxData[dest--] = fAuxData[atPosition]; + } + } + + while (fSrcIndex > atPosition) { + fGlyphs[fDestIndex] = fGlyphs[fSrcIndex]; + fCharIndices[fDestIndex] = fCharIndices[fSrcIndex]; + + fDestIndex -= 1; + fSrcIndex -= 1; + } + + for (le_int32 i = count - 1; i >= 0; i -= 1) { + fGlyphs[fDestIndex] = newGlyphs[i]; + fCharIndices[fDestIndex] = fCharIndices[atPosition]; + + fDestIndex -= 1; + } + + // the source glyph we're pointing at + // just got replaced by the insertion + fSrcIndex -= 1; + + return FALSE; +} + +U_NAMESPACE_END + diff --git a/icuSources/layout/LEGlyphStorage.h b/icuSources/layout/LEGlyphStorage.h new file mode 100644 index 00000000..90051b9f --- /dev/null +++ b/icuSources/layout/LEGlyphStorage.h @@ -0,0 +1,499 @@ +/* + ********************************************************************** + * Copyright (C) 1998-2004, International Business Machines + * Corporation and others. All Rights Reserved. + ********************************************************************** + */ + +#ifndef __LEGLYPHSTORAGE_H +#define __LEGLYPHSTORAGE_H + +#include "LETypes.h" +#include "LEInsertionList.h" + +U_NAMESPACE_BEGIN + +/** + * This class encapsulates the per-glyph storage used by the ICU LayoutEngine. + * For each glyph it holds the glyph ID, the index of the backing store character + * which produced the glyph, the X and Y position of the glyph and an auxillary data + * pointer. + * + * The storage is growable using the LEInsertionList class. + * + * + * @see LEInsertionList.h + * + * @draft ICU 3.0 + */ +class U_LAYOUT_API LEGlyphStorage : public UObject, protected LEInsertionCallback +{ +private: + /** + * The number of entries in the per-glyph arrays. + * + * @internal + */ + le_int32 fGlyphCount; + + /** + * The glyph ID array. + * + * @internal + */ + LEGlyphID *fGlyphs; + + /** + * The char indices array. + * + * @internal + */ + le_int32 *fCharIndices; + + /** + * The glyph positions array. + * + * @internal + */ + float *fPositions; + + /** + * The auxillary data array. + * + * @internal + */ + void **fAuxData; + + + /** + * The insertion list, used to grow the above arrays. + * + * @internal + */ + LEInsertionList *fInsertionList; + + /** + * The source index while growing the data arrays. + * + * @internal + */ + le_int32 fSrcIndex; + + /** + * The destination index used while growing the data arrays. + * + * @internal + */ + le_int32 fDestIndex; + +protected: + /** + * This implements LEInsertionCallback. The LEInsertionList + * will call this method once for each insertion. + * + * @param atPosition the position of the insertion + * @param count the number of glyphs being inserted + * @param newGlyphs the address of the new glyph IDs + * + * @return true if LEInsertionList should stop + * processing the insertion list after this insertion. + * + * @see LEInsertionList.h + * + * @draft ICU 3.0 + */ + virtual le_bool applyInsertion(le_int32 atPosition, le_int32 count, LEGlyphID newGlyphs[]); + +public: + + /** + * Allocates an empty LEGlyphStorage object. You must call + * allocateGlyphArray, allocatePositions and allocateAuxData + * to allocate the data. + */ + LEGlyphStorage(); + + /** + * The destructor. This will deallocate all of the arrays. + */ + ~LEGlyphStorage(); + + /** + * This method returns the number of glyphs in the glyph array. + * + * @return the number of glyphs in the glyph array + * + * @draft ICU 3.0 + */ + le_int32 getGlyphCount() const + { + return fGlyphCount; + }; + + /** + * This method copies the glyph array into a caller supplied array. + * The caller must ensure that the array is large enough to hold all + * the glyphs. + * + * @param glyphs - the destiniation glyph array + * @param success - set to an error code if the operation fails + * + * @draft ICU 3.0 + */ + void getGlyphs(LEGlyphID glyphs[], LEErrorCode &success) const; + + /** + * This method copies the glyph array into a caller supplied array, + * ORing in extra bits. (This functionality is needed by the JDK, + * which uses 32 bits pre glyph idex, with the high 16 bits encoding + * the composite font slot number) + * + * @param glyphs - the destination (32 bit) glyph array + * @param extraBits - this value will be ORed with each glyph index + * @param success - set to an error code if the operation fails + * + * @draft ICU 3.0 + */ + void getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, LEErrorCode &success) const; + + /** + * This method copies the character index array into a caller supplied array. + * The caller must ensure that the array is large enough to hold a + * character index for each glyph. + * + * @param charIndices - the destiniation character index array + * @param success - set to an error code if the operation fails + * + * @draft ICU 3.0 + */ + void getCharIndices(le_int32 charIndices[], LEErrorCode &success) const; + + /** + * This method copies the character index array into a caller supplied array. + * The caller must ensure that the array is large enough to hold a + * character index for each glyph. + * + * @param charIndices - the destiniation character index array + * @param indexBase - an offset which will be added to each index + * @param success - set to an error code if the operation fails + * + * @draft ICU 3.0 + */ + void getCharIndices(le_int32 charIndices[], le_int32 indexBase, LEErrorCode &success) const; + + /** + * This method copies the position array into a caller supplied array. + * The caller must ensure that the array is large enough to hold an + * X and Y position for each glyph, plus an extra X and Y for the + * advance of the last glyph. + * + * @param positions - the destiniation position array + * @param success - set to an error code if the operation fails + * + * @draft ICU 3.0 + */ + void getGlyphPositions(float positions[], LEErrorCode &success) const; + + /** + * This method returns the X and Y position of the glyph at + * the given index. + * + * Input parameters: + * @param glyphIndex - the index of the glyph + * + * Output parameters: + * @param x - the glyph's X position + * @param y - the glyph's Y position + * @param success - set to an error code if the operation fails + * + * @draft ICU 3.0 + */ + void getGlyphPosition(le_int32 glyphIndex, float &x, float &y, LEErrorCode &success) const; + + /** + * This method allocates the glyph array, the char indices array and the insertion list. You + * must call this method before using the object. This method also initializes the char indices + * array. + * + * @param initialGlyphCount the initial size of the glyph and char indices arrays. + * @param rightToLeft true if the original input text is right to left. + * @param success set to an error code if the storage cannot be allocated of if the initial + * glyph count is not positive. + * + * @draft ICU 3.0 + */ + void allocateGlyphArray(le_int32 initialGlyphCount, le_bool rightToLeft, LEErrorCode &success); + + /** + * This method allocates the storage for the glyph positions. It allocates one extra X, Y + * position pair for the position just after the last glyph. + * + * @param success set to an error code if the positions array cannot be allocated. + * + * @return the number of X, Y position pairs allocated. + * + * @draft ICU 3.0 + */ + le_int32 allocatePositions(LEErrorCode &success); + + /** + * This method allocates the storage for the auxillary glyph data. + * + * @param success set to an error code if the aulillary data array cannot be allocated. + * + * @return the size of the auxillary data array. + * + * @draft ICU 3.0 + */ + le_int32 allocateAuxData(LEErrorCode &success); + + /** + * Copy the entire auxillary data array. + * + * @param auxData the auxillary data array will be copied to this address + * @param success set to an error code if the data cannot be copied + * + * @draft ICU 3.0 + */ + void getAuxData(void *auxData[], LEErrorCode &success) const; + + /** + * Get the glyph ID for a particular glyph. + * + * @param glyphIndex the index into the glyph array + * @param success set to an error code if the glyph ID cannot be retrieved. + * + * @return the glyph ID + * + * @draft ICU 3.0 + */ + LEGlyphID getGlyphID(le_int32 glyphIndex, LEErrorCode &success) const; + + /** + * Get the char index for a particular glyph. + * + * @param glyphIndex the index into the glyph array + * @param success set to an error code if the char index cannot be retrieved. + * + * @return the character index + * + * @draft ICU 3.0 + */ + le_int32 getCharIndex(le_int32 glyphIndex, LEErrorCode &success) const; + + + /** + * Get the auxillary data for a particular glyph. + * + * @param glyphIndex the index into the glyph array + * @param success set to an error code if the auxillary data cannot be retrieved. + * + * @return the auxillary data + * + * @draft ICU 3.0 + */ + void *getAuxData(le_int32 glyphIndex, LEErrorCode &success) const; + + /** + * This operator allows direct access to the glyph array + * using the index operator. + * + * @param glyphIndex the index into the glyph array + * + * @return a reference to the given location in the glyph array + * + * @draft ICU 3.0 + */ + LEGlyphID &operator[](le_int32 glyphIndex) const; + + /** + * Call this method to replace a single glyph in the glyph array + * with multiple glyphs. This method uses the LEInsertionList + * to do the insertion. It returns the address of storage where the new + * glyph IDs can be stored. They will not actually be inserted into the + * glyph array until applyInsertions is called. + * + * @param atIndex the index of the glyph to be replaced + * @param insertCount the number of glyphs to replace it with + * + * @return the address at which to store the replacement glyphs. + * + * @see LEInsetionList.h + * + * @draft ICU 3.0 + */ + LEGlyphID *insertGlyphs(le_int32 atIndex, le_int32 insertCount); + + /** + * This method causes all of the glyph insertions recorded by + * insertGlyphs to be applied to the glyph array. The + * new slots in the char indices and the auxillary data arrays + * will be filled in with the values for the glyph being replaced. + * + * @return the new size of the glyph array + * + * @see LEInsertionList.h + * + * @draft ICU 3.0 + */ + le_int32 applyInsertions(); + + /** + * Set the glyph ID for a particular glyph. + * + * @param glyphIndex the index of the glyph + * @param glyphID the new glyph ID + * @param success will be set to an error code if the glyph ID cannot be set. + * + * @draft ICU 3.0 + */ + void setGlyphID(le_int32 glyphIndex, LEGlyphID glyphID, LEErrorCode &success); + + /** + * Set the char index for a particular glyph. + * + * @param glyphIndex the index of the glyph + * @param charIndex the new char index + * @param success will be set to an error code if the char index cannot be set. + * + * @draft ICU 3.0 + */ + void setCharIndex(le_int32 glyphIndex, le_int32 charIndex, LEErrorCode &success); + + /** + * Set the X, Y position for a particular glyph. + * + * @param glyphIndex the index of the glyph + * @param x the new X position + * @param y the new Y position + * @param success will be set to an error code if the position cannot be set. + * + * @draft ICU 3.0 + */ + void setPosition(le_int32 glyphIndex, float x, float y, LEErrorCode &success); + + /** + * Adjust the X, Y position for a particular glyph. + * + * @param glyphIndex the index of the glyph + * @param xAdjust the adjustment to the glyph's X position + * @param yAdjust the adjustment to the glyph's Y position + * @param success will be set to an error code if the glyph's position cannot be adjusted. + * + * @draft ICU 3.0 + */ + void adjustPosition(le_int32 glyphIndex, float xAdjust, float yAdjust, LEErrorCode &success); + + /** + * Set the auxillary data for a particular glyph. + * + * @param glyphIndex the index of the glyph + * @param auxData the new auxillary data + * @param success will be set to an error code if the auxillary data cannot be set. + * + * @draft ICU 3.0 + */ + void setAuxData(le_int32 glyphIndex, void *auxData, LEErrorCode &success); + + /** + * Delete the glyph array and replace it with the one + * in from. Set the glyph array pointer + * in from to NULL. + * + * @param from the LEGlyphStorage object from which + * to get the new glyph array. + * + * @draft ICU 3.0 + */ + void adoptGlyphArray(LEGlyphStorage &from); + + /** + * Delete the char indices array and replace it with the one + * in from. Set the char indices array pointer + * in from to NULL. + * + * @param from the LEGlyphStorage object from which + * to get the new char indices array. + * + * @draft ICU 3.0 + */ + void adoptCharIndicesArray(LEGlyphStorage &from); + + /** + * Delete the position array and replace it with the one + * in from. Set the position array pointer + * in from to NULL. + * + * @param from the LEGlyphStorage object from which + * to get the new position array. + * + * @draft ICU 3.0 + */ + void adoptPositionArray(LEGlyphStorage &from); + + /** + * Delete the auxillary data array and replace it with the one + * in from. Set the auxillary data array pointer + * in from to NULL. + * + * @param from the LEGlyphStorage object from which + * to get the new auxillary data array. + * + * @draft ICU 3.0 + */ + void adoptAuxDataArray(LEGlyphStorage &from); + + /** + * Change the glyph count of this object to be the same + * as the one in from. + * + * @param from the LEGlyphStorage object from which + * to get the new glyph count. + * + * @draft ICU 3.0 + */ + void adoptGlyphCount(LEGlyphStorage &from); + + /** + * Change the glyph count of this object to the given value. + * + * @param newGlyphCount the new glyph count. + * + * @draft ICU 3.0 + */ + void adoptGlyphCount(le_int32 newGlyphCount); + + /** + * This method frees the glyph, character index, position and + * auxillary data arrays so that the LayoutEngine can be reused + * to layout a different characer array. (This method is also called + * by the destructor) + * + * @draft ICU 3.0 + */ + void reset(); + + /** + * ICU "poor man's RTTI", returns a UClassID for the actual class. + * + * @draft ICU 3.0 + */ + virtual UClassID getDynamicClassID() const; + + /** + * ICU "poor man's RTTI", returns a UClassID for this class. + * + * @draft ICU 3.0 + */ + static UClassID getStaticClassID(); +}; + +inline LEGlyphID &LEGlyphStorage::operator[](le_int32 glyphIndex) const +{ + return fGlyphs[glyphIndex]; +} + + +U_NAMESPACE_END +#endif + diff --git a/icuSources/layout/LEInsertionList.cpp b/icuSources/layout/LEInsertionList.cpp new file mode 100644 index 00000000..b92cc474 --- /dev/null +++ b/icuSources/layout/LEInsertionList.cpp @@ -0,0 +1,88 @@ +/* + ********************************************************************** + * Copyright (C) 1998-2004, International Business Machines + * Corporation and others. All Rights Reserved. + ********************************************************************** + */ + +#include "LETypes.h" +#include "LEInsertionList.h" + +U_NAMESPACE_BEGIN + +#define ANY_NUMBER 1 + +struct InsertionRecord +{ + InsertionRecord *next; + le_int32 position; + le_int32 count; + LEGlyphID glyphs[ANY_NUMBER]; +}; + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LEInsertionList) + +LEInsertionList::LEInsertionList(le_bool rightToLeft) +: head(NULL), tail(NULL), growAmount(0), append(rightToLeft) +{ + tail = (InsertionRecord *) &head; +} + +LEInsertionList::~LEInsertionList() +{ + reset(); +} + +void LEInsertionList::reset() +{ + while (head != NULL) { + InsertionRecord *record = head; + + head = head->next; + LE_DELETE_ARRAY(record); + } + + tail = (InsertionRecord *) &head; + growAmount = 0; +} + +le_int32 LEInsertionList::getGrowAmount() +{ + return growAmount; +} + +LEGlyphID *LEInsertionList::insert(le_int32 position, le_int32 count) +{ + InsertionRecord *insertion = (InsertionRecord *) LE_NEW_ARRAY(char, sizeof(InsertionRecord) + (count - ANY_NUMBER) * sizeof (LEGlyphID)); + + insertion->position = position; + insertion->count = count; + + growAmount += count - 1; + + if (append) { + // insert on end of list... + insertion->next = NULL; + tail->next = insertion; + tail = insertion; + } else { + // insert on front of list... + insertion->next = head; + head = insertion; + } + + return insertion->glyphs; +} + +le_bool LEInsertionList::applyInsertions(LEInsertionCallback *callback) +{ + for (InsertionRecord *rec = head; rec != NULL; rec = rec->next) { + if (callback->applyInsertion(rec->position, rec->count, rec->glyphs)) { + return TRUE; + } + } + + return FALSE; +} + +U_NAMESPACE_END diff --git a/icuSources/layout/LEInsertionList.h b/icuSources/layout/LEInsertionList.h new file mode 100644 index 00000000..2d67c2a5 --- /dev/null +++ b/icuSources/layout/LEInsertionList.h @@ -0,0 +1,169 @@ +/* + ********************************************************************** + * Copyright (C) 1998-2004, International Business Machines + * Corporation and others. All Rights Reserved. + ********************************************************************** + */ + +#ifndef __LEINSERTIONLIST_H +#define __LEINSERTIONLIST_H + +#include "LETypes.h" + +U_NAMESPACE_BEGIN + +struct InsertionRecord; + +/** + * This class encapsulates the callback used by LEInsertionList + * to apply an insertion from the insertion list. + * + * @internal + */ +class LEInsertionCallback +{ +public: + /** + * This method will be called by LEInsertionList::applyInsertions for each + * entry on the insertion list. + * + * @param atPosition the position of the insertion + * @param count the number of glyphs to insert + * @param newGlyphs the address of the glyphs to insert + * + * @return TRUE if LEInsertions::applyInsertions should + * stop after applying this insertion. + * + * @internal + */ + virtual le_bool applyInsertion(le_int32 atPosition, le_int32 count, LEGlyphID newGlyphs[]) = 0; +}; + +/** + * This class is used to keep track of insertions to an array of + * LEGlyphIDs. The insertions are kept on a linked + * list of InsertionRecords so that the glyph array + * doesn't have to be grown for each insertion. The insertions are + * stored on the list from leftmost to rightmost to make it easier + * to do the insertions. + * + * The insertions are applied to the array by calling the + * applyInsertions method, which calls a client + * supplied LEInsertionCallback object to actually + * apply the individual insertions. + * + * @internal + */ +class LEInsertionList : public UObject +{ +public: + /** + * Construct an empty insertion list. + * + * @param rightToLeft TRUE if the glyphs are stored + * in the array in right to left order. + * + * @internal + */ + LEInsertionList(le_bool rightToLeft); + + /** + * The destructor. + */ + ~LEInsertionList(); + + /** + * Add an entry to the insertion list. + * + * @param position the glyph at this position in the array will be + * replaced by the new glyphs. + * @param count the number of new glyphs + * + * @return the address of an array in which to store the new glyphs. This will + * not be in the glyph array. + * + * @internal + */ + LEGlyphID *insert(le_int32 position, le_int32 count); + + /** + * Return the number of new glyphs that have been inserted. + * + * @return the number of new glyphs which have been inserted + * + * @internal + */ + le_int32 getGrowAmount(); + + /** + * Call the LEInsertionCallback once for each + * entry on the insertion list. + * + * @param callback the LEInsertionCallback to call for each insertion. + * + * @return TRUE if callback returned TRUE to + * terminate the insertion list processing. + * + * @internal + */ + le_bool applyInsertions(LEInsertionCallback *callback); + + /** + * Empty the insertion list and free all associated + * storage. + * + * @internal + */ + void reset(); + + /** + * ICU "poor man's RTTI", returns a UClassID for the actual class. + * + * @stable ICU 2.8 + */ + virtual UClassID getDynamicClassID() const; + + /** + * ICU "poor man's RTTI", returns a UClassID for this class. + * + * @stable ICU 2.8 + */ + static UClassID getStaticClassID(); + +private: + + /** + * The head of the insertion list. + * + * @internal + */ + InsertionRecord *head; + + /** + * The tail of the insertion list. + * + * @internal + */ + InsertionRecord *tail; + + /** + * The total number of new glyphs on the insertion list. + * + * @internal + */ + le_int32 growAmount; + + /** + * Set to TRUE if the glyphs are in right + * to left order. Since we want the rightmost insertion + * to be first on the list, we need to append the + * insertions in this case. Otherwise they're prepended. + * + * @internal + */ + le_bool append; +}; + +U_NAMESPACE_END +#endif + diff --git a/icuSources/layout/LELanguages.h b/icuSources/layout/LELanguages.h index 5fb84df3..533b5f54 100644 --- a/icuSources/layout/LELanguages.h +++ b/icuSources/layout/LELanguages.h @@ -1,18 +1,16 @@ /* * - * (C) Copyright IBM Corp. 1998-2003. All Rights Reserved. + * (C) Copyright IBM Corp. 1998-2004. All Rights Reserved. * * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS * YOU REALLY KNOW WHAT YOU'RE DOING. - * - * $Source: /cvs/root/ICU/icuSources/layout/LELanguages.h,v $ - * $Date: 2003/07/03 18:13:45 $ - * $Revision: 1.1.1.1 $ */ #ifndef __LELANGUAGES_H #define __LELANGUAGES_H +#include "LETypes.h" + U_NAMESPACE_BEGIN /** diff --git a/icuSources/layout/LEScripts.h b/icuSources/layout/LEScripts.h index 3d9ee3aa..aa1e9d24 100644 --- a/icuSources/layout/LEScripts.h +++ b/icuSources/layout/LEScripts.h @@ -1,18 +1,16 @@ /* * - * (C) Copyright IBM Corp. 1998-2003. All Rights Reserved. + * (C) Copyright IBM Corp. 1998-2004. All Rights Reserved. * * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS * YOU REALLY KNOW WHAT YOU'RE DOING. - * - * $Source: /cvs/root/ICU/icuSources/layout/LEScripts.h,v $ - * $Date: 2003/07/03 18:13:45 $ - * $Revision: 1.1.1.2 $ */ #ifndef __LESCRIPTS_H #define __LESCRIPTS_H +#include "LETypes.h" + U_NAMESPACE_BEGIN /** @@ -77,8 +75,9 @@ enum ScriptCodes { shawScriptCode = 51, taleScriptCode = 52, ugarScriptCode = 53, + hrktScriptCode = 54, - scriptCodeCount = 54 + scriptCodeCount = 55 }; U_NAMESPACE_END diff --git a/icuSources/layout/LESwaps.h b/icuSources/layout/LESwaps.h index 87a07d8d..2dc9ba68 100644 --- a/icuSources/layout/LESwaps.h +++ b/icuSources/layout/LESwaps.h @@ -1,8 +1,7 @@ /* - * @(#)LESwaps.h 1.3 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -17,18 +16,33 @@ U_NAMESPACE_BEGIN * A convenience macro which invokes the swapWord member function * from a concise call. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ -#define SWAPW(value) (LESwaps::isBigEndian() ? (value) : LESwaps::swapWord(value)) - +#if defined(U_IS_BIG_ENDIAN) + #if U_IS_BIG_ENDIAN + #define SWAPW(value) (value) + #else + #define SWAPW(value) LESwaps::swapWord(value) + #endif +#else + #define SWAPW(value) (LESwaps::isBigEndian() ? (value) : LESwaps::swapWord(value)) +#endif /** * A convenience macro which invokes the swapLong member function * from a concise call. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ -#define SWAPL(value) (LESwaps::isBigEndian() ? (value) : LESwaps::swapLong(value)) +#if defined(U_IS_BIG_ENDIAN) + #if U_IS_BIG_ENDIAN + #define SWAPL(value) (value) + #else + #define SWAPL(value) LESwaps::swapLong(value) + #endif +#else + #define SWAPL(value) (LESwaps::isBigEndian() ? (value) : LESwaps::swapLong(value)) +#endif /** * This class is used to access data which stored in big endian order @@ -39,11 +53,12 @@ U_NAMESPACE_BEGIN * All methods are static and inline in an attempt to induce the compiler * to do most of the calculations at compile time. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ class U_LAYOUT_API LESwaps /* not : public UObject because all methods are static */ { public: +#if !defined(U_IS_BIG_ENDIAN) /** * This method detects the endian-ness of the platform by * casting a pointer to a word to a pointer to a byte. On @@ -51,16 +66,17 @@ public: * lowest address. On little endian platforms, the FF will * be in the byte with the highest address. * - * @return true if the platform is big endian + * @return TRUE if the platform is big endian * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - static le_bool isBigEndian() + static le_uint8 isBigEndian() { const le_uint16 word = 0xFF00; return *((le_uint8 *) &word); }; +#endif /** * This method does the byte swap required on little endian platforms @@ -70,7 +86,7 @@ public: * * @return the byte swapped word * - * @draft ICU 2.2 + * @stable ICU 2.8 */ static le_uint16 swapWord(le_uint16 value) { @@ -85,7 +101,7 @@ public: * * @return the byte swapped long * - * @draft ICU 2.2 + * @stable ICU 2.8 */ static le_uint32 swapLong(le_uint32 value) { diff --git a/icuSources/layout/LETypes.h b/icuSources/layout/LETypes.h index c2228212..dbb77adb 100644 --- a/icuSources/layout/LETypes.h +++ b/icuSources/layout/LETypes.h @@ -1,15 +1,14 @@ /* - * @(#)LETypes.h 1.2 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ #ifndef __LETYPES_H #define __LETYPES_H -#if !defined(LE_USE_CMEMORY) && (defined(U_LAYOUT_IMPLEMENTATION) || defined(U_LAYOUTEX_IMPLEMENTATION)) +#if !defined(LE_USE_CMEMORY) && (defined(U_LAYOUT_IMPLEMENTATION) || defined(U_LAYOUTEX_IMPLEMENTATION) || defined(U_STATIC_IMPLEMENTATION) || defined(U_COMBINED_IMPLEMENTATION)) #define LE_USE_CMEMORY #endif @@ -72,24 +71,6 @@ typedef uint8_t le_uint8; */ typedef UBool le_bool; -#ifndef true -/** - * Used for le_bool values which are true. - * - * @stable ICU 2.4 - */ -#define true 1 -#endif - -#ifndef false -/** - * Used for le_bool values which are false. - * - * @stable ICU 2.4 - */ -#define false 0 -#endif - #ifndef NULL /** * Used to represent empty pointers. diff --git a/icuSources/layout/LayoutEngine.cpp b/icuSources/layout/LayoutEngine.cpp index 5861125b..4a3d6bb0 100644 --- a/icuSources/layout/LayoutEngine.cpp +++ b/icuSources/layout/LayoutEngine.cpp @@ -1,8 +1,7 @@ /* - * %W% %E% * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -12,11 +11,15 @@ #include "LayoutEngine.h" #include "ArabicLayoutEngine.h" +#include "CanonShaping.h" #include "HanLayoutEngine.h" #include "IndicLayoutEngine.h" #include "ThaiLayoutEngine.h" #include "GXLayoutEngine.h" #include "ScriptAndLanguageTags.h" +#include "CharSubstitutionFilter.h" + +#include "LEGlyphStorage.h" #include "OpenTypeUtilities.h" #include "GlyphSubstitutionTables.h" @@ -82,142 +85,131 @@ LEUnicode32 DefaultCharMapper::mapChar(LEUnicode32 ch) const return ch; } -const char LayoutEngine::fgClassID=0; +// This is here to get it out of LEGlyphFilter.h. +// No particular reason to put it here, other than +// this is a good central location... +LEGlyphFilter::~LEGlyphFilter() +{ + // nothing to do +} -LayoutEngine::LayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode) - : fGlyphCount(0), fGlyphs(NULL), fCharIndices(NULL), fPositions(NULL), - fFontInstance(fontInstance), fScriptCode(scriptCode), fLanguageCode(languageCode) +CharSubstitutionFilter::CharSubstitutionFilter(const LEFontInstance *fontInstance) + : fFontInstance(fontInstance) { - // nothing else to do? + // nothing to do } -void LayoutEngine::getCharIndices(le_int32 charIndices[], le_int32 indexBase, LEErrorCode &success) const +CharSubstitutionFilter::~CharSubstitutionFilter() { - le_int32 i; + // nothing to do +} - if LE_FAILURE(success) { - return; - } - if (charIndices == NULL) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return; - } +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LayoutEngine) - if (fCharIndices == NULL) { - success = LE_NO_LAYOUT_ERROR; - return; - } +static const LETag emptyTag = 0x00000000; - for (i = 0; i < fGlyphCount; i += 1) { - charIndices[i] = fCharIndices[i] + indexBase; - } +static const LETag ccmpFeatureTag = LE_CCMP_FEATURE_TAG; + +static const LETag canonFeatures[] = {ccmpFeatureTag, emptyTag}; + +LayoutEngine::LayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode) + : fGlyphStorage(NULL), fFontInstance(fontInstance), fScriptCode(scriptCode), fLanguageCode(languageCode) +{ + fGlyphStorage = new LEGlyphStorage(); +} + +le_int32 LayoutEngine::getGlyphCount() const +{ + return fGlyphStorage->getGlyphCount(); +}; + +void LayoutEngine::getCharIndices(le_int32 charIndices[], le_int32 indexBase, LEErrorCode &success) const +{ + fGlyphStorage->getCharIndices(charIndices, indexBase, success); } void LayoutEngine::getCharIndices(le_int32 charIndices[], LEErrorCode &success) const { - if LE_FAILURE(success) { - return; - } - - if (charIndices == NULL) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return; - } - - if (fCharIndices == NULL) { - success = LE_NO_LAYOUT_ERROR; - return; - } - - LE_ARRAY_COPY(charIndices, fCharIndices, fGlyphCount); + fGlyphStorage->getCharIndices(charIndices, success); } // Copy the glyphs into caller's (32-bit) glyph array, OR in extraBits void LayoutEngine::getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, LEErrorCode &success) const { - le_int32 i; - - if (LE_FAILURE(success)) { - return; - } - - if (glyphs == NULL) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return; - } - - if (fGlyphs == NULL) { - success = LE_NO_LAYOUT_ERROR; - return; - } - - for (i = 0; i < fGlyphCount; i += 1) { - glyphs[i] = fGlyphs[i] | extraBits; - } + fGlyphStorage->getGlyphs(glyphs, extraBits, success); } void LayoutEngine::getGlyphs(LEGlyphID glyphs[], LEErrorCode &success) const { - if (LE_FAILURE(success)) { - return; - } - - if (glyphs == NULL) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return; - } - - if (fGlyphs == NULL) { - success = LE_NO_LAYOUT_ERROR; - } - - LE_ARRAY_COPY(glyphs, fGlyphs, fGlyphCount); + fGlyphStorage->getGlyphs(glyphs, success); } void LayoutEngine::getGlyphPositions(float positions[], LEErrorCode &success) const { - if LE_FAILURE(success) { - return; - } - - if (positions == NULL) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return; - } - - if (fPositions == NULL) { - success = LE_NO_LAYOUT_ERROR; - return; - } - - LE_ARRAY_COPY(positions, fPositions, fGlyphCount * 2 + 2); + fGlyphStorage->getGlyphPositions(positions, success); } void LayoutEngine::getGlyphPosition(le_int32 glyphIndex, float &x, float &y, LEErrorCode &success) const +{ + fGlyphStorage->getGlyphPosition(glyphIndex, x, y, success); +} + +le_int32 LayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) { if (LE_FAILURE(success)) { - return; + return 0; } - - if (glyphIndex > fGlyphCount) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - return; + + if (offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return 0; } - - if (fPositions == NULL) { - success = LE_NO_LAYOUT_ERROR; - return; + + const GlyphSubstitutionTableHeader *canonGSUBTable = (GlyphSubstitutionTableHeader *) CanonShaping::glyphSubstitutionTable; + LETag scriptTag = OpenTypeLayoutEngine::getScriptTag(fScriptCode); + LETag langSysTag = OpenTypeLayoutEngine::getLangSysTag(fLanguageCode); + le_int32 i, dir = 1, out = 0, outCharCount = count; + + if (canonGSUBTable->coversScript(scriptTag)) { + CharSubstitutionFilter *substitutionFilter = new CharSubstitutionFilter(fFontInstance); + + glyphStorage.allocateGlyphArray(count, rightToLeft, success); + glyphStorage.allocateAuxData(success); + + if (LE_FAILURE(success)) { + return 0; + } + + if (rightToLeft) { + out = count - 1; + dir = -1; + } + + for (i = 0; i < count; i += 1, out += dir) { + glyphStorage[out] = (LEGlyphID) chars[offset + i]; + glyphStorage.setAuxData(out, (void *) canonFeatures, success); + } + + outCharCount = canonGSUBTable->process(glyphStorage, rightToLeft, scriptTag, langSysTag, NULL, substitutionFilter, NULL); + + out = (rightToLeft? count - 1 : 0); + + outChars = LE_NEW_ARRAY(LEUnicode, outCharCount); + for (i = 0; i < outCharCount; i += 1, out += dir) { + outChars[out] = (LEUnicode) LE_GET_GLYPH(glyphStorage[i]); + } + + delete substitutionFilter; } - - x = fPositions[glyphIndex * 2]; - y = fPositions[glyphIndex * 2 + 1]; -} + return outCharCount; +} le_int32 LayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEGlyphID *&glyphs, le_int32 *&charIndices, LEErrorCode &success) + LEGlyphStorage &glyphStorage, LEErrorCode &success) { if (LE_FAILURE(success)) { return 0; @@ -228,133 +220,159 @@ le_int32 LayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, l return 0; } - mapCharsToGlyphs(chars, offset, count, rightToLeft, rightToLeft, glyphs, charIndices, success); + LEUnicode *outChars = NULL; + le_int32 outCharCount = characterProcessing(chars, offset, count, max, rightToLeft, outChars, glyphStorage, success); - return count; + if (outChars != NULL) { + mapCharsToGlyphs(outChars, 0, outCharCount, rightToLeft, rightToLeft, glyphStorage, success); + LE_DELETE_ARRAY(outChars); // FIXME: a subclass may have allocated this, in which case this delete might not work... + } else { + mapCharsToGlyphs(chars, offset, count, rightToLeft, rightToLeft, glyphStorage, success); + } + + return glyphStorage.getGlyphCount(); } // Input: glyphs // Output: positions -void LayoutEngine::positionGlyphs(const LEGlyphID glyphs[], le_int32 glyphCount, float x, float y, float *&positions, LEErrorCode &success) +void LayoutEngine::positionGlyphs(LEGlyphStorage &glyphStorage, float x, float y, LEErrorCode &success) { if (LE_FAILURE(success)) { return; } - if (glyphCount < 0) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return; - } + glyphStorage.allocatePositions(success); - if (positions == NULL) { - positions = LE_NEW_ARRAY(float, 2 * (glyphCount + 1)); - - if (positions == NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; - return; - } + if (LE_FAILURE(success)) { + return; } - le_int32 i; + le_int32 i, glyphCount = glyphStorage.getGlyphCount(); for (i = 0; i < glyphCount; i += 1) { LEPoint advance; - positions[i * 2] = x; - positions[i * 2 + 1] = y; + glyphStorage.setPosition(i, x, y, success); - fFontInstance->getGlyphAdvance(glyphs[i], advance); + fFontInstance->getGlyphAdvance(glyphStorage[i], advance); x += advance.fX; y += advance.fY; } - positions[glyphCount * 2] = x; - positions[glyphCount * 2 + 1] = y; + glyphStorage.setPosition(glyphCount, x, y, success); } -void LayoutEngine::adjustMarkGlyphs(const LEGlyphID glyphs[], le_int32 glyphCount, le_bool reverse, LEGlyphFilter *markFilter, - float positions[], LEErrorCode &success) +void LayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool /*reverse*/, + LEGlyphStorage &/*glyphStorage*/, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return; + } + + if (chars == NULL || offset < 0 || count < 0) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + // default is no adjustments + return; +} + +void LayoutEngine::adjustMarkGlyphs(LEGlyphStorage &glyphStorage, LEGlyphFilter *markFilter, LEErrorCode &success) { float xAdjust = 0; - le_int32 g = 0, direction = 1; - le_int32 p; + le_int32 p, glyphCount = glyphStorage.getGlyphCount(); if (LE_FAILURE(success)) { return; } - if (positions == NULL || markFilter == NULL) { + if (markFilter == NULL) { success = LE_ILLEGAL_ARGUMENT_ERROR; return; } - if (reverse) { - g = glyphCount - 1; - direction = -1; - } + float ignore, prev; - for (p = 0; p < glyphCount; p += 1, g += direction) { - float xAdvance = positions[(p + 1) * 2] - positions[p * 2]; + glyphStorage.getGlyphPosition(0, prev, ignore, success); - positions[p * 2] += xAdjust; + for (p = 0; p < glyphCount; p += 1) { + float next, xAdvance; + + glyphStorage.getGlyphPosition(p + 1, next, ignore, success); - if (markFilter->accept(glyphs[g])) { + xAdvance = next - prev; + glyphStorage.adjustPosition(p, xAdjust, 0, success); + + if (markFilter->accept(glyphStorage[p])) { xAdjust -= xAdvance; } + + prev = next; } - positions[glyphCount * 2] += xAdjust; + glyphStorage.adjustPosition(glyphCount, xAdjust, 0, success); } -const void *LayoutEngine::getFontTable(LETag tableTag) const +void LayoutEngine::adjustMarkGlyphs(const LEUnicode chars[], le_int32 charCount, le_bool reverse, LEGlyphStorage &glyphStorage, LEGlyphFilter *markFilter, LEErrorCode &success) { - return fFontInstance->getFontTable(tableTag); -} + float xAdjust = 0; + le_int32 c = 0, direction = 1, p; + le_int32 glyphCount = glyphStorage.getGlyphCount(); -void LayoutEngine::mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, le_bool mirror, - LEGlyphID *&glyphs, le_int32 *&charIndices, LEErrorCode &success) -{ if (LE_FAILURE(success)) { return; } - if (chars == NULL || offset < 0 || count < 0) { + if (markFilter == NULL) { success = LE_ILLEGAL_ARGUMENT_ERROR; return; } - if (glyphs == NULL) { - glyphs = LE_NEW_ARRAY(LEGlyphID, count); - - if (glyphs == NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; - return; - } + if (reverse) { + c = glyphCount - 1; + direction = -1; } - if (charIndices == NULL) { - le_int32 i, dir = 1, out = 0; + float ignore, prev; - if (reverse) { - out = count - 1; - dir = -1; - } + glyphStorage.getGlyphPosition(0, prev, ignore, success); - charIndices = LE_NEW_ARRAY(le_int32, count); + for (p = 0; p < charCount; p += 1, c += direction) { + float next, xAdvance; + + glyphStorage.getGlyphPosition(p + 1, next, ignore, success); - if (charIndices == NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; - return; - } + xAdvance = next - prev; + glyphStorage.adjustPosition(p, xAdjust, 0, success); - for (i = 0; i < count; i += 1, out += dir) { - charIndices[out] = i; + if (markFilter->accept(chars[c])) { + xAdjust -= xAdvance; } + + prev = next; + } + + glyphStorage.adjustPosition(glyphCount, xAdjust, 0, success); +} + +const void *LayoutEngine::getFontTable(LETag tableTag) const +{ + return fFontInstance->getFontTable(tableTag); +} + +void LayoutEngine::mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, le_bool mirror, + LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return; } - DefaultCharMapper charMapper(true, mirror); + glyphStorage.allocateGlyphArray(count, reverse, success); - fFontInstance->mapCharsToGlyphs(chars, offset, count, reverse, &charMapper, glyphs); + DefaultCharMapper charMapper(TRUE, mirror); + + fFontInstance->mapCharsToGlyphs(chars, offset, count, reverse, &charMapper, glyphStorage); } // Input: characters, font? @@ -372,37 +390,24 @@ le_int32 LayoutEngine::layoutChars(const LEUnicode chars[], le_int32 offset, le_ return 0; } - fGlyphCount = computeGlyphs(chars, offset, count, max, rightToLeft, fGlyphs, fCharIndices, success); - positionGlyphs(fGlyphs, fGlyphCount, x, y, fPositions, success); - adjustGlyphPositions(chars, offset, count, rightToLeft, fGlyphs, fGlyphCount, fPositions, success); + le_int32 glyphCount; + + glyphCount = computeGlyphs(chars, offset, count, max, rightToLeft, *fGlyphStorage, success); + positionGlyphs(*fGlyphStorage, x, y, success); + adjustGlyphPositions(chars, offset, count, rightToLeft, *fGlyphStorage, success); - return fGlyphCount; + return glyphCount; } void LayoutEngine::reset() { - fGlyphCount = 0; - - if (fGlyphs != NULL) { - LE_DELETE_ARRAY(fGlyphs); - fGlyphs = NULL; - } - - if (fCharIndices != NULL) { - LE_DELETE_ARRAY(fCharIndices); - fCharIndices = NULL; - } - - if (fPositions != NULL) { - LE_DELETE_ARRAY(fPositions); - fPositions = NULL; - } + fGlyphStorage->reset(); } LayoutEngine *LayoutEngine::layoutEngineFactory(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, LEErrorCode &success) { - static le_uint32 gsubTableTag = LE_GSUB_TABLE_TAG; - static le_uint32 mortTableTag = LE_MORT_TABLE_TAG; + static const le_uint32 gsubTableTag = LE_GSUB_TABLE_TAG; + static const le_uint32 mortTableTag = LE_MORT_TABLE_TAG; if (LE_FAILURE(success)) { return NULL; @@ -439,7 +444,7 @@ LayoutEngine *LayoutEngine::layoutEngineFactory(const LEFontInstance *fontInstan case janLanguageCode: case zhtLanguageCode: case zhsLanguageCode: - if (gsubTable->coversScriptAndLanguage(scriptTag, languageTag)) { + if (gsubTable->coversScriptAndLanguage(scriptTag, languageTag, TRUE)) { result = new HanOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, gsubTable); break; } @@ -478,7 +483,7 @@ LayoutEngine *LayoutEngine::layoutEngineFactory(const LEFontInstance *fontInstan } case arabScriptCode: - case hebrScriptCode: + //case hebrScriptCode: result = new UnicodeArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode); break; diff --git a/icuSources/layout/LayoutEngine.h b/icuSources/layout/LayoutEngine.h index a462bea0..fb20000f 100644 --- a/icuSources/layout/LayoutEngine.h +++ b/icuSources/layout/LayoutEngine.h @@ -1,24 +1,20 @@ /* - * %W% %W% * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ #ifndef __LAYOUTENGINE_H #define __LAYOUTENGINE_H -#ifndef __LETYPES_H #include "LETypes.h" -#endif - -#include U_NAMESPACE_BEGIN class LEFontInstance; class LEGlyphFilter; +class LEGlyphStorage; /** * This is a virtual base class used to do complex text layout. The text must all @@ -61,41 +57,16 @@ class LEGlyphFilter; * @see LEFontInstance * @see ScriptAndLanguageTags.h * - * @draft ICU 2.2 + * @stable ICU 2.8 */ class U_LAYOUT_API LayoutEngine : public UObject { protected: /** - * The number of glyphs in the output - * - * @internal - */ - le_int32 fGlyphCount; - - /** - * The output glyph array - * - * @internal - */ - LEGlyphID *fGlyphs; - - /** - * The character index array. One entry for each output glyph, giving the index - * in the input character array of the character which corresponds to this glyph. - * - * @internal - */ - le_int32 *fCharIndices; - - /** - * The glyph position array. There are two entries for each glyph giving the - * X and Y positions of the glyph. Thus, for glyph i, the X position is at index - * 2i, and the Y position is at index 2i + 1. There are also two entries for the - * X and Y position of the advance of the last glyph. + * The object which holds the glyph storage * * @internal */ - float *fPositions; + LEGlyphStorage *fGlyphStorage; /** * The font instance for the text font. @@ -130,7 +101,7 @@ protected: * * @param fontInstance - the font for the text * @param scriptCode - the script for the text - * @param langaugeCode - the language for the text + * @param languageCode - the language for the text * * @see LEFontInstance * @see ScriptAndLanguageTags.h @@ -148,6 +119,31 @@ protected: */ LayoutEngine(); + /** + * This method does any required pre-processing to the input characters. It + * may generate output characters that differ from the input charcters due to + * insertions, deletions, or reorderings. In such cases, it will also generate an + * output character index array reflecting these changes. + * + * Subclasses must override this method. + * + * Input parameters: + * @param chars - the input character context + * @param offset - the index of the first character to process + * @param count - the number of characters to process + * @param max - the number of characters in the input context + * @param rightToLeft - TRUE if the characters are in a right to left directional run + * @param outChars - the output character array, if different from the input + * @param glyphStorage - the object that holds the per-glyph storage. The character index array may be set. + * @param success - set to an error code if the operation fails + * + * @return the output character count (input character count if no change) + * + * @internal + */ + virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); + /** * This method does the glyph processing. It converts an array of characters * into an array of glyph indices and character indices. The characters to be @@ -163,18 +159,18 @@ protected: * @param offset - the offset of the first character to process * @param count - the number of characters to process * @param max - the number of characters in the context. - * @param rightToLeft - true if the text is in a right to left directional run + * @param rightToLeft - TRUE if the text is in a right to left directional run + * @param glyphStorage - the object which holds the per-glyph storage. The glyph and char indices arrays + * will be set. * * Output parameters: - * @param glyphs - the glyph index array - * @param charIndices - the character index array * @param success - set to an error code if the operation fails * * @return the number of glyphs in the glyph index array * * @internal */ - virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphID *&glyphs, le_int32 *&charIndices, LEErrorCode &success); + virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success); /** * This method does basic glyph positioning. The default implementation positions @@ -182,17 +178,14 @@ protected: * is not expected that many subclasses will override this method. * * Input parameters: - * @param glyphs - the input glyph array - * @param glyphCount - the number of glyphs in the glyph array + * @param glyphStorage - the object which holds the per-glyph storage. The glyph position array will be set. * @param x - the starting X position * @param y - the starting Y position - * - * Output parameters: - * @param positions - the output X and Y positions (two entries per glyph) + * @param success - set to an error code if the operation fails * * @internal */ - virtual void positionGlyphs(const LEGlyphID glyphs[], le_int32 glyphCount, float x, float y, float *&positions, LEErrorCode &success); + virtual void positionGlyphs(LEGlyphStorage &glyphStorage, float x, float y, LEErrorCode &success); /** * This method does positioning adjustments like accent positioning and @@ -207,31 +200,14 @@ protected: * @param chars - the input character context * @param offset - the offset of the first character to process * @param count - the number of characters to process - * @param reverse - true if the glyphs in the glyph array have been reordered - * @param glyphs - the input glyph array - * @param glyphCount - the number of glyphs - * @param positions - the position array, will be updated as needed + * @param reverse - TRUE if the glyphs in the glyph array have been reordered + * @param glyphStorage - the object which holds the per-glyph storage. The glyph positions will be + * adjusted as needed. * @param success - output parameter set to an error code if the operation fails * - * Note: the positions are passed as a plain array because this method should - * not need to reallocate them. - * * @internal */ - virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool /*reverse*/, LEGlyphID glyphs[], le_int32 glyphCount, float positions[], LEErrorCode &success) - { - if (LE_FAILURE(success)) { - return; - } - - if (chars == NULL || glyphs == NULL || positions == NULL || offset < 0 || count < 0 || glyphCount < 0) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return; - } - - // default is no adjustments - return; - }; + virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success); /** * This method gets a table from the font associated with @@ -262,36 +238,53 @@ protected: * @param chars - the input character context * @param offset - the offset of the first character to be mapped * @param count - the number of characters to be mapped - * @param reverse - if true, the output will be in reverse order - * @param mirror - if true, do character mirroring - * - * Output parameters: - * @param glyphs - the glyph array - * @param charIndices - the character index array + * @param reverse - if TRUE, the output will be in reverse order + * @param mirror - if TRUE, do character mirroring + * @param glyphStorage - the object which holds the per-glyph storage. The glyph and char + * indices arrays will be filled in. * @param success - set to an error code if the operation fails * * @see LEFontInstance * * @internal */ - virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, le_bool mirror, LEGlyphID *&glyphs, le_int32 *&charIndices, LEErrorCode &success); + virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, le_bool mirror, LEGlyphStorage &glyphStorage, LEErrorCode &success); /** * This is a convenience method that forces the advance width of mark * glyphs to be zero, which is required for proper selection and highlighting. * - * @param glyphs - the glyph array - * @param glyphCount - the number of glyphs - * @param reverse - true if the glyph array has been reordered + * @param glyphStorage - the object containing the per-glyph storage. The positions array will be modified. * @param markFilter - used to identify mark glyphs - * @param positions - the glyph position array - updated as required * @param success - output parameter set to an error code if the operation fails * * @see LEGlyphFilter * * @internal */ - static void adjustMarkGlyphs(const LEGlyphID glyphs[], le_int32 glyphCount, le_bool reverse, LEGlyphFilter *markFilter, float positions[], LEErrorCode &success); + static void adjustMarkGlyphs(LEGlyphStorage &glyphStorage, LEGlyphFilter *markFilter, LEErrorCode &success); + + + /** + * This is a convenience method that forces the advance width of mark + * glyphs to be zero, which is required for proper selection and highlighting. + * This method uses the input characters to identify marks. This is required in + * cases where the font does not contain enough information to identify them based + * on the glyph IDs. + * + * @param chars - the array of input characters + * @param charCount - the number of input characers + * @param glyphStorage - the object containing the per-glyph storage. The positions array will be modified. + * @param reverse - TRUE if the glyph array has been reordered + * @param markFilter - used to identify mark glyphs + * @param success - output parameter set to an error code if the operation fails + * + * @see LEGlyphFilter + * + * @internal + */ + static void adjustMarkGlyphs(const LEUnicode chars[], le_int32 charCount, le_bool reverse, LEGlyphStorage &glyphStorage, LEGlyphFilter *markFilter, LEErrorCode &success); + public: /** @@ -300,7 +293,7 @@ public: * method. It is declared virtual so that it will be invoked by the * subclass destructors. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ virtual ~LayoutEngine(); @@ -313,7 +306,7 @@ public: * @param offset - the offset of the first character to process * @param count - the number of characters to process * @param max - the number of characters in the input context - * @param rightToLeft - true if the characers are in a right to left directional run + * @param rightToLeft - TRUE if the characers are in a right to left directional run * @param x - the initial X position * @param y - the initial Y position * @param success - output parameter set to an error code if the operation fails @@ -323,7 +316,7 @@ public: * Note; the glyph, character index and position array can be accessed * using the getter method below. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ virtual le_int32 layoutChars(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, float x, float y, LEErrorCode &success); @@ -334,12 +327,9 @@ public: * * @return the number of glyphs in the glyph array * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - le_int32 getGlyphCount() const - { - return fGlyphCount; - }; + le_int32 getGlyphCount() const; /** * This method copies the glyph array into a caller supplied array. @@ -349,7 +339,7 @@ public: * @param glyphs - the destiniation glyph array * @param success - set to an error code if the operation fails * - * @draft ICU 2.2 + * @stable ICU 2.8 */ void getGlyphs(LEGlyphID glyphs[], LEErrorCode &success) const; @@ -363,7 +353,7 @@ public: * @param extraBits - this value will be ORed with each glyph index * @param success - set to an error code if the operation fails * - * @draft ICU 2.2 + * @stable ICU 2.8 */ virtual void getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, LEErrorCode &success) const; @@ -375,7 +365,7 @@ public: * @param charIndices - the destiniation character index array * @param success - set to an error code if the operation fails * - * @draft ICU 2.2 + * @stable ICU 2.8 */ void getCharIndices(le_int32 charIndices[], LEErrorCode &success) const; @@ -388,7 +378,7 @@ public: * @param indexBase - an offset which will be added to each index * @param success - set to an error code if the operation fails * - * @draft ICU 2.2 + * @stable ICU 2.8 */ void getCharIndices(le_int32 charIndices[], le_int32 indexBase, LEErrorCode &success) const; @@ -398,10 +388,10 @@ public: * X and Y position for each glyph, plus an extra X and Y for the * advance of the last glyph. * - * @param glyphs - the destiniation position array + * @param positions - the destiniation position array * @param success - set to an error code if the operation fails * - * @draft ICU 2.2 + * @stable ICU 2.8 */ void getGlyphPositions(float positions[], LEErrorCode &success) const; @@ -417,7 +407,7 @@ public: * @param y - the glyph's Y position * @param success - set to an error code if the operation fails * - * @draft ICU 2.2 + * @stable ICU 2.8 */ void getGlyphPosition(le_int32 glyphIndex, float &x, float &y, LEErrorCode &success) const; @@ -426,7 +416,7 @@ public: * so that the LayoutEngine can be reused to layout a different * characer array. (This method is also called by the destructor) * - * @draft ICU 2.2 + * @stable ICU 2.8 */ virtual void reset(); @@ -437,38 +427,31 @@ public: * * @param fontInstance - the font of the text * @param scriptCode - the script of the text - * @param langaugeCode - the language of the text + * @param languageCode - the language of the text * @param success - output parameter set to an error code if the operation fails * * @return a LayoutEngine which can layout text in the given font. * * @see LEFontInstance * - * @draft ICU 2.2 + * @stable ICU 2.8 */ static LayoutEngine *layoutEngineFactory(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, LEErrorCode &success); /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } + static UClassID getStaticClassID(); -private: - - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; U_NAMESPACE_END diff --git a/icuSources/layout/LayoutTables.h b/icuSources/layout/LayoutTables.h index f7050575..fda5081c 100644 --- a/icuSources/layout/LayoutTables.h +++ b/icuSources/layout/LayoutTables.h @@ -1,7 +1,6 @@ /* - * @(#)LayoutTables.h 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/LigatureSubstProc.cpp b/icuSources/layout/LigatureSubstProc.cpp index 4311f071..8df9a786 100644 --- a/icuSources/layout/LigatureSubstProc.cpp +++ b/icuSources/layout/LigatureSubstProc.cpp @@ -1,7 +1,6 @@ /* - * @(#)GlyphSubstLookupProc.cpp 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -12,15 +11,16 @@ #include "SubtableProcessor.h" #include "StateTableProcessor.h" #include "LigatureSubstProc.h" +#include "LEGlyphStorage.h" #include "LESwaps.h" U_NAMESPACE_BEGIN #define ExtendedComplement(m) ((le_int32) (~((le_uint32) (m)))) -#define SignBit(m) ((ExtendedComplement(m) >> 1) & (m)) +#define SignBit(m) ((ExtendedComplement(m) >> 1) & (le_int32)(m)) #define SignExtend(v,m) (((v) & SignBit(m))? ((v) | ExtendedComplement(m)): (v)) -const char LigatureSubstitutionProcessor::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LigatureSubstitutionProcessor) LigatureSubstitutionProcessor::LigatureSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader) : StateTableProcessor(morphSubtableHeader) @@ -42,7 +42,7 @@ void LigatureSubstitutionProcessor::beginStateTable() m = -1; } -ByteOffset LigatureSubstitutionProcessor::processStateEntry(LEGlyphID *glyphs, le_int32 * /*charIndices*/, le_int32 &currGlyph, le_int32 /*glyphCount*/, EntryTableIndex index) +ByteOffset LigatureSubstitutionProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index) { const LigatureSubstitutionStateEntry *entry = &entryTable[index]; ByteOffset newState = SWAPW(entry->newStateOffset); @@ -78,17 +78,17 @@ ByteOffset LigatureSubstitutionProcessor::processStateEntry(LEGlyphID *glyphs, l if (offset != 0) { const le_int16 *offsetTable = (const le_int16 *)((char *) &ligatureSubstitutionHeader->stHeader + 2 * SignExtend(offset, lafComponentOffsetMask)); - i += SWAPW(offsetTable[LE_GET_GLYPH(glyphs[componentGlyph])]); + i += SWAPW(offsetTable[LE_GET_GLYPH(glyphStorage[componentGlyph])]); if (action & (lafLast | lafStore)) { const TTGlyphID *ligatureOffset = (const TTGlyphID *) ((char *) &ligatureSubstitutionHeader->stHeader + i); TTGlyphID ligatureGlyph = SWAPW(*ligatureOffset); - glyphs[componentGlyph] = LE_SET_GLYPH(glyphs[componentGlyph], ligatureGlyph); + glyphStorage[componentGlyph] = LE_SET_GLYPH(glyphStorage[componentGlyph], ligatureGlyph); stack[++mm] = componentGlyph; i = 0; } else { - glyphs[componentGlyph] = LE_SET_GLYPH(glyphs[componentGlyph], 0xFFFF); + glyphStorage[componentGlyph] = LE_SET_GLYPH(glyphStorage[componentGlyph], 0xFFFF); } } } while (!(action & lafLast)); diff --git a/icuSources/layout/LigatureSubstProc.h b/icuSources/layout/LigatureSubstProc.h index ce843e69..ef5b1edb 100644 --- a/icuSources/layout/LigatureSubstProc.h +++ b/icuSources/layout/LigatureSubstProc.h @@ -1,7 +1,6 @@ /* - * @(#)LigatureSubstProc.h 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -21,6 +20,8 @@ U_NAMESPACE_BEGIN +class LEGlyphStorage; + #define nComponents 16 class LigatureSubstitutionProcessor : public StateTableProcessor @@ -28,8 +29,7 @@ class LigatureSubstitutionProcessor : public StateTableProcessor public: virtual void beginStateTable(); - virtual ByteOffset processStateEntry(LEGlyphID *glyphs, le_int32 *charIndices, le_int32 &currGlyph, - le_int32 glyphCount, EntryTableIndex index); + virtual ByteOffset processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index); virtual void endStateTable(); @@ -39,16 +39,16 @@ public: /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } + static UClassID getStaticClassID(); private: LigatureSubstitutionProcessor(); @@ -65,13 +65,6 @@ protected: const LigatureSubstitutionHeader *ligatureSubstitutionHeader; -private: - - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; U_NAMESPACE_END diff --git a/icuSources/layout/LigatureSubstSubtables.h b/icuSources/layout/LigatureSubstSubtables.h index c963b644..423c95a6 100644 --- a/icuSources/layout/LigatureSubstSubtables.h +++ b/icuSources/layout/LigatureSubstSubtables.h @@ -1,7 +1,6 @@ /* - * @(#)LigatureSubstSubtables.h 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/LigatureSubstitution.h b/icuSources/layout/LigatureSubstitution.h index 82b8d13b..2963b7c1 100644 --- a/icuSources/layout/LigatureSubstitution.h +++ b/icuSources/layout/LigatureSubstitution.h @@ -1,7 +1,6 @@ /* - * @(#)LigatureSubstitution.h 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/LookupProcessor.cpp b/icuSources/layout/LookupProcessor.cpp index 8dc4edc2..2fc88448 100644 --- a/icuSources/layout/LookupProcessor.cpp +++ b/icuSources/layout/LookupProcessor.cpp @@ -1,7 +1,6 @@ /* - * %W% %E% * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -15,6 +14,7 @@ #include "GlyphDefinitionTables.h" #include "GlyphPositionAdjustments.h" #include "LookupProcessor.h" +#include "LEGlyphStorage.h" #include "LESwaps.h" U_NAMESPACE_BEGIN @@ -22,7 +22,7 @@ U_NAMESPACE_BEGIN const LETag LookupProcessor::notSelected = 0x00000000; const LETag LookupProcessor::defaultFeature = 0xFFFFFFFF; -const LETag emptyTag = 0x00000000; +static const LETag emptyTag = 0x00000000; le_uint32 LookupProcessor::applyLookupTable(const LookupTable *lookupTable, GlyphIterator *glyphIterator, @@ -48,14 +48,20 @@ le_uint32 LookupProcessor::applyLookupTable(const LookupTable *lookupTable, Glyp return 1; } -void LookupProcessor::process(LEGlyphID *glyphs, GlyphPositionAdjustment *glyphPositionAdjustments, const LETag **glyphTags, le_int32 glyphCount, +le_int32 LookupProcessor::process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustment *glyphPositionAdjustments, le_bool rightToLeft, const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, const LEFontInstance *fontInstance) const { + le_int32 glyphCount = glyphStorage.getGlyphCount(); + if (lookupSelectArray == NULL) { - return; + return glyphCount; } + GlyphIterator glyphIterator(glyphStorage, glyphPositionAdjustments, + rightToLeft, 0, 0, glyphDefinitionTableHeader); + le_int32 newGlyphCount = glyphCount; + for (le_uint16 order = 0; order < lookupOrderCount; order += 1) { le_uint16 lookup = lookupOrderArray[order]; LETag selectTag = lookupSelectArray[lookup]; @@ -63,9 +69,8 @@ void LookupProcessor::process(LEGlyphID *glyphs, GlyphPositionAdjustment *glyphP if (selectTag != notSelected) { const LookupTable *lookupTable = lookupListTable->getLookupTable(lookup); le_uint16 lookupFlags = SWAPW(lookupTable->lookupFlags); - GlyphIterator glyphIterator(glyphs, glyphPositionAdjustments, glyphCount, - rightToLeft, lookupFlags, selectTag, glyphTags, - glyphDefinitionTableHeader); + + glyphIterator.reset(lookupFlags, selectTag); while (glyphIterator.findFeatureTag()) { le_uint32 delta = 1; @@ -74,8 +79,12 @@ void LookupProcessor::process(LEGlyphID *glyphs, GlyphPositionAdjustment *glyphP delta = applyLookupTable(lookupTable, &glyphIterator, fontInstance); } } + + newGlyphCount = glyphIterator.applyInsertions(); } } + + return newGlyphCount; } le_uint32 LookupProcessor::applySingleLookup(le_uint16 lookupTableIndex, GlyphIterator *glyphIterator, @@ -92,15 +101,18 @@ le_uint32 LookupProcessor::applySingleLookup(le_uint16 lookupTableIndex, GlyphIt le_int32 LookupProcessor::selectLookups(const FeatureTable *featureTable, LETag featureTag, le_int32 order) { le_uint16 lookupCount = featureTable? SWAPW(featureTable->lookupCount) : 0; + le_int32 store = order; for (le_uint16 lookup = 0; lookup < lookupCount; lookup += 1) { le_uint16 lookupListIndex = SWAPW(featureTable->lookupListIndexArray[lookup]); - lookupSelectArray[lookupListIndex] = featureTag; - lookupOrderArray[order + lookup] = lookupListIndex; + if (lookupSelectArray[lookupListIndex] == notSelected) { + lookupSelectArray[lookupListIndex] = featureTag; + lookupOrderArray[store++] = lookupListIndex; + } } - return lookupCount; + return store - order; } LookupProcessor::LookupProcessor(const char *baseAddress, @@ -186,6 +198,11 @@ LookupProcessor::LookupProcessor(const char *baseAddress, for (le_uint16 feature = 0; feature < featureCount; feature += 1) { le_uint16 featureIndex = SWAPW(langSysTable->featureIndexArray[feature]); + // don't add the required feature to the list more than once... + if (featureIndex == requiredFeatureIndex) { + continue; + } + featureTable = featureListTable->getFeatureTable(featureIndex, &featureTag); count = selectLookups(featureTable, featureTag, order); order += count; diff --git a/icuSources/layout/LookupProcessor.h b/icuSources/layout/LookupProcessor.h index 7ce35a20..e8257e9e 100644 --- a/icuSources/layout/LookupProcessor.h +++ b/icuSources/layout/LookupProcessor.h @@ -1,7 +1,7 @@ /* * %W% %E% * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -24,12 +24,14 @@ U_NAMESPACE_BEGIN +class LEGlyphStorage; + class LookupProcessor : public UMemory { public: static const LETag notSelected; static const LETag defaultFeature; - void process(LEGlyphID *glyphs, GlyphPositionAdjustment *glyphPositionAdjustments, const LETag **glyphTags, le_int32 glyphCount, + le_int32 process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustment *glyphPositionAdjustments, le_bool rightToLeft, const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, const LEFontInstance *fontInstance) const; le_uint32 applyLookupTable(const LookupTable *lookupTable, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; diff --git a/icuSources/layout/LookupTables.cpp b/icuSources/layout/LookupTables.cpp index 19ebf57c..9766a813 100644 --- a/icuSources/layout/LookupTables.cpp +++ b/icuSources/layout/LookupTables.cpp @@ -1,7 +1,6 @@ /* - * @(#)LookupTables.cpp 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/LookupTables.h b/icuSources/layout/LookupTables.h index 53231b7a..5fa84994 100644 --- a/icuSources/layout/LookupTables.h +++ b/icuSources/layout/LookupTables.h @@ -1,7 +1,6 @@ /* - * @(#)LookupTables.h 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/Lookups.cpp b/icuSources/layout/Lookups.cpp index af6ee209..67f62952 100644 --- a/icuSources/layout/Lookups.cpp +++ b/icuSources/layout/Lookups.cpp @@ -1,7 +1,6 @@ /* - * @(#)Lookups.cpp 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998, 1999, 2000, 2001 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/Lookups.h b/icuSources/layout/Lookups.h index 0e7e7715..8bf23d2f 100644 --- a/icuSources/layout/Lookups.h +++ b/icuSources/layout/Lookups.h @@ -1,7 +1,6 @@ /* - * @(#)Lookups.h 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/MPreFixups.cpp b/icuSources/layout/MPreFixups.cpp index 964292a0..75791eed 100644 --- a/icuSources/layout/MPreFixups.cpp +++ b/icuSources/layout/MPreFixups.cpp @@ -1,13 +1,11 @@ /* - * (C) Copyright IBM Corp. 2002-2003 - All Rights Reserved * - * $Source: /cvs/root/ICU/icuSources/layout/MPreFixups.cpp,v $ - * $Date: 2003/07/03 18:13:45 $ - * $Revision: 1.1.1.1 $ + * (C) Copyright IBM Corp. 2002-2004 - All Rights Reserved * */ #include "LETypes.h" +#include "LEGlyphStorage.h" #include "MPreFixups.h" U_NAMESPACE_BEGIN @@ -42,18 +40,18 @@ void MPreFixups::add(le_int32 baseIndex, le_int32 mpreIndex) } } -void MPreFixups::apply(LEGlyphID *glyphs, le_int32 *charIndices) +void MPreFixups::apply(LEGlyphStorage &glyphStorage) { for (le_int32 fixup = 0; fixup < fFixupCount; fixup += 1) { le_int32 baseIndex = fFixupData[fixup].fBaseIndex; le_int32 mpreIndex = fFixupData[fixup].fMPreIndex; le_int32 mpreLimit = mpreIndex + 1; - while (glyphs[baseIndex] == 0xFFFF || glyphs[baseIndex] == 0xFFFE) { + while (glyphStorage[baseIndex] == 0xFFFF || glyphStorage[baseIndex] == 0xFFFE) { baseIndex -= 1; } - while (glyphs[mpreLimit] == 0xFFFF || glyphs[mpreLimit] == 0xFFFE) { + while (glyphStorage[mpreLimit] == 0xFFFF || glyphStorage[mpreLimit] == 0xFFFE) { mpreLimit += 1; } @@ -61,6 +59,7 @@ void MPreFixups::apply(LEGlyphID *glyphs, le_int32 *charIndices) continue; } + LEErrorCode success = LE_NO_ERROR; le_int32 mpreCount = mpreLimit - mpreIndex; le_int32 moveCount = baseIndex - mpreLimit; le_int32 mpreDest = baseIndex - mpreCount; @@ -69,18 +68,21 @@ void MPreFixups::apply(LEGlyphID *glyphs, le_int32 *charIndices) le_int32 i; for (i = 0; i < mpreCount; i += 1) { - mpreSave[i] = glyphs[mpreIndex + i]; - indexSave[i] = charIndices[mpreIndex + i]; + mpreSave[i] = glyphStorage[mpreIndex + i]; + indexSave[i] = glyphStorage.getCharIndex(mpreIndex + i, success); //charIndices[mpreIndex + i]; } for (i = 0; i < moveCount; i += 1) { - glyphs[mpreIndex + i] = glyphs[mpreLimit + i]; - charIndices[mpreIndex + i] = charIndices[mpreLimit + i]; + LEGlyphID glyph = glyphStorage[mpreLimit + i]; + le_int32 charIndex = glyphStorage.getCharIndex(mpreLimit + i, success); + + glyphStorage[mpreIndex + i] = glyph; + glyphStorage.setCharIndex(mpreIndex + i, charIndex, success); } for (i = 0; i < mpreCount; i += 1) { - glyphs[mpreDest + i] = mpreSave[i]; - charIndices[mpreDest + i] = indexSave[i]; + glyphStorage[mpreDest + i] = mpreSave[i]; + glyphStorage.setCharIndex(mpreDest, indexSave[i], success); } LE_DELETE_ARRAY(indexSave); diff --git a/icuSources/layout/MPreFixups.h b/icuSources/layout/MPreFixups.h index 69d54c96..6053c088 100644 --- a/icuSources/layout/MPreFixups.h +++ b/icuSources/layout/MPreFixups.h @@ -1,9 +1,6 @@ /* - * (C) Copyright IBM Corp. 2002-2003 - All Rights Reserved * - * $Source: /cvs/root/ICU/icuSources/layout/MPreFixups.h,v $ - * $Date: 2003/07/03 18:13:45 $ - * $Revision: 1.1.1.1 $ + * (C) Copyright IBM Corp. 2002-2004 - All Rights Reserved * */ @@ -19,6 +16,8 @@ U_NAMESPACE_BEGIN +class LEGlyphStorage; + // Might want to make this a private member... struct FixupData; @@ -30,7 +29,7 @@ public: void add(le_int32 baseIndex, le_int32 mpreIndex); - void apply(LEGlyphID *glyphs, le_int32 *charIndicies); + void apply(LEGlyphStorage &glyphStorage); private: FixupData *fFixupData; diff --git a/icuSources/layout/Makefile.in b/icuSources/layout/Makefile.in index e5ed162d..ad96f2fc 100644 --- a/icuSources/layout/Makefile.in +++ b/icuSources/layout/Makefile.in @@ -1,10 +1,7 @@ -## Copyright (c) 1999-2003, International Business Machines Corporation and +## Copyright (c) 1999-2004, International Business Machines Corporation and ## others. All Rights Reserved. ## Makefile.in for ICU - layout -SO_TARGET_VERSION = @LIB_VERSION@ -SO_TARGET_VERSION_MAJOR = @LIB_VERSION_MAJOR@ - ## Install directory information srcdir = @srcdir@ top_srcdir = @top_srcdir@ @@ -17,28 +14,39 @@ include $(top_builddir)/icudefs.mk subdir = layout ## Extra files to remove for 'make clean' -CLEANFILES = *~ $(DEPS) +CLEANFILES = *~ $(DEPS) $(IMPORT_LIB) $(MIDDLE_IMPORT_LIB) $(FINAL_IMPORT_LIB) ## Target information -TARGET_STUBNAME=le +TARGET_STUBNAME=$(LAYOUT_STUBNAME) ifneq ($(ENABLE_STATIC),) -TARGET = $(LIBICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX).a +TARGET = $(LIBDIR)/$(LIBSICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX).$(A) endif ifneq ($(ENABLE_SHARED),) -SO_TARGET = $(LIBICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX).$(SO) +SO_TARGET = $(LIBDIR)/$(LIBICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX).$(SO) ALL_SO_TARGETS = $(SO_TARGET) $(MIDDLE_SO_TARGET) $(FINAL_SO_TARGET) + +ifeq ($(ENABLE_SO_VERSION_DATA),1) +SO_VERSION_DATA = layout.res endif -ALL_TARGETS = $(TARGET) $(ALL_SO_TARGETS) +ifeq ($(OS390BATCH),1) +BATCH_TARGET = $(BATCH_LAYOUT_TARGET) +BATCH_LIBS = $(BATCH_LIBICUUC) -lm +endif # OS390BATCH + +endif # ENABLE_SHARED + +ALL_TARGETS = $(TARGET) $(ALL_SO_TARGETS) $(BATCH_TARGET) DYNAMICCPPFLAGS = $(SHAREDLIBCPPFLAGS) DYNAMICCFLAGS = $(SHAREDLIBCFLAGS) DYNAMICCXXFLAGS = $(SHAREDLIBCXXFLAGS) -CPPFLAGS += -I$(srcdir) -I$(top_builddir)/common -I$(srcdir)/unicode -I$(srcdir)/.. -I$(top_builddir)/common -I$(top_srcdir)/common $(LIBCPPFLAGS) +LDFLAGS += $(LDFLAGSICULE) +CPPFLAGS += -I$(srcdir) -I$(top_builddir)/common -I$(top_srcdir)/common -I$(srcdir)/unicode -I$(srcdir)/.. $(LIBCPPFLAGS) DEFS += -DU_LAYOUT_IMPLEMENTATION LIBS = $(LIBICUUC) $(DEFAULT_LIBS) @@ -68,8 +76,8 @@ SubtableProcessor.o \ TrimmedArrayProcessor.o \ AlternateSubstSubtables.o \ AnchorTables.o \ -ArabicLigatureData.o \ ArabicShaping.o \ +CanonData.o \ ClassDefinitionTables.o \ ContextualSubstSubtables.o \ CoverageTables.o \ @@ -80,14 +88,15 @@ Features.o \ GDEFMarkFilter.o \ GlyphDefinitionTables.o \ GlyphIterator.o \ +GlyphLookupTables.o \ GlyphPosnLookupProc.o \ GlyphPositioningTables.o \ GlyphSubstLookupProc.o \ GlyphSubstitutionTables.o \ -HebrewLigatureData.o \ -HebrewShaping.o \ IndicClassTables.o \ IndicReordering.o \ +LEInsertionList.o \ +LEGlyphStorage.o \ LigatureSubstSubtables.o \ LookupProcessor.o \ Lookups.o \ @@ -111,7 +120,7 @@ STATIC_OBJECTS = $(OBJECTS:.o=.$(STATIC_O)) DEPS = $(OBJECTS:.o=.d) ## Header files to install -HEADERS= $(srcdir)/*LayoutEngine.h $(srcdir)/LE*.h +HEADERS= $(srcdir)/LayoutEngine.h $(srcdir)/LE*.h LOHEADERS= $(srcdir)/unicode/loengine.h ## List of phony targets @@ -137,22 +146,24 @@ install-local: install-headers install-library install-library: all-local $(MKINSTALLDIRS) $(DESTDIR)$(libdir) ifneq ($(ENABLE_STATIC),) - $(INSTALL-L) $(TARGET) $(DESTDIR)$(libdir)/$(TARGET) + $(INSTALL-L) $(TARGET) $(DESTDIR)$(libdir) endif ifneq ($(ENABLE_SHARED),) - $(INSTALL-L) $(FINAL_SO_TARGET) $(DESTDIR)$(libdir)/$(FINAL_SO_TARGET) + $(INSTALL-L) $(FINAL_SO_TARGET) $(DESTDIR)$(libdir) ifneq ($(FINAL_SO_TARGET),$(SO_TARGET)) - cd $(DESTDIR)$(libdir) && $(RM) $(SO_TARGET) && ln -s $(FINAL_SO_TARGET) $(SO_TARGET) + cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(SO_TARGET)) && ln -s $(notdir $(FINAL_SO_TARGET)) $(notdir $(SO_TARGET)) ifneq ($(FINAL_SO_TARGET),$(MIDDLE_SO_TARGET)) - cd $(DESTDIR)$(libdir) && $(RM) $(MIDDLE_SO_TARGET) && ln -s $(FINAL_SO_TARGET) $(MIDDLE_SO_TARGET) + cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(MIDDLE_SO_TARGET)) && ln -s $(notdir $(FINAL_SO_TARGET)) $(notdir $(MIDDLE_SO_TARGET)) endif endif endif ifneq ($(IMPORT_LIB_EXT),) - $(INSTALL-L) $(FINAL_IMPORT_LIB) $(DESTDIR)$(libdir)/$(FINAL_IMPORT_LIB) - cd $(DESTDIR)$(libdir) && $(RM) $(IMPORT_LIB) && ln -s $(FINAL_IMPORT_LIB) $(IMPORT_LIB) + $(INSTALL-L) $(FINAL_IMPORT_LIB) $(DESTDIR)$(libdir) +ifneq ($(IMPORT_LIB),$(FINAL_IMPORT_LIB)) + cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(IMPORT_LIB)) && ln -s $(notdir $(FINAL_IMPORT_LIB)) $(notdir $(IMPORT_LIB)) +endif ifneq ($(MIDDLE_IMPORT_LIB),$(FINAL_IMPORT_LIB)) - cd $(DESTDIR)$(libdir) && $(RM) $(MIDDLE_IMPORT_LIB) && ln -s $(FINAL_IMPORT_LIB) $(MIDDLE_IMPORT_LIB) + cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(MIDDLE_IMPORT_LIB)) && ln -s $(notdir $(FINAL_IMPORT_LIB)) $(notdir $(MIDDLE_IMPORT_LIB)) endif endif @@ -172,8 +183,7 @@ dist-local: clean-local: test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES) - $(RMV) $(OBJECTS) $(ALL_TARGETS) -# $(RMV) $(OBJECTS) $(STATIC_OBJECTS) $(ALL_TARGETS) + $(RMV) $(OBJECTS) $(ALL_TARGETS) $(SO_VERSION_DATA) distclean-local: clean-local $(RMV) Makefile @@ -190,8 +200,14 @@ $(TARGET): $(TARGET)($(STATIC_OBJECTS)) endif ifneq ($(ENABLE_SHARED),) -$(FINAL_SO_TARGET): $(OBJECTS) +$(FINAL_SO_TARGET): $(OBJECTS) $(SO_VERSION_DATA) $(SHLIB.cc) $(LD_SONAME) $(OUTOPT)$@ $^ $(LIBS) + +ifeq ($(OS390BATCH),1) +$(BATCH_TARGET): $(OBJECTS) + $(SHLIB.cc) $(LD_SONAME) $(OUTOPT)$@ $^ $(BATCH_LIBS) +endif # OS390BATCH + endif ifeq (,$(MAKECMDGOALS)) diff --git a/icuSources/layout/MarkArrays.cpp b/icuSources/layout/MarkArrays.cpp index 08101fbd..47a06251 100644 --- a/icuSources/layout/MarkArrays.cpp +++ b/icuSources/layout/MarkArrays.cpp @@ -1,7 +1,6 @@ /* - * @(#)MarkArrays.cpp 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998, 1999, 2000, 2001 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/MarkArrays.h b/icuSources/layout/MarkArrays.h index c0825d94..66dca2ae 100644 --- a/icuSources/layout/MarkArrays.h +++ b/icuSources/layout/MarkArrays.h @@ -1,7 +1,6 @@ /* - * @(#)MarkArrays.h 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/MarkToBasePosnSubtables.cpp b/icuSources/layout/MarkToBasePosnSubtables.cpp index 498aecda..6843c4a1 100644 --- a/icuSources/layout/MarkToBasePosnSubtables.cpp +++ b/icuSources/layout/MarkToBasePosnSubtables.cpp @@ -1,7 +1,6 @@ /* - * @(#)MarkToBasePosnSubtables.cpp 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -67,6 +66,12 @@ le_int32 MarkToBasePositioningSubtable::process(GlyphIterator *glyphIterator, co const AnchorTable *anchorTable = (const AnchorTable *) ((char *) baseArray + anchorTableOffset); LEPoint baseAnchor, markAdvance, pixels; + if (anchorTableOffset == 0) { + // this means the table is mal-formed... + glyphIterator->setCurrGlyphBaseOffset(baseIterator.getCurrStreamPosition()); + return 0; + } + anchorTable->getAnchor(baseGlyph, fontInstance, baseAnchor); fontInstance->getGlyphAdvance(markGlyph, pixels); @@ -78,14 +83,14 @@ le_int32 MarkToBasePositioningSubtable::process(GlyphIterator *glyphIterator, co glyphIterator->setCurrGlyphBaseOffset(baseIterator.getCurrStreamPosition()); if (glyphIterator->isRightToLeft()) { - glyphIterator->adjustCurrGlyphPositionAdjustment(anchorDiffX, anchorDiffY, -markAdvance.fX, -markAdvance.fY); + glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX, anchorDiffY, -markAdvance.fX, -markAdvance.fY); } else { LEPoint baseAdvance; fontInstance->getGlyphAdvance(baseGlyph, pixels); fontInstance->pixelsToUnits(pixels, baseAdvance); - glyphIterator->adjustCurrGlyphPositionAdjustment(anchorDiffX - baseAdvance.fX, anchorDiffY - baseAdvance.fY, -markAdvance.fX, -markAdvance.fY); + glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX - baseAdvance.fX, anchorDiffY - baseAdvance.fY, -markAdvance.fX, -markAdvance.fY); } return 1; diff --git a/icuSources/layout/MarkToBasePosnSubtables.h b/icuSources/layout/MarkToBasePosnSubtables.h index 6fc5dd0b..aa7a0a12 100644 --- a/icuSources/layout/MarkToBasePosnSubtables.h +++ b/icuSources/layout/MarkToBasePosnSubtables.h @@ -1,7 +1,6 @@ /* - * @(#)MarkToBasePosnSubtables.h 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/MarkToLigaturePosnSubtables.cpp b/icuSources/layout/MarkToLigaturePosnSubtables.cpp index 4cadda22..e247e4e5 100644 --- a/icuSources/layout/MarkToLigaturePosnSubtables.cpp +++ b/icuSources/layout/MarkToLigaturePosnSubtables.cpp @@ -1,7 +1,5 @@ /* - * %W% %E% - * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -89,14 +87,14 @@ le_int32 MarkToLigaturePositioningSubtable::process(GlyphIterator *glyphIterator glyphIterator->setCurrGlyphBaseOffset(ligatureIterator.getCurrStreamPosition()); if (glyphIterator->isRightToLeft()) { - glyphIterator->adjustCurrGlyphPositionAdjustment(anchorDiffX, anchorDiffY, -markAdvance.fX, -markAdvance.fY); + glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX, anchorDiffY, -markAdvance.fX, -markAdvance.fY); } else { LEPoint ligatureAdvance; fontInstance->getGlyphAdvance(ligatureGlyph, pixels); fontInstance->pixelsToUnits(pixels, ligatureAdvance); - glyphIterator->adjustCurrGlyphPositionAdjustment(anchorDiffX - ligatureAdvance.fX, anchorDiffY - ligatureAdvance.fY, -markAdvance.fX, -markAdvance.fY); + glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX - ligatureAdvance.fX, anchorDiffY - ligatureAdvance.fY, -markAdvance.fX, -markAdvance.fY); } return 1; diff --git a/icuSources/layout/MarkToLigaturePosnSubtables.h b/icuSources/layout/MarkToLigaturePosnSubtables.h index a4b17ef0..b8e34d1d 100644 --- a/icuSources/layout/MarkToLigaturePosnSubtables.h +++ b/icuSources/layout/MarkToLigaturePosnSubtables.h @@ -1,7 +1,6 @@ /* - * @(#)MarkToLigaturePosnSubtables.h 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/MarkToMarkPosnSubtables.cpp b/icuSources/layout/MarkToMarkPosnSubtables.cpp index 41b50203..66d1b9dd 100644 --- a/icuSources/layout/MarkToMarkPosnSubtables.cpp +++ b/icuSources/layout/MarkToMarkPosnSubtables.cpp @@ -1,7 +1,6 @@ /* - * @(#)MarkToMarkPosnSubtables.cpp 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -48,8 +47,7 @@ le_int32 MarkToMarkPositioningSubtable::process(GlyphIterator *glyphIterator, co return 0; } - // FIXME: we probably don't want to find a mark before a previous base glyph... - GlyphIterator mark2Iterator(*glyphIterator, (le_uint16) (lfIgnoreLigatures /*| lfIgnoreBaseGlyphs*/)); + GlyphIterator mark2Iterator(*glyphIterator); LEGlyphID mark2Glyph = findMark2Glyph(&mark2Iterator); le_int32 mark2Coverage = getBaseCoverage((LEGlyphID) mark2Glyph); const Mark2Array *mark2Array = (const Mark2Array *) ((char *) this + SWAPW(baseArrayOffset)); @@ -78,14 +76,14 @@ le_int32 MarkToMarkPositioningSubtable::process(GlyphIterator *glyphIterator, co glyphIterator->setCurrGlyphBaseOffset(mark2Iterator.getCurrStreamPosition()); if (glyphIterator->isRightToLeft()) { - glyphIterator->adjustCurrGlyphPositionAdjustment(anchorDiffX, anchorDiffY, -markAdvance.fX, -markAdvance.fY); + glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX, anchorDiffY, -markAdvance.fX, -markAdvance.fY); } else { LEPoint mark2Advance; fontInstance->getGlyphAdvance(mark2Glyph, pixels); fontInstance->pixelsToUnits(pixels, mark2Advance); - glyphIterator->adjustCurrGlyphPositionAdjustment(anchorDiffX - mark2Advance.fX, anchorDiffY - mark2Advance.fY, -markAdvance.fX, -markAdvance.fY); + glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX - mark2Advance.fX, anchorDiffY - mark2Advance.fY, -markAdvance.fX, -markAdvance.fY); } return 1; diff --git a/icuSources/layout/MarkToMarkPosnSubtables.h b/icuSources/layout/MarkToMarkPosnSubtables.h index d7942a98..746ace29 100644 --- a/icuSources/layout/MarkToMarkPosnSubtables.h +++ b/icuSources/layout/MarkToMarkPosnSubtables.h @@ -1,7 +1,6 @@ /* - * @(#)MarkToMarkPosnSubtables.h 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/MorphStateTables.h b/icuSources/layout/MorphStateTables.h index c53ee4b1..a2e0b00b 100644 --- a/icuSources/layout/MorphStateTables.h +++ b/icuSources/layout/MorphStateTables.h @@ -1,7 +1,6 @@ /* - * @(#)MorphStateTables.h 1.4 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/MorphTables.cpp b/icuSources/layout/MorphTables.cpp index 73ec352d..9272cc3a 100644 --- a/icuSources/layout/MorphTables.cpp +++ b/icuSources/layout/MorphTables.cpp @@ -1,7 +1,7 @@ /* * %W% %W% * - * (C) Copyright IBM Corp. 1998, 1999, 2000, 2001 - All Rights Reserved + * (C) Copyright IBM Corp. 1998 - 2004 - All Rights Reserved * */ @@ -15,11 +15,12 @@ #include "LigatureSubstProc.h" #include "NonContextualGlyphSubstProc.h" //#include "ContextualGlyphInsertionProcessor.h" +#include "LEGlyphStorage.h" #include "LESwaps.h" U_NAMESPACE_BEGIN -void MorphTableHeader::process(LEGlyphID *glyphs, le_int32 *glyphIndices, le_int32 glyphCount) const +void MorphTableHeader::process(LEGlyphStorage &glyphStorage) const { const ChainHeader *chainHeader = chains; le_uint32 chainCount = SWAPL(this->nChains); @@ -41,7 +42,7 @@ void MorphTableHeader::process(LEGlyphID *glyphs, le_int32 *glyphIndices, le_int // should check coverage more carefully... if ((coverage & scfVertical) == 0 && (subtableFeatures & defaultFlags) != 0) { - subtableHeader->process(glyphs, glyphIndices, glyphCount); + subtableHeader->process(glyphStorage); } subtableHeader = (const MorphSubtableHeader *) ((char *)subtableHeader + length); @@ -51,7 +52,7 @@ void MorphTableHeader::process(LEGlyphID *glyphs, le_int32 *glyphIndices, le_int } } -void MorphSubtableHeader::process(LEGlyphID *glyphs, le_int32 *glyphIndices, le_int32 glyphCount) const +void MorphSubtableHeader::process(LEGlyphStorage &glyphStorage) const { SubtableProcessor *processor = NULL; @@ -87,7 +88,7 @@ void MorphSubtableHeader::process(LEGlyphID *glyphs, le_int32 *glyphIndices, le_ } if (processor != NULL) { - processor->process(glyphs, glyphIndices, glyphCount); + processor->process(glyphStorage); delete processor; } } diff --git a/icuSources/layout/MorphTables.h b/icuSources/layout/MorphTables.h index f963ddd4..8d198cf4 100644 --- a/icuSources/layout/MorphTables.h +++ b/icuSources/layout/MorphTables.h @@ -1,7 +1,6 @@ /* - * @(#)MorphTables.h 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -18,6 +17,8 @@ U_NAMESPACE_BEGIN +class LEGlyphStorage; + typedef le_uint32 FeatureFlags; typedef le_int16 FeatureType; @@ -46,7 +47,7 @@ struct MorphTableHeader le_uint32 nChains; ChainHeader chains[ANY_NUMBER]; - void process(LEGlyphID *glyphs, le_int32 *glyphIndices, le_int32 glyphCount) const; + void process(LEGlyphStorage &glyphStorage) const; }; typedef le_int16 SubtableCoverage; @@ -76,7 +77,7 @@ struct MorphSubtableHeader SubtableCoverage coverage; FeatureFlags subtableFeatures; - void process(LEGlyphID *glyphs, le_int32 *glyphIndices, le_int32 glyphCount) const; + void process(LEGlyphStorage &glyphStorage) const; }; U_NAMESPACE_END diff --git a/icuSources/layout/MultipleSubstSubtables.cpp b/icuSources/layout/MultipleSubstSubtables.cpp index 65b0c610..450bf35b 100644 --- a/icuSources/layout/MultipleSubstSubtables.cpp +++ b/icuSources/layout/MultipleSubstSubtables.cpp @@ -1,7 +1,6 @@ /* - * %W% %E% * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -18,6 +17,18 @@ U_NAMESPACE_BEGIN le_uint32 MultipleSubstitutionSubtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const { LEGlyphID glyph = glyphIterator->getCurrGlyphID(); + + // If there's a filter, we only want to do the + // substitution if the *input* glyphs doesn't + // exist. + // + // FIXME: is this always the right thing to do? + // FIXME: should this only be done for a non-zero + // glyphCount? + if (filter != NULL && filter->accept(glyph)) { + return 0; + } + le_int32 coverageIndex = getGlyphCoverage(glyph); le_uint16 seqCount = SWAPW(sequenceCount); @@ -29,17 +40,43 @@ le_uint32 MultipleSubstitutionSubtable::process(GlyphIterator *glyphIterator, co if (glyphCount == 0) { glyphIterator->setCurrGlyphID(0xFFFF); return 1; - } else if (glyphCount >= 1) { + } else if (glyphCount == 1) { TTGlyphID substitute = SWAPW(sequenceTable->substituteArray[0]); - if (filter == NULL || filter->accept(LE_SET_GLYPH(glyph, substitute))) { - glyphIterator->setCurrGlyphID(substitute); + if (filter != NULL && ! filter->accept(LE_SET_GLYPH(glyph, substitute))) { + return 0; } + glyphIterator->setCurrGlyphID(substitute); return 1; } else { - // Can't do this 'till there's a way to - // grow the glyph array... + // If there's a filter, make sure all of the output glyphs + // exist. + if (filter != NULL) { + for (le_int32 i = 0; i < glyphCount; i += 1) { + TTGlyphID substitute = SWAPW(sequenceTable->substituteArray[i]); + + if (! filter->accept(substitute)) { + return 0; + } + } + } + + LEGlyphID *newGlyphs = glyphIterator->insertGlyphs(glyphCount); + le_int32 insert = 0, direction = 1; + + if (glyphIterator->isRightToLeft()) { + insert = glyphCount - 1; + direction = -1; + } + + for (le_int32 i = 0; i < glyphCount; i += 1) { + TTGlyphID substitute = SWAPW(sequenceTable->substituteArray[i]); + + newGlyphs[insert] = LE_SET_GLYPH(glyph, substitute); + insert += direction; + } + return 1; } } diff --git a/icuSources/layout/MultipleSubstSubtables.h b/icuSources/layout/MultipleSubstSubtables.h index 49f60c2b..e29963c5 100644 --- a/icuSources/layout/MultipleSubstSubtables.h +++ b/icuSources/layout/MultipleSubstSubtables.h @@ -1,7 +1,6 @@ /* - * @(#)MultipleSubstSubtables.h 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/NonContextualGlyphSubstProc.cpp b/icuSources/layout/NonContextualGlyphSubstProc.cpp index 7fd557e5..69c065b4 100644 --- a/icuSources/layout/NonContextualGlyphSubstProc.cpp +++ b/icuSources/layout/NonContextualGlyphSubstProc.cpp @@ -1,7 +1,6 @@ /* - * @(#)NonContextualGlyphSubstProc.cpp 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998, 1999, 2000, 2001 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -24,7 +23,7 @@ NonContextualGlyphSubstitutionProcessor::NonContextualGlyphSubstitutionProcessor } NonContextualGlyphSubstitutionProcessor::NonContextualGlyphSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader) - : SubtableProcessor(morphSubtableHeader) + : SubtableProcessor(morphSubtableHeader) { } diff --git a/icuSources/layout/NonContextualGlyphSubstProc.h b/icuSources/layout/NonContextualGlyphSubstProc.h index f9976751..4ce96cf3 100644 --- a/icuSources/layout/NonContextualGlyphSubstProc.h +++ b/icuSources/layout/NonContextualGlyphSubstProc.h @@ -1,7 +1,6 @@ /* - * @(#)NonContextualGlyphSubstProc.h 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -20,10 +19,12 @@ U_NAMESPACE_BEGIN +class LEGlyphStorage; + class NonContextualGlyphSubstitutionProcessor : public SubtableProcessor { public: - virtual void process(LEGlyphID *glyphs, le_int32 *charIndices, le_int32 glyphCount) = 0; + virtual void process(LEGlyphStorage &glyphStorage) = 0; static SubtableProcessor *createInstance(const MorphSubtableHeader *morphSubtableHeader); diff --git a/icuSources/layout/OpenTypeLayoutEngine.cpp b/icuSources/layout/OpenTypeLayoutEngine.cpp index 730c79d6..9709e6ac 100644 --- a/icuSources/layout/OpenTypeLayoutEngine.cpp +++ b/icuSources/layout/OpenTypeLayoutEngine.cpp @@ -1,8 +1,7 @@ /* - * %W% %W% * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -18,24 +17,42 @@ #include "GlyphDefinitionTables.h" #include "GlyphPositioningTables.h" +#include "LEGlyphStorage.h" + #include "GDEFMarkFilter.h" U_NAMESPACE_BEGIN -const char OpenTypeLayoutEngine::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(OpenTypeLayoutEngine) + +static const LETag emptyTag = 0x00000000; + +static const LETag ccmpFeatureTag = LE_CCMP_FEATURE_TAG; +static const LETag ligaFeatureTag = LE_LIGA_FEATURE_TAG; +static const LETag cligFeatureTag = LE_CLIG_FEATURE_TAG; +static const LETag kernFeatureTag = LE_KERN_FEATURE_TAG; +static const LETag markFeatureTag = LE_MARK_FEATURE_TAG; +static const LETag mkmkFeatureTag = LE_MKMK_FEATURE_TAG; + +static const LETag defaultFeatures[] = {ccmpFeatureTag, ligaFeatureTag, cligFeatureTag, kernFeatureTag, markFeatureTag, mkmkFeatureTag, emptyTag}; + OpenTypeLayoutEngine::OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const GlyphSubstitutionTableHeader *gsubTable) - : LayoutEngine(fontInstance, scriptCode, languageCode), fFeatureTags(NULL), fFeatureOrder(NULL), - fGSUBTable(gsubTable), fSubstitutionFilter(NULL) + : LayoutEngine(fontInstance, scriptCode, languageCode), fFeatureList(defaultFeatures), fFeatureOrder(NULL), + fGSUBTable(gsubTable), fGDEFTable(NULL), fGPOSTable(NULL), fSubstitutionFilter(NULL) { - static le_uint32 gdefTableTag = LE_GDEF_TABLE_TAG; - static le_uint32 gposTableTag = LE_GPOS_TABLE_TAG; - - fGDEFTable = (const GlyphDefinitionTableHeader *) getFontTable(gdefTableTag); - fGPOSTable = (const GlyphPositioningTableHeader *) getFontTable(gposTableTag); + static const le_uint32 gdefTableTag = LE_GDEF_TABLE_TAG; + static const le_uint32 gposTableTag = LE_GPOS_TABLE_TAG; + const GlyphPositioningTableHeader *gposTable = (const GlyphPositioningTableHeader *) getFontTable(gposTableTag); setScriptAndLanguageTags(); + + fGDEFTable = (const GlyphDefinitionTableHeader *) getFontTable(gdefTableTag); + + if (gposTable != NULL && gposTable->coversScriptAndLanguage(fScriptTag, fLangSysTag)) { + fGPOSTable = gposTable; + } } void OpenTypeLayoutEngine::reset() @@ -45,19 +62,10 @@ void OpenTypeLayoutEngine::reset() // will have been called already by // LayoutEngine::~LayoutEngine() LayoutEngine::reset(); - - // The double call could be avoided by - // puting the following into a private - // method that's called from here and - // from our destructor - if (fFeatureTags != NULL) { - LE_DELETE_ARRAY(fFeatureTags); - fFeatureTags = NULL; - } } OpenTypeLayoutEngine::OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode) - : LayoutEngine(fontInstance, scriptCode, languageCode), fFeatureTags(NULL), fFeatureOrder(NULL), + : LayoutEngine(fontInstance, scriptCode, languageCode), fFeatureOrder(NULL), fGSUBTable(NULL), fGDEFTable(NULL), fGPOSTable(NULL), fSubstitutionFilter(NULL) { setScriptAndLanguageTags(); @@ -92,10 +100,38 @@ void OpenTypeLayoutEngine::setScriptAndLanguageTags() fLangSysTag = getLangSysTag(fLanguageCode); } +le_int32 OpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return 0; + } + + if (offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + le_int32 outCharCount = LayoutEngine::characterProcessing(chars, offset, count, max, rightToLeft, outChars, glyphStorage, success); + + if (LE_FAILURE(success)) { + return 0; + } + + glyphStorage.allocateGlyphArray(outCharCount, rightToLeft, success); + glyphStorage.allocateAuxData(success); + + for (le_int32 i = 0; i < outCharCount; i += 1) { + glyphStorage.setAuxData(i, (void *) fFeatureList, success); + } + + return outCharCount; +} + // Input: characters, tags // Output: glyphs, char indices -le_int32 OpenTypeLayoutEngine::glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, const LETag **featureTags, - LEGlyphID *&glyphs, le_int32 *&charIndices, LEErrorCode &success) +le_int32 OpenTypeLayoutEngine::glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEGlyphStorage &glyphStorage, LEErrorCode &success) { if (LE_FAILURE(success)) { return 0; @@ -106,24 +142,37 @@ le_int32 OpenTypeLayoutEngine::glyphProcessing(const LEUnicode chars[], le_int32 return 0; } - mapCharsToGlyphs(chars, offset, count, rightToLeft, rightToLeft, glyphs, charIndices, success); + mapCharsToGlyphs(chars, offset, count, rightToLeft, rightToLeft, glyphStorage, success); if (LE_FAILURE(success)) { return 0; } if (fGSUBTable != NULL) { - fGSUBTable->process(glyphs, featureTags, count, rightToLeft, fScriptTag, fLangSysTag, fGDEFTable, fSubstitutionFilter, fFeatureOrder); + count = fGSUBTable->process(glyphStorage, rightToLeft, fScriptTag, fLangSysTag, fGDEFTable, fSubstitutionFilter, fFeatureOrder); } return count; } -le_int32 OpenTypeLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphID *&glyphs, le_int32 *&charIndices, LEErrorCode &success) +le_int32 OpenTypeLayoutEngine::glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return 0; + } + + glyphStorage.adoptGlyphArray(tempGlyphStorage); + glyphStorage.adoptCharIndicesArray(tempGlyphStorage); + glyphStorage.adoptAuxDataArray(tempGlyphStorage); + glyphStorage.adoptGlyphCount(tempGlyphStorage); + + return glyphStorage.getGlyphCount(); +} + +le_int32 OpenTypeLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success) { LEUnicode *outChars = NULL; - LEGlyphID *fakeGlyphs = NULL; - le_int32 *tempCharIndices = NULL; + LEGlyphStorage fakeGlyphStorage; le_int32 outCharCount, outGlyphCount, fakeGlyphCount; if (LE_FAILURE(success)) { @@ -135,48 +184,39 @@ le_int32 OpenTypeLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 o return 0; } - outCharCount = characterProcessing(chars, offset, count, max, rightToLeft, outChars, tempCharIndices, fFeatureTags, success); + outCharCount = characterProcessing(chars, offset, count, max, rightToLeft, outChars, fakeGlyphStorage, success); if (outChars != NULL) { - fakeGlyphCount = glyphProcessing(outChars, 0, outCharCount, outCharCount, rightToLeft, fFeatureTags, fakeGlyphs, tempCharIndices, success); + fakeGlyphCount = glyphProcessing(outChars, 0, outCharCount, outCharCount, rightToLeft, fakeGlyphStorage, success); + LE_DELETE_ARRAY(outChars); // FIXME: a subclass may have allocated this, in which case this delete might not work... //adjustGlyphs(outChars, 0, outCharCount, rightToLeft, fakeGlyphs, fakeGlyphCount); } else { - fakeGlyphCount = glyphProcessing(chars, offset, count, max, rightToLeft, fFeatureTags, fakeGlyphs, tempCharIndices, success); + fakeGlyphCount = glyphProcessing(chars, offset, count, max, rightToLeft, fakeGlyphStorage, success); //adjustGlyphs(chars, offset, count, rightToLeft, fakeGlyphs, fakeGlyphCount); } - outGlyphCount = glyphPostProcessing(fakeGlyphs, tempCharIndices, fakeGlyphCount, glyphs, charIndices, success); - - if (outChars != chars) { - LE_DELETE_ARRAY(outChars); - } - - if (fakeGlyphs != glyphs) { - LE_DELETE_ARRAY(fakeGlyphs); - } - - if (tempCharIndices != charIndices) { - LE_DELETE_ARRAY(tempCharIndices); - } + outGlyphCount = glyphPostProcessing(fakeGlyphStorage, glyphStorage, success); return outGlyphCount; } // apply GPOS table, if any void OpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, - LEGlyphID glyphs[], le_int32 glyphCount, float positions[], LEErrorCode &success) + LEGlyphStorage &glyphStorage, LEErrorCode &success) { if (LE_FAILURE(success)) { return; } - if (chars == NULL || glyphs == NULL || positions == NULL || offset < 0 || count < 0) { + if (chars == NULL || offset < 0 || count < 0) { success = LE_ILLEGAL_ARGUMENT_ERROR; return; } + le_int32 glyphCount = glyphStorage.getGlyphCount(); + if (glyphCount > 0 && fGPOSTable != NULL) { - GlyphPositionAdjustment *adjustments = LE_NEW_ARRAY(GlyphPositionAdjustment, glyphCount); + GlyphPositionAdjustment *adjustments = new GlyphPositionAdjustment[glyphCount]; le_int32 i; if (adjustments == NULL) { @@ -184,6 +224,9 @@ void OpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int3 return; } +#if 0 + // Don't need to do this if we allocate + // the adjustments array w/ new... for (i = 0; i < glyphCount; i += 1) { adjustments[i].setXPlacement(0); adjustments[i].setYPlacement(0); @@ -193,8 +236,9 @@ void OpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int3 adjustments[i].setBaseOffset(-1); } +#endif - fGPOSTable->process(glyphs, adjustments, fFeatureTags, glyphCount, reverse, fScriptTag, fLangSysTag, fGDEFTable, fFontInstance, fFeatureOrder); + fGPOSTable->process(glyphStorage, adjustments, reverse, fScriptTag, fLangSysTag, fGDEFTable, fFontInstance, fFeatureOrder); float xAdjust = 0, yAdjust = 0; @@ -217,21 +261,24 @@ void OpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int3 yPlacement += adjustments[base].getYPlacement(); } - positions[i*2] += xAdjust + fFontInstance->xUnitsToPoints(xPlacement); - positions[i*2+1] -= yAdjust + fFontInstance->yUnitsToPoints(yPlacement); + xPlacement = fFontInstance->xUnitsToPoints(xPlacement); + yPlacement = fFontInstance->yUnitsToPoints(yPlacement); + glyphStorage.adjustPosition(i, xAdjust + xPlacement, -(yAdjust + yPlacement), success); xAdjust += fFontInstance->xUnitsToPoints(xAdvance); yAdjust += fFontInstance->yUnitsToPoints(yAdvance); } - positions[glyphCount*2] += xAdjust; - positions[glyphCount*2+1] -= yAdjust; + glyphStorage.adjustPosition(glyphCount, xAdjust, -yAdjust, success); - LE_DELETE_ARRAY(adjustments); + delete[] adjustments; } +#if 0 + // Don't know why this is here... LE_DELETE_ARRAY(fFeatureTags); fFeatureTags = NULL; +#endif } U_NAMESPACE_END diff --git a/icuSources/layout/OpenTypeLayoutEngine.h b/icuSources/layout/OpenTypeLayoutEngine.h index de237baa..61cf1317 100644 --- a/icuSources/layout/OpenTypeLayoutEngine.h +++ b/icuSources/layout/OpenTypeLayoutEngine.h @@ -2,7 +2,7 @@ /* * %W% %E% * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -113,16 +113,16 @@ public: /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } + static UClassID getStaticClassID(); private: @@ -142,21 +142,14 @@ private: */ static const LETag languageTags[]; - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; - protected: /** - * An array of pointers to four byte feature tags. - * Each pointer points to a list of tags, terminated - * by a special empty tag. + * A list of "default" features. The default characterProcessing method + * will apply all of these tags to every glyph. * * @internal */ - const LETag **fFeatureTags; + const LETag *fFeatureList; /** * A list of tags in the order in which the features in @@ -215,7 +208,7 @@ protected: /** * This method does the OpenType character processing. It assigns the OpenType feature * tags to the characters, and may generate output characters that differ from the input - * charcters dueto insertions, deletions, or reorderings. In such cases, it will also + * charcters due to insertions, deletions, or reorderings. In such cases, it will also * generate an output character index array reflecting these changes. * * Subclasses must override this method. @@ -225,7 +218,7 @@ protected: * @param offset - the index of the first character to process * @param count - the number of characters to process * @param max - the number of characters in the input context - * @param rightToLeft - true if the characters are in a right to left directional run + * @param rightToLeft - TRUE if the characters are in a right to left directional run * * Output parameters: * @param outChars - the output character array, if different from the input @@ -238,19 +231,7 @@ protected: * @internal */ virtual le_int32 characterProcessing(const LEUnicode /*chars*/[], le_int32 offset, le_int32 count, le_int32 max, le_bool /*rightToLeft*/, - LEUnicode *&/*outChars*/, le_int32 *&/*charIndices*/, const LETag **&/*featureTags*/, LEErrorCode &success) /*= 0;*/ - { - if (LE_FAILURE(success)) { - return 0; - } - - if (offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - return count; - }; + LEUnicode *&/*outChars*/, LEGlyphStorage &glyphStorage, LEErrorCode &success); /** * This method does character to glyph mapping, and applies the GSUB table. The @@ -266,7 +247,7 @@ protected: * @param offset - the index of the first character to process * @param count - the number of characters to process * @param max - the number of characters in the input context - * @param rightToLeft - true if the characters are in a right to left directional run + * @param rightToLeft - TRUE if the characters are in a right to left directional run * @param featureTags - the feature tag array * * Output parameters: @@ -282,7 +263,7 @@ protected: * @internal */ virtual le_int32 glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - const LETag **featureTags, LEGlyphID *&glyphs, le_int32 *&charIndices, LEErrorCode &success); + LEGlyphStorage &glyphStorage, LEErrorCode &success); /** * This method does any processing necessary to convert "fake" @@ -309,18 +290,7 @@ protected: * * @internal */ - virtual le_int32 glyphPostProcessing(LEGlyphID tempGlyphs[], le_int32 tempCharIndices[], le_int32 tempGlyphCount, - LEGlyphID *&glyphs, le_int32 *&charIndices, LEErrorCode &success) - { - if (LE_FAILURE(success)) { - return 0; - } - - glyphs = tempGlyphs; - charIndices = tempCharIndices; - - return tempGlyphCount; - }; + virtual le_int32 glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success); /** * This method applies the characterProcessing, glyphProcessing and glyphPostProcessing @@ -331,7 +301,7 @@ protected: * @param offset - the index of the first character to process * @param count - the number of characters to process * @param max - the number of characters in the input context - * @param rightToLeft - true if the text is in a right to left directional run + * @param rightToLeft - TRUE if the text is in a right to left directional run * * Output parameters: * @param glyphs - the glyph index array @@ -344,7 +314,7 @@ protected: * * @internal */ - virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphID *&glyphs, le_int32 *&charIndices, LEErrorCode &success); + virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success); /** * This method uses the GPOS table, if there is one, to adjust the glyph positions. @@ -361,7 +331,7 @@ protected: * * @internal */ - virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphID glyphs[], le_int32 glyphCount, float positions[], LEErrorCode &success); + virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success); /** * This method frees the feature tag array so that the diff --git a/icuSources/layout/OpenTypeTables.h b/icuSources/layout/OpenTypeTables.h index ea58b7f8..c94a5cbd 100644 --- a/icuSources/layout/OpenTypeTables.h +++ b/icuSources/layout/OpenTypeTables.h @@ -1,7 +1,6 @@ /* - * @(#)OpenTypeTables.h 1.7 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/OpenTypeUtilities.cpp b/icuSources/layout/OpenTypeUtilities.cpp index 8a3cd2c1..f6d657e5 100644 --- a/icuSources/layout/OpenTypeUtilities.cpp +++ b/icuSources/layout/OpenTypeUtilities.cpp @@ -1,7 +1,6 @@ /* - * @(#)OpenTypeUtilities.cpp 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/OpenTypeUtilities.h b/icuSources/layout/OpenTypeUtilities.h index 9c20883e..67a07c32 100644 --- a/icuSources/layout/OpenTypeUtilities.h +++ b/icuSources/layout/OpenTypeUtilities.h @@ -1,7 +1,6 @@ /* - * @(#)OpenTypeUtilities.h 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/PairPositioningSubtables.cpp b/icuSources/layout/PairPositioningSubtables.cpp index 1aa8a772..7b31ac86 100644 --- a/icuSources/layout/PairPositioningSubtables.cpp +++ b/icuSources/layout/PairPositioningSubtables.cpp @@ -1,7 +1,6 @@ /* - * @(#)PairPositioningSubtables.cpp 1.7 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -53,12 +52,16 @@ le_uint32 PairPositioningFormat1Subtable::process(GlyphIterator *glyphIterator, if (coverageIndex >= 0 && glyphIterator->next()) { Offset pairSetTableOffset = SWAPW(pairSetTableOffsetArray[coverageIndex]); PairSetTable *pairSetTable = (PairSetTable *) ((char *) this + pairSetTableOffset); + le_uint16 pairValueCount = SWAPW(pairSetTable->pairValueCount); le_int16 valueRecord1Size = ValueRecord::getSize(SWAPW(valueFormat1)); le_int16 valueRecord2Size = ValueRecord::getSize(SWAPW(valueFormat2)); le_int16 recordSize = sizeof(PairValueRecord) - sizeof(ValueRecord) + valueRecord1Size + valueRecord2Size; LEGlyphID secondGlyph = glyphIterator->getCurrGlyphID(); - const PairValueRecord *pairValueRecord = - findPairValueRecord((TTGlyphID) LE_GET_GLYPH(secondGlyph), pairSetTable->pairValueRecordArray, SWAPW(pairSetTable->pairValueCount), recordSize); + const PairValueRecord *pairValueRecord = NULL; + + if (pairValueCount != 0) { + pairValueRecord = findPairValueRecord((TTGlyphID) LE_GET_GLYPH(secondGlyph), pairSetTable->pairValueRecordArray, pairValueCount, recordSize); + } if (pairValueRecord == NULL) { return 0; diff --git a/icuSources/layout/PairPositioningSubtables.h b/icuSources/layout/PairPositioningSubtables.h index 19b12ddd..f017c33f 100644 --- a/icuSources/layout/PairPositioningSubtables.h +++ b/icuSources/layout/PairPositioningSubtables.h @@ -1,7 +1,6 @@ /* - * @(#)PairPositioningSubtables.h 1.7 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/ScriptAndLanguage.h b/icuSources/layout/ScriptAndLanguage.h index 2c5a448d..804dae96 100644 --- a/icuSources/layout/ScriptAndLanguage.h +++ b/icuSources/layout/ScriptAndLanguage.h @@ -1,7 +1,6 @@ /* - * @(#)ScriptAndLanguage.h 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -34,7 +33,7 @@ struct ScriptTable le_uint16 langSysCount; LangSysRecord langSysRecordArray[ANY_NUMBER]; - const LangSysTable *findLanguage(LETag languageTag, le_bool exactMatch = false) const; + const LangSysTable *findLanguage(LETag languageTag, le_bool exactMatch = FALSE) const; }; typedef TagAndOffsetRecord ScriptRecord; @@ -45,7 +44,7 @@ struct ScriptListTable ScriptRecord scriptRecordArray[ANY_NUMBER]; const ScriptTable *findScript(LETag scriptTag) const; - const LangSysTable *findLanguage(LETag scriptTag, LETag languageTag, le_bool exactMatch = false) const; + const LangSysTable *findLanguage(LETag scriptTag, LETag languageTag, le_bool exactMatch = FALSE) const; }; U_NAMESPACE_END diff --git a/icuSources/layout/ScriptAndLanguageTags.cpp b/icuSources/layout/ScriptAndLanguageTags.cpp index 4b0f6c9f..ddbce262 100644 --- a/icuSources/layout/ScriptAndLanguageTags.cpp +++ b/icuSources/layout/ScriptAndLanguageTags.cpp @@ -1,13 +1,9 @@ /* * - * (C) Copyright IBM Corp. 1998-2003. All Rights Reserved. + * (C) Copyright IBM Corp. 1998-2004. All Rights Reserved. * * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS * YOU REALLY KNOW WHAT YOU'RE DOING. - * - * $Source: /cvs/root/ICU/icuSources/layout/ScriptAndLanguageTags.cpp,v $ - * $Date: 2003/07/03 18:13:46 $ - * $Revision: 1.1.1.2 $ */ #include "LETypes.h" @@ -70,7 +66,8 @@ const LETag OpenTypeLayoutEngine::scriptTags[] = { osmaScriptTag, /* 'osma' (OSMANYA) */ shawScriptTag, /* 'shaw' (SHAVIAN) */ taleScriptTag, /* 'tale' (TAI_LE) */ - ugarScriptTag /* 'ugar' (UGARITIC) */ + ugarScriptTag, /* 'ugar' (UGARITIC) */ + hrktScriptTag /* 'hrkt' (KATAKANA_OR_HIRAGANA) */ }; const LETag OpenTypeLayoutEngine::languageTags[] = { diff --git a/icuSources/layout/ScriptAndLanguageTags.h b/icuSources/layout/ScriptAndLanguageTags.h index dc226fa0..b61783a5 100644 --- a/icuSources/layout/ScriptAndLanguageTags.h +++ b/icuSources/layout/ScriptAndLanguageTags.h @@ -1,27 +1,23 @@ /* * - * (C) Copyright IBM Corp. 1998-2003. All Rights Reserved. + * (C) Copyright IBM Corp. 1998-2004. All Rights Reserved. * * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS * YOU REALLY KNOW WHAT YOU'RE DOING. - * - * $Source: /cvs/root/ICU/icuSources/layout/ScriptAndLanguageTags.h,v $ - * $Date: 2003/07/03 18:13:46 $ - * $Revision: 1.1.1.2 $ */ #ifndef __SCRIPTANDLANGUAGES_H #define __SCRIPTANDLANGUAGES_H +#include "LETypes.h" + +U_NAMESPACE_BEGIN + /** * \file * \internal */ -#include "LETypes.h" - -U_NAMESPACE_BEGIN - const LETag zyyyScriptTag = 0x7A797979; /* 'zyyy' (COMMON) */ const LETag qaaiScriptTag = 0x71616169; /* 'qaai' (INHERITED) */ const LETag arabScriptTag = 0x61726162; /* 'arab' (ARABIC) */ @@ -76,6 +72,7 @@ const LETag osmaScriptTag = 0x6F736D61; /* 'osma' (OSMANYA) */ const LETag shawScriptTag = 0x73686177; /* 'shaw' (SHAVIAN) */ const LETag taleScriptTag = 0x74616C65; /* 'tale' (TAI_LE) */ const LETag ugarScriptTag = 0x75676172; /* 'ugar' (UGARITIC) */ +const LETag hrktScriptTag = 0x68726B74; /* 'hrkt' (KATAKANA_OR_HIRAGANA) */ const LETag nullScriptTag = 0x00000000; /* '' (NULL) */ diff --git a/icuSources/layout/SegmentArrayProcessor.cpp b/icuSources/layout/SegmentArrayProcessor.cpp index 67eaf626..b915cb9b 100644 --- a/icuSources/layout/SegmentArrayProcessor.cpp +++ b/icuSources/layout/SegmentArrayProcessor.cpp @@ -1,7 +1,6 @@ /* - * @(#)SegmentArrayProcessor.cpp 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -11,11 +10,12 @@ #include "NonContextualGlyphSubst.h" #include "NonContextualGlyphSubstProc.h" #include "SegmentArrayProcessor.h" +#include "LEGlyphStorage.h" #include "LESwaps.h" U_NAMESPACE_BEGIN -const char SegmentArrayProcessor::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SegmentArrayProcessor) SegmentArrayProcessor::SegmentArrayProcessor() { @@ -33,23 +33,25 @@ SegmentArrayProcessor::~SegmentArrayProcessor() { } -void SegmentArrayProcessor::process(LEGlyphID *glyphs, le_int32 * /*charIndices*/, le_int32 glyphCount) +void SegmentArrayProcessor::process(LEGlyphStorage &glyphStorage) { const LookupSegment *segments = segmentArrayLookupTable->segments; + le_int32 glyphCount = glyphStorage.getGlyphCount(); le_int32 glyph; for (glyph = 0; glyph < glyphCount; glyph += 1) { - const LookupSegment *lookupSegment = segmentArrayLookupTable->lookupSegment(segments, glyphs[glyph]); + LEGlyphID thisGlyph = glyphStorage[glyph]; + const LookupSegment *lookupSegment = segmentArrayLookupTable->lookupSegment(segments, thisGlyph); if (lookupSegment != NULL) { TTGlyphID firstGlyph = SWAPW(lookupSegment->firstGlyph); le_int16 offset = SWAPW(lookupSegment->value); if (offset != 0) { - TTGlyphID *glyphArray = (TTGlyphID *) ((char *) subtableHeader + offset); - TTGlyphID newGlyph = SWAPW(glyphArray[LE_GET_GLYPH(glyphs[glyph]) - firstGlyph]); + TTGlyphID *glyphArray = (TTGlyphID *) ((char *) subtableHeader + offset); + TTGlyphID newGlyph = SWAPW(glyphArray[LE_GET_GLYPH(thisGlyph) - firstGlyph]); - glyphs[glyph] = LE_SET_GLYPH(glyphs[glyph], newGlyph); + glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph); } } } diff --git a/icuSources/layout/SegmentArrayProcessor.h b/icuSources/layout/SegmentArrayProcessor.h index 53b96a8a..7e2028c9 100644 --- a/icuSources/layout/SegmentArrayProcessor.h +++ b/icuSources/layout/SegmentArrayProcessor.h @@ -1,7 +1,6 @@ /* - * @(#)SegmentArrayProcessor.h 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -21,10 +20,12 @@ U_NAMESPACE_BEGIN +class LEGlyphStorage; + class SegmentArrayProcessor : public NonContextualGlyphSubstitutionProcessor { public: - virtual void process(LEGlyphID *glyphs, le_int32 *charIndices, le_int32 glyph); + virtual void process(LEGlyphStorage &glyphStorage); SegmentArrayProcessor(const MorphSubtableHeader *morphSubtableHeader); @@ -33,16 +34,16 @@ public: /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } + static UClassID getStaticClassID(); private: SegmentArrayProcessor(); @@ -50,13 +51,6 @@ private: protected: const SegmentArrayLookupTable *segmentArrayLookupTable; -private: - - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; U_NAMESPACE_END diff --git a/icuSources/layout/SegmentSingleProcessor.cpp b/icuSources/layout/SegmentSingleProcessor.cpp index 6c190363..75e33eb0 100644 --- a/icuSources/layout/SegmentSingleProcessor.cpp +++ b/icuSources/layout/SegmentSingleProcessor.cpp @@ -1,7 +1,6 @@ /* - * @(#)SegmentSingleProcessor.cpp 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -11,11 +10,12 @@ #include "NonContextualGlyphSubst.h" #include "NonContextualGlyphSubstProc.h" #include "SegmentSingleProcessor.h" +#include "LEGlyphStorage.h" #include "LESwaps.h" U_NAMESPACE_BEGIN -const char SegmentSingleProcessor::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SegmentSingleProcessor) SegmentSingleProcessor::SegmentSingleProcessor() { @@ -33,18 +33,20 @@ SegmentSingleProcessor::~SegmentSingleProcessor() { } -void SegmentSingleProcessor::process(LEGlyphID *glyphs, le_int32 * /*charIndices*/, le_int32 glyphCount) +void SegmentSingleProcessor::process(LEGlyphStorage &glyphStorage) { const LookupSegment *segments = segmentSingleLookupTable->segments; + le_int32 glyphCount = glyphStorage.getGlyphCount(); le_int32 glyph; for (glyph = 0; glyph < glyphCount; glyph += 1) { - const LookupSegment *lookupSegment = segmentSingleLookupTable->lookupSegment(segments, glyphs[glyph]); + LEGlyphID thisGlyph = glyphStorage[glyph]; + const LookupSegment *lookupSegment = segmentSingleLookupTable->lookupSegment(segments, thisGlyph); if (lookupSegment != NULL) { - TTGlyphID newGlyph = (TTGlyphID) LE_GET_GLYPH(glyphs[glyph]) + SWAPW(lookupSegment->value); + TTGlyphID newGlyph = (TTGlyphID) LE_GET_GLYPH(thisGlyph) + SWAPW(lookupSegment->value); - glyphs[glyph] = LE_SET_GLYPH(glyphs[glyph], newGlyph); + glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph); } } } diff --git a/icuSources/layout/SegmentSingleProcessor.h b/icuSources/layout/SegmentSingleProcessor.h index 598c45ac..64b2b72f 100644 --- a/icuSources/layout/SegmentSingleProcessor.h +++ b/icuSources/layout/SegmentSingleProcessor.h @@ -1,7 +1,6 @@ /* - * @(#)SegmentSingleProcessor.h 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -21,10 +20,12 @@ U_NAMESPACE_BEGIN +class LEGlyphStorage; + class SegmentSingleProcessor : public NonContextualGlyphSubstitutionProcessor { public: - virtual void process(LEGlyphID *glyphs, le_int32 *charIndices, le_int32 glyphCount); + virtual void process(LEGlyphStorage &glyphStorage); SegmentSingleProcessor(const MorphSubtableHeader *morphSubtableHeader); @@ -33,16 +34,16 @@ public: /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } + static UClassID getStaticClassID(); private: SegmentSingleProcessor(); @@ -50,13 +51,6 @@ private: protected: const SegmentSingleLookupTable *segmentSingleLookupTable; -private: - - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; U_NAMESPACE_END diff --git a/icuSources/layout/SimpleArrayProcessor.cpp b/icuSources/layout/SimpleArrayProcessor.cpp index 3220ab82..d677f545 100644 --- a/icuSources/layout/SimpleArrayProcessor.cpp +++ b/icuSources/layout/SimpleArrayProcessor.cpp @@ -1,7 +1,6 @@ /* - * @(#)SimpleArrayProcessor.cpp 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -11,11 +10,12 @@ #include "NonContextualGlyphSubst.h" #include "NonContextualGlyphSubstProc.h" #include "SimpleArrayProcessor.h" +#include "LEGlyphStorage.h" #include "LESwaps.h" U_NAMESPACE_BEGIN -const char SimpleArrayProcessor::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SimpleArrayProcessor) SimpleArrayProcessor::SimpleArrayProcessor() { @@ -33,15 +33,17 @@ SimpleArrayProcessor::~SimpleArrayProcessor() { } -void SimpleArrayProcessor::process(LEGlyphID *glyphs, le_int32 * /*charIndices*/, le_int32 glyphCount) +void SimpleArrayProcessor::process(LEGlyphStorage &glyphStorage) { + le_int32 glyphCount = glyphStorage.getGlyphCount(); le_int32 glyph; for (glyph = 0; glyph < glyphCount; glyph += 1) { - if (glyphs[glyph] < 0xFFFF) { - le_int16 newGlyph = SWAPW(simpleArrayLookupTable->valueArray[glyphs[glyph]]); + LEGlyphID thisGlyph = glyphStorage[glyph]; + if (LE_GET_GLYPH(thisGlyph) < 0xFFFF) { + TTGlyphID newGlyph = SWAPW(simpleArrayLookupTable->valueArray[LE_GET_GLYPH(thisGlyph)]); - glyphs[glyph] = LE_SET_GLYPH(glyphs[glyph], newGlyph); + glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph); } } } diff --git a/icuSources/layout/SimpleArrayProcessor.h b/icuSources/layout/SimpleArrayProcessor.h index ea2dfb58..afee79c4 100644 --- a/icuSources/layout/SimpleArrayProcessor.h +++ b/icuSources/layout/SimpleArrayProcessor.h @@ -1,7 +1,6 @@ /* - * @(#)SimpleArrayProcessor.h 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -21,10 +20,12 @@ U_NAMESPACE_BEGIN +class LEGlyphStorage; + class SimpleArrayProcessor : public NonContextualGlyphSubstitutionProcessor { public: - virtual void process(LEGlyphID *glyphs, le_int32 *charIndices, le_int32 glyphCount); + virtual void process(LEGlyphStorage &glyphStorage); SimpleArrayProcessor(const MorphSubtableHeader *morphSubtableHeader); @@ -33,16 +34,16 @@ public: /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } + static UClassID getStaticClassID(); private: SimpleArrayProcessor(); @@ -50,13 +51,6 @@ private: protected: const SimpleArrayLookupTable *simpleArrayLookupTable; -private: - - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; U_NAMESPACE_END diff --git a/icuSources/layout/SinglePositioningSubtables.cpp b/icuSources/layout/SinglePositioningSubtables.cpp index 115c43dc..42b6b44a 100644 --- a/icuSources/layout/SinglePositioningSubtables.cpp +++ b/icuSources/layout/SinglePositioningSubtables.cpp @@ -1,7 +1,6 @@ /* - * @(#)SinglePositioningSubtables.cpp 1.8 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/SinglePositioningSubtables.h b/icuSources/layout/SinglePositioningSubtables.h index 212e32bd..ec2ffcc9 100644 --- a/icuSources/layout/SinglePositioningSubtables.h +++ b/icuSources/layout/SinglePositioningSubtables.h @@ -1,7 +1,6 @@ /* - * @(#)SinglePositioningSubtables.h 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/SingleSubstitutionSubtables.cpp b/icuSources/layout/SingleSubstitutionSubtables.cpp index 338c2a73..ae72ddfd 100644 --- a/icuSources/layout/SingleSubstitutionSubtables.cpp +++ b/icuSources/layout/SingleSubstitutionSubtables.cpp @@ -1,7 +1,6 @@ /* - * @(#)SingleSubstitutionSubtables.cpp 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/SingleSubstitutionSubtables.h b/icuSources/layout/SingleSubstitutionSubtables.h index b426340e..dfd2dad8 100644 --- a/icuSources/layout/SingleSubstitutionSubtables.h +++ b/icuSources/layout/SingleSubstitutionSubtables.h @@ -1,7 +1,6 @@ /* - * @(#)SingleSubstitutionSubtables.h 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/SingleTableProcessor.cpp b/icuSources/layout/SingleTableProcessor.cpp index 9af991e3..94a4edd7 100644 --- a/icuSources/layout/SingleTableProcessor.cpp +++ b/icuSources/layout/SingleTableProcessor.cpp @@ -1,7 +1,6 @@ /* - * @(#)SingleTableProcessor.cpp 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -11,11 +10,12 @@ #include "NonContextualGlyphSubst.h" #include "NonContextualGlyphSubstProc.h" #include "SingleTableProcessor.h" +#include "LEGlyphStorage.h" #include "LESwaps.h" U_NAMESPACE_BEGIN -const char SingleTableProcessor::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SingleTableProcessor) SingleTableProcessor::SingleTableProcessor() { @@ -33,16 +33,17 @@ SingleTableProcessor::~SingleTableProcessor() { } -void SingleTableProcessor::process(LEGlyphID *glyphs, le_int32 * /*charIndices*/, le_int32 glyphCount) +void SingleTableProcessor::process(LEGlyphStorage &glyphStorage) { const LookupSingle *entries = singleTableLookupTable->entries; le_int32 glyph; + le_int32 glyphCount = glyphStorage.getGlyphCount(); for (glyph = 0; glyph < glyphCount; glyph += 1) { - const LookupSingle *lookupSingle = singleTableLookupTable->lookupSingle(entries, glyphs[glyph]); + const LookupSingle *lookupSingle = singleTableLookupTable->lookupSingle(entries, glyphStorage[glyph]); if (lookupSingle != NULL) { - glyphs[glyph] = SWAPW(lookupSingle->value); + glyphStorage[glyph] = SWAPW(lookupSingle->value); } } } diff --git a/icuSources/layout/SingleTableProcessor.h b/icuSources/layout/SingleTableProcessor.h index b6fa5ffe..d6ca048b 100644 --- a/icuSources/layout/SingleTableProcessor.h +++ b/icuSources/layout/SingleTableProcessor.h @@ -1,7 +1,6 @@ /* - * @(#)SingleTableProcessor.h 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -21,10 +20,12 @@ U_NAMESPACE_BEGIN +class LEGlyphStorage; + class SingleTableProcessor : public NonContextualGlyphSubstitutionProcessor { public: - virtual void process(LEGlyphID *glyphs, le_int32 *charIndices, le_int32 glyphCount); + virtual void process(LEGlyphStorage &glyphStorage); SingleTableProcessor(const MorphSubtableHeader *morphSubtableHeader); @@ -33,16 +34,16 @@ public: /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } + static UClassID getStaticClassID(); private: SingleTableProcessor(); @@ -50,13 +51,6 @@ private: protected: const SingleTableLookupTable *singleTableLookupTable; -private: - - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; U_NAMESPACE_END diff --git a/icuSources/layout/StateTableProcessor.cpp b/icuSources/layout/StateTableProcessor.cpp index 237c263a..223959b8 100644 --- a/icuSources/layout/StateTableProcessor.cpp +++ b/icuSources/layout/StateTableProcessor.cpp @@ -1,7 +1,6 @@ /* - * @(#)StateTableProcessor.cpp 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -11,6 +10,7 @@ #include "MorphStateTables.h" #include "SubtableProcessor.h" #include "StateTableProcessor.h" +#include "LEGlyphStorage.h" #include "LESwaps.h" U_NAMESPACE_BEGIN @@ -38,7 +38,7 @@ StateTableProcessor::~StateTableProcessor() { } -void StateTableProcessor::process(LEGlyphID *glyphs, le_int32 *charIndices, le_int32 glyphCount) +void StateTableProcessor::process(LEGlyphStorage &glyphStorage) { // Start at state 0 // XXX: How do we know when to start at state 1? @@ -46,6 +46,7 @@ void StateTableProcessor::process(LEGlyphID *glyphs, le_int32 *charIndices, le_i // XXX: reverse? le_int32 currGlyph = 0; + le_int32 glyphCount = glyphStorage.getGlyphCount(); beginStateTable(); @@ -55,7 +56,7 @@ void StateTableProcessor::process(LEGlyphID *glyphs, le_int32 *charIndices, le_i // XXX: How do we handle EOT vs. EOL? classCode = classCodeEOT; } else { - TTGlyphID glyphCode = (TTGlyphID) LE_GET_GLYPH(glyphs[currGlyph]); + TTGlyphID glyphCode = (TTGlyphID) LE_GET_GLYPH(glyphStorage[currGlyph]); if (glyphCode == 0xFFFF) { classCode = classCodeDEL; @@ -67,7 +68,7 @@ void StateTableProcessor::process(LEGlyphID *glyphs, le_int32 *charIndices, le_i const EntryTableIndex *stateArray = (const EntryTableIndex *) ((char *) &stateTableHeader->stHeader + currentState); EntryTableIndex entryTableIndex = stateArray[(le_uint8)classCode]; - currentState = processStateEntry(glyphs, charIndices, currGlyph, glyphCount, entryTableIndex); + currentState = processStateEntry(glyphStorage, currGlyph, entryTableIndex); } endStateTable(); diff --git a/icuSources/layout/StateTableProcessor.h b/icuSources/layout/StateTableProcessor.h index 19212d38..41c50deb 100644 --- a/icuSources/layout/StateTableProcessor.h +++ b/icuSources/layout/StateTableProcessor.h @@ -1,7 +1,6 @@ /* - * @(#)StateTableProcessor.h 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -20,15 +19,16 @@ U_NAMESPACE_BEGIN +class LEGlyphStorage; + class StateTableProcessor : public SubtableProcessor { public: - void process(LEGlyphID *glyphs, le_int32 *charIndices, le_int32 glyph); + void process(LEGlyphStorage &glyphStorage); virtual void beginStateTable() = 0; - virtual ByteOffset processStateEntry(LEGlyphID *glyphs, le_int32 *charIndices, le_int32 &currGlyph, - le_int32 glyphCount, EntryTableIndex index) = 0; + virtual ByteOffset processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index) = 0; virtual void endStateTable() = 0; diff --git a/icuSources/layout/StateTables.h b/icuSources/layout/StateTables.h index 4dd4974c..8b5f8677 100644 --- a/icuSources/layout/StateTables.h +++ b/icuSources/layout/StateTables.h @@ -1,7 +1,6 @@ /* - * @(#)StateTables.h 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/SubstitutionLookups.cpp b/icuSources/layout/SubstitutionLookups.cpp index 318e0020..fa6771ac 100644 --- a/icuSources/layout/SubstitutionLookups.cpp +++ b/icuSources/layout/SubstitutionLookups.cpp @@ -1,7 +1,6 @@ /* - * @(#)SubstitutionLookups.cpp 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998, 1999, 2000 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/SubstitutionLookups.h b/icuSources/layout/SubstitutionLookups.h index 69b12224..33658506 100644 --- a/icuSources/layout/SubstitutionLookups.h +++ b/icuSources/layout/SubstitutionLookups.h @@ -1,7 +1,6 @@ /* - * @(#)SubstitutionLookups.h 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/SubtableProcessor.cpp b/icuSources/layout/SubtableProcessor.cpp index 647e95f8..dd5ce187 100644 --- a/icuSources/layout/SubtableProcessor.cpp +++ b/icuSources/layout/SubtableProcessor.cpp @@ -1,7 +1,6 @@ /* - * @(#)SubtableProcessor.cpp 1.5 00/03/15 * - * (C) Copyright IBM Corp. 1998, 1999, 2000, 2001 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/SubtableProcessor.h b/icuSources/layout/SubtableProcessor.h index 7af9c16a..f304cb95 100644 --- a/icuSources/layout/SubtableProcessor.h +++ b/icuSources/layout/SubtableProcessor.h @@ -1,7 +1,6 @@ /* - * @(#)SubtableProcessor.h 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -18,9 +17,11 @@ U_NAMESPACE_BEGIN +class LEGlyphStorage; + class SubtableProcessor : public UMemory { public: - virtual void process(LEGlyphID *glyphs, le_int32 *charIndices, le_int32 glyph) = 0; + virtual void process(LEGlyphStorage &glyphStorage) = 0; virtual ~SubtableProcessor(); protected: diff --git a/icuSources/layout/ThaiLayoutEngine.cpp b/icuSources/layout/ThaiLayoutEngine.cpp index 9b808fd1..ee7504e8 100644 --- a/icuSources/layout/ThaiLayoutEngine.cpp +++ b/icuSources/layout/ThaiLayoutEngine.cpp @@ -1,8 +1,7 @@ /* - * @(#)ThaiLayoutEngine.cpp 1.2 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -10,12 +9,13 @@ #include "LayoutEngine.h" #include "ThaiLayoutEngine.h" #include "ScriptAndLanguageTags.h" +#include "LEGlyphStorage.h" #include "ThaiShaping.h" U_NAMESPACE_BEGIN -const char ThaiLayoutEngine::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ThaiLayoutEngine) ThaiLayoutEngine::ThaiLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode) : LayoutEngine(fontInstance, scriptCode, languageCode) @@ -51,7 +51,7 @@ ThaiLayoutEngine::~ThaiLayoutEngine() // Output: glyphs, char indices // Returns: the glyph count // NOTE: this assumes that ThaiShaping::compose will allocate the outChars array... -le_int32 ThaiLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool /*rightToLeft*/, LEGlyphID *&glyphs, le_int32 *&charIndices, LEErrorCode &success) +le_int32 ThaiLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool /*rightToLeft*/, LEGlyphStorage &glyphStorage, LEErrorCode &success) { if (LE_FAILURE(success)) { return 0; @@ -74,19 +74,20 @@ le_int32 ThaiLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offse return 0; } - charIndices = LE_NEW_ARRAY(le_int32, count * 2); + glyphStorage.allocateGlyphArray(count * 2, FALSE, success); - if (charIndices == NULL) { + if (LE_FAILURE(success)) { LE_DELETE_ARRAY(outChars); success = LE_MEMORY_ALLOCATION_ERROR; return 0; } - glyphCount = ThaiShaping::compose(chars, offset, count, fGlyphSet, fErrorChar, outChars, charIndices); - mapCharsToGlyphs(outChars, 0, glyphCount, false, false, glyphs, charIndices, success); + glyphCount = ThaiShaping::compose(chars, offset, count, fGlyphSet, fErrorChar, outChars, glyphStorage); + mapCharsToGlyphs(outChars, 0, glyphCount, FALSE, FALSE, glyphStorage, success); LE_DELETE_ARRAY(outChars); + glyphStorage.adoptGlyphCount(glyphCount); return glyphCount; } diff --git a/icuSources/layout/ThaiLayoutEngine.h b/icuSources/layout/ThaiLayoutEngine.h index 818f01b3..1d72679d 100644 --- a/icuSources/layout/ThaiLayoutEngine.h +++ b/icuSources/layout/ThaiLayoutEngine.h @@ -1,8 +1,7 @@ /* - * @(#)ThaiLayoutEngine.h 1.3 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -17,6 +16,8 @@ U_NAMESPACE_BEGIN +class LEGlyphStorage; + /** * This class implements layout for the Thai script, using the ThaiShapingClass. * All existing Thai fonts use an encoding which assigns character codes to all @@ -54,16 +55,16 @@ public: /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } + static UClassID getStaticClassID(); protected: /** @@ -98,11 +99,10 @@ protected: * @param offset - the index of the first character to process * @param count - the number of characters to process * @param max - the number of characters in the input context - * @param rightToLeft - true if the text is in a right to left directional run + * @param rightToLeft - TRUE if the text is in a right to left directional run + * @param glyphStorage - the glyph storage object. The glyph and char index arrays will be set. * * Output parameters: - * @param glyphs - the glyph index array - * @param charIndices - the character index array * @param success - set to an error code if the operation fails * * @return the number of glyphs in the glyph index array @@ -112,15 +112,8 @@ protected: * @internal */ virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEGlyphID *&glyphs, le_int32 *&charIndices, LEErrorCode &success); - -private: + LEGlyphStorage &glyphStorage, LEErrorCode &success); - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; U_NAMESPACE_END diff --git a/icuSources/layout/ThaiShaping.cpp b/icuSources/layout/ThaiShaping.cpp index 188cf60e..1680f0fe 100644 --- a/icuSources/layout/ThaiShaping.cpp +++ b/icuSources/layout/ThaiShaping.cpp @@ -1,13 +1,13 @@ /* - * @(#)ThaiShaping.cpp 1.13 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ #include "LETypes.h" #include "LEGlyphFilter.h" #include "OpenTypeTables.h" +#include "LEGlyphStorage.h" #include "ThaiShaping.h" U_NAMESPACE_BEGIN @@ -42,7 +42,7 @@ enum { LEUnicode ThaiShaping::leftAboveVowel(LEUnicode vowel, le_uint8 glyphSet) { - static LEUnicode leftAboveVowels[][7] = { + static const LEUnicode leftAboveVowels[][7] = { {0x0E61, 0x0E32, 0x0E33, 0x0E64, 0x0E65, 0x0E66, 0x0E67}, {0xF710, 0x0E32, 0x0E33, 0xF701, 0xF702, 0xF703, 0xF704}, {0xF884, 0x0E32, 0x0E33, 0xF885, 0xF886, 0xF887, 0xF788}, @@ -62,7 +62,7 @@ LEUnicode ThaiShaping::leftAboveVowel(LEUnicode vowel, le_uint8 glyphSet) LEUnicode ThaiShaping::lowerRightTone(LEUnicode tone, le_uint8 glyphSet) { - static LEUnicode lowerRightTones[][7] = { + static const LEUnicode lowerRightTones[][7] = { {0x0E68, 0x0E69, 0x0E6A, 0x0E6B, 0x0E6C, 0x0E6D, 0x0E6E}, {0x0E47, 0xF70A, 0xF70B, 0xF70C, 0xF70D, 0xF70E, 0x0E4D}, {0x0E47, 0xF88B, 0xF88E, 0xF891, 0xF894, 0xF897, 0x0E4D}, @@ -78,7 +78,7 @@ LEUnicode ThaiShaping::lowerRightTone(LEUnicode tone, le_uint8 glyphSet) LEUnicode ThaiShaping::lowerLeftTone(LEUnicode tone, le_uint8 glyphSet) { - static LEUnicode lowerLeftTones[][7] = { + static const LEUnicode lowerLeftTones[][7] = { {0x0E76, 0x0E77, 0x0E78, 0x0E79, 0x0E7A, 0x0E7B, 0x0E7C}, {0xF712, 0xF705, 0xF706, 0xF707, 0xF708, 0xF709, 0xF711}, {0xF889, 0xF88C, 0xF88F, 0xF892, 0xF895, 0xF898, 0xF899}, @@ -94,7 +94,7 @@ LEUnicode ThaiShaping::lowerLeftTone(LEUnicode tone, le_uint8 glyphSet) LEUnicode ThaiShaping::upperLeftTone(LEUnicode tone, le_uint8 glyphSet) { - static LEUnicode upperLeftTones[][7] = { + static const LEUnicode upperLeftTones[][7] = { {0x0E6F, 0x0E70, 0x0E71, 0x0E72, 0x0E73, 0x0E74, 0x0E75}, {0xF712, 0xF713, 0xF714, 0xF715, 0xF716, 0xF717, 0xF711}, {0xF889, 0xF88A, 0xF88D, 0xF890, 0xF893, 0xF896, 0xF899}, @@ -110,7 +110,7 @@ LEUnicode ThaiShaping::upperLeftTone(LEUnicode tone, le_uint8 glyphSet) LEUnicode ThaiShaping::lowerBelowVowel(LEUnicode vowel, le_uint8 glyphSet) { - static LEUnicode lowerBelowVowels[][3] = { + static const LEUnicode lowerBelowVowels[][3] = { {0x0E3C, 0x0E3D, 0x0E3E}, {0xF718, 0xF719, 0xF71A}, {0x0E38, 0x0E39, 0x0E3A}, @@ -127,7 +127,7 @@ LEUnicode ThaiShaping::lowerBelowVowel(LEUnicode vowel, le_uint8 glyphSet) LEUnicode ThaiShaping::noDescenderCOD(LEUnicode cod, le_uint8 glyphSet) { - static LEUnicode noDescenderCODs[][4] = { + static const LEUnicode noDescenderCODs[][4] = { {0x0E60, 0x0E0E, 0x0E0F, 0x0E63}, {0xF70F, 0x0E0E, 0x0E0F, 0xF700}, {0x0E0D, 0x0E0E, 0x0E0F, 0x0E10}, @@ -143,40 +143,42 @@ LEUnicode ThaiShaping::noDescenderCOD(LEUnicode cod, le_uint8 glyphSet) } le_uint8 ThaiShaping::doTransition (StateTransition transition, LEUnicode currChar, le_int32 inputIndex, le_uint8 glyphSet, - LEUnicode errorChar, LEUnicode *outputBuffer, le_int32 *charIndicies, le_int32 &outputIndex) + LEUnicode errorChar, LEUnicode *outputBuffer, LEGlyphStorage &glyphStorage, le_int32 &outputIndex) { + LEErrorCode success = LE_NO_ERROR; + switch (transition.action) { - case _A: - charIndicies[outputIndex] = inputIndex; + case tA: + glyphStorage.setCharIndex(outputIndex, inputIndex, success); outputBuffer[outputIndex++] = currChar; break; - case _C: - charIndicies[outputIndex] = inputIndex; + case tC: + glyphStorage.setCharIndex(outputIndex, inputIndex, success); outputBuffer[outputIndex++] = currChar; break; - case _D: - charIndicies[outputIndex] = inputIndex; + case tD: + glyphStorage.setCharIndex(outputIndex, inputIndex, success); outputBuffer[outputIndex++] = leftAboveVowel(currChar, glyphSet); break; - case _E: - charIndicies[outputIndex] = inputIndex; + case tE: + glyphStorage.setCharIndex(outputIndex, inputIndex, success); outputBuffer[outputIndex++] = lowerRightTone(currChar, glyphSet); break; - case _F: - charIndicies[outputIndex] = inputIndex; + case tF: + glyphStorage.setCharIndex(outputIndex, inputIndex, success); outputBuffer[outputIndex++] = lowerLeftTone(currChar, glyphSet); break; - case _G: - charIndicies[outputIndex] = inputIndex; + case tG: + glyphStorage.setCharIndex(outputIndex, inputIndex, success); outputBuffer[outputIndex++] = upperLeftTone(currChar, glyphSet); break; - case _H: + case tH: { LEUnicode cod = outputBuffer[outputIndex - 1]; LEUnicode coa = noDescenderCOD(cod, glyphSet); @@ -184,38 +186,38 @@ le_uint8 ThaiShaping::doTransition (StateTransition transition, LEUnicode currCh if (cod != coa) { outputBuffer[outputIndex - 1] = coa; - charIndicies[outputIndex] = inputIndex; + glyphStorage.setCharIndex(outputIndex, inputIndex, success); outputBuffer[outputIndex++] = currChar; break; } - charIndicies[outputIndex] = inputIndex; + glyphStorage.setCharIndex(outputIndex, inputIndex, success); outputBuffer[outputIndex++] = lowerBelowVowel(currChar, glyphSet); break; } - case _R: - charIndicies[outputIndex] = inputIndex; + case tR: + glyphStorage.setCharIndex(outputIndex, inputIndex, success); outputBuffer[outputIndex++] = errorChar; - charIndicies[outputIndex] = inputIndex; + glyphStorage.setCharIndex(outputIndex, inputIndex, success); outputBuffer[outputIndex++] = currChar; break; - case _S: + case tS: if (currChar == CH_SARA_AM) { - charIndicies[outputIndex] = inputIndex; + glyphStorage.setCharIndex(outputIndex, inputIndex, success); outputBuffer[outputIndex++] = errorChar; } - charIndicies[outputIndex] = inputIndex; + glyphStorage.setCharIndex(outputIndex, inputIndex, success); outputBuffer[outputIndex++] = currChar; break; default: // FIXME: if we get here, there's an error // in the state table! - charIndicies[outputIndex] = inputIndex; + glyphStorage.setCharIndex(outputIndex, inputIndex, success); outputBuffer[outputIndex++] = currChar; break; } @@ -224,14 +226,14 @@ le_uint8 ThaiShaping::doTransition (StateTransition transition, LEUnicode currCh } le_uint8 ThaiShaping::getNextState(LEUnicode ch, le_uint8 prevState, le_int32 inputIndex, le_uint8 glyphSet, LEUnicode errorChar, - le_uint8 &charClass, LEUnicode *output, le_int32 *charIndicies, le_int32 &outputIndex) + le_uint8 &charClass, LEUnicode *output, LEGlyphStorage &glyphStorage, le_int32 &outputIndex) { StateTransition transition; charClass = getCharClass(ch); transition = getTransition(prevState, charClass); - return doTransition(transition, ch, inputIndex, glyphSet, errorChar, output, charIndicies, outputIndex); + return doTransition(transition, ch, inputIndex, glyphSet, errorChar, output, glyphStorage, outputIndex); } le_bool ThaiShaping::isLegalHere(LEUnicode ch, le_uint8 prevState) @@ -240,28 +242,28 @@ le_bool ThaiShaping::isLegalHere(LEUnicode ch, le_uint8 prevState) StateTransition transition = getTransition(prevState, charClass); switch (transition.action) { - case _A: - case _C: - case _D: - case _E: - case _F: - case _G: - case _H: - return true; + case tA: + case tC: + case tD: + case tE: + case tF: + case tG: + case tH: + return TRUE; - case _R: - case _S: - return false; + case tR: + case tS: + return FALSE; default: // FIXME: if we get here, there's an error // in the state table! - return false; + return FALSE; } } le_int32 ThaiShaping::compose(const LEUnicode *input, le_int32 offset, le_int32 charCount, le_uint8 glyphSet, - LEUnicode errorChar, LEUnicode *output, le_int32 *charIndicies) + LEUnicode errorChar, LEUnicode *output, LEGlyphStorage &glyphStorage) { le_uint8 state = 0; le_int32 inputIndex; @@ -278,19 +280,19 @@ le_int32 ThaiShaping::compose(const LEUnicode *input, le_int32 offset, le_int32 if (ch == CH_SARA_AM && isLegalHere(ch, state)) { outputIndex = conOutput; state = getNextState(CH_NIKHAHIT, conState, inputIndex, glyphSet, errorChar, charClass, - output, charIndicies, outputIndex); + output, glyphStorage, outputIndex); for (int j = conInput + 1; j < inputIndex; j += 1) { ch = input[j + offset]; state = getNextState(ch, state, j, glyphSet, errorChar, charClass, - output, charIndicies, outputIndex); + output, glyphStorage, outputIndex); } ch = CH_SARA_AA; } state = getNextState(ch, state, inputIndex, glyphSet, errorChar, charClass, - output, charIndicies, outputIndex); + output, glyphStorage, outputIndex); if (charClass >= CON && charClass <= COD) { conState = state; diff --git a/icuSources/layout/ThaiShaping.h b/icuSources/layout/ThaiShaping.h index 54618a38..da854ccd 100644 --- a/icuSources/layout/ThaiShaping.h +++ b/icuSources/layout/ThaiShaping.h @@ -1,7 +1,6 @@ /* - * @(#)ThaiShaping.h 1.9 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -19,6 +18,8 @@ U_NAMESPACE_BEGIN +class LEGlyphStorage; + class ThaiShaping /* not : public UObject because all methods are static */ { public: @@ -46,15 +47,15 @@ public: classCount = 19, // State Transition actions - _A = 0, - _C = 1, - _D = 2, - _E = 3, - _F = 4, - _G = 5, - _H = 6, - _R = 7, - _S = 8 + tA = 0, + tC = 1, + tD = 2, + tE = 3, + tF = 4, + tG = 5, + tH = 6, + tR = 7, + tS = 8 }; struct StateTransition @@ -67,7 +68,7 @@ public: }; static le_int32 compose(const LEUnicode *input, le_int32 offset, le_int32 charCount, le_uint8 glyphSet, - LEUnicode errorChar, LEUnicode *output, le_int32 *charIndicies); + LEUnicode errorChar, LEUnicode *output, LEGlyphStorage &glyphStorage); private: // forbid instantiation @@ -78,10 +79,10 @@ private: static StateTransition getTransition(le_uint8 state, le_uint8 currClass); static le_uint8 doTransition(StateTransition transition, LEUnicode currChar, le_int32 inputIndex, le_uint8 glyphSet, - LEUnicode errorChar, LEUnicode *outputBuffer, le_int32 *charIndicies, le_int32 &outputIndex); + LEUnicode errorChar, LEUnicode *outputBuffer, LEGlyphStorage &glyphStorage, le_int32 &outputIndex); static le_uint8 getNextState(LEUnicode ch, le_uint8 state, le_int32 inputIndex, le_uint8 glyphSet, LEUnicode errorChar, - le_uint8 &charClass, LEUnicode *output, le_int32 *charIndicies, le_int32 &outputIndex); + le_uint8 &charClass, LEUnicode *output, LEGlyphStorage &glyphStorage, le_int32 &outputIndex); static le_bool isLegalHere(LEUnicode ch, le_uint8 prevState); static le_uint8 getCharClass(LEUnicode ch); diff --git a/icuSources/layout/ThaiStateTables.cpp b/icuSources/layout/ThaiStateTables.cpp index 19e1069b..b1f8b184 100644 --- a/icuSources/layout/ThaiStateTables.cpp +++ b/icuSources/layout/ThaiStateTables.cpp @@ -1,7 +1,7 @@ /* * %W% %E% * - * (C) Copyright IBM Corp. 1999, 2000, 2002 - All Rights Reserved + * (C) Copyright IBM Corp. 1999-2003 - All Rights Reserved * * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS * YOU REALLY KNOW WHAT YOU'RE DOING. @@ -30,58 +30,58 @@ const ThaiShaping::StateTransition ThaiShaping::thaiStateTable[][ThaiShaping::cl //| O O O O V V V V V V D O D D D I V V V | //| N N A D O 1 2 3 1 2 I N 1 2 3 K 1 2 3 | //+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - /*00*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _S}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*01*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _A}, { 0, _S}, { 0, _A}, { 2, _C}, { 6, _C}, { 0, _C}, { 8, _E}, { 0, _E}, { 0, _E}, { 0, _C}, { 9, _E}, {11, _C}, {14, _C}, {16, _C}}, - /*02*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _S}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 3, _E}, { 0, _E}, { 0, _R}, { 0, _R}, { 4, _E}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*03*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _A}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*04*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _S}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 5, _C}, { 0, _C}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*05*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _A}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*06*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _S}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 7, _E}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*07*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _A}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*08*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _A}, { 0, _A}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*09*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _S}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, {10, _C}, { 0, _C}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*10*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _A}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*11*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _S}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, {12, _C}, { 0, _C}, { 0, _R}, { 0, _R}, {13, _C}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*12*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _A}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*13*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _S}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*14*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _S}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, {15, _C}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*15*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _A}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*16*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _S}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, {17, _C}, { 0, _R}, { 0, _C}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*17*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _A}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*18*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _A}, { 0, _S}, { 0, _A}, {19, _C}, {23, _C}, { 0, _C}, {25, _F}, { 0, _F}, { 0, _F}, { 0, _D}, {26, _F}, {28, _D}, {31, _D}, {33, _D}}, - /*19*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _S}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, {20, _F}, { 0, _F}, { 0, _R}, { 0, _R}, {21, _F}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*20*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _A}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*21*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _S}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, {22, _C}, { 0, _C}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*22*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _A}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*23*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _S}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, {24, _F}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*24*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _A}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*25*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _A}, { 0, _A}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*26*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _S}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, {27, _G}, { 0, _G}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*27*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _A}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*28*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _S}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, {29, _G}, { 0, _G}, { 0, _R}, { 0, _R}, {30, _G}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*29*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _A}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*30*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _S}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*31*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _S}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, {32, _G}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*32*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _A}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*33*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _S}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, {34, _G}, { 0, _R}, { 0, _G}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*34*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _A}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*35*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _A}, { 0, _S}, { 0, _A}, {36, _H}, {40, _H}, { 0, _H}, {42, _E}, { 0, _E}, { 0, _E}, { 0, _C}, {43, _E}, {45, _C}, {48, _C}, {50, _C}}, - /*36*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _S}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, {37, _E}, { 0, _E}, { 0, _R}, { 0, _R}, {38, _E}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*37*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _A}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*38*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _S}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, {39, _C}, { 0, _C}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*39*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _A}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*40*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _S}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, {41, _E}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*41*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _A}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*42*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _A}, { 0, _A}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*43*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _S}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, {44, _C}, { 0, _C}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*44*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _A}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*45*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _S}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, {46, _C}, { 0, _C}, { 0, _R}, { 0, _R}, {47, _C}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*46*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _A}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*47*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _S}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*48*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _S}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, {49, _C}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*49*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _A}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*50*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _S}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, {51, _C}, { 0, _R}, { 0, _C}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}}, - /*51*/ {{ 0, _A}, { 1, _A}, {18, _A}, {35, _A}, { 0, _A}, { 0, _S}, { 0, _A}, { 0, _A}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}, { 0, _R}} + /*00*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*01*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 2, tC}, { 6, tC}, { 0, tC}, { 8, tE}, { 0, tE}, { 0, tE}, { 0, tC}, { 9, tE}, {11, tC}, {14, tC}, {16, tC}}, + /*02*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 3, tE}, { 0, tE}, { 0, tR}, { 0, tR}, { 4, tE}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*03*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*04*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 5, tC}, { 0, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*05*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*06*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 7, tE}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*07*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*08*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tA}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*09*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {10, tC}, { 0, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*10*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*11*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {12, tC}, { 0, tC}, { 0, tR}, { 0, tR}, {13, tC}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*12*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*13*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*14*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {15, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*15*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*16*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {17, tC}, { 0, tR}, { 0, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*17*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*18*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tA}, { 0, tS}, { 0, tA}, {19, tC}, {23, tC}, { 0, tC}, {25, tF}, { 0, tF}, { 0, tF}, { 0, tD}, {26, tF}, {28, tD}, {31, tD}, {33, tD}}, + /*19*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {20, tF}, { 0, tF}, { 0, tR}, { 0, tR}, {21, tF}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*20*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*21*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {22, tC}, { 0, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*22*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*23*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {24, tF}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*24*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*25*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tA}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*26*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {27, tG}, { 0, tG}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*27*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*28*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {29, tG}, { 0, tG}, { 0, tR}, { 0, tR}, {30, tG}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*29*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*30*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*31*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {32, tG}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*32*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*33*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {34, tG}, { 0, tR}, { 0, tG}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*34*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*35*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tA}, { 0, tS}, { 0, tA}, {36, tH}, {40, tH}, { 0, tH}, {42, tE}, { 0, tE}, { 0, tE}, { 0, tC}, {43, tE}, {45, tC}, {48, tC}, {50, tC}}, + /*36*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {37, tE}, { 0, tE}, { 0, tR}, { 0, tR}, {38, tE}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*37*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*38*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {39, tC}, { 0, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*39*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*40*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {41, tE}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*41*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*42*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tA}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*43*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {44, tC}, { 0, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*44*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*45*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {46, tC}, { 0, tC}, { 0, tR}, { 0, tR}, {47, tC}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*46*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*47*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*48*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {49, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*49*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*50*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {51, tC}, { 0, tR}, { 0, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*51*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}} }; U_NAMESPACE_END diff --git a/icuSources/layout/TrimmedArrayProcessor.cpp b/icuSources/layout/TrimmedArrayProcessor.cpp index 90e7850a..a68c0562 100644 --- a/icuSources/layout/TrimmedArrayProcessor.cpp +++ b/icuSources/layout/TrimmedArrayProcessor.cpp @@ -1,7 +1,6 @@ /* - * @(#)TrimmedArrayProcessor.cpp 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -11,11 +10,12 @@ #include "NonContextualGlyphSubst.h" #include "NonContextualGlyphSubstProc.h" #include "TrimmedArrayProcessor.h" +#include "LEGlyphStorage.h" #include "LESwaps.h" U_NAMESPACE_BEGIN -const char TrimmedArrayProcessor::fgClassID=0; +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(TrimmedArrayProcessor) TrimmedArrayProcessor::TrimmedArrayProcessor() { @@ -35,17 +35,19 @@ TrimmedArrayProcessor::~TrimmedArrayProcessor() { } -void TrimmedArrayProcessor::process(LEGlyphID *glyphs, le_int32 * /*charIndices*/, le_int32 glyphCount) +void TrimmedArrayProcessor::process(LEGlyphStorage &glyphStorage) { + le_int32 glyphCount = glyphStorage.getGlyphCount(); le_int32 glyph; for (glyph = 0; glyph < glyphCount; glyph += 1) { - TTGlyphID ttGlyph = (TTGlyphID) LE_GET_GLYPH(glyphs[glyph]); + LEGlyphID thisGlyph = glyphStorage[glyph]; + TTGlyphID ttGlyph = (TTGlyphID) LE_GET_GLYPH(thisGlyph); if ((ttGlyph > firstGlyph) && (ttGlyph < lastGlyph)) { TTGlyphID newGlyph = SWAPW(trimmedArrayLookupTable->valueArray[ttGlyph - firstGlyph]); - glyphs[glyph] = LE_SET_GLYPH(glyphs[glyph], newGlyph); + glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph); } } } diff --git a/icuSources/layout/TrimmedArrayProcessor.h b/icuSources/layout/TrimmedArrayProcessor.h index 73b7ed22..9d86980c 100644 --- a/icuSources/layout/TrimmedArrayProcessor.h +++ b/icuSources/layout/TrimmedArrayProcessor.h @@ -1,7 +1,6 @@ /* - * @(#)TrimmedArrayProcessor.h 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -21,10 +20,12 @@ U_NAMESPACE_BEGIN +class LEGlyphStorage; + class TrimmedArrayProcessor : public NonContextualGlyphSubstitutionProcessor { public: - virtual void process(LEGlyphID *glyphs, le_int32 *charIndices, le_int32 glyphCount); + virtual void process(LEGlyphStorage &glyphStorage); TrimmedArrayProcessor(const MorphSubtableHeader *morphSubtableHeader); @@ -33,32 +34,25 @@ public: /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } + virtual UClassID getDynamicClassID() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. * - * @draft ICU 2.2 + * @stable ICU 2.8 */ - static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } + static UClassID getStaticClassID(); private: TrimmedArrayProcessor(); protected: - le_int16 firstGlyph; - le_int16 lastGlyph; + TTGlyphID firstGlyph; + TTGlyphID lastGlyph; const TrimmedArrayLookupTable *trimmedArrayLookupTable; -private: - - /** - * The address of this static class variable serves as this class's ID - * for ICU "poor man's RTTI". - */ - static const char fgClassID; }; U_NAMESPACE_END diff --git a/icuSources/layout/ValueRecords.cpp b/icuSources/layout/ValueRecords.cpp index f917d879..4a42c91a 100644 --- a/icuSources/layout/ValueRecords.cpp +++ b/icuSources/layout/ValueRecords.cpp @@ -1,7 +1,6 @@ /* - * @(#)ValueRecords.cpp 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998, 1999, 2000, 2001 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ @@ -235,7 +234,7 @@ le_int16 ValueRecord::getSize(ValueFormat valueFormat) le_int16 ValueRecord::getFieldCount(ValueFormat valueFormat) { - static le_int16 bitsInNibble[] = + static const le_int16 bitsInNibble[] = { 0 + 0 + 0 + 0, 0 + 0 + 0 + 1, @@ -263,7 +262,7 @@ le_int16 ValueRecord::getFieldCount(ValueFormat valueFormat) le_int16 ValueRecord::getFieldIndex(ValueFormat valueFormat, ValueRecordField field) { - static le_uint16 beforeMasks[] = + static const le_uint16 beforeMasks[] = { 0x0000, 0x0001, diff --git a/icuSources/layout/ValueRecords.h b/icuSources/layout/ValueRecords.h index eebd2527..c68d7cc7 100644 --- a/icuSources/layout/ValueRecords.h +++ b/icuSources/layout/ValueRecords.h @@ -1,7 +1,6 @@ /* - * @(#)ValueRecords.h 1.6 00/03/15 * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved * */ diff --git a/icuSources/layout/layout.dsp b/icuSources/layout/layout.dsp index 855b8775..78c462d3 100644 --- a/icuSources/layout/layout.dsp +++ b/icuSources/layout/layout.dsp @@ -55,7 +55,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 ..\..\lib\icuuc.lib /nologo /dll /machine:I386 /out:"..\..\bin\icule26.dll" /implib:"..\..\lib\icule.lib" +# ADD LINK32 ..\..\lib\icuuc.lib /nologo /dll /machine:I386 /out:"..\..\bin\icule32.dll" /implib:"..\..\lib\icule.lib" # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "layout - Win32 Debug" @@ -82,7 +82,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 ..\..\lib\icuucd.lib /nologo /dll /debug /machine:I386 /out:"..\..\bin\icule26d.dll" /implib:"..\..\lib\iculed.lib" /pdbtype:sept +# ADD LINK32 ..\..\lib\icuucd.lib /nologo /dll /debug /machine:I386 /out:"..\..\bin\icule32d.dll" /implib:"..\..\lib\iculed.lib" /pdbtype:sept # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "layout - Win64 Release" @@ -99,7 +99,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LAYOUT_EXPORTS" /FD /c -# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\include" /I "..\common" /D "WIN64" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LAYOUT_EXPORTS" /D "U_LAYOUT_IMPLEMENTATION" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\include" /I "..\common" /D "WIN64" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LAYOUT_EXPORTS" /D "U_LAYOUT_IMPLEMENTATION" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win64 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win64 # ADD BASE RSC /l 0x409 /d "NDEBUG" @@ -109,7 +109,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:IX86 /machine:IA64 -# ADD LINK32 ..\..\lib\icuuc.lib /nologo /dll /machine:IX86 /out:"..\..\bin\icule26.dll" /implib:"..\..\lib\icule.lib" /machine:IA64 +# ADD LINK32 ..\..\lib\icuuc.lib /nologo /dll /machine:IX86 /out:"..\..\bin\icule32.dll" /implib:"..\..\lib\icule.lib" /machine:IA64 !ELSEIF "$(CFG)" == "layout - Win64 Debug" @@ -125,7 +125,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LAYOUT_EXPORTS" /FD /GZ /c -# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\include" /I "..\common" /D "WIN64" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LAYOUT_EXPORTS" /D "U_LAYOUT_IMPLEMENTATION" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\include" /I "..\common" /D "WIN64" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LAYOUT_EXPORTS" /D "U_LAYOUT_IMPLEMENTATION" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /Wp64 /Zm600 /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win64 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win64 # ADD BASE RSC /l 0x409 /d "_DEBUG" @@ -135,7 +135,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:IX86 /pdbtype:sept /machine:IA64 -# ADD LINK32 ..\..\lib\icuucd.lib /nologo /dll /incremental:no /debug /machine:IX86 /out:"..\..\bin\icule26d.dll" /implib:"..\..\lib\iculed.lib" /pdbtype:sept /machine:IA64 +# ADD LINK32 ..\..\lib\icuucd.lib /nologo /dll /incremental:no /debug /machine:IX86 /out:"..\..\bin\icule32d.dll" /implib:"..\..\lib\iculed.lib" /pdbtype:sept /machine:IA64 !ENDIF @@ -162,11 +162,11 @@ SOURCE=.\ArabicLayoutEngine.cpp # End Source File # Begin Source File -SOURCE=.\ArabicLigatureData.cpp +SOURCE=.\ArabicShaping.cpp # End Source File # Begin Source File -SOURCE=.\ArabicShaping.cpp +SOURCE=.\CanonData.cpp # End Source File # Begin Source File @@ -214,6 +214,10 @@ SOURCE=.\GlyphIterator.cpp # End Source File # Begin Source File +SOURCE=.\GlyphLookupTables.cpp +# End Source File +# Begin Source File + SOURCE=.\GlyphPositioningTables.cpp # End Source File # Begin Source File @@ -238,14 +242,6 @@ SOURCE=.\HanLayoutEngine.cpp # End Source File # Begin Source File -SOURCE=.\HebrewLigatureData.cpp -# End Source File -# Begin Source File - -SOURCE=.\HebrewShaping.cpp -# End Source File -# Begin Source File - SOURCE=.\IndicClassTables.cpp # End Source File # Begin Source File @@ -270,6 +266,14 @@ SOURCE=.\LEFontInstance.cpp # End Source File # Begin Source File +SOURCE=.\LEGlyphStorage.cpp +# End Source File +# Begin Source File + +SOURCE=.\LEInsertionList.cpp +# End Source File +# Begin Source File + SOURCE=.\LigatureSubstProc.cpp # End Source File # Begin Source File @@ -426,6 +430,14 @@ SOURCE=.\AttachmentPosnSubtables.h # End Source File # Begin Source File +SOURCE=.\CanonShaping.h +# End Source File +# Begin Source File + +SOURCE=.\CharSubstitutionFilter.h +# End Source File +# Begin Source File + SOURCE=.\ClassDefinitionTables.h # End Source File # Begin Source File @@ -482,6 +494,10 @@ SOURCE=.\GlyphIterator.h # End Source File # Begin Source File +SOURCE=.\GlyphLookupTables.h +# End Source File +# Begin Source File + SOURCE=.\GlyphPositionAdjustments.h # End Source File # Begin Source File @@ -510,10 +526,6 @@ SOURCE=.\HanLayoutEngine.h # End Source File # Begin Source File -SOURCE=.\HebrewShaping.h -# End Source File -# Begin Source File - SOURCE=.\HindiFeatureTags.h # End Source File # Begin Source File @@ -679,6 +691,100 @@ InputPath=.\LEGlyphFilter.h # End Source File # Begin Source File +SOURCE=.\LEGlyphStorage.h + +!IF "$(CFG)" == "layout - Win32 Release" + +# Begin Custom Build +InputPath=.\LEGlyphStorage.h + +"..\..\include\layout\LEGlyphStorage.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\layout + +# End Custom Build + +!ELSEIF "$(CFG)" == "layout - Win32 Debug" + +# Begin Custom Build +InputPath=.\LEGlyphStorage.h + +"..\..\include\layout\LEGlyphStorage.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\layout + +# End Custom Build + +!ELSEIF "$(CFG)" == "layout - Win64 Release" + +# Begin Custom Build +InputPath=.\LEGlyphStorage.h + +"..\..\include\layout\LEGlyphStorage.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\layout + +# End Custom Build + +!ELSEIF "$(CFG)" == "layout - Win64 Debug" + +# Begin Custom Build +InputPath=.\LEGlyphStorage.h + +"..\..\include\layout\LEGlyphStorage.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\layout + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\LEInsertionList.h + +!IF "$(CFG)" == "layout - Win32 Release" + +# Begin Custom Build +InputPath=.\LEInsertionList.h + +"..\..\include\layout\LEInsertionList.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\layout + +# End Custom Build + +!ELSEIF "$(CFG)" == "layout - Win32 Debug" + +# Begin Custom Build +InputPath=.\LEInsertionList.h + +"..\..\include\layout\LEInsertionList.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\layout + +# End Custom Build + +!ELSEIF "$(CFG)" == "layout - Win64 Release" + +# Begin Custom Build +InputPath=.\LEInsertionList.h + +"..\..\include\layout\LEInsertionList.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\layout + +# End Custom Build + +!ELSEIF "$(CFG)" == "layout - Win64 Debug" + +# Begin Custom Build +InputPath=.\LEInsertionList.h + +"..\..\include\layout\LEInsertionList.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) ..\..\include\layout + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + SOURCE=.\LELanguages.h !IF "$(CFG)" == "layout - Win32 Release" diff --git a/icuSources/layout/layout.dsw b/icuSources/layout/layout.dsw deleted file mode 100644 index 611d964b..00000000 --- a/icuSources/layout/layout.dsw +++ /dev/null @@ -1,29 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "layout"=.\layout.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/icuSources/layout/layout.rc b/icuSources/layout/layout.rc index 017bac90..4298b05a 100644 --- a/icuSources/layout/layout.rc +++ b/icuSources/layout/layout.rc @@ -1,25 +1,50 @@ -//Do not edit with Microsoft Developer Studio because it will modify this -//script in the wrong way. +// Do not edit with Microsoft Developer Studio Resource Editor. +// It will permanently substitute version numbers that are intended to be +// picked up by the pre-processor during each build. // Copyright (c) 2001-2003 International Business Machines // Corporation and others. All Rights Reserved. // +#include "../common/msvcres.h" + #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // -#include "winresrc.h" - +#include ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// -// +// LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #pragma code_page(1252) -#include "unicode\uversion.h" +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "../common/msvcres.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include \0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + ///////////////////////////////////////////////////////////////////////////// // @@ -55,7 +80,6 @@ BEGIN #else VALUE "OriginalFilename", "icule" U_ICU_VERSION_SHORT ".dll\0") #endif - VALUE "PrivateBuild", "\0" VALUE "ProductName", "International Components for Unicode\0" VALUE "ProductVersion", CommaVersionString(U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, 0) @@ -70,3 +94,15 @@ END ///////////////////////////////////////////////////////////////////////////// + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/icuSources/layout/layout.vcproj b/icuSources/layout/layout.vcproj index d90abda9..795bc652 100644 --- a/icuSources/layout/layout.vcproj +++ b/icuSources/layout/layout.vcproj @@ -1,7 +1,7 @@ - + @@ -24,7 +24,7 @@ ImproveFloatingPointConsistency="TRUE" OptimizeForProcessor="2" AdditionalIncludeDirectories="..\..\include,..\common" - PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LAYOUT_EXPORTS;U_LAYOUT_IMPLEMENTATION" + PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;U_LAYOUT_IMPLEMENTATION" BasicRuntimeChecks="3" RuntimeLibrary="3" DisableLanguageExtensions="TRUE" @@ -41,13 +41,12 @@ Name="VCCustomBuildTool"/> + TypeLibraryName=".\..\..\lib\iculed.tlb"/> + + + + TypeLibraryName=".\..\..\lib\icule.tlb"/> + + + + + + RelativePath=".\ArabicShaping.cpp"> + RelativePath=".\CanonData.cpp"> @@ -178,9 +190,6 @@ - - @@ -188,25 +197,25 @@ RelativePath=".\GlyphIterator.cpp"> + RelativePath="GlyphLookupTables.cpp"> + RelativePath=".\GlyphPositioningTables.cpp"> + RelativePath=".\GlyphPosnLookupProc.cpp"> + RelativePath=".\GlyphSubstLookupProc.cpp"> + RelativePath=".\GXLayoutEngine.cpp"> + RelativePath=".\HanLayoutEngine.cpp"> @@ -220,11 +229,17 @@ + + + RelativePath=".\LEGlyphStorage.cpp"> + + @@ -233,16 +248,16 @@ RelativePath=".\LigatureSubstSubtables.cpp"> + RelativePath=".\loengine.cpp"> + RelativePath=".\LookupProcessor.cpp"> + RelativePath=".\LookupTables.cpp"> @@ -259,6 +274,9 @@ + + @@ -322,9 +340,6 @@ - - + + + + @@ -351,10 +372,10 @@ RelativePath=".\ContextualGlyphInsertion.h"> + RelativePath=".\ContextualGlyphSubstitution.h"> + RelativePath=".\ContextualGlyphSubstProc.h"> @@ -380,15 +401,15 @@ - - + + @@ -399,16 +420,16 @@ RelativePath=".\GlyphPosnLookupProc.h"> + RelativePath=".\GlyphSubstitutionTables.h"> + RelativePath=".\GlyphSubstLookupProc.h"> + RelativePath=".\GXLayoutEngine.h"> + RelativePath=".\HanLayoutEngine.h"> @@ -425,23 +446,45 @@ + + + + + + + + + + + Outputs="..\..\include\layout\$(InputFileName)"/> + Outputs="..\..\include\layout\$(InputFileName)"/> + Outputs="..\..\include\layout\$(InputFileName)"/> + Outputs="..\..\include\layout\$(InputFileName)"/> + RelativePath=".\LEGlyphStorage.h"> + Outputs="..\..\include\layout\$(InputFileName)"/> + Outputs="..\..\include\layout\$(InputFileName)"/> + RelativePath=".\LEInsertionList.h"> + Outputs="..\..\include\layout\$(InputFileName)"/> + Outputs="..\..\include\layout\$(InputFileName)"/> + RelativePath=".\LELanguages.h"> + Outputs="..\..\include\layout\$(InputFileName)"/> + Outputs="..\..\include\layout\$(InputFileName)"/> + RelativePath=".\LEScripts.h"> + Outputs="..\..\include\layout\$(InputFileName)"/> + Outputs="..\..\include\layout\$(InputFileName)"/> + RelativePath=".\LESwaps.h"> + Outputs="..\..\include\layout\$(InputFileName)"/> + Outputs="..\..\include\layout\$(InputFileName)"/> + RelativePath=".\LETypes.h"> + + + + + + + + @@ -568,19 +630,32 @@ RelativePath=".\LigatureSubstSubtables.h"> + RelativePath=".\unicode\loengine.h"> + + + + + + - - + RelativePath=".\LookupTables.h"> @@ -600,6 +675,9 @@ + + @@ -669,25 +747,6 @@ - - - - - - - - = 0; glyph -= 1) { + le_int32 ch = fGlyphToCharMap[glyph]; + + fCharToMinGlyphMap[ch] = glyph; + } + + fCharToMinGlyphMap[fCharCount] = fGlyphCount; + + for (glyph = 0; glyph < fGlyphCount; glyph += 1) { + le_int32 ch = fGlyphToCharMap[glyph]; + + fCharToMaxGlyphMap[ch] = glyph; + } + + fCharToMaxGlyphMap[fCharCount] = fGlyphCount; } ParagraphLayout::~ParagraphLayout() @@ -345,21 +364,21 @@ ParagraphLayout::~ParagraphLayout() delete (ValueRuns *) fLevelRuns; fLevelRuns = NULL; - fClientLevels = true; + fClientLevels = TRUE; } if (! fClientScripts) { delete (ValueRuns *) fScriptRuns; fScriptRuns = NULL; - fClientScripts = true; + fClientScripts = TRUE; } if (! fClientLocales) { delete (LocaleRuns *) fLocaleRuns; fLocaleRuns = NULL; - fClientLocales = true; + fClientLocales = TRUE; } if (fEmbeddingLevels != NULL) { @@ -372,9 +391,14 @@ ParagraphLayout::~ParagraphLayout() fGlyphToCharMap = NULL; } - if (fCharToGlyphMap != NULL) { - LE_DELETE_ARRAY(fCharToGlyphMap); - fCharToGlyphMap = NULL; + if (fCharToMinGlyphMap != NULL) { + LE_DELETE_ARRAY(fCharToMinGlyphMap); + fCharToMinGlyphMap = NULL; + } + + if (fCharToMaxGlyphMap != NULL) { + LE_DELETE_ARRAY(fCharToMaxGlyphMap); + fCharToMaxGlyphMap = NULL; } if (fGlyphWidths != NULL) { @@ -429,16 +453,16 @@ le_bool ParagraphLayout::isComplex(const LEUnicode chars[], le_int32 count) while (uscript_nextRun(sr, NULL, NULL, &scriptCode)) { if (isComplex(scriptCode)) { - return true; + return TRUE; } } - return false; + return FALSE; } le_int32 ParagraphLayout::getAscent() const { - if (fAscent <= 0) { + if (fAscent <= 0 && fCharCount > 0) { ((ParagraphLayout *) this)->computeMetrics(); } @@ -447,7 +471,7 @@ le_int32 ParagraphLayout::getAscent() const le_int32 ParagraphLayout::getDescent() const { - if (fAscent <= 0) { + if (fAscent <= 0 && fCharCount > 0) { ((ParagraphLayout *) this)->computeMetrics(); } @@ -456,7 +480,7 @@ le_int32 ParagraphLayout::getDescent() const le_int32 ParagraphLayout::getLeading() const { - if (fAscent <= 0) { + if (fAscent <= 0 && fCharCount > 0) { ((ParagraphLayout *) this)->computeMetrics(); } @@ -472,7 +496,7 @@ ParagraphLayout::Line *ParagraphLayout::nextLine(float width) fLineStart = fLineEnd; if (width > 0) { - le_int32 glyph = fCharToGlyphMap[fLineStart]; + le_int32 glyph = fCharToMinGlyphMap[fLineStart]; float widthSoFar = 0; while (glyph < fGlyphCount && widthSoFar + fGlyphWidths[glyph] <= width) { @@ -492,10 +516,11 @@ ParagraphLayout::Line *ParagraphLayout::nextLine(float width) fLineEnd = previousBreak(fGlyphToCharMap[glyph]); - // If there's no real break, break at the - // glyph that didn't fit. - if (fLineEnd <= fLineStart) { - fLineEnd = fGlyphToCharMap[glyph]; + // If this break is at or before the last one, + // find a glyph, starting at the one which didn't + // fit, that produces a break after the last one. + while (fLineEnd <= fLineStart) { + fLineEnd = fGlyphToCharMap[glyph++]; } } else { fLineEnd = fCharCount; @@ -543,7 +568,7 @@ void ParagraphLayout::computeLevels(UBiDiLevel paragraphLevel) } fLevelRuns = levelRuns; - fClientLevels = false; + fClientLevels = FALSE; } } @@ -562,7 +587,7 @@ void ParagraphLayout::computeScripts() uscript_closeRun(sr); fScriptRuns = scriptRuns; - fClientScripts = false; + fClientScripts = FALSE; } void ParagraphLayout::computeLocales() @@ -573,11 +598,15 @@ void ParagraphLayout::computeLocales() localeRuns->add(defaultLocale, fCharCount); fLocaleRuns = localeRuns; - fClientLocales = false; + fClientLocales = FALSE; } -void ParagraphLayout::computeSubFonts(const FontRuns *fontRuns) +void ParagraphLayout::computeSubFonts(const FontRuns *fontRuns, LEErrorCode &status) { + if (LE_FAILURE(status)) { + return; + } + const RunArray *styleRunArrays[] = {fontRuns, fScriptRuns}; le_int32 styleCount = sizeof styleRunArrays / sizeof styleRunArrays[0]; StyleRuns styleRuns(styleRunArrays, styleCount); @@ -595,10 +624,14 @@ void ParagraphLayout::computeSubFonts(const FontRuns *fontRuns) for (run = 0; run < styleRunCount; run += 1) { const LEFontInstance *runFont = fontRuns->getFont(si[0]); le_int32 script = fScriptRuns->getValue(si[1]); - LEErrorCode success = LE_NO_ERROR; while (offset < styleRunLimits[run]) { - const LEFontInstance *subFont = runFont->getSubFont(fChars, &offset, styleRunLimits[run], script, success); + const LEFontInstance *subFont = runFont->getSubFont(fChars, &offset, styleRunLimits[run], script, status); + + if (LE_FAILURE(status)) { + delete subFontRuns; + goto cleanUp; + } subFontRuns->add(subFont, offset); } @@ -608,6 +641,7 @@ void ParagraphLayout::computeSubFonts(const FontRuns *fontRuns) fFontRuns = subFontRuns; +cleanUp: LE_DELETE_ARRAY(styleIndices); LE_DELETE_ARRAY(styleRunLimits); } @@ -723,7 +757,7 @@ le_int32 ParagraphLayout::getLanguageCode(const Locale *locale) le_bool ParagraphLayout::isComplex(UScriptCode script) { if (script < 0 || script >= USCRIPT_CODE_LIMIT) { - return false; + return FALSE; } return complexTable[script]; @@ -810,14 +844,15 @@ void ParagraphLayout::appendRun(ParagraphLayout::Line *line, le_int32 run, le_in le_int32 ch; for (ch = firstChar; ch <= lastChar; ch += 1) { - le_int32 glyph = fCharToGlyphMap[ch]; + le_int32 minGlyph = fCharToMinGlyphMap[ch]; + le_int32 maxGlyph = fCharToMaxGlyphMap[ch]; - if (glyph < leftGlyph) { - leftGlyph = glyph; + if (minGlyph < leftGlyph) { + leftGlyph = minGlyph; } - if (glyph > rightGlyph) { - rightGlyph = glyph; + if (maxGlyph > rightGlyph) { + rightGlyph = maxGlyph; } } @@ -838,12 +873,8 @@ void ParagraphLayout::appendRun(ParagraphLayout::Line *line, le_int32 run, le_in // from the middle of a layout. If we've got a right-to-left run, we // want the left-most glyph to start at the final x position of the // previous run, even though this glyph may be in the middle of the - // layout. - if (run == fFirstVisualRun) { - fVisualRunLastX = - fStyleRunInfo[run].positions[leftGlyph * 2]; - } else if ((fStyleRunInfo[run].level & 1) != 0) { - fVisualRunLastX -= fStyleRunInfo[run].positions[leftGlyph * 2]; - } + // run. + fVisualRunLastX -= fStyleRunInfo[run].positions[leftGlyph * 2]; // Make rightGlyph be the glyph just to the right of // the run's glyphs @@ -943,6 +974,15 @@ le_int32 ParagraphLayout::Line::getLeading() const return fLeading; } +le_int32 ParagraphLayout::Line::getWidth() const +{ + const VisualRun *lastRun = getVisualRun(fRunCount - 1); + le_int32 glyphCount = lastRun->getGlyphCount(); + const float *positions = lastRun->getPositions(); + + return (le_int32) positions[glyphCount * 2]; +} + const ParagraphLayout::VisualRun *ParagraphLayout::Line::getVisualRun(le_int32 runIndex) const { if (runIndex < 0 || runIndex >= fRunCount) { @@ -1000,6 +1040,13 @@ void ParagraphLayout::Line::computeMetrics() const char ParagraphLayout::VisualRun::fgClassID = 0; +ParagraphLayout::VisualRun::~VisualRun() +{ + LE_DELETE_ARRAY(fGlyphToCharMap); + LE_DELETE_ARRAY(fPositions); + LE_DELETE_ARRAY(fGlyphs); +} + U_NAMESPACE_END #endif diff --git a/icuSources/layoutex/RunArrays.cpp b/icuSources/layoutex/RunArrays.cpp index 9e660361..574282ba 100644 --- a/icuSources/layoutex/RunArrays.cpp +++ b/icuSources/layoutex/RunArrays.cpp @@ -16,6 +16,22 @@ U_NAMESPACE_BEGIN const char RunArray::fgClassID = 0; +RunArray::RunArray(le_int32 initialCapacity) + : fClientArrays(FALSE), fLimits(NULL), fCount(0), fCapacity(initialCapacity) +{ + if (initialCapacity > 0) { + fLimits = LE_NEW_ARRAY(le_int32, fCapacity); + } +} + +RunArray::~RunArray() +{ + if (! fClientArrays) { + LE_DELETE_ARRAY(fLimits); + fLimits = NULL; + } +} + le_int32 RunArray::ensureCapacity() { if (fCount >= fCapacity) { @@ -57,6 +73,22 @@ le_int32 RunArray::add(le_int32 limit) const char FontRuns::fgClassID = 0; +FontRuns::FontRuns(le_int32 initialCapacity) + : RunArray(initialCapacity), fFonts(NULL) +{ + if (initialCapacity > 0) { + fFonts = LE_NEW_ARRAY(const LEFontInstance *, initialCapacity); + } +} + +FontRuns::~FontRuns() +{ + if (! fClientArrays) { + LE_DELETE_ARRAY(fFonts); + fFonts = NULL; + } +} + void FontRuns::init(le_int32 capacity) { RunArray::init(capacity); @@ -93,6 +125,22 @@ const LEFontInstance *FontRuns::getFont(le_int32 run) const const char LocaleRuns::fgClassID = 0; +LocaleRuns::LocaleRuns(le_int32 initialCapacity) + : RunArray(initialCapacity), fLocales(NULL) +{ + if (initialCapacity > 0) { + fLocales = LE_NEW_ARRAY(const Locale *, initialCapacity); + } +} + +LocaleRuns::~LocaleRuns() +{ + if (! fClientArrays) { + LE_DELETE_ARRAY(fLocales); + fLocales = NULL; + } +} + void LocaleRuns::init(le_int32 capacity) { RunArray::init(capacity); @@ -129,6 +177,22 @@ const Locale *LocaleRuns::getLocale(le_int32 run) const const char ValueRuns::fgClassID = 0; +ValueRuns::ValueRuns(le_int32 initialCapacity) + : RunArray(initialCapacity), fValues(NULL) +{ + if (initialCapacity > 0) { + fValues = LE_NEW_ARRAY(le_int32, initialCapacity); + } +} + +ValueRuns::~ValueRuns() +{ + if (! fClientArrays) { + LE_DELETE_ARRAY(fValues); + fValues = NULL; + } +} + void ValueRuns::init(le_int32 capacity) { RunArray::init(capacity); diff --git a/icuSources/layoutex/Utilities.cpp b/icuSources/layoutex/Utilities.cpp deleted file mode 100644 index a7796f94..00000000 --- a/icuSources/layoutex/Utilities.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/* - ********************************************************************** - * Copyright (C) 2002, International Business Machines - * Corporation and others. All Rights Reserved. - ********************************************************************** - */ - -#include "layout/LETypes.h" -#include "Utilities.h" - -U_NAMESPACE_BEGIN - -// -// Finds the high bit by binary searching -// through the bits in n. -// -le_int8 Utilities::highBit(le_int32 value) -{ - if (value <= 0) { - return -32; - } - - le_int8 bit = 0; - - if (value >= 1 << 16) { - value >>= 16; - bit += 16; - } - - if (value >= 1 << 8) { - value >>= 8; - bit += 8; - } - - if (value >= 1 << 4) { - value >>= 4; - bit += 4; - } - - if (value >= 1 << 2) { - value >>= 2; - bit += 2; - } - - if (value >= 1 << 1) { - value >>= 1; - bit += 1; - } - - return bit; -} - -le_int32 Utilities::search(le_int32 value, const le_int32 array[], le_int32 count) -{ - le_int32 power = 1 << highBit(count); - le_int32 extra = count - power; - le_int32 probe = power; - le_int32 index = 0; - - if (value >= array[extra]) { - index = extra; - } - - while (probe > (1 << 0)) { - probe >>= 1; - - if (value >= array[index + probe]) { - index += probe; - } - } - - return index; -} - -void Utilities::reverse(le_int32 array[], le_int32 length) -{ - le_int32 front, back; - - for (front = 0, back = length - 1; front < back; front += 1, back -= 1) { - le_int32 swap = array[front]; - - array[front] = array[back]; - array[back] = swap; - } -} - -void Utilities::reverse(float array[], le_int32 length) -{ - le_int32 front, back; - - for (front = 0, back = length - 1; front < back; front += 1, back -= 1) { - float swap = array[front]; - - array[front] = array[back]; - array[back] = swap; - } -} - -U_NAMESPACE_END diff --git a/icuSources/layoutex/Utilities.h b/icuSources/layoutex/Utilities.h deleted file mode 100644 index d63201a4..00000000 --- a/icuSources/layoutex/Utilities.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - ********************************************************************** - * Copyright (C) 2002, International Business Machines - * Corporation and others. All Rights Reserved. - ********************************************************************** - */ - -#ifndef __UTILITIES_H - -#define __UTILITIES_H - -#include "layout/LETypes.h" - -U_NAMESPACE_BEGIN - -class Utilities -{ -public: - static le_int8 highBit(le_int32 value); - static le_int32 search(le_int32 value, const le_int32 array[], le_int32 count); - static void reverse(le_int32 array[], le_int32 count); - static void reverse(float array[], le_int32 count); -}; - -U_NAMESPACE_END -#endif diff --git a/icuSources/layoutex/layout/ParagraphLayout.h b/icuSources/layoutex/layout/ParagraphLayout.h index a2c8e172..7aeb54d3 100644 --- a/icuSources/layoutex/layout/ParagraphLayout.h +++ b/icuSources/layoutex/layout/ParagraphLayout.h @@ -1,6 +1,6 @@ /* ********************************************************************** - * Copyright (C) 2002-2003, International Business Machines + * Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** */ @@ -103,6 +103,17 @@ public: * @draft ICU 2.6 */ le_int32 getLeading() const; + + /** + * Get the width of the line. This is a convenience method + * which returns the last X position of the last visual run + * in the line. + * + * @return the width of the line. + * + * @draft ICU 2.8 + */ + le_int32 getWidth() const; /** * Get a ParagraphLayout::VisualRun object for a given @@ -155,8 +166,8 @@ public: VisualRun **fRuns; Line(); - Line(const Line &other); - Line &operator=(const Line & /*other*/) { return *this; }; + Line(const Line &other); + Line &operator=(const Line & /*other*/) { return *this; }; void computeMetrics(); @@ -172,7 +183,7 @@ public: * a table which maps indices into the glyph array to indices into * the original character array which was used to create the paragraph. * - * These objects are only created by ParagraphLayout::Line objects, + * These objects are only created by ParagraphLayout::Line objects, * so their constructors and destructors are private. * * @see ParagraphLayout::Line @@ -318,8 +329,8 @@ public: friend class Line; VisualRun(); - VisualRun(const VisualRun &other); - VisualRun &operator=(const VisualRun &other) { return *this; }; + VisualRun(const VisualRun &other); + VisualRun &operator=(const VisualRun &other) { return *this; }; VisualRun(const LEFontInstance *font, UBiDiDirection direction, le_int32 glyphCount, const LEGlyphID glyphs[], const float positions[], const le_int32 glyphToCharMap[]); @@ -336,6 +347,9 @@ public: * Clients can optionally specify directional runs and / or script runs. If these aren't specified * they will be computed. * + * If any errors are encountered during construction, status will be set, and the object + * will be set to be empty. + * * @param chars is an array of the characters in the paragraph * * @param count is the number of characters in the paragraph. @@ -356,21 +370,24 @@ public: * * @param paragraphLevel is the directionality of the paragraph, as in the UBiDi object. * - * @param vertical is true if the paragraph should be set vertically. + * @param vertical is TRUE if the paragraph should be set vertically. + * + * @param status will be set to any error code encountered during construction. * * @see ubidi.h * @see LEFontInstance.h * @see LayoutEngine.h * @see RunArrays.h * - * @draft ICU 2.6 + * @draft ICU 2.8 */ ParagraphLayout(const LEUnicode chars[], le_int32 count, const FontRuns *fontRuns, const ValueRuns *levelRuns, const ValueRuns *scriptRuns, const LocaleRuns *localeRuns, - UBiDiLevel paragraphLevel, le_bool vertical); + UBiDiLevel paragraphLevel, le_bool vertical, + LEErrorCode &status); /** * The destructor. Virtual so that it works correctly with @@ -395,7 +412,7 @@ public: * * @param fontRuns is a pointer to a FontRuns object representing the font runs. * - * @return true if the paragraph contains complex text. + * @return TRUE if the paragraph contains complex text. * * @draft ICU 2.6 */ @@ -409,7 +426,7 @@ public: * * @param count is the number of characters in the paragraph. * - * @return true if any of the text requires complex processing. + * @return TRUE if any of the text requires complex processing. * * @draft ICU 2.6 */ @@ -488,7 +505,7 @@ public: * * @return a ParagraphLayout::Line object which represents the line. The caller * is responsible for deleting the object. Returns NULL if there are no - * more lines in the paragraph. + * more lines in the paragraph. * * @see ParagraphLayout::Line * @@ -547,7 +564,7 @@ private: void computeLocales(); - void computeSubFonts(const FontRuns *fontRuns); + void computeSubFonts(const FontRuns *fontRuns, LEErrorCode &status); void computeMetrics(); @@ -580,7 +597,8 @@ private: le_int32 fLeading; le_int32 *fGlyphToCharMap; - le_int32 *fCharToGlyphMap; + le_int32 *fCharToMinGlyphMap; + le_int32 *fCharToMaxGlyphMap; float *fGlyphWidths; le_int32 fGlyphCount; @@ -699,13 +717,6 @@ inline ParagraphLayout::VisualRun::VisualRun(const LEFontInstance *font, UBiDiDi // nothing else needs to be done! } -inline ParagraphLayout::VisualRun::~VisualRun() -{ - LE_DELETE_ARRAY(fGlyphToCharMap); - LE_DELETE_ARRAY(fPositions); - LE_DELETE_ARRAY(fGlyphs); -} - U_NAMESPACE_END #endif #endif diff --git a/icuSources/layoutex/layout/RunArrays.h b/icuSources/layoutex/layout/RunArrays.h index 68f121db..f745bd54 100644 --- a/icuSources/layoutex/layout/RunArrays.h +++ b/icuSources/layoutex/layout/RunArrays.h @@ -1,6 +1,6 @@ /* ********************************************************************** - * Copyright (C) 2003, International Business Machines + * Copyright (C) 2003-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** */ @@ -47,7 +47,8 @@ public: * Construct a RunArray object from a pre-existing * array of limit indices. * - * @param limits is an array of limit indices. + * @param limits is an array of limit indices. This array must remain + * valid until the RunArray object is destroyed. * * @param count is the number of entries in the limit array. * @@ -66,7 +67,7 @@ public: * * @draft ICU 2.6 */ - RunArray(le_int32 initalCapacity); + RunArray(le_int32 initialCapacity); /** * The destructor; virtual so that subclass destructors are invoked as well. @@ -194,9 +195,9 @@ private: le_int32 ensureCapacity(); - RunArray(); - RunArray(const RunArray & /*other*/); - RunArray &operator=(const RunArray & /*other*/) { return *this; }; + RunArray(); + RunArray(const RunArray & /*other*/); + RunArray &operator=(const RunArray & /*other*/) { return *this; }; const le_int32 *fLimits; le_int32 fCount; @@ -204,39 +205,23 @@ private: }; inline RunArray::RunArray() - : UObject(), fClientArrays(false), fLimits(NULL), fCount(0), fCapacity(0) + : UObject(), fClientArrays(FALSE), fLimits(NULL), fCount(0), fCapacity(0) { - // nothing else to do... + // nothing else to do... } inline RunArray::RunArray(const RunArray & /*other*/) - : UObject(), fClientArrays(false), fLimits(NULL), fCount(0), fCapacity(0) + : UObject(), fClientArrays(FALSE), fLimits(NULL), fCount(0), fCapacity(0) { - // nothing else to do... + // nothing else to do... } inline RunArray::RunArray(const le_int32 *limits, le_int32 count) - : UObject(), fClientArrays(true), fLimits(limits), fCount(count), fCapacity(count) + : UObject(), fClientArrays(TRUE), fLimits(limits), fCount(count), fCapacity(count) { // nothing else to do... } -inline RunArray::RunArray(le_int32 initialCapacity) - : fClientArrays(false), fLimits(NULL), fCount(0), fCapacity(initialCapacity) -{ - if (initialCapacity > 0) { - fLimits = LE_NEW_ARRAY(le_int32, fCapacity); - } -} - -inline RunArray::~RunArray() -{ - if (! fClientArrays) { - LE_DELETE_ARRAY(fLimits); - fLimits = NULL; - } -} - inline le_int32 RunArray::getCount() const { return fCount; @@ -269,9 +254,12 @@ public: * Construct a FontRuns object from pre-existing arrays of fonts * and limit indices. * - * @param fonts is the address of an array of pointers to LEFontInstance objects. + * @param fonts is the address of an array of pointers to LEFontInstance objects. This + * array, and the LEFontInstance objects to which it points must remain + * valid until the FontRuns object is destroyed. * - * @param limits is the address of an array of limit indices. + * @param limits is the address of an array of limit indices. This array must remain valid until + * the FontRuns object is destroyed. * * @param count is the number of entries in the two arrays. * @@ -328,7 +316,8 @@ public: * The new add method should first call this method to grow the font and limit indices * arrays, and use the returned run index to store data their own arrays. * - * @param font is the address of the LEFontInstance to add + * @param font is the address of the LEFontInstance to add. This object must + * remain valid until the FontRuns object is destroyed. * * @param limit is the limit index to add * @@ -358,9 +347,9 @@ protected: private: - FontRuns(); - FontRuns(const FontRuns &other); - FontRuns &operator=(const FontRuns & /*other*/) { return *this; }; + FontRuns(); + FontRuns(const FontRuns &other); + FontRuns &operator=(const FontRuns & /*other*/) { return *this; }; /** * The address of this static class variable serves as this class's ID @@ -372,15 +361,15 @@ private: }; inline FontRuns::FontRuns() - : RunArray(0), fFonts(NULL) + : RunArray(0), fFonts(NULL) { - // nothing else to do... + // nothing else to do... } inline FontRuns::FontRuns(const FontRuns & /*other*/) - : RunArray(0), fFonts(NULL) + : RunArray(0), fFonts(NULL) { - // nothing else to do... + // nothing else to do... } inline FontRuns::FontRuns(const LEFontInstance **fonts, const le_int32 *limits, le_int32 count) @@ -389,22 +378,6 @@ inline FontRuns::FontRuns(const LEFontInstance **fonts, const le_int32 *limits, // nothing else to do... } -inline FontRuns::FontRuns(le_int32 initialCapacity) - : RunArray(initialCapacity), fFonts(NULL) -{ - if (initialCapacity > 0) { - fFonts = LE_NEW_ARRAY(const LEFontInstance *, initialCapacity); - } -} - -inline FontRuns::~FontRuns() -{ - if (! fClientArrays) { - LE_DELETE_ARRAY(fFonts); - fFonts = NULL; - } -} - /** * The LocaleRuns class associates pointers to Locale * objects with runs of text. @@ -418,9 +391,12 @@ public: * Construct a LocaleRuns object from pre-existing arrays of locales * and limit indices. * - * @param locales is the address of an array of pointers to Locale objects. + * @param locales is the address of an array of pointers to Locale objects. This array, + * and the Locale objects to which it points, must remain valid until + * the LocaleRuns object is destroyed. * - * @param limits is the address of an array of limit indices. + * @param limits is the address of an array of limit indices. This array must remain valid until the + * LocaleRuns object is destroyed. * * @param count is the number of entries in the two arrays. * @@ -477,7 +453,8 @@ public: * The new add method should first call this method to grow the font and limit indices * arrays, and use the returned run index to store data their own arrays. * - * @param locale is the address of the Locale to add + * @param locale is the address of the Locale to add. This object must remain valid + * until the LocaleRuns object is destroyed. * * @param limit is the limit index to add * @@ -507,9 +484,9 @@ protected: private: - LocaleRuns(); - LocaleRuns(const LocaleRuns &other); - LocaleRuns &operator=(const LocaleRuns & /*other*/) { return *this; }; + LocaleRuns(); + LocaleRuns(const LocaleRuns &other); + LocaleRuns &operator=(const LocaleRuns & /*other*/) { return *this; }; /** * The address of this static class variable serves as this class's ID @@ -521,15 +498,15 @@ private: }; inline LocaleRuns::LocaleRuns() - : RunArray(0), fLocales(NULL) + : RunArray(0), fLocales(NULL) { - // nothing else to do... + // nothing else to do... } inline LocaleRuns::LocaleRuns(const LocaleRuns & /*other*/) - : RunArray(0), fLocales(NULL) + : RunArray(0), fLocales(NULL) { - // nothing else to do... + // nothing else to do... } inline LocaleRuns::LocaleRuns(const Locale **locales, const le_int32 *limits, le_int32 count) @@ -538,22 +515,6 @@ inline LocaleRuns::LocaleRuns(const Locale **locales, const le_int32 *limits, le // nothing else to do... } -inline LocaleRuns::LocaleRuns(le_int32 initialCapacity) - : RunArray(initialCapacity), fLocales(NULL) -{ - if (initialCapacity > 0) { - fLocales = LE_NEW_ARRAY(const Locale *, initialCapacity); - } -} - -inline LocaleRuns::~LocaleRuns() -{ - if (! fClientArrays) { - LE_DELETE_ARRAY(fLocales); - fLocales = NULL; - } -} - /** * The ValueRuns class associates integer values with runs of text. * @@ -566,9 +527,11 @@ public: * Construct a ValueRuns object from pre-existing arrays of values * and limit indices. * - * @param values is the address of an array of integer. + * @param values is the address of an array of integer. This array must remain valid until + * the ValueRuns object is destroyed. * - * @param limits is the address of an array of limit indices. + * @param limits is the address of an array of limit indices. This array must remain valid until + * the ValueRuns object is destroyed. * * @param count is the number of entries in the two arrays. * @@ -655,9 +618,9 @@ protected: private: - ValueRuns(); - ValueRuns(const ValueRuns &other); - ValueRuns &operator=(const ValueRuns & /*other*/) { return *this; }; + ValueRuns(); + ValueRuns(const ValueRuns &other); + ValueRuns &operator=(const ValueRuns & /*other*/) { return *this; }; /** * The address of this static class variable serves as this class's ID @@ -669,15 +632,15 @@ private: }; inline ValueRuns::ValueRuns() - : RunArray(0), fValues(NULL) + : RunArray(0), fValues(NULL) { - // nothing else to do... + // nothing else to do... } inline ValueRuns::ValueRuns(const ValueRuns & /*other*/) - : RunArray(0), fValues(NULL) + : RunArray(0), fValues(NULL) { - // nothing else to do... + // nothing else to do... } inline ValueRuns::ValueRuns(const le_int32 *values, const le_int32 *limits, le_int32 count) @@ -686,21 +649,5 @@ inline ValueRuns::ValueRuns(const le_int32 *values, const le_int32 *limits, le_i // nothing else to do... } -inline ValueRuns::ValueRuns(le_int32 initialCapacity) - : RunArray(initialCapacity), fValues(NULL) -{ - if (initialCapacity > 0) { - fValues = LE_NEW_ARRAY(le_int32, initialCapacity); - } -} - -inline ValueRuns::~ValueRuns() -{ - if (! fClientArrays) { - LE_DELETE_ARRAY(fValues); - fValues = NULL; - } -} - U_NAMESPACE_END #endif diff --git a/icuSources/layoutex/layoutex.dsp b/icuSources/layoutex/layoutex.dsp index 7b892050..6b39d3fc 100644 --- a/icuSources/layoutex/layoutex.dsp +++ b/icuSources/layoutex/layoutex.dsp @@ -55,7 +55,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 ..\..\lib\icuuc.lib ..\..\lib\icule.lib /nologo /dll /machine:I386 /out:"..\..\bin\iculx26.dll" /implib:"..\..\lib\iculx.lib" +# ADD LINK32 ..\..\lib\icuuc.lib ..\..\lib\icule.lib /nologo /dll /machine:I386 /out:"..\..\bin\iculx32.dll" /implib:"..\..\lib\iculx.lib" # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "layoutex - Win32 Debug" @@ -82,7 +82,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 ..\..\lib\icuucd.lib ..\..\lib\iculed.lib /nologo /dll /debug /machine:I386 /out:"..\..\bin\iculx26d.dll" /implib:"..\..\lib\iculxd.lib" /pdbtype:sept +# ADD LINK32 ..\..\lib\icuucd.lib ..\..\lib\iculed.lib /nologo /dll /debug /machine:I386 /out:"..\..\bin\iculx32d.dll" /implib:"..\..\lib\iculxd.lib" /pdbtype:sept # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "layoutex - Win64 Release" @@ -99,7 +99,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LAYOUTEX_EXPORTS" /FD /c -# ADD CPP /nologo /MT /W3 /GX /Zi /O2 /Op /I "..\..\include" /I "..\common" /D "NDEBUG" /D "WIN64" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "U_LAYOUTEX_IMPLEMENTATION" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Zm600 /c +# ADD CPP /nologo /MT /W3 /GX /Zi /O2 /Op /I "..\..\include" /I "..\common" /D "NDEBUG" /D "WIN64" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "U_LAYOUTEX_IMPLEMENTATION" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Zm600 /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win64 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win64 # ADD BASE RSC /l 0x409 /d "NDEBUG" @@ -109,7 +109,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:IX86 /machine:IA64 -# ADD LINK32 ..\..\lib\icuuc.lib ..\..\lib\icule.lib /nologo /dll /machine:IX86 /out:"..\..\bin\iculx26.dll" /implib:"..\..\lib\iculx.lib" /machine:IA64 +# ADD LINK32 ..\..\lib\icuuc.lib ..\..\lib\icule.lib /nologo /dll /machine:IX86 /out:"..\..\bin\iculx32.dll" /implib:"..\..\lib\iculx.lib" /machine:IA64 !ELSEIF "$(CFG)" == "layoutex - Win64 Debug" @@ -125,7 +125,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LAYOUTEX_EXPORTS" /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /Op /I "..\..\include" /I "..\common" /D "_DEBUG" /D "WIN64" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "U_LAYOUTEX_IMPLEMENTATION" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /QIA64_fmaopt /Zm600 /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /Op /I "..\..\include" /I "..\common" /D "_DEBUG" /D "WIN64" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "U_LAYOUTEX_IMPLEMENTATION" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /Zm600 /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win64 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win64 # ADD BASE RSC /l 0x409 /d "_DEBUG" @@ -135,7 +135,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:IX86 /pdbtype:sept /machine:IA64 -# ADD LINK32 ..\..\lib\icuucd.lib ..\..\lib\iculed.lib /nologo /dll /incremental:no /debug /machine:IX86 /out:"..\..\bin\iculx26d.dll" /implib:"..\..\lib\iculxd.lib" /pdbtype:sept /machine:IA64 +# ADD LINK32 ..\..\lib\icuucd.lib ..\..\lib\iculed.lib /nologo /dll /incremental:no /debug /machine:IX86 /out:"..\..\bin\iculx32d.dll" /implib:"..\..\lib\iculxd.lib" /pdbtype:sept /machine:IA64 !ENDIF diff --git a/icuSources/layoutex/layoutex.rc b/icuSources/layoutex/layoutex.rc index 45e4ca5d..2e1c359c 100644 --- a/icuSources/layoutex/layoutex.rc +++ b/icuSources/layoutex/layoutex.rc @@ -1,25 +1,50 @@ -//Do not edit with Microsoft Developer Studio because it will modify this -//script in the wrong way. +// Do not edit with Microsoft Developer Studio Resource Editor. +// It will permanently substitute version numbers that are intended to be +// picked up by the pre-processor during each build. // Copyright (c) 2001-2003 International Business Machines // Corporation and others. All Rights Reserved. // +#include "../common/msvcres.h" + #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // -#include "winresrc.h" - +#include ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// -// +// LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #pragma code_page(1252) -#include "unicode\uversion.h" +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "../common/msvcres.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include \0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + ///////////////////////////////////////////////////////////////////////////// // @@ -55,7 +80,6 @@ BEGIN #else VALUE "OriginalFilename", "iculx" U_ICU_VERSION_SHORT ".dll\0") #endif - VALUE "PrivateBuild", "\0" VALUE "ProductName", "International Components for Unicode\0" VALUE "ProductVersion", CommaVersionString(U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, 0) @@ -70,3 +94,15 @@ END ///////////////////////////////////////////////////////////////////////////// + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/icuSources/layoutex/layoutex.vcproj b/icuSources/layoutex/layoutex.vcproj index e20134dc..021a4488 100644 --- a/icuSources/layoutex/layoutex.vcproj +++ b/icuSources/layoutex/layoutex.vcproj @@ -1,7 +1,7 @@ - + @@ -25,7 +25,7 @@ AdditionalIncludeDirectories="..\..\include,..\common" PreprocessorDefinitions="NDEBUG;WIN32;_WINDOWS;_USRDLL;U_LAYOUTEX_IMPLEMENTATION" StringPooling="TRUE" - RuntimeLibrary="0" + RuntimeLibrary="2" EnableFunctionLevelLinking="TRUE" PrecompiledHeaderFile=".\Release/layoutex.pch" AssemblerListingLocation=".\Release/" @@ -38,12 +38,11 @@ Name="VCCustomBuildTool"/> + TypeLibraryName=".\..\..\lib\iculx.tlb"/> + + + + TypeLibraryName=".\..\..\lib\iculxd.tlb"/> + + + + + + Outputs="..\..\include\layout\$(InputFileName)"/> + Outputs="..\..\include\layout\$(InputFileName)"/> + Outputs="..\..\include\layout\$(InputFileName)"/> + Outputs="..\..\include\layout\$(InputFileName)"/> diff --git a/icuSources/mkinstalldirs b/icuSources/mkinstalldirs index 1e4e4cd8..f579788d 100644 --- a/icuSources/mkinstalldirs +++ b/icuSources/mkinstalldirs @@ -1,7 +1,7 @@ #! /bin/sh # ******************************************************************** # * COPYRIGHT: -# * Copyright (c) 2002, International Business Machines Corporation and +# * Copyright (c) 2002-2004, International Business Machines Corporation and # * others. All Rights Reserved. # ******************************************************************** # mkinstalldirs --- make directory hierarchy @@ -9,8 +9,6 @@ # Created: 1993-05-16 # Public domain -# $Id: mkinstalldirs,v 1.1.1.1 2003/02/05 21:31:12 avery Exp $ - errstatus=0 for file diff --git a/icuSources/runConfigureICU b/icuSources/runConfigureICU index 16527912..e1986053 100755 --- a/icuSources/runConfigureICU +++ b/icuSources/runConfigureICU @@ -1,5 +1,5 @@ #!/bin/sh -# Copyright (c) 1999-2003, International Business Machines Corporation and +# Copyright (c) 1999-2004, International Business Machines Corporation and # others. All Rights Reserved. # runConfigureICU: This script will run the "configure" script for the appropriate platform @@ -32,13 +32,19 @@ The following names can be supplied as the argument for platform: AIX4.3xlC Use IBM's xlC on AIX 4.3 AIX4.3xlC_nothreads Use IBM's xlC on AIX 4.3 with no multithreading AIX4.3VA Use IBM's Visual Age xlC_r compiler on AIX 4.3 + AIXGCC Use GCC on AIX ALPHA/LINUXGCC Use GCC on Alpha/Linux systems ALPHA/LINUXCCC Use Compaq C compiler on Alpha/Linux systems - CygWin Use the GNU C++ compiler on CygWin + BeOS Use the GNU C++ compiler on BeOS + Cygwin Use the GNU C++ compiler on Cygwin + Cygwin/MSVC Use the Microsoft Visual C++ compiler on Cygwin FreeBSD Use the GNU C++ compiler on Free BSD - HP-UX11CC Use HP's C++ compiler on HP-UX 11 HP-UX11ACC Use the Advanced C++ compiler on HP-UX 11 + HP-UX11CC Use HP's C++ compiler on HP-UX 11 LinuxRedHat Use the GNU C++ compiler on Linux + LINUX/ECC Use the Intel ECC compiler on Linux + LINUX/ICC Use the Intel ICC compiler on Linux + LINUX/VA Use IBM's Visual Age compiler on Power PC Linux MacOSX Use the GNU C++ compiler on MacOS X (Darwin) QNX Use QNX's QCC compiler on QNX/Neutrino SOLARISCC Use Sun's CC compiler on Solaris @@ -69,11 +75,11 @@ do ;; --enable-debug) debug=1 - release=0 + OPTS="$OPTS --enable-debug" ;; --disable-release) - debug=0 release=0 + OPTS="$OPTS --disable-release" ;; *) platform="$1" @@ -147,18 +153,13 @@ case $platform in RELEASE_CXXFLAGS="-O2 -qmaxmem=-1" #LDFLAGS=-L/usr/lpp/xlC/lib; export LDFLAGS ;; -# Just use --enable-threads=no. Visual Age makes no distinction between xlC and xlC_r or any other _r programs. -# AIX4.3VA_nothreads) -# THE_OS=AIX -# THE_COMP="xlC" -# # Only in Visual Age, there is no different between xlc and xlc_r. -# CC=`which xlc`; export CC -# CXX=`which xlC`; export CXX -# OPTS="$OPTS --enable-threads=no" -# RELEASE_CFLAGS="-O2 -qmaxmem=-1" -# RELEASE_CXXFLAGS="-O2 -qmaxmem=-1" -# #LDFLAGS=-L/usr/lpp/xlC/lib; export LDFLAGS -# ;; +# For no threads use --enable-threads=no. Visual Age makes no distinction between xlC and xlC_r or any other _r programs. + AIXGCC) + THE_OS=AIX + THE_COMP="gcc" + CC=`which gcc`; export CC + CXX=`which g++`; export CXX + ;; SOLARISX86) THE_OS="SOLARIS X86" THE_COMP="Sun's CC" @@ -189,8 +190,10 @@ case $platform in SOLARISGCC) THE_OS=SOLARIS THE_COMP="the GNU C++" - CXXFLAGS=-I/usr/local/include/g++; export CXXFLAGS - LDFLAGS=-R/usr/local/lib; export LDFLAGS + CXXFLAGS="$CXXFLAGS -I/usr/local/include/g++"; export CXXFLAGS + LDFLAGS="$LDFLAGS -R/usr/local/lib"; export LDFLAGS + RELEASE_CXXFLAGS=-O + RELEASE_CFLAGS=-O3 ;; HP-UX11CC) THE_OS="HP-UX 11" @@ -234,9 +237,46 @@ case $platform in CC=gcc; export CC CXX=g++; export CXX ;; - CygWin) - THE_OS="CygWin" + LINUX/ECC) + THE_OS="Linux" + THE_COMP="Intel ECC 7.1" + CC=ecc; export CC + CXX=ecpc; export CXX + RELEASE_CFLAGS='-O2' + RELEASE_CXXFLAGS='-O2' + ;; + LINUX/ICC) + THE_OS="Linux" + THE_COMP="Intel ICC 6.0" + CC=icc; export CC + CXX=icpc; export CXX + RELEASE_CFLAGS='-O0' + RELEASE_CXXFLAGS='-O0' + ;; + LINUX/VA) + THE_OS="Linux" + THE_COMP="IBM Visual Age C++ Compiler" + CC=`which xlc_r`; export CC + CXX=`which xlC_r`; export CXX + RELEASE_CFLAGS="-O2 -qmaxmem=-1" + RELEASE_CXXFLAGS="-O2 -qmaxmem=-1" + ;; + Cygwin) + THE_OS="Cygwin" THE_COMP="the GNU C++" + RELEASE_CFLAGS='-O3' + RELEASE_CXXFLAGS='-O3' + ;; + Cygwin/MSVC) + THE_OS="Windows with Cygwin" + THE_COMP="Microsoft Visual C++" + CC=cl; export CC + CXX=cl; export CXX + RELEASE_CFLAGS='/O2 /Ob2' + RELEASE_CXXFLAGS='/O2 /Ob2' + # The real debug flags are defined by the mh file because configure can't handle them. + DEBUG_CFLAGS= + DEBUG_CXXFLAGS= ;; MacOSX) THE_OS="MacOS X (Darwin)" @@ -256,6 +296,21 @@ case $platform in CC=qcc; export CC CXX=QCC; export CXX ;; + BeOS) + THE_OS="BeOS" + THE_COMP="the GNU C++" + OPTIMIZATIONS="-fdefault-inline -fdefer-pop -fforce-mem -fforce-addr \ + -finline -finline-functions \ + -fkeep-inline-functions -fkeep-static-consts -fbranch-count-reg \ + -ffunction-cse -fstrength-reduce -fthread-jumps -fcse-follow-jumps \ + -fcse-skip-blocks -frerun-cse-after-loop -frerun-loop-opt \ + -fexpensive-optimizations -foptimize-register-move -fregmove \ + -fschedule-insns -fschedule-insns2 -ffloat-store -funroll-loops \ + -fmove-all-movables -freduce-all-givs -fpeephole \ + -funroll-all-loops -ffunction-sections -fdata-sections" + RELEASE_CFLAGS="$OPTIMIZATIONS" + RELEASE_CXXFLAGS="$OPTIMIZATIONS" + ;; zOS) THE_OS="z/OS (OS/390)" THE_COMP="z/OS 1.2 (through OS/390 v2r10) C/C++" @@ -340,6 +395,11 @@ then CXXFLAGS="$CXXFLAGS $DEBUG_CXXFLAGS" fi export CXXFLAGS + if test "$DEBUG_LDFLAGS" != "" + then + LDFLAGS="$LDFLAGS $DEBUG_LDFLAGS" + fi + export LDFLAGS fi # Run configure @@ -351,4 +411,3 @@ echo echo If the result of the above commands looks okay to you, go to the directory echo source in the ICU distribution to build ICU. Please remember that ICU needs echo GNU make to build properly... - diff --git a/icuSources/samples/Makefile.in b/icuSources/samples/Makefile.in index 8f54112b..bd708031 100644 --- a/icuSources/samples/Makefile.in +++ b/icuSources/samples/Makefile.in @@ -1,5 +1,5 @@ ## Makefile.in for ICU samples -## Copyright (c) 1999-2000, International Business Machines Corporation and +## Copyright (c) 1999-2003, International Business Machines Corporation and ## others. All Rights Reserved. ## Install directory information @@ -20,7 +20,7 @@ include @platform_make_fragment@ CLEANFILES = *~ SUBDIRS = date cal -ALLSUBDIRS = datefmt msgfmt numfmt props translit ucnv udata ufortune uresb ustring break +ALLSUBDIRS = break case datefmt msgfmt numfmt props translit ucnv udata ufortune uresb ustring citer ## List of phony targets .PHONY : all all-local all-recursive install install-local \ diff --git a/icuSources/samples/all/all.sln b/icuSources/samples/all/all.sln index 430ff649..c60a60bd 100644 --- a/icuSources/samples/all/all.sln +++ b/icuSources/samples/all/all.sln @@ -1,80 +1,94 @@ -Microsoft Visual Studio Solution File, Format Version 7.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "all", "all.vcproj", "{77513375-9837-491F-9B0D-C03DF3EF583E}" -EndProject +Microsoft Visual Studio Solution File, Format Version 8.00 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "break", "..\break\break.vcproj", "{794B1E70-7661-4C4F-8083-7CFC1023DB7F}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cal", "..\cal\cal.vcproj", "{F8376996-129E-4650-8F09-72E0E292EFF2}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "case", "..\case\case.vcproj", "{0A81FF07-46D8-4208-932C-B788750521F3}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "date", "..\date\date.vcproj", "{35392F57-D3B4-4259-A053-3A2D5B374D4C}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "datefmt", "..\datefmt\datefmt.vcproj", "{D1FDD479-324A-45EE-AB27-62ED5D721854}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "layout", "..\layout\layout.vcproj", "{EE80B3B5-40F2-46F2-AC4B-FB929683515C}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "legacy", "..\legacy\legacy.vcproj", "{CFD6D1D6-60E8-4A1E-9D31-3B35BB6B482A}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "msgfmt", "..\msgfmt\msgfmt.vcproj", "{0D62472B-CCBF-46CD-AEA1-5DACAD6D05F2}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "numfmt", "..\numfmt\numfmt.vcproj", "{CF07EC2D-94A2-4107-9CAF-087150957AFC}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "props", "..\props\props.vcproj", "{94D972F4-C678-4170-A6FE-30DE6429D97E}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "reader", "..\udata\reader.vcproj", "{10EE4F33-B301-47DB-90C7-1082E5460F7F}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "resources", "..\uresb\resources.vcproj", "{AB75D6BC-660C-4225-A601-CC40294E775E}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "strsrch", "..\strsrch\strsrch.vcproj", "{A7BC6C55-74CE-43BC-A31F-6D4FC9DAD98C}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "translit", "..\translit\translit.vcproj", "{BDA22320-4F5F-4FFB-8C72-413B3C19631D}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "uciter8", "..\uciter8\uciter8.vcproj", "{30B33964-F2D9-4FEF-8D9F-D3F8F1A64B50}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ucnv", "..\ucnv\ucnv.vcproj", "{A918AE69-E876-422E-A780-6E508FBA697F}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ufortune", "..\ufortune\ufortune.vcproj", "{621EF6F2-9E09-49E0-AF19-8417FE8534DF}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ugrep", "..\ugrep\ugrep.vcproj", "{482D52CE-ECE9-4E25-A756-84E3A17F6B30}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "uresb", "..\uresb\uresb.vcproj", "{5AD1AEF5-E13B-4411-BDD8-FF735FADAE1B}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ustring", "..\ustring\ustring.vcproj", "{3A28CC89-98B6-4E9E-B688-DF5651819759}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "writer", "..\udata\writer.vcproj", "{45D0BE49-661A-41A5-AD81-986655688801}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection EndProject Global GlobalSection(SolutionConfiguration) = preSolution - ConfigName.0 = Debug - ConfigName.1 = Release - EndGlobalSection - GlobalSection(ProjectDependencies) = postSolution - {77513375-9837-491F-9B0D-C03DF3EF583E}.0 = {482D52CE-ECE9-4E25-A756-84E3A17F6B30} - {77513375-9837-491F-9B0D-C03DF3EF583E}.1 = {30B33964-F2D9-4FEF-8D9F-D3F8F1A64B50} - {77513375-9837-491F-9B0D-C03DF3EF583E}.2 = {A7BC6C55-74CE-43BC-A31F-6D4FC9DAD98C} - {77513375-9837-491F-9B0D-C03DF3EF583E}.3 = {0A81FF07-46D8-4208-932C-B788750521F3} - {77513375-9837-491F-9B0D-C03DF3EF583E}.4 = {794B1E70-7661-4C4F-8083-7CFC1023DB7F} - {77513375-9837-491F-9B0D-C03DF3EF583E}.5 = {45D0BE49-661A-41A5-AD81-986655688801} - {77513375-9837-491F-9B0D-C03DF3EF583E}.6 = {3A28CC89-98B6-4E9E-B688-DF5651819759} - {77513375-9837-491F-9B0D-C03DF3EF583E}.7 = {5AD1AEF5-E13B-4411-BDD8-FF735FADAE1B} - {77513375-9837-491F-9B0D-C03DF3EF583E}.8 = {621EF6F2-9E09-49E0-AF19-8417FE8534DF} - {77513375-9837-491F-9B0D-C03DF3EF583E}.9 = {A918AE69-E876-422E-A780-6E508FBA697F} - {77513375-9837-491F-9B0D-C03DF3EF583E}.10 = {BDA22320-4F5F-4FFB-8C72-413B3C19631D} - {77513375-9837-491F-9B0D-C03DF3EF583E}.11 = {AB75D6BC-660C-4225-A601-CC40294E775E} - {77513375-9837-491F-9B0D-C03DF3EF583E}.12 = {10EE4F33-B301-47DB-90C7-1082E5460F7F} - {77513375-9837-491F-9B0D-C03DF3EF583E}.13 = {94D972F4-C678-4170-A6FE-30DE6429D97E} - {77513375-9837-491F-9B0D-C03DF3EF583E}.14 = {CF07EC2D-94A2-4107-9CAF-087150957AFC} - {77513375-9837-491F-9B0D-C03DF3EF583E}.15 = {0D62472B-CCBF-46CD-AEA1-5DACAD6D05F2} - {77513375-9837-491F-9B0D-C03DF3EF583E}.16 = {EE80B3B5-40F2-46F2-AC4B-FB929683515C} - {77513375-9837-491F-9B0D-C03DF3EF583E}.17 = {D1FDD479-324A-45EE-AB27-62ED5D721854} - {77513375-9837-491F-9B0D-C03DF3EF583E}.18 = {35392F57-D3B4-4259-A053-3A2D5B374D4C} - {77513375-9837-491F-9B0D-C03DF3EF583E}.19 = {F8376996-129E-4650-8F09-72E0E292EFF2} + Debug = Debug + Release = Release EndGlobalSection GlobalSection(ProjectConfiguration) = postSolution - {77513375-9837-491F-9B0D-C03DF3EF583E}.Debug.ActiveCfg = Debug|Win32 - {77513375-9837-491F-9B0D-C03DF3EF583E}.Debug.Build.0 = Debug|Win32 - {77513375-9837-491F-9B0D-C03DF3EF583E}.Release.ActiveCfg = Release|Win32 - {77513375-9837-491F-9B0D-C03DF3EF583E}.Release.Build.0 = Release|Win32 {794B1E70-7661-4C4F-8083-7CFC1023DB7F}.Debug.ActiveCfg = Debug|Win32 {794B1E70-7661-4C4F-8083-7CFC1023DB7F}.Debug.Build.0 = Debug|Win32 {794B1E70-7661-4C4F-8083-7CFC1023DB7F}.Release.ActiveCfg = Release|Win32 diff --git a/icuSources/samples/break/break.cpp b/icuSources/samples/break/break.cpp index d3a6ee27..90d77efa 100644 --- a/icuSources/samples/break/break.cpp +++ b/icuSources/samples/break/break.cpp @@ -7,7 +7,7 @@ ******************************************************************************* */ -#include +#include #include #include @@ -15,126 +15,129 @@ U_CFUNC int c_main(void); void printUnicodeString(const UnicodeString &s) { - char charBuf[1000]; - s.extract(0, s.length(), charBuf, sizeof(charBuf)-1, 0); - charBuf[sizeof(charBuf)-1] = 0; - cout << charBuf; + char charBuf[1000]; + s.extract(0, s.length(), charBuf, sizeof(charBuf)-1, 0); + charBuf[sizeof(charBuf)-1] = 0; + printf("%s", charBuf); } - void printTextRange( BreakIterator& iterator, - int32_t start, int32_t end ) + int32_t start, int32_t end ) { - CharacterIterator *strIter = iterator.getText().clone(); - UnicodeString s; - strIter->getText(s); - - cout << " " << start << " " << end << " |" ; - printUnicodeString(s); - cout << "|" << '\n'; - delete strIter; + CharacterIterator *strIter = iterator.getText().clone(); + UnicodeString s; + strIter->getText(s); + + printf(" %ld %ld\t", (long)start, (long)end); + printUnicodeString(UnicodeString(s, 0, start)); + printf("|"); + printUnicodeString(UnicodeString(s, start, end-start)); + printf("|"); + printUnicodeString(UnicodeString(s, end)); + puts(""); + delete strIter; } /* Print each element in order: */ void printEachForward( BreakIterator& boundary) { - int32_t start = boundary.first(); - for (int32_t end = boundary.next(); - end != BreakIterator::DONE; - start = end, end = boundary.next()) + int32_t start = boundary.first(); + for (int32_t end = boundary.next(); + end != BreakIterator::DONE; + start = end, end = boundary.next()) { - printTextRange( boundary, start, end ); + printTextRange( boundary, start, end ); } } /* Print each element in reverse order: */ void printEachBackward( BreakIterator& boundary) { - int32_t end = boundary.last(); - for (int32_t start = boundary.previous(); - start != BreakIterator::DONE; - end = start, start = boundary.previous()) + int32_t end = boundary.last(); + for (int32_t start = boundary.previous(); + start != BreakIterator::DONE; + end = start, start = boundary.previous()) { - printTextRange( boundary, start, end ); + printTextRange( boundary, start, end ); } } /* Print the first element */ void printFirst(BreakIterator& boundary) { - int32_t start = boundary.first(); - int32_t end = boundary.next(); - printTextRange( boundary, start, end ); + int32_t start = boundary.first(); + int32_t end = boundary.next(); + printTextRange( boundary, start, end ); } /* Print the last element */ void printLast(BreakIterator& boundary) { - int32_t end = boundary.last(); - int32_t start = boundary.previous(); - printTextRange( boundary, start, end ); + int32_t end = boundary.last(); + int32_t start = boundary.previous(); + printTextRange( boundary, start, end ); } /* Print the element at a specified position */ void printAt(BreakIterator &boundary, int32_t pos ) { - int32_t end = boundary.following(pos); - int32_t start = boundary.previous(); - printTextRange( boundary, start, end ); + int32_t end = boundary.following(pos); + int32_t start = boundary.previous(); + printTextRange( boundary, start, end ); } /* Creating and using text boundaries */ int main( void ) { - cout << "ICU Break Iterator Sample Program\n\n"; - cout << "C++ Break Iteration\n\n"; - BreakIterator* boundary; - UnicodeString stringToExamine("Aaa bbb ccc. Ddd eee fff."); - cout << "Examining: "; - printUnicodeString(stringToExamine); - cout << endl; - - //print each sentence in forward and reverse order - UErrorCode status = U_ZERO_ERROR; - boundary = BreakIterator::createSentenceInstance( - Locale::getUS(), status ); - if (U_FAILURE(status)) { - cout << - "failed to create sentence break iterator. status = " - << u_errorName(status); - exit(1); - } - - boundary->setText(stringToExamine); - cout << "\n Sentence Boundaries... \n"; - cout << "----- forward: -----------" << '\n'; - printEachForward(*boundary); - cout << "----- backward: ----------" << '\n'; - printEachBackward(*boundary); - delete boundary; - - //print each word in order - cout << "\n Word Boundaries... \n"; - boundary = BreakIterator::createWordInstance( - Locale::getUS(), status); - boundary->setText(stringToExamine); - cout << "----- forward: -----------" << '\n'; - printEachForward(*boundary); - //print first element - cout << "----- first: -------------" << '\n'; - printFirst(*boundary); - //print last element - cout << "----- last: --------------" << '\n'; - printLast(*boundary); - //print word at charpos 10 - cout << "----- at pos 10: ---------" << '\n'; - printAt(*boundary, 10 ); - - delete boundary; - cout.flush(); - - // Call the C version - return c_main(); + puts("ICU Break Iterator Sample Program\n"); + puts("C++ Break Iteration\n"); + BreakIterator* boundary; + UnicodeString stringToExamine("Aaa bbb ccc. Ddd eee fff."); + printf("Examining: "); + printUnicodeString(stringToExamine); + puts(""); + + //print each sentence in forward and reverse order + UErrorCode status = U_ZERO_ERROR; + boundary = BreakIterator::createSentenceInstance( + Locale::getUS(), status ); + if (U_FAILURE(status)) { + printf("failed to create sentence break iterator. status = %s", + u_errorName(status)); + exit(1); + } + + boundary->setText(stringToExamine); + puts("\n Sentence Boundaries... "); + puts("----- forward: -----------"); + printEachForward(*boundary); + puts("----- backward: ----------"); + printEachBackward(*boundary); + delete boundary; + + //print each word in order + printf("\n Word Boundaries... \n"); + boundary = BreakIterator::createWordInstance( + Locale::getUS(), status); + boundary->setText(stringToExamine); + puts("----- forward: -----------"); + printEachForward(*boundary); + //print first element + puts("----- first: -------------"); + printFirst(*boundary); + //print last element + puts("----- last: --------------"); + printLast(*boundary); + //print word at charpos 10 + puts("----- at pos 10: ---------"); + printAt(*boundary, 10 ); + + delete boundary; + + puts("\nEnd C++ Break Iteration"); + + // Call the C version + return c_main(); } diff --git a/icuSources/samples/break/break.vcproj b/icuSources/samples/break/break.vcproj index cb3a6b66..7e006f31 100644 --- a/icuSources/samples/break/break.vcproj +++ b/icuSources/samples/break/break.vcproj @@ -1,7 +1,7 @@ - + @@ -65,8 +65,14 @@ Culture="1033"/> + + + + + + + + #include +#include #include "unicode/uloc.h" #include "unicode/udat.h" #include "unicode/ucal.h" -#include "unicode/ures.h" #include "unicode/ustring.h" #include "unicode/uclean.h" @@ -37,21 +37,46 @@ int main(int argc, char **argv) /* Protos */ static void usage(void); + static void version(void); + static void cal(int32_t month, int32_t year, UBool useLongNames, UErrorCode *status); -static void get_days(const UChar *days [], UBool useLongNames, + +static void get_symbols(const UDateFormat *fmt, + UDateFormatSymbolType type, + UChar *array[], + int32_t arrayLength, + int32_t lowestIndex, + int32_t firstIndex, + UErrorCode *status); + +static void free_symbols(UChar *array[], + int32_t arrayLength); + +static void get_days(const UDateFormat *fmt, + UChar *days [], UBool useLongNames, int32_t fdow, UErrorCode *status); -static void get_months(const UChar *months [], UBool useLongNames, + +static void free_days(UChar *days[]); + +static void get_months(const UDateFormat *fmt, + UChar *months [], UBool useLongNames, UErrorCode *status); + +static void free_months(UChar *months[]); + static void indent(int32_t count, FILE *f); -static void print_days(const UChar *days [], FILE *f, UErrorCode *status); + +static void print_days(UChar *days [], FILE *f, UErrorCode *status); + static void print_month(UCalendar *c, - const UChar *days [], + UChar *days [], UBool useLongNames, int32_t fdow, UErrorCode *status); + static void print_year(UCalendar *c, - const UChar *days [], const UChar *months [], + UChar *days [], UChar *months [], UBool useLongNames, int32_t fdow, UErrorCode *status); @@ -129,12 +154,12 @@ main(int argc, /* Month and year specified */ if(argc - optind == 2) { - sscanf(argv[optind], "%d", &month); - sscanf(argv[optind + 1], "%d", &year); + sscanf(argv[optind], "%d", (int*)&month); + sscanf(argv[optind + 1], "%d", (int*)&year); /* Make sure the month value is legal */ if(month < 0 || month > 12) { - printf("icucal: Bad value for month -- %d\n", month); + printf("icucal: Bad value for month -- %d\n", (int)month); /* Display usage */ printUsage = 1; @@ -145,7 +170,7 @@ main(int argc, } /* Only year specified */ else { - sscanf(argv[optind], "%d", &year); + sscanf(argv[optind], "%d", (int*)&year); } } @@ -204,8 +229,8 @@ cal(int32_t month, UErrorCode *status) { UCalendar *c; - const UChar *days [DAY_COUNT]; - const UChar *months [MONTH_COUNT]; + UChar *days [DAY_COUNT]; + UChar *months [MONTH_COUNT]; int32_t fdow; if(U_FAILURE(*status)) return; @@ -224,12 +249,6 @@ cal(int32_t month, /* Determine the first day of the week */ fdow = ucal_getAttribute(c, UCAL_FIRST_DAY_OF_WEEK); - /* Set up the day names */ - get_days(days, useLongNames, fdow, status); - - /* Set up the month names */ - get_months(months, useLongNames, status); - /* Print the calendar for the year */ print_year(c, days, months, useLongNames, fdow, status); } @@ -246,9 +265,6 @@ cal(int32_t month, /* Determine the first day of the week */ fdow = ucal_getAttribute(c, UCAL_FIRST_DAY_OF_WEEK); - /* Set up the day names */ - get_days(days, useLongNames, fdow, status); - /* Print the calendar for the month */ print_month(c, days, useLongNames, fdow, status); } @@ -256,71 +272,105 @@ cal(int32_t month, /* Clean up */ ucal_close(c); } +/* + * Get a set of DateFormat symbols of a given type. + * + * lowestIndex is the index of the first symbol to fetch. + * (e.g. it will be one to fetch day names, since Sunday is + * day 1 *not* day 0.) + * + * firstIndex is the index of the symbol to place first in + * the output array. This is used when fetching day names + * in locales where the week doesn't start on Sunday. + */ +static void get_symbols(const UDateFormat *fmt, + UDateFormatSymbolType type, + UChar *array[], + int32_t arrayLength, + int32_t lowestIndex, + int32_t firstIndex, + UErrorCode *status) +{ + int32_t count, i; + + if (U_FAILURE(*status)) { + return; + } + + count = udat_countSymbols(fmt, type); + + if(count != arrayLength + lowestIndex) { + return; + } + + for(i = 0; i < arrayLength; i++) { + int32_t index = (i + firstIndex) % arrayLength; + int32_t size = 1 + udat_getSymbols(fmt, type, index + lowestIndex, NULL, 0, status); + + array[index] = (UChar *) malloc(sizeof(UChar) * size); + + *status = U_ZERO_ERROR; + udat_getSymbols(fmt, type, index + lowestIndex, array[index], size, status); + } +} + +/* Free the symbols allocated by get_symbols(). */ +static void free_symbols(UChar *array[], + int32_t arrayLength) +{ + int32_t i; + + for(i = 0; i < arrayLength; i++) { + free(array[i]); + } +} /* Get the day names for the specified locale, in either long or short form. Also, reorder the days so that they are in the proper order for the locale (not all locales begin weeks on Sunday; in France, weeks start on Monday) */ static void -get_days(const UChar *days [], +get_days(const UDateFormat *fmt, + UChar *days [], UBool useLongNames, int32_t fdow, UErrorCode *status) { - UResourceBundle *bundle, *dayBundle; - int32_t i, count, dayLen; - const char *key = (useLongNames ? "DayNames" : "DayAbbreviations"); + UDateFormatSymbolType dayType = (useLongNames ? UDAT_WEEKDAYS : UDAT_SHORT_WEEKDAYS); if(U_FAILURE(*status)) return; /* fdow is 1-based */ --fdow; - - bundle = ures_open(0, 0, status); - if(U_FAILURE(*status)) - return; - dayBundle = ures_getByKey(bundle, key, NULL, status); - count = ures_countArrayItems(bundle, key, status); - if(count != DAY_COUNT) - goto finish; /* sanity check */ - for(i = 0; i < count; ++i) { - days[i] = ures_getStringByIndex(dayBundle, ((i + fdow) % DAY_COUNT), &dayLen, status); - } - -finish: - ures_close(dayBundle); - ures_close(bundle); + + get_symbols(fmt, dayType, days, DAY_COUNT, 1, fdow, status); +} + +static void free_days(UChar *days[]) +{ + free_symbols(days, DAY_COUNT); } /* Get the month names for the specified locale, in either long or short form. */ static void -get_months(const UChar *months [], +get_months(const UDateFormat *fmt, + UChar *months [], UBool useLongNames, UErrorCode *status) { - UResourceBundle *bundle, *monthBundle; - int32_t i, count, monthLen; - const char *key = (useLongNames ? "MonthNames" : "MonthAbbreviations"); + UDateFormatSymbolType monthType = (useLongNames ? UDAT_MONTHS : UDAT_SHORT_MONTHS); if(U_FAILURE(*status)) return; - bundle = ures_open(0, 0, status); - if(U_FAILURE(*status)) - return; - monthBundle = ures_getByKey(bundle, key, NULL, status); - count = ures_countArrayItems(bundle, key, status); - if(count < (MONTH_COUNT-1)) /* Some locales have 13 months, no idea why */ - goto finish; /* sanity check */ - for(i = 0; i < count; ++i) { - months[i] = ures_getStringByIndex(monthBundle, i, &monthLen, status); - } - -finish: - ures_close(monthBundle); - ures_close(bundle); + get_symbols(fmt, monthType, months, MONTH_COUNT - 1, 0, 0, status); /* some locales have 13 months, no idea why */ +} + +static void free_months(UChar *months[]) +{ + free_symbols(months, MONTH_COUNT - 1); } /* Indent a certain number of spaces */ @@ -348,7 +398,7 @@ indent(int32_t count, /* Print the days */ static void -print_days(const UChar *days [], +print_days(UChar *days [], FILE *f, UErrorCode *status) { @@ -366,7 +416,7 @@ print_days(const UChar *days [], /* Print out a calendar for c's current month */ static void print_month(UCalendar *c, - const UChar *days [], + UChar *days [], UBool useLongNames, int32_t fdow, UErrorCode *status) @@ -392,6 +442,9 @@ print_month(UCalendar *c, udat_format(dfmt, ucal_getMillis(c, status), s, BUF_SIZE, 0, status); + /* ========== Get the day names */ + get_days(dfmt, days, useLongNames, fdow, status); + /* ========== Print the header */ /* Calculate widths for justification */ @@ -472,6 +525,7 @@ print_month(UCalendar *c, putc('\n', stdout); /* Clean up */ + free_days(days); unum_close(nfmt); udat_close(dfmt); } @@ -479,8 +533,8 @@ print_month(UCalendar *c, /* Print out a calendar for c's current year */ static void print_year(UCalendar *c, - const UChar *days [], - const UChar *months [], + UChar *days [], + UChar *months [], UBool useLongNames, int32_t fdow, UErrorCode *status) @@ -510,7 +564,10 @@ print_year(UCalendar *c, /* Format the date */ udat_format(dfmt, ucal_getMillis(left_cal, status), s, BUF_SIZE, 0, status); - + /* ========== Get the month and day names */ + get_days(dfmt, days, useLongNames, fdow, status); + get_months(dfmt, months, useLongNames, status); + /* ========== Print the header, centered */ /* Calculate widths for justification */ @@ -695,6 +752,8 @@ print_year(UCalendar *c, } /* Clean up */ + free_months(months); + free_days(days); udat_close(dfmt); unum_close(nfmt); ucal_close(right_cal); diff --git a/icuSources/samples/cal/cal.vcproj b/icuSources/samples/cal/cal.vcproj index c29abe1a..99b1886a 100644 --- a/icuSources/samples/cal/cal.vcproj +++ b/icuSources/samples/cal/cal.vcproj @@ -1,7 +1,7 @@ - + @@ -62,8 +62,14 @@ Culture="1033"/> + + + + + + + + #include -#include #include #include U_CFUNC int c_main(UFILE *out); void printUnicodeString(UFILE *out, const UnicodeString &s) { - UnicodeString other = s; - u_fprintf(out, "\"%U\"", other.getTerminatedBuffer()); + UnicodeString other = s; + u_fprintf(out, "\"%S\"", other.getTerminatedBuffer()); } int main( void ) { - UFILE *out; - UErrorCode status = U_ZERO_ERROR; - out = u_finit(stdout, NULL, NULL); - if(!out) { - fprintf(stderr, "Could not initialize (finit()) over stdout! \n"); - return 1; - } - ucnv_setFromUCallBack(u_fgetConverter(out), UCNV_FROM_U_CALLBACK_ESCAPE, - NULL, NULL, NULL, &status); - if(U_FAILURE(status)) { - u_fprintf(out, "Warning- couldn't set the substitute callback - err %s\n", u_errorName(status)); - } - - /* End Demo boilerplate */ - - u_fprintf(out,"ICU Case Mapping Sample Program\n\n"); - u_fprintf(out, "C++ Case Mapping\n\n"); - - UnicodeString string("This is a test"); - /* lowercase = "istanbul" */ - UChar lowercase[] = {0x69, 0x73, 0x74, 0x61, 0x6e, 0x62, 0x75, 0x6c, 0}; - /* uppercase = "LATIN CAPITAL I WITH DOT ABOVE STANBUL" */ - UChar uppercase[] = {0x0130, 0x53, 0x54, 0x41, 0x4e, 0x42, 0x55, 0x4C, 0}; - - UnicodeString upper(uppercase); - UnicodeString lower(lowercase); - - u_fprintf(out, "\nstring: "); - printUnicodeString(out, string); - string.toUpper(); /* string = "THIS IS A TEST" */ - u_fprintf(out, "\ntoUpper(): "); - printUnicodeString(out, string); - string.toLower(); /* string = "this is a test" */ - u_fprintf(out, "\ntoLower(): "); - printUnicodeString(out, string); - - u_fprintf(out, "\n\nlowercase=%U, uppercase=%U\n", lowercase, uppercase); - - - string = upper; - string.toLower(Locale("tr", "TR")); /* Turkish lower case map string = - lowercase */ - u_fprintf(out, "\nupper.toLower: "); - printUnicodeString(out, string); - - string = lower; - string.toUpper(Locale("tr", "TR")); /* Turkish upper case map string = - uppercase */ - u_fprintf(out, "\nlower.toUpper: "); - printUnicodeString(out, string); - - - - u_fprintf(out, "\nEnd C++ sample\n\n"); - - // Call the C version - int rc = c_main(out); - u_fclose(out); - return rc; + UFILE *out; + UErrorCode status = U_ZERO_ERROR; + out = u_finit(stdout, NULL, NULL); + if(!out) { + fprintf(stderr, "Could not initialize (finit()) over stdout! \n"); + return 1; + } + ucnv_setFromUCallBack(u_fgetConverter(out), UCNV_FROM_U_CALLBACK_ESCAPE, + NULL, NULL, NULL, &status); + if(U_FAILURE(status)) { + u_fprintf(out, "Warning- couldn't set the substitute callback - err %s\n", u_errorName(status)); + } + + /* End Demo boilerplate */ + + u_fprintf(out,"ICU Case Mapping Sample Program\n\n"); + u_fprintf(out, "C++ Case Mapping\n\n"); + + UnicodeString string("This is a test"); + /* lowercase = "istanbul" */ + UChar lowercase[] = {0x69, 0x73, 0x74, 0x61, 0x6e, 0x62, 0x75, 0x6c, 0}; + /* uppercase = "LATIN CAPITAL I WITH DOT ABOVE STANBUL" */ + UChar uppercase[] = {0x0130, 0x53, 0x54, 0x41, 0x4e, 0x42, 0x55, 0x4C, 0}; + + UnicodeString upper(uppercase); + UnicodeString lower(lowercase); + + u_fprintf(out, "\nstring: "); + printUnicodeString(out, string); + string.toUpper(); /* string = "THIS IS A TEST" */ + u_fprintf(out, "\ntoUpper(): "); + printUnicodeString(out, string); + string.toLower(); /* string = "this is a test" */ + u_fprintf(out, "\ntoLower(): "); + printUnicodeString(out, string); + + u_fprintf(out, "\n\nlowercase=%S, uppercase=%S\n", lowercase, uppercase); + + + string = upper; + string.toLower(Locale("tr", "TR")); /* Turkish lower case map string = + lowercase */ + u_fprintf(out, "\nupper.toLower: "); + printUnicodeString(out, string); + + string = lower; + string.toUpper(Locale("tr", "TR")); /* Turkish upper case map string = + uppercase */ + u_fprintf(out, "\nlower.toUpper: "); + printUnicodeString(out, string); + + + u_fprintf(out, "\nEnd C++ sample\n\n"); + + // Call the C version + int rc = c_main(out); + u_fclose(out); + return rc; } + diff --git a/icuSources/samples/case/case.vcproj b/icuSources/samples/case/case.vcproj index 6de81eeb..32e064bc 100644 --- a/icuSources/samples/case/case.vcproj +++ b/icuSources/samples/case/case.vcproj @@ -1,7 +1,7 @@ - + @@ -62,8 +62,14 @@ Culture="1033"/> + + + + + + + + %U\n", upper, buffer); + u_fprintf(out, "u_strToLower(%S, turkish) -> %S\n", upper, buffer); /* ustring.h APIs, UChar * string case mapping with a Engish locale */ @@ -66,7 +66,7 @@ int c_main(UFILE *out) u_fprintf(out, "error in u_strToLower(English locale)=%ld error=%s\n", length, u_errorName(errorCode)); } - u_fprintf(out, "u_strToUpper(%U, english) -> %U\n", lower, buffer); + u_fprintf(out, "u_strToUpper(%S, english) -> %S\n", lower, buffer); /* ustring.h APIs, UChar * string case folding */ @@ -78,7 +78,7 @@ int c_main(UFILE *out) u_fprintf(out, "error in u_strFoldCase()=%ld error=%s\n", length, u_errorName(errorCode)); } - u_fprintf(out, "u_strFoldCase(%U, U_FOLD_CASE_DEFAULT) -> %U\n", unfold, buffer); + u_fprintf(out, "u_strFoldCase(%S, U_FOLD_CASE_DEFAULT) -> %S\n", unfold, buffer); u_fprintf(out, "\n** end of C sample\n"); return 0; diff --git a/icuSources/samples/citer/citer.cpp b/icuSources/samples/citer/citer.cpp new file mode 100644 index 00000000..7561e74d --- /dev/null +++ b/icuSources/samples/citer/citer.cpp @@ -0,0 +1,183 @@ +/* +******************************************************************************* +* +* Copyright (C) 2002-2003, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +*/ + +#include "unicode/uchriter.h" +#include "unicode/schriter.h" +#include "unicode/ustring.h" +#include +#include +#include +#include + +void printUnicodeString(const UnicodeString &s) { + char charBuf[1000]; + s.extract(0, s.length(), charBuf, sizeof(charBuf)-1, 0); + charBuf[sizeof(charBuf)-1] = 0; + cout << charBuf; +} + +void printUChar(UChar32 ch) { + char charBuf[1000]; + charBuf[sizeof(charBuf)-1] = 0; + if(ch < 127) { + cout << (char) ch; + } else if (ch == CharacterIterator::DONE) { + cout << "[CharacterIterator::DONE = 0xFFFF]"; + } else { + cout << "[" << ch << "]"; + } +} + +class Test +{ +public: + void TestUChariter(); + void TestStringiter(); +}; + +void Test::TestUChariter() { + const char testChars[] = "Now is the time for all good men to come " + "to the aid of their country."; + + UnicodeString testString(testChars,""); + const UChar *testText = testString.getTerminatedBuffer(); + + UCharCharacterIterator iter(testText, u_strlen(testText)); + UCharCharacterIterator* test2 = (UCharCharacterIterator*)iter.clone(); + + cout << "testText = " << testChars; + + if (iter != *test2 ) { + printf("clone() or equals() failed: Two clones tested unequal\n"); + } + + UnicodeString result1, result2; + // getting and comparing the text within the iterators + iter.getText(result1); + test2->getText(result2); + if (result1 != result2) { + printf("iter.getText() != clone.getText()\n"); + } + + cout << endl; + // Demonstrates seeking forward using the iterator. + cout << "Forward = "; + + UChar c = iter.first(); + printUChar(c); // The first char + int32_t i = 0; + + if (iter.startIndex() != 0 || iter.endIndex() != u_strlen(testText)) { + printf("startIndex() or endIndex() failed\n"); + } + + + // Testing forward iteration... + do { + if (c == CharacterIterator::DONE && i != u_strlen(testText)) { + printf("Iterator reached end prematurely"); + } + else if (c != testText[i]) { + printf("Character mismatch at position %d\n" + i); + } + if (iter.current() != c) { + printf("current() isn't working right"); + } + if (iter.getIndex() != i) { + printf("getIndex() isn't working right\n"); + } + if (c != CharacterIterator::DONE) { + c = iter.next(); + i++; + } + + cout << "|"; + printUChar(c); + + } while (c != CharacterIterator::DONE); + + delete test2; + cout << endl; +} + + +void Test::TestStringiter() { + const char testChars[] = "Now is the time for all good men to come " + "to the aid of their country."; + + UnicodeString testString(testChars,""); + const UChar *testText = testString.getTerminatedBuffer(); + + StringCharacterIterator iter(testText, u_strlen(testText)); + StringCharacterIterator* test2 = (StringCharacterIterator*)iter.clone(); + + if (iter != *test2 ) { + printf("clone() or equals() failed: Two clones tested unequal\n"); + } + + UnicodeString result1, result2; + // getting and comparing the text within the iterators + iter.getText(result1); + test2->getText(result2); + if (result1 != result2) { + printf("getText() failed\n"); + } + + cout << "Backwards: "; + UChar c = iter.last(); + printUChar(c); + int32_t i = iter.endIndex(); + i--; // already printed out the last char + if (iter.startIndex() != 0 || iter.endIndex() != u_strlen(testText)) { + printf("startIndex() or endIndex() failed\n"); + } + + // Testing backward iteration over a range... + do { + if (c == CharacterIterator::DONE) { + printf("Iterator reached end prematurely\n"); + } + else if (c != testText[i]) { + printf("Character mismatch at position %d\n" + i); + } + if (iter.current() != c) { + printf("current() isn't working right\n"); + } + if (iter.getIndex() != i) { + printf("getIndex() isn't working right [%d should be %d]\n", iter.getIndex(), i); + } + if (c != CharacterIterator::DONE) { + c = iter.previous(); + i--; + } + cout << "|"; + printUChar(c); + } while (c != CharacterIterator::DONE); + + cout << endl; + delete test2; +} + +/* Creating and using text boundaries */ +int main( void ) +{ + cout << "ICU Iterator Sample Program (C++)\n\n"; + + Test t; + + cout << endl; + cout << "Test::TestUCharIter()" << endl; + t.TestUChariter(); + cout << "-----" << endl; + cout << "Test::TestStringchariter()" << endl; + t.TestStringiter(); + cout << "-----" << endl; + + return 0; +} diff --git a/icuSources/samples/citer/readme.txt b/icuSources/samples/citer/readme.txt new file mode 100644 index 00000000..2519e742 --- /dev/null +++ b/icuSources/samples/citer/readme.txt @@ -0,0 +1,59 @@ +Copyright (c) 2003, International Business Machines Corporation and others. All Rights Reserved. +citer: Character Iteration + +This sample demonstrates + Using ICU to determine the linguistic boundaries within text + + +Files: + citer.cpp Main source file in C++ + citer.dsw Windows MSVC workspace. Double-click this to get started. + citer.dsp Windows MSVC project file + +To Build citer on Windows + 1. Install and build ICU + 2. In MSVC, open the workspace file icu\samples\citer\citer.dsw + 3. Choose a Debug or Release build. + 4. Build. + +To Run on Windows + 1. Start a command shell window + 2. Add ICU's bin directory to the path, e.g. + set PATH=c:\icu\bin;%PATH% + (Use the path to where ever ICU is on your system.) + 3. cd into the citer directory, e.g. + cd c:\icu\source\samples\citer\debug + 4. Run it + citer + +To Build on Unixes + 1. Build ICU. + Specify an ICU install directory when running configure, + using the --prefix option. The steps to build ICU will look something + like this: + cd /source + runConfigureICU --prefix [other options] + gmake all + + 2. Install ICU, + gmake install + + 3. Compile + cd /source/samples/citer + gmake ICU_PREFIX=/source/samples/citer + + gmake ICU_PREFIX= check + -or- + + export LD_LIBRARY_PATH=/lib:.:$LD_LIBRARY_PATH + citer + + + Note: The name of the LD_LIBRARY_PATH variable is different on some systems. + If in doubt, run the sample using "gmake check", and note the name of + the variable that is used there. LD_LIBRARY_PATH is the correct name + for Linux and Solaris. + diff --git a/icuSources/samples/date/Makefile.in b/icuSources/samples/date/Makefile.in index 761d739c..fc9fa23e 100644 --- a/icuSources/samples/date/Makefile.in +++ b/icuSources/samples/date/Makefile.in @@ -1,18 +1,16 @@ ## Makefile.in for ICU - samples/date -## Copyright (c) 1999-2001, International Business Machines Corporation and +## Copyright (c) 1999-2004, International Business Machines Corporation and ## others. All Rights Reserved. ## Source directory information -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ + +srcdir=@srcdir@ +top_srcdir=@top_srcdir@ top_builddir = ../.. include $(top_builddir)/icudefs.mk -## Platform-specific setup -include @platform_make_fragment@ - ## Build directory information subdir = samples/date @@ -20,14 +18,12 @@ subdir = samples/date CLEANFILES = *~ $(DEPS) ## Target information -TARGET = icudate - -ENABLE_STATIC = @ENABLE_STATIC@ +TARGET = icudate$(EXEEXT) LINK = $(LINK.cc) CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common -I$(top_srcdir)/i18n -LIBS = $(LIBICUI18N) $(LIBICUUC) @LIBS@ @LIB_M@ +LIBS = $(LIBICUI18N) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M) OBJECTS = uprint.o date.o @@ -69,7 +65,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status $(TARGET) : $(OBJECTS) - $(LINK) -o $@ $^ $(LIBS) + $(LINK) $(OUTOPT)$@ $^ $(LIBS) ifeq (,$(MAKECMDGOALS)) -include $(DEPS) diff --git a/icuSources/samples/date/date.vcproj b/icuSources/samples/date/date.vcproj index d0eb5c45..501da735 100644 --- a/icuSources/samples/date/date.vcproj +++ b/icuSources/samples/date/date.vcproj @@ -1,7 +1,7 @@ - + @@ -61,8 +61,14 @@ Culture="1033"/> + + + + + + + + + +extern "C" { extern void c_main(); }; + +void cpp_main() +{ + UErrorCode status = U_ZERO_ERROR; + puts("C++ sample"); + GregorianCalendar* gc = new GregorianCalendar(status); + if (U_FAILURE(status)) { + puts("Couldn't create GregorianCalendar"); + return; + } + /* set up the date */ + gc->set(2000, UCAL_FEBRUARY, 26); + gc->set(UCAL_HOUR_OF_DAY, 23); + gc->set(UCAL_MINUTE, 0); + gc->set(UCAL_SECOND, 0); + gc->set(UCAL_MILLISECOND, 0); + /* Iterate through the days and print it out. */ + for (int32_t i = 0; i < 30; i++) { + /* print out the date. */ + /* You should use the DateFormat to properly format it */ + printf("year: %d, month: %d (%d in the implementation), day: %d\n", + gc->get(UCAL_YEAR, status), + gc->get(UCAL_MONTH, status) + 1, + gc->get(UCAL_MONTH, status), + gc->get(UCAL_DATE, status)); + if (U_FAILURE(status)) + { + puts("Calendar::get failed"); + return; + } + /* Add a day to the date */ + gc->add(UCAL_DATE, 1, status); + if (U_FAILURE(status)) { + puts("Calendar::add failed"); + return; + } + } + delete gc; +} + + +/* Creating and using text boundaries */ +int main( void ) +{ + puts("Date-Calendar sample program"); + + cpp_main(); + + c_main(); + + return 0; +} + diff --git a/icuSources/samples/datecal/ccal.c b/icuSources/samples/datecal/ccal.c new file mode 100644 index 00000000..1b65579f --- /dev/null +++ b/icuSources/samples/datecal/ccal.c @@ -0,0 +1,55 @@ +/* +******************************************************************************* +* +* Copyright (C) 2002-2003, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +*/ + +#include "unicode/ucal.h" +#include + +void c_main() +{ + puts("----"); + puts("C Sample"); + +UErrorCode status = U_ZERO_ERROR; +int32_t i; +UCalendar *cal = ucal_open(NULL, -1, NULL, UCAL_GREGORIAN, &status); +if (U_FAILURE(status)) { + puts("Couldn't create GregorianCalendar"); + return; + } + /* set up the date */ + ucal_set(cal, UCAL_YEAR, 2000); + ucal_set(cal, UCAL_MONTH, UCAL_FEBRUARY); /* FEBRUARY */ + ucal_set(cal, UCAL_DATE, 26); + ucal_set(cal, UCAL_HOUR_OF_DAY, 23); + ucal_set(cal, UCAL_MINUTE, 0); + ucal_set(cal, UCAL_SECOND, 0); + ucal_set(cal, UCAL_MILLISECOND, 0); + /* Iterate through the days and print it out. */ + for (i = 0; i < 30; i++) { + /* print out the date. */ + /* You should use the udat_* API to properly format it */ + printf("year: %d, month: %d (%d in the implementation), day: %d\n", + ucal_get(cal, UCAL_YEAR, &status), + ucal_get(cal, UCAL_MONTH, &status) + 1, + ucal_get(cal, UCAL_MONTH, &status), + ucal_get(cal, UCAL_DATE, &status)); + if (U_FAILURE(status)) { + puts("Calendar::get failed"); + return; + } + /* Add a day to the date */ + ucal_add(cal, UCAL_DATE, 1, &status); + if (U_FAILURE(status)) + { + puts("Calendar::add failed"); + return; + } + } + ucal_close(cal); +} diff --git a/icuSources/samples/datefmt/datefmt.vcproj b/icuSources/samples/datefmt/datefmt.vcproj index 60e2e3d7..3ef44c12 100644 --- a/icuSources/samples/datefmt/datefmt.vcproj +++ b/icuSources/samples/datefmt/datefmt.vcproj @@ -1,7 +1,7 @@ - + @@ -63,8 +63,14 @@ Culture="1033"/> + + + + + + + + rasterizeGlyphs(glyphs, count, dx, dy, xOffset, yOffset); @@ -177,7 +177,7 @@ void GnomeFontInstance::getGlyphAdvance(LEGlyphID glyph, LEPoint &advance) const advance.fX = 0; advance.fY = 0; - if (glyph == 0xFFFF) { + if (glyph >= 0xFFFE) { return; } @@ -204,19 +204,19 @@ le_bool GnomeFontInstance::getGlyphPoint(LEGlyphID glyph, le_int32 pointNumber, error = TT_Load_Glyph(fInstance, fGlyph, glyph, TTLOAD_SCALE_GLYPH | TTLOAD_HINT_GLYPH); if (error != 0) { - return false; + return FALSE; } error = TT_Get_Glyph_Outline(fGlyph, &outline); if (error != 0 || pointNumber >= outline.n_points) { - return false; + return FALSE; } point.fX = outline.points[pointNumber].x >> 6; point.fY = outline.points[pointNumber].y >> 6; - return true; + return TRUE; } // This table was generated by a little Java program. diff --git a/icuSources/samples/layout/GnomeFontMap.cpp b/icuSources/samples/layout/GnomeFontMap.cpp index e189db28..63cc5cd1 100644 --- a/icuSources/samples/layout/GnomeFontMap.cpp +++ b/icuSources/samples/layout/GnomeFontMap.cpp @@ -29,5 +29,12 @@ GnomeFontMap::~GnomeFontMap() const LEFontInstance *GnomeFontMap::openFont(const char *fontName, le_int16 pointSize, LEErrorCode &status) { - return new GnomeFontInstance(fEngine, fontName, pointSize, status); + LEFontInstance *result = new GnomeFontInstance(fEngine, fontName, pointSize, status); + + if (LE_FAILURE(status)) { + delete result; + result = NULL; + } + + return result; } diff --git a/icuSources/samples/layout/LayoutSample.rc b/icuSources/samples/layout/LayoutSample.rc index 0d52b6e2..9b0d3df8 100644 --- a/icuSources/samples/layout/LayoutSample.rc +++ b/icuSources/samples/layout/LayoutSample.rc @@ -15,7 +15,7 @@ * ******************************************************************************* */ -#include "afxres.h" +#include ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS @@ -86,7 +86,7 @@ BEGIN "*\r\n" "*******************************************************************************\r\n" "*/\r\n" - "#include ""afxres.h""\r\n" + "#include \r\n" "\0" END diff --git a/icuSources/samples/layout/Sample.txt b/icuSources/samples/layout/Sample.txt index 70ed6bca..fabac0ef 100644 --- a/icuSources/samples/layout/Sample.txt +++ b/icuSources/samples/layout/Sample.txt @@ -1 +1 @@ -The LayoutEngine does all the work necessary to display Unicode text written in languages with complex writing systems such as Hindi (हिन्दी) Thai (ไทย) and Arabic (العربية). Here's a sample of some text written in Sanskrit: श्रीमद् भगवद्गीता अध्याय अर्जुन विषाद योग धृतराष्ट्र उवाचृ धर्मक्षेत्रे कुरुक्षेत्रे समवेता युयुत्सवः मामकाः पाण्डवाश्चैव किमकुर्वत संजव Here's a sample of some text written in Arabic: أساسًا، تتعامل الحواسيب فقط مع الأرقام، وتقوم بتخزين الأحرف والمحارف الأخرى بعد أن تُعطي رقما معينا لكل واحد منها. وقبل اختراع "يونِكود"، كان هناك مئات الأنظمة للتشفير وتخصيص هذه الأرقام للمحارف، ولم يوجد نظام تشفير واحد يحتوي على جميع المحارف الضرورية and here's a sample of some text written in Thai: บทที่๑พายุไซโคลนโดโรธีอาศัยอยู่ท่ามกลางทุ่งใหญ่ในแคนซัสกับลุงเฮนรีชาวไร่และป้าเอ็มภรรยาชาวไร่บ้านของพวกเขาหลังเล็กเพราะไม้สร้างบ้านต้องขนมาด้วยเกวียนเป็นระยะทางหลายไมล์ +The LayoutEngine does all the work necessary to display Unicode text written in languages with complex writing systems such as Hindi (हिन्दी) Thai (ไทย) and Arabic (العربية). Here's a sample of some text written in Sanskrit: श्रीमद् भगवद्गीता अध्याय अर्जुन विषाद योग धृतराष्ट्र उवाच। धर्मक्षेत्रे कुरुक्षेत्रे समवेता युयुत्सवः मामकाः पाण्डवाश्चैव किमकुर्वत संजय Here's a sample of some text written in Arabic: أساسًا، تتعامل الحواسيب فقط مع الأرقام، وتقوم بتخزين الأحرف والمحارف الأخرى بعد أن تُعطي رقما معينا لكل واحد منها. وقبل اختراع "يونِكود"، كان هناك مئات الأنظمة للتشفير وتخصيص هذه الأرقام للمحارف، ولم يوجد نظام تشفير واحد يحتوي على جميع المحارف الضرورية and here's a sample of some text written in Thai: บทที่๑พายุไซโคลนโดโรธีอาศัยอยู่ท่ามกลางทุ่งใหญ่ในแคนซัสกับลุงเฮนรีชาวไร่และป้าเอ็มภรรยาชาวไร่บ้านของพวกเขาหลังเล็กเพราะไม้สร้างบ้านต้องขนมาด้วยเกวียนเป็นระยะทางหลายไมล์ diff --git a/icuSources/samples/layout/ScriptCompositeFontInstance.cpp b/icuSources/samples/layout/ScriptCompositeFontInstance.cpp index 889711a6..2fbbaca0 100644 --- a/icuSources/samples/layout/ScriptCompositeFontInstance.cpp +++ b/icuSources/samples/layout/ScriptCompositeFontInstance.cpp @@ -57,7 +57,7 @@ le_bool ScriptCompositeFontInstance::getGlyphPoint(LEGlyphID glyph, le_int32 poi return font->getGlyphPoint(LE_GET_GLYPH(glyph), pointNumber, point); } - return false; + return FALSE; } const LEFontInstance *ScriptCompositeFontInstance::getSubFont(const LEUnicode chars[], le_int32 *offset, le_int32 limit, le_int32 script, LEErrorCode &success) const diff --git a/icuSources/samples/layout/gnomelayout.cpp b/icuSources/samples/layout/gnomelayout.cpp index ab1dba37..75edb50d 100644 --- a/icuSources/samples/layout/gnomelayout.cpp +++ b/icuSources/samples/layout/gnomelayout.cpp @@ -225,57 +225,48 @@ gint eventExpose(GtkWidget *widget, GdkEvent *event, Context *context) GtkWidget *newSample(const gchar *fileName) { - gchar *title = NULL; - GtkWidget *app = NULL; - GtkWidget *area = NULL; Context *context = new Context(); context->width = 600; context->height = 400; context->paragraph = Paragraph::paragraphFactory(fileName, font, guiSupport); - if (context->paragraph != NULL) { - GtkStyle *style; - gchar *title = prettyTitle(fileName); + gchar *title = prettyTitle(fileName); + GtkWidget *app = gnome_app_new("gnomeLayout", title); - app = gnome_app_new("gnomeLayout", title); + gtk_object_set_data(GTK_OBJECT(app), "context", context); - gtk_object_set_data(GTK_OBJECT(app), "context", context); + gtk_window_set_default_size(GTK_WINDOW(app), 600 - 24, 400); - gtk_window_set_default_size(GTK_WINDOW(app), 600 - 24, 400); + gnome_app_create_menus_with_data(GNOME_APP(app), mainMenu, app); - gnome_app_create_menus_with_data(GNOME_APP(app), mainMenu, app); + gtk_signal_connect(GTK_OBJECT(app), "delete_event", + GTK_SIGNAL_FUNC(eventDelete), NULL); - gtk_signal_connect(GTK_OBJECT(app), "delete_event", - GTK_SIGNAL_FUNC(eventDelete), NULL); + GtkWidget *area = gtk_drawing_area_new(); + gtk_object_set_data(GTK_OBJECT(app), "area", area); - area = gtk_drawing_area_new(); - gtk_object_set_data(GTK_OBJECT(app), "area", area); + GtkStyle *style = gtk_style_copy(gtk_widget_get_style(area)); -#if 1 - style = gtk_style_copy(gtk_widget_get_style(area)); - - for (int i = 0; i < 5; i += 1) { - style->fg[i] = style->white; - } + for (int i = 0; i < 5; i += 1) { + style->fg[i] = style->white; + } - gtk_widget_set_style(area, style); -#endif + gtk_widget_set_style(area, style); - gnome_app_set_contents(GNOME_APP(app), area); + gnome_app_set_contents(GNOME_APP(app), area); - gtk_signal_connect(GTK_OBJECT(area), - "expose_event", - GTK_SIGNAL_FUNC(eventExpose), - context); + gtk_signal_connect(GTK_OBJECT(area), + "expose_event", + GTK_SIGNAL_FUNC(eventExpose), + context); - gtk_signal_connect(GTK_OBJECT(area), - "configure_event", - GTK_SIGNAL_FUNC(eventConfigure), - context); + gtk_signal_connect(GTK_OBJECT(area), + "configure_event", + GTK_SIGNAL_FUNC(eventConfigure), + context); - appList = g_slist_prepend(appList, app); - } + appList = g_slist_prepend(appList, app); g_free(title); @@ -321,10 +312,12 @@ int main (int argc, char *argv[]) if (argc <= 1) { app = newSample("Sample.txt"); + gtk_widget_show_all(app); } else { for (int i = 1; i < argc; i += 1) { app = newSample(argv[i]); + gtk_widget_show_all(app); } } diff --git a/icuSources/samples/layout/layout.cpp b/icuSources/samples/layout/layout.cpp index b9ee8823..8935fdc0 100644 --- a/icuSources/samples/layout/layout.cpp +++ b/icuSources/samples/layout/layout.cpp @@ -63,7 +63,7 @@ void InitParagraph(HWND hwnd, Context *context) si.nMin = 0; si.nMax = context->paragraph->getLineCount() - 1; si.nPage = context->height / context->paragraph->getLineHeight(); - SetScrollInfo(hwnd, SB_VERT, &si, true); + SetScrollInfo(hwnd, SB_VERT, &si, TRUE); } } @@ -211,7 +211,7 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) } si.fMask = SIF_POS; - SetScrollInfo(hwnd, SB_VERT, &si, true); + SetScrollInfo(hwnd, SB_VERT, &si, TRUE); GetScrollInfo(hwnd, SB_VERT, &si); context = (Context *) GetWindowLong(hwnd, 0); @@ -304,7 +304,7 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) context->paragraph = newParagraph; InitParagraph(hwnd, context); PrettyTitle(hwnd, szTitleName); - InvalidateRect(hwnd, NULL, true); + InvalidateRect(hwnd, NULL, TRUE); } } diff --git a/icuSources/samples/layout/layout.vcproj b/icuSources/samples/layout/layout.vcproj index d34ccd8b..0217997a 100644 --- a/icuSources/samples/layout/layout.vcproj +++ b/icuSources/samples/layout/layout.vcproj @@ -1,7 +1,7 @@ - + @@ -61,8 +61,14 @@ Culture="1033"/> + + + + + + + + + + @@ -140,27 +157,27 @@ RelativePath=".\GDIGUISupport.cpp"> - - + RelativePath=".\layout.cpp"> + RelativePath=".\LayoutSample.rc"> + RelativePath=".\paragraph.cpp"> + RelativePath=".\ScriptCompositeFontInstance.cpp"> + RelativePath=".\UnicodeReader.cpp"> + + @@ -180,25 +197,22 @@ RelativePath=".\GUISupport.h"> - - + RelativePath=".\paragraph.h"> + RelativePath=".\RenderingSurface.h"> + RelativePath=".\resource.h"> + RelativePath=".\ScriptCompositeFontInstance.h"> + RelativePath=".\sfnt.h"> + RelativePath=".\UnicodeReader.h"> getAscent(); le_int32 descent = fParagraphLayout->getDescent(); @@ -102,6 +112,13 @@ void Paragraph::draw(RenderingSurface *surface, le_int32 firstLine, le_int32 las le_int32 runCount = line->countRuns(); le_int32 run; + if (fParagraphLayout->getParagraphLevel() == UBIDI_RTL) { + le_int32 lastX = line->getWidth(); + + x = (fWidth - lastX - MARGIN); + } + + for (run = 0; run < runCount; run += 1) { const ParagraphLayout::VisualRun *visualRun = line->getVisualRun(run); le_int32 glyphCount = visualRun->getGlyphCount(); @@ -118,8 +135,7 @@ void Paragraph::draw(RenderingSurface *surface, le_int32 firstLine, le_int32 las Paragraph *Paragraph::paragraphFactory(const char *fileName, const LEFontInstance *font, GUISupport *guiSupport) { - LEErrorCode fontStatus = LE_NO_ERROR; - UErrorCode scriptStatus = U_ZERO_ERROR; + LEErrorCode status = LE_NO_ERROR; le_int32 charCount; const UChar *text = UnicodeReader::readFile(fileName, guiSupport, charCount); Paragraph *result = NULL; @@ -132,7 +148,12 @@ Paragraph *Paragraph::paragraphFactory(const char *fileName, const LEFontInstanc fontRuns.add(font, charCount); - result = new Paragraph(text, charCount, &fontRuns); + result = new Paragraph(text, charCount, &fontRuns, status); + + if (LE_FAILURE(status)) { + delete result; + result = NULL; + } LE_DELETE_ARRAY(text); diff --git a/icuSources/samples/layout/paragraph.h b/icuSources/samples/layout/paragraph.h index 86f0c625..67db5eb3 100644 --- a/icuSources/samples/layout/paragraph.h +++ b/icuSources/samples/layout/paragraph.h @@ -33,7 +33,7 @@ class LineInfo; class Paragraph { public: - Paragraph(const LEUnicode chars[], le_int32 charCount, const FontRuns *fontRuns); + Paragraph(const LEUnicode chars[], le_int32 charCount, const FontRuns *fontRuns, LEErrorCode &status); ~Paragraph(); diff --git a/icuSources/samples/legacy/Makefile b/icuSources/samples/legacy/Makefile index a2b0f16d..f47c300c 100644 --- a/icuSources/samples/legacy/Makefile +++ b/icuSources/samples/legacy/Makefile @@ -1,5 +1,5 @@ -# Copyright (c) 2001 IBM, Inc. and others -# conversion sample code $Revision: 1.1.1.1 $ +# Copyright (c) 2001-2004 IBM, Inc. and others +# conversion sample code # Usage: diff --git a/icuSources/samples/legacy/legacy.vcproj b/icuSources/samples/legacy/legacy.vcproj index d28ee305..6c1f2f93 100644 --- a/icuSources/samples/legacy/legacy.vcproj +++ b/icuSources/samples/legacy/legacy.vcproj @@ -1,7 +1,7 @@ - + @@ -61,8 +61,14 @@ Culture="1033"/> + + + + + + + + #include +#include #include // Very simple example code - sticks a sortkey in the buffer diff --git a/icuSources/samples/msgfmt/msgfmt.vcproj b/icuSources/samples/msgfmt/msgfmt.vcproj index 21c0d51c..753e04cf 100644 --- a/icuSources/samples/msgfmt/msgfmt.vcproj +++ b/icuSources/samples/msgfmt/msgfmt.vcproj @@ -1,7 +1,7 @@ - + @@ -62,8 +62,14 @@ Culture="1033"/> + + + + + + + + + @@ -63,8 +63,14 @@ Culture="1033"/> + + + + + + + + + @@ -61,8 +61,14 @@ Culture="1033"/> + + + + + + + + + @@ -63,8 +63,14 @@ Culture="1033"/> + + + + + + + + + @@ -63,8 +63,14 @@ Culture="1033"/> + + + + + + + + + @@ -63,8 +63,14 @@ Culture="1033"/> + + + + + + + + + @@ -63,8 +63,14 @@ Culture="1033"/> + + + + + + + + #endif #include "unicode/utypes.h" +#include "unicode/putil.h" #include "unicode/udata.h" #define DATA_NAME "example" diff --git a/icuSources/samples/udata/reader.vcproj b/icuSources/samples/udata/reader.vcproj index aff2ec4b..ad00eedd 100644 --- a/icuSources/samples/udata/reader.vcproj +++ b/icuSources/samples/udata/reader.vcproj @@ -1,7 +1,7 @@ - + @@ -12,8 +12,8 @@ + TypeLibraryName=".\reader_Win32_Debug/reader.tlb"/> + + + @@ -97,15 +103,15 @@ Name="VCLinkerTool" AdditionalOptions="/MACHINE:I386" AdditionalDependencies="icuuc.lib" - OutputFile=".\Release/reader.exe" + OutputFile=".\reader_Win32_Release/reader.exe" LinkIncremental="1" SuppressStartupBanner="TRUE" AdditionalLibraryDirectories="../../../lib" - ProgramDatabaseFile=".\Release/reader.pdb" + ProgramDatabaseFile=".\reader_Win32_Release/reader.pdb" SubSystem="1"/> + TypeLibraryName=".\reader_Win32_Release/reader.tlb"/> + + + + + + @@ -63,8 +63,14 @@ Culture="1033"/> + + + + + + + + + @@ -62,8 +62,14 @@ Culture="1033"/> + + + + + + + + + + + + + + + + + Outputs="resources\fortune_resources.DLL"/> @@ -152,18 +180,11 @@ copy Fortune_Resources.DLL ..\$(TargetDir) Name="VCCustomBuildTool" CommandLine="cd resources nmake -f fortune_resources.mak -copy Fortune_Resources.DLL ..\$(TargetDir) +copy Fortune_Resources.DLL "$(TargetDir)" " - Outputs="phony-output"/> + Outputs="resources\fortune_resources.DLL"/> - - - - diff --git a/icuSources/samples/ugrep/ugrep.sln b/icuSources/samples/ugrep/ugrep.sln index 11e6af6b..b634c7d1 100644 --- a/icuSources/samples/ugrep/ugrep.sln +++ b/icuSources/samples/ugrep/ugrep.sln @@ -1,18 +1,18 @@ -Microsoft Visual Studio Solution File, Format Version 7.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ugrep", "ugrep.vcproj", "{E5742DB5-B6E7-4895-825A-CA03FC0A59D0}" +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ugrep", "ugrep.vcproj", "{63166CEB-02CC-472C-B3B7-E6C559939BDA}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection EndProject Global GlobalSection(SolutionConfiguration) = preSolution - ConfigName.0 = Debug - ConfigName.1 = Release - EndGlobalSection - GlobalSection(ProjectDependencies) = postSolution + Debug = Debug + Release = Release EndGlobalSection GlobalSection(ProjectConfiguration) = postSolution - {E5742DB5-B6E7-4895-825A-CA03FC0A59D0}.Debug.ActiveCfg = Debug|Win32 - {E5742DB5-B6E7-4895-825A-CA03FC0A59D0}.Debug.Build.0 = Debug|Win32 - {E5742DB5-B6E7-4895-825A-CA03FC0A59D0}.Release.ActiveCfg = Release|Win32 - {E5742DB5-B6E7-4895-825A-CA03FC0A59D0}.Release.Build.0 = Release|Win32 + {63166CEB-02CC-472C-B3B7-E6C559939BDA}.Debug.ActiveCfg = Debug|Win32 + {63166CEB-02CC-472C-B3B7-E6C559939BDA}.Debug.Build.0 = Debug|Win32 + {63166CEB-02CC-472C-B3B7-E6C559939BDA}.Release.ActiveCfg = Release|Win32 + {63166CEB-02CC-472C-B3B7-E6C559939BDA}.Release.Build.0 = Release|Win32 EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution EndGlobalSection diff --git a/icuSources/samples/ugrep/ugrep.vcproj b/icuSources/samples/ugrep/ugrep.vcproj index 7d84b281..c6d471a5 100644 --- a/icuSources/samples/ugrep/ugrep.vcproj +++ b/icuSources/samples/ugrep/ugrep.vcproj @@ -1,7 +1,7 @@ - + @@ -11,46 +11,48 @@ + ProgramDatabaseFile=".\Release/ugrep.pdb" + SubSystem="1" + TargetMachine="1"/> + TypeLibraryName=".\Release/ugrep.tlb" + HeaderFileName=""/> + + + + GenerateDebugInformation="TRUE" + ProgramDatabaseFile=".\Debug/ugrep.pdb" + SubSystem="1" + TargetMachine="1"/> + TypeLibraryName=".\Debug/ugrep.tlb" + HeaderFileName=""/> + + + + + + RelativePath="ugrep.cpp"> + + + + + + + + OutputDirectory=".\resources_Win32_Debug" + IntermediateDirectory=".\resources_Win32_Debug" + ConfigurationType="0"> + Output="uresb_root.res"/> + OutputDirectory=".\resources_Win32_Release" + IntermediateDirectory=".\resources_Win32_Release" + ConfigurationType="0"> + Output="uresb_root.res"/> + + - - - - + Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;txt"> + + + + + + diff --git a/icuSources/samples/uresb/uresb.c b/icuSources/samples/uresb/uresb.c index 6368bad3..9534b96e 100644 --- a/icuSources/samples/uresb/uresb.c +++ b/icuSources/samples/uresb/uresb.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -20,6 +20,7 @@ * TODO: make a complete i18n layout for this program. ******************************************************************************/ +#include "unicode/putil.h" #include "unicode/ures.h" #include "unicode/ustdio.h" #include "unicode/uloc.h" @@ -239,9 +240,9 @@ void printOutBundle(UFILE *out, UResourceBundle *resource, int32_t indent, UErro */ printIndent(out, indent); if(key != NULL) { - u_fprintf(out, "%s { \"%U\" } ", key, string); + u_fprintf(out, "%s { \"%S\" } ", key, string); } else { - u_fprintf(out, "\"%U\",", string); + u_fprintf(out, "\"%S\",", string); } if(VERBOSE) { u_fprintf(out, " // STRING"); diff --git a/icuSources/samples/uresb/uresb.vcproj b/icuSources/samples/uresb/uresb.vcproj index 809d8be0..487152c5 100644 --- a/icuSources/samples/uresb/uresb.vcproj +++ b/icuSources/samples/uresb/uresb.vcproj @@ -1,7 +1,7 @@ - + @@ -61,8 +61,14 @@ Culture="3098"/> + + + + + + + + + @@ -62,8 +62,14 @@ Culture="1033"/> + + + + + + + + -#include -#include -#include -#include -#include -#include -#include -#include "DOMTreeErrorReporter.hpp" - -class ChildName -{ - public: - DOMString Name; - ChildName* Next; - - ChildName(){}; - - void SetName(DOMString name); - void SetNext(ChildName* next); -}; - -#endif diff --git a/icuSources/samples/xml2txt/DOMPrintFormatTarget.cpp b/icuSources/samples/xml2txt/DOMPrintFormatTarget.cpp deleted file mode 100644 index 9bd214f3..00000000 --- a/icuSources/samples/xml2txt/DOMPrintFormatTarget.cpp +++ /dev/null @@ -1,23 +0,0 @@ -/****************************************************************************** - * Copyright (C) 2002, International Business Machines Corporation and - * others. All Rights Reserved. - ******************************************************************************/ -#include "DOMPrintFormatTarget.h" - -DOMPrintFormatTarget::DOMPrintFormatTarget() { - -}; - -DOMPrintFormatTarget::DOMPrintFormatTarget(char* fileName) { - this->fileName = fileName; -} - -DOMPrintFormatTarget::~DOMPrintFormatTarget() {}; - -void DOMPrintFormatTarget :: writeChars(const XMLByte* const toWrite, - const unsigned int count, - XMLFormatter * const formatter) -{ - ofstream ofile( fileName, ios::app); - ofile.write((char *) toWrite, (int) count); -}; diff --git a/icuSources/samples/xml2txt/DOMPrintFormatTarget.h b/icuSources/samples/xml2txt/DOMPrintFormatTarget.h deleted file mode 100644 index 650bfb16..00000000 --- a/icuSources/samples/xml2txt/DOMPrintFormatTarget.h +++ /dev/null @@ -1,33 +0,0 @@ -/****************************************************************************** - * Copyright (C) 2002, International Business Machines Corporation and - * others. All Rights Reserved. - ******************************************************************************/ -#ifndef DOMPRINTFORMATTARGET_H_ -#define DOMPRINTFORMATTARGET_H_ -#include "ChildName.h" -#include -class DOMPrintFormatTarget : public XMLFormatTarget -{ -private: - char* fileName; -public: - DOMPrintFormatTarget(); - DOMPrintFormatTarget(char* fileName); - ~DOMPrintFormatTarget(); - // ----------------------------------------------------------------------- - // Implementations of the format target interface - // ----------------------------------------------------------------------- - - void writeChars(const XMLByte* const toWrite, - const unsigned int count, - XMLFormatter * const formatter); - -private: - // ----------------------------------------------------------------------- - // Unimplemented methods. - // ----------------------------------------------------------------------- - DOMPrintFormatTarget(const DOMPrintFormatTarget& other); - void operator=(const DOMPrintFormatTarget& rhs); -}; - -#endif diff --git a/icuSources/samples/xml2txt/DOMTreeErrorReporter.cpp b/icuSources/samples/xml2txt/DOMTreeErrorReporter.cpp deleted file mode 100644 index 9e503e39..00000000 --- a/icuSources/samples/xml2txt/DOMTreeErrorReporter.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/****************************************************************************** - * Copyright (C) 2002, International Business Machines Corporation and - * others. All Rights Reserved. - ******************************************************************************/ -// --------------------------------------------------------------------------- -// Includes -// --------------------------------------------------------------------------- -#include -#include "DOMTreeErrorReporter.hpp" -#include -#include -#include -#include - -extern ostream& operator<<(ostream& target, const DOMString& s); - -void DOMTreeErrorReporter::warning(const SAXParseException&) -{ -} - -void DOMTreeErrorReporter::error(const SAXParseException& toCatch) -{ - fSawErrors = true; - cerr << "Error at file \"" << DOMString(toCatch.getSystemId()) - << "\", line " << toCatch.getLineNumber() - << ", column " << toCatch.getColumnNumber() - << "\n Message: " << DOMString(toCatch.getMessage()) << endl; -} - -void DOMTreeErrorReporter::fatalError(const SAXParseException& toCatch) -{ - fSawErrors = true; - cerr << "Fatal Error at file \"" << DOMString(toCatch.getSystemId()) - << "\", line " << toCatch.getLineNumber() - << ", column " << toCatch.getColumnNumber() - << "\n Message: " << DOMString(toCatch.getMessage()) << endl; -} - -void DOMTreeErrorReporter::resetErrors() -{ -} diff --git a/icuSources/samples/xml2txt/DOMTreeErrorReporter.hpp b/icuSources/samples/xml2txt/DOMTreeErrorReporter.hpp deleted file mode 100644 index daf45966..00000000 --- a/icuSources/samples/xml2txt/DOMTreeErrorReporter.hpp +++ /dev/null @@ -1,51 +0,0 @@ -/****************************************************************************** - * Copyright (C) 2002, International Business Machines Corporation and - * others. All Rights Reserved. - ******************************************************************************/ -#include -#include -#include - -class DOMTreeErrorReporter : public ErrorHandler -{ -public: - // ----------------------------------------------------------------------- - // Constructors and Destructor - // ----------------------------------------------------------------------- - DOMTreeErrorReporter() : - fSawErrors(false) - { - } - - ~DOMTreeErrorReporter() - { - } - - // ----------------------------------------------------------------------- - // Implementation of the error handler interface - // ----------------------------------------------------------------------- - void warning(const SAXParseException& toCatch); - void error(const SAXParseException& toCatch); - void fatalError(const SAXParseException& toCatch); - void resetErrors(); - - // ----------------------------------------------------------------------- - // Getter methods - // ----------------------------------------------------------------------- - bool getSawErrors() const; - - // ----------------------------------------------------------------------- - // Private data members - // - // fSawErrors - // This is set if we get any errors, and is queryable via a getter - // method. Its used by the main code to suppress output if there are - // errors. - // ----------------------------------------------------------------------- - bool fSawErrors; -}; - -inline bool DOMTreeErrorReporter::getSawErrors() const -{ - return fSawErrors; -} diff --git a/icuSources/samples/xml2txt/readme.txt b/icuSources/samples/xml2txt/readme.txt index 35ac470c..30158ad2 100644 --- a/icuSources/samples/xml2txt/readme.txt +++ b/icuSources/samples/xml2txt/readme.txt @@ -1 +1,3 @@ +Copyright (c) 2002-2003, International Business Machines Corporation and others. All Rights Reserved. + The xml2txt sample has been deprecated. It was a demonstration of converting ICU4C XML resource bundles into .txt resource bundles. Since it was written, the ICU4C XML resource bundle format has been depreceated, and ICU now uses XLIFF (XML Localization Interchange File Format) instead. \ No newline at end of file diff --git a/icuSources/samples/xml2txt/xml2res.pl b/icuSources/samples/xml2txt/xml2res.pl deleted file mode 100644 index 125779c5..00000000 --- a/icuSources/samples/xml2txt/xml2res.pl +++ /dev/null @@ -1,124 +0,0 @@ -#/usr/bin/perl - -#################################################################################### -# xml2res.pl: -# This tool invokes xml2txt and genrb to produce res files from xml files -# Author: Ram Viswanadha -# -#################################################################################### -use File::Find; -use File::Basename; -use IO::File; -use Cwd; -use File::Copy; -use Getopt::Long; -use File::Path; -use File::Copy; - -GetOptions( - "--lib=s" => \$envVar, - "--icuroot=s" => \$icuRoot, - "--xerces=s" => \$xercesBin, - "--xml2txt=s" => \$xml2txt, - "--genrb=s" => \$genrb, - "--sourcedir=s" => \$sourceDir, - "--destdir=s" => \$destDir); - - -usage() unless defined $icuRoot; -usage() unless defined $xercesBin; -usage() unless defined $sourceDir; -usage() unless defined $destDir; -usage() unless defined $xml2txt; -usage() unless defined $genrb; - -# create a temp directory and copy all the txt files there -my $tempDir = $destDir."/temp"; -mkpath($tempDir); -my $prefix; - -# set up environment -if($$^O =~ /win/){ - $prefix =""; - cmd("set PATH=%PATH%;$icuRoot/bin;$xercesBin;"); -}else{ - $prefix ="$ldVar=$ICU_ROOT/source/common:$ICU_ROOT/source/i18n:$ICU_ROOT/source/tools/toolutil:$ICU_ROOT/source/data/out:$ICU_ROOT/source/data: " -} - -# create list of xml files -my @list; -if (@ARGV) { - @list = @ARGV; - foreach (@list) { $_ .= ".xml" unless (/\.xml$/i); } -} else { - opendir(DIR,$sourceDir); - @list = grep{/\.xml$/} readdir(DIR); - closedir(DIR); -} - -# now convert -foreach $item (@list){ - next if($item eq "." || $item eq ".."); - texify($item); - $txt = $item;; - $txt =~ s/xml$/txt/i; - resify($txt); -} - -# run the xml2txt converter -sub texify{ - my $infile = shift; - my $xml2txtExec = $xml2txt."/xml2txt"; - cmd("$prefix $xml2txtExec --sourcedir $sourceDir --destdir $tempDir $infile"); -} - -# run genrb -sub resify{ - my $infile = shift; - my $genrbExec = $genrb."/genrb"; - cmd("$prefix $genrbExec --sourcedir $tempDir --destdir $destDir --encoding UTF8 $infile"); -} - -#----------------------------------------------------------------------- -# Execute a command -# Param: Command -# Param: Display line, or '' to display command -sub cmd { - my $cmd = shift; - my $prompt = shift; - $prompt = "Command: $cmd.." unless ($prompt); - print $prompt; - system($cmd); - my $exit_value = $? >> 8; - #my $signal_num = $? & 127; - #my $dumped_core = $? & 128; - if ($exit_value == 0) { - print "ok\n"; - } else { - ++$errCount; - print "ERROR ($exit_value)\n"; - exit(1); - } -} - -#----------------------------------------------------------------------- -sub usage { - print << "END"; -Usage: -xml2res.pl -Options: - --lib= - --sourcedir= - --icuroot= - --xerces= - --xml2txt= - --genrb= - -xml2res creates *.res file from *.xml files by invoking the respective tools -Optionally, one or more locales may be specified on the command line. -If this is done, only those locales will be processed. If no locales -are listed, all locales are processed. - -END - exit(0); -} \ No newline at end of file diff --git a/icuSources/samples/xml2txt/xml2txt.cpp b/icuSources/samples/xml2txt/xml2txt.cpp deleted file mode 100644 index 0fe34e9e..00000000 --- a/icuSources/samples/xml2txt/xml2txt.cpp +++ /dev/null @@ -1,903 +0,0 @@ -/****************************************************************************** - * Copyright (C) 2002, International Business Machines Corporation and - * others. All Rights Reserved. - ******************************************************************************/ -#include "xml2txt.h" - -static bool DTDFLAG = false; -static char* gTxtFile; -static char* gXmlFile; -static const char *sourceDir; -static const char *destDir; -static bool gDoNamespaces = false; -static bool gDoSchema = false; -static bool gDoCreate = false; -static XMLCh* gEncodingName = 0; -static XMLFormatter::UnRepFlags gUnRepFlags = XMLFormatter::UnRep_CharRef; -static DOMParser::ValSchemes gValScheme = DOMParser::Val_Auto; -static XMLFormatter* gFormatter = 0; - - - -enum -{ - HELP, - SOURCEDIR, - DESTDIR, -}; -//#define UOPTION_TXT UOPTION_DEF("txt", 't', UOPT_NO_ARG) -//#define UOPTION_RES UOPTION_DEF("res", 'r', UOPT_NO_ARG) - -UOption options[]={ - UOPTION_HELP_H, - UOPTION_SOURCEDIR, - UOPTION_DESTDIR, - }; - - - -#ifdef XP_MAC_CONSOLE -#include -#endif - - -// --------------------------------------------------------------------------- -// -// Usage() -// -// --------------------------------------------------------------------------- -void usage() -{ - cout << "\nUsage: XML2TXT [OPTIONS] [FILES]\n\n" - "This program is used to convert XML files to TXT files.\n" - "Please refer to the following options. Options are not \n" - "case sensitive.\n" - "Options:\n" - "\t-s or --sourcedir \t source directory for files followed by path, default is current directory.\n" - "\t-d or --destdir \t destination directory, followed by the path, default is current directory.\n" - "\t-h or -? or --help \t this usage text.\n" - "\nAttention: \n" - "\tThe text file's encoding is the same as the source file's.\n" - - << endl; -} - -int main(int argC, char* argV[]) -{ - int retval = 0; - const char* arg=NULL; - - try - { - XMLPlatformUtils::Initialize(); - } - - catch(const XMLException& toCatch) - { - cerr << "Error during Xerces-c Initialization.\n" - << " Exception message:" - << DOMString(toCatch.getMessage()) << endl; - return 1; - } - - #ifdef XP_MAC_CONSOLE - - argC = ccommand((char***)&argV); - #endif - - argC = u_parseArgs(argC, argV, (int32_t)(sizeof(options)/sizeof(options[0])), options); - - if(argC<0) { - cout << "error in command line argument" << argV[-argC] << endl; - } - - // Watch for special case help request - if(argC<2 || options[HELP].doesOccur) { - usage(); - return argC < 0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR; - } - - if(options[SOURCEDIR].doesOccur) { - sourceDir = options[SOURCEDIR].value; - } - else { - #ifdef WIN32 - destDir = _getcwd(NULL, 0); - #else - destDir = getcwd(NULL, 0); - #endif - } - - if(options[DESTDIR].doesOccur) { - destDir = options[DESTDIR].value; - } - else { - #ifdef WIN32 - destDir = _getcwd(NULL, 0); - #else - destDir = getcwd(NULL, 0); - #endif - } - - for(int i = 1; i< argC; i++) { - arg = getLongPathname(argV[i]); - - gXmlFile = CreateFile(arg, sourceDir); - - gTxtFile = CreateTxtName(arg, destDir); - - - retval = ProcessTxtFile(); - } - XMLPlatformUtils::Terminate(); - return retval; -} - - - -int ProcessTxtFile() -{ - int retval = 0; - - DOMParser* parser; - DOMTreeErrorReporter* errReporter; - parser = new DOMParser(); - errReporter = new DOMTreeErrorReporter(); - parser->setValidationScheme(gValScheme); - parser->setDoNamespaces(true); - parser->setDoSchema(gDoSchema); - - parser->setErrorHandler(errReporter); - parser->setCreateEntityReferenceNodes(gDoCreate); - parser->setToCreateXMLDeclTypeNode(true); - - // - // Parse the XML file, catching any XML exceptions that might propogate - // out of it. - // - bool errorsOccured = false; - try - { - parser->parse(gXmlFile); - int errorCount = parser->getErrorCount(); - if (errorCount > 0) - errorsOccured = true; - } - - catch (const XMLException& e) - { - - - cerr << "An error occured during parsing\n Message: " - << DOMString(e.getMessage()) << endl; - errorsOccured = true; - } - - - catch (const DOM_DOMException& e) - { - cerr << "A DOM error occured during parsing\n DOMException code: " - << e.code << endl; - errorsOccured = true; - } - - catch (...) - { - cerr << "An error occured during parsing\n " << endl; - errorsOccured = true; - } - - if(!errorsOccured && !errReporter->getSawErrors()) - { - DOM_Node document = parser->getDocument(); - Check(document); //if check fails, exit(0); else excute the following code - if(DTDFLAG == false){ - cout << "DTD no assigned!" << endl; - exit(0); - } - } - - // If the parse and doubt-check was successful, output the document data from the DOM tree - if (!errorsOccured && !errReporter->getSawErrors()) - { - DOM_Node doc = parser->getDocument(); - DOMPrintFormatTarget *formatTarget = new DOMPrintFormatTarget(gTxtFile); - - - - if (gEncodingName == 0) - { - DOMString encNameStr("UTF-8"); - DOM_Node aNode = doc.getFirstChild(); - if (aNode.getNodeType() == DOM_Node::XML_DECL_NODE) - { - DOMString aStr = ((DOM_XMLDecl &)aNode).getEncoding(); - if (aStr != "") - { - encNameStr = aStr; - } - } - unsigned int lent = encNameStr.length(); - gEncodingName = new XMLCh[lent + 1]; - XMLString::copyNString(gEncodingName, encNameStr.rawBuffer(), lent); - gEncodingName[lent] = 0; - } - - - try - { - gFormatter = new XMLFormatter(gEncodingName, formatTarget, - XMLFormatter::NoEscapes, gUnRepFlags); - ofstream ofile(gTxtFile, ios::trunc); - cout << doc; - } - catch (XMLException& e) - { - cerr << "An error occurred during creation of output transcoder. Msg is:" - << endl - << DOMString(e.getMessage()) << endl; - retval = 3; - } - delete formatTarget; - delete gFormatter; - } - delete errReporter; - delete parser; - parser = NULL; - errReporter = NULL; - delete gEncodingName; - gEncodingName=NULL; - return retval; -} - - - - - - -//---------------------------------------------------------------------------- -// double-check before DOM Tree PrintOut -//---------------------------------------------------------------------------- -void Check( DOM_Node &document) -{ - // Get the name and value out for convenience - DOMString nodeName = document.getNodeName(); //, type - DOMString nodeValue = document.getNodeValue(); // - - DOMString attributeKey, attributeVal; //(key/name)(val/filename) - unsigned long lent = nodeValue.length(); - switch (document.getNodeType()) - { - case DOM_Node::TEXT_NODE: - { - break; - } - - case DOM_Node::PROCESSING_INSTRUCTION_NODE : - { - break; - } - - - case DOM_Node::DOCUMENT_NODE : - { - - DOM_Node child = document.getFirstChild(); - while( child != 0) - { - Check(child); - child = child.getNextSibling(); - } - break; - } - - case DOM_Node::ELEMENT_NODE : - { - DOM_NamedNodeMap attributes = document.getAttributes(); - int attrCount = attributes.getLength(); - int item_num=0; - for (int i = 0; i < attrCount; i++) - { - DOM_Node attribute = attributes.item(i); - - if(attribute.getNodeName().equals("key")||attribute.getNodeName().equals("name")){ - attributeKey = attribute.getNodeValue(); - } - else if(attribute.getNodeName().equals("val")||attribute.getNodeName().equals("filename")){ - attributeVal = attribute.getNodeValue(); - item_num = i; - } - else{ - //call error report - ErrorReport(document, 0); - } - } - - if(document.getParentNode().getNodeName().equals("array") && attributeKey!=NULL){ - ErrorReport(document, 1); //ErrorType =1--the element in the array has name - } - else if(document.getParentNode().getNodeName().equals("table") && attributeKey==NULL){ - ErrorReport(document, 2); //element in a table has no name - } - - if(document.getNodeName().equals("table")) - { - //unsigned int Child_Num; - if(document.hasChildNodes()) - { - ChildName* cn = new ChildName(); - cn->SetNext(NULL); - ChildName* head = CheckNameDuplicate(document, cn); - DelChildName(head); - } - } - else if(document.getNodeName().equals("array")) {} - else if(document.getNodeName().equals("resourceBundle")) {} - - else if(document.getNodeName().equals("str")||document.getNodeName().equals("importBin")) - { - CheckEscape(attributes, attributeVal, item_num); - } - - else if(document.getNodeName().equals("intVector")) - { - DOMString ivstring; - ivstring = CheckIntvector(attributeVal, document); - if(ivstring !=NULL) - attributes.item(item_num).setNodeValue(ivstring); - } - - else if(document.getNodeName().equals("int")) - { - CheckInt(attributeVal, document); - } - - else if(document.getNodeName().equals("bin")) - { - CheckBin(attributeVal, document); - } - - else if(document.getNodeName().equals("import")) {} - else if(document.getNodeName().equals("alias")) {} - else { - ErrorReport(document, 6); - } - - - DOM_Node child = document.getFirstChild(); - if (child != 0) - { - while( child != 0) - { - Check(child); - child = child.getNextSibling(); - } - } - break; - } - - - case DOM_Node::ENTITY_REFERENCE_NODE: - { - break; - } - - - case DOM_Node::CDATA_SECTION_NODE: - { - break; - } - - - case DOM_Node::COMMENT_NODE: - { - break; - } - - - case DOM_Node::DOCUMENT_TYPE_NODE: - { - DTDFLAG = true; - break; - } - - - case DOM_Node::ENTITY_NODE: - { - break; - } - - - case DOM_Node::XML_DECL_NODE: - { - break; - } - - - default: - cerr << "Unrecognized node type = " - << (long)document.getNodeType() << endl; - } -} - -void CheckEscape(DOM_NamedNodeMap attributes, DOMString attributeVal, int item_num) -{ - unsigned int len; - char Escape[7] = {'\\', 'u', '0', '0', '2', '2', '\0'}; - len = attributeVal.length(); - DOMString fromStr; - DOMString toStr; - const XMLCh quote[] = {(unsigned short)0x22, (unsigned short) 0}; - if(len>0) - { - for(unsigned int i=0; iNext; - while(temp!=NULL) - { - delete cn; - cn = NULL; - cn = temp; - temp = temp->Next; - } - delete cn; -} - -ChildName* CheckNameDuplicate(DOM_Node document, ChildName* cn) -{ - DOM_Node CNode = document.getFirstChild(); - - while(CNode!=NULL) - { - if(CNode.getNodeName().equals("string")||CNode.getNodeName().equals("bin")||CNode.getNodeName().equals("int")||CNode.getNodeName().equals("intvector")||CNode.getNodeName().equals("import")||CNode.getNodeName().equals("table")||CNode.getNodeName().equals("array")) - { - DOMString cname = getAttributeKey(CNode); - char* string = cname.transcode(); - ChildName* temp = cn; - while(temp->Next!=NULL) - { - if(cname.equals(temp->Name)) - { - DelChildName(cn); - ErrorReport(CNode, 5); //name duplication - } - temp = temp ->Next; - } - - ChildName* childname = new ChildName(); - childname->SetName(cname); - childname->SetNext(cn); - cn = childname; - } - CNode = CNode.getNextSibling(); - } - return cn; -} - -unsigned int GetCNodeNum(DOM_Node document) -{ - unsigned int num=0; - DOM_Node CNode = document.getFirstChild(); - while(CNode!=NULL) - { - if(CNode.getNodeName().equals("string")||CNode.getNodeName().equals("bin")||CNode.getNodeName().equals("int")||CNode.getNodeName().equals("intvector")||CNode.getNodeName().equals("import")||CNode.getNodeName().equals("table")||CNode.getNodeName().equals("array")) - num++; - CNode = CNode.getNextSibling(); - } - return num; -} - -void CheckBin(DOMString attributeVal, DOM_Node document) -{ - char *stopstring; - char toConv[2] = {'\0', '\0'}; - char* string = attributeVal.transcode(); - int count = strlen(string); - if(count > 0) - { - if((count % 2)==0) - { - for(int i=0; i, type - DOMString nodeValue = toWrite.getNodeValue(); // - - DOMString attributeKey, attributeVal; //(key/name)(val/filename) - unsigned long lent = nodeValue.length(); - - - switch (toWrite.getNodeType()) - { - case DOM_Node::TEXT_NODE: - { - gFormatter->formatBuf(nodeValue.rawBuffer(), - lent, XMLFormatter::CharEscapes); - break; - } - - - case DOM_Node::PROCESSING_INSTRUCTION_NODE : - { - break; - } - - - case DOM_Node::DOCUMENT_NODE : - { - - DOM_Node child = toWrite.getFirstChild(); - while( child != 0) - { - target << child; - child = child.getNextSibling(); - } - break; - } - - - case DOM_Node::ELEMENT_NODE : - { - - DOM_NamedNodeMap attributes = toWrite.getAttributes(); - int attrCount = attributes.getLength(); - for (int i = 0; i < attrCount; i++) - { - DOM_Node attribute = attributes.item(i); - - if(attribute.getNodeName().equals("key")||attribute.getNodeName().equals("name")){ - attributeKey = attribute.getNodeValue(); - } - else if(attribute.getNodeName().equals("val")||attribute.getNodeName().equals("filename")){ - attributeVal = attribute.getNodeValue(); - } - } - - //Print Out - if(nodeName.equals("resourceBundle")) - *gFormatter << attributeKey; - else - { - if(nodeName.equals("bin") && attributeVal==NULL) - *gFormatter <=0; i--) - { - attribute = attributes.item(i); - ErrorMsg.insertData(0, " ; "); - ErrorMsg.insertData(0, attribute.getNodeValue()); - } - } - ErrorMsg.insertData(0, "("); - ErrorMsg.insertData(0, toWrite.getNodeName()); - ErrorMsg.insertData(0, "==>"); - toWrite = toWrite.getParentNode(); - } - ErrorMsg.appendData("\n"); - - switch (ErrorType) - { - case 1: - ErrorMsg.appendData("The element in the array can't have a name!\n"); - break; - case 2: - ErrorMsg.appendData("The element in the table should have a name!\n"); - break; - case 3: - ErrorMsg.appendData("Invalid integer value!\n"); - break; - case 4: - ErrorMsg.appendData("Invalid bin!\n"); - break; - case 5: - ErrorMsg.appendData("Name Duplication in the table!\n"); - break; - case 6: - ErrorMsg.appendData("Invalid element name! Remember to assign correct DTD file on the xml file.\n"); - break; - } - cout << ErrorMsg; - exit(0); -} - -char* CreateTxtName(const char* arg, const char* Dir) -{ - char* temp = CreateFile(arg, Dir); - int len = strlen(temp); - temp[len-1] = 't'; - temp[len-2] = 'x'; - temp[len-3] = 't'; - return temp; - - /*char drive[_MAX_DRIVE]; - char dir[_MAX_DIR]; - char fname[_MAX_FNAME]; - char ext[_MAX_EXT]; - _splitpath(gXmlFile, drive, dir, fname, ext); - strcpy(gTxtFile, "\0"); - if (drive != NULL) { - strcat(gTxtFile, drive); - } - if (dir != NULL) { - strcat(gTxtFile, dir); - } - if (fname !=NULL) { - strcat(gTxtFile, fname); - } - strcat(gTxtFile, "tempfile.txt");*/ -} - -char* CreateFile(const char* arg, const char* Dir) -{ char* temp = new char[256]; - char a[2]={'\\', '\0'}; - char* currdir; - if(sourceDir!=NULL) { - strcpy(temp, Dir); - int len = strlen(temp); - if(temp[len - 1]!='\\') - strcat(temp, a); - strcat(temp, arg); - } - else { - char drive[_MAX_DRIVE]; - char dir[_MAX_DIR]; - char fname[_MAX_FNAME]; - char ext[_MAX_EXT]; - _splitpath(arg, drive, dir, fname, ext); - - if(*drive == NULL && *dir == NULL) { - #ifdef WIN32 - currdir = _getcwd(NULL, 0); - #else - currdir = getcwd(NULL, 0); - #endif - strcpy(temp, currdir); - strcat(temp, a); - } - strcat(temp, arg); - } - return temp; -} - - -// --------------------------------------------------------------------------- -// ostream << DOMString -// -// Stream out a DOM string. Doing this requires that we first transcode -// to char * form in the default code page for the system -// --------------------------------------------------------------------------- - -ostream& operator<< (ostream& target, const DOMString& s) -{ - char *p = s.transcode(); - target << p; - delete [] p; - return target; -} - - -XMLFormatter& operator<< (XMLFormatter& strm, const DOMString& s) -{ - unsigned int lent = s.length(); - - if (lent <= 0) - return strm; - - XMLCh* buf = new XMLCh[lent + 1]; - XMLString::copyNString(buf, s.rawBuffer(), lent); - buf[lent] = 0; - strm << buf; - delete [] buf; - return strm; -} - - diff --git a/icuSources/samples/xml2txt/xml2txt.dsp b/icuSources/samples/xml2txt/xml2txt.dsp deleted file mode 100644 index 4174bb50..00000000 --- a/icuSources/samples/xml2txt/xml2txt.dsp +++ /dev/null @@ -1,143 +0,0 @@ -# Microsoft Developer Studio Project File - Name="xml2txt" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=xml2txt - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "xml2txt.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "xml2txt.mak" CFG="xml2txt - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "xml2txt - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "xml2txt - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "xml2txt - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c -# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "xml2txt - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\..\include" /I "..\..\tools\toolutil" /I "C:\work\xerces-c\xerces-c-src1_6_0\src" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# SUBTRACT CPP /YX /Yc /Yu -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 icuind.lib icuucd.lib icutud.lib xerces-c_1D.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\lib" /libpath:"C:\work\xerces-c\xerces-c-src1_6_0\Build\Win32\VC6\Debug" -# Begin Custom Build -InputPath=.\Debug\xml2txt.exe -InputName=xml2txt -SOURCE="$(InputPath)" - -"..\..\..\..\bin\$(InputName).exe" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - copy $(InputPath) ..\..\..\..\bin - -# End Custom Build - -!ENDIF - -# Begin Target - -# Name "xml2txt - Win32 Release" -# Name "xml2txt - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\ChildName.cpp -# End Source File -# Begin Source File - -SOURCE=.\DOMPrintFormatTarget.cpp -# End Source File -# Begin Source File - -SOURCE=.\DOMTreeErrorReporter.cpp -# End Source File -# Begin Source File - -SOURCE=.\xml2txt.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\ChildName.h -# End Source File -# Begin Source File - -SOURCE=.\DOMPrintFormatTarget.h -# End Source File -# Begin Source File - -SOURCE=.\DOMTreeErrorReporter.hpp -# End Source File -# Begin Source File - -SOURCE=.\xml2txt.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# Begin Source File - -SOURCE=.\ReadMe.txt -# End Source File -# End Target -# End Project diff --git a/icuSources/samples/xml2txt/xml2txt.h b/icuSources/samples/xml2txt/xml2txt.h deleted file mode 100644 index 88e6e2d2..00000000 --- a/icuSources/samples/xml2txt/xml2txt.h +++ /dev/null @@ -1,49 +0,0 @@ -/****************************************************************************** - * Copyright (C) 2002, International Business Machines Corporation and - * others. All Rights Reserved. - ******************************************************************************/ -#ifndef xml2txt_H_ -#define xml2txt_H_ - -#include -#include -#include -#ifdef WIN32 -#include -#else -#include -#endif - -#include -#include - - -#include "uoptions.h" -#include "toolutil.h" -#include "ChildName.h" -#include "DOMPrintFormatTarget.h" - -//#define UOPTION_TXT UOPTION_DEF("txt", 't', UOPT_NO_ARG) -//#define UOPTION_RES UOPTION_DEF("res", 'r', UOPT_NO_ARG) - -void usage(); -void InitParser(); -void recycle(); -int ProcessTxtFile(); -void ErrorReport(DOM_Node& towrite, int ErrorType); -void Check(DOM_Node &document); -ostream& operator<<(ostream& target, const DOMString& toWrite); -ostream& operator<<(ostream& target, DOM_Node& toWrite); -XMLFormatter& operator<< (XMLFormatter& strm, const DOMString& s); -char* CreateTxtName(const char* arg, const char* Dir); -char* CreateFile(const char* arg, const char* Dir); -DOMString CheckIntvector(DOMString attributeVal, DOM_Node document); -void CheckInt(DOMString attributeVal, DOM_Node document); -void CheckBin(DOMString attributeVal, DOM_Node document); -unsigned int GetCNodeNum(DOM_Node document); -ChildName* CheckNameDuplicate(DOM_Node document, ChildName* cn); -DOMString getAttributeKey(DOM_Node CNode); -void DelChildName(ChildName* cn); -void CheckEscape(DOM_NamedNodeMap attributes, DOMString attributeVal, int item_num); - -#endif diff --git a/icuSources/samples/xml2txt/xml2txt.plg b/icuSources/samples/xml2txt/xml2txt.plg deleted file mode 100644 index 1b3e8493..00000000 --- a/icuSources/samples/xml2txt/xml2txt.plg +++ /dev/null @@ -1,16 +0,0 @@ - - -
      -

      Build Log

      -

      ---------------------Configuration: xml2txt - Win32 Debug-------------------- -

      -

      Command Lines

      - - - -

      Results

      -xml2txt.exe - 0 error(s), 0 warning(s) -
      - - diff --git a/icuSources/stubdata/Makefile.in b/icuSources/stubdata/Makefile.in index 69b8d926..b18b34af 100644 --- a/icuSources/stubdata/Makefile.in +++ b/icuSources/stubdata/Makefile.in @@ -1,6 +1,6 @@ #****************************************************************************** # -# Copyright (C) 1999-2003, International Business Machines +# Copyright (C) 1999-2004, International Business Machines # Corporation and others. All Rights Reserved. # #****************************************************************************** @@ -20,18 +20,18 @@ include $(top_builddir)/icudefs.mk subdir = stubdata ## Files to remove for 'make clean' -CLEANFILES = *~ $(DEPS) +CLEANFILES = *~ $(DEPS) $(IMPORT_LIB) $(MIDDLE_IMPORT_LIB) $(FINAL_IMPORT_LIB) ## Target information -TARGET_STUBNAME=data +TARGET_STUBNAME=$(DATA_STUBNAME) ifneq ($(ENABLE_STATIC),) -TARGET = $(LIBICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX).a +TARGET = $(STUBDATA_LIBDIR)$(LIBSICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX).$(A) endif ifneq ($(ENABLE_SHARED),) -SO_TARGET = $(LIBICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX)$(STUB_SUFFIX).$(SO) +SO_TARGET = $(STUBDATA_LIBDIR)$(LIBICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX)$(STUB_SUFFIX).$(SO) ALL_SO_TARGETS = $(SO_TARGET) $(MIDDLE_SO_TARGET) $(FINAL_SO_TARGET) $(BATCH_STUB_TARGET) endif @@ -41,6 +41,7 @@ DYNAMICCPPFLAGS = $(SHAREDLIBCPPFLAGS) DYNAMICCFLAGS = $(SHAREDLIBCFLAGS) DYNAMICCXXFLAGS = $(SHAREDLIBCXXFLAGS) +LDFLAGS += $(LDFLAGSICUDT) CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common $(LIBCPPFLAGS) OBJECTS = stubdata.o @@ -75,22 +76,24 @@ install-local: install-library install-library: all-local $(MKINSTALLDIRS) $(DESTDIR)$(libdir) ifneq ($(ENABLE_STATIC),) - $(INSTALL-L) $(TARGET) $(DESTDIR)$(libdir)/$(TARGET) + $(INSTALL-L) $(TARGET) $(DESTDIR)$(libdir) endif ifneq ($(ENABLE_SHARED),) - $(INSTALL-L) $(FINAL_SO_TARGET) $(DESTDIR)$(libdir)/$(FINAL_SO_TARGET) + $(INSTALL-L) $(FINAL_SO_TARGET) $(DESTDIR)$(libdir) ifneq ($(FINAL_SO_TARGET),$(SO_TARGET)) - cd $(DESTDIR)$(libdir) && $(RM) $(SO_TARGET) && ln -s $(FINAL_SO_TARGET) $(SO_TARGET) + cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(SO_TARGET)) && ln -s $(notdir $(FINAL_SO_TARGET)) $(notdir $(SO_TARGET)) ifneq ($(FINAL_SO_TARGET),$(MIDDLE_SO_TARGET)) - cd $(DESTDIR)$(libdir) && $(RM) $(MIDDLE_SO_TARGET) && ln -s $(FINAL_SO_TARGET) $(MIDDLE_SO_TARGET) + cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(MIDDLE_SO_TARGET)) && ln -s $(notdir $(FINAL_SO_TARGET)) $(notdir $(MIDDLE_SO_TARGET)) endif endif endif ifneq ($(IMPORT_LIB_EXT),) - $(INSTALL-L) $(FINAL_IMPORT_LIB) $(DESTDIR)$(libdir)/$(FINAL_IMPORT_LIB) - cd $(DESTDIR)$(libdir) && $(RM) $(IMPORT_LIB) && ln -s $(FINAL_IMPORT_LIB) $(IMPORT_LIB) + $(INSTALL-L) $(FINAL_IMPORT_LIB) $(DESTDIR)$(libdir) +ifneq ($(IMPORT_LIB),$(FINAL_IMPORT_LIB)) + cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(IMPORT_LIB)) && ln -s $(notdir $(FINAL_IMPORT_LIB)) $(notdir $(IMPORT_LIB)) +endif ifneq ($(MIDDLE_IMPORT_LIB),$(FINAL_IMPORT_LIB)) - cd $(DESTDIR)$(libdir) && $(RM) $(MIDDLE_IMPORT_LIB) && ln -s $(FINAL_IMPORT_LIB) $(MIDDLE_IMPORT_LIB) + cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(MIDDLE_IMPORT_LIB)) && ln -s $(notdir $(FINAL_IMPORT_LIB)) $(notdir $(MIDDLE_IMPORT_LIB)) endif endif diff --git a/icuSources/stubdata/stubdata.dsp b/icuSources/stubdata/stubdata.dsp index 9b033053..e670b694 100644 --- a/icuSources/stubdata/stubdata.dsp +++ b/icuSources/stubdata/stubdata.dsp @@ -55,7 +55,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 kernel32.lib user32.lib /nologo /dll /machine:I386 /out:"..\..\bin\icudt26l.dll" /implib:"..\..\lib\icudata.lib" +# ADD LINK32 kernel32.lib user32.lib /nologo /dll /machine:I386 /out:"..\..\bin\icudt32.dll" /implib:"..\..\lib\icudt.lib" # SUBTRACT LINK32 /pdb:none # Begin Special Build Tool ProjDir=. @@ -87,7 +87,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib /nologo /dll /machine:I386 /out:"..\..\bin\icudt26l.dll" /implib:"..\..\lib\icudata.lib" /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib /nologo /dll /machine:I386 /out:"..\..\bin\icudt32.dll" /implib:"..\..\lib\icudt.lib" /pdbtype:sept # SUBTRACT LINK32 /pdb:none # Begin Special Build Tool ProjDir=. @@ -109,7 +109,7 @@ PreLink_Cmds=echo "File with stubdata build time, used as a dependency to trigge # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "STUBDATA_EXPORTS" /FD /c -# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\common" /D "WIN64" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "STUBDATA_EXPORTS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\common" /D "WIN64" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "STUBDATA_EXPORTS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win64 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win64 # ADD BASE RSC /l 0x409 /d "NDEBUG" @@ -119,7 +119,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:IX86 /machine:IA64 -# ADD LINK32 kernel32.lib user32.lib /nologo /dll /machine:IX86 /out:"..\..\bin\icudt26l.dll" /implib:"..\..\lib\icudata.lib" /machine:IA64 +# ADD LINK32 kernel32.lib user32.lib /nologo /dll /machine:IX86 /out:"..\..\bin\icudt32.dll" /implib:"..\..\lib\icudt.lib" /machine:IA64 # Begin Special Build Tool ProjDir=. SOURCE="$(InputPath)" @@ -140,7 +140,7 @@ PreLink_Cmds=echo "File with stubdata build time, used as a dependency to trigge # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "STUBDATA_EXPORTS" /FD /GZ /c -# ADD CPP /nologo /MDd /Za /W3 /GX /Zi /Od /I "..\common" /D "WIN64" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "STUBDATA_EXPORTS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /GZ /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MDd /Za /W3 /GX /Zi /Od /I "..\common" /D "WIN64" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "STUBDATA_EXPORTS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /GZ /Wp64 /Zm600 /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win64 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win64 # ADD BASE RSC /l 0x409 /d "_DEBUG" @@ -150,7 +150,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:IX86 /pdbtype:sept /machine:IA64 -# ADD LINK32 kernel32.lib user32.lib /nologo /dll /incremental:no /machine:IX86 /out:"..\..\bin\icudt26l.dll" /implib:"..\..\lib\icudata.lib" /pdbtype:sept /machine:IA64 +# ADD LINK32 kernel32.lib user32.lib /nologo /dll /incremental:no /machine:IX86 /out:"..\..\bin\icudt32.dll" /implib:"..\..\lib\icudt.lib" /pdbtype:sept /machine:IA64 # Begin Special Build Tool ProjDir=. SOURCE="$(InputPath)" diff --git a/icuSources/stubdata/stubdata.vcproj b/icuSources/stubdata/stubdata.vcproj index 5789b2dc..b620b235 100644 --- a/icuSources/stubdata/stubdata.vcproj +++ b/icuSources/stubdata/stubdata.vcproj @@ -1,7 +1,7 @@ - + @@ -40,33 +40,39 @@ + ProgramDatabaseFile=".\Release/icudt32.pdb" + ImportLibrary="..\..\lib\icudt.lib"/> + TypeLibraryName=".\Release/icudt.tlb"/> + CommandLine="echo "File with stubdata build time, used as a dependency to trigger fresh data build, since stubdata dll will overwrite the real one." > "$(ProjectDir)stubdatabuilt.txt""/> + + + + ProgramDatabaseFile=".\Debug/icudt32.pdb" + ImportLibrary="..\..\lib\icudt.lib"/> + TypeLibraryName=".\Debug/icudt.tlb"/> + CommandLine="echo "File with stubdata build time, used as a dependency to trigger fresh data build, since stubdata dll will overwrite the real one." > "$(ProjectDir)stubdatabuilt.txt""/> + + + + + 16384) { log_err("Partial sortkey size buffer too small. Please consider increasing the buffer!\n"); @@ -163,9 +189,9 @@ static UCollationResult compareUsingPartials(UCollator *coll, const UChar source tSize = ucol_nextSortKeyPart(coll, &tIter, tState, tBuf, pieceSize, status); if(sState[0] != 0 || tState[0] != 0) { - log_verbose("State != 0 : %08X %08X\n", sState[0], tState[0]); + /*log_verbose("State != 0 : %08X %08X\n", sState[0], tState[0]);*/ } - log_verbose("%i ", i++); + /*log_verbose("%i ", i++);*/ partialSKResult = memcmp(sBuf, tBuf, pieceSize); } @@ -246,10 +272,10 @@ static void doTestVariant(UCollator* myCollation, const UChar source[], const UC if(QUICK <= 0) { partialSizesSize = 7; } - log_verbose("partial sortkey test piecesize="); + /*log_verbose("partial sortkey test piecesize=");*/ for(i = 0; i < partialSizesSize; i++) { UCollationResult partialSKResult = result, partialNormalizedSKResult = result; - log_verbose("%i ", partialSizes[i]); + /*log_verbose("%i ", partialSizes[i]);*/ partialSKResult = compareUsingPartials(myCollation, source, sLen, target, tLen, partialSizes[i], &status); if(partialSKResult != result) { @@ -258,7 +284,7 @@ static void doTestVariant(UCollator* myCollation, const UChar source[], const UC } if(QUICK <= 0 && norm != UCOL_ON) { - log_verbose("N "); + /*log_verbose("N ");*/ ucol_setAttribute(myCollation, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); partialNormalizedSKResult = compareUsingPartials(myCollation, source, sLen, target, tLen, partialSizes[i], &status); ucol_setAttribute(myCollation, UCOL_NORMALIZATION_MODE, norm, &status); @@ -268,7 +294,7 @@ static void doTestVariant(UCollator* myCollation, const UChar source[], const UC } } } - log_verbose("\n"); + /*log_verbose("\n");*/ } @@ -347,6 +373,256 @@ void doTest(UCollator* myCollation, const UChar source[], const UChar target[], } } + +/** + * Return an integer array containing all of the collation orders + * returned by calls to next on the specified iterator + */ +int32_t* getOrders(UCollationElements *iter, int32_t *orderLength) +{ + UErrorCode status; + int32_t order; + int32_t maxSize = 100; + int32_t size = 0; + int32_t *temp; + int32_t *orders =(int32_t*)malloc(sizeof(int32_t) * maxSize); + status= U_ZERO_ERROR; + + + while ((order=ucol_next(iter, &status)) != UCOL_NULLORDER) + { + if (size == maxSize) + { + maxSize *= 2; + temp = (int32_t*)malloc(sizeof(int32_t) * maxSize); + + memcpy(temp, orders, size * sizeof(int32_t)); + free(orders); + orders = temp; + + } + + orders[size++] = order; + } + + if (maxSize > size && size > 0) + { + temp = (int32_t*)malloc(sizeof(int32_t) * size); + + memcpy(temp, orders, size * sizeof(int32_t)); + free(orders); + orders = temp; + + + } + + *orderLength = size; + return orders; +} + + +void +backAndForth(UCollationElements *iter) +{ + /* Run through the iterator forwards and stick it into an array */ + int32_t index, o; + UErrorCode status = U_ZERO_ERROR; + int32_t orderLength = 0; + int32_t *orders; + orders= getOrders(iter, &orderLength); + + + /* Now go through it backwards and make sure we get the same values */ + index = orderLength; + ucol_reset(iter); + + /* synwee : changed */ + while ((o = ucol_previous(iter, &status)) != UCOL_NULLORDER) + { + if (o != orders[-- index]) + { + if (o == 0) + index ++; + else + { + while (index > 0 && orders[-- index] == 0) + { + } + if (o != orders[index]) + { + log_err("Mismatch at index : 0x%x\n", index); + return; + } + + } + } + } + + while (index != 0 && orders[index - 1] == 0) { + index --; + } + + if (index != 0) + { + log_err("Didn't get back to beginning - index is %d\n", index); + + ucol_reset(iter); + log_err("\nnext: "); + if ((o = ucol_next(iter, &status)) != UCOL_NULLORDER) + { + log_err("Error at %x\n", o); + } + log_err("\nprev: "); + if ((o = ucol_previous(iter, &status)) != UCOL_NULLORDER) + { + log_err("Error at %x\n", o); + } + log_verbose("\n"); + } + + free(orders); +} + +void genericOrderingTestWithResult(UCollator *coll, const char *s[], uint32_t size, UCollationResult result) { + UChar t1[2048] = {0}; + UChar t2[2048] = {0}; + UCollationElements *iter; + UErrorCode status = U_ZERO_ERROR; + + uint32_t i = 0, j = 0; + log_verbose("testing sequence:\n"); + for(i = 0; i < size; i++) { + log_verbose("%s\n", s[i]); + } + + iter = ucol_openElements(coll, t1, u_strlen(t1), &status); + if (U_FAILURE(status)) { + log_err("Creation of iterator failed\n"); + } + for(i = 0; i < size-1; i++) { + for(j = i+1; j < size; j++) { + u_unescape(s[i], t1, 2048); + u_unescape(s[j], t2, 2048); + doTest(coll, t1, t2, result); + /* synwee : added collation element iterator test */ + ucol_setText(iter, t1, u_strlen(t1), &status); + backAndForth(iter); + ucol_setText(iter, t2, u_strlen(t2), &status); + backAndForth(iter); + } + } + ucol_closeElements(iter); +} + +void genericOrderingTest(UCollator *coll, const char *s[], uint32_t size) { + genericOrderingTestWithResult(coll, s, size, UCOL_LESS); +} + +void genericLocaleStarter(const char *locale, const char *s[], uint32_t size) { + UErrorCode status = U_ZERO_ERROR; + UCollator *coll = ucol_open(locale, &status); + + log_verbose("Locale starter for %s\n", locale); + + if(U_SUCCESS(status)) { + genericOrderingTest(coll, s, size); + } else if(status == U_FILE_ACCESS_ERROR) { + log_data_err("Is your data around?\n"); + return; + } else { + log_err("Unable to open collator for locale %s\n", locale); + } + ucol_close(coll); +} + +void genericLocaleStarterWithResult(const char *locale, const char *s[], uint32_t size, UCollationResult result) { + UErrorCode status = U_ZERO_ERROR; + UCollator *coll = ucol_open(locale, &status); + + log_verbose("Locale starter for %s\n", locale); + + if(U_SUCCESS(status)) { + genericOrderingTestWithResult(coll, s, size, result); + } else if(status == U_FILE_ACCESS_ERROR) { + log_data_err("Is your data around?\n"); + return; + } else { + log_err("Unable to open collator for locale %s\n", locale); + } + ucol_close(coll); +} + +#if 0 +/* currently not used with options */ +void genericRulesStarterWithOptions(const char *rules, const char *s[], uint32_t size, const UColAttribute *attrs, const UColAttributeValue *values, uint32_t attsize) { + UErrorCode status = U_ZERO_ERROR; + UChar rlz[RULE_BUFFER_LEN] = { 0 }; + uint32_t rlen = u_unescape(rules, rlz, RULE_BUFFER_LEN); + uint32_t i; + + UCollator *coll = ucol_openRules(rlz, rlen, UCOL_DEFAULT, UCOL_DEFAULT,NULL, &status); + + log_verbose("Rules starter for %s\n", rules); + + if(U_SUCCESS(status)) { + log_verbose("Setting attributes\n"); + for(i = 0; i < attsize; i++) { + ucol_setAttribute(coll, attrs[i], values[i], &status); + } + + genericOrderingTest(coll, s, size); + } else { + log_err("Unable to open collator with rules %s\n", rules); + } + ucol_close(coll); +} +#endif + +void genericLocaleStarterWithOptions(const char *locale, const char *s[], uint32_t size, const UColAttribute *attrs, const UColAttributeValue *values, uint32_t attsize) { + UErrorCode status = U_ZERO_ERROR; + uint32_t i; + + UCollator *coll = ucol_open(locale, &status); + + log_verbose("Locale starter for %s\n", locale); + + if(U_SUCCESS(status)) { + + log_verbose("Setting attributes\n"); + for(i = 0; i < attsize; i++) { + ucol_setAttribute(coll, attrs[i], values[i], &status); + } + + genericOrderingTest(coll, s, size); + } else { + log_err("Unable to open collator for locale %s\n", locale); + } + ucol_close(coll); +} + +void genericRulesTestWithResult(const char *rules, const char *s[], uint32_t size, UCollationResult result) { + UErrorCode status = U_ZERO_ERROR; + UChar rlz[RULE_BUFFER_LEN] = { 0 }; + uint32_t rlen = u_unescape(rules, rlz, RULE_BUFFER_LEN); + + UCollator *coll = NULL; + coll = ucol_openRules(rlz, rlen, UCOL_DEFAULT, UCOL_DEFAULT,NULL, &status); + log_verbose("Rules starter for %s\n", rules); + + if(U_SUCCESS(status)) { + genericOrderingTestWithResult(coll, s, size, result); + ucol_close(coll); + } else if(status == U_FILE_ACCESS_ERROR) { + log_data_err("Is your data around?\n"); + } else { + log_err("Unable to open collator with rules %s\n", rules); + } +} + +void genericRulesStarter(const char *rules, const char *s[], uint32_t size) { + genericRulesTestWithResult(rules, s, size, UCOL_LESS); +} + static void TestTertiary() { int32_t len,i; @@ -857,10 +1133,14 @@ TestJitterbug1098(){ u_uastrcpy(rule, rules[i]); c1 = ucol_openRules(rule, u_strlen(rule), UCOL_OFF, UCOL_DEFAULT_STRENGTH, &parseError, &status); if(U_FAILURE(status)){ - u_UCharsToChars(parseError.preContext,preContext,20); - u_UCharsToChars(parseError.postContext,postContext,20); log_err("Could not parse the rules syntax. Error: %s ", u_errorName(status)); - log_verbose("\n\tPre-Context: %s \n\tPost-Context:%s \n",preContext,postContext); + + if (status == U_PARSE_ERROR) { + u_UCharsToChars(parseError.preContext,preContext,20); + u_UCharsToChars(parseError.postContext,postContext,20); + log_verbose("\n\tPre-Context: %s \n\tPost-Context:%s \n",preContext,postContext); + } + return; } X[0] = input[i][0]; @@ -870,5 +1150,49 @@ TestJitterbug1098(){ } } +/* These tests do cleanup and reinitialize ICU in the course of their operation. + * The ICU data directory must be preserved across these operations. + * Here is a helper function to assist with that. + */ +static char *safeGetICUDataDirectory() { + const char *dataDir = u_getDataDirectory(); /* Returned string vanashes with u_cleanup */ + char *retStr = NULL; + if (dataDir != NULL) { + retStr = (char *)malloc(strlen(dataDir)+1); + strcpy(retStr, dataDir); + } + return retStr; +} + + +static void +TestFCDCrash(void) { + static const char *test[] = { + "Gr\\u00F6\\u00DFe", + "Grossist" + }; + + char *icuDataDir = safeGetICUDataDirectory(); + UErrorCode status = U_ZERO_ERROR; + UCollator *coll = ucol_open("es", &status); + if(U_FAILURE(status)) { + log_err("Couldn't open collator\n"); + return; + } + ucol_close(coll); + coll = NULL; + u_cleanup(); + u_setDataDirectory(icuDataDir); + coll = ucol_open("de_DE", &status); + if(U_FAILURE(status)) { + log_err("Couldn't open collator\n"); + return; + } + ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); + genericOrderingTest(coll, test, 2); + ucol_close(coll); + free(icuDataDir); + +} #endif /* #if !UCONFIG_NO_COLLATION */ diff --git a/icuSources/test/cintltst/callcoll.h b/icuSources/test/cintltst/callcoll.h index e7cb2a2a..70cf316a 100644 --- a/icuSources/test/cintltst/callcoll.h +++ b/icuSources/test/cintltst/callcoll.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** @@ -21,15 +21,30 @@ #define _CALLCOLLTST #include "unicode/utypes.h" +#include "unicode/ucoleitr.h" #if !UCONFIG_NO_COLLATION #include "cintltst.h" +#define RULE_BUFFER_LEN 8192 /* tests comparison of custom collation with different strengths */ void doTest(UCollator*, const UChar* source, const UChar* target, UCollationResult result); +/* verify that iterating forward and backwards over the string yields same CEs */ +void backAndForth(UCollationElements *iter); +/* gets an array of CEs for a string in UCollationElements iterator. */ +int32_t* getOrders(UCollationElements *iter, int32_t *orderLength); + +void genericOrderingTestWithResult(UCollator *coll, const char *s[], uint32_t size, UCollationResult result); +void genericOrderingTest(UCollator *coll, const char *s[], uint32_t size); +void genericLocaleStarter(const char *locale, const char *s[], uint32_t size); +void genericLocaleStarterWithResult(const char *locale, const char *s[], uint32_t size, UCollationResult result); +void genericLocaleStarterWithOptions(const char *locale, const char *s[], uint32_t size, const UColAttribute *attrs, const UColAttributeValue *values, uint32_t attsize); +void genericRulesTestWithResult(const char *rules, const char *s[], uint32_t size, UCollationResult result); +void genericRulesStarter(const char *rules, const char *s[], uint32_t size); +UBool hasCollationElements(const char *locName); #endif /* #if !UCONFIG_NO_COLLATION */ diff --git a/icuSources/test/cintltst/calltest.c b/icuSources/test/cintltst/calltest.c index 9a3f441a..5c05489c 100644 --- a/icuSources/test/cintltst/calltest.c +++ b/icuSources/test/cintltst/calltest.c @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1996-2001, International Business Machines Corporation and + * Copyright (c) 1996-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** @@ -16,7 +16,6 @@ #include "cintltst.h" -void addSetup(TestNode** root); void addUtility(TestNode** root); void addBreakIter(TestNode** root); void addStandardNamesTest(TestNode **root); @@ -33,10 +32,14 @@ void addCompactArrayTest(TestNode** root); void addTestDeprecatedAPI(TestNode** root); void addUCharTransformTest(TestNode** root); void addUSetTest(TestNode** root); +void addUStringPrepTest(TestNode** root); +void addIDNATest(TestNode** root); +void addHeapMutexTest(TestNode **root); +void addUTraceTest(TestNode** root); +void addURegexTest(TestNode** root); void addAllTests(TestNode** root) { - addSetup(root); /* Leave this test first! */ addUDataTest(root); addPUtilTest(root); addUTF16Test(root); @@ -61,5 +64,14 @@ void addAllTests(TestNode** root) #endif addUSetTest(root); addTestDeprecatedAPI(root); +#if !UCONFIG_NO_IDNA + addUStringPrepTest(root); + addIDNATest(root); +#endif + addHeapMutexTest(root); + addUTraceTest(root); +#if !UCONFIG_NO_REGULAR_EXPRESSIONS + addURegexTest(root); +#endif } diff --git a/icuSources/test/cintltst/capitst.c b/icuSources/test/cintltst/capitst.c index 91ee2fd5..ead9a247 100644 --- a/icuSources/test/cintltst/capitst.c +++ b/icuSources/test/cintltst/capitst.c @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** @@ -27,11 +27,14 @@ #include "cintltst.h" #include "capitst.h" #include "ccolltst.h" +#include "putilimp.h" static void TestAttribute(void); - int TestBufferSize(); /* defined in "colutil.c" */ + int TestBufferSize(); /* defined in "colutil.c" */ + + /* next two function is modified from "i18n/ucol.cpp" to avoid include "ucol_imp.h" */ static void uprv_appendByteToHexString(char *dst, uint8_t val) { uint32_t len = (uint32_t)strlen(dst); @@ -118,7 +121,8 @@ void addCollAPITest(TestNode** root) addTest(root, &TestAttribute, "tscoll/capitst/TestAttribute"); addTest(root, &TestGetTailoredSet, "tscoll/capitst/TestGetTailoredSet"); addTest(root, &TestMergeSortKeys, "tscoll/capitst/TestMergeSortKeys"); - + addTest(root, &TestShortString, "tscoll/capitst/TestShortString"); + addTest(root, &TestGetContractionsAndUnsafes, "tscoll/capitst/TestGetContractionsAndUnsafes"); } void TestGetSetAttr(void) { @@ -273,9 +277,12 @@ void TestProperty() ICU 2.1 currVersionArray = {0x19, 0x00, 0x03, 0x03}; ICU 2.2 currVersionArray = {0x21, 0x40, 0x04, 0x04}; ICU 2.4 currVersionArray = {0x21, 0x40, 0x04, 0x04}; + ICU 2.6 currVersionArray = {0x21, 0x40, 0x03, 0x03}; */ - UVersionInfo currVersionArray = {0x21, 0x40, 0x03, 0x03}; - UVersionInfo versionArray; + UVersionInfo currVersionArray = {0x29, 0x80, 0x00, 0x04}; + UVersionInfo currUCAVersionArray = {4, 0, 0, 0}; + UVersionInfo versionArray = {0, 0, 0, 0}; + UVersionInfo versionUCAArray = {0, 0, 0, 0}; log_verbose("The property tests begin : \n"); log_verbose("Test ucol_strcoll : \n"); @@ -294,6 +301,15 @@ void TestProperty() } } + ucol_getUCAVersion(col, versionUCAArray); + for (i=0; i<4; ++i) { + if (versionUCAArray[i] != currUCAVersionArray[i]) { + log_err("Testing ucol_getUCAVersion() - unexpected result: %hu.%hu.%hu.%hu\n", + versionUCAArray[0], versionUCAArray[1], versionUCAArray[2], versionUCAArray[3]); + break; + } + } + source=(UChar*)malloc(sizeof(UChar) * 12); target=(UChar*)malloc(sizeof(UChar) * 12); @@ -365,7 +381,7 @@ void TestProperty() buffer[0] = '\0'; log_verbose("ucol_getRulesEx() testing ...\n"); tempLength = ucol_getRulesEx(col,UCOL_TAILORING_ONLY,buffer,bufLen ); - doAssert( tempLength == 0, "getRulesEx() result incorrect" ); + doAssert( tempLength == 0x0a, "getRulesEx() result incorrect" ); log_verbose("getRules tests end.\n"); log_verbose("ucol_getRulesEx() testing ...\n"); @@ -427,6 +443,7 @@ void TestRuleBasedColl() u_uastrcpy(ruleset1, "&9 < a, A < b, B < c, C; ch, cH, Ch, CH < d, D, e, E"); u_uastrcpy(ruleset2, "&9 < a, A < b, B < c, C < d, D, e, E"); + col1 = ucol_openRules(ruleset1, u_strlen(ruleset1), UCOL_DEFAULT, UCOL_DEFAULT_STRENGTH, NULL,&status); if (U_FAILURE(status)) { log_err("RuleBased Collator creation failed.: %s\n", myErrorName(status)); @@ -500,10 +517,10 @@ void TestRuleBasedColl() /* testing with en since thai has its own tailoring */ uint32_t ce = ucol_next(iter1, &status); uint32_t ce2 = ucol_next(iter2, &status); - if(U_FAILURE(status)) { + if(U_FAILURE(status)) { log_err("ERROR: CollationElement iterator creation failed.: %s\n", myErrorName(status)); return; - } + } if (ce2 != ce) { log_err("! modifier test failed"); } @@ -746,10 +763,12 @@ void TestSortKey() { uint8_t *sortk1 = NULL, *sortk2 = NULL, *sortk3 = NULL, *sortkEmpty = NULL; uint8_t sortk2_compat[] = { + /* 2.6.1 key */ + 0x26, 0x28, 0x2A, 0x2C, 0x26, 0x01, + 0x09, 0x01, 0x09, 0x01, 0x25, 0x01, + 0x92, 0x93, 0x94, 0x95, 0x92, 0x00 /* 2.2 key */ - 0x1D, 0x1F, 0x21, 0x23, 0x1D, 0x01, - 0x09, 0x01, 0x09, 0x01, 0x1C, 0x01, - 0x92, 0x93, 0x94, 0x95, 0x92, 0x00 + /*0x1D, 0x1F, 0x21, 0x23, 0x1D, 0x01, 0x09, 0x01, 0x09, 0x01, 0x1C, 0x01, 0x92, 0x93, 0x94, 0x95, 0x92, 0x00*/ /* 2.0 key */ /*0x19, 0x1B, 0x1D, 0x1F, 0x19, 0x01, 0x09, 0x01, 0x09, 0x01, 0x18, 0x01, 0x92, 0x93, 0x94, 0x95, 0x92, 0x00*/ /* 1.8.1 key.*/ @@ -1100,14 +1119,15 @@ void TestGetLocale() { int32_t i = 0; + /* Now that the collation tree is separate, actual==valid at all times. [alan] */ static const struct { const char* requestedLocale; const char* validLocale; const char* actualLocale; } testStruct[] = { { "sr_YU", "sr_YU", "ru" }, - { "sh_YU", "sh_YU", "sh" }, - { "en_US_CALIFORNIA", "en_US", "root" }, + { "sh_YU", "sh_YU", "hr" }, /* this used to be sh, but now sh collation aliases hr */ + { "en_BE_FOO", "en_BE", "en_BE" }, { "fr_FR_NONEXISTANT", "fr_FR", "fr" } }; @@ -1566,8 +1586,8 @@ void TestGetTailoredSet() { } static int tMemCmp(const uint8_t *first, const uint8_t *second) { - int32_t firstLen = strlen((const char *)first); - int32_t secondLen = strlen((const char *)second); + int32_t firstLen = (int32_t)strlen((const char *)first); + int32_t secondLen = (int32_t)strlen((const char *)second); return memcmp(first, second, uprv_min(firstLen, secondLen)); } static const char * strengthsC[] = { @@ -1701,5 +1721,215 @@ void TestMergeSortKeys(void) { log_data_err("Couldn't open collator"); } } - +static void TestShortString(void) +{ + struct { + const char *input; + const char *expectedOutput; + const char *locale; + UErrorCode expectedStatus; + int32_t expectedOffset; + uint32_t expectedIdentifier; + } testCases[] = { + {"LDE_RDE_KPHONEBOOK_T0041_ZLATN","B2600_KPHONEBOOK_LDE", "de@collation=phonebook", U_USING_FALLBACK_WARNING, 0, 0 }, + {"LEN_RUS_NO_AS_S4","AS_LEN_NO_S4", NULL, U_USING_FALLBACK_WARNING, 0, 0 }, + {"LDE_VPHONEBOOK_EO_SI","EO_KPHONEBOOK_LDE_SI", "de@collation=phonebook", U_ZERO_ERROR, 0, 0 }, + {"LDE_Kphonebook","KPHONEBOOK_LDE", "de@collation=phonebook", U_ZERO_ERROR, 0, 0 }, + {"Xqde_DE@collation=phonebookq_S3_EX","KPHONEBOOK_LDE", "de@collation=phonebook", U_USING_FALLBACK_WARNING, 0, 0 }, + {"LFR_FO", "LFR", NULL, U_ZERO_ERROR, 0, 0 }, + {"SO_LX_AS", "", NULL, U_ILLEGAL_ARGUMENT_ERROR, 8, 0 }, + {"S3_ASS_MMM", "", NULL, U_ILLEGAL_ARGUMENT_ERROR, 5, 0 } + }; + + int32_t i = 0, j = 0; + UCollator *coll = NULL, *fromID = NULL, *fromNormalized = NULL; + UParseError parseError; + UErrorCode status = U_ZERO_ERROR; + char fromShortBuffer[256], fromIDBuffer[256], fromIDRoundtrip[256], normalizedBuffer[256], fromNormalizedBuffer[256]; + uint32_t identifier = 0, idFromSS = 0; + const char* locale = NULL; + + + for(i = 0; i < sizeof(testCases)/sizeof(testCases[0]); i++) { + status = U_ZERO_ERROR; + if(testCases[i].locale) { + locale = testCases[i].locale; + } else { + locale = NULL; + } + + coll = ucol_openFromShortString(testCases[i].input, FALSE, &parseError, &status); + if(status != testCases[i].expectedStatus) { + log_err("Got status '%s' that is different from expected '%s' for '%s'\n", + u_errorName(status), u_errorName(testCases[i].expectedStatus), testCases[i].input); + } + + if(U_SUCCESS(status)) { + ucol_getShortDefinitionString(coll, locale, fromShortBuffer, 256, &status); + + if(strcmp(fromShortBuffer, testCases[i].expectedOutput)) { + log_err("Got short string '%s' from the collator. Expected '%s' for input '%s'\n", + fromShortBuffer, testCases[i].expectedOutput, testCases[i].input); + } + + ucol_normalizeShortDefinitionString(testCases[i].input, normalizedBuffer, 256, &parseError, &status); + fromNormalized = ucol_openFromShortString(normalizedBuffer, FALSE, &parseError, &status); + ucol_getShortDefinitionString(fromNormalized, locale, fromNormalizedBuffer, 256, &status); + + if(strcmp(fromShortBuffer, fromNormalizedBuffer)) { + log_err("Strings obtained from collators instantiated by short string ('%s') and from normalized string ('%s') differ\n", + fromShortBuffer, fromNormalizedBuffer); + } + + + if(!ucol_equals(coll, fromNormalized)) { + log_err("Collator from short string ('%s') differs from one obtained through a normalized version ('%s')\n", + testCases[i].input, normalizedBuffer); + } + + /* test identifiers */ + identifier = ucol_collatorToIdentifier(coll, locale, &status); + if(identifier < UCOL_SIT_COLLATOR_NOT_ENCODABLE) { + ucol_identifierToShortString(identifier, fromIDBuffer, 256, FALSE, &status); + fromID = ucol_openFromIdentifier(identifier, FALSE, &status); + if(!ucol_equals(coll, fromID)) { + log_err("Collator from short string ('%s') differs from one obtained through an identifier ('%s')\n", + testCases[i].input, fromIDBuffer); + } + ucol_close(fromID); + } + + /* round-trip short string - identifier */ + for(j = 1; j < 2; j++) { + idFromSS = ucol_shortStringToIdentifier(testCases[i].input, (UBool)j, &status); + ucol_identifierToShortString(idFromSS, fromIDBuffer, 256, (UBool)j, &status); + identifier = ucol_shortStringToIdentifier(fromIDBuffer, (UBool)j, &status); + ucol_identifierToShortString(identifier, fromIDRoundtrip, 256, (UBool)j, &status); + + if(idFromSS != identifier) { + log_err("FD = %i, id didn't round trip. %08X vs %08X (%s)\n", + j, idFromSS, identifier, testCases[i]); + } + if(strcmp(fromIDBuffer, fromIDRoundtrip)) { + log_err("FD = %i, SS didn't round trip. %s vs %s (%s)\n", + j, fromIDBuffer, fromIDRoundtrip, testCases[i]); + } + } + + ucol_close(fromNormalized); + ucol_close(coll); + + } else { + if(parseError.offset != testCases[i].expectedOffset) { + log_err("Got parse error offset %i, but expected %i instead for '%s'\n", + parseError.offset, testCases[i].expectedOffset, testCases[i].input); + } + } + } + +} + +static void +doSetsTest(const USet *ref, USet *set, const char* inSet, const char* outSet, UErrorCode *status) { + UChar buffer[512]; + int32_t bufLen; + + uset_clear(set); + bufLen = u_unescape(inSet, buffer, 512); + uset_applyPattern(set, buffer, bufLen, 0, status); + if(U_FAILURE(*status)) { + log_err("Failure setting pattern %s\n", u_errorName(*status)); + } + + if(!uset_containsAll(ref, set)) { + log_err("Some stuff from %s is not present in the set\n", inSet); + } + + uset_clear(set); + bufLen = u_unescape(outSet, buffer, 512); + uset_applyPattern(set, buffer, bufLen, 0, status); + if(U_FAILURE(*status)) { + log_err("Failure setting pattern %s\n", u_errorName(*status)); + } + + if(!uset_containsNone(ref, set)) { + log_err("Some stuff from %s is present in the set\n", outSet); + } +} + + + + +static void +TestGetContractionsAndUnsafes(void) +{ + static struct { + const char* locale; + const char* inConts; + const char* outConts; + const char* unsafeCodeUnits; + const char* safeCodeUnits; + } tests[] = { + { "ru", + "[{\\u0474\\u030F}{\\u0475\\u030F}{\\u04D8\\u0308}{\\u04D9\\u0308}{\\u04E8\\u0308}{\\u04E9\\u0308}]", + "[{\\u0430\\u0306}{\\u0410\\u0306}{\\u0430\\u0308}{\\u0410\\u0306}{\\u0433\\u0301}{\\u0413\\u0301}]", + "[\\u0474\\u0475\\u04d8\\u04d9\\u04e8\\u04e9]", + "[aAbB\\u0430\\u0410\\u0433\\u0413]" + }, + { "uk", + "[{\\u0474\\u030F}{\\u0475\\u030F}{\\u04D8\\u0308}{\\u04D9\\u0308}{\\u04E8\\u0308}{\\u04E9\\u0308}" + "{\\u0430\\u0306}{\\u0410\\u0306}{\\u0430\\u0308}{\\u0410\\u0306}{\\u0433\\u0301}{\\u0413\\u0301}]", + "[]", + "[\\u0474\\u0475\\u04D8\\u04D9\\u04E8\\u04E9\\u0430\\u0410\\u0433\\u0413]", + "[aAbBxv]", + }, + { "ja", + "[{\\u309d\\u3099}{\\u30fd\\u3099}]", + "[{lj}{nj}]", + "[\\u3099\\u309d\\u30fd]", + "[\\u30a6\\u3044\\uff73]" + }, + { "sh", + "[{C\\u0301}{C\\u030C}{C\\u0341}{DZ\\u030C}{Dz\\u030C}{D\\u017D}{D\\u017E}{lj}{nj}]", + "[{\\u309d\\u3099}{\\u30fd\\u3099}]", + "[nlcdzNLCDZ]", + "[jabv]" + } + }; + + + + + UErrorCode status = U_ZERO_ERROR; + UCollator *coll = NULL; + int32_t i = 0; + int32_t noConts = 0; + USet *conts = uset_open(0,0); + USet *set = uset_open(0,0); + UChar buffer[32768]; + int32_t setLen = 0; + + for(i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) { + log_verbose("Testing locale: %s\n", tests[i].locale); + coll = ucol_open(tests[i].locale, &status); + noConts = ucol_getContractions(coll, conts, &status); + doSetsTest(conts, set, tests[i].inConts, tests[i].outConts, &status); + setLen = uset_toPattern(conts, buffer, 32768, TRUE, &status); + if(U_SUCCESS(status)) { + log_verbose("%i: %s\n", noConts, aescstrdup(buffer, setLen)); + } else { + log_err("error %s. %i\n", u_errorName(status), setLen); + } + + noConts = ucol_getUnsafeSet(coll, conts, &status); + doSetsTest(conts, set, tests[i].unsafeCodeUnits, tests[i].safeCodeUnits, &status); + + ucol_close(coll); + } + + + uset_close(conts); + uset_close(set); +} + #endif /* #if !UCONFIG_NO_COLLATION */ diff --git a/icuSources/test/cintltst/capitst.h b/icuSources/test/cintltst/capitst.h index b60cdd76..e9885f54 100644 --- a/icuSources/test/cintltst/capitst.h +++ b/icuSources/test/cintltst/capitst.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** @@ -105,6 +105,17 @@ void genericLocaleStarter(const char *locale, const char *s[], uint32_t size); + /** + * test short string and collator identifier functions + */ + static void TestShortString(void); + + /** + * test getContractions and getUnsafeSet + */ + static void TestGetContractionsAndUnsafes(void); + + #endif /* #if !UCONFIG_NO_COLLATION */ #endif diff --git a/icuSources/test/cintltst/cbiapts.c b/icuSources/test/cintltst/cbiapts.c index ecf20e85..86f3f793 100644 --- a/icuSources/test/cintltst/cbiapts.c +++ b/icuSources/test/cintltst/cbiapts.c @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** @@ -23,6 +23,7 @@ #if !UCONFIG_NO_BREAK_ITERATION #include +#include #include "unicode/uloc.h" #include "unicode/ubrk.h" #include "unicode/ustring.h" @@ -30,9 +31,16 @@ #include "cintltst.h" #include "cbiapts.h" +#define TEST_ASSET_SUCCESS(status) {if (U_FAILURE(status)) { \ +log_err("Failure at file %s, line %d, error = %s\n", __FILE__, __LINE__, u_errorName(status));}} + +#define TEST_ASSERT(expr) {if ((expr)==FALSE) { \ +log_err("Test Failure at file %s, line %d\n", __FILE__, __LINE__);}} + static void TestBreakIteratorSafeClone(void); static void TestBreakIteratorRules(void); static void TestBreakIteratorRuleError(void); +static void TestBreakIteratorStatusVec(void); void addBrkIterAPITest(TestNode** root); @@ -42,6 +50,7 @@ void addBrkIterAPITest(TestNode** root) addTest(root, &TestBreakIteratorSafeClone, "tstxtbd/cbiapts/TestBreakIteratorSafeClone"); addTest(root, &TestBreakIteratorRules, "tstxtbd/cbiapts/TestBreakIteratorRules"); addTest(root, &TestBreakIteratorRuleError, "tstxtbd/cbiapts/TestBreakIteratorRuleError"); + addTest(root, &TestBreakIteratorStatusVec, "tstxtbd/cbiapts/TestBreakIteratorStatusVec"); } #define CLONETEST_ITERATOR_COUNT 2 @@ -72,7 +81,7 @@ static UChar* toUChar(const char *src, void **freeHook) { return NULL; }; - cnv = ucnv_open(NULL, &status); + cnv = ucnv_open(NULL, &status); if(U_FAILURE(status) || cnv == NULL) { return NULL; } @@ -140,8 +149,8 @@ static void TestBreakIteratorCAPI() /* Use french for fun */ word = ubrk_open(UBRK_WORD, "en_US", text, u_strlen(text), &status); if(status == U_FILE_ACCESS_ERROR) { - log_data_err("Check your data - it doesn't seem to be around\n"); - return; + log_data_err("Check your data - it doesn't seem to be around\n"); + return; } else if(U_FAILURE(status)){ log_err("FAIL: Error in ubrk_open() for word breakiterator: %s\n", myErrorName(status)); } @@ -152,6 +161,7 @@ static void TestBreakIteratorCAPI() sentence = ubrk_open(UBRK_SENTENCE, "en_US", text, u_strlen(text), &status); if(U_FAILURE(status)){ log_err("FAIL: Error in ubrk_open() for sentence breakiterator: %s\n", myErrorName(status)); + return; } else{ log_verbose("PASS: Successfully opened sentence breakiterator\n"); @@ -160,6 +170,7 @@ static void TestBreakIteratorCAPI() line = ubrk_open(UBRK_LINE, "en_US", text, u_strlen(text), &status); if(U_FAILURE(status)){ log_err("FAIL: Error in ubrk_open() for line breakiterator: %s\n", myErrorName(status)); + return; } else{ log_verbose("PASS: Successfully opened line breakiterator\n"); @@ -168,6 +179,7 @@ static void TestBreakIteratorCAPI() character = ubrk_open(UBRK_CHARACTER, "en_US", text, u_strlen(text), &status); if(U_FAILURE(status)){ log_err("FAIL: Error in ubrk_open() for character breakiterator: %s\n", myErrorName(status)); + return; } else{ log_verbose("PASS: Successfully opened character breakiterator\n"); @@ -563,4 +575,52 @@ static void TestBreakIteratorRuleError() { freeToUCharStrings(&freeHook); } + +/* +* TestsBreakIteratorStatusVals() Test the ubrk_getRuleStatusVec() funciton +*/ +static void TestBreakIteratorStatusVec() { + #define RULE_STRING_LENGTH 200 + UChar rules[RULE_STRING_LENGTH]; + + #define TEST_STRING_LENGTH 25 + UChar testString[TEST_STRING_LENGTH]; + UBreakIterator *bi = NULL; + int32_t pos = 0; + int32_t vals[10]; + int32_t numVals; + UErrorCode status = U_ZERO_ERROR; + + u_uastrncpy(rules, "[A-N]{100}; \n" + "[a-w]{200}; \n" + "[\\p{L}]{300}; \n" + "[\\p{N}]{400}; \n" + "[0-5]{500}; \n" + "!.*;\n", RULE_STRING_LENGTH); + u_uastrncpy(testString, "ABC", TEST_STRING_LENGTH); + + + bi = ubrk_openRules(rules, -1, testString, -1, NULL, &status); + TEST_ASSET_SUCCESS(status); + TEST_ASSERT(bi != NULL); + + pos = ubrk_next(bi); + TEST_ASSERT(pos == 1); + + memset(vals, -1, sizeof(vals)); + numVals = ubrk_getRuleStatusVec(bi, vals, 10, &status); + TEST_ASSET_SUCCESS(status); + TEST_ASSERT(numVals == 2); + TEST_ASSERT(vals[0] == 100); + TEST_ASSERT(vals[1] == 300); + TEST_ASSERT(vals[2] == -1); + + numVals = ubrk_getRuleStatusVec(bi, vals, 0, &status); + TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR); + TEST_ASSERT(numVals == 2); + + ubrk_close(bi); +} + + #endif /* #if !UCONFIG_NO_BREAK_ITERATION */ diff --git a/icuSources/test/cintltst/cbididat.c b/icuSources/test/cintltst/cbididat.c index 57008454..4b804ff9 100644 --- a/icuSources/test/cintltst/cbididat.c +++ b/icuSources/test/cintltst/cbididat.c @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /* file name: cbididat.c @@ -23,7 +23,7 @@ dirPropNames[dirPropCount]={ "LRE", "LRO", "AL", "RLE", "RLO", "PDF", "NSM", "BN" }; -const UChar +UChar charFromDirProp[dirPropCount]={ /* L R EN ES ET AN CS B S WS ON */ 0x61, 0x5d0, 0x30, 0x2f, 0x25, 0x660, 0x2c, 0xa, 0x9, 0x20, 0x26, @@ -313,6 +313,51 @@ testLevels20[]={ 2 }; +static const uint8_t +testText16[]={ + L, L, L, WS, L, L, L, WS, L, L, L +}; + +static const UBiDiLevel +testLevels21[]={ + 2, 2, 2, 2, 2, 2, 2, 1 +}; + +static const uint8_t +testVisualMap20[]={ + 1, 2, 3, 4, 5, 6, 7, 0 +}; + +static const uint8_t +testText17[]={ + R, R, R, WS, R, R, R, WS, R, R, R +}; + +static const UBiDiLevel +testLevels22[]={ + 1, 1, 1, 1, 1, 1, 1, 0 +}; + +static const uint8_t +testVisualMap21[]={ + 6, 5, 4, 3, 2, 1, 0, 7 +}; + +static const uint8_t +testTextXX[]={ + L +}; + +static const UBiDiLevel +testLevelsXX[]={ + 2 +}; + +static const uint8_t +testVisualMapXX[]={ + 0 +}; + BiDiTestData tests[]={ {testText1, ARRAY_LENGTH(testText1), UBIDI_DEFAULT_LTR, -1, -1, @@ -374,7 +419,15 @@ tests[]={ testLevels19, testVisualMap19}, {testText15, ARRAY_LENGTH(testText15), UBIDI_DEFAULT_LTR, 2, 3, UBIDI_LTR, 2, - testLevels20, testVisualMap19} + testLevels20, testVisualMap19}, + {testText16, ARRAY_LENGTH(testText16), UBIDI_RTL, 0, 8, + UBIDI_MIXED, 1, + testLevels21, testVisualMap20}, + {testText17, ARRAY_LENGTH(testText17), UBIDI_LTR, 0, 8, + UBIDI_MIXED, 0, + testLevels22, testVisualMap21}, + {testTextXX, ARRAY_LENGTH(testTextXX), UBIDI_RTL, -1, -1, + UBIDI_MIXED, 1, testLevelsXX, testVisualMapXX} }; int diff --git a/icuSources/test/cintltst/cbiditst.c b/icuSources/test/cintltst/cbiditst.c index b643032e..21f0d35c 100644 --- a/icuSources/test/cintltst/cbiditst.c +++ b/icuSources/test/cintltst/cbiditst.c @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /* file name: cbiditst.cpp @@ -26,14 +26,17 @@ /* prototypes ---------------------------------------------------------------*/ +static void +charFromDirPropTest(void); + static void doBiDiTest(void); static void -doTests(UBiDi *pBiDi, UBiDi *pLine); +doTests(UBiDi *pBiDi, UBiDi *pLine, UBool countRunsFirst); static void -doTest(UBiDi *pBiDi, int testNumber, BiDiTestData *test, int32_t lineStart); +doTest(UBiDi *pBiDi, int testNumber, BiDiTestData *test, int32_t lineStart, UBool countRunsFirst); static void testReordering(UBiDi *pBiDi, int testNumber); @@ -68,6 +71,9 @@ static void TestReorder(void); static const char *levelString="..............................................................."; +static void +initCharFromDirProps(void); + static UChar * getStringFromDirProps(const uint8_t *dirProps, int32_t length); @@ -80,6 +86,7 @@ void addComplexTest(TestNode** root); void addComplexTest(TestNode** root) { + addTest(root, charFromDirPropTest, "complex/bidi/charFromDirPropTest"); addTest(root, doBiDiTest, "complex/bidi/BiDiTest"); addTest(root, doInverseBiDiTest, "complex/bidi/inverse"); addTest(root, TestReorder,"complex/bidi/TestReorder"); @@ -89,6 +96,21 @@ addComplexTest(TestNode** root) { addTest(root, doLOGICALArabicDeShapingTest, "complex/arabic-shaping/unshaping"); } +/* verify that the exemplar characters have the expected bidi classes */ +static void +charFromDirPropTest(void) { + int32_t i; + + initCharFromDirProps(); + + for(i=0; itext+lineStart; const UBiDiLevel *levels=test->levels; const uint8_t *visualMap=test->visualMap; - int32_t i, len=ubidi_getLength(pBiDi), logicalIndex, runCount; + int32_t i, len=ubidi_getLength(pBiDi), logicalIndex, runCount = 0; UErrorCode errorCode=U_ZERO_ERROR; UBiDiLevel level, level2; + if (countRunsFirst) { + log_verbose("Calling ubidi_countRuns() first.\n"); + + runCount = ubidi_countRuns(pBiDi, &errorCode); + + if(U_FAILURE(errorCode)) { + log_err("ubidi_countRuns(tests[%d]): error %s\n", testNumber, myErrorName(errorCode)); + return; + } + } else { + log_verbose("Calling ubidi_getLogicalMap() first.\n"); + } + testReordering(pBiDi, testNumber); for(i=0; i0) { + return; + } + + u_getUnicodeVersion(ucdVersion); + if(memcmp(ucdVersion, ucd401, sizeof(UVersionInfo))>=0) { + /* Unicode 4.0.1 changes bidi classes for +-/ */ + charFromDirProp[U_EUROPEAN_NUMBER_SEPARATOR]=0x2b; /* change ES character from / to + */ + } +} + /* return a string with characters according to the desired directional properties */ static UChar * getStringFromDirProps(const uint8_t *dirProps, int32_t length) { static UChar s[MAX_STRING_LENGTH]; int32_t i; + initCharFromDirProps(); + /* this part would have to be modified for UTF-x */ for(i=0; i= count Expected INDEX_OUTOFBOUNDS_ERROR Got %s\n", u_errorName(status)); } status=U_ZERO_ERROR; +#endif /*Test ucal_openTimeZones & ucal_openCountryTimeZones*/ for (j=0; j<2; ++j) { @@ -415,7 +417,8 @@ static void TestGetSetDateAPI() - + ctest_setTimeZone(NULL, &status); + /*testing ucal_setTimeZone() function*/ log_verbose("\nTesting if the function ucal_setTimeZone() works fine\n"); ucal_setMillis(caldef2, d2, &status); @@ -474,6 +477,9 @@ static void TestGetSetDateAPI() else if (zoneOffset != -28800000) { log_err("Error in getting the time zone using ucal_get() after using ucal_setTimeZone() offset=%d\n", zoneOffset); } + + ctest_resetTimeZone(); + /*----------------------------* */ diff --git a/icuSources/test/cintltst/ccapitst.c b/icuSources/test/cintltst/ccapitst.c index 96ef85e9..bc08e506 100644 --- a/icuSources/test/cintltst/ccapitst.c +++ b/icuSources/test/cintltst/ccapitst.c @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** @@ -19,18 +19,19 @@ #include "unicode/uloc.h" #include "unicode/ucnv.h" #include "unicode/ucnv_err.h" -#include "unicode/utypes.h" +#include "unicode/putil.h" #include "unicode/ustring.h" +#include "ucnv_bld.h" /* for sizeof(UConverter) */ #include "cintltst.h" #include "ccapitst.h" /* for not including "cstring.h" -begin*/ #ifdef WIN32 -# define stricmp(str1, str2) U_STANDARD_CPP_NAMESPACE _stricmp(str1, str2) +# define ctest_stricmp(str1, str2) U_STANDARD_CPP_NAMESPACE _stricmp(str1, str2) #elif defined(POSIX) -# define stricmp(str1, str2) U_STANDARD_CPP_NAMESPACE strcasecmp(str1, str2) +# define ctest_stricmp(str1, str2) U_STANDARD_CPP_NAMESPACE strcasecmp(str1, str2) #else -# define stricmp(str1, str2) T_CString_stricmp(str1, str2) +# define ctest_stricmp(str1, str2) T_CString_stricmp(str1, str2) #endif static int U_EXPORT2 @@ -82,9 +83,18 @@ T_CString_stricmp(const char *str1, const char *str2) { static UConverterFromUCallback otherUnicodeAction(UConverterFromUCallback MIA); static UConverterToUCallback otherCharAction(UConverterToUCallback MIA); +static UConverter * +cnv_open(const char *name, UErrorCode *pErrorCode) { + if(name!=NULL && name[0]=='*') { + return ucnv_openPackage(loadTestData(pErrorCode), name+1, pErrorCode); + } else { + return ucnv_open(name, pErrorCode); + } +} + static void ListNames(void); - void TestFlushCache(void); /* defined in cctest.c */ +static void TestFlushCache(void); static void TestDuplicateAlias(void); static void TestCCSID(void); static void TestJ932(void); @@ -94,6 +104,7 @@ static void TestConvertSafeCloneCallback(void); static void TestEBCDICSwapLFNL(void); static void TestConvertEx(void); static void TestConvertAlgorithmic(void); + void TestDefaultConverterError(void); /* defined in cctest.c */ void addTestConvert(TestNode** root); @@ -113,6 +124,7 @@ void addTestConvert(TestNode** root) addTest(root, &TestEBCDICSwapLFNL, "tsconv/ccapitst/TestEBCDICSwapLFNL"); addTest(root, &TestConvertEx, "tsconv/ccapitst/TestConvertEx"); addTest(root, &TestConvertAlgorithmic, "tsconv/ccapitst/TestConvertAlgorithmic"); + addTest(root, &TestDefaultConverterError, "tsconv/ccapitst/TestDefaultConverterError"); } static void ListNames(void) { @@ -522,9 +534,11 @@ static void TestConvert() for (codepage_index=0; codepage_index < NUM_CODEPAGE; ++codepage_index) { int32_t i = 0; - char* index = NULL; err = U_ZERO_ERROR; +#ifdef U_TOPSRCDIR + strcpy(ucs_file_name, U_TOPSRCDIR U_FILE_SEP_STRING"test"U_FILE_SEP_STRING"testdata"U_FILE_SEP_STRING); +#else strcpy(ucs_file_name, loadTestData(&err)); if(U_FAILURE(err)){ @@ -532,13 +546,16 @@ static void TestConvert() return; } - index=strrchr(ucs_file_name,(char)U_FILE_SEP_CHAR); + { + char* index = strrchr(ucs_file_name,(char)U_FILE_SEP_CHAR); - if((unsigned int)(index-ucs_file_name) != (strlen(ucs_file_name)-1)){ - *(index+1)=0; + if((unsigned int)(index-ucs_file_name) != (strlen(ucs_file_name)-1)){ + *(index+1)=0; + } } strcat(ucs_file_name,".."U_FILE_SEP_STRING); +#endif strcat(ucs_file_name, CodePagesTestFiles[codepage_index]); ucs_file_in = fopen(ucs_file_name,"rb"); @@ -569,7 +586,7 @@ static void TestConvert() { log_verbose("getName o.k. %s\n", ucnv_getName(myConverter, &err)); } - if (stricmp(ucnv_getName(myConverter, &err), CodePagesToTest[codepage_index])) + if (ctest_stricmp(ucnv_getName(myConverter, &err), CodePagesToTest[codepage_index])) log_err("getName failed\n"); else log_verbose("getName ok\n"); @@ -605,6 +622,9 @@ static void TestConvert() log_verbose("\n---Testing ucnv_getSubstChars...\n"); ii=4; ucnv_getSubstChars(myConverter, myptr, &ii, &err); + if (ii <= 0) { + log_err("ucnv_getSubstChars returned a negative number %d\n", ii); + } for(x=0;x \"%s\", expect ISO_2022\n", + log_err("FAIL: \"%s\" -> \"%s\", expect \"ISO_2022,locale=ja,version=2\"\n", ISO_2022_NAMES[i], mapBack); } } @@ -1549,17 +1644,48 @@ static void TestConvertSafeCloneCallback() } } +static UBool +containsAnyOtherByte(uint8_t *p, int32_t length, uint8_t b) { + while(length>0) { + if(*p!=b) { + return TRUE; + } + ++p; + --length; + } + return FALSE; +} + static void TestConvertSafeClone() { -#define CLONETEST_CONVERTER_COUNT 12 + /* one 'regular' & all the 'private stateful' converters */ + static const char *const names[] = { + "ibm-1047", + "ISO_2022,locale=zh,version=1", + "SCSU", + "HZ", + "lmbcs", + "ISCII,version=0", + "ISO_2022,locale=kr,version=1", + "ISO_2022,locale=jp,version=2", + "BOCU-1", + "UTF-7", + "IMAP-mailbox-name", + "ibm-1047-s390" + }; + + static const int32_t bufferSizes[] = { + U_CNV_SAFECLONE_BUFFERSIZE, + (int32_t)(3*sizeof(UConverter))/2, /* 1.5*sizeof(UConverter) */ + (int32_t)sizeof(UConverter)/2 /* 0.5*sizeof(UConverter) */ + }; char charBuffer [21]; /* Leave at an odd number for alignment testing */ - uint8_t buffer [CLONETEST_CONVERTER_COUNT] [U_CNV_SAFECLONE_BUFFERSIZE]; - int32_t bufferSize = U_CNV_SAFECLONE_BUFFERSIZE; - UConverter * someConverters [CLONETEST_CONVERTER_COUNT]; - UConverter * someClonedConverters [CLONETEST_CONVERTER_COUNT]; - UConverter * cnv; - UErrorCode err = U_ZERO_ERROR; + uint8_t buffer [3] [U_CNV_SAFECLONE_BUFFERSIZE]; + int32_t bufferSize, maxBufferSize; + const char *maxName; + UConverter * cnv, *cnv2; + UErrorCode err; char *pCharBuffer; const char *pConstCharBuffer; @@ -1573,145 +1699,182 @@ static void TestConvertSafeClone() UChar *pUCharTargetLimit = uniCharBuffer + sizeof(uniCharBuffer)/sizeof(*uniCharBuffer); const UChar * pUniBuffer; const UChar *uniBufferLimit = uniBuffer + sizeof(uniBuffer)/sizeof(*uniBuffer); - int index; - - /* one 'regular' & all the 'private stateful' converters */ - someConverters[0] = ucnv_open("ibm-1047", &err); - someConverters[1] = ucnv_open("ISO_2022", &err); - someConverters[2] = ucnv_open("SCSU", &err); - someConverters[3] = ucnv_open("HZ", &err); - someConverters[4] = ucnv_open("lmbcs", &err); - someConverters[5] = ucnv_open("ISCII,version=0",&err); - someConverters[6] = ucnv_open("ISO_2022,locale=kr,version=1",&err); - someConverters[7] = ucnv_open("ISO_2022,locale=jp,version=1",&err); - someConverters[8] = ucnv_open("BOCU-1", &err); - someConverters[9] = ucnv_open("UTF-7", &err); - someConverters[10] = ucnv_open("IMAP-mailbox-name", &err); - someConverters[11] = ucnv_open("ibm-1047-s390", &err); - - if(U_FAILURE(err)) { - log_data_err("problems creating converters to clone- check the data.\n"); - return; /* bail - leak */ - } - /* Check the various error & informational states: */ + int32_t index, j; - /* Null status - just returns NULL */ - if (0 != ucnv_safeClone(someConverters[0], buffer[0], &bufferSize, 0)) - { - log_err("FAIL: Cloned converter failed to deal correctly with null status\n"); - } - /* error status - should return 0 & keep error the same */ - err = U_MEMORY_ALLOCATION_ERROR; - if (0 != ucnv_safeClone(someConverters[0], buffer[0], &bufferSize, &err) || err != U_MEMORY_ALLOCATION_ERROR) - { - log_err("FAIL: Cloned converter failed to deal correctly with incoming error status\n"); - } err = U_ZERO_ERROR; + cnv = ucnv_open(names[0], &err); + if(U_SUCCESS(err)) { + /* Check the various error & informational states: */ - /* Null buffer size pointer - just returns NULL & set error to U_ILLEGAL_ARGUMENT_ERROR*/ - if (0 != ucnv_safeClone(someConverters[0], buffer[0], 0, &err) || err != U_ILLEGAL_ARGUMENT_ERROR) - { - log_err("FAIL: Cloned converter failed to deal correctly with null bufferSize pointer\n"); - } - err = U_ZERO_ERROR; + /* Null status - just returns NULL */ + bufferSize = U_CNV_SAFECLONE_BUFFERSIZE; + if (0 != ucnv_safeClone(cnv, buffer[0], &bufferSize, 0)) + { + log_err("FAIL: Cloned converter failed to deal correctly with null status\n"); + } + /* error status - should return 0 & keep error the same */ + err = U_MEMORY_ALLOCATION_ERROR; + if (0 != ucnv_safeClone(cnv, buffer[0], &bufferSize, &err) || err != U_MEMORY_ALLOCATION_ERROR) + { + log_err("FAIL: Cloned converter failed to deal correctly with incoming error status\n"); + } + err = U_ZERO_ERROR; - /* buffer size pointer is 0 - fill in pbufferSize with a size */ - bufferSize = 0; - if (0 != ucnv_safeClone(someConverters[0], buffer[0], &bufferSize, &err) || U_FAILURE(err) || bufferSize <= 0) - { - log_err("FAIL: Cloned converter failed a sizing request ('preflighting')\n"); - } - /* Verify our define is large enough */ - if (U_CNV_SAFECLONE_BUFFERSIZE < bufferSize) - { - log_err("FAIL: Pre-calculated buffer size is too small\n"); - } - /* Verify we can use this run-time calculated size */ - if (0 == (cnv = ucnv_safeClone(someConverters[0], buffer[0], &bufferSize, &err)) || U_FAILURE(err)) - { - log_err("FAIL: Converter can't be cloned with run-time size\n"); - } - if (cnv) - ucnv_close(cnv); - /* size one byte too small - should allocate & let us know */ - --bufferSize; - if (0 == (cnv = ucnv_safeClone(someConverters[0], 0, &bufferSize, &err)) || err != U_SAFECLONE_ALLOCATED_WARNING) - { - log_err("FAIL: Cloned converter failed to deal correctly with too-small buffer size\n"); - } - if (cnv) - ucnv_close(cnv); - err = U_ZERO_ERROR; - bufferSize = U_CNV_SAFECLONE_BUFFERSIZE; + /* Null buffer size pointer - just returns NULL & set error to U_ILLEGAL_ARGUMENT_ERROR*/ + if (0 != ucnv_safeClone(cnv, buffer[0], 0, &err) || err != U_ILLEGAL_ARGUMENT_ERROR) + { + log_err("FAIL: Cloned converter failed to deal correctly with null bufferSize pointer\n"); + } + err = U_ZERO_ERROR; - /* Null buffer pointer - return converter & set error to U_SAFECLONE_ALLOCATED_ERROR */ - if (0 == (cnv = ucnv_safeClone(someConverters[0], 0, &bufferSize, &err)) || err != U_SAFECLONE_ALLOCATED_WARNING) - { - log_err("FAIL: Cloned converter failed to deal correctly with null buffer pointer\n"); - } - if (cnv) - ucnv_close(cnv); - err = U_ZERO_ERROR; + /* buffer size pointer is 0 - fill in pbufferSize with a size */ + bufferSize = 0; + if (0 != ucnv_safeClone(cnv, buffer[0], &bufferSize, &err) || U_FAILURE(err) || bufferSize <= 0) + { + log_err("FAIL: Cloned converter failed a sizing request ('preflighting')\n"); + } + /* Verify our define is large enough */ + if (U_CNV_SAFECLONE_BUFFERSIZE < bufferSize) + { + log_err("FAIL: Pre-calculated buffer size is too small\n"); + } + /* Verify we can use this run-time calculated size */ + if (0 == (cnv2 = ucnv_safeClone(cnv, buffer[0], &bufferSize, &err)) || U_FAILURE(err)) + { + log_err("FAIL: Converter can't be cloned with run-time size\n"); + } + if (cnv2) { + ucnv_close(cnv2); + } + + /* size one byte too small - should allocate & let us know */ + --bufferSize; + if (0 == (cnv2 = ucnv_safeClone(cnv, 0, &bufferSize, &err)) || err != U_SAFECLONE_ALLOCATED_WARNING) + { + log_err("FAIL: Cloned converter failed to deal correctly with too-small buffer size\n"); + } + if (cnv2) { + ucnv_close(cnv2); + } + + err = U_ZERO_ERROR; + bufferSize = U_CNV_SAFECLONE_BUFFERSIZE; + + /* Null buffer pointer - return converter & set error to U_SAFECLONE_ALLOCATED_ERROR */ + if (0 == (cnv2 = ucnv_safeClone(cnv, 0, &bufferSize, &err)) || err != U_SAFECLONE_ALLOCATED_WARNING) + { + log_err("FAIL: Cloned converter failed to deal correctly with null buffer pointer\n"); + } + if (cnv2) { + ucnv_close(cnv2); + } + + err = U_ZERO_ERROR; - /* Null converter - return NULL & set U_ILLEGAL_ARGUMENT_ERROR */ - if (0 != ucnv_safeClone(0, buffer[0], &bufferSize, &err) || err != U_ILLEGAL_ARGUMENT_ERROR) - { - log_err("FAIL: Cloned converter failed to deal correctly with null converter pointer\n"); + /* Null converter - return NULL & set U_ILLEGAL_ARGUMENT_ERROR */ + if (0 != ucnv_safeClone(0, buffer[0], &bufferSize, &err) || err != U_ILLEGAL_ARGUMENT_ERROR) + { + log_err("FAIL: Cloned converter failed to deal correctly with null converter pointer\n"); + } + + ucnv_close(cnv); } - err = U_ZERO_ERROR; + maxBufferSize = 0; + maxName = ""; /* Do these cloned converters work at all - shuffle UChars to chars & back again..*/ - for (index = 0; index < CLONETEST_CONVERTER_COUNT; index++) - { - bufferSize = U_CNV_SAFECLONE_BUFFERSIZE; - someClonedConverters[index] = ucnv_safeClone(someConverters[index], buffer[index], &bufferSize, &err); + for(j = 0; j < LENGTHOF(bufferSizes); ++j) { + for (index = 0; index < LENGTHOF(names); index++) + { + err = U_ZERO_ERROR; + cnv = ucnv_open(names[index], &err); + if(U_FAILURE(err)) { + log_data_err("ucnv_open(\"%s\") failed - %s\n", names[index], u_errorName(err)); + continue; + } - /* close the original immediately to make sure that the clone works by itself */ - ucnv_close(someConverters[index]); + if(j == 0) { + /* preflight to get maxBufferSize */ + bufferSize = 0; + ucnv_safeClone(cnv, NULL, &bufferSize, &err); + if(bufferSize > maxBufferSize) { + maxBufferSize = bufferSize; + maxName = names[index]; + } + } - pCharBuffer = charBuffer; - pUniBuffer = uniBuffer; + memset(buffer, 0xaa, sizeof(buffer)); - ucnv_fromUnicode(someClonedConverters[index], - &pCharBuffer, - charBufferLimit, - &pUniBuffer, - uniBufferLimit, - NULL, - TRUE, - &err); - if(U_FAILURE(err)){ - log_err("FAIL: cloned converter failed to do fromU conversion. Error: %s\n",u_errorName(err)); - } - ucnv_toUnicode(someClonedConverters[index], - &pUCharTarget, - pUCharTargetLimit, - &pCharSource, - pCharSourceLimit, - NULL, - TRUE, - &err - ); + bufferSize = bufferSizes[j]; + cnv2 = ucnv_safeClone(cnv, buffer[1], &bufferSize, &err); - if(U_FAILURE(err)){ - log_err("FAIL: cloned converter failed to do toU conversion. Error: %s\n",u_errorName(err)); - } + /* close the original immediately to make sure that the clone works by itself */ + ucnv_close(cnv); - pConstCharBuffer = charBuffer; - if (uniBuffer [0] != ucnv_getNextUChar(someClonedConverters[index], &pConstCharBuffer, pCharBuffer, &err)) - { - log_err("FAIL: Cloned converter failed to do conversion. Error: %s\n",u_errorName(err)); + /* check if the clone function overwrote any bytes that it is not supposed to touch */ + if(bufferSize <= bufferSizes[j]) { + /* used the stack buffer */ + if( containsAnyOtherByte(buffer[0], (int32_t)sizeof(buffer[0]), 0xaa) || + containsAnyOtherByte(buffer[1]+bufferSize, (int32_t)(sizeof(buffer)-(sizeof(buffer[0])+bufferSize)), 0xaa) + ) { + log_err("cloning %s in a stack buffer overwrote bytes outside the bufferSize %d (requested %d)\n", + names[index], bufferSize, bufferSizes[j]); + } + } else { + /* heap-allocated the clone */ + if(containsAnyOtherByte(buffer[0], (int32_t)sizeof(buffer), 0xaa)) { + log_err("cloning %s used the heap (bufferSize %d, requested %d) but overwrote stack buffer bytes\n", + names[index], bufferSize, bufferSizes[j]); + } + } + + pCharBuffer = charBuffer; + pUniBuffer = uniBuffer; + + ucnv_fromUnicode(cnv2, + &pCharBuffer, + charBufferLimit, + &pUniBuffer, + uniBufferLimit, + NULL, + TRUE, + &err); + if(U_FAILURE(err)){ + log_err("FAIL: cloned converter failed to do fromU conversion. Error: %s\n",u_errorName(err)); + } + ucnv_toUnicode(cnv2, + &pUCharTarget, + pUCharTargetLimit, + &pCharSource, + pCharSourceLimit, + NULL, + TRUE, + &err + ); + + if(U_FAILURE(err)){ + log_err("FAIL: cloned converter failed to do toU conversion. Error: %s\n",u_errorName(err)); + } + + pConstCharBuffer = charBuffer; + if (uniBuffer [0] != ucnv_getNextUChar(cnv2, &pConstCharBuffer, pCharBuffer, &err)) + { + log_err("FAIL: Cloned converter failed to do conversion. Error: %s\n",u_errorName(err)); + } + ucnv_close(cnv2); } - ucnv_close(someClonedConverters[index]); } + + log_verbose("ucnv_safeClone(): sizeof(UConverter)=%lu max preflighted clone size=%d (%s) U_CNV_SAFECLONE_BUFFERSIZE=%d\n", + sizeof(UConverter), maxBufferSize, maxName, (int)U_CNV_SAFECLONE_BUFFERSIZE); } static void TestCCSID() { UConverter *cnv; UErrorCode errorCode; - int32_t ccsids[]={ 37, 850, 943, 949, 950, 1047, 1252, 33722 }; + int32_t ccsids[]={ 37, 850, 943, 949, 950, 1047, 1252, 1392, 33722 }; int32_t i, ccsid; for(i=0; i<(int32_t)(sizeof(ccsids)/sizeof(int32_t)); ++i) { @@ -1720,7 +1883,7 @@ static void TestCCSID() { errorCode=U_ZERO_ERROR; cnv=ucnv_openCCSID(ccsid, UCNV_IBM, &errorCode); if(U_FAILURE(errorCode)) { - log_data_err("error: ucnv_openCCSID(%ld) failed (%s)\n", ccsid, u_errorName(errorCode)); + log_data_err("error: ucnv_openCCSID(%ld) failed (%s)\n", ccsid, u_errorName(errorCode)); continue; } @@ -1728,7 +1891,8 @@ static void TestCCSID() { log_err("error: ucnv_getCCSID(ucnv_openCCSID(%ld))=%ld\n", ccsid, ucnv_getCCSID(cnv, &errorCode)); } - if(UCNV_IBM!=ucnv_getPlatform(cnv, &errorCode)) { + /* skip gb18030(ccsid 1392) */ + if(ccsid != 1392 && UCNV_IBM!=ucnv_getPlatform(cnv, &errorCode)) { log_err("error: ucnv_getPlatform(ucnv_openCCSID(%ld))=%ld!=UCNV_IBM\n", ccsid, ucnv_getPlatform(cnv, &errorCode)); } @@ -2059,7 +2223,7 @@ static void TestConvertEx() { * expected output when converting shiftJIS[] from UTF-8 to Shift-JIS: * SUB, SUB, 0x40, SUB, SUB, 0x40 */ - 0x81, 0xa1, 0x81, 0xa1, 0x40, 0x81, 0xa1, 0x81, 0xa1, 0x40 + 0xfc, 0xfc, 0xfc, 0xfc, 0x40, 0xfc, 0xfc, 0xfc, 0xfc, 0x40 }; char srcBuffer[100], targetBuffer[100]; @@ -2307,33 +2471,69 @@ static void TestLMBCSMaxChar(void) { int8_t maxSize; const char *name; } converter[] = { - { 2, "LMBCS-1"}, - { 2, "LMBCS-2"}, - { 2, "LMBCS-3"}, - { 2, "LMBCS-4"}, - { 2, "LMBCS-5"}, - { 2, "LMBCS-6"}, - { 2, "LMBCS-8"}, - { 2, "LMBCS-11"}, - { 2, "LMBCS-16"}, - { 2, "LMBCS-17"}, - { 2, "LMBCS-18"}, - { 2, "LMBCS-19"} + /* some non-LMBCS converters - perfect test setup here */ + { 1, "US-ASCII"}, + { 1, "ISO-8859-1"}, + + { 2, "UTF-16"}, + { 2, "UTF-16BE"}, + { 3, "UTF-8"}, + { 3, "CESU-8"}, + { 3, "SCSU"}, + { 4, "UTF-32"}, + { 4, "UTF-7"}, + { 4, "IMAP-mailbox-name"}, + { 4, "BOCU-1"}, + + { 1, "windows-1256"}, + { 2, "Shift-JIS"}, + { 2, "ibm-16684"}, + { 3, "ibm-930"}, + { 3, "ibm-1390"}, + { 4, "*test3"}, + { 16,"*test4"}, + + { 4, "ISCII"}, + { 4, "HZ"}, + + { 3, "ISO-2022"}, + { 3, "ISO-2022-KR"}, + { 6, "ISO-2022-JP"}, + { 8, "ISO-2022-CN"}, + + /* LMBCS */ + { 3, "LMBCS-1"}, + { 3, "LMBCS-2"}, + { 3, "LMBCS-3"}, + { 3, "LMBCS-4"}, + { 3, "LMBCS-5"}, + { 3, "LMBCS-6"}, + { 3, "LMBCS-8"}, + { 3, "LMBCS-11"}, + { 3, "LMBCS-16"}, + { 3, "LMBCS-17"}, + { 3, "LMBCS-18"}, + { 3, "LMBCS-19"} }; int32_t idx; for (idx = 0; idx < LENGTHOF(converter); idx++) { UErrorCode status = U_ZERO_ERROR; - UConverter *cnv = ucnv_open(converter[idx].name, &status); + UConverter *cnv = cnv_open(converter[idx].name, &status); if (U_FAILURE(status)) { continue; } if (converter[idx].maxSize != ucnv_getMaxCharSize(cnv)) { - log_data_err("error: for %s expected %d, got %d\n", + log_err("error: ucnv_getMaxCharSize(%s) expected %d, got %d\n", converter[idx].name, converter[idx].maxSize, ucnv_getMaxCharSize(cnv)); } ucnv_close(cnv); } + + /* mostly test that the macro compiles */ + if(UCNV_GET_MAX_BYTES_FOR_STRING(1, 2)<10) { + log_err("error UCNV_GET_MAX_BYTES_FOR_STRING(1, 2)<10\n"); + } } @@ -2576,6 +2776,3 @@ TestEBCDICSwapLFNL() { testSwap(tests[i].name, tests[i].swap); } } - - - diff --git a/icuSources/test/cintltst/cctest.c b/icuSources/test/cintltst/cctest.c index 8c6282f4..c7085a12 100644 --- a/icuSources/test/cintltst/cctest.c +++ b/icuSources/test/cintltst/cctest.c @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -8,81 +8,28 @@ #include "unicode/ucnv_err.h" #include "cintltst.h" -#include "ustr_imp.h" -void TestFlushCache(void); /* keep gcc happy */ +#include "ustr_cnv.h" +void TestDefaultConverterError(void); /* keep gcc happy */ -void TestFlushCache(void) { +/* This makes sure that a converter isn't leaked when an error is passed to + u_getDefaultConverter */ +void TestDefaultConverterError(void) { UErrorCode err = U_ZERO_ERROR; - UConverter* someConverters[5]; - int flushCount = 0; - /* flush the converter cache to get a consistent state before the flushing is tested */ - ucnv_flushCache(); + /* Remove the default converter */ + ucnv_close(u_getDefaultConverter(&err)); - /*Testing ucnv_open()*/ - /* Note: These converters have been chosen because they do NOT - encode the Latin characters (U+0041, ...), and therefore are - highly unlikely to be chosen as system default codepages */ - - someConverters[0] = ucnv_open("ibm-1047", &err); - if (U_FAILURE(err)) { - log_data_err("FAILURE! %s\n", myErrorName(err)); - } - - someConverters[1] = ucnv_open("ibm-1047", &err); - if (U_FAILURE(err)) { - log_data_err("FAILURE! %s\n", myErrorName(err)); - } - - someConverters[2] = ucnv_open("ibm-1047", &err); if (U_FAILURE(err)) { - log_data_err("FAILURE! %s\n", myErrorName(err)); + log_err("Didn't expect a failure yet %s\n", myErrorName(err)); + return; } - someConverters[3] = ucnv_open("gb18030", &err); - if (U_FAILURE(err)) { - log_data_err("FAILURE! %s\n", myErrorName(err)); + /* Set to any radom error state */ + err = U_FILE_ACCESS_ERROR; + if (u_getDefaultConverter(&err) != NULL) { + log_err("Didn't expect to get a converter on a failure\n"); } - - someConverters[4] = ucnv_open("ibm-949", &err); - if (U_FAILURE(err)) { - log_data_err("FAILURE! %s\n", myErrorName(err)); - } - - - /* Testing ucnv_flushCache() */ - log_verbose("\n---Testing ucnv_flushCache...\n"); - if ((flushCount=ucnv_flushCache())==0) - log_verbose("Flush cache ok\n"); - else - log_data_err("Flush Cache failed [line %d], expect 0 got %d \n", __LINE__, flushCount); - - /*testing ucnv_close() and ucnv_flushCache() */ - ucnv_close(someConverters[0]); - ucnv_close(someConverters[1]); - - if ((flushCount=ucnv_flushCache())==0) - log_verbose("Flush cache ok\n"); - else - log_data_err("Flush Cache failed [line %d], expect 0 got %d \n", __LINE__, flushCount); - - ucnv_close(someConverters[2]); - ucnv_close(someConverters[3]); - - if ((flushCount=ucnv_flushCache())==2) - log_verbose("Flush cache ok\n"); /*because first, second and third are same */ - else - log_data_err("Flush Cache failed line %d, got %d expected 2 or there is an error in ucnv_close()\n", - __LINE__, - flushCount); - - ucnv_close(someConverters[4]); - if ( (flushCount=ucnv_flushCache())==1) - log_verbose("Flush cache ok\n"); - else - log_data_err("Flush Cache failed line %d, expected 1 got %d \n", __LINE__, flushCount); - } diff --git a/icuSources/test/cintltst/cdantst.c b/icuSources/test/cintltst/cdantst.c index 43a97ca7..9a1e7612 100644 --- a/icuSources/test/cintltst/cdantst.c +++ b/icuSources/test/cintltst/cdantst.c @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2003, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** @@ -187,8 +187,8 @@ void addDanishCollTest(TestNode** root) { - addTest(root, &TestTertiary, "tscoll/cdantst/TestTertiary"); - addTest(root, &TestPrimary, "tscoll/cdantst/TestPrimary"); + /*addTest(root, &TestTertiary, "tscoll/cdantst/TestTertiary");*/ + /*addTest(root, &TestPrimary, "tscoll/cdantst/TestPrimary");*/ } diff --git a/icuSources/test/cintltst/cdattst.c b/icuSources/test/cintltst/cdattst.c index 68ec5ab0..f4b039e7 100644 --- a/icuSources/test/cintltst/cdattst.c +++ b/icuSources/test/cintltst/cdattst.c @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** @@ -29,14 +29,22 @@ #include "cformtst.h" #include "cmemory.h" +#include + +static void TestExtremeDates(void); + +#define LEN(a) (sizeof(a)/sizeof(a[0])) + void addDateForTest(TestNode** root); +#define TESTCASE(x) addTest(root, &x, "tsformat/cdattst/" #x) void addDateForTest(TestNode** root) { - addTest(root, &TestDateFormat, "tsformat/cdattst/TestDateFormat"); - addTest(root, &TestSymbols, "tsformat/cdattst/TestSymbols"); - addTest(root, &TestDateFormatCalendar, "tsformat/cdattst/TestDateFormatCalendar"); + TESTCASE(TestDateFormat); + TESTCASE(TestSymbols); + TESTCASE(TestDateFormatCalendar); + TESTCASE(TestExtremeDates); } /* Testing the DateFormat API */ static void TestDateFormat() @@ -60,6 +68,9 @@ static void TestDateFormat() /*const char* str="yyyy.MM.dd G 'at' hh:mm:ss z"; const char t[]="2/3/76 2:50 AM";*/ /*Testing udat_open() to open a dateformat */ + + ctest_setTimeZone(NULL, &status); + log_verbose("\nTesting udat_open() with various parameters\n"); fr = udat_open(UDAT_FULL, UDAT_DEFAULT, "fr_FR", NULL,0, NULL, 0,&status); if(U_FAILURE(status)) @@ -115,7 +126,7 @@ static void TestDateFormat() log_verbose("Testing open of %s\n", udat_getAvailable(i)); any = udat_open(UDAT_SHORT, UDAT_SHORT, udat_getAvailable(i), NULL ,0, NULL, 0, &status); if(U_FAILURE(subStatus)) { - log_data_err("FAIL: date format %s (getAvailable(%d)) is not instantiable: %s\n", udat_getAvailable(i), i, u_errorName(subStatus)); + log_data_err("FAIL: date format %s (getAvailable(%d)) is not instantiable: %s\n", udat_getAvailable(i), i, u_errorName(subStatus)); } udat_close(any); } @@ -159,17 +170,17 @@ static void TestDateFormat() log_err("FAIL: Date Format for US locale failed using udat_format()\n"); /*format using fr */ - u_uastrcpy(temp, "10 juil. 96 16 h 05 GMT-07:00"); + u_unescape("10 juil. 96 16 h 05 HAP (\\u00c9UA)", temp, 30); if(result != NULL) { free(result); result = NULL; } result=myDateFormat(fr, d); if(u_strcmp(result, temp)==0) - log_verbose("PASS: Date Format for french locale successful uisng udat_format()\n"); + log_verbose("PASS: Date Format for french locale successful using udat_format()\n"); else - log_data_err("FAIL: Date Format for french locale failed using udat_format()\n"); - /*foramt using it */ + log_data_err("FAIL: Date Format for french locale failed using udat_format(). Expected:\n"); + /*format using it */ u_uastrcpy(temp, "10/lug/96 16:05:28"); if(u_strcmp(myDateFormat(it,d), temp)==0) @@ -182,6 +193,7 @@ static void TestDateFormat() log_verbose("\nTesting parsing using udat_parse()\n"); u_uastrcpy(temp,"2/3/76 2:50 AM"); parsepos=0; + status=U_ZERO_ERROR; d1=udat_parse(def, temp, u_strlen(temp), &parsepos, &status); if(U_FAILURE(status)) @@ -196,6 +208,18 @@ static void TestDateFormat() if(u_strcmp(myDateFormat(def, d1),temp)!=0) log_err("FAIL: error in parsing\n"); + /*Testing parsing using udat_parse()*/ + log_verbose("\nTesting parsing using udat_parse()\n"); + u_uastrcpy(temp,"2/Don't parse this part"); + status=U_ZERO_ERROR; + + d1=udat_parse(def, temp, u_strlen(temp), NULL, &status); + if(status != U_PARSE_ERROR) + { + log_err("FAIL: udat_parse(\"bad string\") passed when it should have failed\n"); + } + else + log_verbose("PASS: parsing succesful\n"); @@ -325,6 +349,7 @@ static void TestDateFormat() udat_close(fr_pat); udat_close(copy); + ctest_resetTimeZone(); } /*Testing udat_getSymbols() and udat_setSymbols() and udat_countSymbols()*/ @@ -418,7 +443,7 @@ static void TestSymbols() VerifygetSymbols(def, UDAT_AM_PMS, 1, "PM"); VerifygetSymbols(fr, UDAT_SHORT_MONTHS, 0, "janv."); VerifygetSymbols(def, UDAT_SHORT_MONTHS, 11, "Dec"); - VerifygetSymbols(def,UDAT_LOCALIZED_CHARS, 0, "GyMdkHmsSEDFwWahKzYe"); + VerifygetSymbols(def,UDAT_LOCALIZED_CHARS, 0, "GyMdkHmsSEDFwWahKzYeugAZ"); if(result != NULL) { @@ -558,6 +583,8 @@ static void TestDateFormatCalendar() { UDate when; UErrorCode ec = U_ZERO_ERROR; + ctest_setTimeZone(NULL, &ec); + /* Create a formatter for date fields. */ date = udat_open(UDAT_NONE, UDAT_SHORT, "en_US", NULL, 0, NULL, 0, &ec); if (U_FAILURE(ec)) { @@ -627,7 +654,7 @@ static void TestDateFormatCalendar() { if (when == 986517900000.0) { log_verbose("Ok: Parsed result: %s\n", cbuf); } else { - log_err("FAIL: Parsed result: %s, exp 4/5/2001 5:45 PM", cbuf); + log_err("FAIL: Parsed result: %s, exp 4/5/2001 5:45 PM\n", cbuf); } FAIL: @@ -635,6 +662,8 @@ static void TestDateFormatCalendar() { udat_close(time); udat_close(full); ucal_close(cal); + + ctest_resetTimeZone(); } /*INTERNAL FUNCTIONS USED*/ @@ -794,4 +823,85 @@ static UChar* myNumformat(const UNumberFormat* numfor, double d) return result2; } +/** + * The search depth for TestExtremeDates. The total number of + * dates that will be tested is (2^EXTREME_DATES_DEPTH) - 1. + */ +#define EXTREME_DATES_DEPTH 8 + +/** + * Support for TestExtremeDates (below). + * + * Test a single date to see whether udat_format handles it properly. + */ +static UBool _aux1ExtremeDates(UDateFormat* fmt, UDate date, + UChar* buf, int32_t buflen, char* cbuf, + UErrorCode* ec) { + int32_t len = udat_format(fmt, date, buf, buflen, 0, ec); + if (!assertSuccess("udat_format", ec)) return FALSE; + u_austrncpy(cbuf, buf, buflen); + if (len < 4) { + log_err("FAIL: udat_format(%g) => \"%s\"\n", date, cbuf); + } else { + log_verbose("udat_format(%g) => \"%s\"\n", date, cbuf); + } + return TRUE; +} + +/** + * Support for TestExtremeDates (below). + * + * Recursively test between 'small' and 'large', up to the depth + * limit specified by EXTREME_DATES_DEPTH. + */ +static UBool _aux2ExtremeDates(UDateFormat* fmt, UDate small, UDate large, + UChar* buf, int32_t buflen, char* cbuf, + int32_t count, + UErrorCode* ec) { + /* Logarithmic midpoint; see below */ + UDate mid = (UDate) exp((log(small) + log(large)) / 2); + if (count == EXTREME_DATES_DEPTH) { + return TRUE; + } + return + _aux1ExtremeDates(fmt, mid, buf, buflen, cbuf, ec) && + _aux2ExtremeDates(fmt, small, mid, buf, buflen, cbuf, count+1, ec) && + _aux2ExtremeDates(fmt, mid, large, buf, buflen, cbuf, count+1, ec); +} + +/** + * http://www.jtcsv.com/cgibin/icu-bugs?findid=3659 + * + * For certain large dates, udat_format crashes on MacOS. This test + * attempts to reproduce this problem by doing a recursive logarithmic* + * binary search of a predefined interval (from 'small' to 'large'). + * + * The limit of the search is given by EXTREME_DATES_DEPTH, above. + * + * *The search has to be logarithmic, not linear. A linear search of the + * range 0..10^30, for example, will find 0.5*10^30, then 0.25*10^30 and + * 0.75*10^30, etc. A logarithmic search will find 10^15, then 10^7.5 + * and 10^22.5, etc. + */ +static void TestExtremeDates() { + UDateFormat *fmt; + UErrorCode ec; + UChar buf[256]; + char cbuf[256]; + const double small = 1000; /* 1 sec */ + const double large = 1e+30; /* well beyond usable UDate range */ + + /* There is no need to test larger values from 1e+30 to 1e+300; + the failures occur around 1e+27, and never above 1e+30. */ + + ec = U_ZERO_ERROR; + fmt = udat_open(UDAT_LONG, UDAT_LONG, "en_US", + 0, 0, 0, 0, &ec); + if (!assertSuccess("udat_open", &ec)) return; + + _aux2ExtremeDates(fmt, small, large, buf, LEN(buf), cbuf, 0, &ec); + + udat_close(fmt); +} + #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/test/cintltst/cdtdptst.c b/icuSources/test/cintltst/cdtdptst.c index 2c4206bb..11b47351 100644 --- a/icuSources/test/cintltst/cdtdptst.c +++ b/icuSources/test/cintltst/cdtdptst.c @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2003, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** @@ -53,6 +53,8 @@ void TestTwoDigitYearDSTParse() UChar *s; int32_t pos; + ctest_setTimeZone(NULL, &status); + pattern=(UChar*)malloc(sizeof(UChar) * (strlen("EEE MMM dd HH:mm:ss.SSS zzz yyyy G")+1 )); u_uastrcpy(pattern, "EEE MMM dd HH:mm:ss.SSS zzz yyyy G"); fullFmt= udat_open(UDAT_IGNORE, UDAT_IGNORE,"en_US",NULL,0,pattern, u_strlen(pattern),&status); @@ -94,6 +96,8 @@ void TestTwoDigitYearDSTParse() udat_close(fmt); free(pattern); free(s); + + ctest_resetTimeZone(); } @@ -227,7 +231,6 @@ void TestCzechMonths459() UCalendar *cal; UDate june, july, d; UErrorCode status = U_ZERO_ERROR; - char buffer[512]; UChar *date; fmt = udat_open(UDAT_FULL, UDAT_FULL, "cs", NULL, 0, NULL, 0, &status); @@ -263,19 +266,17 @@ void TestCzechMonths459() } d = udat_parse(fmt, juneStr, u_strlen(juneStr), &pos, &status); date = myDateFormat(fmt, d); - u_UCharsToChars(date, buffer, (int32_t)(u_strlen(date)+1)); if(u_strcmp(myDateFormat(fmt, june), myDateFormat(fmt, d) ) !=0) log_err("Error in handling the czech month june\n"); else - log_verbose("Pass: Date = %s\n", buffer ); + log_verbose("Pass: Date = %s (czech month June)\n", aescstrdup(date, -1)); pos=0; d = udat_parse(fmt, julyStr, u_strlen(julyStr), &pos, &status); date = myDateFormat(fmt, d); - u_UCharsToChars(date, buffer, (int32_t)(u_strlen(date)+1)); if(u_strcmp(myDateFormat(fmt, july), myDateFormat(fmt, d) ) !=0) log_err("Error in handling the czech month july\n"); else - log_verbose("Pass: Date = %s\n", buffer ); + log_verbose("Pass: Date = %s (czech month July)\n", aescstrdup(date, -1)); udat_close(fmt); ucal_close(cal); @@ -295,6 +296,9 @@ void TestQuotePattern161() UChar *dateString; UErrorCode status = U_ZERO_ERROR; const char* expStr = "04/13/1999 at 10:42:28 AM "; + + ctest_setTimeZone(NULL, &status); + pattern=(UChar*)malloc(sizeof(UChar) * (strlen("MM/dd/yyyy 'at' hh:mm:ss a zzz")+1) ); u_uastrcpy(pattern, "MM/dd/yyyy 'at' hh:mm:ss a zzz"); @@ -322,7 +326,7 @@ void TestQuotePattern161() u_uastrcpy(exp, expStr); log_verbose("%s\n", austrdup(dateString) ); - if(u_strncmp(dateString, exp, strlen(expStr)) !=0) + if(u_strncmp(dateString, exp, (int32_t)strlen(expStr)) !=0) log_err("Error in formatting a pattern with single quotes\n"); udat_close(format); @@ -331,6 +335,7 @@ void TestQuotePattern161() free(tzID); free(pattern); + ctest_resetTimeZone(); } #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/test/cintltst/cdtrgtst.c b/icuSources/test/cintltst/cdtrgtst.c index 55e44e5a..7d5b3cbd 100644 --- a/icuSources/test/cintltst/cdtrgtst.c +++ b/icuSources/test/cintltst/cdtrgtst.c @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2003, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** @@ -130,7 +130,6 @@ void Test4056591() UChar s[10]; UChar *gotdate, *expdate; UChar pat[10]; - UChar *tzID; UDate d[4]; UErrorCode status = U_ZERO_ERROR; const char* strings[] = { @@ -141,9 +140,7 @@ void Test4056591() }; log_verbose("Testing s[get] 2 digit year start regressively\n"); - tzID=(UChar*)malloc(sizeof(UChar) * 4); - u_uastrcpy(tzID, "PST"); - cal=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_GREGORIAN, &status); + cal=ucal_open(NULL, 0, "en_US", UCAL_GREGORIAN, &status); if(U_FAILURE(status)){ log_err("error in ucal_open caldef : %s\n", myErrorName(status)); } @@ -161,7 +158,7 @@ void Test4056591() u_uastrcpy(pat, "yyMMdd"); - def = udat_open(UDAT_IGNORE,UDAT_IGNORE,NULL, NULL, 0,pat, u_strlen(pat), &status); + def = udat_open(UDAT_IGNORE,UDAT_IGNORE,NULL, NULL, 0, pat, u_strlen(pat), &status); if(U_FAILURE(status)) { log_err("FAIL: error in creating the dateformat using u_openPattern(): %s\n", myErrorName(status)); @@ -190,7 +187,6 @@ void Test4056591() udat_close(def); ucal_close(cal); - free(tzID); } @@ -203,11 +199,14 @@ void Test4059917() UChar *myDate; UErrorCode status = U_ZERO_ERROR; UChar *pattern; + UChar tzID[4]; + log_verbose("Testing apply pattern and to pattern regressively\n"); + u_uastrcpy(tzID, "PST"); pattern=(UChar*)malloc(sizeof(UChar) * 11); u_uastrcpy(pattern, "yyyy/MM/dd"); log_verbose("%s\n", austrdup(pattern) ); - def = udat_open(UDAT_IGNORE,UDAT_IGNORE,NULL,NULL,0,pattern, u_strlen(pattern),&status); + def = udat_open(UDAT_IGNORE,UDAT_IGNORE,NULL,tzID,-1,pattern, u_strlen(pattern),&status); if(U_FAILURE(status)) { log_err("FAIL: error in creating the dateformat using openPattern: %s\n", myErrorName(status)); @@ -236,11 +235,11 @@ void Test4059917() void aux917( UDateFormat *fmt, UChar* str) { - int32_t resultlength, resultlengthneeded; - UErrorCode status = U_ZERO_ERROR; - UChar* formatted=NULL; - UChar *pat=NULL; - UDate d1=1000000000.0; + int32_t resultlength, resultlengthneeded; + UErrorCode status = U_ZERO_ERROR; + UChar* formatted=NULL; + UChar *pat=NULL; + UDate d1=1000000000.0; resultlength=0; resultlengthneeded=udat_toPattern(fmt, TRUE, NULL, resultlength, &status); @@ -275,19 +274,20 @@ void Test4060212() UErrorCode status = U_ZERO_ERROR; UDate myDate; UChar *myString; - UChar dateString[20], pattern[20], tzID[4]; - u_uastrcpy(dateString, "1995-040.05:01:29"); - u_uastrcpy(pattern, "yyyy-DDD.hh:mm:ss"); + UChar dateString[30], pattern[20], tzID[4]; + u_uastrcpy(dateString, "1995-040.05:01:29 -8"); + u_uastrcpy(pattern, "yyyy-DDD.hh:mm:ss z"); log_verbose( "dateString= %s Using yyyy-DDD.hh:mm:ss\n", austrdup(dateString) ); status = U_ZERO_ERROR; - - formatter = udat_open(UDAT_IGNORE,UDAT_IGNORE,"en_US",NULL,0,pattern, u_strlen(pattern), &status); + u_uastrcpy(tzID, "PST"); + + formatter = udat_open(UDAT_IGNORE,UDAT_IGNORE,"en_US",tzID,-1,pattern, u_strlen(pattern), &status); pos=0; myDate = udat_parse(formatter, dateString, u_strlen(dateString), &pos, &status); - fmt = udat_open(UDAT_FULL,UDAT_LONG ,NULL, NULL, 0, NULL, 0, &status); + fmt = udat_open(UDAT_FULL,UDAT_LONG ,NULL, tzID, -1, NULL, 0, &status); if(U_FAILURE(status)) { log_err("FAIL: error in creating the dateformat using default date and time style: %s\n", @@ -295,7 +295,6 @@ void Test4060212() return; } myString = myFormatit(fmt, myDate); - u_uastrcpy(tzID, "PST"); cal=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_GREGORIAN, &status); if(U_FAILURE(status)){ log_err("FAIL: error in ucal_open caldef : %s\n", myErrorName(status)); @@ -474,6 +473,8 @@ void Test714(void) UChar *result; const char* expect = "7:25:43 AM"; + ctest_setTimeZone(NULL, &status); + fmt= udat_open(UDAT_MEDIUM,UDAT_NONE ,"en_US_CA", NULL, -1, NULL, 0, &status); if(U_FAILURE(status)) { @@ -495,6 +496,8 @@ void Test714(void) } udat_close(fmt); + + ctest_resetTimeZone(); } /*INTERNAL FUNCTION USED */ diff --git a/icuSources/test/cintltst/cfintst.c b/icuSources/test/cintltst/cfintst.c index 04fcdd39..4fa10b0d 100644 --- a/icuSources/test/cintltst/cfintst.c +++ b/icuSources/test/cintltst/cfintst.c @@ -1,7 +1,7 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and - * others. All Rights Reserved. + * Copyright (c) 1997-2004, International Business Machines Corporation + * and others. All Rights Reserved. ********************************************************************/ /******************************************************************************** * @@ -102,7 +102,7 @@ static void TestPrimary() } log_verbose("Testing Finnish Collation with Tertiary strength\n"); ucol_setStrength(myCollation, UCOL_PRIMARY); - for (i = 4; i < 4; i++) + for (i = 4; i < 5; i++) { doTest(myCollation, testSourceCases[i], testTargetCases[i], results[i]); } diff --git a/icuSources/test/cintltst/cformtst.c b/icuSources/test/cintltst/cformtst.c index 7235bece..6af51998 100644 --- a/icuSources/test/cintltst/cformtst.c +++ b/icuSources/test/cintltst/cformtst.c @@ -1,7 +1,7 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and - * others. All Rights Reserved. + * Copyright (c) 1997-2004, International Business Machines Corporation + * and others. All Rights Reserved. ********************************************************************/ /******************************************************************************** * @@ -29,6 +29,7 @@ void addMsgForTest(TestNode**); void addDateForRgrTest(TestNode**); void addNumFrDepTest(TestNode**); void addDtFrDepTest(TestNode**); +void addUtmsTest(TestNode**); void addFormatTest(TestNode** root); @@ -41,9 +42,10 @@ void addFormatTest(TestNode** root) addMsgForTest(root); addDateForRgrTest(root); addDtFrDepTest(root); + addUtmsTest(root); } -/*INternal functions used*/ +/*Internal functions used*/ UChar* myDateFormat(UDateFormat* dat, UDate d1) { diff --git a/icuSources/test/cintltst/cg7coll.c b/icuSources/test/cintltst/cg7coll.c index d639ea79..a493450e 100644 --- a/icuSources/test/cintltst/cg7coll.c +++ b/icuSources/test/cintltst/cg7coll.c @@ -189,7 +189,7 @@ static void TestDemo1() UCollator *myCollation; int32_t j, n; const char *rules = "& Z < p, P"; - int32_t len=strlen(rules); + int32_t len=(int32_t)strlen(rules); UChar *temp = (UChar*)malloc(sizeof(UChar) * (len+1)); UErrorCode status = U_ZERO_ERROR; u_uastrcpy(temp, rules); @@ -221,7 +221,7 @@ static void TestDemo2() UCollator *myCollation; int32_t j, n; const char *rules = "& C < ch , cH, Ch, CH"; - int32_t len=strlen(rules); + int32_t len=(int32_t)strlen(rules); UChar *temp = (UChar*)malloc(sizeof(UChar) * (len+1)); UErrorCode status = U_ZERO_ERROR; u_uastrcpy(temp, rules); @@ -251,7 +251,7 @@ static void TestDemo3() UCollator *myCollation; int32_t j, n; const char *rules = "& Question'-'mark ; '?' & Hash'-'mark ; '#' & Ampersand ; '&'"; - int32_t len=strlen(rules); + int32_t len=(int32_t)strlen(rules); UChar *temp = (UChar*)malloc(sizeof(UChar) * (len+1)); UErrorCode status = U_ZERO_ERROR; u_uastrcpy(temp, rules); @@ -282,7 +282,7 @@ static void TestDemo4() UCollator *myCollation; int32_t j, n; const char *rules = " & aa ; a'-' & ee ; e'-' & ii ; i'-' & oo ; o'-' & uu ; u'-' "; - int32_t len=strlen(rules); + int32_t len=(int32_t)strlen(rules); UChar *temp = (UChar*)malloc(sizeof(UChar) * (len+1)); UErrorCode status = U_ZERO_ERROR; u_uastrcpy(temp, rules); diff --git a/icuSources/test/cintltst/chashtst.c b/icuSources/test/cintltst/chashtst.c index bcd7f9d4..3030b3ff 100644 --- a/icuSources/test/cintltst/chashtst.c +++ b/icuSources/test/cintltst/chashtst.c @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 2000, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************* * Date Name Description @@ -173,24 +173,24 @@ static void TestOtherAPI(void){ } log_verbose("Ok: uhash_open returned 0x%08X\n", hash); - uhash_put(hash, (void*)one, (void*)1, &status); + uhash_puti(hash, (void*)one, 1, &status); if(uhash_count(hash) != 1){ log_err("FAIL: uhas_count() failed. Expected: 1, Got: %d\n", uhash_count(hash)); } - uhash_put(hash, (void*)two, (void*)2, &status); - uhash_put(hash, (void*)three, (void*)3, &status); - uhash_put(hash, (void*)four, (void*)4, &status); - uhash_put(hash, (void*)five, (void*)5, &status); + uhash_puti(hash, (void*)two, 2, &status); + uhash_puti(hash, (void*)three, 3, &status); + uhash_puti(hash, (void*)four, 4, &status); + uhash_puti(hash, (void*)five, 5, &status); if(uhash_count(hash) != 5){ log_err("FAIL: uhas_count() failed. Expected: 5, Got: %d\n", uhash_count(hash)); } - if((int32_t)uhash_get(hash, (void*)two2) != 2){ - log_err("FAIL: uhash_get failed\n"); + if(uhash_geti(hash, (void*)two2) != 2){ + log_err("FAIL: uhash_geti failed\n"); } - if((int32_t)uhash_remove(hash, (void*)five2) != 5){ + if(uhash_removei(hash, (void*)five2) != 5){ log_err("FAIL: uhash_remove() failed\n"); } if(uhash_count(hash) != 4){ @@ -202,13 +202,13 @@ static void TestOtherAPI(void){ log_err("FAIL: uhash_put() with value=NULL didn't remove the key value pair\n"); } status=U_ILLEGAL_ARGUMENT_ERROR; - uhash_put(hash, (void*)one, (void*)1, &status); + uhash_puti(hash, (void*)one, 1, &status); if(uhash_count(hash) != 3){ log_err("FAIL: uhash_put() with value!=NULL should fail when status != U_ZERO_ERROR \n"); } status=U_ZERO_ERROR; - uhash_put(hash, (void*)one, (void*)1, &status); + uhash_puti(hash, (void*)one, 1, &status); if(uhash_count(hash) != 4){ log_err("FAIL: uhash_put() with value!=NULL didn't replace the key value pair\n"); } @@ -227,9 +227,9 @@ static void TestOtherAPI(void){ uhash_setKeyComparator(hash, uhash_compareLong); uhash_setKeyHasher(hash, uhash_hashLong); - uhash_iput(hash, 1001, (void*)1, &status); - uhash_iput(hash, 1002, (void*)2, &status); - uhash_iput(hash, 1003, (void*)3, &status); + uhash_iputi(hash, 1001, 1, &status); + uhash_iputi(hash, 1002, 2, &status); + uhash_iputi(hash, 1003, 3, &status); if(_compareLong(1001, 1002) == TRUE || _compareLong(1001, 1001) != TRUE || _compareLong(1001, 0) == TRUE ) { @@ -238,16 +238,16 @@ static void TestOtherAPI(void){ /*set the resize policy to just GROW and SHRINK*/ /*how to test this??*/ uhash_setResizePolicy(hash, U_GROW_AND_SHRINK); - uhash_iput(hash, 1004, (void*)4, &status); - uhash_iput(hash, 1005, (void*)5, &status); - uhash_iput(hash, 1006, (void*)6, &status); + uhash_iputi(hash, 1004, 4, &status); + uhash_iputi(hash, 1005, 5, &status); + uhash_iputi(hash, 1006, 6, &status); if(uhash_count(hash) != 6){ log_err("FAIL: uhash_count() failed. Expected: 6, Got: %d\n", uhash_count(hash)); } - if((int32_t)uhash_iremove(hash, 1004) != 4){ + if(uhash_iremovei(hash, 1004) != 4){ log_err("FAIL: uhash_remove failed\n"); } - if((int32_t)uhash_iremove(hash, 1004) != 0){ + if(uhash_iremovei(hash, 1004) != 0){ log_err("FAIL: uhash_remove failed\n"); } uhash_close(hash); @@ -280,8 +280,8 @@ static void _put(UHashtable* hash, int32_t value, int32_t expectedOldValue) { UErrorCode status = U_ZERO_ERROR; - int32_t oldValue = (int32_t) - uhash_put(hash, (void*) key, (void*) value, &status); + int32_t oldValue = + uhash_puti(hash, (void*) key, value, &status); if (U_FAILURE(status)) { log_err("FAIL: uhash_put(%s) failed with %s and returned %ld\n", key, u_errorName(status), oldValue); @@ -298,7 +298,7 @@ static void _get(UHashtable* hash, const char* key, int32_t expectedValue) { UErrorCode status = U_ZERO_ERROR; - int32_t value = (int32_t) uhash_get(hash, key); + int32_t value = uhash_geti(hash, key); if (U_FAILURE(status)) { log_err("FAIL: uhash_get(%s) failed with %s and returned %ld\n", key, u_errorName(status), value); @@ -314,7 +314,7 @@ static void _get(UHashtable* hash, static void _remove(UHashtable* hash, const char* key, int32_t expectedValue) { - int32_t value = (int32_t) uhash_remove(hash, key); + int32_t value = uhash_removei(hash, key); if (value != expectedValue) { log_err("FAIL: uhash_remove(%s) returned %ld; expected %ld\n", key, value, expectedValue); diff --git a/icuSources/test/cintltst/cintltst.c b/icuSources/test/cintltst/cintltst.c index f99885a8..cf9f77cc 100644 --- a/icuSources/test/cintltst/cintltst.c +++ b/icuSources/test/cintltst/cintltst.c @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** @@ -20,15 +20,17 @@ #include #include "unicode/utypes.h" #include "unicode/putil.h" - +#include "cstring.h" #include "cintltst.h" #include "umutex.h" - +#include "uassert.h" #include "unicode/uchar.h" #include "unicode/ustring.h" #include "unicode/ucnv.h" #include "unicode/ures.h" #include "unicode/uclean.h" +#include "unicode/ucal.h" +#include "uoptions.h" #ifdef XP_MAC_CONSOLE # include @@ -37,7 +39,6 @@ #define CTST_LEAK_CHECK 1 #ifdef CTST_LEAK_CHECK U_CFUNC void ctst_freeAll(void); -U_CFUNC void ctst_init(void); #endif static char* _testDataPath=NULL; @@ -47,21 +48,7 @@ static char* _testDataPath=NULL; */ void ctest_setICU_DATA(void); -static UBool gMutexInitialized = FALSE; -static void TestMutex(void) { - if (!gMutexInitialized) { - log_verbose("*** Failure! The global mutex was not initialized.\n" - "*** Make sure the right linker was used.\n"); - } -} - -U_CFUNC void addSetup(TestNode** root); - -void addSetup(TestNode** root) -{ - addTest(root, &TestMutex, "setup/TestMutex"); -} #if UCONFIG_NO_LEGACY_CONVERSION # define TRY_CNV_1 "iso-8859-1" @@ -71,70 +58,148 @@ void addSetup(TestNode** root) # define TRY_CNV_2 "sjis" #endif + +/* + * Tracing functions. + */ +static int traceFnNestingDepth = 0; +U_CDECL_BEGIN +static void U_CALLCONV TraceEntry(const void *context, int32_t fnNumber) { + char buf[500]; + utrace_format(buf, sizeof(buf), traceFnNestingDepth*3, "%s() enter.\n", utrace_functionName(fnNumber)); + buf[sizeof(buf)-1]=0; + fputs(buf, stdout); + traceFnNestingDepth++; +} + +static void U_CALLCONV TraceExit(const void *context, int32_t fnNumber, const char *fmt, va_list args) { + char buf[500]; + + if (traceFnNestingDepth>0) { + traceFnNestingDepth--; + } + utrace_format(buf, sizeof(buf), traceFnNestingDepth*3, "%s() ", utrace_functionName(fnNumber)); + buf[sizeof(buf)-1]=0; + fputs(buf, stdout); + utrace_vformat(buf, sizeof(buf), traceFnNestingDepth*3, fmt, args); + buf[sizeof(buf)-1]=0; + fputs(buf, stdout); + putc('\n', stdout); +} + +static void U_CALLCONV TraceData(const void *context, int32_t fnNumber, + int32_t level, const char *fmt, va_list args) { + char buf[500]; + utrace_vformat(buf, sizeof(buf), traceFnNestingDepth*3, fmt, args); + buf[sizeof(buf)-1]=0; + fputs(buf, stdout); + putc('\n', stdout); +} +U_CDECL_END + + + int main(int argc, const char* const argv[]) { int nerrors = 0; int warnOnMissingData = 0; - int i; + int i, j; + UBool defaultDataFound; TestNode *root; const char *warnOrErr = "Failure"; + const char** argv2; /* initial check for the default converter */ UErrorCode errorCode = U_ZERO_ERROR; UResourceBundle *rb; UConverter *cnv; - /* This must be tested before using anything! */ - gMutexInitialized = umtx_isInitialized(NULL); + U_MAIN_INIT_ARGS(argc, argv); + + argv2 = (const char**) malloc(sizeof(char*) * argc); + if (argv2 == NULL) { + printf("*** Error: Out of memory (too many cmd line args?)\n"); + return 1; + } + argv2[0] = argv[0]; + /* Checkargs */ - for(i=1;i 0) { - -#ifdef CTST_LEAK_CHECK - ctst_init(); -#endif - /* try opening the data from dll instead of the dat file */ - cnv = ucnv_open(TRY_CNV_1, &errorCode); - if(cnv != 0) { - /* ok */ - ucnv_close(cnv); - } else { + argc = j; + + + utrace_setFunctions(NULL, TraceEntry, TraceExit, TraceData); + utrace_setLevel(ICU_TRACE); + + + while (REPEAT_TESTS > 0) { /* Loop runs once per complete execution of the tests + * used for -r (repeat) test option. */ + + /* Check whether ICU will initialize without forcing the build data directory into + * the ICU_DATA path. Success here means either the data dll contains data, or that + * this test program was run with ICU_DATA set externally. Failure of this check + * is normal when ICU data is not packaged into a shared library. + * + * Whether or not this test succeeds, we want to cleanup and reinitialize + * with a data path so that data loading from individual files can be tested. + */ + defaultDataFound = TRUE; + u_init(&errorCode); + if (U_FAILURE(errorCode)) { fprintf(stderr, - "#### WARNING! The converter for " TRY_CNV_1 " cannot be loaded from data dll/so." - "Proceeding to load data from dat file.\n"); - errorCode = U_ZERO_ERROR; - - ctest_setICU_DATA(); + "#### Note: ICU Init without build-specific setDataDirectory() failed.\n"); + defaultDataFound = FALSE; } - - /* If no ICU_DATA environment was set, try to fake up one. */ - /* fprintf(stderr, "u_getDataDirectory() = %s\n", u_getDataDirectory()); */ - -#ifdef XP_MAC_CONSOLE - argc = ccommand((char***)&argv); -#endif - - cnv = ucnv_open(NULL, &errorCode); - if(cnv != NULL) { - /* ok */ - ucnv_close(cnv); - } else { + u_cleanup(); + errorCode = U_ZERO_ERROR; + utrace_setFunctions(NULL, TraceEntry, TraceExit, TraceData); + utrace_setLevel(ICU_TRACE); + + /* Initialize ICU */ + if (!defaultDataFound) { + ctest_setICU_DATA(); /* u_setDataDirectory() must happen Before u_init() */ + } + u_init(&errorCode); + if (U_FAILURE(errorCode)) { fprintf(stderr, - "*** %s! The default converter cannot be opened.\n" + "#### ERROR! %s: u_init() failed with status = \"%s\".\n" "*** Check the ICU_DATA environment variable and \n" - "*** check that the data files are present.\n", warnOrErr); - if(warnOnMissingData == 0) { - fprintf(stderr, "*** Exitting. Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n"); - return 1; - } + "*** check that the data files are present.\n", argv[0], u_errorName(errorCode)); + if(warnOnMissingData == 0) { + fprintf(stderr, "*** Exiting. Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n"); + u_cleanup(); + return 1; + } } + + /* try more data */ cnv = ucnv_open(TRY_CNV_2, &errorCode); @@ -148,6 +213,7 @@ int main(int argc, const char* const argv[]) "*** check that the data files are present.\n", warnOrErr); if(warnOnMissingData == 0) { fprintf(stderr, "*** Exitting. Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n"); + u_cleanup(); return 1; } } @@ -163,39 +229,35 @@ int main(int argc, const char* const argv[]) "*** check that the data files are present.\n", warnOrErr); if(warnOnMissingData == 0) { fprintf(stderr, "*** Exitting. Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n"); + u_cleanup(); return 1; } } fprintf(stdout, "Default locale for this run is %s\n", uloc_getDefault()); + /* Build a tree of all tests. + * Subsequently will be used to find / iterate the tests to run */ root = NULL; addAllTests(&root); - nerrors = processArgs(root, argc, argv); + + /* Tests acutally run HERE. TODO: separate command line option parsing & setting from test execution!! */ + nerrors = processArgs(root, argc, argv2); + if (--REPEAT_TESTS > 0) { printf("Repeating tests %d more time(s)\n", REPEAT_TESTS); } cleanUpTestTree(root); + #ifdef CTST_LEAK_CHECK ctst_freeAll(); - /* To check for leaks */ - u_cleanup(); /* nuke the hashtable.. so that any still-open cnvs are leaked */ #endif - } - if (!gMutexInitialized) { - fprintf(stderr, - "#### WARNING!\n" - " The global mutex was not initialized during C++ static initialization.\n" - " You must explicitly initialize ICU by calling u_init() before using ICU in multiple threads.\n" - " If you are using ICU in a single threaded application, use of u_init() is recommended,\n" - " but is not required.\n" - "#### WARNING!\n" - ); - } + } /* End of loop that repeats the entire test, if requested. (Normally doesn't loop) */ + free((void*)argv2); return nerrors ? 1 : 0; } @@ -324,7 +386,6 @@ const char * ctest_dataSrcDir() char *pBackSlash; int i; - dataSrcDir = p; strcpy(p, __FILE__); /* We want to back over three '\' chars. */ /* Only Windows should end up here, so looking for '\' is safe. */ @@ -340,10 +401,18 @@ const char * ctest_dataSrcDir() * Now append "source\data" and set the environment */ strcpy(pBackSlash, U_FILE_SEP_STRING "data" U_FILE_SEP_STRING ); + dataSrcDir = p; } else { /* __FILE__ on MSVC7 does not contain the directory */ - strcpy(p, ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING); + FILE *file = fopen(".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "Makefile.in", "r"); + if (file) { + fclose(file); + dataSrcDir = ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING; + } + else { + dataSrcDir = ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING; + } } } #endif @@ -371,7 +440,7 @@ const char *ctest_dataOutDir() */ #if defined (U_TOPBUILDDIR) { - dataOutDir = U_TOPBUILDDIR U_FILE_SEP_STRING "data"U_FILE_SEP_STRING"out"U_FILE_SEP_STRING; + dataOutDir = U_TOPBUILDDIR "data"U_FILE_SEP_STRING"out"U_FILE_SEP_STRING; } #else @@ -384,7 +453,6 @@ const char *ctest_dataOutDir() char *pBackSlash; int i; - dataOutDir = p; strcpy(p, __FILE__); /* We want to back over three '\' chars. */ /* Only Windows should end up here, so looking for '\' is safe. */ @@ -400,10 +468,18 @@ const char *ctest_dataOutDir() * Now append "source\data" and set the environment */ strcpy(pBackSlash, U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING); + dataOutDir = p; } else { /* __FILE__ on MSVC7 does not contain the directory */ - strcpy(p, ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING); + FILE *file = fopen(".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "Makefile.in", "r"); + if (file) { + fclose(file); + dataOutDir = ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING; + } + else { + dataOutDir = ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING; + } } } #endif @@ -422,11 +498,13 @@ const char *ctest_dataOutDir() */ void ctest_setICU_DATA() { - /* No location for the data dir was identifiable. * Add other fallbacks for the test data location here if the need arises */ - u_setDataDirectory(ctest_dataOutDir()); + if (getenv("ICU_DATA") == NULL) { + /* If ICU_DATA isn't set, set it to the usual location */ + u_setDataDirectory(ctest_dataOutDir()); + } } UChar* CharsToUChars(const char* str) { @@ -520,19 +598,65 @@ const char* loadTestData(UErrorCode* err){ return _testDataPath; } +#define CTEST_MAX_TIMEZONE_SIZE 256 +static UChar gOriginalTimeZone[CTEST_MAX_TIMEZONE_SIZE] = {0}; + +/** + * Call this once to get a consistent timezone. Use ctest_resetTimeZone to set it back to the original value. + * @param optionalTimeZone Set this to a requested timezone. + * Set to NULL to use the standard test timezone (Pacific Time) + */ +U_CFUNC void ctest_setTimeZone(const char *optionalTimeZone, UErrorCode *status) { +#if !UCONFIG_NO_FORMATTING + UChar zoneID[CTEST_MAX_TIMEZONE_SIZE]; + + if (optionalTimeZone == NULL) { + optionalTimeZone = "America/Los_Angeles"; + } + if (gOriginalTimeZone[0]) { + log_err("*** Error: time zone saved twice. New value will be %s\n", + optionalTimeZone); + } + ucal_getDefaultTimeZone(gOriginalTimeZone, CTEST_MAX_TIMEZONE_SIZE, status); + if (U_FAILURE(*status)) { + log_err("*** Error: Failed to save default time zone: %s\n", + u_errorName(*status)); + *status = U_ZERO_ERROR; + } + + u_uastrncpy(zoneID, optionalTimeZone, CTEST_MAX_TIMEZONE_SIZE-1); + zoneID[CTEST_MAX_TIMEZONE_SIZE-1] = 0; + ucal_setDefaultTimeZone(zoneID, status); + if (U_FAILURE(*status)) { + log_err("*** Error: Failed to set default time zone to \"%s\": %s\n", + optionalTimeZone, u_errorName(*status)); + } +#endif +} + +/** + * Call this once get back the original timezone + */ +U_CFUNC void ctest_resetTimeZone(void) { +#if !UCONFIG_NO_FORMATTING + UErrorCode status = U_ZERO_ERROR; + + ucal_setDefaultTimeZone(gOriginalTimeZone, &status); + if (U_FAILURE(status)) { + log_err("*** Error: Failed to reset default time zone: %s\n", + u_errorName(status)); + } + /* Set to an empty state */ + gOriginalTimeZone[0] = 0; +#endif +} + #define CTST_MAX_ALLOC 10000 /* Array used as a queue */ -static void * ctst_allocated_stuff[CTST_MAX_ALLOC]; +static void * ctst_allocated_stuff[CTST_MAX_ALLOC] = {0}; static int ctst_allocated = 0; static UBool ctst_free = FALSE; -void ctst_init(void) { - int i; - for(i=0; i= CTST_MAX_ALLOC - 1) { ctst_allocated = 0; @@ -550,12 +674,56 @@ void ctst_freeAll() { if(ctst_free == 0) { for(i=0; i 0' which it evaluates as int */ +U_CFUNC UBool assertTrue(const char* msg, int /*not UBool*/ condition) { + if (!condition) { + log_err("FAIL: assertTrue() failed: %s\n", msg); + } +#ifdef VERBOSE_ASSERTIONS + else { + log_verbose("Ok: %s\n", msg); + } +#endif + return (UBool)condition; +} + +U_CFUNC UBool assertEquals(const char* message, const char* expected, + const char* actual) { + if (uprv_strcmp(expected, actual) != 0) { + log_err("FAIL: %s; got \"%s\"; expected \"%s\"\n", + message, actual, expected); + return FALSE; + } +#ifdef VERBOSE_ASSERTIONS + else { + log_verbose("Ok: %s; got \"%s\"\n", message, actual); + } +#endif + return TRUE; +} + #endif diff --git a/icuSources/test/cintltst/cintltst.dsp b/icuSources/test/cintltst/cintltst.dsp index 6eab0dc6..f0346d6d 100644 --- a/icuSources/test/cintltst/cintltst.dsp +++ b/icuSources/test/cintltst/cintltst.dsp @@ -96,7 +96,7 @@ LINK32=link.exe # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\..\include" /I "..\..\tools\ctestfw" /I "..\..\common" /I "..\..\i18n" /I "..\..\tools\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Zm600 /c +# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\..\include" /I "..\..\tools\ctestfw" /I "..\..\common" /I "..\..\i18n" /I "..\..\tools\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Zm600 /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -121,7 +121,7 @@ LINK32=link.exe # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\..\include" /I "..\..\tools\ctestfw" /I "..\..\common" /I "..\..\i18n" /I "..\..\tools\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /QIA64_fmaopt /Zm600 /c +# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\..\include" /I "..\..\tools\ctestfw" /I "..\..\common" /I "..\..\i18n" /I "..\..\tools\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /Zm600 /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe @@ -325,6 +325,10 @@ SOURCE=.\chashtst.c # End Source File # Begin Source File +SOURCE=.\sorttest.c +# End Source File +# Begin Source File + SOURCE=.\trietest.c # End Source File # Begin Source File @@ -472,12 +476,20 @@ SOURCE=.\cnumtst.c SOURCE=.\cnumtst.h # End Source File +# Begin Source File + +SOURCE=.\utmstest.c +# End Source File # End Group # Begin Group "locales & resources" # PROP Default_Filter "" # Begin Source File +SOURCE=.\cldrtest.c +# End Source File +# Begin Source File + SOURCE=.\cloctst.c # End Source File # Begin Source File @@ -526,12 +538,16 @@ SOURCE=.\cutiltst.c # End Source File # Begin Source File -SOURCE=.\mstrmtst.c +SOURCE=.\hpmufn.c # End Source File # Begin Source File SOURCE=.\putiltst.c # End Source File +# Begin Source File + +SOURCE=.\tracetst.c +# End Source File # End Group # Begin Group "normalization" @@ -568,6 +584,10 @@ SOURCE=.\usettest.c # Begin Group "regex" # PROP Default_Filter "" +# Begin Source File + +SOURCE=.\reapits.c +# End Source File # End Group # Begin Group "strings" @@ -605,5 +625,29 @@ SOURCE=.\utf8tst.c SOURCE=.\utransts.c # End Source File # End Group +# Begin Group "sprep & idna" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\idnatest.c +# End Source File +# Begin Source File + +SOURCE=.\nfsprep.c +# End Source File +# Begin Source File + +SOURCE=.\nfsprep.h +# End Source File +# Begin Source File + +SOURCE=.\spreptst.c +# End Source File +# Begin Source File + +SOURCE=.\sprpdata.c +# End Source File +# End Group # End Target # End Project diff --git a/icuSources/test/cintltst/cintltst.h b/icuSources/test/cintltst/cintltst.h index f5c042c4..199496e0 100644 --- a/icuSources/test/cintltst/cintltst.h +++ b/icuSources/test/cintltst/cintltst.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** @@ -20,6 +20,7 @@ The main root for C API tests #define _CINTLTST #include "unicode/utypes.h" +#include "unicode/putil.h" #include "unicode/ctest.h" #ifndef U_USE_DEPRECATED_API @@ -73,4 +74,36 @@ U_CFUNC const char* loadTestData(UErrorCode* err); #define myErrorName(errorCode) u_errorName(errorCode) +/** + * Call this once to get a consistent timezone. Use ctest_resetTimeZone to set it back to the original value. + * @param optionalTimeZone Set this to a requested timezone. + * Set to NULL to use the standard test timezone (Pacific Time) + */ +U_CFUNC void ctest_setTimeZone(const char *optionalTimeZone, UErrorCode *status); +/** + * Call this once get back the original timezone + */ +U_CFUNC void ctest_resetTimeZone(void); + +/** + * Assert that the given UErrorCode succeeds, and return TRUE if it does. + */ +U_CFUNC UBool assertSuccess(const char* msg, UErrorCode* ec); + +/** + * Assert that the UBool is TRUE, and return TRUE if it does. + * + * NOTE: Use 'int condition' rather than 'UBool condition' so the + * compiler doesn't complain about integral conversion of expressions + * like 'p != 0'. + */ +U_CFUNC UBool assertTrue(const char* msg, int condition); + +/** + * Assert that the actualString equals the expectedString, and return + * TRUE if it does. + */ +U_CFUNC UBool assertEquals(const char* msg, const char* expectedString, + const char* actualString); + #endif diff --git a/icuSources/test/cintltst/cintltst.vcproj b/icuSources/test/cintltst/cintltst.vcproj index f54e2e51..34479a83 100644 --- a/icuSources/test/cintltst/cintltst.vcproj +++ b/icuSources/test/cintltst/cintltst.vcproj @@ -1,7 +1,7 @@ - + @@ -27,6 +27,7 @@ PreprocessorDefinitions="WIN32,_DEBUG,_CONSOLE" BasicRuntimeChecks="3" RuntimeLibrary="1" + BufferSecurityCheck="TRUE" DisableLanguageExtensions="TRUE" PrecompiledHeaderFile=".\Debug/cintltst.pch" AssemblerListingLocation=".\Debug/" @@ -41,15 +42,13 @@ Name="VCCustomBuildTool"/> + SubSystem="1" + FixedBaseAddress="1"/> @@ -65,8 +64,14 @@ Culture="1033"/> + + + @@ -122,10 +125,18 @@ Culture="1033"/> + + + + + - - @@ -268,6 +276,9 @@ + + @@ -293,6 +304,9 @@ + + @@ -394,10 +408,16 @@ + + + + @@ -436,11 +456,14 @@ RelativePath=".\cutiltst.c"> + RelativePath=".\hpmufn.c"> + + + + @@ -500,6 +526,28 @@ + + + + + + + + + + + + + + diff --git a/icuSources/test/cintltst/citertst.c b/icuSources/test/cintltst/citertst.c index 77eaa169..055091c2 100644 --- a/icuSources/test/cintltst/citertst.c +++ b/icuSources/test/cintltst/citertst.c @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** @@ -25,6 +25,8 @@ #include "unicode/uloc.h" #include "unicode/uchar.h" #include "unicode/ustring.h" +#include "unicode/putil.h" +#include "callcoll.h" #include "cmemory.h" #include "cintltst.h" #include "citertst.h" @@ -570,7 +572,7 @@ static void TestOffset() u_uastrcpy(test1, "What subset of all possible test cases?"); u_uastrcpy(test2, "has the highest probability of detecting"); en_us = ucol_open("en_US", &status); - log_verbose("Testing getOffset and setOffset for CollationElements\n"); + log_verbose("Testing getOffset and setOffset for collations\n"); iter = ucol_openElements(en_us, test1, u_strlen(test1), &status); if(U_FAILURE(status)){ log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", @@ -578,6 +580,19 @@ static void TestOffset() ucol_close(en_us); return; } + + /* testing boundaries */ + ucol_setOffset(iter, 0, &status); + if (U_FAILURE(status) || ucol_previous(iter, &status) != UCOL_NULLORDER) { + log_err("Error: After setting offset to 0, we should be at the end " + "of the backwards iteration"); + } + ucol_setOffset(iter, u_strlen(test1), &status); + if (U_FAILURE(status) || ucol_next(iter, &status) != UCOL_NULLORDER) { + log_err("Error: After setting offset to end of the string, we should " + "be at the end of the backwards iteration"); + } + /* Run all the way through the iterator, then get the offset */ orders = getOrders(iter, &orderLength); @@ -759,69 +774,6 @@ static void TestSetText() free(test2); } - - -static void backAndForth(UCollationElements *iter) -{ - /* Run through the iterator forwards and stick it into an array */ - int32_t index, o; - UErrorCode status = U_ZERO_ERROR; - int32_t orderLength = 0; - int32_t *orders; - orders= getOrders(iter, &orderLength); - - - /* Now go through it backwards and make sure we get the same values */ - index = orderLength; - ucol_reset(iter); - - /* synwee : changed */ - while ((o = ucol_previous(iter, &status)) != UCOL_NULLORDER) - { - if (o != orders[-- index]) - { - if (o == 0) - index ++; - else - { - while (index > 0 && orders[-- index] == 0) - { - } - if (o != orders[index]) - { - log_err("Mismatch at index : 0x%x\n", index); - return; - } - - } - } - } - - while (index != 0 && orders[index - 1] == 0) { - index --; - } - - if (index != 0) - { - log_err("Didn't get back to beginning - index is %d\n", index); - - ucol_reset(iter); - log_err("\nnext: "); - if ((o = ucol_next(iter, &status)) != UCOL_NULLORDER) - { - log_err("Error at %x\n", o); - } - log_err("\nprev: "); - if ((o = ucol_previous(iter, &status)) != UCOL_NULLORDER) - { - log_err("Error at %x\n", o); - } - log_verbose("\n"); - } - - free(orders); -} - /** @bug 4108762 * Test for getMaxExpansion() */ @@ -830,7 +782,10 @@ static void TestMaxExpansion() UErrorCode status = U_ZERO_ERROR; UCollator *coll ;/*= ucol_open("en_US", &status);*/ UChar ch = 0; - UChar supplementary[2] = {0xD800, 0xDC00}; + UChar32 unassigned = 0xEFFFD; + UChar supplementary[2]; + uint32_t index = 0; + UBool isError = FALSE; uint32_t sorder = 0; UCollationElements *iter ;/*= ucol_openElements(coll, &ch, 1, &status);*/ uint32_t temporder = 0; @@ -901,6 +856,7 @@ static void TestMaxExpansion() ch, 3); } + U16_APPEND(supplementary, index, 2, unassigned, isError); ucol_setText(iter, supplementary, 2, &status); sorder = ucol_previous(iter, &status); @@ -952,57 +908,6 @@ static void TestMaxExpansion() } -/** - * Return an integer array containing all of the collation orders - * returned by calls to next on the specified iterator - */ -static int32_t* getOrders(UCollationElements *iter, int32_t *orderLength) -{ - UErrorCode status; - int32_t order; - int32_t maxSize = 100; - int32_t size = 0; - int32_t *temp; - int32_t *orders =(int32_t*)malloc(sizeof(int32_t) * maxSize); - status= U_ZERO_ERROR; - - - while ((order=ucol_next(iter, &status)) != UCOL_NULLORDER) - { - if (size == maxSize) - { - maxSize *= 2; - temp = (int32_t*)malloc(sizeof(int32_t) * maxSize); - - memcpy(temp, orders, size * sizeof(int32_t)); - free(orders); - orders = temp; - - } - - orders[size++] = order; - } - - if (maxSize > size) - { - if (size == 0) { - size = 1; - temp = (int32_t*)malloc(sizeof(int32_t) * size); - temp[0] = 0; - } - else { - temp = (int32_t*)malloc(sizeof(int32_t) * size); - memcpy(temp, orders, size * sizeof(int32_t)); - } - - free(orders); - orders = temp; - } - - *orderLength = size; - return orders; -} - static void assertEqual(UCollationElements *i1, UCollationElements *i2) { @@ -1311,7 +1216,7 @@ static FileStream * getFractionalUCA(void) FileStream *result = NULL; /* Look inside ICU_DATA first */ - uprv_strcpy(newPath, u_getDataDirectory()); + uprv_strcpy(newPath, ctest_dataSrcDir()); uprv_strcat(newPath, "unidata" U_FILE_SEP_STRING ); uprv_strcat(newPath, "FractionalUCA.txt"); @@ -1682,8 +1587,13 @@ static UBool checkCEValidity(const UCollator *coll, const UChar *codepoints, goto fail; } } - if ((primary != 0 && primary < primarymax) || (primary >= 0xFF00 && !isContinuation(ce))) { - log_err("UCA primary weight out of bounds\n"); + if ((primary != 0 && primary < primarymax) + || ((primary & 0xFF) == 0xFF) || (((primary>>8) & 0xFF) == 0xFF) + || ((primary & 0xFF) && ((primary & 0xFF) <= 0x03)) + || (((primary>>8) & 0xFF) && ((primary>>8) & 0xFF) <= 0x03) + || (primary >= 0xFE00 && !isContinuation(ce))) { + log_err("UCA primary weight out of bounds: %04X for string starting with %04X\n", + primary, codepoints[0]); goto fail; } /* case matching not done since data generated by ken */ @@ -1709,13 +1619,15 @@ static void TestCEValidity() /* testing UCA collation elements */ UErrorCode status = U_ZERO_ERROR; /* en_US has no tailorings */ - UCollator *coll = ucol_open("en_US", &status); + UCollator *coll = ucol_open("root", &status); /* tailored locales */ - char locale[][6] = {"fr_FR", "ko_KR", "sh_YU", "th_TH", "zh_CN"}; + char locale[][11] = {"fr_FR", "ko_KR", "sh_YU", "th_TH", "zh_CN", "zh__PINYIN"}; + const char *loc; FileStream *file = getFractionalUCA(); char line[1024]; UChar codepoints[10]; int count = 0; + int maxCount = 0; UParseError parseError; if (U_FAILURE(status)) { log_err("en_US collator creation failed\n"); @@ -1750,7 +1662,12 @@ static void TestCEValidity() /* testing tailored collation elements */ log_verbose("Testing tailored elements\n"); - while (count < 5) { + if(QUICK) { + maxCount = sizeof(locale)/sizeof(locale[0]); + } else { + maxCount = uloc_countAvailable(); + } + while (count < maxCount) { const UChar *rules = NULL, *current = NULL; UChar *rulesCopy = NULL; @@ -1768,10 +1685,21 @@ static void TestCEValidity() UColTokenParser src; uint32_t strength = 0; uint16_t specs = 0; + if(QUICK) { + loc = locale[count]; + } else { + loc = uloc_getAvailable(count); + if(!hasCollationElements(loc)) { + count++; + continue; + } + } - coll = ucol_open(locale[count], &status); + log_verbose("Testing CEs for %s\n", loc); + + coll = ucol_open(loc, &status); if (U_FAILURE(status)) { - log_err("%s collator creation failed\n", locale[count]); + log_err("%s collator creation failed\n", loc); return; } diff --git a/icuSources/test/cintltst/citertst.h b/icuSources/test/cintltst/citertst.h index 7d226a87..b810131c 100644 --- a/icuSources/test/cintltst/citertst.h +++ b/icuSources/test/cintltst/citertst.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2003, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** @@ -106,14 +106,6 @@ Internal utilities */ - static void backAndForth(UCollationElements* iter); - - /** - * Return an integer array containing all of the collation orders - * returned by calls to next on the specified iterator - */ - static int32_t* getOrders(UCollationElements* iter, int32_t *orderLength); - static void assertEqual(UCollationElements *i1, UCollationElements *i2); diff --git a/icuSources/test/cintltst/cldrtest.c b/icuSources/test/cintltst/cldrtest.c new file mode 100644 index 00000000..053b109e --- /dev/null +++ b/icuSources/test/cintltst/cldrtest.c @@ -0,0 +1,1134 @@ +/******************************************************************** + * COPYRIGHT: + * Copyright (c) 1997-2004, International Business Machines Corporation and + * others. All Rights Reserved. + ********************************************************************/ + +#include "cintltst.h" +#include "unicode/ures.h" +#include "unicode/ustring.h" +#include "unicode/uset.h" +#include "unicode/udat.h" +#include "unicode/uscript.h" +#include "unicode/ulocdata.h" +#include "cstring.h" +#include "locmap.h" +#include "uresimp.h" + +static UBool isCurrencyPreEuro(const char* currencyKey){ + if( strcmp(currencyKey, "PTE") == 0 || + strcmp(currencyKey, "ESP") == 0 || + strcmp(currencyKey, "LUF") == 0 || + strcmp(currencyKey, "GRD") == 0 || + strcmp(currencyKey, "BEF") == 0 || + strcmp(currencyKey, "ITL") == 0 ){ + return TRUE; + } + return FALSE; +} +static void +TestKeyInRootRecursive(UResourceBundle *root, const char *rootName, + UResourceBundle *currentBundle, const char *locale) { + UErrorCode errorCode = U_ZERO_ERROR; + UResourceBundle *subRootBundle = NULL, *subBundle = NULL; + + ures_resetIterator(root); + ures_resetIterator(currentBundle); + while (ures_hasNext(currentBundle)) { + const char *subBundleKey = NULL; + const char *currentBundleKey = NULL; + + errorCode = U_ZERO_ERROR; + currentBundleKey = ures_getKey(currentBundle); + subBundle = ures_getNextResource(currentBundle, NULL, &errorCode); + if (U_FAILURE(errorCode)) { + log_err("Can't open a resource for locale %s. Error: %s\n", locale, u_errorName(errorCode)); + continue; + } + subBundleKey = ures_getKey(subBundle); + + + subRootBundle = ures_getByKey(root, subBundleKey, NULL, &errorCode); + if (U_FAILURE(errorCode)) { + log_err("Can't open a resource with key \"%s\" in \"%s\" from %s for locale \"%s\"\n", + subBundleKey, + ures_getKey(currentBundle), + rootName, + locale); + ures_close(subBundle); + continue; + } + if (ures_getType(subRootBundle) != ures_getType(subBundle)) { + log_err("key \"%s\" in \"%s\" has a different type from root for locale \"%s\"\n" + "\troot=%d, locale=%d\n", + subBundleKey, + ures_getKey(currentBundle), + locale, + ures_getType(subRootBundle), + ures_getType(subBundle)); + continue; + } + else if (ures_getType(subBundle) == URES_INT_VECTOR) { + int32_t minSize; + int32_t subBundleSize; + int32_t idx; + UBool sameArray = TRUE; + const int32_t *subRootBundleArr = ures_getIntVector(subRootBundle, &minSize, &errorCode); + const int32_t *subBundleArr = ures_getIntVector(subBundle, &subBundleSize, &errorCode); + + if (minSize > subBundleSize) { + minSize = subBundleSize; + log_err("Arrays are different size with key \"%s\" in \"%s\" from root for locale \"%s\"\n", + subBundleKey, + ures_getKey(currentBundle), + locale); + } + + for (idx = 0; idx < minSize && sameArray; idx++) { + if (subRootBundleArr[idx] != subBundleArr[idx]) { + sameArray = FALSE; + } + if (strcmp(subBundleKey, "DateTimeElements") == 0 + && (subBundleArr[idx] < 1 || 7 < subBundleArr[idx])) + { + log_err("Value out of range with key \"%s\" at index %d in \"%s\" for locale \"%s\"\n", + subBundleKey, + idx, + ures_getKey(currentBundle), + locale); + } + } + /* Special exception es_US and DateTimeElements */ + if (sameArray + && !(strcmp(locale, "es_US") == 0 && strcmp(subBundleKey, "DateTimeElements") == 0)) + { + log_err("Integer vectors are the same with key \"%s\" in \"%s\" from root for locale \"%s\"\n", + subBundleKey, + ures_getKey(currentBundle), + locale); + } + } + else if (ures_getType(subBundle) == URES_ARRAY) { + UResourceBundle *subSubBundle = ures_getByIndex(subBundle, 0, NULL, &errorCode); + UResourceBundle *subSubRootBundle = ures_getByIndex(subRootBundle, 0, NULL, &errorCode); + + if (U_SUCCESS(errorCode) + && (ures_getType(subSubBundle) == URES_ARRAY || ures_getType(subSubRootBundle) == URES_ARRAY)) + { + /* TODO: Properly check for 2D arrays and zoneStrings */ + if (subBundleKey != NULL && strcmp(subBundleKey, "zoneStrings") == 0) { +/* int32_t minSize = ures_getSize(subBundle); + int32_t idx; + + for (idx = 0; idx < minSize; idx++) { + UResourceBundle *subSubBundleAtIndex = ures_getByIndex(subBundle, idx, NULL, &errorCode); + if (ures_getSize(subSubBundleAtIndex) != 6) { + log_err("zoneStrings at index %d has wrong size for locale \"%s\". array size=%d\n", + idx, + locale, + ures_getSize(subSubBundleAtIndex)); + } + ures_close(subSubBundleAtIndex); + }*/ + } + else { + /* Here is one of the recursive parts */ + TestKeyInRootRecursive(subRootBundle, rootName, subBundle, locale); + } + } + else { + int32_t minSize = ures_getSize(subRootBundle); + int32_t idx; + UBool sameArray = TRUE; + + if (minSize > ures_getSize(subBundle)) { + minSize = ures_getSize(subBundle); + } + + if ((subBundleKey == NULL + || (subBundleKey != NULL && strcmp(subBundleKey, "LocaleScript") != 0 && !isCurrencyPreEuro(subBundleKey))) + && ures_getSize(subRootBundle) != ures_getSize(subBundle)) + { + log_err("Different size array with key \"%s\" in \"%s\" from root for locale \"%s\"\n" + "\troot array size=%d, locale array size=%d\n", + subBundleKey, + ures_getKey(currentBundle), + locale, + ures_getSize(subRootBundle), + ures_getSize(subBundle)); + } + /* + if(isCurrencyPreEuro(subBundleKey) && ures_getSize(subBundle)!=3){ + log_err("Different size array with key \"%s\" in \"%s\" for locale \"%s\" the expected size is 3 got size=%d\n", + subBundleKey, + ures_getKey(currentBundle), + locale, + ures_getSize(subBundle)); + } + */ + for (idx = 0; idx < minSize; idx++) { + int32_t rootStrLen, localeStrLen; + const UChar *rootStr = ures_getStringByIndex(subRootBundle,idx,&rootStrLen,&errorCode); + const UChar *localeStr = ures_getStringByIndex(subBundle,idx,&localeStrLen,&errorCode); + if (rootStr && localeStr && U_SUCCESS(errorCode)) { + if (u_strcmp(rootStr, localeStr) != 0) { + sameArray = FALSE; + } + } + else { + log_err("Got a NULL string with key \"%s\" in \"%s\" at index %d for root or locale \"%s\"\n", + subBundleKey, + ures_getKey(currentBundle), + idx, + locale); + continue; + } + if (localeStr[0] == (UChar)0x20) { + log_err("key \"%s\" at index %d in \"%s\" starts with a space in locale \"%s\"\n", + subBundleKey, + idx, + ures_getKey(currentBundle), + locale); + } + else if (localeStr[localeStrLen - 1] == (UChar)0x20) { + log_err("key \"%s\" at index %d in \"%s\" ends with a space in locale \"%s\"\n", + subBundleKey, + idx, + ures_getKey(currentBundle), + locale); + } + else if (subBundleKey != NULL + && strcmp(subBundleKey, "DateTimePatterns") == 0) + { + int32_t quoted = 0; + const UChar *localeStrItr = localeStr; + while (*localeStrItr) { + if (*localeStrItr == (UChar)0x27 /* ' */) { + quoted++; + } + else if ((quoted % 2) == 0) { + /* Search for unquoted characters */ + if (4 <= idx && idx <= 7 + && (*localeStrItr == (UChar)0x6B /* k */ + || *localeStrItr == (UChar)0x48 /* H */ + || *localeStrItr == (UChar)0x6D /* m */ + || *localeStrItr == (UChar)0x73 /* s */ + || *localeStrItr == (UChar)0x53 /* S */ + || *localeStrItr == (UChar)0x61 /* a */ + || *localeStrItr == (UChar)0x68 /* h */ + || *localeStrItr == (UChar)0x7A /* z */)) + { + log_err("key \"%s\" at index %d has time pattern chars in date for locale \"%s\"\n", + subBundleKey, + idx, + locale); + } + else if (0 <= idx && idx <= 3 + && (*localeStrItr == (UChar)0x47 /* G */ + || *localeStrItr == (UChar)0x79 /* y */ + || *localeStrItr == (UChar)0x4D /* M */ + || *localeStrItr == (UChar)0x64 /* d */ + || *localeStrItr == (UChar)0x45 /* E */ + || *localeStrItr == (UChar)0x44 /* D */ + || *localeStrItr == (UChar)0x46 /* F */ + || *localeStrItr == (UChar)0x77 /* w */ + || *localeStrItr == (UChar)0x57 /* W */)) + { + log_err("key \"%s\" at index %d has date pattern chars in time for locale \"%s\"\n", + subBundleKey, + idx, + locale); + } + } + localeStrItr++; + } + } + else if (idx == 4 && subBundleKey != NULL + && strcmp(subBundleKey, "NumberElements") == 0 + && u_charDigitValue(localeStr[0]) != 0) + { + log_err("key \"%s\" at index %d has a non-zero based number for locale \"%s\"\n", + subBundleKey, + idx, + locale); + } + } +/* if (sameArray && strcmp(rootName, "root") == 0) { + log_err("Arrays are the same with key \"%s\" in \"%s\" from root for locale \"%s\"\n", + subBundleKey, + ures_getKey(currentBundle), + locale); + }*/ + } + ures_close(subSubBundle); + ures_close(subSubRootBundle); + } + else if (ures_getType(subBundle) == URES_STRING) { + int32_t len = 0; + const UChar *string = ures_getString(subBundle, &len, &errorCode); + if (U_FAILURE(errorCode) || string == NULL) { + log_err("Can't open a string with key \"%s\" in \"%s\" for locale \"%s\"\n", + subBundleKey, + ures_getKey(currentBundle), + locale); + } else if (string[0] == (UChar)0x20) { + log_err("key \"%s\" in \"%s\" starts with a space in locale \"%s\"\n", + subBundleKey, + ures_getKey(currentBundle), + locale); + } else if (string[len - 1] == (UChar)0x20) { + log_err("key \"%s\" in \"%s\" ends with a space in locale \"%s\"\n", + subBundleKey, + ures_getKey(currentBundle), + locale); + } else if (strcmp(subBundleKey, "localPatternChars") == 0) { + /* Check well-formedness of localPatternChars. First, the + * length must match the number of fields defined by + * DateFormat. Second, each character in the string must + * be in the set [A-Za-z]. Finally, each character must be + * unique. + */ + int32_t i,j; +#if !UCONFIG_NO_FORMATTING + if (len != UDAT_FIELD_COUNT) { + log_err("key \"%s\" has the wrong number of characters in locale \"%s\"\n", + subBundleKey, + locale); + } +#endif + /* Check char validity. */ + for (i=0; i= 65/*'A'*/ && string[i] <= 90/*'Z'*/) || + (string[i] >= 97/*'a'*/ && string[i] <= 122/*'z'*/))) { + log_err("key \"%s\" has illegal character '%c' in locale \"%s\"\n", + subBundleKey, + (char) string[i], + locale); + } + /* Do O(n^2) check for duplicate chars. */ + for (j=0; j toSize) { + fromSize = toSize; + log_err("Arrays are different size from \"%s\" to \"%s\"\n", + fromLocale, + toLocale); + } + + for (idx = start; idx <= end; idx++) { + const UChar *fromBundleStr = ures_getStringByIndex(fromArray, idx, NULL, &errorCode); + const UChar *toBundleStr = ures_getStringByIndex(toArray, idx, NULL, &errorCode); + if (fromBundleStr && toBundleStr && u_strcmp(fromBundleStr, toBundleStr) != 0) + { + log_err("Difference for %s at index %d from %s= \"%s\" to %s= \"%s\"\n", + keyName, + idx, + fromLocale, + austrdup(fromBundleStr), + toLocale, + austrdup(toBundleStr)); + } + } +} + +static void +compareConsistentCountryInfo(const char *fromLocale, const char *toLocale) { + UErrorCode errorCode = U_ZERO_ERROR; + UResourceBundle *fromDateTimeElements, *toDateTimeElements, *fromWeekendData = NULL, *toWeekendData = NULL; + UResourceBundle *fromArray, *toArray; + UResourceBundle *fromLocaleBund = ures_open(NULL, fromLocale, &errorCode); + UResourceBundle *toLocaleBund = ures_open(NULL, toLocale, &errorCode); + UResourceBundle *toCalendar, *fromCalendar, *toGregorian, *fromGregorian; + + if(U_FAILURE(errorCode)) { + log_err("Can't open resource bundle %s or %s - %s\n", fromLocale, toLocale, u_errorName(errorCode)); + return; + } + fromCalendar = ures_getByKey(fromLocaleBund, "calendar", NULL, &errorCode); + fromGregorian = ures_getByKeyWithFallback(fromCalendar, "gregorian", NULL, &errorCode); + fromDateTimeElements = ures_getByKeyWithFallback(fromGregorian, "DateTimeElements", NULL, &errorCode); + + toCalendar = ures_getByKey(toLocaleBund, "calendar", NULL, &errorCode); + toGregorian = ures_getByKeyWithFallback(toCalendar, "gregorian", NULL, &errorCode); + toDateTimeElements = ures_getByKeyWithFallback(toGregorian, "DateTimeElements", NULL, &errorCode); + + if(U_FAILURE(errorCode)){ + log_err("Did not get DateTimeElements from the bundle %s or %s\n", fromLocale, toLocale); + goto cleanup; + } + + fromWeekendData = ures_getByKeyWithFallback(fromGregorian, "weekend", NULL, &errorCode); + if(U_FAILURE(errorCode)){ + log_err("Did not get weekend data from the bundle %s to compare against %s\n", fromLocale, toLocale); + goto cleanup; + } + toWeekendData = ures_getByKeyWithFallback(toGregorian, "weekend", NULL, &errorCode); + if(U_FAILURE(errorCode)){ + log_err("Did not get weekend data from the bundle %s to compare against %s\n", toLocale, fromLocale); + goto cleanup; + } + + if (strcmp(fromLocale, "ar_IN") != 0) + { + int32_t fromSize; + int32_t toSize; + int32_t idx; + const int32_t *fromBundleArr = ures_getIntVector(fromDateTimeElements, &fromSize, &errorCode); + const int32_t *toBundleArr = ures_getIntVector(toDateTimeElements, &toSize, &errorCode); + + if (fromSize > toSize) { + fromSize = toSize; + log_err("Arrays are different size with key \"DateTimeElements\" from \"%s\" to \"%s\"\n", + fromLocale, + toLocale); + } + + for (idx = 0; idx < fromSize; idx++) { + if (fromBundleArr[idx] != toBundleArr[idx]) { + log_err("Difference with key \"DateTimeElements\" at index %d from \"%s\" to \"%s\"\n", + idx, + fromLocale, + toLocale); + } + } + } + + /* test for weekend data */ + { + int32_t fromSize; + int32_t toSize; + int32_t idx; + const int32_t *fromBundleArr = ures_getIntVector(fromWeekendData, &fromSize, &errorCode); + const int32_t *toBundleArr = ures_getIntVector(toWeekendData, &toSize, &errorCode); + + if (fromSize > toSize) { + fromSize = toSize; + log_err("Arrays are different size with key \"weekend\" data from \"%s\" to \"%s\"\n", + fromLocale, + toLocale); + } + + for (idx = 0; idx < fromSize; idx++) { + if (fromBundleArr[idx] != toBundleArr[idx]) { + log_err("Difference with key \"weekend\" data at index %d from \"%s\" to \"%s\"\n", + idx, + fromLocale, + toLocale); + } + } + } + + fromArray = ures_getByKey(fromLocaleBund, "CurrencyElements", NULL, &errorCode); + toArray = ures_getByKey(toLocaleBund, "CurrencyElements", NULL, &errorCode); + if (strcmp(fromLocale, "en_CA") != 0) + { + /* The first one is probably localized. */ + compareArrays("CurrencyElements", fromArray, fromLocale, toArray, toLocale, 1, 2); + } + ures_close(fromArray); + ures_close(toArray); + + fromArray = ures_getByKey(fromLocaleBund, "NumberPatterns", NULL, &errorCode); + toArray = ures_getByKey(toLocaleBund, "NumberPatterns", NULL, &errorCode); + if (strcmp(fromLocale, "en_CA") != 0) + { + compareArrays("NumberPatterns", fromArray, fromLocale, toArray, toLocale, 0, 3); + } + ures_close(fromArray); + ures_close(toArray); + + /* Difficult to test properly */ +/* + fromArray = ures_getByKey(fromLocaleBund, "DateTimePatterns", NULL, &errorCode); + toArray = ures_getByKey(toLocaleBund, "DateTimePatterns", NULL, &errorCode); + { + compareArrays("DateTimePatterns", fromArray, fromLocale, toArray, toLocale); + } + ures_close(fromArray); + ures_close(toArray);*/ + + fromArray = ures_getByKey(fromLocaleBund, "NumberElements", NULL, &errorCode); + toArray = ures_getByKey(toLocaleBund, "NumberElements", NULL, &errorCode); + if (strcmp(fromLocale, "en_CA") != 0) + { + compareArrays("NumberElements", fromArray, fromLocale, toArray, toLocale, 0, 3); + /* Index 4 is a script based 0 */ + compareArrays("NumberElements", fromArray, fromLocale, toArray, toLocale, 5, 10); + } + ures_close(fromArray); + ures_close(toArray); + +cleanup: + ures_close(fromDateTimeElements); + ures_close(toDateTimeElements); + ures_close(fromWeekendData); + ures_close(toWeekendData); + + ures_close(fromCalendar); + ures_close(toCalendar); + ures_close(fromGregorian); + ures_close(toGregorian); + + ures_close(fromLocaleBund); + ures_close(toLocaleBund); +} + +static void +TestConsistentCountryInfo(void) { +/* UResourceBundle *fromLocale, *toLocale;*/ + int32_t locCount = uloc_countAvailable(); + int32_t fromLocIndex, toLocIndex; + + int32_t fromCountryLen, toCountryLen; + char fromCountry[ULOC_FULLNAME_CAPACITY], toCountry[ULOC_FULLNAME_CAPACITY]; + + int32_t fromVariantLen, toVariantLen; + char fromVariant[ULOC_FULLNAME_CAPACITY], toVariant[ULOC_FULLNAME_CAPACITY]; + + UErrorCode errorCode = U_ZERO_ERROR; + + for (fromLocIndex = 0; fromLocIndex < locCount; fromLocIndex++) { + const char *fromLocale = uloc_getAvailable(fromLocIndex); + + errorCode=U_ZERO_ERROR; + fromCountryLen = uloc_getCountry(fromLocale, fromCountry, ULOC_FULLNAME_CAPACITY, &errorCode); + if (fromCountryLen <= 0) { + /* Ignore countryless locales */ + continue; + } + fromVariantLen = uloc_getVariant(fromLocale, fromVariant, ULOC_FULLNAME_CAPACITY, &errorCode); + if (fromVariantLen > 0) { + /* Most variants are ignorable like PREEURO, or collation variants. */ + continue; + } + /* Start comparing only after the current index. + Previous loop should have already compared fromLocIndex. + */ + for (toLocIndex = fromLocIndex + 1; toLocIndex < locCount; toLocIndex++) { + const char *toLocale = uloc_getAvailable(toLocIndex); + + toCountryLen = uloc_getCountry(toLocale, toCountry, ULOC_FULLNAME_CAPACITY, &errorCode); + if(U_FAILURE(errorCode)) { + log_err("Unknown failure fromLocale=%s toLocale=%s errorCode=%s\n", + fromLocale, toLocale, u_errorName(errorCode)); + continue; + } + + if (toCountryLen <= 0) { + /* Ignore countryless locales */ + continue; + } + toVariantLen = uloc_getVariant(toLocale, toVariant, ULOC_FULLNAME_CAPACITY, &errorCode); + if (toVariantLen > 0) { + /* Most variants are ignorable like PREEURO, or collation variants. */ + /* They're a variant for a reason. */ + continue; + } + if (strcmp(fromCountry, toCountry) == 0) { + log_verbose("comparing fromLocale=%s toLocale=%s\n", + fromLocale, toLocale); + compareConsistentCountryInfo(fromLocale, toLocale); + } + } + } +} + +static int32_t +findStringSetMismatch(const char *currLoc, const UChar *string, int32_t langSize, + const UChar *exemplarCharacters, int32_t exemplarLen, + UBool ignoreNumbers) { + UErrorCode errorCode = U_ZERO_ERROR; + USet *exemplarSet = uset_openPatternOptions(exemplarCharacters, exemplarLen, USET_CASE_INSENSITIVE, &errorCode); + int32_t strIdx; + if (U_FAILURE(errorCode)) { + log_err("%s: error uset_openPattern returned %s\n", currLoc, u_errorName(errorCode)); + return -1; + } + + for (strIdx = 0; strIdx < langSize; strIdx++) { + if (!uset_contains(exemplarSet, string[strIdx]) + && string[strIdx] != 0x0020 && string[strIdx] != 0x00A0 && string[strIdx] != 0x002e && string[strIdx] != 0x002c && string[strIdx] != 0x002d && string[strIdx] != 0x0027) { + if (!ignoreNumbers || (ignoreNumbers && (string[strIdx] < 0x30 || string[strIdx] > 0x39))) { + return strIdx; + } + } + } + uset_close(exemplarSet); + return -1; +} + +static void +findSetMatch( UScriptCode *scriptCodes, int32_t scriptsLen, + USet *exemplarSet, + const char *locale){ + USet *scripts[10]= {0}; + char pattern[256] = { '[', ':', 0x000 }; + int32_t patternLen; + UChar uPattern[256] = {0}; + UErrorCode status = U_ZERO_ERROR; + int32_t i; + + /* create the sets with script codes */ + for(i = 0; i 2048) { + log_verbose("skipping test for %s\n", currLoc); + } + else { + UChar langBuffer[128]; + int32_t langSize; + int32_t strIdx; + langSize = uloc_getDisplayLanguage(currLoc, currLoc, langBuffer, sizeof(langBuffer)/sizeof(langBuffer[0]), &errorCode); + if (U_FAILURE(errorCode)) { + log_err("error uloc_getDisplayLanguage returned %s\n", u_errorName(errorCode)); + } + else { + strIdx = findStringSetMismatch(currLoc, langBuffer, langSize, exemplarCharacters, exemplarLen, FALSE); + if (strIdx >= 0) { + log_err("getDisplayLanguage(%s) at index %d returned characters not in the exemplar characters.\n", + currLoc, strIdx); + } + } + langSize = uloc_getDisplayCountry(currLoc, currLoc, langBuffer, sizeof(langBuffer)/sizeof(langBuffer[0]), &errorCode); + if (U_FAILURE(errorCode)) { + log_err("error uloc_getDisplayCountry returned %s\n", u_errorName(errorCode)); + } + else { + strIdx = findStringSetMismatch(currLoc, langBuffer, langSize, exemplarCharacters, exemplarLen, FALSE); + if (strIdx >= 0) { + log_err("getDisplayCountry(%s) at index %d returned characters not in the exemplar characters.\n", + currLoc, strIdx); + } + } + { + UResourceBundle* cal = ures_getByKey(currentLocale, "calendar", NULL, &errorCode); + UResourceBundle* greg = ures_getByKeyWithFallback(cal, "gregorian", NULL, &errorCode); + UResourceBundle* names = ures_getByKeyWithFallback(greg, "dayNames", NULL, &errorCode); + UResourceBundle* format = ures_getByKeyWithFallback(names, "format", NULL, &errorCode); + resArray = ures_getByKeyWithFallback(format, "wide", NULL, &errorCode); + + if (U_FAILURE(errorCode)) { + log_err("error ures_getByKey returned %s\n", u_errorName(errorCode)); + } + if (QUICK) { + end = 1; + } + else { + end = ures_getSize(resArray); + } + + + for (idx = 0; idx < end; idx++) { + const UChar *fromBundleStr = ures_getStringByIndex(resArray, idx, &langSize, &errorCode); + if (U_FAILURE(errorCode)) { + log_err("error ures_getStringByIndex(%d) returned %s\n", idx, u_errorName(errorCode)); + continue; + } + strIdx = findStringSetMismatch(currLoc, fromBundleStr, langSize, exemplarCharacters, exemplarLen, TRUE); + if (strIdx >= 0) { + log_err("getDayNames(%s, %d) at index %d returned characters not in the exemplar characters.\n", + currLoc, idx, strIdx); + } + } + ures_close(resArray); + ures_close(format); + ures_close(names); + + names = ures_getByKeyWithFallback(greg, "monthNames", NULL, &errorCode); + format = ures_getByKeyWithFallback(names,"format", NULL, &errorCode); + resArray = ures_getByKeyWithFallback(format, "wide", NULL, &errorCode); + if (U_FAILURE(errorCode)) { + log_err("error ures_getByKey returned %s\n", u_errorName(errorCode)); + } + if (QUICK) { + end = 1; + } + else { + end = ures_getSize(resArray); + } + + for (idx = 0; idx < end; idx++) { + const UChar *fromBundleStr = ures_getStringByIndex(resArray, idx, &langSize, &errorCode); + if (U_FAILURE(errorCode)) { + log_err("error ures_getStringByIndex(%d) returned %s\n", idx, u_errorName(errorCode)); + continue; + } + strIdx = findStringSetMismatch(currLoc, fromBundleStr, langSize, exemplarCharacters, exemplarLen, TRUE); + if (strIdx >= 0) { + log_err("getMonthNames(%s, %d) at index %d returned characters not in the exemplar characters.\n", + currLoc, idx, strIdx); + } + } + ures_close(resArray); + ures_close(format); + ures_close(names); + ures_close(greg); + ures_close(cal); + } + errorCode = U_ZERO_ERROR; + numScripts = uscript_getCode(currLoc, scripts, sizeof(scripts)/sizeof(scripts[0]), &errorCode); + if (numScripts == 0) { + log_err("uscript_getCode(%s) doesn't work.\n", currLoc); + }else if(scripts[0] == USCRIPT_COMMON){ + log_err("uscript_getCode(%s) returned USCRIPT_COMMON.\n", currLoc); + } + + /* test that the scripts are a superset of exemplar characters. */ + { + USet *exemplarSet = ulocdata_getExemplarSet(NULL,currLoc, 0, &errorCode); + /* test if exemplar characters are part of script code */ + findSetMatch(scripts, numScripts, exemplarSet, currLoc); + uset_close(exemplarSet); + } + + /* test that the paperSize API works */ + { + int32_t height=0, width=0; + ulocdata_getPaperSize(currLoc, &height, &width, &errorCode); + if(U_FAILURE(errorCode)){ + log_err("ulocdata_getPaperSize failed for locale %s with error: %s \n", currLoc, u_errorName(errorCode)); + } + if(strstr(currLoc, "_US")!=NULL && height != 279 && width != 216 ){ + log_err("ulocdata_getPaperSize did not return expected data for locale %s \n", currLoc); + } + } + /* test that the MeasurementSystem works API works */ + { + UMeasurementSystem measurementSystem = ulocdata_getMeasurementSystem(currLoc, &errorCode); + if(U_FAILURE(errorCode)){ + log_err("ulocdata_getMeasurementSystem failed for locale %s with error: %s \n", currLoc, u_errorName(errorCode)); + } + if(strstr(currLoc, "_US")!=NULL){ + if(measurementSystem != UMS_US){ + log_err("ulocdata_getMeasurementSystem did not return expected data for locale %s \n", currLoc); + } + }else if(measurementSystem != UMS_SI){ + log_err("ulocdata_getMeasurementSystem did not return expected data for locale %s \n", currLoc); + } + } + } + ures_close(currentLocale); + } + + ures_close(root); +} + +/* adjust this limit as appropriate */ +#define MAX_SCRIPTS_PER_LOCALE 8 + +static void TestExemplarSet(void){ + int32_t i, j, k, m, n; + int32_t equalCount = 0; + UErrorCode ec = U_ZERO_ERROR; + UEnumeration* avail; + USet* exemplarSets[2]; + UScriptCode code[MAX_SCRIPTS_PER_LOCALE]; + USet* codeSets[MAX_SCRIPTS_PER_LOCALE]; + int32_t codeLen; + char cbuf[32]; /* 9 should be enough */ + UChar ubuf[64]; /* adjust as needed */ + UBool existsInScript; + int32_t itemCount; + int32_t strLen; + UChar32 start, end; + + exemplarSets[0] = exemplarSets[1] = NULL; + for (i=0; i 0 && equalCount < n); + + END: + uenum_close(avail); + uset_close(exemplarSets[0]); + uset_close(exemplarSets[1]); + for (i=0; i #include #include -#include "unicode/utypes.h" -#include "unicode/putil.h" -#include "cloctst.h" -#include "unicode/uloc.h" -#include "unicode/uscript.h" -#include "unicode/uchar.h" -#include "unicode/ustring.h" -#include "unicode/uset.h" #include "cintltst.h" #include "cstring.h" -#include "unicode/ures.h" +#include "unicode/putil.h" +#include "unicode/ubrk.h" +#include "unicode/uchar.h" +#include "unicode/ucol.h" +#include "unicode/udat.h" +#include "unicode/uloc.h" +#include "unicode/umsg.h" +#include "unicode/ures.h" +#include "unicode/uset.h" +#include "unicode/ustring.h" +#include "unicode/utypes.h" +#include "unicode/ulocdata.h" +#include "unicode/parseerr.h" /* may not be included with some uconfig switches */ #define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) -#ifdef WIN32 -#include "locmap.h" -#endif - static void TestNullDefault(void); -static void VerifyTranslation(void); +static void TestNonexistentLanguageExemplars(void); void PrintDataTable(); /*--------------------------------------------------- table of valid data --------------------------------------------------- */ -#define LOCALE_SIZE 5 -#define LOCALE_INFO_SIZE 23 +#define LOCALE_SIZE 9 +#define LOCALE_INFO_SIZE 28 static const char* rawData2[LOCALE_INFO_SIZE][LOCALE_SIZE] = { /* language code */ - { "en", "fr", "hr", "el", "no" }, + { "en", "fr", "ca", "el", "no", "zh", "de", "es", "ja" }, + /* script code */ + { "", "", "", "", "", "Hans", "", "", "" }, /* country code */ - { "US", "FR", "HR", "GR", "NO" }, + { "US", "FR", "ES", "GR", "NO", "CN", "DE", "", "JP" }, /* variant code */ - { "", "", "", "", "NY" }, + { "", "", "", "", "NY", "", "", "", "" }, /* full name */ - { "en_US", "fr_FR", "hr_HR", "el_GR", "no_NO_NY" }, + { "en_US", "fr_FR", "ca_ES", + "el_GR", "no_NO_NY", "zh_Hans_CN", + "de_DE@collation=phonebook", "es@collation=traditional", "ja_JP@calendar=japanese" }, /* ISO-3 language */ - { "eng", "fra", "hrv", "ell", "nor" }, + { "eng", "fra", "cat", "ell", "nor", "zho", "deu", "spa", "jpn" }, /* ISO-3 country */ - { "USA", "FRA", "HRV", "GRC", "NOR" }, - /* LCID (not currently public) */ - { "409", "40c", "41a", "408", "814" }, + { "USA", "FRA", "ESP", "GRC", "NOR", "CHN", "DEU", "", "JPN" }, + /* LCID */ + { "409", "40c", "403", "408", "814", "804", "407", "a", "411" }, /* display language (English) */ - { "English", "French", "Croatian", "Greek", "Norwegian" }, + { "English", "French", "Catalan", "Greek", "Norwegian", "Chinese", "German", "Spanish", "Japanese" }, + /* display script code (English) */ + { "", "", "", "", "", "Simplified Han", "", "", "" }, /* display country (English) */ - { "United States", "France", "Croatia", "Greece", "Norway" }, + { "United States", "France", "Spain", "Greece", "Norway", "China", "Germany", "", "Japan" }, /* display variant (English) */ - { "", "", "", "", "Nynorsk" }, + { "", "", "", "", "NY", "", "", "", "" }, /* display name (English) */ - { "English (United States)", "French (France)", "Croatian (Croatia)", "Greek (Greece)", "Norwegian (Norway, Nynorsk)" }, + { "English (United States)", "French (France)", "Catalan (Spain)", + "Greek (Greece)", "Norwegian (Norway, NY)", "Chinese (Simplified Han, China)", + "German (Germany, Collation=Phonebook Order)", "Spanish (Collation=Traditional)", "Japanese (Japan, Calendar=Japanese Calendar)" }, /* display language (French) */ - { "anglais", "fran\\u00E7ais", "croate", "grec", "norv\\u00E9gien" }, + { "anglais", "fran\\u00E7ais", "catalan", "grec", "norv\\u00E9gien", "chinois", "allemand", "espagnol", "japonais" }, + /* display script code (French) */ + { "", "", "", "", "", "han simplifi\\u00E9", "", "", "" }, /* display country (French) */ - { "\\u00C9tats-Unis", "France", "Croatie", "Gr\\u00E8ce", "Norv\\u00E8ge" }, + { "\\u00C9tats-Unis", "France", "Espagne", "Gr\\u00E8ce", "Norv\\u00E8ge", "Chine", "Allemagne", "", "Japon" }, /* display variant (French) */ - { "", "", "", "", "Nynorsk" }, + { "", "", "", "", "NY", "", "", "", "" }, /* display name (French) */ - { "anglais (\\u00C9tats-Unis)", "fran\\u00E7ais (France)", "croate (Croatie)", "grec (Gr\\u00E8ce)", "norv\\u00E9gien (Norv\\u00E8ge, Nynorsk)" }, - - /* display language (Croatian) */ - { "", "", "hrvatski", "", "" }, - /* display country (Croatian) */ - { "", "", "Hrvatska", "", "" }, - /* display variant (Croatian) */ - { "", "", "", "", "Nynorsk" }, - /* display name (Croatian) */ - { "", "", "hrvatski (Hrvatska)", "", "" }, + { "anglais (\\u00C9tats-Unis)", "fran\\u00E7ais (France)", "catalan (Espagne)", + "grec (Gr\\u00E8ce)", "norv\\u00E9gien (Norv\\u00E8ge, NY)", "chinois (han simplifi\\u00E9, Chine)", + "allemand (Allemagne, Ordonnancement=Ordre de l\\u2019annuaire)", "espagnol (Ordonnancement=Ordre traditionnel)", "japonais (Japon, Calendrier=Calendrier japonais)" }, + + /* display language (Catalan) */ + { "angl\\u00E8s", "franc\\u00E8s", "catal\\u00E0", "grec", "noruec", "xin\\u00E9s", "alemany", "espanyol", "japon\\u00E8s" }, + /* display script code (Catalan) */ + { "", "", "", "", "", "Hans", "", "", "" }, + /* display country (Catalan) */ + { "Estats Units", "Fran\\u00E7a", "Espanya", "Gr\\u00E8cia", "Noruega", "Xina", "Alemanya", "", "Jap\\u00F3" }, + /* display variant (Catalan) */ + { "", "", "", "", "NY", "", "", "", "" }, + /* display name (Catalan) */ + { "angl\\u00E8s (Estats Units)", "franc\\u00E8s (Fran\\u00E7a)", "catal\\u00E0 (Espanya)", + "grec (Gr\\u00E8cia)", "noruec (Noruega, NY)", "xin\\u00E9s (Hans, Xina)", + "alemany (Alemanya, collation=phonebook)", "espanyol (collation=traditional)", "japon\\u00E8s (Jap\\u00F3, calendar=japanese)" }, /* display language (Greek) */ { "\\u0391\\u03b3\\u03b3\\u03bb\\u03b9\\u03ba\\u03ac", "\\u0393\\u03b1\\u03bb\\u03bb\\u03b9\\u03ba\\u03ac", - "\\u039a\\u03c1\\u03bf\\u03b1\\u03c4\\u03b9\\u03ba\\u03ac", - "\\u03b5\\u03bb\\u03bb\\u03b7\\u03bd\\u03b9\\u03ba\\u03ac", - "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03b9\\u03ba\\u03ac" + "\\u039a\\u03b1\\u03c4\\u03b1\\u03bb\\u03b1\\u03bd\\u03b9\\u03ba\\u03ac", + "\\u0395\\u03bb\\u03bb\\u03b7\\u03bd\\u03b9\\u03ba\\u03ac", + "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03b9\\u03ba\\u03ac", + "\\u039A\\u03B9\\u03BD\\u03B5\\u03B6\\u03B9\\u03BA\\u03AC", + "\\u0393\\u03B5\\u03C1\\u03BC\\u03B1\\u03BD\\u03B9\\u03BA\\u03AC", + "\\u0399\\u03C3\\u03C0\\u03B1\\u03BD\\u03B9\\u03BA\\u03AC", + "\\u0399\\u03B1\\u03C0\\u03C9\\u03BD\\u03B9\\u03BA\\u03AC" }, + /* display script code (Greek) */ + { "", "", "", "", "", "Hans", "", "", "" }, /* display country (Greek) */ { - "\\u0397\\u03bd\\u03c9\\u03bc\\u03ad\\u03bd\\u03b5\\u03c2 \\u03a0\\u03bf\\u03bb\\u03b9\\u03c4\\u03b5\\u03af\\u03b5\\u03c2 \\u0391\\u03bc\\u03b5\\u03c1\\u03b9\\u03ba\\u03ae\\u03c2", + "\\u0397\\u03bd\\u03c9\\u03bc\\u03ad\\u03bd\\u03b5\\u03c2 \\u03a0\\u03bf\\u03bb\\u03b9\\u03c4\\u03b5\\u03af\\u03b5\\u03c2", "\\u0393\\u03b1\\u03bb\\u03bb\\u03af\\u03b1", - "\\u039a\\u03c1\\u03bf\\u03b1\\u03c4\\u03af\\u03b1", + "\\u0399\\u03c3\\u03c0\\u03b1\\u03bd\\u03af\\u03b1", "\\u0395\\u03bb\\u03bb\\u03ac\\u03b4\\u03b1", - "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03af\\u03b1" + "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03af\\u03b1", + "\\u039A\\u03AF\\u03BD\\u03B1", + "\\u0393\\u03B5\\u03C1\\u03BC\\u03B1\\u03BD\\u03AF\\u03B1", + "", + "\\u0399\\u03B1\\u03C0\\u03C9\\u03BD\\u03AF\\u03B1" }, /* display variant (Greek) */ - { "", "", "", "", "Nynorsk" }, + { "", "", "", "", "NY", "", "", "", "" }, /* TODO: currently there is no translation for NY in Greek fix this test when we have it */ /* display name (Greek) */ { - "\\u0391\\u03b3\\u03b3\\u03bb\\u03b9\\u03ba\\u03ac (\\u0397\\u03bd\\u03c9\\u03bc\\u03ad\\u03bd\\u03b5\\u03c2 \\u03a0\\u03bf\\u03bb\\u03b9\\u03c4\\u03b5\\u03af\\u03b5\\u03c2 \\u0391\\u03bc\\u03b5\\u03c1\\u03b9\\u03ba\\u03ae\\u03c2)", + "\\u0391\\u03b3\\u03b3\\u03bb\\u03b9\\u03ba\\u03ac (\\u0397\\u03bd\\u03c9\\u03bc\\u03ad\\u03bd\\u03b5\\u03c2 \\u03a0\\u03bf\\u03bb\\u03b9\\u03c4\\u03b5\\u03af\\u03b5\\u03c2)", "\\u0393\\u03b1\\u03bb\\u03bb\\u03b9\\u03ba\\u03ac (\\u0393\\u03b1\\u03bb\\u03bb\\u03af\\u03b1)", - "\\u039a\\u03c1\\u03bf\\u03b1\\u03c4\\u03b9\\u03ba\\u03ac (\\u039a\\u03c1\\u03bf\\u03b1\\u03c4\\u03af\\u03b1)", - "\\u03b5\\u03bb\\u03bb\\u03b7\\u03bd\\u03b9\\u03ba\\u03ac (\\u0395\\u03bb\\u03bb\\u03ac\\u03b4\\u03b1)", - "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03b9\\u03ba\\u03ac (\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03af\\u03b1, Nynorsk)" + "\\u039a\\u03b1\\u03c4\\u03b1\\u03bb\\u03b1\\u03bd\\u03b9\\u03ba\\u03ac (\\u0399\\u03c3\\u03c0\\u03b1\\u03bd\\u03af\\u03b1)", + "\\u0395\\u03bb\\u03bb\\u03b7\\u03bd\\u03b9\\u03ba\\u03ac (\\u0395\\u03bb\\u03bb\\u03ac\\u03b4\\u03b1)", + "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03b9\\u03ba\\u03ac (\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03af\\u03b1, NY)", + "\\u039A\\u03B9\\u03BD\\u03B5\\u03B6\\u03B9\\u03BA\\u03AC (Hans, \\u039A\\u03AF\\u03BD\\u03B1)", + "\\u0393\\u03B5\\u03C1\\u03BC\\u03B1\\u03BD\\u03B9\\u03BA\\u03AC (\\u0393\\u03B5\\u03C1\\u03BC\\u03B1\\u03BD\\u03AF\\u03B1, \\u03A4\\u03B1\\u03BA\\u03C4\\u03BF\\u03C0\\u03BF\\u03AF\\u03B7\\u03C3\\u03B7=\\u03A3\\u03B5\\u03B9\\u03C1\\u03AC \\u03A4\\u03B7\\u03BB\\u03B5\\u03C6\\u03C9\\u03BD\\u03B9\\u03BA\\u03BF\\u03CD \\u039A\\u03B1\\u03C4\\u03B1\\u03BB\\u03CC\\u03B3\\u03BF\\u03C5)", + "\\u0399\\u03C3\\u03C0\\u03B1\\u03BD\\u03B9\\u03BA\\u03AC (\\u03A4\\u03B1\\u03BA\\u03C4\\u03BF\\u03C0\\u03BF\\u03AF\\u03B7\\u03C3\\u03B7\\u003D\\u03A0\\u03B1\\u03C1\\u03B1\\u03B4\\u03BF\\u03C3\\u03B9\\u03B1\\u03BA\\u03AE)", + "\\u0399\\u03B1\\u03C0\\u03C9\\u03BD\\u03B9\\u03BA\\u03AC (\\u0399\\u03B1\\u03C0\\u03C9\\u03BD\\u03AF\\u03B1, \\u0397\\u03BC\\u03B5\\u03C1\\u03BF\\u03BB\\u03CC\\u03B3\\u03B9\\u03BF=\\u0399\\u03B1\\u03C0\\u03C9\\u03BD\\u03B9\\u03BA\\u03CC \\u0397\\u03BC\\u03B5\\u03C1\\u03BF\\u03BB\\u03CC\\u03B3\\u03B9\\u03BF)" } }; @@ -118,57 +149,74 @@ static UChar*** dataTable=0; enum { ENGLISH = 0, FRENCH = 1, - CROATIAN = 2, + CATALAN = 2, GREEK = 3, NORWEGIAN = 4 }; enum { LANG = 0, - CTRY = 1, - VAR = 2, - NAME = 3, - LANG3 = 4, - CTRY3 = 5, - LCID = 6, - DLANG_EN = 7, - DCTRY_EN = 8, - DVAR_EN = 9, - DNAME_EN = 10, - DLANG_FR = 11, - DCTRY_FR = 12, - DVAR_FR = 13, - DNAME_FR = 14, - DLANG_HR = 15, - DCTRY_HR = 16, - DVAR_HR = 17, - DNAME_HR = 18, - DLANG_EL = 19, - DCTRY_EL = 20, - DVAR_EL = 21, - DNAME_EL = 22 + SCRIPT = 1, + CTRY = 2, + VAR = 3, + NAME = 4, + LANG3 = 5, + CTRY3 = 6, + LCID = 7, + DLANG_EN = 8, + DSCRIPT_EN = 9, + DCTRY_EN = 10, + DVAR_EN = 11, + DNAME_EN = 12, + DLANG_FR = 13, + DSCRIPT_FR = 14, + DCTRY_FR = 15, + DVAR_FR = 16, + DNAME_FR = 17, + DLANG_CA = 18, + DSCRIPT_CA = 19, + DCTRY_CA = 20, + DVAR_CA = 21, + DNAME_CA = 22, + DLANG_EL = 23, + DSCRIPT_EL = 24, + DCTRY_EL = 25, + DVAR_EL = 26, + DNAME_EL = 27 }; +#define TESTCASE(name) addTest(root, &name, "tsutil/cloctst/" #name) + void addLocaleTest(TestNode** root); void addLocaleTest(TestNode** root) { - addTest(root, &TestObsoleteNames, "tsutil/cloctst/TestObsoleteNames"); /* srl- move */ - addTest(root, &TestBasicGetters, "tsutil/cloctst/TestBasicGetters"); - addTest(root, &TestNullDefault, "tsutil/cloctst/TestNullDefault"); - addTest(root, &TestPrefixes, "tsutil/cloctst/TestPrefixes"); - addTest(root, &TestSimpleResourceInfo, "tsutil/cloctst/TestSimpleResourceInfo"); - addTest(root, &TestDisplayNames, "tsutil/cloctst/TestDisplayNames"); - addTest(root, &TestGetAvailableLocales, "tsutil/cloctst/TestGetAvailableLocales"); - addTest(root, &TestDataDirectory, "tsutil/cloctst/TestDataDirectory"); - addTest(root, &TestISOFunctions, "tsutil/cloctst/TestISOFunctions"); - addTest(root, &TestISO3Fallback, "tsutil/cloctst/TestISO3Fallback"); - addTest(root, &TestUninstalledISO3Names, "tsutil/cloctst/TestUninstalledISO3Names"); - addTest(root, &TestSimpleDisplayNames, "tsutil/cloctst/TestSimpleDisplayNames"); - addTest(root, &TestVariantParsing, "tsutil/cloctst/TestVariantParsing"); - addTest(root, &TestLocaleStructure, "tsutil/cloctst/TestLocaleStructure"); - addTest(root, &TestConsistentCountryInfo,"tsutil/cloctst/TestConsistentCountryInfo"); - addTest(root, &VerifyTranslation, "tsutil/cloctst/VerifyTranslation"); + TESTCASE(TestObsoleteNames); /* srl- move */ + TESTCASE(TestBasicGetters); + TESTCASE(TestNullDefault); + TESTCASE(TestPrefixes); + TESTCASE(TestSimpleResourceInfo); + TESTCASE(TestDisplayNames); + TESTCASE(TestGetAvailableLocales); + TESTCASE(TestDataDirectory); + TESTCASE(TestISOFunctions); + TESTCASE(TestISO3Fallback); + TESTCASE(TestUninstalledISO3Names); + TESTCASE(TestSimpleDisplayNames); + TESTCASE(TestVariantParsing); + /*TESTCASE(MoreVariants);*/ + TESTCASE(TestKeywordVariants); + TESTCASE(TestKeywordVariantParsing); + TESTCASE(TestCanonicalization); + TESTCASE(TestKeywordSet); + TESTCASE(TestKeywordSetError); + TESTCASE(TestDisplayKeywords); + TESTCASE(TestDisplayKeywordValues); + TESTCASE(TestGetBaseName); + TESTCASE(TestGetLocale); + TESTCASE(TestDisplayNameWarning); + TESTCASE(TestNonexistentLanguageExemplars); + TESTCASE(TestAcceptLanguage); } @@ -241,7 +289,6 @@ static void TestBasicGetters() { log_err(" Mismatch in getName: %s versus %s\n", name, rawData2[NAME][i]); } - free(temp); free(name); @@ -262,6 +309,47 @@ static void TestNullDefault() { if (uprv_strcmp(uloc_getDefault(), original) != 0) { log_err(" uloc_setDefault(NULL, &status) didn't get the default locale back!\n"); } + + { + /* Test that set & get of default locale work, and that + * default locales are cached and reused, and not overwritten. + */ + const char *n_en_US; + const char *n_fr_FR; + const char *n2_en_US; + + status = U_ZERO_ERROR; + uloc_setDefault("en_US", &status); + n_en_US = uloc_getDefault(); + if (strcmp(n_en_US, "en_US") != 0) { + log_err("Wrong result from uloc_getDefault(). Expected \"en_US\", got \"%s\"\n", n_en_US); + } + + uloc_setDefault("fr_FR", &status); + n_fr_FR = uloc_getDefault(); + if (strcmp(n_en_US, "en_US") != 0) { + log_err("uloc_setDefault altered previously default string." + "Expected \"en_US\", got \"%s\"\n", n_en_US); + } + if (strcmp(n_fr_FR, "fr_FR") != 0) { + log_err("Wrong result from uloc_getDefault(). Expected \"fr_FR\", got %s\n", n_fr_FR); + } + + uloc_setDefault("en_US", &status); + n2_en_US = uloc_getDefault(); + if (strcmp(n2_en_US, "en_US") != 0) { + log_err("Wrong result from uloc_getDefault(). Expected \"en_US\", got \"%s\"\n", n_en_US); + } + if (n2_en_US != n_en_US) { + log_err("Default locale cache failed to reuse en_US locale.\n"); + } + + if (U_FAILURE(status)) { + log_err("Failure returned from uloc_setDefault - \"%s\"\n", u_errorName(status)); + } + + } + } /* Test the i- and x- and @ and . functionality */ @@ -269,103 +357,131 @@ static void TestNullDefault() { #define PREFIXBUFSIZ 128 static void TestPrefixes() { - int row = 0; - int n; - const char *loc; - - const char *testData[][5] = - { - {"sv", "FI", "AL", "sv-fi-al", "sv_FI_AL" }, - {"en", "GB", "", "en-gb", "en_GB" }, - {"i-hakka", "MT", "XEMXIJA", "i-hakka_MT_XEMXIJA", "i-hakka_MT_XEMXIJA"}, - {"i-hakka", "CN", "", "i-hakka_CN", "i-hakka_CN"}, - {"i-hakka", "MX", "", "I-hakka_MX", "i-hakka_MX"}, - {"x-klingon", "US", "SANJOSE", "X-KLINGON_us_SANJOSE", "x-klingon_US_SANJOSE"}, - - {"mr", "", "", "mr.utf8", "mr"}, - {"de", "TV", "", "de-tv.koi8r", "de_TV"}, - {"x-piglatin", "ML", "", "x-piglatin_ML.MBE", "x-piglatin_ML"}, /* Multibyte English */ - {"i-cherokee","US", "", "i-Cherokee_US.utf7", "i-cherokee_US"}, - {"x-filfli", "MT", "FILFLA", "x-filfli_MT_FILFLA.gb-18030", "x-filfli_MT_FILFLA"}, - {"no", "NO", "NY", "no-no-ny.utf32@B", "no_NO_NY"}, /* @ ignored unless variant is empty */ - {"no", "NO", "B", "no-no.utf32@B", "no_NO_B" }, - {"no", "", "NY", "no__ny", "no__NY" }, - {"no", "", "NY", "no@ny", "no__NY" }, - - { "","","","",""} - }; - - const char *testTitles[] = { "uloc_getLanguage()", "uloc_getCountry()", "uloc_getVariant()", "name", "uloc_getName()", "country3", "lcid" }; - - char buf[PREFIXBUFSIZ]; - int32_t len; - UErrorCode err; - - - for(row=0;testData[row][0][0] != 0;row++) { - loc = testData[row][NAME]; - log_verbose("Test #%d: %s\n", row, loc); - - err = U_ZERO_ERROR; - len=0; - buf[0]=0; - for(n=0;n<=(NAME+1);n++) { - if(n==NAME) continue; - - for(len=0;len [%s] (length %d)\n", - row, testTitles[n], loc, buf, len); - - if(len != (int32_t)strlen(buf)) { - log_err("#%d: %s on %s: -> [%s] (length returned %d, actual %d!)\n", - row, testTitles[n], loc, buf, len, strlen(buf)+1); - - } - - /* see if they smashed something */ - if(buf[len+1] != '%') { - log_err("#%d: %s on %s: -> [%s] - wrote [%X] out ofbounds!\n", - row, testTitles[n], loc, buf, buf[len+1]); - } - - if(strcmp(buf, testData[row][n])) { - log_err("#%d: %s on %s: -> [%s] (expected '%s'!)\n", - row, testTitles[n], loc, buf, testData[row][n]); - + int row = 0; + int n; + const char *loc, *expected; + + const char *testData[][7] = + { + /* NULL canonicalize() column means "expect same as getName()" */ + {"sv", "", "FI", "AL", "sv-fi-al", "sv_FI_AL", NULL}, + {"en", "", "GB", "", "en-gb", "en_GB", NULL}, + {"i-hakka", "", "MT", "XEMXIJA", "i-hakka_MT_XEMXIJA", "i-hakka_MT_XEMXIJA", NULL}, + {"i-hakka", "", "CN", "", "i-hakka_CN", "i-hakka_CN", NULL}, + {"i-hakka", "", "MX", "", "I-hakka_MX", "i-hakka_MX", NULL}, + {"x-klingon", "", "US", "SANJOSE", "X-KLINGON_us_SANJOSE", "x-klingon_US_SANJOSE", NULL}, + + {"mr", "", "", "", "mr.utf8", "mr.utf8", "mr"}, + {"de", "", "TV", "", "de-tv.koi8r", "de_TV.koi8r", "de_TV"}, + {"x-piglatin", "", "ML", "", "x-piglatin_ML.MBE", "x-piglatin_ML.MBE", "x-piglatin_ML"}, /* Multibyte English */ + {"i-cherokee", "","US", "", "i-Cherokee_US.utf7", "i-cherokee_US.utf7", "i-cherokee_US"}, + {"x-filfli", "", "MT", "FILFLA", "x-filfli_MT_FILFLA.gb-18030", "x-filfli_MT_FILFLA.gb-18030", "x-filfli_MT_FILFLA"}, + {"no", "", "NO", "NY", "no-no-ny.utf32@B", "no_NO_NY.utf32@B", "no_NO_NY_B"}, + {"no", "", "NO", "", "no-no.utf32@B", "no_NO.utf32@B", "no_NO_B"}, + {"no", "", "", "NY", "no__ny", "no__NY", NULL}, + {"no", "", "", "", "no@ny", "no@ny", "no__NY"}, + {"el", "Latn", "", "", "el-latn", "el_Latn", NULL}, + {"en", "Cyrl", "RU", "", "en-cyrl-ru", "en_Cyrl_RU", NULL}, + {"zh", "Hant", "TW", "STROKE", "zh-hant_TW_STROKE", "zh_Hant_TW_STROKE", NULL}, + {"qq", "Qqqq", "QQ", "QQ", "qq_Qqqq_QQ_QQ", "qq_Qqqq_QQ_QQ", NULL}, + {"qq", "Qqqq", "", "QQ", "qq_Qqqq__QQ", "qq_Qqqq__QQ", NULL}, + {"12", "3456", "78", "90", "12_3456_78_90", "12_3456_78_90", NULL}, /* total garbage */ + + {NULL,NULL,NULL,NULL,NULL,NULL,NULL} + }; + + const char *testTitles[] = { + "uloc_getLanguage()", + "uloc_getScript()", + "uloc_getCountry()", + "uloc_getVariant()", + "name", + "uloc_getName()", + "uloc_canonicalize()" + }; + + char buf[PREFIXBUFSIZ]; + int32_t len; + UErrorCode err; + + + for(row=0;testData[row][0] != NULL;row++) { + loc = testData[row][NAME]; + log_verbose("Test #%d: %s\n", row, loc); + + err = U_ZERO_ERROR; + len=0; + buf[0]=0; + for(n=0;n<=(NAME+2);n++) { + if(n==NAME) continue; + + for(len=0;len [%s] (length %d)\n", + row, testTitles[n], loc, buf, len); + + if(len != (int32_t)strlen(buf)) { + log_err("#%d: %s on %s: -> [%s] (length returned %d, actual %d!)\n", + row, testTitles[n], loc, buf, len, strlen(buf)+1); + + } + + /* see if they smashed something */ + if(buf[len+1] != '%') { + log_err("#%d: %s on %s: -> [%s] - wrote [%X] out ofbounds!\n", + row, testTitles[n], loc, buf, buf[len+1]); + } + + expected = testData[row][n]; + if (expected == NULL && n == (NAME+2)) { + /* NULL expected canonicalize() means "expect same as getName()" */ + expected = testData[row][NAME+1]; + } + if(strcmp(buf, expected)) { + log_err("#%d: %s on %s: -> [%s] (expected '%s'!)\n", + row, testTitles[n], loc, buf, expected); + + } + } } - } } - } } @@ -374,46 +490,45 @@ static void TestSimpleResourceInfo() { int32_t i; char* testLocale = 0; UChar* expected = 0; - + const char* temp; char temp2[20]; testLocale=(char*)malloc(sizeof(char) * 1); expected=(UChar*)malloc(sizeof(UChar) * 1); - -setUpDataTable(); + + setUpDataTable(); log_verbose("Testing getISO3Language and getISO3Country\n"); for (i = 0; i < LOCALE_SIZE; i++) { - + testLocale=(char*)realloc(testLocale, sizeof(char) * (u_strlen(dataTable[NAME][i])+1)); u_austrcpy(testLocale, dataTable[NAME][i]); - + log_verbose("Testing %s ......\n", testLocale); - + temp=uloc_getISO3Language(testLocale); expected=(UChar*)realloc(expected, sizeof(UChar) * (strlen(temp) + 1)); u_uastrcpy(expected,temp); if (0 != u_strcmp(expected, dataTable[LANG3][i])) { - log_err(" ISO-3 language code mismatch: %s versus %s\n", austrdup(expected), - austrdup(dataTable[LANG3][i])); + log_err(" ISO-3 language code mismatch: %s versus %s\n", austrdup(expected), + austrdup(dataTable[LANG3][i])); } - + temp=uloc_getISO3Country(testLocale); expected=(UChar*)realloc(expected, sizeof(UChar) * (strlen(temp) + 1)); u_uastrcpy(expected,temp); if (0 != u_strcmp(expected, dataTable[CTRY3][i])) { log_err(" ISO-3 Country code mismatch: %s versus %s\n", austrdup(expected), - austrdup(dataTable[CTRY3][i])); + austrdup(dataTable[CTRY3][i])); } - sprintf(temp2, "%x", uloc_getLCID(testLocale)); + sprintf(temp2, "%x", (int)uloc_getLCID(testLocale)); if (strcmp(temp2, rawData2[LCID][i]) != 0) { log_err("LCID mismatch: %s versus %s\n", temp2 , rawData2[LCID][i]); } - } - - free(expected); - free(testLocale); -cleanUpDataTable(); + + free(expected); + free(testLocale); + cleanUpDataTable(); } /* @@ -425,17 +540,16 @@ cleanUpDataTable(); static void TestDisplayNames() { UChar buffer[100]; - UErrorCode errorCode; + UErrorCode errorCode=U_ZERO_ERROR; int32_t length; - log_verbose("Testing getDisplayName for different locales\n"); log_verbose(" In locale = en_US...\n"); doTestDisplayNames("en_US", DLANG_EN); log_verbose(" In locale = fr_FR....\n"); doTestDisplayNames("fr_FR", DLANG_FR); - log_verbose(" In locale = hr_HR...\n"); - doTestDisplayNames("hr_HR", DLANG_HR); + log_verbose(" In locale = ca_ES...\n"); + doTestDisplayNames("ca_ES", DLANG_CA); log_verbose(" In locale = gr_EL..\n"); doTestDisplayNames("el_GR", DLANG_EL); @@ -453,6 +567,36 @@ static void TestDisplayNames() if(errorCode!=U_USING_DEFAULT_WARNING || length!=2 || buffer[0]!=0x71 || buffer[1]!=0x71) { log_err("error getting the display string for an unknown language - %s\n", u_errorName(errorCode)); } + + { + int32_t i; + const char *aLocale = "es@collation=traditional;calendar=japanese"; + const char *testL[] = { "en_US", + "fr_FR", + "ca_ES", + "el_GR" }; + const char *expect[] = { "Spanish (Calendar=Japanese Calendar, Collation=Traditional)", /* note sorted order of keywords */ + "espagnol (Calendrier=Calendrier japonais, Ordonnancement=Ordre traditionnel)", + "espanyol (calendar=japanese, collation=traditional)", + "\\u0399\\u03C3\\u03C0\\u03B1\\u03BD\\u03B9\\u03BA\\u03AC (\\u0397\\u03BC\\u03B5\\u03C1\\u03BF\\u03BB\\u03CC\\u03B3\\u03B9\\u03BF=\\u0399\\u03B1\\u03C0\\u03C9\\u03BD\\u03B9\\u03BA\\u03CC \\u0397\\u03BC\\u03B5\\u03C1\\u03BF\\u03BB\\u03CC\\u03B3\\u03B9\\u03BF, \\u03A4\\u03B1\\u03BA\\u03C4\\u03BF\\u03C0\\u03BF\\u03AF\\u03B7\\u03C3\\u03B7=\\u03A0\\u03B1\\u03C1\\u03B1\\u03B4\\u03BF\\u03C3\\u03B9\\u03B1\\u03BA\\u03AE)" }; + UChar *expectBuffer; + + for(i=0;i %s\n", aLocale, testL[i], u_errorName(errorCode)); + } else { + expectBuffer = CharsToUChars(expect[i]); + if(u_strcmp(buffer,expectBuffer)) { + log_err("FAIL in uloc_getDisplayName(%s,%s,..) expected '%s' got '%s'\n", aLocale, testL[i], expect[i], austrdup(buffer)); + } else { + log_verbose("pass in uloc_getDisplayName(%s,%s,..) got '%s'\n", aLocale, testL[i], expect[i]); + } + free(expectBuffer); + } + } + } } @@ -537,12 +681,14 @@ static void doTestDisplayNames(const char* displayLocale, int32_t compareIndex) UChar *testLang = 0; + UChar *testScript = 0; UChar *testCtry = 0; UChar *testVar = 0; UChar *testName = 0; UChar* expectedLang = 0; + UChar* expectedScript = 0; UChar* expectedCtry = 0; UChar* expectedVar = 0; UChar* expectedName = 0; @@ -571,6 +717,22 @@ setUpDataTable(); log_err("Error in getDisplayLanguage() %s\n", myErrorName(status)); } + maxresultsize=0; + maxresultsize=uloc_getDisplayScript(testLocale, displayLocale, NULL, maxresultsize, &status); + if(status==U_BUFFER_OVERFLOW_ERROR) + { + status=U_ZERO_ERROR; + testScript=(UChar*)malloc(sizeof(UChar) * (maxresultsize+1)); + uloc_getDisplayScript(testLocale, displayLocale, testScript, maxresultsize + 1, &status); + } + else + { + testScript=&_NUL; + } + if(U_FAILURE(status)){ + log_err("Error in getDisplayScript() %s\n", myErrorName(status)); + } + maxresultsize=0; maxresultsize=uloc_getDisplayCountry(testLocale, displayLocale, NULL, maxresultsize, &status); if(status==U_BUFFER_OVERFLOW_ERROR) @@ -623,15 +785,19 @@ setUpDataTable(); if(u_strlen(expectedLang)== 0) expectedLang=dataTable[DLANG_EN][i]; - expectedCtry=dataTable[compareIndex + 1][i]; + expectedScript=dataTable[compareIndex + 1][i]; + if(u_strlen(expectedScript)== 0) + expectedScript=dataTable[DSCRIPT_EN][i]; + + expectedCtry=dataTable[compareIndex + 2][i]; if(u_strlen(expectedCtry)== 0) expectedCtry=dataTable[DCTRY_EN][i]; - expectedVar=dataTable[compareIndex + 2][i]; - if(u_strlen(expectedCtry)== 0) + expectedVar=dataTable[compareIndex + 3][i]; + if(u_strlen(expectedVar)== 0) expectedVar=dataTable[DVAR_EN][i]; - expectedName=dataTable[compareIndex + 3][i]; + expectedName=dataTable[compareIndex + 4][i]; if(u_strlen(expectedName) == 0) expectedName=dataTable[DNAME_EN][i]; @@ -639,6 +805,10 @@ setUpDataTable(); log_data_err(" Display Language mismatch: got %s expected %s displayLocale=%s\n", austrdup(testLang), austrdup(expectedLang), displayLocale); } + if (0 != u_strcmp(testScript,expectedScript)) { + log_data_err(" Display Script mismatch: got %s expected %s displayLocale=%s\n", austrdup(testScript), austrdup(expectedScript), displayLocale); + } + if (0 != u_strcmp(testCtry,expectedCtry)) { log_data_err(" Display Country mismatch: got %s expected %s displayLocale=%s\n", austrdup(testCtry), austrdup(expectedCtry), displayLocale); } @@ -657,6 +827,9 @@ setUpDataTable(); if(testLang!=&_NUL) { free(testLang); } + if(testScript!=&_NUL) { + free(testScript); + } if(testCtry!=&_NUL) { free(testCtry); } @@ -674,60 +847,75 @@ static void TestISOFunctions() const char* const* str1=uloc_getISOCountries(); const char* test; int32_t count = 0; - UBool done = FALSE; int32_t expect; + UResourceBundle *res; + UErrorCode status = U_ZERO_ERROR; /* test getISOLanguages*/ /*str=uloc_getISOLanguages(); */ log_verbose("Testing ISO Languages: \n"); - while(!done) + /* use structLocale - this data is no longer in root */ + res = ures_openDirect(loadTestData(&status), "structLocale", &status); + ures_getByKey(res, "Languages", res, &status); + if (U_FAILURE(status)) { + log_err("There is an error in structLocale's ures_getByKey(\"Languages\"), status=%s\n", u_errorName(status)); + status = U_ZERO_ERROR; + } + + for(count = 0; *(str+count) != 0; count++) { - if(*(str+count++) == 0) + test = *(str+count); + +#if 0 { - done = TRUE; + /* This code only works on ASCII machines where the keys are stored in ASCII order */ + const char *key; + ures_getNextString(res, NULL, &key, &status); + if(!strcmp(key,"root")) + ures_getNextString(res, NULL, &key, &status); + if(!strcmp(key,"Fallback")) + ures_getNextString(res, NULL, &key, &status); + if(!strcmp(key,"sh")) /* Remove this once sh is removed. */ + ures_getNextString(res, NULL, &key, &status); + if(!key || strcmp(test,key)) { + /* The first difference usually implies the place where things get out of sync */ + log_err("FAIL diff at offset %d, \"%s\" != \"%s\"\n", count, test, key); + } + status = U_ZERO_ERROR; } - else - { - test = *(str+count-1); - if(!strcmp(test,"in")) - log_err("FAIL getISOLanguages() has obsolete language code %s\n", test); - if(!strcmp(test,"iw")) - log_err("FAIL getISOLanguages() has obsolete language code %s\n", test); - if(!strcmp(test,"ji")) - log_err("FAIL getISOLanguages() has obsolete language code %s\n", test); - if(!strcmp(test,"jw")) - log_err("FAIL getISOLanguages() has obsolete language code %s\n", test); - if(!strcmp(test,"sh")) - log_err("FAIL getISOLanguages() has obsolete language code %s\n", test); - } - } - count--; - expect = 450; +#endif + + if(!strcmp(test,"in")) + log_err("FAIL getISOLanguages() has obsolete language code %s\n", test); + if(!strcmp(test,"iw")) + log_err("FAIL getISOLanguages() has obsolete language code %s\n", test); + if(!strcmp(test,"ji")) + log_err("FAIL getISOLanguages() has obsolete language code %s\n", test); + if(!strcmp(test,"jw")) + log_err("FAIL getISOLanguages() has obsolete language code %s\n", test); + if(!strcmp(test,"sh")) + log_err("FAIL getISOLanguages() has obsolete language code %s\n", test); + } + + /* We check root, just in case the en locale is removed. The en locale should have the same number of resources. */ + expect = ures_getSize(res) - 1; /* Ignore root */ + expect -= 1; /* TODO: Remove this line once sh goes away. */ + ures_close(res); if(count!=expect) { - log_err("There is an error in getISOLanguages, got %d, expected %d\n", count, expect); + log_err("There is an error in getISOLanguages, got %d, expected %d (as per structLocale)\n", count, expect); } log_verbose("Testing ISO Countries"); - count=0; - done=FALSE; - while(!done) + for(count = 0; *(str1+count) != 0; count++) { - if(*(str1 + count++)==0) - { - done=TRUE; - } - else - { - test = *(str1+count-1); - if(!strcmp(test,"FX")) - log_err("FAIL getISOCountries() has obsolete country code %s\n", test); - if(!strcmp(test,"ZR")) - log_err("FAIL getISOCountries() has obsolete country code %s\n", test); - } + test = *(str1+count); + if(!strcmp(test,"FX")) + log_err("FAIL getISOCountries() has obsolete country code %s\n", test); + if(!strcmp(test,"ZR")) + log_err("FAIL getISOCountries() has obsolete country code %s\n", test); } - count--; expect=239; if(count!=expect) { @@ -740,9 +928,9 @@ static void setUpDataTable() int32_t i,j; dataTable = (UChar***)(calloc(sizeof(UChar**),LOCALE_INFO_SIZE)); - for (i = 0; i < 23; i++) { + for (i = 0; i < LOCALE_INFO_SIZE; i++) { dataTable[i] = (UChar**)(calloc(sizeof(UChar*),LOCALE_SIZE)); - for (j = 0; j < 5; j++){ + for (j = 0; j < LOCALE_SIZE; j++){ dataTable[i][j] = CharsToUChars(rawData2[i][j]); } } @@ -797,7 +985,7 @@ static void TestSimpleDisplayNames() and country codes to make sure we have the correct names for them. */ char languageCodes[] [4] = { "he", "id", "iu", "ug", "yi", "za" }; - const char* languageNames [] = { "Hebrew", "Indonesian", "Inukitut", "Uighur", "Yiddish", + const char* languageNames [] = { "Hebrew", "Indonesian", "Inuktitut", "Uighur", "Yiddish", "Zhuang" }; UErrorCode status=U_ZERO_ERROR; @@ -1081,6 +1269,14 @@ static void TestObsoleteNames(void) } } + if (uloc_getLCID("iw_IL") != uloc_getLCID("he_IL")) { + log_err("he,iw LCID mismatch: %X versus %X\n", uloc_getLCID("iw_IL"), uloc_getLCID("he_IL")); + } + + if (uloc_getLCID("iw") != uloc_getLCID("he")) { + log_err("he,iw LCID mismatch: %X versus %X\n", uloc_getLCID("iw"), uloc_getLCID("he")); + } + #if 0 i = uloc_getLanguage("kok",NULL,0,&icu_err); @@ -1142,837 +1338,990 @@ static void TestObsoleteNames(void) } -static void -TestKeyInRootRecursive(UResourceBundle *root, const char *rootName, - UResourceBundle *currentBundle, const char *locale) { - UErrorCode errorCode = U_ZERO_ERROR; - UResourceBundle *subRootBundle = NULL, *subBundle = NULL; - - ures_resetIterator(root); - ures_resetIterator(currentBundle); - while (ures_hasNext(currentBundle)) { - const char *subBundleKey = NULL; - const char *currentBundleKey = NULL; - - errorCode = U_ZERO_ERROR; - subBundle = ures_getNextResource(currentBundle, NULL, &errorCode); - if (U_FAILURE(errorCode)) { - log_err("Can't open a resource for locale %s\n", locale); - continue; - } - subBundleKey = ures_getKey(subBundle); - currentBundleKey = ures_getKey(currentBundle); - - subRootBundle = ures_getByKey(root, subBundleKey, NULL, &errorCode); - if (U_FAILURE(errorCode)) { -/* if (ures_hasNext(root)) { - errorCode = U_ZERO_ERROR; - subRootBundle = ures_getNextResource(root, NULL, &errorCode); - } - if (errorCode!=U_ZERO_ERROR) { - if (ures_getKey(currentBundle) != 0 && strcmp(ures_getKey(currentBundle), "zoneStrings") == 0) { - break; - } - else {*/ - if (subBundleKey == NULL - || (strcmp(subBundleKey, "TransliterateLATIN") != 0 /* Ignore these special cases */ - && strcmp(subBundleKey, "BreakDictionaryData") != 0)) - { - UBool isRoot = strcmp(rootName, "root") == 0; - UBool isSpecial = FALSE; - if (currentBundleKey) { - isSpecial = strcmp(currentBundleKey, "Currencies") == 0 - || strcmp(currentBundleKey, "Languages") == 0 - || strcmp(currentBundleKey, "Countries") == 0; - } - - if ((isRoot && !isSpecial) - || (!isRoot && isSpecial)) - { - log_err("Can't open a resource with key \"%s\" in \"%s\" from %s for locale \"%s\"\n", - subBundleKey, - ures_getKey(currentBundle), - rootName, - locale); - } - } - ures_close(subBundle); - continue; -/* } - }*/ - } - if (ures_getType(subRootBundle) != ures_getType(subBundle)) { - log_err("key \"%s\" in \"%s\" has a different type from root for locale \"%s\"\n" - "\troot=%d, locale=%d\n", - subBundleKey, - ures_getKey(currentBundle), - locale, - ures_getType(subRootBundle), - ures_getType(subBundle)); - continue; - } - else if (ures_getType(subBundle) == URES_INT_VECTOR) { - int32_t minSize; - int32_t subBundleSize; - int32_t idx; - UBool sameArray = TRUE; - const int32_t *subRootBundleArr = ures_getIntVector(subRootBundle, &minSize, &errorCode); - const int32_t *subBundleArr = ures_getIntVector(subBundle, &subBundleSize, &errorCode); - - if (minSize > subBundleSize) { - minSize = subBundleSize; - log_err("Arrays are different size with key \"%s\" in \"%s\" from root for locale \"%s\"\n", - subBundleKey, - ures_getKey(currentBundle), - locale); - } - - for (idx = 0; idx < minSize && sameArray; idx++) { - if (subRootBundleArr[idx] != subBundleArr[idx]) { - sameArray = FALSE; - } - if (strcmp(subBundleKey, "DateTimeElements") == 0 - && (subBundleArr[idx] < 1 || 7 < subBundleArr[idx])) - { - log_err("Value out of range with key \"%s\" at index %d in \"%s\" for locale \"%s\"\n", - subBundleKey, - idx, - ures_getKey(currentBundle), - locale); - } - } - /* Special exception es_US and DateTimeElements */ - if (sameArray - && !(strcmp(locale, "es_US") == 0 && strcmp(subBundleKey, "DateTimeElements") == 0)) - { - log_err("Integer vectors are the same with key \"%s\" in \"%s\" from root for locale \"%s\"\n", - subBundleKey, - ures_getKey(currentBundle), - locale); - } +static void MoreVariants(void) +{ + struct { + const char *localeID; + const char *keyword; + const char *expectedValue; + } testCases[] = { + { "de_DE_EURO@collation=PHONEBOOK", "collation", "PHONEBOOK" }, + { "es_ES.utf8@euro", "collation", ""}, + { "es_ES.hello.utf8@euro", "", "" }, + { " s pa c e d _ more spaces _ spaced variant ", "", ""} + }; + + UErrorCode status = U_ZERO_ERROR; + + int32_t i = 0; + int32_t resultLen = 0; + char buffer[256]; + + for(i = 0; i < sizeof(testCases)/sizeof(testCases[0]); i++) { + *buffer = 0; + resultLen = uloc_getName(testCases[i].localeID, buffer, 256, &status); + if(uprv_strcmp(testCases[i].expectedValue, buffer) != 0) { + log_err("Expected to extract \"%s\" from \"%s\" for keyword \"%s\". Got \"%s\" instead\n", + testCases[i].expectedValue, testCases[i].localeID, testCases[i].keyword, buffer); } - else if (ures_getType(subBundle) == URES_ARRAY) { - UResourceBundle *subSubBundle = ures_getByIndex(subBundle, 0, NULL, &errorCode); - UResourceBundle *subSubRootBundle = ures_getByIndex(subRootBundle, 0, NULL, &errorCode); - - if (U_SUCCESS(errorCode) - && (ures_getType(subSubBundle) == URES_ARRAY || ures_getType(subSubRootBundle) == URES_ARRAY)) - { - /* TODO: Properly check for 2D arrays and zoneStrings */ - if (subBundleKey != NULL && strcmp(subBundleKey, "zoneStrings") == 0) { -/* int32_t minSize = ures_getSize(subBundle); - int32_t idx; - - for (idx = 0; idx < minSize; idx++) { - UResourceBundle *subSubBundleAtIndex = ures_getByIndex(subBundle, idx, NULL, &errorCode); - if (ures_getSize(subSubBundleAtIndex) != 6) { - log_err("zoneStrings at index %d has wrong size for locale \"%s\". array size=%d\n", - idx, - locale, - ures_getSize(subSubBundleAtIndex)); - } - ures_close(subSubBundleAtIndex); - }*/ - } - else { - /* Here is one of the recursive parts */ - TestKeyInRootRecursive(subRootBundle, rootName, subBundle, locale); - } - } - else { - int32_t minSize = ures_getSize(subRootBundle); - int32_t idx; - UBool sameArray = TRUE; - - if (minSize > ures_getSize(subBundle)) { - minSize = ures_getSize(subBundle); - } - - if ((subBundleKey == NULL - || (subBundleKey != NULL && strcmp(subBundleKey, "LocaleScript") != 0)) - && ures_getSize(subRootBundle) != ures_getSize(subBundle)) - { - log_err("Different size array with key \"%s\" in \"%s\" from root for locale \"%s\"\n" - "\troot array size=%d, locale array size=%d\n", - subBundleKey, - ures_getKey(currentBundle), - locale, - ures_getSize(subRootBundle), - ures_getSize(subBundle)); - } + } +} - for (idx = 0; idx < minSize; idx++) { - int32_t rootStrLen, localeStrLen; - const UChar *rootStr = ures_getStringByIndex(subRootBundle,idx,&rootStrLen,&errorCode); - const UChar *localeStr = ures_getStringByIndex(subBundle,idx,&localeStrLen,&errorCode); - if (rootStr && localeStr && U_SUCCESS(errorCode)) { - if (u_strcmp(rootStr, localeStr) != 0) { - sameArray = FALSE; - } - } - else { - log_err("Got a NULL string with key \"%s\" in \"%s\" at index %d for root or locale \"%s\"\n", - subBundleKey, - ures_getKey(currentBundle), - idx, - locale); - continue; - } - if (localeStr[0] == (UChar)0x20) { - log_err("key \"%s\" at index %d in \"%s\" starts with a space in locale \"%s\"\n", - subBundleKey, - idx, - ures_getKey(currentBundle), - locale); - } - else if (localeStr[localeStrLen - 1] == (UChar)0x20) { - log_err("key \"%s\" at index %d in \"%s\" ends with a space in locale \"%s\"\n", - subBundleKey, - idx, - ures_getKey(currentBundle), - locale); - } - else if (subBundleKey != NULL - && strcmp(subBundleKey, "DateTimePatterns") == 0) - { - int32_t quoted = 0; - const UChar *localeStrItr = localeStr; - while (*localeStrItr) { - if (*localeStrItr == (UChar)0x27 /* ' */) { - quoted++; - } - else if ((quoted % 2) == 0) { - /* Search for unquoted characters */ - if (4 <= idx && idx <= 7 - && (*localeStrItr == (UChar)0x6B /* k */ - || *localeStrItr == (UChar)0x48 /* H */ - || *localeStrItr == (UChar)0x6D /* m */ - || *localeStrItr == (UChar)0x73 /* s */ - || *localeStrItr == (UChar)0x53 /* S */ - || *localeStrItr == (UChar)0x61 /* a */ - || *localeStrItr == (UChar)0x68 /* h */ - || *localeStrItr == (UChar)0x7A /* z */)) - { - log_err("key \"%s\" at index %d has time pattern chars in date for locale \"%s\"\n", - subBundleKey, - idx, - locale); - } - else if (0 <= idx && idx <= 3 - && (*localeStrItr == (UChar)0x47 /* G */ - || *localeStrItr == (UChar)0x79 /* y */ - || *localeStrItr == (UChar)0x4D /* M */ - || *localeStrItr == (UChar)0x64 /* d */ - || *localeStrItr == (UChar)0x45 /* E */ - || *localeStrItr == (UChar)0x44 /* D */ - || *localeStrItr == (UChar)0x46 /* F */ - || *localeStrItr == (UChar)0x77 /* w */ - || *localeStrItr == (UChar)0x57 /* W */)) - { - log_err("key \"%s\" at index %d has date pattern chars in time for locale \"%s\"\n", - subBundleKey, - idx, - locale); - } - } - localeStrItr++; - } - } - else if (idx == 4 && subBundleKey != NULL - && strcmp(subBundleKey, "NumberElements") == 0 - && u_charDigitValue(localeStr[0]) != 0) - { - log_err("key \"%s\" at index %d has a non-zero based number for locale \"%s\"\n", - subBundleKey, - idx, - locale); - } - } - if (sameArray && strcmp(rootName, "root") == 0) { - log_err("Arrays are the same with key \"%s\" in \"%s\" from root for locale \"%s\"\n", - subBundleKey, - ures_getKey(currentBundle), - locale); - } - } - ures_close(subSubBundle); - ures_close(subSubRootBundle); - } - else if (ures_getType(subBundle) == URES_STRING) { - int32_t len = 0; - const UChar *string = ures_getString(subBundle, &len, &errorCode); - if (U_FAILURE(errorCode) || string == NULL) { - log_err("Can't open a string with key \"%s\" in \"%s\" for locale \"%s\"\n", - subBundleKey, - ures_getKey(currentBundle), - locale); - } else if (string[0] == (UChar)0x20) { - log_err("key \"%s\" in \"%s\" starts with a space in locale \"%s\"\n", - subBundleKey, - ures_getKey(currentBundle), - locale); - } else if (string[len - 1] == (UChar)0x20) { - log_err("key \"%s\" in \"%s\" ends with a space in locale \"%s\"\n", - subBundleKey, - ures_getKey(currentBundle), - locale); - } else if (strcmp(subBundleKey, "localPatternChars") == 0 && len != 20) { - log_err("key \"%s\" has the wrong number of characters in locale \"%s\"\n", - subBundleKey, - locale); +static void TestKeywordVariants(void) +{ + struct { + const char *localeID; + const char *expectedLocaleID; + const char *expectedLocaleIDNoKeywords; + const char *expectedCanonicalID; + const char *expectedKeywords[10]; + int32_t numKeywords; + UErrorCode expectedStatus; /* from uloc_openKeywords */ + } testCases[] = { + { + "de_DE@ currency = euro; C o ll A t i o n = Phonebook ; C alen dar = buddhist ", + "de_DE@calendar=buddhist;collation=Phonebook;currency=euro", + "de_DE", + "de_DE@calendar=buddhist;collation=Phonebook;currency=euro", + {"calendar", "collation", "currency"}, + 3, + U_ZERO_ERROR + }, + { + "de_DE@euro", + "de_DE@euro", + "de_DE", + "de_DE@currency=EUR", + {"","","","","","",""}, + 0, + U_INVALID_FORMAT_ERROR /* must have '=' after '@' */ + }, + { + "de_DE@euro;collation=phonebook", + "de_DE", /* error result; bad format */ + "de_DE", /* error result; bad format */ + "de_DE", /* error result; bad format */ + {"","","","","","",""}, + 0, + U_INVALID_FORMAT_ERROR + } + }; + UErrorCode status = U_ZERO_ERROR; + + int32_t i = 0, j = 0; + int32_t resultLen = 0; + char buffer[256]; + UEnumeration *keywords; + int32_t keyCount = 0; + const char *keyword = NULL; + int32_t keywordLen = 0; + + for(i = 0; i < sizeof(testCases)/sizeof(testCases[0]); i++) { + status = U_ZERO_ERROR; + *buffer = 0; + keywords = uloc_openKeywords(testCases[i].localeID, &status); + + if(status != testCases[i].expectedStatus) { + log_err("Expected to uloc_openKeywords(\"%s\") => status %s. Got %s instead\n", + testCases[i].localeID, + u_errorName(testCases[i].expectedStatus), u_errorName(status)); + } + status = U_ZERO_ERROR; + if(keywords) { + if((keyCount = uenum_count(keywords, &status)) != testCases[i].numKeywords) { + log_err("Expected to get %i keywords, got %i\n", testCases[i].numKeywords, keyCount); } - /* No fallback was done. Check for duplicate data */ - /* The ures_* API does not do fallback of sub-resource bundles, - So we can't do this now. */ - else if (strcmp(locale, "root") != 0 && errorCode == U_ZERO_ERROR) { - - const UChar *rootString = ures_getString(subRootBundle, &len, &errorCode); - if (U_FAILURE(errorCode) || rootString == NULL) { - log_err("Can't open a string with key \"%s\" in \"%s\" in root\n", - ures_getKey(subRootBundle), - ures_getKey(currentBundle)); - continue; - } else if (u_strcmp(string, rootString) == 0) { - if (strcmp(locale, "de_CH") != 0 && strcmp(subBundleKey, "Countries") != 0) { - log_err("Found duplicate data with key \"%s\" in \"%s\" in locale \"%s\"\n", - ures_getKey(subRootBundle), - ures_getKey(currentBundle), - locale); - } - else { - /* Ignore for now. */ - /* Can be fixed if fallback through de locale was done. */ - log_verbose("Skipping key %s in %s\n", subBundleKey, locale); + if(keyCount) { + j = 0; + while((keyword = uenum_next(keywords, &keywordLen, &status))) { + if(strcmp(keyword, testCases[i].expectedKeywords[j]) != 0) { + log_err("Expected to get keyword value %s, got %s\n", testCases[i].expectedKeywords[j], keyword); } + j++; } } + uenum_close(keywords); } - else if (ures_getType(subBundle) == URES_TABLE) { - /* Here is one of the recursive parts */ - TestKeyInRootRecursive(subRootBundle, rootName, subBundle, locale); - } - else if (ures_getType(subBundle) == URES_BINARY || ures_getType(subBundle) == URES_INT) { - /* Can't do anything to check it */ - /* We'll assume it's all correct */ - if (strcmp(subBundleKey, "LocaleID") != 0) { - log_verbose("Skipping key \"%s\" in \"%s\" for locale \"%s\"\n", - subBundleKey, - ures_getKey(currentBundle), - locale); - } - /* Testing for LocaleID is done in testLCID */ + resultLen = uloc_getName(testCases[i].localeID, buffer, 256, &status); + if (uprv_strcmp(testCases[i].expectedLocaleID, buffer) != 0) { + log_err("Expected uloc_getName(\"%s\") => \"%s\"; got \"%s\"\n", + testCases[i].localeID, testCases[i].expectedLocaleID, buffer); } - else { - log_err("Type %d for key \"%s\" in \"%s\" is unknown for locale \"%s\"\n", - ures_getType(subBundle), - subBundleKey, - ures_getKey(currentBundle), - locale); + resultLen = uloc_canonicalize(testCases[i].localeID, buffer, 256, &status); + if (uprv_strcmp(testCases[i].expectedCanonicalID, buffer) != 0) { + log_err("Expected uloc_canonicalize(\"%s\") => \"%s\"; got \"%s\"\n", + testCases[i].localeID, testCases[i].expectedCanonicalID, buffer); + } + } + +} + +static void TestKeywordVariantParsing(void) +{ + struct { + const char *localeID; + const char *keyword; + const char *expectedValue; + } testCases[] = { + { "de_DE@ C o ll A t i o n = Phonebook ", "c o ll a t i o n", "Phonebook" }, + { "de_DE", "collation", ""}, + { "de_DE@collation=PHONEBOOK", "collation", "PHONEBOOK" }, + { "de_DE@currency = euro; CoLLaTion = PHONEBOOk", "collatiON", "PHONEBOOk" }, + }; + + UErrorCode status = U_ZERO_ERROR; + + int32_t i = 0; + int32_t resultLen = 0; + char buffer[256]; + + for(i = 0; i < sizeof(testCases)/sizeof(testCases[0]); i++) { + *buffer = 0; + resultLen = uloc_getKeywordValue(testCases[i].localeID, testCases[i].keyword, buffer, 256, &status); + if(uprv_strcmp(testCases[i].expectedValue, buffer) != 0) { + log_err("Expected to extract \"%s\" from \"%s\" for keyword \"%s\". Got \"%s\" instead\n", + testCases[i].expectedValue, testCases[i].localeID, testCases[i].keyword, buffer); } - ures_close(subRootBundle); - ures_close(subBundle); } } +static struct { + const char *l; /* locale */ + const char *k; /* kw */ + const char *v; /* value */ + const char *x; /* expected */ +} kwSetTestCases[] = { +#if 1 + { "en_US", "calendar", "japanese", "en_US@calendar=japanese" }, + { "en_US@", "calendar", "japanese", "en_US@calendar=japanese" }, + { "en_US@calendar=islamic", "calendar", "japanese", "en_US@calendar=japanese" }, + { "en_US@calendar=slovakian", "calendar", "gregorian", "en_US@calendar=gregorian" }, /* don't know what this means, but it has the same # of chars as gregorian */ + { "en_US@calendar=gregorian", "calendar", "japanese", "en_US@calendar=japanese" }, + { "de", "Currency", "CHF", "de@currency=CHF" }, + { "de", "Currency", "CHF", "de@currency=CHF" }, + + { "en_US@collation=phonebook", "calendar", "japanese", "en_US@calendar=japanese;collation=phonebook" }, + { "en_US@calendar=japanese", "collation", "phonebook", "en_US@calendar=japanese;collation=phonebook" }, + { "de@collation=phonebook", "Currency", "CHF", "de@collation=phonebook;currency=CHF" }, + { "en_US@calendar=gregorian;collation=phonebook", "calendar", "japanese", "en_US@calendar=japanese;collation=phonebook" }, + { "en_US@calendar=slovakian;collation=phonebook", "calendar", "gregorian", "en_US@calendar=gregorian;collation=phonebook" }, /* don't know what this means, but it has the same # of chars as gregorian */ + { "en_US@calendar=slovakian;collation=videobook", "collation", "phonebook", "en_US@calendar=slovakian;collation=phonebook" }, /* don't know what this means, but it has the same # of chars as gregorian */ + { "en_US@calendar=islamic;collation=phonebook", "calendar", "japanese", "en_US@calendar=japanese;collation=phonebook" }, + { "de@collation=phonebook", "Currency", "CHF", "de@collation=phonebook;currency=CHF" }, +#endif +#if 1 + { "mt@a=0;b=1;c=2;d=3", "c","j", "mt@a=0;b=1;c=j;d=3" }, + { "mt@a=0;b=1;c=2;d=3", "x","j", "mt@a=0;b=1;c=2;d=3;x=j" }, + { "mt@a=0;b=1;c=2;d=3", "a","f", "mt@a=f;b=1;c=2;d=3" }, + { "mt@a=0;aa=1;aaa=3", "a","x", "mt@a=x;aa=1;aaa=3" }, + { "mt@a=0;aa=1;aaa=3", "aa","x", "mt@a=0;aa=x;aaa=3" }, + { "mt@a=0;aa=1;aaa=3", "aaa","x", "mt@a=0;aa=1;aaa=x" }, + { "mt@a=0;aa=1;aaa=3", "a","yy", "mt@a=yy;aa=1;aaa=3" }, + { "mt@a=0;aa=1;aaa=3", "aa","yy", "mt@a=0;aa=yy;aaa=3" }, + { "mt@a=0;aa=1;aaa=3", "aaa","yy", "mt@a=0;aa=1;aaa=yy" }, +#endif +#if 1 + /* removal tests */ + /* 1. removal of item at end */ + { "de@collation=phonebook;currency=CHF", "currency", "", "de@collation=phonebook" }, + { "de@collation=phonebook;currency=CHF", "currency", NULL, "de@collation=phonebook" }, + /* 2. removal of item at beginning */ + { "de@collation=phonebook;currency=CHF", "collation", "", "de@currency=CHF" }, + { "de@collation=phonebook;currency=CHF", "collation", NULL, "de@currency=CHF" }, + /* 3. removal of an item not there */ + { "de@collation=phonebook;currency=CHF", "calendar", NULL, "de@collation=phonebook;currency=CHF" }, + /* 4. removal of only item */ + { "de@collation=phonebook", "collation", NULL, "de" }, +#endif + { "de@collation=phonebook", "Currency", "CHF", "de@collation=phonebook;currency=CHF" } +}; -#ifdef WIN32 -static void -testLCID(UResourceBundle *currentBundle, - const char *localeName) +static void TestKeywordSet(void) { - UErrorCode status = U_ZERO_ERROR; - uint32_t lcid; - uint32_t expectedLCID; - char lcidStringC[64] = {0}; - int32_t lcidStringLen = 0; - const UChar *lcidString = NULL; - UResourceBundle *localeID = ures_getByKey(currentBundle, "LocaleID", NULL, &status); + int32_t i = 0; + int32_t resultLen = 0; + char buffer[1024]; - expectedLCID = ures_getInt(localeID, &status); - ures_close(localeID); + char cbuffer[1024]; - if (U_FAILURE(status)) { - log_err("ERROR: %s does not have a LocaleID (%s)\n", - localeName, u_errorName(status)); - return; - } + for(i = 0; i < sizeof(kwSetTestCases)/sizeof(kwSetTestCases[0]); i++) { + UErrorCode status = U_ZERO_ERROR; + memset(buffer,'%',1023); + strcpy(buffer, kwSetTestCases[i].l); - lcid = uprv_convertToLCID(localeName, &status); - if (U_FAILURE(status)) { - if (expectedLCID == 0) { - log_verbose("INFO: %-5s does not have any LCID mapping\n", - localeName); + uloc_canonicalize(kwSetTestCases[i].l, cbuffer, 1023, &status); + if(strcmp(buffer,cbuffer)) { + log_verbose("note: [%d] wasn't canonical, should be: '%s' not '%s'. Won't check for canonicity in output.\n", i, cbuffer, buffer); } - else { - log_err("ERROR: %-5s does not have an LCID mapping to 0x%.4X\n", - localeName, expectedLCID); + /* sanity check test case results for canonicity */ + uloc_canonicalize(kwSetTestCases[i].x, cbuffer, 1023, &status); + if(strcmp(kwSetTestCases[i].x,cbuffer)) { + log_err("%s:%d: ERROR: kwSetTestCases[%d].x = '%s', should be %s (must be canonical)\n", __FILE__, __LINE__, i, kwSetTestCases[i].x, cbuffer); } - return; - } - status = U_ZERO_ERROR; - uprv_strcpy(lcidStringC, uprv_convertToPosix(expectedLCID, &status)); - if (U_FAILURE(status)) { - log_err("ERROR: %.4x does not have a POSIX mapping due to %s\n", - expectedLCID, u_errorName(status)); - } - - if(lcid != expectedLCID) { - log_err("ERROR: %-5s wrongfully has 0x%.4x instead of 0x%.4x for LCID\n", - localeName, expectedLCID, lcid); - } - if(strcmp(localeName, lcidStringC) != 0) { - char langName[1024]; - char langLCID[1024]; - uloc_getLanguage(localeName, langName, sizeof(langName), &status); - uloc_getLanguage(lcidStringC, langLCID, sizeof(langLCID), &status); - - if (expectedLCID == lcid && strcmp(langName, langLCID) == 0) { - log_verbose("WARNING: %-5s resolves to %s (0x%.4x)\n", - localeName, lcidStringC, lcid); - } - else if (expectedLCID == lcid) { - log_err("ERROR: %-5s has 0x%.4x and the number resolves wrongfully to %s\n", - localeName, expectedLCID, lcidStringC); + resultLen = uloc_setKeywordValue(kwSetTestCases[i].k, kwSetTestCases[i].v, buffer, 1023, &status); + if(U_FAILURE(status)) { + log_err("Err on test case %d: got error %s\n", i, u_errorName(status)); + continue; } - else { - log_err("ERROR: %-5s has 0x%.4x and the number resolves wrongfully to %s. It should be 0x%x.\n", - localeName, expectedLCID, lcidStringC, lcid); + if(strcmp(buffer,kwSetTestCases[i].x) || ((int32_t)strlen(buffer)!=resultLen)) { + log_err("FAIL: #%d: %s + [%s=%s] -> %s (%d) expected %s (%d)\n", i, kwSetTestCases[i].l, kwSetTestCases[i].k, + kwSetTestCases[i].v, buffer, resultLen, kwSetTestCases[i].x, strlen(buffer)); + } else { + log_verbose("pass: #%d: %s + [%s=%s] -> %s\n", i, kwSetTestCases[i].l, kwSetTestCases[i].k, kwSetTestCases[i].v,buffer); } } } -#endif - -static void -TestLocaleStructure(void) { - UResourceBundle *root, *completeLoc, *currentLocale, *subtable, *completeSubtable; - int32_t locCount = uloc_countAvailable(); - int32_t locIndex; - UErrorCode errorCode = U_ZERO_ERROR; - const char *currLoc; +static void TestKeywordSetError(void) +{ + char buffer[1024]; + UErrorCode status; + int32_t res; + int32_t i; + int32_t blen; - /* TODO: Compare against parent's data too. This code can't handle fallbacks that some tools do already. */ -/* char locName[ULOC_FULLNAME_CAPACITY]; - char *locNamePtr; + /* 0-test whether an error condition modifies the buffer at all */ + blen=0; + i=0; + memset(buffer,'%',1023); + status = U_ZERO_ERROR; + res = uloc_setKeywordValue(kwSetTestCases[i].k, kwSetTestCases[i].v, buffer, blen, &status); + if(status != U_ILLEGAL_ARGUMENT_ERROR) { + log_err("expected illegal err got %s\n", u_errorName(status)); + return; + } + /* if(res!=strlen(kwSetTestCases[i].x)) { + log_err("expected result %d got %d\n", strlen(kwSetTestCases[i].x), res); + return; + } */ + if(buffer[blen]!='%') { + log_err("Buffer byte %d was modified: now %c\n", blen, buffer[blen]); + return; + } + log_verbose("0-buffer modify OK\n"); - for (locIndex = 0; locIndex < locCount; locIndex++) { - errorCode=U_ZERO_ERROR; - strcpy(locName, uloc_getAvailable(locIndex)); - locNamePtr = strrchr(locName, '_'); - if (locNamePtr) { - *locNamePtr = 0; + for(i=0;i<=2;i++) { + /* 1- test a short buffer with growing text */ + blen=strlen(kwSetTestCases[i].l)+1; + memset(buffer,'%',1023); + strcpy(buffer,kwSetTestCases[i].l); + status = U_ZERO_ERROR; + res = uloc_setKeywordValue(kwSetTestCases[i].k, kwSetTestCases[i].v, buffer, blen, &status); + if(status != U_BUFFER_OVERFLOW_ERROR) { + log_err("expected buffer overflow on buffer %d got %s, len %d (%s + [%s=%s])\n", blen, u_errorName(status), res, kwSetTestCases[i].l, kwSetTestCases[i].k, kwSetTestCases[i].v); + return; } - else { - strcpy(locName, "root"); + if(res!=(int32_t)strlen(kwSetTestCases[i].x)) { + log_err("expected result %d got %d\n", strlen(kwSetTestCases[i].x), res); + return; } - - root = ures_openDirect(NULL, locName, &errorCode); - if(U_FAILURE(errorCode)) { - log_err("Can't open %s\n", locName); - continue; + if(buffer[blen]!='%') { + log_err("Buffer byte %d was modified: now %c\n", blen, buffer[blen]); + return; } -*/ - if (locCount <= 1) { - log_data_err("At least root needs to be installed\n"); + log_verbose("1/%d-buffer modify OK\n",i); } - root = ures_openDirect(NULL, "root", &errorCode); - if(U_FAILURE(errorCode)) { - log_data_err("Can't open root\n"); - return; - } - completeLoc = ures_openDirect(NULL, "en", &errorCode); - if(U_FAILURE(errorCode)) { - log_data_err("Can't open en\n"); - return; - } - for (locIndex = 0; locIndex < locCount; locIndex++) { - errorCode=U_ZERO_ERROR; - currLoc = uloc_getAvailable(locIndex); - currentLocale = ures_open(NULL, currLoc, &errorCode); - if(errorCode != U_ZERO_ERROR) { - if(U_SUCCESS(errorCode)) { - /* It's installed, but there is no data. - It's installed for the g18n white paper [grhoten] */ - log_err("ERROR: Locale %-5s not installed, and it should be!\n", - uloc_getAvailable(locIndex)); - } else { - log_err("%%%%%%% Unexpected error %d in %s %%%%%%%", - u_errorName(errorCode), - uloc_getAvailable(locIndex)); - } - ures_close(currentLocale); - continue; + for(i=3;i<=4;i++) { + /* 2- test a short buffer - text the same size or shrinking */ + blen=strlen(kwSetTestCases[i].l)+1; + memset(buffer,'%',1023); + strcpy(buffer,kwSetTestCases[i].l); + status = U_ZERO_ERROR; + res = uloc_setKeywordValue(kwSetTestCases[i].k, kwSetTestCases[i].v, buffer, blen, &status); + if(status != U_ZERO_ERROR) { + log_err("expected zero error got %s\n", u_errorName(status)); + return; } - ures_getStringByKey(currentLocale, "Version", NULL, &errorCode); - if(errorCode != U_ZERO_ERROR) { - log_err("No version information is available for locale %s, and it should be!\n", - currLoc); + if(buffer[blen+1]!='%') { + log_err("Buffer byte %d was modified: now %c\n", blen+1, buffer[blen+1]); + return; } - else if (ures_getStringByKey(currentLocale, "Version", NULL, &errorCode)[0] == (UChar)(0x78)) { - log_verbose("WARNING: The locale %s is experimental! It shouldn't be listed as an installed locale.\n", - currLoc); + if(res!=(int32_t)strlen(kwSetTestCases[i].x)) { + log_err("expected result %d got %d\n", strlen(kwSetTestCases[i].x), res); + return; } - TestKeyInRootRecursive(root, "root", currentLocale, currLoc); - - completeSubtable = ures_getByKey(completeLoc, "Currencies", NULL, &errorCode); - subtable = ures_getByKey(currentLocale, "Currencies", NULL, &errorCode); - TestKeyInRootRecursive(completeSubtable, "en", subtable, currLoc); - -#ifdef WIN32 - testLCID(currentLocale, currLoc); -#endif - - ures_close(completeSubtable); - ures_close(subtable); - ures_close(currentLocale); + if(strcmp(buffer,kwSetTestCases[i].x) || ((int32_t)strlen(buffer)!=res)) { + log_err("FAIL: #%d: %s + [%s=%s] -> %s (%d) expected %s (%d)\n", i, kwSetTestCases[i].l, kwSetTestCases[i].k, + kwSetTestCases[i].v, buffer, res, kwSetTestCases[i].x, strlen(buffer)); + } else { + log_verbose("pass: #%d: %s + [%s=%s] -> %s\n", i, kwSetTestCases[i].l, kwSetTestCases[i].k, kwSetTestCases[i].v, + buffer); + } + log_verbose("2/%d-buffer modify OK\n",i); } +} - ures_close(root); - ures_close(completeLoc); +static int32_t _canonicalize(int32_t selector, /* 0==getName, 1==canonicalize */ + const char* localeID, + char* result, + int32_t resultCapacity, + UErrorCode* ec) { + /* YOU can change this to use function pointers if you like */ + switch (selector) { + case 0: + return uloc_getName(localeID, result, resultCapacity, ec); + case 1: + return uloc_canonicalize(localeID, result, resultCapacity, ec); + default: + return -1; + } } -static void -compareArrays(const char *keyName, - UResourceBundle *fromArray, const char *fromLocale, - UResourceBundle *toArray, const char *toLocale, - int32_t start, int32_t end) +static void TestCanonicalization(void) { - int32_t fromSize = ures_getSize(fromArray); - int32_t toSize = ures_getSize(fromArray); - int32_t idx; - UErrorCode errorCode = U_ZERO_ERROR; - - if (fromSize > toSize) { - fromSize = toSize; - log_err("Arrays are different size from \"%s\" to \"%s\"\n", - fromLocale, - toLocale); - } - - for (idx = start; idx <= end; idx++) { - const UChar *fromBundleStr = ures_getStringByIndex(fromArray, idx, NULL, &errorCode); - const UChar *toBundleStr = ures_getStringByIndex(toArray, idx, NULL, &errorCode); - if (fromBundleStr && toBundleStr && u_strcmp(fromBundleStr, toBundleStr) != 0) - { - log_err("Difference for %s at index %d from %s= \"%s\" to %s= \"%s\"\n", - keyName, - idx, - fromLocale, - austrdup(fromBundleStr), - toLocale, - austrdup(toBundleStr)); + static struct { + const char *localeID; /* input */ + const char *getNameID; /* expected getName() result */ + const char *canonicalID; /* expected canonicalize() result */ + } testCases[] = { + { "ca_ES_PREEURO-with-extra-stuff-that really doesn't make any sense-unless-you're trying to increase code coverage", + "ca_ES_PREEURO_WITH_EXTRA_STUFF_THAT REALLY DOESN'T MAKE ANY SENSE_UNLESS_YOU'RE TRYING TO INCREASE CODE COVERAGE", + "ca_ES_PREEURO_WITH_EXTRA_STUFF_THAT REALLY DOESN'T MAKE ANY SENSE_UNLESS_YOU'RE TRYING TO INCREASE CODE COVERAGE"}, + { "ca_ES_PREEURO", "ca_ES_PREEURO", "ca_ES@currency=ESP" }, + { "de_AT_PREEURO", "de_AT_PREEURO", "de_AT@currency=ATS" }, + { "de_DE_PREEURO", "de_DE_PREEURO", "de_DE@currency=DEM" }, + { "de_LU_PREEURO", "de_LU_PREEURO", "de_LU@currency=LUF" }, + { "el_GR_PREEURO", "el_GR_PREEURO", "el_GR@currency=GRD" }, + { "en_BE_PREEURO", "en_BE_PREEURO", "en_BE@currency=BEF" }, + { "en_IE_PREEURO", "en_IE_PREEURO", "en_IE@currency=IEP" }, + { "es_ES_PREEURO", "es_ES_PREEURO", "es_ES@currency=ESP" }, + { "eu_ES_PREEURO", "eu_ES_PREEURO", "eu_ES@currency=ESP" }, + { "fi_FI_PREEURO", "fi_FI_PREEURO", "fi_FI@currency=FIM" }, + { "fr_BE_PREEURO", "fr_BE_PREEURO", "fr_BE@currency=BEF" }, + { "fr_FR_PREEURO", "fr_FR_PREEURO", "fr_FR@currency=FRF" }, + { "fr_LU_PREEURO", "fr_LU_PREEURO", "fr_LU@currency=LUF" }, + { "ga_IE_PREEURO", "ga_IE_PREEURO", "ga_IE@currency=IEP" }, + { "gl_ES_PREEURO", "gl_ES_PREEURO", "gl_ES@currency=ESP" }, + { "it_IT_PREEURO", "it_IT_PREEURO", "it_IT@currency=ITL" }, + { "nl_BE_PREEURO", "nl_BE_PREEURO", "nl_BE@currency=BEF" }, + { "nl_NL_PREEURO", "nl_NL_PREEURO", "nl_NL@currency=NLG" }, + { "pt_PT_PREEURO", "pt_PT_PREEURO", "pt_PT@currency=PTE" }, + { "de__PHONEBOOK", "de__PHONEBOOK", "de@collation=phonebook" }, + { "en_GB_EURO", "en_GB_EURO", "en_GB@currency=EUR" }, + { "en_GB@EURO", "en_GB@EURO", "en_GB@currency=EUR" }, /* POSIX ID */ + { "es__TRADITIONAL", "es__TRADITIONAL", "es@collation=traditional" }, + { "hi__DIRECT", "hi__DIRECT", "hi@collation=direct" }, + { "ja_JP_TRADITIONAL", "ja_JP_TRADITIONAL", "ja_JP@calendar=japanese" }, + { "th_TH_TRADITIONAL", "th_TH_TRADITIONAL", "th_TH@calendar=buddhist" }, + { "zh_TW_STROKE", "zh_TW_STROKE", "zh_TW@collation=stroke" }, + { "zh__PINYIN", "zh__PINYIN", "zh@collation=pinyin" }, + { "zh@collation=pinyin", "zh@collation=pinyin", "zh@collation=pinyin" }, + { "zh_CN@collation=pinyin", "zh_CN@collation=pinyin", "zh_CN@collation=pinyin" }, + { "zh_CN_CA@collation=pinyin", "zh_CN_CA@collation=pinyin", "zh_CN_CA@collation=pinyin" }, + { "en_US_POSIX", "en_US_POSIX", "en_US_POSIX" }, + { "hy_AM_REVISED", "hy_AM_REVISED", "hy_AM_REVISED" }, + { "no_NO_NY", "no_NO_NY", "no_NO_NY" /* not: "nn_NO" [alan ICU3.0] */ }, + { "no@ny", "no@ny", "no__NY" /* not: "nn" [alan ICU3.0] */ }, /* POSIX ID */ + { "no-no.utf32@B", "no_NO.utf32@B", "no_NO_B" /* not: "nb_NO_B" [alan ICU3.0] */ }, /* POSIX ID */ + { "qz-qz@Euro", "qz_QZ@Euro", "qz_QZ@currency=EUR" }, /* qz-qz uses private use iso codes */ + { "en-BOONT", "en_BOONT", "en__BOONT" }, /* registered name */ + { "de-1901", "de_1901", "de__1901" }, /* registered name */ + { "de-1906", "de_1906", "de__1906" }, /* registered name */ + { "sr-SP-Cyrl", "sr_SP_CYRL", "sr_Cyrl_SP" }, /* .NET name */ + { "sr-SP-Latn", "sr_SP_LATN", "sr_Latn_SP" }, /* .NET name */ + { "uz-UZ-Cyrl", "uz_UZ_CYRL", "uz_Cyrl_UZ" }, /* .NET name */ + { "uz-UZ-Latn", "uz_UZ_LATN", "uz_Latn_UZ" }, /* .NET name */ + { "zh-CHS", "zh_CHS", "zh_Hans" }, /* .NET name */ + { "zh-CHT", "zh_CHT", "zh_TW" }, /* .NET name This may change back to zh_Hant */ + + /* posix behavior that used to be performed by getName */ + { "mr.utf8", "mr.utf8", "mr" }, + { "de-tv.koi8r", "de_TV.koi8r", "de_TV" }, + { "x-piglatin_ML.MBE", "x-piglatin_ML.MBE", "x-piglatin_ML" }, + { "i-cherokee_US.utf7", "i-cherokee_US.utf7", "i-cherokee_US" }, + { "x-filfli_MT_FILFLA.gb-18030", "x-filfli_MT_FILFLA.gb-18030", "x-filfli_MT_FILFLA" }, + { "no-no-ny.utf8@B", "no_NO_NY.utf8@B", "no_NO_NY_B" /* not: "nn_NO" [alan ICU3.0] */ }, /* @ ignored unless variant is empty */ + + /* fleshing out canonicalization */ + /* trim space and sort keywords, ';' is separator so not present at end in canonical form */ + { "en_Hant_IL_VALLEY_GIRL@ currency = EUR; calendar = Japanese ;", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR" }, + /* already-canonical ids are not changed */ + { "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR" }, + /* PRE_EURO and EURO conversions don't affect other keywords */ + { "es_ES_PREEURO@CALendar=Japanese", "es_ES_PREEURO@calendar=Japanese", "es_ES@calendar=Japanese;currency=ESP" }, + { "es_ES_EURO@SHOUT=zipeedeedoodah", "es_ES_EURO@shout=zipeedeedoodah", "es_ES@currency=EUR;shout=zipeedeedoodah" }, + /* currency keyword overrides PRE_EURO and EURO currency */ + { "es_ES_PREEURO@currency=EUR", "es_ES_PREEURO@currency=EUR", "es_ES@currency=EUR" }, + { "es_ES_EURO@currency=ESP", "es_ES_EURO@currency=ESP", "es_ES@currency=ESP" }, + /* norwegian is just too weird, if we handle things in their full generality */ + { "no-Hant-GB_NY@currency=$$$", "no_Hant_GB_NY@currency=$$$", "no_Hant_GB_NY@currency=$$$" /* not: "nn_Hant_GB@currency=$$$" [alan ICU3.0] */ }, + + /* test cases reflecting internal resource bundle usage */ + { "root@kw=foo", "root@kw=foo", "root@kw=foo" }, + { "@calendar=gregorian", "@calendar=gregorian", "@calendar=gregorian" }, + { "ja_JP@calendar=Japanese", "ja_JP@calendar=Japanese", "ja_JP@calendar=Japanese" }, + { "ja_JP", "ja_JP", "ja_JP" } + }; + + static const char* label[] = { "getName", "canonicalize" }; + + UErrorCode status = U_ZERO_ERROR; + int32_t i, j, resultLen = 0, origResultLen; + char buffer[256]; + + for (i=0; i < sizeof(testCases)/sizeof(testCases[0]); i++) { + for (j=0; j<2; ++j) { + const char* expected = (j==0) ? testCases[i].getNameID : testCases[i].canonicalID; + *buffer = 0; + status = U_ZERO_ERROR; + /* log_verbose("testing %s -> %s\n", testCases[i], testCases[i].canonicalID); */ + origResultLen = _canonicalize(j, testCases[i].localeID, NULL, 0, &status); + if (status != U_BUFFER_OVERFLOW_ERROR) { + log_err("FAIL: uloc_%s(%s) => %s, expected U_BUFFER_OVERFLOW_ERROR\n", + label[j], testCases[i].localeID, u_errorName(status)); + continue; + } + status = U_ZERO_ERROR; + resultLen = _canonicalize(j, testCases[i].localeID, buffer, sizeof(buffer), &status); + if (U_FAILURE(status)) { + log_err("FAIL: uloc_%s(%s) => %s, expected U_ZERO_ERROR\n", + label[j], testCases[i].localeID, u_errorName(status)); + continue; + } + if(uprv_strcmp(expected, buffer) != 0) { + log_err("FAIL: uloc_%s(%s) => \"%s\", expected \"%s\"\n", + label[j], testCases[i].localeID, buffer, expected); + } else { + log_verbose("Ok: uloc_%s(%s) => \"%s\"\n", + label[j], testCases[i].localeID, buffer); + } + if (resultLen != (int32_t)strlen(buffer)) { + log_err("FAIL: uloc_%s(%s) => len %d, expected len %d\n", + label[j], testCases[i].localeID, resultLen, strlen(buffer)); + } + if (origResultLen != resultLen) { + log_err("FAIL: uloc_%s(%s) => preflight len %d != actual len %d\n", + label[j], testCases[i].localeID, origResultLen, resultLen); + } } } } -static void -compareConsistentCountryInfo(const char *fromLocale, const char *toLocale) { - UErrorCode errorCode = U_ZERO_ERROR; - UResourceBundle *fromDateTimeElements, *toDateTimeElements; - UResourceBundle *fromArray, *toArray; - UResourceBundle *fromLocaleBund = ures_open(NULL, fromLocale, &errorCode); - UResourceBundle *toLocaleBund = ures_open(NULL, toLocale, &errorCode); +static void TestDisplayKeywords(void) +{ + int32_t i; - if(U_FAILURE(errorCode)) { - log_err("Can't open resource bundle %s or %s - %s\n", fromLocale, toLocale, u_errorName(errorCode)); - return; + static const struct { + const char *localeID; + const char *displayLocale; + UChar displayKeyword[200]; + } testCases[] = { + { "ca_ES@currency=ESP", "de_AT", + {0x0057, 0x00e4, 0x0068, 0x0072, 0x0075, 0x006e, 0x0067, 0x0000}, + }, + { "ja_JP@calendar=japanese", "de", + { 0x004b, 0x0061, 0x006c, 0x0065, 0x006e, 0x0064, 0x0065, 0x0072, 0x0000} + }, + { "de_DE@collation=traditional", "de_DE", + {0x0053, 0x006f, 0x0072, 0x0074, 0x0069, 0x0065, 0x0072, 0x0075, 0x006e, 0x0067, 0x0000} + }, + }; + for(i = 0; i < sizeof(testCases)/sizeof(testCases[0]); i++) { + UErrorCode status = U_ZERO_ERROR; + const char* keyword =NULL; + int32_t keywordLen = 0; + int32_t keywordCount = 0; + UChar *displayKeyword=NULL; + int32_t displayKeywordLen = 0; + UEnumeration* keywordEnum = uloc_openKeywords(testCases[i].localeID, &status); + for(keywordCount = uenum_count(keywordEnum, &status); keywordCount > 0 ; keywordCount--){ + if(U_FAILURE(status)){ + log_err("uloc_getKeywords failed for locale id: %s with error : %s \n", testCases[i].localeID, u_errorName(status)); + break; + } + /* the uenum_next returns NUL terminated string */ + keyword = uenum_next(keywordEnum, &keywordLen, &status); + /* fetch the displayKeyword */ + displayKeywordLen = uloc_getDisplayKeyword(keyword, testCases[i].displayLocale, displayKeyword, displayKeywordLen, &status); + if(status==U_BUFFER_OVERFLOW_ERROR){ + status = U_ZERO_ERROR; + displayKeywordLen++; /* for null termination */ + displayKeyword = (UChar*) malloc(displayKeywordLen * U_SIZEOF_UCHAR); + displayKeywordLen = uloc_getDisplayKeyword(keyword, testCases[i].displayLocale, displayKeyword, displayKeywordLen, &status); + if(U_FAILURE(status)){ + log_err("uloc_getDisplayKeyword filed for keyword : %s in locale id: %s for display locale: %s \n", testCases[i].localeID, keyword, testCases[i].displayLocale, u_errorName(status)); + break; + } + if(u_strncmp(displayKeyword, testCases[i].displayKeyword, displayKeywordLen)!=0){ + log_err("uloc_getDisplayKeyword did not get the expected value for keyword : %s in locale id: %s for display locale: %s \n", testCases[i].localeID, keyword, testCases[i].displayLocale); + break; + } + }else{ + log_err("uloc_getDisplayKeyword did not return the expected error. Error: %s\n", u_errorName(status)); + } + + free(displayKeyword); + + } + uenum_close(keywordEnum); } +} - fromDateTimeElements = ures_getByKey(fromLocaleBund, "DateTimeElements", NULL, &errorCode); - toDateTimeElements = ures_getByKey(toLocaleBund, "DateTimeElements", NULL, &errorCode); - if (strcmp(fromLocale, "ar_IN") != 0) +static void TestDisplayKeywordValues(void){ + int32_t i; + + struct { + const char *localeID; + const char *displayLocale; + UChar displayKeywordValue[500]; + } testCases[] = { + { "ca_ES@currency=ESP", "de_AT", + {0x0053, 0x0070, 0x0061, 0x006e, 0x0069, 0x0073, 0x0063, 0x0068, 0x0065, 0x0020, 0x0050, 0x0065, 0x0073, 0x0065, 0x0074, 0x0065, 0x0000} + }, + { "de_AT@currency=ATS", "fr_FR", + {0x0073, 0x0063, 0x0068, 0x0069, 0x006c, 0x006c, 0x0069, 0x006e, 0x0067, 0x0020, 0x0061, 0x0075, 0x0074, 0x0072, 0x0069, 0x0063, 0x0068, 0x0069, 0x0065, 0x006e, 0x0000} + }, + { "de_DE@currency=DEM", "it", + {0x004d, 0x0061, 0x0072, 0x0063, 0x006f, 0x0020, 0x0054, 0x0065, 0x0064, 0x0065, 0x0073, 0x0063, 0x006f, 0x0000} + }, + { "el_GR@currency=GRD", "en", + {0x0047, 0x0072, 0x0065, 0x0065, 0x006b, 0x0020, 0x0044, 0x0072, 0x0061, 0x0063, 0x0068, 0x006d, 0x0061, 0x0000} + }, + { "eu_ES@currency=ESP", "it_IT", + {0x0050, 0x0065, 0x0073, 0x0065, 0x0074, 0x0061, 0x0020, 0x0053, 0x0070, 0x0061, 0x0067, 0x006e, 0x006f, 0x006c, 0x0061, 0x0000} + }, + { "de@collation=phonebook", "es", + {0x006F, 0x0072, 0x0064, 0x0065, 0x006E, 0x0020, 0x0064, 0x0065, 0x0020, 0x006C, 0x0069, 0x0073, 0x0074, 0x00ED, 0x006E, 0x0020, 0x0074, 0x0065, 0x006C, 0x0065, 0x0066, 0x00F3, 0x006E, 0x0069, 0x0063, 0x006F, 0x0000} + }, + + { "de_DE@collation=phonebook", "es", + {0x006F, 0x0072, 0x0064, 0x0065, 0x006E, 0x0020, 0x0064, 0x0065, 0x0020, 0x006C, 0x0069, 0x0073, 0x0074, 0x00ED, 0x006E, 0x0020, 0x0074, 0x0065, 0x006C, 0x0065, 0x0066, 0x00F3, 0x006E, 0x0069, 0x0063, 0x006F, 0x0000} + }, + { "es_ES@collation=traditional","de", + {0x0054, 0x0072, 0x0061, 0x0064, 0x0069, 0x0074, 0x0069, 0x006f, 0x006e, 0x0065, 0x006c, 0x006c, 0x0065, 0x0020, 0x0053, 0x006f, 0x0072, 0x0074, 0x0069, 0x0065, 0x0072, 0x0072, 0x0065, 0x0067, 0x0065, 0x006c, 0x006e, 0x0000} + }, + { "ja_JP@calendar=japanese", "de", + {0x004a, 0x0061, 0x0070, 0x0061, 0x006e, 0x0069, 0x0073, 0x0063, 0x0068, 0x0065, 0x0072, 0x0020, 0x004b, 0x0061, 0x006c, 0x0065, 0x006e, 0x0064, 0x0065, 0x0072, 0x0000} + }, + }; + for(i = 0; i < sizeof(testCases)/sizeof(testCases[0]); i++) { + UErrorCode status = U_ZERO_ERROR; + const char* keyword =NULL; + int32_t keywordLen = 0; + int32_t keywordCount = 0; + UChar *displayKeywordValue = NULL; + int32_t displayKeywordValueLen = 0; + UEnumeration* keywordEnum = uloc_openKeywords(testCases[i].localeID, &status); + for(keywordCount = uenum_count(keywordEnum, &status); keywordCount > 0 ; keywordCount--){ + if(U_FAILURE(status)){ + log_err("uloc_getKeywords failed for locale id: %s in display locale: % with error : %s \n", testCases[i].localeID, testCases[i].displayLocale, u_errorName(status)); + break; + } + /* the uenum_next returns NUL terminated string */ + keyword = uenum_next(keywordEnum, &keywordLen, &status); + + /* fetch the displayKeywordValue */ + displayKeywordValueLen = uloc_getDisplayKeywordValue(testCases[i].localeID, keyword, testCases[i].displayLocale, displayKeywordValue, displayKeywordValueLen, &status); + if(status==U_BUFFER_OVERFLOW_ERROR){ + status = U_ZERO_ERROR; + displayKeywordValueLen++; /* for null termination */ + displayKeywordValue = (UChar*)malloc(displayKeywordValueLen * U_SIZEOF_UCHAR); + displayKeywordValueLen = uloc_getDisplayKeywordValue(testCases[i].localeID, keyword, testCases[i].displayLocale, displayKeywordValue, displayKeywordValueLen, &status); + if(U_FAILURE(status)){ + log_err("uloc_getDisplayKeywordValue failed for keyword : %s in locale id: %s for display locale: %s with error : %s \n", testCases[i].localeID, keyword, testCases[i].displayLocale, u_errorName(status)); + break; + } + if(u_strncmp(displayKeywordValue, testCases[i].displayKeywordValue, displayKeywordValueLen)!=0){ + log_err("uloc_getDisplayKeywordValue did not return the expected value keyword : %s in locale id: %s for display locale: %s with error : %s \n", testCases[i].localeID, keyword, testCases[i].displayLocale, u_errorName(status)); + break; + } + }else{ + log_err("uloc_getDisplayKeywordValue did not return the expected error. Error: %s\n", u_errorName(status)); + } + free(displayKeywordValue); + } + uenum_close(keywordEnum); + } + { + /* test a multiple keywords */ + UErrorCode status = U_ZERO_ERROR; + const char* keyword =NULL; + int32_t keywordLen = 0; + int32_t keywordCount = 0; + const char* localeID = "es@collation=phonebook;calendar=buddhist;currency=DEM"; + const char* displayLocale = "de"; + const UChar expected[][50] = { + {0x0042, 0x0075, 0x0064, 0x0064, 0x0068, 0x0069, 0x0073, 0x0074, 0x0069, 0x0073, 0x0063, 0x0068, 0x0065, 0x0072, 0x0020, 0x004b, 0x0061, 0x006c, 0x0065, 0x006e, 0x0064, 0x0065, 0x0072, 0x0000}, + + {0x0054, 0x0065, 0x006c, 0x0065, 0x0066, 0x006f, 0x006e, 0x0062, 0x0075, 0x0063, 0x0068, 0x002d, 0x0053, 0x006f, 0x0072, 0x0074, 0x0069, 0x0065, 0x0072, 0x0072, 0x0065, 0x0067, 0x0065, 0x006c, 0x006e, 0x0000}, + {0x0044, 0x0065, 0x0075, 0x0074, 0x0073, 0x0063, 0x0068, 0x0065, 0x0020, 0x004d, 0x0061, 0x0072, 0x006b, 0x0000}, + }; + + UEnumeration* keywordEnum = uloc_openKeywords(localeID, &status); + + for(keywordCount = 0; keywordCount < uenum_count(keywordEnum, &status) ; keywordCount++){ + UChar *displayKeywordValue = NULL; + int32_t displayKeywordValueLen = 0; + if(U_FAILURE(status)){ + log_err("uloc_getKeywords failed for locale id: %s in display locale: % with error : %s \n", localeID, displayLocale, u_errorName(status)); + break; + } + /* the uenum_next returns NUL terminated string */ + keyword = uenum_next(keywordEnum, &keywordLen, &status); + + /* fetch the displayKeywordValue */ + displayKeywordValueLen = uloc_getDisplayKeywordValue(localeID, keyword, displayLocale, displayKeywordValue, displayKeywordValueLen, &status); + if(status==U_BUFFER_OVERFLOW_ERROR){ + status = U_ZERO_ERROR; + displayKeywordValueLen++; /* for null termination */ + displayKeywordValue = (UChar*)malloc(displayKeywordValueLen * U_SIZEOF_UCHAR); + displayKeywordValueLen = uloc_getDisplayKeywordValue(localeID, keyword, displayLocale, displayKeywordValue, displayKeywordValueLen, &status); + if(U_FAILURE(status)){ + log_err("uloc_getDisplayKeywordValue failed for keyword : %s in locale id: %s for display locale: %s with error : %s \n", localeID, keyword, displayLocale, u_errorName(status)); + break; + } + if(u_strncmp(displayKeywordValue, expected[keywordCount], displayKeywordValueLen)!=0){ + log_err("uloc_getDisplayKeywordValue did not return the expected value keyword : %s in locale id: %s for display locale: %s \n", localeID, keyword, displayLocale); + break; + } + }else{ + log_err("uloc_getDisplayKeywordValue did not return the expected error. Error: %s\n", u_errorName(status)); + } + free(displayKeywordValue); + } + uenum_close(keywordEnum); + + } { - int32_t fromSize; - int32_t toSize; - int32_t idx; - const int32_t *fromBundleArr = ures_getIntVector(fromDateTimeElements, &fromSize, &errorCode); - const int32_t *toBundleArr = ures_getIntVector(toDateTimeElements, &toSize, &errorCode); - - if (fromSize > toSize) { - fromSize = toSize; - log_err("Arrays are different size with key \"DateTimeElements\" from \"%s\" to \"%s\"\n", - fromLocale, - toLocale); - } - - for (idx = 0; idx < fromSize; idx++) { - if (fromBundleArr[idx] != toBundleArr[idx]) { - log_err("Difference with key \"DateTimeElements\" at index %d from \"%s\" to \"%s\"\n", - idx, - fromLocale, - toLocale); - } + /* Test non existent keywords */ + UErrorCode status = U_ZERO_ERROR; + const char* localeID = "es"; + const char* displayLocale = "de"; + UChar *displayKeywordValue = NULL; + int32_t displayKeywordValueLen = 0; + + /* fetch the displayKeywordValue */ + displayKeywordValueLen = uloc_getDisplayKeywordValue(localeID, "calendar", displayLocale, displayKeywordValue, displayKeywordValueLen, &status); + if(U_FAILURE(status)) { + log_err("uloc_getDisplaykeywordValue returned error status %s\n", u_errorName(status)); + } else if(displayKeywordValueLen != 0) { + log_err("uloc_getDisplaykeywordValue returned %d should be 0 \n", displayKeywordValueLen); } } - ures_close(fromDateTimeElements); - ures_close(toDateTimeElements); +} - fromArray = ures_getByKey(fromLocaleBund, "CurrencyElements", NULL, &errorCode); - toArray = ures_getByKey(toLocaleBund, "CurrencyElements", NULL, &errorCode); - if (strcmp(fromLocale, "en_CA") != 0) - { - /* The first one is probably localized. */ - compareArrays("CurrencyElements", fromArray, fromLocale, toArray, toLocale, 1, 2); - } - ures_close(fromArray); - ures_close(toArray); - fromArray = ures_getByKey(fromLocaleBund, "NumberPatterns", NULL, &errorCode); - toArray = ures_getByKey(toLocaleBund, "NumberPatterns", NULL, &errorCode); - if (strcmp(fromLocale, "en_CA") != 0) - { - compareArrays("NumberPatterns", fromArray, fromLocale, toArray, toLocale, 0, 3); - } - ures_close(fromArray); - ures_close(toArray); +static void TestGetBaseName(void) { + struct { + const char *localeID; + const char *baseName; + } testCases[] = { + { "de_DE@ C o ll A t i o n = Phonebook ", "de_DE" }, + { "de@currency = euro; CoLLaTion = PHONEBOOk", "de" }, + { "ja@calendar = buddhist", "ja" } + }; - /* Difficult to test properly */ -/* - fromArray = ures_getByKey(fromLocaleBund, "DateTimePatterns", NULL, &errorCode); - toArray = ures_getByKey(toLocaleBund, "DateTimePatterns", NULL, &errorCode); - { - compareArrays("DateTimePatterns", fromArray, fromLocale, toArray, toLocale); - } - ures_close(fromArray); - ures_close(toArray);*/ + int32_t i = 0, baseNameLen = 0; + char baseName[256]; + UErrorCode status = U_ZERO_ERROR; - fromArray = ures_getByKey(fromLocaleBund, "NumberElements", NULL, &errorCode); - toArray = ures_getByKey(toLocaleBund, "NumberElements", NULL, &errorCode); - if (strcmp(fromLocale, "en_CA") != 0) - { - compareArrays("NumberElements", fromArray, fromLocale, toArray, toLocale, 0, 3); - /* Index 4 is a script based 0 */ - compareArrays("NumberElements", fromArray, fromLocale, toArray, toLocale, 5, 10); + for(i = 0; i < sizeof(testCases)/sizeof(testCases[0]); i++) { + baseNameLen = uloc_getBaseName(testCases[i].localeID, baseName, 256, &status); + if(strcmp(testCases[i].baseName, baseName)) { + log_err("For locale \"%s\" expected baseName \"%s\", but got \"%s\"\n", + testCases[i].localeID, testCases[i].baseName, baseName); + return; + } } - ures_close(fromArray); - ures_close(toArray); - ures_close(fromLocaleBund); - ures_close(toLocaleBund); } -static void -TestConsistentCountryInfo(void) { -/* UResourceBundle *fromLocale, *toLocale;*/ - int32_t locCount = uloc_countAvailable(); - int32_t fromLocIndex, toLocIndex; - int32_t fromCountryLen, toCountryLen; - char fromCountry[ULOC_FULLNAME_CAPACITY], toCountry[ULOC_FULLNAME_CAPACITY]; - - int32_t fromVariantLen, toVariantLen; - char fromVariant[ULOC_FULLNAME_CAPACITY], toVariant[ULOC_FULLNAME_CAPACITY]; - - UErrorCode errorCode = U_ZERO_ERROR; +/* Jitterbug 4115 */ +static void TestDisplayNameWarning(void) { + UChar name[256]; + int32_t size; + UErrorCode status = U_ZERO_ERROR; + + size = uloc_getDisplayLanguage("qqq", "kl", name, sizeof(name)/sizeof(name[0]), &status); + if (status != U_USING_DEFAULT_WARNING) { + log_err("For language \"qqq\" in locale \"kl\", expecting U_USING_DEFAULT_WARNING, but got %s\n", + u_errorName(status)); + } +} - for (fromLocIndex = 0; fromLocIndex < locCount; fromLocIndex++) { - const char *fromLocale = uloc_getAvailable(fromLocIndex); - errorCode=U_ZERO_ERROR; - fromCountryLen = uloc_getCountry(fromLocale, fromCountry, ULOC_FULLNAME_CAPACITY, &errorCode); - if (fromCountryLen <= 0) { - /* Ignore countryless locales */ - continue; - } - fromVariantLen = uloc_getVariant(fromLocale, fromVariant, ULOC_FULLNAME_CAPACITY, &errorCode); - if (fromVariantLen > 0) { - /* Most variants are ignorable like PREEURO, or collation variants. */ - continue; - } - /* Start comparing only after the current index. - Previous loop should have already compared fromLocIndex. - */ - for (toLocIndex = fromLocIndex + 1; toLocIndex < locCount; toLocIndex++) { - const char *toLocale = uloc_getAvailable(toLocIndex); +/** + * Compare the ICU version against the given major/minor version. + */ +static int32_t _cmpversion(const char* version) { + UVersionInfo x, icu; + u_versionFromString(x, version); + u_getVersion(icu); + return memcmp(icu, x, U_MAX_VERSION_LENGTH); +} - toCountryLen = uloc_getCountry(toLocale, toCountry, ULOC_FULLNAME_CAPACITY, &errorCode); - if(U_FAILURE(errorCode)) { - log_err("Unknown failure fromLocale=%s toLocale=%s errorCode=%s\n", - fromLocale, toLocale, u_errorName(errorCode)); - continue; - } +/** + * Compare two locale IDs. If they are equal, return 0. If `string' + * starts with `prefix' plus an additional element, that is, string == + * prefix + '_' + x, then return 1. Otherwise return a value < 0. + */ +static UBool _loccmp(const char* string, const char* prefix) { + int32_t slen = uprv_strlen(string), + plen = uprv_strlen(prefix); + int32_t c = uprv_strncmp(string, prefix, plen); + /* 'root' is less than everything */ + if (uprv_strcmp(prefix, "root") == 0) { + return (uprv_strcmp(string, "root") == 0) ? 0 : 1; + } + if (c) return -1; /* mismatch */ + if (slen == plen) return 0; + if (string[plen] == '_') return 1; + return -2; /* false match, e.g. "en_USX" cmp "en_US" */ +} - if (toCountryLen <= 0) { - /* Ignore countryless locales */ - continue; - } - toVariantLen = uloc_getVariant(toLocale, toVariant, ULOC_FULLNAME_CAPACITY, &errorCode); - if (toVariantLen > 0) { - /* Most variants are ignorable like PREEURO, or collation variants. */ - /* They're a variant for a reason. */ - continue; - } - if (strcmp(fromCountry, toCountry) == 0) { - log_verbose("comparing fromLocale=%s toLocale=%s\n", - fromLocale, toLocale); - compareConsistentCountryInfo(fromLocale, toLocale); - } - } +static void _checklocs(const char* label, + const char* req, + const char* valid, + const char* actual) { + /* We want the valid to be strictly > the bogus requested locale, + and the valid to be >= the actual. */ + if (_loccmp(req, valid) > 0 && + _loccmp(valid, actual) >= 0) { + log_verbose("%s; req=%s, valid=%s, actual=%s\n", + label, req, valid, actual); + } else { + log_err("FAIL: %s; req=%s, valid=%s, actual=%s\n", + label, req, valid, actual); } } -static int32_t -findStringSetMismatch(const UChar *string, int32_t langSize, - const UChar *exemplarCharacters, int32_t exemplarLen, - UBool ignoreNumbers) { - UErrorCode errorCode = U_ZERO_ERROR; - USet *exemplarSet = uset_openPatternOptions(exemplarCharacters, exemplarLen, USET_CASE_INSENSITIVE, &errorCode); - int32_t strIdx; - if (U_FAILURE(errorCode)) { - log_err("error uset_openPattern returned %s\n", u_errorName(errorCode)); - return -1; - } +static void TestGetLocale(void) { + UErrorCode ec = U_ZERO_ERROR; + UParseError pe; + UChar EMPTY[1] = {0}; - for (strIdx = 0; strIdx < langSize; strIdx++) { - if (!uset_contains(exemplarSet, string[strIdx]) - && string[strIdx] != 0x0020 && string[strIdx] != 0x002e && string[strIdx] != 0x002c && string[strIdx] != 0x002d && string[strIdx] != 0x0027) { - if (!ignoreNumbers || (ignoreNumbers && (string[strIdx] < 0x30 || string[strIdx] > 0x39))) { - return strIdx; - } - } + /* === udat === */ +#if !UCONFIG_NO_FORMATTING + { + UDateFormat *obj; + const char *req = "en_US_REDWOODSHORES", *valid, *actual; + obj = udat_open(UDAT_DEFAULT, UDAT_DEFAULT, + req, + NULL, 0, + NULL, 0, &ec); + if (U_FAILURE(ec)) { + log_err("udat_open failed\n"); + return; + } + valid = udat_getLocaleByType(obj, ULOC_VALID_LOCALE, &ec); + actual = udat_getLocaleByType(obj, ULOC_ACTUAL_LOCALE, &ec); + if (U_FAILURE(ec)) { + log_err("udat_getLocaleByType() failed\n"); + return; + } + _checklocs("udat", req, valid, actual); + udat_close(obj); } - uset_close(exemplarSet); - return -1; -} +#endif -static void VerifyTranslation(void) { - UResourceBundle *root, *currentLocale; - int32_t locCount = uloc_countAvailable(); - int32_t locIndex; - UErrorCode errorCode = U_ZERO_ERROR; - int32_t exemplarLen; - const UChar *exemplarCharacters; - const char *currLoc; - UScriptCode scripts[USCRIPT_CODE_LIMIT]; - int32_t numScripts; - int32_t idx; - int32_t end; - UResourceBundle *resArray; - - if (locCount <= 1) { - log_data_err("At least root needs to be installed\n"); - } - - root = ures_openDirect(NULL, "root", &errorCode); - if(U_FAILURE(errorCode)) { - log_data_err("Can't open root\n"); - return; + /* === ucal === */ +#if !UCONFIG_NO_FORMATTING + { + UCalendar *obj; + const char *req = "fr_FR_PROVENCAL", *valid, *actual; + obj = ucal_open(NULL, 0, + req, + UCAL_GREGORIAN, + &ec); + if (U_FAILURE(ec)) { + log_err("ucal_open failed with error: %s\n", u_errorName(ec)); + return; + } + valid = ucal_getLocaleByType(obj, ULOC_VALID_LOCALE, &ec); + actual = ucal_getLocaleByType(obj, ULOC_ACTUAL_LOCALE, &ec); + if (U_FAILURE(ec)) { + log_err("ucal_getLocaleByType() failed\n"); + return; + } + _checklocs("ucal", req, valid, actual); + ucal_close(obj); } - for (locIndex = 0; locIndex < locCount; locIndex++) { - errorCode=U_ZERO_ERROR; - currLoc = uloc_getAvailable(locIndex); - currentLocale = ures_open(NULL, currLoc, &errorCode); - if(errorCode != U_ZERO_ERROR) { - if(U_SUCCESS(errorCode)) { - /* It's installed, but there is no data. - It's installed for the g18n white paper [grhoten] */ - log_err("ERROR: Locale %-5s not installed, and it should be!\n", - uloc_getAvailable(locIndex)); - } else { - log_err("%%%%%%% Unexpected error %d in %s %%%%%%%", - u_errorName(errorCode), - uloc_getAvailable(locIndex)); - } - ures_close(currentLocale); - continue; - } - exemplarCharacters = ures_getStringByKey(currentLocale, "ExemplarCharacters", &exemplarLen, &errorCode); - if (U_FAILURE(errorCode)) { - log_err("error ures_getStringByKey returned %s\n", u_errorName(errorCode)); - } - else if (QUICK && exemplarLen > 2048) { - log_verbose("skipping test for %s\n", currLoc); - } - else { - UChar langBuffer[128]; - int32_t langSize; - int32_t strIdx; - langSize = uloc_getDisplayLanguage(currLoc, currLoc, langBuffer, sizeof(langBuffer)/sizeof(langBuffer[0]), &errorCode); - if (U_FAILURE(errorCode)) { - log_err("error uloc_getDisplayLanguage returned %s\n", u_errorName(errorCode)); - } - else { - strIdx = findStringSetMismatch(langBuffer, langSize, exemplarCharacters, exemplarLen, FALSE); - if (strIdx >= 0) { - log_err("getDisplayLanguage(%s) at index %d returned characters not in the exemplar characters.\n", - currLoc, strIdx); - } - } - langSize = uloc_getDisplayCountry(currLoc, currLoc, langBuffer, sizeof(langBuffer)/sizeof(langBuffer[0]), &errorCode); - if (U_FAILURE(errorCode)) { - log_err("error uloc_getDisplayCountry returned %s\n", u_errorName(errorCode)); - } - else { - strIdx = findStringSetMismatch(langBuffer, langSize, exemplarCharacters, exemplarLen, FALSE); - if (strIdx >= 0) { - log_err("getDisplayCountry(%s) at index %d returned characters not in the exemplar characters.\n", - currLoc, strIdx); - } - } - - resArray = ures_getByKey(currentLocale, "DayNames", NULL, &errorCode); - if (U_FAILURE(errorCode)) { - log_err("error ures_getByKey returned %s\n", u_errorName(errorCode)); - } - if (QUICK) { - end = 1; - } - else { - end = ures_getSize(resArray); - } +#endif + /* === unum === */ +#if !UCONFIG_NO_FORMATTING + { + UNumberFormat *obj; + const char *req = "zh_Hant_TW_TAINAN", *valid, *actual; + obj = unum_open(UNUM_DECIMAL, + NULL, 0, + req, + &pe, &ec); + if (U_FAILURE(ec)) { + log_err("unum_open failed\n"); + return; + } + valid = unum_getLocaleByType(obj, ULOC_VALID_LOCALE, &ec); + actual = unum_getLocaleByType(obj, ULOC_ACTUAL_LOCALE, &ec); + if (U_FAILURE(ec)) { + log_err("unum_getLocaleByType() failed\n"); + return; + } + _checklocs("unum", req, valid, actual); + unum_close(obj); + } +#endif - for (idx = 0; idx < end; idx++) { - const UChar *fromBundleStr = ures_getStringByIndex(resArray, idx, &langSize, &errorCode); - if (U_FAILURE(errorCode)) { - log_err("error ures_getStringByIndex(%d) returned %s\n", idx, u_errorName(errorCode)); - continue; - } - strIdx = findStringSetMismatch(fromBundleStr, langSize, exemplarCharacters, exemplarLen, TRUE); - if (strIdx >= 0) { - log_err("getDayNames(%s, %d) at index %d returned characters not in the exemplar characters.\n", - currLoc, idx, strIdx); - } - } - ures_close(resArray); + /* === umsg === */ +#if !UCONFIG_NO_FORMATTING + { + UMessageFormat *obj; + const char *req = "ja_JP_TAKAYAMA", *valid, *actual; + UBool test; + obj = umsg_open(EMPTY, 0, + req, + &pe, &ec); + if (U_FAILURE(ec)) { + log_err("umsg_open failed\n"); + return; + } + valid = umsg_getLocaleByType(obj, ULOC_VALID_LOCALE, &ec); + actual = umsg_getLocaleByType(obj, ULOC_ACTUAL_LOCALE, &ec); + if (U_FAILURE(ec)) { + log_err("umsg_getLocaleByType() failed\n"); + return; + } + /* We want the valid to be strictly > the bogus requested locale, + and the valid to be >= the actual. */ + /* TODO MessageFormat is currently just storing the locale it is given. + As a result, it will return whatever it was given, even if the + locale is invalid. */ + test = (_cmpversion("3.2") <= 0) ? + /* Here is the weakened test for 3.0: */ + (_loccmp(req, valid) >= 0) : + /* Here is what the test line SHOULD be: */ + (_loccmp(req, valid) > 0); + + if (test && + _loccmp(valid, actual) >= 0) { + log_verbose("umsg; req=%s, valid=%s, actual=%s\n", req, valid, actual); + } else { + log_err("FAIL: umsg; req=%s, valid=%s, actual=%s\n", req, valid, actual); + } + umsg_close(obj); + } +#endif - resArray = ures_getByKey(currentLocale, "MonthNames", NULL, &errorCode); - if (U_FAILURE(errorCode)) { - log_err("error ures_getByKey returned %s\n", u_errorName(errorCode)); - } - if (QUICK) { - end = 1; - } - else { - end = ures_getSize(resArray); - } + /* === ubrk === */ +#if !UCONFIG_NO_BREAK_ITERATION + { + UBreakIterator *obj; + const char *req = "ar_KW_ABDALI", *valid, *actual; + obj = ubrk_open(UBRK_WORD, + req, + EMPTY, + 0, + &ec); + if (U_FAILURE(ec)) { + log_err("ubrk_open failed\n"); + return; + } + valid = ubrk_getLocaleByType(obj, ULOC_VALID_LOCALE, &ec); + actual = ubrk_getLocaleByType(obj, ULOC_ACTUAL_LOCALE, &ec); + if (U_FAILURE(ec)) { + log_err("ubrk_getLocaleByType() failed\n"); + return; + } + _checklocs("ubrk", req, valid, actual); + ubrk_close(obj); + } +#endif - for (idx = 0; idx < end; idx++) { - const UChar *fromBundleStr = ures_getStringByIndex(resArray, idx, &langSize, &errorCode); - if (U_FAILURE(errorCode)) { - log_err("error ures_getStringByIndex(%d) returned %s\n", idx, u_errorName(errorCode)); - continue; - } - strIdx = findStringSetMismatch(fromBundleStr, langSize, exemplarCharacters, exemplarLen, TRUE); - if (strIdx >= 0) { - log_err("getMonthNames(%s, %d) at index %d returned characters not in the exemplar characters.\n", - currLoc, idx, strIdx); - } - } - ures_close(resArray); + /* === ucol === */ +#if !UCONFIG_NO_COLLATION + { + UCollator *obj; + const char *req = "es_AR_BUENOSAIRES", *valid, *actual; + obj = ucol_open(req, &ec); + if (U_FAILURE(ec)) { + log_err("ucol_open failed\n"); + return; + } + valid = ucol_getLocaleByType(obj, ULOC_VALID_LOCALE, &ec); + actual = ucol_getLocaleByType(obj, ULOC_ACTUAL_LOCALE, &ec); + if (U_FAILURE(ec)) { + log_err("ucol_getLocaleByType() failed\n"); + return; + } + _checklocs("ucol", req, valid, actual); + ucol_close(obj); + } +#endif +} - errorCode = U_ZERO_ERROR; - numScripts = uscript_getCode(currLoc, scripts, sizeof(scripts)/sizeof(scripts[0]), &errorCode); - if (numScripts == 0) { - log_err("uscript_getCode(%s) doesn't work.\n", currLoc); - } - /* TODO: test that the scripts are a superset of exemplar characters. */ - } - ures_close(currentLocale); +static void TestNonexistentLanguageExemplars(void) { + /* JB 4068 - Nonexistent language */ + UErrorCode ec = U_ZERO_ERROR; + USet *nothing = ulocdata_getExemplarSet(NULL, "qqq", 0, &ec); + uset_close(nothing); + if (ec != U_USING_DEFAULT_WARNING) { + log_err("Exemplar set for \"qqq\", expecting U_USING_DEFAULT_WARNING, but got %s\n", + u_errorName(ec)); } +} - ures_close(root); +static void TestAcceptLanguage(void) { + UErrorCode status = U_ZERO_ERROR; + UAcceptResult outResult; + UEnumeration *available; + char tmp[200]; + int i; + int32_t rc = 0; + + struct { + int32_t httpSet; + const char *icuSet; + const char *expect; + UAcceptResult res; + } tests[] = { + /*0*/{ 0, NULL, "mt_MT", ULOC_ACCEPT_VALID }, + /*1*/{ 1, NULL, "en", ULOC_ACCEPT_VALID }, + /*2*/{ 2, NULL, "en", ULOC_ACCEPT_FALLBACK }, + /*3*/{ 3, NULL, "", ULOC_ACCEPT_FAILED }, + /*4*/{ 4, NULL, "es", ULOC_ACCEPT_VALID }, + }; + const int32_t numTests = sizeof(tests)/sizeof(tests[0]); + const char *http[] = { /*0*/ "mt-mt, ja;q=0.76, en-us;q=0.95, en;q=0.92, en-gb;q=0.89, fr;q=0.87, iu-ca;q=0.84, iu;q=0.82, ja-jp;q=0.79, mt;q=0.97, de-de;q=0.74, de;q=0.71, es;q=0.68, it-it;q=0.66, it;q=0.63, vi-vn;q=0.61, vi;q=0.58, nl-nl;q=0.55, nl;q=0.53, th-th-traditional;q=.01", + /*1*/ "ja;q=0.5, en;q=0.8, tlh", + /*2*/ "en-wf, de-lx;q=0.8", + /*3*/ "mga-ie;q=0.9, tlh", + /*4*/ "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, " + "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, " + "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, " + "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, " + "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, " + "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, " + "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, " + "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, " + "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, " + "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, " + "es" + }; + + for(i=0;i0)&&uprv_strcmp(tmp, tests[i].expect)) { + log_err("FAIL: #%d: expected %s but got %s\n", i, tests[i].expect, tmp); + log_info("test #%d: http[%s], ICU[%s], expect %s, %d\n", + i, http[tests[i].httpSet], tests[i].icuSet, tests[i].expect, tests[i].res); + } + } } diff --git a/icuSources/test/cintltst/cloctst.h b/icuSources/test/cintltst/cloctst.h index 2bae03b9..b4191198 100644 --- a/icuSources/test/cintltst/cloctst.h +++ b/icuSources/test/cintltst/cloctst.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** @@ -61,22 +61,42 @@ static void TestDisplayNames(void); **/ static void TestVariantParsing(void); - /* Make sure that the locale data is good. */ - static void TestLocaleStructure(void); + /* Make sure we can pass "de_DE@Collation=PHONEBOOK" */ + static void MoreVariants(void); + + /* Test getting keyword enumeratin */ + static void TestKeywordVariants(void); - /* Make sure that Country information is the same across locales, within reason. */ - static void TestConsistentCountryInfo(void); + static void TestKeywordSet(void); + static void TestKeywordSetError(void); + + /* Test getting keyword values */ + static void TestKeywordVariantParsing(void); + + /* Test warning for no data in getDisplay* */ + static void TestDisplayNameWarning(void); /** * routine to perform subtests, used by TestDisplayNames */ static void doTestDisplayNames(const char* inLocale, int32_t compareIndex); + static void TestCanonicalization(void); + + static void TestDisplayKeywords(void); + + static void TestDisplayKeywordValues(void); + + static void TestGetBaseName(void); + +static void TestGetLocale(void); + /** * additional intialization for datatables storing expected values */ static void setUpDataTable(void); static void cleanUpDataTable(void); -void displayDataTable(void); +/*static void displayDataTable(void);*/ +static void TestAcceptLanguage(void); #endif diff --git a/icuSources/test/cintltst/cmsccoll.c b/icuSources/test/cintltst/cmsccoll.c index 46bc9391..28d3fb62 100644 --- a/icuSources/test/cintltst/cmsccoll.c +++ b/icuSources/test/cintltst/cmsccoll.c @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 2001-2003, International Business Machines Corporation and + * Copyright (c) 2001-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************* @@ -31,125 +31,20 @@ #include "ucol_tok.h" #include "cmemory.h" #include "cstring.h" +#include "uassert.h" #include "unicode/parseerr.h" #include "unicode/ucnv.h" #include "uparse.h" -#define MAX_TOKEN_LEN 16 -#define RULE_BUFFER_LEN 8192 +#define LEN(a) (sizeof(a)/sizeof(a[0])) -void genericLocaleStarter(const char *locale, const char *s[], uint32_t size); /* keep gcc happy */ +#define MAX_TOKEN_LEN 16 typedef int tst_strcoll(void *collator, const int object, const UChar *source, const int sLen, const UChar *target, const int tLen); -/** - * Return an integer array containing all of the collation orders - * returned by calls to next on the specified iterator - */ -static int32_t* getOrders(UCollationElements *iter, int32_t *orderLength) -{ - UErrorCode status; - int32_t order; - int32_t maxSize = 100; - int32_t size = 0; - int32_t *temp; - int32_t *orders =(int32_t*)malloc(sizeof(int32_t) * maxSize); - status= U_ZERO_ERROR; - - - while ((order=ucol_next(iter, &status)) != UCOL_NULLORDER) - { - if (size == maxSize) - { - maxSize *= 2; - temp = (int32_t*)malloc(sizeof(int32_t) * maxSize); - - memcpy(temp, orders, size * sizeof(int32_t)); - free(orders); - orders = temp; - - } - - orders[size++] = order; - } - - if (maxSize > size && size > 0) - { - temp = (int32_t*)malloc(sizeof(int32_t) * size); - - memcpy(temp, orders, size * sizeof(int32_t)); - free(orders); - orders = temp; - - - } - - *orderLength = size; - return orders; -} - -static void backAndForth(UCollationElements *iter) -{ - /* Run through the iterator forwards and stick it into an array */ - int32_t index, o; - UErrorCode status = U_ZERO_ERROR; - int32_t orderLength = 0; - int32_t *orders; - orders= getOrders(iter, &orderLength); - - - /* Now go through it backwards and make sure we get the same values */ - index = orderLength; - ucol_reset(iter); - - /* synwee : changed */ - while ((o = ucol_previous(iter, &status)) != UCOL_NULLORDER) - { - if (o != orders[-- index]) - { - if (o == 0) - index ++; - else - { - while (index > 0 && orders[-- index] == 0) - { - } - if (o != orders[index]) - { - log_err("Mismatch at index : %d\n", index); - break; - } - } - } - } - - while (index != 0 && orders[index - 1] == 0) { - index --; - } - - if (index != 0) - { - log_err("Didn't get back to beginning - index is %d\n", index); - - ucol_reset(iter); - log_err("\nnext: "); - while ((o = ucol_next(iter, &status)) != UCOL_NULLORDER) - { - log_err("Error at %d\n", o); - } - log_err("\nprev: "); - while ((o = ucol_previous(iter, &status)) != UCOL_NULLORDER) - { - log_err("Error at %d\n", o); - } - log_verbose("\n"); - } - - free(orders); -} const static char cnt1[][10] = { @@ -496,7 +391,7 @@ static void BillFairmanTest(void) { lr = ures_open(NULL,lp,&lec); if (lr) { - cr = ures_getByKey(lr,"CollationElements",0,&lec); + cr = ures_getByKey(lr,"collations",0,&lec); if (cr) { lp = ures_getLocale(cr,&lec); if (lp) { @@ -642,6 +537,7 @@ static void testCollator(UCollator *coll, UErrorCode *status) { UBool startOfRules = TRUE; UBool lastReset = FALSE; UBool before = FALSE; + uint32_t beforeStrength = 0; UColTokenParser src; UColOptionSet opts; @@ -676,38 +572,41 @@ static void testCollator(UCollator *coll, UErrorCode *status) { startOfRules = FALSE; varT = (UBool)((specs & UCOL_TOK_VARIABLE_TOP) != 0); top_ = (UBool)((specs & UCOL_TOK_TOP) != 0); - if(top_) { /* if reset is on top, we should just continue */ - continue; - } - u_strncpy(second,rulesCopy+chOffset, chLen); - second[chLen] = 0; + if(top_) { /* if reset is on top, the sequence is broken. We should have an empty string */ + second[0] = 0; + } else { + u_strncpy(second,rulesCopy+chOffset, chLen); + second[chLen] = 0; - if(exLen > 0 && firstEx == 0) { - u_strncat(first, rulesCopy+exOffset, exLen); - first[firstLen+exLen] = 0; - } + if(exLen > 0 && firstEx == 0) { + u_strncat(first, rulesCopy+exOffset, exLen); + first[firstLen+exLen] = 0; + } - if(lastReset == TRUE && prefixLen != 0) { - u_strncpy(first+prefixLen, first, firstLen); - u_strncpy(first, rulesCopy+prefixOffset, prefixLen); - first[firstLen+prefixLen] = 0; - firstLen = firstLen+prefixLen; - } + if(lastReset == TRUE && prefixLen != 0) { + u_strncpy(first+prefixLen, first, firstLen); + u_strncpy(first, rulesCopy+prefixOffset, prefixLen); + first[firstLen+prefixLen] = 0; + firstLen = firstLen+prefixLen; + } - if(before == TRUE) { /* swap first and second */ - u_strcpy(tempB, first); - u_strcpy(first, second); - u_strcpy(second, tempB); + if(before == TRUE) { /* swap first and second */ + u_strcpy(tempB, first); + u_strcpy(first, second); + u_strcpy(second, tempB); - tempLen = firstLen; - firstLen = chLen; - chLen = tempLen; + tempLen = firstLen; + firstLen = chLen; + chLen = tempLen; - tempLen = firstEx; - firstEx = exLen; - exLen = tempLen; + tempLen = firstEx; + firstEx = exLen; + exLen = tempLen; + if(beforeStrength < strength) { + strength = beforeStrength; + } + } } - lastReset = FALSE; switch(strength){ @@ -726,13 +625,16 @@ static void testCollator(UCollator *coll, UErrorCode *status) { case UCOL_TOK_RESET: lastReset = TRUE; before = (UBool)((specs & UCOL_TOK_BEFORE) != 0); + if(before) { + beforeStrength = (specs & UCOL_TOK_BEFORE)-1; + } break; default: break; } if(before == TRUE && strength != UCOL_TOK_RESET) { /* first and second were swapped */ - before = FALSE; + before = FALSE; } else { firstLen = chLen; firstEx = exLen; @@ -857,11 +759,15 @@ static void logFailure (const char *platform, const char *test, uint32_t i = 0; - char sEsc[256], s[256], tEsc[256], t[256], b[256], output[256], relation[256]; + char sEsc[256], s[256], tEsc[256], t[256], b[256], output[512], relation[256]; + static int maxOutputLength = 0; + int outputLength; *sEsc = *tEsc = *s = *t = 0; if(error == TRUE) { log_err("Difference between expected and generated order. Run test with -v for more info\n"); + } else if(VERBOSITY == 0) { + return; } for(i = 0; i maxOutputLength) { + maxOutputLength = outputLength; + U_ASSERT(outputLength < sizeof(output)); + } + log_verbose("%s\n", output); } @@ -1077,8 +989,8 @@ static void testAgainstUCA(UCollator *coll, UCollator *UCA, const char *refName, } } -/* - * Takes two CEs (lead and continuation) and +/* + * Takes two CEs (lead and continuation) and * compares them as CEs should be compared: * primary vs. primary, secondary vs. secondary * tertiary vs. tertiary @@ -1089,8 +1001,8 @@ static int32_t compareCEs(uint32_t s1, uint32_t s2, if(s1 == t1 && s2 == t2) { return 0; } - s = (s1 & 0xFFFF0000)|((s2 & 0xFFFF0000)>>16); - t = (t1 & 0xFFFF0000)|((t2 & 0xFFFF0000)>>16); + s = (s1 & 0xFFFF0000)|((s2 & 0xFFFF0000)>>16); + t = (t1 & 0xFFFF0000)|((t2 & 0xFFFF0000)>>16); if(s < t) { return -1; } else if(s > t) { @@ -1114,6 +1026,44 @@ static int32_t compareCEs(uint32_t s1, uint32_t s2, } } +typedef struct { + uint32_t startCE; + uint32_t startContCE; + uint32_t limitCE; + uint32_t limitContCE; +} indirectBoundaries; + +/* these values are used for finding CE values for indirect positioning. */ +/* Indirect positioning is a mechanism for allowing resets on symbolic */ +/* values. It only works for resets and you cannot tailor indirect names */ +/* An indirect name can define either an anchor point or a range. An */ +/* anchor point behaves in exactly the same way as a code point in reset */ +/* would, except that it cannot be tailored. A range (we currently only */ +/* know for the [top] range will explicitly set the upper bound for */ +/* generated CEs, thus allowing for better control over how many CEs can */ +/* be squeezed between in the range without performance penalty. */ +/* In that respect, we use [top] for tailoring of locales that use CJK */ +/* characters. Other indirect values are currently a pure convenience, */ +/* they can be used to assure that the CEs will be always positioned in */ +/* the same place relative to a point with known properties (e.g. first */ +/* primary ignorable). */ +static indirectBoundaries ucolIndirectBoundaries[15]; +static UBool indirectBoundariesSet = FALSE; +static void setIndirectBoundaries(uint32_t indexR, uint32_t *start, uint32_t *end) { + + /* Set values for the top - TODO: once we have values for all the indirects, we are going */ + /* to initalize here. */ + ucolIndirectBoundaries[indexR].startCE = start[0]; + ucolIndirectBoundaries[indexR].startContCE = start[1]; + if(end) { + ucolIndirectBoundaries[indexR].limitCE = end[0]; + ucolIndirectBoundaries[indexR].limitContCE = end[1]; + } else { + ucolIndirectBoundaries[indexR].limitCE = 0; + ucolIndirectBoundaries[indexR].limitContCE = 0; + } +} + static void testCEs(UCollator *coll, UErrorCode *status) { const UChar *rules = NULL, *current = NULL; @@ -1136,6 +1086,7 @@ static void testCEs(UCollator *coll, UErrorCode *status) { uint16_t specs = 0; UBool varT = FALSE; UBool top_ = TRUE; UBool startOfRules = TRUE; + UBool before = FALSE; UColTokenParser src; UColOptionSet opts; UParseError parseError; @@ -1143,16 +1094,52 @@ static void testCEs(UCollator *coll, UErrorCode *status) { collIterate c; UCollator *UCA = ucol_open("root", status); UCAConstants *consts = (UCAConstants *)((uint8_t *)UCA->image + UCA->image->UCAConsts); - uint32_t UCOL_RESET_TOP_VALUE = consts->UCA_LAST_NON_VARIABLE[0], UCOL_RESET_TOP_CONT = consts->UCA_LAST_NON_VARIABLE[1], + uint32_t UCOL_RESET_TOP_VALUE = consts->UCA_LAST_NON_VARIABLE[0], /*UCOL_RESET_TOP_CONT = consts->UCA_LAST_NON_VARIABLE[1], */ UCOL_NEXT_TOP_VALUE = consts->UCA_FIRST_IMPLICIT[0], UCOL_NEXT_TOP_CONT = consts->UCA_FIRST_IMPLICIT[1]; - + baseCE=baseContCE=nextCE=nextContCE=currCE=currContCE=lastCE=lastContCE = UCOL_NOT_FOUND; src.opts = &opts; rules = ucol_getRules(coll, &ruleLen); - ucol_initInverseUCA(status); + src.invUCA = ucol_initInverseUCA(status); + + if(indirectBoundariesSet == FALSE) { + /* UCOL_RESET_TOP_VALUE */ + setIndirectBoundaries(0, consts->UCA_LAST_NON_VARIABLE, consts->UCA_FIRST_IMPLICIT); + /* UCOL_FIRST_PRIMARY_IGNORABLE */ + setIndirectBoundaries(1, consts->UCA_FIRST_PRIMARY_IGNORABLE, 0); + /* UCOL_LAST_PRIMARY_IGNORABLE */ + setIndirectBoundaries(2, consts->UCA_LAST_PRIMARY_IGNORABLE, 0); + /* UCOL_FIRST_SECONDARY_IGNORABLE */ + setIndirectBoundaries(3, consts->UCA_FIRST_SECONDARY_IGNORABLE, 0); + /* UCOL_LAST_SECONDARY_IGNORABLE */ + setIndirectBoundaries(4, consts->UCA_LAST_SECONDARY_IGNORABLE, 0); + /* UCOL_FIRST_TERTIARY_IGNORABLE */ + setIndirectBoundaries(5, consts->UCA_FIRST_TERTIARY_IGNORABLE, 0); + /* UCOL_LAST_TERTIARY_IGNORABLE */ + setIndirectBoundaries(6, consts->UCA_LAST_TERTIARY_IGNORABLE, 0); + /* UCOL_FIRST_VARIABLE */ + setIndirectBoundaries(7, consts->UCA_FIRST_VARIABLE, 0); + /* UCOL_LAST_VARIABLE */ + setIndirectBoundaries(8, consts->UCA_LAST_VARIABLE, 0); + /* UCOL_FIRST_NON_VARIABLE */ + setIndirectBoundaries(9, consts->UCA_FIRST_NON_VARIABLE, 0); + /* UCOL_LAST_NON_VARIABLE */ + setIndirectBoundaries(10, consts->UCA_LAST_NON_VARIABLE, consts->UCA_FIRST_IMPLICIT); + /* UCOL_FIRST_IMPLICIT */ + setIndirectBoundaries(11, consts->UCA_FIRST_IMPLICIT, 0); + /* UCOL_LAST_IMPLICIT */ + setIndirectBoundaries(12, consts->UCA_LAST_IMPLICIT, consts->UCA_FIRST_TRAILING); + /* UCOL_FIRST_TRAILING */ + setIndirectBoundaries(13, consts->UCA_FIRST_TRAILING, 0); + /* UCOL_LAST_TRAILING */ + setIndirectBoundaries(14, consts->UCA_LAST_TRAILING, 0); + ucolIndirectBoundaries[14].limitCE = (consts->UCA_PRIMARY_SPECIAL_MIN<<24); + indirectBoundariesSet = TRUE; + } + if(U_SUCCESS(*status) && ruleLen > 0) { rulesCopy = (UChar *)malloc((ruleLen+UCOL_TOK_EXTRA_RULE_SPACE_SIZE)*sizeof(UChar)); @@ -1192,10 +1179,12 @@ static void testCEs(UCollator *coll, UErrorCode *status) { /* we need to repack CEs here */ if(strength == UCOL_TOK_RESET) { + before = (UBool)((specs & UCOL_TOK_BEFORE) != 0); if(top_ == TRUE) { - - nextCE = baseCE = currCE = UCOL_RESET_TOP_VALUE; - nextContCE = baseContCE = currContCE = UCOL_RESET_TOP_CONT; + int32_t index = src.parsedToken.indirectIndex; + + nextCE = baseCE = currCE = ucolIndirectBoundaries[index].startCE; + nextContCE = baseContCE = currContCE = ucolIndirectBoundaries[index].startContCE; } else { nextCE = baseCE = currCE; nextContCE = baseContCE = currContCE; @@ -1209,7 +1198,7 @@ static void testCEs(UCollator *coll, UErrorCode *status) { nextCE = UCOL_NEXT_TOP_VALUE; nextContCE = UCOL_NEXT_TOP_CONT; } else { - result = ucol_inv_getNextCE(baseCE & 0xFFFFFF3F, baseContCE, &nextCE, &nextContCE, maxStrength); + result = ucol_inv_getNextCE(&src, baseCE & 0xFFFFFF3F, baseContCE, &nextCE, &nextContCE, maxStrength); } if(result < 0) { if(ucol_isTailored(coll, *(rulesCopy+oldOffset), status)) { @@ -1239,9 +1228,17 @@ static void testCEs(UCollator *coll, UErrorCode *status) { /*if(currCE > nextCE || (currCE == nextCE && currContCE >= nextContCE)) {*/ log_err("current CE is not less than base CE\n"); } - if(compareCEs(currCE, currContCE, lastCE, lastContCE) < 0) { - /*if(currCE < lastCE || (currCE == lastCE && currContCE <= lastContCE)) {*/ - log_err("sequence of generated CEs is broken\n"); + if(!before) { + if(compareCEs(currCE, currContCE, lastCE, lastContCE) < 0) { + /*if(currCE < lastCE || (currCE == lastCE && currContCE <= lastContCE)) {*/ + log_err("sequence of generated CEs is broken\n"); + } + } else { + before = FALSE; + if(compareCEs(currCE, currContCE, lastCE, lastContCE) > 0) { + /*if(currCE < lastCE || (currCE == lastCE && currContCE <= lastContCE)) {*/ + log_err("sequence of generated CEs is broken\n"); + } } } } @@ -1286,27 +1283,6 @@ static const char* rulesToTest[] = { "&[top]<'?';Qum<3<4<5NFC, NORM_BUFFER_TEST_LEN, &status); nfdSize = unorm_normalize(comp, len, UNORM_NFD, 0, t[noCases]->NFD, NORM_BUFFER_TEST_LEN, &status); - if(nfcSize != nfdSize || (uprv_memcmp(t[noCases]->NFC, t[noCases]->NFD, nfcSize * sizeof(UChar)) != 0) + if(nfcSize != nfdSize || (uprv_memcmp(t[noCases]->NFC, t[noCases]->NFD, nfcSize * sizeof(UChar)) != 0) || (len != nfdSize || (uprv_memcmp(comp, t[noCases]->NFD, nfdSize * sizeof(UChar)) != 0))) { t[noCases]->u = u; if(len != nfdSize || (uprv_memcmp(comp, t[noCases]->NFD, nfdSize * sizeof(UChar)) != 0)) { @@ -1715,7 +1601,7 @@ static void TestComposeDecompose(void) { noCases++; t[noCases] = (tester *)malloc(sizeof(tester)); uprv_memset(t[noCases], 0, sizeof(tester)); - } + } } for(u=0; u<(UChar32)noCases; u++) { @@ -1760,13 +1646,21 @@ static void TestComposeDecompose(void) { coll = ucol_open(locName, &status); ucol_setStrength(coll, UCOL_IDENTICAL); + iter = ucol_openElements(coll, t[u]->NFD, u_strlen(t[u]->NFD), &status); for(u=0; u<(UChar32)noCases; u++) { if(!ucol_equal(coll, t[u]->NFC, -1, t[u]->NFD, -1)) { log_err("Failure: codePoint %05X fails TestComposeDecompose for locale %s\n", t[u]->u, cName); doTest(coll, t[u]->NFC, t[u]->NFD, UCOL_EQUAL); + log_verbose("Testing NFC\n"); + ucol_setText(iter, t[u]->NFC, u_strlen(t[u]->NFC), &status); + backAndForth(iter); + log_verbose("Testing NFD\n"); + ucol_setText(iter, t[u]->NFD, u_strlen(t[u]->NFD), &status); + backAndForth(iter); } } + ucol_closeElements(iter); ucol_close(coll); } } @@ -1865,6 +1759,8 @@ static void TestBefore(void) { data, sizeof(data)/sizeof(data[0])); } +#if 0 +/* superceded by TestBeforePinyin */ static void TestJ784(void) { const static char *data[] = { "A", "\\u0101", "\\u00e1", "\\u01ce", "\\u00e0", @@ -1877,8 +1773,10 @@ static void TestJ784(void) { }; genericLocaleStarter("zh", data, sizeof(data)/sizeof(data[0])); } +#endif - +#if 0 +/* superceded by the changes to the lv locale */ static void TestJ831(void) { const static char *data[] = { "I", @@ -1888,6 +1786,7 @@ static void TestJ831(void) { }; genericLocaleStarter("lv", data, sizeof(data)/sizeof(data[0])); } +#endif static void TestJ815(void) { const static char *data[] = { @@ -1925,87 +1824,103 @@ static void TestJ815(void) { static void TestRedundantRules(void) { int32_t i; - const static char *rules[] = { - "& a <<< b <<< c << d <<< e& [before 1] e <<< x", - "& a < b <<< c << d <<< e& [before 1] e <<< x", - "& a < b < c < d& [before 1] c < m", - "& a < b <<< c << d <<< e& [before 3] e <<< x", - "& a < b <<< c << d <<< e& [before 2] e <<< x", - "& a < b <<< c << d <<< e <<< f < g& [before 1] g < x", - "& a <<< b << c < d& a < m", - "&a 0*/ + if(1) { /* QUICK > 0*/ log_verbose("Slide variable top over UCARules\n"); rulesLen = ucol_getRulesEx(coll, UCOL_FULL_RULES, rulesCopy, 0); rulesCopy = (UChar *)malloc((rulesLen+UCOL_TOK_EXTRA_RULE_SPACE_SIZE)*sizeof(UChar)); @@ -3114,7 +2915,7 @@ static void TestVariableTopSetting(void) { src.current = src.source = rulesCopy; src.end = rulesCopy+rulesLen; src.extraCurrent = src.end; - src.extraEnd = src.end+UCOL_TOK_EXTRA_RULE_SPACE_SIZE; + src.extraEnd = src.end+UCOL_TOK_EXTRA_RULE_SPACE_SIZE; while ((current = ucol_tok_parseNextToken(&src, startOfRules, &parseError,&status)) != NULL) { strength = src.parsedToken.strength; @@ -3154,10 +2955,10 @@ static void TestVariableTopSetting(void) { log_verbose("= Expected failure for %s =", buffer); } else { if(s.pos == s.endp) { - log_err("Unexpected failure setting variable top at offset %d. Error %s. Codepoints: %s\n", + log_err("Unexpected failure setting variable top at offset %d. Error %s. Codepoints: %s\n", oldChOffset, u_errorName(status), buffer); } else { - log_verbose("There is a goofy contraction in UCA rules that does not appear in the fractional UCA. Codepoints: %s\n", + log_verbose("There is a goofy contraction in UCA rules that does not appear in the fractional UCA. Codepoints: %s\n", buffer); } } @@ -3392,15 +3193,15 @@ static void TestPrefix(void) { const char *rules; const char *data[50]; const uint32_t len; - } tests[] = { - { "&z <<< z|a", + } tests[] = { + { "&z <<< z|a", {"zz", "za"}, 2 }, - { "&z <<< z| a", + { "&z <<< z| a", {"zz", "za"}, 2 }, { "[strength I]" "&a=\\ud900\\udc25" - "&z<<<\\ud900\\udc25|a", + "&z<<<\\ud900\\udc25|a", {"aa", "az", "\\ud900\\udc25z", "\\ud900\\udc25a", "zz"}, 4 }, }; @@ -3426,7 +3227,7 @@ static void TestNewJapanese(void) { "\\u30c6\\u30fc\\u30bf", "\\u30c6\\u30a7\\u30bf", "\\u3066\\u3048\\u305f", - "\\u3067\\u30fc\\u305f", + "\\u3067\\u30fc\\u305f", "\\u30c7\\u30fc\\u30bf", "\\u30c7\\u30a7\\u30bf", "\\u3067\\u3048\\u305f", @@ -3450,7 +3251,7 @@ static void TestNewJapanese(void) { "\\u30d2\\u30e5\\u30a6", "\\u30d2\\u30e6\\u30a6", "\\u30d4\\u30e5\\u30a6\\u30a2", - "\\u3073\\u3085\\u30fc\\u3042\\u30fc", + "\\u3073\\u3085\\u30fc\\u3042\\u30fc", "\\u30d3\\u30e5\\u30fc\\u30a2\\u30fc", "\\u30d3\\u30e5\\u30a6\\u30a2\\u30fc", "\\u3072\\u3085\\u3093", @@ -3587,7 +3388,7 @@ static void TestContractionClosure(void) { const char *rules; const char *data[50]; const uint32_t len; - } tests[] = { + } tests[] = { { "&b=\\u00e4\\u00e4", { "b", "\\u00e4\\u00e4", "a\\u0308a\\u0308", "\\u00e4a\\u0308", "a\\u0308\\u00e4" }, 5}, { "&b=\\u00C5", @@ -3607,13 +3408,13 @@ static void TestBeforePrefixFailure(void) { const char *rules; const char *data[50]; const uint32_t len; - } tests[] = { + } tests[] = { { "&g <<< a" "&[before 3]\\uff41 <<< x", {"x", "\\uff41"}, 2 }, { "&\\u30A7=\\u30A7=\\u3047=\\uff6a" "&\\u30A8=\\u30A8=\\u3048=\\uff74" - "&[before 3]\\u30a7<<<\\u30a9", + "&[before 3]\\u30a7<<<\\u30a9", {"\\u30a9", "\\u30a7"}, 2 }, { "&[before 3]\\u30a7<<<\\u30a9" "&\\u30A7=\\u30A7=\\u3047=\\uff6a" @@ -3628,16 +3429,16 @@ static void TestBeforePrefixFailure(void) { } #if 0 - const char* rule1 = + const char* rule1 = "&\\u30A7=\\u30A7=\\u3047=\\uff6a" "&\\u30A8=\\u30A8=\\u3048=\\uff74" "&[before 3]\\u30a7<<<\\u30c6|\\u30fc"; - const char* rule2 = + const char* rule2 = "&[before 3]\\u30a7<<<\\u30c6|\\u30fc" "&\\u30A7=\\u30A7=\\u3047=\\uff6a" "&\\u30A8=\\u30A8=\\u3048=\\uff74"; const char* test[] = { - "\\u30c6\\u30fc\\u30bf", + "\\u30c6\\u30fc\\u30bf", "\\u30c6\\u30a7\\u30bf", }; genericRulesStarter(rule1, test, sizeof(test)/sizeof(test[0])); @@ -3645,7 +3446,7 @@ static void TestBeforePrefixFailure(void) { /* this piece of code should be in some sort of verbose mode */ /* it gets the collation elements for elements and prints them */ /* This is useful when trying to see whether the problem is */ - { + { UErrorCode status = U_ZERO_ERROR; uint32_t i = 0; UCollationElements *it = NULL; @@ -3680,15 +3481,15 @@ static void TestBeforePrefixFailure(void) { } static void TestPrefixCompose(void) { - const char* rule1 = + const char* rule1 = "&\\u30a7<<<\\u30ab|\\u30fc=\\u30ac|\\u30fc"; /* const char* test[] = { - "\\u30c6\\u30fc\\u30bf", + "\\u30c6\\u30fc\\u30bf", "\\u30c6\\u30a7\\u30bf", }; */ - { + { UErrorCode status = U_ZERO_ERROR; /*uint32_t i = 0;*/ /*UCollationElements *it = NULL;*/ @@ -3707,75 +3508,88 @@ static void TestPrefixCompose(void) { } /* -[last variable] last variable value -[last primary ignorable] largest CE for primary ignorable -[last secondary ignorable] largest CE for secondary ignorable -[last tertiary ignorable] largest CE for tertiary ignorable -[top] guaranteed to be above all implicit CEs, for now and in the future (in 1.8) +[last variable] last variable value +[last primary ignorable] largest CE for primary ignorable +[last secondary ignorable] largest CE for secondary ignorable +[last tertiary ignorable] largest CE for tertiary ignorable +[top] guaranteed to be above all implicit CEs, for now and in the future (in 1.8) */ static void TestRuleOptions(void) { - /* values here are hardcoded and are correct for the current UCA - * when the UCA changes, one might be forced to change these + /* values here are hardcoded and are correct for the current UCA + * when the UCA changes, one might be forced to change these * values. (\\u02d0, \\U00010FFFC etc...) */ static struct { const char *rules; const char *data[50]; const uint32_t len; - } tests[] = { + } tests[] = { /* - all befores here amount to zero */ - { "&[before 1][first tertiary ignorable]<< s2 -weiv will check - could be a problem with utf-8 iterator -cycheng@ca.ibm.c... but if we use the utf-8 iterator, i.e. s1 = efbfbc62 and s2 = eda08021, we have s1 < s2 -weiv hmmm -cycheng@ca.ibm.c... note that we have a standalone high surrogate -weiv that doesn't sound right -cycheng@ca.ibm.c... we got the same inconsistent results on AIX and Win2000 -weiv so you have two strings, you convert them to utf-8 and to utf-16BE -cycheng@ca.ibm.c... yes -weiv and then do the comparison -cycheng@ca.ibm.c... in one case, the input strings are in utf8, and in the other case the input strings are in utf-16be -weiv utf-16 strings look like a little endian ones in the example you sent me -weiv It could be a bug - let me try to test it out -cycheng@ca.ibm.c... ok -cycheng@ca.ibm.c... we can wait till the conf. call -cycheng@ca.ibm.c... next weke -weiv that would be great -weiv hmmm -weiv I might be wrong -weiv let me play with it some more -cycheng@ca.ibm.c... ok -cycheng@ca.ibm.c... also please check s3 = 0x0e3a0062 and s4 = 0x0e400021. both are in utf-16be -cycheng@ca.ibm.c... seems with icu 2.2 we have s3 > s4, but not in icu 2.4 that's built for db2 -cycheng@ca.ibm.c... also s1 & s2 that I sent you earlier are also in utf-16be -weiv ok -cycheng@ca.ibm.c... i ask sherman to send you more inconsistent data -weiv thanks -cycheng@ca.ibm.c... the 4 strings we sent are just samples +cycheng@ca.ibm.c... we got inconsistent results when using the UTF-16BE iterator and the UTF-8 iterator. +weiv ucol_strcollIter? +cycheng@ca.ibm.c... e.g. s1 = 0xfffc0062, and s2 = d8000021 +weiv these are the input strings? +cycheng@ca.ibm.c... yes, using the utf-16 iterator and UCA with normalization on, we have s1 > s2 +weiv will check - could be a problem with utf-8 iterator +cycheng@ca.ibm.c... but if we use the utf-8 iterator, i.e. s1 = efbfbc62 and s2 = eda08021, we have s1 < s2 +weiv hmmm +cycheng@ca.ibm.c... note that we have a standalone high surrogate +weiv that doesn't sound right +cycheng@ca.ibm.c... we got the same inconsistent results on AIX and Win2000 +weiv so you have two strings, you convert them to utf-8 and to utf-16BE +cycheng@ca.ibm.c... yes +weiv and then do the comparison +cycheng@ca.ibm.c... in one case, the input strings are in utf8, and in the other case the input strings are in utf-16be +weiv utf-16 strings look like a little endian ones in the example you sent me +weiv It could be a bug - let me try to test it out +cycheng@ca.ibm.c... ok +cycheng@ca.ibm.c... we can wait till the conf. call +cycheng@ca.ibm.c... next weke +weiv that would be great +weiv hmmm +weiv I might be wrong +weiv let me play with it some more +cycheng@ca.ibm.c... ok +cycheng@ca.ibm.c... also please check s3 = 0x0e3a0062 and s4 = 0x0e400021. both are in utf-16be +cycheng@ca.ibm.c... seems with icu 2.2 we have s3 > s4, but not in icu 2.4 that's built for db2 +cycheng@ca.ibm.c... also s1 & s2 that I sent you earlier are also in utf-16be +weiv ok +cycheng@ca.ibm.c... i ask sherman to send you more inconsistent data +weiv thanks +cycheng@ca.ibm.c... the 4 strings we sent are just samples */ #if 0 static void Alexis(void) { @@ -3889,7 +3703,7 @@ static void Alexis2(void) { UErrorCode status = U_ZERO_ERROR; UChar U16Source[CMSCOLL_ALEXIS2_BUFFER_SIZE], U16Target[CMSCOLL_ALEXIS2_BUFFER_SIZE]; char U16BESource[CMSCOLL_ALEXIS2_BUFFER_SIZE], U16BETarget[CMSCOLL_ALEXIS2_BUFFER_SIZE]; - char U8Source[CMSCOLL_ALEXIS2_BUFFER_SIZE], U8Target[CMSCOLL_ALEXIS2_BUFFER_SIZE]; + char U8Source[CMSCOLL_ALEXIS2_BUFFER_SIZE], U8Target[CMSCOLL_ALEXIS2_BUFFER_SIZE]; int32_t U16LenS = 0, U16LenT = 0, U16BELenS = 0, U16BELenT = 0, U8LenS = 0, U8LenT = 0; UConverter *conv = NULL; @@ -4008,7 +3822,7 @@ static void TestHebrewUCA(void) { static void TestPartialSortKeyTermination(void) { const char* cases[] = { "\\u1234\\u1234\\udc00", - "\\udc00\\ud800\\ud800" + "\\udc00\\ud800\\ud800" }; int32_t i = sizeof(UCollator); @@ -4229,53 +4043,631 @@ static void TestJ2726(void) { ucol_close(coll); } +static void NullRule(void) { + UChar r[3] = {0}; + UErrorCode status = U_ZERO_ERROR; + UCollator *coll = ucol_openRules(r, 1, UCOL_DEFAULT, UCOL_DEFAULT, NULL, &status); + if(U_SUCCESS(status)) { + log_err("This should have been an error!\n"); + ucol_close(coll); + } else { + status = U_ZERO_ERROR; + } + coll = ucol_openRules(r, 0, UCOL_DEFAULT, UCOL_DEFAULT, NULL, &status); + if(U_FAILURE(status)) { + log_err("Empty rules should have produced a valid collator\n"); + } else { + ucol_close(coll); + } +} + +/** + * Test for CollationElementIterator previous and next for the whole set of + * unicode characters with normalization on. + */ +static void TestNumericCollation(void) +{ + UErrorCode status = U_ZERO_ERROR; + + const static char *basicTestStrings[]={ + "hello1", + "hello2", + "hello2002", + "hello2003", + "hello123456", + "hello1234567", + "hello10000000", + "hello100000000", + "hello1000000000", + "hello10000000000", + }; + + const static char *preZeroTestStrings[]={ + "avery10000", + "avery010000", + "avery0010000", + "avery00010000", + "avery000010000", + "avery0000010000", + "avery00000010000", + "avery000000010000", + }; + + const static char *thirtyTwoBitNumericStrings[]={ + "avery42949672960", + "avery42949672961", + "avery42949672962", + "avery429496729610" + }; + + const static char *supplementaryDigits[] = { + "\\uD835\\uDFCE", /* 0 */ + "\\uD835\\uDFCF", /* 1 */ + "\\uD835\\uDFD0", /* 2 */ + "\\uD835\\uDFD1", /* 3 */ + "\\uD835\\uDFCF\\uD835\\uDFCE", /* 10 */ + "\\uD835\\uDFCF\\uD835\\uDFCF", /* 11 */ + "\\uD835\\uDFCF\\uD835\\uDFD0", /* 12 */ + "\\uD835\\uDFD0\\uD835\\uDFCE", /* 20 */ + "\\uD835\\uDFD0\\uD835\\uDFCF", /* 21 */ + "\\uD835\\uDFD0\\uD835\\uDFD0" /* 22 */ + }; + + const static char *foreignDigits[] = { + "\\u0661", + "\\u0662", + "\\u0663", + "\\u0661\\u0660", + "\\u0661\\u0662", + "\\u0661\\u0663", + "\\u0662\\u0660", + "\\u0662\\u0662", + "\\u0662\\u0663", + "\\u0663\\u0660", + "\\u0663\\u0662", + "\\u0663\\u0663" + }; + + const static char *evenZeroes[] = { + "2000", + "2001", + "2002", + "2003" + }; + + UColAttribute att = UCOL_NUMERIC_COLLATION; + UColAttributeValue val = UCOL_ON; + + /* Open our collator. */ + UCollator* coll = ucol_open("root", &status); + if (U_FAILURE(status)){ + log_err("ERROR: in using ucol_open()\n %s\n", + myErrorName(status)); + return; + } + genericLocaleStarterWithOptions("root", basicTestStrings, sizeof(basicTestStrings)/sizeof(basicTestStrings[0]), &att, &val, 1); + genericLocaleStarterWithOptions("root", thirtyTwoBitNumericStrings, sizeof(thirtyTwoBitNumericStrings)/sizeof(thirtyTwoBitNumericStrings[0]), &att, &val, 1); + genericLocaleStarterWithOptions("en_US", foreignDigits, sizeof(foreignDigits)/sizeof(foreignDigits[0]), &att, &val, 1); + genericLocaleStarterWithOptions("root", supplementaryDigits, sizeof(supplementaryDigits)/sizeof(supplementaryDigits[0]), &att, &val, 1); + genericLocaleStarterWithOptions("root", evenZeroes, sizeof(evenZeroes)/sizeof(evenZeroes[0]), &att, &val, 1); + + /* Setting up our collator to do digits. */ + ucol_setAttribute(coll, UCOL_NUMERIC_COLLATION, UCOL_ON, &status); + if (U_FAILURE(status)){ + log_err("ERROR: in setting UCOL_NUMERIC_COLLATION as an attribute\n %s\n", + myErrorName(status)); + return; + } + + /* + Testing that prepended zeroes still yield the correct collation behavior. + We expect that every element in our strings array will be equal. + */ + genericOrderingTestWithResult(coll, preZeroTestStrings, sizeof(preZeroTestStrings)/sizeof(preZeroTestStrings[0]), UCOL_EQUAL); + + ucol_close(coll); +} + +static void TestTibetanConformance(void) +{ + const char* test[] = { + "\\u0FB2\\u0591\\u0F71\\u0061", + "\\u0FB2\\u0F71\\u0061" + }; + + UErrorCode status = U_ZERO_ERROR; + UCollator *coll = ucol_open("", &status); + UChar source[100]; + UChar target[100]; + int result; + ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); + if (U_SUCCESS(status)) { + u_unescape(test[0], source, 100); + u_unescape(test[1], target, 100); + doTest(coll, source, target, UCOL_EQUAL); + result = ucol_strcoll(coll, source, -1, target, -1); + log_verbose("result %d\n", result); + if (UCOL_EQUAL != result) { + log_err("Tibetan comparison error\n"); + } + } + ucol_close(coll); + + genericLocaleStarterWithResult("", test, 2, UCOL_EQUAL); +} + +static void TestPinyinProblem(void) { + static const char *test[] = { "\\u4E56\\u4E56\\u7761", "\\u4E56\\u5B69\\u5B50" }; + genericLocaleStarter("zh__PINYIN", test, sizeof(test)/sizeof(test[0])); +} + +#define TST_UCOL_MAX_INPUT 0x220001 +#define topByte 0xFF000000; +#define bottomByte 0xFF; +#define fourBytes 0xFFFFFFFF; + + +static void showImplicit(UChar32 i) { + if (i >= 0 && i <= TST_UCOL_MAX_INPUT) { + log_verbose("%08X\t%08X\n", i, uprv_uca_getImplicitFromRaw(i)); + } +} + +static void TestImplicitGeneration(void) { + UErrorCode status = U_ZERO_ERROR; + UChar32 last = 0; + UChar32 current; + UChar32 i = 0, j = 0; + UChar32 roundtrip = 0; + UChar32 lastBottom = 0; + UChar32 currentBottom = 0; + UChar32 lastTop = 0; + UChar32 currentTop = 0; + + UCollator *coll = ucol_open("root", &status); + if(U_FAILURE(status)) { + log_err("Couldn't open UCA\n"); + return; + } + + uprv_uca_getRawFromImplicit(0xE20303E7); + + for (i = 0; i <= TST_UCOL_MAX_INPUT; ++i) { + current = uprv_uca_getImplicitFromRaw(i) & fourBytes; + + /* check that it round-trips AND that all intervening ones are illegal*/ + roundtrip = uprv_uca_getRawFromImplicit(current); + if (roundtrip != i) { + log_err("No roundtrip %08X\n", i); + } + if (last != 0) { + for (j = last + 1; j < current; ++j) { + roundtrip = uprv_uca_getRawFromImplicit(j); + /* raise an error if it *doesn't* find an error*/ + if (roundtrip != -1) { + log_err("Fails to recognize illegal %08X\n", j); + } + } + } + /* now do other consistency checks*/ + lastBottom = last & bottomByte; + currentBottom = current & bottomByte; + lastTop = last & topByte; + currentTop = current & topByte; + + /* print out some values for spot-checking*/ + if (lastTop != currentTop || i == 0x10000 || i == 0x110000) { + showImplicit(i-3); + showImplicit(i-2); + showImplicit(i-1); + showImplicit(i); + showImplicit(i+1); + showImplicit(i+2); + } + last = current; + + if(uprv_uca_getCodePointFromRaw(uprv_uca_getRawFromCodePoint(i)) != i) { + log_err("No raw <-> code point roundtrip for 0x%08X\n", i); + } + } + showImplicit(TST_UCOL_MAX_INPUT-2); + showImplicit(TST_UCOL_MAX_INPUT-1); + showImplicit(TST_UCOL_MAX_INPUT); + ucol_close(coll); +} + +/** + * Iterate through the given iterator, checking to see that all the strings + * in the expected array are present. + * @param expected array of strings we expect to see, or NULL + * @param expectedCount number of elements of expected, or 0 + */ +static int32_t checkUEnumeration(const char* msg, + UEnumeration* iter, + const char** expected, + int32_t expectedCount) { + UErrorCode ec = U_ZERO_ERROR; + int32_t i = 0, n, j, bit; + int32_t seenMask = 0; + + U_ASSERT(expectedCount >= 0 && expectedCount < 31); /* [sic] 31 not 32 */ + n = uenum_count(iter, &ec); + if (!assertSuccess("count", &ec)) return -1; + log_verbose("%s = [", msg); + for (;; ++i) { + const char* s = uenum_next(iter, NULL, &ec); + if (!assertSuccess("snext", &ec) || s == NULL) break; + if (i != 0) log_verbose(","); + log_verbose("%s", s); + /* check expected list */ + for (j=0, bit=1; j #include +#include #include "unicode/uloc.h" #include "unicode/umsg.h" #include "unicode/udat.h" @@ -60,12 +61,12 @@ static void InitStrings( void ) return; for (i=0; i < cnt_testCases; i++ ) { - uint32_t strSize = strlen(txt_testCasePatterns[i]) + 1; + uint32_t strSize = (uint32_t)strlen(txt_testCasePatterns[i]) + 1; testCasePatterns[i]=(UChar*)malloc(sizeof(UChar) * strSize); u_uastrncpy(testCasePatterns[i], txt_testCasePatterns[i], strSize); } for (i=0; i < cnt_testCases; i++ ) { - uint32_t strSize = strlen(txt_testResultStrings[i]) + 1; + uint32_t strSize = (uint32_t)strlen(txt_testResultStrings[i]) + 1; testResultStrings[i] = (UChar*)malloc(sizeof(UChar) * strSize); u_uastrncpy(testResultStrings[i], txt_testResultStrings[i], strSize); } @@ -88,6 +89,16 @@ static void FreeStrings( void ) strings_initialized = FALSE; } +/* Platform dependent test to detect if this type will return NULL when interpreted as a pointer. */ +static UBool returnsNullForType(int firstParam, ...) { + UBool isNULL; + va_list marker; + va_start(marker, firstParam); + isNULL = (UBool)(va_arg(marker, void*) == NULL); + va_end(marker); + return isNULL; +} + /* Test u_formatMessage() with various test patterns() */ static void MessageFormatTest( void ) { @@ -96,11 +107,14 @@ static void MessageFormatTest( void ) int32_t resultLengthOut,resultlength,i, patternlength; UErrorCode status = U_ZERO_ERROR; UDate d1=1000000000.0; + + ctest_setTimeZone(NULL, &status); + str=(UChar*)malloc(sizeof(UChar) * 7); u_uastrncpy(str, "MyDisk", 7); resultlength=1; result=(UChar*)malloc(sizeof(UChar) * 1); - log_verbose("Testing u_formatMessage90\n"); + log_verbose("Testing u_formatMessage()\n"); InitStrings(); for (i = 0; i < cnt_testCases; i++) { status=U_ZERO_ERROR; @@ -206,20 +220,25 @@ static void MessageFormatTest( void ) austrdup(result), austrdup(testResultStrings[i]) ); } -#if !defined(HPUX) - /* HP/UX and possibly other platforms don't properly check for this case. - We pass in a UDate, but the function expects a UDate *. When va_arg is used, - most compilers will return NULL, but HP/UX won't do that and will return 2 - in this case. This is a platform dependent test. - */ - umsg_parse(formatter,result,resultLength,&count,&ec,one,two,d2); - if(ec!=U_ILLEGAL_ARGUMENT_ERROR){ - log_err("FAIL: Did not get expected error for umsg_parse(). Expected: U_ILLEGAL_ARGUMENT_ERROR Got: %s \n",u_errorName(ec)); - }else{ - ec = U_ZERO_ERROR; + if (returnsNullForType(1, (double)2.0)) { + /* HP/UX and possibly other platforms don't properly check for this case. + We pass in a UDate, but the function expects a UDate *. When va_arg is used, + most compilers will return NULL, but HP-UX won't do that and will return 2 + in this case. This is a platform dependent test. + + This relies upon "undefined" behavior, as indicated by C99 7.15.1.1 paragraph 2 + */ + umsg_parse(formatter,result,resultLength,&count,&ec,one,two,d2); + if(ec!=U_ILLEGAL_ARGUMENT_ERROR){ + log_err("FAIL: Did not get expected error for umsg_parse(). Expected: U_ILLEGAL_ARGUMENT_ERROR Got: %s \n",u_errorName(ec)); + }else{ + ec = U_ZERO_ERROR; + } + } + else { + log_verbose("Warning: Returning NULL for a mismatched va_arg type isn't supported on this platform.\n", i); } -#endif umsg_parse(formatter,result,resultLength,&count,&ec,&one,&two,&d2); if(U_FAILURE(ec)){ log_err("umsg_parse could not parse the pattern. Error: %s.\n",u_errorName(ec)); @@ -232,6 +251,8 @@ static void MessageFormatTest( void ) umsg_close(formatter); } FreeStrings(); + + ctest_resetTimeZone(); } @@ -244,6 +265,9 @@ static void TestSampleMessageFormat() int32_t resultLengthOut, resultlength; UDate d = 837039928046.0; UErrorCode status = U_ZERO_ERROR; + + ctest_setTimeZone(NULL, &status); + str=(UChar*)malloc(sizeof(UChar) * 15); u_uastrcpy(str, "abc"); @@ -328,6 +352,8 @@ static void TestSampleMessageFormat() free(result); free(str); + + ctest_resetTimeZone(); } /* Test umsg_format() and umsg_parse() , format and parse sequence and round trip */ @@ -347,6 +373,9 @@ static void TestNewFormatAndParseAPI(void) UParseError parseError; UMessageFormat* fmt = NULL; int32_t count=0; + + ctest_setTimeZone(NULL, &status); + log_verbose("Testing format and parse with parse error\n"); str=(UChar*)malloc(sizeof(UChar) * 25); @@ -428,7 +457,8 @@ static void TestNewFormatAndParseAPI(void) free(result); free(str); free(tzID); - + + ctest_resetTimeZone(); } /* Test u_formatMessageWithError() and u_parseMessageWithError() , format and parse sequence and round trip */ @@ -448,6 +478,8 @@ static void TestSampleFormatAndParseWithError(void) UChar ret[30]; UParseError parseError; + ctest_setTimeZone(NULL, &status); + log_verbose("Testing format and parse with parse error\n"); str=(UChar*)malloc(sizeof(UChar) * 25); @@ -521,6 +553,7 @@ static void TestSampleFormatAndParseWithError(void) free(str); free(tzID); + ctest_resetTimeZone(); } /* Test u_formatMessage() and u_parseMessage() , format and parse sequence and round trip */ @@ -537,6 +570,9 @@ static void TestSampleFormatAndParse() UErrorCode status = U_ZERO_ERROR; double value = 0.0; UChar ret[30]; + + ctest_setTimeZone(NULL, &status); + log_verbose("Testing format and parse\n"); str=(UChar*)malloc(sizeof(UChar) * 25); @@ -610,6 +646,7 @@ static void TestSampleFormatAndParse() free(str); free(tzID); + ctest_resetTimeZone(); } /* test message format with a choice option */ @@ -765,6 +802,9 @@ static void TestMessageFormatWithValist( void ) int32_t resultLengthOut,resultlength,i, patternlength; UErrorCode status = U_ZERO_ERROR; UDate d1=1000000000.0; + + ctest_setTimeZone(NULL, &status); + str=(UChar*)malloc(sizeof(UChar) * 7); u_uastrcpy(str, "MyDisk"); resultlength=1; @@ -798,6 +838,8 @@ static void TestMessageFormatWithValist( void ) free(result); free(str); FreeStrings(); + + ctest_resetTimeZone(); } static void CallParseMessage(const char* locale, UChar* pattern, int32_t patternLength, @@ -864,6 +906,8 @@ static void TestJ904(void) { const char* PAT = "Number {1,number,#0.000}, String {0}, Date {2,date,12:mm:ss.SSS}"; const char* EXP = "Number 0,143, String foo, Date 12:34:56.789"; + ctest_setTimeZone(NULL, &status); + u_uastrcpy(string, "foo"); /* Slight hack here -- instead of date pattern HH:mm:ss.SSS, use * 12:mm:ss.SSS. Why? So this test generates the same output -- @@ -887,6 +931,8 @@ static void TestJ904(void) { } else { log_err("FAIL: got \"%s\", expected \"%s\"\n", cresult, EXP); } + + ctest_resetTimeZone(); } static void OpenMessageFormatTest(void) @@ -964,6 +1010,28 @@ static void OpenMessageFormatTest(void) umsg_close(f3); } +static void MessageLength(void) +{ + UErrorCode status = U_ZERO_ERROR; + const char patChars[] = {"123{0}456{0}"}; + const char expectedChars[] = {"123abc"}; + UChar pattern[sizeof(patChars)]; + UChar arg[] = {0x61,0x62,0x63,0}; + UChar result[128] = {0}; + UChar expected[sizeof(expectedChars)]; + + u_uastrncpy(pattern, patChars, sizeof(pattern)/sizeof(pattern[0])); + u_uastrncpy(expected, expectedChars, sizeof(expected)/sizeof(expected[0])); + + u_formatMessage("en_US", pattern, 6, result, sizeof(result)/sizeof(result[0]), &status, arg); + if (U_FAILURE(status)) { + log_err("u_formatMessage method failed. Error: %s \n",u_errorName(status)); + } + if (u_strcmp(result, expected) != 0) { + log_err("u_formatMessage didn't return expected result\n"); + } +} + void addMsgForTest(TestNode** root); @@ -980,7 +1048,7 @@ void addMsgForTest(TestNode** root) addTest(root, &TestMessageFormatWithValist, "tsformat/cmsgtst/TestMessageFormatWithValist"); addTest(root, &TestParseMessageWithValist, "tsformat/cmsgtst/TestParseMessageWithValist"); addTest(root, &TestJ904, "tsformat/cmsgtst/TestJ904"); - + addTest(root, &MessageLength, "tsformat/cmsgtst/MessageLength"); } #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/test/cintltst/cnmdptst.c b/icuSources/test/cintltst/cnmdptst.c index 8723af08..5847aefc 100644 --- a/icuSources/test/cintltst/cnmdptst.c +++ b/icuSources/test/cintltst/cnmdptst.c @@ -1,7 +1,7 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and - * others. All Rights Reserved. + * Copyright (c) 1997-2004, International Business Machines Corporation + * and others. All Rights Reserved. ********************************************************************/ /******************************************************************************* * @@ -21,6 +21,7 @@ #if !UCONFIG_NO_FORMATTING +#include "unicode/ucurr.h" #include "unicode/uloc.h" #include "unicode/unum.h" #include "unicode/ustring.h" @@ -47,281 +48,281 @@ void addNumFrDepTest(TestNode** root) addTest(root, &TestRounding487, "tsformat/cnmdptst/TestRounding487"); addTest(root, &TestDoubleAttribute, "tsformat/cnmdptst/TestDoubleAttribute"); addTest(root, &TestSecondaryGrouping, "tsformat/cnmdptst/TestSecondaryGrouping"); - + addTest(root, &TestCurrencyKeywords, "tsformat/cnmdptst/TestCurrencyKeywords"); } /*Test Various format patterns*/ static void TestPatterns(void) { - int32_t pat_length, i, lneed; - UNumberFormat *fmt; - UChar upat[5]; - UChar unewpat[5]; - UChar unum[5]; - UChar *unewp=NULL; - UChar *str=NULL; - UErrorCode status = U_ZERO_ERROR; - const char* pat[] = { "#.#", "#.", ".#", "#" }; - const char* newpat[] = { "#0.#", "#0.", "#.0", "#" }; - const char* num[] = { "0", "0.", ".0", "0" }; - - log_verbose("\nTesting different format patterns\n"); - pat_length = sizeof(pat) / sizeof(pat[0]); - for (i=0; i < pat_length; ++i) + int32_t pat_length, i, lneed; + UNumberFormat *fmt; + UChar upat[5]; + UChar unewpat[5]; + UChar unum[5]; + UChar *unewp=NULL; + UChar *str=NULL; + UErrorCode status = U_ZERO_ERROR; + const char* pat[] = { "#.#", "#.", ".#", "#" }; + const char* newpat[] = { "#0.#", "#0.", "#.0", "#" }; + const char* num[] = { "0", "0.", ".0", "0" }; + + log_verbose("\nTesting different format patterns\n"); + pat_length = sizeof(pat) / sizeof(pat[0]); + for (i=0; i < pat_length; ++i) { - status = U_ZERO_ERROR; - u_uastrcpy(upat, pat[i]); - fmt= unum_open(UNUM_IGNORE,upat, u_strlen(upat), "en_US",NULL, &status); - if (U_FAILURE(status)) { - log_err("FAIL: Number format constructor failed for pattern %s\n", pat[i]); - continue; - } - lneed=0; - lneed=unum_toPattern(fmt, FALSE, NULL, lneed, &status); - if(status==U_BUFFER_OVERFLOW_ERROR){ - status= U_ZERO_ERROR; - unewp=(UChar*)malloc(sizeof(UChar) * (lneed+1) ); - unum_toPattern(fmt, FALSE, unewp, lneed+1, &status); - } - if(U_FAILURE(status)){ - log_err("FAIL: Number format extracting the pattern failed for %s\n", pat[i]); - } - u_uastrcpy(unewpat, newpat[i]); - if(u_strcmp(unewp, unewpat) != 0) - log_err("FAIL: Pattern %s should be transmute to %s; %s seen instead\n", pat[i], newpat[i], austrdup(unewp) ); - - lneed=0; - lneed=unum_format(fmt, 0, NULL, lneed, NULL, &status); - if(status==U_BUFFER_OVERFLOW_ERROR){ - status=U_ZERO_ERROR; - str=(UChar*)malloc(sizeof(UChar) * (lneed+1) ); - unum_format(fmt, 0, str, lneed+1, NULL, &status); - } - if(U_FAILURE(status)) { - log_err("Error in formatting using unum_format(.....): %s\n", myErrorName(status) ); - } - u_uastrcpy(unum, num[i]); - if (u_strcmp(str, unum) != 0) + status = U_ZERO_ERROR; + u_uastrcpy(upat, pat[i]); + fmt= unum_open(UNUM_IGNORE,upat, u_strlen(upat), "en_US",NULL, &status); + if (U_FAILURE(status)) { + log_err("FAIL: Number format constructor failed for pattern %s\n", pat[i]); + continue; + } + lneed=0; + lneed=unum_toPattern(fmt, FALSE, NULL, lneed, &status); + if(status==U_BUFFER_OVERFLOW_ERROR){ + status= U_ZERO_ERROR; + unewp=(UChar*)malloc(sizeof(UChar) * (lneed+1) ); + unum_toPattern(fmt, FALSE, unewp, lneed+1, &status); + } + if(U_FAILURE(status)){ + log_err("FAIL: Number format extracting the pattern failed for %s\n", pat[i]); + } + u_uastrcpy(unewpat, newpat[i]); + if(u_strcmp(unewp, unewpat) != 0) + log_err("FAIL: Pattern %s should be transmute to %s; %s seen instead\n", pat[i], newpat[i], austrdup(unewp) ); + + lneed=0; + lneed=unum_format(fmt, 0, NULL, lneed, NULL, &status); + if(status==U_BUFFER_OVERFLOW_ERROR){ + status=U_ZERO_ERROR; + str=(UChar*)malloc(sizeof(UChar) * (lneed+1) ); + unum_format(fmt, 0, str, lneed+1, NULL, &status); + } + if(U_FAILURE(status)) { + log_err("Error in formatting using unum_format(.....): %s\n", myErrorName(status) ); + } + u_uastrcpy(unum, num[i]); + if (u_strcmp(str, unum) != 0) { - log_err("FAIL: Pattern %s should format zero as %s; %s Seen instead\n", pat[i], num[i], austrdup(str) ); - + log_err("FAIL: Pattern %s should format zero as %s; %s Seen instead\n", pat[i], num[i], austrdup(str) ); + } - free(unewp); - free(str); - unum_close(fmt); + free(unewp); + free(str); + unum_close(fmt); } } /* Test the handling of quotes*/ static void TestQuotes(void) { - int32_t lneed; - UErrorCode status=U_ZERO_ERROR; - UChar pat[15]; - UChar res[15]; - UChar *str=NULL; - UNumberFormat *fmt; - char tempBuf[256]; - log_verbose("\nTestting the handling of quotes in number format\n"); - u_uastrcpy(pat, "a'fo''o'b#"); - fmt =unum_open(UNUM_IGNORE,pat, u_strlen(pat), "en_US",NULL, &status); - if(U_FAILURE(status)){ - log_err("Error in number format costruction using pattern \"a'fo''o'b#\"\n"); - } - lneed=0; - lneed=unum_format(fmt, 123, NULL, lneed, NULL, &status); - if(status==U_BUFFER_OVERFLOW_ERROR){ - status=U_ZERO_ERROR; - str=(UChar*)malloc(sizeof(UChar) * (lneed+1) ); - unum_format(fmt, 123, str, lneed+1, NULL, &status); - } - if(U_FAILURE(status) || !str) { - log_err("Error in formatting using unum_format(.....): %s\n", myErrorName(status) ); - return; - } - log_verbose("Pattern \"%s\" \n", u_austrcpy(tempBuf, pat) ); - log_verbose("Format 123 -> %s\n", u_austrcpy(tempBuf, str) ); - u_uastrcpy(res, "afo'ob123"); - if(u_strcmp(str, res) != 0) - log_err("FAIL: Expected afo'ob123"); + int32_t lneed; + UErrorCode status=U_ZERO_ERROR; + UChar pat[15]; + UChar res[15]; + UChar *str=NULL; + UNumberFormat *fmt; + char tempBuf[256]; + log_verbose("\nTestting the handling of quotes in number format\n"); + u_uastrcpy(pat, "a'fo''o'b#"); + fmt =unum_open(UNUM_IGNORE,pat, u_strlen(pat), "en_US",NULL, &status); + if(U_FAILURE(status)){ + log_err("Error in number format costruction using pattern \"a'fo''o'b#\"\n"); + } + lneed=0; + lneed=unum_format(fmt, 123, NULL, lneed, NULL, &status); + if(status==U_BUFFER_OVERFLOW_ERROR){ + status=U_ZERO_ERROR; + str=(UChar*)malloc(sizeof(UChar) * (lneed+1) ); + unum_format(fmt, 123, str, lneed+1, NULL, &status); + } + if(U_FAILURE(status) || !str) { + log_err("Error in formatting using unum_format(.....): %s\n", myErrorName(status) ); + return; + } + log_verbose("Pattern \"%s\" \n", u_austrcpy(tempBuf, pat) ); + log_verbose("Format 123 -> %s\n", u_austrcpy(tempBuf, str) ); + u_uastrcpy(res, "afo'ob123"); + if(u_strcmp(str, res) != 0) + log_err("FAIL: Expected afo'ob123"); - free(str); - unum_close(fmt); - - - u_uastrcpy(pat, ""); - u_uastrcpy(pat, "a''b#"); - - - fmt =unum_open(UNUM_IGNORE,pat, u_strlen(pat), "en_US",NULL, &status); - if(U_FAILURE(status)){ - log_err("Error in number format costruction using pattern \"a''b#\"\n"); - } - lneed=0; - lneed=unum_format(fmt, 123, NULL, lneed, NULL, &status); - if(status==U_BUFFER_OVERFLOW_ERROR){ - status=U_ZERO_ERROR; - str=(UChar*)malloc(sizeof(UChar) * (lneed+1) ); - unum_format(fmt, 123, str, lneed+1, NULL, &status); - } - if(U_FAILURE(status)) { - log_err("Error in formatting using unum_format(.....): %s\n", myErrorName(status) ); - } - log_verbose("Pattern \"%s\" \n", u_austrcpy(tempBuf, pat) ); - log_verbose("Format 123 -> %s\n", u_austrcpy(tempBuf, str) ); - u_uastrcpy(res, ""); - u_uastrcpy(res, "a'b123"); - if(u_strcmp(str, res) != 0) - log_err("FAIL: Expected a'b123\n"); - - free(str); - unum_close(fmt); + free(str); + unum_close(fmt); + + + u_uastrcpy(pat, ""); + u_uastrcpy(pat, "a''b#"); + + + fmt =unum_open(UNUM_IGNORE,pat, u_strlen(pat), "en_US",NULL, &status); + if(U_FAILURE(status)){ + log_err("Error in number format costruction using pattern \"a''b#\"\n"); + } + lneed=0; + lneed=unum_format(fmt, 123, NULL, lneed, NULL, &status); + if(status==U_BUFFER_OVERFLOW_ERROR){ + status=U_ZERO_ERROR; + str=(UChar*)malloc(sizeof(UChar) * (lneed+1) ); + unum_format(fmt, 123, str, lneed+1, NULL, &status); + } + if(U_FAILURE(status)) { + log_err("Error in formatting using unum_format(.....): %s\n", myErrorName(status) ); + } + log_verbose("Pattern \"%s\" \n", u_austrcpy(tempBuf, pat) ); + log_verbose("Format 123 -> %s\n", u_austrcpy(tempBuf, str) ); + u_uastrcpy(res, ""); + u_uastrcpy(res, "a'b123"); + if(u_strcmp(str, res) != 0) + log_err("FAIL: Expected a'b123\n"); + + free(str); + unum_close(fmt); } /* Test exponential pattern*/ static void TestExponential(void) { - int32_t pat_length, val_length, lval_length; - int32_t ival, ilval, p, v, lneed; - UNumberFormat *fmt; - int32_t ppos; - UChar *upat; - UChar pattern[20]; - UChar *str=NULL; - UChar uvalfor[20], ulvalfor[20]; - char tempMsgBug[256]; - double a; - UErrorCode status = U_ZERO_ERROR; + int32_t pat_length, val_length, lval_length; + int32_t ival, ilval, p, v, lneed; + UNumberFormat *fmt; + int32_t ppos; + UChar *upat; + UChar pattern[20]; + UChar *str=NULL; + UChar uvalfor[20], ulvalfor[20]; + char tempMsgBug[256]; + double a; + UErrorCode status = U_ZERO_ERROR; #ifdef OS390 - double val[] = { 0.01234, 123456789, 1.23e75, -3.141592653e-78 }; + double val[] = { 0.01234, 123456789, 1.23e75, -3.141592653e-78 }; #else - double val[] = { 0.01234, 123456789, 1.23e300, -3.141592653e-271 }; + double val[] = { 0.01234, 123456789, 1.23e300, -3.141592653e-271 }; #endif - const char* pat[] = { "0.####E0", "00.000E00", "##0.######E000", "0.###E0;[0.###E0]" }; - int32_t lval[] = { 0, -1, 1, 123456789 }; - - const char* valFormat[] = - { - "1.234E-2", "1.2346E8", "1.23E300", "-3.1416E-271", - "12.340E-03", "12.346E07", "12.300E299", "-31.416E-272", - "12.34E-003", "123.4568E006", "1.23E300", "-314.1593E-273", - "1.234E-2", "1.235E8", "1.23E300", "[3.142E-271]" - }; - const char* lvalFormat[] = - { - "0E0", "-1E0", "1E0", "1.2346E8", - "00.000E00", "-10.000E-01", "10.000E-01", "12.346E07", - "0E000", "-1E000", "1E000", "123.4568E006", - "0E0", "[1E0]", "1E0", "1.235E8" - }; - double valParse[] = - { + const char* pat[] = { "0.####E0", "00.000E00", "##0.######E000", "0.###E0;[0.###E0]" }; + int32_t lval[] = { 0, -1, 1, 123456789 }; + + const char* valFormat[] = + { + "1.234E-2", "1.2346E8", "1.23E300", "-3.1416E-271", + "12.340E-03", "12.346E07", "12.300E299", "-31.416E-272", + "12.34E-003", "123.4568E006", "1.23E300", "-314.1593E-273", + "1.234E-2", "1.235E8", "1.23E300", "[3.142E-271]" + }; + const char* lvalFormat[] = + { + "0E0", "-1E0", "1E0", "1.2346E8", + "00.000E00", "-10.000E-01", "10.000E-01", "12.346E07", + "0E000", "-1E000", "1E000", "123.4568E006", + "0E0", "[1E0]", "1E0", "1.235E8" + }; + double valParse[] = + { #ifdef OS390 - 0.01234, 123460000, 1.23E75, -3.1416E-78, - 0.01234, 123460000, 1.23E75, -3.1416E-78, - 0.01234, 123456800, 1.23E75, -3.141593E-78, - 0.01234, 123500000, 1.23E75, -3.142E-78 + 0.01234, 123460000, 1.23E75, -3.1416E-78, + 0.01234, 123460000, 1.23E75, -3.1416E-78, + 0.01234, 123456800, 1.23E75, -3.141593E-78, + 0.01234, 123500000, 1.23E75, -3.142E-78 #else - 0.01234, 123460000, 1.23E300, -3.1416E-271, - 0.01234, 123460000, 1.23E300, -3.1416E-271, - 0.01234, 123456800, 1.23E300, -3.141593E-271, - 0.01234, 123500000, 1.23E300, -3.142E-271 + 0.01234, 123460000, 1.23E300, -3.1416E-271, + 0.01234, 123460000, 1.23E300, -3.1416E-271, + 0.01234, 123456800, 1.23E300, -3.141593E-271, + 0.01234, 123500000, 1.23E300, -3.142E-271 #endif - }; - int32_t lvalParse[] = - { - 0, -1, 1, 123460000, - 0, -1, 1, 123460000, - 0, -1, 1, 123456800, - 0, -1, 1, 123500000 - }; - - - pat_length = sizeof(pat) / sizeof(pat[0]); - val_length = sizeof(val) / sizeof(val[0]); - lval_length = sizeof(lval) / sizeof(lval[0]); - ival = 0; - ilval = 0; - for (p=0; p < pat_length; ++p) + }; + int32_t lvalParse[] = { - upat=(UChar*)malloc(sizeof(UChar) * (strlen(pat[p])+1) ); - u_uastrcpy(upat, pat[p]); - fmt=unum_open(UNUM_IGNORE,upat, u_strlen(upat), "en_US",NULL, &status); - if (U_FAILURE(status)) { - log_err("FAIL: Bad status returned by Number format construction with pattern %s\n, pat[i]"); - continue; - } - lneed= u_strlen(upat) + 1; - unum_toPattern(fmt, FALSE, pattern, lneed, &status); - log_verbose("Pattern \" %s \" -toPattern-> \" %s \" \n", upat, u_austrcpy(tempMsgBug, pattern) ); - for (v=0; v \" %s \" \n", upat, u_austrcpy(tempMsgBug, pattern) ); + for (v=0; v %e\n", ppos, a); - - free(str); + /*format*/ + lneed=0; + lneed=unum_formatDouble(fmt, val[v], NULL, lneed, NULL, &status); + if(status==U_BUFFER_OVERFLOW_ERROR){ + status=U_ZERO_ERROR; + str=(UChar*)malloc(sizeof(UChar) * (lneed+1) ); + unum_formatDouble(fmt, val[v], str, lneed+1, NULL, &status); + } + if(U_FAILURE(status)) { + log_err("Error in formatting using unum_format(.....): %s\n", myErrorName(status) ); + } + + + + u_uastrcpy(uvalfor, valFormat[v+ival]); + if(u_strcmp(str, uvalfor) != 0) + log_verbose("FAIL: Expected %s ( %s )\n", valFormat[v+ival], u_austrcpy(tempMsgBug, uvalfor) ); + + /*parsing*/ + ppos=0; + a=unum_parseDouble(fmt, str, u_strlen(str), &ppos, &status); + if (ppos== u_strlen(str)) { + if (a != valParse[v+ival]) + log_err("FAIL: Expected: %e, Got: %g\n", valParse[v+ival], a); + } + else + log_err(" FAIL: Partial parse ( %d chars ) -> %e\n", ppos, a); + + free(str); } - for (v=0; v %s\n", lval[v], austrdup(str) );*/ - u_uastrcpy(ulvalfor, lvalFormat[v+ilval]); - if(u_strcmp(str, ulvalfor) != 0) - log_err("FAIL: Expected %s ( %s )\n", valFormat[v+ilval], austrdup(ulvalfor) ); - - /*parsing*/ - ppos=0; - a=unum_parseDouble(fmt, str, u_strlen(str), &ppos, &status); - if (ppos== u_strlen(str)) { - /*printf(" Parse -> %e\n", a);*/ - if (a != lvalParse[v+ilval]) - log_err("FAIL: Expected : %e\n", valParse[v+ival]); - } - else - log_err(" FAIL: Partial parse ( %d chars ) -> %e\n", ppos, a); - - free(str); - + /*format*/ + lneed=0; + lneed=unum_formatDouble(fmt, lval[v], NULL, lneed, NULL, &status); + if(status==U_BUFFER_OVERFLOW_ERROR){ + status=U_ZERO_ERROR; + str=(UChar*)malloc(sizeof(UChar) * (lneed+1) ); + unum_formatDouble(fmt, lval[v], str, lneed+1, NULL, &status); + } + if(U_FAILURE(status)) { + log_err("Error in formatting using unum_format(.....): %s\n", myErrorName(status) ); + } + /*printf(" Format %e -> %s\n", lval[v], austrdup(str) );*/ + u_uastrcpy(ulvalfor, lvalFormat[v+ilval]); + if(u_strcmp(str, ulvalfor) != 0) + log_err("FAIL: Expected %s ( %s )\n", valFormat[v+ilval], austrdup(ulvalfor) ); + + /*parsing*/ + ppos=0; + a=unum_parseDouble(fmt, str, u_strlen(str), &ppos, &status); + if (ppos== u_strlen(str)) { + /*printf(" Parse -> %e\n", a);*/ + if (a != lvalParse[v+ilval]) + log_err("FAIL: Expected : %e\n", valParse[v+ival]); + } + else + log_err(" FAIL: Partial parse ( %d chars ) -> %e\n", ppos, a); + + free(str); + } - ival += val_length; - ilval += lval_length; - unum_close(fmt); - free(upat); + ival += val_length; + ilval += lval_length; + unum_close(fmt); + free(upat); } } @@ -330,72 +331,72 @@ static void TestExponential(void) */ static void TestCurrencySign(void) { - int32_t lneed; - UNumberFormat *fmt; - UChar *pattern=NULL; - UChar *str=NULL; - UChar *pat=NULL; - UChar *res=NULL; - UErrorCode status = U_ZERO_ERROR; - char tempBuf[256]; - - pattern=(UChar*)malloc(sizeof(UChar) * (strlen("*#,##0.00;-*#,##0.00") + 1) ); - u_uastrcpy(pattern, "*#,##0.00;-*#,##0.00"); - pattern[0]=pattern[11]=0xa4; /* insert latin-1 currency symbol */ - fmt = unum_open(UNUM_IGNORE,pattern, u_strlen(pattern), "en_US",NULL, &status); - if(U_FAILURE(status)){ - log_err("Error in number format construction with pattern \"\\xA4#,##0.00;-\\xA4#,##0.00\\\" \n"); - } - lneed=0; - lneed=unum_formatDouble(fmt, 1234.56, NULL, lneed, NULL, &status); - if(status==U_BUFFER_OVERFLOW_ERROR){ - status=U_ZERO_ERROR; - str=(UChar*)malloc(sizeof(UChar) * (lneed+1) ); - unum_formatDouble(fmt, 1234.56, str, lneed+1, NULL, &status); - } - if(U_FAILURE(status)) { - log_err("Error in formatting using unum_format(.....): %s\n", myErrorName(status) ); - } - lneed=0; - lneed=unum_toPattern(fmt, FALSE, NULL, lneed, &status); - if(status==U_BUFFER_OVERFLOW_ERROR){ - status=U_ZERO_ERROR; - pat=(UChar*)malloc(sizeof(UChar) * (lneed+1) ); - unum_formatDouble(fmt, FALSE, pat, lneed+1, NULL, &status); - } - log_verbose("Pattern \" %s \" \n", u_austrcpy(tempBuf, pat)); - log_verbose("Format 1234.56 -> %s\n", u_austrcpy(tempBuf, str) ); - if(U_SUCCESS(status) && str) { - res=(UChar*)malloc(sizeof(UChar) * (strlen("$1,234.56")+1) ); - u_uastrcpy(res, "$1,234.56"); - if (u_strcmp(str, res) !=0) log_err("FAIL: Expected $1,234.56\n"); - } else { - log_err("Error formatting\n"); - } - free(str); - free(res); - free(pat); - - lneed=0; - lneed=unum_formatDouble(fmt, -1234.56, NULL, lneed, NULL, &status); - if(status==U_BUFFER_OVERFLOW_ERROR){ - status=U_ZERO_ERROR; - str=(UChar*)malloc(sizeof(UChar) * (lneed+1) ); - unum_formatDouble(fmt, -1234.56, str, lneed+1, NULL, &status); - } - if(U_FAILURE(status)) { - log_err("Error in formatting using unum_format(.....): %s\n", myErrorName(status) ); - } - if(str) { - res=(UChar*)malloc(sizeof(UChar) * (strlen("-$1,234.56")+1) ); - u_uastrcpy(res, "-$1,234.56"); - if (u_strcmp(str, res) != 0) log_err("FAIL: Expected -$1,234.56\n"); + int32_t lneed; + UNumberFormat *fmt; + UChar *pattern=NULL; + UChar *str=NULL; + UChar *pat=NULL; + UChar *res=NULL; + UErrorCode status = U_ZERO_ERROR; + char tempBuf[256]; + + pattern=(UChar*)malloc(sizeof(UChar) * (strlen("*#,##0.00;-*#,##0.00") + 1) ); + u_uastrcpy(pattern, "*#,##0.00;-*#,##0.00"); + pattern[0]=pattern[11]=0xa4; /* insert latin-1 currency symbol */ + fmt = unum_open(UNUM_IGNORE,pattern, u_strlen(pattern), "en_US",NULL, &status); + if(U_FAILURE(status)){ + log_err("Error in number format construction with pattern \"\\xA4#,##0.00;-\\xA4#,##0.00\\\" \n"); + } + lneed=0; + lneed=unum_formatDouble(fmt, 1234.56, NULL, lneed, NULL, &status); + if(status==U_BUFFER_OVERFLOW_ERROR){ + status=U_ZERO_ERROR; + str=(UChar*)malloc(sizeof(UChar) * (lneed+1) ); + unum_formatDouble(fmt, 1234.56, str, lneed+1, NULL, &status); + } + if(U_FAILURE(status)) { + log_err("Error in formatting using unum_format(.....): %s\n", myErrorName(status) ); + } + lneed=0; + lneed=unum_toPattern(fmt, FALSE, NULL, lneed, &status); + if(status==U_BUFFER_OVERFLOW_ERROR){ + status=U_ZERO_ERROR; + pat=(UChar*)malloc(sizeof(UChar) * (lneed+1) ); + unum_formatDouble(fmt, FALSE, pat, lneed+1, NULL, &status); + } + log_verbose("Pattern \" %s \" \n", u_austrcpy(tempBuf, pat)); + log_verbose("Format 1234.56 -> %s\n", u_austrcpy(tempBuf, str) ); + if(U_SUCCESS(status) && str) { + res=(UChar*)malloc(sizeof(UChar) * (strlen("$1,234.56")+1) ); + u_uastrcpy(res, "$1,234.56"); + if (u_strcmp(str, res) !=0) log_err("FAIL: Expected $1,234.56\n"); + } else { + log_err("Error formatting\n"); + } free(str); free(res); - } - - unum_close(fmt); - free(pattern); + free(pat); + + lneed=0; + lneed=unum_formatDouble(fmt, -1234.56, NULL, lneed, NULL, &status); + if(status==U_BUFFER_OVERFLOW_ERROR){ + status=U_ZERO_ERROR; + str=(UChar*)malloc(sizeof(UChar) * (lneed+1) ); + unum_formatDouble(fmt, -1234.56, str, lneed+1, NULL, &status); + } + if(U_FAILURE(status)) { + log_err("Error in formatting using unum_format(.....): %s\n", myErrorName(status) ); + } + if(str) { + res=(UChar*)malloc(sizeof(UChar) * (strlen("-$1,234.56")+1) ); + u_uastrcpy(res, "-$1,234.56"); + if (u_strcmp(str, res) != 0) log_err("FAIL: Expected -$1,234.56\n"); + free(str); + free(res); + } + + unum_close(fmt); + free(pattern); } /** @@ -403,43 +404,40 @@ static void TestCurrencySign(void) */ static void TestCurrency(void) { - UNumberFormat *currencyFmt; - UChar *str=NULL, *res=NULL; - int32_t lneed, i; - UFieldPosition pos; - char cStr[100]; - UErrorCode status = U_ZERO_ERROR; - const char* locale[]={"fr_CA", "de_DE_PREEURO", "fr_FR_PREEURO"}; - const char* result[]={"1,50 $", "1,50 DM", "1,50 F"}; - log_verbose("\nTesting the number format with different currency patterns\n"); - for(i=0; i < 3; i++) + UNumberFormat *currencyFmt; + UChar *str; + int32_t lneed, i; + UFieldPosition pos; + UChar res[100]; + UErrorCode status = U_ZERO_ERROR; + const char* locale[]={"fr_CA", "de_DE_PREEURO", "fr_FR_PREEURO"}; + const char* result[]={"1,50 $", "1,50 DM", "1,50 F"}; + log_verbose("\nTesting the number format with different currency patterns\n"); + for(i=0; i < 3; i++) { - cStr[0]=0; - currencyFmt = unum_open(UNUM_CURRENCY, NULL,0,locale[i],NULL, &status); - if(U_FAILURE(status)){ - log_err("Error in the construction of number format with style currency:\n%s\n", - myErrorName(status)); - } - lneed=0; - lneed= unum_formatDouble(currencyFmt, 1.50, NULL, lneed, NULL, &status); - if(status==U_BUFFER_OVERFLOW_ERROR){ - status=U_ZERO_ERROR; - str=(UChar*)malloc(sizeof(UChar) * (lneed+1) ); - pos.field = 0; - unum_formatDouble(currencyFmt, 1.50, str, lneed+1, &pos, &status); - } - if(U_FAILURE(status)) { - log_err("Error in formatting using unum_formatDouble(.....): %s\n", myErrorName(status) ); - } - res=(UChar*)malloc(sizeof(UChar) * (strlen(result[i])+1) ); - u_uastrcpy(res, result[i]); - u_UCharsToChars(str,cStr,u_strlen(res)); - if (u_strcmp(str, res) != 0){ - log_err("FAIL: Expected %s Got: %s for locale: %s\n", result[i],cStr,locale[i]); - } - unum_close(currencyFmt); - free(str); - free(res); + str=NULL; + currencyFmt = unum_open(UNUM_CURRENCY, NULL,0,locale[i],NULL, &status); + if(U_FAILURE(status)){ + log_err("Error in the construction of number format with style currency:\n%s\n", + myErrorName(status)); + } + lneed=0; + lneed= unum_formatDouble(currencyFmt, 1.50, NULL, lneed, NULL, &status); + if(status==U_BUFFER_OVERFLOW_ERROR){ + status=U_ZERO_ERROR; + str=(UChar*)malloc(sizeof(UChar) * (lneed+1) ); + pos.field = 0; + unum_formatDouble(currencyFmt, 1.50, str, lneed+1, &pos, &status); + } + if(U_FAILURE(status)) { + log_err("Error in formatting using unum_formatDouble(.....): %s\n", myErrorName(status) ); + } + u_charsToUChars(result[i], res, (int32_t)strlen(result[i])+1); + if (u_strcmp(str, res) != 0){ + log_err("FAIL: Expected %s Got: %s for locale: %s\n", result[i], aescstrdup(str, -1), locale[i]); + } + unum_close(currencyFmt); + free(str); } } /** @@ -447,56 +445,60 @@ static void TestCurrency(void) */ static void TestCurrencyPreEuro(void) { - UNumberFormat *currencyFmt; - UChar *str=NULL, *res=NULL; - int32_t lneed, i; - UFieldPosition pos; - UErrorCode status = U_ZERO_ERROR; - - const char* locale[]={ + UNumberFormat *currencyFmt; + UChar *str=NULL, *res=NULL; + int32_t lneed, i; + UFieldPosition pos; + UErrorCode status = U_ZERO_ERROR; + + const char* locale[]={ "ca_ES_PREEURO", "de_LU_PREEURO", "en_IE_PREEURO", "fi_FI_PREEURO", "fr_LU_PREEURO", "it_IT_PREEURO", "pt_PT_PREEURO", "de_AT_PREEURO", "el_GR_PREEURO", "es_ES_PREEURO", "fr_BE_PREEURO", "ga_IE_PREEURO", "nl_BE_PREEURO", "de_DE_PREEURO", "en_BE_PREEURO", "eu_ES_PREEURO", "fr_FR_PREEURO", "gl_ES_PREEURO", "nl_NL_PREEURO", - }; - - const char* result[]={ - "\\u20A7 2", "2 F", "IR\\u00A31.50", "1,50 mk", "1,50 F", "\\u20A4 2", - "2 Esc.", "\\u00F6S 1,50", "1,50 \\u0394\\u03C1\\u03C7", "2 \\u20A7", "1,50 FB", "\\u00a31.50", - "1,50 BF", "1,50 DM", "1,50 BF", "\\u20A7 2", "1,50 F", "\\u20A7 2", + }; + + const char* result[]={ + "\\u20A7 2", "2 F", "\\u00A31.50", "1,50 mk", "1,50 F", "\\u20A4 2", + "1$50 Esc.", "\\u00F6S 1,50", "1,50 \\u0394\\u03C1\\u03C7", "2 \\u20A7", "1,50 FB", "\\u00a31.50", + "1,50 BF", "1,50 DM", "1,50 BF", "\\u20A7 2", "1,50 F", "\\u20A7 2", "fl 1,50" - }; - - log_verbose("\nTesting the number format with different currency patterns\n"); - for(i=0; i < 19; i++) + }; + + log_verbose("\nTesting the number format with different currency patterns\n"); + for(i=0; i < 19; i++) { - char cStr[20]={0}; - currencyFmt = unum_open(UNUM_CURRENCY, NULL,0,locale[i],NULL, &status); - if(U_FAILURE(status)){ - log_err("Error in the construction of number format with style currency:\n%s\n", - myErrorName(status)); - } - lneed=0; - lneed= unum_formatDouble(currencyFmt, 1.50, NULL, lneed, NULL, &status); - if(status==U_BUFFER_OVERFLOW_ERROR){ - status=U_ZERO_ERROR; - str=(UChar*)malloc(sizeof(UChar) * (lneed+1) ); - pos.field = 0; - unum_formatDouble(currencyFmt, 1.50, str, lneed+1, &pos, &status); - } - if(U_FAILURE(status)) { - log_err("Error in formatting using unum_formatDouble(.....): %s\n", myErrorName(status) ); - } - res=(UChar*)malloc(sizeof(UChar) * (strlen(result[i])+1) ); - u_unescape(result[i],res,(int32_t)(strlen(result[i])+1)); - u_UCharsToChars(str,cStr,u_strlen(str)); - if (u_strcmp(str, res) != 0){ - log_err("FAIL: Expected %s Got: %s for locale: %s\n", result[i],cStr,locale[i]); - } - - unum_close(currencyFmt); - free(str); - free(res); + char curID[256] = {0}; + uloc_canonicalize(locale[i], curID, 256, &status); + if(U_FAILURE(status)){ + log_err("Could not canonicalize %s. Error: %s \n", locale[i], u_errorName(status)); + continue; + } + currencyFmt = unum_open(UNUM_CURRENCY, NULL,0,curID,NULL, &status); + if(U_FAILURE(status)){ + log_err("Error in the construction of number format with style currency:\n%s\n", + myErrorName(status)); + } + lneed=0; + lneed= unum_formatDouble(currencyFmt, 1.50, NULL, lneed, NULL, &status); + if(status==U_BUFFER_OVERFLOW_ERROR){ + status=U_ZERO_ERROR; + str=(UChar*)malloc(sizeof(UChar) * (lneed+1) ); + pos.field = 0; + unum_formatDouble(currencyFmt, 1.50, str, lneed+1, &pos, &status); + } + if(U_FAILURE(status)) { + log_err("Error in formatting using unum_formatDouble(.....): %s\n", myErrorName(status) ); + } + res=(UChar*)malloc(sizeof(UChar) * (strlen(result[i])+1) ); + u_unescape(result[i],res,(int32_t)(strlen(result[i])+1)); + if (u_strcmp(str, res) != 0){ + log_err("FAIL: Expected %s Got: %s for locale: %s\n", result[i],aescstrdup(str, -1),locale[i]); + } + + unum_close(currencyFmt); + free(str); + free(res); } } @@ -507,77 +509,76 @@ static void TestCurrencyPreEuro(void) */ static void TestCurrencyObject(void) { - UNumberFormat *currencyFmt; - UChar *str=NULL, *res=NULL; - int32_t lneed, i; - UFieldPosition pos; - UErrorCode status = U_ZERO_ERROR; - - const char* locale[]={ - "fr_FR", - "fr_FR", - }; - - const char* currency[]={ - "", - "JPY", - }; - - const char* result[]={ - "1\\u00A0234,56 \\u20AC", - "1\\u00A0235 \\u00A5", - }; - - log_verbose("\nTesting the number format with different currency codes\n"); - for(i=0; i < 2; i++) + UNumberFormat *currencyFmt; + UChar *str=NULL, *res=NULL; + int32_t lneed, i; + UFieldPosition pos; + UErrorCode status = U_ZERO_ERROR; + + const char* locale[]={ + "fr_FR", + "fr_FR", + }; + + const char* currency[]={ + "", + "JPY", + }; + + const char* result[]={ + "1\\u00A0234,56 \\u20AC", + "1\\u00A0235 \\u00A5", + }; + + log_verbose("\nTesting the number format with different currency codes\n"); + for(i=0; i < 2; i++) { - char cStr[20]={0}; - UChar isoCode[16]={0}; - currencyFmt = unum_open(UNUM_CURRENCY, NULL,0,locale[i],NULL, &status); - if(U_FAILURE(status)){ - log_err("Error in the construction of number format with style currency:\n%s\n", - myErrorName(status)); - } - if (*currency[i]) { - u_uastrcpy(isoCode, currency[i]); - unum_setTextAttribute(currencyFmt, UNUM_CURRENCY_CODE, - isoCode, u_strlen(isoCode), &status); - if(U_FAILURE(status)) { - log_err("FAIL: can't set currency code %s\n", myErrorName(status) ); - } - } - unum_getTextAttribute(currencyFmt, UNUM_CURRENCY_CODE, - isoCode, sizeof(isoCode), &status); - if(U_FAILURE(status)) { - log_err("FAIL: can't get currency code %s\n", myErrorName(status) ); - } - u_UCharsToChars(isoCode,cStr,u_strlen(isoCode)); - log_verbose("ISO code %s\n", cStr); - if (*currency[i] && uprv_strcmp(cStr, currency[i])) { - log_err("FAIL: currency should be %s, but is %s\n", currency[i], cStr); - } - - lneed=0; - lneed= unum_formatDouble(currencyFmt, 1234.56, NULL, lneed, NULL, &status); - if(status==U_BUFFER_OVERFLOW_ERROR){ - status=U_ZERO_ERROR; - str=(UChar*)malloc(sizeof(UChar) * (lneed+1) ); - pos.field = 0; - unum_formatDouble(currencyFmt, 1234.56, str, lneed+1, &pos, &status); - } - if(U_FAILURE(status)) { - log_err("Error in formatting using unum_formatDouble(.....): %s\n", myErrorName(status) ); - } - res=(UChar*)malloc(sizeof(UChar) * (strlen(result[i])+1) ); - u_unescape(result[i],res, (int32_t)(strlen(result[i])+1)); - u_UCharsToChars(str,cStr,u_strlen(str)); - if (u_strcmp(str, res) != 0){ - log_err("FAIL: Expected %s Got: %s for locale: %s\n", result[i],cStr,locale[i]); - } - - unum_close(currencyFmt); - free(str); - free(res); + char cStr[20]={0}; + UChar isoCode[16]={0}; + currencyFmt = unum_open(UNUM_CURRENCY, NULL,0,locale[i],NULL, &status); + if(U_FAILURE(status)){ + log_err("Error in the construction of number format with style currency:\n%s\n", + myErrorName(status)); + } + if (*currency[i]) { + u_uastrcpy(isoCode, currency[i]); + unum_setTextAttribute(currencyFmt, UNUM_CURRENCY_CODE, + isoCode, u_strlen(isoCode), &status); + if(U_FAILURE(status)) { + log_err("FAIL: can't set currency code %s\n", myErrorName(status) ); + } + } + unum_getTextAttribute(currencyFmt, UNUM_CURRENCY_CODE, + isoCode, sizeof(isoCode), &status); + if(U_FAILURE(status)) { + log_err("FAIL: can't get currency code %s\n", myErrorName(status) ); + } + u_UCharsToChars(isoCode,cStr,u_strlen(isoCode)); + log_verbose("ISO code %s\n", cStr); + if (*currency[i] && uprv_strcmp(cStr, currency[i])) { + log_err("FAIL: currency should be %s, but is %s\n", currency[i], cStr); + } + + lneed=0; + lneed= unum_formatDouble(currencyFmt, 1234.56, NULL, lneed, NULL, &status); + if(status==U_BUFFER_OVERFLOW_ERROR){ + status=U_ZERO_ERROR; + str=(UChar*)malloc(sizeof(UChar) * (lneed+1) ); + pos.field = 0; + unum_formatDouble(currencyFmt, 1234.56, str, lneed+1, &pos, &status); + } + if(U_FAILURE(status)) { + log_err("Error in formatting using unum_formatDouble(.....): %s\n", myErrorName(status) ); + } + res=(UChar*)malloc(sizeof(UChar) * (strlen(result[i])+1) ); + u_unescape(result[i],res, (int32_t)(strlen(result[i])+1)); + if (u_strcmp(str, res) != 0){ + log_err("FAIL: Expected %s Got: %s for locale: %s\n", result[i],aescstrdup(str, -1),locale[i]); + } + + unum_close(currencyFmt); + free(str); + free(res); } } @@ -586,57 +587,57 @@ static void TestCurrencyObject(void) */ static void TestRounding487(void) { - UNumberFormat *nnf; - UErrorCode status = U_ZERO_ERROR; - /* this is supposed to open default date format, but later on it treats it like it is "en_US" + UNumberFormat *nnf; + UErrorCode status = U_ZERO_ERROR; + /* this is supposed to open default date format, but later on it treats it like it is "en_US" - very bad if you try to run the tests on machine where default locale is NOT "en_US" */ - /* nnf = unum_open(UNUM_DEFAULT, NULL, &status); */ - nnf = unum_open(UNUM_DEFAULT, NULL,0,"en_US",NULL, &status); - if(U_FAILURE(status)){ - log_err("FAIL: failure in the construction of number format: %s\n", myErrorName(status)); - } - roundingTest(nnf, 0.00159999, 4, "0.0016"); - roundingTest(nnf, 0.00995, 4, "0.01"); - - roundingTest(nnf, 12.3995, 3, "12.4"); - - roundingTest(nnf, 12.4999, 0, "12"); - roundingTest(nnf, - 19.5, 0, "-20"); - unum_close(nnf); + /* nnf = unum_open(UNUM_DEFAULT, NULL, &status); */ + nnf = unum_open(UNUM_DEFAULT, NULL,0,"en_US",NULL, &status); + if(U_FAILURE(status)){ + log_err("FAIL: failure in the construction of number format: %s\n", myErrorName(status)); + } + roundingTest(nnf, 0.00159999, 4, "0.0016"); + roundingTest(nnf, 0.00995, 4, "0.01"); + + roundingTest(nnf, 12.3995, 3, "12.4"); + + roundingTest(nnf, 12.4999, 0, "12"); + roundingTest(nnf, - 19.5, 0, "-20"); + unum_close(nnf); } /*-------------------------------------*/ static void roundingTest(UNumberFormat* nf, double x, int32_t maxFractionDigits, const char* expected) { - UChar *out = NULL; - UChar *res; - UFieldPosition pos; - UErrorCode status; - int32_t lneed; - status=U_ZERO_ERROR; - unum_setAttribute(nf, UNUM_MAX_FRACTION_DIGITS, maxFractionDigits); - lneed=0; - lneed=unum_formatDouble(nf, x, NULL, lneed, NULL, &status); - if(status==U_BUFFER_OVERFLOW_ERROR){ + UChar *out = NULL; + UChar *res; + UFieldPosition pos; + UErrorCode status; + int32_t lneed; status=U_ZERO_ERROR; - out=(UChar*)malloc(sizeof(UChar) * (lneed+1) ); - pos.field=0; - unum_formatDouble(nf, x, out, lneed+1, &pos, &status); - } - if(U_FAILURE(status)) { - log_err("Error in formatting using unum_formatDouble(.....): %s\n", myErrorName(status) ); - } - /*Need to use log_verbose here. Problem with the float*/ - /*printf("%f format with %d fraction digits to %s\n", x, maxFractionDigits, austrdup(out) );*/ - res=(UChar*)malloc(sizeof(UChar) * (strlen(expected)+1) ); - u_uastrcpy(res, expected); - if (u_strcmp(out, res) != 0) - log_err("FAIL: Expected: %s or %s\n", expected, austrdup(res) ); - free(res); - if(out != NULL) { - free(out); - } + unum_setAttribute(nf, UNUM_MAX_FRACTION_DIGITS, maxFractionDigits); + lneed=0; + lneed=unum_formatDouble(nf, x, NULL, lneed, NULL, &status); + if(status==U_BUFFER_OVERFLOW_ERROR){ + status=U_ZERO_ERROR; + out=(UChar*)malloc(sizeof(UChar) * (lneed+1) ); + pos.field=0; + unum_formatDouble(nf, x, out, lneed+1, &pos, &status); + } + if(U_FAILURE(status)) { + log_err("Error in formatting using unum_formatDouble(.....): %s\n", myErrorName(status) ); + } + /*Need to use log_verbose here. Problem with the float*/ + /*printf("%f format with %d fraction digits to %s\n", x, maxFractionDigits, austrdup(out) );*/ + res=(UChar*)malloc(sizeof(UChar) * (strlen(expected)+1) ); + u_uastrcpy(res, expected); + if (u_strcmp(out, res) != 0) + log_err("FAIL: Expected: %s or %s\n", expected, austrdup(res) ); + free(res); + if(out != NULL) { + free(out); + } } /* @@ -764,4 +765,70 @@ static void TestSecondaryGrouping(void) { unum_close(us); } +static void TestCurrencyKeywords(void) +{ + static const char *currencies[] = { + "ADD", "ADP", "AED", "AFA", "AFN", "AIF", "ALK", "ALL", "ALV", "ALX", "AMD", + "ANG", "AOA", "AOK", "AON", "AOR", "AOS", "ARA", "ARM", "ARP", "ARS", "ATS", + "AUD", "AUP", "AWG", "AZM", "BAD", "BAM", "BAN", "BBD", "BDT", "BEC", "BEF", + "BEL", "BGL", "BGM", "BGN", "BGO", "BGX", "BHD", "BIF", "BMD", "BMP", "BND", + "BOB", "BOL", "BOP", "BOV", "BRB", "BRC", "BRE", "BRL", "BRN", "BRR", "BRZ", + "BSD", "BSP", "BTN", "BTR", "BUK", "BUR", "BWP", "BYB", "BYL", "BYR", "BZD", + "BZH", "CAD", "CDF", "CDG", "CDL", "CFF", "CHF", "CKD", "CLC", "CLE", "CLF", + "CLP", "CMF", "CNP", "CNX", "CNY", "COB", "COF", "COP", "CRC", "CSC", "CSK", + "CUP", "CUX", "CVE", "CWG", "CYP", "CZK", "DDM", "DEM", "DES", "DJF", "DKK", + "DOP", "DZD", "DZF", "DZG", "ECS", "ECV", "EEK", "EGP", "ERN", "ESP", "ETB", + "ETD", "EUR", "FIM", "FIN", "FJD", "FJP", "FKP", "FOK", "FRF", "FRG", "GAF", + "GBP", "GEK", "GEL", "GHC", "GHO", "GHP", "GHR", "GIP", "GLK", "GMD", "GMP", + "GNF", "GNI", "GNS", "GPF", "GQE", "GQF", "GQP", "GRD", "GRN", "GTQ", "GUF", + "GWE", "GWM", "GWP", "GYD", "HKD", "HNL", "HRD", "HRK", "HTG", "HUF", "IBP", + "IDG", "IDJ", "IDN", "IDR", "IEP", "ILL", "ILP", "ILS", "IMP", "INR", "IQD", + "IRR", "ISK", "ITL", "JEP", "JMD", "JMP", "JOD", "JPY", "KES", "KGS", "KHO", + "KHR", "KID", "KMF", "KPP", "KPW", "KRH", "KRO", "KRW", "KWD", "KYD", "KZR", + "KZT", "LAK", "LBP", "LIF", "LKR", "LNR", "LRD", "LSL", "LTL", "LTT", "LUF", + "LVL", "LVR", "LYB", "LYD", "LYP", "MAD", "MAF", "MCF", "MCG", "MDC", "MDL", + "MDR", "MGA", "MGF", "MHD", "MKD", "MKN", "MLF", "MMK", "MMX", "MNT", "MOP", + "MQF", "MRO", "MTL", "MTP", "MUR", "MVP", "MVR", "MWK", "MWP", "MXN", "MXP", + "MXV", "MYR", "MZE", "MZM", "NAD", "NCF", "NGN", "NGP", "NHF", "NIC", "NIG", + "NIO", "NLG", "NOK", "NPR", "NZD", "NZP", "OMR", "OMS", "PAB", "PDK", "PDN", + "PDR", "PEI", "PEN", "PES", "PGK", "PHP", "PKR", "PLN", "PLX", "PLZ", "PSP", + "PTC", "PTE", "PYG", "QAR", "REF", "ROL", "RON", "RUB", "RUR", "RWF", "SAR", + "SAS", "SBD", "SCR", "SDD", "SDP", "SEK", "SGD", "SHP", "SIB", "SIT", "SKK", + "SLL", "SML", "SOS", "SQS", "SRG", "SSP", "STD", "STE", "SUN", "SUR", "SVC", + "SYP", "SZL", "TCC", "TDF", "THB", "TJR", "TJS", "TMM", "TND", "TOP", "TOS", + "TPE", "TPP", "TRL", "TTD", "TTO", "TVD", "TWD", "TZS", "UAH", "UAK", "UGS", + "UGX", "USD", "USN", "USS", "UYF", "UYP", "UYU", "UZC", "UZS", "VAL", "VDD", + "VDN", "VDP", "VEB", "VGD", "VND", "VNN", "VNR", "VNS", "VUV", "WSP", "WST", + "XAD", "XAF", "XAM", "XAU", "XBA", "XBB", "XBC", "XBD", "XCD", "XCF", "XDR", + "XEF", "XEU", "XFO", "XFU", "XID", "XMF", "XNF", "XOF", "XPF", "XPS", "XSS", + "XTR", "YDD", "YEI", "YER", "YUD", "YUF", "YUG", "YUM", "YUN", "YUO", "YUR", + "ZAL", "ZAP", "ZAR", "ZMK", "ZMP", "ZRN", "ZRZ", "ZWD" + }; + + UErrorCode status = U_ZERO_ERROR; + int32_t i = 0, j = 0; + int32_t noLocales = uloc_countAvailable(); + char locale[256]; + char currLoc[256]; + UChar result[4]; + UChar currBuffer[256]; + + + for(i = 0; i < noLocales; i++) { + strcpy(currLoc, uloc_getAvailable(i)); + for(j = 0; j < sizeof(currencies)/sizeof(currencies[0]); j++) { + strcpy(locale, currLoc); + strcat(locale, "@currency="); + strcat(locale, currencies[j]); + ucurr_forLocale(locale, result, 4, &status); + u_charsToUChars(currencies[j], currBuffer, 3); + currBuffer[3] = 0; + if(u_strcmp(currBuffer, result) != 0) { + log_err("Didn't get the right currency for %s\n", locale); + } + } + + } +} + #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/test/cintltst/cnmdptst.h b/icuSources/test/cintltst/cnmdptst.h index 0d8dd73b..38b4a2a9 100644 --- a/icuSources/test/cintltst/cnmdptst.h +++ b/icuSources/test/cintltst/cnmdptst.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2003, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** @@ -49,6 +49,8 @@ static void TestSecondaryGrouping(void); /*Internal functions used*/ static void roundingTest(UNumberFormat*, double, int32_t, const char*); +static void TestCurrencyKeywords(void); + #endif /* #if !UCONFIG_NO_FORMATTING */ #endif diff --git a/icuSources/test/cintltst/cnormtst.c b/icuSources/test/cintltst/cnormtst.c index 8a5d3da0..91d21421 100644 --- a/icuSources/test/cintltst/cnormtst.c +++ b/icuSources/test/cintltst/cnormtst.c @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** @@ -15,6 +15,8 @@ *********************************************************************************/ /*tests for u_normalization*/ #include "unicode/utypes.h" +#include "unicode/unorm.h" +#include "unormimp.h" #include "cintltst.h" #if UCONFIG_NO_NORMALIZATION @@ -32,7 +34,7 @@ void addNormTest(TestNode** root) { #include "unicode/unorm.h" #include "cnormtst.h" -#define ARRAY_LENGTH(array) (sizeof (array) / sizeof (*array)) +#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof ((array)[0])) static void TestAPI(void); @@ -51,6 +53,12 @@ static void TestIsNormalized(void); static void TestFCNFKCClosure(void); +static void +TestQuickCheckPerCP(void); + +static void +TestComposition(void); + const static char* canonTests[][3] = { /* Input*/ /*Decomposed*/ /*Composed*/ { "cat", "cat", "cat" }, @@ -121,12 +129,14 @@ void addNormTest(TestNode** root) addTest(root, &TestCompatDecompCompose, "tscoll/cnormtst/CompatDecompCompose"); addTest(root, &TestNull, "tscoll/cnormtst/TestNull"); addTest(root, &TestQuickCheck, "tscoll/cnormtst/TestQuickCheck"); + addTest(root, &TestQuickCheckPerCP, "tscoll/cnormtst/TestQuickCheckPerCP"); addTest(root, &TestIsNormalized, "tscoll/cnormtst/TestIsNormalized"); addTest(root, &TestCheckFCD, "tscoll/cnormtst/TestCheckFCD"); addTest(root, &TestNormCoverage, "tscoll/cnormtst/TestNormCoverage"); addTest(root, &TestConcatenate, "tscoll/cnormtst/TestConcatenate"); addTest(root, &TestNextPrevious, "tscoll/cnormtst/TestNextPrevious"); addTest(root, &TestFCNFKCClosure, "tscoll/cnormtst/TestFCNFKCClosure"); + addTest(root, &TestComposition, "tscoll/cnormtst/TestComposition"); } void TestDecomp() @@ -137,7 +147,7 @@ void TestDecomp() status = U_ZERO_ERROR; resLen=0; log_verbose("Testing unorm_normalize with Decomp canonical\n"); - for(x=0; x < ARRAY_LENGTH(canonTests); x++) + for(x=0; x < LENGTHOF(canonTests); x++) { source=CharsToUChars(canonTests[x][0]); neededLen= unorm_normalize(source, u_strlen(source), UNORM_NFD, 0, NULL, 0, &status); @@ -166,7 +176,7 @@ void TestCompatDecomp() status = U_ZERO_ERROR; resLen=0; log_verbose("Testing unorm_normalize with Decomp compat\n"); - for(x=0; x < ARRAY_LENGTH(compatTests); x++) + for(x=0; x < LENGTHOF(compatTests); x++) { source=CharsToUChars(compatTests[x][0]); neededLen= unorm_normalize(source, u_strlen(source), UNORM_NFKD, 0, NULL, 0, &status); @@ -195,7 +205,7 @@ void TestCanonDecompCompose() status = U_ZERO_ERROR; resLen=0; log_verbose("Testing unorm_normalize with Decomp can compose compat\n"); - for(x=0; x < ARRAY_LENGTH(canonTests); x++) + for(x=0; x < LENGTHOF(canonTests); x++) { source=CharsToUChars(canonTests[x][0]); neededLen= unorm_normalize(source, u_strlen(source), UNORM_NFC, 0, NULL, 0, &status); @@ -224,7 +234,7 @@ void TestCompatDecompCompose() status = U_ZERO_ERROR; resLen=0; log_verbose("Testing unorm_normalize with compat decomp compose can\n"); - for(x=0; x < ARRAY_LENGTH(compatTests); x++) + for(x=0; x < LENGTHOF(compatTests); x++) { source=CharsToUChars(compatTests[x][0]); neededLen= unorm_normalize(source, u_strlen(source), UNORM_NFKC, 0, NULL, 0, &status); @@ -503,7 +513,7 @@ static void TestQuickCheckStringResult() UChar *c = NULL; UErrorCode error = U_ZERO_ERROR; - for (count = 0; count < ARRAY_LENGTH(canonTests); count ++) + for (count = 0; count < LENGTHOF(canonTests); count ++) { d = CharsToUChars(canonTests[count][1]); c = CharsToUChars(canonTests[count][2]); @@ -525,7 +535,7 @@ static void TestQuickCheckStringResult() free(c); } - for (count = 0; count < ARRAY_LENGTH(compatTests); count ++) + for (count = 0; count < LENGTHOF(compatTests); count ++) { d = CharsToUChars(compatTests[count][1]); c = CharsToUChars(compatTests[count][2]); @@ -607,7 +617,7 @@ static void TestIsNormalized(void) { } /* specific cases */ - for(i=0; i 0x7e, null terminate if possible */ @@ -92,6 +99,7 @@ static void TestNumberFormat() double d1; int32_t l1; double d = -10456.37; + double a = 1234.56, a1 = 1235.0; int32_t l = 100000000; UFieldPosition pos1; UFieldPosition pos2; @@ -261,6 +269,61 @@ free(result); log_err("Fail: Error in parsing\n"); else log_verbose("Pass: parsing successful\n"); + if (result) + free(result); + result = 0; + + + /* Testing unum_formatDoubleCurrency / unum_parseDoubleCurrency */ + log_verbose("\nTesting unum_formatDoubleCurrency\n"); + u_uastrcpy(temp1, "Y1,235"); + temp1[0] = 0xA5; /* Yen sign */ + u_uastrcpy(temp, "JPY"); + resultlength=0; + pos2.field = 0; /* integer part */ + resultlengthneeded=unum_formatDoubleCurrency(cur_def, a, temp, NULL, resultlength, &pos2, &status); + if (status==U_BUFFER_OVERFLOW_ERROR) { + status=U_ZERO_ERROR; + resultlength=resultlengthneeded+1; + result=(UChar*)malloc(sizeof(UChar) * resultlength); + unum_formatDoubleCurrency(cur_def, a, temp, result, resultlength, &pos2, &status); + } + if (U_FAILURE(status)) { + log_err("Error in formatting using unum_formatDouble(.....): %s\n", myErrorName(status)); + } + if (result && u_strcmp(result, temp1)==0) { + log_verbose("Pass: Number Formatting using unum_formatDouble() Successful\n"); + } else { + log_err("FAIL: Error in number formatting using unum_formatDouble()\n"); + } + if (pos2.beginIndex == 1 && pos2.endIndex == 6) { + log_verbose("Pass: Complete number formatting using unum_format() successful\n"); + } else { + log_err("Fail: Error in complete number Formatting using unum_formatDouble()\nGot: b=%d end=%d\nExpected: b=1 end=6", + pos1.beginIndex, pos1.endIndex); + } + + log_verbose("\nTesting unum_parseDoubleCurrency\n"); + parsepos=0; + d1=unum_parseDoubleCurrency(cur_def, result, u_strlen(result), &parsepos, temp2, &status); + if (U_FAILURE(status)) { + log_err("parse failed. The error is : %s\n", myErrorName(status)); + } + /* Note: a==1234.56, but on parse expect a1=1235.0 */ + if (d1!=a1) { + log_err("Fail: Error in parsing currency, got %f, expected %f\n", d1, a1); + } else { + log_verbose("Pass: parsed currency ammount successfully\n"); + } + if (u_strcmp(temp2, temp)==0) { + log_verbose("Pass: parsed correct currency\n"); + } else { + log_err("Fail: parsed incorrect currency\n"); + } + +free(result); + result = 0; + /* performance testing */ u_uastrcpy(temp1, "$462.12345"); @@ -593,9 +656,6 @@ free(result); else log_verbose("Pass: get and settextAttributes with negative suffix works fine\n"); - - - /*Testing unum_getAttribute and unum_setAttribute() */ log_verbose("\nTesting get and set Attributes\n"); attr=UNUM_GROUPING_SIZE; @@ -616,6 +676,15 @@ free(result); else log_verbose("Pass:setting and getting attributes for UNUM_MULTIPLIER works fine\n"); + attr=UNUM_SECONDARY_GROUPING_SIZE; + newvalue=unum_getAttribute(def, attr); + newvalue=2; + unum_setAttribute(def, attr, newvalue); + if(unum_getAttribute(def,attr) != 2) + log_err("error in setting and getting attributes for UNUM_SECONDARY_GROUPING_SIZE\n"); + else + log_verbose("Pass:setting and getting attributes for UNUM_SECONDARY_GROUPING_SIZE works fine\n"); + /*testing set and get Attributes extensively */ log_verbose("\nTesting get and set attributes extensively\n"); for(attr=UNUM_PARSE_INT_ONLY; attr<= UNUM_PADDING_POSITION; attr=(UNumberFormatAttribute)((int32_t)attr + 1) ) @@ -675,6 +744,47 @@ free(result); } +static void TestSignificantDigits() +{ + UChar temp[128]; + int32_t resultlengthneeded; + int32_t resultlength; + UErrorCode status = U_ZERO_ERROR; + UChar *result = NULL; + UNumberFormat* fmt; + double d = 123456.789; + + u_uastrcpy(temp, "###0.0#"); + fmt=unum_open(UNUM_IGNORE, temp, -1, NULL, NULL,&status); + if (U_FAILURE(status)) { + log_err("got unexpected error for unum_open: '%s'\n", u_errorName(status)); + } + unum_setAttribute(fmt, UNUM_SIGNIFICANT_DIGITS_USED, TRUE); + unum_setAttribute(fmt, UNUM_MAX_SIGNIFICANT_DIGITS, 6); + + u_uastrcpy(temp, "123457"); + resultlength=0; + resultlengthneeded=unum_formatDouble(fmt, d, NULL, resultlength, NULL, &status); + if(status==U_BUFFER_OVERFLOW_ERROR) + { + status=U_ZERO_ERROR; + resultlength=resultlengthneeded+1; + result=(UChar*)malloc(sizeof(UChar) * resultlength); + unum_formatDouble(fmt, d, result, resultlength, NULL, &status); + } + if(U_FAILURE(status)) + { + log_err("Error in formatting using unum_formatDouble(.....): %s\n", myErrorName(status)); + return; + } + if(u_strcmp(result, temp)==0) + log_verbose("Pass: Number Formatting using unum_formatDouble() Successful\n"); + else + log_err("FAIL: Error in number formatting using unum_formatDouble()\n"); + free(result); + unum_close(fmt); +} + static void TestNumberFormatPadding() { UChar *result=NULL; @@ -786,4 +896,389 @@ free(result); unum_close(pattern); } +static UBool +withinErr(double a, double b, double err) { + return uprv_fabs(a - b) < uprv_fabs(a * err); +} + +static void TestInt64Format() { + UChar temp1[512]; + UChar result[512]; + UNumberFormat *fmt; + UErrorCode status = U_ZERO_ERROR; + const double doubleInt64Max = (double)U_INT64_MAX; + const double doubleInt64Min = (double)U_INT64_MIN; + const double doubleBig = 10.0 * (double)U_INT64_MAX; + int32_t val32; + int64_t val64; + double valDouble; + int32_t parsepos; + + /* create a number format using unum_openPattern(....) */ + log_verbose("\nTesting Int64Format\n"); + u_uastrcpy(temp1, "#.#E0"); + fmt = unum_open(UNUM_IGNORE, temp1, u_strlen(temp1), NULL, NULL, &status); + if(U_FAILURE(status)) { + log_err("error in unum_openPattern(): %s\n", myErrorName(status)); + } else { + unum_setAttribute(fmt, UNUM_MAX_FRACTION_DIGITS, 20); + unum_formatInt64(fmt, U_INT64_MAX, result, 512, NULL, &status); + if (U_FAILURE(status)) { + log_err("error in unum_format(): %s\n", myErrorName(status)); + } else { + log_verbose("format int64max: '%s'\n", result); + parsepos = 0; + val32 = unum_parse(fmt, result, u_strlen(result), &parsepos, &status); + if (status != U_INVALID_FORMAT_ERROR) { + log_err("parse didn't report error: %s\n", myErrorName(status)); + } else if (val32 != INT32_MAX) { + log_err("parse didn't pin return value, got: %d\n", val32); + } + + status = U_ZERO_ERROR; + parsepos = 0; + val64 = unum_parseInt64(fmt, result, u_strlen(result), &parsepos, &status); + if (U_FAILURE(status)) { + log_err("parseInt64 returned error: %s\n", myErrorName(status)); + } else if (val64 != U_INT64_MAX) { + log_err("parseInt64 returned incorrect value, got: %ld\n", val64); + } + + status = U_ZERO_ERROR; + parsepos = 0; + valDouble = unum_parseDouble(fmt, result, u_strlen(result), &parsepos, &status); + if (U_FAILURE(status)) { + log_err("parseDouble returned error: %s\n", myErrorName(status)); + } else if (valDouble != doubleInt64Max) { + log_err("parseDouble returned incorrect value, got: %g\n", valDouble); + } + } + + unum_formatInt64(fmt, U_INT64_MIN, result, 512, NULL, &status); + if (U_FAILURE(status)) { + log_err("error in unum_format(): %s\n", myErrorName(status)); + } else { + log_verbose("format int64min: '%s'\n", result); + parsepos = 0; + val32 = unum_parse(fmt, result, u_strlen(result), &parsepos, &status); + if (status != U_INVALID_FORMAT_ERROR) { + log_err("parse didn't report error: %s\n", myErrorName(status)); + } else if (val32 != INT32_MIN) { + log_err("parse didn't pin return value, got: %d\n", val32); + } + + status = U_ZERO_ERROR; + parsepos = 0; + val64 = unum_parseInt64(fmt, result, u_strlen(result), &parsepos, &status); + if (U_FAILURE(status)) { + log_err("parseInt64 returned error: %s\n", myErrorName(status)); + } else if (val64 != U_INT64_MIN) { + log_err("parseInt64 returned incorrect value, got: %ld\n", val64); + } + + status = U_ZERO_ERROR; + parsepos = 0; + valDouble = unum_parseDouble(fmt, result, u_strlen(result), &parsepos, &status); + if (U_FAILURE(status)) { + log_err("parseDouble returned error: %s\n", myErrorName(status)); + } else if (valDouble != doubleInt64Min) { + log_err("parseDouble returned incorrect value, got: %g\n", valDouble); + } + } + + unum_formatDouble(fmt, doubleBig, result, 512, NULL, &status); + if (U_FAILURE(status)) { + log_err("error in unum_format(): %s\n", myErrorName(status)); + } else { + log_verbose("format doubleBig: '%s'\n", result); + parsepos = 0; + val32 = unum_parse(fmt, result, u_strlen(result), &parsepos, &status); + if (status != U_INVALID_FORMAT_ERROR) { + log_err("parse didn't report error: %s\n", myErrorName(status)); + } else if (val32 != INT32_MAX) { + log_err("parse didn't pin return value, got: %d\n", val32); + } + + status = U_ZERO_ERROR; + parsepos = 0; + val64 = unum_parseInt64(fmt, result, u_strlen(result), &parsepos, &status); + if (status != U_INVALID_FORMAT_ERROR) { + log_err("parseInt64 didn't report error error: %s\n", myErrorName(status)); + } else if (val64 != U_INT64_MAX) { + log_err("parseInt64 returned incorrect value, got: %ld\n", val64); + } + + status = U_ZERO_ERROR; + parsepos = 0; + valDouble = unum_parseDouble(fmt, result, u_strlen(result), &parsepos, &status); + if (U_FAILURE(status)) { + log_err("parseDouble returned error: %s\n", myErrorName(status)); + } else if (!withinErr(valDouble, doubleBig, 1e-15)) { + log_err("parseDouble returned incorrect value, got: %g\n", valDouble); + } + } + } + unum_close(fmt); +} + + +static void test_fmt(UNumberFormat* fmt, UBool isDecimal) { + char temp[512]; + UChar buffer[512]; + int32_t BUFSIZE = sizeof(buffer)/sizeof(buffer[0]); + double vals[] = { + -.2, 0, .2, 5.5, 15.2, 250, 123456789 + }; + int i; + + for (i = 0; i < sizeof(vals)/sizeof(vals[0]); ++i) { + UErrorCode status = U_ZERO_ERROR; + unum_formatDouble(fmt, vals[i], buffer, BUFSIZE, NULL, &status); + if (U_FAILURE(status)) { + log_err("failed to format: %g, returned %s\n", vals[i], u_errorName(status)); + } else { + u_austrcpy(temp, buffer); + log_verbose("formatting %g returned '%s'\n", vals[i], temp); + } + } + + /* check APIs now */ + { + UErrorCode status = U_ZERO_ERROR; + UParseError perr; + u_uastrcpy(buffer, "#,##0.0#"); + unum_applyPattern(fmt, FALSE, buffer, -1, &perr, &status); + if (isDecimal ? U_FAILURE(status) : (status != U_UNSUPPORTED_ERROR)) { + log_err("got unexpected error for applyPattern: '%s'\n", u_errorName(status)); + } + } + + { + int isLenient = unum_getAttribute(fmt, UNUM_LENIENT_PARSE); + log_verbose("lenient: 0x%x\n", isLenient); + if (isDecimal ? (isLenient != -1) : (isLenient == TRUE)) { + log_err("didn't expect lenient value: %d\n", isLenient); + } + + unum_setAttribute(fmt, UNUM_LENIENT_PARSE, TRUE); + isLenient = unum_getAttribute(fmt, UNUM_LENIENT_PARSE); + if (isDecimal ? (isLenient != -1) : (isLenient == FALSE)) { + log_err("didn't expect lenient value after set: %d\n", isLenient); + } + } + + { + double val2; + double val = unum_getDoubleAttribute(fmt, UNUM_LENIENT_PARSE); + if (val != -1) { + log_err("didn't expect double attribute\n"); + } + val = unum_getDoubleAttribute(fmt, UNUM_ROUNDING_INCREMENT); + if ((val == -1) == isDecimal) { + log_err("didn't expect -1 rounding increment\n"); + } + unum_setDoubleAttribute(fmt, UNUM_ROUNDING_INCREMENT, val+.5); + val2 = unum_getDoubleAttribute(fmt, UNUM_ROUNDING_INCREMENT); + if (isDecimal && (val2 - val != .5)) { + log_err("set rounding increment had no effect on decimal format"); + } + } + + { + UErrorCode status = U_ZERO_ERROR; + int len = unum_getTextAttribute(fmt, UNUM_DEFAULT_RULESET, buffer, BUFSIZE, &status); + if (isDecimal ? (status != U_UNSUPPORTED_ERROR) : U_FAILURE(status)) { + log_err("got unexpected error for get default ruleset: '%s'\n", u_errorName(status)); + } + if (U_SUCCESS(status)) { + u_austrcpy(temp, buffer); + log_verbose("default ruleset: '%s'\n", temp); + } + + status = U_ZERO_ERROR; + len = unum_getTextAttribute(fmt, UNUM_PUBLIC_RULESETS, buffer, BUFSIZE, &status); + if (isDecimal ? (status != U_UNSUPPORTED_ERROR) : U_FAILURE(status)) { + log_err("got unexpected error for get public rulesets: '%s'\n", u_errorName(status)); + } + if (U_SUCCESS(status)) { + u_austrcpy(temp, buffer); + log_verbose("public rulesets: '%s'\n", temp); + + /* set the default ruleset to the first one found, and retry */ + + if (len > 0) { + for (i = 0; i < len && temp[i] != ';'; ++i){}; + if (i < len) { + buffer[i] = 0; + unum_setTextAttribute(fmt, UNUM_DEFAULT_RULESET, buffer, -1, &status); + if (U_FAILURE(status)) { + log_err("unexpected error setting default ruleset: '%s'\n", u_errorName(status)); + } else { + int len2 = unum_getTextAttribute(fmt, UNUM_DEFAULT_RULESET, buffer, BUFSIZE, &status); + if (U_FAILURE(status)) { + log_err("could not fetch default ruleset: '%s'\n", u_errorName(status)); + } else if (len2 != i) { + u_austrcpy(temp, buffer); + log_err("unexpected ruleset len: %d ex: %d val: %s\n", len2, i, temp); + } else { + for (i = 0; i < sizeof(vals)/sizeof(vals[0]); ++i) { + status = U_ZERO_ERROR; + unum_formatDouble(fmt, vals[i], buffer, BUFSIZE, NULL, &status); + if (U_FAILURE(status)) { + log_err("failed to format: %g, returned %s\n", vals[i], u_errorName(status)); + } else { + u_austrcpy(temp, buffer); + log_verbose("formatting %g returned '%s'\n", vals[i], temp); + } + } + } + } + } + } + } + } + + { + UErrorCode status = U_ZERO_ERROR; + unum_toPattern(fmt, FALSE, buffer, BUFSIZE, &status); + if (U_SUCCESS(status)) { + u_austrcpy(temp, buffer); + log_verbose("pattern: '%s'\n", temp); + } else if (status != U_BUFFER_OVERFLOW_ERROR) { + log_err("toPattern failed unexpectedly: %s\n", u_errorName(status)); + } else { + log_verbose("pattern too long to display\n"); + } + } + + { + UErrorCode status = U_ZERO_ERROR; + int len = unum_getSymbol(fmt, UNUM_CURRENCY_SYMBOL, buffer, BUFSIZE, &status); + if (isDecimal ? U_FAILURE(status) : (status != U_UNSUPPORTED_ERROR)) { + log_err("unexpected error getting symbol: '%s'\n", u_errorName(status)); + } + + unum_setSymbol(fmt, UNUM_CURRENCY_SYMBOL, buffer, len, &status); + if (isDecimal ? U_FAILURE(status) : (status != U_UNSUPPORTED_ERROR)) { + log_err("unexpected error setting symbol: '%s'\n", u_errorName(status)); + } + } +} + +static void TestNonExistentCurrency() { + UNumberFormat *format; + UErrorCode status = U_ZERO_ERROR; + UChar currencySymbol[8]; + static const UChar QQQ[] = {0x51, 0x51, 0x51, 0}; + + /* Get a non-existent currency and make sure it returns the correct currency code. */ + format = unum_open(UNUM_CURRENCY, NULL, 0, "th_TH@currency=QQQ", NULL, &status); + if (format == NULL || U_FAILURE(status)) { + log_err("unum_open did not return expected result for non-existent requested currency: '%s'\n", u_errorName(status)); + } + else { + unum_getSymbol(format, + UNUM_CURRENCY_SYMBOL, + currencySymbol, + sizeof(currencySymbol)/sizeof(currencySymbol[0]), + &status); + if (u_strcmp(currencySymbol, QQQ) != 0) { + log_err("unum_open set the currency to QQQ\n"); + } + } + unum_close(format); +} + +static void TestRBNFFormat() { + UErrorCode status; + UParseError perr; + UChar pat[1024]; + UChar tempUChars[512]; + UNumberFormat *formats[5]; + int COUNT = sizeof(formats)/sizeof(formats[0]); + int i; + + for (i = 0; i < COUNT; ++i) { + formats[i] = 0; + } + + /* instantiation */ + status = U_ZERO_ERROR; + u_uastrcpy(pat, "#,##0.0#;(#,##0.0#)"); + formats[0] = unum_open(UNUM_PATTERN_DECIMAL, pat, -1, "en_US", &perr, &status); + if (U_FAILURE(status)) { + log_err("unable to open decimal pattern"); + } + + status = U_ZERO_ERROR; + formats[1] = unum_open(UNUM_SPELLOUT, NULL, 0, "en_US", &perr, &status); + if (U_FAILURE(status)) { + log_err("unable to open spellout"); + } + + status = U_ZERO_ERROR; + formats[2] = unum_open(UNUM_ORDINAL, NULL, 0, "en_US", &perr, &status); + if (U_FAILURE(status)) { + log_err("unable to open ordinal"); + } + + status = U_ZERO_ERROR; + formats[3] = unum_open(UNUM_DURATION, NULL, 0, "en_US", &perr, &status); + if (U_FAILURE(status)) { + log_err("unable to open duration"); + } + + status = U_ZERO_ERROR; + u_uastrcpy(pat, + "%standard:\n" + "-x: minus >>;\n" + "x.x: << point >>;\n" + "zero; one; two; three; four; five; six; seven; eight; nine;\n" + "ten; eleven; twelve; thirteen; fourteen; fifteen; sixteen;\n" + "seventeen; eighteen; nineteen;\n" + "20: twenty[->>];\n" + "30: thirty[->>];\n" + "40: forty[->>];\n" + "50: fifty[->>];\n" + "60: sixty[->>];\n" + "70: seventy[->>];\n" + "80: eighty[->>];\n" + "90: ninety[->>];\n" + "100: =#,##0=;\n"); + u_uastrcpy(tempUChars, + "%simple:\n" + "=%standard=;\n" + "20: twenty[ and change];\n" + "30: thirty[ and change];\n" + "40: forty[ and change];\n" + "50: fifty[ and change];\n" + "60: sixty[ and change];\n" + "70: seventy[ and change];\n" + "80: eighty[ and change];\n" + "90: ninety[ and change];\n" + "100: =#,##0=;\n" + "%bogus:\n" + "0.x: tiny;\n" + "x.x: << point something;\n" + "=%standard=;\n" + "20: some reasonable number;\n" + "100: some substantial number;\n" + "100,000,000: some huge number;\n"); + /* This is to get around some compiler warnings about char * string length. */ + u_strcat(pat, tempUChars); + formats[4] = unum_open(UNUM_PATTERN_RULEBASED, pat, -1, "en_US", &perr, &status); + if (U_FAILURE(status)) { + log_err("unable to open rulebased pattern"); + } + + for (i = 0; i < COUNT; ++i) { + log_verbose("\n\ntesting format %d\n", i); + test_fmt(formats[i], (UBool)(i == 0)); + } + + for (i = 0; i < COUNT; ++i) { + unum_close(formats[i]); + } +} + #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/test/cintltst/cnumtst.h b/icuSources/test/cintltst/cnumtst.h index 1757c757..9f7aae2f 100644 --- a/icuSources/test/cintltst/cnumtst.h +++ b/icuSources/test/cintltst/cnumtst.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** @@ -23,15 +23,32 @@ #include "cintltst.h" - /** - * The function used to test the Number format API - **/ - static void TestNumberFormat(void); +/** + * The function used to test the Number format API + **/ +static void TestNumberFormat(void); - /** - * The function used to test the Number format API with padding - **/ - static void TestNumberFormatPadding(void); +/** + * The function used to test significant digits in the Number format API + **/ +static void TestSignificantDigits(void); + +/** + * The function used to test the Number format API with padding + **/ +static void TestNumberFormatPadding(void); + +/** + * The function used to test the Number format API with padding + **/ +static void TestInt64Format(void); + +static void TestNonExistentCurrency(void); + +/** + * Test RBNF access through unumfmt APIs. + **/ +static void TestRBNFFormat(void); #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/test/cintltst/crestst.c b/icuSources/test/cintltst/crestst.c index d6857046..b6cec878 100644 --- a/icuSources/test/cintltst/crestst.c +++ b/icuSources/test/cintltst/crestst.c @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************* @@ -20,7 +20,7 @@ #include "unicode/ustring.h" #include "cstring.h" #include "filestrm.h" -#include "cmemory.h" +#include #define RESTEST_HEAP_CHECK 0 @@ -28,8 +28,13 @@ #include "crestst.h" #include "unicode/ctest.h" +#include "ucol_imp.h" /* collation */ + +#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) + static void TestOpenDirect(void); static void TestFallback(void); +static void TestTable32(void); static void TestFileStream(void); /*****************************************************************************/ @@ -90,10 +95,13 @@ void addResourceBundleTest(TestNode** root) { addTest(root, &TestConstruction1, "tsutil/crestst/TestConstruction1"); addTest(root, &TestOpenDirect, "tsutil/crestst/TestOpenDirect"); - addTest(root, &TestResourceBundles, "tsutil/crestst/TestResourceBundle"); + addTest(root, &TestResourceBundles, "tsutil/crestst/TestResourceBundles"); + addTest(root, &TestTable32, "tsutil/crestst/TestTable32"); addTest(root, &TestFallback, "tsutil/crestst/TestFallback"); addTest(root, &TestAliasConflict, "tsutil/crestst/TestAliasConflict"); addTest(root, &TestFileStream, "tsutil/crestst/TestFileStream"); + addTest(root, &TestGetSize, "tsutil/crestst/TestGetSize"); + addTest(root, &TestGetLocaleByType, "tsutil/crestst/TestGetLocaleByType"); } @@ -403,6 +411,7 @@ static void TestFallback() { UErrorCode status = U_ZERO_ERROR; UResourceBundle *fr_FR = NULL; + UResourceBundle *subResource = NULL; const UChar *junk; /* ignored */ int32_t resultLen; @@ -426,20 +435,20 @@ static void TestFallback() status = U_ZERO_ERROR; /* OK first one. This should be a Default value. */ - junk = ures_getStringByKey(fr_FR, "%%PREEURO", &resultLen, &status); + subResource = ures_getByKey(fr_FR, "MeasurementSystem", NULL, &status); if(status != U_USING_DEFAULT_WARNING) { - log_data_err("Expected U_USING_DEFAULT_ERROR when trying to get %%PREEURO from fr_FR, got %s\n", + log_data_err("Expected U_USING_DEFAULT_ERROR when trying to get CurrencyMap from fr_FR, got %s\n", u_errorName(status)); } - + ures_close(subResource); status = U_ZERO_ERROR; /* and this is a Fallback, to fr */ - junk = ures_getStringByKey(fr_FR, "DayNames", &resultLen, &status); + junk = ures_getStringByKey(fr_FR, "Countries", &resultLen, &status); if(status != U_USING_FALLBACK_WARNING) { - log_data_err("Expected U_USING_FALLBACK_ERROR when trying to get DayNames from fr_FR, got %s\n", + log_data_err("Expected U_USING_FALLBACK_ERROR when trying to get Countries from fr_FR, got %s\n", u_errorName(status)); } @@ -450,7 +459,7 @@ static void TestFallback() static void TestOpenDirect(void) { - UResourceBundle *translit_index, *item; + UResourceBundle *idna_rules, *item; UErrorCode errorCode; /* @@ -459,19 +468,19 @@ TestOpenDirect(void) { * from root or similar */ errorCode=U_ZERO_ERROR; - translit_index=ures_openDirect(NULL, "translit_index", &errorCode); + idna_rules=ures_openDirect("testdata", "idna_rules", &errorCode); if(U_FAILURE(errorCode)) { - log_err("ures_openDirect(\"translit_index\") failed: %s\n", u_errorName(errorCode)); + log_err("ures_openDirect(\"idna_rules\") failed: %s\n", u_errorName(errorCode)); return; } - if(0!=uprv_strcmp("translit_index", ures_getLocale(translit_index, &errorCode))) { - log_err("ures_openDirect(\"translit_index\").getLocale()!=translit_index\n"); + if(0!=uprv_strcmp("idna_rules", ures_getLocale(idna_rules, &errorCode))) { + log_err("ures_openDirect(\"idna_rules\").getLocale()!=idna_rules\n"); } errorCode=U_ZERO_ERROR; - /* try an item in translit_index, must work */ - item=ures_getByKey(translit_index, "RuleBasedTransliteratorIDs", NULL, &errorCode); + /* try an item in idna_rules, must work */ + item=ures_getByKey(idna_rules, "UnassignedSet", NULL, &errorCode); if(U_FAILURE(errorCode)) { log_err("translit_index.getByKey(local key) failed: %s\n", u_errorName(errorCode)); errorCode=U_ZERO_ERROR; @@ -480,36 +489,197 @@ TestOpenDirect(void) { } /* try an item in root, must fail */ - item=ures_getByKey(translit_index, "Languages", NULL, &errorCode); + item=ures_getByKey(idna_rules, "Languages", NULL, &errorCode); if(U_FAILURE(errorCode)) { errorCode=U_ZERO_ERROR; } else { - log_err("translit_index.getByKey(root key) succeeded!\n"); + log_err("idna_rules.getByKey(root key) succeeded!\n"); ures_close(item); } - ures_close(translit_index); + ures_close(idna_rules); - /* now make sure that "translit_index" will not work with ures_open() */ + /* now make sure that "idna_rules" will not work with ures_open() */ errorCode=U_ZERO_ERROR; - translit_index=ures_open(NULL, "translit_index", &errorCode); + idna_rules=ures_open("testdata", "idna_rules", &errorCode); if(U_FAILURE(errorCode) || errorCode==U_USING_DEFAULT_WARNING || errorCode==U_USING_FALLBACK_WARNING) { /* falling back to default or root is ok */ errorCode=U_ZERO_ERROR; - } else if(0!=uprv_strcmp("translit_INDEX", ures_getLocale(translit_index, &errorCode))) { + } else if(0!=uprv_strcmp("idna_rules", ures_getLocale(idna_rules, &errorCode))) { /* Opening this file will work in "files mode" on Windows and the Mac, which have case insensitive file systems */ - log_err("ures_open(\"translit_index\") succeeded, should fail! Got: %s\n", u_errorName(errorCode)); + log_err("ures_open(\"idna_rules\") succeeded, should fail! Got: %s\n", u_errorName(errorCode)); } - ures_close(translit_index); + ures_close(idna_rules); /* ures_openDirect("translit_index_WronG") must fail */ - translit_index=ures_openDirect(NULL, "translit_index_WronG", &errorCode); + idna_rules=ures_openDirect(NULL, "idna_rules_WronG", &errorCode); if(U_FAILURE(errorCode)) { errorCode=U_ZERO_ERROR; } else { - log_err("ures_openDirect(\"translit_index_WronG\") succeeded, should fail!\n"); + log_err("ures_openDirect(\"idna_rules_WronG\") succeeded, should fail!\n"); + } + ures_close(idna_rules); + + errorCode = U_USING_FALLBACK_WARNING;; + idna_rules=ures_openDirect("testdata", "idna_rules", &errorCode); + if(U_FAILURE(errorCode)) { + log_err("ures_openDirect(\"idna_rules\") failed when U_USING_FALLBACK_WARNING was set prior to call: %s\n", u_errorName(errorCode)); + return; } - ures_close(translit_index); + ures_close(idna_rules); +} + +static int32_t +parseTable32Key(const char *key) { + int32_t number; + char c; + + number=0; + while((c=*key++)!=0) { + number<<=1; + if(c=='1') { + number|=1; + } + } + return number; +} + +static void +TestTable32(void) { + static const struct { + const char *key; + int32_t number; + } testcases[]={ + { "ooooooooooooooooo", 0 }, + { "oooooooooooooooo1", 1 }, + { "ooooooooooooooo1o", 2 }, + { "oo11ooo1ooo11111o", 25150 }, + { "oo11ooo1ooo111111", 25151 }, + { "o1111111111111111", 65535 }, + { "1oooooooooooooooo", 65536 }, + { "1ooooooo11o11ooo1", 65969 }, + { "1ooooooo11o11oo1o", 65970 }, + { "1ooooooo111oo1111", 65999 } + }; + + /* ### TODO UResourceBundle staticItem={ 0 }; - need to know the size */ + UResourceBundle *res, *item; + const UChar *s; + const char *key; + UErrorCode errorCode; + int32_t i, j, number, parsedNumber, length, count; + + errorCode=U_ZERO_ERROR; + res=ures_open(loadTestData(&errorCode), "testtable32", &errorCode); + if(U_FAILURE(errorCode)) { + log_data_err("unable to open testdata/testtable32.res - %s\n", u_errorName(errorCode)); + return; + } + if(ures_getType(res)!=URES_TABLE) { + log_data_err("testdata/testtable32.res has type %d instead of URES_TABLE\n", ures_getType(res)); + } + + count=ures_getSize(res); + if(count!=66000) { + log_err("testdata/testtable32.res should have 66000 entries but has %d\n", count); + } + + /* get the items by index */ + item=NULL; + for(i=0; i=0 && number!=parsedNumber) { + log_err("\"%s\" at %d in testdata/testtable32.res has a string/int value of %d, expected %d\n", + key, i, number, parsedNumber); + } + } + + /* search for some items by key */ + for(i=0; i=0 && number!=testcases[i].number) { + log_err("\"%s\" in testdata/testtable32.res has a string/int value of %d, expected %d\n", + testcases[i].key, number, testcases[i].number); + } + + key=ures_getKey(item); + if(0!=uprv_strcmp(key, testcases[i].key)) { + log_err("\"%s\" in testdata/testtable32.res claims to have the key \"%s\"\n", + testcases[i].key, key); + } + } + + ures_close(item); + ures_close(res); } static void TestFileStream(void){ @@ -517,7 +687,7 @@ static void TestFileStream(void){ int32_t c1=0; UErrorCode status = U_ZERO_ERROR; const char* testdatapath = loadTestData(&status); - char* fileName = (char*) uprv_malloc(uprv_strlen(testdatapath) +10); + char* fileName = (char*) malloc(uprv_strlen(testdatapath) +10); FileStream* stream = NULL; /* these should not be closed */ FileStream* pStdin = T_FileStream_stdin(); @@ -525,8 +695,8 @@ static void TestFileStream(void){ FileStream* pStderr = T_FileStream_stderr(); const char* testline = "This is a test line"; - int32_t bufLen =uprv_strlen(testline)+10; - char* buf = (char*) uprv_malloc(bufLen); + int32_t bufLen = (int32_t)strlen(testline)+10; + char* buf = (char*) malloc(bufLen); int32_t retLen = 0; if(pStdin==NULL){ @@ -544,52 +714,53 @@ static void TestFileStream(void){ stream = T_FileStream_open(fileName, "r"); if(stream==NULL){ log_data_err("T_FileStream_open failed to open %s\n",fileName); - } - if(!T_FileStream_file_exists(fileName)){ + } else { + if(!T_FileStream_file_exists(fileName)){ log_data_err("T_FileStream_file_exists failed to verify existence of %s \n",fileName); - } - - retLen=T_FileStream_read(stream,&c,1); - if(retLen==0){ + } + + retLen=T_FileStream_read(stream,&c,1); + if(retLen==0){ log_data_err("T_FileStream_read failed to read from %s \n",fileName); - } - retLen=0; - T_FileStream_rewind(stream); - T_FileStream_read(stream,&c1,1); - if(c!=c1){ + } + retLen=0; + T_FileStream_rewind(stream); + T_FileStream_read(stream,&c1,1); + if(c!=c1){ log_data_err("T_FileStream_rewind failed to rewind %s \n",fileName); - } - T_FileStream_rewind(stream); - c1 = T_FileStream_peek(stream); - if(c!=c1){ + } + T_FileStream_rewind(stream); + c1 = T_FileStream_peek(stream); + if(c!=c1){ log_data_err("T_FileStream_peek failed to peekd %s \n",fileName); - } - c = T_FileStream_getc(stream); - T_FileStream_ungetc(c,stream); - if(c!= T_FileStream_getc(stream)){ + } + c = T_FileStream_getc(stream); + T_FileStream_ungetc(c,stream); + if(c!= T_FileStream_getc(stream)){ log_data_err("T_FileStream_ungetc failed to d %s \n",fileName); - } - - if(T_FileStream_size(stream)<=0){ + } + + if(T_FileStream_size(stream)<=0){ log_data_err("T_FileStream_size failed to d %s \n",fileName); - } - if(T_FileStream_error(stream)){ + } + if(T_FileStream_error(stream)){ log_data_err("T_FileStream_error shouldn't have an error %s\n",fileName); - } - if(!T_FileStream_error(NULL)){ + } + if(!T_FileStream_error(NULL)){ log_err("T_FileStream_error didn't get an error %s\n",fileName); - } - T_FileStream_putc(stream, 0x20); - if(!T_FileStream_error(stream)){ + } + T_FileStream_putc(stream, 0x20); + if(!T_FileStream_error(stream)){ /* - Warning - writing to a read-only file may not consistently fail on all platforms - (e.g. HP-UX, FreeBSD, MacOSX) + Warning + writing to a read-only file may not consistently fail on all platforms + (e.g. HP-UX, FreeBSD, MacOSX) */ log_verbose("T_FileStream_error didn't get an error when writing to a readonly file %s\n",fileName); - } + } - T_FileStream_close(stream); + T_FileStream_close(stream); + } /* test writing function */ stream=NULL; uprv_strcpy(fileName,testdatapath); @@ -598,38 +769,165 @@ static void TestFileStream(void){ if(stream == NULL){ log_data_err("Could not open %s for writing\n",fileName); - } - c= '$'; - T_FileStream_putc(stream,c); - T_FileStream_rewind(stream); - if(c != T_FileStream_getc(stream)){ + } else { + c= '$'; + T_FileStream_putc(stream,c); + T_FileStream_rewind(stream); + if(c != T_FileStream_getc(stream)){ log_data_err("T_FileStream_putc failed %s\n",fileName); - } + } - T_FileStream_rewind(stream); - T_FileStream_writeLine(stream,testline); - T_FileStream_rewind(stream); - T_FileStream_readLine(stream,buf,bufLen); - if(uprv_strncmp(testline, buf,uprv_strlen(buf))!=0){ + T_FileStream_rewind(stream); + T_FileStream_writeLine(stream,testline); + T_FileStream_rewind(stream); + T_FileStream_readLine(stream,buf,bufLen); + if(uprv_strncmp(testline, buf,uprv_strlen(buf))!=0){ log_data_err("T_FileStream_writeLine failed %s\n",fileName); - } + } - T_FileStream_rewind(stream); - T_FileStream_write(stream,testline,uprv_strlen(testline)); - T_FileStream_rewind(stream); - retLen = T_FileStream_read(stream, buf, bufLen); - if(uprv_strncmp(testline, buf,retLen)!=0){ + T_FileStream_rewind(stream); + T_FileStream_write(stream,testline,(int32_t)strlen(testline)); + T_FileStream_rewind(stream); + retLen = T_FileStream_read(stream, buf, bufLen); + if(uprv_strncmp(testline, buf,retLen)!=0){ log_data_err("T_FileStream_write failed %s\n",fileName); - } - - T_FileStream_close(stream); + } + T_FileStream_close(stream); + } if(!T_FileStream_remove(fileName)){ log_data_err("T_FileStream_remove failed to delete %s\n",fileName); } - uprv_free(fileName); - uprv_free(buf); + free(fileName); + free(buf); } + +static void TestGetSize(void) { + const struct { + const char* key; + int32_t size; + } test[] = { + { "zerotest", 1}, + { "one", 1}, + { "importtest", 1}, + { "integerarray", 1}, + { "emptyarray", 0}, + { "emptytable", 0}, + { "emptystring", 1}, /* empty string is still a string */ + { "emptyint", 1}, + { "emptybin", 1}, + { "testinclude", 1}, + { "collations", 1}, /* not 2 - there is hidden %%CollationBin */ + }; + + UErrorCode status = U_ZERO_ERROR; + + UResourceBundle *rb = NULL; + UResourceBundle *res = NULL; + UResourceBundle *helper = NULL; + const char* testdatapath = loadTestData(&status); + int32_t i = 0, j = 0; + int32_t size = 0; + + if(U_FAILURE(status)) + { + log_err("Could not load testdata.dat %s\n", u_errorName(status)); + return; + } + + rb = ures_open(testdatapath, "testtypes", &status); + if(U_FAILURE(status)) + { + log_err("Could not testtypes resource bundle %s\n", u_errorName(status)); + return; + } + + for(i = 0; i < sizeof(test)/sizeof(test[0]); i++) { + res = ures_getByKey(rb, test[i].key, res, &status); + if(U_FAILURE(status)) + { + log_err("Couldn't find the key %s. Error: %s\n", test[i].key, u_errorName(status)); + ures_close(rb); + return; + } + size = ures_getSize(res); + if(size != test[i].size) { + log_err("Expected size %i, got size %i for key %s\n", test[i].size, size, test[i].key); + for(j = 0; j < size; j++) { + helper = ures_getByIndex(res, j, helper, &status); + log_err("%s\n", ures_getKey(helper)); + } + } + } + ures_close(helper); + ures_close(res); + ures_close(rb); +} + +static void TestGetLocaleByType(void) { + static const struct { + const char *requestedLocale; + const char *resourceKey; + const char *validLocale; + const char *actualLocale; + } test[] = { + { "te_IN_BLAH", "string_only_in_te_IN", "te_IN", "te_IN" }, + { "te_IN_BLAH", "string_only_in_te", "te_IN", "te" }, + { "te_IN_BLAH", "string_only_in_Root", "te_IN", "root" }, + { "te_IN_BLAH_01234567890_01234567890_01234567890_01234567890_01234567890_01234567890", "array_2d_only_in_Root", "te_IN", "root" }, + { "te_IN_BLAH@currency=euro", "array_2d_only_in_te_IN", "te_IN", "te_IN" }, + { "te_IN_BLAH@collation=phonebook;calendar=thai", "array_2d_only_in_te", "te_IN", "te" } + }; + + UErrorCode status = U_ZERO_ERROR; + + UResourceBundle *rb = NULL; + UResourceBundle *res = NULL; + const char* testdatapath = loadTestData(&status); + int32_t i = 0; + const char *locale = NULL; + + if(U_FAILURE(status)) + { + log_err("Could not load testdata.dat %s\n", u_errorName(status)); + return; + } + + for(i = 0; i < sizeof(test)/sizeof(test[0]); i++) { + rb = ures_open(testdatapath, test[i].requestedLocale, &status); + if(U_FAILURE(status)) + { + log_err("Could not open resource bundle %s (error %s)\n", test[i].requestedLocale, u_errorName(status)); + status = U_ZERO_ERROR; + continue; + } + + res = ures_getByKey(rb, test[i].resourceKey, res, &status); + if(U_FAILURE(status)) + { + log_err("Couldn't find the key %s. Error: %s\n", test[i].resourceKey, u_errorName(status)); + ures_close(rb); + status = U_ZERO_ERROR; + continue; + } + + locale = ures_getLocaleByType(res, ULOC_REQUESTED_LOCALE, &status); + if(locale) { + log_err("Requested locale should return NULL\n"); + } + locale = ures_getLocaleByType(res, ULOC_VALID_LOCALE, &status); + if(!locale || strcmp(locale, test[i].validLocale) != 0) { + log_err("Expected valid locale to be %s. Got %s\n", test[i].requestedLocale, locale); + } + locale = ures_getLocaleByType(res, ULOC_ACTUAL_LOCALE, &status); + if(!locale || strcmp(locale, test[i].actualLocale) != 0) { + log_err("Expected actual locale to be %s. Got %s\n", test[i].requestedLocale, locale); + } + ures_close(rb); + } + ures_close(res); +} + diff --git a/icuSources/test/cintltst/crestst.h b/icuSources/test/cintltst/crestst.h index f34061d4..de11a959 100644 --- a/icuSources/test/cintltst/crestst.h +++ b/icuSources/test/cintltst/crestst.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** @@ -34,6 +34,11 @@ void TestConstruction2(void); void TestAliasConflict(void); + + static void TestGetSize(void); + + static void TestGetLocaleByType(void); + /** * extensive subtests called by TestResourceBundles **/ diff --git a/icuSources/test/cintltst/creststn.c b/icuSources/test/cintltst/creststn.c index 282fe934..6a3eaca1 100644 --- a/icuSources/test/cintltst/creststn.c +++ b/icuSources/test/cintltst/creststn.c @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** @@ -18,13 +18,13 @@ #include #include "unicode/utypes.h" #include "cintltst.h" -#include "unicode/utypes.h" +#include "unicode/putil.h" #include "unicode/ustring.h" #include "unicode/ucnv.h" #include "string.h" #include "cstring.h" #include "unicode/uchar.h" - +#include "ucol_imp.h" /* for U_ICUDATA_COLL */ #define RESTEST_HEAP_CHECK 0 #include "unicode/uloc.h" @@ -157,8 +157,10 @@ param[] = static int32_t bundles_count = sizeof(param) / sizeof(param[0]); -static void printUChars(UChar*); +/*static void printUChars(UChar*);*/ static void TestDecodedBundle(void); +static void TestGetKeywordValues(void); +static void TestGetFunctionalEquivalent(void); /***************************************************************************************/ @@ -172,6 +174,7 @@ void addNEWResourceBundleTest(TestNode** root) addTest(root, &TestResourceBundles, "tsutil/creststn/TestResourceBundle"); addTest(root, &TestFallback, "tsutil/creststn/TestFallback"); addTest(root, &TestGetVersion, "tsutil/creststn/TestGetVersion"); + addTest(root, &TestGetVersionColl, "tsutil/creststn/TestGetVersionColl"); addTest(root, &TestAliasConflict, "tsutil/creststn/TestAliasConflict"); addTest(root, &TestNewTypes, "tsutil/creststn/TestNewTypes"); addTest(root, &TestEmptyTypes, "tsutil/creststn/TestEmptyTypes"); @@ -181,6 +184,9 @@ void addNEWResourceBundleTest(TestNode** root) addTest(root, &TestDecodedBundle, "tsutil/creststn/TestDecodedBundle"); addTest(root, &TestResourceLevelAliasing, "tsutil/creststn/TestResourceLevelAliasing"); addTest(root, &TestDirectAccess, "tsutil/creststn/TestDirectAccess"); + addTest(root, &TestGetKeywordValues, "tsutil/creststn/TestGetKeywordValues"); + addTest(root, &TestGetFunctionalEquivalent,"tsutil/creststn/TestGetFunctionalEquivalent"); + addTest(root, &TestJB3763, "tsutil/creststn/TestJB3763"); } @@ -206,12 +212,12 @@ static const char* norwayLocales[] = { "nb" }; -static void checkStatus(UErrorCode expected, UErrorCode status) { +static void checkStatus(int32_t line, UErrorCode expected, UErrorCode status) { if(U_FAILURE(status)) { - log_data_err("Resource not present, cannot test\n"); + log_data_err("Resource not present, cannot test (%s:%d)\n", __FILE__, line); } if(status != expected) { - log_err("Expected error code %s, got error code %s\n", u_errorName(expected), u_errorName(status)); + log_err("%s:%d: Expected error code %s, got error code %s\n", __FILE__, line, u_errorName(expected), u_errorName(status)); } } @@ -220,40 +226,80 @@ static void TestErrorCodes(void) { UResourceBundle *r = NULL, *r2 = NULL; + /* First check with ICUDATA */ /* first bundle should return fallback warning */ - r = ures_open(NULL, "sr_YU_VOJVODINA", &status); - checkStatus(U_USING_FALLBACK_WARNING, status); + r = ures_open(NULL, "ti_ER_ASSAB", &status); + checkStatus(__LINE__, U_USING_FALLBACK_WARNING, status); ures_close(r); /* this bundle should return zero error, so it shouldn't change the status*/ status = U_USING_DEFAULT_WARNING; - r = ures_open(NULL, "sr_YU", &status); - checkStatus(U_USING_DEFAULT_WARNING, status); + r = ures_open(NULL, "ti_ER", &status); + checkStatus(__LINE__, U_USING_DEFAULT_WARNING, status); /* we look up the resource which is aliased, but it lives in fallback */ if(U_SUCCESS(status) && r != NULL) { status = U_USING_DEFAULT_WARNING; - r2 = ures_getByKey(r, "CollationElements", NULL, &status); - checkStatus(U_USING_FALLBACK_WARNING, status); + r2 = ures_getByKey(r, "Languages", NULL, &status); /* languages of 'ti' aliases to 'am' */ + checkStatus(__LINE__, U_USING_FALLBACK_WARNING, status); } ures_close(r); /* this bundle should return zero error, so it shouldn't change the status*/ status = U_USING_DEFAULT_WARNING; - r = ures_open(NULL, "sr", &status); - checkStatus(U_USING_DEFAULT_WARNING, status); + r = ures_open(NULL, "ti", &status); + checkStatus(__LINE__, U_USING_DEFAULT_WARNING, status); /* we look up the resource which is aliased and at our level */ if(U_SUCCESS(status) && r != NULL) { status = U_USING_DEFAULT_WARNING; - r2 = ures_getByKey(r, "CollationElements", r2, &status); - checkStatus(U_USING_DEFAULT_WARNING, status); + r2 = ures_getByKey(r, "Languages", r2, &status); + checkStatus(__LINE__, U_USING_DEFAULT_WARNING, status); } ures_close(r); status = U_USING_FALLBACK_WARNING; r = ures_open(NULL, "nolocale", &status); - checkStatus(U_USING_DEFAULT_WARNING, status); + checkStatus(__LINE__, U_USING_DEFAULT_WARNING, status); + ures_close(r); + ures_close(r2); + + /** Now, with the collation bundle **/ + + /* first bundle should return fallback warning */ + r = ures_open(U_ICUDATA_COLL, "sr_YU_VOJVODINA", &status); + checkStatus(__LINE__, U_USING_FALLBACK_WARNING, status); + ures_close(r); + + /* this bundle should return zero error, so it shouldn't change the status*/ + status = U_USING_FALLBACK_WARNING; + r = ures_open(U_ICUDATA_COLL, "sr", &status); + checkStatus(__LINE__, U_USING_FALLBACK_WARNING, status); + + /* we look up the resource which is aliased */ + if(U_SUCCESS(status) && r != NULL) { + status = U_USING_DEFAULT_WARNING; + r2 = ures_getByKey(r, "collations", NULL, &status); + checkStatus(__LINE__, U_USING_DEFAULT_WARNING, status); + } + ures_close(r); + + /* this bundle should return zero error, so it shouldn't change the status*/ + status = U_USING_DEFAULT_WARNING; + r = ures_open(U_ICUDATA_COLL, "sr", &status); + checkStatus(__LINE__, U_USING_DEFAULT_WARNING, status); + + /* we look up the resource which is aliased and at our level */ + if(U_SUCCESS(status) && r != NULL) { + status = U_USING_DEFAULT_WARNING; + r2 = ures_getByKey(r, "collations", r2, &status); + checkStatus(__LINE__, U_USING_DEFAULT_WARNING, status); + } + ures_close(r); + + status = U_USING_FALLBACK_WARNING; + r = ures_open(U_ICUDATA_COLL, "nolocale", &status); + checkStatus(__LINE__, U_USING_DEFAULT_WARNING, status); ures_close(r); ures_close(r2); } @@ -511,7 +557,7 @@ static void TestNewTypes() { const UChar* str = ures_getStringByKey(theBundle,"testescape",&len,&status); CONFIRM_ErrorCode(status, U_ZERO_ERROR); if(U_SUCCESS(status)){ - u_charsToUChars(expect,uExpect,uprv_strlen(expect)+1); + u_charsToUChars(expect,uExpect,(int32_t)strlen(expect)+1); if(u_strcmp(uExpect,str)){ log_err("Did not get the expected string for testescape\n"); } @@ -520,29 +566,43 @@ static void TestNewTypes() { /* this tests if unescaping works are expected */ len=0; { - static const char pattern[] = "[ \\\\u0020 \\\\u00A0 \\\\u1680 \\\\u2000 \\\\u2001 \\\\u2002 \\\\u2003 \\\\u2004 \\\\u2005 \\\\u2006 \\\\u2007 " + char pattern[2048] = ""; + int32_t patternLen; + UChar* expectedEscaped; + const UChar* got; + int32_t expectedLen; + + /* This strcpy fixes compiler warnings about long strings */ + strcpy(pattern, "[ \\\\u0020 \\\\u00A0 \\\\u1680 \\\\u2000 \\\\u2001 \\\\u2002 \\\\u2003 \\\\u2004 \\\\u2005 \\\\u2006 \\\\u2007 " "\\\\u2008 \\\\u2009 \\\\u200A \\u200B \\\\u202F \\u205F \\\\u3000 \\u0000-\\u001F \\u007F \\u0080-\\u009F " "\\\\u06DD \\\\u070F \\\\u180E \\\\u200C \\\\u200D \\\\u2028 \\\\u2029 \\\\u2060 \\\\u2061 \\\\u2062 \\\\u2063 " "\\\\u206A-\\\\u206F \\\\uFEFF \\\\uFFF9-\\uFFFC \\U0001D173-\\U0001D17A \\U000F0000-\\U000FFFFD " "\\U00100000-\\U0010FFFD \\uFDD0-\\uFDEF \\uFFFE-\\uFFFF \\U0001FFFE-\\U0001FFFF \\U0002FFFE-\\U0002FFFF " + ); + strcat(pattern, "\\U0003FFFE-\\U0003FFFF \\U0004FFFE-\\U0004FFFF \\U0005FFFE-\\U0005FFFF \\U0006FFFE-\\U0006FFFF " "\\U0007FFFE-\\U0007FFFF \\U0008FFFE-\\U0008FFFF \\U0009FFFE-\\U0009FFFF \\U000AFFFE-\\U000AFFFF " "\\U000BFFFE-\\U000BFFFF \\U000CFFFE-\\U000CFFFF \\U000DFFFE-\\U000DFFFF \\U000EFFFE-\\U000EFFFF " "\\U000FFFFE-\\U000FFFFF \\U0010FFFE-\\U0010FFFF \\uD800-\\uDFFF \\\\uFFF9 \\\\uFFFA \\\\uFFFB " "\\uFFFC \\uFFFD \\u2FF0-\\u2FFB \\u0340 \\u0341 \\\\u200E \\\\u200F \\\\u202A \\\\u202B \\\\u202C " + ); + strcat(pattern, "\\\\u202D \\\\u202E \\\\u206A \\\\u206B \\\\u206C \\\\u206D \\\\u206E \\\\u206F \\U000E0001 \\U000E0020-\\U000E007F " - "]"; - - int32_t patternLen = uprv_strlen(pattern); - UChar* expectedEscaped = (UChar*)malloc(U_SIZEOF_UCHAR * patternLen); - const UChar* got = ures_getStringByKey(theBundle,"test_unescaping",&len,&status); - int32_t expectedLen = u_unescape(pattern,expectedEscaped,patternLen); - if(u_strncmp(expectedEscaped,got,expectedLen)!=0 || expectedLen != len){ + "]" + ); + + patternLen = (int32_t)uprv_strlen(pattern); + expectedEscaped = (UChar*)malloc(U_SIZEOF_UCHAR * patternLen); + got = ures_getStringByKey(theBundle,"test_unescaping",&len,&status); + expectedLen = u_unescape(pattern,expectedEscaped,patternLen); + if(got==NULL || u_strncmp(expectedEscaped,got,expectedLen)!=0 || expectedLen != len){ log_err("genrb failed to unescape string\n"); } - for(i=0;i= 0) { - locName = uloc_getAvailable(j); - } - log_verbose("Testing version number for locale %s\n", locName); - resB = ures_open(NULL,locName, &status); - if (U_FAILURE(status)) { - log_err("Resource bundle creation for locale %s failed.: %s\n", locName, myErrorName(status)); - ures_close(resB); - return; - } - ures_getVersion(resB, versionArray); - for (i=0; i<4; ++i) { - if (versionArray[i] < minVersionArray[i] || - versionArray[i] > maxVersionArray[i]) - { - log_err("Testing ures_getVersion() - unexpected result: %d.%d.%d.%d\n", - versionArray[0], versionArray[1], versionArray[2], versionArray[3]); - break; - } - } - ures_close(resB); + if(j >= 0) { + locName = uloc_getAvailable(j); + } + log_verbose("Testing version number for locale %s\n", locName); + resB = ures_open(NULL,locName, &status); + if (U_FAILURE(status)) { + log_err("Resource bundle creation for locale %s failed.: %s\n", locName, myErrorName(status)); + ures_close(resB); + return; + } + ures_getVersion(resB, versionArray); + for (i=0; i<4; ++i) { + if (versionArray[i] < minVersionArray[i] || + versionArray[i] > maxVersionArray[i]) + { + log_err("Testing ures_getVersion(%-5s) - unexpected result: %d.%d.%d.%d\n", + locName, versionArray[0], versionArray[1], versionArray[2], versionArray[3]); + break; + } + } + ures_close(resB); } } + +static void TestGetVersionColl(){ + UVersionInfo minVersionArray = {0x00, 0x00, 0x00, 0x00}; + UVersionInfo maxVersionArray = {0x50, 0x80, 0xcf, 0xcf}; + UVersionInfo versionArray; + UErrorCode status= U_ZERO_ERROR; + UResourceBundle* resB = NULL; + UEnumeration *locs= NULL; + int i=0; + const char *locName = "root"; + int32_t locLen; + const UChar* rules =NULL; + int32_t len = 0; + + log_verbose("The ures_getVersion(%s) tests begin : \n", U_ICUDATA_COLL); + locs = ures_openAvailableLocales(U_ICUDATA_COLL, &status); + if (U_FAILURE(status)) { + log_err("enumeration of %s failed.: %s\n", U_ICUDATA_COLL, myErrorName(status)); + return; + } + + do{ + log_verbose("Testing version number for locale %s\n", locName); + resB = ures_open(U_ICUDATA_COLL,locName, &status); + if (U_FAILURE(status)) { + log_err("Resource bundle creation for locale %s:%s failed.: %s\n", U_ICUDATA_COLL, locName, myErrorName(status)); + ures_close(resB); + return; + } + /* test NUL termination of UCARules */ + rules = ures_getStringByKey(resB,"%%UCARULES",&len, &status); + if(!rules || U_FAILURE(status)) { + log_data_err("Could not load %%UCARULES for locale %s\n", locName); + continue; + } + if(u_strlen(rules) != len){ + log_err("UCARules string not nul terminated! \n"); + } + ures_getVersion(resB, versionArray); + for (i=0; i<4; ++i) { + if (versionArray[i] < minVersionArray[i] || + versionArray[i] > maxVersionArray[i]) + { + log_err("Testing ures_getVersion(%-5s) - unexpected result: %d.%d.%d.%d\n", + locName, versionArray[0], versionArray[1], versionArray[2], versionArray[3]); + break; + } + } + ures_close(resB); + } while((locName = uenum_next(locs,&locLen,&status))&&U_SUCCESS(status)); + + if(U_FAILURE(status)) { + log_err("Err %s testing Collation locales.\n", u_errorName(status)); + } + uenum_close(locs); +} + static void TestResourceBundles() { - testTag("only_in_Root", TRUE, FALSE, FALSE); - testTag("in_Root_te", TRUE, TRUE, FALSE); - testTag("in_Root_te_te_IN", TRUE, TRUE, TRUE); - testTag("in_Root_te_IN", TRUE, FALSE, TRUE); - testTag("only_in_te", FALSE, TRUE, FALSE); - testTag("only_in_te_IN", FALSE, FALSE, TRUE); - testTag("in_te_te_IN", FALSE, TRUE, TRUE); - testTag("nonexistent", FALSE, FALSE, FALSE); + testTag("only_in_Root", TRUE, FALSE, FALSE); + testTag("in_Root_te", TRUE, TRUE, FALSE); + testTag("in_Root_te_te_IN", TRUE, TRUE, TRUE); + testTag("in_Root_te_IN", TRUE, FALSE, TRUE); + testTag("only_in_te", FALSE, TRUE, FALSE); + testTag("only_in_te_IN", FALSE, FALSE, TRUE); + testTag("in_te_te_IN", FALSE, TRUE, TRUE); + testTag("nonexistent", FALSE, FALSE, FALSE); - log_verbose("Passed:= %d Failed= %d \n", pass, fail); + log_verbose("Passed:= %d Failed= %d \n", pass, fail); } @@ -1815,6 +1942,7 @@ static void TestFallback() { UErrorCode status = U_ZERO_ERROR; UResourceBundle *fr_FR = NULL; + UResourceBundle *subResource = NULL; const UChar *junk; /* ignored */ int32_t resultLen; @@ -1838,20 +1966,21 @@ static void TestFallback() status = U_ZERO_ERROR; /* OK first one. This should be a Default value. */ - junk = ures_getStringByKey(fr_FR, "%%PREEURO", &resultLen, &status); + subResource = ures_getByKey(fr_FR, "MeasurementSystem", NULL, &status); if(status != U_USING_DEFAULT_WARNING) { - log_data_err("Expected U_USING_DEFAULT_ERROR when trying to get %%PREEURO from fr_FR, got %s\n", + log_data_err("Expected U_USING_DEFAULT_ERROR when trying to get CurrencyMap from fr_FR, got %s\n", u_errorName(status)); } status = U_ZERO_ERROR; + ures_close(subResource); /* and this is a Fallback, to fr */ - junk = ures_getStringByKey(fr_FR, "DayNames", &resultLen, &status); + junk = ures_getStringByKey(fr_FR, "Countries", &resultLen, &status); if(status != U_USING_FALLBACK_WARNING) { - log_data_err("Expected U_USING_FALLBACK_ERROR when trying to get DayNames from fr_FR, got %d\n", + log_data_err("Expected U_USING_FALLBACK_ERROR when trying to get Countries from fr_FR, got %d\n", status); } @@ -1863,18 +1992,20 @@ static void TestFallback() { UErrorCode err =U_ZERO_ERROR; UResourceBundle* myResB = ures_open(NULL,"no_NO_NY",&err); - UResourceBundle* resLocID = ures_getByKey(myResB, "LocaleID", NULL, &err); + UResourceBundle* resLocID = ures_getByKey(myResB, "Version", NULL, &err); UResourceBundle* tResB; + static const UChar versionStr[] = { 0x0031, 0x002E, 0x0032, 0}; + if(err != U_ZERO_ERROR){ - log_data_err("Expected U_ZERO_ERROR when trying to test no_NO_NY aliased to nn_NO for LocaleID err=%s\n",u_errorName(err)); + log_data_err("Expected U_ZERO_ERROR when trying to test no_NO_NY aliased to nn_NO for Version err=%s\n",u_errorName(err)); return; } - if(ures_getInt(resLocID, &err) != 0x814){ - log_data_err("Expected LocaleID=814, but got 0x%X\n", ures_getInt(resLocID, &err)); + if(u_strcmp(ures_getString(resLocID, &resultLen, &err), versionStr) != 0){ + log_data_err("ures_getString(resLocID, &resultLen, &err) returned an unexpected version value\n"); } - tResB = ures_getByKey(myResB, "DayNames", NULL, &err); + tResB = ures_getByKey(myResB, "calendar", NULL, &err); if(err != U_USING_FALLBACK_WARNING){ - log_err("Expected U_USING_FALLBACK_ERROR when trying to test no_NO_NY aliased with nn_NO_NY for DayNames err=%s\n",u_errorName(err)); + log_err("Expected U_USING_FALLBACK_ERROR when trying to test no_NO_NY aliased with nn_NO_NY for calendar err=%s\n",u_errorName(err)); } ures_close(resLocID); ures_close(myResB); @@ -1884,259 +2015,482 @@ static void TestFallback() } -static void printUChars(UChar* uchars){ - int16_t i=0; - for(i=0; i loc=%s\n", + gotAvail?'t':'f', equivLocale, + i/3, + expectAvail?'t':'f', inLocale, expectLocale); + } } } +} - ures_close(t); - ures_close(t2); +static void TestGetFunctionalEquivalent(void) { + static const char *collCases[] = { + /* avail locale equiv */ + "f", "de_US_CALIFORNIA", "de", + "t", "zh_TW@collation=stroke", "zh@collation=stroke", + "f", "de_CN@collation=pinyin", "de", + "t", "zh@collation=pinyin", "zh", + "t", "zh_CN@collation=pinyin", "zh", /* should be 'T' when validSubLocales works */ + "t", "zh_HK@collation=pinyin", "zh", + "t", "zh_HK@collation=stroke", "zh@collation=stroke", + "t", "zh_HK", "zh@collation=stroke", + "t", "zh_MO", "zh@collation=stroke", + "t", "zh_TW_STROKE", "zh@collation=stroke", + "t", "zh_TW_STROKE@collation=big5han", "zh@collation=big5han", + "f", "de_CN@calendar=japanese", "de", + "t", "de@calendar=japanese", "de", + "t", "zh_TW@collation=big5han", "zh@collation=big5han", + "t", "zh_TW@collation=gb2312han", "zh@collation=gb2312han", + "t", "zh_CN@collation=big5han", "zh@collation=big5han", + "t", "zh_CN@collation=gb2312han", "zh@collation=gb2312han", + "t", "zh@collation=big5han", "zh@collation=big5han", + "t", "zh@collation=gb2312han", "zh@collation=gb2312han", + "t", "hi_IN@collation=direct", "hi@collation=direct", + "t", "hi@collation=standard", "hi", + "t", "hi@collation=direct", "hi@collation=direct", + "f", "hi_AU@collation=direct;currency=CHF;calendar=buddhist", "hi@collation=direct", + "f", "hi_AU@collation=standard;currency=CHF;calendar=buddhist", "hi", + NULL + }; + + static const char *calCases[] = { + /* avail locale equiv */ + "t", "en_US", "en@calendar=gregorian", + "f", "ja_JP_TOKYO", "ja@calendar=gregorian", + "f", "ja_JP_TOKYO@calendar=japanese", "ja@calendar=japanese", + "t", "sr@calendar=gregorian", "sr@calendar=gregorian", + "t", "en", "en@calendar=gregorian", + NULL + }; + +#if !UCONFIG_NO_COLLATION + TestGetFunctionalEquivalentOf(U_ICUDATA_COLL, "collations", "collation", TRUE, collCases); +#endif + TestGetFunctionalEquivalentOf("ICUDATA", "calendar", "calendar", FALSE, calCases); + +#if !UCONFIG_NO_COLLATION + log_verbose("Testing error conditions:\n"); + { + char equivLocale[256] = "???"; + int32_t len; + UErrorCode status = U_ZERO_ERROR; + UBool gotAvail = FALSE; + + len = ures_getFunctionalEquivalent(equivLocale, 255, U_ICUDATA_COLL, + "calendar", "calendar", "ar_EG@calendar=islamic", + &gotAvail, FALSE, &status); + + if(status == U_MISSING_RESOURCE_ERROR) { + log_verbose("PASS: Got expected U_MISSING_RESOURCE_ERROR\n"); + } else { + log_err("ures_getFunctionalEquivalent returned locale %s, avail %c, err %s, but expected U_MISSING_RESOURCE_ERROR \n", + equivLocale, gotAvail?'t':'f', u_errorName(status)); + } + } +#endif } + diff --git a/icuSources/test/cintltst/creststn.h b/icuSources/test/cintltst/creststn.h index b1f98e0a..3f539232 100644 --- a/icuSources/test/cintltst/creststn.h +++ b/icuSources/test/cintltst/creststn.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-1999, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /*************************************************************************** @@ -48,6 +48,8 @@ static void TestErrorConditions(void); static void TestGetVersion(void); +static void TestGetVersionColl(void); + static void TestEmptyBundle(void); static void TestDirectAccess(void); @@ -56,6 +58,8 @@ static void TestResourceLevelAliasing(void); static void TestErrorCodes(void); +static void TestJB3763(void); + /** * extensive subtests called by TestResourceBundles **/ diff --git a/icuSources/test/cintltst/cstrtest.c b/icuSources/test/cintltst/cstrtest.c index 89909443..99dcb37b 100644 --- a/icuSources/test/cintltst/cstrtest.c +++ b/icuSources/test/cintltst/cstrtest.c @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1998-2003, International Business Machines Corporation +* Copyright (C) 1998-2004, International Business Machines Corporation * and others. All Rights Reserved. ********************************************************************** * @@ -13,18 +13,23 @@ ******************************************************************************* */ - +#include "unicode/ustring.h" +#include "unicode/ucnv.h" #include "cstring.h" +#include "uinvchar.h" #include "cintltst.h" #include "cmemory.h" +#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) + static void TestAPI(void); void addCStringTest(TestNode** root); +static void TestInvariant(void); + void addCStringTest(TestNode** root) { - addTest(root, &TestAPI, "tsutil/cstrtest/TestAPI"); - + addTest(root, &TestInvariant, "tsutil/cstrtest/TestInvariant"); } static void TestAPI(void) @@ -144,3 +149,127 @@ static void TestAPI(void) } } + +/* test invariant-character handling */ +static void +TestInvariant() { + /* all invariant graphic chars and some control codes (not \n!) */ + const char invariantChars[]= + "\t\r \"%&'()*+,-./" + "0123456789:;<=>?" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ_" + "abcdefghijklmnopqrstuvwxyz"; + + const UChar invariantUChars[]={ + 9, 0xd, 0x20, 0x22, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5f, + 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0 + }; + + const char variantChars[]="\n!#$@[\\]^`{|}~"; + + const UChar variantUChars[]={ + 0x0a, 0x21, 0x23, 0x24, 0x40, 0x5b, 0x5c, 0x5d, 0x5e, 0x60, 0x7b, 0x7c, 0x7d, 0x7e, 0 + }; + + const UChar nonASCIIUChars[]={ 0x80, 0xa0, 0x900, 0xff51 }; + + UChar us[120]; + char cs[120]; + + int32_t i, length; + + /* make sure that all invariant characters convert both ways */ + length=sizeof(invariantChars); + u_charsToUChars(invariantChars, us, length); + if(u_strcmp(us, invariantUChars)!=0) { + log_err("u_charsToUChars(invariantChars) failed\n"); + } + + u_UCharsToChars(invariantUChars, cs, length); + if(strcmp(cs, invariantChars)!=0) { + log_err("u_UCharsToChars(invariantUChars) failed\n"); + } + + + /* + * make sure that variant characters convert from source code literals to Unicode + * but not back to char * + */ + length=sizeof(variantChars); + u_charsToUChars(variantChars, us, length); + if(u_strcmp(us, variantUChars)!=0) { + log_err("u_charsToUChars(variantChars) failed\n"); + } + +#ifdef NDEBUG + /* + * Test u_UCharsToChars(variantUChars) only in release mode because it will + * cause an assertion failure in debug builds. + */ + u_UCharsToChars(variantUChars, cs, length); + for(i=0; i1 && buffer16[0]==0x49) { - uset_add(set2, start); + /* enumerate all characters that are plausible to be latin letters */ + for(start=0xa0; start<0x2000; ++start) { + if(unorm_getDecomposition(start, FALSE, buffer16, LENGTHOF(buffer16))>1 && buffer16[0]==0x49) { + uset_add(set2, start); + } } + + compareUSets(set1, set2, + "[canon start set of 0049]", "[all c with canon decomp with 0049]", + TRUE); + } else { + log_err("error calling unorm_getCanonStartSet()\n"); } - compareUSets(set1, set2, - "[canon start set of 0049]", "[all c with canon decomp with 0049]", - TRUE); uset_close(set1); uset_close(set2); #endif } + +/* API coverage for ucase.c */ +static void TestUCase() { + UDataMemory *pData; + UCaseProps *csp; + UErrorCode errorCode; + + /* coverage for ucase_openBinary() */ + errorCode=U_ZERO_ERROR; + pData=udata_open(NULL, UCASE_DATA_TYPE, UCASE_DATA_NAME, &errorCode); + if(U_FAILURE(errorCode)) { + log_data_err("unable to open " UCASE_DATA_NAME "." UCASE_DATA_TYPE ": %s\n", + u_errorName(errorCode)); + return; + } + + csp=ucase_openBinary((const uint8_t *)pData->pHeader, -1, &errorCode); + if(U_FAILURE(errorCode)) { + log_err("ucase_openBinary() fails for the contents of " UCASE_DATA_NAME "." UCASE_DATA_TYPE ": %s\n", + u_errorName(errorCode)); + udata_close(pData); + return; + } + + if(UCASE_LOWER!=ucase_getType(csp, 0xdf)) { /* verify islower(sharp s) */ + log_err("ucase_openBinary() does not seem to return working UCaseProps\n"); + } + + ucase_close(csp); + udata_close(pData); +} diff --git a/icuSources/test/cintltst/custrtrn.c b/icuSources/test/cintltst/custrtrn.c index 17b413ef..66ada233 100644 --- a/icuSources/test/cintltst/custrtrn.c +++ b/icuSources/test/cintltst/custrtrn.c @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 2001-2003, International Business Machines Corporation and + * Copyright (c) 2001-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** @@ -19,8 +19,10 @@ #include #include "unicode/utypes.h" #include "unicode/ustring.h" +#include "unicode/ures.h" #include "ustr_imp.h" #include "cintltst.h" +#include "cwchar.h" #define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) @@ -29,6 +31,8 @@ void addUCharTransformTest(TestNode** root); static void Test_UChar_UTF32_API(void); static void Test_UChar_UTF8_API(void); static void Test_UChar_WCHART_API(void); +static void Test_widestrs(void); +static void Test_WCHART_LongString(void); void addUCharTransformTest(TestNode** root) @@ -36,6 +40,8 @@ addUCharTransformTest(TestNode** root) addTest(root, &Test_UChar_UTF32_API, "custrtrn/Test_UChar_UTF32_API"); addTest(root, &Test_UChar_UTF8_API, "custrtrn/Test_UChar_UTF8_API"); addTest(root, &Test_UChar_WCHART_API, "custrtrn/Test_UChar_WCHART_API"); + addTest(root, &Test_widestrs, "custrtrn/Test_widestrs"); + addTest(root, &Test_WCHART_LongString, "custrtrn/Test_WCHART_LongString"); } static const UChar32 src32[]={ @@ -432,16 +438,7 @@ static const uint16_t src16j[] = { 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A, 0x0000, /* Test only ASCII */ - /* - 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, 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, - 0x0054, 0x0000 - */ + }; static const uint16_t src16WithNulls[] = { 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0000, @@ -652,3 +649,103 @@ static void Test_UChar_WCHART_API(void){ } } } + +static void Test_widestrs() +{ + wchar_t ws[100]; + UChar rts[100]; + int32_t wcap = sizeof(ws) / sizeof(*ws); + int32_t wl; + int32_t rtcap = sizeof(rts) / sizeof(*rts); + int32_t rtl; + wchar_t *wcs; + UChar *cp; + const char *errname; + UChar ustr[] = {'h', 'e', 'l', 'l', 'o', 0}; + int32_t ul = sizeof(ustr)/sizeof(*ustr) -1; + char astr[100]; + + UErrorCode err; + + err = U_ZERO_ERROR; + wcs = u_strToWCS(ws, wcap, &wl, ustr, ul, &err); + if (U_FAILURE(err)) { + errname = u_errorName(err); + log_err("test_widestrs: u_strToWCS error: %s!\n",errname); + } + if(ul!=wl){ + log_err("u_strToWCS: ustr = %s, ul = %d, ws = %S, wl = %d!\n", u_austrcpy(astr, ustr), ul, ws, wl); + } + err = U_ZERO_ERROR; + wl = (int32_t)uprv_wcslen(wcs); + cp = u_strFromWCS(rts, rtcap, &rtl, wcs, wl, &err); + if (U_FAILURE(err)) { + errname = u_errorName(err); + fprintf(stderr, "test_widestrs: ucnv_wcstombs error: %s!\n",errname); + } + if(wl != rtl){ + log_err("u_strFromWCS: wcs = %S, wl = %d,rts = %s, rtl = %d!\n", wcs, wl, u_austrcpy(astr, rts), rtl); + } +} + +static void +Test_WCHART_LongString(){ + UErrorCode status = U_ZERO_ERROR; + const char* testdatapath=loadTestData(&status); + UResourceBundle *theBundle = ures_open(testdatapath, "testtypes", &status); + int32_t strLen =0; + const UChar* str = ures_getStringByKey(theBundle, "testinclude",&strLen,&status); + const UChar* uSrc = str; + int32_t uSrcLen = strLen; + int32_t wDestLen =0, reqLen=0, i=0; + int32_t uDestLen =0; + wchar_t* wDest = NULL; + UChar* uDest = NULL; + UBool failed = FALSE; + + if(U_FAILURE(status)){ + log_err("Could not get testinclude resource from testtypes bundle. Error: %s\n",u_errorName(status)); + return; + } + + /* pre-flight*/ + u_strToWCS(wDest,wDestLen,&reqLen,uSrc,-1,&status); + + if(status == U_BUFFER_OVERFLOW_ERROR){ + status=U_ZERO_ERROR; + wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen+1)); + wDestLen = reqLen+1; + u_strToWCS(wDest,wDestLen,&reqLen,uSrc,-1,&status); + } + uDestLen = 0; + /* pre-flight */ + u_strFromWCS(uDest, uDestLen,&reqLen,wDest,-1,&status); + + if(status == U_BUFFER_OVERFLOW_ERROR){ + status =U_ZERO_ERROR; + uDest = (UChar*) malloc(sizeof(UChar) * (reqLen+1)); + uDestLen = reqLen + 1; + u_strFromWCS(uDest, uDestLen,&reqLen,wDest,-1,&status); + } + + + for(i=0; i< uSrcLen; i++){ + if(uDest[i] != str[i]){ + log_verbose("u_str*WCS() failed for null terminated string expected: \\u%04X got: \\u%04X at index: %i \n", src16j[i] ,uDest[i],i); + failed =TRUE; + } + } + + if(U_FAILURE(status)){ + failed = TRUE; + } + if(failed){ + log_err("u_strToWCS() failed \n"); + } + free(wDest); + free(uDest); + /* close the bundle */ + ures_close(theBundle); + +} + diff --git a/icuSources/test/cintltst/custrtst.c b/icuSources/test/cintltst/custrtst.c index 31d388e6..358dd006 100644 --- a/icuSources/test/cintltst/custrtst.c +++ b/icuSources/test/cintltst/custrtst.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 2002-2003, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -1618,6 +1618,16 @@ compareIterNoIndexes(UCharIterator *iter1, const char *n1, return; } + /* iterate backward */ + do { + c1=iter1->previous(iter1); + c2=iter2->previous(iter2); + if(c1!=c2) { + log_err("%s->previous()=U+%04x != U+%04x=%s->previous() at %d\n", n1, c1, c2, n2, iter1->getIndex(iter1, UITER_CURRENT)); + return; + } + } while(c1>=0); + /* back to the middle */ iter1->move(iter1, middle, UITER_ZERO); iter2->move(iter2, middle, UITER_ZERO); @@ -1687,7 +1697,7 @@ compareIterNoIndexes(UCharIterator *iter1, const char *n1, static void testUNormIteratorWithText(const UChar *text, int32_t textLength, int32_t middle, const char *name1, const char *n2) { - UChar buffer[300]; + UChar buffer[600]; char name2[40]; UCharIterator iter1, iter2, *iter; @@ -1747,7 +1757,7 @@ TestUNormIterator() { 0x6e, 0xd900, 0x6a, 0xdc00, 0xd900, 0xdc00, 0x61 }; - UChar longText[300]; + UChar longText[600]; int32_t i, middle, length; length=LENGTHOF(text); @@ -1755,19 +1765,24 @@ TestUNormIterator() { testUNormIteratorWithText(text, length, length, "UCharIterEnd", "UNormIterEnd1"); /* test again, this time with an insane string to cause internal buffer overflows */ - middle=u_strchr(text, 0x327)-text; /* see comment at text[] */ + middle=(int32_t)(u_strchr(text, 0x327)-text); /* see comment at text[] */ memcpy(longText, text, middle*U_SIZEOF_UCHAR); for(i=0; i<150; ++i) { longText[middle+i]=0x30a; /* insert many rings between 'A-ring' and cedilla */ } memcpy(longText+middle+i, text+middle, (LENGTHOF(text)-middle)*U_SIZEOF_UCHAR); - length=LENGTHOF(text)+i; - testUNormIteratorWithText(longText, length, length/2, "UCharIterLong", "UNormIterLong1"); + + /* append another copy of this string for more overflows */ + memcpy(longText+length, longText, length*U_SIZEOF_UCHAR); + length*=2; + + /* the first test of the following two starts at length/4, inside the sea of combining rings */ + testUNormIteratorWithText(longText, length, length/4, "UCharIterLong", "UNormIterLong1"); testUNormIteratorWithText(longText, length, length, "UCharIterLongEnd", "UNormIterLongEnd1"); length=LENGTHOF(surrogateText); - testUNormIteratorWithText(surrogateText, length, length/2, "UCharIterSurr", "UNormIterSurr1"); + testUNormIteratorWithText(surrogateText, length, length/4, "UCharIterSurr", "UNormIterSurr1"); testUNormIteratorWithText(surrogateText, length, length, "UCharIterSurrEnd", "UNormIterSurrEnd1"); } diff --git a/icuSources/test/cintltst/cutiltst.c b/icuSources/test/cintltst/cutiltst.c index f0a36aca..c19b23de 100644 --- a/icuSources/test/cintltst/cutiltst.c +++ b/icuSources/test/cintltst/cutiltst.c @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** @@ -15,30 +15,32 @@ #include "cintltst.h" void addLocaleTest(TestNode**); +void addCLDRTest(TestNode**); void addUnicodeTest(TestNode**); void addUStringTest(TestNode**); void addResourceBundleTest(TestNode**); void addNEWResourceBundleTest(TestNode**); void addHashtableTest(TestNode** root); void addCStringTest(TestNode** root); -void addMemoryStreamTest(TestNode** root); void addTrieTest(TestNode** root); void addEnumerationTest(TestNode** root); void addPosixTest(TestNode** root); +void addSortTest(TestNode** root); void addUtility(TestNode** root); void addUtility(TestNode** root) { + addCStringTest(root); addTrieTest(root); addLocaleTest(root); + addCLDRTest(root); addUnicodeTest(root); addUStringTest(root); addResourceBundleTest(root); addNEWResourceBundleTest(root); addHashtableTest(root); - addCStringTest(root); - addMemoryStreamTest(root); addEnumerationTest(root); addPosixTest(root); + addSortTest(root); } diff --git a/icuSources/test/cintltst/encoll.c b/icuSources/test/cintltst/encoll.c index 38d5be44..1c48eca4 100644 --- a/icuSources/test/cintltst/encoll.c +++ b/icuSources/test/cintltst/encoll.c @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2003, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** @@ -240,9 +240,9 @@ const static UChar testAcute[][MAX_TOKEN_LEN] = { static const UChar testMore[][MAX_TOKEN_LEN] = { {(UChar)0x0061 /* 'a' */, (UChar)0x0065 /* 'e' */, 0}, - {(UChar)0x0061 /* 'a' */, (UChar)0x0066 /* 'f' */, 0}, { 0x00E6, 0}, { 0x00C6, 0}, + {(UChar)0x0061 /* 'a' */, (UChar)0x0066 /* 'f' */, 0}, {(UChar)0x006F /* 'o' */, (UChar)0x0065 /* 'e' */, 0}, { 0x0153, 0}, { 0x0152, 0}, diff --git a/icuSources/test/cintltst/hpmufn.c b/icuSources/test/cintltst/hpmufn.c new file mode 100644 index 00000000..1848abcd --- /dev/null +++ b/icuSources/test/cintltst/hpmufn.c @@ -0,0 +1,476 @@ +/******************************************************************** + * COPYRIGHT: + * Copyright (c) 200-20043, International Business Machines Corporation and + * others. All Rights Reserved. + ********************************************************************/ +/* +* File hpmufn.c +* +*/ + +#include "unicode/utypes.h" +#include "unicode/putil.h" +#include "unicode/uclean.h" +#include "unicode/uchar.h" +#include "unicode/ures.h" +#include "cintltst.h" +#include "umutex.h" +#include "unicode/utrace.h" +#include +#include + +/** + * This should align the memory properly on any machine. + */ +typedef union { + long t1; + double t2; + void *t3; +} ctest_AlignedMemory; + +static void TestHeapFunctions(void); +static void TestMutexFunctions(void); +static void TestIncDecFunctions(void); + +void addHeapMutexTest(TestNode **root); + + +void +addHeapMutexTest(TestNode** root) +{ + addTest(root, &TestHeapFunctions, "tsutil/hpmufn/TestHeapFunctions" ); + addTest(root, &TestMutexFunctions, "tsutil/hpmufn/TestMutexFunctions" ); + addTest(root, &TestIncDecFunctions, "tsutil/hpmufn/TestIncDecFunctions"); +} + +static int32_t gMutexFailures = 0; + +#define TEST_STATUS(status, expected) \ +if (status != expected) { \ +log_err("FAIL at %s:%d. Actual status = \"%s\"; Expected status = \"%s\"\n", \ + __FILE__, __LINE__, u_errorName(status), u_errorName(expected)); gMutexFailures++; } + + +#define TEST_ASSERT(expr) \ +if (!(expr)) { \ + log_err("FAILED Assertion \"" #expr "\" at %s:%d.\n", __FILE__, __LINE__); \ + gMutexFailures++; \ +} + + +/* These tests do cleanup and reinitialize ICU in the course of their operation. + * The ICU data directory must be preserved across these operations. + * Here is a helper function to assist with that. + */ +static char *safeGetICUDataDirectory() { + const char *dataDir = u_getDataDirectory(); /* Returned string vanashes with u_cleanup */ + char *retStr = NULL; + if (dataDir != NULL) { + retStr = (char *)malloc(strlen(dataDir)+1); + strcpy(retStr, dataDir); + } + return retStr; +} + + + +/* + * Test Heap Functions. + * Implemented on top of the standard malloc heap. + * All blocks increased in size by 8 to 16 bytes, and the poiner returned to ICU is + * offset up by 8 to 16, which should cause a good heap corruption if one of our "blocks" + * ends up being freed directly, without coming through us. + * Allocations are counted, to check that ICU actually does call back to us. + */ +int gBlockCount = 0; +const void *gContext; + +static void * U_CALLCONV myMemAlloc(const void *context, size_t size) { + char *retPtr = (char *)malloc(size+sizeof(ctest_AlignedMemory)); + if (retPtr != NULL) { + retPtr += sizeof(ctest_AlignedMemory); + } + gBlockCount ++; + return retPtr; +} + +static void U_CALLCONV myMemFree(const void *context, void *mem) { + char *freePtr = (char *)mem; + if (freePtr != NULL) { + freePtr -= sizeof(ctest_AlignedMemory); + } + free(freePtr); +} + + + +static void * U_CALLCONV myMemRealloc(const void *context, void *mem, size_t size) { + char *p = (char *)mem; + char *retPtr; + + if (p!=NULL) { + p -= sizeof(ctest_AlignedMemory); + } + retPtr = realloc(p, size+sizeof(ctest_AlignedMemory)); + if (retPtr != NULL) { + p += sizeof(ctest_AlignedMemory); + } + return retPtr; +} + + +static void TestHeapFunctions() { + UErrorCode status = U_ZERO_ERROR; + UResourceBundle *rb = NULL; + char *icuDataDir; + + UTraceEntry *traceEntryFunc; /* Tracing function ptrs. We need to save */ + UTraceExit *traceExitFunc; /* and restore them across calls to */ + UTraceData *traceDataFunc; /* u_cleanup() that we make in this test. */ + const void *traceContext; + int32_t traceLevel; + + icuDataDir = safeGetICUDataDirectory(); /* save icu data dir, so we can put it back + * after doing u_cleanup(). */ + + utrace_getFunctions(&traceContext, &traceEntryFunc, &traceExitFunc, &traceDataFunc); + traceLevel = utrace_getLevel(); + + /* Can not set memory functions if ICU is already initialized */ + u_setMemoryFunctions(&gContext, myMemAlloc, myMemRealloc, myMemFree, &status); + TEST_STATUS(status, U_INVALID_STATE_ERROR); + + /* Un-initialize ICU */ + u_cleanup(); + utrace_setFunctions(traceContext, traceEntryFunc, traceExitFunc, traceDataFunc); + utrace_setLevel(traceLevel); + + /* Can not set memory functions with NULL values */ + status = U_ZERO_ERROR; + u_setMemoryFunctions(&gContext, NULL, myMemRealloc, myMemFree, &status); + TEST_STATUS(status, U_ILLEGAL_ARGUMENT_ERROR); + status = U_ZERO_ERROR; + u_setMemoryFunctions(&gContext, myMemAlloc, NULL, myMemFree, &status); + TEST_STATUS(status, U_ILLEGAL_ARGUMENT_ERROR); + status = U_ZERO_ERROR; + u_setMemoryFunctions(&gContext, myMemAlloc, myMemRealloc, NULL, &status); + TEST_STATUS(status, U_ILLEGAL_ARGUMENT_ERROR); + + /* u_setMemoryFunctions() should work with null or non-null context pointer */ + status = U_ZERO_ERROR; + u_setMemoryFunctions(NULL, myMemAlloc, myMemRealloc, myMemFree, &status); + TEST_STATUS(status, U_ZERO_ERROR); + u_setMemoryFunctions(&gContext, myMemAlloc, myMemRealloc, myMemFree, &status); + TEST_STATUS(status, U_ZERO_ERROR); + + + /* After reinitializing ICU, we should not be able to set the memory funcs again. */ + status = U_ZERO_ERROR; + u_setDataDirectory(icuDataDir); + u_init(&status); + TEST_STATUS(status, U_ZERO_ERROR); + u_setMemoryFunctions(NULL, myMemAlloc, myMemRealloc, myMemFree, &status); + TEST_STATUS(status, U_INVALID_STATE_ERROR); + + /* Doing ICU operations should cause allocations to come through our test heap */ + gBlockCount = 0; + status = U_ZERO_ERROR; + rb = ures_open(NULL, "es", &status); + TEST_STATUS(status, U_ZERO_ERROR); + if (gBlockCount == 0) { + log_err("Heap functions are not being called from ICU.\n"); + } + ures_close(rb); + + /* Cleanup should put the heap back to its default implementation. */ + u_cleanup(); + utrace_setFunctions(traceContext, traceEntryFunc, traceExitFunc, traceDataFunc); + utrace_setLevel(traceLevel); + u_setDataDirectory(icuDataDir); + status = U_ZERO_ERROR; + u_init(&status); + TEST_STATUS(status, U_ZERO_ERROR); + + /* ICU operations should no longer cause allocations to come through our test heap */ + gBlockCount = 0; + status = U_ZERO_ERROR; + rb = ures_open(NULL, "fr", &status); + TEST_STATUS(status, U_ZERO_ERROR); + if (gBlockCount != 0) { + log_err("Heap functions did not reset after u_cleanup.\n"); + } + ures_close(rb); + free(icuDataDir); +} + + +/* + * Test u_setMutexFunctions() + */ + +int gTotalMutexesInitialized = 0; /* Total number of mutexes created */ +int gTotalMutexesActive = 0; /* Total mutexes created, but not destroyed */ +int gAccumulatedLocks = 0; +const void *gMutexContext; + +typedef struct DummyMutex { + int fLockCount; + int fMagic; +} DummyMutex; + + +static void U_CALLCONV myMutexInit(const void *context, UMTX *mutex, UErrorCode *status) { + DummyMutex *theMutex; + + TEST_STATUS(*status, U_ZERO_ERROR); + theMutex = (DummyMutex *)malloc(sizeof(DummyMutex)); + theMutex->fLockCount = 0; + theMutex->fMagic = 123456; + gTotalMutexesInitialized++; + gTotalMutexesActive++; + gMutexContext = context; + *mutex = theMutex; +} + + +static void U_CALLCONV myMutexDestroy(const void *context, UMTX *mutex) { + DummyMutex *This = *(DummyMutex **)mutex; + + gTotalMutexesActive--; + TEST_ASSERT(This->fLockCount == 0); + TEST_ASSERT(This->fMagic == 123456); + This->fMagic = 0; + This->fLockCount = 0; + free(This); +} + +static void U_CALLCONV myMutexLock(const void *context, UMTX *mutex) { + DummyMutex *This = *(DummyMutex **)mutex; + + TEST_ASSERT(This->fMagic == 123456); + This->fLockCount++; + gAccumulatedLocks++; +} + +static void U_CALLCONV myMutexUnlock(const void *context, UMTX *mutex) { + DummyMutex *This = *(DummyMutex **)mutex; + + TEST_ASSERT(This->fMagic == 123456); + This->fLockCount--; + TEST_ASSERT(This->fLockCount >= 0); +} + + + +static void TestMutexFunctions() { + UErrorCode status = U_ZERO_ERROR; + UResourceBundle *rb = NULL; + char *icuDataDir; + + UTraceEntry *traceEntryFunc; /* Tracing function ptrs. We need to save */ + UTraceExit *traceExitFunc; /* and restore them across calls to */ + UTraceData *traceDataFunc; /* u_cleanup() that we make in this test. */ + const void *traceContext; + int32_t traceLevel; + + gMutexFailures = 0; + + /* Save initial ICU state so that it can be restored later. + * u_cleanup(), which is called in this test, resets ICU's state. + */ + icuDataDir = safeGetICUDataDirectory(); + utrace_getFunctions(&traceContext, &traceEntryFunc, &traceExitFunc, &traceDataFunc); + traceLevel = utrace_getLevel(); + + /* Can not set mutex functions if ICU is already initialized */ + u_setMutexFunctions(&gContext, myMutexInit, myMutexDestroy, myMutexLock, myMutexUnlock, &status); + TEST_STATUS(status, U_INVALID_STATE_ERROR); + + /* Un-initialize ICU */ + u_cleanup(); + utrace_setFunctions(traceContext, traceEntryFunc, traceExitFunc, traceDataFunc); + utrace_setLevel(traceLevel); + + /* Can not set Mutex functions with NULL values */ + status = U_ZERO_ERROR; + u_setMutexFunctions(&gContext, NULL, myMutexDestroy, myMutexLock, myMutexUnlock, &status); + TEST_STATUS(status, U_ILLEGAL_ARGUMENT_ERROR); + status = U_ZERO_ERROR; + u_setMutexFunctions(&gContext, myMutexInit, NULL, myMutexLock, myMutexUnlock, &status); + TEST_STATUS(status, U_ILLEGAL_ARGUMENT_ERROR); + status = U_ZERO_ERROR; + u_setMutexFunctions(&gContext, myMutexInit, myMutexDestroy, NULL, myMutexUnlock, &status); + TEST_STATUS(status, U_ILLEGAL_ARGUMENT_ERROR); + status = U_ZERO_ERROR; + u_setMutexFunctions(&gContext, myMutexInit, myMutexDestroy, myMutexLock, NULL, &status); + TEST_STATUS(status, U_ILLEGAL_ARGUMENT_ERROR); + + /* u_setMutexFunctions() should work with null or non-null context pointer */ + status = U_ZERO_ERROR; + u_setMutexFunctions(&gContext, myMutexInit, myMutexDestroy, myMutexLock, myMutexUnlock, &status); + TEST_STATUS(status, U_ZERO_ERROR); + u_setMutexFunctions(&gContext, myMutexInit, myMutexDestroy, myMutexLock, myMutexUnlock, &status); + TEST_STATUS(status, U_ZERO_ERROR); + + + /* After reinitializing ICU, we should not be able to set the mutex funcs again. */ + status = U_ZERO_ERROR; + u_setDataDirectory(icuDataDir); + u_init(&status); + TEST_STATUS(status, U_ZERO_ERROR); + u_setMutexFunctions(&gContext, myMutexInit, myMutexDestroy, myMutexLock, myMutexUnlock, &status); + TEST_STATUS(status, U_INVALID_STATE_ERROR); + + /* Doing ICU operations should cause allocations to come through our test mutexes */ + gBlockCount = 0; + status = U_ZERO_ERROR; + rb = ures_open(NULL, "es", &status); + TEST_STATUS(status, U_ZERO_ERROR); + TEST_ASSERT(gTotalMutexesInitialized > 0); + TEST_ASSERT(gTotalMutexesActive > 0); + + ures_close(rb); + + /* Cleanup should destroy all of the mutexes. */ + u_cleanup(); + u_setDataDirectory(icuDataDir); + utrace_setFunctions(traceContext, traceEntryFunc, traceExitFunc, traceDataFunc); + utrace_setLevel(traceLevel); + status = U_ZERO_ERROR; + TEST_ASSERT(gTotalMutexesInitialized > 0); + TEST_ASSERT(gTotalMutexesActive == 0); + + + /* Additional ICU operations should no longer use our dummy test mutexes */ + gTotalMutexesInitialized = 0; + gTotalMutexesActive = 0; + u_init(&status); + TEST_STATUS(status, U_ZERO_ERROR); + + status = U_ZERO_ERROR; + rb = ures_open(NULL, "fr", &status); + TEST_STATUS(status, U_ZERO_ERROR); + TEST_ASSERT(gTotalMutexesInitialized == 0); + TEST_ASSERT(gTotalMutexesActive == 0); + + ures_close(rb); + free(icuDataDir); + + if(gMutexFailures) { + log_info("Note: these failures may be caused by ICU failing to initialize/uninitialize properly.\n"); + log_verbose("Check for prior tests which may not have closed all open resources. See the internal function ures_flushCache()\n"); + } +} + + + + +/* + * Test Atomic Increment & Decrement Functions + */ + +int gIncCount = 0; +int gDecCount = 0; +const void *gIncDecContext; + + +static int32_t U_CALLCONV myIncFunc(const void *context, int32_t *p) { + int32_t retVal; + TEST_ASSERT(context == gIncDecContext); + gIncCount++; + retVal = ++(*p); + return retVal; +} + +static int32_t U_CALLCONV myDecFunc(const void *context, int32_t *p) { + int32_t retVal; + TEST_ASSERT(context == gIncDecContext); + gDecCount++; + retVal = --(*p); + return retVal; +} + + + + +static void TestIncDecFunctions() { + UErrorCode status = U_ZERO_ERROR; + int32_t t = 1; /* random value to make sure that Inc/dec works */ + char *dataDir; + + UTraceEntry *traceEntryFunc; /* Tracing function ptrs. We need to save */ + UTraceExit *traceExitFunc; /* and restore them across calls to */ + UTraceData *traceDataFunc; /* u_cleanup() that we make in this test. */ + const void *traceContext; + int32_t traceLevel; + + /* Can not set mutex functions if ICU is already initialized */ + u_setAtomicIncDecFunctions(&gIncDecContext, myIncFunc, myDecFunc, &status); + TEST_STATUS(status, U_INVALID_STATE_ERROR); + + /* Un-initialize ICU */ + dataDir = safeGetICUDataDirectory(); + utrace_getFunctions(&traceContext, &traceEntryFunc, &traceExitFunc, &traceDataFunc); + traceLevel = utrace_getLevel(); + u_cleanup(); + utrace_setFunctions(traceContext, traceEntryFunc, traceExitFunc, traceDataFunc); + utrace_setLevel(traceLevel); + + /* Can not set functions with NULL values */ + status = U_ZERO_ERROR; + u_setAtomicIncDecFunctions(&gIncDecContext, NULL, myDecFunc, &status); + TEST_STATUS(status, U_ILLEGAL_ARGUMENT_ERROR); + status = U_ZERO_ERROR; + u_setAtomicIncDecFunctions(&gIncDecContext, myIncFunc, NULL, &status); + TEST_STATUS(status, U_ILLEGAL_ARGUMENT_ERROR); + + /* u_setIncDecFunctions() should work with null or non-null context pointer */ + status = U_ZERO_ERROR; + u_setAtomicIncDecFunctions(NULL, myIncFunc, myDecFunc, &status); + TEST_STATUS(status, U_ZERO_ERROR); + u_setAtomicIncDecFunctions(&gIncDecContext, myIncFunc, myDecFunc, &status); + TEST_STATUS(status, U_ZERO_ERROR); + + + /* After reinitializing ICU, we should not be able to set the inc/dec funcs again. */ + status = U_ZERO_ERROR; + u_setDataDirectory(dataDir); + u_init(&status); + TEST_STATUS(status, U_ZERO_ERROR); + u_setAtomicIncDecFunctions(&gIncDecContext, myIncFunc, myDecFunc, &status); + TEST_STATUS(status, U_INVALID_STATE_ERROR); + + /* Doing ICU operations should cause our functions to be called */ + gIncCount = 0; + gDecCount = 0; + umtx_atomic_inc(&t); + TEST_ASSERT(t == 2); + umtx_atomic_dec(&t); + TEST_ASSERT(t == 1); + TEST_ASSERT(gIncCount > 0); + TEST_ASSERT(gDecCount > 0); + + + /* Cleanup should cancel use of our inc/dec functions. */ + /* Additional ICU operations should not use them */ + u_cleanup(); + utrace_setFunctions(traceContext, traceEntryFunc, traceExitFunc, traceDataFunc); + utrace_setLevel(traceLevel); + gIncCount = 0; + gDecCount = 0; + status = U_ZERO_ERROR; + u_setDataDirectory(dataDir); + u_init(&status); + TEST_ASSERT(gIncCount == 0); + TEST_ASSERT(gDecCount == 0); + + status = U_ZERO_ERROR; + umtx_atomic_inc(&t); + umtx_atomic_dec(&t); + TEST_STATUS(status, U_ZERO_ERROR); + TEST_ASSERT(gIncCount == 0); + TEST_ASSERT(gDecCount == 0); + + free(dataDir); +} + diff --git a/icuSources/test/cintltst/idnatest.c b/icuSources/test/cintltst/idnatest.c new file mode 100644 index 00000000..c7d5c1c9 --- /dev/null +++ b/icuSources/test/cintltst/idnatest.c @@ -0,0 +1,667 @@ +/* + ******************************************************************************* + * + * Copyright (C) 2003-2004, International Business Machines + * Corporation and others. All Rights Reserved. + * + ******************************************************************************* + * file name: idnatest.c + * encoding: US-ASCII + * tab size: 8 (not used) + * indentation:4 + * + * created on: 2003jul11 + * created by: Ram Viswanadha + */ +#include +#include +#include "unicode/utypes.h" + +#if !UCONFIG_NO_IDNA + +#include "unicode/ustring.h" +#include "unicode/uidna.h" +#include "cintltst.h" + + + +#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) +#define MAX_DEST_SIZE 1000 + +static void TestToUnicode(void); +static void TestToASCII(void); +static void TestIDNToUnicode(void); +static void TestIDNToASCII(void); +static void TestCompare(void); +static void TestUnicode32Norm(void); + +void addIDNATest(TestNode** root); + + +typedef int32_t +(U_EXPORT2 *TestFunc) ( const UChar *src, int32_t srcLength, + UChar *dest, int32_t destCapacity, + int32_t options, UParseError *parseError, + UErrorCode *status); +typedef int32_t +(U_EXPORT2 *CompareFunc) (const UChar *s1, int32_t s1Len, + const UChar *s2, int32_t s2Len, + int32_t options, + UErrorCode *status); + + +void +addIDNATest(TestNode** root) +{ + addTest(root, &TestToUnicode, "idna/TestToUnicode"); + addTest(root, &TestToASCII, "idna/TestToASCII"); + addTest(root, &TestIDNToUnicode, "idna/TestIDNToUnicode"); + addTest(root, &TestIDNToASCII, "idna/TestIDNToASCII"); + addTest(root, &TestCompare, "idna/TestCompare"); + addTest(root, &TestUnicode32Norm,"idna/TestUnicode32Norm"); +} + +static void +testAPI(const UChar* src, const UChar* expected, const char* testName, + UBool useSTD3ASCIIRules,UErrorCode expectedStatus, + UBool doCompare, UBool testUnassigned, TestFunc func){ + + UErrorCode status = U_ZERO_ERROR; + UChar destStack[MAX_DEST_SIZE]; + int32_t destLen = 0; + UChar* dest = NULL; + int32_t expectedLen = (expected != NULL) ? u_strlen(expected) : 0; + int32_t options = (useSTD3ASCIIRules == TRUE) ? UIDNA_USE_STD3_RULES : UIDNA_DEFAULT; + UParseError parseError; + int32_t tSrcLen = 0; + UChar* tSrc = NULL; + + if(src != NULL){ + tSrcLen = u_strlen(src); + tSrc =(UChar*) malloc( U_SIZEOF_UCHAR * tSrcLen ); + memcpy(tSrc,src,tSrcLen * U_SIZEOF_UCHAR); + } + + /* test null-terminated source and return value of number of UChars required */ + + destLen = func(src,-1,NULL,0,options, &parseError , &status); + if(status == U_BUFFER_OVERFLOW_ERROR){ + status = U_ZERO_ERROR; /* reset error code */ + if(destLen+1 < MAX_DEST_SIZE){ + dest = destStack; + destLen = func(src,-1,dest,destLen+1,options, &parseError, &status); + /* TODO : compare output with expected */ + if(U_SUCCESS(status) && expectedStatus != U_IDNA_STD3_ASCII_RULES_ERROR&& (doCompare==TRUE) && u_strCaseCompare(dest,destLen, expected,expectedLen,0,&status)!=0){ + log_err("Did not get the expected result for null terminated source.\n" ); + } + }else{ + log_err( "%s null terminated source failed. Requires destCapacity > 300\n",testName); + } + } + + if(status != expectedStatus){ + log_err( "Did not get the expected error for %s null terminated source failed. Expected: %s Got: %s\n",testName, u_errorName(expectedStatus), u_errorName(status)); + free(tSrc); + return; + } + if(testUnassigned ){ + status = U_ZERO_ERROR; + destLen = func(src,-1,NULL,0,options | UIDNA_ALLOW_UNASSIGNED, &parseError, &status); + if(status == U_BUFFER_OVERFLOW_ERROR){ + status = U_ZERO_ERROR; /* reset error code */ + if(destLen+1 < MAX_DEST_SIZE){ + dest = destStack; + destLen = func(src,-1,dest,destLen+1,options | UIDNA_ALLOW_UNASSIGNED, &parseError, &status); + /* TODO : compare output with expected */ + if(U_SUCCESS(status) && (doCompare==TRUE) && u_strCaseCompare(dest,destLen, expected,expectedLen,0,&status)!=0){ + log_err("Did not get the expected result for %s null terminated source with both options set.\n",testName); + + } + }else{ + log_err( "%s null terminated source failed. Requires destCapacity > 300\n",testName); + } + } + /*testing query string*/ + if(status != expectedStatus && expectedStatus != U_IDNA_UNASSIGNED_ERROR){ + log_err( "Did not get the expected error for %s null terminated source with options set. Expected: %s Got: %s\n",testName, u_errorName(expectedStatus), u_errorName(status)); + } + } + + status = U_ZERO_ERROR; + + /* test source with lengthand return value of number of UChars required*/ + destLen = func(tSrc, tSrcLen, NULL,0,options, &parseError, &status); + if(status == U_BUFFER_OVERFLOW_ERROR){ + status = U_ZERO_ERROR; /* reset error code */ + if(destLen+1 < MAX_DEST_SIZE){ + dest = destStack; + destLen = func(src,u_strlen(src),dest,destLen+1,options, &parseError, &status); + /* TODO : compare output with expected */ + if(U_SUCCESS(status) && (doCompare==TRUE) && u_strCaseCompare(dest,destLen, expected,expectedLen,0,&status)!=0){ + log_err("Did not get the expected result for %s with source length.\n",testName); + } + }else{ + log_err( "%s with source length failed. Requires destCapacity > 300\n",testName); + } + } + + if(status != expectedStatus){ + log_err( "Did not get the expected error for %s with source length. Expected: %s Got: %s\n",testName, u_errorName(expectedStatus), u_errorName(status)); + } + if(testUnassigned){ + status = U_ZERO_ERROR; + + destLen = func(tSrc,tSrcLen,NULL,0,options | UIDNA_ALLOW_UNASSIGNED, &parseError, &status); + + if(status == U_BUFFER_OVERFLOW_ERROR){ + status = U_ZERO_ERROR; /* reset error code */ + if(destLen+1 < MAX_DEST_SIZE){ + dest = destStack; + destLen = func(src,u_strlen(src),dest,destLen+1,options | UIDNA_ALLOW_UNASSIGNED, &parseError, &status); + /* TODO : compare output with expected */ + if(U_SUCCESS(status) && (doCompare==TRUE) && u_strCaseCompare(dest,destLen, expected,expectedLen,0,&status)!=0){ + log_err("Did not get the expected result for %s with source length and both options set.\n",testName); + } + }else{ + log_err( "%s with source length failed. Requires destCapacity > 300\n",testName); + } + } + /*testing query string*/ + if(status != expectedStatus && expectedStatus != U_IDNA_UNASSIGNED_ERROR){ + log_err( "Did not get the expected error for %s with source length and options set. Expected: %s Got: %s\n",testName, u_errorName(expectedStatus), u_errorName(status)); + } + } + + status = U_ZERO_ERROR; + destLen = func(src,-1,NULL,0,options | UIDNA_USE_STD3_RULES, &parseError, &status); + if(status == U_BUFFER_OVERFLOW_ERROR){ + status = U_ZERO_ERROR; /* reset error code*/ + if(destLen+1 < MAX_DEST_SIZE){ + dest = destStack; + destLen = func(src,-1,dest,destLen+1,options | UIDNA_USE_STD3_RULES, &parseError, &status); + /* TODO : compare output with expected*/ + if(U_SUCCESS(status) && (doCompare==TRUE) && u_strCaseCompare(dest,destLen, expected,expectedLen,0,&status)!=0){ + log_err("Did not get the expected result for %s null terminated source with both options set.\n",testName); + + } + }else{ + log_err( "%s null terminated source failed. Requires destCapacity > 300\n",testName); + } + } + /*testing query string*/ + if(status != expectedStatus){ + log_err( "Did not get the expected error for %s null terminated source with options set. Expected: %s Got: %s\n",testName, u_errorName(expectedStatus), u_errorName(status)); + } + + status = U_ZERO_ERROR; + + destLen = func(tSrc,tSrcLen,NULL,0,options | UIDNA_USE_STD3_RULES, &parseError, &status); + + if(status == U_BUFFER_OVERFLOW_ERROR){ + status = U_ZERO_ERROR; /* reset error code*/ + if(destLen+1 < MAX_DEST_SIZE){ + dest = destStack; + destLen = func(src,u_strlen(src),dest,destLen+1,options | UIDNA_USE_STD3_RULES, &parseError, &status); + /* TODO : compare output with expected*/ + if(U_SUCCESS(status) && (doCompare==TRUE) && u_strCaseCompare(dest,destLen, expected,expectedLen,0,&status)!=0){ + log_err("Did not get the expected result for %s with source length and both options set.\n",testName); + } + }else{ + log_err( "%s with source length failed. Requires destCapacity > 300\n",testName); + } + } + /*testing query string*/ + if(status != expectedStatus && expectedStatus != U_IDNA_UNASSIGNED_ERROR){ + log_err( "Did not get the expected error for %s with source length and options set. Expected: %s Got: %s\n",testName, u_errorName(expectedStatus), u_errorName(status)); + } + free(tSrc); +} + +static UChar unicodeIn[][41] ={ + { + 0x0644, 0x064A, 0x0647, 0x0645, 0x0627, 0x0628, 0x062A, 0x0643, 0x0644, + 0x0645, 0x0648, 0x0634, 0x0639, 0x0631, 0x0628, 0x064A, 0x061F, 0x0000 + }, + { + 0x4ED6, 0x4EEC, 0x4E3A, 0x4EC0, 0x4E48, 0x4E0D, 0x8BF4, 0x4E2D, 0x6587, + 0x0000 + }, + { + 0x0050, 0x0072, 0x006F, 0x010D, 0x0070, 0x0072, 0x006F, 0x0073, 0x0074, + 0x011B, 0x006E, 0x0065, 0x006D, 0x006C, 0x0075, 0x0076, 0x00ED, 0x010D, + 0x0065, 0x0073, 0x006B, 0x0079, 0x0000 + }, + { + 0x05DC, 0x05DE, 0x05D4, 0x05D4, 0x05DD, 0x05E4, 0x05E9, 0x05D5, 0x05D8, + 0x05DC, 0x05D0, 0x05DE, 0x05D3, 0x05D1, 0x05E8, 0x05D9, 0x05DD, 0x05E2, + 0x05D1, 0x05E8, 0x05D9, 0x05EA, 0x0000 + }, + { + 0x092F, 0x0939, 0x0932, 0x094B, 0x0917, 0x0939, 0x093F, 0x0928, 0x094D, + 0x0926, 0x0940, 0x0915, 0x094D, 0x092F, 0x094B, 0x0902, 0x0928, 0x0939, + 0x0940, 0x0902, 0x092C, 0x094B, 0x0932, 0x0938, 0x0915, 0x0924, 0x0947, + 0x0939, 0x0948, 0x0902, 0x0000 + }, + { + 0x306A, 0x305C, 0x307F, 0x3093, 0x306A, 0x65E5, 0x672C, 0x8A9E, 0x3092, + 0x8A71, 0x3057, 0x3066, 0x304F, 0x308C, 0x306A, 0x3044, 0x306E, 0x304B, + 0x0000 + }, +/* + { + 0xC138, 0xACC4, 0xC758, 0xBAA8, 0xB4E0, 0xC0AC, 0xB78C, 0xB4E4, 0xC774, + 0xD55C, 0xAD6D, 0xC5B4, 0xB97C, 0xC774, 0xD574, 0xD55C, 0xB2E4, 0xBA74, + 0xC5BC, 0xB9C8, 0xB098, 0xC88B, 0xC744, 0xAE4C, 0x0000 + }, +*/ + { + 0x043F, 0x043E, 0x0447, 0x0435, 0x043C, 0x0443, 0x0436, 0x0435, 0x043E, + 0x043D, 0x0438, 0x043D, 0x0435, 0x0433, 0x043E, 0x0432, 0x043E, 0x0440, + 0x044F, 0x0442, 0x043F, 0x043E, 0x0440, 0x0443, 0x0441, 0x0441, 0x043A, + 0x0438, 0x0000 + }, + { + 0x0050, 0x006F, 0x0072, 0x0071, 0x0075, 0x00E9, 0x006E, 0x006F, 0x0070, + 0x0075, 0x0065, 0x0064, 0x0065, 0x006E, 0x0073, 0x0069, 0x006D, 0x0070, + 0x006C, 0x0065, 0x006D, 0x0065, 0x006E, 0x0074, 0x0065, 0x0068, 0x0061, + 0x0062, 0x006C, 0x0061, 0x0072, 0x0065, 0x006E, 0x0045, 0x0073, 0x0070, + 0x0061, 0x00F1, 0x006F, 0x006C, 0x0000 + }, + { + 0x4ED6, 0x5011, 0x7232, 0x4EC0, 0x9EBD, 0x4E0D, 0x8AAA, 0x4E2D, 0x6587, + 0x0000 + }, + { + 0x0054, 0x1EA1, 0x0069, 0x0073, 0x0061, 0x006F, 0x0068, 0x1ECD, 0x006B, + 0x0068, 0x00F4, 0x006E, 0x0067, 0x0074, 0x0068, 0x1EC3, 0x0063, 0x0068, + 0x1EC9, 0x006E, 0x00F3, 0x0069, 0x0074, 0x0069, 0x1EBF, 0x006E, 0x0067, + 0x0056, 0x0069, 0x1EC7, 0x0074, 0x0000 + }, + { + 0x0033, 0x5E74, 0x0042, 0x7D44, 0x91D1, 0x516B, 0x5148, 0x751F, 0x0000 + }, + { + 0x5B89, 0x5BA4, 0x5948, 0x7F8E, 0x6075, 0x002D, 0x0077, 0x0069, 0x0074, + 0x0068, 0x002D, 0x0053, 0x0055, 0x0050, 0x0045, 0x0052, 0x002D, 0x004D, + 0x004F, 0x004E, 0x004B, 0x0045, 0x0059, 0x0053, 0x0000 + }, + { + 0x0048, 0x0065, 0x006C, 0x006C, 0x006F, 0x002D, 0x0041, 0x006E, 0x006F, + 0x0074, 0x0068, 0x0065, 0x0072, 0x002D, 0x0057, 0x0061, 0x0079, 0x002D, + 0x305D, 0x308C, 0x305E, 0x308C, 0x306E, 0x5834, 0x6240, 0x0000 + }, + { + 0x3072, 0x3068, 0x3064, 0x5C4B, 0x6839, 0x306E, 0x4E0B, 0x0032, 0x0000 + }, + { + 0x004D, 0x0061, 0x006A, 0x0069, 0x3067, 0x004B, 0x006F, 0x0069, 0x3059, + 0x308B, 0x0035, 0x79D2, 0x524D, 0x0000 + }, + { + 0x30D1, 0x30D5, 0x30A3, 0x30FC, 0x0064, 0x0065, 0x30EB, 0x30F3, 0x30D0, + 0x0000 + }, + { + 0x305D, 0x306E, 0x30B9, 0x30D4, 0x30FC, 0x30C9, 0x3067, 0x0000 + }, + /* test non-BMP code points */ + { + 0xD800, 0xDF00, 0xD800, 0xDF01, 0xD800, 0xDF02, 0xD800, 0xDF03, 0xD800, 0xDF05, + 0xD800, 0xDF06, 0xD800, 0xDF07, 0xD800, 0xDF09, 0xD800, 0xDF0A, 0xD800, 0xDF0B, + 0x0000 + }, + { + 0xD800, 0xDF0D, 0xD800, 0xDF0C, 0xD800, 0xDF1E, 0xD800, 0xDF0F, 0xD800, 0xDF16, + 0xD800, 0xDF15, 0xD800, 0xDF14, 0xD800, 0xDF12, 0xD800, 0xDF10, 0xD800, 0xDF20, + 0xD800, 0xDF21, + 0x0000 + }, + /* Greek */ + { + 0x03b5, 0x03bb, 0x03bb, 0x03b7, 0x03bd, 0x03b9, 0x03ba, 0x03ac + }, + /* Maltese */ + { + 0x0062, 0x006f, 0x006e, 0x0121, 0x0075, 0x0073, 0x0061, 0x0127, + 0x0127, 0x0061 + }, + /* Russian */ + { + 0x043f, 0x043e, 0x0447, 0x0435, 0x043c, 0x0443, 0x0436, 0x0435, + 0x043e, 0x043d, 0x0438, 0x043d, 0x0435, 0x0433, 0x043e, 0x0432, + 0x043e, 0x0440, 0x044f, 0x0442, 0x043f, 0x043e, 0x0440, 0x0443, + 0x0441, 0x0441, 0x043a, 0x0438 + } + +}; + +static const char *asciiIn[] = { + "xn--egbpdaj6bu4bxfgehfvwxn", + "xn--ihqwcrb4cv8a8dqg056pqjye", + "xn--Proprostnemluvesky-uyb24dma41a", + "xn--4dbcagdahymbxekheh6e0a7fei0b", + "xn--i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd", + "xn--n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa", +/* "xn--989aomsvi5e83db1d2a355cv1e0vak1dwrv93d5xbh15a0dt30a5jpsd879ccm6fea98c",*/ + "xn--b1abfaaepdrnnbgefbaDotcwatmq2g4l", + "xn--PorqunopuedensimplementehablarenEspaol-fmd56a", + "xn--ihqwctvzc91f659drss3x8bo0yb", + "xn--TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g", + "xn--3B-ww4c5e180e575a65lsy2b", + "xn---with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n", + "xn--Hello-Another-Way--fc4qua05auwb3674vfr0b", + "xn--2-u9tlzr9756bt3uc0v", + "xn--MajiKoi5-783gue6qz075azm5e", + "xn--de-jg4avhby1noc0d", + "xn--d9juau41awczczp", + "XN--097CCDEKGHQJK", + "XN--db8CBHEJLGH4E0AL", + "xn--hxargifdar", /* Greek */ + "xn--bonusaa-5bb1da", /* Maltese */ + "xn--b1abfaaepdrnnbgefbadotcwatmq2g4l", /* Russian (Cyrillic)*/ + +}; + +static const char *domainNames[] = { + "slip129-37-118-146.nc.us.ibm.net", + "saratoga.pe.utexas.edu", + "dial-120-45.ots.utexas.edu", + "woo-085.dorms.waller.net", + "hd30-049.hil.compuserve.com", + "pem203-31.pe.ttu.edu", + "56K-227.MaxTNT3.pdq.net", + "dial-36-2.ots.utexas.edu", + "slip129-37-23-152.ga.us.ibm.net", + "ts45ip119.cadvision.com", + "sdn-ts-004txaustP05.dialsprint.net", + "bar-tnt1s66.erols.com", + "101.st-louis-15.mo.dial-access.att.net", + "h92-245.Arco.COM", + "dial-13-2.ots.utexas.edu", + "net-redynet29.datamarkets.com.ar", + "ccs-shiva28.reacciun.net.ve", + "7.houston-11.tx.dial-access.att.net", + "ingw129-37-120-26.mo.us.ibm.net", + "dialup6.austintx.com", + "dns2.tpao.gov.tr", + "slip129-37-119-194.nc.us.ibm.net", + "cs7.dillons.co.uk.203.119.193.in-addr.arpa", + "swprd1.innovplace.saskatoon.sk.ca", + "bikini.bologna.maraut.it", + "node91.subnet159-198-79.baxter.com", + "cust19.max5.new-york.ny.ms.uu.net", + "balexander.slip.andrew.cmu.edu", + "pool029.max2.denver.co.dynip.alter.net", + "cust49.max9.new-york.ny.ms.uu.net", + "s61.abq-dialin2.hollyberry.com", + "\\u0917\\u0928\\u0947\\u0936.sanjose.ibm.com", /*':'(0x003a) produces U_IDNA_STD3_ASCII_RULES_ERROR*/ + "www.xn--vea.com", + /* "www.\\u00E0\\u00B3\\u00AF.com",//' ' (0x0020) produces U_IDNA_STD3_ASCII_RULES_ERROR*/ + "www.\\u00C2\\u00A4.com", + "www.\\u00C2\\u00A3.com", + /* "\\u0025", //'%' (0x0025) produces U_IDNA_STD3_ASCII_RULES_ERROR*/ + /* "\\u005C\\u005C", //'\' (0x005C) produces U_IDNA_STD3_ASCII_RULES_ERROR*/ + /*"@",*/ + /*"\\u002F",*/ + /*"www.\\u0021.com",*/ + /*"www.\\u0024.com",*/ + /*"\\u003f",*/ + /* These yeild U_IDNA_PROHIBITED_ERROR*/ + /*"\\u00CF\\u0082.com",*/ + /*"\\u00CE\\u00B2\\u00C3\\u009Fss.com",*/ + /*"\\u00E2\\u0098\\u00BA.com",*/ + "\\u00C3\\u00BC.com", + +}; + +static void +TestToASCII(){ + + int32_t i; + UChar buf[MAX_DEST_SIZE]; + const char* testName = "uidna_toASCII"; + TestFunc func = uidna_toASCII; + for(i=0;i< (int32_t)(sizeof(unicodeIn)/sizeof(unicodeIn[0])); i++){ + u_charsToUChars(asciiIn[i],buf, (int32_t)strlen(asciiIn[i])+1); + testAPI(unicodeIn[i], buf,testName, FALSE,U_ZERO_ERROR, TRUE, TRUE, func); + + } +} + +static void +TestToUnicode(){ + + int32_t i; + UChar buf[MAX_DEST_SIZE]; + const char* testName = "uidna_toUnicode"; + TestFunc func = uidna_toUnicode; + for(i=0;i< (int32_t)(sizeof(asciiIn)/sizeof(asciiIn[0])); i++){ + u_charsToUChars(asciiIn[i],buf, (int32_t)strlen(asciiIn[i])+1); + testAPI(buf,unicodeIn[i],testName,FALSE,U_ZERO_ERROR, TRUE, TRUE, func); + } +} + + +static void +TestIDNToUnicode(){ + int32_t i; + UChar buf[MAX_DEST_SIZE]; + UChar expected[MAX_DEST_SIZE]; + UErrorCode status = U_ZERO_ERROR; + int32_t bufLen = 0; + UParseError parseError; + const char* testName="uidna_IDNToUnicode"; + TestFunc func = uidna_IDNToUnicode; + for(i=0;i< (int32_t)(sizeof(domainNames)/sizeof(domainNames[0])); i++){ + bufLen = (int32_t)strlen(domainNames[i]); + bufLen = u_unescape(domainNames[i],buf, bufLen+1); + func(buf,bufLen,expected,MAX_DEST_SIZE, UIDNA_ALLOW_UNASSIGNED, &parseError,&status); + if(U_FAILURE(status)){ + log_err( "%s failed to convert domainNames[%i].Error: %s \n",testName, i, u_errorName(status)); + break; + } + testAPI(buf,expected,testName,FALSE,U_ZERO_ERROR, TRUE, TRUE, func); + /*test toUnicode with all labels in the string*/ + testAPI(buf,expected,testName, FALSE,U_ZERO_ERROR, TRUE, TRUE, func); + if(U_FAILURE(status)){ + log_err( "%s failed to convert domainNames[%i].Error: %s \n",testName,i, u_errorName(status)); + break; + } + } + +} + +static void +TestIDNToASCII(){ + int32_t i; + UChar buf[MAX_DEST_SIZE]; + UChar expected[MAX_DEST_SIZE]; + UErrorCode status = U_ZERO_ERROR; + int32_t bufLen = 0; + UParseError parseError; + const char* testName="udina_IDNToASCII"; + TestFunc func=uidna_IDNToASCII; + + for(i=0;i< (int32_t)(sizeof(domainNames)/sizeof(domainNames[0])); i++){ + bufLen = (int32_t)strlen(domainNames[i]); + bufLen = u_unescape(domainNames[i],buf, bufLen+1); + func(buf,bufLen,expected,MAX_DEST_SIZE, UIDNA_ALLOW_UNASSIGNED, &parseError,&status); + if(U_FAILURE(status)){ + log_err( "%s failed to convert domainNames[%i].Error: %s \n",testName,i, u_errorName(status)); + break; + } + testAPI(buf,expected,testName, FALSE,U_ZERO_ERROR, TRUE, TRUE, func); + /*test toASCII with all labels in the string*/ + testAPI(buf,expected,testName, FALSE,U_ZERO_ERROR, FALSE, TRUE, func); + if(U_FAILURE(status)){ + log_err( "%s failed to convert domainNames[%i].Error: %s \n",testName,i, u_errorName(status)); + break; + } + } + + +} + + +static void +testCompareWithSrc(const UChar* s1, int32_t s1Len, + const UChar* s2, int32_t s2Len, + const char* testName, CompareFunc func, + UBool isEqual){ + + UErrorCode status = U_ZERO_ERROR; + int32_t retVal = func(s1,-1,s2,-1,UIDNA_DEFAULT,&status); + + if(isEqual==TRUE && retVal !=0){ + log_err("Did not get the expected result for %s with null termniated strings.\n",testName); + } + if(U_FAILURE(status)){ + log_err( "%s null terminated source failed. Error: %s\n", testName,u_errorName(status)); + } + + status = U_ZERO_ERROR; + retVal = func(s1,-1,s2,-1,UIDNA_ALLOW_UNASSIGNED,&status); + + if(isEqual==TRUE && retVal !=0){ + log_err("Did not get the expected result for %s with null termniated strings with options set.\n", testName); + } + if(U_FAILURE(status)){ + log_err( "%s null terminated source and options set failed. Error: %s\n",testName, u_errorName(status)); + } + + status = U_ZERO_ERROR; + retVal = func(s1,s1Len,s2,s2Len,UIDNA_DEFAULT,&status); + + if(isEqual==TRUE && retVal !=0){ + log_err("Did not get the expected result for %s with string length.\n",testName); + } + if(U_FAILURE(status)){ + log_err( "%s with string length. Error: %s\n",testName, u_errorName(status)); + } + + status = U_ZERO_ERROR; + retVal = func(s1,s1Len,s2,s2Len,UIDNA_ALLOW_UNASSIGNED,&status); + + if(isEqual==TRUE && retVal !=0){ + log_err("Did not get the expected result for %s with string length and options set.\n",testName); + } + if(U_FAILURE(status)){ + log_err( "%s with string length and options set. Error: %s\n", u_errorName(status), testName); + } +} + + +static void +TestCompare(){ + int32_t i; + + const char* testName ="uidna_compare"; + CompareFunc func = uidna_compare; + + UChar www[] = {0x0057, 0x0057, 0x0057, 0x002E, 0x0000}; + UChar com[] = {0x002E, 0x0043, 0x004F, 0x004D, 0x0000}; + UChar buf[MAX_DEST_SIZE]={0x0057, 0x0057, 0x0057, 0x002E, 0x0000}; + UChar source[MAX_DEST_SIZE]={0}, + uni0[MAX_DEST_SIZE]={0}, + uni1[MAX_DEST_SIZE]={0}, + ascii0[MAX_DEST_SIZE]={0}, + ascii1[MAX_DEST_SIZE]={0}, + temp[MAX_DEST_SIZE] ={0}; + + + u_strcat(uni0,unicodeIn[0]); + u_strcat(uni0,com); + + u_strcat(uni1,unicodeIn[1]); + u_strcat(uni1,com); + + u_charsToUChars(asciiIn[0], temp, (int32_t)strlen(asciiIn[0])); + u_strcat(ascii0,temp); + u_strcat(ascii0,com); + + memset(temp, 0, U_SIZEOF_UCHAR * MAX_DEST_SIZE); + + u_charsToUChars(asciiIn[1], temp, (int32_t)strlen(asciiIn[1])); + u_strcat(ascii1,temp); + u_strcat(ascii1,com); + + /* prepend www. */ + u_strcat(source, www); + + for(i=0;i< (int32_t)(sizeof(unicodeIn)/sizeof(unicodeIn[0])); i++){ + UChar* src; + int32_t srcLen; + + memset(buf+4, 0, (MAX_DEST_SIZE-4) * U_SIZEOF_UCHAR); + + u_charsToUChars(asciiIn[i],buf+4, (int32_t)strlen(asciiIn[i])); + u_strcat(buf,com); + + + /* for every entry in unicodeIn array + prepend www. and append .com*/ + source[4]=0; + u_strncat(source,unicodeIn[i], u_strlen(unicodeIn[i])); + u_strcat(source,com); + + /* a) compare it with itself*/ + src = source; + srcLen = u_strlen(src); + + testCompareWithSrc(src,srcLen,src,srcLen,testName, func, TRUE); + + /* b) compare it with asciiIn equivalent */ + testCompareWithSrc(src,srcLen,buf,u_strlen(buf),testName, func,TRUE); + + /* c) compare it with unicodeIn not equivalent*/ + if(i==0){ + testCompareWithSrc(src,srcLen,uni1,u_strlen(uni1),testName, func,FALSE); + }else{ + testCompareWithSrc(src,srcLen,uni0,u_strlen(uni0),testName, func,FALSE); + } + /* d) compare it with asciiIn not equivalent */ + if(i==0){ + testCompareWithSrc(src,srcLen,ascii1,u_strlen(ascii1),testName, func,FALSE); + }else{ + testCompareWithSrc(src,srcLen,ascii0,u_strlen(ascii0),testName, func,FALSE); + } + + } +} + +static void TestUnicode32Norm() { + /* + * test Unicode 3.2 normalization, before Public Review Issue #29 + * see cnormtst.c TestComposition() + */ + static const UChar strings[][8]={ + { 0x1100, 0x0300, 0x1161, 0x0327 }, + { 0x0b47, 0x0300, 0x0b3e, 0x0327 } + }; + + UChar ascii[20], unicode[20]; + int32_t i, length; + UErrorCode errorCode; + + for(i=0; i -#include "unicode/utypes.h" -#include "unicode/ustring.h" -#include "cmemory.h" -#include "cintltst.h" -#include "umemstrm.h" - -static void TestMemoryStreamAPI(void); -static void printUSeqErr(const uint8_t *a, int len); - -void addMemoryStreamTest(TestNode** root); - -static void printUSeqErr(const uint8_t *a, int len) -{ - int i=0; - fprintf(stderr, "{U+ "); - while (i size\n"); - x=uprv_mstrm_write(memStream, buffer, sizeof(buffer)/sizeof(buffer[0]) ); - if(x == -1){ - log_err("uprv_mstrm_write() failed\n"); - } - if(x != sizeof(buffer)/sizeof(buffer[0])){ - log_err("uprv_mstrm_write() wrote %d characters instead of %d\n", x, sizeof(buffer)/sizeof(buffer[0])); - } - - log_verbose("Testing how different functions behave when error is set to true using setError\n"); - uprv_mstrm_setError(memStream); - gotBuffer=uprv_mstrm_getBuffer(memStream, &x); - if(gotBuffer != NULL || x !=0 ){ - log_err("uprv_mstrm_getBuffer() should fail when the error is set to true using uprv_mstrm_setError()"); - } - uprv_mstrm_close(memStream); - -/* -Test the following APIs: -uprv_mstrm_write8 -uprv_mstrm_write16 -uprv_mstrm_write32 -uprv_mstrm_writeString -uprv_mstrm_writeUString -uprv_mstrm_writePadding -uprv_mstrm_writeBlock -uprv_mstrm_getCurrentBuffer -uprv_mstrm_jump -uprv_mstrm_skip -*/ - { - uint8_t byteValue = 0x12; - uint16_t wordValue = 0x2112; - uint32_t wydeValue = 0x12211221; - uint32_t wydeRead = 0; - const char* stringVal = "This is a string"; - UChar UCharBuff[256]; - const UChar* ucharVal = UCharBuff; - const uint8_t *data = NULL; - int32_t bufLen = 0; - - u_unescape("This is an Unicode String", UCharBuff, 256); - - memStream=uprv_mstrm_openNew(size); - if(memStream == NULL){ - log_err("uprv_mstrm_openNew() failed\n"); - } - uprv_mstrm_write8(memStream, byteValue); - uprv_mstrm_writePadding(memStream, 3); - uprv_mstrm_write16(memStream, wordValue); - uprv_mstrm_writePadding(memStream, 2); - uprv_mstrm_write32(memStream, wydeValue); - uprv_mstrm_writeBlock(memStream, &wydeValue, 4); - - uprv_mstrm_writeString(memStream, stringVal, -1); - uprv_mstrm_writeString(memStream, stringVal, strlen(stringVal)); - uprv_mstrm_writeUString(memStream, ucharVal, -1); - uprv_mstrm_writeUString(memStream, ucharVal, u_strlen(ucharVal)); - - /* Now, lets get the values back */ - data = uprv_mstrm_getBuffer(memStream, &bufLen); - - if(data == NULL || bufLen == 0) { - log_err("get Buffer failed!\n"); - } else { - if(byteValue != *(uint8_t *)data) { - log_err("Failed getting byte value\n"); - } - data += 4; /* skip byte and 3 padding */ - if(wordValue != *(uint16_t *)data) { - log_err("Failed getting word value\n"); - } - data += 4; /* skip word and 2 padding */ - - if(wydeValue != *(uint32_t *)data) { - log_err("Failed getting word value\n"); - } - data += 4; /* skip wyde */ - - if(wydeValue != *(uint32_t *)data) { - log_err("Failed getting word value\n"); - } - data += 4; /* skip wyde */ - - if(strncmp(stringVal, (char *)data, strlen(stringVal)) != 0) { - log_err("String was not written correctly\n"); - } - data += strlen(stringVal); - - if(strncmp(stringVal, (char *)data, strlen(stringVal)) != 0) { - log_err("String was not written correctly\n"); - } - data += strlen(stringVal); - - if(u_strncmp(ucharVal, (UChar *)data, u_strlen(ucharVal)) != 0) { - log_err("UString was not written correctly\n"); - } - data += u_strlen(ucharVal)*2; - - if(u_strncmp(ucharVal, (UChar *)data, u_strlen(ucharVal)) != 0) { - log_err("UString was not written correctly\n"); - } - data += u_strlen(ucharVal)*2; - - uprv_mstrm_skip(memStream, 8); /* skip to first wyde */ - bufLen = uprv_mstrm_read(memStream, &wydeRead, 4); - if(bufLen != 4 || wydeValue != wydeRead) { - log_err("Reading after skip failed\n"); - } - - /* this should get us to the second wyde */ - data = uprv_mstrm_getCurrentBuffer(memStream, &bufLen); - if(wydeValue != *(uint32_t *)data) { - log_err("Failed getting wyde value after getCurrentBuffer\n"); - } - - uprv_mstrm_skip(memStream, -8); - data = uprv_mstrm_getCurrentBuffer(memStream, &bufLen); - uprv_mstrm_jump(memStream, data+4); - - data = uprv_mstrm_getCurrentBuffer(memStream, &bufLen); - if(wydeValue != *(uint32_t *)data) { - log_err("Failed getting wyde value after getCurrentBuffer\n"); - } - - - - - - - } - - - uprv_mstrm_close(memStream); - - - } - -} diff --git a/icuSources/test/cintltst/nccbtst.c b/icuSources/test/cintltst/nccbtst.c index 669e88fd..553c5b6e 100644 --- a/icuSources/test/cintltst/nccbtst.c +++ b/icuSources/test/cintltst/nccbtst.c @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /* @@ -73,8 +73,8 @@ static void setNuConvTestName(const char *codepage, const char *direction) sprintf(gNuConvTestName, "[testing %s %s Unicode, InputBufSiz=%d, OutputBufSiz=%d]", codepage, direction, - gInBufferSize, - gOutBufferSize); + (int)gInBufferSize, + (int)gOutBufferSize); } @@ -167,7 +167,6 @@ static void TestSkip(int32_t inputsize, int32_t outputsize) static const int32_t toIBM949Offsskip [] = { 0, 1, 1, 2, 2, 4, 4 }; static const int32_t toIBM943Offsskip [] = { 0, 0, 1, 1, 3, 3 }; - static const int32_t toIBM930Offsskip [] = { 0, 0, 0, 1, 1, 3, 3, 3 }; if(!testConvertFromUnicode(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), expskipIBM_949, sizeof(expskipIBM_949), "ibm-949", @@ -177,15 +176,6 @@ static void TestSkip(int32_t inputsize, int32_t outputsize) expskipIBM_943, sizeof(expskipIBM_943), "ibm-943", UCNV_FROM_U_CALLBACK_SKIP, toIBM943Offsskip, NULL, 0 )) log_err("u-> ibm-943 with skip did not match.\n"); - if(!testConvertFromUnicode(sampleText2, sizeof(sampleText2)/sizeof(sampleText2[0]), - expskipIBM_930, sizeof(expskipIBM_930), "ibm-930", - UCNV_FROM_U_CALLBACK_SKIP, toIBM930Offsskip , NULL, 0)) - log_err("u-> ibm-930 with skip did not match.\n"); - - if(!testConvertFromUnicodeWithContext(sampleText2, sizeof(sampleText2)/sizeof(sampleText2[0]), - expskipIBM_930, sizeof(expskipIBM_930), "ibm-930", - UCNV_FROM_U_CALLBACK_SKIP, toIBM930Offsskip , NULL, 0,"i", U_ILLEGAL_CHAR_FOUND)) - log_err("u-> ibm-930 with skip did not match.\n"); } { @@ -283,14 +273,6 @@ static void TestSkip(int32_t inputsize, int32_t outputsize) }; static const int32_t from_iso_2022_jpOffs [] ={0,2}; - static const UChar iso_2022_jp_inputText1[]={0x3000, 0x00E9, 0x3001, }; - static const uint8_t to_iso_2022_jp1[]={ - 0x1b, 0x24, 0x42, 0x21, 0x21, - 0x21, 0x22, - - }; - static const int32_t from_iso_2022_jpOffs1 [] ={0,0,0,0,0,2,2,}; - /*ISO-2022-JP*/ UChar const iso_2022_jp_inputText2[]={0x0041, 0x00E9/*unassigned*/,0x43,0xd800/*illegal*/,0x0042, }; static const uint8_t to_iso_2022_jp2[]={ @@ -303,22 +285,19 @@ static void TestSkip(int32_t inputsize, int32_t outputsize) /*ISO-2022-cn*/ static const UChar iso_2022_cn_inputText[]={ 0x0041, 0x3712/*unassigned*/, 0x0042, }; static const uint8_t to_iso_2022_cn[]={ - 0x0F, 0x41, - 0x0F, 0x42, + 0x41, 0x42 }; static const int32_t from_iso_2022_cnOffs [] ={ - 0,0, - 2,2, + 0, 2 }; /*ISO-2022-CN*/ static const UChar iso_2022_cn_inputText1[]={0x0041, 0x3712/*unassigned*/,0x43,0xd800/*illegal*/,0x0042, }; static const uint8_t to_iso_2022_cn1[]={ - 0x0F, 0x41, - 0x0F, 0x43, + 0x41, 0x43 }; - static const int32_t from_iso_2022_cnOffs1 [] ={0,0,2,2}; + static const int32_t from_iso_2022_cnOffs1 [] ={ 0, 2 }; /*ISO-2022-kr*/ static const UChar iso_2022_kr_inputText[]={ 0x0041, 0x03A0,0x3712/*unassigned*/,0x03A0, 0x0042, }; @@ -440,10 +419,6 @@ static void TestSkip(int32_t inputsize, int32_t outputsize) UCNV_FROM_U_CALLBACK_SKIP, from_iso_2022_jpOffs, NULL, 0 )) log_err("u-> iso-2022-jp with skip did not match.\n"); - if(!testConvertFromUnicode(iso_2022_jp_inputText1, sizeof(iso_2022_jp_inputText1)/sizeof(iso_2022_jp_inputText1[0]), - to_iso_2022_jp1, sizeof(to_iso_2022_jp1), "iso-2022-jp", - UCNV_FROM_U_CALLBACK_SKIP, from_iso_2022_jpOffs1, NULL, 0 )) - log_err("u-> iso-2022-jp with skip did not match.\n"); /* with context */ if(!testConvertFromUnicodeWithContext(iso_2022_jp_inputText2, sizeof(iso_2022_jp_inputText2)/sizeof(iso_2022_jp_inputText2[0]), to_iso_2022_jp2, sizeof(to_iso_2022_jp2), "iso-2022-jp", @@ -1135,7 +1110,7 @@ static void TestStop(int32_t inputsize, int32_t outputsize) /*ISO-2022-cn*/ static const UChar iso_2022_cn_inputText[]={ 0x0041, 0x3712, 0x0042, }; static const uint8_t to_iso_2022_cn[]={ - 0x0F, 0x41, + 0x41, }; static const int32_t from_iso_2022_cnOffs [] ={ @@ -1392,24 +1367,6 @@ static void TestSub(int32_t inputsize, int32_t outputsize) 0x61, 0xe6, 0xca, 0x8a, }; - /*ISO-2022-JP*/ - static const UChar iso_2022_jp_inputText[]={ 0x0041, 0x00E9, 0x0042,0x00E9,0x3000 }; - static const uint8_t to_iso_2022_jp[]={ - 0x41, - 0x1a, - 0x42, - 0x1a, - 0x1b, 0x24, 0x42, 0x21, 0x21, - }; - - static const int32_t from_iso_2022_jpOffs [] ={ - 0, - 1, - 2, - 3, - 4,4,4,4,4 - }; - static const int32_t from_euc_twOffs [] ={ 0, 1, 1, 2, 2, 2, 2, 3, 3, 5, 5, 6, 7, 7, 8,}; if(!testConvertFromUnicode(inputTest, sizeof(inputTest)/sizeof(inputTest[0]), @@ -1426,13 +1383,6 @@ static void TestSub(int32_t inputsize, int32_t outputsize) to_euc_tw, sizeof(to_euc_tw), "euc-tw", UCNV_FROM_U_CALLBACK_SUBSTITUTE, from_euc_twOffs, NULL, 0 )) log_err("u-> euc-tw with substitute did not match.\n"); - - if(!testConvertFromUnicodeWithContext(iso_2022_jp_inputText, sizeof(iso_2022_jp_inputText)/sizeof(iso_2022_jp_inputText[0]), - to_iso_2022_jp, sizeof(to_iso_2022_jp), "iso-2022-jp", - UCNV_FROM_U_CALLBACK_SUBSTITUTE, from_iso_2022_jpOffs, NULL, 0,"i",U_ILLEGAL_CHAR_FOUND )) - log_err("u-> iso-2022-jp with substitute did not match.\n"); - - } log_verbose("Testing fromUnicode for SCSU with UCNV_FROM_U_CALLBACK_SUBSTITUTE \n"); @@ -1660,13 +1610,6 @@ static void TestSub(int32_t inputsize, int32_t outputsize) log_verbose("Testing GB 18030 with substitute callbacks\n"); { - static const UChar u1[]={ - 0x24, 0x7f, 0x80, 0x1f9, 0x20ac, 0x4e00, 0x9fa6, 0xffff, 0xd800, 0xdc00, 0xdbff, 0xdfff }; - static const uint8_t gb1[]={ - 0x24, 0x7f, 0x81, 0x30, 0x81, 0x30, 0xa8, 0xbf, 0xa2, 0xe3, 0xd2, 0xbb, 0x82, 0x35, 0x8f, 0x33, 0x84, 0x31, 0xa4, 0x39, 0x90, 0x30, 0x81, 0x30, 0xe3, 0x32, 0x9a, 0x35 }; - static const int32_t offsets1[]={ - 0, 1, 2, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 10, 10, 10, 10 }; - static const UChar u2[]={ 0x24, 0x7f, 0x80, 0x1f9, 0x20ac, 0x4e00, 0x9fa6, 0xffff, 0xd800, 0xdc00, 0xfffd, 0xdbff, 0xdfff }; static const uint8_t gb2[]={ @@ -1674,12 +1617,6 @@ static void TestSub(int32_t inputsize, int32_t outputsize) static const int32_t offsets2[]={ 0, 1, 2, 6, 8, 10, 12, 16, 20, 20, 24, 28, 28 }; - if(!testConvertFromUnicode(u1, ARRAY_LENGTH(u1), gb1, ARRAY_LENGTH(gb1), "gb18030", - UCNV_FROM_U_CALLBACK_SUBSTITUTE, offsets1, NULL, 0) - ) { - log_err("u->gb18030 with substitute did not match.\n"); - } - if(!testConvertToUnicode(gb2, ARRAY_LENGTH(gb2), u2, ARRAY_LENGTH(u2), "gb18030", UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets2, NULL, 0) ) { @@ -1707,26 +1644,6 @@ static void TestSub(int32_t inputsize, int32_t outputsize) } } - log_verbose("Testing IMAP-mailbox-name toUnicode with substitute callbacks\n"); - { - static const uint8_t bytes[]={ - /* aDEL a&AB~ a&AB\x0c a&AB- a&AB. a&. */ - 0x61, 0x7f, 0x61, 0x26, 0x41, 0x42, 0x7e, 0x61, 0x26, 0x41, 0x42, 0x0c, 0x61, 0x26, 0x41, 0x42, 0x2d, 0x61, 0x26, 0x41, 0x42, 0x2e, 0x61, 0x26, 0x2e - }; - static const UChar unicode[]={ - 0x61, 0xfffd, 0x61, 0xfffd, 0x61, 0xfffd, 0x61, 0xfffd, 0x61, 0xfffd, 0x61, 0xfffd - }; - static const int32_t offsets[]={ - 0, 1, 2, 4, 7, 9, 12, 14, 17, 19, 22, 23 - }; - - if(!testConvertToUnicode(bytes, ARRAY_LENGTH(bytes), unicode, ARRAY_LENGTH(unicode), "IMAP-mailbox-name", - UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets, NULL, 0) - ) { - log_err("IMAP-mailbox-name->u with substitute did not match.\n"); - } - } - log_verbose("Testing UTF-16 toUnicode with substitute callbacks\n"); { static const uint8_t @@ -1774,7 +1691,7 @@ static void TestSub(int32_t inputsize, int32_t outputsize) static const UChar out1[]={ UTF16_LEAD(0x100f00), UTF16_TRAIL(0x100f00), 0xfeff }, out2[]={ UTF16_LEAD(0x0f1000), UTF16_TRAIL(0x0f1000), 0xfffe }, - out3[]={ 0xfefe, UTF16_LEAD(0x100f00), UTF16_TRAIL(0x100f00), 0xd840, 0xdc01 }, + out3[]={ 0xfefe, UTF16_LEAD(0x100f00), UTF16_TRAIL(0x100f00), 0xfffd, 0xfffd }, out4[]={ UTF16_LEAD(0x10203), UTF16_TRAIL(0x10203), 0xfffd, 0x4e00 }; static const int32_t @@ -1889,22 +1806,6 @@ static void TestSubWithValue(int32_t inputsize, int32_t outputsize) 6, 7, 7, 8, }; /*ISO-2022-JP*/ - static const UChar iso_2022_jp_inputText[]={ 0x0041, 0x00E9, 0x0042,0x00E9,0x3000 }; - static const uint8_t to_iso_2022_jp[]={ - 0x41, - 0x25, 0x55, 0x30, 0x30, 0x45, 0x39, - 0x42, - 0x25, 0x55, 0x30, 0x30, 0x45, 0x39, - 0x1b, 0x24, 0x42, 0x21, 0x21, - }; - - static const int32_t from_iso_2022_jpOffs [] ={ - 0, - 1,1,1,1,1,1, - 2, - 3,3,3,3,3,3, - 4,4,4,4,4 - }; static const UChar iso_2022_jp_inputText1[]={ 0x3000, 0x00E9, 0x3001,0x00E9, 0x0042} ; static const uint8_t to_iso_2022_jp1[]={ 0x1b, 0x24, 0x42, 0x21, 0x21, @@ -1945,48 +1846,15 @@ static void TestSubWithValue(int32_t inputsize, int32_t outputsize) /*ISO-2022-cn*/ static const UChar iso_2022_cn_inputText[]={ 0x0041, 0x3712, 0x0042, }; static const uint8_t to_iso_2022_cn[]={ - 0x0F, 0x41, - 0x0f, 0x25, 0x55, 0x33, 0x37, 0x31, 0x32, + 0x41, + 0x25, 0x55, 0x33, 0x37, 0x31, 0x32, 0x42, }; static const int32_t from_iso_2022_cnOffs [] ={ - 0,0, - 1,1,1,1,1,1,1, + 0, + 1,1,1,1,1,1, 2, }; - static const UChar iso_2022_cn_inputText1[]={ 0x4e00, 0x3712, 0x4e01, }; - static const uint8_t to_iso_2022_cn1[]={ - 0x1b, 0x24, 0x29, 0x41, 0x0e, 0x52, 0x3b, - 0x0f, 0x25, 0x55, 0x33, 0x37, 0x31, 0x32, - 0x1b, 0x24, 0x29, 0x41, 0x0e, 0x36, 0x21, - }; - static const int32_t from_iso_2022_cnOffs1 [] ={ - 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, - 2, 2, 2, 2, 2, 2, 2, - }; - static const UChar iso_2022_cn_inputText3[]={ 0x3000, 0x3712, 0x3001, }; - static const uint8_t to_iso_2022_cn3[]={ - 0x1b, 0x24, 0x29, 0x41, 0x0e, 0x21, 0x21, - 0x0f, 0x25, 0x55, 0x33, 0x37, 0x31, 0x32, - 0x1b, 0x24, 0x29, 0x41, 0x0e, 0x21, 0x22, - }; - static const int32_t from_iso_2022_cnOffs3 [] ={ - 0,0,0,0,0,0,0, - 1,1,1,1,1,1,1, - 2,2,2,2,2,2,2 - }; - static const UChar iso_2022_cn_inputText2[]={ 0x0041, 0x3712, 0x4e00, }; - static const uint8_t to_iso_2022_cn2[]={ - 0x0F, 0x41, - 0x0f, 0x25, 0x55, 0x33, 0x37, 0x31, 0x32, - 0x1b, 0x24, 0x29, 0x41, 0x0e, 0x52, 0x3b, - }; - static const int32_t from_iso_2022_cnOffs2 [] ={ - 0,0, - 1,1,1,1,1,1,1, - 2,2,2,2,2,2,2 - }; static const UChar iso_2022_cn_inputText4[]={ 0x3000, 0xD84D, 0xDC56, 0x3001,0xD84D,0xDC56, 0x0042}; @@ -1994,7 +1862,7 @@ static void TestSubWithValue(int32_t inputsize, int32_t outputsize) 0x1b, 0x24, 0x29, 0x41, 0x0e, 0x21, 0x21, 0x0f, 0x25, 0x55, 0x44, 0x38, 0x34, 0x44, 0x25, 0x55, 0x44, 0x43, 0x35, 0x36, - 0x1b, 0x24, 0x29, 0x41, 0x0e, 0x21, 0x22, + 0x0e, 0x21, 0x22, 0x0f, 0x25, 0x55, 0x44, 0x38, 0x34, 0x44, 0x25, 0x55, 0x44, 0x43, 0x35, 0x36, 0x42, @@ -2003,7 +1871,7 @@ static void TestSubWithValue(int32_t inputsize, int32_t outputsize) 0,0,0,0,0,0,0, 1,1,1,1,1,1,1, 1,1,1,1,1,1, - 3,3,3,3,3,3,3, + 3,3,3, 4,4,4,4,4,4,4, 4,4,4,4,4,4, 6 @@ -2104,30 +1972,6 @@ static void TestSubWithValue(int32_t inputsize, int32_t outputsize) }; /*ISCII*/ - static const UChar iscii_inputText2[]={ 0x0041, 0x0901,0xD84D, 0xDC56/*unassigned*/,0x0902, 0x0042,0xD84D, 0xDC56/*unassigned*/,0x43 }; - static const uint8_t to_iscii2[]={ - 0x41, - 0xef, 0x42, 0xa1, - 0x25, 0x55, 0x44, 0x38, 0x34, 0x44, - 0x25, 0x55, 0x44, 0x43, 0x35, 0x36, - 0xa2, - 0x42, - 0x25, 0x55, 0x44, 0x38, 0x34, 0x44, - 0x25, 0x55, 0x44, 0x43, 0x35, 0x36, - 0x43 - }; - static const int32_t from_isciiOffs2 [] ={ - 0, - 1,1,1, - 2,2,2,2,2,2, - 2,2,2,2,2,2, - 4, - 5, - 6,6,6,6,6,6, - 6,6,6,6,6,6, - 8, - }; - static const UChar iscii_inputText[]={ 0x0041, 0x0901,0x3712/*unassigned*/,0x0902, 0x0042,0x3712/*unassigned*/,0x43 }; static const uint8_t to_iscii[]={ 0x41, @@ -2165,11 +2009,6 @@ static void TestSubWithValue(int32_t inputsize, int32_t outputsize) UCNV_FROM_U_CALLBACK_ESCAPE, from_euc_twOffs, NULL, 0 )) log_err("u-> euc-tw with subst with value did not match.\n"); - if(!testConvertFromUnicode(iso_2022_jp_inputText, sizeof(iso_2022_jp_inputText)/sizeof(iso_2022_jp_inputText[0]), - to_iso_2022_jp, sizeof(to_iso_2022_jp), "iso-2022-jp", - UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_jpOffs, NULL, 0 )) - log_err("u-> iso_2022_jp with subst with value did not match.\n"); - if(!testConvertFromUnicode(iso_2022_jp_inputText1, sizeof(iso_2022_jp_inputText1)/sizeof(iso_2022_jp_inputText1[0]), to_iso_2022_jp1, sizeof(to_iso_2022_jp1), "iso-2022-jp", UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_jpOffs1, NULL, 0 )) @@ -2215,57 +2054,27 @@ static void TestSubWithValue(int32_t inputsize, int32_t outputsize) UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_jpOffs3_v2, NULL, 0,UCNV_ESCAPE_XML_DEC,U_ZERO_ERROR )) log_err("u-> iso-2022-jp with sub & UCNV_ESCAPE_XML_DEC did not match.\n"); } - { - /* surrogate pair*/ - static const UChar iso_2022_jp_inputText4[]={ 0x3000, 0xD84D, 0xDC56, 0x3001,0xD84D,0xDC56, 0x0042,0x0901c } ; - static const uint8_t to_iso_2022_jp4_v3[]={ - 0x1b, 0x24, 0x42, 0x21, 0x21, - 0x1b, 0x28, 0x42, 0x26, 0x23, 0x78, 0x32, 0x33, 0x34, 0x35, 0x36, 0x3b , - - 0x1b, 0x24, 0x42, 0x21, 0x22, - 0x1b, 0x28, 0x42, 0x26, 0x23, 0x78, 0x32, 0x33, 0x34, 0x35, 0x36, 0x3b , - - 0x42, - 0x26, 0x23, 0x78, 0x39, 0x30, 0x31, 0x43, 0x3b, - }; - - static const int32_t from_iso_2022_jpOffs4_v3 [] ={ - 0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1, - - 3,3,3,3,3, - 4,4,4,4,4,4,4,4,4,4,4,4, - - 6, - 7,7,7,7,7,7,7,7 - }; - if(!testConvertFromUnicodeWithContext(iso_2022_jp_inputText4, sizeof(iso_2022_jp_inputText4)/sizeof(iso_2022_jp_inputText4[0]), - to_iso_2022_jp4_v3, sizeof(to_iso_2022_jp4_v3), "iso-2022-jp", - UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_jpOffs4_v3, NULL, 0,UCNV_ESCAPE_XML_HEX,U_ZERO_ERROR )) - log_err("u-> iso-2022-jp with sub & UCNV_ESCAPE_XML_HEX did not match.\n"); - - } { static const UChar iso_2022_cn_inputText5[]={ 0x3000, 0xD84D, 0xDC56, 0x3001,0xD84D,0xDC56, 0x0042,0x0902}; static const uint8_t to_iso_2022_cn5_v2[]={ 0x1b, 0x24, 0x29, 0x41, 0x0e, 0x21, 0x21, 0x0f, 0x5c, 0x75, 0x44, 0x38, 0x34, 0x44, 0x5c, 0x75, 0x44, 0x43, 0x35, 0x36, - 0x1b, 0x24, 0x29, 0x41, 0x0e, 0x21, 0x22, + 0x0e, 0x21, 0x22, 0x0f, 0x5c, 0x75, 0x44, 0x38, 0x34, 0x44, 0x5c, 0x75, 0x44, 0x43, 0x35, 0x36, 0x42, - 0x0f, 0x5c, 0x75, 0x30, 0x39, 0x30, 0x32, + 0x5c, 0x75, 0x30, 0x39, 0x30, 0x32, }; static const int32_t from_iso_2022_cnOffs5_v2 [] ={ 0,0,0,0,0,0,0, 1,1,1,1,1,1,1, 1,1,1,1,1,1, - 3,3,3,3,3,3,3, + 3,3,3, 4,4,4,4,4,4,4, 4,4,4,4,4,4, 6, - 7,7,7,7,7,7,7 + 7,7,7,7,7,7 }; if(!testConvertFromUnicodeWithContext(iso_2022_cn_inputText5, sizeof(iso_2022_cn_inputText5)/sizeof(iso_2022_cn_inputText5[0]), to_iso_2022_cn5_v2, sizeof(to_iso_2022_cn5_v2), "iso-2022-cn", @@ -2278,18 +2087,18 @@ static void TestSubWithValue(int32_t inputsize, int32_t outputsize) static const uint8_t to_iso_2022_cn6_v2[]={ 0x1b, 0x24, 0x29, 0x41, 0x0e, 0x21, 0x21, 0x0f, 0x7b, 0x55, 0x2b, 0x32, 0x33, 0x34, 0x35, 0x36, 0x7d, - 0x1b, 0x24, 0x29, 0x41, 0x0e, 0x21, 0x22, + 0x0e, 0x21, 0x22, 0x0f, 0x7b, 0x55, 0x2b, 0x32, 0x33, 0x34, 0x35, 0x36, 0x7d, 0x42, - 0x0f, 0x7b, 0x55, 0x2b, 0x30, 0x39, 0x30, 0x32, 0x7d + 0x7b, 0x55, 0x2b, 0x30, 0x39, 0x30, 0x32, 0x7d }; static const int32_t from_iso_2022_cnOffs6_v2 [] ={ 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, - 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, }; if(!testConvertFromUnicodeWithContext(iso_2022_cn_inputText6, sizeof(iso_2022_cn_inputText6)/sizeof(iso_2022_cn_inputText6[0]), to_iso_2022_cn6_v2, sizeof(to_iso_2022_cn6_v2), "iso-2022-cn", @@ -2302,17 +2111,17 @@ static void TestSubWithValue(int32_t inputsize, int32_t outputsize) static const uint8_t to_iso_2022_cn7_v2[]={ 0x1b, 0x24, 0x29, 0x41, 0x0e, 0x21, 0x21, 0x0f, 0x25, 0x55, 0x44, 0x38, 0x34, 0x44, 0x25, 0x55, 0x44, 0x43, 0x35, 0x36, - 0x1b, 0x24, 0x29, 0x41, 0x0e, 0x21, 0x22, + 0x0e, 0x21, 0x22, 0x0f, 0x25, 0x55, 0x44, 0x38, 0x34, 0x44, 0x25, 0x55, 0x44, 0x43, 0x35, 0x36, - 0x42, 0x0f, 0x25, 0x55, 0x30, 0x39, 0x30, 0x32, + 0x42, 0x25, 0x55, 0x30, 0x39, 0x30, 0x32, }; static const int32_t from_iso_2022_cnOffs7_v2 [] ={ 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, - 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, }; if(!testConvertFromUnicodeWithContext(iso_2022_cn_inputText7, sizeof(iso_2022_cn_inputText7)/sizeof(iso_2022_cn_inputText7[0]), to_iso_2022_cn7_v2, sizeof(to_iso_2022_cn7_v2), "iso-2022-cn", @@ -2324,7 +2133,7 @@ static void TestSubWithValue(int32_t inputsize, int32_t outputsize) static const uint8_t to_iso_2022_cn4_v3[]={ 0x1b, 0x24, 0x29, 0x41, 0x0e, 0x21, 0x21, 0x0f, 0x5c, 0x55, 0x30, 0x30, 0x30, 0x32, 0x33, 0x34, 0x35, 0x36, - 0x1b, 0x24, 0x29, 0x41, 0x0e, 0x21, 0x22, + 0x0e, 0x21, 0x22, 0x0f, 0x5c, 0x55, 0x30, 0x30, 0x30, 0x32, 0x33, 0x34, 0x35, 0x36, 0x42 }; @@ -2334,7 +2143,7 @@ static void TestSubWithValue(int32_t inputsize, int32_t outputsize) 0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1, - 3,3,3,3,3,3,3, + 3,3,3, 4,4,4,4,4,4,4,4,4,4,4, 6 @@ -2352,18 +2161,6 @@ static void TestSubWithValue(int32_t inputsize, int32_t outputsize) UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_cnOffs, NULL, 0 )) log_err("u-> iso_2022_cn with subst with value did not match.\n"); - if(!testConvertFromUnicode(iso_2022_cn_inputText1, sizeof(iso_2022_cn_inputText1)/sizeof(iso_2022_cn_inputText1[0]), - to_iso_2022_cn1, sizeof(to_iso_2022_cn1), "iso-2022-cn", - UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_cnOffs1, NULL, 0 )) - log_err("u-> iso_2022_cn with subst with value did not match.\n"); - if(!testConvertFromUnicode(iso_2022_cn_inputText2, sizeof(iso_2022_cn_inputText2)/sizeof(iso_2022_cn_inputText2[0]), - to_iso_2022_cn2, sizeof(to_iso_2022_cn2), "iso-2022-cn", - UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_cnOffs2, NULL, 0 )) - log_err("u-> iso_2022_cn with subst with value did not match.\n"); - if(!testConvertFromUnicode(iso_2022_cn_inputText3, sizeof(iso_2022_cn_inputText3)/sizeof(iso_2022_cn_inputText3[0]), - to_iso_2022_cn3, sizeof(to_iso_2022_cn3), "iso-2022-cn", - UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_cnOffs3, NULL, 0 )) - log_err("u-> iso_2022_cn with subst with value did not match.\n"); if(!testConvertFromUnicode(iso_2022_cn_inputText4, sizeof(iso_2022_cn_inputText4)/sizeof(iso_2022_cn_inputText4[0]), to_iso_2022_cn4, sizeof(to_iso_2022_cn4), "iso-2022-cn", UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_cnOffs4, NULL, 0 )) @@ -2389,11 +2186,6 @@ static void TestSubWithValue(int32_t inputsize, int32_t outputsize) to_iscii, sizeof(to_iscii), "ISCII,version=0", UCNV_FROM_U_CALLBACK_ESCAPE, from_isciiOffs, NULL, 0 )) log_err("u-> iscii with subst with value did not match.\n"); - - if(!testConvertFromUnicode(iscii_inputText2, sizeof(iscii_inputText2)/sizeof(iscii_inputText2[0]), - to_iscii2, sizeof(to_iscii2), "ISCII,version=0", - UCNV_FROM_U_CALLBACK_ESCAPE, from_isciiOffs2, NULL, 0 )) - log_err("u-> iscii2 with subst with value did not match.\n"); } @@ -2512,18 +2304,6 @@ static void TestSubWithValue(int32_t inputsize, int32_t outputsize) static const int32_t from_isciiOffs [] ={0,1,2,2,2,2,3,4,5,5,5,5,6 }; - /*LMBCS*/ - static const uint8_t sampleTxtLMBCS[]={ 0x12, 0xc9, 0x50, - 0x12, 0x92, 0xa0, /*unassigned*/ - 0x12, 0x92, 0xa1, - }; - static const UChar LMBCSToUnicode[]={ 0x4e2e, - 0x25, 0x58, 0x31, 0x32, 0x25, 0x58, 0x39, 0x32, 0x25, 0x58, 0x41, 0x30, - 0xe5c4, }; - static const int32_t fromLMBCS[] = {0, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 6, }; - /*UTF8*/ static const uint8_t sampleTxtUTF8[]={ 0x20, 0x64, 0x50, @@ -2644,10 +2424,6 @@ static void TestSubWithValue(int32_t inputsize, int32_t outputsize) isciitoUnicode, sizeof(isciitoUnicode)/sizeof(isciitoUnicode[0]),"ISCII,version=0", UCNV_TO_U_CALLBACK_ESCAPE, from_isciiOffs, NULL, 0)) log_err("ISCII ->u with substitute with value did not match.\n"); - if(!testConvertToUnicode(sampleTxtLMBCS, sizeof(sampleTxtLMBCS), - LMBCSToUnicode, sizeof(LMBCSToUnicode)/sizeof(LMBCSToUnicode[0]),"LMBCS", - UCNV_TO_U_CALLBACK_ESCAPE, fromLMBCS, NULL, 0)) - log_err("LMBCS->u with substitute with value did not match.\n"); if(!testConvertToUnicode(sampleTxtUTF8, sizeof(sampleTxtUTF8), UTF8ToUnicode, sizeof(UTF8ToUnicode)/sizeof(UTF8ToUnicode[0]),"UTF-8", UCNV_TO_U_CALLBACK_ESCAPE, fromUTF8, NULL, 0)) diff --git a/icuSources/test/cintltst/ncnvfbts.c b/icuSources/test/cintltst/ncnvfbts.c index 342e1bdc..f6755bc1 100644 --- a/icuSources/test/cintltst/ncnvfbts.c +++ b/icuSources/test/cintltst/ncnvfbts.c @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ***************************************************************************/ /******************************************************************************* @@ -115,11 +115,11 @@ void addTestConverterFallBack(TestNode** root) static void setNuConvTestName(const char *codepage, const char *direction) { - sprintf(gNuConvTestName, "[Testing %s %s Unicode, InputBufSiz=%d, OutputBufSiz=%d]", - codepage, - direction, - gInBufferSize, - gOutBufferSize); + sprintf(gNuConvTestName, "[Testing %s %s Unicode, InputBufSiz=%d, OutputBufSiz=%d]", + codepage, + direction, + (int)gInBufferSize, + (int)gOutBufferSize); } @@ -519,6 +519,8 @@ static void TestConvertFallBackWithBufferSizes(int32_t outsize, int32_t insize ) static const char* nativeCodePage[]={ /*NLCS Mapping*/ "ibm-367", + "ibm-437", + "ibm-850", "ibm-1051", "ibm-1089", "ibm-1250", @@ -529,8 +531,8 @@ static void TestConvertFallBackWithBufferSizes(int32_t outsize, int32_t insize ) "ibm-1256", "ibm-1257", "ibm-1258", - "ibm-1275", - "ibm-1276" + "ibm-1276", + "ibm-1277" }; int32_t i=0; @@ -709,7 +711,7 @@ static void TestConvertFallBackWithBufferSizes(int32_t outsize, int32_t insize ) 0x01, 0x02, 0x03, 0x0a, 0x01, 0x02, 0x03, 0x0e, 0x01, 0x02, 0x03, 0x0d, 0x03, 0x01, 0x02, 0x03, 0x0c,}; const UChar expectedUnicode[] = { 0x20ac, 0x0005, 0x0006, 0x000b, 0xdbc4, 0xde34, 0xdbba, 0xdfcd, - 0xd84d, 0xdc56, 0x000e, 0xd891, 0xdd67, 0xfffd, 0xfffd}; + 0xd84d, 0xdc56, 0x000e, 0xd891, 0xdd67, 0x1a, 0xfffd}; int32_t fromtest4Offs[] = { 0, 1, 2, 3, 7, 7, 8, 8, 9, 9, 13, 17, 17, 21, 22,}; diff --git a/icuSources/test/cintltst/ncnvtst.c b/icuSources/test/cintltst/ncnvtst.c index 47d88f83..5fcc5e95 100644 --- a/icuSources/test/cintltst/ncnvtst.c +++ b/icuSources/test/cintltst/ncnvtst.c @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** @@ -13,7 +13,8 @@ ********************************************************************************* */ #include -#include "cmemory.h" +#include +#include #include "unicode/uloc.h" #include "unicode/ucnv.h" #include "unicode/utypes.h" @@ -50,11 +51,11 @@ static UBool testConvertToU( const uint8_t *source, int sourcelen, const UChar * static void setNuConvTestName(const char *codepage, const char *direction) { - sprintf(gNuConvTestName, "[Testing %s %s Unicode, InputBufSiz=%d, OutputBufSiz=%d]", - codepage, - direction, - gInBufferSize, - gOutBufferSize); + sprintf(gNuConvTestName, "[Testing %s %s Unicode, InputBufSiz=%d, OutputBufSiz=%d]", + codepage, + direction, + (int)gInBufferSize, + (int)gOutBufferSize); } @@ -190,7 +191,7 @@ static void TestSurrogateBehaviour(){ 0x36, 0x21, 0x0F, 0x31, 0x1A, - 0x0f, 0x32 + 0x32 }; @@ -200,7 +201,7 @@ static void TestSurrogateBehaviour(){ 1, 1, 2, 2, 3, - 5, 5, }; + 5, }; /*iso-2022-CN*/ if(!convertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), @@ -317,15 +318,16 @@ static void TestErrorBehaviour(){ { static const UChar sampleText[] = { 0x0031, 0xd801}; static const UChar sampleText2[] = { 0x0031, 0xd801, 0x0032}; - static const uint8_t expected[] = { 0x31}; + static const uint8_t expected0[] = { 0x31}; + static const uint8_t expected[] = { 0x31, 0x1a}; static const uint8_t expected2[] = { 0x31, 0x1a, 0x32}; /*SBCS*/ if(!convertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), - expected, sizeof(expected), "ibm-920", 0, TRUE, U_TRUNCATED_CHAR_FOUND)) + expected, sizeof(expected), "ibm-920", 0, TRUE, U_ZERO_ERROR)) log_err("u-> ibm-920 [UCNV_SBCS] \n"); if(!convertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), - expected, sizeof(expected), "ibm-920", 0, FALSE, U_ZERO_ERROR)) + expected0, sizeof(expected0), "ibm-920", 0, FALSE, U_ZERO_ERROR)) log_err("u-> ibm-920 [UCNV_SBCS] \n"); if(!convertFromU(sampleText2, sizeof(sampleText2)/sizeof(sampleText2[0]), expected2, sizeof(expected2), "ibm-920", 0, TRUE, U_ZERO_ERROR)) @@ -334,10 +336,10 @@ static void TestErrorBehaviour(){ /*LATIN_1*/ if(!convertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), - expected, sizeof(expected), "LATIN_1", 0, TRUE, U_TRUNCATED_CHAR_FOUND)) + expected, sizeof(expected), "LATIN_1", 0, TRUE, U_ZERO_ERROR)) log_err("u-> LATIN_1 is supposed to fail\n"); if(!convertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), - expected, sizeof(expected), "LATIN_1", 0, FALSE, U_ZERO_ERROR)) + expected0, sizeof(expected0), "LATIN_1", 0, FALSE, U_ZERO_ERROR)) log_err("u-> LATIN_1 is supposed to fail\n"); if(!convertFromU(sampleText2, sizeof(sampleText2)/sizeof(sampleText2[0]), @@ -350,7 +352,9 @@ static void TestErrorBehaviour(){ { static const UChar sampleText[] = { 0x00a1, 0xd801}; static const uint8_t expected[] = { 0xa2, 0xae}; - static const int32_t offsets[] = { 0x00, 0x00, 0x01, 0x01}; + static const int32_t offsets[] = { 0x00, 0x00}; + static const uint8_t expectedSUB[] = { 0xa2, 0xae, 0xa1, 0xe0}; + static const int32_t offsetsSUB[] = { 0x00, 0x00, 0x01, 0x01}; static const UChar sampleText2[] = { 0x00a1, 0xd801, 0x00a4}; static const uint8_t expected2[] = { 0xa2, 0xae, 0xa1, 0xe0, 0xa2, 0xb4}; @@ -370,14 +374,14 @@ static void TestErrorBehaviour(){ /*DBCS*/ if(!convertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), - expected, sizeof(expected), "ibm-1363", 0, TRUE, U_TRUNCATED_CHAR_FOUND)) + expectedSUB, sizeof(expectedSUB), "ibm-1363", 0, TRUE, U_ZERO_ERROR)) log_err("u-> ibm-1363 [UCNV_DBCS portion] is supposed to fail\n"); if(!convertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), expected, sizeof(expected), "ibm-1363", 0, FALSE, U_ZERO_ERROR)) log_err("u-> ibm-1363 [UCNV_DBCS portion] is supposed to fail\n"); if(!convertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), - expected, sizeof(expected), "ibm-1363", offsets, TRUE, U_TRUNCATED_CHAR_FOUND)) + expectedSUB, sizeof(expectedSUB), "ibm-1363", offsetsSUB, TRUE, U_ZERO_ERROR)) log_err("u-> ibm-1363 [UCNV_DBCS portion] is supposed to fail\n"); if(!convertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), expected, sizeof(expected), "ibm-1363", offsets, FALSE, U_ZERO_ERROR)) @@ -393,7 +397,7 @@ static void TestErrorBehaviour(){ /*MBCS*/ if(!convertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), - expected, sizeof(expected), "ibm-1363", 0, TRUE, U_TRUNCATED_CHAR_FOUND)) + expectedSUB, sizeof(expectedSUB), "ibm-1363", 0, TRUE, U_ZERO_ERROR)) log_err("u-> ibm-1363 [UCNV_MBCS] \n"); if(!convertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), expected, sizeof(expected), "ibm-1363", 0, FALSE, U_ZERO_ERROR)) @@ -428,21 +432,18 @@ static void TestErrorBehaviour(){ { static const UChar sampleText[] = { 0x0031, 0xd801}; static const uint8_t expected[] = { 0x31}; - static const int32_t offsets[] = { 0x00}; + static const uint8_t expectedSUB[] = { 0x31, 0x1a}; + static const int32_t offsets[] = { 0x00, 1}; static const UChar sampleText2[] = { 0x0031, 0xd801, 0x0032}; static const uint8_t expected2[] = { 0x31,0x1A,0x32}; static const int32_t offsets2[] = { 0x00,0x01,0x02}; - static const UChar sampleText3MBCS[] = { 0x3000, 0x0050, 0xdc01,0x3001}; - static const uint8_t expected3MBCS[] = { 0x1B, 0x24, 0x42, 0x21, 0x21, 0x1B, 0x28, 0x42, 0x50, 0x1A, 0x1B, 0x24, 0x42, 0x21, 0x22,}; - static const int32_t offsets3MBCS[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03,}; - static const UChar sampleText4MBCS[] = { 0x0061, 0x4e00, 0xdc01}; static const uint8_t expected4MBCS[] = { 0x61, 0x1b, 0x24, 0x42, 0x30, 0x6c,0x1b,0x28,0x42,0x1a}; static const int32_t offsets4MBCS[] = { 0x00, 0x01, 0x01 ,0x01, 0x01, 0x01,0x02,0x02,0x02,0x02 }; if(!convertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), - expected, sizeof(expected), "iso-2022-jp", offsets, TRUE, U_TRUNCATED_CHAR_FOUND)) + expectedSUB, sizeof(expectedSUB), "iso-2022-jp", offsets, TRUE, U_ZERO_ERROR)) log_err("u-> iso-2022-jp [UCNV_MBCS] \n"); if(!convertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), expected, sizeof(expected), "iso-2022-jp", offsets, FALSE, U_ZERO_ERROR)) @@ -458,13 +459,6 @@ static void TestErrorBehaviour(){ expected2, sizeof(expected2), "iso-2022-jp", offsets2, FALSE, U_ZERO_ERROR)) log_err("u-> iso-2022-jp [UCNV_DBCS] did not match\n"); - if(!convertFromU(sampleText3MBCS, sizeof(sampleText3MBCS)/sizeof(sampleText3MBCS[0]), - expected3MBCS, sizeof(expected3MBCS), "iso-2022-jp", offsets3MBCS, TRUE, U_ZERO_ERROR)) - log_err("u->iso-2022-jp [UCNV_MBCS] \n"); - if(!convertFromU(sampleText3MBCS, sizeof(sampleText3MBCS)/sizeof(sampleText3MBCS[0]), - expected3MBCS, sizeof(expected3MBCS), "iso-2022-jp", offsets3MBCS, FALSE, U_ZERO_ERROR)) - log_err("u-> iso-2022-jp[UCNV_MBCS] \n"); - if(!convertFromU(sampleText4MBCS, sizeof(sampleText4MBCS)/sizeof(sampleText4MBCS[0]), expected4MBCS, sizeof(expected4MBCS), "iso-2022-jp", offsets4MBCS, TRUE, U_ZERO_ERROR)) log_err("u-> iso-2022-jp [UCNV_MBCS] \n"); @@ -476,22 +470,23 @@ static void TestErrorBehaviour(){ log_verbose("Testing for iso-2022-cn\n"); { static const UChar sampleText[] = { 0x0031, 0xd801}; - static const uint8_t expected[] = { 0x0f, 0x31}; - static const int32_t offsets[] = { 0x00, 0x00}; + static const uint8_t expected[] = { 0x31}; + static const uint8_t expectedSUB[] = { 0x31, 0x1A}; + static const int32_t offsets[] = { 0x00, 1}; static const UChar sampleText2[] = { 0x0031, 0xd801, 0x0032}; - static const uint8_t expected2[] = { 0x0f, 0x31, 0x1A,0x32}; - static const int32_t offsets2[] = { 0x00, 0x00, 0x01,0x02}; + static const uint8_t expected2[] = { 0x31, 0x1A,0x32}; + static const int32_t offsets2[] = { 0x00, 0x01,0x02}; static const UChar sampleText3MBCS[] = { 0x0051, 0x0050, 0xdc01}; - static const uint8_t expected3MBCS[] = {0x0f, 0x51, 0x50, 0x1A}; - static const int32_t offsets3MBCS[] = { 0x00, 0x00, 0x01, 0x02 }; + static const uint8_t expected3MBCS[] = {0x51, 0x50, 0x1A}; + static const int32_t offsets3MBCS[] = { 0x00, 0x01, 0x02 }; static const UChar sampleText4MBCS[] = { 0x0061, 0x4e00, 0xdc01}; - static const uint8_t expected4MBCS[] = { 0x0f, 0x61, 0x1b, 0x24, 0x29, 0x41, 0x0e, 0x52, 0x3b, 0x0f, 0x1a }; - static const int32_t offsets4MBCS[] = { 0x00, 0x00, 0x01, 0x01 ,0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02 }; + static const uint8_t expected4MBCS[] = { 0x61, 0x1b, 0x24, 0x29, 0x41, 0x0e, 0x52, 0x3b, 0x0f, 0x1a }; + static const int32_t offsets4MBCS[] = { 0x00, 0x01, 0x01 ,0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02 }; if(!convertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), - expected, sizeof(expected), "iso-2022-cn", offsets, TRUE, U_TRUNCATED_CHAR_FOUND)) + expectedSUB, sizeof(expectedSUB), "iso-2022-cn", offsets, TRUE, U_ZERO_ERROR)) log_err("u-> iso-2022-cn [UCNV_MBCS] \n"); if(!convertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), expected, sizeof(expected), "iso-2022-cn", offsets, FALSE, U_ZERO_ERROR)) @@ -526,7 +521,8 @@ static void TestErrorBehaviour(){ { static const UChar sampleText[] = { 0x0031, 0xd801}; static const uint8_t expected[] = { 0x1b, 0x24, 0x29, 0x43, 0x31}; - static const int32_t offsets[] = { -1, -1, -1, -1, 0x00}; + static const uint8_t expectedSUB[] = { 0x1b, 0x24, 0x29, 0x43, 0x31, 0x1A}; + static const int32_t offsets[] = { -1, -1, -1, -1, 0x00, 1}; static const UChar sampleText2[] = { 0x0031, 0xd801, 0x0032}; static const uint8_t expected2[] = { 0x1b, 0x24, 0x29, 0x43, 0x31, 0x1A, 0x32}; @@ -536,15 +532,8 @@ static void TestErrorBehaviour(){ static const uint8_t expected3MBCS[] = { 0x1b, 0x24, 0x29, 0x43, 0x51, 0x50, 0x1A }; static const int32_t offsets3MBCS[] = { -1, -1, -1, -1, 0x00, 0x01, 0x02, 0x02 }; - static const UChar sampleText4MBCS[] = { 0x0061, 0x4e00, 0xdc01,0x4e00}; - static const uint8_t expected4MBCS[] = { 0x1b, 0x24, 0x29, 0x43, - 0x61, - 0x0e, 0x6c, 0x69, - 0x0f, 0x1a, - 0x0e, 0x6c, 0x69,}; - static const int32_t offsets4MBCS[] = { -1, -1, -1, -1, 0x00, 0x01 ,0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x03 }; if(!convertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), - expected, sizeof(expected), "iso-2022-kr", offsets, TRUE, U_TRUNCATED_CHAR_FOUND)) + expectedSUB, sizeof(expectedSUB), "iso-2022-kr", offsets, TRUE, U_ZERO_ERROR)) log_err("u-> iso-2022-kr [UCNV_MBCS] \n"); if(!convertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), expected, sizeof(expected), "iso-2022-kr", offsets, FALSE, U_ZERO_ERROR)) @@ -566,13 +555,6 @@ static void TestErrorBehaviour(){ if(!convertFromU(sampleText3MBCS, sizeof(sampleText3MBCS)/sizeof(sampleText3MBCS[0]), expected3MBCS, sizeof(expected3MBCS), "iso-2022-kr", offsets3MBCS, FALSE, U_ZERO_ERROR)) log_err("u-> iso-2022-kr[UCNV_MBCS] \n"); - - if(!convertFromU(sampleText4MBCS, sizeof(sampleText4MBCS)/sizeof(sampleText4MBCS[0]), - expected4MBCS, sizeof(expected4MBCS), "iso-2022-kr", offsets4MBCS, TRUE, U_ZERO_ERROR)) - log_err("u-> iso-2022-kr [UCNV_MBCS] \n"); - if(!convertFromU(sampleText4MBCS, sizeof(sampleText4MBCS)/sizeof(sampleText4MBCS[0]), - expected4MBCS, sizeof(expected4MBCS), "iso-2022-kr", offsets4MBCS, FALSE, U_ZERO_ERROR)) - log_err("u-> iso-2022-kr [UCNV_MBCS] \n"); } /*HZ*/ @@ -580,7 +562,8 @@ static void TestErrorBehaviour(){ { static const UChar sampleText[] = { 0x0031, 0xd801}; static const uint8_t expected[] = { 0x7e, 0x7d, 0x31}; - static const int32_t offsets[] = { 0x00, 0x00, 0x00}; + static const uint8_t expectedSUB[] = { 0x7e, 0x7d, 0x31, 0x1A}; + static const int32_t offsets[] = { 0x00, 0x00, 0x00, 1}; static const UChar sampleText2[] = { 0x0031, 0xd801, 0x0032}; static const uint8_t expected2[] = { 0x7e, 0x7d, 0x31, 0x1A, 0x32 }; @@ -594,7 +577,7 @@ static void TestErrorBehaviour(){ static const uint8_t expected4MBCS[] = { 0x7e, 0x7d, 0x61, 0x7e, 0x7b, 0x52, 0x3b, 0x7e, 0x7d, 0x1a }; static const int32_t offsets4MBCS[] = { 0x00, 0x00, 0x00, 0x01, 0x01, 0x01 ,0x01, 0x02, 0x02, 0x02 }; if(!convertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), - expected, sizeof(expected), "HZ", offsets, TRUE, U_TRUNCATED_CHAR_FOUND)) + expectedSUB, sizeof(expectedSUB), "HZ", offsets, TRUE, U_ZERO_ERROR)) log_err("u-> HZ [UCNV_MBCS] \n"); if(!convertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), expected, sizeof(expected), "HZ", offsets, FALSE, U_ZERO_ERROR)) @@ -636,21 +619,12 @@ static void TestToUnicodeErrorBehaviour() uint8_t sampleText[] = { 0xa2, 0xae, 0x03, 0x04}; const UChar expected[] = { 0x00a1 }; - uint8_t sampleText2[] = { 0xa2, 0xae, 0xa2}; - const UChar expected2[] = { 0x00a1 }; - if(!convertToU(sampleText, sizeof(sampleText), expected, sizeof(expected)/sizeof(expected[0]), "ibm-1363", 0, TRUE, U_ZERO_ERROR )) log_err("DBCS (ibm-1363)->Unicode did not match.\n"); if(!convertToU(sampleText, sizeof(sampleText), expected, sizeof(expected)/sizeof(expected[0]), "ibm-1363", 0, FALSE, U_ZERO_ERROR )) log_err("DBCS (ibm-1363)->Unicode with flush = false did not match.\n"); - - if(!convertToU(sampleText2, sizeof(sampleText2), - expected2, sizeof(expected2)/sizeof(expected2[0]), "ibm-1363", 0, TRUE, U_TRUNCATED_CHAR_FOUND )) - log_err("DBCS (ibm-1363)->Unicode with TRUNCATED CHARACTER did not match.\n"); - - } log_verbose("Testing error conditions for SBCS\n"); { @@ -668,57 +642,6 @@ static void TestToUnicodeErrorBehaviour() log_err("SBCS (ibm-1051)->Unicode with flush = false did not match.\n"); } - log_verbose("Testing error conditions for UTF8\n"); - { - const uint8_t sampleText[] = { 0x31, 0xe4, 0xba, 0x8c, 0xe4, 0xb8 }; - UChar expectedUTF8[] = { 0x0031, 0x4e8c}; - int32_t offsets[] = { 0x0000, 0x0001}; - - const uint8_t sampleText2[] = { 0x31, 0xff, 0xe4, 0xba, 0x8c, - 0xe0, 0x80, 0x61}; - UChar expected2UTF8[] = { 0x0031, 0xfffd, 0x4e8c, 0xfffd, 0x0061}; - int32_t offsets2[] = { 0x0000, 0x0001, 0x0002, 0x0005, 0x0007}; - - const uint8_t sampleText3[] = { 0x31, 0xfb, 0xbf, 0xbf, 0xbf, 0xbf, - 0x61}; - UChar expected3UTF8[] = { 0x0031, 0xfffd, 0x0061}; - int32_t offsets3[] = { 0x0000, 0x0001, 0x0006}; - - if(!convertToU(sampleText, sizeof(sampleText), - expectedUTF8, sizeof(expectedUTF8)/sizeof(expectedUTF8[0]), "utf-8", 0, TRUE, U_TRUNCATED_CHAR_FOUND )) - log_err("utf-8->Unicode did not match.\n"); - if(!convertToU(sampleText, sizeof(sampleText), - expectedUTF8, sizeof(expectedUTF8)/sizeof(expectedUTF8[0]), "utf-8", 0, FALSE, U_ZERO_ERROR )) - log_err("utf-8->Unicode did not match.\n"); - if(!convertToU(sampleText, sizeof(sampleText), - expectedUTF8, sizeof(expectedUTF8)/sizeof(expectedUTF8[0]), "utf-8", offsets, TRUE, U_TRUNCATED_CHAR_FOUND )) - log_err("utf-8->Unicode did not match.\n"); - if(!convertToU(sampleText, sizeof(sampleText), - expectedUTF8, sizeof(expectedUTF8)/sizeof(expectedUTF8[0]), "utf-8", offsets, FALSE, U_ZERO_ERROR )) - log_err("utf-8->Unicode did not match.\n"); - - if(!convertToU(sampleText2, sizeof(sampleText2), - expected2UTF8, sizeof(expected2UTF8)/sizeof(expected2UTF8[0]), "utf-8", 0, TRUE, U_ZERO_ERROR )) - log_err("utf-8->Unicode did not match.\n"); - if(!convertToU(sampleText2, sizeof(sampleText2), - expected2UTF8, sizeof(expected2UTF8)/sizeof(expected2UTF8[0]), "utf-8", 0, FALSE, U_ZERO_ERROR )) - log_err("utf-8->Unicode did not match.\n"); - if(!convertToU(sampleText2, sizeof(sampleText2), - expected2UTF8, sizeof(expected2UTF8)/sizeof(expected2UTF8[0]), "utf-8", offsets2, TRUE, U_ZERO_ERROR )) - log_err("utf-8->Unicode did not match.\n"); - if(!convertToU(sampleText2, sizeof(sampleText2), - expected2UTF8, sizeof(expected2UTF8)/sizeof(expected2UTF8[0]), "utf-8", offsets2, FALSE, U_ZERO_ERROR )) - log_err("utf-8->Unicode did not match.\n"); - - if(!convertToU(sampleText3, sizeof(sampleText3), - expected3UTF8, sizeof(expected3UTF8)/sizeof(expected3UTF8[0]), "utf-8", offsets3, TRUE, U_ZERO_ERROR )) - log_err("utf-8->Unicode did not match.\n"); - if(!convertToU(sampleText3, sizeof(sampleText3), - expected3UTF8, sizeof(expected3UTF8)/sizeof(expected3UTF8[0]), "utf-8", offsets3, FALSE, U_ZERO_ERROR )) - log_err("utf-8->Unicode did not match with flush false.\n"); - - } - } static void TestGetNextErrorBehaviour(){ @@ -971,9 +894,9 @@ static UBool convertFromU( const UChar *source, int sourceLen, const uint8_t *e if(memcmp(buffer, expect, expectLen)){ log_err("String does not match. FROM Unicode to codePage%s\n", codepage); - printf("\nGot:"); + log_info("\nGot:"); printSeqErr((const unsigned char *)buffer, expectLen); - printf("\nExpected:"); + log_info("\nExpected:"); printSeqErr((const unsigned char *)expect, expectLen); return FALSE; } @@ -985,13 +908,13 @@ static UBool convertFromU( const UChar *source, int sourceLen, const uint8_t *e log_verbose("comparing %d offsets..\n", targ-buffer); if(memcmp(offsetBuffer,expectOffsets,(targ-buffer) * sizeof(int32_t) )){ log_err("did not get the expected offsets. for FROM Unicode to %s\n", codepage); - printf("\nGot : "); + log_info("\nGot : "); printSeqErr((const unsigned char*)buffer, targ-buffer); for(p=buffer;p ibm-920 [UCNV_SBCS] not match.\n"); - if(!testConvertToU(expected1, sizeof(expected1), - sampleText1, sizeof(sampleText1)/sizeof(sampleText1[0]), "ibm-920",UCNV_TO_U_CALLBACK_SUBSTITUTE , - offsets1, TRUE)) - log_err("ibm -920 -> did not match.\n"); - - /*LATIN_1*/ - if(!testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), - expected, sizeof(expected), "LATIN1", UCNV_FROM_U_CALLBACK_SUBSTITUTE , offsets, TRUE)) - log_err("u-> LATIN_1 not match.\n"); - if(!testConvertToU(expected1, sizeof(expected1), - sampleText1, sizeof(sampleText1)/sizeof(sampleText1[0]), "LATIN1",UCNV_TO_U_CALLBACK_SUBSTITUTE , - offsets1, TRUE)) - log_err("LATIN1 -> did not match.\n"); - - - - } log_verbose("Testing Reset for DBCS and MBCS\n"); { static const UChar sampleText[] = {0x00a1, 0xd801, 0xdc01, 0x00a4}; @@ -1546,7 +1438,7 @@ static void TestResetBehaviour(void){ 0x36, 0x21, 0x0f, 0x31, 0x1A, - 0x0f, 0x32 + 0x32 }; @@ -1555,17 +1447,17 @@ static void TestResetBehaviour(void){ 1, 1, 2, 2, 3, - 5, 5, }; + 5, }; UChar sampleText1[] = {0x4e00, 0x04e01, 0x0031,0x001A, 0x0032}; static const uint8_t expected1[] = { 0x1B, 0x24, 0x29, 0x41, 0x0E, 0x52, 0x3B, 0x36, 0x21, - 0x1B, 0x24, 0x29, 0x47, 0x1B, 0x4E, 0x24, 0x22, + 0x1B, 0x24, 0x29, 0x47, 0x24, 0x22, 0x0f, 0x1A, 0x32 }; - static const int32_t offsets1[] = { 5,7,15,18,19}; + static const int32_t offsets1[] = { 5,7,13,16,17}; /*iso-2022-CN*/ if(!testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), @@ -1729,6 +1621,13 @@ doTestTruncated(const char *cnvName, const uint8_t *bytes, int32_t length) { log_data_err("error TestTruncated: unable to open \"%s\" - %s\n", cnvName, u_errorName(errorCode)); return; } + ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &errorCode); + if(U_FAILURE(errorCode)) { + log_data_err("error TestTruncated: unable to set the stop callback on \"%s\" - %s\n", + cnvName, u_errorName(errorCode)); + ucnv_close(cnv); + return; + } source=(const char *)bytes; sourceLimit=source+length; @@ -1747,16 +1646,10 @@ doTestTruncated(const char *cnvName, const uint8_t *bytes, int32_t length) { target=buffer; ucnv_toUnicode(cnv, &target, targetLimit, &source, sourceLimit, NULL, TRUE, &errorCode); if(errorCode!=U_TRUNCATED_CHAR_FOUND || target!=buffer) { - log_err("error TestTruncated(%s, 1b): no input, flush=TRUE: %s (should be U_TRUNCATED_CHAR_FOUND), output %d\n", - cnvName, u_errorName(errorCode), (int)(target-buffer)); + log_err("error TestTruncated(%s, 1b): no input (previously %d), flush=TRUE: %s (should be U_TRUNCATED_CHAR_FOUND), output %d\n", + cnvName, (int)length, u_errorName(errorCode), (int)(target-buffer)); } - /* - * ### TODO: flush=TRUE resets; make sure this is well documented; question - - * does it also delete ucnv_getInvalidChars()? - * resetting logically should delete them, but then it is not possible to figure out which bytes are left in the converter. - */ - /* 2. input bytes with flush=TRUE */ ucnv_resetToUnicode(cnv); @@ -1764,7 +1657,7 @@ doTestTruncated(const char *cnvName, const uint8_t *bytes, int32_t length) { source=(const char *)bytes; target=buffer; ucnv_toUnicode(cnv, &target, targetLimit, &source, sourceLimit, NULL, TRUE, &errorCode); - if(errorCode!=U_TRUNCATED_CHAR_FOUND || target!=buffer) { + if(errorCode!=U_TRUNCATED_CHAR_FOUND || source!=sourceLimit || target!=buffer) { log_err("error TestTruncated(%s, 2): input bytes[%d], flush=TRUE: %s (should be U_TRUNCATED_CHAR_FOUND), input left %d, output %d\n", cnvName, length, u_errorName(errorCode), (int)(sourceLimit-source), (int)(target-buffer)); } @@ -1840,7 +1733,10 @@ TestUnicodeSet() { "BOCU-1", "CESU-8", "gb18030", - "IMAP-mailbox-name", + "IMAP-mailbox-name" + }; + + static const char *const lmbcsNames[]={ "LMBCS-1", "LMBCS-2", "LMBCS-3", @@ -1914,6 +1810,29 @@ TestUnicodeSet() { ucnv_close(cnv); } + /* test LMBCS variants which convert all of Unicode except for U+F6xx */ + for(i=0; i 0)){ + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + testdatapath = loadTestData(status); + + /* convert the string from UTF-8 to UTF-16 */ + u_strFromUTF8(b1,b1Capacity,&b1Len,src,srcLength,status); + if(*status == U_BUFFER_OVERFLOW_ERROR){ + + /* reset the status */ + *status = U_ZERO_ERROR; + + b1 = (UChar*) malloc(b1Len * U_SIZEOF_UCHAR); + if(b1==NULL){ + *status = U_MEMORY_ALLOCATION_ERROR; + goto CLEANUP; + } + + b1Capacity = b1Len; + u_strFromUTF8(b1, b1Capacity, &b1Len, src, srcLength, status); + } + + /* open the profile */ + profile = usprep_open(testdatapath, NFS4DataFileNames[state], status); + /* prepare the string */ + b2Len = usprep_prepare(profile, b1, b1Len, b2, b2Capacity, USPREP_DEFAULT, parseError, status); + if(*status == U_BUFFER_OVERFLOW_ERROR){ + *status = U_ZERO_ERROR; + b2 = (UChar*) malloc(b2Len * U_SIZEOF_UCHAR); + if(b2== NULL){ + *status = U_MEMORY_ALLOCATION_ERROR; + goto CLEANUP; + } + b2Len = usprep_prepare(profile, b1, b1Len, b2, b2Len, USPREP_DEFAULT, parseError, status); + } + + /* convert the string back to UTF-8 */ + u_strToUTF8(b3,b3Capacity, &b3Len, b2, b2Len, status); + if(*status == U_BUFFER_OVERFLOW_ERROR){ + *status = U_ZERO_ERROR; + b3 = (char*) malloc(b3Len); + if(b3== NULL){ + *status = U_MEMORY_ALLOCATION_ERROR; + goto CLEANUP; + } + b3Capacity = b3Len; + u_strToUTF8(b3,b3Capacity, &b3Len, b2, b2Len, status); + } + + reqLength = b3Len; + if(dest!=NULL && reqLength <= destCapacity){ + memmove(dest, b3, reqLength); + } + +CLEANUP: + if(b1!=b1Stack){ + free(b1); + } + if(b2!=b2Stack){ + free(b2); + } + if(b3!=b3Stack){ + free(b3); + } + + return u_terminateChars(dest, destCapacity, reqLength, status); +} + +static void +syntaxError( const UChar* rules, + int32_t pos, + int32_t rulesLen, + UParseError* parseError){ + int32_t start, stop; + if(parseError == NULL){ + return; + } + if(pos == rulesLen && rulesLen >0){ + pos--; + } + parseError->offset = pos; + parseError->line = 0 ; /* we are not using line numbers */ + + /* for pre-context */ + start = (pos <=U_PARSE_CONTEXT_LEN)? 0 : (pos - (U_PARSE_CONTEXT_LEN-1)); + stop = pos; + + u_memcpy(parseError->preContext,rules+start,stop-start); + /* null terminate the buffer */ + parseError->preContext[stop-start] = 0; + + /* for post-context */ + start = pos; + if(startpostContext,rules+start,stop-start); + /* null terminate the buffer */ + parseError->postContext[stop-start]= 0; + } + +} + + +/* sorted array for binary search*/ +static const char* special_prefixes[]={ + "\x0041\x004e\x004f\x004e\x0059\x004d\x004f\x0055\x0053", + "\x0041\x0055\x0054\x0048\x0045\x004e\x0054\x0049\x0043\x0041\x0054\x0045\x0044", + "\x0042\x0041\x0054\x0043\x0048", + "\x0044\x0049\x0041\x004c\x0055\x0050", + "\x0045\x0056\x0045\x0052\x0059\x004f\x004e\x0045", + "\x0047\x0052\x004f\x0055\x0050", + "\x0049\x004e\x0054\x0045\x0052\x0041\x0043\x0054\x0049\x0056\x0045", + "\x004e\x0045\x0054\x0057\x004f\x0052\x004b", + "\x004f\x0057\x004e\x0045\x0052", +}; + + +/* binary search the sorted array */ +static int +findStringIndex(const char* const *sortedArr, int32_t sortedArrLen, const char* target, int32_t targetLen){ + + int left, middle, right,rc; + + left =0; + right= sortedArrLen-1; + + while(left <= right){ + middle = (left+right)/2; + rc=strncmp(sortedArr[middle],target, targetLen); + + if(rc<0){ + left = middle+1; + }else if(rc >0){ + right = middle -1; + }else{ + return middle; + } + } + return -1; +} + +static void +getPrefixSuffix(const char *src, int32_t srcLength, + const char **prefix, int32_t *prefixLen, + const char **suffix, int32_t *suffixLen, + UErrorCode *status){ + + int32_t i=0; + *prefix = src; + while(i 0)){ + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + if(srcLength == -1){ + srcLength = (int32_t)strlen(src); + } + getPrefixSuffix(src, srcLength, &prefix, &prefixLen, &suffix, &suffixLen, status); + + /* prepare the prefix */ + pLen = nfs4_prepare(prefix, prefixLen, p, pCapacity, NFS4_MIXED_PREP_PREFIX, parseError, status); + if(*status == U_BUFFER_OVERFLOW_ERROR){ + *status = U_ZERO_ERROR; + p = (char*) malloc(pLen); + if(p == NULL){ + *status = U_MEMORY_ALLOCATION_ERROR; + goto CLEANUP; + } + pLen = nfs4_prepare(prefix, prefixLen, p, pLen, NFS4_MIXED_PREP_PREFIX, parseError, status); + } + + /* prepare the suffix */ + if(suffix != NULL){ + sLen = nfs4_prepare(suffix, suffixLen, s, sCapacity, NFS4_MIXED_PREP_SUFFIX, parseError, status); + if(*status == U_BUFFER_OVERFLOW_ERROR){ + *status = U_ZERO_ERROR; + s = (char*) malloc(pLen); + if(s == NULL){ + *status = U_MEMORY_ALLOCATION_ERROR; + goto CLEANUP; + } + sLen = nfs4_prepare(suffix, suffixLen, s, sLen, NFS4_MIXED_PREP_SUFFIX, parseError, status); + } + } + reqLen = pLen+sLen+1 /* for the delimiter */; + if(dest != NULL && reqLen <= destCapacity){ + memmove(dest, p, pLen); + /* add the suffix */ + if(suffix!=NULL){ + dest[pLen++] = PREFIX_SUFFIX_SEPARATOR; + memmove(dest+pLen, s, sLen); + } + } + +CLEANUP: + if(p != pStack){ + free(p); + } + if(s != sStack){ + free(s); + } + + return u_terminateChars(dest, destCapacity, reqLen, status); +} + +int32_t +nfs4_cis_prepare( const char* src, int32_t srcLength, + char* dest, int32_t destCapacity, + UParseError* parseError, + UErrorCode* status){ + return nfs4_prepare(src, srcLength, dest, destCapacity, NFS4_CIS_PREP, parseError, status); +} + + +int32_t +nfs4_cs_prepare( const char* src, int32_t srcLength, + char* dest, int32_t destCapacity, + UBool isCaseSensitive, + UParseError* parseError, + UErrorCode* status){ + if(isCaseSensitive){ + return nfs4_prepare(src, srcLength, dest, destCapacity, NFS4_CS_PREP_CS, parseError, status); + }else{ + return nfs4_prepare(src, srcLength, dest, destCapacity, NFS4_CS_PREP_CI, parseError, status); + } +} + +#endif +/* + * Hey, Emacs, please set the following: + * + * Local Variables: + * indent-tabs-mode: nil + * End: + * + */ + diff --git a/icuSources/test/cintltst/nfsprep.h b/icuSources/test/cintltst/nfsprep.h new file mode 100644 index 00000000..fe3e63d5 --- /dev/null +++ b/icuSources/test/cintltst/nfsprep.h @@ -0,0 +1,113 @@ +/* + ******************************************************************************* + * + * Copyright (C) 2003, International Business Machines + * Corporation and others. All Rights Reserved. + * + ******************************************************************************* + * file name: nfsprep.h + * encoding: US-ASCII + * tab size: 8 (not used) + * indentation:4 + * + * created on: 2003jul11 + * created by: Ram Viswanadha + */ +#ifndef _NFSPREP_H +#define _NFSPREP_H + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_IDNA + +#include "unicode/ustring.h" +#include "unicode/usprep.h" +#include +#include + + +/* this enum must be kept in syn with NFS4DataFileNames array in nfsprep.c */ +enum NFS4ProfileState{ + NFS4_CS_PREP_CS, + NFS4_CS_PREP_CI, + NFS4_CIS_PREP, + NFS4_MIXED_PREP_PREFIX, + NFS4_MIXED_PREP_SUFFIX +}; + +typedef enum NFS4ProfileState NFS4ProfileState; + +/** + * Prepares the source UTF-8 string for use in file names and + * returns UTF-8 string on output. + * @param src + * @param srcLen + * @param dest + * @param destCapacity + * @param state + * @param parseError + * @param status + */ +int32_t +nfs4_prepare(const char* src, int32_t srcLength, + char* dest, int32_t destCapacity, + NFS4ProfileState state, + UParseError* parseError, + UErrorCode* status); + +/** + * @param dest + * @param destCapacity + * @param src + * @param srcLen + * @param state + * @param parseError + * @param status + */ +int32_t +nfs4_mixed_prepare( const char* src, int32_t srcLength, + char* dest, int32_t destCapacity, + UParseError* parseError, + UErrorCode* status); + +/** + * @param dest + * @param destCapacity + * @param src + * @param srcLen + * @param state + * @param parseError + * @param status + */ +int32_t +nfs4_cis_prepare( const char* src, int32_t srcLength, + char* dest, int32_t destCapacity, + UParseError* parseError, + UErrorCode* status); + +/** + * @param dest + * @param destCapacity + * @param src + * @param srcLen + * @param state + * @param parseError + * @param status + */ +int32_t +nfs4_cs_prepare( const char* src, int32_t srcLength, + char* dest, int32_t destCapacity, + UBool isCaseSensitive, + UParseError* parseError, + UErrorCode* status); +#endif + +#endif +/* + * Hey, Emacs, please set the following: + * + * Local Variables: + * indent-tabs-mode: nil + * End: + * + */ diff --git a/icuSources/test/cintltst/nucnvtst.c b/icuSources/test/cintltst/nucnvtst.c index 7d9facdd..b67c69d9 100644 --- a/icuSources/test/cintltst/nucnvtst.c +++ b/icuSources/test/cintltst/nucnvtst.c @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** @@ -23,7 +23,7 @@ #include "unicode/ucol.h" #include "cmemory.h" -static void TestNextUChar(UConverter* cnv, const char* source, const char* limit, const uint32_t results[], const char* message); +static void TestNextUChar(UConverter* cnv, const char* source, const char* limit, const int32_t results[], const char* message); static void TestNextUCharError(UConverter* cnv, const char* source, const char* limit, UErrorCode expected, const char* message); #if !UCONFIG_NO_COLLATION static void TestJitterbug981(void); @@ -47,7 +47,9 @@ static void TestLATIN1(void); static void TestSBCS(void); static void TestDBCS(void); static void TestMBCS(void); +#ifdef U_ENABLE_GENERIC_ISO_2022 static void TestISO_2022(void); +#endif static void TestISO_2022_JP(void); static void TestISO_2022_JP_1(void); static void TestISO_2022_JP_2(void); @@ -92,7 +94,7 @@ static char gNuConvTestName[1024]; static UConverter *my_ucnv_open(const char *cnv, UErrorCode *err) { if(cnv && cnv[0] == '@') { - return ucnv_openPackage("testdata", cnv+1, err); + return ucnv_openPackage(loadTestData(err), cnv+1, err); } else { return ucnv_open(cnv, err); } @@ -134,13 +136,13 @@ static void printUSeqErr(const UChar* a, int len) } static void -TestNextUChar(UConverter* cnv, const char* source, const char* limit, const uint32_t results[], const char* message) +TestNextUChar(UConverter* cnv, const char* source, const char* limit, const int32_t results[], const char* message) { const char* s0; const char* s=(char*)source; - const uint32_t *r=results; + const int32_t *r=results; UErrorCode errorCode=U_ZERO_ERROR; - uint32_t c; + UChar32 c; while(s=0 */ + (*r>=0 && (int32_t)(s-s0)!=*r) || + c!=*(r+1) + ) { log_err("%s ucnv_getNextUChar() result %lx from %d bytes, should have been %lx from %d bytes.\n", message, c, (s-s0), *(r+1), *r); break; @@ -214,6 +220,8 @@ void addTestNewConvert(TestNode** root) addTest(root, &TestUTF7, "tsconv/nucnvtst/TestUTF7"); addTest(root, &TestIMAP, "tsconv/nucnvtst/TestIMAP"); addTest(root, &TestUTF8, "tsconv/nucnvtst/TestUTF8"); + + /* test ucnv_getNextUChar() for charsets that encode single surrogates with complete byte sequences */ addTest(root, &TestCESU8, "tsconv/nucnvtst/TestCESU8"); addTest(root, &TestUTF16, "tsconv/nucnvtst/TestUTF16"); addTest(root, &TestUTF16BE, "tsconv/nucnvtst/TestUTF16BE"); @@ -221,11 +229,15 @@ void addTestNewConvert(TestNode** root) addTest(root, &TestUTF32, "tsconv/nucnvtst/TestUTF32"); addTest(root, &TestUTF32BE, "tsconv/nucnvtst/TestUTF32BE"); addTest(root, &TestUTF32LE, "tsconv/nucnvtst/TestUTF32LE"); + addTest(root, &TestLMBCS, "tsconv/nucnvtst/TestLMBCS"); + addTest(root, &TestLATIN1, "tsconv/nucnvtst/TestLATIN1"); addTest(root, &TestSBCS, "tsconv/nucnvtst/TestSBCS"); addTest(root, &TestDBCS, "tsconv/nucnvtst/TestDBCS"); addTest(root, &TestMBCS, "tsconv/nucnvtst/TestMBCS"); +#ifdef U_ENABLE_GENERIC_ISO_2022 addTest(root, &TestISO_2022, "tsconv/nucnvtst/TestISO_2022"); +#endif addTest(root, &TestISO_2022_JP, "tsconv/nucnvtst/TestISO_2022_JP"); addTest(root, &TestJIS, "tsconv/nucnvtst/TestJIS"); addTest(root, &TestISO_2022_JP_1, "tsconv/nucnvtst/TestISO_2022_JP_1"); @@ -239,7 +251,6 @@ void addTestNewConvert(TestNode** root) addTest(root, &TestSCSU, "tsconv/nucnvtst/TestSCSU"); addTest(root, &TestEBCDIC_STATEFUL, "tsconv/nucnvtst/TestEBCDIC_STATEFUL"); addTest(root, &TestGB18030, "tsconv/nucnvtst/TestGB18030"); - addTest(root, &TestLMBCS, "tsconv/nucnvtst/TestLMBCS"); addTest(root, &TestJitterbug255, "tsconv/nucnvtst/TestJitterbug255"); addTest(root, &TestEBCDICUS4XML, "tsconv/nucnvtst/TestEBCDICUS4XML"); addTest(root, &TestISCII, "tsconv/nucnvtst/TestISCII"); @@ -262,11 +273,11 @@ void addTestNewConvert(TestNode** root) static void setNuConvTestName(const char *codepage, const char *direction) { - sprintf(gNuConvTestName, "[Testing %s %s Unicode, InputBufSiz=%d, OutputBufSiz=%d]", - codepage, - direction, - gInBufferSize, - gOutBufferSize); + sprintf(gNuConvTestName, "[Testing %s %s Unicode, InputBufSiz=%d, OutputBufSiz=%d]", + codepage, + direction, + (int)gInBufferSize, + (int)gOutBufferSize); } typedef enum @@ -614,6 +625,7 @@ static void TestNewConvertWithBufferSizes(int32_t outsize, int32_t insize ) int32_t fmUTF8Offs[] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0007, 0x000a, 0x000d }; +#ifdef U_ENABLE_GENERIC_ISO_2022 /* Same as UTF8, but with ^[%B preceeding */ const uint8_t expectedISO2022[] = { 0x1b, 0x25, 0x42, 0x31, 0x32, 0x33, 0x00, 0xe4, 0xb8, 0x80, 0xe4, 0xba, 0x8c, 0xe4, 0xb8, 0x89, 0x2E }; @@ -622,6 +634,7 @@ static void TestNewConvertWithBufferSizes(int32_t outsize, int32_t insize ) 0x04, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x07 }; /* right? */ int32_t fmISO2022Offs[] = { 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x000a, 0x000d, 0x0010 }; /* is this right? */ +#endif /* 1 2 3 0, h1 h2 h3 . EBCDIC_STATEFUL */ const uint8_t expectedIBM930[] = @@ -763,9 +776,11 @@ static void TestNewConvertWithBufferSizes(int32_t outsize, int32_t insize ) } +#ifdef U_ENABLE_GENERIC_ISO_2022 /*ISO-2022*/ testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), expectedISO2022, sizeof(expectedISO2022), "ISO_2022", toISO2022Offs,FALSE ); +#endif /*UTF16 LE*/ testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]), expectedUTF16LE, sizeof(expectedUTF16LE), "utf-16le", toUTF16LEOffs,FALSE ); @@ -810,9 +825,11 @@ static void TestNewConvertWithBufferSizes(int32_t outsize, int32_t insize ) /*UTF-8*/ testConvertToU(expectedUTF8, sizeof(expectedUTF8), sampleText, sizeof(sampleText)/sizeof(sampleText[0]), "utf8", fmUTF8Offs,FALSE); +#ifdef U_ENABLE_GENERIC_ISO_2022 /*ISO-2022*/ testConvertToU(expectedISO2022, sizeof(expectedISO2022), sampleText, sizeof(sampleText)/sizeof(sampleText[0]), "ISO_2022", fmISO2022Offs,FALSE); +#endif /*UTF16 LE*/ testConvertToU(expectedUTF16LE, sizeof(expectedUTF16LE), sampleText, sizeof(sampleText)/sizeof(sampleText[0]), "utf-16le", fmUTF16LEOffs,FALSE); @@ -1135,18 +1152,9 @@ static void TestCoverageMBCS(){ const uint8_t expectedtest1[] = { 0x00, 0x05, 0xff, 0x07, 0xff,}; int32_t totest1Offs[] = { 0, 1, 2, 3, 5, }; - const uint8_t test1input[] = { 0x00, 0x05, 0x06, 0x07, 0x08, 0x09}; - const UChar expectedUnicode[] = { 0x20ac, 0x0005, 0x0006, 0xdbc4, 0xde34, 0xfffd, 0xfffd}; - int32_t fromtest1Offs[] = { 0, 1, 2, 3, 3, 4, 5}; - /*from Unicode*/ testConvertFromU(unicodeInput, sizeof(unicodeInput)/sizeof(unicodeInput[0]), expectedtest1, sizeof(expectedtest1), "@test1", totest1Offs,FALSE ); - - /*to Unicode*/ - testConvertToU(test1input, sizeof(test1input), - expectedUnicode, sizeof(expectedUnicode)/sizeof(expectedUnicode[0]), "@test1", fromtest1Offs ,FALSE); - } /*some more test to increase the code coverage in MBCS. Create an test converter from test3.ucm @@ -1296,7 +1304,9 @@ static void TestConverterTypesAndStarters() TestConverterType("UTF-16LE", UCNV_UTF16_LittleEndian); TestConverterType("UTF-32BE", UCNV_UTF32_BigEndian); TestConverterType("UTF-32LE", UCNV_UTF32_LittleEndian); +#ifdef U_ENABLE_GENERIC_ISO_2022 TestConverterType("iso-2022", UCNV_ISO_2022); +#endif TestConverterType("hz", UCNV_HZ); TestConverterType("scsu", UCNV_SCSU); TestConverterType("x-iscii-de", UCNV_ISCII); @@ -1459,7 +1469,9 @@ TestSignatureDetection(){ "\x2B\x2F\x76\x38\x41", /* UTF-7 */ "\x2B\x2F\x76\x39\x41", /* UTF-7 */ "\x2B\x2F\x76\x2B\x41", /* UTF-7 */ - "\x2B\x2F\x76\x2F\x41" /* UTF-7 */ + "\x2B\x2F\x76\x2F\x41", /* UTF-7 */ + + "\xDD\x73\x66\x73" /* UTF-EBCDIC */ }; static const char* expected[] = { "UTF-16BE", @@ -1481,7 +1493,8 @@ TestSignatureDetection(){ "UTF-7", "UTF-7", "UTF-7", - "UTF-7" + "UTF-7", + "UTF-EBCDIC" }; static const int32_t expectedLength[] ={ 2, @@ -1503,6 +1516,7 @@ TestSignatureDetection(){ 4, 4, 4, + 4, 4 }; int i=0; @@ -1660,7 +1674,7 @@ static TestUTF7() { }; /* expected test results */ - static const uint32_t results[]={ + static const int32_t results[]={ /* number of bytes read, code point */ 1, 0x48, 1, 0x2d, @@ -1704,7 +1718,7 @@ static TestIMAP() { }; /* expected test results */ - static const uint32_t results[]={ + static const int32_t results[]={ /* number of bytes read, code point */ 1, 0x48, 1, 0x2d, @@ -1746,7 +1760,7 @@ static TestUTF8() { }; /* expected test results */ - static const uint32_t results[]={ + static const int32_t results[]={ /* number of bytes read, code point */ 1, 0x61, 2, 0x80, @@ -1770,7 +1784,7 @@ static TestUTF8() { }; /* expected error test results */ - static const uint32_t results2[]={ + static const int32_t results2[]={ /* number of bytes read, code point */ 1, 0x61, 22, 0x62 @@ -1813,15 +1827,15 @@ static TestCESU8() { }; /* expected test results */ - static const uint32_t results[]={ + static const int32_t results[]={ /* number of bytes read, code point */ 1, 0x61, 2, 0x80, 3, 0x800, 6, 0x10000, 3, 0xdc01, - 3, 0xd802, - 6, 0x10ffff, + -1,0xd802, /* may read 3 or 6 bytes */ + -1,0x10ffff,/* may read 0 or 3 bytes */ 3, 0xfffc }; @@ -1842,7 +1856,7 @@ static TestCESU8() { }; /* expected error test results */ - static const uint32_t results2[]={ + static const int32_t results2[]={ /* number of bytes read, code point */ 1, 0x61, 34, 0x62 @@ -1885,17 +1899,17 @@ static TestUTF16() { }; /* expected test results */ - static const uint32_t results1[]={ + static const int32_t results1[]={ /* number of bytes read, code point */ 4, 0x4e00, 2, 0xfeff }; - static const uint32_t results2[]={ + static const int32_t results2[]={ /* number of bytes read, code point */ 4, 0x004e, 2, 0xfffe }; - static const uint32_t results3[]={ + static const int32_t results3[]={ /* number of bytes read, code point */ 2, 0xfefe, 2, 0x4e00, @@ -1943,7 +1957,7 @@ static TestUTF16BE() { }; /* expected test results */ - static const uint32_t results[]={ + static const int32_t results[]={ /* number of bytes read, code point */ 2, 0x61, 2, 0xc0, @@ -1966,13 +1980,23 @@ static TestUTF16BE() { /*Test for the condition where there is an invalid character*/ { static const uint8_t source2[]={0x61}; + ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &errorCode); TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_TRUNCATED_CHAR_FOUND, "an invalid character"); } +#if 0 + /* + * Test disabled because currently the UTF-16BE/LE converters are supposed + * to not set errors for unpaired surrogates. + * This may change with + * Jitterbug 1838 - forbid converting surrogate code points in UTF-16/32 + */ + /*Test for the condition where there is a surrogate pair*/ { const uint8_t source2[]={0xd8, 0x01}; TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_TRUNCATED_CHAR_FOUND, "an truncated surrogate character"); } +#endif ucnv_close(cnv); } @@ -1988,7 +2012,7 @@ TestUTF16LE() { }; /* expected test results */ - static const uint32_t results[]={ + static const int32_t results[]={ /* number of bytes read, code point */ 2, 0x61, 2, 0x31, @@ -2010,13 +2034,23 @@ TestUTF16LE() { /*Test for the condition where there is an invalid character*/ { static const uint8_t source2[]={0x61}; + ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &errorCode); TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_TRUNCATED_CHAR_FOUND, "an invalid character"); } +#if 0 + /* + * Test disabled because currently the UTF-16BE/LE converters are supposed + * to not set errors for unpaired surrogates. + * This may change with + * Jitterbug 1838 - forbid converting surrogate code points in UTF-16/32 + */ + /*Test for the condition where there is a surrogate character*/ { static const uint8_t source2[]={0x01, 0xd8}; TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_TRUNCATED_CHAR_FOUND, "an truncated surrogate character"); } +#endif ucnv_close(cnv); } @@ -2035,22 +2069,22 @@ static TestUTF32() { }; /* expected test results */ - static const uint32_t results1[]={ + static const int32_t results1[]={ /* number of bytes read, code point */ 8, 0x100f00, 4, 0xfeff }; - static const uint32_t results2[]={ + static const int32_t results2[]={ /* number of bytes read, code point */ 8, 0x0f1000, 4, 0xfffe }; - static const uint32_t results3[]={ + static const int32_t results3[]={ /* number of bytes read, code point */ 4, 0xfefe, 4, 0x100f00, - 4, 0xd840, - 4, 0xdc01 + 4, 0xfffd, /* unmatched surrogate */ + 4, 0xfffd /* unmatched surrogate */ }; const char *source, *limit; @@ -2085,22 +2119,24 @@ TestUTF32BE() { /* test input */ static const uint8_t in[]={ 0x00, 0x00, 0x00, 0x61, + 0x00, 0x00, 0x30, 0x61, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0xdf, 0xff, - 0x00, 0x00, 0xff, 0xfd, + 0x00, 0x00, 0xff, 0xfe, 0x00, 0x10, 0xab, 0xcd, 0x00, 0x10, 0xff, 0xff }; /* expected test results */ - static const uint32_t results[]={ + static const int32_t results[]={ /* number of bytes read, code point */ 4, 0x61, - 4, 0xdc00, - 4, 0xd800, - 4, 0xdfff, + 4, 0x3061, 4, 0xfffd, + 4, 0xfffd, + 4, 0xfffd, + 4, 0xfffe, 4, 0x10abcd, 4, 0x10ffff }; @@ -2117,7 +2153,7 @@ TestUTF32BE() { }; /* expected error test results */ - static const uint32_t results2[]={ + static const int32_t results2[]={ /* number of bytes read, code point */ 4, 0x61, 8, 0x62, @@ -2154,22 +2190,24 @@ TestUTF32LE() { /* test input */ static const uint8_t in[]={ 0x61, 0x00, 0x00, 0x00, + 0x61, 0x30, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0xff, 0xdf, 0x00, 0x00, - 0xfd, 0xff, 0x00, 0x00, + 0xfe, 0xff, 0x00, 0x00, 0xcd, 0xab, 0x10, 0x00, 0xff, 0xff, 0x10, 0x00 }; /* expected test results */ - static const uint32_t results[]={ + static const int32_t results[]={ /* number of bytes read, code point */ 4, 0x61, - 4, 0xdc00, - 4, 0xd800, - 4, 0xdfff, + 4, 0x3061, + 4, 0xfffd, + 4, 0xfffd, 4, 0xfffd, + 4, 0xfffe, 4, 0x10abcd, 4, 0x10ffff }; @@ -2186,7 +2224,7 @@ TestUTF32LE() { }; /* expected error test results */ - static const uint32_t results2[]={ + static const int32_t results2[]={ /* number of bytes read, code point */ 4, 0x61, 8, 0x62, @@ -2231,7 +2269,7 @@ TestLATIN1() { }; /* expected test results */ - static const uint32_t results[]={ + static const int32_t results[]={ /* number of bytes read, code point */ 1, 0x61, 1, 0x31, @@ -2351,7 +2389,7 @@ TestSBCS() { /* test input */ static const uint8_t in[]={ 0x61, 0xc0, 0x80, 0xe0, 0xf0, 0xf4}; /* expected test results */ - static const uint32_t results[]={ + static const int32_t results[]={ /* number of bytes read, code point */ 1, 0x61, 1, 0xbf, @@ -2363,12 +2401,12 @@ TestSBCS() { const char *source=(const char *)in, *limit=(const char *)in+sizeof(in); UErrorCode errorCode=U_ZERO_ERROR; - UConverter *cnv=ucnv_open("ibm-1281", &errorCode); + UConverter *cnv=ucnv_open("x-mac-turkish", &errorCode); if(U_FAILURE(errorCode)) { - log_data_err("Unable to open a SBCS(ibm-1281) converter: %s\n", u_errorName(errorCode)); + log_data_err("Unable to open a SBCS(x-mac-turkish) converter: %s\n", u_errorName(errorCode)); return; } - TestNextUChar(cnv, source, limit, results, "SBCS(ibm-1281)"); + TestNextUChar(cnv, source, limit, results, "SBCS(x-mac-turkish)"); /* Test the condition when source >= sourceLimit */ TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source"); /*Test for Illegal character */ /* @@ -2394,7 +2432,7 @@ TestDBCS() { }; /* expected test results */ - static const uint32_t results[]={ + static const int32_t results[]={ /* number of bytes read, code point */ 2, 0x00a7, 2, 0xe1d2, @@ -2414,16 +2452,17 @@ TestDBCS() { TestNextUChar(cnv, source, limit, results, "DBCS(@ibm9027)"); /* Test the condition when source >= sourceLimit */ TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source"); - /*Test for the condition where we have a truncated char*/ - { - static const uint8_t source1[]={0xc4}; - TestNextUCharError(cnv, (const char*)source1, (const char*)source1+sizeof(source1), U_TRUNCATED_CHAR_FOUND, "a character is truncated"); - } /*Test for the condition where there is an invalid character*/ { static const uint8_t source2[]={0x1a, 0x1b}; TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ZERO_ERROR, "an invalid character"); } + /*Test for the condition where we have a truncated char*/ + { + static const uint8_t source1[]={0xc4}; + ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &errorCode); + TestNextUCharError(cnv, (const char*)source1, (const char*)source1+sizeof(source1), U_TRUNCATED_CHAR_FOUND, "a character is truncated"); + } ucnv_close(cnv); } @@ -2442,7 +2481,7 @@ TestMBCS() { }; /* expected test results */ - static const uint32_t results[]={ + static const int32_t results[]={ /* number of bytes read, code point */ 1, 0x0001, 2, 0x250c, @@ -2464,25 +2503,29 @@ TestMBCS() { TestNextUChar(cnv, source, limit, results, "MBCS(ibm-1363)"); /* Test the condition when source >= sourceLimit */ TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source"); - /*Test for the condition where we have a truncated char*/ - { - static const uint8_t source1[]={0xc4}; - TestNextUCharError(cnv, (const char*)source1, (const char*)source1+sizeof(source1), U_TRUNCATED_CHAR_FOUND, "a character is truncated"); - } /*Test for the condition where there is an invalid character*/ { static const uint8_t source2[]={0xa1, 0x01}; TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ZERO_ERROR, "an invalid character"); } + /*Test for the condition where we have a truncated char*/ + { + static const uint8_t source1[]={0xc4}; + ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &errorCode); + TestNextUCharError(cnv, (const char*)source1, (const char*)source1+sizeof(source1), U_TRUNCATED_CHAR_FOUND, "a character is truncated"); + } ucnv_close(cnv); } +#ifdef U_ENABLE_GENERIC_ISO_2022 + static void TestISO_2022() { /* test input */ static const uint8_t in[]={ - 0x1b, 0x25, 0x42, 0x31, + 0x1b, 0x25, 0x42, + 0x31, 0x32, 0x61, 0xc2, 0x80, @@ -2493,15 +2536,14 @@ TestISO_2022() { /* expected test results */ - static const uint32_t results[]={ + static const int32_t results[]={ /* number of bytes read, code point */ - 4, 0x0031, + 4, 0x0031, /* 4 bytes including the escape sequence */ 1, 0x0032, 1, 0x61, 2, 0x80, 3, 0x800, - 4, 0x10000, - + 4, 0x10000 }; const char *source=(const char *)in, *limit=(const char *)in+sizeof(in); @@ -2521,16 +2563,19 @@ TestISO_2022() { /*Test for the condition where we have a truncated char*/ { static const uint8_t source1[]={0xc4}; + ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &errorCode); TestNextUCharError(cnv, (const char*)source1, (const char*)source1+sizeof(source1), U_TRUNCATED_CHAR_FOUND, "a character is truncated"); } /*Test for the condition where there is an invalid character*/ { static const uint8_t source2[]={0xa1, 0x01}; - TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ZERO_ERROR, "an invalid character"); + TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ILLEGAL_CHAR_FOUND, "an invalid character"); } ucnv_close(cnv); } +#endif + static void TestSmallTargetBuffer(const uint16_t* source, const UChar* sourceLimit,UConverter* cnv){ const UChar* uSource; @@ -3078,7 +3123,7 @@ TestISO_2022_JP() { int32_t* myOff= offsets; cnv=ucnv_open("ISO_2022_JP_1", &errorCode); if(U_FAILURE(errorCode)) { - log_data_err("Unable to open a iso-2022 converter: %s\n", u_errorName(errorCode)); + log_data_err("Unable to open an ISO_2022_JP_1 converter: %s\n", u_errorName(errorCode)); return; } @@ -3816,6 +3861,7 @@ TestISO_2022_KR() { ucnv_reset(cnv); { static const uint8_t source2[]={0x1b,0x24,0x053}; + ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &errorCode); TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ILLEGAL_ESCAPE_SEQUENCE, "an invalid character [ISO-2022-KR]"); } ucnv_close(cnv); @@ -3895,6 +3941,7 @@ TestISO_2022_KR_1() { ucnv_reset(cnv); { static const uint8_t source2[]={0x1b,0x24,0x053}; + ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &errorCode); TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ILLEGAL_ESCAPE_SEQUENCE, "an invalid character [ISO-2022-KR]"); } ucnv_close(cnv); @@ -3942,98 +3989,7 @@ static void TestJitterbug2411(){ static void TestJIS(){ - /* From Unicode */ - { - /* JIS Encoding */ - UChar sampleTextJIS[] ={ - 0xFF81, 0xFF82, - 0x30EC, 0x30ED, - 0x30EE, 0x30EF, - 0xFF93, 0xFF94, - 0xFF95, 0xFF96, - 0xFF97, 0xFF98 - }; - const uint8_t expectedISO2022JIS[] ={ - 0x1b, 0x24, 0x42, - 0x25, 0x41, 0x25, 0x44, - 0x25, 0x6c, 0x25, 0x6d, - 0x25, 0x6e, 0x25, 0x6F, - 0x25, 0x62, 0x25, 0x64, - 0x25, 0x66, 0x25, 0x68, - 0x25, 0x69, 0x25, 0x6a - - }; - int32_t fmISO2022JISOffs[] ={ - 0,0,0, - 0,0,1,1, - 2,2,3,3, - 4,4,5,5, - 6,6,7,7, - 8,8,9,9, - 10,10,11,11 - - }; - - /* JIS7 Encoding */ - const uint8_t expectedISO2022JIS7[] ={ - 0x1b, 0x28, 0x49, - 0x41, 0x42, - 0x1b, 0x24, 0x42, - 0x25, 0x6c, 0x25, 0x6d, - 0x25, 0x6e, 0x25, 0x6F, - 0x1b, 0x28, 0x49, - 0x53, 0x54, - 0x55, 0x56, - 0x57, 0x58 - - }; - int32_t fmISO2022JIS7Offs[] ={ - 0,0,0, - 0,1, - 2,2,2, - 2,2,3,3, - 4,4,5,5, - 6,6,6, - 6,7, - 8,9, - 10,11 - - }; - - /* JIS8 Encoding */ - const uint8_t expectedISO2022JIS8[] ={ - 0x1b, 0x28, 0x4A, - 0xC1, 0xC2, - 0x1b, 0x24, 0x42, - 0x25, 0x6c, 0x25, 0x6d, - 0x25, 0x6e, 0x25, 0x6F, - 0x1b, 0x28, 0x4A, - 0xD3, 0xD4, - 0xD5, 0xD6, - 0xD7, 0xD8 - - }; - int32_t fmISO2022JIS8Offs[] ={ - 0,0,0, - 0,1, - 2,2,2, - 2,2,3,3, - 4,4,5,5, - 6,6,6, - 6,7, - 8,9, - 10,11 - - }; - testConvertFromU(sampleTextJIS, sizeof(sampleTextJIS)/sizeof(sampleTextJIS[0]), - expectedISO2022JIS, sizeof(expectedISO2022JIS), "JIS", fmISO2022JISOffs,TRUE ); - testConvertFromU(sampleTextJIS, sizeof(sampleTextJIS)/sizeof(sampleTextJIS[0]), - expectedISO2022JIS7, sizeof(expectedISO2022JIS7), "JIS7", fmISO2022JIS7Offs,FALSE ); - testConvertFromU(sampleTextJIS, sizeof(sampleTextJIS)/sizeof(sampleTextJIS[0]), - expectedISO2022JIS8, sizeof(expectedISO2022JIS8), "JIS8", fmISO2022JIS8Offs,FALSE ); - - - } + /* From Unicode moved to testdata/conversion.txt */ /*To Unicode*/ { const uint8_t sampleTextJIS[] = { @@ -4123,28 +4079,28 @@ static void TestJitterbug915(){ 0x70, 0x6C, 0x61, 0x6E, 0x65, 0x20, 0x31, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B, 0x24, 0x2A, 0x48, 0x1B, 0x4E, 0x22, 0x21, 0x1B, 0x4E, 0x22, 0x22, 0x1B, 0x4E, 0x22, 0x23, 0x1B, 0x4E, - 0x22, 0x24, 0x1B, 0x4E, 0x22, 0x25, 0x0F, 0x2F, 0x2A, 0x70, + 0x22, 0x24, 0x1B, 0x4E, 0x22, 0x25, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, 0x65, 0x32, 0x2A, 0x2F, 0x20, 0x0D, 0x0A, 0x1B, 0x24, 0x2B, 0x49, 0x1B, 0x4F, 0x22, 0x44, 0x1B, 0x4F, 0x22, 0x45, 0x1B, 0x4F, 0x22, 0x46, 0x1B, 0x4F, 0x22, 0x47, - 0x1B, 0x4F, 0x22, 0x48, 0x0F, 0x2F, 0x2A, 0x70, 0x6C, 0x61, + 0x1B, 0x4F, 0x22, 0x48, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, 0x65, 0x20, 0x33, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B, 0x24, 0x2B, 0x4A, 0x1B, 0x4F, 0x21, 0x44, 0x1B, 0x4F, 0x21, 0x45, 0x1B, 0x4F, 0x22, 0x6A, 0x1B, 0x4F, 0x22, 0x6B, 0x1B, - 0x4F, 0x22, 0x6C, 0x0F, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, + 0x4F, 0x22, 0x6C, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, 0x65, 0x20, 0x34, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B, 0x24, 0x2B, 0x4B, 0x1B, 0x4F, 0x21, 0x74, 0x1B, 0x4F, 0x22, 0x50, 0x1B, 0x4F, 0x22, 0x51, 0x1B, 0x4F, 0x23, 0x37, 0x1B, 0x4F, - 0x22, 0x5C, 0x0F, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, + 0x22, 0x5C, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, 0x65, 0x20, 0x35, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B, 0x24, 0x2B, 0x4C, 0x1B, 0x4F, 0x21, 0x23, 0x1B, 0x4F, 0x22, 0x2C, 0x1B, 0x4F, 0x23, 0x4E, 0x1B, 0x4F, 0x21, 0x6E, 0x1B, 0x4F, - 0x23, 0x71, 0x0F, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, 0x65, + 0x23, 0x71, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, 0x65, 0x20, 0x36, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B, 0x24, 0x2B, 0x4D, 0x1B, 0x4F, 0x22, 0x71, 0x1B, 0x4F, 0x21, 0x4E, 0x1B, 0x4F, 0x21, 0x6A, 0x1B, 0x4F, 0x23, 0x3A, 0x1B, 0x4F, 0x23, - 0x6F, 0x0F, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, 0x65, 0x20, - 0x37, 0x20, 0x2A, 0x2F, + 0x6F, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, 0x65, 0x20, + 0x37, 0x20, 0x2A, 0x2F }; UChar uTarget[500]={'\0'}; UChar* utarget=uTarget; @@ -4177,9 +4133,11 @@ static void TestJitterbug915(){ ctargetLimit=ctarget; ctarget =cTarget; while(ctarget target_cap) ? bytes_needed : target_cap +1; - if(numNeeded!=0 && numNeeded!= bytes_needed){ - log_err("ucnv_fromUChars returns different values for required capacity in pre-flight and conversion modes"); - } - numNeeded = bytes_needed; - } while (status == U_BUFFER_OVERFLOW_ERROR); - ucol_close(myCollator); - ucnv_close(utf8cnv); + target_cap = 0; + do { + ucnv_reset(utf8cnv); + status = U_ZERO_ERROR; + if(target_cap >= buff_size) { + log_err("wanted %d bytes, only %d available\n", target_cap, buff_size); + return; + } + bytes_needed = ucnv_fromUChars(utf8cnv, buff, target_cap, + rules, rules_length, &status); + target_cap = (bytes_needed > target_cap) ? bytes_needed : target_cap +1; + if(numNeeded!=0 && numNeeded!= bytes_needed){ + log_err("ucnv_fromUChars returns different values for required capacity in pre-flight and conversion modes"); + } + numNeeded = bytes_needed; + } while (status == U_BUFFER_OVERFLOW_ERROR); + ucol_close(myCollator); + ucnv_close(utf8cnv); + free(buff); } #endif diff --git a/icuSources/test/cintltst/putiltst.c b/icuSources/test/cintltst/putiltst.c index b15e502b..2a075243 100644 --- a/icuSources/test/cintltst/putiltst.c +++ b/icuSources/test/cintltst/putiltst.c @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1998-2003, International Business Machines Corporation and + * Copyright (c) 1998-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /* @@ -19,6 +19,7 @@ #include "unicode/putil.h" #include "unicode/ustring.h" #include "cstring.h" +#include "putilimp.h" static UBool compareWithNAN(double x, double y); static void doAssert(double expect, double got, const char *message); @@ -112,6 +113,7 @@ static void TestPUtilAPI(void){ log_err("ERROR: uprv_isInfinite failed.\n"); } +#if 0 log_verbose("Testing the API uprv_digitsAfterDecimal()....\n"); doAssert(uprv_digitsAfterDecimal(value1), 3, "uprv_digitsAfterDecimal() failed."); doAssert(uprv_digitsAfterDecimal(1.2345E2), 2, "uprv_digitsAfterDecimal(1.2345E2) failed."); @@ -122,6 +124,7 @@ static void TestPUtilAPI(void){ doAssert(uprv_digitsAfterDecimal(-0.021), 3, "uprv_digitsAfterDecimal(-0.021) failed."); doAssert(uprv_digitsAfterDecimal(23.0), 0, "uprv_digitsAfterDecimal(23.0) failed."); doAssert(uprv_digitsAfterDecimal(0.022223333321), 9, "uprv_digitsAfterDecimal(0.022223333321) failed."); +#endif log_verbose("Testing the API u_versionToString().....\n"); @@ -205,6 +208,7 @@ static void TestPUtilAPI(void){ { const char* dataDirectory; + int32_t dataDirectoryLen; UChar *udataDir=0; UChar temp[100]; char *charvalue=0; @@ -215,8 +219,9 @@ static void TestPUtilAPI(void){ /*dataDirectory=u_getDataDirectory();*/ dataDirectory="directory1"; /*no backslashes*/ - udataDir=(UChar*)malloc(sizeof(UChar) * (strlen(dataDirectory) + 1)); - u_charsToUChars(dataDirectory, udataDir, (strlen(dataDirectory)+1)); + dataDirectoryLen=(int32_t)strlen(dataDirectory); + udataDir=(UChar*)malloc(sizeof(UChar) * (dataDirectoryLen + 1)); + u_charsToUChars(dataDirectory, udataDir, (dataDirectoryLen + 1)); u_uastrcpy(temp, dataDirectory); if(u_strcmp(temp, udataDir) != 0){ @@ -243,7 +248,7 @@ static void TestPUtilAPI(void){ if ((tzoffset % 1800 != 0)) { log_err("FAIL: t_timezone may be incorrect. It is not a multiple of 30min."); } - tzoffset=uprv_getUTCtime(); + /*tzoffset=uprv_getUTCtime();*/ } } diff --git a/icuSources/test/cintltst/reapits.c b/icuSources/test/cintltst/reapits.c new file mode 100644 index 00000000..cf674d78 --- /dev/null +++ b/icuSources/test/cintltst/reapits.c @@ -0,0 +1,916 @@ +/******************************************************************** + * COPYRIGHT: + * Copyright (c) 2004, International Business Machines Corporation and + * others. All Rights Reserved. + ********************************************************************/ +/******************************************************************************** +* +* File reapits.c +* +*********************************************************************************/ +/*C API TEST FOR Regular Expressions */ +/** +* This is an API test for ICU regular expressions in C. It doesn't test very many cases, and doesn't +* try to test the full functionality. It just calls each function and verifies that it +* works on a basic level. +* +* More complete testing of regular expression functionality is done with the C++ tests. +**/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_REGULAR_EXPRESSIONS + +#include +#include +#include "unicode/uloc.h" +#include "unicode/uregex.h" +#include "unicode/ustring.h" +#include "cintltst.h" + +#define TEST_ASSERT_SUCCESS(status) {if (U_FAILURE(status)) { \ +log_err("Failure at file %s, line %d, error = %s\n", __FILE__, __LINE__, u_errorName(status));}} + +#define TEST_ASSERT(expr) {if ((expr)==FALSE) { \ +log_err("Test Failure at file %s, line %d\n", __FILE__, __LINE__);}} + +#define TEST_ASSERT_STRING(expected, actual, nulTerm) { \ + char buf_inside_macro[120]; \ + int32_t len = (int32_t)strlen(expected); \ + UBool success; \ + if (nulTerm) { \ + u_austrncpy(buf_inside_macro, (actual), len+1); \ + success = (strcmp((expected), buf_inside_macro) == 0); \ + } else { \ + u_austrncpy(buf_inside_macro, (actual), len); \ + success = (strncmp((expected), buf_inside_macro, len) == 0); \ + } \ + if (success == FALSE) { \ + log_err("Failure at file %s, line %d, expected \"%s\", got \"%s\"\n", \ + __FILE__, __LINE__, (expected), buf_inside_macro); \ + } \ +} + + + + + + +static void TestRegexCAPI(void); + +void addURegexTest(TestNode** root); + +void addURegexTest(TestNode** root) +{ + addTest(root, &TestRegexCAPI, "regex/TestRegexCAPI"); +/* addTest(root, &TestBreakIteratorSafeClone, "tstxtbd/cbiapts/TestBreakIteratorSafeClone"); */ +} + + +static void TestRegexCAPI(void) { + UErrorCode status = U_ZERO_ERROR; + URegularExpression *re; + UChar pat[200]; + UChar *minus1; + + memset(&minus1, -1, sizeof(minus1)); + + /* Mimimalist open/close */ + u_uastrncpy(pat, "abc*", sizeof(pat)/2); + re = uregex_open(pat, -1, 0, 0, &status); + TEST_ASSERT_SUCCESS(status); + uregex_close(re); + + /* Open with all flag values set */ + status = U_ZERO_ERROR; + re = uregex_open(pat, -1, + UREGEX_CASE_INSENSITIVE | UREGEX_COMMENTS | UREGEX_DOTALL | UREGEX_MULTILINE | UREGEX_UWORD, + 0, &status); + TEST_ASSERT_SUCCESS(status); + uregex_close(re); + + /* Open with an invalid flag */ + status = U_ZERO_ERROR; + re = uregex_open(pat, -1, 0x40000000, 0, &status); + TEST_ASSERT(status == U_REGEX_INVALID_FLAG); + uregex_close(re); + + + /* openC open from a C string */ + { + const UChar *p; + int32_t len; + status = U_ZERO_ERROR; + re = uregex_openC("abc*", 0, 0, &status); + TEST_ASSERT_SUCCESS(status); + p = uregex_pattern(re, &len, &status); + TEST_ASSERT_SUCCESS(status); + u_uastrncpy(pat, "abc*", sizeof(pat)/2); + TEST_ASSERT(u_strcmp(pat, p) == 0); + TEST_ASSERT(len==(int32_t)strlen("abc*")); + + uregex_close(re); + + /* TODO: Open with ParseError parameter */ + } + + /* + * clone + */ + { + URegularExpression *clone1; + URegularExpression *clone2; + URegularExpression *clone3; + UChar testString1[30]; + UChar testString2[30]; + UBool result; + + + status = U_ZERO_ERROR; + re = uregex_openC("abc*", 0, 0, &status); + TEST_ASSERT_SUCCESS(status); + clone1 = uregex_clone(re, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(clone1 != NULL); + + status = U_ZERO_ERROR; + clone2 = uregex_clone(re, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(clone2 != NULL); + uregex_close(re); + + status = U_ZERO_ERROR; + clone3 = uregex_clone(clone2, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(clone3 != NULL); + + u_uastrncpy(testString1, "abcccd", sizeof(pat)/2); + u_uastrncpy(testString2, "xxxabcccd", sizeof(pat)/2); + + status = U_ZERO_ERROR; + uregex_setText(clone1, testString1, -1, &status); + TEST_ASSERT_SUCCESS(status); + result = uregex_lookingAt(clone1, 0, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(result==TRUE); + + status = U_ZERO_ERROR; + uregex_setText(clone2, testString2, -1, &status); + TEST_ASSERT_SUCCESS(status); + result = uregex_lookingAt(clone2, 0, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(result==FALSE); + result = uregex_find(clone2, 0, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(result==TRUE); + + uregex_close(clone1); + uregex_close(clone2); + uregex_close(clone3); + + } + + /* + * pattern() + */ + { + const UChar *resultPat; + int32_t resultLen; + u_uastrncpy(pat, "hello", sizeof(pat)/2); + status = U_ZERO_ERROR; + re = uregex_open(pat, -1, 0, NULL, &status); + resultPat = uregex_pattern(re, &resultLen, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(resultLen == -1); + TEST_ASSERT(u_strcmp(resultPat, pat) == 0); + uregex_close(re); + + status = U_ZERO_ERROR; + re = uregex_open(pat, 3, 0, NULL, &status); + resultPat = uregex_pattern(re, &resultLen, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(resultLen == 3); + TEST_ASSERT(u_strncmp(resultPat, pat, 3) == 0); + TEST_ASSERT(u_strlen(resultPat) == 3); + uregex_close(re); + } + + /* + * flags() + */ + { + int32_t t; + + status = U_ZERO_ERROR; + re = uregex_open(pat, -1, 0, NULL, &status); + t = uregex_flags(re, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(t == 0); + uregex_close(re); + + status = U_ZERO_ERROR; + re = uregex_open(pat, -1, 0, NULL, &status); + t = uregex_flags(re, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(t == 0); + uregex_close(re); + + status = U_ZERO_ERROR; + re = uregex_open(pat, -1, UREGEX_CASE_INSENSITIVE | UREGEX_DOTALL, NULL, &status); + t = uregex_flags(re, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(t == (UREGEX_CASE_INSENSITIVE | UREGEX_DOTALL)); + uregex_close(re); + } + + /* + * setText() and lookingAt() + */ + { + UChar text1[50]; + UChar text2[50]; + UBool result; + + u_uastrncpy(text1, "abcccd", sizeof(text1)/2); + u_uastrncpy(text2, "abcccxd", sizeof(text2)/2); + status = U_ZERO_ERROR; + u_uastrncpy(pat, "abc*d", sizeof(pat)/2); + re = uregex_open(pat, -1, 0, NULL, &status); + TEST_ASSERT_SUCCESS(status); + + /* Operation before doing a setText should fail... */ + status = U_ZERO_ERROR; + uregex_lookingAt(re, 0, &status); + TEST_ASSERT( status== U_REGEX_INVALID_STATE); + + status = U_ZERO_ERROR; + uregex_setText(re, text1, -1, &status); + result = uregex_lookingAt(re, 0, &status); + TEST_ASSERT(result == TRUE); + TEST_ASSERT_SUCCESS(status); + + status = U_ZERO_ERROR; + uregex_setText(re, text2, -1, &status); + result = uregex_lookingAt(re, 0, &status); + TEST_ASSERT(result == FALSE); + TEST_ASSERT_SUCCESS(status); + + status = U_ZERO_ERROR; + uregex_setText(re, text1, -1, &status); + result = uregex_lookingAt(re, 0, &status); + TEST_ASSERT(result == TRUE); + TEST_ASSERT_SUCCESS(status); + + status = U_ZERO_ERROR; + uregex_setText(re, text1, 5, &status); + result = uregex_lookingAt(re, 0, &status); + TEST_ASSERT(result == FALSE); + TEST_ASSERT_SUCCESS(status); + + status = U_ZERO_ERROR; + uregex_setText(re, text1, 6, &status); + result = uregex_lookingAt(re, 0, &status); + TEST_ASSERT(result == TRUE); + TEST_ASSERT_SUCCESS(status); + + uregex_close(re); + } + + + /* + * getText() + */ + { + UChar text1[50]; + UChar text2[50]; + const UChar *result; + int32_t textLength; + + u_uastrncpy(text1, "abcccd", sizeof(text1)/2); + u_uastrncpy(text2, "abcccxd", sizeof(text2)/2); + status = U_ZERO_ERROR; + u_uastrncpy(pat, "abc*d", sizeof(pat)/2); + re = uregex_open(pat, -1, 0, NULL, &status); + + uregex_setText(re, text1, -1, &status); + result = uregex_getText(re, &textLength, &status); + TEST_ASSERT(result == text1); + TEST_ASSERT(textLength == -1); + TEST_ASSERT_SUCCESS(status); + + status = U_ZERO_ERROR; + uregex_setText(re, text2, 7, &status); + result = uregex_getText(re, &textLength, &status); + TEST_ASSERT(result == text2); + TEST_ASSERT(textLength == 7); + TEST_ASSERT_SUCCESS(status); + + status = U_ZERO_ERROR; + uregex_setText(re, text2, 4, &status); + result = uregex_getText(re, &textLength, &status); + TEST_ASSERT(result == text2); + TEST_ASSERT(textLength == 4); + TEST_ASSERT_SUCCESS(status); + uregex_close(re); + } + + /* + * matches() + */ + { + UChar text1[50]; + UBool result; + int len; + UChar nullString[] = {0,0,0}; + + u_uastrncpy(text1, "abcccde", sizeof(text1)/2); + status = U_ZERO_ERROR; + u_uastrncpy(pat, "abc*d", sizeof(pat)/2); + re = uregex_open(pat, -1, 0, NULL, &status); + + uregex_setText(re, text1, -1, &status); + result = uregex_matches(re, 0, &status); + TEST_ASSERT(result == FALSE); + TEST_ASSERT_SUCCESS(status); + + status = U_ZERO_ERROR; + uregex_setText(re, text1, 6, &status); + result = uregex_matches(re, 0, &status); + TEST_ASSERT(result == TRUE); + TEST_ASSERT_SUCCESS(status); + + status = U_ZERO_ERROR; + uregex_setText(re, text1, 6, &status); + result = uregex_matches(re, 1, &status); + TEST_ASSERT(result == FALSE); + TEST_ASSERT_SUCCESS(status); + uregex_close(re); + + status = U_ZERO_ERROR; + re = uregex_openC(".?", 0, NULL, &status); + uregex_setText(re, text1, -1, &status); + len = u_strlen(text1); + result = uregex_matches(re, len, &status); + TEST_ASSERT(result == TRUE); + TEST_ASSERT_SUCCESS(status); + + status = U_ZERO_ERROR; + uregex_setText(re, nullString, -1, &status); + TEST_ASSERT_SUCCESS(status); + result = uregex_matches(re, 0, &status); + TEST_ASSERT(result == TRUE); + TEST_ASSERT_SUCCESS(status); + uregex_close(re); + } + + + /* + * lookingAt() Used in setText test. + */ + + + /* + * find(), findNext, start, end, reset + */ + { + UChar text1[50]; + UBool result; + u_uastrncpy(text1, "012rx5rx890rxrx...", sizeof(text1)/2); + status = U_ZERO_ERROR; + re = uregex_openC("rx", 0, NULL, &status); + + uregex_setText(re, text1, -1, &status); + result = uregex_find(re, 0, &status); + TEST_ASSERT(result == TRUE); + TEST_ASSERT(uregex_start(re, 0, &status) == 3); + TEST_ASSERT(uregex_end(re, 0, &status) == 5); + TEST_ASSERT_SUCCESS(status); + + result = uregex_find(re, 9, &status); + TEST_ASSERT(result == TRUE); + TEST_ASSERT(uregex_start(re, 0, &status) == 11); + TEST_ASSERT(uregex_end(re, 0, &status) == 13); + TEST_ASSERT_SUCCESS(status); + + result = uregex_find(re, 14, &status); + TEST_ASSERT(result == FALSE); + TEST_ASSERT_SUCCESS(status); + + status = U_ZERO_ERROR; + uregex_reset(re, 0, &status); + + result = uregex_findNext(re, &status); + TEST_ASSERT(result == TRUE); + TEST_ASSERT(uregex_start(re, 0, &status) == 3); + TEST_ASSERT(uregex_end(re, 0, &status) == 5); + TEST_ASSERT_SUCCESS(status); + + result = uregex_findNext(re, &status); + TEST_ASSERT(result == TRUE); + TEST_ASSERT(uregex_start(re, 0, &status) == 6); + TEST_ASSERT(uregex_end(re, 0, &status) == 8); + TEST_ASSERT_SUCCESS(status); + + status = U_ZERO_ERROR; + uregex_reset(re, 12, &status); + + result = uregex_findNext(re, &status); + TEST_ASSERT(result == TRUE); + TEST_ASSERT(uregex_start(re, 0, &status) == 13); + TEST_ASSERT(uregex_end(re, 0, &status) == 15); + TEST_ASSERT_SUCCESS(status); + + result = uregex_findNext(re, &status); + TEST_ASSERT(result == FALSE); + TEST_ASSERT_SUCCESS(status); + + uregex_close(re); + } + + /* + * groupCount + */ + { + int32_t result; + + status = U_ZERO_ERROR; + re = uregex_openC("abc", 0, NULL, &status); + result = uregex_groupCount(re, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(result == 0); + uregex_close(re); + + status = U_ZERO_ERROR; + re = uregex_openC("abc(def)(ghi(j))", 0, NULL, &status); + result = uregex_groupCount(re, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(result == 3); + uregex_close(re); + + } + + + /* + * group() + */ + { + UChar text1[80]; + UChar buf[80]; + UBool result; + int32_t resultSz; + u_uastrncpy(text1, "noise abc interior def, and this is off the end", sizeof(text1)/2); + + status = U_ZERO_ERROR; + re = uregex_openC("abc(.*?)def", 0, NULL, &status); + TEST_ASSERT_SUCCESS(status); + + + uregex_setText(re, text1, -1, &status); + result = uregex_find(re, 0, &status); + TEST_ASSERT(result==TRUE); + + /* Capture Group 0, the full match. Should succeed. */ + status = U_ZERO_ERROR; + resultSz = uregex_group(re, 0, buf, sizeof(buf)/2, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT_STRING("abc interior def", buf, TRUE); + TEST_ASSERT(resultSz == (int32_t)strlen("abc interior def")); + + /* Capture group #1. Should succeed. */ + status = U_ZERO_ERROR; + resultSz = uregex_group(re, 1, buf, sizeof(buf)/2, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT_STRING(" interior ", buf, TRUE); + TEST_ASSERT(resultSz == (int32_t)strlen(" interior ")); + + /* Capture group out of range. Error. */ + status = U_ZERO_ERROR; + uregex_group(re, 2, buf, sizeof(buf)/2, &status); + TEST_ASSERT(status == U_INDEX_OUTOFBOUNDS_ERROR); + + /* NULL buffer, pure pre-flight */ + status = U_ZERO_ERROR; + resultSz = uregex_group(re, 0, NULL, 0, &status); + TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR); + TEST_ASSERT(resultSz == (int32_t)strlen("abc interior def")); + + /* Too small buffer, truncated string */ + status = U_ZERO_ERROR; + memset(buf, -1, sizeof(buf)); + resultSz = uregex_group(re, 0, buf, 5, &status); + TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR); + TEST_ASSERT_STRING("abc i", buf, FALSE); + TEST_ASSERT(buf[5] == (UChar)0xffff); + TEST_ASSERT(resultSz == (int32_t)strlen("abc interior def")); + + /* Output string just fits buffer, no NUL term. */ + status = U_ZERO_ERROR; + resultSz = uregex_group(re, 0, buf, (int32_t)strlen("abc interior def"), &status); + TEST_ASSERT(status == U_STRING_NOT_TERMINATED_WARNING); + TEST_ASSERT_STRING("abc interior def", buf, FALSE); + TEST_ASSERT(resultSz == (int32_t)strlen("abc interior def")); + TEST_ASSERT(buf[strlen("abc interior def")] == (UChar)0xffff); + + uregex_close(re); + + } + + /* + * replaceFirst() + */ + { + UChar text1[80]; + UChar text2[80]; + UChar replText[80]; + UChar buf[80]; + int32_t resultSz; + u_uastrncpy(text1, "Replace xaax x1x x...x.", sizeof(text1)/2); + u_uastrncpy(text2, "No match here.", sizeof(text2)/2); + u_uastrncpy(replText, "<$1>", sizeof(replText)/2); + + status = U_ZERO_ERROR; + re = uregex_openC("x(.*?)x", 0, NULL, &status); + TEST_ASSERT_SUCCESS(status); + + /* Normal case, with match */ + uregex_setText(re, text1, -1, &status); + resultSz = uregex_replaceFirst(re, replText, -1, buf, sizeof(buf)/2, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT_STRING("Replace x1x x...x.", buf, TRUE); + TEST_ASSERT(resultSz == (int32_t)strlen("Replace xaax x1x x...x.")); + + /* No match. Text should copy to output with no changes. */ + status = U_ZERO_ERROR; + uregex_setText(re, text2, -1, &status); + resultSz = uregex_replaceFirst(re, replText, -1, buf, sizeof(buf)/2, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT_STRING("No match here.", buf, TRUE); + TEST_ASSERT(resultSz == (int32_t)strlen("No match here.")); + + /* Match, output just fills buffer, no termination warning. */ + status = U_ZERO_ERROR; + uregex_setText(re, text1, -1, &status); + memset(buf, -1, sizeof(buf)); + resultSz = uregex_replaceFirst(re, replText, -1, buf, strlen("Replace x1x x...x."), &status); + TEST_ASSERT(status == U_STRING_NOT_TERMINATED_WARNING); + TEST_ASSERT_STRING("Replace x1x x...x.", buf, FALSE); + TEST_ASSERT(resultSz == (int32_t)strlen("Replace xaax x1x x...x.")); + TEST_ASSERT(buf[resultSz] == (UChar)0xffff); + + /* Do the replaceFirst again, without first resetting anything. + * Should give the same results. + */ + status = U_ZERO_ERROR; + memset(buf, -1, sizeof(buf)); + resultSz = uregex_replaceFirst(re, replText, -1, buf, strlen("Replace x1x x...x."), &status); + TEST_ASSERT(status == U_STRING_NOT_TERMINATED_WARNING); + TEST_ASSERT_STRING("Replace x1x x...x.", buf, FALSE); + TEST_ASSERT(resultSz == (int32_t)strlen("Replace xaax x1x x...x.")); + TEST_ASSERT(buf[resultSz] == (UChar)0xffff); + + /* NULL buffer, zero buffer length */ + status = U_ZERO_ERROR; + resultSz = uregex_replaceFirst(re, replText, -1, NULL, 0, &status); + TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR); + TEST_ASSERT(resultSz == (int32_t)strlen("Replace xaax x1x x...x.")); + + /* Buffer too small by one */ + status = U_ZERO_ERROR; + memset(buf, -1, sizeof(buf)); + resultSz = uregex_replaceFirst(re, replText, -1, buf, strlen("Replace x1x x...x.")-1, &status); + TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR); + TEST_ASSERT_STRING("Replace x1x x...x", buf, FALSE); + TEST_ASSERT(resultSz == (int32_t)strlen("Replace xaax x1x x...x.")); + TEST_ASSERT(buf[resultSz] == (UChar)0xffff); + + uregex_close(re); + } + + + /* + * replaceAll() + */ + { + UChar text1[80]; + UChar text2[80]; + UChar replText[80]; + UChar buf[80]; + int32_t resultSz; + int32_t expectedResultSize; + int32_t i; + + u_uastrncpy(text1, "Replace xaax x1x x...x.", sizeof(text1)/2); + u_uastrncpy(text2, "No match here.", sizeof(text2)/2); + u_uastrncpy(replText, "<$1>", sizeof(replText)/2); + expectedResultSize = u_strlen(text1); + + status = U_ZERO_ERROR; + re = uregex_openC("x(.*?)x", 0, NULL, &status); + TEST_ASSERT_SUCCESS(status); + + /* Normal case, with match */ + uregex_setText(re, text1, -1, &status); + resultSz = uregex_replaceAll(re, replText, -1, buf, sizeof(buf)/2, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT_STRING("Replace <1> <...>.", buf, TRUE); + TEST_ASSERT(resultSz == (int32_t)strlen("Replace xaax x1x x...x.")); + + /* No match. Text should copy to output with no changes. */ + status = U_ZERO_ERROR; + uregex_setText(re, text2, -1, &status); + resultSz = uregex_replaceAll(re, replText, -1, buf, sizeof(buf)/2, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT_STRING("No match here.", buf, TRUE); + TEST_ASSERT(resultSz == (int32_t)strlen("No match here.")); + + /* Match, output just fills buffer, no termination warning. */ + status = U_ZERO_ERROR; + uregex_setText(re, text1, -1, &status); + memset(buf, -1, sizeof(buf)); + resultSz = uregex_replaceAll(re, replText, -1, buf, strlen("Replace xaax x1x x...x."), &status); + TEST_ASSERT(status == U_STRING_NOT_TERMINATED_WARNING); + TEST_ASSERT_STRING("Replace <1> <...>.", buf, FALSE); + TEST_ASSERT(resultSz == (int32_t)strlen("Replace <1> <...>.")); + TEST_ASSERT(buf[resultSz] == (UChar)0xffff); + + /* Do the replaceFirst again, without first resetting anything. + * Should give the same results. + */ + status = U_ZERO_ERROR; + memset(buf, -1, sizeof(buf)); + resultSz = uregex_replaceAll(re, replText, -1, buf, strlen("Replace xaax x1x x...x."), &status); + TEST_ASSERT(status == U_STRING_NOT_TERMINATED_WARNING); + TEST_ASSERT_STRING("Replace <1> <...>.", buf, FALSE); + TEST_ASSERT(resultSz == (int32_t)strlen("Replace <1> <...>.")); + TEST_ASSERT(buf[resultSz] == (UChar)0xffff); + + /* NULL buffer, zero buffer length */ + status = U_ZERO_ERROR; + resultSz = uregex_replaceAll(re, replText, -1, NULL, 0, &status); + TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR); + TEST_ASSERT(resultSz == (int32_t)strlen("Replace <1> <...>.")); + + /* Buffer too small. Try every size, which will tickle edge cases + * in uregex_appendReplacement (used by replaceAll) */ + for (i=0; i <1> <...>."); + expected[i] = 0; + TEST_ASSERT_STRING(expected, buf, FALSE); + TEST_ASSERT(resultSz == expectedResultSize); + TEST_ASSERT(buf[i] == (UChar)0xffff); + } + + uregex_close(re); + } + + + /* + * appendReplacement() + */ + { + UChar text[100]; + UChar repl[100]; + UChar buf[100]; + UChar *bufPtr; + int32_t bufCap; + + + status = U_ZERO_ERROR; + re = uregex_openC(".*", 0, 0, &status); + TEST_ASSERT_SUCCESS(status); + + u_uastrncpy(text, "whatever", sizeof(text)/2); + u_uastrncpy(repl, "some other", sizeof(repl)/2); + uregex_setText(re, text, -1, &status); + + /* match covers whole target string */ + uregex_find(re, 0, &status); + TEST_ASSERT_SUCCESS(status); + bufPtr = buf; + bufCap = sizeof(buf) / 2; + uregex_appendReplacement(re, repl, -1, &bufPtr, &bufCap, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT_STRING("some other", buf, TRUE); + + /* Match has \u \U escapes */ + uregex_find(re, 0, &status); + TEST_ASSERT_SUCCESS(status); + bufPtr = buf; + bufCap = sizeof(buf) / 2; + u_uastrncpy(repl, "abc\\u0041\\U00000042 \\\\ $ \\abc", sizeof(repl)/2); + uregex_appendReplacement(re, repl, -1, &bufPtr, &bufCap, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT_STRING("abcAB \\ $ abc", buf, TRUE); + + uregex_close(re); + } + + + /* + * appendTail(). Checked in ReplaceFirst(), replaceAll(). + */ + + /* + * split() + */ + { + UChar textToSplit[80]; + UChar text2[80]; + UChar buf[200]; + UChar *fields[10]; + int32_t numFields; + int32_t requiredCapacity; + int32_t spaceNeeded; + int32_t sz; + + u_uastrncpy(textToSplit, "first : second: third", sizeof(textToSplit)/2); + u_uastrncpy(text2, "No match here.", sizeof(text2)/2); + + status = U_ZERO_ERROR; + re = uregex_openC(":", 0, NULL, &status); + + + /* Simple split */ + + uregex_setText(re, textToSplit, -1, &status); + TEST_ASSERT_SUCCESS(status); + + memset(fields, -1, sizeof(fields)); + numFields = + uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 10, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(numFields == 3); + TEST_ASSERT_STRING("first ", fields[0], TRUE); + TEST_ASSERT_STRING(" second", fields[1], TRUE); + TEST_ASSERT_STRING(" third", fields[2], TRUE); + TEST_ASSERT(fields[3] == NULL); + + spaceNeeded = u_strlen(textToSplit) - + (numFields - 1) + /* Field delimiters do not appear in output */ + numFields; /* Each field gets a NUL terminator */ + + TEST_ASSERT(spaceNeeded == requiredCapacity); + uregex_close(re); + + + /* Split with too few output strings available */ + status = U_ZERO_ERROR; + re = uregex_openC(":", 0, NULL, &status); + uregex_setText(re, textToSplit, -1, &status); + TEST_ASSERT_SUCCESS(status); + + memset(fields, -1, sizeof(fields)); + numFields = + uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 2, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(numFields == 2); + TEST_ASSERT_STRING("first ", fields[0], TRUE); + TEST_ASSERT_STRING(" second: third", fields[1], TRUE); + TEST_ASSERT(!memcmp(&fields[2],&minus1,sizeof(UChar*))); + + spaceNeeded = u_strlen(textToSplit) - + (numFields - 1) + /* Field delimiters do not appear in output */ + numFields; /* Each field gets a NUL terminator */ + + TEST_ASSERT(spaceNeeded == requiredCapacity); + + /* Split with a range of output buffer sizes. */ + spaceNeeded = u_strlen(textToSplit) - + (numFields - 1) + /* Field delimiters do not appear in output */ + numFields; /* Each field gets a NUL terminator */ + + for (sz=0; sz < spaceNeeded+1; sz++) { + memset(fields, -1, sizeof(fields)); + status = U_ZERO_ERROR; + numFields = + uregex_split(re, buf, sz, &requiredCapacity, fields, 10, &status); + if (sz >= spaceNeeded) { + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT_STRING("first ", fields[0], TRUE); + TEST_ASSERT_STRING(" second", fields[1], TRUE); + TEST_ASSERT_STRING(" third", fields[2], TRUE); + } else { + TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR); + } + TEST_ASSERT(numFields == 3); + TEST_ASSERT(fields[3] == NULL); + TEST_ASSERT(spaceNeeded == requiredCapacity); + } + uregex_close(re); + } + + + + + /* Split(), part 2. Patterns with capture groups. The capture group text + * comes out as additional fields. */ + { + UChar textToSplit[80]; + UChar buf[200]; + UChar *fields[10]; + int32_t numFields; + int32_t requiredCapacity; + int32_t spaceNeeded; + int32_t sz; + + u_uastrncpy(textToSplit, "first second third", sizeof(textToSplit)/2); + + status = U_ZERO_ERROR; + re = uregex_openC("<(.*?)>", 0, NULL, &status); + + uregex_setText(re, textToSplit, -1, &status); + TEST_ASSERT_SUCCESS(status); + + memset(fields, -1, sizeof(fields)); + numFields = + uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 10, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(numFields == 5); + TEST_ASSERT_STRING("first ", fields[0], TRUE); + TEST_ASSERT_STRING("tag-a", fields[1], TRUE); + TEST_ASSERT_STRING(" second", fields[2], TRUE); + TEST_ASSERT_STRING("tag-b", fields[3], TRUE); + TEST_ASSERT_STRING(" third", fields[4], TRUE); + TEST_ASSERT(fields[5] == NULL); + spaceNeeded = strlen("first .tag-a. second.tag-b. third."); /* "." at NUL positions */ + TEST_ASSERT(spaceNeeded == requiredCapacity); + + + /* Split with too few output strings available (2) */ + status = U_ZERO_ERROR; + memset(fields, -1, sizeof(fields)); + numFields = + uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 2, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(numFields == 2); + TEST_ASSERT_STRING("first ", fields[0], TRUE); + TEST_ASSERT_STRING(" second third", fields[1], TRUE); + TEST_ASSERT(!memcmp(&fields[2],&minus1,sizeof(UChar*))); + + spaceNeeded = strlen("first . second third."); /* "." at NUL positions */ + TEST_ASSERT(spaceNeeded == requiredCapacity); + + /* Split with too few output strings available (3) */ + status = U_ZERO_ERROR; + memset(fields, -1, sizeof(fields)); + numFields = + uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 3, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(numFields == 3); + TEST_ASSERT_STRING("first ", fields[0], TRUE); + TEST_ASSERT_STRING("tag-a", fields[1], TRUE); + TEST_ASSERT_STRING(" second third", fields[2], TRUE); + TEST_ASSERT(!memcmp(&fields[3],&minus1,sizeof(UChar*))); + + spaceNeeded = strlen("first .tag-a. second third."); /* "." at NUL positions */ + TEST_ASSERT(spaceNeeded == requiredCapacity); + + /* Split with just enough output strings available (5) */ + status = U_ZERO_ERROR; + memset(fields, -1, sizeof(fields)); + numFields = + uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 5, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(numFields == 5); + TEST_ASSERT_STRING("first ", fields[0], TRUE); + TEST_ASSERT_STRING("tag-a", fields[1], TRUE); + TEST_ASSERT_STRING(" second", fields[2], TRUE); + TEST_ASSERT_STRING("tag-b", fields[3], TRUE); + TEST_ASSERT_STRING(" third", fields[4], TRUE); + TEST_ASSERT(!memcmp(&fields[5],&minus1,sizeof(UChar*))); + + spaceNeeded = strlen("first .tag-a. second.tag-b. third."); /* "." at NUL positions */ + TEST_ASSERT(spaceNeeded == requiredCapacity); + + + /* Split, end of text is a field delimiter. */ + status = U_ZERO_ERROR; + sz = strlen("first second"); + uregex_setText(re, textToSplit, sz, &status); + TEST_ASSERT_SUCCESS(status); + memset(fields, -1, sizeof(fields)); + numFields = + uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 9, &status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(numFields == 4); + TEST_ASSERT_STRING("first ", fields[0], TRUE); + TEST_ASSERT_STRING("tag-a", fields[1], TRUE); + TEST_ASSERT_STRING(" second", fields[2], TRUE); + TEST_ASSERT_STRING("tag-b", fields[3], TRUE); + TEST_ASSERT(fields[4] == NULL); + TEST_ASSERT(fields[8] == NULL); + TEST_ASSERT(!memcmp(&fields[9],&minus1,sizeof(UChar*))); + spaceNeeded = strlen("first .tag-a. second.tag-b."); /* "." at NUL positions */ + TEST_ASSERT(spaceNeeded == requiredCapacity); + + uregex_close(re); + } + +} + +#endif /* !UCONFIG_NO_REGULAR_EXPRESSIONS */ diff --git a/icuSources/test/cintltst/sorttest.c b/icuSources/test/cintltst/sorttest.c new file mode 100644 index 00000000..96ab6c9c --- /dev/null +++ b/icuSources/test/cintltst/sorttest.c @@ -0,0 +1,95 @@ +/* +******************************************************************************* +* +* Copyright (C) 2003, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: csorttst.c +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2003aug04 +* created by: Markus W. Scherer +* +* Test internal sorting functions. +*/ + +#include "unicode/utypes.h" +#include "cmemory.h" +#include "cintltst.h" +#include "uarrsort.h" + +#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) + +/* compare only the top 28 bits of int32_t items (bits 3..0 contain the original index) */ +static int32_t U_CALLCONV +_int32Top28Comparator(const void *context, const void *left, const void *right) { + return (*(const int32_t *)left>>4) - (*(const int32_t *)right>>4); +} + +static void +SortTest(void) { + uint16_t small[]={ 8, 1, 2, 5, 4, 3, 7, 6 }; + int32_t medium[]={ 10, 8, 1, 2, 5, 5, 6, 4, 3, 9, 7, 5 }; + uint32_t large[]={ 21, 10, 20, 19, 11, 12, 13, 10, 10, 10, 10, + 8, 1, 2, 5, 10, 10, 4, 17, 18, 3, 9, 10, 7, 6, 14, 15, 16 }; + + int32_t i; + UErrorCode errorCode; + + /* sort small array (stable) */ + errorCode=U_ZERO_ERROR; + uprv_sortArray(small, LENGTHOF(small), sizeof(small[0]), uprv_uint16Comparator, NULL, TRUE, &errorCode); + if(U_FAILURE(errorCode)) { + log_err("uprv_sortArray(small) failed - %s\n", u_errorName(errorCode)); + return; + } + for(i=1; ismall[i]) { + log_err("uprv_sortArray(small) mis-sorted [%d]=%u > [%d]=%u\n", i-1, small[i-1], i, small[i]); + return; + } + } + + /* for medium, add bits that will not be compared, to test stability */ + for(i=0; i=medium[i]) { + log_err("uprv_sortArray(medium) mis-sorted [%d]=%u > [%d]=%u\n", i-1, medium[i-1], i, medium[i]); + return; + } + } + + /* sort large array (not stable) */ + errorCode=U_ZERO_ERROR; + uprv_sortArray(large, LENGTHOF(large), sizeof(large[0]), uprv_uint32Comparator, NULL, FALSE, &errorCode); + if(U_FAILURE(errorCode)) { + log_err("uprv_sortArray(large) failed - %s\n", u_errorName(errorCode)); + return; + } + for(i=1; ilarge[i]) { + log_err("uprv_sortArray(large) mis-sorted [%d]=%u > [%d]=%u\n", i-1, large[i-1], i, large[i]); + return; + } + } +} + +void +addSortTest(TestNode** root); + +void +addSortTest(TestNode** root) { + addTest(root, &SortTest, "tsutil/sorttest/SortTest"); +} diff --git a/icuSources/test/cintltst/spreptst.c b/icuSources/test/cintltst/spreptst.c new file mode 100644 index 00000000..9d82c03b --- /dev/null +++ b/icuSources/test/cintltst/spreptst.c @@ -0,0 +1,562 @@ +/* + ******************************************************************************* + * + * Copyright (C) 2003, International Business Machines + * Corporation and others. All Rights Reserved. + * + ******************************************************************************* + * file name: spreptst.c + * encoding: US-ASCII + * tab size: 8 (not used) + * indentation:4 + * + * created on: 2003jul11 + * created by: Ram Viswanadha + */ +#include +#include +#include "unicode/utypes.h" + +#if !UCONFIG_NO_IDNA + +#include "unicode/ustring.h" +#include "unicode/usprep.h" +#include "cintltst.h" +#include "nfsprep.h" + + +#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) + +void addUStringPrepTest(TestNode** root); +void doStringPrepTest(const char* binFileName, const char* txtFileName, + int32_t options, UErrorCode* errorCode); + +static void Test_nfs4_cs_prep_data(void); +static void Test_nfs4_cis_prep_data(void); +static void Test_nfs4_mixed_prep_data(void); +static void Test_nfs4_cs_prep(void); +static void Test_nfs4_cis_prep(void); +static void Test_nfs4_mixed_prep(void); + +void +addUStringPrepTest(TestNode** root) +{ + addTest(root, &Test_nfs4_cs_prep_data, "spreptst/Test_nfs4_cs_prep_data"); + addTest(root, &Test_nfs4_cis_prep_data, "spreptst/Test_nfs4_cis_prep_data"); + addTest(root, &Test_nfs4_mixed_prep_data, "spreptst/Test_nfs4_mixed_prep_data"); + addTest(root, &Test_nfs4_cs_prep, "spreptst/Test_nfs4_cs_prep"); + addTest(root, &Test_nfs4_cis_prep, "spreptst/Test_nfs4_cis_prep"); + addTest(root, &Test_nfs4_mixed_prep, "spreptst/Test_nfs4_mixed_prep"); +} + +static void +Test_nfs4_cs_prep_data(void){ + UErrorCode errorCode = U_ZERO_ERROR; + log_verbose("Testing nfs4_cs_prep_ci.txt\n"); + doStringPrepTest("nfscsi","nfs4_cs_prep_ci.txt", USPREP_DEFAULT, &errorCode); + + log_verbose("Testing nfs4_cs_prep_cs.txt\n"); + errorCode = U_ZERO_ERROR; + doStringPrepTest("nfscss","nfs4_cs_prep_cs.txt", USPREP_DEFAULT, &errorCode); + + +} +static void +Test_nfs4_cis_prep_data(void){ + UErrorCode errorCode = U_ZERO_ERROR; + log_verbose("Testing nfs4_cis_prep.txt\n"); + doStringPrepTest("nfscis","nfs4_cis_prep.txt", USPREP_DEFAULT, &errorCode); +} +static void +Test_nfs4_mixed_prep_data(void){ + UErrorCode errorCode = U_ZERO_ERROR; + log_verbose("Testing nfs4_mixed_prep_s.txt\n"); + doStringPrepTest("nfsmxs","nfs4_mixed_prep_s.txt", USPREP_DEFAULT, &errorCode); + + errorCode = U_ZERO_ERROR; + log_verbose("Testing nfs4_mixed_prep_p.txt\n"); + doStringPrepTest("nfsmxp","nfs4_mixed_prep_p.txt", USPREP_DEFAULT, &errorCode); + +} + +static struct ConformanceTestCases + { + const char *comment; + const char *in; + const char *out; + const char *profile; + UErrorCode expectedStatus; + } + conformanceTestCases[] = + { + + {/*0*/ + "Case folding ASCII U+0043 U+0041 U+0046 U+0045", + "\x43\x41\x46\x45", "\x63\x61\x66\x65", + "nfs4_cis_prep", + U_ZERO_ERROR + + }, + {/*1*/ + "Case folding 8bit U+00DF (german sharp s)", + "\xC3\x9F", "\x73\x73", + "nfs4_cis_prep", + U_ZERO_ERROR + }, + {/*2*/ + "Non-ASCII multibyte space character U+1680", + "\xE1\x9A\x80", NULL, + "nfs4_cis_prep", + U_STRINGPREP_PROHIBITED_ERROR + }, + {/*3*/ + "Non-ASCII 8bit control character U+0085", + "\xC2\x85", NULL, + "nfs4_cis_prep", + U_STRINGPREP_PROHIBITED_ERROR + }, + {/*4*/ + "Non-ASCII multibyte control character U+180E", + "\xE1\xA0\x8E", NULL, + "nfs4_cis_prep", + U_STRINGPREP_PROHIBITED_ERROR + }, + {/*5*/ + "Non-ASCII control character U+1D175", + "\xF0\x9D\x85\xB5", NULL, + "nfs4_cis_prep", + U_STRINGPREP_PROHIBITED_ERROR + }, + {/*6*/ + "Plane 0 private use character U+F123", + "\xEF\x84\xA3", NULL, + "nfs4_cis_prep", + U_STRINGPREP_PROHIBITED_ERROR + }, + {/*7*/ + "Plane 15 private use character U+F1234", + "\xF3\xB1\x88\xB4", NULL, + "nfs4_cis_prep", + U_STRINGPREP_PROHIBITED_ERROR + }, + {/*8*/ + "Plane 16 private use character U+10F234", + "\xF4\x8F\x88\xB4", NULL, + "nfs4_cis_prep", + U_STRINGPREP_PROHIBITED_ERROR + }, + {/*9*/ + "Non-character code point U+8FFFE", + "\xF2\x8F\xBF\xBE", NULL, + "nfs4_cis_prep", + U_STRINGPREP_PROHIBITED_ERROR + }, + {/*10*/ + "Non-character code point U+10FFFF", + "\xF4\x8F\xBF\xBF", NULL, + "nfs4_cis_prep", + U_STRINGPREP_PROHIBITED_ERROR + }, + /* + { + "Surrogate code U+DF42", + "\xED\xBD\x82", NULL, "nfs4_cis_prep", UIDNA_DEFAULT, + U_STRINGPREP_PROHIBITED_ERROR + }, +*/ + {/*11*/ + "Non-plain text character U+FFFD", + "\xEF\xBF\xBD", NULL, + "nfs4_cis_prep", + U_STRINGPREP_PROHIBITED_ERROR + }, + {/*12*/ + "Ideographic description character U+2FF5", + "\xE2\xBF\xB5", NULL, + "nfs4_cis_prep", + U_STRINGPREP_PROHIBITED_ERROR + }, + {/*13*/ + "Display property character U+0341", + "\xCD\x81", "\xCC\x81", + "nfs4_cis_prep", U_ZERO_ERROR + + }, + + {/*14*/ + "Left-to-right mark U+200E", + "\xE2\x80\x8E", "\xCC\x81", + "nfs4_cis_prep", + U_STRINGPREP_PROHIBITED_ERROR + }, + {/*15*/ + + "Deprecated U+202A", + "\xE2\x80\xAA", "\xCC\x81", + "nfs4_cis_prep", + U_STRINGPREP_PROHIBITED_ERROR + }, + {/*16*/ + "Language tagging character U+E0001", + "\xF3\xA0\x80\x81", "\xCC\x81", + "nfs4_cis_prep", + U_STRINGPREP_PROHIBITED_ERROR + }, + {/*17*/ + "Language tagging character U+E0042", + "\xF3\xA0\x81\x82", NULL, + "nfs4_cis_prep", + U_STRINGPREP_PROHIBITED_ERROR + }, + {/*18*/ + "Bidi: RandALCat character U+05BE and LCat characters", + "\x66\x6F\x6F\xD6\xBE\x62\x61\x72", NULL, + "nfs4_cis_prep", + U_STRINGPREP_CHECK_BIDI_ERROR + }, + {/*19*/ + "Bidi: RandALCat character U+FD50 and LCat characters", + "\x66\x6F\x6F\xEF\xB5\x90\x62\x61\x72", NULL, + "nfs4_cis_prep", + U_STRINGPREP_CHECK_BIDI_ERROR + }, + {/*20*/ + "Bidi: RandALCat character U+FB38 and LCat characters", + "\x66\x6F\x6F\xEF\xB9\xB6\x62\x61\x72", "\x66\x6F\x6F\x20\xd9\x8e\x62\x61\x72", + "nfs4_cis_prep", + U_ZERO_ERROR + }, + {/*21*/ + "Bidi: RandALCat without trailing RandALCat U+0627 U+0031", + "\xD8\xA7\x31", NULL, + "nfs4_cis_prep", + U_STRINGPREP_CHECK_BIDI_ERROR + }, + {/*22*/ + "Bidi: RandALCat character U+0627 U+0031 U+0628", + "\xD8\xA7\x31\xD8\xA8", "\xD8\xA7\x31\xD8\xA8", + "nfs4_cis_prep", + U_ZERO_ERROR + }, + {/*23*/ + "Unassigned code point U+E0002", + "\xF3\xA0\x80\x82", NULL, + "nfs4_cis_prep", + U_STRINGPREP_UNASSIGNED_ERROR + }, + +/* // Invalid UTF-8 + { + "Larger test (shrinking)", + "X\xC2\xAD\xC3\xDF\xC4\xB0\xE2\x84\xA1\x6a\xcc\x8c\xc2\xa0\xc2" + "\xaa\xce\xb0\xe2\x80\x80", "xssi\xcc\x87""tel\xc7\xb0 a\xce\xb0 ", + "nfs4_cis_prep", + U_ZERO_ERROR + }, + { + + "Larger test (expanding)", + "X\xC3\xDF\xe3\x8c\x96\xC4\xB0\xE2\x84\xA1\xE2\x92\x9F\xE3\x8c\x80", + "xss\xe3\x82\xad\xe3\x83\xad\xe3\x83\xa1\xe3\x83\xbc\xe3\x83\x88" + "\xe3\x83\xab""i\xcc\x87""tel\x28""d\x29\xe3\x82\xa2\xe3\x83\x91" + "\xe3\x83\xbc\xe3\x83\x88" + "nfs4_cis_prep", + U_ZERO_ERROR + }, + */ +}; + +#define MAX_BUFFER_SIZE 1000 + +static int32_t +unescapeData(const char* src, int32_t srcLen, + char* dest, int32_t destCapacity, + UErrorCode* status){ + + UChar b1Stack[MAX_BUFFER_SIZE]; + int32_t b1Capacity = MAX_BUFFER_SIZE, + b1Len = 0, + destLen = 0; + + UChar* b1 = b1Stack; + + b1Len = u_unescape(src,b1,b1Capacity); + + u_strToUTF8(dest, destCapacity, &destLen, b1, b1Len, status); + + return destLen; +} + + +static void Test_nfs4_cis_prep(void){ + int32_t i=0; + + for(i=0;i< (int32_t)(sizeof(conformanceTestCases)/sizeof(conformanceTestCases[0]));i++){ + const char* src = conformanceTestCases[i].in; + UErrorCode status = U_ZERO_ERROR; + UParseError parseError; + UErrorCode expectedStatus = conformanceTestCases[i].expectedStatus; + const char* expectedDest = conformanceTestCases[i].out; + char* dest = NULL; + int32_t destLen = 0; + + destLen = nfs4_cis_prepare(src , (int32_t)strlen(src), dest, destLen, &parseError, &status); + if(status == U_BUFFER_OVERFLOW_ERROR){ + status = U_ZERO_ERROR; + dest = (char*) malloc(++destLen); + destLen = nfs4_cis_prepare( src , (int32_t)strlen(src), dest, destLen, &parseError, &status); + } + + if(expectedStatus != status){ + log_err("Did not get the expected status for nfs4_cis_prep at index %i. Expected: %s Got: %s\n",i, u_errorName(expectedStatus), u_errorName(status)); + } + if(U_SUCCESS(status) && (strcmp(expectedDest,dest) !=0)){ + log_err("Did not get the expected output for nfs4_cis_prep at index %i.\n", i); + } + free(dest); + } +} + + + +/* + There are several special identifiers ("who") which need to be + understood universally, rather than in the context of a particular + DNS domain. Some of these identifiers cannot be understood when an + NFS client accesses the server, but have meaning when a local process + accesses the file. The ability to display and modify these + permissions is permitted over NFS, even if none of the access methods + on the server understands the identifiers. + + Who Description + _______________________________________________________________ + + "OWNER" The owner of the file. + "GROUP" The group associated with the file. + "EVERYONE" The world. + "INTERACTIVE" Accessed from an interactive terminal. + "NETWORK" Accessed via the network. + "DIALUP" Accessed as a dialup user to the server. + "BATCH" Accessed from a batch job. + "ANONYMOUS" Accessed without any authentication. + "AUTHENTICATED" Any authenticated user (opposite of + ANONYMOUS) + "SERVICE" Access from a system service. + + To avoid conflict, these special identifiers are distinguish by an + appended "@" and should appear in the form "xxxx@" (note: no domain + name after the "@"). For example: ANONYMOUS@. +*/ +static const char* mixed_prep_data[] ={ + "OWNER@", + "GROUP@", + "EVERYONE@", + "INTERACTIVE@", + "NETWORK@", + "DIALUP@", + "BATCH@", + "ANONYMOUS@", + "AUTHENTICATED@", + "\\u0930\\u094D\\u092E\\u094D\\u0915\\u094D\\u0937\\u0947\\u0924\\u094D@slip129-37-118-146.nc.us.ibm.net", + "\\u0936\\u094d\\u0930\\u0940\\u092e\\u0926\\u094d@saratoga.pe.utexas.edu", + "\\u092d\\u0917\\u0935\\u0926\\u094d\\u0917\\u0940\\u0924\\u093e@dial-120-45.ots.utexas.edu", + "\\u0905\\u0927\\u094d\\u092f\\u093e\\u092f@woo-085.dorms.waller.net", + "\\u0905\\u0930\\u094d\\u091c\\u0941\\u0928@hd30-049.hil.compuserve.com", + "\\u0935\\u093f\\u0937\\u093e\\u0926@pem203-31.pe.ttu.edu", + "\\u092f\\u094b\\u0917@56K-227.MaxTNT3.pdq.net", + "\\u0927\\u0943\\u0924\\u0930\\u093e\\u0937\\u094d\\u091f\\u094d\\u0930@dial-36-2.ots.utexas.edu", + "\\u0909\\u0935\\u093E\\u091A\\u0943@slip129-37-23-152.ga.us.ibm.net", + "\\u0927\\u0930\\u094d\\u092e\\u0915\\u094d\\u0937\\u0947\\u0924\\u094d\\u0930\\u0947@ts45ip119.cadvision.com", + "\\u0915\\u0941\\u0930\\u0941\\u0915\\u094d\\u0937\\u0947\\u0924\\u094d\\u0930\\u0947@sdn-ts-004txaustP05.dialsprint.net", + "\\u0938\\u092e\\u0935\\u0947\\u0924\\u093e@bar-tnt1s66.erols.com", + "\\u092f\\u0941\\u092f\\u0941\\u0924\\u094d\\u0938\\u0935\\u0903@101.st-louis-15.mo.dial-access.att.net", + "\\u092e\\u093e\\u092e\\u0915\\u093e\\u0903@h92-245.Arco.COM", + "\\u092a\\u093e\\u0923\\u094d\\u0921\\u0935\\u093e\\u0936\\u094d\\u091a\\u0948\\u0935@dial-13-2.ots.utexas.edu", + "\\u0915\\u093f\\u092e\\u0915\\u0941\\u0930\\u094d\\u0935\\u0924@net-redynet29.datamarkets.com.ar", + "\\u0938\\u0902\\u091c\\u0935@ccs-shiva28.reacciun.net.ve", + "\\u0c30\\u0c18\\u0c41\\u0c30\\u0c3e\\u0c2e\\u0c4d@7.houston-11.tx.dial-access.att.net", + "\\u0c35\\u0c3f\\u0c36\\u0c4d\\u0c35\\u0c28\\u0c3e\\u0c27@ingw129-37-120-26.mo.us.ibm.net", + "\\u0c06\\u0c28\\u0c02\\u0c26\\u0c4d@dialup6.austintx.com", + "\\u0C35\\u0C26\\u0C4D\\u0C26\\u0C3F\\u0C30\\u0C3E\\u0C1C\\u0C41@dns2.tpao.gov.tr", + "\\u0c30\\u0c3e\\u0c1c\\u0c40\\u0c35\\u0c4d@slip129-37-119-194.nc.us.ibm.net", + "\\u0c15\\u0c36\\u0c30\\u0c2c\\u0c3e\\u0c26@cs7.dillons.co.uk.203.119.193.in-addr.arpa", + "\\u0c38\\u0c02\\u0c1c\\u0c40\\u0c35\\u0c4d@swprd1.innovplace.saskatoon.sk.ca", + "\\u0c15\\u0c36\\u0c30\\u0c2c\\u0c3e\\u0c26@bikini.bologna.maraut.it", + "\\u0c38\\u0c02\\u0c1c\\u0c40\\u0c2c\\u0c4d@node91.subnet159-198-79.baxter.com", + "\\u0c38\\u0c46\\u0c28\\u0c4d\\u0c17\\u0c41\\u0c2a\\u0c4d\\u0c24@cust19.max5.new-york.ny.ms.uu.net", + "\\u0c05\\u0c2e\\u0c30\\u0c47\\u0c02\\u0c26\\u0c4d\\u0c30@balexander.slip.andrew.cmu.edu", + "\\u0c39\\u0c28\\u0c41\\u0c2e\\u0c3e\\u0c28\\u0c41\\u0c32@pool029.max2.denver.co.dynip.alter.net", + "\\u0c30\\u0c35\\u0c3f@cust49.max9.new-york.ny.ms.uu.net", + "\\u0c15\\u0c41\\u0c2e\\u0c3e\\u0c30\\u0c4d@s61.abq-dialin2.hollyberry.com", + "\\u0c35\\u0c3f\\u0c36\\u0c4d\\u0c35\\u0c28\\u0c3e\\u0c27@\\u0917\\u0928\\u0947\\u0936.sanjose.ibm.com", + "\\u0c06\\u0c26\\u0c3f\\u0c24\\u0c4d\\u0c2f@www.\\u00E0\\u00B3\\u00AF.com", + "\\u0C15\\u0C02\\u0C26\\u0C4D\\u0C30\\u0C47\\u0C17\\u0C41\\u0c32@www.\\u00C2\\u00A4.com", + "\\u0c36\\u0c4d\\u0c30\\u0c40\\u0C27\\u0C30\\u0C4D@www.\\u00C2\\u00A3.com", + "\\u0c15\\u0c02\\u0c1f\\u0c2e\\u0c36\\u0c46\\u0c1f\\u0c4d\\u0c1f\\u0c3f@\\u0025", + "\\u0c2e\\u0c3e\\u0c27\\u0c35\\u0c4d@\\u005C\\u005C", + "\\u0c26\\u0c46\\u0c36\\u0c46\\u0c1f\\u0c4d\\u0c1f\\u0c3f@www.\\u0021.com", + "test@www.\\u0024.com", + "help@\\u00C3\\u00BC.com", + +}; + + +static void +Test_nfs4_mixed_prep(void){ + { + int32_t i=0; + char src[MAX_BUFFER_SIZE]; + int32_t srcLen; + + for(i=0; i< LENGTHOF(mixed_prep_data); i++){ + int32_t destLen=0; + char* dest = NULL; + UErrorCode status = U_ZERO_ERROR; + UParseError parseError; + srcLen = unescapeData(mixed_prep_data[i], (int32_t)strlen(mixed_prep_data[i]), src, MAX_BUFFER_SIZE, &status); + if(U_FAILURE(status)){ + log_err("Conversion of data at index %i failed. Error: %s\n", i, u_errorName(status)); + continue; + } + destLen = nfs4_mixed_prepare(src, srcLen, NULL, 0, &parseError, &status); + if(status == U_BUFFER_OVERFLOW_ERROR){ + status = U_ZERO_ERROR; + dest = (char*)malloc(++destLen); + destLen = nfs4_mixed_prepare(src, srcLen, dest, destLen, &parseError, &status); + } + free(dest); + if(U_FAILURE(status)){ + log_err("Preparation of string at index %i failed. Error: %s\n", i, u_errorName(status)); + continue; + } + } + } + /* test the error condition */ + { + const char* source = "OWNER@oss.software.ibm.com"; + char dest[MAX_BUFFER_SIZE]; + char src[MAX_BUFFER_SIZE] = {0}; + UErrorCode status = U_ZERO_ERROR; + UParseError parseError; + + int32_t srcLen = unescapeData(source, (int32_t)strlen(source), src, MAX_BUFFER_SIZE, &status); + + nfs4_mixed_prepare(src, srcLen, dest, MAX_BUFFER_SIZE, &parseError, &status); + + if(status != U_PARSE_ERROR){ + log_err("Did not get the expected error.Expected: %s Got: %s\n", u_errorName(U_PARSE_ERROR), u_errorName(status)); + } + } + + +} + +static void +Test_nfs4_cs_prep(void){ + { + /* BiDi checking is turned off */ + const char *source = "\\uC138\\uACC4\\uC758\\uBAA8\\uB4E0\\uC0AC\\uB78C\\uB4E4\\uC774\\u0644\\u064A\\u0647\\uD55C\\uAD6D\\uC5B4\\uB97C\\uC774\\uD574\\uD55C\\uB2E4\\uBA74"; + UErrorCode status = U_ZERO_ERROR; + char src[MAX_BUFFER_SIZE]={'\0'}; + UParseError parseError; + int32_t srcLen = unescapeData(source, (int32_t)strlen(source), src, MAX_BUFFER_SIZE, &status); + if(U_SUCCESS(status)){ + char dest[MAX_BUFFER_SIZE] = {'\0'}; + int32_t destLen = nfs4_cs_prepare(src, srcLen, dest, MAX_BUFFER_SIZE, FALSE, &parseError, &status); + if(U_FAILURE(status)){ + log_err("StringPrep failed for case: BiDi Checking Turned OFF with error: %s\n", u_errorName(status)); + } + if(strcmp(dest,src)!=0){ + log_err("Did not get the expected output for case: BiDi Checking Turned OFF\n"); + } + if(destLen != srcLen){ + log_err("Did not get the expected length for the output for case: BiDi Checking Turned OFF. Expected: %i Got: %i\n", srcLen, destLen); + } + }else{ + log_err("Conversion failed for case: BiDi Checking Turned OFF with error: %s\n", u_errorName(status)); + } + } + { + /* Normalization turned off */ + const char *source = "www.\\u00E0\\u00B3\\u00AF.com"; + UErrorCode status = U_ZERO_ERROR; + char src[MAX_BUFFER_SIZE]={'\0'}; + UParseError parseError; + int32_t srcLen = unescapeData(source, (int32_t)strlen(source), src, MAX_BUFFER_SIZE, &status); + if(U_SUCCESS(status)){ + char dest[MAX_BUFFER_SIZE] = {'\0'}; + int32_t destLen = nfs4_cs_prepare(src, srcLen, dest, MAX_BUFFER_SIZE, FALSE, &parseError, &status); + if(U_FAILURE(status)){ + log_err("StringPrep failed for case: Normalization Turned OFF with error: %s\n", u_errorName(status)); + } + if(strcmp(dest,src)!=0){ + log_err("Did not get the expected output for case: Normalization Turned OFF\n"); + } + if(destLen != srcLen){ + log_err("Did not get the expected length for the output for case: Normalization Turned OFF. Expected: %i Got: %i\n", srcLen, destLen); + } + }else{ + log_err("Conversion failed for case: Normalization Turned OFF with error: %s\n", u_errorName(status)); + } + } + { + /* case mapping turned off */ + const char *source = "THISISATEST"; + UErrorCode status = U_ZERO_ERROR; + char src[MAX_BUFFER_SIZE]={'\0'}; + UParseError parseError; + int32_t srcLen = unescapeData(source, (int32_t)strlen(source), src, MAX_BUFFER_SIZE, &status); + if(U_SUCCESS(status)){ + char dest[MAX_BUFFER_SIZE] = {'\0'}; + int32_t destLen = nfs4_cs_prepare(src, srcLen, dest, MAX_BUFFER_SIZE, TRUE, &parseError, &status); + if(U_FAILURE(status)){ + log_err("StringPrep failed for case: Case Mapping Turned OFF with error: %s\n", u_errorName(status)); + } + if(strcmp(dest,src)!=0){ + log_err("Did not get the expected output for case: Case Mapping Turned OFF\n"); + } + if(destLen != srcLen){ + log_err("Did not get the expected length for the output for case: Case Mapping Turned OFF. Expected: %i Got: %i\n", srcLen, destLen); + } + }else{ + log_err("Conversion failed for case: Case Mapping Turned OFF with error: %s\n", u_errorName(status)); + } + } + { + /* case mapping turned on */ + const char *source = "THISISATEST"; + const char *expected = "thisisatest"; + UErrorCode status = U_ZERO_ERROR; + char src[MAX_BUFFER_SIZE]={'\0'}; + char exp[MAX_BUFFER_SIZE]={'\0'}; + UParseError parseError; + int32_t srcLen = unescapeData(source, (int32_t)strlen(source), src, MAX_BUFFER_SIZE, &status); + int32_t expLen = unescapeData(expected, (int32_t)strlen(expected), exp, MAX_BUFFER_SIZE, &status); + if(U_SUCCESS(status)){ + char dest[MAX_BUFFER_SIZE] = {'\0'}; + int32_t destLen = nfs4_cs_prepare(src, srcLen, dest, MAX_BUFFER_SIZE, FALSE, &parseError, &status); + if(U_FAILURE(status)){ + log_err("StringPrep failed for case: Case Mapping Turned On with error: %s\n", u_errorName(status)); + } + if(strcmp(exp, dest)!=0){ + log_err("Did not get the expected output for case: Case Mapping Turned On!\n"); + } + if(destLen != expLen){ + log_err("Did not get the expected length for the outputfor case: Case Mapping Turned On. Expected: %i Got: %i\n", strlen(expected), destLen); + } + }else{ + log_err("Conversion failed for case: Case Mapping Turned ON with error: %s\n", u_errorName(status)); + } + } +} + +#endif + +/* + * Hey, Emacs, please set the following: + * + * Local Variables: + * indent-tabs-mode: nil + * End: + * + */ diff --git a/icuSources/test/cintltst/sprpdata.c b/icuSources/test/cintltst/sprpdata.c new file mode 100644 index 00000000..0349541c --- /dev/null +++ b/icuSources/test/cintltst/sprpdata.c @@ -0,0 +1,312 @@ +/* + ******************************************************************************* + * + * Copyright (C) 2003-2004, International Business Machines + * Corporation and others. All Rights Reserved. + * + ******************************************************************************* + * file name: spreptst.c + * encoding: US-ASCII + * tab size: 8 (not used) + * indentation:4 + * + * created on: 2003jul11 + * created by: Ram Viswanadha + */ +#define USPREP_TYPE_NAMES_ARRAY + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_IDNA + +#include "unicode/ustring.h" +#include "unicode/putil.h" +#include "cintltst.h" +#include "unicode/usprep.h" +#include "sprpimpl.h" +#include "uparse.h" +#include "cmemory.h" +#include "ustr_imp.h" +#include "cstring.h" + +static void +parseMappings(const char *filename, UStringPrepProfile* data, UBool reportError, UErrorCode *pErrorCode); + +static void +compareMapping(UStringPrepProfile* data, uint32_t codepoint, uint32_t* mapping, int32_t mapLength, + UStringPrepType option); + +static void +compareFlagsForRange(UStringPrepProfile* data, uint32_t start, uint32_t end,UStringPrepType option); + +void +doStringPrepTest(const char* binFileName, const char* txtFileName, int32_t options, UErrorCode* errorCode); + +static void U_CALLCONV +strprepProfileLineFn(void *context, + char *fields[][2], int32_t fieldCount, + UErrorCode *pErrorCode) { + uint32_t mapping[40]; + char *end, *map; + uint32_t code; + int32_t length; + UStringPrepProfile* data = (UStringPrepProfile*) context; + const char* typeName; + uint32_t rangeStart=0,rangeEnd =0; + + typeName = fields[2][0]; + map = fields[1][0]; + + if(strstr(typeName, usprepTypeNames[USPREP_UNASSIGNED])!=NULL){ + + u_parseCodePointRange(fields[0][0], &rangeStart,&rangeEnd, pErrorCode); + + /* store the range */ + compareFlagsForRange(data, rangeStart,rangeEnd,USPREP_UNASSIGNED); + + }else if(strstr(typeName, usprepTypeNames[USPREP_PROHIBITED])!=NULL){ + + u_parseCodePointRange(fields[0][0], &rangeStart,&rangeEnd, pErrorCode); + + /* store the range */ + compareFlagsForRange(data, rangeStart,rangeEnd,USPREP_PROHIBITED); + + }else if(strstr(typeName, usprepTypeNames[USPREP_MAP])!=NULL){ + /* get the character code, field 0 */ + code=(uint32_t)uprv_strtoul(fields[0][0], &end, 16); + + /* parse the mapping string */ + length=u_parseCodePoints(map, mapping, sizeof(mapping)/4, pErrorCode); + + /* compare the mapping */ + compareMapping(data, code,mapping, length,USPREP_MAP); + }else{ + *pErrorCode = U_INVALID_FORMAT_ERROR; + } + +} + + + +static void +parseMappings(const char *filename, UStringPrepProfile* data, UBool reportError, UErrorCode *pErrorCode) { + char *fields[3][2]; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return; + } + + u_parseDelimitedFile(filename, ';', fields, 3, strprepProfileLineFn, (void*)data, pErrorCode); + + /*fprintf(stdout,"Number of code points that have mappings with length >1 : %i\n",len);*/ + + if(U_FAILURE(*pErrorCode) && (reportError || *pErrorCode!=U_FILE_ACCESS_ERROR)) { + log_err( "testidn error: u_parseDelimitedFile(\"%s\") failed - %s\n", filename, u_errorName(*pErrorCode)); + } +} + + +static UStringPrepType +getValues(uint32_t result, int32_t* value, UBool* isIndex){ + + UStringPrepType type; + if(result == 0){ + /* + * Initial value stored in the mapping table + * just return USPREP_TYPE_LIMIT .. so that + * the source codepoint is copied to the destination + */ + type = USPREP_TYPE_LIMIT; + }else if(result >= _SPREP_TYPE_THRESHOLD){ + type = (UStringPrepType) (result - _SPREP_TYPE_THRESHOLD); + }else{ + /* get the type */ + type = USPREP_MAP; + /* ascertain if the value is index or delta */ + if(result & 0x02){ + *isIndex = TRUE; + *value = result >> 2; + + }else{ + *isIndex = FALSE; + *value = (int16_t)result; + *value = (*value >> 2); + + } + if((result>>2) == _SPREP_MAX_INDEX_VALUE){ + type = USPREP_DELETE; + isIndex =FALSE; + value = 0; + } + } + return type; +} + +static void +compareMapping(UStringPrepProfile* data, uint32_t codepoint, uint32_t* mapping,int32_t mapLength, + UStringPrepType type){ + uint32_t result = 0; + int32_t length=0; + UBool isIndex = FALSE; + UStringPrepType retType; + int32_t value=0, index=0, delta=0; + int32_t* indexes = data->indexes; + UTrie trie = data->sprepTrie; + const uint16_t* mappingData = data->mappingData; + int32_t realLength =0; + int32_t j=0; + int8_t i=0; + + UTRIE_GET16(&trie, codepoint, result); + retType = getValues(result,&value,&isIndex); + + + if(type != retType && retType != USPREP_DELETE){ + + log_err( "Did not get the assigned type for codepoint 0x%08X. Expected: %i Got: %i\n",codepoint, USPREP_MAP, type); + + } + + if(isIndex){ + index = value; + if(index >= indexes[_SPREP_ONE_UCHAR_MAPPING_INDEX_START] && + index < indexes[_SPREP_TWO_UCHARS_MAPPING_INDEX_START]){ + length = 1; + }else if(index >= indexes[_SPREP_TWO_UCHARS_MAPPING_INDEX_START] && + index < indexes[_SPREP_THREE_UCHARS_MAPPING_INDEX_START]){ + length = 2; + }else if(index >= indexes[_SPREP_THREE_UCHARS_MAPPING_INDEX_START] && + index < indexes[_SPREP_FOUR_UCHARS_MAPPING_INDEX_START]){ + length = 3; + }else{ + length = mappingData[index++]; + } + }else{ + delta = value; + length = (retType == USPREP_DELETE)? 0 : 1; + } + + /* figure out the real length */ + for(j=0; j 0xFFFF){ + realLength +=2; + }else{ + realLength++; + } + } + + if(realLength != length){ + log_err( "Did not get the expected length. Expected: %i Got: %i\n", mapLength, length); + } + + if(isIndex){ + for(i =0; i< mapLength; i++){ + if(mapping[i] <= 0xFFFF){ + if(mappingData[index+i] != (uint16_t)mapping[i]){ + log_err("Did not get the expected result. Expected: 0x%04X Got: 0x%04X \n", mapping[i], mappingData[index+i]); + } + }else{ + UChar lead = UTF16_LEAD(mapping[i]); + UChar trail = UTF16_TRAIL(mapping[i]); + if(mappingData[index+i] != lead || + mappingData[index+i+1] != trail){ + log_err( "Did not get the expected result. Expected: 0x%04X 0x%04X Got: 0x%04X 0x%04X\n", lead, trail, mappingData[index+i], mappingData[index+i+1]); + } + } + } + }else{ + if(retType!=USPREP_DELETE && (codepoint-delta) != (uint16_t)mapping[0]){ + log_err("Did not get the expected result. Expected: 0x%04X Got: 0x%04X \n", mapping[0],(codepoint-delta)); + } + } + +} + +static void +compareFlagsForRange(UStringPrepProfile* data, + uint32_t start, uint32_t end, + UStringPrepType type){ + + uint32_t result =0 ; + UStringPrepType retType; + UBool isIndex=FALSE; + int32_t value=0; + UTrie trie = data->sprepTrie; +/* + // supplementary code point + UChar __lead16=UTF16_LEAD(0x2323E); + int32_t __offset; + + // get data for lead surrogate + (result)=_UTRIE_GET_RAW((&idnTrie), index, 0, (__lead16)); + __offset=(&idnTrie)->getFoldingOffset(result); + + // get the real data from the folded lead/trail units + if(__offset>0) { + (result)=_UTRIE_GET_RAW((&idnTrie), index, __offset, (0x2323E)&0x3ff); + } else { + (result)=(uint32_t)((&idnTrie)->initialValue); + } + + UTRIE_GET16(&idnTrie,0x2323E, result); +*/ + while(start < end+1){ + UTRIE_GET16(&trie,start, result); + retType = getValues(result, &value, &isIndex); + if(result > _SPREP_TYPE_THRESHOLD){ + if(retType != type){ + log_err( "FAIL: Did not get the expected type for 0x%06X. Expected: %s Got: %s\n",start,usprepTypeNames[type], usprepTypeNames[retType]); + } + }else{ + if(type == USPREP_PROHIBITED && ((result & 0x01) != 0x01)){ + log_err( "FAIL: Did not get the expected type for 0x%06X. Expected: %s Got: %s\n",start,usprepTypeNames[type], usprepTypeNames[retType]); + } + } + + start++; + } + +} + +void +doStringPrepTest(const char* binFileName, const char* txtFileName, int32_t options, UErrorCode* errorCode){ + + const char *testdatapath = loadTestData(errorCode); + const char *srcdatapath = NULL; + const char *relativepath = NULL; + char *filename = NULL; + UStringPrepProfile* profile = NULL; + +#ifdef U_TOPSRCDIR + srcdatapath = U_TOPSRCDIR; + relativepath = U_FILE_SEP_STRING"test"U_FILE_SEP_STRING"testdata"U_FILE_SEP_STRING; +#else + srcdatapath = ctest_dataOutDir(); + relativepath = ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING"test"U_FILE_SEP_STRING"testdata"U_FILE_SEP_STRING; +#endif + + filename = (char*) malloc(strlen(srcdatapath)+strlen(relativepath)+strlen(txtFileName)+10 ); + profile = usprep_open(testdatapath, binFileName, errorCode); + + if(U_FAILURE(*errorCode)){ + log_err("Failed to load %s data file. Error: %s \n", binFileName, u_errorName(*errorCode)); + return; + } + /* open and load the txt file */ + strcpy(filename,srcdatapath); + strcat(filename,relativepath); + strcat(filename,txtFileName); + + parseMappings(filename,profile, TRUE,errorCode); + + free(filename); +} +#endif +/* + * Hey, Emacs, please set the following: + * + * Local Variables: + * indent-tabs-mode: nil + * End: + * + */ diff --git a/icuSources/test/cintltst/stdnmtst.c b/icuSources/test/cintltst/stdnmtst.c index a5634483..b4e6445f 100644 --- a/icuSources/test/cintltst/stdnmtst.c +++ b/icuSources/test/cintltst/stdnmtst.c @@ -30,9 +30,9 @@ void addStandardNamesTest(TestNode** root); void addStandardNamesTest(TestNode** root) { - addTest(root, &TestStandardName, "stdnmtst/TestStandardName"); - addTest(root, &TestStandardNames, "stdnmtst/TestStandardNames"); - addTest(root, &TestCanonicalName, "stdnmtst/TestCanonicalName"); + addTest(root, &TestStandardName, "tsconv/stdnmtst/TestStandardName"); + addTest(root, &TestStandardNames, "tsconv/stdnmtst/TestStandardNames"); + addTest(root, &TestCanonicalName, "tsconv/stdnmtst/TestCanonicalName"); } static int dotestname(const char *name, const char *standard, const char *expected) { @@ -99,8 +99,8 @@ static void TestStandardName() if (dotestname("ibm-1208", "MIME", "UTF-8") && /*dotestname("cp1252", "MIME", "windows-1252") &&*/ dotestname("ascii", "MIME", "US-ASCII") && - dotestname("ISO_2022", "MIME", "ISO-2022") && - dotestname("ISO-2022", "MIME", "ISO-2022") && + dotestname("csiso2022jp2", "MIME", "ISO-2022-JP-2") && + dotestname("Iso20-22__cN", "MIME", "ISO-2022-CN") && dotestname("ascii", "IANA", "ANSI_X3.4-1968") && dotestname("cp850", "IANA", "IBM850") && dotestname("crazy", "MIME", NULL) && @@ -147,7 +147,7 @@ static void TestCanonicalName() dotestconv("ibm-5305", "IANA", NULL) && /* mapping does not exist */ dotestconv("cp1208", "", "UTF-8") && /* default name due to ordering */ dotestconv("UTF16_BigEndian", "", "UTF-16BE") && /* non-default name due to ordering */ - dotestconv("ISO-2022", "MIME", "ISO_2022") &&/* default name */ + dotestconv("ISO-2022-CN", "MIME", "ISO_2022,locale=zh,version=0") &&/* default name */ dotestconv("Shift_JIS", "MIME", "ibm-943_P14A-1999") &&/* ambiguous alias */ dotestconv("Shift_JIS", "", "ibm-943_P130-1999") &&/* ambiguous alias */ dotestconv("ibm-943", "", "ibm-943_P14A-1999") &&/* ambiguous alias */ @@ -262,7 +262,7 @@ static void TestStandardNames() }; static const char *iso2022MIME[] = { - "ISO-2022", + "ISO-2022-KR", }; doTestNames("ASCII", "IANA", asciiIANA, ARRAY_SIZE(asciiIANA)); @@ -275,8 +275,8 @@ static void TestStandardNames() doTestNames("LMBCS-1", "MIME", asciiMIME, 0); - doTestNames("ISO_2022", "MIME", iso2022MIME, ARRAY_SIZE(iso2022MIME)); - doTestNames("ISO-2022", "MIME", iso2022MIME, ARRAY_SIZE(iso2022MIME)); + doTestNames("ISO_2022,locale=ko,version=0", "MIME", iso2022MIME, ARRAY_SIZE(iso2022MIME)); + doTestNames("csiso2022kr", "MIME", iso2022MIME, ARRAY_SIZE(iso2022MIME)); log_verbose(" Testing unext()\n"); doTestUCharNames("ASCII", "IANA", asciiIANA, ARRAY_SIZE(asciiIANA)); diff --git a/icuSources/test/cintltst/tracetst.c b/icuSources/test/cintltst/tracetst.c new file mode 100644 index 00000000..4fc36be4 --- /dev/null +++ b/icuSources/test/cintltst/tracetst.c @@ -0,0 +1,349 @@ +/******************************************************************** + * COPYRIGHT: + * Copyright (c) 2003-2004, International Business Machines Corporation and + * others. All Rights Reserved. + ********************************************************************/ +/* + * File tracetst.c + * + */ + + +#include "unicode/utypes.h" +#include "unicode/utrace.h" +#include "unicode/uclean.h" +#include "unicode/uchar.h" +#include "unicode/ures.h" +#include "unicode/ucnv.h" +#include "cintltst.h" +#include +#include +#include +#include "utracimp.h" + + +static void TestTraceAPI(void); + + +void +addUTraceTest(TestNode** root); + +void +addUTraceTest(TestNode** root) +{ + addTest(root, &TestTraceAPI, "tsutil/TraceTest/TestTraceAPI" ); +} + + +/* + * Macro for assert style tests. + */ +#define TEST_ASSERT(expr) \ +if (!(expr)) { \ + log_err("FAILED Assertion \"" #expr "\" at %s:%d.\n", __FILE__, __LINE__); \ +} + + +/* + * test_format. Helper function for checking the results of a formatting + * operation. Executes the format op and compares actual + * results with the expected results. + * + * params: format: the format to be applied. + * bufCap buffer size to pass to formatter. + * indent: indent value to give to formatter + * result expected result. Do not truncate for short bufCap - + * this function will do it. + * line __LINE__, so we can report where failure happened. + * ... variable args to pass to formatter + * + */ +static void test_format(const char *format, int32_t bufCap, int32_t indent, + const char *result, int32_t line, ...) { + int32_t len; + va_list args; + char buf[300]; + char expectedResult[300]; + + /* check that local buffers are big enough for the test case */ + if (sizeof(buf) <= bufCap) { + log_err("At file:line %s:%d, requested bufCap too large.\n"); + return; + } + if (strlen(result) >= sizeof(expectedResult)) { + log_err("At file:line %s:%d, expected result too large.\n"); + return; + } + + /* Guarantee a nul term if buffer is smaller than output */ + strcpy(expectedResult, result); + expectedResult[bufCap] = 0; + + /* run the formatter */ + va_start(args, line); + memset(buf, 0, sizeof(buf)); + len = utrace_vformat(buf, bufCap, indent, format, args); + + /* Check results. */ + if (strcmp(expectedResult, buf) != 0) { + log_err("At file:line %s:%d Expected \"%s\", got \"%s\" \n", + __FILE__, line, expectedResult, buf); + } + va_end(args); +} + + +/* + * define trace functions for use in this test. + */ +static int gTraceEntryCount; +static int gTraceExitCount; +static int gTraceDataCount; +static UBool gFnNameError = FALSE; +static UBool gFnFormatError = FALSE; + +static void U_CALLCONV testTraceEntry(const void *context, int32_t fnNumber) { + const char *fnName; + const char *bogusFnName; + + gTraceEntryCount++; + + /* Verify that a name is available for the fnNumber passed to us */ + bogusFnName = utrace_functionName(-1); + fnName = utrace_functionName(fnNumber); + if (strcmp(fnName, bogusFnName) == 0) { + gFnNameError = TRUE; + } + /* printf("%s() Enter\n", fnName); */ + +} + +static void U_CALLCONV testTraceExit(const void *context, int32_t fnNumber, + const char *fmt, va_list args) { + char buf[1000]; + const char *fnName; + const char *bogusFnName; + + gTraceExitCount++; + + /* Verify that a name is available for the fnNumber passed to us */ + bogusFnName = utrace_functionName(-1); + fnName = utrace_functionName(fnNumber); + if (strcmp(fnName, bogusFnName) == 0) { + gFnNameError = TRUE; + } + + /* Verify that the format can be used. */ + buf[0] = 0; + utrace_vformat(buf, sizeof(buf), 0, fmt, args); + if (strlen(buf) == 0) { + gFnFormatError = TRUE; + } + + /* printf("%s() %s\n", fnName, buf); */ + +} + +static void U_CALLCONV testTraceData(const void *context, int32_t fnNumber, int32_t level, + const char *fmt, va_list args) { + char buf[1000]; + const char *fnName; + const char *bogusFnName; + + gTraceDataCount++; + + /* Verify that a name is available for the fnNumber passed to us */ + bogusFnName = utrace_functionName(-1); + fnName = utrace_functionName(fnNumber); + if (strcmp(fnName, bogusFnName) == 0) { + gFnNameError = TRUE; + } + + /* Verify that the format can be used. */ + buf[0] = 0; + utrace_vformat(buf, sizeof(buf), 0, fmt, args); + if (strlen(buf) == 0) { + gFnFormatError = TRUE; + } + + /* printf(" %s() %s\n", fnName, buf); */ +} + + +/* + * TestTraceAPI + */ +static void TestTraceAPI() { + + + UTraceEntry *originalTEntryFunc; + UTraceExit *originalTExitFunc; + UTraceData *originalTDataFunc; + const void *originalTContext; + int32_t originalLevel; + + /* + * Save the original tracing state so that we can restore it after the test. + */ + utrace_getFunctions(&originalTContext, &originalTEntryFunc, &originalTExitFunc, + &originalTDataFunc); + originalLevel = utrace_getLevel(); + + + /* verify that set/get of tracing functions returns what was set. */ + { + UTraceEntry *e; + UTraceExit *x; + UTraceData *d; + const void *context; + const void *newContext = (const char *)originalTContext + 1; + + TEST_ASSERT(originalTEntryFunc != testTraceEntry); + TEST_ASSERT(originalTExitFunc != testTraceExit); + TEST_ASSERT(originalTDataFunc != testTraceData); + + utrace_setFunctions(newContext, testTraceEntry, testTraceExit, testTraceData); + utrace_getFunctions(&context, &e, &x, &d); + TEST_ASSERT(e == testTraceEntry); + TEST_ASSERT(x == testTraceExit); + TEST_ASSERT(d == testTraceData); + TEST_ASSERT(context == newContext); + } + + /* verify that set/get level work as a pair, and that the level + * identifiers all exist. + */ + + { + int32_t level; + + utrace_setLevel(UTRACE_OFF); + level = utrace_getLevel(); + TEST_ASSERT(level==UTRACE_OFF); + utrace_setLevel(UTRACE_VERBOSE); + level = utrace_getLevel(); + TEST_ASSERT(level==UTRACE_VERBOSE); + utrace_setLevel(UTRACE_ERROR); + utrace_setLevel(UTRACE_WARNING); + utrace_setLevel(UTRACE_OPEN_CLOSE); + utrace_setLevel(UTRACE_INFO); + } + + /* + * Open and close a converter with tracing enabled. + * Verify that our tracing callback functions get called. + */ + { + UErrorCode status = U_ZERO_ERROR; + UConverter *cnv; + + gTraceEntryCount = 0; + gTraceExitCount = 0; + gTraceDataCount = 0; + gFnNameError = FALSE; + gFnFormatError = FALSE; + utrace_setLevel(UTRACE_OPEN_CLOSE); + cnv = ucnv_open(NULL, &status); + TEST_ASSERT(U_SUCCESS(status)); + ucnv_close(cnv); +#if U_ENABLE_TRACING + TEST_ASSERT(gTraceEntryCount > 0); + TEST_ASSERT(gTraceExitCount > 0); + TEST_ASSERT(gTraceDataCount > 0); + TEST_ASSERT(gFnNameError == FALSE); + TEST_ASSERT(gFnFormatError == FALSE); +#else + log_info("Tracing has been disabled. Testing of this feature has been skipped.\n"); +#endif + } + + + + /* + * trace data formatter operation. + */ + { + UChar s1[] = {0x41fe, 0x42, 0x43, 00}; + const char *a1[] = {"s1", "s2", "s3"}; + void *ptr; + + test_format("hello, world", 50, 0, "hello, world", __LINE__); + test_format("hello, world", 50, 4, " hello, world", __LINE__); + test_format("hello, world", 3, 0, "hello, world", __LINE__); + + test_format("a character %c", 50, 0, "a character x", __LINE__, 'x'); + test_format("a string %s ", 50, 0, "a string hello ", __LINE__, "hello"); + test_format("uchars %S ", 50, 0, "uchars 41fe 0042 0043 0000 ", __LINE__, s1, -1); + test_format("uchars %S ", 50, 0, "uchars 41fe 0042 ", __LINE__, s1, 2); + + test_format("a byte %b--", 50, 0, "a byte dd--", __LINE__, 0xdd); + test_format("a 16 bit val %h", 50, 0, "a 16 bit val 1234", __LINE__, 0x1234); + test_format("a 32 bit val %d...", 50, 0, "a 32 bit val 6789abcd...", __LINE__, 0x6789abcd); + test_format("a 64 bit val %l", 50, 0, "a 64 bit val 123456780abcdef0" + , __LINE__, INT64_C(0x123456780abcdef0)); + + if (sizeof(void *) == 4) { + ptr = (void *)0xdeadbeef; + test_format("a 32 bit ptr %p", 50, 0, "a 32 bit ptr deadbeef", __LINE__, ptr); + } else if (sizeof(void *) == 8) { + ptr = (void *) INT64_C(0x1000200030004000); + test_format("a 64 bit ptr %p", 50, 0, "a 64 bit ptr 1000200030004000", __LINE__, ptr); + } else if (sizeof(void *) == 16) { + /* iSeries */ + int32_t massiveBigEndianPtr[] = { 0x10002000, 0x30004000, 0x50006000, 0x70008000 }; + ptr = *((void **)massiveBigEndianPtr); + test_format("a 128 bit ptr %p", 50, 0, "a 128 bit ptr 10002000300040005000600070008000", __LINE__, ptr); + } else { + TEST_ASSERT(FALSE); + /* TODO: others? */ + } + + test_format("%vc", 100, 0, "abc[ffffffff]", __LINE__, "abc", -1); + test_format("%vs", 100, 0, "s1\ns2\n[00000002]", __LINE__, a1, 2); + test_format("%vs", 100, 4, " s1\n s2\n [00000002]", __LINE__, a1, 2); + + test_format("%vb", 100, 0, "41 42 43 [00000003]", __LINE__, "\x41\x42\x43", 3); + + /* Null ptrs for strings, vectors */ + test_format("Null string - %s", 50, 0, "Null string - *NULL*", __LINE__, NULL); + test_format("Null string - %S", 50, 0, "Null string - *NULL*", __LINE__, NULL); + test_format("Null vector - %vc", 50, 0, "Null vector - *NULL* [00000002]", __LINE__, NULL, 2); + test_format("Null vector - %vC", 50, 0, "Null vector - *NULL* [00000002]", __LINE__, NULL, 2); + test_format("Null vector - %vd", 50, 0, "Null vector - *NULL* [00000002]", __LINE__, NULL, 2); + + } + + /* + * utrace_format. Only need a minimal test to see that the function works at all. + * Full functionality is tested via utrace_vformat. + */ + { + char buf[100]; + int32_t x; + x = utrace_format(buf, 100, 0, "%s", "Hello, World."); + TEST_ASSERT(strcmp(buf, "Hello, World.") == 0); + TEST_ASSERT(x == 14); + } + + /* + * utrace_functionName. Just spot-check a couple of them. + */ + { + const char *name; + name = utrace_functionName(UTRACE_U_INIT); + TEST_ASSERT(strcmp(name, "u_init") == 0); + name = utrace_functionName(UTRACE_UCNV_OPEN); + TEST_ASSERT(strcmp(name, "ucnv_open") == 0); + name = utrace_functionName(UTRACE_UCOL_GET_SORTKEY); + TEST_ASSERT(strcmp(name, "ucol_getSortKey") == 0); + } + + + + /* Restore the trace function settings to their original values. */ + utrace_setFunctions(originalTContext, originalTEntryFunc, originalTExitFunc, originalTDataFunc); + utrace_setLevel(originalLevel); +} + + + diff --git a/icuSources/test/cintltst/trietest.c b/icuSources/test/cintltst/trietest.c index 3231879a..61c9e62b 100644 --- a/icuSources/test/cintltst/trietest.c +++ b/icuSources/test/cintltst/trietest.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 2001, International Business Machines +* Copyright (C) 2001-2003, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -273,7 +273,9 @@ testTrieRangesWithMalloc(const char *testName, storage = (uint8_t*) uprv_malloc(sizeof(uint8_t)*100000); log_verbose("\ntesting Trie '%s'\n", testName); - newTrie=utrie_open(NULL, NULL, 2000, checkRanges[0].value, latin1Linear); + newTrie=utrie_open(NULL, NULL, 2000, + checkRanges[0].value, checkRanges[0].value, + latin1Linear); /* set values from setRanges[] */ ok=TRUE; @@ -457,7 +459,9 @@ testTrieRanges(const char *testName, UBool overwrite, ok; log_verbose("\ntesting Trie '%s'\n", testName); - newTrie=utrie_open(NULL, NULL, 2000, checkRanges[0].value, latin1Linear); + newTrie=utrie_open(NULL, NULL, 2000, + checkRanges[0].value, checkRanges[0].value, + latin1Linear); /* set values from setRanges[] */ ok=TRUE; @@ -682,11 +686,11 @@ setRanges1[]={ {0x20, 0xa7, 0x1234, FALSE}, {0xa7, 0x3400, 0, FALSE}, {0x3400, 0x9fa6, 0x6162, FALSE}, - {0x9fa6, 0xdada, 0x3132, FALSE}, - {0xdada, 0xeeee, 0x27, FALSE}, + {0x9fa6, 0xda9e, 0x3132, FALSE}, + {0xdada, 0xeeee, 0x87ff, FALSE}, /* try to disrupt _testFoldingOffset16() */ {0xeeee, 0x11111, 1, FALSE}, {0x11111, 0x44444, 0x6162, FALSE}, - {0x44444, 0xf0003, 0, FALSE}, + {0x44444, 0x60003, 0, FALSE}, {0xf0003, 0xf0004, 0xf, FALSE}, {0xf0004, 0xf0006, 0x10, FALSE}, {0xf0006, 0xf0007, 0x11, FALSE}, @@ -701,8 +705,9 @@ checkRanges1[]={ {0xa7, 0x1234}, {0x3400, 0}, {0x9fa6, 0x6162}, - {0xdada, 0x3132}, - {0xeeee, 0x27}, + {0xda9e, 0x3132}, + {0xdada, 0}, + {0xeeee, 0x87ff}, {0x11111,1}, {0x44444,0x6162}, {0xf0003,0}, @@ -782,7 +787,7 @@ addTrieTest(TestNode** root); void addTrieTest(TestNode** root) { - addTest(root, &TrieTest, "tsutil/TrieTest"); + addTest(root, &TrieTest, "tsutil/trietest/TrieTest"); } #else /* standalone utrie development */ diff --git a/icuSources/test/cintltst/ucmptst.c b/icuSources/test/cintltst/ucmptst.c index bc13babb..98c1998d 100644 --- a/icuSources/test/cintltst/ucmptst.c +++ b/icuSources/test/cintltst/ucmptst.c @@ -1,7 +1,7 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1998-2001, International Business Machines Corporation and - * others. All Rights Reserved. + * Copyright (c) 1998-2004, International Business Machines Corporation + * and others. All Rights Reserved. ********************************************************************/ /* * File test.c @@ -15,7 +15,6 @@ #include "unicode/utypes.h" #include "ucmp8.h" -#include "umemstrm.h" #include "cmemory.h" #include "cintltst.h" #include "ucol_imp.h" @@ -134,27 +133,25 @@ static void TestUCMP8API(){ log_verbose("Testing ucmp8_flattenMem()\n"); { int32_t len = 0; - const uint8_t *buff = NULL; - UMemoryStream *MS = uprv_mstrm_openNew(65536); - int32_t size = ucmp8_flattenMem(&ucmp8Array1, MS); + int32_t size = ucmp8_flattenMem(&ucmp8Array1, NULL); + uint8_t *buff = malloc(size); + uint8_t *buffLocation = buff; + len = ucmp8_flattenMem(&ucmp8Array1, buff); - /* try after compacting */ - buff = uprv_mstrm_getBuffer(MS, &len); - - if(size == 0 || len == 0 || buff == NULL) { + if(size != len || size == 0 || len == 0 || buff == NULL) { log_err("Unable to flatten!\n"); } else { log_verbose("Testing ucmp8_initFromData()\n"); - ucmp8_initFromData(&ucmp8Clone, &buff, &status); - if(U_FAILURE(status) || ucmp8_isBogus(&ucmp8Clone) == TRUE){ + ucmp8_initFromData(&ucmp8Clone, (const uint8_t **)&buffLocation, &status); + if(U_FAILURE(status) || ucmp8_isBogus(&ucmp8Clone) == TRUE || (buffLocation-buff) != len){ log_err("ERROR: ucmp8_initFromData() failed\n"); status = U_ZERO_ERROR; } else { - query(&ucmp8Clone); - ucmp8_close(&ucmp8Clone); + query(&ucmp8Clone); + ucmp8_close(&ucmp8Clone); } } - uprv_mstrm_close(MS); + free(buff); } /* diff --git a/icuSources/test/cintltst/udatatst.c b/icuSources/test/cintltst/udatatst.c index d1614bb1..674348ca 100644 --- a/icuSources/test/cintltst/udatatst.c +++ b/icuSources/test/cintltst/udatatst.c @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1998-2003, International Business Machines Corporation and + * Copyright (c) 1998-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /* @@ -14,6 +14,7 @@ */ #include "unicode/utypes.h" +#include "unicode/putil.h" #include "unicode/udata.h" #include "unicode/uchar.h" #include "unicode/ucnv.h" @@ -22,6 +23,7 @@ #include "cmemory.h" #include "cstring.h" #include "filestrm.h" +#include "udatamem.h" #include "cintltst.h" #include @@ -36,6 +38,25 @@ #include #endif +/* includes for TestSwapData() */ +#include "udataswp.h" + +/* swapping implementations in common */ +#include "uresdata.h" +#include "ucnv_io.h" +#include "uprops.h" +#include "ucase.h" +#include "ucol_swp.h" +#include "ucnv_bld.h" +#include "unormimp.h" +#include "sprpimpl.h" +#include "propname.h" +#include "rbbidata.h" + +/* other definitions and prototypes */ + +#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) + static void TestUDataOpen(void); static void TestUDataOpenChoiceDemo1(void); static void TestUDataOpenChoiceDemo2(void); @@ -45,6 +66,7 @@ static void TestUDataSetAppData(void); static void TestErrorConditions(void); static void TestAppData(void); static void TestICUDataName(void); +static void TestSwapData(void); void addUDataTest(TestNode** root); @@ -60,7 +82,7 @@ addUDataTest(TestNode** root) addTest(root, &TestErrorConditions, "udatatst/TestErrorConditions"); addTest(root, &TestAppData, "udatatst/TestAppData" ); addTest(root, &TestICUDataName, "udatatst/TestICUDataName" ); - + addTest(root, &TestSwapData, "udatatst/TestSwapData" ); } #if 0 @@ -80,14 +102,17 @@ static void TestUDataOpen(){ UDataMemory *result; UErrorCode status=U_ZERO_ERROR; const char* memMap[][2]={ - {"tz", "icu"}, + {"root", "res"}, + {"unorm", "icu"}, {"cnvalias", "icu"}, {"unames", "icu"}, {"ibm-37_P100-1995", "cnv"} }; - const char* name = "test"; - const char* type = "icu"; - const char dirSepString[] = {U_FILE_SEP_CHAR, 0}; + const char* name = "test"; + const char* type = "icu"; + const char dirSepString[] = {U_FILE_SEP_CHAR, 0}; + const char pathSepString[] = {U_PATH_SEP_CHAR, 0}; + char* path=(char*)malloc(sizeof(char) * (strlen(ctest_dataOutDir()) + strlen(U_ICUDATA_NAME) @@ -125,11 +150,11 @@ static void TestUDataOpen(){ int i; log_verbose("Testing udata_open() on %s\n", icuDataFilePath); for(i=0; i!isBig+same charset) failed - %s\n", + name, u_errorName(errorCode)); + return; + } + + inEndian=ds->inIsBigEndian; + inCharset=ds->inCharset; + + oppositeEndian=!inEndian; + oppositeCharset= inCharset==U_ASCII_FAMILY ? U_EBCDIC_FAMILY : U_ASCII_FAMILY; + + /* make this test work with data files that are built for a different platform */ + if(inEndian!=U_IS_BIG_ENDIAN || inCharset!=U_CHARSET_FAMILY) { + udata_closeSwapper(ds); + ds=udata_openSwapper(inEndian, inCharset, oppositeEndian, inCharset, &errorCode); + if(U_FAILURE(errorCode)) { + log_err("udata_openSwapper(%s->!isBig+same charset) failed - %s\n", + name, u_errorName(errorCode)); + return; + } + } + + ds->printError=printError; + + /* preflight the length */ + length=swapFn(ds, inHeader, -1, NULL, &errorCode); + if(U_FAILURE(errorCode)) { + log_err("swapFn(preflight %s->!isBig+same charset) failed - %s\n", + name, u_errorName(errorCode)); + udata_closeSwapper(ds); + return; + } + + /* compare the preflighted length against the data length */ + if(dataLength>=0 && (length+15)<(headerLength+dataLength)) { + log_err("swapFn(preflight %s->!isBig+same charset) length too small: %d < data length %d\n", + name, length, (headerLength+dataLength)); + udata_closeSwapper(ds); + return; + } + + /* swap, not in-place */ + length2=swapFn(ds, inHeader, length, buffer, &errorCode); + udata_closeSwapper(ds); + if(U_FAILURE(errorCode)) { + log_err("swapFn(%s->!isBig+same charset) failed - %s\n", + name, u_errorName(errorCode)); + return; + } + + /* compare the swap length against the preflighted length */ + if(length2!=length) { + log_err("swapFn(%s->!isBig+same charset) length differs from preflighting: %d != preflighted %d\n", + name, length2, length); + return; + } + + /* next swap to opposite charset family */ + ds=udata_openSwapper(oppositeEndian, inCharset, + oppositeEndian, oppositeCharset, + &errorCode); + if(U_FAILURE(errorCode)) { + log_err("udata_openSwapper(%s->!isBig+other charset) failed - %s\n", + name, u_errorName(errorCode)); + return; + } + ds->printError=printError; + + /* swap in-place */ + length2=swapFn(ds, buffer, length, buffer, &errorCode); + udata_closeSwapper(ds); + if(U_FAILURE(errorCode)) { + log_err("swapFn(%s->!isBig+other charset) failed - %s\n", + name, u_errorName(errorCode)); + return; + } + + /* compare the swap length against the original length */ + if(length2!=length) { + log_err("swapFn(%s->!isBig+other charset) length differs from original: %d != original %d\n", + name, length2, length); + return; + } + + /* finally swap to original platform values */ + ds=udata_openSwapper(oppositeEndian, oppositeCharset, + inEndian, inCharset, + &errorCode); + if(U_FAILURE(errorCode)) { + log_err("udata_openSwapper(%s->back to original) failed - %s\n", + name, u_errorName(errorCode)); + return; + } + ds->printError=printError; + + /* swap, not in-place */ + length2=swapFn(ds, buffer, length, buffer2, &errorCode); + udata_closeSwapper(ds); + if(U_FAILURE(errorCode)) { + log_err("swapFn(%s->back to original) failed - %s\n", + name, u_errorName(errorCode)); + return; + } + + /* compare the swap length against the original length */ + if(length2!=length) { + log_err("swapFn(%s->back to original) length differs from original: %d != original %d\n", + name, length2, length); + return; + } + + /* compare the final contents with the original */ + if(0!=uprv_memcmp(inHeader, buffer2, length)) { + const uint8_t *original; + uint8_t diff[8]; + int32_t i, j; + + log_err("swapFn(%s->back to original) contents differs from original\n", + name); + + /* find the first difference */ + original=(const uint8_t *)inHeader; + for(i=0; ilength) { + length2=length; + } + + /* print the original bytes */ + uprv_memset(diff, 0, sizeof(diff)); + for(j=i; jcurrChar = (cont->array)[cont->currIndex]; - *resultLength = uprv_strlen(cont->currChar); + *resultLength = (int32_t)strlen(cont->currChar); u_charsToUChars(cont->currChar, cont->currUChar, *resultLength); cont->currIndex++; return cont->currUChar; @@ -84,7 +84,7 @@ chArrayNext(UEnumeration *en, int32_t *resultLength, UErrorCode *status) { } cont->currChar = (cont->array)[cont->currIndex]; - *resultLength = uprv_strlen(cont->currChar); + *resultLength = (int32_t)strlen(cont->currChar); cont->currIndex++; return cont->currChar; } diff --git a/icuSources/test/cintltst/usettest.c b/icuSources/test/cintltst/usettest.c index 03302df2..7d6d2146 100644 --- a/icuSources/test/cintltst/usettest.c +++ b/icuSources/test/cintltst/usettest.c @@ -1,10 +1,8 @@ /* ********************************************************************** -* Copyright (c) 2002-2003, International Business Machines +* Copyright (c) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** -* $Source: /cvs/root/ICU/icuSources/test/cintltst/usettest.c,v $ -********************************************************************** */ #include "unicode/uset.h" #include "unicode/ustring.h" @@ -19,6 +17,7 @@ static void TestAPI(void); static void Testj2269(void); static void TestSerialized(void); +static void TestNonInvariantPattern(void); void addUSetTest(TestNode** root); @@ -38,6 +37,7 @@ addUSetTest(TestNode** root) { TEST(TestAPI); TEST(Testj2269); TEST(TestSerialized); + TEST(TestNonInvariantPattern); } /*------------------------------------------------------------------ @@ -57,6 +57,12 @@ static void Testj2269() { static const UChar PAT[] = {91,97,45,99,123,97,98,125,93,0}; /* "[a-c{ab}]" */ static const int32_t PAT_LEN = (sizeof(PAT) / sizeof(PAT[0])) - 1; +static const UChar PAT_lb[] = {0x6C, 0x62, 0}; /* "lb" */ +static const int32_t PAT_lb_LEN = (sizeof(PAT_lb) / sizeof(PAT_lb[0])) - 1; + +static const UChar VAL_SP[] = {0x53, 0x50, 0}; /* "SP" */ +static const int32_t VAL_SP_LEN = (sizeof(VAL_SP) / sizeof(VAL_SP[0])) - 1; + static const UChar STR_bc[] = {98,99,0}; /* "bc" */ static const int32_t STR_bc_LEN = (sizeof(STR_bc) / sizeof(STR_bc[0])) - 1; @@ -68,6 +74,7 @@ static const int32_t STR_ab_LEN = (sizeof(STR_ab) / sizeof(STR_ab[0])) - 1; */ static void TestAPI() { USet* set; + USet* set2; UErrorCode ec; /* [] */ @@ -88,6 +95,9 @@ static void TestAPI() { log_data_err("uset_openPattern([a-c{ab}]) failed - %s\n", u_errorName(ec)); return; } + if(!uset_resemblesPattern(PAT, PAT_LEN, 0)) { + log_data_err("uset_resemblesPattern of PAT failed\n"); + } expect(set, "abc{ab}", "def{bc}", &ec); /* [a-d{ab}] */ @@ -116,7 +126,64 @@ static void TestAPI() { uset_removeRange(set, 0x0050, 0x0063); expect(set, "de{bc}", "bcfg{ab}", NULL); + /* [g-l] */ + uset_set(set, 0x0067, 0x006C); + expect(set, "ghijkl", "de{bc}", NULL); + + if (uset_indexOf(set, 0x0067) != 0) { + log_data_err("uset_indexOf failed finding correct index of 'g'\n"); + } + + if (uset_charAt(set, 0) != 0x0067) { + log_data_err("uset_charAt failed finding correct char 'g' at index 0\n"); + } + + /* How to test this one...? */ + uset_compact(set); + + /* [g-i] */ + uset_retain(set, 0x0067, 0x0069); + expect(set, "ghi", "dejkl{bc}", NULL); + + /* UCHAR_ASCII_HEX_DIGIT */ + uset_applyIntPropertyValue(set, UCHAR_ASCII_HEX_DIGIT, 1, &ec); + if(U_FAILURE(ec)) { + log_data_err("uset_applyIntPropertyValue([UCHAR_ASCII_HEX_DIGIT]) failed - %s\n", u_errorName(ec)); + return; + } + expect(set, "0123456789ABCDEFabcdef", "GHIjkl{bc}", NULL); + + /* [] */ + set2 = uset_open(1, 1); + uset_clear(set2); + + /* space */ + uset_applyPropertyAlias(set2, PAT_lb, PAT_lb_LEN, VAL_SP, VAL_SP_LEN, &ec); + expect(set2, " ", "abcdefghi{bc}", NULL); + + /* [a-c] */ + uset_set(set2, 0x0061, 0x0063); + /* [g-i] */ + uset_set(set, 0x0067, 0x0069); + + /* [a-c g-i] */ + uset_complementAll(set, set2); + expect(set, "abcghi", "def{bc}", NULL); + + /* [g-i] */ + uset_removeAll(set, set2); + expect(set, "ghi", "abcdef{bc}", NULL); + + /* [a-c g-i] */ + uset_addAll(set2, set); + expect(set2, "abcghi", "def{bc}", NULL); + + /* [g-i] */ + uset_retainAll(set2, set); + expect(set2, "ghi", "abcdef{bc}", NULL); + uset_close(set); + uset_close(set2); } /*------------------------------------------------------------------ @@ -159,14 +226,18 @@ static void expectContainment(const USet* set, const char* list, UBool isIn) { const char* p = list; - UChar ustr[128]; - char pat[128]; + UChar ustr[4096]; + char *pat; UErrorCode ec; - int32_t rangeStart = -1, rangeEnd = -1; + int32_t rangeStart = -1, rangeEnd = -1, length; ec = U_ZERO_ERROR; - uset_toPattern(set, ustr, sizeof(ustr), TRUE, &ec); - u_UCharsToChars(ustr, pat, u_strlen(ustr)+1); + length = uset_toPattern(set, ustr, sizeof(ustr), TRUE, &ec); + if(U_FAILURE(ec)) { + log_err("FAIL: uset_toPattern() fails in expectContainment() - %s\n", u_errorName(ec)); + return; + } + pat=aescstrdup(ustr, length); while (*p) { if (*p=='{') { @@ -174,8 +245,9 @@ static void expectContainment(const USet* set, int32_t stringLength = 0; char strCopy[64]; - while (*p++ != '}') {} - stringLength = p - stringStart - 1; + while (*p++ != '}') { + } + stringLength = (int32_t)(p - stringStart - 1); strncpy(strCopy, stringStart, stringLength); strCopy[stringLength] = 0; @@ -243,7 +315,7 @@ static void expectContainment(const USet* set, } } -/* This only works for BMP chars */ +/* This only works for invariant BMP chars */ static char oneUCharToChar(UChar32 c) { UChar ubuf[1]; char buf[1]; @@ -255,22 +327,23 @@ static char oneUCharToChar(UChar32 c) { static void expectItems(const USet* set, const char* items) { const char* p = items; - UChar ustr[128], itemStr[128]; - char pat[128], buf[128]; + UChar ustr[4096], itemStr[4096]; + char buf[4096]; + char *pat; UErrorCode ec; int32_t expectedSize = 0; int32_t itemCount = uset_getItemCount(set); int32_t itemIndex = 0; UChar32 start = 1, end = 0; - int32_t itemLen = 0; + int32_t itemLen = 0, length; ec = U_ZERO_ERROR; - uset_toPattern(set, ustr, sizeof(ustr), TRUE, &ec); + length = uset_toPattern(set, ustr, sizeof(ustr), TRUE, &ec); if (U_FAILURE(ec)) { log_err("FAIL: uset_toPattern => %s\n", u_errorName(ec)); return; } - u_UCharsToChars(ustr, pat, u_strlen(ustr)+1); + pat=aescstrdup(ustr, length); if (uset_isEmpty(set) != (strlen(items)==0)) { log_err("FAIL: %s should return %s from isEmpty\n", @@ -279,7 +352,7 @@ static void expectItems(const USet* set, } /* Don't test patterns starting with "[^" */ - if (strlen(pat) > 2 && pat[1] == '^') { + if (u_strlen(ustr) > 2 && ustr[1] == 0x5e /*'^'*/) { return; } @@ -319,8 +392,9 @@ static void expectItems(const USet* set, int32_t stringLength = 0; char strCopy[64]; - while (*p++ != '}') {} - stringLength = p - stringStart - 1; + while (*p++ != '}') { + } + stringLength = (int32_t)(p - stringStart - 1); strncpy(strCopy, stringStart, stringLength); strCopy[stringLength] = 0; @@ -408,4 +482,24 @@ TestSerialized() { uset_close(set); } +/** + * Make sure that when non-invariant chars are passed to uset_openPattern + * they do not cause an ugly failure mode (e.g. assertion failure). + * JB#3795. + */ +static void +TestNonInvariantPattern() { + UErrorCode ec = U_ZERO_ERROR; + /* The critical part of this test is that the following pattern + must contain a non-invariant character. */ + static const char *pattern = "[:ccc!=0:]"; + UChar buf[256]; + int32_t len = u_unescape(pattern, buf, 256); + /* This test 'fails' by having an assertion failure within the + following call. It passes by running to completion with no + assertion failure. */ + USet *set = uset_openPattern(buf, len, &ec); + uset_close(set); +} + /*eof*/ diff --git a/icuSources/test/cintltst/usrchdat.c b/icuSources/test/cintltst/usrchdat.c index 478aa6c7..3ebbbe63 100644 --- a/icuSources/test/cintltst/usrchdat.c +++ b/icuSources/test/cintltst/usrchdat.c @@ -206,6 +206,16 @@ static const SearchData SUPPLEMENTARY[] = { {"abc \\uD800\\uDC00 \\uD800\\uDC01 \\uD801\\uDC00 \\uD800\\uDC00abc abc\\uD800\\uDC00 \\uD800\\uD800\\uDC00 \\uD800\\uDC00\\uDC00", "\\uD800\\uDC00", NULL, UCOL_TERTIARY, NULL, {4, 13, 22, 26, 29, -1}, {2, 2, 2, 2, 2}}, + {"and\\uD834\\uDDB9this sentence", "\\uD834\\uDDB9", NULL, + UCOL_TERTIARY, NULL, {3, -1}, {2}}, + {"and \\uD834\\uDDB9 this sentence", " \\uD834\\uDDB9 ", NULL, + UCOL_TERTIARY, NULL, {3, -1}, {4}}, + {"and-\\uD834\\uDDB9-this sentence", "-\\uD834\\uDDB9-", NULL, + UCOL_TERTIARY, NULL, {3, -1}, {4}}, + {"and,\\uD834\\uDDB9,this sentence", ",\\uD834\\uDDB9,", NULL, + UCOL_TERTIARY, NULL, {3, -1}, {4}}, + {"and?\\uD834\\uDDB9?this sentence", "?\\uD834\\uDDB9?", NULL, + UCOL_TERTIARY, NULL, {3, -1}, {4}}, {NULL, NULL, NULL, UCOL_TERTIARY, NULL, {-1}, {0}} }; @@ -271,6 +281,8 @@ static const SearchData BASICCANONICAL[] = { NULL, {0, -1}, {5}}, {"a\\u0300\\u0325b\\u0300\\u0325c \\u0325b\\u0300 \\u0300b\\u0325", "\\u0300b\\u0325", NULL, UCOL_TERTIARY, NULL, {1, 12, -1}, {5, 3}}, + {"\\u00c4\\u0323", "A\\u0323\\u0308", NULL, UCOL_TERTIARY, NULL, {0, -1}, {2}}, + {"\\u0308\\u0323", "\\u0323\\u0308", NULL, UCOL_TERTIARY, NULL, {0, -1}, {2}}, {NULL, NULL, NULL, UCOL_TERTIARY, NULL, {-1}, {0}} }; @@ -428,6 +440,16 @@ static const SearchData SUPPLEMENTARYCANONICAL[] = { {"abc \\uD800\\uDC00 \\uD800\\uDC01 \\uD801\\uDC00 \\uD800\\uDC00abc abc\\uD800\\uDC00 \\uD800\\uD800\\uDC00 \\uD800\\uDC00\\uDC00", "\\uD800\\uDC00", NULL, UCOL_TERTIARY, NULL, {4, 13, 22, 26, 29, -1}, {2, 2, 2, 2, 2}}, + {"and\\uD834\\uDDB9this sentence", "\\uD834\\uDDB9", NULL, + UCOL_TERTIARY, NULL, {3, -1}, {2}}, + {"and \\uD834\\uDDB9 this sentence", " \\uD834\\uDDB9 ", NULL, + UCOL_TERTIARY, NULL, {3, -1}, {4}}, + {"and-\\uD834\\uDDB9-this sentence", "-\\uD834\\uDDB9-", NULL, + UCOL_TERTIARY, NULL, {3, -1}, {4}}, + {"and,\\uD834\\uDDB9,this sentence", ",\\uD834\\uDDB9,", NULL, + UCOL_TERTIARY, NULL, {3, -1}, {4}}, + {"and?\\uD834\\uDDB9?this sentence", "?\\uD834\\uDDB9?", NULL, + UCOL_TERTIARY, NULL, {3, -1}, {4}}, {NULL, NULL, NULL, UCOL_TERTIARY, NULL, {-1}, {0}} }; diff --git a/icuSources/test/cintltst/usrchtst.c b/icuSources/test/cintltst/usrchtst.c index f02d6cc3..a5f8127c 100644 --- a/icuSources/test/cintltst/usrchtst.c +++ b/icuSources/test/cintltst/usrchtst.c @@ -1,5 +1,5 @@ /******************************************************************** - * Copyright (c) 2001-2003 International Business Machines + * Copyright (c) 2001-2004 International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************** * File usrchtst.c @@ -141,20 +141,8 @@ static char *toCharString(const UChar* unichars) *temp ++ = (char)ch; } else { - char digit[5]; - int zerosize; - *temp = 0; - strcat(temp, "\\u"); - temp = temp + 2; - sprintf(digit, "%x", ch); - zerosize = 4 - strlen(digit); - while (zerosize != 0) { - *temp ++ = '0'; - zerosize --; - } - *temp = 0; - strcat(temp, digit); - temp = temp + strlen(digit); + sprintf(temp, "\\u%04x", ch); + temp += 6; /* \uxxxx */ } } *temp = 0; @@ -2081,10 +2069,10 @@ static void TestContractionCanonical(void) UChar rules[128]; UChar pattern[128]; UChar text[128]; - UCollator *collator; + UCollator *collator = NULL; UErrorCode status = U_ZERO_ERROR; int count = 0; - UStringSearch *strsrch; + UStringSearch *strsrch = NULL; memset(rules, 0, 128*sizeof(UChar)); memset(pattern, 0, 128*sizeof(UChar)); memset(text, 0, 128*sizeof(UChar)); @@ -2122,6 +2110,37 @@ static void TestContractionCanonical(void) ucol_close(collator); } +static void TestNumeric(void) { + UCollator *coll = NULL; + UStringSearch *strsrch = NULL; + UErrorCode status = U_ZERO_ERROR; + + UChar pattern[128]; + UChar text[128]; + memset(pattern, 0, 128*sizeof(UChar)); + memset(text, 0, 128*sizeof(UChar)); + + coll = ucol_open("", &status); + if(U_FAILURE(status)) { + log_data_err("Could not open UCA. Is your data around?\n"); + return; + } + + ucol_setAttribute(coll, UCOL_NUMERIC_COLLATION, UCOL_ON, &status); + + strsrch = usearch_openFromCollator(pattern, 1, text, 1, coll, NULL, &status); + + if(status != U_UNSUPPORTED_ERROR || U_SUCCESS(status)) { + log_err("Expected U_UNSUPPORTED_ERROR when trying to instantiate a search object from a CODAN collator, got %s instead\n", u_errorName(status)); + if(strsrch) { + usearch_close(strsrch); + } + } + + ucol_close(coll); + +} + void addSearchTest(TestNode** root) { addTest(root, &TestStart, "tscoll/usrchtst/TestStart"); @@ -2171,6 +2190,7 @@ void addSearchTest(TestNode** root) addTest(root, &TestContractionCanonical, "tscoll/usrchtst/TestContractionCanonical"); addTest(root, &TestEnd, "tscoll/usrchtst/TestEnd"); + addTest(root, &TestNumeric, "tscoll/usrchtst/TestNumeric"); } #endif /* #if !UCONFIG_NO_COLLATION */ diff --git a/icuSources/test/cintltst/utmstest.c b/icuSources/test/cintltst/utmstest.c new file mode 100644 index 00000000..f68b5bdd --- /dev/null +++ b/icuSources/test/cintltst/utmstest.c @@ -0,0 +1,342 @@ +/* + **************************************************************************** + * Copyright (c) 1997-2004, International Business Machines Corporation and * + * others. All Rights Reserved. * + **************************************************************************** + */ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/utmscale.h" + +#include "cintltst.h" + +#include +#include + +#define LOOP_COUNT 10000 + +static void TestAPI(void); +static void TestData(void); +static void TestMonkey(void); + +void addUtmsTest(TestNode** root); + +void addUtmsTest(TestNode** root) +{ + addTest(root, &TestAPI, "tsformat/utmstest/TestAPI"); + addTest(root, &TestData, "tsformat/utmstest/TestData"); + addTest(root, &TestMonkey, "tsformat/utmstest/TestMonkey"); +} + +/** + * Return a random int64_t where U_INT64_MIN <= ran <= U_INT64_MAX. + */ +static uint64_t randomInt64(void) +{ + int64_t ran = 0; + int32_t i; + static UBool initialized = FALSE; + + if (!initialized) { + srand((unsigned)time(NULL)); + initialized = TRUE; + } + + /* Assume rand has at least 12 bits of precision */ + for (i = 0; i < sizeof(ran); i += 1) { + ((char*)&ran)[i] = (char)((rand() & 0x0FF0) >> 4); + } + + return ran; +} + +static int64_t ranInt; +static int64_t ranMin; +static int64_t ranMax; + +static void initRandom(int64_t min, int64_t max) +{ + uint64_t interval = max - min; + + ranMin = min; + ranMax = max; + ranInt = 0; + + if (interval < U_INT64_MIN) { + ranInt = interval; + } +} + +static int64_t randomInRange(void) +{ + int64_t value; + + if (ranInt != 0) { + value = randomInt64() % ranInt; + + if (value < 0) { + value = -value; + } + + value += ranMin; + } else { + do { + value = randomInt64(); + } while (value < ranMin || value > ranMax); + } + + return value; +} + +static void roundTripTest(int64_t value, int32_t scale) +{ + UErrorCode status = U_ZERO_ERROR; + int64_t rt = utmscale_toInt64(utmscale_fromInt64(value, scale, &status), scale, &status); + + if (rt != value) { + log_err("Round-trip error: time scale = %d, value = %lld, round-trip = %lld.\n", scale, value, rt); + } +} + +static void toLimitTest(int64_t toLimit, int64_t fromLimit, int32_t scale) +{ + UErrorCode status = U_ZERO_ERROR; + int64_t result = utmscale_toInt64(toLimit, scale, &status); + + if (result != fromLimit) { + log_err("toLimit failure: scale = %d, toLimit = %lld , utmscale_toInt64(toLimit, scale, &status) = %lld, fromLimit = %lld.\n", + scale, toLimit, result, fromLimit); + } +} + +static void epochOffsetTest(int64_t epochOffset, int64_t units, int32_t scale) +{ + UErrorCode status = U_ZERO_ERROR; + int64_t universal = 0; + int64_t universalEpoch = epochOffset * units; + int64_t local = utmscale_toInt64(universalEpoch, scale, &status); + + if (local != 0) { + log_err("utmscale_toInt64(epochOffset, scale, &status): scale = %d epochOffset = %lld, result = %lld.\n", scale, epochOffset, local); + } + + local = utmscale_toInt64(0, scale, &status); + + if (local != -epochOffset) { + log_err("utmscale_toInt64(0, scale): scale = %d, result = %lld.\n", scale, local); + } + + universal = utmscale_fromInt64(-epochOffset, scale, &status); + + if (universal != 0) { + log_err("from(-epochOffest, scale): scale = %d, epochOffset = %lld, result = %lld.\n", scale, epochOffset, universal); + } + + universal = utmscale_fromInt64(0, scale, &status); + + if (universal != universalEpoch) { + log_err("utmscale_fromInt64(0, scale): scale = %d, result = %lld.\n", scale, universal); + } +} + +static void TestEpochOffsets(void) +{ + UErrorCode status = U_ZERO_ERROR; + int32_t scale; + + for (scale = 0; scale < UDTS_MAX_SCALE; scale += 1) { + int64_t units = utmscale_getTimeScaleValue(scale, UTSV_UNITS_VALUE, &status); + int64_t epochOffset = utmscale_getTimeScaleValue(scale, UTSV_EPOCH_OFFSET_VALUE, &status); + + epochOffsetTest(epochOffset, units, scale); + } +} + +static void TestFromLimits(void) +{ + UErrorCode status = U_ZERO_ERROR; + int32_t scale; + + for (scale = 0; scale < UDTS_MAX_SCALE; scale += 1) { + int64_t fromMin = utmscale_getTimeScaleValue(scale, UTSV_FROM_MIN_VALUE, &status); + int64_t fromMax = utmscale_getTimeScaleValue(scale, UTSV_FROM_MAX_VALUE, &status); + + roundTripTest(fromMin, scale); + roundTripTest(fromMax, scale); + } +} + +static void TestToLimits(void) +{ + UErrorCode status = U_ZERO_ERROR; + int32_t scale; + + for (scale = 0; scale < UDTS_MAX_SCALE; scale += 1) { + int64_t fromMin = utmscale_getTimeScaleValue(scale, UTSV_FROM_MIN_VALUE, &status); + int64_t fromMax = utmscale_getTimeScaleValue(scale, UTSV_FROM_MAX_VALUE, &status); + int64_t toMin = utmscale_getTimeScaleValue(scale, UTSV_TO_MIN_VALUE, &status); + int64_t toMax = utmscale_getTimeScaleValue(scale, UTSV_TO_MAX_VALUE, &status); + + toLimitTest(toMin, fromMin, scale); + toLimitTest(toMax, fromMax, scale); + } +} + +static void TestFromInt64(void) +{ + int32_t scale; + int64_t result; + UErrorCode status = U_ZERO_ERROR; + + result = utmscale_fromInt64(0, -1, &status); + if (status != U_ILLEGAL_ARGUMENT_ERROR) { + log_err("utmscale_fromInt64(0, -1, status) did not set status to U_ILLEGAL_ARGUMENT_ERROR.\n"); + } + + for (scale = 0; scale < UDTS_MAX_SCALE; scale += 1) { + int64_t fromMin, fromMax; + + status = U_ZERO_ERROR; + fromMin = utmscale_getTimeScaleValue(scale, UTSV_FROM_MIN_VALUE, &status); + fromMax = utmscale_getTimeScaleValue(scale, UTSV_FROM_MAX_VALUE, &status); + + status = U_ZERO_ERROR; + result = utmscale_fromInt64(0, scale, &status); + if (status == U_ILLEGAL_ARGUMENT_ERROR) { + log_err("utmscale_fromInt64(0, %d, &status) generated U_ILLEGAL_ARGUMENT_ERROR.\n", scale); + } + + status = U_ZERO_ERROR; + result = utmscale_fromInt64(fromMin, scale, &status); + if (status == U_ILLEGAL_ARGUMENT_ERROR) { + log_err("utmscale_fromInt64(fromMin, %d, &status) generated U_ILLEGAL_ARGUMENT_ERROR.\n", scale); + } + + if (fromMin > U_INT64_MIN) { + status = U_ZERO_ERROR; + result = utmscale_fromInt64(fromMin - 1, scale, &status); + if (status != U_ILLEGAL_ARGUMENT_ERROR) { + log_err("utmscale_fromInt64(fromMin - 1, %d, &status) did not generate U_ILLEGAL_ARGUMENT_ERROR.\n", scale); + } + } + + status = U_ZERO_ERROR; + result = utmscale_fromInt64(fromMax, scale, &status); + if (status == U_ILLEGAL_ARGUMENT_ERROR) { + log_err("utmscale_fromInt64(fromMax, %d, &status) generated U_ILLEGAL_ARGUMENT_ERROR.\n", scale); + } + + if (fromMax < U_INT64_MAX) { + status = U_ZERO_ERROR; + result = utmscale_fromInt64(fromMax + 1, scale, &status); + if (status != U_ILLEGAL_ARGUMENT_ERROR) { + log_err("utmscale_fromInt64(fromMax + 1, %d, &status) didn't generate U_ILLEGAL_ARGUMENT_ERROR.\n", scale); + } + } + } + + status = U_ZERO_ERROR; + result = utmscale_fromInt64(0, UDTS_MAX_SCALE, &status); + if (status != U_ILLEGAL_ARGUMENT_ERROR) { + log_err("utmscale_fromInt64(0, UDTS_MAX_SCALE, &status) did not generate U_ILLEGAL_ARGUMENT_ERROR.\n"); + } +} + +static void TestToInt64(void) +{ + int32_t scale; + int64_t result; + UErrorCode status = U_ZERO_ERROR; + + result = utmscale_toInt64(0, -1, &status); + if (status != U_ILLEGAL_ARGUMENT_ERROR) { + log_err("utmscale_toInt64(0, -1, &status) did not generate U_ILLEGAL_ARGUMENT_ERROR.\n"); + } + + for (scale = 0; scale < UDTS_MAX_SCALE; scale += 1) { + int64_t toMin, toMax; + + status = U_ZERO_ERROR; + toMin = utmscale_getTimeScaleValue(scale, UTSV_TO_MIN_VALUE, &status); + toMax = utmscale_getTimeScaleValue(scale, UTSV_TO_MAX_VALUE, &status); + + status = U_ZERO_ERROR; + result = utmscale_toInt64(0, scale, &status); + if (status == U_ILLEGAL_ARGUMENT_ERROR) { + log_err("utmscale_toInt64(0, %d, &status) generated U_ILLEGAL_ARGUMENT_ERROR.\n", scale); + } + + status = U_ZERO_ERROR; + result = utmscale_toInt64(toMin, scale, &status); + if (status == U_ILLEGAL_ARGUMENT_ERROR) { + log_err("utmscale_toInt64(toMin, %d, &status) generated U_ILLEGAL_ARGUMENT_ERROR.\n", scale); + } + + if (toMin > U_INT64_MIN) { + status = U_ZERO_ERROR; + result = utmscale_toInt64(toMin - 1, scale, &status); + if (status != U_ILLEGAL_ARGUMENT_ERROR) { + log_err("utmscale_toInt64(toMin - 1, %d, &status) did not generate U_ILLEGAL_ARGUMENT_ERROR.\n", scale); + } + } + + + status = U_ZERO_ERROR; + result = utmscale_toInt64(toMax, scale, &status); + if (status == U_ILLEGAL_ARGUMENT_ERROR) { + log_err("utmscale_toInt64(toMax, %d, &status) generated U_ILLEGAL_ARGUMENT_ERROR.\n", scale); + } + + if (toMax < U_INT64_MAX) { + status = U_ZERO_ERROR; + result = utmscale_toInt64(toMax + 1, scale, &status); + if (status != U_ILLEGAL_ARGUMENT_ERROR) { + log_err("utmscale_toInt64(toMax + 1, %d, &status) did not generate U_ILLEGAL_ARGUMENT_ERROR.\n", scale); + } + } + } + + status = U_ZERO_ERROR; + result = utmscale_toInt64(0, UDTS_MAX_SCALE, &status); + if (status != U_ILLEGAL_ARGUMENT_ERROR) { + log_err("utmscale_toInt64(0, UDTS_MAX_SCALE, &status) did not generate U_ILLEGAL_ARGUMENT_ERROR.\n"); + } +} + +static void TestAPI(void) +{ + TestFromInt64(); + TestToInt64(); +} + +static void TestData(void) +{ + TestEpochOffsets(); + TestFromLimits(); + TestToLimits(); +} + +static void TestMonkey(void) +{ + int32_t scale; + UErrorCode status = U_ZERO_ERROR; + + for (scale = 0; scale < UDTS_MAX_SCALE; scale += 1) { + int64_t fromMin = utmscale_getTimeScaleValue(scale, UTSV_FROM_MIN_VALUE, &status); + int64_t fromMax = utmscale_getTimeScaleValue(scale, UTSV_FROM_MAX_VALUE, &status); + int32_t i; + + initRandom(fromMin, fromMax); + + for (i = 0; i < LOOP_COUNT; i += 1) { + int64_t value = randomInRange(); + + roundTripTest(value, scale); + } + } +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/test/cintltst/utransts.c b/icuSources/test/cintltst/utransts.c index e04fdd12..b472fe16 100644 --- a/icuSources/test/cintltst/utransts.c +++ b/icuSources/test/cintltst/utransts.c @@ -1,12 +1,12 @@ /* -******************************************************************************* -* Copyright (C) 1997-2003, International Business Machines -* Corporation and others. All Rights Reserved. -******************************************************************************* -* Date Name Description -* 06/23/00 aliu Creation. -******************************************************************************* -*/ + ******************************************************************************* + * Copyright (C) 1997-2004, International Business Machines + * Corporation and others. All Rights Reserved. + ******************************************************************************* + * Date Name Description + * 06/23/00 aliu Creation. + ******************************************************************************* + */ #include "unicode/utypes.h" @@ -27,6 +27,7 @@ static void TestOpenInverse(void); static void TestClone(void); static void TestRegisterUnregister(void); static void TestExtractBetween(void); +static void TestUnicodeIDs(void); static void _expectRules(const char*, const char*, const char*); static void _expect(const UTransliterator* trans, const char* cfrom, const char* cto); @@ -43,6 +44,7 @@ addUTransTest(TestNode** root) { TEST(TestClone); TEST(TestRegisterUnregister); TEST(TestExtractBetween); + TEST(TestUnicodeIDs); } /*------------------------------------------------------------------ @@ -173,6 +175,71 @@ static void TestAPI() { } } +static void TestUnicodeIDs() { + UEnumeration *uenum; + UTransliterator *utrans; + const UChar *id, *id2; + int32_t idLength, id2Length, count, count2; + + UErrorCode errorCode; + + errorCode=U_ZERO_ERROR; + uenum=utrans_openIDs(&errorCode); + if(U_FAILURE(errorCode)) { + log_err("utrans_openIDs() failed - %s\n", u_errorName(errorCode)); + return; + } + + count=uenum_count(uenum, &errorCode); + if(U_FAILURE(errorCode) || count<1) { + log_err("uenum_count(transliterator IDs)=%d - %s\n", count, u_errorName(errorCode)); + } + + count=0; + for(;;) { + id=uenum_unext(uenum, &idLength, &errorCode); + if(U_FAILURE(errorCode)) { + log_err("uenum_unext(transliterator ID %d) failed - %s\n", count, u_errorName(errorCode)); + break; + } + if(id==NULL) { + break; + } + + if(++count>10) { + /* try to actually open only a few transliterators */ + continue; + } + + utrans=utrans_openU(id, idLength, UTRANS_FORWARD, NULL, 0, NULL, &errorCode); + if(U_FAILURE(errorCode)) { + log_err("utrans_openU(%s) failed - %s\n", aescstrdup(id, idLength), u_errorName(errorCode)); + continue; + } + + id2=utrans_getUnicodeID(utrans, &id2Length); + if(idLength!=id2Length || 0!=u_memcmp(id, id2, idLength)) { + log_err("utrans_getUnicodeID(%s) does not match the original ID\n", aescstrdup(id, idLength)); + } + + utrans_close(utrans); + } + + uenum_reset(uenum, &errorCode); + if(U_FAILURE(errorCode) || count<1) { + log_err("uenum_reset(transliterator IDs) failed - %s\n", u_errorName(errorCode)); + } else { + count2=uenum_count(uenum, &errorCode); + if(U_FAILURE(errorCode) || count<1) { + log_err("2nd uenum_count(transliterator IDs)=%d - %s\n", count2, u_errorName(errorCode)); + } else if(count!=count2) { + log_err("uenum_unext(transliterator IDs) returned %d IDs but uenum_count() after uenum_reset() claims there are %d\n", count, count2); + } + } + + uenum_close(uenum); +} + static void TestOpenInverse(){ UErrorCode status=U_ZERO_ERROR; UTransliterator* t1=NULL; @@ -271,10 +338,13 @@ static void TestClone(){ static void TestRegisterUnregister(){ UErrorCode status=U_ZERO_ERROR; UTransliterator* t1=NULL; - UTransliterator* rules=NULL; + UTransliterator* rules=NULL, *rules2; UTransliterator* inverse1=NULL; UChar rule[]={ 0x0061, 0x003c, 0x003e, 0x0063}; /*a<>b*/ + U_STRING_DECL(ID, "TestA-TestB", 11); + U_STRING_INIT(ID, "TestA-TestB", 11); + /* Make sure it doesn't exist */ t1=utrans_open("TestA-TestB", UTRANS_FORWARD,NULL,0,NULL, &status); if(t1 != NULL || U_SUCCESS(status)) { @@ -295,6 +365,14 @@ static void TestRegisterUnregister(){ log_err("FAIL: utrans_openRules(a<>B) failed with error=%s\n", myErrorName(status)); return; } + + /* clone it so we can register it a second time */ + rules2=utrans_clone(rules, &status); + if(U_FAILURE(status)) { + log_err("FAIL: utrans_clone(a<>B) failed with error=%s\n", myErrorName(status)); + return; + } + status=U_ZERO_ERROR; /* Register it */ utrans_register(rules, &status); @@ -320,7 +398,34 @@ static void TestRegisterUnregister(){ log_err("FAIL: TestA-TestB isn't unregistered\n"); return; } - + utrans_close(t1); + + /* now with utrans_unregisterID(const UChar *) */ + status=U_ZERO_ERROR; + utrans_register(rules2, &status); + if(U_FAILURE(status)){ + log_err("FAIL: 2nd utrans_register failed with error=%s\n", myErrorName(status)); + return; + } + status=U_ZERO_ERROR; + /* Now check again -- should exist now*/ + t1= utrans_open("TestA-TestB", UTRANS_FORWARD, NULL,0,NULL,&status); + if(U_FAILURE(status) || t1 == NULL){ + log_err("FAIL: 2nd TestA-TestB not registered\n"); + return; + } + utrans_close(t1); + + /*unregister the instance*/ + status=U_ZERO_ERROR; + utrans_unregisterID(ID, -1); + /* now Make sure it doesn't exist */ + t1=utrans_openU(ID, -1, UTRANS_FORWARD,NULL,0,NULL, &status); + if(U_SUCCESS(status) || t1 != NULL) { + log_err("FAIL: 2nd TestA-TestB isn't unregistered\n"); + return; + } + utrans_close(t1); utrans_close(inverse1); } @@ -376,7 +481,7 @@ static void TestFilter() { UChar filt[128]; UChar buf[128]; UChar exp[128]; - char cbuf[128]; + char *cbuf; int32_t limit; const char* DATA[] = { "[^c]", /* Filter out 'c' */ @@ -400,7 +505,7 @@ static void TestFilter() { for (i=0; i %s\n", DATA[i+1], DATA[i], cbuf); } else { @@ -494,7 +597,10 @@ static void _expect(const UTransliterator* trans, UChar from[CAP]; UChar to[CAP]; UChar buf[CAP]; - char id[CAP]; + const UChar *ID; + int32_t IDLength; + const char *id; + UErrorCode status = U_ZERO_ERROR; int32_t limit; UTransPosition pos; @@ -504,7 +610,8 @@ static void _expect(const UTransliterator* trans, u_uastrcpy(from, cfrom); u_uastrcpy(to, cto); - utrans_getID(trans, id, CAP); + ID = utrans_getUnicodeID(trans, &IDLength); + id = aescstrdup(ID, IDLength); /* utrans_transUChars() */ u_strcpy(buf, from); diff --git a/icuSources/test/collperf/collperf.dsp b/icuSources/test/collperf/collperf.dsp index 29a5897a..4fc8ded9 100644 --- a/icuSources/test/collperf/collperf.dsp +++ b/icuSources/test/collperf/collperf.dsp @@ -96,7 +96,7 @@ LINK32=link.exe # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /Op /I "..\..\..\include" /I "..\..\tools\ctestfw" /I "..\..\common" /I "..\..\i18n" /I "..\..\tools\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /Op /I "..\..\..\include" /I "..\..\tools\ctestfw" /I "..\..\common" /I "..\..\i18n" /I "..\..\tools\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" @@ -122,7 +122,7 @@ LINK32=link.exe # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /Op /I "..\..\..\include" /I "..\..\tools\ctestfw" /I "..\..\common" /I "..\..\i18n" /I "..\..\tools\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /Op /I "..\..\..\include" /I "..\..\tools\ctestfw" /I "..\..\common" /I "..\..\i18n" /I "..\..\tools\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe diff --git a/icuSources/test/hdrtst/Makefile b/icuSources/test/hdrtst/Makefile deleted file mode 100644 index 00932870..00000000 --- a/icuSources/test/hdrtst/Makefile +++ /dev/null @@ -1,117 +0,0 @@ -# -# Copyright (c) 1999-2002, International Business Machines Corporation and -# others. All Rights Reserved. -# -# -# THE PURPOSE OF THIS TEST -# -# This tests all public header files ( -# -# To run it simply type 'make check'. You SHOULD see: -# -# unicode/uchar.h - 0 -# unicode/uchriter.h - 0 -# unicode/ucnv.h - 0 -# -# .. etc. Anything other than zero is an error. (except for the deprecation tests, where '1' is the correct value) -# -# -# If a header fails the C compile because it's a C++ header, add it to the -# file named 'cxxfiles.txt' in this directory. -# -# If a header fails because it is deprecated, add it to the 'dfiles.txt' -# -# - -ifeq ($(USE_ICU_CONFIG),1) - include $(shell icu-config --incfile) - DIRS=$(shell icu-config --prefix)/include/unicode -else - include ../../config/Makefile.inc - DIRS=../../../common/unicode ../../../i18n/unicode ../../../extra/ustdio/unicode -endif - -all: - @echo Please read this Makefile for more information. - @echo run \'$(MAKE) check\' to run the test - -check: hdrdir dtest ctest cpptest doclean - @echo "All header tests have finished. If deprecation #errors appeared, " - @echo " add files to hdrtst/dfiles.txt" - @echo "#################################################################" - @echo - -# break dependency -doclean: - make clean - -#layout not tested due to path dependencies - -hdrdir: - @echo CPPFLAGS are $(CPPFLAGS) - @-$(RMV) ./unicode - @mkdir ./unicode - @echo Preparing unicode/ directory .. - @cd ./unicode ; \ - for dir in $(DIRS); do \ - echo "linking from " $$dir '(' `ls $$dir/*.h | wc -l` 'headers )' ; \ - ln -s $$dir/*.h . ; \ - done - rm unicode/pwin32.h - -cpptest: - @echo "C++ test #######################################################" - @rm -f Makefile.sub - @echo 'Testing all header files under C++' - @echo 'the number after the hyphen (-) refers to the exit code - should be zero!' - @for file in unicode/*.h; do \ - incfile=`basename $$file .h` ; \ - echo -n "C++ unicode/$$incfile.h - " ; \ - echo '#include "'unicode/$$incfile'.h"' > ht_$$incfile.cpp ; \ - echo 'void junk(){}' >> ht_$$incfile.cpp ; \ - $(COMPILE.cc) -c -I. ht_$$incfile.cpp ; \ - RES=$$? ; \ - echo $$RES ; \ - done - -dtest: - @rm -f Makefile.sub - @echo "Deprecation #######################################################" - @echo 'Should be 1 in each case if file is properly obsoleted.' - @for stub in `cat dfiles.txt | grep -v '^#'` ; do \ - file=unicode/$$stub \ - incfile=`basename $$file .h` ; \ - echo -n "C++ unicode/$$incfile.h - " ; \ - echo '#include "'unicode/$$incfile'.h"' > ht_$$incfile.cpp ; \ - echo 'void junk(){}' >> ht_$$incfile.cpp ; \ - echo > ht_dep.junk ; \ - $(COMPILE.cc) -c -I. ht_$$incfile.cpp 2>&1 | sed -e 's/^.*#error[^"]*"//' | fgrep -v ht_ | tee ht_dep.junk | fgrep -v "$$incfile.h header is obsolete" ; \ - RES=$$? ; \ - echo $$RES ; \ - fgrep -q "$$incfile.h header is obsolete" ht_dep.junk || echo "** FAIL Header unicode/$$incfile.h is not obsoleted properly" ; \ - rm -f unicode/$$stub ; \ - done - -# < ht_dep.junk && ; \ - - -ctest: - @echo "C Test #######################################################" - @echo " (if any C++ files show up here, stop the test and add them to hdrtst/cxxfiles.txt) " - @rm -f Makefile.sub - @echo Building test harness for header files in ../../common and ../../i18n - @echo 'the number after the hyphen (-) refers to the exit code - should be zero!' - @for file in `ls unicode/*.h | fgrep -v -f ./cxxfiles.txt | tee cfiles.txt`; do \ - incfile=`basename $$file .h` ; \ - echo -n "C unicode/$$incfile.h - " ; \ - echo '#include "'unicode/$$incfile'.h"' > ht_$$incfile.c ; \ - echo 'void junk(){}' >> ht_$$incfile.c ; \ - $(COMPILE.c) -c -I. ht_$$incfile.c ; \ - RES=$$? ; \ - echo $$RES ; \ - done - -distclean clean: - -@rm -f *.h *.c *.cpp *.o *.junk - -@$(RMV) ./unicode - diff --git a/icuSources/test/hdrtst/Makefile.in b/icuSources/test/hdrtst/Makefile.in new file mode 100644 index 00000000..0594d169 --- /dev/null +++ b/icuSources/test/hdrtst/Makefile.in @@ -0,0 +1,117 @@ +## +## Copyright (c) 1999-2004, International Business Machines Corporation and +## others. All Rights Reserved. +## +## +## THE PURPOSE OF THIS TEST +## +## This tests all public header files ( +## +## To run it simply type 'make check'. You SHOULD see: +## +## unicode/uchar.h - 0 +## unicode/uchriter.h - 0 +## unicode/ucnv.h - 0 +## +## .. etc. Anything other than zero is an error. (except for the deprecation tests, where '1' is the correct value) +## +## +## If a header fails the C compile because it's a C++ header, add it to the +## file named 'cxxfiles.txt' in this directory. +## +## If a header fails because it is deprecated, add it to the 'dfiles.txt' +## +## + + +include $(shell icu-config --incfile) +srcdir=@srcdir@ +DIRS=$(prefix)/include/unicode +LDIRS=$(prefix)/include/layout + +all: + @echo Please read this Makefile for more information. + @echo run \'$(MAKE) check\' to run the test + +check: dtest ctest cpptest lotest doclean + @echo "All header tests have finished. If deprecation #errors appeared, " + @echo " add files to hdrtst/dfiles.txt" + @echo "#################################################################" + @echo + +# break dependency +doclean: + make clean + +cpptest: + @echo "C++ test #######################################################" + @rm -f Makefile.sub + @echo 'Testing all header files under C++' + @echo 'the number after the hyphen (-) refers to the exit code - should be zero!' + @for file in `ls $(prefix)/include/unicode/*.h | fgrep -v -f $(srcdir)/pfiles.txt`; do \ + incfile=`basename $$file .h` ; \ + echo -n "C++ unicode/$$incfile.h - " ; \ + echo '#include "'unicode/$$incfile'.h"' > ht_$$incfile.cpp ; \ + echo 'void junk(){}' >> ht_$$incfile.cpp ; \ + $(COMPILE.cc) -c $(cppflags) ht_$$incfile.cpp ; \ + echo $$? ; \ + done + +lotest: + @echo "Layout test #######################################################" + @rm -f Makefile.sub + @echo 'Testing all layout files under C++' + @echo 'the number after the hyphen (-) refers to the exit code - should be zero!' + @for file in $(prefix)/include/layout/*.h; do \ + incfile=`basename $$file .h` ; \ + echo -n "C++ layout/$$incfile.h - " ; \ + echo '#include "'layout/$$incfile'.h"' > ht_$$incfile.cpp ; \ + echo 'void junk(){}' >> ht_$$incfile.cpp ; \ + $(COMPILE.cc) -c $(cppflags) -I$(prefix)/include/layout ht_$$incfile.cpp ; \ + echo $$? ; \ + done + +dtest: + @rm -f Makefile.sub + @echo "Deprecation #######################################################" + @echo 'Should be 1 in each case if file is properly obsoleted.' + @for stub in `cat $(srcdir)/dfiles.txt | grep -v '^#'` ; do \ + file=unicode/$$stub \ + incfile=`basename $$file .h` ; \ + echo -n "C++ unicode/$$incfile.h - " ; \ + echo '#include "'unicode/$$incfile'.h"' > ht_$$incfile.cpp ; \ + echo 'void junk(){}' >> ht_$$incfile.cpp ; \ + echo > ht_dep.junk ; \ + $(COMPILE.cc) -c $(cppflags) ht_$$incfile.cpp 2>&1 | sed -e 's/^.*#error[^"]*"//' | fgrep -v ht_ | tee ht_dep.junk | fgrep -v "$$incfile.h header is obsolete" ; \ + RES=$$? ; \ + echo $$RES ; \ + fgrep -q "$$incfile.h header is obsolete" ht_dep.junk || echo "** FAIL Header unicode/$$incfile.h is not obsoleted properly" ; \ + rm -f unicode/$$stub ; \ + done + +# < ht_dep.junk && ; \ + + +ctest: + @echo "C Test #######################################################" + @echo " (if any C++ files show up here, stop the test and add them to hdrtst/cxxfiles.txt) " + @rm -f Makefile.sub + @echo Building test harness for header files in ../../common and ../../i18n + @echo 'the number after the hyphen (-) refers to the exit code - should be zero!' + @for file in `ls $(prefix)/include/unicode/*.h | fgrep -v -f $(srcdir)/cxxfiles.txt | tee cfiles.txt`; do \ + incfile=`basename $$file .h` ; \ + echo -n "C unicode/$$incfile.h - " ; \ + echo '#include "'unicode/$$incfile'.h"' > ht_$$incfile.c ; \ + echo 'void junk(void);' >> ht_$$incfile.c ; \ + echo 'void junk(){}' >> ht_$$incfile.c ; \ + $(COMPILE.c) -c $(cppflags) ht_$$incfile.c ; \ + RES=$$? ; \ + echo $$RES ; \ + done + +clean: + -@rm -f *.h *.c *.cpp *.o *.junk + +distclean: clean + -@rm -f Makefile + diff --git a/icuSources/test/hdrtst/cxxfiles.txt b/icuSources/test/hdrtst/cxxfiles.txt index 499e536b..87e2fc22 100644 --- a/icuSources/test/hdrtst/cxxfiles.txt +++ b/icuSources/test/hdrtst/cxxfiles.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2001-2003 International Business Machines +# Copyright (c) 2001-2004 International Business Machines # Corporation and others. All Rights Reserved. bidi.h brkiter.h @@ -58,3 +58,24 @@ usetiter.h loengine.h #the following are C++ also ustream.h +symtable.h +#layout, layoutex are C++ only +LayoutEngine.h +LEFontInstance.h +LEGlyphFilter.h +LELanguages.h +LEScripts.h +LESwaps.h +LETypes.h +ParagraphLayout.h +RunArrays.h +# currency... +curramt.h +currunit.h +measfmt.h +measunit.h +measure.h +# platform specific +pmacos.h +pos400.h +pwin32.h diff --git a/icuSources/test/hdrtst/pfiles.txt b/icuSources/test/hdrtst/pfiles.txt new file mode 100644 index 00000000..95502b7f --- /dev/null +++ b/icuSources/test/hdrtst/pfiles.txt @@ -0,0 +1,3 @@ +# Copyright (c) 2001-2004 International Business Machines +# Corporation and others. All Rights Reserved. +pwin32.h diff --git a/icuSources/test/ieeetest/Makefile.in b/icuSources/test/ieeetest/Makefile.in deleted file mode 100644 index 199c8f64..00000000 --- a/icuSources/test/ieeetest/Makefile.in +++ /dev/null @@ -1,78 +0,0 @@ -## Makefile.in for ICU - test/ieeetest -## Copyright (c) 1999-2003, International Business Machines Corporation and -## others. All Rights Reserved. - -## Source directory information -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ - -top_builddir = ../.. - -include $(top_builddir)/icudefs.mk - -## Build directory information -subdir = test/ieeetest - -## Extra files to remove for 'make clean' -CLEANFILES = *~ $(DEPS) - -## Target information -TARGET = ieeetest - -DEFS += -I$(top_builddir)/common -I$(top_srcdir)/common -LIBS = $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M) - -OBJECTS = ieeetest.o - -DEPS = $(OBJECTS:.o=.d) - -## List of phony targets -.PHONY : all all-local install install-local clean clean-local \ -distclean distclean-local dist dist-local check check-local - -## Clear suffix list -.SUFFIXES : - -## List of standard targets -all: all-local -install: install-local -clean: clean-local -distclean : distclean-local -dist: dist-local -check: all check-local - -all-local: $(TARGET) - -install-local: - -dist-local: - -clean-local: - test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES) - $(RMV) $(OBJECTS) $(TARGET) - -distclean-local: clean-local - $(RMV) Makefile - -check-local: all-local - - ICU_DATA=$(top_srcdir)/../data/ $(INVOKE) ./$(TARGET) - -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) \ - && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status - -$(TARGET) : $(OBJECTS) - $(LINK.cc) $(OUTOPT)$@ $^ $(LIBS) - -invoke: - ICU_DATA=$${ICU_DATA:-$(top_builddir)/data/} TZ=PST8PDT $(INVOKE) $(INVOCATION) - -ifeq (,$(MAKECMDGOALS)) --include $(DEPS) -else -ifneq ($(patsubst %clean,,$(MAKECMDGOALS)),) -ifneq ($(patsubst %install,,$(MAKECMDGOALS)),) --include $(DEPS) -endif -endif -endif diff --git a/icuSources/test/ieeetest/ieeetest.cpp b/icuSources/test/ieeetest/ieeetest.cpp deleted file mode 100644 index f40f820d..00000000 --- a/icuSources/test/ieeetest/ieeetest.cpp +++ /dev/null @@ -1,706 +0,0 @@ -/******************************************************************************* -* -* Copyright (C) 1998-2001, International Business Machines -* Corporation and others. All Rights Reserved. -* -******************************************************************************* -* File ieeetest.cpp -* -* Modification History: -* -* Date Name Description -* 08/21/98 stephen Creation. -******************************************************************************* -*/ - -#include -#include // DBL_MAX - -#include "ieeetest.h" -#include "unicode/utypes.h" -#include "unicode/putil.h" - -//============================== - -int -main(int argc, - char **argv) -{ - int flags = IEEETest::kNone; - - // parse command line switches - for(int i = 1; i < argc; ++i) { - if(argv[i][0] == '-') { - switch(argv[i][1]) { - case 'v': - flags += IEEETest::kVerboseMode; - break; - - case '?': - case 'h': - case 'H': - usage(argv[0]); - return 0; - - default: - break; - } - } - } - - IEEETest test(flags); - - return test.run(); -} - -//============================== - -void -usage(const char *execName) -{ - fprintf(stdout, "usage: %s [flags]\n\n" - "Flags:\n" - "-v Verbose mode\n", execName); -} - -//============================== - -IEEETest::IEEETest(int flags) - : mFlags(flags), - mTestLevel(0), - mNeedLogIndent(TRUE), - mNeedErrIndent(TRUE) -{} - -//============================== - -IEEETest::~IEEETest() -{} - -//============================== - -int -IEEETest::run(void) -{ - int errCount = 0; - - logln(); - log("Starting IEEETest").logln(); - increaseTestLevel(); - - // add more tests here - errCount += runTest("NaN behavior", &IEEETest::testNaN); - errCount += runTest("+Infinity behavior", &IEEETest::testPositiveInfinity); - errCount += runTest("-Infinity behavior", &IEEETest::testNegativeInfinity); - errCount += runTest("Zero behavior", &IEEETest::testZero); - - decreaseTestLevel(); - if(errCount == 0) - log("IEEETest Passed"); - else { - log("IEEETest failed with ").log(errCount) - .log(errCount == 1 ? " error." : " errors."); - } - logln(); - - if(errCount == 0 && ! (mFlags & kVerboseMode)) - fprintf(stdout, "\nAll tests passed without error.\n"); - - return errCount; -} - -//============================== -int -IEEETest::runTest(const char *testName, - int (IEEETest::*testFunc)(void)) -{ - logln().log("Running test ").log(testName).logln(); - increaseTestLevel(); - int errCount = (this->*testFunc)(); - decreaseTestLevel(); - log("Test ").log(testName); - if(errCount == 0) - log(" passed."); - else { - log(" failed with ").log(errCount) - .log(errCount == 1 ? " error." : " errors."); - } - - logln().logln(); - - return errCount; -} - - -//============================== - -// NaN is weird- comparisons with NaN _always_ return false, with the -// exception of !=, which _always_ returns true -int -IEEETest::testNaN(void) -{ - int errCount = 0; - - log("NaN tests may show that the expected NaN!=NaN etc. is not true on some").logln(); - log("platforms; however, ICU does not rely on them because it defines").logln(); - log("and uses uprv_isNaN(). Therefore, most failing NaN tests only report warnings.").logln(); - - errCount += runTest("isNaN", &IEEETest::testIsNaN); - errCount += runTest("NaN >", &IEEETest::NaNGT); - errCount += runTest("NaN <", &IEEETest::NaNLT); - errCount += runTest("NaN >=", &IEEETest::NaNGTE); - errCount += runTest("NaN <=", &IEEETest::NaNLTE); - errCount += runTest("NaN ==", &IEEETest::NaNE); - errCount += runTest("NaN !=", &IEEETest::NaNNE); - - log("End of NaN tests.").logln(); - - return errCount; -} - -//============================== - -int -IEEETest::testPositiveInfinity(void) -{ - int errCount = 0; - double pinf = uprv_getInfinity(); - double ninf = -uprv_getInfinity(); - double ten = 10.0; - - if(uprv_isInfinite(pinf) != TRUE) { - err("FAIL: isInfinite(+Infinity) returned FALSE, should be TRUE.").errln(); - errCount++; - } - - if(uprv_isPositiveInfinity(pinf) != TRUE) { - err("FAIL: isPositiveInfinity(+Infinity) returned FALSE, should be TRUE.").errln(); - errCount++; - } - - if(uprv_isNegativeInfinity(pinf) != FALSE) { - err("FAIL: isNegativeInfinity(+Infinity) returned TRUE, should be FALSE.").errln(); - errCount++; - } - - if(pinf > DBL_MAX != TRUE) { - err("FAIL: +Infinity > DBL_MAX returned FALSE, should be TRUE.").errln(); - errCount++; - } - - if(pinf > DBL_MIN != TRUE) { - err("FAIL: +Infinity > DBL_MIN returned FALSE, should be TRUE.").errln(); - errCount++; - } - - if(pinf > ninf != TRUE) { - err("FAIL: +Infinity > -Infinity returned FALSE, should be TRUE.").errln(); - errCount++; - } - - if(pinf > ten != TRUE) { - err("FAIL: +Infinity > 10.0 returned FALSE, should be TRUE.").errln(); - errCount++; - } - - return errCount; -} - -//============================== - -int -IEEETest::testNegativeInfinity(void) -{ - int errCount = 0; - double pinf = uprv_getInfinity(); - double ninf = -uprv_getInfinity(); - double ten = 10.0; - - if(uprv_isInfinite(ninf) != TRUE) { - err("FAIL: isInfinite(-Infinity) returned FALSE, should be TRUE.").errln(); - errCount++; - } - - if(uprv_isNegativeInfinity(ninf) != TRUE) { - err("FAIL: isNegativeInfinity(-Infinity) returned FALSE, should be TRUE.").errln(); - errCount++; - } - - if(uprv_isPositiveInfinity(ninf) != FALSE) { - err("FAIL: isPositiveInfinity(-Infinity) returned TRUE, should be FALSE.").errln(); - errCount++; - } - - if(ninf < DBL_MAX != TRUE) { - err("FAIL: -Infinity < DBL_MAX returned FALSE, should be TRUE.").errln(); - errCount++; - } - - if(ninf < DBL_MIN != TRUE) { - err("FAIL: -Infinity < DBL_MIN returned FALSE, should be TRUE.").errln(); - errCount++; - } - - if(ninf < pinf != TRUE) { - err("FAIL: -Infinity < +Infinity returned FALSE, should be TRUE.").errln(); - errCount++; - } - - if(ninf < ten != TRUE) { - err("FAIL: -Infinity < 10.0 returned FALSE, should be TRUE.").errln(); - errCount++; - } - - return errCount; -} - -//============================== - -// notes about zero: -// -0.0 == 0.0 == TRUE -// -0.0 < 0.0 == FALSE -// generating -0.0 must be done at runtime. compiler apparently ignores sign? -int -IEEETest::testZero(void) -{ - int errCount = 0; - // volatile is used to fake out the compiler optimizer. We really want to divide by 0. - volatile double pzero = 0.0; - volatile double nzero = 0.0; - - nzero *= -1; - - if(pzero == nzero != TRUE) { - err("FAIL: 0.0 == -0.0 returned FALSE, should be TRUE.").errln(); - errCount++; - } - - if(pzero > nzero != FALSE) { - err("FAIL: 0.0 > -0.0 returned TRUE, should be FALSE.").errln(); - errCount++; - } - - if(pzero >= nzero != TRUE) { - err("FAIL: 0.0 >= -0.0 returned FALSE, should be TRUE.").errln(); - errCount++; - } - - if(pzero < nzero != FALSE) { - err("FAIL: 0.0 < -0.0 returned TRUE, should be FALSE.").errln(); - errCount++; - } - - if(pzero <= nzero != TRUE) { - err("FAIL: 0.0 <= -0.0 returned FALSE, should be TRUE.").errln(); - errCount++; - } - - if(uprv_isInfinite(1/pzero) != TRUE) { - err("FAIL: isInfinite(1/0.0) returned FALSE, should be TRUE.").errln(); - errCount++; - } - - if(uprv_isInfinite(1/nzero) != TRUE) { - err("FAIL: isInfinite(1/-0.0) returned FALSE, should be TRUE.").errln(); - errCount++; - } - - if(uprv_isPositiveInfinity(1/pzero) != TRUE) { - err("FAIL: isPositiveInfinity(1/0.0) returned FALSE, should be TRUE.").errln(); - errCount++; - } - - if(uprv_isNegativeInfinity(1/nzero) != TRUE) { - err("FAIL: isNegativeInfinity(1/-0.0) returned FALSE, should be TRUE.").errln(); - errCount++; - } - - return errCount; -} - -//============================== - -int -IEEETest::testIsNaN(void) -{ - int numErrors = 0; - double pinf = uprv_getInfinity(); - double ninf = -uprv_getInfinity(); - double nan = uprv_getNaN(); - double ten = 10.0; - - if(uprv_isNaN(nan) == FALSE) { - err("FAIL: isNaN() returned FALSE for NaN.").errln(); - numErrors++; - } - - if(uprv_isNaN(pinf) == TRUE) { - err("FAIL: isNaN() returned TRUE for +Infinity.").errln(); - numErrors++; - } - - if(uprv_isNaN(ninf) == TRUE) { - err("FAIL: isNaN() returned TRUE for -Infinity.").errln(); - numErrors++; - } - - if(uprv_isNaN(ten) == TRUE) { - err("FAIL: isNaN() returned TRUE for 10.0.").errln(); - numErrors++; - } - - return numErrors; -} - -//============================== - -int -IEEETest::NaNGT(void) -{ - double pinf = uprv_getInfinity(); - double ninf = -uprv_getInfinity(); - double nan = uprv_getNaN(); - double ten = 10.0; - int numErrors = 0; - - if(nan > nan != FALSE) { - log("WARNING: NaN > NaN returned TRUE, should be FALSE").logln(); - } - - if(nan > pinf != FALSE) { - log("WARNING: NaN > +Infinity returned TRUE, should be FALSE").logln(); - } - - if(nan > ninf != FALSE) { - log("WARNING: NaN > -Infinity returned TRUE, should be FALSE").logln(); - } - - if(nan > ten != FALSE) { - log("WARNING: NaN > 10.0 returned TRUE, should be FALSE").logln(); - } - - return numErrors; -} - -//============================== - -int -IEEETest::NaNLT(void) -{ - double pinf = uprv_getInfinity(); - double ninf = -uprv_getInfinity(); - double nan = uprv_getNaN(); - double ten = 10.0; - int numErrors = 0; - - if(nan < nan != FALSE) { - log("WARNING: NaN < NaN returned TRUE, should be FALSE").logln(); - } - - if(nan < pinf != FALSE) { - log("WARNING: NaN < +Infinity returned TRUE, should be FALSE").logln(); - } - - if(nan < ninf != FALSE) { - log("WARNING: NaN < -Infinity returned TRUE, should be FALSE").logln(); - } - - if(nan < ten != FALSE) { - log("WARNING: NaN < 10.0 returned TRUE, should be FALSE").logln(); - } - - return numErrors; -} - -//============================== - -int -IEEETest::NaNGTE(void) -{ - double pinf = uprv_getInfinity(); - double ninf = -uprv_getInfinity(); - double nan = uprv_getNaN(); - double ten = 10.0; - int numErrors = 0; - - if(nan >= nan != FALSE) { - log("WARNING: NaN >= NaN returned TRUE, should be FALSE").logln(); - } - - if(nan >= pinf != FALSE) { - log("WARNING: NaN >= +Infinity returned TRUE, should be FALSE").logln(); - } - - if(nan >= ninf != FALSE) { - log("WARNING: NaN >= -Infinity returned TRUE, should be FALSE").logln(); - } - - if(nan >= ten != FALSE) { - log("WARNING: NaN >= 10.0 returned TRUE, should be FALSE").logln(); - } - - return numErrors; -} - -//============================== - -int -IEEETest::NaNLTE(void) -{ - double pinf = uprv_getInfinity(); - double ninf = -uprv_getInfinity(); - double nan = uprv_getNaN(); - double ten = 10.0; - int numErrors = 0; - - if(nan <= nan != FALSE) { - log("WARNING: NaN <= NaN returned TRUE, should be FALSE").logln(); - } - - if(nan <= pinf != FALSE) { - log("WARNING: NaN <= +Infinity returned TRUE, should be FALSE").logln(); - } - - if(nan <= ninf != FALSE) { - log("WARNING: NaN <= -Infinity returned TRUE, should be FALSE").logln(); - } - - if(nan <= ten != FALSE) { - log("WARNING: NaN <= 10.0 returned TRUE, should be FALSE").logln(); - } - - return numErrors; -} - -//============================== - -int -IEEETest::NaNE(void) -{ - double pinf = uprv_getInfinity(); - double ninf = -uprv_getInfinity(); - double nan = uprv_getNaN(); - double ten = 10.0; - int numErrors = 0; - - if(nan == nan != FALSE) { - log("WARNING: NaN == NaN returned TRUE, should be FALSE").logln(); - } - - if(nan == pinf != FALSE) { - log("WARNING: NaN == +Infinity returned TRUE, should be FALSE").logln(); - } - - if(nan == ninf != FALSE) { - log("WARNING: NaN == -Infinity returned TRUE, should be FALSE").logln(); - } - - if(nan == ten != FALSE) { - log("WARNING: NaN == 10.0 returned TRUE, should be FALSE").logln(); - } - - return numErrors; -} - -//============================== - -int -IEEETest::NaNNE(void) -{ - double pinf = uprv_getInfinity(); - double ninf = -uprv_getInfinity(); - double nan = uprv_getNaN(); - double ten = 10.0; - int numErrors = 0; - - if(nan != nan != TRUE) { - log("WARNING: NaN != NaN returned FALSE, should be TRUE").logln(); - } - - if(nan != pinf != TRUE) { - log("WARNING: NaN != +Infinity returned FALSE, should be TRUE").logln(); - } - - if(nan != ninf != TRUE) { - log("WARNING: NaN != -Infinity returned FALSE, should be TRUE").logln(); - } - - if(nan != ten != TRUE) { - log("WARNING: NaN != 10.0 returned FALSE, should be TRUE").logln(); - } - - return numErrors; -} - -//============================== - -IEEETest& -IEEETest::log(char c) -{ - if(mFlags & kVerboseMode) { - if(mNeedLogIndent) { - for(int j = 0; j < 2 * getTestLevel(); ++j) - fputc(' ', stdout); - mNeedLogIndent = FALSE; - } - fputc(c, stdout); - } - return *this; -} - -//============================== - -IEEETest& -IEEETest::log(const char *s) -{ - if(mFlags & kVerboseMode) { - if(mNeedLogIndent) { - for(int j = 0; j < 2 * getTestLevel(); ++j) - fputc(' ', stdout); - mNeedLogIndent = FALSE; - } - fprintf(stdout, "%s", s); - } - return *this; -} - -//============================== - -IEEETest& -IEEETest::log(int i) -{ - if(mFlags & kVerboseMode) { - if(mNeedLogIndent) { - for(int j = 0; j < 2 * getTestLevel(); ++j) - fputc(' ', stdout); - mNeedLogIndent = FALSE; - } - fprintf(stdout, "%d", i); - } - return *this; -} - -//============================== - -IEEETest& -IEEETest::log(long l) -{ - if(mFlags & kVerboseMode) { - if(mNeedLogIndent) { - for(int j = 0; j < 2 * getTestLevel(); ++j) - fputc(' ', stdout); - mNeedLogIndent = FALSE; - } - fprintf(stdout, "%ld", l); - } - return *this; -} - -//============================== - -IEEETest& -IEEETest::log(double d) -{ - if(mFlags & kVerboseMode) { - if(mNeedLogIndent) { - for(int j = 0; j < 2 * getTestLevel(); ++j) - fputc(' ', stdout); - mNeedLogIndent = FALSE; - } - fprintf(stdout, "%g", d); - } - return *this; -} - -//============================== - -IEEETest& -IEEETest::logln(void) -{ - if(mFlags & kVerboseMode) - fputc('\n', stdout); - mNeedLogIndent = TRUE; - return *this; -} - -//============================== - -IEEETest& -IEEETest::err(char c) -{ - if(mNeedErrIndent) { - for(int j = 0; j < 2 * getTestLevel(); ++j) - fputc(' ', stderr); - mNeedErrIndent = FALSE; - } - fputc(c, stderr); - return *this; -} - -//============================== - -IEEETest& -IEEETest::err(const char *s) -{ - if(mNeedErrIndent) { - for(int j = 0; j < 2 * getTestLevel(); ++j) - fputc(' ', stderr); - mNeedErrIndent = FALSE; - } - fprintf(stderr, "%s", s); - return *this; -} - -//============================== - -IEEETest& -IEEETest::err(int i) -{ - if(mNeedErrIndent) { - for(int j = 0; j < 2 * getTestLevel(); ++j) - fputc(' ', stderr); - mNeedErrIndent = FALSE; - } - fprintf(stderr, "%d", i); - return *this; -} - -//============================== - -IEEETest& -IEEETest::err(long l) -{ - if(mNeedErrIndent) { - for(int j = 0; j < 2 * getTestLevel(); ++j) - fputc(' ', stderr); - mNeedErrIndent = FALSE; - } - fprintf(stderr, "%ld", l); - return *this; -} - -//============================== - -IEEETest& -IEEETest::err(double d) -{ - if(mNeedErrIndent) { - for(int j = 0; j < 2 * getTestLevel(); ++j) - fputc(' ', stderr); - mNeedErrIndent = FALSE; - } - fprintf(stderr, "%g", d); - return *this; -} - -//============================== - -IEEETest& -IEEETest::errln(void) -{ - fputc('\n', stderr); - mNeedErrIndent = TRUE; - return *this; -} - -//eof diff --git a/icuSources/test/ieeetest/ieeetest.h b/icuSources/test/ieeetest/ieeetest.h deleted file mode 100644 index b9dcd642..00000000 --- a/icuSources/test/ieeetest/ieeetest.h +++ /dev/null @@ -1,103 +0,0 @@ -/* -******************************************************************************* -* -* Copyright (C) 1998-2003, International Business Machines -* Corporation and others. All Rights Reserved. -* -******************************************************************************* -* -* File ieeetest.h -* -* Modification History: -* -* Date Name Description -* 08/21/98 stephen Creation. -******************************************************************************* -*/ - -#ifndef _IEEETEST -#define _IEEETEST - -void usage(const char *execName); - -// Very simple class for testing IEEE compliance -class IEEETest -{ - public: - - // additive constants for flags - enum EModeFlags { - kNone = 0x00, - kVerboseMode = 0x01 - }; - - - IEEETest(int flags = kNone); - ~IEEETest(); - - // method returns the number of errors - int run(void); - - private: - // utility function for running a test function - int runTest(const char *testName, - int (IEEETest::*testFunc)(void)); - - // the actual tests; methods return the number of errors - int testNaN(void); - int testPositiveInfinity(void); - int testNegativeInfinity(void); - int testZero(void); - - // subtests of testNaN - int testIsNaN(void); - int NaNGT(void); - int NaNLT(void); - int NaNGTE(void); - int NaNLTE(void); - int NaNE(void); - int NaNNE(void); - - - // logging utilities - int getTestLevel(void) const; - void increaseTestLevel(void); - void decreaseTestLevel(void); - - IEEETest& log(char c); - IEEETest& log(const char *s); - IEEETest& log(int i); - IEEETest& log(long l); - IEEETest& log(double d); - IEEETest& logln(void); - - IEEETest& err(char c); - IEEETest& err(const char *s); - IEEETest& err(int i); - IEEETest& err(long l); - IEEETest& err(double d); - IEEETest& errln(void); - - // data members - int mFlags; // flags - only verbose for now - int mTestLevel; // indent level - - short mNeedLogIndent; - short mNeedErrIndent; -}; - -inline int -IEEETest::getTestLevel(void) const -{ return mTestLevel; } - -inline void -IEEETest::increaseTestLevel(void) -{ mTestLevel++; } - -inline void -IEEETest::decreaseTestLevel(void) -{ mTestLevel--; } - -#endif - -//eof diff --git a/icuSources/test/intltest/Makefile.in b/icuSources/test/intltest/Makefile.in index 1c81f620..40f10cce 100644 --- a/icuSources/test/intltest/Makefile.in +++ b/icuSources/test/intltest/Makefile.in @@ -1,5 +1,5 @@ ## Makefile.in for ICU - test/intltest -## Copyright (c) 1999-2003, International Business Machines Corporation and +## Copyright (c) 1999-2004, International Business Machines Corporation and ## others. All Rights Reserved. ## Source directory information @@ -19,28 +19,30 @@ CLEANFILES = *~ $(DEPS) ## Target information TARGET = intltest$(EXEEXT) -BUILDDIR := $(shell pwd)/../../ +BUILDDIR := $(CURR_SRCCODE_FULL_DIR)/../../ BUILDDIR := $(BUILDDIR:test/intltest/../../=) +BUILDDIR := $(BUILDDIR:test\\\\intltest/../../=) -CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common -I$(top_srcdir)/i18n -I$(top_srcdir)/tools/toolutil +CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common -I$(top_srcdir)/i18n -I$(top_srcdir)/tools/toolutil -I$(top_srcdir)/tools/ctestfw DEFS += -D'U_TOPSRCDIR="$(top_srcdir)/"' -D'U_TOPBUILDDIR="$(BUILDDIR)"' -LIBS = $(LIBICUI18N) $(LIBICUUC) $(LIBICUTOOLUTIL) $(DEFAULT_LIBS) $(LIB_M) +LIBS = $(LIBCTESTFW) $(LIBICUI18N) $(LIBICUUC) $(LIBICUTOOLUTIL) $(DEFAULT_LIBS) $(LIB_M) -OBJECTS = allcoll.o apicoll.o callimts.o calregts.o caltest.o \ -caltztst.o canittst.o citrtest.o cntabcol.o cputilst.o currcoll.o dacoll.o \ +OBJECTS = allcoll.o apicoll.o astrotst.o callimts.o calregts.o caltest.o \ +caltztst.o canittst.o citrtest.o cntabcol.o convtest.o currcoll.o dacoll.o \ dadrcoll.o dcfmapts.o decoll.o dtfmapts.o dtfmrgts.o dtfmtrtts.o dtfmttst.o \ encoll.o escoll.o ficoll.o frcoll.o g7coll.o intltest.o \ itercoll.o itformat.o itmajor.o itutil.o jacoll.o lcukocol.o \ loctest.o miscdtfm.o mnkytst.o msfmrgts.o nmfmapts.o nmfmtrt.o \ numfmtst.o numrgts.o pptest.o regcoll.o restest.o restsnew.o sdtfmtts.o svccoll.o tchcfmt.o \ tfsmalls.o tmsgfmt.o trcoll.o tscoll.o tsdate.o tsdcfmsy.o tsdtfmsy.o \ -tsmthred.o tsmutex.o tsnmfmt.o tsputil.o tstnrapi.o tstnorm.o tzbdtest.o \ +tsmthred.o tsnmfmt.o tsputil.o tstnrapi.o tstnorm.o tzbdtest.o \ tzregts.o tztest.o ucdtest.o usettest.o ustrtest.o strcase.o transtst.o strtest.o thcoll.o \ -itrbbi.o rbbiapts.o rbbitst.o ittrans.o transapi.o cpdtrtst.o unhxtrts.o hxuntrts.o \ -ufltlgts.o testutil.o transrt.o trnserr.o normconf.o sfwdchit.o \ +itrbbi.o rbbiapts.o rbbitst.o ittrans.o transapi.o cpdtrtst.o \ +testutil.o transrt.o trnserr.o normconf.o sfwdchit.o \ jamotest.o srchtest.o reptest.o regextst.o \ -itrbnf.o itrbnfrt.o tstdtmod.o testdata.o datamap.o ucaconf.o icusvtst.o \ -uobjtest.o idnaref.o nptrans.o punyref.o testidn.o testidna.o incaltst.o +itrbnf.o itrbnfrt.o itrbnfp.o ucaconf.o icusvtst.o \ +uobjtest.o idnaref.o nptrans.o punyref.o testidn.o testidna.o incaltst.o \ +calcasts.o v32test.o textfile.o tokiter.o DEPS = $(OBJECTS:.o=.d) @@ -76,7 +78,7 @@ distclean-local: clean-local -include Makefile.local check-local: all-local - TZ=PST8PDT $(INVOKE) ./$(TARGET) $(INTLTEST_OPTS) || true + $(INVOKE) ./$(TARGET) $(INTLTEST_OPTS) || true Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ @@ -85,9 +87,6 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(TARGET) : $(OBJECTS) $(LINK.cc) $(OUTOPT)$@ $^ $(LIBS) -invoke: - ICU_DATA=$${ICU_DATA:-$(top_builddir)/data/} TZ=PST8PDT $(INVOKE) $(INVOCATION) - ifeq (,$(MAKECMDGOALS)) -include $(DEPS) else diff --git a/icuSources/test/intltest/allcoll.cpp b/icuSources/test/intltest/allcoll.cpp index 2a907719..f7518f03 100644 --- a/icuSources/test/intltest/allcoll.cpp +++ b/icuSources/test/intltest/allcoll.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ diff --git a/icuSources/test/intltest/allcoll.h b/icuSources/test/intltest/allcoll.h index 62ec731c..040a7501 100644 --- a/icuSources/test/intltest/allcoll.h +++ b/icuSources/test/intltest/allcoll.h @@ -1,8 +1,8 @@ -/******************************************************************** +/*********************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ + * Copyright (c) 1997-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ***********************************************************************/ /** * CollationDummyTest is a third level test class. This tests creation of diff --git a/icuSources/test/intltest/apicoll.cpp b/icuSources/test/intltest/apicoll.cpp index 360817a5..ceae01a0 100644 --- a/icuSources/test/intltest/apicoll.cpp +++ b/icuSources/test/intltest/apicoll.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ //=============================================================================== @@ -51,6 +51,7 @@ CollationAPITest::doAssert(UBool condition, const char *message) } } +#ifdef U_USE_COLLATION_OBSOLETE_2_6 /* * Test Collator::createInstance(... version...) for some locale. Called by TestProperty(). */ @@ -80,6 +81,7 @@ TestOpenVersion(IntlTest &test, const Locale &locale) { } } } +#endif // Collator Class Properties // ctor, dtor, createInstance, compare, getStrength/setStrength @@ -96,8 +98,9 @@ CollationAPITest::TestProperty(/* char* par */) ICU 2.1 currVersionArray = {0x19, 0x00, 0x03, 0x03}; ICU 2.2 currVersionArray = {0x21, 0x40, 0x04, 0x04}; ICU 2.4 currVersionArray = {0x21, 0x40, 0x04, 0x04}; + ICU 2.6 currVersionArray = {0x21, 0x40, 0x03, 0x03}; */ - UVersionInfo currVersionArray = {0x21, 0x40, 0x03, 0x03}; + UVersionInfo currVersionArray = {0x29, 0x80, 0x00, 0x04}; UVersionInfo versionArray; int i = 0; @@ -232,6 +235,7 @@ CollationAPITest::TestProperty(/* char* par */) delete aFrCol; delete junk; +#ifdef U_USE_COLLATION_OBSOLETE_2_6 /* test Collator::createInstance(...version...) */ TestOpenVersion(*this, ""); TestOpenVersion(*this, "da"); @@ -248,6 +252,7 @@ CollationAPITest::TestProperty(/* char* par */) errln("error: ucol_openVersion(bogus version) succeeded"); delete col; } +#endif } void @@ -350,8 +355,8 @@ CollationAPITest::TestRules() } coll->getRules(UCOL_TAILORING_ONLY, rules); - if (rules.length() != 0) { - errln("English tailored rules failed"); + if (rules.length() != 0x0a) { + errln("English tailored rules failed - length is 0x%x expected 0x%x", rules.length(), 0x0e); } coll->getRules(UCOL_FULL_RULES, rules); @@ -376,17 +381,17 @@ CollationAPITest::TestDecomposition() { /* there is no reason to have canonical decomposition in en_US OR default locale */ if (vi_VN->getAttribute(UCOL_NORMALIZATION_MODE, status) != UCOL_ON) { - errln("ERROR: vi_VN collation did not have cannonical decomposition for normalization!\n"); + errln("ERROR: vi_VN collation did not have canonical decomposition for normalization!\n"); } if (el_GR->getAttribute(UCOL_NORMALIZATION_MODE, status) != UCOL_ON) { - errln("ERROR: el_GR collation did not have cannonical decomposition for normalization!\n"); + errln("ERROR: el_GR collation did not have canonical decomposition for normalization!\n"); } if (en_US->getAttribute(UCOL_NORMALIZATION_MODE, status) != UCOL_OFF) { - errln("ERROR: en_US collation had cannonical decomposition for normalization!\n"); + errln("ERROR: en_US collation had canonical decomposition for normalization!\n"); } delete en_US; @@ -1012,11 +1017,17 @@ void CollationAPITest::TestSortKey() col->setAttribute(UCOL_STRENGTH, UCOL_IDENTICAL, status); uint8_t key2compat[] = { + /* 2.6.1 key */ + 0x26, 0x28, 0x2A, 0x2C, 0x26, 0x01, + 0x09, 0x01, 0x09, 0x01, 0x25, 0x01, + 0x92, 0x93, 0x94, 0x95, 0x92, 0x00 + /* 2.2 key */ + /* 0x1D, 0x1F, 0x21, 0x23, 0x1D, 0x01, 0x09, 0x01, 0x09, 0x01, 0x1C, 0x01, 0x92, 0x93, 0x94, 0x95, 0x92, 0x00 - + */ /* 2.0 key */ /* 0x19, 0x1B, 0x1D, 0x1F, 0x19, @@ -1176,7 +1187,7 @@ void CollationAPITest::TestMaxExpansion() { UErrorCode status = U_ZERO_ERROR; UChar ch = 0; - UChar supplementary[2] = {0xD800, 0xDC00}; + UChar32 unassigned = 0xEFFFD; uint32_t sorder = 0; uint32_t temporder = 0; @@ -1205,8 +1216,7 @@ void CollationAPITest::TestMaxExpansion() if (order == 0) order = iter->previous(status); - while (U_SUCCESS(status) && - ((uint32_t)iter->previous(status) != UCOL_NULLORDER)) { + while (U_SUCCESS(status) && iter->previous(status) != UCOL_NULLORDER) { count ++; } @@ -1253,7 +1263,7 @@ void CollationAPITest::TestMaxExpansion() ch, 3); } - str.setTo(supplementary, 2); + str.setTo(unassigned); iter->setText(str, status); sorder = iter->previous(status); @@ -1498,7 +1508,7 @@ void CollationAPITest::TestGetLocale() { /* completely non-existant locale for collator should get a default collator */ { - Collator *defaultColl = Collator::createInstance(NULL, status); + Collator *defaultColl = Collator::createInstance((const Locale)NULL, status); coll = Collator::createInstance("blahaha", status); if(U_FAILURE(status)) { log("Failed to open collator with %s\n", u_errorName(status)); @@ -2108,6 +2118,24 @@ void CollationAPITest::TestSubclass() } } +void CollationAPITest::TestNULLCharTailoring() +{ + UErrorCode status = U_ZERO_ERROR; + UChar buf[256] = {0}; + int32_t len = u_unescape("&a < '\\u0000'", buf, 256); + UnicodeString first((UChar)0x0061); + UnicodeString second((UChar)0); + RuleBasedCollator *coll = new RuleBasedCollator(UnicodeString(buf, len), status); + if(U_FAILURE(status)) { + errln("Failed to open collator"); + } + UCollationResult res = coll->compare(first, second, status); + if(res != UCOL_LESS) { + errln("a should be less then NULL after tailoring"); + } + delete coll; +} + void CollationAPITest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par */) { if (exec) logln("TestSuite CollationAPITest: "); @@ -2134,6 +2162,7 @@ void CollationAPITest::runIndexedTest( int32_t index, UBool exec, const char* &n case 19: name = "TestGetTailoredSet"; if (exec) TestGetTailoredSet(); break; case 20: name = "TestUClassID"; if (exec) TestUClassID(); break; case 21: name = "TestSubclass"; if (exec) TestSubclass(); break; + case 22: name = "TestNULLCharTailoring"; if (exec) TestNULLCharTailoring(); break; default: name = ""; break; } } diff --git a/icuSources/test/intltest/apicoll.h b/icuSources/test/intltest/apicoll.h index 95710e5e..d08400c1 100644 --- a/icuSources/test/intltest/apicoll.h +++ b/icuSources/test/intltest/apicoll.h @@ -1,8 +1,8 @@ -/******************************************************************** +/*********************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ + * Copyright (c) 1997-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ***********************************************************************/ /** * CollationAPITest is a third level test class. This test performs API @@ -149,16 +149,21 @@ public: */ void TestGetTailoredSet(); - /** + /** * Tests the subclassability */ void TestSubclass(); - /** + /** * Tests the dynamic and static ids of collation classes */ void TestUClassID(); + /** + * Test NULL + */ + void TestNULLCharTailoring(); + private: // If this is too small for the test data, just increase it. // Just don't make it too large, otherwise the executable will get too big diff --git a/icuSources/test/intltest/astrotst.cpp b/icuSources/test/intltest/astrotst.cpp new file mode 100644 index 00000000..0a40f540 --- /dev/null +++ b/icuSources/test/intltest/astrotst.cpp @@ -0,0 +1,432 @@ +/******************************************************************** + * COPYRIGHT: + * Copyright (c) 1996-2004, International Business Machines Corporation and + * others. All Rights Reserved. + ********************************************************************/ + +/* Test CalendarAstronomer for C++ */ + +#include "unicode/utypes.h" +#include "string.h" +#include "unicode/locid.h" + +#if !UCONFIG_NO_FORMATTING + +#include "astro.h" +#include "astrotst.h" +#include "gregoimp.h" // for Math +#include "unicode/simpletz.h" + + +static const double DAY_MS = 24.*60.*60.*1000.; + +#define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); logln((UnicodeString)""); test(); } break + +AstroTest::AstroTest(): astro(NULL), gc(NULL) { +} + +void AstroTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) +{ + if (exec) logln("TestSuite AstroTest"); + switch (index) { + // CASE(0,FooTest); + CASE(0,TestSolarLongitude); + CASE(1,TestLunarPosition); + CASE(2,TestCoordinates); + CASE(3,TestCoverage); + CASE(4,TestSunriseTimes); + CASE(5,TestBasics); + default: name = ""; break; + } +} + +#undef CASE + +#define ASSERT_OK(x) if(U_FAILURE(x)) { errln("%s:%d: %s\n", __FILE__, __LINE__, u_errorName(x)); return; } + + +void AstroTest::initAstro(UErrorCode &status) { + if(U_FAILURE(status)) return; + + if((astro != NULL) || (gc != NULL)) { + errln("Err: initAstro() called twice!"); + closeAstro(status); + if(U_SUCCESS(status)) { + status = U_INTERNAL_PROGRAM_ERROR; + } + } + + if(U_FAILURE(status)) return; + + astro = new CalendarAstronomer(); + gc = Calendar::createInstance(TimeZone::getGMT()->clone(), status); +} + +void AstroTest::closeAstro(UErrorCode &/*status*/) { + if(astro != NULL) { + delete astro; + astro = NULL; + } + if(gc != NULL) { + delete gc; + gc = NULL; + } +} + +void AstroTest::TestSolarLongitude(void) { + UErrorCode status = U_ZERO_ERROR; + initAstro(status); + ASSERT_OK(status); + + struct { + int32_t d[5]; double f ; + } tests[] = { + { { 1980, 7, 27, 0, 00 }, 124.114347 }, + { { 1988, 7, 27, 00, 00 }, 124.187732 } + }; + + logln(""); + for (uint32_t i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) { + gc->clear(); + gc->set(tests[i].d[0], tests[i].d[1]-1, tests[i].d[2], tests[i].d[3], tests[i].d[4]); + + astro->setDate(gc->getTime(status)); + + double longitude = astro->getSunLongitude(); + //longitude = 0; + CalendarAstronomer::Equatorial result; + astro->getSunPosition(result); + logln((UnicodeString)"Sun position is " + result.toString() + (UnicodeString)"; " /* + result.toHmsString()*/ + " Sun longitude is " + longitude ); + } + closeAstro(status); + ASSERT_OK(status); +} + + + +void AstroTest::TestLunarPosition(void) { + UErrorCode status = U_ZERO_ERROR; + initAstro(status); + ASSERT_OK(status); + + static const double tests[][7] = { + { 1979, 2, 26, 16, 00, 0, 0 } + }; + logln(""); + + for (int32_t i = 0; i < (int32_t)(sizeof(tests)/sizeof(tests[0])); i++) { + gc->clear(); + gc->set((int32_t)tests[i][0], (int32_t)tests[i][1]-1, (int32_t)tests[i][2], (int32_t)tests[i][3], (int32_t)tests[i][4]); + astro->setDate(gc->getTime(status)); + + const CalendarAstronomer::Equatorial& result = astro->getMoonPosition(); + logln((UnicodeString)"Moon position is " + result.toString() + (UnicodeString)"; " /* + result->toHmsString()*/); + } + + closeAstro(status); + ASSERT_OK(status); +} + + + +void AstroTest::TestCoordinates(void) { + UErrorCode status = U_ZERO_ERROR; + initAstro(status); + ASSERT_OK(status); + + CalendarAstronomer::Equatorial result; + astro->eclipticToEquatorial(result, 139.686111 * CalendarAstronomer::PI / 180.0, 4.875278* CalendarAstronomer::PI / 180.0); + logln((UnicodeString)"result is " + result.toString() + (UnicodeString)"; " /* + result.toHmsString()*/ ); + closeAstro(status); + ASSERT_OK(status); +} + + + +void AstroTest::TestCoverage(void) { + UErrorCode status = U_ZERO_ERROR; + initAstro(status); + ASSERT_OK(status); + GregorianCalendar *cal = new GregorianCalendar(1958, UCAL_AUGUST, 15,status); + UDate then = cal->getTime(status); + CalendarAstronomer *myastro = new CalendarAstronomer(then); + ASSERT_OK(status); + + //Latitude: 34 degrees 05' North + //Longitude: 118 degrees 22' West + double laLat = 34 + 5./60, laLong = 360 - (118 + 22./60); + CalendarAstronomer *myastro2 = new CalendarAstronomer(laLong, laLat); + + double eclLat = laLat * CalendarAstronomer::PI / 360; + double eclLong = laLong * CalendarAstronomer::PI / 360; + + CalendarAstronomer::Ecliptic ecl(eclLat, eclLong); + CalendarAstronomer::Equatorial eq; + CalendarAstronomer::Horizon hor; + + logln("ecliptic: " + ecl.toString()); + CalendarAstronomer *myastro3 = new CalendarAstronomer(); + myastro3->setJulianDay((4713 + 2000) * 365.25); + + CalendarAstronomer *astronomers[] = { + myastro, myastro2, myastro3, myastro2 // check cache + }; + + for (uint32_t i = 0; i < sizeof(astronomers)/sizeof(astronomers[0]); ++i) { + CalendarAstronomer *anAstro = astronomers[i]; + + //logln("astro: " + astro); + logln((UnicodeString)" date: " + anAstro->getTime()); + logln((UnicodeString)" cent: " + anAstro->getJulianCentury()); + logln((UnicodeString)" gw sidereal: " + anAstro->getGreenwichSidereal()); + logln((UnicodeString)" loc sidereal: " + anAstro->getLocalSidereal()); + logln((UnicodeString)" equ ecl: " + (anAstro->eclipticToEquatorial(eq,ecl)).toString()); + logln((UnicodeString)" equ long: " + (anAstro->eclipticToEquatorial(eq, eclLong)).toString()); + logln((UnicodeString)" horiz: " + (anAstro->eclipticToHorizon(hor, eclLong)).toString()); + logln((UnicodeString)" sunrise: " + (anAstro->getSunRiseSet(TRUE))); + logln((UnicodeString)" sunset: " + (anAstro->getSunRiseSet(FALSE))); + logln((UnicodeString)" moon phase: " + anAstro->getMoonPhase()); + logln((UnicodeString)" moonrise: " + (anAstro->getMoonRiseSet(TRUE))); + logln((UnicodeString)" moonset: " + (anAstro->getMoonRiseSet(FALSE))); + logln((UnicodeString)" prev summer solstice: " + (anAstro->getSunTime(CalendarAstronomer::SUMMER_SOLSTICE(), FALSE))); + logln((UnicodeString)" next summer solstice: " + (anAstro->getSunTime(CalendarAstronomer::SUMMER_SOLSTICE(), TRUE))); + logln((UnicodeString)" prev full moon: " + (anAstro->getMoonTime(CalendarAstronomer::FULL_MOON(), FALSE))); + logln((UnicodeString)" next full moon: " + (anAstro->getMoonTime(CalendarAstronomer::FULL_MOON(), TRUE))); + } + + delete myastro2; + delete myastro3; + delete myastro; + delete cal; + + closeAstro(status); + ASSERT_OK(status); +} + + + +void AstroTest::TestSunriseTimes(void) { + UErrorCode status = U_ZERO_ERROR; + initAstro(status); + ASSERT_OK(status); + + // logln("Sunrise/Sunset times for San Jose, California, USA"); + // CalendarAstronomer *astro2 = new CalendarAstronomer(-121.55, 37.20); + // TimeZone *tz = TimeZone::createTimeZone("America/Los_Angeles"); + + // We'll use a table generated by the UNSO website as our reference + // From: http://aa.usno.navy.mil/ + //-Location: W079 25, N43 40 + //-Rise and Set for the Sun for 2001 + //-Zone: 4h West of Greenwich + int32_t USNO[] = { + 6,59, 19,45, + 6,57, 19,46, + 6,56, 19,47, + 6,54, 19,48, + 6,52, 19,49, + 6,50, 19,51, + 6,48, 19,52, + 6,47, 19,53, + 6,45, 19,54, + 6,43, 19,55, + 6,42, 19,57, + 6,40, 19,58, + 6,38, 19,59, + 6,36, 20, 0, + 6,35, 20, 1, + 6,33, 20, 3, + 6,31, 20, 4, + 6,30, 20, 5, + 6,28, 20, 6, + 6,27, 20, 7, + 6,25, 20, 8, + 6,23, 20,10, + 6,22, 20,11, + 6,20, 20,12, + 6,19, 20,13, + 6,17, 20,14, + 6,16, 20,16, + 6,14, 20,17, + 6,13, 20,18, + 6,11, 20,19, + }; + + logln("Sunrise/Sunset times for Toronto, Canada"); + // long = 79 25", lat = 43 40" + CalendarAstronomer *astro3 = new CalendarAstronomer(-(79+25/60), 43+40/60); + + // As of ICU4J 2.8 the ICU4J time zones implement pass-through + // to the underlying JDK. Because of variation in the + // underlying JDKs, we have to use a fixed-offset + // SimpleTimeZone to get consistent behavior between JDKs. + // The offset we want is [-18000000, 3600000] (raw, dst). + // [aliu 10/15/03] + + // TimeZone tz = TimeZone.getTimeZone("America/Montreal"); + TimeZone *tz = new SimpleTimeZone(-18000000 + 3600000, "Montreal(FIXED)"); + + GregorianCalendar *cal = new GregorianCalendar(tz->clone(), Locale::getUS(), status); + GregorianCalendar *cal2 = new GregorianCalendar(tz->clone(), Locale::getUS(), status); + cal->clear(); + cal->set(UCAL_YEAR, 2001); + cal->set(UCAL_MONTH, UCAL_APRIL); + cal->set(UCAL_DAY_OF_MONTH, 1); + cal->set(UCAL_HOUR_OF_DAY, 12); // must be near local noon for getSunRiseSet to work + + DateFormat *df_t = DateFormat::createTimeInstance(DateFormat::MEDIUM,Locale::getUS()); + DateFormat *df_d = DateFormat::createDateInstance(DateFormat::MEDIUM,Locale::getUS()); + DateFormat *df_dt = DateFormat::createDateTimeInstance(DateFormat::MEDIUM, DateFormat::MEDIUM, Locale::getUS()); + df_t->adoptTimeZone(tz->clone()); + df_d->adoptTimeZone(tz->clone()); + df_dt->adoptTimeZone(tz->clone()); + + for (int32_t i=0; i < 30; i++) { + logln("setDate\n"); + astro3->setDate(cal->getTime(status)); + logln("getRiseSet(TRUE)\n"); + UDate sunrise = astro3->getSunRiseSet(TRUE); + logln("getRiseSet(FALSE)\n"); + UDate sunset = astro3->getSunRiseSet(FALSE); + logln("end of getRiseSet\n"); + + cal2->setTime(cal->getTime(status), status); + cal2->set(UCAL_SECOND, 0); + cal2->set(UCAL_MILLISECOND, 0); + + cal2->set(UCAL_HOUR_OF_DAY, USNO[4*i+0]); + cal2->set(UCAL_MINUTE, USNO[4*i+1]); + UDate exprise = cal2->getTime(status); + cal2->set(UCAL_HOUR_OF_DAY, USNO[4*i+2]); + cal2->set(UCAL_MINUTE, USNO[4*i+3]); + UDate expset = cal2->getTime(status); + // Compute delta of what we got to the USNO data, in seconds + int32_t deltarise = (int32_t)uprv_fabs((sunrise - exprise) / 1000); + int32_t deltaset = (int32_t)uprv_fabs((sunset - expset) / 1000); + + // Allow a deviation of 0..MAX_DEV seconds + // It would be nice to get down to 60 seconds, but at this + // point that appears to be impossible without a redo of the + // algorithm using something more advanced than Duffett-Smith. + int32_t MAX_DEV = 180; + UnicodeString s1, s2, s3, s4, s5; + if (deltarise > MAX_DEV || deltaset > MAX_DEV) { + if (deltarise > MAX_DEV) { + errln("FAIL: (rise) " + df_d->format(cal->getTime(status),s1) + + ", Sunrise: " + df_dt->format(sunrise, s2) + + " (USNO " + df_t->format(exprise,s3) + + " d=" + deltarise + "s)"); + } else { + logln(df_d->format(cal->getTime(status),s1) + + ", Sunrise: " + df_dt->format(sunrise,s2) + + " (USNO " + df_t->format(exprise,s3) + ")"); + } + s1.remove(); s2.remove(); s3.remove(); s4.remove(); s5.remove(); + if (deltaset > MAX_DEV) { + errln("FAIL: (set) " + df_d->format(cal->getTime(status),s1) + + ", Sunset: " + df_dt->format(sunset,s2) + + " (USNO " + df_t->format(expset,s3) + + " d=" + deltaset + "s)"); + } else { + logln(df_d->format(cal->getTime(status),s1) + + ", Sunset: " + df_dt->format(sunset,s2) + + " (USNO " + df_t->format(expset,s3) + ")"); + } + } else { + logln(df_d->format(cal->getTime(status),s1) + + ", Sunrise: " + df_dt->format(sunrise,s2) + + " (USNO " + df_t->format(exprise,s3) + ")" + + ", Sunset: " + df_dt->format(sunset,s4) + + " (USNO " + df_t->format(expset,s5) + ")"); + } + cal->add(UCAL_DATE, 1, status); + } + + // CalendarAstronomer a = new CalendarAstronomer(-(71+5/60), 42+37/60); + // cal.clear(); + // cal.set(cal.YEAR, 1986); + // cal.set(cal.MONTH, cal.MARCH); + // cal.set(cal.DATE, 10); + // cal.set(cal.YEAR, 1988); + // cal.set(cal.MONTH, cal.JULY); + // cal.set(cal.DATE, 27); + // a.setDate(cal.getTime()); + // long r = a.getSunRiseSet2(true); + delete astro3; + delete tz; + delete cal; + delete cal2; + delete df_t; + delete df_d; + delete df_dt; + closeAstro(status); + ASSERT_OK(status); +} + + + +void AstroTest::TestBasics(void) { + UErrorCode status = U_ZERO_ERROR; + initAstro(status); + ASSERT_OK(status); + + // Check that our JD computation is the same as the book's (p. 88) + GregorianCalendar *cal3 = new GregorianCalendar(TimeZone::getGMT()->clone(), Locale::getUS(), status); + DateFormat *d3 = DateFormat::createDateTimeInstance(DateFormat::MEDIUM,DateFormat::MEDIUM,Locale::getUS()); + d3->setTimeZone(*TimeZone::getGMT()); + cal3->clear(); + cal3->set(UCAL_YEAR, 1980); + cal3->set(UCAL_MONTH, UCAL_JULY); + cal3->set(UCAL_DATE, 2); + logln("cal3[a]=%.1lf, d=%d\n", cal3->getTime(status), cal3->get(UCAL_JULIAN_DAY,status)); + { + UnicodeString s; + logln(UnicodeString("cal3[a] = ") + d3->format(cal3->getTime(status),s)); + } + cal3->clear(); + cal3->set(UCAL_YEAR, 1980); + cal3->set(UCAL_MONTH, UCAL_JULY); + cal3->set(UCAL_DATE, 27); + logln("cal3=%.1lf, d=%d\n", cal3->getTime(status), cal3->get(UCAL_JULIAN_DAY,status)); + + ASSERT_OK(status); + { + UnicodeString s; + logln(UnicodeString("cal3 = ") + d3->format(cal3->getTime(status),s)); + } + astro->setTime(cal3->getTime(status)); + double jd = astro->getJulianDay() - 2447891.5; + double exp = -3444.; + if (jd == exp) { + UnicodeString s; + logln(d3->format(cal3->getTime(status),s) + " => " + jd); + } else { + UnicodeString s; + errln("FAIL: " + d3->format(cal3->getTime(status), s) + " => " + jd + + ", expected " + exp); + } + + // cal3.clear(); + // cal3.set(cal3.YEAR, 1990); + // cal3.set(cal3.MONTH, Calendar.JANUARY); + // cal3.set(cal3.DATE, 1); + // cal3.add(cal3.DATE, -1); + // astro.setDate(cal3.getTime()); + // astro.foo(); + + delete cal3; + delete d3; + ASSERT_OK(status); + closeAstro(status); + ASSERT_OK(status); + +} + + +// TODO: try finding next new moon after 07/28/1984 16:00 GMT + + +#endif + + + diff --git a/icuSources/test/intltest/astrotst.h b/icuSources/test/intltest/astrotst.h new file mode 100644 index 00000000..2ca062cf --- /dev/null +++ b/icuSources/test/intltest/astrotst.h @@ -0,0 +1,49 @@ +/******************************************************************** + * COPYRIGHT: + * Copyright (c) 1997-2003, International Business Machines Corporation and + * others. All Rights Reserved. + ********************************************************************/ + +#ifndef __AstroTest__ +#define __AstroTest__ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/calendar.h" +#include "unicode/gregocal.h" +#include "unicode/smpdtfmt.h" +#include "astro.h" +#include "caltztst.h" + +class AstroTest: public CalendarTimeZoneTest { +public: + // IntlTest override + void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par ); +public: + AstroTest(); + + void TestSolarLongitude(void); + + void TestLunarPosition(void); + + void TestCoordinates(void); + + void TestCoverage(void); + + void TestSunriseTimes(void); + + void TestBasics(void); + private: + void initAstro(UErrorCode&); + void closeAstro(UErrorCode&); + + CalendarAstronomer *astro; + Calendar *gc; + +}; + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif // __AstroTest__ diff --git a/icuSources/test/intltest/calcasts.cpp b/icuSources/test/intltest/calcasts.cpp new file mode 100644 index 00000000..ff99fa0a --- /dev/null +++ b/icuSources/test/intltest/calcasts.cpp @@ -0,0 +1,301 @@ +/******************************************************************** + * COPYRIGHT: + * Copyright (c) 2003-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ******************************************************************** + * Calendar Case Test is a type of CalendarTest which compares the + * behavior of a calendar to a certain set of 'test cases', involving + * conversion between julian-day to fields and vice versa. + ********************************************************************/ + +#include "calcasts.h" + +#if !UCONFIG_NO_FORMATTING +// ======= 'Main' =========================== + +#include "hebrwcal.h" // for Eras +#include "unicode/datefmt.h" + +#define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); logln((UnicodeString)""); test(); } break + + +void CalendarCaseTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) +{ + if (exec) logln("TestSuite CalendarCaseTest"); + switch (index) { + CASE(0,IslamicCivil); + CASE(1,Hebrew); + default: name = ""; break; + } +} + +#undef CASE + +// ======= Utility functions ================= + +void CalendarCaseTest::doTestCases(const TestCase *cases, Calendar *cal) { + static const int32_t ONE_SECOND = 1000; + static const int32_t ONE_MINUTE = 60*ONE_SECOND; + static const int32_t ONE_HOUR = 60*ONE_MINUTE; + static const double ONE_DAY = 24*ONE_HOUR; + static const double JULIAN_EPOCH = -210866760000000.; // 1/1/4713 BC 12:00 + int32_t i; + UErrorCode status = U_ZERO_ERROR; + cal->adoptTimeZone(TimeZone::getGMT()->clone()); + for(i=0;cases[i].era>=0;i++) { + UDate t = (JULIAN_EPOCH+(ONE_DAY*cases[i].julian)); + + logln("Test case %d: julianday%f -> date %f\n", i, cases[i].julian, t); + + // Millis -> fields + cal->setTime(t, status); + + logln(calToStr(*cal)); + + checkField(cal, UCAL_ERA, cases[i].era, status); + checkField(cal, UCAL_YEAR, cases[i].year,status); + checkField(cal, UCAL_MONTH, cases[i].month - 1,status); + checkField(cal, UCAL_DATE, cases[i].day,status); + checkField(cal, UCAL_DAY_OF_WEEK, cases[i].dayOfWeek,status); + checkField(cal, UCAL_HOUR, cases[i].hour,status); + checkField(cal, UCAL_MINUTE, cases[i].min,status); + checkField(cal, UCAL_SECOND, cases[i].sec,status); + + // Fields -> millis + cal->clear(); + + cal->set(UCAL_ERA, cases[i].era); + cal->set(UCAL_YEAR, cases[i].year); + cal->set(UCAL_MONTH, cases[i].month - 1); + cal->set(UCAL_DATE, cases[i].day); + cal->set(UCAL_DAY_OF_WEEK, cases[i].dayOfWeek); + cal->set(UCAL_HOUR, cases[i].hour); + cal->set(UCAL_MINUTE, cases[i].min); + cal->set(UCAL_SECOND, cases[i].sec); + + UDate t2 = cal->getTime(status); + + if(t != t2) { + errln("Field->millis: Expected %.0f but got %.0f\n", t, t2); + logln(calToStr(*cal)); + } + } +} + +UBool CalendarCaseTest::checkField(Calendar *cal, UCalendarDateFields field, int32_t value, UErrorCode &status) +{ + if(U_FAILURE(status)) return FALSE; + int32_t res = cal->get(field, status); + if(U_FAILURE(status)) { + errln((UnicodeString)"Checking field " + fieldName(field) + " and got " + u_errorName(status)); + return FALSE; + } + if(res != value) { + errln((UnicodeString)"FAIL: Checking field " + fieldName(field) + " expected " + value + " and got " + res + UnicodeString("\n")); + return FALSE; + } else { + logln((UnicodeString)"Checking field " + fieldName(field) + " == " + value + UnicodeString("\n")); + } + return TRUE; +} + +// =========== Test Cases ===================== +enum { SUN=UCAL_SUNDAY, + MON=UCAL_MONDAY, + TUE=UCAL_TUESDAY, + WED=UCAL_WEDNESDAY, + THU=UCAL_THURSDAY, + FRI=UCAL_FRIDAY, + SAT=UCAL_SATURDAY}; + +void CalendarCaseTest::IslamicCivil() +{ + static const TestCase tests[] = { + // + // Most of these test cases were taken from the back of + // "Calendrical Calculations", with some extras added to help + // debug a few of the problems that cropped up in development. + // + // The months in this table are 1-based rather than 0-based, + // because it's easier to edit that way. + // Islamic + // Julian Day Era Year Month Day WkDay Hour Min Sec + { 1507231.5, 0, -1245, 12, 9, SUN, 0, 0, 0}, + { 1660037.5, 0, -813, 2, 23, WED, 0, 0, 0}, + { 1746893.5, 0, -568, 4, 1, WED, 0, 0, 0}, + { 1770641.5, 0, -501, 4, 6, SUN, 0, 0, 0}, + { 1892731.5, 0, -157, 10, 17, WED, 0, 0, 0}, + { 1931579.5, 0, -47, 6, 3, MON, 0, 0, 0}, + { 1974851.5, 0, 75, 7, 13, SAT, 0, 0, 0}, + { 2091164.5, 0, 403, 10, 5, SUN, 0, 0, 0}, + { 2121509.5, 0, 489, 5, 22, SUN, 0, 0, 0}, + { 2155779.5, 0, 586, 2, 7, FRI, 0, 0, 0}, + { 2174029.5, 0, 637, 8, 7, SAT, 0, 0, 0}, + { 2191584.5, 0, 687, 2, 20, FRI, 0, 0, 0}, + { 2195261.5, 0, 697, 7, 7, SUN, 0, 0, 0}, + { 2229274.5, 0, 793, 7, 1, SUN, 0, 0, 0}, + { 2245580.5, 0, 839, 7, 6, WED, 0, 0, 0}, + { 2266100.5, 0, 897, 6, 1, SAT, 0, 0, 0}, + { 2288542.5, 0, 960, 9, 30, SAT, 0, 0, 0}, + { 2290901.5, 0, 967, 5, 27, SAT, 0, 0, 0}, + { 2323140.5, 0, 1058, 5, 18, WED, 0, 0, 0}, + { 2334848.5, 0, 1091, 6, 2, SUN, 0, 0, 0}, + { 2348020.5, 0, 1128, 8, 4, FRI, 0, 0, 0}, + { 2366978.5, 0, 1182, 2, 3, SUN, 0, 0, 0}, + { 2385648.5, 0, 1234, 10, 10, MON, 0, 0, 0}, + { 2392825.5, 0, 1255, 1, 11, WED, 0, 0, 0}, + { 2416223.5, 0, 1321, 1, 21, SUN, 0, 0, 0}, + { 2425848.5, 0, 1348, 3, 19, SUN, 0, 0, 0}, + { 2430266.5, 0, 1360, 9, 8, MON, 0, 0, 0}, + { 2430833.5, 0, 1362, 4, 13, MON, 0, 0, 0}, + { 2431004.5, 0, 1362, 10, 7, THU, 0, 0, 0}, + { 2448698.5, 0, 1412, 9, 13, TUE, 0, 0, 0}, + { 2450138.5, 0, 1416, 10, 5, SUN, 0, 0, 0}, + { 2465737.5, 0, 1460, 10, 12, WED, 0, 0, 0}, + { 2486076.5, 0, 1518, 3, 5, SUN, 0, 0, 0}, + { -1,-1,-1,-1,-1,-1,-1,-1,-1 } + }; + + UErrorCode status = U_ZERO_ERROR; + Calendar *c = Calendar::createInstance("ar@calendar=islamic-civil", status); + c->setLenient(TRUE); + doTestCases(tests, c); + + static const UChar expectedUChars[] = { + 0x0627, 0x0644, 0x062e, 0x0645, 0x064a, 0x0633, 0x002c, 0x0020, 0x0662, 0x0662, + 0x0020, 0x0634, 0x0648, 0x0627, 0x0644, 0x002c, 0x0020, 0x0661, 0x0663, 0x0668, + 0x0669, 0 + }; + UnicodeString result; + DateFormat *fmt = DateFormat::createDateInstance(DateFormat::kFull, Locale("ar_JO@calendar=islamic-civil")); + fmt->setTimeZone(*TimeZone::getGMT()); + fmt->format((UDate)2486076.5, result); + if (result != expectedUChars) { + errln((UnicodeString)"FAIL: DateFormatting failed. Got " + result + " and expected " + UnicodeString(expectedUChars) + UnicodeString("\n")); + errln("Maybe the resource aliasing isn't working"); + } + delete fmt; + delete c; +} + +void CalendarCaseTest::Hebrew() { + static const int32_t TISHRI = HebrewCalendar::TISHRI; + //static const int32_t HESHVAN = HebrewCalendar::HESHVAN; + //static const int32_t KISLEV = HebrewCalendar::KISLEV; + //static const int32_t TEVET = HebrewCalendar::TEVET; + //static const int32_t SHEVAT = HebrewCalendar::SHEVAT; + //static const int32_t ADAR_1 = HebrewCalendar::ADAR_1; + //static const int32_t ADAR = HebrewCalendar::ADAR; + //static const int32_t NISAN = HebrewCalendar::NISAN; + //static const int32_t IYAR = HebrewCalendar::IYAR; + //static const int32_t SIVAN = HebrewCalendar::SIVAN; + //static const int32_t TAMUZ = HebrewCalendar::TAMUZ; + static const int32_t AV = HebrewCalendar::AV; + static const int32_t ELUL = HebrewCalendar::ELUL; + + static const TestCase tests[] = { + // + // Most of these test cases were taken from the back of + // "Calendrical Calculations", with some extras added to help + // debug a few of the problems that cropped up in development. + // + // The months in this table are 1-based rather than 0-based, + // because it's easier to edit that way. + // + // Julian Day Era Year Month Day WkDay Hour Min Sec + {1507231.5, 0, 3174, 12, 10, SUN, 0, 0, 0}, + {1660037.5, 0, 3593, 3, 25, WED, 0, 0, 0}, + {1746893.5, 0, 3831, 1, 3, WED, 0, 0, 0}, + {1770641.5, 0, 3896, 1, 9, SUN, 0, 0, 0}, + {1892731.5, 0, 4230, 4, 18, WED, 0, 0, 0}, + {1931579.5, 0, 4336, 10, 4, MON, 0, 0, 0}, + {1974851.5, 0, 4455, 2, 13, SAT, 0, 0, 0}, + {2091164.5, 0, 4773, 9, 6, SUN, 0, 0, 0}, + {2121509.5, 0, 4856, 9, 23, SUN, 0, 0, 0}, + {2155779.5, 0, 4950, 8, 7, FRI, 0, 0, 0}, + {2174029.5, 0, 5000, 7, 8, SAT, 0, 0, 0}, + {2191584.5, 0, 5048, 8, 21, FRI, 0, 0, 0}, + {2195261.5, 0, 5058, 9, 7, SUN, 0, 0, 0}, + {2229274.5, 0, 5151, 11, 1, SUN, 0, 0, 0}, + {2245580.5, 0, 5196, 5, 7, WED, 0, 0, 0}, + {2266100.5, 0, 5252, 8, 3, SAT, 0, 0, 0}, + {2288542.5, 0, 5314, 1, 1, SAT, 0, 0, 0}, + {2290901.5, 0, 5320, 6, 27, SAT, 0, 0, 0}, + {2323140.5, 0, 5408, 10, 20, WED, 0, 0, 0}, + {2334551.5, 0, 5440, 1, 1, THU, 0, 0, 0}, + {2334581.5, 0, 5440, 2, 1, SAT, 0, 0, 0}, + {2334610.5, 0, 5440, 3, 1, SUN, 0, 0, 0}, + {2334639.5, 0, 5440, 4, 1, MON, 0, 0, 0}, + {2334668.5, 0, 5440, 5, 1, TUE, 0, 0, 0}, + {2334698.5, 0, 5440, 6, 1, THU, 0, 0, 0}, + {2334728.5, 0, 5440, 7, 1, SAT, 0, 0, 0}, + {2334757.5, 0, 5440, 8, 1, SUN, 0, 0, 0}, + {2334787.5, 0, 5440, 9, 1, TUE, 0, 0, 0}, + {2334816.5, 0, 5440, 10, 1, WED, 0, 0, 0}, + {2334846.5, 0, 5440, 11, 1, FRI, 0, 0, 0}, + {2334848.5, 0, 5440, 11, 3, SUN, 0, 0, 0}, + {2334934.5, 0, 5441, 1, 1, TUE, 0, 0, 0}, + {2348020.5, 0, 5476, 12, 5, FRI, 0, 0, 0}, + {2366978.5, 0, 5528, 11, 4, SUN, 0, 0, 0}, + {2385648.5, 0, 5579, 12, 11, MON, 0, 0, 0}, + {2392825.5, 0, 5599, 8, 12, WED, 0, 0, 0}, + {2416223.5, 0, 5663, 8, 22, SUN, 0, 0, 0}, + {2425848.5, 0, 5689, 12, 19, SUN, 0, 0, 0}, + {2430266.5, 0, 5702, 1, 8, MON, 0, 0, 0}, + {2430833.5, 0, 5703, 8, 14, MON, 0, 0, 0}, + {2431004.5, 0, 5704, 1, 8, THU, 0, 0, 0}, + {2448698.5, 0, 5752, 7, 12, TUE, 0, 0, 0}, + {2450138.5, 0, 5756, 7, 5, SUN, 0, 0, 0}, + {2465737.5, 0, 5799, 2, 12, WED, 0, 0, 0}, + {2486076.5, 0, 5854, 12, 5, SUN, 0, 0, 0}, + + // Test cases taken from a table of 14 "year types" in the Help file + // of the application "Hebrew Calendar" + {2456187.5, 0, 5773, 1, 1, MON, 0, 0, 0}, + {2459111.5, 0, 5781, 1, 1, SAT, 0, 0, 0}, + {2453647.5, 0, 5766, 1, 1, TUE, 0, 0, 0}, + {2462035.5, 0, 5789, 1, 1, THU, 0, 0, 0}, + {2458756.5, 0, 5780, 1, 1, MON, 0, 0, 0}, + {2460586.5, 0, 5785, 1, 1, THU, 0, 0, 0}, + {2463864.5, 0, 5794, 1, 1, SAT, 0, 0, 0}, + {2463481.5, 0, 5793, 1, 1, MON, 0, 0, 0}, + {2470421.5, 0, 5812, 1, 1, THU, 0, 0, 0}, + {2460203.5, 0, 5784, 1, 1, SAT, 0, 0, 0}, + {2459464.5, 0, 5782, 1, 1, TUE, 0, 0, 0}, + {2467142.5, 0, 5803, 1, 1, MON, 0, 0, 0}, + {2455448.5, 0, 5771, 1, 1, THU, 0, 0, 0}, + // Test cases for JB#2327 + // http://www.fourmilab.com/documents/calendar/ + // http://www.calendarhome.com/converter/ + // 2452465.5, 2002, JULY, 10, 5762, AV, 1, + // 2452494.5, 2002, AUGUST, 8, 5762, AV, 30, + // 2452495.5, 2002, AUGUST, 9, 5762, ELUL, 1, + // 2452523.5, 2002, SEPTEMBER, 6, 5762, ELUL, 29, + // 2452524.5, 2002, SEPTEMBER, 7, 5763, TISHRI, 1, + // Julian Day Era Year Month Day WkDay Hour Min Sec + {2452465.5, 0, 5762, AV+1, 1, WED, 0, 0, 0}, + {2452494.5, 0, 5762, AV+1, 30, THU, 0, 0, 0}, + {2452495.5, 0, 5762, ELUL+1, 1, FRI, 0, 0, 0}, + {2452523.5, 0, 5762, ELUL+1, 29, FRI, 0, 0, 0}, + {2452524.5, 0, 5763, TISHRI+1, 1, SAT, 0, 0, 0}, + { -1,-1,-1,-1,-1,-1,-1,-1,-1 } + }; + + UErrorCode status = U_ZERO_ERROR; + Calendar *c = Calendar::createInstance("he_HE@calendar=hebrew", status); + c->setLenient(TRUE); + doTestCases(tests, c); + + + // Additional test cases for bugs found during development + // G.YY/MM/DD Era Year Month Day WkDay Hour Min Sec + //{1013, 9, 8, 0, 4774, 1, 1, TUE, 0, 0, 0}, + //{1239, 9, 1, 0, 5000, 1, 1, THU, 0, 0, 0}, + //{1240, 9,18, 0, 5001, 1, 1, TUE, 0, 0, 0}, + + + delete c; +} + + +#endif diff --git a/icuSources/test/intltest/calcasts.h b/icuSources/test/intltest/calcasts.h new file mode 100644 index 00000000..1f8e3c11 --- /dev/null +++ b/icuSources/test/intltest/calcasts.h @@ -0,0 +1,62 @@ +/******************************************************************** + * COPYRIGHT: + * Copyright (c) 2003, International Business Machines Corporation + * and others. All Rights Reserved. + ******************************************************************** + * Calendar Case Test is a type of CalendarTest which compares the + * behavior of a calendar to a certain set of 'test cases', involving + * conversion between julian-day to fields and vice versa. + ********************************************************************/ + +#ifndef __CalendarCaseTest__ +#define __CalendarCaseTest__ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/calendar.h" +#include "unicode/smpdtfmt.h" +#include "caltest.h" + +class CalendarCaseTest: public CalendarTest { + public: + virtual void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par ); + + /* Test case struct */ + struct TestCase { + double julian; // Julian Date + int32_t era; + int32_t year; + int32_t month; + int32_t day; + int32_t dayOfWeek; + int32_t hour; + int32_t min; + int32_t sec; + }; + + /** + * @param cases array of items to test. Terminate with a "-1" for era. + */ + void doTestCases(const TestCase *cases, Calendar *cal); + + private: + /** + * Utility function to test out a specific field + * @param cal calendar + * @param field which field + * @param value expected value + * @param status err status + * @return boolean indicating success (TRUE) or failure (FALSE) of the test. + */ + UBool checkField(Calendar *cal, UCalendarDateFields field, int32_t value, UErrorCode &status); + + private: + // test cases + void IslamicCivil(); + void Hebrew(); +}; + +#endif +#endif diff --git a/icuSources/test/intltest/callimts.cpp b/icuSources/test/intltest/callimts.cpp index df6147e4..a0e9333f 100644 --- a/icuSources/test/intltest/callimts.cpp +++ b/icuSources/test/intltest/callimts.cpp @@ -1,18 +1,20 @@ -/******************************************************************** +/*********************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ + * Copyright (c) 1997-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ***********************************************************************/ #include "unicode/utypes.h" #if !UCONFIG_NO_FORMATTING #include "callimts.h" +#include "caltest.h" #include "unicode/calendar.h" #include "unicode/gregocal.h" #include "unicode/datefmt.h" #include "unicode/smpdtfmt.h" +#include "putilimp.h" U_NAMESPACE_USE void CalendarLimitTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) @@ -40,6 +42,7 @@ void CalendarLimitTest::runIndexedTest( int32_t index, UBool exec, const char* & void CalendarLimitTest::test(UDate millis, U_NAMESPACE_QUALIFIER Calendar* cal, U_NAMESPACE_QUALIFIER DateFormat* fmt) { + static const UDate kDrift = 1e-10; UErrorCode exception = U_ZERO_ERROR; UnicodeString theDate; UErrorCode status = U_ZERO_ERROR; @@ -48,9 +51,11 @@ CalendarLimitTest::test(UDate millis, U_NAMESPACE_QUALIFIER Calendar* cal, U_NAM fmt->format(millis, theDate); UDate dt = fmt->parse(theDate, status); // allow a small amount of error (drift) - if(! withinErr(dt, millis, 1e-10)) - errln(UnicodeString("FAIL:round trip for large milli, got: ") + dt + " wanted: " + millis); - else { + if(! withinErr(dt, millis, kDrift)) { + errln("FAIL:round trip for large milli, got: %.1lf wanted: %.1lf. (delta %.2lf greater than %.2lf)", + dt, millis, uprv_fabs(millis-dt), uprv_fabs(dt*kDrift)); + logln(UnicodeString(" ") + theDate + " " + CalendarTest::calToStr(*cal)); + } else { logln(UnicodeString("OK: got ") + dt + ", wanted " + millis); logln(UnicodeString(" ") + theDate); } @@ -89,15 +94,18 @@ CalendarLimitTest::TestCalendarLimit() fmt->adoptCalendar(cal); ((SimpleDateFormat*) fmt)->applyPattern("HH:mm:ss.SSS zzz, EEEE, MMMM d, yyyy G"); + // This test used to test the algorithmic limits of the dates that // GregorianCalendar could handle. However, the algorithm has // been rewritten completely since then and the prior limits no // longer apply. Instead, we now do basic round-trip testing of // some extreme (but still manageable) dates. UDate m; - for ( m = 1e17; m < 1e18; m *= 1.1) { + logln("checking 1e16..1e17"); + for ( m = 1e16; m < 1e17; m *= 1.1) { test(m, cal, fmt); } + logln("checking -1e14..-1e15"); for ( m = -1e14; m > -1e15; m *= 1.1) { test(m, cal, fmt); } diff --git a/icuSources/test/intltest/calregts.cpp b/icuSources/test/intltest/calregts.cpp index 5310e9c8..3b2a98c2 100644 --- a/icuSources/test/intltest/calregts.cpp +++ b/icuSources/test/intltest/calregts.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -15,6 +15,7 @@ #include "unicode/smpdtfmt.h" #include "unicode/strenum.h" #include "cmemory.h" +#include "caltest.h" #include @@ -212,7 +213,6 @@ CalendarRegressionTest::test4031502() // This bug actually occurs on Windows NT as well, and doesn't // require the host zone to be set; it can be set in Java. UErrorCode status = U_ZERO_ERROR; - int32_t count = 0; StringEnumeration* ids = TimeZone::createEnumeration(); UBool bad = FALSE; for (int32_t i=0; icount(status); ++i) { @@ -525,7 +525,7 @@ void CalendarRegressionTest::dowTest(UBool lenient) if (min != UCAL_SUNDAY || max != UCAL_SATURDAY) errln("FAIL: Min/max bad"); if (dow < min || dow > max) - errln(UnicodeString("FAIL: Day of week ") + dow + " out of range"); + errln("FAIL: Day of week %d out of range [%d,%d]\n", dow, min, max); if (dow != UCAL_SUNDAY) errln("FAIL: Day of week should be SUNDAY Got " + dow); @@ -535,10 +535,10 @@ void CalendarRegressionTest::dowTest(UBool lenient) return; } - if(cal->getActualMinimum(UCAL_DAY_OF_WEEK) != min) { + if(cal->getActualMinimum(UCAL_DAY_OF_WEEK, status) != min) { errln("FAIL: actual minimum differs from minimum"); } - if(cal->getActualMinimum(Calendar::DAY_OF_WEEK) != min) { + if(cal->getActualMinimum(Calendar::DAY_OF_WEEK, status) != min) { errln("FAIL: actual minimum (Calendar::DAY_OF_WEEK) differs from minimum"); } if(((Calendar*)cal)->getActualMinimum(UCAL_DAY_OF_WEEK, status) != min) { @@ -589,6 +589,33 @@ void CalendarRegressionTest::test4073929() delete foo1; return; } + logln("foo1@%.0f - %d-%d-%d %d:%d:%d.%ds\n", foo1->getTime(status), + foo1->get(UCAL_YEAR, status), + foo1->get(UCAL_MONTH, status), + foo1->get(UCAL_DATE, status), + foo1->get(UCAL_HOUR, status), + foo1->get(UCAL_MINUTE, status), + foo1->get(UCAL_SECOND, status), + foo1->get(UCAL_MILLISECOND,status)); + foo1->add(UCAL_DATE, + 1, status); + logln("foo1@%.0f - %d-%d-%d %d:%d:%d.%ds after +\n", foo1->getTime(status), + foo1->get(UCAL_YEAR, status), + foo1->get(UCAL_MONTH, status), + foo1->get(UCAL_DATE, status), + foo1->get(UCAL_HOUR, status), + foo1->get(UCAL_MINUTE, status), + foo1->get(UCAL_SECOND, status), + foo1->get(UCAL_MILLISECOND ,status)); + foo1->add(UCAL_DATE, - 1, status); + logln("foo1@%.0f - %d-%d-%d %d:%d:%d.%ds after -\n", foo1->getTime(status), + foo1->get(UCAL_YEAR, status), + foo1->get(UCAL_MONTH, status), + foo1->get(UCAL_DATE, status), + foo1->get(UCAL_HOUR, status), + foo1->get(UCAL_MINUTE, status), + foo1->get(UCAL_SECOND, status), + foo1->get(UCAL_MILLISECOND, status)); + foo1->add(UCAL_DATE, + 1, status); int32_t testyear = foo1->get(UCAL_YEAR, status); int32_t testmonth = foo1->get(UCAL_MONTH, status); @@ -947,7 +974,6 @@ void CalendarRegressionTest::test4103271() testCal->add(UCAL_DATE, 1,status); } } - // Test field disambiguation with a few special hard-coded cases. // This shouldn't fail if the above cases aren't failing. int32_t DISAM_int [] = { @@ -1008,7 +1034,10 @@ void CalendarRegressionTest::test4103271() "-DOW" + dow + " expect:" + sdf.format(exp, str) + " got:" + sdf.format(got, str2)); if (got != exp) { - log(" FAIL"); + log(" FAIL (%s:%d, i=%d)", __FILE__, __LINE__, i); + logln(CalendarTest::calToStr(*testCal)); + testCal->setTime(exp, status); + logln(CalendarTest::calToStr(*testCal) + UnicodeString( " <<< expected ")); fail = TRUE; } logln(""); @@ -1029,7 +1058,6 @@ void CalendarRegressionTest::test4103271() } logln(""); } - // Now try adding and rolling UDate ADDROLL_date [] = { makeDate(1998, UCAL_DECEMBER, 25), makeDate(1999, UCAL_JANUARY, 1), @@ -1068,9 +1096,14 @@ void CalendarRegressionTest::test4103271() UDate got = testCal->getTime(status); str.remove(); str2.remove(); - log((ADDROLL_bool[i/2]? UnicodeString("add(WOY,"):UnicodeString("roll(WOY,")) + - amount + ") " + sdf.format(before, str) + " => " + - sdf.format(got, str2)); + UnicodeString opTypeStr; + if (ADDROLL_bool[i/2]) { + opTypeStr = UnicodeString("add(WOY,", ""); + } else { + opTypeStr = UnicodeString("roll(WOY,", ""); + } + log(opTypeStr + amount + ") " + sdf.format(before, str) + " => " + + sdf.format(got, str2)); if (after != got) { str.remove(); logln(UnicodeString(" exp:") + sdf.format(after, str) + " FAIL"); @@ -1086,9 +1119,8 @@ void CalendarRegressionTest::test4103271() got = testCal->getTime(status); str.remove(); str2.remove(); - log((ADDROLL_bool[i/2]?UnicodeString("add(WOY,"):UnicodeString("roll(WOY,")) + - (-amount) + ") " + sdf.format(after, str) + " => " + - sdf.format(got, str2)); + log(opTypeStr + (-amount) + ") " + sdf.format(after, str) + " => " + + sdf.format(got, str2)); if (before != got) { str.remove(); logln(UnicodeString(" exp:") + sdf.format(before, str) + " FAIL"); @@ -1096,7 +1128,6 @@ void CalendarRegressionTest::test4103271() } else logln(" ok"); } - if (fail) errln("Fail: Week of year misbehaving"); } @@ -1279,7 +1310,7 @@ void CalendarRegressionTest::test4118384() } delete cal; - cal = Calendar::createInstance(Locale("th_TH_TRADITIONAL"),status); + cal = Calendar::createInstance(Locale("th_TH@calendar=buddhist"),status); // test deprecated functions if (cal->getLeastMaximum(Calendar::HOUR) != 11 || cal->getMaximum(Calendar::HOUR) != 11) { @@ -1293,7 +1324,7 @@ void CalendarRegressionTest::test4118384() delete cal; // test deprecated functions - cal = Calendar::createInstance(Locale("ja_JP_TRADITIONAL"),status); + cal = Calendar::createInstance(Locale("ja_JP@calendar=japanese"),status); if (cal->getLeastMaximum(Calendar::HOUR) != 11 || cal->getMaximum(Calendar::HOUR) != 11) { errln("Fail: Japanese:[deprecated functions] maximum of HOUR field should be 11\n"); @@ -1726,19 +1757,19 @@ CalendarRegressionTest::Test4166109() } calendar->set(1998, UCAL_MARCH, 1); calendar->setMinimalDaysInFirstWeek(1); - logln(UnicodeString("Date: ") + calendar->getTime(status)); - + logln(UnicodeString("Date: ") + calendar->getTime(status)); // 888817448000 + int32_t firstInMonth = calendar->get(UCAL_DATE, status); if(U_FAILURE(status)) errln("get(D_O_M) failed"); for(int32_t firstInWeek = UCAL_SUNDAY; firstInWeek <= UCAL_SATURDAY; firstInWeek++) { calendar->setFirstDayOfWeek((UCalendarDaysOfWeek)firstInWeek); - int32_t returned = calendar->getActualMaximum(field); + int32_t returned = calendar->getActualMaximum(field, status); int32_t expected = (31 + ((firstInMonth - firstInWeek + 7)% 7) + 6) / 7; logln(UnicodeString("First day of week = ") + firstInWeek + - " getActualMaximum(WEEK_OF_MONTH) = " + returned + + " getActualMaximum(WEEK_OF_MONTH, status) = " + returned + " expected = " + expected + ((returned == expected) ? " ok" : " FAIL")); @@ -1802,7 +1833,7 @@ CalendarRegressionTest::Test4167060() if(U_FAILURE(status)) errln("getTime() failed"); - int32_t maxYear = calendar->getActualMaximum(field); + int32_t maxYear = calendar->getActualMaximum(field, status); UnicodeString temp; logln(UnicodeString("maxYear: ") + maxYear + " for " + format->format(calendar->getTime(status), temp)); temp.remove(); @@ -1924,8 +1955,10 @@ void CalendarRegressionTest::TestJ81() { fmt.setCalendar(cal); // Get the Gregorian cutover UDate cutover = cal.getGregorianChange(); + UDate days = ONE_DAY; + days = cutover/days; logln(UnicodeString("Cutover: {") + - fmt.format(cutover, temp) + "}(" + cutover/ONE_DAY + ")"); + fmt.format(cutover, temp) + "}(epoch days-" + (int)days + ", jd" + (2440588 + days) +")"); // Check woy and doy handling. Reference data: /* w40 d274 Mon 1 Oct 1582 @@ -1966,22 +1999,31 @@ void CalendarRegressionTest::TestJ81() { 31, 43, 294, UCAL_SUNDAY }; int32_t DOY_DATA_length = (int32_t)(sizeof(DOY_DATA) / sizeof(DOY_DATA[0])); + for (i=0; ifields cal.set(1582, UCAL_OCTOBER, DOY_DATA[i]); int32_t woy = cal.get(UCAL_WEEK_OF_YEAR, status); int32_t doy = cal.get(UCAL_DAY_OF_YEAR, status); + int32_t dow = cal.get(UCAL_DAY_OF_WEEK, status); if (U_FAILURE(status)) { errln("Error: get() failed"); break; } - if (woy != DOY_DATA[i+1] || doy != DOY_DATA[i+2]) { + if (woy != DOY_DATA[i+1] || doy != DOY_DATA[i+2] || dow != DOY_DATA[i+3]) { errln((UnicodeString)"Fail: expect woy=" + DOY_DATA[i+1] + - ", doy=" + DOY_DATA[i+2] + " on " + - fmt.format(cal.getTime(status), temp.remove())); + ", doy=" + DOY_DATA[i+2] + ", dow=" + DOY_DATA[i+3] + " on " + + fmt.format(cal.getTime(status), temp.remove()) + + " set(1582,OCTOBER, " + DOY_DATA[i] + ")"); + logln(CalendarTest::calToStr(cal)); status = U_ZERO_ERROR; + } else { + logln((UnicodeString)"PASS: expect woy=" + DOY_DATA[i+1] + + ", doy=" + DOY_DATA[i+2] + ", dow=" + DOY_DATA[i+3] + " on " + + fmt.format(cal.getTime(status), temp.remove())); + logln(CalendarTest::calToStr(cal)); + status = U_ZERO_ERROR; } - // Test fields->time for WOY cal.clear(); cal.set(UCAL_YEAR, 1582); @@ -1997,6 +2039,7 @@ void CalendarRegressionTest::TestJ81() { " dow=" + DOY_DATA[i+3] + " => " + fmt.format(cal.getTime(status), temp.remove()) + ", expected 1582 Oct " + DOY_DATA[i]); + logln(CalendarTest::calToStr(cal)); status = U_ZERO_ERROR; } @@ -2467,7 +2510,7 @@ CalendarRegressionTest::makeDate(int32_t y, int32_t m, int32_t d, void CalendarRegressionTest::TestDeprecates(void) { UErrorCode status = U_ZERO_ERROR; - Calendar *c1 = Calendar::createInstance("ja_JP_TRADITIONAL",status); + Calendar *c1 = Calendar::createInstance("ja_JP@calendar=japanese",status); Calendar *c2 = Calendar::createInstance("ja_JP_TRADITIONAL",status); if(!c1 || !c2 || U_FAILURE(status)) { @@ -2504,7 +2547,7 @@ void CalendarRegressionTest::TestDeprecates(void) status = U_ZERO_ERROR; c1 = Calendar::createInstance("th_TH_TRADITIONAL",status); - c2 = Calendar::createInstance("th_TH_TRADITIONAL",status); + c2 = Calendar::createInstance("th_TH@calendar=buddhist",status); if(!c1 || !c2 || U_FAILURE(status)) { errln("Couldn't create calendars for add of HOUR"); diff --git a/icuSources/test/intltest/caltest.cpp b/icuSources/test/intltest/caltest.cpp index a4950883..0ec15c2d 100644 --- a/icuSources/test/intltest/caltest.cpp +++ b/icuSources/test/intltest/caltest.cpp @@ -1,8 +1,8 @@ -/******************************************************************** +/************************************************************************ * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ + * Copyright (c) 1997-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ************************************************************************/ #include "unicode/utypes.h" @@ -17,17 +17,29 @@ // class CalendarTest // ***************************************************************************** -static UnicodeString fieldName(UCalendarDateFields f); - -static UnicodeString calToStr(const Calendar & cal) +UnicodeString CalendarTest::calToStr(const Calendar & cal) { UnicodeString out; UErrorCode status = U_ZERO_ERROR; int i; + UDate d; for(i = 0;iafter(*cal2, status) || U_FAILURE(status)) errln("FAIL: equals/before/after failed"); + logln(UnicodeString("cal=") +cal->getTime(status) + UnicodeString(calToStr(*cal))); + logln(UnicodeString("cal2=") +cal2->getTime(status) + UnicodeString(calToStr(*cal2))); + logln("cal2->setTime(when+1000)"); cal2->setTime(when + 1000, status); + logln(UnicodeString("cal2=") +cal2->getTime(status) + UnicodeString(calToStr(*cal2))); + if (failure(status, "Calendar::setTime")) return; if (cal->equals(*cal2, status) || cal2->before(*cal, status) || cal->after(*cal2, status) || - U_FAILURE(status)) errln("FAIL: equals/before/after failed"); + U_FAILURE(status)) errln("FAIL: equals/before/after failed after setTime(+1000)"); + logln("cal1->roll(UCAL_SECOND)"); cal->roll(UCAL_SECOND, (UBool) TRUE, status); + logln(UnicodeString("cal=") +cal->getTime(status) + UnicodeString(calToStr(*cal))); + if (failure(status, "Calendar::roll")) return; - if (!cal->equals(*cal2, status) || - cal->before(*cal2, status) || - cal->after(*cal2, status) || - U_FAILURE(status)) errln("FAIL: equals/before/after failed"); + if (!(eq=cal->equals(*cal2, status)) || + (b4=cal->before(*cal2, status)) || + (af=cal->after(*cal2, status)) || + U_FAILURE(status)) { + errln("FAIL: equals[%c]/before[%c]/after[%c] failed after roll 1 second [should be T/F/F]", + eq?'T':'F', + b4?'T':'F', + af?'T':'F'); + logln(UnicodeString("cal=") +cal->getTime(status) + UnicodeString(calToStr(*cal))); + logln(UnicodeString("cal2=") +cal2->getTime(status) + UnicodeString(calToStr(*cal2))); + } // Roll back to January cal->roll(UCAL_MONTH, (int32_t)(1 + UCAL_DECEMBER - cal->get(UCAL_MONTH, status)), status); @@ -255,7 +302,7 @@ CalendarTest::TestGenericAPI() if (cal->equals(*cal2, status) || cal2->before(*cal, status) || cal->after(*cal2, status) || - U_FAILURE(status)) errln("FAIL: equals/before/after failed"); + U_FAILURE(status)) errln("FAIL: equals/before/after failed after rollback to January"); TimeZone *z = cal->orphanTimeZone(); if (z->getID(str) != tzid || @@ -318,13 +365,14 @@ CalendarTest::TestGenericAPI() switch(i) { case UCAL_YEAR: case UCAL_MONTH: case UCAL_DATE: case UCAL_HOUR_OF_DAY: case UCAL_MINUTE: case UCAL_SECOND: - if (!cal->isSet((UCalendarDateFields)i)) errln("FAIL: Calendar::isSet failed"); + case UCAL_EXTENDED_YEAR: + if (!cal->isSet((UCalendarDateFields)i)) errln("FAIL: Calendar::isSet F, should be T " + fieldName((UCalendarDateFields)i)); break; default: - if (cal->isSet((UCalendarDateFields)i)) errln("FAIL: Calendar::isSet failed"); + if (cal->isSet((UCalendarDateFields)i)) errln("FAIL: Calendar::isSet = T, should be F " + fieldName((UCalendarDateFields)i)); } cal->clear((UCalendarDateFields)i); - if (cal->isSet((UCalendarDateFields)i)) errln("FAIL: Calendar::clear/isSet failed"); + if (cal->isSet((UCalendarDateFields)i)) errln("FAIL: Calendar::clear/isSet failed " + fieldName((UCalendarDateFields)i)); } delete cal; @@ -438,18 +486,22 @@ void CalendarTest::dowTest(UBool lenient) UErrorCode status = U_ZERO_ERROR; GregorianCalendar* cal = new GregorianCalendar(status); if (U_FAILURE(status)) { errln("Couldn't create GregorianCalendar"); return; } + logln("cal - Aug 12, 1997\n"); cal->set(1997, UCAL_AUGUST, 12); cal->getTime(status); if (U_FAILURE(status)) { errln("Calendar::getTime failed"); return; } + logln((lenient?UnicodeString("LENIENT0: "):UnicodeString("nonlenient0: ")) + UnicodeString(calToStr(*cal))); cal->setLenient(lenient); + logln("cal - Dec 1, 1996\n"); cal->set(1996, UCAL_DECEMBER, 1); + logln((lenient?UnicodeString("LENIENT: "):UnicodeString("nonlenient: ")) + UnicodeString(calToStr(*cal))); int32_t dow = cal->get(UCAL_DAY_OF_WEEK, status); - if (U_FAILURE(status)) { errln("Calendar::get failed"); return; } + if (U_FAILURE(status)) { errln("Calendar::get failed [%s]", u_errorName(status)); return; } int32_t min = cal->getMinimum(UCAL_DAY_OF_WEEK); int32_t max = cal->getMaximum(UCAL_DAY_OF_WEEK); if (dow < min || dow > max) errln(UnicodeString("FAIL: Day of week ") + (int32_t)dow + " out of range"); - if (dow != UCAL_SUNDAY) errln("FAIL: Day of week should be SUNDAY"); + if (dow != UCAL_SUNDAY) errln("FAIL: Day of week should be SUNDAY[%d] not %d", UCAL_SUNDAY, dow); if (min != UCAL_SUNDAY || max != UCAL_SATURDAY) errln("FAIL: Min/max bad"); delete cal; @@ -857,12 +909,19 @@ CalendarTest::TestAddRollExtensive() int32_t limit = maxlimit; status = U_ZERO_ERROR; for (i = 0; i < limit; i++) { + logln(calToStr(*temp) + UnicodeString(" " ) + fieldName(e) + UnicodeString("++") ); temp->roll(e, 1, status); - if (U_FAILURE(status)) { limit = i; status = U_ZERO_ERROR; } + if (U_FAILURE(status)) { + logln("caltest.cpp:%d e=%d, i=%d - roll(+) err %s\n", __LINE__, (int) e, (int) i, u_errorName(status)); + logln(calToStr(*temp)); + limit = i; status = U_ZERO_ERROR; + } } for (i = 0; i < limit; i++) { + logln("caltest.cpp:%d e=%d, i=%d\n", __LINE__, (int) e, (int) i); + logln(calToStr(*temp) + UnicodeString(" " ) + fieldName(e) + UnicodeString("--") ); temp->roll(e, -1, status); - if (U_FAILURE(status)) { errln("GregorianCalendar::roll -1 failed"); return; } + if (U_FAILURE(status)) { errln(UnicodeString("GregorianCalendar::roll ") + CalendarTest::fieldName(e) + " count=" + UnicodeString('@'+i) + " by -1 failed with " + u_errorName(status) ); return; } } check520(temp, y, m, d, hr, min, sec, ms, e); @@ -1234,6 +1293,7 @@ CalendarTest::TestDOW_LOCALandYEAR_WOY() yearAddTest(*cal, status); // aliu loop_addroll(cal, /*sdf,*/ times, UCAL_DOW_LOCAL, UCAL_DAY_OF_WEEK, status); if (U_FAILURE(status)) { errln("Error in parse/calculate test for 1997"); return; } + cal->clear(); cal->set(1998, UCAL_DECEMBER, 25); doYEAR_WOYLoop(cal, sdf, times, status); @@ -1241,6 +1301,7 @@ CalendarTest::TestDOW_LOCALandYEAR_WOY() yearAddTest(*cal, status); // aliu loop_addroll(cal, /*sdf,*/ times, UCAL_DOW_LOCAL, UCAL_DAY_OF_WEEK, status); if (U_FAILURE(status)) { errln("Error in parse/calculate test for 1998"); return; } + cal->clear(); cal->set(1582, UCAL_OCTOBER, 1); doYEAR_WOYLoop(cal, sdf, times, status); @@ -1248,7 +1309,6 @@ CalendarTest::TestDOW_LOCALandYEAR_WOY() yearAddTest(*cal, status); // aliu loop_addroll(cal, /*sdf,*/ times, UCAL_DOW_LOCAL, UCAL_DAY_OF_WEEK, status); if (U_FAILURE(status)) { errln("Error in parse/calculate test for 1582"); return; } - delete sdf; delete cal; @@ -1294,6 +1354,7 @@ void CalendarTest::yearAddTest(Calendar& cal, UErrorCode& status) { str += (UnicodeString)", expected year " + (y+1) + ", month " + (mon+1) + ", day " + day; errln((UnicodeString)"FAIL: " + str); + logln( UnicodeString(" -> ") + CalendarTest::calToStr(cal) ); } else { logln(str); } @@ -1301,6 +1362,7 @@ void CalendarTest::yearAddTest(Calendar& cal, UErrorCode& status) { fmt.format(t, str.remove()); str += ".add(YEAR_WOY, 1)=>"; cal.setTime(t, status); + logln( UnicodeString(" <- ") + CalendarTest::calToStr(cal) ); cal.add(UCAL_YEAR_WOY, 1, status); int32_t ywy2 = cal.get(UCAL_YEAR_WOY, status); int32_t woy2 = cal.get(UCAL_WEEK_OF_YEAR, status); @@ -1310,6 +1372,7 @@ void CalendarTest::yearAddTest(Calendar& cal, UErrorCode& status) { str += (UnicodeString)", expected yearWOY " + (ywy+1) + ", woy " + woy + ", dowLocal " + dow; errln((UnicodeString)"FAIL: " + str); + logln( UnicodeString(" -> ") + CalendarTest::calToStr(cal) ); } else { logln(str); } @@ -1386,28 +1449,29 @@ CalendarTest::doYEAR_WOYLoop(Calendar *cal, SimpleDateFormat *sdf, if(original!=tst) { us.remove(); sdf->format(Formattable(original, Formattable::kIsDate), us, errorCode); - errln("Parsed time doesn't match with regular"); - logln("expected "+us); + errln("FAIL: Parsed time doesn't match with regular"); + logln("expected "+us + " " + calToStr(*cal)); us.remove(); sdf->format(Formattable(tst, Formattable::kIsDate), us, errorCode); - logln("got "+us); + logln("got "+us + " " + calToStr(*tstres)); } tstres->clear(); tstres->set(UCAL_YEAR_WOY, cal->get(UCAL_YEAR_WOY, errorCode)); tstres->set(UCAL_WEEK_OF_YEAR, cal->get(UCAL_WEEK_OF_YEAR, errorCode)); tstres->set(UCAL_DOW_LOCAL, cal->get(UCAL_DOW_LOCAL, errorCode)); if(cal->get(UCAL_YEAR, errorCode) != tstres->get(UCAL_YEAR, errorCode)) { - errln("Different Year!"); + errln("FAIL: Different Year!"); logln((UnicodeString)"Expected "+cal->get(UCAL_YEAR, errorCode)); logln((UnicodeString)"Got "+tstres->get(UCAL_YEAR, errorCode)); return; } if(cal->get(UCAL_DAY_OF_YEAR, errorCode) != tstres->get(UCAL_DAY_OF_YEAR, errorCode)) { - errln("Different Day Of Year!"); + errln("FAIL: Different Day Of Year!"); logln((UnicodeString)"Expected "+cal->get(UCAL_DAY_OF_YEAR, errorCode)); logln((UnicodeString)"Got "+tstres->get(UCAL_DAY_OF_YEAR, errorCode)); return; } + //logln(calToStr(*cal)); cal->add(UCAL_DATE, 1, errorCode); if (U_FAILURE(errorCode)) { errln("Add error"); return; } us.remove(); @@ -1489,7 +1553,7 @@ void CalendarTest::TestWOY(void) { Sun Jan 09 2000, WOY 2 Mon Jan 10 2000, WOY 3 */ - + UnicodeString str; UErrorCode status = U_ZERO_ERROR; int32_t i; @@ -1500,35 +1564,37 @@ void CalendarTest::TestWOY(void) { UCalendarDaysOfWeek fdw = (UCalendarDaysOfWeek) 0; + //for (int8_t pass=2; pass<=2; ++pass) { for (int8_t pass=1; pass<=2; ++pass) { switch (pass) { case 1: fdw = UCAL_MONDAY; cal.setFirstDayOfWeek(fdw); cal.setMinimalDaysInFirstWeek(4); - fmt.setCalendar(cal); + fmt.adoptCalendar(cal.clone()); break; case 2: fdw = UCAL_MONDAY; cal.setFirstDayOfWeek(fdw); cal.setMinimalDaysInFirstWeek(2); - fmt.setCalendar(cal); + fmt.adoptCalendar(cal.clone()); break; } - for (i=0; i<16; ++i) { + //for (i=2; i<=6; ++i) { + for (i=0; i<16; ++i) { UDate t, t2; int32_t t_y, t_woy, t_dow; cal.clear(); cal.set(1999, UCAL_DECEMBER, 26 + i); fmt.format(t = cal.getTime(status), str.remove()); CHECK(status, "Fail: getTime failed"); - logln(str); - + logln(UnicodeString("* ") + str); int32_t dow = cal.get(UCAL_DAY_OF_WEEK, status); int32_t woy = cal.get(UCAL_WEEK_OF_YEAR, status); int32_t year = cal.get(UCAL_YEAR, status); int32_t mon = cal.get(UCAL_MONTH, status); + logln(calToStr(cal)); CHECK(status, "Fail: get failed"); int32_t dowLocal = dow - fdw; if (dowLocal < 0) dowLocal += 7; @@ -1555,6 +1621,11 @@ void CalendarTest::TestWOY(void) { str = "Fail: y/woy/dow fields->time => "; fmt.format(cal.getTime(status), str); errln(str); + logln(calToStr(cal)); + logln("[get!=set] Y%d!=%d || woy%d!=%d || dow%d!=%d\n", + t_y, year, t_woy, woy, t_dow, dow); + } else { + logln("y/woy/dow fields->time OK"); } // Basic fields->time check y/woy/dow_local @@ -1585,6 +1656,10 @@ void CalendarTest::TestWOY(void) { str = "Fail: y_woy/woy/dow fields->time => "; fmt.format(t2, str); errln(str); + logln(calToStr(cal)); + logln("%.f != %.f\n", t, t2); + } else { + logln("y_woy/woy/dow OK"); } // Basic fields->time check y_woy/woy/dow_local @@ -1600,6 +1675,7 @@ void CalendarTest::TestWOY(void) { errln(str); } + logln("Testing DOW_LOCAL.. dow%d\n", dow); // Make sure DOW_LOCAL disambiguates over DOW int32_t wrongDow = dow - 3; if (wrongDow < 1) wrongDow += 7; @@ -1612,6 +1688,9 @@ void CalendarTest::TestWOY(void) { str = "Fail: DOW_LOCAL fields->time => "; fmt.format(t2, str); errln(str); + logln(calToStr(cal)); + logln("%.f : DOW%d, DOW_LOCAL%d -> %.f\n", + t, wrongDow, dowLocal, t2); } // Make sure DOW disambiguates over DOW_LOCAL @@ -1700,8 +1779,152 @@ void CalendarTest::TestWOY(void) { } } +void CalendarTest::TestYWOY() +{ + UnicodeString str; + UErrorCode status = U_ZERO_ERROR; + + GregorianCalendar cal(status); + CHECK(status, "Fail: Cannot construct calendar/format"); + + cal.setFirstDayOfWeek(UCAL_SUNDAY); + cal.setMinimalDaysInFirstWeek(1); + + logln("Setting: ywoy=2004, woy=1, dow=MONDAY"); + cal.clear(); + cal.set(UCAL_YEAR_WOY,2004); + cal.set(UCAL_WEEK_OF_YEAR,1); + cal.set(UCAL_DAY_OF_WEEK, UCAL_MONDAY); + + logln(calToStr(cal)); + if(cal.get(UCAL_YEAR, status) != 2003) { + errln("year not 2003"); + } + + logln("+ setting DOW to THURSDAY"); + cal.clear(); + cal.set(UCAL_YEAR_WOY,2004); + cal.set(UCAL_WEEK_OF_YEAR,1); + cal.set(UCAL_DAY_OF_WEEK, UCAL_THURSDAY); + + logln(calToStr(cal)); + if(cal.get(UCAL_YEAR, status) != 2004) { + errln("year not 2004"); + } + + logln("+ setting DOW_LOCAL to 1"); + cal.clear(); + cal.set(UCAL_YEAR_WOY,2004); + cal.set(UCAL_WEEK_OF_YEAR,1); + cal.set(UCAL_DAY_OF_WEEK, UCAL_THURSDAY); + cal.set(UCAL_DOW_LOCAL, 1); + + logln(calToStr(cal)); + if(cal.get(UCAL_YEAR, status) != 2003) { + errln("year not 2003"); + } + + cal.setFirstDayOfWeek(UCAL_MONDAY); + cal.setMinimalDaysInFirstWeek(4); + UDate t = 946713600000.; + cal.setTime(t, status); + cal.set(UCAL_DAY_OF_WEEK, 4); + cal.set(UCAL_DOW_LOCAL, 6); + if(cal.getTime(status) != t) { + logln(calToStr(cal)); + errln("FAIL: DOW_LOCAL did not take precedence"); + } + +} + +void CalendarTest::TestJD() +{ + int32_t jd; + static const int32_t kEpochStartAsJulianDay = 2440588; + UErrorCode status = U_ZERO_ERROR; + GregorianCalendar cal(status); + cal.setTimeZone(*TimeZone::getGMT()); + cal.clear(); + jd = cal.get(UCAL_JULIAN_DAY, status); + if(jd != kEpochStartAsJulianDay) { + errln("Wanted JD of %d at time=0, [epoch 1970] but got %d\n", kEpochStartAsJulianDay, jd); + } else { + logln("Wanted JD of %d at time=0, [epoch 1970], got %d\n", kEpochStartAsJulianDay, jd); + } + + cal.setTime(Calendar::getNow(), status); + cal.clear(); + cal.set(UCAL_JULIAN_DAY, kEpochStartAsJulianDay); + UDate epochTime = cal.getTime(status); + if(epochTime != 0) { + errln("Wanted time of 0 at jd=%d, got %.1lf\n", kEpochStartAsJulianDay, epochTime); + } else { + logln("Wanted time of 0 at jd=%d, got %.1lf\n", kEpochStartAsJulianDay, epochTime); + } + +} + #undef CHECK +// List of interesting locales +const char *CalendarTest::testLocaleID(int32_t i) +{ + switch(i) { + case 0: return "he_IL@calendar=hebrew"; + case 1: return "en_US@calendar=hebrew"; + case 2: return "fr_FR@calendar=hebrew"; + case 3: return "fi_FI@calendar=hebrew"; + case 4: return "nl_NL@calendar=hebrew"; + case 5: return "hu_HU@calendar=hebrew"; + case 6: return "nl_BE@currency=MTL;calendar=islamic"; + case 7: return "th_TH_TRADITIONAL@calendar=gregorian"; + case 8: return "ar_JO@calendar=islamic-civil"; + case 9: return "fi_FI@calendar=islamic"; + case 10: return "fr_CH@calendar=islamic-civil"; + case 11: return "he_IL@calendar=islamic-civil"; + case 12: return "hu_HU@calendar=buddhist"; + case 13: return "hu_HU@calendar=islamic"; + case 14: return "en_US@calendar=japanese"; + default: return NULL; + } +} + +int32_t CalendarTest::testLocaleCount() +{ + static int32_t gLocaleCount = -1; + if(gLocaleCount < 0) { + int32_t i; + for(i=0;testLocaleID(i) != NULL;i++) { + ; + } + gLocaleCount = i; + } + return gLocaleCount; +} + +static UDate doMinDateOfCalendar(Calendar* adopt, UBool &isGregorian, UErrorCode& status) { + if(U_FAILURE(status)) return 0.0; + + adopt->clear(); + adopt->set(UCAL_EXTENDED_YEAR, adopt->getActualMinimum(UCAL_EXTENDED_YEAR, status)); + UDate ret = adopt->getTime(status); + isGregorian = (adopt->getDynamicClassID() == GregorianCalendar::getStaticClassID()); + delete adopt; + return ret; +} + +UDate CalendarTest::minDateOfCalendar(const Locale& locale, UBool &isGregorian, UErrorCode& status) { + if(U_FAILURE(status)) return 0.0; + return doMinDateOfCalendar(Calendar::createInstance(locale, status), isGregorian, status); +} + +UDate CalendarTest::minDateOfCalendar(const Calendar& cal, UBool &isGregorian, UErrorCode& status) { + if(U_FAILURE(status)) return 0.0; + return doMinDateOfCalendar(cal.clone(), isGregorian, status); +} + + + #endif /* #if !UCONFIG_NO_FORMATTING */ //eof diff --git a/icuSources/test/intltest/caltest.h b/icuSources/test/intltest/caltest.h index ee3eb258..fce3d978 100644 --- a/icuSources/test/intltest/caltest.h +++ b/icuSources/test/intltest/caltest.h @@ -1,8 +1,8 @@ -/******************************************************************** +/*********************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ + * Copyright (c) 1997-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ***********************************************************************/ #ifndef __CalendarTest__ #define __CalendarTest__ @@ -168,11 +168,54 @@ public: int times, UCalendarDateFields field, UCalendarDateFields field2, UErrorCode& errorCode); + void TestYWOY(void); + void TestJD(void); + void yearAddTest(Calendar& cal, UErrorCode& status); public: // package // test subroutine use by TestDOWProgression virtual void marchByDelta(Calendar* cal, int32_t delta); + + public: + // for other tests' use + static UnicodeString fieldName(UCalendarDateFields f); + static UnicodeString calToStr(const Calendar & cal); + + // List of non-installed locales with interesting calendars + + /** + * @return the count of 'other' locales to test + */ + static int32_t testLocaleCount(); + + /** + * @param i index of 'other' locale to return + * @return locale ID + */ + static const char* testLocaleID(int32_t i); + + /** + * Clone the specified calendar, and determine its earliest supported date + * by setting the extended year to the minimum value. + * @param cal Calendar (will be cloned) + * @param isGregorian output: returns 'TRUE' if the calendar's class is GregorianCalendar + * @param status error code + */ + static UDate minDateOfCalendar(const Calendar& cal, UBool &isGregorian, UErrorCode& status); + + /** + * Construct a calendar of the specified locale, and determine its earliest supported date + * by setting the extended year to the minimum value. + * @param locale locale of calendar to check + * @param isGregorian output: returns 'TRUE' if the calendar's class is GregorianCalendar + * @param status error code + */ + static UDate minDateOfCalendar(const Locale& locale, UBool &isGregorian, UErrorCode& status); + + // internal - for other test use + public: + }; #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/test/intltest/caltztst.cpp b/icuSources/test/intltest/caltztst.cpp index b9c43867..3d50ce95 100644 --- a/icuSources/test/intltest/caltztst.cpp +++ b/icuSources/test/intltest/caltztst.cpp @@ -152,6 +152,25 @@ CalendarTimeZoneTest::dateToString(UDate d, UnicodeString& str) return str; } +UnicodeString& +CalendarTimeZoneTest::dateToString(UDate d, UnicodeString& str, + const TimeZone& tz) +{ + str.remove(); + DateFormat* format = getDateFormat(); + if (format == 0) + { + str += "DATE_FORMAT_FAILURE"; + return str; + } + TimeZone* save = format->getTimeZone().clone(); + format->setTimeZone(tz); + format->format(d, str); + format->adoptTimeZone(save); + releaseDateFormat(format); + return str; +} + // Utility methods to create a date. This is useful for converting Java constructs // which create a Date object. UDate diff --git a/icuSources/test/intltest/caltztst.h b/icuSources/test/intltest/caltztst.h index badf9e36..60e8447d 100644 --- a/icuSources/test/intltest/caltztst.h +++ b/icuSources/test/intltest/caltztst.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2003, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -33,6 +33,7 @@ protected: // Tries to mimic the Java Date.toString() format. UnicodeString dateToString(UDate d); UnicodeString& dateToString(UDate d, UnicodeString& str); + UnicodeString& dateToString(UDate d, UnicodeString& str, const TimeZone& z); // Utility methods to create a date. This is useful for converting Java constructs // which create a Date object. Returns a Date in the current local time. diff --git a/icuSources/test/intltest/canittst.cpp b/icuSources/test/intltest/canittst.cpp index 28920172..419f3f61 100644 --- a/icuSources/test/intltest/canittst.cpp +++ b/icuSources/test/intltest/canittst.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 2002-2003, International Business Machines Corporation and + * Copyright (c) 2002-2004, International Business Machines Corporation and * others. All Rights Reserved. ******************************************************************** * @@ -16,7 +16,9 @@ #include "cstring.h" #include "canittst.h" #include "unicode/caniter.h" +#include "unicode/normlzr.h" #include "unicode/uchar.h" +#include "hash.h" #define ARRAY_LENGTH(array) ((int32_t)(sizeof (array) / sizeof (*array))) @@ -71,10 +73,10 @@ void CanonicalIteratorTest::TestExhaustive() { CanonicalIterator it("", status); UChar32 i = 0; UnicodeString s, decomp, comp; - // Test static and dynamic class IDs + // Test static and dynamic class IDs if(it.getDynamicClassID() != CanonicalIterator::getStaticClassID()){ - errln("CanonicalIterator::getStaticClassId ! = CanonicalIterator.getDynamicClassID"); - } + errln("CanonicalIterator::getStaticClassId ! = CanonicalIterator.getDynamicClassID"); + } for (i = 0; i < 0x10FFFF; quick?i+=0x10:++i) { //for (i = 0xae00; i < 0xaf00; ++i) { @@ -230,7 +232,8 @@ UnicodeString CanonicalIteratorTest::getReadable(const UnicodeString &s) { //return "[" + (verbose ? name->transliterate(s) + "; " : "") + hex->transliterate(s) + "]"; } -U_CAPI int compareUnicodeStrings(const void *s1, const void *s2) { +U_CFUNC int U_CALLCONV +compareUnicodeStrings(const void *s1, const void *s2) { UnicodeString **st1 = (UnicodeString **)s1; UnicodeString **st2 = (UnicodeString **)s2; diff --git a/icuSources/test/intltest/canittst.h b/icuSources/test/intltest/canittst.h index a908b4b5..fec1c2c6 100644 --- a/icuSources/test/intltest/canittst.h +++ b/icuSources/test/intltest/canittst.h @@ -26,7 +26,6 @@ class Transliterator; U_NAMESPACE_END -#include "unicode/normlzr.h" #include "unicode/translit.h" #include "intltest.h" #include "hash.h" diff --git a/icuSources/test/intltest/citrtest.cpp b/icuSources/test/intltest/citrtest.cpp index 5a7e1049..dd390cd4 100644 --- a/icuSources/test/intltest/citrtest.cpp +++ b/icuSources/test/intltest/citrtest.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2002, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. * Modification History: * @@ -15,6 +15,7 @@ #include "unicode/schriter.h" #include "unicode/uchriter.h" #include "unicode/uiter.h" +#include "unicode/putil.h" #include "citrtest.h" @@ -36,7 +37,7 @@ public: text = newText; } - virtual void getText(UnicodeString& result){ + virtual void getText(UnicodeString& result) { text.extract(0,text.length(),result); } virtual UClassID getDynamicClassID(void) const{ @@ -58,7 +59,7 @@ public: } virtual UChar nextPostInc(void){ return text.charAt(pos++);} virtual UChar32 next32PostInc(void){return text.char32At(pos++);} - virtual UBool hasNext(){ return TRUE;}; + virtual UBool hasNext() { return TRUE;}; virtual UChar first(){return DONE;}; virtual UChar32 first32(){return DONE;}; virtual UChar last(){return DONE;}; @@ -121,7 +122,7 @@ public: return pos; }; - virtual UBool hasPrevious(){return TRUE;}; + virtual UBool hasPrevious() {return TRUE;}; SCharacterIterator& operator=(const SCharacterIterator& that){ text = that.text; @@ -222,9 +223,9 @@ void CharIterTest::TestConstructionAndEquality() { if (test1->hashCode() != test5->hashCode()) errln("hashCode() failed: identical objects have different hash codes"); - if(test1->getLength() != testText.length()){ - errln("getLength of CharacterIterator failed"); - } + if(test1->getLength() != testText.length()){ + errln("getLength of CharacterIterator failed"); + } test1->getText(result1); test1b->getText(result2); test1c->getText(result3); diff --git a/icuSources/test/intltest/cntabcol.cpp b/icuSources/test/intltest/cntabcol.cpp index a157f6a3..49f254c2 100644 --- a/icuSources/test/intltest/cntabcol.cpp +++ b/icuSources/test/intltest/cntabcol.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2003, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -15,7 +15,7 @@ U_NAMESPACE_USE ContractionTableTest::ContractionTableTest() { status = U_ZERO_ERROR; /*testMapping = ucmpe32_open(0, 0, 0, &status);*/ - testMapping = utrie_open(NULL, NULL, 0, 0, TRUE); + testMapping = utrie_open(NULL, NULL, 0, 0, 0, TRUE); } ContractionTableTest::~ContractionTableTest() { diff --git a/icuSources/test/intltest/convtest.cpp b/icuSources/test/intltest/convtest.cpp new file mode 100644 index 00000000..791ed3c7 --- /dev/null +++ b/icuSources/test/intltest/convtest.cpp @@ -0,0 +1,1227 @@ +/* +******************************************************************************* +* +* Copyright (C) 2003-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: convtest.cpp +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2003jul15 +* created by: Markus W. Scherer +* +* Test file for data-driven conversion tests. +*/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_LEGACY_CONVERSION +/* + * Note: Turning off all of convtest.cpp if !UCONFIG_NO_LEGACY_CONVERSION + * is slightly unnecessary - it removes tests for Unicode charsets + * like UTF-8 that should work. + * However, there is no easy way for the test to detect whether a test case + * is for a Unicode charset, so it would be difficult to only exclude those. + * Also, regular testing of ICU is done with all modules on, therefore + * not testing conversion for a custom configuration like this should be ok. + */ + +#include "unicode/ucnv.h" +#include "unicode/unistr.h" +#include "unicode/parsepos.h" +#include "unicode/uniset.h" +#include "unicode/ustring.h" +#include "unicode/ures.h" +#include "convtest.h" +#include "unicode/tstdtmod.h" +#include +#include + +#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) + +enum { + // characters used in test data for callbacks + SUB_CB='?', + SKIP_CB='0', + STOP_CB='.', + ESC_CB='&' +}; + +ConversionTest::~ConversionTest() {} + +void +ConversionTest::runIndexedTest(int32_t index, UBool exec, const char *&name, char * /*par*/) { + if (exec) logln("TestSuite ConversionTest: "); + switch (index) { + case 0: name="TestToUnicode"; if (exec) TestToUnicode(); break; + case 1: name="TestFromUnicode"; if (exec) TestFromUnicode(); break; + case 2: name="TestGetUnicodeSet"; if (exec) TestGetUnicodeSet(); break; + default: name=""; break; //needed to end loop + } +} + +// test data interface ----------------------------------------------------- *** + +void +ConversionTest::TestToUnicode() { + ConversionCase cc; + char charset[100], cbopt[4]; + const char *option; + UnicodeString s, unicode; + int32_t offsetsLength; + UConverterToUCallback callback; + + TestDataModule *dataModule; + TestData *testData; + const DataMap *testCase; + UErrorCode errorCode; + int32_t i; + + errorCode=U_ZERO_ERROR; + dataModule=TestDataModule::getTestDataModule("conversion", *this, errorCode); + if(U_SUCCESS(errorCode)) { + testData=dataModule->createTestData("toUnicode", errorCode); + if(U_SUCCESS(errorCode)) { + for(i=0; testData->nextCase(testCase, errorCode); ++i) { + if(U_FAILURE(errorCode)) { + errln("error retrieving conversion/toUnicode test case %d - %s", + i, u_errorName(errorCode)); + errorCode=U_ZERO_ERROR; + continue; + } + + cc.caseNr=i; + + s=testCase->getString("charset", errorCode); + s.extract(0, 0x7fffffff, charset, sizeof(charset), ""); + cc.charset=charset; + + cc.bytes=testCase->getBinary(cc.bytesLength, "bytes", errorCode); + unicode=testCase->getString("unicode", errorCode); + cc.unicode=unicode.getBuffer(); + cc.unicodeLength=unicode.length(); + + offsetsLength=0; + cc.offsets=testCase->getIntVector(offsetsLength, "offsets", errorCode); + if(offsetsLength==0) { + cc.offsets=NULL; + } else if(offsetsLength!=unicode.length()) { + errln("toUnicode[%d] unicode[%d] and offsets[%d] must have the same length", + i, unicode.length(), offsetsLength); + errorCode=U_ILLEGAL_ARGUMENT_ERROR; + } + + cc.finalFlush= 0!=testCase->getInt28("flush", errorCode); + cc.fallbacks= 0!=testCase->getInt28("fallbacks", errorCode); + + s=testCase->getString("errorCode", errorCode); + if(s==UNICODE_STRING("invalid", 7)) { + cc.outErrorCode=U_INVALID_CHAR_FOUND; + } else if(s==UNICODE_STRING("illegal", 7)) { + cc.outErrorCode=U_ILLEGAL_CHAR_FOUND; + } else if(s==UNICODE_STRING("truncated", 9)) { + cc.outErrorCode=U_TRUNCATED_CHAR_FOUND; + } else if(s==UNICODE_STRING("illesc", 6)) { + cc.outErrorCode=U_ILLEGAL_ESCAPE_SEQUENCE; + } else if(s==UNICODE_STRING("unsuppesc", 9)) { + cc.outErrorCode=U_UNSUPPORTED_ESCAPE_SEQUENCE; + } else { + cc.outErrorCode=U_ZERO_ERROR; + } + + s=testCase->getString("callback", errorCode); + s.extract(0, 0x7fffffff, cbopt, sizeof(cbopt), ""); + cc.cbopt=cbopt; + switch(cbopt[0]) { + case SUB_CB: + callback=UCNV_TO_U_CALLBACK_SUBSTITUTE; + break; + case SKIP_CB: + callback=UCNV_TO_U_CALLBACK_SKIP; + break; + case STOP_CB: + callback=UCNV_TO_U_CALLBACK_STOP; + break; + case ESC_CB: + callback=UCNV_TO_U_CALLBACK_ESCAPE; + break; + default: + callback=NULL; + break; + } + option=callback==NULL ? cbopt : cbopt+1; + if(*option==0) { + option=NULL; + } + + cc.invalidChars=testCase->getBinary(cc.invalidLength, "invalidChars", errorCode); + + if(U_FAILURE(errorCode)) { + errln("error parsing conversion/toUnicode test case %d - %s", + i, u_errorName(errorCode)); + errorCode=U_ZERO_ERROR; + } else { + logln("TestToUnicode[%d] %s", i, charset); + ToUnicodeCase(cc, callback, option); + } + } + delete testData; + } + delete dataModule; + } + else { + errln("Failed: could not load test conversion data"); + } +} + +void +ConversionTest::TestFromUnicode() { + ConversionCase cc; + char charset[100], cbopt[4]; + const char *option; + UnicodeString s, unicode, invalidUChars; + int32_t offsetsLength; + UConverterFromUCallback callback; + + TestDataModule *dataModule; + TestData *testData; + const DataMap *testCase; + const UChar *p; + UErrorCode errorCode; + int32_t i, length; + + errorCode=U_ZERO_ERROR; + dataModule=TestDataModule::getTestDataModule("conversion", *this, errorCode); + if(U_SUCCESS(errorCode)) { + testData=dataModule->createTestData("fromUnicode", errorCode); + if(U_SUCCESS(errorCode)) { + for(i=0; testData->nextCase(testCase, errorCode); ++i) { + if(U_FAILURE(errorCode)) { + errln("error retrieving conversion/fromUnicode test case %d - %s", + i, u_errorName(errorCode)); + errorCode=U_ZERO_ERROR; + continue; + } + + cc.caseNr=i; + + s=testCase->getString("charset", errorCode); + s.extract(0, 0x7fffffff, charset, sizeof(charset), ""); + cc.charset=charset; + + unicode=testCase->getString("unicode", errorCode); + cc.unicode=unicode.getBuffer(); + cc.unicodeLength=unicode.length(); + cc.bytes=testCase->getBinary(cc.bytesLength, "bytes", errorCode); + + offsetsLength=0; + cc.offsets=testCase->getIntVector(offsetsLength, "offsets", errorCode); + if(offsetsLength==0) { + cc.offsets=NULL; + } else if(offsetsLength!=cc.bytesLength) { + errln("fromUnicode[%d] bytes[%d] and offsets[%d] must have the same length", + i, cc.bytesLength, offsetsLength); + errorCode=U_ILLEGAL_ARGUMENT_ERROR; + } + + cc.finalFlush= 0!=testCase->getInt28("flush", errorCode); + cc.fallbacks= 0!=testCase->getInt28("fallbacks", errorCode); + + s=testCase->getString("errorCode", errorCode); + if(s==UNICODE_STRING("invalid", 7)) { + cc.outErrorCode=U_INVALID_CHAR_FOUND; + } else if(s==UNICODE_STRING("illegal", 7)) { + cc.outErrorCode=U_ILLEGAL_CHAR_FOUND; + } else if(s==UNICODE_STRING("truncated", 9)) { + cc.outErrorCode=U_TRUNCATED_CHAR_FOUND; + } else { + cc.outErrorCode=U_ZERO_ERROR; + } + + s=testCase->getString("callback", errorCode); + + // read NUL-separated subchar first, if any + length=u_strlen(p=s.getTerminatedBuffer()); + if(++length=(int32_t)sizeof(cc.subchar)) { + errorCode=U_ILLEGAL_ARGUMENT_ERROR; + } else { + int32_t j; + + for(j=0; jgetString("invalidUChars", errorCode); + cc.invalidUChars=invalidUChars.getBuffer(); + cc.invalidLength=invalidUChars.length(); + + if(U_FAILURE(errorCode)) { + errln("error parsing conversion/fromUnicode test case %d - %s", + i, u_errorName(errorCode)); + errorCode=U_ZERO_ERROR; + } else { + logln("TestFromUnicode[%d] %s", i, charset); + FromUnicodeCase(cc, callback, option); + } + } + delete testData; + } + delete dataModule; + } + else { + errln("Failed: could not load test conversion data"); + } +} + +static const UChar ellipsis[]={ 0x2e, 0x2e, 0x2e }; + +void +ConversionTest::TestGetUnicodeSet() { + char charset[100]; + UnicodeString s, map, mapnot; + int32_t which; + + ParsePosition pos; + UnicodeSet cnvSet, mapSet, mapnotSet, diffSet; + UConverter *cnv; + + TestDataModule *dataModule; + TestData *testData; + const DataMap *testCase; + UErrorCode errorCode; + int32_t i; + + errorCode=U_ZERO_ERROR; + dataModule=TestDataModule::getTestDataModule("conversion", *this, errorCode); + if(U_SUCCESS(errorCode)) { + testData=dataModule->createTestData("getUnicodeSet", errorCode); + if(U_SUCCESS(errorCode)) { + for(i=0; testData->nextCase(testCase, errorCode); ++i) { + if(U_FAILURE(errorCode)) { + errln("error retrieving conversion/getUnicodeSet test case %d - %s", + i, u_errorName(errorCode)); + errorCode=U_ZERO_ERROR; + continue; + } + + s=testCase->getString("charset", errorCode); + s.extract(0, 0x7fffffff, charset, sizeof(charset), ""); + + map=testCase->getString("map", errorCode); + mapnot=testCase->getString("mapnot", errorCode); + + which=testCase->getInt28("which", errorCode); + + if(U_FAILURE(errorCode)) { + errln("error parsing conversion/getUnicodeSet test case %d - %s", + i, u_errorName(errorCode)); + errorCode=U_ZERO_ERROR; + continue; + } + + // test this test case + mapSet.clear(); + mapnotSet.clear(); + + pos.setIndex(0); + mapSet.applyPattern(map, pos, 0, NULL, errorCode); + if(U_FAILURE(errorCode) || pos.getIndex()!=map.length()) { + errln("error creating the map set for conversion/getUnicodeSet test case %d - %s\n" + " error index %d index %d U+%04x", + i, u_errorName(errorCode), pos.getErrorIndex(), pos.getIndex(), map.char32At(pos.getIndex())); + errorCode=U_ZERO_ERROR; + continue; + } + + pos.setIndex(0); + mapnotSet.applyPattern(mapnot, pos, 0, NULL, errorCode); + if(U_FAILURE(errorCode) || pos.getIndex()!=mapnot.length()) { + errln("error creating the mapnot set for conversion/getUnicodeSet test case %d - %s\n" + " error index %d index %d U+%04x", + i, u_errorName(errorCode), pos.getErrorIndex(), pos.getIndex(), mapnot.char32At(pos.getIndex())); + errorCode=U_ZERO_ERROR; + continue; + } + + logln("TestGetUnicodeSet[%d] %s", i, charset); + + cnv=cnv_open(charset, errorCode); + if(U_FAILURE(errorCode)) { + errln("error opening \"%s\" for conversion/getUnicodeSet test case %d - %s", + charset, i, u_errorName(errorCode)); + errorCode=U_ZERO_ERROR; + continue; + } + + ucnv_getUnicodeSet(cnv, (USet *)&cnvSet, (UConverterUnicodeSet)which, &errorCode); + ucnv_close(cnv); + + if(U_FAILURE(errorCode)) { + errln("error in ucnv_getUnicodeSet(\"%s\") for conversion/getUnicodeSet test case %d - %s", + charset, i, u_errorName(errorCode)); + errorCode=U_ZERO_ERROR; + continue; + } + + // are there items that must be in cnvSet but are not? + (diffSet=mapSet).removeAll(cnvSet); + if(!diffSet.isEmpty()) { + diffSet.toPattern(s, TRUE); + if(s.length()>100) { + s.replace(100, 0x7fffffff, ellipsis, LENGTHOF(ellipsis)); + } + errln("error: ucnv_getUnicodeSet(\"%s\") is missing items - conversion/getUnicodeSet test case %d", + charset, i); + errln(s); + } + + // are there items that must not be in cnvSet but are? + (diffSet=mapnotSet).retainAll(cnvSet); + if(!diffSet.isEmpty()) { + diffSet.toPattern(s, TRUE); + if(s.length()>100) { + s.replace(100, 0x7fffffff, ellipsis, LENGTHOF(ellipsis)); + } + errln("error: ucnv_getUnicodeSet(\"%s\") contains unexpected items - conversion/getUnicodeSet test case %d", + charset, i); + errln(s); + } + } + delete testData; + } + delete dataModule; + } + else { + errln("Failed: could not load test conversion data"); + } +} + +// open testdata or ICU data converter ------------------------------------- *** + +UConverter * +ConversionTest::cnv_open(const char *name, UErrorCode &errorCode) { + if(name!=NULL && *name=='*') { + /* loadTestData(): set the data directory */ + return ucnv_openPackage(loadTestData(errorCode), name+1, &errorCode); + } else { + return ucnv_open(name, &errorCode); + } +} + +// output helpers ---------------------------------------------------------- *** + +static inline char +hexDigit(uint8_t digit) { + return digit<=9 ? (char)('0'+digit) : (char)('a'-10+digit); +} + +static char * +printBytes(const uint8_t *bytes, int32_t length, char *out) { + uint8_t b; + + if(length>0) { + b=*bytes++; + --length; + *out++=hexDigit((uint8_t)(b>>4)); + *out++=hexDigit((uint8_t)(b&0xf)); + } + + while(length>0) { + b=*bytes++; + --length; + *out++=' '; + *out++=hexDigit((uint8_t)(b>>4)); + *out++=hexDigit((uint8_t)(b&0xf)); + } + *out++=0; + return out; +} + +static char * +printUnicode(const UChar *unicode, int32_t length, char *out) { + UChar32 c; + int32_t i; + + for(i=0; i0) { + *out++=' '; + } + U16_NEXT(unicode, i, length, c); + // write 4..6 digits + if(c>=0x100000) { + *out++='1'; + } + if(c>=0x10000) { + *out++=hexDigit((uint8_t)((c>>16)&0xf)); + } + *out++=hexDigit((uint8_t)((c>>12)&0xf)); + *out++=hexDigit((uint8_t)((c>>8)&0xf)); + *out++=hexDigit((uint8_t)((c>>4)&0xf)); + *out++=hexDigit((uint8_t)(c&0xf)); + } + *out++=0; + return out; +} + +static char * +printOffsets(const int32_t *offsets, int32_t length, char *out) { + int32_t i, o, d; + + if(offsets==NULL) { + length=0; + } + + for(i=0; i0) { + *out++=' '; + } + o=offsets[i]; + + // print all offsets with 2 characters each (-x, -9..99, xx) + if(o<-9) { + *out++='-'; + *out++='x'; + } else if(o<0) { + *out++='-'; + *out++=(char)('0'-o); + } else if(o<=99) { + *out++=(d=o/10)==0 ? ' ' : (char)('0'+d); + *out++=(char)('0'+o%10); + } else /* o>99 */ { + *out++='x'; + *out++='x'; + } + } + *out++=0; + return out; +} + +// toUnicode test worker functions ----------------------------------------- *** + +static int32_t +stepToUnicode(ConversionCase &cc, UConverter *cnv, + UChar *result, int32_t resultCapacity, + int32_t *resultOffsets, /* also resultCapacity */ + int32_t step, + UErrorCode *pErrorCode) { + const char *source, *sourceLimit, *bytesLimit; + UChar *target, *targetLimit, *resultLimit; + UBool flush; + + source=(const char *)cc.bytes; + target=result; + bytesLimit=source+cc.bytesLength; + resultLimit=result+resultCapacity; + + if(step>=0) { + // call ucnv_toUnicode() with in/out buffers no larger than (step) at a time + // move only one buffer (in vs. out) at a time to be extra mean + // step==0 performs bulk conversion and generates offsets + + // initialize the partial limits for the loop + if(step==0) { + // use the entire buffers + sourceLimit=bytesLimit; + targetLimit=resultLimit; + flush=cc.finalFlush; + } else { + // start with empty partial buffers + sourceLimit=source; + targetLimit=target; + flush=FALSE; + + // output offsets only for bulk conversion + resultOffsets=NULL; + } + + for(;;) { + // resetting the opposite conversion direction must not affect this one + ucnv_resetFromUnicode(cnv); + + // convert + ucnv_toUnicode(cnv, + &target, targetLimit, + &source, sourceLimit, + resultOffsets, + flush, pErrorCode); + + // check pointers and errors + if(source>sourceLimit || target>targetLimit) { + *pErrorCode=U_INTERNAL_PROGRAM_ERROR; + break; + } else if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR) { + if(target!=targetLimit) { + // buffer overflow must only be set when the target is filled + *pErrorCode=U_INTERNAL_PROGRAM_ERROR; + break; + } else if(targetLimit==resultLimit) { + // not just a partial overflow + break; + } + + // the partial target is filled, set a new limit, reset the error and continue + targetLimit=(resultLimit-target)>=step ? target+step : resultLimit; + *pErrorCode=U_ZERO_ERROR; + } else if(U_FAILURE(*pErrorCode)) { + // some other error occurred, done + break; + } else { + if(source!=sourceLimit) { + // when no error occurs, then the input must be consumed + *pErrorCode=U_INTERNAL_PROGRAM_ERROR; + break; + } + + if(sourceLimit==bytesLimit) { + // we are done + break; + } + + // the partial conversion succeeded, set a new limit and continue + sourceLimit=(bytesLimit-source)>=step ? source+step : bytesLimit; + flush=(UBool)(cc.finalFlush && sourceLimit==bytesLimit); + } + } + } else /* step<0 */ { + /* + * step==-1: call only ucnv_getNextUChar() + * otherwise alternate between ucnv_toUnicode() and ucnv_getNextUChar() + * if step==-2 or -3, then give ucnv_toUnicode() the whole remaining input, + * else give it at most (-step-2)/2 bytes + */ + UChar32 c; + + // end the loop by getting an index out of bounds error + for(;;) { + // resetting the opposite conversion direction must not affect this one + ucnv_resetFromUnicode(cnv); + + // convert + if((step&1)!=0 /* odd: -1, -3, -5, ... */) { + sourceLimit=source; // use sourceLimit not as a real limit + // but to remember the pre-getNextUChar source pointer + c=ucnv_getNextUChar(cnv, &source, bytesLimit, pErrorCode); + + // check pointers and errors + if(*pErrorCode==U_INDEX_OUTOFBOUNDS_ERROR) { + if(source!=bytesLimit) { + *pErrorCode=U_INTERNAL_PROGRAM_ERROR; + } else { + *pErrorCode=U_ZERO_ERROR; + } + break; + } else if(U_FAILURE(*pErrorCode)) { + break; + } + // source may not move if c is from previous overflow + + if(target==resultLimit) { + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + break; + } + if(c<=0xffff) { + *target++=(UChar)c; + } else { + *target++=U16_LEAD(c); + if(target==resultLimit) { + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + break; + } + *target++=U16_TRAIL(c); + } + + // alternate between -n-1 and -n but leave -1 alone + if(step<-1) { + ++step; + } + } else /* step is even */ { + // allow only one UChar output + targetLimit=targetbytesLimit) { + sourceLimit=bytesLimit; + } + } + + ucnv_toUnicode(cnv, + &target, targetLimit, + &source, sourceLimit, + NULL, (UBool)(sourceLimit==bytesLimit), pErrorCode); + + // check pointers and errors + if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR) { + if(target!=targetLimit) { + // buffer overflow must only be set when the target is filled + *pErrorCode=U_INTERNAL_PROGRAM_ERROR; + break; + } else if(targetLimit==resultLimit) { + // not just a partial overflow + break; + } + + // the partial target is filled, set a new limit and continue + *pErrorCode=U_ZERO_ERROR; + } else if(U_FAILURE(*pErrorCode)) { + // some other error occurred, done + break; + } else { + if(source!=sourceLimit) { + // when no error occurs, then the input must be consumed + *pErrorCode=U_INTERNAL_PROGRAM_ERROR; + break; + } + + // we are done (flush==TRUE) but we continue, to get the index out of bounds error above + } + + --step; + } + } + } + + return (int32_t)(target-result); +} + +UBool +ConversionTest::ToUnicodeCase(ConversionCase &cc, UConverterToUCallback callback, const char *option) { + UConverter *cnv; + UErrorCode errorCode; + + // open the converter + errorCode=U_ZERO_ERROR; + cnv=cnv_open(cc.charset, errorCode); + if(U_FAILURE(errorCode)) { + errln("toUnicode[%d](%s cb=\"%s\" fb=%d flush=%d) ucnv_open() failed - %s", + cc.caseNr, cc.charset, cc.cbopt, cc.fallbacks, cc.finalFlush, u_errorName(errorCode)); + return FALSE; + } + + // set the callback + if(callback!=NULL) { + ucnv_setToUCallBack(cnv, callback, option, NULL, NULL, &errorCode); + if(U_FAILURE(errorCode)) { + errln("toUnicode[%d](%s cb=\"%s\" fb=%d flush=%d) ucnv_setToUCallBack() failed - %s", + cc.caseNr, cc.charset, cc.cbopt, cc.fallbacks, cc.finalFlush, u_errorName(errorCode)); + ucnv_close(cnv); + return FALSE; + } + } + + int32_t resultOffsets[200]; + UChar result[200]; + int32_t resultLength; + UBool ok; + + static const struct { + int32_t step; + const char *name; + } steps[]={ + { 0, "bulk" }, // must be first for offsets to be checked + { 1, "step=1" }, + { 3, "step=3" }, + { 7, "step=7" }, + { -1, "getNext" }, + { -2, "toU(bulk)+getNext" }, + { -3, "getNext+toU(bulk)" }, + { -4, "toU(1)+getNext" }, + { -5, "getNext+toU(1)" }, + { -12, "toU(5)+getNext" }, + { -13, "getNext+toU(5)" }, + }; + int32_t i, step; + + ok=TRUE; + for(i=0; i(int32_t)sizeof(buffer)) { + errln("toUnicode[%d](%s cb=\"%s\" fb=%d flush=%d %s) fatal error: checkToUnicode() test output buffer overflow writing %d chars\n", + cc.caseNr, cc.charset, cc.cbopt, cc.fallbacks, cc.finalFlush, name, (int)(s-buffer)); + exit(1); + } + + errln("toUnicode[%d](%s cb=\"%s\" fb=%d flush=%d %s) failed: %s\n" + " bytes <%s>[%d]\n" + " expected <%s>[%d]\n" + " result <%s>[%d]\n" + " offsets <%s>\n" + " result offsets <%s>\n" + " error code expected %s got %s\n" + " invalidChars expected <%s> got <%s>\n", + cc.caseNr, cc.charset, cc.cbopt, cc.fallbacks, cc.finalFlush, name, msg, + bytesString, cc.bytesLength, + unicodeString, cc.unicodeLength, + resultString, resultLength, + offsetsString, + resultOffsetsString, + u_errorName(cc.outErrorCode), u_errorName(resultErrorCode), + invalidCharsString, resultInvalidCharsString); + + return FALSE; + } +} + +// fromUnicode test worker functions --------------------------------------- *** + +static int32_t +stepFromUnicode(ConversionCase &cc, UConverter *cnv, + char *result, int32_t resultCapacity, + int32_t *resultOffsets, /* also resultCapacity */ + int32_t step, + UErrorCode *pErrorCode) { + const UChar *source, *sourceLimit, *unicodeLimit; + char *target, *targetLimit, *resultLimit; + UBool flush; + + source=cc.unicode; + target=result; + unicodeLimit=source+cc.unicodeLength; + resultLimit=result+resultCapacity; + + // call ucnv_fromUnicode() with in/out buffers no larger than (step) at a time + // move only one buffer (in vs. out) at a time to be extra mean + // step==0 performs bulk conversion and generates offsets + + // initialize the partial limits for the loop + if(step==0) { + // use the entire buffers + sourceLimit=unicodeLimit; + targetLimit=resultLimit; + flush=cc.finalFlush; + } else { + // start with empty partial buffers + sourceLimit=source; + targetLimit=target; + flush=FALSE; + + // output offsets only for bulk conversion + resultOffsets=NULL; + } + + for(;;) { + // resetting the opposite conversion direction must not affect this one + ucnv_resetToUnicode(cnv); + + // convert + ucnv_fromUnicode(cnv, + &target, targetLimit, + &source, sourceLimit, + resultOffsets, + flush, pErrorCode); + + // check pointers and errors + if(source>sourceLimit || target>targetLimit) { + *pErrorCode=U_INTERNAL_PROGRAM_ERROR; + break; + } else if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR) { + if(target!=targetLimit) { + // buffer overflow must only be set when the target is filled + *pErrorCode=U_INTERNAL_PROGRAM_ERROR; + break; + } else if(targetLimit==resultLimit) { + // not just a partial overflow + break; + } + + // the partial target is filled, set a new limit, reset the error and continue + targetLimit=(resultLimit-target)>=step ? target+step : resultLimit; + *pErrorCode=U_ZERO_ERROR; + } else if(U_FAILURE(*pErrorCode)) { + // some other error occurred, done + break; + } else { + if(source!=sourceLimit) { + // when no error occurs, then the input must be consumed + *pErrorCode=U_INTERNAL_PROGRAM_ERROR; + break; + } + + if(sourceLimit==unicodeLimit) { + // we are done + break; + } + + // the partial conversion succeeded, set a new limit and continue + sourceLimit=(unicodeLimit-source)>=step ? source+step : unicodeLimit; + flush=(UBool)(cc.finalFlush && sourceLimit==unicodeLimit); + } + } + + return (int32_t)(target-result); +} + +UBool +ConversionTest::FromUnicodeCase(ConversionCase &cc, UConverterFromUCallback callback, const char *option) { + UConverter *cnv; + UErrorCode errorCode; + + // open the converter + errorCode=U_ZERO_ERROR; + cnv=cnv_open(cc.charset, errorCode); + if(U_FAILURE(errorCode)) { + errln("fromUnicode[%d](%s cb=\"%s\" fb=%d flush=%d) ucnv_open() failed - %s", + cc.caseNr, cc.charset, cc.cbopt, cc.fallbacks, cc.finalFlush, u_errorName(errorCode)); + return FALSE; + } + + // set the callback + if(callback!=NULL) { + ucnv_setFromUCallBack(cnv, callback, option, NULL, NULL, &errorCode); + if(U_FAILURE(errorCode)) { + errln("fromUnicode[%d](%s cb=\"%s\" fb=%d flush=%d) ucnv_setFromUCallBack() failed - %s", + cc.caseNr, cc.charset, cc.cbopt, cc.fallbacks, cc.finalFlush, u_errorName(errorCode)); + ucnv_close(cnv); + return FALSE; + } + } + + // set the fallbacks flag + // TODO change with Jitterbug 2401, then add a similar call for toUnicode too + ucnv_setFallback(cnv, cc.fallbacks); + + // set the subchar + int32_t length; + + if((length=(int32_t)strlen(cc.subchar))!=0) { + ucnv_setSubstChars(cnv, cc.subchar, (int8_t)length, &errorCode); + if(U_FAILURE(errorCode)) { + errln("fromUnicode[%d](%s cb=\"%s\" fb=%d flush=%d) ucnv_setSubChars() failed - %s", + cc.caseNr, cc.charset, cc.cbopt, cc.fallbacks, cc.finalFlush, u_errorName(errorCode)); + ucnv_close(cnv); + return FALSE; + } + } + + int32_t resultOffsets[200]; + char result[200]; + int32_t resultLength; + UBool ok; + + static const struct { + int32_t step; + const char *name; + } steps[]={ + { 0, "bulk" }, // must be first for offsets to be checked + { 1, "step=1" }, + { 3, "step=3" }, + { 7, "step=7" } + }; + int32_t i, step; + + ok=TRUE; + for(i=0; i(int32_t)sizeof(buffer)) { + errln("fromUnicode[%d](%s cb=\"%s\" fb=%d flush=%d %s) fatal error: checkFromUnicode() test output buffer overflow writing %d chars\n", + cc.caseNr, cc.charset, cc.cbopt, cc.fallbacks, cc.finalFlush, name, (int)(s-buffer)); + exit(1); + } + + errln("fromUnicode[%d](%s cb=\"%s\" fb=%d flush=%d %s) failed: %s\n" + " unicode <%s>[%d]\n" + " expected <%s>[%d]\n" + " result <%s>[%d]\n" + " offsets <%s>\n" + " result offsets <%s>\n" + " error code expected %s got %s\n" + " invalidChars expected <%s> got <%s>\n", + cc.caseNr, cc.charset, cc.cbopt, cc.fallbacks, cc.finalFlush, name, msg, + unicodeString, cc.unicodeLength, + bytesString, cc.bytesLength, + resultString, resultLength, + offsetsString, + resultOffsetsString, + u_errorName(cc.outErrorCode), u_errorName(resultErrorCode), + invalidCharsString, resultInvalidUCharsString); + + return FALSE; + } +} + +#endif /* #if !UCONFIG_NO_LEGACY_CONVERSION */ diff --git a/icuSources/test/intltest/convtest.h b/icuSources/test/intltest/convtest.h new file mode 100644 index 00000000..b98aec0c --- /dev/null +++ b/icuSources/test/intltest/convtest.h @@ -0,0 +1,91 @@ +/* +******************************************************************************* +* +* Copyright (C) 2003, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: convtest.h +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2003jul15 +* created by: Markus W. Scherer +* +* Test file for data-driven conversion tests. +*/ + +#ifndef __CONVTEST_H__ +#define __CONVTEST_H__ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_LEGACY_CONVERSION + +#include "unicode/ucnv.h" +#include "intltest.h" + +struct ConversionCase { + int32_t caseNr; + const char *charset, *cbopt, *name; + char subchar[8]; + + const uint8_t *bytes; + int32_t bytesLength; + const UChar *unicode; + int32_t unicodeLength; + const int32_t *offsets; + + UBool finalFlush; + UBool fallbacks; + UErrorCode outErrorCode; + const uint8_t *invalidChars; + const UChar *invalidUChars; + int32_t invalidLength; + + uint8_t resultBytes[200]; + UChar resultUnicode[200]; + int32_t resultOffsets[200]; + int32_t resultLength; + + UErrorCode resultErrorCode; +}; + +class ConversionTest : public IntlTest { +public: + ConversionTest() {} + virtual ~ConversionTest(); + + void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=0); + + void TestToUnicode(); + void TestFromUnicode(); + void TestGetUnicodeSet(); + +private: + UBool + ToUnicodeCase(ConversionCase &cc, UConverterToUCallback callback, const char *option); + + UBool + FromUnicodeCase(ConversionCase &cc, UConverterFromUCallback callback, const char *option); + + UBool + checkToUnicode(ConversionCase &cc, UConverter *cnv, const char *name, + const UChar *result, int32_t resultLength, + const int32_t *resultOffsets, + UErrorCode resultErrorCode); + + UBool + checkFromUnicode(ConversionCase &cc, UConverter *cnv, const char *name, + const uint8_t *result, int32_t resultLength, + const int32_t *resultOffsets, + UErrorCode resultErrorCode); + + UConverter * + cnv_open(const char *name, UErrorCode &errorCode); +}; + +#endif /* #if !UCONFIG_NO_LEGACY_CONVERSION */ + +#endif diff --git a/icuSources/test/intltest/cpdtrtst.cpp b/icuSources/test/intltest/cpdtrtst.cpp index 1708492d..e23ec1fd 100644 --- a/icuSources/test/intltest/cpdtrtst.cpp +++ b/icuSources/test/intltest/cpdtrtst.cpp @@ -12,15 +12,12 @@ #if !UCONFIG_NO_TRANSLITERATION -#include "ittrans.h" #include "cpdtrtst.h" #include "unicode/utypes.h" #include "unicode/translit.h" +#include "unicode/uniset.h" #include "cpdtrans.h" -#include "intltest.h" #include "cmemory.h" -#include -#include //--------------------------------------------- // runIndexedTest @@ -209,6 +206,23 @@ void CompoundTransliteratorTest::TestGetCount(){ ct5->getCount() == ct2->getCount() || ct5->getCount() == ct3->getCount() ) { errln("Error: getCount() failed"); } + + /* Quick test getTargetSet(), only test that it doesn't die. TODO: a better test. */ + UnicodeSet ts; + UnicodeSet *retUS = NULL; + retUS = &ct1->getTargetSet(ts); + if (retUS != &ts || ts.size() == 0) { + errln("CompoundTransliterator::getTargetSet() failed.\n"); + } + + /* Quick test getSourceSet(), only test that it doesn't die. TODO: a better test. */ + UnicodeSet ss; + retUS = NULL; + retUS = &ct1->getSourceSet(ss); + if (retUS != &ss || ss.size() == 0) { + errln("CompoundTransliterator::getSourceSet() failed.\n"); + } + delete ct1; delete ct2; delete ct4; @@ -331,8 +345,8 @@ void CompoundTransliteratorTest::TestTransliterate(){ errln("CompoundTransliterator construction failed"); }else { #if 0 - // handleTransliterate is a protected method that was erroneously made - // public. It is not public API that needs to be tested. + // handleTransliterate is a protected method that was erroneously made + // public. It is not public API that needs to be tested. UnicodeString s("abcabc"); expect(*ct1, s, s); UTransPosition index = { 0, 0, 0, 0 }; diff --git a/icuSources/test/intltest/cpdtrtst.h b/icuSources/test/intltest/cpdtrtst.h index a8603cf8..463a29eb 100644 --- a/icuSources/test/intltest/cpdtrtst.h +++ b/icuSources/test/intltest/cpdtrtst.h @@ -18,7 +18,6 @@ #if !UCONFIG_NO_TRANSLITERATION #include "unicode/translit.h" -#include "cpdtrans.h" #include "intltest.h" /** diff --git a/icuSources/test/intltest/cpputils.cpp b/icuSources/test/intltest/cpputils.cpp deleted file mode 100644 index 3bf3a8e3..00000000 --- a/icuSources/test/intltest/cpputils.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/******************************************************************** - * COPYRIGHT: - * Copyright (c) 1999, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ -#include "unicode/utypes.h" -#include "cpputils.h" -#include -#include -#include - - -/*Debugging functions, DO NOT USE*/ -; - -void printUChar(const UChar *uniString) -{ - uint32_t i=0; - - putchar('{'); - while (uniString[i]) - { - printf( "0x%.4X\t", (UChar)uniString[i++]); - if (!(i%8)) putchar('\n'); - } - putchar('}'); - printf("(%d)", i); - -} - -void printChar(const char *charString) -{ - uint32_t i=0; - - putchar('{'); - while (charString[i]) - - { - printf( "0x%.2X\t", (unsigned char)charString[i++]); - if (!(i%8)) putchar('\n'); - } - putchar('}'); - printf("(%d)", i); - -} - - - diff --git a/icuSources/test/intltest/cpputils.h b/icuSources/test/intltest/cpputils.h deleted file mode 100644 index c562dd75..00000000 --- a/icuSources/test/intltest/cpputils.h +++ /dev/null @@ -1,14 +0,0 @@ -/******************************************************************** - * COPYRIGHT: - * Copyright (c) 1997-1999, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ -/* Wraps C++ internal utilities needed in C -Bertrand A. D.*/ - -#include "unicode/utypes.h" -U_CAPI void printUChar(const UChar* uniString); -U_CAPI void printChar( const char* charString); - -U_CAPI void T_PlatformUtilities_pathnameInContext( char *fullname, int32_t maxsize, const char * relPath); -U_CAPI const char *T_PlatformUtilities_getDefaultDataDirectory(void); diff --git a/icuSources/test/intltest/cputilst.cpp b/icuSources/test/intltest/cputilst.cpp deleted file mode 100644 index d61e728d..00000000 --- a/icuSources/test/intltest/cputilst.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/******************************************************************** - * COPYRIGHT: - * Copyright (c) 2001, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ -#include "unicode/utypes.h" -#include "cputilst.h" -#include -#include -#include - - -/*Debugging functions, DO NOT USE*/ -; - -void printUChar(const UChar *uniString) -{ - uint32_t i=0; - - putchar('{'); - while (uniString[i]) - { - printf( "0x%.4X\t", (UChar)uniString[i++]); - if (!(i%8)) putchar('\n'); - } - putchar('}'); - printf("(%d)", i); - -} - -void printChar(const char *charString) -{ - uint32_t i=0; - - putchar('{'); - while (charString[i]) - - { - printf( "0x%.2X\t", (unsigned char)charString[i++]); - if (!(i%8)) putchar('\n'); - } - putchar('}'); - printf("(%d)", i); - -} - - - diff --git a/icuSources/test/intltest/cputilst.h b/icuSources/test/intltest/cputilst.h deleted file mode 100644 index 2fa44444..00000000 --- a/icuSources/test/intltest/cputilst.h +++ /dev/null @@ -1,14 +0,0 @@ -/******************************************************************** - * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ -/* Wraps C++ internal utilities needed in C -Bertrand A. D.*/ - -#include "unicode/utypes.h" -U_CAPI void printUChar(const UChar* uniString); -U_CAPI void printChar( const char* charString); - -U_CAPI void T_PlatformUtilities_pathnameInContext( char *fullname, int32_t maxsize, const char * relPath); -U_CAPI const char *T_PlatformUtilities_getDefaultDataDirectory(void); diff --git a/icuSources/test/intltest/dadrcoll.cpp b/icuSources/test/intltest/dadrcoll.cpp index 30c6540a..738ed133 100644 --- a/icuSources/test/intltest/dadrcoll.cpp +++ b/icuSources/test/intltest/dadrcoll.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -20,12 +20,10 @@ #if !UCONFIG_NO_COLLATION #include "unicode/uchar.h" - +#include "unicode/tstdtmod.h" #include "cstring.h" #include "ucol_tok.h" - #include "tscoll.h" - #include "dadrcoll.h" U_CDECL_BEGIN @@ -39,9 +37,7 @@ DataDrivenCollatorTest::DataDrivenCollatorTest() status(U_ZERO_ERROR), sequences(status) { - TestLog testLog; - - driver = TestDataModule::getTestDataModule("DataDrivenCollationTest", testLog, status); + driver = TestDataModule::getTestDataModule("DataDrivenCollationTest", *this, status); sequences.setDeleter(deleteSeqElement); } diff --git a/icuSources/test/intltest/dadrcoll.h b/icuSources/test/intltest/dadrcoll.h index 7dd25051..c9e99257 100644 --- a/icuSources/test/intltest/dadrcoll.h +++ b/icuSources/test/intltest/dadrcoll.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 2002-2003, International Business Machines Corporation and + * Copyright (c) 2002-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -23,8 +23,9 @@ #include "unicode/tblcoll.h" #include "unicode/sortkey.h" #include "unicode/schriter.h" -#include "unicode/ures.h" -#include "tstdtmod.h" + +class TestDataModule; +class TestData; class SeqElement { public: diff --git a/icuSources/test/intltest/dcfmapts.cpp b/icuSources/test/intltest/dcfmapts.cpp index 3fc9de4b..8a798dac 100644 --- a/icuSources/test/intltest/dcfmapts.cpp +++ b/icuSources/test/intltest/dcfmapts.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-1999, International Business Machines Corporation and + * Copyright (c) 1997-2003, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ diff --git a/icuSources/test/intltest/dtfmapts.cpp b/icuSources/test/intltest/dtfmapts.cpp index 3e70df54..971213c2 100644 --- a/icuSources/test/intltest/dtfmapts.cpp +++ b/icuSources/test/intltest/dtfmapts.cpp @@ -1,8 +1,8 @@ -/******************************************************************** +/*********************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ + * Copyright (c) 1997-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ***********************************************************************/ #include "unicode/utypes.h" @@ -277,7 +277,7 @@ IntlTestDateFormatAPI::TestNameHiding(void) { fmt->format(numObj, str, fpos, status); delete fmt; } else { - errln("FAIL: Can't create NumberFormat"); + errln("FAIL: Can't create NumberFormat()"); } } diff --git a/icuSources/test/intltest/dtfmrgts.cpp b/icuSources/test/intltest/dtfmrgts.cpp index 40e19395..6e007bcb 100644 --- a/icuSources/test/intltest/dtfmrgts.cpp +++ b/icuSources/test/intltest/dtfmrgts.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -434,7 +434,7 @@ void DateFormatRegressionTest::Test4065240(void) // Check to see if the resource is present; if not, we can't test ResourceBundle *bundle = new ResourceBundle( - u_getDataDirectory(), *curLocale, status); + NULL, *curLocale, status); failure(status, "new ResourceBundle"); //(UnicodeString) "java.text.resources.DateFormatZoneData", curLocale); @@ -671,7 +671,7 @@ void DateFormatRegressionTest::Test4101483(void) UErrorCode status = U_ZERO_ERROR; SimpleDateFormat *sdf = new SimpleDateFormat(UnicodeString("z"), Locale::getUS(), status); failure(status, "new SimpleDateFormat"); - FieldPosition fp(DateFormat::TIMEZONE_FIELD); + FieldPosition fp(UDAT_TIMEZONE_FIELD); //Date d = date(9234567890L); UDate d = 9234567890.0; //StringBuffer buf = new StringBuffer(""); diff --git a/icuSources/test/intltest/dtfmrgts.h b/icuSources/test/intltest/dtfmrgts.h index aba4739f..79ed8ee3 100644 --- a/icuSources/test/intltest/dtfmrgts.h +++ b/icuSources/test/intltest/dtfmrgts.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2003, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ diff --git a/icuSources/test/intltest/dtfmtrtts.cpp b/icuSources/test/intltest/dtfmtrtts.cpp index 7ebe0186..032b2dbd 100644 --- a/icuSources/test/intltest/dtfmtrtts.cpp +++ b/icuSources/test/intltest/dtfmtrtts.cpp @@ -1,8 +1,8 @@ -/******************************************************************** +/*********************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ + * Copyright (c) 1997-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ***********************************************************************/ #include "unicode/utypes.h" @@ -12,6 +12,7 @@ #include "unicode/smpdtfmt.h" #include "unicode/gregocal.h" #include "dtfmtrtts.h" +#include "caltest.h" #include #include @@ -38,13 +39,19 @@ int32_t DateFormatRoundTripTest::SPARSENESS = 0; int32_t DateFormatRoundTripTest::TRIALS = 4; int32_t DateFormatRoundTripTest::DEPTH = 5; +DateFormatRoundTripTest::DateFormatRoundTripTest() : dateFormat(0) { +} + +DateFormatRoundTripTest::~DateFormatRoundTripTest() { + delete dateFormat; +} #define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); logln((UnicodeString)""); test(); } break; void -DateFormatRoundTripTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) +DateFormatRoundTripTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* par ) { - // if (exec) logln((UnicodeString)"TestSuite NumberFormatRegressionTest"); + optionv = (par && *par=='v'); switch (index) { CASE(0,TestDateFormatRoundTrip) default: name = ""; break; @@ -80,8 +87,6 @@ DateFormatRoundTripTest::failure(UErrorCode status, const char* msg, const Unico void DateFormatRoundTripTest::TestDateFormatRoundTrip() { UErrorCode status = U_ZERO_ERROR; - dateFormat = new SimpleDateFormat((UnicodeString)"EEE MMM dd HH:mm:ss.SSS zzz yyyy G", status); - failure(status, "new SimpleDateFormat"); getFieldCal = Calendar::createInstance(status); failure(status, "Calendar::createInstance"); @@ -118,13 +123,24 @@ void DateFormatRoundTripTest::TestDateFormatRoundTrip() # else test(Locale::getDefault()); +#if 1 + // installed locales for (int i=0; i < locCount; ++i) { test(avail[i]); } +#endif + +#if 1 + // special locales + int32_t jCount = CalendarTest::testLocaleCount(); + for (int32_t j=0; j < jCount; ++j) { + test(Locale(CalendarTest::testLocaleID(j))); + } +#endif + # endif #endif - delete dateFormat; delete getFieldCal; } @@ -201,13 +217,13 @@ void DateFormatRoundTripTest::test(const Locale& loc) for(int32_t dstyle = DateFormat::FULL; dstyle <= DateFormat::SHORT; ++dstyle) { for(int32_t tstyle = DateFormat::FULL; tstyle <= DateFormat::SHORT; ++tstyle) { if(TEST_TABLE[itable++]) { - logln("Testing dstyle" + UnicodeString(styleName((DateFormat::EStyle)dstyle)) + ", tstyle" + UnicodeString(styleName((DateFormat::EStyle)tstyle)) ); + logln("Testing dstyle" + UnicodeString(styleName((DateFormat::EStyle)dstyle)) + ", tstyle" + UnicodeString(styleName((DateFormat::EStyle)tstyle)) ); DateFormat *df = DateFormat::createDateTimeInstance((DateFormat::EStyle)dstyle, (DateFormat::EStyle)tstyle, loc); if(df == NULL) { - errln(UnicodeString("Could not DF::createDateTimeInstance ") + UnicodeString(styleName((DateFormat::EStyle)dstyle)) + ", tstyle" + UnicodeString(styleName((DateFormat::EStyle)tstyle)) + "Locale: " + loc.getDisplayName(temp)); + errln(UnicodeString("Could not DF::createDateTimeInstance ") + UnicodeString(styleName((DateFormat::EStyle)dstyle)) + ", tstyle" + UnicodeString(styleName((DateFormat::EStyle)tstyle)) + "Locale: " + loc.getDisplayName(temp)); } else { - test(df, loc); - delete df; + test(df, loc); + delete df; } } } @@ -221,6 +237,15 @@ void DateFormatRoundTripTest::test(DateFormat *fmt, const Locale &origLocale, UB errln("DateFormat wasn't a SimpleDateFormat"); return; } + + UBool isGregorian = FALSE; + UErrorCode minStatus = U_ZERO_ERROR; + UDate minDate = CalendarTest::minDateOfCalendar(*fmt->getCalendar(), isGregorian, minStatus); + if(U_FAILURE(minStatus)) { + errln((UnicodeString)"Failure getting min date for " + origLocale.getName()); + return; + } + //logln(UnicodeString("Min date is ") + fullFormat(minDate) + " for " + origLocale.getName()); pat = ((SimpleDateFormat*)fmt)->toPattern(pat); @@ -246,7 +271,11 @@ void DateFormatRoundTripTest::test(DateFormat *fmt, const Locale &origLocale, UB UDate *d = new UDate [DEPTH]; UnicodeString *s = new UnicodeString[DEPTH]; - d[0] = generateDate(); + if(isGregorian == TRUE) { + d[0] = generateDate(); + } else { + d[0] = generateDate(minDate); + } UErrorCode status = U_ZERO_ERROR; @@ -266,6 +295,9 @@ void DateFormatRoundTripTest::test(DateFormat *fmt, const Locale &origLocale, UB s[loop] = fmt->format(d[loop], s[loop]); + // For displaying which date is being tested + //logln(s[loop] + " = " + fullFormat(d[loop])); + if(s[loop].length() == 0) { errln("FAIL: fmt->format gave 0-length string in " + pat + " with number " + d[loop] + " in locale " + origLocale.getName()); } @@ -313,13 +345,18 @@ void DateFormatRoundTripTest::test(DateFormat *fmt, const Locale &origLocale, UB // String usually matches in 1. Exceptions are checked for here. if(smatch > maxSmatch) { // Don't compute unless necessary + UBool in0; // Starts in BC, with no era in pattern if( ! hasEra && getField(d[0], UCAL_ERA) == GregorianCalendar::BC) maxSmatch = 2; // Starts in DST, no year in pattern - else if(fmt->getTimeZone().inDaylightTime(d[0], status) && ! failure(status, "gettingDaylightTime") && + else if((in0=fmt->getTimeZone().inDaylightTime(d[0], status)) && ! failure(status, "gettingDaylightTime") && pat.indexOf(UnicodeString("yyyy")) == -1) maxSmatch = 2; + // If we start not in DST, but transition into DST + else if (!in0 && + fmt->getTimeZone().inDaylightTime(d[1], status) && !failure(status, "gettingDaylightTime")) + maxSmatch = 2; // Two digit year with no time zone change, // unless timezone isn't used or we aren't close to the DST changover else if (pat.indexOf(UnicodeString("y")) != -1 @@ -339,23 +376,32 @@ void DateFormatRoundTripTest::test(DateFormat *fmt, const Locale &origLocale, UB } } - if((dmatch > maxDmatch || smatch > maxSmatch) && // Special case for Japanese (could have large negative years) - !strcmp(fmt->getCalendar()->getType(),"japanese")) { - maxSmatch = 4; - maxDmatch = 4; + if(dmatch > maxDmatch || smatch > maxSmatch) { // Special case for Japanese and Islamic (could have large negative years) + const char *type = fmt->getCalendar()->getType(); + if(!strcmp(type,"japanese")) { + maxSmatch = 4; + maxDmatch = 4; + } } - - if(dmatch > maxDmatch || smatch > maxSmatch) { - errln(UnicodeString("Pattern: ") + pat + UnicodeString(" failed to match in Locale: ") - + origLocale.getName()); - logln(UnicodeString(" Date ") + dmatch + " String " + smatch); - printf("dmatch:%d maxD:%d smatch:%d maxS:%d\n", dmatch,maxDmatch, smatch, maxSmatch); + // Use @v to see verbose results on successful cases + UBool fail = (dmatch > maxDmatch || smatch > maxSmatch); + if (optionv || fail) { + if (fail) { + errln(UnicodeString("\nFAIL: Pattern: ") + pat + + " in Locale: " + origLocale.getName()); + } else { + errln(UnicodeString("\nOk: Pattern: ") + pat + + " in Locale: " + origLocale.getName()); + } + logln("Date iters until match=%d (max allowed=%d), string iters until match=%d (max allowed=%d)", + dmatch,maxDmatch, smatch, maxSmatch); + for(int j = 0; j <= loop && j < DEPTH; ++j) { UnicodeString temp; FieldPosition pos(FieldPosition::DONT_CARE); - errln((j>0?" P> ":" ") + dateFormat->format(d[j], temp, pos) + " F> " + + errln((j>0?" P> ":" ") + fullFormat(d[j]) + " F> " + escape(s[j], temp) + UnicodeString(" d=") + d[j] + (j > 0 && d[j]/*.getTime()*/==d[j-1]/*.getTime()*/?" d==":"") + (j > 0 && s[j] == s[j-1]?" s==":"")); @@ -371,6 +417,22 @@ void DateFormatRoundTripTest::test(DateFormat *fmt, const Locale &origLocale, UB }*/ } +const UnicodeString& DateFormatRoundTripTest::fullFormat(UDate d) { + UErrorCode ec = U_ZERO_ERROR; + if (dateFormat == 0) { + dateFormat = new SimpleDateFormat((UnicodeString)"EEE MMM dd HH:mm:ss.SSS zzz yyyy G", ec); + if (U_FAILURE(ec) || dateFormat == 0) { + fgStr = "[FAIL: SimpleDateFormat constructor]"; + delete dateFormat; + dateFormat = 0; + return fgStr; + } + } + fgStr.truncate(0); + dateFormat->format(d, fgStr); + return fgStr; +} + /** * Return a field of the given date */ @@ -403,6 +465,33 @@ UnicodeString& DateFormatRoundTripTest::escape(const UnicodeString& src, Unicode return dst; } +#define U_MILLIS_PER_YEAR (365.25 * 24 * 60 * 60 * 1000) + +UDate DateFormatRoundTripTest::generateDate(UDate minDate) +{ + // Bring range in conformance to generateDate() below. + if(minDate < (U_MILLIS_PER_YEAR * -(4000-1970))) { + minDate = (U_MILLIS_PER_YEAR * -(4000-1970)); + } + for(int i=0;i<8;i++) { + double a = randFraction(); + + // Range from (min) to (8000-1970) AD + double dateRange = (0.0 - minDate) + (U_MILLIS_PER_YEAR + (8000-1970)); + + a *= dateRange; + + // Now offset from minDate + a += minDate; + + // Last sanity check + if(a>=minDate) { + return a; + } + } + return minDate; +} + UDate DateFormatRoundTripTest::generateDate() { double a = randFraction(); diff --git a/icuSources/test/intltest/dtfmtrtts.h b/icuSources/test/intltest/dtfmtrtts.h index b5d2cf83..62db9e42 100644 --- a/icuSources/test/intltest/dtfmtrtts.h +++ b/icuSources/test/intltest/dtfmtrtts.h @@ -7,8 +7,6 @@ #ifndef _DATEFORMATROUNDTRIPTEST_ #define _DATEFORMATROUNDTRIPTEST_ -#include - #include "unicode/utypes.h" #if !UCONFIG_NO_FORMATTING @@ -28,12 +26,16 @@ class DateFormatRoundTripTest : public IntlTest { void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par ); public: + DateFormatRoundTripTest(); + virtual ~DateFormatRoundTripTest(); + void TestDateFormatRoundTrip(void); void test(const Locale& loc); void test(DateFormat *fmt, const Locale &origLocale, UBool timeOnly = FALSE ); int32_t getField(UDate d, int32_t f); UnicodeString& escape(const UnicodeString& src, UnicodeString& dst); UDate generateDate(void); + UDate generateDate(UDate minDate); //============================================================ @@ -43,22 +45,15 @@ public: /** * Return a random uint32_t **/ -static uint32_t randLong() -{ - // Assume 8-bit (or larger) rand values. Also assume - // that the system rand() function is very poor, which it always is. - uint32_t d; - uint32_t i; - char* poke = (char*)&d; - for (i=0; i < sizeof(uint32_t); ++i) - { - poke[i] = (char)(rand() & 0xFF); - } - return d; +static uint32_t randLong() { + // The portable IntlTest::random() function has sufficient + // resolution for a 16-bit value, but not for 32 bits. + return ((uint32_t) (IntlTest::random() * (1<<16))) | + (((uint32_t) (IntlTest::random() * (1<<16))) << 16); } /** - * Return a random double 0 <= x < 1.0 + * Return a random double 0 <= x <= 1.0 **/ static double randFraction() { @@ -66,7 +61,7 @@ static double randFraction() } /** - * Return a random value from -range..+range. + * Return a random value from -range..+range (closed). **/ static double randDouble(double range) { @@ -80,13 +75,17 @@ protected: UBool failure(UErrorCode status, const char* msg); UBool failure(UErrorCode status, const char* msg, const UnicodeString& str); + const UnicodeString& fullFormat(UDate d); + private: static int32_t SPARSENESS; static int32_t TRIALS; static int32_t DEPTH; + UBool optionv; // TRUE if @v option is given on command line SimpleDateFormat *dateFormat; + UnicodeString fgStr; Calendar *getFieldCal; }; diff --git a/icuSources/test/intltest/dtfmttst.cpp b/icuSources/test/intltest/dtfmttst.cpp index 65c84387..9a215aa0 100644 --- a/icuSources/test/intltest/dtfmttst.cpp +++ b/icuSources/test/intltest/dtfmttst.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -15,8 +15,10 @@ #include "unicode/datefmt.h" #include "unicode/simpletz.h" #include "unicode/strenum.h" +#include "unicode/dtfmtsym.h" #include "cmemory.h" - +#include "cstring.h" +#include "caltest.h" // for fieldName // ***************************************************************************** // class DateFormatTest // ***************************************************************************** @@ -46,6 +48,9 @@ void DateFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &nam TESTCASE(18,TestSpaceParsing); TESTCASE(19,TestExactCountFormat); TESTCASE(20,TestWhiteSpaceParsing); + TESTCASE(21,TestInvalidPattern); + TESTCASE(22,TestGeneral); + TESTCASE(23,TestGreekMay); default: name = ""; break; } } @@ -216,120 +221,146 @@ DateFormatTest::escape(UnicodeString& s) return (s = buf); } -const char* DateFormatTest::fieldNames[] = { - "ERA", "YEAR", "MONTH", "WEEK_OF_YEAR", "WEEK_OF_MONTH", "DAY_OF_MONTH", - "DAY_OF_YEAR", "DAY_OF_WEEK", "DAY_OF_WEEK_IN_MONTH", "AM_PM", "HOUR", - "HOUR_OF_DAY", "MINUTE", "SECOND", "MILLISECOND", "ZONE_OFFSET", //"DST_OFFSET", - "YEAR_WOY", "DOW_LOCAL" -}; - // ------------------------------------- -// Map Calendar field number to to DateFormat field number -const DateFormat::EField -DateFormatTest::fgCalendarToDateFormatField[] = { - DateFormat::kEraField, - DateFormat::kYearField, - DateFormat::kMonthField, - DateFormat::kWeekOfYearField, - DateFormat::kWeekOfMonthField, - DateFormat::kDateField, - DateFormat::kDayOfYearField, - DateFormat::kDayOfWeekField, - DateFormat::kDayOfWeekInMonthField, - DateFormat::kAmPmField, - DateFormat::kHour1Field, - DateFormat::kHourOfDay0Field, - DateFormat::kMinuteField, - DateFormat::kSecondField, - DateFormat::kMillisecondField, - DateFormat::kTimezoneField, - DateFormat::kYearWOYField, - DateFormat::kDOWLocalField, - (DateFormat::EField) -1 +/** + * This MUST be kept in sync with DateFormatSymbols.gPatternChars. + */ +static const char* PATTERN_CHARS = "GyMdkHmsSEDFwWahKzYeugAZ"; + +/** + * A list of the names of all the fields in DateFormat. + * This MUST be kept in sync with DateFormat. + */ +static const char* DATEFORMAT_FIELD_NAMES[] = { + "ERA_FIELD", + "YEAR_FIELD", + "MONTH_FIELD", + "DATE_FIELD", + "HOUR_OF_DAY1_FIELD", + "HOUR_OF_DAY0_FIELD", + "MINUTE_FIELD", + "SECOND_FIELD", + "MILLISECOND_FIELD", + "DAY_OF_WEEK_FIELD", + "DAY_OF_YEAR_FIELD", + "DAY_OF_WEEK_IN_MONTH_FIELD", + "WEEK_OF_YEAR_FIELD", + "WEEK_OF_MONTH_FIELD", + "AM_PM_FIELD", + "HOUR1_FIELD", + "HOUR0_FIELD", + "TIMEZONE_FIELD", + "YEAR_WOY_FIELD", + "DOW_LOCAL_FIELD", + "EXTENDED_YEAR_FIELD", + "JULIAN_DAY_FIELD", + "MILLISECONDS_IN_DAY_FIELD", + "TIMEZONE_RFC_FIELD" }; +static const int32_t DATEFORMAT_FIELD_NAMES_LENGTH = + sizeof(DATEFORMAT_FIELD_NAMES) / sizeof(DATEFORMAT_FIELD_NAMES[0]); + /** * Verify that returned field position indices are correct. */ -void -DateFormatTest::TestFieldPosition(void) -{ - UErrorCode status = U_ZERO_ERROR; - DateFormat* dateFormats[4]; - int32_t dateFormats_length = (int32_t)(sizeof(dateFormats) / sizeof(dateFormats[0])); - - /* {sfb} This test was coded incorrectly. - / FieldPosition uses the fields in the class you are formatting with - / So, for example, to get the DATE field from a DateFormat use - / DateFormat::DATE_FIELD, __not__ Calendar::DATE - / The ordering of the expected values used previously was wrong. - / instead of re-ordering this mess of strings, just transform the index values */ - - /* field values, in Calendar order */ - - const char* expected[] = { - "", "1997", "August", "", "", "13", "", "Wednesday", "", "PM", "2", "", - "34", "12", "", "PDT", "", - /* Following two added by weiv for two new fields */ "", "", - "", "1997", "#",/* # is a marker for "ao\xfbt" == "aou^t" */ "", "", "13", "", "mercredi", - "", "", "", "14", "34", "", "", "GMT-07:00", "", - /* Following two added by weiv for two new fields */ "", "", - "AD", "97", "8", "33", "3", "13", "225", "Wed", "2", "PM", "2", - "14", "34", "12", "5", "PDT", - /* Following two added by weiv for two new fields */ "97", "4", "", - "AD", "1997", "August", "0033", - "0003", "0013", "0225", "Wednesday", "0002", "PM", "0002", "0014", - "0034", "0012", "513", "Pacific Daylight Time", - /* Following two added by weiv for two new fields */ "1997", "0004", - "" +void DateFormatTest::TestFieldPosition() { + UErrorCode ec = U_ZERO_ERROR; + int32_t i, j, exp; + UnicodeString buf; + + // Verify data + DateFormatSymbols rootSyms(Locale(""), ec); + assertSuccess("DateFormatSymbols", ec); + assertEquals("patternChars", PATTERN_CHARS, rootSyms.getLocalPatternChars(buf)); + assertEquals("patternChars", PATTERN_CHARS, DateFormatSymbols::getPatternUChars()); + assertTrue("DATEFORMAT_FIELD_NAMES", DATEFORMAT_FIELD_NAMES_LENGTH == UDAT_FIELD_COUNT); + assertTrue("Data", UDAT_FIELD_COUNT == uprv_strlen(PATTERN_CHARS)); + + // Create test formatters + const int32_t COUNT = 4; + DateFormat* dateFormats[COUNT]; + dateFormats[0] = DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat::kFull, Locale::getUS()); + dateFormats[1] = DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat::kFull, Locale::getFrance()); + // Make the pattern "G y M d..." + buf.remove().append(PATTERN_CHARS); + for (j=buf.length()-1; j>=0; --j) buf.insert(j, (UChar)32/*' '*/); + dateFormats[2] = new SimpleDateFormat(buf, Locale::getUS(), ec); + // Make the pattern "GGGG yyyy MMMM dddd..." + for (j=buf.length()-1; j>=0; j-=2) { + for (i=0; i<3; ++i) { + buf.insert(j, buf.charAt(j)); + } + } + dateFormats[3] = new SimpleDateFormat(buf, Locale::getUS(), ec); + + UDate aug13 = 871508052513.0; + + // Expected output field values for above DateFormats on aug13 + // Fields are given in order of DateFormat field number + const char* EXPECTED[] = { + "", "1997", "August", "13", "", "", "34", "12", "", + "Wednesday", "", "", "", "", "PM", "2", "", "PDT", "", "", "", "", "", "", + + "", "1997", "ao\\u00FBt", "13", "", "14", "34", "", "", + "mercredi", "", "", "", "", "", "", "", "HAP (\\u00C9UA)", "", "", "", "", "", "", + + "AD", "1997", "8", "13", "14", "14", "34", "12", "5", + "Wed", "225", "2", "33", "3", "PM", "2", "2", "PDT", "1997", "4", "1997", "2450674", "52452513", "-0700", + "AD", "1997", "August", "0013", "0014", "0014", "0034", "0012", "5130", + "Wednesday", "0225", "0002", "0033", "0003", "PM", "0002", "0002", "Pacific Daylight Time", "1997", "0004", "1997", "2450674", "52452513", "-0700", }; - UDate someDate = 871508052513.0; - int32_t j, exp; + const int32_t EXPECTED_LENGTH = sizeof(EXPECTED)/sizeof(EXPECTED[0]); - dateFormats[0] = DateFormat::createDateTimeInstance(DateFormat::FULL, DateFormat::FULL, Locale::getUS()); - dateFormats[1] = DateFormat::createDateTimeInstance(DateFormat::FULL, DateFormat::FULL, Locale::getFrance()); - dateFormats[2] = new SimpleDateFormat((UnicodeString)"G, yy, M, d, k, H, m, s, S, E, D, F, w, W, a, h, K, z, YY, e", status); - dateFormats[3] = new SimpleDateFormat((UnicodeString)"GGGG, yyyy, MMMM, dddd, kkkk, HHHH, mmmm, ssss, SSSS, EEEE, DDDD, FFFF, wwww, WWWW, aaaa, hhhh, KKKK, zzzz, YYYY, eeee", status); - for (j = 0, exp = 0; j < dateFormats_length;++j) { - UnicodeString str; + assertTrue("data size", EXPECTED_LENGTH == COUNT * UDAT_FIELD_COUNT); + + TimeZone* PT = TimeZone::createTimeZone("America/Los_Angeles"); + for (j = 0, exp = 0; j < COUNT; ++j) { + // String str; DateFormat* df = dateFormats[j]; - logln((UnicodeString)" Pattern = " + ((SimpleDateFormat*)df)->toPattern(str)); - str.truncate(0); - logln((UnicodeString)" Result = " + df->format(someDate, str)); - for (int32_t i = 0; i < UCAL_FIELD_COUNT;++i) { + df->setTimeZone(*PT); + if (df->getDynamicClassID() == SimpleDateFormat::getStaticClassID()) { + logln(" Pattern = " + ((SimpleDateFormat*) df)->toPattern(buf.remove())); + } else { + logln(" Pattern = ? (not a SimpleDateFormat)"); + } + logln((UnicodeString)" Result = " + df->format(aug13, buf.remove())); + + for (i = 0; i < UDAT_FIELD_COUNT; ++i, ++exp) { + FieldPosition pos(i); + df->format(aug13, buf.remove(), pos); UnicodeString field; - getFieldText(df, i, someDate, field); - UnicodeString expStr; - if(expected[exp][0]!='#') { - expStr=UnicodeString(expected[exp]); - } else { - /* we cannot have latin-1 characters in source code, therefore we fix up the string for "aou^t" */ - expStr.append((UChar)0x61).append((UChar)0x6f).append((UChar32)0xfb).append((UChar)0x74); - } - - if (!(field == expStr)) errln(UnicodeString("FAIL: field #") + i + " " + - fieldNames[i] + " = \"" + escape(field) + "\", expected \"" + escape(expStr) + "\""); - ++exp; + buf.extractBetween(pos.getBeginIndex(), pos.getEndIndex(), field); + assertEquals((UnicodeString)"field #" + i + " " + DATEFORMAT_FIELD_NAMES[i], + ctou(EXPECTED[exp]), field); } } - for (j=0; jformat(date, formatResult, pos); - //formatResult.extract(pos.getBeginIndex(), pos.getEndIndex(), str); - formatResult.extractBetween(pos.getBeginIndex(), pos.getEndIndex(), str); + +/** + * General parse/format tests. Add test cases as needed. + */ +void DateFormatTest::TestGeneral() { + const char* DATA[] = { + "yyyy MM dd HH:mm:ss.SSS", + + // Milliseconds are left-justified, since they format as fractions of a second + "y/M/d H:mm:ss.S", "fp", "2004 03 10 16:36:31.567", "2004/3/10 16:36:31.6", "2004 03 10 16:36:31.600", + "y/M/d H:mm:ss.SS", "fp", "2004 03 10 16:36:31.567", "2004/3/10 16:36:31.57", "2004 03 10 16:36:31.570", + "y/M/d H:mm:ss.SSS", "F", "2004 03 10 16:36:31.567", "2004/3/10 16:36:31.567", + "y/M/d H:mm:ss.SSSS", "pf", "2004/3/10 16:36:31.5679", "2004 03 10 16:36:31.568", "2004/3/10 16:36:31.5680", + }; + expect(DATA, sizeof(DATA)/sizeof(DATA[0]), Locale("en", "", "")); } // ------------------------------------- @@ -922,7 +953,8 @@ DateFormatTest::TestLocaleDateFormat() // Bug 495 DateFormat::FULL, Locale::getFrench()); DateFormat *dfUS = DateFormat::createDateTimeInstance(DateFormat::FULL, DateFormat::FULL, Locale::getUS()); - UnicodeString expectedFRENCH ( "lundi 15 septembre 1997 00 h 00 GMT-07:00" ); + UnicodeString expectedFRENCH ( "lundi 15 septembre 1997 00 h 00 HAP (\\u00C9UA)" ); + expectedFRENCH = expectedFRENCH.unescape(); //UnicodeString expectedUS ( "Monday, September 15, 1997 12:00:00 o'clock AM PDT" ); UnicodeString expectedUS ( "Monday, September 15, 1997 12:00:00 AM PDT" ); logln((UnicodeString)"Date set to : " + dateToString(testDate)); @@ -1083,6 +1115,32 @@ void DateFormatTest::TestWhiteSpaceParsing() { expectParse(DATA, DATA_len, Locale("en")); } + +void DateFormatTest::TestInvalidPattern() { + UErrorCode ec = U_ZERO_ERROR; + SimpleDateFormat f(UnicodeString("Yesterday"), ec); + UnicodeString out; + FieldPosition pos; + f.format((UDate)0, out, pos); + logln(out); + // The bug is that the call to format() will crash. By not + // crashing, the test passes. +} + +void DateFormatTest::TestGreekMay() { + UErrorCode ec = U_ZERO_ERROR; + UDate date = -9896080848000.0; + SimpleDateFormat fmt("EEEE, dd MMMM yyyy h:mm:ss a", Locale("el", "", ""), ec); + if (!assertSuccess("SimpleDateFormat::ct", ec)) return; + UnicodeString str; + fmt.format(date, str); + ParsePosition pos(0); + UDate d2 = fmt.parse(str, pos); + if (date != d2) { + errln("FAIL: unable to parse strings where case-folding changes length"); + } +} + /** * Test parsing. Input is an array that starts with the following * header: @@ -1157,6 +1215,116 @@ void DateFormatTest::expectParse(const char** data, int32_t data_length, } } +/** + * Test formatting and parsing. Input is an array that starts + * with the following header: + * + * [0] = pattern string to parse [i+2] with + * + * followed by test cases, each of which is 3 array elements: + * + * [i] = pattern, or null to reuse prior pattern + * [i+1] = control string, either "fp", "pf", or "F". + * [i+2..] = data strings + * + * The number of data strings depends on the control string. + * Examples: + * 1. "y/M/d H:mm:ss.SS", "fp", "2004 03 10 16:36:31.567", "2004/3/10 16:36:31.56", "2004 03 10 16:36:31.560", + * 'f': Format date [i+2] (as parsed using pattern [0]) and expect string [i+3]. + * 'p': Parse string [i+3] and expect date [i+4]. + * + * 2. "y/M/d H:mm:ss.SSS", "F", "2004 03 10 16:36:31.567", "2004/3/10 16:36:31.567" + * 'F': Format date [i+2] and expect string [i+3], + * then parse string [i+3] and expect date [i+2]. + * + * 3. "y/M/d H:mm:ss.SSSS", "pf", "2004/3/10 16:36:31.5679", "2004 03 10 16:36:31.567", "2004/3/10 16:36:31.5670", + * 'p': Parse string [i+2] and expect date [i+3]. + * 'f': Format date [i+3] and expect string [i+4]. + */ +void DateFormatTest::expect(const char** data, int32_t data_length, + const Locale& loc) { + int32_t i = 0; + UErrorCode ec = U_ZERO_ERROR; + UnicodeString str, str2; + SimpleDateFormat fmt("", loc, ec); + SimpleDateFormat ref(data[i++], loc, ec); + SimpleDateFormat univ("EE G yyyy MM dd HH:mm:ss.SSS z", loc, ec); + if (!assertSuccess("construct SimpleDateFormat", ec)) return; + + UnicodeString currentPat; + while (i -#include -/*converts a Unicodestring to integer*/ -static int32_t getInt(UnicodeString str) -{ - int32_t result = 0; - int32_t len = str.length(); - int32_t i = 0; - for(i=0; itoPattern() != trans1copy->toPattern() || - trans1->getID() != trans1copy->getID() ){ - errln("Copy construction failed"); - } - delete trans1copy; - delete trans1; - - logln("Testing the construction HexToUnicodeTransliterator(adoptedFilter)"); - - trans1=new HexToUnicodeTransliterator(new TestHexFilter); - if(trans1 == 0){ - errln("HexToUnicodeTransliterator construction failed. Error=" + (UnicodeString)u_errorName(status)); - return; - } - logln("Testing the copy construction"); - trans1copy=new HexToUnicodeTransliterator(*trans1); - if(trans1->getFilter() == NULL || trans1copy->getFilter() == NULL || - trans1->toPattern() != trans1copy->toPattern() || - trans1->getID() != trans1copy->getID() ){ - errln("Copy construction failed"); - } - - delete trans1copy; - delete trans1; - -} - -void HexToUniTransliteratorTest::TestCloneEqual(){ - UErrorCode status=U_ZERO_ERROR; - HexToUnicodeTransliterator *transdefault=new HexToUnicodeTransliterator(); - UnicodeString pattern1("\\U##00"); - UnicodeString pattern2("\\\\uni0000"); - HexToUnicodeTransliterator *trans1=new HexToUnicodeTransliterator(pattern1, status); - if(U_FAILURE(status) && status==U_ILLEGAL_ARGUMENT_ERROR){ - errln("HexToUnicodeTransliterator construction failed"); - status=U_ZERO_ERROR; - return; - } - HexToUnicodeTransliterator *trans2=new HexToUnicodeTransliterator(pattern2, status); - if(U_FAILURE(status) && status==U_ILLEGAL_ARGUMENT_ERROR){ - errln("HexToUnicodeTransliterator construction failed"); - status=U_ZERO_ERROR; - return; - } - - logln("Testing the clone() API of the HexToUnicodeTransliterator"); - HexToUnicodeTransliterator *transdefaultclone=(HexToUnicodeTransliterator*)transdefault->clone(); - HexToUnicodeTransliterator *trans1clone=(HexToUnicodeTransliterator*)trans1->clone(); - HexToUnicodeTransliterator *trans2clone=(HexToUnicodeTransliterator*)trans2->clone(); - if(transdefault->toPattern() != transdefaultclone->toPattern() || - trans1->toPattern() != trans1clone->toPattern() || - trans2->toPattern() != trans2clone->toPattern() || - transdefault->toPattern() == trans1->toPattern() || - trans1->toPattern() == trans2clone->toPattern() || - trans2->toPattern() == transdefault->toPattern() ) { - errln("Error: clone() failed"); - } - - logln("Testing the =operator of the HexToUnicodeTransliterator"); - HexToUnicodeTransliterator *transdefaultequal=new HexToUnicodeTransliterator(); - HexToUnicodeTransliterator *trans1equal=new HexToUnicodeTransliterator(); - HexToUnicodeTransliterator *trans2equal=new HexToUnicodeTransliterator(); - *transdefaultequal=*transdefault; - *trans1equal=*trans1; - *trans2equal=*trans2; - if(transdefault->toPattern() != transdefaultequal->toPattern() || - trans1->toPattern() != trans1equal->toPattern() || - trans2->toPattern() != trans2equal->toPattern() || - transdefault->toPattern() == trans1->toPattern() || - trans1->toPattern() == trans2equal->toPattern() || - trans2->toPattern() == transdefault->toPattern() ) { - errln("Error: equal() failed"); - } - if(transdefaultclone->toPattern() != transdefaultequal->toPattern() || - trans1equal->toPattern() != trans1clone->toPattern() || - trans2clone->toPattern() != trans2equal->toPattern() ){ - errln("Error: equal() or clone() failed"); - } - delete transdefaultclone; - delete trans1clone; - delete trans2clone; - delete transdefaultequal; - delete trans1equal; - delete trans2equal; - delete transdefault; - delete trans1; - delete trans2; -} - -void HexToUniTransliteratorTest::TestPattern(){ - logln("Testing the applyPattern() and toPattern() API of HexToUnicodeTransliterator"); - UErrorCode status = U_ZERO_ERROR; - /*default transliterator has pattern \\u0000*/ - HexToUnicodeTransliterator *transdefault=new HexToUnicodeTransliterator(); - if(transdefault == 0){ - errln("HexToUnicodeTransliterator construction failed. Error=" + (UnicodeString)u_errorName(status)); - return; - } - UnicodeString defaultpattern=transdefault->toPattern(); - - UnicodeString pattern1("\\\\U+0000", ""); - HexToUnicodeTransliterator *trans1=new HexToUnicodeTransliterator(pattern1, NULL, status); - if(U_FAILURE(status) ){ - errln("HexToUnicodeTransliterator construction failed with pattern =" + pattern1); - status=U_ZERO_ERROR; - return; - } - /*test toPattern() */ - if(transdefault->toPattern() == trans1->toPattern() || - transdefault->toPattern() != UnicodeString("\\\\u0000;\\\\U0000;u+0000;U+0000", "") || - trans1->toPattern() != pattern1 ){ - errln("Error: toPattern() failed "+ transdefault->toPattern()); - } - - /*apply patterns for transdefault*/ - UnicodeString str("abKf"); - expectPattern(*transdefault, pattern1, UnicodeString("\\U+0061\\U+0062\\U+004B\\U+0066", ""), str); - expectPattern(*transdefault, UnicodeString("\\U##00,", ""), UnicodeString("U61,U62,U4B,U66,", ""), str); - expectPattern(*transdefault, defaultpattern, UnicodeString("\\u0061\\u0062\\u004B\\u0066", ""), str); - expectPattern(*trans1, UnicodeString("\\uni0000", ""), UnicodeString("uni0061uni0062uni004Buni0066", ""), str); - expectPattern(*trans1, UnicodeString("\\\\S-0000-E", ""), UnicodeString("\\S-0061-E\\S-0062-E\\S-004B-E\\S-0066-E", ""), str); - expectPattern(*trans1, UnicodeString("\\u##0000", ""), UnicodeString("\\u##0061\\u##0062", ""), "FAIL"); - expectPattern(*trans1, UnicodeString("\\*0000", ""), UnicodeString("*0061*0062*004B*0066", ""), str); - expectPattern(*trans1, UnicodeString("\\u####", ""), UnicodeString("\\u##0061\\u##0062", ""), "FAIL"); - - delete trans1; - delete transdefault; - -} -void HexToUniTransliteratorTest::TestSimpleTransliterate(){ - logln("Testing the handleTransliterate() API of HexToUnicodeTransliterator"); - UErrorCode status=U_ZERO_ERROR; - UnicodeString pattern1("\\\\U+0000", ""); - HexToUnicodeTransliterator *trans1=new HexToUnicodeTransliterator(pattern1, NULL, status); - if(U_FAILURE(status)){ - errln("HexToUnicodeTransliterator construction failed with pattern =" + pattern1 + "Error: " + (UnicodeString)u_errorName(status)); - status=U_ZERO_ERROR; - return; - } - UnicodeString source("He\\U+006C\\U+006C\\U+006F", ""); - UnicodeString rsource(source); - UTransPosition index; - index.contextStart =1; - index.contextLimit = source.length(); - index.start = 2; - index.limit =source.length(); - UnicodeString expected("Hello"); - trans1->handleTransliterate(rsource, index, FALSE); - expectAux(trans1->getID() + ":handleTransliterator ", source + "-->" + rsource, rsource==expected, expected); - expect(*trans1, "", UnicodeString("\\U+0048\\U+0065\\U+006C\\U+006C\\U+006F", ""), expected); - delete trans1; - - HexToUnicodeTransliterator *trans2=new HexToUnicodeTransliterator(new TestHexFilter); - expect(*trans2, "with Filter(0x0061, 0x0063) ", CharsToUnicodeString("\\u0061\\u0062\\u0063"), - CharsToUnicodeString("\\u0061b\\u0063") ); - delete trans2; - -} -void HexToUniTransliteratorTest::TestTransliterate(){ - UErrorCode status=U_ZERO_ERROR; - UnicodeString Data[]={ - //pattern, source, index.contextStart, index.contextLimit, index.start, expectedResult, - UnicodeString("U+##00", ""), UnicodeString("abU+63", ""), "1", "7", "2", UnicodeString("abc", ""), - UnicodeString("\\\\u0000", ""), UnicodeString("a\\u0062c", ""), "1", "7", "1", UnicodeString("abc", ""), - UnicodeString("Uni0000", ""), UnicodeString("abUni0063", ""), "1", "9", "2", UnicodeString("abc", ""), - UnicodeString("U[0000]", ""), UnicodeString("heU[006C]U[006C]o", ""), "0", "16", "2", UnicodeString("hello", ""), - UnicodeString("prefix-0000-suffix", ""), UnicodeString("aprefix-0062-suffixprefix-0063-suffix", ""), "1", "39", "1", UnicodeString("abc", ""), - UnicodeString("*##00*", ""), UnicodeString("hell*6F**74**68**65*re", ""), "1", "20", "4", UnicodeString("hellothere", ""), - - }; - uint32_t i; - for(i=0;i" + rsource, rsource==expectedResult, expectedResult); - - UnicodeString rsource2(source); - uprv_memcpy(&index, &_index, sizeof(index)); - t.handleTransliterate(rsource2, index, TRUE); - expectAux(t.getID() + ":handleTransliterator(increment=TRUE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult); - - /*ceates a copy constructor and checks the transliteration*/ - HexToUnicodeTransliterator *copy=new HexToUnicodeTransliterator(t); - rsource2.remove(); - rsource2.append(source); - uprv_memcpy(&index, &_index, sizeof(index)); - copy->handleTransliterate(rsource2, index, FALSE); - expectAux(t.getID() + "COPY:handleTransliterator(increment=FALSE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult); - - rsource2.remove(); - rsource2.append(source); - uprv_memcpy(&index, &_index, sizeof(index)); - copy->handleTransliterate(rsource2, index, TRUE); - expectAux(t.getID() + "COPY:handleTransliterator(increment=TRUE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult); - delete copy; - - /*creates a clone and tests transliteration*/ - HexToUnicodeTransliterator *clone=(HexToUnicodeTransliterator*)t.clone(); - rsource2.remove(); - rsource2.append(source); - uprv_memcpy(&index, &_index, sizeof(index)); - clone->handleTransliterate(rsource2, index, FALSE); - expectAux(t.getID() + "CLONE:handleTransliterator(increment=FALSE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult); - - rsource2.remove(); - rsource2.append(source); - uprv_memcpy(&index, &_index, sizeof(index)); - clone->handleTransliterate(rsource2, index, TRUE); - expectAux(t.getID() + "CLONE:handleTransliterator(increment=TRUE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult); - delete clone; - - /*Uses the assignment operator to create a transliterator and tests transliteration*/ - HexToUnicodeTransliterator equal=t; - rsource2.remove(); - rsource2.append(source); - uprv_memcpy(&index, &_index, sizeof(index)); - equal.handleTransliterate(rsource2, index, FALSE); - expectAux(t.getID() + "=OPERATOR:handleTransliterator(increment=FALSE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult); - - rsource2.remove(); - rsource2.append(source); - uprv_memcpy(&index, &_index, sizeof(index)); - equal.handleTransliterate(rsource2, index, TRUE); - expectAux(t.getID() + "=OPERATOR:handleTransliterator(increment=TRUE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult); - -} - - -void HexToUniTransliteratorTest::expectPattern(HexToUnicodeTransliterator& t, - const UnicodeString& pattern, - const UnicodeString& source, - const UnicodeString& expectedResult){ - - UErrorCode status=U_ZERO_ERROR; - t.applyPattern(pattern, status); - if(expectedResult == "FAIL"){ - if(U_FAILURE(status)){ - logln("OK: calling applyPattern() with illegal pattern failed as expected. Error=" + (UnicodeString)u_errorName(status)); - status=U_ZERO_ERROR; - return; - } - } - else{ - if(U_FAILURE(status)){ - errln("Error: applyPattern() failed with pattern =" + pattern + "--->" + (UnicodeString)u_errorName(status)); - return; - }else { - if(t.toPattern() != pattern) { - errln("Error: applyPattern or toPatten failed. Expected: " + pattern + "Got: " + t.toPattern()); - } - else{ - logln("OK: applyPattern passed. Testing transliteration"); - expect(t, " with pattern "+pattern, source, expectedResult); - } - } - } - -} -void HexToUniTransliteratorTest::expect(const HexToUnicodeTransliterator& t, - const UnicodeString& message, - const UnicodeString& source, - const UnicodeString& expectedResult) { - - UnicodeString rsource(source); - t.transliterate(rsource); - expectAux(t.getID() + ":Replaceable " + message, source + "->" + rsource, rsource==expectedResult, expectedResult); - - // Test handleTransliterate (incremental) transliteration -- - rsource.remove(); - rsource.append(source); - UTransPosition index; - index.contextStart =0; - index.contextLimit =source.length(); - index.start=0; - index.limit = source.length(); - t.handleTransliterate(rsource, index, TRUE); - expectAux(t.getID() + ":handleTransliterate " + message, source + "->" + rsource, rsource==expectedResult, expectedResult); - - -} -void HexToUniTransliteratorTest::expectAux(const UnicodeString& tag, - const UnicodeString& summary, UBool pass, - const UnicodeString& expectedResult) { - if (pass) { - logln(UnicodeString("(")+tag+") " + prettify(summary)); - } else { - errln(UnicodeString("FAIL: (")+tag+") " - + prettify(summary) - + ", expected " + prettify(expectedResult)); - } -} - -#endif /* #if !UCONFIG_NO_TRANSLITERATION */ diff --git a/icuSources/test/intltest/hxuntrts.h b/icuSources/test/intltest/hxuntrts.h deleted file mode 100644 index 9513c799..00000000 --- a/icuSources/test/intltest/hxuntrts.h +++ /dev/null @@ -1,69 +0,0 @@ -/******************************************************************** - * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and - * others. All Rights Reserved. - ******************************************************************** -************************************************************************ -* Date Name Description -* 03/17/2000 Madhu Creation. -************************************************************************/ - -#ifndef HEXTOUNITRTST_H -#define HEXTOUNITRTST_H - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_TRANSLITERATION - -#include "unicode/translit.h" -#include "hextouni.h" -#include "intltest.h" - -/** - * @test - * @summary General test of HexadecimalToUnicodeTransliterator - */ -class HexToUniTransliteratorTest : public IntlTest { -public: - void runIndexedTest(int32_t index, UBool exec, const char* &name, char* par=NULL); - - /*Tests the constructors */ - void TestConstruction(void); - /*Tests the function clone, and operator==()*/ - void TestCloneEqual(void); - /*Tests the function getTransliterator() and setTransliterators() and adoptTransliterators()*/ - void TestPattern(void); - /*Tests the function handleTransliterate()*/ - void TestSimpleTransliterate(void); - /*Tests the function handleTransliterate()*/ - void TestTransliterate(void); - - //====================================================================== - // Support methods - //====================================================================== - void expectTranslit(const HexToUnicodeTransliterator& t, - const UnicodeString& message, - const UnicodeString& source, - int32_t start, int32_t limit, int32_t cursor, - const UnicodeString& expectedResult); - - void expectPattern(HexToUnicodeTransliterator& t, - const UnicodeString& pattern, - const UnicodeString& source, - const UnicodeString& expectedResult); - - void expect(const HexToUnicodeTransliterator& t, - const UnicodeString& message, - const UnicodeString& source, - const UnicodeString& expectedResult); - - void expectAux(const UnicodeString& tag, - const UnicodeString& summary, UBool pass, - const UnicodeString& expectedResult); - - -}; - -#endif /* #if !UCONFIG_NO_TRANSLITERATION */ - -#endif diff --git a/icuSources/test/intltest/icusvtst.cpp b/icuSources/test/intltest/icusvtst.cpp index 0727d658..1a25027a 100644 --- a/icuSources/test/intltest/icusvtst.cpp +++ b/icuSources/test/intltest/icusvtst.cpp @@ -1,6 +1,6 @@ /** ******************************************************************************* - * Copyright (C) 2001-2002, International Business Machines Corporation and * + * Copyright (C) 2001-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* * @@ -12,8 +12,8 @@ #if !UCONFIG_NO_SERVICE #include "icusvtst.h" - #include "iculserv.h" +#include class MyListener : public EventListener { @@ -34,20 +34,20 @@ class ICUNSubclass : public ICUNotifier { }; class LKFSubclass : public LocaleKeyFactory { - Hashtable table; + Hashtable table; public: LKFSubclass(UBool visible) : LocaleKeyFactory(visible ? VISIBLE : INVISIBLE, "LKFSubclass") { - UErrorCode status = U_ZERO_ERROR; - table.put("en_US", this, status); + UErrorCode status = U_ZERO_ERROR; + table.put("en_US", this, status); } protected: - virtual const Hashtable* getSupportedIDs(UErrorCode &/*status*/) const { - return &table; - } + virtual const Hashtable* getSupportedIDs(UErrorCode &/*status*/) const { + return &table; + } }; class Integer : public UObject { @@ -153,7 +153,7 @@ UnicodeString append(UnicodeString& result, const UObject* obj) } else if (id == Locale::getStaticClassID()) { result.append(((Locale*)obj)->getName()); } else if (id == Integer::getStaticClassID()) { - sprintf(buffer, "%d", ((Integer*)obj)->_val); + sprintf(buffer, "%d", (int)((Integer*)obj)->_val); result.append(buffer); } else { sprintf(buffer, "%p", (const void*)obj); @@ -300,7 +300,7 @@ void ICUServiceTest::msgstr(const UnicodeString& message, UObject* obj, UBool err) { if (obj) { - UnicodeString* str = (UnicodeString*)obj; + UnicodeString* str = (UnicodeString*)obj; logln(message + *str); delete str; } else if (err) { @@ -317,7 +317,7 @@ ICUServiceTest::testAPI_One() // register an object with one locale, // search for an object with a more specific locale // should return the original object - UErrorCode status = U_ZERO_ERROR; + UErrorCode status = U_ZERO_ERROR; Integer* singleton0 = new Integer(0); service.registerInstance(singleton0, "en_US", status); { @@ -442,7 +442,7 @@ ICUServiceTest::testAPI_One() confirmEqual("17) get invisible", result, singleton5); delete result; } - + // should not be able to locate invisible services { UErrorCode status = U_ZERO_ERROR; @@ -467,7 +467,7 @@ class TestStringService : public ICUService { return LocaleKey::createWithCanonicalFallback(id, NULL, status); // no fallback locale } - virtual ICUServiceFactory* createSimpleFactory(UObject* obj, const UnicodeString& id, UBool visible, UErrorCode& status) + virtual ICUServiceFactory* createSimpleFactory(UObject* obj, const UnicodeString& id, UBool visible, UErrorCode& /* status */) { if (obj && obj->getDynamicClassID() == UnicodeString::getStaticClassID()) { return new SimpleFactory((UnicodeString*)obj, id, visible); @@ -484,7 +484,7 @@ class TestStringService : public ICUService { class AnonymousStringFactory : public ICUServiceFactory { public: - virtual UObject* create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const { + virtual UObject* create(const ICUServiceKey& key, const ICUService* /* service */, UErrorCode& /* status */) const { return new UnicodeString(key.getID()); } @@ -530,12 +530,19 @@ class TestMultipleKeyStringFactory : public ICUServiceFactory { ~TestMultipleKeyStringFactory() { } - UObject* create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const { + UObject* create(const ICUServiceKey& key, const ICUService* /* service */, UErrorCode& status) const { + if (U_FAILURE(status)) { + return NULL; + } UnicodeString temp; key.currentID(temp); - if (U_SUCCESS(_status) && _ids.contains(&temp)) { - return new UnicodeString(_factoryID + temp); + if (U_SUCCESS(_status)) { + if (_ids.contains(&temp)) { + return new UnicodeString(_factoryID + temp); } + } else { + status = _status; + } return NULL; } @@ -583,7 +590,7 @@ const char TestMultipleKeyStringFactory::fgClassID = '\0'; void ICUServiceTest::testAPI_Two() { - UErrorCode status = U_ZERO_ERROR; + UErrorCode status = U_ZERO_ERROR; TestStringService service; service.registerFactory(new AnonymousStringFactory(), status); @@ -660,7 +667,7 @@ ICUServiceTest::testAPI_Two() // iterate over the display names { UErrorCode status = U_ZERO_ERROR; - UVector names(deleteStringPair, NULL, status); + UVector names(userv_deleteStringPair, NULL, status); service.getDisplayNames(names, Locale::getGerman(), status); for (int i = 0; i < names.size(); ++i) { const StringPair* pair = (const StringPair*)names[i]; @@ -700,7 +707,7 @@ ICUServiceTest::testAPI_Two() // Rad dude's surfer gal 'replaces' Later's surfer gal { UErrorCode status = U_ZERO_ERROR; - UVector names(deleteStringPair, NULL, status); + UVector names(userv_deleteStringPair, NULL, status); service.getDisplayNames(names, Locale("es"), status); for (int i = 0; i < names.size(); ++i) { const StringPair* pair = (const StringPair*)names[i]; @@ -851,7 +858,7 @@ void ICUServiceTest::testRBF() { // resource bundle factory. - UErrorCode status = U_ZERO_ERROR; + UErrorCode status = U_ZERO_ERROR; TestStringService service; service.registerFactory(new ICUResourceBundleFactory(), status); @@ -871,7 +878,7 @@ ICUServiceTest::testRBF() // this should be fast since the display names were cached. { UErrorCode status = U_ZERO_ERROR; - UVector names(deleteStringPair, NULL, status); + UVector names(userv_deleteStringPair, NULL, status); service.getDisplayNames(names, Locale::getGermany(), status); logln("service display names for de_DE"); for (int i = 0; i < names.size(); ++i) { @@ -897,7 +904,7 @@ ICUServiceTest::testRBF() logln(UnicodeString("\n --- ") + idNames[i] + " ---"); { UErrorCode status = U_ZERO_ERROR; - UVector names(deleteStringPair, NULL, status); + UVector names(userv_deleteStringPair, NULL, status); service.getDisplayNames(names, idNames[i], status); for (int i = 0; i < names.size(); ++i) { const StringPair* pair = (const StringPair*)names[i]; @@ -995,7 +1002,7 @@ class TestStringLocaleService : public ICULocaleService { }; void ICUServiceTest::testLocale() { - UErrorCode status = U_ZERO_ERROR; + UErrorCode status = U_ZERO_ERROR; TestStringLocaleService service; UnicodeString* root = new UnicodeString("root"); @@ -1085,7 +1092,7 @@ void ICUServiceTest::testLocale() { } { - UErrorCode status = U_ZERO_ERROR; + UErrorCode status = U_ZERO_ERROR; UnicodeString english = "en"; Locale localeResult; UnicodeString result; @@ -1157,7 +1164,7 @@ void ICUServiceTest::testLocale() { UErrorCode status = U_ZERO_ERROR; StringEnumeration* locales = service.getAvailableLocales(); if (locales) { - confirmIdentical("test available locales", locales->count(status), 5); + confirmIdentical("test available locales", locales->count(status), 6); logln("locales: "); { const char* p; @@ -1177,7 +1184,7 @@ class WrapFactory : public ICUServiceFactory { public: static const UnicodeString& getGreetingID() { if (greetingID == NULL) { - greetingID = new UnicodeString("greeting"); + greetingID = new UnicodeString("greeting"); } return *greetingID; } @@ -1208,7 +1215,7 @@ class WrapFactory : public ICUServiceFactory { } } - UnicodeString& getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeString& result) const { + UnicodeString& getDisplayName(const UnicodeString& id, const Locale& /* locale */, UnicodeString& result) const { result.append("wrap '"); result.append(id); result.append("'"); @@ -1239,7 +1246,7 @@ ICUServiceTest::testWrapFactory() { UnicodeString* greeting = new UnicodeString("Hello There"); UnicodeString greetingID = "greeting"; - UErrorCode status = U_ZERO_ERROR; + UErrorCode status = U_ZERO_ERROR; TestStringService service; service.registerInstance(greeting, greetingID, status); @@ -1302,10 +1309,10 @@ void ICUServiceTest::testCoverage() { UnicodeString* result = (UnicodeString*)service.get("object", status); if (result) { - logln("object is: " + *result); - delete result; + logln("object is: " + *result); + delete result; } else { - errln("could not get object"); + errln("could not get object"); } } } diff --git a/icuSources/test/intltest/icusvtst.h b/icuSources/test/intltest/icusvtst.h index d02fa8f0..21d1f6a4 100644 --- a/icuSources/test/intltest/icusvtst.h +++ b/icuSources/test/intltest/icusvtst.h @@ -1,6 +1,6 @@ /** ******************************************************************************* - * Copyright (C) 2001-2002, International Business Machines Corporation and * + * Copyright (C) 2001-2003, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* * @@ -50,7 +50,7 @@ class ICUServiceTest : public IntlTest void msgstr(const UnicodeString& message, UObject* obj, UBool err = TRUE); void logstr(const UnicodeString& message, UObject* obj) { - msgstr(message, obj, FALSE); + msgstr(message, obj, FALSE); } }; diff --git a/icuSources/test/intltest/idnaref.cpp b/icuSources/test/intltest/idnaref.cpp index 90803970..f629bea6 100644 --- a/icuSources/test/intltest/idnaref.cpp +++ b/icuSources/test/intltest/idnaref.cpp @@ -1,7 +1,7 @@ /* ******************************************************************************* * - * Copyright (C) 2003, International Business Machines + * Copyright (C) 2003-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -18,7 +18,6 @@ #if !UCONFIG_NO_IDNA && !UCONFIG_NO_TRANSLITERATION #include "idnaref.h" -#include "strprep.h" #include "punyref.h" #include "ustr_imp.h" #include "cmemory.h" @@ -29,7 +28,7 @@ #include "unicode/ustring.h" /* it is official IDNA ACE Prefix is "xn--" */ -static const UChar ACE_PREFIX[] ={ 0x0058,0x004E,0x002d,0x002d } ; +static const UChar ACE_PREFIX[] ={ 0x0078,0x006E,0x002d,0x002d } ; #define ACE_PREFIX_LENGTH 4 #define MAX_LABEL_LENGTH 63 @@ -44,21 +43,6 @@ static const UChar ACE_PREFIX[] ={ 0x0058,0x004E,0x002d,0x002d } ; #define FULL_STOP 0x002E -NamePrepTransform* TestIDNA::prep = NULL; - -NamePrepTransform* TestIDNA::getInstance(UErrorCode& status){ - if(TestIDNA::prep == NULL){ - UParseError parseError; - TestIDNA::prep = NamePrepTransform::createInstance(parseError, status); - if(TestIDNA::prep ==NULL){ - //status = U_MEMORY_ALLOCATION_ERROR; - return NULL; - } - } - return TestIDNA::prep; - -} - inline static UBool startsWithPrefix(const UChar* src , int32_t srcLength){ UBool startsWithPrefix = TRUE; @@ -68,7 +52,7 @@ startsWithPrefix(const UChar* src , int32_t srcLength){ } for(int8_t i=0; i< ACE_PREFIX_LENGTH; i++){ - if(u_toupper(src[i]) != ACE_PREFIX[i]){ + if(u_tolower(src[i]) != ACE_PREFIX[i]){ startsWithPrefix = FALSE; } } @@ -143,7 +127,7 @@ static inline int32_t convertUCharsToASCII(const UChar* src,char* dest, int32_t } // wrapper around the reference Punycode implementation static int32_t convertToPuny(const UChar* src, int32_t srcLength, - UChar* dest, int32_t destCapacity, + UChar* dest, int32_t destCapacity, UErrorCode& status){ uint32_t b1Stack[MAX_LABEL_BUFFER_SIZE]; int32_t b1Len = 0, b1Capacity = MAX_LABEL_BUFFER_SIZE; @@ -213,7 +197,7 @@ CLEANUP: } static int32_t convertFromPuny( const UChar* src, int32_t srcLength, - UChar* dest, int32_t destCapacity, + UChar* dest, int32_t destCapacity, UErrorCode& status){ char b1Stack[MAX_LABEL_BUFFER_SIZE]; char* b1 = b1Stack; @@ -257,11 +241,11 @@ CLEANUP: -U_CFUNC int32_t +U_CFUNC int32_t U_EXPORT2 idnaref_toASCII(const UChar* src, int32_t srcLength, - UChar* dest, int32_t destCapacity, + UChar* dest, int32_t destCapacity, int32_t options, - UParseError* parseError, + UParseError* parseError, UErrorCode* status){ if(status == NULL || U_FAILURE(*status)){ @@ -279,7 +263,7 @@ idnaref_toASCII(const UChar* src, int32_t srcLength, b2Capacity = MAX_LABEL_BUFFER_SIZE , reqLength=0; - //get the options + //get the options UBool allowUnassigned = (UBool)((options & IDNAREF_ALLOW_UNASSIGNED) != 0); UBool useSTD3ASCIIRules = (UBool)((options & IDNAREF_USE_STD3_RULES) != 0); @@ -320,8 +304,11 @@ idnaref_toASCII(const UChar* src, int32_t srcLength, // step 3 & 4 for( j=0;j 0x7F) srcIsASCII = FALSE; - srcIsLDH = prep->isLDHChar(b1[j]); + if(b1[j] > 0x7F){ + srcIsASCII = FALSE; + }else if(prep->isLDHChar(b1[j])==FALSE){ // if the char is in ASCII range verify that it is an LDH character{ + srcIsLDH = FALSE; + } } if(useSTD3ASCIIRules == TRUE){ @@ -337,7 +324,7 @@ idnaref_toASCII(const UChar* src, int32_t srcLength, uprv_memmove(dest, b1, b1Len * U_SIZEOF_UCHAR); reqLength = b1Len; }else{ - reqLength = b1Len; + reqLength = b1Len; goto CLEANUP; } }else{ @@ -404,11 +391,11 @@ CLEANUP: } -U_CFUNC int32_t +U_CFUNC int32_t U_EXPORT2 idnaref_toUnicode(const UChar* src, int32_t srcLength, - UChar* dest, int32_t destCapacity, + UChar* dest, int32_t destCapacity, int32_t options, - UParseError* parseError, + UParseError* parseError, UErrorCode* status){ if(status == NULL || U_FAILURE(*status)){ @@ -436,7 +423,7 @@ idnaref_toUnicode(const UChar* src, int32_t srcLength, b1Len = 0; UBool* caseFlags = NULL; - //get the options + //get the options UBool allowUnassigned = (UBool)((options & IDNAREF_ALLOW_UNASSIGNED) != 0); UBool useSTD3ASCIIRules = (UBool)((options & IDNAREF_USE_STD3_RULES) != 0); @@ -453,11 +440,10 @@ idnaref_toUnicode(const UChar* src, int32_t srcLength, for(;src[srcLength]!=0;){ if(src[srcLength]> 0x7f){ srcIsASCII = FALSE; - } - // here we do not assemble surrogates - // since we know that LDH code points - // are in the ASCII range only - if(prep->isLDHChar(src[srcLength])==FALSE){ + }if(prep->isLDHChar(src[srcLength])==FALSE){ + // here we do not assemble surrogates + // since we know that LDH code points + // are in the ASCII range only srcIsLDH = FALSE; failPos = srcLength; } @@ -467,11 +453,10 @@ idnaref_toUnicode(const UChar* src, int32_t srcLength, for(int32_t j=0; j 0x7f){ srcIsASCII = FALSE; - } - // here we do not assemble surrogates - // since we know that LDH code points - // are in the ASCII range only - if(prep->isLDHChar(src[j])==FALSE){ + }else if(prep->isLDHChar(src[j])==FALSE){ + // here we do not assemble surrogates + // since we know that LDH code points + // are in the ASCII range only srcIsLDH = FALSE; failPos = j; } @@ -655,11 +640,11 @@ getNextSeparator(UChar *src,int32_t srcLength,NamePrepTransform* prep, } } -U_CFUNC int32_t +U_CFUNC int32_t U_EXPORT2 idnaref_IDNToASCII( const UChar* src, int32_t srcLength, - UChar* dest, int32_t destCapacity, - int32_t options, - UParseError* parseError, + UChar* dest, int32_t destCapacity, + int32_t options, + UParseError* parseError, UErrorCode* status){ if(status == NULL || U_FAILURE(*status)){ @@ -684,7 +669,7 @@ idnaref_IDNToASCII( const UChar* src, int32_t srcLength, int32_t remainingLen = srcLength; int32_t b1Capacity = MAX_LABEL_BUFFER_SIZE; - //get the options + //get the options // UBool allowUnassigned = (UBool)((options & IDNAREF_ALLOW_UNASSIGNED) != 0); // UBool useSTD3ASCIIRules = (UBool)((options & IDNAREF_USE_STD3_RULES) != 0); UBool done = FALSE; @@ -807,11 +792,11 @@ CLEANUP: return u_terminateUChars(dest, destCapacity, reqLength, status); } -U_CFUNC int32_t +U_CFUNC int32_t U_EXPORT2 idnaref_IDNToUnicode( const UChar* src, int32_t srcLength, - UChar* dest, int32_t destCapacity, - int32_t options, - UParseError* parseError, + UChar* dest, int32_t destCapacity, + int32_t options, + UParseError* parseError, UErrorCode* status){ if(status == NULL || U_FAILURE(*status)){ @@ -837,11 +822,11 @@ idnaref_IDNToUnicode( const UChar* src, int32_t srcLength, int32_t remainingLen = srcLength; int32_t b1Capacity = MAX_LABEL_BUFFER_SIZE; - //get the options + //get the options // UBool allowUnassigned = (UBool)((options & IDNAREF_ALLOW_UNASSIGNED) != 0); // UBool useSTD3ASCIIRules = (UBool)((options & IDNAREF_USE_STD3_RULES) != 0); - if(U_FAILURE(*status)){ + if(U_FAILURE(*status)){ goto CLEANUP; } @@ -956,10 +941,10 @@ CLEANUP: return u_terminateUChars(dest, destCapacity, reqLength, status); } -U_CFUNC int32_t +U_CFUNC int32_t U_EXPORT2 idnaref_compare( const UChar *s1, int32_t length1, const UChar *s2, int32_t length2, - int32_t options, + int32_t options, UErrorCode* status){ if(status == NULL || U_FAILURE(*status)){ @@ -971,7 +956,7 @@ idnaref_compare( const UChar *s1, int32_t length1, int32_t b1Len, b2Len, b1Capacity = MAX_IDN_BUFFER_SIZE, b2Capacity = MAX_IDN_BUFFER_SIZE; int32_t result = -1; - UParseError parseError; + UParseError parseError; b1Len = idnaref_IDNToASCII(s1, length1, b1, b1Capacity, options, &parseError, status); if(*status == U_BUFFER_OVERFLOW_ERROR){ diff --git a/icuSources/test/intltest/idnaref.h b/icuSources/test/intltest/idnaref.h index 07654783..78af44b6 100644 --- a/icuSources/test/intltest/idnaref.h +++ b/icuSources/test/intltest/idnaref.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * - * Copyright (C) 2003, International Business Machines + * Copyright (C) 2003-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -59,7 +59,7 @@ * @return Number of ASCII characters converted. * @draft ICU 2.6 */ -U_CFUNC int32_t +U_CFUNC int32_t U_EXPORT2 idnaref_toASCII(const UChar* src, int32_t srcLength, UChar* dest, int32_t destCapacity, int32_t options, @@ -98,7 +98,7 @@ idnaref_toASCII(const UChar* src, int32_t srcLength, * @return Number of Unicode characters converted. * @draft ICU 2.6 */ -U_CFUNC int32_t +U_CFUNC int32_t U_EXPORT2 idnaref_toUnicode(const UChar* src, int32_t srcLength, UChar* dest, int32_t destCapacity, int32_t options, @@ -142,7 +142,7 @@ idnaref_toUnicode(const UChar* src, int32_t srcLength, * @return Number of ASCII characters converted. * @draft ICU 2.6 */ -U_CFUNC int32_t +U_CFUNC int32_t U_EXPORT2 idnaref_IDNToASCII( const UChar* src, int32_t srcLength, UChar* dest, int32_t destCapacity, int32_t options, @@ -182,7 +182,7 @@ idnaref_IDNToASCII( const UChar* src, int32_t srcLength, * @return Number of ASCII characters converted. * @draft ICU 2.6 */ -U_CFUNC int32_t +U_CFUNC int32_t U_EXPORT2 idnaref_IDNToUnicode( const UChar* src, int32_t srcLength, UChar* dest, int32_t destCapacity, int32_t options, @@ -217,7 +217,7 @@ idnaref_IDNToUnicode( const UChar* src, int32_t srcLength, * @return <0 or 0 or >0 as usual for string comparisons * @draft ICU 2.6 */ -U_CFUNC int32_t +U_CFUNC int32_t U_EXPORT2 idnaref_compare( const UChar *s1, int32_t length1, const UChar *s2, int32_t length2, int32_t options, diff --git a/icuSources/test/intltest/incaltst.cpp b/icuSources/test/intltest/incaltst.cpp index 44cb39b7..24ca9f40 100644 --- a/icuSources/test/intltest/incaltst.cpp +++ b/icuSources/test/intltest/incaltst.cpp @@ -1,8 +1,8 @@ -/******************************************************************** +/*********************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ + * Copyright (c) 1997-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ***********************************************************************/ /* Test Internationalized Calendars for C++ */ @@ -13,6 +13,7 @@ #if !UCONFIG_NO_FORMATTING #include +#include "caltest.h" #define CHECK(status, msg) \ if (U_FAILURE(status)) { \ @@ -50,30 +51,14 @@ static UnicodeString escape( const UnicodeString&src) // ***************************************************************************** // class IntlCalendarTest // ***************************************************************************** +//--- move to CalendarTest? + +static const double JULIAN_EPOCH = -210866760000000.; -static UnicodeString fieldName(UCalendarDateFields f); // Turn this on to dump the calendar fields #define U_DEBUG_DUMPCALS -static UnicodeString calToStr(const Calendar & cal) -{ - - UnicodeString out; - UErrorCode status = U_ZERO_ERROR; - int i; - for(i = 0;i " + cal.get(UCAL_ERA, status) + ":" + @@ -276,20 +245,20 @@ void IntlCalendarTest::TestBuddhist() { UDate timeA = Calendar::getNow(); int32_t data[] = { - 0, // B. era + 0, // B. era [928479600000] 2542, // B. year 1999, // G. year UCAL_JUNE, // month 4, // day - 0, // B. era + 0, // B. era [-79204842000000] 3, // B. year -540, // G. year UCAL_FEBRUARY, // month 12, // day 0, // test month calculation: 4795 BE = 4252 AD is a leap year, but 4795 AD is not. - 4795, // BE + 4795, // BE [72018057600000] 4252, // AD UCAL_FEBRUARY, 29, @@ -298,8 +267,8 @@ void IntlCalendarTest::TestBuddhist() { }; Calendar *cal; UErrorCode status = U_ZERO_ERROR; - cal = Calendar::createInstance("th_TH_TRADITIONAL", status); - CHECK(status, UnicodeString("Creating th_TH_TRADITIONAL calendar")); + cal = Calendar::createInstance("th_TH@calendar=buddhist", status); + CHECK(status, UnicodeString("Creating th_TH@calendar=buddhist calendar")); // Sanity check the calendar UDate timeB = Calendar::getNow(); @@ -350,8 +319,8 @@ void IntlCalendarTest::TestJapanese() { Calendar *cal; UErrorCode status = U_ZERO_ERROR; - cal = Calendar::createInstance("ja_JP_TRADITIONAL", status); - CHECK(status, UnicodeString("Creating ja_JP_TRADITIONAL calendar")); + cal = Calendar::createInstance("ja_JP@calendar=japanese", status); + CHECK(status, UnicodeString("Creating ja_JP@calendar=japanese calendar")); // Sanity check the calendar UDate timeB = Calendar::getNow(); UDate timeCal = cal->getTime(status); @@ -366,26 +335,23 @@ void IntlCalendarTest::TestJapanese() { } void IntlCalendarTest::TestBuddhistFormat() { - Calendar *cal; UErrorCode status = U_ZERO_ERROR; - cal = Calendar::createInstance("th_TH_TRADITIONAL", status); - CHECK(status, UnicodeString("Creating th_TH_TRADITIONAL calendar")); // Test simple parse/format with adopt // First, a contrived english test.. UDate aDate = 999932400000.0; - SimpleDateFormat *fmt = new SimpleDateFormat(UnicodeString("MMMM d, yyyy G"), Locale("en_US"), status); + SimpleDateFormat *fmt = new SimpleDateFormat(UnicodeString("MMMM d, yyyy G"), Locale("en_US@calendar=buddhist"), status); CHECK(status, "creating date format instance"); + SimpleDateFormat *fmt2 = new SimpleDateFormat(UnicodeString("MMMM d, yyyy G"), Locale("en_US@calendar=gregorian"), status); + CHECK(status, "creating gregorian date format instance"); if(!fmt) { errln("Coudln't create en_US instance"); } else { UnicodeString str; - fmt->format(aDate, str); + fmt2->format(aDate, str); logln(UnicodeString() + "Test Date: " + str); str.remove(); - fmt->adoptCalendar(cal); - cal = NULL; fmt->format(aDate, str); logln(UnicodeString() + "as Buddhist Calendar: " + escape(str)); UnicodeString expected("September 8, 2544 BE"); @@ -402,7 +368,7 @@ void IntlCalendarTest::TestBuddhistFormat() { } delete fmt; } - delete cal; + delete fmt2; CHECK(status, "Error occured testing Buddhist Calendar in English "); @@ -412,7 +378,34 @@ void IntlCalendarTest::TestBuddhistFormat() { UnicodeString expect = CharsToUnicodeString("\\u0E27\\u0E31\\u0E19\\u0E40\\u0E2A\\u0E32\\u0E23\\u0E4C\\u0E17\\u0E35\\u0E48" " 8 \\u0E01\\u0E31\\u0e19\\u0e22\\u0e32\\u0e22\\u0e19 \\u0e1e.\\u0e28. 2544"); UDate expectDate = 999932400000.0; - Locale loc("th_TH_TRADITIONAL"); + Locale loc("th_TH_TRADITIONAL"); // legacy + + simpleTest(loc, expect, expectDate, status); + } + status = U_ZERO_ERROR; + { + UnicodeString expect = CharsToUnicodeString("\\u0E27\\u0E31\\u0E19\\u0E40\\u0E2A\\u0E32\\u0E23\\u0E4C\\u0E17\\u0E35\\u0E48" + " 8 \\u0E01\\u0E31\\u0e19\\u0e22\\u0e32\\u0e22\\u0e19 \\u0e1e.\\u0e28. 2544"); + UDate expectDate = 999932400000.0; + Locale loc("th_TH@calendar=buddhist"); + + simpleTest(loc, expect, expectDate, status); + } + status = U_ZERO_ERROR; + { + UnicodeString expect = CharsToUnicodeString("\\u0E27\\u0E31\\u0E19\\u0E40\\u0E2A\\u0E32\\u0E23\\u0E4C\\u0E17\\u0E35\\u0E48" + " 8 \\u0E01\\u0E31\\u0e19\\u0e22\\u0e32\\u0e22\\u0e19 \\u0e04.\\u0e28. 2001"); + UDate expectDate = 999932400000.0; + Locale loc("th_TH@calendar=gregorian"); + + simpleTest(loc, expect, expectDate, status); + } + status = U_ZERO_ERROR; + { + UnicodeString expect = CharsToUnicodeString("\\u0E27\\u0E31\\u0E19\\u0E40\\u0E2A\\u0E32\\u0E23\\u0E4C\\u0E17\\u0E35\\u0E48" + " 8 \\u0E01\\u0E31\\u0e19\\u0e22\\u0e32\\u0e22\\u0e19 \\u0e04.\\u0e28. 2001"); + UDate expectDate = 999932400000.0; + Locale loc("th_TH_TRADITIONAL@calendar=gregorian"); simpleTest(loc, expect, expectDate, status); } @@ -426,21 +419,22 @@ void IntlCalendarTest::TestJapaneseFormat() { CHECK(status, UnicodeString("Creating ja_JP_TRADITIONAL calendar")); Calendar *cal2 = cal->clone(); + delete cal; + cal = NULL; // Test simple parse/format with adopt UDate aDate = 999932400000.0; - SimpleDateFormat *fmt = new SimpleDateFormat(UnicodeString("MMMM d, yy G"), Locale("en_US"), status); + SimpleDateFormat *fmt = new SimpleDateFormat(UnicodeString("MMMM d, yy G"), Locale("en_US@calendar=japanese"), status); + SimpleDateFormat *fmt2 = new SimpleDateFormat(UnicodeString("MMMM d, yy G"), Locale("en_US@calendar=gregorian"), status); CHECK(status, "creating date format instance"); if(!fmt) { errln("Coudln't create en_US instance"); } else { UnicodeString str; - fmt->format(aDate, str); + fmt2->format(aDate, str); logln(UnicodeString() + "Test Date: " + str); str.remove(); - fmt->adoptCalendar(cal); - cal = NULL; fmt->format(aDate, str); logln(UnicodeString() + "as Japanese Calendar: " + str); UnicodeString expected("September 8, 13 Heisei"); @@ -453,7 +447,7 @@ void IntlCalendarTest::TestJapaneseFormat() { ParsePosition pp; fmt->parse(expected, *cal2, pp); fmt->format(otherDate, str3); - errln("Parse incorrect of " + expected + " - wanted " + aDate + " but got " + " = " + otherDate + ", " + str3 + " = " + calToStr(*cal2) ); + errln("Parse incorrect of " + expected + " - wanted " + aDate + " but got " + " = " + otherDate + ", " + str3 + " = " + CalendarTest::calToStr(*cal2) ); } else { logln("Parsed OK: " + expected); @@ -462,17 +456,16 @@ void IntlCalendarTest::TestJapaneseFormat() { } // Test parse with incomplete information - fmt = new SimpleDateFormat(UnicodeString("G y"), Locale("en_US"), status); + fmt = new SimpleDateFormat(UnicodeString("G y"), Locale("en_US@calendar=japanese"), status); aDate = -3197120400000.; CHECK(status, "creating date format instance"); if(!fmt) { errln("Coudln't create en_US instance"); } else { UnicodeString str; - fmt->format(aDate, str); + fmt2->format(aDate, str); logln(UnicodeString() + "Test Date: " + str); str.remove(); - fmt->adoptCalendar(cal2->clone()); fmt->format(aDate, str); logln(UnicodeString() + "as Japanese Calendar: " + str); UnicodeString expected("Meiji 1"); @@ -486,48 +479,57 @@ void IntlCalendarTest::TestJapaneseFormat() { fmt->parse(expected, *cal2, pp); fmt->format(otherDate, str3); errln("Parse incorrect of " + expected + " - wanted " + aDate + " but got " + " = " + - otherDate + ", " + str3 + " = " + calToStr(*cal2) ); + otherDate + ", " + str3 + " = " + CalendarTest::calToStr(*cal2) ); } else { logln("Parsed OK: " + expected); } delete fmt; } - delete cal; delete cal2; + delete fmt2; CHECK(status, "Error occured"); // Now, try in Japanese { - UnicodeString expect = CharsToUnicodeString("\\u5e73\\u621013\\u5e749\\u67088\\u65e5"); + UnicodeString expect = CharsToUnicodeString("\\u5e73\\u621013\\u5e749\\u67088\\u65e5\\u571f\\u66dc\\u65e5"); + UDate expectDate = 999932400000.0; // Testing a recent date + Locale loc("ja_JP@calendar=japanese"); + + status = U_ZERO_ERROR; + simpleTest(loc, expect, expectDate, status); + } + { + UnicodeString expect = CharsToUnicodeString("\\u5e73\\u621013\\u5e749\\u67088\\u65e5\\u571f\\u66dc\\u65e5"); UDate expectDate = 999932400000.0; // Testing a recent date - Locale loc("ja_JP_TRADITIONAL"); + Locale loc("ja_JP_TRADITIONAL"); // legacy status = U_ZERO_ERROR; simpleTest(loc, expect, expectDate, status); } { - UnicodeString expect = CharsToUnicodeString("\\u5b89\\u6c385\\u5e747\\u67084\\u65e5"); + UnicodeString expect = CharsToUnicodeString("\\u5b89\\u6c385\\u5e747\\u67084\\u65e5\\u6728\\u66dc\\u65e5"); UDate expectDate = -6106035600000.0; - Locale loc("ja_JP_TRADITIONAL"); + Locale loc("ja_JP@calendar=japanese"); status = U_ZERO_ERROR; simpleTest(loc, expect, expectDate, status); } { // Jitterbug 1869 - this is an ambiguous era. (Showa 64 = Jan 6 1989, but Showa could be 2 other eras) ) - UnicodeString expect = CharsToUnicodeString("\\u662d\\u548c64\\u5e741\\u67086\\u65e5"); + UnicodeString expect = CharsToUnicodeString("\\u662d\\u548c64\\u5e741\\u67086\\u65e5\\u91d1\\u66dc\\u65e5"); UDate expectDate = 600076800000.0; - Locale loc("ja_JP_TRADITIONAL"); + Locale loc("ja_JP@calendar=japanese"); status = U_ZERO_ERROR; simpleTest(loc, expect, expectDate, status); } { // This Feb 29th falls on a leap year by gregorian year, but not by Japanese year. - UnicodeString expect = CharsToUnicodeString("\\u5EB7\\u6B632\\u5e742\\u670829\\u65e5"); - UDate expectDate = -16214400000000.0; // courtesy of date format round trip test - Locale loc("ja_JP_TRADITIONAL"); + UnicodeString expect = CharsToUnicodeString("\\u5EB7\\u6B632\\u5e742\\u670829\\u65e5\\u65e5\\u66dc\\u65e5"); + // Add -1:00 to the following for historical TZ - aliu + UDate expectDate = -16214403600000.0; // courtesy of date format round trip test + Locale loc("ja_JP@calendar=japanese"); status = U_ZERO_ERROR; simpleTest(loc, expect, expectDate, status); diff --git a/icuSources/test/intltest/incaltst.h b/icuSources/test/intltest/incaltst.h index e0101033..1839879f 100644 --- a/icuSources/test/intltest/incaltst.h +++ b/icuSources/test/intltest/incaltst.h @@ -41,6 +41,7 @@ public: // package }; + #endif /* #if !UCONFIG_NO_FORMATTING */ #endif // __IntlCalendarTest__ diff --git a/icuSources/test/intltest/intltest.cpp b/icuSources/test/intltest/intltest.cpp index 5251c66c..26d2b6a2 100644 --- a/icuSources/test/intltest/intltest.cpp +++ b/icuSources/test/intltest/intltest.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -22,13 +22,17 @@ #include "unicode/smpdtfmt.h" #include "unicode/ucnv.h" #include "unicode/uclean.h" +#include "unicode/timezone.h" +#include "unicode/curramt.h" +#include "unicode/putil.h" #include "intltest.h" #include "caltztst.h" #include "itmajor.h" -#include "tsmutex.h" - +#include "cstring.h" #include "umutex.h" +#include "uassert.h" +#include "cmemory.h" #ifdef XP_MAC_CONSOLE #include @@ -50,16 +54,6 @@ UnicodeString UCharToUnicodeString(UChar c) { return UnicodeString(c); } -// [LIU] Just to get things working -UnicodeString -operator+(const UnicodeString& left, - const UnicodeString& right) -{ - UnicodeString str(left); - str += right; - return str; -} - // [rtg] Just to get things working UnicodeString operator+(const UnicodeString& left, @@ -87,6 +81,22 @@ operator+(const UnicodeString& left, return left + buffer; } +UnicodeString +Int64ToUnicodeString(int64_t num) +{ + char buffer[64]; // nos changed from 10 to 64 + char danger = 'p'; // guard against overrunning the buffer (rtg) + +#ifdef WIN32 + sprintf(buffer, "%I64d", num); +#else + sprintf(buffer, "%lld", num); +#endif + assert(danger == 'p'); + + return buffer; +} + // [LIU] Just to get things working UnicodeString operator+(const UnicodeString& left, @@ -95,7 +105,11 @@ operator+(const UnicodeString& left, char buffer[64]; // was 32, made it arbitrarily bigger (rtg) char danger = 'p'; // guard against overrunning the buffer (rtg) - sprintf(buffer, "%.30g", num); // nos changed from 99 to 30 + // IEEE floating point has 52 bits of mantissa, plus one assumed bit + // 53*log(2)/log(10) = 15.95 + // so there is no need to show more than 16 digits. [alan] + + sprintf(buffer, "%.16g", num); assert(danger == 'p'); return left + buffer; @@ -104,10 +118,9 @@ operator+(const UnicodeString& left, #if !UCONFIG_NO_FORMATTING /** - * Originally coded this as operator+, but that makes the expression - * + char* ambiguous. - liu + * Return a string display for for this, without surrounding braces. */ -UnicodeString toString(const Formattable& f) { +UnicodeString _toString(const Formattable& f) { UnicodeString s; switch (f.getType()) { case Formattable::kDate: @@ -117,45 +130,75 @@ UnicodeString toString(const Formattable& f) { if (U_SUCCESS(status)) { FieldPosition pos; fmt.format(f.getDate(), s, pos); - s.insert(0, "[Date:"); - s.insert(s.length(), (UChar)0x005d); + s.insert(0, "Date:"); } else { - s = UnicodeString("[Error creating date format]"); + s = UnicodeString("Error creating date format]"); } } break; case Formattable::kDouble: - s = UnicodeString("[Double:") + f.getDouble() + "]"; + s = UnicodeString("double:") + f.getDouble(); break; case Formattable::kLong: - s = UnicodeString("[Long:") + f.getLong() + "]"; + s = UnicodeString("long:") + f.getLong(); break; + + case Formattable::kInt64: + s = UnicodeString("int64:") + Int64ToUnicodeString(f.getInt64()); + break; + case Formattable::kString: f.getString(s); - s.insert(0, "[String:"); - s.insert(s.length(), (UChar)0x005d); + s.insert(0, "String:"); break; case Formattable::kArray: { int32_t i, n; const Formattable* array = f.getArray(n); - s.insert(0, UnicodeString("[Array:")); + s.insert(0, UnicodeString("Array:")); UnicodeString delim(", "); for (i=0; i 0) { s.append(delim); } - s = s + toString(array[i]); + s = s + _toString(array[i]); } - s.append(UChar(0x005d)); } break; + case Formattable::kObject: + if (f.getObject()->getDynamicClassID() == + CurrencyAmount::getStaticClassID()) { + const CurrencyAmount& c = (const CurrencyAmount&) *f.getObject(); + s = _toString(c.getNumber()) + " " + UnicodeString(c.getISOCurrency()); + } else { + s = UnicodeString("Unknown UObject"); + } + break; + default: + s = UnicodeString("Unknown Formattable type=") + (int32_t)f.getType(); + break; } return s; } +/** + * Originally coded this as operator+, but that makes the expression + * + char* ambiguous. - liu + */ +UnicodeString toString(const Formattable& f) { + UnicodeString s((UChar)91/*[*/); + s.append(_toString(f)); + s.append((UChar)0x5d/*]*/); + return s; +} + #endif +// useful when operator+ won't cooperate +UnicodeString toString(int32_t n) { + return UnicodeString() + (long)n; +} + // stephen - cleaned up 05/05/99 UnicodeString operator+(const UnicodeString& left, char num) { return left + (long)num; } @@ -381,7 +424,7 @@ void IntlTest::setICU_DATA() { // may not be the same as the source directory, depending on // the configure options used. At any rate, // set the data path to the built data from this directory. - // The value is complete with quotes, so it can be used + // The value is complete with quotes, so it can be used // as-is as a string constant. #if defined (U_TOPBUILDDIR) @@ -498,47 +541,6 @@ void it_errln( UnicodeString message ) IntlTest::gTest->errln( message ); } -IntlTest& operator<<(IntlTest& test, const UnicodeString& string) -{ -/* NULL shouldn't happen */ -// if (&test == NULL) -// return *((IntlTest*) NULL); - test.log( string ); - return test; -} - -IntlTest& operator<<(IntlTest& test, const char* string) -{ -/* NULL shouldn't happen */ -// if (&test == NULL) -// return *((IntlTest*) NULL); - test.log( string ); - return test; -} - -IntlTest& operator<<(IntlTest& test, const int32_t num) -{ -/* NULL shouldn't happen */ -// if (&test == NULL) -// return *((IntlTest*) NULL); - char convert[20]; - sprintf(convert, "%li", (long)num); - test.log(convert); - return test; -} - -IntlTest& endl( IntlTest& test ) -{ - test.logln(); - return test; -} - -IntlTest& operator<<(IntlTest& test, IntlTest& ( * _f)(IntlTest&)) -{ - (*_f)(test); - return test; -} - IntlTest::IntlTest() { @@ -626,7 +628,7 @@ UBool IntlTest::runTest( char* name, char* par ) } if (!name || (name[0] == 0) || (strcmp(name, "*") == 0)) { - rval = runTestLoop( NULL, NULL ); + rval = runTestLoop( NULL, par ); }else if (strcmp( name, "LIST" ) == 0) { this->usage(); @@ -669,7 +671,7 @@ UBool IntlTest::runTestLoop( char* testname, char* par ) IntlTest* saveTest = gTest; gTest = this; do { - this->runIndexedTest( index, FALSE, name ); + this->runIndexedTest( index, FALSE, name, par ); if (!name || (name[0] == 0)) break; if (!testname) { @@ -790,7 +792,7 @@ void IntlTest::errln( const UnicodeString &message ) /* convenience functions that include sprintf formatting */ void IntlTest::log(const char *fmt, ...) { - char buffer[512]; + char buffer[4000]; va_list ap; va_start(ap, fmt); @@ -804,7 +806,7 @@ void IntlTest::log(const char *fmt, ...) void IntlTest::logln(const char *fmt, ...) { - char buffer[512]; + char buffer[4000]; va_list ap; va_start(ap, fmt); @@ -819,7 +821,7 @@ void IntlTest::logln(const char *fmt, ...) /* convenience functions that include sprintf formatting */ void IntlTest::info(const char *fmt, ...) { - char buffer[512]; + char buffer[4000]; va_list ap; va_start(ap, fmt); @@ -831,7 +833,7 @@ void IntlTest::info(const char *fmt, ...) void IntlTest::infoln(const char *fmt, ...) { - char buffer[512]; + char buffer[4000]; va_list ap; va_start(ap, fmt); @@ -843,7 +845,7 @@ void IntlTest::infoln(const char *fmt, ...) void IntlTest::err(const char *fmt, ...) { - char buffer[512]; + char buffer[4000]; va_list ap; va_start(ap, fmt); @@ -854,7 +856,7 @@ void IntlTest::err(const char *fmt, ...) void IntlTest::errln(const char *fmt, ...) { - char buffer[512]; + char buffer[4000]; va_list ap; va_start(ap, fmt); @@ -893,7 +895,7 @@ void IntlTest::LL_message( UnicodeString message, UBool newline ) // stream out the indentation string first if necessary length = indent.extract(1, indent.length(), buffer, sizeof(buffer)); if (length > 0) { - fwrite(buffer, sizeof(*buffer), length, testoutfp); + fwrite(buffer, sizeof(*buffer), length, (FILE *)testoutfp); } // replace each LineFeed by the indentation string @@ -902,17 +904,17 @@ void IntlTest::LL_message( UnicodeString message, UBool newline ) // stream out the message length = message.extract(0, message.length(), buffer, sizeof(buffer)); if (length > 0) { - fwrite(buffer, sizeof(*buffer), length, testoutfp); + fwrite(buffer, sizeof(*buffer), length, (FILE *)testoutfp); } if (newline) { char newLine = '\n'; - fwrite(&newLine, sizeof(newLine), 1, testoutfp); + fwrite(&newLine, sizeof(newLine), 1, (FILE *)testoutfp); } // A newline usually flushes the buffer, but // flush the message just in case of a core dump. - fflush(testoutfp); + fflush((FILE *)testoutfp); } /** @@ -959,7 +961,7 @@ int main(int argc, char* argv[]) { UBool syntax = FALSE; - UBool all = TRUE; + UBool all = FALSE; UBool verbose = FALSE; UBool no_err_msg = FALSE; UBool quick = TRUE; @@ -968,74 +970,68 @@ main(int argc, char* argv[]) UBool warnOnMissingData = FALSE; UErrorCode errorCode = U_ZERO_ERROR; UConverter *cnv = NULL; - const char *warnOrErr = "Failure"; - - /* This must be tested before using anything! */ - MutexTest::gMutexInitialized = umtx_isInitialized(NULL); + const char *warnOrErr = "Failure"; #ifdef XP_MAC_CONSOLE argc = ccommand( &argv ); #endif - /* try opening the data from dll instead of the dat file */ - cnv = ucnv_open(TRY_CNV_1, &errorCode); - if(cnv != 0) { - /* ok */ - ucnv_close(cnv); - } else { + /* Initialize ICU */ + IntlTest::setICU_DATA(); // Must set data directory before u_init() is called. + u_init(&errorCode); + if (U_FAILURE(errorCode)) { fprintf(stderr, - "#### WARNING! The converter for " TRY_CNV_1 " cannot be loaded from data dll/so." - "Proceeding to load data from dat file.\n"); - errorCode = U_ZERO_ERROR; - + "#### %s: u_init() failed, error is \"%s\".\n" + "#### Most commonly indicates that the ICU data is not accesible.\n" + "#### Check setting of ICU_DATA, or check that ICU data library is available\n" + "#### ICU_DATA is currently set to \"%s\"\n", argv[0], u_errorName(errorCode), u_getDataDirectory()); + u_cleanup(); + return 1; } - // If user didn't set ICU_DATA, attempt to generate one. - IntlTest::setICU_DATA(); + for (int i = 1; i < argc; ++i) { if (argv[i][0] == '-') { const char* str = argv[i] + 1; - if (strcmp("verbose", str) == 0) + if (strcmp("verbose", str) == 0 || + strcmp("v", str) == 0) verbose = TRUE; - else if (strcmp("v", str) == 0) - verbose = TRUE; - else if (strcmp("noerrormsg", str) == 0) - no_err_msg = TRUE; - else if (strcmp("n", str) == 0) + else if (strcmp("noerrormsg", str) == 0 || + strcmp("n", str) == 0) no_err_msg = TRUE; - else if (strcmp("exhaustive", str) == 0) + else if (strcmp("exhaustive", str) == 0 || + strcmp("e", str) == 0) quick = FALSE; - else if (strcmp("e", str) == 0) - quick = FALSE; - else if (strcmp("all", str) == 0) - all = TRUE; - else if (strcmp("a", str) == 0) + else if (strcmp("all", str) == 0 || + strcmp("a", str) == 0) all = TRUE; - else if (strcmp("leaks", str) == 0) - leaks = TRUE; - else if (strcmp("l", str) == 0) + else if (strcmp("leaks", str) == 0 || + strcmp("l", str) == 0) leaks = TRUE; else if (strcmp("w", str) == 0) { warnOnMissingData = TRUE; warnOrErr = "WARNING"; - } else { + } + else { syntax = TRUE; } }else{ name = TRUE; - all = FALSE; } } - if (all && name) syntax = TRUE; - if (!all && !name) syntax = TRUE; + if (!all && !name) { + all = TRUE; + } else if (all && name) { + syntax = TRUE; + } if (syntax) { fprintf(stdout, "### Syntax:\n" "### IntlTest [-option1 -option2 ...] [testname1 testname2 ...] \n" "### where options are: verbose (v), all (a), noerrormsg (n), \n" - "### exhaustive (e) and leaks (l). \n" + "### exhaustive (e), leaks (l)" "### (Specify either -all (shortcut -a) or a test name). \n" "### -all will run all of the tests.\n" "### \n" @@ -1079,7 +1075,7 @@ main(int argc, char* argv[]) "*** check that the data files are present.\n", u_errorName(errorCode)); if(!warnOnMissingData) { - fprintf(stdout, "*** Exitting. Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n"); + fprintf(stdout, "*** Exiting. Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n"); return 1; } } @@ -1098,7 +1094,7 @@ main(int argc, char* argv[]) "*** check that the data files are present.\n", warnOrErr, ucnv_getDefaultName()); if(!warnOnMissingData) { - fprintf(stdout, "*** Exitting. Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n"); + fprintf(stdout, "*** Exiting. Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n"); return 1; } } @@ -1114,7 +1110,7 @@ main(int argc, char* argv[]) "*** Check the ICU_DATA environment variable and \n" "*** check that the data files are present.\n", warnOrErr); if(!warnOnMissingData) { - fprintf(stdout, "*** Exitting. Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n"); + fprintf(stdout, "*** Exiting. Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n"); return 1; } } @@ -1127,7 +1123,7 @@ main(int argc, char* argv[]) "*** Check the ICU_DATA environment variable and \n" "*** check that the data files are present.\n", warnOrErr); if(!warnOnMissingData) { - fprintf(stdout, "*** Exitting. Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n"); + fprintf(stdout, "*** Exiting. Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n"); return 1; } } @@ -1186,18 +1182,6 @@ main(int argc, char* argv[]) fprintf(stdout, "--------------------------------------\n"); - if (!MutexTest::gMutexInitialized) { - fprintf(stderr, - "#### WARNING!\n" - " The global mutex was not initialized during C++ static initialization.\n" - " You must use an ICU API in a single thread, like ucnv_open() or\n" - " uloc_countAvailable(), before using ICU in multiple threads.\n" - " Most ICU API functions will initialize the global mutex for you.\n" - " If you are using ICU in a single threaded application, please ignore this\n" - " warning.\n" - "#### WARNING!\n" - ); - } if (execCount <= 0) { fprintf(stdout, "***** Not all called tests actually exist! *****\n"); } @@ -1225,7 +1209,7 @@ const char* IntlTest::loadTestData(UErrorCode& err){ /* u_getDataDirectory shoul return \source\data ... set the * directory to ..\source\data\..\test\testdata\out\testdata */ - strcpy(tdpath, directory); + strcpy(tdpath, directory); strcat(tdpath, tdrelativepath); strcat(tdpath,"testdata"); @@ -1243,6 +1227,30 @@ const char* IntlTest::loadTestData(UErrorCode& err){ return _testDataPath; } +const char* IntlTest::getTestDataPath(UErrorCode& err) { + return loadTestData(err); +} + +/* Returns the path to icu/source/test/testdata/ */ +const char *IntlTest::getSourceTestData(UErrorCode& /*err*/) { + const char *srcDataDir = NULL; +#ifdef U_TOPSRCDIR + srcDataDir = U_TOPSRCDIR U_FILE_SEP_STRING"test"U_FILE_SEP_STRING"testdata"U_FILE_SEP_STRING; +#else + srcDataDir = ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING"test"U_FILE_SEP_STRING"testdata"U_FILE_SEP_STRING; + FILE *f = fopen(".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING"test"U_FILE_SEP_STRING"testdata"U_FILE_SEP_STRING"rbbitst.txt", "r"); + if (f) { + /* We're in icu/source/test/intltest/ */ + fclose(f); + } + else { + /* We're in icu/source/test/intltest/(Debug|Release) */ + srcDataDir = ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING"test"U_FILE_SEP_STRING"testdata"U_FILE_SEP_STRING; + } +#endif + return srcDataDir; +} + const char* IntlTest::fgDataDir = NULL; /* returns the path to icu/source/data */ @@ -1295,14 +1303,14 @@ const char * IntlTest::pathToDataDirectory() } else { /* __FILE__ on MSVC7 does not contain the directory */ - FILE *file = fopen(".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "Makefile.in", "r"); - if (file) { - fclose(file); - fgDataDir = ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING; - } - else { - fgDataDir = ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING; - } + FILE *file = fopen(".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "Makefile.in", "r"); + if (file) { + fclose(file); + fgDataDir = ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING; + } + else { + fgDataDir = ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING; + } } } #endif @@ -1322,6 +1330,208 @@ UnicodeString CharsToUnicodeString(const char* chars) return str.unescape(); } +UnicodeString ctou(const char* chars) { + return CharsToUnicodeString(chars); +} + +#define RAND_M (714025) +#define RAND_IA (1366) +#define RAND_IC (150889) + +static int32_t RAND_SEED; + +/** + * Returns a uniform random value x, with 0.0 <= x < 1.0. Use + * with care: Does not return all possible values; returns one of + * 714,025 values, uniformly spaced. However, the period is + * effectively infinite. See: Numerical Recipes, section 7.1. + * + * @param seedp pointer to seed. Set *seedp to any negative value + * to restart the sequence. + */ +float IntlTest::random(int32_t* seedp) { + static int32_t iy, ir[98]; + static UBool first=TRUE; + int32_t j; + if (*seedp < 0 || first) { + first = FALSE; + if ((*seedp=(RAND_IC-(*seedp)) % RAND_M) < 0) *seedp = -(*seedp); + for (j=1;j<=97;++j) { + *seedp=(RAND_IA*(*seedp)+RAND_IC) % RAND_M; + ir[j]=(*seedp); + } + *seedp=(RAND_IA*(*seedp)+RAND_IC) % RAND_M; + iy=(*seedp); + } + j=(int32_t)(1 + 97.0*iy/RAND_M); + U_ASSERT(j>=1 && j<=97); + iy=ir[j]; + *seedp=(RAND_IA*(*seedp)+RAND_IC) % RAND_M; + ir[j]=(*seedp); + return (float) iy/RAND_M; +} + +/** + * Convenience method using a global seed. + */ +float IntlTest::random() { + return random(&RAND_SEED); +} + +static inline UChar toHex(int32_t i) { + return (UChar)(i + (i < 10 ? 0x30 : (0x41 - 10))); +} + +static UnicodeString& escape(const UnicodeString& s, UnicodeString& result) { + for (int32_t i=0; i> 12) & 0xF); + result += toHex((c >> 8) & 0xF); + result += toHex((c >> 4) & 0xF); + result += toHex( c & 0xF); + } + } + return result; +} + +#define VERBOSE_ASSERTIONS + +UBool IntlTest::assertTrue(const char* message, UBool condition, UBool quiet) { + if (!condition) { + errln("FAIL: assertTrue() failed: %s", message); + } else if (!quiet) { + logln("Ok: %s", message); + } + return condition; +} + +UBool IntlTest::assertFalse(const char* message, UBool condition, UBool quiet) { + if (condition) { + errln("FAIL: assertFalse() failed: %s", message); + } else if (!quiet) { + logln("Ok: %s", message); + } + return !condition; +} + +UBool IntlTest::assertSuccess(const char* message, UErrorCode ec) { + if (U_FAILURE(ec)) { + errln("FAIL: %s (%s)", message, u_errorName(ec)); + return FALSE; + } + return TRUE; +} + +UBool IntlTest::assertEquals(const char* message, + const UnicodeString& expected, + const UnicodeString& actual) { + if (expected != actual) { + errln((UnicodeString)"FAIL: " + message + "; got " + + prettify(actual) + + "; expected " + prettify(expected)); + return FALSE; + } +#ifdef VERBOSE_ASSERTIONS + else { + logln((UnicodeString)"Ok: " + message + "; got " + prettify(actual)); + } +#endif + return TRUE; +} + +UBool IntlTest::assertEquals(const char* message, + const char* expected, + const char* actual) { + if (uprv_strcmp(expected, actual) != 0) { + errln((UnicodeString)"FAIL: " + message + "; got \"" + + actual + + "\"; expected \"" + expected + "\""); + return FALSE; + } +#ifdef VERBOSE_ASSERTIONS + else { + logln((UnicodeString)"Ok: " + message + "; got \"" + actual + "\""); + } +#endif + return TRUE; +} + +#if !UCONFIG_NO_FORMATTING +UBool IntlTest::assertEquals(const char* message, + const Formattable& expected, + const Formattable& actual) { + if (expected != actual) { + errln((UnicodeString)"FAIL: " + message + "; got " + + toString(actual) + + "; expected " + toString(expected)); + return FALSE; + } +#ifdef VERBOSE_ASSERTIONS + else { + logln((UnicodeString)"Ok: " + message + "; got " + toString(actual)); + } +#endif + return TRUE; +} +#endif + +static char ASSERT_BUF[256]; + +static const char* extractToAssertBuf(const UnicodeString& message) { + UnicodeString buf; + escape(message, buf); + buf.extract(0, 0x7FFFFFFF, ASSERT_BUF, sizeof(ASSERT_BUF)-1, 0); + ASSERT_BUF[sizeof(ASSERT_BUF)-1] = 0; + return ASSERT_BUF; +} + +UBool IntlTest::assertTrue(const UnicodeString& message, UBool condition, UBool quiet) { + return assertTrue(extractToAssertBuf(message), condition, quiet); +} + +UBool IntlTest::assertFalse(const UnicodeString& message, UBool condition, UBool quiet) { + return assertFalse(extractToAssertBuf(message), condition, quiet); +} + +UBool IntlTest::assertSuccess(const UnicodeString& message, UErrorCode ec) { + return assertSuccess(extractToAssertBuf(message), ec); +} + +UBool IntlTest::assertEquals(const UnicodeString& message, + const UnicodeString& expected, + const UnicodeString& actual) { + return assertEquals(extractToAssertBuf(message), expected, actual); +} + +UBool IntlTest::assertEquals(const UnicodeString& message, + const char* expected, + const char* actual) { + return assertEquals(extractToAssertBuf(message), expected, actual); +} +//-------------------------------------------------------------------- +// Time bomb - allows temporary behavior that expires at a given +// release +//-------------------------------------------------------------------- + +UBool IntlTest::isICUVersionAtLeast(const UVersionInfo x) { + UVersionInfo v; + u_getVersion(v); + return (uprv_memcmp(v, x, U_MAX_VERSION_LENGTH) >= 0); +} + +#if !UCONFIG_NO_FORMATTING +UBool IntlTest::assertEquals(const UnicodeString& message, + const Formattable& expected, + const Formattable& actual) { + return assertEquals(extractToAssertBuf(message), expected, actual); +} +#endif + /* * Hey, Emacs, please set the following: * @@ -1330,4 +1540,3 @@ UnicodeString CharsToUnicodeString(const char* chars) * End: * */ - diff --git a/icuSources/test/intltest/intltest.dsp b/icuSources/test/intltest/intltest.dsp index 9c072f40..5746e0cd 100644 --- a/icuSources/test/intltest/intltest.dsp +++ b/icuSources/test/intltest/intltest.dsp @@ -45,7 +45,7 @@ RSC=rc.exe # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /G6 /MT /Za /W3 /GX /Zi /Ox /Ob0 /I "..\..\..\include" /I "..\..\..\source\common" /I "..\..\..\source\i18n" /I "..\..\tools\toolutil" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c +# ADD CPP /nologo /G6 /MT /Za /W3 /GX /Zi /Ox /Ob0 /I "..\..\..\include" /I "..\..\..\source\common" /I "..\..\..\source\i18n" /I "..\..\tools\toolutil" /I "..\..\tools\ctestfw" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -53,7 +53,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 /nologo /subsystem:console /machine:I386 /pdbtype:sept /libpath:"..\..\..\lib" +# ADD LINK32 icuuc.lib icuin.lib icutu.lib ctestfw.lib /nologo /subsystem:console /machine:I386 /pdbtype:sept /libpath:"..\..\..\lib" # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "intltest - Win32 Debug" @@ -71,7 +71,7 @@ LINK32=link.exe # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /G6 /MTd /Za /W3 /Gm /GX /ZI /Od /I "..\..\..\include" /I "..\..\..\source\common" /I "..\..\..\source\i18n" /I "..\..\tools\toolutil" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "UDATA_MAP_DLL" /FR /FD /GZ /c +# ADD CPP /nologo /G6 /MTd /Za /W3 /Gm /GX /ZI /Od /I "..\..\..\include" /I "..\..\..\source\common" /I "..\..\..\source\i18n" /I "..\..\tools\toolutil" /I "..\..\tools\ctestfw" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "UDATA_MAP_DLL" /FR /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe @@ -79,7 +79,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\lib" /warn:3 +# ADD LINK32 icuucd.lib icuind.lib icutud.lib ctestfwd.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\lib" /warn:3 # SUBTRACT LINK32 /pdb:none /map !ELSEIF "$(CFG)" == "intltest - Win64 Release" @@ -97,7 +97,7 @@ LINK32=link.exe # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\..\include" /I "..\..\..\source\common" /I "..\..\..\source\i18n" /I "..\..\tools\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\..\include" /I "..\..\..\source\common" /I "..\..\..\source\i18n" /I "..\..\tools\toolutil" /I "..\..\tools\ctestfw" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -105,7 +105,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:IX86 /machine:IA64 -# ADD LINK32 icuuc.lib icuin.lib icutu.lib /nologo /subsystem:console /machine:IX86 /pdbtype:sept /libpath:"..\..\..\lib" /machine:IA64 +# ADD LINK32 icuuc.lib icuin.lib icutu.lib ctestfw.lib /nologo /subsystem:console /machine:IX86 /pdbtype:sept /libpath:"..\..\..\lib" /machine:IA64 !ELSEIF "$(CFG)" == "intltest - Win64 Debug" @@ -122,7 +122,7 @@ LINK32=link.exe # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\..\include" /I "..\..\..\source\common" /I "..\..\..\source\i18n" /I "..\..\tools\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "UDATA_MAP_DLL" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\..\include" /I "..\..\..\source\common" /I "..\..\..\source\i18n" /I "..\..\tools\toolutil" /I "..\..\tools\ctestfw" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "UDATA_MAP_DLL" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe @@ -130,7 +130,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:IX86 /pdbtype:sept /machine:IA64 -# ADD LINK32 icuucd.lib icuind.lib icutud.lib /nologo /subsystem:console /incremental:no /debug /machine:IX86 /pdbtype:sept /libpath:"..\..\..\lib\\" /libpath:"..\..\..\lib" /machine:IA64 +# ADD LINK32 icuucd.lib icuind.lib icutud.lib ctestfwd.lib /nologo /subsystem:console /incremental:no /debug /machine:IX86 /pdbtype:sept /libpath:"..\..\..\lib\\" /libpath:"..\..\..\lib" /machine:IA64 !ENDIF @@ -372,6 +372,14 @@ SOURCE=.\ucaconf.h # Begin Group "collections" # PROP Default_Filter "" +# Begin Source File + +SOURCE=.\v32test.cpp +# End Source File +# Begin Source File + +SOURCE=.\v32test.h +# End Source File # End Group # Begin Group "configuration" @@ -379,6 +387,7 @@ SOURCE=.\ucaconf.h # Begin Source File SOURCE=.\strtest.cpp +# ADD CPP /Ze # End Source File # Begin Source File @@ -395,19 +404,23 @@ SOURCE=.\tsmthred.h # End Source File # Begin Source File -SOURCE=.\tsmutex.cpp +SOURCE=.\tsputil.cpp # End Source File # Begin Source File -SOURCE=.\tsmutex.h +SOURCE=.\tsputil.h # End Source File +# End Group +# Begin Group "conversion" + +# PROP Default_Filter "" # Begin Source File -SOURCE=.\tsputil.cpp +SOURCE=.\convtest.cpp # End Source File # Begin Source File -SOURCE=.\tsputil.h +SOURCE=.\convtest.h # End Source File # End Group # Begin Group "data & memory" @@ -427,6 +440,22 @@ SOURCE=.\uobjtest.h # PROP Default_Filter "" # Begin Source File +SOURCE=.\astrotst.cpp +# End Source File +# Begin Source File + +SOURCE=.\astrotst.h +# End Source File +# Begin Source File + +SOURCE=.\calcasts.cpp +# End Source File +# Begin Source File + +SOURCE=.\calcasts.h +# End Source File +# Begin Source File + SOURCE=.\callimts.cpp # End Source File # Begin Source File @@ -523,6 +552,14 @@ SOURCE=.\itrbnf.h # End Source File # Begin Source File +SOURCE=.\itrbnfp.cpp +# End Source File +# Begin Source File + +SOURCE=.\itrbnfp.h +# End Source File +# Begin Source File + SOURCE=.\itrbnfrt.cpp # End Source File # Begin Source File @@ -702,19 +739,51 @@ SOURCE=.\restsnew.cpp SOURCE=.\restsnew.h # End Source File # End Group -# Begin Group "misc" +# Begin Group "idna" # PROP Default_Filter "" # Begin Source File -SOURCE=.\datamap.cpp +SOURCE=.\idnaref.cpp +# End Source File +# Begin Source File + +SOURCE=.\idnaref.h +# End Source File +# Begin Source File + +SOURCE=.\nptrans.cpp +# End Source File +# Begin Source File + +SOURCE=.\nptrans.h +# End Source File +# Begin Source File + +SOURCE=.\punyref.c +# End Source File +# Begin Source File + +SOURCE=.\punyref.h +# End Source File +# Begin Source File + +SOURCE=.\testidn.cpp # End Source File # Begin Source File -SOURCE=.\datamap.h +SOURCE=.\testidna.cpp # End Source File # Begin Source File +SOURCE=.\testidna.h +# End Source File +# End Group +# Begin Group "misc" + +# PROP Default_Filter "" +# Begin Source File + SOURCE=.\intltest.cpp # End Source File # Begin Source File @@ -739,27 +808,27 @@ SOURCE=.\itutil.h # End Source File # Begin Source File -SOURCE=.\testdata.cpp +SOURCE=.\testutil.cpp # End Source File # Begin Source File -SOURCE=.\testdata.h +SOURCE=.\testutil.h # End Source File # Begin Source File -SOURCE=.\testutil.cpp +SOURCE=.\textfile.cpp # End Source File # Begin Source File -SOURCE=.\testutil.h +SOURCE=.\textfile.h # End Source File # Begin Source File -SOURCE=.\tstdtmod.cpp +SOURCE=.\tokiter.cpp # End Source File # Begin Source File -SOURCE=.\tstdtmod.h +SOURCE=.\tokiter.h # End Source File # End Group # Begin Group "normalization" @@ -891,14 +960,6 @@ SOURCE=.\cpdtrtst.h # End Source File # Begin Source File -SOURCE=.\hxuntrts.cpp -# End Source File -# Begin Source File - -SOURCE=.\hxuntrts.h -# End Source File -# Begin Source File - SOURCE=.\ittrans.cpp # End Source File # Begin Source File @@ -945,62 +1006,6 @@ SOURCE=.\trnserr.cpp SOURCE=.\trnserr.h # End Source File -# Begin Source File - -SOURCE=.\ufltlgts.cpp -# End Source File -# Begin Source File - -SOURCE=.\ufltlgts.h -# End Source File -# Begin Source File - -SOURCE=.\unhxtrts.cpp -# End Source File -# Begin Source File - -SOURCE=.\unhxtrts.h -# End Source File -# End Group -# Begin Group "idna" - -# PROP Default_Filter "*.c,*.h" -# Begin Source File - -SOURCE=.\idnaref.cpp -# End Source File -# Begin Source File - -SOURCE=.\idnaref.h -# End Source File -# Begin Source File - -SOURCE=.\nptrans.cpp -# End Source File -# Begin Source File - -SOURCE=.\nptrans.h -# End Source File -# Begin Source File - -SOURCE=.\punyref.c -# End Source File -# Begin Source File - -SOURCE=.\punyref.h -# End Source File -# Begin Source File - -SOURCE=.\testidn.cpp -# End Source File -# Begin Source File - -SOURCE=.\testidna.cpp -# End Source File -# Begin Source File - -SOURCE=.\testidna.h -# End Source File # End Group # End Target # End Project diff --git a/icuSources/test/intltest/intltest.h b/icuSources/test/intltest/intltest.h index 940dbe54..a918e74a 100644 --- a/icuSources/test/intltest/intltest.h +++ b/icuSources/test/intltest/intltest.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -11,11 +11,9 @@ #ifndef _INTLTEST #define _INTLTEST -#include - -#include "unicode/utypes.h" -#include "unicode/unistr.h" +// The following includes utypes.h, uobject.h and unistr.h #include "unicode/fmtable.h" +#include "unicode/testlog.h" U_NAMESPACE_USE @@ -25,13 +23,12 @@ U_NAMESPACE_USE #pragma map(IntlTest::log( const UnicodeString &message ),"logos390") #endif -#define it_out (*IntlTest::gTest) - //----------------------------------------------------------------------------- //convenience classes to ease porting code that uses the Java //string-concatenation operator (moved from findword test by rtg) UnicodeString UCharToUnicodeString(UChar c); -UnicodeString operator+(const UnicodeString& left, const UnicodeString& right); +UnicodeString Int64ToUnicodeString(int64_t num); +//UnicodeString operator+(const UnicodeString& left, int64_t num); // Some compilers don't allow this because of the long type. UnicodeString operator+(const UnicodeString& left, long num); UnicodeString operator+(const UnicodeString& left, unsigned long num); UnicodeString operator+(const UnicodeString& left, double num); @@ -44,6 +41,7 @@ UnicodeString operator+(const UnicodeString& left, unsigned int num); UnicodeString operator+(const UnicodeString& left, float num); #if !UCONFIG_NO_FORMATTING UnicodeString toString(const Formattable& f); // liu +UnicodeString toString(int32_t n); #endif //----------------------------------------------------------------------------- @@ -69,7 +67,7 @@ UnicodeString toString(const Formattable& f); // liu } \ break -class IntlTest { +class IntlTest : public TestLog { public: IntlTest(); @@ -117,9 +115,51 @@ public: virtual void usage( void ) ; - FILE *testoutfp; + /** + * Returns a uniform random value x, with 0.0 <= x < 1.0. Use + * with care: Does not return all possible values; returns one of + * 714,025 values, uniformly spaced. However, the period is + * effectively infinite. See: Numerical Recipes, section 7.1. + * + * @param seedp pointer to seed. Set *seedp to any negative value + * to restart the sequence. + */ + static float random(int32_t* seedp); + + /** + * Convenience method using a global seed. + */ + static float random(); + + /** + * Ascertain the version of ICU. Useful for + * time bomb testing + */ + UBool isICUVersionAtLeast(const UVersionInfo x); protected: + /* JUnit-like assertions. Each returns TRUE if it succeeds. */ + UBool assertTrue(const char* message, UBool condition, UBool quiet=FALSE); + UBool assertFalse(const char* message, UBool condition, UBool quiet=FALSE); + UBool assertSuccess(const char* message, UErrorCode ec); + UBool assertEquals(const char* message, const UnicodeString& expected, + const UnicodeString& actual); + UBool assertEquals(const char* message, const char* expected, + const char* actual); +#if !UCONFIG_NO_FORMATTING + UBool assertEquals(const char* message, const Formattable& expected, + const Formattable& actual); + UBool assertEquals(const UnicodeString& message, const Formattable& expected, + const Formattable& actual); +#endif + UBool assertTrue(const UnicodeString& message, UBool condition, UBool quiet=FALSE); + UBool assertFalse(const UnicodeString& message, UBool condition, UBool quiet=FALSE); + UBool assertSuccess(const UnicodeString& message, UErrorCode ec); + UBool assertEquals(const UnicodeString& message, const UnicodeString& expected, + const UnicodeString& actual); + UBool assertEquals(const UnicodeString& message, const char* expected, + const char* actual); + virtual void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par = NULL ); // overide ! virtual UBool runTestLoop( char* testname, char* par ); @@ -142,7 +182,11 @@ private: IntlTest* caller; char* path; // specifies subtests + //FILE *testoutfp; + void *testoutfp; + protected: + virtual void LL_message( UnicodeString message, UBool newline ); // used for collation result reporting, defined here for convenience @@ -163,6 +207,8 @@ public: public: UBool run_phase2( char* name, char* par ); // internally, supports reporting memory leaks static const char* loadTestData(UErrorCode& err); + virtual const char* getTestDataPath(UErrorCode& err); + static const char* getSourceTestData(UErrorCode& err); // static members public: @@ -181,13 +227,6 @@ void it_err(void); void it_err( UnicodeString message ); void it_errln( UnicodeString message ); -IntlTest& operator<<(IntlTest& test, const UnicodeString& string); -IntlTest& operator<<(IntlTest& test, const char* string); -IntlTest& operator<<(IntlTest& test, const int32_t num); - -IntlTest& endl( IntlTest& test ); -IntlTest& operator<<(IntlTest& test, IntlTest& ( * _f)(IntlTest&)); - /** * This is a variant of cintltst/ccolltst.c:CharsToUChars(). * It converts a character string into a UnicodeString, with @@ -195,4 +234,7 @@ IntlTest& operator<<(IntlTest& test, IntlTest& ( * _f)(IntlTest&)); */ extern UnicodeString CharsToUnicodeString(const char* chars); +/* alias for CharsToUnicodeString */ +extern UnicodeString ctou(const char* chars); + #endif // _INTLTEST diff --git a/icuSources/test/intltest/intltest.vcproj b/icuSources/test/intltest/intltest.vcproj index d1516af0..15c4c714 100644 --- a/icuSources/test/intltest/intltest.vcproj +++ b/icuSources/test/intltest/intltest.vcproj @@ -1,7 +1,7 @@ - + @@ -23,10 +23,11 @@ Optimization="0" ImproveFloatingPointConsistency="TRUE" OptimizeForProcessor="2" - AdditionalIncludeDirectories="..\..\..\include,..\..\..\source\common,..\..\..\source\i18n,..\..\tools\toolutil" - PreprocessorDefinitions="WIN32,_DEBUG,_CONSOLE,UDATA_MAP_DLL" + AdditionalIncludeDirectories="..\..\..\include,..\..\..\source\common,..\..\..\source\i18n,..\..\tools\toolutil,..\..\tools\ctestfw" + PreprocessorDefinitions="WIN32,_DEBUG,_CONSOLE" BasicRuntimeChecks="3" RuntimeLibrary="1" + BufferSecurityCheck="TRUE" DisableLanguageExtensions="TRUE" PrecompiledHeaderFile=".\Debug/intltest.pch" AssemblerListingLocation=".\Debug/" @@ -41,15 +42,13 @@ Name="VCCustomBuildTool"/> + SubSystem="1" + FixedBaseAddress="1"/> @@ -65,8 +64,14 @@ Culture="1033"/> + + + @@ -120,10 +124,18 @@ Culture="1033"/> + + + + + + + + + + + @@ -316,12 +338,6 @@ - - - - @@ -342,6 +358,18 @@ + + + + + + + + @@ -414,6 +442,12 @@ + + + + @@ -529,6 +563,37 @@ RelativePath=".\tztest.h"> + + + + + + + + + + + + + + + + + + + + @@ -554,12 +619,6 @@ - - - - @@ -579,22 +638,22 @@ RelativePath=".\itutil.h"> + RelativePath=".\testutil.cpp"> + RelativePath=".\testutil.h"> + RelativePath=".\textfile.cpp"> + RelativePath=".\textfile.h"> + RelativePath=".\tokiter.cpp"> + RelativePath=".\tokiter.h"> + + + + + + @@ -698,12 +769,6 @@ - - - - @@ -740,54 +805,17 @@ - - - - - - - - - - - - - - - - - - - - - - + Name="conversion" + Filter=""> + RelativePath=".\convtest.cpp"> + RelativePath=".\convtest.h"> - - diff --git a/icuSources/test/intltest/itercoll.cpp b/icuSources/test/intltest/itercoll.cpp index 8596b2a7..5a0078b1 100644 --- a/icuSources/test/intltest/itercoll.cpp +++ b/icuSources/test/intltest/itercoll.cpp @@ -173,6 +173,18 @@ void CollationIteratorTest::TestPrevious(/* char* par */) void CollationIteratorTest::TestOffset(/* char* par */) { CollationElementIterator *iter = en_us->createCollationElementIterator(test1); + UErrorCode status = U_ZERO_ERROR; + // testing boundaries + iter->setOffset(0, status); + if (U_FAILURE(status) || iter->previous(status) != UCOL_NULLORDER) { + errln("Error: After setting offset to 0, we should be at the end " + "of the backwards iteration"); + } + iter->setOffset(test1.length(), status); + if (U_FAILURE(status) || iter->next(status) != UCOL_NULLORDER) { + errln("Error: After setting offset to end of the string, we should " + "be at the end of the backwards iteration"); + } // Run all the way through the iterator, then get the offset int32_t orderLength = 0; @@ -190,7 +202,6 @@ void CollationIteratorTest::TestOffset(/* char* par */) // Now set the offset back to the beginning and see if it works CollationElementIterator *pristine = en_us->createCollationElementIterator(test1); - UErrorCode status = U_ZERO_ERROR; iter->setOffset(0, status); diff --git a/icuSources/test/intltest/itformat.cpp b/icuSources/test/intltest/itformat.cpp index 8e7cabee..c7233002 100644 --- a/icuSources/test/intltest/itformat.cpp +++ b/icuSources/test/intltest/itformat.cpp @@ -39,7 +39,9 @@ #include "pptest.h" // ParsePositionTest #include "calregts.h" // CalendarRegressionTest #include "tzregts.h" // TimeZoneRegressionTest +#include "astrotst.h" // AstroTest #include "incaltst.h" // IntlCalendarTest +#include "calcasts.h" // CalendarCaseTest #define TESTCLASS(id, TestClass) \ case id: \ @@ -97,20 +99,9 @@ void IntlTestFormat::runIndexedTest( int32_t index, UBool exec, const char* &nam TESTCLASS(24,CalendarRegressionTest); TESTCLASS(25,TimeZoneRegressionTest); TESTCLASS(26,IntlCalendarTest); + TESTCLASS(27,AstroTest); + TESTCLASS(28,CalendarCaseTest); - //TESTCLASS(0,IntlTestDateFormatSymbolsC); - //TESTCLASS(0,IntlTestDecimalFormatSymbolsC); - //TESTCLASS(0,IntlTestSimpleDateFormatAPIC); - //TESTCLASS(0,IntlTestDateFormatAPIC); - //TESTCLASS(0,IntlTestDecimalFormatAPIC); - //TESTCLASS(0,IntlTestNumberFormatAPIC); - //TESTCLASS(0,CNumberSpelloutFormatTest); - //TESTCLASS(0,CNumberSpelloutFormatRoundTripTest); - //TESTCLASS(0,TestCwrapperFormatSmallClasses); - //TESTCLASS(0,TestCwrapperMessageFormat); - //TESTCLASS(0,TestCwrapperChoiceFormat); - //TESTCLASS(0,TestCwrapperCalendar); - //TESTCLASS(0,TestCwrapperTimeZone); default: name = ""; break; //needed to end loop } if (exec) { diff --git a/icuSources/test/intltest/itmajor.cpp b/icuSources/test/intltest/itmajor.cpp index 2873de91..bcb74d14 100644 --- a/icuSources/test/intltest/itmajor.cpp +++ b/icuSources/test/intltest/itmajor.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1998-2003, International Business Machines Corporation and + * Copyright (c) 1998-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -20,10 +20,10 @@ #include "itutil.h" #include "tscoll.h" #include "itformat.h" -//%#include "itconv.h" #include "ittrans.h" #include "itrbbi.h" #include "itrbnf.h" +#include "itrbnfp.h" #include "itrbnfrt.h" #include "normconf.h" #include "regextst.h" @@ -31,6 +31,8 @@ #include "canittst.h" #include "icusvtst.h" #include "testidna.h" +#include "convtest.h" + #define CASE_SUITE(id, suite) case id: \ name = #suite; \ if(exec) { \ @@ -147,8 +149,30 @@ void MajorTestLevel::runIndexedTest( int32_t index, UBool exec, const char* &nam } #endif break; + case 11: name = "convert"; +#if !UCONFIG_NO_LEGACY_CONVERSION + if (exec) { + logln("TestSuite Conversion---"); logln(); + ConversionTest test; + callTest( test, par ); + } +#endif + break; + + case 12: name = "rbnfp"; +#if !UCONFIG_NO_FORMATTING + if (exec) { + logln("TestSuite RuleBasedNumberParse ----"); logln(); + IntlTestRBNFParse test; + callTest(test, par); + } +#endif + break; + default: name = ""; break; } + + } void IntlTestNormalize::runIndexedTest( int32_t index, UBool exec, const char* &name, char* par ) diff --git a/icuSources/test/intltest/itrbnf.cpp b/icuSources/test/intltest/itrbnf.cpp index ead78763..b9dd923b 100644 --- a/icuSources/test/intltest/itrbnf.cpp +++ b/icuSources/test/intltest/itrbnf.cpp @@ -1,6 +1,6 @@ /* ******************************************************************************* - * Copyright (C) 1996-2003, International Business Machines Corporation and * + * Copyright (C) 1996-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* */ @@ -17,6 +17,8 @@ #include "unicode/coleitr.h" #include "unicode/ures.h" #include "unicode/ustring.h" +#include "unicode/decimfmt.h" +#include "unicode/udata.h" //#include "llong.h" #include @@ -43,25 +45,27 @@ void IntlTestRBNF::runIndexedTest(int32_t index, UBool exec, const char* &name, if (exec) logln("TestSuite RuleBasedNumberFormat"); switch (index) { #if U_HAVE_RBNF - TESTCASE(0, TestEnglishSpellout); - TESTCASE(1, TestOrdinalAbbreviations); - TESTCASE(2, TestDurations); - TESTCASE(3, TestSpanishSpellout); - TESTCASE(4, TestFrenchSpellout); - TESTCASE(5, TestSwissFrenchSpellout); - TESTCASE(6, TestItalianSpellout); - TESTCASE(7, TestGermanSpellout); - TESTCASE(8, TestThaiSpellout); - TESTCASE(9, TestAPI); - TESTCASE(10, TestFractionalRuleSet); - TESTCASE(11, TestSwedishSpellout); - TESTCASE(12, TestBelgianFrenchSpellout); + TESTCASE(0, TestEnglishSpellout); + TESTCASE(1, TestOrdinalAbbreviations); + TESTCASE(2, TestDurations); + TESTCASE(3, TestSpanishSpellout); + TESTCASE(4, TestFrenchSpellout); + TESTCASE(5, TestSwissFrenchSpellout); + TESTCASE(6, TestItalianSpellout); + TESTCASE(7, TestGermanSpellout); + TESTCASE(8, TestThaiSpellout); + TESTCASE(9, TestAPI); + TESTCASE(10, TestFractionalRuleSet); + TESTCASE(11, TestSwedishSpellout); + TESTCASE(12, TestBelgianFrenchSpellout); + TESTCASE(13, TestSmallValues); + TESTCASE(14, TestLocalizations); #else - TESTCASE(0, TestRBNFDisabled); + TESTCASE(0, TestRBNFDisabled); #endif default: - name = ""; - break; + name = ""; + break; } } @@ -104,7 +108,7 @@ IntlTestRBNF::TestAPI() { // test rule constructor { logln("Testing rule constructor"); - UResourceBundle *en = ures_open(NULL, "en", &status); + UResourceBundle *en = ures_open(U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "rbnf", "en", &status); if(U_FAILURE(status)) { errln("Unable to access resource bundle with data!"); } else { @@ -1174,33 +1178,33 @@ IntlTestRBNF::TestFrenchSpellout() } static const char* swissFrenchTestData[][2] = { - { "1", "un" }, - { "15", "quinze" }, - { "20", "vingt" }, - { "21", "vingt-et-un" }, - { "23", "vingt-trois" }, - { "62", "soixante-deux" }, - { "70", "septante" }, - { "71", "septante-et-un" }, - { "73", "septante-trois" }, - { "80", "huitante" }, - { "88", "huitante-huit" }, - { "100", "cent" }, - { "106", "cent six" }, - { "127", "cent vingt-sept" }, - { "200", "deux cents" }, - { "579", "cinq cents septante-neuf" }, - { "1,000", "mille" }, - { "1,123", "onze cents vingt-trois" }, - { "1,594", "mille cinq cents nonante-quatre" }, - { "2,000", "deux mille" }, - { "3,004", "trois mille quatre" }, - { "4,567", "quatre mille cinq cents soixante-sept" }, - { "15,943", "quinze mille neuf cents quarante-trois" }, - { "2,345,678", "deux million trois cents quarante-cinq mille six cents septante-huit" }, - { "-36", "moins trente-six" }, - { "234.567", "deux cents trente-quatre virgule cinq six sept" }, - { NULL, NULL} + { "1", "un" }, + { "15", "quinze" }, + { "20", "vingt" }, + { "21", "vingt-et-un" }, + { "23", "vingt-trois" }, + { "62", "soixante-deux" }, + { "70", "septante" }, + { "71", "septante-et-un" }, + { "73", "septante-trois" }, + { "80", "huitante" }, + { "88", "huitante-huit" }, + { "100", "cent" }, + { "106", "cent six" }, + { "127", "cent vingt-sept" }, + { "200", "deux cents" }, + { "579", "cinq cents septante-neuf" }, + { "1,000", "mille" }, + { "1,123", "onze cents vingt-trois" }, + { "1,594", "mille cinq cents nonante-quatre" }, + { "2,000", "deux mille" }, + { "3,004", "trois mille quatre" }, + { "4,567", "quatre mille cinq cents soixante-sept" }, + { "15,943", "quinze mille neuf cents quarante-trois" }, + { "2,345,678", "deux million trois cents quarante-cinq mille six cents septante-huit" }, + { "-36", "moins trente-six" }, + { "234.567", "deux cents trente-quatre virgule cinq six sept" }, + { NULL, NULL} }; void @@ -1226,10 +1230,10 @@ IntlTestRBNF::TestBelgianFrenchSpellout() = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale("fr", "BE", ""), status); if (U_FAILURE(status)) { - fprintf(stderr, "rbnf status: %d (%x)\n", status, status); + errln("rbnf status: 0x%x (%s)\n", status, u_errorName(status)); errln("FAIL: could not construct formatter"); } else { - // Belgian french should match Swiss french. + // Belgian french should match Swiss french. doTest(formatter, swissFrenchTestData, TRUE); } delete formatter; @@ -1422,6 +1426,186 @@ IntlTestRBNF::TestSwedishSpellout() delete formatter; } +void +IntlTestRBNF::TestSmallValues() +{ + UErrorCode status = U_ZERO_ERROR; + RuleBasedNumberFormat* formatter + = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale("en_US"), status); + + if (U_FAILURE(status)) { + errln("FAIL: could not construct formatter"); + } else { + static const char* testDataDefault[][2] = { + { "0.001", "zero point zero zero one" }, + { "0.0001", "zero point zero zero zero one" }, + { "0.00001", "zero point zero zero zero zero one" }, + { "0.000001", "zero point zero zero zero zero zero one" }, + { "0.0000001", "zero point zero zero zero zero zero zero one" }, + { "0.00000001", "zero point zero zero zero zero zero zero zero one" }, + { "0.000000001", "zero point zero zero zero zero zero zero zero zero one" }, + { "0.0000000001", "zero point zero zero zero zero zero zero zero zero zero one" }, + { "0.00000000001", "zero point zero zero zero zero zero zero zero zero zero zero one" }, + { "0.000000000001", "zero point zero zero zero zero zero zero zero zero zero zero zero one" }, + { "0.0000000000001", "zero point zero zero zero zero zero zero zero zero zero zero zero zero one" }, + { "0.00000000000001", "zero point zero zero zero zero zero zero zero zero zero zero zero zero zero one" }, + { "0.000000000000001", "zero point zero zero zero zero zero zero zero zero zero zero zero zero zero zero one" }, + { "10,000,000.001", "ten million point zero zero one" }, + { "10,000,000.0001", "ten million point zero zero zero one" }, + { "10,000,000.00001", "ten million point zero zero zero zero one" }, + { "10,000,000.000001", "ten million point zero zero zero zero zero one" }, + { "10,000,000.0000001", "ten million point zero zero zero zero zero zero one" }, +// { "10,000,000.00000001", "ten million point zero zero zero zero zero zero zero one" }, +// { "10,000,000.000000002", "ten million point zero zero zero zero zero zero zero zero two" }, + { "10,000,000", "ten million" }, +// { "1,234,567,890.0987654", "one billion, two hundred and thirty-four million, five hundred and sixty-seven thousand, eight hundred and ninety point zero nine eight seven six five four" }, +// { "123,456,789.9876543", "one hundred and twenty-three million, four hundred and fifty-six thousand, seven hundred and eighty-nine point nine eight seven six five four three" }, +// { "12,345,678.87654321", "twelve million, three hundred and forty-five thousand, six hundred and seventy-eight point eight seven six five four three two one" }, + { "1,234,567.7654321", "one million, two hundred and thirty-four thousand, five hundred and sixty-seven point seven six five four three two one" }, + { "123,456.654321", "one hundred and twenty-three thousand, four hundred and fifty-six point six five four three two one" }, + { "12,345.54321", "twelve thousand three hundred and forty-five point five four three two one" }, + { "1,234.4321", "one thousand two hundred and thirty-four point four three two one" }, + { "123.321", "one hundred and twenty-three point three two one" }, + { "0.0000000011754944", "zero point zero zero zero zero zero zero zero zero one one seven five four nine four four" }, + { "0.000001175494351", "zero point zero zero zero zero zero one one seven five four nine four three five one" }, + { NULL, NULL } + }; + + doTest(formatter, testDataDefault, TRUE); + + delete formatter; + } +} + +void +IntlTestRBNF::TestLocalizations(void) +{ + int i; + UnicodeString rules("%main:0:no;1:some;100:a lot;1000:tons;\n" + "%other:0:nada;1:yah, some;100:plenty;1000:more'n you'll ever need"); + + UErrorCode status = U_ZERO_ERROR; + UParseError perror; + RuleBasedNumberFormat formatter(rules, perror, status); + if (U_FAILURE(status)) { + errln("FAIL: could not construct formatter"); + } else { + { + static const char* testData[][2] = { + { "0", "nada" }, + { "5", "yah, some" }, + { "423", "plenty" }, + { "12345", "more'n you'll ever need" }, + { NULL, NULL } + }; + doTest(&formatter, testData, FALSE); + } + + { + UnicodeString loc("<<%main, %other>,,,>"); + static const char* testData[][2] = { + { "0", "no" }, + { "5", "some" }, + { "423", "a lot" }, + { "12345", "tons" }, + { NULL, NULL } + }; + RuleBasedNumberFormat formatter0(rules, loc, perror, status); + if (U_FAILURE(status)) { + errln("failed to build second formatter"); + } else { + doTest(&formatter0, testData, FALSE); + + { + // exercise localization info + Locale locale0("en__VALLEY@turkey=gobblegobble"); + Locale locale1("de_DE_FOO"); + Locale locale2("ja_JP"); + logln(formatter0.getRuleSetDisplayName(0, locale0)); + logln(formatter0.getRuleSetDisplayName(0, locale1)); + logln(formatter0.getRuleSetDisplayName(0, locale2)); + // TODO: check against intended result + } + + for (i = 0; i < formatter0.getNumberOfRuleSetDisplayNameLocales(); ++i) { + Locale locale = formatter0.getRuleSetDisplayNameLocale(i, status); + if (U_SUCCESS(status)) { + for (int j = 0; j < formatter0.getNumberOfRuleSetNames(); ++j) { + UnicodeString name = formatter0.getRuleSetName(j); + UnicodeString lname = formatter0.getRuleSetDisplayName(j, locale); + UnicodeString msg = locale.getName(); + msg.append(": "); + msg.append(name); + msg.append(" = "); + msg.append(lname); + logln(msg); + } + } + } + } + } + + { + static const char* goodLocs[] = { + "", // zero-length ok, same as providing no localization data + "<<>>", // no public rule sets ok + "<<%main>>", // no localizations ok + "<<%main,>,>", // comma before close angle ok + "<<%main>,\" '>>", // quotes everything until next quote + "<<%main>,<'en', \"it's ok\">>", // double quotes work too + " \n <\n <\n %main\n >\n , \t <\t en\t , \tfoo \t\t > \n\n > \n ", // rule whitespace ok + }; + int32_t goodLocsLen = sizeof(goodLocs)/sizeof(goodLocs[0]); + + static const char* badLocs[] = { + " ", // non-zero length + "<>", // empty array + "<", // unclosed outer array + "<<", // unclosed inner array + "<<,>>", // unexpected comma + "<<''>>", // empty string + " x<<%main>>", // first non space char not open angle bracket + "<%main>", // missing inner array + "<<%main %other>>", // elements missing separating commma (spaces must be quoted) + "<<%main>>", // arrays missing separating comma + "<<%main>,>", // too many elements in locale data + "<<%main>,>", // too few elements in locale data + "<<<%main>>>", // unexpected open angle + "<<%main<>>>", // unexpected open angle + "<<%main, %other>,>", // implicit empty strings + "<<%main>,>", // empty string + "<<%main>, < en, '>>", // unterminated quote + "<<%main>, < en, \"<>>", // unterminated quote + "<<%main\">>", // quote in string + "<<%main'>>", // quote in string + "<<%main<>>", // open angle in string + "<<%main>> x", // extra non-space text at end + + }; + int32_t badLocsLen = sizeof(badLocs)/sizeof(badLocs[0]); + + for (i = 0; i < goodLocsLen; ++i) { + logln("[%d] '%s'", i, goodLocs[i]); + UErrorCode status = U_ZERO_ERROR; + UnicodeString loc(goodLocs[i]); + RuleBasedNumberFormat fmt(rules, loc, perror, status); + if (U_FAILURE(status)) { + errln("Failed parse of good localization string: '%s'", goodLocs[i]); + } + } + + for (i = 0; i < badLocsLen; ++i) { + logln("[%d] '%s'", i, badLocs[i]); + UErrorCode status = U_ZERO_ERROR; + UnicodeString loc(badLocs[i]); + RuleBasedNumberFormat fmt(rules, loc, perror, status); + if (U_SUCCESS(status)) { + errln("Successful parse of bad localization string: '%s'", badLocs[i]); + } + } + } + } +} void IntlTestRBNF::doTest(RuleBasedNumberFormat* formatter, const char* testData[][2], UBool testParsing) @@ -1429,7 +1613,8 @@ IntlTestRBNF::doTest(RuleBasedNumberFormat* formatter, const char* testData[][2] // man, error reporting would be easier with printf-style syntax for unicode string and formattable UErrorCode status = U_ZERO_ERROR; - NumberFormat* decFmt = NumberFormat::createInstance(Locale::getUS(), status); + // NumberFormat* decFmt = NumberFormat::createInstance(Locale::getUS(), status); + NumberFormat* decFmt = new DecimalFormat("#,###.################", status); if (U_FAILURE(status)) { errln("FAIL: could not create NumberFormat"); } else { @@ -1437,6 +1622,7 @@ IntlTestRBNF::doTest(RuleBasedNumberFormat* formatter, const char* testData[][2] const char* numString = testData[i][0]; const char* expectedWords = testData[i][1]; + log("[%i] %s = ", i, numString); Formattable expectedNumber; decFmt->parse(numString, expectedNumber, status); if (U_FAILURE(status)) { @@ -1462,28 +1648,29 @@ IntlTestRBNF::doTest(RuleBasedNumberFormat* formatter, const char* testData[][2] msg.append(actualString); errln(msg); break; - } else if (testParsing) { - Formattable parsedNumber; - formatter->parse(actualString, parsedNumber, status); - if (U_FAILURE(status)) { - UnicodeString msg = "FAIL: formatter could not parse "; - msg.append(actualString); - msg.append(" status code: " ); - char buffer[32]; - sprintf(buffer, "0x%x", status); - msg.append(buffer); - errln(msg); - break; - } else { - if (parsedNumber != expectedNumber) { - UnicodeString msg = "FAIL: parse failed for "; + } else { + logln(actualString); + if (testParsing) { + Formattable parsedNumber; + formatter->parse(actualString, parsedNumber, status); + if (U_FAILURE(status)) { + UnicodeString msg = "FAIL: formatter could not parse "; msg.append(actualString); - msg.append(", expected "); - decFmt->format(expectedNumber, msg, status); - msg.append(", but got "); - decFmt->format(parsedNumber, msg, status); + msg.append(" status code: " ); + msg.append(u_errorName(status)); errln(msg); break; + } else { + if (parsedNumber != expectedNumber) { + UnicodeString msg = "FAIL: parse failed for "; + msg.append(actualString); + msg.append(", expected "); + decFmt->format(expectedNumber, msg, status); + msg.append(", but got "); + decFmt->format(parsedNumber, msg, status); + errln(msg); + break; + } } } } diff --git a/icuSources/test/intltest/itrbnf.h b/icuSources/test/intltest/itrbnf.h index e00c08e4..db4e118f 100644 --- a/icuSources/test/intltest/itrbnf.h +++ b/icuSources/test/intltest/itrbnf.h @@ -1,6 +1,6 @@ /* ******************************************************************************* - * Copyright (C) 1996-2003, International Business Machines Corporation and * + * Copyright (C) 1996-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* */ @@ -97,6 +97,16 @@ class IntlTestRBNF : public IntlTest { */ virtual void TestSwedishSpellout(); + /** + * Perform a simple spot check on small values + */ + virtual void TestSmallValues(); + + /** + * Test localizations using string data. + */ + virtual void TestLocalizations(); + protected: virtual void doTest(RuleBasedNumberFormat* formatter, const char* testData[][2], UBool testParsing); virtual void doLenientParseTest(RuleBasedNumberFormat* formatter, const char* testData[][2]); diff --git a/icuSources/test/intltest/itrbnfp.cpp b/icuSources/test/intltest/itrbnfp.cpp new file mode 100644 index 00000000..90764787 --- /dev/null +++ b/icuSources/test/intltest/itrbnfp.cpp @@ -0,0 +1,183 @@ +/* + ******************************************************************************* + * Copyright (C) 2004, International Business Machines Corporation and * + * others. All Rights Reserved. * + ******************************************************************************* + */ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "itrbnfp.h" + +#include "unicode/umachine.h" + +#include "unicode/tblcoll.h" +#include "unicode/coleitr.h" +#include "unicode/ures.h" +#include "unicode/ustring.h" +#include "unicode/decimfmt.h" + +#include + +// current macro not in icu1.8.1 +#define TESTCASE(id,test) \ + case id: \ + name = #test; \ + if (exec) { \ + logln(#test "---"); \ + logln((UnicodeString)""); \ + test(); \ + } \ + break + +void IntlTestRBNFParse::runIndexedTest(int32_t index, UBool exec, const char* &name, char* /*par*/) +{ + if (exec) logln("TestSuite RuleBasedNumberFormatParse"); + switch (index) { +#if U_HAVE_RBNF + TESTCASE(0, TestParse); +#else + TESTCASE(0, TestRBNFParseDisabled); +#endif + default: + name = ""; + break; + } +} + +#if U_HAVE_RBNF + +void +IntlTestRBNFParse::TestParse() { + // Try various rule parsing errors. Shouldn't crash. + + logln("RBNF Parse test starting"); + + // these rules make no sense but behave rationally + const char* okrules[] = { + "", + "random text", + "%foo:bar", + "%foo: bar", + "0:", + "0::", + ";", + ";;", + "%%foo:;", + ":", + "::", + ":1", + ":;", + ":;:;", + "-", + "-1", + "-:", + ".", + ".1", + "[", + "]", + "[]", + "[foo]", + "[[]", + "[]]", + "[[]]", + "[][]", + "<", + "<<", + "<<<", + "10:;9:;", + ">", + ">>", + ">>>", + "=", + "==", + "===", + "=foo=", + + NULL, + }; + + // these rules would throw exceptions when formatting, if we could throw exceptions + const char* exceptrules[] = { + "10:", // formatting any value with a one's digit will fail + "11: << x", // formating a multiple of 10 causes rollback rule to fail + "%%foo: 0 foo; 10: =%%bar=; %%bar: 0: bar; 10: =%%foo=;", + + NULL, + }; + + // none of these rules should crash the formatter + const char** allrules[] = { + okrules, + exceptrules, + NULL, + }; + + for (int j = 0; allrules[j]; ++j) { + const char** rules = allrules[j]; + for (int i = 0; rules[i]; ++i) { + const char* rule = rules[i]; + logln("rule[%d] \"%s\"", i, rule); + UErrorCode status = U_ZERO_ERROR; + UParseError perr; + RuleBasedNumberFormat* formatter = new RuleBasedNumberFormat(rule, Locale::getUS(), perr, status); + + if (U_SUCCESS(status)) { + // format some values + + testfmt(formatter, 20, status); + testfmt(formatter, 1.23, status); + testfmt(formatter, -123, status); + testfmt(formatter, .123, status); + testfmt(formatter, 123, status); + + } else if (status == U_PARSE_ERROR) { + logln("perror line: %x offset: %x context: %s|%s", perr.line, perr.offset, perr.preContext, perr.postContext); + } + + delete formatter; + } + } +} + +void +IntlTestRBNFParse::testfmt(RuleBasedNumberFormat* formatter, double val, UErrorCode& status) { + UnicodeString us; + formatter->format((const Formattable)val, us, status); + if (U_SUCCESS(status)) { + us.insert(0, (UChar)'"'); + us.append((UChar)'"'); + logln(us); + } else { + logln("error: could not format %g, returned status: %d", val, status); + } +} + +void +IntlTestRBNFParse::testfmt(RuleBasedNumberFormat* formatter, int val, UErrorCode& status) { + UnicodeString us; + formatter->format((const Formattable)(int32_t)val, us, status); + if (U_SUCCESS(status)) { + us.insert(0, (UChar)'"'); + us.append((UChar)'"'); + logln(us); + } else { + logln("error: could not format %d, returned status: %d", val, status); + } +} + + +/* U_HAVE_RBNF */ +#else + +void +IntlTestRBNF::TestRBNFParseDisabled() { + errln("*** RBNF currently disabled on this platform ***\n"); +} + +/* U_HAVE_RBNF */ +#endif + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/test/intltest/itrbnfp.h b/icuSources/test/intltest/itrbnfp.h new file mode 100644 index 00000000..c767ff19 --- /dev/null +++ b/icuSources/test/intltest/itrbnfp.h @@ -0,0 +1,48 @@ +/* + ******************************************************************************* + * Copyright (C) 2004, International Business Machines Corporation and * + * others. All Rights Reserved. * + ******************************************************************************* + */ + +#ifndef ITRBNFP_H +#define ITRBNFP_H + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "intltest.h" +#include "unicode/rbnf.h" + + +class IntlTestRBNFParse : public IntlTest { + public: + + // IntlTest override + virtual void runIndexedTest(int32_t index, UBool exec, const char* &name, char* par); + +#if U_HAVE_RBNF + /** + * Perform an API test + */ + virtual void TestParse(); + + void testfmt(RuleBasedNumberFormat* formatter, double val, UErrorCode& status); + void testfmt(RuleBasedNumberFormat* formatter, int val, UErrorCode& status); + + protected: + +/* U_HAVE_RBNF */ +#else + + virtual void TestRBNFParseDisabled(); + +/* U_HAVE_RBNF */ +#endif +}; + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +// endif ITRBNFP_H +#endif diff --git a/icuSources/test/intltest/itrbnfrt.cpp b/icuSources/test/intltest/itrbnfrt.cpp index 6604f0f5..ddc5e77b 100644 --- a/icuSources/test/intltest/itrbnfrt.cpp +++ b/icuSources/test/intltest/itrbnfrt.cpp @@ -1,6 +1,6 @@ /* ******************************************************************************* - * Copyright (C) 1996-2000, International Business Machines Corporation and * + * Copyright (C) 1996-2003, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* */ @@ -12,7 +12,8 @@ #include "itrbnfrt.h" #include "unicode/fmtable.h" -#include "math.h" // fabs +#include // fabs +#include // current macro not in icu1.8.1 #define TESTCASE(id,test) \ diff --git a/icuSources/test/intltest/ittrans.cpp b/icuSources/test/intltest/ittrans.cpp index dc8170c1..9cba29eb 100644 --- a/icuSources/test/intltest/ittrans.cpp +++ b/icuSources/test/intltest/ittrans.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * -* Copyright (C) 2000-2002, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. * ************************************************************************ @@ -20,9 +20,6 @@ #include "transtst.h" #include "transapi.h" #include "cpdtrtst.h" -#include "unhxtrts.h" -#include "hxuntrts.h" -#include "ufltlgts.h" #include "transrt.h" #include "usettest.h" #include "jamotest.h" @@ -45,14 +42,14 @@ void IntlTestTransliterator::runIndexedTest( int32_t index, UBool exec, const ch CASE(0, TransliteratorTest); CASE(1, TransliteratorAPITest); CASE(2, CompoundTransliteratorTest); - CASE(3, UniToHexTransliteratorTest); - CASE(4, HexToUniTransliteratorTest); - CASE(5, UnicodeFilterLogicTest); - CASE(6, TransliteratorRoundTripTest); - CASE(7, UnicodeSetTest); - CASE(8, JamoTest); - CASE(9, TransliteratorErrorTest); - CASE(10, ReplaceableTest); + CASE(3, TransliteratorRoundTripTest); + CASE(4, UnicodeSetTest); + CASE(5, JamoTest); + CASE(6, TransliteratorErrorTest); + CASE(7, ReplaceableTest); +#if !UCONFIG_NO_TRANSLITERATION && defined(U_USE_UNICODE_FILTER_LOGIC_OBSOLETE_2_8) + CASE(10, UnicodeFilterLogicTest); +#endif default: name=""; break; } diff --git a/icuSources/test/intltest/itutil.cpp b/icuSources/test/intltest/itutil.cpp index 84683827..2a5d6bd8 100644 --- a/icuSources/test/intltest/itutil.cpp +++ b/icuSources/test/intltest/itutil.cpp @@ -18,10 +18,10 @@ #include "ucdtest.h" #include "restest.h" #include "restsnew.h" -#include "tsmutex.h" #include "tsmthred.h" #include "tsputil.h" #include "uobjtest.h" +#include "v32test.h" //#include "custrtest.h" //#include "ccitrtst.h" //#include "cloctest.h" @@ -33,15 +33,6 @@ void IntlTestUtilities::runIndexedTest( int32_t index, UBool exec, const char* & if (exec) logln("TestSuite Utilities: "); switch (index) { case 0: - name = "MutexTest"; - if (exec) { - logln("MutexTest---"); logln(""); - MutexTest test; - callTest( test, par ); - } - break; - - case 1: name = "MultithreadTest"; if (exec) { logln("MultithreadTest---"); logln(""); @@ -50,7 +41,7 @@ void IntlTestUtilities::runIndexedTest( int32_t index, UBool exec, const char* & } break; - case 2: + case 1: name = "StringTest"; if (exec) { logln("StringTest---"); logln(""); @@ -59,7 +50,7 @@ void IntlTestUtilities::runIndexedTest( int32_t index, UBool exec, const char* & } break; - case 3: + case 2: name = "UnicodeStringTest"; if (exec) { logln("UnicodeStringTest---"); logln(""); @@ -68,7 +59,7 @@ void IntlTestUtilities::runIndexedTest( int32_t index, UBool exec, const char* & } break; - case 4: + case 3: name = "LocaleTest"; if (exec) { logln("LocaleTest---"); logln(""); @@ -77,7 +68,7 @@ void IntlTestUtilities::runIndexedTest( int32_t index, UBool exec, const char* & } break; - case 5: + case 4: name = "CharIterTest"; if (exec) { logln("CharIterTest---"); logln(""); @@ -86,7 +77,7 @@ void IntlTestUtilities::runIndexedTest( int32_t index, UBool exec, const char* & } break; - case 6: + case 5: name = "UnicodeTest"; if (exec) { logln("UnicodeTest---"); logln(""); @@ -95,7 +86,7 @@ void IntlTestUtilities::runIndexedTest( int32_t index, UBool exec, const char* & } break; - case 7: + case 6: name = "ResourceBundleTest"; if (exec) { logln("ResourceBundleTest---"); logln(""); @@ -103,7 +94,7 @@ void IntlTestUtilities::runIndexedTest( int32_t index, UBool exec, const char* & callTest( test, par ); } break; - case 8: + case 7: name = "NewResourceBundleTest"; if (exec) { logln("NewResourceBundleTest---"); logln(""); @@ -112,7 +103,7 @@ void IntlTestUtilities::runIndexedTest( int32_t index, UBool exec, const char* & } break; - case 9: + case 8: name = "PUtilTest"; if (exec) { logln("PUtilTest---"); logln(""); @@ -121,14 +112,23 @@ void IntlTestUtilities::runIndexedTest( int32_t index, UBool exec, const char* & } break; - case 10: - name = "UObjectTest"; - if(exec) { - logln ("UObjectTest---"); logln(""); - UObjectTest test; - callTest( test, par ); - } - break;; + case 9: + name = "UObjectTest"; + if(exec) { + logln ("UObjectTest---"); logln(""); + UObjectTest test; + callTest( test, par ); + } + break;; + + case 10: + name = "UVector32Test"; + if(exec) { + logln ("UVector32Test---"); logln(""); + UVector32Test test; + callTest( test, par ); + } + break;; /* case 8: @@ -139,44 +139,6 @@ void IntlTestUtilities::runIndexedTest( int32_t index, UBool exec, const char* & callTest( test, par ); } break; - - - case 9: - name = "UnicodeStringCAPI"; - if (exec) { - logln("UnicodeString C Round Trip test---"); logln(""); - CUnicodeStringTest test; - callTest(test, par); - } - break; - - case 10: - name = "CharacterIteratorCAPI"; - if (exec) { - logln("CharacterIterator C Round Trip test---"); logln(""); - CCharIterTest test; - callTest(test, par); - } - break; - - - case 11: - name = "UnicodeCAPI"; - if (exec) { - logln("Unicode C-API test---"); logln(); - TestCwrapperUnicode test; - callTest(test, par); - } - break; - - case 12: - name = "ResourceBundleCAPI"; - if (exec) { - logln("ResourceBundle C-API test---"); logln(); - TestCwrapperResourceBundle test; - callTest(test, par); - } - break; */ default: name = ""; break; //needed to end loop } diff --git a/icuSources/test/intltest/loctest.cpp b/icuSources/test/intltest/loctest.cpp index 9735f786..3f9e1f16 100644 --- a/icuSources/test/intltest/loctest.cpp +++ b/icuSources/test/intltest/loctest.cpp @@ -1,85 +1,122 @@ /******************************************************************** - * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * COPYRIGHT: + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ #include "loctest.h" #include -#include -#include - #include "unicode/decimfmt.h" -//#include "unicode/datefmt.h" +#include "unicode/ucurr.h" #include "unicode/smpdtfmt.h" +#include "unicode/dtfmtsym.h" +#include "unicode/brkiter.h" +#include "unicode/coll.h" +#include "cstring.h" +#include "uassert.h" -const char* rawData[27][7] = { +const char* rawData[33][8] = { // language code - { "en", "fr", "hr", "el", "no", "it", "xx" }, + { "en", "fr", "ca", "el", "no", "it", "xx", "zh" }, + // script code + { "", "", "", "", "", "", "", "Hans" }, // country code - { "US", "FR", "HR", "GR", "NO", "", "YY" }, + { "US", "FR", "ES", "GR", "NO", "", "YY", "CN" }, // variant code - { "", "", "", "", "NY", "", "" }, + { "", "", "", "", "NY", "", "", "" }, // full name - { "en_US", "fr_FR", "hr_HR", "el_GR", "no_NO_NY", "it", "xx_YY" }, + { "en_US", "fr_FR", "ca_ES", "el_GR", "no_NO_NY", "it", "xx_YY", "zh_Hans_CN" }, // ISO-3 language - { "eng", "fra", "hrv", "ell", "nor", "ita", "" }, + { "eng", "fra", "cat", "ell", "nor", "ita", "", "zho" }, // ISO-3 country - { "USA", "FRA", "HRV", "GRC", "NOR", "", "" }, - // LCID (not currently public) - { "409", "40c", "41a", "408", "814", "", "" }, + { "USA", "FRA", "ESP", "GRC", "NOR", "", "", "CHN" }, + // LCID + { "409", "40c", "403", "408", "814", "10", "0", "804" }, // display langage (English) - { "English", "French", "Croatian", "Greek", "Norwegian", "Italian", "xx" }, + { "English", "French", "Catalan", "Greek", "Norwegian", "Italian", "xx", "Chinese" }, + // display script (English) + { "", "", "", "", "", "", "", "Simplified Han" }, // display country (English) - { "United States", "France", "Croatia", "Greece", "Norway", "", "YY" }, + { "United States", "France", "Spain", "Greece", "Norway", "", "YY", "China" }, // display variant (English) - { "", "", "", "", "Nynorsk", "", ""}, - //{ "", "", "", "", "NY", "", ""}, + { "", "", "", "", "NY", "", "", ""}, // display name (English) // Updated no_NO_NY English display name for new pattern-based algorithm // (part of Euro support). - { "English (United States)", "French (France)", "Croatian (Croatia)", "Greek (Greece)", "Norwegian (Norway, Nynorsk)", "Italian", "xx (YY)" }, - //{ "English (United States)", "French (France)", "Croatian (Croatia)", "Greek (Greece)", "Norwegian (Norway,NY)", "Italian", "xx (YY)" }, + { "English (United States)", "French (France)", "Catalan (Spain)", "Greek (Greece)", "Norwegian (Norway, NY)", "Italian", "xx (YY)", "Chinese (Simplified Han, China)" }, // display langage (French) - { "anglais", "fran\\u00E7ais", "croate", "grec", "norv\\u00E9gien", "italien", "xx" }, + { "anglais", "fran\\u00E7ais", "catalan", "grec", "norv\\u00E9gien", "italien", "xx", "chinois" }, + // display script (French) + { "", "", "", "", "", "", "", "han simplifi\\u00E9" }, // display country (French) - { "\\u00C9tats-Unis", "France", "Croatie", "Gr\\u00E8ce", "Norv\\u00E8ge", "", "YY" }, + { "\\u00C9tats-Unis", "France", "Espagne", "Gr\\u00E8ce", "Norv\\u00E8ge", "", "YY", "Chine" }, // display variant (French) - { "", "", "", "", "Nynorsk", "", "" }, + { "", "", "", "", "NY", "", "", "" }, // display name (French) - //{ "anglais (États-Unis)", "français (France)", "croate (Croatie)", "grec (Grèce)", "norvégien (Norvège,Nynorsk)", "italien", "xx (YY)" }, - { "anglais (\\u00C9tats-Unis)", "fran\\u00E7ais (France)", "croate (Croatie)", "grec (Gr\\u00E8ce)", "norv\\u00E9gien (Norv\\u00E8ge, Nynorsk)", "italien", "xx (YY)" }, // STILL not right - - // display langage (Croatian) - { "", "", "hrvatski", "", "", "", "xx" }, - // display country (Croatian) - { "", "", "Hrvatska", "", "", "", "YY" }, - // display variant (Croatian) - { "", "", "", "", "", "", ""}, - // display name (Croatian) - { "", "", "hrvatski (Hrvatska)", "", "", "", "xx (YY)" }, + //{ "anglais (Etats-Unis)", "francais (France)", "catalan (Espagne)", "grec (Grece)", "norvegien (Norvege,Nynorsk)", "italien", "xx (YY)" }, + { "anglais (\\u00C9tats-Unis)", "fran\\u00E7ais (France)", "catalan (Espagne)", "grec (Gr\\u00E8ce)", "norv\\u00E9gien (Norv\\u00E8ge, NY)", "italien", "xx (YY)", "chinois (han simplifi\\u00E9, Chine)" }, // STILL not right + + + /* display language (Catalan) */ + { "angl\\u00E8s", "franc\\u00E8s", "catal\\u00E0", "grec", "noruec", "itali\\u00E0", "", "xin\\u00E9s" }, + /* display script (Catalan) */ + { "", "", "", "", "", "", "", "Hans" }, + /* display country (Catalan) */ + { "Estats Units", "Fran\\u00E7a", "Espanya", "Gr\\u00E8cia", "Noruega", "", "", "Xina" }, + /* display variant (Catalan) */ + { "", "", "", "", "NY", "", "" }, + /* display name (Catalan) */ + { "angl\\u00E8s (Estats Units)", "franc\\u00E8s (Fran\\u00E7a)", "catal\\u00E0 (Espanya)", "grec (Gr\\u00E8cia)", "noruec (Noruega, NY)", "itali\\u00E0", "", "xin\\u00E9s (Hans, Xina)" }, // display langage (Greek)[actual values listed below] - { "\\u0391\\u03b3\\u03b3\\u03bb\\u03b9\\u03ba\\u03ac", "\\u0393\\u03b1\\u03bb\\u03bb\\u03b9\\u03ba\\u03ac", "\\u039a\\u03c1\\u03bf\\u03b1\\u03c4\\u03b9\\u03ba\\u03ac", "", "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03b9\\u03ba\\u03ac", "", "" }, + { "\\u0391\\u03b3\\u03b3\\u03bb\\u03b9\\u03ba\\u03ac", + "\\u0393\\u03b1\\u03bb\\u03bb\\u03b9\\u03ba\\u03ac", + "\\u039a\\u03b1\\u03c4\\u03b1\\u03bb\\u03b1\\u03bd\\u03b9\\u03ba\\u03ac", + "\\u0395\\u03bb\\u03bb\\u03b7\\u03bd\\u03b9\\u03ba\\u03ac", + "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03b9\\u03ba\\u03ac", + "\\u0399\\u03c4\\u03b1\\u03bb\\u03b9\\u03ba\\u03ac", + "", + "\\u039A\\u03B9\\u03BD\\u03B5\\u03B6\\u03B9\\u03BA\\u03AC" + }, + // display script (Greek) + { "", "", "", "", "", "", "", "Hans" }, // display country (Greek)[actual values listed below] - { "\\u0397\\u03bd\\u03c9\\u03bc\\u03ad\\u03bd\\u03b5\\u03c2 \\u03a0\\u03bf\\u03bb\\u03b9\\u03c4\\u03b5\\u03af\\u03b5\\u03c2 \\u0391\\u03bc\\u03b5\\u03c1\\u03b9\\u03ba\\u03ae\\u03c2", "\\u0393\\u03b1\\u03bb\\u03bb\\u03af\\u03b1", "\\u039a\\u03c1\\u03bf\\u03b1\\u03c4\\u03af\\u03b1", "", "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03af\\u03b1", "", "" }, + { "\\u0397\\u03BD\\u03C9\\u03BC\\u03AD\\u03BD\\u03B5\\u03C2 \\u03A0\\u03BF\\u03BB\\u03B9\\u03C4\\u03B5\\u03AF\\u03B5\\u03C2", + "\\u0393\\u03b1\\u03bb\\u03bb\\u03af\\u03b1", + "\\u0399\\u03c3\\u03c0\\u03b1\\u03bd\\u03af\\u03b1", + "\\u0395\\u03bb\\u03bb\\u03ac\\u03b4\\u03b1", + "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03af\\u03b1", + "", + "", + "\\u039A\\u03AF\\u03BD\\u03B1" + }, // display variant (Greek) - { "", "", "", "", "", "", "" }, + { "", "", "", "", "NY", "", "" }, // display name (Greek)[actual values listed below] - { "\\u0391\\u03b3\\u03b3\\u03bb\\u03b9\\u03ba\\u03ac (\\u0397\\u03bd\\u03c9\\u03bc\\u03ad\\u03bd\\u03b5\\u03c2 \\u03a0\\u03bf\\u03bb\\u03b9\\u03c4\\u03b5\\u03af\\u03b5\\u03c2 \\u0391\\u03bc\\u03b5\\u03c1\\u03b9\\u03ba\\u03ae\\u03c2)", "\\u0393\\u03b1\\u03bb\\u03bb\\u03b9\\u03ba\\u03ac (\\u0393\\u03b1\\u03bb\\u03bb\\u03af\\u03b1)", "\\u039a\\u03c1\\u03bf\\u03b1\\u03c4\\u03b9\\u03ba\\u03ac (\\u039a\\u03c1\\u03bf\\u03b1\\u03c4\\u03af\\u03b1)", "", "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03b9\\u03ba\\u03ac (\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03af\\u03b1, Nynorsk)", "", "" }, + { "\\u0391\\u03b3\\u03b3\\u03bb\\u03b9\\u03ba\\u03ac (\\u0397\\u03BD\\u03C9\\u03BC\\u03AD\\u03BD\\u03B5\\u03C2 \\u03A0\\u03BF\\u03BB\\u03B9\\u03C4\\u03B5\\u03AF\\u03B5\\u03C2)", + "\\u0393\\u03b1\\u03bb\\u03bb\\u03b9\\u03ba\\u03ac (\\u0393\\u03b1\\u03bb\\u03bb\\u03af\\u03b1)", + "\\u039a\\u03b1\\u03c4\\u03b1\\u03bb\\u03b1\\u03bd\\u03b9\\u03ba\\u03ac (\\u0399\\u03c3\\u03c0\\u03b1\\u03bd\\u03af\\u03b1)", + "\\u0395\\u03bb\\u03bb\\u03b7\\u03bd\\u03b9\\u03ba\\u03ac (\\u0395\\u03bb\\u03bb\\u03ac\\u03b4\\u03b1)", + "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03b9\\u03ba\\u03ac (\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03af\\u03b1, NY)", + "\\u0399\\u03c4\\u03b1\\u03bb\\u03b9\\u03ba\\u03ac", + "", + "\\u039A\\u03B9\\u03BD\\u03B5\\u03B6\\u03B9\\u03BA\\u03AC (Hans, \\u039A\\u03AF\\u03BD\\u03B1)" + }, // display langage () - { "English", "French", "Croatian", "Greek", "Norwegian", "Italian", "xx" }, + { "English", "French", "Catalan", "Greek", "Norwegian", "Italian", "xx", "" }, + // display script () + { "", "", "", "", "", "", "", ""}, // display country () - { "United States", "France", "Croatia", "Greece", "Norway", "", "YY" }, + { "United States", "France", "Spain", "Greece", "Norway", "", "YY", "" }, // display variant () - { "", "", "", "", "Nynorsk", "", ""}, + { "", "", "", "", "Nynorsk", "", "", ""}, // display name () - //{ "English (United States)", "French (France)", "Croatian (Croatia)", "Greek (Greece)", "Norwegian (Norway,Nynorsk)", "Italian", "xx (YY)" }, - { "English (United States)", "French (France)", "Croatian (Croatia)", "Greek (Greece)", "Norwegian (Norway,NY)", "Italian", "xx (YY)" } + //{ "English (United States)", "French (France)", "Catalan (Spain)", "Greek (Greece)", "Norwegian (Norway,Nynorsk)", "Italian", "xx (YY)" }, + { "English (United States)", "French (France)", "Catalan (Spain)", "Greek (Greece)", "Norwegian (Norway,NY)", "Italian", "xx (YY)", "" } }; // * test macros @@ -93,7 +130,7 @@ const char* rawData[27][7] = { Example: test_compare(i=3,i,3, someNumberFormatter(i)); - test_compare(0,1+1,2,someNumberFormatter(1+1)); + test_compare(0,1+1,2,someNumberFormatter(1+1)); Note that in the second example the expression is 0, because the fcn produces it's own result. @@ -144,7 +181,7 @@ LocaleTest::LocaleTest() LocaleTest::~LocaleTest() { if (dataTable != 0) { - for (int32_t i = 0; i < 27; i++) { + for (int32_t i = 0; i < 33; i++) { delete []dataTable[i]; } delete []dataTable; @@ -152,48 +189,51 @@ LocaleTest::~LocaleTest() } } -#define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); logln((UnicodeString)""); test(); } break; - void LocaleTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) { - if (exec) logln("TestSuite LocaleTest: "); switch (index) { - case 0: name = "TestBasicGetters"; if (exec) TestBasicGetters(); break; - case 1: name = "TestSimpleResourceInfo"; if (exec) TestSimpleResourceInfo(); break; - case 2: name = "TestDisplayNames"; if (exec) TestDisplayNames(); break; - case 3: name = "TestSimpleObjectStuff"; if (exec) TestSimpleObjectStuff(); break; - case 4: name = "TestPOSIXParsing"; if (exec) TestPOSIXParsing(); break; - case 5: name = "TestGetAvailableLocales"; if (exec) TestGetAvailableLocales(); break; - case 6: name = "TestDataDirectory"; if (exec) TestDataDirectory(); break; - - CASE(7, TestISO3Fallback) - CASE(8, TestGetLangsAndCountries) - CASE(9, TestSimpleDisplayNames) - CASE(10, TestUninstalledISO3Names) - CASE(11, TestAtypicalLocales) + TESTCASE(0, TestBasicGetters); + TESTCASE(1, TestSimpleResourceInfo); + TESTCASE(2, TestDisplayNames); + TESTCASE(3, TestSimpleObjectStuff); + TESTCASE(4, TestPOSIXParsing); + TESTCASE(5, TestGetAvailableLocales); + TESTCASE(6, TestDataDirectory); + TESTCASE(7, TestISO3Fallback); + TESTCASE(8, TestGetLangsAndCountries); + TESTCASE(9, TestSimpleDisplayNames); + TESTCASE(10, TestUninstalledISO3Names); + TESTCASE(11, TestAtypicalLocales); #if !UCONFIG_NO_FORMATTING - CASE(12, TestThaiCurrencyFormat) - CASE(13, TestEuroSupport) + TESTCASE(12, TestThaiCurrencyFormat); + TESTCASE(13, TestEuroSupport); #endif - CASE(14, TestToString) + TESTCASE(14, TestToString); #if !UCONFIG_NO_FORMATTING - CASE(15, Test4139940) - CASE(16, Test4143951) + TESTCASE(15, Test4139940); + TESTCASE(16, Test4143951); #endif - CASE(17, Test4147315) - CASE(18, Test4147317) - CASE(19, Test4147552) - CASE(20, TestVariantParsing) + TESTCASE(17, Test4147315); + TESTCASE(18, Test4147317); + TESTCASE(19, Test4147552); + TESTCASE(20, TestVariantParsing); #if !UCONFIG_NO_FORMATTING - CASE(21, Test4105828) + TESTCASE(21, Test4105828); #endif - CASE(22, TestSetIsBogus) - CASE(23, TestParallelAPIValues) + TESTCASE(22, TestSetIsBogus); + TESTCASE(23, TestParallelAPIValues); + TESTCASE(24, TestKeywordVariants); + TESTCASE(25, TestKeywordVariantParsing); + TESTCASE(26, TestGetBaseName); + TESTCASE(27, TestGetLocale); + TESTCASE(28, TestVariantWithOutCountry); + TESTCASE(29, TestCanonicalization); + // keep the last index in sync with the condition in default: default: - if(index <= 23) { // keep this in sync with the last index! - name = "switched off"; // UCONFIG_NO_FORMATTING + if (index <= 28) { // keep this in sync with the last index! + name = "(test omitted by !UCONFIG_NO_FORMATTING)"; } else { name = ""; } @@ -206,12 +246,21 @@ void LocaleTest::TestBasicGetters() { int32_t i; for (i = 0; i <= MAX_LOCALES; i++) { - Locale testLocale(rawData[LANG][i], rawData[CTRY][i], rawData[VAR][i]); + Locale testLocale(""); + if (rawData[SCRIPT][i] && rawData[SCRIPT][i][0] != 0) { + testLocale = Locale(rawData[LANG][i], rawData[SCRIPT][i], rawData[CTRY][i], rawData[VAR][i]); + } + else { + testLocale = Locale(rawData[LANG][i], rawData[CTRY][i], rawData[VAR][i]); + } logln("Testing " + (UnicodeString)testLocale.getName() + "..."); if ( (temp=testLocale.getLanguage()) != (dataTable[LANG][i])) errln(" Language code mismatch: " + temp + " versus " + dataTable[LANG][i]); + if ( (temp=testLocale.getScript()) != (dataTable[SCRIPT][i])) + errln(" Script code mismatch: " + temp + " versus " + + dataTable[SCRIPT][i]); if ( (temp=testLocale.getCountry()) != (dataTable[CTRY][i])) errln(" Country code mismatch: " + temp + " versus " + dataTable[CTRY][i]); @@ -225,36 +274,52 @@ void LocaleTest::TestBasicGetters() { logln("Same thing without variant codes..."); for (i = 0; i <= MAX_LOCALES; i++) { - Locale testLocale(rawData[LANG][i], rawData[CTRY][i]); + Locale testLocale(""); + if (rawData[SCRIPT][i] && rawData[SCRIPT][i][0] != 0) { + testLocale = Locale(rawData[LANG][i], rawData[SCRIPT][i], rawData[CTRY][i]); + } + else { + testLocale = Locale(rawData[LANG][i], rawData[CTRY][i]); + } logln("Testing " + (temp=testLocale.getName()) + "..."); if ( (temp=testLocale.getLanguage()) != (dataTable[LANG][i])) - errln(" Language code mismatch: " + temp + " versus " + errln("Language code mismatch: " + temp + " versus " + dataTable[LANG][i]); + if ( (temp=testLocale.getScript()) != (dataTable[SCRIPT][i])) + errln("Script code mismatch: " + temp + " versus " + + dataTable[SCRIPT][i]); if ( (temp=testLocale.getCountry()) != (dataTable[CTRY][i])) - errln(" Country code mismatch: " + temp + " versus " + errln("Country code mismatch: " + temp + " versus " + dataTable[CTRY][i]); if (testLocale.getVariant()[0] != 0) - errln(" Variant code mismatch: something versus \"\""); + errln("Variant code mismatch: something versus \"\""); } logln("Testing long language names and getters"); - Locale test8 = Locale::createFromName("x-klingon-zx.utf32be@special"); + Locale test8 = Locale::createFromName("x-klingon-latn-zx.utf32be@special"); temp = test8.getLanguage(); if (temp != UnicodeString("x-klingon") ) - errln(" Language code mismatch: " + temp + " versus \"x-klingon\""); + errln("Language code mismatch: " + temp + " versus \"x-klingon\""); + + temp = test8.getScript(); + if (temp != UnicodeString("Latn") ) + errln("Script code mismatch: " + temp + " versus \"Latn\""); temp = test8.getCountry(); if (temp != UnicodeString("ZX") ) - errln(" Country code mismatch: " + temp + " versus \"ZX\""); + errln("Country code mismatch: " + temp + " versus \"ZX\""); temp = test8.getVariant(); - if (temp != UnicodeString("SPECIAL") ) - errln(" Variant code mismatch: " + temp + " versus \"SPECIAL\""); + //if (temp != UnicodeString("SPECIAL") ) + // errln("Variant code mismatch: " + temp + " versus \"SPECIAL\""); + // As of 3.0, the "@special" will *not* be parsed by uloc_getName() + if (temp != UnicodeString("") ) + errln("Variant code mismatch: " + temp + " versus \"\""); if (Locale::getDefault() != Locale::createFromName(NULL)) - errln("Locale::getDefault() == Locale::createFromName(NULL)"); + errln("Locale::getDefault() == Locale::createFromName(NULL)"); /*----------*/ // NOTE: There used to be a special test for locale names that had language or @@ -276,6 +341,13 @@ void LocaleTest::TestBasicGetters() { ) { errln("assignment to bogus Locale does not unbogus it or sets bad data"); } + + Locale a("eo_DE@currency=DEM"); + Locale *pb=a.clone(); + if(pb==&a || *pb!=a) { + errln("Locale.clone() failed"); + } + delete pb; } void LocaleTest::TestParallelAPIValues() { @@ -349,40 +421,40 @@ void LocaleTest::TestParallelAPIValues() { void LocaleTest::TestSimpleResourceInfo() { - UnicodeString temp; - char temp2[20]; - UErrorCode err = U_ZERO_ERROR; - int32_t i = 0; - - for (i = 0; i <= MAX_LOCALES; i++) { - Locale testLocale(rawData[LANG][i], rawData[CTRY][i], rawData[VAR][i]); - logln("Testing " + (temp=testLocale.getName()) + "..."); - - if ( (temp=testLocale.getISO3Language()) != (dataTable[LANG3][i])) - errln(" ISO-3 language code mismatch: " + temp - + " versus " + dataTable[LANG3][i]); - if ( (temp=testLocale.getISO3Country()) != (dataTable[CTRY3][i])) - errln(" ISO-3 country code mismatch: " + temp - + " versus " + dataTable[CTRY3][i]); - - sprintf(temp2, "%x", testLocale.getLCID()); - if (UnicodeString(temp2) != dataTable[LCID][i]) - errln((UnicodeString)" LCID mismatch: " + temp2 + " versus " - + dataTable[LCID][i]); - - if(U_FAILURE(err)) - { - errln((UnicodeString)"Some error on number " + i + u_errorName(err)); - } - err = U_ZERO_ERROR; - } + UnicodeString temp; + char temp2[20]; + UErrorCode err = U_ZERO_ERROR; + int32_t i = 0; + + for (i = 0; i <= MAX_LOCALES; i++) { + Locale testLocale(rawData[LANG][i], rawData[CTRY][i], rawData[VAR][i]); + logln("Testing " + (temp=testLocale.getName()) + "..."); + + if ( (temp=testLocale.getISO3Language()) != (dataTable[LANG3][i])) + errln(" ISO-3 language code mismatch: " + temp + + " versus " + dataTable[LANG3][i]); + if ( (temp=testLocale.getISO3Country()) != (dataTable[CTRY3][i])) + errln(" ISO-3 country code mismatch: " + temp + + " versus " + dataTable[CTRY3][i]); + + sprintf(temp2, "%x", (int)testLocale.getLCID()); + if (UnicodeString(temp2) != dataTable[LCID][i]) + errln((UnicodeString)" LCID mismatch: " + temp2 + " versus " + + dataTable[LCID][i]); - Locale locale("en"); - if(strcmp(locale.getName(), "en") != 0|| - strcmp(locale.getLanguage(), "en") != 0) { - errln("construction of Locale(en) failed\n"); - } - /*-----*/ + if(U_FAILURE(err)) + { + errln((UnicodeString)"Some error on number " + i + u_errorName(err)); + } + err = U_ZERO_ERROR; + } + + Locale locale("en"); + if(strcmp(locale.getName(), "en") != 0|| + strcmp(locale.getLanguage(), "en") != 0) { + errln("construction of Locale(en) failed\n"); + } + /*-----*/ } @@ -392,20 +464,20 @@ void LocaleTest::TestSimpleResourceInfo() { * The lookup of display names must not fall back through the default * locale because that yields useless results. */ -void -LocaleTest::TestDisplayNames() +void +LocaleTest::TestDisplayNames() { Locale english("en", "US"); Locale french("fr", "FR"); - Locale croatian("hr", "HR"); + Locale croatian("ca", "ES"); Locale greek("el", "GR"); logln(" In locale = en_US..."); doTestDisplayNames(english, DLANG_EN); logln(" In locale = fr_FR..."); doTestDisplayNames(french, DLANG_FR); - logln(" In locale = hr_HR..."); - doTestDisplayNames(croatian, DLANG_HR); + logln(" In locale = ca_ES..."); + doTestDisplayNames(croatian, DLANG_CA); logln(" In locale = el_GR..."); doTestDisplayNames(greek, DLANG_EL); @@ -457,10 +529,10 @@ void LocaleTest::TestSimpleObjectStuff() { Locale test2("aa", "AA"); Locale test3(test1); Locale test4("zz", "ZZ"); - Locale test5("aa", "AA", ""); - Locale test6("aa", "AA", "ANTARES"); + Locale test5("aa", "AA", ""); + Locale test6("aa", "AA", "ANTARES"); Locale test7("aa", "AA", "JUPITER"); - Locale test8 = Locale::createFromName("aa-aa.utf8@jupiter"); + Locale test8 = Locale::createFromName("aa-aa-jupiTER"); // was "aa-aa.utf8@jupiter" but in 3.0 getName won't normalize that // now list them all for debugging usage. test_dumpLocale(test1); @@ -530,7 +602,7 @@ void LocaleTest::TestSimpleObjectStuff() { test_assert(!(test3 != test4)); test_assert(test1 == test4); test_assert(test4 == test1); - + // test assignments with a variant logln("test7 = test6"); test7 = test6; @@ -575,7 +647,7 @@ void LocaleTest::TestPOSIXParsing() POSIXLocale test4("ab_AB_Antares"); POSIXLocale test5(UnicodeString("ab_AB_Antares")); - Locale test6("ab", "AB", "Antares"); + Locale test6("ab", "AB", "Antares"); test_dumpLocale(test1); test_dumpLocale(test2); @@ -653,7 +725,7 @@ void LocaleTest::TestDataDirectory() logln("second fetch of language retrieved " + testValue); if (testValue != "xxx") errln("setDataDirectory() failed: expected \"xxx\", got \"" + testValue + "\""); - + Locale::setDataDirectory(oldDirectory); test.getISO3Language(testValue); logln("third fetch of language retrieved " + testValue); @@ -666,22 +738,31 @@ void LocaleTest::TestDataDirectory() void LocaleTest::doTestDisplayNames(Locale& displayLocale, int32_t compareIndex) { UnicodeString temp; - + for (int32_t i = 0; i <= MAX_LOCALES; i++) { - Locale testLocale(rawData[LANG][i], rawData[CTRY][i], rawData[VAR][i]); + Locale testLocale(""); + if (rawData[SCRIPT][i] && rawData[SCRIPT][i][0] != 0) { + testLocale = Locale(rawData[LANG][i], rawData[SCRIPT][i], rawData[CTRY][i], rawData[VAR][i]); + } + else { + testLocale = Locale(rawData[LANG][i], rawData[CTRY][i], rawData[VAR][i]); + } logln(" Testing " + (temp=testLocale.getName()) + "..."); UnicodeString testLang; + UnicodeString testScript; UnicodeString testCtry; UnicodeString testVar; UnicodeString testName; testLocale.getDisplayLanguage(displayLocale, testLang); + testLocale.getDisplayScript(displayLocale, testScript); testLocale.getDisplayCountry(displayLocale, testCtry); testLocale.getDisplayVariant(displayLocale, testVar); testLocale.getDisplayName(displayLocale, testName); UnicodeString expectedLang; + UnicodeString expectedScript; UnicodeString expectedCtry; UnicodeString expectedVar; UnicodeString expectedName; @@ -690,26 +771,32 @@ void LocaleTest::doTestDisplayNames(Locale& displayLocale, int32_t compareIndex) if (expectedLang.length() == 0) expectedLang = dataTable[DLANG_EN][i]; - expectedCtry = dataTable[compareIndex + 1][i]; + expectedScript = dataTable[compareIndex + 1][i]; + if (expectedScript.length() == 0) + expectedScript = dataTable[DSCRIPT_EN][i]; + + expectedCtry = dataTable[compareIndex + 2][i]; if (expectedCtry.length() == 0) expectedCtry = dataTable[DCTRY_EN][i]; - expectedVar = dataTable[compareIndex + 2][i]; + expectedVar = dataTable[compareIndex + 3][i]; if (expectedVar.length() == 0) expectedVar = dataTable[DVAR_EN][i]; - expectedName = dataTable[compareIndex + 3][i]; + expectedName = dataTable[compareIndex + 4][i]; if (expectedName.length() == 0) expectedName = dataTable[DNAME_EN][i]; if (testLang != expectedLang) - errln("Display language (" + UnicodeString(displayLocale.getName()) + ") got " + testLang + " expected " + expectedLang); + errln("Display language (" + UnicodeString(displayLocale.getName()) + ") of (" + UnicodeString(testLocale.getName()) + ") got " + testLang + " expected " + expectedLang); + if (testScript != expectedScript) + errln("Display script (" + UnicodeString(displayLocale.getName()) + ") of (" + UnicodeString(testLocale.getName()) + ") got " + testScript + " expected " + expectedScript); if (testCtry != expectedCtry) - errln("Display country (" + UnicodeString(displayLocale.getName()) + ") got " + testCtry + " expected " + expectedCtry); + errln("Display country (" + UnicodeString(displayLocale.getName()) + ") of (" + UnicodeString(testLocale.getName()) + ") got " + testCtry + " expected " + expectedCtry); if (testVar != expectedVar) - errln("Display variant (" + UnicodeString(displayLocale.getName()) + ") got " + testVar + " expected " + expectedVar); + errln("Display variant (" + UnicodeString(displayLocale.getName()) + ") of (" + UnicodeString(testLocale.getName()) + ") got " + testVar + " expected " + expectedVar); if (testName != expectedName) - errln("Display name (" + UnicodeString(displayLocale.getName()) + ") got " + testName + " expected " + expectedName); + errln("Display name (" + UnicodeString(displayLocale.getName()) + ") of (" + UnicodeString(testLocale.getName()) + ") got " + testName + " expected " + expectedName); } } @@ -718,25 +805,18 @@ void LocaleTest::doTestDisplayNames(Locale& displayLocale, int32_t compareIndex) //--------------------------------------------------- -UChar greekDisplayLanguage[] = { 0x03b5, 0x03bb, 0x03bb, 0x03b7, 0x03bd, 0x03b9, 0x03ba, 0x03ac, 0 }; -UChar greekDisplayCountry[] = { 0x0395, 0x03bb, 0x03bb, 0x03ac, 0x03b4, 0x03b1, 0 }; -UChar greekDisplayName[] = { 0x03b5, 0x03bb, 0x03bb, 0x03b7, 0x03bd, 0x03b9, 0x03ba, - 0x03ac, 0x20, 0x28, 0x0395, 0x03bb, 0x03bb, 0x03ac, 0x03b4, 0x03b1, 0x29, 0 }; - + void LocaleTest::setUpDataTable() { if (dataTable == 0) { - dataTable = new UnicodeString*[27]; + dataTable = new UnicodeString*[33]; - for (int32_t i = 0; i < 27; i++) { - dataTable[i] = new UnicodeString[7]; - for (int32_t j = 0; j < 7; j++) { + for (int32_t i = 0; i < 33; i++) { + dataTable[i] = new UnicodeString[8]; + for (int32_t j = 0; j < 8; j++) { dataTable[i][j] = CharsToUnicodeString(rawData[i][j]); } } - dataTable[DLANG_EL][GREEK] = greekDisplayLanguage; - dataTable[DCTRY_EL][GREEK] = greekDisplayCountry; - dataTable[DNAME_EL][GREEK] = greekDisplayName; } } @@ -746,8 +826,8 @@ void LocaleTest::setUpDataTable() /** * @bug 4011756 4011380 */ -void -LocaleTest::TestISO3Fallback() +void +LocaleTest::TestISO3Fallback() { Locale test("xx", "YY"); @@ -755,7 +835,7 @@ LocaleTest::TestISO3Fallback() result = test.getISO3Language(); - // Conform to C API usage + // Conform to C API usage if (!result || (result[0] != 0)) errln("getISO3Language() on xx_YY returned " + UnicodeString(result) + " instead of \"\""); @@ -769,8 +849,8 @@ LocaleTest::TestISO3Fallback() /** * @bug 4106155 4118587 */ -void -LocaleTest::TestGetLangsAndCountries() +void +LocaleTest::TestGetLangsAndCountries() { // It didn't seem right to just do an exhaustive test of everything here, so I check // for the following things: @@ -782,17 +862,18 @@ LocaleTest::TestGetLangsAndCountries() // 4) Is each list in sorted order? int32_t testCount = 0; const char * const * test = Locale::getISOLanguages(); - const char spotCheck1[ ][4] = { "en", "es", "fr", "de", "it", - "ja", "ko", "zh", "th", "he", + const char spotCheck1[ ][4] = { "en", "es", "fr", "de", "it", + "ja", "ko", "zh", "th", "he", "id", "iu", "ug", "yi", "za" }; int32_t i; - + for(testCount = 0;test[testCount];testCount++) ; - if (testCount != 450) - errln("Expected getISOLanguages() to return 450 languages; it returned %d", testCount); + /* TODO: Change this test to be more like the cloctst version? */ + if (testCount != 468) + errln("Expected getISOLanguages() to return 468 languages; it returned %d", testCount); else { for (i = 0; i < 15; i++) { int32_t j; @@ -815,8 +896,8 @@ LocaleTest::TestGetLangsAndCountries() } test = Locale::getISOCountries(); - UnicodeString spotCheck2 [] = { "US", "CA", "GB", "FR", "DE", - "IT", "JP", "KR", "CN", "TW", + UnicodeString spotCheck2 [] = { "US", "CA", "GB", "FR", "DE", + "IT", "JP", "KR", "CN", "TW", "TH" }; int32_t spot2Len = 11; for(testCount=0;test[testCount];testCount++) @@ -854,15 +935,15 @@ LocaleTest::TestGetLangsAndCountries() /** * @bug 4118587 */ -void -LocaleTest::TestSimpleDisplayNames() +void +LocaleTest::TestSimpleDisplayNames() { // This test is different from TestDisplayNames because TestDisplayNames checks // fallback behavior, combination of language and country names to form locale // names, and other stuff like that. This test just checks specific language // and country codes to make sure we have the correct names for them. char languageCodes[] [4] = { "he", "id", "iu", "ug", "yi", "za" }; - UnicodeString languageNames [] = { "Hebrew", "Indonesian", "Inukitut", "Uighur", "Yiddish", + UnicodeString languageNames [] = { "Hebrew", "Indonesian", "Inuktitut", "Uighur", "Yiddish", "Zhuang" }; for (int32_t i = 0; i < 6; i++) { @@ -878,14 +959,14 @@ LocaleTest::TestSimpleDisplayNames() /** * @bug 4118595 */ -void -LocaleTest::TestUninstalledISO3Names() +void +LocaleTest::TestUninstalledISO3Names() { // This test checks to make sure getISO3Language and getISO3Country work right // even for locales that are not installed. - const char iso2Languages [][4] = { "am", "ba", "fy", "mr", "rn", + const char iso2Languages [][4] = { "am", "ba", "fy", "mr", "rn", "ss", "tw", "zu" }; - const char iso3Languages [][5] = { "amh", "bak", "fry", "mar", "run", + const char iso3Languages [][5] = { "amh", "bak", "fry", "mar", "run", "ssw", "twi", "zul" }; int32_t i; @@ -901,9 +982,9 @@ LocaleTest::TestUninstalledISO3Names() iso3Languages[i] + "\", got \"" + test + "\"." + UnicodeString(u_errorName(err))); } - char iso2Countries [][4] = { "AF", "BW", "KZ", "MO", "MN", + char iso2Countries [][4] = { "AF", "BW", "KZ", "MO", "MN", "SB", "TC", "ZW" }; - char iso3Countries [][4] = { "AFG", "BWA", "KAZ", "MAC", "MNG", + char iso3Countries [][4] = { "AFG", "BWA", "KAZ", "MAC", "MNG", "SLB", "TCA", "ZWE" }; for (i = 0; i < 8; i++) { @@ -922,8 +1003,8 @@ LocaleTest::TestUninstalledISO3Names() * big locale-data reorg of 10/28/97. The lookup logic for language and country * display names was also changed at that time in that check-in. --rtg 3/20/98 */ -void -LocaleTest::TestAtypicalLocales() +void +LocaleTest::TestAtypicalLocales() { Locale localesToTest [] = { Locale("de", "CA"), Locale("ja", "ZA"), @@ -951,7 +1032,7 @@ LocaleTest::TestAtypicalLocales() "espagnol (Allemagne)", "Croatie", CharsToUnicodeString("Su\\u00E8de"), - CharsToUnicodeString("R\\u00E9publique Dominicaine"), + CharsToUnicodeString("R\\u00E9publique dominicaine"), "Belgique" }; UnicodeString spanishDisplayNames [] = { CharsToUnicodeString("alem\\u00E1n (Canad\\u00E1)"), @@ -963,16 +1044,17 @@ LocaleTest::TestAtypicalLocales() "Suecia", CharsToUnicodeString("Rep\\u00FAblica Dominicana"), CharsToUnicodeString("B\\u00E9lgica") }; - UnicodeString arabicDisplayNames [] = { "German (Canada)", - "Japanese (South Africa)", - "Russian (Mexico)", - "English (France)", - "Spanish (Germany)", - "Croatia", - "Sweden", - "Dominican Republic", - "Belgium" }; - + // De-Anglicizing root required the change from + // English display names to ISO Codes - ram 2003/09/26 + UnicodeString bengaliDisplayNames [] = { "de (CA)", + "ja (ZA)", + "ru (MX)", + "en (FR)", + "es (DE)", + "HR", + "SE", + "DO", + "BE" }; int32_t i; UErrorCode status = U_ZERO_ERROR; @@ -1009,15 +1091,15 @@ LocaleTest::TestAtypicalLocales() for (i = 0; i < 9; i++) { UnicodeString name; - localesToTest[i].getDisplayName(Locale("ar", "ES"), name); - logln(name + " Locale fallback to ar, and data fallback to root"); - if (name != arabicDisplayNames[i]) - errln("Lookup in Arabic failed: expected \"" + arabicDisplayNames[i] + localesToTest[i].getDisplayName(Locale("be", "ES"), name); + logln(name + " Locale fallback to be, and data fallback to root"); + if (name != bengaliDisplayNames[i]) + errln("Lookup in Bengali failed: expected \"" + bengaliDisplayNames[i] + "\", got \"" + name + "\""); - localesToTest[i].getDisplayName(Locale("ar", "EG"), name); + localesToTest[i].getDisplayName(Locale("be", "EG"), name); logln(name + " Data fallback to root"); - if (name != arabicDisplayNames[i]) - errln("Lookup in Arabic failed: expected \"" + arabicDisplayNames[i] + if (name != bengaliDisplayNames[i]) + errln("Lookup in Bengali failed: expected \"" + bengaliDisplayNames[i] + "\", got \"" + name + "\""); } } @@ -1029,8 +1111,8 @@ LocaleTest::TestAtypicalLocales() * This would be better tested by the LocaleDataTest. Will move it when I * get the LocaleDataTest working again. */ -void -LocaleTest::TestThaiCurrencyFormat() +void +LocaleTest::TestThaiCurrencyFormat() { UErrorCode status = U_ZERO_ERROR; DecimalFormat *thaiCurrency = (DecimalFormat*)NumberFormat::createCurrencyInstance( @@ -1064,8 +1146,8 @@ LocaleTest::TestThaiCurrencyFormat() * test must be updated. * */ -void -LocaleTest::TestEuroSupport() +void +LocaleTest::TestEuroSupport() { UChar euro = 0x20ac; const UnicodeString EURO_CURRENCY(&euro, 1, 1); // Look for this UnicodeString in formatted Euro currency @@ -1077,6 +1159,8 @@ LocaleTest::TestEuroSupport() "el_GR", "en_BE", "en_IE", + "en_GB_EURO", + "en_US_EURO", "es_ES", "eu_ES", "fi_FI", @@ -1100,24 +1184,58 @@ LocaleTest::TestEuroSupport() for (;*locales!=NULL;locales++) { Locale loc (*locales); UnicodeString temp; - NumberFormat *nf = NumberFormat::createCurrencyInstance(loc, status); - UnicodeString pos; - nf->format(271828.182845, pos); - UnicodeString neg; - nf->format(-271828.182845, neg); - if (pos.indexOf(EURO_CURRENCY) >= 0 && - neg.indexOf(EURO_CURRENCY) >= 0) { - logln("Ok: " + (temp=loc.getName()) + - ": " + pos + " / " + neg); - } - else { - errln("Fail: " + (temp=loc.getName()) + - " formats without " + EURO_CURRENCY + - ": " + pos + " / " + neg + - "\n*** THIS FAILURE MAY ONLY MEAN THAT LOCALE DATA HAS CHANGED ***"); - } - - delete nf; + NumberFormat *nf = NumberFormat::createCurrencyInstance(loc, status); + UnicodeString pos; + nf->format(271828.182845, pos); + UnicodeString neg; + nf->format(-271828.182845, neg); + if (pos.indexOf(EURO_CURRENCY) >= 0 && + neg.indexOf(EURO_CURRENCY) >= 0) { + logln("Ok: " + (temp=loc.getName()) + + ": " + pos + " / " + neg); + } + else { + errln("Fail: " + (temp=loc.getName()) + + " formats without " + EURO_CURRENCY + + ": " + pos + " / " + neg + + "\n*** THIS FAILURE MAY ONLY MEAN THAT LOCALE DATA HAS CHANGED ***"); + } + + delete nf; + } + + UnicodeString dollarStr("USD", ""), euroStr("EUR", ""), genericStr((UChar)0x00a4), resultStr; + UChar tmp[4]; + status = U_ZERO_ERROR; + + ucurr_forLocale("en_US", tmp, 4, &status); + resultStr.setTo(tmp); + if (dollarStr != resultStr) { + errln("Fail: en_US didn't return USD"); + } + ucurr_forLocale("en_US_EURO", tmp, 4, &status); + resultStr.setTo(tmp); + if (euroStr != resultStr) { + errln("Fail: en_US_EURO didn't return EUR"); + } + ucurr_forLocale("en_GB_EURO", tmp, 4, &status); + resultStr.setTo(tmp); + if (euroStr != resultStr) { + errln("Fail: en_GB_EURO didn't return EUR"); + } + ucurr_forLocale("en_US_PREEURO", tmp, 4, &status); + resultStr.setTo(tmp); + if (dollarStr != resultStr) { + errln("Fail: en_US_PREEURO didn't fallback to en_US"); + } + ucurr_forLocale("en_US_Q", tmp, 4, &status); + resultStr.setTo(tmp); + if (dollarStr != resultStr) { + errln("Fail: en_US_Q didn't fallback to en_US"); + } + int32_t invalidLen = ucurr_forLocale("en_QQ", tmp, 4, &status); + if (invalidLen || U_SUCCESS(status)) { + errln("Fail: en_QQ didn't return NULL"); } } @@ -1127,7 +1245,7 @@ LocaleTest::TestEuroSupport() * @bug 4139504 * toString() doesn't work with language_VARIANT. */ -void +void LocaleTest::TestToString() { Locale DATA [] = { Locale("xx", "", ""), @@ -1148,7 +1266,7 @@ LocaleTest::TestToString() { "_YY_ZZ", "xx_YY_ZZ", }; - + for (int32_t i=0; i < 7; ++i) { const char *name; name = DATA[i].getName(); @@ -1169,8 +1287,8 @@ LocaleTest::TestToString() { * Couldn't reproduce this bug -- probably was fixed earlier. * * ORIGINAL BUG REPORT: - * -- basically, hungarian for monday shouldn't have an \u00f4 - * (o circumflex)in it instead it should be an o with 2 inclined + * -- basically, hungarian for monday shouldn't have an \u00f4 + * (o circumflex)in it instead it should be an o with 2 inclined * (right) lines over it.. * * You may wonder -- why do all this -- why not just add a line to @@ -1180,10 +1298,10 @@ LocaleTest::TestToString() { * is that something is wrong with the font mapping subsystem, but we can't * test that here. */ -void -LocaleTest::Test4139940() +void +LocaleTest::Test4139940() { - Locale mylocale("hu", "", ""); + Locale mylocale("hu", "", ""); UDate mydate = date(98,3,13); // A Monday UErrorCode status = U_ZERO_ERROR; SimpleDateFormat df_full("EEEE", mylocale, status); @@ -1194,8 +1312,11 @@ LocaleTest::Test4139940() // o double acute (\u0151) IS. UChar ocf = 0x00f4; UChar oda = 0x0151; - if (str.indexOf(oda) < 0 || str.indexOf(ocf) >= 0) - errln("Fail: Monday in Hungarian is wrong"); + if (str.indexOf(oda) < 0 || str.indexOf(ocf) >= 0) { + errln("Fail: Monday in Hungarian is wrong - oda's index is %d and ocf's is %d", + str.indexOf(oda), str.indexOf(ocf)); + logln(UnicodeString("String is: ") + str ); + } } UDate @@ -1203,14 +1324,14 @@ LocaleTest::date(int32_t y, int32_t m, int32_t d, int32_t hr, int32_t min, int32 { UErrorCode status = U_ZERO_ERROR; Calendar *cal = Calendar::createInstance(status); - if (cal == 0) + if (cal == 0) return 0.0; cal->clear(); cal->set(1900 + y, m, d, hr, min, sec); // Add 1900 to follow java.util.Date protocol UDate dt = cal->getTime(status); if (U_FAILURE(status)) return 0.0; - + delete cal; return dt; } @@ -1219,8 +1340,8 @@ LocaleTest::date(int32_t y, int32_t m, int32_t d, int32_t hr, int32_t min, int32 * @bug 4143951 * Russian first day of week should be Monday. Confirmed. */ -void -LocaleTest::Test4143951() +void +LocaleTest::Test4143951() { UErrorCode status = U_ZERO_ERROR; Calendar *cal = Calendar::createInstance(Locale("ru", "", ""), status); @@ -1239,19 +1360,19 @@ LocaleTest::Test4143951() * java.util.Locale.getISO3Country() works wrong for non ISO-3166 codes. * Should throw an exception for unknown locales */ -void -LocaleTest::Test4147315() +void +LocaleTest::Test4147315() { UnicodeString temp; // Try with codes that are the wrong length but happen to match text // at a valid offset in the mapping table Locale locale("aaa", "CCC"); - + const char *result = locale.getISO3Country(); // Change to conform to C api usage if((result==NULL)||(result[0] != 0)) - errln("ERROR: getISO3Country() returns: " + UnicodeString(result,"") + + errln("ERROR: getISO3Country() returns: " + UnicodeString(result,"") + " for locale '" + (temp=locale.getName()) + "' rather than exception" ); } @@ -1260,52 +1381,48 @@ LocaleTest::Test4147315() * java.util.Locale.getISO3Language() works wrong for non ISO-3166 codes. * Should throw an exception for unknown locales */ -void -LocaleTest::Test4147317() +void +LocaleTest::Test4147317() { UnicodeString temp; // Try with codes that are the wrong length but happen to match text // at a valid offset in the mapping table Locale locale("aaa", "CCC"); - + const char *result = locale.getISO3Language(); // Change to conform to C api usage if((result==NULL)||(result[0] != 0)) - errln("ERROR: getISO3Language() returns: " + UnicodeString(result,"") + + errln("ERROR: getISO3Language() returns: " + UnicodeString(result,"") + " for locale '" + (temp=locale.getName()) + "' rather than exception" ); } /* * @bug 4147552 */ -void -LocaleTest::Test4147552() +void +LocaleTest::Test4147552() { - Locale locales [] = { Locale("no", "NO"), + Locale locales [] = { Locale("no", "NO"), Locale("no", "NO", "B"), - Locale("no", "NO", "NY") + Locale("no", "NO", "NY") }; - - UnicodeString edn("Norwegian (Norway, Bokm"); - edn += (UChar32)0x00e5; - edn += "l)"; - UnicodeString englishDisplayNames [] = { + + UnicodeString edn("Norwegian (Norway, B)"); + UnicodeString englishDisplayNames [] = { "Norwegian (Norway)", edn, // "Norwegian (Norway,B)", - //"Norwegian (Norway,NY)" - "Norwegian (Norway, Nynorsk)" + //"Norwegian (Norway,NY)" + "Norwegian (Norway, NY)" }; - UnicodeString ndn("norsk (Norge, Bokm"); - ndn += (UChar32)0x00e5; - ndn += "l)"; - UnicodeString norwegianDisplayNames [] = { + UnicodeString ndn("norsk (Norge, B"); + UnicodeString norwegianDisplayNames [] = { "norsk (Norge)", - //"norsk (Norge,B)", - ndn, - //"norsk (Norge,NY)" - "norsk (Noreg, Nynorsk)" + "norsk (Norge, B)", + //ndn, + "norsk (Noreg, NY)" + //"Norsk (Noreg, Nynorsk)" }; for (int32_t i = 0; i < 3; ++i) { @@ -1328,9 +1445,9 @@ LocaleTest::TestVariantParsing() UnicodeString dispName("English (United States, DE ANZA_CUPERTINO_CALIFORNIA_UNITED STATES_EARTH)"); UnicodeString dispVar("DE ANZA_CUPERTINO_CALIFORNIA_UNITED STATES_EARTH"); - + UnicodeString got; - + en_US_custom.getDisplayVariant(Locale::getUS(), got); if(got != dispVar) { errln("FAIL: getDisplayVariant()"); @@ -1347,7 +1464,7 @@ LocaleTest::TestVariantParsing() Locale shortVariant("fr", "FR", "foo"); shortVariant.getDisplayVariant(got); - + if(got != "FOO") { errln("FAIL: getDisplayVariant()"); errln("Wanted: foo"); @@ -1356,7 +1473,7 @@ LocaleTest::TestVariantParsing() Locale bogusVariant("fr", "FR", "_foo"); bogusVariant.getDisplayVariant(got); - + if(got != "FOO") { errln("FAIL: getDisplayVariant()"); errln("Wanted: foo"); @@ -1365,7 +1482,7 @@ LocaleTest::TestVariantParsing() Locale bogusVariant2("fr", "FR", "foo_"); bogusVariant2.getDisplayVariant(got); - + if(got != "FOO") { errln("FAIL: getDisplayVariant()"); errln("Wanted: foo"); @@ -1374,7 +1491,7 @@ LocaleTest::TestVariantParsing() Locale bogusVariant3("fr", "FR", "_foo_"); bogusVariant3.getDisplayVariant(got); - + if(got != "FOO") { errln("FAIL: getDisplayVariant()"); errln("Wanted: foo"); @@ -1389,8 +1506,8 @@ LocaleTest::TestVariantParsing() * Currency symbol in zh is wrong. We will test this at the NumberFormat * end to test the whole pipe. */ -void -LocaleTest::Test4105828() +void +LocaleTest::Test4105828() { Locale LOC [] = { Locale::getChinese(), Locale("zh", "CN", ""), Locale("zh", "TW", ""), Locale("zh", "HK", "") }; @@ -1418,14 +1535,569 @@ LocaleTest::Test4105828() // Jitterbug 1735 void LocaleTest::TestSetIsBogus() { - Locale l("en_US"); - l.setToBogus(); - if(l.isBogus() != TRUE) { - errln("After setting bogus, didn't return TRUE"); - } - l = "en_US"; // This should reset bogus - if(l.isBogus() != FALSE) { - errln("After resetting bogus, didn't return FALSE"); - } + Locale l("en_US"); + l.setToBogus(); + if(l.isBogus() != TRUE) { + errln("After setting bogus, didn't return TRUE"); + } + l = "en_US"; // This should reset bogus + if(l.isBogus() != FALSE) { + errln("After resetting bogus, didn't return FALSE"); + } } + +void +LocaleTest::TestKeywordVariants(void) { + struct { + const char *localeID; + const char *expectedLocaleID; + //const char *expectedLocaleIDNoKeywords; + //const char *expectedCanonicalID; + const char *expectedKeywords[10]; + int32_t numKeywords; + UErrorCode expectedStatus; + } testCases[] = { + { + "de_DE@ currency = euro; C o ll A t i o n = Phonebook ; C alen dar = buddhist ", + "de_DE@calendar=buddhist;collation=Phonebook;currency=euro", + //"de_DE", + //"de_DE@calendar=buddhist;collation=Phonebook;currency=euro", + {"calendar", "collation", "currency"}, + 3, + U_ZERO_ERROR + }, + { + "de_DE@euro", + "de_DE@euro", + //"de_DE", + //"de_DE@currency=EUR", + {"","","","","","",""}, + 0, + U_INVALID_FORMAT_ERROR /* must have '=' after '@' */ + } + }; + UErrorCode status = U_ZERO_ERROR; + + int32_t i = 0, j = 0; + const char *result = NULL; + StringEnumeration *keywords; + int32_t keyCount = 0; + const char *keyword = NULL; + const UnicodeString *keywordString; + int32_t keywordLen = 0; + + for(i = 0; i < (int32_t)(sizeof(testCases)/sizeof(testCases[0])); i++) { + status = U_ZERO_ERROR; + Locale l(testCases[i].localeID); + keywords = l.createKeywords(status); + + if(status != testCases[i].expectedStatus) { + err("Expected to get status %s. Got %s instead\n", + u_errorName(testCases[i].expectedStatus), u_errorName(status)); + } + status = U_ZERO_ERROR; + if(keywords) { + if((keyCount = keywords->count(status)) != testCases[i].numKeywords) { + err("Expected to get %i keywords, got %i\n", testCases[i].numKeywords, keyCount); + } + if(keyCount) { + for(j = 0;;) { + if((j&1)==0) { + if((keyword = keywords->next(&keywordLen, status)) == NULL) { + break; + } + if(strcmp(keyword, testCases[i].expectedKeywords[j]) != 0) { + err("Expected to get keyword value %s, got %s\n", testCases[i].expectedKeywords[j], keyword); + } + } else { + if((keywordString = keywords->snext(status)) == NULL) { + break; + } + if(*keywordString != UnicodeString(testCases[i].expectedKeywords[j], "")) { + err("Expected to get keyword UnicodeString %s, got %s\n", testCases[i].expectedKeywords[j], keyword); + } + } + j++; + + if(j == keyCount / 2) { + // replace keywords with a clone of itself + StringEnumeration *k2 = keywords->clone(); + if(k2 == NULL || keyCount != k2->count(status)) { + errln("KeywordEnumeration.clone() failed"); + } else { + delete keywords; + keywords = k2; + } + } + } + } + delete keywords; + } + result = l.getName(); + if(uprv_strcmp(testCases[i].expectedLocaleID, result) != 0) { + err("Expected to get \"%s\" from \"%s\". Got \"%s\" instead\n", + testCases[i].expectedLocaleID, testCases[i].localeID, result); + } + + } + +} + +void +LocaleTest::TestKeywordVariantParsing(void) { + struct { + const char *localeID; + const char *keyword; + const char *expectedValue; + } testCases[] = { + { "de_DE@ C o ll A t i o n = Phonebook ", "collation", "Phonebook" }, + { "de_DE", "collation", ""}, + { "de_DE@collation= PHONEBOOK", "collation", "PHONEBOOK" }, + { "de_DE@ currency = euro ; CoLLaTion = PHONEBOOk ", "collation", "PHONEBOOk" }, + }; + + UErrorCode status = U_ZERO_ERROR; + + int32_t i = 0; + int32_t resultLen = 0; + char buffer[256]; + + for(i = 0; i < (int32_t)(sizeof(testCases)/sizeof(testCases[0])); i++) { + *buffer = 0; + Locale l(testCases[i].localeID); + resultLen = l.getKeywordValue(testCases[i].keyword, buffer, 256, status); + if(uprv_strcmp(testCases[i].expectedValue, buffer) != 0) { + err("Expected to extract \"%s\" from \"%s\" for keyword \"%s\". Got \"%s\" instead\n", + testCases[i].expectedValue, testCases[i].localeID, testCases[i].keyword, buffer); + } + } +} + +void +LocaleTest::TestGetBaseName(void) { + struct { + const char *localeID; + const char *baseName; + } testCases[] = { + { "de_DE@ C o ll A t i o n = Phonebook ", "de_DE" }, + { "de@currency = euro; CoLLaTion = PHONEBOOk", "de" }, + { "ja@calendar = buddhist", "ja" } + }; + + int32_t i = 0; + + for(i = 0; i < (int32_t)(sizeof(testCases)/sizeof(testCases[0])); i++) { + Locale loc(testCases[i].localeID); + if(strcmp(testCases[i].baseName, loc.getBaseName())) { + errln("For locale \"%s\" expected baseName \"%s\", but got \"%s\"", + testCases[i].localeID, testCases[i].baseName, loc.getBaseName()); + return; + } + } +} + +/** + * Compare two locale IDs. If they are equal, return 0. If `string' + * starts with `prefix' plus an additional element, that is, string == + * prefix + '_' + x, then return 1. Otherwise return a value < 0. + */ +static UBool _loccmp(const char* string, const char* prefix) { + int32_t slen = (int32_t)strlen(string), + plen = (int32_t)strlen(prefix); + int32_t c = uprv_strncmp(string, prefix, plen); + /* 'root' is "less than" everything */ + if (uprv_strcmp(prefix, "root") == 0) { + return (uprv_strcmp(string, "root") == 0) ? 0 : 1; + } + if (c) return -1; /* mismatch */ + if (slen == plen) return 0; + if (string[plen] == '_') return 1; + return -2; /* false match, e.g. "en_USX" cmp "en_US" */ +} + +/** + * Check the relationship between requested locales, and report problems. + * The caller specifies the expected relationships between requested + * and valid (expReqValid) and between valid and actual (expValidActual). + * Possible values are: + * "gt" strictly greater than, e.g., en_US > en + * "ge" greater or equal, e.g., en >= en + * "eq" equal, e.g., en == en + */ +void LocaleTest::_checklocs(const char* label, + const char* req, + const Locale& validLoc, + const Locale& actualLoc, + const char* expReqValid, + const char* expValidActual) { + const char* valid = validLoc.getName(); + const char* actual = actualLoc.getName(); + int32_t reqValid = _loccmp(req, valid); + int32_t validActual = _loccmp(valid, actual); + if (((0 == uprv_strcmp(expReqValid, "gt") && reqValid > 0) || + (0 == uprv_strcmp(expReqValid, "ge") && reqValid >= 0) || + (0 == uprv_strcmp(expReqValid, "eq") && reqValid == 0)) && + ((0 == uprv_strcmp(expValidActual, "gt") && validActual > 0) || + (0 == uprv_strcmp(expValidActual, "ge") && validActual >= 0) || + (0 == uprv_strcmp(expValidActual, "eq") && validActual == 0))) { + logln("%s; req=%s, valid=%s, actual=%s", + label, req, valid, actual); + } else { + errln("FAIL: %s; req=%s, valid=%s, actual=%s. Require (R %s V) and (V %s A)", + label, req, valid, actual, + expReqValid, expValidActual); + } +} + +void LocaleTest::TestGetLocale(void) { +#if !UCONFIG_NO_SERVICE + UErrorCode ec = U_ZERO_ERROR; + const char *req; + Locale valid, actual, reqLoc; + + // Calendar +#if !UCONFIG_NO_FORMATTING + req = "en_US_BROOKLYN"; + Calendar* cal = Calendar::createInstance(Locale::createFromName(req), ec); + if (U_FAILURE(ec)) { + errln("FAIL: Calendar::createInstance failed"); + } else { + valid = cal->getLocale(ULOC_VALID_LOCALE, ec); + actual = cal->getLocale(ULOC_ACTUAL_LOCALE, ec); + if (U_FAILURE(ec)) { + errln("FAIL: Calendar::getLocale() failed"); + } else { + _checklocs("Calendar", req, valid, actual); + } + } + delete cal; +#endif + + // DecimalFormat, DecimalFormatSymbols +#if !UCONFIG_NO_FORMATTING + req = "fr_FR_NICE"; + DecimalFormat* dec = (DecimalFormat*) + NumberFormat::createInstance(Locale::createFromName(req), ec); + U_ASSERT(dec->getDynamicClassID() == DecimalFormat::getStaticClassID()); + if (U_FAILURE(ec)) { + errln("FAIL: NumberFormat::createInstance failed"); + } else { + valid = dec->getLocale(ULOC_VALID_LOCALE, ec); + actual = dec->getLocale(ULOC_ACTUAL_LOCALE, ec); + if (U_FAILURE(ec)) { + errln("FAIL: DecimalFormat::getLocale() failed"); + } else { + _checklocs("DecimalFormat", req, valid, actual); + } + + const DecimalFormatSymbols* sym = dec->getDecimalFormatSymbols(); + U_ASSERT(sym != 0); + valid = sym->getLocale(ULOC_VALID_LOCALE, ec); + actual = sym->getLocale(ULOC_ACTUAL_LOCALE, ec); + if (U_FAILURE(ec)) { + errln("FAIL: DecimalFormatSymbols::getLocale() failed"); + } else { + _checklocs("DecimalFormatSymbols", req, valid, actual); + } + } + delete dec; +#endif + + // DateFormat, DateFormatSymbols +#if !UCONFIG_NO_FORMATTING + req = "de_CH_LUCERNE"; + SimpleDateFormat* dat = (SimpleDateFormat*) + DateFormat::createDateInstance(DateFormat::kDefault, + Locale::createFromName(req)); + U_ASSERT(dat != 0); + U_ASSERT(dat->getDynamicClassID() == SimpleDateFormat::getStaticClassID()); + valid = dat->getLocale(ULOC_VALID_LOCALE, ec); + actual = dat->getLocale(ULOC_ACTUAL_LOCALE, ec); + if (U_FAILURE(ec)) { + errln("FAIL: SimpleDateFormat::getLocale() failed"); + } else { + _checklocs("SimpleDateFormat", req, valid, actual); + } + + const DateFormatSymbols* sym = dat->getDateFormatSymbols(); + U_ASSERT(sym != 0); + valid = sym->getLocale(ULOC_VALID_LOCALE, ec); + actual = sym->getLocale(ULOC_ACTUAL_LOCALE, ec); + if (U_FAILURE(ec)) { + errln("FAIL: DateFormatSymbols::getLocale() failed"); + } else { + _checklocs("DateFormatSymbols", req, valid, actual); + } + delete dat; +#endif + + // BreakIterator +#if !UCONFIG_NO_BREAK_ITERATION + req = "es_ES_BARCELONA"; + reqLoc = Locale::createFromName(req); + BreakIterator* brk = BreakIterator::createWordInstance(reqLoc, ec); + if (U_FAILURE(ec)) { + errln("FAIL: BreakIterator::createWordInstance failed"); + } else { + valid = brk->getLocale(ULOC_VALID_LOCALE, ec); + actual = brk->getLocale(ULOC_ACTUAL_LOCALE, ec); + if (U_FAILURE(ec)) { + errln("FAIL: BreakIterator::getLocale() failed"); + } else { + _checklocs("BreakIterator", req, valid, actual); + } + + // After registering something, the behavior should be different + URegistryKey key = BreakIterator::registerInstance(brk, reqLoc, UBRK_WORD, ec); + brk = 0; // registerInstance adopts + if (U_FAILURE(ec)) { + errln("FAIL: BreakIterator::registerInstance() failed"); + } else { + brk = BreakIterator::createWordInstance(reqLoc, ec); + if (U_FAILURE(ec)) { + errln("FAIL: BreakIterator::createWordInstance failed"); + } else { + valid = brk->getLocale(ULOC_VALID_LOCALE, ec); + actual = brk->getLocale(ULOC_ACTUAL_LOCALE, ec); + if (U_FAILURE(ec)) { + errln("FAIL: BreakIterator::getLocale() failed"); + } else { + // N.B.: now expect valid==actual==req + _checklocs("BreakIterator(registered)", + req, valid, actual, "eq", "eq"); + } + } + // No matter what, unregister + BreakIterator::unregister(key, ec); + if (U_FAILURE(ec)) { + errln("FAIL: BreakIterator::unregister() failed"); + } + delete brk; + brk = 0; + } + + // After unregistering, should behave normally again + brk = BreakIterator::createWordInstance(reqLoc, ec); + if (U_FAILURE(ec)) { + errln("FAIL: BreakIterator::createWordInstance failed"); + } else { + valid = brk->getLocale(ULOC_VALID_LOCALE, ec); + actual = brk->getLocale(ULOC_ACTUAL_LOCALE, ec); + if (U_FAILURE(ec)) { + errln("FAIL: BreakIterator::getLocale() failed"); + } else { + _checklocs("BreakIterator(unregistered)", req, valid, actual); + } + } + } + delete brk; +#endif + + // Collator +#if !UCONFIG_NO_COLLATION + req = "hi_IN_BHOPAL"; + reqLoc = Locale::createFromName(req); + Collator* coll = Collator::createInstance(reqLoc, ec); + if (U_FAILURE(ec)) { + errln("FAIL: Collator::createInstance failed"); + } else { + valid = coll->getLocale(ULOC_VALID_LOCALE, ec); + actual = coll->getLocale(ULOC_ACTUAL_LOCALE, ec); + if (U_FAILURE(ec)) { + errln("FAIL: Collator::getLocale() failed"); + } else { + _checklocs("Collator", req, valid, actual); + } + + // After registering something, the behavior should be different + URegistryKey key = Collator::registerInstance(coll, reqLoc, ec); + coll = 0; // registerInstance adopts + if (U_FAILURE(ec)) { + errln("FAIL: Collator::registerInstance() failed"); + } else { + coll = Collator::createInstance(reqLoc, ec); + if (U_FAILURE(ec)) { + errln("FAIL: Collator::createWordInstance failed"); + } else { + valid = coll->getLocale(ULOC_VALID_LOCALE, ec); + actual = coll->getLocale(ULOC_ACTUAL_LOCALE, ec); + if (U_FAILURE(ec)) { + errln("FAIL: Collator::getLocale() failed"); + } else { + // N.B.: now expect valid==actual==req + _checklocs("Collator(registered)", + req, valid, actual, "eq", "eq"); + } + } + // No matter what, unregister + Collator::unregister(key, ec); + if (U_FAILURE(ec)) { + errln("FAIL: Collator::unregister() failed"); + } + delete coll; + coll = 0; + } + + // After unregistering, should behave normally again + coll = Collator::createInstance(reqLoc, ec); + if (U_FAILURE(ec)) { + errln("FAIL: Collator::createInstance failed"); + } else { + valid = coll->getLocale(ULOC_VALID_LOCALE, ec); + actual = coll->getLocale(ULOC_ACTUAL_LOCALE, ec); + if (U_FAILURE(ec)) { + errln("FAIL: Collator::getLocale() failed"); + } else { + _checklocs("Collator(unregistered)", req, valid, actual); + } + } + } + delete coll; +#endif +#endif +} + +void LocaleTest::TestVariantWithOutCountry(void) { + Locale loc("en","","POSIX"); + if (0 != strcmp(loc.getVariant(), "POSIX")) { + errln("FAIL: en__POSIX didn't get parsed correctly"); + } + Locale loc2("en","","FOUR"); + if (0 != strcmp(loc2.getVariant(), "FOUR")) { + errln("FAIL: en__FOUR didn't get parsed correctly"); + } + Locale loc3("en","Latn","","FOUR"); + if (0 != strcmp(loc3.getVariant(), "FOUR")) { + errln("FAIL: en_Latn__FOUR didn't get parsed correctly"); + } + Locale loc4("","Latn","","FOUR"); + if (0 != strcmp(loc4.getVariant(), "FOUR")) { + errln("FAIL: _Latn__FOUR didn't get parsed correctly"); + } + Locale loc5("","Latn","US","FOUR"); + if (0 != strcmp(loc5.getVariant(), "FOUR")) { + errln("FAIL: _Latn_US_FOUR didn't get parsed correctly"); + } +} + +static Locale _canonicalize(int32_t selector, /* 0==createFromName, 1==createCanonical, 2==Locale ct */ + const char* localeID) { + switch (selector) { + case 0: + return Locale::createFromName(localeID); + case 1: + return Locale::createCanonical(localeID); + case 2: + return Locale(localeID); + default: + return Locale(""); + } +} + +void LocaleTest::TestCanonicalization(void) +{ + static struct { + const char *localeID; /* input */ + const char *getNameID; /* expected getName() result */ + const char *canonicalID; /* expected canonicalize() result */ + } testCases[] = { + { "ca_ES_PREEURO-with-extra-stuff-that really doesn't make any sense-unless-you're trying to increase code coverage", + "ca_ES_PREEURO_WITH_EXTRA_STUFF_THAT REALLY DOESN'T MAKE ANY SENSE_UNLESS_YOU'RE TRYING TO INCREASE CODE COVERAGE", + "ca_ES_PREEURO_WITH_EXTRA_STUFF_THAT REALLY DOESN'T MAKE ANY SENSE_UNLESS_YOU'RE TRYING TO INCREASE CODE COVERAGE"}, + { "ca_ES_PREEURO", "ca_ES_PREEURO", "ca_ES@currency=ESP" }, + { "de_AT_PREEURO", "de_AT_PREEURO", "de_AT@currency=ATS" }, + { "de_DE_PREEURO", "de_DE_PREEURO", "de_DE@currency=DEM" }, + { "de_LU_PREEURO", "de_LU_PREEURO", "de_LU@currency=LUF" }, + { "el_GR_PREEURO", "el_GR_PREEURO", "el_GR@currency=GRD" }, + { "en_BE_PREEURO", "en_BE_PREEURO", "en_BE@currency=BEF" }, + { "en_IE_PREEURO", "en_IE_PREEURO", "en_IE@currency=IEP" }, + { "es_ES_PREEURO", "es_ES_PREEURO", "es_ES@currency=ESP" }, + { "eu_ES_PREEURO", "eu_ES_PREEURO", "eu_ES@currency=ESP" }, + { "fi_FI_PREEURO", "fi_FI_PREEURO", "fi_FI@currency=FIM" }, + { "fr_BE_PREEURO", "fr_BE_PREEURO", "fr_BE@currency=BEF" }, + { "fr_FR_PREEURO", "fr_FR_PREEURO", "fr_FR@currency=FRF" }, + { "fr_LU_PREEURO", "fr_LU_PREEURO", "fr_LU@currency=LUF" }, + { "ga_IE_PREEURO", "ga_IE_PREEURO", "ga_IE@currency=IEP" }, + { "gl_ES_PREEURO", "gl_ES_PREEURO", "gl_ES@currency=ESP" }, + { "it_IT_PREEURO", "it_IT_PREEURO", "it_IT@currency=ITL" }, + { "nl_BE_PREEURO", "nl_BE_PREEURO", "nl_BE@currency=BEF" }, + { "nl_NL_PREEURO", "nl_NL_PREEURO", "nl_NL@currency=NLG" }, + { "pt_PT_PREEURO", "pt_PT_PREEURO", "pt_PT@currency=PTE" }, + { "de__PHONEBOOK", "de__PHONEBOOK", "de@collation=phonebook" }, + { "en_GB_EURO", "en_GB_EURO", "en_GB@currency=EUR" }, + { "en_GB@EURO", "en_GB@EURO", "en_GB@currency=EUR" }, /* POSIX ID */ + { "es__TRADITIONAL", "es__TRADITIONAL", "es@collation=traditional" }, + { "hi__DIRECT", "hi__DIRECT", "hi@collation=direct" }, + { "ja_JP_TRADITIONAL", "ja_JP_TRADITIONAL", "ja_JP@calendar=japanese" }, + { "th_TH_TRADITIONAL", "th_TH_TRADITIONAL", "th_TH@calendar=buddhist" }, + { "zh_TW_STROKE", "zh_TW_STROKE", "zh_TW@collation=stroke" }, + { "zh__PINYIN", "zh__PINYIN", "zh@collation=pinyin" }, + { "zh@collation=pinyin", "zh@collation=pinyin", "zh@collation=pinyin" }, + { "zh_CN@collation=pinyin", "zh_CN@collation=pinyin", "zh_CN@collation=pinyin" }, + { "zh_CN_CA@collation=pinyin", "zh_CN_CA@collation=pinyin", "zh_CN_CA@collation=pinyin" }, + { "en_US_POSIX", "en_US_POSIX", "en_US_POSIX" }, + { "hy_AM_REVISED", "hy_AM_REVISED", "hy_AM_REVISED" }, + { "no_NO_NY", "no_NO_NY", "no_NO_NY" /* not: "nn_NO" [alan ICU3.0] */ }, + { "no@ny", "no@ny", "no__NY" /* not: "nn" [alan ICU3.0] */ }, /* POSIX ID */ + { "no-no.utf32@B", "no_NO.utf32@B", "no_NO_B" /* not: "nb_NO_B" [alan ICU3.0] */ }, /* POSIX ID */ + { "qz-qz@Euro", "qz_QZ@Euro", "qz_QZ@currency=EUR" }, /* qz-qz uses private use iso codes */ + // NOTE: uloc_getName() works on en-BOONT, but Locale() parser considers it BOGUS + // TODO: unify this behavior + { "en-BOONT", "BOGUS", "en__BOONT" }, /* registered name */ + { "de-1901", "de_1901", "de__1901" }, /* registered name */ + { "de-1906", "de_1906", "de__1906" }, /* registered name */ + { "sr-SP-Cyrl", "sr_SP_CYRL", "sr_Cyrl_SP" }, /* .NET name */ + { "sr-SP-Latn", "sr_SP_LATN", "sr_Latn_SP" }, /* .NET name */ + { "uz-UZ-Cyrl", "uz_UZ_CYRL", "uz_Cyrl_UZ" }, /* .NET name */ + { "uz-UZ-Latn", "uz_UZ_LATN", "uz_Latn_UZ" }, /* .NET name */ + { "zh-CHS", "zh_CHS", "zh_Hans" }, /* .NET name */ + { "zh-CHT", "zh_CHT", "zh_TW" }, /* .NET name This may change back to zh_Hant */ + + /* posix behavior that used to be performed by getName */ + { "mr.utf8", "mr.utf8", "mr" }, + { "de-tv.koi8r", "de_TV.koi8r", "de_TV" }, + { "x-piglatin_ML.MBE", "x-piglatin_ML.MBE", "x-piglatin_ML" }, + { "i-cherokee_US.utf7", "i-cherokee_US.utf7", "i-cherokee_US" }, + { "x-filfli_MT_FILFLA.gb-18030", "x-filfli_MT_FILFLA.gb-18030", "x-filfli_MT_FILFLA" }, + { "no-no-ny.utf8@B", "no_NO_NY.utf8@B", "no_NO_NY_B" /* not: "nn_NO" [alan ICU3.0] */ }, /* @ ignored unless variant is empty */ + + /* fleshing out canonicalization */ + /* trim space and sort keywords, ';' is separator so not present at end in canonical form */ + { "en_Hant_IL_VALLEY_GIRL@ currency = EUR; calendar = Japanese ;", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR" }, + /* already-canonical ids are not changed */ + { "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR" }, + /* PRE_EURO and EURO conversions don't affect other keywords */ + { "es_ES_PREEURO@CALendar=Japanese", "es_ES_PREEURO@calendar=Japanese", "es_ES@calendar=Japanese;currency=ESP" }, + { "es_ES_EURO@SHOUT=zipeedeedoodah", "es_ES_EURO@shout=zipeedeedoodah", "es_ES@currency=EUR;shout=zipeedeedoodah" }, + /* currency keyword overrides PRE_EURO and EURO currency */ + { "es_ES_PREEURO@currency=EUR", "es_ES_PREEURO@currency=EUR", "es_ES@currency=EUR" }, + { "es_ES_EURO@currency=ESP", "es_ES_EURO@currency=ESP", "es_ES@currency=ESP" }, + /* norwegian is just too weird, if we handle things in their full generality */ + { "no-Hant-GB_NY@currency=$$$", "no_Hant_GB_NY@currency=$$$", "no_Hant_GB_NY@currency=$$$" /* not: "nn_Hant_GB@currency=$$$" [alan ICU3.0] */ }, + + /* test cases reflecting internal resource bundle usage */ + { "root@kw=foo", "root@kw=foo", "root@kw=foo" }, + { "@calendar=gregorian", "@calendar=gregorian", "@calendar=gregorian" }, + { "ja_JP@calendar=Japanese", "ja_JP@calendar=Japanese", "ja_JP@calendar=Japanese" } + }; + + static const char* label[] = { "createFromName", "createCanonical", "Locale" }; + + int32_t i, j; + + for (i=0; i < (int)(sizeof(testCases)/sizeof(testCases[0])); i++) { + for (j=0; j<3; ++j) { + const char* expected = (j==1) ? testCases[i].canonicalID : testCases[i].getNameID; + Locale loc = _canonicalize(j, testCases[i].localeID); + const char* getName = loc.isBogus() ? "BOGUS" : loc.getName(); + if(uprv_strcmp(expected, getName) != 0) { + errln("FAIL: %s(%s).getName() => \"%s\", expected \"%s\"", + label[j], testCases[i].localeID, getName, expected); + } else { + logln("Ok: %s(%s) => \"%s\"", + label[j], testCases[i].localeID, getName); + } + } + } +} diff --git a/icuSources/test/intltest/loctest.h b/icuSources/test/intltest/loctest.h index f5bc40a8..c01d15ec 100644 --- a/icuSources/test/intltest/loctest.h +++ b/icuSources/test/intltest/loctest.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -69,6 +69,15 @@ public: void Test4147552(void); void TestVariantParsing(void); + + /* Test getting keyword enumeratin */ + void TestKeywordVariants(void); + + /* Test getting keyword values */ + void TestKeywordVariantParsing(void); + + /* Test getting the locale base name */ + void TestGetBaseName(void); #if !UCONFIG_NO_FORMATTING void Test4105828(void) ; @@ -76,11 +85,24 @@ public: void TestSetIsBogus(void); + void TestGetLocale(void); + + void TestVariantWithOutCountry(void); + + void TestCanonicalization(void); + #if !UCONFIG_NO_FORMATTING static UDate date(int32_t y, int32_t m, int32_t d, int32_t hr = 0, int32_t min = 0, int32_t sec = 0); #endif private: + void _checklocs(const char* label, + const char* req, + const Locale& validLoc, + const Locale& actualLoc, + const char* expReqValid="gt", + const char* expValidActual="ge"); + /** * routine to perform subtests, used by TestDisplayNames **/ @@ -98,37 +120,46 @@ private: CROATIAN = 2, GREEK = 3, NORWEGIAN = 4, - MAX_LOCALES = 4 + ITALIAN = 5, + XX = 6, + CHINESE = 7, + MAX_LOCALES = 7 }; enum { LANG = 0, - CTRY = 1, - VAR = 2, - NAME = 3, - LANG3 = 4, - CTRY3 = 5, - LCID = 6, - DLANG_EN = 7, - DCTRY_EN = 8, - DVAR_EN = 9, - DNAME_EN = 10, - DLANG_FR = 11, - DCTRY_FR = 12, - DVAR_FR = 13, - DNAME_FR = 14, - DLANG_HR = 15, - DCTRY_HR = 16, - DVAR_HR = 17, - DNAME_HR = 18, - DLANG_EL = 19, - DCTRY_EL = 20, - DVAR_EL = 21, - DNAME_EL = 22, - DLANG_RT = 23, - DCTRY_RT = 24, - DVAR_RT = 25, - DNAME_RT = 26 + SCRIPT, + CTRY, + VAR, + NAME, + LANG3, + CTRY3, + LCID, + DLANG_EN, + DSCRIPT_EN, + DCTRY_EN, + DVAR_EN, + DNAME_EN, + DLANG_FR, + DSCRIPT_FR, + DCTRY_FR, + DVAR_FR, + DNAME_FR, + DLANG_CA, + DSCRIPT_CA, + DCTRY_CA, + DVAR_CA, + DNAME_CA, + DLANG_EL, + DSCRIPT_EL, + DCTRY_EL, + DVAR_EL, + DNAME_EL, + DLANG_NO, + DSCRIPT_NO, + DCTRY_NO, + DVAR_NO, + DNAME_NO }; }; diff --git a/icuSources/test/intltest/miscdtfm.cpp b/icuSources/test/intltest/miscdtfm.cpp index f7bd3842..c0b5660d 100644 --- a/icuSources/test/intltest/miscdtfm.cpp +++ b/icuSources/test/intltest/miscdtfm.cpp @@ -1,8 +1,8 @@ -/******************************************************************** +/*********************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ + * Copyright (c) 1997-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ***********************************************************************/ #include "unicode/utypes.h" @@ -338,23 +338,23 @@ DateFormatMiscTests::test4117335() int32_t rowCount, colCount; const UnicodeString **zones = symbols->getZoneStrings(rowCount, colCount); - logln(UnicodeString("Long zone name = ") + zones[0][1]); - if (zones[0][1] != jstLong) { - errln("*** Should have been " + jstLong); + logln(UnicodeString("Long zone name = ") + zones[rowCount-3][1]); + if (zones[rowCount-3][1] != jstLong) { + errln("*** Should have been " + prettify(jstLong)); //throw new Exception("Error in long TZ name"); } - logln(UnicodeString("Short zone name = ") + zones[0][2]); - if (zones[0][2] != jstShort) { + logln(UnicodeString("Short zone name = ") + zones[rowCount-3][2]); + if (zones[rowCount-3][2] != jstShort) { errln("*** Should have been " + jstShort); //throw new Exception("Error in short TZ name"); } - logln(UnicodeString("Long zone name = ") + zones[0][3]); - if (zones[0][3] != jstLong) { + logln(UnicodeString("Long zone name = ") + zones[rowCount-3][3]); + if (zones[rowCount-3][3] != jstLong) { errln("*** Should have been " + jstLong); //throw new Exception("Error in long TZ name"); } - logln(UnicodeString("SHORT zone name = ") + zones[0][4]); - if (zones[0][4] != jstShort) { + logln(UnicodeString("SHORT zone name = ") + zones[rowCount-3][4]); + if (zones[rowCount-3][4] != jstShort) { errln("*** Should have been " + jstShort); //throw new Exception("Error in short TZ name"); } diff --git a/icuSources/test/intltest/msfmrgts.cpp b/icuSources/test/intltest/msfmrgts.cpp index 77229818..343d135a 100644 --- a/icuSources/test/intltest/msfmrgts.cpp +++ b/icuSources/test/intltest/msfmrgts.cpp @@ -1,8 +1,8 @@ -/******************************************************************** +/*********************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ + * Copyright (c) 1997-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ***********************************************************************/ #include "unicode/utypes.h" @@ -17,6 +17,7 @@ #include "unicode/numfmt.h" #include "unicode/choicfmt.h" #include "unicode/gregocal.h" +#include "putilimp.h" // ***************************************************************************** // class MessageFormatRegressionTest @@ -206,24 +207,33 @@ void MessageFormatRegressionTest::Test4031438() temp = obj.getString(temp); else { fmt = NumberFormat::createInstance(status); - fmt->format(obj.getType() == Formattable::kLong ? obj.getLong() : obj.getDouble(), temp); + switch (obj.getType()) { + case Formattable::kLong: fmt->format(obj.getLong(), temp); break; + case Formattable::kInt64: fmt->format(obj.getInt64(), temp); break; + case Formattable::kDouble: fmt->format(obj.getDouble(), temp); break; + default: break; + } } // convert to string if not already Formattable obj1 = params[i]; temp1.remove(); - if(obj1.getType() == Formattable::kDouble || obj1.getType() == Formattable::kLong) { + if(obj1.getType() == Formattable::kString) + temp1 = obj1.getString(temp1); + else { fmt = NumberFormat::createInstance(status); - fmt->format(obj1.getType() == Formattable::kLong ? obj1.getLong() : obj1.getDouble(), temp1); + switch (obj1.getType()) { + case Formattable::kLong: fmt->format(obj1.getLong(), temp1); break; + case Formattable::kInt64: fmt->format(obj1.getInt64(), temp1); break; + case Formattable::kDouble: fmt->format(obj1.getDouble(), temp1); break; + default: break; + } } - else - temp1 = obj1.getString(temp1); //if (objs[i] != NULL && objs[i].getString(temp1) != params[i].getString(temp2)) { if (temp != temp1) { errln("Parse failed on object " + objs[i].getString(temp1) + " at index : " + i); - } - + } } delete fmt; diff --git a/icuSources/test/intltest/nmfmapts.cpp b/icuSources/test/intltest/nmfmapts.cpp index 4f143c69..8d8875e0 100644 --- a/icuSources/test/intltest/nmfmapts.cpp +++ b/icuSources/test/intltest/nmfmapts.cpp @@ -1,8 +1,8 @@ -/******************************************************************** +/*********************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ + * Copyright (c) 1997-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ***********************************************************************/ #include "unicode/utypes.h" @@ -238,41 +238,43 @@ void IntlTestNumberFormatAPI::testAPI(/* char* par */) delete per_fr; } +#if !UCONFIG_NO_SERVICE + #define SRC_LOC Locale::getFrance() #define SWAP_LOC Locale::getUS() class NFTestFactory : public SimpleNumberFormatFactory { - NumberFormat* currencyStyle; + NumberFormat* currencyStyle; public: - NFTestFactory() - : SimpleNumberFormatFactory(SRC_LOC, TRUE) - { - UErrorCode status = U_ZERO_ERROR; - currencyStyle = NumberFormat::createInstance(SWAP_LOC, status); - } - - virtual ~NFTestFactory() - { - delete currencyStyle; - } - - virtual NumberFormat* createFormat(const Locale& loc, UNumberFormatStyle formatType) - { - if (formatType == UNUM_CURRENCY) { - return (NumberFormat*)currencyStyle->clone(); - } - return NULL; - } + NFTestFactory() + : SimpleNumberFormatFactory(SRC_LOC, TRUE) + { + UErrorCode status = U_ZERO_ERROR; + currencyStyle = NumberFormat::createInstance(SWAP_LOC, status); + } + + virtual ~NFTestFactory() + { + delete currencyStyle; + } + + virtual NumberFormat* createFormat(const Locale& /* loc */, UNumberFormatStyle formatType) + { + if (formatType == UNUM_CURRENCY) { + return (NumberFormat*)currencyStyle->clone(); + } + return NULL; + } virtual inline UClassID getDynamicClassID() const { - return (UClassID)&gID; + return (UClassID)&gID; } static inline UClassID getStaticClassID() { - return (UClassID)&gID; + return (UClassID)&gID; } private: @@ -280,40 +282,41 @@ private: }; char NFTestFactory::gID = 0; +#endif void IntlTestNumberFormatAPI::testRegistration() { - - UErrorCode status = U_ZERO_ERROR; - - NumberFormat* f0 = NumberFormat::createInstance(SWAP_LOC, status); - NumberFormat* f1 = NumberFormat::createInstance(SRC_LOC, status); - NumberFormat* f2 = NumberFormat::createCurrencyInstance(SRC_LOC, status); - URegistryKey key = NumberFormat::registerFactory(new NFTestFactory(), status); - NumberFormat* f3 = NumberFormat::createCurrencyInstance(SRC_LOC, status); - NumberFormat* f3a = NumberFormat::createCurrencyInstance(SRC_LOC, status); - NumberFormat* f4 = NumberFormat::createInstance(SRC_LOC, status); - - StringEnumeration* locs = NumberFormat::getAvailableLocales(); - - UNumberFormat* uf3 = unum_open(UNUM_CURRENCY, NULL, 0, SRC_LOC.getName(),NULL, &status); - UNumberFormat* uf4 = unum_open(UNUM_DEFAULT, NULL, 0, SRC_LOC.getName(), NULL, &status); +#if !UCONFIG_NO_SERVICE + UErrorCode status = U_ZERO_ERROR; + + NumberFormat* f0 = NumberFormat::createInstance(SWAP_LOC, status); + NumberFormat* f1 = NumberFormat::createInstance(SRC_LOC, status); + NumberFormat* f2 = NumberFormat::createCurrencyInstance(SRC_LOC, status); + URegistryKey key = NumberFormat::registerFactory(new NFTestFactory(), status); + NumberFormat* f3 = NumberFormat::createCurrencyInstance(SRC_LOC, status); + NumberFormat* f3a = NumberFormat::createCurrencyInstance(SRC_LOC, status); + NumberFormat* f4 = NumberFormat::createInstance(SRC_LOC, status); + + StringEnumeration* locs = NumberFormat::getAvailableLocales(); + + UNumberFormat* uf3 = unum_open(UNUM_CURRENCY, NULL, 0, SRC_LOC.getName(),NULL, &status); + UNumberFormat* uf4 = unum_open(UNUM_DEFAULT, NULL, 0, SRC_LOC.getName(), NULL, &status); const UnicodeString* res; - for (res = locs->snext(status); res; res = locs->snext(status)) { - logln(*res); // service is still in synch - } - - NumberFormat::unregister(key, status); // restore for other tests - NumberFormat* f5 = NumberFormat::createCurrencyInstance(SRC_LOC, status); - UNumberFormat* uf5 = unum_open(UNUM_CURRENCY, NULL, 0, SRC_LOC.getName(),NULL, &status); - - float n = 1234.567f; - UnicodeString res0, res1, res2, res3, res4, res5; - UChar ures3[50]; - UChar ures4[50]; - UChar ures5[50]; + for (res = locs->snext(status); res; res = locs->snext(status)) { + logln(*res); // service is still in synch + } + + NumberFormat::unregister(key, status); // restore for other tests + NumberFormat* f5 = NumberFormat::createCurrencyInstance(SRC_LOC, status); + UNumberFormat* uf5 = unum_open(UNUM_CURRENCY, NULL, 0, SRC_LOC.getName(),NULL, &status); + + float n = 1234.567f; + UnicodeString res0, res1, res2, res3, res4, res5; + UChar ures3[50]; + UChar ures4[50]; + UChar ures5[50]; f0->format(n, res0); f1->format(n, res1); @@ -322,68 +325,69 @@ IntlTestNumberFormatAPI::testRegistration() f4->format(n, res4); f5->format(n, res5); - unum_formatDouble(uf3, n, ures3, 50, NULL, &status); - unum_formatDouble(uf4, n, ures4, 50, NULL, &status); - unum_formatDouble(uf5, n, ures5, 50, NULL, &status); - - logln((UnicodeString)"f0 swap int: " + res0); - logln((UnicodeString)"f1 src int: " + res1); - logln((UnicodeString)"f2 src cur: " + res2); - logln((UnicodeString)"f3 reg cur: " + res3); - logln((UnicodeString)"f4 reg int: " + res4); - logln((UnicodeString)"f5 unreg cur: " + res5); - log("uf3 reg cur: "); - logln(ures3); - log("uf4 reg int: "); - logln(ures4); - log("uf5 ureg cur: "); - logln(ures5); - - if (f3 == f3a) { - errln("did not get new instance from service"); - } else { - delete f3a; - } - if (res3 != res0) { - errln("registered service did not match"); - } - if (res4 != res1) { - errln("registered service did not inherit"); - } - if (res5 != res2) { - errln("unregistered service did not match original"); - } - - if (res0 != ures3) { - errln("registered service did not match / unum"); - } - if (res1 != ures4) { - errln("registered service did not inherit / unum"); - } - if (res2 != ures5) { - errln("unregistered service did not match original / unum"); - } - - unum_close(uf5); - delete f5; - unum_close(uf4); - unum_close(uf3); - delete f4; - delete f3; - delete f2; - delete f1; - delete f0; - - for (res = locs->snext(status); res; res = locs->snext(status)) { - errln(*res); // service should be out of synch - } - - locs->reset(status); // now in synch again, we hope - for (res = locs->snext(status); res; res = locs->snext(status)) { - logln(*res); - } - - delete locs; + unum_formatDouble(uf3, n, ures3, 50, NULL, &status); + unum_formatDouble(uf4, n, ures4, 50, NULL, &status); + unum_formatDouble(uf5, n, ures5, 50, NULL, &status); + + logln((UnicodeString)"f0 swap int: " + res0); + logln((UnicodeString)"f1 src int: " + res1); + logln((UnicodeString)"f2 src cur: " + res2); + logln((UnicodeString)"f3 reg cur: " + res3); + logln((UnicodeString)"f4 reg int: " + res4); + logln((UnicodeString)"f5 unreg cur: " + res5); + log("uf3 reg cur: "); + logln(ures3); + log("uf4 reg int: "); + logln(ures4); + log("uf5 ureg cur: "); + logln(ures5); + + if (f3 == f3a) { + errln("did not get new instance from service"); + } else { + delete f3a; + } + if (res3 != res0) { + errln("registered service did not match"); + } + if (res4 != res1) { + errln("registered service did not inherit"); + } + if (res5 != res2) { + errln("unregistered service did not match original"); + } + + if (res0 != ures3) { + errln("registered service did not match / unum"); + } + if (res1 != ures4) { + errln("registered service did not inherit / unum"); + } + if (res2 != ures5) { + errln("unregistered service did not match original / unum"); + } + + unum_close(uf5); + delete f5; + unum_close(uf4); + unum_close(uf3); + delete f4; + delete f3; + delete f2; + delete f1; + delete f0; + + for (res = locs->snext(status); res; res = locs->snext(status)) { + errln(*res); // service should be out of synch + } + + locs->reset(status); // now in synch again, we hope + for (res = locs->snext(status); res; res = locs->snext(status)) { + logln(*res); + } + + delete locs; +#endif } diff --git a/icuSources/test/intltest/nmfmapts.h b/icuSources/test/intltest/nmfmapts.h index c34ea1ad..a2bcae23 100644 --- a/icuSources/test/intltest/nmfmapts.h +++ b/icuSources/test/intltest/nmfmapts.h @@ -25,7 +25,7 @@ private: * executes tests of API functions, see detailed comments in source code **/ void testAPI(/* char* par */); - void testRegistration(); + void testRegistration(); }; #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/test/intltest/nmfmtrt.cpp b/icuSources/test/intltest/nmfmtrt.cpp index a27996a5..36bc7c44 100644 --- a/icuSources/test/intltest/nmfmtrt.cpp +++ b/icuSources/test/intltest/nmfmtrt.cpp @@ -1,8 +1,8 @@ -/******************************************************************** +/*********************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ + * Copyright (c) 1997-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ***********************************************************************/ #include "unicode/utypes.h" @@ -13,9 +13,11 @@ #include "unicode/dcfmtsym.h" #include "unicode/decimfmt.h" #include "unicode/locid.h" +#include "putilimp.h" #include #include // for sprintf +#include // ***************************************************************************** // class NumberFormatRoundTripTest @@ -51,6 +53,31 @@ NumberFormatRoundTripTest::failure(UErrorCode status, const char* msg) return FALSE; } +uint32_t +NumberFormatRoundTripTest::randLong() +{ + // Assume 8-bit (or larger) rand values. Also assume + // that the system rand() function is very poor, which it always is. + uint32_t d; + uint32_t i; + char* poke = (char*)&d; + for (i=0; i < sizeof(uint32_t); ++i) + { + poke[i] = (char)(rand() & 0xFF); + } + return d; +} + +/** + * Return a random value from -range..+range. + */ +double +NumberFormatRoundTripTest::randomDouble(double range) +{ + double a = randFraction(); + return (2.0 * range * a) - range; +} + void NumberFormatRoundTripTest::start() { @@ -179,16 +206,6 @@ NumberFormatRoundTripTest::test(NumberFormat *fmt) } } -/** - * Return a random value from -range..+range. - */ -double -NumberFormatRoundTripTest::randomDouble(double range) -{ - double a = randFraction(); - return (2.0 * range * a) - range; -} - void NumberFormatRoundTripTest::test(NumberFormat *fmt, double value) { diff --git a/icuSources/test/intltest/nmfmtrt.h b/icuSources/test/intltest/nmfmtrt.h index 152f2e75..12eff9a2 100644 --- a/icuSources/test/intltest/nmfmtrt.h +++ b/icuSources/test/intltest/nmfmtrt.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2003, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -14,7 +14,6 @@ #include "unicode/numfmt.h" #include "unicode/fmtable.h" #include "intltest.h" -#include /** * Performs round-trip tests for NumberFormat @@ -57,19 +56,7 @@ public: /* * Return a random uint32_t **/ - static uint32_t randLong() - { - // Assume 8-bit (or larger) rand values. Also assume - // that the system rand() function is very poor, which it always is. - uint32_t d; - uint32_t i; - char* poke = (char*)&d; - for (i=0; i < sizeof(uint32_t); ++i) - { - poke[i] = (char)(rand() & 0xFF); - } - return d; - } + static uint32_t randLong(); /** * Return a random double 0 <= x < 1.0 diff --git a/icuSources/test/intltest/normconf.cpp b/icuSources/test/intltest/normconf.cpp index 2952fe10..c7a530da 100644 --- a/icuSources/test/intltest/normconf.cpp +++ b/icuSources/test/intltest/normconf.cpp @@ -1,6 +1,6 @@ /* ************************************************************************ -* Copyright (c) 1997-2003, International Business Machines +* Copyright (c) 1997-2004, International Business Machines * Corporation and others. All Rights Reserved. ************************************************************************ */ @@ -12,6 +12,7 @@ #include "unicode/uchar.h" #include "unicode/normlzr.h" #include "unicode/uniset.h" +#include "unicode/putil.h" #include "unormimp.h" #include "cstring.h" #include "filestrm.h" @@ -71,7 +72,7 @@ NormalizerConformanceTest::openNormalizationTestFile(const char *filename) { UErrorCode errorCode; // look inside ICU_DATA first - folder=u_getDataDirectory(); + folder=pathToDataDirectory(); if(folder!=NULL) { strcpy(unidataPath, folder); strcat(unidataPath, "unidata" U_FILE_SEP_STRING); diff --git a/icuSources/test/intltest/nptrans.cpp b/icuSources/test/intltest/nptrans.cpp index c796521b..c84f7b23 100644 --- a/icuSources/test/intltest/nptrans.cpp +++ b/icuSources/test/intltest/nptrans.cpp @@ -63,8 +63,11 @@ NamePrepTransform::NamePrepTransform(UParseError& parseError, UErrorCode& status // create the mapping transliterator int32_t ruleLen = 0; const UChar* ruleUChar = ures_getStringByKey(bundle, "MapNFKC",&ruleLen, &status); - UnicodeString rule(ruleUChar, ruleLen); - + int32_t mapRuleLen = 0; + const UChar *mapRuleUChar = ures_getStringByKey(bundle, "MapNoNormalization", &mapRuleLen, &status); + UnicodeString rule(mapRuleUChar, mapRuleLen); + rule.append(ruleUChar, ruleLen); + mapping = Transliterator::createFromRules(UnicodeString("NamePrepTransform", ""), rule, UTRANS_FORWARD, parseError,status); if(U_FAILURE(status)) { @@ -162,7 +165,7 @@ int32_t NamePrepTransform::map(const UChar* src, int32_t srcLength, for(;bufIndex #include -#include "digitlst.h" static const UChar EUR[] = {69,85,82,0}; // "EUR" @@ -61,6 +67,16 @@ void NumberFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &n CASE(20,TestSymbolsWithBadLocale); CASE(21,TestAdoptDecimalFormatSymbols); + CASE(22,TestScientific2); + CASE(23,TestScientificGrouping); + CASE(24,TestInt64); + + CASE(25,TestPerMill); + CASE(26,TestIllegalPatterns); + CASE(27,TestCases); + + CASE(28,TestCurrencyNames); + default: name = ""; break; } } @@ -96,9 +112,6 @@ NumberFormatTest::TestAPI(void) delete test; } - - - } // Test various patterns @@ -146,7 +159,7 @@ NumberFormatTest::TestDigitList(void) list1.append('1'); list1.fDecimalAt = 1; DigitList list2; - list2.set(1); + list2.set((int32_t)1); if (list1 != list2) { errln("digitlist append, operator!= or set failed "); } @@ -313,8 +326,10 @@ NumberFormatTest::TestExponential(void) ParsePosition pos(0); Formattable af; fmt.parse(s, af, pos); - if (af.getType() == Formattable::kLong) { - int32_t a = af.getLong(); + if (af.getType() == Formattable::kLong || + af.getType() == Formattable::kInt64) { + UErrorCode status = U_ZERO_ERROR; + int32_t a = af.getLong(status); if (pos.getIndex() == s.length()) { logln((UnicodeString)" -parse-> " + a); @@ -334,6 +349,138 @@ NumberFormatTest::TestExponential(void) } } +void +NumberFormatTest::TestScientific2() { + // jb 2552 + UErrorCode status = U_ZERO_ERROR; + DecimalFormat* fmt = (DecimalFormat*)NumberFormat::createCurrencyInstance("en_US", status); + if (U_SUCCESS(status)) { + double num = 12.34; + expect(*fmt, num, "$12.34"); + fmt->setScientificNotation(TRUE); + expect(*fmt, num, "$1.23E1"); + fmt->setScientificNotation(FALSE); + expect(*fmt, num, "$12.34"); + } + delete fmt; +} + +void +NumberFormatTest::TestScientificGrouping() { + // jb 2552 + UErrorCode status = U_ZERO_ERROR; + DecimalFormat fmt("##0.00E0",status); + if (U_SUCCESS(status)) { + expect(fmt, .01234, "12.3E-3"); + expect(fmt, .1234, "123E-3"); + expect(fmt, 1.234, "1.23E0"); + expect(fmt, 12.34, "12.3E0"); + expect(fmt, 123.4, "123E0"); + expect(fmt, 1234., "1.23E3"); + } +} + +static void setFromString(DigitList& dl, const char* str) { + char c; + UBool decimalSet = FALSE; + dl.clear(); + while ((c = *str++)) { + if (c == '-') { + dl.fIsPositive = FALSE; + } else if (c == '+') { + dl.fIsPositive = TRUE; + } else if (c == '.') { + dl.fDecimalAt = dl.fCount; + decimalSet = TRUE; + } else { + dl.append(c); + } + } + if (!decimalSet) { + dl.fDecimalAt = dl.fCount; + } +} + +void +NumberFormatTest::TestInt64() { + UErrorCode status = U_ZERO_ERROR; + DecimalFormat fmt("#.#E0",status); + fmt.setMaximumFractionDigits(20); + if (U_SUCCESS(status)) { + expect(fmt, (Formattable)(int64_t)0, "0E0"); + expect(fmt, (Formattable)(int64_t)-1, "-1E0"); + expect(fmt, (Formattable)(int64_t)1, "1E0"); + expect(fmt, (Formattable)(int64_t)2147483647, "2.147483647E9"); + expect(fmt, (Formattable)((int64_t)-2147483647-1), "-2.147483648E9"); + expect(fmt, (Formattable)(int64_t)U_INT64_MAX, "9.223372036854775807E18"); + expect(fmt, (Formattable)(int64_t)U_INT64_MIN, "-9.223372036854775808E18"); + } + + // also test digitlist + int64_t int64max = U_INT64_MAX; + int64_t int64min = U_INT64_MIN; + const char* int64maxstr = "9223372036854775807"; + const char* int64minstr = "-9223372036854775808"; + UnicodeString fail("fail: "); + + // test max int64 value + DigitList dl; + setFromString(dl, int64maxstr); + { + if (!dl.fitsIntoInt64(FALSE)) { + errln(fail + int64maxstr + " didn't fit"); + } + int64_t int64Value = dl.getInt64(); + if (int64Value != int64max) { + errln(fail + int64maxstr); + } + dl.set(int64Value); + int64Value = dl.getInt64(); + if (int64Value != int64max) { + errln(fail + int64maxstr); + } + } + // test negative of max int64 value (1 shy of min int64 value) + dl.fIsPositive = FALSE; + { + if (!dl.fitsIntoInt64(FALSE)) { + errln(fail + "-" + int64maxstr + " didn't fit"); + } + int64_t int64Value = dl.getInt64(); + if (int64Value != -int64max) { + errln(fail + "-" + int64maxstr); + } + dl.set(int64Value); + int64Value = dl.getInt64(); + if (int64Value != -int64max) { + errln(fail + "-" + int64maxstr); + } + } + // test min int64 value + setFromString(dl, int64minstr); + { + if (!dl.fitsIntoInt64(FALSE)) { + errln(fail + "-" + int64minstr + " didn't fit"); + } + int64_t int64Value = dl.getInt64(); + if (int64Value != int64min) { + errln(fail + int64minstr); + } + dl.set(int64Value); + int64Value = dl.getInt64(); + if (int64Value != int64min) { + errln(fail + int64minstr); + } + } + // test negative of min int 64 value (1 more than max int64 value) + dl.fIsPositive = TRUE; // won't fit + { + if (dl.fitsIntoInt64(FALSE)) { + errln(fail + "-(" + int64minstr + ") didn't fit"); + } + } +} + // ------------------------------------- // Test the handling of quotes @@ -438,7 +585,18 @@ NumberFormatTest::escape(UnicodeString& s) // ------------------------------------- - +static const char* testCases[][2]= { + /* locale ID */ /* expected */ + {"ca_ES_PREEURO", "\\u20A7 1.150" }, + {"de_LU_PREEURO", "1,150 F" }, + {"el_GR_PREEURO", "1.150,50 \\u0394\\u03C1\\u03C7" }, + {"en_BE_PREEURO", "1.150,50 BF" }, + {"es_ES_PREEURO", "1.150 \\u20A7" }, + {"eu_ES_PREEURO", "\\u20A7 1.150" }, + {"gl_ES_PREEURO", "\\u20A7 1.150" }, + {"it_IT_PREEURO", "\\u20A4 1.150" }, + {"pt_PT_PREEURO", "1,150$50 Esc."} +}; /** * Test localized currency patterns. */ @@ -453,14 +611,17 @@ NumberFormatTest::TestCurrency(void) errln((UnicodeString)"FAIL: Expected 1,50 $"); delete currencyFmt; s.truncate(0); - currencyFmt = NumberFormat::createCurrencyInstance(Locale("de_DE_PREEURO"),status); + char loc[256]={0}; + int len = uloc_canonicalize("de_DE_PREEURO", loc, 256, &status); + currencyFmt = NumberFormat::createCurrencyInstance(Locale(loc),status); currencyFmt->format(1.50, s); logln((UnicodeString)"Un pauvre en Allemagne a.." + s); if (!(s=="1,50 DM")) errln((UnicodeString)"FAIL: Expected 1,50 DM"); delete currencyFmt; s.truncate(0); - currencyFmt = NumberFormat::createCurrencyInstance(Locale("fr_FR_PREEURO"), status); + len = uloc_canonicalize("fr_FR_PREEURO", loc, 256, &status); + currencyFmt = NumberFormat::createCurrencyInstance(Locale(loc), status); currencyFmt->format(1.50, s); logln((UnicodeString)"Un pauvre en France a....." + s); if (!(s=="1,50 F")) @@ -468,6 +629,31 @@ NumberFormatTest::TestCurrency(void) delete currencyFmt; if (U_FAILURE(status)) errln((UnicodeString)"FAIL: Status " + (int32_t)status); + + for(int i=0; i < (int)(sizeof(testCases)/sizeof(testCases[i])); i++){ + status = U_ZERO_ERROR; + const char *localeID = testCases[i][0]; + UnicodeString expected(testCases[i][1]); + expected = expected.unescape(); + s.truncate(0); + char loc[256]={0}; + uloc_canonicalize(localeID, loc, 256, &status); + currencyFmt = NumberFormat::createCurrencyInstance(Locale(loc), status); + if(U_FAILURE(status)){ + errln("Could not create currency formatter for locale %s",localeID); + continue; + } + currencyFmt->format(1150.50, s); + if(s!=expected){ + errln(UnicodeString("FAIL: Expected: ")+expected + + UnicodeString(" Got: ") + s + + UnicodeString( " for locale: ")+ UnicodeString(localeID) ); + } + if (U_FAILURE(status)){ + errln((UnicodeString)"FAIL: Status " + (int32_t)status); + } + delete currencyFmt; + } } // ------------------------------------- @@ -889,13 +1075,13 @@ void NumberFormatTest::TestPad(void) { int32_t(0), "^^^^0", status); expect2(new DecimalFormat("*^##.##", US, status), -1.3, "^-1.3", status); - expect2(new DecimalFormat("##0.0####E0*_ g-m/s^2", US, status), + expect2(new DecimalFormat("##0.0####E0*_ 'g-m/s^2'", US, status), int32_t(0), "0.0E0______ g-m/s^2", status); - expect(new DecimalFormat("##0.0####E0*_ g-m/s^2", US, status), + expect(new DecimalFormat("##0.0####E0*_ 'g-m/s^2'", US, status), 1.0/3, "333.333E-3_ g-m/s^2", status); - expect2(new DecimalFormat("##0.0####*_ g-m/s^2", US, status), + expect2(new DecimalFormat("##0.0####*_ 'g-m/s^2'", US, status), int32_t(0), "0.0______ g-m/s^2", status); - expect(new DecimalFormat("##0.0####*_ g-m/s^2", US, status), + expect(new DecimalFormat("##0.0####*_ 'g-m/s^2'", US, status), 1.0/3, "0.33333__ g-m/s^2", status); // Test padding before a sign @@ -1081,16 +1267,16 @@ void NumberFormatTest::TestSurrogateSupport(void) { expect2(new DecimalFormat("##.##", custom, status), -1.3, " minus 1decimal3", status); status = U_ZERO_ERROR; - expect2(new DecimalFormat("##0.0####E0 g'-'m/s^2", custom, status), + expect2(new DecimalFormat("##0.0####E0 'g-m/s^2'", custom, status), int32_t(0), "0decimal0exponent0 g-m/s^2", status); status = U_ZERO_ERROR; - expect(new DecimalFormat("##0.0####E0 g'-'m/s^2", custom, status), + expect(new DecimalFormat("##0.0####E0 'g-m/s^2'", custom, status), 1.0/3, "333decimal333exponent minus 3 g-m/s^2", status); status = U_ZERO_ERROR; - expect2(new DecimalFormat("##0.0#### g'-'m/s^2", custom, status), + expect2(new DecimalFormat("##0.0#### 'g-m/s^2'", custom, status), int32_t(0), "0decimal0 g-m/s^2", status); status = U_ZERO_ERROR; - expect(new DecimalFormat("##0.0#### g'-'m/s^2", custom, status), + expect(new DecimalFormat("##0.0#### 'g-m/s^2'", custom, status), 1.0/3, "0decimal33333 g-m/s^2", status); UnicodeString zero((UChar32)0x10000); @@ -1127,7 +1313,7 @@ void NumberFormatTest::TestCurrencyPatterns(void) { UErrorCode ec = U_ZERO_ERROR; NumberFormat* nf = NumberFormat::createCurrencyInstance(locs[i], ec); if (U_FAILURE(ec)) { - errln("FAIL: Can't create NumberFormat"); + errln("FAIL: Can't create NumberFormat(%s) - %s", locs[i].getName(), u_errorName(ec)); } else { // Make sure currency formats do not have a variable number // of fraction digits @@ -1163,56 +1349,93 @@ void NumberFormatTest::TestCurrencyPatterns(void) { } void NumberFormatTest::TestRegCurrency(void) { - UErrorCode status = U_ZERO_ERROR; - const UChar* USD = ucurr_forLocale("en_US", &status); - const UChar* YEN = ucurr_forLocale("ja_JP", &status); - if(U_FAILURE(status)) { - errln("Unable to get currency for locale, error %s", u_errorName(status)); - return; - } - - UCurrRegistryKey enkey = ucurr_register(YEN, "en_US", &status); - UCurrRegistryKey enUSEUROkey = ucurr_register(EUR, "en_US_EURO", &status); - - if (u_strcmp(YEN, ucurr_forLocale("en_US", &status)) != 0) { - errln("FAIL: didn't return YEN registered for en_US"); - } - - if (u_strcmp(EUR, ucurr_forLocale("en_US_EURO", &status)) != 0) { - errln("FAIL: didn't return EUR for en_US_EURO"); - } - - if (ucurr_forLocale("en_XX_BAR", &status) != NULL) { - errln("FAIL: tried to fallback en_XX_BAR"); - } - status = U_ZERO_ERROR; // reset - - if (!ucurr_unregister(enkey, &status)) { - errln("FAIL: couldn't unregister enkey"); - } - - if (u_strcmp(USD, ucurr_forLocale("en_US", &status)) != 0) { - errln("FAIL: didn't return USD for en_US after unregister of en_US"); - } - status = U_ZERO_ERROR; // reset - - if (u_strcmp(EUR, ucurr_forLocale("en_US_EURO", &status)) != 0) { - errln("FAIL: didn't return EUR for en_US_EURO after unregister of en_US"); - } +#if !UCONFIG_NO_SERVICE + UErrorCode status = U_ZERO_ERROR; + UChar USD[4]; + ucurr_forLocale("en_US", USD, 4, &status); + UChar YEN[4]; + ucurr_forLocale("ja_JP", YEN, 4, &status); + UChar TMP[4]; + static const UChar QQQ[] = {0x51, 0x51, 0x51, 0}; + if(U_FAILURE(status)) { + errln("Unable to get currency for locale, error %s", u_errorName(status)); + return; + } + + UCurrRegistryKey enkey = ucurr_register(YEN, "en_US", &status); + UCurrRegistryKey enUSEUROkey = ucurr_register(QQQ, "en_US_EURO", &status); + + ucurr_forLocale("en_US", TMP, 4, &status); + if (u_strcmp(YEN, TMP) != 0) { + errln("FAIL: didn't return YEN registered for en_US"); + } - if (u_strcmp(USD, ucurr_forLocale("en_US_BLAH", &status)) != 0) { - errln("FAIL: could not find USD for en_US_BLAH after unregister of en"); - } - status = U_ZERO_ERROR; // reset + ucurr_forLocale("en_US_EURO", TMP, 4, &status); + if (u_strcmp(QQQ, TMP) != 0) { + errln("FAIL: didn't return QQQ for en_US_EURO"); + } + + int32_t fallbackLen = ucurr_forLocale("en_XX_BAR", TMP, 4, &status); + if (fallbackLen) { + errln("FAIL: tried to fallback en_XX_BAR"); + } + status = U_ZERO_ERROR; // reset + + if (!ucurr_unregister(enkey, &status)) { + errln("FAIL: couldn't unregister enkey"); + } - if (!ucurr_unregister(enUSEUROkey, &status)) { - errln("FAIL: couldn't unregister enUSEUROkey"); - } + ucurr_forLocale("en_US", TMP, 4, &status); + if (u_strcmp(USD, TMP) != 0) { + errln("FAIL: didn't return USD for en_US after unregister of en_US"); + } + status = U_ZERO_ERROR; // reset + + ucurr_forLocale("en_US_EURO", TMP, 4, &status); + if (u_strcmp(QQQ, TMP) != 0) { + errln("FAIL: didn't return QQQ for en_US_EURO after unregister of en_US"); + } + + ucurr_forLocale("en_US_BLAH", TMP, 4, &status); + if (u_strcmp(USD, TMP) != 0) { + errln("FAIL: could not find USD for en_US_BLAH after unregister of en"); + } + status = U_ZERO_ERROR; // reset + + if (!ucurr_unregister(enUSEUROkey, &status)) { + errln("FAIL: couldn't unregister enUSEUROkey"); + } + + ucurr_forLocale("en_US_EURO", TMP, 4, &status); + if (u_strcmp(EUR, TMP) != 0) { + errln("FAIL: didn't return EUR for en_US_EURO after unregister of en_US_EURO"); + } + status = U_ZERO_ERROR; // reset +#endif +} - if (ucurr_forLocale("en_US_EURO", &status) != NULL) { - errln("FAIL: didn't return NULL for en_US_EURO after unregister of en_US_EURO"); - } - status = U_ZERO_ERROR; // reset +void NumberFormatTest::TestCurrencyNames(void) { + // Do a basic check of getName() + // USD { "US$", "US Dollar" } // 04/04/1792- + UErrorCode ec = U_ZERO_ERROR; + static const UChar USD[] = {85, 83, 68, 0}; /*USD*/ + UBool isChoiceFormat; + int32_t len; + // Warning: HARD-CODED LOCALE DATA in this test. If it fails, CHECK + // THE LOCALE DATA before diving into the code. + assertEquals("USD.getName(SYMBOL_NAME)", + UnicodeString("US$"), + UnicodeString(ucurr_getName(USD, "en", + UCURR_SYMBOL_NAME, + &isChoiceFormat, &len, &ec))); + assertEquals("USD.getName(LONG_NAME)", + UnicodeString("US Dollar"), + UnicodeString(ucurr_getName(USD, "en", + UCURR_LONG_NAME, + &isChoiceFormat, &len, &ec))); + assertSuccess("ucurr_getName", ec); + + // TODO add more tests later } void NumberFormatTest::TestSymbolsWithBadLocale(void) { @@ -1233,10 +1456,14 @@ void NumberFormatTest::TestSymbolsWithBadLocale(void) { if (strcmp(mySymbols.getLocale().getName(), locBad.getName()) != 0) { errln("DecimalFormatSymbols does not have the right locale."); } - DecimalFormatSymbols::ENumberFormatSymbol symbolEnum; - int *symbolEnumPtr = (int*)(&symbolEnum); - for (symbolEnum = DecimalFormatSymbols::kDecimalSeparatorSymbol; symbolEnum < DecimalFormatSymbols::kFormatSymbolCount; (*symbolEnumPtr)++) { - if (mySymbols.getSymbol(symbolEnum).length() == 0 && symbolEnum != DecimalFormatSymbols::kGroupingSeparatorSymbol) { + int symbolEnum = (int)DecimalFormatSymbols::kDecimalSeparatorSymbol; + for (; symbolEnum < (int)DecimalFormatSymbols::kFormatSymbolCount; symbolEnum++) { + logln(UnicodeString("DecimalFormatSymbols[") + symbolEnum + UnicodeString("] = ") + + prettify(mySymbols.getSymbol((DecimalFormatSymbols::ENumberFormatSymbol)symbolEnum))); + + if (mySymbols.getSymbol((DecimalFormatSymbols::ENumberFormatSymbol)symbolEnum).length() == 0 + && symbolEnum != (int)DecimalFormatSymbols::kGroupingSeparatorSymbol) + { errln("DecimalFormatSymbols has an empty string at index %d.", symbolEnum); } } @@ -1320,22 +1547,327 @@ void NumberFormatTest::TestAdoptDecimalFormatSymbols(void) { } } +void NumberFormatTest::TestPerMill() { + UErrorCode ec = U_ZERO_ERROR; + UnicodeString str; + DecimalFormat fmt(ctou("###.###\\u2030"), ec); + if (!assertSuccess("DecimalFormat ct", ec)) return; + assertEquals("0.4857 x ###.###\\u2030", + ctou("485.7\\u2030"), fmt.format(0.4857, str)); + + DecimalFormatSymbols sym(Locale::getUS(), ec); + sym.setSymbol(DecimalFormatSymbols::kPerMillSymbol, ctou("m")); + DecimalFormat fmt2("", sym, ec); + fmt2.applyLocalizedPattern("###.###m", ec); + if (!assertSuccess("setup", ec)) return; + str.truncate(0); + assertEquals("0.4857 x ###.###m", + "485.7m", fmt2.format(0.4857, str)); +} + +/** + * Generic test for patterns that should be legal/illegal. + */ +void NumberFormatTest::TestIllegalPatterns() { + // Test cases: + // Prefix with "-:" for illegal patterns + // Prefix with "+:" for legal patterns + const char* DATA[] = { + // Unquoted special characters in the suffix are illegal + "-:000.000|###", + "+:000.000'|###'", + 0 + }; + for (int32_t i=0; DATA[i]; ++i) { + const char* pat=DATA[i]; + UBool valid = (*pat) == '+'; + pat += 2; + UErrorCode ec = U_ZERO_ERROR; + DecimalFormat fmt(pat, ec); // locale doesn't matter here + if (U_SUCCESS(ec) == valid) { + logln("Ok: pattern \"%s\": %s", + pat, u_errorName(ec)); + } else { + errln("FAIL: pattern \"%s\" should have %s; got %s", + pat, (valid?"succeeded":"failed"), + u_errorName(ec)); + } + } +} + +//---------------------------------------------------------------------- + +static const char* KEYWORDS[] = { + /*0*/ "ref=", // + /*1*/ "loc=", // + /*2*/ "f:", // + /*3*/ "fp:", // + /*4*/ "rt:", // <(exp.) number> <(exp.) string> + /*5*/ "p:", // + /*6*/ "perr:", // + /*7*/ "pat:", // + /*8*/ "fpc:", // + 0 +}; + +/** + * Return an integer representing the next token from this + * iterator. The integer will be an index into the given list, or + * -1 if there are no more tokens, or -2 if the token is not on + * the list. + */ +static int32_t keywordIndex(const UnicodeString& tok) { + for (int32_t i=0; KEYWORDS[i]!=0; ++i) { + if (tok==KEYWORDS[i]) { + return i; + } + } + return -1; +} + +/** + * Parse a CurrencyAmount using the given NumberFormat, with + * the 'delim' character separating the number and the currency. + */ +static void parseCurrencyAmount(const UnicodeString& str, + const NumberFormat& fmt, + UChar delim, + Formattable& result, + UErrorCode& ec) { + UnicodeString num, cur; + int32_t i = str.indexOf(delim); + str.extractBetween(0, i, num); + str.extractBetween(i+1, INT32_MAX, cur); + Formattable n; + fmt.parse(num, n, ec); + result.adoptObject(new CurrencyAmount(n, cur.getTerminatedBuffer(), ec)); +} + +void NumberFormatTest::TestCases() { + UErrorCode ec = U_ZERO_ERROR; + TextFile reader("NumberFormatTestCases.txt", "UTF8", ec); + if (U_FAILURE(ec)) { + errln("FAIL: Couldn't open NumberFormatTestCases.txt"); + return; + } + TokenIterator tokens(&reader); + + Locale loc("en", "US", ""); + DecimalFormat *ref = 0, *fmt = 0; + MeasureFormat *mfmt = 0; + UnicodeString pat, tok, mloc, str, out, where, currAmt; + Formattable n; + + for (;;) { + ec = U_ZERO_ERROR; + if (!tokens.next(tok, ec)) { + break; + } + where = UnicodeString("(") + tokens.getLineNumber() + ") "; + int32_t cmd = keywordIndex(tok); + switch (cmd) { + case 0: + // ref= + if (!tokens.next(tok, ec)) goto error; + delete ref; + ref = new DecimalFormat(tok, + new DecimalFormatSymbols(Locale::getUS(), ec), ec); + break; + case 1: + // loc= + if (!tokens.next(tok, ec)) goto error; + loc = Locale::createFromName(CharString(tok)); + break; + case 2: // f: + case 3: // fp: + case 4: // rt: + case 5: // p: + if (!tokens.next(tok, ec)) goto error; + if (tok != "-") { + pat = tok; + delete fmt; + fmt = new DecimalFormat(pat, new DecimalFormatSymbols(loc, ec), ec); + if (U_FAILURE(ec)) { + errln("FAIL: " + where + "Pattern \"" + pat + "\": " + u_errorName(ec)); + ec = U_ZERO_ERROR; + if (!tokens.next(tok, ec)) goto error; + if (!tokens.next(tok, ec)) goto error; + if (cmd == 3) { + if (!tokens.next(tok, ec)) goto error; + } + continue; + } + } + if (cmd == 2 || cmd == 3 || cmd == 4) { + // f: + // fp: + // rt: + UnicodeString num; + if (!tokens.next(num, ec)) goto error; + if (!tokens.next(str, ec)) goto error; + ref->parse(num, n, ec); + assertSuccess("parse", ec); + assertEquals(where + "\"" + pat + "\".format(" + num + ")", + str, fmt->format(n, out.remove(), ec)); + assertSuccess("format", ec); + if (cmd == 3) { // fp: + if (!tokens.next(num, ec)) goto error; + ref->parse(num, n, ec); + assertSuccess("parse", ec); + } + if (cmd != 2) { // != f: + Formattable m; + fmt->parse(str, m, ec); + assertSuccess("parse", ec); + assertEquals(where + "\"" + pat + "\".parse(\"" + str + "\")", + n, m); + } + } + // p: + else { + UnicodeString expstr; + if (!tokens.next(str, ec)) goto error; + if (!tokens.next(expstr, ec)) goto error; + Formattable exp, n; + ref->parse(expstr, exp, ec); + assertSuccess("parse", ec); + fmt->parse(str, n, ec); + assertSuccess("parse", ec); + assertEquals(where + "\"" + pat + "\".parse(\"" + str + "\")", + exp, n); + } + break; + case 8: // fpc: + if (!tokens.next(tok, ec)) goto error; + if (tok != "-") { + mloc = tok; + delete mfmt; + mfmt = MeasureFormat::createCurrencyFormat( + Locale::createFromName(CharString(mloc)), ec); + if (U_FAILURE(ec)) { + errln("FAIL: " + where + "Loc \"" + mloc + "\": " + u_errorName(ec)); + ec = U_ZERO_ERROR; + if (!tokens.next(tok, ec)) goto error; + if (!tokens.next(tok, ec)) goto error; + if (!tokens.next(tok, ec)) goto error; + continue; + } + } + // fpc: + if (!tokens.next(currAmt, ec)) goto error; + if (!tokens.next(str, ec)) goto error; + parseCurrencyAmount(currAmt, *ref, (UChar)0x2F/*'/'*/, n, ec); + if (assertSuccess("parseCurrencyAmount", ec)) { + assertEquals(where + "getCurrencyFormat(" + mloc + ").format(" + currAmt + ")", + str, mfmt->format(n, out.remove(), ec)); + assertSuccess("format", ec); + } + if (!tokens.next(currAmt, ec)) goto error; + parseCurrencyAmount(currAmt, *ref, (UChar)0x2F/*'/'*/, n, ec); + if (assertSuccess("parseCurrencyAmount", ec)) { + Formattable m; + mfmt->parseObject(str, m, ec); + if (assertSuccess("parseCurrency", ec)) { + assertEquals(where + "getCurrencyFormat(" + mloc + ").parse(\"" + str + "\")", + n, m); + } + } + break; + case 6: + // perr: + errln("FAIL: Under construction"); + goto done; + case 7: { + // pat: + UnicodeString testpat; + UnicodeString exppat; + if (!tokens.next(testpat, ec)) goto error; + if (!tokens.next(exppat, ec)) goto error; + UBool err = exppat == "err"; + UBool existingPat = FALSE; + if (testpat == "-") { + if (err) { + errln("FAIL: " + where + "Invalid command \"pat: - err\""); + continue; + } + existingPat = TRUE; + testpat = pat; + } + if (exppat == "-") exppat = testpat; + DecimalFormat* f = 0; + UErrorCode ec2 = U_ZERO_ERROR; + if (existingPat) { + f = fmt; + } else { + f = new DecimalFormat(testpat, ec2); + } + if (U_SUCCESS(ec2)) { + if (err) { + errln("FAIL: " + where + "Invalid pattern \"" + testpat + + "\" was accepted"); + } else { + UnicodeString pat2; + assertEquals(where + "\"" + testpat + "\".toPattern()", + exppat, f->toPattern(pat2)); + } + } else { + if (err) { + logln("Ok: " + where + "Invalid pattern \"" + testpat + + "\" failed: " + u_errorName(ec2)); + } else { + errln("FAIL: " + where + "Valid pattern \"" + testpat + + "\" failed: " + u_errorName(ec2)); + } + } + if (!existingPat) delete f; + } break; + case -1: + errln("FAIL: " + where + "Unknown command \"" + tok + "\""); + goto done; + } + } + goto done; + + error: + if (U_SUCCESS(ec)) { + errln("FAIL: Unexpected EOF"); + } else { + errln("FAIL: " + where + "Unexpected " + u_errorName(ec)); + } + + done: + delete mfmt; + delete fmt; + delete ref; +} + + //---------------------------------------------------------------------- // Support methods //---------------------------------------------------------------------- UBool NumberFormatTest::equalValue(const Formattable& a, const Formattable& b) { + if (a.getType() == b.getType()) { + return a == b; + } + if (a.getType() == Formattable::kLong) { - if (b.getType() == Formattable::kLong) { + if (b.getType() == Formattable::kInt64) { return a.getLong() == b.getLong(); } else if (b.getType() == Formattable::kDouble) { - return (double) a.getLong() == b.getDouble(); + return (double) a.getLong() == b.getDouble(); // TODO check use of double instead of long } } else if (a.getType() == Formattable::kDouble) { if (b.getType() == Formattable::kLong) { return a.getDouble() == (double) b.getLong(); + } else if (b.getType() == Formattable::kInt64) { + return a.getDouble() == (double)b.getInt64(); + } + } else if (a.getType() == Formattable::kInt64) { + if (b.getType() == Formattable::kLong) { + return a.getInt64() == (int64_t)b.getLong(); } else if (b.getType() == Formattable::kDouble) { - return a.getDouble() == b.getDouble(); + return a.getInt64() == (int64_t)b.getDouble(); } } return FALSE; @@ -1433,14 +1965,13 @@ void NumberFormatTest::expectCurrency(NumberFormat& nf, const Locale& locale, UErrorCode ec = U_ZERO_ERROR; DecimalFormat& fmt = * (DecimalFormat*) &nf; const UChar DEFAULT_CURR[] = {45/*-*/,0}; - const UChar* curr = DEFAULT_CURR; + UChar curr[4]; + u_strcpy(curr, DEFAULT_CURR); if (*locale.getLanguage() != 0) { - curr = ucurr_forLocale(locale.getName(), &ec); - if (U_FAILURE(ec)) { - errln("FAIL: UCurrency::forLocale"); - return; - } - fmt.setCurrency(curr); + ucurr_forLocale(locale.getName(), curr, 4, &ec); + assertSuccess("ucurr_forLocale", ec); + fmt.setCurrency(curr, ec); + assertSuccess("DecimalFormat::setCurrency", ec); } UnicodeString s; fmt.format(value, s); @@ -1503,9 +2034,11 @@ void NumberFormatTest::expectPad(DecimalFormat& fmt, const UnicodeString& pat, apadStr = pad; } if (apos == pos && awidth == width && apadStr == pad) { - logln(UnicodeString("Ok \"") + pat + "\" pos=" + apos + - ((pos == ILLEGAL) ? UnicodeString() : - (UnicodeString(" width=") + awidth + " pad=" + apadStr))); + UnicodeString infoStr; + if (pos == ILLEGAL) { + infoStr = UnicodeString(" width=", "") + awidth + UnicodeString(" pad=", "") + apadStr; + } + logln(UnicodeString("Ok \"") + pat + "\" pos=" + apos + infoStr); } else { errln(UnicodeString("FAIL \"") + pat + "\" pos=" + apos + " width=" + awidth + " pad=" + apadStr + diff --git a/icuSources/test/intltest/numfmtst.h b/icuSources/test/intltest/numfmtst.h index 60e32b80..07ab0aa1 100644 --- a/icuSources/test/intltest/numfmtst.h +++ b/icuSources/test/intltest/numfmtst.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -75,6 +75,12 @@ class NumberFormatTest: public CalendarTimeZoneTest { void TestScientific(void); + void TestScientific2(void); + + void TestScientificGrouping(void); + + void TestInt64(void); + void TestSurrogateSupport(void); /** @@ -94,10 +100,18 @@ class NumberFormatTest: public CalendarTimeZoneTest { */ void TestRegCurrency(void); + void TestCurrencyNames(void); + void TestSymbolsWithBadLocale(void); void TestAdoptDecimalFormatSymbols(void); + void TestPerMill(void); + + void TestIllegalPatterns(void); + + void TestCases(void); + private: static UBool equalValue(const Formattable& a, const Formattable& b); diff --git a/icuSources/test/intltest/numrgts.cpp b/icuSources/test/intltest/numrgts.cpp index 0bdb2597..bfc26475 100644 --- a/icuSources/test/intltest/numrgts.cpp +++ b/icuSources/test/intltest/numrgts.cpp @@ -1,8 +1,8 @@ -/******************************************************************** +/*********************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ + * Copyright (c) 1997-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ***********************************************************************/ #include "unicode/utypes.h" @@ -11,6 +11,7 @@ #include "numrgts.h" #include // DBL_MIN, DBL_MAX +#include #include "unicode/dcfmtsym.h" #include "unicode/decimfmt.h" @@ -18,10 +19,12 @@ #include "unicode/resbund.h" #include "unicode/calendar.h" #include "unicode/datefmt.h" +#include "putilimp.h" + int32_t gMyNumberFormatTestClassID; UClassID MyNumberFormatTest::getDynamicClassID() const { - return (UClassID)&gMyNumberFormatTestClassID; + return (UClassID)&gMyNumberFormatTestClassID; } @@ -102,12 +105,36 @@ NumberFormatRegressionTest::runIndexedTest( int32_t index, UBool exec, const cha } } +UBool +NumberFormatRegressionTest::failure(UErrorCode status, const UnicodeString& msg, const Locale& l) +{ + if(U_FAILURE(status)) { + errln(UnicodeString("FAIL: ", "") + msg + + UnicodeString(" failed, error ", "") + UnicodeString(u_errorName(status), "") + UnicodeString(l.getName(),"")); + return TRUE; + } + + return FALSE; +} + +UBool +NumberFormatRegressionTest::failure(UErrorCode status, const UnicodeString& msg, const char *l) +{ + if(U_FAILURE(status)) { + errln(UnicodeString("FAIL: ", "") + msg + + UnicodeString(" failed, error ", "") + UnicodeString(u_errorName(status), "") + UnicodeString(l, "")); + return TRUE; + } + + return FALSE; +} + UBool NumberFormatRegressionTest::failure(UErrorCode status, const UnicodeString& msg) { if(U_FAILURE(status)) { errln(UnicodeString("FAIL: ", "") + msg - + UnicodeString(" failed, error ", "") + UnicodeString(u_errorName(status), "")); + + UnicodeString(" failed, error ", "") + UnicodeString(u_errorName(status), "")); return TRUE; } @@ -170,7 +197,7 @@ void NumberFormatRegressionTest::Test4088161 (void) { UErrorCode status = U_ZERO_ERROR; DecimalFormat *df = new DecimalFormat(status); - failure(status, "new DecimalFormat"); + failure(status, "new DecimalFormat", ""); double d = 100; df->setMinimumFractionDigits(0); df->setMaximumFractionDigits(16); @@ -199,13 +226,13 @@ void NumberFormatRegressionTest::Test4087245 (void) { UErrorCode status = U_ZERO_ERROR; DecimalFormatSymbols *symbols = new DecimalFormatSymbols(status); - failure(status, "new DecimalFormatSymbols"); + failure(status, "new DecimalFormatSymbols", ""); // {sfb} One note about this test: if you pass in a pointer // to the symbols, they are adopted and this test will fail, // even though that is the correct behavior. To test the cloning // of the symbols, it is necessary to pass in a reference to the symbols DecimalFormat *df = new DecimalFormat("#,##0.0", *symbols, status); - failure(status, "new DecimalFormat with symbols"); + failure(status, "new DecimalFormat with symbols", ""); int32_t n = 123; UnicodeString buf1; UnicodeString buf2; @@ -229,7 +256,7 @@ void NumberFormatRegressionTest::Test4087535 (void) { UErrorCode status = U_ZERO_ERROR; DecimalFormat *df = new DecimalFormat(status); - failure(status, "new DecimalFormat"); + failure(status, "new DecimalFormat", ""); df->setMinimumIntegerDigits(0); double n = 0; @@ -254,7 +281,7 @@ void NumberFormatRegressionTest::Test4088503 (void) { UErrorCode status = U_ZERO_ERROR; DecimalFormat *df = new DecimalFormat(status); - failure(status, "new DecimalFormat"); + failure(status, "new DecimalFormat", ""); df->setGroupingSize(0); UnicodeString sBuf; FieldPosition fp(FieldPosition::DONT_CARE); @@ -285,7 +312,7 @@ NumberFormatRegressionTest::assignFloatValue(float returnfloat) logln(UnicodeString(" VALUE ") + returnfloat); UErrorCode status = U_ZERO_ERROR; NumberFormat *nfcommon = NumberFormat::createCurrencyInstance(Locale::getUS(), status); - failure(status, "NumberFormat::createCurrencyInstance"); + failure(status, "NumberFormat::createCurrencyInstance", Locale::getUS()); nfcommon->setGroupingUsed(FALSE); UnicodeString stringValue; @@ -293,7 +320,7 @@ NumberFormatRegressionTest::assignFloatValue(float returnfloat) logln(" DISPLAYVALUE " + stringValue); Formattable result; nfcommon->parse(stringValue, result, status); - failure(status, "nfcommon->parse"); + failure(status, "nfcommon->parse", Locale::getUS()); float floatResult = (float) (result.getType() == Formattable::kDouble ? result.getDouble() : result.getLong()); if( uprv_fabs(floatResult - returnfloat) > 0.0001) @@ -312,12 +339,12 @@ void NumberFormatRegressionTest::Test4059870(void) { UErrorCode status = U_ZERO_ERROR; DecimalFormat *format = new DecimalFormat("00", status); - failure(status, "new Decimalformat"); + failure(status, "new Decimalformat", Locale::getUS()); //try { Formattable result; UnicodeString str; format->parse(UnicodeString("0"), result, status); - failure(status, "format->parse"); + failure(status, "format->parse", Locale::getUS()); /*} catch (Exception e) { @@ -335,7 +362,7 @@ void NumberFormatRegressionTest::Test4083018 (void) { UErrorCode status = U_ZERO_ERROR; DecimalFormatSymbols *dfs = new DecimalFormatSymbols(status); - failure(status, "new DecimalFormatSymbols"); + failure(status, "new DecimalFormatSymbols", Locale::getUS()); //try { if (dfs != NULL) logln("Test Passed!"); @@ -356,7 +383,7 @@ void NumberFormatRegressionTest::Test4071492 (void) double x = 0.00159999; UErrorCode status = U_ZERO_ERROR; NumberFormat *nf = NumberFormat::createInstance(status); - failure(status, "NumberFormat::createInstance"); + failure(status, "NumberFormat::createInstance", Locale::getUS()); nf->setMaximumFractionDigits(4); UnicodeString out; FieldPosition pos(FieldPosition::DONT_CARE); @@ -385,7 +412,7 @@ void NumberFormatRegressionTest::Test4086575(void) delete nf1; return; } - failure(status, "NumberFormat::createInstance"); + failure(status, "NumberFormat::createInstance", Locale::getFrance()); // C++ workaround to make sure cast works // Wouldn't dynamic_cast be great? @@ -402,7 +429,7 @@ void NumberFormatRegressionTest::Test4086575(void) // No group separator logln("...applyLocalizedPattern ###,00;(###,00) "); nf->applyLocalizedPattern(UnicodeString("###,00;(###,00)"), status); - failure(status, "nf->applyLocalizedPattern"); + failure(status, "nf->applyLocalizedPattern", Locale::getFrance()); logln("nf toPattern2: " + nf->toPattern(temp)); logln("nf toLocPattern2: " + nf->toLocalizedPattern(temp)); @@ -421,7 +448,7 @@ void NumberFormatRegressionTest::Test4086575(void) }; UnicodeString pat(patChars, 19, 19); nf->applyLocalizedPattern(pat, status); - failure(status, "nf->applyLocalizedPattern"); + failure(status, "nf->applyLocalizedPattern", Locale::getFrance()); logln("nf toPattern2: " + nf->toPattern(temp)); logln("nf toLocPattern2: " + nf->toLocalizedPattern(temp)); UnicodeString buffer; @@ -616,7 +643,7 @@ void NumberFormatRegressionTest::Test4095713 (void) delete df; return; } - failure(status, "new DecimalFOrmat"); + failure(status, "new DecimalFormat"); UnicodeString str("0.1234"); double d1 = 0.1234; //Double d1 = new Double(str); @@ -715,8 +742,10 @@ void NumberFormatRegressionTest::Test4092480 (void) * interpreted as monetary separator if currency symbol is seen! */ void NumberFormatRegressionTest::Test4087244 (void) { - Locale *de = new Locale("pt","PT_PREEURO"); UErrorCode status = U_ZERO_ERROR; + char loc[256] = {0}; + uloc_canonicalize("pt_PT_PREEURO", loc, 256, &status); + Locale *de = new Locale(loc); NumberFormat *nf = NumberFormat::createCurrencyInstance(*de, status); if(U_FAILURE(status)) { errln("Error creating DecimalFormat: %s", u_errorName(status)); @@ -782,13 +811,15 @@ void NumberFormatRegressionTest::Test4070798 (void) UnicodeString expectedPercent(chars3, 9, 9); UErrorCode status = U_ZERO_ERROR; - formatter = NumberFormat::createInstance(Locale("fr_FR_PREEURO"), status); + char loc[256]={0}; + int len = uloc_canonicalize("fr_FR_PREEURO", loc, 256, &status); + formatter = NumberFormat::createInstance(Locale(loc), status); if(U_FAILURE(status)) { errln("Error creating DecimalFormat: %s", u_errorName(status)); delete formatter; return; } - failure(status, "NumberFormat::createNumberInstance"); + failure(status, "NumberFormat::createNumberInstance", loc); tempString = formatter->format (-5789.9876, tempString); if (tempString == expectedDefault) { @@ -799,9 +830,9 @@ void NumberFormatRegressionTest::Test4070798 (void) " Received " + tempString ); } delete formatter; - - formatter = NumberFormat::createCurrencyInstance(Locale("fr_FR_PREEURO"), status); - failure(status, "NumberFormat::createCurrencyInstance"); + len = uloc_canonicalize("fr_FR_PREEURO", loc, 256, &status); + formatter = NumberFormat::createCurrencyInstance(loc, status); + failure(status, "NumberFormat::createCurrencyInstance", loc); tempString.remove(); tempString = formatter->format( 5789.9876, tempString ); @@ -813,9 +844,10 @@ void NumberFormatRegressionTest::Test4070798 (void) " Received " + tempString ); } delete formatter; - - formatter = NumberFormat::createPercentInstance(Locale("fr_FR_PREEURO"), status); - failure(status, "NumberFormat::createPercentInstance"); + + uloc_canonicalize("fr_FR_PREEURO", loc, 256, &status); + formatter = NumberFormat::createPercentInstance(Locale(loc), status); + failure(status, "NumberFormat::createPercentInstance", loc); tempString.remove(); tempString = formatter->format (-5789.9876, tempString); @@ -856,7 +888,7 @@ void NumberFormatRegressionTest::Test4071005 (void) UErrorCode status = U_ZERO_ERROR; formatter = NumberFormat::createInstance(Locale::getCanadaFrench(), status); - failure(status, "NumberFormat::createNumberInstance"); + failure(status, "NumberFormat::createNumberInstance", Locale::getCanadaFrench()); tempString = formatter->format (-5789.9876, tempString); if (tempString == expectedDefault) { @@ -869,7 +901,7 @@ void NumberFormatRegressionTest::Test4071005 (void) delete formatter; formatter = NumberFormat::createCurrencyInstance(Locale::getCanadaFrench(), status); - failure(status, "NumberFormat::createCurrencyInstance"); + failure(status, "NumberFormat::createCurrencyInstance", Locale::getCanadaFrench()); tempString.remove(); tempString = formatter->format( 5789.9876, tempString ); @@ -883,7 +915,7 @@ void NumberFormatRegressionTest::Test4071005 (void) delete formatter; formatter = NumberFormat::createPercentInstance(Locale::getCanadaFrench(), status); - failure(status, "NumberFormat::createPercentInstance"); + failure(status, "NumberFormat::createPercentInstance", Locale::getCanadaFrench()); tempString.remove(); tempString = formatter->format (-5789.9876, tempString); @@ -915,8 +947,10 @@ void NumberFormatRegressionTest::Test4071014 (void) UnicodeString expectedPercent("-578.999%"); UErrorCode status = U_ZERO_ERROR; - formatter = NumberFormat::createInstance(Locale("de_DE_PREEURO"), status); - failure(status, "NumberFormat::createNumberInstance"); + char loc[256]={0}; + uloc_canonicalize("de_DE_PREEURO", loc, 256, &status); + formatter = NumberFormat::createInstance(Locale(loc), status); + failure(status, "NumberFormat::createNumberInstance", loc); tempString.remove(); tempString = formatter->format (-5789.9876, tempString); @@ -928,9 +962,9 @@ void NumberFormatRegressionTest::Test4071014 (void) " Received " + tempString ); } delete formatter; - - formatter = NumberFormat::createCurrencyInstance(Locale("de_DE_PREEURO"), status); - failure(status, "NumberFormat::createCurrencyInstance"); + uloc_canonicalize("de_DE_PREEURO", loc, 256, &status); + formatter = NumberFormat::createCurrencyInstance(Locale(loc), status); + failure(status, "NumberFormat::createCurrencyInstance", loc); tempString.remove(); tempString = formatter->format( 5789.9876, tempString ); @@ -944,7 +978,7 @@ void NumberFormatRegressionTest::Test4071014 (void) delete formatter; formatter = NumberFormat::createPercentInstance(Locale::getGermany(), status); - failure(status, "NumberFormat::createPercentInstance"); + failure(status, "NumberFormat::createPercentInstance", Locale::getGermany()); tempString.remove(); tempString = formatter->format (-5789.9876, tempString); @@ -976,7 +1010,9 @@ void NumberFormatRegressionTest::Test4071859 (void) expectedCurrency = expectedCurrency.unescape(); UErrorCode status = U_ZERO_ERROR; - formatter = NumberFormat::createInstance(Locale("it_IT_PREEURO"), status); + char loc[256]={0}; + uloc_canonicalize("it_IT_PREEURO", loc, 256, &status); + formatter = NumberFormat::createInstance(Locale(loc), status); failure(status, "NumberFormat::createNumberInstance"); tempString = formatter->format (-5789.9876, tempString); @@ -988,8 +1024,8 @@ void NumberFormatRegressionTest::Test4071859 (void) " Received " + tempString ); } delete formatter; - - formatter = NumberFormat::createCurrencyInstance(Locale("it_IT_PREEURO"), status); + uloc_canonicalize("it_IT_PREEURO", loc, 256, &status); + formatter = NumberFormat::createCurrencyInstance(Locale(loc), status); failure(status, "NumberFormat::createCurrencyInstance"); tempString.remove(); tempString = formatter->format( -5789.9876, tempString ); @@ -1002,8 +1038,8 @@ void NumberFormatRegressionTest::Test4071859 (void) " Received " + tempString ); } delete formatter; - - formatter = NumberFormat::createPercentInstance(Locale("it_IT_PREEURO"), status); + uloc_canonicalize("it_IT_PREEURO", loc, 256, &status); + formatter = NumberFormat::createPercentInstance(Locale(loc), status); failure(status, "NumberFormat::createPercentInstance"); tempString.remove(); tempString = formatter->format (-5789.9876, tempString); @@ -1306,7 +1342,7 @@ void NumberFormatRegressionTest::Test4106658(void) UnicodeString temp; FieldPosition pos(FieldPosition::DONT_CARE); -#if defined(HPUX) +#if defined(U_HPUX) d1 = 0.0 * -1.0; // old HPUX compiler ignores volatile keyword #else d1 *= -1.0; // Some compilers have a problem with defining -0.0 @@ -1437,7 +1473,7 @@ void NumberFormatRegressionTest::Test4106667(void) FieldPosition pos(FieldPosition::DONT_CARE); logln("pattern: \"" + df->toPattern(temp) + "\""); -#if defined(HPUX) +#if defined(U_HPUX) d = 0.0 * -1.0; // old HPUX compiler ignores volatile keyword #else d *= -1.0; // Some compilers have a problem with defining -0.0 @@ -1493,7 +1529,7 @@ void NumberFormatRegressionTest::Test4122840(void) for (int i = 0; i < count; i++) { UErrorCode status = U_ZERO_ERROR; ResourceBundle *rb = new ResourceBundle( - u_getDataDirectory()/*"java.text.resources.LocaleElements"*/, + NULL/*"java.text.resources.LocaleElements"*/, locales[i], status); failure(status, "new ResourceBundle"); ResourceBundle numPat = rb->get("NumberPatterns", status); @@ -1850,7 +1886,7 @@ void NumberFormatRegressionTest::Test4147706(void) volatile double d1 = 0.0; // volatile to prevent code optimization double d2 = -0.0001; -#if defined(HPUX) +#if defined(U_HPUX) d1 = 0.0 * -1.0; // old HPUX compiler ignores volatile keyword #else d1 *= -1.0; // Some compilers have a problem with defining -0.0 @@ -1915,10 +1951,16 @@ NumberFormatRegressionTest::Test4162198(void) //} //logln("The string " + s + " parsed as " + n); - - if(n.getDouble() != dbl) { + + // {dlf} The old code assumes n is a double, but it isn't any more... + // Formattable apparently does not and never did interconvert... too bad. + //if(n.getDouble() != dbl) { + // errln("Round trip failure"); + //} + if (n.getInt64() != dbl) { errln("Round trip failure"); } + delete f; } @@ -2103,9 +2145,9 @@ void NumberFormatRegressionTest::Test4212072(void) { UErrorCode status = U_ZERO_ERROR; DecimalFormatSymbols sym(Locale::getUS(), status); - failure(status, "DecimalFormatSymbols ct"); + failure(status, "DecimalFormatSymbols ct", Locale::getUS()); DecimalFormat fmt(UnicodeString("#"), sym, status); - failure(status, "DecimalFormat ct"); + failure(status, "DecimalFormat ct", Locale::getUS()); UnicodeString s; FieldPosition pos; @@ -2204,15 +2246,15 @@ void NumberFormatRegressionTest::Test4212072(void) { switch (j) { case 0: nf = NumberFormat::createInstance(avail[i], status); - failure(status, "createInstance"); + failure(status, "createInstance", avail[i]); break; case 1: nf = NumberFormat::createCurrencyInstance(avail[i], status); - failure(status, "createCurrencyInstance"); + failure(status, "createCurrencyInstance", avail[i]); break; default: nf = NumberFormat::createPercentInstance(avail[i], status); - failure(status, "createPercentInstance"); + failure(status, "createPercentInstance", avail[i]); break; } if (U_FAILURE(status)) { @@ -2224,7 +2266,7 @@ void NumberFormatRegressionTest::Test4212072(void) { UnicodeString pat; df->toPattern(pat); DecimalFormatSymbols symb(avail[i], status); - failure(status, "Construct DecimalFormatSymbols"); + failure(status, "Construct DecimalFormatSymbols", avail[i]); DecimalFormat f2(pat, symb, status); if (failure(status, UnicodeString("Construct DecimalFormat(") + pat + ")")) { @@ -2241,7 +2283,7 @@ void NumberFormatRegressionTest::Test4212072(void) { df->toLocalizedPattern(pat); f2.applyLocalizedPattern(pat, status); failure(status, - UnicodeString("applyLocalizedPattern(") + pat + ")"); + UnicodeString("applyLocalizedPattern(") + pat + ")", avail[i]); if (U_FAILURE(status)) { continue; } @@ -2267,7 +2309,7 @@ void NumberFormatRegressionTest::Test4212072(void) { void NumberFormatRegressionTest::Test4216742(void) { UErrorCode status = U_ZERO_ERROR; DecimalFormat *fmt = (DecimalFormat*) NumberFormat::createInstance(Locale::getUS(), status); - failure(status, "createInstance"); + failure(status, "createInstance", Locale::getUS()); int32_t DATA[] = { INT32_MIN, INT32_MAX, -100000000, 100000000 }; int DATA_length = (int)(sizeof(DATA) / sizeof(DATA[0])); for (int i=0; isetMultiplier(m); Formattable num; fmt->parse(str, num, status); - failure(status, "parse"); + failure(status, "parse", Locale::getUS()); if (num.getType() != Formattable::kLong && num.getType() != Formattable::kDouble) { errln(UnicodeString("FAIL: Wanted number, got ") + @@ -2306,7 +2348,7 @@ void NumberFormatRegressionTest::Test4217661(void) { int D_length = (int)(sizeof(D) / sizeof(D[0])); UErrorCode status = U_ZERO_ERROR; NumberFormat *fmt = NumberFormat::createInstance(Locale::getUS(), status); - failure(status, "createInstance"); + failure(status, "createInstance", Locale::getUS()); fmt->setMaximumFractionDigits(2); for (int i=0; isetMinimumFractionDigits(1); nf->setMaximumFractionDigits(1); double a = -0.09; @@ -2346,9 +2388,9 @@ void NumberFormatRegressionTest::Test4161100(void) { void NumberFormatRegressionTest::Test4243011(void) { UErrorCode status = U_ZERO_ERROR; DecimalFormatSymbols sym(Locale::getUS(), status); - failure(status, "DecimalFormatSymbols ct"); + failure(status, "DecimalFormatSymbols ct", Locale::getUS()); DecimalFormat fmt(UnicodeString("0."), sym, status); - failure(status, "DecimalFormat ct"); + failure(status, "DecimalFormat ct", Locale::getUS()); const double NUM[] = { -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, 4.5 }; const char* STR[] = { "-2.", "-2.", "-0.", "0.", "2.", "2.", "4.", "4." }; @@ -2376,9 +2418,9 @@ void NumberFormatRegressionTest::Test4243011(void) { void NumberFormatRegressionTest::Test4243108(void) { UErrorCode status = U_ZERO_ERROR; DecimalFormatSymbols sym(Locale::getUS(), status); - failure(status, "DecimalFormatSymbols ct"); + failure(status, "DecimalFormatSymbols ct", Locale::getUS()); DecimalFormat fmt(UnicodeString("#.#"), sym, status); - failure(status, "DecimalFormat ct"); + failure(status, "DecimalFormat ct", Locale::getUS()); UnicodeString str; FieldPosition pos; @@ -2395,7 +2437,7 @@ void NumberFormatRegressionTest::Test4243108(void) { str = "99.99"; Formattable val; fmt.parse(str, val, status); - failure(status, "DecimalFormat.parse(99.99)"); + failure(status, "DecimalFormat.parse(99.99)", Locale::getUS()); if (val.getType() == Formattable::kDouble && val.getDouble() == 99.99) { logln(UnicodeString("Ok 99.99 / #.# = ") + toString(val)); diff --git a/icuSources/test/intltest/numrgts.h b/icuSources/test/intltest/numrgts.h index 4df2bb89..30024b00 100644 --- a/icuSources/test/intltest/numrgts.h +++ b/icuSources/test/intltest/numrgts.h @@ -1,8 +1,8 @@ -/******************************************************************** +/*********************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ + * Copyright (c) 1997-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ***********************************************************************/ #ifndef _NUMBERFORMATREGRESSIONTEST_ #define _NUMBERFORMATREGRESSIONTEST_ @@ -93,6 +93,8 @@ public: protected: UBool failure(UErrorCode status, const UnicodeString& msg); + UBool failure(UErrorCode status, const UnicodeString& msg, const char *l); + UBool failure(UErrorCode status, const UnicodeString& msg, const Locale& l); }; class MyNumberFormatTest : public NumberFormat @@ -148,11 +150,17 @@ public: } virtual Format* clone() const { return NULL; } + virtual UnicodeString& format(int32_t, UnicodeString& foo, FieldPosition&) const { return foo.remove(); } + virtual UnicodeString& format(int64_t, + UnicodeString& foo, + FieldPosition&) const + { return foo.remove(); } + virtual void applyPattern(const UnicodeString&, UParseError&, UErrorCode&){ } }; diff --git a/icuSources/test/intltest/pptest.cpp b/icuSources/test/intltest/pptest.cpp index 954a1bd1..61ec4e78 100644 --- a/icuSources/test/intltest/pptest.cpp +++ b/icuSources/test/intltest/pptest.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2003, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -91,6 +91,11 @@ void ParsePositionTest::TestParsePosition() errln("*** PP operator= operator== or operator != result"); } + ParsePosition *ppp = pp5.clone(); + if(ppp == &pp5 || *ppp != pp5) { + errln("ParsePosition.clone() failed"); + } + delete ppp; } void ParsePositionTest::TestFieldPosition() @@ -142,6 +147,12 @@ void ParsePositionTest::TestFieldPosition() } logln(""); + + FieldPosition *pfp = fp.clone(); + if(pfp == &fp || *pfp != fp) { + errln("FieldPosition.clone() failed"); + } + delete pfp; } void ParsePositionTest::TestFieldPosition_example() diff --git a/icuSources/test/intltest/punyref.h b/icuSources/test/intltest/punyref.h index 4d20b91b..138446bc 100644 --- a/icuSources/test/intltest/punyref.h +++ b/icuSources/test/intltest/punyref.h @@ -34,7 +34,6 @@ Disclaimer and license /************************************************************/ /* Public interface (would normally go in its own .h file): */ -#include #include "unicode/utypes.h" #if !UCONFIG_NO_IDNA diff --git a/icuSources/test/intltest/rbbiapts.cpp b/icuSources/test/intltest/rbbiapts.cpp index 2cd7d877..86792f97 100644 --- a/icuSources/test/intltest/rbbiapts.cpp +++ b/icuSources/test/intltest/rbbiapts.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1999-2003, International Business Machines Corporation and + * Copyright (c) 1999-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /************************************************************************ @@ -20,12 +20,18 @@ #include "rbbiapts.h" #include "rbbidata.h" #include "cstring.h" +#include "unicode/ustring.h" /** * API Test the RuleBasedBreakIterator class */ +#define TEST_ASSERT_SUCCESS(status) {if (U_FAILURE(status)) {\ +errln("Failure at file %s, line %d, error = %s", __FILE__, __LINE__, u_errorName(status));}} + +#define TEST_ASSERT(expr) {if ((expr)==FALSE) { \ +errln("Test Failure at file %s, line %d", __FILE__, __LINE__);}} void RBBIAPITest::TestCloneEquals() { @@ -142,12 +148,20 @@ void RBBIAPITest::TestBoilerPlate() UErrorCode status = U_ZERO_ERROR; BreakIterator* a = BreakIterator::createLineInstance(Locale("hi"), status); BreakIterator* b = BreakIterator::createLineInstance(Locale("hi_IN"),status); + if (U_FAILURE(status)) { + errln("Creation of break iterator failed %s", u_errorName(status)); + return; + } if(*a!=*b){ errln("Failed: boilerplate method operator!= does not return correct results"); } BreakIterator* c = BreakIterator::createLineInstance(Locale("th"),status); - if(*c==*a){ - errln("Failed: boilerplate method opertator== does not return correct results"); + if(a && c){ + if(*c==*a){ + errln("Failed: boilerplate method opertator== does not return correct results"); + } + }else{ + errln("creation of break iterator failed"); } delete a; delete b; @@ -553,16 +567,17 @@ void RBBIAPITest::TestQuoteGrouping() { } // -// TestWordStatus +// TestRuleStatus // Test word break rule status constants. // -void RBBIAPITest::TestWordStatus() { - - - UnicodeString testString1 = // Ideographic Katakana Hiragana - CharsToUnicodeString("plain word 123.45 \\u9160\\u9161 \\u30a1\\u30a2 \\u3041\\u3094"); - // 012345678901234567 8 9 0 1 2 3 4 5 6 - int32_t bounds1[] = { 0, 5,6, 10,11, 17,18, 19, 20,21, 23,24, 25, 26}; +void RBBIAPITest::TestRuleStatus() { + UChar str[30]; + u_unescape("plain word 123.45 \\u9160\\u9161 \\u30a1\\u30a2 \\u3041\\u3094", + // 012345678901234567 8 9 0 1 2 3 4 5 6 + // Ideographic Katakana Hiragana + str, 30); + UnicodeString testString1(str); + int32_t bounds1[] = {0, 5, 6, 10, 11, 17, 18, 19, 20, 21, 23, 24, 25, 26}; int32_t tag_lo[] = {UBRK_WORD_NONE, UBRK_WORD_LETTER, UBRK_WORD_NONE, UBRK_WORD_LETTER, UBRK_WORD_NONE, UBRK_WORD_NUMBER, UBRK_WORD_NONE, UBRK_WORD_IDEO, UBRK_WORD_IDEO, UBRK_WORD_NONE, @@ -596,12 +611,173 @@ void RBBIAPITest::TestWordStatus() { errln("FAIL: incorrect tag value %d at position %d", tag, pos); break; } + + // Check that we get the same tag values from getRuleStatusVec() + int32_t vec[10]; + int t = bi->getRuleStatusVec(vec, 10, status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(t==1); + TEST_ASSERT(vec[0] == tag); } } delete bi; + + // Now test line break status. This test mostly is to confirm that the status constants + // are correctly declared in the header. + testString1 = "test line. \n"; + // break type s s h + + bi = (RuleBasedBreakIterator *) + BreakIterator::createLineInstance(Locale::getEnglish(), status); + if(U_FAILURE(status)) { + errln("failed to create word break iterator."); + } else { + int32_t i = 0; + int32_t pos, tag; + UBool success; + + bi->setText(testString1); + pos = bi->current(); + tag = bi->getRuleStatus(); + for (i=0; i<3; i++) { + switch (i) { + case 0: + success = pos==0 && tag==UBRK_LINE_SOFT; break; + case 1: + success = pos==5 && tag==UBRK_LINE_SOFT; break; + case 2: + success = pos==12 && tag==UBRK_LINE_HARD; break; + default: + success = FALSE; break; + } + if (success == FALSE) { + errln("Fail: incorrect word break status or position. i=%d, pos=%d, tag=%d", + i, pos, tag); + break; + } + pos = bi->next(); + tag = bi->getRuleStatus(); + } + if (UBRK_LINE_SOFT >= UBRK_LINE_SOFT_LIMIT || + UBRK_LINE_HARD >= UBRK_LINE_HARD_LIMIT || + UBRK_LINE_HARD > UBRK_LINE_SOFT && UBRK_LINE_HARD < UBRK_LINE_SOFT_LIMIT ) { + errln("UBRK_LINE_* constants from header are inconsistent."); + } + } + delete bi; + } +// +// TestRuleStatusVec +// Test the vector form of break rule status. +// +void RBBIAPITest::TestRuleStatusVec() { + UnicodeString rulesString = "[A-N]{100}; \n" + "[a-w]{200}; \n" + "[\\p{L}]{300}; \n" + "[\\p{N}]{400}; \n" + "[0-5]{500}; \n" + "!.*;\n"; + UnicodeString testString1 = "Aapz5?"; + int32_t statusVals[10]; + int32_t numStatuses; + int32_t pos; + + UErrorCode status=U_ZERO_ERROR; + UParseError parseError; + + RuleBasedBreakIterator *bi = new RuleBasedBreakIterator(rulesString, parseError, status); + TEST_ASSERT_SUCCESS(status); + if (U_SUCCESS(status)) { + bi->setText(testString1); + + // A + pos = bi->next(); + TEST_ASSERT(pos==1); + numStatuses = bi->getRuleStatusVec(statusVals, 10, status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(numStatuses == 2); + TEST_ASSERT(statusVals[0] == 100); + TEST_ASSERT(statusVals[1] == 300); + + // a + pos = bi->next(); + TEST_ASSERT(pos==2); + numStatuses = bi->getRuleStatusVec(statusVals, 10, status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(numStatuses == 2); + TEST_ASSERT(statusVals[0] == 200); + TEST_ASSERT(statusVals[1] == 300); + + // p + pos = bi->next(); + TEST_ASSERT(pos==3); + numStatuses = bi->getRuleStatusVec(statusVals, 10, status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(numStatuses == 2); + TEST_ASSERT(statusVals[0] == 200); + TEST_ASSERT(statusVals[1] == 300); + + // z + pos = bi->next(); + TEST_ASSERT(pos==4); + numStatuses = bi->getRuleStatusVec(statusVals, 10, status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(numStatuses == 1); + TEST_ASSERT(statusVals[0] == 300); + + // 5 + pos = bi->next(); + TEST_ASSERT(pos==5); + numStatuses = bi->getRuleStatusVec(statusVals, 10, status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(numStatuses == 2); + TEST_ASSERT(statusVals[0] == 400); + TEST_ASSERT(statusVals[1] == 500); + + // ? + pos = bi->next(); + TEST_ASSERT(pos==6); + numStatuses = bi->getRuleStatusVec(statusVals, 10, status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(numStatuses == 1); + TEST_ASSERT(statusVals[0] == 0); + + // + // Check buffer overflow error handling. Char == A + // + bi->first(); + pos = bi->next(); + TEST_ASSERT(pos==1); + memset(statusVals, -1, sizeof(statusVals)); + numStatuses = bi->getRuleStatusVec(statusVals, 0, status); + TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR); + TEST_ASSERT(numStatuses == 2); + TEST_ASSERT(statusVals[0] == -1); + + status = U_ZERO_ERROR; + memset(statusVals, -1, sizeof(statusVals)); + numStatuses = bi->getRuleStatusVec(statusVals, 1, status); + TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR); + TEST_ASSERT(numStatuses == 2); + TEST_ASSERT(statusVals[0] == 100); + TEST_ASSERT(statusVals[1] == -1); + + status = U_ZERO_ERROR; + memset(statusVals, -1, sizeof(statusVals)); + numStatuses = bi->getRuleStatusVec(statusVals, 2, status); + TEST_ASSERT_SUCCESS(status); + TEST_ASSERT(numStatuses == 2); + TEST_ASSERT(statusVals[0] == 100); + TEST_ASSERT(statusVals[1] == 300); + TEST_ASSERT(statusVals[2] == -1); + } + delete bi; + +} + // // Bug 2190 Regression test. Builder crash on rule consisting of only a // $variable reference @@ -627,6 +803,7 @@ void RBBIAPITest::TestBug2190() { void RBBIAPITest::TestRegistration() { +#if !UCONFIG_NO_SERVICE UErrorCode status = U_ZERO_ERROR; BreakIterator* thai_word = BreakIterator::createWordInstance("th_TH", status); @@ -637,14 +814,17 @@ void RBBIAPITest::TestRegistration() { URegistryKey key = BreakIterator::registerInstance(thai_word, "xx", UBRK_WORD, status); { - if (*thai_word == *root_word) { + if (thai_word && *thai_word == *root_word) { errln("thai not different from root"); } } { BreakIterator* result = BreakIterator::createWordInstance("xx_XX", status); - UBool fail = *result != *thai_word; + UBool fail = TRUE; + if(result){ + fail = *result != *thai_word; + } delete result; if (fail) { errln("bad result for xx_XX/word"); @@ -653,7 +833,10 @@ void RBBIAPITest::TestRegistration() { { BreakIterator* result = BreakIterator::createCharacterInstance("th_TH", status); - UBool fail = *result != *thai_char; + UBool fail = TRUE; + if(result){ + fail = *result != *thai_char; + } delete result; if (fail) { errln("bad result for th_TH/char"); @@ -662,7 +845,10 @@ void RBBIAPITest::TestRegistration() { { BreakIterator* result = BreakIterator::createCharacterInstance("xx_XX", status); - UBool fail = *result != *root_char; + UBool fail = TRUE; + if(result){ + fail = *result != *root_char; + } delete result; if (fail) { errln("bad result for xx_XX/char"); @@ -695,7 +881,10 @@ void RBBIAPITest::TestRegistration() { { BreakIterator* result = BreakIterator::createWordInstance("xx", status); BreakIterator* root = BreakIterator::createWordInstance("", status); - UBool fail = *root != *result; + UBool fail = TRUE; + if(root){ + fail = *root != *result; + } delete root; delete result; if (fail) { @@ -739,13 +928,14 @@ void RBBIAPITest::TestRegistration() { delete thai_char; delete root_word; delete root_char; +#endif } void RBBIAPITest::RoundtripRule(const char *dataFile) { UErrorCode status = U_ZERO_ERROR; UParseError parseError; - parseError.line = 0; - parseError.offset = 0; + parseError.line = 0; + parseError.offset = 0; UDataMemory *data = udata_open(NULL, "brk", dataFile, &status); uint32_t length; const UChar *builtSource; @@ -801,17 +991,18 @@ void RBBIAPITest::runIndexedTest( int32_t index, UBool exec, const char* &name, case 2: name = "TestHashCode"; if (exec) TestHashCode(); break; case 3: name = "TestGetSetAdoptText"; if (exec) TestGetSetAdoptText(); break; case 4: name = "TestIteration"; if (exec) TestIteration(); break; - case 5: name = "extra"; break; /* Extra */ - case 6: name = "extra"; break; /* Extra */ + case 5: name = "extra"; break; // Extra + case 6: name = "extra"; break; // Extra case 7: name = "TestBuilder"; if (exec) TestBuilder(); break; case 8: name = "TestQuoteGrouping"; if (exec) TestQuoteGrouping(); break; - case 9: name = "TestWordStatus"; if (exec) TestWordStatus(); break; - case 10: name = "TestBug2190"; if (exec) TestBug2190(); break; - case 11: name = "TestRegistration"; if (exec) TestRegistration(); break; - case 12: name = "TestBoilerPlate"; if (exec) TestBoilerPlate(); break; - case 13: name = "TestRoundtripRules"; if (exec) TestRoundtripRules(); break; - - default: name = ""; break; /*needed to end loop*/ + case 9: name = "TestRuleStatus"; if (exec) TestRuleStatus(); break; + case 10: name = "TestRuleStatusVec"; if (exec) TestRuleStatusVec(); break; + case 11: name = "TestBug2190"; if (exec) TestBug2190(); break; + case 12: name = "TestRegistration"; if (exec) TestRegistration(); break; + case 13: name = "TestBoilerPlate"; if (exec) TestBoilerPlate(); break; + case 14: name = "TestRoundtripRules"; if (exec) TestRoundtripRules(); break; + + default: name = ""; break; // needed to end loop } } diff --git a/icuSources/test/intltest/rbbiapts.h b/icuSources/test/intltest/rbbiapts.h index 4dd9b4cb..ae759248 100644 --- a/icuSources/test/intltest/rbbiapts.h +++ b/icuSources/test/intltest/rbbiapts.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1999-2003, International Business Machines Corporation and + * Copyright (c) 1999-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /************************************************************************ @@ -71,7 +71,8 @@ public: /** * Tests word break status returns. */ - void TestWordStatus(); + void TestRuleStatus(); + void TestRuleStatusVec(); void TestBug2190(); diff --git a/icuSources/test/intltest/rbbitst.cpp b/icuSources/test/intltest/rbbitst.cpp index a0deb0cb..d8feb991 100644 --- a/icuSources/test/intltest/rbbitst.cpp +++ b/icuSources/test/intltest/rbbitst.cpp @@ -1,2641 +1,3801 @@ -/******************************************************************** - * COPYRIGHT: - * Copyright (c) 1999-2003, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ -/************************************************************************ -* Date Name Description -* 12/15/99 Madhu Creation. -* 01/12/2000 Madhu Updated for changed API and added new tests -************************************************************************/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_BREAK_ITERATION - -#include "unicode/utypes.h" -#include "unicode/brkiter.h" -#include "unicode/rbbi.h" -#include "unicode/uchar.h" -#include "unicode/utf16.h" -#include "unicode/ucnv.h" -#include "unicode/schriter.h" -#include "unicode/uniset.h" -#include "unicode/regex.h" // TODO: make conditional on regexp being built. - -#include "intltest.h" -#include "rbbitst.h" -#include -#include "uvector.h" -#include "uvectr32.h" -#include -#include -#include - - - -//--------------------------------------------------------------------------- -// -// class BITestData Holds a set of Break iterator test data and results -// Includes -// - the string data to be broken -// - a vector of the expected break positions. -// - a vector of source line numbers for the data, -// (to help see where errors occured.) -// - The expected break tag values. -// - Vectors of actual break positions and tag values. -// - Functions for comparing actual with expected and -// reporting errors. -// -//---------------------------------------------------------------------------- -class BITestData { -public: - UnicodeString fDataToBreak; - UVector fExpectedBreakPositions; - UVector fExpectedTags; - UVector fLineNum; - UVector fActualBreakPositions; // Test Results. - UVector fActualTags; - - BITestData(UErrorCode &status); - void addDataChunk(const char *data, int32_t tag, int32_t lineNum, UErrorCode status); - void checkResults(const char *heading, RBBITest *test); - void err(const char *heading, RBBITest *test, int32_t expectedIdx, int32_t actualIdx); - void clearResults(); -}; - -// -// Constructor. -// -BITestData::BITestData(UErrorCode &status) -: fExpectedBreakPositions(status), fExpectedTags(status), fLineNum(status), fActualBreakPositions(status), - fActualTags(status) -{ -}; - -// -// addDataChunk. Add a section (non-breaking) piece if data to the test data. -// The macro form collects the line number, which is helpful -// when tracking down failures. -// -// A null data item is inserted at the start of each test's data -// to put the starting zero into the data list. The position saved for -// each non-null item is its ending position. -// -#define ADD_DATACHUNK(td, data, tag, status) td.addDataChunk(data, tag, __LINE__, status); -void BITestData::addDataChunk(const char *data, int32_t tag, int32_t lineNum, UErrorCode status) { - if (U_FAILURE(status)) {return;} - if (data != NULL) { - fDataToBreak.append(CharsToUnicodeString(data)); - } - fExpectedBreakPositions.addElement(fDataToBreak.length(), status); - fExpectedTags.addElement(tag, status); - fLineNum.addElement(lineNum, status); -}; - - -// -// checkResults. Compare the actual and expected break positions, report any differences. -// -void BITestData::checkResults(const char *heading, RBBITest *test) { - int32_t expectedIndex = 0; - int32_t actualIndex = 0; - - for (;;) { - // If we've run through both the expected and actual results vectors, we're done. - // break out of the loop. - if (expectedIndex >= fExpectedBreakPositions.size() && - actualIndex >= fActualBreakPositions.size()) { - break; - } - - - if (expectedIndex >= fExpectedBreakPositions.size()) { - err(heading, test, expectedIndex-1, actualIndex); - actualIndex++; - continue; - } - - if (actualIndex >= fActualBreakPositions.size()) { - err(heading, test, expectedIndex, actualIndex-1); - expectedIndex++; - continue; - } - - if (fActualBreakPositions.elementAti(actualIndex) != fExpectedBreakPositions.elementAti(expectedIndex)) { - err(heading, test, expectedIndex, actualIndex); - // Try to resync the positions of the indices, to avoid a rash of spurious erros. - if (fActualBreakPositions.elementAti(actualIndex) < fExpectedBreakPositions.elementAti(expectedIndex)) { - actualIndex++; - } else { - expectedIndex++; - } - continue; - } - - if (fActualTags.elementAti(actualIndex) != fExpectedTags.elementAti(expectedIndex)) { - test->errln("%s, tag mismatch. Test Line = %d, expected tag=%d, got %d", - heading, fLineNum.elementAt(expectedIndex), - fExpectedTags.elementAti(expectedIndex), fActualTags.elementAti(actualIndex)); - } - - actualIndex++; - expectedIndex++; - } -} - -// -// err - An error was found. Report it, along with information about where the -// incorrectly broken test data appeared in the source file. -// -void BITestData::err(const char *heading, RBBITest *test, int32_t expectedIdx, int32_t actualIdx) -{ - int32_t expected = fExpectedBreakPositions.elementAti(expectedIdx); - int32_t actual = fActualBreakPositions.elementAti(actualIdx); - int32_t o = 0; - int32_t line = fLineNum.elementAti(expectedIdx); - if (expectedIdx > 0) { - // The line numbers are off by one because a premature break occurs somewhere - // within the previous item, rather than at the start of the current (expected) item. - // We want to report the offset of the unexpected break from the start of - // this previous item. - o = actual - fExpectedBreakPositions.elementAti(expectedIdx-1); - } - if (actual < expected) { - test->errln("%s unexpected break at offset %d in test item from line %d", heading, o, line); - } else { - test->errln("%s Failed to find break at end of item from line %d", heading, line); - } -} - - -void BITestData::clearResults() { - fActualBreakPositions.removeAllElements(); - fActualTags.removeAllElements(); -} - - -//----------------------------------------------------------------------------------- -// -// Cannned Test Characters -// -//----------------------------------------------------------------------------------- - -static const UChar cannedTestArray[] = { - 0x0001, 0x0002, 0x0003, 0x0004, 0x0020, 0x0021, '\\', 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0028, 0x0029, 0x002b, 0x002d, 0x0030, 0x0031, - 0x0032, 0x0033, 0x0034, 0x003c, 0x003d, 0x003e, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x005b, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x007b, - 0x007d, 0x007c, 0x002c, 0x00a0, 0x00a2, - 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00ab, 0x00ad, 0x00ae, 0x00af, 0x00b0, 0x00b2, 0x00b3, - 0x00b4, 0x00b9, 0x00bb, 0x00bc, 0x00bd, 0x02b0, 0x02b1, 0x02b2, 0x02b3, 0x02b4, 0x0300, 0x0301, 0x0302, 0x0303, - 0x0304, 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x0903, 0x093e, 0x093f, 0x0940, 0x0949, 0x0f3a, 0x0f3b, 0x2000, - 0x2001, 0x2002, 0x200c, 0x200d, 0x200e, 0x200f, 0x2010, 0x2011, 0x2012, 0x2028, 0x2029, 0x202a, 0x203e, 0x203f, - 0x2040, 0x20dd, 0x20de, 0x20df, 0x20e0, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x0000 -}; - -static UnicodeString* cannedTestChars = 0; - -#define halfNA "\\u0928\\u094d\\u200d" -#define halfSA "\\u0938\\u094d\\u200d" -#define halfCHA "\\u091a\\u094d\\u200d" -#define halfKA "\\u0915\\u094d\\u200d" -#define deadTA "\\u0924\\u094d" - -//-------------------------------------------------------------------------------------- -// -// RBBITest constructor and destructor -// -//-------------------------------------------------------------------------------------- - -RBBITest::RBBITest() { - UnicodeString temp(cannedTestArray); - cannedTestChars = new UnicodeString(); - *cannedTestChars += (UChar)0x0000; - *cannedTestChars += temp; -} - - -RBBITest::~RBBITest() { - delete cannedTestChars; -} - - -static const int T_NUMBER = 100; -static const int T_LETTER = 200; -static const int T_H_OR_K = 300; -static const int T_IDEO = 400; - - - - - - -//-------------------------------------------------------------------- -//Testing the BreakIterator for devanagari script -//-------------------------------------------------------------------- - -#define deadRA "\\u0930\\u094d" /*deadform RA = devanagari RA + virama*/ -#define deadPHA "\\u092b\\u094d" /*deadform PHA = devanagari PHA + virama*/ -#define deadTTHA "\\u0920\\u094d" -#define deadPA "\\u092a\\u094d" -#define deadSA "\\u0938\\u094d" -#define visarga "\\u0903" /*devanagari visarga looks like a english colon*/ - - - - - - -//----------------------------------------------------------------------------------- -// -// Test for status {tag} return value from break rules. -// TODO: a more thorough test. -// -//----------------------------------------------------------------------------------- -void RBBITest::TestStatusReturn() { - UnicodeString rulesString1 = "$Letters = [:L:];\n" - "$Numbers = [:N:];\n" - "$Letters+{1};\n" - "$Numbers+{2};\n" - "Help\\ {4}/me\\!;\n" - "[^$Letters $Numbers];\n" - "!.*;\n"; - UnicodeString testString1 = "abc123..abc Help me Help me!"; - // 01234567890123456789012345678 - int32_t bounds1[] = {0, 3, 6, 7, 8, 11, 12, 16, 17, 19, 20, 25, 27, 28, -1}; - int32_t brkStatus[] = {0, 1, 2, 0, 0, 1, 0, 1, 0, 1, 0, 4, 1, 0, -1}; - - UErrorCode status=U_ZERO_ERROR; - UParseError parseError; - - RuleBasedBreakIterator *bi = new RuleBasedBreakIterator(rulesString1, parseError, status); - if(U_FAILURE(status)) { - errln("FAIL : in construction"); - } else { - int32_t pos; - int32_t i = 0; - bi->setText(testString1); - for (pos=bi->first(); pos!= BreakIterator::DONE; pos=bi->next()) { - if (pos != bounds1[i]) { - errln("FAIL: expected break at %d, got %d\n", bounds1[i], pos); - break; - } - - int tag = bi->getRuleStatus(); - if (tag != brkStatus[i]) { - errln("FAIL: break at %d, expected tag %d, got tag %d\n", pos, brkStatus[i], tag); - break; - } - i++; - } - } - delete bi; -} - - -void RBBITest::TestThaiLineBreak() { - UErrorCode status = U_ZERO_ERROR; - BITestData thaiLineSelection(status); - - // \u0e2f-- the Thai paiyannoi character-- isn't a letter. It's a symbol that - // represents elided letters at the end of a long word. It should be bound to - // the end of the word and not treated as an independent punctuation mark. - - - ADD_DATACHUNK(thaiLineSelection, NULL, 0, status); // Break at start of data - ADD_DATACHUNK(thaiLineSelection, "\\u0e2a\\u0e16\\u0e32\\u0e19\\u0e35\\u0e2f", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e08\\u0e30", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e23\\u0e30\\u0e14\\u0e21", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e40\\u0e08\\u0e49\\u0e32", 0, status); -// ADD_DATACHUNK(thaiLineSelection, "\\u0e2b\\u0e19\\u0e49\\u0e32", 0, status); -// ADD_DATACHUNK(thaiLineSelection, "\\u0e17\\u0e35\\u0e48", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e2b\\u0e19\\u0e49\\u0e32\\u0e17\\u0e35\\u0e48", 0, status); - // the commented-out lines (I think) are the preferred result; this line is what our current dictionary is giving us - ADD_DATACHUNK(thaiLineSelection, "\\u0e2d\\u0e2d\\u0e01", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e21\\u0e32", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e40\\u0e23\\u0e48\\u0e07", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e23\\u0e30\\u0e1a\\u0e32\\u0e22", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e2d\\u0e22\\u0e48\\u0e32\\u0e07", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e40\\u0e15\\u0e47\\u0e21", 0, status); - - // the one time where the paiyannoi occurs somewhere other than at the end - // of a word is in the Thai abbrevation for "etc.", which both begins and - // ends with a paiyannoi - ADD_DATACHUNK(thaiLineSelection, "\\u0e2f\\u0e25\\u0e2f", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e17\\u0e35\\u0e48", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e19\\u0e31\\u0e49\\u0e19", 0, status); - - RuleBasedBreakIterator* e = (RuleBasedBreakIterator *)BreakIterator::createLineInstance( - Locale("th"), status); - if (U_FAILURE(status)) - { - errln("Failed to create the BreakIterator for Thai locale in TestThaiLineBreak.\n"); - return; - } - - generalIteratorTest(*e, thaiLineSelection); - delete e; -} - - - -void RBBITest::TestMixedThaiLineBreak() -{ - UErrorCode status = U_ZERO_ERROR; - BITestData thaiLineSelection(status); - - ADD_DATACHUNK(thaiLineSelection, NULL, 0, status); // Break at start of data - - // Arabic numerals should always be separated from surrounding Thai text -/* - ADD_DATACHUNK(thaiLineSelection, "\\u0e04\\u0e48\\u0e32", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e40\\u0e07\\u0e34\\u0e19", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e1a\\u0e32\\u0e17", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e41\\u0e15\\u0e30", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e23\\u0e30\\u0e14\\u0e31\\u0e1a", 0, status); - thaiLineSelection->addElement("39"); - ADD_DATACHUNK(thaiLineSelection, "\\u0e1a\\u0e32\\u0e17 ", 0, status); - - // words in non-Thai scripts should always be separated from surrounding Thai text - ADD_DATACHUNK(thaiLineSelection, "\\u0e17\\u0e14", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e2a\\u0e2d\\u0e1a", 0, status); - thaiLineSelection->addElement("Java"); - ADD_DATACHUNK(thaiLineSelection, "\\u0e1a\\u0e19", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e40\\u0e04\\u0e23\\u0e37\\u0e48\\u0e2d\\u0e07", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e44\\u0e2d\\u0e1a\\u0e35\\u0e40\\u0e2d\\u0e47\\u0e21 ", 0, status); - - // Thai numerals should always be separated from the text surrounding them - ADD_DATACHUNK(thaiLineSelection, "\\u0e04\\u0e48\\u0e32", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e40\\u0e07\\u0e34\\u0e19", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e1a\\u0e32\\u0e17", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e41\\u0e15\\u0e30", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e23\\u0e30\\u0e14\\u0e31\\u0e1a", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e53\\u0e59", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e1a\\u0e32\\u0e17 ", 0, status); - - // Thai text should interact correctly with punctuation and symbols - ADD_DATACHUNK(thaiLineSelection, "\\u0e44\\u0e2d\\u0e1a\\u0e35\\u0e40\\u0e2d\\u0e47\\u0e21", 0, status); -// ADD_DATACHUNK(thaiLineSelection, "(\\u0e1b\\u0e23\\u0e30\\u0e40\\u0e17\\u0e28", 0, status); -// ADD_DATACHUNK(thaiLineSelection, "\\u0e44\\u0e17\\u0e22)", 0, status); -ADD_DATACHUNK(thaiLineSelection, "(\\u0e1b\\u0e23\\u0e30\\u0e40\\u0e17\\u0e28\\u0e44\\u0e17\\u0e22)", 0, status); -// I believe the commented-out reading above to be the correct one, but this is what passes with our current dictionary - ADD_DATACHUNK(thaiLineSelection, "\\u0e08\\u0e33\\u0e01\\u0e31\\u0e14", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e40\\u0e1b\\u0e34\\u0e14", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e15\\u0e31\\u0e27\"", 0, status); -*/ - - // The Unicode Linebreak TR says do not break before or after quotes. - // So this test is changed ot not break around the quote. - // TODO: should Thai break around the around the quotes, like the original behavior here? -// ADD_DATACHUNK(thaiLineSelection, "\\u0e2e\\u0e32\\u0e23\\u0e4c\\u0e14\\u0e14\\u0e34\\u0e2a\\u0e01\\u0e4c\"", 0, status); -// ADD_DATACHUNK(thaiLineSelection, "\\u0e23\\u0e38\\u0e48\\u0e19", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e2e\\u0e32\\u0e23\\u0e4c\\u0e14\\u0e14\\u0e34\\u0e2a\\u0e01\\u0e4c\"" - "\\u0e23\\u0e38\\u0e48\\u0e19", 0, status); - - ADD_DATACHUNK(thaiLineSelection, "\\u0e43\\u0e2b\\u0e21\\u0e48", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e40\\u0e14\\u0e37\\u0e2d\\u0e19\\u0e21\\u0e34.", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e22.", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e19\\u0e35\\u0e49", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e23\\u0e32\\u0e04\\u0e32", 0, status); - ADD_DATACHUNK(thaiLineSelection, "$200", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e40\\u0e17\\u0e48\\u0e32", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e19\\u0e31\\u0e49\\u0e19 ", 0, status); - ADD_DATACHUNK(thaiLineSelection, "(\"\\u0e2e\\u0e32\\u0e23\\u0e4c\\u0e14\\u0e14\\u0e34\\u0e2a\\u0e01\\u0e4c\").", 0, status); - - RuleBasedBreakIterator* e = (RuleBasedBreakIterator *)BreakIterator::createLineInstance(Locale("th"), status); - if (U_FAILURE(status)) - { - errln("Failed to create the BreakIterator for Thai locale in TestMixedThaiLineBreak.\n"); - return; - } - - - generalIteratorTest(*e, thaiLineSelection); - delete e; -} - - -void RBBITest::TestMaiyamok() -{ - UErrorCode status = U_ZERO_ERROR; - BITestData thaiLineSelection(status); - ADD_DATACHUNK(thaiLineSelection, NULL, 0, status); // Break at start of data - // the Thai maiyamok character is a shorthand symbol that means "repeat the previous - // word". Instead of appearing as a word unto itself, however, it's kept together - // with the word before it - ADD_DATACHUNK(thaiLineSelection, "\\u0e44\\u0e1b\\u0e46", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e21\\u0e32\\u0e46", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e23\\u0e30\\u0e2b\\u0e27\\u0e48\\u0e32\\u0e07", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e01\\u0e23\\u0e38\\u0e07\\u0e40\\u0e17\\u0e1e", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e41\\u0e25\\u0e30", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e40\\u0e03\\u0e35\\u0e22\\u0e07", 0, status); - ADD_DATACHUNK(thaiLineSelection, "\\u0e43\\u0e2b\\u0e21\\u0e48", 0, status); - - RuleBasedBreakIterator* e = (RuleBasedBreakIterator *)BreakIterator::createLineInstance( - Locale("th"), status); - - if (U_FAILURE(status)) - { - errln("Failed to create the BreakIterator for Thai locale in TestMaiyamok.\n"); - return; - } - generalIteratorTest(*e, thaiLineSelection); - delete e; -} - -void RBBITest::TestThaiWordBreak() { - UErrorCode status = U_ZERO_ERROR; - BITestData thaiWordSelection(status); - - ADD_DATACHUNK(thaiWordSelection, NULL, 0, status); // Break at start of data - ADD_DATACHUNK(thaiWordSelection, "\\u0E1A\\u0E17", 0, status); //2 - ADD_DATACHUNK(thaiWordSelection, "\\u0E17\\u0E35\\u0E48", 0, status); //5 - ADD_DATACHUNK(thaiWordSelection, "\\u0E51", 0, status); //6 - ADD_DATACHUNK(thaiWordSelection, "\\u0E1E\\u0E32\\u0E22\\u0E38", 0, status); //10 - ADD_DATACHUNK(thaiWordSelection, "\\u0E44\\u0E0B\\u0E42\\u0E04\\u0E25\\u0E19", 0, status); //16 - ADD_DATACHUNK(thaiWordSelection, "\\u000D\\u000A", 0, status); //18 - - // This is the correct result - //ADD_DATACHUNK(thaiWordSelection, "\\u0E42\\u0E14\\u0E42\\u0E23\\u0E18\\u0E35", 0, status); //24 - //ADD_DATACHUNK(thaiWordSelection, "\\u0E2D\\u0E32\\u0E28\\u0E31\\u0E22", 0, status); //29 - - // and this is what the dictionary does... - ADD_DATACHUNK(thaiWordSelection, "\\u0E42\\u0E14", 0, status); // 20 - ADD_DATACHUNK(thaiWordSelection, "\\u0E42\\u0E23\\u0E18\\u0E35\\u0E2D\\u0E32\\u0E28\\u0E31\\u0E22", 0, status); //29 - - ADD_DATACHUNK(thaiWordSelection, "\\u0E2D\\u0E22\\u0E39\\u0E48", 0, status); //33 - - // This is the correct result - //ADD_DATACHUNK(thaiWordSelection, "\\u0E17\\u0E48\\u0E32\\u0E21", 0, status); //37 - //ADD_DATACHUNK(thaiWordSelection, "\\u0E01\\u0E25\\u0E32\\u0E07", 0, status); //41 - - // and this is what the dictionary does - ADD_DATACHUNK(thaiWordSelection, "\\u0E17\\u0E48\\u0E32\\u0E21\\u0E01\\u0E25\\u0E32\\u0E07", 0, status); //41 - - ADD_DATACHUNK(thaiWordSelection, "\\u0E17\\u0E38\\u0E48\\u0E07", 0, status); //45 - ADD_DATACHUNK(thaiWordSelection, "\\u0E43\\u0E2B\\u0E0D\\u0E48", 0, status); //49 - ADD_DATACHUNK(thaiWordSelection, "\\u0E43\\u0E19", 0, status); //51 - - // This is the correct result - //ADD_DATACHUNK(thaiWordSelection, "\\u0E41\\u0E04\\u0E19\\u0E0B\\u0E31\\u0E2A", 0, status); //57 - //ADD_DATACHUNK(thaiWordSelection, "\\u0E01\\u0E31\\u0E1A", 0, status); //60 - - // and this is what the dictionary does - ADD_DATACHUNK(thaiWordSelection, "\\u0E41\\u0E04\\u0E19", 0, status); // 54 - ADD_DATACHUNK(thaiWordSelection, "\\u0E0B\\u0E31\\u0E2A\\u0E01\\u0E31\\u0E1A", 0, status); //60 - - ADD_DATACHUNK(thaiWordSelection, "\\u0E25\\u0E38\\u0E07", 0, status); //63 - - // This is the correct result - //ADD_DATACHUNK(thaiWordSelection, "\\u0E40\\u0E2E\\u0E19\\u0E23\\u0E35", 0, status); //68 - //ADD_DATACHUNK(thaiWordSelection, "\\u0E0A\\u0E32\\u0E27", 0, status); //71 - //ADD_DATACHUNK(thaiWordSelection, "\\u0E44\\u0E23\\u0E48", 0, status); //74 - //ADD_DATACHUNK(thaiWordSelection, "\\u0E41\\u0E25\\u0E30", 0, status); //77 - - // and this is what the dictionary does - ADD_DATACHUNK(thaiWordSelection, "\\u0E40\\u0E2E", 0, status); // 65 - ADD_DATACHUNK(thaiWordSelection, "\\u0E19\\u0E23\\u0E35\\u0E0A\\u0E32\\u0E27\\u0E44\\u0E23\\u0E48\\u0E41\\u0E25\\u0E30", 0, status); //77 - - RuleBasedBreakIterator* e = (RuleBasedBreakIterator *)BreakIterator::createWordInstance( - Locale("th"), status); - if (U_FAILURE(status)) - { - errln("Failed to create the BreakIterator for Thai locale in TestThaiWordBreak.\n"); - return; - } - - generalIteratorTest(*e, thaiWordSelection); - delete e; -} - - -//--------------------------------------------- -// runIndexedTest -//--------------------------------------------- - -void RBBITest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* params ) -{ - if (exec) logln("TestSuite RuleBasedBreakIterator: "); - switch (index) { - - case 0: name = "TestExtended"; - if(exec) TestExtended(); break; - case 1: name = "TestJapaneseLineBrea"; - if(exec) TestJapaneseLineBreak(); break; - case 2: name = "TestStatusReturn"; - if(exec) TestStatusReturn(); break; - - case 3: name = "TestLineBreakData"; - if(exec) TestLineBreakData(); break; - case 4: name = "TestSentenceInvariants"; - if(exec) TestSentenceInvariants(); break; - case 5: name = "TestCharacterInvariants"; - if(exec) TestCharacterInvariants(); break; - case 6: name = "TestWordInvariants"; - if(exec) TestWordInvariants(); break; - - case 7: name = "TestEmptyString"; - if(exec) TestEmptyString(); break; - - case 8: name = "TestGetAvailableLocales"; - if(exec) TestGetAvailableLocales(); break; - - case 9: name = "TestGetDisplayName"; - if(exec) TestGetDisplayName(); break; - - case 10: name = "TestEndBehaviour"; - if(exec) TestEndBehaviour(); break; - case 11: name = "TestBug4153072"; - if(exec) TestBug4153072(); break; - case 12: name = "TestMonkey"; - if(exec) { -#if !UCONFIG_NO_REGULAR_EXPRESSIONS - TestMonkey(params); -#else - logln("skipping TestMonkey (UCONFIG_NO_REGULAR_EXPRESSIONS)"); -#endif - } - break; - - case 13: name = "TestThaiLineBreak"; - if(exec) TestThaiLineBreak(); break; - case 14: name = "TestMixedThaiLineBreak"; - if(exec) TestMixedThaiLineBreak(); break; - case 15: name = "TestMaiyamok"; - if(exec) TestMaiyamok(); break; - case 16: name = "TestThaiWordBreak"; - if(exec) TestThaiWordBreak(); break; - - - default: name = ""; break; //needed to end loop - } -} - - -//---------------------------------------------------------------------------- -// -// generalIteratorTest Given a break iterator and a set of test data, -// Run the tests and report the results. -// -//---------------------------------------------------------------------------- -void RBBITest::generalIteratorTest(RuleBasedBreakIterator& bi, BITestData &td) -{ - - bi.setText(td.fDataToBreak); - - testFirstAndNext(bi, td); - - testLastAndPrevious(bi, td); - - testFollowing(bi, td); - testPreceding(bi, td); - testIsBoundary(bi, td); - doMultipleSelectionTest(bi, td); -} - - -// -// testFirstAndNext. Run the iterator forwards in the obvious first(), next() -// kind of loop. -// -void RBBITest::testFirstAndNext(RuleBasedBreakIterator& bi, BITestData &td) -{ - UErrorCode status = U_ZERO_ERROR; - int32_t p; - int32_t lastP = -1; - int32_t tag; - - logln("Test first and next"); - bi.setText(td.fDataToBreak); - td.clearResults(); - - for (p=bi.first(); p!=RuleBasedBreakIterator::DONE; p=bi.next()) { - td.fActualBreakPositions.addElement(p, status); // Save result. - tag = bi.getRuleStatus(); - td.fActualTags.addElement(tag, status); - if (p <= lastP) { - // If the iterator is not making forward progress, stop. - // No need to raise an error here, it'll be detected in the normal check of results. - break; - } - lastP = p; - } - td.checkResults("testFirstAndNext", this); -} - - -// -// TestLastAndPrevious. Run the iterator backwards, starting with last(). -// -void RBBITest::testLastAndPrevious(RuleBasedBreakIterator& bi, BITestData &td) -{ - UErrorCode status = U_ZERO_ERROR; - int32_t p; - int32_t lastP = 0x7ffffffe; - int32_t tag; - - logln("Test first and next"); - bi.setText(td.fDataToBreak); - td.clearResults(); - - for (p=bi.last(); p!=RuleBasedBreakIterator::DONE; p=bi.previous()) { - // Save break position. Insert it at start of vector of results, shoving - // already-saved results further towards the end. - td.fActualBreakPositions.insertElementAt(p, 0, status); - // bi.previous(); // TODO: Why does this fix things up???? - // bi.next(); - tag = bi.getRuleStatus(); - td.fActualTags.insertElementAt(tag, 0, status); - if (p >= lastP) { - // If the iterator is not making progress, stop. - // No need to raise an error here, it'll be detected in the normal check of results. - break; - } - lastP = p; - } - td.checkResults("testLastAndPrevious", this); -} - - -void RBBITest::testFollowing(RuleBasedBreakIterator& bi, BITestData &td) -{ - UErrorCode status = U_ZERO_ERROR; - int32_t p; - int32_t tag; - int32_t lastP = -2; // A value that will never be returned as a break position. - // cannot be -1; that is returned for DONE. - int i; - - logln("testFollowing():"); - bi.setText(td.fDataToBreak); - td.clearResults(); - - // Save the starting point, since we won't get that out of following. - p = bi.first(); - td.fActualBreakPositions.addElement(p, status); // Save result. - tag = bi.getRuleStatus(); - td.fActualTags.addElement(tag, status); - - for (i = 0; i <= td.fDataToBreak.length()+1; i++) { - p = bi.following(i); - if (p != lastP) { - if (p == RuleBasedBreakIterator::DONE) { - break; - } - // We've reached a new break position. Save it. - td.fActualBreakPositions.addElement(p, status); // Save result. - tag = bi.getRuleStatus(); - td.fActualTags.addElement(tag, status); - lastP = p; - } - } - // The loop normally exits by means of the break in the middle. - // Make sure that the index was at the correct position for the break iterator to have - // returned DONE. - if (i != td.fDataToBreak.length()) { - errln("testFollowing(): iterator returned DONE prematurely."); - } - - // Full check of all results. - td.checkResults("testFollowing", this); -} - - - -void RBBITest::testPreceding(RuleBasedBreakIterator& bi, BITestData &td) { - UErrorCode status = U_ZERO_ERROR; - int32_t p; - int32_t tag; - int32_t lastP = 0x7ffffffe; - int i; - - logln("testPreceding():"); - bi.setText(td.fDataToBreak); - td.clearResults(); - - p = bi.last(); - td.fActualBreakPositions.addElement(p, status); - tag = bi.getRuleStatus(); - td.fActualTags.addElement(tag, status); - - for (i = td.fDataToBreak.length(); i>=-1; i--) { - p = bi.preceding(i); - if (p != lastP) { - if (p == RuleBasedBreakIterator::DONE) { - break; - } - // We've reached a new break position. Save it. - td.fActualBreakPositions.insertElementAt(p, 0, status); - lastP = p; - tag = bi.getRuleStatus(); - td.fActualTags.insertElementAt(tag, 0, status); - } - } - // The loop normally exits by means of the break in the middle. - // Make sure that the index was at the correct position for the break iterator to have - // returned DONE. - if (i != 0) { - errln("testPreceding(): iterator returned DONE prematurely."); - } - - // Full check of all results. - td.checkResults("testPreceding", this); -} - - - -void RBBITest::testIsBoundary(RuleBasedBreakIterator& bi, BITestData &td) { - UErrorCode status = U_ZERO_ERROR; - int i; - int32_t tag; - - logln("testIsBoundary():"); - bi.setText(td.fDataToBreak); - td.clearResults(); - - for (i = 0; i <= td.fDataToBreak.length(); i++) { - if (bi.isBoundary(i)) { - td.fActualBreakPositions.addElement(i, status); // Save result. - tag = bi.getRuleStatus(); - td.fActualTags.addElement(tag, status); - } - } - td.checkResults("testIsBoundary: ", this); -} - - - -void RBBITest::doMultipleSelectionTest(RuleBasedBreakIterator& iterator, BITestData &td) -{ - iterator.setText(td.fDataToBreak); - - RuleBasedBreakIterator* testIterator =(RuleBasedBreakIterator*)iterator.clone(); - int32_t offset = iterator.first(); - int32_t testOffset; - int32_t count = 0; - - logln("doMultipleSelectionTest text of length: %d", td.fDataToBreak.length()); - - if (*testIterator != iterator) - errln("clone() or operator!= failed: two clones compared unequal"); - - do { - testOffset = testIterator->first(); - testOffset = testIterator->next(count); - if (offset != testOffset) - errln(UnicodeString("next(n) and next() not returning consistent results: for step ") + count + ", next(n) returned " + testOffset + " and next() had " + offset); - - if (offset != RuleBasedBreakIterator::DONE) { - count++; - offset = iterator.next(); - - if (offset != RuleBasedBreakIterator::DONE && *testIterator == iterator) - errln("operator== failed: Two unequal iterators compared equal."); - } - } while (offset != RuleBasedBreakIterator::DONE); - - // now do it backwards... - offset = iterator.last(); - count = 0; - - do { - testOffset = testIterator->last(); - testOffset = testIterator->next(count); // next() with a negative arg is same as previous - if (offset != testOffset) - errln(UnicodeString("next(n) and next() not returning consistent results: for step ") + count + ", next(n) returned " + testOffset + " and next() had " + offset); - - if (offset != RuleBasedBreakIterator::DONE) { - count--; - offset = iterator.previous(); - } - } while (offset != RuleBasedBreakIterator::DONE); - - delete testIterator; -} - - - -//-------------------------------------------------------------------------------------------- -// -// Break Iterator Invariants Tests -// -//-------------------------------------------------------------------------------------------- - -void RBBITest::TestCharacterInvariants() -{ - UErrorCode status = U_ZERO_ERROR; - BreakIterator *e = BreakIterator::createCharacterInstance(Locale::getDefault(), status); - if (U_FAILURE(status)) - { - errln("Failed to create the BreakIterator for default locale in TestCharacterInvariants.\n"); - return; - } - UnicodeString s = *cannedTestChars + CharsToUnicodeString("\\u1100\\u1101\\u1102\\u1160\\u1161\\u1162\\u11a8\\u11a9\\u11aa"); - doBreakInvariantTest(*e, s); - s = *cannedTestChars + CharsToUnicodeString("\\u1100\\u1101\\u1102\\u1160\\u1161\\u1162\\u11a8\\u11a9\\u11aa"); - doOtherInvariantTest(*e, s); - delete e; -} - - -void RBBITest::TestWordInvariants() -{ - UErrorCode status = U_ZERO_ERROR; - BreakIterator *e = BreakIterator::createWordInstance(Locale::getDefault(), status); - if (U_FAILURE(status)) - { - errln("Failed to create the BreakIterator for default locale in TestWordInvariants.\n"); - return; - } - UnicodeString s = *cannedTestChars + CharsToUnicodeString("\',.\\u3041\\u3042\\u3043\\u309b\\u309c\\u30a1\\u30a2\\u30a3\\u4e00\\u4e01\\u4e02"); - doBreakInvariantTest(*e, s); - s = *cannedTestChars + CharsToUnicodeString("\',.\\u3041\\u3042\\u3043\\u309b\\u309c\\u30a1\\u30a2\\u30a3\\u4e00\\u4e01\\u4e02"); - doOtherInvariantTest(*e, s); - delete e; -} - - -void RBBITest::TestSentenceInvariants() -{ - UErrorCode status = U_ZERO_ERROR; - BreakIterator *e = BreakIterator::createSentenceInstance(Locale::getDefault(), status); - if (U_FAILURE(status)) - { - errln("Failed to create the BreakIterator for default locale in TestSentenceInvariant.\n"); - return; - } - UnicodeString s = *cannedTestChars + CharsToUnicodeString(".,\\u3001\\u3002\\u3041\\u3042\\u3043\\ufeff"); - doOtherInvariantTest(*e, s); - delete e; -} - - - - -void RBBITest::doBreakInvariantTest(BreakIterator& tb, UnicodeString& testChars) -{ - UnicodeString work("aaa"); - int32_t errCount = 0, testCharsLen = testChars.length(), breaksLen; - - // a break should always occur after CR (unless followed by LF), LF, PS, and LS - UnicodeString breaks = CharsToUnicodeString("\r\n\\u2029\\u2028"); - int32_t i, j; - - breaksLen = breaks.length(); - for (i = 0; i < breaksLen; i++) { - UChar c1 = breaks[i]; - work.setCharAt(1, c1); - for (j = 0; j < testCharsLen; j++) { - UChar c0 = testChars[j]; - work.setCharAt(0, c0); - for (int k = 0; k < testCharsLen; k++) { - UChar c2 = testChars[k]; - work.setCharAt(2, c2); - - // if a cr is followed by lf, ps, ls or etx, don't do the check (that's - // not supposed to work) - if (c1 == '\r' && (c2 == '\n' || c2 == 0x2029 - || c2 == 0x2028 || c2 == 0x0003)) - continue; - - if (u_charType(c1) == U_CONTROL_CHAR && - (u_charType(c2) == U_NON_SPACING_MARK || - u_charType(c2) == U_ENCLOSING_MARK || - u_charType(c2) == U_COMBINING_SPACING_MARK) - ) { - // Combining marks don't combine with controls. - // TODO: enhance test to verify that the break actually occurs, - // not just ignore the case. - continue; - } - - - tb.setText(work); - UBool seen2 = FALSE; - for (int l = tb.first(); l != BreakIterator::DONE; l = tb.next()) { - if (l == 2) { - seen2 = TRUE; - break; - } - } - if (!seen2) { - errln("No Break between \\U%04x and \\U%04x", c1, c2); - errCount++; - if (errCount >= 75) - return; - } - } - } - } -} - - - -void RBBITest::doOtherInvariantTest(BreakIterator& tb, UnicodeString& testChars) -{ - UnicodeString work("a\r\na"); - int32_t errCount = 0, testCharsLen = testChars.length(); - int32_t i, j; - int8_t type; - - // a break should never occur between CR and LF - for (i = 0; i < testCharsLen; i++) { - work.setCharAt(0, testChars[i]); - for (j = 0; j < testCharsLen; j++) { - work.setCharAt(3, testChars[j]); - tb.setText(work); - for (int32_t k = tb.first(); k != BreakIterator::DONE; k = tb.next()) - if (k == 2) { - errln("Break between CR and LF in string U\\%04x U\\%04x U\\%04x U\\%04x", - work[0], work[1], work[2], work[3]); - errCount++; - if (errCount >= 75) - return; - } - } - } - - // a break should never occur before a non-spacing mark, unless the preceding - // character is CR, LF, PS, or LS - // Or the general category == Control. - work.remove(); - work += "aaaa"; - for (i = 0; i < testCharsLen; i++) { - UChar c1 = testChars[i]; - if (c1 == '\n' || c1 == '\r' || c1 == 0x2029 || c1 == 0x2028 || c1 == 0x0003 || - u_charType(c1) == U_CONTROL_CHAR || u_charType(c1) == U_FORMAT_CHAR) { - continue; - } - work.setCharAt(1, c1); - for (j = 0; j < testCharsLen; j++) { - UChar c2 = testChars[j]; - type = u_charType(c2); - if ((type != U_NON_SPACING_MARK) && - (type != U_ENCLOSING_MARK)) { - continue; - } - work.setCharAt(2, c2); - tb.setText(work); - for (int k = tb.first(); k != BreakIterator::DONE; k = tb.next()) - if (k == 2) { - //errln("Break between U+" + UCharToUnicodeString(work[1]) - // + " and U+" + UCharToUnicodeString(work[2])); - errln("Unexpected Break between %6x and %6x", c1, c2); - errCount++; - if (errCount >= 75) - return; - } - } - } -} - - - - -//--------------------------------------------- -// -// other tests -// -//--------------------------------------------- -void RBBITest::TestEmptyString() -{ - UnicodeString text = ""; - UErrorCode status = U_ZERO_ERROR; - - BITestData x(status); - ADD_DATACHUNK(x, "", 0, status); // Break at start of data - RuleBasedBreakIterator* bi = (RuleBasedBreakIterator *)BreakIterator::createLineInstance(Locale::getDefault(), status); - if (U_FAILURE(status)) - { - errln("Failed to create the BreakIterator for default locale in TestEmptyString.\n"); - return; - } - generalIteratorTest(*bi, x); - delete bi; -} - -void RBBITest::TestGetAvailableLocales() -{ - int32_t locCount = 0; - const Locale* locList = BreakIterator::getAvailableLocales(locCount); - - if (locCount == 0) - errln("getAvailableLocales() returned an empty list!"); - // Just make sure that it's returning good memory. - for (int32_t i = 0; i < locCount; ++i) { - logln(locList[i].getName()); - } -} - -//Testing the BreakIterator::getDisplayName() function -void RBBITest::TestGetDisplayName() -{ - UnicodeString result; - - BreakIterator::getDisplayName(Locale::getUS(), result); - if (Locale::getDefault() == Locale::getUS() && result != "English (United States)") - errln("BreakIterator::getDisplayName() failed: expected \"English (United States)\", got \"" - + result); - - BreakIterator::getDisplayName(Locale::getFrance(), Locale::getUS(), result); - if (result != "French (France)") - errln("BreakIterator::getDisplayName() failed: expected \"French (France)\", got \"" - + result); -} -/** - * Test End Behaviour - * @bug 4068137 - */ -void RBBITest::TestEndBehaviour() -{ - UErrorCode status = U_ZERO_ERROR; - UnicodeString testString("boo."); - BreakIterator *wb = BreakIterator::createWordInstance(Locale::getDefault(), status); - if (U_FAILURE(status)) - { - errln("Failed to create the BreakIterator for default locale in TestEndBehaviour.\n"); - return; - } - wb->setText(testString); - - if (wb->first() != 0) - errln("Didn't get break at beginning of string."); - if (wb->next() != 3) - errln("Didn't get break before period in \"boo.\""); - if (wb->current() != 4 && wb->next() != 4) - errln("Didn't get break at end of string."); - delete wb; -} -/* - * @bug 4153072 - */ -void RBBITest::TestBug4153072() { - UErrorCode status = U_ZERO_ERROR; - BreakIterator *iter = BreakIterator::createWordInstance(Locale::getDefault(), status); - if (U_FAILURE(status)) - { - errln("Failed to create the BreakIterator for default locale in TestBug4153072\n"); - return; - } - UnicodeString str("...Hello, World!..."); - int32_t begin = 3; - int32_t end = str.length() - 3; - UBool dummy; - - StringCharacterIterator* textIterator = new StringCharacterIterator(str, begin, end, begin); - iter->adoptText(textIterator); - for (int index = -1; index < begin + 1; ++index) { - dummy = iter->isBoundary(index); - if (index < begin && dummy == TRUE) { - errln((UnicodeString)"Didn't handle preceeding correctly with offset = " + index + - " and begin index = " + begin); - } - } - delete iter; -} - - -/** - * Test Japanese Line Break - * @bug 4095322 - */ -void RBBITest::TestJapaneseLineBreak() -{ - // Change for Unicode TR 14: Punctuation characters with categories Pi and Pf do not count - // as opening and closing punctuation for line breaking. - // Also, \u30fc and \u30fe are not counted as hyphens. Remove these chars - // from these tests. 6-13-2002 - // - UErrorCode status = U_ZERO_ERROR; - UnicodeString testString = CharsToUnicodeString("\\u4e00x\\u4e8c"); - UnicodeString precedingChars = CharsToUnicodeString( - //"([{\\u00ab$\\u00a5\\u00a3\\u00a4\\u2018\\u201a\\u201c\\u201e\\u201b\\u201f"); - "([{$\\u00a5\\u00a3\\u00a4\\u201a\\u201e"); - UnicodeString followingChars = CharsToUnicodeString( - // ")]}\\u00bb!%,.\\u3001\\u3002\\u3063\\u3083\\u3085\\u3087\\u30c3\\u30e3\\u30e5\\u30e7\\u30fc" - ")]}!%,.\\u3001\\u3002\\u3063\\u3083\\u3085\\u3087\\u30c3\\u30e3\\u30e5\\u30e7" - // ":;\\u309b\\u309c\\u3005\\u309d\\u309e\\u30fd\\u30fe\\u2019\\u201d\\u00b0\\u2032\\u2033\\u2034" - ":;\\u309b\\u309c\\u3005\\u309d\\u309e\\u30fd\\u00b0\\u2032\\u2033\\u2034" - "\\u2030\\u2031\\u2103\\u2109\\u00a2\\u0300\\u0301\\u0302"); - BreakIterator *iter = BreakIterator::createLineInstance(Locale::getJapan(), status); - - int32_t i; - if (U_FAILURE(status)) - { - errln("Failed to create the BreakIterator for Japanese locale in TestJapaneseLineBreak.\n"); - return; - } - - for (i = 0; i < precedingChars.length(); i++) { - testString.setCharAt(1, precedingChars[i]); - iter->setText(testString); - int32_t j = iter->first(); - if (j != 0) - errln("ja line break failure: failed to start at 0"); - j = iter->next(); - if (j != 1) - errln("ja line break failure: failed to stop before '" + UCharToUnicodeString(precedingChars[i]) - + "' (" + ((int)(precedingChars[i])) + ")"); - j = iter->next(); - if (j != 3) - errln("ja line break failure: failed to skip position after '" + UCharToUnicodeString(precedingChars[i]) - + "' (" + ((int)(precedingChars[i])) + ")"); - } - - for (i = 0; i < followingChars.length(); i++) { - testString.setCharAt(1, followingChars[i]); - iter->setText(testString); - int j = iter->first(); - if (j != 0) - errln("ja line break failure: failed to start at 0"); - j = iter->next(); - if (j != 2) - errln("ja line break failure: failed to skip position before '" + UCharToUnicodeString(followingChars[i]) - + "' (" + ((int)(followingChars[i])) + ")"); - j = iter->next(); - if (j != 3) - errln("ja line break failure: failed to stop after '" + UCharToUnicodeString(followingChars[i]) - + "' (" + ((int)(followingChars[i])) + ")"); - } - delete iter; -} - - -//------------------------------------------------------------------------------ -// -// RBBITest::Extended Run RBBI Tests from an external test data file -// -//------------------------------------------------------------------------------ - -struct TestParams { - BreakIterator *bi; - UnicodeString dataToBreak; - UVector32 *expectedBreaks; - UVector32 *srcLine; - UVector32 *srcCol; -}; - -void RBBITest::executeTest(TestParams *t) { - int32_t bp; - int32_t prevBP; - int32_t i; - - t->bi->setText(t->dataToBreak); - // - // Run the iterator forward - // - prevBP = -1; - for (bp = t->bi->first(); bp != BreakIterator::DONE; bp = t->bi->next()) { - if (prevBP == bp) { - // Fail for lack of forward progress. - errln("Forward Iteration, no forward progress. Break Pos=%4d File line,col=%4d,%4d", - bp, t->srcLine->elementAti(bp), t->srcCol->elementAti(bp)); - break; - } - - // Check that there were we didn't miss an expected break between the last one - // and this one. - for (i=prevBP+1; iexpectedBreaks->elementAti(i) != 0) { - errln("Forward Itertion, break expected, but not found. Pos=%4d File line,col= %4d,%4d", - i, t->srcLine->elementAti(i), t->srcCol->elementAti(i)); - } - } - - // Check that the break we did find was expected - if (t->expectedBreaks->elementAti(bp) == 0) { - errln("Forward Itertion, break found, but not expected. Pos=%4d File line,col= %4d,%4d", - bp, t->srcLine->elementAti(bp), t->srcCol->elementAti(bp)); - } else { - // The break was expected. - // Check that the {nnn} tag value is correct. - int32_t expectedTagVal = t->expectedBreaks->elementAti(bp); - if (expectedTagVal == -1) { - expectedTagVal = 0; - } - int32_t rs = ((RuleBasedBreakIterator *)t->bi)->getRuleStatus(); - if (rs != expectedTagVal) { - errln("Incorrect status for break. Pos=%4d File line,col= %4d,%4d.\n" - " Actual, Expected status = %4d, %4d", - bp, t->srcLine->elementAti(bp), t->srcCol->elementAti(bp), rs, expectedTagVal); - } - } - - - prevBP = bp; - } - - // Verify that there were no missed expected breaks after the last one found - for (i=prevBP+1; iexpectedBreaks->size(); i++) { - if (t->expectedBreaks->elementAti(i) != 0) { - errln("Forward Itertion, break expected, but not found. Pos=%4d File line,col= %4d,%4d", - i, t->srcLine->elementAti(i), t->srcCol->elementAti(i)); - } - } - - // - // Run the iterator backwards, verify that the same breaks are found. - // - prevBP = t->dataToBreak.length()+2; // start with a phony value for the last break pos seen. - for (bp = t->bi->last(); bp != BreakIterator::DONE; bp = t->bi->previous()) { - if (prevBP == bp) { - // Fail for lack of progress. - errln("Reverse Iteration, no progress. Break Pos=%4d File line,col=%4d,%4d", - bp, t->srcLine->elementAti(bp), t->srcCol->elementAti(bp)); - break; - } - - // Check that there were we didn't miss an expected break between the last one - // and this one. (UVector returns zeros for index out of bounds.) - for (i=prevBP-1; i>bp; i--) { - if (t->expectedBreaks->elementAti(i) != 0) { - errln("Reverse Itertion, break expected, but not found. Pos=%4d File line,col= %4d,%4d", - i, t->srcLine->elementAti(i), t->srcCol->elementAti(i)); - } - } - - // Check that the break we did find was expected - if (t->expectedBreaks->elementAti(bp) == 0) { - errln("Reverse Itertion, break found, but not expected. Pos=%4d File line,col= %4d,%4d", - bp, t->srcLine->elementAti(bp), t->srcCol->elementAti(bp)); - } else { - // The break was expected. - // Check that the {nnn} tag value is correct. - int32_t expectedTagVal = t->expectedBreaks->elementAti(bp); - if (expectedTagVal == -1) { - expectedTagVal = 0; - } - int32_t rs = ((RuleBasedBreakIterator *)t->bi)->getRuleStatus(); - if (rs != expectedTagVal) { - errln("Incorrect status for break. Pos=%4d File line,col= %4d,%4d.\n" - " Actual, Expected status = %4d, %4d", - bp, t->srcLine->elementAti(bp), t->srcCol->elementAti(bp), rs, expectedTagVal); - } - } - - prevBP = bp; - } - - // Verify that there were no missed breaks prior to the last one found - for (i=prevBP-1; i>=0; i--) { - if (t->expectedBreaks->elementAti(i) != 0) { - errln("Forward Itertion, break expected, but not found. Pos=%4d File line,col= %4d,%4d", - i, t->srcLine->elementAti(i), t->srcCol->elementAti(i)); - } - } -} - - -void RBBITest::TestExtended() { - UErrorCode status = U_ZERO_ERROR; - Locale locale = Locale::getDefault(); - - UnicodeString rules; - TestParams tp; - tp.bi = NULL; - tp.expectedBreaks = new UVector32(status); - tp.srcLine = new UVector32(status); - tp.srcCol = new UVector32(status); - - - // - // Open and read the test data file. - // - const char *testDataDirectory = loadTestData(status); - char testFileName[1000]; - if (strlen(testDataDirectory) >= sizeof(testFileName)) { - errln("Can't open test data. Path too long."); - return; - } - strcpy(testFileName, testDataDirectory); - char *p = strstr(testFileName, "/out/testdata"); - if (p == NULL) { - p = strstr(testFileName, "\\out\\testdata"); - if (p == NULL) { - errln("Can't open test data. Bad test data directory path.."); - return; - } - } - strcpy(p+1, "rbbitst.txt"); - - int len; - UChar *testFile = ReadAndConvertFile(testFileName, len, status); - - - - // - // Put the test data into a UnicodeString - // - UnicodeString testString(FALSE, testFile, len); - - enum EParseState{ - PARSE_COMMENT, - PARSE_TAG, - PARSE_RULE, - PARSE_DATA, - PARSE_NUM - } - parseState = PARSE_TAG; - - EParseState savedState = PARSE_TAG; - - const UChar CH_LF = 0x0a; - const UChar CH_CR = 0x0d; - const UChar CH_HASH = 0x23; - const UChar CH_PERIOD = 0x2e; - const UChar CH_LT = 0x3c; - const UChar CH_GT = 0x3e; - const UChar CH_BACKSLASH = 0x5c; - const UChar CH_BULLET = 0x2022; - - int32_t lineNum = 1; - int32_t colStart = 0; - int32_t column = 0; - int32_t charIdx = 0; - - int32_t tagValue = 0; // The numeric value of a tag. - - for (charIdx = 0; charIdx < len; ) { - UChar c = testString.charAt(charIdx); - charIdx++; - if (c == CH_CR && charIdx") == 0) { - delete tp.bi; - tp.bi = BreakIterator::createWordInstance(locale, status); - charIdx += 5; - break; - } - if (testString.compare(charIdx-1, 6, "") == 0) { - delete tp.bi; - tp.bi = BreakIterator::createCharacterInstance(locale, status); - charIdx += 5; - break; - } - if (testString.compare(charIdx-1, 6, "") == 0) { - delete tp.bi; - tp.bi = BreakIterator::createLineInstance(locale, status); - charIdx += 5; - break; - } - if (testString.compare(charIdx-1, 6, "") == 0) { - delete tp.bi; - tp.bi = BreakIterator::createSentenceInstance(locale, status); - charIdx += 5; - break; - } - if (testString.compare(charIdx-1, 7, "") == 0) { - delete tp.bi; - tp.bi = BreakIterator::createTitleInstance(locale, status); - charIdx += 6; - break; - } - if (testString.compare(charIdx-1, 6, "<data>") == 0) { - parseState = PARSE_DATA; - charIdx += 5; - tp.dataToBreak = ""; - tp.expectedBreaks->removeAllElements(); - tp.srcCol ->removeAllElements(); - tp.srcLine->removeAllElements(); - break; - } - - errln("line %d: Tag expected in test file.", lineNum); - goto end_test; - parseState = PARSE_COMMENT; - savedState = PARSE_DATA; - } - break; - - case PARSE_DATA: - if (c == CH_BULLET) { - int32_t breakIdx = tp.dataToBreak.length(); - tp.expectedBreaks->setSize(breakIdx+1); - tp.expectedBreaks->setElementAt(-1, breakIdx); - tp.srcLine->setSize(breakIdx+1); - tp.srcLine->setElementAt(lineNum, breakIdx); - tp.srcCol ->setSize(breakIdx+1); - tp.srcCol ->setElementAt(column, breakIdx); - break; - } - - if (testString.compare(charIdx-1, 7, "</data>") == 0) { - // Add final entry to mappings from break location to source file position. - // Need one extra because last break position returned is after the - // last char in the data, not at the last char. - tp.srcLine->addElement(lineNum, status); - tp.srcCol ->addElement(column, status); - - parseState = PARSE_TAG; - charIdx += 7; - - // RUN THE TEST! - executeTest(&tp); - break; - } - - if (testString.compare(charIdx-1, 3, "\\N{") == 0) { - // Named character, e.g. \N{COMBINING GRAVE ACCENT} - // Get the code point from the name and insert it into the test data. - // (Damn, no API takes names in Unicode !!! - // we've got to take it back to char *) - int32_t nameEndIdx = testString.indexOf((UChar)0x7d/*'}'*/, charIdx); - int32_t nameLength = nameEndIdx - (charIdx+2); - char charNameBuf[200]; - UChar32 theChar = -1; - if (nameEndIdx != -1) { - UErrorCode status = U_ZERO_ERROR; - testString.extract(charIdx+2, nameLength, charNameBuf, sizeof(charNameBuf)); - charNameBuf[sizeof(charNameBuf)-1] = 0; - theChar = u_charFromName(U_UNICODE_CHAR_NAME, charNameBuf, &status); - if (U_FAILURE(status)) { - theChar = -1; - } - } - if (theChar == -1) { - errln("Error in named character in test file at line %d, col %d", - lineNum, column); - } else { - // Named code point was recognized. Insert it - // into the test data. - tp.dataToBreak.append(theChar); - while (tp.dataToBreak.length() > tp.srcLine->size()) { - tp.srcLine->addElement(lineNum, status); - tp.srcCol ->addElement(column, status); - } - } - if (nameEndIdx > charIdx) { - charIdx = nameEndIdx+1; - } - break; - } - - - - - if (testString.compare(charIdx-1, 2, "<>") == 0) { - charIdx++; - int32_t breakIdx = tp.dataToBreak.length(); - tp.expectedBreaks->setSize(breakIdx+1); - tp.expectedBreaks->setElementAt(-1, breakIdx); - tp.srcLine->setSize(breakIdx+1); - tp.srcLine->setElementAt(lineNum, breakIdx); - tp.srcCol ->setSize(breakIdx+1); - tp.srcCol ->setElementAt(column, breakIdx); - break; - } - - if (c == CH_LT) { - tagValue = 0; - parseState = PARSE_NUM; - break; - } - - if (c == CH_HASH && column==3) { // TODO: why is column off so far? - parseState = PARSE_COMMENT; - savedState = PARSE_DATA; - break; - } - - if (c == CH_BACKSLASH) { - // Check for \ at end of line, a line continuation. - // Advance over (discard) the newline - UChar32 cp = testString.char32At(charIdx); - if (cp == CH_CR && charIdx<len && testString.charAt(charIdx+1) == CH_LF) { - // We have a CR LF - // Need an extra increment of the input ptr to move over both of them - charIdx++; - } - if (cp == CH_LF || cp == CH_CR) { - lineNum++; - colStart = charIdx; - charIdx++; - break; - } - - // Let unescape handle the back slash. - cp = testString.unescapeAt(charIdx); - if (cp != -1) { - // Escape sequence was recognized. Insert the char - // into the test data. - tp.dataToBreak.append(cp); - while (tp.dataToBreak.length() > tp.srcLine->size()) { - tp.srcLine->addElement(lineNum, status); - tp.srcCol ->addElement(column, status); - } - break; - } - - - // Not a recognized backslash escape sequence. - // Take the next char as a literal. - // TODO: Should this be an error? - c = testString.charAt(charIdx); - charIdx = testString.moveIndex32(charIdx, 1); - } - - // Normal, non-escaped data char. - tp.dataToBreak.append(c); - - // Save the mapping from offset in the data to line/column numbers in - // the original input file. Will be used for better error messages only. - // If there's an expected break before this char, the slot in the mapping - // vector will already be set for this char; don't overwrite it. - if (tp.dataToBreak.length() > tp.srcLine->size()) { - tp.srcLine->addElement(lineNum, status); - tp.srcCol ->addElement(column, status); - } - break; - - - case PARSE_NUM: - // We are parsing an expected numeric tag value, like <1234>, - // within a chunk of data. - if (u_isUWhiteSpace(c)) { - break; - } - - if (c == CH_GT) { - // Finished the number. Add the info to the expected break data, - // and switch parse state back to doing plain data. - parseState = PARSE_DATA; - if (tagValue == 0) { - tagValue = -1; - } - int32_t breakIdx = tp.dataToBreak.length(); - tp.expectedBreaks->setSize(breakIdx+1); - tp.expectedBreaks->setElementAt(tagValue, breakIdx); - tp.srcLine->setSize(breakIdx+1); - tp.srcLine->setElementAt(lineNum, breakIdx); - tp.srcCol ->setSize(breakIdx+1); - tp.srcCol ->setElementAt(column, breakIdx); - break; - } - - if (u_isdigit(c)) { - tagValue = tagValue*10 + u_charDigitValue(c); - break; - } - - errln("Syntax Error in test file at line %d, col %d", - lineNum, column); - goto end_test; - parseState = PARSE_COMMENT; - break; - } - - - if (U_FAILURE(status)) { - errln("ICU Error %s while parsing test file at line %d.", - u_errorName(status), lineNum); - goto end_test; - status = U_ZERO_ERROR; - } - - } - -end_test: - delete tp.bi; - delete tp.expectedBreaks; - delete tp.srcLine; - delete tp.srcCol; - delete [] testFile; -} - - -//------------------------------------------------------------------------------- -// -// ReadAndConvertFile Read a text data file, convert it to UChars, and -// return the datain one big UChar * buffer, which the caller must delete. -// -// TODO: This is a clone of RegexTest::ReadAndConvertFile. -// Move this function to some common place. -// -//-------------------------------------------------------------------------------- -UChar *RBBITest::ReadAndConvertFile(const char *fileName, int &ulen, UErrorCode &status) { - UChar *retPtr = NULL; - char *fileBuf = NULL; - UConverter* conv = NULL; - FILE *f = NULL; - - ulen = 0; - if (U_FAILURE(status)) { - return retPtr; - } - - // - // Open the file. - // - f = fopen(fileName, "rb"); - if (f == 0) { - errln("Error opening test data file %s\n", fileName); - goto cleanUpAndReturn; - } - // - // Read it in - // - int fileSize; - int amt_read; - - fseek( f, 0, SEEK_END); - fileSize = ftell(f); - fileBuf = new char[fileSize]; - fseek(f, 0, SEEK_SET); - amt_read = fread(fileBuf, 1, fileSize, f); - if (amt_read != fileSize || fileSize <= 0) { - errln("Error reading test data file."); - goto cleanUpAndReturn; - } - - // - // Look for a Unicode Signature (BOM) on the data just read - // - int32_t signatureLength; - const char * fileBufC; - const char* encoding; - - fileBufC = fileBuf; - encoding = ucnv_detectUnicodeSignature( - fileBuf, fileSize, &signatureLength, &status); - if(encoding!=NULL ){ - fileBufC += signatureLength; - fileSize -= signatureLength; - } - - // - // Open a converter to take the rule file to UTF-16 - // - conv = ucnv_open(encoding, &status); - if (U_FAILURE(status)) { - goto cleanUpAndReturn; - } - - // - // Convert the rules to UChar. - // Preflight first to determine required buffer size. - // - ulen = ucnv_toUChars(conv, - NULL, // dest, - 0, // destCapacity, - fileBufC, - fileSize, - &status); - if (status == U_BUFFER_OVERFLOW_ERROR) { - // Buffer Overflow is expected from the preflight operation. - status = U_ZERO_ERROR; - - retPtr = new UChar[ulen+1]; - ucnv_toUChars(conv, - retPtr, // dest, - ulen+1, - fileBufC, - fileSize, - &status); - } - -cleanUpAndReturn: - fclose(f); - delete fileBuf; - ucnv_close(conv); - if (U_FAILURE(status)) { - errln("ucnv_toUChars: ICU Error \"%s\"\n", u_errorName(status)); - delete retPtr; - retPtr = 0; - ulen = 0; - }; - return retPtr; -} - - -//-------------------------------------------------------------------------------------------- -// -// Exhaustive Tests, using Unicode Data Files. -// -//-------------------------------------------------------------------------------------------- - -// -// Token level scanner for the Unicode Line Break Test Data file. -// Return the next token, as follows: -// >= 0: a UChar32 character, scanned from hex in the file. -// -1: a break position, a division sign in the file. -// -2: end of rule. A new line in the file. -// -3: end of file. No more rules. -// -4: Error -// -// The scanner -// strips comments, ('#' to end of line) -// Recognizes CR, CR/LF and LF as new lines. -// Skips over spaces and Xs (don't break here) in the data. -// -struct ScanState { - int32_t fPeekChar; - UBool fPeeked; - int32_t fLineNum; - FILE *fFile; - ScanState() :fPeeked(FALSE), fLineNum(0), fFile(NULL) {}; -}; - -// Literal characters that are of interest. In hex to keep EBCDIC based machines happy. -// The data itself is latin-1 on all platforms. -static const int32_t chSpace = 0x20; -static const int32_t chTab = 0x09; -static const int32_t chCR = 0x0D; -static const int32_t chLF = 0x0A; -static const int32_t chHash = 0x23; -static const int32_t chMult = 0xD7; -static const int32_t chDivide = 0xF7; - -static int32_t nextLBDToken(ScanState *s) { - int32_t c; - - // Read characters from the input file until we get something interesting - // to return. The file is in latin-1 encoding. - for (;;) { - // Get the next character to look at, - if (s->fPeeked) { - c = s->fPeekChar; - s->fPeeked = FALSE; - } else { - c = getc(s->fFile); - } - - // EOF. Return immediately. - if (c == EOF) { - return -3; - } - - // Spaces. Treat the multiply sign as a space - it indicates a no-break position - // in the data, and the test program doesn't want to see them. - // Continue the next char loop, looking for something significant. - if (c == chSpace || c == chTab || c == chMult) { - continue; - } - - // Divide sign. Indicates an expected break position. - if (c == chDivide) { - return -1; - } - - // New Line Handling. Keep track of line number in the file, which in turn - // requires keeping track of CR/LF as a single new line. - if (c == chCR) { - s->fLineNum++; - s->fPeekChar = getc(s->fFile); - if (s->fPeekChar != chLF) {s->fPeeked = TRUE;}; - return -2; - } - if (c == chLF) { - s->fLineNum++; - return -2; - } - - // Comments. Consume everything up to the next new line. - if (c == chHash) { - do { - c = getc(s->fFile); - } while (!(c == EOF || c == chCR || c == chLF)); - s->fPeekChar = c; - s->fPeeked = TRUE; - return nextLBDToken(s); - } - - // Scan a hex character (UChar32) value. - if (u_digit(c, 16) >= 0) { - int32_t v = u_digit(c, 16); - for (;;) { - c = getc(s->fFile); - if (u_digit(c, 16) < 0) {break;}; - v <<= 4; - v += u_digit(c, 16); - } - s->fPeekChar = c; - s->fPeeked = TRUE; - return v; - } - - // Error. Character was something unexpected. - return -4; - } -} - - - -void RBBITest::TestLineBreakData() { - - UErrorCode status = U_ZERO_ERROR; - UnicodeString testString; - UVector expectedBreaks(status); - ScanState ss; - int32_t tok; - - BreakIterator *bi = BreakIterator::createLineInstance(Locale::getDefault(), status); - if (U_FAILURE(status)) { - errln("Failure creating break iterator"); - return; - } - - const char * lbdfName = "LBTest.txt"; - - // Open the test data file. - // TODO: a proper way to handle this data. - ss.fFile = fopen(lbdfName, "rb"); - if (ss.fFile == NULL) { - logln("Unable to open Line Break Test Data file. Skipping test."); - delete bi; - return; - } - - // Loop once per line from the test data file. - for (;;) { - // Zero out test data from previous line. - testString.truncate(0); - expectedBreaks.removeAllElements(); - - // Read one test's (line's) worth of data from the file. - // Loop once per token on the input file line. - for(;;) { - tok = nextLBDToken(&ss); - - // If we scanned a character number in the file. - // save it in the test data array. - if (tok >= 0) { - testString.append((UChar32)tok); - continue; - } - - // If we scanned a break position in the data, record it. - if (tok == -1) { - expectedBreaks.addElement(testString.length(), status); - continue; - } - - // If we scanned a new line, or EOF - // drop out of scan loop and run the test case. - if (tok == -2 || tok == -3) {break;}; - - // None of above. Error. - errln("Failure: Unrecognized data format, test file line %d", ss.fLineNum); - break; - } - - // If this line from the test data file actually contained test data, - // run the test. - if (testString.length() > 0) { - int32_t pos; // Break Position in the test string - int32_t expectedI = 0; // Index of expected break position in vector of same. - int32_t expectedPos; // Expected break position (index into test string) - - bi->setText(testString); - pos = bi->first(); // TODO: break iterators always return a match at pos 0. - pos = bi->next(); // Line Break TR says no match at position 0. - // Resolve. - - for (; pos != BreakIterator::DONE; ) { - expectedPos = expectedBreaks.elementAti(expectedI); - if (pos < expectedPos) { - errln("Failure: Test file line %d, unexpected break found at position %d", - ss.fLineNum, pos); - break; - } - if (pos > expectedPos) { - errln("Failure: Test file line %d, failed to find break at position %d", - ss.fLineNum, expectedPos); - break; - } - pos = bi->next(); - expectedI++; - } - } - - // If we've hit EOF on the input file, we're done. - if (tok == -3) { - break; - } - - } - - fclose(ss.fFile); - delete bi; - -} - -#if !UCONFIG_NO_REGULAR_EXPRESSIONS - -//--------------------------------------------------------------------------------------- -// -// classs RBBIMonkeyKind -// -// Monkey Test for Break Iteration -// Abstract interface class. Concrete derived classes independently -// implement the break rules for different iterator types. -// -// The Monkey Test itself uses doesn't know which type of break iterator it is -// testing, but works purely in terms of the interface defined here. -// -//--------------------------------------------------------------------------------------- -class RBBIMonkeyKind { -public: - // Return a UVector of UnicodeSets, representing the character classes used - // for this type of iterator. - virtual UVector *charClasses() = 0; - - // Set the test text on which subsequent calls to next() will operate - virtual void setText(const UnicodeString &s) = 0; - - // Find the next break postion, starting from the prev break position, or from zero. - // Return -1 after reaching end of string. - virtual int32_t next(int32_t i) = 0; - - virtual ~RBBIMonkeyKind(); - UErrorCode deferredStatus; - - -protected: - RBBIMonkeyKind(); - -private: -}; - -RBBIMonkeyKind::RBBIMonkeyKind() { - deferredStatus = U_ZERO_ERROR; -} - -RBBIMonkeyKind::~RBBIMonkeyKind() { -} - - -//---------------------------------------------------------------------------------------- -// -// Random Numbers. Similar to standard lib rand() and srand() -// Not using library to -// 1. Get same results on all platforms. -// 2. Get access to current seed, to more easily reproduce failures. -// -//--------------------------------------------------------------------------------------- -static uint32_t m_seed = 1; - -static uint32_t m_rand() -{ - m_seed = m_seed * 1103515245 + 12345; - return (uint32_t)(m_seed/65536) % 32768; -} - - -//------------------------------------------------------------------------------------------ -// -// class RBBICharMonkey Character (Grapheme Cluster) specific implementation -// of RBBIMonkeyKind. -// -//------------------------------------------------------------------------------------------ -class RBBICharMonkey: public RBBIMonkeyKind { -public: - RBBICharMonkey(); - virtual ~RBBICharMonkey(); - virtual UVector *charClasses(); - virtual void setText(const UnicodeString &s); - virtual int32_t next(int32_t i); -private: - UVector *fSets; - - UnicodeSet *fCRLFSet; - UnicodeSet *fControlSet; - UnicodeSet *fExtendSet; - UnicodeSet *fHangulSet; - UnicodeSet *fAnySet; - - RegexMatcher *fMatcher; - const UnicodeString *fText; -}; - - -RBBICharMonkey::RBBICharMonkey() { - UErrorCode status = U_ZERO_ERROR; - - fText = NULL; - fMatcher = new RegexMatcher("\\X", 0, status); // Pattern to match a grampheme cluster - - fCRLFSet = new UnicodeSet("[\\r\\n]", status); - fControlSet = new UnicodeSet("[[\\p{Zl}\\p{Zp}\\p{Cc}\\p{Cf}]-[\\n]-[\\r]]", status); - fExtendSet = new UnicodeSet("[\\p{Grapheme_Extend}]", status); - fHangulSet = new UnicodeSet( - "[\\p{Hangul_Syllable_Type=L}\\p{Hangul_Syllable_Type=L}\\p{Hangul_Syllable_Type=T}" - "\\p{Hangul_Syllable_Type=LV}\\p{Hangul_Syllable_Type=LVT}]", status); - fAnySet = new UnicodeSet("[\\u0000-\\U0010ffff]", status); - - fSets = new UVector(status); - fSets->addElement(fCRLFSet, status); - fSets->addElement(fControlSet, status); - fSets->addElement(fExtendSet, status); - fSets->addElement(fHangulSet, status); - fSets->addElement(fAnySet, status); - if (U_FAILURE(status)) { - deferredStatus = status; - } -}; - - -void RBBICharMonkey::setText(const UnicodeString &s) { - fText = &s; - fMatcher->reset(s); -} - - -int32_t RBBICharMonkey::next(int32_t i) { - UErrorCode status = U_ZERO_ERROR; - int32_t retVal = -1; - - if (fMatcher->find(i, status)) { - retVal = fMatcher->end(status); - } - if (U_FAILURE(status)){ - retVal = -1; - } - return retVal; -} - - -UVector *RBBICharMonkey::charClasses() { - return fSets; -} - - -RBBICharMonkey::~RBBICharMonkey() { - delete fSets; - delete fCRLFSet; - delete fControlSet; - delete fExtendSet; - delete fHangulSet; - delete fAnySet; - - delete fMatcher; -} - -//------------------------------------------------------------------------------------------ -// -// class RBBIWordMonkey Word Break specific implementation -// of RBBIMonkeyKind. -// -//------------------------------------------------------------------------------------------ -class RBBIWordMonkey: public RBBIMonkeyKind { -public: - RBBIWordMonkey(); - virtual ~RBBIWordMonkey(); - virtual UVector *charClasses(); - virtual void setText(const UnicodeString &s); - virtual int32_t next(int32_t i); -private: - UVector *fSets; - - UnicodeSet *fKatakanaSet; - UnicodeSet *fALetterSet; - UnicodeSet *fMidLetterSet; - UnicodeSet *fMidNumLetSet; - UnicodeSet *fMidNumSet; - UnicodeSet *fNumericSet; - UnicodeSet *fFormatSet; - UnicodeSet *fOtherSet; - UnicodeSet *fExtendSet; - - RegexMatcher *fMatcher; - - const UnicodeString *fText; - UChar32 *fMungedText; - int32_t fMungedLen; - int32_t *fMungedPositions; - int32_t *fOrigPositions; - - RegexMatcher *fGCFMatcher; - RegexMatcher *fGCMatcher; - -}; - - -RBBIWordMonkey::RBBIWordMonkey() : fMungedText(0), - fMungedPositions(0), - fOrigPositions(0), - fGCFMatcher(0), - fGCMatcher(0) -{ - UErrorCode status = U_ZERO_ERROR; - - fSets = new UVector(status); - - fKatakanaSet = new UnicodeSet("[\\p{script=KATAKANA}\\u30fc\\uff70\\ufe9e\\ff9f]", status); - - const UnicodeString ALetterStr( "[[\\p{Alphabetic}\\u05f3]-[\\p{Ideographic}]-[\\p{Script=Thai}]" - "-[\\p{Script=Lao}]-[\\p{Script=Hiragana}]-" - "[\\p{script=KATAKANA}\\u30fc\\uff70\\ufe9e\\ff9f]]"); - - fALetterSet = new UnicodeSet(ALetterStr, status); - fMidLetterSet = new UnicodeSet("[\\u0027\\u00b7\\u05f4\\u2019\\u2027]", status); - fMidNumLetSet = new UnicodeSet("[\\u002e\\u003a]", status); - fMidNumSet = new UnicodeSet("[\\p{Line_Break=Infix_Numeric}]", status); - fNumericSet = new UnicodeSet("[\\p{Line_Break=Numeric}]", status); - fFormatSet = new UnicodeSet("[\\p{Format}]", status); - fExtendSet = new UnicodeSet("[\\p{Grapheme_Extend}]", status); - fOtherSet = new UnicodeSet(); - if(U_FAILURE(status)) { - deferredStatus = status; - return; - } - - fOtherSet->complement(); - fOtherSet->removeAll(*fKatakanaSet); - fOtherSet->removeAll(*fALetterSet); - fOtherSet->removeAll(*fMidLetterSet); - fOtherSet->removeAll(*fMidNumLetSet); - fOtherSet->removeAll(*fMidNumSet); - fOtherSet->removeAll(*fNumericSet); - - fSets->addElement(fALetterSet, status); - fSets->addElement(fMidLetterSet, status); - fSets->addElement(fMidNumLetSet, status); - fSets->addElement(fMidNumSet, status); - fSets->addElement(fNumericSet, status); - fSets->addElement(fFormatSet, status); - fSets->addElement(fOtherSet, status); - - fMungedText = NULL; - fMungedLen = 0; - fMungedPositions = NULL; - fOrigPositions = NULL; - - fGCFMatcher = new RegexMatcher("\\X(?:\\p{Format}\\p{Grapheme_Extend}*)*", 0, status); - fGCMatcher = new RegexMatcher("\\X", 0, status); - - if (U_FAILURE(status)) { - deferredStatus = status; - } -}; - -void RBBIWordMonkey::setText(const UnicodeString &s) { - fText = &s; - - delete [] fMungedText; - fMungedText = new UChar32[s.length()]; - fMungedLen = 0; - delete [] fMungedPositions; - fMungedPositions = new int32_t[s.length()]; - delete [] fOrigPositions; - fOrigPositions = new int32_t[s.length()]; - memset(fOrigPositions, -1, s.length()*4); - - // Precompute the "Munged Text", which is the test text, - // converted to an array of UChar32 for easier indexing, - // and with all but the first char of each Graphem Cluster removed (rule 3) - // and with format chars removed (rule 4) - fGCFMatcher->reset(s); - fGCMatcher ->reset(s); - int32_t pos=0; - while (fGCFMatcher->find()) { - pos = fGCFMatcher->start(deferredStatus); - UChar32 c = s.char32At(pos); - fMungedPositions[fMungedLen] = pos; - fOrigPositions[pos] = fMungedLen; - fMungedText[fMungedLen++] = c; - } -} - - -int32_t RBBIWordMonkey::next(int32_t prevPos) { - UErrorCode status = U_ZERO_ERROR; - - if (prevPos >= fText->length()) { - return -1; - } - - // If the previous position doesn't map to a position in the munged text, - // it means that the prev position was pointing to a trailing format char - // Advance, looking for additional format chars while doing so. - if (fOrigPositions[prevPos] == -1) { - // Advance by one grapheme cluster (could include combining marks) - fGCMatcher->reset(); - fGCMatcher->find(prevPos, status); - int32_t pos = fGCMatcher->end(status); - if (U_FAILURE(status)) { - pos = -1; - } - // TODO: Don't return extend chars here!!! - return pos; - } - - - // Loop runs once per position in the munged test text, until a break position - // is found. - int32_t mpos = fOrigPositions[prevPos]; - for (; ; mpos++) { - UChar32 letter = fMungedText[mpos]; - - // Break at end of text. - if (mpos >= fMungedLen-1) { - mpos = fMungedLen; - break; - } - - // Rule (5). ALetter x ALetter - if (fALetterSet->contains(fMungedText[mpos]) && - fALetterSet->contains(fMungedText[mpos+1])) { - continue; - } - - // Rule (6) ALetter x (MidLetter | MidNumLet) ALetter - if ((mpos+2) < fMungedLen && - fALetterSet->contains(fMungedText[mpos]) && - (fMidLetterSet->contains(fMungedText[mpos+1]) || - fMidNumLetSet->contains(fMungedText[mpos+1]) ) && - fALetterSet->contains(fMungedText[mpos+2])) - continue; - - // Rule (7) ALetter (MidLetter | MidNumLet) x ALetter - if (mpos >= 1 && - fALetterSet->contains(fMungedText[mpos-1]) && - (fMidLetterSet->contains(fMungedText[mpos]) || - fMidNumLetSet->contains(fMungedText[mpos]) ) && - fALetterSet->contains(fMungedText[mpos+1])) - continue; - - // Rule (8) Numeric x Numeric - if (fNumericSet->contains(fMungedText[mpos]) && - fNumericSet->contains(fMungedText[mpos+1])) { - continue; - } - - // Rule (9) ALetter x Numeric - if (fALetterSet->contains(fMungedText[mpos]) && - fNumericSet->contains(fMungedText[mpos+1])) { - continue; - } - - // Rule (10) Numeric x ALetter - if (fNumericSet->contains(fMungedText[mpos]) && - fALetterSet->contains(fMungedText[mpos+1])) { - continue; - } - - // Rule (11) Numeric (MidNum | MidNumLet) x Numeric - if (mpos >= 1 && - fNumericSet->contains(fMungedText[mpos-1]) && - (fMidNumSet->contains(fMungedText[mpos]) || - fMidNumLetSet->contains(fMungedText[mpos]) ) && - fNumericSet->contains(fMungedText[mpos+1])) - continue; - - // Rule (12) Numeric x (MidNum | MidNumLet) Numeric - if ((mpos+2) < fMungedLen && - fNumericSet->contains(fMungedText[mpos]) && - (fMidNumSet->contains(fMungedText[mpos+1]) || - fMidNumLetSet->contains(fMungedText[mpos+1]) ) && - fNumericSet->contains(fMungedText[mpos+2])) - continue; - - // Rule (13) Katakana x Katakana - if (fKatakanaSet->contains(fMungedText[mpos]) && - fKatakanaSet->contains(fMungedText[mpos+1])) { - continue; - } - - // Rule 14. Break found here. - mpos++; - break; - } - - // We have a break position in terms of an index in the munged data. - // Get the corresponding index in the original test text. - int32_t breakPos; - if (mpos == fMungedLen) { - breakPos = fText->length(); - } else { - breakPos = fMungedPositions[mpos]; - } - - // Rule 4 fixup, back up before any trailing - // format characters at the end of the word. - int32_t t = breakPos; - for (;;) { - t = fText->moveIndex32(t, -1); - if (t <= prevPos) { - break; - } - UChar32 prevC = fText->char32At(t); - if (fExtendSet->contains(prevC)) { - continue; - } - if (fFormatSet->contains(prevC) == FALSE) { - break; - } - breakPos = t; - } - - return breakPos; -} - - -UVector *RBBIWordMonkey::charClasses() { - return fSets; -} - - -RBBIWordMonkey::~RBBIWordMonkey() { - delete fSets; - delete fKatakanaSet; - delete fALetterSet; - delete fMidLetterSet; - delete fMidNumLetSet; - delete fMidNumSet; - delete fNumericSet; - delete fFormatSet; - delete fExtendSet; - delete fOtherSet; - - delete [] fMungedText; - delete [] fMungedPositions; - delete [] fOrigPositions; - - delete fGCFMatcher; - delete fGCMatcher; -} - - -//------------------------------------------------------------------------------------------- -// -// TestMonkey -// -// params -// seed=nnnnn Random number starting seed. -// Setting the seed allows errors to be reproduced. -// loop=nnn Looping count. Controls running time. -// -1: run forever. -// 0 or greater: run length. -// -// type = char | work | line | sent | title -// -//------------------------------------------------------------------------------------------- - -static int32_t getIntParam(UnicodeString name, UnicodeString ¶ms, int32_t defaultVal) { - int32_t val = defaultVal; - name.append(" *= *(-?\\d+)"); - UErrorCode status = U_ZERO_ERROR; - RegexMatcher m(name, params, 0, status); - if (m.find()) { - // The param exists. Convert the string to an int. - char valString[100]; - int32_t paramLength = m.end(1, status) - m.start(1, status); - if (paramLength >= sizeof(valString)-1) {paramLength = sizeof(valString)-2;}; - params.extract(m.start(1, status), paramLength, valString, sizeof(valString)); - val = strtol(valString, NULL, 10); - - // Delete this parameter from the params string. - m.reset(); - params = m.replaceFirst("", status); - } - U_ASSERT(U_SUCCESS(status)); - return val; -} -#endif - -void RBBITest::TestMonkey(char *params) { -#if !UCONFIG_NO_REGULAR_EXPRESSIONS - - UErrorCode status = U_ZERO_ERROR; - int32_t loopCount = 500; - int32_t seed = 1; - UnicodeString breakType = "all"; - Locale locale("en"); - - if (quick == FALSE) { - loopCount = 10000; - } - - if (params) { - UnicodeString p(params); - loopCount = getIntParam("loop", p, loopCount); - seed = getIntParam("seed", p, seed); - - RegexMatcher m(" *type *= *(char|word|line|sent|title) *", p, 0, status); - if (m.find()) { - breakType = m.group(1, status); - m.reset(); - p = m.replaceFirst("", status); - } - - m.reset(p); - if (RegexMatcher("\\S", p, 0, status).find()) { - // Each option is stripped out of the option string as it is processed. - // All options have been checked. The option string should have been completely emptied.. - char buf[100]; - p.extract(buf, sizeof(buf), NULL, status); - buf[sizeof(buf)-1] = 0; - errln("Unrecognized or extra parameter: %s\n", buf); - return; - } - - } - - if (breakType == "char" || breakType == "all") { - RBBICharMonkey m; - BreakIterator *bi = BreakIterator::createCharacterInstance(locale, status); - RunMonkey(bi, m, seed, loopCount); - delete bi; - } - - if (breakType == "word" || breakType == "all") { - RBBIWordMonkey m; - BreakIterator *bi = BreakIterator::createWordInstance(locale, status); - if (params == NULL) { - // TODO: Resolve rule ambiguities, unpin loop count. - loopCount = 2; - } - RunMonkey(bi, m, seed, loopCount); - delete bi; - } - -#endif -} - - -void RBBITest::RunMonkey(BreakIterator *bi, RBBIMonkeyKind &mk, uint32_t seed, int32_t numIterations) { -#if !UCONFIG_NO_REGULAR_EXPRESSIONS - - const int32_t TESTSTRINGLEN = 500; - UnicodeString testText; - int32_t numCharClasses; - UVector *chClasses; - char expectedBreaks[TESTSTRINGLEN*2 + 1]; - char forwardBreaks[TESTSTRINGLEN*2 + 1]; - char reverseBreaks[TESTSTRINGLEN*2+1]; - int i; - int loopCount = 0; - - m_seed = seed; - - numCharClasses = mk.charClasses()->size(); - chClasses = mk.charClasses(); - - // Check for errors that occured during the construction of the MonkeyKind object. - // Can't report them where they occured because errln() is a method coming from intlTest, - // and is not visible outside of RBBITest :-( - if (U_FAILURE(mk.deferredStatus)) { - errln("status of \"%s\" in creation of RBBIMonkeyKind.", u_errorName(mk.deferredStatus)); - return; - } - - // Verify that the character classes all have at least one member. - for (i=0; i<numCharClasses; i++) { - UnicodeSet *s = (UnicodeSet *)chClasses->elementAt(i); - if (s == NULL || s->size() == 0) { - errln("Character Class #%d is null or of zero size.", i); - return; - } - } - - while (loopCount <= numIterations || numIterations == -1) { - // Save current random number seed, so that we can recreate the random numbers - // for this loop iteration in event of an error. - seed = m_seed; - - // Populate a test string with data. - testText.truncate(0); - for (i=0; i<TESTSTRINGLEN; i++) { - int32_t aClassNum = m_rand() % numCharClasses; - UnicodeSet *classSet = (UnicodeSet *)chClasses->elementAt(aClassNum); - int32_t charIdx = m_rand() % classSet->size(); - UChar32 c = classSet->charAt(charIdx); - assert(c >= 0); // TODO: deal with sets containing strings. - testText.append(c); - } - - // Calculate the expected results for this test string. - mk.setText(testText); - memset(expectedBreaks, 0, sizeof(expectedBreaks)); - expectedBreaks[0] = 1; - int32_t breakPos = 0; - for (;;) { - breakPos = mk.next(breakPos); - if (breakPos == -1) { - break; - } - assert(breakPos <= testText.length()); - expectedBreaks[breakPos] = 1; - } - - // Find the break positions using forward iteration - memset(forwardBreaks, 0, sizeof(forwardBreaks)); - bi->setText(testText); - for (i=bi->first(); i != BreakIterator::DONE; i=bi->next()) { - if (i < 0 || i > testText.length()) { - errln("Out of range value returned by breakIterator::next()"); - break; - } - forwardBreaks[i] = 1; - } - - // Find the break positions using reverse iteration - memset(reverseBreaks, 0, sizeof(reverseBreaks)); - for (i=bi->last(); i != BreakIterator::DONE; i=bi->previous()) { - if (i < 0 || i > testText.length()) { - errln("Out of range value returned by breakIterator::next()"); - break; - } - reverseBreaks[i] = 1; - } - - // Compare the expected and actual results. - for (i=0; i<=testText.length(); i++) { - UBool forwardError = forwardBreaks[i] != expectedBreaks[i]; - UBool anyError = forwardError || reverseBreaks[i] != expectedBreaks[i]; - if (anyError) { - // Format a range of the test text that includes the failure as - // a data item that can be included in the rbbi test data file. - - // Start of the range is the last point where expected and actual results - // both agreed that there was a break position. - int startContext = i; - for (;;) { - if (startContext==0) { break; } - startContext--; - if (expectedBreaks[startContext] != 0) {break;} - } - - // End of range is two expected breaks past the start position. - int endContext = i+1; - int ci; - for (ci=0; ci<2; ci++) { // Number of items to include in error text. - for (;;) { - if (endContext >= testText.length()) {break;} - if (expectedBreaks[endContext-1] != 0) { break;} - endContext++; - } - } - - // Format looks like "<data><>\uabcd\uabcd<>\U0001abcd...</data>" - UnicodeString errorText = "<data>"; - for (ci=startContext; ci<endContext;) { - UnicodeString hexChars("0123456789abcdef"); - UChar32 c; - int bn; - c = testText.char32At(ci); - if (expectedBreaks[ci] != 0) { - errorText.append("<>"); - } - if (c < 0x10000) { - errorText.append("\\u"); - for (bn=12; bn>=0; bn-=4) { - errorText.append(hexChars.charAt((c>>bn)&0xf)); - } - } else { - errorText.append("\\U"); - for (bn=28; bn>=0; bn-=4) { - errorText.append(hexChars.charAt((c>>bn)&0xf)); - } - } - ci = testText.moveIndex32(ci, 1); - } - if (expectedBreaks[ci] != 0) { - errorText.append("<>"); - } - errorText.append("</data>\n"); - - // Output the error - char charErrorTxt[100]; - UErrorCode status = U_ZERO_ERROR; - errorText.extract(charErrorTxt, sizeof(charErrorTxt), NULL, status); - charErrorTxt[sizeof(charErrorTxt)-1] = 0; - errln("ERROR. %s. Direction = %s; Random seed = %d; buf Idx = %d\n%s", - (expectedBreaks[i]? "break expected but not found" : "break found but not expected"), - (forwardError?"forward":"reverse"), seed, i, charErrorTxt); - break; - } - } - - loopCount++; - } -#endif -} - - -#endif /* #if !UCONFIG_NO_BREAK_ITERATION */ +/******************************************************************** + * COPYRIGHT: + * Copyright (c) 1999-2004, International Business Machines Corporation and + * others. All Rights Reserved. + ********************************************************************/ +/************************************************************************ +* Date Name Description +* 12/15/99 Madhu Creation. +* 01/12/2000 Madhu Updated for changed API and added new tests +************************************************************************/ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_BREAK_ITERATION + +#include "unicode/utypes.h" +#include "unicode/brkiter.h" +#include "unicode/rbbi.h" +#include "unicode/uchar.h" +#include "unicode/utf16.h" +#include "unicode/ucnv.h" +#include "unicode/schriter.h" +#include "unicode/uniset.h" +#include "unicode/regex.h" // TODO: make conditional on regexp being built. +#include "unicode/ustring.h" + +#include "intltest.h" +#include "rbbitst.h" +#include <string.h> +#include "uvector.h" +#include "uvectr32.h" +#include <string.h> +#include <stdio.h> +#include <stdlib.h> + + + +//--------------------------------------------------------------------------- +// +// class BITestData Holds a set of Break iterator test data and results +// Includes +// - the string data to be broken +// - a vector of the expected break positions. +// - a vector of source line numbers for the data, +// (to help see where errors occured.) +// - The expected break tag values. +// - Vectors of actual break positions and tag values. +// - Functions for comparing actual with expected and +// reporting errors. +// +//---------------------------------------------------------------------------- +class BITestData { +public: + UnicodeString fDataToBreak; + UVector fExpectedBreakPositions; + UVector fExpectedTags; + UVector fLineNum; + UVector fActualBreakPositions; // Test Results. + UVector fActualTags; + + BITestData(UErrorCode &status); + void addDataChunk(const char *data, int32_t tag, int32_t lineNum, UErrorCode status); + void checkResults(const char *heading, RBBITest *test); + void err(const char *heading, RBBITest *test, int32_t expectedIdx, int32_t actualIdx); + void clearResults(); +}; + +// +// Constructor. +// +BITestData::BITestData(UErrorCode &status) +: fExpectedBreakPositions(status), fExpectedTags(status), fLineNum(status), fActualBreakPositions(status), + fActualTags(status) +{ +}; + +// +// addDataChunk. Add a section (non-breaking) piece if data to the test data. +// The macro form collects the line number, which is helpful +// when tracking down failures. +// +// A null data item is inserted at the start of each test's data +// to put the starting zero into the data list. The position saved for +// each non-null item is its ending position. +// +#define ADD_DATACHUNK(td, data, tag, status) td.addDataChunk(data, tag, __LINE__, status); +void BITestData::addDataChunk(const char *data, int32_t tag, int32_t lineNum, UErrorCode status) { + if (U_FAILURE(status)) {return;} + if (data != NULL) { + fDataToBreak.append(CharsToUnicodeString(data)); + } + fExpectedBreakPositions.addElement(fDataToBreak.length(), status); + fExpectedTags.addElement(tag, status); + fLineNum.addElement(lineNum, status); +}; + + +// +// checkResults. Compare the actual and expected break positions, report any differences. +// +void BITestData::checkResults(const char *heading, RBBITest *test) { + int32_t expectedIndex = 0; + int32_t actualIndex = 0; + + for (;;) { + // If we've run through both the expected and actual results vectors, we're done. + // break out of the loop. + if (expectedIndex >= fExpectedBreakPositions.size() && + actualIndex >= fActualBreakPositions.size()) { + break; + } + + + if (expectedIndex >= fExpectedBreakPositions.size()) { + err(heading, test, expectedIndex-1, actualIndex); + actualIndex++; + continue; + } + + if (actualIndex >= fActualBreakPositions.size()) { + err(heading, test, expectedIndex, actualIndex-1); + expectedIndex++; + continue; + } + + if (fActualBreakPositions.elementAti(actualIndex) != fExpectedBreakPositions.elementAti(expectedIndex)) { + err(heading, test, expectedIndex, actualIndex); + // Try to resync the positions of the indices, to avoid a rash of spurious erros. + if (fActualBreakPositions.elementAti(actualIndex) < fExpectedBreakPositions.elementAti(expectedIndex)) { + actualIndex++; + } else { + expectedIndex++; + } + continue; + } + + if (fActualTags.elementAti(actualIndex) != fExpectedTags.elementAti(expectedIndex)) { + test->errln("%s, tag mismatch. Test Line = %d, expected tag=%d, got %d", + heading, fLineNum.elementAt(expectedIndex), + fExpectedTags.elementAti(expectedIndex), fActualTags.elementAti(actualIndex)); + } + + actualIndex++; + expectedIndex++; + } +} + +// +// err - An error was found. Report it, along with information about where the +// incorrectly broken test data appeared in the source file. +// +void BITestData::err(const char *heading, RBBITest *test, int32_t expectedIdx, int32_t actualIdx) +{ + int32_t expected = fExpectedBreakPositions.elementAti(expectedIdx); + int32_t actual = fActualBreakPositions.elementAti(actualIdx); + int32_t o = 0; + int32_t line = fLineNum.elementAti(expectedIdx); + if (expectedIdx > 0) { + // The line numbers are off by one because a premature break occurs somewhere + // within the previous item, rather than at the start of the current (expected) item. + // We want to report the offset of the unexpected break from the start of + // this previous item. + o = actual - fExpectedBreakPositions.elementAti(expectedIdx-1); + } + if (actual < expected) { + test->errln("%s unexpected break at offset %d in test item from line %d", heading, o, line); + } else { + test->errln("%s Failed to find break at end of item from line %d", heading, line); + } +} + + +void BITestData::clearResults() { + fActualBreakPositions.removeAllElements(); + fActualTags.removeAllElements(); +} + + +//----------------------------------------------------------------------------------- +// +// Cannned Test Characters +// +//----------------------------------------------------------------------------------- + +static const UChar cannedTestArray[] = { + 0x0001, 0x0002, 0x0003, 0x0004, 0x0020, 0x0021, '\\', 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0028, 0x0029, 0x002b, 0x002d, 0x0030, 0x0031, + 0x0032, 0x0033, 0x0034, 0x003c, 0x003d, 0x003e, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x005b, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x007b, + 0x007d, 0x007c, 0x002c, 0x00a0, 0x00a2, + 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00ab, 0x00ad, 0x00ae, 0x00af, 0x00b0, 0x00b2, 0x00b3, + 0x00b4, 0x00b9, 0x00bb, 0x00bc, 0x00bd, 0x02b0, 0x02b1, 0x02b2, 0x02b3, 0x02b4, 0x0300, 0x0301, 0x0302, 0x0303, + 0x0304, 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x0903, 0x093e, 0x093f, 0x0940, 0x0949, 0x0f3a, 0x0f3b, 0x2000, + 0x2001, 0x2002, 0x200c, 0x200d, 0x200e, 0x200f, 0x2010, 0x2011, 0x2012, 0x2028, 0x2029, 0x202a, 0x203e, 0x203f, + 0x2040, 0x20dd, 0x20de, 0x20df, 0x20e0, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x0000 +}; + +static UnicodeString* cannedTestChars = 0; + +#define halfNA "\\u0928\\u094d\\u200d" +#define halfSA "\\u0938\\u094d\\u200d" +#define halfCHA "\\u091a\\u094d\\u200d" +#define halfKA "\\u0915\\u094d\\u200d" +#define deadTA "\\u0924\\u094d" + +//-------------------------------------------------------------------------------------- +// +// RBBITest constructor and destructor +// +//-------------------------------------------------------------------------------------- + +RBBITest::RBBITest() { + UnicodeString temp(cannedTestArray); + cannedTestChars = new UnicodeString(); + *cannedTestChars += (UChar)0x0000; + *cannedTestChars += temp; +} + + +RBBITest::~RBBITest() { + delete cannedTestChars; +} + + +static const int T_NUMBER = 100; +static const int T_LETTER = 200; +static const int T_H_OR_K = 300; +static const int T_IDEO = 400; + + + + + + +//-------------------------------------------------------------------- +//Testing the BreakIterator for devanagari script +//-------------------------------------------------------------------- + +#define deadRA "\\u0930\\u094d" /*deadform RA = devanagari RA + virama*/ +#define deadPHA "\\u092b\\u094d" /*deadform PHA = devanagari PHA + virama*/ +#define deadTTHA "\\u0920\\u094d" +#define deadPA "\\u092a\\u094d" +#define deadSA "\\u0938\\u094d" +#define visarga "\\u0903" /*devanagari visarga looks like a english colon*/ + + + + + + +//----------------------------------------------------------------------------------- +// +// Test for status {tag} return value from break rules. +// TODO: a more thorough test. +// +//----------------------------------------------------------------------------------- +void RBBITest::TestStatusReturn() { + UnicodeString rulesString1 = "$Letters = [:L:];\n" + "$Numbers = [:N:];\n" + "$Letters+{1};\n" + "$Numbers+{2};\n" + "Help\\ {4}/me\\!;\n" + "[^$Letters $Numbers];\n" + "!.*;\n"; + UnicodeString testString1 = "abc123..abc Help me Help me!"; + // 01234567890123456789012345678 + int32_t bounds1[] = {0, 3, 6, 7, 8, 11, 12, 16, 17, 19, 20, 25, 27, 28, -1}; + int32_t brkStatus[] = {0, 1, 2, 0, 0, 1, 0, 1, 0, 1, 0, 4, 1, 0, -1}; + + UErrorCode status=U_ZERO_ERROR; + UParseError parseError; + + RuleBasedBreakIterator *bi = new RuleBasedBreakIterator(rulesString1, parseError, status); + if(U_FAILURE(status)) { + errln("FAIL : in construction"); + } else { + int32_t pos; + int32_t i = 0; + bi->setText(testString1); + for (pos=bi->first(); pos!= BreakIterator::DONE; pos=bi->next()) { + if (pos != bounds1[i]) { + errln("FAIL: expected break at %d, got %d\n", bounds1[i], pos); + break; + } + + int tag = bi->getRuleStatus(); + if (tag != brkStatus[i]) { + errln("FAIL: break at %d, expected tag %d, got tag %d\n", pos, brkStatus[i], tag); + break; + } + i++; + } + } + delete bi; +} + + +static void printStringBreaks(UnicodeString ustr, int expected[], + int expectedcount) +{ + UErrorCode status = U_ZERO_ERROR; + char name[100]; + printf("code alpha extend alphanum type line name\n"); + int j; + for (j = 0; j < ustr.length(); j ++) { + if (expectedcount > 0) { + int k; + for (k = 0; k < expectedcount; k ++) { + if (j == expected[k]) { + printf("------------------------------------------------ %d\n", + j); + } + } + } + UChar32 c = ustr.char32At(j); + if (c > 0xffff) { + j ++; + } + u_charName(c, U_UNICODE_CHAR_NAME, name, 100, &status); + printf("%7x %5d %6d %8d %4s %4s %s\n", (int)c, + u_isUAlphabetic(c), + u_hasBinaryProperty(c, UCHAR_GRAPHEME_EXTEND), + u_isalnum(c), + u_getPropertyValueName(UCHAR_GENERAL_CATEGORY, + u_charType(c), + U_SHORT_PROPERTY_NAME), + u_getPropertyValueName(UCHAR_LINE_BREAK, + u_getIntPropertyValue(c, + UCHAR_LINE_BREAK), + U_SHORT_PROPERTY_NAME), + name); + } +} + +void RBBITest::TestThaiLineBreak() { + UErrorCode status = U_ZERO_ERROR; + BITestData thaiLineSelection(status); + + // \u0e2f-- the Thai paiyannoi character-- isn't a letter. It's a symbol that + // represents elided letters at the end of a long word. It should be bound to + // the end of the word and not treated as an independent punctuation mark. + + + ADD_DATACHUNK(thaiLineSelection, NULL, 0, status); // Break at start of data + ADD_DATACHUNK(thaiLineSelection, "\\u0e2a\\u0e16\\u0e32\\u0e19\\u0e35\\u0e2f", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e08\\u0e30", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e23\\u0e30\\u0e14\\u0e21", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e40\\u0e08\\u0e49\\u0e32", 0, status); +// ADD_DATACHUNK(thaiLineSelection, "\\u0e2b\\u0e19\\u0e49\\u0e32", 0, status); +// ADD_DATACHUNK(thaiLineSelection, "\\u0e17\\u0e35\\u0e48", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e2b\\u0e19\\u0e49\\u0e32\\u0e17\\u0e35\\u0e48", 0, status); + // the commented-out lines (I think) are the preferred result; this line is what our current dictionary is giving us + ADD_DATACHUNK(thaiLineSelection, "\\u0e2d\\u0e2d\\u0e01", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e21\\u0e32", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e40\\u0e23\\u0e48\\u0e07", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e23\\u0e30\\u0e1a\\u0e32\\u0e22", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e2d\\u0e22\\u0e48\\u0e32\\u0e07", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e40\\u0e15\\u0e47\\u0e21", 0, status); + + // the one time where the paiyannoi occurs somewhere other than at the end + // of a word is in the Thai abbrevation for "etc.", which both begins and + // ends with a paiyannoi + ADD_DATACHUNK(thaiLineSelection, "\\u0e2f\\u0e25\\u0e2f", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e17\\u0e35\\u0e48", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e19\\u0e31\\u0e49\\u0e19", 0, status); + + RuleBasedBreakIterator* e = (RuleBasedBreakIterator *)BreakIterator::createLineInstance( + Locale("th"), status); + if (U_FAILURE(status)) + { + errln("Failed to create the BreakIterator for Thai locale in TestThaiLineBreak.\n"); + return; + } + + generalIteratorTest(*e, thaiLineSelection); + delete e; +} + + + +void RBBITest::TestMixedThaiLineBreak() +{ + UErrorCode status = U_ZERO_ERROR; + BITestData thaiLineSelection(status); + + ADD_DATACHUNK(thaiLineSelection, NULL, 0, status); // Break at start of data + + // Arabic numerals should always be separated from surrounding Thai text +/* + ADD_DATACHUNK(thaiLineSelection, "\\u0e04\\u0e48\\u0e32", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e40\\u0e07\\u0e34\\u0e19", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e1a\\u0e32\\u0e17", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e41\\u0e15\\u0e30", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e23\\u0e30\\u0e14\\u0e31\\u0e1a", 0, status); + thaiLineSelection->addElement("39"); + ADD_DATACHUNK(thaiLineSelection, "\\u0e1a\\u0e32\\u0e17 ", 0, status); + + // words in non-Thai scripts should always be separated from surrounding Thai text + ADD_DATACHUNK(thaiLineSelection, "\\u0e17\\u0e14", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e2a\\u0e2d\\u0e1a", 0, status); + thaiLineSelection->addElement("Java"); + ADD_DATACHUNK(thaiLineSelection, "\\u0e1a\\u0e19", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e40\\u0e04\\u0e23\\u0e37\\u0e48\\u0e2d\\u0e07", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e44\\u0e2d\\u0e1a\\u0e35\\u0e40\\u0e2d\\u0e47\\u0e21 ", 0, status); + + // Thai numerals should always be separated from the text surrounding them + ADD_DATACHUNK(thaiLineSelection, "\\u0e04\\u0e48\\u0e32", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e40\\u0e07\\u0e34\\u0e19", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e1a\\u0e32\\u0e17", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e41\\u0e15\\u0e30", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e23\\u0e30\\u0e14\\u0e31\\u0e1a", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e53\\u0e59", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e1a\\u0e32\\u0e17 ", 0, status); + + // Thai text should interact correctly with punctuation and symbols + ADD_DATACHUNK(thaiLineSelection, "\\u0e44\\u0e2d\\u0e1a\\u0e35\\u0e40\\u0e2d\\u0e47\\u0e21", 0, status); +// ADD_DATACHUNK(thaiLineSelection, "(\\u0e1b\\u0e23\\u0e30\\u0e40\\u0e17\\u0e28", 0, status); +// ADD_DATACHUNK(thaiLineSelection, "\\u0e44\\u0e17\\u0e22)", 0, status); +ADD_DATACHUNK(thaiLineSelection, "(\\u0e1b\\u0e23\\u0e30\\u0e40\\u0e17\\u0e28\\u0e44\\u0e17\\u0e22)", 0, status); +// I believe the commented-out reading above to be the correct one, but this is what passes with our current dictionary + ADD_DATACHUNK(thaiLineSelection, "\\u0e08\\u0e33\\u0e01\\u0e31\\u0e14", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e40\\u0e1b\\u0e34\\u0e14", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e15\\u0e31\\u0e27\"", 0, status); +*/ + + // The Unicode Linebreak TR says do not break before or after quotes. + // So this test is changed ot not break around the quote. + // TODO: should Thai break around the around the quotes, like the original behavior here? +// ADD_DATACHUNK(thaiLineSelection, "\\u0e2e\\u0e32\\u0e23\\u0e4c\\u0e14\\u0e14\\u0e34\\u0e2a\\u0e01\\u0e4c\"", 0, status); +// ADD_DATACHUNK(thaiLineSelection, "\\u0e23\\u0e38\\u0e48\\u0e19", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e2e\\u0e32\\u0e23\\u0e4c\\u0e14\\u0e14\\u0e34\\u0e2a\\u0e01\\u0e4c\"" + "\\u0e23\\u0e38\\u0e48\\u0e19", 0, status); + + ADD_DATACHUNK(thaiLineSelection, "\\u0e43\\u0e2b\\u0e21\\u0e48", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e40\\u0e14\\u0e37\\u0e2d\\u0e19\\u0e21\\u0e34.", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e22.", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e19\\u0e35\\u0e49", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e23\\u0e32\\u0e04\\u0e32", 0, status); + ADD_DATACHUNK(thaiLineSelection, "$200", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e40\\u0e17\\u0e48\\u0e32", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e19\\u0e31\\u0e49\\u0e19 ", 0, status); + ADD_DATACHUNK(thaiLineSelection, "(\"\\u0e2e\\u0e32\\u0e23\\u0e4c\\u0e14\\u0e14\\u0e34\\u0e2a\\u0e01\\u0e4c\").", 0, status); + + RuleBasedBreakIterator* e = (RuleBasedBreakIterator *)BreakIterator::createLineInstance(Locale("th"), status); + if (U_FAILURE(status)) + { + errln("Failed to create the BreakIterator for Thai locale in TestMixedThaiLineBreak.\n"); + return; + } + + + generalIteratorTest(*e, thaiLineSelection); + delete e; +} + + +void RBBITest::TestMaiyamok() +{ + UErrorCode status = U_ZERO_ERROR; + BITestData thaiLineSelection(status); + ADD_DATACHUNK(thaiLineSelection, NULL, 0, status); // Break at start of data + // the Thai maiyamok character is a shorthand symbol that means "repeat the previous + // word". Instead of appearing as a word unto itself, however, it's kept together + // with the word before it + ADD_DATACHUNK(thaiLineSelection, "\\u0e44\\u0e1b\\u0e46", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e21\\u0e32\\u0e46", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e23\\u0e30\\u0e2b\\u0e27\\u0e48\\u0e32\\u0e07", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e01\\u0e23\\u0e38\\u0e07\\u0e40\\u0e17\\u0e1e", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e41\\u0e25\\u0e30", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e40\\u0e03\\u0e35\\u0e22\\u0e07", 0, status); + ADD_DATACHUNK(thaiLineSelection, "\\u0e43\\u0e2b\\u0e21\\u0e48", 0, status); + + RuleBasedBreakIterator* e = (RuleBasedBreakIterator *)BreakIterator::createLineInstance( + Locale("th"), status); + + if (U_FAILURE(status)) + { + errln("Failed to create the BreakIterator for Thai locale in TestMaiyamok.\n"); + return; + } + generalIteratorTest(*e, thaiLineSelection); + delete e; +} + +void RBBITest::TestThaiWordBreak() { + UErrorCode status = U_ZERO_ERROR; + BITestData thaiWordSelection(status); + + ADD_DATACHUNK(thaiWordSelection, NULL, 0, status); // Break at start of data + ADD_DATACHUNK(thaiWordSelection, "\\u0E1A\\u0E17", 0, status); //2 + ADD_DATACHUNK(thaiWordSelection, "\\u0E17\\u0E35\\u0E48", 0, status); //5 + ADD_DATACHUNK(thaiWordSelection, "\\u0E51", 0, status); //6 + ADD_DATACHUNK(thaiWordSelection, "\\u0E1E\\u0E32\\u0E22\\u0E38", 0, status); //10 + ADD_DATACHUNK(thaiWordSelection, "\\u0E44\\u0E0B\\u0E42\\u0E04\\u0E25\\u0E19", 0, status); //16 + ADD_DATACHUNK(thaiWordSelection, "\\u000D\\u000A", 0, status); //18 + + // This is the correct result + //ADD_DATACHUNK(thaiWordSelection, "\\u0E42\\u0E14\\u0E42\\u0E23\\u0E18\\u0E35", 0, status); //24 + //ADD_DATACHUNK(thaiWordSelection, "\\u0E2D\\u0E32\\u0E28\\u0E31\\u0E22", 0, status); //29 + + // and this is what the dictionary does... + ADD_DATACHUNK(thaiWordSelection, "\\u0E42\\u0E14", 0, status); // 20 + ADD_DATACHUNK(thaiWordSelection, "\\u0E42\\u0E23\\u0E18\\u0E35\\u0E2D\\u0E32\\u0E28\\u0E31\\u0E22", 0, status); //29 + + ADD_DATACHUNK(thaiWordSelection, "\\u0E2D\\u0E22\\u0E39\\u0E48", 0, status); //33 + + // This is the correct result + //ADD_DATACHUNK(thaiWordSelection, "\\u0E17\\u0E48\\u0E32\\u0E21", 0, status); //37 + //ADD_DATACHUNK(thaiWordSelection, "\\u0E01\\u0E25\\u0E32\\u0E07", 0, status); //41 + + // and this is what the dictionary does + ADD_DATACHUNK(thaiWordSelection, "\\u0E17\\u0E48\\u0E32\\u0E21\\u0E01\\u0E25\\u0E32\\u0E07", 0, status); //41 + + ADD_DATACHUNK(thaiWordSelection, "\\u0E17\\u0E38\\u0E48\\u0E07", 0, status); //45 + ADD_DATACHUNK(thaiWordSelection, "\\u0E43\\u0E2B\\u0E0D\\u0E48", 0, status); //49 + ADD_DATACHUNK(thaiWordSelection, "\\u0E43\\u0E19", 0, status); //51 + + // This is the correct result + //ADD_DATACHUNK(thaiWordSelection, "\\u0E41\\u0E04\\u0E19\\u0E0B\\u0E31\\u0E2A", 0, status); //57 + //ADD_DATACHUNK(thaiWordSelection, "\\u0E01\\u0E31\\u0E1A", 0, status); //60 + + // and this is what the dictionary does + ADD_DATACHUNK(thaiWordSelection, "\\u0E41\\u0E04\\u0E19", 0, status); // 54 + ADD_DATACHUNK(thaiWordSelection, "\\u0E0B\\u0E31\\u0E2A\\u0E01\\u0E31\\u0E1A", 0, status); //60 + + ADD_DATACHUNK(thaiWordSelection, "\\u0E25\\u0E38\\u0E07", 0, status); //63 + + // This is the correct result + //ADD_DATACHUNK(thaiWordSelection, "\\u0E40\\u0E2E\\u0E19\\u0E23\\u0E35", 0, status); //68 + //ADD_DATACHUNK(thaiWordSelection, "\\u0E0A\\u0E32\\u0E27", 0, status); //71 + //ADD_DATACHUNK(thaiWordSelection, "\\u0E44\\u0E23\\u0E48", 0, status); //74 + //ADD_DATACHUNK(thaiWordSelection, "\\u0E41\\u0E25\\u0E30", 0, status); //77 + + // and this is what the dictionary does + ADD_DATACHUNK(thaiWordSelection, "\\u0E40\\u0E2E", 0, status); // 65 + ADD_DATACHUNK(thaiWordSelection, "\\u0E19\\u0E23\\u0E35\\u0E0A\\u0E32\\u0E27\\u0E44\\u0E23\\u0E48\\u0E41\\u0E25\\u0E30", 0, status); //77 + + RuleBasedBreakIterator* e = (RuleBasedBreakIterator *)BreakIterator::createWordInstance( + Locale("th"), status); + if (U_FAILURE(status)) + { + errln("Failed to create the BreakIterator for Thai locale in TestThaiWordBreak.\n"); + return; + } + + generalIteratorTest(*e, thaiWordSelection); + delete e; +} + + +void RBBITest::TestBug3818() { + UErrorCode status = U_ZERO_ERROR; + + // Four Thai words... + static const UChar thaiWordData[] = { 0x0E43,0x0E2B,0x0E0D,0x0E48, 0x0E43,0x0E2B,0x0E0D,0x0E48, + 0x0E43,0x0E2B,0x0E0D,0x0E48, 0x0E43,0x0E2B,0x0E0D,0x0E48, 0 }; + UnicodeString thaiStr(thaiWordData); + + RuleBasedBreakIterator* bi = + (RuleBasedBreakIterator *)BreakIterator::createWordInstance(Locale("th"), status); + if (U_FAILURE(status) || bi == NULL) { + errln("Fail at file %s, line %d, status = %s", __FILE__, __LINE__, u_errorName(status)); + return; + } + bi->setText(thaiStr); + + int32_t startOfSecondWord = bi->following(1); + if (startOfSecondWord != 4) { + errln("Fail at file %s, line %d expected start of word at 4, got %d", + __FILE__, __LINE__, startOfSecondWord); + } + startOfSecondWord = bi->following(0); + if (startOfSecondWord != 4) { + errln("Fail at file %s, line %d expected start of word at 4, got %d", + __FILE__, __LINE__, startOfSecondWord); + } + delete bi; +} + + +void RBBITest::TestJapaneseWordBreak() { + UErrorCode status = U_ZERO_ERROR; + BITestData japaneseWordSelection(status); + + ADD_DATACHUNK(japaneseWordSelection, NULL, 0, status); // Break at start of data + ADD_DATACHUNK(japaneseWordSelection, "\\u4ECA\\u65E5", 400, status); //2 + ADD_DATACHUNK(japaneseWordSelection, "\\u306F\\u3044\\u3044", 300, status); //5 + ADD_DATACHUNK(japaneseWordSelection, "\\u5929\\u6C17", 400, status); //7 + ADD_DATACHUNK(japaneseWordSelection, "\\u3067\\u3059\\u306D", 300, status); //10 + ADD_DATACHUNK(japaneseWordSelection, "\\u3002", 0, status); //11 + ADD_DATACHUNK(japaneseWordSelection, "\\u000D\\u000A", 0, status); //12 + + RuleBasedBreakIterator* e = (RuleBasedBreakIterator *)BreakIterator::createWordInstance( + Locale("ja"), status); + if (U_FAILURE(status)) + { + errln("Failed to create the BreakIterator for Japanese locale in TestJapaneseWordBreak.\n"); + return; + } + + generalIteratorTest(*e, japaneseWordSelection); + delete e; +} + +//--------------------------------------------- +// runIndexedTest +//--------------------------------------------- + +void RBBITest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* params ) +{ + if (exec) logln("TestSuite RuleBasedBreakIterator: "); + + switch (index) { + case 0: name = "TestBug4153072"; + if(exec) TestBug4153072(); break; + case 1: name = "TestJapaneseLineBreak"; + if(exec) TestJapaneseLineBreak(); break; + case 2: name = "TestStatusReturn"; + if(exec) TestStatusReturn(); break; + + case 3: name = "TestLineBreakData"; + if(exec) TestLineBreakData(); break; + case 4: name = "TestEmptyString"; + if(exec) TestEmptyString(); break; + + case 5: name = "TestGetAvailableLocales"; + if(exec) TestGetAvailableLocales(); break; + + case 6: name = "TestGetDisplayName"; + if(exec) TestGetDisplayName(); break; + + case 7: name = "TestEndBehaviour"; + if(exec) TestEndBehaviour(); break; + case 8: name = "TestMixedThaiLineBreak"; + if(exec) TestMixedThaiLineBreak(); break; + case 9: name = "TestThaiWordBreak"; + if(exec) TestThaiWordBreak(); break; + case 10: name = "TestThaiLineBreak"; + if(exec) TestThaiLineBreak(); break; + case 11: name = "TestMaiyamok"; + if(exec) TestMaiyamok(); break; + case 12: name = "TestWordBreaks"; + if(exec) TestWordBreaks(); break; + case 13: name = "TestWordBoundary"; + if(exec) TestWordBoundary(); break; + case 14: name = "TestLineBreaks"; + if(exec) TestLineBreaks(); break; + case 15: name = "TestSentBreaks"; + if(exec) TestSentBreaks(); break; + case 16: name = "TestExtended"; + if(exec) TestExtended(); break; + case 17: name = "TestMonkey"; + if(exec) { + #if !UCONFIG_NO_REGULAR_EXPRESSIONS + TestMonkey(params); + #else + logln("skipping TestMonkey (UCONFIG_NO_REGULAR_EXPRESSIONS)"); + #endif + } + break; + case 18: name = "TestBug3818"; + if(exec) TestBug3818(); break; + case 19: name = "TestJapaneseWordBreak"; + if(exec) TestJapaneseWordBreak(); break; + + default: name = ""; break; //needed to end loop + } +} + + +//---------------------------------------------------------------------------- +// +// generalIteratorTest Given a break iterator and a set of test data, +// Run the tests and report the results. +// +//---------------------------------------------------------------------------- +void RBBITest::generalIteratorTest(RuleBasedBreakIterator& bi, BITestData &td) +{ + + bi.setText(td.fDataToBreak); + + testFirstAndNext(bi, td); + + testLastAndPrevious(bi, td); + + testFollowing(bi, td); + testPreceding(bi, td); + testIsBoundary(bi, td); + doMultipleSelectionTest(bi, td); +} + + +// +// testFirstAndNext. Run the iterator forwards in the obvious first(), next() +// kind of loop. +// +void RBBITest::testFirstAndNext(RuleBasedBreakIterator& bi, BITestData &td) +{ + UErrorCode status = U_ZERO_ERROR; + int32_t p; + int32_t lastP = -1; + int32_t tag; + + logln("Test first and next"); + bi.setText(td.fDataToBreak); + td.clearResults(); + + for (p=bi.first(); p!=RuleBasedBreakIterator::DONE; p=bi.next()) { + td.fActualBreakPositions.addElement(p, status); // Save result. + tag = bi.getRuleStatus(); + td.fActualTags.addElement(tag, status); + if (p <= lastP) { + // If the iterator is not making forward progress, stop. + // No need to raise an error here, it'll be detected in the normal check of results. + break; + } + lastP = p; + } + td.checkResults("testFirstAndNext", this); +} + + +// +// TestLastAndPrevious. Run the iterator backwards, starting with last(). +// +void RBBITest::testLastAndPrevious(RuleBasedBreakIterator& bi, BITestData &td) +{ + UErrorCode status = U_ZERO_ERROR; + int32_t p; + int32_t lastP = 0x7ffffffe; + int32_t tag; + + logln("Test first and next"); + bi.setText(td.fDataToBreak); + td.clearResults(); + + for (p=bi.last(); p!=RuleBasedBreakIterator::DONE; p=bi.previous()) { + // Save break position. Insert it at start of vector of results, shoving + // already-saved results further towards the end. + td.fActualBreakPositions.insertElementAt(p, 0, status); + // bi.previous(); // TODO: Why does this fix things up???? + // bi.next(); + tag = bi.getRuleStatus(); + td.fActualTags.insertElementAt(tag, 0, status); + if (p >= lastP) { + // If the iterator is not making progress, stop. + // No need to raise an error here, it'll be detected in the normal check of results. + break; + } + lastP = p; + } + td.checkResults("testLastAndPrevious", this); +} + + +void RBBITest::testFollowing(RuleBasedBreakIterator& bi, BITestData &td) +{ + UErrorCode status = U_ZERO_ERROR; + int32_t p; + int32_t tag; + int32_t lastP = -2; // A value that will never be returned as a break position. + // cannot be -1; that is returned for DONE. + int i; + + logln("testFollowing():"); + bi.setText(td.fDataToBreak); + td.clearResults(); + + // Save the starting point, since we won't get that out of following. + p = bi.first(); + td.fActualBreakPositions.addElement(p, status); // Save result. + tag = bi.getRuleStatus(); + td.fActualTags.addElement(tag, status); + + for (i = 0; i <= td.fDataToBreak.length()+1; i++) { + p = bi.following(i); + if (p != lastP) { + if (p == RuleBasedBreakIterator::DONE) { + break; + } + // We've reached a new break position. Save it. + td.fActualBreakPositions.addElement(p, status); // Save result. + tag = bi.getRuleStatus(); + td.fActualTags.addElement(tag, status); + lastP = p; + } + } + // The loop normally exits by means of the break in the middle. + // Make sure that the index was at the correct position for the break iterator to have + // returned DONE. + if (i != td.fDataToBreak.length()) { + errln("testFollowing(): iterator returned DONE prematurely."); + } + + // Full check of all results. + td.checkResults("testFollowing", this); +} + + + +void RBBITest::testPreceding(RuleBasedBreakIterator& bi, BITestData &td) { + UErrorCode status = U_ZERO_ERROR; + int32_t p; + int32_t tag; + int32_t lastP = 0x7ffffffe; + int i; + + logln("testPreceding():"); + bi.setText(td.fDataToBreak); + td.clearResults(); + + p = bi.last(); + td.fActualBreakPositions.addElement(p, status); + tag = bi.getRuleStatus(); + td.fActualTags.addElement(tag, status); + + for (i = td.fDataToBreak.length(); i>=-1; i--) { + p = bi.preceding(i); + if (p != lastP) { + if (p == RuleBasedBreakIterator::DONE) { + break; + } + // We've reached a new break position. Save it. + td.fActualBreakPositions.insertElementAt(p, 0, status); + lastP = p; + tag = bi.getRuleStatus(); + td.fActualTags.insertElementAt(tag, 0, status); + } + } + // The loop normally exits by means of the break in the middle. + // Make sure that the index was at the correct position for the break iterator to have + // returned DONE. + if (i != 0) { + errln("testPreceding(): iterator returned DONE prematurely."); + } + + // Full check of all results. + td.checkResults("testPreceding", this); +} + + + +void RBBITest::testIsBoundary(RuleBasedBreakIterator& bi, BITestData &td) { + UErrorCode status = U_ZERO_ERROR; + int i; + int32_t tag; + + logln("testIsBoundary():"); + bi.setText(td.fDataToBreak); + td.clearResults(); + + for (i = 0; i <= td.fDataToBreak.length(); i++) { + if (bi.isBoundary(i)) { + td.fActualBreakPositions.addElement(i, status); // Save result. + tag = bi.getRuleStatus(); + td.fActualTags.addElement(tag, status); + } + } + td.checkResults("testIsBoundary: ", this); +} + + + +void RBBITest::doMultipleSelectionTest(RuleBasedBreakIterator& iterator, BITestData &td) +{ + iterator.setText(td.fDataToBreak); + + RuleBasedBreakIterator* testIterator =(RuleBasedBreakIterator*)iterator.clone(); + int32_t offset = iterator.first(); + int32_t testOffset; + int32_t count = 0; + + logln("doMultipleSelectionTest text of length: %d", td.fDataToBreak.length()); + + if (*testIterator != iterator) + errln("clone() or operator!= failed: two clones compared unequal"); + + do { + testOffset = testIterator->first(); + testOffset = testIterator->next(count); + if (offset != testOffset) + errln(UnicodeString("next(n) and next() not returning consistent results: for step ") + count + ", next(n) returned " + testOffset + " and next() had " + offset); + + if (offset != RuleBasedBreakIterator::DONE) { + count++; + offset = iterator.next(); + + if (offset != RuleBasedBreakIterator::DONE && *testIterator == iterator) { + errln("operator== failed: Two unequal iterators compared equal. count=%d offset=%d", count, offset); + if (count > 10000 || offset == -1) { + errln("operator== failed too many times. Stopping test."); + if (offset == -1) { + errln("Does (RuleBasedBreakIterator::DONE == -1)?"); + } + return; + } + } + } + } while (offset != RuleBasedBreakIterator::DONE); + + // now do it backwards... + offset = iterator.last(); + count = 0; + + do { + testOffset = testIterator->last(); + testOffset = testIterator->next(count); // next() with a negative arg is same as previous + if (offset != testOffset) + errln(UnicodeString("next(n) and next() not returning consistent results: for step ") + count + ", next(n) returned " + testOffset + " and next() had " + offset); + + if (offset != RuleBasedBreakIterator::DONE) { + count--; + offset = iterator.previous(); + } + } while (offset != RuleBasedBreakIterator::DONE); + + delete testIterator; +} + + + +//-------------------------------------------------------------------------------------------- +// +// Break Iterator Invariants Tests +// +//-------------------------------------------------------------------------------------------- + +void RBBITest::TestCharacterInvariants() +{ + UErrorCode status = U_ZERO_ERROR; + BreakIterator *e = BreakIterator::createCharacterInstance(Locale::getDefault(), status); + if (U_FAILURE(status)) + { + errln("Failed to create the BreakIterator for default locale in TestCharacterInvariants.\n"); + return; + } + UnicodeString s = *cannedTestChars + CharsToUnicodeString("\\u1100\\u1101\\u1102\\u1160\\u1161\\u1162\\u11a8\\u11a9\\u11aa"); + doBreakInvariantTest(*e, s); + s = *cannedTestChars + CharsToUnicodeString("\\u1100\\u1101\\u1102\\u1160\\u1161\\u1162\\u11a8\\u11a9\\u11aa"); + doOtherInvariantTest(*e, s); + delete e; +} + + +void RBBITest::TestWordInvariants() +{ + UErrorCode status = U_ZERO_ERROR; + BreakIterator *e = BreakIterator::createWordInstance(Locale::getDefault(), status); + if (U_FAILURE(status)) + { + errln("Failed to create the BreakIterator for default locale in TestWordInvariants.\n"); + return; + } + UnicodeString s = *cannedTestChars + CharsToUnicodeString("\',.\\u3041\\u3042\\u3043\\u309b\\u309c\\u30a1\\u30a2\\u30a3\\u4e00\\u4e01\\u4e02"); + doBreakInvariantTest(*e, s); + s = *cannedTestChars + CharsToUnicodeString("\',.\\u3041\\u3042\\u3043\\u309b\\u309c\\u30a1\\u30a2\\u30a3\\u4e00\\u4e01\\u4e02"); + doOtherInvariantTest(*e, s); + delete e; +} + + +void RBBITest::TestSentenceInvariants() +{ + UErrorCode status = U_ZERO_ERROR; + BreakIterator *e = BreakIterator::createSentenceInstance(Locale::getDefault(), status); + if (U_FAILURE(status)) + { + errln("Failed to create the BreakIterator for default locale in TestSentenceInvariant.\n"); + return; + } + UnicodeString s = *cannedTestChars + CharsToUnicodeString(".,\\u3001\\u3002\\u3041\\u3042\\u3043\\ufeff"); + doOtherInvariantTest(*e, s); + delete e; +} + + + + +void RBBITest::doBreakInvariantTest(BreakIterator& tb, UnicodeString& testChars) +{ + UnicodeString work("aaa"); + int32_t errCount = 0, testCharsLen = testChars.length(), breaksLen; + + // a break should always occur after CR (unless followed by LF), LF, PS, and LS + UnicodeString breaks = CharsToUnicodeString("\r\n\\u2029\\u2028"); + int32_t i, j; + + breaksLen = breaks.length(); + for (i = 0; i < breaksLen; i++) { + UChar c1 = breaks[i]; + work.setCharAt(1, c1); + for (j = 0; j < testCharsLen; j++) { + UChar c0 = testChars[j]; + work.setCharAt(0, c0); + int k; + for (k = 0; k < testCharsLen; k++) { + UChar c2 = testChars[k]; + work.setCharAt(2, c2); + + // if a cr is followed by lf, ps, ls or etx, don't do the check (that's + // not supposed to work) + if (c1 == '\r' && (c2 == '\n' || c2 == 0x2029 + || c2 == 0x2028 || c2 == 0x0003)) + continue; + + if (u_charType(c1) == U_CONTROL_CHAR && + (u_charType(c2) == U_NON_SPACING_MARK || + u_charType(c2) == U_ENCLOSING_MARK || + u_charType(c2) == U_COMBINING_SPACING_MARK) + ) { + // Combining marks don't combine with controls. + // TODO: enhance test to verify that the break actually occurs, + // not just ignore the case. + continue; + } + + + tb.setText(work); + UBool seen2 = FALSE; + int l; + for (l = tb.first(); l != BreakIterator::DONE; l = tb.next()) { + if (l == 2) { + seen2 = TRUE; + break; + } + } + if (!seen2) { + printStringBreaks(work, NULL, 0); + errln("No Break between \\U%04x and \\U%04x", c1, c2); + errCount++; + if (errCount >= 75) + return; + } + } + } + } +} + + + +void RBBITest::doOtherInvariantTest(BreakIterator& tb, UnicodeString& testChars) +{ + UnicodeString work("a\r\na"); + int32_t errCount = 0, testCharsLen = testChars.length(); + int32_t i, j; + int8_t type; + + // a break should never occur between CR and LF + for (i = 0; i < testCharsLen; i++) { + work.setCharAt(0, testChars[i]); + for (j = 0; j < testCharsLen; j++) { + work.setCharAt(3, testChars[j]); + tb.setText(work); + int32_t k; + for (k = tb.first(); k != BreakIterator::DONE; k = tb.next()) + if (k == 2) { + errln("Break between CR and LF in string U\\%04x U\\%04x U\\%04x U\\%04x", + work[0], work[1], work[2], work[3]); + errCount++; + if (errCount >= 75) + return; + } + } + } + + // a break should never occur before a non-spacing mark, unless the preceding + // character is CR, LF, PS, or LS + // Or the general category == Control. + work.remove(); + work += "aaaa"; + for (i = 0; i < testCharsLen; i++) { + UChar c1 = testChars[i]; + if (c1 == '\n' || c1 == '\r' || c1 == 0x2029 || c1 == 0x2028 || c1 == 0x0003 || + u_charType(c1) == U_CONTROL_CHAR || u_charType(c1) == U_FORMAT_CHAR) { + continue; + } + work.setCharAt(1, c1); + for (j = 0; j < testCharsLen; j++) { + UChar c2 = testChars[j]; + type = u_charType(c2); + if ((type != U_NON_SPACING_MARK) && + (type != U_ENCLOSING_MARK)) { + continue; + } + work.setCharAt(2, c2); + tb.setText(work); + int k; + for (k = tb.first(); k != BreakIterator::DONE; k = tb.next()) + if (k == 2) { + //errln("Break between U+" + UCharToUnicodeString(work[1]) + // + " and U+" + UCharToUnicodeString(work[2])); + errln("Unexpected Break between %6x and %6x", c1, c2); + errCount++; + if (errCount >= 75) + return; + } + } + } +} + + + + +//--------------------------------------------- +// +// other tests +// +//--------------------------------------------- +void RBBITest::TestEmptyString() +{ + UnicodeString text = ""; + UErrorCode status = U_ZERO_ERROR; + + BITestData x(status); + ADD_DATACHUNK(x, "", 0, status); // Break at start of data + RuleBasedBreakIterator* bi = (RuleBasedBreakIterator *)BreakIterator::createLineInstance(Locale::getDefault(), status); + if (U_FAILURE(status)) + { + errln("Failed to create the BreakIterator for default locale in TestEmptyString.\n"); + return; + } + generalIteratorTest(*bi, x); + delete bi; +} + +void RBBITest::TestGetAvailableLocales() +{ + int32_t locCount = 0; + const Locale* locList = BreakIterator::getAvailableLocales(locCount); + + if (locCount == 0) + errln("getAvailableLocales() returned an empty list!"); + // Just make sure that it's returning good memory. + int32_t i; + for (i = 0; i < locCount; ++i) { + logln(locList[i].getName()); + } +} + +//Testing the BreakIterator::getDisplayName() function +void RBBITest::TestGetDisplayName() +{ + UnicodeString result; + + BreakIterator::getDisplayName(Locale::getUS(), result); + if (Locale::getDefault() == Locale::getUS() && result != "English (United States)") + errln("BreakIterator::getDisplayName() failed: expected \"English (United States)\", got \"" + + result); + + BreakIterator::getDisplayName(Locale::getFrance(), Locale::getUS(), result); + if (result != "French (France)") + errln("BreakIterator::getDisplayName() failed: expected \"French (France)\", got \"" + + result); +} +/** + * Test End Behaviour + * @bug 4068137 + */ +void RBBITest::TestEndBehaviour() +{ + UErrorCode status = U_ZERO_ERROR; + UnicodeString testString("boo."); + BreakIterator *wb = BreakIterator::createWordInstance(Locale::getDefault(), status); + if (U_FAILURE(status)) + { + errln("Failed to create the BreakIterator for default locale in TestEndBehaviour.\n"); + return; + } + wb->setText(testString); + + if (wb->first() != 0) + errln("Didn't get break at beginning of string."); + if (wb->next() != 3) + errln("Didn't get break before period in \"boo.\""); + if (wb->current() != 4 && wb->next() != 4) + errln("Didn't get break at end of string."); + delete wb; +} +/* + * @bug 4153072 + */ +void RBBITest::TestBug4153072() { + UErrorCode status = U_ZERO_ERROR; + BreakIterator *iter = BreakIterator::createWordInstance(Locale::getDefault(), status); + if (U_FAILURE(status)) + { + errln("Failed to create the BreakIterator for default locale in TestBug4153072\n"); + return; + } + UnicodeString str("...Hello, World!..."); + int32_t begin = 3; + int32_t end = str.length() - 3; + UBool dummy; + + StringCharacterIterator* textIterator = new StringCharacterIterator(str, begin, end, begin); + iter->adoptText(textIterator); + int index; + for (index = -1; index < begin + 1; ++index) { + dummy = iter->isBoundary(index); + if (index < begin && dummy == TRUE) { + errln((UnicodeString)"Didn't handle preceeding correctly with offset = " + index + + " and begin index = " + begin); + } + } + delete iter; +} + + +/** + * Test Japanese Line Break + * @bug 4095322 + */ +void RBBITest::TestJapaneseLineBreak() +{ +#if 0 + // Test needs updating some more... Dump it for now. + + + // Change for Unicode TR 14: Punctuation characters with categories Pi and Pf do not count + // as opening and closing punctuation for line breaking. + // Also, \u30fc and \u30fe are not counted as hyphens. Remove these chars + // from these tests. 6-13-2002 + // + UErrorCode status = U_ZERO_ERROR; + UnicodeString testString = CharsToUnicodeString("\\u4e00x\\u4e8c"); + UnicodeString precedingChars = CharsToUnicodeString( + //"([{\\u00ab$\\u00a5\\u00a3\\u00a4\\u2018\\u201a\\u201c\\u201e\\u201b\\u201f"); + "([{$\\u00a5\\u00a3\\u00a4\\u201a\\u201e"); + UnicodeString followingChars = CharsToUnicodeString( + // ")]}\\u00bb!%,.\\u3001\\u3002\\u3063\\u3083\\u3085\\u3087\\u30c3\\u30e3\\u30e5\\u30e7\\u30fc" + ")]}!%,.\\u3001\\u3002\\u3063\\u3083\\u3085\\u3087\\u30c3\\u30e3\\u30e5\\u30e7" + // ":;\\u309b\\u309c\\u3005\\u309d\\u309e\\u30fd\\u30fe\\u2019\\u201d\\u00b0\\u2032\\u2033\\u2034" + ":;\\u309b\\u309c\\u3005\\u309d\\u309e\\u30fd\\u00b0\\u2032\\u2033\\u2034" + "\\u2030\\u2031\\u2103\\u2109\\u00a2\\u0300\\u0301\\u0302"); + BreakIterator *iter = BreakIterator::createLineInstance(Locale::getJapan(), status); + + int32_t i; + if (U_FAILURE(status)) + { + errln("Failed to create the BreakIterator for Japanese locale in TestJapaneseLineBreak.\n"); + return; + } + + for (i = 0; i < precedingChars.length(); i++) { + testString.setCharAt(1, precedingChars[i]); + iter->setText(testString); + int32_t j = iter->first(); + if (j != 0) + errln("ja line break failure: failed to start at 0"); + j = iter->next(); + if (j != 1) + errln("ja line break failure: failed to stop before '" + UCharToUnicodeString(precedingChars[i]) + + "' (" + ((int)(precedingChars[i])) + ")"); + j = iter->next(); + if (j != 3) + errln("ja line break failure: failed to skip position after '" + UCharToUnicodeString(precedingChars[i]) + + "' (" + ((int)(precedingChars[i])) + ")"); + } + + for (i = 0; i < followingChars.length(); i++) { + testString.setCharAt(1, followingChars[i]); + iter->setText(testString); + int j = iter->first(); + if (j != 0) + errln("ja line break failure: failed to start at 0"); + j = iter->next(); + if (j != 2) + errln("ja line break failure: failed to skip position before '" + UCharToUnicodeString(followingChars[i]) + + "' (" + ((int)(followingChars[i])) + ")"); + j = iter->next(); + if (j != 3) + errln("ja line break failure: failed to stop after '" + UCharToUnicodeString(followingChars[i]) + + "' (" + ((int)(followingChars[i])) + ")"); + } + delete iter; +#endif +} + + +//------------------------------------------------------------------------------ +// +// RBBITest::Extended Run RBBI Tests from an external test data file +// +//------------------------------------------------------------------------------ + +struct TestParams { + BreakIterator *bi; + UnicodeString dataToBreak; + UVector32 *expectedBreaks; + UVector32 *srcLine; + UVector32 *srcCol; +}; + +void RBBITest::executeTest(TestParams *t) { + int32_t bp; + int32_t prevBP; + int32_t i; + + t->bi->setText(t->dataToBreak); + // + // Run the iterator forward + // + prevBP = -1; + for (bp = t->bi->first(); bp != BreakIterator::DONE; bp = t->bi->next()) { + if (prevBP == bp) { + // Fail for lack of forward progress. + errln("Forward Iteration, no forward progress. Break Pos=%4d File line,col=%4d,%4d", + bp, t->srcLine->elementAti(bp), t->srcCol->elementAti(bp)); + break; + } + + // Check that there were we didn't miss an expected break between the last one + // and this one. + for (i=prevBP+1; i<bp; i++) { + if (t->expectedBreaks->elementAti(i) != 0) { + int expected[] = {0, i}; + printStringBreaks(t->dataToBreak, expected, 2); + errln("Forward Iteration, break expected, but not found. Pos=%4d File line,col= %4d,%4d", + i, t->srcLine->elementAti(i), t->srcCol->elementAti(i)); + } + } + + // Check that the break we did find was expected + if (t->expectedBreaks->elementAti(bp) == 0) { + int expected[] = {0, bp}; + printStringBreaks(t->dataToBreak, expected, 2); + errln("Forward Iteration, break found, but not expected. Pos=%4d File line,col= %4d,%4d", + bp, t->srcLine->elementAti(bp), t->srcCol->elementAti(bp)); + } else { + // The break was expected. + // Check that the {nnn} tag value is correct. + int32_t expectedTagVal = t->expectedBreaks->elementAti(bp); + if (expectedTagVal == -1) { + expectedTagVal = 0; + } + int32_t rs = ((RuleBasedBreakIterator *)t->bi)->getRuleStatus(); + if (rs != expectedTagVal) { + errln("Incorrect status for forward break. Pos=%4d File line,col= %4d,%4d.\n" + " Actual, Expected status = %4d, %4d", + bp, t->srcLine->elementAti(bp), t->srcCol->elementAti(bp), rs, expectedTagVal); + } + } + + + prevBP = bp; + } + + // Verify that there were no missed expected breaks after the last one found + for (i=prevBP+1; i<t->expectedBreaks->size(); i++) { + if (t->expectedBreaks->elementAti(i) != 0) { + errln("Forward Iteration, break expected, but not found. Pos=%4d File line,col= %4d,%4d", + i, t->srcLine->elementAti(i), t->srcCol->elementAti(i)); + } + } + + // + // Run the iterator backwards, verify that the same breaks are found. + // + prevBP = t->dataToBreak.length()+2; // start with a phony value for the last break pos seen. + for (bp = t->bi->last(); bp != BreakIterator::DONE; bp = t->bi->previous()) { + if (prevBP == bp) { + // Fail for lack of progress. + errln("Reverse Iteration, no progress. Break Pos=%4d File line,col=%4d,%4d", + bp, t->srcLine->elementAti(bp), t->srcCol->elementAti(bp)); + break; + } + + // Check that there were we didn't miss an expected break between the last one + // and this one. (UVector returns zeros for index out of bounds.) + for (i=prevBP-1; i>bp; i--) { + if (t->expectedBreaks->elementAti(i) != 0) { + errln("Reverse Itertion, break expected, but not found. Pos=%4d File line,col= %4d,%4d", + i, t->srcLine->elementAti(i), t->srcCol->elementAti(i)); + } + } + + // Check that the break we did find was expected + if (t->expectedBreaks->elementAti(bp) == 0) { + errln("Reverse Itertion, break found, but not expected. Pos=%4d File line,col= %4d,%4d", + bp, t->srcLine->elementAti(bp), t->srcCol->elementAti(bp)); + } else { + // The break was expected. + // Check that the {nnn} tag value is correct. + int32_t expectedTagVal = t->expectedBreaks->elementAti(bp); + if (expectedTagVal == -1) { + expectedTagVal = 0; + } + int32_t rs = ((RuleBasedBreakIterator *)t->bi)->getRuleStatus(); + if (rs != expectedTagVal) { + errln("Incorrect status for reverse break. Pos=%4d File line,col= %4d,%4d.\n" + " Actual, Expected status = %4d, %4d", + bp, t->srcLine->elementAti(bp), t->srcCol->elementAti(bp), rs, expectedTagVal); + } + } + + prevBP = bp; + } + + // Verify that there were no missed breaks prior to the last one found + for (i=prevBP-1; i>=0; i--) { + if (t->expectedBreaks->elementAti(i) != 0) { + errln("Forward Itertion, break expected, but not found. Pos=%4d File line,col= %4d,%4d", + i, t->srcLine->elementAti(i), t->srcCol->elementAti(i)); + } + } +} + + +void RBBITest::TestExtended() { + UErrorCode status = U_ZERO_ERROR; + Locale locale = Locale::getDefault(); + + UnicodeString rules; + TestParams tp; + tp.bi = NULL; + tp.expectedBreaks = new UVector32(status); + tp.srcLine = new UVector32(status); + tp.srcCol = new UVector32(status); + + + // + // Open and read the test data file. + // + const char *testDataDirectory = IntlTest::getSourceTestData(status); + char testFileName[1000]; + if (testDataDirectory == NULL || strlen(testDataDirectory) >= sizeof(testFileName)) { + errln("Can't open test data. Path too long."); + return; + } + strcpy(testFileName, testDataDirectory); + strcat(testFileName, "rbbitst.txt"); + + int len; + UChar *testFile = ReadAndConvertFile(testFileName, len, status); + if (U_FAILURE(status)) { + return; /* something went wrong, error already output */ + } + + + + // + // Put the test data into a UnicodeString + // + UnicodeString testString(FALSE, testFile, len); + + enum EParseState{ + PARSE_COMMENT, + PARSE_TAG, + PARSE_DATA, + PARSE_NUM + } + parseState = PARSE_TAG; + + EParseState savedState = PARSE_TAG; + + static const UChar CH_LF = 0x0a; + static const UChar CH_CR = 0x0d; + static const UChar CH_HASH = 0x23; + /*static const UChar CH_PERIOD = 0x2e;*/ + static const UChar CH_LT = 0x3c; + static const UChar CH_GT = 0x3e; + static const UChar CH_BACKSLASH = 0x5c; + static const UChar CH_BULLET = 0x2022; + + int32_t lineNum = 1; + int32_t colStart = 0; + int32_t column = 0; + int32_t charIdx = 0; + + int32_t tagValue = 0; // The numeric value of a <nnn> tag. + + for (charIdx = 0; charIdx < len; ) { + UChar c = testString.charAt(charIdx); + charIdx++; + if (c == CH_CR && charIdx<len && testString.charAt(charIdx) == CH_LF) { + // treat CRLF as a unit + c = CH_LF; + charIdx++; + } + if (c == CH_LF || c == CH_CR) { + lineNum++; + colStart = charIdx; + } + column = charIdx - colStart + 1; + + switch (parseState) { + case PARSE_COMMENT: + if (c == 0x0a || c == 0x0d) { + parseState = savedState; + } + break; + + case PARSE_TAG: + { + if (c == CH_HASH) { + parseState = PARSE_COMMENT; + savedState = PARSE_TAG; + break; + } + if (u_isUWhiteSpace(c)) { + break; + } + if (testString.compare(charIdx-1, 6, "<word>") == 0) { + delete tp.bi; + tp.bi = BreakIterator::createWordInstance(locale, status); + charIdx += 5; + break; + } + if (testString.compare(charIdx-1, 6, "<char>") == 0) { + delete tp.bi; + tp.bi = BreakIterator::createCharacterInstance(locale, status); + charIdx += 5; + break; + } + if (testString.compare(charIdx-1, 6, "<line>") == 0) { + delete tp.bi; + tp.bi = BreakIterator::createLineInstance(locale, status); + charIdx += 5; + break; + } + if (testString.compare(charIdx-1, 6, "<sent>") == 0) { + delete tp.bi; + tp.bi = BreakIterator::createSentenceInstance(locale, status); + charIdx += 5; + break; + } + if (testString.compare(charIdx-1, 7, "<title>") == 0) { + delete tp.bi; + tp.bi = BreakIterator::createTitleInstance(locale, status); + charIdx += 6; + break; + } + if (testString.compare(charIdx-1, 6, "<data>") == 0) { + parseState = PARSE_DATA; + charIdx += 5; + tp.dataToBreak = ""; + tp.expectedBreaks->removeAllElements(); + tp.srcCol ->removeAllElements(); + tp.srcLine->removeAllElements(); + break; + } + + errln("line %d: Tag expected in test file.", lineNum); + goto end_test; + parseState = PARSE_COMMENT; + savedState = PARSE_DATA; + } + break; + + case PARSE_DATA: + if (c == CH_BULLET) { + int32_t breakIdx = tp.dataToBreak.length(); + tp.expectedBreaks->setSize(breakIdx+1); + tp.expectedBreaks->setElementAt(-1, breakIdx); + tp.srcLine->setSize(breakIdx+1); + tp.srcLine->setElementAt(lineNum, breakIdx); + tp.srcCol ->setSize(breakIdx+1); + tp.srcCol ->setElementAt(column, breakIdx); + break; + } + + if (testString.compare(charIdx-1, 7, "</data>") == 0) { + // Add final entry to mappings from break location to source file position. + // Need one extra because last break position returned is after the + // last char in the data, not at the last char. + tp.srcLine->addElement(lineNum, status); + tp.srcCol ->addElement(column, status); + + parseState = PARSE_TAG; + charIdx += 7; + + // RUN THE TEST! + executeTest(&tp); + break; + } + + if (testString.compare(charIdx-1, 3, "\\N{") == 0) { + // Named character, e.g. \N{COMBINING GRAVE ACCENT} + // Get the code point from the name and insert it into the test data. + // (Damn, no API takes names in Unicode !!! + // we've got to take it back to char *) + int32_t nameEndIdx = testString.indexOf((UChar)0x7d/*'}'*/, charIdx); + int32_t nameLength = nameEndIdx - (charIdx+2); + char charNameBuf[200]; + UChar32 theChar = -1; + if (nameEndIdx != -1) { + UErrorCode status = U_ZERO_ERROR; + testString.extract(charIdx+2, nameLength, charNameBuf, sizeof(charNameBuf)); + charNameBuf[sizeof(charNameBuf)-1] = 0; + theChar = u_charFromName(U_UNICODE_CHAR_NAME, charNameBuf, &status); + if (U_FAILURE(status)) { + theChar = -1; + } + } + if (theChar == -1) { + errln("Error in named character in test file at line %d, col %d", + lineNum, column); + } else { + // Named code point was recognized. Insert it + // into the test data. + tp.dataToBreak.append(theChar); + while (tp.dataToBreak.length() > tp.srcLine->size()) { + tp.srcLine->addElement(lineNum, status); + tp.srcCol ->addElement(column, status); + } + } + if (nameEndIdx > charIdx) { + charIdx = nameEndIdx+1; + } + break; + } + + + + + if (testString.compare(charIdx-1, 2, "<>") == 0) { + charIdx++; + int32_t breakIdx = tp.dataToBreak.length(); + tp.expectedBreaks->setSize(breakIdx+1); + tp.expectedBreaks->setElementAt(-1, breakIdx); + tp.srcLine->setSize(breakIdx+1); + tp.srcLine->setElementAt(lineNum, breakIdx); + tp.srcCol ->setSize(breakIdx+1); + tp.srcCol ->setElementAt(column, breakIdx); + break; + } + + if (c == CH_LT) { + tagValue = 0; + parseState = PARSE_NUM; + break; + } + + if (c == CH_HASH && column==3) { // TODO: why is column off so far? + parseState = PARSE_COMMENT; + savedState = PARSE_DATA; + break; + } + + if (c == CH_BACKSLASH) { + // Check for \ at end of line, a line continuation. + // Advance over (discard) the newline + UChar32 cp = testString.char32At(charIdx); + if (cp == CH_CR && charIdx<len && testString.charAt(charIdx+1) == CH_LF) { + // We have a CR LF + // Need an extra increment of the input ptr to move over both of them + charIdx++; + } + if (cp == CH_LF || cp == CH_CR) { + lineNum++; + colStart = charIdx; + charIdx++; + break; + } + + // Let unescape handle the back slash. + cp = testString.unescapeAt(charIdx); + if (cp != -1) { + // Escape sequence was recognized. Insert the char + // into the test data. + tp.dataToBreak.append(cp); + while (tp.dataToBreak.length() > tp.srcLine->size()) { + tp.srcLine->addElement(lineNum, status); + tp.srcCol ->addElement(column, status); + } + break; + } + + + // Not a recognized backslash escape sequence. + // Take the next char as a literal. + // TODO: Should this be an error? + c = testString.charAt(charIdx); + charIdx = testString.moveIndex32(charIdx, 1); + } + + // Normal, non-escaped data char. + tp.dataToBreak.append(c); + + // Save the mapping from offset in the data to line/column numbers in + // the original input file. Will be used for better error messages only. + // If there's an expected break before this char, the slot in the mapping + // vector will already be set for this char; don't overwrite it. + if (tp.dataToBreak.length() > tp.srcLine->size()) { + tp.srcLine->addElement(lineNum, status); + tp.srcCol ->addElement(column, status); + } + break; + + + case PARSE_NUM: + // We are parsing an expected numeric tag value, like <1234>, + // within a chunk of data. + if (u_isUWhiteSpace(c)) { + break; + } + + if (c == CH_GT) { + // Finished the number. Add the info to the expected break data, + // and switch parse state back to doing plain data. + parseState = PARSE_DATA; + if (tagValue == 0) { + tagValue = -1; + } + int32_t breakIdx = tp.dataToBreak.length(); + tp.expectedBreaks->setSize(breakIdx+1); + tp.expectedBreaks->setElementAt(tagValue, breakIdx); + tp.srcLine->setSize(breakIdx+1); + tp.srcLine->setElementAt(lineNum, breakIdx); + tp.srcCol ->setSize(breakIdx+1); + tp.srcCol ->setElementAt(column, breakIdx); + break; + } + + if (u_isdigit(c)) { + tagValue = tagValue*10 + u_charDigitValue(c); + break; + } + + errln("Syntax Error in test file at line %d, col %d", + lineNum, column); + goto end_test; + parseState = PARSE_COMMENT; + break; + } + + + if (U_FAILURE(status)) { + errln("ICU Error %s while parsing test file at line %d.", + u_errorName(status), lineNum); + goto end_test; + status = U_ZERO_ERROR; + } + + } + +end_test: + delete tp.bi; + delete tp.expectedBreaks; + delete tp.srcLine; + delete tp.srcCol; + delete [] testFile; +} + + +//------------------------------------------------------------------------------- +// +// ReadAndConvertFile Read a text data file, convert it to UChars, and +// return the datain one big UChar * buffer, which the caller must delete. +// +// TODO: This is a clone of RegexTest::ReadAndConvertFile. +// Move this function to some common place. +// +//-------------------------------------------------------------------------------- +UChar *RBBITest::ReadAndConvertFile(const char *fileName, int &ulen, UErrorCode &status) { + UChar *retPtr = NULL; + char *fileBuf = NULL; + UConverter* conv = NULL; + FILE *f = NULL; + + ulen = 0; + if (U_FAILURE(status)) { + return retPtr; + } + + // + // Open the file. + // + f = fopen(fileName, "rb"); + if (f == 0) { + errln("Error opening test data file %s\n", fileName); + status = U_FILE_ACCESS_ERROR; + return NULL; + } + // + // Read it in + // + int fileSize; + int amt_read; + + fseek( f, 0, SEEK_END); + fileSize = ftell(f); + fileBuf = new char[fileSize]; + fseek(f, 0, SEEK_SET); + amt_read = fread(fileBuf, 1, fileSize, f); + if (amt_read != fileSize || fileSize <= 0) { + errln("Error reading test data file."); + goto cleanUpAndReturn; + } + + // + // Look for a Unicode Signature (BOM) on the data just read + // + int32_t signatureLength; + const char * fileBufC; + const char* encoding; + + fileBufC = fileBuf; + encoding = ucnv_detectUnicodeSignature( + fileBuf, fileSize, &signatureLength, &status); + if(encoding!=NULL ){ + fileBufC += signatureLength; + fileSize -= signatureLength; + } + + // + // Open a converter to take the rule file to UTF-16 + // + conv = ucnv_open(encoding, &status); + if (U_FAILURE(status)) { + goto cleanUpAndReturn; + } + + // + // Convert the rules to UChar. + // Preflight first to determine required buffer size. + // + ulen = ucnv_toUChars(conv, + NULL, // dest, + 0, // destCapacity, + fileBufC, + fileSize, + &status); + if (status == U_BUFFER_OVERFLOW_ERROR) { + // Buffer Overflow is expected from the preflight operation. + status = U_ZERO_ERROR; + + retPtr = new UChar[ulen+1]; + ucnv_toUChars(conv, + retPtr, // dest, + ulen+1, + fileBufC, + fileSize, + &status); + } + +cleanUpAndReturn: + fclose(f); + delete fileBuf; + ucnv_close(conv); + if (U_FAILURE(status)) { + errln("ucnv_toUChars: ICU Error \"%s\"\n", u_errorName(status)); + delete retPtr; + retPtr = 0; + ulen = 0; + }; + return retPtr; +} + + +//-------------------------------------------------------------------------------------------- +// +// Exhaustive Tests, using Unicode Data Files. +// +//-------------------------------------------------------------------------------------------- + +// +// Token level scanner for the Unicode Line Break Test Data file. +// Return the next token, as follows: +// >= 0: a UChar32 character, scanned from hex in the file. +// -1: a break position, a division sign in the file. +// -2: end of rule. A new line in the file. +// -3: end of file. No more rules. +// -4: Error +// +// The scanner +// strips comments, ('#' to end of line) +// Recognizes CR, CR/LF and LF as new lines. +// Skips over spaces and Xs (don't break here) in the data. +// +struct ScanState { + int32_t fPeekChar; + UBool fPeeked; + int32_t fLineNum; + FILE *fFile; + ScanState() :fPeeked(FALSE), fLineNum(0), fFile(NULL) {}; +}; + +// Literal characters that are of interest. In hex to keep EBCDIC based machines happy. +// The data itself is latin-1 on all platforms. +static const int32_t chSpace = 0x20; +static const int32_t chTab = 0x09; +static const int32_t chCR = 0x0D; +static const int32_t chLF = 0x0A; +static const int32_t chHash = 0x23; +static const int32_t chMult = 0xD7; +static const int32_t chDivide = 0xF7; + +static int32_t nextLBDToken(ScanState *s) { + int32_t c; + + // Read characters from the input file until we get something interesting + // to return. The file is in latin-1 encoding. + for (;;) { + // Get the next character to look at, + if (s->fPeeked) { + c = s->fPeekChar; + s->fPeeked = FALSE; + } else { + c = getc(s->fFile); + } + + // EOF. Return immediately. + if (c == EOF) { + return -3; + } + + // Spaces. Treat the multiply sign as a space - it indicates a no-break position + // in the data, and the test program doesn't want to see them. + // Continue the next char loop, looking for something significant. + if (c == chSpace || c == chTab || c == chMult) { + continue; + } + + // Divide sign. Indicates an expected break position. + if (c == chDivide) { + return -1; + } + + // New Line Handling. Keep track of line number in the file, which in turn + // requires keeping track of CR/LF as a single new line. + if (c == chCR) { + s->fLineNum++; + s->fPeekChar = getc(s->fFile); + if (s->fPeekChar != chLF) {s->fPeeked = TRUE;}; + return -2; + } + if (c == chLF) { + s->fLineNum++; + return -2; + } + + // Comments. Consume everything up to the next new line. + if (c == chHash) { + do { + c = getc(s->fFile); + } while (!(c == EOF || c == chCR || c == chLF)); + s->fPeekChar = c; + s->fPeeked = TRUE; + return nextLBDToken(s); + } + + // Scan a hex character (UChar32) value. + if (u_digit(c, 16) >= 0) { + int32_t v = u_digit(c, 16); + for (;;) { + c = getc(s->fFile); + if (u_digit(c, 16) < 0) {break;}; + v <<= 4; + v += u_digit(c, 16); + } + s->fPeekChar = c; + s->fPeeked = TRUE; + return v; + } + + // Error. Character was something unexpected. + return -4; + } +} + + + +void RBBITest::TestLineBreakData() { + + UErrorCode status = U_ZERO_ERROR; + UnicodeString testString; + UVector expectedBreaks(status); + ScanState ss; + int32_t tok; + + BreakIterator *bi = BreakIterator::createLineInstance(Locale::getDefault(), status); + if (U_FAILURE(status)) { + errln("Failure creating break iterator"); + return; + } + + const char * lbdfName = "LBTest.txt"; + + // Open the test data file. + // TODO: a proper way to handle this data. + ss.fFile = fopen(lbdfName, "rb"); + if (ss.fFile == NULL) { + logln("Unable to open Line Break Test Data file. Skipping test."); + delete bi; + return; + } + + // Loop once per line from the test data file. + for (;;) { + // Zero out test data from previous line. + testString.truncate(0); + expectedBreaks.removeAllElements(); + + // Read one test's (line's) worth of data from the file. + // Loop once per token on the input file line. + for(;;) { + tok = nextLBDToken(&ss); + + // If we scanned a character number in the file. + // save it in the test data array. + if (tok >= 0) { + testString.append((UChar32)tok); + continue; + } + + // If we scanned a break position in the data, record it. + if (tok == -1) { + expectedBreaks.addElement(testString.length(), status); + continue; + } + + // If we scanned a new line, or EOF + // drop out of scan loop and run the test case. + if (tok == -2 || tok == -3) {break;}; + + // None of above. Error. + errln("Failure: Unrecognized data format, test file line %d", ss.fLineNum); + break; + } + + // If this line from the test data file actually contained test data, + // run the test. + if (testString.length() > 0) { + int32_t pos; // Break Position in the test string + int32_t expectedI = 0; // Index of expected break position in vector of same. + int32_t expectedPos; // Expected break position (index into test string) + + bi->setText(testString); + pos = bi->first(); // TODO: break iterators always return a match at pos 0. + pos = bi->next(); // Line Break TR says no match at position 0. + // Resolve. + + for (; pos != BreakIterator::DONE; ) { + expectedPos = expectedBreaks.elementAti(expectedI); + if (pos < expectedPos) { + errln("Failure: Test file line %d, unexpected break found at position %d", + ss.fLineNum, pos); + break; + } + if (pos > expectedPos) { + errln("Failure: Test file line %d, failed to find break at position %d", + ss.fLineNum, expectedPos); + break; + } + pos = bi->next(); + expectedI++; + } + } + + // If we've hit EOF on the input file, we're done. + if (tok == -3) { + break; + } + + } + + fclose(ss.fFile); + delete bi; + +} + +#if !UCONFIG_NO_REGULAR_EXPRESSIONS + +//--------------------------------------------------------------------------------------- +// +// classs RBBIMonkeyKind +// +// Monkey Test for Break Iteration +// Abstract interface class. Concrete derived classes independently +// implement the break rules for different iterator types. +// +// The Monkey Test itself uses doesn't know which type of break iterator it is +// testing, but works purely in terms of the interface defined here. +// +//--------------------------------------------------------------------------------------- +class RBBIMonkeyKind { +public: + // Return a UVector of UnicodeSets, representing the character classes used + // for this type of iterator. + virtual UVector *charClasses() = 0; + + // Set the test text on which subsequent calls to next() will operate + virtual void setText(const UnicodeString &s) = 0; + + // Find the next break postion, starting from the prev break position, or from zero. + // Return -1 after reaching end of string. + virtual int32_t next(int32_t i) = 0; + + virtual ~RBBIMonkeyKind(); + UErrorCode deferredStatus; + + +protected: + RBBIMonkeyKind(); + +private: +}; + +RBBIMonkeyKind::RBBIMonkeyKind() { + deferredStatus = U_ZERO_ERROR; +} + +RBBIMonkeyKind::~RBBIMonkeyKind() { +} + + +//---------------------------------------------------------------------------------------- +// +// Random Numbers. Similar to standard lib rand() and srand() +// Not using library to +// 1. Get same results on all platforms. +// 2. Get access to current seed, to more easily reproduce failures. +// +//--------------------------------------------------------------------------------------- +static uint32_t m_seed = 1; + +static uint32_t m_rand() +{ + m_seed = m_seed * 1103515245 + 12345; + return (uint32_t)(m_seed/65536) % 32768; +} + + +//------------------------------------------------------------------------------------------ +// +// class RBBICharMonkey Character (Grapheme Cluster) specific implementation +// of RBBIMonkeyKind. +// +//------------------------------------------------------------------------------------------ +class RBBICharMonkey: public RBBIMonkeyKind { +public: + RBBICharMonkey(); + virtual ~RBBICharMonkey(); + virtual UVector *charClasses(); + virtual void setText(const UnicodeString &s); + virtual int32_t next(int32_t i); +private: + UVector *fSets; + + UnicodeSet *fCRLFSet; + UnicodeSet *fControlSet; + UnicodeSet *fExtendSet; + UnicodeSet *fHangulSet; + UnicodeSet *fAnySet; + + RegexMatcher *fMatcher; + const UnicodeString *fText; +}; + + +RBBICharMonkey::RBBICharMonkey() { + UErrorCode status = U_ZERO_ERROR; + + fText = NULL; + fMatcher = new RegexMatcher("\\X", 0, status); // Pattern to match a grampheme cluster + + fCRLFSet = new UnicodeSet("[\\r\\n]", status); + fControlSet = new UnicodeSet("[[\\p{Zl}\\p{Zp}\\p{Cc}\\p{Cf}]-[\\n]-[\\r]-\\p{Grapheme_Extend}]", status); + fExtendSet = new UnicodeSet("[\\p{Grapheme_Extend}]", status); + fHangulSet = new UnicodeSet( + "[\\p{Hangul_Syllable_Type=L}\\p{Hangul_Syllable_Type=L}\\p{Hangul_Syllable_Type=T}" + "\\p{Hangul_Syllable_Type=LV}\\p{Hangul_Syllable_Type=LVT}]", status); + fAnySet = new UnicodeSet("[\\u0000-\\U0010ffff]", status); + + fSets = new UVector(status); + fSets->addElement(fCRLFSet, status); + fSets->addElement(fControlSet, status); + fSets->addElement(fExtendSet, status); + fSets->addElement(fHangulSet, status); + fSets->addElement(fAnySet, status); + if (U_FAILURE(status)) { + deferredStatus = status; + } +}; + + +void RBBICharMonkey::setText(const UnicodeString &s) { + fText = &s; + fMatcher->reset(s); +} + + +int32_t RBBICharMonkey::next(int32_t i) { + UErrorCode status = U_ZERO_ERROR; + int32_t retVal = -1; + + if (fMatcher->find(i, status)) { + retVal = fMatcher->end(status); + } + if (U_FAILURE(status)){ + retVal = -1; + } + return retVal; +} + + +UVector *RBBICharMonkey::charClasses() { + return fSets; +} + + +RBBICharMonkey::~RBBICharMonkey() { + delete fSets; + delete fCRLFSet; + delete fControlSet; + delete fExtendSet; + delete fHangulSet; + delete fAnySet; + + delete fMatcher; +} + +//------------------------------------------------------------------------------------------ +// +// class RBBIWordMonkey Word Break specific implementation +// of RBBIMonkeyKind. +// +//------------------------------------------------------------------------------------------ +class RBBIWordMonkey: public RBBIMonkeyKind { +public: + RBBIWordMonkey(); + virtual ~RBBIWordMonkey(); + virtual UVector *charClasses(); + virtual void setText(const UnicodeString &s); + virtual int32_t next(int32_t i); +private: + UVector *fSets; + + UnicodeSet *fKatakanaSet; + UnicodeSet *fALetterSet; + UnicodeSet *fMidLetterSet; + UnicodeSet *fMidNumSet; + UnicodeSet *fNumericSet; + UnicodeSet *fFormatSet; + UnicodeSet *fOtherSet; + UnicodeSet *fExtendSet; + UnicodeSet *fExtendNumLetSet; + + RegexMatcher *fMatcher; + + const UnicodeString *fText; + + RegexMatcher *fGCFMatcher; + RegexMatcher *fGCMatcher; + +}; + + +RBBIWordMonkey::RBBIWordMonkey() : fGCFMatcher(0), + fGCMatcher(0) +{ + UErrorCode status = U_ZERO_ERROR; + + fSets = new UVector(status); + + fKatakanaSet = new UnicodeSet("[\\p{script=KATAKANA}" + "\\u3031-\\u3035\\u309b\\u309c\\u30a0" + "\\u30fc\\uff70\\uff9e\\uff9f]", status); + + const UnicodeString ALetterStr( "[[\\p{Alphabetic}" + "\\u00a0" // NBSP + "\\u05f3]" // Hebrew punct Geresh + "-[\\p{Ideographic}]" + "-[\\p{Script=Lao}]" + "-[\\p{Script=Hiragana}]" + "-[\\p{Grapheme_Extend}]]"); + fALetterSet = new UnicodeSet(ALetterStr, status); + fALetterSet->removeAll(*fKatakanaSet); + + fMidLetterSet = new UnicodeSet("[\\u0027\\u00b7\\u05f4\\u2019\\u2027\\u003a]", status); + fMidNumSet = new UnicodeSet("[[\\p{Line_Break=Infix_Numeric}]-[\\u003a]]", status); + fNumericSet = new UnicodeSet("[\\p{Nd}\\u066b\\u066c]", status); + fFormatSet = new UnicodeSet("[\\p{Format}-[\\u200c\\u200d]]", status); + fExtendSet = new UnicodeSet("[\\p{Grapheme_Extend}]", status); + fExtendNumLetSet = new UnicodeSet("[\\p{Pc}-[\\u30fb\\uff65]]", status); + fOtherSet = new UnicodeSet(); + if(U_FAILURE(status)) { + deferredStatus = status; + return; + } + + fOtherSet->complement(); + fOtherSet->removeAll(*fKatakanaSet); + fOtherSet->removeAll(*fALetterSet); + fOtherSet->removeAll(*fMidLetterSet); + fOtherSet->removeAll(*fMidNumSet); + fOtherSet->removeAll(*fNumericSet); + fOtherSet->removeAll(*fExtendNumLetSet); + + fSets->addElement(fALetterSet, status); + fSets->addElement(fKatakanaSet, status); + fSets->addElement(fMidLetterSet, status); + fSets->addElement(fMidNumSet, status); + fSets->addElement(fNumericSet, status); + fSets->addElement(fFormatSet, status); + fSets->addElement(fOtherSet, status); + fSets->addElement(fExtendNumLetSet, status); + + + fGCFMatcher = new RegexMatcher("\\X(?:[\\p{Format}-\\p{Grapheme_Extend}])*", 0, status); + fGCMatcher = new RegexMatcher("\\X", 0, status); + + if (U_FAILURE(status)) { + deferredStatus = status; + } +}; + +void RBBIWordMonkey::setText(const UnicodeString &s) { + fText = &s; + fGCMatcher->reset(*fText); + fGCFMatcher->reset(*fText); +} + + +int32_t RBBIWordMonkey::next(int32_t prevPos) { + UErrorCode status = U_ZERO_ERROR; + + int p0, p1, p2, p3; // Indices of the significant code points around the + // break position being tested. The candidate break + // location is before p2. + + int breakPos = -1; + + UChar32 c0, c1, c2, c3; // The code points at p0, p1, p2 & p3. + + // Prev break at end of string. return DONE. + if (prevPos >= fText->length()) { + return -1; + } + p0 = p1 = p2 = p3 = prevPos; + c3 = fText->char32At(prevPos); + c0 = c1 = c2 = 0; + + + // Format char after prev break? Special case, see last Note for Word Boundaries TR. + // break immdiately after the format char. + if (fFormatSet->contains(c3)) { + breakPos = fText->moveIndex32(prevPos, 1); + return breakPos; + } + + + // Loop runs once per "significant" character position in the input text. + for (;;) { + // Move all of the positions forward in the input string. + p0 = p1; c0 = c1; + p1 = p2; c1 = c2; + p2 = p3; c2 = c3; + // Advancd p3 by (GC Format*) Rules 3, 4 + status = U_ZERO_ERROR; + if (fGCFMatcher->find(p3, status) == FALSE) { + p3 = fText->length(); + c3 = 0; + } else { + p3 = fGCFMatcher->end(0, status); + U_ASSERT(U_SUCCESS(status)); + c3 = fText->char32At(p3); + } + + if (p1 == p2) { + // Still warming up the loop. (won't work with zero length strings, but we don't care) + continue; + } + if (p2 == fText->length()) { + // Reached end of string. Always a break position. + break; + } + + // Rule (5). ALetter x ALetter + if (fALetterSet->contains(c1) && + fALetterSet->contains(c2)) { + continue; + } + + // Rule (6) ALetter x (MidLetter | MidNumLet) ALetter + // + // Also incorporates rule 7 by skipping pos ahead to position of the + // terminating ALetter. + if ( fALetterSet->contains(c1) && + fMidLetterSet->contains(c2) && + fALetterSet->contains(c3)) { + continue; + } + + + // Rule (7) ALetter (MidLetter | MidNumLet) x ALetter + if (fALetterSet->contains(c0) && + (fMidLetterSet->contains(c1) ) && + fALetterSet->contains(c2)) { + continue; + } + + // Rule (8) Numeric x Numeric + if (fNumericSet->contains(c1) && + fNumericSet->contains(c2)) { + continue; + } + + // Rule (9) ALetter x Numeric + if (fALetterSet->contains(c1) && + fNumericSet->contains(c2)) { + continue; + } + + // Rule (10) Numeric x ALetter + if (fNumericSet->contains(c1) && + fALetterSet->contains(c2)) { + continue; + } + + // Rule (11) Numeric (MidNum | MidNumLet) x Numeric + if ( fNumericSet->contains(c0) && + fMidNumSet->contains(c1) && + fNumericSet->contains(c2)) { + continue; + } + + // Rule (12) Numeric x (MidNum | MidNumLet) Numeric + if (fNumericSet->contains(c1) && + fMidNumSet->contains(c2) && + fNumericSet->contains(c3)) { + continue; + } + + // Rule (13) Katakana x Katakana + if (fKatakanaSet->contains(c1) && + fKatakanaSet->contains(c2)) { + continue; + } + + // Rule 13a + if ((fALetterSet->contains(c1) || fNumericSet->contains(c1) || + fKatakanaSet->contains(c1) || fExtendNumLetSet->contains(c1)) && + fExtendNumLetSet->contains(c2)) { + continue; + } + + // Rule 13b + if (fExtendNumLetSet->contains(c1) && + (fALetterSet->contains(c2) || fNumericSet->contains(c2) || + fKatakanaSet->contains(c2))) { + continue; + } + + + // Rule 14. Break found here. + break; + } + + + // Rule 4 fixup, back up before any trailing + // format characters at the end of the word. + breakPos = p2; + status = U_ZERO_ERROR; + if (fGCMatcher->find(p1, status)) { + breakPos = fGCMatcher->end(0, status); + U_ASSERT(U_SUCCESS(status)); + } + return breakPos; +} + + +UVector *RBBIWordMonkey::charClasses() { + return fSets; +} + + +RBBIWordMonkey::~RBBIWordMonkey() { + delete fSets; + delete fKatakanaSet; + delete fALetterSet; + delete fMidLetterSet; + delete fMidNumSet; + delete fNumericSet; + delete fFormatSet; + delete fExtendSet; + delete fOtherSet; + + delete fGCFMatcher; + delete fGCMatcher; +} + + + + +//------------------------------------------------------------------------------------------- +// +// RBBILineMonkey +// +//------------------------------------------------------------------------------------------- + +class RBBILineMonkey: public RBBIMonkeyKind { +public: + RBBILineMonkey(); + virtual ~RBBILineMonkey(); + virtual UVector *charClasses(); + virtual void setText(const UnicodeString &s); + virtual int32_t next(int32_t i); + virtual void rule67Adjust(int32_t pos, UChar32 *posChar, int32_t *nextPos, UChar32 *nextChar); +private: + UVector *fSets; + + UnicodeSet *fBK; + UnicodeSet *fCR; + UnicodeSet *fLF; + UnicodeSet *fCM; + UnicodeSet *fNL; + UnicodeSet *fSG; + UnicodeSet *fWJ; + UnicodeSet *fZW; + UnicodeSet *fGL; + UnicodeSet *fCB; + UnicodeSet *fSP; + UnicodeSet *fB2; + UnicodeSet *fBA; + UnicodeSet *fBB; + UnicodeSet *fHY; + UnicodeSet *fCL; + UnicodeSet *fEX; + UnicodeSet *fIN; + UnicodeSet *fNS; + UnicodeSet *fOP; + UnicodeSet *fQU; + UnicodeSet *fIS; + UnicodeSet *fNU; + UnicodeSet *fPO; + UnicodeSet *fPR; + UnicodeSet *fSY; + UnicodeSet *fAI; + UnicodeSet *fAL; + UnicodeSet *fID; + UnicodeSet *fSA; + UnicodeSet *fXX; + + BreakIterator *fCharBI; + + const UnicodeString *fText; + int32_t *fOrigPositions; + + RegexMatcher *fNumberMatcher; + RegexMatcher *fLB10Matcher; + RegexMatcher *fLB11Matcher; +}; + + +RBBILineMonkey::RBBILineMonkey() +{ + UErrorCode status = U_ZERO_ERROR; + + fSets = new UVector(status); + + fBK = new UnicodeSet("[\\p{Line_Break=BK}]", status); + fCR = new UnicodeSet("[\\p{Line_break=CR}]", status); + fLF = new UnicodeSet("[\\p{Line_break=LF}]", status); + fCM = new UnicodeSet("[\\p{Line_break=CM}]", status); + fNL = new UnicodeSet("[\\p{Line_break=NL}]", status); + fWJ = new UnicodeSet("[\\p{Line_break=WJ}]", status); + fZW = new UnicodeSet("[\\p{Line_break=ZW}]", status); + fGL = new UnicodeSet("[\\p{Line_break=GL}]", status); + fCB = new UnicodeSet("[\\p{Line_break=CB}]", status); + fSP = new UnicodeSet("[\\p{Line_break=SP}]", status); + fB2 = new UnicodeSet("[\\p{Line_break=B2}]", status); + fBA = new UnicodeSet("[\\p{Line_break=BA}]", status); + fBB = new UnicodeSet("[\\p{Line_break=BB}]", status); + fHY = new UnicodeSet("[\\p{Line_break=HY}]", status); + fCL = new UnicodeSet("[\\p{Line_break=CL}]", status); + fEX = new UnicodeSet("[\\p{Line_break=EX}]", status); + fIN = new UnicodeSet("[\\p{Line_break=IN}]", status); + fNS = new UnicodeSet("[\\p{Line_break=NS}]", status); + fOP = new UnicodeSet("[\\p{Line_break=OP}]", status); + fQU = new UnicodeSet("[\\p{Line_break=QU}]", status); + fIS = new UnicodeSet("[\\p{Line_break=IS}]", status); + fNU = new UnicodeSet("[\\p{Line_break=NU}]", status); + fPO = new UnicodeSet("[\\p{Line_break=PO}]", status); + fPR = new UnicodeSet("[\\p{Line_break=PR}]", status); + fSY = new UnicodeSet("[\\p{Line_break=SY}]", status); + fAI = new UnicodeSet("[\\p{Line_break=AI}]", status); + fAL = new UnicodeSet("[\\p{Line_break=AL}]", status); + fID = new UnicodeSet("[\\p{Line_break=ID}]", status); + fSA = new UnicodeSet("[\\p{Line_break=SA}]", status); + fXX = new UnicodeSet("[\\p{Line_break=XX}]", status); + + fAL->addAll(*fXX); // Default behavior for XX is identical to AL + fAL->addAll(*fAI); // Default behavior for AI is identical to AL + fAL->addAll(*fSA); // Default behavior for SA is XX, which defaults to AL + + + + fSets->addElement(fBK, status); + fSets->addElement(fCR, status); + fSets->addElement(fLF, status); + fSets->addElement(fCM, status); + fSets->addElement(fNL, status); + fSets->addElement(fWJ, status); + fSets->addElement(fZW, status); + fSets->addElement(fGL, status); + fSets->addElement(fCB, status); + fSets->addElement(fSP, status); + fSets->addElement(fB2, status); + fSets->addElement(fBA, status); + fSets->addElement(fBB, status); + fSets->addElement(fHY, status); + fSets->addElement(fCL, status); + fSets->addElement(fEX, status); + fSets->addElement(fIN, status); + fSets->addElement(fNS, status); + fSets->addElement(fOP, status); + fSets->addElement(fQU, status); + fSets->addElement(fIS, status); + fSets->addElement(fNU, status); + fSets->addElement(fPO, status); + fSets->addElement(fPR, status); + fSets->addElement(fSY, status); + fSets->addElement(fAI, status); + fSets->addElement(fAL, status); + fSets->addElement(fID, status); + fSets->addElement(fWJ, status); + fSets->addElement(fSA, status); + // fSets->addElement(fXX, status); + + + + fNumberMatcher = new RegexMatcher( + "(\\p{Line_Break=PR}\\p{Line_Break=CM}*)?" + "((\\p{Line_Break=OP}|\\p{Line_Break=HY})\\p{Line_Break=CM}*)?" + "\\p{Line_Break=NU}\\p{Line_Break=CM}*" + "((\\p{Line_Break=NU}|\\p{Line_Break=IS}|\\p{Line_Break=SY})\\p{Line_Break=CM}*)*" + "(\\p{Line_Break=CL}\\p{Line_Break=CM}*)?" + "(\\p{Line_Break=PO}\\p{Line_Break=CM}*)?", + 0, status); + + fLB10Matcher = new RegexMatcher( + "\\p{Line_Break=QU}\\p{Line_Break=CM}*" + "\\p{Line_Break=SP}*" + "(\\p{Line_Break=OP})\\p{Line_Break=CM}*", + 0, status); + + fLB11Matcher = new RegexMatcher( + "\\p{Line_Break=CL}\\p{Line_Break=CM}*" + "\\p{Line_Break=SP}*" + "(\\p{Line_Break=NS})\\p{Line_Break=CM}*", + 0, status); + + fCharBI = BreakIterator::createCharacterInstance(Locale::getEnglish(), status); + + if (U_FAILURE(status)) { + deferredStatus = status; + } +}; + + +void RBBILineMonkey::setText(const UnicodeString &s) { + fText = &s; + fCharBI->setText(s); + fNumberMatcher->reset(s); +} + +// +// rule67Adjust +// Line Break TR rules 6 and 7 implementation. +// This deals with combining marks, Hangul Syllables, and other sequences that +// that must be treated as if they were something other than what they actually are. +// +// This is factored out into a separate function because it must be applied twice for +// each potential break, once to the chars before the position being checked, then +// again to the text following the possible break. +// +void RBBILineMonkey::rule67Adjust(int32_t pos, UChar32 *posChar, int32_t *nextPos, UChar32 *nextChar) { + if (pos == -1) { + // Invalid initial position. Happens during the warmup iteration of the + // main loop in next(). + return; + } + + int32_t nPos = *nextPos; + + // LB 6 Treat Korean Syllables as a single unit + int32_t hangultype = u_getIntPropertyValue(*posChar, UCHAR_HANGUL_SYLLABLE_TYPE); + if (hangultype != U_HST_NOT_APPLICABLE) { + nPos = fCharBI->following(pos); // Advance by grapheme cluster, which + // contains the logic to locate Hangul syllables. + // Grapheme Cluster Ugliness: some Grapheme_Extend chars, which are absorbed + // into a grapheme cluster, are NOT Line Break CM. (Some are GL, for example.) + // We don't want consume any of these. The Approach is + // 1. Back nPos up, undoing the consumption of any + // Grapheme_Extend chars by the char break iterator. + // 2. Let the LB 7b logic below reconsume any Line Break CM chars. + for (;;) { + nPos = fText->moveIndex32(nPos, -1); + UChar32 possiblyExtendChar = fText->char32At(nPos); + if (fID->contains(possiblyExtendChar)) { + // We hit into the Hangul Syllable itself, class is ID. + nPos = fText->moveIndex32(nPos, +1); + break; + } + } + } + + // LB 7b Keep combining sequences together. + // advance over any CM class chars. (Line Break CM class is different from + // grapheme cluster CM, so we need to do this even for HangulSyllables. + // Line Break may eat additional stuff as combining, beyond what graphem cluster did. + if (!(fBK->contains(*posChar) || fZW->contains(*posChar) || *posChar==0x0a + || *posChar==0x0d || *posChar==0x85)) { + for (;;) { + *nextChar = fText->char32At(nPos); + if (!fCM->contains(*nextChar)) { + break; + } + nPos = fText->moveIndex32(nPos, 1); + } + } + + + // LB 7a In a SP CM* sequence, treat the SP as an ID + if (nPos != *nextPos && fSP->contains(*posChar)) { + *posChar = 0x4e00; // 0x4e00 is a CJK Ideograph, linebreak type is ID. + } + + // LB 7b Treat X CM* as if it were x. + // No explicit action required. + + // LB 7c Treat any remaining combining mark as AL + if (fCM->contains(*posChar)) { + *posChar = 0x41; // thisChar = 'A'; + } + + // Push the updated nextPos and nextChar back to our caller. + // This only makes a difference if posChar got bigger, by slurping up a + // combining sequence or Hangul syllable. + *nextPos = nPos; + *nextChar = fText->char32At(nPos); +} + + + +int32_t RBBILineMonkey::next(int32_t startPos) { + UErrorCode status = U_ZERO_ERROR; + int32_t pos; // Index of the char following a potential break position + UChar32 thisChar; // Character at above position "pos" + + int32_t prevPos; // Index of the char preceding a potential break position + UChar32 prevChar; // Character at above position. Note that prevChar + // and thisChar may not be adjacent because combining + // characters between them will be ignored. + + int32_t nextPos; // Index of the next character following pos. + // Usually skips over combining marks. + int32_t nextCPPos; // Index of the code point following "pos." + // May point to a combining mark. + int32_t tPos; // temp value. + UChar32 c; + + if (startPos >= fText->length()) { + return -1; + } + + + // Initial values for loop. Loop will run the first time without finding breaks, + // while the invalid values shift out and the "this" and + // "prev" positions are filled in with good values. + pos = prevPos = -1; // Invalid value, serves as flag for initial loop iteration. + thisChar = prevChar = 0; + nextPos = nextCPPos = startPos; + + + // Loop runs once per position in the test text, until a break position + // is found. + for (;;) { + prevPos = pos; + prevChar = thisChar; + + pos = nextPos; + thisChar = fText->char32At(pos); + + nextCPPos = fText->moveIndex32(pos, 1); + nextPos = nextCPPos; + + // Break at end of text. + if (pos >= fText->length()) { + break; + } + + // LB 3a Always break after hard line breaks, + if (fBK->contains(prevChar)) { + break; + } + + // LB 3b Break after CR, LF, NL, but not inside CR LF + if (prevChar == 0x0d && thisChar == 0x0a) { + continue; + } + if (prevChar == 0x0d || + prevChar == 0x0a || + prevChar == 0x85) { + break; + } + + // LB 3c Don't break before hard line breaks + if (thisChar == 0x0d || thisChar == 0x0a || thisChar == 0x85 || + fBK->contains(thisChar)) { + continue; + } + + // LB 10 QU SP* x OP + if (prevPos >= 0) { + UnicodeString subStr10(*fText, prevPos); + fLB10Matcher->reset(subStr10); + status = U_ZERO_ERROR; + if (fLB10Matcher->lookingAt(status)) { // /QU CM* SP* (OP) CM*/; + // TODO: Check status codes + pos = prevPos + fLB10Matcher->start(1, status); + nextPos = prevPos + fLB10Matcher->end(0, status); + thisChar = fText->char32At(pos); + continue; + } + } + + // LB 11 CL SP* x NS + if (prevPos >= 0) { + UnicodeString subStr11(*fText, prevPos); + fLB11Matcher->reset(subStr11); + status = U_ZERO_ERROR; + if (fLB11Matcher->lookingAt(status)) { // /QU CM* SP* (OP) CM*/; + // TODO: Check status codes + pos = prevPos + fLB11Matcher->start(1, status); + nextPos = prevPos + fLB11Matcher->end(0, status); + thisChar = fText->char32At(pos); + continue; + } + } + + // LB 4 Don't break before spaces or zero-width space. + if (fSP->contains(thisChar)) { + continue; + } + + if (fZW->contains(thisChar)) { + continue; + } + + // LB 5 Break after zero width space + if (fZW->contains(prevChar)) { + break; + } + + // LB 6, LB 7 + /*int32_t oldpos = pos;*/ + rule67Adjust(prevPos, &prevChar, &pos, &thisChar); + + nextCPPos = fText->moveIndex32(pos, 1); + nextPos = nextCPPos; + c = fText->char32At(nextPos); + // another percularity of LB 4 - Dont break before space + if (fSP->contains(thisChar)) { + continue; + } + rule67Adjust(pos, &thisChar, &nextPos, &c); + + // If the loop is still warming up - if we haven't shifted the initial + // -1 positions out of prevPos yet - loop back to advance the + // position in the input without any further looking for breaks. + if (prevPos == -1) { + continue; + } + + // Re-apply rules 3c, 4 because these could be affected by having + // a new thisChar from doing rule 6 or 7. + if (thisChar == 0x0d || thisChar == 0x0a || thisChar == 0x85 || // 3c + fBK->contains(thisChar)) { + continue; + } + if (fSP->contains(thisChar)) { // LB 4 + continue; + } + if (fZW->contains(thisChar)) { // LB 4 + continue; + } + + + // LB 8 Don't break before closings. + // NU x CL and NU x IS are not matched here so that they will + // fall into LB 17 and the more general number regular expression. + // + if (!fNU->contains(prevChar) && fCL->contains(thisChar) || + fEX->contains(thisChar) || + !fNU->contains(prevChar) && fIS->contains(thisChar) || + !fNU->contains(prevChar) && fSY->contains(thisChar)) { + continue; + } + + // LB 9 Don't break after OP SP* + // Scan backwards, checking for this sequence. + // The OP char could include combining marks, so we acually check for + // OP CM* SP* + // Another Twist: The Rule 67 fixes may have changed a CP CM + // sequence into a ID char, so before scanning back through spaces, + // verify that prevChar is indeed a space. The prevChar variable + // may differ from fText[prevPos] + tPos = prevPos; + if (fSP->contains(prevChar)) { + while (tPos > 0 && fSP->contains(fText->char32At(tPos))) { + tPos=fText->moveIndex32(tPos, -1); + } + } + while (tPos > 0 && fCM->contains(fText->char32At(tPos))) { + tPos=fText->moveIndex32(tPos, -1); + } + if (fOP->contains(fText->char32At(tPos))) { + continue; + } + + + // LB 11a B2 x B2 + if (fB2->contains(thisChar) && fB2->contains(prevChar)) { + continue; + } + + // LB 11b + // x GL + // GL x + if (fGL->contains(thisChar) || fGL->contains(prevChar)) { + continue; + } + if (fWJ->contains(thisChar) || fWJ->contains(prevChar)) { + continue; + } + + // LB 12 break after space + if (fSP->contains(prevChar)) { + break; + } + + // LB 14 + // x QU + // QU x + if (fQU->contains(thisChar) || fQU->contains(prevChar)) { + continue; + } + + // LB 14a Break around a CB + if (fCB->contains(thisChar) || fCB->contains(prevChar)) { + break; + } + + // LB 15 + if (fBA->contains(thisChar) || + fHY->contains(thisChar) || + fNS->contains(thisChar) || + fBB->contains(prevChar) ) { + continue; + } + + // LB 16 + if (fAL->contains(prevChar) && fIN->contains(thisChar) || + fID->contains(prevChar) && fIN->contains(thisChar) || + fIN->contains(prevChar) && fIN->contains(thisChar) || + fNU->contains(prevChar) && fIN->contains(thisChar) ) { + continue; + } + + + // LB 17 ID x PO (Note: Leading CM behaves like ID) + // AL x NU + // NU x AL + if (fID->contains(prevChar) && fPO->contains(thisChar) || + fCM->contains(prevChar) && fPO->contains(thisChar) || + fAL->contains(prevChar) && fNU->contains(thisChar) || + fNU->contains(prevChar) && fAL->contains(thisChar) ) { + continue; + } + + // LB 18 Numbers + UnicodeString subStr18(*fText, prevPos); + fNumberMatcher->reset(subStr18); + if (fNumberMatcher->lookingAt(status)) { + // TODO: Check status codes + // Matched a number. But could have been just a single digit, which would + // not represent a "no break here" between prevChar and thisChar + int32_t numEndIdx = prevPos + fNumberMatcher->end(status); // idx of first char following num + if (numEndIdx > pos) { + // Number match includes at least our two chars being checked + if (numEndIdx > nextPos) { + // Number match includes additional chars. Update pos and nextPos + // so that next loop iteration will continue at the end of the number, + // checking for breaks between last char in number & whatever follows. + nextPos = numEndIdx; + pos = fCharBI->preceding(numEndIdx); + thisChar = fText->char32At(pos); + while (fCM->contains(thisChar)) { + pos = fCharBI->preceding(pos); + thisChar = fText->char32At(pos); + } + } + continue; + } + } + + if (fPR->contains(prevChar) && fAL->contains(thisChar)) { + continue; + } + + if (fPR->contains(prevChar) && fID->contains(thisChar)) { + continue; + } + + // LB 18b + if (fHY->contains(prevChar) || fBB->contains(thisChar)) { + break; + } + + // LB 19 + if (fAL->contains(prevChar) && fAL->contains(thisChar)) { + continue; + } + + // LB 19b + if (fIS->contains(prevChar) && fAL->contains(thisChar)) { + continue; + } + + // LB 20 Break everywhere else + break; + + } + + return pos; +} + + +UVector *RBBILineMonkey::charClasses() { + return fSets; +} + + +RBBILineMonkey::~RBBILineMonkey() { + delete fSets; + + delete fBK; + delete fCR; + delete fLF; + delete fCM; + delete fNL; + delete fWJ; + delete fZW; + delete fGL; + delete fCB; + delete fSP; + delete fB2; + delete fBA; + delete fBB; + delete fHY; + delete fCL; + delete fEX; + delete fIN; + delete fNS; + delete fOP; + delete fQU; + delete fIS; + delete fNU; + delete fPO; + delete fPR; + delete fSY; + delete fAI; + delete fAL; + delete fID; + delete fSA; + delete fXX; + + delete fCharBI; + delete fNumberMatcher; + delete fLB10Matcher; + delete fLB11Matcher; +} + + +//------------------------------------------------------------------------------------------- +// +// TestMonkey +// +// params +// seed=nnnnn Random number starting seed. +// Setting the seed allows errors to be reproduced. +// loop=nnn Looping count. Controls running time. +// -1: run forever. +// 0 or greater: run length. +// +// type = char | word | line | sent | title +// +//------------------------------------------------------------------------------------------- + +static int32_t getIntParam(UnicodeString name, UnicodeString ¶ms, int32_t defaultVal) { + int32_t val = defaultVal; + name.append(" *= *(-?\\d+)"); + UErrorCode status = U_ZERO_ERROR; + RegexMatcher m(name, params, 0, status); + if (m.find()) { + // The param exists. Convert the string to an int. + char valString[100]; + int32_t paramLength = m.end(1, status) - m.start(1, status); + if (paramLength >= (int32_t)(sizeof(valString)-1)) { + paramLength = (int32_t)(sizeof(valString)-2); + } + params.extract(m.start(1, status), paramLength, valString, sizeof(valString)); + val = strtol(valString, NULL, 10); + + // Delete this parameter from the params string. + m.reset(); + params = m.replaceFirst("", status); + } + U_ASSERT(U_SUCCESS(status)); + return val; +} +#endif + +static void testBreakBoundPreceding(RBBITest *test, UnicodeString ustr, + BreakIterator *bi, + int expected[], + int expectedcount) +{ + int count = 0; + int i = 0; + int forward[50]; + bi->setText(ustr); + for (i = bi->first(); i != BreakIterator::DONE; i = bi->next()) { + forward[count] = i; + if (count < expectedcount && expected[count] != i) { + test->errln("break forward test failed: expected %d but got %d", + expected[count], i); + break; + } + count ++; + } + if (count != expectedcount) { + printStringBreaks(ustr, expected, expectedcount); + test->errln("break test failed: missed %d match", + expectedcount - count); + return; + } + // testing boundaries + for (i = 1; i < expectedcount; i ++) { + int j = expected[i - 1]; + if (!bi->isBoundary(j)) { + printStringBreaks(ustr, expected, expectedcount); + test->errln("Expected boundary at position %d", j); + return; + } + for (j = expected[i - 1] + 1; j < expected[i]; j ++) { + if (bi->isBoundary(j)) { + printStringBreaks(ustr, expected, expectedcount); + test->errln("Not expecting boundary at position %d", j); + return; + } + } + } + + for (i = bi->last(); i != BreakIterator::DONE; i = bi->previous()) { + count --; + if (forward[count] != i) { + test->errln("happy break test reverse failed: expected %d but got %d", + forward[count], i); + break; + } + } + if (count != 0) { + printStringBreaks(ustr, expected, expectedcount); + test->errln("happy break test failed: missed a match"); + return; + } + + // testing preceding + for (i = 0; i < expectedcount - 1; i ++) { + int j = expected[i] + 1; + for (; j <= expected[i + 1]; j ++) { + if (bi->preceding(j) != expected[i]) { + printStringBreaks(ustr, expected, expectedcount); + test->errln("Not expecting backwards boundary at position %d", j); + return; + } + } + } +} + +void RBBITest::TestWordBreaks(void) +{ +#if !UCONFIG_NO_REGULAR_EXPRESSIONS + + // <data><>\u1d4a\u206e<?>\u0603\U0001d7ff<>\u2019<></data> + Locale locale("en"); + UErrorCode status = U_ZERO_ERROR; + // BreakIterator *bi = BreakIterator::createCharacterInstance(locale, status); + BreakIterator *bi = BreakIterator::createWordInstance(locale, status); + UChar str[300]; + static const char *strlist[] = + { + "\\U000e0032\\u0097\\u0f94\\uc2d8\\u05f4\\U000e0031\\u060d", + "\\U000e0037\\u4666\\u1202\\u003a\\U000e0031\\u064d\\u0bea\\u591c\\U000e0040\\u003b", + "\\u0589\\u3e99\\U0001d7f3\\U000e0074\\u1810\\u200e\\U000e004b\\u179c\\u0027\\U000e0061\\u003a", + "\\u398c\\U000104a5\\U0001d173\\u102d\\u002e\\uca3b\\u002e\\u002c\\u5622", + "\\u90ca\\u3588\\u009c\\u0953\\u194b", + "\\u200e\\U000e0072\\u0a4b\\U000e003f\\ufd2b\\u2027\\u002e\\u002e", + "\\u0602\\u2019\\ua191\\U000e0063\\u0a4c\\u003a\\ub4b5\\u003a\\u827f\\u002e", + "\\u7f1f\\uc634\\u65f8\\u0944\\u04f2\\uacdf\\u1f9c\\u05f4\\u002e", + "\\U000e0042\\u002e\\u0fb8\\u09ef\\u0ed1\\u2044", + "\\u003b\\u024a\\u102e\\U000e0071\\u0600", + "\\u2027\\U000e0067\\u0a47\\u00b7", + "\\u1fcd\\u002c\\u07aa\\u0027\\u11b0", + "\\u002c\\U000e003c\\U0001d7f4\\u003a\\u0c6f\\u0027", + "\\u0589\\U000e006e\\u0a42\\U000104a5", + "\\u4f66\\ub523\\u003a\\uacae\\U000e0047\\u003a", + "\\u003a\\u0f21\\u0668\\u0dab\\u003a\\u0655\\u00b7", + "\\u0027\\u11af\\U000e0057\\u0602", + "\\U0001d7f2\\U000e007\\u0004\\u0589", + "\\U000e0022\\u003a\\u10b3\\u003a\\ua21b\\u002e\\U000e0058\\u1732\\U000e002b", + "\\U0001d7f2\\U000e007d\\u0004\\u0589", + "\\u82ab\\u17e8\\u0736\\u2019\\U0001d64d", + "\\u0e01\\ub55c\\u0a68\\U000e0037\\u0cd6\\u002c\\ub959", + "\\U000e0065\\u302c\\uc986\\u09ee\\U000e0068", + "\\u0be8\\u002e\\u0c68\\u066e\\u136d\\ufc99\\u59e7", + "\\u0233\\U000e0020\\u0a69\\u0d6a", + "\\u206f\\u0741\\ub3ab\\u2019\\ubcac\\u2019", + "\\u58f4\\U000e0049\\u20e7\\u2027", + "\\ub315\\U0001d7e5\\U000e0073\\u0c47\\u06f2\\u0c6a\\u0037\\u10fe", + "\\ua183\\u102d\\u0bec\\u003a", + "\\u17e8\\u06e7\\u002e\\u096d\\u003b", + "\\u003a\\u0e57\\u0fad\\u002e", + "\\u002e\\U000e004c\\U0001d7ea\\u05bb\\ud0fd\\u02de", + "\\u32e6\\U0001d7f6\\u0fa1\\u206a\\U000e003c\\u0cec\\u003a", + "\\U000e005d\\u2044\\u0731\\u0650\\u0061", + "\\u003a\\u0664\\u00b7\\u1fba", + "\\u003b\\u0027\\u00b7\\u47a3", + "\\u2027\\U000e0067\\u0a42\\u00b7\\ubddf\\uc26c\\u003a\\u4186\\u041b", + "\\u0027\\u003a\\U0001d70f\\U0001d7df\\ubf4a\\U0001d7f5\\U0001d177\\u003a\\u0e51\\u1058\\U000e0058\\u00b7\\u0673", + "\\uc30d\\u002e\\U000e002c\\u0c48\\u003a\\ub5a1\\u0661\\u002c", + }; + int loop; + if (U_FAILURE(status)) { + errln("Creation of break iterator failed %s", u_errorName(status)); + return; + } + for (loop = 0; loop < (int)(sizeof(strlist) / sizeof(char *)); loop ++) { + // printf("looping %d\n", loop); + u_unescape(strlist[loop], str, 25); + UnicodeString ustr(str); + // RBBICharMonkey monkey; + RBBIWordMonkey monkey; + + int expected[50]; + int expectedcount = 0; + + monkey.setText(ustr); + int i; + for (i = 0; i != BreakIterator::DONE; i = monkey.next(i)) { + expected[expectedcount ++] = i; + } + + testBreakBoundPreceding(this, ustr, bi, expected, expectedcount); + } + delete bi; +#endif +} + +void RBBITest::TestWordBoundary(void) +{ + // <data><>\u1d4a\u206e<?>\u0603\U0001d7ff<>\u2019<></data> + Locale locale("en"); + UErrorCode status = U_ZERO_ERROR; + // BreakIterator *bi = BreakIterator::createCharacterInstance(locale, status); + BreakIterator *bi = BreakIterator::createWordInstance(locale, status); + UChar str[50]; + static const char *strlist[] = + { + "\\u200e\\U000e0072\\u0a4b\\U000e003f\\ufd2b\\u2027\\u002e\\u002e", + "\\U000e0042\\u002e\\u0fb8\\u09ef\\u0ed1\\u2044", + "\\u003b\\u024a\\u102e\\U000e0071\\u0600", + "\\u2027\\U000e0067\\u0a47\\u00b7", + "\\u1fcd\\u002c\\u07aa\\u0027\\u11b0", + "\\u002c\\U000e003c\\U0001d7f4\\u003a\\u0c6f\\u0027", + "\\u0589\\U000e006e\\u0a42\\U000104a5", + "\\u4f66\\ub523\\u003a\\uacae\\U000e0047\\u003a", + "\\u003a\\u0f21\\u0668\\u0dab\\u003a\\u0655\\u00b7", + "\\u0027\\u11af\\U000e0057\\u0602", + "\\U0001d7f2\\U000e007\\u0004\\u0589", + "\\U000e0022\\u003a\\u10b3\\u003a\\ua21b\\u002e\\U000e0058\\u1732\\U000e002b", + "\\U0001d7f2\\U000e007d\\u0004\\u0589", + "\\u82ab\\u17e8\\u0736\\u2019\\U0001d64d", + "\\u0e01\\ub55c\\u0a68\\U000e0037\\u0cd6\\u002c\\ub959", + "\\U000e0065\\u302c\\uc986\\u09ee\\U000e0068", + "\\u0be8\\u002e\\u0c68\\u066e\\u136d\\ufc99\\u59e7", + "\\u0233\\U000e0020\\u0a69\\u0d6a", + "\\u206f\\u0741\\ub3ab\\u2019\\ubcac\\u2019", + "\\u58f4\\U000e0049\\u20e7\\u2027", + "\\ub315\\U0001d7e5\\U000e0073\\u0c47\\u06f2\\u0c6a\\u0037\\u10fe", + "\\ua183\\u102d\\u0bec\\u003a", + "\\u17e8\\u06e7\\u002e\\u096d\\u003b", + "\\u003a\\u0e57\\u0fad\\u002e", + "\\u002e\\U000e004c\\U0001d7ea\\u05bb\\ud0fd\\u02de", + "\\u32e6\\U0001d7f6\\u0fa1\\u206a\\U000e003c\\u0cec\\u003a", + "\\ua2a5\\u0038\\u2044\\u002e\\u0c67\\U000e003c\\u05f4\\u2027\\u05f4\\u2019", + "\\u003a\\u0664\\u00b7\\u1fba", + "\\u003b\\u0027\\u00b7\\u47a3", + }; + int loop; + if (U_FAILURE(status)) { + errln("Creation of break iterator failed %s", u_errorName(status)); + return; + } + for (loop = 0; loop < (int)(sizeof(strlist) / sizeof(char *)); loop ++) { + // printf("looping %d\n", loop); + u_unescape(strlist[loop], str, 20); + UnicodeString ustr(str); + int forward[50]; + int count = 0; + + bi->setText(ustr); + int prev = 0; + int i; + for (i = bi->first(); i != BreakIterator::DONE; i = bi->next()) { + forward[count ++] = i; + if (i > prev) { + int j; + for (j = prev + 1; j < i; j ++) { + if (bi->isBoundary(j)) { + printStringBreaks(ustr, forward, count); + errln("happy boundary test failed: expected %d not a boundary", + j); + return; + } + } + } + if (!bi->isBoundary(i)) { + printStringBreaks(ustr, forward, count); + errln("happy boundary test failed: expected %d a boundary", + i); + return; + } + prev = i; + } + } + delete bi; +} + +void RBBITest::TestLineBreaks(void) +{ +#if !UCONFIG_NO_REGULAR_EXPRESSIONS + Locale locale("en"); + UErrorCode status = U_ZERO_ERROR; + BreakIterator *bi = BreakIterator::createLineInstance(locale, status); + UChar str[50]; + static const char *strlist[] = + { + "\\u0668\\u192b\\u002f\\u2034\\ufe39\\u00b4\\u0cc8\\u2571\\u200b\\u003f", + "\\ufeff\\ufffc\\u3289\\u0085\\u2772\\u0020\\U000e010a\\u0020\\u2025\\u000a\\U000e0123", + "\\ufe3c\\u201c\\u000d\\u2025\\u2007\\u201c\\u002d\\u20a0\\u002d\\u30a7\\u17a4", + "\\u2772\\u0020\\U000e010a\\u0020\\u2025\\u000a\\U000e0123", + "\\u002d\\uff1b\\u02c8\\u2029\\ufeff\\u0f22\\u2044\\ufe09\\u003a\\u096d\\u2009\\u000a\\u06f7\\u02cc\\u1019\\u2060", + "\\u1781\\u0b68\\u0f0c\\u3010\\u0085\\U00011f7a\\u0020\\u0dd6\\u200b\\U000e007a\\u000a\\u2060\\u2026\\u002f\\u2026\\u24dc\\u101e\\u2014\\u2007\\u30a5", + "\\u2770\\u0020\\U000e010f\\u0020\\u2060\\u000a\\u02cc\\u0bcc\\u060d\\u30e7\\u0f3b\\u002f", + "\\ufeff\\u0028\\u003b\\U00012fec\\u2010\\u0020\\u0004\\u200b\\u0020\\u275c\\u002f\\u17b1", + "\\u20a9\\u2014\\u00a2\\u31f1\\u002f\\u0020\\u05b8\\u200b\\u0cc2\\u003b\\u060d\\u02c8\\ua4e8\\u002f\\u17d5", + "\\u002d\\u136f\\uff63\\u0084\\ua933\\u2028\\u002d\\u431b\\u200b\\u20b0", + "\\uade3\\u11d6\\u000a\\U0001107d\\u203a\\u201d\\ub070\\u000d\\u2024\\ufffc", + "\\uff5b\\u101c\\u1806\\u002f\\u2213\\uff5f", + "\\u2014\\u0a83\\ufdfc\\u003f\\u00a0\\u0020\\u000a\\u2991\\U0001d179\\u0020\\u201d\\U000125f6\\u0a67\\u20a7\\ufeff\\u043f", + "\\u169b\\U000e0130\\u002d\\u1041\\u0f3d\\u0abf\\u00b0\\u31fb\\u00a0\\u002d\\u02c8\\u003b", + "\\u2762\\u1680\\u002d\\u2028\\u0027\\u01dc\\ufe56\\u003a\\u000a\\uffe6\\u29fd\\u0020\\u30ee\\u007c\\U0001d178\\u0af1\\u0085", + "\\u3010\\u200b\\u2029\\ufeff\\ufe6a\\u275b\\U000e013b\\ufe37\\u24d4\\u002d\\u1806\\u256a\\u1806\\u247c\\u0085\\u17ac", + "\\u99ab\\u0027\\u003b\\u2026\\ueaf0\\u0020\\u0020\\u0313\\u0020\\u3099\\uff09\\u208e\\u2011\\u2007\\u2060\\u000a\\u0020\\u0020\\u300b\\u0bf9", + "\\u1806\\u060d\\u30f5\\u00b4\\u17e9\\u2544\\u2028\\u2024\\u2011\\u20a3\\u002d\\u09cc\\u1782\\u000d\\uff6f\\u0025", + "\\u002f\\uf22e\\u1944\\ufe3d\\u0020\\u206f\\u31b3\\u2014\\u002d\\u2025\\u0f0c\\u0085\\u2763", + "\\u002f\\u2563\\u202f\\u0085\\u17d5\\u200b\\u0020\\U000e0043\\u2014\\u058a\\u3d0a\\ufe57\\u2035\\u2028\\u2029", + "\\u20ae\\U0001d169\\u9293\\uff1f\\uff1f\\u0021\\u2012\\u2039\\u0085\\u02cc\\u00a2\\u0020\\U000e01ab\\u3085\\u0f3a\\u1806\\u0f0c\\u1945\\u000a\\U0001d7e7", + "\\uffe6\\u00a0\\u200b\\u0085\\u2116\\u255b\\U0001d7f7\\u178c\\ufffc", + "\\u02cc\\ufe6a\\u00a0\\u0021\\u002d\\u7490\\uec2e\\u200b\\u000a", + "\\uec2e\\u200b\\u000a\\u0020\\u2028\\u2014\\u8945", + "\\u7490\\uec2e\\u200b\\u000a\\u0020\\u2028\\u2014", + "\\u0020\\u2028\\u2014\\u8945\\u002c\\u005b", + "\\u000a\\ufe3c\\u201c\\u000d\\u2025\\u2007\\u201c\\u002d\\u20a0", + "\\u2473\\u0e9d\\u0020\\u0085\\u000a\\ufe3c\\u201c\\u000d\\u2025", + "\\U0001d16e\\ufffc\\u2025\\u0021\\u002d", + "\\ufffc\\u301b\\u0fa5\\U000e0103\\u2060\\u208e\\u17d5\\u034f\\u1009\\u003a\\u180e\\u2009\\u3111", + "\\u2014\\u0020\\u000a\\u17c5\\u24fc", + "\\ufffc\\u0020\\u2116\\uff6c\\u200b\\u0ac3\\U0001028f", + "\\uaeb0\\u0344\\u0085\\ufffc\\u073b\\u2010", + "\\ufeff\\u0589\\u0085\\u0eb8\\u30fd\\u002f\\u003a\\u2014\\ufe43", + "\\u09cc\\u256a\\u276d\\u002d\\u3085\\u000d\\u0e05\\u2028\\u0fbb", + "\\u2034\\u00bb\\u0ae6\\u300c\\u0020\\u31f8\\ufffc", + "\\u2116\\u0ed2\\uff64\\u02cd\\u2001\\u2060", + }; + int loop; + if (U_FAILURE(status)) { + errln("Creation of break iterator failed %s", u_errorName(status)); + return; + } + for (loop = 0; loop < (int)(sizeof(strlist) / sizeof(char *)); loop ++) { + // printf("looping %d\n", loop); + u_unescape(strlist[loop], str, 20); + UnicodeString ustr(str); + RBBILineMonkey monkey; + + int expected[50]; + int expectedcount = 0; + + monkey.setText(ustr); + int i; + for (i = 0; i != BreakIterator::DONE; i = monkey.next(i)) { + expected[expectedcount ++] = i; + } + + testBreakBoundPreceding(this, ustr, bi, expected, expectedcount); + } + delete bi; +#endif +} + +void RBBITest::TestSentBreaks(void) +{ + Locale locale("en"); + UErrorCode status = U_ZERO_ERROR; + BreakIterator *bi = BreakIterator::createSentenceInstance(locale, status); + UChar str[100]; + static const char *strlist[] = + { + "Now\ris\nthe\r\ntime\n\rfor\r\r", + "This\n", + "Hello! how are you? I'am fine. Thankyou. How are you doing? This\n costs $20,00,000.", + "\"Sentence ending with a quote.\" Bye.", + " (This is it). Testing the sentence iterator. \"This isn't it.\"", + "Hi! This is a simple sample sentence. (This is it.) This is a simple sample sentence. \"This isn't it.\"", + "Hi! This is a simple sample sentence. It does not have to make any sense as you can see. ", + "Nel mezzo del cammin di nostra vita, mi ritrovai in una selva oscura. ", + "Che la dritta via aveo smarrita. He said, that I said, that you said!! ", + "Don't rock the boat.\\u2029Because I am the daddy, that is why. Not on my time (el timo.)!", + }; + int loop; + int forward[100]; + if (U_FAILURE(status)) { + errln("Creation of break iterator failed %s", u_errorName(status)); + return; + } + for (loop = 0; loop < (int)(sizeof(strlist) / sizeof(char *)); loop ++) { + u_unescape(strlist[loop], str, 100); + UnicodeString ustr(str); + + int count = 0; + bi->setText(ustr); + int i; + for (i = bi->first(); i != BreakIterator::DONE; i = bi->next()) { + forward[count ++] = i; + } + testBreakBoundPreceding(this, ustr, bi, forward, count); + } + delete bi; +} + +void RBBITest::TestMonkey(char *params) { +#if !UCONFIG_NO_REGULAR_EXPRESSIONS + + UErrorCode status = U_ZERO_ERROR; + int32_t loopCount = 500; + int32_t seed = 1; + UnicodeString breakType = "all"; + Locale locale("en"); + + if (quick == FALSE) { + loopCount = 10000; + } + + if (params) { + UnicodeString p(params); + loopCount = getIntParam("loop", p, loopCount); + seed = getIntParam("seed", p, seed); + + RegexMatcher m(" *type *= *(char|word|line|sent|title) *", p, 0, status); + if (m.find()) { + breakType = m.group(1, status); + m.reset(); + p = m.replaceFirst("", status); + } + + m.reset(p); + if (RegexMatcher("\\S", p, 0, status).find()) { + // Each option is stripped out of the option string as it is processed. + // All options have been checked. The option string should have been completely emptied.. + char buf[100]; + p.extract(buf, sizeof(buf), NULL, status); + buf[sizeof(buf)-1] = 0; + errln("Unrecognized or extra parameter: %s\n", buf); + return; + } + + } + + if (breakType == "char" || breakType == "all") { + RBBICharMonkey m; + BreakIterator *bi = BreakIterator::createCharacterInstance(locale, status); + if (U_SUCCESS(status)) { + RunMonkey(bi, m, "char", seed, loopCount); + } + else { + errln("Creation of character break iterator failed %s", u_errorName(status)); + } + delete bi; + } + + if (breakType == "word" || breakType == "all") { + logln("Word Break Monkey Test"); + RBBIWordMonkey m; + BreakIterator *bi = BreakIterator::createWordInstance(locale, status); + if (U_SUCCESS(status)) { + RunMonkey(bi, m, "word", seed, loopCount); + } + else { + errln("Creation of word break iterator failed %s", u_errorName(status)); + } + delete bi; + } + + if (breakType == "line" || breakType == "all") { + logln("Line Break Monkey Test"); + RBBILineMonkey m; + BreakIterator *bi = BreakIterator::createLineInstance(locale, status); + if (params == NULL) { + loopCount = 50; + } + if (U_SUCCESS(status)) { + RunMonkey(bi, m, "line", seed, loopCount); + } + else { + errln("Creation of line break iterator failed %s", u_errorName(status)); + } + delete bi; + } + + +#endif +} + +// +// Run a RBBI monkey test. Common routine, for all break iterator types. +// Parameters: +// bi - the break iterator to use +// mk - MonkeyKind, abstraction for obtaining expected results +// name - Name of test (char, word, etc.) for use in error messages +// seed - Seed for starting random number generator (parameter from user) +// numIterations +// +void RBBITest::RunMonkey(BreakIterator *bi, RBBIMonkeyKind &mk, const char *name, uint32_t seed, int32_t numIterations) { + +#if !UCONFIG_NO_REGULAR_EXPRESSIONS + + const int32_t TESTSTRINGLEN = 500; + UnicodeString testText; + int32_t numCharClasses; + UVector *chClasses; + int expected[TESTSTRINGLEN*2 + 1]; + int expectedCount = 0; + char expectedBreaks[TESTSTRINGLEN*2 + 1]; + char forwardBreaks[TESTSTRINGLEN*2 + 1]; + char reverseBreaks[TESTSTRINGLEN*2+1]; + char isBoundaryBreaks[TESTSTRINGLEN*2+1]; + char followingBreaks[TESTSTRINGLEN*2+1]; + char precedingBreaks[TESTSTRINGLEN*2+1]; + int i; + int loopCount = 0; + + m_seed = seed; + + numCharClasses = mk.charClasses()->size(); + chClasses = mk.charClasses(); + + // Check for errors that occured during the construction of the MonkeyKind object. + // Can't report them where they occured because errln() is a method coming from intlTest, + // and is not visible outside of RBBITest :-( + if (U_FAILURE(mk.deferredStatus)) { + errln("status of \"%s\" in creation of RBBIMonkeyKind.", u_errorName(mk.deferredStatus)); + return; + } + + // Verify that the character classes all have at least one member. + for (i=0; i<numCharClasses; i++) { + UnicodeSet *s = (UnicodeSet *)chClasses->elementAt(i); + if (s == NULL || s->size() == 0) { + errln("Character Class #%d is null or of zero size.", i); + return; + } + } + + while (loopCount < numIterations || numIterations == -1) { + if (numIterations == -1 && loopCount % 10 == 0) { + // If test is running in an infinite loop, display a periodic tic so + // we can tell that it is making progress. + fprintf(stderr, "."); + } + // Save current random number seed, so that we can recreate the random numbers + // for this loop iteration in event of an error. + seed = m_seed; + + // Populate a test string with data. + testText.truncate(0); + for (i=0; i<TESTSTRINGLEN; i++) { + int32_t aClassNum = m_rand() % numCharClasses; + UnicodeSet *classSet = (UnicodeSet *)chClasses->elementAt(aClassNum); + int32_t charIdx = m_rand() % classSet->size(); + UChar32 c = classSet->charAt(charIdx); + if (c < 0) { // TODO: deal with sets containing strings. + errln("c < 0"); + } + testText.append(c); + } + + // Calculate the expected results for this test string. + mk.setText(testText); + memset(expectedBreaks, 0, sizeof(expectedBreaks)); + expectedBreaks[0] = 1; + int32_t breakPos = 0; + expectedCount = 0; + for (;;) { + breakPos = mk.next(breakPos); + if (breakPos == -1) { + break; + } + if (breakPos > testText.length()) { + errln("breakPos > testText.length()"); + } + expectedBreaks[breakPos] = 1; + expected[expectedCount ++] = breakPos; + } + + // Find the break positions using forward iteration + memset(forwardBreaks, 0, sizeof(forwardBreaks)); + bi->setText(testText); + for (i=bi->first(); i != BreakIterator::DONE; i=bi->next()) { + if (i < 0 || i > testText.length()) { + errln("%s break monkey test: Out of range value returned by breakIterator::next()", name); + break; + } + forwardBreaks[i] = 1; + } + + // Find the break positions using reverse iteration + memset(reverseBreaks, 0, sizeof(reverseBreaks)); + for (i=bi->last(); i != BreakIterator::DONE; i=bi->previous()) { + if (i < 0 || i > testText.length()) { + errln("%s break monkey test: Out of range value returned by breakIterator::next()", name); + break; + } + reverseBreaks[i] = 1; + } + + // Find the break positions using isBoundary() tests. + memset(isBoundaryBreaks, 0, sizeof(isBoundaryBreaks)); + U_ASSERT(sizeof(isBoundaryBreaks) > testText.length()); + for (i=0; i<=testText.length(); i++) { + isBoundaryBreaks[i] = bi->isBoundary(i); + } + + + // Find the break positions using the following() function. + // printf("."); + memset(followingBreaks, 0, sizeof(followingBreaks)); + int32_t lastBreakPos = 0; + followingBreaks[0] = 1; + for (i=0; i<testText.length(); i++) { + breakPos = bi->following(i); + if (breakPos <= i || + breakPos < lastBreakPos || + breakPos > testText.length() || + breakPos > lastBreakPos && lastBreakPos > i ) { + errln("%s break monkey test: " + "Out of range value returned by BreakIterator::following().\n" + "Random seed=%d", name, seed); + break; + } + followingBreaks[breakPos] = 1; + lastBreakPos = breakPos; + } + + // Find the break positions using the preceding() function. + memset(precedingBreaks, 0, sizeof(followingBreaks)); + lastBreakPos = testText.length(); + precedingBreaks[testText.length()] = 1; + for (i=testText.length(); i>0; i--) { + breakPos = bi->preceding(i); + if (breakPos >= i || + breakPos > lastBreakPos || + breakPos < 0 || + breakPos < lastBreakPos && lastBreakPos < i ) { + errln("%s break monkey test: " + "Out of range value returned by BreakIterator::preceding().\n" + "index=%d; prev returned %d; lastBreak=%d" , + name, i, breakPos, lastBreakPos); + precedingBreaks[i] = 2; // Forces an error. + } else { + precedingBreaks[breakPos] = 1; + lastBreakPos = breakPos; + } + } + + // Compare the expected and actual results. + for (i=0; i<=testText.length(); i++) { + const char *errorType = NULL; + if (forwardBreaks[i] != expectedBreaks[i]) { + errorType = "next()"; + } else if (reverseBreaks[i] != forwardBreaks[i]) { + errorType = "previous()"; + } else if (isBoundaryBreaks[i] != expectedBreaks[i]) { + errorType = "isBoundary()"; + } else if (followingBreaks[i] != expectedBreaks[i]) { + errorType = "following()"; + } else if (precedingBreaks[i] != expectedBreaks[i]) { + errorType = "preceding()"; + } + + + if (errorType != NULL) { + // Format a range of the test text that includes the failure as + // a data item that can be included in the rbbi test data file. + + // Start of the range is the last point where expected and actual results + // both agreed that there was a break position. + int startContext = i; + int32_t count = 0; + for (;;) { + if (startContext==0) { break; } + startContext --; + if (expectedBreaks[startContext] != 0) { + if (count == 2) break; + count ++; + } + } + + // End of range is two expected breaks past the start position. + int endContext = i + 1; + int ci; + for (ci=0; ci<2; ci++) { // Number of items to include in error text. + for (;;) { + if (endContext >= testText.length()) {break;} + if (expectedBreaks[endContext-1] != 0) { + if (count == 0) break; + count --; + } + endContext ++; + } + } + + // Format looks like "<data><>\uabcd\uabcd<>\U0001abcd...</data>" + UnicodeString errorText = "<data>"; + /***if (strcmp(errorType, "next()") == 0) { + startContext = 0; + endContext = testText.length(); + + printStringBreaks(testText, expected, expectedCount); + }***/ + + for (ci=startContext; ci<endContext;) { + UnicodeString hexChars("0123456789abcdef"); + UChar32 c; + int bn; + c = testText.char32At(ci); + if (ci == i) { + // This is the location of the error. + errorText.append("<?>"); + } else if (expectedBreaks[ci] != 0) { + // This a non-error expected break position. + errorText.append("<>"); + } + if (c < 0x10000) { + errorText.append("\\u"); + for (bn=12; bn>=0; bn-=4) { + errorText.append(hexChars.charAt((c>>bn)&0xf)); + } + } else { + errorText.append("\\U"); + for (bn=28; bn>=0; bn-=4) { + errorText.append(hexChars.charAt((c>>bn)&0xf)); + } + } + ci = testText.moveIndex32(ci, 1); + } + errorText.append("<>"); + errorText.append("</data>\n"); + + // Output the error + char charErrorTxt[500]; + UErrorCode status = U_ZERO_ERROR; + errorText.extract(charErrorTxt, sizeof(charErrorTxt), NULL, status); + charErrorTxt[sizeof(charErrorTxt)-1] = 0; + errln("%s break monkey test error. %s. Operation = %s; Random seed = %d; buf Idx = %d\n%s", + name, (expectedBreaks[i]? "break expected but not found" : "break found but not expected"), + errorType, seed, i, charErrorTxt); + break; + } + } + + loopCount++; + } +#endif +} + + +#endif /* #if !UCONFIG_NO_BREAK_ITERATION */ diff --git a/icuSources/test/intltest/rbbitst.h b/icuSources/test/intltest/rbbitst.h index e67b4400..51ded0fd 100644 --- a/icuSources/test/intltest/rbbitst.h +++ b/icuSources/test/intltest/rbbitst.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1999-2003, International Business Machines Corporation and + * Copyright (c) 1999-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /************************************************************************ @@ -70,8 +70,12 @@ public: UChar *ReadAndConvertFile(const char *fileName, int &ulen, UErrorCode &status); void executeTest(TestParams *); - - + void TestWordBreaks(); + void TestWordBoundary(); + void TestLineBreaks(); + void TestSentBreaks(); + void TestBug3818(); + void TestJapaneseWordBreak(); /***********************/ @@ -117,7 +121,7 @@ private: void doBreakInvariantTest(BreakIterator& tb, UnicodeString& testChars); void doOtherInvariantTest(BreakIterator& tb, UnicodeString& testChars); - void RunMonkey(BreakIterator *bi, RBBIMonkeyKind &mk, uint32_t seed, int32_t loopCount); + void RunMonkey(BreakIterator *bi, RBBIMonkeyKind &mk, const char *name, uint32_t seed, int32_t loopCount); }; diff --git a/icuSources/test/intltest/regextst.cpp b/icuSources/test/intltest/regextst.cpp index 2b12fe3d..343ec785 100644 --- a/icuSources/test/intltest/regextst.cpp +++ b/icuSources/test/intltest/regextst.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 2002-2003, International Business Machines Corporation and + * Copyright (c) 2002-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -10,17 +10,18 @@ // ICU Regular Expressions test, part of intltest. // -#include "unicode/utypes.h" +#include "intltest.h" #if !UCONFIG_NO_REGULAR_EXPRESSIONS +#include "unicode/regex.h" #include "unicode/uchar.h" #include "unicode/ucnv.h" -#include "intltest.h" #include "regextst.h" #include "uvector.h" -#include "stdlib.h" #include "charstr.h" #include "util.h" +#include <stdlib.h> +#include <stdio.h> //--------------------------------------------------------------------------- @@ -28,7 +29,7 @@ // Test class boilerplate // //--------------------------------------------------------------------------- -RegexTest::RegexTest() +RegexTest::RegexTest() { }; @@ -45,29 +46,29 @@ void RegexTest::runIndexedTest( int32_t index, UBool exec, const char* &name, ch switch (index) { case 0: name = "Basic"; - if (exec) Basic(); + if (exec) Basic(); break; case 1: name = "API_Match"; - if (exec) API_Match(); + if (exec) API_Match(); break; case 2: name = "API_Replace"; - if (exec) API_Replace(); + if (exec) API_Replace(); break; case 3: name = "API_Pattern"; - if (exec) API_Pattern(); + if (exec) API_Pattern(); break; case 4: name = "Extended"; - if (exec) Extended(); + if (exec) Extended(); break; case 5: name = "Errors"; - if (exec) Errors(); + if (exec) Errors(); break; case 6: name = "PerlTests"; if (exec) PerlTests(); break; - default: name = ""; + default: name = ""; break; //needed to end loop } } @@ -105,7 +106,7 @@ if (status!=errcode) {errln("RegexTest failure at line %d. Expected status=%s, // // The expected results are UBool - TRUE or FALSE. // The input text is unescaped. The pattern is not. -// +// // //--------------------------------------------------------------------------- @@ -127,7 +128,7 @@ UBool RegexTest::doRegexLMTest(const char *pat, const char *text, UBool looking, line, u_errorName(status)); return FALSE; } - if (line==376) { REPattern->dump();} + if (line==376) { RegexPatternDump(REPattern);} UnicodeString inputString(inputText); UnicodeString unEscapedInput = inputString.unescape(); @@ -137,7 +138,7 @@ UBool RegexTest::doRegexLMTest(const char *pat, const char *text, UBool looking, line, u_errorName(status)); return FALSE; } - + UBool actualmatch; actualmatch = REMatcher->lookingAt(status); if (U_FAILURE(status)) { @@ -163,14 +164,14 @@ UBool RegexTest::doRegexLMTest(const char *pat, const char *text, UBool looking, } if (retVal == FALSE) { - REPattern->dump(); + RegexPatternDump(REPattern); } delete REPattern; delete REMatcher; return retVal; } - + @@ -184,8 +185,8 @@ UBool RegexTest::doRegexLMTest(const char *pat, const char *text, UBool looking, // The input text is marked with the expected match positions // <0>text <1> more text </1> </0> // The <n> </n> tags are removed before trying the match. -// The tags mark the start and end of the match and of any capture groups. -// +// The tags mark the start and end of the match and of any capture groups. +// // //--------------------------------------------------------------------------- @@ -204,8 +205,8 @@ static void set(UVector &vec, int val, UnicodeString index) { while (vec.size()<idx+1) {vec.addElement(-1, status);} vec.setElementAt(val, idx); } - -void RegexTest::regex_find(const UnicodeString &pattern, + +void RegexTest::regex_find(const UnicodeString &pattern, const UnicodeString &flags, const UnicodeString &inputString, int line) { @@ -220,35 +221,58 @@ void RegexTest::regex_find(const UnicodeString &pattern, RegexMatcher *matcher = NULL; UVector groupStarts(status); UVector groupEnds(status); - UBool isMatch; + UBool isMatch = FALSE; UBool failed = FALSE; + int numFinds; + int i; // // Compile the caller's pattern // uint32_t bflags = 0; - if (flags.indexOf((UChar)0x69) >= 0) { // 'i' flag + if (flags.indexOf((UChar)0x69) >= 0) { // 'i' flag bflags |= UREGEX_CASE_INSENSITIVE; } - if (flags.indexOf((UChar)0x78) >= 0) { // 'x' flag + if (flags.indexOf((UChar)0x78) >= 0) { // 'x' flag bflags |= UREGEX_COMMENTS; } - if (flags.indexOf((UChar)0x73) >= 0) { // 's' flag + if (flags.indexOf((UChar)0x73) >= 0) { // 's' flag bflags |= UREGEX_DOTALL; } - if (flags.indexOf((UChar)0x6d) >= 0) { // 'm' flag + if (flags.indexOf((UChar)0x6d) >= 0) { // 'm' flag bflags |= UREGEX_MULTILINE; } callerPattern = RegexPattern::compile(pattern, bflags, pe, status); if (status != U_ZERO_ERROR) { + #if UCONFIG_NO_BREAK_ITERATION==1 + // 'v' test flag means that the test pattern should not compile if ICU was configured + // to not include break iteration. RBBI is needed for Unicode word boundaries. + if (flags.indexOf((UChar)0x76) >= 0 /*'v'*/ && status == U_UNSUPPORTED_ERROR) { + goto cleanupAndReturn; + } + #endif errln("Line %d: error %s compiling pattern.", line, u_errorName(status)); goto cleanupAndReturn; } if (flags.indexOf((UChar)'d') >= 0) { - callerPattern->dump(); + RegexPatternDump(callerPattern); + } + + // + // Number of times find() should be called on the test string, default to 1 + // + numFinds = 1; + for (i=2; i<=9; i++) { + if (flags.indexOf((UChar)(0x30 + i)) >= 0) { // digit flag + if (numFinds != 1) { + errln("Line %d: more than one digit flag. Scanning %d.", line, i); + goto cleanupAndReturn; + } + numFinds = i; + } } // @@ -257,7 +281,7 @@ void RegexTest::regex_find(const UnicodeString &pattern, // parsePat = RegexPattern::compile("<(/?)([0-9]+)>", 0, pe, status); REGEX_CHECK_STATUS_L(line); - + unEscapedInput = inputString.unescape(); parseMatcher = parsePat->matcher(unEscapedInput, status); REGEX_CHECK_STATUS_L(line); @@ -285,7 +309,9 @@ void RegexTest::regex_find(const UnicodeString &pattern, matcher->setTrace(TRUE); } - isMatch = matcher->find(); + for (i=0; i<numFinds; i++) { + isMatch = matcher->find(); + } matcher->setTrace(FALSE); // @@ -308,10 +334,9 @@ void RegexTest::regex_find(const UnicodeString &pattern, errln("Error at line %d: No match expected, but one found.\n", line); failed = TRUE; } - goto cleanupAndReturn; + goto cleanupAndReturn; } - - int i; + for (i=0; i<=matcher->groupCount(); i++) { int32_t expectedStart = (i >= groupStarts.size()? -1 : groupStarts.elementAti(i)); if (matcher->start(i, status) != expectedStart) { @@ -330,16 +355,16 @@ void RegexTest::regex_find(const UnicodeString &pattern, } } if ( matcher->groupCount()+1 < groupStarts.size()) { - errln("Error at line %d: Expected %d capture groups, found %d.", + errln("Error at line %d: Expected %d capture groups, found %d.", line, groupStarts.size()-1, matcher->groupCount()); failed = TRUE; } - + cleanupAndReturn: if (failed) { - errln("\"%s\" %s \"%s\"", (const char *)CharString(pattern), - (const char *)CharString(flags), - (const char *)CharString(inputString)); + errln("\"%s\" %s \"%s\"", (const char *)CharString(pattern, 0), + (const char *)CharString(flags, 0), + (const char *)CharString(inputString, 0)); // callerPattern->dump(); } delete parseMatcher; @@ -347,7 +372,7 @@ cleanupAndReturn: delete matcher; delete callerPattern; } - + @@ -525,23 +550,23 @@ void RegexTest::Basic() { // Escape sequences that become single literal chars, handled internally // by ICU's Unescape. // - + // REGEX_TESTLM("\101\142", "Ab", TRUE, TRUE); // Octal TODO: not implemented yet. REGEX_TESTLM("\\a", "\\u0007", TRUE, TRUE); // BEL - REGEX_TESTLM("\\cL", "\\u000c", TRUE, TRUE); // Control-L - REGEX_TESTLM("\\e", "\\u001b", TRUE, TRUE); // Escape + REGEX_TESTLM("\\cL", "\\u000c", TRUE, TRUE); // Control-L + REGEX_TESTLM("\\e", "\\u001b", TRUE, TRUE); // Escape REGEX_TESTLM("\\f", "\\u000c", TRUE, TRUE); // Form Feed REGEX_TESTLM("\\n", "\\u000a", TRUE, TRUE); // new line REGEX_TESTLM("\\r", "\\u000d", TRUE, TRUE); // CR REGEX_TESTLM("\\t", "\\u0009", TRUE, TRUE); // Tab - REGEX_TESTLM("\\u1234", "\\u1234", TRUE, TRUE); - REGEX_TESTLM("\\U00001234", "\\u1234", TRUE, TRUE); + REGEX_TESTLM("\\u1234", "\\u1234", TRUE, TRUE); + REGEX_TESTLM("\\U00001234", "\\u1234", TRUE, TRUE); REGEX_TESTLM(".*\\Ax", "xyz", TRUE, FALSE); // \A matches only at the beginning of input REGEX_TESTLM(".*\\Ax", " xyz", FALSE, FALSE); // \A matches only at the beginning of input // Escape of special chars in patterns - REGEX_TESTLM("\\\\\\|\\(\\)\\[\\{\\~\\$\\*\\+\\?\\.", "\\\\|()[{~$*+?.", TRUE, TRUE); + REGEX_TESTLM("\\\\\\|\\(\\)\\[\\{\\~\\$\\*\\+\\?\\.", "\\\\|()[{~$*+?.", TRUE, TRUE); }; @@ -549,7 +574,7 @@ void RegexTest::Basic() { //--------------------------------------------------------------------------- // -// API_Match Test that the API for class RegexMatcher +// API_Match Test that the API for class RegexMatcher // is present and nominally working, but excluding functions // implementing replace operations. // @@ -576,18 +601,18 @@ void RegexTest::API_Match() { RegexPattern *pat2; pat2 = RegexPattern::compile(re, flags, pe, status); REGEX_CHECK_STATUS; - + UnicodeString inStr1 = "abcdef this is a test"; UnicodeString instr2 = "not abc"; UnicodeString empty = ""; - - + + // // Matcher creation and reset. // RegexMatcher *m1 = pat2->matcher(inStr1, status); REGEX_CHECK_STATUS; - REGEX_ASSERT(m1->lookingAt(status) == TRUE); + REGEX_ASSERT(m1->lookingAt(status) == TRUE); REGEX_ASSERT(m1->input() == inStr1); m1->reset(instr2); REGEX_ASSERT(m1->lookingAt(status) == FALSE); @@ -599,13 +624,98 @@ void RegexTest::API_Match() { REGEX_ASSERT(m1->lookingAt(status) == FALSE); REGEX_ASSERT(m1->input() == empty); REGEX_ASSERT(&m1->pattern() == pat2); + + // + // reset(pos, status) + // + m1->reset(inStr1); + m1->reset(4, status); + REGEX_CHECK_STATUS; + REGEX_ASSERT(m1->input() == inStr1); + REGEX_ASSERT(m1->lookingAt(status) == TRUE); + + m1->reset(-1, status); + REGEX_ASSERT(status == U_INDEX_OUTOFBOUNDS_ERROR); + status = U_ZERO_ERROR; + + m1->reset(0, status); + REGEX_CHECK_STATUS; + status = U_ZERO_ERROR; + + int32_t len = m1->input().length(); + m1->reset(len-1, status); + REGEX_CHECK_STATUS; + status = U_ZERO_ERROR; + + m1->reset(len, status); + REGEX_ASSERT(status == U_INDEX_OUTOFBOUNDS_ERROR); + status = U_ZERO_ERROR; + + // + // match(pos, status) + // + m1->reset(instr2); + REGEX_ASSERT(m1->matches(4, status) == TRUE); + m1->reset(); + REGEX_ASSERT(m1->matches(3, status) == FALSE); + m1->reset(); + REGEX_ASSERT(m1->matches(5, status) == FALSE); + REGEX_ASSERT(m1->matches(4, status) == TRUE); + REGEX_ASSERT(m1->matches(-1, status) == FALSE); + REGEX_ASSERT(status == U_INDEX_OUTOFBOUNDS_ERROR); + + // Match() at end of string should fail, but should not + // be an error. + status = U_ZERO_ERROR; + len = m1->input().length(); + REGEX_ASSERT(m1->matches(len, status) == FALSE); + REGEX_CHECK_STATUS; + + // Match beyond end of string should fail with an error. + status = U_ZERO_ERROR; + REGEX_ASSERT(m1->matches(len+1, status) == FALSE); + REGEX_ASSERT(status == U_INDEX_OUTOFBOUNDS_ERROR); + + // Successful match at end of string. + { + status = U_ZERO_ERROR; + RegexMatcher m("A?", 0, status); // will match zero length string. + REGEX_CHECK_STATUS; + m.reset(inStr1); + len = inStr1.length(); + REGEX_ASSERT(m.matches(len, status) == TRUE); + REGEX_CHECK_STATUS; + m.reset(empty); + REGEX_ASSERT(m.matches(0, status) == TRUE); + REGEX_CHECK_STATUS; + } + + + // + // lookingAt(pos, status) + // + status = U_ZERO_ERROR; + m1->reset(instr2); // "not abc" + REGEX_ASSERT(m1->lookingAt(4, status) == TRUE); + REGEX_ASSERT(m1->lookingAt(5, status) == FALSE); + REGEX_ASSERT(m1->lookingAt(3, status) == FALSE); + REGEX_ASSERT(m1->lookingAt(4, status) == TRUE); + REGEX_ASSERT(m1->lookingAt(-1, status) == FALSE); + REGEX_ASSERT(status == U_INDEX_OUTOFBOUNDS_ERROR); + status = U_ZERO_ERROR; + len = m1->input().length(); + REGEX_ASSERT(m1->lookingAt(len, status) == FALSE); + REGEX_CHECK_STATUS; + REGEX_ASSERT(m1->lookingAt(len+1, status) == FALSE); + REGEX_ASSERT(status == U_INDEX_OUTOFBOUNDS_ERROR); + delete m1; delete pat2; } // - // Capture Group. + // Capture Group. // RegexMatcher::start(); // RegexMatcher::end(); // RegexMatcher::groupCount(); @@ -619,10 +729,10 @@ void RegexTest::API_Match() { RegexPattern *pat = RegexPattern::compile(re, flags, pe, status); REGEX_CHECK_STATUS; UnicodeString data = "0123456789"; - + RegexMatcher *matcher = pat->matcher(data, status); REGEX_CHECK_STATUS; - REGEX_ASSERT(matcher->lookingAt(status) == TRUE); + REGEX_ASSERT(matcher->lookingAt(status) == TRUE); int matchStarts[] = {0, 2, 4, 8}; int matchEnds[] = {10, 8, 6, 10}; int i; @@ -679,7 +789,7 @@ void RegexTest::API_Match() { REGEX_CHECK_STATUS; UnicodeString data = ".abc..abc...abc.."; // 012345678901234567 - + RegexMatcher *matcher = pat->matcher(data, status); REGEX_CHECK_STATUS; REGEX_ASSERT(matcher->find()); @@ -705,11 +815,13 @@ void RegexTest::API_Match() { REGEX_ASSERT(matcher->start(status) == 12); REGEX_ASSERT(matcher->find(13, status) == FALSE); REGEX_ASSERT(matcher->find(16, status) == FALSE); + REGEX_ASSERT(matcher->find(17, status) == FALSE); REGEX_ASSERT_FAIL(matcher->start(status), U_REGEX_INVALID_STATE); - REGEX_CHECK_STATUS; + status = U_ZERO_ERROR; REGEX_ASSERT_FAIL(matcher->find(-1, status), U_INDEX_OUTOFBOUNDS_ERROR); - REGEX_ASSERT_FAIL(matcher->find(17, status), U_INDEX_OUTOFBOUNDS_ERROR); + status = U_ZERO_ERROR; + REGEX_ASSERT_FAIL(matcher->find(18, status), U_INDEX_OUTOFBOUNDS_ERROR); REGEX_ASSERT(matcher->groupCount() == 0); @@ -731,17 +843,17 @@ void RegexTest::API_Match() { REGEX_CHECK_STATUS; UnicodeString data = ".abcabc.abc.."; // 012345678901234567 - + RegexMatcher *matcher = pat->matcher(data, status); REGEX_CHECK_STATUS; REGEX_ASSERT(matcher->find()); REGEX_ASSERT(matcher->start(status) == 0); - REGEX_ASSERT(matcher->start(1, status) == -1); + REGEX_ASSERT(matcher->start(1, status) == -1); REGEX_ASSERT(matcher->start(2, status) == 1); REGEX_ASSERT(matcher->find()); REGEX_ASSERT(matcher->start(status) == 4); - REGEX_ASSERT(matcher->start(1, status) == 4); + REGEX_ASSERT(matcher->start(1, status) == 4); REGEX_ASSERT(matcher->start(2, status) == -1); REGEX_CHECK_STATUS; @@ -749,6 +861,61 @@ void RegexTest::API_Match() { delete pat; } + // + // find with zero length matches, match position should bump ahead + // to prevent loops. + // + { + int i; + UErrorCode status=U_ZERO_ERROR; + RegexMatcher m("(?= ?)", 0, status); // This pattern will zero-length matches anywhere, + // using an always-true look-ahead. + REGEX_CHECK_STATUS; + UnicodeString s(" "); + m.reset(s); + for (i=0; ; i++) { + if (m.find() == FALSE) { + break; + } + REGEX_ASSERT(m.start(status) == i); + REGEX_ASSERT(m.end(status) == i); + } + REGEX_ASSERT(i==5); + + // Check that the bump goes over surrogate pairs OK + s = "\\U00010001\\U00010002\\U00010003\\U00010004"; + s = s.unescape(); + m.reset(s); + for (i=0; ; i+=2) { + if (m.find() == FALSE) { + break; + } + REGEX_ASSERT(m.start(status) == i); + REGEX_ASSERT(m.end(status) == i); + } + REGEX_ASSERT(i==10); + } + { + // find() loop breaking test. + // with pattern of /.?/, should see a series of one char matches, then a single + // match of zero length at the end of the input string. + int i; + UErrorCode status=U_ZERO_ERROR; + RegexMatcher m(".?", 0, status); + REGEX_CHECK_STATUS; + UnicodeString s(" "); + m.reset(s); + for (i=0; ; i++) { + if (m.find() == FALSE) { + break; + } + REGEX_ASSERT(m.start(status) == i); + REGEX_ASSERT(m.end(status) == (i<4 ? i+1 : i)); + } + REGEX_ASSERT(i==5); + } + + // // Matchers with no input string behave as if they had an empty input string. // @@ -766,13 +933,33 @@ void RegexTest::API_Match() { RegexPattern *p = RegexPattern::compile(".", 0, status); RegexMatcher *m = p->matcher(status); REGEX_CHECK_STATUS; - + REGEX_ASSERT(m->find() == FALSE); REGEX_ASSERT(m->input() == ""); delete m; delete p; } + // + // Compilation error on reset with UChar * + // These were a hazard that people were stumbling over with runtime errors. + // Changed them to compiler errors by adding private methods that more closely + // matched the incorrect use of the functions. + // +#if 0 + { + UErrorCode status = U_ZERO_ERROR; + UChar ucharString[20]; + RegexMatcher m(".", 0, status); + m.reset(ucharString); // should not compile. + + RegexPattern *p = RegexPattern::compile(".", 0, status); + RegexMatcher *m2 = p->matcher(ucharString, status); // should not compile. + + RegexMatcher m3(".", ucharString, 0, status); // Should not compile + } +#endif + } @@ -782,7 +969,7 @@ void RegexTest::API_Match() { //--------------------------------------------------------------------------- // -// API_Replace API test for class RegexMatcher, testing the +// API_Replace API test for class RegexMatcher, testing the // Replace family of functions. // //--------------------------------------------------------------------------- @@ -793,14 +980,14 @@ void RegexTest::API_Replace() { int32_t flags=0; UParseError pe; UErrorCode status=U_ZERO_ERROR; - + UnicodeString re("abc"); RegexPattern *pat = RegexPattern::compile(re, flags, pe, status); REGEX_CHECK_STATUS; UnicodeString data = ".abc..abc...abc.."; // 012345678901234567 RegexMatcher *matcher = pat->matcher(data, status); - + // // Plain vanilla matches. // @@ -808,11 +995,11 @@ void RegexTest::API_Replace() { dest = matcher->replaceFirst("yz", status); REGEX_CHECK_STATUS; REGEX_ASSERT(dest == ".yz..abc...abc.."); - + dest = matcher->replaceAll("yz", status); REGEX_CHECK_STATUS; REGEX_ASSERT(dest == ".yz..yz...yz.."); - + // // Plain vanilla non-matches. // @@ -821,11 +1008,11 @@ void RegexTest::API_Replace() { dest = matcher->replaceFirst("yz", status); REGEX_CHECK_STATUS; REGEX_ASSERT(dest == ".abx..abx...abx.."); - + dest = matcher->replaceAll("yz", status); REGEX_CHECK_STATUS; REGEX_ASSERT(dest == ".abx..abx...abx.."); - + // // Empty source string // @@ -834,11 +1021,11 @@ void RegexTest::API_Replace() { dest = matcher->replaceFirst("yz", status); REGEX_CHECK_STATUS; REGEX_ASSERT(dest == ""); - + dest = matcher->replaceAll("yz", status); REGEX_CHECK_STATUS; REGEX_ASSERT(dest == ""); - + // // Empty substitution string // @@ -846,24 +1033,24 @@ void RegexTest::API_Replace() { dest = matcher->replaceFirst("", status); REGEX_CHECK_STATUS; REGEX_ASSERT(dest == "...abc...abc.."); - + dest = matcher->replaceAll("", status); REGEX_CHECK_STATUS; REGEX_ASSERT(dest == "........"); - + // // match whole string // UnicodeString d4 = "abc"; - matcher->reset(d4); + matcher->reset(d4); dest = matcher->replaceFirst("xyz", status); REGEX_CHECK_STATUS; REGEX_ASSERT(dest == "xyz"); - + dest = matcher->replaceAll("xyz", status); REGEX_CHECK_STATUS; REGEX_ASSERT(dest == "xyz"); - + // // Capture Group, simple case // @@ -890,14 +1077,76 @@ void RegexTest::API_Replace() { dest = matcher2->replaceFirst(replacement, status); REGEX_CHECK_STATUS; REGEX_ASSERT(dest == "Supplemental Digit 1 bc.defg"); - + REGEX_ASSERT_FAIL(matcher2->replaceFirst("bad capture group number $5...",status), U_INDEX_OUTOFBOUNDS_ERROR); - - - + + + // + // Replacement String with \u hex escapes + // + { + UnicodeString src = "abc 1 abc 2 abc 3"; + UnicodeString substitute = "--\\u0043--"; + matcher->reset(src); + UnicodeString result = matcher->replaceAll(substitute, status); + REGEX_CHECK_STATUS; + REGEX_ASSERT(result == "--C-- 1 --C-- 2 --C-- 3"); + } + { + UnicodeString src = "abc !"; + UnicodeString substitute = "--\\U00010000--"; + matcher->reset(src); + UnicodeString result = matcher->replaceAll(substitute, status); + REGEX_CHECK_STATUS; + UnicodeString expected = UnicodeString("--"); + expected.append((UChar32)0x10000); + expected.append("-- !"); + REGEX_ASSERT(result == expected); + } // TODO: need more through testing of capture substitutions. - - + + // Bug 4057 + // + { + status = U_ZERO_ERROR; + UnicodeString s = "The matches start with ss and end with ee ss stuff ee fin"; + RegexMatcher m("ss(.*?)ee", 0, status); + REGEX_CHECK_STATUS; + UnicodeString result; + + // Multiple finds do NOT bump up the previous appendReplacement postion. + m.reset(s); + m.find(); + m.find(); + m.appendReplacement(result, "ooh", status); + REGEX_CHECK_STATUS; + REGEX_ASSERT(result == "The matches start with ss and end with ee ooh"); + + // After a reset into the interior of a string, appendReplacemnt still starts at beginning. + status = U_ZERO_ERROR; + result.truncate(0); + m.reset(10, status); + m.find(); + m.find(); + m.appendReplacement(result, "ooh", status); + REGEX_CHECK_STATUS; + REGEX_ASSERT(result == "The matches start with ss and end with ee ooh"); + + // find() at interior of string, appendReplacemnt still starts at beginning. + status = U_ZERO_ERROR; + result.truncate(0); + m.reset(); + m.find(10, status); + m.find(); + m.appendReplacement(result, "ooh", status); + REGEX_CHECK_STATUS; + REGEX_ASSERT(result == "The matches start with ss and end with ee ooh"); + + m.appendTail(result); + REGEX_ASSERT(result == "The matches start with ss and end with ee ooh fin"); + + } + delete matcher2; delete pat2; delete matcher; @@ -947,7 +1196,7 @@ void RegexTest::API_Pattern() { REGEX_ASSERT(*pat1a == *pat1); REGEX_ASSERT(pat1a->flags() == 0); -#if 0 + // Compile with different flags should be not equal RegexPattern *pat1b = RegexPattern::compile(re1, UREGEX_CASE_INSENSITIVE, pe, status); REGEX_CHECK_STATUS; @@ -956,24 +1205,40 @@ void RegexTest::API_Pattern() { REGEX_ASSERT(pat1b->flags() == UREGEX_CASE_INSENSITIVE); REGEX_ASSERT(pat1a->flags() == 0); delete pat1b; -#endif // add test back in when we actually support flag settings. // clone RegexPattern *pat1c = pat1->clone(); REGEX_ASSERT(*pat1c == *pat1); REGEX_ASSERT(*pat1c != *pat2); - - // TODO: Actually do some matches with the cloned/copied/assigned patterns. - - - delete pat1c; delete pat1a; delete pat1; delete pat2; + // + // Verify that a matcher created from a cloned pattern works. + // (Jitterbug 3423) + // + { + UErrorCode status = U_ZERO_ERROR; + RegexPattern *pSource = RegexPattern::compile("\\p{L}+", 0, status); + RegexPattern *pClone = pSource->clone(); + delete pSource; + RegexMatcher *mFromClone = pClone->matcher(status); + REGEX_CHECK_STATUS; + UnicodeString s = "Hello World"; + mFromClone->reset(s); + REGEX_ASSERT(mFromClone->find() == TRUE); + REGEX_ASSERT(mFromClone->group(status) == "Hello"); + REGEX_ASSERT(mFromClone->find() == TRUE); + REGEX_ASSERT(mFromClone->group(status) == "World"); + REGEX_ASSERT(mFromClone->find() == FALSE); + delete mFromClone; + delete pClone; + } + // // matches convenience API // @@ -1158,7 +1423,8 @@ void RegexTest::API_Pattern() { REGEX_CHECK_STATUS; REGEX_ASSERT(pat1->getDynamicClassID() == RegexPattern::getStaticClassID()); REGEX_ASSERT(pat1->getDynamicClassID() != NULL); - RegexMatcher *m = pat1->matcher("Hello, World", status); + UnicodeString Hello("Hello, world."); + RegexMatcher *m = pat1->matcher(Hello, status); REGEX_ASSERT(pat1->getDynamicClassID() != m->getDynamicClassID()); REGEX_ASSERT(m->getDynamicClassID() == RegexMatcher::getStaticClassID()); REGEX_ASSERT(m->getDynamicClassID() != NULL); @@ -1175,38 +1441,49 @@ void RegexTest::API_Pattern() { // A description of the test data format is included in that file. // //--------------------------------------------------------------------------- + +const char * +RegexTest::getPath(char buffer[2048], const char *filename) { + UErrorCode status=U_ZERO_ERROR; + const char *testDataDirectory = IntlTest::getSourceTestData(status); + if (U_FAILURE(status)) { + errln("ERROR: loadTestData() failed - %s", u_errorName(status)); + return NULL; + } + + strcpy(buffer, testDataDirectory); + strcat(buffer, filename); + return buffer; +} + void RegexTest::Extended() { + char tdd[2048]; + const char *srcPath; UErrorCode status = U_ZERO_ERROR; int32_t lineNum = 0; // // Open and read the test data file. // - const char *testDataDirectory = loadTestData(status); - if (U_FAILURE(status)) { - errln("ERROR: could not open test data %s", u_errorName(status)); - return; - } - UnicodeString tdd(testDataDirectory); - RegexMatcher m("([/\\\\])out[/\\\\]testdata", tdd, 0, status); - if(U_SUCCESS(status)) { - tdd = m.replaceFirst("$1regextst.txt", status); - } else { - errln("Couldn't set up tests. Error %s", u_errorName(status)); - return; + srcPath=getPath(tdd, "regextst.txt"); + if(srcPath==NULL) { + return; /* something went wrong, error already output */ } int len; - UChar *testData = ReadAndConvertFile((const char *)CharString(tdd), len, status); + UChar *testData = ReadAndConvertFile(srcPath, len, status); + if (U_FAILURE(status)) { + return; /* something went wrong, error already output */ + } // // Put the test data into a UnicodeString // UnicodeString testString(FALSE, testData, len); - RegexMatcher quotedStuffMat("\\s*([\\'\\\"/])(.+?)\\1", 0, status); - RegexMatcher commentMat ("\\s*(#.*)?$", 0, status); - RegexMatcher flagsMat ("\\s*([ixsmdtG]*)([:letter:]*)", 0, status); + RegexMatcher quotedStuffMat("\\s*([\\'\\\"/])(.*?)\\1", 0, status); + RegexMatcher commentMat ("\\s*(#.*)?$", 0, status); + RegexMatcher flagsMat ("\\s*([ixsmdtGv2-9]*)([:letter:]*)", 0, status); RegexMatcher lineMat("(.*?)\\r?\\n", testString, 0, status); UnicodeString testPattern; // The pattern for test from the test file. @@ -1324,7 +1601,7 @@ void RegexTest::Errors() { // TODO: add tests for unbounded length look-behinds. REGEX_ERR("abc(?<@xyz).*", 1, 7, U_REGEX_RULE_SYNTAX); // illegal construct - // Attempt to use non-default flags + // Attempt to use non-default flags { UParseError pe; UErrorCode status = U_ZERO_ERROR; @@ -1349,6 +1626,10 @@ void RegexTest::Errors() { REGEX_ERR("abc{1,,2}",1,7, U_REGEX_BAD_INTERVAL); REGEX_ERR("abc{1,2a}",1,8, U_REGEX_BAD_INTERVAL); REGEX_ERR("abc{222222222222222222222}",1,14, U_REGEX_NUMBER_TOO_BIG); + REGEX_ERR("abc{5,50000000000}", 1, 17, U_REGEX_NUMBER_TOO_BIG); // Overflows int during scan + REGEX_ERR("abc{5,687865858}", 1, 16, U_REGEX_NUMBER_TOO_BIG); // Overflows regex binary format + REGEX_ERR("abc{687865858,687865859}", 1, 24, U_REGEX_NUMBER_TOO_BIG); + // UnicodeSet containing a string REGEX_ERR("abc[{def}]xyz", 1, 10, U_REGEX_SET_CONTAINS_STRING); @@ -1367,26 +1648,27 @@ UChar *RegexTest::ReadAndConvertFile(const char *fileName, int &ulen, UErrorCode char *fileBuf = NULL; UConverter* conv = NULL; FILE *f = NULL; - + ulen = 0; if (U_FAILURE(status)) { return retPtr; } - + // // Open the file. // f = fopen(fileName, "rb"); if (f == 0) { errln("Error opening test data file %s\n", fileName); - goto cleanUpAndReturn; + status = U_FILE_ACCESS_ERROR; + return NULL; } // // Read it in // int fileSize; int amt_read; - + fseek( f, 0, SEEK_END); fileSize = ftell(f); fileBuf = new char[fileSize]; @@ -1396,14 +1678,14 @@ UChar *RegexTest::ReadAndConvertFile(const char *fileName, int &ulen, UErrorCode errln("Error reading test data file."); goto cleanUpAndReturn; } - + // // Look for a Unicode Signature (BOM) on the data just read // int32_t signatureLength; const char * fileBufC; const char* encoding; - + fileBufC = fileBuf; encoding = ucnv_detectUnicodeSignature( fileBuf, fileSize, &signatureLength, &status); @@ -1411,7 +1693,7 @@ UChar *RegexTest::ReadAndConvertFile(const char *fileName, int &ulen, UErrorCode fileBufC += signatureLength; fileSize -= signatureLength; } - + // // Open a converter to take the rule file to UTF-16 // @@ -1419,7 +1701,7 @@ UChar *RegexTest::ReadAndConvertFile(const char *fileName, int &ulen, UErrorCode if (U_FAILURE(status)) { goto cleanUpAndReturn; } - + // // Convert the rules to UChar. // Preflight first to determine required buffer size. @@ -1433,7 +1715,7 @@ UChar *RegexTest::ReadAndConvertFile(const char *fileName, int &ulen, UErrorCode if (status == U_BUFFER_OVERFLOW_ERROR) { // Buffer Overflow is expected from the preflight operation. status = U_ZERO_ERROR; - + retPtr = new UChar[ulen+1]; ucnv_toUChars(conv, retPtr, // dest, @@ -1475,11 +1757,11 @@ cleanUpAndReturn: // # Column 2 contains the string to be matched. // # // # Column 3 contains the expected result: -// # y expect a match -// # n expect no match -// # c expect an error -// # B test exposes a known bug in Perl, should be skipped -// # b test exposes a known bug in Perl, should be skipped if noamp +// # y expect a match +// # n expect no match +// # c expect an error +// # B test exposes a known bug in Perl, should be skipped +// # b test exposes a known bug in Perl, should be skipped if noamp // # // # Columns 4 and 5 are used only if column 3 contains C<y> or C<c>. // # @@ -1502,28 +1784,24 @@ cleanUpAndReturn: // //------------------------------------------------------------------------------- void RegexTest::PerlTests() { + char tdd[2048]; + const char *srcPath; UErrorCode status = U_ZERO_ERROR; UParseError pe; // // Open and read the test data file. // - const char *testDataDirectory = loadTestData(status); - if (U_FAILURE(status)) { - errln("ERROR: could not open test data %s", u_errorName(status)); - return; - } - UnicodeString tdd(testDataDirectory); - RegexMatcher m("([/\\\\])out[/\\\\]testdata", tdd, 0, status); - if(U_SUCCESS(status)) { - tdd = m.replaceFirst("$1re_tests.txt", status); - } else { - errln("Couldn't set up tests. Error %s", u_errorName(status)); - return; + srcPath=getPath(tdd, "re_tests.txt"); + if(srcPath==NULL) { + return; /* something went wrong, error already output */ } int len; - UChar *testData = ReadAndConvertFile((const char *)CharString(tdd), len, status); + UChar *testData = ReadAndConvertFile(srcPath, len, status); + if (U_FAILURE(status)) { + return; /* something went wrong, error already output */ + } // // Put the test data into a UnicodeString @@ -1550,7 +1828,7 @@ void RegexTest::PerlTests() { // Coming out, capture group 2 is the pattern, capture group 3 is the flags. // RegexPattern *flagPat = RegexPattern::compile("('?)(.*)\\1(.*)", 0, pe, status); - RegexMatcher* flagMat = flagPat->matcher("", status); + RegexMatcher* flagMat = flagPat->matcher(status); // // The Perl tests reference several perl-isms, which are evaluated/substituted @@ -1567,11 +1845,11 @@ void RegexTest::PerlTests() { // regexp for $-[0], $+[2], etc. RegexPattern *groupsPat = RegexPattern::compile("\\$([+\\-])\\[(\\d+)\\]", 0, pe, status); - RegexMatcher *groupsMat = groupsPat->matcher("", status); - + RegexMatcher *groupsMat = groupsPat->matcher(status); + // regexp for $0, $1, $2, etc. RegexPattern *cgPat = RegexPattern::compile("\\$(\\d+)", 0, pe, status); - RegexMatcher *cgMat = cgPat->matcher("", status); + RegexMatcher *cgMat = cgPat->matcher(status); // @@ -1666,7 +1944,7 @@ void RegexTest::PerlTests() { // // replace the Perl variables that appear in some of the - // match data strings. + // match data strings. // UnicodeString matchString = fields[1]; matchString.findAndReplace(nulnulSrc, nulnul); @@ -1676,7 +1954,7 @@ void RegexTest::PerlTests() { // Don't do full unescape, as this unescapes more than Perl does, which // causes other spurious failures in the tests. matchString.findAndReplace("\\n", "\n"); - + // @@ -1689,7 +1967,7 @@ void RegexTest::PerlTests() { expected = TRUE; } if (expected != found) { - errln("line %d: Expected %smatch, got %smatch", + errln("line %d: Expected %smatch, got %smatch", lineNum, expected?"":"no ", found?"":"no " ); continue; } @@ -1697,7 +1975,7 @@ void RegexTest::PerlTests() { // // Interpret the Perl expression from the fourth field of the data file, // building up an ICU string from the results of the ICU match. - // The Perl expression will contain references to the results of + // The Perl expression will contain references to the results of // a regex match, including the matched string, capture group strings, // group starting and ending indicies, etc. // @@ -1774,7 +2052,7 @@ void RegexTest::PerlTests() { case 'n': c = '\n'; break; // add any other escape sequences that show up in the test expected results. } - resultString.append(c); + resultString.append(c); perlExpr.remove(0, 1); } @@ -1791,7 +2069,7 @@ void RegexTest::PerlTests() { break; } } - + // // Expected Results Compare // @@ -1803,8 +2081,8 @@ void RegexTest::PerlTests() { if (expectedS.compare(resultString) != 0) { errln("Line %d: Incorrect perl expression results. Expected \"%s\"; got \"%s\"", - lineNum, (const char *)CharString(expectedS), - (const char *)CharString(resultString)); + lineNum, (const char *)CharString(expectedS, 0), + (const char *)CharString(resultString, 0)); } delete testMat; @@ -1816,19 +2094,19 @@ void RegexTest::PerlTests() { // delete cgMat; delete cgPat; - + delete groupsMat; delete groupsPat; - + delete flagMat; delete flagPat; delete lineMat; delete linePat; - + delete fieldPat; delete [] testData; - + logln("%d tests skipped because of unimplemented regexp features.", skippedUnimplementedCount); diff --git a/icuSources/test/intltest/regextst.h b/icuSources/test/intltest/regextst.h index b0269b67..5a4b7c67 100644 --- a/icuSources/test/intltest/regextst.h +++ b/icuSources/test/intltest/regextst.h @@ -12,7 +12,6 @@ #if !UCONFIG_NO_REGULAR_EXPRESSIONS #include "intltest.h" -#include "unicode/regex.h" class RegexTest: public IntlTest { @@ -39,6 +38,8 @@ public: virtual void regex_err(const char *pat, int32_t errline, int32_t errcol, UErrorCode expectedStatus, int line); virtual UChar *ReadAndConvertFile(const char *fileName, int &len, UErrorCode &status); + virtual const char *getPath(char buffer[2048], const char *filename); + }; #endif // !UCONFIG_NO_REGULAR_EXPRESSIONS diff --git a/icuSources/test/intltest/restest.cpp b/icuSources/test/intltest/restest.cpp index 8afa73af..a4fb06dd 100644 --- a/icuSources/test/intltest/restest.cpp +++ b/icuSources/test/intltest/restest.cpp @@ -156,8 +156,7 @@ int32_t randi(int32_t n) */ ResourceBundleTest::ResourceBundleTest() : pass(0), - fail(0), - OUT(it_out) + fail(0) { if (param[5].locale == NULL) { param[0].locale = new Locale("root"); @@ -187,6 +186,8 @@ void ResourceBundleTest::runIndexedTest( int32_t index, UBool exec, const char* case 0: name = "TestResourceBundles"; if (exec) TestResourceBundles(); break; case 1: name = "TestConstruction"; if (exec) TestConstruction(); break; case 2: name = "TestExemplar"; if (exec) TestExemplar(); break; + case 3: name = "TestGetSize"; if (exec) TestGetSize(); break; + case 4: name = "TestGetLocaleByType"; if (exec) TestGetLocaleByType(); break; default: name = ""; break; //needed to end loop } } @@ -479,6 +480,124 @@ ResourceBundleTest::TestExemplar(){ logln("Number of installed locales with exemplar characters that could be tested: %d",num); } - + +void +ResourceBundleTest::TestGetSize(void) +{ + const struct { + const char* key; + int32_t size; + } test[] = { + { "zerotest", 1}, + { "one", 1}, + { "importtest", 1}, + { "integerarray", 1}, + { "emptyarray", 0}, + { "emptytable", 0}, + { "emptystring", 1}, /* empty string is still a string */ + { "emptyint", 1}, + { "emptybin", 1}, + { "testinclude", 1}, + { "collations", 1}, /* not 2 - there is hidden %%CollationBin */ + }; + + UErrorCode status = U_ZERO_ERROR; + + const char* testdatapath = loadTestData(status); + int32_t i = 0, j = 0; + int32_t size = 0; + + if(U_FAILURE(status)) + { + err("Could not load testdata.dat %s\n", u_errorName(status)); + return; + } + + ResourceBundle rb(testdatapath, "testtypes", status); + if(U_FAILURE(status)) + { + err("Could not testtypes resource bundle %s\n", u_errorName(status)); + return; + } + + for(i = 0; i < (int32_t)(sizeof(test)/sizeof(test[0])); i++) { + ResourceBundle res = rb.get(test[i].key, status); + if(U_FAILURE(status)) + { + err("Couldn't find the key %s. Error: %s\n", u_errorName(status)); + return; + } + size = res.getSize(); + if(size != test[i].size) { + err("Expected size %i, got size %i for key %s\n", test[i].size, size, test[i].key); + for(j = 0; j < size; j++) { + ResourceBundle helper = res.get(j, status); + err("%s\n", helper.getKey()); + } + } + } +} + +void +ResourceBundleTest::TestGetLocaleByType(void) +{ + const struct { + const char *requestedLocale; + const char *resourceKey; + const char *validLocale; + const char *actualLocale; + } test[] = { + { "te_IN_BLAH", "string_only_in_te_IN", "te_IN", "te_IN" }, + { "te_IN_BLAH", "string_only_in_te", "te_IN", "te" }, + { "te_IN_BLAH", "string_only_in_Root", "te_IN", "root" }, + { "te_IN_BLAH_01234567890_01234567890_01234567890_01234567890_01234567890_01234567890", "array_2d_only_in_Root", "te_IN", "root" }, + { "te_IN_BLAH@currency=euro", "array_2d_only_in_te_IN", "te_IN", "te_IN" }, + { "te_IN_BLAH@calendar=thai;collation=phonebook", "array_2d_only_in_te", "te_IN", "te" } + }; + + UErrorCode status = U_ZERO_ERROR; + + const char* testdatapath = loadTestData(status); + int32_t i = 0; + Locale locale; + + if(U_FAILURE(status)) + { + err("Could not load testdata.dat %s\n", u_errorName(status)); + return; + } + + for(i = 0; i < (int32_t)(sizeof(test)/sizeof(test[0])); i++) { + ResourceBundle rb(testdatapath, test[i].requestedLocale, status); + if(U_FAILURE(status)) + { + err("Could not open resource bundle %s (error %s)\n", test[i].requestedLocale, u_errorName(status)); + status = U_ZERO_ERROR; + continue; + } + + ResourceBundle res = rb.get(test[i].resourceKey, status); + if(U_FAILURE(status)) + { + err("Couldn't find the key %s. Error: %s\n", test[i].resourceKey, u_errorName(status)); + status = U_ZERO_ERROR; + continue; + } + + locale = res.getLocale(ULOC_REQUESTED_LOCALE, status); + if(locale != Locale::getDefault()) { + err("Expected requested locale to be %s. Got %s\n", test[i].requestedLocale, locale.getName()); + } + locale = res.getLocale(ULOC_VALID_LOCALE, status); + if(strcmp(locale.getName(), test[i].validLocale) != 0) { + err("Expected valid locale to be %s. Got %s\n", test[i].requestedLocale, locale.getName()); + } + locale = res.getLocale(ULOC_ACTUAL_LOCALE, status); + if(strcmp(locale.getName(), test[i].actualLocale) != 0) { + err("Expected actual locale to be %s. Got %s\n", test[i].requestedLocale, locale.getName()); + } + } +} + //eof diff --git a/icuSources/test/intltest/restest.h b/icuSources/test/intltest/restest.h index 14a778a4..78ee08d9 100644 --- a/icuSources/test/intltest/restest.h +++ b/icuSources/test/intltest/restest.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2003, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -30,6 +30,9 @@ public: void TestExemplar(void); + void TestGetSize(void); + void TestGetLocaleByType(void); + private: /** * The assignment operator has no real implementation. @@ -47,8 +50,6 @@ private: int32_t pass; int32_t fail; - - IntlTest& OUT; }; #endif diff --git a/icuSources/test/intltest/restsnew.cpp b/icuSources/test/intltest/restsnew.cpp index 9a30b0c9..abeca616 100644 --- a/icuSources/test/intltest/restsnew.cpp +++ b/icuSources/test/intltest/restsnew.cpp @@ -155,8 +155,7 @@ static int32_t randi(int32_t n) */ NewResourceBundleTest::NewResourceBundleTest() : pass(0), - fail(0), - OUT(it_out) + fail(0) { if (param[5].locale == NULL) { param[0].locale = new Locale("root"); @@ -377,6 +376,25 @@ NewResourceBundleTest::TestIteration() delete locale; } +// TODO: add operator== and != to ResourceBundle +static UBool +equalRB(ResourceBundle &a, ResourceBundle &b) { + UResType type; + UErrorCode status; + + type=a.getType(); + status=U_ZERO_ERROR; + return + type==b.getType() && + a.getLocale()==b.getLocale() && + 0==strcmp(a.getName(), b.getName()) && + type==URES_STRING ? + a.getString(status)==b.getString(status) : + type==URES_INT ? + a.getInt(status)==b.getInt(status) : + TRUE; +} + void NewResourceBundleTest::TestOtherAPI(){ UErrorCode err = U_ZERO_ERROR; @@ -436,7 +454,19 @@ NewResourceBundleTest::TestOtherAPI(){ errln("copy construction for subresource failed\n"); } + ResourceBundle *p; + p = defaultresource.clone(); + if(p == &defaultresource || !equalRB(*p, defaultresource)) { + errln("ResourceBundle.clone() failed"); + } + delete p; + + p = defaultSub.clone(); + if(p == &defaultSub || !equalRB(*p, defaultSub)) { + errln("2nd ResourceBundle.clone() failed"); + } + delete p; UVersionInfo ver; copyRes.getVersion(ver); @@ -962,7 +992,7 @@ NewResourceBundleTest::TestNewTypes() { } ResourceBundle theBundle(testdatapath, "testtypes", status); - ResourceBundle bundle(testdatapath, Locale("te_IN"),status); + ResourceBundle bundle(testdatapath, Locale("te_IN"),status); UnicodeString emptyStr = theBundle.getStringEx("emptystring", status); if(!emptyStr.length()==0) { @@ -980,7 +1010,7 @@ NewResourceBundleTest::TestNewTypes() { CONFIRM_UErrorCode(status, U_ZERO_ERROR); CONFIRM_EQ(res.getType(), URES_STRING); UnicodeString zeroString=res.getString(status); - len = zeroString.length(); + len = zeroString.length(); if(U_SUCCESS(status)){ CONFIRM_UErrorCode(status, U_ZERO_ERROR); CONFIRM_EQ(len, 7); @@ -1069,10 +1099,10 @@ NewResourceBundleTest::TestNewTypes() { UnicodeString str = theBundle.getStringEx("testescape",status); CONFIRM_UErrorCode(status, U_ZERO_ERROR); if(U_SUCCESS(status)){ - u_charsToUChars(expect,uExpect,uprv_strlen(expect)+1); + u_charsToUChars(expect,uExpect,(int32_t)uprv_strlen(expect)+1); if(str.compare(uExpect)!=0){ errln("Did not get the expected string for testescape expected. Expected : " - +UnicodeString(uExpect )+ " Got: " + str); + +UnicodeString(uExpect )+ " Got: " + str); } } } @@ -1081,7 +1111,7 @@ NewResourceBundleTest::TestNewTypes() { UnicodeString str = theBundle.getStringEx("test_underscores",status); expect ="test message ...."; CONFIRM_UErrorCode(status, U_ZERO_ERROR); - u_charsToUChars(expect,uExpect,uprv_strlen(expect)+1); + u_charsToUChars(expect,uExpect,(int32_t)uprv_strlen(expect)+1); if(str.compare(uExpect)!=0){ errln("Did not get the expected string for test_underscores.\n"); } diff --git a/icuSources/test/intltest/restsnew.h b/icuSources/test/intltest/restsnew.h index 6a8245da..2cadcf5b 100644 --- a/icuSources/test/intltest/restsnew.h +++ b/icuSources/test/intltest/restsnew.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2003, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -32,7 +32,7 @@ public: void TestOtherAPI(void); - void TestNewTypes(void); + void TestNewTypes(void); private: /** @@ -52,7 +52,6 @@ private: int32_t pass; int32_t fail; - IntlTest& OUT; }; #endif diff --git a/icuSources/test/intltest/sdtfmtts.cpp b/icuSources/test/intltest/sdtfmtts.cpp index f687499d..15817d5d 100644 --- a/icuSources/test/intltest/sdtfmtts.cpp +++ b/icuSources/test/intltest/sdtfmtts.cpp @@ -1,7 +1,7 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2003, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ diff --git a/icuSources/test/intltest/sfwdchit.cpp b/icuSources/test/intltest/sfwdchit.cpp index 195e200d..703a4858 100644 --- a/icuSources/test/intltest/sfwdchit.cpp +++ b/icuSources/test/intltest/sfwdchit.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2003, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /* file name: sfwdchit.cpp @@ -21,6 +21,7 @@ const int32_t SimpleFwdCharIterator::kInvalidHashCode = 0; const int32_t SimpleFwdCharIterator::kEmptyHashCode = 1; +#if 0 // not used SimpleFwdCharIterator::SimpleFwdCharIterator(const UnicodeString& s) { fHashCode = kInvalidHashCode; @@ -36,6 +37,7 @@ SimpleFwdCharIterator::SimpleFwdCharIterator(const UnicodeString& s) { } } +#endif SimpleFwdCharIterator::SimpleFwdCharIterator(UChar *s, int32_t len, UBool adopt) { @@ -65,6 +67,7 @@ SimpleFwdCharIterator::~SimpleFwdCharIterator() { delete[] fStart; } +#if 0 // not used UBool SimpleFwdCharIterator::operator==(const ForwardCharacterIterator& that) const { if(this == &that) { return TRUE; @@ -84,7 +87,8 @@ UBool SimpleFwdCharIterator::operator==(const ForwardCharacterIterator& that) co */ return FALSE; } - +#endif + int32_t SimpleFwdCharIterator::hashCode(void) const { if (fHashCode == kInvalidHashCode) { diff --git a/icuSources/test/intltest/sfwdchit.h b/icuSources/test/intltest/sfwdchit.h index 66450367..71fbd00c 100644 --- a/icuSources/test/intltest/sfwdchit.h +++ b/icuSources/test/intltest/sfwdchit.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2003, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -12,7 +12,7 @@ class SimpleFwdCharIterator : public ForwardCharacterIterator { public: - SimpleFwdCharIterator(const UnicodeString& s); + // not used -- SimpleFwdCharIterator(const UnicodeString& s); SimpleFwdCharIterator(UChar *s, int32_t len, UBool adopt = FALSE); virtual ~SimpleFwdCharIterator(); @@ -21,7 +21,7 @@ public: * Returns true when both iterators refer to the same * character in the same character-storage object. */ - virtual UBool operator==(const ForwardCharacterIterator& that) const; + // not used -- virtual UBool operator==(const ForwardCharacterIterator& that) const; /** * Generates a hash code for this iterator. diff --git a/icuSources/test/intltest/srchtest.cpp b/icuSources/test/intltest/srchtest.cpp index cb958321..6899f4bb 100644 --- a/icuSources/test/intltest/srchtest.cpp +++ b/icuSources/test/intltest/srchtest.cpp @@ -1,7 +1,7 @@ /* ***************************************************************************** -* Copyright (C) 2001-2003, International Business Machines orporation and others. -* All Rights Reserved. +* Copyright (C) 2001-2004, International Business Machines orporation +* and others. All Rights Reserved. ****************************************************************************/ #include "unicode/utypes.h" @@ -14,6 +14,7 @@ #include "unicode/ustring.h" #include "unicode/schriter.h" #include <string.h> +#include <stdio.h> // private definitions ----------------------------------------------------- @@ -193,33 +194,19 @@ BreakIterator * StringSearchTest::getBreakIterator(const char *breaker) char * StringSearchTest::toCharString(const UnicodeString &text) { - UChar unichars[512]; static char result[1024]; - int count = 0; int index = 0; + int count = 0; int length = text.length(); - text.extract(0, text.length(), unichars, 0); - for (; count < length; count ++) { - UChar ch = unichars[count]; + UChar ch = text[count]; if (ch >= 0x20 && ch <= 0x7e) { result[index ++] = (char)ch; } else { - char digit[5]; - int zerosize; - result[index ++] = '\\'; - result[index ++] = 'u'; - sprintf(digit, "%x", ch); - zerosize = 4 - strlen(digit); - while (zerosize != 0) { - result[index ++] = '0'; - zerosize --; - } - result[index] = 0; - strcat(result, digit); - index += strlen(digit); + sprintf(result+index, "\\u%04x", ch); + index += 6; /* \uxxxx */ } } result[index] = 0; @@ -344,7 +331,7 @@ UBool StringSearchTest::assertEqual(const SearchData *search) Collator *collator = getCollator(search->collator); BreakIterator *breaker = getBreakIterator(search->breaker); - StringSearch *strsrch; + StringSearch *strsrch, *strsrch2; UChar temp[128]; #if UCONFIG_NO_BREAK_ITERATION @@ -377,6 +364,20 @@ UBool StringSearchTest::assertEqual(const SearchData *search) delete strsrch; return FALSE; } + + + strsrch2 = strsrch->clone(); + if( strsrch2 == strsrch || *strsrch2 != *strsrch || + !assertEqualWithStringSearch(strsrch2, search) + ) { + errln("failure with StringSearch.clone()"); + collator->setStrength(getECollationStrength(UCOL_TERTIARY)); + delete strsrch; + delete strsrch2; + return FALSE; + } + delete strsrch2; + collator->setStrength(getECollationStrength(UCOL_TERTIARY)); delete strsrch; return TRUE; @@ -1618,6 +1619,10 @@ void StringSearchTest::TestBreakIteratorCanonical() } search = &(BREAKITERATOREXACT[count + 1]); breaker = getBreakIterator(search->breaker); + if (breaker == NULL) { + errln("Error creating BreakIterator"); + return; + } breaker->setText(strsrch->getText()); strsrch->setBreakIterator(breaker, status); if (U_FAILURE(status) || strsrch->getBreakIterator() != breaker) { @@ -2230,7 +2235,7 @@ void StringSearchTest::TestSubclass() int i; StringCharacterIterator chariter(text); - search.setText(text, status); + search.setText(text, status); if (search.getText() != search2.getText()) { errln("Error setting text"); } diff --git a/icuSources/test/intltest/srchtest.h b/icuSources/test/intltest/srchtest.h index 24331ab8..36163a1d 100644 --- a/icuSources/test/intltest/srchtest.h +++ b/icuSources/test/intltest/srchtest.h @@ -86,7 +86,7 @@ private: void TestSupplementaryCanonical(); void TestContractionCanonical(); void TestUClassID(); - void TestSubclass(); + void TestSubclass(); }; #endif /* #if !UCONFIG_NO_COLLATION */ diff --git a/icuSources/test/intltest/strcase.cpp b/icuSources/test/intltest/strcase.cpp index b7c3d6f4..fdbdd426 100644 --- a/icuSources/test/intltest/strcase.cpp +++ b/icuSources/test/intltest/strcase.cpp @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2002-2003, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -16,15 +16,15 @@ * Test file for string casing C++ API functions. */ -#include "unicode/utypes.h" #include "unicode/uchar.h" -#include "unicode/unistr.h" #include "unicode/ures.h" #include "unicode/uloc.h" #include "unicode/locid.h" #include "unicode/ubrk.h" #include "ustrtest.h" -#include "tstdtmod.h" +#include "unicode/tstdtmod.h" + +StringCaseTest::~StringCaseTest() {} void StringCaseTest::runIndexedTest(int32_t index, UBool exec, const char *&name, char * /*par*/) { @@ -322,51 +322,50 @@ StringCaseTest::TestCaseConversion() void StringCaseTest::TestTitleCasing() { - UErrorCode status = U_ZERO_ERROR; - UBreakIterator *iter; - char cLocaleID[100]; - UnicodeString locale, input, result; - int32_t type; - TestLog myLog; - TestDataModule *driver = TestDataModule::getTestDataModule("casing", myLog, status); - if(U_SUCCESS(status)) { - TestData *casingTest = driver->createTestData("titlecasing", status); - const DataMap *myCase = NULL; - while(casingTest->nextCase(myCase, status)) { - locale = myCase->getString("Locale", status); - locale.extract(0, 0x7fffffff, cLocaleID, sizeof(cLocaleID), ""); - type = myCase->getInt("Type", status); + UErrorCode status = U_ZERO_ERROR; + UBreakIterator *iter; + char cLocaleID[100]; + UnicodeString locale, input, result; + int32_t type; + TestDataModule *driver = TestDataModule::getTestDataModule("casing", *this, status); + if(U_SUCCESS(status)) { + TestData *casingTest = driver->createTestData("titlecasing", status); + const DataMap *myCase = NULL; + while(casingTest->nextCase(myCase, status)) { + locale = myCase->getString("Locale", status); + locale.extract(0, 0x7fffffff, cLocaleID, sizeof(cLocaleID), ""); + type = myCase->getInt("Type", status); - input = myCase->getString("Input", status); - if(type<0) { - iter=0; - } else { - iter=ubrk_open((UBreakIteratorType)type, cLocaleID, input.getBuffer(), input.length(), &status); - } - - if(U_FAILURE(status)) { - errln("error: TestTitleCasing() ubrk_open(%d) failed for test case from casing.res: %s", type, u_errorName(status)); - status = U_ZERO_ERROR; - } else { - result=input; - result.toTitle((BreakIterator *)iter, Locale(cLocaleID)); - if(result!=myCase->getString("Output", status)) { - errln("error: TestTitleCasing() got a wrong result for test case from casing.res"); - } - } - ubrk_close(iter); + input = myCase->getString("Input", status); + if(type<0) { + iter=0; + } else { + iter=ubrk_open((UBreakIteratorType)type, cLocaleID, NULL, 0, &status); + } + + if(U_FAILURE(status)) { + errln("error: TestTitleCasing() ubrk_open(%d) failed for test case from casing.res: %s", type, u_errorName(status)); + status = U_ZERO_ERROR; + } else { + result=input; + result.toTitle((BreakIterator *)iter, Locale(cLocaleID)); + if(result!=myCase->getString("Output", status)) { + errln("error: TestTitleCasing() got a wrong result for test case from casing.res"); + } + ubrk_close(iter); + } + } + delete casingTest; } - delete casingTest; - } - delete driver; + delete driver; // more tests for API coverage status=U_ZERO_ERROR; input=UNICODE_STRING_SIMPLE("sTrA\\u00dfE").unescape(); (result=input).toTitle(NULL); if(result!=UNICODE_STRING_SIMPLE("Stra\\u00dfe").unescape()) { - errln("UnicodeString::toTitle(BreakIterator *) failed"); + errln("UnicodeString::toTitle(NULL) failed"); } #if 0 diff --git a/icuSources/test/intltest/strtest.cpp b/icuSources/test/intltest/strtest.cpp index f3efa190..4ba90832 100644 --- a/icuSources/test/intltest/strtest.cpp +++ b/icuSources/test/intltest/strtest.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /* file name: strtest.cpp @@ -18,6 +18,13 @@ #include "strtest.h" #include "unicode/ustring.h" +#if defined(WIN32) && defined(_MSC_VER) +#include <vector> +using namespace std; +#endif + +StringTest::~StringTest() {} + void StringTest::TestEndian(void) { union { uint8_t byte; @@ -29,26 +36,47 @@ void StringTest::TestEndian(void) { } } -void StringTest::TestSizeofWCharT(void) { +void StringTest::TestSizeofTypes(void) { if(U_SIZEOF_WCHAR_T!=sizeof(wchar_t)) { errln("TestSizeofWCharT: U_SIZEOF_WCHAR_T!=sizeof(wchar_t) - U_SIZEOF_WCHAR_T needs to be fixed in platform.h"); } -} - -void StringTest::TestSizeofInt64(void) { #ifdef U_INT64_T_UNAVAILABLE errln("int64_t and uint64_t are undefined."); #else if(8!=sizeof(int64_t)) { - errln("TestSizeofInt64: 8!=sizeof(int64_t) - int64_t needs to be fixed in platform.h"); + errln("TestSizeofTypes: 8!=sizeof(int64_t) - int64_t needs to be fixed in platform.h"); } if(8!=sizeof(uint64_t)) { - errln("TestSizeofInt64: 8!=sizeof(uint64_t) - uint64_t needs to be fixed in platform.h"); + errln("TestSizeofTypes: 8!=sizeof(uint64_t) - uint64_t needs to be fixed in platform.h"); } #endif if(8!=sizeof(double)) { errln("8!=sizeof(double) - putil.c code may not work"); } + if(4!=sizeof(int32_t)) { + errln("4!=sizeof(int32_t)"); + } + if(4!=sizeof(uint32_t)) { + errln("4!=sizeof(uint32_t)"); + } + if(2!=sizeof(int16_t)) { + errln("2!=sizeof(int16_t)"); + } + if(2!=sizeof(uint16_t)) { + errln("2!=sizeof(uint16_t)"); + } + if(2!=sizeof(UChar)) { + errln("2!=sizeof(UChar)"); + } + if(1!=sizeof(int8_t)) { + errln("1!=sizeof(int8_t)"); + } + if(1!=sizeof(uint8_t)) { + errln("1!=sizeof(uint8_t)"); + } + if(1!=sizeof(UBool)) { + errln("1!=sizeof(UBool)"); + } } void StringTest::TestCharsetFamily(void) { @@ -74,24 +102,18 @@ void StringTest::runIndexedTest(int32_t index, UBool exec, const char *&name, ch } break; case 1: - name="TestSizeofWCharT"; + name="TestSizeofTypes"; if(exec) { - TestSizeofWCharT(); + TestSizeofTypes(); } break; case 2: - name="TestSizeofInt64"; - if(exec) { - TestSizeofInt64(); - } - break; - case 3: name="TestCharsetFamily"; if(exec) { TestCharsetFamily(); } break; - case 4: + case 3: name="Test_U_STRING"; if(exec) { U_STRING_INIT(ustringVar, "aZ0 -", 5); @@ -108,7 +130,7 @@ void StringTest::runIndexedTest(int32_t index, UBool exec, const char *&name, ch } } break; - case 5: + case 4: name="Test_UNICODE_STRING"; if(exec) { UnicodeString ustringVar=UNICODE_STRING("aZ0 -", 5); @@ -124,7 +146,7 @@ void StringTest::runIndexedTest(int32_t index, UBool exec, const char *&name, ch } } break; - case 6: + case 5: name="Test_UNICODE_STRING_SIMPLE"; if(exec) { UnicodeString ustringVar=UNICODE_STRING_SIMPLE("aZ0 -"); @@ -140,7 +162,7 @@ void StringTest::runIndexedTest(int32_t index, UBool exec, const char *&name, ch } } break; - case 7: + case 6: name="Test_UTF8_COUNT_TRAIL_BYTES"; if(exec) { if(UTF8_COUNT_TRAIL_BYTES(0x7F) != 0 @@ -153,6 +175,16 @@ void StringTest::runIndexedTest(int32_t index, UBool exec, const char *&name, ch } } break; + case 7: + name="TestSTLCompatibility"; + if(exec) { +#if defined(WIN32) && defined(_MSC_VER) + /* Just make sure that it compiles with STL's placement new usage. */ + vector<UnicodeString> myvect; + myvect.push_back(UnicodeString("blah")); +#endif + } + break; default: name=""; break; diff --git a/icuSources/test/intltest/strtest.h b/icuSources/test/intltest/strtest.h index dc0cd0fd..5f342e10 100644 --- a/icuSources/test/intltest/strtest.h +++ b/icuSources/test/intltest/strtest.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /* file name: strtest.h @@ -25,14 +25,13 @@ class StringTest : public IntlTest { public: StringTest() {} - virtual ~StringTest() {} + virtual ~StringTest(); void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=NULL); private: void TestEndian(void); - void TestSizeofWCharT(void); - void TestSizeofInt64(void); + void TestSizeofTypes(void); void TestCharsetFamily(void); }; diff --git a/icuSources/test/intltest/svccoll.cpp b/icuSources/test/intltest/svccoll.cpp index 43f4ef19..34b56bd8 100644 --- a/icuSources/test/intltest/svccoll.cpp +++ b/icuSources/test/intltest/svccoll.cpp @@ -1,6 +1,6 @@ /* ******************************************************************************* - * Copyright (C) 2003, International Business Machines Corporation and * + * Copyright (C) 2003-2004, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* */ @@ -13,13 +13,26 @@ #include "unicode/coll.h" #include "unicode/strenum.h" #include "hash.h" +#include "uassert.h" #include "ucol_imp.h" // internal api needed to test ucollator equality #include "cstring.h" // internal api used to compare locale strings +void CollationServiceTest::runIndexedTest(int32_t index, UBool exec, const char* &name, char* /*par */) +{ + if (exec) logln("TestSuite CollationServiceTest: "); + switch (index) { + TESTCASE(0, TestRegister); + TESTCASE(1, TestRegisterFactory); + TESTCASE(2, TestSeparateTree); + default: name = ""; break; + } +} + void CollationServiceTest::TestRegister() { - // register a singleton +#if !UCONFIG_NO_SERVICE + // register a singleton const Locale& FR = Locale::getFrance(); const Locale& US = Locale::getUS(); const Locale US_FOO("en", "US", "FOO"); @@ -45,11 +58,11 @@ void CollationServiceTest::TestRegister() // ensure original collator's params not touched Locale loc = frcol->getLocale(ULOC_REQUESTED_LOCALE, status); if (loc != FR) { - errln(UnicodeString("fr collator's requested locale changed to ") + loc.getName()); + errln(UnicodeString("fr collator's requested locale changed to ") + loc.getName()); } loc = frcol->getLocale(ULOC_VALID_LOCALE, status); if (loc != FR) { - errln(UnicodeString("fr collator's valid locale changed to ") + loc.getName()); + errln(UnicodeString("fr collator's valid locale changed to ") + loc.getName()); } loc = ncol->getLocale(ULOC_REQUESTED_LOCALE, status); @@ -97,7 +110,7 @@ void CollationServiceTest::TestRegister() UnicodeString locName = fu_FU.getName(); StringEnumeration* localeEnum = Collator::getAvailableLocales(); UBool found = FALSE; - const UnicodeString* locStr; + const UnicodeString* locStr, *ls2; for (locStr = localeEnum->snext(status); !found && locStr != NULL; locStr = localeEnum->snext(status)) { @@ -106,7 +119,32 @@ void CollationServiceTest::TestRegister() found = TRUE; } } + + StringEnumeration *le2 = NULL; + localeEnum->reset(status); + int32_t i, count; + count = localeEnum->count(status); + for(i = 0; i < count; ++i) { + if(i == count / 2) { + le2 = localeEnum->clone(); + if(le2 == NULL || count != le2->count(status)) { + errln("ServiceEnumeration.clone() failed"); + break; + } + } + if(i >= count / 2) { + locStr = localeEnum->snext(status); + ls2 = le2->snext(status); + if(*locStr != *ls2) { + errln("ServiceEnumeration.clone() failed for item %d", i); + } + } else { + localeEnum->snext(status); + } + } + delete localeEnum; + delete le2; if (!found) { errln("new locale fu_FU not reported as supported locale"); @@ -162,10 +200,12 @@ void CollationServiceTest::TestRegister() delete ncol; ncol = NULL; delete fucol; fucol = NULL; } +#endif } // ------------------ +#if !UCONFIG_NO_SERVICE struct CollatorInfo { Locale locale; Collator* collator; @@ -225,7 +265,7 @@ public: { CollatorInfo** p; for (p = info; *p; ++p) {} - count = p - info; + count = (int32_t)(p - info); } ~TestFactory() { @@ -291,9 +331,12 @@ private: }; char TestFactory::gClassID = 0; +#endif void CollationServiceTest::TestRegisterFactory(void) { +#if !UCONFIG_NO_SERVICE + int32_t n1, n2, n3; Locale fu_FU("fu", "FU", ""); Locale fu_FU_FOO("fu", "FU", "FOO"); @@ -308,7 +351,7 @@ void CollationServiceTest::TestRegisterFactory(void) fuFUNames->put(fu_FU.getName(), new UnicodeString("ze leetle bunny Fu-Fu"), status); fuFUNames->put(fu_FU_FOO.getName(), new UnicodeString("zee leetel bunny Foo-Foo"), status); - fuFUNames->put(Locale::getUS().getName(), new UnicodeString("little bunny Foo Foo"), status); + fuFUNames->put(Locale::getDefault().getName(), new UnicodeString("little bunny Foo Foo"), status); Collator* frcol = Collator::createInstance(Locale::getFrance(), status); Collator* gecol = Collator::createInstance(Locale::getGermany(), status); @@ -343,7 +386,13 @@ void CollationServiceTest::TestRegisterFactory(void) Collator* fucol = Collator::createInstance(fu_FU, status); { + n1 = checkAvailable("before registerFactory"); + URegistryKey key = Collator::registerFactory(factory, status); + + n2 = checkAvailable("after registerFactory"); + assertTrue("count after > count before", n2 > n1); + Collator* ncol = Collator::createInstance(Locale::getUS(), status); if (*frcol != *ncol) { errln("frcoll for en_US failed"); @@ -403,21 +452,122 @@ void CollationServiceTest::TestRegisterFactory(void) if (*fucol != *ncol) { errln("collator after unregister does not match original fu_FU"); } - delete ncol; + delete ncol; + + n3 = checkAvailable("after unregister"); + assertTrue("count after unregister == count before register", n3 == n1); } delete fucol; delete uscol; +#endif } -void CollationServiceTest::runIndexedTest(int32_t index, UBool exec, const char* &name, char* /*par */) -{ - if (exec) logln("TestSuite CollationServiceTest: "); - switch (index) { - TESTCASE(0, TestRegister); - TESTCASE(1, TestRegisterFactory); - default: name = ""; break; +/** + * Iterate through the given iterator, checking to see that all the strings + * in the expected array are present. + * @param expected array of strings we expect to see, or NULL + * @param expectedCount number of elements of expected, or 0 + */ +int32_t CollationServiceTest::checkStringEnumeration(const char* msg, + StringEnumeration& iter, + const char** expected, + int32_t expectedCount) { + UErrorCode ec = U_ZERO_ERROR; + U_ASSERT(expectedCount >= 0 && expectedCount < 31); // [sic] 31 not 32 + int32_t i = 0, n = iter.count(ec); + assertSuccess("count", ec); + UnicodeString buf; + int32_t seenMask = 0; + for (;; ++i) { + const UnicodeString* s = iter.snext(ec); + if (!assertSuccess("snext", ec) || s == NULL) break; + if (i != 0) buf.append(", "); + buf.append(*s); + // check expected list + for (int32_t j=0, bit=1; j<expectedCount; ++j, bit<<=1) { + if ((seenMask&bit)==0) { + UnicodeString exp(expected[j], (char*)NULL); + if (*s == exp) { + seenMask |= bit; + logln((UnicodeString)"Ok: \"" + exp + "\" seen"); + } + } + } + } + // can't get pesky operator+(const US&, foo) to cooperate; use toString +#if !UCONFIG_NO_FORMATTING + logln(UnicodeString() + msg + " = [" + buf + "] (" + toString(i) + ")"); +#else + logln(UnicodeString() + msg + " = [" + buf + "] (??? NO_FORMATTING)"); +#endif + assertTrue("count verified", i==n); + // did we see all expected strings? + if (((1<<expectedCount)-1) != seenMask) { + for (int32_t j=0, bit=1; j<expectedCount; ++j, bit<<=1) { + if ((seenMask&bit)==0) { + errln((UnicodeString)"FAIL: \"" + expected[j] + "\" not seen"); + } + } } + return n; +} + +/** + * Check the integrity of the results of Collator::getAvailableLocales(). + * Return the number of items returned. + */ +#if !UCONFIG_NO_SERVICE +int32_t CollationServiceTest::checkAvailable(const char* msg) { + StringEnumeration *iter = Collator::getAvailableLocales(); + if (!assertTrue("getAvailableLocales != NULL", iter!=NULL)) return -1; + int32_t n = checkStringEnumeration(msg, *iter, NULL, 0); + delete iter; + return n; +} +#endif + +static const char* KW[] = { + "collation" +}; +static const int32_t KW_COUNT = sizeof(KW)/sizeof(KW[0]); + +static const char* KWVAL[] = { + "phonebook", + "stroke" +}; +static const int32_t KWVAL_COUNT = sizeof(KWVAL)/sizeof(KWVAL[0]); + +void CollationServiceTest::TestSeparateTree() { + UErrorCode ec = U_ZERO_ERROR; + StringEnumeration *iter = Collator::getKeywords(ec); + if (!assertTrue("getKeywords != NULL", iter!=NULL)) return; + if (!assertSuccess("getKeywords", ec)) return; + checkStringEnumeration("getKeywords", *iter, KW, KW_COUNT); + delete iter; + + iter = Collator::getKeywordValues(KW[0], ec); + if (!assertTrue("getKeywordValues != NULL", iter!=NULL)) return; + if (!assertSuccess("getKeywordValues", ec)) return; + checkStringEnumeration("getKeywordValues", *iter, KWVAL, KWVAL_COUNT); + delete iter; + + UBool isAvailable; + Locale equiv = Collator::getFunctionalEquivalent("collation", + Locale::createFromName("fr"), + isAvailable, ec); + assertSuccess("getFunctionalEquivalent", ec); + assertEquals("getFunctionalEquivalent(fr)", "fr", equiv.getName()); + assertTrue("getFunctionalEquivalent(fr).isAvailable==TRUE", + isAvailable == TRUE); + + equiv = Collator::getFunctionalEquivalent("collation", + Locale::createFromName("fr_FR"), + isAvailable, ec); + assertSuccess("getFunctionalEquivalent", ec); + assertEquals("getFunctionalEquivalent(fr_FR)", "fr", equiv.getName()); + assertTrue("getFunctionalEquivalent(fr_FR).isAvailable==TRUE", + isAvailable == TRUE); } #endif diff --git a/icuSources/test/intltest/svccoll.h b/icuSources/test/intltest/svccoll.h index 1f2b8dbb..3967f104 100644 --- a/icuSources/test/intltest/svccoll.h +++ b/icuSources/test/intltest/svccoll.h @@ -1,5 +1,5 @@ /******************************************************************** - * Copyright (c) 2003, International Business Machines Corporation + * Copyright (c) 2004, International Business Machines Corporation * and others. All Rights Reserved. ********************************************************************/ @@ -16,14 +16,29 @@ #include "intltest.h" +U_NAMESPACE_BEGIN + +class StringEnumeration; + class CollationServiceTest: public IntlTest { public: void runIndexedTest(int32_t index, UBool exec, const char* &name, char* /*par = NULL */); void TestRegister(void); void TestRegisterFactory(void); + void TestSeparateTree(); + + private: + int32_t checkStringEnumeration(const char* msg, + StringEnumeration& iter, + const char** expected, + int32_t expectedCount); + + int32_t checkAvailable(const char* msg); }; +U_NAMESPACE_END + /* #if !UCONFIG_NO_COLLATION */ #endif diff --git a/icuSources/test/intltest/tchcfmt.cpp b/icuSources/test/intltest/tchcfmt.cpp index bd378659..6e995436 100644 --- a/icuSources/test/intltest/tchcfmt.cpp +++ b/icuSources/test/intltest/tchcfmt.cpp @@ -64,7 +64,7 @@ TestChoiceFormat::TestSimpleExample( void ) } //form->parse(res1, f, parse_pos); res2 = " ??? "; - it_out << ix << " -> " << res1 << " -> " << res2 << endl; + it_logln(UnicodeString("") + ix + UnicodeString(" -> ") + res1 + UnicodeString(" -> ") + res2); } //Testing ==operator const double filelimits[] = {0,1,2}; @@ -176,11 +176,11 @@ TestChoiceFormat::TestComplexExample( void ) UnicodeString str; UnicodeString res1, res2; pattform->toPattern( res1 ); - it_out << "MessageFormat toPattern: " << res1 << endl; + it_logln("MessageFormat toPattern: " + res1); fileform->toPattern( res1 ); - it_out << "ChoiceFormat toPattern: " << res1 << endl; + it_logln("ChoiceFormat toPattern: " + res1); if (res1 == "-1.0#are corrupted files|0.0#are no files|1.0#is one file|2.0#are {2} files") { - it_out << "toPattern tested!" << endl; + it_logln("toPattern tested!"); }else{ it_errln("*** ChoiceFormat to Pattern result!"); } @@ -219,15 +219,16 @@ TestChoiceFormat::TestComplexExample( void ) delete pattform; return; } - it_out << i << " -> " << res2 << endl; + it_logln(i + UnicodeString(" -> ") + res2); if (res2 != checkstr[i - start]) { it_errln("*** test_complex_example res string"); - it_out << "*** " << i << " -> '" << res2 << "' unlike '" << checkstr[i] << "' ! " << endl; + it_errln(UnicodeString("*** ") + i + UnicodeString(" -> '") + res2 + UnicodeString("' unlike '") + checkstr[i] + UnicodeString("' ! ")); } } - it_out << endl; + it_logln(); - it_out << "------ additional testing in complex test ------" << endl << endl; + it_logln("------ additional testing in complex test ------"); + it_logln(); // int32_t retCount; const double* retLimits = fileform->getLimits( retCount ); @@ -236,7 +237,7 @@ TestChoiceFormat::TestComplexExample( void ) && (retLimits[1] == 0.0) && (retLimits[2] == 1.0) && (retLimits[3] == 2.0)) { - it_out << "getLimits tested!" << endl; + it_logln("getLimits tested!"); }else{ it_errln("*** getLimits unexpected result!"); } @@ -247,7 +248,7 @@ TestChoiceFormat::TestComplexExample( void ) && (retFormats[1] == "are no files") && (retFormats[2] == "is one file") && (retFormats[3] == "are {2} files")) { - it_out << "getFormats tested!" << endl; + it_logln("getFormats tested!"); }else{ it_errln("*** getFormats unexpected result!"); } @@ -260,7 +261,8 @@ TestChoiceFormat::TestComplexExample( void ) }; fileform->applyPattern("0#is no folder|1#is one folder|2#are many folders", status ); - if (status == U_ZERO_ERROR) it_out << "status applyPattern OK!" << endl; + if (status == U_ZERO_ERROR) + it_logln("status applyPattern OK!"); if (!chkstatus( status, "*** test_complex_example pattform" )) { delete fileform; delete filenumform; @@ -281,10 +283,10 @@ TestChoiceFormat::TestComplexExample( void ) delete pattform; return; } - it_out << i << " -> " << res2 << endl; + it_logln(UnicodeString() + i + UnicodeString(" -> ") + res2); if (res2 != checkstr2[i]) { it_errln("*** test_complex_example res string"); - it_out << "*** " << i << " -> '" << res2 << "' unlike '" << checkstr2[i] << "' ! " << endl; + it_errln(UnicodeString("*** ") + i + UnicodeString(" -> '") + res2 + UnicodeString("' unlike '") + checkstr2[i] + UnicodeString("' ! ")); } } @@ -299,13 +301,13 @@ TestChoiceFormat::TestComplexExample( void ) it_errln("*** test-choiceFormat not allocatable!"); }else{ if (*form_A == *form_A2) { - it_out << "operator== tested." << endl; + it_logln("operator== tested."); }else{ it_errln("*** operator=="); } if (*form_A != *form_B) { - it_out << "operator!= tested." << endl; + it_logln("operator!= tested."); }else{ it_errln("*** operator!="); } @@ -315,7 +317,7 @@ TestChoiceFormat::TestComplexExample( void ) it_errln("*** ChoiceFormat->clone is nil."); }else{ if ((*form_A3 == *form_A) && (*form_A3 != *form_B)) { - it_out << "method clone tested." << endl; + it_logln("method clone tested."); }else{ it_errln("*** ChoiceFormat clone or operator==, or operator!= ."); } @@ -326,7 +328,7 @@ TestChoiceFormat::TestComplexExample( void ) form_Assigned = *form_B; ok = ok && (form_Assigned != *form_A) && (form_Assigned == *form_B); if (ok) { - it_out << "copy constructor and operator= tested." << endl; + it_logln("copy constructor and operator= tested."); }else{ it_errln("*** copy constructor or operator= or operator == or operator != ."); } @@ -347,7 +349,7 @@ TestChoiceFormat::TestComplexExample( void ) form_pat.toPattern( res1 ); if (res1 == "0.0#none|1.0#one|2.0#many") { - it_out << "ChoiceFormat contructor( newPattern, status) tested" << endl; + it_logln("ChoiceFormat contructor( newPattern, status) tested"); }else{ it_errln("*** ChoiceFormat contructor( newPattern, status) or toPattern result!"); } @@ -365,7 +367,7 @@ TestChoiceFormat::TestComplexExample( void ) form_pat.toPattern( res1 ); it_out << "ChoiceFormat adoptChoices toPattern: " << res1 << endl; if (res1 == "1.0#first|2.0#second") { - it_out << "ChoiceFormat adoptChoices tested" << endl; + it_logln("ChoiceFormat adoptChoices tested"); }else{ it_errln("*** ChoiceFormat adoptChoices result!"); } @@ -376,9 +378,9 @@ TestChoiceFormat::TestComplexExample( void ) form_pat.setChoices( d_a2, s_a2, 2 ); form_pat.toPattern( res1 ); - it_out << "ChoiceFormat adoptChoices toPattern: " << res1 << endl; + it_logln(UnicodeString("ChoiceFormat adoptChoices toPattern: ") + res1); if (res1 == "3.0#third|4.0#forth") { - it_out << "ChoiceFormat adoptChoices tested" << endl; + it_logln("ChoiceFormat adoptChoices tested"); }else{ it_errln("*** ChoiceFormat adoptChoices result!"); } @@ -388,7 +390,7 @@ TestChoiceFormat::TestComplexExample( void ) status = U_ZERO_ERROR; double arg_double = 3.0; res1 = form_pat.format( arg_double, str, fpos ); - it_out << "ChoiceFormat format:" << res1 << endl; + it_logln(UnicodeString("ChoiceFormat format:") + res1); if (res1 != "third") it_errln("*** ChoiceFormat format (double, ...) result!"); str = ""; @@ -396,7 +398,7 @@ TestChoiceFormat::TestComplexExample( void ) status = U_ZERO_ERROR; int32_t arg_long = 3; res1 = form_pat.format( arg_long, str, fpos ); - it_out << "ChoiceFormat format:" << res1 << endl; + it_logln(UnicodeString("ChoiceFormat format:") + res1); if (res1 != "third") it_errln("*** ChoiceFormat format (int32_t, ...) result!"); Formattable ft( (int32_t)3 ); @@ -410,7 +412,7 @@ TestChoiceFormat::TestComplexExample( void ) delete pattform; return; } - it_out << "ChoiceFormat format:" << res1 << endl; + it_logln(UnicodeString("ChoiceFormat format:") + res1); if (res1 != "third") it_errln("*** ChoiceFormat format (Formattable, ...) result!"); Formattable fta[] = { (int32_t)3 }; @@ -424,7 +426,7 @@ TestChoiceFormat::TestComplexExample( void ) delete pattform; return; } - it_out << "ChoiceFormat format:" << res1 << endl; + it_logln(UnicodeString("ChoiceFormat format:") + res1); if (res1 != "third") it_errln("*** ChoiceFormat format (Formattable[], cnt, ...) result!"); ParsePosition parse_pos = 0; @@ -433,7 +435,7 @@ TestChoiceFormat::TestComplexExample( void ) form_pat.parse( parsetext, result, parse_pos ); double rd = (result.getType() == Formattable::kLong) ? result.getLong() : result.getDouble(); if (rd == 3.0) { - it_out << "parse( ..., ParsePos ) tested." << endl; + it_logln("parse( ..., ParsePos ) tested."); }else{ it_errln("*** ChoiceFormat parse( ..., ParsePos )!"); } @@ -441,7 +443,7 @@ TestChoiceFormat::TestComplexExample( void ) form_pat.parse( parsetext, result, status ); rd = (result.getType() == Formattable::kLong) ? result.getLong() : result.getDouble(); if (rd == 3.0) { - it_out << "parse( ..., UErrorCode ) tested." << endl; + it_logln("parse( ..., UErrorCode ) tested."); }else{ it_errln("*** ChoiceFormat parse( ..., UErrorCode )!"); } @@ -455,7 +457,7 @@ TestChoiceFormat::TestComplexExample( void ) } */ - it_out << endl; + it_logln(); delete fileform; delete filenumform; diff --git a/icuSources/test/intltest/testidn.cpp b/icuSources/test/intltest/testidn.cpp index 501c23ae..b706f2bf 100644 --- a/icuSources/test/intltest/testidn.cpp +++ b/icuSources/test/intltest/testidn.cpp @@ -25,6 +25,8 @@ #if !UCONFIG_NO_IDNA && !UCONFIG_NO_TRANSLITERATION +#define USPREP_TYPE_NAMES_ARRAY + #include "unicode/uchar.h" #include "unicode/putil.h" #include "cmemory.h" @@ -37,39 +39,22 @@ #include "umutex.h" #include "sprpimpl.h" #include "testidna.h" +#include "punyref.h" UBool beVerbose=FALSE, haveCopyright=TRUE; /* prototypes --------------------------------------------------------------- */ -static UBool isDataLoaded = FALSE; -static UTrie idnTrie={ 0,0,0,0,0,0,0 }; -static UDataMemory *idnData=NULL; -static UErrorCode dataErrorCode =U_ZERO_ERROR; - - -static const uint16_t* mappingData = NULL; -static int32_t indexes[_IDNA_INDEX_TOP]={ 0 }; - - static void -parseMappings(const char *filename, UBool withNorm, UBool reportError,TestIDNA& test, UErrorCode *pErrorCode); - -static void -parseTable(const char *filename, UBool isUnassigned, TestIDNA& test, UErrorCode *pErrorCode); - -static UBool loadIDNData(UErrorCode &errorCode); - -static UBool cleanup(); +parseMappings(const char *filename, UBool reportError,TestIDNA& test, UErrorCode *pErrorCode); static void compareMapping(uint32_t codepoint, uint32_t* mapping, int32_t mapLength, - UBool withNorm); + UStringPrepType option); static void -compareFlagsForRange(uint32_t start, uint32_t end, - UBool isUnassigned); +compareFlagsForRange(uint32_t start, uint32_t end,UStringPrepType option); static void testAllCodepoints(TestIDNA& test); @@ -77,12 +62,12 @@ testAllCodepoints(TestIDNA& test); static TestIDNA* pTestIDNA =NULL; static const char* fileNames[] = { - "rfc3454_A_1.txt", /* contains unassigned code points */ - "rfc3454_C_X.txt", /* contains code points that are prohibited */ - "rfc3454_B_1.txt", /* contains case mappings when normalization is turned off */ - "rfc3454_B_2.txt", /* contains case mappings when normalization it turned on */ - /* "NormalizationCorrections.txt",contains NFKC case mappings whicha are not included in UTR 21 */ - }; + "NamePrepProfile.txt" + }; +static UStringPrepProfile *profile = NULL; +static const UTrie *idnTrie = NULL; +static const int32_t *indexes = NULL; +static const uint16_t *mappingData = NULL; /* -------------------------------------------------------------------------- */ /* file definitions */ @@ -93,19 +78,23 @@ static const char* fileNames[] = { extern int testData(TestIDNA& test) { - char* filename = (char*) malloc(strlen(IntlTest::pathToDataDirectory())*3); + char* filename = (char*) malloc(strlen(IntlTest::pathToDataDirectory())*5555); //TODO get the srcDir dynamically const char *srcDir=IntlTest::pathToDataDirectory(); char *basename=NULL; UErrorCode errorCode=U_ZERO_ERROR; char *saveBasename =NULL; - loadIDNData(errorCode); - if(U_FAILURE(dataErrorCode)){ - test.errln( "Could not load data. Error: %s\n",u_errorName(dataErrorCode)); - return dataErrorCode; + profile = usprep_open(NULL, DATA_NAME, &errorCode); + if(U_FAILURE(errorCode)){ + test.errln("Failed to load IDNA data file. " + UnicodeString(u_errorName(errorCode))); + return errorCode; } + idnTrie = &profile->sprepTrie; + indexes = profile->indexes; + mappingData = profile->mappingData; + //initialize pTestIDNA = &test; @@ -136,28 +125,7 @@ testData(TestIDNA& test) { /* process unassigned */ uprv_strcpy(basename,fileNames[0]); - parseTable(filename,TRUE, test,&errorCode); - if(U_FAILURE(errorCode)) { - test.errln( "Could not open file %s for reading \n", filename); - return errorCode; - } - /* process prohibited */ - uprv_strcpy(basename,fileNames[1]); - parseTable(filename,FALSE, test, &errorCode); - if(U_FAILURE(errorCode)) { - test.errln( "Could not open file %s for reading \n", filename); - return errorCode; - } - - /* process mappings */ - uprv_strcpy(basename,fileNames[2]); - parseMappings(filename, FALSE, FALSE,test, &errorCode); - if(U_FAILURE(errorCode)) { - test.errln( "Could not open file %s for reading \n", filename); - return errorCode; - } - uprv_strcpy(basename,fileNames[3]); - parseMappings(filename, TRUE, FALSE,test, &errorCode); + parseMappings(filename,TRUE, test,&errorCode); if(U_FAILURE(errorCode)) { test.errln( "Could not open file %s for reading \n", filename); return errorCode; @@ -165,48 +133,74 @@ testData(TestIDNA& test) { testAllCodepoints(test); - cleanup(); + usprep_close(profile); pTestIDNA = NULL; free(filename); return errorCode; } U_CDECL_BEGIN + static void U_CALLCONV -caseMapLineFn(void *context, - char *fields[][2], int32_t /*fieldCount*/, +strprepProfileLineFn(void * /*context*/, + char *fields[][2], int32_t fieldCount, UErrorCode *pErrorCode) { uint32_t mapping[40]; - char *end, *s; + char *end, *map; uint32_t code; int32_t length; - UBool* mapWithNorm = (UBool*) context; + /*UBool* mapWithNorm = (UBool*) context;*/ + const char* typeName; + uint32_t rangeStart=0,rangeEnd =0; + + if(fieldCount != 3){ + *pErrorCode = U_INVALID_FORMAT_ERROR; + return; + } - /* get the character code, field 0 */ - code=(uint32_t)uprv_strtoul(fields[0][0], &end, 16); - if(end<=fields[0][0] || end!=fields[0][1]) { - *pErrorCode=U_PARSE_ERROR; + typeName = fields[2][0]; + map = fields[1][0]; + + if(uprv_strstr(typeName, usprepTypeNames[USPREP_UNASSIGNED])!=NULL){ - } + u_parseCodePointRange(fields[0][0], &rangeStart,&rangeEnd, pErrorCode); + + /* store the range */ + compareFlagsForRange(rangeStart,rangeEnd,USPREP_UNASSIGNED); + + }else if(uprv_strstr(typeName, usprepTypeNames[USPREP_PROHIBITED])!=NULL){ + + u_parseCodePointRange(fields[0][0], &rangeStart,&rangeEnd, pErrorCode); - s = fields[1][0]; - /* parse the mapping string */ - length=u_parseCodePoints(s, mapping, sizeof(mapping)/4, pErrorCode); + /* store the range */ + compareFlagsForRange(rangeStart,rangeEnd,USPREP_PROHIBITED); - /* store the mapping */ + }else if(uprv_strstr(typeName, usprepTypeNames[USPREP_MAP])!=NULL){ + /* get the character code, field 0 */ + code=(uint32_t)uprv_strtoul(fields[0][0], &end, 16); + + /* parse the mapping string */ + length=u_parseCodePoints(map, mapping, sizeof(mapping)/4, pErrorCode); + + /* store the mapping */ + compareMapping(code,mapping, length,USPREP_MAP); + + }else{ + *pErrorCode = U_INVALID_FORMAT_ERROR; + } - compareMapping(code,mapping, length, *mapWithNorm); } + U_CDECL_END static void -parseMappings(const char *filename,UBool withNorm, UBool reportError, TestIDNA& test, UErrorCode *pErrorCode) { +parseMappings(const char *filename,UBool reportError, TestIDNA& test, UErrorCode *pErrorCode) { char *fields[3][2]; if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { return; } - u_parseDelimitedFile(filename, ';', fields, 3, caseMapLineFn, &withNorm, pErrorCode); + u_parseDelimitedFile(filename, ';', fields, 3, strprepProfileLineFn, (void*)filename, pErrorCode); //fprintf(stdout,"Number of code points that have mappings with length >1 : %i\n",len); @@ -215,142 +209,164 @@ parseMappings(const char *filename,UBool withNorm, UBool reportError, TestIDNA& } } -/* parser for UnicodeData.txt ----------------------------------------------- */ -U_CDECL_BEGIN -static void U_CALLCONV -unicodeDataLineFn(void *context, - char *fields[][2], int32_t /*fieldCount*/, - UErrorCode *pErrorCode) { - uint32_t rangeStart=0,rangeEnd =0; - UBool* isUnassigned = (UBool*) context; +static inline UStringPrepType +getValues(uint32_t result, int32_t& value, UBool& isIndex){ - u_parseCodePointRange(fields[0][0], &rangeStart,&rangeEnd, pErrorCode); - - if(U_FAILURE(*pErrorCode)){ - *pErrorCode = U_PARSE_ERROR; - return; - } + UStringPrepType type; + if(result == 0){ + /* + * Initial value stored in the mapping table + * just return USPREP_TYPE_LIMIT .. so that + * the source codepoint is copied to the destination + */ + type = USPREP_TYPE_LIMIT; + }else if(result >= _SPREP_TYPE_THRESHOLD){ + type = (UStringPrepType) (result - _SPREP_TYPE_THRESHOLD); + }else{ + /* get the state */ + type = USPREP_MAP; + /* ascertain if the value is index or delta */ + if(result & 0x02){ + isIndex = TRUE; + value = result >> 2; //mask off the lower 2 bits and shift - compareFlagsForRange(rangeStart,rangeEnd,*isUnassigned); + }else{ + isIndex = FALSE; + value = (int16_t)result; + value = (value >> 2); + } + if((result>>2) == _SPREP_MAX_INDEX_VALUE){ + type = USPREP_DELETE; + isIndex =FALSE; + value = 0; + } + } + return type; } -U_CDECL_END + static void -parseTable(const char *filename,UBool isUnassigned,TestIDNA& test, UErrorCode *pErrorCode) { - char *fields[2][2]; - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return; +testAllCodepoints(TestIDNA& test){ + /* + { + UChar str[19] = { + 0xC138, 0xACC4, 0xC758, 0xBAA8, 0xB4E0, 0xC0AC, 0xB78C, 0xB4E4, 0xC774, + 0x070F,//prohibited + 0xD55C, 0xAD6D, 0xC5B4, 0xB97C, 0xC774, 0xD574, 0xD55C, 0xB2E4, 0xBA74 + }; + uint32_t in[19] = {0}; + UErrorCode status = U_ZERO_ERROR; + int32_t inLength=0, outLength=100; + char output[100] = {0}; + punycode_status error; + u_strToUTF32((UChar32*)in,19,&inLength,str,19,&status); + + error= punycode_encode(inLength, in, NULL, (uint32_t*)&outLength, output); + printf(output); + } + */ - u_parseDelimitedFile(filename, ';', fields, 1, unicodeDataLineFn, &isUnassigned, pErrorCode); + uint32_t i = 0; + int32_t unassigned = 0; + int32_t prohibited = 0; + int32_t mappedWithNorm = 0; + int32_t mapped = 0; + int32_t noValueInTrie = 0; + UStringPrepType type; + int32_t value; + UBool isIndex = FALSE; - if(U_FAILURE(*pErrorCode)) { - test.errln( "testidn error: u_parseDelimitedFile(\"%s\") failed - %s\n", filename, u_errorName(*pErrorCode)); - } -} - -static void -testAllCodepoints(TestIDNA& test){ - if(isDataLoaded){ - uint32_t i = 0; - int32_t unassigned = 0; - int32_t prohibited = 0; - int32_t mappedWithNorm = 0; - int32_t mapped = 0; - int32_t noValueInTrie = 0; - - - for(i=0;i<=0x10FFFF;i++){ - uint32_t result = 0; - UTRIE_GET16(&idnTrie,i, result); - - if(result != UIDNA_NO_VALUE ){ - if((result & 0x07) == UIDNA_UNASSIGNED){ - unassigned++; - } - if((result & 0x07) == UIDNA_PROHIBITED){ - prohibited++; - } - if((result>>5) == _IDNA_MAP_TO_NOTHING){ - mapped++; - } - if((result & 0x07) == UIDNA_MAP_NFKC){ - mappedWithNorm++; - } - }else{ - noValueInTrie++; - if(result > 0){ - test.errln("The return value for 0x%06X is wrong. %i\n",i,result); - } + for(i=0;i<=0x10FFFF;i++){ + uint32_t result = 0; + UTRIE_GET16(idnTrie,i, result); + type = getValues(result,value, isIndex); + if(type != USPREP_TYPE_LIMIT ){ + if(type == USPREP_UNASSIGNED){ + unassigned++; + } + if(type == USPREP_PROHIBITED){ + prohibited++; + } + if(type == USPREP_MAP){ + mapped++; + } + }else{ + noValueInTrie++; + if(result > 0){ + test.errln("The return value for 0x%06X is wrong. %i\n",i,result); } } - - test.logln("Number of Unassinged code points : %i \n",unassigned); - test.logln("Number of Prohibited code points : %i \n",prohibited); - test.logln("Number of Mapped code points : %i \n",mapped); - test.logln("Number of Mapped with NFKC code points : %i \n",mappedWithNorm); - test.logln("Number of code points that have no value in Trie: %i \n",noValueInTrie); - } -} -static inline void getValues(uint32_t result, int8_t& flag, - int8_t& length, int32_t& index){ - /* first 3 bits contain the flag */ - flag = (int8_t) (result & 0x07); - /* next 2 bits contain the length */ - length = (int8_t) ((result>>3) & 0x03); - /* next 11 bits contain the index */ - index = (result>> 5); + test.logln("Number of Unassinged code points : %i \n",unassigned); + test.logln("Number of Prohibited code points : %i \n",prohibited); + test.logln("Number of Mapped code points : %i \n",mapped); + test.logln("Number of Mapped with NFKC code points : %i \n",mappedWithNorm); + test.logln("Number of code points that have no value in Trie: %i \n",noValueInTrie); + + } static void compareMapping(uint32_t codepoint, uint32_t* mapping,int32_t mapLength, - UBool withNorm){ - if(isDataLoaded){ - uint32_t result = 0; - UTRIE_GET16(&idnTrie,codepoint, result); + UStringPrepType type){ + uint32_t result = 0; + UTRIE_GET16(idnTrie,codepoint, result); - int8_t flag, length; - int32_t index; - getValues(result,flag,length, index); + int32_t length=0; + UBool isIndex; + UStringPrepType retType; + int32_t value, index=0, delta=0; + + retType = getValues(result,value,isIndex); - if(withNorm){ - if(flag != UIDNA_MAP_NFKC){ - pTestIDNA->errln( "Did not get the assigned flag for codepoint 0x%08X. Expected: %i Got: %i\n",codepoint, UIDNA_MAP_NFKC, flag); - } + if(type != retType && retType != USPREP_DELETE){ + + pTestIDNA->errln( "Did not get the assigned type for codepoint 0x%08X. Expected: %i Got: %i\n",codepoint, USPREP_MAP, type); + + } + + if(isIndex){ + index = value; + if(index >= indexes[_SPREP_ONE_UCHAR_MAPPING_INDEX_START] && + index < indexes[_SPREP_TWO_UCHARS_MAPPING_INDEX_START]){ + length = 1; + }else if(index >= indexes[_SPREP_TWO_UCHARS_MAPPING_INDEX_START] && + index < indexes[_SPREP_THREE_UCHARS_MAPPING_INDEX_START]){ + length = 2; + }else if(index >= indexes[_SPREP_THREE_UCHARS_MAPPING_INDEX_START] && + index < indexes[_SPREP_FOUR_UCHARS_MAPPING_INDEX_START]){ + length = 3; }else{ - if(flag==UIDNA_NO_VALUE || flag == UIDNA_PROHIBITED){ - if(index != _IDNA_MAP_TO_NOTHING ){ - pTestIDNA->errln( "Did not get the assigned flag for codepoint 0x%08X. Expected: %i Got: %i\n", codepoint, _IDNA_MAP_TO_NOTHING, index); - } - } - } - if(length ==_IDNA_LENGTH_IN_MAPPING_TABLE){ - length = (int8_t)mappingData[index]; - index++; - } - int32_t realLength =0; - /* figure out the real length */ - for(int32_t j=0; j<mapLength; j++){ - if(mapping[j] > 0xFFFF){ - realLength +=2; - }else{ - realLength++; - } + length = mappingData[index++]; } + }else{ + delta = value; + length = (retType == USPREP_DELETE)? 0 : 1; + } - if(realLength != length){ - pTestIDNA->errln( "Did not get the expected length. Expected: %i Got: %i\n", mapLength, length); - } - + int32_t realLength =0; + /* figure out the real length */ + for(int32_t j=0; j<mapLength; j++){ + if(mapping[j] > 0xFFFF){ + realLength +=2; + }else{ + realLength++; + } + } + if(realLength != length){ + pTestIDNA->errln( "Did not get the expected length. Expected: %i Got: %i\n", mapLength, length); + } + + if(isIndex){ for(int8_t i =0; i< mapLength; i++){ if(mapping[i] <= 0xFFFF){ if(mappingData[index+i] != (uint16_t)mapping[i]){ @@ -365,133 +381,59 @@ compareMapping(uint32_t codepoint, uint32_t* mapping,int32_t mapLength, } } } - + }else{ + if(retType!=USPREP_DELETE && (codepoint-delta) != (uint16_t)mapping[0]){ + pTestIDNA->errln("Did not get the expected result. Expected: 0x%04X Got: 0x%04X \n", mapping[0],(codepoint-delta)); + } } } static void compareFlagsForRange(uint32_t start, uint32_t end, - UBool isUnassigned){ - if(isDataLoaded){ - uint32_t result =0 ; - while(start < end+1){ - UTRIE_GET16(&idnTrie,start, result); - if(isUnassigned){ - if(result != UIDNA_UNASSIGNED){ - pTestIDNA->errln( "UIDNA_UASSIGNED flag failed for 0x%06X. Expected: %04X Got: %04X\n",start,UIDNA_UNASSIGNED, result); - } - }else{ - if((result & 0x03) != UIDNA_PROHIBITED){ - pTestIDNA->errln( "UIDNA_PROHIBITED flag failed for 0x%06X. Expected: %04X Got: %04X\n\n",start,UIDNA_PROHIBITED, result); - } - } - start++; - } - } -} - -UBool -cleanup() { - if(idnData!=NULL) { - udata_close(idnData); - idnData=NULL; - } - dataErrorCode=U_ZERO_ERROR; - isDataLoaded=FALSE; - - return TRUE; -} -U_CDECL_BEGIN -static UBool U_CALLCONV -isAcceptable(void * /* context */, - const char * /* type */, const char * /* name */, - const UDataInfo *pInfo) { - if( - pInfo->size>=20 && - pInfo->isBigEndian==U_IS_BIG_ENDIAN && - pInfo->charsetFamily==U_CHARSET_FAMILY && - pInfo->dataFormat[0]==0x49 && /* dataFormat="IDNA" 0x49, 0x44, 0x4e, 0x41 */ - pInfo->dataFormat[1]==0x44 && - pInfo->dataFormat[2]==0x4e && - pInfo->dataFormat[3]==0x41 && - pInfo->formatVersion[0]==2 && - pInfo->formatVersion[2]==UTRIE_SHIFT && - pInfo->formatVersion[3]==UTRIE_INDEX_SHIFT - ) { - return TRUE; - } else { - return FALSE; - } -} - -/* idnTrie: the folding offset is the lead FCD value itself */ -static int32_t U_CALLCONV -getFoldingOffset(uint32_t data) { - if(data&0x8000) { - return (int32_t)(data&0x7fff); + UStringPrepType type){ + + uint32_t result =0 ; + UStringPrepType retType; + UBool isIndex=FALSE; + int32_t value=0; +/* + // supplementary code point + UChar __lead16=UTF16_LEAD(0x2323E); + int32_t __offset; + + // get data for lead surrogate + (result)=_UTRIE_GET_RAW((&idnTrie), index, 0, (__lead16)); + __offset=(&idnTrie)->getFoldingOffset(result); + + // get the real data from the folded lead/trail units + if(__offset>0) { + (result)=_UTRIE_GET_RAW((&idnTrie), index, __offset, (0x2323E)&0x3ff); } else { - return 0; + (result)=(uint32_t)((&idnTrie)->initialValue); } -} -U_CDECL_END -static UBool -loadIDNData(UErrorCode &errorCode) { - /* load Unicode normalization data from file */ - if(isDataLoaded==FALSE) { - UTrie _idnTrie={ 0,0,0,0,0,0,0 }; - UDataMemory *data; - const int32_t *p=NULL; - const uint8_t *pb; - if(&errorCode==NULL || U_FAILURE(errorCode)) { - return 0; - } - - /* open the data outside the mutex block */ - data=udata_openChoice(NULL, DATA_TYPE, DATA_NAME, isAcceptable, NULL, &errorCode); - dataErrorCode=errorCode; - if(U_FAILURE(errorCode)) { - return isDataLoaded=FALSE; - } - - p=(const int32_t *)udata_getMemory(data); - pb=(const uint8_t *)(p+_IDNA_INDEX_TOP); - utrie_unserialize(&_idnTrie, pb, p[_IDNA_INDEX_TRIE_SIZE], &errorCode); - _idnTrie.getFoldingOffset=getFoldingOffset; - - - if(U_FAILURE(errorCode)) { - dataErrorCode=errorCode; - udata_close(data); - return isDataLoaded=FALSE; - } - - /* in the mutex block, set the data for this process */ - umtx_lock(NULL); - if(idnData==NULL) { - idnData=data; - data=NULL; - uprv_memcpy(&indexes, p, sizeof(indexes)); - uprv_memcpy(&idnTrie, &_idnTrie, sizeof(UTrie)); - } else { - p=(const int32_t *)udata_getMemory(idnData); + UTRIE_GET16(&idnTrie,0x2323E, result); +*/ + while(start < end+1){ + UTRIE_GET16(idnTrie,start, result); + retType = getValues(result,value,isIndex); + if(result > _SPREP_TYPE_THRESHOLD){ + if(retType != type){ + pTestIDNA->errln( "FAIL: Did not get the expected type for 0x%06X. Expected: %s Got: %s\n",start,usprepTypeNames[type], usprepTypeNames[retType]); + } + }else{ + if(type == USPREP_PROHIBITED && ((result & 0x01) != 0x01)){ + pTestIDNA->errln( "FAIL: Did not get the expected type for 0x%06X. Expected: %s Got: %s\n",start,usprepTypeNames[type], usprepTypeNames[retType]); + } } - umtx_unlock(NULL); - /* initialize some variables */ - mappingData=(uint16_t *)((uint8_t *)(p+_IDNA_INDEX_TOP)+indexes[_IDNA_INDEX_TRIE_SIZE]); - - isDataLoaded = TRUE; - /* if a different thread set it first, then close the extra data */ - if(data!=NULL) { - udata_close(data); /* NULL if it was set correctly */ - } + start++; } - - return isDataLoaded; + } + #endif /* #if !UCONFIG_NO_IDNA */ /* diff --git a/icuSources/test/intltest/testidna.cpp b/icuSources/test/intltest/testidna.cpp index e6d7f78a..c1174053 100644 --- a/icuSources/test/intltest/testidna.cpp +++ b/icuSources/test/intltest/testidna.cpp @@ -1,7 +1,7 @@ /* ******************************************************************************* * - * Copyright (C) 2003, International Business Machines + * Copyright (C) 2003-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -18,19 +18,17 @@ #if !UCONFIG_NO_IDNA && !UCONFIG_NO_TRANSLITERATION -#include "unicode/uidna.h" #include <time.h> #include <limits.h> +#include <stdlib.h> +#include <string.h> #include "unicode/ustring.h" -#include "sprpimpl.h" -#include "unicode/putil.h" -#include "cstring.h" +#include "unicode/usprep.h" #include "unicode/uniset.h" -#include "unicode/ures.h" -#include "cmemory.h" #include "testidna.h" #include "idnaref.h" #include "nptrans.h" +#include "unicode/putil.h" static UChar unicodeIn[][41] ={ { @@ -146,8 +144,8 @@ static UChar unicodeIn[][41] ={ 0x043e, 0x043d, 0x0438, 0x043d, 0x0435, 0x0433, 0x043e, 0x0432, 0x043e, 0x0440, 0x044f, 0x0442, 0x043f, 0x043e, 0x0440, 0x0443, 0x0441, 0x0441, 0x043a, 0x0438 - } - + }, + }; static const char *asciiIn[] = { @@ -174,7 +172,6 @@ static const char *asciiIn[] = { "xn--hxargifdar", // Greek "xn--bonusaa-5bb1da", // Maltese "xn--b1abfaaepdrnnbgefbadotcwatmq2g4l", // Russian (Cyrillic) - }; static const char *domainNames[] = { @@ -209,19 +206,19 @@ static const char *domainNames[] = { "pool029.max2.denver.co.dynip.alter.net", "cust49.max9.new-york.ny.ms.uu.net", "s61.abq-dialin2.hollyberry.com", - "http://\\u0917\\u0928\\u0947\\u0936.sanjose.ibm.com", + "\\u0917\\u0928\\u0947\\u0936.sanjose.ibm.com", //':'(0x003a) produces U_IDNA_STD3_ASCII_RULES_ERROR "www.xn--vea.com", - "www.\\u00E0\\u00B3\\u00AF.com", + // "www.\\u00E0\\u00B3\\u00AF.com",//' ' (0x0020) produces U_IDNA_STD3_ASCII_RULES_ERROR "www.\\u00C2\\u00A4.com", "www.\\u00C2\\u00A3.com", - "\\u0025", - "\\u005C\\u005C", - "@", - "\\u002F", - "www.\\u0021.com", - "www.\\u0024.com", - "\\u003f", - // These yeild U_IDNA_PROHIBITED_CODEPOINT_FOUND_ERROR + // "\\u0025", //'%' (0x0025) produces U_IDNA_STD3_ASCII_RULES_ERROR + // "\\u005C\\u005C", //'\' (0x005C) produces U_IDNA_STD3_ASCII_RULES_ERROR + //"@", + //"\\u002F", + //"www.\\u0021.com", + //"www.\\u0024.com", + //"\\u003f", + // These yeild U_IDNA_PROHIBITED_ERROR //"\\u00CF\\u0082.com", //"\\u00CE\\u00B2\\u00C3\\u009Fss.com", //"\\u00E2\\u0098\\u00BA.com", @@ -245,13 +242,13 @@ static struct ErrorCases{ { 0x0077, 0x0077, 0x0077, 0x002e, /* www. */ 0xC138, 0xACC4, 0xC758, 0xBAA8, 0xB4E0, 0xC0AC, 0xB78C, 0xB4E4, 0xC774, - 0x2060,/*prohibited*/ + 0x070F,/*prohibited*/ 0xD55C, 0xAD6D, 0xC5B4, 0xB97C, 0xC774, 0xD574, 0xD55C, 0xB2E4, 0xBA74, 0x002e, 0x0063, 0x006f, 0x006d, /* com. */ 0x0000 }, - "www.XN--fxG2146CsoA28OruCyA378BqrE2tCwOp06C5qBw82A1rFfmAE0361DeA96B.com", - U_IDNA_PROHIBITED_CODEPOINT_FOUND_ERROR, + "www.XN--8mb5595fsoa28orucya378bqre2tcwop06c5qbw82a1rffmae0361dea96b.com", + U_IDNA_PROHIBITED_ERROR, FALSE, TRUE, TRUE }, @@ -265,7 +262,7 @@ static struct ErrorCases{ }, "www.XN--6lA2Bz548Fj1GuA391Bf1Gb1N59Ab29A7iA.com", - U_IDNA_UNASSIGNED_CODEPOINT_FOUND_ERROR, + U_IDNA_UNASSIGNED_ERROR, FALSE, TRUE, TRUE }, { @@ -349,7 +346,7 @@ static struct ErrorCases{ 0x0000 }, "www.XN--ghbgi278xia.com", - U_IDNA_PROHIBITED_CODEPOINT_FOUND_ERROR, + U_IDNA_PROHIBITED_ERROR, FALSE, TRUE, TRUE }, { @@ -423,78 +420,78 @@ static struct ConformanceTestCases "Non-ASCII multibyte space character U+1680", "\xE1\x9A\x80", NULL, "Nameprep", UIDNA_DEFAULT, - U_IDNA_PROHIBITED_CODEPOINT_FOUND_ERROR + U_IDNA_PROHIBITED_ERROR }, { "Non-ASCII 8bit control character U+0085", "\xC2\x85", NULL, "Nameprep", UIDNA_DEFAULT, - U_IDNA_PROHIBITED_CODEPOINT_FOUND_ERROR + U_IDNA_PROHIBITED_ERROR }, { "Non-ASCII multibyte control character U+180E", "\xE1\xA0\x8E", NULL, "Nameprep", UIDNA_DEFAULT, - U_IDNA_PROHIBITED_CODEPOINT_FOUND_ERROR + U_IDNA_PROHIBITED_ERROR }, { "Non-ASCII control character U+1D175", "\xF0\x9D\x85\xB5", NULL, "Nameprep", UIDNA_DEFAULT, - U_IDNA_PROHIBITED_CODEPOINT_FOUND_ERROR + U_IDNA_PROHIBITED_ERROR }, { "Plane 0 private use character U+F123", "\xEF\x84\xA3", NULL, "Nameprep", UIDNA_DEFAULT, - U_IDNA_PROHIBITED_CODEPOINT_FOUND_ERROR + U_IDNA_PROHIBITED_ERROR }, { "Plane 15 private use character U+F1234", "\xF3\xB1\x88\xB4", NULL, "Nameprep", UIDNA_DEFAULT, - U_IDNA_PROHIBITED_CODEPOINT_FOUND_ERROR + U_IDNA_PROHIBITED_ERROR }, { "Plane 16 private use character U+10F234", "\xF4\x8F\x88\xB4", NULL, "Nameprep", UIDNA_DEFAULT, - U_IDNA_PROHIBITED_CODEPOINT_FOUND_ERROR + U_IDNA_PROHIBITED_ERROR }, { "Non-character code point U+8FFFE", "\xF2\x8F\xBF\xBE", NULL, "Nameprep", UIDNA_DEFAULT, - U_IDNA_PROHIBITED_CODEPOINT_FOUND_ERROR + U_IDNA_PROHIBITED_ERROR }, { "Non-character code point U+10FFFF", "\xF4\x8F\xBF\xBF", NULL, "Nameprep", UIDNA_DEFAULT, - U_IDNA_PROHIBITED_CODEPOINT_FOUND_ERROR + U_IDNA_PROHIBITED_ERROR }, /* { "Surrogate code U+DF42", "\xED\xBD\x82", NULL, "Nameprep", UIDNA_DEFAULT, - U_IDNA_PROHIBITED_CODEPOINT_FOUND_ERROR + U_IDNA_PROHIBITED_ERROR }, */ { "Non-plain text character U+FFFD", "\xEF\xBF\xBD", NULL, "Nameprep", UIDNA_DEFAULT, - U_IDNA_PROHIBITED_CODEPOINT_FOUND_ERROR + U_IDNA_PROHIBITED_ERROR }, { "Ideographic description character U+2FF5", "\xE2\xBF\xB5", NULL, "Nameprep", UIDNA_DEFAULT, - U_IDNA_PROHIBITED_CODEPOINT_FOUND_ERROR + U_IDNA_PROHIBITED_ERROR }, { "Display property character U+0341", - "\xCD\x81", "\xCD\x81", + "\xCD\x81", "\xCC\x81", "Nameprep", UIDNA_DEFAULT, U_ZERO_ERROR }, @@ -503,26 +500,26 @@ static struct ConformanceTestCases "Left-to-right mark U+200E", "\xE2\x80\x8E", "\xCC\x81", "Nameprep", UIDNA_DEFAULT, - U_IDNA_PROHIBITED_CODEPOINT_FOUND_ERROR + U_IDNA_PROHIBITED_ERROR }, { "Deprecated U+202A", "\xE2\x80\xAA", "\xCC\x81", "Nameprep", UIDNA_DEFAULT, - U_IDNA_PROHIBITED_CODEPOINT_FOUND_ERROR + U_IDNA_PROHIBITED_ERROR }, { "Language tagging character U+E0001", "\xF3\xA0\x80\x81", "\xCC\x81", "Nameprep", UIDNA_DEFAULT, - U_IDNA_PROHIBITED_CODEPOINT_FOUND_ERROR + U_IDNA_PROHIBITED_ERROR }, { "Language tagging character U+E0042", "\xF3\xA0\x81\x82", NULL, "Nameprep", UIDNA_DEFAULT, - U_IDNA_PROHIBITED_CODEPOINT_FOUND_ERROR + U_IDNA_PROHIBITED_ERROR }, { "Bidi: RandALCat character U+05BE and LCat characters", @@ -538,7 +535,7 @@ static struct ConformanceTestCases }, { "Bidi: RandALCat character U+FB38 and LCat characters", - "\x66\x6F\x6F\xEF\xB9\xB6\x62\x61\x72", "\x66\x6F\x6F \xd9\x8e\x62\x61\x72", + "\x66\x6F\x6F\xEF\xB9\xB6\x62\x61\x72", "\x66\x6F\x6F\x20\xd9\x8e\x62\x61\x72", "Nameprep", UIDNA_DEFAULT, U_ZERO_ERROR }, @@ -557,7 +554,7 @@ static struct ConformanceTestCases "Unassigned code point U+E0002", "\xF3\xA0\x80\x82", NULL, "Nameprep", UIDNA_DEFAULT, - U_IDNA_UNASSIGNED_CODEPOINT_FOUND_ERROR + U_IDNA_UNASSIGNED_ERROR }, /* // Invalid UTF-8 @@ -585,11 +582,45 @@ static struct ConformanceTestCases #define MAX_DEST_SIZE 300 +void TestIDNA::debug(const UChar* src, int32_t srcLength, int32_t options){ + UParseError parseError; + UErrorCode transStatus = U_ZERO_ERROR; + UErrorCode prepStatus = U_ZERO_ERROR; + NamePrepTransform* trans = NamePrepTransform::createInstance(parseError,transStatus); + int32_t prepOptions = (((options & UIDNA_ALLOW_UNASSIGNED) != 0) ? USPREP_ALLOW_UNASSIGNED: 0); + UStringPrepProfile* prep = usprep_open(NULL,"uidna",&prepStatus); + UChar *transOut=NULL, *prepOut=NULL; + int32_t transOutLength=0, prepOutLength=0; + + + transOutLength = trans->process(src,srcLength,transOut, 0, prepOptions>0, &parseError, transStatus); + if( transStatus == U_BUFFER_OVERFLOW_ERROR){ + transStatus = U_ZERO_ERROR; + transOut = (UChar*) malloc(U_SIZEOF_UCHAR * transOutLength); + transOutLength = trans->process(src,srcLength,transOut, transOutLength, prepOptions>0, &parseError, transStatus); + } + + prepOutLength = usprep_prepare(prep, src, srcLength, prepOut, 0, prepOptions, &parseError, &prepStatus); + if( prepStatus == U_BUFFER_OVERFLOW_ERROR){ + prepStatus = U_ZERO_ERROR; + prepOut = (UChar*) malloc(U_SIZEOF_UCHAR * prepOutLength); + prepOutLength = usprep_prepare(prep, src, srcLength, prepOut, prepOutLength, prepOptions, &parseError, &prepStatus); + } + + if(UnicodeString(transOut,transOutLength)!= UnicodeString(prepOut, prepOutLength)){ + errln("Failed. Expected: " + prettify(UnicodeString(transOut, transOutLength)) + + " Got: " + prettify(UnicodeString(prepOut,prepOutLength))); + } + free(transOut); + free(prepOut); + delete trans; + +} void TestIDNA::testAPI(const UChar* src, const UChar* expected, const char* testName, UBool useSTD3ASCIIRules,UErrorCode expectedStatus, - UBool doCompare, UBool testUnassigned, TestFunc func){ + UBool doCompare, UBool testUnassigned, TestFunc func, UBool testSTD3ASCIIRules){ UErrorCode status = U_ZERO_ERROR; UChar destStack[MAX_DEST_SIZE]; @@ -603,107 +634,131 @@ void TestIDNA::testAPI(const UChar* src, const UChar* expected, const char* test if(src != NULL){ tSrcLen = u_strlen(src); - tSrc =(UChar*) uprv_malloc( U_SIZEOF_UCHAR * tSrcLen ); - uprv_memcpy(tSrc,src,tSrcLen * U_SIZEOF_UCHAR); + tSrc =(UChar*) malloc( U_SIZEOF_UCHAR * tSrcLen ); + memcpy(tSrc,src,tSrcLen * U_SIZEOF_UCHAR); } // test null-terminated source and return value of number of UChars required - if( expectedStatus != U_IDNA_STD3_ASCII_RULES_ERROR ){ - destLen = func(src,-1,dest,0,options, &parseError , &status); + destLen = func(src,-1,NULL,0,options, &parseError , &status); + if(status == U_BUFFER_OVERFLOW_ERROR){ + status = U_ZERO_ERROR; // reset error code + if(destLen+1 < MAX_DEST_SIZE){ + dest = destStack; + destLen = func(src,-1,dest,destLen+1,options, &parseError, &status); + // TODO : compare output with expected + if(U_SUCCESS(status) && expectedStatus != U_IDNA_STD3_ASCII_RULES_ERROR&& (doCompare==TRUE) && u_strCaseCompare(dest,destLen, expected,expectedLen,0,&status)!=0){ + errln("Did not get the expected result for "+UnicodeString(testName) +" null terminated source. Expected : " + + prettify(UnicodeString(expected,expectedLen)) + + " Got: " + prettify(UnicodeString(dest,destLen)) + ); + } + }else{ + errln( "%s null terminated source failed. Requires destCapacity > 300\n",testName); + } + } + + if(status != expectedStatus){ + errln( "Did not get the expected error for"+ + UnicodeString(testName)+ + "null terminated source. Expected: " +UnicodeString(u_errorName(expectedStatus)) + + " Got: "+ UnicodeString(u_errorName(status)) + + " Source: " + prettify(UnicodeString(src)) + ); + free(tSrc); + return; + } + if(testUnassigned ){ + status = U_ZERO_ERROR; + destLen = func(src,-1,NULL,0,options | UIDNA_ALLOW_UNASSIGNED, &parseError, &status); if(status == U_BUFFER_OVERFLOW_ERROR){ status = U_ZERO_ERROR; // reset error code if(destLen+1 < MAX_DEST_SIZE){ dest = destStack; - destLen = func(src,-1,dest,destLen+1,options, &parseError, &status); + destLen = func(src,-1,dest,destLen+1,options | UIDNA_ALLOW_UNASSIGNED, &parseError, &status); // TODO : compare output with expected - if(U_SUCCESS(status) && expectedStatus != U_IDNA_STD3_ASCII_RULES_ERROR&& (doCompare==TRUE) && u_strCaseCompare(dest,destLen, expected,expectedLen,0,&status)!=0){ - errln("Did not get the expected result for "+UnicodeString(testName) +" null terminated source. Expected : " - + prettify(UnicodeString(expected,expectedLen)) - + " Got: " + prettify(UnicodeString(dest,destLen)) - ); + if(U_SUCCESS(status) && (doCompare==TRUE) && u_strCaseCompare(dest,destLen, expected,expectedLen,0,&status)!=0){ + //errln("Did not get the expected result for %s null terminated source with both options set.\n",testName); + errln("Did not get the expected result for "+UnicodeString(testName) + + " null terminated source "+ prettify(src) + + " with both options set. Expected: "+ prettify(UnicodeString(expected,expectedLen))+ + "Got: " + prettify(UnicodeString(dest,destLen))); + + debug(src,-1,options | UIDNA_ALLOW_UNASSIGNED); + } }else{ errln( "%s null terminated source failed. Requires destCapacity > 300\n",testName); } } + //testing query string + if(status != expectedStatus && expectedStatus != U_IDNA_UNASSIGNED_ERROR){ + errln( "Did not get the expected error for"+ + UnicodeString(testName)+ + "null terminated source with options set. Expected: " +UnicodeString(u_errorName(expectedStatus)) + + " Got: "+ UnicodeString(u_errorName(status)) + + " Source: " + prettify(UnicodeString(src)) + ); + } + } - if(status != expectedStatus){ - errln( "Did not get the expected error for %s null terminated source failed. Expected: %s Got: %s\n",testName, u_errorName(expectedStatus), u_errorName(status)); - uprv_free(tSrc); - return; - } - if(testUnassigned ){ - status = U_ZERO_ERROR; - destLen = func(src,-1,dest,0,options | UIDNA_ALLOW_UNASSIGNED, &parseError, &status); - if(status == U_BUFFER_OVERFLOW_ERROR){ - status = U_ZERO_ERROR; // reset error code - if(destLen+1 < MAX_DEST_SIZE){ - dest = destStack; - destLen = func(src,-1,dest,destLen+1,options | UIDNA_ALLOW_UNASSIGNED, &parseError, &status); - // TODO : compare output with expected - if(U_SUCCESS(status) && (doCompare==TRUE) && u_strCaseCompare(dest,destLen, expected,expectedLen,0,&status)!=0){ - //errln("Did not get the expected result for %s null terminated source with both options set.\n",testName); - errln("Did not get the expected result for "+UnicodeString(testName) +" null terminated source with both options set. Expected: "+ prettify(UnicodeString(expected,expectedLen))); - - } - }else{ - errln( "%s null terminated source failed. Requires destCapacity > 300\n",testName); - } + status = U_ZERO_ERROR; + + // test source with lengthand return value of number of UChars required + destLen = func(tSrc, tSrcLen, NULL,0,options, &parseError, &status); + if(status == U_BUFFER_OVERFLOW_ERROR){ + status = U_ZERO_ERROR; // reset error code + if(destLen+1 < MAX_DEST_SIZE){ + dest = destStack; + destLen = func(src,u_strlen(src),dest,destLen+1,options, &parseError, &status); + // TODO : compare output with expected + if(U_SUCCESS(status) && (doCompare==TRUE) && u_strCaseCompare(dest,destLen, expected,expectedLen,0,&status)!=0){ + errln("Did not get the expected result for %s with source length.\n",testName); } - //testing query string - if(status != expectedStatus && expectedStatus != U_IDNA_UNASSIGNED_CODEPOINT_FOUND_ERROR){ - errln( "Did not get the expected error for %s null terminated source with options set. Expected: %s Got: %s\n",testName, u_errorName(expectedStatus), u_errorName(status)); - } + }else{ + errln( "%s with source length failed. Requires destCapacity > 300\n",testName); } + } + if(status != expectedStatus){ + errln( "Did not get the expected error for"+ + UnicodeString(testName)+ + "with source length. Expected: " +UnicodeString(u_errorName(expectedStatus)) + + " Got: "+ UnicodeString(u_errorName(status)) + + " Source: " + prettify(UnicodeString(src)) + ); + } + if(testUnassigned){ status = U_ZERO_ERROR; - // test source with lengthand return value of number of UChars required - destLen = func(tSrc, tSrcLen, dest,0,options, &parseError, &status); + destLen = func(tSrc,tSrcLen,NULL,0,options | UIDNA_ALLOW_UNASSIGNED, &parseError, &status); + if(status == U_BUFFER_OVERFLOW_ERROR){ status = U_ZERO_ERROR; // reset error code if(destLen+1 < MAX_DEST_SIZE){ dest = destStack; - destLen = func(src,u_strlen(src),dest,destLen+1,options, &parseError, &status); + destLen = func(src,u_strlen(src),dest,destLen+1,options | UIDNA_ALLOW_UNASSIGNED, &parseError, &status); // TODO : compare output with expected if(U_SUCCESS(status) && (doCompare==TRUE) && u_strCaseCompare(dest,destLen, expected,expectedLen,0,&status)!=0){ - errln("Did not get the expected result for %s with source length.\n",testName); + errln("Did not get the expected result for %s with source length and both options set.\n",testName); } }else{ errln( "%s with source length failed. Requires destCapacity > 300\n",testName); } } - - if(status != expectedStatus){ - errln( "Did not get the expected error for %s with source length. Expected: %s Got: %s\n",testName, u_errorName(expectedStatus), u_errorName(status)); - } - if(testUnassigned){ - status = U_ZERO_ERROR; - - destLen = func(tSrc,tSrcLen,dest,0,options | UIDNA_ALLOW_UNASSIGNED, &parseError, &status); - - if(status == U_BUFFER_OVERFLOW_ERROR){ - status = U_ZERO_ERROR; // reset error code - if(destLen+1 < MAX_DEST_SIZE){ - dest = destStack; - destLen = func(src,u_strlen(src),dest,destLen+1,options | UIDNA_ALLOW_UNASSIGNED, &parseError, &status); - // TODO : compare output with expected - if(U_SUCCESS(status) && (doCompare==TRUE) && u_strCaseCompare(dest,destLen, expected,expectedLen,0,&status)!=0){ - errln("Did not get the expected result for %s with source length and both options set.\n",testName); - } - }else{ - errln( "%s with source length failed. Requires destCapacity > 300\n",testName); - } - } - //testing query string - if(status != expectedStatus && expectedStatus != U_IDNA_UNASSIGNED_CODEPOINT_FOUND_ERROR){ - errln( "Did not get the expected error for %s with source length and options set. Expected: %s Got: %s\n",testName, u_errorName(expectedStatus), u_errorName(status)); - } + //testing query string + if(status != expectedStatus && expectedStatus != U_IDNA_UNASSIGNED_ERROR){ + errln( "Did not get the expected error for"+ + UnicodeString(testName)+ + "with source length and options set. Expected: " +UnicodeString(u_errorName(expectedStatus)) + + " Got: "+ UnicodeString(u_errorName(status)) + + " Source: " + prettify(UnicodeString(src)) + ); } - }else{ + } - status = U_ZERO_ERROR; - destLen = func(src,-1,dest,0,options | UIDNA_USE_STD3_RULES, &parseError, &status); + status = U_ZERO_ERROR; + if(testSTD3ASCIIRules==TRUE){ + destLen = func(src,-1,NULL,0,options | UIDNA_USE_STD3_RULES, &parseError, &status); if(status == U_BUFFER_OVERFLOW_ERROR){ status = U_ZERO_ERROR; // reset error code if(destLen+1 < MAX_DEST_SIZE){ @@ -713,7 +768,7 @@ void TestIDNA::testAPI(const UChar* src, const UChar* expected, const char* test if(U_SUCCESS(status) && (doCompare==TRUE) && u_strCaseCompare(dest,destLen, expected,expectedLen,0,&status)!=0){ //errln("Did not get the expected result for %s null terminated source with both options set.\n",testName); errln("Did not get the expected result for "+UnicodeString(testName) +" null terminated source with both options set. Expected: "+ prettify(UnicodeString(expected,expectedLen))); - + } }else{ errln( "%s null terminated source failed. Requires destCapacity > 300\n",testName); @@ -721,12 +776,17 @@ void TestIDNA::testAPI(const UChar* src, const UChar* expected, const char* test } //testing query string if(status != expectedStatus){ - errln( "Did not get the expected error for %s null terminated source with options set. Expected: %s Got: %s\n",testName, u_errorName(expectedStatus), u_errorName(status)); + errln( "Did not get the expected error for"+ + UnicodeString(testName)+ + "null terminated source with options set. Expected: " +UnicodeString(u_errorName(expectedStatus)) + + " Got: "+ UnicodeString(u_errorName(status)) + + " Source: " + prettify(UnicodeString(src)) + ); } status = U_ZERO_ERROR; - destLen = func(tSrc,tSrcLen,dest,0,options | UIDNA_USE_STD3_RULES, &parseError, &status); + destLen = func(tSrc,tSrcLen,NULL,0,options | UIDNA_USE_STD3_RULES, &parseError, &status); if(status == U_BUFFER_OVERFLOW_ERROR){ status = U_ZERO_ERROR; // reset error code @@ -742,11 +802,16 @@ void TestIDNA::testAPI(const UChar* src, const UChar* expected, const char* test } } //testing query string - if(status != expectedStatus && expectedStatus != U_IDNA_UNASSIGNED_CODEPOINT_FOUND_ERROR){ - errln( "Did not get the expected error for %s with source length and options set. Expected: %s Got: %s\n",testName, u_errorName(expectedStatus), u_errorName(status)); + if(status != expectedStatus && expectedStatus != U_IDNA_UNASSIGNED_ERROR){ + errln( "Did not get the expected error for"+ + UnicodeString(testName)+ + "with source length and options set. Expected: " +UnicodeString(u_errorName(expectedStatus)) + + " Got: "+ UnicodeString(u_errorName(status)) + + " Source: " + prettify(UnicodeString(src)) + ); } } - uprv_free(tSrc); + free(tSrc); } void TestIDNA::testCompare(const UChar* s1, int32_t s1Len, @@ -801,7 +866,7 @@ void TestIDNA::testToASCII(const char* testName, TestFunc func){ UChar buf[MAX_DEST_SIZE]; for(i=0;i< (int32_t)(sizeof(unicodeIn)/sizeof(unicodeIn[0])); i++){ - u_charsToUChars(asciiIn[i],buf, uprv_strlen(asciiIn[i])+1); + u_charsToUChars(asciiIn[i],buf, (int32_t)(strlen(asciiIn[i])+1)); testAPI(unicodeIn[i], buf,testName, FALSE,U_ZERO_ERROR, TRUE, TRUE, func); } @@ -813,7 +878,7 @@ void TestIDNA::testToUnicode(const char* testName, TestFunc func){ UChar buf[MAX_DEST_SIZE]; for(i=0;i< (int32_t)(sizeof(asciiIn)/sizeof(asciiIn[0])); i++){ - u_charsToUChars(asciiIn[i],buf, uprv_strlen(asciiIn[i])+1); + u_charsToUChars(asciiIn[i],buf, (int32_t)(strlen(asciiIn[i])+1)); testAPI(buf,unicodeIn[i],testName,FALSE,U_ZERO_ERROR, TRUE, TRUE, func); } } @@ -827,7 +892,7 @@ void TestIDNA::testIDNToUnicode(const char* testName, TestFunc func){ int32_t bufLen = 0; UParseError parseError; for(i=0;i< (int32_t)(sizeof(domainNames)/sizeof(domainNames[0])); i++){ - bufLen = uprv_strlen(domainNames[i]); + bufLen = (int32_t)strlen(domainNames[i]); bufLen = u_unescape(domainNames[i],buf, bufLen+1); func(buf,bufLen,expected,MAX_DEST_SIZE, UIDNA_ALLOW_UNASSIGNED, &parseError,&status); if(U_FAILURE(status)){ @@ -853,7 +918,7 @@ void TestIDNA::testIDNToASCII(const char* testName, TestFunc func){ int32_t bufLen = 0; UParseError parseError; for(i=0;i< (int32_t)(sizeof(domainNames)/sizeof(domainNames[0])); i++){ - bufLen = uprv_strlen(domainNames[i]); + bufLen = (int32_t)strlen(domainNames[i]); bufLen = u_unescape(domainNames[i],buf, bufLen+1); func(buf,bufLen,expected,MAX_DEST_SIZE, UIDNA_ALLOW_UNASSIGNED, &parseError,&status); if(U_FAILURE(status)){ @@ -899,7 +964,7 @@ void TestIDNA::testCompare(const char* testName, CompareFunc func){ for(i=0;i< (int32_t)(sizeof(unicodeIn)/sizeof(unicodeIn[0])); i++){ - u_charsToUChars(asciiIn[i],buf+4, uprv_strlen(asciiIn[i])+1); + u_charsToUChars(asciiIn[i],buf+4, (int32_t)(strlen(asciiIn[i])+1)); u_strcat(buf,com); // for every entry in unicodeIn array @@ -1005,9 +1070,8 @@ void printPunycodeOutput(){ } #endif -void TestIDNA::testErrorCases(const char* toASCIIName, TestFunc toASCII, - const char* IDNToASCIIName, TestFunc IDNToASCII, - const char* IDNToUnicodeName, TestFunc IDNToUnicode){ +void TestIDNA::testErrorCases(const char* IDNToASCIIName, TestFunc IDNToASCII, + const char* IDNToUnicodeName, TestFunc IDNToUnicode){ UChar buf[MAX_DEST_SIZE]; int32_t bufLen=0; @@ -1015,7 +1079,7 @@ void TestIDNA::testErrorCases(const char* toASCIIName, TestFunc toASCII, ErrorCases errorCase = errorCases[i]; UChar* src =NULL; if(errorCase.ascii != NULL){ - bufLen = uprv_strlen(errorCase.ascii); + bufLen = (int32_t)strlen(errorCase.ascii); u_charsToUChars(errorCase.ascii,buf, bufLen+1); }else{ bufLen = 1 ; @@ -1031,8 +1095,8 @@ void TestIDNA::testErrorCases(const char* toASCIIName, TestFunc toASCII, errorCase.expected, TRUE, TRUE, IDNToASCII); if(errorCase.testLabel ==TRUE){ testAPI(src,buf, - toASCIIName, errorCase.useSTD3ASCIIRules, - errorCase.expected, FALSE,TRUE, toASCII); + IDNToASCIIName, errorCase.useSTD3ASCIIRules, + errorCase.expected, FALSE,TRUE, IDNToASCII); } if(errorCase.testToUnicode ==TRUE){ testAPI((src==NULL)? NULL : buf,src, @@ -1054,9 +1118,9 @@ void TestIDNA::testConformance(const char* toASCIIName, TestFunc toASCII, int32_t expectedLen = 0; for(int32_t i=0;i< (int32_t)(sizeof(conformanceTestCases)/sizeof(conformanceTestCases[0]));i++){ const char* utf8Chars1 = conformanceTestCases[i].in; - int32_t utf8Chars1Len = strlen(utf8Chars1); + int32_t utf8Chars1Len = (int32_t)strlen(utf8Chars1); const char* utf8Chars2 = conformanceTestCases[i].out; - int32_t utf8Chars2Len = (utf8Chars2 == NULL) ? 0 : strlen(utf8Chars2); + int32_t utf8Chars2Len = (utf8Chars2 == NULL) ? 0 : (int32_t)strlen(utf8Chars2); UErrorCode status = U_ZERO_ERROR; u_strFromUTF8(src,MAX_DEST_SIZE,&srcLen,utf8Chars1,utf8Chars1Len,&status); @@ -1078,13 +1142,13 @@ void TestIDNA::testConformance(const char* toASCIIName, TestFunc toASCII, IDNToASCIIName, FALSE, conformanceTestCases[i].expectedStatus, TRUE, - (conformanceTestCases[i].expectedStatus != U_IDNA_UNASSIGNED_CODEPOINT_FOUND_ERROR), + (conformanceTestCases[i].expectedStatus != U_IDNA_UNASSIGNED_ERROR), IDNToASCII); testAPI(src,expected, toASCIIName, FALSE, conformanceTestCases[i].expectedStatus, TRUE, - (conformanceTestCases[i].expectedStatus != U_IDNA_UNASSIGNED_CODEPOINT_FOUND_ERROR), + (conformanceTestCases[i].expectedStatus != U_IDNA_UNASSIGNED_ERROR), toASCII); } @@ -1117,8 +1181,8 @@ void TestIDNA::testChaining(UChar* src,int32_t numIterations,const char* testNam if(U_FAILURE(status)){ errln("%s null terminated source failed. Error: %s\n",testName, u_errorName(status)); } - uprv_memcpy(odd,expected,(expectedLen+1) * U_SIZEOF_UCHAR); - uprv_memcpy(even,expected,(expectedLen+1) * U_SIZEOF_UCHAR); + memcpy(odd,expected,(expectedLen+1) * U_SIZEOF_UCHAR); + memcpy(even,expected,(expectedLen+1) * U_SIZEOF_UCHAR); for(;i<=numIterations; i++){ if((i%2) ==0){ evenLen = func(odd,-1,even,MAX_DEST_SIZE,options, &parseError, &status); @@ -1154,8 +1218,8 @@ void TestIDNA::testChaining(UChar* src,int32_t numIterations,const char* testNam if(U_FAILURE(status)){ errln("%s null terminated source with options set failed. Error: %s\n",testName, u_errorName(status)); } - uprv_memcpy(odd,expected,(expectedLen+1) * U_SIZEOF_UCHAR); - uprv_memcpy(even,expected,(expectedLen+1) * U_SIZEOF_UCHAR); + memcpy(odd,expected,(expectedLen+1) * U_SIZEOF_UCHAR); + memcpy(even,expected,(expectedLen+1) * U_SIZEOF_UCHAR); for(;i<=numIterations; i++){ if((i%2) ==0){ evenLen = func(odd,-1,even,MAX_DEST_SIZE,options|UIDNA_ALLOW_UNASSIGNED, &parseError, &status); @@ -1192,8 +1256,8 @@ void TestIDNA::testChaining(UChar* src,int32_t numIterations,const char* testNam if(U_FAILURE(status)){ errln("%s null terminated source failed. Error: %s\n",testName, u_errorName(status)); } - uprv_memcpy(odd,expected,(expectedLen+1) * U_SIZEOF_UCHAR); - uprv_memcpy(even,expected,(expectedLen+1) * U_SIZEOF_UCHAR); + memcpy(odd,expected,(expectedLen+1) * U_SIZEOF_UCHAR); + memcpy(even,expected,(expectedLen+1) * U_SIZEOF_UCHAR); for(;i<=numIterations; i++){ if((i%2) ==0){ evenLen = func(odd,oddLen,even,MAX_DEST_SIZE,options, &parseError, &status); @@ -1227,8 +1291,8 @@ void TestIDNA::testChaining(UChar* src,int32_t numIterations,const char* testNam if(U_FAILURE(status)){ errln("%s null terminated source with options set failed. Error: %s\n",testName, u_errorName(status)); } - uprv_memcpy(odd,expected,(expectedLen+1) * U_SIZEOF_UCHAR); - uprv_memcpy(even,expected,(expectedLen+1) * U_SIZEOF_UCHAR); + memcpy(odd,expected,(expectedLen+1) * U_SIZEOF_UCHAR); + memcpy(even,expected,(expectedLen+1) * U_SIZEOF_UCHAR); for(;i<=numIterations; i++){ if((i%2) ==0){ evenLen = func(odd,oddLen,even,MAX_DEST_SIZE,options|UIDNA_ALLOW_UNASSIGNED, &parseError, &status); @@ -1264,7 +1328,7 @@ void TestIDNA::testChaining(const char* toASCIIName, TestFunc toASCII, UChar buf[MAX_DEST_SIZE]; for(i=0;i< (int32_t)(sizeof(asciiIn)/sizeof(asciiIn[0])); i++){ - u_charsToUChars(asciiIn[i],buf, uprv_strlen(asciiIn[i])+1); + u_charsToUChars(asciiIn[i],buf, (int32_t)(strlen(asciiIn[i])+1)); testChaining(buf,5,toUnicodeName, FALSE, FALSE, toUnicode); } for(i=0;i< (int32_t)(sizeof(unicodeIn)/sizeof(unicodeIn[0])); i++){ @@ -1303,7 +1367,7 @@ void TestIDNA::testRootLabelSeparator(const char* testName, CompareFunc func, for(i=0;i< (int32_t)(sizeof(unicodeIn)/sizeof(unicodeIn[0])); i++){ - u_charsToUChars(asciiIn[i],buf+4, uprv_strlen(asciiIn[i])+1); + u_charsToUChars(asciiIn[i],buf+4, (int32_t)(strlen(asciiIn[i])+1)); u_strcat(buf,com); // for every entry in unicodeIn array @@ -1312,15 +1376,17 @@ void TestIDNA::testRootLabelSeparator(const char* testName, CompareFunc func, source.append(unicodeIn[i]); source.append(com); source.append((UChar)0x0000); - // a) compare it with itself + const UChar* src = source.getBuffer(); int32_t srcLen = u_strlen(src); //subtract null - - testCompare(src,srcLen,src,srcLen,testName, func,TRUE); // b) compare it with asciiIn equivalent testCompare(src,srcLen,buf,u_strlen(buf),testName, func,TRUE); + // a) compare it with itself + testCompare(src,srcLen,src,srcLen,testName, func,TRUE); + + // IDNToASCII comparison testAPI(src,buf,IDNToASCIIName,FALSE,U_ZERO_ERROR,TRUE, TRUE, IDNToASCII); // IDNToUnicode comparison @@ -1386,7 +1452,7 @@ void TestIDNA::TestCompare(){ testCompare("uidna_compare",uidna_compare); } void TestIDNA::TestErrorCases(){ - testErrorCases("uidna_toASCII",uidna_toASCII, "uidna_IDNToASCII",uidna_IDNToASCII, + testErrorCases( "uidna_IDNToASCII",uidna_IDNToASCII, "uidna_IDNToUnicode",uidna_IDNToUnicode); } void TestIDNA::TestRootLabelSeparator(){ @@ -1452,77 +1518,173 @@ void getTestSource(UnicodeString& fillIn) { } } -void TestIDNA::testCompareReferenceImpl(const UChar* src, int32_t srcLen){ + +UnicodeString TestIDNA::testCompareReferenceImpl(UnicodeString& src, + TestFunc refIDNA, const char* refIDNAName, + TestFunc uIDNA, const char* uIDNAName, + int32_t options){ + + const UChar* srcUChars = src.getBuffer(); + UChar exp[MAX_DEST_SIZE]={0}; + int32_t expCap = MAX_DEST_SIZE, expLen=0; + UErrorCode expStatus = U_ZERO_ERROR; + UParseError parseError; + + logln("Comparing "+ UnicodeString(refIDNAName) + + " with "+ UnicodeString(uIDNAName) + +" for input: " + prettify(srcUChars)); - UnicodeString label, idn("www."); + expLen = refIDNA(srcUChars, src.length()-1, exp, expCap, + options, &parseError, &expStatus); + + UChar got[MAX_DEST_SIZE]={0}; + int32_t gotCap = MAX_DEST_SIZE, gotLen=0; + UErrorCode gotStatus = U_ZERO_ERROR; + + gotLen = uIDNA(srcUChars, src.length()-1, got, gotCap, + options, &parseError, &gotStatus); + + if(expStatus != gotStatus){ + errln("Did not get the expected status while comparing " + UnicodeString(refIDNAName) + + " with " + UnicodeString(uIDNAName) + + " Expected: " + UnicodeString(u_errorName(expStatus)) + + " Got: " + UnicodeString(u_errorName(gotStatus)) + + " for Source: "+ prettify(srcUChars) + + " Options: " + options); + src.releaseBuffer(); + return UnicodeString(""); + } - label.append(src, srcLen); - label.append((UChar)0x0000); - - { - - const UChar* labelUChars = label.getBuffer(); - UChar ascii[MAX_DEST_SIZE]={0}; - int32_t asciiCapacity = MAX_DEST_SIZE, asciiLen=0; - UChar uni[MAX_DEST_SIZE]={0}; - int32_t uniCapacity = MAX_DEST_SIZE, uniLen=0; - UErrorCode expectedStatus = U_ZERO_ERROR; - UParseError parseError; - //ascii[0] = uni[0] =0; - logln("Comparing idnaref_toASCII with uidna_toASCII for input: " + prettify(label)); - - asciiLen = idnaref_toASCII(labelUChars, label.length()-1,ascii,asciiCapacity, - UIDNA_DEFAULT,&parseError,&expectedStatus); - - if(expectedStatus == U_IDNA_UNASSIGNED_CODEPOINT_FOUND_ERROR){ - expectedStatus = U_ZERO_ERROR; - asciiLen = idnaref_toASCII(labelUChars, label.length()-1,ascii,asciiCapacity, - UIDNA_ALLOW_UNASSIGNED,&parseError,&expectedStatus); - expectedStatus = U_IDNA_UNASSIGNED_CODEPOINT_FOUND_ERROR; + // now we know that both implementations yielded same error + if(U_SUCCESS(expStatus)){ + // compare the outputs if status == U_ZERO_ERROR + if(u_strCompare(exp, expLen, got, gotLen, TRUE) != 0){ + errln("Did not get the expected output while comparing " + UnicodeString(refIDNAName) + + " with " + UnicodeString(uIDNAName) + + " Expected: " + prettify(UnicodeString(exp, expLen)) + + " Got: " + prettify(UnicodeString(got, gotLen)) + + " for Source: "+ prettify(srcUChars) + + " Options: " + options); } + src.releaseBuffer(); + return UnicodeString(exp, expLen); - testAPI(labelUChars,ascii, "uidna_toASCII",FALSE, - expectedStatus,TRUE, TRUE, uidna_toASCII); - if(expectedStatus == U_ZERO_ERROR){ - logln("Comparing idnaref_toUnicode with uidna_toUnicode for input: " + prettify(label)); - expectedStatus = U_ZERO_ERROR; - uniLen = idnaref_toUnicode(ascii, asciiLen, uni,uniCapacity,UIDNA_DEFAULT, - &parseError,&expectedStatus); - if(expectedStatus == U_IDNA_UNASSIGNED_CODEPOINT_FOUND_ERROR){ - expectedStatus = U_ZERO_ERROR; - uniLen = idnaref_toUnicode(ascii, asciiLen, uni,uniCapacity,UIDNA_DEFAULT, - &parseError,&expectedStatus); - expectedStatus = U_IDNA_UNASSIGNED_CODEPOINT_FOUND_ERROR; - } - testAPI(ascii,uni,"uidna_toUnicode",FALSE,expectedStatus,TRUE, FALSE, uidna_toUnicode); - } + }else{ + logln("Got the same error while comparing " + + UnicodeString(refIDNAName) + + " with "+ UnicodeString(uIDNAName) + +" for input: " + prettify(srcUChars)); + } + src.releaseBuffer(); + return UnicodeString(""); +} + +void TestIDNA::testCompareReferenceImpl(const UChar* src, int32_t srcLen){ + UnicodeString label(src,srcLen); + label.append((UChar)0x0000); + + //test idnaref_toASCII and idnare + UnicodeString asciiLabel = testCompareReferenceImpl(label, + idnaref_toASCII, "idnaref_toASCII", + uidna_toASCII, "uidna_toASCII", + UIDNA_ALLOW_UNASSIGNED); + testCompareReferenceImpl(label, + idnaref_toASCII, "idnaref_toASCII", + uidna_toASCII, "uidna_toASCII", + UIDNA_DEFAULT); + testCompareReferenceImpl(label, + idnaref_toASCII, "idnaref_toASCII", + uidna_toASCII, "uidna_toASCII", + UIDNA_USE_STD3_RULES); + testCompareReferenceImpl(label, + idnaref_toASCII, "idnaref_toASCII", + uidna_toASCII, "uidna_toASCII", + UIDNA_USE_STD3_RULES | UIDNA_ALLOW_UNASSIGNED); + + if(asciiLabel.length()!=0){ + asciiLabel.append((UChar)0x0000); + + // test toUnciode + testCompareReferenceImpl(asciiLabel, + idnaref_toUnicode, "idnaref_toUnicode", + uidna_toUnicode, "uidna_toUnicode", + UIDNA_ALLOW_UNASSIGNED); + testCompareReferenceImpl(asciiLabel, + idnaref_toUnicode, "idnaref_toUnicode", + uidna_toUnicode, "uidna_toUnicode", + UIDNA_DEFAULT); + testCompareReferenceImpl(asciiLabel, + idnaref_toUnicode, "idnaref_toUnicode", + uidna_toUnicode, "uidna_toUnicode", + UIDNA_USE_STD3_RULES); + testCompareReferenceImpl(asciiLabel, + idnaref_toUnicode, "idnaref_toUnicode", + uidna_toUnicode, "uidna_toUnicode", + UIDNA_USE_STD3_RULES | UIDNA_ALLOW_UNASSIGNED); } } +const char* failures[] ={ + "\\uAA42\\U0001F8DD\\U00019D01\\U000149A3\\uD385\\U000EE0F5\\U00018B92\\U000179D1\\U00018624\\U0002227F\\U000E83C0\\U000E8DCD\\u5460\\U00017F34\\U0001570B\\u43D1\\U0002C9C9\\U000281EC\\u2105\\U000180AE\\uC5D4", + "\\U0002F5A6\\uD638\\u0D0A\\u9E9C\\uFE5B\\U0001FCCB\\u66C4", +}; + void TestIDNA::TestIDNAMonkeyTest(){ UnicodeString source; UErrorCode status = U_ZERO_ERROR; + int i; getInstance(status); // Init prep - for(int i=0; i<loopCount; i++){ + for(i=0; i<loopCount; i++){ source.truncate(0); getTestSource(source); source.append((UChar)0x0000); - testCompareReferenceImpl(source.getBuffer(),source.length()-1); + const UChar* src = source.getBuffer(); + testCompareReferenceImpl(src,source.length()-1); + testCompareReferenceImpl(src,source.length()-1); + source.releaseBuffer(); + } + + /* for debugging */ + for (i=0; i<(int)(sizeof(failures)/sizeof(failures[0])); i++){ + source.truncate(0); + source.append( failures[i] ); + source = source.unescape(); + source.append((UChar)0x0000); + const UChar *src = source.getBuffer(); + testCompareReferenceImpl(src,source.length()-1); + //debug(source.getBuffer(),source.length(),UIDNA_ALLOW_UNASSIGNED); source.releaseBuffer(); } - /* for debugging - source.append("\\U000E5BC8\\U00025112\\U00016846\\U0001B375\\U0002EDE4" - "\\U00016E18\\U00010B84\\U000E1639\\U0001C3BE\\u336B\\u5F66" - "\\u2AA6\\uD817\\u0000"); - source = source.unescape(); - testCompareReferenceImpl(source.getBuffer(),source.length()-1); + + + source.truncate(0); + source.append("\\uCF18\\U00021161\\U000EEF11\\U0002BB82\\U0001D63C"); + debug(source.getBuffer(),source.length(),UIDNA_ALLOW_UNASSIGNED); source.releaseBuffer(); - */ + + { // test deletion of code points + UnicodeString source("\\u043f\\u00AD\\u034f\\u043e\\u0447\\u0435\\u043c\\u0443\\u0436\\u0435\\u043e\\u043d\\u0438\\u043d\\u0435\\u0433\\u043e\\u0432\\u043e\\u0440\\u044f\\u0442\\u043f\\u043e\\u0440\\u0443\\u0441\\u0441\\u043a\\u0438\\u0000"); + source = source.unescape(); + UnicodeString expected("\\u043f\\u043e\\u0447\\u0435\\u043c\\u0443\\u0436\\u0435\\u043e\\u043d\\u0438\\u043d\\u0435\\u0433\\u043e\\u0432\\u043e\\u0440\\u044f\\u0442\\u043f\\u043e\\u0440\\u0443\\u0441\\u0441\\u043a\\u0438\\u0000"); + expected = expected.unescape(); + UnicodeString ascii("xn--b1abfaaepdrnnbgefbadotcwatmq2g4l"); + ascii.append((UChar)0x0000); + testAPI(source.getBuffer(),ascii.getBuffer(), "uidna_toASCII", FALSE, U_ZERO_ERROR, TRUE, TRUE, uidna_toASCII); + source.releaseBuffer(); + ascii.releaseBuffer(); + + testAPI(source.getBuffer(),ascii.getBuffer(), "idnaref_toASCII", FALSE, U_ZERO_ERROR, TRUE, TRUE, idnaref_toASCII); + source.releaseBuffer(); + ascii.releaseBuffer(); + + + testCompareReferenceImpl(source.getBuffer(), source.length()-1); + source.releaseBuffer(); + + } - delete TestIDNA::prep; - TestIDNA::prep = NULL; } void TestIDNA::TestCompareReferenceImpl(){ @@ -1535,7 +1697,7 @@ void TestIDNA::TestCompareReferenceImpl(){ if(quick==TRUE && i> 0x1FFFF){ return; } - if(i >= 0x30000){ + if(i >= 0x30000 && i <= 0xF0000){ i+=0xB0000; } if(i>0xFFFF){ @@ -1557,7 +1719,7 @@ void TestIDNA::TestRefIDNA(){ testIDNToASCII("idnaref_IDNToASCII", idnaref_IDNToASCII); testIDNToUnicode("idnaref_IDNToUnicode", idnaref_IDNToUnicode); testCompare("idnaref_compare",idnaref_compare); - testErrorCases("idnaref_toASCII",idnaref_toASCII, "idnaref_IDNToASCII",idnaref_IDNToASCII, + testErrorCases( "idnaref_IDNToASCII",idnaref_IDNToASCII, "idnaref_IDNToUnicode",idnaref_IDNToUnicode); testChaining("idnaref_toASCII",idnaref_toASCII, "idnaref_toUnicode", idnaref_toUnicode); @@ -1566,12 +1728,30 @@ void TestIDNA::TestRefIDNA(){ "idnaref_IDNToUnicode",idnaref_IDNToUnicode ); testChaining("idnaref_toASCII",idnaref_toASCII, "idnaref_toUnicode", idnaref_toUnicode); - delete TestIDNA::prep; - TestIDNA::prep = NULL; } void TestIDNA::TestDataFile(){ testData(*this); } +TestIDNA::~TestIDNA(){ + if(gPrep!=NULL){ + delete gPrep; + gPrep = NULL; + } +} +NamePrepTransform* TestIDNA::gPrep = NULL; + +NamePrepTransform* TestIDNA::getInstance(UErrorCode& status){ + if(TestIDNA::gPrep == NULL){ + UParseError parseError; + TestIDNA::gPrep = NamePrepTransform::createInstance(parseError, status); + if(TestIDNA::gPrep ==NULL){ + //status = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + } + return TestIDNA::gPrep; + +} #endif /* #if !UCONFIG_NO_IDNA */ diff --git a/icuSources/test/intltest/testidna.h b/icuSources/test/intltest/testidna.h index 3bfe8070..e20d8087 100644 --- a/icuSources/test/intltest/testidna.h +++ b/icuSources/test/intltest/testidna.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * - * Copyright (C) 2003, International Business Machines + * Copyright (C) 2003-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -21,18 +21,18 @@ #if !UCONFIG_NO_IDNA && !UCONFIG_NO_TRANSLITERATION -#include "sprpimpl.h" #include "intltest.h" #include "unicode/parseerr.h" +#include "unicode/uidna.h" U_CDECL_BEGIN typedef int32_t -(*TestFunc) ( const UChar *src, int32_t srcLength, +(U_EXPORT2 *TestFunc) ( const UChar *src, int32_t srcLength, UChar *dest, int32_t destCapacity, int32_t options, UParseError *parseError, UErrorCode *status); typedef int32_t -(*CompareFunc) (const UChar *s1, int32_t s1Len, +(U_EXPORT2 *CompareFunc) (const UChar *s1, int32_t s1Len, const UChar *s2, int32_t s2Len, int32_t options, UErrorCode *status); @@ -65,7 +65,9 @@ public: void TestIDNAMonkeyTest(); void TestConformance(); static NamePrepTransform* getInstance(UErrorCode& status); - static NamePrepTransform* prep; + static NamePrepTransform* gPrep; + virtual ~TestIDNA(); + private: void testToASCII(const char* testName, TestFunc func); void testToUnicode(const char* testName, TestFunc func); @@ -74,19 +76,18 @@ private: void testCompare(const char* testName, CompareFunc func); void testChaining(const char* toASCIIName, TestFunc toASCII, const char* toUnicodeName, TestFunc toUnicode); - + void debug(const UChar* src, int32_t srcLength, int32_t options); // main testing functions void testAPI(const UChar *src, const UChar *expected, const char *testName, UBool useSTD3ASCIIRules, UErrorCode expectedStatus, - UBool doCompare, UBool testUnassigned, TestFunc func); + UBool doCompare, UBool testUnassigned, TestFunc func, UBool testSTD3ASCIIRules=TRUE); void testCompare(const UChar* s1, int32_t s1Len, const UChar* s2, int32_t s2Len, const char* testName, CompareFunc func, UBool isEqual); - void testErrorCases(const char* toASCIIName, TestFunc toASCII, - const char* IDNToASCIIName, TestFunc IDNToASCII, + void testErrorCases(const char* IDNToASCIIName, TestFunc IDNToASCII, const char* IDNToUnicodeName, TestFunc IDNToUnicode); void testChaining(UChar* src,int32_t numIterations,const char* testName, @@ -97,6 +98,11 @@ private: const char* IDNToUnicodeName, TestFunc IDNToUnicode); void testCompareReferenceImpl(const UChar* src, int32_t srcLen); + + UnicodeString testCompareReferenceImpl(UnicodeString& src, + TestFunc refIDNA, const char* refIDNAName, + TestFunc uIDNA, const char* uIDNAName, + int32_t options); void testConformance(const char* toASCIIName, TestFunc toASCII, const char* IDNToASCIIName, TestFunc IDNToASCII, diff --git a/icuSources/test/intltest/textfile.cpp b/icuSources/test/intltest/textfile.cpp new file mode 100644 index 00000000..fe193b0f --- /dev/null +++ b/icuSources/test/intltest/textfile.cpp @@ -0,0 +1,179 @@ +/* +********************************************************************** +* Copyright (c) 2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Author: Alan Liu +* Created: March 19 2004 +* Since: ICU 3.0 +********************************************************************** +*/ +#include "textfile.h" +#include "cmemory.h" +#include "cstring.h" +#include "intltest.h" +#include "util.h" + +// If the symbol CCP is defined, then the 'name' and 'encoding' +// constructor parameters are copied. Otherwise they are aliased. +// #define CCP + +TextFile::TextFile(const char* _name, const char* _encoding, UErrorCode& ec) : + file(0), + name(0), encoding(0), + buffer(0), + capacity(0), + lineNo(0) +{ + if (U_FAILURE(ec) || _name == 0 || _encoding == 0) { + if (U_SUCCESS(ec)) { + ec = U_ILLEGAL_ARGUMENT_ERROR; + } + return; + } + +#ifdef CCP + name = uprv_malloc(uprv_strlen(_name) + 1); + encoding = uprv_malloc(uprv_strlen(_encoding) + 1); + if (name == 0 || encoding == 0) { + ec = U_MEMORY_ALLOCATION_ERROR; + return; + } + uprv_strcpy(name, _name); + uprv_strcpy(encoding, _encoding); +#else + name = (char*) _name; + encoding = (char*) _encoding; +#endif + + const char* testDir = IntlTest::getSourceTestData(ec); + if (U_FAILURE(ec)) { + return; + } + if (!ensureCapacity((int32_t)(uprv_strlen(testDir) + uprv_strlen(name) + 1))) { + ec = U_MEMORY_ALLOCATION_ERROR; + return; + } + uprv_strcpy(buffer, testDir); + uprv_strcat(buffer, name); + + file = T_FileStream_open(buffer, "rb"); + if (file == 0) { + ec = U_ILLEGAL_ARGUMENT_ERROR; + return; + } +} + +TextFile::~TextFile() { + if (file != 0) T_FileStream_close(file); + if (buffer != 0) uprv_free(buffer); +#ifdef CCP + uprv_free(name); + uprv_free(encoding); +#endif +} + +UBool TextFile::readLine(UnicodeString& line, UErrorCode& ec) { + if (T_FileStream_eof(file)) { + return FALSE; + } + // Note: 'buffer' may change after ensureCapacity() is called, + // so don't use + // p=buffer; *p++=c; + // but rather + // i=; buffer[i++]=c; + int32_t n = 0; + for (;;) { + int c = T_FileStream_getc(file); // sic: int, not int32_t + if (c < 0 || c == 0xD || c == 0xA) { + // consume 0xA following 0xD + if (c == 0xD) { + c = T_FileStream_getc(file); + if (c != 0xA && c >= 0) { + T_FileStream_ungetc(c, file); + } + } + break; + } + if (!setBuffer(n++, c, ec)) return FALSE; + } + if (!setBuffer(n++, 0, ec)) return FALSE; + UnicodeString str(buffer, encoding); + // Remove BOM in first line, if present + if (lineNo == 0 && str[0] == 0xFEFF) { + str.remove(0, 1); + } + ++lineNo; + line = str.unescape(); + return TRUE; +} + +UBool TextFile::readLineSkippingComments(UnicodeString& line, UErrorCode& ec, + UBool trim) { + for (;;) { + if (!readLine(line, ec)) return FALSE; + // Skip over white space + int32_t pos = 0; + ICU_Utility::skipWhitespace(line, pos, TRUE); + // Ignore blank lines and comment lines + if (pos == line.length() || line.charAt(pos) == 0x23/*'#'*/) { + continue; + } + // Process line + if (trim) line.remove(0, pos); + return TRUE; + } +} + +/** + * Set buffer[index] to c, growing buffer if necessary. Return TRUE if + * successful. + */ +UBool TextFile::setBuffer(int32_t index, char c, UErrorCode& ec) { + if (capacity <= index) { + if (!ensureCapacity(index+1)) { + ec = U_MEMORY_ALLOCATION_ERROR; + return FALSE; + } + } + buffer[index] = c; + return TRUE; +} + +/** + * Make sure that 'buffer' has at least 'mincapacity' bytes. + * Return TRUE upon success. Upon return, 'buffer' may change + * value. In any case, previous contents are preserved. + */ +UBool TextFile::ensureCapacity(int32_t mincapacity) { + if (capacity >= mincapacity) { + return TRUE; + } + + // Grow by factor of 2 to prevent frequent allocation + // Note: 'capacity' may be 0 + int32_t i; + for (i = capacity || 1024; i < mincapacity; ) { + i <<= 1; + if (i < 0) { + i = 0x7FFFFFFF; + break; + } + } + mincapacity = i; + + // Simple realloc() no good; contents not preserved + // Note: 'buffer' may be 0 + char* newbuffer = (char*) uprv_malloc(mincapacity); + if (newbuffer == 0) { + return FALSE; + } + if (buffer != 0) { + uprv_strncpy(newbuffer, buffer, capacity); + uprv_free(buffer); + } + buffer = newbuffer; + capacity = mincapacity; + return TRUE; +} + diff --git a/icuSources/test/intltest/textfile.h b/icuSources/test/intltest/textfile.h new file mode 100644 index 00000000..9111eebf --- /dev/null +++ b/icuSources/test/intltest/textfile.h @@ -0,0 +1,73 @@ +/* +********************************************************************** +* Copyright (c) 2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Author: Alan Liu +* Created: March 19 2004 +* Since: ICU 3.0 +********************************************************************** +*/ +#ifndef __ICU_INTLTEST_TEXTFILE__ +#define __ICU_INTLTEST_TEXTFILE__ + +#include "unicode/utypes.h" +#include "unicode/unistr.h" +#include "filestrm.h" + +/** + * This class implements access to a text data file located in the + * icu/source/test/testdata/ directory. + */ +class TextFile { + public: + /** + * Open a file with the given name, in the given encoding, in the + * ICU testdata directory. See textfile.cpp to determine if the + * 'name' and 'encoding' parameters are aliased or copied. + */ + TextFile(const char* name, const char* encoding, UErrorCode& ec); + + virtual ~TextFile(); + + /** + * Read a line terminated by ^J or ^M or ^M^J, and convert it from + * this file's encoding to Unicode. The EOL character(s) are not + * included in 'line'. + * @return TRUE if a line was read, or FALSE if the EOF + * was reached or an error occurred + */ + UBool readLine(UnicodeString& line, UErrorCode& ec); + + /** + * Read a line, ignoring blank lines and lines that start with + * '#'. Trim leading white space. + * @param trim if TRUE then remove leading rule white space + * @return TRUE if a line was read, or FALSE if the EOF + * was reached or an error occurred + */ + UBool readLineSkippingComments(UnicodeString& line, UErrorCode& ec, + UBool trim = FALSE); + + /** + * Return the line number of the last line returned by readLine(). + */ + inline int32_t getLineNumber() const; + + private: + UBool ensureCapacity(int32_t capacity); + UBool setBuffer(int32_t index, char c, UErrorCode& ec); + + FileStream* file; + char* name; + char* encoding; + char* buffer; + int32_t capacity; + int32_t lineNo; +}; + +inline int32_t TextFile::getLineNumber() const { + return lineNo; +} + +#endif diff --git a/icuSources/test/intltest/tfsmalls.cpp b/icuSources/test/intltest/tfsmalls.cpp index a109fd01..67649920 100644 --- a/icuSources/test/intltest/tfsmalls.cpp +++ b/icuSources/test/intltest/tfsmalls.cpp @@ -1,9 +1,9 @@ -/******************************************************************** +/*********************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ + * Copyright (c) 1997-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ***********************************************************************/ #include "unicode/utypes.h" @@ -19,6 +19,7 @@ #include "unicode/fieldpos.h" #include "unicode/fmtable.h" +#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) /*static UBool chkstatus( UErrorCode &status, char* msg = NULL ) { @@ -31,7 +32,7 @@ void test_ParsePosition( void ) { ParsePosition* pp1 = new ParsePosition(); if (pp1 && (pp1->getIndex() == 0)) { - it_out << "PP constructor() tested." << endl; + it_logln("PP constructor() tested."); }else{ it_errln("*** PP getIndex or constructor() result"); } @@ -42,13 +43,13 @@ void test_ParsePosition( void ) int32_t to = 5; ParsePosition pp2( to ); if (pp2.getIndex() == 5) { - it_out << "PP getIndex and constructor(int32_t) tested." << endl; + it_logln("PP getIndex and constructor(int32_t) tested."); }else{ it_errln("*** PP getIndex or constructor(int32_t) result"); } pp2.setIndex( 3 ); if (pp2.getIndex() == 3) { - it_out << "PP setIndex tested." << endl; + it_logln("PP setIndex tested."); }else{ it_errln("*** PP getIndex or setIndex result"); } @@ -59,7 +60,7 @@ void test_ParsePosition( void ) pp3 = 5; ParsePosition pp4( pp3 ); if ((pp2 != pp3) && (pp3 == pp4)) { - it_out << "PP copy contructor, operator== and operator != tested." << endl; + it_logln("PP copy contructor, operator== and operator != tested."); }else{ it_errln("*** PP operator== or operator != result"); } @@ -67,7 +68,7 @@ void test_ParsePosition( void ) ParsePosition pp5; pp5 = pp4; if ((pp4 == pp5) && (!(pp4 != pp5))) { - it_out << "PP operator= tested." << endl; + it_logln("PP operator= tested."); }else{ it_errln("*** PP operator= operator== or operator != result"); } @@ -102,11 +103,11 @@ void test_FieldPosition_example( void ) int32_t tempOffset = (tempLen <= (tempLen - pos.getEndIndex())) ? tempLen : (tempLen - pos.getEndIndex()); temp[tempOffset] = '\0'; - it_out << "FP " << temp << res << endl; + it_logln(UnicodeString("FP ") + UnicodeString(temp) + res); } delete fmt; - it_out << endl; + it_logln(""); } @@ -116,7 +117,7 @@ void test_FieldPosition( void ) FieldPosition fp( 7 ); if (fp.getField() == 7) { - it_out << "FP constructor(int32_t) and getField tested." << endl; + it_logln("FP constructor(int32_t) and getField tested."); }else{ it_errln("*** FP constructor(int32_t) or getField"); } @@ -137,22 +138,22 @@ void test_FieldPosition( void ) if (fp.getEndIndex() != i+7) err3 = TRUE; } if (!err1) { - it_out << "FP setField and getField tested." << endl; + it_logln("FP setField and getField tested."); }else{ it_errln("*** FP setField or getField"); } if (!err2) { - it_out << "FP setBeginIndex and getBeginIndex tested." << endl; + it_logln("FP setBeginIndex and getBeginIndex tested."); }else{ it_errln("*** FP setBeginIndex or getBeginIndex"); } if (!err3) { - it_out << "FP setEndIndex and getEndIndex tested." << endl; + it_logln("FP setEndIndex and getEndIndex tested."); }else{ it_errln("*** FP setEndIndex or getEndIndex"); } - it_out << endl; + it_logln(""); } @@ -167,27 +168,27 @@ void test_Formattable( void ) Formattable fta, ftb; fta.setLong(1); ftb.setLong(2); if ((fta != ftb) || !(fta == ftb)) { - it_out << "FT setLong, operator== and operator!= tested." << endl; + it_logln("FT setLong, operator== and operator!= tested."); }else{ it_errln("*** Formattable setLong or operator== or !="); } fta = ftb; if ((fta == ftb) || !(fta != ftb)) { - it_out << "FT operator= tested." << endl; + it_logln("FT operator= tested."); }else{ it_errln("*** FT operator= or operator== or operator!="); } fta.setDouble( 3.0 ); if ((fta.getType() == Formattable::kDouble) && (fta.getDouble() == 3.0)) { - it_out << "FT set- and getDouble tested." << endl; + it_logln("FT set- and getDouble tested."); }else{ it_errln("*** FT set- or getDouble"); } fta.setDate( 4.0 ); if ((fta.getType() == Formattable::kDate) && (fta.getDate() == 4.0)) { - it_out << "FT set- and getDate tested." << endl; + it_logln("FT set- and getDate tested."); }else{ it_errln("*** FT set- or getDate"); } @@ -195,7 +196,7 @@ void test_Formattable( void ) fta.setString("abc"); UnicodeString res; if ((fta.getType() == Formattable::kString) && (fta.getString(res) == "abc")) { - it_out << "FT set- and getString tested." << endl; + it_logln("FT set- and getString tested."); }else{ it_errln("*** FT set- or getString"); } @@ -212,7 +213,7 @@ void test_Formattable( void ) ucs, ucs_ptr }; - const int32_t ft_cnt = (int32_t)(sizeof(ftarray) / sizeof(Formattable)); + const int32_t ft_cnt = LENGTHOF(ftarray); Formattable ft_arr( ftarray, ft_cnt ); UnicodeString temp; if ((ft_arr[0].getType() == Formattable::kDate) && (ft_arr[0].getDate() == 1.0) @@ -220,28 +221,37 @@ void test_Formattable( void ) && (ft_arr[2].getType() == Formattable::kLong) && (ft_arr[2].getLong() == (int32_t)3) && (ft_arr[3].getType() == Formattable::kString) && (ft_arr[3].getString(temp) == ucs) && (ft_arr[4].getType() == Formattable::kString) && (ft_arr[4].getString(temp) == *ucs_ptr) ) { - it_out << "FT constr. for date, double, long, ustring, ustring* and array tested" << endl; + it_logln("FT constr. for date, double, long, ustring, ustring* and array tested"); }else{ it_errln("*** FT constr. for date, double, long, ustring, ustring* or array"); } - int32_t res_cnt; + int32_t i, res_cnt; const Formattable* res_array = ft_arr.getArray( res_cnt ); if (res_cnt == ft_cnt) { UBool same = TRUE; - for (int32_t i = 0; i < res_cnt; i++ ) { + for (i = 0; i < res_cnt; i++ ) { if (res_array[i] != ftarray[i]) { same = FALSE; } } if (same) { - it_out << "FT getArray tested" << endl; + it_logln("FT getArray tested"); }else{ it_errln("*** FT getArray comparison"); } }else{ - it_out << res_cnt << " " << ft_cnt << endl; - it_errln("*** FT getArray count"); + it_errln(UnicodeString("*** FT getArray count res_cnt=") + res_cnt + UnicodeString("ft_cnt=") + ft_cnt); + } + + + Formattable *pf; + for(i = 0; i < ft_cnt; ++i) { + pf = ftarray[i].clone(); + if(pf == (ftarray + i) || *pf != ftarray[i]) { + it_errln("Formattable.clone() failed for item %d" + i); + } + delete pf; } const Formattable ftarr1[] = { Formattable( (int32_t)1 ), Formattable( (int32_t)2 ) }; @@ -252,18 +262,18 @@ void test_Formattable( void ) ft_arr.setArray( ftarr1, ftarr1_cnt ); if ((ft_arr[0].getType() == Formattable::kLong) && (ft_arr[0].getLong() == (int32_t)1)) { - it_out << "FT setArray tested" << endl; + it_logln("FT setArray tested"); }else{ it_errln("*** FT setArray"); } Formattable* ft_dynarr = new Formattable[ftarr2_cnt]; - for (int32_t i = 0; i < ftarr2_cnt; i++ ) { + for (i = 0; i < ftarr2_cnt; i++ ) { ft_dynarr[i] = ftarr2[i]; } if ((ft_dynarr[0].getType() == Formattable::kLong) && (ft_dynarr[0].getLong() == (int32_t)3) && (ft_dynarr[1].getType() == Formattable::kLong) && (ft_dynarr[1].getLong() == (int32_t)4)) { - it_out << "FT operator= and array operations tested" << endl; + it_logln("FT operator= and array operations tested"); }else{ it_errln("*** FT operator= or array operations"); } @@ -271,7 +281,7 @@ void test_Formattable( void ) ft_arr.adoptArray( ft_dynarr, ftarr2_cnt ); if ((ft_arr[0].getType() == Formattable::kLong) && (ft_arr[0].getLong() == (int32_t)3) && (ft_arr[1].getType() == Formattable::kLong) && (ft_arr[1].getLong() == (int32_t)4)) { - it_out << "FT adoptArray tested" << endl; + it_logln("FT adoptArray tested"); }else{ it_errln("*** FT adoptArray or operator[]"); } @@ -283,14 +293,13 @@ void test_Formattable( void ) fta.adoptString( ucs_dyn ); if ((fta.getType() == Formattable::kString) && (fta.getString(tmp2) == "ttt")) { - it_out << "FT adoptString tested" << endl; + it_logln("FT adoptString tested"); }else{ it_errln("*** FT adoptString or getString"); } fta.setLong(0); // calls 'dispose' and deletes adopted string ! - it_out << endl; - + it_logln(); } void TestFormatSmallClasses::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) diff --git a/icuSources/test/intltest/thcoll.cpp b/icuSources/test/intltest/thcoll.cpp index 60cdc1dc..1fe5be78 100644 --- a/icuSources/test/intltest/thcoll.cpp +++ b/icuSources/test/intltest/thcoll.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -16,37 +16,28 @@ #include "unicode/utypes.h" #include "unicode/coll.h" #include "unicode/sortkey.h" +#include "unicode/ustring.h" #include "cstring.h" #include "filestrm.h" +#include "textfile.h" /** * The TestDictionary test expects a file of this name, with this * encoding, to be present in the directory $ICU/source/test/testdata. */ -#define TEST_FILE "th18057.txt" -#define TEST_FILE_ENCODING "UTF8" +//#define TEST_FILE "th18057.txt" /** * This is the most failures we show in TestDictionary. If this number * is < 0, we show all failures. */ -#define MAX_FAILURES_TO_SHOW 8 - -#define CASE(id,test) \ - case id: \ - name = #test; \ - if (exec) { \ - logln(#test "---"); \ - logln((UnicodeString)""); \ - test(); \ - } \ - break; +#define MAX_FAILURES_TO_SHOW -1 CollationThaiTest::CollationThaiTest() { UErrorCode status = U_ZERO_ERROR; coll = Collator::createInstance(Locale("th", "TH", ""), status); if (coll && U_SUCCESS(status)) { - coll->setStrength(Collator::TERTIARY); + //coll->setStrength(Collator::TERTIARY); } else { delete coll; coll = 0; @@ -67,39 +58,15 @@ void CollationThaiTest::runIndexedTest(int32_t index, UBool exec, const char* &n } switch (index) { - CASE(0,TestDictionary) - CASE(1,TestCornerCases) - CASE(2,TestNamesList) + TESTCASE(0,TestDictionary); + TESTCASE(1,TestCornerCases); + TESTCASE(2,TestNamesList); + TESTCASE(3,TestInvalidThai); + TESTCASE(4,TestReordering); default: name = ""; break; } } -/** - * Read a line terminated by a single ^J or ^M, and convert it from - * the TEST_FILE_ENCODING to Unicode. ASSUMES FILE LINES ARE 127 - * characters long or less. This is true for th18057.txt, which - * has 80-char or shorter lines. DOES NOT HANDLE ^M^J sequence. - */ -static UBool readLine(FileStream *in, UnicodeString& line, const char* encoding) { - if (T_FileStream_eof(in)) { - return FALSE; - } - char buffer[128]; - char* p = buffer; - char* limit = p + sizeof(buffer) - 1; // Leave space for 0 - while (p<limit) { - int c = T_FileStream_getc(in); - if (c < 0 || c == 0xD || c == 0xA) { - break; - } - *p++ = c; - } - *p = 0; - line = UnicodeString(buffer, encoding); - return TRUE; -} - - /** * Read the external names list, and confirms that the collator * gets the same results when comparing lines one to another @@ -111,28 +78,12 @@ void CollationThaiTest::TestNamesList(void) { return; } - // Read in a dictionary of Thai words - UErrorCode status = U_ZERO_ERROR; - char buffer[1024]; - uprv_strcpy(buffer,IntlTest::loadTestData(status) ); - char* index = 0; - - if (U_FAILURE(status)) { - errln("ERROR: could not open test data %s", u_errorName(status)); - return; - } - index=strrchr(buffer,(char)U_FILE_SEP_CHAR); - - if((unsigned int)(index-buffer) != (strlen(buffer)-1)){ - *(index+1)=0; - } - uprv_strcat(buffer,".."U_FILE_SEP_STRING); - uprv_strcat(buffer, "TestNames_Thai.txt"); - - FileStream *in = T_FileStream_open(buffer, "rb"); - if (in == 0) { - logln((UnicodeString)"Could not find file: " + buffer +" will not do this test"); - return; + UErrorCode ec = U_ZERO_ERROR; + TextFile names("TestNames_Thai.txt", "UTF16LE", ec); + if (U_FAILURE(ec)) { + logln("Can't open TestNames_Thai.txt: %s; skipping test", + u_errorName(ec)); + return; } // @@ -140,16 +91,9 @@ void CollationThaiTest::TestNamesList(void) { // word. They should be in sorted order. // UnicodeString lastWord, word; - int32_t line = 0; //int32_t failed = 0; int32_t wordCount = 0; - while (readLine(in, word, "UTF16LE")) { - line++; - - // Skip comments and blank lines - if (word.charAt(0) == 0x23 || word.length() == 0) { - continue; - } + while (names.readLineSkippingComments(word, ec, FALSE) && U_SUCCESS(ec)) { // Show the first 8 words being compared, so we can see what's happening ++wordCount; @@ -165,9 +109,9 @@ void CollationThaiTest::TestNamesList(void) { lastWord = word; } + assertSuccess("readLine", ec); logln((UnicodeString)"Words checked: " + wordCount); - T_FileStream_close(in); } /** @@ -180,29 +124,13 @@ void CollationThaiTest::TestDictionary(void) { errln("Error: could not construct Thai collator"); return; } - - // Read in a dictionary of Thai words - UErrorCode status = U_ZERO_ERROR; - char buffer[1024]; - uprv_strcpy(buffer,IntlTest::loadTestData(status) ); - char* index = 0; - - if (U_FAILURE(status)) { - errln("ERROR: could not open test data %s", u_errorName(status)); - return; - } - index=strrchr(buffer,(char)U_FILE_SEP_CHAR); - - if((unsigned int)(index-buffer) != (strlen(buffer)-1)){ - *(index+1)=0; - } - uprv_strcat(buffer,".."U_FILE_SEP_STRING); - uprv_strcat(buffer, TEST_FILE); - FileStream *in = T_FileStream_open(buffer, "rb"); - if (in == 0) { - errln((UnicodeString)"Error: could not open test file " + buffer); - return; + UErrorCode ec = U_ZERO_ERROR; + TextFile riwords("riwords.txt", "UTF8", ec); + if (U_FAILURE(ec)) { + logln("Can't open riwords.txt: %s; skipping test", + u_errorName(ec)); + return; } // @@ -210,16 +138,9 @@ void CollationThaiTest::TestDictionary(void) { // word. They should be in sorted order. // UnicodeString lastWord, word; - int32_t line = 0; int32_t failed = 0; int32_t wordCount = 0; - while (readLine(in, word, "UTF8")) { - line++; - - // Skip comments and blank lines - if (word.charAt(0) == 0x23 || word.length() == 0) { - continue; - } + while (riwords.readLineSkippingComments(word, ec, FALSE) && U_SUCCESS(ec)) { // Show the first 8 words being compared, so we can see what's happening ++wordCount; @@ -239,7 +160,7 @@ void CollationThaiTest::TestDictionary(void) { UnicodeString str; UnicodeString msg = UnicodeString("--------------------------------------------\n") - + line + + riwords.getLineNumber() + " compare(" + IntlTest::prettify(lastWord, str); msg += UnicodeString(", ") + IntlTest::prettify(word, str) + ") returned " + result @@ -261,17 +182,18 @@ void CollationThaiTest::TestDictionary(void) { lastWord = word; } + assertSuccess("readLine", ec); + if (failed != 0) { if (failed > MAX_FAILURES_TO_SHOW) { errln((UnicodeString)"Too many failures; only the first " + MAX_FAILURES_TO_SHOW + " failures were shown"); } - errln((UnicodeString)"Summary: " + failed + " of " + (line - 1) + + errln((UnicodeString)"Summary: " + failed + " of " + (riwords.getLineNumber() - 1) + " comparisons failed"); } logln((UnicodeString)"Words checked: " + wordCount); - T_FileStream_close(in); } /** @@ -330,18 +252,17 @@ void CollationThaiTest::TestCornerCases(void) { // Internal utilities //------------------------------------------------------------------------ -void CollationThaiTest::compareArray(const Collator& c, const char* tests[], +void CollationThaiTest::compareArray(Collator& c, const char* tests[], int32_t testsLength) { - UErrorCode status = U_ZERO_ERROR; for (int32_t i = 0; i < testsLength; i += 3) { - int32_t expect = 0; + Collator::EComparisonResult expect; if (tests[i+1][0] == '<') { - expect = -1; + expect = Collator::LESS; } else if (tests[i+1][0] == '>') { - expect = 1; + expect = Collator::GREATER; } else if (tests[i+1][0] == '=') { - expect = 0; + expect = Collator::EQUAL; } else { // expect = Integer.decode(tests[i+1]).intValue(); errln((UnicodeString)"Error: unknown operator " + tests[i+1]); @@ -352,6 +273,9 @@ void CollationThaiTest::compareArray(const Collator& c, const char* tests[], parseChars(s1, tests[i]); parseChars(s2, tests[i+2]); + doTest(&c, s1, s2, expect); +#if 0 + UErrorCode status = U_ZERO_ERROR; int32_t result = c.compare(s1, s2); if (sign(result) != sign(expect)) { @@ -393,6 +317,7 @@ void CollationThaiTest::compareArray(const Collator& c, const char* tests[], errln((UnicodeString)" " + prettify(k1, t1) + " vs. " + prettify(k2, t2)); } } +#endif } } @@ -412,4 +337,122 @@ UnicodeString& CollationThaiTest::parseChars(UnicodeString& result, return result = CharsToUnicodeString(chars); } +UCollator *thaiColl = NULL; + +U_CDECL_BEGIN +static int U_CALLCONV +StrCmp(const void *p1, const void *p2) { + return ucol_strcoll(thaiColl, *(UChar **) p1, -1, *(UChar **)p2, -1); +} +U_CDECL_END + + +#define LINES 6 + +void CollationThaiTest::TestInvalidThai(void) { + const char *tests[LINES] = { + "\\u0E44\\u0E01\\u0E44\\u0E01", + "\\u0E44\\u0E01\\u0E01\\u0E44", + "\\u0E01\\u0E44\\u0E01\\u0E44", + "\\u0E01\\u0E01\\u0E44\\u0E44", + "\\u0E44\\u0E44\\u0E01\\u0E01", + "\\u0E01\\u0E44\\u0E44\\u0E01", + }; + + UChar strings[LINES][20]; + + UChar *toSort[LINES]; + + int32_t i = 0, j = 0, len = 0; + + UErrorCode coll_status = U_ZERO_ERROR; + UnicodeString iteratorText; + + thaiColl = ucol_open ("th_TH", &coll_status); + if (U_FAILURE(coll_status)) { + errln("Error opening Thai collator: %s", u_errorName(coll_status)); + return; + } + + CollationElementIterator* c = ((RuleBasedCollator *)coll)->createCollationElementIterator( iteratorText ); + + for(i = 0; i < (int32_t)(sizeof(tests)/sizeof(tests[0])); i++) { + len = u_unescape(tests[i], strings[i], 20); + strings[i][len] = 0; + toSort[i] = strings[i]; + } + + qsort (toSort, LINES, sizeof (UChar *), StrCmp); + + for (i=0; i < LINES; i++) + { + logln("%i", i); + for (j=i+1; j < LINES; j++) { + if (ucol_strcoll (thaiColl, toSort[i], -1, toSort[j], -1) == UCOL_GREATER) + { + // inconsistency ordering found! + errln("Inconsistent ordering between strings %i and %i", i, j); + } + } + iteratorText.setTo(toSort[i]); + c->setText(iteratorText, coll_status); + backAndForth(*c); + } + + + ucol_close(thaiColl); + delete c; +} + +void CollationThaiTest::TestReordering(void) { + const char *tests[] = { + "\\u0E41c\\u0301", "=", "\\u0E41\\u0107", // composition + "\\u0E41\\uD835\\uDFCE", "<", "\\u0E41\\uD835\\uDFCF", // supplementaries + "\\u0E41\\uD834\\uDD5F", "=", "\\u0E41\\uD834\\uDD58\\uD834\\uDD65", // supplementary composition decomps to supplementary + "\\u0E41\\uD87E\\uDC02", "=", "\\u0E41\\u4E41", // supplementary composition decomps to BMP + "\\u0E41\\u0301", "=", "\\u0E41\\u0301", // unsafe (just checking backwards iteration) + "\\u0E41\\u0301\\u0316", "=", "\\u0E41\\u0316\\u0301", + "\\u0e24\\u0e41", "=", "\\u0e41\\u0e24", // exiting contraction bug + "\\u0e3f\\u0e3f\\u0e24\\u0e41", "=", "\\u0e3f\\u0e3f\\u0e41\\u0e24", + + "abc\\u0E41c\\u0301", "=", "abc\\u0E41\\u0107", // composition + "abc\\u0E41\\uD834\\uDC00", "<", "abc\\u0E41\\uD834\\uDC01", // supplementaries + "abc\\u0E41\\uD834\\uDD5F", "=", "abc\\u0E41\\uD834\\uDD58\\uD834\\uDD65", // supplementary composition decomps to supplementary + "abc\\u0E41\\uD87E\\uDC02", "=", "abc\\u0E41\\u4E41", // supplementary composition decomps to BMP + "abc\\u0E41\\u0301", "=", "abc\\u0E41\\u0301", // unsafe (just checking backwards iteration) + "abc\\u0E41\\u0301\\u0316", "=", "abc\\u0E41\\u0316\\u0301", + + "\\u0E41c\\u0301abc", "=", "\\u0E41\\u0107abc", // composition + "\\u0E41\\uD834\\uDC00abc", "<", "\\u0E41\\uD834\\uDC01abc", // supplementaries + "\\u0E41\\uD834\\uDD5Fabc", "=", "\\u0E41\\uD834\\uDD58\\uD834\\uDD65abc", // supplementary composition decomps to supplementary + "\\u0E41\\uD87E\\uDC02abc", "=", "\\u0E41\\u4E41abc", // supplementary composition decomps to BMP + "\\u0E41\\u0301abc", "=", "\\u0E41\\u0301abc", // unsafe (just checking backwards iteration) + "\\u0E41\\u0301\\u0316abc", "=", "\\u0E41\\u0316\\u0301abc", + + "abc\\u0E41c\\u0301abc", "=", "abc\\u0E41\\u0107abc", // composition + "abc\\u0E41\\uD834\\uDC00abc", "<", "abc\\u0E41\\uD834\\uDC01abc", // supplementaries + "abc\\u0E41\\uD834\\uDD5Fabc", "=", "abc\\u0E41\\uD834\\uDD58\\uD834\\uDD65abc", // supplementary composition decomps to supplementary + "abc\\u0E41\\uD87E\\uDC02abc", "=", "abc\\u0E41\\u4E41abc", // supplementary composition decomps to BMP + "abc\\u0E41\\u0301abc", "=", "abc\\u0E41\\u0301abc", // unsafe (just checking backwards iteration) + "abc\\u0E41\\u0301\\u0316abc", "=", "abc\\u0E41\\u0316\\u0301abc", + }; + + compareArray(*coll, tests, sizeof(tests)/sizeof(tests[0])); + + const char *rule = "& c < ab"; + const char *testcontraction[] = { "\\u0E41ab", "<", "\\u0E41c"}; + UnicodeString rules; + UErrorCode status = U_ZERO_ERROR; + parseChars(rules, rule); + RuleBasedCollator *rcoll = new RuleBasedCollator(rules, status); + if(U_SUCCESS(status)) { + compareArray(*rcoll, testcontraction, 3); + delete rcoll; + } else { + errln("Couldn't instantiate collator from rules"); + } + +} + + #endif /* #if !UCONFIG_NO_COLLATION */ diff --git a/icuSources/test/intltest/thcoll.h b/icuSources/test/intltest/thcoll.h index 6b654866..2b10c201 100644 --- a/icuSources/test/intltest/thcoll.h +++ b/icuSources/test/intltest/thcoll.h @@ -49,9 +49,19 @@ private: */ void TestNamesList(void); + /** + * test that invalid Thai sorts properly + */ + void TestInvalidThai(void); + + /** + * test that reording is done properly + */ + void TestReordering(void); + private: - void compareArray(const Collator& c, const char* tests[], + void compareArray(Collator& c, const char* tests[], int32_t testsLength); int8_t sign(int32_t i); diff --git a/icuSources/test/intltest/tmsgfmt.cpp b/icuSources/test/intltest/tmsgfmt.cpp index 566e5f79..fa5d38b3 100644 --- a/icuSources/test/intltest/tmsgfmt.cpp +++ b/icuSources/test/intltest/tmsgfmt.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /* @@ -51,6 +51,7 @@ TestMessageFormat::runIndexedTest(int32_t index, UBool exec, TESTCASE(15,testAdopt); TESTCASE(16,testCopyConstructor2); TESTCASE(17,TestUnlimitedArgsAndSubformats); + TESTCASE(18,TestRBNF); default: name = ""; break; } } @@ -129,9 +130,7 @@ void TestMessageFormat::testBug3() success = U_ZERO_ERROR; ParsePosition parsePos; form->parse(buffer, result, parsePos); -#ifdef _DEBUG - it_out << " -> " /*<< dec*/ /*<< result*/ << "[supposed output for result]" <<endl; -#endif + logln(UnicodeString(" -> ") /* + << dec*/ + toString(result) + UnicodeString("[supposed output for result]")); if (U_FAILURE(success)) { errln("Err: Number Format parse"); logln("Number format parse failed."); @@ -364,17 +363,16 @@ void TestMessageFormat::sample() UnicodeString def("def"); Formattable testArgs1[] = { abc, def }; FieldPosition fieldpos(0); - logln(form->toPattern(buffer1) + "; " + form->format(testArgs1, 2, buffer2, fieldpos, success)); + assertEquals("format", + "There are abc files on def", + form->format(testArgs1, 2, buffer2, fieldpos, success)); + assertSuccess("format", success); delete form; } -/* Who knows what kind of static format we are talking about. */ -void TestMessageFormat::testStaticFormat(/* char* par */) +void TestMessageFormat::testStaticFormat() { - logln("running TestMessageFormat::testStaticFormat"); - UErrorCode err = U_ZERO_ERROR; - GregorianCalendar cal(err); Formattable arguments[] = { (int32_t)7, Formattable(UDate(8.71068e+011), Formattable::kIsDate), @@ -491,7 +489,6 @@ void TestMessageFormat::testMsgFormatChoice(/* char* par */) void TestMessageFormat::testCopyConstructor() { - logln("TestMessageFormat::testCopyConstructor"); UErrorCode success = U_ZERO_ERROR; MessageFormat *x = new MessageFormat("There are {0} files on {1}", success); MessageFormat *z = new MessageFormat("There are {0} files on {1} created", success); @@ -522,7 +519,6 @@ void TestMessageFormat::testCopyConstructor() void TestMessageFormat::testAssignment() { - logln("TestMessageFormat::testAssignment"); UErrorCode success = U_ZERO_ERROR; MessageFormat *x = new MessageFormat("There are {0} files on {1}", success); MessageFormat *z = new MessageFormat("There are {0} files on {1} created", success); @@ -552,7 +548,6 @@ void TestMessageFormat::testAssignment() void TestMessageFormat::testClone() { - logln("TestMessageFormat::testClone"); UErrorCode success = U_ZERO_ERROR; MessageFormat *x = new MessageFormat("There are {0} files on {1}", success); MessageFormat *z = new MessageFormat("There are {0} files on {1} created", success); @@ -582,7 +577,6 @@ void TestMessageFormat::testClone() void TestMessageFormat::testEquals() { - logln("TestMessageFormat::testClone"); UErrorCode success = U_ZERO_ERROR; MessageFormat x("There are {0} files on {1}", success); MessageFormat y("There are {0} files on {1}", success); @@ -607,7 +601,7 @@ void TestMessageFormat::testNotEquals() y.applyPattern("There are {0} files on {1} the disk", success); if (!(x != y)) { errln( "TestMessageFormat::testEquals failed #1"); - logln("First test (operator !=): Failed!"); + logln("Second test (operator !=): Failed!"); } } @@ -883,7 +877,7 @@ void TestMessageFormat::testAdopt() b = formatsCmp[i]; if ((a != NULL) && (b != NULL)) { if (*a == *b) { - logln("formatsChg != formatsCmp at index %d", i); + logln("formatsChg == formatsCmp at index %d", i); diff = FALSE; } } @@ -903,12 +897,8 @@ void TestMessageFormat::testAdopt() return; } -#if 1 - msgCmp.toPattern( patCmp ); - logln("MSG patCmp: " + patCmp); - msg.toPattern( patAct ); - logln("MSG patAct: " + patAct); -#endif + assertEquals("msgCmp.toPattern()", formatStr, msgCmp.toPattern(patCmp.remove())); + assertEquals("msg.toPattern()", formatStr, msg.toPattern(patAct.remove())); for (i = 0; i < countAct; i++) { a = formatsAct[i]; @@ -926,7 +916,6 @@ void TestMessageFormat::testAdopt() } logln("MSG setFormats tested."); - //---- msg.applyPattern( formatStrChange, err ); //set msg formats to something different @@ -951,12 +940,8 @@ void TestMessageFormat::testAdopt() msg.adoptFormats( formatsToAdopt, countCmp ); // function to test delete[] formatsToAdopt; -#if 1 - msgCmp.toPattern( patCmp ); - logln("MSG patCmp: " + patCmp); - msg.toPattern( patAct ); - logln("MSG patAct: " + patAct); -#endif + assertEquals("msgCmp.toPattern()", formatStr, msgCmp.toPattern(patCmp.remove())); + assertEquals("msg.toPattern()", formatStr, msg.toPattern(patAct.remove())); formatsAct = msg.getFormats(countAct); if (!formatsAct || (countAct <=0) || (countAct != countCmp)) { @@ -1006,12 +991,8 @@ void TestMessageFormat::testAdopt() } delete[] formatsToAdopt; // array itself not needed in this case; -#if 1 - msgCmp.toPattern( patCmp ); - logln("MSG patCmp: " + patCmp); - msg.toPattern( patAct ); - logln("MSG patAct: " + patAct); -#endif + assertEquals("msgCmp.toPattern()", formatStr, msgCmp.toPattern(patCmp.remove())); + assertEquals("msg.toPattern()", formatStr, msg.toPattern(patAct.remove())); formatsAct = msg.getFormats(countAct); if (!formatsAct || (countAct <=0) || (countAct != countCmp)) { @@ -1136,4 +1117,62 @@ void TestMessageFormat::TestUnlimitedArgsAndSubformats() { } } +// test RBNF extensions to message format +void TestMessageFormat::TestRBNF(void) { + // WARNING: this depends on the RBNF formats for en_US + Locale locale("en", "US", ""); + + UErrorCode ec = U_ZERO_ERROR; + + UnicodeString values[] = { + // decimal values do not format completely for ordinal or duration, and + // do not always parse, so do not include them + "0", "1", "12", "100", "123", "1001", "123,456", "-17", + }; + int32_t values_count = sizeof(values)/sizeof(values[0]); + + UnicodeString formats[] = { + "There are {0,spellout} files to search.", + "There are {0,spellout,%simplified} files to search.", + "The bogus spellout {0,spellout,%BOGUS} files behaves like the default.", + "This is the {0,ordinal} file to search.", // TODO fix bug, ordinal does not parse + "Searching this file will take {0,duration} to complete.", + "Searching this file will take {0,duration,%with-words} to complete.", + }; + int32_t formats_count = sizeof(formats)/sizeof(formats[0]); + + Formattable args[1]; + + NumberFormat* numFmt = NumberFormat::createInstance(locale, ec); + for (int i = 0; i < formats_count; ++i) { + MessageFormat* fmt = new MessageFormat(formats[i], locale, ec); + logln((UnicodeString)"Testing format pattern: '" + formats[i] + "'"); + for (int j = 0; j < values_count; ++j) { + ec = U_ZERO_ERROR; + numFmt->parse(values[j], args[0], ec); + if (U_FAILURE(ec)) { + errln((UnicodeString)"Failed to parse test argument " + values[j]); + } else { + FieldPosition fp(0); + UnicodeString result; + fmt->format(args, 1, result, fp, ec); + logln((UnicodeString)"value: " + toString(args[0]) + " --> " + result + UnicodeString(" ec: ") + u_errorName(ec)); + + if (i != 3) { // TODO: fix this, for now skip ordinal parsing (format string at index 3) + int32_t count = 0; + Formattable* parseResult = fmt->parse(result, count, ec); + if (count != 1) { + errln((UnicodeString)"parse returned " + count + " args"); + } else if (parseResult[0] != args[0]) { + errln((UnicodeString)"parsed argument " + toString(parseResult[0]) + " != " + toString(args[0])); + } + delete []parseResult; + } + } + } + delete fmt; + } + delete numFmt; +} + #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/test/intltest/tmsgfmt.h b/icuSources/test/intltest/tmsgfmt.h index 30c94435..d610565e 100644 --- a/icuSources/test/intltest/tmsgfmt.h +++ b/icuSources/test/intltest/tmsgfmt.h @@ -1,8 +1,8 @@ -/******************************************************************** +/*********************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ + * Copyright (c) 1997-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ***********************************************************************/ #ifndef _TESTMESSAGEFORMAT @@ -63,6 +63,11 @@ public: */ void TestUnlimitedArgsAndSubformats(); + /** + * Test RBNF extensions to MessageFormat. + */ + void TestRBNF(); + // /** * ------------ API tests ---------- diff --git a/icuSources/test/intltest/tokiter.cpp b/icuSources/test/intltest/tokiter.cpp new file mode 100644 index 00000000..202cbd93 --- /dev/null +++ b/icuSources/test/intltest/tokiter.cpp @@ -0,0 +1,107 @@ +/* +********************************************************************** +* Copyright (c) 2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Author: Alan Liu +* Created: March 22 2004 +* Since: ICU 3.0 +********************************************************************** +*/ +#include "tokiter.h" +#include "textfile.h" +#include "util.h" +#include "uprops.h" + +TokenIterator::TokenIterator(TextFile* r) { + reader = r; + done = haveLine = FALSE; + pos = lastpos = -1; +} + +TokenIterator::~TokenIterator() { +} + +UBool TokenIterator::next(UnicodeString& token, UErrorCode& ec) { + if (done || U_FAILURE(ec)) { + return FALSE; + } + token.truncate(0); + for (;;) { + if (!haveLine) { + if (!reader->readLineSkippingComments(line, ec)) { + done = TRUE; + return FALSE; + } + haveLine = TRUE; + pos = 0; + } + lastpos = pos; + if (!nextToken(token, ec)) { + haveLine = FALSE; + if (U_FAILURE(ec)) return FALSE; + continue; + } + return TRUE; + } +} + +int32_t TokenIterator::getLineNumber() const { + return reader->getLineNumber(); +} + +/** + * Read the next token from 'this->line' and append it to 'token'. + * Tokens are separated by rule white space. Tokens may also be + * delimited by double or single quotes. The closing quote must match + * the opening quote. If a '#' is encountered, the rest of the line + * is ignored, unless it is backslash-escaped or within quotes. + * @param token the token is appended to this StringBuffer + * @param ec input-output error code + * @return TRUE if a valid token is found, or FALSE if the end + * of the line is reached or an error occurs + */ +UBool TokenIterator::nextToken(UnicodeString& token, UErrorCode& ec) { + ICU_Utility::skipWhitespace(line, pos, TRUE); + if (pos == line.length()) { + return FALSE; + } + UChar c = line.charAt(pos++); + UChar quote = 0; + switch (c) { + case 34/*'"'*/: + case 39/*'\\'*/: + quote = c; + break; + case 35/*'#'*/: + return FALSE; + default: + token.append(c); + break; + } + while (pos < line.length()) { + c = line.charAt(pos); // 16-bit ok + if (c == 92/*'\\'*/) { + UChar32 c32 = line.unescapeAt(pos); + if (c32 < 0) { + ec = U_MALFORMED_UNICODE_ESCAPE; + return FALSE; + } + token.append(c32); + } else if ((quote != 0 && c == quote) || + (quote == 0 && uprv_isRuleWhiteSpace(c))) { + ++pos; + return TRUE; + } else if (quote == 0 && c == '#') { + return TRUE; // do NOT increment + } else { + token.append(c); + ++pos; + } + } + if (quote != 0) { + ec = U_UNTERMINATED_QUOTE; + return FALSE; + } + return TRUE; +} diff --git a/icuSources/test/intltest/tokiter.h b/icuSources/test/intltest/tokiter.h new file mode 100644 index 00000000..c9202dda --- /dev/null +++ b/icuSources/test/intltest/tokiter.h @@ -0,0 +1,71 @@ +/* +********************************************************************** +* Copyright (c) 2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Author: Alan Liu +* Created: March 22 2004 +* Since: ICU 3.0 +********************************************************************** +*/ +#ifndef __ICU_INTLTEST_TOKITER__ +#define __ICU_INTLTEST_TOKITER__ + +#include "unicode/utypes.h" +#include "unicode/unistr.h" +class TextFile; + +/** + * An iterator class that returns successive string tokens from some + * source. String tokens are, in general, separated by rule white + * space in the source test. Furthermore, they may be delimited by + * either single or double quotes (opening and closing quotes must + * match). Escapes are processed using standard ICU unescaping. + */ +class TokenIterator { + public: + + /** + * Construct an iterator over the tokens returned by the given + * TextFile, ignoring blank lines and comment lines (first + * non-blank character is '#'). Note that trailing comments on a + * line, beginning with the first unquoted '#', are recognized. + */ + TokenIterator(TextFile* r); + + virtual ~TokenIterator(); + + /** + * Return the next token from this iterator. + * @return TRUE if a token was read, or FALSE if no more tokens + * are available or an error occurred. + */ + UBool next(UnicodeString& token, UErrorCode& ec); + + /** + * Return the one-based line number of the line of the last token + * returned by next(). Should only be called after a call to + * next(); otherwise the return value is undefined. + */ + int32_t getLineNumber() const; + + /** + * Return a string description of the position of the last line + * returned by readLine() or readLineSkippingComments(). + */ + //public String describePosition() { + // return reader.describePosition() + ':' + (lastpos+1); + //} + + private: + UBool nextToken(UnicodeString& token, UErrorCode& ec); + + TextFile* reader; // alias + UnicodeString line; + UBool done; + UBool haveLine; + int32_t pos; + int32_t lastpos; +}; + +#endif diff --git a/icuSources/test/intltest/transapi.cpp b/icuSources/test/intltest/transapi.cpp index 5146784c..9be3923f 100644 --- a/icuSources/test/intltest/transapi.cpp +++ b/icuSources/test/intltest/transapi.cpp @@ -1,8 +1,8 @@ -/******************************************************************** +/************************************************************************ * COPYRIGHT: - * Copyright (c) 2000-2003, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ + * Copyright (c) 2000-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ************************************************************************/ /************************************************************************ * Date Name Description * 1/03/2000 Madhu Creation. @@ -25,6 +25,9 @@ #include <stdlib.h> #include "unicode/rep.h" #include "unicode/locid.h" +#include "unicode/uniset.h" + +static const UVersionInfo ICU_31 = {3,1,0,0}; int32_t getInt(UnicodeString str) { @@ -84,6 +87,9 @@ void TransliteratorAPITest::TestgetID() { for (i=0; i<Transliterator::countAvailableIDs(); i++){ status = U_ZERO_ERROR; ID = (UnicodeString) Transliterator::getAvailableID(i); + if(ID.indexOf("Thai")>-1 && isICUVersionAtLeast(ICU_31)){ + continue; + } t = Transliterator::createInstance(ID, UTRANS_FORWARD, parseError, status); if(t == 0){ errln("FAIL: " + ID); @@ -308,6 +314,7 @@ void TransliteratorAPITest::TestTransliterate1(){ message.append(Data[i][1]); doTest(message, temp, Data[i+2]); + callEverything(t, __LINE__); delete t; } } @@ -349,6 +356,7 @@ void TransliteratorAPITest::TestTransliterate2(){ t->transliterate(temp, start, limit); doTest(t->getID() + ".transliterate(Replaceable, int32_t, int32_t, ):(" + start + "," + limit + ") for \n\t source: " + prettify(Data2[i+1]), temp, Data2[i+5]); status = U_ZERO_ERROR; + callEverything(t, __LINE__); delete t; t = NULL; } @@ -363,11 +371,13 @@ void TransliteratorAPITest::TestTransliterate2(){ } gotResBuf = temp = "try start greater than limit"; t->transliterate(gotResBuf, 10, 5); - if(gotResBuf == temp) + if(gotResBuf == temp) { logln("OK: start greater than limit value handled correctly"); - else + } else { errln("FAIL: start greater than limit value returned" + gotResBuf); + } + callEverything(t, __LINE__); delete t; } @@ -408,12 +418,16 @@ void TransliteratorAPITest::TestSimpleKeyboardTransliterator(){ UParseError parseError; Transliterator* t=Transliterator::createInstance("Any-Hex", UTRANS_FORWARD, parseError, status); if(t == 0) { + UnicodeString context; + + if (parseError.preContext[0]) { + context += (UnicodeString)" at " + parseError.preContext; + } + if (parseError.postContext[0]) { + context += (UnicodeString)" | " + parseError.postContext; + } errln((UnicodeString)"FAIL: can't create Any-Hex, " + - (UnicodeString)u_errorName(status) + - (parseError.preContext[0] ? - ((UnicodeString)" at " + parseError.preContext + - (parseError.postContext[0] ? - ((UnicodeString)" | " + parseError.postContext) : (UnicodeString)"")) : (UnicodeString)"")); + (UnicodeString)u_errorName(status) + context); return; } UTransPosition index={19,20,20,20}; @@ -627,6 +641,7 @@ void TransliteratorAPITest::TestNullTransliterator(){ errln("ERROR: NullTransliterator->handleTransliterate() failed"); } doTest((UnicodeString)"NullTransliterator->handleTransliterate", replaceable, s); + callEverything(nullTrans, __LINE__); delete nullTrans; @@ -662,6 +677,8 @@ void TransliteratorAPITest::TestRegisterUnregister(){ errln("FAIL: TestA-TestB not registered\n"); return; } + callEverything(s, __LINE__); + callEverything(t, __LINE__); delete s; /* Check inverse too @@ -801,6 +818,7 @@ void TransliteratorAPITest::TestGetAdoptFilter(){ doTest("adoptFilter round trip", got, temp); t->adoptFilter(new TestFilter2); + callEverything(t, __LINE__); data="heelloe"; exp=UnicodeString("\\u0068eell\\u006Fe", ""); got = data; @@ -890,4 +908,63 @@ void TransliteratorAPITest::doTest(const UnicodeString& message, const UnicodeSt errln((UnicodeString)"FAIL:" + message + " failed Got-->" + prettify(result)+ ", Expected--> " + prettify(expected) ); } + +// +// callEverything call all of the const (non-destructive) methods on a +// transliterator, just to verify that they don't fail in some +// destructive way. +// +#define CEASSERT(a) {if (!(a)) { \ +errln("FAIL at line %d from line %d: %s", __LINE__, line, #a); return; }} + +void TransliteratorAPITest::callEverything(const Transliterator *tr, int line) { + Transliterator *clonedTR = tr->clone(); + CEASSERT(clonedTR != NULL); + + int32_t maxcl = tr->getMaximumContextLength(); + CEASSERT(clonedTR->getMaximumContextLength() == maxcl); + + UnicodeString id; + UnicodeString clonedId; + id = tr->getID(); + clonedId = clonedTR->getID(); + CEASSERT(id == clonedId); + + const UnicodeFilter *filter = tr->getFilter(); + const UnicodeFilter *clonedFilter = clonedTR->getFilter(); + if (filter == NULL || clonedFilter == NULL) { + // If one filter is NULL they better both be NULL. + CEASSERT(filter == clonedFilter); + } else { + CEASSERT(filter != clonedFilter); + } + + UnicodeString rules; + UnicodeString clonedRules; + rules = tr->toRules(rules, FALSE); + clonedRules = clonedTR->toRules(clonedRules, FALSE); + CEASSERT(rules == clonedRules); + + UnicodeSet sourceSet; + UnicodeSet clonedSourceSet; + tr->getSourceSet(sourceSet); + clonedTR->getSourceSet(clonedSourceSet); + CEASSERT(clonedSourceSet == sourceSet); + + UnicodeSet targetSet; + UnicodeSet clonedTargetSet; + tr->getTargetSet(targetSet); + clonedTR->getTargetSet(clonedTargetSet); + CEASSERT(targetSet == clonedTargetSet); + + UClassID classID = tr->getDynamicClassID(); + CEASSERT(classID == clonedTR->getDynamicClassID()); + CEASSERT(classID != 0); + + delete clonedTR; +} + + + + #endif /* #if !UCONFIG_NO_TRANSLITERATION */ diff --git a/icuSources/test/intltest/transapi.h b/icuSources/test/intltest/transapi.h index fe3157c1..11083145 100644 --- a/icuSources/test/intltest/transapi.h +++ b/icuSources/test/intltest/transapi.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 2001, International Business Machines Corporation and + * Copyright (c) 2001-2003, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /************************************************************************ @@ -67,6 +67,8 @@ public: void displayOutput(const UnicodeString&, const UnicodeString&, UnicodeString&, UTransPosition&); + void callEverything(const Transliterator *t, int line); + }; #endif /* #if !UCONFIG_NO_TRANSLITERATION */ diff --git a/icuSources/test/intltest/transrt.cpp b/icuSources/test/intltest/transrt.cpp index b29dc7df..f8803212 100644 --- a/icuSources/test/intltest/transrt.cpp +++ b/icuSources/test/intltest/transrt.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2000-2003, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -14,6 +14,7 @@ #include "unicode/translit.h" #include "rbt.h" +#include "unicode/calendar.h" #include "unicode/uniset.h" #include "unicode/uchar.h" #include "unicode/normlzr.h" @@ -22,20 +23,25 @@ #include "unicode/usetiter.h" #include "unicode/putil.h" #include "unicode/uversion.h" +#include "unicode/locid.h" +#include "unicode/ulocdata.h" +#include "unicode/utf8.h" +#include "putilimp.h" #include "cmemory.h" #include "transrt.h" #include "testutil.h" #include <string.h> +#include <stdio.h> #define CASE(id,test) case id: \ name = #test; \ if (exec) { \ logln(#test "---"); \ logln((UnicodeString)""); \ - int32_t t = uprv_getUTCtime(); \ + UDate t = uprv_getUTCtime(); \ test(); \ t = uprv_getUTCtime() - t; \ - logln((UnicodeString)#test " took " + t + " seconds"); \ + logln((UnicodeString)#test " took " + t/U_MILLIS_PER_DAY + " seconds"); \ } \ break @@ -66,6 +72,9 @@ TransliteratorRoundTripTest::runIndexedTest(int32_t index, UBool exec, CASE(7,Testel); CASE(8,TestDevanagariLatin); CASE(9,TestInterIndic); + CASE(10, TestHebrew); + CASE(11, TestArabic); + CASE(12, TestHan); default: name = ""; break; } } @@ -74,7 +83,7 @@ TransliteratorRoundTripTest::runIndexedTest(int32_t index, UBool exec, // Time bomb - allows temporary behavior that expires at a given // release //-------------------------------------------------------------------- - +/* static const UVersionInfo ICU_30 = {3,0,0,0}; static UBool isICUVersionAtLeast(const UVersionInfo x) { @@ -82,6 +91,7 @@ static UBool isICUVersionAtLeast(const UVersionInfo x) { u_getVersion(v); return (uprv_memcmp(v, x, U_MAX_VERSION_LENGTH) >= 0); } +*/ //-------------------------------------------------------------------- // TransliteratorPointer @@ -564,7 +574,7 @@ void RTTest::test2(UBool quickRt, int32_t density) { TransliteratorPointer sourceToTarget( Transliterator::createInstance(transliteratorID, UTRANS_FORWARD, parseError, status)); - if (sourceToTarget == NULL) { + if ((Transliterator *)sourceToTarget == NULL) { parent->errln("FAIL: createInstance(" + transliteratorID + ") returned NULL. Error: " + u_errorName(status) + "\n\tpreContext : " + prettify(parseError.preContext) @@ -573,7 +583,7 @@ void RTTest::test2(UBool quickRt, int32_t density) { return; } TransliteratorPointer targetToSource(sourceToTarget->createInverse(status)); - if (targetToSource == NULL) { + if ((Transliterator *)targetToSource == NULL) { parent->errln("FAIL: " + transliteratorID + ".createInverse() returned NULL. Error:" + u_errorName(status) + "\n\tpreContext : " + prettify(parseError.preContext) @@ -771,12 +781,16 @@ void RTTest::test2(UBool quickRt, int32_t density) { parent->errln("FAIL: Internal error during decomposition%s\n", u_errorName(status)); return; } - if (toSource.containsAll(targD) == FALSE || - badCharacters.containsSome(targD) == TRUE) { + if (toSource.containsAll(targD) == FALSE) { logWrongScript("Target-Source", srcStr, targ); failTargSource.add(c); continue; } + if (badCharacters.containsSome(targD) == TRUE) { + logWrongScript("Target-Source*", srcStr, targ); + failTargSource.add(c); + continue; + } } if (isSame(srcStr, reverse) == FALSE && roundtripExclusionsSet.contains(c) == FALSE @@ -970,7 +984,7 @@ void TransliteratorRoundTripTest::TestKana() { strcat(temp, HALFWIDTH_KATAKANA); strcat(temp, LENGTH); strcat(temp, "]"); - test.test(KATAKANA, UnicodeString("[") + HIRAGANA + LENGTH + UnicodeString("]"), + test.test(KATAKANA, UnicodeString("[") + HIRAGANA + LENGTH + UnicodeString("]"), temp, this, quick, legal); delete legal; @@ -1020,7 +1034,113 @@ void TransliteratorRoundTripTest::TestHangul() { delete legal; } + +#define ASSERT_SUCCESS(status) {if (U_FAILURE(status)) { \ + errln("error at file %s, line %d, status = %s", __FILE__, __LINE__, \ + u_errorName(status)); \ + return;}} + + +static void writeStringInU8(FILE *out, const UnicodeString &s) { + int i; + for (i=0; i<s.length(); i=s.moveIndex32(i, 1)) { + UChar32 c = s.char32At(i); + uint8_t bufForOneChar[10]; + UBool isError = FALSE; + int32_t destIdx = 0; + U8_APPEND(bufForOneChar, destIdx, sizeof(bufForOneChar), c, isError); + fwrite(bufForOneChar, 1, destIdx, out); + } +} + + + + +void TransliteratorRoundTripTest::TestHan() { + UErrorCode status = U_ZERO_ERROR; + + // TODO: getExemplars() exists only as a C API, taking a USet. + // The set API we need to use exists only on UnicodeSet, not on USet. + // Do a hacky cast, knowing that a USet is really a UnicodeSet in + // the implementation. Once USet gets the missing API, switch back + // to using that. + USet *USetExemplars = NULL; + USetExemplars = uset_open(0, 0); + USetExemplars = ulocdata_getExemplarSet(USetExemplars, "zh", 0, &status); + ASSERT_SUCCESS(status); + UnicodeSet *exemplars = (UnicodeSet *)USetExemplars; + + UnicodeString source; + UChar32 c; + int i; + for (i=0; ;i++) { + // Add all of the Chinese exemplar chars to the string "source". + c = exemplars->charAt(i); + if (c == (UChar32)-1) { + break; + } + source.append(c); + } + + // transform with Han translit + Transliterator *hanTL = Transliterator::createInstance("Han-Latin", UTRANS_FORWARD, status); + ASSERT_SUCCESS(status); + UnicodeString target=source; + hanTL->transliterate(target); + // now verify that there are no Han characters left + UnicodeSet allHan("[:han:]", status); + ASSERT_SUCCESS(status); + if (allHan.containsSome(target)) { + errln("file %s, line %d, No Han must be left after Han-Latin transliteration", + __FILE__, __LINE__); + } + + // check the pinyin translit + Transliterator *pn = Transliterator::createInstance("Latin-NumericPinyin", UTRANS_FORWARD, status); + ASSERT_SUCCESS(status); + UnicodeString target2 = target; + pn->transliterate(target2); + + // verify that there are no marks + Transliterator *nfc = Transliterator::createInstance("nfc", UTRANS_FORWARD, status); + ASSERT_SUCCESS(status); + + UnicodeString nfced = target2; + nfc->transliterate(nfced); + UnicodeSet allMarks("[:mark:]", status); + ASSERT_SUCCESS(status); + assertFalse("NumericPinyin must contain no marks", allMarks.containsSome(nfced)); + + // verify roundtrip + Transliterator *np = pn->createInverse(status); + ASSERT_SUCCESS(status); + UnicodeString target3 = target; + np->transliterate(target3); + UBool roundtripOK = (target3.compare(target) == 0); + assertTrue("NumericPinyin must roundtrip", roundtripOK); + if (!roundtripOK) { + const char *filename = "numeric-pinyin.log.txt"; + FILE *out = fopen(filename, "w"); + errln("Creating log file %s\n", filename); + fprintf(out, "Pinyin: "); + writeStringInU8(out, target); + fprintf(out, "\nPinyin-Numeric-Pinyin: "); + writeStringInU8(out, target2); + fprintf(out, "\n"); + fclose(out); + } + + delete hanTL; + delete pn; + delete nfc; + delete np; + uset_close(USetExemplars); +} + + void TransliteratorRoundTripTest::TestGreek() { + // weiv removed the test and the fiter + /* if (isICUVersionAtLeast(ICU_30)) { // We temporarily filter against Unicode 3.2, but we only do this // before version 3.0. @@ -1029,13 +1149,21 @@ void TransliteratorRoundTripTest::TestGreek() { } else { logln("Warning: TestGreek needs to be updated to remove Unicode 3.2 filter"); } + */ RTTest test("Latin-Greek"); LegalGreek *legal = new LegalGreek(TRUE); test.test(UnicodeString("[a-zA-Z]", ""), - UnicodeString("[[\\u003B\\u00B7[:Greek:]-[\\u03D7-\\u03EF]]&[:Age=3.2:]]", + UnicodeString("[\\u003B\\u00B7[[:Greek:]&[:Letter:]]-[" + "\\u1D26-\\u1D2A" // L& [5] GREEK LETTER SMALL CAPITAL GAMMA..GREEK LETTER SMALL CAPITAL PSI + "\\u1D5D-\\u1D61" // Lm [5] MODIFIER LETTER SMALL BETA..MODIFIER LETTER SMALL CHI + "\\u1D66-\\u1D6A" // L& [5] GREEK SUBSCRIPT SMALL LETTER BETA..GREEK SUBSCRIPT SMALL LETTER CHI + "\\u03D7-\\u03EF" // \N{GREEK KAI SYMBOL}..\N{COPTIC SMALL LETTER DEI} + "]]", + + //UnicodeString("[[\\u003B\\u00B7[:Greek:]-[\\u0374\\u0385\\u1fcd\\u1fce\\u1fdd\\u1fde\\u1fed-\\u1fef\\u1ffd\\u03D7-\\u03EF]]&[:Age=3.2:]]", ""), - "[\\u00B5\\u037A\\u03D0-\\u03F5]", /* exclusions */ + "[\\u00B5\\u037A\\u03D0-\\u03F5\\u03f9]", /* exclusions */ this, quick, legal, 50); @@ -1044,6 +1172,8 @@ void TransliteratorRoundTripTest::TestGreek() { void TransliteratorRoundTripTest::TestGreekUNGEGN() { + // weiv removed the test and the fiter + /* if (isICUVersionAtLeast(ICU_30)) { // We temporarily filter against Unicode 3.2, but we only do this // before version 3.0. @@ -1052,19 +1182,28 @@ void TransliteratorRoundTripTest::TestGreekUNGEGN() { } else { logln("Warning: TestGreekUNGEGN needs to be updated to remove Unicode 3.2 filter"); } + */ RTTest test("Latin-Greek/UNGEGN"); LegalGreek *legal = new LegalGreek(FALSE); test.test(UnicodeString("[a-zA-Z]", ""), - UnicodeString("[[\\u003B\\u00B7[:Greek:]-[\\u03D7-\\u03EF]]&[:Age=3.2:]]", + UnicodeString("[\\u003B\\u00B7[[:Greek:]&[:Letter:]]-[" + "\\u1D26-\\u1D2A" // L& [5] GREEK LETTER SMALL CAPITAL GAMMA..GREEK LETTER SMALL CAPITAL PSI + "\\u1D5D-\\u1D61" // Lm [5] MODIFIER LETTER SMALL BETA..MODIFIER LETTER SMALL CHI + "\\u1D66-\\u1D6A" // L& [5] GREEK SUBSCRIPT SMALL LETTER BETA..GREEK SUBSCRIPT SMALL LETTER CHI + "\\u03D7-\\u03EF" // \N{GREEK KAI SYMBOL}..\N{COPTIC SMALL LETTER DEI} + "]]", + //UnicodeString("[[\\u003B\\u00B7[:Greek:]-[\\u0374\\u0385\\u1fce\\u1fde\\u03D7-\\u03EF]]&[:Age=3.2:]]", ""), - "[\\u00B5\\u037A\\u03D0-\\uFFFF {\\u039C\\u03C0}]", /* roundtrip exclusions */ + "[\\u0385\\u00B5\\u037A\\u03D0-\\uFFFF {\\u039C\\u03C0}]", /* roundtrip exclusions */ this, quick, legal); delete legal; } void TransliteratorRoundTripTest::Testel() { + // weiv removed the test and the fiter + /* if (isICUVersionAtLeast(ICU_30)) { // We temporarily filter against Unicode 3.2, but we only do this // before version 3.0. @@ -1073,11 +1212,18 @@ void TransliteratorRoundTripTest::Testel() { } else { logln("Warning: Testel needs to be updated to remove Unicode 3.2 filter"); } + */ RTTest test("Latin-el"); LegalGreek *legal = new LegalGreek(FALSE); test.test(UnicodeString("[a-zA-Z]", ""), - UnicodeString("[[\\u003B\\u00B7[:Greek:]-[\\u03D7-\\u03EF]]&[:Age=3.2:]]", + UnicodeString("[\\u003B\\u00B7[[:Greek:]&[:Letter:]]-[" + "\\u1D26-\\u1D2A" // L& [5] GREEK LETTER SMALL CAPITAL GAMMA..GREEK LETTER SMALL CAPITAL PSI + "\\u1D5D-\\u1D61" // Lm [5] MODIFIER LETTER SMALL BETA..MODIFIER LETTER SMALL CHI + "\\u1D66-\\u1D6A" // L& [5] GREEK SUBSCRIPT SMALL LETTER BETA..GREEK SUBSCRIPT SMALL LETTER CHI + "\\u03D7-\\u03EF" // \N{GREEK KAI SYMBOL}..\N{COPTIC SMALL LETTER DEI} + "]]", + //UnicodeString("[[\\u003B\\u00B7[:Greek:]-[\\u0374\\u0385\\u1fce\\u1fde\\u03D7-\\u03EF]]&[:Age=3.2:]]", ""), "[\\u00B5\\u037A\\u03D0-\\uFFFF {\\u039C\\u03C0}]", /* exclusions */ this, quick, legal); @@ -1086,6 +1232,58 @@ void TransliteratorRoundTripTest::Testel() { delete legal; } + +void TransliteratorRoundTripTest::TestArabic() { + UnicodeString ARABIC("[\\u060C\\u061B\\u061F\\u0621\\u0627-\\u063A\\u0641-\\u0655\\u0660-\\u066C\\u067E\\u0686\\u0698\\u06A4\\u06AD\\u06AF\\u06CB-\\u06CC\\u06F0-\\u06F9]"); + Legal *legal = new Legal(); + RTTest test("Latin-Arabic"); + test.test("[a-zA-Z\\u02BE\\u02BF\\u207F]", ARABIC, "[a-zA-Z\\u02BE\\u02BF\\u207F]",this, quick, legal); // + delete legal; +} +class LegalHebrew : public Legal { +private: + UnicodeSet FINAL; + UnicodeSet NON_FINAL; + UnicodeSet LETTER; +public: + LegalHebrew(UErrorCode& error); + virtual ~LegalHebrew() {} + virtual UBool is(const UnicodeString& sourceString) const; +}; + +LegalHebrew::LegalHebrew(UErrorCode& error){ + FINAL.applyPattern("[\\u05DA\\u05DD\\u05DF\\u05E3\\u05E5]", error); + NON_FINAL.applyPattern("[\\u05DB\\u05DE\\u05E0\\u05E4\\u05E6]", error); + LETTER.applyPattern("[:letter:]", error); +} +UBool LegalHebrew::is(const UnicodeString& sourceString)const{ + + if (sourceString.length() == 0) return TRUE; + // don't worry about surrogates. + for (int i = 0; i < sourceString.length(); ++i) { + UChar ch = sourceString.charAt(i); + UChar next = i+1 == sourceString.length() ? 0x0000 : sourceString.charAt(i); + if (FINAL.contains(ch)) { + if (LETTER.contains(next)) return FALSE; + } else if (NON_FINAL.contains(ch)) { + if (!LETTER.contains(next)) return FALSE; + } + } + return TRUE; +} +void TransliteratorRoundTripTest::TestHebrew() { + //long start = System.currentTimeMillis(); + UErrorCode error = U_ZERO_ERROR; + LegalHebrew* legal = new LegalHebrew(error); + if(U_FAILURE(error)){ + errln("Could not construct LegalHebrew object. Error: %s", u_errorName(error)); + return; + } + RTTest test("Latin-Hebrew"); + test.test("[a-zA-Z\\u02BC\\u02BB]", "[[:hebrew:]-[\\u05BD\\uFB00-\\uFBFF]]", "[\\u05F0\\u05F1\\u05F2]", this, quick, legal); + //showElapsed(start, "TestHebrew"); + delete legal; +} void TransliteratorRoundTripTest::TestCyrillic() { RTTest test("Latin-Cyrillic"); Legal *legal = new Legal(); @@ -1110,7 +1308,7 @@ class LegalIndic :public Legal{ public: LegalIndic(){ UErrorCode status = U_ZERO_ERROR; - vowelSignSet.addAll( UnicodeSet("[\\u0902\\u0903\\u093e-\\u094c\\u0962\\u0963]",status));/* Devanagari */ + vowelSignSet.addAll( UnicodeSet("[\\u0902\\u0903\\u0904\\u093e-\\u094c\\u0962\\u0963]",status));/* Devanagari */ vowelSignSet.addAll( UnicodeSet("[\\u0982\\u0983\\u09be-\\u09cc\\u09e2\\u09e3\\u09D7]",status));/* Bengali */ vowelSignSet.addAll( UnicodeSet("[\\u0a02\\u0a03\\u0a3e-\\u0a4c\\u0a62\\u0a63\\u0a70\\u0a71]",status));/* Gurmukhi */ vowelSignSet.addAll( UnicodeSet("[\\u0a82\\u0a83\\u0abe-\\u0acc\\u0ae2\\u0ae3]",status));/* Gujarati */ @@ -1120,8 +1318,8 @@ public: vowelSignSet.addAll( UnicodeSet("[\\u0c82\\u0c83\\u0cbe-\\u0ccc\\u0ce2\\u0ce3\\u0cd5\\u0cd6]",status));/* Kannada */ vowelSignSet.addAll( UnicodeSet("[\\u0d02\\u0d03\\u0d3e-\\u0d4c\\u0d62\\u0d63\\u0d57]",status));/* Malayalam */ - avagraha.addAll(UnicodeSet("[\\u093d\\u0abd\\u0b3d]",status)); - nukta.addAll(UnicodeSet("[\\u093c\\u09bc\\u0a3c\\u0abc\\u0b3c]",status)); + avagraha.addAll(UnicodeSet("[\\u093d\\u09bd\\u0abd\\u0b3d\\u0cbd]",status)); + nukta.addAll(UnicodeSet("[\\u093c\\u09bc\\u0a3c\\u0abc\\u0b3c\\u0cbc]",status)); virama.addAll(UnicodeSet("[\\u094d\\u09cd\\u0a4d\\u0acd\\u0b4d\\u0bcd\\u0c4d\\u0ccd\\u0d4d]",status)); sanskritStressSigns.addAll(UnicodeSet("[\\u0951\\u0952\\u0953\\u0954]",status)); chandrabindu.addAll(UnicodeSet("[\\u0901\\u0981\\u0A81\\u0b01\\u0c01]",status)); @@ -1173,26 +1371,25 @@ static const char latinForIndic[] = "[['.0-9A-Za-z~\\u00C0-\\u00C5\\u00C7-\\u00C void TransliteratorRoundTripTest::TestDevanagariLatin() { { UErrorCode status = U_ZERO_ERROR; - TransliteratorPointer t1(Transliterator::createInstance("[\\u0000-\\u00FE \\u0982\\u0983 [:Bengali:][:nonspacing mark:]];NFD;Bengali-InterIndic;InterIndic-Gujarati;NFC;( [ \\u0000-\\u00FE [:Gujarati:][[:nonspacing mark:]])",UTRANS_FORWARD, status)); - if(t1){ + UParseError parseError; + TransliteratorPointer t1(Transliterator::createInstance("[\\u0964-\\u0965\\u0981-\\u0983\\u0985-\\u098C\\u098F-\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC\\u09BE-\\u09C4\\u09C7-\\u09C8\\u09CB-\\u09CD\\u09D7\\u09DC-\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09FA];NFD;Bengali-InterIndic;InterIndic-Gujarati;NFC;",UTRANS_FORWARD, parseError, status)); + if((Transliterator *)t1 != NULL){ TransliteratorPointer t2(t1->createInverse(status)); if(U_FAILURE(status)){ errln("FAIL: could not create the Inverse:-( \n"); } + }else { + errln("FAIL: could not create the transliterator. Error: %s\n", u_errorName(status)); } + } RTTest test("Latin-Devanagari"); Legal *legal = new LegalIndic(); -#if (U_ICU_VERSION_MAJOR_NUM==2 && U_ICU_VERSION_MINOR_NUM==6) - test.test(UnicodeString(latinForIndic, ""), - UnicodeString("[[:Devanagari:]&[:Age=3.2:]]", ""), NULL, this, quick, - legal, 50); -#else test.test(UnicodeString(latinForIndic, ""), - UnicodeString("[:Devanagari:]", ""), NULL, this, quick, - legal, 50); -#endif + UnicodeString("[[:Devanagari:][\\u094d][\\u0964\\u0965]]", ""), "[\\u0965\\u0904]", this, quick, + legal, 50); + delete legal; } @@ -1200,16 +1397,16 @@ void TransliteratorRoundTripTest::TestDevanagariLatin() { static const int32_t INTER_INDIC_ARRAY_WIDTH = 4; static const char * const interIndicArray[] = { "BENGALI-DEVANAGARI", "[:BENGALI:]", "[:Devanagari:]", - "[\\u0951-\\u0954\\u0943-\\u0949\\u094a\\u0962\\u0963\\u090D\\u090e\\u0911\\u0912\\u0929\\u0933\\u0934\\u0935\\u093d\\u0950\\u0958\\u0959\\u095a\\u095b\\u095e\\u09f0\\u09f1]", /*roundtrip exclusions*/ + "[\\u0904\\u0951-\\u0954\\u0943-\\u0949\\u094a\\u0962\\u0963\\u090D\\u090e\\u0911\\u0912\\u0929\\u0933\\u0934\\u0935\\u093d\\u0950\\u0958\\u0959\\u095a\\u095b\\u095e\\u09f0\\u09f1\\u09f2-\\u09fa]", /*roundtrip exclusions*/ "DEVANAGARI-BENGALI", "[:Devanagari:]", "[:BENGALI:]", - "[\\u0951-\\u0954\\u09D7\\u090D\\u090e\\u0911\\u0912\\u0929\\u0933\\u0934\\u0935\\u093d\\u0950\\u0958\\u0959\\u095a\\u095b\\u095e\\u09f0\\u09f1]", /*roundtrip exclusions*/ + "[\\u0951-\\u0954\\u0951-\\u0954\\u09D7\\u090D\\u090e\\u0911\\u0912\\u0929\\u0933\\u0934\\u0935\\u093d\\u0950\\u0958\\u0959\\u095a\\u095b\\u095e\\u09f0\\u09f1\\u09f2-\\u09fa]", /*roundtrip exclusions*/ "GURMUKHI-DEVANAGARI", "[:GURMUKHI:]", "[:Devanagari:]", - "[\\u0901\\u0902\\u0936\\u0933\\u0951-\\u0954\\u0902\\u0903\\u0943-\\u0949\\u094a\\u0962\\u0963\\u090B\\u090C\\u090D\\u090e\\u0911\\u0912\\u0934\\u0937\\u093D\\u0950\\u0960\\u0961\\u0a72\\u0a73\\u0a74]", /*roundtrip exclusions*/ + "[\\u0904\\u0901\\u0902\\u0936\\u0933\\u0951-\\u0954\\u0902\\u0903\\u0943-\\u0949\\u094a\\u0962\\u0963\\u090B\\u090C\\u090D\\u090e\\u0911\\u0912\\u0934\\u0937\\u093D\\u0950\\u0960\\u0961\\u0a72\\u0a73\\u0a74]", /*roundtrip exclusions*/ "DEVANAGARI-GURMUKHI", "[:Devanagari:]", "[:GURMUKHI:]", - "[\\u0A02\\u0946\\u0A5C\\u0951-\\u0954\\u0A70\\u0A71\\u090B\\u090C\\u090D\\u090e\\u0911\\u0912\\u0934\\u0937\\u093D\\u0950\\u0960\\u0961\\u0a72\\u0a73\\u0a74]", /*roundtrip exclusions*/ + "[\\u0904\\u0A02\\u0946\\u0A5C\\u0951-\\u0954\\u0A70\\u0A71\\u090B\\u090C\\u090D\\u090e\\u0911\\u0912\\u0934\\u0937\\u093D\\u0950\\u0960\\u0961\\u0a72\\u0a73\\u0a74]", /*roundtrip exclusions*/ "GUJARATI-DEVANAGARI", "[:GUJARATI:]", "[:Devanagari:]", "[\\u0946\\u094A\\u0962\\u0963\\u0951-\\u0954\\u0961\\u090c\\u090e\\u0912]", /*roundtrip exclusions*/ @@ -1218,73 +1415,73 @@ static const char * const interIndicArray[] = { "[\\u0951-\\u0954\\u0961\\u090c\\u090e\\u0912]", /*roundtrip exclusions*/ "ORIYA-DEVANAGARI", "[:ORIYA:]", "[:Devanagari:]", - "[\\u0943-\\u094a\\u0962\\u0963\\u0951-\\u0954\\u0950\\u090D\\u090e\\u0912\\u0911\\u0931\\u0935]", /*roundtrip exclusions*/ + "[\\u0904\\u0943-\\u094a\\u0962\\u0963\\u0951-\\u0954\\u0950\\u090D\\u090e\\u0912\\u0911\\u0931\\u0935]", /*roundtrip exclusions*/ "DEVANAGARI-ORIYA", "[:Devanagari:]", "[:ORIYA:]", - "[\\u0b5f\\u0b56\\u0b57\\u0950\\u090D\\u090e\\u0912\\u0911\\u0931\\u0935]", /*roundtrip exclusions*/ + "[\\u0b5f\\u0b56\\u0b57\\u0b70\\u0b71\\u0950\\u090D\\u090e\\u0912\\u0911\\u0931]", /*roundtrip exclusions*/ "Tamil-DEVANAGARI", "[:tamil:]", "[:Devanagari:]", - "[\\u0901\\u093c\\u0943-\\u094a\\u0951-\\u0954\\u0962\\u0963\\u090B\\u090C\\u090D\\u0911\\u0916\\u0917\\u0918\\u091B\\u091D\\u0920\\u0921\\u0922\\u0925\\u0926\\u0927\\u092B\\u092C\\u092D\\u0936\\u093d\\u0950[\\u0958-\\u0961]]", /*roundtrip exclusions*/ + "[\\u0901\\u0904\\u093c\\u0943-\\u094a\\u0951-\\u0954\\u0962\\u0963\\u090B\\u090C\\u090D\\u0911\\u0916\\u0917\\u0918\\u091B\\u091D\\u0920\\u0921\\u0922\\u0925\\u0926\\u0927\\u092B\\u092C\\u092D\\u0936\\u093d\\u0950[\\u0958-\\u0961]]", /*roundtrip exclusions*/ "DEVANAGARI-Tamil", "[:Devanagari:]", "[:tamil:]", "[\\u0bd7]", /*roundtrip exclusions*/ "Telugu-DEVANAGARI", "[:telugu:]", "[:Devanagari:]", - "[\\u093c\\u0950\\u0945\\u0949\\u0951-\\u0954\\u0962\\u0963\\u090D\\u0911\\u093d\\u0929\\u0934[\\u0958-\\u095f]]", /*roundtrip exclusions*/ + "[\\u0904\\u093c\\u0950\\u0945\\u0949\\u0951-\\u0954\\u0962\\u0963\\u090D\\u0911\\u093d\\u0929\\u0934[\\u0958-\\u095f]]", /*roundtrip exclusions*/ "DEVANAGARI-TELUGU", "[:Devanagari:]", "[:TELUGU:]", "[\\u0c55\\u0c56\\u0950\\u090D\\u0911\\u093d\\u0929\\u0934[\\u0958-\\u095f]]", /*roundtrip exclusions*/ "KANNADA-DEVANAGARI", "[:KANNADA:]", "[:Devanagari:]", - "[\\u0901\\u0946\\u093c\\u0950\\u0945\\u0949\\u0951-\\u0954\\u0962\\u0963\\u0950\\u090D\\u0911\\u093d\\u0929\\u0934[\\u0958-\\u095f]]", /*roundtrip exclusions*/ + "[\\u0901\\u0904\\u0946\\u093c\\u0950\\u0945\\u0949\\u0951-\\u0954\\u0962\\u0963\\u0950\\u090D\\u0911\\u093d\\u0929\\u0934[\\u0958-\\u095f]]", /*roundtrip exclusions*/ "DEVANAGARI-KANNADA", "[:Devanagari:]", "[:KANNADA:]", - "[\\u0cde\\u0cd5\\u0cd6\\u0950\\u090D\\u0911\\u093d\\u0929\\u0934[\\u0958-\\u095f]]", /*roundtrip exclusions*/ + "[{\\u0cb0\\u0cbc}{\\u0cb3\\u0cbc}\\u0cde\\u0cd5\\u0cd6\\u0950\\u090D\\u0911\\u093d\\u0929\\u0934[\\u0958-\\u095f]]", /*roundtrip exclusions*/ "MALAYALAM-DEVANAGARI", "[:MALAYALAM:]", "[:Devanagari:]", - "[\\u0901\\u094a\\u094b\\u094c\\u093c\\u0950\\u0944\\u0945\\u0949\\u0951-\\u0954\\u0962\\u0963\\u090D\\u0911\\u093d\\u0929\\u0934[\\u0958-\\u095f]]", /*roundtrip exclusions*/ + "[\\u0901\\u0904\\u094a\\u094b\\u094c\\u093c\\u0950\\u0944\\u0945\\u0949\\u0951-\\u0954\\u0962\\u0963\\u090D\\u0911\\u093d\\u0929\\u0934[\\u0958-\\u095f]]", /*roundtrip exclusions*/ "DEVANAGARI-MALAYALAM", "[:Devanagari:]", "[:MALAYALAM:]", "[\\u0d4c\\u0d57\\u0950\\u090D\\u0911\\u093d\\u0929\\u0934[\\u0958-\\u095f]]", /*roundtrip exclusions*/ "GURMUKHI-BENGALI", "[:GURMUKHI:]", "[:BENGALI:]", - "[\\u0981\\u0982\\u09b6\\u09e2\\u09e3\\u09c3\\u09c4\\u09d7\\u098B\\u098C\\u09B7\\u09E0\\u09E1\\u09F0\\u09F1]", /*roundtrip exclusions*/ + "[\\u0981\\u0982\\u09b6\\u09e2\\u09e3\\u09c3\\u09c4\\u09d7\\u098B\\u098C\\u09B7\\u09E0\\u09E1\\u09F0\\u09F1\\u09f2-\\u09fa]", /*roundtrip exclusions*/ "BENGALI-GURMUKHI", "[:BENGALI:]", "[:GURMUKHI:]", "[\\u0A02\\u0a5c\\u0a47\\u0a70\\u0a71\\u0A33\\u0A35\\u0A59\\u0A5A\\u0A5B\\u0A5E\\u0A72\\u0A73\\u0A74]", /*roundtrip exclusions*/ "GUJARATI-BENGALI", "[:GUJARATI:]", "[:BENGALI:]", - "[\\u09d7\\u09e2\\u09e3\\u098c\\u09e1\\u09f0\\u09f1]", /*roundtrip exclusions*/ + "[\\u09d7\\u09e2\\u09e3\\u098c\\u09e1\\u09f0\\u09f1\\u09f2-\\u09fa]", /*roundtrip exclusions*/ "BENGALI-GUJARATI", "[:BENGALI:]", "[:GUJARATI:]", "[\\u0A82\\u0a83\\u0Ac9\\u0Ac5\\u0ac7\\u0A8D\\u0A91\\u0AB3\\u0AB5\\u0ABD\\u0AD0]", /*roundtrip exclusions*/ "ORIYA-BENGALI", "[:ORIYA:]", "[:BENGALI:]", - "[\\u09c4\\u09e2\\u09e3\\u09f0\\u09f1]", /*roundtrip exclusions*/ + "[\\u09c4\\u09e2\\u09e3\\u09f0\\u09f1\\u09f2-\\u09fa]", /*roundtrip exclusions*/ "BENGALI-ORIYA", "[:BENGALI:]", "[:ORIYA:]", - "[\\u0b5f\\u0b56\\u0b33\\u0b3d]", /*roundtrip exclusions*/ + "[\\u0b35\\u0b71\\u0b5f\\u0b56\\u0b33\\u0b3d]", /*roundtrip exclusions*/ "Tamil-BENGALI", "[:tamil:]", "[:BENGALI:]", - "[\\u0981\\u09bc\\u09c3\\u09c4\\u09e2\\u09e3\\u09f0\\u09f1\\u098B\\u098C\\u0996\\u0997\\u0998\\u099B\\u099D\\u09A0\\u09A1\\u09A2\\u09A5\\u09A6\\u09A7\\u09AB\\u09AC\\u09AD\\u09B6\\u09DC\\u09DD\\u09DF\\u09E0\\u09E1]", /*roundtrip exclusions*/ + "[\\u0981\\u09bc\\u09c3\\u09c4\\u09e2\\u09e3\\u09f0\\u09f1\\u098B\\u098C\\u0996\\u0997\\u0998\\u099B\\u099D\\u09A0\\u09A1\\u09A2\\u09A5\\u09A6\\u09A7\\u09AB\\u09AC\\u09AD\\u09B6\\u09DC\\u09DD\\u09DF\\u09E0\\u09E1\\u09f2-\\u09fa]", /*roundtrip exclusions*/ "BENGALI-Tamil", "[:BENGALI:]", "[:tamil:]", "[\\u0bc6\\u0bc7\\u0bca\\u0B8E\\u0B92\\u0BA9\\u0BB1\\u0BB3\\u0BB4\\u0BB5]", /*roundtrip exclusions*/ "Telugu-BENGALI", "[:telugu:]", "[:BENGALI:]", - "[\\u09e2\\u09e3\\u09bc\\u09d7\\u09f0\\u09f1\\u09dc\\u09dd\\u09df]", /*roundtrip exclusions*/ + "[\\u09e2\\u09e3\\u09bc\\u09d7\\u09f0\\u09f1\\u09dc\\u09dd\\u09df\\u09f2-\\u09fa]", /*roundtrip exclusions*/ "BENGALI-TELUGU", "[:BENGALI:]", "[:TELUGU:]", "[\\u0c55\\u0c56\\u0c47\\u0c46\\u0c4a\\u0C0E\\u0C12\\u0C31\\u0C33\\u0C35]", /*roundtrip exclusions*/ "KANNADA-BENGALI", "[:KANNADA:]", "[:BENGALI:]", - "[\\u0981\\u09e2\\u09e3\\u09bc\\u09d7\\u09f0\\u09f1\\u09dc\\u09dd\\u09df]", /*roundtrip exclusions*/ + "[\\u0981\\u09e2\\u09e3\\u09bc\\u09d7\\u09dc\\u09dd\\u09df\\u09f0\\u09f1\\u09f2-\\u09fa]", /*roundtrip exclusions*/ "BENGALI-KANNADA", "[:BENGALI:]", "[:KANNADA:]", - "[\\u0cc6\\u0cca\\u0cd5\\u0cd6\\u0cc7\\u0C8E\\u0C92\\u0CB1\\u0cb3\\u0cb5\\u0cde]", /*roundtrip exclusions*/ + "[{\\u0cb0\\u0cbc}{\\u0cb3\\u0cbc}\\u0cc6\\u0cca\\u0cd5\\u0cd6\\u0cc7\\u0C8E\\u0C92\\u0CB1\\u0cb3\\u0cb5\\u0cde]", /*roundtrip exclusions*/ "MALAYALAM-BENGALI", "[:MALAYALAM:]", "[:BENGALI:]", - "[\\u0981\\u09e2\\u09e3\\u09bc\\u09c4\\u09f0\\u09f1\\u09dc\\u09dd\\u09df]", /*roundtrip exclusions*/ + "[\\u0981\\u09e2\\u09e3\\u09bc\\u09c4\\u09f0\\u09f1\\u09dc\\u09dd\\u09df\\u09dc\\u09dd\\u09df\\u09f2-\\u09fa]", /*roundtrip exclusions*/ "BENGALI-MALAYALAM", "[:BENGALI:]", "[:MALAYALAM:]", "[\\u0d46\\u0d4a\\u0d47\\u0d31-\\u0d35\\u0d0e\\u0d12]", /*roundtrip exclusions*/ @@ -1293,16 +1490,16 @@ static const char * const interIndicArray[] = { "[\\u0A02\\u0ab3\\u0ab6\\u0A70\\u0a71\\u0a82\\u0a83\\u0ac3\\u0ac4\\u0ac5\\u0ac9\\u0a5c\\u0a72\\u0a73\\u0a74\\u0a8b\\u0a8d\\u0a91\\u0abd]", /*roundtrip exclusions*/ "GURMUKHI-GUJARATI", "[:GURMUKHI:]", "[:GUJARATI:]", - "[\\u0A81\\u0A82\\u0ab3\\u0ab6\\u0A70\\u0a71\\u0a82\\u0a83\\u0ac3\\u0ac4\\u0ac5\\u0ac9\\u0a5c\\u0a72\\u0a73\\u0a74\\u0a8b\\u0a8d\\u0a91\\u0ab7\\u0abd\\u0ad0\\u0ae0]", /*roundtrip exclusions*/ + "[\\u0a5c\\u0A70\\u0a71\\u0a72\\u0a73\\u0a74\\u0a82\\u0a83\\u0a8b\\u0a8c\\u0a8d\\u0a91\\u0ab3\\u0ab6\\u0ab7\\u0abd\\u0ac3\\u0ac4\\u0ac5\\u0ac9\\u0ad0\\u0ae0\\u0ae1]", /*roundtrip exclusions*/ "ORIYA-GURMUKHI", "[:ORIYA:]", "[:GURMUKHI:]", "[\\u0A01\\u0A02\\u0a5c\\u0a21\\u0a47\\u0a71\\u0b02\\u0b03\\u0b33\\u0b36\\u0b43\\u0b56\\u0b57\\u0B0B\\u0B0C\\u0B37\\u0B3D\\u0B5F\\u0B60\\u0B61\\u0a35\\u0a72\\u0a73\\u0a74]", /*roundtrip exclusions*/ "GURMUKHI-ORIYA", "[:GURMUKHI:]", "[:ORIYA:]", - "[\\u0b01\\u0b02\\u0b03\\u0b33\\u0b36\\u0b43\\u0b56\\u0b57\\u0B0B\\u0B0C\\u0B37\\u0B3D\\u0B5F\\u0B60\\u0B61]", /*roundtrip exclusions*/ + "[\\u0b01\\u0b02\\u0b03\\u0b33\\u0b36\\u0b43\\u0b56\\u0b57\\u0B0B\\u0B0C\\u0B37\\u0B3D\\u0B5F\\u0B60\\u0B61\\u0b70\\u0b71]", /*roundtrip exclusions*/ "TAMIL-GURMUKHI", "[:TAMIL:]", "[:GURMUKHI:]", - "[\\u0A02\\u0a33\\u0a36\\u0a3c\\u0a70\\u0a71\\u0a47\\u0A16\\u0A17\\u0A18\\u0A1B\\u0A1D\\u0A20\\u0A21\\u0A22\\u0A25\\u0A26\\u0A27\\u0A2B\\u0A2C\\u0A2D\\u0A59\\u0A5A\\u0A5B\\u0A5C\\u0A5E\\u0A72\\u0A73\\u0A74]", /*roundtrip exclusions*/ + "[\\u0A01\\u0A02\\u0a33\\u0a36\\u0a3c\\u0a70\\u0a71\\u0a47\\u0A16\\u0A17\\u0A18\\u0A1B\\u0A1D\\u0A20\\u0A21\\u0A22\\u0A25\\u0A26\\u0A27\\u0A2B\\u0A2C\\u0A2D\\u0A59\\u0A5A\\u0A5B\\u0A5C\\u0A5E\\u0A72\\u0A73\\u0A74]", /*roundtrip exclusions*/ "GURMUKHI-TAMIL", "[:GURMUKHI:]", "[:TAMIL:]", "[\\u0b82\\u0bc6\\u0bca\\u0bd7\\u0bb7\\u0bb3\\u0b83\\u0B8E\\u0B92\\u0BA9\\u0BB1\\u0BB4]", /*roundtrip exclusions*/ @@ -1314,25 +1511,25 @@ static const char * const interIndicArray[] = { "[\\u0c01\\u0c02\\u0c03\\u0c33\\u0c36\\u0c44\\u0c43\\u0c46\\u0c4a\\u0c56\\u0c55\\u0C0B\\u0C0C\\u0C0E\\u0C12\\u0C31\\u0C37\\u0C60\\u0C61]", /*roundtrip exclusions*/ "KANNADA-GURMUKHI", "[:KANNADA:]", "[:GURMUKHI:]", - "[\\u0A02\\u0a33\\u0a36\\u0a3c\\u0a70\\u0a71\\u0A59\\u0A5A\\u0A5B\\u0A5C\\u0A5E\\u0A72\\u0A73\\u0A74]", /*roundtrip exclusions*/ + "[\\u0A01\\u0A02\\u0a33\\u0a36\\u0a3c\\u0a70\\u0a71\\u0A59\\u0A5A\\u0A5B\\u0A5C\\u0A5E\\u0A72\\u0A73\\u0A74]", /*roundtrip exclusions*/ "GURMUKHI-KANNADA", "[:GURMUKHI:]", "[:KANNADA:]", - "[\\u0c82\\u0c83\\u0cb3\\u0cb6\\u0cc4\\u0cc3\\u0cc6\\u0cca\\u0cd5\\u0cd6\\u0C8B\\u0C8C\\u0C8E\\u0C92\\u0CB1\\u0CB7\\u0CE0\\u0CE1]", /*roundtrip exclusions*/ + "[{\\u0cb0\\u0cbc}{\\u0cb3\\u0cbc}\\u0c82\\u0c83\\u0cb3\\u0cb6\\u0cc4\\u0cc3\\u0cc6\\u0cca\\u0cd5\\u0cd6\\u0C8B\\u0C8C\\u0C8E\\u0C92\\u0CB1\\u0CB7\\u0cbd\\u0CE0\\u0CE1\\u0cde]", /*roundtrip exclusions*/ "MALAYALAM-GURMUKHI", "[:MALAYALAM:]", "[:GURMUKHI:]", - "[\\u0A02\\u0a4b\\u0a4c\\u0a33\\u0a36\\u0a3c\\u0a70\\u0a71\\u0A59\\u0A5A\\u0A5B\\u0A5C\\u0A5E\\u0A72\\u0A73\\u0A74]", /*roundtrip exclusions*/ + "[\\u0A01\\u0A02\\u0a4b\\u0a4c\\u0a33\\u0a36\\u0a3c\\u0a70\\u0a71\\u0A59\\u0A5A\\u0A5B\\u0A5C\\u0A5E\\u0A72\\u0A73\\u0A74]", /*roundtrip exclusions*/ "GURMUKHI-MALAYALAM", "[:GURMUKHI:]", "[:MALAYALAM:]", "[\\u0d02\\u0d03\\u0d33\\u0d36\\u0d43\\u0d46\\u0d4a\\u0d4c\\u0d57\\u0D0B\\u0D0C\\u0D0E\\u0D12\\u0D31\\u0D34\\u0D37\\u0D60\\u0D61]", /*roundtrip exclusions*/ "GUJARATI-ORIYA", "[:GUJARATI:]", "[:ORIYA:]", - "[\\u0b56\\u0b57\\u0B0C\\u0B5F\\u0B61]", /*roundtrip exclusions*/ + "[\\u0b56\\u0b57\\u0B0C\\u0B5F\\u0B61\\u0b70\\u0b71]", /*roundtrip exclusions*/ "ORIYA-GUJARATI", "[:ORIYA:]", "[:GUJARATI:]", "[\\u0Ac4\\u0Ac5\\u0Ac9\\u0Ac7\\u0A8D\\u0A91\\u0AB5\\u0Ad0]", /*roundtrip exclusions*/ "TAMIL-GUJARATI", "[:TAMIL:]", "[:GUJARATI:]", - "[\\u0A81\\u0abc\\u0ac3\\u0Ac4\\u0Ac5\\u0Ac9\\u0Ac7\\u0A8B\\u0A8D\\u0A91\\u0A96\\u0A97\\u0A98\\u0A9B\\u0A9D\\u0AA0\\u0AA1\\u0AA2\\u0AA5\\u0AA6\\u0AA7\\u0AAB\\u0AAC\\u0AAD\\u0AB6\\u0ABD\\u0AD0\\u0AE0]", /*roundtrip exclusions*/ + "[\\u0A81\\u0a8c\\u0abc\\u0ac3\\u0Ac4\\u0Ac5\\u0Ac9\\u0Ac7\\u0A8B\\u0A8D\\u0A91\\u0A96\\u0A97\\u0A98\\u0A9B\\u0A9D\\u0AA0\\u0AA1\\u0AA2\\u0AA5\\u0AA6\\u0AA7\\u0AAB\\u0AAC\\u0AAD\\u0AB6\\u0ABD\\u0AD0\\u0AE0\\u0AE1]", /*roundtrip exclusions*/ "GUJARATI-TAMIL", "[:GUJARATI:]", "[:TAMIL:]", "[\\u0Bc6\\u0Bca\\u0Bd7\\u0B8E\\u0B92\\u0BA9\\u0BB1\\u0BB4]", /*roundtrip exclusions*/ @@ -1347,7 +1544,7 @@ static const char * const interIndicArray[] = { "[\\u0A81\\u0abc\\u0Ac5\\u0Ac9\\u0A8D\\u0A91\\u0ABD\\u0Ad0]", /*roundtrip exclusions*/ "GUJARATI-KANNADA", "[:GUJARATI:]", "[:KANNADA:]", - "[\\u0cc6\\u0cca\\u0cd5\\u0cd6\\u0C8C\\u0C8E\\u0C92\\u0CB1\\u0CDE\\u0CE1]", /*roundtrip exclusions*/ + "[{\\u0cb0\\u0cbc}{\\u0cb3\\u0cbc}\\u0cc6\\u0cca\\u0cd5\\u0cd6\\u0C8C\\u0C8E\\u0C92\\u0CB1\\u0CDE\\u0CE1]", /*roundtrip exclusions*/ "MALAYALAM-GUJARATI", "[:MALAYALAM:]", "[:GUJARATI:]", "[\\u0A81\\u0ac4\\u0acb\\u0acc\\u0abc\\u0Ac5\\u0Ac9\\u0A8D\\u0A91\\u0ABD\\u0Ad0]", /*roundtrip exclusions*/ @@ -1356,25 +1553,25 @@ static const char * const interIndicArray[] = { "[\\u0d46\\u0d4a\\u0d4c\\u0d55\\u0d57\\u0D0C\\u0D0E\\u0D12\\u0D31\\u0D34\\u0D61]", /*roundtrip exclusions*/ "TAMIL-ORIYA", "[:TAMIL:]", "[:ORIYA:]", - "[\\u0B01\\u0b3c\\u0b43\\u0b56\\u0B0B\\u0B0C\\u0B16\\u0B17\\u0B18\\u0B1B\\u0B1D\\u0B20\\u0B21\\u0B22\\u0B25\\u0B26\\u0B27\\u0B2B\\u0B2C\\u0B2D\\u0B36\\u0B3D\\u0B5C\\u0B5D\\u0B5F\\u0B60\\u0B61]", /*roundtrip exclusions*/ + "[\\u0B01\\u0b3c\\u0b43\\u0b56\\u0B0B\\u0B0C\\u0B16\\u0B17\\u0B18\\u0B1B\\u0B1D\\u0B20\\u0B21\\u0B22\\u0B25\\u0B26\\u0B27\\u0B2B\\u0B2C\\u0B2D\\u0B36\\u0B3D\\u0B5C\\u0B5D\\u0B5F\\u0B60\\u0B61\\u0b70\\u0b71]", /*roundtrip exclusions*/ "ORIYA-TAMIL", "[:ORIYA:]", "[:TAMIL:]", "[\\u0bc6\\u0bca\\u0bc7\\u0B8E\\u0B92\\u0BA9\\u0BB1\\u0BB4\\u0BB5]", /*roundtrip exclusions*/ "TELUGU-ORIYA", "[:TELUGU:]", "[:ORIYA:]", - "[\\u0b3c\\u0b57\\u0b56\\u0B3D\\u0B5C\\u0B5D\\u0B5F]", /*roundtrip exclusions*/ + "[\\u0b3c\\u0b57\\u0b56\\u0B3D\\u0B5C\\u0B5D\\u0B5F\\u0b70\\u0b71]", /*roundtrip exclusions*/ "ORIYA-TELUGU", "[:ORIYA:]", "[:TELUGU:]", "[\\u0c44\\u0c46\\u0c4a\\u0c55\\u0c47\\u0C0E\\u0C12\\u0C31\\u0C35]", /*roundtrip exclusions*/ "KANNADA-ORIYA", "[:KANNADA:]", "[:ORIYA:]", - "[\\u0B01\\u0b3c\\u0b57\\u0B3D\\u0B5C\\u0B5D\\u0B5F]", /*roundtrip exclusions*/ + "[\\u0B01\\u0b3c\\u0b57\\u0B3D\\u0B5C\\u0B5D\\u0B5F\\u0b70\\u0b71]", /*roundtrip exclusions*/ "ORIYA-KANNADA", "[:ORIYA:]", "[:KANNADA:]", - "[\\u0cc4\\u0cc6\\u0cca\\u0cd5\\u0cc7\\u0C8E\\u0C92\\u0CB1\\u0CB5\\u0CDE]", /*roundtrip exclusions*/ + "[{\\u0cb0\\u0cbc}{\\u0cb3\\u0cbc}\\u0cc4\\u0cc6\\u0cca\\u0cd5\\u0cc7\\u0C8E\\u0C92\\u0CB1\\u0CB5\\u0CDE]", /*roundtrip exclusions*/ "MALAYALAM-ORIYA", "[:MALAYALAM:]", "[:ORIYA:]", - "[\\u0B01\\u0b3c\\u0b56\\u0B3D\\u0B5C\\u0B5D\\u0B5F]", /*roundtrip exclusions*/ + "[\\u0B01\\u0b3c\\u0b56\\u0B3D\\u0B5C\\u0B5D\\u0B5F\\u0b70\\u0b71]", /*roundtrip exclusions*/ "ORIYA-MALAYALAM", "[:ORIYA:]", "[:MALAYALAM:]", "[\\u0D47\\u0D46\\u0D4a\\u0D0E\\u0D12\\u0D31\\u0D34\\u0D35]", /*roundtrip exclusions*/ @@ -1389,7 +1586,7 @@ static const char * const interIndicArray[] = { "[\\u0bd7\\u0bc6\\u0ba9\\u0bb4]", /*roundtrip exclusions*/ "TAMIL-KANNADA", "[:TAMIL:]", "[:KANNADA:]", - "[\\u0cc3\\u0cc4\\u0cc6\\u0cc7\\u0cd5\\u0cd6\\u0C8B\\u0C8C\\u0C96\\u0C97\\u0C98\\u0C9B\\u0C9D\\u0CA0\\u0CA1\\u0CA2\\u0CA5\\u0CA6\\u0CA7\\u0CAB\\u0CAC\\u0CAD\\u0CB6\\u0CDE\\u0CE0\\u0CE1]", /*roundtrip exclusions*/ + "[\\u0cc3\\u0cc4\\u0cc6\\u0cc7\\u0cd5\\u0cd6\\u0C8B\\u0C8C\\u0C96\\u0C97\\u0C98\\u0C9B\\u0C9D\\u0CA0\\u0CA1\\u0CA2\\u0CA5\\u0CA6\\u0CA7\\u0CAB\\u0CAC\\u0CAD\\u0CB6\\u0cbc\\u0cbd\\u0CDE\\u0CE0\\u0CE1]", /*roundtrip exclusions*/ "MALAYALAM-TAMIL", "[:MALAYALAM:]", "[:TAMIL:]", "[\\u0ba9]", /*roundtrip exclusions*/ @@ -1401,7 +1598,7 @@ static const char * const interIndicArray[] = { "[\\u0C01\\u0c3f\\u0c46\\u0c48\\u0c4a]", /*roundtrip exclusions*/ "TELUGU-KANNADA", "[:TELUGU:]", "[:KANNADA:]", - "[\\u0cc8\\u0cd5\\u0cd6\\u0CDE]", /*roundtrip exclusions*/ + "[\\u0cc8\\u0cd5\\u0cd6\\u0cbc\\u0cbd\\u0CDE]", /*roundtrip exclusions*/ "MALAYALAM-TELUGU", "[:MALAYALAM:]", "[:TELUGU:]", "[\\u0C01\\u0c44\\u0c4a\\u0c4c\\u0c4b\\u0c55\\u0c56]", /*roundtrip exclusions*/ @@ -1410,22 +1607,22 @@ static const char * const interIndicArray[] = { "[\\u0d4c\\u0d57\\u0D34]", /*roundtrip exclusions*/ "MALAYALAM-KANNADA", "[:MALAYALAM:]", "[:KANNADA:]", - "[\\u0cc4\\u0cc6\\u0cca\\u0ccc\\u0ccb\\u0cd5\\u0cd6\\u0cDe]", /*roundtrip exclusions*/ + "[\\u0cbc\\u0cbd\\u0cc4\\u0cc6\\u0cca\\u0ccc\\u0ccb\\u0cd5\\u0cd6\\u0cDe]", /*roundtrip exclusions*/ "KANNADA-MALAYALAM", "[:KANNADA:]", "[:MALAYALAM:]", "[\\u0d4c\\u0d57\\u0d46\\u0D34]", /*roundtrip exclusions*/ "Latin-Bengali",latinForIndic, "[[:Bengali:][\\u0964\\u0965]]", - "[\\u0965\\u09f0\\u09f1]" /*roundtrip exclusions*/ , + "[\\u0965\\u09f0-\\u09fa]" /*roundtrip exclusions*/ , "Latin-Gurmukhi", latinForIndic, "[[:Gurmukhi:][\\u0964\\u0965]]", - "[\\u0965\\u0a02\\u0a72\\u0a73\\u0a74]" /*roundtrip exclusions*/, + "[\\u0a01\\u0965\\u0a02\\u0a72\\u0a73\\u0a74]" /*roundtrip exclusions*/, "Latin-Gujarati",latinForIndic, "[[:Gujarati:][\\u0964\\u0965]]", "[\\u0965]" /*roundtrip exclusions*/, "Latin-Oriya",latinForIndic, "[[:Oriya:][\\u0964\\u0965]]", - "[\\u0965]" /*roundtrip exclusions*/, + "[\\u0965\\u0b70]" /*roundtrip exclusions*/, "Latin-Tamil",latinForIndic, "[:Tamil:]", NULL /*roundtrip exclusions*/, @@ -1459,22 +1656,13 @@ void TransliteratorRoundTripTest::TestInterIndic() { for(int i = 0; i < num;i++){ RTTest test(interIndicArray[i*INTER_INDIC_ARRAY_WIDTH + 0]); Legal *legal = new LegalIndic(); -#if (U_ICU_VERSION_MAJOR_NUM==2 && U_ICU_VERSION_MINOR_NUM==6) - UnicodeString temp1 = "["; - temp1.append(interIndicArray[i*INTER_INDIC_ARRAY_WIDTH + 1]); - temp1.append("& [:Age=3.2:]]"); - UnicodeString temp2 = "["; - temp2.append(interIndicArray[i*INTER_INDIC_ARRAY_WIDTH + 2]); - temp2.append("& [:Age=3.2:]]"); -#else - UnicodeString temp1 = interIndicArray[i*INTER_INDIC_ARRAY_WIDTH + 1]; - UnicodeString temp2 = interIndicArray[i*INTER_INDIC_ARRAY_WIDTH + 2]; -#endif - test.test(temp1, - temp2, - interIndicArray[i*INTER_INDIC_ARRAY_WIDTH + 3], // roundtrip exclusions - this, quick, legal, 50); - delete legal; + + test.test( interIndicArray[i*INTER_INDIC_ARRAY_WIDTH + 1], + interIndicArray[i*INTER_INDIC_ARRAY_WIDTH + 2], + interIndicArray[i*INTER_INDIC_ARRAY_WIDTH + 3], // roundtrip exclusions + this, quick, legal, 50); + + delete legal; } } diff --git a/icuSources/test/intltest/transrt.h b/icuSources/test/intltest/transrt.h index fdc28521..196ad7d9 100644 --- a/icuSources/test/intltest/transrt.h +++ b/icuSources/test/intltest/transrt.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2001, International Business Machines +* Copyright (C) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -31,12 +31,15 @@ class TransliteratorRoundTripTest : public IntlTest { void TestKatakana(void); void TestJamo(void); void TestHangul(void); + void TestHan(void); void TestGreek(void); void TestGreekUNGEGN(void); void Testel(void); void TestCyrillic(void); void TestDevanagariLatin(void); void TestInterIndic(void); + void TestHebrew(void); + void TestArabic(void); void TestDebug(const char* name,const char fromSet[], const char* toSet,const char* exclusions); }; diff --git a/icuSources/test/intltest/transtst.cpp b/icuSources/test/intltest/transtst.cpp index 7793f48d..7baf42d1 100644 --- a/icuSources/test/intltest/transtst.cpp +++ b/icuSources/test/intltest/transtst.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -17,17 +17,12 @@ #include "unicode/dtfmtsym.h" #include "unicode/normlzr.h" #include "unicode/translit.h" -#include "unicode/ucnv.h" -#include "unicode/ucnv_err.h" #include "unicode/uchar.h" #include "unicode/unifilt.h" #include "unicode/uniset.h" -#include "unitohex.h" -#include "unicode/utypes.h" #include "unicode/ustring.h" #include "unicode/usetiter.h" #include "unicode/uscript.h" -#include "hextouni.h" #include "cpdtrans.h" #include "nultrans.h" #include "rbt.h" @@ -42,6 +37,8 @@ #include "unesctrn.h" #include "uni2name.h" #include "cstring.h" +#include "cmemory.h" +#include <stdio.h> /*********************************************************************** @@ -102,6 +99,8 @@ TransliteratorTest::TransliteratorTest() { } +TransliteratorTest::~TransliteratorTest() {} + void TransliteratorTest::runIndexedTest(int32_t index, UBool exec, const char* &name, char* /*par*/) { @@ -188,6 +187,7 @@ TransliteratorTest::runIndexedTest(int32_t index, UBool exec, } } +static const UVersionInfo ICU_31 = {3,1,0,0}; /** * Make sure every system transliterator can be instantiated. * @@ -196,15 +196,35 @@ TransliteratorTest::runIndexedTest(int32_t index, UBool exec, * instantiates everything as well. */ void TransliteratorTest::TestInstantiation() { + UErrorCode ec = U_ZERO_ERROR; + StringEnumeration* avail = Transliterator::getAvailableIDs(ec); + assertSuccess("getAvailableIDs()", ec); + assertTrue("getAvailableIDs()!=NULL", avail!=NULL); int32_t n = Transliterator::countAvailableIDs(); + assertTrue("getAvailableIDs().count()==countAvailableIDs()", + avail->count(ec) == n); + assertSuccess("count()", ec); UnicodeString name; for (int32_t i=0; i<n; ++i) { - UnicodeString id = Transliterator::getAvailableID(i); + const UnicodeString& id = *avail->snext(ec); + if (!assertSuccess("snext()", ec) || + !assertTrue("snext()!=NULL", (&id)!=NULL, TRUE)) { + break; + } + UnicodeString id2 = Transliterator::getAvailableID(i); if (id.length() < 1) { errln(UnicodeString("FAIL: getAvailableID(") + i + ") returned empty string"); continue; } + if (id != id2) { + errln(UnicodeString("FAIL: getAvailableID(") + + i + ") != getAvailableIDs().snext()"); + continue; + } + if(id2.indexOf("Thai")>-1 && isICUVersionAtLeast(ICU_31)){ + continue; + } UParseError parseError; UErrorCode status = U_ZERO_ERROR; Transliterator* t = Transliterator::createInstance(id, @@ -249,6 +269,9 @@ void TransliteratorTest::TestInstantiation() { delete t; } } + assertTrue("snext()==NULL", avail->snext(ec)==NULL); + assertSuccess("snext()", ec); + delete avail; // Now test the failure path UParseError parseError; @@ -784,22 +807,27 @@ void TransliteratorTest::TestJ277(void) { * Prefix, suffix support in hex transliterators */ void TransliteratorTest::TestJ243(void) { - UErrorCode status = U_ZERO_ERROR; + UErrorCode ec = U_ZERO_ERROR; // Test default Hex-Any, which should handle // \u, \U, u+, and U+ - HexToUnicodeTransliterator hex; - expect(hex, UnicodeString("\\u0041+\\U0042,u+0043uu+0044z", ""), "A+B,CuDz"); - // Try a custom Hex-Unicode - // \uXXXX and &#xXXXX; - status = U_ZERO_ERROR; - HexToUnicodeTransliterator hex2(UnicodeString("\\\\u###0;&\\#x###0\\;", ""), status); - expect(hex2, UnicodeString("\\u61\\u062\\u0063\\u00645\\u66x0123", ""), - "abcd5fx0123"); - // Try custom Any-Hex (default is tested elsewhere) - status = U_ZERO_ERROR; - UnicodeToHexTransliterator hex3(UnicodeString("&\\#x###0;", ""), status); - expect(hex3, "012", "012"); + Transliterator *hex = + Transliterator::createInstance("Hex-Any", UTRANS_FORWARD, ec); + if (assertSuccess("getInstance", ec)) { + expect(*hex, UnicodeString("\\u0041+\\U00000042,U+0043uU+0044z", ""), "A+B,CuDz"); + } + delete hex; + +// // Try a custom Hex-Unicode +// // \uXXXX and &#xXXXX; +// ec = U_ZERO_ERROR; +// HexToUnicodeTransliterator hex2(UnicodeString("\\\\u###0;&\\#x###0\\;", ""), ec); +// expect(hex2, UnicodeString("\\u61\\u062\\u0063\\u00645\\u66x0123", ""), +// "abcd5fx0123"); +// // Try custom Any-Hex (default is tested elsewhere) +// ec = U_ZERO_ERROR; +// UnicodeToHexTransliterator hex3(UnicodeString("&\\#x###0;", ""), ec); +// expect(hex3, "012", "012"); } /** @@ -1296,7 +1324,10 @@ void TransliteratorTest::TestCreateInstance(){ UnicodeString expID(DATA[i+2]); Transliterator* t = Transliterator::createInstance(id,dir,err,ec); - UnicodeString newID = t?t->getID():UnicodeString(); + UnicodeString newID; + if (t) { + newID = t->getID(); + } UBool ok = (newID == expID); if (!t) { newID = u_errorName(ec); @@ -2250,15 +2281,22 @@ void TransliteratorTest::TestCompoundFilterID(void) { t = Transliterator::createInstance(id, direction, pe, ec); } UBool ok = (t != NULL && U_SUCCESS(ec)); + UnicodeString transID; + if (t!=0) { + transID = t->getID(); + } + else { + transID = UnicodeString("NULL", ""); + } if (ok == expOk) { - logln((UnicodeString)"Ok: " + id + " => " + (t!=0?t->getID():(UnicodeString)"NULL") + ", " + + logln((UnicodeString)"Ok: " + id + " => " + transID + ", " + u_errorName(ec)); if (source.length() != 0) { expect(*t, source, exp); } delete t; } else { - errln((UnicodeString)"FAIL: " + id + " => " + (t!=0?t->getID():(UnicodeString)"NULL") + ", " + + errln((UnicodeString)"FAIL: " + id + " => " + transID + ", " + u_errorName(ec)); } } @@ -2295,9 +2333,9 @@ void TransliteratorTest::TestNewEngine() { // true. Otherwise, this test will fail, revealing a // limitation of global filters in incremental mode. Transliterator *a = - Transliterator::createFromRules("a", "a > A;", UTRANS_FORWARD, pe, ec); + Transliterator::createFromRules("a_to_A", "a > A;", UTRANS_FORWARD, pe, ec); Transliterator *A = - Transliterator::createFromRules("A", "A > b;", UTRANS_FORWARD, pe, ec); + Transliterator::createFromRules("A_to_b", "A > b;", UTRANS_FORWARD, pe, ec); if (U_FAILURE(ec)) { delete a; delete A; @@ -2327,6 +2365,13 @@ void TransliteratorTest::TestNewEngine() { } expect(*t, "aAaA", "bAbA"); + + assertTrue("countElements", t->countElements() == 3); + assertEquals("getElement(0)", t->getElement(0, ec).getID(), "a_to_A"); + assertEquals("getElement(1)", t->getElement(1, ec).getID(), "NFD"); + assertEquals("getElement(2)", t->getElement(2, ec).getID(), "A_to_b"); + assertSuccess("getElement", ec); + delete a; delete A; delete array[1]; @@ -3321,9 +3366,9 @@ void TransliteratorTest::TestSpecialCases(void) { char* Char32ToEscapedChars(UChar32 ch, char* buffer) { if (ch <= 0xFFFF) { - sprintf(buffer, "\\u%04x", ch); + sprintf(buffer, "\\u%04x", (int)ch); } else { - sprintf(buffer, "\\u%08x", ch); + sprintf(buffer, "\\U%08x", (int)ch); } return buffer; } @@ -3432,7 +3477,10 @@ void TransliteratorTest::TestIncrementalProgress(void) { Transliterator::getAvailableVariant(k, source, target, variant); UnicodeString id = source + "-" + target + "/" + variant; - + + if(id.indexOf("Thai")>-1 && isICUVersionAtLeast(ICU_31)){ + continue; + } Transliterator *t = Transliterator::createInstance(id, UTRANS_FORWARD, err, status); if (U_FAILURE(status)) { errln((UnicodeString)"FAIL: Could not create " + id); @@ -3598,7 +3646,7 @@ void TransliteratorTest::TestMulticharStringSet() { Transliterator* _TUFF[4]; UnicodeString* _TUFID[4]; -static Transliterator* _TUFFactory(const UnicodeString& /*ID*/, +static Transliterator* U_EXPORT2 _TUFFactory(const UnicodeString& /*ID*/, Transliterator::Token context) { return _TUFF[context.integer]->clone(); } diff --git a/icuSources/test/intltest/transtst.h b/icuSources/test/intltest/transtst.h index 79671998..a331a843 100644 --- a/icuSources/test/intltest/transtst.h +++ b/icuSources/test/intltest/transtst.h @@ -25,7 +25,7 @@ class TransliteratorTest : public IntlTest { public: TransliteratorTest(); - virtual ~TransliteratorTest() {} + virtual ~TransliteratorTest(); private: void runIndexedTest(int32_t index, UBool exec, const char* &name, diff --git a/icuSources/test/intltest/trcoll.cpp b/icuSources/test/intltest/trcoll.cpp index 70d5d334..09f030b4 100644 --- a/icuSources/test/intltest/trcoll.cpp +++ b/icuSources/test/intltest/trcoll.cpp @@ -1,33 +1,18 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ -#include "unicode/utypes.h" +#include "unicode/unistr.h" #if !UCONFIG_NO_COLLATION -#ifndef _COLL +#include "unicode/tstdtmod.h" #include "unicode/coll.h" -#endif - -#ifndef _TBLCOLL #include "unicode/tblcoll.h" -#endif - -#ifndef _UNISTR -#include "unicode/unistr.h" -#endif - -#ifndef _SORTKEY #include "unicode/sortkey.h" -#endif - -#ifndef _TRCOLL #include "trcoll.h" -#endif - #include "sfwdchit.h" CollationTurkishTest::CollationTurkishTest() diff --git a/icuSources/test/intltest/trnserr.cpp b/icuSources/test/intltest/trnserr.cpp index 05446c5c..46155390 100644 --- a/icuSources/test/intltest/trnserr.cpp +++ b/icuSources/test/intltest/trnserr.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 2001-2003, International Business Machines Corporation and + * Copyright (c) 2001-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /************************************************************************ @@ -23,8 +23,6 @@ #include "unicode/translit.h" #include "unicode/uniset.h" #include "rbt.h" -#include "unitohex.h" -#include "hextouni.h" #include "unicode/unifilt.h" #include "cpdtrans.h" #include "nultrans.h" @@ -44,9 +42,9 @@ TransliteratorErrorTest::runIndexedTest(int32_t index, UBool exec, switch (index) { TESTCASE(0,TestTransliteratorErrors); TESTCASE(1, TestUnicodeSetErrors); - TESTCASE(2, TestUniToHexErrors); - TESTCASE(3, TestRBTErrors); - TESTCASE(4, TestHexToUniErrors); + TESTCASE(2, TestRBTErrors); + //TESTCASE(3, TestUniToHexErrors); + //TESTCASE(4, TestHexToUniErrors); // TODO: Add a subclass to test clone(). default: name = ""; break; } @@ -192,29 +190,29 @@ void TransliteratorErrorTest::TestUnicodeSetErrors() { delete set1; } -void TransliteratorErrorTest::TestUniToHexErrors() { - UErrorCode status = U_ZERO_ERROR; - Transliterator *t = new UnicodeToHexTransliterator("", TRUE, NULL, status); - if (U_SUCCESS(status)) { - errln("FAIL: Created a UnicodeToHexTransliterator with an empty pattern."); - } - delete t; - - status = U_ZERO_ERROR; - t = new UnicodeToHexTransliterator("\\x", TRUE, NULL, status); - if (U_SUCCESS(status)) { - errln("FAIL: Created a UnicodeToHexTransliterator with a bad pattern."); - } - delete t; - - status = U_ZERO_ERROR; - t = new UnicodeToHexTransliterator(); - ((UnicodeToHexTransliterator*)t)->applyPattern("\\x", status); - if (U_SUCCESS(status)) { - errln("FAIL: UnicodeToHexTransliterator::applyPattern succeeded with a bad pattern."); - } - delete t; -} +//void TransliteratorErrorTest::TestUniToHexErrors() { +// UErrorCode status = U_ZERO_ERROR; +// Transliterator *t = new UnicodeToHexTransliterator("", TRUE, NULL, status); +// if (U_SUCCESS(status)) { +// errln("FAIL: Created a UnicodeToHexTransliterator with an empty pattern."); +// } +// delete t; +// +// status = U_ZERO_ERROR; +// t = new UnicodeToHexTransliterator("\\x", TRUE, NULL, status); +// if (U_SUCCESS(status)) { +// errln("FAIL: Created a UnicodeToHexTransliterator with a bad pattern."); +// } +// delete t; +// +// status = U_ZERO_ERROR; +// t = new UnicodeToHexTransliterator(); +// ((UnicodeToHexTransliterator*)t)->applyPattern("\\x", status); +// if (U_SUCCESS(status)) { +// errln("FAIL: UnicodeToHexTransliterator::applyPattern succeeded with a bad pattern."); +// } +// delete t; +//} void TransliteratorErrorTest::TestRBTErrors() { @@ -244,26 +242,26 @@ void TransliteratorErrorTest::TestRBTErrors() { } } -void TransliteratorErrorTest::TestHexToUniErrors() { - UErrorCode status = U_ZERO_ERROR; - Transliterator *t = new HexToUnicodeTransliterator("", NULL, status); - if (U_FAILURE(status)) { - errln("FAIL: Could not create a HexToUnicodeTransliterator with an empty pattern."); - } - delete t; - status = U_ZERO_ERROR; - t = new HexToUnicodeTransliterator("\\x", NULL, status); - if (U_SUCCESS(status)) { - errln("FAIL: Created a HexToUnicodeTransliterator with a bad pattern."); - } - delete t; - status = U_ZERO_ERROR; - t = new HexToUnicodeTransliterator(); - ((HexToUnicodeTransliterator*)t)->applyPattern("\\x", status); - if (U_SUCCESS(status)) { - errln("FAIL: HexToUnicodeTransliterator::applyPattern succeeded with a bad pattern."); - } - delete t; -} +//void TransliteratorErrorTest::TestHexToUniErrors() { +// UErrorCode status = U_ZERO_ERROR; +// Transliterator *t = new HexToUnicodeTransliterator("", NULL, status); +// if (U_FAILURE(status)) { +// errln("FAIL: Could not create a HexToUnicodeTransliterator with an empty pattern."); +// } +// delete t; +// status = U_ZERO_ERROR; +// t = new HexToUnicodeTransliterator("\\x", NULL, status); +// if (U_SUCCESS(status)) { +// errln("FAIL: Created a HexToUnicodeTransliterator with a bad pattern."); +// } +// delete t; +// status = U_ZERO_ERROR; +// t = new HexToUnicodeTransliterator(); +// ((HexToUnicodeTransliterator*)t)->applyPattern("\\x", status); +// if (U_SUCCESS(status)) { +// errln("FAIL: HexToUnicodeTransliterator::applyPattern succeeded with a bad pattern."); +// } +// delete t; +//} #endif /* #if !UCONFIG_NO_TRANSLITERATION */ diff --git a/icuSources/test/intltest/trnserr.h b/icuSources/test/intltest/trnserr.h index f4e415c4..ab34a6d6 100644 --- a/icuSources/test/intltest/trnserr.h +++ b/icuSources/test/intltest/trnserr.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 2001, International Business Machines Corporation and + * Copyright (c) 2001-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /************************************************************************ @@ -37,11 +37,11 @@ public: void TestUnicodeSetErrors(void); - void TestUniToHexErrors(void); + //void TestUniToHexErrors(void); void TestRBTErrors(void); - void TestHexToUniErrors(void); + //void TestHexToUniErrors(void); }; diff --git a/icuSources/test/intltest/tscoll.cpp b/icuSources/test/intltest/tscoll.cpp index 9a44b5a0..c01aaa11 100644 --- a/icuSources/test/intltest/tscoll.cpp +++ b/icuSources/test/intltest/tscoll.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -20,7 +20,7 @@ #if !UCONFIG_NO_COLLATION #include "unicode/uchar.h" - +#include "unicode/ustring.h" #include "dadrcoll.h" @@ -48,281 +48,52 @@ #include "lcukocol.h" #include "ucaconf.h" #include "svccoll.h" +#include "cmemory.h" + +#define TESTCLASS(n,classname) \ + case n: \ + name = #classname; \ + if (exec) { \ + logln(#classname "---"); \ + logln(""); \ + classname t; \ + callTest(t, par); \ + } \ + break void IntlTestCollator::runIndexedTest( int32_t index, UBool exec, const char* &name, char* par ) { - if (exec) - { + if (exec) { logln("TestSuite Collator: "); } - switch (index) - { - case 0: - name = "CollationEnglishTest"; - - if (exec) - { - logln("CollationEnglishtest---"); - logln(""); - CollationEnglishTest test; - callTest( test, par ); - } - break; - - case 1: - name = "CollationFrenchTest"; - - if (exec) - { - logln("CollationFrenchtest---"); - logln(""); - CollationFrenchTest test; - callTest( test, par ); - } - break; - - case 2: - name = "CollationGermanTest"; - - if (exec) - { - logln("CollationGermantest---"); - logln(""); - - CollationGermanTest test; - callTest( test, par ); - } - break; - - case 3: - name = "CollationDanishTest"; - - if (exec) - { - logln("CollationDanishtest---"); - logln(""); - - CollationDanishTest test; - callTest( test, par ); - } - break; - - case 4: - name = "CollationSpanishTest"; - - if (exec) - { - logln("CollationSpanishtest---"); - logln(""); - - CollationSpanishTest test; - callTest( test, par ); - } - break; - - case 5: - name = "CollationFinnishTest"; - - if (exec) - { - logln("CollationFinnishtest---"); - - CollationFinnishTest test; - callTest( test, par ); - } - break; - - case 6: - name = "CollationKanaTest"; - - if (exec) - { - logln("CollationKanatest---"); - - CollationKanaTest test; - callTest( test, par ); - } - break; - - case 7: - name = "CollationTurkishTest"; - - if (exec) - { - logln("CollationTurkishtest---"); - logln(""); - - CollationTurkishTest test; - callTest( test, par ); - } - break; - - case 8: - name = "CollationDummyTest"; - - if (exec) - { - logln("CollationDummyTest---"); - - CollationDummyTest test; - callTest( test, par ); - } - break; - - case 9: - name = "G7CollationTest"; - - if (exec) - { - logln("G7CollationTest---"); - - G7CollationTest test; - callTest( test, par ); - } - break; - - case 10: - name = "CollationMonkeyTest"; - - if (exec) - { - logln("CollationMonkeyTest---"); - - CollationMonkeyTest test; - callTest( test, par ); - } - break; - - case 11: - name = "CollationAPITest"; - - if (exec) - { - logln("CollationAPITest---"); - logln(""); - - CollationAPITest test; - callTest( test, par ); - } - break; - - case 12: - name = "CollationRegressionTest"; - - if (exec) - { - logln("CollationRegressionTest---"); - - CollationRegressionTest test; - callTest( test, par ); - } - break; - - case 13: - name = "CollationCurrencyTest"; - - if (exec) - { - logln("CollationCurrencyTest---"); - logln(""); - - CollationCurrencyTest test; - callTest( test, par ); - } - break; - - case 14: - name = "CollationIteratorTest"; - - if (exec) - { - logln("CollationIteratorTest---"); - - CollationIteratorTest test; - callTest( test, par ); - } - break; - - case 15: - /* name = "CollationCAPITest"; - if (exec) { - logln("Collation C API test---"); logln(""); - CollationCAPITest test; - callTest( test, par ); - } - break; - - case 16: */ - name = "CollationThaiTest"; - if (exec) { - logln("CollationThaiTest---"); - - CollationThaiTest test; - callTest( test, par ); - } - break; - - case 16: - name = "LotusCollationTest"; - - name = "LotusCollationKoreanTest"; - if (exec) { - logln("LotusCollationKoreanTest---"); logln(""); - LotusCollationKoreanTest test; - callTest( test, par ); - } - break; - - case 17: - name = "StringSearchTest"; - if (exec) { - logln("StringSearchTest---"); - - StringSearchTest test; - callTest( test, par ); - } - break; - - case 18: - name = "ContractionTableTest"; - - name = "ContractionTableTest"; - if (exec) { - logln("ContractionTableTest---"); logln(""); - ContractionTableTest test; - callTest( test, par ); - } - break; - - case 19: - name = "DataDrivenTest"; - if (exec) { - logln("DataDrivenTest---"); logln(""); - DataDrivenCollatorTest test; - callTest( test, par ); - } - break; - - case 20: - name = "UCAConformanceTest"; - if (exec) { - logln("UCAConformanceTest---"); logln(""); - UCAConformanceTest test; - callTest( test, par ); - } - break; - - case 21: - name = "CollationServiceTest"; - if (exec) { - logln("CollationServiceTest---"); logln(""); - CollationServiceTest test; - callTest( test, par ); - } - break; - - default: name = ""; break; + switch (index) { + TESTCLASS(0, CollationEnglishTest); + TESTCLASS(1, CollationFrenchTest); + TESTCLASS(2, CollationGermanTest); + TESTCLASS(3, CollationSpanishTest); + TESTCLASS(4, CollationKanaTest); + TESTCLASS(5, CollationTurkishTest); + TESTCLASS(6, CollationDummyTest); + TESTCLASS(7, G7CollationTest); + TESTCLASS(8, CollationMonkeyTest); + TESTCLASS(9, CollationAPITest); + TESTCLASS(10, CollationRegressionTest); + TESTCLASS(11, CollationCurrencyTest); + TESTCLASS(12, CollationIteratorTest); + TESTCLASS(13, CollationThaiTest); + TESTCLASS(14, LotusCollationKoreanTest); + TESTCLASS(15, StringSearchTest); + TESTCLASS(16, ContractionTableTest); + TESTCLASS(17, DataDrivenCollatorTest); + TESTCLASS(18, UCAConformanceTest); + TESTCLASS(19, CollationServiceTest); + + //TESTCLASS(n, CollationDanishTest); // removed by weiv - we have changed Danish collation + TESTCLASS(20, CollationFinnishTest); // removed by weiv - we have changed Finnish collation + //TESTCLASS(n, CollationCAPITest); + + default: name = ""; break; } } @@ -386,7 +157,7 @@ IntlTestCollator::doTestVariant(Collator* col, const UnicodeString &source, cons const UChar* trg = target.getBuffer(); UCollationResult compareResultIter = (UCollationResult)result; - if(!quick) { + if(1) { UCharIterator sIter, tIter; uiter_setString(&sIter, src, sLen); uiter_setString(&tIter, trg, tLen); @@ -636,6 +407,15 @@ void IntlTestCollator::backAndForth(CollationElementIterator &iter) while ((o = iter.previous(status)) != CollationElementIterator::NULLORDER) { + if (index == 0) { + if(o == 0) { + continue; + } else { // this is an error, orders exhausted but there are non-ignorable CEs from + // going backwards + errln("Backward iteration returned a non ignorable after orders are exhausted"); + break; + } + } if (o != orders[--index]) { if (o == 0) @@ -647,8 +427,8 @@ void IntlTestCollator::backAndForth(CollationElementIterator &iter) } if (o != orders[index]) { - errln("Mismatch at index %d: 0x%X vs 0x%X", index, - orders[index], o); + errln("Mismatch at index %d: 0x%X vs 0x%X", index, + orders[index], o); break; } } diff --git a/icuSources/test/intltest/tscoll.h b/icuSources/test/intltest/tscoll.h index ef4d4b37..b3de70f3 100644 --- a/icuSources/test/intltest/tscoll.h +++ b/icuSources/test/intltest/tscoll.h @@ -17,11 +17,7 @@ #include "intltest.h" #include "unicode/coll.h" -#include "unicode/sortkey.h" -#include "unicode/schriter.h" -#include "unicode/ures.h" #include "unicode/coleitr.h" -#include "cmemory.h" class IntlTestCollator: public IntlTest { diff --git a/icuSources/test/intltest/tsdate.cpp b/icuSources/test/intltest/tsdate.cpp index c4dd672d..fed509f5 100644 --- a/icuSources/test/intltest/tsdate.cpp +++ b/icuSources/test/intltest/tsdate.cpp @@ -1,8 +1,8 @@ -/******************************************************************** +/*********************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ + * Copyright (c) 1997-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ***********************************************************************/ #include "unicode/utypes.h" @@ -11,12 +11,15 @@ #include "unicode/datefmt.h" #include "unicode/smpdtfmt.h" #include "tsdate.h" +#include "putilimp.h" #include <float.h> #include <stdlib.h> const double IntlTestDateFormat::ONEYEAR = 365.25 * ONEDAY; // Approximate +IntlTestDateFormat::~IntlTestDateFormat() {} + /** * This test does round-trip testing (format -> parse -> format -> parse -> etc.) of * DateFormat. @@ -150,6 +153,9 @@ void IntlTestDateFormat::tryDate(UDate theDate) int32_t dateMatch = 0; int32_t stringMatch = 0; UBool dump = FALSE; +#if defined (U_CAL_DEBUG) + dump = TRUE; +#endif int32_t i; date[0] = theDate; diff --git a/icuSources/test/intltest/tsdate.h b/icuSources/test/intltest/tsdate.h index 3f583a64..2707bacd 100644 --- a/icuSources/test/intltest/tsdate.h +++ b/icuSources/test/intltest/tsdate.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2003, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -74,7 +74,7 @@ private: DATE_TIME }; public: - virtual ~IntlTestDateFormat() {} + virtual ~IntlTestDateFormat(); }; #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/test/intltest/tsdtfmsy.cpp b/icuSources/test/intltest/tsdtfmsy.cpp index acd8c633..fb974e36 100644 --- a/icuSources/test/intltest/tsdtfmsy.cpp +++ b/icuSources/test/intltest/tsdtfmsy.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2003, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ diff --git a/icuSources/test/intltest/tsmthred.cpp b/icuSources/test/intltest/tsmthred.cpp index 8f33caba..90e8c9fd 100644 --- a/icuSources/test/intltest/tsmthred.cpp +++ b/icuSources/test/intltest/tsmthred.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1999-2003, International Business Machines Corporation and + * Copyright (c) 1999-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -10,19 +10,22 @@ # endif #endif -#include <unicode/umachine.h> - -// Just turn off threads on cygwin, so that we can test -// the other stuff. This needs to be investigated further. -#if defined(U_CYGWIN) -#define ICU_USE_THREADS 0 -#endif - +#include "unicode/utypes.h" +#include "unicode/ustring.h" +#include "umutex.h" +#include "cmemory.h" +#include "cstring.h" +#include "uparse.h" +#include "unicode/resbund.h" +#include "unicode/udata.h" +#include "unicode/uloc.h" +#include "unicode/locid.h" +#include "putilimp.h" #if !defined(WIN32) && !defined(XP_MAC) && !defined(U_RHAPSODY) #define POSIX 1 #endif -#if defined(POSIX) || defined(U_SOLARIS) || defined(AIX) || defined(HPUX) +#if defined(POSIX) || defined(U_SOLARIS) || defined(U_AIX) || defined(U_HPUX) #define HAVE_IMP @@ -66,17 +69,7 @@ #undef sleep #endif -#include "unicode/utypes.h" - -/* APP_NO_THREADS is an old symbol. We'll honour it if present. */ -#ifdef APP_NO_THREADS -# define ICU_USE_THREADS 0 -#endif -/* Default: use threads. */ -#ifndef ICU_USE_THREADS -# define ICU_USE_THREADS 1 -#endif #include "tsmthred.h" @@ -124,14 +117,45 @@ void MultithreadTest::runIndexedTest( int32_t index, UBool exec, #include "unicode/msgfmt.h" #include "unicode/locid.h" #include "unicode/ucol.h" +#include "unicode/calendar.h" #include "ucaconf.h" +//----------------------------------------------------------------------------------- +// +// class SimpleThread Of course we need a thread class first.. +// This wrapper has a ported implementation. +// +//----------------------------------------------------------------------------------- +class SimpleThread +{ +public: + SimpleThread(); + virtual ~SimpleThread(); + int32_t start(void); // start the thread + UBool isRunning(); // return true if a started thread has exited. + + virtual void run(void) = 0; // Override this to provide the code to run + // in the thread. + void *fImplementation; + +public: + static void sleep(int32_t millis); // probably shouldn't go here but oh well. + static void errorFunc(); // Empty function, provides a single convenient place + // to break on errors. +}; + +void SimpleThread::errorFunc() { + // *(char *)0 = 3; // Force entry into a debugger via a crash; +} + + + + #ifdef WIN32 #define HAVE_IMP # define VC_EXTRALEAN # define WIN32_LEAN_AND_MEAN -# define NOGDI # define NOUSER # define NOSERVICE # define NOIME @@ -139,14 +163,24 @@ void MultithreadTest::runIndexedTest( int32_t index, UBool exec, #include <windows.h> #include <process.h> + + +//----------------------------------------------------------------------------------- +// +// class SimpleThread Windows Implementation +// +//----------------------------------------------------------------------------------- struct Win32ThreadImplementation { - unsigned long fHandle; + HANDLE fHandle; + unsigned int fThreadID; }; -extern "C" void __cdecl SimpleThreadProc(void *arg) + +extern "C" unsigned int __stdcall SimpleThreadProc(void *arg) { ((SimpleThread*)arg)->run(); + return 0; } SimpleThread::SimpleThread() @@ -154,12 +188,21 @@ SimpleThread::SimpleThread() { Win32ThreadImplementation *imp = new Win32ThreadImplementation; imp->fHandle = 0; - fImplementation = imp; } SimpleThread::~SimpleThread() { + // Destructor. Because we start the thread running with _beginthreadex(), + // we own the Windows HANDLE for the thread and must + // close it here. + Win32ThreadImplementation *imp = (Win32ThreadImplementation*)fImplementation; + if (imp != 0) { + if (imp->fHandle != 0) { + CloseHandle(imp->fHandle); + imp->fHandle = 0; + } + } delete (Win32ThreadImplementation*)fImplementation; } @@ -172,8 +215,16 @@ int32_t SimpleThread::start() return -1; } - imp->fHandle = _beginthread( SimpleThreadProc, 0 /*stack size*/ , (void *)this ); - if (imp->fHandle == -1) { + imp->fHandle = (HANDLE) _beginthreadex( + NULL, // Security + 0x20000, // Stack Size + SimpleThreadProc, // Function to Run + (void *)this, // Arg List + 0, // initflag. Start running, not suspended + &imp->fThreadID // thraddr + ); + + if (imp->fHandle == 0) { // An error occured int err = errno; if (err == 0) { @@ -184,11 +235,49 @@ int32_t SimpleThread::start() return 0; } + +UBool SimpleThread::isRunning() { + // + // Test whether the thread associated with the SimpleThread object is + // still actually running. + // + // NOTE: on Win64 on Itanium processors, a crashes + // occur if the main thread of a process exits concurrently with some + // other thread(s) exiting. To avoid the possibility, we wait until the + // OS indicates that all threads have terminated, rather than waiting + // only until the end of the user's Run function has been reached. + // + // I don't know whether the crashes represent a Windows bug, or whether + // main() programs are supposed to have to wait for their threads. + // + Win32ThreadImplementation *imp = (Win32ThreadImplementation*)fImplementation; + + bool success; + DWORD threadExitCode; + + if (imp->fHandle == 0) { + // No handle, thread must not be running. + return FALSE; + } + success = GetExitCodeThread(imp->fHandle, &threadExitCode) != 0; + if (! success) { + // Can't get status, thread must not be running. + return FALSE; + } + return (threadExitCode == STILL_ACTIVE); +} + + void SimpleThread::sleep(int32_t millis) { ::Sleep(millis); } +//----------------------------------------------------------------------------------- +// +// class SimpleThread NULL Implementation +// +//----------------------------------------------------------------------------------- #elif defined XP_MAC // since the Mac has no preemptive threading (at least on MacOS 8), only @@ -214,55 +303,141 @@ SimpleThread::run() void SimpleThread::sleep(int32_t millis) {} + +UBool +SimpleThread::isRunning() { + return FALSE; +} + #endif -#if defined(POSIX)||defined(U_SOLARIS)||defined(AIX)||defined(HPUX) +//----------------------------------------------------------------------------------- +// +// class SimpleThread POSIX implementation +// +// A note on the POSIX vs the Windows implementations of this class.. +// On Windows, the main thread must verify that other threads have finished +// before exiting, or crashes occasionally occur. (Seen on Itanium Win64 only) +// The function SimpleThread::isRunning() is used for this purpose. +// +// On POSIX, there is NO reliable non-blocking mechanism to determine +// whether a thread has exited. pthread_kill(thread, 0) almost works, +// but the system can recycle thread ids immediately, so seeing that a +// thread exists with this call could mean that the original thread has +// finished and a new one started with the same ID. Useless. +// +// So we need to do the check with user code, by setting a flag just before +// the thread function returns. A technique that is guaranteed to fail +// on Windows, because it indicates that the thread is done before all +// system level cleanup has happened. +// +//----------------------------------------------------------------------------------- +#if defined(POSIX)||defined(U_SOLARIS)||defined(U_AIX)||defined(U_HPUX) #define HAVE_IMP struct PosixThreadImplementation { - pthread_t fThread; + pthread_t fThread; + UBool fRunning; + UBool fRan; /* True if the thread was successfully started */ }; extern "C" void* SimpleThreadProc(void *arg) { - ((SimpleThread*)arg)->run(); + // This is the code that is run in the new separate thread. + SimpleThread *This = (SimpleThread *)arg; + This->run(); // Run the user code. + + // The user function has returned. Set the flag indicating that this thread + // is done. Need a mutex for memory barrier purposes only, so that other thread + // will reliably see that the flag has changed. + PosixThreadImplementation *imp = (PosixThreadImplementation*)This->fImplementation; + umtx_lock(NULL); + imp->fRunning = FALSE; + umtx_unlock(NULL); return 0; } -SimpleThread::SimpleThread() :fImplementation(0) +SimpleThread::SimpleThread() { PosixThreadImplementation *imp = new PosixThreadImplementation; + imp->fRunning = FALSE; + imp->fRan = FALSE; fImplementation = imp; } SimpleThread::~SimpleThread() { - delete (PosixThreadImplementation*)fImplementation; + PosixThreadImplementation *imp = (PosixThreadImplementation*)fImplementation; + if (imp->fRan) { + pthread_join(imp->fThread, NULL); + } + delete imp; + fImplementation = (void *)0xdeadbeef; } int32_t SimpleThread::start() { - PosixThreadImplementation *imp = (PosixThreadImplementation*)fImplementation; - - int32_t rc; + int32_t rc; + static pthread_attr_t attr; + static UBool attrIsInitialized = FALSE; - pthread_attr_t attr; + PosixThreadImplementation *imp = (PosixThreadImplementation*)fImplementation; + imp->fRunning = TRUE; + imp->fRan = TRUE; #ifdef HPUX_CMA - rc = pthread_attr_create(&attr); + if (attrIsInitialized == FALSE) { + rc = pthread_attr_create(&attr); + attrIsInitialized = TRUE; + } rc = pthread_create(&(imp->fThread),attr,&SimpleThreadProc,(void*)this); - pthread_attr_delete(&attr); #else - rc = pthread_attr_init(&attr); + if (attrIsInitialized == FALSE) { + rc = pthread_attr_init(&attr); +#if defined(OS390) + { + int detachstate = 0; /* jdc30: detach state of zero causes + threads created with this attr to be in + an undetached state. An undetached + thread will keep its resources after + termination. */ + pthread_attr_setdetachstate(&attr, &detachstate); + } +#else + // pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); +#endif + attrIsInitialized = TRUE; + } rc = pthread_create(&(imp->fThread),&attr,&SimpleThreadProc,(void*)this); - pthread_attr_destroy(&attr); #endif + + if (rc != 0) { + // some kind of error occured, the thread did not start. + imp->fRan = FALSE; + imp->fRunning = FALSE; + } + return rc; +} + +UBool +SimpleThread::isRunning() { + // Note: Mutex functions are used here not for synchronization, + // but to force memory barriors to exist, to ensure that one thread + // can see changes made by another when running on processors + // with memory models having weak coherency. + PosixThreadImplementation *imp = (PosixThreadImplementation*)fImplementation; + umtx_lock(NULL); + UBool retVal = imp->fRunning; + umtx_unlock(NULL); + return retVal; } + void SimpleThread::sleep(int32_t millis) { #ifdef U_SOLARIS @@ -271,7 +446,7 @@ void SimpleThread::sleep(int32_t millis) #ifdef HPUX_CMA cma_sleep(millis/100); -#elif defined(HPUX) || defined(OS390) +#elif defined(U_HPUX) || defined(OS390) millis *= 1000; while(millis >= 1000000) { usleep(999999); @@ -308,25 +483,38 @@ void MultithreadTest::runIndexedTest( int32_t index, UBool exec, if (exec) TestThreads(); break; + case 1: name = "TestMutex"; if (exec) TestMutex(); break; + case 2: name = "TestThreadedIntl"; #if !UCONFIG_NO_FORMATTING - if (exec) + if (exec) { TestThreadedIntl(); + } #endif break; + case 3: name = "TestCollators"; #if !UCONFIG_NO_COLLATION - if (exec) - TestCollators(); + if (exec) { + TestCollators(); + } #endif /* #if !UCONFIG_NO_COLLATION */ break; + + case 4: + name = "TestString"; + if (exec) { + TestString(); + } + break; + default: name = ""; break; //needed to end loop @@ -334,14 +522,15 @@ void MultithreadTest::runIndexedTest( int32_t index, UBool exec, } -/* - TestThreads -- see if threads really work at all. - - Set up N threads pointing at N chars. When they are started, they will - each sleep 1 second and then set their chars. At the end we make sure they - are all set. - */ - +//----------------------------------------------------------------------------------- +// +// TestThreads -- see if threads really work at all. +// +// Set up N threads pointing at N chars. When they are started, they will +// each sleep 1 second and then set their chars. At the end we make sure they +// are all set. +// +//----------------------------------------------------------------------------------- #define THREADTEST_NRTHREADS 8 class TestThreadsThread : public SimpleThread @@ -454,7 +643,7 @@ public: public: TestMutexThread1 & fOtherThread; UBool fDone, fErr; - int32_t fElapsed; + UDate fElapsed; private: /** * The assignment operator has no real implementation. @@ -498,7 +687,7 @@ void MultithreadTest::TestMutex() { if(thread2.fErr) errln("Thread 2 says: thread1 didn't run before I aquired the mutex."); - logln("took %lu seconds for thread2 to aquire the mutex.", thread2.fElapsed); + logln("took %lu seconds for thread2 to aquire the mutex.", (int)(thread2.fElapsed/U_MILLIS_PER_DAY)); return; } SimpleThread::sleep(1000); @@ -507,55 +696,41 @@ void MultithreadTest::TestMutex() printf("patience exceeded. [WARNING mutex may still be acquired.] "); } -// *********** -// *********** TestMultithreadedIntl. Test the ICU in a multithreaded way. - -// ** First, some utility classes. - -// -///* Here is an idea which needs more work -// TestATest simply runs another Intltest subset against itself. -// The correct subset of intltest that should be run in this way should be identified. -// */ +//------------------------------------------------------------------------------------------- // -//class TestATest : public SimpleThread -//{ -//public: -// TestATest(IntlTest &t) : fTest(t), fDone(FALSE) {} -// virtual void run() -// { -// fTest.runTest(NULL,"TestNumberSpelloutFormat"); -// fErrs = fTest.getErrors(); -// fDone = TRUE; -// } -//public: -// IntlTest &fTest; -// UBool fDone; -// int32_t fErrs; -//}; +// class ThreadWithStatus - a thread that we can check the status and error condition of // +//------------------------------------------------------------------------------------------- +class ThreadWithStatus : public SimpleThread +{ +public: + UBool getError() { return (fErrors > 0); } + UBool getError(UnicodeString& fillinError) { fillinError = fErrorString; return (fErrors > 0); } + virtual ~ThreadWithStatus(){} +protected: + ThreadWithStatus() : fErrors(0) {} + void error(const UnicodeString &error) { + fErrors++; fErrorString = error; + SimpleThread::errorFunc(); + } + void error() { error("An error occured."); } +private: + int32_t fErrors; + UnicodeString fErrorString; +}; + + + +//------------------------------------------------------------------------------------------- // -//#include "itutil.h" -////#include "tscoll.h" -////#include "ittxtbd.h" -//#include "itformat.h" -////#include "itcwrap.h" -// -///* main code was: -// IntlTestFormat formatTest; -//// IntlTestCollator collatorTest; +// TestMultithreadedIntl. Test ICU Formatting n a multi-threaded environment // -// #define NUMTESTS 2 -// TestATest tests[NUMTESTS] = { TestATest(formatTest), TestATest(formatTest) }; -// char testName[NUMTESTS][20] = { "formatTest", "formatTest2" }; -//*/ +//------------------------------------------------------------------------------------------- -#include <string.h> - // * Show exactly where the string's differences lie. UnicodeString showDifference(const UnicodeString& expected, const UnicodeString& result) { @@ -585,34 +760,20 @@ UnicodeString showDifference(const UnicodeString& expected, const UnicodeString& } -// ** ThreadWithStatus - a thread that we can check the status and error condition of -class ThreadWithStatus : public SimpleThread -{ -public: - UBool getDone() { return fDone; } - UBool getError() { return (fErrors > 0); } - UBool getError(UnicodeString& fillinError) { fillinError = fErrorString; return (fErrors > 0); } - virtual ~ThreadWithStatus(){} -protected: - ThreadWithStatus() : fDone(FALSE), fErrors(0) {} - void done() { fDone = TRUE; } - void error(const UnicodeString &error) { fErrors++; fErrorString = error; done(); } - void error() { error("An error occured."); } -private: - UBool fDone; - int32_t fErrors; - UnicodeString fErrorString; -}; +//------------------------------------------------------------------------------------------- +// +// FormatThreadTest - a thread that tests performing a number of numberformats. +// +//------------------------------------------------------------------------------------------- -#define kFormatThreadIterations 20 // # of iterations per thread -#define kFormatThreadThreads 10 // # of threads to spawn -#define kFormatThreadPatience 60 // time in seconds to wait for all threads +const int kFormatThreadIterations = 20; // # of iterations per thread +const int kFormatThreadThreads = 10; // # of threads to spawn +const int kFormatThreadPatience = 60; // time in seconds to wait for all threads #if !UCONFIG_NO_FORMATTING -// ** FormatThreadTest - a thread that tests performing a number of numberformats. struct FormatThreadTestData @@ -665,13 +826,25 @@ void formatErrorMessage(UErrorCode &realStatus, const UnicodeString& pattern, co delete fmt; }; -static UMTX ftMutex; + +UBool U_CALLCONV isAcceptable(void *, const char *, const char *, const UDataInfo *) { + return TRUE; +} + +//static UMTX debugMutex = NULL; +//static UMTX gDebugMutex; + class FormatThreadTest : public ThreadWithStatus { public: + int fNum; + int fTraceInfo; + FormatThreadTest() // constructor is NOT multithread safe. : ThreadWithStatus(), + fNum(0), + fTraceInfo(0), fOffset(0) // the locale to use { @@ -683,147 +856,202 @@ public: virtual void run() { + fTraceInfo = 1; + NumberFormat *formatter = NULL; + NumberFormat *percentFormatter = NULL; + UErrorCode status = U_ZERO_ERROR; + +#if 0 + // debugging code, + for (int i=0; i<4000; i++) { + status = U_ZERO_ERROR; + UDataMemory *data1 = udata_openChoice(0, "res", "en_US", isAcceptable, 0, &status); + UDataMemory *data2 = udata_openChoice(0, "res", "fr", isAcceptable, 0, &status); + udata_close(data1); + udata_close(data2); + if (U_FAILURE(status)) { + error("udata_openChoice failed.\n"); + break; + } + } + return; +#endif + +#if 1 + // debugging code, + int m; + for (m=0; m<4000; m++) { + status = U_ZERO_ERROR; + UResourceBundle *res = NULL; + const char *localeName = NULL; + + Locale loc = Locale::getEnglish(); + + localeName = loc.getName(); + // localeName = "en"; + + // ResourceBundle bund = ResourceBundle(0, loc, status); + //umtx_lock(&gDebugMutex); + res = ures_open(NULL, localeName, &status); + //umtx_unlock(&gDebugMutex); + + //umtx_lock(&gDebugMutex); + ures_close(res); + //umtx_unlock(&gDebugMutex); + + if (U_FAILURE(status)) { + error("Resource bundle construction failed.\n"); + break; + } + } + return; +#endif + // Keep this data here to avoid static initialization. FormatThreadTestData kNumberFormatTestData[] = { FormatThreadTestData((double)5.0, UnicodeString("5", "")), - FormatThreadTestData( 6.0, UnicodeString("6", "")), - FormatThreadTestData( 20.0, UnicodeString("20", "")), - FormatThreadTestData( 8.0, UnicodeString("8", "")), - FormatThreadTestData( 8.3, UnicodeString("8.3", "")), - FormatThreadTestData( 12345, UnicodeString("12,345", "")), - FormatThreadTestData( 81890.23, UnicodeString("81,890.23", "")), + FormatThreadTestData( 6.0, UnicodeString("6", "")), + FormatThreadTestData( 20.0, UnicodeString("20", "")), + FormatThreadTestData( 8.0, UnicodeString("8", "")), + FormatThreadTestData( 8.3, UnicodeString("8.3", "")), + FormatThreadTestData( 12345, UnicodeString("12,345", "")), + FormatThreadTestData( 81890.23, UnicodeString("81,890.23", "")), }; - int32_t kNumberFormatTestDataLength = (int32_t)(sizeof(kNumberFormatTestData) / sizeof(kNumberFormatTestData[0])); - + int32_t kNumberFormatTestDataLength = (int32_t)(sizeof(kNumberFormatTestData) / + sizeof(kNumberFormatTestData[0])); + // Keep this data here to avoid static initialization. FormatThreadTestData kPercentFormatTestData[] = { FormatThreadTestData((double)5.0, UnicodeString("500%", "")), - FormatThreadTestData( 1.0, UnicodeString("100%", "")), - FormatThreadTestData( 0.26, UnicodeString("26%", "")), - FormatThreadTestData( 16384.99, CharsToUnicodeString("1\\u00a0638\\u00a0499%") ), // U+00a0 = NBSP - FormatThreadTestData( 81890.23, CharsToUnicodeString("8\\u00a0189\\u00a0023%" )), + FormatThreadTestData( 1.0, UnicodeString("100%", "")), + FormatThreadTestData( 0.26, UnicodeString("26%", "")), + FormatThreadTestData( + 16384.99, CharsToUnicodeString("1\\u00a0638\\u00a0499%") ), // U+00a0 = NBSP + FormatThreadTestData( + 81890.23, CharsToUnicodeString("8\\u00a0189\\u00a0023%" )), }; - int32_t kPercentFormatTestDataLength = (int32_t)(sizeof(kPercentFormatTestData) / sizeof(kPercentFormatTestData[0])); + int32_t kPercentFormatTestDataLength = + (int32_t)(sizeof(kPercentFormatTestData) / sizeof(kPercentFormatTestData[0])); int32_t iteration; - - UErrorCode status = U_ZERO_ERROR; - NumberFormat *formatter = NumberFormat::createInstance(Locale::getEnglish(),status); - - if(U_FAILURE(status)) - { - Mutex m(&ftMutex); + + status = U_ZERO_ERROR; + formatter = NumberFormat::createInstance(Locale::getEnglish(),status); + if(U_FAILURE(status)) { error("Error on NumberFormat::createInstance()"); - return; + goto cleanupAndReturn; } - - NumberFormat *percentFormatter = NumberFormat::createPercentInstance(Locale::getFrench(),status); - - if(U_FAILURE(status)) - { - { - Mutex m(&ftMutex); - error("Error on NumberFormat::createPercentInstance()"); - } - delete formatter; - return; + + percentFormatter = NumberFormat::createPercentInstance(Locale::getFrench(),status); + if(U_FAILURE(status)) { + error("Error on NumberFormat::createPercentInstance()"); + goto cleanupAndReturn; } - + for(iteration = 0;!getError() && iteration<kFormatThreadIterations;iteration++) { - + int32_t whichLine = (iteration + fOffset)%kNumberFormatTestDataLength; - + UnicodeString output; - + formatter->format(kNumberFormatTestData[whichLine].number, output); - - if(0 != output.compare(kNumberFormatTestData[whichLine].string)) - { - Mutex m(&ftMutex); - error("format().. expected " + kNumberFormatTestData[whichLine].string + " got " + output); - continue; // will break + + if(0 != output.compare(kNumberFormatTestData[whichLine].string)) { + error("format().. expected " + kNumberFormatTestData[whichLine].string + + " got " + output); + goto cleanupAndReturn; } - + // Now check percent. output.remove(); whichLine = (iteration + fOffset)%kPercentFormatTestDataLength; - + percentFormatter->format(kPercentFormatTestData[whichLine].number, output); - if(0 != output.compare(kPercentFormatTestData[whichLine].string)) { - Mutex m(&ftMutex); - error("percent format().. \n" + showDifference(kPercentFormatTestData[whichLine].string,output)); - continue; + error("percent format().. \n" + + showDifference(kPercentFormatTestData[whichLine].string,output)); + goto cleanupAndReturn; } - + // Test message error -#define kNumberOfMessageTests 3 + const int kNumberOfMessageTests = 3; UErrorCode statusToCheck; UnicodeString patternToCheck; Locale messageLocale; Locale countryToCheck; double currencyToCheck; - + UnicodeString expected; - + // load the cases. switch((iteration+fOffset) % kNumberOfMessageTests) { default: case 0: statusToCheck= U_FILE_ACCESS_ERROR; - patternToCheck= "0:Someone from {2} is receiving a #{0} error - {1}. Their telephone call is costing {3,number,currency}."; // number,currency + patternToCheck= "0:Someone from {2} is receiving a #{0}" + " error - {1}. Their telephone call is costing " + "{3,number,currency}."; // number,currency messageLocale= Locale("en","US"); countryToCheck= Locale("","HR"); currencyToCheck= 8192.77; - expected= "0:Someone from Croatia is receiving a #4 error - U_FILE_ACCESS_ERROR. Their telephone call is costing $8,192.77."; + expected= "0:Someone from Croatia is receiving a #4 error - " + "U_FILE_ACCESS_ERROR. Their telephone call is costing $8,192.77."; break; case 1: statusToCheck= U_INDEX_OUTOFBOUNDS_ERROR; patternToCheck= "1:A customer in {2} is receiving a #{0} error - {1}. Their telephone call is costing {3,number,currency}."; // number,currency - messageLocale= Locale("de","DE_PREEURO"); + messageLocale= Locale("de","DE@currency=DEM"); countryToCheck= Locale("","BF"); currencyToCheck= 2.32; - expected= "1:A customer in Burkina Faso is receiving a #8 error - U_INDEX_OUTOFBOUNDS_ERROR. Their telephone call is costing $2.32."; + expected= "1:A customer in Burkina Faso is receiving a #8 error - U_INDEX_OUTOFBOUNDS_ERROR. Their telephone call is costing 2,32 DM."; + break; case 2: statusToCheck= U_MEMORY_ALLOCATION_ERROR; - patternToCheck= "2:user in {2} is receiving a #{0} error - {1}. They insist they just spent {3,number,currency} on memory."; // number,currency - messageLocale= Locale("de","AT_PREEURO"); // Austrian German + patternToCheck= "2:user in {2} is receiving a #{0} error - {1}. " + "They insist they just spent {3,number,currency} " + "on memory."; // number,currency + messageLocale= Locale("de","AT@currency=ATS"); // Austrian German countryToCheck= Locale("","US"); // hmm currencyToCheck= 40193.12; - expected= CharsToUnicodeString("2:user in Vereinigte Staaten is receiving a #7 error - U_MEMORY_ALLOCATION_ERROR. They insist they just spent \\u00f6S 40.193,12 on memory."); + expected= CharsToUnicodeString( + "2:user in Vereinigte Staaten is receiving a #7 error" + " - U_MEMORY_ALLOCATION_ERROR. They insist they just spent" + " \\u00f6S 40.193,12 on memory."); break; } - + UnicodeString result; UErrorCode status = U_ZERO_ERROR; - formatErrorMessage(status,patternToCheck,messageLocale,statusToCheck,countryToCheck,currencyToCheck,result); + formatErrorMessage(status,patternToCheck,messageLocale,statusToCheck, + countryToCheck,currencyToCheck,result); if(U_FAILURE(status)) { - UnicodeString tmp; - errorToString(status,tmp); - Mutex m(&ftMutex); - error("Failure on message format, pattern=" + patternToCheck +", error = " + tmp); - continue; + UnicodeString tmp; + errorToString(status,tmp); + error("Failure on message format, pattern=" + patternToCheck + + ", error = " + tmp); + goto cleanupAndReturn; } - + if(result != expected) { - Mutex m(&ftMutex); error("PatternFormat: \n" + showDifference(expected,result)); - continue; + goto cleanupAndReturn; } - } - + } /* end of for loop */ + +cleanupAndReturn: delete formatter; delete percentFormatter; - Mutex m(&ftMutex); - done(); + + // while (fNum == 4) {SimpleThread::sleep(10000);} // Force a failure by preventing thread from finishing + fTraceInfo = 2; } - + private: int32_t fOffset; // where we are testing from. }; @@ -832,276 +1060,266 @@ private: void MultithreadTest::TestThreadedIntl() { - umtx_init(&ftMutex); - - FormatThreadTest tests[kFormatThreadThreads]; - - logln(UnicodeString("Spawning: ") + kFormatThreadThreads + " threads * " + kFormatThreadIterations + " iterations each."); + int i; + UnicodeString theErr; + UBool haveDisplayedInfo[kFormatThreadThreads]; + + // + // Create and start the test threads + // + logln("Spawning: %d threads * %d iterations each.", + kFormatThreadThreads, kFormatThreadIterations); + FormatThreadTest *tests = new FormatThreadTest[kFormatThreadThreads]; for(int32_t j = 0; j < kFormatThreadThreads; j++) { + tests[j].fNum = j; int32_t threadStatus = tests[j].start(); if (threadStatus != 0) { errln("System Error %d starting thread number %d.", threadStatus, j); - return; + SimpleThread::errorFunc(); + goto cleanupAndReturn; } + haveDisplayedInfo[j] = FALSE; } - int32_t patience; - for(patience = kFormatThreadPatience;patience > 0; patience --) - { - logln("Waiting..."); - - int32_t i; - int32_t terrs = 0; - int32_t completed =0; + // Spin, waiting for the test threads to finish. + // (An earlier version used a wait in this loop, but that seems to trigger + // a bug in some versions of AIX.) + UBool stillRunning; + do { + /* Spin until the test threads complete. */ + stillRunning = FALSE; for(i=0;i<kFormatThreadThreads;i++) { - umtx_lock(&ftMutex); - UBool threadIsDone = tests[i].getDone(); - umtx_unlock(&ftMutex); - if(threadIsDone) - { - completed++; - - logln(UnicodeString("Test #") + i + " is complete.. "); - - UnicodeString theErr; - if(tests[i].getError(theErr)) - { - terrs++; + if (tests[i].isRunning()) { + stillRunning = TRUE; + } else if (haveDisplayedInfo[i] == FALSE) { + logln("Thread # %d is complete..", i); + if(tests[i].getError(theErr)) { errln(UnicodeString("#") + i + ": " + theErr); + SimpleThread::errorFunc(); } - // print out the error, too, if any. + haveDisplayedInfo[i] = TRUE; } } - - if(completed == kFormatThreadThreads) - { - logln("Done!"); + } while (stillRunning); - if(terrs) - { - errln("There were errors."); - } + // + // All threads have finished. + // +cleanupAndReturn: + delete [] tests; + return; + +} +#endif /* #if !UCONFIG_NO_FORMATTING */ - break; - } - SimpleThread::sleep(900); - } - if (patience <= 0) { - errln("patience exceeded. "); - } - umtx_destroy(&ftMutex); - return; -} -#endif /* #if !UCONFIG_NO_FORMATTING */ +//------------------------------------------------------------------------------------------- +// +// Collation threading test +// +//------------------------------------------------------------------------------------------- #if !UCONFIG_NO_COLLATION #define kCollatorThreadThreads 10 // # of threads to spawn #define kCollatorThreadPatience kCollatorThreadThreads*100 struct Line { - UChar buff[25]; - int32_t buflen; + UChar buff[25]; + int32_t buflen; } ; class CollatorThreadTest : public ThreadWithStatus { private: - const UCollator *coll; - const Line *lines; - int32_t noLines; + const UCollator *coll; + const Line *lines; + int32_t noLines; public: - CollatorThreadTest() : ThreadWithStatus(), - coll(NULL), - lines(NULL), - noLines(0) - { - }; - void setCollator(UCollator *c, Line *l, int32_t nl) - { - coll = c; - lines = l; - noLines = nl; - } - virtual void run() { - //sleep(10000); - int32_t line = 0; - - uint8_t sk1[1024], sk2[1024]; - uint8_t *oldSk = NULL, *newSk = sk1; - int32_t resLen = 0, oldLen = 0; - int32_t i = 0; - - for(i = 0; i < noLines; i++) { - resLen = ucol_getSortKey(coll, lines[i].buff, lines[i].buflen, newSk, 1024); - - int32_t res = 0, cmpres = 0, cmpres2 = 0; - - if(oldSk != NULL) { - res = strcmp((char *)oldSk, (char *)newSk); - cmpres = ucol_strcoll(coll, lines[i-1].buff, lines[i-1].buflen, lines[i].buff, lines[i].buflen); - cmpres2 = ucol_strcoll(coll, lines[i].buff, lines[i].buflen, lines[i-1].buff, lines[i-1].buflen); - //cmpres = res; - //cmpres2 = -cmpres; - - if(cmpres != -cmpres2) { - error("Compare result not symmetrical on line "+ line); - } - - if(((res&0x80000000) != (cmpres&0x80000000)) || (res == 0 && cmpres != 0) || (res != 0 && cmpres == 0)) { - error(UnicodeString("Difference between ucol_strcoll and sortkey compare on line ")+ UnicodeString(line)); - } - - if(res > 0) { - error(UnicodeString("Line %i is not greater or equal than previous line ")+ UnicodeString(i)); - break; - } else if(res == 0) { /* equal */ - res = u_strcmpCodePointOrder(lines[i-1].buff, lines[i].buff); - if (res == 0) { - error(UnicodeString("Probable error in test file on line %i (comparing identical strings)")+ UnicodeString(i)); - break; - } else if (res > 0) { - error(UnicodeString("Sortkeys are identical, but code point comapare gives >0 on line ")+ UnicodeString(i)); + CollatorThreadTest() : ThreadWithStatus(), + coll(NULL), + lines(NULL), + noLines(0) + { + }; + void setCollator(UCollator *c, Line *l, int32_t nl) + { + coll = c; + lines = l; + noLines = nl; + } + virtual void run() { + //sleep(10000); + int32_t line = 0; + + uint8_t sk1[1024], sk2[1024]; + uint8_t *oldSk = NULL, *newSk = sk1; + int32_t resLen = 0, oldLen = 0; + int32_t i = 0; + + for(i = 0; i < noLines; i++) { + resLen = ucol_getSortKey(coll, lines[i].buff, lines[i].buflen, newSk, 1024); + + int32_t res = 0, cmpres = 0, cmpres2 = 0; + + if(oldSk != NULL) { + res = strcmp((char *)oldSk, (char *)newSk); + cmpres = ucol_strcoll(coll, lines[i-1].buff, lines[i-1].buflen, lines[i].buff, lines[i].buflen); + cmpres2 = ucol_strcoll(coll, lines[i].buff, lines[i].buflen, lines[i-1].buff, lines[i-1].buflen); + //cmpres = res; + //cmpres2 = -cmpres; + + if(cmpres != -cmpres2) { + error("Compare result not symmetrical on line "+ line); + break; + } + + if(((res&0x80000000) != (cmpres&0x80000000)) || (res == 0 && cmpres != 0) || (res != 0 && cmpres == 0)) { + error(UnicodeString("Difference between ucol_strcoll and sortkey compare on line ")+ UnicodeString(line)); + break; + } + + if(res > 0) { + error(UnicodeString("Line %i is not greater or equal than previous line ")+ UnicodeString(i)); + break; + } else if(res == 0) { /* equal */ + res = u_strcmpCodePointOrder(lines[i-1].buff, lines[i].buff); + if (res == 0) { + error(UnicodeString("Probable error in test file on line %i (comparing identical strings)")+ UnicodeString(i)); + break; + } else if (res > 0) { + error(UnicodeString("Sortkeys are identical, but code point comapare gives >0 on line ")+ UnicodeString(i)); + break; + } + } + } + + oldSk = newSk; + oldLen = resLen; + + newSk = (newSk == sk1)?sk2:sk1; } - } } - - oldSk = newSk; - oldLen = resLen; - - newSk = (newSk == sk1)?sk2:sk1; - } - - Mutex m; - done(); - } + }; void MultithreadTest::TestCollators() { - UErrorCode status = U_ZERO_ERROR; - FILE *testFile = NULL; - char testDataPath[1024]; - uprv_strcpy(testDataPath, IntlTest::loadTestData(status)); - char* index = 0; - if (U_FAILURE(status)) { - errln("ERROR: could not open test data %s", u_errorName(status)); - return; - } - index=strrchr(testDataPath,(char)U_FILE_SEP_CHAR); - - if((unsigned int)(index-testDataPath) != (strlen(testDataPath)-1)){ - *(index+1)=0; - } - uprv_strcat(testDataPath,".."U_FILE_SEP_STRING); - uprv_strcat(testDataPath, "CollationTest_"); + UErrorCode status = U_ZERO_ERROR; + FILE *testFile = NULL; + char testDataPath[1024]; + strcpy(testDataPath, IntlTest::getSourceTestData(status)); + if (U_FAILURE(status)) { + errln("ERROR: could not open test data %s", u_errorName(status)); + return; + } + strcat(testDataPath, "CollationTest_"); - const char* type = "NON_IGNORABLE"; + const char* type = "NON_IGNORABLE"; - const char *ext = ".txt"; - if(testFile) { - fclose(testFile); - } - char buffer[1024]; - uprv_strcpy(buffer, testDataPath); - uprv_strcat(buffer, type); - int32_t bufLen = uprv_strlen(buffer); - - // we try to open 3 files: - // path/CollationTest_type.txt - // path/CollationTest_type_SHORT.txt - // path/CollationTest_type_STUB.txt - // we are going to test with the first one that we manage to open. + const char *ext = ".txt"; + if(testFile) { + fclose(testFile); + } + char buffer[1024]; + strcpy(buffer, testDataPath); + strcat(buffer, type); + size_t bufLen = strlen(buffer); - uprv_strcpy(buffer+bufLen, ext); + // we try to open 3 files: + // path/CollationTest_type.txt + // path/CollationTest_type_SHORT.txt + // path/CollationTest_type_STUB.txt + // we are going to test with the first one that we manage to open. - testFile = fopen(buffer, "rb"); + strcpy(buffer+bufLen, ext); - if(testFile == 0) { - uprv_strcpy(buffer+bufLen, "_SHORT"); - uprv_strcat(buffer, ext); testFile = fopen(buffer, "rb"); if(testFile == 0) { - uprv_strcpy(buffer+bufLen, "_STUB"); - uprv_strcat(buffer, ext); - testFile = fopen(buffer, "rb"); - - if (testFile == 0) { - *(buffer+bufLen) = 0; - errln("ERROR: could not open any of the conformance test files, tried opening base %s", buffer); - return; - } else { - infoln( - "INFO: Working with the stub file.\n" - "If you need the full conformance test, please\n" - "download the appropriate data files from:\n" - "http://oss.software.ibm.com/cvs/icu4j/unicodetools/com/ibm/text/data/"); - } + strcpy(buffer+bufLen, "_SHORT"); + strcat(buffer, ext); + testFile = fopen(buffer, "rb"); + + if(testFile == 0) { + strcpy(buffer+bufLen, "_STUB"); + strcat(buffer, ext); + testFile = fopen(buffer, "rb"); + + if (testFile == 0) { + *(buffer+bufLen) = 0; + errln("ERROR: could not open any of the conformance test files, tried opening base %s", buffer); + return; + } else { + infoln( + "INFO: Working with the stub file.\n" + "If you need the full conformance test, please\n" + "download the appropriate data files from:\n" + "http://oss.software.ibm.com/cvs/icu4j/unicodetools/com/ibm/text/data/"); + } + } } - } - Line *lines = new Line[65000]; - uprv_memset(lines, 0, sizeof(Line)*65000); - int32_t lineNum = 0; + Line *lines = new Line[200000]; + memset(lines, 0, sizeof(Line)*200000); + int32_t lineNum = 0; - UChar bufferU[1024]; - int32_t buflen = 0; - uint32_t first = 0; - uint32_t offset = 0; + UChar bufferU[1024]; + int32_t buflen = 0; + uint32_t first = 0; + uint32_t offset = 0; - while (fgets(buffer, 1024, testFile) != NULL) { - offset = 0; - if(*buffer == 0 || buffer[0] == '#') { - continue; + while (fgets(buffer, 1024, testFile) != NULL) { + offset = 0; + if(*buffer == 0 || buffer[0] == '#') { + continue; + } + offset = u_parseString(buffer, bufferU, 1024, &first, &status); + buflen = offset; + bufferU[offset++] = 0; + lines[lineNum].buflen = buflen; + //lines[lineNum].buff = new UChar[buflen+1]; + u_memcpy(lines[lineNum].buff, bufferU, buflen); + lineNum++; } - offset = u_parseString(buffer, bufferU, 1024, &first, &status); - buflen = offset; - bufferU[offset++] = 0; - lines[lineNum].buflen = buflen; - //lines[lineNum].buff = new UChar[buflen+1]; - u_memcpy(lines[lineNum].buff, bufferU, buflen); - lineNum++; - } - fclose(testFile); + fclose(testFile); - - UCollator *coll = ucol_open("root", &status); - if(U_FAILURE(status)) { - errln("Couldn't open UCA collator"); - return; - } - ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); - ucol_setAttribute(coll, UCOL_CASE_FIRST, UCOL_OFF, &status); - ucol_setAttribute(coll, UCOL_CASE_LEVEL, UCOL_OFF, &status); - ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_TERTIARY, &status); - ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_NON_IGNORABLE, &status); - - int32_t noSpawned = 0; - int32_t spawnResult = 0; + + UCollator *coll = ucol_open("root", &status); + if(U_FAILURE(status)) { + errln("Couldn't open UCA collator"); + return; + } + ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); + ucol_setAttribute(coll, UCOL_CASE_FIRST, UCOL_OFF, &status); + ucol_setAttribute(coll, UCOL_CASE_LEVEL, UCOL_OFF, &status); + ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_TERTIARY, &status); + ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_NON_IGNORABLE, &status); + + int32_t noSpawned = 0; + int32_t spawnResult = 0; CollatorThreadTest *tests; tests = new CollatorThreadTest[kCollatorThreadThreads]; - + logln(UnicodeString("Spawning: ") + kCollatorThreadThreads + " threads * " + kFormatThreadIterations + " iterations each."); int32_t j = 0; for(j = 0; j < kCollatorThreadThreads; j++) { - //logln("Setting collator %i", j); - tests[j].setCollator(coll, lines, lineNum); + //logln("Setting collator %i", j); + tests[j].setCollator(coll, lines, lineNum); } for(j = 0; j < kCollatorThreadThreads; j++) { - log("%i ", j); - spawnResult = tests[j].start(); - if(spawnResult != 0) { - infoln("THREAD INFO: Couldn't spawn more than %i threads", noSpawned); - break; - } - noSpawned++; + log("%i ", j); + spawnResult = tests[j].start(); + if(spawnResult != 0) { + infoln("THREAD INFO: Couldn't spawn more than %i threads", noSpawned); + break; + } + noSpawned++; } logln("Spawned all"); @@ -1116,10 +1334,7 @@ void MultithreadTest::TestCollators() for(i=0;i<kCollatorThreadThreads;i++) { - umtx_lock(NULL); - UBool threadIsDone = tests[i].getDone(); - umtx_unlock(NULL); - if(threadIsDone) + if (tests[i].isRunning() == FALSE) { completed++; @@ -1134,7 +1349,7 @@ void MultithreadTest::TestCollators() // print out the error, too, if any. } } - logln("Completed %i tests", completed); + logln("Completed %i tests", completed); if(completed == noSpawned) { @@ -1143,11 +1358,12 @@ void MultithreadTest::TestCollators() if(terrs) { errln("There were errors."); + SimpleThread::errorFunc(); } ucol_close(coll); delete[] tests; //for(i = 0; i < lineNum; i++) { - //delete[] lines[i].buff; + //delete[] lines[i].buff; //} delete[] lines; @@ -1157,10 +1373,157 @@ void MultithreadTest::TestCollators() SimpleThread::sleep(900); } errln("patience exceeded. "); - ucol_close(coll); + SimpleThread::errorFunc(); + ucol_close(coll); } #endif /* #if !UCONFIG_NO_COLLATION */ + + + +//------------------------------------------------------------------------------------------- +// +// StringThreadTest2 +// +//------------------------------------------------------------------------------------------- + +const int kStringThreadIterations = 2500;// # of iterations per thread +const int kStringThreadThreads = 10; // # of threads to spawn +const int kStringThreadPatience = 120; // time in seconds to wait for all threads + + +class StringThreadTest2 : public ThreadWithStatus +{ +public: + int fNum; + int fTraceInfo; + const UnicodeString *fSharedString; + + StringThreadTest2(const UnicodeString *sharedString, int num) // constructor is NOT multithread safe. + : ThreadWithStatus(), + fNum(num), + fTraceInfo(0), + fSharedString(sharedString) + { + }; + + + virtual void run() + { + fTraceInfo = 1; + int loopCount = 0; + + for (loopCount = 0; loopCount < kStringThreadIterations; loopCount++) { + if (*fSharedString != "This is the original test string.") { + error("Original string is corrupt."); + break; + } + UnicodeString s1 = *fSharedString; + s1 += "cat this"; + UnicodeString s2(s1); + UnicodeString s3 = *fSharedString; + s2 = s3; + s3.truncate(12); + s2.truncate(0); + } + + // while (fNum == 4) {SimpleThread::sleep(10000);} // Force a failure by preventing thread from finishing + fTraceInfo = 2; + } + +}; + +// ** The actual test function. + +void MultithreadTest::TestString() +{ + int patience; + int terrs = 0; + int j; + + UnicodeString *testString = new UnicodeString("This is the original test string."); + + StringThreadTest2 *tests[kStringThreadThreads]; + for(j = 0; j < kStringThreadThreads; j++) { + tests[j] = new StringThreadTest2(testString, j); + } + + logln(UnicodeString("Spawning: ") + kStringThreadThreads + " threads * " + kStringThreadIterations + " iterations each."); + for(j = 0; j < kStringThreadThreads; j++) { + int32_t threadStatus = tests[j]->start(); + if (threadStatus != 0) { + errln("System Error %d starting thread number %d.", threadStatus, j); + SimpleThread::errorFunc(); + goto cleanupAndReturn; + } + } + + for(patience = kStringThreadPatience;patience > 0; patience --) + { + logln("Waiting..."); + + int32_t i; + terrs = 0; + int32_t completed =0; + + for(i=0;i<kStringThreadThreads;i++) { + if (tests[i]->isRunning() == FALSE) + { + completed++; + + logln(UnicodeString("Test #") + i + " is complete.. "); + + UnicodeString theErr; + if(tests[i]->getError(theErr)) + { + terrs++; + errln(UnicodeString("#") + i + ": " + theErr); + } + // print out the error, too, if any. + } + } + + if(completed == kStringThreadThreads) + { + logln("Done!"); + if(terrs) { + errln("There were errors."); + } + break; + } + + SimpleThread::sleep(900); + } + + if (patience <= 0) { + errln("patience exceeded. "); + // while (TRUE) {SimpleThread::sleep(10000);} // TODO: for debugging. Sleep forever on failure. + terrs++; + } + + if (terrs > 0) { + SimpleThread::errorFunc(); + } + +cleanupAndReturn: + if (terrs == 0) { + /* + Don't clean up if there are errors. This prevents crashes if the + threads are still running and using this data. This will only happen + if there is an error with the test, ICU, or the machine is too slow. + It's better to leak than crash. + */ + for(j = 0; j < kStringThreadThreads; j++) { + delete tests[j]; + } + delete testString; + } +} + + + + + #endif // ICU_USE_THREADS diff --git a/icuSources/test/intltest/tsmthred.h b/icuSources/test/intltest/tsmthred.h index 343321bf..f2f99060 100644 --- a/icuSources/test/intltest/tsmthred.h +++ b/icuSources/test/intltest/tsmthred.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -11,25 +11,6 @@ #include "intltest.h" #include "mutex.h" -/* - Test multithreading. Of course we need a thread class first.. - this wrapper has a ported implementation. - */ - -class SimpleThread -{ -public: - SimpleThread(); - virtual ~SimpleThread(); - int32_t start(void); // start the thread -public: // should be private, but then we couldn't be asocial. - virtual void run(void) = 0; // Override this to provide some real implementation -private: - void *fImplementation; - -public: - static void sleep(int32_t millis); // probably shouldn't go here but oh well. -}; /** @@ -58,7 +39,7 @@ public: void TestThreadedIntl(void); #endif void TestCollators(void); - + void TestString(); }; #endif diff --git a/icuSources/test/intltest/tsmutex.cpp b/icuSources/test/intltest/tsmutex.cpp deleted file mode 100644 index 0afa96eb..00000000 --- a/icuSources/test/intltest/tsmutex.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/******************************************************************** - * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ - -#include "tsmutex.h" -#include <stdio.h> -#include <string.h> - -#ifdef U_SOLARIS -#include <signal.h> -#endif - -////////////////////////// -// -// Simple Mutex structure -// Increments lockCount each time the mutex is locked. -// Decrements lockCount each time the mutex is unlocked. -//Note: This test does not actually create locks, since -//that would be platform specific. This test simply tests -//the functionality of the Mutex class. -// -////////////////////////// -#if 0 -struct MyMutexImp { - MyMutexImp(); - uint32_t lockCount; -}; - -MyMutexImp::MyMutexImp() { - lockCount = 0; -} - -static void _myLock(MutexPointer p) { - MyMutexImp* imp = (MyMutexImp*)p; - (imp->lockCount)++; -} - -static void _myUnlock(MutexPointer p) { - MyMutexImp* imp = (MyMutexImp*)p; - (imp->lockCount)--; -} -#endif -////////////////////////// -// -// The Test Class -// -////////////////////////// -MutexTest::MutexTest() { -} - -MutexTest::~MutexTest() { -} - -void MutexTest::runIndexedTest( int32_t index, UBool exec, - const char* &name, char* /*par*/ ) { - if (exec) logln("TestSuite MutexTest: "); - switch (index) { - case 0: name = "TestMutex"; if (exec) TestMutex(); break; - - default: name = ""; break; //needed to end loop - } -} - -UBool MutexTest::gMutexInitialized = FALSE; - -void MutexTest::TestMutex() { - /* This is tested in intltest.cpp before anything starts. */ - if (!gMutexInitialized) { - logln("*** Failure! The global mutex was not initialized.\n" - "*** Make sure the right linker was used.\n"); - } -} - - -void MutexTest::TestLock() { -} - - diff --git a/icuSources/test/intltest/tsmutex.h b/icuSources/test/intltest/tsmutex.h deleted file mode 100644 index 8d7397f3..00000000 --- a/icuSources/test/intltest/tsmutex.h +++ /dev/null @@ -1,42 +0,0 @@ -/******************************************************************** - * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ - - -#ifndef MUTEXTEST_H -#define MUTEXTEST_H - -#include "intltest.h" -#include "mutex.h" - -/** - * Tests Mutex and MutexImplementation functionality using - * a custom MutexImplementation test class, simulating the behaviour - * of an actual mutex - **/ -class MutexTest: public IntlTest { -public: - MutexTest(); - virtual ~MutexTest(); - - void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par = NULL ); - - /** - * test the Mutex functionality and API using subroutine TestLock - **/ - void TestMutex(void); - /** - * subroutine for TestMutex - **/ - void TestLock(void); - - /* Was the global mutex initialized. */ - static UBool gMutexInitialized; - -private: -}; - -#endif - diff --git a/icuSources/test/intltest/tsnmfmt.cpp b/icuSources/test/intltest/tsnmfmt.cpp index 1b126603..57d49ecc 100644 --- a/icuSources/test/intltest/tsnmfmt.cpp +++ b/icuSources/test/intltest/tsnmfmt.cpp @@ -1,8 +1,8 @@ -/******************************************************************** +/*********************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ + * Copyright (c) 1997-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ***********************************************************************/ #include "unicode/utypes.h" @@ -10,7 +10,11 @@ #include "unicode/decimfmt.h" #include "tsnmfmt.h" +#include "putilimp.h" #include <float.h> +#include <stdlib.h> + +IntlTestNumberFormat::~IntlTestNumberFormat() {} static const char * formattableTypeName(Formattable::Type t) { @@ -20,6 +24,7 @@ static const char * formattableTypeName(Formattable::Type t) case Formattable::kLong: return "kLong"; case Formattable::kString: return "kString"; case Formattable::kArray: return "kArray"; + case Formattable::kInt64: return "kInt64"; default: return "??unknown??"; } } @@ -128,13 +133,15 @@ uint32_t IntlTestNumberFormat::randLong() } -/* Make sure that we don't get something too large and multiply into infinity. */ +/* Make sure that we don't get something too large and multiply into infinity. + @param smallerThanMax the requested maximum value smaller than DBL_MAX */ double IntlTestNumberFormat::getSafeDouble(double smallerThanMax) { double it; + double high = (DBL_MAX/smallerThanMax)/10.0; + double low = -high; do { it = randDouble(); - } while (-DBL_MAX/smallerThanMax > it || it > DBL_MAX/smallerThanMax); - it *= smallerThanMax/10.0; + } while (low > it || it > high); return it; } @@ -290,6 +297,8 @@ IntlTestNumberFormat::tryIt(double aNumber) // Convert from long to double if (number[i].getType() == Formattable::kLong) number[i].setDouble(number[i].getLong()); + else if (number[i].getType() == Formattable::kInt64) + number[i].setDouble((double)number[i].getInt64()); else if (number[i].getType() != Formattable::kDouble) { errMsg = ("**** FAIL: Parse of " + prettify(string[i-1]) diff --git a/icuSources/test/intltest/tsnmfmt.h b/icuSources/test/intltest/tsnmfmt.h index 407b340d..076a4644 100644 --- a/icuSources/test/intltest/tsnmfmt.h +++ b/icuSources/test/intltest/tsnmfmt.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2003, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -8,14 +8,11 @@ #define _INTLTESTNUMBERFORMAT -#include <stdlib.h> - #include "unicode/utypes.h" #if !UCONFIG_NO_FORMATTING #include "unicode/numfmt.h" -#include "unicode/fmtable.h" #include "unicode/locid.h" #include "intltest.h" @@ -60,7 +57,7 @@ private: public: - virtual ~IntlTestNumberFormat() {} + virtual ~IntlTestNumberFormat(); /* * Return a random double that isn't too large. diff --git a/icuSources/test/intltest/tsputil.cpp b/icuSources/test/intltest/tsputil.cpp index 3e086afb..0daf2ab9 100644 --- a/icuSources/test/intltest/tsputil.cpp +++ b/icuSources/test/intltest/tsputil.cpp @@ -1,12 +1,13 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ #include "tsputil.h" #include <float.h> // DBL_MAX, DBL_MIN +#include "putilimp.h" #define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); logln((UnicodeString)""); test(); } break; @@ -15,9 +16,12 @@ PUtilTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* / { //if (exec) logln("TestSuite PUtilTest: "); switch (index) { - CASE(0, testMaxMin) -// CASE(1, testIEEEremainder) + CASE(1, testNaN) + CASE(2, testPositiveInfinity) + CASE(3, testNegativeInfinity) + CASE(4, testZero) +// CASE(5, testIEEEremainder) default: name = ""; break; //needed to end loop } @@ -177,30 +181,370 @@ PUtilTest::testMaxMin() void PUtilTest::maxMinTest(double a, double b, double exp, UBool max) { - double result = 0.0; - - if(max) - result = uprv_fmax(a, b); - else - result = uprv_fmin(a, b); - - UBool nanResultOK = (uprv_isNaN(a) || uprv_isNaN(b)); - - if(uprv_isNaN(result) && ! nanResultOK) { - errln(UnicodeString("FAIL: got NaN as result without NaN as argument")); - if(max) - errln(UnicodeString(" max(") + a + ", " + b + ") is " + result + ", expected " + exp); - else - errln(UnicodeString(" min(") + a + ", " + b + ") is " + result + ", expected " + exp); - } - else if(result != exp && ! (uprv_isNaN(result) || uprv_isNaN(exp))) + double result = 0.0; + if(max) - errln(UnicodeString("FAIL: max(") + a + ", " + b + ") is " + result + ", expected " + exp); + result = uprv_fmax(a, b); else - errln(UnicodeString("FAIL: min(") + a + ", " + b + ") is " + result + ", expected " + exp); - else - if(max) - logln(UnicodeString("OK: max(") + a + ", " + b + ") is " + result); + result = uprv_fmin(a, b); + + UBool nanResultOK = (uprv_isNaN(a) || uprv_isNaN(b)); + + if(uprv_isNaN(result) && ! nanResultOK) { + errln(UnicodeString("FAIL: got NaN as result without NaN as argument")); + if(max) + errln(UnicodeString(" max(") + a + ", " + b + ") is " + result + ", expected " + exp); + else + errln(UnicodeString(" min(") + a + ", " + b + ") is " + result + ", expected " + exp); + } + else if(result != exp && ! (uprv_isNaN(result) || uprv_isNaN(exp))) + if(max) + errln(UnicodeString("FAIL: max(") + a + ", " + b + ") is " + result + ", expected " + exp); + else + errln(UnicodeString("FAIL: min(") + a + ", " + b + ") is " + result + ", expected " + exp); else - logln(UnicodeString("OK: min(") + a + ", " + b + ") is " + result); + if(max) + logln(UnicodeString("OK: max(") + a + ", " + b + ") is " + result); + else + logln(UnicodeString("OK: min(") + a + ", " + b + ") is " + result); +} +//============================== + +// NaN is weird- comparisons with NaN _always_ return false, with the +// exception of !=, which _always_ returns true +void +PUtilTest::testNaN(void) +{ + logln("NaN tests may show that the expected NaN!=NaN etc. is not true on some"); + logln("platforms; however, ICU does not rely on them because it defines"); + logln("and uses uprv_isNaN(). Therefore, most failing NaN tests only report warnings."); + + PUtilTest::testIsNaN(); + PUtilTest::NaNGT(); + PUtilTest::NaNLT(); + PUtilTest::NaNGTE(); + PUtilTest::NaNLTE(); + PUtilTest::NaNE(); + PUtilTest::NaNNE(); + + logln("End of NaN tests."); +} + +//============================== + +void +PUtilTest::testPositiveInfinity(void) +{ + double pinf = uprv_getInfinity(); + double ninf = -uprv_getInfinity(); + double ten = 10.0; + + if(uprv_isInfinite(pinf) != TRUE) { + errln("FAIL: isInfinite(+Infinity) returned FALSE, should be TRUE."); + } + + if(uprv_isPositiveInfinity(pinf) != TRUE) { + errln("FAIL: isPositiveInfinity(+Infinity) returned FALSE, should be TRUE."); + } + + if(uprv_isNegativeInfinity(pinf) != FALSE) { + errln("FAIL: isNegativeInfinity(+Infinity) returned TRUE, should be FALSE."); + } + + if(pinf > DBL_MAX != TRUE) { + errln("FAIL: +Infinity > DBL_MAX returned FALSE, should be TRUE."); + } + + if(pinf > DBL_MIN != TRUE) { + errln("FAIL: +Infinity > DBL_MIN returned FALSE, should be TRUE."); + } + + if(pinf > ninf != TRUE) { + errln("FAIL: +Infinity > -Infinity returned FALSE, should be TRUE."); + } + + if(pinf > ten != TRUE) { + errln("FAIL: +Infinity > 10.0 returned FALSE, should be TRUE."); + } } + +//============================== + +void +PUtilTest::testNegativeInfinity(void) +{ + double pinf = uprv_getInfinity(); + double ninf = -uprv_getInfinity(); + double ten = 10.0; + + if(uprv_isInfinite(ninf) != TRUE) { + errln("FAIL: isInfinite(-Infinity) returned FALSE, should be TRUE."); + } + + if(uprv_isNegativeInfinity(ninf) != TRUE) { + errln("FAIL: isNegativeInfinity(-Infinity) returned FALSE, should be TRUE."); + } + + if(uprv_isPositiveInfinity(ninf) != FALSE) { + errln("FAIL: isPositiveInfinity(-Infinity) returned TRUE, should be FALSE."); + } + + if(ninf < DBL_MAX != TRUE) { + errln("FAIL: -Infinity < DBL_MAX returned FALSE, should be TRUE."); + } + + if(ninf < DBL_MIN != TRUE) { + errln("FAIL: -Infinity < DBL_MIN returned FALSE, should be TRUE."); + } + + if(ninf < pinf != TRUE) { + errln("FAIL: -Infinity < +Infinity returned FALSE, should be TRUE."); + } + + if(ninf < ten != TRUE) { + errln("FAIL: -Infinity < 10.0 returned FALSE, should be TRUE."); + } +} + +//============================== + +// notes about zero: +// -0.0 == 0.0 == TRUE +// -0.0 < 0.0 == FALSE +// generating -0.0 must be done at runtime. compiler apparently ignores sign? +void +PUtilTest::testZero(void) +{ + // volatile is used to fake out the compiler optimizer. We really want to divide by 0. + volatile double pzero = 0.0; + volatile double nzero = 0.0; + + nzero *= -1; + + if(pzero == nzero != TRUE) { + errln("FAIL: 0.0 == -0.0 returned FALSE, should be TRUE."); + } + + if(pzero > nzero != FALSE) { + errln("FAIL: 0.0 > -0.0 returned TRUE, should be FALSE."); + } + + if(pzero >= nzero != TRUE) { + errln("FAIL: 0.0 >= -0.0 returned FALSE, should be TRUE."); + } + + if(pzero < nzero != FALSE) { + errln("FAIL: 0.0 < -0.0 returned TRUE, should be FALSE."); + } + + if(pzero <= nzero != TRUE) { + errln("FAIL: 0.0 <= -0.0 returned FALSE, should be TRUE."); + } +#ifndef OS400 /* OS/400 will generate divide by zero exception MCH1214 */ + if(uprv_isInfinite(1/pzero) != TRUE) { + errln("FAIL: isInfinite(1/0.0) returned FALSE, should be TRUE."); + } + + if(uprv_isInfinite(1/nzero) != TRUE) { + errln("FAIL: isInfinite(1/-0.0) returned FALSE, should be TRUE."); + } + + if(uprv_isPositiveInfinity(1/pzero) != TRUE) { + errln("FAIL: isPositiveInfinity(1/0.0) returned FALSE, should be TRUE."); + } + + if(uprv_isNegativeInfinity(1/nzero) != TRUE) { + errln("FAIL: isNegativeInfinity(1/-0.0) returned FALSE, should be TRUE."); + } +#endif +} + +//============================== + +void +PUtilTest::testIsNaN(void) +{ + double pinf = uprv_getInfinity(); + double ninf = -uprv_getInfinity(); + double nan = uprv_getNaN(); + double ten = 10.0; + + if(uprv_isNaN(nan) == FALSE) { + errln("FAIL: isNaN() returned FALSE for NaN."); + } + + if(uprv_isNaN(pinf) == TRUE) { + errln("FAIL: isNaN() returned TRUE for +Infinity."); + } + + if(uprv_isNaN(ninf) == TRUE) { + errln("FAIL: isNaN() returned TRUE for -Infinity."); + } + + if(uprv_isNaN(ten) == TRUE) { + errln("FAIL: isNaN() returned TRUE for 10.0."); + } +} + +//============================== + +void +PUtilTest::NaNGT(void) +{ + double pinf = uprv_getInfinity(); + double ninf = -uprv_getInfinity(); + double nan = uprv_getNaN(); + double ten = 10.0; + + if(nan > nan != FALSE) { + logln("WARNING: NaN > NaN returned TRUE, should be FALSE"); + } + + if(nan > pinf != FALSE) { + logln("WARNING: NaN > +Infinity returned TRUE, should be FALSE"); + } + + if(nan > ninf != FALSE) { + logln("WARNING: NaN > -Infinity returned TRUE, should be FALSE"); + } + + if(nan > ten != FALSE) { + logln("WARNING: NaN > 10.0 returned TRUE, should be FALSE"); + } +} + +//============================== + +void +PUtilTest::NaNLT(void) +{ + double pinf = uprv_getInfinity(); + double ninf = -uprv_getInfinity(); + double nan = uprv_getNaN(); + double ten = 10.0; + + if(nan < nan != FALSE) { + logln("WARNING: NaN < NaN returned TRUE, should be FALSE"); + } + + if(nan < pinf != FALSE) { + logln("WARNING: NaN < +Infinity returned TRUE, should be FALSE"); + } + + if(nan < ninf != FALSE) { + logln("WARNING: NaN < -Infinity returned TRUE, should be FALSE"); + } + + if(nan < ten != FALSE) { + logln("WARNING: NaN < 10.0 returned TRUE, should be FALSE"); + } +} + +//============================== + +void +PUtilTest::NaNGTE(void) +{ + double pinf = uprv_getInfinity(); + double ninf = -uprv_getInfinity(); + double nan = uprv_getNaN(); + double ten = 10.0; + + if(nan >= nan != FALSE) { + logln("WARNING: NaN >= NaN returned TRUE, should be FALSE"); + } + + if(nan >= pinf != FALSE) { + logln("WARNING: NaN >= +Infinity returned TRUE, should be FALSE"); + } + + if(nan >= ninf != FALSE) { + logln("WARNING: NaN >= -Infinity returned TRUE, should be FALSE"); + } + + if(nan >= ten != FALSE) { + logln("WARNING: NaN >= 10.0 returned TRUE, should be FALSE"); + } +} + +//============================== + +void +PUtilTest::NaNLTE(void) +{ + double pinf = uprv_getInfinity(); + double ninf = -uprv_getInfinity(); + double nan = uprv_getNaN(); + double ten = 10.0; + + if(nan <= nan != FALSE) { + logln("WARNING: NaN <= NaN returned TRUE, should be FALSE"); + } + + if(nan <= pinf != FALSE) { + logln("WARNING: NaN <= +Infinity returned TRUE, should be FALSE"); + } + + if(nan <= ninf != FALSE) { + logln("WARNING: NaN <= -Infinity returned TRUE, should be FALSE"); + } + + if(nan <= ten != FALSE) { + logln("WARNING: NaN <= 10.0 returned TRUE, should be FALSE"); + } +} + +//============================== + +void +PUtilTest::NaNE(void) +{ + double pinf = uprv_getInfinity(); + double ninf = -uprv_getInfinity(); + double nan = uprv_getNaN(); + double ten = 10.0; + + if(nan == nan != FALSE) { + logln("WARNING: NaN == NaN returned TRUE, should be FALSE"); + } + + if(nan == pinf != FALSE) { + logln("WARNING: NaN == +Infinity returned TRUE, should be FALSE"); + } + + if(nan == ninf != FALSE) { + logln("WARNING: NaN == -Infinity returned TRUE, should be FALSE"); + } + + if(nan == ten != FALSE) { + logln("WARNING: NaN == 10.0 returned TRUE, should be FALSE"); + } +} + +//============================== + +void +PUtilTest::NaNNE(void) +{ + double pinf = uprv_getInfinity(); + double ninf = -uprv_getInfinity(); + double nan = uprv_getNaN(); + double ten = 10.0; + + if(nan != nan != TRUE) { + logln("WARNING: NaN != NaN returned FALSE, should be TRUE"); + } + + if(nan != pinf != TRUE) { + logln("WARNING: NaN != +Infinity returned FALSE, should be TRUE"); + } + + if(nan != ninf != TRUE) { + logln("WARNING: NaN != -Infinity returned FALSE, should be TRUE"); + } + + if(nan != ten != TRUE) { + logln("WARNING: NaN != 10.0 returned FALSE, should be TRUE"); + } +} + diff --git a/icuSources/test/intltest/tsputil.h b/icuSources/test/intltest/tsputil.h index 7716f04e..5c5649bd 100644 --- a/icuSources/test/intltest/tsputil.h +++ b/icuSources/test/intltest/tsputil.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -25,6 +25,21 @@ private: // void remainderTest(double x, double y, double exp); void maxMinTest(double a, double b, double exp, UBool max); + // the actual tests; methods return the number of errors + void testNaN(void); + void testPositiveInfinity(void); + void testNegativeInfinity(void); + void testZero(void); + + // subtests of testNaN + void testIsNaN(void); + void NaNGT(void); + void NaNLT(void); + void NaNGTE(void); + void NaNLTE(void); + void NaNE(void); + void NaNNE(void); + }; #endif diff --git a/icuSources/test/intltest/tstnorm.cpp b/icuSources/test/intltest/tstnorm.cpp index 737b78a1..af41dfc1 100644 --- a/icuSources/test/intltest/tstnorm.cpp +++ b/icuSources/test/intltest/tstnorm.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -1671,6 +1671,27 @@ initExpectedSkippables(UnicodeSet skipSets[UNORM_MODE_COUNT]) { "D6A8-\\U0001D7C9\\U0001D7CE-\\U0001D7FF\\U0002F800-\\U0002FA1D]", ""), errorCode); } +U_CDECL_BEGIN + +// USetAdder implementation +// Does not use uset.h to reduce code dependencies +static void U_CALLCONV +_set_add(USet *set, UChar32 c) { + ((UnicodeSet *)set)->add(c); +} + +static void U_CALLCONV +_set_addRange(USet *set, UChar32 start, UChar32 end) { + ((UnicodeSet *)set)->add(start, end); +} + +static void U_CALLCONV +_set_addString(USet *set, const UChar *str, int32_t length) { + ((UnicodeSet *)set)->add(UnicodeString((UBool)(length<0), str, length)); +} + +U_CDECL_END + void BasicNormalizerTest::TestSkippable() { UnicodeSet starts, diff, skipSets[UNORM_MODE_COUNT], expectSets[UNORM_MODE_COUNT]; @@ -1682,7 +1703,13 @@ BasicNormalizerTest::TestSkippable() { /* build NF*Skippable sets from runtime data */ status=U_ZERO_ERROR; - unorm_addPropertyStarts((USet *)&starts, &status); + USetAdder sa = { + (USet *)&starts, + _set_add, + _set_addRange, + _set_addString + }; + unorm_addPropertyStarts(&sa, &status); if(U_FAILURE(status)) { errln("unable to load normalization data for unorm_addPropertyStarts(() - %s\n", u_errorName(status)); return; diff --git a/icuSources/test/intltest/tzbdtest.cpp b/icuSources/test/intltest/tzbdtest.cpp index 887226ce..66e0f24a 100644 --- a/icuSources/test/intltest/tzbdtest.cpp +++ b/icuSources/test/intltest/tzbdtest.cpp @@ -1,8 +1,8 @@ -/******************************************************************** +/*********************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ + * Copyright (c) 1997-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ***********************************************************************/ #include "unicode/utypes.h" @@ -12,6 +12,7 @@ #include "unicode/timezone.h" #include "unicode/simpletz.h" #include "unicode/gregocal.h" +#include "putilimp.h" void TimeZoneBoundaryTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) { @@ -175,7 +176,11 @@ TimeZoneBoundaryTest::showDate(UDate d) UnicodeString TimeZoneBoundaryTest::showNN(int32_t n) { - return ((n < 10) ? UnicodeString("0"): UnicodeString("")) + n; + UnicodeString nStr; + if (n < 10) { + nStr += UnicodeString("0", ""); + } + return nStr + n; } // ------------------------------------- @@ -401,7 +406,7 @@ TimeZoneBoundaryTest::findBoundariesStepwise(int32_t year, UDate interval, TimeZ void TimeZoneBoundaryTest::TestStepwise() { - TimeZone *zone = TimeZone::createTimeZone("EST"); + TimeZone *zone = TimeZone::createTimeZone("America/New_York"); findBoundariesStepwise(1997, ONE_DAY, zone, 2); delete zone; zone = TimeZone::createTimeZone("UTC"); // updated 12/3/99 aliu diff --git a/icuSources/test/intltest/tzregts.cpp b/icuSources/test/intltest/tzregts.cpp index dc07ddf1..b1394787 100644 --- a/icuSources/test/intltest/tzregts.cpp +++ b/icuSources/test/intltest/tzregts.cpp @@ -126,7 +126,7 @@ void TimeZoneRegressionTest:: Test4073215() { UErrorCode status = U_ZERO_ERROR; UnicodeString str, str2; - SimpleTimeZone *z = (SimpleTimeZone*) TimeZone::createTimeZone("GMT"); + SimpleTimeZone *z = new SimpleTimeZone(0, "GMT"); if (z->useDaylightTime()) errln("Fail: Fix test to start with non-DST zone"); z->setStartRule(UCAL_FEBRUARY, 1, UCAL_SUNDAY, 0, status); @@ -486,7 +486,7 @@ void TimeZoneRegressionTest:: Test4151406() { // h is in half-hours from GMT; rawoffset is in millis int32_t rawoffset = h * 1800000; int32_t hh = (h<0) ? -h : h; - UnicodeString hname = ((h<0) ? UnicodeString("GMT-") : UnicodeString("GMT+")) + + UnicodeString hname = UnicodeString((h<0) ? "GMT-" : "GMT+") + ((hh/2 < 10) ? "0" : "") + (hh/2) + ':' + ((hh%2==0) ? "00" : "30"); @@ -497,8 +497,11 @@ void TimeZoneRegressionTest:: Test4151406() { count = ids->count(ec); if (count> max) max = count; - logln(hname + ' ' + count + - ((count > 0) ? (" e.g. " + *ids->snext(ec)) : UnicodeString(""))); + if (count > 0) { + logln(hname + ' ' + (UnicodeString)count + (UnicodeString)" e.g. " + *ids->snext(ec)); + } else { + logln(hname + ' ' + count); + } // weiv 11/27/2002: why uprv_free? This should be a delete delete ids; //delete [] ids; @@ -795,10 +798,17 @@ TimeZoneRegressionTest::Test4154650() // e = ex; //} if(good != U_SUCCESS(status)) { + UnicodeString errMsg; + if (good) { + errMsg = (UnicodeString(") threw ") + u_errorName(status)); + } + else { + errMsg = UnicodeString(") accepts invalid args", ""); + } errln(UnicodeString("Fail: getOffset(") + DATA[i+1] + ", " + DATA[i+2] + ", " + DATA[i+3] + ", " + DATA[i+4] + ", " + DATA[i+5] + ", " + DATA[i+6] + - (good ? (UnicodeString(") threw ") + u_errorName(status)) : UnicodeString(") accepts invalid args"))); + errMsg); } status = U_ZERO_ERROR; // reset } @@ -834,9 +844,10 @@ TimeZoneRegressionTest::Test4162593() 0, 0, 0 }; int32_t DATA_INT [] [5] = { - {98, UCAL_SEPTEMBER, 30, 22, 0}, - {100, UCAL_FEBRUARY, 28, 22, 0}, - {100, UCAL_FEBRUARY, 29, 22, 0}, + // These years must be AFTER the Gregorian cutover + {1998, UCAL_SEPTEMBER, 30, 22, 0}, + {2000, UCAL_FEBRUARY, 28, 22, 0}, + {2000, UCAL_FEBRUARY, 29, 22, 0}, }; UBool DATA_BOOL [] = { @@ -933,7 +944,7 @@ void TimeZoneRegressionTest::TestJ449() { // specify two zones in the same equivalency group. One must have // locale data in 'loc'; the other must not. const char* idWithLocaleData = "America/Los_Angeles"; - const char* idWithoutLocaleData = "America/Vancouver"; + const char* idWithoutLocaleData = "US/Pacific"; const Locale loc("en", "", ""); TimeZone *zoneWith = TimeZone::createTimeZone(idWithLocaleData); @@ -941,7 +952,7 @@ void TimeZoneRegressionTest::TestJ449() { // Make sure we got valid zones if (zoneWith->getID(str) != UnicodeString(idWithLocaleData) || zoneWithout->getID(str) != UnicodeString(idWithoutLocaleData)) { - errln("Fail: Unable to create zones"); + errln(UnicodeString("Fail: Unable to create zones - wanted ") + idWithLocaleData + ", got " + zoneWith->getID(str) + ", and wanted " + idWithoutLocaleData + " but got " + zoneWithout->getID(str)); } else { GregorianCalendar calWith(*zoneWith, status); GregorianCalendar calWithout(*zoneWithout, status); @@ -975,8 +986,29 @@ void TimeZoneRegressionTest::TestJ449() { void TimeZoneRegressionTest::TestJDK12API() { - TimeZone *pst = TimeZone::createTimeZone("PST"); - TimeZone *cst1 = TimeZone::createTimeZone("CST"); + // TimeZone *pst = TimeZone::createTimeZone("PST"); + // TimeZone *cst1 = TimeZone::createTimeZone("CST"); + UErrorCode ec = U_ZERO_ERROR; + //d,-28800,3,1,-1,120,w,9,-1,1,120,w,60 + TimeZone *pst = new SimpleTimeZone(-28800*U_MILLIS_PER_SECOND, + "PST", + 3,1,-1,120*U_MILLIS_PER_MINUTE, + SimpleTimeZone::WALL_TIME, + 9,-1,1,120*U_MILLIS_PER_MINUTE, + SimpleTimeZone::WALL_TIME, + 60*U_MILLIS_PER_MINUTE,ec); + //d,-21600,3,1,-1,120,w,9,-1,1,120,w,60 + TimeZone *cst1 = new SimpleTimeZone(-21600*U_MILLIS_PER_SECOND, + "CST", + 3,1,-1,120*U_MILLIS_PER_MINUTE, + SimpleTimeZone::WALL_TIME, + 9,-1,1,120*U_MILLIS_PER_MINUTE, + SimpleTimeZone::WALL_TIME, + 60*U_MILLIS_PER_MINUTE,ec); + if (U_FAILURE(ec)) { + errln("FAIL: SimpleTimeZone constructor"); + return; + } SimpleTimeZone *cst = 0; diff --git a/icuSources/test/intltest/tztest.cpp b/icuSources/test/intltest/tztest.cpp index 89f87f6c..633da043 100644 --- a/icuSources/test/intltest/tztest.cpp +++ b/icuSources/test/intltest/tztest.cpp @@ -1,8 +1,8 @@ -/******************************************************************** +/*********************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ + * Copyright (c) 1997-2004, International Business Machines Corporation + * and others. All Rights Reserved. + ***********************************************************************/ #include "unicode/utypes.h" @@ -16,6 +16,7 @@ #include "unicode/strenum.h" #include "tztest.h" #include "cmemory.h" +#include "putilimp.h" #define CASE(id,test) case id: \ name = #test; \ @@ -43,8 +44,10 @@ void TimeZoneTest::runIndexedTest( int32_t index, UBool exec, const char* &name, CASE(7, TestDisplayName); CASE(8, TestDSTSavings); CASE(9, TestAlternateRules); - CASE(10,TestCountries); - default: name = ""; break; + CASE(10,TestCountries); + CASE(11,TestHistorical); + CASE(12,TestEquivalentIDs); + default: name = ""; break; } } @@ -81,14 +84,15 @@ TimeZoneTest::TestGenericAPI() if (!(copy == *zoneclone)) errln("FAIL: assignment operator or operator== failed"); TimeZone* saveDefault = TimeZone::createDefault(); - TimeZone* pstZone = TimeZone::createTimeZone("PST"); + logln((UnicodeString)"TimeZone::createDefault() => " + saveDefault->getID(id)); + //TimeZone* pstZone = TimeZone::createTimeZone("PST"); - logln("call u_t_timezone() which uses the host"); + logln("call uprv_timezone() which uses the host"); logln("to get the difference in seconds between coordinated universal"); logln("time and local time. E.g., -28,800 for PST (GMT-8hrs)"); int32_t tzoffset = uprv_timezone(); - logln(UnicodeString("Value returned from t_timezone = ") + tzoffset); + logln(UnicodeString("Value returned from uprv_timezone = ") + tzoffset); // Invert sign because UNIX semantics are backwards if (tzoffset < 0) tzoffset = -tzoffset; @@ -99,7 +103,7 @@ TimeZoneTest::TestGenericAPI() //} if (tzoffset != 28800) { - logln("***** WARNING: If testing in the PST timezone, t_timezone should return 28800! *****"); + logln("***** WARNING: If testing in the PST timezone, uprv_timezone should return 28800! *****"); } if ((tzoffset % 1800 != 0)) { errln("FAIL: t_timezone may be incorrect. It is not a multiple of 30min. It is %d", tzoffset); @@ -113,7 +117,7 @@ TimeZoneTest::TestGenericAPI() TimeZone::adoptDefault(saveDefault); delete defaultzone; delete zoneclone; - delete pstZone; + //delete pstZone; } // --------------------------------------------------------------------------------- @@ -174,8 +178,8 @@ TimeZoneTest::TestRuleAPI() " = " + dateToString(expJulyOne)); } - testUsingBinarySearch(zone, date(90, UCAL_JANUARY, 1), date(90, UCAL_JUNE, 15), marchOne); - testUsingBinarySearch(zone, date(90, UCAL_JUNE, 1), date(90, UCAL_DECEMBER, 31), julyOne); + testUsingBinarySearch(*zone, date(90, UCAL_JANUARY, 1), date(90, UCAL_JUNE, 15), marchOne); + testUsingBinarySearch(*zone, date(90, UCAL_JUNE, 1), date(90, UCAL_DECEMBER, 31), julyOne); if (zone->inDaylightTime(marchOne - 1000, status) || !zone->inDaylightTime(marchOne, status)) @@ -195,25 +199,56 @@ TimeZoneTest::TestRuleAPI() } void -TimeZoneTest::testUsingBinarySearch(SimpleTimeZone* tz, UDate min, UDate max, UDate expectedBoundary) +TimeZoneTest::findTransition(const TimeZone& tz, + UDate min, UDate max) { + UErrorCode ec = U_ZERO_ERROR; + UnicodeString id,s; + UBool startsInDST = tz.inDaylightTime(min, ec); + if (failure(ec, "TimeZone::inDaylightTime")) return; + if (tz.inDaylightTime(max, ec) == startsInDST) { + logln("Error: " + tz.getID(id) + ".inDaylightTime(" + dateToString(min) + ") = " + (startsInDST?"TRUE":"FALSE") + + ", inDaylightTime(" + dateToString(max) + ") = " + (startsInDST?"TRUE":"FALSE")); + return; + } + if (failure(ec, "TimeZone::inDaylightTime")) return; + while ((max - min) > INTERVAL) { + UDate mid = (min + max) / 2; + if (tz.inDaylightTime(mid, ec) == startsInDST) { + min = mid; + } else { + max = mid; + } + if (failure(ec, "TimeZone::inDaylightTime")) return; + } + min = 1000.0 * uprv_floor(min/1000.0); + max = 1000.0 * uprv_floor(max/1000.0); + logln(tz.getID(id) + " Before: " + min/1000 + " = " + + dateToString(min,s,tz)); + logln(tz.getID(id) + " After: " + max/1000 + " = " + + dateToString(max,s,tz)); +} + +void +TimeZoneTest::testUsingBinarySearch(const TimeZone& tz, + UDate min, UDate max, + UDate expectedBoundary) { UErrorCode status = U_ZERO_ERROR; - UBool startsInDST = tz->inDaylightTime(min, status); - if (failure(status, "SimpleTimeZone::inDaylightTime")) return; - if (tz->inDaylightTime(max, status) == startsInDST) { + UBool startsInDST = tz.inDaylightTime(min, status); + if (failure(status, "TimeZone::inDaylightTime")) return; + if (tz.inDaylightTime(max, status) == startsInDST) { logln("Error: inDaylightTime(" + dateToString(max) + ") != " + ((!startsInDST)?"TRUE":"FALSE")); return; } - if (failure(status, "SimpleTimeZone::inDaylightTime")) return; + if (failure(status, "TimeZone::inDaylightTime")) return; while ((max - min) > INTERVAL) { UDate mid = (min + max) / 2; - if (tz->inDaylightTime(mid, status) == startsInDST) { + if (tz.inDaylightTime(mid, status) == startsInDST) { min = mid; - } - else { + } else { max = mid; } - if (failure(status, "SimpleTimeZone::inDaylightTime")) return; + if (failure(status, "TimeZone::inDaylightTime")) return; } logln(UnicodeString("Binary Search Before: ") + uprv_floor(0.5 + min) + " = " + dateToString(min)); logln(UnicodeString("Binary Search After: ") + uprv_floor(0.5 + max) + " = " + dateToString(max)); @@ -245,7 +280,15 @@ TimeZoneTest::TestPRTOffset() errln("FAIL: TimeZone(PRT) is null"); } else { - if (tz->getRawOffset() != (- 4 * millisPerHour)) errln("FAIL: Offset for PRT should be -4"); + int32_t expectedHour = -4; + double expectedOffset = (((double)expectedHour) * millisPerHour); + double foundOffset = tz->getRawOffset(); + int32_t foundHour = (int32_t)foundOffset / millisPerHour; + if (expectedOffset != foundOffset) { + errln("FAIL: Offset for PRT should be %d, found %d", expectedHour, foundHour); + } else { + logln("PASS: Offset for PRT should be %d, found %d", expectedHour, foundHour); + } } delete tz; } @@ -288,15 +331,81 @@ void TimeZoneTest::TestGetAvailableIDs913() { UErrorCode ec = U_ZERO_ERROR; + int32_t i; + +#ifdef U_USE_TIMEZONE_OBSOLETE_2_8 + // Test legacy API -- remove these tests when the corresponding API goes away (duh) + int32_t numIDs = -1; + const UnicodeString** ids = TimeZone::createAvailableIDs(numIDs); + if (ids == 0 || numIDs < 1) { + errln("FAIL: createAvailableIDs()"); + } else { + UnicodeString buf("TimeZone::createAvailableIDs() = { "); + for(i=0; i<numIDs; ++i) { + if (i) buf.append(", "); + buf.append(*ids[i]); + } + buf.append(" } "); + logln(buf + numIDs); + // we own the array; the caller owns the contained strings (yuck) + uprv_free(ids); + } + + numIDs = -1; + ids = TimeZone::createAvailableIDs(-8*U_MILLIS_PER_HOUR, numIDs); + if (ids == 0 || numIDs < 1) { + errln("FAIL: createAvailableIDs(-8:00)"); + } else { + UnicodeString buf("TimeZone::createAvailableIDs(-8:00) = { "); + for(i=0; i<numIDs; ++i) { + if (i) buf.append(", "); + buf.append(*ids[i]); + } + buf.append(" } "); + logln(buf + numIDs); + // we own the array; the caller owns the contained strings (yuck) + uprv_free(ids); + } + numIDs = -1; + ids = TimeZone::createAvailableIDs("US", numIDs); + if (ids == 0 || numIDs < 1) { + errln("FAIL: createAvailableIDs(US) ids=%d, numIDs=%d", ids, numIDs); + } else { + UnicodeString buf("TimeZone::createAvailableIDs(US) = { "); + for(i=0; i<numIDs; ++i) { + if (i) buf.append(", "); + buf.append(*ids[i]); + } + buf.append(" } "); + logln(buf + numIDs); + // we own the array; the caller owns the contained strings (yuck) + uprv_free(ids); + } +#endif + UnicodeString str; UnicodeString *buf = new UnicodeString("TimeZone::createEnumeration() = { "); int32_t s_length; StringEnumeration* s = TimeZone::createEnumeration(); s_length = s->count(ec); - int32_t i; for (i = 0; i < s_length;++i) { if (i > 0) *buf += ", "; - *buf += *s->snext(ec); + if ((i & 1) == 0) { + *buf += *s->snext(ec); + } else { + *buf += UnicodeString(s->next(NULL, ec), ""); + } + + if((i % 5) == 4) { + // replace s with a clone of itself + StringEnumeration *s2 = s->clone(); + if(s2 == NULL || s_length != s2->count(ec)) { + errln("TimezoneEnumeration.clone() failed"); + } else { + delete s; + s = s2; + } + } } *buf += " };"; logln(*buf); @@ -327,9 +436,23 @@ TimeZoneTest::TestGetAvailableIDs913() delete s; buf->truncate(0); - *buf += "TimeZone::createEnumeration(GMT+02:00) = { "; + *buf += "TimeZone::createEnumeration(GMT+01:00) = { "; + + s = TimeZone::createEnumeration(1 * U_MILLIS_PER_HOUR); + s_length = s->count(ec); + for (i = 0; i < s_length;++i) { + if (i > 0) *buf += ", "; + *buf += *s->snext(ec); + } + delete s; + *buf += " };"; + logln(*buf); + + + buf->truncate(0); + *buf += "TimeZone::createEnumeration(US) = { "; - s = TimeZone::createEnumeration(+ 2 * 60 * 60 * 1000); + s = TimeZone::createEnumeration("US"); s_length = s->count(ec); for (i = 0; i < s_length;++i) { if (i > 0) *buf += ", "; @@ -337,6 +460,7 @@ TimeZoneTest::TestGetAvailableIDs913() } *buf += " };"; logln(*buf); + TimeZone *tz = TimeZone::createTimeZone("PST"); if (tz != 0) logln("getTimeZone(PST) = " + tz->getID(str)); else errln("FAIL: getTimeZone(PST) = null"); @@ -361,6 +485,10 @@ TimeZoneTest::TestGetAvailableIDs913() /** + * NOTE: As of ICU 2.8, this test confirms that the "tz.alias" + * file, used to build ICU alias zones, is working. It also + * looks at some genuine Olson compatibility IDs. [aliu] + * * This test is problematic. It should really just confirm that * the list of compatibility zone IDs exist and are somewhat * meaningful (that is, they aren't all aliases of GMT). It goes a @@ -449,10 +577,10 @@ void TimeZoneTest::TestShortZoneIDs() {"AST", -540, TRUE}, {"PST", -480, TRUE}, {"PNT", -420, FALSE}, - {"MST", -420, TRUE}, + {"MST", -420, FALSE}, // updated Aug 2003 aliu {"CST", -360, TRUE}, {"IET", -300, FALSE}, - {"EST", -300, TRUE}, + {"EST", -300, FALSE}, // updated Aug 2003 aliu {"PRT", -240, FALSE}, {"CNT", -210, TRUE}, {"AGT", -180, FALSE}, // updated 26 Sep 2000 aliu @@ -468,13 +596,13 @@ void TimeZoneTest::TestShortZoneIDs() {"EAT", 180, FALSE}, {"MET", 60, TRUE}, // updated 12/3/99 aliu {"NET", 240, TRUE}, // updated 12/3/99 aliu - {"PLT", 300, TRUE}, // updated 12/3/02 aliu; Pakistan using DST as of 2002 + {"PLT", 300, FALSE}, // updated Aug 2003 aliu {"IST", 330, FALSE}, {"BST", 360, FALSE}, {"VST", 420, FALSE}, - {"CTT", 480, TRUE}, // updated 12/3/99 aliu + {"CTT", 480, FALSE}, // updated Aug 2003 aliu {"JST", 540, FALSE}, - {"ACT", 570, TRUE}, // updated 12/3/99 aliu + {"ACT", 570, FALSE}, // updated Aug 2003 aliu {"AET", 600, TRUE}, {"SST", 660, FALSE}, // "NST", 720, FALSE, @@ -526,7 +654,7 @@ void TimeZoneTest::TestShortZoneIDs() const char* compatibilityMap[] = { // This list is copied from tz.alias. If tz.alias - // changes, this list must be updated. Current as of 1/31/01 + // changes, this list must be updated. Current as of Aug 2003 "ACT", "Australia/Darwin", "AET", "Australia/Sydney", "AGT", "America/Buenos_Aires", @@ -541,14 +669,14 @@ void TimeZoneTest::TestShortZoneIDs() "EAT", "Africa/Addis_Ababa", "ECT", "Europe/Paris", // EET Europe/Istanbul # EET is a standard UNIX zone - "EST", "America/New_York", + // "EST", "America/New_York", # EST is an Olson alias now (2003) "HST", "Pacific/Honolulu", "IET", "America/Indianapolis", "IST", "Asia/Calcutta", "JST", "Asia/Tokyo", // MET Asia/Tehran # MET is a standard UNIX zone "MIT", "Pacific/Apia", - "MST", "America/Denver", + // "MST", "America/Denver", # MST is an Olson alias now (2003) "NET", "Asia/Yerevan", "NST", "Pacific/Auckland", "PLT", "Asia/Karachi", @@ -649,8 +777,8 @@ void TimeZoneTest::TestCustomParse() // ID Expected offset in minutes //"GMT", kUnparseable, Isn't custom. Can't test it here. [returns normal GMT] {"GMT-YOUR.AD.HERE", kUnparseable}, - {"GMT0", kUnparseable}, - {"GMT+0", (0)}, + // {"GMT0", kUnparseable}, // ICU 2.8: An Olson zone ID + // {"GMT+0", (0)}, // ICU 2.8: An Olson zone ID {"GMT+1", (60)}, {"GMT-0030", (-30)}, {"GMT+15:99", (15*60+99)}, @@ -777,8 +905,8 @@ TimeZoneTest::TestDisplayName() errln("Fail: Expected " + UnicodeString(kData[i].expect) + "; got " + name); logln("PST [with options]->" + name); } - for (i=0; kData[i].expect[0] != '\0'; i++) - { + for (i=0; kData[i].expect[0] != '\0'; i++) + { name.remove(); name = zone->getDisplayName(kData[i].useDst, kData[i].style, name); @@ -795,7 +923,12 @@ TimeZoneTest::TestDisplayName() zone2->setStartRule(UCAL_JANUARY, 1, 0, 0, status); zone2->setEndRule(UCAL_DECEMBER, 31, 0, 0, status); - UnicodeString inDaylight = (zone2->inDaylightTime(UDate(0), status)? UnicodeString("TRUE"):UnicodeString("FALSE")); + UnicodeString inDaylight; + if (zone2->inDaylightTime(UDate(0), status)) { + inDaylight = UnicodeString("TRUE"); + } else { + inDaylight = UnicodeString("FALSE"); + } logln(UnicodeString("Modified PST inDaylightTime->") + inDaylight ); if(U_FAILURE(status)) { @@ -809,33 +942,33 @@ TimeZoneTest::TestDisplayName() // Make sure we get the default display format for Locales // with no display name data. - Locale zh_CN = Locale::getSimplifiedChinese(); + Locale mt_MT("mt_MT"); name.remove(); - name = zone->getDisplayName(zh_CN,name); + name = zone->getDisplayName(mt_MT,name); //***************************************************************** // THE FOLLOWING LINE MUST BE UPDATED IF THE LOCALE DATA CHANGES // THE FOLLOWING LINE MUST BE UPDATED IF THE LOCALE DATA CHANGES // THE FOLLOWING LINE MUST BE UPDATED IF THE LOCALE DATA CHANGES //***************************************************************** - logln("PST(zh_CN)->" + name); + logln("PST(mt_MT)->" + name); // *** REVISIT SRL how in the world do I check this? looks java specific. // Now be smart -- check to see if zh resource is even present. // If not, we expect the en fallback behavior. - ResourceBundle enRB(u_getDataDirectory(), + ResourceBundle enRB(NULL, Locale::getEnglish(), status); if(U_FAILURE(status)) errln("Couldn't get ResourceBundle for en"); - ResourceBundle zhRB(u_getDataDirectory(), - zh_CN, status); + ResourceBundle mtRB(NULL, + mt_MT, status); //if(U_FAILURE(status)) - // errln("Couldn't get ResourceBundle for zh_CN"); + // errln("Couldn't get ResourceBundle for mt_MT"); UBool noZH = U_FAILURE(status); if (noZH) { - logln("Warning: Not testing the zh_CN behavior because resource is absent"); + logln("Warning: Not testing the mt_MT behavior because resource is absent"); if (name != "Pacific Standard Time") errln("Fail: Expected Pacific Standard Time"); } @@ -845,7 +978,7 @@ TimeZoneTest::TestDisplayName() name.compare("GMT-8:00") && name.compare("GMT-0800") && name.compare("GMT-800")) { - errln("Fail: Expected GMT-08:00 or something similar"); + errln(UnicodeString("Fail: Expected GMT-08:00 or something similar for PST in mt_MT but got ") + name ); errln("************************************************************"); errln("THE ABOVE FAILURE MAY JUST MEAN THE LOCALE DATA HAS CHANGED"); errln("************************************************************"); @@ -862,7 +995,7 @@ TimeZoneTest::TestDisplayName() name.compare("GMT+0130") && name.compare("GMT+130")) errln("Fail: Expected GMT+01:30 or something similar"); - name.truncate(0); + name.truncate(0); zone2->getDisplayName(name); logln("GMT+90min->" + name); if (name.compare("GMT+01:30") && @@ -1056,30 +1189,104 @@ void TimeZoneTest::TestCountries() { errln("FAIL: " + laZone + " in JP = " + la); errln("FAIL: " + tokyoZone + " in JP = " + tokyo); } - StringEnumeration* s1 = TimeZone::createEnumeration("US"); - StringEnumeration* s2 = TimeZone::createEnumeration("US"); - for(i=0;i<n;++i){ - const UnicodeString* id1 = s1->snext(ec); - if(id1==NULL || U_FAILURE(ec)){ - errln("Failed to fetch next from TimeZone enumeration. Length returned : %i Current Index: %i", n,i); - } - TimeZone* tz1 = TimeZone::createTimeZone(*id1); - for(int j=0; j<n;++j){ - const UnicodeString* id2 = s2->snext(ec); - if(id2==NULL || U_FAILURE(ec)){ - errln("Failed to fetch next from TimeZone enumeration. Length returned : %i Current Index: %i", n,i); - } - TimeZone* tz2 = TimeZone::createTimeZone(*id2); - if(tz1->hasSameRules(*tz2)){ - logln("ID1 : " + *id1+" == ID2 : " +*id2); - } - delete tz2; - } - delete tz1; - } - delete s1; - delete s2; + StringEnumeration* s1 = TimeZone::createEnumeration("US"); + StringEnumeration* s2 = TimeZone::createEnumeration("US"); + for(i=0;i<n;++i){ + const UnicodeString* id1 = s1->snext(ec); + if(id1==NULL || U_FAILURE(ec)){ + errln("Failed to fetch next from TimeZone enumeration. Length returned : %i Current Index: %i", n,i); + } + TimeZone* tz1 = TimeZone::createTimeZone(*id1); + for(int j=0; j<n;++j){ + const UnicodeString* id2 = s2->snext(ec); + if(id2==NULL || U_FAILURE(ec)){ + errln("Failed to fetch next from TimeZone enumeration. Length returned : %i Current Index: %i", n,i); + } + TimeZone* tz2 = TimeZone::createTimeZone(*id2); + if(tz1->hasSameRules(*tz2)){ + logln("ID1 : " + *id1+" == ID2 : " +*id2); + } + delete tz2; + } + delete tz1; + } + delete s1; + delete s2; delete s; } +void TimeZoneTest::TestHistorical() { + const int32_t H = U_MILLIS_PER_HOUR; + struct { + const char* id; + int32_t time; // epoch seconds + int32_t offset; // total offset (millis) + } DATA[] = { + // Add transition points (before/after) as desired to test historical + // behavior. + {"America/Los_Angeles", 638963999, -8*H}, // Sun Apr 01 01:59:59 GMT-08:00 1990 + {"America/Los_Angeles", 638964000, -7*H}, // Sun Apr 01 03:00:00 GMT-07:00 1990 + {"America/Los_Angeles", 657104399, -7*H}, // Sun Oct 28 01:59:59 GMT-07:00 1990 + {"America/Los_Angeles", 657104400, -8*H}, // Sun Oct 28 01:00:00 GMT-08:00 1990 + {"America/Goose_Bay", -116445601, -4*H}, // Sun Apr 24 01:59:59 GMT-04:00 1966 + {"America/Goose_Bay", -116445600, -3*H}, // Sun Apr 24 03:00:00 GMT-03:00 1966 + {"America/Goose_Bay", -100119601, -3*H}, // Sun Oct 30 01:59:59 GMT-03:00 1966 + {"America/Goose_Bay", -100119600, -4*H}, // Sun Oct 30 01:00:00 GMT-04:00 1966 + {"America/Goose_Bay", -84391201, -4*H}, // Sun Apr 30 01:59:59 GMT-04:00 1967 + {"America/Goose_Bay", -84391200, -3*H}, // Sun Apr 30 03:00:00 GMT-03:00 1967 + {"America/Goose_Bay", -68670001, -3*H}, // Sun Oct 29 01:59:59 GMT-03:00 1967 + {"America/Goose_Bay", -68670000, -4*H}, // Sun Oct 29 01:00:00 GMT-04:00 1967 + {0, 0, 0} + }; + + for (int32_t i=0; DATA[i].id!=0; ++i) { + const char* id = DATA[i].id; + TimeZone *tz = TimeZone::createTimeZone(id); + UnicodeString s; + if (tz == 0) { + errln("FAIL: Cannot create %s", id); + } else if (tz->getID(s) != UnicodeString(id)) { + errln((UnicodeString)"FAIL: createTimeZone(" + id + ") => " + s); + } else { + UErrorCode ec = U_ZERO_ERROR; + int32_t raw, dst; + UDate when = (double) DATA[i].time * U_MILLIS_PER_SECOND; + tz->getOffset(when, FALSE, raw, dst, ec); + if (U_FAILURE(ec)) { + errln("FAIL: getOffset"); + } else if ((raw+dst) != DATA[i].offset) { + errln((UnicodeString)"FAIL: " + DATA[i].id + ".getOffset(" + + //when + " = " + + dateToString(when) + ") => " + + raw + ", " + dst); + } else { + logln((UnicodeString)"Ok: " + DATA[i].id + ".getOffset(" + + //when + " = " + + dateToString(when) + ") => " + + raw + ", " + dst); + } + } + delete tz; + } +} + +void TimeZoneTest::TestEquivalentIDs() { + int32_t n = TimeZone::countEquivalentIDs("PST"); + if (n < 2) { + errln((UnicodeString)"FAIL: countEquivalentIDs(PST) = " + n); + } else { + UBool sawLA = FALSE; + for (int32_t i=0; i<n; ++i) { + UnicodeString id = TimeZone::getEquivalentID("PST", i); + logln((UnicodeString)"" + i + " : " + id); + if (id == UnicodeString("America/Los_Angeles")) { + sawLA = TRUE; + } + } + if (!sawLA) { + errln("FAIL: America/Los_Angeles should be in the list"); + } + } +} + #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/test/intltest/tztest.h b/icuSources/test/intltest/tztest.h index 51e68b13..310a304b 100644 --- a/icuSources/test/intltest/tztest.h +++ b/icuSources/test/intltest/tztest.h @@ -1,7 +1,7 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2003, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -46,11 +46,16 @@ public: * Test the setStartRule/setEndRule API calls. */ virtual void TestRuleAPI(void); + + void findTransition(const TimeZone& tz, + UDate min, UDate max); - /** + /** * subtest used by TestRuleAPI **/ - void testUsingBinarySearch(SimpleTimeZone* tz, UDate min, UDate max, UDate expectedBoundary); + void testUsingBinarySearch(const TimeZone& tz, + UDate min, UDate max, + UDate expectedBoundary); /** @@ -74,6 +79,10 @@ public: void TestCountries(void); + void TestHistorical(void); + + void TestEquivalentIDs(void); + static const UDate INTERVAL; private: diff --git a/icuSources/test/intltest/ucaconf.cpp b/icuSources/test/intltest/ucaconf.cpp index 73aef2ff..2320d7dd 100644 --- a/icuSources/test/intltest/ucaconf.cpp +++ b/icuSources/test/intltest/ucaconf.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 2002-2003, International Business Machines Corporation and + * Copyright (c) 2002-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -15,6 +15,10 @@ #if !UCONFIG_NO_COLLATION #include "ucaconf.h" +#include "unicode/ustring.h" +#include "cstring.h" +#include "uparse.h" + UCAConformanceTest::UCAConformanceTest() : rbUCA(NULL), testFile(NULL), @@ -25,19 +29,12 @@ status(U_ZERO_ERROR) errln("ERROR - UCAConformanceTest: Unable to open UCA collator!"); } - uprv_strcpy(testDataPath, IntlTest::loadTestData(status)); + const char *srcDir = IntlTest::getSourceTestData(status); if (U_FAILURE(status)) { errln("ERROR: could not open test data %s", u_errorName(status)); return; } - char* index = 0; - - index=strrchr(testDataPath,(char)U_FILE_SEP_CHAR); - - if((unsigned int)(index-testDataPath) != (strlen(testDataPath)-1)){ - *(index+1)=0; - } - uprv_strcat(testDataPath,".."U_FILE_SEP_STRING); + uprv_strcpy(testDataPath, srcDir); uprv_strcat(testDataPath, "CollationTest_"); } @@ -85,7 +82,7 @@ void UCAConformanceTest::initRbUCA() rbUCA = ucol_openRules(ucarules, size, UCOL_DEFAULT, UCOL_TERTIARY, &parseError, &status); if (U_FAILURE(status)) { - errln("Failure creating UCA rule-based collator."); + errln("Failure creating UCA rule-based collator: %s", u_errorName(status)); return; } } @@ -118,7 +115,7 @@ void UCAConformanceTest::openTestFile(const char *type) char buffer[1024]; uprv_strcpy(buffer, testDataPath); uprv_strcat(buffer, type); - int32_t bufLen = uprv_strlen(buffer); + int32_t bufLen = (int32_t)uprv_strlen(buffer); // we try to open 3 files: // path/CollationTest_type.txt diff --git a/icuSources/test/intltest/ucaconf.h b/icuSources/test/intltest/ucaconf.h index 20a62ff3..7e3368cb 100644 --- a/icuSources/test/intltest/ucaconf.h +++ b/icuSources/test/intltest/ucaconf.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 2002, International Business Machines Corporation and + * Copyright (c) 2002-2003, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -18,10 +18,7 @@ #if !UCONFIG_NO_COLLATION #include "unicode/tblcoll.h" -#include "unicode/ustring.h" #include "tscoll.h" -#include "uparse.h" -#include "cstring.h" #include <stdio.h> diff --git a/icuSources/test/intltest/ucdtest.cpp b/icuSources/test/intltest/ucdtest.cpp index 89614feb..714437f7 100644 --- a/icuSources/test/intltest/ucdtest.cpp +++ b/icuSources/test/intltest/ucdtest.cpp @@ -1,12 +1,13 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ #include "unicode/ustring.h" #include "unicode/uchar.h" #include "unicode/uniset.h" +#include "unicode/putil.h" #include "cstring.h" #include "uparse.h" #include "ucdtest.h" @@ -95,7 +96,7 @@ derivedCorePropsIndex[]={ UCHAR_GRAPHEME_BASE }; -U_CAPI void U_CALLCONV +U_CFUNC void U_CALLCONV derivedCorePropsLineFn(void *context, char *fields[][2], int32_t /* fieldCount */, UErrorCode *pErrorCode) @@ -135,18 +136,10 @@ void UnicodeTest::TestAdditionalProperties() { char newPath[256]; char backupPath[256]; char *fields[2][2]; - int32_t length; UErrorCode errorCode=U_ZERO_ERROR; /* Look inside ICU_DATA first */ - strcpy(newPath, u_getDataDirectory()); - - // remove trailing "out/" - length=uprv_strlen(newPath); - if(length>=4 && uprv_strcmp(newPath+length-4, "out" U_FILE_SEP_STRING)==0) { - newPath[length-4]=0; - } - + strcpy(newPath, pathToDataDirectory()); strcat(newPath, "unidata" U_FILE_SEP_STRING "DerivedCoreProperties.txt"); // As a fallback, try to guess where the source data was located diff --git a/icuSources/test/intltest/ucdtest.h b/icuSources/test/intltest/ucdtest.h index cedc3704..6695a878 100644 --- a/icuSources/test/intltest/ucdtest.h +++ b/icuSources/test/intltest/ucdtest.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -8,11 +8,11 @@ #include "intltest.h" /** Helper function for TestUnicodeData */ -U_CAPI void U_CALLCONV unicodeDataLineFn(void *context, +U_CFUNC void U_CALLCONV unicodeDataLineFn(void *context, char *fields[][2], int32_t fieldCount, UErrorCode *pErrorCode); -U_CAPI void U_CALLCONV +U_CFUNC void U_CALLCONV derivedCorePropsLineFn(void *context, char *fields[][2], int32_t fieldCount, UErrorCode *pErrorCode); diff --git a/icuSources/test/intltest/ufltlgts.cpp b/icuSources/test/intltest/ufltlgts.cpp deleted file mode 100644 index 70c4a7d6..00000000 --- a/icuSources/test/intltest/ufltlgts.cpp +++ /dev/null @@ -1,247 +0,0 @@ -/*************************************************************************** -* -* Copyright (C) 2000-2002, International Business Machines -* Corporation and others. All Rights Reserved. -* -*************************************************************************************************************************************************** -* Date Name Description -* 03/22/2000 Madhu Creation. -************************************************************************/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_TRANSLITERATION - -#include "unicode/translit.h" -#include "unicode/unifilt.h" -#include "unicode/unifltlg.h" -#include "intltest.h" -#include "ittrans.h" -#include "ufltlgts.h" - -//--------------------------------------------- -// runIndexedTest -//--------------------------------------------- - -void UnicodeFilterLogicTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) -{ - if (exec) logln((UnicodeString)"TestSuite UnicodeFilterLogic API "); - switch (index) { - - case 0: name = "TestAll"; if (exec) TestAll(); break; - - default: name = ""; break; /*needed to end loop*/ - } -} -int32_t gFilter1ClassID; -class Filter1: public UnicodeFilter{ - virtual UClassID getDynamicClassID() const { return (UClassID)&gFilter1ClassID; } - virtual UnicodeFunctor* clone() const{ - return new Filter1(*this); - } - virtual UBool contains(UChar32 c) const { - if(c == 0x0061 || c == 0x0041 || c == 0x0063 || c == 0x0043) - return FALSE; - else - return TRUE; - } - // Stubs - virtual UnicodeString& toPattern(UnicodeString& result, - UBool /*escapeUnprintable*/) const { - return result; - } - virtual UBool matchesIndexValue(uint8_t /*v*/) const { - return FALSE; - } - virtual void addMatchSetTo(UnicodeSet& /*toUnionTo*/) const {} -}; -uint32_t gFilter2ClassID = 0; -class Filter2: public UnicodeFilter{ - virtual UClassID getDynamicClassID() const { return (UClassID)&gFilter2ClassID; } - virtual UnicodeFunctor* clone() const{ - return new Filter2(*this); - } - virtual UBool contains(UChar32 c) const { - if(c == 0x0079 || c == 0x0059 || c == 0x007a || c == 0x005a || c == 0x0061 || c == 0x0063) - return FALSE; - else - return TRUE; - } - // Stubs - virtual UnicodeString& toPattern(UnicodeString& result, - UBool /*escapeUnprintable*/) const { - return result; - } - virtual UBool matchesIndexValue(uint8_t /*v*/) const { - return FALSE; - } - virtual void addMatchSetTo(UnicodeSet& /*toUnionTo*/) const {} -}; - - -void UnicodeFilterLogicTest::TestAll(){ - UParseError parseError; - UErrorCode status = U_ZERO_ERROR; - Transliterator *t1=Transliterator::createInstance("Any-Hex", UTRANS_FORWARD, parseError, status); - if(t1 == 0){ - errln("FAIL: Error in instantiation."); - return; - } - UnicodeString source("abcdABCDyzYZ"); - Filter1 filter1; - Filter2 filter2; - - //sanity testing wihtout any filter - expect(*t1, "without any Filter", source, UnicodeString("\\u0061\\u0062\\u0063\\u0064\\u0041\\u0042\\u0043\\u0044\\u0079\\u007A\\u0059\\u005A", "")); - //sanity testing using the Filter1(acAC) and Filter2(acyzYZ) - t1->adoptFilter(new Filter1); - expect(*t1, "with Filter(acAC)", source, UnicodeString("a\\u0062c\\u0064A\\u0042C\\u0044\\u0079\\u007A\\u0059\\u005A", "")); - t1->adoptFilter(new Filter2); - expect(*t1, "with Filter2(acyzYZ)", source, UnicodeString("a\\u0062c\\u0064\\u0041\\u0042\\u0043\\u0044yzYZ", "")); - - - UnicodeFilter *filterNOT=UnicodeFilterLogic::createNot(&filter1); - UnicodeFilter *filterAND=UnicodeFilterLogic::createAnd(&filter1, &filter2); - UnicodeFilter *filterOR=UnicodeFilterLogic::createOr(&filter1, &filter2); - - TestNOT(*t1, &filter1, "Filter(acAC)", - source, UnicodeString("\\u0061b\\u0063d\\u0041B\\u0043DyzYZ", "")); - TestNOT(*t1, &filter2, "Filter(acyzYZ)", - source, UnicodeString("\\u0061b\\u0063dABCD\\u0079\\u007A\\u0059\\u005A", "")); - TestNOT(*t1, NULL, "NULL", - source, UnicodeString("abcdABCDyzYZ", "")); - TestNOT(*t1, filterNOT, "FilterNOT(Fitler1(acAC))", - source, UnicodeString("a\\u0062c\\u0064A\\u0042C\\u0044\\u0079\\u007A\\u0059\\u005A", "")); - TestNOT(*t1, filterAND, "FilterAND(Fitler1(acAC), Filter2(acyzYZ))", - source, UnicodeString("\\u0061b\\u0063d\\u0041B\\u0043D\\u0079\\u007A\\u0059\\u005A", "")); - TestNOT(*t1, filterOR, "FilterOR(Fitler1(acAC), Filter2(acyzYZ))", - source, UnicodeString("\\u0061b\\u0063dABCDyzYZ", "")); - - TestAND(*t1, &filter1, &filter2, "Filter1(a,c,A,C), Filter2(acyzYZ)", - source, UnicodeString("a\\u0062c\\u0064A\\u0042C\\u0044yzYZ", "")); - TestAND(*t1, &filter2, &filter1, "Filter2(acyzYZ), Filter1(a,c,A,C), ", - source, UnicodeString("a\\u0062c\\u0064A\\u0042C\\u0044yzYZ", "")); - TestAND(*t1, &filter1, NULL, "Filter1(a,c,A,C), NULL", - source, UnicodeString("a\\u0062c\\u0064A\\u0042C\\u0044\\u0079\\u007A\\u0059\\u005A", "")); - TestAND(*t1, NULL, &filter2, "NULL, Filter2(acyzYZ)", - source, UnicodeString("a\\u0062c\\u0064\\u0041\\u0042\\u0043\\u0044yzYZ", "")); - TestAND(*t1, NULL, NULL, "NULL, NULL", - source, UnicodeString("\\u0061\\u0062\\u0063\\u0064\\u0041\\u0042\\u0043\\u0044\\u0079\\u007A\\u0059\\u005A", "")); - TestAND(*t1, filterAND, NULL, "FilterAND(Fitler1(acAC), Filter2(acyzYZ)), NULL", - source, UnicodeString("a\\u0062c\\u0064A\\u0042C\\u0044yzYZ", "")); - TestAND(*t1, filterAND, &filter1, "FilterAND(Fitler1(acAC), Filter2(acyzYZ)), Filter1(acAC)", - source, UnicodeString("a\\u0062c\\u0064A\\u0042C\\u0044yzYZ", "")); - TestAND(*t1, filterAND, &filter2, "FilterAND(Fitler1(acAC), Filter2(acyzYZ)), Filter2(acyzYZ)", - source, UnicodeString("a\\u0062c\\u0064A\\u0042C\\u0044yzYZ", "")); - TestAND(*t1, &filter1, filterAND, "Filter1(acAC), FilterAND(Filter1(acAC), Fitler1(acAC))", - source, UnicodeString("a\\u0062c\\u0064A\\u0042C\\u0044yzYZ", "")); - TestAND(*t1, &filter2, filterAND, "Filter2(acyzYZ), FilterAND(Filter1(acAC), Fitler1(acAC))", - source, UnicodeString("a\\u0062c\\u0064A\\u0042C\\u0044yzYZ", "")); - TestAND(*t1, filterOR, NULL, "FilterOR(Fitler1(acAC), Filter2(acyzYZ)), NULL", - source, UnicodeString("a\\u0062c\\u0064\\u0041\\u0042\\u0043\\u0044\\u0079\\u007A\\u0059\\u005A", "")); - TestAND(*t1, filterOR, &filter1, "FilterOR(Fitler1(acAC), Filter2(acyzYZ)), Fitler1(acAC)", - source, UnicodeString("a\\u0062c\\u0064A\\u0042C\\u0044\\u0079\\u007A\\u0059\\u005A", "")); - TestAND(*t1, filterOR, &filter2, "FilterOR(Fitler1(acAC), Filter2(acyzYZ)), Fitler2(acyzYZ)", - source, UnicodeString("a\\u0062c\\u0064\\u0041\\u0042\\u0043\\u0044yzYZ", "")); - TestAND(*t1, filterNOT, &filter1, "FilterNOT(Fitler1(acAC)), Fitler1(acAC)", - source, UnicodeString("abcdABCDyzYZ", "")); - TestAND(*t1, &filter1, filterNOT, "Fitler1(acAC), FilterNOT(Fitler1(acAC))", - source, UnicodeString("abcdABCDyzYZ", "")); - TestAND(*t1, filterNOT, &filter2, "FilterNOT(Fitler1(acAC)), Fitler2(acyzYZ)", - source, UnicodeString("abcd\\u0041B\\u0043DyzYZ", "")); - TestAND(*t1, &filter2, filterNOT, "Fitler2(acyzYZ), FilterNOT(Fitler1(acAC))", - source, UnicodeString("abcd\\u0041B\\u0043DyzYZ", "")); - - TestOR(*t1, &filter1, &filter2, "Filter1(a,c,A,C), Filter2(acyzYZ)", - source, UnicodeString("a\\u0062c\\u0064\\u0041\\u0042\\u0043\\u0044\\u0079\\u007A\\u0059\\u005A", "")); - TestOR(*t1, &filter2, &filter1, "Filter2(acyzYZ), Filter1(a,c,A,C)", - source, UnicodeString("a\\u0062c\\u0064\\u0041\\u0042\\u0043\\u0044\\u0079\\u007A\\u0059\\u005A", "")); - TestOR(*t1, &filter1, NULL, "Filter1(a,c,A,C), NULL", - source, UnicodeString("a\\u0062c\\u0064A\\u0042C\\u0044\\u0079\\u007A\\u0059\\u005A", "")); - TestOR(*t1, NULL, &filter2, "NULL, Filter2(acyzYZ)", - source, UnicodeString("a\\u0062c\\u0064\\u0041\\u0042\\u0043\\u0044yzYZ", "")); - TestOR(*t1, NULL, NULL, "NULL, NULL", - source, UnicodeString("\\u0061\\u0062\\u0063\\u0064\\u0041\\u0042\\u0043\\u0044\\u0079\\u007A\\u0059\\u005A", "")); - TestOR(*t1, filterAND, NULL, "FilterAND(Fitler1(acAC), Filter2(acyzYZ)), NULL", - source, UnicodeString("a\\u0062c\\u0064A\\u0042C\\u0044yzYZ", "")); - TestOR(*t1, filterAND, &filter1, "FilterAND(Fitler1(acAC), Filter2(acyzYZ)), Filter1(acAC)", - source, UnicodeString("a\\u0062c\\u0064A\\u0042C\\u0044\\u0079\\u007A\\u0059\\u005A", "")); - TestOR(*t1, filterAND, &filter2, "FilterAND(Fitler1(acAC), Filter2(acyzYZ)), Filter2(acyzYZ)", - source, UnicodeString("a\\u0062c\\u0064\\u0041\\u0042\\u0043\\u0044yzYZ", "")); - TestOR(*t1, &filter1, filterAND, "Filter1(acAC), FilterAND(Filter1(acAC), Fitler1(acAC))", - source, UnicodeString("a\\u0062c\\u0064A\\u0042C\\u0044\\u0079\\u007A\\u0059\\u005A", "")); - TestOR(*t1, &filter2, filterAND, "Filter2(acyzYZ), FilterAND(Filter1(acAC), Fitler1(acAC))", - source, UnicodeString("a\\u0062c\\u0064\\u0041\\u0042\\u0043\\u0044yzYZ", "")); - TestOR(*t1, filterNOT, &filter1, "FilterNOT(Fitler1(acAC)), Fitler1(acAC)", - source, UnicodeString("\\u0061\\u0062\\u0063\\u0064\\u0041\\u0042\\u0043\\u0044\\u0079\\u007A\\u0059\\u005A", "")); - TestOR(*t1, &filter1, filterNOT, "Fitler1(acAC), FilterNOT(Fitler1(acAC))", - source, UnicodeString("\\u0061\\u0062\\u0063\\u0064\\u0041\\u0042\\u0043\\u0044\\u0079\\u007A\\u0059\\u005A", "")); - TestOR(*t1, filterNOT, &filter2, "FilterNOT(Fitler1(acAC)), Fitler1(acyzYZ)", - source, UnicodeString("\\u0061\\u0062\\u0063\\u0064\\u0041\\u0042\\u0043\\u0044yzYZ", "")); - TestOR(*t1, &filter2, filterNOT, "Fitler2(acyzYZ), FilterNOT(Fitler1(acAC))", - source, UnicodeString("\\u0061\\u0062\\u0063\\u0064\\u0041\\u0042\\u0043\\u0044yzYZ", "")); - - - delete filterNOT; - delete filterAND; - delete filterOR; - delete t1; - -} -void UnicodeFilterLogicTest::TestNOT(Transliterator& t, - const UnicodeFilter* f1, - const UnicodeString& message, - const UnicodeString& source, - const UnicodeString& expected){ - UnicodeFilter *filter=UnicodeFilterLogic::createNot(f1); - t.adoptFilter(filter); - expect(t, "with FilterNOT(" + message + ")", source, expected); - -} -void UnicodeFilterLogicTest::TestAND(Transliterator& t, - const UnicodeFilter* f1, - const UnicodeFilter* f2, - const UnicodeString& message, - const UnicodeString& source, - const UnicodeString& expected){ - UnicodeFilter *filter=UnicodeFilterLogic::createAnd(f1, f2); - t.adoptFilter(filter); - expect(t, "with FilterAND(" + message + ")", source, expected); - -} -void UnicodeFilterLogicTest::TestOR(Transliterator& t, - const UnicodeFilter* f1, - const UnicodeFilter* f2, - const UnicodeString& message, - const UnicodeString& source, - const UnicodeString& expected){ - UnicodeFilter *filter=UnicodeFilterLogic::createOr(f1, f2); - t.adoptFilter(filter); - expect(t, "with FilterOR(" + message + ")", source, expected); - -} - -void UnicodeFilterLogicTest::expect(const Transliterator& t, - const UnicodeString& message, - const UnicodeString& source, - const UnicodeString& expectedResult) { - - - UnicodeString rsource(source); - t.transliterate(rsource); - expectAux(t.getID() + ":Replaceable " + message, source + "->" + rsource, rsource==expectedResult, expectedResult); - -} -void UnicodeFilterLogicTest::expectAux(const UnicodeString& tag, - const UnicodeString& summary, UBool pass, - const UnicodeString& expectedResult) { - if (pass) { - logln(UnicodeString("(")+tag+") " + prettify(summary)); - } else { - errln(UnicodeString("FAIL: (")+tag+") " - + prettify(summary) - + ", expected " + prettify(expectedResult)); - } -} - -#endif /* #if !UCONFIG_NO_TRANSLITERATION */ diff --git a/icuSources/test/intltest/ufltlgts.h b/icuSources/test/intltest/ufltlgts.h deleted file mode 100644 index a5fe4d1b..00000000 --- a/icuSources/test/intltest/ufltlgts.h +++ /dev/null @@ -1,68 +0,0 @@ -/******************************************************************** - * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and - * others. All Rights Reserved. - ******************************************************************** -************************************************************************ -* Date Name Description -* 03/22/2000 Madhu Creation. -************************************************************************/ - -#ifndef UNIFLTLOGICTST_H -#define UNIFLTLOGICTST_H - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_TRANSLITERATION - -#include "unicode/translit.h" -#include "unicode/unifltlg.h" -#include "intltest.h" - - -/** - * @test - * @summary General test of UnicodeFilterLogic API - */ -class UnicodeFilterLogicTest : public IntlTest { -public: - void runIndexedTest(int32_t index, UBool exec, const char* &name, char* par=NULL); - - /*Tests all the NOT, OR and AND filters */ - void TestAll(void); - - void TestNOT(Transliterator& t, - const UnicodeFilter* f1, - const UnicodeString& message, - const UnicodeString& source, - const UnicodeString& expected); - - void TestAND(Transliterator& t, - const UnicodeFilter* f1, - const UnicodeFilter* f2, - const UnicodeString& message, - const UnicodeString& source, - const UnicodeString& expected); - - void TestOR(Transliterator& t, - const UnicodeFilter* f1, - const UnicodeFilter* f2, - const UnicodeString& message, - const UnicodeString& source, - const UnicodeString& expected); - - //support functions - void expect(const Transliterator& t, - const UnicodeString& message, - const UnicodeString& source, - const UnicodeString& expectedResult); - - void expectAux(const UnicodeString& tag, - const UnicodeString& summary, UBool pass, - const UnicodeString& expectedResult); - -}; - -#endif /* #if !UCONFIG_NO_TRANSLITERATION */ - -#endif diff --git a/icuSources/test/intltest/unhxtrts.cpp b/icuSources/test/intltest/unhxtrts.cpp deleted file mode 100644 index 4d13199e..00000000 --- a/icuSources/test/intltest/unhxtrts.cpp +++ /dev/null @@ -1,515 +0,0 @@ - -/******************************************************************** - * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and - * others. All Rights Reserved. - ********************************************************************/ - -/*********************************************************************** -************************************************************************ -* Date Name Description -* 03/15/2000 Madhu Creation. -************************************************************************/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_TRANSLITERATION - -#include "ittrans.h" -#include "unhxtrts.h" -#include "unicode/utypes.h" -#include "unicode/translit.h" -#include "unicode/unifilt.h" -#include "unicode/uchar.h" -#include "intltest.h" -#include "unitohex.h" -/*converts a Unicodestring to integer*/ -static int32_t getInt(UnicodeString str) -{ - int32_t result = 0; - int32_t len = str.length(); - int32_t i = 0; - for(i=0; i<len; i++) { - result = result*10+u_charDigitValue(str.char32At(i)); - } - return result; -} -//--------------------------------------------- -// runIndexedTest -//--------------------------------------------- - -void UniToHexTransliteratorTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) -{ - if (exec) logln((UnicodeString)"TestSuite UnicodeToHexadecimal Transliterator API "); - switch (index) { - - case 0: name = "TestConstruction"; if (exec) TestConstruction(); break; - case 1: name = "TestCloneEqual"; if (exec) TestCloneEqual(); break; - case 2: name = "TestUpperCase"; if (exec) TestUpperCase(); break; - case 3: name = "TestPattern"; if (exec) TestPattern(); break; - case 4: name = "TestSimpleTransliterate"; if (exec) TestSimpleTransliterate(); break; - case 5: name = "TestTransliterate"; if (exec) TestTransliterate(); break; - default: name = ""; break; /*needed to end loop*/ - } -} - -// This test used to call handleTransliterate. That is a protected -// method that isn't supposed to be called externally. This method is -// a workaround to make it call the correct method. -static void pseudoHandleTransliterate(const Transliterator* t, - Replaceable& text, - UTransPosition& index, - UBool incremental) { - if (incremental) { - UErrorCode status = U_ZERO_ERROR; - t->transliterate(text, index, status); - } else { - t->finishTransliteration(text, index); - } -} - -/** - * Used by TestConstruction() and TestTransliterate. - */ -int32_t gTestUniFilterClassID; -class TestUniFilter : public UnicodeFilter { - virtual UClassID getDynamicClassID() const { return &gTestUniFilterClassID; } - virtual UnicodeFunctor* clone() const { - return new TestUniFilter(*this); - } - virtual UBool contains(UChar32 c) const { - if(c==0x0063 || c==0x0061 || c==0x0043 || c==0x0041) - return FALSE; - else - return TRUE; - } - // Stubs - virtual UnicodeString& toPattern(UnicodeString& result, - UBool /*escapeUnprintable*/) const { - return result; - } - virtual UBool matchesIndexValue(uint8_t /*v*/) const { - return FALSE; - } - virtual void addMatchSetTo(UnicodeSet& /*toUnionTo*/) const {} -}; -void UniToHexTransliteratorTest::TestConstruction(){ - UErrorCode status=U_ZERO_ERROR; - logln("Testing the construction UnicodeToHexTransliterator()"); - UnicodeToHexTransliterator *trans1=new UnicodeToHexTransliterator(); - if(trans1==0){ - errln("UnicodeToHexTransliterator construction failed Error=" + (UnicodeString)u_errorName(status)); - return; - } - delete trans1; - - logln("Testing the cosntruction UnicodeToHexTransliterator(pattern, status)"); - UnicodeString pattern("\\\\U+0000abc"); - trans1=new UnicodeToHexTransliterator(pattern, status); - if(U_FAILURE(status)){ - errln("UnicodeToHexTransliterator construction failed with pattern =" + pattern + " Error=" + (UnicodeString)u_errorName(status)); - status=U_ZERO_ERROR; - return; - } - delete trans1; - - logln("Testing the cosntruction UnicodeToHexTransliterator(pattern, status) with illegal pattern"); - UnicodeString pattern2("\\X+"); - trans1=new UnicodeToHexTransliterator(pattern2, status); - if(U_FAILURE(status)){ - logln("OK: UnicodeToHexTransliterator construction for illegal pattern failed, as expected"); - status=U_ZERO_ERROR; - } else { - errln("Error: calling the UnicodeToHexTransliterator constructor with illegal pattern should fail"); - } - delete trans1; - - logln("Testing the construction UnicodeToHexTransliterator(pattern, isUppercase, adoptedFilter, status)"); - trans1=new UnicodeToHexTransliterator(pattern, FALSE, NULL, status); - if(U_FAILURE(status)){ - errln("UnicodeToHexTransliterator construction failed. Error=" + (UnicodeString)u_errorName(status)); - status=U_ZERO_ERROR; - return; - } - logln("Testing the copy construction"); - UnicodeToHexTransliterator *trans1copy=new UnicodeToHexTransliterator(*trans1); - if(trans1->toPattern() != trans1copy->toPattern() || trans1->isUppercase() != trans1copy->isUppercase() || - trans1->getID() != trans1copy->getID()){ - errln("Copy construction failed"); - } - delete trans1copy; - delete trans1; - - logln("Testing the construction UnicodeToHexTransliterator(pattern, isUppercase, adoptedFilter, status)"); - trans1=new UnicodeToHexTransliterator(pattern, TRUE, new TestUniFilter, status); - if(U_FAILURE(status)){ - errln("UnicodeToHexTransliterator construction failed Error=" + (UnicodeString)u_errorName(status)); - status=U_ZERO_ERROR; - return; - } - logln("Testing the copy construction"); - trans1copy=new UnicodeToHexTransliterator(*trans1); - if(trans1->toPattern() != trans1copy->toPattern() || trans1->isUppercase() != trans1copy->isUppercase() || - trans1->getID() != trans1copy->getID() || - trans1->getFilter() == NULL || trans1copy->getFilter() == NULL ){ - errln("Copy construction failed"); - } - delete trans1copy; - delete trans1; - - - -} - -void UniToHexTransliteratorTest::TestCloneEqual(){ - UErrorCode status=U_ZERO_ERROR; - UnicodeToHexTransliterator *transdefault=new UnicodeToHexTransliterator(); - UnicodeString pattern1("\\U##00"); - UnicodeString pattern2("\\\\uni0000"); - UnicodeToHexTransliterator *trans1=new UnicodeToHexTransliterator(pattern1, status); - if(U_FAILURE(status) && status==U_ILLEGAL_ARGUMENT_ERROR){ - errln("UnicodeToHexTransliterator construction failed"); - status=U_ZERO_ERROR; - return; - } - UnicodeToHexTransliterator *trans2=new UnicodeToHexTransliterator(pattern2, status); - if(U_FAILURE(status) && status==U_ILLEGAL_ARGUMENT_ERROR){ - errln("UnicodeToHexTransliterator construction failed"); - status=U_ZERO_ERROR; - return; - } - - logln("Testing the clone() API of the UnicodeToHexTransliterator"); - UnicodeToHexTransliterator *transdefaultclone=(UnicodeToHexTransliterator*)transdefault->clone(); - UnicodeToHexTransliterator *trans1clone=(UnicodeToHexTransliterator*)trans1->clone(); - UnicodeToHexTransliterator *trans2clone=(UnicodeToHexTransliterator*)trans2->clone(); - if(transdefault->toPattern() != transdefaultclone->toPattern() || - transdefault->isUppercase() != transdefaultclone->isUppercase() || - trans1->toPattern() != trans1clone->toPattern() || - trans1->isUppercase() != trans1clone->isUppercase() || - trans2->toPattern() != trans2clone->toPattern() || - trans2->isUppercase() != trans2clone->isUppercase() || - transdefault->toPattern() == trans1->toPattern() || - trans1->toPattern() == trans2clone->toPattern() || - trans2->toPattern() == transdefault->toPattern() ) { - errln("Error: clone() failed"); - } - - - logln("Testing the =operator of the UnicodeToHexTransliterator"); - UnicodeToHexTransliterator *transdefaultequal=new UnicodeToHexTransliterator(); - UnicodeToHexTransliterator *trans1equal=new UnicodeToHexTransliterator(); - UnicodeToHexTransliterator *trans2equal=new UnicodeToHexTransliterator(); - *transdefaultequal=*transdefault; - *trans1equal=*trans1; - *trans2equal=*trans2; - - if(transdefault->toPattern() != transdefaultequal->toPattern() || - transdefault->isUppercase() != transdefaultequal->isUppercase() || - trans1->toPattern() != trans1equal->toPattern() || - trans1->isUppercase() != trans1equal->isUppercase() || - trans2->toPattern() != trans2equal->toPattern() || - trans2->isUppercase() != trans2equal->isUppercase() || - transdefault->toPattern() == trans1->toPattern() || - trans1->toPattern() == trans2equal->toPattern() || - trans2->toPattern() == transdefault->toPattern() ) { - errln("Error: equal() failed"); - } - if(transdefaultclone->toPattern() != transdefaultequal->toPattern() || - transdefaultclone->isUppercase() != transdefaultequal->isUppercase() || - trans1equal->toPattern() != trans1clone->toPattern() || - trans1equal->isUppercase() != trans1clone->isUppercase() || - trans2clone->toPattern() != trans2equal->toPattern() || - trans2clone->isUppercase() != trans2equal->isUppercase() ) { - errln("Error: equal() or clone() failed"); - } - delete transdefaultclone; - delete trans1clone; - delete trans2clone; - delete transdefaultequal; - delete trans1equal; - delete trans2equal; - delete transdefault; - delete trans1; - delete trans2; -} - -void UniToHexTransliteratorTest::TestUpperCase(){ - logln("Testing the isUppercase() and setUppercase() API of UnicodeToHexTransliterator"); - UErrorCode status = U_ZERO_ERROR; - UnicodeString str("abk"); - /*default transliterator has upper case TRUE*/ - UnicodeToHexTransliterator *transdefault=new UnicodeToHexTransliterator(); - if(transdefault == 0){ - errln("UnicodeToHexTransliterator construction failed"); - return; - } - expect(*transdefault, "where uppercase=default", str, UnicodeString("\\u0061\\u0062\\u006B", "")); - - UnicodeString pattern("\\\\u0000", ""); - /*transliterator with Uppercase FALSE*/ - UnicodeToHexTransliterator *trans1=new UnicodeToHexTransliterator(pattern, FALSE, NULL, status); - if(U_FAILURE(status) && status==U_ILLEGAL_ARGUMENT_ERROR){ - errln("UnicodeToHexTransliterator construction failed with pattern =" + pattern); - status=U_ZERO_ERROR; - return; - } - expect(*trans1, "where uppercase=FALSE", str, UnicodeString("\\u0061\\u0062\\u006b", "")); /*doesn't display uppercase*/ - - if(transdefault->isUppercase() != TRUE || trans1->isUppercase() != FALSE ){ - errln("isUpperCase() failed"); - } - /*changing the outputhexdigits to lower case for the default transliterator*/ - transdefault->setUppercase(trans1->isUppercase()); - if(transdefault->isUppercase() != trans1->isUppercase() || transdefault->isUppercase() != FALSE){ - errln("setUppercase() failed"); - } - /*doesn't ouput uppercase hex, since transdefault's uppercase is set to FALSE using setUppercase*/ - expect(*transdefault, "where uppercase=FALSE", str, UnicodeString("\\u0061\\u0062\\u006b", "")); - - /*trying round trip*/ - transdefault->setUppercase(TRUE); - if(transdefault->isUppercase() != TRUE || transdefault->isUppercase() == trans1->isUppercase() ){ - errln("setUppercase() failed"); - } - /*displays upper case since it is set to TRUE*/ - expect(*transdefault, "where uppercase=TRUE", str, UnicodeString("\\u0061\\u0062\\u006B", "")); - - delete transdefault; - delete trans1; - -} -void UniToHexTransliteratorTest::TestPattern(){ - logln("Testing the applyPattern() and toPattern() API of UnicodeToHexTransliterator"); - UErrorCode status = U_ZERO_ERROR; - /*default transliterator has pattern \\u0000*/ - UnicodeToHexTransliterator *transdefault=new UnicodeToHexTransliterator(); - if(transdefault == 0){ - errln("UnicodeToHexTransliterator construction failed"); - return; - } - UnicodeString defaultpattern=transdefault->toPattern(); - - UnicodeString pattern1("\\\\U+0000", ""); - UnicodeToHexTransliterator *trans1=new UnicodeToHexTransliterator(pattern1, TRUE, NULL, status); - if(U_FAILURE(status) && status==U_ILLEGAL_ARGUMENT_ERROR){ - errln("UnicodeToHexTransliterator construction failed with pattern =" + pattern1); - status=U_ZERO_ERROR; - return; - } - /*test toPattern() */ - if(transdefault->toPattern() == trans1->toPattern() || - transdefault->toPattern() != UnicodeString("\\\\u0000", "") || - trans1->toPattern() != pattern1 ){ - errln("Error: toPattern() failed"); - } - - /*apply patterns for transdefault*/ - UnicodeString str("abKf"); - expectPattern(*transdefault, pattern1, str, UnicodeString("\\U+0061\\U+0062\\U+004B\\U+0066", "")); - expectPattern(*transdefault, UnicodeString("\\U##00,", ""), str, UnicodeString("U61,U62,U4B,U66,", "")); - expectPattern(*transdefault, defaultpattern, str, UnicodeString("\\u0061\\u0062\\u004B\\u0066", "")); - expectPattern(*trans1, UnicodeString("\\uni0000", ""), str, UnicodeString("uni0061uni0062uni004Buni0066", "")); - expectPattern(*trans1, UnicodeString("\\\\S-0000-E", ""), str, UnicodeString("\\S-0061-E\\S-0062-E\\S-004B-E\\S-0066-E", "")); - expectPattern(*trans1, UnicodeString("\\u##0000", ""), str, UnicodeString("FAIL", "")); - expectPattern(*trans1, UnicodeString("\\*0000", ""), str, UnicodeString("*0061*0062*004B*0066", "")); - expectPattern(*trans1, UnicodeString("\\u####", ""), str, UnicodeString("FAIL", "")); - - delete trans1; - delete transdefault; - -} -void UniToHexTransliteratorTest::TestSimpleTransliterate(){ - UErrorCode status=U_ZERO_ERROR; - UnicodeString pattern1("\\\\U+0000", ""); - UnicodeToHexTransliterator *trans1=new UnicodeToHexTransliterator(pattern1, TRUE, NULL, status); - if(U_FAILURE(status) && status==U_ILLEGAL_ARGUMENT_ERROR){ - errln("UnicodeToHexTransliterator construction failed with pattern =" + pattern1); - status=U_ZERO_ERROR; - return; - } - UTransPosition index={1,5,2,5}; - UnicodeString source("Hello"); - UnicodeString rsource(source); - UnicodeString expected("He\\U+006C\\U+006C\\U+006F", ""); - pseudoHandleTransliterate(trans1, rsource, index, FALSE); - expectAux(trans1->getID() + ":handleTransliterator ", source + "-->" + rsource, rsource==expected, expected); - delete trans1; -} - -void UniToHexTransliteratorTest::TestTransliterate(){ - UErrorCode status=U_ZERO_ERROR; - UnicodeString Data[]={ - //pattern, source, index.contextStart, index.contextLimit, index.start, expectedResult, expectedResult using filter(a, b) - UnicodeString("U+##00", ""), UnicodeString("abc", ""), "1", "3", "2", UnicodeString("abU+63", ""), UnicodeString("abc", ""), - UnicodeString("\\\\u0000", ""), UnicodeString("abc", ""), "1", "2", "1", UnicodeString("a\\u0062c", ""), UnicodeString("a\\u0062c", ""), - UnicodeString("Uni0000", ""), UnicodeString("abc", ""), "1", "3", "2", UnicodeString("abUni0063", ""), UnicodeString("abc", ""), - UnicodeString("U[0000]", ""), UnicodeString("hello", ""), "0", "4", "2", UnicodeString("heU[006C]U[006C]o", ""), UnicodeString("heU[006C]U[006C]o", ""), - UnicodeString("prefix-0000-suffix", ""), UnicodeString("abc", ""), "1", "3", "1", UnicodeString("aprefix-0062-suffixprefix-0063-suffix", ""), UnicodeString("aprefix-0062-suffixc", ""), - UnicodeString("*##00*", ""), UnicodeString("hellothere", ""), "1", "8", "4", UnicodeString("hell*6F**74**68**65*re", ""), UnicodeString("hell*6F**74**68**65*re", ""), - - }; - uint32_t i; - for(i=0;i<sizeof(Data)/sizeof(Data[0]);i=i+7){ - UnicodeToHexTransliterator *trans1=new UnicodeToHexTransliterator(Data[i+0], TRUE, NULL, status); - if(U_FAILURE(status)){ - errln("UnicodeToHexTransliterator construction failed with pattern =" + Data[i+0]); - status=U_ZERO_ERROR; - continue; - } - expectTranslit(*trans1, "", Data[i+1], getInt(Data[i+2]), getInt(Data[i+3]), getInt(Data[i+4]), Data[i+5] ); - delete trans1; - UnicodeToHexTransliterator *trans2=new UnicodeToHexTransliterator(Data[i+0], TRUE, new TestUniFilter, status); - if(U_FAILURE(status)){ - errln("UnicodeToHexTransliterator construction failed with pattern=" + Data[i+0] + "with filter(a,c)" ); - status=U_ZERO_ERROR; - continue; - } - expectTranslit(*trans2, " with filter(a,A,c,C)", Data[i+1], getInt(Data[i+2]), getInt(Data[i+3]), getInt(Data[i+4]), Data[i+6] ); - delete trans2; - - } - - - -} - -//====================================================================== -// Support methods -//====================================================================== - -void UniToHexTransliteratorTest::expectTranslit(const UnicodeToHexTransliterator& t, - const UnicodeString& message, - const UnicodeString& source, - int32_t start, int32_t limit, int32_t cursor, - const UnicodeString& expectedResult){ - - - UTransPosition _index; - _index.contextStart=start; - _index.contextLimit= limit; - _index.start = cursor; - _index.limit = limit; - UTransPosition index = _index; - UnicodeString rsource(source); - pseudoHandleTransliterate(&t, rsource, index, FALSE); - expectAux(t.getID() + ":handleTransliterator(increment=FALSE) " + message, source + "-->" + rsource, rsource==expectedResult, expectedResult); - - UnicodeString rsource2(source); - index=_index; - pseudoHandleTransliterate(&t, rsource2, index, TRUE); - expectAux(t.getID() + ":handleTransliterator(increment=TRUE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult); - - /*ceates a copy constructor and checks the transliteration*/ - UnicodeToHexTransliterator *copy=new UnicodeToHexTransliterator(t); - rsource2.remove(); - rsource2.append(source); - index=_index; - pseudoHandleTransliterate(copy, rsource2, index, FALSE); - expectAux(t.getID() + "COPY:handleTransliterator(increment=FALSE) " + message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult); - - rsource2.remove(); - rsource2.append(source); - index=_index; - pseudoHandleTransliterate(copy, rsource2, index, TRUE); - expectAux(t.getID() + "COPY:handleTransliterator(increment=TRUE) " + message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult); - delete copy; - - /*creates a clone and tests transliteration*/ - UnicodeToHexTransliterator *clone=(UnicodeToHexTransliterator*)t.clone(); - rsource2.remove(); - rsource2.append(source); - index=_index; - pseudoHandleTransliterate(clone, rsource2, index, FALSE); - expectAux(t.getID() + "CLONE:handleTransliterator(increment=FALSE) "+ message,source + "-->" + rsource2, rsource2==expectedResult, expectedResult); - - rsource2.remove(); - rsource2.append(source); - index=_index; - pseudoHandleTransliterate(clone, rsource2, index, TRUE); - expectAux(t.getID() + "CLONE:handleTransliterator(increment=TRUE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult); - delete clone; - - /*Uses the assignment operator to create a transliterator and tests transliteration*/ - UnicodeToHexTransliterator equal=t; - rsource2.remove(); - rsource2.append(source); - index=_index; - pseudoHandleTransliterate(&equal, rsource2, index, FALSE); - expectAux(t.getID() + "=OPERATOR:handleTransliterator(increment=FALSE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult); - - rsource2.remove(); - rsource2.append(source); - index=_index; - pseudoHandleTransliterate(&equal, rsource2, index, TRUE); - expectAux(t.getID() + "=OPERATOR:handleTransliterator(increment=TRUE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult); - - - - - -} -void UniToHexTransliteratorTest::expectPattern(UnicodeToHexTransliterator& t, - const UnicodeString& pattern, - const UnicodeString& source, - const UnicodeString& expectedResult){ - - UErrorCode status=U_ZERO_ERROR; - t.applyPattern(pattern, status); - if(expectedResult == "FAIL"){ - if(U_FAILURE(status)){ - logln("OK: calling applyPattern() with illegal pattern failed as expected. Error=" + (UnicodeString)u_errorName(status)); - status=U_ZERO_ERROR; - return; - } - } - else{ - if(U_FAILURE(status)){ - errln("Error: applyPattern() failed with pattern =" + pattern + "--->" + (UnicodeString)u_errorName(status)); - return; - }else { - if(t.toPattern() != pattern) { - errln("Error: applyPattern or toPatten failed. Expected: " + pattern + "Got: " + t.toPattern()); - } - else{ - logln("OK: applyPattern passed. Testing transliteration"); - expect(t, (UnicodeString)" with pattern "+pattern, source, expectedResult); - } - } - } - -} -void UniToHexTransliteratorTest::expect(const UnicodeToHexTransliterator& t, - const UnicodeString& message, - const UnicodeString& source, - const UnicodeString& expectedResult) { - - UnicodeString rsource(source); - t.transliterate(rsource); - expectAux(t.getID() + ":Replaceable " + message, source + "->" + rsource, rsource==expectedResult, expectedResult); - - // Test handleTransliterate (incremental) transliteration -- - rsource.remove(); - rsource.append(source); - UTransPosition index; - index.contextStart=0; - index.contextLimit = source.length(); - index.start =0; - index.limit=source.length(); - pseudoHandleTransliterate(&t, rsource, index, TRUE); - expectAux(t.getID() + ":handleTransliterate " + message, source + "->" + rsource, rsource==expectedResult, expectedResult); - -} -void UniToHexTransliteratorTest::expectAux(const UnicodeString& tag, - const UnicodeString& summary, UBool pass, - const UnicodeString& expectedResult) { - if (pass) { - logln(UnicodeString("(")+tag+") " + prettify(summary)); - } else { - errln(UnicodeString("FAIL: (")+tag+") " - + prettify(summary) - + ", expected " + prettify(expectedResult)); - } -} - -#endif /* #if !UCONFIG_NO_TRANSLITERATION */ diff --git a/icuSources/test/intltest/unhxtrts.h b/icuSources/test/intltest/unhxtrts.h deleted file mode 100644 index 12721874..00000000 --- a/icuSources/test/intltest/unhxtrts.h +++ /dev/null @@ -1,71 +0,0 @@ -/******************************************************************** - * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and - * others. All Rights Reserved. - ******************************************************************** -************************************************************************ -* Date Name Description -* 03/15/2000 Madhu Creation. -************************************************************************/ - -#ifndef UNITOHEXTRTST_H -#define UNITOHEXTRTST_H - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_TRANSLITERATION - -#include "unicode/translit.h" -#include "unitohex.h" -#include "intltest.h" - -/** - * @test - * @summary General test of UnicodeToHexadecimal Transliterator - */ -class UniToHexTransliteratorTest : public IntlTest { -public: - void runIndexedTest(int32_t index, UBool exec, const char* &name, char* par=NULL); - - /*Tests the constructors */ - void TestConstruction(void); - /*Tests the function clone, and operator==()*/ - void TestCloneEqual(void); - /*Tests the function isUppercase and setUppercase()*/ - void TestUpperCase(void); - /*Tests the function getTransliterator() and setTransliterators() and adoptTransliterators()*/ - void TestPattern(void); - /*Tests the function handleTransliterate()*/ - void TestSimpleTransliterate(); - /*Tests the function handleTransliterate()*/ - void TestTransliterate(); - - //====================================================================== - // Support methods - //====================================================================== - void expectTranslit(const UnicodeToHexTransliterator& t, - const UnicodeString& message, - const UnicodeString& source, - int32_t start, int32_t limit, int32_t cursor, - const UnicodeString& expectedResult); - - void expectPattern(UnicodeToHexTransliterator& t, - const UnicodeString& pattern, - const UnicodeString& source, - const UnicodeString& expectedResult); - - void expect(const UnicodeToHexTransliterator& t, - const UnicodeString& message, - const UnicodeString& source, - const UnicodeString& expectedResult); - - void expectAux(const UnicodeString& tag, - const UnicodeString& summary, UBool pass, - const UnicodeString& expectedResult); - - -}; - -#endif /* #if !UCONFIG_NO_TRANSLITERATION */ - -#endif diff --git a/icuSources/test/intltest/uobjtest.cpp b/icuSources/test/intltest/uobjtest.cpp index 8607c025..8354871c 100644 --- a/icuSources/test/intltest/uobjtest.cpp +++ b/icuSources/test/intltest/uobjtest.cpp @@ -1,11 +1,13 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 2002-2003, International Business Machines Corporation and + * Copyright (c) 2002-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ #include "uobjtest.h" +#include "cmemory.h" // UAlignedMemory #include <string.h> +#include <stdio.h> /** * @@ -41,8 +43,8 @@ const char *ids_class[MAX_CLASS_ID]; uint32_t ids_count = 0; UObject *UObjectTest::testClass(UObject *obj, - const char *className, const char *factory, - UClassID staticID) + const char *className, const char *factory, + UClassID staticID) { uint32_t i; UnicodeString what = UnicodeString(className) + " * x= " + UnicodeString(factory?factory:" ABSTRACT ") + "; "; @@ -92,11 +94,11 @@ UObject *UObjectTest::testClass(UObject *obj, for(i=0;i<ids_count;i++) { if(staticID == ids[i]) { if(!strcmp(ids_class[i], className)) { - logln("OK: ID found is the same as " + UnicodeString(ids_class[i]) + UnicodeString(" *y= ") + ids_factory[i] + what); - return obj; + logln("OK: ID found is the same as " + UnicodeString(ids_class[i]) + UnicodeString(" *y= ") + ids_factory[i] + what); + return obj; } else { - errln("FAIL: ID is the same as " + UnicodeString(ids_class[i]) + UnicodeString(" *y= ") + ids_factory[i] + what); - return obj; + errln("FAIL: ID is the same as " + UnicodeString(ids_class[i]) + UnicodeString(" *y= ") + ids_factory[i] + what); + return obj; } } } @@ -128,8 +130,6 @@ UObject *UObjectTest::testClass(UObject *obj, #include "cpdtrans.h" #include "rbt.h" #include "rbt_data.h" -#include "hextouni.h" -#include "unitohex.h" #include "nultrans.h" #include "anytrans.h" #include "digitlst.h" @@ -150,6 +150,7 @@ UObject *UObjectTest::testClass(UObject *obj, #include "unesctrn.h" #include "uni2name.h" #include "uvector.h" +#include "islamcal.h" // External Things #include "unicode/brkiter.h" @@ -235,6 +236,7 @@ void UObjectTest::testIDs() TESTCLASSID_DEFAULT(FieldPosition); TESTCLASSID_DEFAULT(Formattable); TESTCLASSID_CTOR(GregorianCalendar, (status)); + TESTCLASSID_CTOR(IslamicCalendar, (Locale::getUS(), status)); #endif #if !UCONFIG_NO_BREAK_ITERATION @@ -250,8 +252,6 @@ void UObjectTest::testIDs() #if !UCONFIG_NO_TRANSLITERATION - TESTCLASSID_DEFAULT(HexToUnicodeTransliterator); - TESTCLASSID_DEFAULT(UnicodeToHexTransliterator); TESTCLASSID_TRANSLIT(AnyTransliterator, "Any-Latin"); TESTCLASSID_TRANSLIT(CompoundTransliterator, "Latin-Greek"); TESTCLASSID_TRANSLIT(EscapeTransliterator, "Any-Hex"); @@ -295,6 +295,7 @@ void UObjectTest::testIDs() //TESTCLASSID_DEFAULT(TempSearch); //TESTCLASSID_DEFAULT(TestMultipleKeyStringFactory); //TESTCLASSID_DEFAULT(TestReplaceable); + #if !UCONFIG_NO_FORMATTING TESTCLASSID_ABSTRACT(TimeZone); #endif @@ -340,6 +341,59 @@ void UObjectTest::testIDs() #endif } +void UObjectTest::testUMemory() { + // additional tests for code coverage +#if U_OVERRIDE_CXX_ALLOCATION && U_HAVE_PLACEMENT_NEW + UAlignedMemory stackMemory[sizeof(UnicodeString)/sizeof(UAlignedMemory)+1]; + UnicodeString *p; + enum { len=20 }; + + p=new(stackMemory) UnicodeString(len, (UChar32)0x20ac, len); + if((void *)p!=(void *)stackMemory) { + errln("placement new did not place the object at the expected address"); + } + if(p->length()!=len || p->charAt(0)!=0x20ac || p->charAt(len-1)!=0x20ac) { + errln("constructor used with placement new did not work right"); + } + + /* + * It is not possible to simply say + * delete(p, stackMemory); + * which results in a call to the normal, non-placement delete operator. + * + * Via a search on google.com for "c++ placement delete" I found + * http://cpptips.hyperformix.com/cpptips/placement_del3 + * which says: + * + * TITLE: using placement delete + * + * (Newsgroups: comp.std.c++, 27 Aug 97) + * + * ISJ: isj@image.dk + * + * > I do not completely understand how placement works on operator delete. + * > ... + * There is no delete-expression which will invoke a placement + * form of operator delete. You can still call the function + * explicitly. Example: + * ... + * // destroy object and delete space manually + * p->~T(); + * operator delete(p, 12); + * + * ... so that's what I am doing here. + * markus 20031216 + */ + // destroy object and delete space manually + p->~UnicodeString(); + UnicodeString::operator delete(p, stackMemory); +#endif + + // try to call the compiler-generated UMemory::operator=(class UMemory const &) + UMemory m, n; + m=n; +} + /* --------------- */ #define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); logln((UnicodeString)""); test(); } break; @@ -350,6 +404,7 @@ void UObjectTest::runIndexedTest( int32_t index, UBool exec, const char* &name, switch (index) { CASE(0, testIDs); + CASE(1, testUMemory); default: name = ""; break; //needed to end loop } diff --git a/icuSources/test/intltest/uobjtest.h b/icuSources/test/intltest/uobjtest.h index 652e9900..13add61b 100644 --- a/icuSources/test/intltest/uobjtest.h +++ b/icuSources/test/intltest/uobjtest.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 2002, International Business Machines Corporation and + * Copyright (c) 2002-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -16,12 +16,13 @@ class UObjectTest : public IntlTest { // IntlTest override void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par ); - private: +private: // tests void testIDs(); - + void testUMemory(); + //helper - + /** * @param obj The UObject to be tested * @param className The name of the class being tested @@ -30,11 +31,11 @@ class UObjectTest : public IntlTest { * @return Returns obj, suitable for deletion */ UObject *testClass(UObject *obj, - const char *className, const char *factory, - UClassID staticID); - - + const char *className, const char *factory, + UClassID staticID); + + }; - + #endif //eof diff --git a/icuSources/test/intltest/usettest.cpp b/icuSources/test/intltest/usettest.cpp index 8acedd34..7e7cc9bd 100644 --- a/icuSources/test/intltest/usettest.cpp +++ b/icuSources/test/intltest/usettest.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2003 Alan Liu ,International Business Machines Corporation and +* Copyright (C) 1999-2004 Alan Liu ,International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -15,6 +15,9 @@ #include "unicode/uchar.h" #include "unicode/usetiter.h" #include "unicode/ustring.h" +#include "unicode/parsepos.h" +#include "unicode/symtable.h" +#include "hash.h" UnicodeString operator+(const UnicodeString& left, const UnicodeSet& set) { UnicodeString pat; @@ -49,15 +52,18 @@ UnicodeSetTest::runIndexedTest(int32_t index, UBool exec, CASE(10,TestToPattern); CASE(11,TestIndexOf); CASE(12,TestStrings); - CASE(13,TestStringPatterns); - CASE(14,Testj2268); - CASE(15,TestCloseOver); - CASE(16,TestEscapePattern); - CASE(17,TestInvalidCodePoint); + CASE(13,Testj2268); + CASE(14,TestCloseOver); + CASE(15,TestEscapePattern); + CASE(16,TestInvalidCodePoint); + CASE(17,TestSymbolTable); + CASE(18,TestSurrogate); default: name = ""; break; } } +static const char NOT[] = "%%%%"; + /** * UVector was improperly copying contents * This code will crash this is still true @@ -71,42 +77,97 @@ void UnicodeSetTest::Testj2268() { } /** - * Test that toPattern() round trips with syntax characters and - * whitespace. + * Test toPattern(). */ void UnicodeSetTest::TestToPattern() { - static const char* OTHER_TOPATTERN_TESTS[] = { - "[[:latin:]&[:greek:]]", - "[[:latin:]-[:greek:]]", - "[:nonspacing mark:]", - NULL - }; - - for (int32_t j=0; OTHER_TOPATTERN_TESTS[j]!=NULL; ++j) { - UErrorCode ec = U_ZERO_ERROR; - UnicodeSet s(OTHER_TOPATTERN_TESTS[j], ec); - if (U_FAILURE(ec)) { - errln((UnicodeString)"FAIL: bad pattern " + OTHER_TOPATTERN_TESTS[j]); - continue; - } - checkPat(OTHER_TOPATTERN_TESTS[j], s); - } - - for (UChar32 i = 0; i <= 0x10FFFF; ++i) { - if ((i <= 0xFF && !u_isalpha(i)) || u_isspace(i)) { + UErrorCode ec = U_ZERO_ERROR; - // check various combinations to make sure they all work. - if (i != 0 && !toPatternAux(i, i)){ - continue; - } - if (!toPatternAux(0, i)){ + // Test that toPattern() round trips with syntax characters and + // whitespace. + { + static const char* OTHER_TOPATTERN_TESTS[] = { + "[[:latin:]&[:greek:]]", + "[[:latin:]-[:greek:]]", + "[:nonspacing mark:]", + NULL + }; + + for (int32_t j=0; OTHER_TOPATTERN_TESTS[j]!=NULL; ++j) { + ec = U_ZERO_ERROR; + UnicodeSet s(OTHER_TOPATTERN_TESTS[j], ec); + if (U_FAILURE(ec)) { + errln((UnicodeString)"FAIL: bad pattern " + OTHER_TOPATTERN_TESTS[j]); continue; } - if (!toPatternAux(i, 0xFFFF)){ - continue; + checkPat(OTHER_TOPATTERN_TESTS[j], s); + } + + for (UChar32 i = 0; i <= 0x10FFFF; ++i) { + if ((i <= 0xFF && !u_isalpha(i)) || u_isspace(i)) { + + // check various combinations to make sure they all work. + if (i != 0 && !toPatternAux(i, i)){ + continue; + } + if (!toPatternAux(0, i)){ + continue; + } + if (!toPatternAux(i, 0xFFFF)){ + continue; + } } } } + + // Test pattern behavior of multicharacter strings. + { + ec = U_ZERO_ERROR; + UnicodeSet* s = new UnicodeSet("[a-z {aa} {ab}]", ec); + + // This loop isn't a loop. It's here to make the compiler happy. + // If you're curious, try removing it and changing the 'break' + // statements (except for the last) to goto's. + for (;;) { + if (U_FAILURE(ec)) break; + const char* exp1[] = {"aa", "ab", NOT, "ac", NULL}; + expectToPattern(*s, "[a-z{aa}{ab}]", exp1); + + s->add("ac"); + const char* exp2[] = {"aa", "ab", "ac", NOT, "xy", NULL}; + expectToPattern(*s, "[a-z{aa}{ab}{ac}]", exp2); + + s->applyPattern("[a-z {\\{l} {r\\}}]", ec); + if (U_FAILURE(ec)) break; + const char* exp3[] = {"{l", "r}", NOT, "xy", NULL}; + expectToPattern(*s, "[a-z{r\\}}{\\{l}]", exp3); + + s->add("[]"); + const char* exp4[] = {"{l", "r}", "[]", NOT, "xy", NULL}; + expectToPattern(*s, "[a-z{\\[\\]}{r\\}}{\\{l}]", exp4); + + s->applyPattern("[a-z {\\u4E01\\u4E02}{\\n\\r}]", ec); + if (U_FAILURE(ec)) break; + const char* exp5[] = {"\\u4E01\\u4E02", "\n\r", NULL}; + expectToPattern(*s, "[a-z{\\u000A\\u000D}{\\u4E01\\u4E02}]", exp5); + + // j2189 + s->clear(); + s->add(UnicodeString("abc", "")); + s->add(UnicodeString("abc", "")); + const char* exp6[] = {"abc", NOT, "ab", NULL}; + expectToPattern(*s, "[{abc}]", exp6); + + break; + } + + if (U_FAILURE(ec)) errln("FAIL: pattern parse error"); + delete s; + } + + // JB#3400: For 2 character ranges prefer [ab] to [a-b] + UnicodeSet s; + s.add((UChar)97, (UChar)98); // 'a', 'b' + expectToPattern(s, "[ab]", NULL); } UBool UnicodeSetTest::toPatternAux(UChar32 start, UChar32 end) { @@ -293,6 +354,9 @@ UnicodeSetTest::TestAddRemove(void) { UnicodeSet set; // Construct empty set doAssert(set.isEmpty() == TRUE, "set should be empty"); doAssert(set.size() == 0, "size should be 0"); + set.complement(); + doAssert(set.size() == 0x110000, "size should be 0x110000"); + set.clear(); set.add(0x0061, 0x007a); expectPairs(set, "az"); doAssert(set.isEmpty() == FALSE, "set should not be empty"); @@ -482,7 +546,8 @@ void UnicodeSetTest::TestAPI() { logln((UnicodeString)"a [3-10]: " + a); logln((UnicodeString)"b [7-15]: " + b); - c = a; c.addAll(b); + c = a; + c.addAll(b); UnicodeSet exp((UChar32)3,(UChar32)15); if (c == exp) { logln((UnicodeString)"c.set(a).add(b): " + c); @@ -504,7 +569,8 @@ void UnicodeSetTest::TestAPI() { } else { errln((UnicodeString)"FAIL: c.complement() = " + c + ", expect " + exp); } - c = a; c.complementAll(b); + c = a; + c.complementAll(b); exp.set((UChar32)3,(UChar32)6); exp.add((UChar32)11,(UChar32) 15); if (c == exp) { @@ -637,55 +703,6 @@ void UnicodeSetTest::TestStrings() { } } -static const char NOT[] = "%%%%"; - -/** - * Test pattern behavior of multicharacter strings. - */ -void UnicodeSetTest::TestStringPatterns() { - UErrorCode ec = U_ZERO_ERROR; - UnicodeSet* s = new UnicodeSet("[a-z {aa} {ab}]", ec); - - // This loop isn't a loop. It's here to make the compiler happy. - // If you're curious, try removing it and changing the 'break' - // statements (except for the last) to goto's. - for (;;) { - if (U_FAILURE(ec)) break; - const char* exp1[] = {"aa", "ab", NOT, "ac", NULL}; - expectToPattern(*s, "[a-z{aa}{ab}]", exp1); - - s->add("ac"); - const char* exp2[] = {"aa", "ab", "ac", NOT, "xy", NULL}; - expectToPattern(*s, "[a-z{aa}{ab}{ac}]", exp2); - - s->applyPattern("[a-z {\\{l} {r\\}}]", ec); - if (U_FAILURE(ec)) break; - const char* exp3[] = {"{l", "r}", NOT, "xy", NULL}; - expectToPattern(*s, "[a-z{\\{l}{r\\}}]", exp3); - - s->add("[]"); - const char* exp4[] = {"{l", "r}", "[]", NOT, "xy", NULL}; - expectToPattern(*s, "[a-z{\\[\\]}{r\\}}{\\{l}]", exp4); - - s->applyPattern("[a-z {\\u4E01\\u4E02}{\\n\\r}]", ec); - if (U_FAILURE(ec)) break; - const char* exp5[] = {"\\u4E01\\u4E02", "\n\r", NULL}; - expectToPattern(*s, "[a-z{\\u4E01\\u4E02}{\\n\\r}]", exp5); - - // j2189 - s->clear(); - s->add(UnicodeString("abc", "")); - s->add(UnicodeString("abc", "")); - const char* exp6[] = {"abc", NOT, "ab", NULL}; - expectToPattern(*s, "[{abc}]", exp6); - - break; - } - - if (U_FAILURE(ec)) errln("FAIL: pattern parse error"); - delete s; -} - /** * Test the [:Latin:] syntax. */ @@ -743,8 +760,10 @@ void UnicodeSetTest::TestPropertySet() { "x", "[:math=false:]", - "q", - "(*+)", + "q)*(", + // weiv: )(and * were removed from math in Unicode 4.0.1 + //"(*+)", + "+<>^", // JB#1767 \N{}, \p{ASCII} "[:Ascii:]", @@ -810,7 +829,56 @@ void UnicodeSetTest::TestPropertySet() { "[^b-]", // trailing '-' is literal "ac", - "-b" + "-b", + + "[a-b-]", // trailing '-' is literal + "ab-", + "c=", + + "[[a-q]&[p-z]-]", // trailing '-' is literal + "pq-", + "or=", + + "[\\s|\\)|:|$|\\>]", // from regex tests + "s|):$>", + "abc", + + "[\\uDC00cd]", // JB#2906: isolated trail at start + "cd\\uDC00", + "ab\\uD800\\U00010000", + + "[ab\\uD800]", // JB#2906: isolated trail at start + "ab\\uD800", + "cd\\uDC00\\U00010000", + + "[ab\\uD800cd]", // JB#2906: isolated lead in middle + "abcd\\uD800", + "ef\\uDC00\\U00010000", + + "[ab\\uDC00cd]", // JB#2906: isolated trail in middle + "abcd\\uDC00", + "ef\\uD800\\U00010000", + + "[:^lccc=0:]", // Lead canonical class + "\\u0300\\u0301", + "abcd\\u00c0\\u00c5", + + "[:^tccc=0:]", // Trail canonical class + "\\u0300\\u0301\\u00c0\\u00c5", + "abcd", + + "[[:^lccc=0:][:^tccc=0:]]", // Lead and trail canonical class + "\\u0300\\u0301\\u00c0\\u00c5", + "abcd", + + "[[:^lccc=0:]-[:^tccc=0:]]", // Stuff that starts with an accent but ends with a base (none right now) + "", + "abcd\\u0300\\u0301\\u00c0\\u00c5", + + "[[:ccc=0:]-[:lccc=0:]-[:tccc=0:]]", // Weirdos. Complete canonical class is zero, but both lead and trail are not + "\\u0F73\\u0F75\\u0F81", + "abcd\\u0300\\u0301\\u00c0\\u00c5", + }; static const int32_t DATA_LEN = sizeof(DATA)/sizeof(DATA[0]); @@ -865,6 +933,7 @@ void UnicodeSetTest::TestCloseOver() { UErrorCode ec = U_ZERO_ERROR; char CASE[] = {(char)USET_CASE}; + char CASE_MAPPINGS[] = {(char)USET_ADD_CASE_MAPPINGS}; const char* DATA[] = { // selector, input, output CASE, @@ -894,6 +963,18 @@ void UnicodeSetTest::TestCloseOver() { CASE, "[ABC]","[A-Ca-c]", + CASE_MAPPINGS, + "[aq\\u00DF{Bc}{bC}{Fi}]", + "[aAqQ\\u00DF{ss}{Ss}{SS}{Bc}{BC}{bC}{bc}{FI}{Fi}{fi}]", + + CASE_MAPPINGS, + "[\\u01F1]", // 'DZ' + "[\\u01F1\\u01F2\\u01F3]", + + CASE_MAPPINGS, + "[a-z]", + "[A-Za-z]", + NULL }; @@ -920,29 +1001,34 @@ void UnicodeSetTest::TestCloseOver() { } // Test the pattern API - s.applyPattern("[abc]", USET_CASE_INSENSITIVE, ec); + s.applyPattern("[abc]", USET_CASE_INSENSITIVE, NULL, ec); if (U_FAILURE(ec)) { errln("FAIL: applyPattern failed"); } else { expectContainment(s, "abcABC", "defDEF"); } - UnicodeSet v("[^abc]", USET_CASE_INSENSITIVE, ec); + UnicodeSet v("[^abc]", USET_CASE_INSENSITIVE, NULL, ec); if (U_FAILURE(ec)) { errln("FAIL: constructor failed"); } else { expectContainment(v, "defDEF", "abcABC"); } + UnicodeSet cm("[abck]", USET_ADD_CASE_MAPPINGS, NULL, ec); + if (U_FAILURE(ec)) { + errln("FAIL: construct w/case mappings failed"); + } else { + expectContainment(cm, "abckABCK", CharsToUnicodeString("defDEF\\u212A")); + } } void UnicodeSetTest::TestEscapePattern() { const char pattern[] = - "[\\uFEFF \\uFFF9-\\uFFFC \\U0001D173-\\U0001D17A \\U000F0000-\\U000FFFFD ]"; + "[\\uFEFF \\u200A-\\u200E \\U0001D173-\\U0001D17A \\U000F0000-\\U000FFFFD ]"; const char exp[] = - "[\\uFEFF\\uFFF9-\\uFFFC\\U0001D173-\\U0001D17A\\U000F0000-\\U000FFFFD]"; + "[\\u200A-\\u200E\\uFEFF\\U0001D173-\\U0001D17A\\U000F0000-\\U000FFFFD]"; // We test this with two passes; in the second pass we - // pre-unescape the pattern. Since U+FEFF and several other code - // points are rule whitespace, this fails -- which is what we - // expect. + // pre-unescape the pattern. Since U+200E is rule whitespace, + // this fails -- which is what we expect. for (int32_t pass=1; pass<=2; ++pass) { UErrorCode ec = U_ZERO_ERROR; UnicodeString pat(pattern); @@ -1042,7 +1128,7 @@ void UnicodeSetTest::TestInvalidCodePoint() { b = set.containsNone(start, end); b = set.containsSome(start, end); - int32_t index = set.indexOf(start); + /*int32_t index = set.indexOf(start);*/ set.clear(); set.add(start); @@ -1120,6 +1206,156 @@ void UnicodeSetTest::TestInvalidCodePoint() { } } +// Used by TestSymbolTable +class TokenSymbolTable : public SymbolTable { +public: + Hashtable contents; + + TokenSymbolTable(UErrorCode& ec) : contents(FALSE, ec) { + contents.setValueDeleter(uhash_deleteUnicodeString); + } + + ~TokenSymbolTable() {} + + /** + * (Non-SymbolTable API) Add the given variable and value to + * the table. Variable should NOT contain leading '$'. + */ + void add(const UnicodeString& var, const UnicodeString& value, + UErrorCode& ec) { + if (U_SUCCESS(ec)) { + contents.put(var, new UnicodeString(value), ec); + } + } + + /** + * SymbolTable API + */ + virtual const UnicodeString* lookup(const UnicodeString& s) const { + return (const UnicodeString*) contents.get(s); + } + + /** + * SymbolTable API + */ + virtual const UnicodeFunctor* lookupMatcher(UChar32 /*ch*/) const { + return NULL; + } + + /** + * SymbolTable API + */ + virtual UnicodeString parseReference(const UnicodeString& text, + ParsePosition& pos, int32_t limit) const { + int32_t start = pos.getIndex(); + int32_t i = start; + UnicodeString result; + while (i < limit) { + UChar c = text.charAt(i); + if ((i==start && !u_isIDStart(c)) || !u_isIDPart(c)) { + break; + } + ++i; + } + if (i == start) { // No valid name chars + return result; // Indicate failure with empty string + } + pos.setIndex(i); + text.extractBetween(start, i, result); + return result; + } +}; + +void UnicodeSetTest::TestSymbolTable() { + // Multiple test cases can be set up here. Each test case + // is terminated by null: + // var, value, var, value,..., input pat., exp. output pat., null + const char* DATA[] = { + "us", "a-z", "[0-1$us]", "[0-1a-z]", NULL, + "us", "[a-z]", "[0-1$us]", "[0-1[a-z]]", NULL, + "us", "\\[a\\-z\\]", "[0-1$us]", "[-01\\[\\]az]", NULL, + NULL + }; + + for (int32_t i=0; DATA[i]!=NULL; ++i) { + UErrorCode ec = U_ZERO_ERROR; + TokenSymbolTable sym(ec); + if (U_FAILURE(ec)) { + errln("FAIL: couldn't construct TokenSymbolTable"); + continue; + } + + // Set up variables + while (DATA[i+2] != NULL) { + sym.add(DATA[i], DATA[i+1], ec); + if (U_FAILURE(ec)) { + errln("FAIL: couldn't add to TokenSymbolTable"); + continue; + } + i += 2; + } + + // Input pattern and expected output pattern + UnicodeString inpat = DATA[i], exppat = DATA[i+1]; + i += 2; + + ParsePosition pos(0); + UnicodeSet us(inpat, pos, USET_IGNORE_SPACE, &sym, ec); + if (U_FAILURE(ec)) { + errln("FAIL: couldn't construct UnicodeSet"); + continue; + } + + // results + if (pos.getIndex() != inpat.length()) { + errln((UnicodeString)"Failed to read to end of string \"" + + inpat + "\": read to " + + pos.getIndex() + ", length is " + + inpat.length()); + } + + UnicodeSet us2(exppat, ec); + if (U_FAILURE(ec)) { + errln("FAIL: couldn't construct expected UnicodeSet"); + continue; + } + + UnicodeString a, b; + if (us != us2) { + errln((UnicodeString)"Failed, got " + us.toPattern(a, TRUE) + + ", expected " + us2.toPattern(b, TRUE)); + } else { + logln((UnicodeString)"Ok, got " + us.toPattern(a, TRUE)); + } + } +} + +void UnicodeSetTest::TestSurrogate() { + const char* DATA[] = { + // These should all behave identically + "[abc\\uD800\\uDC00]", + // "[abc\uD800\uDC00]", // Can't do this on C -- only Java + "[abc\\U00010000]", + 0 + }; + for (int i=0; DATA[i] != 0; ++i) { + UErrorCode ec = U_ZERO_ERROR; + logln((UnicodeString)"Test pattern " + i + " :" + DATA[i]); + UnicodeSet set(DATA[i], ec); + if (U_FAILURE(ec)) { + errln("FAIL: UnicodeSet constructor"); + continue; + } + expectContainment(set, + CharsToUnicodeString("abc\\U00010000"), + CharsToUnicodeString("\\uD800;\\uDC00")); // split apart surrogate-pair + if (set.size() != 4) { + errln((UnicodeString)"FAIL: " + DATA[i] + ".size() == " + + set.size() + ", expected 4"); + } + } +} + void UnicodeSetTest::TestExhaustive() { // exhaustive tests. Simulate UnicodeSets with integers. // That gives us very solid tests (except for large memory tests). @@ -1489,6 +1725,9 @@ void UnicodeSetTest::expectToPattern(const UnicodeSet& set, errln((UnicodeString)"FAIL: toPattern() => \"" + pat + "\", expected \"" + expPat + "\""); return; } + if (expStrings == NULL) { + return; + } UBool in = TRUE; for (int32_t i=0; expStrings[i] != NULL; ++i) { if (expStrings[i] == NOT) { // sic; pointer comparison diff --git a/icuSources/test/intltest/usettest.h b/icuSources/test/intltest/usettest.h index 04b6ca3d..55243591 100644 --- a/icuSources/test/intltest/usettest.h +++ b/icuSources/test/intltest/usettest.h @@ -1,7 +1,7 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ******************************************************************** ********************************************************************** @@ -49,8 +49,6 @@ private: void TestStrings(void); - void TestStringPatterns(void); - void TestScriptSet(void); /** @@ -70,6 +68,10 @@ private: void TestInvalidCodePoint(void); + void TestSymbolTable(void); + + void TestSurrogate(); + private: UBool toPatternAux(UChar32 start, UChar32 end); diff --git a/icuSources/test/intltest/ustrtest.cpp b/icuSources/test/intltest/ustrtest.cpp index 74c6a0e7..aac1f5f6 100644 --- a/icuSources/test/intltest/ustrtest.cpp +++ b/icuSources/test/intltest/ustrtest.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and + * Copyright (c) 1997-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -24,17 +24,15 @@ using namespace std; #endif -#define LENGTHOF(array) (sizeof(array)/sizeof((array)[0])) +#define LENGTHOF(array) (int32_t)((sizeof(array)/sizeof((array)[0]))) + +UnicodeStringTest::~UnicodeStringTest() {} void UnicodeStringTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char *par) { if (exec) logln("TestSuite UnicodeStringTest: "); switch (index) { - case 0: name = "TestBasicManipulation"; if (exec) TestBasicManipulation(); break; - case 1: name = "TestCompare"; if (exec) TestCompare(); break; - case 2: name = "TestExtract"; if (exec) TestExtract(); break; - case 3: name = "TestRemoveReplace"; if (exec) TestRemoveReplace(); break; - case 4: + case 0: name = "StringCaseTest"; if (exec) { logln("StringCaseTest---"); logln(""); @@ -42,6 +40,10 @@ void UnicodeStringTest::runIndexedTest( int32_t index, UBool exec, const char* & callTest(test, par); } break; + case 1: name = "TestBasicManipulation"; if (exec) TestBasicManipulation(); break; + case 2: name = "TestCompare"; if (exec) TestCompare(); break; + case 3: name = "TestExtract"; if (exec) TestExtract(); break; + case 4: name = "TestRemoveReplace"; if (exec) TestRemoveReplace(); break; case 5: name = "TestSearching"; if (exec) TestSearching(); break; case 6: name = "TestSpacePadding"; if (exec) TestSpacePadding(); break; case 7: name = "TestPrefixAndSuffix"; if (exec) TestPrefixAndSuffix(); break; @@ -52,6 +54,7 @@ void UnicodeStringTest::runIndexedTest( int32_t index, UBool exec, const char* & case 12: name = "TestStackAllocation"; if (exec) TestStackAllocation(); break; case 13: name = "TestUnescape"; if (exec) TestUnescape(); break; case 14: name = "TestCountChar32"; if (exec) TestCountChar32(); break; + case 15: name = "TestStringEnumeration"; if (exec) TestStringEnumeration(); break; default: name = ""; break; //needed to end loop } @@ -154,21 +157,72 @@ UnicodeStringTest::TestBasicManipulation() } } - { - // test new 2.2 constructors and setTo function that parallel Java's substring function. - UnicodeString src("Hello folks how are you?"); - UnicodeString target1("how are you?"); - if (target1 != UnicodeString(src, 12)) { - errln("UnicodeString(const UnicodeString&, int32_t) failed"); - } - UnicodeString target2("folks"); - if (target2 != UnicodeString(src, 6, 5)) { - errln("UnicodeString(const UnicodeString&, int32_t, int32_t) failed"); - } - if (target1 != target2.setTo(src, 12)) { - errln("UnicodeString::setTo(const UnicodeString&, int32_t) failed"); - } - } + { + // test new 2.2 constructors and setTo function that parallel Java's substring function. + UnicodeString src("Hello folks how are you?"); + UnicodeString target1("how are you?"); + if (target1 != UnicodeString(src, 12)) { + errln("UnicodeString(const UnicodeString&, int32_t) failed"); + } + UnicodeString target2("folks"); + if (target2 != UnicodeString(src, 6, 5)) { + errln("UnicodeString(const UnicodeString&, int32_t, int32_t) failed"); + } + if (target1 != target2.setTo(src, 12)) { + errln("UnicodeString::setTo(const UnicodeString&, int32_t) failed"); + } + } + + { + // op+ is new in ICU 2.8 + UnicodeString s=UnicodeString("abc", "")+UnicodeString("def", "")+UnicodeString("ghi", ""); + if(s!=UnicodeString("abcdefghi", "")) { + errln("operator+(UniStr, UniStr) failed"); + } + } + + { + // tests for Jitterbug 2360 + // verify that APIs with source pointer + length accept length == -1 + // mostly test only where modified, only few functions did not already do this + if(UnicodeString("abc", -1, "")!=UnicodeString("abc", "")) { + errln("UnicodeString(codepageData, dataLength, codepage) does not work with dataLength==-1"); + } + + UChar buffer[10]={ 0x61, 0x62, 0x20ac, 0xd900, 0xdc05, 0, 0x62, 0xffff, 0xdbff, 0xdfff }; + UnicodeString s, t(buffer, -1, LENGTHOF(buffer)); + + if(s.setTo(buffer, -1, LENGTHOF(buffer)).length()!=u_strlen(buffer)) { + errln("UnicodeString.setTo(buffer, length, capacity) does not work with length==-1"); + } + if(t.length()!=u_strlen(buffer)) { + errln("UnicodeString(buffer, length, capacity) does not work with length==-1"); + } + + if(0!=s.caseCompare(buffer, -1, U_FOLD_CASE_DEFAULT)) { + errln("UnicodeString.caseCompare(const UChar *, length, options) does not work with length==-1"); + } + + buffer[u_strlen(buffer)]=0xe4; + UnicodeString u(buffer, -1, LENGTHOF(buffer)); + if(s.setTo(buffer, -1, LENGTHOF(buffer)).length()!=LENGTHOF(buffer)) { + errln("UnicodeString.setTo(buffer without NUL, length, capacity) does not work with length==-1"); + } + if(u.length()!=LENGTHOF(buffer)) { + errln("UnicodeString(buffer without NUL, length, capacity) does not work with length==-1"); + } + + static const char cs[]={ 0x61, (char)0xe4, (char)0x85, 0 }; + UConverter *cnv; + UErrorCode errorCode=U_ZERO_ERROR; + + cnv=ucnv_open("ISO-8859-1", &errorCode); + UnicodeString v(cs, -1, cnv, errorCode); + ucnv_close(cnv); + if(v!=UnicodeString("a\\xe4\\x85").unescape()) { + errln("UnicodeString(const char *, length, cnv, errorCode) does not work with length==-1"); + } + } } void @@ -386,6 +440,13 @@ UnicodeStringTest::TestExtract() if (test1.extract(11, 12, test4) != 12 || test4[12] != 0) { errln("UnicodeString.extract(char *) failed to return the correct size of destination buffer."); } + + // test proper pinning in extractBetween() + test1.extractBetween(-3, 7, test5); + if(test5!=UNICODE_STRING("Now is ", 7)) { + errln("UnicodeString.extractBetween(-3, 7) did not pin properly."); + } + test1.extractBetween(11, 23, test5); if (test1.extract(60, 71, test6) != 9) { errln("UnicodeString.extract() failed to return the correct size of destination buffer for end of buffer."); @@ -1468,3 +1529,97 @@ UnicodeStringTest::TestBogus() { errln("bogus<empty failed"); } } + +// StringEnumeration ------------------------------------------------------- *** +// most of StringEnumeration is tested elsewhere +// this test improves code coverage + +static const char *const +testEnumStrings[]={ + "a", + "b", + "c", + "this is a long string which helps us test some buffer limits", + "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee" +}; + +class TestEnumeration : public StringEnumeration { +public: + TestEnumeration() : i(0) {} + + virtual int32_t count(UErrorCode& /*status*/) const { + return LENGTHOF(testEnumStrings); + } + + virtual const UnicodeString *snext(UErrorCode &status) { + if(U_SUCCESS(status) && i<LENGTHOF(testEnumStrings)) { + unistr=UnicodeString(testEnumStrings[i++], ""); + return &unistr; + } + + return NULL; + } + + virtual void reset(UErrorCode& /*status*/) { + i=0; + } + + static inline UClassID getStaticClassID() { + return (UClassID)&fgClassID; + } + virtual UClassID getDynamicClassID() const { + return getStaticClassID(); + } + +private: + static const char fgClassID; + + int32_t i, length; +}; + +const char TestEnumeration::fgClassID=0; + +void +UnicodeStringTest::TestStringEnumeration() { + UnicodeString s; + TestEnumeration ten; + int32_t i, length; + UErrorCode status; + + const UChar *pu; + const char *pc; + + // test the next() default implementation and ensureCharsCapacity() + for(i=0; i<LENGTHOF(testEnumStrings); ++i) { + status=U_ZERO_ERROR; + pc=ten.next(&length, status); + s=UnicodeString(testEnumStrings[i], ""); + if(U_FAILURE(status) || pc==NULL || length!=s.length() || UnicodeString(pc, length, "")!=s) { + errln("StringEnumeration.next(%d) failed", i); + } + } + status=U_ZERO_ERROR; + if(ten.next(&length, status)!=NULL) { + errln("StringEnumeration.next(done)!=NULL"); + } + + // test the unext() default implementation + ten.reset(status); + for(i=0; i<LENGTHOF(testEnumStrings); ++i) { + status=U_ZERO_ERROR; + pu=ten.unext(&length, status); + s=UnicodeString(testEnumStrings[i], ""); + if(U_FAILURE(status) || pu==NULL || length!=s.length() || UnicodeString(TRUE, pu, length)!=s) { + errln("StringEnumeration.unext(%d) failed", i); + } + } + status=U_ZERO_ERROR; + if(ten.unext(&length, status)!=NULL) { + errln("StringEnumeration.unext(done)!=NULL"); + } + + // test that the default clone() implementation works, and returns NULL + if(ten.clone()!=NULL) { + errln("StringEnumeration.clone()!=NULL"); + } +} diff --git a/icuSources/test/intltest/ustrtest.h b/icuSources/test/intltest/ustrtest.h index 573d9c1b..353b04c2 100644 --- a/icuSources/test/intltest/ustrtest.h +++ b/icuSources/test/intltest/ustrtest.h @@ -15,7 +15,7 @@ class UnicodeStringTest: public IntlTest { public: UnicodeStringTest() {} - virtual ~UnicodeStringTest() {} + virtual ~UnicodeStringTest(); void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par = NULL ); @@ -71,12 +71,13 @@ public: void _testUnicodeStringHasMoreChar32Than(const UnicodeString &s, int32_t start, int32_t length, int32_t number); void TestCountChar32(void); void TestBogus(); + void TestStringEnumeration(); }; class StringCaseTest: public IntlTest { public: StringCaseTest() {} - virtual ~StringCaseTest() {} + virtual ~StringCaseTest(); void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=0); diff --git a/icuSources/test/intltest/v32test.cpp b/icuSources/test/intltest/v32test.cpp new file mode 100644 index 00000000..7b11f9b4 --- /dev/null +++ b/icuSources/test/intltest/v32test.cpp @@ -0,0 +1,505 @@ +/******************************************************************** + * COPYRIGHT: + * Copyright (c) 2002-2003, International Business Machines Corporation and + * others. All Rights Reserved. + ********************************************************************/ + +// +// regextst.cpp +// +// ICU Regular Expressions test, part of intltest. +// + +#include "intltest.h" + +#include "v32test.h" +#include "uvectr32.h" +#include "uvector.h" +#include "util.h" +#include <stdlib.h> +#include <stdio.h> + + +//--------------------------------------------------------------------------- +// +// Test class boilerplate +// +//--------------------------------------------------------------------------- +UVector32Test::UVector32Test() +{ +}; + + +UVector32Test::~UVector32Test() +{ +}; + + + +void UVector32Test::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) +{ + if (exec) logln("TestSuite UVector32Test: "); + switch (index) { + + case 0: name = "UVector32_API"; + if (exec) UVector32_API(); + break; + default: name = ""; + break; //needed to end loop + } +} + + +//--------------------------------------------------------------------------- +// +// Error Checking / Reporting macros used in all of the tests. +// +//--------------------------------------------------------------------------- +#define TEST_CHECK_STATUS(status) \ + if (U_FAILURE(status)) {\ + errln("UVector32Test failure at line %d. status=%s\n", __LINE__, u_errorName(status));\ + return;\ + } + +#define TEST_ASSERT(expr) \ + if ((expr)==FALSE) {\ + errln("RegexTest failure at line %d.\n", __LINE__);\ + } + +//--------------------------------------------------------------------------- +// +// UVector32_API Check for basic functionality of UVector32. +// +//--------------------------------------------------------------------------- +void UVector32Test::UVector32_API() { + + UErrorCode status = U_ZERO_ERROR; + UVector32 *a; + UVector32 *b; + + a = new UVector32(status); + TEST_CHECK_STATUS(status); + delete a; + + status = U_ZERO_ERROR; + a = new UVector32(2000, status); + TEST_CHECK_STATUS(status); + delete a; + + // + // assign() + // + status = U_ZERO_ERROR; + a = new UVector32(status); + a->addElement(10, status); + a->addElement(20, status); + a->addElement(30, status); + b = new UVector32(status); + b->assign(*a, status); + TEST_ASSERT(b->size() == 3); + TEST_ASSERT(b->elementAti(1) == 20); + TEST_CHECK_STATUS(status); + delete a; + delete b; + + // + // operator == and != and equals() + // + status = U_ZERO_ERROR; + a = new UVector32(status); + a->addElement(10, status); + a->addElement(20, status); + a->addElement(30, status); + b = new UVector32(status); + TEST_ASSERT(*b != *a); + TEST_ASSERT(!(*b == *a)); + TEST_ASSERT(!b->equals(*a)); + b->assign(*a, status); + TEST_ASSERT(*b == *a); + TEST_ASSERT(!(*b != *a)); + TEST_ASSERT(b->equals(*a)); + b->addElement(666, status); + TEST_ASSERT(*b != *a); + TEST_ASSERT(!(*b == *a)); + TEST_ASSERT(!b->equals(*a)); + TEST_CHECK_STATUS(status); + delete b; + delete a; + + // + // addElement(). Covered by above tests. + // + + // + // setElementAt() + // + status = U_ZERO_ERROR; + a = new UVector32(status); + a->addElement(10, status); + a->addElement(20, status); + a->addElement(30, status); + a->setElementAt(666, 1); + TEST_ASSERT(a->elementAti(0) == 10); + TEST_ASSERT(a->elementAti(1) == 666); + TEST_ASSERT(a->size() == 3); + TEST_CHECK_STATUS(status); + delete a; + + // + // insertElementAt() + // + status = U_ZERO_ERROR; + a = new UVector32(status); + a->addElement(10, status); + a->addElement(20, status); + a->addElement(30, status); + a->insertElementAt(666, 1, status); + TEST_ASSERT(a->elementAti(0) == 10); + TEST_ASSERT(a->elementAti(1) == 666); + TEST_ASSERT(a->elementAti(2) == 20); + TEST_ASSERT(a->elementAti(3) == 30); + TEST_ASSERT(a->size() == 4); + TEST_CHECK_STATUS(status); + delete a; + + // + // elementAti() covered by above tests + // + + // + // lastElementi + // + status = U_ZERO_ERROR; + a = new UVector32(status); + a->addElement(10, status); + a->addElement(20, status); + a->addElement(30, status); + TEST_ASSERT(a->lastElementi() == 30); + TEST_CHECK_STATUS(status); + delete a; + + + // + // indexOf + // + status = U_ZERO_ERROR; + a = new UVector32(status); + a->addElement(10, status); + a->addElement(20, status); + a->addElement(30, status); + TEST_ASSERT(a->indexOf(30, 0) == 2); + TEST_ASSERT(a->indexOf(40, 0) == -1); + TEST_ASSERT(a->indexOf(10, 0) == 0); + TEST_ASSERT(a->indexOf(10, 1) == -1); + TEST_CHECK_STATUS(status); + delete a; + + + // + // contains + // + status = U_ZERO_ERROR; + a = new UVector32(status); + a->addElement(10, status); + a->addElement(20, status); + a->addElement(30, status); + TEST_ASSERT(a->contains(10) == TRUE); + TEST_ASSERT(a->contains(11) == FALSE); + TEST_ASSERT(a->contains(20) == TRUE); + TEST_ASSERT(a->contains(-10) == FALSE); + TEST_CHECK_STATUS(status); + delete a; + + + // + // containsAll + // + status = U_ZERO_ERROR; + a = new UVector32(status); + a->addElement(10, status); + a->addElement(20, status); + a->addElement(30, status); + b = new UVector32(status); + TEST_ASSERT(a->containsAll(*b) == TRUE); + b->addElement(2, status); + TEST_ASSERT(a->containsAll(*b) == FALSE); + b->setElementAt(10, 0); + TEST_ASSERT(a->containsAll(*b) == TRUE); + TEST_ASSERT(b->containsAll(*a) == FALSE); + b->addElement(30, status); + b->addElement(20, status); + TEST_ASSERT(a->containsAll(*b) == TRUE); + TEST_ASSERT(b->containsAll(*a) == TRUE); + b->addElement(2, status); + TEST_ASSERT(a->containsAll(*b) == FALSE); + TEST_ASSERT(b->containsAll(*a) == TRUE); + TEST_CHECK_STATUS(status); + delete a; + delete b; + + // + // removeAll + // + status = U_ZERO_ERROR; + a = new UVector32(status); + a->addElement(10, status); + a->addElement(20, status); + a->addElement(30, status); + b = new UVector32(status); + a->removeAll(*b); + TEST_ASSERT(a->size() == 3); + b->addElement(20, status); + a->removeAll(*b); + TEST_ASSERT(a->size() == 2); + TEST_ASSERT(a->contains(10)==TRUE); + TEST_ASSERT(a->contains(30)==TRUE); + b->addElement(10, status); + a->removeAll(*b); + TEST_ASSERT(a->size() == 1); + TEST_ASSERT(a->contains(30) == TRUE); + TEST_CHECK_STATUS(status); + delete a; + delete b; + + // + // retainAll + // + status = U_ZERO_ERROR; + a = new UVector32(status); + a->addElement(10, status); + a->addElement(20, status); + a->addElement(30, status); + b = new UVector32(status); + b->addElement(10, status); + b->addElement(20, status); + b->addElement(30, status); + b->addElement(15, status); + a->retainAll(*b); + TEST_ASSERT(a->size() == 3); + b->removeElementAt(1); + a->retainAll(*b); + TEST_ASSERT(a->contains(20) == FALSE); + TEST_ASSERT(a->size() == 2); + b->removeAllElements(); + TEST_ASSERT(b->size() == 0); + a->retainAll(*b); + TEST_ASSERT(a->size() == 0); + TEST_CHECK_STATUS(status); + delete a; + delete b; + + // + // removeElementAt Tested above. + // + + // + // removeAllElments Tested above + // + + // + // size() tested above + // + + // + // isEmpty + // + status = U_ZERO_ERROR; + a = new UVector32(status); + TEST_ASSERT(a->isEmpty() == TRUE); + a->addElement(10, status); + TEST_ASSERT(a->isEmpty() == FALSE); + a->addElement(20, status); + a->removeElementAt(0); + TEST_ASSERT(a->isEmpty() == FALSE); + a->removeElementAt(0); + TEST_ASSERT(a->isEmpty() == TRUE); + TEST_CHECK_STATUS(status); + delete a; + + + // + // ensureCapacity, expandCapacity + // + status = U_ZERO_ERROR; + a = new UVector32(status); + TEST_ASSERT(a->isEmpty() == TRUE); + a->addElement(10, status); + TEST_ASSERT(a->ensureCapacity(5000, status)== TRUE); + TEST_ASSERT(a->expandCapacity(20000, status) == TRUE); + TEST_CHECK_STATUS(status); + delete a; + + // + // setSize + // + status = U_ZERO_ERROR; + a = new UVector32(status); + a->addElement(10, status); + a->addElement(20, status); + a->addElement(30, status); + a->setSize(100); + TEST_ASSERT(a->size() == 100); + TEST_ASSERT(a->elementAti(0) == 10); + TEST_ASSERT(a->elementAti(1) == 20); + TEST_ASSERT(a->elementAti(2) == 30); + TEST_ASSERT(a->elementAti(3) == 0); + a->setElementAt(666, 99); + a->setElementAt(777, 100); + TEST_ASSERT(a->elementAti(99) == 666); + TEST_ASSERT(a->elementAti(100) == 0); + a->setSize(2); + TEST_ASSERT(a->elementAti(1) == 20); + TEST_ASSERT(a->elementAti(2) == 0); + TEST_ASSERT(a->size() == 2); + a->setSize(0); + TEST_ASSERT(a->empty() == TRUE); + TEST_ASSERT(a->size() == 0); + + TEST_CHECK_STATUS(status); + delete a; + + // + // containsNone + // + status = U_ZERO_ERROR; + a = new UVector32(status); + a->addElement(10, status); + a->addElement(20, status); + a->addElement(30, status); + b = new UVector32(status); + TEST_ASSERT(a->containsNone(*b) == TRUE); + b->addElement(5, status); + TEST_ASSERT(a->containsNone(*b) == TRUE); + b->addElement(30, status); + TEST_ASSERT(a->containsNone(*b) == FALSE); + + TEST_CHECK_STATUS(status); + delete a; + delete b; + + // + // sortedInsert + // + status = U_ZERO_ERROR; + a = new UVector32(status); + a->sortedInsert(30, status); + a->sortedInsert(20, status); + a->sortedInsert(10, status); + TEST_ASSERT(a->elementAti(0) == 10); + TEST_ASSERT(a->elementAti(1) == 20); + TEST_ASSERT(a->elementAti(2) == 30); + + TEST_CHECK_STATUS(status); + delete a; + + // + // getBuffer + // + status = U_ZERO_ERROR; + a = new UVector32(status); + a->addElement(10, status); + a->addElement(20, status); + int32_t *buf = a->getBuffer(); + TEST_ASSERT(buf[0] == 10); + TEST_ASSERT(buf[1] == 20); + a->setSize(20000); + int32_t *resizedBuf; + resizedBuf = a->getBuffer(); + TEST_ASSERT(buf != resizedBuf); + TEST_ASSERT(resizedBuf[0] == 10); + TEST_ASSERT(resizedBuf[1] == 20); + + TEST_CHECK_STATUS(status); + delete a; + + + // + // RTTI + // + status = U_ZERO_ERROR; + a = new UVector32(status); + TEST_ASSERT(a->getDynamicClassID() == UVector32::getStaticClassID()); + TEST_ASSERT(a->getDynamicClassID() != UVector::getStaticClassID()); + TEST_CHECK_STATUS(status); + delete a; + + // + // empty + // + status = U_ZERO_ERROR; + a = new UVector32(status); + TEST_ASSERT(a->empty() == TRUE); + a->addElement(10, status); + TEST_ASSERT(a->empty() == FALSE); + a->addElement(20, status); + a->removeElementAt(0); + TEST_ASSERT(a->empty() == FALSE); + a->removeElementAt(0); + TEST_ASSERT(a->empty() == TRUE); + TEST_CHECK_STATUS(status); + delete a; + + + // + // peeki + // + status = U_ZERO_ERROR; + a = new UVector32(status); + a->addElement(10, status); + TEST_ASSERT(a->peeki() == 10); + a->addElement(20, status); + TEST_ASSERT(a->peeki() == 20); + a->addElement(30, status); + TEST_ASSERT(a->peeki() == 30); + TEST_CHECK_STATUS(status); + delete a; + + + // + // popi + // + status = U_ZERO_ERROR; + a = new UVector32(status); + a->addElement(10, status); + a->addElement(20, status); + a->addElement(30, status); + TEST_ASSERT(a->popi() == 30); + TEST_ASSERT(a->popi() == 20); + TEST_ASSERT(a->popi() == 10); + TEST_ASSERT(a->popi() == 0); + TEST_ASSERT(a->isEmpty()); + TEST_CHECK_STATUS(status); + delete a; + + // + // push + // + status = U_ZERO_ERROR; + a = new UVector32(status); + TEST_ASSERT(a->push(10, status) == 10); + TEST_ASSERT(a->push(20, status) == 20); + TEST_ASSERT(a->push(30, status) == 30); + TEST_ASSERT(a->size() == 3); + TEST_ASSERT(a->popi() == 30); + TEST_ASSERT(a->popi() == 20); + TEST_ASSERT(a->popi() == 10); + TEST_ASSERT(a->isEmpty()); + TEST_CHECK_STATUS(status); + delete a; + + + // + // reserveBlock + // + status = U_ZERO_ERROR; + a = new UVector32(status); + a->ensureCapacity(1000, status); + + // TODO: + + TEST_CHECK_STATUS(status); + delete a; + +}; + + diff --git a/icuSources/test/intltest/v32test.h b/icuSources/test/intltest/v32test.h new file mode 100644 index 00000000..f364aeb1 --- /dev/null +++ b/icuSources/test/intltest/v32test.h @@ -0,0 +1,32 @@ +/* +****************************************************************************** +* Copyright (C) 2003, International Business Machines Corporation and * +* others. All Rights Reserved. * +****************************************************************************** +*/ + +// file: v32test.h + + +#ifndef V32TEST_H +#define V32TEST_H + +#include "unicode/utypes.h" + +#include "intltest.h" + + +class UVector32Test: public IntlTest { +public: + + UVector32Test(); + virtual ~UVector32Test(); + + virtual void runIndexedTest(int32_t index, UBool exec, const char* &name, char* par = NULL ); + + // The following are test functions that are visible from the intltest test framework. + virtual void UVector32_API(); + +}; + +#endif diff --git a/icuSources/test/iotest/Makefile.in b/icuSources/test/iotest/Makefile.in index 486558f1..4e6a5c85 100644 --- a/icuSources/test/iotest/Makefile.in +++ b/icuSources/test/iotest/Makefile.in @@ -1,5 +1,5 @@ ## Makefile.in for ICU - test/iotest -## Copyright (c) 2002, International Business Machines Corporation and +## Copyright (c) 2002-2004, International Business Machines Corporation and ## others. All Rights Reserved. ## Source directory information @@ -17,13 +17,18 @@ subdir = test/iotest CLEANFILES = *~ $(DEPS) ## Target information -TARGET = iotest +TARGET = iotest$(EXEEXT) + +BUILDDIR := $(CURR_SRCCODE_FULL_DIR)/../../ +BUILDDIR := $(BUILDDIR:test/iotest/../../=) +BUILDDIR := $(BUILDDIR:test\\\\iotest/../../=) CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common -I$(top_srcdir)/i18n \ --I$(top_srcdir)/tools/ctestfw -I$(top_srcdir)/extra/ustdio -LIBS = $(LIBCTESTFW) $(LIBICUI18N) $(LIBICUUC) $(LIBUSTDIO) $(DEFAULT_LIBS) $(LIB_M) +-I$(top_srcdir)/tools/ctestfw -I$(top_srcdir)/io +DEFS += -D'U_TOPSRCDIR="$(top_srcdir)/"' -D'U_TOPBUILDDIR="$(BUILDDIR)"' +LIBS = $(LIBCTESTFW) $(LIBICUIO) $(LIBICUI18N) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M) -OBJECTS = iotest.o +OBJECTS = iotest.o strtst.o filetst.o DEPS = $(OBJECTS:.o=.d) @@ -58,14 +63,14 @@ distclean-local: clean-local -include Makefile.local check-local: all-local - TZ=PST8PDT $(INVOKE) ./$(TARGET) $(IOTEST_OPTS) + $(INVOKE) ./$(TARGET) $(IOTEST_OPTS) || true Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status $(TARGET) : $(OBJECTS) - $(LINK.cc) -o $@ $^ $(LIBS) + $(LINK.cc) $(OUTOPT)$@ $^ $(LIBS) ifeq (,$(MAKECMDGOALS)) -include $(DEPS) diff --git a/icuSources/test/iotest/filetst.c b/icuSources/test/iotest/filetst.c new file mode 100644 index 00000000..a078e8f3 --- /dev/null +++ b/icuSources/test/iotest/filetst.c @@ -0,0 +1,1491 @@ +/* +********************************************************************** +* Copyright (C) 2004-2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* file name: filetst.c +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2004apr06 +* created by: George Rhoten +*/ + +#include "iotest.h" +#include "unicode/ustdio.h" +#include "unicode/ustring.h" +#include "unicode/uloc.h" +#include "unicode/utrans.h" + +#include <string.h> + +const char STANDARD_TEST_FILE[] = "iotest-c.txt"; + + +#if !UCONFIG_NO_FORMATTING +static void TestFileFromICU(UFILE *myFile) { + int32_t n[1]; + float myFloat = -1234.0; + int32_t newValuePtr[1]; + double newDoubleValuePtr[1]; + UChar myUString[256]; + UChar uStringBuf[256]; + char myString[256] = ""; + char testBuf[256] = ""; + void *origPtr, *ptr; + U_STRING_DECL(myStringOrig, "My-String", 9); + + U_STRING_INIT(myStringOrig, "My-String", 9); + u_memset(myUString, 0x2a, sizeof(myUString)/sizeof(*myUString)); + u_memset(uStringBuf, 0x2a, sizeof(uStringBuf)/sizeof(*uStringBuf)); + memset(myString, '*', sizeof(myString)/sizeof(*myString)); + memset(testBuf, '*', sizeof(testBuf)/sizeof(*testBuf)); + + if (myFile == NULL) { + log_err("Can't write test file.\n"); + return; + } + + *n = -1234; + if (sizeof(void *) == 4) { + origPtr = (void *)0xdeadbeef; + } else if (sizeof(void *) == 8) { + origPtr = (void *) INT64_C(0x1000200030004000); + } else if (sizeof(void *) == 16) { + /* iSeries */ + int32_t massiveBigEndianPtr[] = { 0x10002000, 0x30004000, 0x50006000, 0x70008000 }; + origPtr = *((void **)massiveBigEndianPtr); + } else { + log_err("sizeof(void*)=%d hasn't been tested before", (int)sizeof(void*)); + } + + /* Test fprintf */ + u_fprintf(myFile, "Signed decimal integer %%d: %d\n", *n); + u_fprintf(myFile, "Signed decimal integer %%i: %i\n", *n); + u_fprintf(myFile, "Unsigned octal integer %%o: %o\n", *n); + u_fprintf(myFile, "Unsigned decimal integer %%u: %u\n", *n); + u_fprintf(myFile, "Lowercase unsigned hexadecimal integer %%x: %x\n", *n); + u_fprintf(myFile, "Uppercase unsigned hexadecimal integer %%X: %X\n", *n); + u_fprintf(myFile, "Float %%f: %f\n", myFloat); + u_fprintf(myFile, "Lowercase float %%e: %e\n", myFloat); + u_fprintf(myFile, "Uppercase float %%E: %E\n", myFloat); + u_fprintf(myFile, "Lowercase float %%g: %g\n", myFloat); + u_fprintf(myFile, "Uppercase float %%G: %G\n", myFloat); + u_fprintf(myFile, "Pointer %%p: %p\n", origPtr); + u_fprintf(myFile, "Char %%c: %c\n", 'A'); + u_fprintf(myFile, "UChar %%C: %C\n", (UChar)0x0041); /*'A'*/ + u_fprintf(myFile, "String %%s: %s\n", "My-String"); + u_fprintf(myFile, "NULL String %%s: %s\n", NULL); + u_fprintf(myFile, "Unicode String %%S: %S\n", myStringOrig); + u_fprintf(myFile, "NULL Unicode String %%S: %S\n", NULL); + u_fprintf(myFile, "Percent %%P (non-ANSI): %P\n", myFloat); + u_fprintf(myFile, "Spell Out %%V (non-ANSI): %V\n", myFloat); + + if (u_feof(myFile)) { + log_err("Got feof while writing the file.\n"); + } + + *n = 1; + u_fprintf(myFile, "\t\nPointer to integer (Count) %%n: n=%d %n n=%d\n", *n, n, *n); + u_fprintf(myFile, "Pointer to integer Value: %d\n", *n); + u_fprintf(myFile, "This is a long test123456789012345678901234567890123456789012345678901234567890\n"); + *n = 1; + fprintf(u_fgetfile(myFile), "\tNormal fprintf count: n=%d %n n=%d\n", (int)*n, (int*)n, (int)*n); + fprintf(u_fgetfile(myFile), "\tNormal fprintf count value: n=%d\n", (int)*n); + + u_fclose(myFile); + myFile = u_fopen(STANDARD_TEST_FILE, "r", NULL, NULL); + + if (myFile == NULL) { + log_err("Can't read test file."); + return; + } + + if (u_feof(myFile)) { + log_err("Got feof while reading the file and not at the end of the file.\n"); + } + + myUString[0] = u_fgetc(myFile); + if (myUString[0] != 0x53 /* S */) { + log_err("u_fgetc 1 returned %X. Expected 'S'.", myString[0]); + } + u_fungetc(myUString[0], myFile); + myUString[0] = u_fgetc(myFile); + if (myUString[0] != 0x53 /* S */) { + log_err("u_fgetc 2 returned %X. Expected 'S'.", myString[0]); + } + u_fungetc(myUString[0], myFile); + myUString[0] = u_fgetc(myFile); + if (myUString[0] != 0x53 /* S */) { + log_err("u_fgetc 3 returned %X. Expected 'S'.", myString[0]); + } + u_fungetc(myUString[0], myFile); + myUString[0] = u_fgetc(myFile); + myUString[1] = (UChar)u_fgetcx(myFile); /* Mix getc and getcx and see what happens. */ + myUString[2] = u_fgetc(myFile); + if (myUString[0] != 0x53 /* S */ && myUString[1] != 0x69 /* i */ && myUString[2] != 0x6E /* n */) { + log_err("u_fgetcx returned \\u%04X\\u%04X\\u%04X. Expected 'Sin'.", myString[0], myString[1], myString[2]); + } + u_fungetc(myUString[2], myFile); + u_fungetc(myUString[1], myFile); + u_fungetc(myUString[0], myFile); + + *n = -1234; + + *newValuePtr = 1; + u_fscanf(myFile, "Signed decimal integer %%d: %d\n", newValuePtr); + if (*n != *newValuePtr) { + log_err("%%d Got: %d, Expected: %d\n", *newValuePtr, *n); + } + *newValuePtr = 1; + u_fscanf(myFile, "Signed decimal integer %%i: %i\n", newValuePtr); + if (*n != *newValuePtr) { + log_err("%%i Got: %i, Expected: %i\n", *newValuePtr, *n); + } + *newValuePtr = 1; + u_fscanf(myFile, "Unsigned octal integer %%o: %o\n", newValuePtr); + if (*n != *newValuePtr) { + log_err("%%o Got: %o, Expected: %o\n", *newValuePtr, *n); + } + *newValuePtr = 1; + u_fscanf(myFile, "Unsigned decimal integer %%u: %u\n", newValuePtr); + if (*n != *newValuePtr) { + log_err("%%u Got: %u, Expected: %u\n", *newValuePtr, *n); + } + *newValuePtr = 1; + u_fscanf(myFile, "Lowercase unsigned hexadecimal integer %%x: %x\n", newValuePtr); + if (*n != *newValuePtr) { + log_err("%%x Got: %x, Expected: %x\n", *newValuePtr, *n); + } + *newValuePtr = 1; + u_fscanf(myFile, "Uppercase unsigned hexadecimal integer %%X: %X\n", newValuePtr); + if (*n != *newValuePtr) { + log_err("%%X Got: %X, Expected: %X\n", *newValuePtr, *n); + } + *newDoubleValuePtr = -1.0; + u_fscanf(myFile, "Float %%f: %f\n", newDoubleValuePtr); + if (myFloat != *newDoubleValuePtr) { + log_err("%%f Got: %f, Expected: %f\n", *newDoubleValuePtr, myFloat); + } + *newDoubleValuePtr = -1.0; + u_fscanf(myFile, "Lowercase float %%e: %e\n", newDoubleValuePtr); + if (myFloat != *newDoubleValuePtr) { + log_err("%%e Got: %e, Expected: %e\n", *newDoubleValuePtr, myFloat); + } + *newDoubleValuePtr = -1.0; + u_fscanf(myFile, "Uppercase float %%E: %E\n", newDoubleValuePtr); + if (myFloat != *newDoubleValuePtr) { + log_err("%%E Got: %E, Expected: %E\n", *newDoubleValuePtr, myFloat); + } + *newDoubleValuePtr = -1.0; + u_fscanf(myFile, "Lowercase float %%g: %g\n", newDoubleValuePtr); + if (myFloat != *newDoubleValuePtr) { + log_err("%%g Got: %g, Expected: %g\n", *newDoubleValuePtr, myFloat); + } + *newDoubleValuePtr = -1.0; + u_fscanf(myFile, "Uppercase float %%G: %G\n", newDoubleValuePtr); + if (myFloat != *newDoubleValuePtr) { + log_err("%%G Got: %G, Expected: %G\n", *newDoubleValuePtr, myFloat); + } + ptr = NULL; + u_fscanf(myFile, "Pointer %%p: %p\n", &ptr); + if (ptr != origPtr) { + log_err("%%p Got: %p, Expected: %p\n", ptr, origPtr); + } + u_fscanf(myFile, "Char %%c: %c\n", myString); + if (*myString != 'A') { + log_err("%%c Got: %c, Expected: A\n", *myString); + } + u_fscanf(myFile, "UChar %%C: %C\n", myUString); + if (*myUString != (UChar)0x0041) { /*'A'*/ + log_err("%%C Got: %C, Expected: A\n", *myUString); + } + u_fscanf(myFile, "String %%s: %s\n", myString); + if (strcmp(myString, "My-String")) { + log_err("%%s Got: %s, Expected: My String\n", myString); + } + u_fscanf(myFile, "NULL String %%s: %s\n", myString); + if (strcmp(myString, "(null)")) { + log_err("%%s Got: %s, Expected: My String\n", myString); + } + u_fscanf(myFile, "Unicode String %%S: %S\n", myUString); + u_austrncpy(myString, myUString, sizeof(myUString)/sizeof(*myUString)); + if (strcmp(myString, "My-String")) { + log_err("%%S Got: %S, Expected: My String\n", myUString); + } + u_fscanf(myFile, "NULL Unicode String %%S: %S\n", myUString); + u_austrncpy(myString, myUString, sizeof(myUString)/sizeof(*myUString)); + if (strcmp(myString, "(null)")) { + log_err("%%S Got: %S, Expected: My String\n", myUString); + } + *newDoubleValuePtr = -1.0; + u_fscanf(myFile, "Percent %%P (non-ANSI): %P\n", newDoubleValuePtr); + if (myFloat != *newDoubleValuePtr) { + log_err("%%P Got: %f, Expected: %f\n", *newDoubleValuePtr, myFloat); + } + *newDoubleValuePtr = -1.0; + u_fscanf(myFile, "Spell Out %%V (non-ANSI): %V\n", newDoubleValuePtr); + if (myFloat != *newDoubleValuePtr) { + log_err("%%V Got: %f, Expected: %f\n", *newDoubleValuePtr, myFloat); + } + + u_fgets(myUString, 4, myFile); + u_austrncpy(myString, myUString, sizeof(myUString)/sizeof(*myUString)); + if (myString == NULL || strcmp(myString, "\t\n") != 0) { + log_err("u_fgets got \"%s\"\n", myString); + } + + if (u_fgets(myUString, sizeof(myUString)/sizeof(*myUString), myFile) != myUString) { + log_err("u_fgets did not return myUString\n"); + } + u_austrncpy(myString, myUString, sizeof(myUString)/sizeof(*myUString)); + if (myString == NULL || strcmp(myString, "Pointer to integer (Count) %n: n=1 n=1\n") != 0) { + log_err("u_fgets got \"%s\"\n", myString); + } + + if (u_fgets(myUString, sizeof(myUString)/sizeof(*myUString), myFile) != myUString) { + log_err("u_fgets did not return myUString\n"); + } + u_austrncpy(myString, myUString, sizeof(myUString)/sizeof(*myUString)); + if (myString == NULL || strcmp(myString, "Pointer to integer Value: 37\n") != 0) { + log_err("u_fgets got \"%s\"\n", myString); + } + + if (u_fgets(myUString, sizeof(myUString)/sizeof(*myUString), myFile) != myUString) { + log_err("u_fgets did not return myUString\n"); + } + u_austrncpy(myString, myUString, sizeof(myUString)/sizeof(*myUString)); + if (myString == NULL || strcmp(myString, "This is a long test123456789012345678901234567890123456789012345678901234567890\n") != 0) { + log_err("u_fgets got \"%s\"\n", myString); + } + + if (u_fgets(myUString, 0, myFile) != NULL) { + log_err("u_fgets got \"%s\" and it should have returned NULL\n", myString); + } + + if (u_fgets(myUString, 1, myFile) != myUString) { + log_err("u_fgets did not return myUString\n"); + } + u_austrncpy(myString, myUString, sizeof(myUString)/sizeof(*myUString)); + if (myString == NULL || strcmp(myString, "") != 0) { + log_err("u_fgets got \"%s\"\n", myString); + } + + if (u_fgets(myUString, 2, myFile) != myUString) { + log_err("u_fgets did not return myUString\n"); + } + u_austrncpy(myString, myUString, sizeof(myUString)/sizeof(*myUString)); + if (myString == NULL || strcmp(myString, "\t") != 0) { + log_err("u_fgets got \"%s\"\n", myString); + } + + u_austrncpy(myString, u_fgets(myUString, sizeof(myUString)/sizeof(*myUString), myFile), + sizeof(myUString)/sizeof(*myUString)); + if (strcmp(myString, "Normal fprintf count: n=1 n=1\n") != 0) { + log_err("u_fgets got \"%s\"\n", myString); + } + + if (u_feof(myFile)) { + log_err("Got feof while reading the file and not at the end of the file.\n"); + } + u_austrncpy(myString, u_fgets(myUString, sizeof(myUString)/sizeof(*myUString), myFile), + sizeof(myUString)/sizeof(*myUString)); + if (strcmp(myString, "\tNormal fprintf count value: n=27\n") != 0) { + log_err("u_fgets got \"%s\"\n", myString); + } + if (!u_feof(myFile)) { + log_err("Did not get feof while reading the end of the file.\n"); + } + if (u_fscanf(myFile, "%S\n", myUString) != 0) { + log_err("u_fscanf read data while reading the end of the file.\n"); + } + + u_fclose(myFile); +} + +static void TestFile(void) { +/* FILE *standardFile;*/ + + log_verbose("Testing u_fopen\n"); + TestFileFromICU(u_fopen(STANDARD_TEST_FILE, "w", NULL, NULL)); + +/* Don't know how to make this work without stdout or stderr */ +/* + log_verbose("Testing u_finit\n"); + standardFile = fopen(STANDARD_TEST_FILE, "wb"); + TestFileFromICU(u_finit(standardFile, NULL, NULL)); + fclose(standardFile); +*/ +} +#endif + +static void StdinBuffering(void) { +#if 0 + UChar buff[255]; + int32_t num = 0; + UFILE *uStdIn = NULL; + UFILE *uStdOut = NULL; + uStdIn = u_finit(stdin, NULL, NULL); + uStdOut = u_finit(stdout, NULL, NULL); + if (uStdIn == NULL) + return; + + buff[0] = 0x40; + buff[1] = 0; + u_fgets(buff, sizeof(buff)/sizeof(buff[0]), uStdIn); + u_fprintf(uStdOut, "%S\n", buff); + u_fscanf(uStdIn, "%d", &num); + u_fprintf(uStdOut, "%d\n", num); + u_fscanf(uStdIn, "%d", &num); + u_fprintf(uStdOut, "%d\n", num); +#else + log_verbose("Test disabled because it requires user interaction"); +#endif +} + +static void TestCodepageAndLocale(void) { + UFILE *myFile = u_fopen(STANDARD_TEST_FILE, "w", NULL, NULL); + if (myFile == NULL) { + log_err("Can't write test file.\n"); + return; + } + if (u_fgetcodepage(myFile) == NULL + || strcmp(u_fgetcodepage(myFile), ucnv_getDefaultName()) != 0) + { + log_err("Didn't get the proper default codepage. Got %s expected: %s\n", + u_fgetcodepage(myFile), ucnv_getDefaultName()); + } +#if !UCONFIG_NO_FORMATTING + if (u_fgetlocale(myFile) == NULL + || strcmp(u_fgetlocale(myFile), uloc_getDefault()) != 0) + { + log_err("Didn't get the proper default locale. Got %s expected: %s\n", + u_fgetlocale(myFile), uloc_getDefault()); + } +#endif + u_fclose(myFile); + + myFile = u_fopen(STANDARD_TEST_FILE, "w", "es", NULL); + if (u_fgetcodepage(myFile) == NULL + || strcmp(u_fgetcodepage(myFile), ucnv_getDefaultName()) != 0) + { + log_err("Didn't get the proper default codepage for \"es\". Got %s expected: iso-8859-1\n", + u_fgetcodepage(myFile)); + } +#if !UCONFIG_NO_FORMATTING + if (u_fgetlocale(myFile) == NULL + || strcmp(u_fgetlocale(myFile), "es") != 0) + { + log_err("Didn't get the proper default locale. Got %s expected: %s\n", + u_fgetlocale(myFile), "es"); + } +#endif + u_fclose(myFile); + + myFile = u_fopen(STANDARD_TEST_FILE, "w", NULL, "UTF-16"); + if (u_fgetcodepage(myFile) == NULL + || strcmp(u_fgetcodepage(myFile), "UTF-16") != 0) + { + log_err("Didn't get the proper default codepage for \"en\". Got %s expected: iso-8859-1\n", + u_fgetcodepage(myFile)); + } +#if !UCONFIG_NO_FORMATTING + if (u_fgetlocale(myFile) == NULL + || strcmp(u_fgetlocale(myFile), uloc_getDefault()) != 0) + { + log_err("Didn't get the proper default locale. Got %s expected: %s\n", + u_fgetlocale(myFile), uloc_getDefault()); + } +#endif + u_fclose(myFile); + + myFile = u_fopen(STANDARD_TEST_FILE, "w", "zh", "UTF-16"); + if (u_fgetcodepage(myFile) == NULL + || strcmp(u_fgetcodepage(myFile), "UTF-16") != 0) + { + log_err("Didn't get the proper default codepage for \"en\". Got %s expected: iso-8859-1\n", + u_fgetcodepage(myFile)); + } +#if !UCONFIG_NO_FORMATTING + if (u_fgetlocale(myFile) == NULL + || strcmp(u_fgetlocale(myFile), "zh") != 0) + { + log_err("Didn't get the proper default locale. Got %s expected: %s\n", + u_fgetlocale(myFile), "zh"); + } +#endif + u_fclose(myFile); +} + + +static void TestfgetsBuffers(void) { + UChar buffer[2048]; + UChar expectedBuffer[2048]; + static const char testStr[] = "This is a test string that tests u_fgets. It makes sure that we don't try to read too much!"; + UFILE *myFile = u_fopen(STANDARD_TEST_FILE, "w", NULL, "UTF-16"); + int32_t expectedSize = (int32_t)strlen(testStr); + int32_t readSize; + int32_t repetitions; + + if (myFile == NULL) { + log_err("Can't write test file.\n"); + return; + } + + u_fputc(0x3BC, myFile); + u_fputc(0xFF41, myFile); + u_memset(buffer, 0xBEEF, sizeof(buffer)/sizeof(buffer[0])); + u_memset(expectedBuffer, 0, sizeof(expectedBuffer)/sizeof(expectedBuffer[0])); + u_uastrncpy(buffer, testStr, expectedSize+1); + for (repetitions = 0; repetitions < 16; repetitions++) { + u_file_write(buffer, expectedSize, myFile); + u_strcat(expectedBuffer, buffer); + } + u_fclose(myFile); + + u_memset(buffer, 0xBEEF, sizeof(buffer)/sizeof(buffer[0])); + myFile = u_fopen(STANDARD_TEST_FILE, "r", NULL, "UTF-16"); + if (u_fgetc(myFile) != 0x3BC) { + log_err("The first character is wrong\n"); + } + if (u_fgetc(myFile) != 0xFF41) { + log_err("The second character is wrong\n"); + } + if (u_fgets(buffer, sizeof(buffer)/sizeof(buffer[0]), myFile) != buffer) { + log_err("Didn't get the buffer back\n"); + return; + } + readSize = u_strlen(buffer); + if (readSize != expectedSize*repetitions) { + log_err("Buffer is the wrong size. Got %d Expected %d\n", u_strlen(buffer), expectedSize*repetitions); + } + if (buffer[(expectedSize*repetitions) + 1] != 0xBEEF) { + log_err("u_fgets wrote too much data\n"); + } + if (u_strcmp(buffer, expectedBuffer) != 0) { + log_err("Did get expected string back\n"); + } + if (strcmp(u_fgetcodepage(myFile), "UTF-16") != 0) { + log_err("Got %s instead of UTF-16\n", u_fgetcodepage(myFile)); + } + u_fclose(myFile); + + log_verbose("Now trying a multi-byte encoding (UTF-8).\n"); + + myFile = u_fopen(STANDARD_TEST_FILE, "w", NULL, "UTF-8"); + + u_fputc(0x3BC, myFile); + u_fputc(0xFF41, myFile); + u_memset(buffer, 0xBEEF, sizeof(buffer)/sizeof(buffer[0])); + u_memset(expectedBuffer, 0, sizeof(expectedBuffer)/sizeof(expectedBuffer[0])); + u_uastrncpy(buffer, testStr, expectedSize+1); + for (repetitions = 0; repetitions < 16; repetitions++) { + u_file_write(buffer, expectedSize, myFile); + u_strcat(expectedBuffer, buffer); + } + u_fclose(myFile); + + u_memset(buffer, 0xBEEF, sizeof(buffer)/sizeof(buffer[0])); + myFile = u_fopen(STANDARD_TEST_FILE, "r", NULL, "UTF-8"); + if (strcmp(u_fgetcodepage(myFile), "UTF-8") != 0) { + log_err("Got %s instead of UTF-8\n", u_fgetcodepage(myFile)); + } + if (u_fgetc(myFile) != 0x3BC) { + log_err("The first character is wrong\n"); + } + if (u_fgetc(myFile) != 0xFF41) { + log_err("The second character is wrong\n"); + } + if (u_fgets(buffer, sizeof(buffer)/sizeof(buffer[0]), myFile) != buffer) { + log_err("Didn't get the buffer back\n"); + return; + } + readSize = u_strlen(buffer); + if (readSize != expectedSize*repetitions) { + log_err("Buffer is the wrong size. Got %d Expected %d\n", u_strlen(buffer), expectedSize*repetitions); + } + if (buffer[(expectedSize*repetitions) + 1] != 0xBEEF) { + log_err("u_fgets wrote too much data\n"); + } + if (u_strcmp(buffer, expectedBuffer) != 0) { + log_err("Did get expected string back\n"); + } + u_fclose(myFile); + + + log_verbose("Now trying a multi-byte encoding (UTF-8) with a really small buffer.\n"); + + myFile = u_fopen(STANDARD_TEST_FILE, "w", NULL, "UTF-8"); + + u_fputc(0xFF41, myFile); + u_memset(buffer, 0xBEEF, sizeof(buffer)/sizeof(buffer[0])); + u_memset(expectedBuffer, 0, sizeof(expectedBuffer)/sizeof(expectedBuffer[0])); + u_uastrncpy(buffer, testStr, expectedSize+1); + for (repetitions = 0; repetitions < 1; repetitions++) { + u_file_write(buffer, expectedSize, myFile); + u_strcat(expectedBuffer, buffer); + } + u_fclose(myFile); + + u_memset(buffer, 0xBEEF, sizeof(buffer)/sizeof(buffer[0])); + myFile = u_fopen(STANDARD_TEST_FILE, "r", NULL, "UTF-8"); + if (u_fgets(buffer, 2, myFile) != buffer) { + log_err("Didn't get the buffer back\n"); + return; + } + readSize = u_strlen(buffer); + if (readSize != 1) { + log_err("Buffer is the wrong size. Got %d Expected %d\n", u_strlen(buffer), 1); + } + if (buffer[0] != 0xFF41 || buffer[1] != 0) { + log_err("Did get expected string back\n"); + } + if (buffer[2] != 0xBEEF) { + log_err("u_fgets wrote too much data\n"); + } + u_fclose(myFile); + +} + +static void TestFileReadBuffering(void) { + UChar buffer[1024]; + UFILE *myFile = u_fopen(STANDARD_TEST_FILE, "w", NULL, "UTF-16"); + int32_t how_many; + int32_t repetitions; + + u_memset(buffer, 0xBEEF, sizeof(buffer)/sizeof(buffer[0])); + for (repetitions = 0; repetitions < 2; repetitions++) { + u_file_write(buffer, sizeof(buffer)/sizeof(buffer[0]), myFile); + } + + u_fclose(myFile); + u_memset(buffer, 0xDEAD, sizeof(buffer)/sizeof(buffer[0])); + myFile = u_fopen(STANDARD_TEST_FILE, "r", NULL, "UTF-16"); + how_many = u_file_read(buffer, 1024, myFile); + if (how_many != 1024 || buffer[1023] != 0xBEEF) { + log_err("u_file_read read too much or not enough data\n"); + } + u_fclose(myFile); +} + +static void TestfgetsLineCount(void) { + UChar buffer[2048]; + UChar expectedBuffer[2048]; + char charBuffer[2048]; + static const char testStr[] = "This is a test string that tests u_fgets. It makes sure that we don't try to read too much!"; + UFILE *myFile = NULL; + FILE *stdFile = fopen(STANDARD_TEST_FILE, "w"); + int32_t expectedSize = (int32_t)strlen(testStr); + int32_t repetitions; + int32_t nlRepetitions; + + if (stdFile == NULL) { + log_err("Can't write test file.\n"); + return; + } + u_memset(expectedBuffer, 0, sizeof(expectedBuffer)/sizeof(expectedBuffer[0])); + + for (repetitions = 0; repetitions < 16; repetitions++) { + fwrite(testStr, sizeof(testStr[0]), expectedSize, stdFile); + for (nlRepetitions = 0; nlRepetitions < repetitions; nlRepetitions++) { + fwrite("\n", sizeof(testStr[0]), 1, stdFile); + } + } + fclose(stdFile); + + myFile = u_fopen(STANDARD_TEST_FILE, "r", NULL, NULL); + stdFile = fopen(STANDARD_TEST_FILE, "r"); + + for (;;) { + char *returnedCharBuffer; + UChar *returnedUCharBuffer; + + u_memset(buffer, 0xBEEF, sizeof(buffer)/sizeof(buffer[0])); + returnedCharBuffer = fgets(charBuffer, sizeof(charBuffer)/sizeof(charBuffer[0]), stdFile); + returnedUCharBuffer = u_fgets(buffer, sizeof(buffer)/sizeof(buffer[0]), myFile); + + if (!returnedCharBuffer && !returnedUCharBuffer) { + /* Both returned NULL. stop. */ + break; + } + if (returnedCharBuffer != charBuffer) { + log_err("Didn't get the charBuffer back\n"); + continue; + } + u_uastrncpy(expectedBuffer, charBuffer, (int32_t)strlen(charBuffer)+1); + if (returnedUCharBuffer != buffer) { + log_err("Didn't get the buffer back\n"); + continue; + } + if (u_strcmp(buffer, expectedBuffer) != 0) { + log_err("buffers are different\n"); + } + if (buffer[u_strlen(buffer)+1] != 0xBEEF) { + log_err("u_fgets wrote too much\n"); + } + } + fclose(stdFile); + u_fclose(myFile); +} + +static void TestfgetsNewLineHandling(void) { + UChar buffer[256]; + static const UChar testUStr[][16] = { + {0x000D, 0}, + {0x000D, 0x000A, 0}, + {0x000D, 0}, + {0x000D, 0}, + {0x0085, 0}, + {0x000A, 0}, + {0x000D, 0}, + {0x000B, 0}, + {0x000C, 0}, + {0x000C, 0}, + {0x2028, 0}, + {0x0085, 0}, + {0x2029, 0}, + {0x0085, 0}, + + {0x008B, 0x000D, 0}, + {0x00A0, 0x000D, 0x000A, 0}, + {0x3000, 0x000D, 0}, + {0xd800, 0xdfff, 0x000D, 0}, + {0x00AB, 0x0085, 0}, + {0x00AC, 0x000A, 0}, + {0x00AD, 0x000D, 0}, + {0x00BA, 0x000B, 0}, + {0x00AB, 0x000C, 0}, + {0x00B1, 0x000C, 0}, + {0x30BB, 0x2028, 0}, + {0x00A5, 0x0085, 0}, + {0x0080, 0x2029, 0}, + {0x00AF, 0x0085, 0} + + }; + UFILE *myFile = NULL; + int32_t lineIdx; + + myFile = u_fopen(STANDARD_TEST_FILE, "wb", NULL, "UTF-8"); + if (myFile == NULL) { + log_err("Can't write test file.\n"); + return; + } + for (lineIdx = 0; lineIdx < (int32_t)(sizeof(testUStr)/sizeof(testUStr[0])); lineIdx++) { + u_file_write(testUStr[lineIdx], u_strlen(testUStr[lineIdx]), myFile); + } + u_fclose(myFile); + + myFile = u_fopen(STANDARD_TEST_FILE, "rb", NULL, "UTF-8"); + + for (lineIdx = 0; lineIdx < (int32_t)(sizeof(testUStr)/sizeof(testUStr[0])); lineIdx++) { + UChar *returnedUCharBuffer; + + u_memset(buffer, 0xBEEF, sizeof(buffer)/sizeof(buffer[0])); + returnedUCharBuffer = u_fgets(buffer, sizeof(buffer)/sizeof(buffer[0]), myFile); + + if (!returnedUCharBuffer) { + /* Returned NULL. stop. */ + break; + } + if (u_strcmp(buffer, testUStr[lineIdx]) != 0) { + log_err("buffers are different at index = %d\n", lineIdx); + } + if (buffer[u_strlen(buffer)+1] != 0xBEEF) { + log_err("u_fgets wrote too much\n"); + } + } + if (lineIdx != (int32_t)(sizeof(testUStr)/sizeof(testUStr[0]))) { + log_err("u_fgets read too much\n"); + } + if (u_fgets(buffer, sizeof(buffer)/sizeof(buffer[0]), myFile) != NULL) { + log_err("u_file_write wrote too much\n"); + } + u_fclose(myFile); +} + + +static void TestCodepage(void) { + UFILE *myFile = NULL; + static const UChar strABAccentA[] = { 0x0041, 0x0042, 0x00C1, 0x0043, 0}; + static const UChar strBadConversion[] = { 0x0041, 0x0042, 0xfffd, 0x0043, 0}; + UChar testBuf[sizeof(strABAccentA)/sizeof(strABAccentA[0])*2]; /* *2 to see if too much was */ + char convName[UCNV_MAX_CONVERTER_NAME_LENGTH]; + int32_t retVal; + UErrorCode status = U_ZERO_ERROR; + + myFile = u_fopen(STANDARD_TEST_FILE, "w", NULL, "absurd converter that can't be opened"); + + if (myFile) { + log_err("Recieved a UFILE * with an invalid codepage parameter\n"); + u_fclose(myFile); + } + + myFile = u_fopen(STANDARD_TEST_FILE, "w", NULL, "ISO-8859-1"); + if (myFile == NULL) { + log_err("Can't write test file for iso-8859-1.\n"); + return; + } + if (strcmp("ISO-8859-1", u_fgetcodepage(myFile)) != 0) { + log_err("Couldn't get ISO-8859-1 back as opened codepage\n"); + } + u_file_write(strABAccentA, u_strlen(strABAccentA), myFile); + u_fclose(myFile); + + /* Now see what we got wrote */ + myFile = u_fopen(STANDARD_TEST_FILE, "r", NULL, NULL); + if (u_fsetcodepage("ISO-8859-1", myFile) != 0) { + log_err("u_fsetcodepage didn't set the codepage\n"); + } + retVal = u_file_read(testBuf, u_strlen(strABAccentA), myFile); + if (u_strncmp(strABAccentA, testBuf, u_strlen(strABAccentA)) != 0) { + log_err("The test data was read and written differently!\n"); + } + if (retVal != u_strlen(strABAccentA)) { + log_err("The test data returned different lengths. Got: %d, Expected %d\n", retVal, u_strlen(strABAccentA)); + } + u_fclose(myFile); + + /* What happens on invalid input? */ + myFile = u_fopen(STANDARD_TEST_FILE, "r", NULL, "ISO-8859-1"); + if (strcmp(ucnv_getName(u_fgetConverter(myFile), &status), "ISO-8859-1") != 0) { + log_err("u_fgetConverter returned %s\n", ucnv_getName(u_fgetConverter(myFile), &status)); + } + if (u_fsetcodepage("UTF-8", myFile) != 0) { + log_err("u_fsetcodepage didn't set the codepage to UTF-8\n"); + } + if (strcmp(ucnv_getName(u_fgetConverter(myFile), &status), "UTF-8") != 0) { + log_err("u_fgetConverter returned %s\n", ucnv_getName(u_fgetConverter(myFile), &status)); + } + retVal = u_file_read(testBuf, u_strlen(strBadConversion), myFile); + if (u_strncmp(strBadConversion, testBuf, u_strlen(strBadConversion)) != 0) { + log_err("The test data wasn't subsituted as expected\n"); + } + u_fclose(myFile); + + /* Can't currently swap codepages midstream */ + myFile = u_fopen(STANDARD_TEST_FILE, "r", NULL, "ISO-8859-1"); + strcpy(convName, u_fgetcodepage(myFile)); + u_file_read(testBuf, 1, myFile); + if (u_fsetcodepage("UTF-8", myFile) == 0) { + log_err("u_fsetcodepage set the codepage after reading a byte\n"); + } + retVal = u_file_read(testBuf + 1, u_strlen(strABAccentA) - 1, myFile); + if (u_strncmp(strABAccentA, testBuf, u_strlen(strABAccentA)) != 0) { + log_err("u_fsetcodepage changed the codepages after writing data\n"); + } + if ((retVal + 1) != u_strlen(strABAccentA)) { + log_err("The test data returned different lengths. Got: %d, Expected %d\n", retVal, u_strlen(strABAccentA)); + } + u_frewind(myFile); + retVal = u_file_read(testBuf, u_strlen(strABAccentA), myFile); + if (u_strncmp(strABAccentA, testBuf, u_strlen(strABAccentA)) != 0) { + log_err("The test data was read and written differently!\n"); + } + if (retVal != u_strlen(strABAccentA)) { + log_err("The test data returned different lengths. Got: %d, Expected %d\n", retVal, u_strlen(strABAccentA)); + } + u_fclose(myFile); + +} + +#if !UCONFIG_NO_FORMATTING +static void TestFilePrintCompatibility(void) { + UFILE *myFile = u_fopen(STANDARD_TEST_FILE, "wb", "en_US_POSIX", NULL); + FILE *myCFile; + int32_t num; + char cVal; + static const UChar emptyStr[] = {0}; + char readBuf[512] = ""; + char testBuf[512] = ""; + + if (myFile == NULL) { + log_err("Can't write test file.\n"); + return; + } +#if !UCONFIG_NO_FORMATTING + if (strcmp(u_fgetlocale(myFile), "en_US_POSIX") != 0) { + log_err("Got %s instead of en_US_POSIX for locale\n", u_fgetlocale(myFile)); + } +#endif + + /* Compare against C API compatibility */ + for (num = -STANDARD_TEST_NUM_RANGE; num < STANDARD_TEST_NUM_RANGE; num++) { + u_fprintf(myFile, "%x ", num); + u_fprintf(myFile, "%X ", num); + u_fprintf(myFile, "%o ", num); + u_fprintf(myFile, "%d ", num); + u_fprintf(myFile, "%i ", num); + u_fprintf(myFile, "%f ", (double)num); +/* u_fprintf(myFile, "%e ", (double)num); + u_fprintf(myFile, "%E ", (double)num);*/ + u_fprintf(myFile, "%g ", (double)num); + u_fprintf(myFile, "%G", (double)num); + u_fputs(emptyStr, myFile); + } + + u_fprintf_u(myFile, NEW_LINE); + + for (num = 0; num < 0x80; num++) { + u_fprintf(myFile, "%c", num); + } + + u_fclose(myFile); + myCFile = fopen(STANDARD_TEST_FILE, "rb"); + if (myCFile == NULL) { + log_err("Can't read test file."); + return; + } + + for (num = -STANDARD_TEST_NUM_RANGE; num < STANDARD_TEST_NUM_RANGE; num++) { + fscanf(myCFile, "%s", readBuf); + sprintf(testBuf, "%x", (int)num); + if (strcmp(readBuf, testBuf) != 0) { + log_err("%%x Got: \"%s\", Expected: \"%s\"\n", readBuf, testBuf); + } + + fscanf(myCFile, "%s", readBuf); + sprintf(testBuf, "%X", (int)num); + if (strcmp(readBuf, testBuf) != 0) { + log_err("%%X Got: \"%s\", Expected: \"%s\"\n", readBuf, testBuf); + } + + fscanf(myCFile, "%s", readBuf); + sprintf(testBuf, "%o", (int)num); + if (strcmp(readBuf, testBuf) != 0) { + log_err("%%o Got: \"%s\", Expected: \"%s\"\n", readBuf, testBuf); + } + + /* fprintf is not compatible on all platforms e.g. the iSeries */ + fscanf(myCFile, "%s", readBuf); + sprintf(testBuf, "%d", (int)num); + if (strcmp(readBuf, testBuf) != 0) { + log_err("%%d Got: \"%s\", Expected: \"%s\"\n", readBuf, testBuf); + } + + fscanf(myCFile, "%s", readBuf); + sprintf(testBuf, "%i", (int)num); + if (strcmp(readBuf, testBuf) != 0) { + log_err("%%i Got: \"%s\", Expected: \"%s\"\n", readBuf, testBuf); + } + + fscanf(myCFile, "%s", readBuf); + sprintf(testBuf, "%f", (double)num); + if (strcmp(readBuf, testBuf) != 0) { + log_err("%%f Got: \"%s\", Expected: \"%s\"\n", readBuf, testBuf); + } + +/* fscanf(myCFile, "%s", readBuf); + sprintf(testBuf, "%e", (double)num); + if (strcmp(readBuf, testBuf) != 0) { + log_err("%%e Got: \"%s\", Expected: \"%s\"\n", readBuf, testBuf); + } + + fscanf(myCFile, "%s", readBuf); + sprintf(testBuf, "%E", (double)num); + if (strcmp(readBuf, testBuf) != 0) { + log_err("%%E Got: \"%s\", Expected: \"%s\"\n", readBuf, testBuf); + }*/ + + fscanf(myCFile, "%s", readBuf); + sprintf(testBuf, "%g", (double)num); + if (strcmp(readBuf, testBuf) != 0) { + log_err("%%g Got: \"%s\", Expected: \"%s\"\n", readBuf, testBuf); + } + + fscanf(myCFile, "%s", readBuf); + sprintf(testBuf, "%G", (double)num); + if (strcmp(readBuf, testBuf) != 0) { + log_err("%%G Got: \"%s\", Expected: \"%s\"\n", readBuf, testBuf); + } + } + + /* Properly eat the newlines */ + for (num = 0; num < (int32_t)strlen(C_NEW_LINE); num++) { + fscanf(myCFile, "%c", &cVal); + if (cVal != C_NEW_LINE[num]) { + log_err("OS newline error\n"); + } + } + for (num = 0; num < (int32_t)strlen(C_NEW_LINE); num++) { + fscanf(myCFile, "%c", &cVal); + if (cVal != C_NEW_LINE[num]) { + log_err("ustdio newline error\n"); + } + } + + for (num = 0; num < 0x80; num++) { + cVal = -1; + fscanf(myCFile, "%c", &cVal); + if (num != cVal) { + log_err("%%c Got: 0x%x, Expected: 0x%x\n", cVal, num); + } + } + fclose(myCFile); +} +#endif + +#define TestFPrintFormat(uFormat, uValue, cFormat, cValue) \ + myFile = u_fopen(STANDARD_TEST_FILE, "w", "en_US_POSIX", NULL);\ + if (myFile == NULL) {\ + log_err("Can't write test file for %s.\n", uFormat);\ + return;\ + }\ + /* Reinitialize the buffer to verify null termination works. */\ + u_memset(uBuffer, 0x2a, sizeof(uBuffer)/sizeof(*uBuffer));\ + memset(buffer, '*', sizeof(buffer)/sizeof(*buffer));\ + \ + uNumPrinted = u_fprintf(myFile, uFormat, uValue);\ + u_fclose(myFile);\ + myFile = u_fopen(STANDARD_TEST_FILE, "r", "en_US_POSIX", NULL);\ + u_fgets(uBuffer, sizeof(uBuffer)/sizeof(*uBuffer), myFile);\ + u_fclose(myFile);\ + u_austrncpy(compBuffer, uBuffer, sizeof(uBuffer)/sizeof(*uBuffer));\ + cNumPrinted = sprintf(buffer, cFormat, cValue);\ + if (strcmp(buffer, compBuffer) != 0) {\ + log_err("%" uFormat " Got: \"%s\", Expected: \"%s\"\n", compBuffer, buffer);\ + }\ + if (cNumPrinted != uNumPrinted) {\ + log_err("%" uFormat " number printed Got: %d, Expected: %d\n", uNumPrinted, cNumPrinted);\ + }\ + if (buffer[uNumPrinted+1] != '*') {\ + log_err("%" uFormat " too much stored\n");\ + }\ + +#if !UCONFIG_NO_FORMATTING +static void TestFprintfFormat(void) { + static const UChar abcUChars[] = {0x61,0x62,0x63,0}; + static const char abcChars[] = "abc"; + UChar uBuffer[256]; + char buffer[256]; + char compBuffer[256]; + int32_t uNumPrinted; + int32_t cNumPrinted; + UFILE *myFile; + + TestFPrintFormat("%8S", abcUChars, "%8s", abcChars); + TestFPrintFormat("%-8S", abcUChars, "%-8s", abcChars); + TestFPrintFormat("%.2S", abcUChars, "%.2s", abcChars); /* strlen is 3 */ + + TestFPrintFormat("%8s", abcChars, "%8s", abcChars); + TestFPrintFormat("%-8s", abcChars, "%-8s", abcChars); + TestFPrintFormat("%.2s", abcChars, "%.2s", abcChars); /* strlen is 3 */ + + TestFPrintFormat("%8c", (char)'e', "%8c", (char)'e'); + TestFPrintFormat("%-8c", (char)'e', "%-8c", (char)'e'); + + TestFPrintFormat("%8C", (UChar)0x65, "%8c", (char)'e'); + TestFPrintFormat("%-8C", (UChar)0x65, "%-8c", (char)'e'); + + TestFPrintFormat("%f", 1.23456789, "%f", 1.23456789); + TestFPrintFormat("%f", 12345.6789, "%f", 12345.6789); + TestFPrintFormat("%f", 123456.789, "%f", 123456.789); + TestFPrintFormat("%f", 1234567.89, "%f", 1234567.89); + TestFPrintFormat("%10f", 1.23456789, "%10f", 1.23456789); + TestFPrintFormat("%-10f", 1.23456789, "%-10f", 1.23456789); + TestFPrintFormat("%10f", 123.456789, "%10f", 123.456789); + TestFPrintFormat("%10.4f", 123.456789, "%10.4f", 123.456789); + TestFPrintFormat("%-10f", 123.456789, "%-10f", 123.456789); + +/* TestFPrintFormat("%g", 12345.6789, "%g", 12345.6789); + TestFPrintFormat("%g", 123456.789, "%g", 123456.789); + TestFPrintFormat("%g", 1234567.89, "%g", 1234567.89); + TestFPrintFormat("%G", 123456.789, "%G", 123456.789); + TestFPrintFormat("%G", 1234567.89, "%G", 1234567.89);*/ + TestFPrintFormat("%10g", 1.23456789, "%10g", 1.23456789); + TestFPrintFormat("%10.4g", 1.23456789, "%10.4g", 1.23456789); + TestFPrintFormat("%-10g", 1.23456789, "%-10g", 1.23456789); + TestFPrintFormat("%10g", 123.456789, "%10g", 123.456789); + TestFPrintFormat("%-10g", 123.456789, "%-10g", 123.456789); + + TestFPrintFormat("%8x", 123456, "%8x", 123456); + TestFPrintFormat("%-8x", 123456, "%-8x", 123456); + TestFPrintFormat("%08x", 123456, "%08x", 123456); + + TestFPrintFormat("%8X", 123456, "%8X", 123456); + TestFPrintFormat("%-8X", 123456, "%-8X", 123456); + TestFPrintFormat("%08X", 123456, "%08X", 123456); + TestFPrintFormat("%#x", 123456, "%#x", 123456); + TestFPrintFormat("%#x", -123456, "%#x", -123456); + + TestFPrintFormat("%8o", 123456, "%8o", 123456); + TestFPrintFormat("%-8o", 123456, "%-8o", 123456); + TestFPrintFormat("%08o", 123456, "%08o", 123456); + TestFPrintFormat("%#o", 123, "%#o", 123); + TestFPrintFormat("%#o", -123, "%#o", -123); + + TestFPrintFormat("%8u", 123456, "%8u", 123456); + TestFPrintFormat("%-8u", 123456, "%-8u", 123456); + TestFPrintFormat("%08u", 123456, "%08u", 123456); + TestFPrintFormat("%8u", -123456, "%8u", -123456); + TestFPrintFormat("%-8u", -123456, "%-8u", -123456); + TestFPrintFormat("%.5u", 123456, "%.5u", 123456); + TestFPrintFormat("%.6u", 123456, "%.6u", 123456); + TestFPrintFormat("%.7u", 123456, "%.7u", 123456); + + TestFPrintFormat("%8d", 123456, "%8d", 123456); + TestFPrintFormat("%-8d", 123456, "%-8d", 123456); + TestFPrintFormat("%08d", 123456, "%08d", 123456); + TestFPrintFormat("% d", 123456, "% d", 123456); + TestFPrintFormat("% d", -123456, "% d", -123456); + + TestFPrintFormat("%8i", 123456, "%8i", 123456); + TestFPrintFormat("%-8i", 123456, "%-8i", 123456); + TestFPrintFormat("%08i", 123456, "%08i", 123456); + + log_verbose("Get really crazy with the formatting.\n"); + + TestFPrintFormat("%-#12x", 123, "%-#12x", 123); + TestFPrintFormat("%-#12x", -123, "%-#12x", -123); + TestFPrintFormat("%#12x", 123, "%#12x", 123); + TestFPrintFormat("%#12x", -123, "%#12x", -123); + + TestFPrintFormat("%-+12d", 123, "%-+12d", 123); + TestFPrintFormat("%-+12d", -123, "%-+12d", -123); + TestFPrintFormat("%- 12d", 123, "%- 12d", 123); + TestFPrintFormat("%- 12d", -123, "%- 12d", -123); + TestFPrintFormat("%+12d", 123, "%+12d", 123); + TestFPrintFormat("%+12d", -123, "%+12d", -123); + TestFPrintFormat("% 12d", 123, "% 12d", 123); + TestFPrintFormat("% 12d", -123, "% 12d", -123); + TestFPrintFormat("%12d", 123, "%12d", 123); + TestFPrintFormat("%12d", -123, "%12d", -123); + TestFPrintFormat("%.12d", 123, "%.12d", 123); + TestFPrintFormat("%.12d", -123, "%.12d", -123); + + TestFPrintFormat("%-+12.1f", 1.234, "%-+12.1f", 1.234); + TestFPrintFormat("%-+12.1f", -1.234, "%-+12.1f", -1.234); + TestFPrintFormat("%- 12.10f", 1.234, "%- 12.10f", 1.234); + TestFPrintFormat("%- 12.1f", -1.234, "%- 12.1f", -1.234); + TestFPrintFormat("%+12.1f", 1.234, "%+12.1f", 1.234); + TestFPrintFormat("%+12.1f", -1.234, "%+12.1f", -1.234); + TestFPrintFormat("% 12.1f", 1.234, "% 12.1f", 1.234); + TestFPrintFormat("% 12.1f", -1.234, "% 12.1f", -1.234); + TestFPrintFormat("%12.1f", 1.234, "%12.1f", 1.234); + TestFPrintFormat("%12.1f", -1.234, "%12.1f", -1.234); + TestFPrintFormat("%.2f", 1.234, "%.2f", 1.234); + TestFPrintFormat("%.2f", -1.234, "%.2f", -1.234); + TestFPrintFormat("%3f", 1.234, "%3f", 1.234); + TestFPrintFormat("%3f", -1.234, "%3f", -1.234); + + myFile = u_fopen(STANDARD_TEST_FILE, "w", "en_US_POSIX", NULL); + /* Reinitialize the buffer to verify null termination works. */ + u_memset(uBuffer, 0x2a, sizeof(uBuffer)/sizeof(*uBuffer)); + memset(buffer, '*', sizeof(buffer)/sizeof(*buffer)); + + uNumPrinted = u_fprintf(myFile, "%d % d %d", -1234, 1234, 1234); + u_fclose(myFile); + myFile = u_fopen(STANDARD_TEST_FILE, "r", "en_US_POSIX", NULL); + u_fgets(uBuffer, sizeof(uBuffer)/sizeof(*uBuffer), myFile); + u_fclose(myFile); + u_austrncpy(compBuffer, uBuffer, sizeof(uBuffer)/sizeof(*uBuffer)); + cNumPrinted = sprintf(buffer, "%d % d %d", -1234, 1234, 1234); + if (strcmp(buffer, compBuffer) != 0) { + log_err("%%d %% d %%d Got: \"%s\", Expected: \"%s\"\n", compBuffer, buffer); + } + if (cNumPrinted != uNumPrinted) { + log_err("%%d %% d %%d number printed Got: %d, Expected: %d\n", uNumPrinted, cNumPrinted); + } + if (buffer[uNumPrinted+1] != '*') { + log_err("%%d %% d %%d too much stored\n"); + } +} +#endif + +#undef TestFPrintFormat + +#if !UCONFIG_NO_FORMATTING +static void TestFScanSetFormat(const char *format, const UChar *uValue, const char *cValue, UBool expectedToPass) { + UFILE *myFile; + UChar uBuffer[256]; + char buffer[256]; + char compBuffer[256]; + int32_t uNumScanned; + int32_t cNumScanned; + + myFile = u_fopen(STANDARD_TEST_FILE, "w", NULL, NULL); + if (myFile == NULL) { + log_err("Can't write test file for %s.\n", format); + return; + } + /* Reinitialize the buffer to verify null termination works. */ + u_memset(uBuffer, 0x2a, sizeof(uBuffer)/sizeof(*uBuffer)); + uBuffer[sizeof(uBuffer)/sizeof(*uBuffer)-1] = 0; + memset(buffer, '*', sizeof(buffer)/sizeof(*buffer)); + buffer[sizeof(buffer)/sizeof(*buffer)-1] = 0; + + u_fprintf(myFile, "%S", uValue); + u_fclose(myFile); + myFile = u_fopen(STANDARD_TEST_FILE, "r", "en_US_POSIX", NULL); + uNumScanned = u_fscanf(myFile, format, uBuffer); + u_fclose(myFile); + if (expectedToPass) { + u_austrncpy(compBuffer, uBuffer, sizeof(uBuffer)/sizeof(*uBuffer)); + cNumScanned = sscanf(cValue, format, buffer); + if (strncmp(buffer, compBuffer, sizeof(buffer)/sizeof(*buffer)) != 0) { + log_err("%s Got: \"%s\", Expected: \"%s\"\n", format, compBuffer, buffer); + } + if (cNumScanned != uNumScanned) { + log_err("%s number printed Got: %d, Expected: %d\n", format, uNumScanned, cNumScanned); + } + if (uNumScanned > 0 && uBuffer[u_strlen(uBuffer)+1] != 0x2a) { + log_err("%s too much stored\n", format); + } + } + else { + if (uNumScanned != 0 || uBuffer[0] != 0x2a || uBuffer[1] != 0x2a) { + log_err("%s too much stored on a failure\n", format); + } + } +} +#endif + +#if !UCONFIG_NO_FORMATTING +static void TestFScanset(void) { + static const UChar abcUChars[] = {0x61,0x62,0x63,0x63,0x64,0x65,0x66,0x67,0}; + static const char abcChars[] = "abccdefg"; + + TestFScanSetFormat("%[bc]S", abcUChars, abcChars, TRUE); + TestFScanSetFormat("%[cb]S", abcUChars, abcChars, TRUE); + + TestFScanSetFormat("%[ab]S", abcUChars, abcChars, TRUE); + TestFScanSetFormat("%[ba]S", abcUChars, abcChars, TRUE); + + TestFScanSetFormat("%[ab]", abcUChars, abcChars, TRUE); + TestFScanSetFormat("%[ba]", abcUChars, abcChars, TRUE); + + TestFScanSetFormat("%[abcdefgh]", abcUChars, abcChars, TRUE); + TestFScanSetFormat("%[;hgfedcba]", abcUChars, abcChars, TRUE); + + TestFScanSetFormat("%[^a]", abcUChars, abcChars, TRUE); + TestFScanSetFormat("%[^e]", abcUChars, abcChars, TRUE); + TestFScanSetFormat("%[^ed]", abcUChars, abcChars, TRUE); + TestFScanSetFormat("%[^dc]", abcUChars, abcChars, TRUE); + TestFScanSetFormat("%[^e] ", abcUChars, abcChars, TRUE); + + TestFScanSetFormat("%1[ab] ", abcUChars, abcChars, TRUE); + TestFScanSetFormat("%2[^f]", abcUChars, abcChars, TRUE); + + TestFScanSetFormat("%[qrst]", abcUChars, abcChars, TRUE); + + /* Extra long string for testing */ + TestFScanSetFormat(" %[qrst]", + abcUChars, abcChars, TRUE); + + TestFScanSetFormat("%[a-]", abcUChars, abcChars, TRUE); + + /* Bad format */ + TestFScanSetFormat("%[f-a]", abcUChars, abcChars, FALSE); + TestFScanSetFormat("%[c-a]", abcUChars, abcChars, FALSE); + TestFScanSetFormat("%[a", abcUChars, abcChars, FALSE); + /* The following is not deterministic on Windows */ +/* TestFScanSetFormat("%[a-", abcUChars, abcChars);*/ + + /* TODO: Need to specify precision with a "*" */ +} +#endif +#if !UCONFIG_NO_FORMATTING +static void TestBadFScanfFormat(const char *format, const UChar *uValue, const char *cValue) { + UFILE *myFile; + UChar uBuffer[256]; + int32_t uNumScanned; + + myFile = u_fopen(STANDARD_TEST_FILE, "w", NULL, NULL); + if (myFile == NULL) { + log_err("Can't write test file for %s.\n", format); + return; + } + /* Reinitialize the buffer to verify null termination works. */ + u_memset(uBuffer, 0x2a, sizeof(uBuffer)/sizeof(*uBuffer)); + uBuffer[sizeof(uBuffer)/sizeof(*uBuffer)-1] = 0; + + u_fprintf(myFile, "%S", uValue); + u_fclose(myFile); + myFile = u_fopen(STANDARD_TEST_FILE, "r", "en_US_POSIX", NULL); + uNumScanned = u_fscanf(myFile, format, uBuffer); + u_fclose(myFile); + if (uNumScanned != 0 || uBuffer[0] != 0x2a || uBuffer[1] != 0x2a) { + log_err("%s too much stored on a failure\n", format); + } +} +#endif +#if !UCONFIG_NO_FORMATTING +static void TestBadScanfFormat(void) { + static const UChar abcUChars[] = {0x61,0x62,0x63,0x63,0x64,0x65,0x66,0x67,0}; + static const char abcChars[] = "abccdefg"; + + TestBadFScanfFormat("%[] ", abcUChars, abcChars); +} +#endif +#if !UCONFIG_NO_FORMATTING +static void Test_u_vfprintf(const char *expectedResult, const char *format, ...) { + UChar uBuffer[256]; + UChar uBuffer2[256]; + va_list ap; + int32_t count; + UFILE *myFile; + + myFile = u_fopen(STANDARD_TEST_FILE, "w", "en_US_POSIX", "UTF-8"); + if (!myFile) { + log_err("Test file can't be opened\n"); + return; + } + + va_start(ap, format); + count = u_vfprintf(myFile, format, ap); + va_end(ap); + + u_fclose(myFile); + + + myFile = u_fopen(STANDARD_TEST_FILE, "r", "en_US_POSIX", "UTF-8"); + if (!myFile) { + log_err("Test file can't be opened\n"); + return; + } + u_fgets(uBuffer, sizeof(uBuffer)/sizeof(*uBuffer), myFile); + u_uastrcpy(uBuffer2, expectedResult); + if (u_strcmp(uBuffer, uBuffer2) != 0) { + log_err("Got two different results for \"%s\" expected \"%s\"\n", format, expectedResult); + } + u_fclose(myFile); + + + myFile = u_fopen(STANDARD_TEST_FILE, "w", "en_US_POSIX", NULL); + if (!myFile) { + log_err("Test file can't be opened\n"); + return; + } + u_uastrcpy(uBuffer, format); + + va_start(ap, format); + count = u_vfprintf_u(myFile, uBuffer, ap); + va_end(ap); + + u_fclose(myFile); + + + myFile = u_fopen(STANDARD_TEST_FILE, "r", "en_US_POSIX", NULL); + if (!myFile) { + log_err("Test file can't be opened\n"); + return; + } + u_fgets(uBuffer, sizeof(uBuffer)/sizeof(*uBuffer), myFile); + u_uastrcpy(uBuffer2, expectedResult); + if (u_strcmp(uBuffer, uBuffer2) != 0) { + log_err("Got two different results for \"%s\" expected \"%s\"\n", format, expectedResult); + } + u_fclose(myFile); +} + +static void TestVargs(void) { + Test_u_vfprintf("8 9 a B 8.9", "%d %u %x %X %.1f", 8, 9, 10, 11, 8.9); +} +#endif +static void TestTranslitOps(void) +{ +#if !UCONFIG_NO_TRANSLITERATION + UFILE *f; + UErrorCode err = U_ZERO_ERROR; + UTransliterator *a = NULL, *b = NULL, *c = NULL; + + log_verbose("opening a transliterator and UFILE for testing\n"); + + f = u_fopen(STANDARD_TEST_FILE, "w", "en_US_POSIX", NULL); + if(f == NULL) + { + log_err("Couldn't open test file for writing\n"); + return; + } + + a = utrans_open("Latin-Greek", UTRANS_FORWARD, NULL, -1, NULL, &err); + if(U_FAILURE(err)) + { + log_err("Error opening transliterator %s\n", u_errorName(err)); + u_fclose(f); + return; + } + + + log_verbose("setting a transliterator\n"); + b = u_fsettransliterator(f, U_WRITE, a, &err); + if(U_FAILURE(err)) + { + log_err("Error setting transliterator %s\n", u_errorName(err)); + u_fclose(f); + return; + } + + if(b != NULL) + { + log_err("Error, a transliterator was already set!\n"); + } + + b = u_fsettransliterator(NULL, U_WRITE, a, &err); + if(err != U_ILLEGAL_ARGUMENT_ERROR) + { + log_err("Error setting transliterator on NULL file err=%s\n", u_errorName(err)); + } + + if(b != a) + { + log_err("Error getting the same transliterator was not returned on NULL file\n"); + } + + err = U_FILE_ACCESS_ERROR; + b = u_fsettransliterator(f, U_WRITE, a, &err); + if(err != U_FILE_ACCESS_ERROR) + { + log_err("Error setting transliterator on error status err=%s\n", u_errorName(err)); + } + + if(b != a) + { + log_err("Error getting the same transliterator on error status\n"); + } + err = U_ZERO_ERROR; + + + log_verbose("un-setting transliterator (setting to null)\n"); + c = u_fsettransliterator(f, U_WRITE, NULL, &err); + if(U_FAILURE(err)) + { + log_err("Err setting transliterator %s\n", u_errorName(err)); + u_fclose(f); + return; + } + + if(c != a) + { + log_err("Err, transliterator that came back was not the original one.\n"); + } + + log_verbose("Trying to set read transliterator (should fail)\n"); + b = u_fsettransliterator(f, U_READ, NULL, &err); + if(err != U_UNSUPPORTED_ERROR) + { + log_err("Should have U_UNSUPPORTED_ERROR setting Read transliterator but got %s - REVISIT AND UPDATE TEST\n", u_errorName(err)); + u_fclose(f); + return; + } + else + { + log_verbose("Got %s error (expected) setting READ transliterator.\n", u_errorName(err)); + err = U_ZERO_ERROR; + } + + + utrans_close(c); + u_fclose(f); +#endif +} + +static void TestTranslitOut(void) +{ +#if !UCONFIG_NO_FORMATTING +#if !UCONFIG_NO_TRANSLITERATION + UFILE *f; + UErrorCode err = U_ZERO_ERROR; + UTransliterator *a = NULL, *b = NULL, *c = NULL; + FILE *infile; + UChar compare[] = { 0xfeff, 0x03a3, 0x03c4, 0x03b5, 0x03c6, 0x1f00, 0x03bd, 0x03bf, 0x03c2, 0x0000 }; + UChar ubuf[256]; + int len; + + log_verbose("opening a transliterator and UFILE for testing\n"); + + f = u_fopen(STANDARD_TEST_FILE, "w", "en_US_POSIX", "utf-16"); + if(f == NULL) + { + log_err("Couldn't open test file for writing\n"); + return; + } + + a = utrans_open("Latin-Greek", UTRANS_FORWARD, NULL, -1, NULL, &err); + if(U_FAILURE(err)) + { + log_err("Err opening transliterator %s\n", u_errorName(err)); + u_fclose(f); + return; + } + + log_verbose("setting a transliterator\n"); + b = u_fsettransliterator(f, U_WRITE, a, &err); + if(U_FAILURE(err)) + { + log_err("Err setting transliterator %s\n", u_errorName(err)); + u_fclose(f); + return; + } + + if(b != NULL) + { + log_err("Err, a transliterator was already set!\n"); + } + + u_fprintf(f, "Stephanos"); + + u_fclose(f); + + log_verbose("Re reading test file to verify transliteration\n"); + infile = fopen(STANDARD_TEST_FILE, "rb"); + if(infile == NULL) + { + log_err("Couldn't reopen test file\n"); + return; + } + + len=fread(ubuf, sizeof(UChar), u_strlen(compare), infile); + log_verbose("Read %d UChars\n", len); + if(len != u_strlen(compare)) + { + log_err("Wanted %d UChars from file, got %d\n", u_strlen(compare), len); + } + ubuf[len]=0; + + if(u_strlen(compare) != u_strlen(ubuf)) + { + log_err("Wanted %d UChars from file, but u_strlen() returns %d\n", u_strlen(compare), len); + } + + if(u_strcmp(compare, ubuf)) + { + log_err("Read string doesn't match expected.\n"); + } + else + { + log_verbose("Read string matches expected.\n"); + } + + fclose(infile); +#endif +#endif +} + +U_CFUNC void +addFileTest(TestNode** root) { +#if !UCONFIG_NO_FORMATTING + addTest(root, &TestFile, "file/TestFile"); +#endif + addTest(root, &StdinBuffering, "file/StdinBuffering"); + addTest(root, &TestfgetsBuffers, "file/TestfgetsBuffers"); + addTest(root, &TestFileReadBuffering, "file/TestFileReadBuffering"); + addTest(root, &TestfgetsLineCount, "file/TestfgetsLineCount"); + addTest(root, &TestfgetsNewLineHandling, "file/TestfgetsNewLineHandling"); + addTest(root, &TestCodepage, "file/TestCodepage"); +#if !UCONFIG_NO_FORMATTING + addTest(root, &TestCodepageAndLocale, "file/TestCodepageAndLocale"); + addTest(root, &TestFprintfFormat, "file/TestFprintfFormat"); + addTest(root, &TestFScanset, "file/TestFScanset"); + addTest(root, &TestFilePrintCompatibility, "file/TestFilePrintCompatibility"); + addTest(root, &TestBadScanfFormat, "file/TestBadScanfFormat"); + addTest(root, &TestVargs, "file/TestVargs"); +#endif + +#if !UCONFIG_NO_TRANSLITERATION + addTest(root, &TestTranslitOps, "file/translit/ops"); +#if !UCONFIG_NO_FORMATTING + addTest(root, &TestTranslitOut, "file/translit/out"); +#endif +#endif +} diff --git a/icuSources/test/iotest/iotest.cpp b/icuSources/test/iotest/iotest.cpp index 16e5c72e..320aca2a 100644 --- a/icuSources/test/iotest/iotest.cpp +++ b/icuSources/test/iotest/iotest.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2002-2003, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * file name: iotest.cpp @@ -18,16 +18,22 @@ #include "unicode/uclean.h" #include "unicode/ucnv.h" -#include "unicode/uloc.h" +#include "unicode/uchar.h" #include "unicode/unistr.h" #include "unicode/ustring.h" -#include "unicode/ctest.h" -#include "unicode/utrans.h" -#include "ustr_imp.h" +#include "ustr_cnv.h" +#include "iotest.h" +#include "unicode/tstdtmod.h" #if U_IOSTREAM_SOURCE >= 199711 #include <iostream> +#ifdef U_LINUX +#define USE_SSTREAM 1 +#include <sstream> +#else +// <strstream> is deprecated on some platforms, and the compiler complains very loudly if you use it. #include <strstream> +#endif using namespace std; #elif U_IOSTREAM_SOURCE >= 198506 #include <iostream.h> @@ -35,1453 +41,655 @@ using namespace std; #endif #include <string.h> +#include <stdlib.h> -static char STANDARD_TEST_FILE[] = "iotest-c.txt"; -static const int32_t STANDARD_TEST_NUM_RANGE = 1000; - +U_CDECL_BEGIN #ifdef WIN32 -static const UChar NEW_LINE[] = {0x0d,0x0a,0}; -#define C_NEW_LINE "\r\n" +const UChar NEW_LINE[] = {0x0d,0x0a,0}; +const char C_NEW_LINE[] = {0x0d,0x0a,0}; +#define UTF8_NEW_LINE "\x0d\x0a" #else -static const UChar NEW_LINE[] = {0x0a,0}; -#define C_NEW_LINE "\n" +const UChar NEW_LINE[] = {0x0a,0}; +const char C_NEW_LINE[] = {'\n',0}; +#define UTF8_NEW_LINE "\x0a" #endif +U_CDECL_END -static void TestFileFromICU(UFILE *myFile) { - int32_t n[1]; - float myFloat = -1234.0; - UDate myDate = 0.0; - UDate dec_31_1969 = -57600000.000000; /* TODO: These are not correct */ - UDate midnight = 86400000.000000; /* TODO: These are not correct */ - UDate myNewDate = -1.0; - int32_t newValuePtr[1]; - double newDoubleValuePtr[1]; - UChar myUString[256]; - UChar uStringBuf[256]; - char myString[256] = ""; - char testBuf[256] = ""; - - u_memset(myUString, 0x2a, sizeof(myUString)/sizeof(*myUString)); - u_memset(uStringBuf, 0x2a, sizeof(uStringBuf)/sizeof(*uStringBuf)); - memset(myString, 0x2a, sizeof(myString)/sizeof(*myString)); - memset(testBuf, 0x2a, sizeof(testBuf)/sizeof(*testBuf)); - - if (myFile == NULL) { - log_err("Can't write test file."); - return; - } - - *n = -1234; - - /* Test fprintf */ - u_fprintf(myFile, "Signed decimal integer %%d: %d\n", *n); - u_fprintf(myFile, "Signed decimal integer %%i: %i\n", *n); - u_fprintf(myFile, "Unsigned octal integer %%o: %o\n", *n); - u_fprintf(myFile, "Unsigned decimal integer %%u: %u\n", *n); - u_fprintf(myFile, "Lowercase unsigned hexadecimal integer %%x: %x\n", *n); - u_fprintf(myFile, "Uppercase unsigned hexadecimal integer %%X: %X\n", *n); - u_fprintf(myFile, "Float %%f: %f\n", myFloat); - u_fprintf(myFile, "Lowercase float %%e: %e\n", myFloat); - u_fprintf(myFile, "Uppercase float %%E: %E\n", myFloat); - u_fprintf(myFile, "Lowercase float %%g: %g\n", myFloat); - u_fprintf(myFile, "Uppercase float %%G: %G\n", myFloat); -// u_fprintf(myFile, "Pointer %%p: %p\n", myFile); - u_fprintf(myFile, "Char %%c: %c\n", 'A'); - u_fprintf(myFile, "UChar %%K (non-ANSI, should be %%C for Microsoft?): %K\n", L'A'); - u_fprintf(myFile, "String %%s: %s\n", "My-String"); - u_fprintf(myFile, "NULL String %%s: %s\n", NULL); - u_fprintf(myFile, "Unicode String %%U (non-ANSI, should be %%S for Microsoft?): %U\n", L"My-String"); - u_fprintf(myFile, "NULL Unicode String %%U (non-ANSI, should be %%S for Microsoft?): %U\n", NULL); - u_fprintf(myFile, "Date %%D (non-ANSI): %D\n", myDate); - u_fprintf(myFile, "Time %%T (non-ANSI): %T\n", myDate); - u_fprintf(myFile, "Percent %%P (non-ANSI): %P\n", myFloat); - u_fprintf(myFile, "Currency %%M (non-ANSI): %M\n", myFloat); - u_fprintf(myFile, "Spell Out %%V (non-ANSI): %V\n", myFloat); - - *n = 1; - u_fprintf(myFile, "\t\nPointer to integer (Count) %%n: n=%d %n n=%d\n", *n, n, *n); - u_fprintf(myFile, "Pointer to integer Value: %d\n", *n); - u_fprintf(myFile, "This is a long test123456789012345678901234567890123456789012345678901234567890\n"); - *n = 1; - fprintf(u_fgetfile(myFile), "\tNormal fprintf count: n=%d %n n=%d\n", *n ,n, *n); - fprintf(u_fgetfile(myFile), "\tNormal fprintf count value: n=%d\n", *n); - - u_fclose(myFile); - myFile = u_fopen(STANDARD_TEST_FILE, "r", NULL, NULL); - - if (myFile == NULL) { - log_err("Can't read test file."); - return; - } - - *n = -1234; - - myString[0] = u_fgetc(myFile); - if (myString[0] != 0x53 /* S */) { - log_err("u_fgetc 1 returned %X. Expected 'S'.", myString[0]); - } - u_fungetc(myString[0], myFile); - myString[0] = u_fgetc(myFile); - if (myString[0] != 0x53 /* S */) { - log_err("u_fgetc 2 returned %X. Expected 'S'.", myString[0]); - } - u_fungetc(myString[0], myFile); - myString[0] = u_fgetc(myFile); - if (myString[0] != 0x53 /* S */) { - log_err("u_fgetc 3 returned %X. Expected 'S'.", myString[0]); - } - u_fungetc(myString[0], myFile); - - *newValuePtr = 1; - u_fscanf(myFile, "Signed decimal integer %%d: %d\n", newValuePtr); - if (*n != *newValuePtr) { - log_err("%%d Got: %d, Expected: %d\n", *newValuePtr, *n); - } - *newValuePtr = 1; - u_fscanf(myFile, "Signed decimal integer %%i: %i\n", newValuePtr); - if (*n != *newValuePtr) { - log_err("%%i Got: %i, Expected: %i\n", *newValuePtr, *n); - } - *newValuePtr = 1; - u_fscanf(myFile, "Unsigned octal integer %%o: %o\n", newValuePtr); - if (*n != *newValuePtr) { - log_err("%%o Got: %o, Expected: %o\n", *newValuePtr, *n); - } - *newValuePtr = 1; - u_fscanf(myFile, "Unsigned decimal integer %%u: %u\n", newValuePtr); - if (*n != *newValuePtr) { - log_err("%%u Got: %u, Expected: %u\n", *newValuePtr, *n); - } - *newValuePtr = 1; - u_fscanf(myFile, "Lowercase unsigned hexadecimal integer %%x: %x\n", newValuePtr); - if (*n != *newValuePtr) { - log_err("%%x Got: %x, Expected: %x\n", *newValuePtr, *n); - } - *newValuePtr = 1; - u_fscanf(myFile, "Uppercase unsigned hexadecimal integer %%X: %X\n", newValuePtr); - if (*n != *newValuePtr) { - log_err("%%X Got: %X, Expected: %X\n", *newValuePtr, *n); - } - *newDoubleValuePtr = -1.0; - u_fscanf(myFile, "Float %%f: %f\n", newDoubleValuePtr); - if (myFloat != *newDoubleValuePtr) { - log_err("%%f Got: %f, Expected: %f\n", *newDoubleValuePtr, myFloat); - } - *newDoubleValuePtr = -1.0; - u_fscanf(myFile, "Lowercase float %%e: %e\n", newDoubleValuePtr); - if (myFloat != *newDoubleValuePtr) { - log_err("%%e Got: %e, Expected: %e\n", *newDoubleValuePtr, myFloat); - } - *newDoubleValuePtr = -1.0; - u_fscanf(myFile, "Uppercase float %%E: %E\n", newDoubleValuePtr); - if (myFloat != *newDoubleValuePtr) { - log_err("%%E Got: %E, Expected: %E\n", *newDoubleValuePtr, myFloat); - } - *newDoubleValuePtr = -1.0; - u_fscanf(myFile, "Lowercase float %%g: %g\n", newDoubleValuePtr); - if (myFloat != *newDoubleValuePtr) { - log_err("%%g Got: %g, Expected: %g\n", *newDoubleValuePtr, myFloat); - } - *newDoubleValuePtr = -1.0; - u_fscanf(myFile, "Uppercase float %%G: %G\n", newDoubleValuePtr); - if (myFloat != *newDoubleValuePtr) { - log_err("%%G Got: %G, Expected: %G\n", *newDoubleValuePtr, myFloat); - } -// u_fscanf(myFile, "Pointer %%p: %p\n", newDoubleValue); - u_fscanf(myFile, "Char %%c: %c\n", myString); - if (*myString != 'A') { - log_err("%%c Got: %c, Expected: A\n", *myString); - } - u_fscanf(myFile, "UChar %%K (non-ANSI, should be %%C for Microsoft?): %K\n", myUString); - if (*myUString != L'A') { - log_err("%%C Got: %C, Expected: A\n", *myUString); - } - u_fscanf(myFile, "String %%s: %s\n", myString); - if (strcmp(myString, "My-String")) { - log_err("%%s Got: %s, Expected: My String\n", myString); - } - u_fscanf(myFile, "NULL String %%s: %s\n", myString); - if (strcmp(myString, "(null)")) { - log_err("%%s Got: %s, Expected: My String\n", myString); - } - u_fscanf(myFile, "Unicode String %%U (non-ANSI, should be %%S for Microsoft?): %U\n", myUString); - u_austrncpy(myString, myUString, sizeof(myUString)/sizeof(*myUString)); - if (strcmp(myString, "My-String")) { - log_err("%%S Got: %S, Expected: My String\n", myUString); - } - u_fscanf(myFile, "NULL Unicode String %%U (non-ANSI, should be %%S for Microsoft?): %U\n", myUString); - u_austrncpy(myString, myUString, sizeof(myUString)/sizeof(*myUString)); - if (strcmp(myString, "(null)")) { - log_err("%%S Got: %S, Expected: My String\n", myUString); - } - myNewDate = -1.0; - u_fscanf(myFile, "Date %%D (non-ANSI): %D\n", &myNewDate); - if (myNewDate != dec_31_1969) { - log_err("%%D Got: %f, Expected: %f\n", myNewDate, dec_31_1969); - } - myNewDate = -1.0; - u_fscanf(myFile, "Time %%T (non-ANSI): %T\n", &myNewDate); - if (myNewDate != midnight) { - log_err("%%T Got: %f, Expected: %f\n", myNewDate, midnight); - } - *newDoubleValuePtr = -1.0; - u_fscanf(myFile, "Percent %%P (non-ANSI): %P\n", newDoubleValuePtr); - if (myFloat != *newDoubleValuePtr) { - log_err("%%P Got: %f, Expected: %f\n", *newDoubleValuePtr, myFloat); - } - *newDoubleValuePtr = -1.0; - u_fscanf(myFile, "Currency %%M (non-ANSI): %M\n", newDoubleValuePtr); - if (myFloat != *newDoubleValuePtr) { - log_err("%%P Got: %f, Expected: %f\n", *newDoubleValuePtr, myFloat); - } - *newDoubleValuePtr = -1.0; - u_fscanf(myFile, "Spell Out %%V (non-ANSI): %V\n", newDoubleValuePtr); - if (myFloat != *newDoubleValuePtr) { - log_err("%%V Got: %f, Expected: %f\n", *newDoubleValuePtr, myFloat); - } - - u_fgets(myFile, 4, myUString); - u_austrncpy(myString, myUString, sizeof(myUString)/sizeof(*myUString)); - if (myString == NULL || strcmp(myString, "\t\n") != 0) { - log_err("u_fgets got \"%s\"\n", myString); - } - - if (u_fgets(myFile, sizeof(myUString)/sizeof(*myUString), myUString) != myUString) { - log_err("u_fgets did not return myUString\n"); - } - u_austrncpy(myString, myUString, sizeof(myUString)/sizeof(*myUString)); - if (myString == NULL || strcmp(myString, "Pointer to integer (Count) %n: n=1 n=1\n") != 0) { - log_err("u_fgets got \"%s\"\n", myString); - } - - if (u_fgets(myFile, sizeof(myUString)/sizeof(*myUString), myUString) != myUString) { - log_err("u_fgets did not return myUString\n"); - } - u_austrncpy(myString, myUString, sizeof(myUString)/sizeof(*myUString)); - if (myString == NULL || strcmp(myString, "Pointer to integer Value: 37\n") != 0) { - log_err("u_fgets got \"%s\"\n", myString); - } - - if (u_fgets(myFile, sizeof(myUString)/sizeof(*myUString), myUString) != myUString) { - log_err("u_fgets did not return myUString\n"); - } - u_austrncpy(myString, myUString, sizeof(myUString)/sizeof(*myUString)); - if (myString == NULL || strcmp(myString, "This is a long test123456789012345678901234567890123456789012345678901234567890\n") != 0) { - log_err("u_fgets got \"%s\"\n", myString); - } - - if (u_fgets(myFile, 0, myUString) != NULL) { - log_err("u_fgets got \"%s\" and it should have returned NULL\n", myString); - } - - if (u_fgets(myFile, 1, myUString) != myUString) { - log_err("u_fgets did not return myUString\n"); - } - u_austrncpy(myString, myUString, sizeof(myUString)/sizeof(*myUString)); - if (myString == NULL || strcmp(myString, "") != 0) { - log_err("u_fgets got \"%s\"\n", myString); - } - - if (u_fgets(myFile, 2, myUString) != myUString) { - log_err("u_fgets did not return myUString\n"); - } - u_austrncpy(myString, myUString, sizeof(myUString)/sizeof(*myUString)); - if (myString == NULL || strcmp(myString, "\t") != 0) { - log_err("u_fgets got \"%s\"\n", myString); - } - - u_fclose(myFile); -} - -static void TestFile() { -/* FILE *standardFile;*/ +class DataDrivenLogger : public TestLog { + static const char* fgDataDir; + static char *fgTestDataPath; - log_verbose("Testing u_fopen\n"); - TestFileFromICU(u_fopen(STANDARD_TEST_FILE, "w", NULL, NULL)); - -/* Don't know how to make this work without stdout or stderr */ -/* - log_verbose("Testing u_finit\n"); - standardFile = fopen(STANDARD_TEST_FILE, "wb"); - TestFileFromICU(u_finit(standardFile, NULL, NULL)); - fclose(standardFile); -*/ -} - -static void TestCodepageAndLocale() { - UFILE *myFile = u_fopen(STANDARD_TEST_FILE, "w", NULL, NULL); - if (u_fgetcodepage(myFile) == NULL - || strcmp(u_fgetcodepage(myFile), ucnv_getDefaultName()) != 0) - { - log_err("Didn't get the proper default codepage. Got %s expected: %s\n", - u_fgetcodepage(myFile), ucnv_getDefaultName()); - } - if (u_fgetlocale(myFile) == NULL - || strcmp(u_fgetlocale(myFile), uloc_getDefault()) != 0) - { - log_err("Didn't get the proper default locale. Got %s expected: %s\n", - u_fgetlocale(myFile), uloc_getDefault()); - } - u_fclose(myFile); - - myFile = u_fopen(STANDARD_TEST_FILE, "w", "es", NULL); - if (u_fgetcodepage(myFile) == NULL - || strcmp(u_fgetcodepage(myFile), "ISO-8859-1") != 0) - { - log_err("Didn't get the proper default codepage for \"en\". Got %s expected: iso-8859-1\n", - u_fgetcodepage(myFile)); - } - if (u_fgetlocale(myFile) == NULL - || strcmp(u_fgetlocale(myFile), "es") != 0) - { - log_err("Didn't get the proper default locale. Got %s expected: %s\n", - u_fgetlocale(myFile), "es"); - } - u_fclose(myFile); - - myFile = u_fopen(STANDARD_TEST_FILE, "w", NULL, "UTF-16"); - if (u_fgetcodepage(myFile) == NULL - || strcmp(u_fgetcodepage(myFile), "UTF-16") != 0) - { - log_err("Didn't get the proper default codepage for \"en\". Got %s expected: iso-8859-1\n", - u_fgetcodepage(myFile)); +public: + static void cleanUp() { + if (fgTestDataPath) { + free(fgTestDataPath); + fgTestDataPath = NULL; + } } - if (u_fgetlocale(myFile) == NULL - || strcmp(u_fgetlocale(myFile), uloc_getDefault()) != 0) - { - log_err("Didn't get the proper default locale. Got %s expected: %s\n", - u_fgetlocale(myFile), uloc_getDefault()); + virtual void errln( const UnicodeString &message ) { + char buffer[4000]; + message.extract(0, message.length(), buffer, sizeof(buffer)); + buffer[3999] = 0; /* NULL terminate */ + log_err(buffer); } - u_fclose(myFile); - myFile = u_fopen(STANDARD_TEST_FILE, "w", "zh", "UTF-16"); - if (u_fgetcodepage(myFile) == NULL - || strcmp(u_fgetcodepage(myFile), "UTF-16") != 0) - { - log_err("Didn't get the proper default codepage for \"en\". Got %s expected: iso-8859-1\n", - u_fgetcodepage(myFile)); - } - if (u_fgetlocale(myFile) == NULL - || strcmp(u_fgetlocale(myFile), "zh") != 0) + static const char * pathToDataDirectory(void) { - log_err("Didn't get the proper default locale. Got %s expected: %s\n", - u_fgetlocale(myFile), "zh"); - } - u_fclose(myFile); -} - - -static void TestfgetsBuffers() { - UChar buffer[2048]; - UChar expectedBuffer[2048]; - static const char testStr[] = "This is a test string that tests u_fgets. It makes sure that we don't try to read too much!"; - UFILE *myFile = u_fopen(STANDARD_TEST_FILE, "w", NULL, "UTF-16"); - int32_t expectedSize = strlen(testStr); - int32_t readSize; - int32_t repetitions; - - u_fputc(0x3BC, myFile); - u_fputc(0xFF41, myFile); - u_memset(buffer, 0xDEAD, sizeof(buffer)/sizeof(buffer[0])); - u_memset(expectedBuffer, 0, sizeof(expectedBuffer)/sizeof(expectedBuffer[0])); - u_uastrncpy(buffer, testStr, expectedSize+1); - for (repetitions = 0; repetitions < 16; repetitions++) { - u_file_write(buffer, expectedSize, myFile); - u_strcat(expectedBuffer, buffer); - } - u_fclose(myFile); - - u_memset(buffer, 0xDEAD, sizeof(buffer)/sizeof(buffer[0])); - myFile = u_fopen(STANDARD_TEST_FILE, "r", NULL, "UTF-16"); - if (u_fgetc(myFile) != 0x3BC) { - log_err("The first character is wrong\n"); - } - if (u_fgetc(myFile) != 0xFF41) { - log_err("The second character is wrong\n"); - } - if (u_fgets(myFile, sizeof(buffer)/sizeof(buffer[0]), buffer) != buffer) { - log_err("Didn't get the buffer back\n"); - return; - } - readSize = u_strlen(buffer); - if (readSize != expectedSize*repetitions) { - log_err("Buffer is the wrong size. Got %d Expected %d\n", u_strlen(buffer), expectedSize*repetitions); - } - if (buffer[(expectedSize*repetitions) + 1] != 0xDEAD) { - log_err("u_fgets wrote too much data\n"); - } - if (u_strcmp(buffer, expectedBuffer) != 0) { - log_err("Did get expected string back\n"); - } - if (strcmp(u_fgetcodepage(myFile), "UTF-16") != 0) { - log_err("Got %s instead of UTF-16\n", u_fgetcodepage(myFile)); - } - u_fclose(myFile); - - log_verbose("Now trying a multi-byte encoding (UTF-8).\n"); - - myFile = u_fopen(STANDARD_TEST_FILE, "w", NULL, "UTF-8"); - - u_fputc(0x3BC, myFile); - u_fputc(0xFF41, myFile); - u_memset(buffer, 0xDEAD, sizeof(buffer)/sizeof(buffer[0])); - u_memset(expectedBuffer, 0, sizeof(expectedBuffer)/sizeof(expectedBuffer[0])); - u_uastrncpy(buffer, testStr, expectedSize+1); - for (repetitions = 0; repetitions < 16; repetitions++) { - u_file_write(buffer, expectedSize, myFile); - u_strcat(expectedBuffer, buffer); - } - u_fclose(myFile); - - u_memset(buffer, 0xDEAD, sizeof(buffer)/sizeof(buffer[0])); - myFile = u_fopen(STANDARD_TEST_FILE, "r", NULL, "UTF-8"); - if (strcmp(u_fgetcodepage(myFile), "UTF-8") != 0) { - log_err("Got %s instead of UTF-8\n", u_fgetcodepage(myFile)); - } - if (u_fgetc(myFile) != 0x3BC) { - log_err("The first character is wrong\n"); - } - if (u_fgetc(myFile) != 0xFF41) { - log_err("The second character is wrong\n"); - } - if (u_fgets(myFile, sizeof(buffer)/sizeof(buffer[0]), buffer) != buffer) { - log_err("Didn't get the buffer back\n"); - return; - } - readSize = u_strlen(buffer); - if (readSize != expectedSize*repetitions) { - log_err("Buffer is the wrong size. Got %d Expected %d\n", u_strlen(buffer), expectedSize*repetitions); - } - if (buffer[(expectedSize*repetitions) + 1] != 0xDEAD) { - log_err("u_fgets wrote too much data\n"); - } - if (u_strcmp(buffer, expectedBuffer) != 0) { - log_err("Did get expected string back\n"); - } - u_fclose(myFile); - - - log_verbose("Now trying a multi-byte encoding (UTF-8) with a really small buffer.\n"); - - myFile = u_fopen(STANDARD_TEST_FILE, "w", NULL, "UTF-8"); - - u_fputc(0xFF41, myFile); - u_memset(buffer, 0xDEAD, sizeof(buffer)/sizeof(buffer[0])); - u_memset(expectedBuffer, 0, sizeof(expectedBuffer)/sizeof(expectedBuffer[0])); - u_uastrncpy(buffer, testStr, expectedSize+1); - for (repetitions = 0; repetitions < 1; repetitions++) { - u_file_write(buffer, expectedSize, myFile); - u_strcat(expectedBuffer, buffer); - } - u_fclose(myFile); - - u_memset(buffer, 0xDEAD, sizeof(buffer)/sizeof(buffer[0])); - myFile = u_fopen(STANDARD_TEST_FILE, "r", NULL, "UTF-8"); - if (u_fgets(myFile, 2, buffer) != buffer) { - log_err("Didn't get the buffer back\n"); - return; - } - readSize = u_strlen(buffer); - if (readSize != 1) { - log_err("Buffer is the wrong size. Got %d Expected %d\n", u_strlen(buffer), 1); - } - if (buffer[0] != 0xFF41 || buffer[1] != 0) { - log_err("Did get expected string back\n"); - } - if (buffer[2] != 0xDEAD) { - log_err("u_fgets wrote too much data\n"); - } - u_fclose(myFile); - -} - - -static void TestfgetsLineCount() { - UChar buffer[2048]; - UChar expectedBuffer[2048]; - char charBuffer[2048]; - static const char testStr[] = "This is a test string that tests u_fgets. It makes sure that we don't try to read too much!"; - UFILE *myFile = NULL; - FILE *stdFile = fopen(STANDARD_TEST_FILE, "w"); - int32_t expectedSize = strlen(testStr); - int32_t repetitions; - int32_t nlRepetitions; - - u_memset(expectedBuffer, 0, sizeof(expectedBuffer)/sizeof(expectedBuffer[0])); - - for (repetitions = 0; repetitions < 16; repetitions++) { - fwrite(testStr, sizeof(testStr[0]), expectedSize, stdFile); - for (nlRepetitions = 0; nlRepetitions < repetitions; nlRepetitions++) { - fwrite("\n", sizeof(testStr[0]), 1, stdFile); + if(fgDataDir != NULL) { + return fgDataDir; } - } - fclose(stdFile); - myFile = u_fopen(STANDARD_TEST_FILE, "r", NULL, NULL); - stdFile = fopen(STANDARD_TEST_FILE, "r"); - - for (;;) { - u_memset(buffer, 0xDEAD, sizeof(buffer)/sizeof(buffer[0])); - char *returnedCharBuffer = fgets(charBuffer, sizeof(charBuffer)/sizeof(charBuffer[0]), stdFile); - UChar *returnedUCharBuffer = u_fgets(myFile, sizeof(buffer)/sizeof(buffer[0]), buffer); - - if (!returnedCharBuffer && !returnedUCharBuffer) { - /* Both returned NULL. stop. */ - break; - } - if (returnedCharBuffer != charBuffer) { - log_err("Didn't get the charBuffer back\n"); - continue; + /* U_TOPSRCDIR is set by the makefiles on UNIXes when building cintltst and intltst + // to point to the top of the build hierarchy, which may or + // may not be the same as the source directory, depending on + // the configure options used. At any rate, + // set the data path to the built data from this directory. + // The value is complete with quotes, so it can be used + // as-is as a string constant. + */ + #if defined (U_TOPSRCDIR) + { + fgDataDir = U_TOPSRCDIR U_FILE_SEP_STRING "data" U_FILE_SEP_STRING; } - u_uastrncpy(expectedBuffer, charBuffer, strlen(charBuffer)+1); - if (returnedUCharBuffer != buffer) { - log_err("Didn't get the buffer back\n"); - continue; + #else + + /* On Windows, the file name obtained from __FILE__ includes a full path. + * This file is "wherever\icu\source\test\cintltst\cintltst.c" + * Change to "wherever\icu\source\data" + */ + { + static char p[sizeof(__FILE__) + 10]; + char *pBackSlash; + int i; + + strcpy(p, __FILE__); + /* We want to back over three '\' chars. */ + /* Only Windows should end up here, so looking for '\' is safe. */ + for (i=1; i<=3; i++) { + pBackSlash = strrchr(p, U_FILE_SEP_CHAR); + if (pBackSlash != NULL) { + *pBackSlash = 0; /* Truncate the string at the '\' */ + } + } + + if (pBackSlash != NULL) { + /* We found and truncated three names from the path. + * Now append "source\data" and set the environment + */ + strcpy(pBackSlash, U_FILE_SEP_STRING "data" U_FILE_SEP_STRING ); + fgDataDir = p; + } + else { + /* __FILE__ on MSVC7 does not contain the directory */ + FILE *file = fopen(".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "Makefile.in", "r"); + if (file) { + fclose(file); + fgDataDir = ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING; + } + else { + fgDataDir = ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING; + } + } } - if (u_strcmp(buffer, expectedBuffer) != 0) { - log_err("buffers are different\n"); - } - if (buffer[u_strlen(buffer)+1] != 0xDEAD) { - log_err("u_fgets wrote too much\n"); - } - } - fclose(stdFile); - u_fclose(myFile); -} - -static void TestFilePrintCompatibility() { - UFILE *myFile = u_fopen(STANDARD_TEST_FILE, "wb", "en_US_POSIX", NULL); - FILE *myCFile; - int32_t num; - char cVal; - static const UChar emptyStr[] = {0}; - char readBuf[512] = ""; - char testBuf[512] = ""; - - if (myFile == NULL) { - log_err("Can't read test file."); - return; - } - - if (strcmp(u_fgetlocale(myFile), "en_US_POSIX") != 0) { - log_err("Got %s instead of en_US_POSIX for locale\n", u_fgetlocale(myFile)); - } - - /* Compare against C API compatibility */ - for (num = -STANDARD_TEST_NUM_RANGE; num < STANDARD_TEST_NUM_RANGE; num++) { - u_fprintf(myFile, "%x ", num); - u_fprintf(myFile, "%X ", num); - u_fprintf(myFile, "%o ", num); - u_fprintf(myFile, "%d ", num); - u_fprintf(myFile, "%i ", num); - u_fprintf(myFile, "%f ", (double)num); - u_fprintf(myFile, "%e ", (double)num); - u_fprintf(myFile, "%E ", (double)num); - u_fprintf(myFile, "%g ", (double)num); - u_fprintf(myFile, "%G", (double)num); - u_fputs(emptyStr, myFile); - } - - u_fprintf_u(myFile, NEW_LINE); + #endif - for (num = 0; num < 0x80; num++) { - u_fprintf(myFile, "%c", num); - } + return fgDataDir; - u_fclose(myFile); - myCFile = fopen(STANDARD_TEST_FILE, "rb"); - if (myCFile == NULL) { - log_err("Can't read test file."); - return; } - for (num = -STANDARD_TEST_NUM_RANGE; num < STANDARD_TEST_NUM_RANGE; num++) { - fscanf(myCFile, "%s", readBuf); - sprintf(testBuf, "%x", num); - if (strcmp(readBuf, testBuf) != 0) { - log_err("%%x Got: \"%s\", Expected: \"%s\"\n", readBuf, testBuf); - } + static const char* loadTestData(UErrorCode& err){ + if( fgTestDataPath == NULL){ + const char* directory=NULL; + UResourceBundle* test =NULL; + char* tdpath=NULL; + const char* tdrelativepath; - fscanf(myCFile, "%s", readBuf); - sprintf(testBuf, "%X", num); - if (strcmp(readBuf, testBuf) != 0) { - log_err("%%X Got: \"%s\", Expected: \"%s\"\n", readBuf, testBuf); - } - - fscanf(myCFile, "%s", readBuf); - sprintf(testBuf, "%o", num); - if (strcmp(readBuf, testBuf) != 0) { - log_err("%%o Got: \"%s\", Expected: \"%s\"\n", readBuf, testBuf); - } +#if defined (U_TOPBUILDDIR) + tdrelativepath = "test"U_FILE_SEP_STRING"testdata"U_FILE_SEP_STRING"out"U_FILE_SEP_STRING; + directory = U_TOPBUILDDIR; +#else + tdrelativepath = ".."U_FILE_SEP_STRING"test"U_FILE_SEP_STRING"testdata"U_FILE_SEP_STRING"out"U_FILE_SEP_STRING; + directory = pathToDataDirectory(); +#endif - /* fprintf is not compatible on all platforms e.g. the iSeries */ - fscanf(myCFile, "%s", readBuf); - sprintf(testBuf, "%d", num); - if (strcmp(readBuf, testBuf) != 0) { - log_err("%%d Got: \"%s\", Expected: \"%s\"\n", readBuf, testBuf); - } + tdpath = (char*) malloc(sizeof(char) *(( strlen(directory) * strlen(tdrelativepath)) + 100)); - fscanf(myCFile, "%s", readBuf); - sprintf(testBuf, "%i", num); - if (strcmp(readBuf, testBuf) != 0) { - log_err("%%i Got: \"%s\", Expected: \"%s\"\n", readBuf, testBuf); - } - fscanf(myCFile, "%s", readBuf); - sprintf(testBuf, "%f", (double)num); - if (strcmp(readBuf, testBuf) != 0) { - log_err("%%f Got: \"%s\", Expected: \"%s\"\n", readBuf, testBuf); - } + /* u_getDataDirectory shoul return \source\data ... set the + * directory to ..\source\data\..\test\testdata\out\testdata + */ + strcpy(tdpath, directory); + strcat(tdpath, tdrelativepath); + strcat(tdpath,"testdata"); - fscanf(myCFile, "%s", readBuf); - sprintf(testBuf, "%e", (double)num); - if (strcmp(readBuf, testBuf) != 0) { - log_err("%%e Got: \"%s\", Expected: \"%s\"\n", readBuf, testBuf); - } + test=ures_open(tdpath, "testtypes", &err); - fscanf(myCFile, "%s", readBuf); - sprintf(testBuf, "%E", (double)num); - if (strcmp(readBuf, testBuf) != 0) { - log_err("%%E Got: \"%s\", Expected: \"%s\"\n", readBuf, testBuf); - } - - fscanf(myCFile, "%s", readBuf); - sprintf(testBuf, "%g", (double)num); - if (strcmp(readBuf, testBuf) != 0) { - log_err("%%g Got: \"%s\", Expected: \"%s\"\n", readBuf, testBuf); - } - - fscanf(myCFile, "%s", readBuf); - sprintf(testBuf, "%G", (double)num); - if (strcmp(readBuf, testBuf) != 0) { - log_err("%%G Got: \"%s\", Expected: \"%s\"\n", readBuf, testBuf); + if(U_FAILURE(err)){ + err = U_FILE_ACCESS_ERROR; + log_err("Could not load testtypes.res in testdata bundle with path %s - %s\n", tdpath, u_errorName(err)); + return ""; + } + ures_close(test); + fgTestDataPath = tdpath; } + return fgTestDataPath; } - /* Properly eat the newlines */ - for (num = 0; num < u_strlen(NEW_LINE); num++) { - fscanf(myCFile, "%c", &cVal); - if (cVal != NEW_LINE[num]) { - log_err("OS newline error\n"); - } - } - for (num = 0; num < u_strlen(NEW_LINE); num++) { - fscanf(myCFile, "%c", &cVal); - if (cVal != NEW_LINE[num]) { - log_err("ustdio newline error\n"); - } + virtual const char* getTestDataPath(UErrorCode& err) { + return loadTestData(err); } +}; + +const char* DataDrivenLogger::fgDataDir = NULL; +char* DataDrivenLogger::fgTestDataPath = NULL; - for (num = 0; num < 0x80; num++) { - cVal = -1; - fscanf(myCFile, "%c", &cVal); - if (num != cVal) { - log_err("%%c Got: 0x%x, Expected: 0x%x\n", cVal, num); +static int64_t +uto64(const UChar *buffer) +{ + int64_t result = 0; + /* iterate through buffer */ + while(*buffer) { + /* read the next digit */ + result *= 16; + if (!u_isxdigit(*buffer)) { + log_err("\\u%04X is not a valid hex digit for this test\n", (UChar)*buffer); } + result += *buffer - 0x0030 - (*buffer >= 0x0041 ? (*buffer >= 0x0061 ? 39 : 7) : 0); + buffer++; } - fclose(myCFile); -} - -#define TestFPrintFormat(uFormat, uValue, cFormat, cValue) \ - myFile = u_fopen(STANDARD_TEST_FILE, "w", "en_US_POSIX", NULL);\ - /* Reinitialize the buffer to verify null termination works. */\ - u_memset(uBuffer, 0x2a, sizeof(uBuffer)/sizeof(*uBuffer));\ - memset(buffer, 0x2a, sizeof(buffer)/sizeof(*buffer));\ - \ - uNumPrinted = u_fprintf(myFile, uFormat, uValue);\ - u_fclose(myFile);\ - myFile = u_fopen(STANDARD_TEST_FILE, "r", "en_US_POSIX", NULL);\ - u_fgets(myFile, sizeof(uBuffer)/sizeof(*uBuffer), uBuffer);\ - u_fclose(myFile);\ - u_austrncpy(compBuffer, uBuffer, sizeof(uBuffer)/sizeof(*uBuffer));\ - cNumPrinted = sprintf(buffer, cFormat, cValue);\ - if (strcmp(buffer, compBuffer) != 0) {\ - log_err("%" uFormat " Got: \"%s\", Expected: \"%s\"\n", compBuffer, buffer);\ - }\ - if (cNumPrinted != uNumPrinted) {\ - log_err("%" uFormat " number printed Got: %d, Expected: %d\n", uNumPrinted, cNumPrinted);\ - }\ - if (buffer[uNumPrinted+1] != 0x2a) {\ - log_err("%" uFormat " too much stored\n");\ - }\ - -#define TestFPrintFormat2(format, precision, value) \ - myFile = u_fopen(STANDARD_TEST_FILE, "w", "en_US_POSIX", NULL);\ - /* Reinitialize the buffer to verify null termination works. */\ - u_memset(uBuffer, 0x2a, sizeof(uBuffer)/sizeof(*uBuffer));\ - memset(buffer, 0x2a, sizeof(buffer)/sizeof(*buffer));\ - \ - uNumPrinted = u_fprintf(myFile, format, precision, value);\ - u_fclose(myFile);\ - myFile = u_fopen(STANDARD_TEST_FILE, "r", "en_US_POSIX", NULL);\ - u_fgets(myFile, sizeof(uBuffer)/sizeof(*uBuffer), uBuffer);\ - u_fclose(myFile);\ - u_austrncpy(compBuffer, uBuffer, sizeof(uBuffer)/sizeof(*uBuffer));\ - cNumPrinted = sprintf(buffer, format, precision, value);\ - if (strcmp(buffer, compBuffer) != 0) {\ - log_err("%" format " Got: \"%s\", Expected: \"%s\"\n", compBuffer, buffer);\ - }\ - if (cNumPrinted != uNumPrinted) {\ - log_err("%" format " number printed Got: %d, Expected: %d\n", uNumPrinted, cNumPrinted);\ - }\ - -static void TestFprintfFormat() { - static const UChar abcUChars[] = {0x61,0x62,0x63,0}; - static const char abcChars[] = "abc"; - UChar uBuffer[256]; - char buffer[256]; - char compBuffer[256]; - int32_t uNumPrinted; - int32_t cNumPrinted; - UFILE *myFile; - - TestFPrintFormat("%8U", abcUChars, "%8s", abcChars); - TestFPrintFormat("%-8U", abcUChars, "%-8s", abcChars); - - TestFPrintFormat("%8s", abcChars, "%8s", abcChars); - TestFPrintFormat("%-8s", abcChars, "%-8s", abcChars); - - TestFPrintFormat("%8c", 0x65, "%8c", 0x65); - TestFPrintFormat("%-8c", 0x65, "%-8c", 0x65); - - TestFPrintFormat("%8K", (UChar)0x65, "%8c", (char)0x65); - TestFPrintFormat("%-8K", (UChar)0x65, "%-8c", (char)0x65); - - TestFPrintFormat("%10f", 1.23456789, "%10f", 1.23456789); - TestFPrintFormat("%-10f", 1.23456789, "%-10f", 1.23456789); - TestFPrintFormat("%10f", 123.456789, "%10f", 123.456789); - TestFPrintFormat("%-10f", 123.456789, "%-10f", 123.456789); - - TestFPrintFormat("%e", 1234567.89, "%e", 1234567.89); - TestFPrintFormat("%E", 1234567.89, "%E", 1234567.89); - TestFPrintFormat("%10e", 1.23456789, "%10e", 1.23456789); - TestFPrintFormat("%-10e", 1.23456789, "%-10e", 1.23456789); - TestFPrintFormat("%10e", 1234.56789, "%10e", 1234.56789); - TestFPrintFormat("%-10e", 1234.56789, "%-10e", 1234.56789); - - TestFPrintFormat("%g", 123456.789, "%g", 123456.789); - TestFPrintFormat("%g", 1234567.89, "%g", 1234567.89); - TestFPrintFormat("%G", 1234567.89, "%G", 1234567.89); - TestFPrintFormat("%10g", 1.23456789, "%10g", 1.23456789); - TestFPrintFormat("%-10g", 1.23456789, "%-10g", 1.23456789); - TestFPrintFormat("%10g", 123.456789, "%10g", 123.456789); - TestFPrintFormat("%-10g", 123.456789, "%-10g", 123.456789); - - TestFPrintFormat("%8x", 123456, "%8x", 123456); - TestFPrintFormat("%-8x", 123456, "%-8x", 123456); - - TestFPrintFormat("%8X", 123456, "%8X", 123456); - TestFPrintFormat("%-8X", 123456, "%-8X", 123456); - TestFPrintFormat("%#x", 123456, "%#x", 123456); - TestFPrintFormat("%#x", -123456, "%#x", -123456); - - TestFPrintFormat("%8o", 123456, "%8o", 123456); - TestFPrintFormat("%-8o", 123456, "%-8o", 123456); - TestFPrintFormat("%#o", 123, "%#o", 123); - TestFPrintFormat("%#o", -123, "%#o", -123); - - TestFPrintFormat("%8u", 123456, "%8u", 123456); - TestFPrintFormat("%-8u", 123456, "%-8u", 123456); - TestFPrintFormat("%8u", -123456, "%8u", -123456); - TestFPrintFormat("%-8u", -123456, "%-8u", -123456); - - TestFPrintFormat("%8d", 123456, "%8d", 123456); - TestFPrintFormat("%-8d", 123456, "%-8d", 123456); - TestFPrintFormat("% d", 123456, "% d", 123456); - TestFPrintFormat("% d", -123456, "% d", -123456); - - TestFPrintFormat("%8i", 123456, "%8i", 123456); - TestFPrintFormat("%-8i", 123456, "%-8i", 123456); - - TestFPrintFormat2("%+1.*e", 4, 1.2345678); - TestFPrintFormat2("%+2.*e", 6, 1.2345678); - - log_verbose("Get really crazy with the formatting.\n"); - - TestFPrintFormat("%-#12x", 123, "%-#12x", 123); - TestFPrintFormat("%-#12x", -123, "%-#12x", -123); - TestFPrintFormat("%#12x", 123, "%#12x", 123); - TestFPrintFormat("%#12x", -123, "%#12x", -123); - - TestFPrintFormat("%-+12d", 123, "%-+12d", 123); - TestFPrintFormat("%-+12d", -123, "%-+12d", -123); - TestFPrintFormat("%- 12d", 123, "%- 12d", 123); - TestFPrintFormat("%- 12d", -123, "%- 12d", -123); - TestFPrintFormat("%+12d", 123, "%+12d", 123); - TestFPrintFormat("%+12d", -123, "%+12d", -123); - TestFPrintFormat("% 12d", 123, "% 12d", 123); - TestFPrintFormat("% 12d", -123, "% 12d", -123); - TestFPrintFormat("%12d", 123, "%12d", 123); - TestFPrintFormat("%12d", -123, "%12d", -123); - - TestFPrintFormat("%-+12.1e", 1.234, "%-+12.1e", 1.234); - TestFPrintFormat("%-+12.1e", -1.234, "%-+12.1e", -1.234); - TestFPrintFormat("%- 12.1e", 1.234, "%- 12.1e", 1.234); - TestFPrintFormat("%- 12.1e", -1.234, "%- 12.1e", -1.234); - TestFPrintFormat("%+12.1e", 1.234, "%+12.1e", 1.234); - TestFPrintFormat("%+12.1e", -1.234, "%+12.1e", -1.234); - TestFPrintFormat("% 12.1e", 1.234, "% 12.1e", 1.234); - TestFPrintFormat("% 12.1e", -1.234, "% 12.1e", -1.234); - TestFPrintFormat("%12.1e", 1.234, "%12.1e", 1.234); - TestFPrintFormat("%12.1e", -1.234, "%12.1e", -1.234); - TestFPrintFormat("%.2e", 1.234, "%.2e", 1.234); - TestFPrintFormat("%.2e", -1.234, "%.2e", -1.234); - TestFPrintFormat("%3e", 1.234, "%3e", 1.234); - TestFPrintFormat("%3e", -1.234, "%3e", -1.234); - - TestFPrintFormat("%-+12.1f", 1.234, "%-+12.1f", 1.234); - TestFPrintFormat("%-+12.1f", -1.234, "%-+12.1f", -1.234); - TestFPrintFormat("%- 12.1f", 1.234, "%- 12.1f", 1.234); - TestFPrintFormat("%- 12.1f", -1.234, "%- 12.1f", -1.234); - TestFPrintFormat("%+12.1f", 1.234, "%+12.1f", 1.234); - TestFPrintFormat("%+12.1f", -1.234, "%+12.1f", -1.234); - TestFPrintFormat("% 12.1f", 1.234, "% 12.1f", 1.234); - TestFPrintFormat("% 12.1f", -1.234, "% 12.1f", -1.234); - TestFPrintFormat("%12.1f", 1.234, "%12.1f", 1.234); - TestFPrintFormat("%12.1f", -1.234, "%12.1f", -1.234); - TestFPrintFormat("%.2f", 1.234, "%.2f", 1.234); - TestFPrintFormat("%.2f", -1.234, "%.2f", -1.234); - TestFPrintFormat("%3f", 1.234, "%3f", 1.234); - TestFPrintFormat("%3f", -1.234, "%3f", -1.234); - + return result; } -#undef TestFPrintFormat - -static void TestString() { - int32_t n[1]; - float myFloat = -1234.0; - UDate myDate = 0.0; - UDate dec_31_1969 = -57600000.000000; /* TODO: These are not correct */ - UDate midnight = 86400000.000000; /* TODO: These are not correct */ - UDate myNewDate = -1.0; - int32_t newValuePtr[1]; - double newDoubleValuePtr[1]; - UChar myUString[512]; - UChar uStringBuf[512]; - char myString[512] = ""; - char testBuf[512] = ""; - - u_memset(myUString, 0x0a, sizeof(myUString)/ sizeof(*myUString)); - u_memset(uStringBuf, 0x0a, sizeof(uStringBuf) / sizeof(*uStringBuf)); - - *n = -1234; - - /* Test sprintf */ - u_sprintf(uStringBuf, NULL, "Signed decimal integer d: %d", *n); - *newValuePtr = 1; - u_sscanf(uStringBuf, NULL, "Signed decimal integer d: %d", newValuePtr); - if (*n != *newValuePtr) { - log_err("%%d Got: %d, Expected: %d\n", *newValuePtr, *n); - } - - u_sprintf(uStringBuf, NULL, "Signed decimal integer i: %i", *n); - *newValuePtr = 1; - u_sscanf(uStringBuf, NULL, "Signed decimal integer i: %i", newValuePtr); - if (*n != *newValuePtr) { - log_err("%%i Got: %i, Expected: %i\n", *newValuePtr, *n); - } - - u_sprintf(uStringBuf, NULL, "Unsigned octal integer o: %o", *n); - *newValuePtr = 1; - u_sscanf(uStringBuf, NULL, "Unsigned octal integer o: %o", newValuePtr); - if (*n != *newValuePtr) { - log_err("%%o Got: %o, Expected: %o\n", *newValuePtr, *n); - } - - u_sprintf(uStringBuf, NULL, "Unsigned decimal integer %%u: %u", *n); - *newValuePtr = 1; - u_sscanf(uStringBuf, NULL, "Unsigned decimal integer %%u: %u", newValuePtr); - if (*n != *newValuePtr) { - log_err("%%u Got: %u, Expected: %u\n", *newValuePtr, *n); - } - - u_sprintf(uStringBuf, NULL, "Lowercase unsigned hexadecimal integer x: %x", *n); - *newValuePtr = 1; - u_sscanf(uStringBuf, NULL, "Lowercase unsigned hexadecimal integer x: %x", newValuePtr); - if (*n != *newValuePtr) { - log_err("%%x Got: %x, Expected: %x\n", *newValuePtr, *n); - } - - u_sprintf(uStringBuf, NULL, "Uppercase unsigned hexadecimal integer X: %X", *n); - *newValuePtr = 1; - u_sscanf(uStringBuf, NULL, "Uppercase unsigned hexadecimal integer X: %X", newValuePtr); - if (*n != *newValuePtr) { - log_err("%%X Got: %X, Expected: %X\n", *newValuePtr, *n); - } - - u_sprintf(uStringBuf, NULL, "Float f: %f", myFloat); - *newDoubleValuePtr = -1.0; - u_sscanf(uStringBuf, NULL, "Float f: %f", newDoubleValuePtr); - if (myFloat != *newDoubleValuePtr) { - log_err("%%f Got: %f, Expected: %f\n", *newDoubleValuePtr, myFloat); - } - - u_sprintf(uStringBuf, NULL, "Lowercase float e: %e", myFloat); - *newDoubleValuePtr = -1.0; - u_sscanf(uStringBuf, NULL, "Lowercase float e: %e", newDoubleValuePtr); - if (myFloat != *newDoubleValuePtr) { - log_err("%%e Got: %e, Expected: %e\n", *newDoubleValuePtr, myFloat); - } - - u_sprintf(uStringBuf, NULL, "Uppercase float E: %E", myFloat); - *newDoubleValuePtr = -1.0; - u_sscanf(uStringBuf, NULL, "Uppercase float E: %E", newDoubleValuePtr); - if (myFloat != *newDoubleValuePtr) { - log_err("%%E Got: %E, Expected: %E\n", *newDoubleValuePtr, myFloat); - } - - u_sprintf(uStringBuf, NULL, "Lowercase float g: %g", myFloat); - *newDoubleValuePtr = -1.0; - u_sscanf(uStringBuf, NULL, "Lowercase float g: %g", newDoubleValuePtr); - if (myFloat != *newDoubleValuePtr) { - log_err("%%g Got: %g, Expected: %g\n", *newDoubleValuePtr, myFloat); - } - - u_sprintf(uStringBuf, NULL, "Uppercase float G: %G", myFloat); - *newDoubleValuePtr = -1.0; - u_sscanf(uStringBuf, NULL, "Uppercase float G: %G", newDoubleValuePtr); - if (myFloat != *newDoubleValuePtr) { - log_err("%%G Got: %G, Expected: %G\n", *newDoubleValuePtr, myFloat); - } - -// u_sprintf(uStringBuf, NULL, "Pointer %%p: %p\n", myFile); - u_sprintf(uStringBuf, NULL, "Char c: %c", 'A'); - u_sscanf(uStringBuf, NULL, "Char c: %c", myString); - if (*myString != 'A') { - log_err("%%c Got: %c, Expected: A\n", *myString); - } - u_sprintf(uStringBuf, NULL, "UChar %%K (non-ANSI, should be %%C for Microsoft?): %K", L'A'); - u_sscanf(uStringBuf, NULL, "UChar %%K (non-ANSI, should be %%C for Microsoft?): %K", myUString); - if (*myUString != L'A') { - log_err("%%C Got: %C, Expected: A\n", *myUString); - } - - u_sprintf(uStringBuf, NULL, "String %%s: %s", "My-String"); - u_sscanf(uStringBuf, NULL, "String %%s: %s", myString); - if (strcmp(myString, "My-String")) { - log_err("%%s Got: %s, Expected: My-String\n", myString); - } - if (uStringBuf[20] != 0) { - log_err("String not terminated. Got %c\n", uStringBuf[20] ); - } - u_sprintf(uStringBuf, NULL, "NULL String %%s: %s", NULL); - u_sscanf(uStringBuf, NULL, "NULL String %%s: %s", myString); - if (strcmp(myString, "(null)")) { - log_err("%%s Got: %s, Expected: My-String\n", myString); - } - - u_sprintf(uStringBuf, NULL, "Unicode String %%U (non-ANSI, should be %%S for Microsoft?): %U", L"My-String"); - u_sscanf(uStringBuf, NULL, "Unicode String %%U (non-ANSI, should be %%S for Microsoft?): %U", myUString); - u_austrncpy(myString, myUString, sizeof(myString)/sizeof(*myString)); - if (strcmp(myString, "My-String")) { - log_err("%%U Got: %s, Expected: My String\n", myString); - } - - u_sprintf(uStringBuf, NULL, "NULL Unicode String %%U (non-ANSI, should be %%S for Microsoft?): %U", NULL); - u_sscanf(uStringBuf, NULL, "NULL Unicode String %%U (non-ANSI, should be %%S for Microsoft?): %U", myUString); - u_austrncpy(myString, myUString, sizeof(myString)/sizeof(*myString)); - if (strcmp(myString, "(null)")) { - log_err("%%U Got: %s, Expected: (null)\n", myString); - } - - u_sprintf(uStringBuf, NULL, "Date %%D (non-ANSI): %D", myDate); - myNewDate = -1.0; - u_sscanf(uStringBuf, NULL, "Date %%D (non-ANSI): %D", &myNewDate); - if (myNewDate != dec_31_1969) { - log_err("%%D Got: %f, Expected: %f\n", myNewDate, dec_31_1969); - } - - u_sprintf(uStringBuf, NULL, "Time %%T (non-ANSI): %T", myDate); - myNewDate = -1.0; - u_sscanf(uStringBuf, NULL, "Time %%T (non-ANSI): %T", &myNewDate); - if (myNewDate != midnight) { - log_err("%%T Got: %f, Expected: %f\n", myNewDate, midnight); - } - - u_sprintf(uStringBuf, NULL, "Percent %%P (non-ANSI): %P", myFloat); - *newDoubleValuePtr = -1.0; - u_sscanf(uStringBuf, NULL, "Percent %%P (non-ANSI): %P", newDoubleValuePtr); - if (myFloat != *newDoubleValuePtr) { - log_err("%%P Got: %P, Expected: %P\n", *newDoubleValuePtr, myFloat); - } - - u_sprintf(uStringBuf, NULL, "Currency %%M (non-ANSI): %M", myFloat); - *newDoubleValuePtr = -1.0; - u_sscanf(uStringBuf, NULL, "Currency %%M (non-ANSI): %M", newDoubleValuePtr); - if (myFloat != *newDoubleValuePtr) { - log_err("%%P Got: %P, Expected: %P\n", *newDoubleValuePtr, myFloat); +U_CDECL_BEGIN +static void U_CALLCONV DataDrivenPrintf(void) +{ +#if !UCONFIG_NO_FORMATTING + UErrorCode errorCode; + TestDataModule *dataModule; + TestData *testData; + const DataMap *testCase; + DataDrivenLogger logger; + UChar uBuffer[512]; + char cBuffer[512]; + char cFormat[sizeof(cBuffer)]; + char cExpected[sizeof(cBuffer)]; + UnicodeString tempStr; + UChar format[512]; + UChar expectedResult[512]; + UChar argument[512]; + int32_t i; + int8_t i8; + int16_t i16; + int32_t i32; + int64_t i64; + double dbl; + int32_t uBufferLenReturned; + + const char *fileLocale = "en_US_POSIX"; + int32_t uFileBufferLenReturned; + UFILE *testFile; + + errorCode=U_ZERO_ERROR; + dataModule=TestDataModule::getTestDataModule("icuio", logger, errorCode); + if(U_SUCCESS(errorCode)) { + testData=dataModule->createTestData("printf", errorCode); + if(U_SUCCESS(errorCode)) { + for(i=0; testData->nextCase(testCase, errorCode); ++i) { + if(U_FAILURE(errorCode)) { + log_err("error retrieving icuio/printf test case %d - %s\n", + i, u_errorName(errorCode)); + errorCode=U_ZERO_ERROR; + continue; + } + testFile = u_fopen(STANDARD_TEST_FILE, "w", fileLocale, "UTF-8"); + if (!testFile) { + log_err("Can't open test file - %s\n", + STANDARD_TEST_FILE); + continue; + } + u_memset(uBuffer, 0x2A, sizeof(uBuffer)/sizeof(uBuffer[0])); + uBuffer[sizeof(uBuffer)/sizeof(uBuffer[0])-1] = 0; + tempStr=testCase->getString("format", errorCode); + tempStr.extract(format, sizeof(format)/sizeof(format[0]), errorCode); + tempStr=testCase->getString("result", errorCode); + tempStr.extract(expectedResult, sizeof(expectedResult)/sizeof(expectedResult[0]), errorCode); + tempStr=testCase->getString("argument", errorCode); + tempStr.extract(argument, sizeof(argument)/sizeof(argument[0]), errorCode); + u_austrncpy(cBuffer, format, sizeof(cBuffer)); + if(U_FAILURE(errorCode)) { + log_err("error retrieving icuio/printf test case %d - %s\n", + i, u_errorName(errorCode)); + errorCode=U_ZERO_ERROR; + continue; + } + log_verbose("Test %d: format=\"%s\"\n", i, cBuffer); + switch (testCase->getString("argumentType", errorCode)[0]) { + case 0x64: // 'd' double + dbl = atof(u_austrcpy(cBuffer, argument)); + uBufferLenReturned = u_sprintf_u(uBuffer, format, dbl); + uFileBufferLenReturned = u_fprintf_u(testFile, format, dbl); + break; + case 0x31: // '1' int8_t + i8 = (int8_t)uto64(argument); + uBufferLenReturned = u_sprintf_u(uBuffer, format, i8); + uFileBufferLenReturned = u_fprintf_u(testFile, format, i8); + break; + case 0x32: // '2' int16_t + i16 = (int16_t)uto64(argument); + uBufferLenReturned = u_sprintf_u(uBuffer, format, i16); + uFileBufferLenReturned = u_fprintf_u(testFile, format, i16); + break; + case 0x34: // '4' int32_t + i32 = (int32_t)uto64(argument); + uBufferLenReturned = u_sprintf_u(uBuffer, format, i32); + uFileBufferLenReturned = u_fprintf_u(testFile, format, i32); + break; + case 0x38: // '8' int64_t + i64 = uto64(argument); + uBufferLenReturned = u_sprintf_u(uBuffer, format, i64); + uFileBufferLenReturned = u_fprintf_u(testFile, format, i64); + break; + case 0x73: // 's' char * + u_austrncpy(cBuffer, uBuffer, sizeof(cBuffer)); + uBufferLenReturned = u_sprintf_u(uBuffer, format, cBuffer); + uFileBufferLenReturned = u_fprintf_u(testFile, format, cBuffer); + break; + case 0x53: // 'S' UChar * + uBufferLenReturned = u_sprintf_u(uBuffer, format, argument); + uFileBufferLenReturned = u_fprintf_u(testFile, format, argument); + break; + default: + uBufferLenReturned = 0; + uFileBufferLenReturned = 0; + log_err("Unknown type %c for test %d\n", testCase->getString("argumentType", errorCode)[0], i); + } + if (u_strcmp(uBuffer, expectedResult) != 0) { + u_austrncpy(cBuffer, uBuffer, sizeof(cBuffer)); + u_austrncpy(cFormat, format, sizeof(cFormat)); + u_austrncpy(cExpected, expectedResult, sizeof(cExpected)); + cBuffer[sizeof(cBuffer)-1] = 0; + log_err("FAILURE string test case %d \"%s\" - Got: \"%s\" Expected: \"%s\"\n", + i, cFormat, cBuffer, cExpected); + } + if (uBuffer[uBufferLenReturned-1] == 0 + || uBuffer[uBufferLenReturned] != 0 + || uBuffer[uBufferLenReturned+1] != 0x2A + || uBuffer[uBufferLenReturned+2] != 0x2A) + { + u_austrncpy(cBuffer, uBuffer, sizeof(cBuffer)); + cBuffer[sizeof(cBuffer)-1] = 0; + log_err("FAILURE test case %d - \"%s\" wrong amount of characters was written. Got %d.\n", + i, cBuffer, uBufferLenReturned); + } + u_fclose(testFile); + testFile = u_fopen(STANDARD_TEST_FILE, "r", fileLocale, "UTF-8"); + if (!testFile) { + log_err("Can't open test file - %s\n", + STANDARD_TEST_FILE); + } + uBuffer[0]=0; + u_fgets(uBuffer, sizeof(uBuffer)/sizeof(uBuffer[0]), testFile); + if (u_strcmp(uBuffer, expectedResult) != 0) { + u_austrncpy(cBuffer, uBuffer, sizeof(cBuffer)); + u_austrncpy(cFormat, format, sizeof(cFormat)); + u_austrncpy(cExpected, expectedResult, sizeof(cExpected)); + cBuffer[sizeof(cBuffer)-1] = 0; + log_err("FAILURE file test case %d \"%s\" - Got: \"%s\" Expected: \"%s\"\n", + i, cFormat, cBuffer, cExpected); + } + if (uFileBufferLenReturned != uBufferLenReturned) + { + u_austrncpy(cBuffer, uBuffer, sizeof(cBuffer)); + cBuffer[sizeof(cBuffer)-1] = 0; + log_err("FAILURE uFileBufferLenReturned(%d) != uBufferLenReturned(%d)\n", + uFileBufferLenReturned, uBufferLenReturned); + } + + if(U_FAILURE(errorCode)) { + log_err("error running icuio/printf test case %d - %s\n", + i, u_errorName(errorCode)); + errorCode=U_ZERO_ERROR; + continue; + } + u_fclose(testFile); + } + delete testData; + } + delete dataModule; } - - u_sprintf(uStringBuf, NULL, "Spell Out %%V (non-ANSI): %V", myFloat); - *newDoubleValuePtr = -1.0; - u_sscanf(uStringBuf, NULL, "Spell Out %%V (non-ANSI): %V", newDoubleValuePtr); - if (myFloat != *newDoubleValuePtr) { - log_err("%%V Got: %f, Expected: %f\n", *newDoubleValuePtr, myFloat); + else { + log_err("Failed: could not load test icuio data\n"); } +#endif +} +U_CDECL_END - *newValuePtr = 1; - u_sprintf(uStringBuf, NULL, "\t\nPointer to integer (Count) %%n: n=%d %n n=%d\n", *newValuePtr, newValuePtr, *newValuePtr); - if (*newValuePtr != 37) { - log_err("%%V Got: %f, Expected: %f\n", *newDoubleValuePtr, myFloat); +U_CDECL_BEGIN +static void U_CALLCONV DataDrivenScanf(void) +{ +#if !UCONFIG_NO_FORMATTING + UErrorCode errorCode; + TestDataModule *dataModule; + TestData *testData; + const DataMap *testCase; + DataDrivenLogger logger; + UChar uBuffer[512]; + char cBuffer[512]; + char cExpected[sizeof(cBuffer)]; + UnicodeString tempStr; + UChar format[512]; + UChar expectedResult[512]; + UChar argument[512]; + int32_t i; + int8_t i8, expected8; + int16_t i16, expected16; + int32_t i32, expected32; + int64_t i64, expected64; + double dbl, expectedDbl; + int32_t uBufferLenReturned; + + //const char *fileLocale = "en_US_POSIX"; + //int32_t uFileBufferLenReturned; + //UFILE *testFile; + + errorCode=U_ZERO_ERROR; + dataModule=TestDataModule::getTestDataModule("icuio", logger, errorCode); + if(U_SUCCESS(errorCode)) { + testData=dataModule->createTestData("scanf", errorCode); + if(U_SUCCESS(errorCode)) { + for(i=0; testData->nextCase(testCase, errorCode); ++i) { + if(U_FAILURE(errorCode)) { + log_err("error retrieving icuio/printf test case %d - %s\n", + i, u_errorName(errorCode)); + errorCode=U_ZERO_ERROR; + continue; + } +/* testFile = u_fopen(STANDARD_TEST_FILE, "w", fileLocale, "UTF-8"); + if (!testFile) { + log_err("Can't open test file - %s\n", + STANDARD_TEST_FILE); + }*/ + u_memset(uBuffer, 0x2A, sizeof(uBuffer)/sizeof(uBuffer[0])); + uBuffer[sizeof(uBuffer)/sizeof(uBuffer[0])-1] = 0; + tempStr=testCase->getString("format", errorCode); + tempStr.extract(format, sizeof(format)/sizeof(format[0]), errorCode); + tempStr=testCase->getString("result", errorCode); + tempStr.extract(expectedResult, sizeof(expectedResult)/sizeof(expectedResult[0]), errorCode); + tempStr=testCase->getString("argument", errorCode); + tempStr.extract(argument, sizeof(argument)/sizeof(argument[0]), errorCode); + u_austrncpy(cBuffer, format, sizeof(cBuffer)); + if(U_FAILURE(errorCode)) { + log_err("error retrieving icuio/printf test case %d - %s\n", + i, u_errorName(errorCode)); + errorCode=U_ZERO_ERROR; + continue; + } + log_verbose("Test %d: format=\"%s\"\n", i, cBuffer); + switch (testCase->getString("argumentType", errorCode)[0]) { + case 0x64: // 'd' double + expectedDbl = atof(u_austrcpy(cBuffer, expectedResult)); + uBufferLenReturned = u_sscanf_u(argument, format, &dbl); + //uFileBufferLenReturned = u_fscanf_u(testFile, format, dbl); + if (dbl != expectedDbl) { + log_err("error in scanf test case[%d] Got: %f Exp: %f\n", + i, dbl, expectedDbl); + } + break; + case 0x31: // '1' int8_t + expected8 = (int8_t)uto64(expectedResult); + uBufferLenReturned = u_sscanf_u(argument, format, &i8); + //uFileBufferLenReturned = u_fscanf_u(testFile, format, i8); + if (i8 != expected8) { + log_err("error in scanf test case[%d] Got: %02X Exp: %02X\n", + i, i8, expected8); + } + break; + case 0x32: // '2' int16_t + expected16 = (int16_t)uto64(expectedResult); + uBufferLenReturned = u_sscanf_u(argument, format, &i16); + //uFileBufferLenReturned = u_fscanf_u(testFile, format, i16); + if (i16 != expected16) { + log_err("error in scanf test case[%d] Got: %04X Exp: %04X\n", + i, i16, expected16); + } + break; + case 0x34: // '4' int32_t + expected32 = (int32_t)uto64(expectedResult); + uBufferLenReturned = u_sscanf_u(argument, format, &i32); + //uFileBufferLenReturned = u_fscanf_u(testFile, format, i32); + if (i32 != expected32) { + log_err("error in scanf test case[%d] Got: %08X Exp: %08X\n", + i, i32, expected32); + } + break; + case 0x38: // '8' int64_t + expected64 = uto64(expectedResult); + uBufferLenReturned = u_sscanf_u(argument, format, &i64); + //uFileBufferLenReturned = u_fscanf_u(testFile, format, i64); + if (i64 != expected64) { + log_err("error in scanf 64-bit. Test case = %d\n", i); + } + break; + case 0x73: // 's' char * + u_austrcpy(cExpected, expectedResult); + uBufferLenReturned = u_sscanf_u(argument, format, cBuffer); + //uFileBufferLenReturned = u_fscanf_u(testFile, format, cBuffer); + if (strcmp(cBuffer, cExpected) != 0) { + log_err("error in scanf char * string. Got \"%s\" Expected \"%s\". Test case = %d\n", cBuffer, cExpected, i); + } + break; + case 0x53: // 'S' UChar * + uBufferLenReturned = u_sscanf_u(argument, format, uBuffer); + //uFileBufferLenReturned = u_fscanf_u(testFile, format, argument); + if (u_strcmp(uBuffer, expectedResult) != 0) { + u_austrcpy(cExpected, format); + u_austrcpy(cBuffer, uBuffer); + log_err("error in scanf UChar * string %s Got: \"%s\". Test case = %d\n", cExpected, cBuffer, i); + } + break; + default: + uBufferLenReturned = 0; + //uFileBufferLenReturned = 0; + log_err("Unknown type %c for test %d\n", testCase->getString("argumentType", errorCode)[0], i); + } + if (uBufferLenReturned != 1) { + log_err("error scanf converted %d arguments. Test case = %d\n", uBufferLenReturned, i); + } +/* if (u_strcmp(uBuffer, expectedResult) != 0) { + u_austrncpy(cBuffer, uBuffer, sizeof(cBuffer)); + u_austrncpy(cFormat, format, sizeof(cFormat)); + u_austrncpy(cExpected, expectedResult, sizeof(cExpected)); + cBuffer[sizeof(cBuffer)-1] = 0; + log_err("FAILURE string test case %d \"%s\" - Got: \"%s\" Expected: \"%s\"\n", + i, cFormat, cBuffer, cExpected); + } + if (uBuffer[uBufferLenReturned-1] == 0 + || uBuffer[uBufferLenReturned] != 0 + || uBuffer[uBufferLenReturned+1] != 0x2A + || uBuffer[uBufferLenReturned+2] != 0x2A) + { + u_austrncpy(cBuffer, uBuffer, sizeof(cBuffer)); + cBuffer[sizeof(cBuffer)-1] = 0; + log_err("FAILURE test case %d - \"%s\" wrong amount of characters was written. Got %d.\n", + i, cBuffer, uBufferLenReturned); + }*/ +/* u_fclose(testFile); + testFile = u_fopen(STANDARD_TEST_FILE, "r", fileLocale, "UTF-8"); + if (!testFile) { + log_err("Can't open test file - %s\n", + STANDARD_TEST_FILE); + } + uBuffer[0]; + u_fgets(uBuffer, sizeof(uBuffer)/sizeof(uBuffer[0]), testFile); + if (u_strcmp(uBuffer, expectedResult) != 0) { + u_austrncpy(cBuffer, uBuffer, sizeof(cBuffer)); + u_austrncpy(cFormat, format, sizeof(cFormat)); + u_austrncpy(cExpected, expectedResult, sizeof(cExpected)); + cBuffer[sizeof(cBuffer)-1] = 0; + log_err("FAILURE file test case %d \"%s\" - Got: \"%s\" Expected: \"%s\"\n", + i, cFormat, cBuffer, cExpected); + } + if (uFileBufferLenReturned != uBufferLenReturned) + { + u_austrncpy(cBuffer, uBuffer, sizeof(cBuffer)); + cBuffer[sizeof(cBuffer)-1] = 0; + log_err("FAILURE uFileBufferLenReturned(%d) != uBufferLenReturned(%d)\n", + uFileBufferLenReturned, uBufferLenReturned); + } +*/ + if(U_FAILURE(errorCode)) { + log_err("error running icuio/printf test case %d - %s\n", + i, u_errorName(errorCode)); + errorCode=U_ZERO_ERROR; + continue; + } +// u_fclose(testFile); + } + delete testData; + } + delete dataModule; } - - u_sprintf(myUString, NULL, "This is a long test123456789012345678901234567890123456789012345678901234567890"); - u_austrncpy(myString, myUString, sizeof(myString)/sizeof(*myString)); - if (strcmp(myString, "This is a long test123456789012345678901234567890123456789012345678901234567890")) { - log_err("%%U Got: %s, Expected: My String\n", myString); + else { + log_err("Failed: could not load test icuio data\n"); } - - -// u_sscanf(uStringBuf, NULL, "Pointer %%p: %p\n", myFile); -} - -#define Test_u_snprintf(limit, format, value, expectedSize, expectedStr) \ - u_uastrncpy(testStr, "xxxxxxxxxxxxxx", sizeof(testStr)/sizeof(testStr[0]));\ - size = u_snprintf(testStr, limit, "en_US_POSIX", format, value);\ - u_austrncpy(cTestResult, testStr, sizeof(cTestResult)/sizeof(cTestResult[0]));\ - if (size != expectedSize || strcmp(cTestResult, expectedStr) != 0) {\ - log_err("Unexpected formatting. size=%d expectedSize=%d cTestResult=%s expectedStr=%s\n",\ - size, expectedSize, cTestResult, expectedStr);\ - }\ - else {\ - log_verbose("Got: %s\n", cTestResult);\ - }\ - - -static void TestSnprintf() { - UChar testStr[256]; - char cTestResult[256]; - int32_t size; - - Test_u_snprintf(0, "%d", 123, 0, "xxxxxxxxxxxxxx"); - Test_u_snprintf(2, "%d", 123, 2, "12xxxxxxxxxxxx"); - Test_u_snprintf(3, "%d", 123, 3, "123xxxxxxxxxxx"); - Test_u_snprintf(4, "%d", 123, 3, "123"); - - Test_u_snprintf(0, "%s", "abcd", 0, "xxxxxxxxxxxxxx"); - Test_u_snprintf(3, "%s", "abcd", 3, "abcxxxxxxxxxxx"); - Test_u_snprintf(4, "%s", "abcd", 4, "abcdxxxxxxxxxx"); - Test_u_snprintf(5, "%s", "abcd", 4, "abcd"); - - Test_u_snprintf(0, "%e", 12.34, 0, "xxxxxxxxxxxxxx"); - Test_u_snprintf(1, "%e", 12.34, 1, "1xxxxxxxxxxxxx"); - Test_u_snprintf(2, "%e", 12.34, 2, "1.xxxxxxxxxxxx"); - Test_u_snprintf(3, "%e", 12.34, 3, "1.2xxxxxxxxxxx"); - Test_u_snprintf(5, "%e", 12.34, 5, "1.234xxxxxxxxx"); - Test_u_snprintf(6, "%e", 12.34, 6, "1.2340xxxxxxxx"); - Test_u_snprintf(8, "%e", 12.34, 8, "1.234000xxxxxx"); - Test_u_snprintf(9, "%e", 12.34, 9, "1.234000exxxxx"); - Test_u_snprintf(10, "%e", 12.34, 10, "1.234000e+xxxx"); - Test_u_snprintf(11, "%e", 12.34, 11, "1.234000e+0xxx"); - Test_u_snprintf(13, "%e", 12.34, 13, "1.234000e+001x"); - Test_u_snprintf(14, "%e", 12.34, 13, "1.234000e+001"); -} - -#define TestSPrintFormat(uFormat, uValue, cFormat, cValue) \ - /* Reinitialize the buffer to verify null termination works. */\ - u_memset(uBuffer, 0x2a, sizeof(uBuffer)/sizeof(*uBuffer));\ - memset(buffer, 0x2a, sizeof(buffer)/sizeof(*buffer));\ - \ - uNumPrinted = u_sprintf(uBuffer, "en_US_POSIX", uFormat, uValue);\ - u_austrncpy(compBuffer, uBuffer, sizeof(uBuffer)/sizeof(uBuffer[0]));\ - cNumPrinted = sprintf(buffer, cFormat, cValue);\ - if (strcmp(buffer, compBuffer) != 0) {\ - log_err("%" uFormat " Got: \"%s\", Expected: \"%s\"\n", compBuffer, buffer);\ - }\ - if (cNumPrinted != uNumPrinted) {\ - log_err("%" uFormat " number printed Got: %d, Expected: %d\n", uNumPrinted, cNumPrinted);\ - }\ - if (buffer[uNumPrinted+1] != 0x2a) {\ - log_err("%" uFormat " too much stored\n");\ - }\ - -#define TestSPrintFormat2(format, precision, value) \ - /* Reinitialize the buffer to verify null termination works. */\ - u_memset(uBuffer, 0x2a, sizeof(uBuffer)/sizeof(*uBuffer));\ - memset(buffer, 0x2a, sizeof(buffer)/sizeof(*buffer));\ - \ - uNumPrinted = u_sprintf(uBuffer, "en_US_POSIX", format, precision, value);\ - u_austrncpy(compBuffer, uBuffer, sizeof(uBuffer)/sizeof(uBuffer[0]));\ - cNumPrinted = sprintf(buffer, format, precision, value);\ - if (strcmp(buffer, compBuffer) != 0) {\ - log_err("%" format " Got: \"%s\", Expected: \"%s\"\n", compBuffer, buffer);\ - }\ - if (cNumPrinted != uNumPrinted) {\ - log_err("%" format " number printed Got: %d, Expected: %d\n", uNumPrinted, cNumPrinted);\ - }\ - -static void TestSprintfFormat() { - static const UChar abcUChars[] = {0x61,0x62,0x63,0}; - static const char abcChars[] = "abc"; - UChar uBuffer[256]; - char buffer[256]; - char compBuffer[256]; - int32_t uNumPrinted; - int32_t cNumPrinted; - - TestSPrintFormat("%8U", abcUChars, "%8s", abcChars); - TestSPrintFormat("%-8U", abcUChars, "%-8s", abcChars); - - TestSPrintFormat("%8s", abcChars, "%8s", abcChars); - TestSPrintFormat("%-8s", abcChars, "%-8s", abcChars); - - TestSPrintFormat("%8c", 0x65, "%8c", 0x65); - TestSPrintFormat("%-8c", 0x65, "%-8c", 0x65); - - TestSPrintFormat("%8K", (UChar)0x65, "%8c", (char)0x65); - TestSPrintFormat("%-8K", (UChar)0x65, "%-8c", (char)0x65); - - TestSPrintFormat("%10f", 1.23456789, "%10f", 1.23456789); - TestSPrintFormat("%-10f", 1.23456789, "%-10f", 1.23456789); - TestSPrintFormat("%10f", 123.456789, "%10f", 123.456789); - TestSPrintFormat("%-10f", 123.456789, "%-10f", 123.456789); - - TestSPrintFormat("%e", 1234567.89, "%e", 1234567.89); - TestSPrintFormat("%E", 1234567.89, "%E", 1234567.89); - TestSPrintFormat("%10e", 1.23456789, "%10e", 1.23456789); - TestSPrintFormat("%-10e", 1.23456789, "%-10e", 1.23456789); - TestSPrintFormat("%10e", 123.456789, "%10e", 123.456789); - TestSPrintFormat("%-10e", 123.456789, "%-10e", 123.456789); - - TestSPrintFormat("%g", 123456.789, "%g", 123456.789); - TestSPrintFormat("%g", 1234567.89, "%g", 1234567.89); - TestSPrintFormat("%G", 1234567.89, "%G", 1234567.89); - TestSPrintFormat("%10g", 1.23456789, "%10g", 1.23456789); - TestSPrintFormat("%-10g", 1.23456789, "%-10g", 1.23456789); - TestSPrintFormat("%10g", 123.456789, "%10g", 123.456789); - TestSPrintFormat("%-10g", 123.456789, "%-10g", 123.456789); - - TestSPrintFormat("%8x", 123456, "%8x", 123456); - TestSPrintFormat("%-8x", 123456, "%-8x", 123456); - - TestSPrintFormat("%8X", 123456, "%8X", 123456); - TestSPrintFormat("%-8X", 123456, "%-8X", 123456); - TestSPrintFormat("%#x", 123456, "%#x", 123456); - TestSPrintFormat("%#x", -123456, "%#x", -123456); - - TestSPrintFormat("%8o", 123456, "%8o", 123456); - TestSPrintFormat("%-8o", 123456, "%-8o", 123456); - TestSPrintFormat("%#o", 123, "%#o", 123); - TestSPrintFormat("%#o", -123, "%#o", -123); - - TestSPrintFormat("%8u", 123456, "%8u", 123456); - TestSPrintFormat("%-8u", 123456, "%-8u", 123456); - TestSPrintFormat("%8u", -123456, "%8u", -123456); - TestSPrintFormat("%-8u", -123456, "%-8u", -123456); - - TestSPrintFormat("%8d", 123456, "%8d", 123456); - TestSPrintFormat("%-8d", 123456, "%-8d", 123456); - TestSPrintFormat("% d", 123456, "% d", 123456); - TestSPrintFormat("% d", -123456, "% d", -123456); - - TestSPrintFormat("%8i", 123456, "%8i", 123456); - TestSPrintFormat("%-8i", 123456, "%-8i", 123456); - - TestSPrintFormat2("%+1.*e", 4, 1.2345678); - TestSPrintFormat2("%+2.*e", 6, 1.2345678); - - log_verbose("Get really crazy with the formatting.\n"); - - TestSPrintFormat("%-#12x", 123, "%-#12x", 123); - TestSPrintFormat("%-#12x", -123, "%-#12x", -123); - TestSPrintFormat("%#12x", 123, "%#12x", 123); - TestSPrintFormat("%#12x", -123, "%#12x", -123); - - TestSPrintFormat("%-+12d", 123, "%-+12d", 123); - TestSPrintFormat("%-+12d", -123, "%-+12d", -123); - TestSPrintFormat("%- 12d", 123, "%- 12d", 123); - TestSPrintFormat("%- 12d", -123, "%- 12d", -123); - TestSPrintFormat("%+12d", 123, "%+12d", 123); - TestSPrintFormat("%+12d", -123, "%+12d", -123); - TestSPrintFormat("% 12d", 123, "% 12d", 123); - TestSPrintFormat("% 12d", -123, "% 12d", -123); - TestSPrintFormat("%12d", 123, "%12d", 123); - TestSPrintFormat("%12d", -123, "%12d", -123); - - TestSPrintFormat("%-+12.1e", 1.234, "%-+12.1e", 1.234); - TestSPrintFormat("%-+12.1e", -1.234, "%-+12.1e", -1.234); - TestSPrintFormat("%- 12.1e", 1.234, "%- 12.1e", 1.234); - TestSPrintFormat("%- 12.1e", -1.234, "%- 12.1e", -1.234); - TestSPrintFormat("%+12.1e", 1.234, "%+12.1e", 1.234); - TestSPrintFormat("%+12.1e", -1.234, "%+12.1e", -1.234); - TestSPrintFormat("% 12.1e", 1.234, "% 12.1e", 1.234); - TestSPrintFormat("% 12.1e", -1.234, "% 12.1e", -1.234); - TestSPrintFormat("%12.1e", 1.234, "%12.1e", 1.234); - TestSPrintFormat("%12.1e", -1.234, "%12.1e", -1.234); - TestSPrintFormat("%.2e", 1.234, "%.2e", 1.234); - TestSPrintFormat("%.2e", -1.234, "%.2e", -1.234); - TestSPrintFormat("%3e", 1.234, "%3e", 1.234); - TestSPrintFormat("%3e", -1.234, "%3e", -1.234); - - TestSPrintFormat("%-+12.1f", 1.234, "%-+12.1f", 1.234); - TestSPrintFormat("%-+12.1f", -1.234, "%-+12.1f", -1.234); - TestSPrintFormat("%- 12.1f", 1.234, "%- 12.1f", 1.234); - TestSPrintFormat("%- 12.1f", -1.234, "%- 12.1f", -1.234); - TestSPrintFormat("%+12.1f", 1.234, "%+12.1f", 1.234); - TestSPrintFormat("%+12.1f", -1.234, "%+12.1f", -1.234); - TestSPrintFormat("% 12.1f", 1.234, "% 12.1f", 1.234); - TestSPrintFormat("% 12.1f", -1.234, "% 12.1f", -1.234); - TestSPrintFormat("%12.1f", 1.234, "%12.1f", 1.234); - TestSPrintFormat("%12.1f", -1.234, "%12.1f", -1.234); - TestSPrintFormat("%.2f", 1.234, "%.2f", 1.234); - TestSPrintFormat("%.2f", -1.234, "%.2f", -1.234); - TestSPrintFormat("%3f", 1.234, "%3f", 1.234); - TestSPrintFormat("%3f", -1.234, "%3f", -1.234); - +#endif } +U_CDECL_END -#undef TestSPrintFormat - -static void TestStringCompatibility() { - UChar myUString[256]; - UChar uStringBuf[256]; - char myString[256] = ""; - char testBuf[256] = ""; - int32_t num; - - u_memset(myUString, 0x0a, sizeof(myUString)/ sizeof(*myUString)); - u_memset(uStringBuf, 0x0a, sizeof(uStringBuf) / sizeof(*uStringBuf)); - - /* Compare against C API compatibility */ - for (num = -STANDARD_TEST_NUM_RANGE; num < STANDARD_TEST_NUM_RANGE; num++) { - sprintf(testBuf, "%x", num); - u_sprintf(uStringBuf, NULL, "%x", num); - u_austrncpy(myString, uStringBuf, sizeof(myString)/sizeof(myString[0])); - if (strcmp(myString, testBuf) != 0) { - log_err("%%x Got: \"%s\", Expected: \"%s\"\n", myString, testBuf); - } - - sprintf(testBuf, "%X", num); - u_sprintf(uStringBuf, NULL, "%X", num); - u_austrncpy(myString, uStringBuf, sizeof(myString)/sizeof(myString[0])); - if (strcmp(myString, testBuf) != 0) { - log_err("%%X Got: \"%s\", Expected: \"%s\"\n", myString, testBuf); - } - - sprintf(testBuf, "%o", num); - u_sprintf(uStringBuf, NULL, "%o", num); - u_austrncpy(myString, uStringBuf, sizeof(myString)/sizeof(myString[0])); - if (strcmp(myString, testBuf) != 0) { - log_err("%%o Got: \"%s\", Expected: \"%s\"\n", myString, testBuf); - } - - /* sprintf is not compatible on all platforms e.g. the iSeries*/ - sprintf(testBuf, "%d", num); - u_sprintf(uStringBuf, "en_US_POSIX", "%d", num); - u_austrncpy(myString, uStringBuf, sizeof(myString)/sizeof(myString[0])); - if (strcmp(myString, testBuf) != 0) { - log_err("%%d Got: \"%s\", Expected: \"%s\"\n", myString, testBuf); - } - - sprintf(testBuf, "%i", num); - u_sprintf(uStringBuf, "en_US_POSIX", "%i", num); - u_austrncpy(myString, uStringBuf, sizeof(myString)/sizeof(myString[0])); - if (strcmp(myString, testBuf) != 0) { - log_err("%%i Got: \"%s\", Expected: \"%s\"\n", myString, testBuf); - } - - sprintf(testBuf, "%f", (double)num); - u_sprintf(uStringBuf, "en_US_POSIX", "%f", (double)num); - u_austrncpy(myString, uStringBuf, sizeof(myString)/sizeof(myString[0])); - if (strcmp(myString, testBuf) != 0) { - log_err("%%f Got: \"%s\", Expected: \"%s\"\n", myString, testBuf); - } - - sprintf(testBuf, "%e", (double)num); - u_sprintf(uStringBuf, "en_US_POSIX", "%e", (double)num); - u_austrncpy(myString, uStringBuf, sizeof(myString)/sizeof(myString[0])); - if (strcmp(myString, testBuf) != 0) { - log_err("%%e Got: \"%s\", Expected: \"%s\"\n", myString, testBuf); - } - - sprintf(testBuf, "%E", (double)num); - u_sprintf(uStringBuf, "en_US_POSIX", "%E", (double)num); - u_austrncpy(myString, uStringBuf, sizeof(myString)/sizeof(myString[0])); - if (strcmp(myString, testBuf) != 0) { - log_err("%%E Got: \"%s\", Expected: \"%s\"\n", myString, testBuf); - } - - sprintf(testBuf, "%g", (double)num); - u_sprintf(uStringBuf, "en_US_POSIX", "%g", (double)num); - u_austrncpy(myString, uStringBuf, sizeof(myString)/sizeof(myString[0])); - if (strcmp(myString, testBuf) != 0) { - log_err("%%g Got: \"%s\", Expected: \"%s\"\n", myString, testBuf); - } - - sprintf(testBuf, "%G", (double)num); - u_sprintf(uStringBuf, "en_US_POSIX", "%G", (double)num); - u_austrncpy(myString, uStringBuf, sizeof(myString)/sizeof(myString[0])); - if (strcmp(myString, testBuf) != 0) { - log_err("%%G Got: \"%s\", Expected: \"%s\"\n", myString, testBuf); +U_CDECL_BEGIN +static void U_CALLCONV DataDrivenPrintfPrecision(void) +{ +#if !UCONFIG_NO_FORMATTING + UErrorCode errorCode; + TestDataModule *dataModule; + TestData *testData; + const DataMap *testCase; + DataDrivenLogger logger; + UChar uBuffer[512]; + char cBuffer[512]; + char cFormat[sizeof(cBuffer)]; + char cExpected[sizeof(cBuffer)]; + UnicodeString tempStr; + UChar format[512]; + UChar expectedResult[512]; + UChar argument[512]; + int32_t precision; + int32_t i; + int8_t i8; + int16_t i16; + int32_t i32; + int64_t i64; + double dbl; + int32_t uBufferLenReturned; + + errorCode=U_ZERO_ERROR; + dataModule=TestDataModule::getTestDataModule("icuio", logger, errorCode); + if(U_SUCCESS(errorCode)) { + testData=dataModule->createTestData("printfPrecision", errorCode); + if(U_SUCCESS(errorCode)) { + for(i=0; testData->nextCase(testCase, errorCode); ++i) { + if(U_FAILURE(errorCode)) { + log_err("error retrieving icuio/printf test case %d - %s\n", + i, u_errorName(errorCode)); + errorCode=U_ZERO_ERROR; + continue; + } + u_memset(uBuffer, 0x2A, sizeof(uBuffer)/sizeof(uBuffer[0])); + uBuffer[sizeof(uBuffer)/sizeof(uBuffer[0])-1] = 0; + tempStr=testCase->getString("format", errorCode); + tempStr.extract(format, sizeof(format)/sizeof(format[0]), errorCode); + tempStr=testCase->getString("result", errorCode); + tempStr.extract(expectedResult, sizeof(expectedResult)/sizeof(expectedResult[0]), errorCode); + tempStr=testCase->getString("argument", errorCode); + tempStr.extract(argument, sizeof(argument)/sizeof(argument[0]), errorCode); + precision=testCase->getInt28("precision", errorCode); + u_austrncpy(cBuffer, format, sizeof(cBuffer)); + if(U_FAILURE(errorCode)) { + log_err("error retrieving icuio/printf test case %d - %s\n", + i, u_errorName(errorCode)); + errorCode=U_ZERO_ERROR; + continue; + } + log_verbose("Test %d: format=\"%s\"\n", i, cBuffer); + switch (testCase->getString("argumentType", errorCode)[0]) { + case 0x64: // 'd' double + dbl = atof(u_austrcpy(cBuffer, argument)); + uBufferLenReturned = u_sprintf_u(uBuffer, format, precision, dbl); + break; + case 0x31: // '1' int8_t + i8 = (int8_t)uto64(argument); + uBufferLenReturned = u_sprintf_u(uBuffer, format, precision, i8); + break; + case 0x32: // '2' int16_t + i16 = (int16_t)uto64(argument); + uBufferLenReturned = u_sprintf_u(uBuffer, format, precision, i16); + break; + case 0x34: // '4' int32_t + i32 = (int32_t)uto64(argument); + uBufferLenReturned = u_sprintf_u(uBuffer, format, precision, i32); + break; + case 0x38: // '8' int64_t + i64 = uto64(argument); + uBufferLenReturned = u_sprintf_u(uBuffer, format, precision, i64); + break; + case 0x73: // 's' char * + u_austrncpy(cBuffer, uBuffer, sizeof(cBuffer)); + uBufferLenReturned = u_sprintf_u(uBuffer, format, precision, cBuffer); + break; + case 0x53: // 'S' UChar * + uBufferLenReturned = u_sprintf_u(uBuffer, format, precision, argument); + break; + default: + uBufferLenReturned = 0; + log_err("Unknown type %c for test %d\n", testCase->getString("argumentType", errorCode)[0], i); + } + if (u_strcmp(uBuffer, expectedResult) != 0) { + u_austrncpy(cBuffer, uBuffer, sizeof(cBuffer)); + u_austrncpy(cFormat, format, sizeof(cFormat)); + u_austrncpy(cExpected, expectedResult, sizeof(cExpected)); + cBuffer[sizeof(cBuffer)-1] = 0; + log_err("FAILURE test case %d \"%s\" - Got: \"%s\" Expected: \"%s\"\n", + i, cFormat, cBuffer, cExpected); + } + if (uBuffer[uBufferLenReturned-1] == 0 + || uBuffer[uBufferLenReturned] != 0 + || uBuffer[uBufferLenReturned+1] != 0x2A + || uBuffer[uBufferLenReturned+2] != 0x2A) + { + u_austrncpy(cBuffer, uBuffer, sizeof(cBuffer)); + cBuffer[sizeof(cBuffer)-1] = 0; + log_err("FAILURE test case %d - \"%s\" wrong amount of characters was written. Got %d.\n", + i, cBuffer, uBufferLenReturned); + } + if(U_FAILURE(errorCode)) { + log_err("error running icuio/printf test case %d - %s\n", + i, u_errorName(errorCode)); + errorCode=U_ZERO_ERROR; + continue; + } + } + delete testData; } + delete dataModule; } - - for (num = 0; num < 0x80; num++) { - testBuf[0] = (char)0xFF; - uStringBuf[0] = (UChar)0xfffe; - sprintf(testBuf, "%c", num); - u_sprintf(uStringBuf, NULL, "%c", num); - u_austrncpy(myString, uStringBuf, sizeof(myString)/sizeof(myString[0])); - if (testBuf[0] != uStringBuf[0] || uStringBuf[0] != num) { - log_err("%%c Got: 0x%x, Expected: 0x%x\n", myString[0], testBuf[0]); - } + else { + log_err("Failed: could not load test icuio data\n"); } +#endif } +U_CDECL_END -#define TestSScanSetFormat(format, uValue, cValue) \ - /* Reinitialize the buffer to verify null termination works. */\ - u_memset(uBuffer, 0x2a, sizeof(uBuffer)/sizeof(*uBuffer));\ - memset(buffer, 0x2a, sizeof(buffer)/sizeof(*buffer));\ - \ - uNumScanned = u_sscanf(uValue, NULL, format, uBuffer);\ - u_austrncpy(compBuffer, uBuffer, sizeof(uBuffer)/sizeof(uBuffer[0]));\ - cNumScanned = sscanf(cValue, format, buffer);\ - if (strncmp(buffer, compBuffer, sizeof(uBuffer)/sizeof(uBuffer[0])) != 0) {\ - log_err("%" format " Got: \"%s\", Expected: \"%s\"\n", compBuffer, buffer);\ - }\ - if (cNumScanned != uNumScanned) {\ - log_err("%" format " number scanned Got: %d, Expected: %d\n", uNumScanned, cNumScanned);\ - }\ - if (uNumScanned > 0 && uBuffer[u_strlen(uBuffer)+1] != 0x2a) {\ - log_err("%" format " too much stored\n");\ - }\ - -static void TestSScanf() { - static const UChar abcUChars[] = {0x61,0x62,0x63,0x63,0x64,0x65,0x66,0x67,0}; - static const char abcChars[] = "abccdefg"; - UChar uBuffer[256]; - char buffer[256]; - char compBuffer[256]; - int32_t uNumScanned; - int32_t cNumScanned; - - TestSScanSetFormat("%[bc]U", abcUChars, abcChars); - TestSScanSetFormat("%[cb]U", abcUChars, abcChars); - - TestSScanSetFormat("%[ab]U", abcUChars, abcChars); - TestSScanSetFormat("%[ba]U", abcUChars, abcChars); - - TestSScanSetFormat("%[ab]", abcUChars, abcChars); - TestSScanSetFormat("%[ba]", abcUChars, abcChars); - - TestSScanSetFormat("%[abcdefgh]", abcUChars, abcChars); - TestSScanSetFormat("%[;hgfedcba]", abcUChars, abcChars); - - TestSScanSetFormat("%[a-f]", abcUChars, abcChars); - TestSScanSetFormat("%[f-a]", abcUChars, abcChars); - TestSScanSetFormat("%[a-c]", abcUChars, abcChars); - TestSScanSetFormat("%[c-a]", abcUChars, abcChars); - - TestSScanSetFormat("%[^e-f]", abcUChars, abcChars); - - TestSScanSetFormat("%[^a]", abcUChars, abcChars); - TestSScanSetFormat("%[^e]", abcUChars, abcChars); - TestSScanSetFormat("%[^ed]", abcUChars, abcChars); - TestSScanSetFormat("%[^dc]", abcUChars, abcChars); - TestSScanSetFormat("%[^e] ", abcUChars, abcChars); - - TestSScanSetFormat("%[] ", abcUChars, abcChars); - TestSScanSetFormat("%1[ab] ", abcUChars, abcChars); - TestSScanSetFormat("%2[^f]", abcUChars, abcChars); - - /* Bad format */ - TestSScanSetFormat("%[a", abcUChars, abcChars); - /* The following is not deterministic on Windows */ -/* TestSScanSetFormat("%[a-", abcUChars, abcChars);*/ - TestSScanSetFormat("%[a-]", abcUChars, abcChars); - - /* TODO: Need to specify precision with a "*" */ -} - -#undef TestSScanSetFormat - - -#define TestFScanSetFormat(format, uValue, cValue) \ - myFile = u_fopen(STANDARD_TEST_FILE, "w", NULL, NULL);\ - /* Reinitialize the buffer to verify null termination works. */\ - u_memset(uBuffer, 0x2a, sizeof(uBuffer)/sizeof(*uBuffer));\ - memset(buffer, 0x2a, sizeof(buffer)/sizeof(*buffer));\ - \ - u_fprintf(myFile, "%U", uValue);\ - u_fclose(myFile);\ - myFile = u_fopen(STANDARD_TEST_FILE, "r", "en_US_POSIX", NULL);\ - uNumScanned = u_fscanf(myFile, format, uBuffer);\ - u_fclose(myFile);\ - u_austrncpy(compBuffer, uBuffer, sizeof(uBuffer)/sizeof(*uBuffer));\ - cNumScanned = sscanf(cValue, format, buffer);\ - if (strncmp(buffer, compBuffer, sizeof(uBuffer)/sizeof(*uBuffer)) != 0) {\ - log_err("%" format " Got: \"%s\", Expected: \"%s\"\n", compBuffer, buffer);\ - }\ - if (cNumScanned != uNumScanned) {\ - log_err("%" format " number printed Got: %d, Expected: %d\n", uNumScanned, cNumScanned);\ - }\ - if (uNumScanned > 0 && uBuffer[u_strlen(uBuffer)+1] != 0x2a) {\ - log_err("%" format " too much stored\n");\ - }\ - - -static void TestFScanf() { - UFILE *myFile; - static const UChar abcUChars[] = {0x61,0x62,0x63,0x63,0x64,0x65,0x66,0x67,0}; - static const char abcChars[] = "abccdefg"; - UChar uBuffer[256]; - char buffer[256]; - char compBuffer[256]; - int32_t uNumScanned; - int32_t cNumScanned; - - TestFScanSetFormat("%[bc]U", abcUChars, abcChars); - TestFScanSetFormat("%[cb]U", abcUChars, abcChars); - - TestFScanSetFormat("%[ab]U", abcUChars, abcChars); - TestFScanSetFormat("%[ba]U", abcUChars, abcChars); - - TestFScanSetFormat("%[ab]", abcUChars, abcChars); - TestFScanSetFormat("%[ba]", abcUChars, abcChars); - - TestFScanSetFormat("%[abcdefgh]", abcUChars, abcChars); - TestFScanSetFormat("%[;hgfedcba]", abcUChars, abcChars); - - TestFScanSetFormat("%[a-f]", abcUChars, abcChars); - TestFScanSetFormat("%[f-a]", abcUChars, abcChars); - TestFScanSetFormat("%[a-c]", abcUChars, abcChars); - TestFScanSetFormat("%[c-a]", abcUChars, abcChars); - - TestFScanSetFormat("%[^e-f]", abcUChars, abcChars); - - TestFScanSetFormat("%[^a]", abcUChars, abcChars); - TestFScanSetFormat("%[^e]", abcUChars, abcChars); - TestFScanSetFormat("%[^ed]", abcUChars, abcChars); - TestFScanSetFormat("%[^dc]", abcUChars, abcChars); - TestFScanSetFormat("%[^e] ", abcUChars, abcChars); - - TestFScanSetFormat("%[] ", abcUChars, abcChars); - TestFScanSetFormat("%1[ab] ", abcUChars, abcChars); - TestFScanSetFormat("%2[^f]", abcUChars, abcChars); - - /* Bad format */ - TestFScanSetFormat("%[a", abcUChars, abcChars); - /* The following is not deterministic on Windows */ -/* TestFScanSetFormat("%[a-", abcUChars, abcChars);*/ - TestFScanSetFormat("%[a-]", abcUChars, abcChars); - - /* TODO: Need to specify precision with a "*" */ -} - -static void TestStream() { +U_CDECL_BEGIN +static void U_CALLCONV TestStream(void) +{ #if U_IOSTREAM_SOURCE >= 198506 - char testStreamBuf[512]; - const char *testStr = "Beginning of test str1 <<432 1" C_NEW_LINE " UTF-8 \xCE\xBC\xF0\x90\x80\x81\xF0\x90\x80\x82"; - ostrstream outTestStream(testStreamBuf, sizeof(testStreamBuf)); - istrstream inTestStream(" tHis\xCE\xBC\xE2\x80\x82 mu world", 0); const UChar thisMu[] = { 0x74, 0x48, 0x69, 0x73, 0x3BC, 0}; const UChar mu[] = { 0x6D, 0x75, 0}; UnicodeString str1 = UNICODE_STRING_SIMPLE("str1"); UnicodeString str2 = UNICODE_STRING_SIMPLE(" <<"); - UnicodeString str3 = UNICODE_STRING_SIMPLE("4"); + UnicodeString str3 = UNICODE_STRING_SIMPLE("2"); UnicodeString str4 = UNICODE_STRING_SIMPLE(" UTF-8 "); UnicodeString inStr = UNICODE_STRING_SIMPLE(" UTF-8 "); UnicodeString inStr2; @@ -1489,6 +697,7 @@ static void TestStream() { char inStrC[128]; UErrorCode status = U_ZERO_ERROR; UConverter *defConv; + static const char testStr[] = "\x42\x65\x67\x69\x6E\x6E\x69\x6E\x67\x20\x6F\x66\x20\x74\x65\x73\x74\x20\x73\x74\x72\x31\x20\x20\x20\x3C\x3C\x32\x31\x20" UTF8_NEW_LINE "\x20\x55\x54\x46\x2D\x38\x20\xCE\xBC\xF0\x90\x80\x81\xF0\x90\x80\x82"; str4.append((UChar32)0x03BC); /* mu */ str4.append((UChar32)0x10001); @@ -1497,15 +706,32 @@ static void TestStream() { /* release the default converter and use utf-8 for a bit */ defConv = u_getDefaultConverter(&status); if (U_FAILURE(status)) { - log_err("Can't get default converter"); + log_err("Can't get default converter\n"); return; } ucnv_close(defConv); strncpy(defConvName, ucnv_getDefaultName(), sizeof(defConvName)/sizeof(defConvName[0])); ucnv_setDefaultName("UTF-8"); - outTestStream << "Beginning of test "; - outTestStream << str1 << " " << str2 << str3 << 3 << "2 " << 1.0 << C_NEW_LINE << str4 << ends; +#ifdef USE_SSTREAM + ostringstream outTestStream; + istringstream inTestStream("\x20\x74\x48\x69\x73\xCE\xBC\xE2\x80\x82\x20\x6D\x75\x20\x77\x6F\x72\x6C\x64"); +#else + char testStreamBuf[512]; + ostrstream outTestStream(testStreamBuf, sizeof(testStreamBuf)); + istrstream inTestStream("\x20\x74\x48\x69\x73\xCE\xBC\xE2\x80\x82\x20\x6D\x75\x20\x77\x6F\x72\x6C\x64", 0); + + /* initialize testStreamBuf */ + memset(testStreamBuf, '*', sizeof(testStreamBuf)); + testStreamBuf[sizeof(testStreamBuf)-1] = 0; +#endif + + outTestStream << "\x42\x65\x67\x69\x6E\x6E\x69\x6E\x67\x20\x6F\x66\x20\x74\x65\x73\x74\x20"; + outTestStream << str1 << "\x20\x20" << str2 << str3 << "\x31\x20" << UTF8_NEW_LINE << str4 << ends; +#ifdef USE_SSTREAM + string tempStr = outTestStream.str(); + const char *testStreamBuf = tempStr.c_str(); +#endif if (strcmp(testStreamBuf, testStr) != 0) { log_err("Got: \"%s\", Expected: \"%s\"\n", testStreamBuf, testStr); } @@ -1531,189 +757,164 @@ static void TestStream() { } ucnv_close(defConv); #else - log_err("U_IOSTREAM_SOURCE is disabled"); + log_info("U_IOSTREAM_SOURCE is disabled\n"); #endif } +U_CDECL_END -static void TestTranslitOps() -{ - UFILE *f; - UErrorCode err = U_ZERO_ERROR; - UTransliterator *a = NULL, *b = NULL, *c = NULL; - - log_verbose("opening a transliterator and UFILE for testing\n"); - - f = u_fopen(STANDARD_TEST_FILE, "w", "en_US_POSIX", NULL); - if(f == NULL) - { - log_err("Couldn't open test file for writing"); - return; - } - - a = utrans_open("Latin-Greek", UTRANS_FORWARD, NULL, -1, NULL, &err); - if(U_FAILURE(err)) - { - log_err("Err opening transliterator %s\n", u_errorName(err)); - u_fclose(f); - return; - } - - - log_verbose("setting a transliterator\n"); - b = u_fsettransliterator(f, U_WRITE, a, &err); - if(U_FAILURE(err)) - { - log_err("Err setting transliterator %s\n", u_errorName(err)); - u_fclose(f); - return; - } - - if(b != NULL) - { - log_err("Err, a transliterator was already set!\n"); - } - - log_verbose("un-setting transliterator (setting to null)\n"); - c = u_fsettransliterator(f, U_WRITE, NULL, &err); - if(U_FAILURE(err)) - { - log_err("Err setting transliterator %s\n", u_errorName(err)); - u_fclose(f); - return; - } - - if(c != a) - { - log_err("Err, transliterator that came back was not the original one.\n"); - } - - log_verbose("Trying to set read transliterator (should fail)\n"); - b = u_fsettransliterator(f, U_READ, NULL, &err); - if(err != U_UNSUPPORTED_ERROR) - { - log_err("Should have U_UNSUPPORTED_ERROR setting Read transliterator but got %s - REVISIT AND UPDATE TEST\n", u_errorName(err)); - u_fclose(f); - return; - } - else - { - log_verbose("Got %s error (expected) setting READ transliterator.\n", u_errorName(err)); - err = U_ZERO_ERROR; - } - +static void addAllTests(TestNode** root) { + addFileTest(root); + addStringTest(root); - utrans_close(c); - u_fclose(f); +#if !UCONFIG_NO_FORMATTING + addTest(root, &DataDrivenPrintf, "datadriv/DataDrivenPrintf"); + addTest(root, &DataDrivenPrintfPrecision, "datadriv/DataDrivenPrintfPrecision"); + addTest(root, &DataDrivenScanf, "datadriv/DataDrivenScanf"); +#endif + addTest(root, &TestStream, "stream/TestStream"); } -static void TestTranslitOut() +/* returns the path to icu/source/data/out */ +static const char *ctest_dataOutDir() { - UFILE *f; - UErrorCode err = U_ZERO_ERROR; - UTransliterator *a = NULL, *b = NULL, *c = NULL; - FILE *infile; - UChar compare[] = { 0xfeff, 0x03a3, 0x03c4, 0x03b5, 0x03c6, 0x1f00, 0x03bd, 0x03bf, 0x03c2, 0x0000 }; - UChar ubuf[256]; - int len; - - log_verbose("opening a transliterator and UFILE for testing\n"); - - f = u_fopen(STANDARD_TEST_FILE, "w", "en_US_POSIX", "utf-16"); - if(f == NULL) - { - log_err("Couldn't open test file for writing"); - return; - } - - a = utrans_open("Latin-Greek", UTRANS_FORWARD, NULL, -1, NULL, &err); - if(U_FAILURE(err)) - { - log_err("Err opening transliterator %s\n", u_errorName(err)); - u_fclose(f); - return; - } - - log_verbose("setting a transliterator\n"); - b = u_fsettransliterator(f, U_WRITE, a, &err); - if(U_FAILURE(err)) - { - log_err("Err setting transliterator %s\n", u_errorName(err)); - u_fclose(f); - return; - } + static const char *dataOutDir = NULL; - if(b != NULL) - { - log_err("Err, a transliterator was already set!\n"); - } - - u_fprintf(f, "Stephanos"); - - u_fclose(f); - - log_verbose("Re reading test file to verify transliteration\n"); - infile = fopen(STANDARD_TEST_FILE, "rb"); - if(infile == NULL) - { - log_err("Couldn't reopen test file\n"); - return; + if(dataOutDir) { + return dataOutDir; } - len=fread(ubuf, sizeof(UChar), u_strlen(compare), infile); - log_verbose("Read %d UChars\n", len); - if(len != u_strlen(compare)) + /* U_TOPBUILDDIR is set by the makefiles on UNIXes when building cintltst and intltst + // to point to the top of the build hierarchy, which may or + // may not be the same as the source directory, depending on + // the configure options used. At any rate, + // set the data path to the built data from this directory. + // The value is complete with quotes, so it can be used + // as-is as a string constant. + */ +#if defined (U_TOPBUILDDIR) { - log_err("Wanted %d UChars from file, got %d\n", u_strlen(compare), len); + dataOutDir = U_TOPBUILDDIR "data"U_FILE_SEP_STRING"out"U_FILE_SEP_STRING; } - ubuf[len]=0; +#else - if(u_strlen(compare) != u_strlen(ubuf)) + /* On Windows, the file name obtained from __FILE__ includes a full path. + * This file is "wherever\icu\source\test\cintltst\cintltst.c" + * Change to "wherever\icu\source\data" + */ { - log_err("Wanted %d UChars from file, but u_strlen() returns %d\n", u_strlen(compare), len); - } + static char p[sizeof(__FILE__) + 20]; + char *pBackSlash; + int i; + + strcpy(p, __FILE__); + /* We want to back over three '\' chars. */ + /* Only Windows should end up here, so looking for '\' is safe. */ + for (i=1; i<=3; i++) { + pBackSlash = strrchr(p, U_FILE_SEP_CHAR); + if (pBackSlash != NULL) { + *pBackSlash = 0; /* Truncate the string at the '\' */ + } + } - if(u_strcmp(compare, ubuf)) - { - log_err("Read string doesn't match expected.\n"); - } - else - { - log_verbose("Read string matches expected.\n"); + if (pBackSlash != NULL) { + /* We found and truncated three names from the path. + * Now append "source\data" and set the environment + */ + strcpy(pBackSlash, U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING); + dataOutDir = p; + } + else { + /* __FILE__ on MSVC7 does not contain the directory */ + FILE *file = fopen(".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "Makefile.in", "r"); + if (file) { + fclose(file); + dataOutDir = ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING; + } + else { + dataOutDir = ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING; + } + } } +#endif - fclose(infile); - + return dataOutDir; } -static void addAllTests(TestNode** root) { - addTest(root, &TestFile, "file/TestFile"); - addTest(root, &TestCodepageAndLocale, "file/TestCodepageAndLocale"); - addTest(root, &TestfgetsBuffers, "file/TestfgetsBuffers"); - addTest(root, &TestfgetsLineCount, "file/TestfgetsLineCount"); - addTest(root, &TestFprintfFormat, "file/TestFprintfFormat"); - addTest(root, &TestFScanf, "file/TestFScanf"); - addTest(root, &TestFilePrintCompatibility, "file/TestFilePrintCompatibility"); - - addTest(root, &TestString, "string/TestString"); - addTest(root, &TestSprintfFormat, "string/TestSprintfFormat"); - addTest(root, &TestSnprintf, "string/TestSnprintf"); - addTest(root, &TestSScanf, "string/TestSScanf"); - addTest(root, &TestStringCompatibility, "string/TestStringCompatibility"); - addTest(root, &TestStream, "stream/TestStream"); - - addTest(root, &TestTranslitOps, "translit/ops"); - addTest(root, &TestTranslitOut, "translit/out"); +/* ctest_setICU_DATA - if the ICU_DATA environment variable is not already + * set, try to deduce the directory in which ICU was built, + * and set ICU_DATA to "icu/source/data" in that location. + * The intent is to allow the tests to have a good chance + * of running without requiring that the user manually set + * ICU_DATA. Common data isn't a problem, since it is + * picked up via a static (build time) reference, but the + * tests dynamically load some data. + */ +static void ctest_setICU_DATA() { + + /* No location for the data dir was identifiable. + * Add other fallbacks for the test data location here if the need arises + */ + if (getenv("ICU_DATA") == NULL) { + /* If ICU_DATA isn't set, set it to the usual location */ + u_setDataDirectory(ctest_dataOutDir()); + } } int main(int argc, char* argv[]) { int32_t nerrors = 0; TestNode *root = NULL; + UErrorCode errorCode = U_ZERO_ERROR; + + /* Check whether ICU will initialize without forcing the build data directory into + * the ICU_DATA path. Success here means either the data dll contains data, or that + * this test program was run with ICU_DATA set externally. Failure of this check + * is normal when ICU data is not packaged into a shared library. + * + * Whether or not this test succeeds, we want to cleanup and reinitialize + * with a data path so that data loading from individual files can be tested. + */ + u_init(&errorCode); + if (U_FAILURE(errorCode)) { + fprintf(stderr, + "#### Note: ICU Init without build-specific setDataDirectory() failed.\n"); + } + u_cleanup(); + errorCode = U_ZERO_ERROR; + + /* Initialize ICU */ + ctest_setICU_DATA(); /* u_setDataDirectory() must happen Before u_init() */ + u_init(&errorCode); + if (U_FAILURE(errorCode)) { + fprintf(stderr, + "#### ERROR! %s: u_init() failed with status = \"%s\".\n" + "*** Check the ICU_DATA environment variable and \n" + "*** check that the data files are present.\n", argv[0], u_errorName(errorCode)); + return 1; + } + + fprintf(stdout, "Default charset for this run is %s\n", ucnv_getDefaultName()); addAllTests(&root); nerrors = processArgs(root, argc, argv); +#if 1 + { + FILE* fileToRemove = fopen(STANDARD_TEST_FILE, "r"); + /* This should delete any temporary files. */ + if (fileToRemove) { + fclose(fileToRemove); + if (remove(STANDARD_TEST_FILE) != 0) { + /* Maybe someone didn't close the file correctly. */ + fprintf(stderr, "FAIL: Could not delete %s\n", STANDARD_TEST_FILE); + nerrors += 1; + } + } + } +#endif + cleanUpTestTree(root); + DataDrivenLogger::cleanUp(); u_cleanup(); return nerrors; } diff --git a/icuSources/test/iotest/iotest.dsp b/icuSources/test/iotest/iotest.dsp index 2d3758f4..cefa2732 100644 --- a/icuSources/test/iotest/iotest.dsp +++ b/icuSources/test/iotest/iotest.dsp @@ -43,8 +43,9 @@ RSC=rc.exe # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /W3 /GX /O2 /I "..\..\..\include" /I "..\..\common" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c +MTL=midl.exe +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c +# ADD CPP /nologo /W3 /GX /O2 /I "..\..\..\include" /I "..\..\common" /I "..\..\tools\ctestfw" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -52,7 +53,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib icuio.lib icuin.lib icuuc.lib ctestfw.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\..\lib" +# ADD LINK32 /nologo /subsystem:console /machine:I386 /libpath:"..\..\..\lib" !ELSEIF "$(CFG)" == "iotest - Win32 Debug" @@ -67,8 +68,9 @@ LINK32=link.exe # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\..\..\include" /I "..\..\common" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c +MTL=midl.exe +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\..\..\include" /I "..\..\common" /I "..\..\tools\ctestfw" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe @@ -76,7 +78,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib icuiod.lib icuind.lib icuucd.lib ctestfwd.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\lib" +# ADD LINK32 /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\lib" !ELSEIF "$(CFG)" == "iotest - Win64 Release" @@ -91,16 +93,17 @@ LINK32=link.exe # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /W3 /I "..\..\..\include" /I "..\..\common" /D"WIN64" /D"NDEBUG" /D"_CONSOLE" /D"_MBCS" /FD /c /O2 /GX /Op /QIA64_fmaopt /D"_IA64_" /Zi /D"WIN64" /D"WIN32" /D"_AFX_NO_DAO_SUPPORT" /Wp64 /Zm600 +MTL=midl.exe +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c +# ADD CPP /nologo /W3 /GX /Zi /O2 /Op /I "..\..\..\include" /I "..\..\common" /I "..\..\tools\ctestfw" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:IA64 -# ADD LINK32 kernel32.lib icuio.lib icuin.lib icuuc.lib ctestfw.lib /nologo /subsystem:console /machine:IA64 /libpath:"..\..\..\lib" /incremental:no +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:IX86 /machine:IA64 +# ADD LINK32 /nologo /subsystem:console /machine:IX86 /libpath:"..\..\..\lib" /machine:IA64 !ELSEIF "$(CFG)" == "iotest - Win64 Debug" @@ -115,16 +118,17 @@ LINK32=link.exe # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /I "..\..\..\include" /I "..\..\common" /D"WIN64" /D"_DEBUG" /D"_CONSOLE" /D"_MBCS" /FD /GZ /c /Od /GX /Op /QIA64_fmaopt /D"_IA64_" /Zi /D"WIN64" /D"WIN32" /D"_AFX_NO_DAO_SUPPORT" /Wp64 /Zm600 +MTL=midl.exe +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /Op /I "..\..\..\include" /I "..\..\common" /I "..\..\tools\ctestfw" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /GZ /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:IA64 /pdbtype:sept -# ADD LINK32 kernel32.lib icuiod.lib icuind.lib icuucd.lib ctestfwd.lib /nologo /subsystem:console /debug /machine:IA64 /pdbtype:sept /libpath:"..\..\..\lib" /incremental:no +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:IX86 /pdbtype:sept /machine:IA64 +# ADD LINK32 /nologo /subsystem:console /incremental:no /debug /machine:IX86 /pdbtype:sept /libpath:"..\..\..\lib" /machine:IA64 !ENDIF @@ -139,8 +143,24 @@ LINK32=link.exe # PROP Default_Filter "cpp;c;cxx" # Begin Source File +SOURCE=.\filetst.c +# End Source File +# Begin Source File + SOURCE=.\iotest.cpp # End Source File +# Begin Source File + +SOURCE=.\strtst.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h" +# Begin Source File + +SOURCE=.\iotest.h +# End Source File # End Group # End Target # End Project diff --git a/icuSources/test/iotest/iotest.dsw b/icuSources/test/iotest/iotest.dsw deleted file mode 100644 index 0c099adf..00000000 --- a/icuSources/test/iotest/iotest.dsw +++ /dev/null @@ -1,44 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "iotest"=.\iotest.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name ustdio - End Project Dependency -}}} - -############################################################################### - -Project: "ustdio"=..\..\extra\ustdio\ustdio.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/icuSources/test/iotest/iotest.h b/icuSources/test/iotest/iotest.h new file mode 100644 index 00000000..9bda8e61 --- /dev/null +++ b/icuSources/test/iotest/iotest.h @@ -0,0 +1,36 @@ +/* +********************************************************************** +* Copyright (C) 2004-2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* file name: iotest.h +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2004apr06 +* created by: George Rhoten +*/ + +#ifndef IOTEST_H +#define IOTEST_H 1 + +#include "unicode/utypes.h" +#include "unicode/ctest.h" + +U_CFUNC void +addStringTest(TestNode** root); + +U_CFUNC void +addFileTest(TestNode** root); + +U_CDECL_BEGIN +extern const UChar NEW_LINE[]; +extern const char C_NEW_LINE[]; +extern const char STANDARD_TEST_FILE[]; +U_CDECL_END + +#define STANDARD_TEST_NUM_RANGE 1000 + + +#endif diff --git a/icuSources/samples/all/all.vcproj b/icuSources/test/iotest/iotest.vcproj similarity index 51% rename from icuSources/samples/all/all.vcproj rename to icuSources/test/iotest/iotest.vcproj index 26963675..0a761076 100644 --- a/icuSources/samples/all/all.vcproj +++ b/icuSources/test/iotest/iotest.vcproj @@ -1,8 +1,9 @@ -<?xml version="1.0" encoding = "Windows-1252"?> +<?xml version="1.0" encoding="Windows-1252"?> <VisualStudioProject ProjectType="Visual C++" - Version="7.00" - Name="all" + Version="7.10" + Name="iotest" + ProjectGUID="{E4993E82-D68A-46CA-BAE0-9D35E172E46F}" SccProjectName="" SccLocalPath=""> <Platforms> @@ -21,32 +22,37 @@ <Tool Name="VCCLCompilerTool" Optimization="0" - PreprocessorDefinitions="WIN32,_DEBUG,_CONSOLE" + ImproveFloatingPointConsistency="TRUE" + AdditionalIncludeDirectories="..\..\..\include,..\..\tools\ctestfw,..\..\common" + PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE" BasicRuntimeChecks="3" - RuntimeLibrary="5" - UsePrecompiledHeader="2" - PrecompiledHeaderFile=".\Debug/all.pch" + RuntimeLibrary="3" + BufferSecurityCheck="TRUE" + DisableLanguageExtensions="TRUE" + PrecompiledHeaderFile=".\Debug/iotest.pch" AssemblerListingLocation=".\Debug/" ObjectFile=".\Debug/" ProgramDataBaseFileName=".\Debug/" + BrowseInformation="1" WarningLevel="3" SuppressStartupBanner="TRUE" - DebugInformationFormat="4"/> + DebugInformationFormat="4" + CompileAs="0"/> <Tool Name="VCCustomBuildTool"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="odbc32.lib odbccp32.lib" - OutputFile=".\Debug/all.exe" - LinkIncremental="2" + OutputFile=".\Debug/iotest.exe" + LinkIncremental="0" SuppressStartupBanner="TRUE" GenerateDebugInformation="TRUE" - ProgramDatabaseFile=".\Debug/all.pdb" - SubSystem="1"/> + ProgramDatabaseFile=".\Debug/iotest.pdb" + SubSystem="1" + TargetMachine="1"/> <Tool Name="VCMIDLTool" - TypeLibraryName=".\Debug/all.tlb"/> + TypeLibraryName=".\Debug/iotest.tlb" + HeaderFileName=""/> <Tool Name="VCPostBuildEventTool"/> <Tool @@ -59,8 +65,14 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> <Configuration Name="Release|Win32" @@ -72,32 +84,35 @@ CharacterSet="2"> <Tool Name="VCCLCompilerTool" - InlineFunctionExpansion="1" - PreprocessorDefinitions="WIN32,NDEBUG,_CONSOLE" + Optimization="3" + InlineFunctionExpansion="2" + ImproveFloatingPointConsistency="TRUE" + AdditionalIncludeDirectories="..\..\..\include,..\..\tools\ctestfw,..\..\common" + PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE" StringPooling="TRUE" - RuntimeLibrary="4" - EnableFunctionLevelLinking="TRUE" - UsePrecompiledHeader="2" - PrecompiledHeaderFile=".\Release/all.pch" + RuntimeLibrary="2" + BufferSecurityCheck="TRUE" + DisableLanguageExtensions="TRUE" + PrecompiledHeaderFile=".\Release/iotest.pch" AssemblerListingLocation=".\Release/" ObjectFile=".\Release/" ProgramDataBaseFileName=".\Release/" WarningLevel="3" - SuppressStartupBanner="TRUE"/> + SuppressStartupBanner="TRUE" + CompileAs="0"/> <Tool Name="VCCustomBuildTool"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="odbc32.lib odbccp32.lib" - OutputFile=".\Release/all.exe" + OutputFile=".\Release/iotest.exe" LinkIncremental="1" SuppressStartupBanner="TRUE" - ProgramDatabaseFile=".\Release/all.pdb" - SubSystem="1"/> + ProgramDatabaseFile=".\Release/iotest.pdb" + SubSystem="1" + TargetMachine="1"/> <Tool Name="VCMIDLTool" - TypeLibraryName=".\Release/all.tlb"/> + TypeLibraryName=".\Release/iotest.tlb"/> <Tool Name="VCPostBuildEventTool"/> <Tool @@ -110,11 +125,39 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> </Configurations> + <References> + </References> <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cxx"> + <File + RelativePath="filetst.c"> + </File> + <File + RelativePath="iotest.cpp"> + </File> + <File + RelativePath="strtst.c"> + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx"> + <File + RelativePath="iotest.h"> + </File> + </Filter> </Files> <Globals> </Globals> diff --git a/icuSources/test/iotest/strtst.c b/icuSources/test/iotest/strtst.c new file mode 100644 index 00000000..02ef4cb9 --- /dev/null +++ b/icuSources/test/iotest/strtst.c @@ -0,0 +1,758 @@ +/* +********************************************************************** +* Copyright (C) 2004-2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* file name: strtst.c +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2004apr06 +* created by: George Rhoten +*/ + +#include "unicode/ustdio.h" +#include "unicode/ustring.h" +#include "iotest.h" + +#include <string.h> + +static void TestString(void) { +#if !UCONFIG_NO_FORMATTING + int32_t n[1]; + float myFloat = -1234.0; + int32_t newValuePtr[1]; + double newDoubleValuePtr[1]; + UChar myUString[512]; + UChar uStringBuf[512]; + char myString[512] = ""; + int32_t retVal; + void *origPtr, *ptr; + U_STRING_DECL(myStringOrig, "My-String", 9); + + U_STRING_INIT(myStringOrig, "My-String", 9); + u_memset(myUString, 0x0a, sizeof(myUString)/ sizeof(*myUString)); + u_memset(uStringBuf, 0x0a, sizeof(uStringBuf) / sizeof(*uStringBuf)); + + *n = -1234; + if (sizeof(void *) == 4) { + origPtr = (void *)0xdeadbeef; + } else if (sizeof(void *) == 8) { + origPtr = (void *) INT64_C(0x1000200030004000); + } else if (sizeof(void *) == 16) { + /* iSeries */ + int32_t massiveBigEndianPtr[] = { 0x10002000, 0x30004000, 0x50006000, 0x70008000 }; + origPtr = *((void **)massiveBigEndianPtr); + } else { + log_err("sizeof(void*)=%d hasn't been tested before", (int)sizeof(void*)); + } + + /* Test sprintf */ + u_sprintf(uStringBuf, "Signed decimal integer d: %d", *n); + *newValuePtr = 1; + u_sscanf(uStringBuf, "Signed decimal integer d: %d", newValuePtr); + if (*n != *newValuePtr) { + log_err("%%d Got: %d, Expected: %d\n", *newValuePtr, *n); + } + + u_sprintf(uStringBuf, "Signed decimal integer i: %i", *n); + *newValuePtr = 1; + u_sscanf(uStringBuf, "Signed decimal integer i: %i", newValuePtr); + if (*n != *newValuePtr) { + log_err("%%i Got: %i, Expected: %i\n", *newValuePtr, *n); + } + + u_sprintf(uStringBuf, "Unsigned octal integer o: %o", *n); + *newValuePtr = 1; + u_sscanf(uStringBuf, "Unsigned octal integer o: %o", newValuePtr); + if (*n != *newValuePtr) { + log_err("%%o Got: %o, Expected: %o\n", *newValuePtr, *n); + } + + u_sprintf(uStringBuf, "Unsigned decimal integer %%u: %u", *n); + *newValuePtr = 1; + u_sscanf(uStringBuf, "Unsigned decimal integer %%u: %u", newValuePtr); + if (*n != *newValuePtr) { + log_err("%%u Got: %u, Expected: %u\n", *newValuePtr, *n); + } + + u_sprintf(uStringBuf, "Lowercase unsigned hexadecimal integer x: %x", *n); + *newValuePtr = 1; + u_sscanf(uStringBuf, "Lowercase unsigned hexadecimal integer x: %x", newValuePtr); + if (*n != *newValuePtr) { + log_err("%%x Got: %x, Expected: %x\n", *newValuePtr, *n); + } + + u_sprintf(uStringBuf, "Uppercase unsigned hexadecimal integer X: %X", *n); + *newValuePtr = 1; + u_sscanf(uStringBuf, "Uppercase unsigned hexadecimal integer X: %X", newValuePtr); + if (*n != *newValuePtr) { + log_err("%%X Got: %X, Expected: %X\n", *newValuePtr, *n); + } + + u_sprintf(uStringBuf, "Float f: %f", myFloat); + *newDoubleValuePtr = -1.0; + u_sscanf(uStringBuf, "Float f: %f", newDoubleValuePtr); + if (myFloat != *newDoubleValuePtr) { + log_err("%%f Got: %f, Expected: %f\n", *newDoubleValuePtr, myFloat); + } + + u_sprintf(uStringBuf, "Lowercase float e: %e", myFloat); + *newDoubleValuePtr = -1.0; + u_sscanf(uStringBuf, "Lowercase float e: %e", newDoubleValuePtr); + if (myFloat != *newDoubleValuePtr) { + log_err("%%e Got: %e, Expected: %e\n", *newDoubleValuePtr, myFloat); + } + + u_sprintf(uStringBuf, "Uppercase float E: %E", myFloat); + *newDoubleValuePtr = -1.0; + u_sscanf(uStringBuf, "Uppercase float E: %E", newDoubleValuePtr); + if (myFloat != *newDoubleValuePtr) { + log_err("%%E Got: %E, Expected: %E\n", *newDoubleValuePtr, myFloat); + } + + u_sprintf(uStringBuf, "Lowercase float g: %g", myFloat); + *newDoubleValuePtr = -1.0; + u_sscanf(uStringBuf, "Lowercase float g: %g", newDoubleValuePtr); + if (myFloat != *newDoubleValuePtr) { + log_err("%%g Got: %g, Expected: %g\n", *newDoubleValuePtr, myFloat); + } + + u_sprintf(uStringBuf, "Uppercase float G: %G", myFloat); + *newDoubleValuePtr = -1.0; + u_sscanf(uStringBuf, "Uppercase float G: %G", newDoubleValuePtr); + if (myFloat != *newDoubleValuePtr) { + log_err("%%G Got: %G, Expected: %G\n", *newDoubleValuePtr, myFloat); + } + + ptr = NULL; + u_sprintf(uStringBuf, "Pointer %%p: %p\n", origPtr); + u_sscanf(uStringBuf, "Pointer %%p: %p\n", &ptr); + if (ptr != origPtr || u_strlen(uStringBuf) != 13+(sizeof(void*)*2)) { + log_err("%%p Got: %p, Expected: %p\n", ptr, origPtr); + } + + u_sprintf(uStringBuf, "Char c: %c", 'A'); + u_sscanf(uStringBuf, "Char c: %c", myString); + if (*myString != 'A') { + log_err("%%c Got: %c, Expected: A\n", *myString); + } + + u_sprintf(uStringBuf, "UChar %%C: %C", (UChar)0x0041); /*'A'*/ + u_sscanf(uStringBuf, "UChar %%C: %C", myUString); + if (*myUString != (UChar)0x0041) { /*'A'*/ + log_err("%%C Got: %C, Expected: A\n", *myUString); + } + + u_sprintf(uStringBuf, "String %%s: %s", "My-String"); + u_sscanf(uStringBuf, "String %%s: %s", myString); + if (strcmp(myString, "My-String")) { + log_err("%%s Got: %s, Expected: My-String\n", myString); + } + if (uStringBuf[20] != 0) { + log_err("String not terminated. Got %c\n", uStringBuf[20] ); + } + u_sprintf(uStringBuf, "NULL String %%s: %s", NULL); + u_sscanf(uStringBuf, "NULL String %%s: %s", myString); + if (strcmp(myString, "(null)")) { + log_err("%%s Got: %s, Expected: My-String\n", myString); + } + + u_sprintf(uStringBuf, "Unicode String %%S: %S", myStringOrig); + u_sscanf(uStringBuf, "Unicode String %%S: %S", myUString); + u_austrncpy(myString, myUString, sizeof(myString)/sizeof(*myString)); + if (strcmp(myString, "My-String")) { + log_err("%%S Got: %s, Expected: My String\n", myString); + } + + u_sprintf(uStringBuf, "NULL Unicode String %%S: %S", NULL); + u_sscanf(uStringBuf, "NULL Unicode String %%S: %S", myUString); + u_austrncpy(myString, myUString, sizeof(myString)/sizeof(*myString)); + if (strcmp(myString, "(null)")) { + log_err("%%S Got: %s, Expected: (null)\n", myString); + } + + u_sprintf(uStringBuf, "Percent %%P (non-ANSI): %P", myFloat); + *newDoubleValuePtr = -1.0; + u_sscanf(uStringBuf, "Percent %%P (non-ANSI): %P", newDoubleValuePtr); + if (myFloat != *newDoubleValuePtr) { + log_err("%%P Got: %P, Expected: %P\n", *newDoubleValuePtr, myFloat); + } + + u_sprintf(uStringBuf, "Spell Out %%V (non-ANSI): %V", myFloat); + *newDoubleValuePtr = -1.0; + u_sscanf(uStringBuf, "Spell Out %%V (non-ANSI): %V", newDoubleValuePtr); + if (myFloat != *newDoubleValuePtr) { + log_err("%%V Got: %f, Expected: %f\n", *newDoubleValuePtr, myFloat); + } + + *newValuePtr = 1; + u_sprintf(uStringBuf, "\t\nPointer to integer (Count) %%n: n=%d %n n=%d\n", *newValuePtr, newValuePtr, *newValuePtr); + if (*newValuePtr != 37) { + log_err("%%V Got: %f, Expected: %f\n", *newDoubleValuePtr, myFloat); + } + +/* u_sscanf(uStringBuf, "Pointer %%p: %p\n", myFile);*/ + + { + static const char longStr[] = "This is a long test12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"; + + retVal = u_sprintf(uStringBuf, longStr); + u_austrncpy(myString, uStringBuf, sizeof(uStringBuf)/sizeof(*uStringBuf)); + if (strcmp(myString, longStr)) { + log_err("%%S Got: %s, Expected: %s\n", myString, longStr); + } + if (retVal != (int32_t)strlen(longStr)) { + log_err("%%S returned different sizes. Got: %d Expected: %d\n", retVal, strlen(longStr)); + } + + retVal = u_sprintf(uStringBuf, "%s", longStr); + u_austrncpy(myString, uStringBuf, sizeof(uStringBuf)/sizeof(*uStringBuf)); + if (strcmp(myString, longStr)) { + log_err("%%S Got: %s, Expected: %s\n", myString, longStr); + } + if (retVal != (int32_t)strlen(longStr)) { + log_err("%%S returned different sizes. Got: %d Expected: %d\n", retVal, strlen(longStr)); + } + + u_uastrncpy(myUString, longStr, sizeof(longStr)/sizeof(*longStr)); + u_sprintf_u(uStringBuf, myUString); + if (u_strcmp(myUString, uStringBuf)) { + log_err("%%S Long strings differ. Expected: %s\n", longStr); + } + + u_uastrncpy(myUString, longStr, sizeof(longStr)/sizeof(*longStr)); + retVal = u_sprintf_u(uStringBuf, myUString+10); + if (u_strcmp(myUString+10, uStringBuf)) { + log_err("%%S Long strings differ. Expected: %s\n", longStr + 10); + } + if (retVal != (int32_t)strlen(longStr + 10)) { + log_err("%%S returned different sizes. Got: %d Expected: %d\n", retVal, strlen(longStr)); + } + + u_memset(uStringBuf, 1, sizeof(longStr)/sizeof(*longStr)); + u_uastrncpy(myUString, longStr, sizeof(longStr)/sizeof(*longStr)); + retVal = u_snprintf_u(uStringBuf, 10, myUString); + if (u_strncmp(myUString, uStringBuf, 10) || uStringBuf[10] != 1 || retVal != 10) { + log_err("%%S Long strings differ. Expected the first 10 characters of %s\n", longStr); + } + } +#endif +} + +static void TestLocalizedString(void) { +#if !UCONFIG_NO_FORMATTING + UChar testStr[256]; + UChar uBuffer[256]; + char cBuffer[256]; + int32_t numResult = -1; + const char *locale; + UFILE *strFile = u_fstropen(testStr, sizeof(testStr)/sizeof(testStr[0]), "en_US"); + + if (!strFile) { + log_err("u_fstropen failed to work\n"); + return; + } + u_fprintf(strFile, "%d", 1234); + u_frewind(strFile); + u_fscanf(strFile, "%d", &numResult); + u_uastrcpy(uBuffer,"1,234"); + u_austrcpy(cBuffer,testStr); + if (u_strcmp(testStr, uBuffer) != 0) { + log_err("u_fprintf failed to work on an en string Got: %s\n", cBuffer); + } + if (numResult != 1234) { + log_err("u_fscanf failed to work on an en string Got: %d\n", numResult); + } + + u_frewind(strFile); + locale = u_fgetlocale(strFile); + if (locale == NULL || strcmp(locale, "en_US") != 0) { + log_err("u_fgetlocale didn't return \"en\" Got: %d\n", u_fgetlocale(strFile)); + } + u_fsetlocale(strFile, "de_DE"); + locale = u_fgetlocale(strFile); + if (locale == NULL || strcmp(locale, "de_DE") != 0) { + log_err("u_fgetlocale didn't return \"de\" Got: %d\n", u_fgetlocale(strFile)); + } + + u_fprintf(strFile, "%d", 1234); + u_frewind(strFile); + u_fscanf(strFile, "%d", &numResult); + u_fclose(strFile); + u_uastrcpy(uBuffer,"1.234"); + u_austrcpy(cBuffer,testStr); + if (u_strcmp(testStr, uBuffer) != 0) { + log_err("u_fprintf failed to work on a de string Got: %s\n", cBuffer); + } + if (numResult != 1234) { + log_err("u_fscanf failed to work on a de string Got: %d\n", numResult); + } +#endif +} + +#if !UCONFIG_NO_FORMATTING +#define Test_u_snprintf(limit, format, value, expectedSize, expectedStr) \ + u_uastrncpy(testStr, "xxxxxxxxxxxxxx", sizeof(testStr)/sizeof(testStr[0]));\ + size = u_snprintf(testStr, limit, format, value);\ + u_austrncpy(cTestResult, testStr, sizeof(cTestResult)/sizeof(cTestResult[0]));\ + if (size != expectedSize || strcmp(cTestResult, expectedStr) != 0) {\ + log_err("Unexpected formatting. size=%d expectedSize=%d cTestResult=%s expectedStr=%s\n",\ + size, expectedSize, cTestResult, expectedStr);\ + }\ + else {\ + log_verbose("Got: %s\n", cTestResult);\ + }\ + +#endif + +static void TestSnprintf(void) { +#if !UCONFIG_NO_FORMATTING + UChar testStr[256]; + char cTestResult[256]; + int32_t size; + + Test_u_snprintf(0, "%d", 123, 0, "xxxxxxxxxxxxxx"); + Test_u_snprintf(2, "%d", 123, 2, "12xxxxxxxxxxxx"); + Test_u_snprintf(3, "%d", 123, 3, "123xxxxxxxxxxx"); + Test_u_snprintf(4, "%d", 123, 3, "123"); + + Test_u_snprintf(0, "%s", "abcd", 0, "xxxxxxxxxxxxxx"); + Test_u_snprintf(3, "%s", "abcd", 3, "abcxxxxxxxxxxx"); + Test_u_snprintf(4, "%s", "abcd", 4, "abcdxxxxxxxxxx"); + Test_u_snprintf(5, "%s", "abcd", 4, "abcd"); + + Test_u_snprintf(0, "%e", 12.34, 0, "xxxxxxxxxxxxxx"); + Test_u_snprintf(1, "%e", 12.34, 1, "1xxxxxxxxxxxxx"); + Test_u_snprintf(2, "%e", 12.34, 2, "1.xxxxxxxxxxxx"); + Test_u_snprintf(3, "%e", 12.34, 3, "1.2xxxxxxxxxxx"); + Test_u_snprintf(5, "%e", 12.34, 5, "1.234xxxxxxxxx"); + Test_u_snprintf(6, "%e", 12.34, 6, "1.2340xxxxxxxx"); + Test_u_snprintf(8, "%e", 12.34, 8, "1.234000xxxxxx"); + Test_u_snprintf(9, "%e", 12.34, 9, "1.234000exxxxx"); + Test_u_snprintf(10, "%e", 12.34, 10, "1.234000e+xxxx"); + Test_u_snprintf(11, "%e", 12.34, 11, "1.234000e+0xxx"); + Test_u_snprintf(13, "%e", 12.34, 13, "1.234000e+001x"); + Test_u_snprintf(14, "%e", 12.34, 13, "1.234000e+001"); +#endif +} + +#define TestSPrintFormat(uFormat, uValue, cFormat, cValue) \ + /* Reinitialize the buffer to verify null termination works. */\ + u_memset(uBuffer, 0x2a, sizeof(uBuffer)/sizeof(*uBuffer));\ + memset(buffer, '*', sizeof(buffer)/sizeof(*buffer));\ + \ + uNumPrinted = u_sprintf(uBuffer, uFormat, uValue);\ + u_austrncpy(compBuffer, uBuffer, sizeof(uBuffer)/sizeof(uBuffer[0]));\ + cNumPrinted = sprintf(buffer, cFormat, cValue);\ + if (strcmp(buffer, compBuffer) != 0) {\ + log_err("%" uFormat " Got: \"%s\", Expected: \"%s\"\n", compBuffer, buffer);\ + }\ + if (cNumPrinted != uNumPrinted) {\ + log_err("%" uFormat " number printed Got: %d, Expected: %d\n", uNumPrinted, cNumPrinted);\ + }\ + if (buffer[uNumPrinted+1] != '*') {\ + log_err("%" uFormat " too much stored\n");\ + }\ + +static void TestSprintfFormat(void) { +#if !UCONFIG_NO_FORMATTING + static const UChar abcUChars[] = {0x61,0x62,0x63,0}; + static const char abcChars[] = "abc"; + UChar uBuffer[256]; + char buffer[256]; + char compBuffer[256]; + int32_t uNumPrinted; + int32_t cNumPrinted; + + + TestSPrintFormat("%8S", abcUChars, "%8s", abcChars); + TestSPrintFormat("%-8S", abcUChars, "%-8s", abcChars); + TestSPrintFormat("%.2S", abcUChars, "%.2s", abcChars); /* strlen is 3 */ + + TestSPrintFormat("%8s", abcChars, "%8s", abcChars); + TestSPrintFormat("%-8s", abcChars, "%-8s", abcChars); + TestSPrintFormat("%.2s", abcChars, "%.2s", abcChars); /* strlen is 3 */ + + TestSPrintFormat("%8c", (char)'e', "%8c", (char)'e'); + TestSPrintFormat("%-8c", (char)'e', "%-8c", (char)'e'); + + TestSPrintFormat("%8C", (UChar)0x65, "%8c", (char)'e'); + TestSPrintFormat("%-8C", (UChar)0x65, "%-8c", (char)'e'); + + TestSPrintFormat("%f", 1.23456789, "%f", 1.23456789); + TestSPrintFormat("%f", 12345.6789, "%f", 12345.6789); + TestSPrintFormat("%f", 123456.789, "%f", 123456.789); + TestSPrintFormat("%f", 1234567.89, "%f", 1234567.89); + TestSPrintFormat("%10f", 1.23456789, "%10f", 1.23456789); + TestSPrintFormat("%-10f", 1.23456789, "%-10f", 1.23456789); + TestSPrintFormat("%10f", 123.456789, "%10f", 123.456789); + TestSPrintFormat("%10.4f", 123.456789, "%10.4f", 123.456789); + TestSPrintFormat("%-10f", 123.456789, "%-10f", 123.456789); + +/* TestSPrintFormat("%g", 12345.6789, "%g", 12345.6789); + TestSPrintFormat("%g", 123456.789, "%g", 123456.789); + TestSPrintFormat("%g", 1234567.89, "%g", 1234567.89); + TestSPrintFormat("%G", 123456.789, "%G", 123456.789); + TestSPrintFormat("%G", 1234567.89, "%G", 1234567.89);*/ + TestSPrintFormat("%10g", 1.23456789, "%10g", 1.23456789); + TestSPrintFormat("%10.4g", 1.23456789, "%10.4g", 1.23456789); + TestSPrintFormat("%-10g", 1.23456789, "%-10g", 1.23456789); + TestSPrintFormat("%10g", 123.456789, "%10g", 123.456789); + TestSPrintFormat("%-10g", 123.456789, "%-10g", 123.456789); + + TestSPrintFormat("%8x", 123456, "%8x", 123456); + TestSPrintFormat("%-8x", 123456, "%-8x", 123456); + TestSPrintFormat("%08x", 123456, "%08x", 123456); + + TestSPrintFormat("%8X", 123456, "%8X", 123456); + TestSPrintFormat("%-8X", 123456, "%-8X", 123456); + TestSPrintFormat("%08X", 123456, "%08X", 123456); + TestSPrintFormat("%#x", 123456, "%#x", 123456); + TestSPrintFormat("%#x", -123456, "%#x", -123456); + + TestSPrintFormat("%8o", 123456, "%8o", 123456); + TestSPrintFormat("%-8o", 123456, "%-8o", 123456); + TestSPrintFormat("%08o", 123456, "%08o", 123456); + TestSPrintFormat("%#o", 123, "%#o", 123); + TestSPrintFormat("%#o", -123, "%#o", -123); + + TestSPrintFormat("%8u", 123456, "%8u", 123456); + TestSPrintFormat("%-8u", 123456, "%-8u", 123456); + TestSPrintFormat("%08u", 123456, "%08u", 123456); + TestSPrintFormat("%8u", -123456, "%8u", -123456); + TestSPrintFormat("%-8u", -123456, "%-8u", -123456); + TestSPrintFormat("%.5u", 123456, "%.5u", 123456); + TestSPrintFormat("%.6u", 123456, "%.6u", 123456); + TestSPrintFormat("%.7u", 123456, "%.7u", 123456); + + TestSPrintFormat("%8d", 123456, "%8d", 123456); + TestSPrintFormat("%-8d", 123456, "%-8d", 123456); + TestSPrintFormat("%08d", 123456, "%08d", 123456); + TestSPrintFormat("% d", 123456, "% d", 123456); + TestSPrintFormat("% d", -123456, "% d", -123456); + + TestSPrintFormat("%8i", 123456, "%8i", 123456); + TestSPrintFormat("%-8i", 123456, "%-8i", 123456); + TestSPrintFormat("%08i", 123456, "%08i", 123456); + + log_verbose("Get really crazy with the formatting.\n"); + + TestSPrintFormat("%-#12x", 123, "%-#12x", 123); + TestSPrintFormat("%-#12x", -123, "%-#12x", -123); + TestSPrintFormat("%#12x", 123, "%#12x", 123); + TestSPrintFormat("%#12x", -123, "%#12x", -123); + + TestSPrintFormat("%-+12d", 123, "%-+12d", 123); + TestSPrintFormat("%-+12d", -123, "%-+12d", -123); + TestSPrintFormat("%- 12d", 123, "%- 12d", 123); + TestSPrintFormat("%- 12d", -123, "%- 12d", -123); + TestSPrintFormat("%+12d", 123, "%+12d", 123); + TestSPrintFormat("%+12d", -123, "%+12d", -123); + TestSPrintFormat("% 12d", 123, "% 12d", 123); + TestSPrintFormat("% 12d", -123, "% 12d", -123); + TestSPrintFormat("%12d", 123, "%12d", 123); + TestSPrintFormat("%12d", -123, "%12d", -123); + TestSPrintFormat("%.12d", 123, "%.12d", 123); + TestSPrintFormat("%.12d", -123, "%.12d", -123); + + TestSPrintFormat("%-+12.1f", 1.234, "%-+12.1f", 1.234); + TestSPrintFormat("%-+12.1f", -1.234, "%-+12.1f", -1.234); + TestSPrintFormat("%- 12.10f", 1.234, "%- 12.10f", 1.234); + TestSPrintFormat("%- 12.1f", -1.234, "%- 12.1f", -1.234); + TestSPrintFormat("%+12.1f", 1.234, "%+12.1f", 1.234); + TestSPrintFormat("%+12.1f", -1.234, "%+12.1f", -1.234); + TestSPrintFormat("% 12.1f", 1.234, "% 12.1f", 1.234); + TestSPrintFormat("% 12.1f", -1.234, "% 12.1f", -1.234); + TestSPrintFormat("%12.1f", 1.234, "%12.1f", 1.234); + TestSPrintFormat("%12.1f", -1.234, "%12.1f", -1.234); + TestSPrintFormat("%.2f", 1.234, "%.2f", 1.234); + TestSPrintFormat("%.2f", -1.234, "%.2f", -1.234); + TestSPrintFormat("%3f", 1.234, "%3f", 1.234); + TestSPrintFormat("%3f", -1.234, "%3f", -1.234); +#endif +} + +#undef TestSPrintFormat + +static void TestStringCompatibility(void) { +#if !UCONFIG_NO_FORMATTING + UChar myUString[256]; + UChar uStringBuf[256]; + char myString[256] = ""; + char testBuf[256] = ""; + int32_t num; + + u_memset(myUString, 0x0a, sizeof(myUString)/ sizeof(*myUString)); + u_memset(uStringBuf, 0x0a, sizeof(uStringBuf) / sizeof(*uStringBuf)); + + /* Compare against C API compatibility */ + for (num = -STANDARD_TEST_NUM_RANGE; num < STANDARD_TEST_NUM_RANGE; num++) { + sprintf(testBuf, "%x", (int)num); + u_sprintf(uStringBuf, "%x", num); + u_austrncpy(myString, uStringBuf, sizeof(myString)/sizeof(myString[0])); + if (strcmp(myString, testBuf) != 0) { + log_err("%%x Got: \"%s\", Expected: \"%s\"\n", myString, testBuf); + } + + sprintf(testBuf, "%X", (int)num); + u_sprintf(uStringBuf, "%X", num); + u_austrncpy(myString, uStringBuf, sizeof(myString)/sizeof(myString[0])); + if (strcmp(myString, testBuf) != 0) { + log_err("%%X Got: \"%s\", Expected: \"%s\"\n", myString, testBuf); + } + + sprintf(testBuf, "%o", (int)num); + u_sprintf(uStringBuf, "%o", num); + u_austrncpy(myString, uStringBuf, sizeof(myString)/sizeof(myString[0])); + if (strcmp(myString, testBuf) != 0) { + log_err("%%o Got: \"%s\", Expected: \"%s\"\n", myString, testBuf); + } + + /* sprintf is not compatible on all platforms e.g. the iSeries*/ + sprintf(testBuf, "%d", (int)num); + u_sprintf(uStringBuf, "%d", num); + u_austrncpy(myString, uStringBuf, sizeof(myString)/sizeof(myString[0])); + if (strcmp(myString, testBuf) != 0) { + log_err("%%d Got: \"%s\", Expected: \"%s\"\n", myString, testBuf); + } + + sprintf(testBuf, "%i", (int)num); + u_sprintf(uStringBuf, "%i", num); + u_austrncpy(myString, uStringBuf, sizeof(myString)/sizeof(myString[0])); + if (strcmp(myString, testBuf) != 0) { + log_err("%%i Got: \"%s\", Expected: \"%s\"\n", myString, testBuf); + } + + sprintf(testBuf, "%f", (double)num); + u_sprintf(uStringBuf, "%f", (double)num); + u_austrncpy(myString, uStringBuf, sizeof(myString)/sizeof(myString[0])); + if (strcmp(myString, testBuf) != 0) { + log_err("%%f Got: \"%s\", Expected: \"%s\"\n", myString, testBuf); + } + +/* sprintf(testBuf, "%e", (double)num); + u_sprintf(uStringBuf, "%e", (double)num); + u_austrncpy(myString, uStringBuf, sizeof(myString)/sizeof(myString[0])); + if (strcmp(myString, testBuf) != 0) { + log_err("%%e Got: \"%s\", Expected: \"%s\"\n", myString, testBuf); + } + + sprintf(testBuf, "%E", (double)num); + u_sprintf(uStringBuf, "%E", (double)num); + u_austrncpy(myString, uStringBuf, sizeof(myString)/sizeof(myString[0])); + if (strcmp(myString, testBuf) != 0) { + log_err("%%E Got: \"%s\", Expected: \"%s\"\n", myString, testBuf); + }*/ + + sprintf(testBuf, "%g", (double)num); + u_sprintf(uStringBuf, "%g", (double)num); + u_austrncpy(myString, uStringBuf, sizeof(myString)/sizeof(myString[0])); + if (strcmp(myString, testBuf) != 0) { + log_err("%%g Got: \"%s\", Expected: \"%s\"\n", myString, testBuf); + } + + sprintf(testBuf, "%G", (double)num); + u_sprintf(uStringBuf, "%G", (double)num); + u_austrncpy(myString, uStringBuf, sizeof(myString)/sizeof(myString[0])); + if (strcmp(myString, testBuf) != 0) { + log_err("%%G Got: \"%s\", Expected: \"%s\"\n", myString, testBuf); + } + } + + for (num = 0; num < 0x80; num++) { + testBuf[0] = (char)0xFF; + uStringBuf[0] = (UChar)0xfffe; + sprintf(testBuf, "%c", (char)num); + u_sprintf(uStringBuf, "%c", num); + u_austrncpy(myString, uStringBuf, sizeof(myString)/sizeof(myString[0])); + if (testBuf[0] != myString[0] || myString[0] != num) { + log_err("%%c Got: 0x%x, Expected: 0x%x\n", myString[0], testBuf[0]); + } + } +#endif +} + +static void TestSScanSetFormat(const char *format, const UChar *uValue, const char *cValue, UBool expectedToPass) { +#if !UCONFIG_NO_FORMATTING + UChar uBuffer[256]; + char buffer[256]; + char compBuffer[256]; + int32_t uNumScanned; + int32_t cNumScanned; + + /* Reinitialize the buffer to verify null termination works. */ + u_memset(uBuffer, 0x2a, sizeof(uBuffer)/sizeof(*uBuffer)); + uBuffer[sizeof(uBuffer)/sizeof(*uBuffer)-1] = 0; + memset(buffer, '*', sizeof(buffer)/sizeof(*buffer)); + buffer[sizeof(buffer)/sizeof(*buffer)-1] = 0; + + uNumScanned = u_sscanf(uValue, format, uBuffer); + if (expectedToPass) { + u_austrncpy(compBuffer, uBuffer, sizeof(uBuffer)/sizeof(uBuffer[0])); + cNumScanned = sscanf(cValue, format, buffer); + if (strncmp(buffer, compBuffer, sizeof(uBuffer)/sizeof(uBuffer[0])) != 0) { + log_err("%s Got: \"%s\", Expected: \"%s\"\n", format, compBuffer, buffer); + } + if (cNumScanned != uNumScanned) { + log_err("%s number scanned Got: %d, Expected: %d\n", format, uNumScanned, cNumScanned); + } + if (uNumScanned > 0 && uBuffer[u_strlen(uBuffer)+1] != 0x2a) { + log_err("%s too much stored\n", format); + } + } + else { + if (uNumScanned != 0 || uBuffer[0] != 0x2a || uBuffer[1] != 0x2a) { + log_err("%s too much stored on a failure\n", format); + } + } +#endif +} + +static void TestSScanset(void) { +#if !UCONFIG_NO_FORMATTING + static const UChar abcUChars[] = {0x61,0x62,0x63,0x63,0x64,0x65,0x66,0x67,0}; + static const char abcChars[] = "abccdefg"; + + TestSScanSetFormat("%[bc]S", abcUChars, abcChars, TRUE); + TestSScanSetFormat("%[cb]S", abcUChars, abcChars, TRUE); + + TestSScanSetFormat("%[ab]S", abcUChars, abcChars, TRUE); + TestSScanSetFormat("%[ba]S", abcUChars, abcChars, TRUE); + + TestSScanSetFormat("%[ab]", abcUChars, abcChars, TRUE); + TestSScanSetFormat("%[ba]", abcUChars, abcChars, TRUE); + + TestSScanSetFormat("%[abcdefgh]", abcUChars, abcChars, TRUE); + TestSScanSetFormat("%[;hgfedcba]", abcUChars, abcChars, TRUE); + + TestSScanSetFormat("%[^a]", abcUChars, abcChars, TRUE); + TestSScanSetFormat("%[^e]", abcUChars, abcChars, TRUE); + TestSScanSetFormat("%[^ed]", abcUChars, abcChars, TRUE); + TestSScanSetFormat("%[^dc]", abcUChars, abcChars, TRUE); + TestSScanSetFormat("%[^e] ", abcUChars, abcChars, TRUE); + + TestSScanSetFormat("%1[ab] ", abcUChars, abcChars, TRUE); + TestSScanSetFormat("%2[^f]", abcUChars, abcChars, TRUE); + + TestSScanSetFormat("%[qrst]", abcUChars, abcChars, TRUE); + + /* Extra long string for testing */ + TestSScanSetFormat(" %[qrst]", + abcUChars, abcChars, TRUE); + + TestSScanSetFormat("%[a-]", abcUChars, abcChars, TRUE); + + /* Bad format */ + TestSScanSetFormat("%[a", abcUChars, abcChars, FALSE); + TestSScanSetFormat("%[f-a]", abcUChars, abcChars, FALSE); + TestSScanSetFormat("%[c-a]", abcUChars, abcChars, FALSE); + /* The following is not deterministic on Windows */ +/* TestSScanSetFormat("%[a-", abcUChars, abcChars);*/ + + /* TODO: Need to specify precision with a "*" */ +#endif +} + +static void TestBadSScanfFormat(const char *format, const UChar *uValue, const char *cValue) { +#if !UCONFIG_NO_FORMATTING + UChar uBuffer[256]; + int32_t uNumScanned; + + /* Reinitialize the buffer to verify null termination works. */ + u_memset(uBuffer, 0x2a, sizeof(uBuffer)/sizeof(*uBuffer)); + uBuffer[sizeof(uBuffer)/sizeof(*uBuffer)-1] = 0; + + uNumScanned = u_sscanf(uValue, format, uBuffer); + if (uNumScanned != 0 || uBuffer[0] != 0x2a || uBuffer[1] != 0x2a) { + log_err("%s too much stored on a failure\n", format); + } +#endif +} + +static void TestBadScanfFormat(void) { +#if !UCONFIG_NO_FORMATTING + static const UChar abcUChars[] = {0x61,0x62,0x63,0x63,0x64,0x65,0x66,0x67,0}; + static const char abcChars[] = "abccdefg"; + + TestBadSScanfFormat("%[] ", abcUChars, abcChars); +#endif +} + +static void Test_u_vfprintf(const char *expectedResult, const char *format, ...) { +#if !UCONFIG_NO_FORMATTING + UChar uBuffer[256]; + UChar uBuffer2[256]; + va_list ap; + int32_t count; + + va_start(ap, format); + count = u_vsprintf(uBuffer, format, ap); + va_end(ap); + u_uastrcpy(uBuffer2, expectedResult); + if (u_strcmp(uBuffer, uBuffer2) != 0) { + log_err("Got two different results for \"%s\" expected \"%s\"\n", format, expectedResult); + } + + u_uastrcpy(uBuffer2, format); + va_start(ap, format); + count = u_vsprintf_u(uBuffer, uBuffer2, ap); + va_end(ap); + u_uastrcpy(uBuffer2, expectedResult); + if (u_strcmp(uBuffer, uBuffer2) != 0) { + log_err("Got two different results for \"%s\" expected \"%s\"\n", format, expectedResult); + } +#endif +} + +static void TestVargs(void) { +#if !UCONFIG_NO_FORMATTING + Test_u_vfprintf("8 9 a B 8.9", "%d %u %x %X %.1f", 8, 9, 10, 11, 8.9); +#endif +} + +static void TestCount(void) { +#if !UCONFIG_NO_FORMATTING + UChar testStr[16]; + int16_t i16 = -1; + int32_t i32 = -1; + int64_t i64 = -1; + u_uastrcpy(testStr, "1233456789"); + if (u_sscanf(testStr, "%*3[123]%n%*[1-9]", &i32) != 0) { + log_err("test 1: scanf did not return 0\n"); + } + if (i32 != 3) { + log_err("test 1: scanf returned %hd instead of 3\n", i32); + } + if (u_sscanf(testStr, "%*4[123]%hn%*[1-9]", &i16) != 0) { + log_err("test 2: scanf did not return 0\n"); + } + if (i16 != 4) { + log_err("test 2: scanf returned %d instead of 4\n", i16); + } + if (u_sscanf(testStr, "%*[123]%*[1-9]%lln", &i64) != 0) { + log_err("test 3: scanf did not return 0\n"); + } + if (i64 != 10) { + log_err("test 3: scanf did not return 10\n", i64); + } +#endif +} + +U_CFUNC void +addStringTest(TestNode** root) { +#if !UCONFIG_NO_FORMATTING + addTest(root, &TestString, "string/TestString"); + addTest(root, &TestLocalizedString, "string/TestLocalizedString"); + addTest(root, &TestSprintfFormat, "string/TestSprintfFormat"); + addTest(root, &TestSnprintf, "string/TestSnprintf"); + addTest(root, &TestSScanset, "string/TestSScanset"); + addTest(root, &TestStringCompatibility, "string/TestStringCompatibility"); + addTest(root, &TestBadScanfFormat, "string/TestBadScanfFormat"); + addTest(root, &TestVargs, "string/TestVargs"); + addTest(root, &TestCount, "string/TestCount"); +#endif +} + + diff --git a/icuSources/test/letest/PortableFontInstance.cpp b/icuSources/test/letest/PortableFontInstance.cpp index 0405a2d2..b84102aa 100644 --- a/icuSources/test/letest/PortableFontInstance.cpp +++ b/icuSources/test/letest/PortableFontInstance.cpp @@ -276,6 +276,6 @@ void PortableFontInstance::getGlyphAdvance(LEGlyphID glyph, LEPoint &advance) co le_bool PortableFontInstance::getGlyphPoint(LEGlyphID glyph, le_int32 pointNumber, LEPoint &point) const { - return false; + return FALSE; } diff --git a/icuSources/test/letest/gendata.cpp b/icuSources/test/letest/gendata.cpp index 24aa3384..9b54a873 100644 --- a/icuSources/test/letest/gendata.cpp +++ b/icuSources/test/letest/gendata.cpp @@ -1,7 +1,7 @@ /* ******************************************************************************* * - * Copyright (C) 1999-2003, International Business Machines + * Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -42,7 +42,7 @@ char *header = "/*\n" " *******************************************************************************\n" " *\n" - " * Copyright (C) 1999-2003, International Business Machines\n" + " * Copyright (C) 1999-2004, International Business Machines\n" " * Corporation and others. All Rights Reserved.\n" " *\n" " * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT\n" @@ -255,10 +255,10 @@ LEUnicode thaiSample[] = le_int32 thaiSampleLength = ARRAY_LENGTH(thaiSample); TestInput testInputs[] = { - {"raghu.ttf", devaText, devaTextLength, devaScriptCode, false}, - {"CODE2000.TTF", arabText, arabTextLength, arabScriptCode, true}, - {"LucidaSansRegular.ttf", arabText, arabTextLength, arabScriptCode, true}, - {"Thonburi.ttf", thaiSample, thaiSampleLength, thaiScriptCode, false} + {"raghu.ttf", devaText, devaTextLength, devaScriptCode, FALSE}, + {"CODE2000.TTF", arabText, arabTextLength, arabScriptCode, TRUE}, + {"LucidaSansRegular.ttf", arabText, arabTextLength, arabScriptCode, TRUE}, + {"Thonburi.ttf", thaiSample, thaiSampleLength, thaiScriptCode, FALSE} }; #define TEST_COUNT ARRAY_LENGTH(testInputs) @@ -409,7 +409,7 @@ int main(int argc, char *argv[]) for (test = 0; test < testCount; test += 1) { fprintf(outputFile, " {\"%s\", inputText%d, %d, %sScriptCode, %s},\n", testInputs[test].fontName, test, testInputs[test].textLength, getShortName(testInputs[test].scriptCode), - testInputs[test].rightToLeft? "true" : "false"); + testInputs[test].rightToLeft? "TRUE" : "FALSE"); } fprintf(outputFile, "};\n\nle_int32 testCount = ARRAY_LENGTH(testInputs);\n\n"); diff --git a/icuSources/test/letest/letest.cpp b/icuSources/test/letest/letest.cpp index 56f2b470..fbdb43ac 100644 --- a/icuSources/test/letest/letest.cpp +++ b/icuSources/test/letest/letest.cpp @@ -26,7 +26,7 @@ le_bool compareResults(le_int32 testNumber, TestResult *expected, TestResult *ac /* NOTE: we'll stop on the first failure 'cause once there's one error, it may cascade... */ if (actual->glyphCount != expected->glyphCount) { printf("incorrect glyph count: exptected %d, got %d\n", expected->glyphCount, actual->glyphCount); - return false; + return FALSE; } le_int32 i; @@ -34,14 +34,14 @@ le_bool compareResults(le_int32 testNumber, TestResult *expected, TestResult *ac for (i = 0; i < actual->glyphCount; i += 1) { if (actual->glyphs[i] != expected->glyphs[i]) { printf("incorrect id for glyph %d: expected %4X, got %4X\n", i, expected->glyphs[i], actual->glyphs[i]); - return false; + return FALSE; } } for (i = 0; i < actual->glyphCount; i += 1) { if (actual->indices[i] != expected->indices[i]) { printf("incorrect index for glyph %d: expected %8X, got %8X\n", i, expected->indices[i], actual->indices[i]); - return false; + return FALSE; } } @@ -50,7 +50,7 @@ le_bool compareResults(le_int32 testNumber, TestResult *expected, TestResult *ac if (xError > 0.0001) { printf("incorrect x position for glyph %d: expected %f, got %f\n", i, expected->positions[i * 2], actual->positions[i * 2]); - return false; + return FALSE; } double yError = fabs(actual->positions[i * 2 + 1] - expected->positions[i * 2 + 1]); @@ -61,11 +61,11 @@ le_bool compareResults(le_int32 testNumber, TestResult *expected, TestResult *ac if (yError > 0.0001) { printf("incorrect y position for glyph %d: expected %f, got %f\n", i, expected->positions[i * 2 + 1], actual->positions[i * 2 + 1]); - return false; + return FALSE; } } - return true; + return TRUE; } int main(int argc, char *argv[]) diff --git a/icuSources/test/letest/testdata.cpp b/icuSources/test/letest/testdata.cpp index 2aff3fc0..57987e1f 100644 --- a/icuSources/test/letest/testdata.cpp +++ b/icuSources/test/letest/testdata.cpp @@ -1,7 +1,7 @@ /* ******************************************************************************* * - * Copyright (C) 1999-2003, International Business Machines + * Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT @@ -265,40 +265,40 @@ float resultPositions1[] = 503.671875F, 0.000000F, 507.890625F, 0.000000F, 513.796875F, 0.000000F, 518.484375F, 0.000000F, 525.796875F, 0.000000F, 527.906250F, 0.000000F, 533.578125F, 0.000000F, 538.265625F, 0.000000F, 541.781250F, 0.000000F, 547.171875F, 0.000000F, 550.710938F, 0.000000F, 556.710938F, 0.000000F, - 564.492188F, 0.000000F, 570.140625F, 0.000000F, 573.515625F, 0.000000F, 579.515625F, 0.000000F, - 583.734375F, 0.000000F, 589.125000F, 0.000000F, 593.812500F, 0.000000F, 599.625000F, 0.000000F, - 601.687500F, 0.000000F, 606.140625F, 0.000000F, 610.382813F, 0.000000F, 616.195313F, 0.000000F, - 618.257813F, 0.000000F, 622.945313F, 0.000000F, 629.343750F, 0.000000F, 633.585938F, 0.000000F, - 637.687500F, 0.000000F, 643.687500F, 0.000000F, 648.375000F, 0.000000F, 651.703125F, 0.000000F, - 653.812500F, 0.000000F, 657.562500F, 0.000000F, 661.781250F, 0.000000F, 666.046875F, 0.000000F, - 670.734375F, 0.000000F, 674.671875F, 0.000000F, 680.484375F, 0.000000F, 682.546875F, 0.000000F, - 688.546875F, 0.000000F, 693.234375F, 0.000000F, 699.632813F, 0.000000F, 707.414063F, 0.000000F, - 710.437500F, 0.000000F, 715.125000F, 0.000000F, 717.234375F, 0.000000F, 721.453125F, 0.000000F, - 725.695313F, 0.000000F, 729.164063F, 0.000000F, 733.429688F, 0.000000F, 738.117188F, 0.000000F, - 740.226563F, 0.000000F, 744.492188F, 0.000000F, 748.593750F, 0.000000F, 753.046875F, 0.000000F, - 757.734375F, 0.000000F, 766.101563F, 0.000000F, 773.039063F, 0.000000F, 776.507813F, 0.000000F, - 780.328125F, 0.000000F, 784.523438F, 0.000000F, 789.210938F, 0.000000F, 796.523438F, 0.000000F, - 798.867188F, 0.000000F, 803.554688F, 0.000000F, 807.492188F, 0.000000F, 810.960938F, 0.000000F, - 814.406250F, 0.000000F, 819.093750F, 0.000000F, 827.437500F, 0.000000F, 831.890625F, 0.000000F, - 837.703125F, 0.000000F, 837.703125F, 0.000000F, 843.867188F, 0.000000F, 845.929688F, 0.000000F, - 850.617188F, 0.000000F, 859.851563F, 0.000000F, 864.304688F, 0.000000F, 866.414063F, 0.000000F, - 871.921875F, 0.000000F, 876.187500F, 0.000000F, 879.210938F, 0.000000F, 881.273438F, 0.000000F, - 887.273438F, 0.000000F, 891.960938F, 0.000000F, 901.195313F, 0.000000F, 905.648438F, 0.000000F, - 911.460938F, 0.000000F, 911.460938F, 0.000000F, 917.625000F, 0.000000F, 919.687500F, 0.000000F, - 924.375000F, 0.000000F, 931.851563F, 0.000000F, 936.070313F, 0.000000F, 940.523438F, 0.000000F, - 946.031250F, 0.000000F, 950.273438F, 0.000000F, 953.718750F, 0.000000F, 958.406250F, 0.000000F, - 962.414063F, 0.000000F, 968.414063F, 0.000000F, 971.882813F, 0.000000F, 976.078125F, 0.000000F, - 982.078125F, 0.000000F, 986.765625F, 0.000000F, 990.281250F, 0.000000F, 994.289063F, 0.000000F, - 996.398438F, 0.000000F, 1000.500000F, 0.000000F, 1004.953125F, 0.000000F, 1004.953125F, 0.000000F, - 1011.117188F, 0.000000F, 1013.179688F, 0.000000F, 1017.867188F, 0.000000F, 1022.882813F, 0.000000F, - 1027.148438F, 0.000000F, 1031.835938F, 0.000000F, 1039.781250F, 0.000000F, 1043.250000F, 0.000000F, - 1047.351563F, 0.000000F, 1052.039063F, 0.000000F, 1061.390625F, 0.000000F, 1065.632813F, 0.000000F, - 1072.453125F, 0.000000F, 1074.515625F, 0.000000F, 1080.515625F, 0.000000F, 1086.023438F, 0.000000F, - 1089.046875F, 0.000000F, 1091.109375F, 0.000000F, 1095.796875F, 0.000000F, 1102.195313F, 0.000000F, - 1106.460938F, 0.000000F, 1108.570313F, 0.000000F, 1112.039063F, 0.000000F, 1116.281250F, 0.000000F, - 1120.476563F, 0.000000F, 1125.164063F, 0.000000F, 1128.679688F, 0.000000F, 1130.789063F, 0.000000F, - 1137.328125F, 0.000000F, 1144.148438F, 0.000000F, 1146.257813F, 0.000000F, 1153.078125F, 0.000000F, - 1155.421875F, 0.000000F + 564.492188F, 0.000000F, 564.492188F, 0.000000F, 567.867188F, 0.000000F, 573.867188F, 0.000000F, + 578.085938F, 0.000000F, 583.476563F, 0.000000F, 588.164063F, 0.000000F, 593.976563F, 0.000000F, + 596.039063F, 0.000000F, 600.492188F, 0.000000F, 604.734375F, 0.000000F, 610.546875F, 0.000000F, + 612.609375F, 0.000000F, 617.296875F, 0.000000F, 623.695313F, 0.000000F, 627.937500F, 0.000000F, + 632.039063F, 0.000000F, 638.039063F, 0.000000F, 642.726563F, 0.000000F, 646.054688F, 0.000000F, + 648.164063F, 0.000000F, 651.914063F, 0.000000F, 656.132813F, 0.000000F, 660.398438F, 0.000000F, + 665.085938F, 0.000000F, 669.023438F, 0.000000F, 674.835938F, 0.000000F, 676.898438F, 0.000000F, + 682.898438F, 0.000000F, 687.585938F, 0.000000F, 693.984375F, 0.000000F, 701.765625F, 0.000000F, + 704.789063F, 0.000000F, 709.476563F, 0.000000F, 711.585938F, 0.000000F, 715.804688F, 0.000000F, + 720.046875F, 0.000000F, 723.515625F, 0.000000F, 727.781250F, 0.000000F, 732.468750F, 0.000000F, + 734.578125F, 0.000000F, 738.843750F, 0.000000F, 742.945313F, 0.000000F, 747.398438F, 0.000000F, + 752.085938F, 0.000000F, 760.453125F, 0.000000F, 767.390625F, 0.000000F, 770.859375F, 0.000000F, + 770.859375F, 0.000000F, 775.054688F, 0.000000F, 779.742188F, 0.000000F, 787.054688F, 0.000000F, + 789.398438F, 0.000000F, 794.085938F, 0.000000F, 798.023438F, 0.000000F, 801.492188F, 0.000000F, + 804.937500F, 0.000000F, 809.625000F, 0.000000F, 817.968750F, 0.000000F, 822.421875F, 0.000000F, + 828.234375F, 0.000000F, 828.234375F, 0.000000F, 834.398438F, 0.000000F, 836.460938F, 0.000000F, + 841.148438F, 0.000000F, 850.382813F, 0.000000F, 854.835938F, 0.000000F, 856.945313F, 0.000000F, + 862.453125F, 0.000000F, 866.718750F, 0.000000F, 869.742188F, 0.000000F, 871.804688F, 0.000000F, + 877.804688F, 0.000000F, 882.492188F, 0.000000F, 891.726563F, 0.000000F, 896.179688F, 0.000000F, + 901.992188F, 0.000000F, 901.992188F, 0.000000F, 908.156250F, 0.000000F, 910.218750F, 0.000000F, + 914.906250F, 0.000000F, 922.382813F, 0.000000F, 926.601563F, 0.000000F, 931.054688F, 0.000000F, + 936.562500F, 0.000000F, 940.804688F, 0.000000F, 944.250000F, 0.000000F, 948.937500F, 0.000000F, + 952.945313F, 0.000000F, 958.945313F, 0.000000F, 962.414063F, 0.000000F, 966.609375F, 0.000000F, + 972.609375F, 0.000000F, 977.296875F, 0.000000F, 980.812500F, 0.000000F, 984.820313F, 0.000000F, + 986.929688F, 0.000000F, 991.031250F, 0.000000F, 995.484375F, 0.000000F, 995.484375F, 0.000000F, + 1001.648438F, 0.000000F, 1003.710938F, 0.000000F, 1008.398438F, 0.000000F, 1013.414063F, 0.000000F, + 1017.679688F, 0.000000F, 1022.367188F, 0.000000F, 1030.312500F, 0.000000F, 1033.781250F, 0.000000F, + 1037.882813F, 0.000000F, 1042.570313F, 0.000000F, 1051.921875F, 0.000000F, 1056.164063F, 0.000000F, + 1062.984375F, 0.000000F, 1065.046875F, 0.000000F, 1071.046875F, 0.000000F, 1076.554688F, 0.000000F, + 1079.578125F, 0.000000F, 1081.640625F, 0.000000F, 1086.328125F, 0.000000F, 1092.726563F, 0.000000F, + 1096.992188F, 0.000000F, 1099.101563F, 0.000000F, 1102.570313F, 0.000000F, 1106.812500F, 0.000000F, + 1111.007813F, 0.000000F, 1115.695313F, 0.000000F, 1119.210938F, 0.000000F, 1121.320313F, 0.000000F, + 1121.320313F, 0.000000F, 1128.140625F, 0.000000F, 1130.250000F, 0.000000F, 1137.070313F, 0.000000F, + 1139.414063F, 0.000000F }; @@ -608,10 +608,10 @@ float resultPositions3[] = TestInput testInputs[] = { - {"raghu.ttf", inputText0, 136, devaScriptCode, false}, - {"CODE2000.TTF", inputText1, 252, arabScriptCode, true}, - {"LucidaSansRegular.ttf", inputText2, 252, arabScriptCode, true}, - {"Thonburi.ttf", inputText3, 168, thaiScriptCode, false}, + {"raghu.ttf", inputText0, 136, devaScriptCode, FALSE}, + {"CODE2000.TTF", inputText1, 252, arabScriptCode, TRUE}, + {"LucidaSansRegular.ttf", inputText2, 252, arabScriptCode, TRUE}, + {"Thonburi.ttf", inputText3, 168, thaiScriptCode, FALSE}, }; le_int32 testCount = ARRAY_LENGTH(testInputs); diff --git a/icuSources/test/perf/charperf/Makefile.in b/icuSources/test/perf/charperf/Makefile.in index 20167276..dc73dd91 100644 --- a/icuSources/test/perf/charperf/Makefile.in +++ b/icuSources/test/perf/charperf/Makefile.in @@ -1,12 +1,12 @@ -## Makefile.in for ICU - test/ucharperf -## Copyright (c) 2001, International Business Machines Corporation and +## Makefile.in for ICU - test/charperf +## Copyright (c) 2001-2003, International Business Machines Corporation and ## others. All Rights Reserved. ## Source directory information srcdir = @srcdir@ top_srcdir = @top_srcdir@ -top_builddir = ../.. +top_builddir = ../../.. include $(top_builddir)/icudefs.mk @@ -14,16 +14,16 @@ include $(top_builddir)/icudefs.mk include @platform_make_fragment@ ## Build directory information -subdir = test/ucharperf +subdir = test/charperf ## Extra files to remove for 'make clean' CLEANFILES = *~ $(DEPS) ## Target information -TARGET = ucharperf +TARGET = charperf DEFS = @DEFS@ -CPPFLAGS = @CPPFLAGS@ -I$(top_builddir)/common -I$(top_srcdir)/common +CPPFLAGS = @CPPFLAGS@ -I$(top_builddir)/common -I$(top_srcdir)/common -I$(top_srcdir)/tools/toolutil CFLAGS = @CFLAGS@ CXXFLAGS = @CXXFLAGS@ ENABLE_RPATH = @ENABLE_RPATH@ @@ -31,9 +31,9 @@ ifeq ($(ENABLE_RPATH),YES) RPATHLDFLAGS = $(LD_RPATH)$(LD_RPATH_PRE)$(libdir) endif LDFLAGS = @LDFLAGS@ $(RPATHLDFLAGS) -LIBS = $(LIBICUUC) @LIBS@ @LIB_M@ +LIBS = $(LIBICUUC) $(LIBICUTOOLUTIL) @LIBS@ @LIB_M@ -OBJECTS = ucharperf.o +OBJECTS = charperf.o DEPS = $(OBJECTS:.o=.d) diff --git a/icuSources/test/perf/charperf/charperf.cpp b/icuSources/test/perf/charperf/charperf.cpp index 7ced35de..bde84695 100644 --- a/icuSources/test/perf/charperf/charperf.cpp +++ b/icuSources/test/perf/charperf/charperf.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (C) 2002 IBM, Inc. All Rights Reserved. + * Copyright (C) 2002-2003 IBM, Inc. All Rights Reserved. * ********************************************************************/ /***************************************************************************** @@ -68,8 +68,15 @@ CharPerformanceTest::CharPerformanceTest(int32_t argc, const char *argv[], (int32_t)(sizeof(options)/sizeof(options[0])), options); } MIN_ = 0; - MAX_ = 0xffff; - + if (sizeof(wchar_t) > 2) { + // for stdlibs like glibc that supports 32 bits wchar + // we test for the whole unicode character set by default + MAX_ = 0x10ffff; + } + else { + MAX_ = 0xffff; + } + printf("MAX_ size will be 0x%x\n", MAX_); if (options[MIN_OPTION_].doesOccur) { MIN_ = atoi(options[MIN_OPTION_].value); } diff --git a/icuSources/test/perf/charperf/charperf.h b/icuSources/test/perf/charperf/charperf.h index a4442d6d..e144d12b 100644 --- a/icuSources/test/perf/charperf/charperf.h +++ b/icuSources/test/perf/charperf/charperf.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (c) 2002, International Business Machines +* Copyright (c) 2002-2003, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** ********************************************************************** @@ -13,6 +13,7 @@ #include <stdlib.h> #include <stdio.h> #include <wchar.h> +#include <wctype.h> typedef void (*CharPerfFn)(UChar32 ch); typedef void (*StdLibCharPerfFn)(wchar_t ch); @@ -234,4 +235,4 @@ inline void StdLibIsWhiteSpace(wchar_t ch) iswspace(ch); } -#endif // CHARPERF_H \ No newline at end of file +#endif // CHARPERF_H diff --git a/icuSources/test/perf/convperf/convperf.cpp b/icuSources/test/perf/convperf/convperf.cpp new file mode 100644 index 00000000..a663857b --- /dev/null +++ b/icuSources/test/perf/convperf/convperf.cpp @@ -0,0 +1,653 @@ +/* +********************************************************************** +* Copyright (c) 2002-2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +********************************************************************** +*/ +/** + * This Program tests the performance of ICU's Normalization engine against Windows + * to run it use the command like + * + * c:\normperf.exe -s C:\work\ICUCupertinoRep\icu4c\collation-perf-data -i 10 -p 15 -f TestNames_Asian.txt -u -e UTF-8 -l + */ +#include "convperf.h" +#include "data.h" + +int main(int argc, const char* argv[]){ + UErrorCode status = U_ZERO_ERROR; + ConverterPerformanceTest test(argc, argv, status); + if(U_FAILURE(status)){ + return status; + } + if(test.run()==FALSE){ + fprintf(stderr,"FAILED: Tests could not be run please check the arguments.\n"); + return -1; + } + return 0; +} + + +ConverterPerformanceTest::ConverterPerformanceTest(int32_t argc, const char* argv[], UErrorCode& status) +: UPerfTest(argc,argv,status){ + +} + +ConverterPerformanceTest::~ConverterPerformanceTest(){ + +} + +UPerfFunction* ConverterPerformanceTest::runIndexedTest(int32_t index, UBool exec,const char* &name, char* par) { + switch (index) { + TESTCASE(0,TestICU_CleanOpenAllConverters);// This calls u_cleanup() + TESTCASE(1,TestICU_OpenAllConverters);// This doesn't call u_cleanup() + + TESTCASE(2,TestICU_UTF8_ToUnicode); + TESTCASE(3,TestICU_UTF8_FromUnicode); + TESTCASE(4,TestWinANSI_UTF8_ToUnicode); + TESTCASE(5,TestWinANSI_UTF8_FromUnicode); + TESTCASE(6,TestWinIML2_UTF8_ToUnicode); + TESTCASE(7,TestWinIML2_UTF8_FromUnicode); + + TESTCASE(8,TestICU_Latin1_ToUnicode); + TESTCASE(9,TestICU_Latin1_FromUnicode); + TESTCASE(10,TestWinIML2_Latin1_ToUnicode); + TESTCASE(11,TestWinIML2_Latin1_FromUnicode); + + TESTCASE(12,TestICU_Latin8_ToUnicode); + TESTCASE(13,TestICU_Latin8_FromUnicode); + TESTCASE(14,TestWinIML2_Latin8_ToUnicode); + TESTCASE(15,TestWinIML2_Latin8_FromUnicode); + + TESTCASE(16,TestICU_EBCDIC_Arabic_ToUnicode); + TESTCASE(17,TestICU_EBCDIC_Arabic_FromUnicode); + TESTCASE(18,TestWinIML2_EBCDIC_Arabic_ToUnicode); + TESTCASE(19,TestWinIML2_EBCDIC_Arabic_FromUnicode); + + TESTCASE(20,TestICU_SJIS_ToUnicode); + TESTCASE(21,TestICU_SJIS_FromUnicode); + TESTCASE(22,TestWinIML2_SJIS_ToUnicode); + TESTCASE(23,TestWinIML2_SJIS_FromUnicode); + + TESTCASE(24,TestICU_EUCJP_ToUnicode); + TESTCASE(25,TestICU_EUCJP_FromUnicode); + TESTCASE(26,TestWinIML2_EUCJP_ToUnicode); + TESTCASE(27,TestWinIML2_EUCJP_FromUnicode); + + TESTCASE(28,TestICU_GB2312_FromUnicode); + TESTCASE(29,TestICU_GB2312_ToUnicode); + TESTCASE(30,TestWinIML2_GB2312_ToUnicode); + TESTCASE(31,TestWinIML2_GB2312_FromUnicode); + + TESTCASE(32,TestICU_ISO2022KR_ToUnicode); + TESTCASE(33,TestICU_ISO2022KR_FromUnicode); + TESTCASE(34,TestWinIML2_ISO2022KR_ToUnicode); + TESTCASE(35,TestWinIML2_ISO2022KR_FromUnicode); + + TESTCASE(36,TestICU_ISO2022JP_ToUnicode); + TESTCASE(37,TestICU_ISO2022JP_FromUnicode); + TESTCASE(38,TestWinIML2_ISO2022JP_ToUnicode); + TESTCASE(39,TestWinIML2_ISO2022JP_FromUnicode); + + TESTCASE(40,TestWinANSI_Latin1_ToUnicode); + TESTCASE(41,TestWinANSI_Latin1_FromUnicode); + + TESTCASE(42,TestWinANSI_Latin8_ToUnicode); + TESTCASE(43,TestWinANSI_Latin8_FromUnicode); + + TESTCASE(44,TestWinANSI_SJIS_ToUnicode); + TESTCASE(45,TestWinANSI_SJIS_FromUnicode); + + TESTCASE(46,TestWinANSI_EUCJP_ToUnicode); + TESTCASE(47,TestWinANSI_EUCJP_FromUnicode); + + TESTCASE(48,TestWinANSI_GB2312_ToUnicode); + TESTCASE(49,TestWinANSI_GB2312_FromUnicode); + + TESTCASE(50,TestWinANSI_ISO2022KR_ToUnicode); + TESTCASE(51,TestWinANSI_ISO2022KR_FromUnicode); + + TESTCASE(52,TestWinANSI_ISO2022JP_ToUnicode); + TESTCASE(53,TestWinANSI_ISO2022JP_FromUnicode); + + default: + name = ""; + return NULL; + } + return NULL; + +} + +UPerfFunction* ConverterPerformanceTest::TestICU_CleanOpenAllConverters() { + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new ICUOpenAllConvertersFunction(TRUE, status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestICU_OpenAllConverters() { + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new ICUOpenAllConvertersFunction(FALSE, status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestICU_UTF8_FromUnicode(){ + UErrorCode status = U_ZERO_ERROR; + ICUFromUnicodePerfFunction* pf = new ICUFromUnicodePerfFunction("utf-8",utf8_uniSource, LENGTHOF(utf8_uniSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestICU_UTF8_ToUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new ICUToUnicodePerfFunction("utf-8",(char*)utf8_encSource, LENGTHOF(utf8_encSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + + +UPerfFunction* ConverterPerformanceTest::TestWinIML2_UTF8_FromUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinIMultiLanguage2FromUnicodePerfFunction("utf-8",utf8_uniSource, LENGTHOF(utf8_uniSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestWinIML2_UTF8_ToUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinIMultiLanguage2ToUnicodePerfFunction("utf-8",(char*)utf8_encSource, LENGTHOF(utf8_encSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestWinANSI_UTF8_FromUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinANSIFromUnicodePerfFunction("utf-8",utf8_uniSource, LENGTHOF(utf8_uniSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestWinANSI_UTF8_ToUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinANSIToUnicodePerfFunction("utf-8",(char*)utf8_encSource, LENGTHOF(utf8_encSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +//################ + +UPerfFunction* ConverterPerformanceTest::TestICU_Latin1_FromUnicode(){ + UErrorCode status = U_ZERO_ERROR; + ICUFromUnicodePerfFunction* pf = new ICUFromUnicodePerfFunction("iso-8859-1",latin1_uniSource, LENGTHOF(latin1_uniSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestICU_Latin1_ToUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new ICUToUnicodePerfFunction("iso-8859-1",(char*)latin1_encSource, LENGTHOF(latin1_encSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + + +UPerfFunction* ConverterPerformanceTest::TestWinIML2_Latin1_FromUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinIMultiLanguage2FromUnicodePerfFunction("iso-8859-1",latin1_uniSource, LENGTHOF(latin1_uniSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestWinIML2_Latin1_ToUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinIMultiLanguage2ToUnicodePerfFunction("iso-8859-1",(char*)latin1_encSource, LENGTHOF(latin1_encSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestWinANSI_Latin1_FromUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinANSIFromUnicodePerfFunction("iso-8859-1",latin1_uniSource, LENGTHOF(latin1_uniSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestWinANSI_Latin1_ToUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinANSIToUnicodePerfFunction("iso-8859-1",(char*)latin1_encSource, LENGTHOF(latin1_encSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +//################## + +UPerfFunction* ConverterPerformanceTest::TestICU_Latin8_FromUnicode(){ + UErrorCode status = U_ZERO_ERROR; + ICUFromUnicodePerfFunction* pf = new ICUFromUnicodePerfFunction("iso-8859-8",latin8_uniSource, LENGTHOF(latin8_uniSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestICU_Latin8_ToUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new ICUToUnicodePerfFunction("iso-8859-8",(char*)latin8_encSource, LENGTHOF(latin8_encSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + + +UPerfFunction* ConverterPerformanceTest::TestWinIML2_Latin8_FromUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinIMultiLanguage2FromUnicodePerfFunction("iso-8859-8",latin8_uniSource, LENGTHOF(latin8_uniSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestWinIML2_Latin8_ToUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinIMultiLanguage2ToUnicodePerfFunction("iso-8859-8",(char*)latin8_encSource, LENGTHOF(latin8_encSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} +UPerfFunction* ConverterPerformanceTest::TestWinANSI_Latin8_FromUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinANSIFromUnicodePerfFunction("iso-8859-8",latin8_uniSource, LENGTHOF(latin8_uniSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestWinANSI_Latin8_ToUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinANSIToUnicodePerfFunction("iso-8859-8",(char*)latin8_encSource, LENGTHOF(latin8_encSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +//################# + + +UPerfFunction* ConverterPerformanceTest::TestICU_EBCDIC_Arabic_FromUnicode(){ + UErrorCode status = U_ZERO_ERROR; + ICUFromUnicodePerfFunction* pf = new ICUFromUnicodePerfFunction("x-EBCDIC-Arabic",ebcdic_arabic_uniSource, LENGTHOF(ebcdic_arabic_uniSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestICU_EBCDIC_Arabic_ToUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new ICUToUnicodePerfFunction("x-EBCDIC-Arabic",(char*)ebcdic_arabic_encSource, LENGTHOF(ebcdic_arabic_encSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + + +UPerfFunction* ConverterPerformanceTest::TestWinIML2_EBCDIC_Arabic_FromUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinIMultiLanguage2FromUnicodePerfFunction("x-EBCDIC-Arabic",ebcdic_arabic_uniSource, LENGTHOF(ebcdic_arabic_uniSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestWinIML2_EBCDIC_Arabic_ToUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinIMultiLanguage2ToUnicodePerfFunction("x-EBCDIC-Arabic",(char*)ebcdic_arabic_encSource, LENGTHOF(ebcdic_arabic_encSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestWinANSI_EBCDIC_Arabic_FromUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinANSIFromUnicodePerfFunction("x-EBCDIC-Arabic",ebcdic_arabic_uniSource, LENGTHOF(ebcdic_arabic_uniSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestWinANSI_EBCDIC_Arabic_ToUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinANSIToUnicodePerfFunction("x-EBCDIC-Arabic",(char*)ebcdic_arabic_encSource, LENGTHOF(ebcdic_arabic_encSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} +//################# + + +UPerfFunction* ConverterPerformanceTest::TestICU_SJIS_FromUnicode(){ + UErrorCode status = U_ZERO_ERROR; + ICUFromUnicodePerfFunction* pf = new ICUFromUnicodePerfFunction("sjis",sjis_uniSource, LENGTHOF(sjis_uniSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestICU_SJIS_ToUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new ICUToUnicodePerfFunction("sjis",(char*)sjis_encSource, LENGTHOF(sjis_encSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + + +UPerfFunction* ConverterPerformanceTest::TestWinIML2_SJIS_FromUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinIMultiLanguage2FromUnicodePerfFunction("sjis",sjis_uniSource, LENGTHOF(sjis_uniSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestWinIML2_SJIS_ToUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinIMultiLanguage2ToUnicodePerfFunction("sjis",(char*)sjis_encSource, LENGTHOF(sjis_encSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestWinANSI_SJIS_FromUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinANSIFromUnicodePerfFunction("sjis",sjis_uniSource, LENGTHOF(sjis_uniSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestWinANSI_SJIS_ToUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinANSIToUnicodePerfFunction("sjis",(char*)sjis_encSource, LENGTHOF(sjis_encSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + + +//################# + + +UPerfFunction* ConverterPerformanceTest::TestICU_EUCJP_FromUnicode(){ + UErrorCode status = U_ZERO_ERROR; + ICUFromUnicodePerfFunction* pf = new ICUFromUnicodePerfFunction("euc-jp",eucjp_uniSource, LENGTHOF(eucjp_uniSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestICU_EUCJP_ToUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new ICUToUnicodePerfFunction("euc-jp",(char*)eucjp_encSource, LENGTHOF(eucjp_encSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + + +UPerfFunction* ConverterPerformanceTest::TestWinIML2_EUCJP_FromUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinIMultiLanguage2FromUnicodePerfFunction("euc-jp",eucjp_uniSource, LENGTHOF(eucjp_uniSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestWinIML2_EUCJP_ToUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinIMultiLanguage2ToUnicodePerfFunction("euc-jp",(char*)eucjp_encSource, LENGTHOF(eucjp_encSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestWinANSI_EUCJP_FromUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinANSIFromUnicodePerfFunction("euc-jp",eucjp_uniSource, LENGTHOF(eucjp_uniSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestWinANSI_EUCJP_ToUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinANSIToUnicodePerfFunction("euc-jp",(char*)eucjp_encSource, LENGTHOF(eucjp_encSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + + +//################# + + +UPerfFunction* ConverterPerformanceTest::TestICU_GB2312_FromUnicode(){ + UErrorCode status = U_ZERO_ERROR; + ICUFromUnicodePerfFunction* pf = new ICUFromUnicodePerfFunction("gb2312",gb2312_uniSource, LENGTHOF(gb2312_uniSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestICU_GB2312_ToUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new ICUToUnicodePerfFunction("gb2312",(char*)gb2312_encSource, LENGTHOF(gb2312_encSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + + +UPerfFunction* ConverterPerformanceTest::TestWinIML2_GB2312_FromUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinIMultiLanguage2FromUnicodePerfFunction("gb2312",gb2312_uniSource, LENGTHOF(gb2312_uniSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestWinIML2_GB2312_ToUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinIMultiLanguage2ToUnicodePerfFunction("gb2312",(char*)gb2312_encSource, LENGTHOF(gb2312_encSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestWinANSI_GB2312_FromUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinANSIFromUnicodePerfFunction("gb2312",gb2312_uniSource, LENGTHOF(gb2312_uniSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestWinANSI_GB2312_ToUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinANSIToUnicodePerfFunction("gb2312",(char*)gb2312_encSource, LENGTHOF(gb2312_encSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +//################# + + +UPerfFunction* ConverterPerformanceTest::TestICU_ISO2022KR_FromUnicode(){ + UErrorCode status = U_ZERO_ERROR; + ICUFromUnicodePerfFunction* pf = new ICUFromUnicodePerfFunction("iso-2022-kr",iso2022kr_uniSource, LENGTHOF(iso2022kr_uniSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestICU_ISO2022KR_ToUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new ICUToUnicodePerfFunction("iso-2022-kr",(char*)iso2022kr_encSource, LENGTHOF(iso2022kr_encSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + + +UPerfFunction* ConverterPerformanceTest::TestWinIML2_ISO2022KR_FromUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinIMultiLanguage2FromUnicodePerfFunction("iso-2022-kr",iso2022kr_uniSource, LENGTHOF(iso2022kr_uniSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestWinIML2_ISO2022KR_ToUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinIMultiLanguage2ToUnicodePerfFunction("iso-2022-kr",(char*)iso2022kr_encSource, LENGTHOF(iso2022kr_encSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestWinANSI_ISO2022KR_FromUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinANSIFromUnicodePerfFunction("iso-2022-kr",iso2022kr_uniSource, LENGTHOF(iso2022kr_uniSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestWinANSI_ISO2022KR_ToUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinANSIToUnicodePerfFunction("iso-2022-kr",(char*)iso2022kr_encSource, LENGTHOF(iso2022kr_encSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} +//################# + + +UPerfFunction* ConverterPerformanceTest::TestICU_ISO2022JP_FromUnicode(){ + UErrorCode status = U_ZERO_ERROR; + ICUFromUnicodePerfFunction* pf = new ICUFromUnicodePerfFunction("iso-2022-jp",iso2022jp_uniSource, LENGTHOF(iso2022jp_uniSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestICU_ISO2022JP_ToUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new ICUToUnicodePerfFunction("iso-2022-jp",(char*)iso2022jp_encSource, LENGTHOF(iso2022jp_encSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + + +UPerfFunction* ConverterPerformanceTest::TestWinIML2_ISO2022JP_FromUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinIMultiLanguage2FromUnicodePerfFunction("iso-2022-jp",iso2022jp_uniSource, LENGTHOF(iso2022jp_uniSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestWinIML2_ISO2022JP_ToUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinIMultiLanguage2ToUnicodePerfFunction("iso-2022-jp",(char*)iso2022jp_encSource, LENGTHOF(iso2022jp_encSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestWinANSI_ISO2022JP_FromUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinANSIFromUnicodePerfFunction("iso-2022-jp",iso2022jp_uniSource, LENGTHOF(iso2022jp_uniSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} + +UPerfFunction* ConverterPerformanceTest::TestWinANSI_ISO2022JP_ToUnicode(){ + UErrorCode status = U_ZERO_ERROR; + UPerfFunction* pf = new WinANSIToUnicodePerfFunction("iso-2022-jp",(char*)iso2022jp_encSource, LENGTHOF(iso2022jp_encSource), status); + if(U_FAILURE(status)){ + return NULL; + } + return pf; +} \ No newline at end of file diff --git a/icuSources/tools/genrb/genjp/genjp.dsp b/icuSources/test/perf/convperf/convperf.dsp similarity index 53% rename from icuSources/tools/genrb/genjp/genjp.dsp rename to icuSources/test/perf/convperf/convperf.dsp index cfcedc71..1c02213a 100644 --- a/icuSources/tools/genrb/genjp/genjp.dsp +++ b/icuSources/test/perf/convperf/convperf.dsp @@ -1,24 +1,24 @@ -# Microsoft Developer Studio Project File - Name="genjp" - Package Owner=<4> +# Microsoft Developer Studio Project File - Name="convperf" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 -CFG=genjp - Win32 Debug +CFG=convperf - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE -!MESSAGE NMAKE /f "genjp.mak". +!MESSAGE NMAKE /f "convperf.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE -!MESSAGE NMAKE /f "genjp.mak" CFG="genjp - Win32 Debug" +!MESSAGE NMAKE /f "convperf.mak" CFG="convperf - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE -!MESSAGE "genjp - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "genjp - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "convperf - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "convperf - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project @@ -28,7 +28,7 @@ CFG=genjp - Win32 Debug CPP=cl.exe RSC=rc.exe -!IF "$(CFG)" == "genjp - Win32 Release" +!IF "$(CFG)" == "convperf - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 @@ -41,18 +41,19 @@ RSC=rc.exe # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" +MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /W3 /GX /O2 /I "..\..\..\..\include" /I "..\..\..\common" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\..\..\include" /I "..\..\..\common" /I "..\..\..\i18n" /I "..\..\..\tools\toolutil" /I "C:\Program Files\Microsoft SDK\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 icuuc.lib icuin.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\..\..\lib" +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 icuuc.lib icuin.lib icutu.lib kernel32.lib user32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\..\..\lib\\" -!ELSEIF "$(CFG)" == "genjp - Win32 Debug" +!ELSEIF "$(CFG)" == "convperf - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 @@ -65,29 +66,30 @@ LINK32=link.exe # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\..\..\..\include" /I "..\..\..\common" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /GZ /c +MTL=midl.exe +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\..\..\include" /I "..\..\..\tools\ctestfw" /I "..\..\..\common" /I "..\..\..\i18n" /I "..\..\..\tools\toolutil" /I "C:\Program Files\Microsoft SDK\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 icuucd.lib icuind.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\..\lib" +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 icuucd.lib icuind.lib icutud.lib kernel32.lib user32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\..\lib\\" !ENDIF # Begin Target -# Name "genjp - Win32 Release" -# Name "genjp - Win32 Debug" +# Name "convperf - Win32 Release" +# Name "convperf - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File -SOURCE=.\genjp.cpp +SOURCE=.\convperf.cpp # End Source File # End Group # Begin Group "Header Files" @@ -95,7 +97,11 @@ SOURCE=.\genjp.cpp # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File -SOURCE=.\genjp.h +SOURCE=.\convperf.h +# End Source File +# Begin Source File + +SOURCE=.\data.h # End Source File # End Group # Begin Group "Resource Files" diff --git a/icuSources/test/perf/convperf/convperf.h b/icuSources/test/perf/convperf/convperf.h new file mode 100644 index 00000000..c8ad8170 --- /dev/null +++ b/icuSources/test/perf/convperf/convperf.h @@ -0,0 +1,566 @@ +/* +********************************************************************** +* Copyright (c) 2002-2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +********************************************************************** +*/ +#ifndef _CONVPERF_H +#define _CONVPERF_H + +#include "uperf.h" +#include "unicode/ucnv.h" +#include "unicode/uclean.h" +#include "unicode/ustring.h" +#include <mlang.h> +#include <objbase.h> + +#define CONVERSION_FLAGS (0) /*WC_DEFAULTCHAR WC_COMPOSITECHECK & WC_SEPCHARS*/ +#define MAX_BUF_SIZE 3048 +#define LENGTHOF(array) (sizeof(array)/sizeof((array)[0])) + +class ICUToUnicodePerfFunction : public UPerfFunction{ +private: + UConverter* conv; + const char* src; + int32_t srcLen; + UChar* target; + UChar* targetLimit; + +public: + ICUToUnicodePerfFunction(const char* name, const char* source, int32_t sourceLen, UErrorCode& status){ + conv = ucnv_open(name,&status); + src = source; + srcLen = sourceLen; + if(U_FAILURE(status)){ + conv = NULL; + return; + } + target = NULL; + targetLimit = NULL; + int32_t reqdLen = ucnv_toUChars(conv, target, 0, + source, srcLen, &status); + if(status==U_BUFFER_OVERFLOW_ERROR) { + status=U_ZERO_ERROR; + target=(UChar*)uprv_malloc((reqdLen) * U_SIZEOF_UCHAR*2); + targetLimit = target + reqdLen; + if(target == NULL){ + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + } + } + virtual void call(UErrorCode* status){ + const char* mySrc = src; + const char* sourceLimit = src + srcLen; + UChar* myTarget = target; + ucnv_toUnicode(conv, &myTarget, targetLimit, &mySrc, sourceLimit, NULL, TRUE, status); + } + virtual long getOperationsPerIteration(void){ + return srcLen; + } + ~ICUToUnicodePerfFunction(){ + uprv_free(target); + ucnv_close(conv); + } +}; +class ICUFromUnicodePerfFunction : public UPerfFunction{ +private: + UConverter* conv; + const UChar* src; + int32_t srcLen; + char* target; + char* targetLimit; + const char* name; + +public: + ICUFromUnicodePerfFunction(const char* name, const UChar* source, int32_t sourceLen, UErrorCode& status){ + conv = ucnv_open(name,&status); + src = source; + srcLen = sourceLen; + if(U_FAILURE(status)){ + conv = NULL; + return; + } + target = NULL; + targetLimit = NULL; + int32_t reqdLen = ucnv_fromUChars(conv, target, 0, + source, srcLen, &status); + if(status==U_BUFFER_OVERFLOW_ERROR) { + status=U_ZERO_ERROR; + target=(char*)uprv_malloc((reqdLen*2)); + targetLimit = target + reqdLen; + if(target == NULL){ + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + } + } + virtual void call(UErrorCode* status){ + const UChar* mySrc = src; + const UChar* sourceLimit = src + srcLen; + char* myTarget = target; + ucnv_fromUnicode(conv,&myTarget, targetLimit, &mySrc, sourceLimit, NULL, TRUE, status); + } + virtual long getOperationsPerIteration(void){ + return srcLen; + } + ~ICUFromUnicodePerfFunction(){ + uprv_free(target); + ucnv_close(conv); + } +}; + +class ICUOpenAllConvertersFunction : public UPerfFunction{ +private: + UBool cleanup; + int32_t availableConverters; + const char **convNames; +public: + ICUOpenAllConvertersFunction(UBool callCleanup, UErrorCode& status){ + int32_t idx; + cleanup = callCleanup; + availableConverters = ucnv_countAvailable(); + convNames = new const char *[availableConverters]; + for (idx = 0; idx < availableConverters; idx++) { + convNames[idx] = ucnv_getAvailableName(idx); + } + } + virtual void call(UErrorCode* status){ + int32_t idx; + if (cleanup) { + u_cleanup(); + } + for (idx = 0; idx < availableConverters; idx++) { + ucnv_close(ucnv_open(convNames[idx], status)); + } + } + virtual long getOperationsPerIteration(void){ + return availableConverters; + } + ~ICUOpenAllConvertersFunction(){ + delete []convNames; + } +}; + +class WinANSIToUnicodePerfFunction : public UPerfFunction{ + +private: + DWORD uiCodePage; + char* src; + UINT srcLen; + WCHAR dest[MAX_BUF_SIZE]; + UINT dstLen; + const char* name; +public: + WinANSIToUnicodePerfFunction(const char* cpName, char* pszIn,UINT szLen, UErrorCode& status){ + name = cpName; + src = pszIn; + srcLen = szLen; + dstLen = LENGTHOF(dest); + unsigned short bEnc[30]={'\0'}; + const char* tenc=name; + for(int i=0;*tenc!='\0';i++){ + bEnc[i]=*tenc; + tenc++; + } + LPMULTILANGUAGE2 pMulti; + + CoInitialize(NULL); + + /* create instance of converter object*/ + CoCreateInstance( + __uuidof(CMultiLanguage), + NULL, + CLSCTX_SERVER, + __uuidof(IMultiLanguage2), + (void**)&pMulti + ); + + + + MIMECSETINFO mimeInfo; + + mimeInfo.uiCodePage = 0; + mimeInfo.uiInternetEncoding =0; + /* get the charset info */ + pMulti->GetCharsetInfo(bEnc,&mimeInfo); + uiCodePage = (mimeInfo.uiInternetEncoding==0)?mimeInfo.uiCodePage:mimeInfo.uiInternetEncoding; + } + virtual void call(UErrorCode* status){ + int winSize =MultiByteToWideChar(uiCodePage,CONVERSION_FLAGS,src,srcLen,dest,dstLen); + } + virtual long getOperationsPerIteration(void){ + return srcLen; + } +}; + +class WinANSIFromUnicodePerfFunction : public UPerfFunction{ + +private: + DWORD uiCodePage; + WCHAR* src; + UINT srcLen; + char dest[MAX_BUF_SIZE]; + UINT dstLen; + const char* name; + BOOL lpUsedDefaultChar; + +public: + WinANSIFromUnicodePerfFunction(const char* cpName, WCHAR* pszIn,UINT szLen, UErrorCode& status){ + name = cpName; + src = pszIn; + srcLen = szLen; + dstLen = LENGTHOF(dest); + lpUsedDefaultChar=FALSE; + unsigned short bEnc[30]={'\0'}; + const char* tenc=name; + for(int i=0;*tenc!='\0';i++){ + bEnc[i]=*tenc; + tenc++; + } + LPMULTILANGUAGE2 pMulti; + + CoInitialize(NULL); + + /* create instance of converter object*/ + CoCreateInstance( + __uuidof(CMultiLanguage), + NULL, + CLSCTX_SERVER, + __uuidof(IMultiLanguage2), + (void**)&pMulti + ); + + + + MIMECSETINFO mimeInfo; + mimeInfo.uiCodePage = 0; + mimeInfo.uiInternetEncoding =0; + /* get the charset info */ + pMulti->GetCharsetInfo(bEnc,&mimeInfo); + uiCodePage = (mimeInfo.uiInternetEncoding==0)?mimeInfo.uiCodePage:mimeInfo.uiInternetEncoding; + } + virtual void call(UErrorCode* status){ + BOOL* pUsedDefaultChar =(uiCodePage==CP_UTF8)?NULL:&lpUsedDefaultChar; + int winSize = WideCharToMultiByte(uiCodePage,CONVERSION_FLAGS,src,srcLen,dest,dstLen,NULL, pUsedDefaultChar); + } + virtual long getOperationsPerIteration(void){ + return srcLen; + } +}; +static inline void getErr(HRESULT err, UErrorCode& status){ + + switch (err){ + + case S_OK: + //printf("Operation %s successful\n",operation); + break; + case S_FALSE: + status = U_INTERNAL_PROGRAM_ERROR; + break; + case E_FAIL: + status = U_ILLEGAL_CHAR_FOUND; + } +} +class WinIMultiLanguageToUnicodePerfFunction : public UPerfFunction{ + +private: + LPMULTILANGUAGE2 pMulti; + LPMLANGCONVERTCHARSET pConvToUni; + char* src; + UINT srcLen; + WCHAR dst[MAX_BUF_SIZE]; + UINT dstLen; + const char* cpName; + +public: + WinIMultiLanguageToUnicodePerfFunction(const char* name,char* source, UINT sourceLen, UErrorCode& status){ + + CoInitialize(NULL); + + /* create instance of converter object*/ + CoCreateInstance( + __uuidof(CMultiLanguage), + NULL, + CLSCTX_SERVER, + __uuidof(IMultiLanguage2), + (void**)&pMulti + ); + + + + MIMECSETINFO mimeInfo; + mimeInfo.uiCodePage = 0; + mimeInfo.uiInternetEncoding =0; + HRESULT err=S_OK; + unsigned short bEnc[30]={'\0'}; + const char* tenc=name; + for(int i=0;*tenc!='\0';i++){ + bEnc[i]=*tenc; + tenc++; + } + /* get the charset info */ + pMulti->GetCharsetInfo(bEnc,&mimeInfo); + pMulti->CreateConvertCharset(mimeInfo.uiCodePage, 1200 /*unicode*/, (DWORD)0,&pConvToUni); + getErr(err,status); + src = source; + srcLen = sourceLen; + dstLen = LENGTHOF(dst); + cpName = name; + } + + virtual void call(UErrorCode* status){ + HRESULT err= pConvToUni->DoConversionToUnicode(src,&srcLen,dst, &dstLen); + getErr(err,*status); + } + virtual long getOperationsPerIteration(void){ + return srcLen; + } +}; + +class WinIMultiLanguageFromUnicodePerfFunction : public UPerfFunction{ + +private: + LPMULTILANGUAGE2 pMulti; + LPMLANGCONVERTCHARSET pConvFromUni; + WCHAR* src; + UINT srcLen; + char dst[MAX_BUF_SIZE]; + UINT dstLen; + const char* cpName; + +public: + WinIMultiLanguageFromUnicodePerfFunction(const char* name,WCHAR* source, UINT sourceLen, UErrorCode& status){ + + CoInitialize(NULL); + + /* create instance of converter object*/ + CoCreateInstance( + __uuidof(CMultiLanguage), + NULL, + CLSCTX_SERVER, + __uuidof(IMultiLanguage2), + (void**)&pMulti + ); + + + + MIMECSETINFO mimeInfo; + mimeInfo.uiCodePage = 0; + mimeInfo.uiInternetEncoding =0; + HRESULT err=S_OK; + unsigned short bEnc[30]={'\0'}; + const char* tenc=name; + for(int i=0;*tenc!='\0';i++){ + bEnc[i]=*tenc; + tenc++; + } + /* get the charset info */ + pMulti->GetCharsetInfo(bEnc,&mimeInfo); + pMulti->CreateConvertCharset(1200 /*unicode*/, mimeInfo.uiCodePage, (DWORD)0,&pConvFromUni); + getErr(err,status); + src = source; + srcLen = sourceLen; + dstLen = LENGTHOF(dst); + cpName = name; + + } + + virtual void call(UErrorCode* status){ + HRESULT err= pConvFromUni->DoConversionFromUnicode(src,&srcLen,dst, &dstLen); + getErr(err,*status); + } + virtual long getOperationsPerIteration(void){ + return srcLen; + } +}; + +class WinIMultiLanguage2ToUnicodePerfFunction : public UPerfFunction{ + +private: + LPMULTILANGUAGE2 pMulti; + char* src; + UINT srcLen; + WCHAR dst[MAX_BUF_SIZE]; + UINT dstLen; + const char* cpName; + DWORD dwEnc; +public: + WinIMultiLanguage2ToUnicodePerfFunction(const char* name,char* source, UINT sourceLen, UErrorCode& status){ + + CoInitialize(NULL); + + /* create instance of converter object*/ + CoCreateInstance( + __uuidof(CMultiLanguage), + NULL, + CLSCTX_SERVER, + __uuidof(IMultiLanguage2), + (void**)&pMulti + ); + + src = source; + srcLen = sourceLen; + dstLen = LENGTHOF(dst); + cpName = name; + unsigned short bEnc[30]={'\0'}; + const char* tenc=name; + for(int i=0;*tenc!='\0';i++){ + bEnc[i]=*tenc; + tenc++; + } + /* get the charset info */ + MIMECSETINFO mimeInfo; + mimeInfo.uiCodePage = 0; + mimeInfo.uiInternetEncoding =0; + pMulti->GetCharsetInfo(bEnc,&mimeInfo); + dwEnc = (mimeInfo.uiInternetEncoding==0)?mimeInfo.uiCodePage:mimeInfo.uiInternetEncoding; + } + + virtual void call(UErrorCode* status){ + DWORD dwMode=0; + HRESULT err= pMulti->ConvertStringToUnicode(&dwMode,dwEnc,(char*)src,&srcLen,dst, &dstLen); + getErr(err,*status); + } + virtual long getOperationsPerIteration(void){ + return srcLen; + } +}; + +class WinIMultiLanguage2FromUnicodePerfFunction : public UPerfFunction{ + +private: + LPMULTILANGUAGE2 pMulti; + LPMLANGCONVERTCHARSET pConvFromUni; + WCHAR* src; + UINT srcLen; + char dst[MAX_BUF_SIZE]; + UINT dstLen; + const char* cpName; + DWORD dwEnc; + +public: + WinIMultiLanguage2FromUnicodePerfFunction(const char* name,WCHAR* source, UINT sourceLen, UErrorCode& status){ + + CoInitialize(NULL); + + /* create instance of converter object*/ + CoCreateInstance( + __uuidof(CMultiLanguage), + NULL, + CLSCTX_SERVER, + __uuidof(IMultiLanguage2), + (void**)&pMulti + ); + + + unsigned short bEnc[30]={'\0'}; + const char* tenc=name; + for(int i=0;*tenc!='\0';i++){ + bEnc[i]=*tenc; + tenc++; + } + src = source; + srcLen = sourceLen; + dstLen = LENGTHOF(dst); + cpName = name; + /* get the charset info */ + MIMECSETINFO mimeInfo; + mimeInfo.uiCodePage = 0; + mimeInfo.uiInternetEncoding =0; + + pMulti->GetCharsetInfo(bEnc,&mimeInfo); + dwEnc = (mimeInfo.uiInternetEncoding==0)?mimeInfo.uiCodePage:mimeInfo.uiInternetEncoding; + } + + virtual void call(UErrorCode* status){ + DWORD dwMode=0; + HRESULT err= pMulti->ConvertStringFromUnicode(&dwMode,dwEnc,src,&srcLen,dst, &dstLen); + getErr(err,*status); + } + virtual long getOperationsPerIteration(void){ + return srcLen; + } +}; + +class ConverterPerformanceTest : public UPerfTest{ + +public: + + ConverterPerformanceTest(int32_t argc, const char* argv[], UErrorCode& status); + ~ConverterPerformanceTest(); + virtual UPerfFunction* runIndexedTest(int32_t index, UBool exec,const char* &name, char* par = NULL); + + UPerfFunction* TestICU_CleanOpenAllConverters(); + UPerfFunction* TestICU_OpenAllConverters(); + + UPerfFunction* TestICU_UTF8_ToUnicode(); + UPerfFunction* TestICU_UTF8_FromUnicode(); + UPerfFunction* TestWinANSI_UTF8_ToUnicode(); + UPerfFunction* TestWinANSI_UTF8_FromUnicode(); + UPerfFunction* TestWinIML2_UTF8_ToUnicode(); + UPerfFunction* TestWinIML2_UTF8_FromUnicode(); + + UPerfFunction* TestICU_Latin1_ToUnicode(); + UPerfFunction* TestICU_Latin1_FromUnicode(); + UPerfFunction* TestWinANSI_Latin1_ToUnicode(); + UPerfFunction* TestWinANSI_Latin1_FromUnicode(); + UPerfFunction* TestWinIML2_Latin1_ToUnicode(); + UPerfFunction* TestWinIML2_Latin1_FromUnicode(); + + UPerfFunction* TestICU_EBCDIC_Arabic_ToUnicode(); + UPerfFunction* TestICU_EBCDIC_Arabic_FromUnicode(); + UPerfFunction* TestWinANSI_EBCDIC_Arabic_ToUnicode(); + UPerfFunction* TestWinANSI_EBCDIC_Arabic_FromUnicode(); + UPerfFunction* TestWinIML2_EBCDIC_Arabic_ToUnicode(); + UPerfFunction* TestWinIML2_EBCDIC_Arabic_FromUnicode(); + + UPerfFunction* TestICU_Latin8_ToUnicode(); + UPerfFunction* TestICU_Latin8_FromUnicode(); + UPerfFunction* TestWinANSI_Latin8_ToUnicode(); + UPerfFunction* TestWinANSI_Latin8_FromUnicode(); + UPerfFunction* TestWinIML2_Latin8_ToUnicode(); + UPerfFunction* TestWinIML2_Latin8_FromUnicode(); + + + UPerfFunction* TestICU_SJIS_ToUnicode(); + UPerfFunction* TestICU_SJIS_FromUnicode(); + UPerfFunction* TestWinANSI_SJIS_ToUnicode(); + UPerfFunction* TestWinANSI_SJIS_FromUnicode(); + UPerfFunction* TestWinIML2_SJIS_ToUnicode(); + UPerfFunction* TestWinIML2_SJIS_FromUnicode(); + + UPerfFunction* TestICU_EUCJP_ToUnicode(); + UPerfFunction* TestICU_EUCJP_FromUnicode(); + UPerfFunction* TestWinANSI_EUCJP_ToUnicode(); + UPerfFunction* TestWinANSI_EUCJP_FromUnicode(); + UPerfFunction* TestWinIML2_EUCJP_ToUnicode(); + UPerfFunction* TestWinIML2_EUCJP_FromUnicode(); + + UPerfFunction* TestICU_GB2312_ToUnicode(); + UPerfFunction* TestICU_GB2312_FromUnicode(); + UPerfFunction* TestWinANSI_GB2312_ToUnicode(); + UPerfFunction* TestWinANSI_GB2312_FromUnicode(); + UPerfFunction* TestWinIML2_GB2312_ToUnicode(); + UPerfFunction* TestWinIML2_GB2312_FromUnicode(); + + + UPerfFunction* TestICU_ISO2022KR_ToUnicode(); + UPerfFunction* TestICU_ISO2022KR_FromUnicode(); + UPerfFunction* TestWinANSI_ISO2022KR_ToUnicode(); + UPerfFunction* TestWinANSI_ISO2022KR_FromUnicode(); + UPerfFunction* TestWinIML2_ISO2022KR_ToUnicode(); + UPerfFunction* TestWinIML2_ISO2022KR_FromUnicode(); + + UPerfFunction* TestICU_ISO2022JP_ToUnicode(); + UPerfFunction* TestICU_ISO2022JP_FromUnicode(); + UPerfFunction* TestWinANSI_ISO2022JP_ToUnicode(); + UPerfFunction* TestWinANSI_ISO2022JP_FromUnicode(); + UPerfFunction* TestWinIML2_ISO2022JP_ToUnicode(); + UPerfFunction* TestWinIML2_ISO2022JP_FromUnicode(); + +}; + +#endif + diff --git a/icuSources/test/perf/convperf/convperf_ansi.pl b/icuSources/test/perf/convperf/convperf_ansi.pl new file mode 100644 index 00000000..691a21f6 --- /dev/null +++ b/icuSources/test/perf/convperf/convperf_ansi.pl @@ -0,0 +1,49 @@ +#!/usr/bin/perl -w +# ******************************************************************** +# * COPYRIGHT: +# * Copyright (c) 2002-2003, International Business Machines Corporation and +# * others. All Rights Reserved. +# ******************************************************************** + +use strict; + +use lib '../perldriver'; + +use PerfFramework; + + +my $options = { + "title"=>"Conversion Performance: ICU 2.6 vs. Windows2000 ANSI Interface", + "headers"=>"Windows2000(IMultiLanguage2) ICU", + "operationIs"=>"code point", + "passes"=>"10", + "time"=>"5", + #"outputType"=>"HTML", + "dataDir"=>"c:/src/perf/data", + "outputDir"=>"../results" + }; + +# programs +# tests will be done for all the programs. Results will be stored and connected +my $p = "release/convperf.exe"; + +my $tests = { + "UTF-8 From Unicode", ["$p TestWinANSI_UTF8_FromUnicode" , "$p TestICU_UTF8_FromUnicode" ], + "UTF-8 To Unicode", ["$p TestWinANSI_UTF8_ToUnicode" , "$p TestICU_UTF8_ToUnicode" ], + #### + "ISO-8859-1 From Unicode", ["$p TestWinANSI_Latin1_FromUnicode" , "$p TestICU_Latin1_FromUnicode" ], + "ISO-8859-1 To Unicode", ["$p TestWinANSI_Latin1_ToUnicode" , "$p TestICU_Latin1_ToUnicode" ], + #### + "Shift-JIS From Unicode", ["$p TestWinANSI_SJIS_FromUnicode" , "$p TestICU_SJIS_FromUnicode" ], + "Shift-JIS To Unicode", ["$p TestWinANSI_SJIS_ToUnicode" , "$p TestICU_SJIS_ToUnicode" ], + #### + "EUC-JP From Unicode", ["$p TestWinANSI_EUCJP_FromUnicode" , "$p TestICU_EUCJP_FromUnicode" ], + "EUC-JP To Unicode", ["$p TestWinANSI_EUCJP_ToUnicode" , "$p TestICU_EUCJP_ToUnicode" ], + #### + "GB2312 From Unicode", ["$p TestWinANSI_GB2312_FromUnicode" , "$p TestICU_GB2312_FromUnicode" ], + "GB2312 To Unicode", ["$p TestWinANSI_GB2312_ToUnicode" , "$p TestICU_GB2312_ToUnicode" ], + }; + +my $dataFiles = ""; + +runTests($options, $tests, $dataFiles); diff --git a/icuSources/test/perf/convperf/convperf_iml.pl b/icuSources/test/perf/convperf/convperf_iml.pl new file mode 100644 index 00000000..194a1cce --- /dev/null +++ b/icuSources/test/perf/convperf/convperf_iml.pl @@ -0,0 +1,55 @@ +#!/usr/bin/perl -w +# ******************************************************************** +# * COPYRIGHT: +# * Copyright (c) 2002-2003, International Business Machines Corporation and +# * others. All Rights Reserved. +# ******************************************************************** + +use strict; + +use lib '../perldriver'; + +use PerfFramework; + + +my $options = { + "title"=>"Conversion Performance: ICU 2.6 vs. Windows2000 IMultiLanguage Interface", + "headers"=>"Windows2000(IMultiLanguage2) ICU", + "operationIs"=>"code point", + "passes"=>"10", + "time"=>"5", + #"outputType"=>"HTML", + "dataDir"=>"c:/src/perf/data", + "outputDir"=>"../results" + }; + +# programs +# tests will be done for all the programs. Results will be stored and connected +my $p = "release/convperf.exe"; + +my $tests = { + "UTF-8 From Unicode", ["$p TestWinIML2_UTF8_FromUnicode" , "$p TestICU_UTF8_FromUnicode" ], + "UTF-8 To Unicode", ["$p TestWinIML2_UTF8_ToUnicode" , "$p TestICU_UTF8_ToUnicode" ], + #### + "ISO-8859-1 From Unicode", ["$p TestWinIML2_Latin1_FromUnicode" , "$p TestICU_Latin1_FromUnicode" ], + "ISO-8859-1 To Unicode", ["$p TestWinIML2_Latin1_ToUnicode" , "$p TestICU_Latin1_ToUnicode" ], + #### + "Shift-JIS From Unicode", ["$p TestWinIML2_SJIS_FromUnicode" , "$p TestICU_SJIS_FromUnicode" ], + "Shift-JIS To Unicode", ["$p TestWinIML2_SJIS_ToUnicode" , "$p TestICU_SJIS_ToUnicode" ], + #### + "EUC-JP From Unicode", ["$p TestWinIML2_EUCJP_FromUnicode" , "$p TestICU_EUCJP_FromUnicode" ], + "EUC-JP To Unicode", ["$p TestWinIML2_EUCJP_ToUnicode" , "$p TestICU_EUCJP_ToUnicode" ], + #### + "GB2312 From Unicode", ["$p TestWinIML2_GB2312_FromUnicode" , "$p TestICU_GB2312_FromUnicode" ], + "GB2312 To Unicode", ["$p TestWinIML2_GB2312_ToUnicode" , "$p TestICU_GB2312_ToUnicode" ], + #### + "ISO2022KR From Unicode", ["$p TestWinIML2_ISO2022KR_FromUnicode", "$p TestICU_ISO2022KR_FromUnicode" ], + "ISO2022KR To Unicode", ["$p TestWinIML2_ISO2022KR_ToUnicode" , "$p TestICU_ISO2022KR_ToUnicode" ], + #### + "ISO2022JP From Unicode", ["$p TestWinIML2_ISO2022JP_FromUnicode", "$p TestICU_ISO2022JP_FromUnicode" ], + "ISO2022JP To Unicode", ["$p TestWinIML2_ISO2022JP_ToUnicode" , "$p TestICU_ISO2022JP_ToUnicode" ], + }; + +my $dataFiles = ""; + +runTests($options, $tests, $dataFiles); diff --git a/icuSources/test/perf/convperf/data.h b/icuSources/test/perf/convperf/data.h new file mode 100644 index 00000000..e80be75c --- /dev/null +++ b/icuSources/test/perf/convperf/data.h @@ -0,0 +1,2731 @@ +/* +********************************************************************** +* Copyright (c) 2002-2003,International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +********************************************************************** +*/ +#ifndef _DATA_H +#define _DATA_H + +char iso2022jp_encSource[]={ + 0x1B,0x24,0x42,0x21,0x21,0x21,0x22,0x21,0x23,0x1B,0x28,0x42,0x20,0x1B,0x24,0x42,0x21,0x25,0x21,0x26, + 0x21,0x27,0x21,0x28,0x1B,0x28,0x42,0x0D,0x0A,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x0D,0x0A,0x1B, + 0x24,0x42,0x21,0x29,0x21,0x2A,0x21,0x2B,0x21,0x2C,0x21,0x2D,0x21,0x2E,0x21,0x2F,0x21,0x30,0x1B,0x28, + 0x42,0x0D,0x0A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x0D,0x0A,0x1B,0x24,0x42,0x21,0x31,0x21,0x32, + 0x21,0x33,0x21,0x34,0x21,0x35,0x21,0x36,0x21,0x37,0x21,0x38,0x1B,0x28,0x42,0x0D,0x0A,0x1B,0x24,0x42, + 0x21,0x39,0x21,0x3A,0x21,0x3B,0x21,0x3C,0x21,0x3D,0x21,0x3E,0x21,0x3F,0x1B,0x28,0x42,0x5C,0x0D,0x0A, + 0x1B,0x24,0x42,0x21,0x43,0x21,0x44,0x21,0x45,0x21,0x46,0x21,0x47,0x21,0x48,0x1B,0x28,0x42,0x0D,0x0A, + 0x1B,0x24,0x42,0x21,0x49,0x21,0x4A,0x21,0x4B,0x21,0x4C,0x25,0x2A,0x25,0x2B,0x25,0x2D,0x25,0x2F,0x1B, + 0x28,0x42,0x0D,0x0A,0x1B,0x24,0x42,0x25,0x31,0x25,0x33,0x25,0x35,0x25,0x37,0x25,0x39,0x25,0x3B,0x25, + 0x3D,0x25,0x3F,0x1B,0x28,0x42,0x0D,0x0A,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x0D,0x0A,0x1B,0x24, + 0x42,0x25,0x41,0x25,0x44,0x25,0x46,0x25,0x48,0x25,0x4A,0x25,0x4B,0x25,0x4C,0x25,0x4D,0x1B,0x28,0x42, + 0x0D,0x0A,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x0D,0x0A,0x1B,0x24,0x42,0x25,0x4E,0x25,0x4F,0x25, + 0x52,0x1B,0x28,0x42,0x20,0x1B,0x24,0x42,0x25,0x58,0x25,0x5B,0x25,0x5E,0x25,0x5F,0x1B,0x28,0x42,0x0D, + 0x0A,0x1B,0x24,0x42,0x25,0x60,0x25,0x61,0x25,0x62,0x25,0x64,0x25,0x66,0x25,0x68,0x25,0x69,0x25,0x6A, + 0x1B,0x28,0x42,0x0D,0x0A, + /**/ + 0x1B,0x24,0x42,0x21,0x21,0x21,0x22,0x21,0x23,0x1B,0x28,0x42,0x20,0x1B,0x24,0x42,0x21,0x25,0x21,0x26, + 0x21,0x27,0x21,0x28,0x1B,0x28,0x42,0x0D,0x0A,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x0D,0x0A,0x1B, + 0x24,0x42,0x21,0x29,0x21,0x2A,0x21,0x2B,0x21,0x2C,0x21,0x2D,0x21,0x2E,0x21,0x2F,0x21,0x30,0x1B,0x28, + 0x42,0x0D,0x0A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x0D,0x0A,0x1B,0x24,0x42,0x21,0x31,0x21,0x32, + 0x21,0x33,0x21,0x34,0x21,0x35,0x21,0x36,0x21,0x37,0x21,0x38,0x1B,0x28,0x42,0x0D,0x0A,0x1B,0x24,0x42, + 0x21,0x39,0x21,0x3A,0x21,0x3B,0x21,0x3C,0x21,0x3D,0x21,0x3E,0x21,0x3F,0x1B,0x28,0x42,0x5C,0x0D,0x0A, + 0x1B,0x24,0x42,0x21,0x43,0x21,0x44,0x21,0x45,0x21,0x46,0x21,0x47,0x21,0x48,0x1B,0x28,0x42,0x0D,0x0A, + 0x1B,0x24,0x42,0x21,0x49,0x21,0x4A,0x21,0x4B,0x21,0x4C,0x25,0x2A,0x25,0x2B,0x25,0x2D,0x25,0x2F,0x1B, + 0x28,0x42,0x0D,0x0A,0x1B,0x24,0x42,0x25,0x31,0x25,0x33,0x25,0x35,0x25,0x37,0x25,0x39,0x25,0x3B,0x25, + 0x3D,0x25,0x3F,0x1B,0x28,0x42,0x0D,0x0A,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x0D,0x0A,0x1B,0x24, + 0x42,0x25,0x41,0x25,0x44,0x25,0x46,0x25,0x48,0x25,0x4A,0x25,0x4B,0x25,0x4C,0x25,0x4D,0x1B,0x28,0x42, + 0x0D,0x0A,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x0D,0x0A,0x1B,0x24,0x42,0x25,0x4E,0x25,0x4F,0x25, + 0x52,0x1B,0x28,0x42,0x20,0x1B,0x24,0x42,0x25,0x58,0x25,0x5B,0x25,0x5E,0x25,0x5F,0x1B,0x28,0x42,0x0D, + 0x0A,0x1B,0x24,0x42,0x25,0x60,0x25,0x61,0x25,0x62,0x25,0x64,0x25,0x66,0x25,0x68,0x25,0x69,0x25,0x6A, + 0x1B,0x28,0x42,0x0D,0x0A, + /**/ + 0x1B,0x24,0x42,0x21,0x21,0x21,0x22,0x21,0x23,0x1B,0x28,0x42,0x20,0x1B,0x24,0x42,0x21,0x25,0x21,0x26, + 0x21,0x27,0x21,0x28,0x1B,0x28,0x42,0x0D,0x0A,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x0D,0x0A,0x1B, + 0x24,0x42,0x21,0x29,0x21,0x2A,0x21,0x2B,0x21,0x2C,0x21,0x2D,0x21,0x2E,0x21,0x2F,0x21,0x30,0x1B,0x28, + 0x42,0x0D,0x0A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x0D,0x0A,0x1B,0x24,0x42,0x21,0x31,0x21,0x32, + 0x21,0x33,0x21,0x34,0x21,0x35,0x21,0x36,0x21,0x37,0x21,0x38,0x1B,0x28,0x42,0x0D,0x0A,0x1B,0x24,0x42, + 0x21,0x39,0x21,0x3A,0x21,0x3B,0x21,0x3C,0x21,0x3D,0x21,0x3E,0x21,0x3F,0x1B,0x28,0x42,0x5C,0x0D,0x0A, + 0x1B,0x24,0x42,0x21,0x43,0x21,0x44,0x21,0x45,0x21,0x46,0x21,0x47,0x21,0x48,0x1B,0x28,0x42,0x0D,0x0A, + 0x1B,0x24,0x42,0x21,0x49,0x21,0x4A,0x21,0x4B,0x21,0x4C,0x25,0x2A,0x25,0x2B,0x25,0x2D,0x25,0x2F,0x1B, + 0x28,0x42,0x0D,0x0A,0x1B,0x24,0x42,0x25,0x31,0x25,0x33,0x25,0x35,0x25,0x37,0x25,0x39,0x25,0x3B,0x25, + 0x3D,0x25,0x3F,0x1B,0x28,0x42,0x0D,0x0A,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x0D,0x0A,0x1B,0x24, + 0x42,0x25,0x41,0x25,0x44,0x25,0x46,0x25,0x48,0x25,0x4A,0x25,0x4B,0x25,0x4C,0x25,0x4D,0x1B,0x28,0x42, + 0x0D,0x0A,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x0D,0x0A,0x1B,0x24,0x42,0x25,0x4E,0x25,0x4F,0x25, + 0x52,0x1B,0x28,0x42,0x20,0x1B,0x24,0x42,0x25,0x58,0x25,0x5B,0x25,0x5E,0x25,0x5F,0x1B,0x28,0x42,0x0D, + 0x0A,0x1B,0x24,0x42,0x25,0x60,0x25,0x61,0x25,0x62,0x25,0x64,0x25,0x66,0x25,0x68,0x25,0x69,0x25,0x6A, + 0x1B,0x28,0x42,0x0D,0x0A, + /**/ + 0x1B,0x24,0x42,0x21,0x21,0x21,0x22,0x21,0x23,0x1B,0x28,0x42,0x20,0x1B,0x24,0x42,0x21,0x25,0x21,0x26, + 0x21,0x27,0x21,0x28,0x1B,0x28,0x42,0x0D,0x0A,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x0D,0x0A,0x1B, + 0x24,0x42,0x21,0x29,0x21,0x2A,0x21,0x2B,0x21,0x2C,0x21,0x2D,0x21,0x2E,0x21,0x2F,0x21,0x30,0x1B,0x28, + 0x42,0x0D,0x0A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x0D,0x0A,0x1B,0x24,0x42,0x21,0x31,0x21,0x32, + 0x21,0x33,0x21,0x34,0x21,0x35,0x21,0x36,0x21,0x37,0x21,0x38,0x1B,0x28,0x42,0x0D,0x0A,0x1B,0x24,0x42, + 0x21,0x39,0x21,0x3A,0x21,0x3B,0x21,0x3C,0x21,0x3D,0x21,0x3E,0x21,0x3F,0x1B,0x28,0x42,0x5C,0x0D,0x0A, + 0x1B,0x24,0x42,0x21,0x43,0x21,0x44,0x21,0x45,0x21,0x46,0x21,0x47,0x21,0x48,0x1B,0x28,0x42,0x0D,0x0A, + 0x1B,0x24,0x42,0x21,0x49,0x21,0x4A,0x21,0x4B,0x21,0x4C,0x25,0x2A,0x25,0x2B,0x25,0x2D,0x25,0x2F,0x1B, + 0x28,0x42,0x0D,0x0A, + 0x1B,0x28,0x42,0x0D,0x0A, + +}; +WCHAR iso2022jp_uniSource[]={ + 0x3000,0x3001,0x3002,0x0020,0xFF0E,0x30FB,0xFF1A,0xFF1B,0x000D,0x000A, + 0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x000D,0x000A, + 0xFF1F,0xFF01,0x309B,0x309C,0x00B4,0xFF40,0x00A8,0xFF3E,0x000D,0x000A, + 0x004B,0x004C,0x004D,0x004E,0x004F,0x0050,0x0051,0x0052,0x000D,0x000A, + 0xFFE3,0xFF3F,0x30FD,0x30FE,0x309D,0x309E,0x3003,0x4EDD,0x000D,0x000A, + 0x3005,0x3006,0x3007,0x30FC,0x2015,0x2010,0xFF0F,0x005C,0x000D,0x000A, + /*0x301C,0x2016,*/ 0xFF5C,0x2026,0x2025,0x2018,0x2019,0x201C,0x000D,0x000A, + 0x201D,0xFF08,0xFF09,0x3014,0xFF75,0xFF76,0xFF77,0xFF78,0x000D,0x000A, + 0xFF79,0xFF7A,0xFF7B,0xFF7C,0xFF7D,0xFF7E,0xFF7F,0xFF80,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF81,0xFF82,0xFF83,0xFF84,0xFF85,0xFF86,0xFF87,0xFF88,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF89,0xFF8A,0xFF8B,0x0020,0xFF8D,0xFF8E,0xFF8F,0xFF90,0x000D,0x000A, + 0xFF91,0xFF92,0xFF93,0xFF94,0xFF95,0xFF96,0xFF97,0xFF98,0x000D,0x000A, + /**/ + 0x3000,0x3001,0x3002,0x0020,0xFF0E,0x30FB,0xFF1A,0xFF1B,0x000D,0x000A, + 0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x000D,0x000A, + 0xFF1F,0xFF01,0x309B,0x309C,0x00B4,0xFF40,0x00A8,0xFF3E,0x000D,0x000A, + 0x004B,0x004C,0x004D,0x004E,0x004F,0x0050,0x0051,0x0052,0x000D,0x000A, + 0xFFE3,0xFF3F,0x30FD,0x30FE,0x309D,0x309E,0x3003,0x4EDD,0x000D,0x000A, + 0x3005,0x3006,0x3007,0x30FC,0x2015,0x2010,0xFF0F,0x005C,0x000D,0x000A, + /*0x301C,0x2016,*/ 0xFF5C,0x2026,0x2025,0x2018,0x2019,0x201C,0x000D,0x000A, + 0x201D,0xFF08,0xFF09,0x3014,0xFF75,0xFF76,0xFF77,0xFF78,0x000D,0x000A, + 0xFF79,0xFF7A,0xFF7B,0xFF7C,0xFF7D,0xFF7E,0xFF7F,0xFF80,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF81,0xFF82,0xFF83,0xFF84,0xFF85,0xFF86,0xFF87,0xFF88,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF89,0xFF8A,0xFF8B,0x0020,0xFF8D,0xFF8E,0xFF8F,0xFF90,0x000D,0x000A, + 0xFF91,0xFF92,0xFF93,0xFF94,0xFF95,0xFF96,0xFF97,0xFF98,0x000D,0x000A, + /**/ + 0x3000,0x3001,0x3002,0x0020,0xFF0E,0x30FB,0xFF1A,0xFF1B,0x000D,0x000A, + 0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x000D,0x000A, + 0xFF1F,0xFF01,0x309B,0x309C,0x00B4,0xFF40,0x00A8,0xFF3E,0x000D,0x000A, + 0x004B,0x004C,0x004D,0x004E,0x004F,0x0050,0x0051,0x0052,0x000D,0x000A, + 0xFFE3,0xFF3F,0x30FD,0x30FE,0x309D,0x309E,0x3003,0x4EDD,0x000D,0x000A, + 0x3005,0x3006,0x3007,0x30FC,0x2015,0x2010,0xFF0F,0x005C,0x000D,0x000A, + /*0x301C,0x2016,*/ 0xFF5C,0x2026,0x2025,0x2018,0x2019,0x201C,0x000D,0x000A, + 0x201D,0xFF08,0xFF09,0x3014,0xFF75,0xFF76,0xFF77,0xFF78,0x000D,0x000A, + 0xFF79,0xFF7A,0xFF7B,0xFF7C,0xFF7D,0xFF7E,0xFF7F,0xFF80,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF81,0xFF82,0xFF83,0xFF84,0xFF85,0xFF86,0xFF87,0xFF88,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF89,0xFF8A,0xFF8B,0x0020,0xFF8D,0xFF8E,0xFF8F,0xFF90,0x000D,0x000A, + 0xFF91,0xFF92,0xFF93,0xFF94,0xFF95,0xFF96,0xFF97,0xFF98,0x000D,0x000A, + /**/ + 0x3000,0x3001,0x3002,0x0020,0xFF0E,0x30FB,0xFF1A,0xFF1B,0x000D,0x000A, + 0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x000D,0x000A, + 0xFF1F,0xFF01,0x309B,0x309C,0x00B4,0xFF40,0x00A8,0xFF3E,0x000D,0x000A, + 0x004B,0x004C,0x004D,0x004E,0x004F,0x0050,0x0051,0x0052,0x000D,0x000A, + 0xFFE3,0xFF3F,0x30FD,0x30FE,0x309D,0x309E,0x3003,0x4EDD,0x000D,0x000A, + 0x3005,0x3006,0x3007,0x30FC,0x2015,0x2010,0xFF0F,0x005C,0x000D,0x000A, + /*0x301C,0x2016,*/ 0xFF5C,0x2026,0x2025,0x2018,0x2019,0x201C,0x000D,0x000A, + 0x201D,0xFF08,0xFF09,0x3014,0xFF75,0xFF76,0xFF77,0xFF78,0x000D,0x000A, + 0xFF79,0xFF7A,0xFF7B,0xFF7C,0xFF7D,0xFF7E,0xFF7F,0xFF80,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF81,0xFF82,0xFF83,0xFF84,0xFF85,0xFF86,0xFF87,0xFF88,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF89,0xFF8A,0xFF8B,0x0020,0xFF8D,0xFF8E,0xFF8F,0xFF90,0x000D,0x000A, + 0xFF91,0xFF92,0xFF93,0xFF94,0xFF95,0xFF96,0xFF97,0xFF98,0x000D,0x000A, + /**/ + 0x3000,0x3001,0x3002,0x0020,0xFF0E,0x30FB,0xFF1A,0xFF1B,0x000D,0x000A, + 0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x000D,0x000A, + 0xFF1F,0xFF01,0x309B,0x309C,0x00B4,0xFF40,0x00A8,0xFF3E,0x000D,0x000A, + 0x004B,0x004C,0x004D,0x004E,0x004F,0x0050,0x0051,0x0052,0x000D,0x000A, + 0xFFE3,0xFF3F,0x30FD,0x30FE,0x309D,0x309E,0x3003,0x4EDD,0x000D,0x000A, + 0x3005,0x3006,0x3007,0x30FC,0x2015,0x2010,0xFF0F,0x005C,0x000D,0x000A, + /*0x301C,0x2016,*/ 0xFF5C,0x2026,0x2025,0x2018,0x2019,0x201C,0x000D,0x000A, + 0x201D,0xFF08,0xFF09,0x3014,0xFF75,0xFF76,0xFF77,0xFF78,0x000D,0x000A, + 0xFF79,0xFF7A,0xFF7B,0xFF7C,0xFF7D,0xFF7E,0xFF7F,0xFF80,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF81,0xFF82,0xFF83,0xFF84,0xFF85,0xFF86,0xFF87,0xFF88,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF89,0xFF8A,0xFF8B,0x0020,0xFF8D,0xFF8E,0xFF8F,0xFF90,0x000D,0x000A, + 0xFF91,0xFF92,0xFF93,0xFF94,0xFF95,0xFF96,0xFF97,0xFF98,0x000D,0x000A, + /**/ + 0x3000,0x3001,0x3002,0x0020,0xFF0E,0x30FB,0xFF1A,0xFF1B,0x000D,0x000A, + 0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x000D,0x000A, + 0xFF1F,0xFF01,0x309B,0x309C,0x00B4,0xFF40,0x00A8,0xFF3E,0x000D,0x000A, + 0x004B,0x004C,0x004D,0x004E,0x004F,0x0050,0x0051,0x0052,0x000D,0x000A, + 0xFFE3,0xFF3F,0x30FD,0x30FE,0x309D,0x309E,0x3003,0x4EDD,0x000D,0x000A, + 0x3005,0x3006,0x3007,0x30FC,0x2015,0x2010,0xFF0F,0x005C,0x000D,0x000A, + /*0x301C,0x2016,*/ 0xFF5C,0x2026,0x2025,0x2018,0x2019,0x201C,0x000D,0x000A, + 0x201D,0xFF08,0xFF09,0x3014,0xFF75,0xFF76,0xFF77,0xFF78,0x000D,0x000A, + 0xFF79,0xFF7A,0xFF7B,0xFF7C,0xFF7D,0xFF7E,0xFF7F,0xFF80,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF81,0xFF82,0xFF83,0xFF84,0xFF85,0xFF86,0xFF87,0xFF88,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF89,0xFF8A,0xFF8B,0x0020,0xFF8D,0xFF8E,0xFF8F,0xFF90,0x000D,0x000A, + 0xFF91,0xFF92,0xFF93,0xFF94,0xFF95,0xFF96,0xFF97,0xFF98,0x000D,0x000A, + /**/ + 0x3000,0x3001,0x3002,0x0020,0xFF0E,0x30FB,0xFF1A,0xFF1B,0x000D,0x000A, + 0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x000D,0x000A, + 0xFF1F,0xFF01,0x309B,0x309C,0x00B4,0xFF40,0x00A8,0xFF3E,0x000D,0x000A, + 0x004B,0x004C,0x004D,0x004E,0x004F,0x0050,0x0051,0x0052,0x000D,0x000A, + 0xFFE3,0xFF3F,0x30FD,0x30FE,0x309D,0x309E,0x3003,0x4EDD,0x000D,0x000A, + 0x3005,0x3006,0x3007,0x30FC,0x2015,0x2010,0xFF0F,0x005C,0x000D,0x000A, + /*0x301C,0x2016,*/ 0xFF5C,0x2026,0x2025,0x2018,0x2019,0x201C,0x000D,0x000A, + 0x201D,0xFF08,0xFF09,0x3014,0xFF75,0xFF76,0xFF77,0xFF78,0x000D,0x000A, + 0xFF79,0xFF7A,0xFF7B,0xFF7C,0xFF7D,0xFF7E,0xFF7F,0xFF80,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF81,0xFF82,0xFF83,0xFF84,0xFF85,0xFF86,0xFF87,0xFF88,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF89,0xFF8A,0xFF8B,0x0020,0xFF8D,0xFF8E,0xFF8F,0xFF90,0x000D,0x000A, + 0xFF91,0xFF92,0xFF93,0xFF94,0xFF95,0xFF96,0xFF97,0xFF98,0x000D,0x000A, + /**/ + 0x3000,0x3001,0x3002,0x0020,0xFF0E,0x30FB,0xFF1A,0xFF1B,0x000D,0x000A, + 0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x000D,0x000A, + 0xFF1F,0xFF01,0x309B,0x309C,0x00B4,0xFF40,0x00A8,0xFF3E,0x000D,0x000A, + 0x004B,0x004C,0x004D,0x004E,0x004F,0x0050,0x0051,0x0052,0x000D,0x000A, + 0xFFE3,0xFF3F,0x30FD,0x30FE,0x309D,0x309E,0x3003,0x4EDD,0x000D,0x000A, + 0x3005,0x3006,0x3007,0x30FC,0x2015,0x2010,0xFF0F,0x005C, +}; +WCHAR iso2022jp_uniSmSource[]={ + 0x3000,0x3001,0x3002,0x0020,0xFF0E,0x30FB,0xFF1A,0xFF1B,0x00A8,0xFF3E, + 0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0xFF7F,0xFF80 +}; +char iso2022jp_encSmSource[] ={ + 0x1B,0x24,0x42,0x21,0x21,0x21,0x22,0x21,0x23,0x1B, + 0x28,0x42,0x20,0x1B,0x24,0x42,0x21,0x25,0x21,0x26 +}; + +unsigned char sjis_encSource[]={ + 0x83,0x9F,0x83,0xA0,0x83,0xA1,0x83,0xA2,0x83,0xA3,0x83,0xA4,0x83,0xA5,0x83,0xA6,0x83,0xA7,0x83,0xA8, + 0x83,0xA9,0x83,0xAA,0x83,0xAB,0x83,0xAC,0x83,0xAD,0x83,0xAE,0x83,0xAF,0x83,0xB0,0x83,0xB1,0x83,0xB2, + 0x83,0xB3,0x83,0xB4,0x83,0xB5,0x83,0xB6,0x83,0xBF,0x83,0xC0,0x83,0xC1,0x83,0xC2,0x83,0xC3,0x83,0xC4, + 0x83,0xC5,0x83,0xC6,0x83,0xC7,0x83,0xC8,0x83,0xC9,0x83,0xCA,0x83,0xCB,0x83,0xCC,0x83,0xCD,0x83,0xCE, + 0x83,0xCF,0x83,0xD0,0x83,0xD1,0x83,0xD2,0x83,0xD3,0x83,0xD4,0x83,0xD5,0x83,0xD6,0x84,0x46,0x84,0x40, + 0x84,0x41,0x84,0x42,0x84,0x43,0x84,0x44,0x84,0x45,0x84,0x47,0x84,0x48,0x84,0x49,0x84,0x4A,0x84,0x4B, + 0x84,0x4C,0x84,0x4D,0x84,0x4E,0x84,0x4F,0x84,0x50,0x84,0x51,0x84,0x52,0x84,0x53,0x84,0x54,0x84,0x55, + 0x84,0x56,0x84,0x57,0x84,0x58,0x84,0x59,0x84,0x5A,0x84,0x5B,0x84,0x5C,0x84,0x5D,0x84,0x5E,0x84,0x5F, + 0x84,0x60,0x84,0x70,0x84,0x71,0x84,0x72,0x84,0x73,0x84,0x74,0x84,0x75,0x84,0x77,0x84,0x78,0x84,0x79, + 0x84,0x7A,0x84,0x7B,0x84,0x7C,0x84,0x7D,0x84,0x7E,0x84,0x80,0x84,0x81,0x84,0x82,0x84,0x83,0x84,0x84, + 0x84,0x85,0x84,0x86,0x84,0x87,0x84,0x88,0x84,0x89,0x84,0x8A,0x84,0x8B,0x84,0x8C,0x84,0x8D,0x84,0x8E, + 0x84,0x8F,0x84,0x90,0x84,0x91,0x84,0x76,0x81,0x5D,0x81,0x5C,0x81,0x61,0x81,0x65,0x81,0x66,0x81,0x67, + 0x81,0x68,0x81,0xF5,0x81,0xF6,0x81,0x64,0x81,0x63,0x81,0xF1,0x81,0x8C,0x81,0x8D,0x81,0xA6,0x7E,0x81, + 0x8E,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13, + 0x14,0x15,0x16,0x17,0x18,0x19,0x7F,0x1B,0x1A,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B, + 0x3C,0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x83,0xA1,0x83,0xA2,0x83,0xA3,0x83,0xA4, + 0x83,0xA5,0x83,0xA6,0x83,0xA7,0x83,0xA8,0x83,0xA9,0x83,0xAA,0x83,0xAB,0x83,0xAC,0x83,0xAD,0x83,0xAE, + 0x83,0xAF,0x83,0xB0,0x83,0xB1,0x83,0xB2,0x83,0xA9,0x83,0xAA,0x83,0xAB,0x83,0xAC,0x83,0xAD,0x83,0xAE, + 0x83,0xAF,0x83,0xB0,0x83,0xB1,0x83,0xB2,0x83,0x9F,0x83,0xA0,0x83,0xA1,0x83,0xA2,0x83,0xA3,0x83,0xA4, + 0x83,0xA5,0x83,0xA6,0x83,0xA7,0x83,0xA8,0x83,0xA9,0x83,0xAA,0x83,0xAB,0x83,0xAC,0x83,0xAD,0x83,0xAE, + 0x83,0xAF,0x83,0xB0,0x83,0xB1,0x83,0xB2,0x83,0xB3,0x83,0xB4,0x83,0xB5,0x83,0xB6,0x83,0xBF,0x83,0xC0, + 0x83,0xC1,0x83,0xC2,0x83,0xC3,0x83,0xC4,0x83,0xC5,0x83,0xC6,0x83,0xC7,0x83,0xC8,0x83,0xC9,0x83,0xCA, + 0x83,0xCB,0x83,0xCC,0x83,0xCD,0x83,0xCE,0x83,0xCF,0x83,0xD0,0x83,0xD1,0x83,0xD2,0x83,0xD3,0x83,0xD4, + 0x83,0xD5,0x83,0xD6,0x84,0x46,0x84,0x40,0x84,0x41,0x84,0x42,0x84,0x43,0x84,0x44,0x84,0x45,0x84,0x47, + 0x84,0x48,0x84,0x49,0x84,0x4A,0x84,0x4B,0x84,0x4C,0x84,0x4D,0x84,0x4E,0x84,0x4F,0x84,0x50,0x84,0x51, + 0x84,0x52,0x84,0x53,0x84,0x54,0x84,0x55,0x84,0x56,0x84,0x57,0x84,0x58,0x84,0x59,0x84,0x5A,0x84,0x5B, + 0x84,0x5C,0x84,0x5D,0x84,0x5E,0x84,0x5F,0x84,0x60,0x84,0x70,0x84,0x71,0x84,0x72,0x84,0x73,0x84,0x74, + 0x84,0x75,0x84,0x77,0x84,0x78,0x84,0x79,0x84,0x7A,0x84,0x7B,0x84,0x7C,0x84,0x7D,0x84,0x7E,0x84,0x80, + 0x84,0x81,0x84,0x82,0x84,0x83,0x84,0x84,0x84,0x85,0x84,0x86,0x84,0x87,0x84,0x88,0x84,0x89,0x84,0x8A, + 0x84,0x8B,0x84,0x8C,0x84,0x8D,0x84,0x8E,0x84,0x8F,0x84,0x90,0x84,0x91,0x84,0x76,0x81,0x5D,0x81,0x5C, + 0x81,0x61,0x81,0x65,0x81,0x66,0x81,0x67,0x81,0x68,0x81,0xF5,0x81,0xF6,0x81,0x64,0x81,0x63,0x81,0xF1, + 0x81,0x8C,0x81,0x8D,0x81,0xA6,0x7E,0x81,0x8E,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B, + 0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x7F,0x1B,0x1A,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33, + 0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B, + 0x83,0xA1,0x83,0xA2,0x83,0xA3,0x83,0xA4,0x83,0xA5,0x83,0xA6,0x83,0xA7,0x83,0xA8,0x83,0xA9,0x83,0xAA, + 0x83,0xAB,0x83,0xAC,0x83,0xAD,0x83,0xAE,0x83,0xAF,0x83,0xB0,0x83,0xB1,0x83,0xB2,0x83,0xA9,0x83,0xAA, + 0x83,0xAB,0x83,0xAC,0x83,0xAD,0x83,0xAE,0x83,0xAF,0x83,0xB0,0x83,0xB1,0x83,0xB2,0x83,0x9F,0x83,0xA0, + 0x83,0xA1,0x83,0xA2,0x83,0xA3,0x83,0xA4,0x83,0xA5,0x83,0xA6,0x83,0xA7,0x83,0xA8,0x83,0xA9,0x83,0xAA, + 0x83,0xAB,0x83,0xAC,0x83,0xAD,0x83,0xAE,0x83,0xAF,0x83,0xB0,0x83,0xB1,0x83,0xB2,0x83,0xB3,0x83,0xB4, + 0x83,0xB5,0x83,0xB6,0x83,0xBF,0x83,0xC0,0x83,0xC1,0x83,0xC2,0x83,0xC3,0x83,0xC4,0x83,0xC5,0x83,0xC6, + 0x83,0xC7,0x83,0xC8,0x83,0xC9,0x83,0xCA,0x83,0xCB,0x83,0xCC,0x83,0xCD,0x83,0xCE,0x83,0xCF,0x83,0xD0, + 0x83,0xD1,0x83,0xD2,0x83,0xD3,0x83,0xD4,0x83,0xD5,0x83,0xD6,0x84,0x46,0x84,0x40,0x84,0x41,0x84,0x42, + 0x84,0x43,0x84,0x44,0x84,0x45,0x84,0x47,0x84,0x48,0x84,0x49,0x84,0x4A,0x84,0x4B,0x84,0x4C,0x84,0x4D, + 0x84,0x4E,0x84,0x4F,0x84,0x50,0x84,0x51,0x84,0x52,0x84,0x53,0x84,0x54,0x84,0x55,0x84,0x56,0x84,0x57, + 0x84,0x58,0x84,0x59,0x84,0x5A,0x84,0x5B,0x84,0x5C,0x84,0x5D,0x84,0x5E,0x84,0x5F,0x84,0x60,0x84,0x70, + 0x84,0x71,0x84,0x72,0x84,0x73,0x84,0x74,0x84,0x75,0x84,0x77,0x84,0x78,0x84,0x79,0x84,0x7A,0x84,0x7B, + 0x84,0x7C,0x84,0x7D,0x84,0x7E,0x84,0x80,0x84,0x81,0x84,0x82,0x84,0x83,0x84,0x84,0x84,0x85,0x84,0x86, + 0x84,0x87,0x84,0x88, + +}; + +WCHAR sjis_uniSource[]={ + 0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039A, + 0x039B,0x039C,0x039D,0x039E,0x039F,0x03A0,0x03A1,0x03A3,0x03A4,0x03A5, + 0x03A6,0x03A7,0x03A8,0x03A9,0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6, + 0x03B7,0x03B8,0x03B9,0x03BA,0x03BB,0x03BC,0x03BD,0x03BE,0x03BF,0x03C0, + 0x03C1,0x03C3,0x03C4,0x03C5,0x03C6,0x03C7,0x03C8,0x03C9,0x0401,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,0x0451,0x2010,0x2015,0x2225,0x2018,0x2019,0x201C, + 0x201D,0x2020,0x2021,0x2025,0x2026,0x2030,0x2032,0x2033,0x203B,0x007E, + 0x2103,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009, + 0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013, + 0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x007F,0x001B,0x001A,0x001D, + 0x001E,0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031, + 0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B, + 0x003C,0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045, + 0x0046,0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059, + 0x005A,0x005B,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039A, + 0x039B,0x039C,0x039D,0x039E,0x039F,0x03A0,0x03A1,0x03A3,0x03A4,0x03A5, + 0x039B,0x039C,0x039D,0x039E,0x039F,0x03A0,0x03A1,0x03A3,0x03A4,0x03A5, + 0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039A, + 0x039B,0x039C,0x039D,0x039E,0x039F,0x03A0,0x03A1,0x03A3,0x03A4,0x03A5, + 0x03A6,0x03A7,0x03A8,0x03A9,0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6, + 0x03B7,0x03B8,0x03B9,0x03BA,0x03BB,0x03BC,0x03BD,0x03BE,0x03BF,0x03C0, + 0x03C1,0x03C3,0x03C4,0x03C5,0x03C6,0x03C7,0x03C8,0x03C9,0x0401,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,0x0451,0x2010,0x2015,0x2225,0x2018,0x2019,0x201C, + 0x201D,0x2020,0x2021,0x2025,0x2026,0x2030,0x2032,0x2033,0x203B,0x007E, + 0x2103,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009, + 0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013, + 0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x007F,0x001B,0x001A,0x001D, + 0x001E,0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031, + 0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B, + 0x003C,0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045, + 0x0046,0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059, + 0x005A,0x005B,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039A, + 0x039B,0x039C,0x039D,0x039E,0x039F,0x03A0,0x03A1,0x03A3,0x03A4,0x03A5, + 0x039B,0x039C,0x039D,0x039E,0x039F,0x03A0,0x03A1,0x03A3,0x03A4,0x03A5, + 0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039A, + 0x039B,0x039C,0x039D,0x039E,0x039F,0x03A0,0x03A1,0x03A3,0x03A4,0x03A5, + 0x03A6,0x03A7,0x03A8,0x03A9,0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6, + 0x03B7,0x03B8,0x03B9,0x03BA,0x03BB,0x03BC,0x03BD,0x03BE,0x03BF,0x03C0, + 0x03C1,0x03C3,0x03C4,0x03C5,0x03C6,0x03C7,0x03C8,0x03C9,0x0401,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,0x043D,0x043E,0x043F,0x0440,0x0441,0x0442, + + 0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039A, + 0x039B,0x039C,0x039D,0x039E,0x039F,0x03A0,0x03A1,0x03A3,0x03A4,0x03A5, + 0x03A6,0x03A7,0x03A8,0x03A9,0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6, + 0x03B7,0x03B8,0x03B9,0x03BA,0x03BB,0x03BC,0x03BD,0x03BE,0x03BF,0x03C0, + 0x03C1,0x03C3,0x03C4,0x03C5,0x03C6,0x03C7,0x03C8,0x03C9,0x0401,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,0x0451,0x2010,0x2015,0x2225,0x2018,0x2019,0x201C, + 0x201D,0x2020,0x2021,0x2025,0x2026,0x2030,0x2032,0x2033,0x203B,0x007E, + 0x2103,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009, + 0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013, + 0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x007F,0x001B,0x001A,0x001D, + 0x001E,0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031, + 0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B, + 0x003C,0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045, + 0x0046,0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059, + 0x005A,0x005B,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039A, + 0x039B,0x039C,0x039D,0x039E,0x039F,0x03A0,0x03A1,0x03A3,0x03A4,0x03A5, + 0x039B,0x039C,0x039D,0x039E,0x039F,0x03A0,0x03A1,0x03A3,0x03A4,0x03A5, + 0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039A, + 0x039B,0x039C,0x039D,0x039E,0x039F,0x03A0,0x03A1,0x03A3,0x03A4,0x03A5, + 0x03A6,0x03A7,0x03A8,0x03A9,0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6, + 0x03B7,0x03B8,0x03B9,0x03BA,0x03BB,0x03BC,0x03BD,0x03BE,0x03BF,0x03C0, + 0x03C1,0x03C3,0x03C4,0x03C5,0x03C6,0x03C7,0x03C8,0x03C9,0x0401,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,0x0451,0x2010,0x2015,0x2225,0x2018,0x2019,0x201C, + 0x201D,0x2020,0x2021,0x2025,0x2026,0x2030,0x2032,0x2033,0x203B,0x007E, + 0x2103,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009, + 0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013, + 0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x007F,0x001B,0x001A,0x001D, + 0x001E,0x001F,0x0020,0x0021, + +}; +WCHAR sjis_uniSmSource[]={ + 0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039A, + 0x039B,0x039C,0x039D,0x039E,0x039F,0x03A0,0x03A1,0x03A3,0x03A4,0x03A5, +}; +unsigned char sjis_encSmSource[]={ + 0x83,0x9F,0x83,0xA0,0x83,0xA1,0x83,0xA2,0x83,0xA3,0x83,0xA4,0x83,0xA5,0x83,0xA6,0x83,0xA7,0x83,0xA8, + +}; + +unsigned char eucjp_encSource[]={ + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x8E,0xE3,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63, + 0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x8E,0xE4,0x7F,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A, + 0x8B,0x8C,0x8D,0xA6,0xD4,0xA6,0xD5,0xA6,0xD6,0xA6,0xD7,0xA6,0xD8,0xA7,0xA7,0xA7,0xA1,0xA7,0xA2,0xA7, + 0xA3,0xA7,0xA4,0xA7,0xA5,0xA7,0xA6,0xA7,0xA8,0xA7,0xA9,0xA7,0xAA,0xA7,0xAB,0xA7,0xAC,0xA7,0xAD,0xA7, + 0xAE,0xA7,0xAF,0xA7,0xB0,0xA7,0xB1,0xA7,0xB2,0xA7,0xB3,0xA7,0xB4,0xA7,0xB5,0xA7,0xB6,0xA7,0xB7,0xA7, + 0xB8,0xA7,0xB9,0xA7,0xBA,0xA7,0xBB,0xA7,0xBC,0xA7,0xBD,0xA7,0xBE,0xA7,0xBF,0xA7,0xC0,0xA7,0xC1,0xA7, + 0xD1,0xA7,0xD2,0xA7,0xD3,0xA7,0xD4,0xA7,0xD5,0xA7,0xD6,0xA7,0xD8,0xA7,0xD9,0xA7,0xDA,0xA7,0xDB,0xA7, + 0xDC,0xA7,0xDD,0xA7,0xDE,0xA7,0xDF,0xA7,0xE0,0xA7,0xE1,0xA7,0xE2,0xA7,0xE3,0xA7,0xE4,0xA7,0xE5,0xA7, + 0xE6,0xA7,0xE7,0xA7,0xE8,0xA7,0xE9,0xA7,0xEA,0xA7,0xEB,0xA7,0xEC,0xA7,0xED,0xA7,0xEE,0xA7,0xEF,0xA7, + 0xF0,0xA7,0xF1,0xA7,0xD7,0xA1,0xBE,0xA1,0xBD,0xA1,0xC2,0xA1,0xC6,0xA1,0xC7,0xA1,0xC8,0xA1,0xC9,0xA2, + 0xF7,0xA2,0xF8,0xA1,0xC5,0xA1,0xC4,0xA2,0xF3,0xA1,0xEC,0xA1,0xED,0xA2,0xA8,0x7E,0xA1,0xEE,0x8F,0xF3, + 0xB8,0x8F,0xF3,0xB9,0xA2,0xF2,0x8F,0xF3,0xAB,0x8F,0xF3,0xAC,0x8F,0xF3,0xAD,0x8F,0xF3,0xAE,0x8F,0xF3, + 0xAF,0x8F,0xF3,0xB0,0x8F,0xF3,0xB1,0x8F,0xF3,0xB2,0x8F,0xF3,0xB3,0x8F,0xF3,0xB4,0x8F,0xF3,0xA1,0x8F, + 0xF3,0xA2,0x8F,0xF3,0xA3,0x8F,0xF3,0xA4,0x8F,0xF3,0xA5,0x8F,0xF3,0xA6,0x8F,0xF3,0xA7,0xA1,0xC2,0x01, + 0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15, + 0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, + 0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D, + 0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51, + 0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x8E,0xE3,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + 0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78, + 0x79,0x7A,0x7B,0x7C,0x7D,0x8E,0xE4,0x7F,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B, + 0x8C,0x8D,0xA6,0xD4,0xA6,0xD5,0xA6,0xD6,0xA6,0xD7,0xA6,0xD8,0xA7,0xA7,0xA7,0xA1,0xA7,0xA2,0xA7,0xA3, + 0xA7,0xA4,0xA7,0xA5,0xA7,0xA6,0xA7,0xA8,0xA7,0xA9,0xA7,0xAA,0xA7,0xAB,0xA7,0xAC,0xA7,0xAD,0xA7,0xAE, + 0xA7,0xAF,0xA7,0xB0,0xA7,0xB1,0xA7,0xB2,0xA7,0xB3,0xA7,0xB4,0xA7,0xB5,0xA7,0xB6,0xA7,0xB7,0xA7,0xB8, + 0xA7,0xB9,0xA7,0xBA,0xA7,0xBB,0xA7,0xBC,0xA7,0xBD,0xA7,0xBE,0xA7,0xBF,0xA7,0xC0,0xA7,0xC1,0xA7,0xD1, + 0xA7,0xD2,0xA7,0xD3,0xA7,0xD4,0xA7,0xD5,0xA7,0xD6,0xA7,0xD8,0xA7,0xD9,0xA7,0xDA,0xA7,0xDB,0xA7,0xDC, + 0xA7,0xDD,0xA7,0xDE,0xA7,0xDF,0xA7,0xE0,0xA7,0xE1,0xA7,0xE2,0xA7,0xE3,0xA7,0xE4,0xA7,0xE5,0xA7,0xE6, + 0xA7,0xE7,0xA7,0xE8,0xA7,0xE9,0xA7,0xEA,0xA7,0xEB,0xA7,0xEC,0xA7,0xED,0xA7,0xEE,0xA7,0xEF,0xA7,0xF0, + 0xA7,0xF1,0xA7,0xD7,0xA1,0xBE,0xA1,0xBD,0xA1,0xC2,0xA1,0xC6,0xA1,0xC7,0xA1,0xC8,0xA1,0xC9,0xA2,0xF7, + 0xA2,0xF8,0xA1,0xC5,0xA1,0xC4,0xA2,0xF3,0xA1,0xEC,0xA1,0xED,0xA2,0xA8,0x7E,0xA1,0xEE,0x8F,0xF3,0xB8, + 0x8F,0xF3,0xB9,0xA2,0xF2,0x8F,0xF3,0xAB,0x8F,0xF3,0xAC,0x8F,0xF3,0xAD,0x8F,0xF3,0xAE,0x8F,0xF3,0xAF, + 0x8F,0xF3,0xB0,0x8F,0xF3,0xB1,0x8F,0xF3,0xB2,0x8F,0xF3,0xB3,0x8F,0xF3,0xB4,0x8F,0xF3,0xA1,0x8F,0xF3, + 0xA2,0x8F,0xF3,0xA3,0x8F,0xF3,0xA4,0x8F,0xF3,0xA5,0x8F,0xF3,0xA6,0x8F,0xF3,0xA7,0xA1,0xC2,0x01,0x02, + 0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16, + 0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A, + 0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E, + 0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52, + 0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x8E,0xE3,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64,0x65, + 0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79, + 0x7A,0x7B,0x7C,0x7D,0x8E,0xE4,0x7F,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C, + 0x8D,0xA6,0xD4,0xA6,0xD5,0xA6,0xD6,0xA6,0xD7,0xA6,0xD8,0xA7,0xA7,0xA7,0xA1,0xA7,0xA2,0xA7,0xA3,0xA7, + 0xA4,0xA7,0xA5,0xA7,0xA6,0xA7,0xA8,0xA7,0xA9,0xA7,0xAA,0xA7,0xAB,0xA7,0xAC,0xA7,0xAD,0xA7,0xAE,0xA7, + 0xAF,0xA7,0xB0,0xA7,0xB1,0xA7,0xB2,0xA7,0xB3,0xA7,0xB4,0xA7,0xB5,0xA7,0xB6,0xA7,0xB7,0xA7,0xB8,0xA7, + 0xB9,0xA7,0xBA,0xA7,0xBB,0xA7,0xBC,0xA7,0xBD,0xA7,0xBE,0xA7,0xBF,0xA7,0xC0,0xA7,0xC1,0xA7,0xD1,0xA7, + 0xD2,0xA7,0xD3,0xA7,0xD4,0xA7,0xD5,0xA7,0xD6,0xA7,0xD8,0xA7,0xD9,0xA7,0xDA,0xA7,0xDB,0xA7,0xDC,0xA7, + 0xDD,0xA7,0xDE,0xA7,0xDF,0xA7,0xE0,0xA7,0xE1,0xA7,0xE2,0xA7,0xE3,0xA7,0xE4,0xA7,0xE5,0xA7,0xE6,0xA7, + 0xF1,0xA7,0xD7,0xA1,0xBE, +}; + +WCHAR eucjp_uniSource[]={ + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x7DC7,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064,0x0065, + 0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079, + 0x007A,0x007B,0x007C,0x007D,0x30FB,0x0080,0x2260,0x30E4,0x30FB,0x32A7, + 0x708E,0x65E7,0x9D3B,0xFF92,0x03C6,0x03C7,0x03C8,0x03C9,0x0401,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,0x0451,0x2010,0x2015,0x2225,0x2018,0x2019,0x201C, + 0x201D,0x2020,0x2021,0x2025,0x2026,0x2030,0x2032,0x2033,0x203B,0x007E, + 0x2103,0x5834,0x0057,0x5834,0x0058,0x212B,0x5834,0x004A,0x5834,0x004B, + 0x5834,0x004C,0x5834,0x004D,0x5834,0x004E,0x5834,0x004F,0x5834,0x0050, + 0x5834,0x0051,0x5834,0x0052,0x5834,0x0053,0x5834,0x0040,0x5834,0x0041, + 0x5834,0x0042,0x5834,0x0043,0x5834,0x0044,0x5834,0x0045,0x5834,0x0046, + 0x2225,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009, + 0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013, + 0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D, + 0x001E,0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031, + 0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B, + 0x003C,0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045, + 0x0046,0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059, + 0x005A,0x005B,0x7DC7,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + 0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E, + 0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078, + 0x0079,0x007A,0x007B,0x007C,0x007D,0x30FB,0x0080,0x2260,0x30E4,0x30FB, + 0x32A7,0x708E,0x65E7,0x9D3B,0xFF92,0x03C6,0x03C7,0x03C8,0x03C9,0x0401, + 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,0x0451,0x2010,0x2015,0x2225,0x2018,0x2019, + 0x201C,0x201D,0x2020,0x2021,0x2025,0x2026,0x2030,0x2032,0x2033,0x203B, + 0x007E,0x2103,0x5834,0x0057,0x5834,0x0058,0x212B,0x5834,0x004A,0x5834, + 0x004B,0x5834,0x004C,0x5834,0x004D,0x5834,0x004E,0x5834,0x004F,0x5834, + 0x0050,0x5834,0x0051,0x5834,0x0052,0x5834,0x0053,0x5834,0x0040,0x5834, + 0x0041,0x5834,0x0042,0x5834,0x0043,0x5834,0x0044,0x5834,0x0045,0x5834, + 0x0046,0x2225,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008, + 0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012, + 0x0013,0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C, + 0x001D,0x001E,0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026, + 0x0027,0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030, + 0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A, + 0x003B,0x003C,0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044, + 0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E, + 0x004F,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058, + 0x0059,0x005A,0x005B,0x7DC7,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063, + 0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D, + 0x006E,0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x30FB,0x0080,0x2260,0x30E4, + 0x30FB,0x32A7,0x708E,0x65E7,0x9D3B,0xFF92,0x03C6,0x03C7,0x03C8,0x03C9, + 0x0401,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,0x044F,0x0451,0x2010,0x043E,0x043F,0x0440, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x7DC7,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064,0x0065, + 0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079, + 0x007A,0x007B,0x007C,0x007D,0x30FB,0x0080,0x2260,0x30E4,0x30FB,0x32A7, + 0x708E,0x65E7,0x9D3B,0xFF92,0x03C6,0x03C7,0x03C8,0x03C9,0x0401,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,0x0451,0x2010,0x2015,0x2225,0x2018,0x2019,0x201C, + 0x201D,0x2020,0x2021,0x2025,0x2026,0x2030,0x2032,0x2033,0x203B,0x007E, + 0x2103,0x5834,0x0057,0x5834,0x0058,0x212B,0x5834,0x004A,0x5834,0x004B, + 0x5834,0x004C,0x5834,0x004D,0x5834,0x004E,0x5834,0x004F,0x5834,0x0050, + 0x5834,0x0051,0x5834,0x0052,0x5834,0x0053,0x5834,0x0040,0x5834,0x0041, + 0x5834,0x0042,0x5834,0x0043,0x5834,0x0044,0x5834,0x0045,0x5834,0x0046, + 0x2225,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009, + 0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013, + 0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D, + 0x001E,0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0041,0x5834,0x0042,0x5834, +}; + +WCHAR eucjp_uniSmSource[]={ + 0x0439,0x043A,0x043B,0x043C,0x043D,0x043E,0x043F,0x0440,0x0441,0x0442, + 0x0443,0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,0x044A,0x044B,0x044C, +}; +unsigned char eucjp_encSmSource[]={ + 0xA7,0xDD,0xA7,0xDE,0xA7,0xDF,0xA7,0xE0,0xA7,0xE1,0xA7,0xE2,0xA7,0xE3,0xA7,0xE4,0xA7,0xE5,0xA7,0xE6, +}; + +unsigned char iso2022kr_encSource[]={ + 0x1B,0x24,0x29,0x43, + 0x0E,0x6E,0x31,0x6E,0x32,0x76,0x4D,0x6E,0x52,0x56,0x46,0x60,0x65,0x73,0x3B,0x0F,0x0A,0x0D,0x0E,0x65, + 0x61,0x64,0x4B,0x57,0x23,0x5B,0x42,0x4A,0x7E,0x4F,0x4F,0x30,0x21,0x30,0x22,0x0E,0x30,0x23, + 0x30,0x24,0x30,0x25,0x30,0x26,0x0F,0x25,0x26,0x27,0x0A,0x0D,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x0E, + 0x73,0x51,0x69,0x51,0x73,0x29,0x50,0x60,0x69,0x52,0x5A,0x63,0x62,0x52,0x76,0x22,0x61,0x74,0x5A,0x64, + 0x0F,0x0A,0x0D,0x0E,0x67,0x55,0x75,0x3F,0x4F,0x22,0x4D,0x2F,0x0F,0x0A,0x0D,0x0F,0x0A,0x0D, + /**/ + + 0x0E,0x6E,0x31,0x6E,0x32,0x76,0x4D,0x6E,0x52,0x56,0x46,0x60,0x65,0x73,0x3B,0x0F,0x0A,0x0D,0x0E,0x65, + 0x61,0x64,0x4B,0x57,0x23,0x5B,0x42,0x4A,0x7E,0x4F,0x4F,0x30,0x21,0x30,0x22,0x0E,0x30,0x23, + 0x30,0x24,0x30,0x25,0x30,0x26,0x0F,0x25,0x26,0x27,0x0A,0x0D,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x0E, + 0x73,0x51,0x69,0x51,0x73,0x29,0x50,0x60,0x69,0x52,0x5A,0x63,0x62,0x52,0x76,0x22,0x61,0x74,0x5A,0x64, + 0x0F,0x0A,0x0D,0x0E,0x67,0x55,0x75,0x3F,0x4F,0x22,0x4D,0x2F,0x0F,0x0A,0x0D,0x0F,0x0A,0x0D, + /**/ + + 0x0E,0x6E,0x31,0x6E,0x32,0x76,0x4D,0x6E,0x52,0x56,0x46,0x60,0x65,0x73,0x3B,0x0F,0x0A,0x0D,0x0E,0x65, + 0x61,0x64,0x4B,0x57,0x23,0x5B,0x42,0x4A,0x7E,0x4F,0x4F,0x30,0x21,0x30,0x22,0x0E,0x30,0x23, + 0x30,0x24,0x30,0x25,0x30,0x26,0x0F,0x25,0x26,0x27,0x0A,0x0D,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x0E, + 0x73,0x51,0x69,0x51,0x73,0x29,0x50,0x60,0x69,0x52,0x5A,0x63,0x62,0x52,0x76,0x22,0x61,0x74,0x5A,0x64, + 0x0F,0x0A,0x0D,0x0E,0x67,0x55,0x75,0x3F,0x4F,0x22,0x4D,0x2F,0x0F,0x0A,0x0D,0x0F,0x0A,0x0D, + /**/ + + 0x0E,0x6E,0x31,0x6E,0x32,0x76,0x4D,0x6E,0x52,0x56,0x46,0x60,0x65,0x73,0x3B,0x0F,0x0A,0x0D,0x0E,0x65, + 0x61,0x64,0x4B,0x57,0x23,0x5B,0x42,0x4A,0x7E,0x4F,0x4F,0x30,0x21,0x30,0x22,0x0E,0x30,0x23, + 0x30,0x24,0x30,0x25,0x30,0x26,0x0F,0x25,0x26,0x27,0x0A,0x0D,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x0E, + 0x73,0x51,0x69,0x51,0x73,0x29,0x50,0x60,0x69,0x52,0x5A,0x63,0x62,0x52,0x76,0x22,0x61,0x74,0x5A,0x64, + 0x0F,0x0A,0x0D,0x0E,0x67,0x55,0x75,0x3F,0x4F,0x22,0x4D,0x2F,0x0F,0x0A,0x0D,0x0F,0x0A,0x0D, + /**/ + + 0x0E,0x6E,0x31,0x6E,0x32,0x76,0x4D,0x6E,0x52,0x56,0x46,0x60,0x65,0x73,0x3B,0x0F,0x0A,0x0D,0x0E,0x65, + 0x61,0x64,0x4B,0x57,0x23,0x5B,0x42,0x4A,0x7E,0x4F,0x4F,0x30,0x21,0x30,0x22,0x0E,0x30,0x23, + 0x30,0x24,0x30,0x25,0x30,0x26,0x0F,0x25,0x26,0x27,0x0A,0x0D,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x0E, + 0x73,0x51,0x69,0x51,0x73,0x29,0x50,0x60,0x69,0x52,0x5A,0x63,0x62,0x52,0x76,0x22,0x61,0x74,0x5A,0x64, + 0x0F,0x0A,0x0D,0x0E,0x67,0x55,0x75,0x3F,0x4F,0x22,0x4D,0x2F,0x0F,0x0A,0x0D,0x0F,0x0A,0x0D, + /**/ + + 0x0E,0x6E,0x31,0x6E,0x32,0x76,0x4D,0x6E,0x52,0x56,0x46,0x60,0x65,0x73,0x3B,0x0F,0x0A,0x0D,0x0E,0x65, + 0x61,0x64,0x4B,0x57,0x23,0x5B,0x42,0x4A,0x7E,0x4F,0x4F,0x30,0x21,0x30,0x22,0x0E,0x30,0x23, + 0x30,0x24,0x30,0x25,0x30,0x26,0x0F,0x25,0x26,0x27,0x0A,0x0D,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x0E, + 0x73,0x51,0x69,0x51,0x73,0x29,0x50,0x60,0x69,0x52,0x5A,0x63,0x62,0x52,0x76,0x22,0x61,0x74,0x5A,0x64, + 0x0F,0x0A,0x0D,0x0E,0x67,0x55,0x75,0x3F,0x4F,0x22,0x4D,0x2F,0x0F,0x0A,0x0D,0x0F,0x0A,0x0D, + /**/ + + 0x0E,0x6E,0x31,0x6E,0x32,0x76,0x4D,0x6E,0x52,0x56,0x46,0x60,0x65,0x73,0x3B,0x0F,0x0A,0x0D,0x0E,0x65, + 0x61,0x64,0x4B,0x57,0x23,0x5B,0x42,0x4A,0x7E,0x4F,0x4F,0x30,0x21,0x30,0x22,0x0E,0x30,0x23, + 0x30,0x24,0x30,0x25,0x30,0x26,0x0F,0x25,0x26,0x27,0x0A,0x0D,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x0E, + 0x73,0x51,0x69,0x51,0x73,0x29,0x50,0x60,0x69,0x52,0x5A,0x63,0x62,0x52,0x76,0x22,0x61,0x74,0x5A,0x64, + 0x0F,0x0A,0x0D,0x0E,0x67,0x55,0x75,0x3F,0x4F,0x22,0x4D,0x2F,0x0F,0x0A,0x0D,0x0F,0x0A,0x0D, + /**/ + + 0x0E,0x6E,0x31,0x6E,0x32,0x76,0x4D,0x6E,0x52,0x56,0x46,0x60,0x65,0x73,0x3B,0x0F,0x0A,0x0D,0x0E,0x65, + 0x61,0x64,0x4B,0x57,0x23,0x5B,0x42,0x4A,0x7E,0x4F,0x4F,0x30,0x21,0x30,0x22,0x0E,0x30,0x23, + 0x30,0x24,0x30,0x25,0x30,0x26,0x0F,0x25,0x26,0x27,0x0A,0x0D,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x0E, + 0x73,0x51,0x69,0x51,0x73,0x29,0x50,0x60,0x69,0x52,0x5A,0x63,0x62,0x52,0x76,0x22,0x61,0x74,0x5A,0x64, + 0x0F,0x0A,0x0D,0x0E,0x67,0x55,0x75,0x3F,0x4F,0x22,0x4D,0x2F,0x0F,0x0A,0x0D,0x0F,0x0A,0x0D, + /**/ + 0x0E,0x6E,0x31,0x6E,0x32,0x76,0x4D,0x6E,0x52,0x56,0x46,0x60,0x65,0x73,0x3B,0x0F,0x0A,0x0D,0x0E,0x65, + 0x61,0x64,0x4B,0x57,0x23,0x5B,0x42,0x4A,0x7E,0x4F,0x4F,0x30,0x21,0x30,0x22,0x0E,0x30,0x23, + 0x30,0x24,0x30,0x25,0x30,0x26,0x0F,0x25,0x26,0x27,0x0A,0x0D,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x0E, + 0x73,0x51,0x69,0x51,0x73,0x29,0x50,0x60,0x69,0x52,0x5A,0x63,0x62,0x52,0x76,0x22,0x61,0x74,0x5A,0x64, + 0x0F,0x0A,0x0D,0x0E,0x67,0x55,0x75,0x3F,0x4F,0x22,0x4D,0x2F,0x0F,0x0A,0x0D,0x0F,0x0A,0x0D, + /**/ + + 0x0E,0x6E,0x31,0x6E,0x32,0x76,0x4D,0x6E,0x52,0x56,0x46,0x60,0x65,0x73,0x3B,0x0F,0x0A,0x0D,0x0E,0x65, + 0x61,0x64,0x4B,0x57,0x23,0x5B,0x42,0x4A,0x7E,0x4F,0x4F,0x30,0x21,0x30,0x22,0x0E,0x30,0x23, + 0x30,0x24,0x30,0x25,0x30,0x26,0x0F,0x25,0x26,0x27,0x0A,0x0D,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x0E, + 0x73,0x51,0x69,0x51,0x73,0x29,0x50,0x60,0x69,0x52,0x5A,0x63,0x62,0x52,0x76,0x22,0x61,0x74,0x5A,0x64, + 0x0F,0x0A,0x0D,0x0E,0x67,0x55,0x75,0x3F,0x4F,0x22,0x4D,0x2F,0x0F,0x0A,0x0D,0x0F,0x0A,0x0D, + /**/ + + 0x0E,0x6E,0x31,0x6E,0x32,0x76,0x4D,0x6E,0x52,0x56,0x46,0x60,0x65,0x73,0x3B,0x0F,0x0A,0x0D,0x0E,0x65, + 0x61,0x64,0x4B,0x57,0x23,0x5B,0x42,0x4A,0x7E,0x4F,0x4F,0x30,0x21,0x30,0x22,0x0E,0x30,0x23, + 0x30,0x24,0x30,0x25,0x30,0x26,0x0F,0x25,0x26,0x27,0x0A,0x0D,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E, + 0x0F,0x0A,0x0D, + +}; +WCHAR iso2022kr_uniSource[]={ + 0x9F4B,0x9F4E,0x9F52,0x9F5F,0x9F61,0x9F67,0x9F6A,0x000A,0x000D,0x9F6C, + 0x9F77,0x9F8D,0x9F90,0x9F95,0x9F9C,0xAC00,0xAC01,0xAC04,0xAC07,0xAC08, + 0xAC09,0x0025,0x0026,0x0027,0x000A,0x000D,0x0028,0x0029,0x002A,0x002B, + 0x002C,0x002D,0x002E,0x53C3,0x53C8,0x53C9,0x53CA,0x53CB,0x53CD,0x53D4, + 0x53D6,0x53D7,0x53DB,0x000A,0x000D,0x53E1,0x53E2,0x53E3,0x53E4,0x53CD, + /**/ + 0x9F4B,0x9F4E,0x9F52,0x9F5F,0x9F61,0x9F67,0x9F6A,0x000A,0x000D,0x9F6C, + 0x9F77,0x9F8D,0x9F90,0x9F95,0x9F9C,0xAC00,0xAC01,0xAC04,0xAC07,0xAC08, + 0xAC09,0x0025,0x0026,0x0027,0x000A,0x000D,0x0028,0x0029,0x002A,0x002B, + 0x002C,0x002D,0x002E,0x53C3,0x53C8,0x53C9,0x53CA,0x53CB,0x53CD,0x53D4, + 0x53D6,0x53D7,0x53DB,0x000A,0x000D,0x53E1,0x53E2,0x53E3,0x53E4,0x53CD, + /**/ + 0x9F4B,0x9F4E,0x9F52,0x9F5F,0x9F61,0x9F67,0x9F6A,0x000A,0x000D,0x9F6C, + 0x9F77,0x9F8D,0x9F90,0x9F95,0x9F9C,0xAC00,0xAC01,0xAC04,0xAC07,0xAC08, + 0xAC09,0x0025,0x0026,0x0027,0x000A,0x000D,0x0028,0x0029,0x002A,0x002B, + 0x002C,0x002D,0x002E,0x53C3,0x53C8,0x53C9,0x53CA,0x53CB,0x53CD,0x53D4, + 0x53D6,0x53D7,0x53DB,0x000A,0x000D,0x53E1,0x53E2,0x53E3,0x53E4,0x53CD, + /**/ + 0x9F4B,0x9F4E,0x9F52,0x9F5F,0x9F61,0x9F67,0x9F6A,0x000A,0x000D,0x9F6C, + 0x9F77,0x9F8D,0x9F90,0x9F95,0x9F9C,0xAC00,0xAC01,0xAC04,0xAC07,0xAC08, + 0xAC09,0x0025,0x0026,0x0027,0x000A,0x000D,0x0028,0x0029,0x002A,0x002B, + 0x002C,0x002D,0x002E,0x53C3,0x53C8,0x53C9,0x53CA,0x53CB,0x53CD,0x53D4, + 0x53D6,0x53D7,0x53DB,0x000A,0x000D,0x53E1,0x53E2,0x53E3,0x53E4,0x53CD, + /**/ + 0x9F4B,0x9F4E,0x9F52,0x9F5F,0x9F61,0x9F67,0x9F6A,0x000A,0x000D,0x9F6C, + 0x9F77,0x9F8D,0x9F90,0x9F95,0x9F9C,0xAC00,0xAC01,0xAC04,0xAC07,0xAC08, + 0xAC09,0x0025,0x0026,0x0027,0x000A,0x000D,0x0028,0x0029,0x002A,0x002B, + 0x002C,0x002D,0x002E,0x53C3,0x53C8,0x53C9,0x53CA,0x53CB,0x53CD,0x53D4, + 0x53D6,0x53D7,0x53DB,0x000A,0x000D,0x53E1,0x53E2,0x53E3,0x53E4,0x53CD, + /**/ + 0x9F4B,0x9F4E,0x9F52,0x9F5F,0x9F61,0x9F67,0x9F6A,0x000A,0x000D,0x9F6C, + 0x9F77,0x9F8D,0x9F90,0x9F95,0x9F9C,0xAC00,0xAC01,0xAC04,0xAC07,0xAC08, + 0xAC09,0x0025,0x0026,0x0027,0x000A,0x000D,0x0028,0x0029,0x002A,0x002B, + 0x002C,0x002D,0x002E,0x53C3,0x53C8,0x53C9,0x53CA,0x53CB,0x53CD,0x53D4, + 0x53D6,0x53D7,0x53DB,0x000A,0x000D,0x53E1,0x53E2,0x53E3,0x53E4,0x53CD, + /**/ + 0x9F4B,0x9F4E,0x9F52,0x9F5F,0x9F61,0x9F67,0x9F6A,0x000A,0x000D,0x9F6C, + 0x9F77,0x9F8D,0x9F90,0x9F95,0x9F9C,0xAC00,0xAC01,0xAC04,0xAC07,0xAC08, + 0xAC09,0x0025,0x0026,0x0027,0x000A,0x000D,0x0028,0x0029,0x002A,0x002B, + 0x002C,0x002D,0x002E,0x53C3,0x53C8,0x53C9,0x53CA,0x53CB,0x53CD,0x53D4, + 0x53D6,0x53D7,0x53DB,0x000A,0x000D,0x53E1,0x53E2,0x53E3,0x53E4,0x53CD, + /**/ + 0x9F4B,0x9F4E,0x9F52,0x9F5F,0x9F61,0x9F67,0x9F6A,0x000A,0x000D,0x9F6C, + 0x9F77,0x9F8D,0x9F90,0x9F95,0x9F9C,0xAC00,0xAC01,0xAC04,0xAC07,0xAC08, + 0xAC09,0x0025,0x0026,0x0027,0x000A,0x000D,0x0028,0x0029,0x002A,0x002B, + 0x002C,0x002D,0x002E,0x53C3,0x53C8,0x53C9,0x53CA,0x53CB,0x53CD,0x53D4, + 0x53D6,0x53D7,0x53DB,0x000A,0x000D,0x53E1,0x53E2,0x53E3,0x53E4,0x53CD, + /**/ + 0x9F4B,0x9F4E,0x9F52,0x9F5F,0x9F61,0x9F67,0x9F6A,0x000A,0x000D,0x9F6C, + 0x9F77,0x9F8D,0x9F90,0x9F95,0x9F9C,0xAC00,0xAC01,0xAC04,0xAC07,0xAC08, + 0xAC09,0x0025,0x0026,0x0027,0x000A,0x000D,0x0028,0x0029,0x002A,0x002B, + 0x002C,0x002D,0x002E,0x53C3,0x53C8,0x53C9,0x53CA,0x53CB,0x53CD,0x53D4, + 0x53D6,0x53D7,0x53DB,0x000A,0x000D,0x53E1,0x53E2,0x53E3,0x53E4,0x53CD, + /**/ + 0x9F4B,0x9F4E,0x9F52,0x9F5F,0x9F61,0x9F67,0x9F6A,0x000A,0x000D,0x9F6C, + 0x9F77,0x9F8D,0x9F90,0x9F95,0x9F9C,0xAC00,0xAC01,0xAC04,0xAC07,0xAC08, + 0xAC09,0x0025,0x0026,0x0027,0x000A,0x000D,0x0028,0x0029,0x002A,0x002B, + 0x002C,0x002D,0x002E,0x53C3,0x53C8,0x53C9,0x53CA,0x53CB,0x53CD,0x53D4, + 0x53D6,0x53D7,0x53DB,0x000A,0x000D,0x53E1,0x53E2,0x53E3,0x53E4,0x53CD, + /**/ + 0x9F4B,0x9F4E,0x9F52,0x9F5F,0x9F61,0x9F67,0x9F6A,0x000A,0x000D,0x9F6C, + 0x9F77,0x9F8D,0x9F90,0x9F95,0x9F9C,0xAC00,0xAC01,0xAC04,0xAC07,0xAC08, + 0xAC09,0x0025,0x0026,0x0027,0x000A,0x000D,0x0028,0x0029,0x002A,0x002B, + 0x002C,0x002D,0x002E,0x53C3,0x53C8,0x53C9,0x53CA,0x53CB,0x53CD,0x53D4, + 0x53D6,0x53D7,0x53DB,0x000A,0x000D,0x53E1,0x53E2,0x53E3,0x53E4,0x53CD, + /**/ + 0x9F4B,0x9F4E,0x9F52,0x9F5F,0x9F61,0x9F67,0x9F6A,0x000A,0x000D,0x9F6C, + 0x9F77,0x9F8D,0x9F90,0x9F95,0x9F9C,0xAC00,0xAC01,0xAC04,0xAC07,0xAC08, + 0xAC09,0x0025,0x0026,0x0027,0x000A,0x000D,0x0028,0x0029,0x002A,0x002B, + 0x002C,0x002D,0x002E,0x53C3,0x53C8,0x53C9,0x53CA,0x53CB,0x53CD,0x53D4, + 0x53D6,0x53D7,0x53DB,0x000A,0x000D,0x53E1,0x53E2,0x53E3,0x53E4,0x53CD, + /**/ + 0x9F4B,0x9F4E,0x9F52,0x9F5F,0x9F61,0x9F67,0x9F6A,0x000A,0x000D,0x9F6C, + 0x9F77,0x9F8D,0x9F90,0x9F95,0x9F9C,0xAC00,0xAC01,0xAC04,0xAC07,0xAC08, + 0xAC09,0x0025,0x0026,0x0027,0x000A,0x000D,0x0028,0x0029,0x002A,0x002B, + 0x002C,0x002D,0x002E,0x53C3,0x53C8,0x53C9,0x53CA,0x53CB,0x53CD,0x53D4, + 0x53D6,0x53D7,0x53DB,0x000A,0x000D,0x53E1,0x53E2,0x53E3,0x53E4,0x53CD, + /**/ + 0x9F4B,0x9F4E,0x9F52,0x9F5F,0x9F61,0x9F67,0x9F6A,0x000A,0x000D,0x9F6C, + 0x9F77,0x9F8D,0x9F90,0x9F95,0x9F9C,0xAC00,0xAC01,0xAC04,0xAC07,0xAC08, + 0xAC09,0x0025,0x0026,0x0027,0x000A,0x000D,0x0028,0x0029,0x002A,0x002B, + 0x002C,0x002D,0x002E,0x53C3,0x53C8,0x53C9,0x53CA,0x53CB,0x53CD,0x53D4, + 0x53D6,0x53D7,0x53DB,0x000A,0x000D,0x53E1,0x53E2,0x53E3,0x53E4,0x53CD, + /**/ + 0x9F4B,0x9F4E,0x9F52,0x9F5F,0x9F61,0x9F67,0x9F6A,0x000A,0x000D,0x9F6C, + 0x9F77,0x9F8D,0x9F90,0x9F95,0x9F9C,0xAC00,0xAC01,0xAC04,0xAC07,0xAC08, + 0xAC09,0x0025,0x0026,0x0027,0x000A,0x000D,0x0028,0x0029,0x002A,0x002B, + 0x002C,0x002D,0x002E,0x53C3,0x53C8,0x53C9,0x53CA,0x53CB,0x53CD,0x53D4, + 0x53D6,0x53D7,0x53DB,0x000A,0x000D,0x53E1,0x53E2,0x53E3,0x53E4,0x53CD, + /**/ + 0x9F4B,0x9F4E,0x9F52,0x9F5F,0x9F61,0x9F67,0x9F6A,0x000A,0x000D,0x9F6C, + 0x9F77,0x9F8D,0x9F90,0x9F95,0x9F9C,0xAC00,0xAC01,0xAC04,0xAC07,0xAC08, + 0xAC09,0x0025,0x0026,0x0027,0x000A,0x000D,0x0028,0x0029,0x002A,0x002B, + 0x002C,0x002D,0x002E,0x53C3,0x53C8,0x53C9,0x53CA,0x53CB,0x53CD,0x53D4, + 0x53D6,0x53D7,0x53DB,0x000A,0x000D,0x53E1,0x53E2,0x53E3,0x53E4,0x53CD, + /**/ + 0x9F4B,0x9F4E,0x9F52,0x9F5F,0x9F61,0x9F67,0x9F6A,0x000A,0x000D,0x9F6C, + 0x9F77,0x9F8D,0x9F90,0x9F95,0x9F9C,0xAC00,0xAC01,0xAC04,0xAC07,0xAC08, + 0xAC09,0x0025,0x0026,0x0027,0x000A,0x000D,0x0028,0x0029,0x002A,0x002B, + 0x002C,0x002D,0x002E,0x53C3,0x53C8,0x53C9,0x53CA,0x53CB,0x53CD,0x53D4, + 0x53D6,0x53D7,0x53DB,0x000A,0x000D,0x53E1,0x53E2,0x53E3,0x53E4,0x53CD, + /**/ + 0x9F4B,0x9F4E,0x9F52,0x9F5F,0x9F61,0x9F67,0x9F6A,0x000A,0x000D,0x9F6C, + 0x9F77,0x9F8D,0x9F90,0x9F95,0x9F9C,0xAC00,0xAC01,0xAC04,0xAC07,0xAC08, + 0xAC09,0x0025,0x0026,0x0027,0x000A,0x000D,0x0028,0x0029,0x002A,0x002B, + 0x002C,0x002D,0x002E,0x53C3,0x53C8,0x53C9,0x53CA,0x53CB,0x53CD,0x53D4, + 0x53D6,0x53D7,0x53DB,0x000A,0x000D,0x53E1,0x53E2,0x53E3,0x53E4,0x53CD, + /**/ + 0x9F4B,0x9F4E,0x9F52,0x9F5F,0x9F61,0x9F67,0x9F6A,0x000A,0x000D,0x9F6C, + 0x9F77,0x9F8D,0x9F90,0x9F95,0x9F9C,0xAC00,0xAC01,0xAC04,0xAC07,0xAC08, + 0xAC09,0x0025,0x0026,0x0027,0x000A,0x000D,0x0028,0x0029,0x002A,0x002B, + 0x002C,0x002D,0x002E,0x53C3,0x53C8,0x53C9,0x53CA,0x53CB,0x53CD,0x53D4, + 0x53D6,0x53D7,0x53DB,0x000A,0x000D,0x53E1,0x53E2,0x53E3,0x53E4,0x53CD, + /**/ + 0x9F4B,0x9F4E,0x9F52,0x9F5F,0x9F61,0x9F67,0x9F6A,0x000A,0x000D,0x9F6C, + 0x9F77,0x9F8D,0x9F90,0x9F95,0x9F9C,0xAC00,0xAC01,0xAC04,0xAC07,0xAC08, + 0xAC09,0x0025,0x0026,0x0027,0x000A,0x000D,0x0028,0x0029,0x002A,0x002B, + 0x002C,0x002D,0x002E,0x53C3,0x53C8,0x53C9,0x53CA,0x53CB,0x53CD,0x53D4, + 0x53D6,0x53D7,0x53DB,0x000A,0x000D,0x53E1,0x53E2,0x53E3,0x53E4,0x53CD, + /**/ + 0x9F4B,0x9F4E,0x9F52,0x9F5F,0x9F61,0x9F67,0x9F6A,0x000A,0x000D,0x9F6C, + 0x9F77,0x9F8D,0x9F90,0x9F95,0x9F9C,0xAC00,0xAC01,0xAC04,0xAC07,0xAC08, + 0xAC09,0x0025,0x0026,0x0027 + +}; + +unsigned char iso2022kr_encSmSource[]={ + 0x1B,0x24,0x29,0x43, + 0x0E,0x6E,0x31,0x6E,0x32,0x76,0x4D,0x6E,0x52,0x56,0x46,0x60,0x65,0x73,0x3B,0x0F,0x0A,0x0D +}; +WCHAR iso2022kr_uniSmSource[]={ + 0x9F4B,0x9F4E,0x9F52,0x9F5F,0x9F61,0x9F67,0x9F6A,0x000A,0x000D,0x9F6C, + 0x9F77,0x9F8D,0x9F90,0x9F95,0x9F9C,0xAC00,0xAC01,0xAC04,0xAC07,0xAC08, +}; +unsigned char gb2312_encSource[]={ + 0x82,0x6C,0x82,0x6D,0x82,0x6E,0x82,0x6F,0x82,0x70,0x82,0x71,0x82,0x72,0x82,0x73,0x82,0x74,0x82,0x75, + 0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x82,0x76,0x82,0x77,0x82,0x78,0x82,0x79,0x82,0x7A, + 0x82,0x7B,0x82,0x7C,0x82,0x7D,0x82,0x7E,0x82,0x80,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x82,0x81,0x82,0x82,0x82,0x83,0x82,0x84,0x82,0x85,0x82,0x86,0x82,0x87,0x82,0x88,0x82,0x89,0x82,0x8A, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x82,0x8B,0x82,0x8C,0x82,0x8D,0x82,0x8E,0x82,0x8F, + 0x82,0x90,0x82,0x91,0x82,0x92,0x82,0x93,0x82,0x94,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B, + 0x82,0x95,0x82,0x96,0x82,0x97,0x82,0x98,0x82,0x99,0x82,0x9A,0x82,0x9B,0x82,0x9C,0x82,0x9D,0x82,0x9E, + 0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x82,0x9F,0x82,0xA0,0x82,0xA1,0x82,0xA2,0x82,0xA3, + 0x82,0xA4,0x82,0xA5,0x82,0xA6,0x82,0xA7,0x82,0xA8,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0x82,0xA9,0x82,0xAA,0x82,0xAB,0x82,0xAC,0x82,0xAD,0x82,0xAE,0x82,0xAF,0x82,0xB0,0x82,0xB1,0x82,0xB2, + 0x82,0xC7,0x82,0xC8,0x82,0xC9,0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x82,0xB3,0x82,0xB4,0x82,0xB5,0x82, + 0xB6,0x82,0xB7,0x82,0xB8,0x82,0xB9,0x82,0xBA,0x82,0xBB,0x82,0xBC,0x82,0xBD,0x82,0xBE,0x82,0xBF,0x82, + 0xC0,0x82,0xC1,0x82,0xC2,0x82,0xC3,0x82,0xC4,0x82,0xC5,0x82,0xC6, + + 0x82,0x6C,0x82,0x6D,0x82,0x6E,0x82,0x6F,0x82,0x70,0x82,0x71,0x82,0x72,0x82,0x73,0x82,0x74,0x82,0x75, + 0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x82,0x76,0x82,0x77,0x82,0x78,0x82,0x79,0x82,0x7A, + 0x82,0x7B,0x82,0x7C,0x82,0x7D,0x82,0x7E,0x82,0x80,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x82,0x81,0x82,0x82,0x82,0x83,0x82,0x84,0x82,0x85,0x82,0x86,0x82,0x87,0x82,0x88,0x82,0x89,0x82,0x8A, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x82,0x8B,0x82,0x8C,0x82,0x8D,0x82,0x8E,0x82,0x8F, + 0x82,0x90,0x82,0x91,0x82,0x92,0x82,0x93,0x82,0x94,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B, + 0x82,0x95,0x82,0x96,0x82,0x97,0x82,0x98,0x82,0x99,0x82,0x9A,0x82,0x9B,0x82,0x9C,0x82,0x9D,0x82,0x9E, + 0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x82,0x9F,0x82,0xA0,0x82,0xA1,0x82,0xA2,0x82,0xA3, + 0x82,0xA4,0x82,0xA5,0x82,0xA6,0x82,0xA7,0x82,0xA8,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0x82,0xA9,0x82,0xAA,0x82,0xAB,0x82,0xAC,0x82,0xAD,0x82,0xAE,0x82,0xAF,0x82,0xB0,0x82,0xB1,0x82,0xB2, + 0x82,0xC7,0x82,0xC8,0x82,0xC9,0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x82,0xB3,0x82,0xB4,0x82,0xB5,0x82, + 0xB6,0x82,0xB7,0x82,0xB8,0x82,0xB9,0x82,0xBA,0x82,0xBB,0x82,0xBC,0x82,0xBD,0x82,0xBE,0x82,0xBF,0x82, + 0xC0,0x82,0xC1,0x82,0xC2,0x82,0xC3,0x82,0xC4,0x82,0xC5,0x82,0xC6, + + 0x82,0x6C,0x82,0x6D,0x82,0x6E,0x82,0x6F,0x82,0x70,0x82,0x71,0x82,0x72,0x82,0x73,0x82,0x74,0x82,0x75, + 0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x82,0x76,0x82,0x77,0x82,0x78,0x82,0x79,0x82,0x7A, + 0x82,0x7B,0x82,0x7C,0x82,0x7D,0x82,0x7E,0x82,0x80,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x82,0x81,0x82,0x82,0x82,0x83,0x82,0x84,0x82,0x85,0x82,0x86,0x82,0x87,0x82,0x88,0x82,0x89,0x82,0x8A, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x82,0x8B,0x82,0x8C,0x82,0x8D,0x82,0x8E,0x82,0x8F, + 0x82,0x90,0x82,0x91,0x82,0x92,0x82,0x93,0x82,0x94,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B, + 0x82,0x95,0x82,0x96,0x82,0x97,0x82,0x98,0x82,0x99,0x82,0x9A,0x82,0x9B,0x82,0x9C,0x82,0x9D,0x82,0x9E, + 0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x82,0x9F,0x82,0xA0,0x82,0xA1,0x82,0xA2,0x82,0xA3, + 0x82,0xA4,0x82,0xA5,0x82,0xA6,0x82,0xA7,0x82,0xA8,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0x82,0xA9,0x82,0xAA,0x82,0xAB,0x82,0xAC,0x82,0xAD,0x82,0xAE,0x82,0xAF,0x82,0xB0,0x82,0xB1,0x82,0xB2, + 0x82,0xC7,0x82,0xC8,0x82,0xC9,0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x82,0xB3,0x82,0xB4,0x82,0xB5,0x82, + 0xB6,0x82,0xB7,0x82,0xB8,0x82,0xB9,0x82,0xBA,0x82,0xBB,0x82,0xBC,0x82,0xBD,0x82,0xBE,0x82,0xBF,0x82, + 0xC0,0x82,0xC1,0x82,0xC2,0x82,0xC3,0x82,0xC4,0x82,0xC5,0x82,0xC6, + + 0x82,0x6C,0x82,0x6D,0x82,0x6E,0x82,0x6F,0x82,0x70,0x82,0x71,0x82,0x72,0x82,0x73,0x82,0x74,0x82,0x75, + 0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x82,0x76,0x82,0x77,0x82,0x78,0x82,0x79,0x82,0x7A, + 0x82,0x7B,0x82,0x7C,0x82,0x7D,0x82,0x7E,0x82,0x80,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x82,0x81,0x82,0x82,0x82,0x83,0x82,0x84,0x82,0x85,0x82,0x86,0x82,0x87,0x82,0x88,0x82,0x89,0x82,0x8A, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x82,0x8B,0x82,0x8C,0x82,0x8D,0x82,0x8E,0x82,0x8F, + 0x82,0x90,0x82,0x91,0x82,0x92,0x82,0x93,0x82,0x94,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B, + 0x82,0x95,0x82,0x96,0x82,0x97,0x82,0x98,0x82,0x99,0x82,0x9A,0x82,0x9B,0x82,0x9C,0x82,0x9D,0x82,0x9E, + 0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x82,0x9F,0x82,0xA0,0x82,0xA1,0x82,0xA2,0x82,0xA3, + 0x82,0xA4,0x82,0xA5,0x82,0xA6,0x82,0xA7,0x82,0xA8,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0x82,0xA9,0x82,0xAA,0x82,0xAB,0x82,0xAC,0x82,0xAD,0x82,0xAE,0x82,0xAF,0x82,0xB0,0x82,0xB1,0x82,0xB2, + 0x82,0xC7,0x82,0xC8,0x82,0xC9,0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x82,0xB3,0x82,0xB4,0x82,0xB5,0x82, + 0xB6,0x82,0xB7,0x82,0xB8,0x82,0xB9,0x82,0xBA,0x82,0xBB,0x82,0xBC,0x82,0xBD,0x82,0xBE,0x82,0xBF,0x82, + 0xC0,0x82,0xC1,0x82,0xC2,0x82,0xC3,0x82,0xC4,0x82,0xC5,0x82,0xC6,0x82,0xC4,0x82, +}; +WCHAR gb2312_uniSource[]={ + 0x2103,0x2116,0x2121,0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166, + 0x2167,0x2168,0x2169,0x216A,0x216B,0x2170,0x2171,0x2172,0x2173,0x2174, + 0x2175,0x2176,0x2177,0x2178,0x2179,0x2190,0x2191,0x2192,0x2193,0x2208, + 0x220F,0x2211,0x221A,0x221D,0x221E,0x2220,0x2225,0x2227,0x2228,0x2229, + 0x222A,0x222B,0x222E,0x2234,0x2235,0x2236,0x2237,0x223D,0x2248,0x224C, + 0x2260,0x2261,0x2264,0x2265,0x226E,0x226F,0x2299,0x22A5,0x2312,0x2460, + 0x2461,0x2462,0x2463,0x2464,0x2465,0x2466,0x2467,0x2468,0x2469,0x2474, + 0x2475,0x2476,0x2477,0x2478,0x2479,0x247A,0x247B,0x247C,0x247D,0x247E, + 0x247F,0x2480,0x2481,0x2482,0x2483,0x2484,0x2485,0x2486,0x2487,0x2488, + 0x2489,0x248A,0x248B,0x248C,0x248D,0x248E,0x248F,0x2490,0x2491,0x2492, + 0x2493,0x2494,0x2495,0x2496,0x2497,0x2498,0x2499,0x249A,0x249B,0x2500, + 0x2501,0x2502,0x2503,0x2504,0x2505,0x2506,0x2507,0x2508,0x2509,0x250A, + 0x250B,0x250C,0x250D,0x250E,0x250F,0x2510,0x2511,0x2512,0x2513,0x2514, + 0x2515,0x2516,0x2517,0x2518,0x2519,0x251A,0x251B,0x251C,0x251D,0x251E, + 0x251F,0x2520,0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527,0x2528, + 0x2529,0x252A,0x252B,0x252C,0x252D,0x252E,0x252F,0x2530,0x2531,0x2532, + 0x2533,0x2534,0x2535,0x2536,0x2537,0x2538,0x2539,0x253A,0x253B,0x253C, + 0x253D,0x253E,0x253F,0x2540,0x2541,0x2542,0x2543,0x2544,0x2545,0x2546, + 0x2547,0x2548,0x2549,0x254A,0x254B,0x25A0,0x25A1,0x25B2,0x25B3,0x25BC, + 0x25BD,0x25C6,0x25C7,0x25CB,0x25CE,0x25CF,0x2605,0x2606,0x2640,0x2642, + 0x0101,0x0113,0x011B,0x012B,0x014D,0x016B,0x01CE,0x01D0,0x01D2,0x01D4, + 0x01D6,0x01D8,0x01DA,0x01DC,0x02C7,0x02C9,0x0391,0x0392,0x0393,0x0394, + 0x0395,0x0396,0x0397,0x0398,0x0399,0x039A,0x039B,0x039C,0x039D,0x039E, + 0x039F,0x03A0,0x03A1,0x03A3,0x03A4,0x03A5,0x03A6,0x03A7,0x03A8,0x03A9, + 0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6,0x03B7,0x03B8,0x03B9,0x03BA, + + 0x2103,0x2116,0x2121,0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166, + 0x2167,0x2168,0x2169,0x216A,0x216B,0x2170,0x2171,0x2172,0x2173,0x2174, + 0x2175,0x2176,0x2177,0x2178,0x2179,0x2190,0x2191,0x2192,0x2193,0x2208, + 0x220F,0x2211,0x221A,0x221D,0x221E,0x2220,0x2225,0x2227,0x2228,0x2229, + 0x222A,0x222B,0x222E,0x2234,0x2235,0x2236,0x2237,0x223D,0x2248,0x224C, + 0x2260,0x2261,0x2264,0x2265,0x226E,0x226F,0x2299,0x22A5,0x2312,0x2460, + 0x2461,0x2462,0x2463,0x2464,0x2465,0x2466,0x2467,0x2468,0x2469,0x2474, + 0x2475,0x2476,0x2477,0x2478,0x2479,0x247A,0x247B,0x247C,0x247D,0x247E, + 0x247F,0x2480,0x2481,0x2482,0x2483,0x2484,0x2485,0x2486,0x2487,0x2488, + 0x2489,0x248A,0x248B,0x248C,0x248D,0x248E,0x248F,0x2490,0x2491,0x2492, + 0x2493,0x2494,0x2495,0x2496,0x2497,0x2498,0x2499,0x249A,0x249B,0x2500, + 0x2501,0x2502,0x2503,0x2504,0x2505,0x2506,0x2507,0x2508,0x2509,0x250A, + 0x250B,0x250C,0x250D,0x250E,0x250F,0x2510,0x2511,0x2512,0x2513,0x2514, + 0x2515,0x2516,0x2517,0x2518,0x2519,0x251A,0x251B,0x251C,0x251D,0x251E, + 0x251F,0x2520,0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527,0x2528, + 0x2529,0x252A,0x252B,0x252C,0x252D,0x252E,0x252F,0x2530,0x2531,0x2532, + 0x2533,0x2534,0x2535,0x2536,0x2537,0x2538,0x2539,0x253A,0x253B,0x253C, + 0x253D,0x253E,0x253F,0x2540,0x2541,0x2542,0x2543,0x2544,0x2545,0x2546, + 0x2547,0x2548,0x2549,0x254A,0x254B,0x25A0,0x25A1,0x25B2,0x25B3,0x25BC, + 0x25BD,0x25C6,0x25C7,0x25CB,0x25CE,0x25CF,0x2605,0x2606,0x2640,0x2642, + 0x0101,0x0113,0x011B,0x012B,0x014D,0x016B,0x01CE,0x01D0,0x01D2,0x01D4, + 0x01D6,0x01D8,0x01DA,0x01DC,0x02C7,0x02C9,0x0391,0x0392,0x0393,0x0394, + 0x0395,0x0396,0x0397,0x0398,0x0399,0x039A,0x039B,0x039C,0x039D,0x039E, + 0x039F,0x03A0,0x03A1,0x03A3,0x03A4,0x03A5,0x03A6,0x03A7,0x03A8,0x03A9, + 0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6,0x03B7,0x03B8,0x03B9,0x03BA, + + 0x2103,0x2116,0x2121,0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166, + 0x2167,0x2168,0x2169,0x216A,0x216B,0x2170,0x2171,0x2172,0x2173,0x2174, + 0x2175,0x2176,0x2177,0x2178,0x2179,0x2190,0x2191,0x2192,0x2193,0x2208, + 0x220F,0x2211,0x221A,0x221D,0x221E,0x2220,0x2225,0x2227,0x2228,0x2229, + 0x222A,0x222B,0x222E,0x2234,0x2235,0x2236,0x2237,0x223D,0x2248,0x224C, + 0x2260,0x2261,0x2264,0x2265,0x226E,0x226F,0x2299,0x22A5,0x2312,0x2460, + 0x2461,0x2462,0x2463,0x2464,0x2465,0x2466,0x2467,0x2468,0x2469,0x2474, + 0x2475,0x2476,0x2477,0x2478,0x2479,0x247A,0x247B,0x247C,0x247D,0x247E, + 0x247F,0x2480,0x2481,0x2482,0x2483,0x2484,0x2485,0x2486,0x2487,0x2488, + 0x2489,0x248A,0x248B,0x248C,0x248D,0x248E,0x248F,0x2490,0x2491,0x2492, + 0x2493,0x2494,0x2495,0x2496,0x2497,0x2498,0x2499,0x249A,0x249B,0x2500, + 0x2501,0x2502,0x2503,0x2504,0x2505,0x2506,0x2507,0x2508,0x2509,0x250A, + 0x250B,0x250C,0x250D,0x250E,0x250F,0x2510,0x2511,0x2512,0x2513,0x2514, + 0x2515,0x2516,0x2517,0x2518,0x2519,0x251A,0x251B,0x251C,0x251D,0x251E, + 0x251F,0x2520,0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527,0x2528, + 0x2529,0x252A,0x252B,0x252C,0x252D,0x252E,0x252F,0x2530,0x2531,0x2532, + 0x2533,0x2534,0x2535,0x2536,0x2537,0x2538,0x2539,0x253A,0x253B,0x253C, + 0x253D,0x253E,0x253F,0x2540,0x2541,0x2542,0x2543,0x2544,0x2545,0x2546, + 0x2547,0x2548,0x2549,0x254A,0x254B,0x25A0,0x25A1,0x25B2,0x25B3,0x25BC, + 0x25BD,0x25C6,0x25C7,0x25CB,0x25CE,0x25CF,0x2605,0x2606,0x2640,0x2642, + 0x0101,0x0113,0x011B,0x012B,0x014D,0x016B,0x01CE,0x01D0,0x01D2,0x01D4, + 0x01D6,0x01D8,0x01DA,0x01DC,0x02C7,0x02C9,0x0391,0x0392,0x0393,0x0394, + 0x0395,0x0396,0x0397,0x0398,0x0399,0x039A,0x039B,0x039C,0x039D,0x039E, + 0x039F,0x03A0,0x03A1,0x03A3,0x03A4,0x03A5,0x03A6,0x03A7,0x03A8,0x03A9, + 0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6,0x03B7,0x03B8,0x03B9,0x03BA, + + 0x2103,0x2116,0x2121,0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166, + 0x2167,0x2168,0x2169,0x216A,0x216B,0x2170,0x2171,0x2172,0x2173,0x2174, + 0x2175,0x2176,0x2177,0x2178,0x2179,0x2190,0x2191,0x2192,0x2193,0x2208, + 0x220F,0x2211,0x221A,0x221D,0x221E,0x2220,0x2225,0x2227,0x2228,0x2229, + 0x222A,0x222B,0x222E,0x2234,0x2235,0x2236,0x2237,0x223D,0x2248,0x224C, + 0x2260,0x2261,0x2264,0x2265,0x226E,0x226F,0x2299,0x22A5,0x2312,0x2460, + 0x2461,0x2462,0x2463,0x2464,0x2465,0x2466,0x2467,0x2468,0x2469,0x2474, + 0x2475,0x2476,0x2477,0x2478,0x2479,0x247A,0x247B,0x247C,0x247D,0x247E, + 0x247F,0x2480,0x2481,0x2482,0x2483,0x2484,0x2485,0x2486,0x2487,0x2488, + 0x2489,0x248A,0x248B,0x248C,0x248D,0x248E,0x248F,0x2490,0x2491,0x2492, + 0x2493,0x2494,0x2495,0x2496,0x2497,0x2498,0x2499,0x249A,0x249B,0x2500, + 0x2501,0x2502,0x2503,0x2504,0x2505,0x2506,0x2507,0x2508,0x2509,0x250A, + 0x250B,0x250C,0x250D,0x250E,0x250F,0x2510,0x2511,0x2512,0x2513,0x2514, + 0x2515,0x2516,0x2517,0x2518,0x2519,0x251A,0x251B,0x251C,0x251D,0x251E, + 0x251F,0x2520,0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527,0x2528, + 0x2529,0x252A,0x252B,0x252C,0x252D,0x252E,0x252F,0x2530,0x2531,0x2532, + 0x2533,0x2534,0x2535,0x2536,0x2537,0x2538,0x2539,0x253A,0x253B,0x253C, + 0x253D,0x253E,0x253F,0x2540,0x2541,0x2542,0x2543,0x2544,0x2545,0x2546, + 0x2547,0x2548,0x2549,0x254A,0x254B,0x25A0,0x25A1,0x25B2,0x25B3,0x25BC, + 0x25BD,0x25C6,0x25C7,0x25CB,0x25CE,0x25CF,0x2605,0x2606,0x2640,0x2642, + 0x0101,0x0113,0x011B,0x012B,0x014D,0x016B,0x01CE,0x01D0,0x01D2,0x01D4, + 0x01D6,0x01D8,0x01DA,0x01DC,0x02C7,0x02C9,0x0391,0x0392,0x0393,0x0394, + 0x0395,0x0396,0x0397,0x0398,0x0399,0x039A,0x039B,0x039C,0x039D,0x039E, + 0x039F,0x03A0,0x03A1,0x03A3,0x03A4,0x03A5,0x03A6,0x03A7,0x03A8,0x03A9, + 0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6,0x03B7,0x03B8,0x03B9,0x03BA, + + 0x2103,0x2116,0x2121,0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166, + 0x2167,0x2168,0x2169,0x216A,0x216B,0x2170,0x2171,0x2172,0x2173,0x2174, + 0x2175,0x2176,0x2177,0x2178, +}; + +WCHAR gb2312_uniSmSource[]={ + 0x4FF5,0x4FF6,0x4FF7,0x4FF9,0x4FFB,0x4FFC,0x4FFD,0x4FFF,0x5000,0x5001, + 0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D +}; +unsigned char gb2312_encSmSource[]={ + 0x82,0x6C,0x82,0x6D,0x82,0x6E,0x82,0x6F,0x82,0x70,0x82,0x71,0x82,0x72,0x82,0x73,0x82,0x74,0x82,0x75 +}; + +unsigned char latin1_encSource[]={ + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + 0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + 0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + 0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + 0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + 0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + 0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + 0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + 0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40, + +}; + +WCHAR latin1_uniSource[]={ + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + 0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E, + 0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + 0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E, + 0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + 0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E, + 0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + 0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E, + 0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + 0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E, + 0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + 0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E, + 0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + 0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E, + 0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + 0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E, + 0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040 + +}; + +unsigned char latin2_encSource[]={ + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + 0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + 0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + 0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + 0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + 0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + 0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + 0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + 0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40, + + +}; +WCHAR latin2_uniSource[]={ + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + 0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E, + 0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + 0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E, + 0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + 0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E, + 0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + 0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E, + 0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + 0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E, + 0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + 0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E, + 0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + 0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E, + 0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + 0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E, + 0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x0015,0x0016,0x0017,0x0018, + +}; + +unsigned char latin3_encSource[]={ + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18, + + +}; +WCHAR latin3_uniSource[]={ + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018, + +}; + +unsigned char latin4_encSource[]={ + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18, +}; +WCHAR latin4_uniSource[]={ + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018, +}; + unsigned char latin5_encSource[]={ + 0xCC,0xCD,0xCE,0xCF,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDF,0xE0,0xE1,0xE2, + 0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7, + 0xF8,0xF9,0xFA,0xFB,0xFC,0xFF,0xD0,0xF0,0xDD,0xFD,0xDE,0xFE,0xCC,0xCD,0xCE,0xCF,0xD1,0xD2,0xD3,0xD4, + 0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA, + 0xEB,0xEC,0xED,0xEE,0xEF,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFF,0xD0,0xF0, + 0xDD,0xFD,0xDE,0xFE,0xCC,0xCD,0xCE,0xCF,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC, + 0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF1,0xF2,0xF3, + 0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFF,0xD0,0xF0,0xDD,0xFD,0xDE,0xFE,0xCC,0xCD,0xCE,0xCF, + 0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6, + 0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB, + 0xFC,0xFF,0xD0,0xF0,0xDD,0xFD,0xDE,0xFE,0xCC,0xCD,0xCE,0xCF,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8, + 0xD9,0xDA,0xDB,0xDC,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE, + 0xEF,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFF,0xD0,0xF0,0xDD,0xFD,0xDE,0xFE, + 0xCC,0xCD,0xCE,0xCF,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDF,0xE0,0xE1,0xE2, + 0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7, + 0xF8,0xF9,0xFA,0xFB,0xFC,0xFF,0xD0,0xF0,0xDD,0xFD,0xDE,0xFE,0xCC,0xCD,0xCE,0xCF,0xD1,0xD2,0xD3,0xD4, + 0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA, + 0xEB,0xEC,0xED,0xEE,0xEF,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFF,0xD0,0xF0, + 0xDD,0xFD,0xDE,0xFE,0xCC,0xCD,0xCE,0xCF,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC, + 0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF1,0xF2,0xF3, + 0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFF,0xD0,0xF0,0xDD,0xFD,0xDE,0xFE,0xCC,0xCD,0xCE,0xCF, + 0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6, + 0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB, + 0xFC,0xFF,0xD0,0xF0,0xDD,0xFD,0xDE,0xFE,0xCC,0xCD,0xCE,0xCF,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8, + 0xD9,0xDA,0xDB,0xDC,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE, + 0xEF,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFF,0xD0,0xF0,0xDD,0xFD,0xDE,0xFE, + 0xCC,0xCD,0xCE,0xCF,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDF,0xE0,0xE1,0xE2, + 0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7, + 0xF8,0xF9,0xFA,0xFB,0xFC,0xFF,0xD0,0xF0,0xDD,0xFD,0xDE,0xFE,0xCC,0xCD,0xCE,0xCF,0xD1,0xD2,0xD3,0xD4, + 0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA, + 0xEB,0xEC,0xED,0xEE,0xEF,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFF,0xD0,0xF0, + 0xDD,0xFD,0xDE,0xFE,0xCC,0xCD,0xCE,0xCF,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC, + 0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF1,0xF2,0xF3, + 0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFF,0xD0,0xF0,0xDD,0xFD,0xDE,0xFE,0xCC,0xCD,0xCE,0xCF, + 0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6, + 0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB, + 0xFC,0xFF,0xD0,0xF0,0xDD,0xFD,0xDE,0xFE,0xCC,0xCD,0xCE,0xCF,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8, + 0xD9,0xDA,0xDB,0xDC,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE, + 0xEF,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFF,0xD0,0xF0,0xDD,0xFD,0xDE,0xFE, + 0xCC,0xCD,0xCE,0xCF,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDF,0xE0,0xE1,0xE2, + 0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7, + 0xF8,0xF9,0xFA,0xFB,0xFC,0xFF,0xD0,0xF0,0xDD,0xFD,0xDE,0xFE,0xCC,0xCD,0xCE,0xCF,0xD1,0xD2,0xD3,0xD4, + 0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA, + 0xEB,0xEC,0xED,0xEE,0xEF,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFF,0xD0,0xF0, + 0xDD,0xFD,0xDE,0xFE,0xCC,0xCD,0xCE,0xCF,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC, + 0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF1,0xF2,0xF3, + 0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFF,0xD0,0xF0,0xDD,0xFD,0xDE,0xFE,0xCC,0xCD,0xCE,0xCF, + 0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6, + 0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB, + 0xFC,0xFF,0xD0,0xF0,0xDD,0xFD,0xDE,0xFE,0xCC,0xCD,0xCE,0xCF,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8, + 0xD9,0xDA,0xDB,0xDC,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE, + 0xEF,0xF1,0xF2,0xF3 + +}; + +WCHAR latin5_uniSource[]={ + 0x2116,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009, + 0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013, + 0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D, + 0x001E,0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031, + 0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B, + 0x003C,0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045, + 0x0046,0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059, + 0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063, + 0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D, + 0x006E,0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,0x0080,0x0081, + 0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A,0x008B, + 0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,0x0092,0x0093,0x0094,0x0095, + 0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F, + 0x00A0,0x00A7,0x00AD,0x0401,0x0402,0x0403,0x0404,0x0405,0x0406,0x0407, + 0x0408,0x0409,0x040A,0x040B,0x040C,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,0x0451,0x0452,0x0453,0x0454,0x0455,0x0456,0x0457,0x0458,0x0459, + /**/ + 0x2116,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009, + 0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013, + 0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D, + 0x001E,0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031, + 0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B, + 0x003C,0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045, + 0x0046,0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059, + 0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063, + 0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D, + 0x006E,0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,0x0080,0x0081, + 0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A,0x008B, + 0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,0x0092,0x0093,0x0094,0x0095, + 0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F, + 0x00A0,0x00A7,0x00AD,0x0401,0x0402,0x0403,0x0404,0x0405,0x0406,0x0407, + 0x0408,0x0409,0x040A,0x040B,0x040C,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,0x0451,0x0452,0x0453,0x0454,0x0455,0x0456,0x0457,0x0458,0x0459, + /**/ + 0x2116,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009, + 0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013, + 0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D, + 0x001E,0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031, + 0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B, + 0x003C,0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045, + 0x0046,0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059, + 0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063, + 0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D, + 0x006E,0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,0x0080,0x0081, + 0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A,0x008B, + 0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,0x0092,0x0093,0x0094,0x0095, + 0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F, + 0x00A0,0x00A7,0x00AD,0x0401,0x0402,0x0403,0x0404,0x0405,0x0406,0x0407, + 0x0408,0x0409,0x040A,0x040B,0x040C,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,0x0451,0x0452,0x0453,0x0454,0x0455,0x0456,0x0457,0x0458,0x0459, + /**/ + 0x2116,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009, + 0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013, + 0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D, + 0x001E,0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031, + 0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B, + 0x003C,0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045, + 0x0046,0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059, + 0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063, + 0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D, + 0x006E,0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,0x0080,0x0081, + 0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A,0x008B, + 0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,0x0092,0x0093,0x0094,0x0095, + 0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F, + 0x00A0,0x00A7,0x00AD,0x0401,0x0402,0x0403,0x0404,0x0405,0x0406,0x0407, + 0x0408,0x0409,0x040A,0x040B,0x040C,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,0x0451,0x0452,0x0453,0x0454,0x0455,0x0456,0x0457,0x0458,0x0459, + /**/ + 0x2116,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009, + 0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013, + 0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D, + 0x001E,0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031, + 0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B, + 0x003C,0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045, + 0x0046,0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059, + 0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063, + 0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D, + 0x006E,0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,0x0080,0x0081, + 0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A,0x008B, + 0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,0x0092,0x0093,0x0094,0x0095, + 0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F, + 0x00A0,0x00A7,0x00AD,0x0401,0x0402,0x0403,0x0404,0x0405,0x0406,0x0407, + 0x0408,0x0409,0x040A,0x040B,0x040C,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,0x0451,0x0452,0x0453,0x0454,0x0455,0x0456,0x0457,0x0458,0x0459, + /**/ + 0x2116,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009, + 0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013, + 0x0014,0x0015,0x0016,0x0017, + +}; +unsigned char latin6_encSource[]={ + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73, + 0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B, + 0x9C,0x9D,0x9E,0x9F,0xA0,0xA4,0xAD,0xAC,0xBB,0xBF,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA, + 0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xE0,0xE1,0xE2,0xE3, + + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73, + 0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B, + 0x9C,0x9D,0x9E,0x9F,0xA0,0xA4,0xAD,0xAC,0xBB,0xBF,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA, + 0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xE0,0xE1,0xE2,0xE3, + + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73, + 0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B, + 0x9C,0x9D,0x9E,0x9F,0xA0,0xA4,0xAD,0xAC,0xBB,0xBF,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA, + 0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xE0,0xE1,0xE2,0xE3, + + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73, + 0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B, + 0x9C,0x9D,0x9E,0x9F,0xA0,0xA4,0xAD,0xAC,0xBB,0xBF,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA, + 0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xE0,0xE1,0xE2,0xE3, + + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73, + 0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B, + 0x9C,0x9D,0x9E,0x9F,0xA0,0xA4,0xAD,0xAC,0xBB,0xBF,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA, + 0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xE0,0xE1,0xE2,0xE3, + + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73, + 0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B, + 0x9C,0x9D,0x9E,0x9F,0xA0,0xA4,0xAD,0xAC,0xBB,0xBF,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA, + 0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xE0,0xE1,0xE2,0xE3, + + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73, + 0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B, + 0x9C,0x9D,0x9E,0x9F,0xA0,0xA4,0xAD,0xAC,0xBB,0xBF,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA, + 0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xE0,0xE1,0xE2,0xE3, + + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73, + 0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B, + 0x9C,0x9D,0x9E,0x9F,0xA0,0xA4,0xAD,0xAC,0xBB,0xBF,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA, + 0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xE0,0xE1,0xE2,0xE3, + + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73, + 0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B, + 0x9C,0x9D,0x9E,0x9F,0xA0,0xA4,0xAD,0xAC,0xBB,0xBF,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA, + 0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xE0,0xE1,0xE2,0xE3, + + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73, + 0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B, + 0x9C,0x9D,0x9E,0x9F,0xA0,0xA4,0xAD,0xAC,0xBB,0xBF,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA, + 0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xE0,0xE1,0xE2,0xE3, + + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73, + 0x74,0x75,0x76,0x77, +}; +WCHAR latin6_uniSource[]={ + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069, + 0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,0x0070,0x0071,0x0072,0x0073, + 0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007A,0x007B,0x007C,0x007D, + 0x007E,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + 0x009C,0x009D,0x009E,0x009F,0x00A0,0x00A4,0x00AD,0x060C,0x061B,0x061F, + 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,0x0640,0x0641,0x0642,0x0643, + + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069, + 0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,0x0070,0x0071,0x0072,0x0073, + 0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007A,0x007B,0x007C,0x007D, + 0x007E,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + 0x009C,0x009D,0x009E,0x009F,0x00A0,0x00A4,0x00AD,0x060C,0x061B,0x061F, + 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,0x0640,0x0641,0x0642,0x0643, + + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069, + 0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,0x0070,0x0071,0x0072,0x0073, + 0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007A,0x007B,0x007C,0x007D, + 0x007E,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + 0x009C,0x009D,0x009E,0x009F,0x00A0,0x00A4,0x00AD,0x060C,0x061B,0x061F, + 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,0x0640,0x0641,0x0642,0x0643, + + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069, + 0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,0x0070,0x0071,0x0072,0x0073, + 0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007A,0x007B,0x007C,0x007D, + 0x007E,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + 0x009C,0x009D,0x009E,0x009F,0x00A0,0x00A4,0x00AD,0x060C,0x061B,0x061F, + 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,0x0640,0x0641,0x0642,0x0643, + + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069, + 0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,0x0070,0x0071,0x0072,0x0073, + 0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007A,0x007B,0x007C,0x007D, + 0x007E,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + 0x009C,0x009D,0x009E,0x009F,0x00A0,0x00A4,0x00AD,0x060C,0x061B,0x061F, + 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,0x0640,0x0641,0x0642,0x0643, + + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069, + 0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,0x0070,0x0071,0x0072,0x0073, + 0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007A,0x007B,0x007C,0x007D, + 0x007E,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + 0x009C,0x009D,0x009E,0x009F,0x00A0,0x00A4,0x00AD,0x060C,0x061B,0x061F, + 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,0x0640,0x0641,0x0642,0x0643, + + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069, + 0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,0x0070,0x0071,0x0072,0x0073, + 0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007A,0x007B,0x007C,0x007D, + 0x007E,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + 0x009C,0x009D,0x009E,0x009F,0x00A0,0x00A4,0x00AD,0x060C,0x061B,0x061F, + 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,0x0640,0x0641,0x0642,0x0643, + + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069, + 0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,0x0070,0x0071,0x0072,0x0073, + 0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007A,0x007B,0x007C,0x007D, + 0x007E,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + 0x009C,0x009D,0x009E,0x009F,0x00A0,0x00A4,0x00AD,0x060C,0x061B,0x061F, + 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,0x0640,0x0641,0x0642,0x0643, + + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069, + 0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,0x0070,0x0071,0x0072,0x0073, + 0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007A,0x007B,0x007C,0x007D, + 0x007E,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + 0x009C,0x009D,0x009E,0x009F,0x00A0,0x00A4,0x00AD,0x060C,0x061B,0x061F, + 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,0x0640,0x0641,0x0642,0x0643, + + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069, + 0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,0x0070,0x0071,0x0072,0x0073, + 0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007A,0x007B,0x007C,0x007D, + 0x007E,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + 0x009C,0x009D,0x009E,0x009F,0x00A0,0x00A4,0x00AD,0x060C,0x061B,0x061F, + 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,0x0640,0x0641,0x0642,0x0643, + + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069, + 0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,0x0070,0x0071,0x0072,0x0073, + 0x0074,0x0075,0x0076,0x0077 +}; + +unsigned char latin7_encSource[]={ + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + 0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78, + 0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C, + 0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xA0, + 0xA3,0xA6,0xA7,0xA8,0xA9,0xAB,0xAC,0xAD,0xB0,0xB1,0xB2,0xB3,0xB4,0xBB,0xBD,0xB5,0xB6,0xB7,0xB8,0xB9, + 0xBA,0xBC,0xBE,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, + 0xD0,0xD1,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4, + 0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8, + 0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xF5,0xF6,0xF7,0xF8,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A, + 0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E, + 0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32, + 0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46, + 0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A, + 0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E, + 0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80,0x81,0x82, + 0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96, + 0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xA0,0xA3,0xA6,0xA7,0xA8,0xA9,0xAB,0xAC,0xAD,0xB0,0xB1, + 0xB2,0xB3,0xB4,0xBB,0xBD,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBC,0xBE,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5, + 0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA, + 0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE, + 0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xF5,0xF6,0xF7,0xF8, + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, + 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64, + 0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78, + 0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C, + 0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xA0, + 0xA3,0xA6,0xA7,0xA8,0xA9,0xAB,0xAC,0xAD,0xB0,0xB1,0xB2,0xB3,0xB4,0xBB,0xBD,0xB5,0xB6,0xB7,0xB8,0xB9, + 0xBA,0xBC,0xBE,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, + 0xD0,0xD1,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4, + 0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8, + 0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xF5,0xF6,0xF7,0xF8,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A, + 0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E, + 0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32, + 0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46, + 0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A, + 0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E, + 0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80,0x81,0x82, + 0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96, + 0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xA0,0xA3,0xA6,0xA7,0xA8,0xA9,0xAB,0xAC,0xAD,0xB0,0xB1, + 0xB2,0xB3,0xB4,0xBB,0xBD,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBC,0xBE,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5, + 0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA, + 0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE, + 0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xF5,0xF6,0xF7,0xF8, + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A, + 0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18, + + +}; +WCHAR latin7_uniSource[]={ + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + 0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E, + 0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078, + 0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,0x0080,0x0081,0x0082, + 0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A,0x008B,0x008C, + 0x008D,0x008E,0x008F,0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096, + 0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F,0x00A0, + 0x00A3,0x00A6,0x00A7,0x00A8,0x00A9,0x00AB,0x00AC,0x00AD,0x00B0,0x00B1, + 0x00B2,0x00B3,0x0384,0x00BB,0x00BD,0x0385,0x0386,0x00B7,0x0388,0x0389, + 0x038A,0x038C,0x038E,0x038F,0x0390,0x0391,0x0392,0x0393,0x0394,0x0395, + 0x0396,0x0397,0x0398,0x0399,0x039A,0x039B,0x039C,0x039D,0x039E,0x039F, + 0x03A0,0x03A1,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,0x03C5,0x03C6,0x03C7,0x03C8, + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + 0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E, + 0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078, + 0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,0x0080,0x0081,0x0082, + 0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A,0x008B,0x008C, + 0x008D,0x008E,0x008F,0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096, + 0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F,0x00A0, + 0x00A3,0x00A6,0x00A7,0x00A8,0x00A9,0x00AB,0x00AC,0x00AD,0x00B0,0x00B1, + 0x00B2,0x00B3,0x0384,0x00BB,0x00BD,0x0385,0x0386,0x00B7,0x0388,0x0389, + 0x038A,0x038C,0x038E,0x038F,0x0390,0x0391,0x0392,0x0393,0x0394,0x0395, + 0x0396,0x0397,0x0398,0x0399,0x039A,0x039B,0x039C,0x039D,0x039E,0x039F, + 0x03A0,0x03A1,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,0x03C5,0x03C6,0x03C7,0x03C8, + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + 0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E, + 0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078, + 0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,0x0080,0x0081,0x0082, + 0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A,0x008B,0x008C, + 0x008D,0x008E,0x008F,0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096, + 0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F,0x00A0, + 0x00A3,0x00A6,0x00A7,0x00A8,0x00A9,0x00AB,0x00AC,0x00AD,0x00B0,0x00B1, + 0x00B2,0x00B3,0x0384,0x00BB,0x00BD,0x0385,0x0386,0x00B7,0x0388,0x0389, + 0x038A,0x038C,0x038E,0x038F,0x0390,0x0391,0x0392,0x0393,0x0394,0x0395, + 0x0396,0x0397,0x0398,0x0399,0x039A,0x039B,0x039C,0x039D,0x039E,0x039F, + 0x03A0,0x03A1,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,0x03C5,0x03C6,0x03C7,0x03C8, + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E, + 0x001F,0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028, + 0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,0x0030,0x0031,0x0032, + 0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C, + 0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046, + 0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,0x0050, + 0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A, + 0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062,0x0063,0x0064, + 0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E, + 0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078, + 0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,0x0080,0x0081,0x0082, + 0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A,0x008B,0x008C, + 0x008D,0x008E,0x008F,0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096, + 0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F,0x00A0, + 0x00A3,0x00A6,0x00A7,0x00A8,0x00A9,0x00AB,0x00AC,0x00AD,0x00B0,0x00B1, + 0x00B2,0x00B3,0x0384,0x00BB,0x00BD,0x0385,0x0386,0x00B7,0x0388,0x0389, + 0x038A,0x038C,0x038E,0x038F,0x0390,0x0391,0x0392,0x0393,0x0394,0x0395, + 0x0396,0x0397,0x0398,0x0399,0x039A,0x039B,0x039C,0x039D,0x039E,0x039F, + 0x03A0,0x03A1,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,0x03C5,0x03C6,0x03C7,0x03C8, + 0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A, + 0x000B,0x000C,0x000D,0x000E,0x000F,0x0010,0x0011,0x0012,0x0013,0x0014, + 0x0015,0x0016,0x0017,0x0018 + }; + +unsigned char latin8_encSource[]={ + 0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58, + 0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C, + 0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80, + 0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94, + 0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xA0,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9, + + 0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58, + 0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C, + 0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80, + 0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94, + 0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xA0,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9, + + 0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58, + 0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C, + 0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80, + 0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94, + 0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xA0,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9, + + 0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58, + 0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C, + 0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80, + 0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94, + 0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xA0,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9, + + 0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58, + 0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C, + 0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80, + 0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94, + 0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xA0,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9, + + 0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58, + 0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C, + 0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80, + 0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94, + 0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xA0,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9, + + 0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58, + 0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C, + 0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80, + 0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94, + 0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xA0,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9, + + 0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58, + 0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C, + 0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80, + 0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94, + 0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xA0,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9, + + 0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58, + 0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C, + 0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80, + 0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94, + 0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xA0,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9, + + 0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58, + 0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C, + 0x6D,0x6E,0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80, + 0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94, + 0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xA0,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9, + + 0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58, + 0x59,0x5A,0x5B,0x5C, + +}; +WCHAR latin8_uniSource[]={ + 0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E, + 0x004F,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058, + 0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062, + 0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C, + 0x006D,0x006E,0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076, + 0x0077,0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,0x0080, + 0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A, + 0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,0x0092,0x0093,0x0094, + 0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E, + 0x009F,0x00A0,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7,0x00A8,0x00A9, + + 0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E, + 0x004F,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058, + 0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062, + 0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C, + 0x006D,0x006E,0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076, + 0x0077,0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,0x0080, + 0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A, + 0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,0x0092,0x0093,0x0094, + 0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E, + 0x009F,0x00A0,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7,0x00A8,0x00A9, + + 0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E, + 0x004F,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058, + 0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062, + 0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C, + 0x006D,0x006E,0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076, + 0x0077,0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,0x0080, + 0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A, + 0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,0x0092,0x0093,0x0094, + 0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E, + 0x009F,0x00A0,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7,0x00A8,0x00A9, + + 0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E, + 0x004F,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058, + 0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062, + 0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C, + 0x006D,0x006E,0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076, + 0x0077,0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,0x0080, + 0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A, + 0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,0x0092,0x0093,0x0094, + 0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E, + 0x009F,0x00A0,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7,0x00A8,0x00A9, + + 0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E, + 0x004F,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058, + 0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062, + 0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C, + 0x006D,0x006E,0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076, + 0x0077,0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,0x0080, + 0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A, + 0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,0x0092,0x0093,0x0094, + 0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E, + 0x009F,0x00A0,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7,0x00A8,0x00A9, + + 0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E, + 0x004F,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058, + 0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062, + 0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C, + 0x006D,0x006E,0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076, + 0x0077,0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,0x0080, + 0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A, + 0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,0x0092,0x0093,0x0094, + 0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E, + 0x009F,0x00A0,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7,0x00A8,0x00A9, + + 0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E, + 0x004F,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058, + 0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062, + 0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C, + 0x006D,0x006E,0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076, + 0x0077,0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,0x0080, + 0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A, + 0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,0x0092,0x0093,0x0094, + 0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E, + 0x009F,0x00A0,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7,0x00A8,0x00A9, + + 0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E, + 0x004F,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058, + 0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062, + 0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C, + 0x006D,0x006E,0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076, + 0x0077,0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,0x0080, + 0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A, + 0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,0x0092,0x0093,0x0094, + 0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E, + 0x009F,0x00A0,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7,0x00A8,0x00A9, + + 0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E, + 0x004F,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058, + 0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062, + 0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C, + 0x006D,0x006E,0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076, + 0x0077,0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,0x0080, + 0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A, + 0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,0x0092,0x0093,0x0094, + 0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E, + 0x009F,0x00A0,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7,0x00A8,0x00A9, + + 0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E, + 0x004F,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058, + 0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,0x0060,0x0061,0x0062, + 0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C, + 0x006D,0x006E,0x006F,0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076, + 0x0077,0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,0x0080, + 0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A, + 0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,0x0092,0x0093,0x0094, + 0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E, + 0x009F,0x00A0,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7,0x00A8,0x00A9, + + 0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E, + 0x004F,0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058, + 0x0059,0x005A,0x005B,0x005C, +}; +unsigned char ebcdic_arabic_encSource[]={ + 0x87,0x88,0x89,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9, + 0x4F,0x07,0x20,0x21,0x22,0x23,0x24,0x15,0x06,0x17,0x28,0x29,0x2A,0x2B,0x2C,0x09,0x0A,0x1B,0x30,0x31, + 0x1A,0x33,0x34,0x35,0x36,0x08,0x38,0x39,0x3A,0x3B,0x04,0x14,0x3E,0xFF,0x41,0x4A,0x6A,0x5F,0xCA,0xE0, + 0xA1,0x79,0xC0,0xD0,0x36,0x08,0x38,0x39,0x3A,0x3B,0x04,0x14,0x3E,0xFF,0x41,0x4A,0x6A,0x5F,0xCA,0xE0, + 0x4F,0x07,0x20,0x21,0x22,0x23,0x24,0x15,0x06,0x17,0x28,0x29,0x2A,0x2B,0x2C,0x09,0x0A,0x1B,0x30,0x31, + + 0x87,0x88,0x89,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9, + 0x4F,0x07,0x20,0x21,0x22,0x23,0x24,0x15,0x06,0x17,0x28,0x29,0x2A,0x2B,0x2C,0x09,0x0A,0x1B,0x30,0x31, + 0x1A,0x33,0x34,0x35,0x36,0x08,0x38,0x39,0x3A,0x3B,0x04,0x14,0x3E,0xFF,0x41,0x4A,0x6A,0x5F,0xCA,0xE0, + 0xA1,0x79,0xC0,0xD0,0x36,0x08,0x38,0x39,0x3A,0x3B,0x04,0x14,0x3E,0xFF,0x41,0x4A,0x6A,0x5F,0xCA,0xE0, + 0x4F,0x07,0x20,0x21,0x22,0x23,0x24,0x15,0x06,0x17,0x28,0x29,0x2A,0x2B,0x2C,0x09,0x0A,0x1B,0x30,0x31, + + 0x87,0x88,0x89,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9, + 0x4F,0x07,0x20,0x21,0x22,0x23,0x24,0x15,0x06,0x17,0x28,0x29,0x2A,0x2B,0x2C,0x09,0x0A,0x1B,0x30,0x31, + 0x1A,0x33,0x34,0x35,0x36,0x08,0x38,0x39,0x3A,0x3B,0x04,0x14,0x3E,0xFF,0x41,0x4A,0x6A,0x5F,0xCA,0xE0, + 0xA1,0x79,0xC0,0xD0,0x36,0x08,0x38,0x39,0x3A,0x3B,0x04,0x14,0x3E,0xFF,0x41,0x4A,0x6A,0x5F,0xCA,0xE0, + 0x4F,0x07,0x20,0x21,0x22,0x23,0x24,0x15,0x06,0x17,0x28,0x29,0x2A,0x2B,0x2C,0x09,0x0A,0x1B,0x30,0x31, + + 0x87,0x88,0x89,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9, + 0x4F,0x07,0x20,0x21,0x22,0x23,0x24,0x15,0x06,0x17,0x28,0x29,0x2A,0x2B,0x2C,0x09,0x0A,0x1B,0x30,0x31, + 0x1A,0x33,0x34,0x35,0x36,0x08,0x38,0x39,0x3A,0x3B,0x04,0x14,0x3E,0xFF,0x41,0x4A,0x6A,0x5F,0xCA,0xE0, + 0xA1,0x79,0xC0,0xD0,0x36,0x08,0x38,0x39,0x3A,0x3B,0x04,0x14,0x3E,0xFF,0x41,0x4A,0x6A,0x5F,0xCA,0xE0, + 0x4F,0x07,0x20,0x21,0x22,0x23,0x24,0x15,0x06,0x17,0x28,0x29,0x2A,0x2B,0x2C,0x09,0x0A,0x1B,0x30,0x31, + + 0x87,0x88,0x89,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9, + 0x4F,0x07,0x20,0x21,0x22,0x23,0x24,0x15,0x06,0x17,0x28,0x29,0x2A,0x2B,0x2C,0x09,0x0A,0x1B,0x30,0x31, + 0x1A,0x33,0x34,0x35,0x36,0x08,0x38,0x39,0x3A,0x3B,0x04,0x14,0x3E,0xFF,0x41,0x4A,0x6A,0x5F,0xCA,0xE0, + 0xA1,0x79,0xC0,0xD0,0x36,0x08,0x38,0x39,0x3A,0x3B,0x04,0x14,0x3E,0xFF,0x41,0x4A,0x6A,0x5F,0xCA,0xE0, + 0x4F,0x07,0x20,0x21,0x22,0x23,0x24,0x15,0x06,0x17,0x28,0x29,0x2A,0x2B,0x2C,0x09,0x0A,0x1B,0x30,0x31, + + 0x87,0x88,0x89,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9, + 0x4F,0x07,0x20,0x21,0x22,0x23,0x24,0x15,0x06,0x17,0x28,0x29,0x2A,0x2B,0x2C,0x09,0x0A,0x1B,0x30,0x31, + 0x1A,0x33,0x34,0x35,0x36,0x08,0x38,0x39,0x3A,0x3B,0x04,0x14,0x3E,0xFF,0x41,0x4A,0x6A,0x5F,0xCA,0xE0, + 0xA1,0x79,0xC0,0xD0,0x36,0x08,0x38,0x39,0x3A,0x3B,0x04,0x14,0x3E,0xFF,0x41,0x4A,0x6A,0x5F,0xCA,0xE0, + 0x4F,0x07,0x20,0x21,0x22,0x23,0x24,0x15,0x06,0x17,0x28,0x29,0x2A,0x2B,0x2C,0x09,0x0A,0x1B,0x30,0x31, + + 0x87,0x88,0x89,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9, + 0x4F,0x07,0x20,0x21,0x22,0x23,0x24,0x15,0x06,0x17,0x28,0x29,0x2A,0x2B,0x2C,0x09,0x0A,0x1B,0x30,0x31, + 0x1A,0x33,0x34,0x35,0x36,0x08,0x38,0x39,0x3A,0x3B,0x04,0x14,0x3E,0xFF,0x41,0x4A,0x6A,0x5F,0xCA,0xE0, + 0xA1,0x79,0xC0,0xD0,0x36,0x08,0x38,0x39,0x3A,0x3B,0x04,0x14,0x3E,0xFF,0x41,0x4A,0x6A,0x5F,0xCA,0xE0, + 0x4F,0x07,0x20,0x21,0x22,0x23,0x24,0x15,0x06,0x17,0x28,0x29,0x2A,0x2B,0x2C,0x09,0x0A,0x1B,0x30,0x31, + + 0x87,0x88,0x89,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9, + 0x4F,0x07,0x20,0x21,0x22,0x23,0x24,0x15,0x06,0x17,0x28,0x29,0x2A,0x2B,0x2C,0x09,0x0A,0x1B,0x30,0x31, + 0x1A,0x33,0x34,0x35,0x36,0x08,0x38,0x39,0x3A,0x3B,0x04,0x14,0x3E,0xFF,0x41,0x4A,0x6A,0x5F,0xCA,0xE0, + 0xA1,0x79,0xC0,0xD0,0x36,0x08,0x38,0x39,0x3A,0x3B,0x04,0x14,0x3E,0xFF,0x41,0x4A,0x6A,0x5F,0xCA,0xE0, + 0x4F,0x07,0x20,0x21,0x22,0x23,0x24,0x15,0x06,0x17,0x28,0x29,0x2A,0x2B,0x2C,0x09,0x0A,0x1B,0x30,0x31, + + 0x87,0x88,0x89,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9, + 0x4F,0x07,0x20,0x21,0x22,0x23,0x24,0x15,0x06,0x17,0x28,0x29,0x2A,0x2B,0x2C,0x09,0x0A,0x1B,0x30,0x31, + 0x1A,0x33,0x34,0x35,0x36,0x08,0x38,0x39,0x3A,0x3B,0x04,0x14,0x3E,0xFF,0x41,0x4A,0x6A,0x5F,0xCA,0xE0, + 0xA1,0x79,0xC0,0xD0,0x36,0x08,0x38,0x39,0x3A,0x3B,0x04,0x14,0x3E,0xFF,0x41,0x4A,0x6A,0x5F,0xCA,0xE0, + 0x4F,0x07,0x20,0x21,0x22,0x23,0x24,0x15,0x06,0x17,0x28,0x29,0x2A,0x2B,0x2C,0x09,0x0A,0x1B,0x30,0x31, + + 0x87,0x88,0x89,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9, + 0x4F,0x07,0x20,0x21,0x22,0x23,0x24,0x15,0x06,0x17,0x28,0x29,0x2A,0x2B,0x2C,0x09,0x0A,0x1B,0x30,0x31, + 0x1A,0x33,0x34,0x35,0x36,0x08,0x38,0x39,0x3A,0x3B,0x04,0x14,0x3E,0xFF,0x41,0x4A,0x6A,0x5F,0xCA,0xE0, + 0xA1,0x79,0xC0,0xD0,0x36,0x08,0x38,0x39,0x3A,0x3B,0x04,0x14,0x3E,0xFF,0x41,0x4A,0x6A,0x5F,0xCA,0xE0, + 0x4F,0x07,0x20,0x21,0x22,0x23,0x24,0x15,0x06,0x17,0x28,0x29,0x2A,0x2B,0x2C,0x09,0x0A,0x1B,0x30,0x31, + + 0x87,0x88,0x89,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9, + 0x4F,0x07,0x20,0x21, + +}; +WCHAR ebcdic_arabic_uniSource[]={ + 0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,0x0070, + 0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007A, + 0x007C,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + 0x009C,0x009D,0x009E,0x009F,0x00A0,0x00A2,0x00A6,0x00AC,0x00AD,0x00D7, + 0x00F7,0x060C,0x061B,0x061F,0x00A0,0x00A2,0x00A6,0x00AC,0x00AD,0x00D7, + 0x007C,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + + 0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,0x0070, + 0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007A, + 0x007C,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + 0x009C,0x009D,0x009E,0x009F,0x00A0,0x00A2,0x00A6,0x00AC,0x00AD,0x00D7, + 0x00F7,0x060C,0x061B,0x061F,0x00A0,0x00A2,0x00A6,0x00AC,0x00AD,0x00D7, + 0x007C,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + + 0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,0x0070, + 0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007A, + 0x007C,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + 0x009C,0x009D,0x009E,0x009F,0x00A0,0x00A2,0x00A6,0x00AC,0x00AD,0x00D7, + 0x00F7,0x060C,0x061B,0x061F,0x00A0,0x00A2,0x00A6,0x00AC,0x00AD,0x00D7, + 0x007C,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + + 0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,0x0070, + 0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007A, + 0x007C,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + 0x009C,0x009D,0x009E,0x009F,0x00A0,0x00A2,0x00A6,0x00AC,0x00AD,0x00D7, + 0x00F7,0x060C,0x061B,0x061F,0x00A0,0x00A2,0x00A6,0x00AC,0x00AD,0x00D7, + 0x007C,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + + 0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,0x0070, + 0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007A, + 0x007C,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + 0x009C,0x009D,0x009E,0x009F,0x00A0,0x00A2,0x00A6,0x00AC,0x00AD,0x00D7, + 0x00F7,0x060C,0x061B,0x061F,0x00A0,0x00A2,0x00A6,0x00AC,0x00AD,0x00D7, + 0x007C,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + + 0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,0x0070, + 0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007A, + 0x007C,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + 0x009C,0x009D,0x009E,0x009F,0x00A0,0x00A2,0x00A6,0x00AC,0x00AD,0x00D7, + 0x00F7,0x060C,0x061B,0x061F,0x00A0,0x00A2,0x00A6,0x00AC,0x00AD,0x00D7, + 0x007C,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + + 0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,0x0070, + 0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007A, + 0x007C,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + 0x009C,0x009D,0x009E,0x009F,0x00A0,0x00A2,0x00A6,0x00AC,0x00AD,0x00D7, + 0x00F7,0x060C,0x061B,0x061F,0x00A0,0x00A2,0x00A6,0x00AC,0x00AD,0x00D7, + 0x007C,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + + 0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,0x0070, + 0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007A, + 0x007C,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + 0x009C,0x009D,0x009E,0x009F,0x00A0,0x00A2,0x00A6,0x00AC,0x00AD,0x00D7, + 0x00F7,0x060C,0x061B,0x061F,0x00A0,0x00A2,0x00A6,0x00AC,0x00AD,0x00D7, + 0x007C,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + + 0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,0x0070, + 0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007A, + 0x007C,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + 0x009C,0x009D,0x009E,0x009F,0x00A0,0x00A2,0x00A6,0x00AC,0x00AD,0x00D7, + 0x00F7,0x060C,0x061B,0x061F,0x00A0,0x00A2,0x00A6,0x00AC,0x00AD,0x00D7, + 0x007C,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + + 0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,0x0070, + 0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007A, + 0x007C,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + 0x009C,0x009D,0x009E,0x009F,0x00A0,0x00A2,0x00A6,0x00AC,0x00AD,0x00D7, + 0x00F7,0x060C,0x061B,0x061F,0x00A0,0x00A2,0x00A6,0x00AC,0x00AD,0x00D7, + 0x007C,0x007F,0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091, + 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B, + + + 0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,0x0070, + 0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007A, + 0x007C,0x007F,0x0080,0x0081, +}; + + +unsigned char utf8_encSource[]={ + 0xE3,0x80,0x80,0xE3,0x80,0x81,0xE3,0x80,0x82,0x20,0xEF,0xBC,0x8E,0xE3,0x83,0xBB, + 0xEF,0xBC,0x9A,0xEF,0xBC,0x9B,0x0D,0x0A,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A, + 0x0D,0x0A,0xEF,0xBC,0x9F,0xEF,0xBC,0x81,0xE3,0x82,0x9B,0xE3,0x82,0x9C,0xC2,0xB4, + 0xEF,0xBD,0x80,0xC2,0xA8,0xEF,0xBC,0xBE,0x0D,0x0A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, + 0x51,0x52,0x0D,0x0A,0xEF,0xBF,0xA3,0xEF,0xBC,0xBF,0xE3,0x83,0xBD,0xE3,0x83,0xBE, + 0xE3,0x82,0x9D,0xE3,0x82,0x9E,0xE3,0x80,0x83,0xE4,0xBB,0x9D,0x0D,0x0A,0xE3,0x80, + 0x85,0xE3,0x80,0x86,0xE3,0x80,0x87,0xE3,0x83,0xBC,0xE2,0x80,0x95,0xE2,0x80,0x90, + 0xEF,0xBC,0x8F,0x5C,0x0D,0x0A,0xEF,0xBD,0x9C,0xE2,0x80,0xA6,0xE2,0x80,0xA5,0xE2, + 0x80,0x98,0xE2,0x80,0x99,0xE2,0x80,0x9C,0x0D,0x0A,0xE2,0x80,0x9D,0xEF,0xBC,0x88, + 0xEF,0xBC,0x89,0xE3,0x80,0x94,0xEF,0xBD,0xB5,0xEF,0xBD,0xB6,0xEF,0xBD,0xB7,0xEF, + 0xBD,0xB8,0x0D,0x0A,0xEF,0xBD,0xB9,0xEF,0xBD,0xBA,0xEF,0xBD,0xBB,0xEF,0xBD,0xBC, + 0xEF,0xBD,0xBD,0xEF,0xBD,0xBE,0xEF,0xBD,0xBF,0xEF,0xBE,0x80,0x0D,0x0A,0x53,0x54, + 0x55,0x56,0x57,0x58,0x59,0x5A,0x0D,0x0A,0xEF,0xBE,0x81,0xEF,0xBE,0x82,0xEF,0xBE, + 0x83,0xEF,0xBE,0x84,0xEF,0xBE,0x85,0xEF,0xBE,0x86,0xEF,0xBE,0x87,0xEF,0xBE,0x88, + 0x0D,0x0A,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x0D,0x0A,0xEF,0xBE,0x89,0xEF, + 0xBE,0x8A,0xEF,0xBE,0x8B,0x20,0xEF,0xBE,0x8D,0xEF,0xBE,0x8E,0xEF,0xBE,0x8F,0xEF, + 0xBE,0x90,0x0D,0x0A,0xEF,0xBE,0x91,0xEF,0xBE,0x92,0xEF,0xBE,0x93,0xEF,0xBE,0x94, + 0xEF,0xBE,0x95,0xEF,0xBE,0x96,0xEF,0xBE,0x97,0xEF,0xBE,0x98,0x0D,0x0A,0xE3,0x80, + 0x80,0xE3,0x80,0x81,0xE3,0x80,0x82,0x20,0xEF,0xBC,0x8E,0xE3,0x83,0xBB,0xEF,0xBC, + 0x9A,0xEF,0xBC,0x9B,0x0D,0x0A,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x0D,0x0A, + 0xEF,0xBC,0x9F,0xEF,0xBC,0x81,0xE3,0x82,0x9B,0xE3,0x82,0x9C,0xC2,0xB4,0xEF,0xBD, + 0x80,0xC2,0xA8,0xEF,0xBC,0xBE,0x0D,0x0A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52, + 0x0D,0x0A,0xEF,0xBF,0xA3,0xEF,0xBC,0xBF,0xE3,0x83,0xBD,0xE3,0x83,0xBE,0xE3,0x82, + 0x9D,0xE3,0x82,0x9E,0xE3,0x80,0x83,0xE4,0xBB,0x9D,0x0D,0x0A,0xE3,0x80,0x85,0xE3, + 0x80,0x86,0xE3,0x80,0x87,0xE3,0x83,0xBC,0xE2,0x80,0x95,0xE2,0x80,0x90,0xEF,0xBC, + 0x8F,0x5C,0x0D,0x0A,0xEF,0xBD,0x9C,0xE2,0x80,0xA6,0xE2,0x80,0xA5,0xE2,0x80,0x98, + 0xE2,0x80,0x99,0xE2,0x80,0x9C,0x0D,0x0A,0xE2,0x80,0x9D,0xEF,0xBC,0x88,0xEF,0xBC, + 0x89,0xE3,0x80,0x94,0xEF,0xBD,0xB5,0xEF,0xBD,0xB6,0xEF,0xBD,0xB7,0xEF,0xBD,0xB8, + 0x0D,0x0A,0xEF,0xBD,0xB9,0xEF,0xBD,0xBA,0xEF,0xBD,0xBB,0xEF,0xBD,0xBC,0xEF,0xBD, + 0xBD,0xEF,0xBD,0xBE,0xEF,0xBD,0xBF,0xEF,0xBE,0x80,0x0D,0x0A,0x53,0x54,0x55,0x56, + 0x57,0x58,0x59,0x5A,0x0D,0x0A,0xEF,0xBE,0x81,0xEF,0xBE,0x82,0xEF,0xBE,0x83,0xEF, + 0xBE,0x84,0xEF,0xBE,0x85,0xEF,0xBE,0x86,0xEF,0xBE,0x87,0xEF,0xBE,0x88,0x0D,0x0A, + 0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x0D,0x0A,0xEF,0xBE,0x89,0xEF,0xBE,0x8A, + 0xEF,0xBE,0x8B,0x20,0xEF,0xBE,0x8D,0xEF,0xBE,0x8E,0xEF,0xBE,0x8F,0xEF,0xBE,0x90, + 0x0D,0x0A,0xEF,0xBE,0x91,0xEF,0xBE,0x92,0xEF,0xBE,0x93,0xEF,0xBE,0x94,0xEF,0xBE, + 0x95,0xEF,0xBE,0x96,0xEF,0xBE,0x97,0xEF,0xBE,0x98,0x0D,0x0A,0xE3,0x80,0x80,0xE3, + 0x80,0x81,0xE3,0x80,0x82,0x20,0xEF,0xBC,0x8E,0xE3,0x83,0xBB,0xEF,0xBC,0x9A,0xEF, + 0xBC,0x9B,0x0D,0x0A,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x0D,0x0A,0xEF,0xBC, + 0x9F,0xEF,0xBC,0x81,0xE3,0x82,0x9B,0xE3,0x82,0x9C,0xC2,0xB4,0xEF,0xBD,0x80,0xC2, + 0xA8,0xEF,0xBC,0xBE,0x0D,0x0A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x0D,0x0A, + 0xEF,0xBF,0xA3,0xEF,0xBC,0xBF,0xE3,0x83,0xBD,0xE3,0x83,0xBE,0xE3,0x82,0x9D,0xE3, + 0x82,0x9E,0xE3,0x80,0x83,0xE4,0xBB,0x9D,0x0D,0x0A,0xE3,0x80,0x85,0xE3,0x80,0x86, + 0xE3,0x80,0x87,0xE3,0x83,0xBC,0xE2,0x80,0x95,0xE2,0x80,0x90,0xEF,0xBC,0x8F,0x5C, + 0x0D,0x0A,0xEF,0xBD,0x9C,0xE2,0x80,0xA6,0xE2,0x80,0xA5,0xE2,0x80,0x98,0xE2,0x80, + 0x99,0xE2,0x80,0x9C,0x0D,0x0A,0xE2,0x80,0x9D,0xEF,0xBC,0x88,0xEF,0xBC,0x89,0xE3, + 0x80,0x94,0xEF,0xBD,0xB5,0xEF,0xBD,0xB6,0xEF,0xBD,0xB7,0xEF,0xBD,0xB8,0x0D,0x0A, + 0xEF,0xBD,0xB9,0xEF,0xBD,0xBA,0xEF,0xBD,0xBB,0xEF,0xBD,0xBC,0xEF,0xBD,0xBD,0xEF, + 0xBD,0xBE,0xEF,0xBD,0xBF,0xEF,0xBE,0x80,0x0D,0x0A,0x53,0x54,0x55,0x56,0x57,0x58, + 0x59,0x5A,0x0D,0x0A,0xEF,0xBE,0x81,0xEF,0xBE,0x82,0xEF,0xBE,0x83,0xEF,0xBE,0x84, + 0xEF,0xBE,0x85,0xEF,0xBE,0x86,0xEF,0xBE,0x87,0xEF,0xBE,0x88,0x0D,0x0A,0x53,0x54, + 0x55,0x56,0x57,0x58,0x59,0x5A,0x0D,0x0A,0xEF,0xBE,0x89,0xEF,0xBE,0x8A,0xEF,0xBE, + 0x8B,0x20,0xEF,0xBE,0x8D,0xEF,0xBE,0x8E,0xEF,0xBE,0x8F,0xEF,0xBE,0x90,0x0D,0x0A, + 0xEF,0xBE,0x91,0xEF,0xBE,0x92,0xEF,0xBE,0x93,0xEF,0xBE,0x94,0xEF,0xBE,0x95,0xEF, + 0xBE,0x96,0xEF,0xBE,0x97,0xEF,0xBE,0x98,0x0D,0x0A,0xE3,0x80,0x80,0xE3,0x80,0x81, + 0xE3,0x80,0x82,0x20,0xEF,0xBC,0x8E,0xE3,0x83,0xBB,0xEF,0xBC,0x9A,0xEF,0xBC,0x9B, + 0x0D,0x0A,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x0D,0x0A,0xEF,0xBC,0x9F,0xEF, + 0xBC,0x81,0xE3,0x82,0x9B,0xE3,0x82,0x9C,0xC2,0xB4,0xEF,0xBD,0x80,0xC2,0xA8,0xEF, + 0xBC,0xBE,0x0D,0x0A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x0D,0x0A,0xEF,0xBF, + 0xA3,0xEF,0xBC,0xBF,0xE3,0x83,0xBD,0xE3,0x83,0xBE,0xE3,0x82,0x9D,0xE3,0x82,0x9E, + 0xE3,0x80,0x83,0xE4,0xBB,0x9D,0x0D,0x0A,0xE3,0x80,0x85,0xE3,0x80,0x86,0xE3,0x80, + 0x87,0xE3,0x83,0xBC,0xE2,0x80,0x95,0xE2,0x80,0x90,0xEF,0xBC,0x8F,0x5C,0x0D,0x0A, + 0xEF,0xBD,0x9C,0xE2,0x80,0xA6,0xE2,0x80,0xA5,0xE2,0x80,0x98,0xE2,0x80,0x99,0xE2, + 0x80,0x9C,0x0D,0x0A,0xE2,0x80,0x9D,0xEF,0xBC,0x88,0xEF,0xBC,0x89,0xE3,0x80,0x94, + 0xEF,0xBD,0xB5,0xEF,0xBD,0xB6,0xEF,0xBD,0xB7,0xEF,0xBD,0xB8,0x0D,0x0A + +}; +WCHAR utf8_uniSource[]={ + 0x3000,0x3001,0x3002,0x0020,0xFF0E,0x30FB,0xFF1A,0xFF1B,0x000D,0x000A, + 0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x000D,0x000A, + 0xFF1F,0xFF01,0x309B,0x309C,0x00B4,0xFF40,0x00A8,0xFF3E,0x000D,0x000A, + 0x004B,0x004C,0x004D,0x004E,0x004F,0x0050,0x0051,0x0052,0x000D,0x000A, + 0xFFE3,0xFF3F,0x30FD,0x30FE,0x309D,0x309E,0x3003,0x4EDD,0x000D,0x000A, + 0x3005,0x3006,0x3007,0x30FC,0x2015,0x2010,0xFF0F,0x005C,0x000D,0x000A, + /*0x301C,0x2016,*/ 0xFF5C,0x2026,0x2025,0x2018,0x2019,0x201C,0x000D,0x000A, + 0x201D,0xFF08,0xFF09,0x3014,0xFF75,0xFF76,0xFF77,0xFF78,0x000D,0x000A, + 0xFF79,0xFF7A,0xFF7B,0xFF7C,0xFF7D,0xFF7E,0xFF7F,0xFF80,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF81,0xFF82,0xFF83,0xFF84,0xFF85,0xFF86,0xFF87,0xFF88,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF89,0xFF8A,0xFF8B,0x0020,0xFF8D,0xFF8E,0xFF8F,0xFF90,0x000D,0x000A, + 0xFF91,0xFF92,0xFF93,0xFF94,0xFF95,0xFF96,0xFF97,0xFF98,0x000D,0x000A, + /**/ + 0x3000,0x3001,0x3002,0x0020,0xFF0E,0x30FB,0xFF1A,0xFF1B,0x000D,0x000A, + 0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x000D,0x000A, + 0xFF1F,0xFF01,0x309B,0x309C,0x00B4,0xFF40,0x00A8,0xFF3E,0x000D,0x000A, + 0x004B,0x004C,0x004D,0x004E,0x004F,0x0050,0x0051,0x0052,0x000D,0x000A, + 0xFFE3,0xFF3F,0x30FD,0x30FE,0x309D,0x309E,0x3003,0x4EDD,0x000D,0x000A, + 0x3005,0x3006,0x3007,0x30FC,0x2015,0x2010,0xFF0F,0x005C,0x000D,0x000A, + /*0x301C,0x2016,*/ 0xFF5C,0x2026,0x2025,0x2018,0x2019,0x201C,0x000D,0x000A, + 0x201D,0xFF08,0xFF09,0x3014,0xFF75,0xFF76,0xFF77,0xFF78,0x000D,0x000A, + 0xFF79,0xFF7A,0xFF7B,0xFF7C,0xFF7D,0xFF7E,0xFF7F,0xFF80,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF81,0xFF82,0xFF83,0xFF84,0xFF85,0xFF86,0xFF87,0xFF88,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF89,0xFF8A,0xFF8B,0x0020,0xFF8D,0xFF8E,0xFF8F,0xFF90,0x000D,0x000A, + 0xFF91,0xFF92,0xFF93,0xFF94,0xFF95,0xFF96,0xFF97,0xFF98,0x000D,0x000A, + /**/ + 0x3000,0x3001,0x3002,0x0020,0xFF0E,0x30FB,0xFF1A,0xFF1B,0x000D,0x000A, + 0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x000D,0x000A, + 0xFF1F,0xFF01,0x309B,0x309C,0x00B4,0xFF40,0x00A8,0xFF3E,0x000D,0x000A, + 0x004B,0x004C,0x004D,0x004E,0x004F,0x0050,0x0051,0x0052,0x000D,0x000A, + 0xFFE3,0xFF3F,0x30FD,0x30FE,0x309D,0x309E,0x3003,0x4EDD,0x000D,0x000A, + 0x3005,0x3006,0x3007,0x30FC,0x2015,0x2010,0xFF0F,0x005C,0x000D,0x000A, + /*0x301C,0x2016,*/ 0xFF5C,0x2026,0x2025,0x2018,0x2019,0x201C,0x000D,0x000A, + 0x201D,0xFF08,0xFF09,0x3014,0xFF75,0xFF76,0xFF77,0xFF78,0x000D,0x000A, + 0xFF79,0xFF7A,0xFF7B,0xFF7C,0xFF7D,0xFF7E,0xFF7F,0xFF80,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF81,0xFF82,0xFF83,0xFF84,0xFF85,0xFF86,0xFF87,0xFF88,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF89,0xFF8A,0xFF8B,0x0020,0xFF8D,0xFF8E,0xFF8F,0xFF90,0x000D,0x000A, + 0xFF91,0xFF92,0xFF93,0xFF94,0xFF95,0xFF96,0xFF97,0xFF98,0x000D,0x000A, + /**/ + 0x3000,0x3001,0x3002,0x0020,0xFF0E,0x30FB,0xFF1A,0xFF1B,0x000D,0x000A, + 0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x000D,0x000A, + 0xFF1F,0xFF01,0x309B,0x309C,0x00B4,0xFF40,0x00A8,0xFF3E,0x000D,0x000A, + 0x004B,0x004C,0x004D,0x004E,0x004F,0x0050,0x0051,0x0052,0x000D,0x000A, + 0xFFE3,0xFF3F,0x30FD,0x30FE,0x309D,0x309E,0x3003,0x4EDD,0x000D,0x000A, + 0x3005,0x3006,0x3007,0x30FC,0x2015,0x2010,0xFF0F,0x005C,0x000D,0x000A, + /*0x301C,0x2016,*/ 0xFF5C,0x2026,0x2025,0x2018,0x2019,0x201C,0x000D,0x000A, + 0x201D,0xFF08,0xFF09,0x3014,0xFF75,0xFF76,0xFF77,0xFF78,0x000D,0x000A, + 0xFF79,0xFF7A,0xFF7B,0xFF7C,0xFF7D,0xFF7E,0xFF7F,0xFF80,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF81,0xFF82,0xFF83,0xFF84,0xFF85,0xFF86,0xFF87,0xFF88,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF89,0xFF8A,0xFF8B,0x0020,0xFF8D,0xFF8E,0xFF8F,0xFF90,0x000D,0x000A, + 0xFF91,0xFF92,0xFF93,0xFF94,0xFF95,0xFF96,0xFF97,0xFF98,0x000D,0x000A, + /**/ + 0x3000,0x3001,0x3002,0x0020,0xFF0E,0x30FB,0xFF1A,0xFF1B,0x000D,0x000A, + 0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x000D,0x000A, + 0xFF1F,0xFF01,0x309B,0x309C,0x00B4,0xFF40,0x00A8,0xFF3E,0x000D,0x000A, + 0x004B,0x004C,0x004D,0x004E,0x004F,0x0050,0x0051,0x0052,0x000D,0x000A, + 0xFFE3,0xFF3F,0x30FD,0x30FE,0x309D,0x309E,0x3003,0x4EDD,0x000D,0x000A, + 0x3005,0x3006,0x3007,0x30FC,0x2015,0x2010,0xFF0F,0x005C,0x000D,0x000A, + /*0x301C,0x2016,*/ 0xFF5C,0x2026,0x2025,0x2018,0x2019,0x201C,0x000D,0x000A, + 0x201D,0xFF08,0xFF09,0x3014,0xFF75,0xFF76,0xFF77,0xFF78,0x000D,0x000A, + 0xFF79,0xFF7A,0xFF7B,0xFF7C,0xFF7D,0xFF7E,0xFF7F,0xFF80,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF81,0xFF82,0xFF83,0xFF84,0xFF85,0xFF86,0xFF87,0xFF88,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF89,0xFF8A,0xFF8B,0x0020,0xFF8D,0xFF8E,0xFF8F,0xFF90,0x000D,0x000A, + 0xFF91,0xFF92,0xFF93,0xFF94,0xFF95,0xFF96,0xFF97,0xFF98,0x000D,0x000A, + /**/ + 0x3000,0x3001,0x3002,0x0020,0xFF0E,0x30FB,0xFF1A,0xFF1B,0x000D,0x000A, + 0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x000D,0x000A, + 0xFF1F,0xFF01,0x309B,0x309C,0x00B4,0xFF40,0x00A8,0xFF3E,0x000D,0x000A, + 0x004B,0x004C,0x004D,0x004E,0x004F,0x0050,0x0051,0x0052,0x000D,0x000A, + 0xFFE3,0xFF3F,0x30FD,0x30FE,0x309D,0x309E,0x3003,0x4EDD,0x000D,0x000A, + 0x3005,0x3006,0x3007,0x30FC,0x2015,0x2010,0xFF0F,0x005C,0x000D,0x000A, + /*0x301C,0x2016,*/ 0xFF5C,0x2026,0x2025,0x2018,0x2019,0x201C,0x000D,0x000A, + 0x201D,0xFF08,0xFF09,0x3014,0xFF75,0xFF76,0xFF77,0xFF78,0x000D,0x000A, + 0xFF79,0xFF7A,0xFF7B,0xFF7C,0xFF7D,0xFF7E,0xFF7F,0xFF80,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF81,0xFF82,0xFF83,0xFF84,0xFF85,0xFF86,0xFF87,0xFF88,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF89,0xFF8A,0xFF8B,0x0020,0xFF8D,0xFF8E,0xFF8F,0xFF90,0x000D,0x000A, + 0xFF91,0xFF92,0xFF93,0xFF94,0xFF95,0xFF96,0xFF97,0xFF98,0x000D,0x000A, + /**/ + 0x3000,0x3001,0x3002,0x0020,0xFF0E,0x30FB,0xFF1A,0xFF1B,0x000D,0x000A, + 0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x000D,0x000A, + 0xFF1F,0xFF01,0x309B,0x309C,0x00B4,0xFF40,0x00A8,0xFF3E,0x000D,0x000A, + 0x004B,0x004C,0x004D,0x004E,0x004F,0x0050,0x0051,0x0052,0x000D,0x000A, + 0xFFE3,0xFF3F,0x30FD,0x30FE,0x309D,0x309E,0x3003,0x4EDD,0x000D,0x000A, + 0x3005,0x3006,0x3007,0x30FC,0x2015,0x2010,0xFF0F,0x005C,0x000D,0x000A, + /*0x301C,0x2016,*/ 0xFF5C,0x2026,0x2025,0x2018,0x2019,0x201C,0x000D,0x000A, + 0x201D,0xFF08,0xFF09,0x3014,0xFF75,0xFF76,0xFF77,0xFF78,0x000D,0x000A, + 0xFF79,0xFF7A,0xFF7B,0xFF7C,0xFF7D,0xFF7E,0xFF7F,0xFF80,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF81,0xFF82,0xFF83,0xFF84,0xFF85,0xFF86,0xFF87,0xFF88,0x000D,0x000A, + 0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005A,0x000D,0x000A, + 0xFF89,0xFF8A,0xFF8B,0x0020,0xFF8D,0xFF8E,0xFF8F,0xFF90,0x000D,0x000A, + 0xFF91,0xFF92,0xFF93,0xFF94,0xFF95,0xFF96,0xFF97,0xFF98,0x000D,0x000A, + /**/ + 0x3000,0x3001,0x3002,0x0020,0xFF0E,0x30FB,0xFF1A,0xFF1B,0x000D,0x000A, + 0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x000D,0x000A, + 0xFF1F,0xFF01,0x309B,0x309C,0x00B4,0xFF40,0x00A8,0xFF3E,0x000D,0x000A, + 0x004B,0x004C,0x004D,0x004E,0x004F,0x0050,0x0051,0x0052,0x000D,0x000A, + 0xFFE3,0xFF3F,0x30FD,0x30FE,0x309D,0x309E,0x3003,0x4EDD,0x000D,0x000A, + 0x3005,0x3006,0x3007,0x30FC,0x2015,0x2010,0xFF0F,0x005C, +}; + +WCHAR utf8_uniSmSource[]={ + 0x3000,0x3001,0x3002,0x0020,0xFF0E,0x30FB,0xFF1A,0xFF1B,0x000D,0x000A, + 0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004A,0x000D,0x000A, +}; +unsigned char utf8_encSmSource[]={ + 0xE3,0x80,0x80,0xE3,0x80,0x81,0xE3,0x80,0x82,0x20,0xEF,0xBC,0x8E,0xE3,0x83,0xBB, + 0xEF,0xBC,0x9A,0xEF,0xBC,0x9B,0x0D,0x0A +}; +#endif + diff --git a/icuSources/test/perf/perldriver/PerfFramework.pm b/icuSources/test/perf/perldriver/PerfFramework.pm index 2540e920..04d96a2b 100644 --- a/icuSources/test/perf/perldriver/PerfFramework.pm +++ b/icuSources/test/perf/perldriver/PerfFramework.pm @@ -1,9 +1,9 @@ #!/usr/local/bin/perl -# ******************************************************************** +# *********************************************************************** # * COPYRIGHT: -# * Copyright (c) 2002, International Business Machines Corporation and -# * others. All Rights Reserved. -# ******************************************************************** +# * Copyright (c) 2002-2004, International Business Machines Corporation +# * and others. All Rights Reserved. +# *********************************************************************** use strict; @@ -23,6 +23,7 @@ my $extraArgs; # stuff that always gets passed to the test program my $iterCount = 0; my $NUMPASSES = 4; my $TIME = 2; +my $ITERATIONS; #Added by Doug my $DATADIR; sub setupOptions { @@ -39,6 +40,11 @@ sub setupOptions { if($options{"dataDir"}) { $DATADIR = $options{"dataDir"}; } + + # Added by Doug + if ($options{"iterations"}) { + $ITERATIONS = $options{"iterations"}; + } } sub runTests { @@ -113,7 +119,13 @@ sub compareLoop { # first we calibrate. Use time from somewhere # first test is used for calibration ($program, @argsAndTest) = split(/\ /, @{ $tests{$i} }[$j]); - my $commandLine = "$program -t $TIME -p $NUMPASSES $locAndData @argsAndTest"; + #Modified by Doug + my $commandLine; + if ($ITERATIONS) { + $commandLine = "$program -i $ITERATIONS -p $NUMPASSES $locAndData @argsAndTest"; + } else { + $commandLine = "$program -t $TIME -p $NUMPASSES $locAndData @argsAndTest"; + } #my $commandLine = "$program -i 5 -p $NUMPASSES $locAndData @argsAndTest"; my @res = measure1($commandLine); store("$i, $program @argsAndTest", @res); diff --git a/icuSources/test/perf/ubrkperf/ubrkperf.dsp b/icuSources/test/perf/ubrkperf/ubrkperf.dsp index 6b72f321..dd5d8472 100644 --- a/icuSources/test/perf/ubrkperf/ubrkperf.dsp +++ b/icuSources/test/perf/ubrkperf/ubrkperf.dsp @@ -104,7 +104,7 @@ LINK32=link.exe # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /Op /I "..\..\..\..\include" /I "..\..\..\tools\toolutil" /I "..\..\..\common" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /Op /I "..\..\..\..\include" /I "..\..\..\tools\toolutil" /I "..\..\..\common" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" @@ -130,7 +130,7 @@ LINK32=link.exe # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /Op /I "..\..\..\..\include" /I "..\..\..\tools\toolutil" /I "..\..\..\common" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /Op /I "..\..\..\..\include" /I "..\..\..\tools\toolutil" /I "..\..\..\common" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe diff --git a/icuSources/test/perf/ubrkperf/ubrkperf20.dsp b/icuSources/test/perf/ubrkperf/ubrkperf20.dsp index cd05890a..5cb1a5e9 100644 --- a/icuSources/test/perf/ubrkperf/ubrkperf20.dsp +++ b/icuSources/test/perf/ubrkperf/ubrkperf20.dsp @@ -104,7 +104,7 @@ LINK32=link.exe # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /Op /I "c:\src\oldICU\icu-2-0\include" /I "..\..\..\tools\toolutil" /I "c:\src\oldICU\icu-2-0\source\common" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /Op /I "c:\src\oldICU\icu-2-0\include" /I "..\..\..\tools\toolutil" /I "c:\src\oldICU\icu-2-0\source\common" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" @@ -130,7 +130,7 @@ LINK32=link.exe # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /Op /I "c:\src\oldICU\icu-2-0\include" /I "..\..\..\tools\toolutil" /I "c:\src\oldICU\icu-2-0\source\common" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /Op /I "c:\src\oldICU\icu-2-0\include" /I "..\..\..\tools\toolutil" /I "c:\src\oldICU\icu-2-0\source\common" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe diff --git a/icuSources/test/perf/ubrkperf/ubrkperfold.dsp b/icuSources/test/perf/ubrkperf/ubrkperfold.dsp index 5b79de10..ee79dfb5 100644 --- a/icuSources/test/perf/ubrkperf/ubrkperfold.dsp +++ b/icuSources/test/perf/ubrkperf/ubrkperfold.dsp @@ -104,7 +104,7 @@ LINK32=link.exe # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /Op /I "..\..\..\include" /I "..\..\tools\ctestfw" /I "..\..\common" /I "..\..\i18n" /I "..\..\tools\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /Op /I "..\..\..\include" /I "..\..\tools\ctestfw" /I "..\..\common" /I "..\..\i18n" /I "..\..\tools\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" @@ -130,7 +130,7 @@ LINK32=link.exe # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /Op /I "..\..\..\include" /I "..\..\tools\ctestfw" /I "..\..\common" /I "..\..\i18n" /I "..\..\tools\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /Op /I "..\..\..\include" /I "..\..\tools\ctestfw" /I "..\..\common" /I "..\..\i18n" /I "..\..\tools\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe diff --git a/icuSources/test/perf/ustrperf/StringPerf.pl b/icuSources/test/perf/ustrperf/StringPerf.pl new file mode 100644 index 00000000..02cde457 --- /dev/null +++ b/icuSources/test/perf/ustrperf/StringPerf.pl @@ -0,0 +1,68 @@ +#!/usr/bin/perl -w +# ******************************************************************** +# * COPYRIGHT: +# * Copyright (c) 2003-2004, International Business Machines Corporation and +# * others. All Rights Reserved. +# ******************************************************************** + + +use strict; + +use lib '../perldriver'; + +use PerfFramework; + +my $options = { + "title"=>"Unicode String performance: ICU vs. STDLib", + "headers"=>"StdLib ICU", + "operationIs"=>"Unicode String", + "timePerOperationIs"=>"Time per Unicode String", + "passes"=>"5", + "time"=>"2", + #"outputType"=>"HTML", + "dataDir"=>"c:/src/perf/data", + "outputDir"=>"../results" + }; + + +# programs +# tests will be done for all the programs. Results will be stored and connected +my $p = "stringperf.exe -l -u"; + +my $tests = { +"Object Construction(empty string)", ["$p TestStdLibCtor" , "$p TestCtor" ], +"Object Construction(single char)", ["$p TestStdLibCtor1" , "$p TestCtor1" ], +"Object Construction(another string)", ["$p TestStdLibCtor2" , "$p TestCtor2" ], +"Object Construction(string literal)", ["$p TestStdLibCtor3" , "$p TestCtor3" ], +"String Assignment(helper)", ["$p TestStdLibAssign" , "$p TestAssign" ], +"String Assignment(string literal)", ["$p TestStdLibAssign1" , "$p TestAssign1" ], +"String Assignment(another string)", ["$p TestStdLibAssign2" , "$p TestAssign2" ], +"Get String or Character", ["$p TestStdLibGetch" , "$p TestGetch" ], +"Concatenation", ["$p TestStdLibCatenate" , "$p TestCatenate" ], +"String Scanning(char)", ["$p TestStdLibScan" , "$p TestScan" ], +"String Scanning(string)", ["$p TestStdLibScan1" , "$p TestScan1" ], +"String Scanning(char set)", ["$p TestStdLibScan2" , "$p TestScan2" ], +}; + +my $dataFiles = { + "", + [ + "TestNames_Asian.txt", + "TestNames_Chinese.txt", + "TestNames_Simplified_Chinese.txt", + "TestNames_Japanese_h.txt", + "TestNames_Japanese_k.txt", + "TestNames_Korean.txt", + "TestNames_Latin.txt", + "TestNames_SerbianSH.txt", + "TestNames_SerbianSR.txt", + "TestNames_Thai.txt", + "Testnames_Russian.txt", + "th18057.txt", + ] + }; + +runTests($options, $tests, $dataFiles); + +# The whole command line would be something like: +# stringperf.exe -p 5 -t 2 -f c:/src/data/perf/TestNames_Asian.txt -l -u TestStdLibCatenate \ No newline at end of file diff --git a/icuSources/test/perf/ustrperf/stringperf.cpp b/icuSources/test/perf/ustrperf/stringperf.cpp new file mode 100644 index 00000000..653e1a02 --- /dev/null +++ b/icuSources/test/perf/ustrperf/stringperf.cpp @@ -0,0 +1,375 @@ +/******************************************************************** + * COPYRIGHT: + * Copyright (C) 2002-2004 International Business Machines Corporation + * and others. All Rights Reserved. + * + ********************************************************************/ +/***************************************************************************** +* File stringperf.cpp +* +* Modification History: +* Name Description +* Doug Wang Second version +* Doug Wang First Version +****************************************************************************** +*/ + +/** + * This program tests UnicodeString performance. + * APIs tested: UnicodeString + * ICU4C + * Windows 2000/XP, Linux + */ + +#include "stringperf.h" + + +int main(int argc, const char *argv[]) +{ + UErrorCode status = U_ZERO_ERROR; + + bCatenatePrealloc=TRUE; + + StringPerformanceTest test(argc, argv, status); + if (U_FAILURE(status)){ + return status; + } + + int loops = LOOPS; + if (bCatenatePrealloc) { + int to_alloc = loops * MAXNUMLINES * (MAXSRCLEN + catenate_STRLEN); + catICU = new UnicodeString(to_alloc,'a',0); + //catICU = new UnicodeString(); + + catStd = new stlstring(); + catStd -> reserve(loops * MAXNUMLINES * (MAXSRCLEN + catenate_STRLEN)); + //catStd -> reserve(110000000); + } else { + catICU = new UnicodeString(); + catStd = new stlstring(); + } + + if (test.run() == FALSE){ + fprintf(stderr, "FAILED: Tests could not be run please check the " + "arguments.\n"); + return -1; + } + + delete catICU; + delete catStd; + return 0; +} + +StringPerformanceTest::StringPerformanceTest(int32_t argc, const char *argv[], + UErrorCode &status) + : UPerfTest(argc, argv, status) +{ + filelines_=NULL; + StrBuffer=NULL; + StrBufferLen=0; + + int32_t len =0; + + if (status== U_ILLEGAL_ARGUMENT_ERROR){ + //fprintf(stderr,gUsageString, "stringperf"); + return; + } + if (U_FAILURE(status)){ + fprintf(stderr, "FAILED to create UPerfTest object. Error: %s\n", + u_errorName(status)); + return; + } + + + if(line_mode){ + ULine* filelines = getLines(status); + if(U_FAILURE(status)){ + fprintf(stderr, "FAILED to read lines from file and create UPerfTest object. Error: %s\n", u_errorName(status)); + return; + } + + filelines_ = new ULine[numLines]; + for (int i =0; i < numLines; i++) { + len = filelines[i].len; + filelines_[i].name = new UChar[len]; + filelines_[i].len = len; + memcpy(filelines_[i].name, filelines[i].name, len * U_SIZEOF_UCHAR); + } + + }else if(bulk_mode){ + int32_t srcLen = 0; + const UChar* src = getBuffer(srcLen,status); + if(U_FAILURE(status)){ + fprintf(stderr, "FAILED to read buffer from file and create UPerfTest object. Error: %s\n", u_errorName(status)); + return; + } + + StrBuffer = new UChar[srcLen]; + StrBufferLen = srcLen; + memcpy(StrBuffer, src, srcLen * U_SIZEOF_UCHAR); + + } +} + +StringPerformanceTest::~StringPerformanceTest() +{ + delete[] filelines_; + delete[] StrBuffer; +} + +UPerfFunction* StringPerformanceTest::runIndexedTest(int32_t index, UBool exec, + const char *&name, + char* par) +{ + switch (index) { + TESTCASE(0, TestCtor); + TESTCASE(1, TestCtor1); + TESTCASE(2, TestCtor2); + TESTCASE(3, TestCtor3); + TESTCASE(4, TestAssign); + TESTCASE(5, TestAssign1); + TESTCASE(6, TestAssign2); + TESTCASE(7, TestGetch); + TESTCASE(8, TestCatenate); + TESTCASE(9, TestScan); + TESTCASE(10, TestScan1); + TESTCASE(11, TestScan2); + + TESTCASE(12, TestStdLibCtor); + TESTCASE(13, TestStdLibCtor1); + TESTCASE(14, TestStdLibCtor2); + TESTCASE(15, TestStdLibCtor3); + TESTCASE(16, TestStdLibAssign); + TESTCASE(17, TestStdLibAssign1); + TESTCASE(18, TestStdLibAssign2); + TESTCASE(19, TestStdLibGetch); + TESTCASE(20, TestStdLibCatenate); + TESTCASE(21, TestStdLibScan); + TESTCASE(22, TestStdLibScan1); + TESTCASE(23, TestStdLibScan2); + + default: + name = ""; + return NULL; + } + return NULL; +} + +UPerfFunction* StringPerformanceTest::TestCtor() +{ + if (line_mode) { + return new StringPerfFunction(ctor, filelines_, numLines, uselen); + } else { + return new StringPerfFunction(ctor, StrBuffer, StrBufferLen, uselen); + } +} + +UPerfFunction* StringPerformanceTest::TestCtor1() +{ + if (line_mode) { + return new StringPerfFunction(ctor1, filelines_, numLines, uselen); + } else { + return new StringPerfFunction(ctor1, StrBuffer, StrBufferLen, uselen); + } +} + +UPerfFunction* StringPerformanceTest::TestCtor2() +{ + if (line_mode) { + return new StringPerfFunction(ctor2, filelines_, numLines, uselen); + } else { + return new StringPerfFunction(ctor2, StrBuffer, StrBufferLen, uselen); + } +} + +UPerfFunction* StringPerformanceTest::TestCtor3() +{ + if (line_mode) { + return new StringPerfFunction(ctor3, filelines_, numLines, uselen); + } else { + return new StringPerfFunction(ctor3, StrBuffer, StrBufferLen, uselen); + } +} + +UPerfFunction* StringPerformanceTest::TestAssign() +{ + if (line_mode) { + return new StringPerfFunction(assign, filelines_, numLines, uselen); + } else { + return new StringPerfFunction(assign, StrBuffer, StrBufferLen, uselen); + } +} + +UPerfFunction* StringPerformanceTest::TestAssign1() +{ + if (line_mode) { + return new StringPerfFunction(assign1, filelines_, numLines, uselen); + } else { + return new StringPerfFunction(assign1, StrBuffer, StrBufferLen, uselen); + } +} + +UPerfFunction* StringPerformanceTest::TestAssign2() +{ + if (line_mode) { + return new StringPerfFunction(assign2, filelines_, numLines, uselen); + } else { + return new StringPerfFunction(assign2, StrBuffer, StrBufferLen, uselen); + } +} + + +UPerfFunction* StringPerformanceTest::TestGetch() +{ + if (line_mode) { + return new StringPerfFunction(getch, filelines_, numLines, uselen); + } else { + return new StringPerfFunction(getch, StrBuffer, StrBufferLen, uselen); + } +} + +UPerfFunction* StringPerformanceTest::TestCatenate() +{ + if (line_mode) { + return new StringPerfFunction(catenate, filelines_, numLines, uselen); + } else { + //return new StringPerfFunction(catenate, buffer, bufferLen, uselen); + return new StringPerfFunction(catenate, StrBuffer, StrBufferLen, uselen); + } +} + +UPerfFunction* StringPerformanceTest::TestScan() +{ + if (line_mode) { + return new StringPerfFunction(scan, filelines_, numLines, uselen); + } else { + return new StringPerfFunction(scan, StrBuffer, StrBufferLen, uselen); + } +} + +UPerfFunction* StringPerformanceTest::TestScan1() +{ + if (line_mode) { + return new StringPerfFunction(scan1, filelines_, numLines, uselen); + } else { + return new StringPerfFunction(scan1, StrBuffer, StrBufferLen, uselen); + } +} + +UPerfFunction* StringPerformanceTest::TestScan2() +{ + if (line_mode) { + return new StringPerfFunction(scan2, filelines_, numLines, uselen); + } else { + return new StringPerfFunction(scan2, StrBuffer, StrBufferLen, uselen); + } +} + +UPerfFunction* StringPerformanceTest::TestStdLibCtor() +{ + if (line_mode) { + return new StringPerfFunction(StdLibCtor, filelines_, numLines, uselen); + } else { + return new StringPerfFunction(StdLibCtor, StrBuffer, StrBufferLen, uselen); + } +} + +UPerfFunction* StringPerformanceTest::TestStdLibCtor1() +{ + if (line_mode) { + return new StringPerfFunction(StdLibCtor1, filelines_, numLines, uselen); + } else { + return new StringPerfFunction(StdLibCtor1, StrBuffer, StrBufferLen, uselen); + } +} + +UPerfFunction* StringPerformanceTest::TestStdLibCtor2() +{ + if (line_mode) { + return new StringPerfFunction(StdLibCtor2, filelines_, numLines, uselen); + } else { + return new StringPerfFunction(StdLibCtor2, StrBuffer, StrBufferLen, uselen); + } +} + +UPerfFunction* StringPerformanceTest::TestStdLibCtor3() +{ + if (line_mode) { + return new StringPerfFunction(StdLibCtor3, filelines_, numLines, uselen); + } else { + return new StringPerfFunction(StdLibCtor3, StrBuffer, StrBufferLen, uselen); + } +} + +UPerfFunction* StringPerformanceTest::TestStdLibAssign() +{ + if (line_mode) { + return new StringPerfFunction(StdLibAssign, filelines_, numLines, uselen); + } else { + return new StringPerfFunction(StdLibAssign, StrBuffer, StrBufferLen, uselen); + } +} + +UPerfFunction* StringPerformanceTest::TestStdLibAssign1() +{ + if (line_mode) { + return new StringPerfFunction(StdLibAssign1, filelines_, numLines, uselen); + } else { + return new StringPerfFunction(StdLibAssign1, StrBuffer, StrBufferLen, uselen); + } +} + +UPerfFunction* StringPerformanceTest::TestStdLibAssign2() +{ + if (line_mode) { + return new StringPerfFunction(StdLibAssign2, filelines_, numLines, uselen); + } else { + return new StringPerfFunction(StdLibAssign2, StrBuffer, StrBufferLen, uselen); + } +} + +UPerfFunction* StringPerformanceTest::TestStdLibGetch() +{ + if (line_mode) { + return new StringPerfFunction(StdLibGetch, filelines_, numLines, uselen); + } else { + return new StringPerfFunction(StdLibGetch, StrBuffer, StrBufferLen, uselen); + } +} + +UPerfFunction* StringPerformanceTest::TestStdLibCatenate() +{ + if (line_mode) { + return new StringPerfFunction(StdLibCatenate, filelines_, numLines, uselen); + } else { + //return new StringPerfFunction(StdLibCatenate, buffer, bufferLen, uselen); + return new StringPerfFunction(StdLibCatenate, StrBuffer, StrBufferLen, uselen); + } +} + +UPerfFunction* StringPerformanceTest::TestStdLibScan() +{ + if (line_mode) { + return new StringPerfFunction(StdLibScan, filelines_, numLines, uselen); + } else { + return new StringPerfFunction(StdLibScan, StrBuffer, StrBufferLen, uselen); + } +} + +UPerfFunction* StringPerformanceTest::TestStdLibScan1() +{ + if (line_mode) { + return new StringPerfFunction(StdLibScan1, filelines_, numLines, uselen); + } else { + return new StringPerfFunction(StdLibScan1, StrBuffer, StrBufferLen, uselen); + } +} + +UPerfFunction* StringPerformanceTest::TestStdLibScan2() +{ + if (line_mode) { + return new StringPerfFunction(StdLibScan2, filelines_, numLines, uselen); + } else { + return new StringPerfFunction(StdLibScan2, StrBuffer, StrBufferLen, uselen); + } +} \ No newline at end of file diff --git a/icuSources/test/perf/ustrperf/stringperf.h b/icuSources/test/perf/ustrperf/stringperf.h new file mode 100644 index 00000000..f3b83ad0 --- /dev/null +++ b/icuSources/test/perf/ustrperf/stringperf.h @@ -0,0 +1,549 @@ +/* +********************************************************************** +* Copyright (c) 2002-2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +********************************************************************** +*/ +#ifndef _STRINGPERF_H +#define _STRINGPERF_H + +#include <string> + +#include "uperf.h" +#include "unicode/utypes.h" +#include "unicode/unistr.h" + +typedef std::wstring stlstring; + +/* Define all constants for test case operations */ +#define MAXNUMLINES 40000 //Max number of lines in a test data file +#define MAXSRCLEN 20 //Max length of one line. maybe a larger number, but it need more mem +#define LOOPS 100 //Iterations +//#define LOOPS 10 +#define catenate_STRLEN 2 + +const UChar uTESTCHAR1 = 'a'; +const wchar_t wTESTCHAR1 = 'a'; +const UnicodeString uEMPTY; +const stlstring sEMPTY; +UnicodeString unistr; +stlstring stlstr; +// Simulate construction with a single-char string for basic_string +wchar_t simulate[2]={wTESTCHAR1, 0}; + +/* Constants for scan operation */ +U_STRING_DECL(scan_STRING, "Dot. 123. Some more data.", 25); +const UnicodeString uScan_STRING=UnicodeString(scan_STRING); +const stlstring sScan_STRING=stlstring(L"Dot. 123. Some more data."); + +/* global variables or constants for concatenation operation */ +U_STRING_DECL(uCatenate_STR, "!!", 2); +const stlstring sCatenate_STR=stlstring(L"!!"); +static UnicodeString* catICU; +static stlstring* catStd; +UBool bCatenatePrealloc; + +/* type defines */ +typedef struct WLine WLine; +struct WLine { + wchar_t name[100]; + int32_t len; +}; //struct to store one line of wchar_t string + +enum FnType { Fn_ICU, Fn_STD }; +typedef FnType FnType; +typedef void (*ICUStringPerfFn)(const UChar* src,int32_t srcLen, UnicodeString s0); +typedef void (*StdStringPerfFn)(const wchar_t* src,int32_t srcLen, stlstring s0); + + +class StringPerfFunction : public UPerfFunction +{ +public: + + virtual long getEventsPerIteration(){ + int loops = LOOPS; + if (catICU) { delete catICU;} + if (catStd) { delete catStd;} + + if (bCatenatePrealloc) { + + int to_alloc = loops * MAXNUMLINES * (MAXSRCLEN + catenate_STRLEN); + catICU = new UnicodeString(to_alloc,'a',0); + //catICU = new UnicodeString(); + + catStd = new stlstring(); + //catStd -> reserve(loops * MAXNUMLINES * (MAXSRCLEN + catenate_STRLEN)); + catStd -> reserve(110000000); + } else { + catICU = new UnicodeString(); + catStd = new stlstring(); + } + + return -1; + } + + virtual void call(UErrorCode* status) + { + if(line_mode_==TRUE){ + if(uselen_){ + for(int32_t i = 0; i< numLines_; i++){ + if (fnType_==Fn_ICU) { + (*fn1_)(lines_[i].name,lines_[i].len,uS0_[i]); + } else { + (*fn2_)(wlines_[i].name,wlines_[i].len,sS0_[i]); + } + } + }else{ + for(int32_t i = 0; i< numLines_; i++){ + if (fnType_==Fn_ICU) { + (*fn1_)(lines_[i].name,-1,uS0_[i]); + } else { + (*fn2_)(wlines_[i].name,-1,sS0_[i]); + } + } + } + }else{ + if(uselen_){ + if (fnType_==Fn_ICU) { + (*fn1_)(src_,srcLen_,*ubulk_); + } else { + (*fn2_)(wsrc_,wsrcLen_,*sbulk_); + } + }else{ + if (fnType_==Fn_ICU) { + (*fn1_)(src_,-1,*ubulk_); + } else { + (*fn2_)(wsrc_,-1,*sbulk_); + } + } + } + } + + virtual long getOperationsPerIteration() + { + if(line_mode_==TRUE){ + return numLines_; + }else{ + return 1; + } + } + + StringPerfFunction(ICUStringPerfFn func, ULine* srcLines, int32_t srcNumLines, UBool uselen) + { + + fn1_ = func; + lines_=srcLines; + wlines_=NULL; + numLines_=srcNumLines; + uselen_=uselen; + line_mode_=TRUE; + src_ = NULL; + srcLen_ = 0; + wsrc_ = NULL; + wsrcLen_ = 0; + fnType_ = Fn_ICU; + + uS0_=new UnicodeString[numLines_]; + for(int32_t i=0; i<numLines_; i++) { + uS0_[i]=UnicodeString(lines_[i].name, lines_[i].len); + } + sS0_=NULL; + ubulk_=NULL; + sbulk_=NULL; + } + + StringPerfFunction(StdStringPerfFn func, ULine* srcLines, int32_t srcNumLines, UBool uselen) + { + + fn2_ = func; + lines_=srcLines; + wlines_=NULL; + numLines_=srcNumLines; + uselen_=uselen; + line_mode_=TRUE; + src_ = NULL; + srcLen_ = 0; + wsrc_ = NULL; + wsrcLen_ = 0; + fnType_ = Fn_STD; + + uS0_=NULL; + ubulk_=NULL; + sbulk_=NULL; + + //fillin wlines_[], sS0_[] + prepareLinesForStd(); + } + + StringPerfFunction(ICUStringPerfFn func, UChar* source, int32_t sourceLen, UBool uselen) + { + + fn1_ = func; + lines_=NULL; + wlines_=NULL; + numLines_=0; + uselen_=uselen; + line_mode_=FALSE; + src_ = new UChar[sourceLen]; + memcpy(src_, source, sourceLen * U_SIZEOF_UCHAR); + srcLen_ = sourceLen; + wsrc_ = NULL; + wsrcLen_ = 0; + fnType_ = Fn_ICU; + + uS0_=NULL; + sS0_=NULL; + ubulk_=new UnicodeString(src_,srcLen_); + sbulk_=NULL; + } + + StringPerfFunction(StdStringPerfFn func, UChar* source, int32_t sourceLen, UBool uselen) + { + + fn2_ = func; + lines_=NULL; + wlines_=NULL; + numLines_=0; + uselen_=uselen; + line_mode_=FALSE; + src_ = new UChar[sourceLen]; + memcpy(src_, source, sourceLen * U_SIZEOF_UCHAR); + srcLen_ = sourceLen; + fnType_ = Fn_STD; + + uS0_=NULL; + sS0_=NULL; + ubulk_=NULL; + + //fillin wsrc_, sbulk_ + prepareBulkForStd(); + + } + + ~StringPerfFunction() + { + //free(src_); + free(wsrc_); + delete[] src_; + delete ubulk_; + delete sbulk_; + delete[] uS0_; + delete[] sS0_; + delete[] wlines_; + } + +private: + void prepareLinesForStd(void) + { + UErrorCode err=U_ZERO_ERROR; + + wlines_=new WLine[numLines_]; + wchar_t ws[100]; + int32_t wcap = sizeof(ws) / sizeof(*ws); + int32_t wl; + wchar_t* wcs; + + sS0_=new stlstring[numLines_]; + for(int32_t i=0; i<numLines_; i++) { + if(uselen_) { + wcs = u_strToWCS(ws, wcap, &wl, lines_[i].name, lines_[i].len, &err); + memcpy(wlines_[i].name, wcs, wl * sizeof(wchar_t)); + wlines_[i].len = wl; + sS0_[i]=stlstring(wlines_[i].name, wlines_[i].len); + } else { + wcs = u_strToWCS(ws, wcap, &wl, lines_[i].name, lines_[i].len-1, &err); + memcpy(wlines_[i].name, wcs, wl*sizeof(wchar_t)); + wlines_[i].len = wl; + sS0_[i]=stlstring(wlines_[i].name, wlines_[i].len+1); + } + + if (U_FAILURE(err)) { + return; + } + } + + } + + void prepareBulkForStd(void) + { + UErrorCode err=U_ZERO_ERROR; + + const UChar* uSrc = src_; + int32_t uSrcLen = srcLen_; + wchar_t* wDest = NULL; + int32_t wDestLen = 0; + int32_t reqLen= 0 ; + + if(uselen_) { + /* pre-flight*/ + u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen,&err); + + if(err == U_BUFFER_OVERFLOW_ERROR){ + err=U_ZERO_ERROR; + wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen)); + wDestLen = reqLen; + u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen,&err); + } + + if (U_SUCCESS(err)) { + wsrc_ = wDest; + wsrcLen_ = wDestLen; + sbulk_=new stlstring(wsrc_,wsrcLen_); + } + + } else { + /* pre-flight*/ + u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err); + + if(err == U_BUFFER_OVERFLOW_ERROR){ + err=U_ZERO_ERROR; + wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen+1)); + wDestLen = reqLen+1; + u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err); + } + + if (U_SUCCESS(err)) { + wsrc_ = wDest; + wsrcLen_ = wDestLen; + sbulk_=new stlstring(wsrc_); + } + } + + //free(wDest); + } + + +private: + ICUStringPerfFn fn1_; + StdStringPerfFn fn2_; + + ULine* lines_; + WLine* wlines_; + int32_t numLines_; + + UBool uselen_; + UChar* src_; + int32_t srcLen_; + wchar_t* wsrc_; + int32_t wsrcLen_; + UBool line_mode_; + + //added for preparing testing data + UnicodeString* uS0_; + stlstring* sS0_; + UnicodeString* ubulk_; + stlstring* sbulk_; + FnType fnType_; +}; + + +class StringPerformanceTest : public UPerfTest +{ +public: + StringPerformanceTest(int32_t argc, const char *argv[], UErrorCode &status); + ~StringPerformanceTest(); + virtual UPerfFunction* runIndexedTest(int32_t index, UBool exec, + const char *&name, + char *par = NULL); + UPerfFunction* TestCtor(); + UPerfFunction* TestCtor1(); + UPerfFunction* TestCtor2(); + UPerfFunction* TestCtor3(); + UPerfFunction* TestAssign(); + UPerfFunction* TestAssign1(); + UPerfFunction* TestAssign2(); + UPerfFunction* TestGetch(); + UPerfFunction* TestCatenate(); + UPerfFunction* TestScan(); + UPerfFunction* TestScan1(); + UPerfFunction* TestScan2(); + + UPerfFunction* TestStdLibCtor(); + UPerfFunction* TestStdLibCtor1(); + UPerfFunction* TestStdLibCtor2(); + UPerfFunction* TestStdLibCtor3(); + UPerfFunction* TestStdLibAssign(); + UPerfFunction* TestStdLibAssign1(); + UPerfFunction* TestStdLibAssign2(); + UPerfFunction* TestStdLibGetch(); + UPerfFunction* TestStdLibCatenate(); + UPerfFunction* TestStdLibScan(); + UPerfFunction* TestStdLibScan1(); + UPerfFunction* TestStdLibScan2(); + +private: + long COUNT_; + ULine* filelines_; + UChar* StrBuffer; + int32_t StrBufferLen; + +}; + + +inline void ctor(const UChar* src,int32_t srcLen, UnicodeString s0) +{ + UnicodeString a; +} + +inline void ctor1(const UChar* src,int32_t srcLen, UnicodeString s0) +{ + UnicodeString b(uTESTCHAR1); +} + +inline void ctor2(const UChar* src,int32_t srcLen, UnicodeString s0) +{ + UnicodeString c(uEMPTY); +} + +inline void ctor3(const UChar* src,int32_t srcLen, UnicodeString s0) +{ + UnicodeString d(src,srcLen); +} + +inline UnicodeString icu_assign_helper(const UChar* src,int32_t srcLen) +{ + if (srcLen==-1) { return src;} + else { return UnicodeString(src, srcLen);} +} + +inline void assign(const UChar* src,int32_t srcLen, UnicodeString s0) +{ + unistr = icu_assign_helper(src,srcLen); +} + +inline void assign1(const UChar* src,int32_t srcLen, UnicodeString s0) +{ + unistr.setTo(src, srcLen); +} + +inline void assign2(const UChar* src,int32_t srcLen, UnicodeString s0) +{ + unistr = s0; +} + +inline void getch(const UChar* src,int32_t srcLen, UnicodeString s0) +{ + s0.charAt(0); +} + + +inline void catenate(const UChar* src,int32_t srcLen, UnicodeString s0) +{ + UTimer mystart, mystop; + utimer_getTime(&mystart); + + *catICU += s0; + + utimer_getTime(&mystop); + double mytime = utimer_getDeltaSeconds(&mystart,&mystop); + printf("\nmytime=%f \n", mytime); + + *catICU += uCatenate_STR; +} + +volatile int scan_idx; +U_STRING_DECL(SCAN1, "123", 3); + +inline void scan(const UChar* src,int32_t srcLen, UnicodeString s0) +{ + UChar c='.'; + scan_idx = uScan_STRING.indexOf(c); +} + +inline void scan1(const UChar* src,int32_t srcLen, UnicodeString s0) +{ + scan_idx = uScan_STRING.indexOf(SCAN1,3); +} + +inline void scan2(const UChar* src,int32_t srcLen, UnicodeString s0) +{ + UChar c1='s'; + UChar c2='m'; + scan_idx = uScan_STRING.indexOf(c1); + scan_idx = uScan_STRING.indexOf(c2); +} + + +inline void StdLibCtor(const wchar_t* src,int32_t srcLen, stlstring s0) +{ + stlstring a; +} + +inline void StdLibCtor1(const wchar_t* src,int32_t srcLen, stlstring s0) +{ + + stlstring b(simulate); +} + +inline void StdLibCtor2(const wchar_t* src,int32_t srcLen, stlstring s0) +{ + stlstring c(sEMPTY); +} + +inline void StdLibCtor3(const wchar_t* src,int32_t srcLen, stlstring s0) +{ + if (srcLen==-1) { + stlstring d(src); + }else { + stlstring d(src, srcLen); + } +} + +inline stlstring stl_assign_helper(const wchar_t* src,int32_t srcLen) +{ + if (srcLen==-1) { return src;} + else { return stlstring(src, srcLen);} +} + +inline void StdLibAssign(const wchar_t* src,int32_t srcLen, stlstring s0) +{ + stlstr = stl_assign_helper(src,srcLen); +} + +inline void StdLibAssign1(const wchar_t* src,int32_t srcLen, stlstring s0) +{ + if (srcLen==-1) { stlstr=src;} + else { stlstr.assign(src, srcLen);} +} + +inline void StdLibAssign2(const wchar_t* src,int32_t srcLen, stlstring s0) +{ + stlstr=s0; +} + +inline void StdLibGetch(const wchar_t* src,int32_t srcLen, stlstring s0) +{ + s0.at(0); +} + +inline void StdLibCatenate(const wchar_t* src,int32_t srcLen, stlstring s0) +{ + UTimer mystart, mystop; + utimer_getTime(&mystart); + + *catStd += s0; + *catStd += sCatenate_STR; + + utimer_getTime(&mystop); + double mytime = utimer_getDeltaSeconds(&mystart,&mystop); + printf("\nmytime=%f \n", mytime); + +} + +inline void StdLibScan(const wchar_t* src,int32_t srcLen, stlstring s0) +{ + scan_idx = (int) sScan_STRING.find('.'); +} + +inline void StdLibScan1(const wchar_t* src,int32_t srcLen, stlstring s0) +{ + scan_idx = (int) sScan_STRING.find(L"123"); +} + +inline void StdLibScan2(const wchar_t* src,int32_t srcLen, stlstring s0) +{ + scan_idx = (int) sScan_STRING.find_first_of(L"sm"); +} + +#endif // STRINGPERF_H \ No newline at end of file diff --git a/icuSources/test/perf/ustrperf/stringperf.vcproj b/icuSources/test/perf/ustrperf/stringperf.vcproj new file mode 100644 index 00000000..cd81e869 --- /dev/null +++ b/icuSources/test/perf/ustrperf/stringperf.vcproj @@ -0,0 +1,182 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="7.10" + Name="stringperf" + ProjectGUID="{523710EA-349D-45BF-8B39-289CC86E7D91}" + SccProjectName="" + SccLocalPath=""> + <Platforms> + <Platform + Name="Win32"/> + </Platforms> + <Configurations> + <Configuration + Name="Release|Win32" + OutputDirectory=".\Release" + IntermediateDirectory=".\Release" + ConfigurationType="1" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + Optimization="2" + InlineFunctionExpansion="1" + AdditionalIncludeDirectories="..\..\..\..\include,..\..\..\tools\toolutil,..\..\..\common" + PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE" + StringPooling="TRUE" + RuntimeLibrary="2" + EnableFunctionLevelLinking="TRUE" + UsePrecompiledHeader="2" + PrecompiledHeaderFile=".\Release/stringperf.pch" + AssemblerListingLocation=".\Release/" + ObjectFile=".\Release/" + ProgramDataBaseFileName=".\Release/" + WarningLevel="3" + SuppressStartupBanner="TRUE" + CompileAs="0"/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="icuuc.lib icutu.lib winmm.lib" + OutputFile=".\Release/stringperf.exe" + LinkIncremental="1" + SuppressStartupBanner="TRUE" + AdditionalLibraryDirectories="..\..\..\..\lib\" + ProgramDatabaseFile=".\Release/stringperf.pdb" + SubSystem="1" + TargetMachine="1"/> + <Tool + Name="VCMIDLTool" + TypeLibraryName=".\Release/stringperf.tlb" + HeaderFileName=""/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="NDEBUG" + Culture="1033"/> + <Tool + Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> + <Tool + Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> + </Configuration> + <Configuration + Name="Debug|Win32" + OutputDirectory=".\Debug" + IntermediateDirectory=".\Debug" + ConfigurationType="1" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="..\..\..\..\include,..\..\..\tools\toolutil,..\..\..\common" + PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE" + BasicRuntimeChecks="3" + RuntimeLibrary="3" + UsePrecompiledHeader="2" + PrecompiledHeaderFile=".\Debug/stringperf.pch" + AssemblerListingLocation=".\Debug/" + ObjectFile=".\Debug/" + ProgramDataBaseFileName=".\Debug/" + BrowseInformation="1" + WarningLevel="3" + SuppressStartupBanner="TRUE" + DebugInformationFormat="4" + CompileAs="0"/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="icuucd.lib icutud.lib winmm.lib" + OutputFile=".\Debug/stringperf.exe" + LinkIncremental="1" + SuppressStartupBanner="TRUE" + AdditionalLibraryDirectories="..\..\..\..\lib\" + GenerateDebugInformation="TRUE" + ProgramDatabaseFile=".\Debug/stringperf.pdb" + SubSystem="1" + TargetMachine="1"/> + <Tool + Name="VCMIDLTool" + TypeLibraryName=".\Debug/stringperf.tlb" + HeaderFileName=""/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="_DEBUG" + Culture="1047"/> + <Tool + Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> + <Tool + Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"> + <File + RelativePath="stringperf.cpp"> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + Optimization="2" + AdditionalIncludeDirectories="" + PreprocessorDefinitions=""/> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + BasicRuntimeChecks="3" + BrowseInformation="1"/> + </FileConfiguration> + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl"> + <File + RelativePath="stringperf.h"> + </File> + </Filter> + <Filter + Name="Resource Files" + Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/icuSources/test/testdata/CollationTest_NON_IGNORABLE_STUB.txt b/icuSources/test/testdata/CollationTest_NON_IGNORABLE_STUB.txt index 8ee09157..88ace446 100644 --- a/icuSources/test/testdata/CollationTest_NON_IGNORABLE_STUB.txt +++ b/icuSources/test/testdata/CollationTest_NON_IGNORABLE_STUB.txt @@ -1,3148 +1,2272 @@ -# Copyright (c) 2001-2003 International Business Machines -# Corporation and others. All Rights Reserved. -# This is a stub file -# for complete test file, go to: -# http://oss.software.ibm.com/cvs/icu4j/unicodetools/com/ibm/text/data/ -# based on: -# UCA Version: 3.1.1d6/3.2.0 -# Generated: 2002-07-02,18:49:19 GMT [MD] -0338 0334; -0334 0591; -0334 0592; -0334 0593; -0334 0594; -0334 0595; -0334 0596; -0334 0597; -0334 0598; -0334 0599; -0334 059A; -0334 059B; -0334 059C; -0334 059D; -0334 059E; -0334 059F; -0334 05A0; -0334 05A1; -0334 05A3; -0334 05A4; -0334 05A5; -0334 05A6; -0334 05A7; -0334 05A8; -0334 05A9; -0334 05AA; -0334 05AB; -0334 05AC; -059F 0021; -05A0 0021; -05A1 0021; -05A3 0021; -05A4 0021; -05A5 0021; -05A6 0021; -05A7 0021; -05A8 0021; -05A9 0021; -05AA 0021; -05AB 0021; -05AC 0021; -05AD 0021; -05AE 0021; -05AF 0021; -05BD 0021; -05C4 0021; -06DD 0021; -06DE 0021; -06DF 0021; -06E0 0021; -06EA 0021; -06EB 0021; -06EC 0021; -070F 0021; -0E4E 0021; -0F18 0021; -0F19 0021; -0F35 0021; -0F37 0021; -0F82 0021; -0F83 0021; -0F86 0021; -0F87 0021; -0FC6 0021; -180B 0021; -180C 0021; -180D 0021; -180E 0021; -200B 0021; -200C 0021; -200D 0021; -200E 0021; -200F 0021; -202A 0021; -202B 0021; -202C 0021; -202D 0021; -202E 0021; -206A 0021; -206B 0021; -206C 0021; -206D 0021; -206E 0021; -206F 0021; -D800 0021; -D801 0021; -D802 0021; -D803 0021; -D804 0021; -D805 0021; -D806 0021; -D807 0021; -D808 0021; -D809 0021; -D80A 0021; -D80B 0021; -D80C 0021; -D80D 0021; -D80E 0021; -D80F 0021; -D810 0021; -D811 0021; -D812 0021; -D813 0021; -D814 0021; -D815 0021; -D816 0021; -D817 0021; -D818 0021; -D819 0021; -D81A 0021; -D81B 0021; -D81C 0021; -D81D 0021; -D81E 0021; -D81F 0021; -D820 0021; -D821 0021; -D822 0021; -D823 0021; -D824 0021; -D825 0021; -D826 0021; -D827 0021; -D828 0021; -D829 0021; -D82A 0021; -D82B 0021; -D82C 0021; -D82D 0021; -D82E 0021; -D82F 0021; -D830 0021; -D831 0021; -D832 0021; -DFFF 0021; -FDD0 0021; -FDD1 0021; -FDD2 0021; -FDD3 0021; -FDD4 0021; -FDD5 0021; -FDD6 0021; -FDD7 0021; -FDD8 0021; -FDD9 0021; -FDDA 0021; -FDDB 0021; -FDDC 0021; -FDDD 0021; -FDDE 0021; -FDDF 0021; -FDE0 0021; -FDE1 0021; -FDE2 0021; -FDE3 0021; -FDE4 0021; -FDE5 0021; -FDE6 0021; -FDE7 0021; -FDE8 0021; -FDE9 0021; -FDEA 0021; -FDEB 0021; -FDEC 0021; -FDED 0021; -FDEE 0021; -FDEF 0021; -FEFF 0021; -FFF9 0021; -FFFA 0021; -FFFB 0021; -FFFE 0021; -FFFF 0021; -1D165 0021; -1D166 0021; -1D167 0021; -1D168 0021; -1D169 0021; -1D16D 0021; -1D16E 0021; -1D16F 0021; -1D170 0021; -1D171 0021; -1D172 0021; -1D173 0021; -1D174 0021; -1D175 0021; -1D176 0021; -1D177 0021; -1D178 0021; -1D179 0021; -1D17A 0021; -1D17B 0021; -1D17C 0021; -1D17D 0021; -1D17E 0021; -1D17F 0021; -1D180 0021; -1D181 0021; -1D182 0021; -1D185 0021; -1D186 0021; -1D187 0021; -1D188 0021; -1D189 0021; -1D18A 0021; -1D18B 0021; -1D1AA 0021; -1D1AB 0021; -1D1AC 0021; -1D1AD 0021; -1FFFE 0021; -1FFFF 0021; -2FFFE 0021; -2FFFF 0021; -3FFFE 0021; -3FFFF 0021; -4FFFE 0021; -4FFFF 0021; -5FFFE 0021; -5FFFF 0021; -6FFFE 0021; -6FFFF 0021; -7FFFE 0021; -7FFFF 0021; -8FFFE 0021; -8FFFF 0021; -9FFFE 0021; -9FFFF 0021; -AFFFE 0021; -AFFFF 0021; -BFFFE 0021; -BFFFF 0021; -CFFFE 0021; -CFFFF 0021; -DFFFE 0021; -DFFFF 0021; -E0001 0021; -E0020 0021; -E0021 0021; -E0022 0021; -E0023 0021; -E0024 0021; -E0025 0021; -E0026 0021; -E0027 0021; -E0028 0021; -E0029 0021; -E002A 0021; -E002B 0021; -E002C 0021; -E002D 0021; -E002E 0021; -E002F 0021; -E0030 0021; -E0031 0021; -E0032 0021; -E0033 0021; -E0034 0021; -E0035 0021; -E0036 0021; -E0037 0021; -E0038 0021; -E0039 0021; -E003A 0021; -E003B 0021; -E003C 0021; -E003D 0021; -E003E 0021; -E003F 0021; -E0040 0021; -E0041 0021; -E0042 0021; -E0043 0021; -E0044 0021; -E0045 0021; -E0046 0021; -E0047 0021; -E0048 0021; -E0049 0021; -E004A 0021; -E004B 0021; -E004C 0021; -E004D 0021; -E004E 0021; -E004F 0021; -E0050 0021; -E0051 0021; -E0052 0021; -E0053 0021; -E0054 0021; -E0055 0021; -E0056 0021; -327F 0021; -327F 0061; -327F 0041; -327F 00E1; -327F 0062; -FFFC 0021; -FFFC 0061; -FFFC 0041; -FFFC 00E1; -FFFC 0062; -FFFD 0021; -FFFD 0061; -FFFD 0041; -FFFD 00E1; -FFFD 0062; -09F8 0021; -09F8 0061; -09F8 0041; -09F8 00E1; -09F8 0062; -09F9 0021; -09F9 0061; -09F9 0041; -09F9 00E1; -09F9 0062; -0BF0 0021; -0BF0 0061; -0BF0 0041; -0BF0 00E1; -0BF0 0062; -0BF1 0021; -0BF1 0061; -0BF1 0041; -0BF1 00E1; -0BF1 0062; -0BF2 0021; -0BF2 0061; -0BF2 0041; -0BF2 00E1; -0BF2 0062; -1372 0021; -1372 0061; -1372 0041; -1372 00E1; -1372 0062; -1373 0021; -1373 0061; -1373 0041; -1373 00E1; -1373 0062; -1374 0021; -1374 0061; -1374 0041; -1374 00E1; -1374 0062; -1375 0021; -1375 0061; -1375 0041; -1375 00E1; -1375 0062; -1376 0021; -1376 0061; -1376 0041; -1376 00E1; -1376 0062; -1377 0021; -1377 0061; -1377 0041; -1377 00E1; -1377 0062; -1378 0021; -1378 0061; -1378 0041; -1378 00E1; -1378 0062; -1379 0021; -1379 0061; -1379 0041; -1379 00E1; -1379 0062; -137A 0021; -137A 0061; -137A 0041; -137A 00E1; -137A 0062; -137B 0021; -137B 0061; -137B 0041; -137B 00E1; -137B 0062; -137C 0021; -137C 0061; -137C 0041; -137C 00E1; -137C 0062; -10322 0021; -10322 0061; -10322 0041; -10322 00E1; -10322 0062; -10323 0021; -10323 0061; -10323 0041; -10323 00E1; -10323 0062; -02D0 0021; -02D0 0061; -02D0 0041; -02D0 00E1; -02D0 0062; -02D1 0021; -02D1 0061; -02D1 0041; -02D1 00E1; -02D1 0062; -0E46 0021; -0E46 0061; -0E46 0041; -0E46 00E1; -0E46 0062; -0EC6 0021; -0EC6 0061; -0EC6 0041; -0EC6 00E1; -0EC6 0062; -3005 0021; -3005 0061; -3005 0041; -3005 00E1; -3005 0062; -3031 0021; -3032 0021; -3031 0061; -3031 0041; -3031 00E1; -3032 0061; -3032 0041; -3032 00E1; -3031 0062; -3032 0062; -3033 0021; -3034 0021; -3033 0061; -3033 0041; -3033 00E1; -3034 0061; -3034 0041; -3034 00E1; -3033 0062; -3034 0062; -3035 0021; -3035 0061; -3035 0041; -3035 00E1; -3035 0062; -309D 0334 3099; -309D 3099 0334; -309E 0334; -309D 0021; -309E 0021; -309D 0061; -309D 0041; -309D 00E1; -309E 0061; -309E 0041; -309E 00E1; -309D 0062; -309E 0062; -30FC 0021; -FF70 0021; -30FC 0061; -30FC 0041; -FF70 0061; -FF70 0041; -30FC 00E1; -FF70 00E1; -30FC 0062; -FF70 0062; -30FD 0334 3099; -30FD 3099 0334; -30FE 0334; -30FD 0021; -30FE 0021; -30FD 0061; -30FD 0041; -30FD 00E1; -30FE 0061; -30FE 0041; -30FE 00E1; -30FD 0062; -30FE 0062; -00A4 0021; -00A4 0061; -00A4 0041; -00A4 00E1; -00A4 0062; -00A2 0021; -FFE0 0021; -00A2 0061; -00A2 0041; -FFE0 0061; -FFE0 0041; -00A2 00E1; -FFE0 00E1; -00A2 0062; -FFE0 0062; -0024 0021; -FF04 0021; -FE69 0021; -0024 0061; -0024 0041; -FF04 0061; -FF04 0041; -FE69 0061; -FE69 0041; -0024 00E1; -FF04 00E1; -FE69 00E1; -0024 0062; -FF04 0062; -FE69 0062; -00A3 0021; -FFE1 0021; -00A3 0061; -00A3 0041; -FFE1 0061; -FFE1 0041; -00A3 00E1; -FFE1 00E1; -00A3 0062; -FFE1 0062; -00A5 0021; -FFE5 0021; -00A5 0061; -00A5 0041; -FFE5 0061; -FFE5 0041; -00A5 00E1; -FFE5 00E1; -00A5 0062; -FFE5 0062; -09F2 0021; -09F2 0061; -09F2 0041; -09F2 00E1; -09F2 0062; -09F3 0021; -09F3 0061; -09F3 0041; -09F3 00E1; -2081 0041; -0031 00E1; -FF11 00E1; -1D7CF 00E1; -1D7D9 00E1; -1D7E3 00E1; -1D7ED 00E1; -1D7F7 00E1; -2460 00E1; -00B9 00E1; -2081 00E1; -2776 0061; -2776 0041; -2776 00E1; -2780 0061; -2780 0041; -2780 00E1; -278A 0061; -278A 0041; -278A 00E1; -0661 0061; -0661 0041; -0661 00E1; -06F1 0061; -06F1 0041; -06F1 00E1; -1369 0061; -1369 0041; -1369 00E1; -0967 0061; -0967 0041; -0967 00E1; -09E7 0061; -09E7 0041; -09E7 00E1; -09F4 0061; -09F4 0041; -09F4 00E1; -0A67 0061; -0A67 0041; -0A67 00E1; -0AE7 0061; -0AE7 0041; -0AE7 00E1; -0B67 0061; -0B67 0041; -0B67 00E1; -0BE7 0061; -0BE7 0041; -0BE7 00E1; -0A6E 00E1; -0AEE 0061; -0AEE 0041; -0AEE 00E1; -0B6E 0061; -0B6E 0041; -0B6E 00E1; -0BEE 0061; -0BEE 0041; -0BEE 00E1; -0C6E 0061; -0C6E 0041; -0C6E 00E1; -0CEE 0061; -0CEE 0041; -0CEE 00E1; -0D6E 0061; -0D6E 0041; -0D6E 00E1; -0E58 0061; -0E58 0041; -0E58 00E1; -0ED8 0061; -0ED8 0041; -0ED8 00E1; -0F28 0061; -0F31 0061; -0F28 0041; -0F31 0041; -0F28 00E1; -0F31 00E1; -1048 0061; -1048 0041; -1048 00E1; -17E8 0061; -17E8 0041; -17E8 00E1; -1818 0061; -1818 0041; -1818 00E1; -3028 0061; -3028 0041; -3028 00E1; -0038 0062; -FF18 0062; -1D7D6 0062; -1D7E0 0062; -1D7EA 0062; -1D7F4 0062; -1D7FE 0062; -2467 0062; -2078 0062; -2088 0062; -277D 0062; -2787 0062; -2791 0062; -0668 0062; -06F8 0062; -1370 0062; -096E 0062; -09EE 0062; -0A6E 0062; -0AEE 0062; -0B6E 0062; -0BEE 0062; -0C6E 0062; -0CEE 0062; -0D6E 0062; -0E58 0062; -0ED8 0062; -0F28 0062; -0F31 0062; -1048 0062; -17E8 0062; -1818 0062; -3028 0062; -33E7 0021; -33E7 0061; -33E7 0041; -33E7 00E1; -33E7 0062; -32C7 0021; -32C7 0061; -32C7 0041; -32C7 00E1; -32C7 0062; -3360 0021; -3360 0061; -3360 0041; -3360 00E1; -3360 0062; -0039 0021; -FF19 0021; -1D7D7 0021; -1D7E1 0021; -1D7EB 0021; -1D7F5 0021; -1D7FF 0021; -2468 0021; -2079 0021; -2089 0021; -277E 0021; -2788 0021; -2792 0021; -0669 0021; -06F9 0021; -1371 0021; -096F 0021; -09EF 0021; -0A6F 0021; -0AEF 0021; -0B6F 0021; -0BEF 0021; -0C6F 0021; -0CEF 0021; -0D6F 0021; -0E59 0021; -0ED9 0021; -0F29 0021; -0F32 0021; -1049 0021; -17E9 0021; -1819 0021; -3029 0021; -2490 0021; -2490 0061; -2490 0041; -2490 00E1; -2490 0062; -0039 0061; -0039 0041; -FF19 0061; -FF19 0041; -1D7D7 0061; -1D7E1 0061; -1D7EB 0061; -1D7F5 0061; -1D7FF 0061; -1D7D7 0041; -1D7E1 0041; -1D7EB 0041; -1D7F5 0041; -1D7FF 0041; -2468 0061; -2468 0041; -2079 0061; -2079 0041; -2089 0061; -2089 0041; -0039 00E1; -FF19 00E1; -1D7D7 00E1; -1D7E1 00E1; -1D7EB 00E1; -1D7F5 00E1; -1D7FF 00E1; -2468 00E1; -2079 00E1; -2089 00E1; -277E 0061; -277E 0041; -277E 00E1; -2788 0061; -2788 0041; -2788 00E1; -2792 0061; -2792 0041; -2792 00E1; -0669 0061; -0669 0041; -0669 00E1; -06F9 0061; -06F9 0041; -06F9 00E1; -1371 0061; -1371 0041; -1371 00E1; -096F 0061; -096F 0041; -096F 00E1; -09EF 0061; -09EF 0041; -09EF 00E1; -0A6F 0061; -0A6F 0041; -0A6F 00E1; -0AEF 0061; -0AEF 0041; -0AEF 00E1; -0B6F 0061; -0B6F 0041; -0B6F 00E1; -0BEF 0061; -0BEF 0041; -0BEF 00E1; -0C6F 0061; -0C6F 0041; -0C6F 00E1; -0CEF 0061; -0CEF 0041; -0CEF 00E1; -0D6F 0061; -0D6F 0041; -0D6F 00E1; -0E59 0061; -0E59 0041; -0E59 00E1; -0ED9 0061; -0ED9 0041; -0ED9 00E1; -0F29 0061; -0F32 0061; -0F29 0041; -0F32 0041; -0F29 00E1; -0F32 00E1; -1049 0061; -1049 0041; -1049 00E1; -17E9 0061; -17E9 0041; -17E9 00E1; -1819 0061; -1819 0041; -1819 00E1; -3029 0061; -3029 0041; -3029 00E1; -0039 0062; -FF19 0062; -1D7D7 0062; -1D7E1 0062; -1D7EB 0062; -1D7F5 0062; -1D7FF 0062; -2468 0062; -2079 0062; -2089 0062; -277E 0062; -2788 0062; -2792 0062; -0669 0062; -06F9 0062; -1371 0062; -096F 0062; -09EF 0062; -0A6F 0062; -0AEF 0062; -0B6F 0062; -0BEF 0062; -0C6F 0062; -0CEF 0062; -0D6F 0062; -0E59 0062; -0ED9 0062; -0F29 0062; -0F32 0062; -1049 0062; -17E9 0062; -1819 0062; -3029 0062; -33E8 0021; -33E8 0061; -33E8 0041; -33E8 00E1; -33E8 0062; -32C8 0021; -32C8 0061; -32C8 0041; -32C8 00E1; -32C8 0062; -3361 0021; -3361 0061; -3361 0041; -3361 00E1; -3361 0062; -0000 0061; -0001 0061; -0002 0061; -0003 0061; -0004 0061; -0005 0061; -0006 0061; -0007 0061; -0008 0061; -000E 0061; -000F 0061; -0010 0061; -0011 0061; -0012 0061; -0013 0061; -0014 0061; -0015 0061; -0016 0061; -0017 0061; -0018 0061; -0019 0061; -001A 0061; -001B 0061; -001C 0061; -001D 0061; -001E 0061; -001F 0061; -007F 0061; -0080 0061; -0081 0061; -0082 0061; -0083 0061; -0084 0061; -0086 0061; -0087 0061; -0088 0061; -0089 0061; -008A 0061; -008B 0061; -008C 0061; -008D 0061; -008E 0061; -008F 0061; -0090 0061; -0091 0061; -0092 0061; -0093 0061; -0094 0061; -0095 0061; -0096 0061; -0097 0061; -0098 0061; -0099 0061; -009A 0061; -009B 0061; -009C 0061; -009D 0061; -009E 0061; -009F 0061; -0488 0061; -0489 0061; -0591 0061; -0592 0061; -0593 0061; -0594 0061; -0595 0061; -0596 0061; -0597 0061; -0598 0061; -0599 0061; -059A 0061; -059B 0061; -059C 0061; -059D 0061; -059E 0061; -059F 0061; -05A0 0061; -05A1 0061; -05A3 0061; -05A4 0061; -05A5 0061; -05A6 0061; -05A7 0061; -05A8 0061; -05A9 0061; -05AA 0061; -05AB 0061; -05AC 0061; -05AD 0061; -05AE 0061; -05AF 0061; -05BD 0061; -05C4 0061; -06DD 0061; -06DE 0061; -06DF 0061; -06E0 0061; -06EA 0061; -06EB 0061; -06EC 0061; -070F 0061; -0E4E 0061; -0F18 0061; -0F19 0061; -0F35 0061; -0F37 0061; -0F82 0061; -0F83 0061; -0F86 0061; -0F87 0061; -0FC6 0061; -180B 0061; -180C 0061; -180D 0061; -180E 0061; -200B 0061; -200C 0061; -200D 0061; -200E 0061; -200F 0061; -202A 0061; -202B 0061; -202C 0061; -202D 0061; -1D179 0041; -1D17A 0041; -1D17B 0041; -1D17C 0041; -1D17D 0041; -1D17E 0041; -1D17F 0041; -1D180 0041; -1D181 0041; -1D182 0041; -1D185 0041; -1D186 0041; -1D187 0041; -1D188 0041; -1D189 0041; -1D18A 0041; -1D18B 0041; -1D1AA 0041; -1D1AB 0041; -1D1AC 0041; -1D1AD 0041; -1FFFE 0041; -1FFFF 0041; -2FFFE 0041; -2FFFF 0041; -3FFFE 0041; -3FFFF 0041; -4FFFE 0041; -4FFFF 0041; -5FFFE 0041; -5FFFF 0041; -6FFFE 0041; -6FFFF 0041; -7FFFE 0041; -7FFFF 0041; -8FFFE 0041; -8FFFF 0041; -9FFFE 0041; -9FFFF 0041; -AFFFE 0041; -AFFFF 0041; -BFFFE 0041; -BFFFF 0041; -CFFFE 0041; -CFFFF 0041; -DFFFE 0041; -DFFFF 0041; -E0001 0041; -E0020 0041; -E0021 0041; -E0022 0041; -E0023 0041; -E0024 0041; -E0025 0041; -E0026 0041; -E0027 0041; -E0028 0041; -E0029 0041; -E002A 0041; -E002B 0041; -E002C 0041; -E002D 0041; -E002E 0041; -E002F 0041; -E0030 0041; -E0031 0041; -E0032 0041; -E0033 0041; -E0034 0041; -E0035 0041; -E0036 0041; -E0037 0041; -E0038 0041; -E0039 0041; -E003A 0041; -E003B 0041; -E003C 0041; -E003D 0041; -E003E 0041; -E003F 0041; -E0040 0041; -E0041 0041; -E0042 0041; -E0043 0041; -E0044 0041; -E0045 0041; -E0046 0041; -E0047 0041; -E0048 0041; -E0049 0041; -E004A 0041; -E004B 0041; -E004C 0041; -E004D 0041; -E004E 0041; -E004F 0041; -1FBB 0061; -0386 0041; -1FBB 0041; -03AC 00E1; -1F71 00E1; -0386 00E1; -1FBB 00E1; -1FB4 0061; -1FB4 0041; -1FB4 00E1; -1F70 0061; -1F70 0041; -1FBA 0061; -1FBA 0041; -1F70 00E1; -1FBA 00E1; -1FB2 0061; -1FB2 0041; -1FB2 00E1; -1FB0 0061; -1FB0 0041; -1FB8 0061; -1FB8 0041; -1FB0 00E1; -1FB8 00E1; -1FB6 0061; -1FB6 0041; -1FB6 00E1; -1FB7 0061; -1FB7 0041; -1FB7 00E1; -1FB1 0061; -1FB1 0041; -1FB9 0061; -1FB9 0041; -1FB1 00E1; -1FB9 00E1; -1FB3 0061; -1FB3 0041; -1FBC 0061; -1FBC 0041; -1FB3 00E1; -1FBC 00E1; -03B1 0062; -1D6C2 0062; -1D6FC 0062; -1D736 0062; -1D770 0062; -1D7AA 0062; -0391 0062; -1D6A8 0062; -1D6E2 0062; -1D71C 0062; -1D756 0062; -1D790 0062; -1F00 0062; -1F08 0062; -1F04 0062; -1F0C 0062; -1F84 0062; -1F8C 0062; -1F02 0062; -1F0A 0062; -1F82 0062; -1F8A 0062; -1F06 0062; -1F0E 0062; -1F86 0062; -1F8E 0062; -1F80 0062; -1F88 0062; -1F01 0062; -1F09 0062; -1F05 0062; -1F0D 0062; -1F85 0062; -1F8D 0062; -1F03 0062; -1F0B 0062; -1F83 0062; -1F8B 0062; -1F07 0062; -1F0F 0062; -1F87 0062; -1F8F 0062; -1F81 0062; -1F89 0062; -03AC 0062; -1F71 0062; -0386 0062; -1FBB 0062; -1FB4 0062; -1F70 0062; -1FBA 0062; -1FB2 0062; -1FB0 0062; -1FB8 0062; -1FB6 0062; -1FB7 0062; -1FB1 0062; -1FB9 0062; -1FB3 0062; -1FBC 0062; -03B2 0021; -03D0 0021; -1D6C3 0021; -1D6FD 0021; -1D737 0021; -1D771 0021; -1D7AB 0021; -0392 0021; -1D6A9 0021; -1D6E3 0021; -1D71D 0021; -1D757 0021; -1D791 0021; -03B2 0061; -03B2 0041; -03D0 0061; -03D0 0041; -1D6C3 0061; -1D6FD 0061; -1D737 0061; -1D771 0061; -1D7AB 0061; -1D6C3 0041; -1D6FD 0041; -1D737 0041; -1D771 0041; -1D7AB 0041; -0392 0061; -0392 0041; -1D6A9 0061; -1D6E3 0061; -1D71D 0061; -1D757 0061; -1D791 0061; -1D6A9 0041; -1D6E3 0041; -1D71D 0041; -1D757 0041; -1D791 0041; -03B2 00E1; -03D0 00E1; -1D6C3 00E1; -1D6FD 00E1; -1D737 00E1; -1D771 00E1; -1D7AB 00E1; -0392 00E1; -1D6A9 00E1; -1D6E3 00E1; -1D71D 00E1; -1D757 00E1; -1D791 00E1; -03B2 0062; -03D0 0062; -1D6C3 0062; -1D6FD 0062; -1D737 0062; -1D771 0062; -1D7AB 0062; -0392 0062; -1D6A9 0062; -1D6E3 0062; -1D71D 0062; -1D757 0062; -1D791 0062; -03B3 0021; -1D6C4 0021; -1D6FE 0021; -1D738 0021; -1D772 0021; -1D7AC 0021; -0393 0021; -1D6AA 0021; -1D6E4 0021; -1D71E 0021; -1D758 0021; -1D792 0021; -03B3 0061; -03B3 0041; -1D6C4 0061; -1D6FE 0061; -1D738 0061; -1D772 0061; -1D7AC 0061; -1D6C4 0041; -1D6FE 0041; -1D738 0041; -1D772 0041; -1D7AC 0041; -0393 0061; -0393 0041; -1D6AA 0061; -1D6E4 0061; -1D71E 0061; -1D758 0061; -1D792 0061; -1D6AA 0041; -1D6E4 0041; -1D71E 0041; -1D758 0041; -1D792 0041; -03B3 00E1; -1D6C4 00E1; -1D6FE 00E1; -1D738 00E1; -1D772 00E1; -1D7AC 00E1; -0393 00E1; -1D6AA 00E1; -1D6E4 00E1; -1D71E 00E1; -1D758 00E1; -1D792 00E1; -03B3 0062; -1D6C4 0062; -1D6FE 0062; -1D738 0062; -1D772 0062; -1D7AC 0062; -0393 0062; -1D6AA 0062; -1D6E4 0062; -1D71E 0062; -1D758 0062; -1D792 0062; -03B4 0021; -1D6C5 0021; -1D6FF 0021; -1D739 0021; -1D773 0021; -1D7AD 0021; -0394 0021; -1D6AB 0021; -1D6E5 0021; -1D71F 0021; -1D759 0021; -1D793 0021; -03B4 0061; -03B4 0041; -1D6C5 0061; -1D6FF 0061; -1D739 0061; -1D773 0061; -1D7AD 0061; -1D6C5 0041; -1D6FF 0041; -1D739 0041; -1D773 0041; -1D7AD 0041; -0394 0061; -0394 0041; -1D6AB 0061; -1D6E5 0061; -1D71F 0061; -1D759 0061; -1D793 0061; -1D6AB 0041; -1D6E5 0041; -1D71F 0041; -1D759 0041; -1D793 0041; -03B4 00E1; -1D6C5 00E1; -1D6FF 00E1; -1D739 00E1; -1D773 00E1; -1D7AD 00E1; -0394 00E1; -1D6AB 00E1; -1D6E5 00E1; -1D71F 00E1; -1D759 00E1; -1D793 00E1; -03B4 0062; -1D6C5 0062; -1D6FF 0062; -1D739 0062; -1D773 0062; -1D7AD 0062; -0394 0062; -1D6AB 0062; -1D6E5 0062; -1D71F 0062; -1D759 0062; -1D793 0062; -03B5 0313 0334; -03B5 0334 0343; -03B5 0343 0334; -1F10 0334; -0395 0313 0334; -0395 0334 0313; -0395 0334 0343; -1F18 0334; -03B5 0313 0334 0341; -03B5 0334 0343 0341; -1F10 0334 0301; -1F14 0334; -0395 0334 0313 0341; -0395 0334 0343 0301; -0395 0343 0301 0334; -1F18 0341 0334; -03B5 0313 0334 0340; -03B5 0334 0343 0340; -03B5 0343 0300 0334; -1F10 0334 0300; -0395 0313 0300 0334; -0395 0334 0313 0340; -0395 0334 0343 0300; -1F18 0334 0340; -03B5 0314 0334; -03B5 0334 0314; -1F11 0334; -0395 0314 0334; -0395 0334 0314; -1F19 0334; -03B5 0314 0334 0301; -03B5 0314 0334 0341; -03B5 0334 0314 0301; -1F11 0334 0301; -0395 0314 0334 0301; -1F19 0301 0334; -1F19 0334 0341; -1F19 0341 0334; -03B5 0314 0334 0300; -03B5 0334 0314 0300; -1F11 0300 0334; -1F11 0334 0300; -0395 0314 0300 0334; -0395 0314 0340 0334; -1F19 0334 0300; -1F19 0334 0340; -03B5 0301 0334; -03B5 0334 0301; -03B5 0334 0341; -1F73 0334; -0388 0334; -0395 0301 0334; -0395 0334 0301; -0395 0341 0334; -03B5 0334 0300; -03B5 0334 0340; -03B5 0340 0334; -1F72 0334; -0395 0300 0334; -0395 0334 0300; -0395 0340 0334; -1FC8 0334; -03B5 0021; -03F5 0021; -1D6C6 0021; -1D6DC 0021; -1D700 0021; -1D716 0021; -1D73A 0021; -1D750 0021; -1D774 0021; -1D78A 0021; -1D7AE 0021; -1D7C4 0021; -0395 0021; -1D6AC 0021; -1D6E6 0021; -1D720 0021; -1D75A 0021; -1D794 0021; -1F10 0021; -1F18 0021; -1F14 0021; -1F1C 0021; -1F12 0021; -1F1A 0021; -1F11 0021; -1F19 0021; -1F15 0021; -1F1D 0021; -1F13 0021; -1F1B 0021; -03AD 0021; -1F73 0021; -0388 0021; -1FC9 0021; -1F72 0021; -1FC8 0021; -03B5 0061; -03B5 0041; -03F5 0061; -03F5 0041; -1D6C6 0061; -1D6DC 0061; -1D700 0061; -1D716 0061; -1D73A 0061; -1D750 0061; -1D774 0061; -1D78A 0061; -1D7AE 0061; -1D7C4 0061; -1D6C6 0041; -1D6DC 0041; -1D700 0041; -1D716 0041; -1D73A 0041; -1D750 0041; -1D774 0041; -1D78A 0041; -1D7AE 0041; -1D7C4 0041; -0395 0061; -0395 0041; -1D6AC 0061; -1D6E6 0061; -1D720 0061; -1D75A 0061; -1D794 0061; -1D6AC 0041; -1D6E6 0041; -1D720 0041; -1D75A 0041; -1D794 0041; -03B5 00E1; -03F5 00E1; -1D6C6 00E1; -1D6DC 00E1; -1D700 00E1; -1D716 00E1; -1D73A 00E1; -1D750 00E1; -1D774 00E1; -1D78A 00E1; -1D7AE 00E1; -1D7C4 00E1; -0395 00E1; -1D6AC 00E1; -1D6E6 00E1; -1D720 00E1; -1D75A 00E1; -1D794 00E1; -1F10 0061; -1F10 0041; -1F18 0061; -1F18 0041; -1F10 00E1; -1F18 00E1; -1F14 0061; -1F14 0041; -1F1C 0061; -1F1C 0041; -1F14 00E1; -1F1C 00E1; -1F12 0061; -1F12 0041; -1F1A 0061; -1F1A 0041; -1F12 00E1; -1F1A 00E1; -1F11 0061; -1F11 0041; -1F19 0061; -1F19 0041; -1F11 00E1; -1F19 00E1; -1F15 0061; -1F15 0041; -1F1D 0061; -1F1D 0041; -1F15 00E1; -1F1D 00E1; -1F13 0061; -1F13 0041; -1F1B 0061; -1F1B 0041; -1F13 00E1; -1F1B 00E1; -03AD 0061; -1F73 0061; -03AD 0041; -1F73 0041; -0388 0061; -1FC9 0061; -0388 0041; -1FC9 0041; -03AD 00E1; -1F73 00E1; -0388 00E1; -1FC9 00E1; -1F72 0061; -1F72 0041; -1FC8 0061; -1FC8 0041; -1F72 00E1; -1FC8 00E1; -03B5 0062; -03F5 0062; -1D6C6 0062; -1D6DC 0062; -1D700 0062; -1D716 0062; -1D73A 0062; -1D750 0062; -1D774 0062; -1D78A 0062; -1D7AE 0062; -1D7C4 0062; -0395 0062; -1D6AC 0062; -1D6E6 0062; -1D720 0062; -1D75A 0062; -1D794 0062; -1F10 0062; -1F18 0062; -1F14 0062; -1F1C 0062; -1F12 0062; -1F1A 0062; -1F11 0062; -1F19 0062; -1F15 0062; -1F1D 0062; -1F13 0062; -1F1B 0062; -03AD 0062; -1F73 0062; -0388 0062; -1FC9 0062; -1F72 0062; -1FC8 0062; -03DD 0021; -03DC 0021; -03DD 0061; -03DD 0041; -03DC 0061; -03DC 0041; -03DD 00E1; -03DC 00E1; -03DD 0062; -03DC 0062; -03DB 0021; -03DA 0021; -03DB 0061; -03DB 0041; -03DA 0061; -03DA 0041; -03DB 00E1; -03DA 00E1; -03DB 0062; -03DA 0062; -03B6 0021; -1D6C7 0021; -1D701 0021; -1D73B 0021; -1D775 0021; -1D7AF 0021; -0396 0021; -1D6AD 0021; -1D6E7 0021; -1D721 0021; -1D75B 0021; -1D795 0021; -03B6 0061; -03B6 0041; -1D6C7 0061; -1D701 0061; -1D73B 0061; -1D775 0061; -1D7AF 0061; -1D6C7 0041; -1D701 0041; -1D73B 0041; -1D775 0041; -1D7AF 0041; -0396 0061; -0396 0041; -1D6AD 0061; -1D6E7 0061; -1D721 0061; -1D75B 0061; -1D795 0061; -1D6AD 0041; -1D6E7 0041; -1D721 0041; -1D75B 0041; -1D795 0041; -03B6 00E1; -1D6C7 00E1; -1D701 00E1; -1D73B 00E1; -1D775 00E1; -1D7AF 00E1; -0396 00E1; -1D6AD 00E1; -1D6E7 00E1; -1D721 00E1; -1D75B 00E1; -1D795 00E1; -03B6 0062; -1D6C7 0062; -1D701 0062; -1D73B 0062; -1D775 0062; -1D7AF 0062; -0396 0062; -1D6AD 0062; -1D6E7 0062; -1D721 0062; -1D75B 0062; -1D795 0062; -03B7 0313 0334; -03B7 0334 0343; -03B7 0343 0334; -1F20 0334; -0397 0313 0334; -0397 0334 0313; -0397 0343 0334; -1F28 0334; -03B7 0334 0313 0341; -03B7 0334 0343 0301; -03B7 0343 0341 0334; -1F20 0301 0334; -0397 0313 0301 0334; -0397 0334 0313 0301; -0397 0343 0334 0301; -1F28 0334 0301; -03B7 0313 0334 0341 0345; -03B7 0345 0334 0343 0341; -1FC3 0313 0301 0334; -1FC3 0313 0334 0301; -0397 0343 0301 0334 0345; -0397 0343 0334 0345 0301; -0397 0343 0341 0334 0345; -1F28 0345 0341 0334; -03B7 0334 0313 0300; -03B7 0343 0334 0340; -1F20 0340 0334; -1F22 0334; -0397 0313 0340 0334; -0397 0343 0334 0300; -1F28 0300 0334; -1F28 0334 0300; -03B7 0343 0300 0334 0345; -03B7 0343 0340 0334 0345; -1FC3 0313 0334 0300; -1FC3 0334 0313 0340; -0397 0343 0334 0345 0300; -0397 0343 0345 0340 0334; -0397 0345 0343 0334 0340; -1F28 0334 0300 0345; -03B7 0313 0342 0334; -03B7 0334 0313 0342; -03B7 0334 0343 0342; -1F20 0342 0334; -0397 0343 0334 0342; -0397 0343 0342 0334; -1F28 0334 0342; -1F28 0342 0334; -03B7 0313 0345 0342 0334; -1F20 0342 0334 0345; -1F90 0334 0342; -1FC3 0313 0342 0334; -0397 0334 0313 0342 0345; -0397 0345 0343 0334 0342; -1F28 0342 0345 0334; -1F2E 0345 0334; -03B7 0343 0345 0334; -03B7 0345 0313 0334; -03B7 0345 0334 0313; -03B7 0345 0334 0343; -0397 0343 0334 0345; -0397 0343 0345 0334; -0397 0345 0334 0313; -0397 0345 0334 0343; -03B7 0314 0334; -03B7 0334 0314; -1F21 0334; -0397 0314 0334; -0397 0334 0314; -1F29 0334; -03B7 0314 0301 0334; -03B7 0314 0334 0301; -1F21 0301 0334; -1F25 0334; -0397 0314 0334 0341; -0397 0314 0341 0334; -0397 0334 0314 0341; -1F2D 0334; -03B7 0314 0334 0345 0301; -03B7 0314 0341 0345 0334; -1F21 0301 0334 0345; -1F25 0345 0334; -0397 0334 0314 0301 0345; -1F29 0334 0301 0345; -1F99 0334 0341; -1FCC 0314 0334 0341; -03B7 0314 0300 0334; -03B7 0314 0334 0300; -03B7 0314 0340 0334; -1F21 0340 0334; -0397 0314 0334 0340; -0397 0334 0314 0300; -1F29 0340 0334; -1F2B 0334; -03B7 0314 0334 0345 0300; -03B7 0314 0345 0300 0334; -1F91 0300 0334; -1FC3 0314 0334 0300; -1F29 0300 0345 0334; -1F29 0340 0334 0345; -1F99 0334 0340; -1FCC 0314 0334 0340; -03B7 0314 0334 0342; -03B7 0314 0342 0334; -1F21 0334 0342; -1F21 0342 0334; -0397 0314 0334 0342; -0397 0334 0314 0342; -1F29 0334 0342; -1F29 0342 0334; -03B7 0334 0314 0345 0342; -1F27 0334 0345; -1F27 0345 0334; -1FC3 0334 0314 0342; -0397 0314 0334 0342 0345; -0397 0314 0342 0334 0345; -0397 0345 0314 0334 0342; -0397 0345 0314 0342 0334; -03B7 0314 0345 0334; -03B7 0345 0314 0334; -03B7 0345 0334 0314; -1FC3 0334 0314; -0397 0334 0314 0345; -0397 0334 0345 0314; -1F29 0345 0334; -1FCC 0334 0314; -03B7 0301 0334; -03B7 0334 0301; -03B7 0334 0341; -03B7 0341 0334; -0397 0301 0334; -0397 0334 0341; -0397 0341 0334; -1FCB 0334; -03B7 0334 0341 0345; -03B7 0345 0334 0341; -1F75 0334 0345; -1FC3 0341 0334; -03B7 0300 0334; -03B7 0334 0300; -03B7 0334 0340; -1F74 0334; -0397 0334 0300; -0397 0334 0340; -0397 0340 0334; -1FCA 0334; -03B7 0340 0334 0345; -03B7 0340 0345 0334; -03B7 0345 0334 0340; -1FC2 0334; -03B7 0334 0342; -03B7 0342 0334; -1FC6 0334; -03B7 0342 0345 0334; -03B7 0345 0334 0342; -03B7 0345 0342 0334; -1FC3 0334 0342; -03B7 0334 0345; -03B7 0345 0334; -1FC3 0334; -0397 0334 0345; -0397 0345 0334; -1FCC 0334; -03B7 0021; -1D6C8 0021; -1D702 0021; -1D73C 0021; -1D776 0021; -1D7B0 0021; -0397 0021; -1D6AE 0021; -1D6E8 0021; -1D722 0021; -1D75C 0021; -1D796 0021; -1F20 0021; -1F28 0021; -1F24 0021; -1F2C 0021; -1F94 0021; -1F9C 0021; -1F22 0021; -1F2A 0021; -1F92 0021; -1F9A 0021; -1F26 0021; -1F2E 0021; -1F96 0021; -1F9E 0021; -1F90 0021; -1F98 0021; -1F21 0021; -1F29 0021; -1F25 0021; -1F2D 0021; -1F95 0021; -1F9D 0021; -1F23 0021; -1F2B 0021; -1F93 0021; -1F9B 0021; -1F27 0021; -1F2F 0021; -1F97 0021; -1F9F 0021; -1F91 0021; -1F99 0021; -03AE 0021; -1F75 0021; -0389 0021; -1FCB 0021; -1FC4 0021; -1F74 0021; -1FCA 0021; -1FC2 0021; -1FC6 0021; -1FC7 0021; -1FC3 0021; -1FCC 0021; -03B7 0061; -03B7 0041; -1D6C8 0061; -1D702 0061; -1D73C 0061; -1D776 0061; -1D7B0 0061; -1D6C8 0041; -1D702 0041; -1D73C 0041; -1D776 0041; -1D7B0 0041; -0397 0061; -0397 0041; -1D6AE 0061; -1D6E8 0061; -1D722 0061; -1D75C 0061; -1D796 0061; -1D6AE 0041; -1D6E8 0041; -1D722 0041; -1D75C 0041; -1D796 0041; -03B7 00E1; -1D6C8 00E1; -1D702 00E1; -1D73C 00E1; -1D776 00E1; -1D7B0 00E1; -0397 00E1; -1D6AE 00E1; -1D6E8 00E1; -1D722 00E1; -1D75C 00E1; -1D796 00E1; -1F20 0061; -1F20 0041; -1F28 0061; -1F28 0041; -1F20 00E1; -1F28 00E1; -1F24 0061; -1F24 0041; -1F2C 0061; -1F2C 0041; -1F24 00E1; -1F2C 00E1; -1F94 0061; -1F94 0041; -1F9C 0061; -1F9C 0041; -1F94 00E1; -1F9C 00E1; -1F22 0061; -1F22 0041; -1F2A 0061; -1F2A 0041; -1F22 00E1; -1F2A 00E1; -1F92 0061; -1F92 0041; -1F9A 0061; -1F9A 0041; -1F92 00E1; -1F9A 00E1; -1F26 0061; -1F26 0041; -1F2E 0061; -1F2E 0041; -1F26 00E1; -1F2E 00E1; -1F96 0061; -1F96 0041; -1F9E 0061; -1F9E 0041; -1F96 00E1; -1F9E 00E1; -1F90 0061; -1F90 0041; -1F98 0061; -1F98 0041; -1F90 00E1; -1F98 00E1; -1F21 0061; -1F21 0041; -1F29 0061; -1F29 0041; -1F21 00E1; -1F29 00E1; -1F25 0061; -1F25 0041; -1F2D 0061; -1F2D 0041; -1F25 00E1; -1F2D 00E1; -1F95 0061; -1F95 0041; -1F9D 0061; -1F9D 0041; -1F95 00E1; -1F9D 00E1; -1F23 0061; -1F23 0041; -1F2B 0061; -1F2B 0041; -1F23 00E1; -1F2B 00E1; -1F93 0061; -1F93 0041; -1F9B 0061; -1F9B 0041; -1F93 00E1; -1F9B 00E1; -1F27 0061; -1F27 0041; -1F2F 0061; -1F2F 0041; -1F27 00E1; -1F2F 00E1; -1F97 0061; -1F97 0041; -1F9F 0061; -1F9F 0041; -1F97 00E1; -1F9F 00E1; -1F91 0061; -1F91 0041; -1F99 0061; -1F99 0041; -1F91 00E1; -1F99 00E1; -03AE 0061; -1F75 0061; -03AE 0041; -1F75 0041; -0389 0061; -1FCB 0061; -0389 0041; -1FCB 0041; -03AE 00E1; -1F75 00E1; -0389 00E1; -1FCB 00E1; -1FC4 0061; -1FC4 0041; -1FC4 00E1; -1F74 0061; -1F74 0041; -1FCA 0061; -1FCA 0041; -1F74 00E1; -1FCA 00E1; -1FC2 0061; -1FC2 0041; -1FC2 00E1; -1FC6 0061; -1FC6 0041; -1FC6 00E1; -1FC7 0061; -1FC7 0041; -1FC7 00E1; -1FC3 0061; -1FC3 0041; -1FCC 0061; -1FCC 0041; -1FC3 00E1; -1FCC 00E1; -03B7 0062; -1D6C8 0062; -1D702 0062; -1D73C 0062; -1D776 0062; -1D7B0 0062; -0397 0062; -1D6AE 0062; -1D6E8 0062; -1D722 0062; -1D75C 0062; -1D796 0062; -1F20 0062; -1F28 0062; -1F24 0062; -1F2C 0062; -1F94 0062; -1F9C 0062; -1F22 0062; -1F2A 0062; -1F92 0062; -1F9A 0062; -1F26 0062; -1F2E 0062; -1F96 0062; -1F9E 0062; -1F90 0062; -1F98 0062; -1F21 0062; -1F29 0062; -1F25 0062; -1F2D 0062; -1F95 0062; -1F9D 0062; -1F23 0062; -1F2B 0062; -1F93 0062; -1F9B 0062; -1F27 0062; -1F2F 0062; -1F97 0062; -1F9F 0062; -1F91 0062; -1F99 0062; -03AE 0062; -1F75 0062; -0389 0062; -1FCB 0062; -1FC4 0062; -1F74 0062; -1FCA 0062; -1FC2 0062; -1FC6 0062; -1FC7 0062; -1FC3 0062; -1FCC 0062; -03B8 0021; -03D1 0021; -1D6C9 0021; -1D6DD 0021; -1D703 0021; -1D717 0021; -1D73D 0021; -1D751 0021; -1D777 0021; -1D78B 0021; -1D7B1 0021; -1D7C5 0021; -0398 0021; -03F4 0021; -1D6AF 0021; -1D6B9 0021; -1D6E9 0021; -1D6F3 0021; -1D723 0021; -1D72D 0021; -1D75D 0021; -1D767 0021; -1D797 0021; -1D7A1 0021; -03B8 0061; -03B8 0041; -03D1 0061; -03D1 0041; -1D6C9 0061; -1D6DD 0061; -1D703 0061; -1D717 0061; -1D73D 0061; -1D751 0061; -1D777 0061; -1D78B 0061; -1D7B1 0061; -1D7C5 0061; -1D6C9 0041; -1D6DD 0041; -1D703 0041; -1D717 0041; -1D73D 0041; -1D751 0041; -1D777 0041; -1D78B 0041; -1D7B1 0041; -1D7C5 0041; -0398 0061; -0398 0041; -03F4 0061; -03F4 0041; -1D6AF 0061; -1D6B9 0061; -1D6E9 0061; -1D6F3 0061; -1D723 0061; -1D72D 0061; -1D75D 0061; -1D767 0061; -1D797 0061; -1D7A1 0061; -1D6AF 0041; -1D6B9 0041; -1D6E9 0041; -1D6F3 0041; -1D723 0041; -1D72D 0041; -1D75D 0041; -1D767 0041; -1D797 0041; -1D7A1 0041; -03B8 00E1; -03D1 00E1; -1D6C9 00E1; -1D6DD 00E1; -1D703 00E1; -1D717 00E1; -1D73D 00E1; -1D751 00E1; -1D777 00E1; -1D78B 00E1; -1D7B1 00E1; -1D7C5 00E1; -0398 00E1; -03F4 00E1; -1D6AF 00E1; -1D6B9 00E1; -1D6E9 00E1; -1D6F3 00E1; -1D723 00E1; -1D72D 00E1; -1D75D 00E1; -1D767 00E1; -1D797 00E1; -1D7A1 00E1; -03B8 0062; -03D1 0062; -1D6C9 0062; -1D6DD 0062; -1D703 0062; -1D717 0062; -1D73D 0062; -1D751 0062; -1D777 0062; -1D78B 0062; -1D7B1 0062; -1D7C5 0062; -0398 0062; -03F4 0062; -1D6AF 0062; -1D6B9 0062; -1D6E9 0062; -1D6F3 0062; -1D723 0062; -1D72D 0062; -1D75D 0062; -1D767 0062; -1D797 0062; -1D7A1 0062; -03B9 0343 0334; -1F30 0334; -1FBE 0313 0334; -1FBE 0334 0313; -0399 0313 0334; -0399 0334 0343; -0399 0343 0334; -1F38 0334; -03B9 0334 0343 0341; -1F30 0301 0334; -1FBE 0313 0334 0341; -1FBE 0334 0313 0341; -0399 0334 0313 0341; -0399 0334 0343 0301; -0399 0343 0301 0334; -1F3C 0334; -03B9 0313 0334 0300; -03B9 0313 0340 0334; -1FBE 0313 0334 0340; -1FBE 0334 0313 0340; -0399 0313 0300 0334; -0399 0313 0334 0300; -0399 0334 0313 0340; -0399 0334 0343 0300; -03B9 0343 0342 0334; -1F30 0334 0342; -1F36 0334; -1FBE 0343 0334 0342; -0399 0313 0334 0342; -0399 0313 0342 0334; -0399 0334 0343 0342; -1F3E 0334; -03B9 0314 0334; -1F31 0334; -1FBE 0314 0334; -1FBE 0334 0314; -0399 0314 0334; -0399 0334 0314; -1F39 0334; -03B9 0314 0334 0301; -03B9 0334 0314 0301; -1FBE 0314 0334 0341; -1FBE 0314 0341 0334; -0399 0314 0334 0301; -0399 0334 0314 0301; -1F39 0334 0341; -1F39 0341 0334; -03B9 0314 0334 0300; -03B9 0334 0314 0300; -1F31 0300 0334; -1FBE 0314 0334 0340; -0399 0314 0300 0334; -0399 0314 0334 0300; -1F39 0334 0340; -1F3B 0334; -03B9 0314 0334 0342; -03B9 0334 0314 0342; -1F31 0342 0334; -1FBE 0334 0314 0342; -0399 0314 0334 0342; -1276 00E1; -1276 0062; -1277 0021; -1277 0061; -1277 0041; -1277 00E1; -1277 0062; -1278 0021; -1278 0061; -1278 0041; -1278 00E1; -1278 0062; -1279 0021; -1279 0061; -1279 0041; -1279 00E1; -1279 0062; -127A 0021; -127A 0061; -127A 0041; -127A 00E1; -127A 0062; -127B 0021; -127B 0061; -127B 0041; -127B 00E1; -127B 0062; -127C 0021; -127C 0061; -127C 0041; -127C 00E1; -127C 0062; -127D 0021; -127D 0061; -127D 0041; -127D 00E1; -127D 0062; -127E 0021; -127E 0061; -127E 0041; -127E 00E1; -127E 0062; -127F 0021; -127F 0061; -127F 0041; -127F 00E1; -127F 0062; -1280 0021; -1280 0061; -1280 0041; -1280 00E1; -1280 0062; -1281 0021; -1281 0061; -1281 0041; -1281 00E1; -1281 0062; -1282 0021; -1282 0061; -1282 0041; -1282 00E1; -1282 0062; -1283 0021; -1283 0061; -1283 0041; -1283 00E1; -1283 0062; -1284 0021; -1284 0061; -1284 0041; -1284 00E1; -1284 0062; -1285 0021; -1285 0061; -1285 0041; -1285 00E1; -1285 0062; -1286 0021; -1286 0061; -1286 0041; -1286 00E1; -1286 0062; -1288 0021; -1288 0061; -1288 0041; -1288 00E1; -1288 0062; -128A 0021; -128A 0061; -128A 0041; -128A 00E1; -128A 0062; -128B 0021; -128B 0061; -128B 0041; -128B 00E1; -128B 0062; -128C 0021; -128C 0061; -128C 0041; -128C 00E1; -128C 0062; -128D 0021; -128D 0061; -128D 0041; -128D 00E1; -128D 0062; -1290 0021; -1290 0061; -1290 0041; -1290 00E1; -1290 0062; -1291 0021; -1291 0061; -1291 0041; -1291 00E1; -1291 0062; -1292 0021; -1292 0061; -1292 0041; -1292 00E1; -1292 0062; -1293 0021; -1293 0061; -1293 0041; -1293 00E1; -1293 0062; -1294 0021; -1294 0061; -1294 0041; -1294 00E1; -1294 0062; -1295 0021; -1295 0061; -1295 0041; -1295 00E1; -1295 0062; -1296 0021; -1296 0061; -1296 0041; -1296 00E1; -1296 0062; -1297 0021; -1297 0061; -1297 0041; -1297 00E1; -1297 0062; -1298 0021; -1298 0061; -1298 0041; -1794 0061; -1794 0041; -1794 00E1; -1794 0062; -1795 0021; -1795 0061; -1795 0041; -1795 00E1; -1795 0062; -1796 0021; -1796 0061; -1796 0041; -1796 00E1; -1796 0062; -1797 0021; -1797 0061; -1797 0041; -1797 00E1; -1797 0062; -1798 0021; -1798 0061; -1798 0041; -1798 00E1; -1798 0062; -1799 0021; -1799 0061; -1799 0041; -1799 00E1; -1799 0062; -179A 0021; -179A 0061; -179A 0041; -179A 00E1; -179A 0062; -179B 0021; -179B 0061; -179B 0041; -179B 00E1; -179B 0062; -179C 0021; -179C 0061; -179C 0041; -179C 00E1; -179C 0062; -179D 0021; -179D 0061; -179D 0041; -179D 00E1; -179D 0062; -179E 0021; -179E 0061; -179E 0041; -179E 00E1; -179E 0062; -179F 0021; -179F 0061; -179F 0041; -179F 00E1; -179F 0062; -17A0 0021; -17A0 0061; -17A0 0041; -17A0 00E1; -17A0 0062; -17A1 0021; -17A1 0061; -17A1 0041; -17A1 00E1; -17A1 0062; -17A2 0021; -17A2 0061; -17A2 0041; -17A2 00E1; -17A2 0062; -17A3 0021; -17A3 0061; -17A3 0041; -17A3 00E1; -17A3 0062; -17A4 0021; -17A4 0061; -17A4 0041; -17A4 00E1; -17A4 0062; -17A5 0021; -17A5 0061; -17A5 0041; -17A5 00E1; -17A5 0062; -17A6 0021; -17A6 0061; -17A6 0041; -17A6 00E1; -17A6 0062; -17A7 0021; -17A7 0061; -17A7 0041; -17A7 00E1; -17A7 0062; -17A8 0021; -3057 00E1; -30B7 00E1; -FF7C 00E1; -32DB 00E1; -3058 0061; -3058 0041; -30B8 0061; -30B8 0041; -3058 00E1; -30B8 00E1; -3057 0062; -30B7 0062; -FF7C 0062; -32DB 0062; -3058 0062; -30B8 0062; -3006 0021; -3006 0061; -3006 0041; -3006 00E1; -3006 0062; -3321 0021; -3321 0061; -3321 0041; -3321 00E1; -3321 0062; -3059 0334 3099; -3059 3099 0334; -305A 0334; -30B9 0334 3099; -30B9 3099 0334; -30BA 0334; -3059 0021; -30B9 0021; -FF7D 0021; -32DC 0021; -305A 0021; -30BA 0021; -3059 0061; -3059 0041; -30B9 0061; -30B9 0041; -FF7D 0061; -FF7D 0041; -32DC 0061; -32DC 0041; -3059 00E1; -30B9 00E1; -FF7D 00E1; -32DC 00E1; -305A 0061; -305A 0041; -30BA 0061; -30BA 0041; -305A 00E1; -30BA 00E1; -3059 0062; -30B9 0062; -FF7D 0062; -32DC 0062; -305A 0062; -30BA 0062; -305B 0334 3099; -305B 3099 0334; -305C 0334; -30BB 0334 3099; -30BB 3099 0334; -30BC 0334; -305B 0021; -30BB 0021; -FF7E 0021; -32DD 0021; -305C 0021; -30BC 0021; -305B 0061; -305B 0041; -30BB 0061; -30BB 0041; -FF7E 0061; -FF7E 0041; -32DD 0061; -32DD 0041; -305B 00E1; -30BB 00E1; -FF7E 00E1; -32DD 00E1; -305C 0061; -305C 0041; -30BC 0061; -30BC 0041; -305C 00E1; -30BC 00E1; -305B 0062; -30BB 0062; -FF7E 0062; -32DD 0062; -305C 0062; -30BC 0062; -3322 0021; -3322 0061; -3322 0041; -3322 00E1; -3322 0062; -3323 0021; -3323 0061; -3323 0041; -3323 00E1; -3323 0062; -305D 0334 3099; -305D 3099 0334; -305E 0334; -30BD 0334 3099; -30BD 3099 0334; -30BE 0334; -305D 0021; -30BD 0021; -FF7F 0021; -32DE 0021; -305E 0021; -30BE 0021; -305D 0061; -305D 0041; -30BD 0061; -30BD 0041; -FF7F 0061; -FF7F 0041; -32DE 0061; -32DE 0041; -305D 00E1; -30BD 00E1; -FF7F 00E1; -32DE 00E1; -305E 0061; -305E 0041; -30BE 0061; -30BE 0041; -305E 00E1; -30BE 00E1; -305D 0062; -30BD 0062; -FF7F 0062; -32DE 0062; -305E 0062; -30BE 0062; -305F 0334 3099; -305F 3099 0334; -3060 0334; -30BF 0334 3099; -30BF 3099 0334; -30C0 0334; -2FA0 0062; -2FA1 0021; -2FA1 0061; -2FA1 0041; -2FA1 00E1; -2FA1 0062; -2ECC 0021; -2ECD 0021; -2ECE 0021; -2ECC 0061; -2ECC 0041; -2ECC 00E1; -2ECD 0061; -2ECD 0041; -2ECD 00E1; -2ECE 0061; -2ECE 0041; -2ECE 00E1; -2ECC 0062; -2ECD 0062; -2ECE 0062; -F99A 0021; -F99A 0061; -F99A 0041; -F99A 00E1; -F99A 0062; -FA25 0021; -FA25 0061; -FA25 0041; -FA25 00E1; -FA25 0062; -329C 0021; -329C 0061; -329C 0041; -329C 00E1; -329C 0062; -F9C3 0021; -F9C3 0061; -F9C3 0041; -F9C3 00E1; -F9C3 0062; -F913 0021; -F913 0061; -F913 0041; -F913 00E1; -F913 0062; -2FA2 0021; -2ECF 0021; -2FA2 0061; -2FA2 0041; -2FA2 00E1; -2ECF 0061; -2ECF 0041; -2ECF 00E1; -2FA2 0062; -2ECF 0062; -2F9E2 0021; -2F9E2 0061; -2F9E2 0041; -2F9E2 00E1; -2F9E2 0062; -F92C 0021; -F92C 0061; -F92C 0041; -F92C 00E1; -F92C 0062; -2F9E3 0021; -2F9E3 0061; -2F9E3 0041; -2F9E3 00E1; -2F9E3 0062; -FA26 0021; -FA26 0061; -FA26 0041; -FA26 00E1; -FA26 0062; -2F9E4 0021; -2F9E4 0061; -2F9E4 0041; -2F9E4 00E1; -2F9E4 0062; -2F9E6 0021; -2F9E6 0061; -2F9E6 0041; -2F9E6 00E1; -2F9E6 0062; -2FA3 0021; -2FA3 0061; -2FA3 0041; -2FA3 00E1; -2FA3 0062; -F919 0021; -F919 0061; -F919 0041; -F919 00E1; -F919 0062; -F9B7 0021; -F9B7 0061; -F9B7 0041; -F9B7 00E1; -F0015 0021; -F0015 0061; -F0015 0041; -F0015 00E1; -F0015 0062; -F0016 0021; -F0016 0061; -F0016 0041; -F0016 00E1; -F0016 0062; -F0017 0021; -F0017 0061; -F0017 0041; -F0017 00E1; -F0017 0062; -F0018 0021; -F0018 0061; -F0018 0041; -F0018 00E1; -F0018 0062; -F0019 0021; -F0019 0061; -F0019 0041; -F0019 00E1; -F0019 0062; -F001A 0021; -F001A 0061; -F001A 0041; -F001A 00E1; -F001A 0062; -F001B 0021; -F001B 0061; -F001B 0041; -F001B 00E1; -F001B 0062; -F001C 0021; -F001C 0061; -F001C 0041; -F001C 00E1; -F001C 0062; -F001D 0021; -F001D 0061; -F001D 0041; -F001D 00E1; -F001D 0062; -F001E 0021; -F001E 0061; -F001E 0041; -F001E 00E1; -F001E 0062; -F001F 0021; -F001F 0061; -F001F 0041; -F001F 00E1; -F001F 0062; -F0020 0021; -F0020 0061; -F0020 0041; -F0020 00E1; -F0020 0062; -F0021 0021; -F0021 0061; -F0021 0041; -F0021 00E1; -F0021 0062; -F0022 0021; -F0022 0061; -F0022 0041; -F0022 00E1; -F0022 0062; -F0023 0021; -F0023 0061; -F0023 0041; -F0023 00E1; -F0023 0062; -F0024 0021; -F0024 0061; -F0024 0041; -F0024 00E1; -F0024 0062; -F0025 0021; -F0025 0061; -F0025 0041; -F0025 00E1; -F0025 0062; -F0026 0021; -F0026 0061; -F0026 0041; -F0026 00E1; -F0026 0062; -F0027 0021; -F0027 0061; -F0027 0041; -F0027 00E1; -F0027 0062; -F0028 0021; -F0028 0061; -F0028 0041; -F0028 00E1; -F0028 0062; -F0029 0021; -F0029 0061; -F0029 0041; -F0029 00E1; -F0029 0062; -F002A 0021; -F002A 0061; -F002A 0041; -F002A 00E1; -F002A 0062; -F002B 0021; -F002B 0061; -F002B 0041; -F002B 00E1; -F002B 0062; -F002C 0021; -F002C 0061; -F002C 0041; -F002C 00E1; -F002C 0062; -F002D 0021; -F002D 0061; -F002D 0041; -F002D 00E1; -F002D 0062; -F002E 0021; -F002E 0061; -F002E 0041; -F002E 00E1; -F002E 0062; -F002F 0021; -F002F 0061; -F002F 0041; -F002F 00E1; -F002F 0062; -F0030 0021; -F0030 0061; -F0030 0041; -F0030 00E1; -F0030 0062; -F00F8 0021; -F00F8 0061; -F00F8 0041; -F00F8 00E1; -F00F8 0062; -F00F9 0021; -F00F9 0061; -F00F9 0041; -F00F9 00E1; -F00F9 0062; -F00FA 0021; -F00FA 0061; -F00FA 0041; -F00FA 00E1; -F00FA 0062; -F00FB 0021; -F00FB 0061; -F00FB 0041; -F00FB 00E1; -F00FB 0062; -F00FC 0021; -F00FC 0061; -F00FC 0041; -F00FC 00E1; -F00FC 0062; -F00FD 0021; -F00FD 0061; -F00FD 0041; -F00FD 00E1; -F00FD 0062; -FFF00 0021; -FFF00 0061; -FFF00 0041; -FFF00 00E1; -FFF00 0062; -FFF01 0021; -FFF01 0061; -FFF01 0041; -FFF01 00E1; -FFF01 0062; -FFF02 0021; -FFF02 0061; -FFF02 0041; -FFF02 00E1; -FFF02 0062; -FFF03 0021; -FFF03 0061; -FFF03 0041; -FFF03 00E1; -FFF03 0062; -FFF04 0021; -FFF04 0061; -FFF04 0041; -FFF04 00E1; -FFF04 0062; -FFF05 0021; -FFF05 0061; -FFF05 0041; -FFF05 00E1; -FFF05 0062; -FFFF8 0021; -FFFF8 0061; -FFFF8 0041; -FFFF8 00E1; -FFFF8 0062; -FFFF9 0021; -FFFF9 0061; -FFFF9 0041; -FFFF9 00E1; -FFFF9 0062; -FFFFA 0021; -FFFFA 0061; -FFFFA 0041; -FFFFA 00E1; -FFFFA 0062; -FFFFB 0021; -FFFFB 0061; -FFFFB 0041; -FFFFB 00E1; -FFFFB 0062; -FFFFC 0021; -FFFFC 0061; -FFFFC 0041; -FFFFC 00E1; -FFFFC 0062; -FFFFD 0021; -FFFFD 0061; -FFFFD 0041; -FFFFD 00E1; -FFFFD 0062; -100000 0021; -100000 0061; -100000 0041; -100000 00E1; -100000 0062; -100001 0021; -100001 0061; -100001 0041; -100001 00E1; -100001 0062; -100002 0021; -100002 0061; -100002 0041; -100002 00E1; -100002 0062; -100003 0021; -100003 0061; -100003 0041; -100003 00E1; -100003 0062; -100004 0021; -100004 0061; -100004 0041; -100004 00E1; -100004 0062; -100005 0021; -100005 0061; -100005 0041; -100005 00E1; -100005 0062; -1000F8 0021; -1000F8 0061; -1000F8 0041; -1000F8 00E1; -1000F8 0062; -1000F9 0021; -1000F9 0061; -1000F9 0041; -1000F9 00E1; -1000F9 0062; -1000FA 0021; -1000FA 0061; -1000FA 0041; -1000FA 00E1; -1000FA 0062; -1000FB 0021; -1000FB 0061; -1000FB 0041; -1000FB 00E1; -1000FB 0062; -1000FC 0021; -1000FC 0061; -1000FC 0041; -1000FC 00E1; -1000FC 0062; -1000FD 0021; -1000FD 0061; -1000FD 0041; -1000FD 00E1; -1000FD 0062; -10FF00 0021; -10FF00 0061; -10FF00 0041; -10FF00 00E1; -10FF00 0062; -10FF01 0021; -10FF01 0061; -10FF01 0041; -10FF01 00E1; -10FF01 0062; -10FF02 0021; -10FF02 0061; -10FF02 0041; -10FF02 00E1; -10FF02 0062; -10FF03 0021; -10FF03 0061; -10FF03 0041; -10FF03 00E1; -10FF03 0062; -10FF04 0021; -10FF04 0061; -10FF04 0041; -10FF04 00E1; -10FF04 0062; -10FF05 0021; -10FF05 0061; +0334 06DC; 06DC +0334 1D1AD; 1D1AD +06E3 0334; 06E3 +0334 0332; 0332 +0334 030E; 030E +0334 032B; 032B +0334 0350; 0350 +0334 05B5; 05B5 +0334 0670; 0670 +0334 0747; 0747 +0334 1939; 1939 +20D3 0334; 20D3 +2001 0021; 2001 +2006 0041; 2006 +1FEF 0062; 1FEF +FE4B 003F; FE4B +0385 0061; 0385 +1FCD 0061; 1FCD +005F 0021; 005F +309C 0021; 309C +2012 0021; 2012 +30A0 0021; 30A0 +066C 0021; 066C +003B 0041; 003B +0704 0021; 0704 +1804 0021; 1804 +0014 0021; 0014 +0594 0021; 0594 +06E1 0021; 06E1 +D805 0021; D805 +1D179 0021; 1D179 +E0022 0021; E0022 +E0054 0021; E0054 +E0106 0021; E0106 +E0138 0021; E0138 +E016A 0021; E016A +E019C 0021; E019C +E01CE 0021; E01CE +0342 0021; 0342 +0339 0021; 0339 +05BC 0021; 05BC +0738 0021; 0738 +0C82 0021; 0C82 +20D2 0021; 20D2 +0E40 0021; 0E40 +001E 003F; 001E +059E 003F; 059E +070F 003F; 070F +FE02 003F; FE02 +1D185 003F; 1D185 +E002C 003F; E002C +E005E 003F; E005E +E0110 003F; E0110 +E0142 003F; E0142 +E0174 003F; E0174 +E01A6 003F; E01A6 +E01D8 003F; E01D8 +0305 003F; 0305 +0348 003F; 0348 +064E 003F; 064E +0742 003F; 0742 +0E4B 003F; 0E4B +20DC 003F; 20DC +00BF 0021; 00BF +2026 0041; 2026 +1809 0021; 1809 +104A 0021; 104A +1039F 0021; 1039F +0022 0041; 0022 +0028 0021; 0028 +2483 0041; 2483 +247A 0041; 247A +24A0 0021; 24A0 +24AA 0021; 24AA +24B4 0021; 24B4 +3204 0021; 3204 +3208 0021; 3208 +321A 0021; 321A +323D 0021; 323D +322F 0021; 322F +323C 0021; 323C +FE36 0021; FE36 +FE48 0061; FE48 +0F3B 0021; 0F3B +2984 0021; 2984 +298C 0021; 298C +2996 0021; 2996 +300A 0041; 300A +300E 0041; 300E +3015 0021; 3015 +FD3F 0021; FD3F +FE61 003F; FE61 +FE68 0061; FE68 +FE6A 003F; FE6A +2027 0021; 2027 +2036 0041; 2036 +2042 0021; 2042 +070B 0021; 070B +0F05 0021; 0F05 +0F0F 0021; 0F0F +17D7 0021; 17D7 +02C3 0021; 02C3 +02CD 0021; 02CD +02DF 0021; 02DF +02EF 0021; 02EF +02F9 0021; 02F9 +0482 0021; 0482 +0BF6 0021; 0BF6 +0F16 0021; 0F16 +0F38 0021; 0F38 +0FC5 0021; 0FC5 +19E2 0021; 19E2 +19EC 0021; 19EC +19F6 0021; 19F6 +2104 0021; 2104 +2129 0021; 2129 +2190 003F; 2190 +21AE 0334; 21AE +219E 0062; 219E +21A8 0062; 21A8 +21B3 0062; 21B3 +21BD 0062; 21BD +21C7 0062; 21C7 +21D2 0041; 21D2 +21DA 0041; 21DA +21E4 0041; 21E4 +21EE 0041; 21EE +21F8 0041; 21F8 +1D74F 0021; 1D74F +1D6C1 0021; 1D6C1 +220B 003F; 220B +FF0B 003F; FF0B +FF1C 0061; FF1C +208C 0062; 208C +FFE4 0061; FFE4 +2216 003F; 2216 +2220 003F; 2220 +2229 0061; 2229 +2232 0061; 2232 +223C 0021; 223C +2247 0021; 2247 +226D 0041; 226D +2257 0061; 2257 +2261 0041; 2261 +2269 003F; 2269 +2276 0041; 2276 +22E0 0041; 22E0 +2288 0334; 2288 +228F 0061; 228F +2296 0041; 2296 +22A0 0041; 22A0 +22A8 0061; 22A8 +22EA 003F; 22EA +22B7 0061; 22B7 +22C1 0061; 22C1 +22CB 0061; 22CB +22D5 0061; 22D5 +22DF 0061; 22DF +22F1 0061; 22F1 +22FB 0061; 22FB +2305 0061; 2305 +230F 0061; 230F +2319 0061; 2319 +2323 0061; 2323 +232F 0061; 232F +2339 0061; 2339 +2343 0061; 2343 +234D 0061; 234D +2357 0061; 2357 +2361 0061; 2361 +236B 0061; 236B +2375 0061; 2375 +237F 0061; 237F +2389 0061; 2389 +2393 0061; 2393 +239D 0061; 239D +23A7 0061; 23A7 +23B1 0061; 23B1 +23BB 0061; 23BB +23C5 0061; 23C5 +23CF 0061; 23CF +2408 0061; 2408 +2412 0061; 2412 +241C 0061; 241C +2426 0061; 2426 +2449 0061; 2449 +2507 0061; 2507 +2511 0061; 2511 +251B 0061; 251B +2525 0061; 2525 +252F 0061; 252F +2539 0061; 2539 +2543 0061; 2543 +254D 0061; 254D +2557 0061; 2557 +2561 0061; 2561 +256B 0061; 256B +2575 0061; 2575 +257F 0061; 257F +2589 0061; 2589 +2593 0061; 2593 +259D 0061; 259D +25A6 0061; 25A6 +25B0 0061; 25B0 +25BA 0061; 25BA +25C4 0061; 25C4 +25CD 0061; 25CD +25D7 0061; 25D7 +25E1 0061; 25E1 +25EB 0061; 25EB +25F5 0061; 25F5 +25FF 0061; 25FF +2609 0061; 2609 +2613 0061; 2613 +261E 0061; 261E +2628 0061; 2628 +263A 0061; 263A +2644 0061; 2644 +264E 0061; 264E +2658 0061; 2658 +2662 0061; 2662 +266C 0061; 266C +2679 0061; 2679 +2685 0061; 2685 +2702 0061; 2702 +270F 0061; 270F +2719 0061; 2719 +2723 0061; 2723 +272E 0061; 272E +2738 0061; 2738 +2742 0061; 2742 +274D 0061; 274D +275C 0061; 275C +2768 0061; 2768 +2772 0061; 2772 +279D 0061; 279D +27A7 0061; 27A7 +27B2 0061; 27B2 +27BC 0061; 27BC +27D7 0061; 27D7 +27E1 0061; 27E1 +27EB 0061; 27EB +27F9 0061; 27F9 +2903 0061; 2903 +290D 0061; 290D +2917 0061; 2917 +2921 0061; 2921 +292B 0061; 292B +2935 0061; 2935 +293F 0061; 293F +2949 0061; 2949 +2953 0061; 2953 +295D 0061; 295D +2967 0061; 2967 +2971 0061; 2971 +297B 0061; 297B +299B 0061; 299B +29A5 0061; 29A5 +29AF 0061; 29AF +29B9 0061; 29B9 +29C3 0061; 29C3 +29CD 0061; 29CD +29D7 0061; 29D7 +29E1 0061; 29E1 +29EB 0061; 29EB +29F5 0061; 29F5 +2A01 0061; 2A01 +2A0B 0061; 2A0B +2A16 0061; 2A16 +2A20 0061; 2A20 +2A2A 0061; 2A2A +2A34 0061; 2A34 +2A3E 0061; 2A3E +2A48 0061; 2A48 +2A52 0061; 2A52 +2A5C 0061; 2A5C +2A66 0061; 2A66 +2A70 0061; 2A70 +2A7D 0061; 2A7D +2A87 0061; 2A87 +2A91 0061; 2A91 +2A9B 0061; 2A9B +2AA5 0061; 2AA5 +2AAF 0061; 2AAF +2AB9 0061; 2AB9 +2AC3 0061; 2AC3 +2ACD 0061; 2ACD +2AD7 0061; 2AD7 +2AE1 0021; 2AE1 +2AEB 0021; 2AEB +2AF5 0021; 2AF5 +2AFF 0021; 2AFF +2B09 0021; 2B09 +2805 0021; 2805 +280F 0021; 280F +2819 0021; 2819 +2823 0021; 2823 +282D 0021; 282D +2837 0021; 2837 +2841 0021; 2841 +284B 0021; 284B +2855 0021; 2855 +285F 0021; 285F +2869 0021; 2869 +2873 0021; 2873 +287D 0021; 287D +2887 0021; 2887 +2891 0021; 2891 +289B 0021; 289B +28A5 0021; 28A5 +28AF 0021; 28AF +28B9 0021; 28B9 +28C3 0021; 28C3 +28CD 0021; 28CD +28D7 0021; 28D7 +28E1 0021; 28E1 +28EB 0021; 28EB +28F5 0021; 28F5 +28FF 0021; 28FF +2633 0021; 2633 +4DC5 0021; 4DC5 +4DCF 0021; 4DCF +4DD9 0021; 4DD9 +4DE3 0021; 4DE3 +4DED 0021; 4DED +4DF7 0021; 4DF7 +1D301 0021; 1D301 +1D30B 0021; 1D30B +1D315 0021; 1D315 +1D31F 0021; 1D31F +1D329 0021; 1D329 +1D333 0021; 1D333 +1D33D 0021; 1D33D +1D347 0021; 1D347 +1D351 0021; 1D351 +A494 0021; A494 +A49E 0021; A49E +A4A8 0021; A4A8 +A4B2 0021; A4B2 +A4BC 0021; A4BC +A4C6 0021; A4C6 +1D000 0021; 1D000 +1D00A 0021; 1D00A +1D014 0021; 1D014 +1D01E 0021; 1D01E +1D028 0021; 1D028 +1D032 0021; 1D032 +1D03C 0021; 1D03C +1D046 0021; 1D046 +1D050 0021; 1D050 +1D05A 0021; 1D05A +1D064 0021; 1D064 +1D06E 0021; 1D06E +1D078 0021; 1D078 +1D082 0021; 1D082 +1D08C 0021; 1D08C +1D096 0021; 1D096 +1D0A0 0021; 1D0A0 +1D0AA 0021; 1D0AA +1D0B4 0021; 1D0B4 +1D0BE 0021; 1D0BE +1D0C8 0021; 1D0C8 +1D0D2 0021; 1D0D2 +1D0DC 0021; 1D0DC +1D0E6 0021; 1D0E6 +1D0F0 0021; 1D0F0 +1D104 0021; 1D104 +1D10E 0021; 1D10E +1D118 0021; 1D118 +1D122 0021; 1D122 +1D12C 0021; 1D12C +1D136 0021; 1D136 +1D140 0021; 1D140 +1D14A 0021; 1D14A +1D154 0021; 1D154 +1D161 0334; 1D161 +1D15B 0062; 1D15B +1D18E 0062; 1D18E +1D198 0062; 1D198 +1D1A2 0062; 1D1A2 +1D1B0 0062; 1D1B0 +1D1BB 0334 1D16F; 1D1BB 0334 D834 +1D1BC 0062; 1D1BC +1D1CA 0061; 1D1CA +1D1D4 0061; 1D1D4 +2FF0 0061; 2FF0 +2FFA 0061; 2FFA +3190 0061; 3190 +1372 0061; 1372 +137C 0061; 137C +10113 0061; 10113 +1011D 0061; 1011D +10127 0061; 10127 +10131 0061; 10131 +3032 0041; 3032 +30FE 0061; 30FE +FFE5 0061; FFE5 +20A3 003F; 20A3 +20AD 003F; 20AD +0F33 0021; 0F33 +1D7EC 0041; 1D7EC +3007 0061; 3007 +278A 0021; 278A +0A67 003F; 0A67 +2159 0062; 2159 +3362 003F; 3362 +33EB 003F; 33EB +246D 0041; 246D +246F 0041; 246F +2471 0041; 2471 +1D7E3 0041; 1D7E3 +0ED1 0041; 0ED1 +0F21 0062; 0F21 +0CE8 0021; 0CE8 +3022 003F; 3022 +33F4 0041; 33F4 +3370 0041; 3370 +33FC 0041; 33FC +0BE8 0061; 0BE8 +09F5 0062; 09F5 +136B 0021; 136B +0D69 003F; 0D69 +33FE 0041; 33FE +1D7F9 0061; 1D7F9 +0E53 0061; 0E53 +0ED3 0062; 0ED3 +0CEA 0021; 0CEA +3024 003F; 3024 +32BC 0041; 32BC +09EA 0061; 09EA +2783 0062; 2783 +1D7FB 0021; 1D7FB +104A5 003F; 104A5 +1D7FB 0061; 1D7FB +0ED5 0061; 0ED5 +0F25 0062; 0F25 +0D6C 0021; 0D6C +248D 0021; 248D +0B6C 0041; 0B6C +09EC 0062; 09EC +136F 0021; 136F +0E57 003F; 0E57 +06F7 0061; 06F7 +1D7E9 0062; 1D7E9 +FF18 0021; FF18 +2088 003F; 2088 +24FC 0041; 24FC +1818 0061; 1818 +32C7 003F; 32C7 +1D7E1 003F; 1D7E1 +1D7E1 0041; 1D7E1 +0F29 0061; 0F29 +17F9 0062; 17F9 +0083 0061; 0083 +05A5 0061; 05A5 +0F82 0061; 0F82 +FE08 0061; FE08 +1D18B 0061; 1D18B +E0032 0061; E0032 +E0064 0061; E0064 +E0116 0061; E0116 +E0148 0061; E0148 +E017A 0061; E017A +E01AC 0061; E01AC +E01DE 0061; E01DE +0080 0041; 0080 +05A1 0041; 05A1 +0F19 0041; 0F19 +FE05 0041; FE05 +1D188 0041; 1D188 +E002F 0041; E002F +E0061 0041; E0061 +E0113 0041; E0113 +E0145 0041; E0145 +E0177 0041; E0177 +E01A9 0041; E01A9 +E01DB 0041; E01DB +0103 0301 0334; 0103 0301 +00C2 0334 0340; 00C2 0334 +00C4 0304 0334; 00C4 0304 +0041 0334 0311; 0041 0334 +030C 0061; 030C +031A 0061; 031A +0335 0061; 0335 +0355 0061; 0355 +05BB 0061; 05BB +FCF2 0041; FCF2 +0735 0061; 0735 +0903 0061; 0903 +0C02 0061; 0C02 +17C7 0061; 17C7 +FF9F 0061; FF9F +20E8 0061; 20E8 +1EB1 0021; 1EB1 +1E00 0021; 1E00 +1EB2 003F; 1EB2 +33C2 0062; 33C2 +0041 0061; 0041 +1EAF 0061; 1EAF +00E4 0061; 00E4 +1EAC 0061; 1EAC +1EB1 0062; 1EB1 +1E00 0062; 1E00 +00E6 0021; 00E6 +0250 0021; 0250 +001E 0062; 001E +059E 0062; 059E +070F 0062; 070F +FE02 0062; FE02 +1D185 0062; 1D185 +E002C 0062; E002C +E005E 0062; E005E +E0110 0062; E0110 +E0142 0062; E0142 +E0174 0062; E0174 +E01A6 0062; E01A6 +E01D8 0062; E01D8 +0301 0062; 0301 +032F 0062; 032F +05B5 0062; 05B5 +0730 0062; 0730 +0B01 0062; 0B01 +302E 0062; 302E +FF22 0021; FF22 +1D5D5 003F; 1D5D5 +1D401 0061; 1D401 +1D41B 0062; 1D41B +0EC2 0062; 0EC2 +0106 0334; 0106 +1D658 0021; 1D658 +0043 003F; 0043 +0368 0041; 0368 +212D 0041; 212D +1D4B8 0062; 1D4B8 +339D 0021; 339D +0044 0334 0307; 0044 0334 +2145 0021; 2145 +216E 003F; 216E +1D659 0061; 1D659 +1D63F 0041; 1D63F +1D5BD 0062; 1D5BD +3378 0021; 3378 +02A5 0061; 02A5 +018B 0041; 018B +00CA 0334; 00CA +1EBC 0334; 1EBC +0065 0334 0309; 0065 0334 +1D41E 0021; 1D41E +00CB 0021; 00CB +FF25 003F; FF25 +1E16 003F; 1E16 +1D68E 0041; 1D68E +0114 0041; 0114 +0113 0041; 0113 +1D58A 0062; 1D58A +0228 0062; 0228 +1D32 0061; 1D32 +025C 0021; 025C +1D58B 0021; 1D58B +1D571 003F; 1D571 +1D509 0061; 1D509 +2131 0062; 2131 +02A9 0062; 02A9 +0067 0334 0304; 0067 0334 +0122 0021; 0122 +1E20 003F; 1E20 +1D406 0041; 1D406 +33FF 0041; 33FF +3387 0021; 3387 +029B 0021; 029B +1E23 0334; 1E23 +1D43B 0021; 1D43B +1D43B 003F; 1D43B +1D4F1 0041; 1D4F1 +0124 0041; 0124 +FF28 0062; FF28 +3390 0041; 3390 +02BB 0041; 02BB +0069 0334 0308 0341; 0069 0334 0308 +0069 0330 0334; 0069 0330 +00EC 0021; 00EC +FF29 003F; FF29 +0069 0061; 0069 +1D470 0061; 1D470 +00EF 0061; 00EF +1D48A 0062; 1D48A +012E 0062; 012E +337A 0061; 337A +0197 0041; 0197 +1D5DD 0021; 1D5DD +FF4A 0061; FF4A +1D43D 0041; 1D43D +1D575 0062; 1D575 +004B 0327 0334; 004B 0327 +24C0 0021; 24C0 +01E9 003F; 01E9 +1D4DA 0061; 1D4DA +3384 0061; 3384 +3385 0061; 3385 +33AA 0061; 33AA +0139 0334; 0139 +1D591 0021; 1D591 +1D55D 003F; 1D55D +013F 0062; 013F +1D577 0061; 1D577 +1E3B 0041; 1E3B +1E3D 0062; 1E3D +02AB 003F; 02AB +026E 003F; 026E +1D62E 0021; 1D62E +2133 003F; 2133 +1D426 0061; 1D426 +1D474 0041; 1D474 +24DC 0062; 24DC +33D5 0062; 33D5 +33BD 0061; 33BD +006E 0334 0307; 006E 0334 +1D475 0021; 1D475 +1D40D 003F; 1D40D +1D427 0041; 1D427 +207F 0041; 207F +1D55F 0062; 1D55F +01CB 0021; 01CB +1D0E 003F; 1D0E +006F 0334 0301; 006F 0334 +1ED6 0334; 1ED6 +00F5 0308 0334; 00F5 0308 +006F 0304 0334 0301; 006F 0304 0334 +00F2 031B 0334; 00F2 031B +1D45C 0021; 1D45C +00D6 0021; 00D6 +FF4F 003F; FF4F +1ED4 003F; 1ED4 +1ECC 003F; 1ECC +1D5E2 0061; 1D5E2 +1ED7 0041; 1ED7 +01EA 0041; 01EA +1EE3 0041; 1EE3 +00D2 0062; 00D2 +01A0 0062; 01A0 +00F8 0301 0334; 00F8 0301 +1D10 0061; 1D10 +0223 0041; 0223 +1D4DF 0021; 1D4DF +1E54 003F; 1E54 +1D513 0061; 1D513 +1D4F9 0062; 1D4F9 +33D9 0041; 33D9 +1D45E 0021; 1D45E +1D478 003F; 1D478 +1D478 0061; 1D478 +1D57C 0062; 1D57C +0072 0334 0311; 0072 0334 +1D445 0021; 1D445 +211B 003F; 211B +1D5FF 0061; 1D5FF +24C7 0041; 24C7 +33AF 0041; 33AF +0157 0062; 0157 +027A 0041; 027A +0073 0301 0307 0334; 0073 0301 0307 +0053 0307 0323 0334; 0053 0307 0323 +015D 0021; 015D +02E2 003F; 02E2 +1D634 0041; 1D634 +015C 0041; 015C +FF33 0062; FF33 +00DF 0061; 00DF +0165 0334; 0165 +1D495 0021; 1D495 +1D495 003F; 1D495 +036D 0041; 036D +1D4E3 0041; 1D4E3 +1D495 0062; 1D495 +2121 0021; 2121 +01AD 0021; 01AD +0055 0334 0306; 0055 0334 +0075 0308 0304 0334; 0075 0308 0304 +1EE7 0334; 1EE7 +0055 0334 031B 0309; 0055 0334 031B +1D602 0021; 1D602 +1E79 0021; 1E79 +24E4 003F; 24E4 +016B 003F; 016B +1D462 0041; 1D462 +1D64 0061; 1D64 +0169 0061; 0169 +1EEC 0061; 1EEC +1D5E8 0062; 1D5E8 +1EE9 0062; 1EE9 +0265 0061; 0265 +1E7D 0334; 1E7D +1E7C 0021; 1E7C +0076 0041; 0076 +1D5E9 0061; 1D5E9 +FF36 0062; FF36 +2177 0062; 2177 +0057 0308 0334; 0057 0308 +1E82 0021; 1E82 +0175 003F; 0175 +1D51A 0061; 1D51A +1E89 0041; 1E89 +33DD 0021; 33DD +1D417 0021; 1D417 +1D61F 003F; 1D61F +2169 0041; 2169 +1D59D 0062; 1D59D +0079 0334 0301; 0079 0334 +1EF7 0334; 1EF7 +00FF 0021; 00FF +0176 003F; 0176 +1D418 0061; 1D418 +1EF8 0061; 1EF8 +02B8 0062; 02B8 +007A 0334 030C; 007A 0334 +1D5ED 0021; 1D5ED +0179 003F; 0179 +1D44D 0061; 1D44D +FF5A 0062; FF5A +1D22 0061; 1D22 +01B7 0041; 01B7 +00DE 0061; 00DE +0294 003F; 0294 +1D24 003F; 1D24 +0297 003F; 0297 +1F08 0334 0300; 1F08 0334 +1F01 0334 0345 0301; 1F01 0334 0345 +0391 0301 0334; 0391 0301 +0391 0021; 0391 +1FB1 0021; 1FB1 +0386 003F; 0386 +1F02 0061; 1F02 +1F89 0061; 1F89 +1F84 0062; 1F84 +1D7AB 0021; 1D7AB +1D5D 0061; 1D5D +1D67 003F; 1D67 +1D26 003F; 1D26 +1D6E5 0041; 1D6E5 +03B5 0334 0314 0301; 03B5 0334 0314 +1F18 0021; 1F18 +1FC9 003F; 1FC9 +1F1A 0041; 1F1A +1F19 0062; 1F19 +1D6AD 003F; 1D6AD +03B7 0334 0343 0301; 03B7 0334 0343 +1FC3 0343 0334; 1FC3 0343 +1F2F 0334; 1F2F +1FC3 0334; 1FC3 +0389 0021; 0389 +1F97 003F; 1F97 +1F9C 0061; 1F9C +1F91 0061; 1F91 +1F26 0062; 1F26 +1D6E9 0021; 1D6E9 +1D73D 0041; 1D73D +1D75D 0062; 1D75D +1F3D 0334; 1F3D +03AA 0334; 03AA +03AF 0021; 03AF +1FDB 003F; 1FDB +1F32 0061; 1F32 +1FD2 0061; 1FD2 +1FD3 0062; 1FD3 +1D6CB 0061; 1D6CB +03D7 0021; 03D7 +1D726 0041; 1D726 +1D6CD 0061; 1D6CD +3395 0021; 3395 +03BD 0041; 03BD +1D743 003F; 1D743 +039F 0334 0313; 039F 0334 +03BF 0334 0340; 03BF 0334 +1F48 003F; 1F48 +1F42 0041; 1F42 +1F4B 0062; 1F4B +1D6E1 0061; 1D6E1 +1D765 0062; 1D765 +1D6B8 0021; 1D6B8 +1D754 0041; 1D754 +1D29 0041; 1D29 +1D747 0061; 1D747 +1D7A2 0062; 1D7A2 +03C4 0062; 03C4 +03C5 0314 0334 0342; 03C5 0314 0334 +03C5 0308 0334 0340; 03C5 0308 0334 +03AB 0021; 03AB +1FE1 003F; 1FE1 +1F5F 0061; 1F5F +1D730 0062; 1D730 +1D76B 0021; 1D76B +1D6BD 0061; 1D6BD +1D712 003F; 1D712 +1D76C 0062; 1D76C +1D76D 0041; 1D76D +2126 0334 0313 0340; 2126 0334 0313 +1F61 0341 0345 0334; 1F61 0341 0345 +03A9 0334 0301; 03A9 0334 +1F6C 0021; 1F6C +1D6FA 003F; 1D6FA +1D6DA 0061; 1D6DA +1FAE 0061; 1FAE +1FFA 0061; 1FFA +1FAB 0062; 1FAB +03E2 0021; 03E2 +03EC 0021; 03EC +0410 0001 0306 0061; 0410 0001 0306 +04D8 0041; 04D8 +0431 0041; 0431 +0495 0041; 0495 +0413 0301 0334; 0413 0301 +0401 0334; 0401 +0435 1D165 0306 0061; 0435 1D165 0306 +04C1 0062; 04C1 +0417 0041; 0417 +0455 0041; 0455 +04E2 003F; 04E2 +0418 0001 0308 0061; 0418 0001 0308 +0457 0062; 0457 +043A 0041; 043A +049D 0041; 049D +043C 0021; 043C +04C8 0021; 04C8 +043E 0308 0334; 043E 0308 +04E8 0308 0021; 04E8 0308 +0480 0061; 0480 +04AA 0061; 04AA +041A 0334 0341; 041A 0334 +0443 0062; 0443 +0443 0001 0308 0061; 0443 0001 0308 +04AF 0021; 04AF +04B3 0021; 04B3 +047B 0021; 047B +0447 0308 003F; 0447 0308 +04B9 0062; 04B9 +0449 0062; 0449 +044B 0308 0062; 044B 0308 +044D 0308 0021; 044D 0308 +0465 0061; 0465 +046F 0061; 046F +0475 0001 030F 0061; 0475 0001 030F +10A1 0041; 10A1 +10A6 0041; 10A6 +10AA 0041; 10AA +10AE 0041; 10AE +10C3 0041; 10C3 +10B7 0041; 10B7 +10BC 0041; 10BC +10C0 0041; 10C0 +0563 003F; 0563 +0537 0041; 0537 +053C 0041; 053C +0541 0041; 0541 +FB13 0061; FB13 +0549 0041; 0549 +054E 0041; 054E +0583 003F; 0583 +05D0 05BC 0334; 05D0 05BC +FB4C 003F; FB4C +05D3 0062; 05D3 +05F1 0061; 05F1 +FB39 0061; FB39 +FB4D 0041; FB4D +FB40 0334; FB40 +FB44 0021; FB44 +FB47 0061; FB47 +FB2C 003F; FB2C +FE80 0041; FE80 +0627 0654 0041; 0627 0654 +FE85 0041; FE85 +FE89 003F; FE89 +FC98 0062; FC98 +FC9B 0062; FC9B +FBF5 0062; FBF5 +FBF7 0062; FBF7 +FE90 0021; FE90 +FC07 003F; FC07 +FCE2 003F; FCE2 +FB53 0062; FB53 +FB5B 0062; FB5B +FCA1 0062; FCA1 +FCA3 0062; FCA3 +FD55 0041; FD55 +FC10 003F; FC10 +FC12 0021; FC12 +FB67 0021; FB67 +067C 0041; 067C +FE9D 0061; FE9D +FD59 0062; FD59 +FB76 0061; FB76 +FB7A 0061; FB7A +FEA3 0041; FEA3 +FCFF 003F; FCFF +FCAB 0062; FCAB +0685 0041; 0685 +FB89 0062; FB89 +068E 003F; 068E +FDF6 0041; FDF6 +0694 0041; 0694 +FEB2 003F; FEB2 +FD35 0061; FD35 +FCB0 003F; FCB0 +FCFB 003F; FCFB +FD2D 0061; FD2D +FDAA 0041; FDAA +FD28 0062; FD28 +FD1A 0062; FD1A +FC20 003F; FC20 +FDF9 0041; FDF9 +FEBE 0021; FEBE +FDAB 0041; FDAB +FD23 0062; FD23 +FEC2 0062; FEC2 +FCF5 003F; FCF5 +FD3B 0061; FD3B +FD75 003F; FD75 +FD13 0062; FD13 +FC2C 003F; FC2C +06FC 0041; 06FC +FC2F 003F; FC2F +FC7D 0062; FC7D +FB6F 0021; FB6F +FED6 0062; FED6 +FC35 003F; FC35 +FEDA 0062; FEDA +FCC7 0061; FCC7 +FC3D 003F; FC3D +06AB 0041; 06AB +FB94 0041; FB94 +FB97 0021; FB97 +FEDE 0062; FEDE +FCC9 0062; FCC9 +FD82 0041; FD82 +FD87 003F; FD87 +06B7 0041; 06B7 +FCCE 0062; FCCE +FD8B 0041; FD8B +FC49 0041; FC49 +FDB8 0062; FDB8 +FC4D 003F; FC4D +FC8D 0041; FC8D +FBA1 0021; FBA1 +0647 0041; 0647 +FC53 0041; FC53 +FBA8 0041; FBA8 +FEEE 0021; FEEE +FBD9 0021; FBD9 +06C8 0062; 06C8 +0649 003F; 0649 +FEF1 0061; FEF1 +FC57 0041; FC57 +FC94 0061; FC94 +FBFD 0041; FBFD +06D3 0334; 06D3 +0714 003F; 0714 +071A 0062; 071A +0723 0061; 0723 +072C 0062; 072C +0786 0062; 0786 +078C 0062; 078C +079E 0062; 079E +07A6 0062; 07A6 +07B0 0062; 07B0 +120A 0062; 120A +1214 0062; 1214 +121E 0062; 121E +1228 0062; 1228 +1232 0062; 1232 +123C 0062; 123C +1246 0062; 1246 +1254 0062; 1254 +1262 0062; 1262 +126C 0062; 126C +1276 0062; 1276 +1280 0062; 1280 +128C 0062; 128C +1298 0062; 1298 +12A2 0062; 12A2 +12AC 0062; 12AC +12BA 0062; 12BA +12C8 0062; 12C8 +12D3 0062; 12D3 +12DE 0062; 12DE +12E8 0062; 12E8 +12F3 0062; 12F3 +12FD 0062; 12FD +1307 0062; 1307 +1313 0062; 1313 +1320 0062; 1320 +132A 0062; 132A +1334 0062; 1334 +133E 0062; 133E +1349 0062; 1349 +1353 0062; 1353 +0905 0062; 0905 +090D 0062; 090D +0916 093C 0334; 0916 093C +091C 003F; 091C +095D 0061; 095D +092B 0021; 092B +0931 0062; 0931 +093E 003F; 093E +0946 003F; 0946 +0986 0062; 0986 +0990 0062; 0990 +099C 0062; 099C +09A3 0041; 09A3 +09AE 0041; 09AE +09B9 0021; 09B9 +09E3 0021; 09E3 +09D7 0061; 09D7 +0A72 0061; 0A72 +0A59 0061; 0A59 +0A1D 0021; 0A1D +0A27 0021; 0A27 +0A30 0061; 0A30 +0A42 0062; 0A42 +0A88 0061; 0A88 +0A91 0061; 0A91 +0A9C 0061; 0A9C +0AA6 0061; 0AA6 +0AB2 0061; 0AB2 +0AC0 0061; 0AC0 +0AC9 0061; 0AC9 +0B0B 0021; 0B0B +0B17 0021; 0B17 +0B21 0334 0B3C; 0B21 0334 +0B27 0062; 0B27 +0B32 0062; 0B32 +0B3F 0062; 0B3F +0B47 0B3E 0062; 0B47 0B3E +0B87 0041; 0B87 +0B94 0061; 0B94 +0BA9 0021; 0BA9 +0BB7 0021; 0BB7 +0BC8 0021; 0BC8 +0BCD 0062; 0BCD +0C0C 0062; 0C0C +0C17 0062; 0C17 +0C21 0062; 0C21 +0C2C 0062; 0C2C +0C37 0062; 0C37 +0C46 0062; 0C46 +0C55 0062; 0C55 +0C8C 0061; 0C8C +0C97 0061; 0C97 +0CA1 0061; 0CA1 +0CAC 0061; 0CAC +0CB8 0061; 0CB8 +0CC1 0062; 0CC1 +0CCA 003F; 0CCA +0D05 0061; 0D05 +0D0E 0061; 0D0E +0D19 0061; 0D19 +0D23 0061; 0D23 +0D2E 0061; 0D2E +0D38 0061; 0D38 +0D48 0061; 0D48 +0D57 003F; 0D57 +0D8E 003F; 0D8E +0D9B 003F; 0D9B +0DA5 003F; 0DA5 +0DAF 003F; 0DAF +0DBA 003F; 0DBA +0DCA 0334; 0DCA +0DD9 0062; 0DD9 +0DDD 0061; 0DDD +0E04 0061; 0E04 +0E0E 0061; 0E0E +0E18 0061; 0E18 +0E22 0061; 0E22 +0E2C 0061; 0E2C +0E34 0062; 0E34 +0E4D 0041; 0E4D +0E96 0041; 0E96 +0EA2 0041; 0EA2 +0EAF 0041; 0EAF +0334 0EB8; 0EB8 +0F90 003F; 0F90 +0F45 003F; 0F45 +0F4B 003F; 0F4B +0F50 003F; 0F50 +0F55 003F; 0F55 +0F5A 003F; 0F5A +0FAE 003F; 0FAE +0FBC 0021; 0FBC +0FB5 0021; 0FB5 +0F8A 0021; 0F8A +0F71 0334 0F80; 0F71 0334 +0FB2 1D165 0F80 0061; 0FB2 1D165 0F80 +0FB3 0F71 0F80 0041; 0FB3 0F71 0F80 +1902 0061; 1902 +190C 0061; 190C +1916 0061; 1916 +1923 0061; 1923 +1931 0061; 1931 +1702 0061; 1702 +170C 0061; 170C +1722 0021; 1722 +172C 0021; 172C +1740 0041; 1740 +174A 0041; 174A +1760 0041; 1760 +176A 0041; 176A +1002 0041; 1002 +100C 0041; 100C +1016 0041; 1016 +101E 0041; 101E +1029 0021; 1029 +1030 0021; 1030 +1781 0041; 1781 +178B 0041; 178B +1795 0041; 1795 +179F 0041; 179F +17A8 0041; 17A8 +17B2 0041; 17B2 +17BC 0041; 17BC +17D2 003F; 17D2 +1959 003F; 1959 +1963 003F; 1963 +196D 003F; 196D +1884 003F; 1884 +1845 003F; 1845 +1825 003F; 1825 +188A 003F; 188A +184E 003F; 184E +189C 003F; 189C +1869 003F; 1869 +1836 003F; 1836 +183A 003F; 183A +186F 003F; 186F +185A 003F; 185A +1898 003F; 1898 +1899 003F; 1899 +13A3 0062; 13A3 +13AD 0062; 13AD +13B7 0062; 13B7 +13C1 0062; 13C1 +13CB 0062; 13CB +13D5 0062; 13D5 +13DF 0062; 13DF +13E9 0062; 13E9 +13F3 0062; 13F3 +1409 0062; 1409 +1413 0062; 1413 +141D 0062; 141D +1427 0062; 1427 +1431 0062; 1431 +143B 0062; 143B +1445 0062; 1445 +144F 0062; 144F +1459 0062; 1459 +1463 0062; 1463 +146D 0062; 146D +1477 0062; 1477 +1481 0062; 1481 +148B 0062; 148B +1495 0062; 1495 +149F 0062; 149F +14A9 0062; 14A9 +14B3 0062; 14B3 +14BD 0062; 14BD +14C7 0062; 14C7 +14D1 0062; 14D1 +14DB 0062; 14DB +14E5 0062; 14E5 +14EF 0062; 14EF +14F9 0062; 14F9 +1503 0062; 1503 +150D 0062; 150D +1517 0062; 1517 +1521 0062; 1521 +152B 0062; 152B +1535 0062; 1535 +153F 0062; 153F +1549 0062; 1549 +1553 0062; 1553 +155D 0062; 155D +1567 0062; 1567 +1571 0062; 1571 +157B 0062; 157B +1585 0062; 1585 +158E 0062; 158E +1673 0062; 1673 +159C 0062; 159C +15A6 0062; 15A6 +15AF 0062; 15AF +15B9 0062; 15B9 +15C3 0062; 15C3 +15CD 0062; 15CD +15D7 0062; 15D7 +15E1 0062; 15E1 +15EB 0062; 15EB +15F5 0062; 15F5 +15FF 0062; 15FF +1609 0062; 1609 +1613 0062; 1613 +161D 0062; 161D +1627 0062; 1627 +1631 0062; 1631 +163B 0062; 163B +1645 0062; 1645 +164F 0062; 164F +1659 0062; 1659 +1663 0062; 1663 +1681 0062; 1681 +168B 0062; 168B +1695 0062; 1695 +16A5 0062; 16A5 +16B0 0062; 16B0 +16BA 003F; 16BA +16C4 0062; 16C4 +16CB 0061; 16CB +16D6 0062; 16D6 +16DF 0062; 16DF +16E5 0062; 16E5 +AC01 0062; AC01 +FFA4 0061; FFA4 +FFA8 0062; FFA8 +3272 0062; 3272 +1109 0041; 1109 +FFB7 0062; FFB7 +FFB9 0062; FFB9 +FFBB 0062; FFBB +FFBD 0062; FFBD +D7A1 0062; D7A1 +1118 0062; 1118 +111E 0061; 111E +1123 0061; 1123 +112A 0062; 112A +317C 0062; 317C +1137 0062; 1137 +317F 0062; 317F +1149 0062; 1149 +1152 0062; 1152 +3186 0062; 3186 +FFC3 0062; FFC3 +3154 003F; 3154 +3157 0041; 3157 +FFCF 0062; FFCF +315E 003F; 315E +3161 0041; 3161 +1178 0062; 1178 +1182 0062; 1182 +1189 0062; 1189 +1192 0061; 1192 +119A 0062; 119A +11A2 0062; 11A2 +3136 003F; 3136 +FFAB 0062; FFAB +313F 003F; 313F +11BD 0062; 11BD +11C7 0061; 11C7 +11CE 0061; 11CE +11D6 0062; 11D6 +316F 0062; 316F +11E6 0062; 11E6 +11F0 0062; 11F0 +11F8 0062; 11F8 +3300 0062; 3300 +3304 0062; 3304 +30A5 0062; 30A5 +FF74 0062; FF74 +3309 0041; 3309 +330B 0061; 330B +304E 0041; 304E +304F 3099 0334; 304F 3099 +331A 0021; 331A +3052 0041; 3052 +3054 0062; 3054 +331F 0061; 331F +3006 003F; 3006 +305B 0334 3099; 305B 0334 +30BD 3099 0334; 30BD 3099 +3324 0021; 3324 +3062 0041; 3062 +30C5 0041; 30C5 +3325 0062; 3325 +3327 0041; 3327 +FF87 0021; FF87 +306E 0061; 306E +332B 0041; 332B +3072 0334 309A; 3072 0334 +30D4 0062; 30D4 +30D7 003F; 30D7 +3079 0334; 3079 +30D9 0061; 30D9 +30DB 309A 0334; 30DB 309A +30DB 0062; 30DB +3343 0041; 3343 +3348 0041; 3348 +3081 0061; 3081 +3084 003F; 3084 +32F4 003F; 32F4 +30E8 0041; 30E8 +FF98 003F; FF98 +32F8 0061; 32F8 +FF9B 0021; FF9B +32FB 0041; 32FB +3091 0041; 3091 +FF9D 0041; FF9D +31B5 0061; 31B5 +31B7 0061; 31B7 +31A1 0021; 31A1 +311D 003F; 311D +3123 003F; 3123 +31B3 0041; 31B3 +A005 003F; A005 +A00F 003F; A00F +A019 003F; A019 +A023 003F; A023 +A02D 003F; A02D +A037 003F; A037 +A041 003F; A041 +A04B 003F; A04B +A055 003F; A055 +A05F 003F; A05F +A069 003F; A069 +A073 003F; A073 +A07D 003F; A07D +A087 003F; A087 +A091 003F; A091 +A09B 003F; A09B +A0A5 003F; A0A5 +A0AF 003F; A0AF +A0B9 003F; A0B9 +A0C3 003F; A0C3 +A0CD 003F; A0CD +A0D7 003F; A0D7 +A0E1 003F; A0E1 +A0EB 003F; A0EB +A0F5 003F; A0F5 +A0FF 003F; A0FF +A109 003F; A109 +A113 003F; A113 +A11D 003F; A11D +A127 003F; A127 +A131 003F; A131 +A13B 003F; A13B +A145 003F; A145 +A14F 003F; A14F +A159 003F; A159 +A163 003F; A163 +A16D 003F; A16D +A177 003F; A177 +A181 003F; A181 +A18B 003F; A18B +A195 003F; A195 +A19F 003F; A19F +A1A9 003F; A1A9 +A1B3 003F; A1B3 +A1BD 003F; A1BD +A1C7 003F; A1C7 +A1D1 003F; A1D1 +A1DB 003F; A1DB +A1E5 003F; A1E5 +A1EF 003F; A1EF +A1F9 003F; A1F9 +A203 003F; A203 +A20D 003F; A20D +A217 003F; A217 +A221 003F; A221 +A22B 003F; A22B +A235 003F; A235 +A23F 003F; A23F +A249 003F; A249 +A253 003F; A253 +A25D 003F; A25D +A267 003F; A267 +A271 003F; A271 +A27B 003F; A27B +A285 003F; A285 +A28F 003F; A28F +A299 003F; A299 +A2A3 003F; A2A3 +A2AD 003F; A2AD +A2B7 003F; A2B7 +A2C1 003F; A2C1 +A2CB 003F; A2CB +A2D5 003F; A2D5 +A2DF 003F; A2DF +A2E9 003F; A2E9 +A2F3 003F; A2F3 +A2FD 003F; A2FD +A307 003F; A307 +A311 003F; A311 +A31B 003F; A31B +A325 003F; A325 +A32F 003F; A32F +A339 003F; A339 +A343 003F; A343 +A34D 003F; A34D +A357 003F; A357 +A361 003F; A361 +A36B 003F; A36B +A375 003F; A375 +A37F 003F; A37F +A389 003F; A389 +A393 003F; A393 +A39D 003F; A39D +A3A7 003F; A3A7 +A3B1 003F; A3B1 +A3BB 003F; A3BB +A3C5 003F; A3C5 +A3CF 003F; A3CF +A3D9 003F; A3D9 +A3E3 003F; A3E3 +A3ED 003F; A3ED +A3F7 003F; A3F7 +A401 003F; A401 +A40B 003F; A40B +A415 003F; A415 +A41F 003F; A41F +A429 003F; A429 +A433 003F; A433 +A43D 003F; A43D +A447 003F; A447 +A451 003F; A451 +A45B 003F; A45B +A465 003F; A465 +A46F 003F; A46F +A479 003F; A479 +A483 003F; A483 +10300 003F; 10300 +1030A 003F; 1030A +10314 003F; 10314 +1031E 003F; 1031E +10339 003F; 10339 +10343 003F; 10343 +10401 0021; 10401 +10406 0021; 10406 +1040B 0021; 1040B +10410 0021; 10410 +10415 0021; 10415 +1041A 0021; 1041A +1041F 0021; 1041F +10424 0021; 10424 +10452 003F; 10452 +1045C 003F; 1045C +10466 003F; 10466 +10470 003F; 10470 +1047A 003F; 1047A +10484 003F; 10484 +1048E 003F; 1048E +10498 003F; 10498 +10004 003F; 10004 +1000F 003F; 1000F +10019 003F; 10019 +10023 003F; 10023 +1002E 003F; 1002E +10038 003F; 10038 +10044 003F; 10044 +10050 003F; 10050 +1005A 003F; 1005A +10086 003F; 10086 +10090 003F; 10090 +1009A 003F; 1009A +100A4 003F; 100A4 +100AE 003F; 100AE +100B8 003F; 100B8 +100C2 003F; 100C2 +100CC 003F; 100CC +100D6 003F; 100D6 +100E0 003F; 100E0 +100EA 003F; 100EA +100F4 003F; 100F4 +10803 003F; 10803 +10810 003F; 10810 +1081A 003F; 1081A +10824 003F; 10824 +1082E 003F; 1082E +1083C 003F; 1083C +10388 003F; 10388 +10392 003F; 10392 +1039C 003F; 1039C +3286 0061; 3286 +319B 003F; 319B +2F800 003F; 2F800 +2F05 003F; 2F05 +2E85 003F; 2E85 +FA30 0041; FA30 +FA31 0041; FA31 +F978 003F; F978 +2F8D3 003F; 2F8D3 +F955 003F; F955 +2F81E 003F; 2F81E +F9C7 003F; F9C7 +F92F 003F; F92F +F963 0041; F963 +2F82C 003F; 2F82C +2F82F 003F; 2F82F +2F1C 003F; 2F1C +F9DE 003F; F9DE +2F842 003F; 2F842 +FA0D 003F; FA0D +F9A9 003F; F9A9 +2F857 003F; 2F857 +2F851 003F; 2F851 +2F24 003F; 2F24 +2F862 003F; 2F862 +2F27 003F; 2F27 +2F28 003F; 2F28 +2E91 0021; 2E91 +2F2C 0041; 2F2C +2F9F4 003F; 2F9F4 +2F31 003F; 2F31 +FA01 003F; FA01 +2F36 0021; 2F36 +2F874 003F; 2F874 +2E96 003F; 2E96 +2F8A5 003F; 2F8A5 +FA3F 0041; FA3F +F990 003F; F990 +F925 003F; F925 +2F8BC 003F; 2F8BC +2F8C5 003F; 2F8C5 +2F43 003F; 2F43 +2F47 0061; 2F47 +2F8D5 003F; 2F8D5 +3292 003F; 3292 +F9C8 003F; F9C8 +F97A 003F; F97A +F914 0061; F914 +2F4C 003F; 2F4C +F970 0041; F970 +328C 0061; 328C +329F 003F; 329F +2F901 0021; 2F901 +2F909 003F; 2F909 +2F912 003F; 2F912 +2F835 003F; 2F835 +2F91E 003F; 2F91E +2F921 003F; 2F921 +3295 003F; 3295 +2F5E 003F; 2F5E +F9CC 003F; F9CC +2F60 003F; 2F60 +F9CD 003F; F9CD +F90E 003F; F90E +2F940 003F; 2F940 +2F94E 003F; 2F94E +2EAC 0061; 2EAC +3297 0021; 3297 +2F71 003F; 2F71 +2F73 003F; 2F73 +2F963 003F; 2F963 +2F968 003F; 2F968 +2F96E 003F; 2F96E +2F79 003F; 2F79 +2EB6 0021; 2EB6 +2F7C 0061; 2F7C +2F97F 003F; 2F97F +2F983 003F; 2F983 +2F98B 0021; 2F98B +FA5E 0021; FA5E +2F995 003F; 2F995 +2F99D 003F; 2F99D +FA5F 0041; FA5F +FA20 003F; FA20 +2F8D 003F; 2F8D +2F9C0 003F; 2F9C0 +F9A0 003F; F9A0 +2EC4 003F; 2EC4 +2F9CF 003F; 2F9CF +F9FC 003F; F9FC +2F99 003F; 2F99 +2EC9 003F; 2EC9 +2F9D 003F; 2F9D +2F9F 003F; 2F9F +FA67 0021; FA67 +FA26 003F; FA26 +2FA6 0021; 2FA6 +2F9EB 003F; 2F9EB +2F9F0 003F; 2F9F0 +F9DC 003F; F9DC +F9B2 003F; F9B2 +2FB0 003F; 2FB0 +2F9FE 0041; 2F9FE +2FB7 0021; 2FB7 +2EE1 0021; 2EE1 +2EE3 0021; 2EE3 +2FC2 003F; 2FC2 +F920 003F; F920 +2FC7 0021; 2FC7 +2EEA 0021; 2EEA +2EEB 0021; 2EEB +F908 0021; F908 +9FA3 003F; 9FA3 +FA23 003F; FA23 +3405 003F; 3405 +340F 003F; 340F +3419 003F; 3419 +3423 003F; 3423 +342D 003F; 342D +3437 003F; 3437 +3441 003F; 3441 +344B 003F; 344B +3455 003F; 3455 +345F 003F; 345F +3469 003F; 3469 +3473 003F; 3473 +347D 003F; 347D +3487 003F; 3487 +3491 003F; 3491 +349B 003F; 349B +34A4 003F; 34A4 +34AE 003F; 34AE +34B8 003F; 34B8 +34C0 003F; 34C0 +34CA 003F; 34CA +34D4 003F; 34D4 +34DE 003F; 34DE +34E7 003F; 34E7 +34F1 003F; 34F1 +34FB 003F; 34FB +3505 003F; 3505 +350F 003F; 350F +3518 003F; 3518 +3522 003F; 3522 +352C 003F; 352C +3536 003F; 3536 +3540 003F; 3540 +354A 003F; 354A +3554 003F; 3554 +355E 003F; 355E +3568 003F; 3568 +3572 003F; 3572 +357C 003F; 357C +3586 003F; 3586 +3590 003F; 3590 +359A 003F; 359A +35A4 003F; 35A4 +35AE 003F; 35AE +35B8 003F; 35B8 +35C2 003F; 35C2 +35CC 003F; 35CC +35D6 003F; 35D6 +35E0 003F; 35E0 +35EA 003F; 35EA +35F4 003F; 35F4 +35FE 003F; 35FE +3608 003F; 3608 +3612 003F; 3612 +361C 003F; 361C +3626 003F; 3626 +3630 003F; 3630 +363A 003F; 363A +3644 003F; 3644 +364E 003F; 364E +3658 003F; 3658 +3662 003F; 3662 +366C 003F; 366C +3676 003F; 3676 +3680 003F; 3680 +368A 003F; 368A +3694 003F; 3694 +369E 003F; 369E +36A8 003F; 36A8 +36B2 003F; 36B2 +36BC 003F; 36BC +36C6 003F; 36C6 +36D0 003F; 36D0 +36DA 003F; 36DA +36E4 003F; 36E4 +2F867 0021; 2F867 +36F7 003F; 36F7 +3700 003F; 3700 +370A 003F; 370A +3714 003F; 3714 +371E 003F; 371E +3728 003F; 3728 +3732 003F; 3732 +373C 003F; 373C +3746 003F; 3746 +3750 003F; 3750 +375A 003F; 375A +3764 003F; 3764 +376E 003F; 376E +3778 003F; 3778 +3781 0041; 3781 +378B 003F; 378B +3795 003F; 3795 +379F 003F; 379F +37A9 003F; 37A9 +37B3 003F; 37B3 +37BD 003F; 37BD +37C7 003F; 37C7 +37D1 003F; 37D1 +37DB 003F; 37DB +37E5 003F; 37E5 +37EF 003F; 37EF +37F9 003F; 37F9 +3803 003F; 3803 +380D 003F; 380D +3817 003F; 3817 +3821 003F; 3821 +382B 003F; 382B +3834 003F; 3834 +383E 003F; 383E +3848 003F; 3848 +3852 003F; 3852 +385C 003F; 385C +3865 003F; 3865 +386F 003F; 386F +3879 003F; 3879 +3882 003F; 3882 +388C 003F; 388C +3896 003F; 3896 +38A0 003F; 38A0 +38AA 003F; 38AA +38B4 003F; 38B4 +38BE 003F; 38BE +38C7 0041; 38C7 +38D1 003F; 38D1 +38DB 003F; 38DB +38E4 003F; 38E4 +38EE 003F; 38EE +38F8 003F; 38F8 +3902 003F; 3902 +390C 003F; 390C +3916 003F; 3916 +391F 003F; 391F +3929 003F; 3929 +3933 003F; 3933 +393C 003F; 393C +3946 003F; 3946 +3950 003F; 3950 +395A 003F; 395A +3964 003F; 3964 +396E 003F; 396E +3978 003F; 3978 +3982 003F; 3982 +398C 003F; 398C +3996 003F; 3996 +39A0 003F; 39A0 +39AA 003F; 39AA +39B4 003F; 39B4 +39BE 003F; 39BE +39C8 003F; 39C8 +39D2 003F; 39D2 +39DC 003F; 39DC +39E6 003F; 39E6 +39F0 003F; 39F0 +39FA 003F; 39FA +3A04 003F; 3A04 +3A0E 003F; 3A0E +3A18 003F; 3A18 +3A22 003F; 3A22 +3A2C 003F; 3A2C +3A35 003F; 3A35 +3A3F 003F; 3A3F +3A49 003F; 3A49 +3A53 003F; 3A53 +3A5D 003F; 3A5D +3A67 003F; 3A67 +3A70 003F; 3A70 +3A7A 003F; 3A7A +3A84 003F; 3A84 +3A8E 003F; 3A8E +3A98 003F; 3A98 +3AA2 003F; 3AA2 +3AAC 003F; 3AAC +3AB6 003F; 3AB6 +3AC0 003F; 3AC0 +3ACA 003F; 3ACA +3AD4 003F; 3AD4 +3ADE 003F; 3ADE +3AE7 003F; 3AE7 +3AF1 003F; 3AF1 +3AFB 003F; 3AFB +3B05 003F; 3B05 +3B0E 003F; 3B0E +3B18 003F; 3B18 +3B21 003F; 3B21 +3B2B 003F; 3B2B +3B35 003F; 3B35 +3B3F 003F; 3B3F +2F8DE 0021; 2F8DE +3B52 003F; 3B52 +3B5C 003F; 3B5C +3B66 003F; 3B66 +3B70 003F; 3B70 +3B7A 003F; 3B7A +3B84 003F; 3B84 +3B8E 003F; 3B8E +3B98 003F; 3B98 +3BA1 003F; 3BA1 +3BAB 003F; 3BAB +3BB5 003F; 3BB5 +3BBF 003F; 3BBF +3BC9 003F; 3BC9 +3BD3 003F; 3BD3 +3BDD 003F; 3BDD +3BE7 003F; 3BE7 +3BF1 003F; 3BF1 +3BFB 003F; 3BFB +3C05 003F; 3C05 +3C0F 003F; 3C0F +3C18 0041; 3C18 +3C22 003F; 3C22 +3C2C 003F; 3C2C +3C36 003F; 3C36 +3C40 003F; 3C40 +3C4A 003F; 3C4A +3C53 003F; 3C53 +3C5D 003F; 3C5D +3C67 003F; 3C67 +3C71 003F; 3C71 +3C7B 003F; 3C7B +3C85 003F; 3C85 +3C8F 003F; 3C8F +3C99 003F; 3C99 +3CA3 003F; 3CA3 +3CAD 003F; 3CAD +3CB7 003F; 3CB7 +3CC1 003F; 3CC1 +3CCB 003F; 3CCB +3CD5 003F; 3CD5 +3CDF 003F; 3CDF +3CE9 003F; 3CE9 +3CF3 003F; 3CF3 +3CFD 003F; 3CFD +3D07 003F; 3D07 +3D11 003F; 3D11 +3D1B 003F; 3D1B +3D25 003F; 3D25 +3D2F 003F; 3D2F +3D38 003F; 3D38 +3D42 003F; 3D42 +3D4C 003F; 3D4C +3D56 003F; 3D56 +3D60 003F; 3D60 +3D6A 003F; 3D6A +3D74 003F; 3D74 +3D7E 003F; 3D7E +3D88 003F; 3D88 +3D92 003F; 3D92 +3D9B 003F; 3D9B +3DA5 003F; 3DA5 +3DAF 003F; 3DAF +3DB9 003F; 3DB9 +3DC3 003F; 3DC3 +3DCD 003F; 3DCD +3DD7 003F; 3DD7 +3DE1 003F; 3DE1 +3DEB 003F; 3DEB +3DF5 003F; 3DF5 +3DFF 003F; 3DFF +3E09 003F; 3E09 +3E13 003F; 3E13 +3E1D 003F; 3E1D +3E27 003F; 3E27 +3E31 003F; 3E31 +3E3B 003F; 3E3B +3E45 003F; 3E45 +3E4F 003F; 3E4F +3E59 003F; 3E59 +3E63 003F; 3E63 +3E6D 003F; 3E6D +3E77 003F; 3E77 +3E81 003F; 3E81 +3E8B 003F; 3E8B +3E95 003F; 3E95 +3E9F 003F; 3E9F +3EA9 003F; 3EA9 +3EB2 003F; 3EB2 +3EBA 003F; 3EBA +3EC4 003F; 3EC4 +3ECE 003F; 3ECE +3ED8 003F; 3ED8 +3EE2 003F; 3EE2 +3EEC 003F; 3EEC +3EF6 003F; 3EF6 +3F00 003F; 3F00 +3F0A 003F; 3F0A +3F14 003F; 3F14 +3F1D 003F; 3F1D +3F27 003F; 3F27 +3F31 003F; 3F31 +3F3B 003F; 3F3B +3F45 003F; 3F45 +3F4F 003F; 3F4F +3F59 003F; 3F59 +3F63 003F; 3F63 +3F6D 003F; 3F6D +3F77 003F; 3F77 +3F81 003F; 3F81 +3F8B 003F; 3F8B +3F95 003F; 3F95 +3F9F 003F; 3F9F +3FA9 003F; 3FA9 +3FB3 003F; 3FB3 +3FBD 003F; 3FBD +3FC7 003F; 3FC7 +3FD1 003F; 3FD1 +3FDB 003F; 3FDB +3FE5 003F; 3FE5 +3FEF 003F; 3FEF +3FF9 003F; 3FF9 +4002 003F; 4002 +400B 003F; 400B +4015 003F; 4015 +401F 003F; 401F +4029 003F; 4029 +4033 003F; 4033 +403C 003F; 403C +2F94B 0021; 2F94B +404F 003F; 404F +4059 003F; 4059 +4063 003F; 4063 +406D 003F; 406D +4077 003F; 4077 +4081 003F; 4081 +408B 003F; 408B +4095 003F; 4095 +409E 003F; 409E +40A8 003F; 40A8 +40B2 003F; 40B2 +40BC 003F; 40BC +40C6 003F; 40C6 +40D0 003F; 40D0 +40DA 003F; 40DA +40E3 0041; 40E3 +40ED 003F; 40ED +40F7 003F; 40F7 +4101 003F; 4101 +410B 003F; 410B +4115 003F; 4115 +411F 003F; 411F +4129 003F; 4129 +4132 003F; 4132 +413C 003F; 413C +4146 003F; 4146 +4150 003F; 4150 +415A 003F; 415A +4164 003F; 4164 +416E 003F; 416E +4178 003F; 4178 +4182 003F; 4182 +418C 003F; 418C +4196 003F; 4196 +41A0 003F; 41A0 +41AA 003F; 41AA +41B4 003F; 41B4 +41BE 003F; 41BE +41C8 003F; 41C8 +41D2 003F; 41D2 +41DC 003F; 41DC +41E6 003F; 41E6 +41F0 003F; 41F0 +41FA 003F; 41FA +4203 003F; 4203 +420D 003F; 420D +4217 003F; 4217 +4221 003F; 4221 +422A 003F; 422A +4234 003F; 4234 +423E 003F; 423E +4248 003F; 4248 +4252 003F; 4252 +425C 003F; 425C +4266 003F; 4266 +4270 003F; 4270 +427A 003F; 427A +4284 003F; 4284 +428E 003F; 428E +4298 003F; 4298 +42A1 003F; 42A1 +42AB 003F; 42AB +42B5 003F; 42B5 +42BF 003F; 42BF +42C9 003F; 42C9 +42D3 003F; 42D3 +42DD 003F; 42DD +42E7 003F; 42E7 +42F1 003F; 42F1 +42FB 003F; 42FB +4304 003F; 4304 +430E 003F; 430E +4318 003F; 4318 +4322 003F; 4322 +432C 003F; 432C +4335 003F; 4335 +433F 003F; 433F +4349 003F; 4349 +4353 003F; 4353 +435C 003F; 435C +4366 003F; 4366 +4370 003F; 4370 +437A 003F; 437A +4384 003F; 4384 +438E 003F; 438E +4398 003F; 4398 +43A2 003F; 43A2 +43AC 003F; 43AC +43B6 003F; 43B6 +43C0 003F; 43C0 +43CA 003F; 43CA +43D4 003F; 43D4 +43DC 003F; 43DC +43E6 003F; 43E6 +43F0 003F; 43F0 +43FA 003F; 43FA +4404 003F; 4404 +440D 003F; 440D +4417 003F; 4417 +4421 003F; 4421 +442B 003F; 442B +4435 003F; 4435 +443F 003F; 443F +4449 003F; 4449 +4453 003F; 4453 +445D 003F; 445D +4467 003F; 4467 +4470 003F; 4470 +447A 003F; 447A +4484 003F; 4484 +448E 003F; 448E +4498 003F; 4498 +44A2 003F; 44A2 +44AC 003F; 44AC +44B6 003F; 44B6 +44C0 003F; 44C0 +44CA 003F; 44CA +44D4 003F; 44D4 +44DE 003F; 44DE +44E8 003F; 44E8 +44F2 003F; 44F2 +44FC 003F; 44FC +4506 003F; 4506 +4510 003F; 4510 +451A 003F; 451A +4524 003F; 4524 +452D 003F; 452D +4537 003F; 4537 +4541 003F; 4541 +454B 003F; 454B +4555 003F; 4555 +455E 003F; 455E +4567 003F; 4567 +4570 003F; 4570 +457A 003F; 457A +4584 003F; 4584 +458E 003F; 458E +4598 003F; 4598 +45A2 003F; 45A2 +45AC 003F; 45AC +45B6 003F; 45B6 +45C0 003F; 45C0 +45CA 003F; 45CA +45D4 003F; 45D4 +45DD 003F; 45DD +45E7 003F; 45E7 +45F1 003F; 45F1 +45FA 003F; 45FA +4604 003F; 4604 +460E 003F; 460E +4618 003F; 4618 +4622 003F; 4622 +462C 003F; 462C +4635 0041; 4635 +463F 003F; 463F +4649 003F; 4649 +4653 003F; 4653 +465D 003F; 465D +4667 003F; 4667 +4671 003F; 4671 +467B 003F; 467B +4685 003F; 4685 +468F 003F; 468F +4699 003F; 4699 +46A3 003F; 46A3 +46AD 003F; 46AD +46B7 003F; 46B7 +46C0 003F; 46C0 +46C9 003F; 46C9 +46D3 003F; 46D3 +46DD 003F; 46DD +46E7 003F; 46E7 +46F1 003F; 46F1 +46FB 003F; 46FB +4705 003F; 4705 +470F 003F; 470F +4719 003F; 4719 +4723 003F; 4723 +472D 003F; 472D +4737 003F; 4737 +4741 003F; 4741 +474B 003F; 474B +4755 003F; 4755 +475F 003F; 475F +4769 003F; 4769 +4773 003F; 4773 +477D 003F; 477D +4787 003F; 4787 +4791 003F; 4791 +479B 003F; 479B +47A5 003F; 47A5 +47AF 003F; 47AF +47B9 003F; 47B9 +47C3 003F; 47C3 +47CD 003F; 47CD +47D7 003F; 47D7 +47E1 003F; 47E1 +47EB 003F; 47EB +47F5 003F; 47F5 +47FF 003F; 47FF +4809 003F; 4809 +4813 003F; 4813 +481D 003F; 481D +4827 003F; 4827 +4831 003F; 4831 +483B 003F; 483B +4845 003F; 4845 +484F 003F; 484F +4859 003F; 4859 +4863 003F; 4863 +486D 003F; 486D +4877 003F; 4877 +4881 003F; 4881 +488B 003F; 488B +4895 003F; 4895 +489F 003F; 489F +48A9 003F; 48A9 +48B3 003F; 48B3 +48BD 003F; 48BD +48C7 003F; 48C7 +48D1 003F; 48D1 +48DB 003F; 48DB +48E5 003F; 48E5 +48EF 003F; 48EF +48F9 003F; 48F9 +4903 003F; 4903 +490D 003F; 490D +4917 003F; 4917 +4921 003F; 4921 +492B 003F; 492B +4935 003F; 4935 +493F 003F; 493F +4949 003F; 4949 +4953 003F; 4953 +495D 003F; 495D +4967 003F; 4967 +4971 003F; 4971 +497B 003F; 497B +4985 003F; 4985 +498F 003F; 498F +4998 003F; 4998 +49A2 003F; 49A2 +49AC 003F; 49AC +49B6 003F; 49B6 +49C0 003F; 49C0 +49CA 003F; 49CA +49D4 003F; 49D4 +49DE 003F; 49DE +49E7 003F; 49E7 +49F1 003F; 49F1 +49FB 003F; 49FB +4A05 003F; 4A05 +4A0F 003F; 4A0F +4A19 003F; 4A19 +4A23 003F; 4A23 +4A2D 003F; 4A2D +4A37 003F; 4A37 +4A41 003F; 4A41 +4A4B 003F; 4A4B +4A55 003F; 4A55 +4A5F 003F; 4A5F +4A69 003F; 4A69 +4A72 003F; 4A72 +4A7B 003F; 4A7B +4A85 003F; 4A85 +4A8F 003F; 4A8F +4A99 003F; 4A99 +4AA3 003F; 4AA3 +4AAD 003F; 4AAD +4AB6 003F; 4AB6 +4AC0 003F; 4AC0 +4ACA 003F; 4ACA +4AD4 003F; 4AD4 +4ADE 003F; 4ADE +4AE8 003F; 4AE8 +4AF2 003F; 4AF2 +4AFC 003F; 4AFC +4B06 003F; 4B06 +4B10 003F; 4B10 +4B1A 003F; 4B1A +4B24 003F; 4B24 +4B2E 003F; 4B2E +4B37 003F; 4B37 +4B41 003F; 4B41 +4B4B 003F; 4B4B +4B55 003F; 4B55 +4B5F 003F; 4B5F +4B69 003F; 4B69 +4B73 003F; 4B73 +4B7D 003F; 4B7D +4B87 003F; 4B87 +4B91 003F; 4B91 +4B9B 003F; 4B9B +4BA5 003F; 4BA5 +4BAF 003F; 4BAF +4BB9 003F; 4BB9 +4BC3 003F; 4BC3 +4BCD 003F; 4BCD +4BD6 003F; 4BD6 +4BE0 003F; 4BE0 +4BEA 003F; 4BEA +4BF4 003F; 4BF4 +4BFE 003F; 4BFE +4C08 003F; 4C08 +4C12 003F; 4C12 +4C1C 003F; 4C1C +4C26 003F; 4C26 +4C30 003F; 4C30 +4C3A 003F; 4C3A +4C44 003F; 4C44 +4C4E 003F; 4C4E +4C58 003F; 4C58 +4C62 003F; 4C62 +4C6C 003F; 4C6C +4C76 003F; 4C76 +4C80 003F; 4C80 +4C8A 003F; 4C8A +4C94 003F; 4C94 +4C9E 003F; 4C9E +4CA8 003F; 4CA8 +4CB2 003F; 4CB2 +4CBC 003F; 4CBC +4CC6 003F; 4CC6 +4CCF 003F; 4CCF +4CD9 003F; 4CD9 +4CE3 003F; 4CE3 +2FA0E 0021; 2FA0E +4CF6 003F; 4CF6 +4CFF 003F; 4CFF +4D09 003F; 4D09 +4D13 003F; 4D13 +4D1D 003F; 4D1D +4D27 003F; 4D27 +4D31 003F; 4D31 +4D3B 003F; 4D3B +4D45 003F; 4D45 +4D4F 003F; 4D4F +4D58 003F; 4D58 +4D62 003F; 4D62 +4D6C 003F; 4D6C +4D76 003F; 4D76 +4D80 003F; 4D80 +4D8A 003F; 4D8A +4D94 003F; 4D94 +4D9E 003F; 4D9E +4DA8 003F; 4DA8 +4DB2 003F; 4DB2 +2F803 003F; 2F803 +2F860 003F; 2F860 +2F891 0041; 2F891 +2F8E3 003F; 2F8E3 +2F91D 003F; 2F91D +2F942 003F; 2F942 +2F95D 0041; 2F95D +2F97C 003F; 2F97C +2F9B1 003F; 2F9B1 +2F9ED 003F; 2F9ED +2FA12 003F; 2FA12 +2A6D6 003F; 2A6D6 +F8FC 003F; F8FC +E0004 003F; E0004 +F00FA 003F; F00FA +FFFF8 003F; FFFF8 +100004 003F; 100004 +10FF02 003F; 10FF02 diff --git a/icuSources/test/testdata/CollationTest_SHIFTED_STUB.txt b/icuSources/test/testdata/CollationTest_SHIFTED_STUB.txt index ea22a6af..6e9a9800 100644 --- a/icuSources/test/testdata/CollationTest_SHIFTED_STUB.txt +++ b/icuSources/test/testdata/CollationTest_SHIFTED_STUB.txt @@ -1,2867 +1,2272 @@ -# Copyright (c) 2001-2003 International Business Machines -# Corporation and others. All Rights Reserved. -# This is a stub file -# for complete test file, go to: -# http://oss.software.ibm.com/cvs/icu4j/unicodetools/com/ibm/text/data/ -# based on: -# UCA Version: 3.1.1d6/3.2.0 -# Generated: 2002-07-02,18:49:23 GMT [MD] -0009 0021; -000A 0021; -000B 0021; -000C 0021; -000D 0021; -0085 0021; -2028 0021; -2029 0021; -0020 0021; -00A0 0021; -2000 0021; -2001 0021; -2002 0021; -2003 0021; -2004 0021; -2005 0021; -2006 0021; -2007 0021; -2008 0021; -2009 0021; -200A 0021; -FE4A 0021; -FE4B 0021; -FE4C 0021; -02D8 0021; -02D9 0021; -00A8 0301 0334; -00A8 0334 0300; -00A8 0334 0301; -00A8 0334 0340; -00A8 0334 0341; -00A8 0334 0342; -00A8 0340 0334; -00A8 0342 0334; -0385 0334; -1FC1 0334; -1FED 0334; -00A8 0021; -00AD 0021; -002D 0021; -FE63 0021; -FF0D 0021; -058A 0021; -1806 0021; -1807 0021; -2010 0021; -2011 0021; -2012 0021; -2013 0021; -FE32 0021; -2014 0021; -FE31 0021; -FE58 0021; -2015 0021; -0003 0021; -0004 0021; -0005 0021; -0006 0021; -0007 0021; -0008 0021; -000E 0021; -000F 0021; -0010 0021; -0011 0021; -0012 0021; -0013 0021; -0014 0021; -0015 0021; -0016 0021; -0017 0021; -0018 0021; -0019 0021; -001A 0021; -001B 0021; -001C 0021; -001D 0021; -001E 0021; -001F 0021; -007F 0021; -0080 0021; -0081 0021; -0082 0021; -0083 0021; -0084 0021; -0086 0021; -0087 0021; -0088 0021; -0089 0021; -008A 0021; -008B 0021; -008C 0021; -008D 0021; -008E 0021; -008F 0021; -0090 0021; -0091 0021; -0092 0021; -0093 0021; -0094 0021; -0095 0021; -0096 0021; -0097 0021; -0098 0021; -0099 0021; -009A 0021; -009B 0021; -009C 0021; -009D 0021; -009E 0021; -009F 0021; -0488 0021; -0489 0021; -0591 0021; -0592 0021; -0593 0021; -0594 0021; -0595 0021; -0596 0021; -0597 0021; -0598 0021; -0599 0021; -059A 0021; -059B 0021; -059C 0021; -059D 0021; -059E 0021; -059F 0021; -05A0 0021; -05A1 0021; -05A3 0021; -05A4 0021; -05A5 0021; -05A6 0021; -05A7 0021; -05A8 0021; -05A9 0021; -05AA 0021; -05AB 0021; -05AC 0021; -05AD 0021; -05AE 0021; -05AF 0021; -05BD 0021; -05C4 0021; -06DD 0021; -06DE 0021; -06DF 0021; -06E0 0021; -06EA 0021; -06EB 0021; -06EC 0021; -070F 0021; -0E4E 0021; -0F18 0021; -0F19 0021; -0F35 0021; -0F37 0021; -0F82 0021; -0F83 0021; -0F86 0021; -0F87 0021; -0FC6 0021; -180B 0021; -180C 0021; -180D 0021; -180E 0021; -200B 0021; -200C 0021; -200D 0021; -200E 0021; -200F 0021; -202A 0021; -202B 0021; -202C 0021; -202D 0021; -202E 0021; -206A 0021; -206B 0021; -206C 0021; -206D 0021; -206E 0021; -206F 0021; -D800 0021; -D801 0021; -D802 0021; -D803 0021; -D804 0021; -D805 0021; -D806 0021; -D807 0021; -D808 0021; -D809 0021; -D80A 0021; -D80B 0021; -D80C 0021; -D80D 0021; -D80E 0021; -D80F 0021; -D810 0021; -D811 0021; -D812 0021; -D813 0021; -D814 0021; -D815 0021; -D816 0021; -D817 0021; -D818 0021; -D819 0021; -D81A 0021; -D81B 0021; -D81C 0021; -D81D 0021; -D81E 0021; -D81F 0021; -D820 0021; -D821 0021; -D822 0021; -D823 0021; -D824 0021; -D825 0021; -D826 0021; -D827 0021; -D828 0021; -D829 0021; -D82A 0021; -D82B 0021; -D82C 0021; -D82D 0021; -D82E 0021; -D82F 0021; -D830 0021; -D831 0021; -D832 0021; -DFFF 0021; -FDD0 0021; -FDD1 0021; -FDD2 0021; -FDD3 0021; -FDD4 0021; -FDD5 0021; -FDD6 0021; -FDD7 0021; -FDD8 0021; -FDD9 0021; -FDDA 0021; -FDDB 0021; -FDDC 0021; -FDDD 0021; -FDDE 0021; -FDDF 0021; -FDE0 0021; -FDE1 0021; -FDE2 0021; -FDE3 0021; -FDE4 0021; -FDE5 0021; -FDE6 0021; -FDE7 0021; -FDE8 0021; -FDE9 0021; -FDEA 0021; -FDEB 0021; -FDEC 0021; -FDED 0021; -FDEE 0021; -FDEF 0021; -FEFF 0021; -FFF9 0021; -FFFA 0021; -FFFB 0021; -FFFE 0021; -FFFF 0021; -1D165 0021; -1D166 0021; -1D167 0021; -1D168 0021; -1D169 0021; -1D16D 0021; -1D16E 0021; -1D16F 0021; -1D170 0021; -1D171 0021; -1D172 0021; -1D173 0021; -1D174 0021; -1D175 0021; -1D176 0021; -1D177 0021; -1D178 0021; -1D179 0021; -1D17A 0021; -1D17B 0021; -1D17C 0021; -1D17D 0021; -1D17E 0021; -1D17F 0021; -1D180 0021; -1D181 0021; -1D182 0021; -1D185 0021; -1D186 0021; -1D187 0021; -1D188 0021; -1D189 0021; -1D18A 0021; -1D18B 0021; -1D1AA 0021; -1D1AB 0021; -1D1AC 0021; -1D1AD 0021; -1FFFE 0021; -1FFFF 0021; -2FFFE 0021; -2FFFF 0021; -3FFFE 0021; -3FFFF 0021; -4FFFE 0021; -4FFFF 0021; -5FFFE 0021; -5FFFF 0021; -6FFFE 0021; -6FFFF 0021; -7FFFE 0021; -7FFFF 0021; -8FFFE 0021; -8FFFF 0021; -9FFFE 0021; -9FFFF 0021; -AFFFE 0021; -AFFFF 0021; -BFFFE 0021; -BFFFF 0021; -CFFFE 0021; -CFFFF 0021; -DFFFE 0021; -DFFFF 0021; -E0001 0021; -E0020 0021; -E0021 0021; -E0022 0021; -E0023 0021; -E0024 0021; -E0025 0021; -E0026 0021; -E0027 0021; -E0028 0021; -E0029 0021; -E002A 0021; -E002B 0021; -E002C 0021; -E002D 0021; -E002E 0021; -E002F 0021; -E0030 0021; -E0031 0021; -E0032 0021; -E0033 0021; -E0034 0021; -E0035 0021; -E0036 0021; -E0037 0021; -E0038 0021; -E0039 0021; -E003A 0021; -E003B 0021; -E003C 0021; -E003D 0021; -E003E 0021; -E003F 0021; -E0040 0021; -E0041 0021; -E0042 0021; -E0043 0021; -E0044 0021; -E0045 0021; -E0046 0021; -E0047 0021; -E0048 0021; -E0049 0021; -E004A 0021; -E004B 0021; -E004C 0021; -E004D 0021; -E004E 0021; -E004F 0021; -E0050 0021; -E0051 0021; -E0052 0021; -E0053 0021; -E0054 0021; -E0055 0021; -E0056 0021; -E0057 0021; -E0058 0021; -E0059 0021; -E005A 0021; -E005B 0021; -E005C 0021; -E005D 0021; -E005E 0021; -E005F 0021; -E0060 0021; -E0061 0021; -E0062 0021; -E0063 0021; -E0064 0021; -E0065 0021; -E0066 0021; -E0067 0021; -E0068 0021; -E0069 0021; -E006A 0021; -E006B 0021; -E006C 0021; -E006D 0021; -E006E 0021; -E006F 0021; -E0070 0021; -E0071 0021; -E0072 0021; -E0073 0021; -E0074 0021; -E0075 0021; -E0076 0021; -E0077 0021; -270F 0021; -1807 0061; -2010 0061; -2011 0061; -2012 0061; -2013 0061; -FE32 0061; -2014 0061; -FE31 0061; -FE58 0061; -2015 0061; -301C 0061; -3030 0061; -30FB 0061; -FF65 0061; -002C 0061; -FE50 0061; -FF0C 0061; -055D 0061; -166D 00E1; -2190 00E1; -219A 00E1; -FFE9 00E1; -2192 00E1; -219B 00E1; -FFEB 00E1; -2191 00E1; -FFEA 00E1; -2193 00E1; -FFEC 00E1; -2194 00E1; -21AE 00E1; -2195 00E1; -2196 00E1; -2197 00E1; -2198 00E1; -2199 00E1; -219C 00E1; -219D 00E1; -219E 00E1; -219F 00E1; -21A0 00E1; -0733 0061; -0733 0041; -0733 00E1; -0734 0061; -0734 0041; -0734 00E1; -0735 0061; -0735 0041; -0735 00E1; -0736 0061; -0736 0041; -0736 00E1; -0737 0061; -0737 0041; -0737 00E1; -0738 0061; -0738 0041; -0738 00E1; -0739 0061; -0739 0041; -0739 00E1; -073A 0061; -073A 0041; -073A 00E1; -073B 0061; -073B 0041; -073B 00E1; -073C 0061; -073C 0041; -073C 00E1; -21E9 0062; -21EA 0062; -21EB 0062; -21EC 0062; -21ED 0062; -21EE 0062; -21EF 0062; -21F0 0062; -21F1 0062; -21F2 0062; -21F3 0062; -2200 0062; -2201 0062; -2202 0062; -1D6DB 0062; -1D715 0062; -1D74F 0062; -1D789 0062; -1D7C3 0062; -2203 0062; -2204 0062; -2205 0062; -2206 0062; -2207 0062; -1D6C1 0062; -1D6FB 0062; -1D735 0062; -1D76F 0062; -1D7A9 0062; -2208 0062; -2209 0062; -220A 0062; -220B 0062; -220C 0062; -220D 0062; -220E 0062; -220F 0062; -2210 0062; -2211 0062; -002B 0062; -207A 0062; -208A 0062; -FB29 0062; -FE62 0062; -FF0B 0062; -00B1 0062; -00F7 0062; -00D7 0062; -003C 0062; -226E 0062; -FE64 0062; -FF1C 0062; -003D 0062; -207C 0062; -208C 0062; -2260 0062; -FE66 0062; -FF1D 0062; -003E 0062; -226F 0062; -FE65 0062; -FF1E 0062; -00AC 0062; -FFE2 0062; -007C 0062; -FF5C 0062; -00A6 0062; -FFE4 0062; -2016 0062; -007E 0062; -FF5E 0062; -207B 0062; -208B 0062; -2212 0062; -2213 0062; -2214 0062; -2215 0062; -2216 0062; -2217 0062; -2218 0062; -2219 0062; -221A 0062; -221B 0062; -221C 0062; -221D 0062; -221E 0062; -221F 0062; -2220 0062; -2221 0062; -2222 0062; -2223 0062; -2224 0062; -2225 0062; -2226 0062; -2227 0062; -2228 0062; -2229 0062; -222A 0062; -222D 0062; -222C 0062; -222B 0062; -01E8 0334; -212A 0334 030C; -006B 0327 0334; -006B 0334 0327; -0137 0334; -004B 0327 0334; -004B 0334 0327; -0136 0334; -212A 0334 0327; -006B 0323 0334; -006B 0334 0323; -1E33 0334; -004B 0323 0334; -004B 0334 0323; -212A 0323 0334; -212A 0334 0323; -006B 0331 0334; -006B 0334 0331; -1E35 0334; -004B 0331 0334; -004B 0334 0331; -1E34 0334; -212A 0334 0331; -006B 0061; -006B 0041; -FF4B 0061; -FF4B 0041; -24A6 0061; -24A6 0041; -1D424 0061; -1D458 0061; -1D48C 0061; -1D4C0 0061; -1D4F4 0061; -1D528 0061; -1D55C 0061; -1D590 0061; -1D5C4 0061; -1D5F8 0061; -1D62C 0061; -1D660 0061; -1D694 0061; -1D424 0041; -1D458 0041; -1D48C 0041; -1D4C0 0041; -1D4F4 0041; -1D528 0041; -1D55C 0041; -1D590 0041; -1D5C4 0041; -1D5F8 0041; -1D62C 0041; -1D660 0041; -1D694 0041; -24DA 0061; -24DA 0041; -004B 0061; -212A 0061; -004B 0041; -212A 0041; -FF2B 0061; -FF2B 0041; -1D40A 0061; -1D43E 0061; -1D472 0061; -1D4A6 0061; -1D4DA 0061; -1D50E 0061; -1D542 0061; -1D576 0061; -1D5AA 0061; -1D5DE 0061; -1D612 0061; -1D646 0061; -1D67A 0061; -1D40A 0041; -1D43E 0041; -1D472 0041; -1D4A6 0041; -1D4DA 0041; -1D50E 0041; -1D542 0041; -1D576 0041; -1D5AA 0041; -1D5DE 0041; -1D612 0041; -1D646 0041; -1D67A 0041; -24C0 0061; -24C0 0041; -3384 0021; -006B 00E1; -FF4B 00E1; -24A6 00E1; -1D424 00E1; -1D458 00E1; -1D48C 00E1; -1D4C0 00E1; -1D4F4 00E1; -1D528 00E1; -1D55C 00E1; -1D590 00E1; -1D5C4 00E1; -1D5F8 00E1; -1D62C 00E1; -1D660 00E1; -1D694 00E1; -24DA 00E1; -004B 00E1; -212A 00E1; -FF2B 00E1; -1D40A 00E1; -1D43E 00E1; -1D472 00E1; -1D4A6 00E1; -1D4DA 00E1; -1D50E 00E1; -1D542 00E1; -1D576 00E1; -1D5AA 00E1; -1D5DE 00E1; -1D612 00E1; -1D646 00E1; -1D67A 00E1; -24C0 00E1; -1E31 0061; -1E31 0041; -1E30 0061; -1E30 0041; -1E31 00E1; -1E30 00E1; -01E9 0061; -01E9 0041; -01E8 0061; -01E8 0041; -01E9 00E1; -01E8 00E1; -0137 0061; -0137 0041; -0136 0061; -0136 0041; -0137 00E1; -0136 00E1; -1E33 0061; -1E33 0041; -1E32 0061; -1E32 0041; -1E33 00E1; -1E32 00E1; -1E35 0061; -1E35 0041; -1E34 0061; -1E34 0041; -1E35 00E1; -1E34 00E1; -3384 0061; -3384 0041; -3384 00E1; -3384 0062; -006B 0062; -FF4B 0062; -24A6 0062; -1D424 0062; -1D458 0062; -1D48C 0062; -1D4C0 0062; -1D4F4 0062; -1D528 0062; -1D55C 0062; -1D590 0062; -1D5C4 0062; -1D5F8 0062; -1D62C 0062; -1D660 0062; -1D694 0062; -24DA 0062; -004B 0062; -212A 0062; -FF2B 0062; -1D40A 0062; -1D43E 0062; -1D472 0062; -1D4A6 0062; -1D4DA 0062; -1D50E 0062; -1D542 0062; -1D576 0062; -1D5AA 0062; -1D5DE 0062; -1D612 0062; -1D646 0062; -1D67A 0062; -24C0 0062; -3385 0021; -1E31 0062; -1E30 0062; -01E9 0062; -01E8 0062; -0137 0062; -0136 0062; -1E33 0062; -1E32 0062; -1E35 0062; -1E34 0062; -3385 0061; -3385 0041; -3385 00E1; -3385 0062; -3389 0021; -3389 0061; -3389 0041; -3389 00E1; -3389 0062; -338F 0021; -338F 0061; -338F 0041; -338F 00E1; -338F 0062; -3391 0021; -3391 0061; -3391 0041; -3391 00E1; -3391 0062; -33CD 0021; -33CD 0061; -33CD 0041; -33CD 00E1; -33CD 0062; -3398 0021; -3398 0061; -3398 0041; -3398 00E1; -3398 0062; -339E 0021; -33CE 0021; -33A2 0021; -33A2 0061; -33A2 0041; -33A2 00E1; -33A2 0062; -33A6 0021; -33A6 0061; -33A6 0041; -33A6 00E1; -33A6 0062; -339E 0061; -339E 0041; -33CE 0061; -33CE 0041; -339E 00E1; -33CE 00E1; -339E 0062; -33CE 0062; -33AA 0021; -33AA 0061; -33AA 0041; -33AA 00E1; -33AA 0062; -33CF 0021; -33CF 0061; -33CF 0041; -33CF 00E1; -33CF 0062; -33B8 0021; -33B8 0061; -33B8 0041; -33B8 00E1; -33B8 0062; -33BE 0021; -33BE 0061; -33BE 0041; -33BE 00E1; -33BE 0062; -33C0 0021; -33C0 0061; -33C0 0041; -33C0 00E1; -33C0 0062; -0199 0021; -0198 0021; -0199 0061; -0199 0041; -0198 0061; -0198 0041; -0199 00E1; -0198 00E1; -0199 0062; -0198 0062; -029E 0021; -029E 0061; -029E 0041; -029E 00E1; -029E 0062; -006C 0021; -FF4C 0021; -24A7 0021; -217C 0021; -0140 0021; -2113 0021; -1D425 0021; -1D459 0021; -1D48D 0021; -1D4F5 0021; -1D529 0021; -1D55D 0021; -1D591 0021; -1D5C5 0021; -1D5F9 0021; -1D62D 0021; -1D661 0021; -1D695 0021; -24DB 0021; -004C 0021; -FF2C 0021; -216C 0021; -013F 0021; -2112 0021; -1D40B 0021; -1D43F 0021; -1D473 0021; -1D4DB 0021; -1D50F 0021; -1D543 0021; -1D577 0021; -1D5AB 0021; -1D5DF 0021; -1D613 0021; -1D647 0021; -1D67B 0021; -24C1 0021; -02E1 0021; -013A 0021; -0139 0021; -013E 0021; -013D 0021; -013C 0021; -013B 0021; -1E37 0021; -1E36 0021; -1E39 0021; -1E38 0021; -1E3D 0021; -1E3C 0021; -1E3B 0021; -1E3A 0021; -006C 0334 0301; -006C 0334 0341; -006C 0341 0334; -013A 0334; -004C 0301 0334; -004C 0334 0301; -004C 0341 0334; -0139 0334; -006C 030C 0334; -006C 0334 030C; -013E 0334; -004C 030C 0334; -004C 0334 030C; -013D 0334; -006C 0327 0334; -006C 0334 0327; -013C 0334; -004C 0327 0334; -004C 0334 0327; -013B 0334; -006C 0323 0334; -006C 0334 0323; -1E37 0334; -004C 0323 0334; -004C 0334 0323; -1E36 0334; -006C 0323 0304 0334; -006C 0334 0323 0304; -1E37 0304 0334; -1E39 0334; -004C 0304 0323 0334; -1E36 0304 0334; -1E36 0334 0304; -1E38 0334; -006C 032D 0334; -006C 0334 032D; -1E3D 0334; -004C 032D 0334; -004C 0334 032D; -1E3C 0334; -006C 0331 0334; -006C 0334 0331; -1E3B 0334; -004C 0331 0334; -004C 0334 0331; -1E3A 0334; -006C 0061; -006C 0041; -FF4C 0061; -FF4C 0041; -24A7 0061; -0140 0061; -217C 0061; -24A7 0041; -0140 0041; -217C 0041; -2113 0061; -1D425 0061; -1D459 0061; -1D48D 0061; -1D4F5 0061; -1D529 0061; -1D55D 0061; -1D591 0061; -1D5C5 0061; -1D5F9 0061; -1D62D 0061; -1D661 0061; -1D695 0061; -2113 0041; -1D425 0041; -1D459 0041; -1D48D 0041; -1D4F5 0041; -1D529 0041; -1D55D 0041; -1D591 0041; -1D5C5 0041; -1D5F9 0041; -1D62D 0041; -1D661 0041; -1D695 0041; -24DB 0061; -24DB 0041; -004C 0061; -004C 0041; -FF2C 0061; -FF2C 0041; -013F 0061; -216C 0061; -013F 0041; -216C 0041; -2112 0061; -1D40B 0061; -1D43F 0061; -1D473 0061; -1D4DB 0061; -1D50F 0061; -1D543 0061; -1D577 0061; -1D5AB 0061; -1D5DF 0061; -1D613 0061; -1D647 0061; -1D67B 0061; -2112 0041; -1D40B 0041; -1D43F 0041; -1D473 0041; -1D4DB 0041; -1D50F 0041; -1D543 0041; -1D577 0041; -1D5AB 0041; -1D5DF 0041; -1D613 0041; -1D647 0041; -1D67B 0041; -24C1 0061; -24C1 0041; -02E1 0061; -02E1 0041; -006C 00E1; -FF4C 00E1; -24A7 00E1; -0140 00E1; -217C 00E1; -2113 00E1; -1D425 00E1; -1D459 00E1; -1D48D 00E1; -1D4F5 00E1; -1D529 00E1; -1D55D 00E1; -1D591 00E1; -1D5C5 00E1; -1D5F9 00E1; -1D62D 00E1; -1D661 00E1; -1D695 00E1; -24DB 00E1; -004C 00E1; -FF2C 00E1; -013F 00E1; -216C 00E1; -2112 00E1; -1D40B 00E1; -1D43F 00E1; -1D473 00E1; -1D4DB 00E1; -1D50F 00E1; -1D543 00E1; -1D577 00E1; -1D5AB 00E1; -1D5DF 00E1; -1D613 00E1; -1D647 00E1; -1D67B 00E1; -24C1 00E1; -02E1 00E1; -013A 0061; -013A 0041; -0139 0061; -0139 0041; -013A 00E1; -0139 00E1; -013E 0061; -013E 0041; -013D 0061; -013D 0041; -013E 00E1; -013D 00E1; -013C 0061; -013C 0041; -013B 0061; -013B 0041; -013C 00E1; -013B 00E1; -1E37 0061; -1E37 0041; -1E36 0061; -1E36 0041; -1E37 00E1; -1E36 00E1; -1E39 0061; -1E39 0041; -1E38 0061; -1E38 0041; -1E39 00E1; -1E38 00E1; -1E3D 0061; -1E3D 0041; -1E3C 0061; -1E3C 0041; -1E3D 00E1; -1E3C 00E1; -1E3B 0061; -1E3B 0041; -1E3A 0061; -1E3A 0041; -1E3B 00E1; -1E3A 00E1; -006C 0062; -FF4C 0062; -24A7 0062; -0140 0062; -217C 0062; -2113 0062; -1D425 0062; -1D459 0062; -1D48D 0062; -1D4F5 0062; -1D529 0062; -1D55D 0062; -1D591 0062; -1D5C5 0062; -1D5F9 0062; -1D62D 0062; -1D661 0062; -1D695 0062; -24DB 0062; -004C 0062; -FF2C 0062; -013F 0062; -216C 0062; -2112 0062; -1D40B 0062; -1D43F 0062; -1D473 0062; -1D4DB 0062; -1D50F 0062; -1D543 0062; -1D577 0062; -1D5AB 0062; -1D5DF 0062; -1D613 0062; -1D647 0062; -1D67B 0062; -24C1 0062; -02E1 0062; -013A 0062; -0139 0062; -013E 0062; -013D 0062; -013C 0062; -013B 0062; -1E37 0062; -1E36 0062; -1E39 0062; -1E38 0062; -1E3D 0062; -1E3C 0062; -1E3B 0062; -1E3A 0062; -01C9 0021; -01C8 0021; -01C7 0021; -01C9 0061; -01C9 0041; -01C8 0061; -01C8 0041; -01C7 0061; -01C7 0041; -01C9 00E1; -01C8 00E1; -01C7 00E1; -01C9 0062; -01C8 0062; -01C7 0062; -33D0 0021; -33D0 0061; -33D0 0041; -33D0 00E1; -33D0 0062; -33D1 0021; -33D1 0061; -33D1 0041; -33D1 00E1; -33D1 0062; -33D2 0021; -33D2 0061; -33D2 0041; -33D2 00E1; -33D2 0062; -02AA 0021; -02AA 0061; -02AA 0041; -02AA 00E1; -02AA 0062; -33D3 0021; -33D3 0061; -33D3 0041; -33D3 00E1; -33D3 0062; -02AB 0021; -02AB 0061; -02AB 0041; -02AB 00E1; -02AB 0062; -029F 0021; -029F 0061; -029F 0041; -029F 00E1; -029F 0062; -0142 0021; -0141 0021; -0142 0061; -0142 0041; -0141 0061; -0141 0041; -0142 00E1; -0141 00E1; -0142 0062; -0141 0062; -019A 0021; -019A 0061; -019A 0041; -019A 00E1; -019A 0062; -026B 0021; -026B 0061; -026B 0041; -026B 00E1; -026B 0062; -026C 0021; -026C 0061; -026C 0041; -026C 00E1; -026C 0062; -026D 0021; -026D 0061; -026D 0041; -026D 00E1; -026D 0062; -026E 0021; -026E 0061; -026E 0041; -026E 00E1; -026E 0062; -019B 0021; -019B 0061; -019B 0041; -019B 00E1; -019B 0062; -028E 0021; -028E 0061; -028E 0041; -028E 00E1; -028E 0062; -006D 0021; -FF4D 0021; -24A8 0021; -217F 0021; -1D426 0021; -1D45A 0021; -1D48E 0021; -1D4C2 0021; -1D4F6 0021; -1D52A 0021; -1D55E 0021; -1D592 0021; -1D5C6 0021; -1D5FA 0021; -1D62E 0021; -1D662 0021; -1D696 0021; -24DC 0021; -004D 0021; -FF2D 0021; -216F 0021; -2133 0021; -1D40C 0021; -1D440 0021; -1D474 0021; -1D4DC 0021; -1D510 0021; -1D544 0021; -1D578 0021; -1D5AC 0021; -1D5E0 0021; -1D614 0021; -1D648 0021; -1D67C 0021; -24C2 0021; -1E3F 0021; -1E3E 0021; -1E41 0021; -1E40 0021; -1E43 0021; -1E42 0021; -006D 0301 0334; -006D 0334 0301; -006D 0341 0334; -1E3F 0334; -004D 0301 0334; -004D 0334 0301; -004D 0334 0341; -1E3E 0334; -006D 0307 0334; -006D 0334 0307; -1E41 0334; -004D 0307 0334; -004D 0334 0307; -1E40 0334; -006D 0323 0334; -006D 0334 0323; -1E43 0334; -004D 0323 0334; -004D 0334 0323; -1E42 0334; -33A1 0021; -33A1 0061; -33A1 0041; -33A1 00E1; -33A1 0062; -33A5 0021; -33A5 0061; -33A5 0041; -33A5 00E1; -33A5 0062; -006D 0061; -006D 0041; -FF4D 0061; -FF4D 0041; -24A8 0061; -217F 0061; -24A8 0041; -217F 0041; -1D426 0061; -1D45A 0061; -1D48E 0061; -1D4C2 0061; -1D4F6 0061; -1D52A 0061; -1D55E 0061; -1D592 0061; -1D5C6 0061; -1D5FA 0061; -1D62E 0061; -1D662 0061; -1D696 0061; -1D426 0041; -1D45A 0041; -1D48E 0041; -1D4C2 0041; -1D4F6 0041; -1D52A 0041; -1D55E 0041; -1D592 0041; -1D5C6 0041; -1D5FA 0041; -1D62E 0041; -1D662 0041; -1D696 0041; -24DC 0061; -24DC 0041; -004D 0061; -004D 0041; -FF2D 0061; -FF2D 0041; -216F 0061; -216F 0041; -2133 0061; -1D40C 0061; -1D440 0061; -1D474 0061; -1D4DC 0061; -1D510 0061; -1D544 0061; -1D578 0061; -1D5AC 0061; -1D5E0 0061; -1D614 0061; -1D648 0061; -1D67C 0061; -2133 0041; -1D40C 0041; -1D440 0041; -1D474 0041; -1D4DC 0041; -1D510 0041; -1D544 0041; -1D578 0041; -1D5AC 0041; -1D5E0 0041; -1D614 0041; -1D648 0041; -1D67C 0041; -24C2 0061; -24C2 0041; -3383 0021; -006D 00E1; -FF4D 00E1; -24A8 00E1; -217F 00E1; -1D426 00E1; -1D45A 00E1; -1D48E 00E1; -1D4C2 00E1; -1D4F6 00E1; -1D52A 00E1; -1D55E 00E1; -1D592 00E1; -1D5C6 00E1; -1D5FA 00E1; -1D62E 00E1; -1D662 00E1; -1D696 00E1; -24DC 00E1; -004D 00E1; -FF2D 00E1; -216F 00E1; -2133 00E1; -1D40C 00E1; -1D440 00E1; -1D474 00E1; -1D4DC 00E1; -1D510 00E1; -1D544 00E1; -1D578 00E1; -1D5AC 00E1; -1D5E0 00E1; -1D614 00E1; -1D648 00E1; -1D67C 00E1; -24C2 00E1; -1E3F 0061; -1E3F 0041; -1E3E 0061; -1E3E 0041; -1E3F 00E1; -1E3E 00E1; -1E41 0061; -1E41 0041; -1E40 0061; -1E40 0041; -1E41 00E1; -1E40 00E1; -1E43 0061; -1E43 0041; -1E42 0061; -1E42 0041; -1E43 00E1; -1E42 00E1; -3383 0061; -3383 0041; -3383 00E1; -3383 0062; -006D 0062; -FF4D 0062; -24A8 0062; -217F 0062; -1D426 0062; -1D45A 0062; -1D48E 0062; -1D4C2 0062; -1D4F6 0062; -1D52A 0062; -1D55E 0062; -1D592 0062; -1D5C6 0062; -1D5FA 0062; -1D62E 0062; -1D662 0062; -1D696 0062; -24DC 0062; -004D 0062; -FF2D 0062; -216F 0062; -2133 0062; -1D40C 0062; -1D440 0062; -1D474 0062; -1D4DC 0062; -1D510 0062; -1D544 0062; -1D578 0062; -1D5AC 0062; -1D5E0 0062; -1D614 0062; -1D648 0062; -1D67C 0062; -24C2 0062; -33D4 0021; -3386 0021; -1E3F 0062; -1E3E 0062; -1E41 0062; -1E40 0062; -1E43 0062; -1E42 0062; -33D4 0061; -33D4 0041; -3386 0061; -3386 0041; -33D4 00E1; -3386 00E1; -33D4 0062; -3386 0062; -338E 0021; -338E 0061; -338E 0041; -338E 00E1; -338E 0062; -3392 0021; -3392 0061; -3392 0041; -3392 00E1; -3392 0062; -33D5 0021; -33D5 0061; -33D5 0041; -33D5 00E1; -33D5 0062; -3396 0021; -3396 0061; -3396 0041; -3396 00E1; -3396 0062; -339C 0021; -339F 0021; -339F 0061; -339F 0041; -339F 00E1; -339F 0062; -33A3 0021; -33A3 0061; -33A3 0041; -33A3 00E1; -33A3 0062; -339C 0061; -339C 0041; -339C 00E1; -339C 0062; -33D6 0021; -33D6 0061; -33D6 0041; -33D6 00E1; -33D6 0062; -33AB 0021; -33AB 0061; -33AB 0041; -33AB 00E1; -33AB 0062; -33B3 0021; -33A7 0021; -33A8 0021; -33A8 0061; -33A8 0041; -33A8 00E1; -33A8 0062; -33B3 0061; -33B3 0041; -33A7 0061; -33A7 0041; -33B3 00E1; -33A7 00E1; -33B3 0062; -33A7 0062; -33B7 0021; -33B9 0021; -33B7 0061; -33B7 0041; -33B9 0061; -33B9 0041; -33B7 00E1; -33B9 00E1; -33B7 0062; -33B9 0062; -33BD 0021; -33BF 0021; -33BD 0061; -33BD 0041; -33BF 0061; -33BF 0041; -33BD 00E1; -33BF 00E1; -33BD 0062; -33BF 0062; -33C1 0021; -33C1 0061; -33C1 0041; -33C1 00E1; -33C1 0062; -0271 0021; -0271 0061; -0271 0041; -0271 00E1; -0271 0062; -006E 0021; -FF4E 0021; -24A9 0021; -1D427 0021; -1D45B 0021; -1D48F 0021; -1D4C3 0021; -1D4F7 0021; -1D52B 0021; -1D55F 0021; -1D593 0021; -1D5C7 0021; -1D5FB 0021; -1D62F 0021; -1D663 0021; -1D697 0021; -24DD 0021; -004E 0021; -FF2E 0021; -2115 0021; -1D40D 0021; -1D441 0021; -1D475 0021; -1D4A9 0021; -1D4DD 0021; -1D511 0021; -1D579 0021; -1D5AD 0021; -1D5E1 0021; -1D615 0021; -1D649 0021; -1D67D 0021; -24C3 0021; -207F 0021; -0144 0021; -0143 0021; -01F9 0021; -01F8 0021; -0148 0021; -0147 0021; -00F1 0021; -00D1 0021; -1E45 0021; -1E44 0021; -0146 0021; -0145 0021; -1E47 0021; -1E46 0021; -1E4B 0021; -1E4A 0021; -1E49 0021; -1E48 0021; -006E 0301 0334; -006E 0334 0301; -006E 0334 0341; -0144 0334; -004E 0301 0334; -004E 0334 0301; -004E 0341 0334; -0143 0334; -006E 0300 0334; -006E 0334 0300; -006E 0334 0340; -01F9 0334; -004E 0300 0334; -004E 0334 0340; -004E 0340 0334; -01F8 0334; -006E 030C 0334; -006E 0334 030C; -0148 0334; -004E 030C 0334; -004E 0334 030C; -0147 0334; -006E 0303 0334; -006E 0334 0303; -00F1 0334; -004E 0303 0334; -004E 0334 0303; -00D1 0334; -006E 0307 0334; -006E 0334 0307; -1E45 0334; -004E 0307 0334; -004E 0334 0307; -1E44 0334; -006E 0327 0334; -006E 0334 0327; -0146 0334; -004E 0327 0334; -004E 0334 0327; -0145 0334; -006E 0323 0334; -006E 0334 0323; -1E47 0334; -004E 0323 0334; -004E 0334 0323; -1E46 0334; -006E 032D 0334; -006E 0334 032D; -1E4B 0334; -004E 032D 0334; -004E 0334 032D; -1E4A 0334; -006E 0331 0334; -006E 0334 0331; -1E49 0334; -004E 0331 0334; -004E 0334 0331; -1E48 0334; -006E 0061; -006E 0041; -FF4E 0061; -FF4E 0041; -24A9 0061; -24A9 0041; -1D427 0061; -1D45B 0061; -1D48F 0061; -1D4C3 0061; -1D4F7 0061; -1D52B 0061; -1D55F 0061; -1D593 0061; -1D5C7 0061; -1D5FB 0061; -1D62F 0061; -1D663 0061; -1D697 0061; -1D427 0041; -1D45B 0041; -1D48F 0041; -1D4C3 0041; -1D4F7 0041; -1D52B 0041; -1D55F 0041; -1D593 0041; -1D5C7 0041; -1D5FB 0041; -1D62F 0041; -1D663 0041; -1D697 0041; -24DD 0061; -24DD 0041; -004E 0061; -004E 0041; -FF2E 0061; -FF2E 0041; -2115 0061; -1D40D 0061; -1D441 0061; -1D475 0061; -1D4A9 0061; -1D4DD 0061; -1D511 0061; -1D579 0061; -1D5AD 0061; -1D5E1 0061; -1D615 0061; -1D649 0061; -1D67D 0061; -2115 0041; -1D40D 0041; -1D441 0041; -1D475 0041; -1D4A9 0041; -1D4DD 0041; -1D511 0041; -1D579 0041; -1D5AD 0041; -1D5E1 0041; -1D615 0041; -1D649 0041; -1D67D 0041; -24C3 0061; -24C3 0041; -207F 0061; -207F 0041; -3381 0021; -006E 00E1; -FF4E 00E1; -24A9 00E1; -1D427 00E1; -1D45B 00E1; -1D48F 00E1; -1D4C3 00E1; -1D4F7 00E1; -1D52B 00E1; -1D55F 00E1; -1D593 00E1; -1D5C7 00E1; -1D5FB 00E1; -1D62F 00E1; -1D663 00E1; -1D697 00E1; -24DD 00E1; -004E 00E1; -FF2E 00E1; -2115 00E1; -1D40D 00E1; -1D441 00E1; -1D475 00E1; -1D4A9 00E1; -1D4DD 00E1; -1D511 00E1; -1D579 00E1; -1D5AD 00E1; -1D5E1 00E1; -1D615 00E1; -1D649 00E1; -1D67D 00E1; -24C3 00E1; -207F 00E1; -0144 0061; -0144 0041; -0143 0061; -0143 0041; -0144 00E1; -0143 00E1; -01F9 0061; -01F9 0041; -01F8 0061; -01F8 0041; -01F9 00E1; -01F8 00E1; -0148 0061; -0148 0041; -0147 0061; -0147 0041; -0148 00E1; -0147 00E1; -00F1 0061; -00F1 0041; -00D1 0061; -00D1 0041; -00F1 00E1; -00D1 00E1; -1E45 0061; -1E45 0041; -1E44 0061; -1E44 0041; -1E45 00E1; -1E44 00E1; -0146 0061; -0146 0041; -0145 0061; -0145 0041; -0146 00E1; -0145 00E1; -1E47 0061; -1E47 0041; -1E46 0061; -1E46 0041; -1E47 00E1; -1E46 00E1; -1E4B 0061; -1E4B 0041; -1E4A 0061; -1E4A 0041; -1E4B 00E1; -1E4A 00E1; -1E49 0061; -1E49 0041; -1E48 0061; -1E48 0041; -1E49 00E1; -1E48 00E1; -3381 0061; -3381 0041; -3381 00E1; -3381 0062; -006E 0062; -FF4E 0062; -24A9 0062; -1D427 0062; -1D45B 0062; -1D48F 0062; -1D4C3 0062; -1D4F7 0062; -1D52B 0062; -1D55F 0062; -1D593 0062; -1D5C7 0062; -1D5FB 0062; -1D62F 0062; -1D663 0062; -1D697 0062; -24DD 0062; -004E 0062; -FF2E 0062; -2115 0062; -1D40D 0062; -1D441 0062; -1D475 0062; -1D4A9 0062; -1D4DD 0062; -1D511 0062; -1D579 0062; -1D5AD 0062; -1D5E1 0062; -1D615 0062; -1D649 0062; -1D67D 0062; -24C3 0062; -207F 0062; -0144 0062; -0143 0062; -01F9 0062; -01F8 0062; -0148 0062; -0147 0062; -00F1 0062; -00D1 0062; -1E45 0062; -1E44 0062; -0146 0062; -0145 0062; -1E47 0062; -1E46 0062; -1E4B 0062; -1E4A 0062; -1E49 0062; -1E48 0062; -338B 0021; -338B 0061; -338B 0041; -338B 00E1; -338B 0062; -01CC 0021; -01CB 0021; -01CA 0021; -01CC 0061; -01CC 0041; -01CB 0061; -01CB 0041; -01CA 0061; -01CA 0041; -01CC 00E1; -01CB 00E1; -01CA 00E1; -01CC 0062; -01CB 0062; -01CA 0062; -339A 0021; -339A 0061; -339A 0041; -339A 00E1; -339A 0062; -2116 0021; -2116 0061; -2116 0041; -2116 00E1; -2116 0062; -33B1 0021; -33B1 0061; -33B1 0041; -33B1 00E1; -33B1 0062; -33B5 0021; -33B5 0061; -33B5 0041; -33B5 00E1; -33B5 0062; -33BB 0021; -33BB 0061; -33BB 0041; -33BB 00E1; -33BB 0062; -0274 0021; -0274 0061; -0274 0041; -0274 00E1; -0274 0062; -0272 0021; -019D 0021; -0272 0061; -0272 0041; -019D 0061; -019D 0041; -0272 00E1; -019D 00E1; -0272 0062; -019D 0062; -019E 0021; -019E 0061; -019E 0041; -019E 00E1; -019E 0062; -0273 0021; -0273 0061; -0273 0041; -0273 00E1; -0273 0062; -014B 0021; -014A 0021; -014B 0061; -014B 0041; -014A 0061; -014A 0041; -014B 00E1; -014A 00E1; -1D650 0061; -1D684 0061; -1D414 0041; -1D448 0041; -1D47C 0041; -1D4B0 0041; -1D4E4 0041; -1D518 0041; -1D54C 0041; -1D580 0041; -1D5B4 0041; -1D5E8 0041; -1D61C 0041; -1D650 0041; -1D684 0041; -24CA 0061; -24CA 0041; -0075 00E1; -FF55 00E1; -24B0 00E1; -1D42E 00E1; -1D462 00E1; -1D496 00E1; -1D4CA 00E1; -1D4FE 00E1; -1D532 00E1; -1D566 00E1; -1D59A 00E1; -1D5CE 00E1; -1D602 00E1; -1D636 00E1; -1D66A 00E1; -1D69E 00E1; -24E4 00E1; -0055 00E1; -FF35 00E1; -1D414 00E1; -1D448 00E1; -1D47C 00E1; -1D4B0 00E1; -1D4E4 00E1; -1D518 00E1; -1D54C 00E1; -1D580 00E1; -1D5B4 00E1; -1D5E8 00E1; -1D61C 00E1; -1D650 00E1; -1D684 00E1; -24CA 00E1; -00FA 0061; -00FA 0041; -00DA 0061; -00DA 0041; -00FA 00E1; -00DA 00E1; -00F9 0061; -00F9 0041; -00D9 0061; -00D9 0041; -00F9 00E1; -00D9 00E1; -016D 0061; -016D 0041; -016C 0061; -016C 0041; -016D 00E1; -016C 00E1; -00FB 0061; -00FB 0041; -00DB 0061; -00DB 0041; -00FB 00E1; -00DB 00E1; -01D4 0061; -01D4 0041; -01D3 0061; -01D3 0041; -01D4 00E1; -01D3 00E1; -016F 0061; -016F 0041; -016E 0061; -016E 0041; -016F 00E1; -016E 00E1; -00FC 0061; -00FC 0041; -00DC 0061; -00DC 0041; -00FC 00E1; -00DC 00E1; -01D8 0061; -01D8 0041; -01D7 0061; -01D7 0041; -01D8 00E1; -01D7 00E1; -01DC 0061; -01DC 0041; -01DB 0061; -01DB 0041; -01DC 00E1; -01DB 00E1; -01DA 0061; -01DA 0041; -01D9 0061; -01D9 0041; -01DA 00E1; -01D9 00E1; -01D6 0061; -01D6 0041; -01D5 0061; -01D5 0041; -01D6 00E1; -01D5 00E1; -0171 0061; -0171 0041; -0170 0061; -0170 0041; -0171 00E1; -0170 00E1; -0169 0061; -0169 0041; -0168 0061; -0168 0041; -0169 00E1; -0168 00E1; -1E79 0061; -1E79 0041; -1E78 0061; -1E78 0041; -1E79 00E1; -1E78 00E1; -0173 0061; -0173 0041; -0172 0061; -0172 0041; -0173 00E1; -0172 00E1; -016B 0061; -016B 0041; -016A 0061; -016A 0041; -016B 00E1; -016A 00E1; -1E7B 0061; -1E7B 0041; -1E7A 0061; -1E7A 0041; -03B7 0341 0334; -0397 0301 0334; -0397 0334 0341; -0397 0341 0334; -1FCB 0334; -03B7 0334 0341 0345; -03B7 0345 0334 0341; -1F75 0334 0345; -1FC3 0341 0334; -03B7 0300 0334; -03B7 0334 0300; -03B7 0334 0340; -1F74 0334; -0397 0334 0300; -0397 0334 0340; -0397 0340 0334; -1FCA 0334; -03B7 0340 0334 0345; -03B7 0340 0345 0334; -03B7 0345 0334 0340; -1FC2 0334; -03B7 0334 0342; -03B7 0342 0334; -1FC6 0334; -03B7 0342 0345 0334; -03B7 0345 0334 0342; -03B7 0345 0342 0334; -1FC3 0334 0342; -03B7 0334 0345; -03B7 0345 0334; -1FC3 0334; -0397 0334 0345; -0397 0345 0334; -1FCC 0334; -1FC3 0021; -1FCC 0021; -03B7 0061; -03B7 0041; -1D6C8 0061; -1D702 0061; -1D73C 0061; -1D776 0061; -1D7B0 0061; -1D6C8 0041; -1D702 0041; -1D73C 0041; -1D776 0041; -1D7B0 0041; -0397 0061; -0397 0041; -1D6AE 0061; -1D6E8 0061; -1D722 0061; -1D75C 0061; -1D796 0061; -1D6AE 0041; -1D6E8 0041; -1D722 0041; -1D75C 0041; -1D796 0041; -03B7 00E1; -1D6C8 00E1; -1D702 00E1; -1D73C 00E1; -1D776 00E1; -1D7B0 00E1; -0397 00E1; -1D6AE 00E1; -1D6E8 00E1; -1D722 00E1; -1D75C 00E1; -1D796 00E1; -1F20 0061; -1F20 0041; -1F28 0061; -1F28 0041; -1F20 00E1; -1F28 00E1; -1F24 0061; -1F24 0041; -1F2C 0061; -1F2C 0041; -1F24 00E1; -1F2C 00E1; -1F94 0061; -1F94 0041; -1F9C 0061; -1F9C 0041; -1F94 00E1; -1F9C 00E1; -1F22 0061; -1F22 0041; -1F2A 0061; -1F2A 0041; -1F22 00E1; -1F2A 00E1; -1F92 0061; -1F92 0041; -1F9A 0061; -1F9A 0041; -03C0 0062; -03D6 0062; -1D6D1 0062; -1D6E1 0062; -1D70B 0062; -1D71B 0062; -1D745 0062; -1D755 0062; -1D77F 0062; -1D78F 0062; -1D7B9 0062; -1D7C9 0062; -03A0 0062; -1D6B7 0062; -1D6F1 0062; -1D72B 0062; -1D765 0062; -1D79F 0062; -03DF 0021; -03DE 0021; -03DF 0061; -03DF 0041; -03DE 0061; -03DE 0041; -03DF 00E1; -03DE 00E1; -03DF 0062; -03DE 0062; -03C1 0021; -03F1 0021; -1D6D2 0021; -1D6E0 0021; -1D70C 0021; -1D71A 0021; -1D746 0021; -1D754 0021; -1D780 0021; -1D78E 0021; -1D7BA 0021; -1D7C8 0021; -03A1 0021; -1D6B8 0021; -1D6F2 0021; -1D72C 0021; -1D766 0021; -1D7A0 0021; -1FE4 0021; -1FE5 0021; -1FEC 0021; -03C1 0313 0334; -03C1 0334 0313; -03C1 0334 0343; -1FE4 0334; -03C1 0314 0334; -03C1 0334 0314; -1FE5 0334; -03A1 0314 0334; -03A1 0334 0314; -1FEC 0334; -03C1 0061; -03C1 0041; -03F1 0061; -03F1 0041; -1D6D2 0061; -1D6E0 0061; -1D70C 0061; -1D71A 0061; -1D746 0061; -1D754 0061; -1D780 0061; -1D78E 0061; -1D7BA 0061; -1D7C8 0061; -1D6D2 0041; -1D6E0 0041; -1D70C 0041; -1D71A 0041; -1D746 0041; -1D754 0041; -1D780 0041; -1D78E 0041; -1D7BA 0041; -1D7C8 0041; -03A1 0061; -03A1 0041; -1D6B8 0061; -1D6F2 0061; -1D72C 0061; -1D766 0061; -1D7A0 0061; -1D6B8 0041; -1D6F2 0041; -1D72C 0041; -1D766 0041; -1D7A0 0041; -03C1 00E1; -03F1 00E1; -1D6D2 00E1; -1D6E0 00E1; -1D70C 00E1; -FB4C 0334; -FB31 0021; -FB4C 0021; -05D1 0061; -05D1 0041; -2136 0061; -2136 0041; -05D1 00E1; -2136 00E1; -FB31 0061; -FB31 0041; -FB31 00E1; -FB4C 0061; -FB4C 0041; -FB4C 00E1; -05D1 0062; -2136 0062; -FB31 0062; -FB4C 0062; -05D2 0021; -2137 0021; -05D2 0334 05BC; -05D2 05BC 0334; -FB32 0334; -FB32 0021; -05D2 0061; -05D2 0041; -2137 0061; -2137 0041; -05D2 00E1; -2137 00E1; -FB32 0061; -FB32 0041; -FB32 00E1; -05D2 0062; -2137 0062; -FB32 0062; -05D3 0021; -2138 0021; -FB22 0021; -05D3 0334 05BC; -05D3 05BC 0334; -FB33 0334; -FB33 0021; -05D3 0061; -05D3 0041; -2138 0061; -2138 0041; -FB22 0061; -FB22 0041; -05D3 00E1; -2138 00E1; -FB22 00E1; -FB33 0061; -FB33 0041; -FB33 00E1; -05D3 0062; -2138 0062; -FB22 0062; -FB33 0062; -05D4 0021; -FB23 0021; -05D4 0334 05BC; -05D4 05BC 0334; -FB34 0334; -FB34 0021; -05D4 0061; -05D4 0041; -FB23 0061; -FB23 0041; -05D4 00E1; -FB23 00E1; -FB34 0061; -FB34 0041; -FB34 00E1; -05D4 0062; -FB23 0062; -FB34 0062; -05D5 0021; -05D5 0334 05B9; -05D5 05B9 0334; -FB4B 0334; -05D5 0334 05BC; -05D5 05BC 0334; -FB35 0334; -FB4B 0021; -FB35 0021; -05D5 0061; -05D5 0041; -05D5 00E1; -FB4B 0061; -FB4B 0041; -FB4B 00E1; -FB35 0061; -FB35 0041; -FB35 00E1; -05D5 0062; -FB4B 0062; -FB35 0062; -05F0 0021; -120C 00E1; -120C 0062; -120D 0021; -120D 0061; -120D 0041; -120D 00E1; -120D 0062; -120E 0021; -120E 0061; -120E 0041; -120E 00E1; -120E 0062; -120F 0021; -120F 0061; -120F 0041; -120F 00E1; -120F 0062; -1210 0021; -1210 0061; -1210 0041; -1210 00E1; -1210 0062; -1211 0021; -1211 0061; -1211 0041; -1211 00E1; -1211 0062; -1212 0021; -1212 0061; -1212 0041; -1212 00E1; -1212 0062; -1213 0021; -1213 0061; -1213 0041; -1213 00E1; -1213 0062; -1214 0021; -1214 0061; -1214 0041; -1214 00E1; -1214 0062; -1215 0021; -1215 0061; -1215 0041; -1215 00E1; -1215 0062; -1216 0021; -1216 0061; -1216 0041; -1216 00E1; -1216 0062; -1217 0021; -1217 0061; -1217 0041; -1217 00E1; -1217 0062; -1218 0021; -1218 0061; -1218 0041; -1218 00E1; -1218 0062; -1219 0021; -1219 0061; -1219 0041; -1219 00E1; -1219 0062; -121A 0021; -121A 0061; -121A 0041; -121A 00E1; -121A 0062; -121B 0021; -121B 0061; -121B 0041; -121B 00E1; -121B 0062; -121C 0021; -121C 0061; -121C 0041; -121C 00E1; -121C 0062; -121D 0021; -121D 0061; -121D 0041; -121D 00E1; -121D 0062; -121E 0021; -121E 0061; -121E 0041; -121E 00E1; -121E 0062; -121F 0021; -121F 0061; -121F 0041; -121F 00E1; -121F 0062; -1220 0021; -1220 0061; -1220 0041; -3061 00E1; -30C1 00E1; -FF81 00E1; -32E0 00E1; -3062 0061; -3062 0041; -30C2 0061; -30C2 0041; -3062 00E1; -30C2 00E1; -3061 0062; -30C1 0062; -FF81 0062; -32E0 0062; -3062 0062; -30C2 0062; -3063 0021; -3064 0021; -30C3 0021; -FF6F 0021; -30C4 0021; -FF82 0021; -32E1 0021; -3064 0334 3099; -3064 3099 0334; -3065 0334; -30C4 0334 3099; -30C4 3099 0334; -30C5 0334; -3065 0021; -30C5 0021; -3063 0061; -3063 0041; -3064 0061; -3064 0041; -30C3 0061; -30C3 0041; -FF6F 0061; -FF6F 0041; -30C4 0061; -30C4 0041; -FF82 0061; -FF82 0041; -32E1 0061; -32E1 0041; -3063 00E1; -3064 00E1; -30C3 00E1; -FF6F 00E1; -30C4 00E1; -FF82 00E1; -32E1 00E1; -3065 0061; -3065 0041; -30C5 0061; -30C5 0041; -3065 00E1; -30C5 00E1; -3063 0062; -3064 0062; -30C3 0062; -FF6F 0062; -30C4 0062; -FF82 0062; -32E1 0062; -3065 0062; -30C5 0062; -3066 0021; -30C6 0021; -FF83 0021; -32E2 0021; -3066 0334 3099; -3066 3099 0334; -3067 0334; -30C6 0334 3099; -30C6 3099 0334; -30C7 0334; -3067 0021; -30C7 0021; -3066 0061; -3066 0041; -30C6 0061; -30C6 0041; -FF83 0061; -FF83 0041; -32E2 0061; -32E2 0041; -3066 00E1; -30C6 00E1; -FF83 00E1; -32E2 00E1; -3067 0061; -3067 0041; -30C7 0061; -30C7 0041; -3067 00E1; -30C7 00E1; -3066 0062; -30C6 0062; -FF83 0062; -32E2 0062; -3067 0062; -30C7 0062; -3325 0021; -337F 00E1; -337F 0062; -2F8E1 0021; -2F8E1 0061; -2F8E1 0041; -2F8E1 00E1; -2F8E1 0062; -F97A 0021; -F97A 0061; -F97A 0041; -F97A 00E1; -F97A 0062; -FA44 0021; -2F8E2 0021; -FA44 0061; -2F8E2 0061; -FA44 0041; -2F8E2 0041; -FA44 00E1; -2F8E2 00E1; -FA44 0062; -2F8E2 0062; -2F8E4 0021; -2F8E4 0061; -2F8E4 0041; -2F8E4 00E1; -2F8E4 0062; -F9E2 0021; -F9E2 0061; -F9E2 0041; -F9E2 00E1; -F9E2 0062; -2F8E6 0021; -2F8E6 0061; -2F8E6 0041; -2F8E6 00E1; -2F8E6 0062; -2F8E8 0021; -2F8E8 0061; -2F8E8 0041; -2F8E8 00E1; -2F8E8 0062; -2F8E9 0021; -2F8E9 0061; -2F8E9 0041; -2F8E9 00E1; -2F8E9 0062; -2F8EA 0021; -2F8EA 0061; -2F8EA 0041; -2F8EA 00E1; -2F8EA 0062; -F914 0021; -F95C 0021; -F9BF 0021; -F914 0061; -F95C 0061; -F9BF 0061; -F914 0041; -F95C 0041; -F9BF 0041; -F914 00E1; -F95C 00E1; -F9BF 00E1; -F914 0062; -F95C 0062; -F9BF 0062; -F94C 0021; -F94C 0061; -F94C 0041; -F94C 00E1; -F94C 0062; -2F8EB 0021; -2F8EB 0061; -2F8EB 0041; -2F8EB 00E1; -2F8EB 0062; -F931 0021; -F931 0061; -F931 0041; -F931 00E1; -F931 0062; -2F8ED 0021; -2F8ED 0061; -2F8ED 0041; -2F8ED 00E1; -2F8ED 0062; -F91D 0021; -F91D 0061; -F91D 0041; -F91D 00E1; -F91D 0062; -2F4B 0021; -2F4B 0061; -2F4B 0041; -2F4B 00E1; -2F4B 0062; -2F8EF 0021; -2F8EF 0061; -2F8EF 0041; -2F8EF 00E1; -2F8EF 0062; -2F8F1 0021; -2F8F1 0061; -2F8F1 0041; -2F8F1 00E1; -2F8F1 0062; -2F4C 0021; -2F4C 0061; -2F4C 0041; -2F4C 00E1; -2F4C 0062; -32A3 0021; -32A3 0061; -32A3 0041; -32A3 00E1; -32A3 0062; -2F8F3 0021; -2F8F3 0061; -2F8F3 0041; -2F8F3 00E1; -2F8F3 0062; -F98C 0021; -F98C 0061; -F98C 0041; -F98C 00E1; -F98C 0062; -2F4D 0021; -2F4D 0061; -2F4D 0041; -2F4D 00E1; -2F4D 0062; -2E9E 0021; -2E9E 0061; -2E9E 0041; -2E9E 00E1; -2E9E 0062; -2F8F4 0021; -2F8F4 0061; -2F8F4 0041; -2F8F4 00E1; -2F8F4 0062; -F9A5 0021; -F9A5 0061; -F9A5 0041; -F9A5 00E1; -F9A5 0062; -2F4E 0021; -2F4E 0061; -2F4E 0041; -2F4E 00E1; -2F4E 0062; -F970 0021; -10FFFA 0041; -10FFFA 00E1; -10FFFA 0062; -10FFFB 0021; -10FFFB 0061; -10FFFB 0041; -10FFFB 00E1; -10FFFB 0062; -10FFFC 0021; -10FFFC 0061; -10FFFC 0041; -10FFFC 00E1; -10FFFC 0062; -10FFFD 0021; -10FFFD 0061; -10FFFD 0041; -10FFFD 00E1; -10FFFD 0062; +202F 003F; 202F +00A8 0342 0334; 00A8 0342 +1FDD 0021; 1FDD +2010 003F; 2010 +FF64 0021; FF64 +1366 0021; 1366 +0087 0021; 0087 +05A8 0021; 05A8 +0F87 0021; 0F87 +FE0B 0021; FE0B +1D1AC 0021; 1D1AC +E0035 0021; E0035 +E0067 0021; E0067 +E0119 0021; E0119 +E014B 0021; E014B +E017D 0021; E017D +E01AF 0021; E01AF +E01E1 0021; E01E1 +0014 003F; 0014 +0594 003F; 0594 +06E1 003F; 06E1 +D805 003F; D805 +1D179 003F; 1D179 +E0022 003F; E0022 +E0054 003F; E0054 +E0106 003F; E0106 +E0138 003F; E0138 +E016A 003F; E016A +E019C 003F; E019C +E01CE 003F; E01CE +055E 0021; 055E +0964 0021; 0964 +201C 0021; 201C +FF3D 0021; FF3D +2986 003F; 2986 +300A 0021; 300A +3017 0021; 3017 +FF3C 0021; FF3C +2032 0021; 2032 +070A 0021; 070A +0F85 0021; 0F85 +02CC 0021; 02CC +02F3 0021; 02F3 +0BF7 0021; 0BF7 +0FC1 0021; 0FC1 +19ED 0021; 19ED +211F 0021; 211F +2194 0338 0334; 2194 0338 +21AD 0021; 21AD +21C7 0021; 21C7 +21DD 0021; 21DD +21F6 0021; 21F6 +1D76F 0021; 1D76F +00F7 0021; 00F7 +00A6 0021; 00A6 +2223 0021; 2223 +223A 0021; 223A +224D 003F; 224D +2264 003F; 2264 +227A 003F; 227A +228B 0021; 228B +22A0 0021; 22A0 +22B3 0338 0334; 22B3 0338 +22C6 0021; 22C6 +22DF 0021; 22DF +2300 0021; 2300 +2319 0021; 2319 +2334 0021; 2334 +234D 0021; 234D +2366 0021; 2366 +237F 0021; 237F +2398 0021; 2398 +23B1 0021; 23B1 +23CA 0021; 23CA +2412 0021; 2412 +2444 0021; 2444 +2511 0021; 2511 +252A 0021; 252A +2543 0021; 2543 +255C 0021; 255C +2575 0021; 2575 +258E 0021; 258E +25A6 0021; 25A6 +25BF 0021; 25BF +25D7 0021; 25D7 +25F0 0021; 25F0 +2609 0021; 2609 +2623 0021; 2623 +2644 0021; 2644 +265D 0021; 265D +2679 0021; 2679 +2708 0021; 2708 +2723 0021; 2723 +273D 0021; 273D +275C 0021; 275C +2798 0021; 2798 +27B2 0021; 27B2 +27DC 0021; 27DC +27F9 0021; 27F9 +2912 0021; 2912 +292B 0021; 292B +2944 0021; 2944 +295D 0021; 295D +2976 0021; 2976 +29A5 0021; 29A5 +29BE 0021; 29BE +29D7 0021; 29D7 +29F0 0021; 29F0 +2A0B 0021; 2A0B +2A25 0021; 2A25 +2A3E 0021; 2A3E +2A57 0021; 2A57 +2A70 0021; 2A70 +2A8C 0021; 2A8C +2AA5 0021; 2AA5 +2ABE 0021; 2ABE +2AD7 0021; 2AD7 +2AEF 0021; 2AEF +2B08 0021; 2B08 +2813 0021; 2813 +282C 0021; 282C +2845 0021; 2845 +285E 0021; 285E +2877 0021; 2877 +2890 0021; 2890 +28A9 0021; 28A9 +28C2 0021; 28C2 +28DB 0021; 28DB +28F4 0021; 28F4 +2637 0021; 2637 +4DD8 0021; 4DD8 +4DF1 0021; 4DF1 +1D30A 0021; 1D30A +1D323 0021; 1D323 +1D33C 0021; 1D33C +1D355 0021; 1D355 +A4A7 0021; A4A7 +A4C0 0021; A4C0 +1D009 0021; 1D009 +1D022 0021; 1D022 +1D03B 0021; 1D03B +1D054 0021; 1D054 +1D06D 0021; 1D06D +1D086 0021; 1D086 +1D09F 0021; 1D09F +1D0B8 0021; 1D0B8 +1D0D1 0021; 1D0D1 +1D0EA 0021; 1D0EA +1D10D 0021; 1D10D +1D126 0021; 1D126 +1D13F 0021; 1D13F +1D15E 0334; 1D15E +1D15D 0021; 1D15D +1D19F 0021; 1D19F +1D1B9 1D165 1D16F 0334; 1D1B9 1D165 1D16F +1D1CA 0021; 1D1CA +2FF5 0021; 2FF5 +1372 0021; 1372 +10118 0021; 10118 +10131 0021; 10131 +0304 003F; 0304 +0325 003F; 0325 +0334 05AD; 05AD +0334 1D17C; 1D17C +0610 0334; 0610 +1D17E 0334; 1D17E +030B 0334; 030B +0320 0334; 0320 +0345 0334; 0345 +0362 0334; 0362 +064F 0334; 064F +073D 0334; 073D +0E49 0334; 0E49 +20D6 0334; 20D6 +034B 0021; 034B +05B1 0021; 05B1 +064F 0021; 064F +0657 0021; 0657 +0745 0021; 0745 +0A81 0021; 0A81 +0ECA 0021; 0ECA +302A 0021; 302A +20DC 003F; 20DC +0EC6 0041; 0EC6 +30FC 0021; 30FC +0024 0062; 0024 +17DB 0061; 17DB +FFE6 0041; FFE6 +1D7EC 0021; 1D7EC +17E0 003F; 17E0 +0D66 0041; 0D66 +17F0 0062; 17F0 +0967 0021; 0967 +277F 0021; 277F +246A 003F; 246A +247F 0062; 247F +3365 003F; 3365 +2496 0041; 2496 +33EF 003F; 33EF +2499 0041; 2499 +336B 003F; 336B +09F4 0061; 09F4 +24F5 0062; 24F5 +FF12 0021; FF12 +0BE8 0021; 0BE8 +33F3 0021; 33F3 +33F6 0021; 33F6 +3257 0021; 3257 +2777 0061; 2777 +1042 0061; 1042 +1812 0062; 1812 +0663 0021; 0663 +325A 0021; 325A +32B1 0021; 32B1 +2778 0041; 2778 +17F3 0041; 17F3 +33E2 0061; 33E2 +136C 003F; 136C +32B6 0021; 32B6 +0034 0061; 0034 +0B6A 0061; 0B6A +136C 0062; 136C +1D7FB 0021; 1D7FB +0ED5 0021; 0ED5 +1D7E7 0041; 1D7E7 +0F25 0041; 0F25 +0F2E 0062; 0F2E +278F 003F; 278F +3026 003F; 3026 +0AEC 0041; 0AEC +06F6 0062; 06F6 +1D7FD 0021; 1D7FD +0ED7 0021; 0ED7 +2790 0041; 2790 +3027 0041; 3027 +32C6 0061; 32C6 +09EE 0021; 09EE +1D7FE 0061; 1D7FE +0ED8 0061; 0ED8 +0F28 0062; 0F28 +2792 003F; 2792 +3029 003F; 3029 +0AEF 0041; 0AEF +06F9 0062; 06F9 +2002 0061; 2002 +005F 0061; 005F +FE54 0061; FE54 +002E 0061; 002E +0028 0061; 0028 +298F 0061; 298F +204B 0061; 204B +2038 0061; 2038 +17DA 0061; 17DA +02FC 0061; 02FC +0FCB 0061; 0FCB +2142 0061; 2142 +21BA 0061; 21BA +21EC 0061; 21EC +002B 0061; 002B +2220 0061; 2220 +2250 0061; 2250 +2283 0061; 2283 +22B3 0061; 22B3 +22E6 0061; 22E6 +231C 0061; 231C +2350 0061; 2350 +2382 0061; 2382 +23B4 0061; 23B4 +2415 0061; 2415 +2514 0061; 2514 +2546 0061; 2546 +2578 0061; 2578 +25A9 0061; 25A9 +25DA 0061; 25DA +260C 0061; 260C +2647 0061; 2647 +267C 0061; 267C +2726 0061; 2726 +2761 0061; 2761 +27B5 0061; 27B5 +27FC 0061; 27FC +292E 0061; 292E +2960 0061; 2960 +29A8 0061; 29A8 +29DA 0061; 29DA +2A0F 0061; 2A0F +2A41 0061; 2A41 +2A73 0061; 2A73 +2AA8 0061; 2AA8 +2ADA 0061; 2ADA +2B0C 0061; 2B0C +2830 0061; 2830 +2862 0061; 2862 +2894 0061; 2894 +28C6 0061; 28C6 +28F8 0061; 28F8 +4DDC 0061; 4DDC +1D30E 0061; 1D30E +1D340 0061; 1D340 +A4AB 0061; A4AB +1D00D 0061; 1D00D +1D03F 0061; 1D03F +1D071 0061; 1D071 +1D0A3 0061; 1D0A3 +1D0D5 0061; 1D0D5 +1D111 0061; 1D111 +1D143 0061; 1D143 +1D197 0061; 1D197 +1D1CD 0061; 1D1CD +1375 0061; 1375 +0000 0061; 0000 +0097 0061; 0097 +0612 0061; 0612 +2060 0061; 2060 +1D167 0061; 1D167 +8FFFE 0061; 8FFFE +E0045 0061; E0045 +E0077 0061; E0077 +E0129 0061; E0129 +E015B 0061; E015B +E018D 0061; E018D +E01BF 0061; E01BF +EFFFF 0061; EFFFF +2001 0041; 2001 +02DB 0041; 02DB +037E 0041; 037E +FE30 0041; FE30 +00BB 0041; 00BB +298E 0041; 298E +00B6 0041; 00B6 +303D 0041; 303D +17D9 0041; 17D9 +02FB 0041; 02FB +0FCA 0041; 0FCA +2141 0041; 2141 +21B9 0041; 21B9 +21EB 0041; 21EB +2211 0041; 2211 +221F 0041; 221F +224F 0041; 224F +2284 0041; 2284 +22EA 0041; 22EA +22E5 0041; 22E5 +231B 0041; 231B +234F 0041; 234F +2381 0041; 2381 +23B3 0041; 23B3 +2414 0041; 2414 +2513 0041; 2513 +2545 0041; 2545 +2577 0041; 2577 +25A8 0041; 25A8 +25D9 0041; 25D9 +260B 0041; 260B +2646 0041; 2646 +267B 0041; 267B +2725 0041; 2725 +275E 0041; 275E +27B4 0041; 27B4 +27FB 0041; 27FB +292D 0041; 292D +295F 0041; 295F +29A7 0041; 29A7 +29D9 0041; 29D9 +2A0E 0041; 2A0E +2A40 0041; 2A40 +2A72 0041; 2A72 +2AA7 0041; 2AA7 +2AD9 0041; 2AD9 +2B0B 0041; 2B0B +282F 0041; 282F +2861 0041; 2861 +2893 0041; 2893 +28C5 0041; 28C5 +28F7 0041; 28F7 +4DDB 0041; 4DDB +1D30D 0041; 1D30D +1D33F 0041; 1D33F +A4AA 0041; A4AA +1D00C 0041; 1D00C +1D03E 0041; 1D03E +1D070 0041; 1D070 +1D0A2 0041; 1D0A2 +1D0D4 0041; 1D0D4 +1D110 0041; 1D110 +1D142 0041; 1D142 +1D196 0041; 1D196 +1D1CC 0041; 1D1CC +1374 0041; 1374 +10133 0041; 10133 +0096 0041; 0096 +0611 0041; 0611 +202E 0041; 202E +1D166 0041; 1D166 +7FFFF 0041; 7FFFF +E0044 0041; E0044 +E0076 0041; E0076 +E0128 0041; E0128 +E015A 0041; E015A +E018C 0041; E018C +E01BE 0041; E01BE +EFFFE 0041; EFFFE +0103 0021; 0103 +01FB 0021; 01FB +1EB6 0021; 1EB6 +0103 0334 0303; 0103 0334 +00C2 0309 0334; 00C2 0309 +0061 0334 0307 0304; 0061 0334 0307 +1EA0 0334 0306; 1EA0 0334 +0307 0041; 0307 +0321 0041; 0321 +033D 0041; 033D +FE22 0041; FE22 +FE71 0041; FE71 +FE7C 0041; FE7C +073C 0041; 073C +0982 0041; 0982 +0D82 0041; 0D82 +17CE 0041; 17CE +20D6 0041; 20D6 +1D44E 0061; 1D44E +1D538 0041; 1D538 +1EA4 0041; 1EA4 +0104 0041; 0104 +24D0 0062; 24D0 +01FA 0062; 01FA +3373 003F; 3373 +00E6 0341 0334; 00E6 0341 +1D44 0021; 1D44 +1FEF 0062; 1FEF +058A 0062; 058A +1361 0062; 1361 +0387 0062; 0387 +005D 0062; 005D +FE40 0062; FE40 +005C 0062; 005C +05F4 0062; 05F4 +02CB 0062; 02CB +0BF6 0062; 0BF6 +19EC 0062; 19EC +21AE 0062; 21AE +21C9 0062; 21C9 +21FB 0062; 21FB +003D 0062; 003D +2230 0062; 2230 +225F 0062; 225F +2292 0062; 2292 +22BF 0062; 22BF +22F9 0062; 22F9 +232D 0062; 232D +235F 0062; 235F +2391 0062; 2391 +23C3 0062; 23C3 +2424 0062; 2424 +2523 0062; 2523 +2555 0062; 2555 +2587 0062; 2587 +25B8 0062; 25B8 +25E9 0062; 25E9 +261C 0062; 261C +2656 0062; 2656 +26A1 0062; 26A1 +2736 0062; 2736 +2770 0062; 2770 +27D5 0062; 27D5 +290B 0062; 290B +293D 0062; 293D +296F 0062; 296F +29B7 0062; 29B7 +29E9 0062; 29E9 +2A1E 0062; 2A1E +2A50 0062; 2A50 +2A85 0062; 2A85 +2AB7 0062; 2AB7 +2AE9 0062; 2AE9 +280D 0062; 280D +283F 0062; 283F +2871 0062; 2871 +28A3 0062; 28A3 +28D5 0062; 28D5 +2631 0062; 2631 +4DEB 0062; 4DEB +1D31D 0062; 1D31D +1D34F 0062; 1D34F +A4BA 0062; A4BA +1D01C 0062; 1D01C +1D04E 0062; 1D04E +1D080 0062; 1D080 +1D0B2 0062; 1D0B2 +1D0E4 0062; 1D0E4 +1D120 0062; 1D120 +1D152 0062; 1D152 +1D1A6 0062; 1D1A6 +1D1DC 0062; 1D1DC +10111 0062; 10111 +0014 0062; 0014 +0594 0062; 0594 +06E1 0062; 06E1 +D805 0062; D805 +1D179 0062; 1D179 +E0022 0062; E0022 +E0054 0062; E0054 +E0106 0062; E0106 +E0138 0062; E0138 +E016A 0062; E016A +E019C 0062; E019C +E01CE 0062; E01CE +1D553 0021; 1D553 +1D63D 003F; 1D63D +0342 0062; 0342 +0339 0062; 0339 +05BC 0062; 05BC +0738 0062; 0738 +0C82 0062; 0C82 +20D2 0062; 20D2 +1D553 0041; 1D553 +1E05 0041; 1E05 +1E04 0062; 1E04 +0182 0021; 0182 +2103 0021; 2103 +00C7 0021; 00C7 +FF43 0061; FF43 +1D4D2 0061; 1D4D2 +3388 0062; 3388 +33C4 0021; 33C4 +0188 0021; 0188 +1D625 003F; 1D625 +1E0B 003F; 1E0B +0064 0334 0331; 0064 0334 +FF24 0041; FF24 +1E10 0041; 1E10 +1D60B 0062; 1D60B +01F1 003F; 01F1 +0110 0041; 0110 +1D06 0061; 1D06 +1D508 0021; 1D508 +1EC0 003F; 1EC0 +1EBB 003F; 1EBB +0065 0334 0302; 0065 0334 +0065 0334 0303; 0065 0334 +0112 0300 0334; 0112 0300 +0065 0041; 0065 +1D5D8 0061; 1D5D8 +1EC4 0041; 1EC4 +0205 0041; 0205 +1D53C 0062; 1D53C +0207 0062; 0207 +1D4A 0061; 1D4A +025D 0021; 025D +1D65B 003F; 1D65B +FF46 0061; FF46 +1D675 0061; 1D675 +1D509 0062; 1D509 +0192 0061; 0192 +1D53E 0021; 1D53E +1E21 0021; 1E21 +FF47 0061; FF47 +1D43A 0041; 1D43A +33FF 0062; 33FF +1E21 0062; 1E21 +029B 0021; 029B +1D691 0021; 1D691 +02B0 003F; 02B0 +0068 0307 0334; 0068 0307 +210E 0041; 210E +1D34 0041; 1D34 +1D629 0062; 1D629 +3371 0062; 3371 +0267 0041; 0267 +1D65E 003F; 1D65E +00CC 0021; 00CC +1ECA 0021; 1ECA +0049 0308 0334 0341; 0049 0308 0334 +0069 0334 0330; 0069 0334 +0049 0041; 0049 +012C 0041; 012C +1E2C 0041; 1E2C +01D0 0062; 01D0 +0132 0041; 0132 +1D4E 0041; 1D4E +1D55B 003F; 1D55B +01F0 003F; 01F0 +1D409 0061; 1D409 +1D5C3 0062; 1D5C3 +FF4B 003F; FF4B +1D40A 003F; 1D40A +004B 0334 030C; 004B 0334 +1D55C 0041; 1D55C +1E31 0041; 1E31 +1D5AA 0062; 1D5AA +33CE 0021; 33CE +0198 0021; 0198 +1D695 003F; 1D695 +013D 003F; 013D +1E39 0334; 1E39 +1D5C5 0041; 1D5C5 +0139 0041; 0139 +1D40B 0062; 1D40B +33D1 003F; 33D1 +019A 003F; 019A +1D45A 0021; 1D45A +1D4DC 003F; 1D4DC +33A1 003F; 33A1 +FF2D 0041; FF2D +3383 0041; 3383 +33D4 0061; 33D4 +33AB 0062; 33AB +0271 0062; 0271 +1D649 0021; 1D649 +1E4B 003F; 1E4B +004E 0323 0334; 004E 0323 +004E 0041; 004E +00F1 0041; 00F1 +1D4DD 0062; 1D4DD +339A 003F; 339A +019E 003F; 019E +1D5C8 0021; 1D5C8 +24C4 0021; 24C4 +022A 0021; 022A +1ECF 0021; 1ECF +004F 0341 0334; 004F 0341 +004F 0302 0309 0334; 004F 0302 0309 +00D5 0308 0334; 00D5 0308 +014C 0301 0334; 014C 0301 +006F 0334 0303 031B; 006F 0334 0303 +1D45C 0061; 1D45C +1D57A 0041; 1D57A +00F6 0061; 00F6 +1E52 0061; 1E52 +006F 0062; 006F +1ED6 0062; 1ED6 +1EE2 0062; 1EE2 +00F8 0334 0341; 00F8 0334 +1D54 0021; 1D54 +1D15 0061; 1D15 +1D5E3 0021; 1D5E3 +24AB 0041; 24AB +1D4AB 0041; 1D4AB +0050 0062; 0050 +33DA 0041; 33DA +1D492 0021; 1D492 +1D57C 003F; 1D57C +1D4AC 0061; 1D4AC +1D57C 0062; 1D57C +1D69B 003F; 1D69B +1E59 003F; 1E59 +0052 0327 0334; 0052 0327 +1D52F 0061; 1D52F +1D619 0041; 1D619 +33AD 0041; 33AD +0154 0062; 0154 +1D1A 0041; 1D1A +FF53 003F; FF53 +1D47A 003F; 1D47A +1E68 003F; 1E68 +0053 0327 0334; 0053 0327 +1D460 0041; 1D460 +015A 0061; 015A +1D530 0062; 1D530 +2120 0061; 2120 +0285 0061; 0285 +1D47B 0021; 1D47B +021A 0021; 021A +0074 0334 0331; 0074 0334 +1D4AF 0061; 1D4AF +021A 0041; 021A +0163 0062; 0163 +0167 0021; 0167 +24B0 003F; 24B0 +1D47C 003F; 1D47C +01D7 003F; 01D7 +01B0 003F; 01B0 +0075 0340 0334; 0075 0340 +00DC 0340 0334; 00DC 0340 +0075 0334 0304 0308; 0075 0334 0304 +0169 0334 031B; 0169 0334 +FF55 0041; FF55 +1D414 0041; 1D414 +01D8 0041; 01D8 +0216 0041; 0216 +1D532 0062; 1D532 +0171 0062; 0171 +1D59 0041; 1D59 +1D1F 0061; 1D1F +1D603 003F; 1D603 +1E7E 0021; 1E7E +1D66B 0041; 1D66B +0076 0062; 0076 +2175 0062; 2175 +FF57 003F; FF57 +1D47E 003F; 1D47E +0057 0341 0334; 0057 0341 +1D5D0 0061; 1D5D0 +24CC 0061; 24CC +FF37 0062; FF37 +24B3 003F; 24B3 +1D653 0021; 1D653 +2179 0041; 2179 +1D47F 0041; 1D47F +1D51B 0062; 1D51B +1D63A 0021; 1D63A +02B8 0021; 02B8 +0079 0340 0334; 0079 0340 +1EF4 0334; 1EF4 +1D654 0061; 1D654 +1EF7 0041; 1EF7 +1EF9 0062; 1EF9 +1D56B 003F; 1D56B +017E 003F; 017E +005A 0331 0334; 005A 0331 +1D5ED 0061; 1D5ED +1D503 0062; 1D503 +01B5 0021; 01B5 +0292 0062; 0292 +01BF 003F; 01BF +02C0 003F; 02C0 +1D25 003F; 1D25 +0298 003F; 0298 +1F02 0021; 1F02 +1F89 0021; 1F89 +0391 0334 0313 0345 0301; 0391 0334 0313 0345 +03B1 0314 0334 0301; 03B1 0314 0334 +03B1 0345 0334 0314; 03B1 0345 0334 +03B1 0345 0334; 03B1 0345 +1F82 0041; 1F82 +1F71 0041; 1F71 +1F8A 0062; 1F8A +1D737 003F; 1D737 +03D0 0062; 03D0 +1D6FE 0061; 1D6FE +03B4 003F; 03B4 +1D5F 0041; 1D5F +1F10 0021; 1F10 +0395 0343 0341 0334; 0395 0343 0341 +03F5 0061; 03F5 +1F15 0061; 1F15 +03AD 0062; 03AD +03B6 0061; 03B6 +1D6AE 0021; 1D6AE +1F95 0021; 1F95 +0397 0343 0334; 0397 0343 +1F90 0334; 1F90 +0397 0314 0334 0342; 0397 0314 0334 +1FC6 0345 0334; 1FC6 0345 +1F2A 0041; 1F2A +1F75 0061; 1F75 +1F98 0062; 1F98 +1D78B 003F; 1D78B +1D7C5 0041; 1D7C5 +1FBE 0021; 1FBE +1F3D 003F; 1F3D +1F38 0334; 1F38 +1FBE 0314 0342 0334; 1FBE 0314 0342 +1FBE 0308 0342 0334; 1FBE 0308 0342 +1F36 0041; 1F36 +1FD1 0041; 1FD1 +03F3 0021; 03F3 +1D752 0061; 1D752 +03BB 0021; 03BB +1D706 0062; 1D706 +1D6CD 0041; 1D6CD +339B 0021; 339B +1D7B6 0061; 1D7B6 +1D6EF 003F; 1D6EF +1D77E 003F; 1D77E +03BF 0334 0313; 03BF 0334 +039F 0301 0334; 039F 0301 +1F49 0061; 1F49 +1F78 0062; 1F78 +1D77F 0061; 1D77F +1D28 0041; 1D28 +1D72C 0021; 1D72C +03A1 0061; 03A1 +03F2 003F; 03F2 +1D7BC 0061; 1D7BC +1D70F 0021; 1D70F +1D7BD 0062; 1D7BD +1F53 003F; 1F53 +03C5 0313 0341 0334; 03C5 0313 0341 +03D2 0334 0341; 03D2 0334 +1D710 0061; 1D710 +1F7B 0041; 1F7B +1F52 0062; 1F52 +1D78D 003F; 1D78D +1D6BD 0041; 1D6BD +1D732 003F; 1D732 +03C8 003F; 03C8 +1D74D 0062; 1D74D +1FAC 0021; 1FAC +1FA1 0021; 1FA1 +03C9 0334 0343 0300; 03C9 0334 0343 +03A9 0314 0334 0341; 03A9 0314 0334 +2126 0345 0314 0334; 2126 0345 0314 +1D6DA 0041; 1D6DA +1FA8 0041; 1FA8 +1FF6 0041; 1FF6 +1FA1 0062; 1FA1 +03E2 0061; 03E2 +03EC 0061; 03EC +0410 0306 0041; 0410 0306 +04D9 0308 003F; 04D9 0308 +0432 0021; 0432 +0434 0021; 0434 +0433 0341 0334; 0433 0341 +0400 0334; 0400 +0415 0306 0061; 0415 0306 +0416 0308 0021; 0416 0308 +0504 0021; 0504 +04E1 0021; 04E1 +045D 0061; 045D +0418 0308 0041; 0418 0308 +0438 0306 003F; 0438 0306 +049B 0021; 049B +043B 0021; 043B +043C 0041; 043C +04C8 0041; 04C8 +04E6 0021; 04E6 +04EA 0334; 04EA +0440 003F; 0440 +0442 003F; 0442 +045C 0334; 045C +045E 0021; 045E +0443 0308 0041; 0443 0308 +04AF 0041; 04AF +04B3 0041; 04B3 +047B 0041; 047B +0447 0308 0061; 0447 0308 +04BC 003F; 04BC +042A 003F; 042A +044C 003F; 044C +042D 0308 0334; 042D 0308 +0464 0062; 0464 +046E 0062; 046E +0475 030F 0041; 0475 030F +10A2 0021; 10A2 +10C1 0021; 10C1 +10AB 0021; 10AB +10AF 0021; 10AF +10B3 0021; 10B3 +10B8 0021; 10B8 +10BD 0021; 10BD +10C5 0021; 10C5 +0533 0041; 0533 +0538 0021; 0538 +053D 0021; 053D +0542 0021; 0542 +0545 0021; 0545 +054A 0021; 054A +FB16 0061; FB16 +0553 0041; 0553 +05D0 0334 05BC; 05D0 0334 +FB31 0061; FB31 +05D4 003F; 05D4 +05D6 0334 05BC; 05D6 0334 +05F2 0021; 05F2 +FB3A 0062; FB3A +FB40 0021; FB40 +FB43 003F; FB43 +05E8 003F; 05E8 +FB2A 0061; FB2A +FE80 0062; FE80 +0623 0062; 0623 +0625 0021; 0625 +064A 1D165 0654 0061; 064A 1D165 0654 +FC99 0041; FC99 +FBEC 003F; FBEC +FC68 0021; FC68 +FE8E 003F; FE8E +FE8F 0021; FE8F +FC9E 0062; FC9E +FCA0 0062; FCA0 +FB58 003F; FB58 +FE94 003F; FE94 +FD50 0041; FD50 +FD54 0041; FD54 +FD56 0041; FD56 +FC75 0062; FC75 +FCA6 0061; FCA6 +FB66 0021; FB66 +067D 0041; 067D +FE9E 0062; FE9E +FDA7 0041; FDA7 +FB77 0062; FB77 +FB7B 0062; FB7B +FEA1 0061; FEA1 +FD1B 0062; FD1B +FC1A 0041; FC1A +FEAA 003F; FEAA +0689 0041; 0689 +FB87 0061; FB87 +FDFC 0041; FDFC +0695 0041; 0695 +FEB3 0041; FEB3 +FD35 0062; FD35 +FCE7 0061; FCE7 +FD17 0062; FD17 +FD25 0041; FD25 +FD39 003F; FD39 +FD6A 003F; FD6A +069A 0041; 069A +FCB1 0062; FCB1 +FDF0 0041; FDF0 +FEBD 0021; FEBD +FC24 003F; FC24 +FD08 003F; FD08 +FC26 003F; FC26 +FD11 0062; FD11 +FD3B 0062; FD3B +FDC4 0062; FDC4 +FCF8 003F; FCF8 +FCBD 0062; FCBD +FED3 003F; FED3 +FCC0 0062; FCC0 +06A1 0041; 06A1 +FB6E 0021; FB6E +FC33 003F; FC33 +FC7E 0062; FC7E +FC37 003F; FC37 +FC81 0041; FC81 +FC83 0062; FC83 +06AC 0041; 06AC +FB92 0061; FB92 +FB96 0021; FB96 +FEF5 003F; FEF5 +FD84 003F; FD84 +FD81 0041; FD81 +FD88 0062; FD88 +06B8 0041; 06B8 +FD8C 0041; FD8C +FC47 003F; FC47 +FC4A 0041; FC4A +FD97 003F; FD97 +FCD4 0062; FCD4 +FCEF 003F; FCEF +FBA0 0021; FBA0 +FEEA 0061; FEEA +FC54 0041; FC54 +FBA6 0061; FBA6 +FEED 003F; FEED +06C6 0041; 06C6 +FBE3 0021; FBE3 +FC5D 0021; FC5D +FEF4 0062; FEF4 +FC91 0061; FC91 +FCF1 0021; FCF1 +FBFF 0062; FBFF +06D2 0654 0334; 06D2 0654 +0714 0041; 0714 +071B 0061; 071B +0724 0062; 0724 +0780 0062; 0780 +0787 0062; 0787 +0798 0062; 0798 +079F 0062; 079F +07A7 0062; 07A7 +1200 0062; 1200 +120B 0062; 120B +1215 0062; 1215 +121F 0062; 121F +1229 0062; 1229 +1233 0062; 1233 +123D 0062; 123D +1248 0062; 1248 +1255 0062; 1255 +1263 0062; 1263 +126D 0062; 126D +1277 0062; 1277 +1281 0062; 1281 +128D 0062; 128D +1299 0062; 1299 +12A3 0062; 12A3 +12AD 0062; 12AD +12BB 0062; 12BB +12C9 0062; 12C9 +12D4 0062; 12D4 +12DF 0062; 12DF +12E9 0062; 12E9 +12F4 0062; 12F4 +12FE 0062; 12FE +1308 0062; 1308 +1314 0062; 1314 +1321 0062; 1321 +132B 0062; 132B +1335 0062; 1335 +133F 0062; 133F +134A 0062; 134A +1354 0062; 1354 +0906 0062; 0906 +090E 0062; 090E +0959 003F; 0959 +095B 0041; 095B +0923 003F; 0923 +092B 0041; 092B +0932 0062; 0932 +093F 003F; 093F +0947 003F; 0947 +0987 0062; 0987 +0993 0062; 0993 +099D 0062; 099D +09A4 0041; 09A4 +09AF 09BC 0334; 09AF 09BC +09BD 0021; 09BD +09C7 0021; 09C7 +0A74 0061; 0A74 +0A07 0061; 0A07 +0A17 003F; 0A17 +0A1E 0021; 0A1E +0A28 0021; 0A28 +0A32 0334 0A3C; 0A32 0334 +0A47 0062; 0A47 +0A89 0061; 0A89 +0A93 0061; 0A93 +0A9D 0061; 0A9D +0AA7 0061; 0AA7 +0AB3 0061; 0AB3 +0AC1 0061; 0AC1 +0ACB 0061; 0ACB +0B60 0021; 0B60 +0B18 0021; 0B18 +0B5C 0021; 0B5C +0B28 0062; 0B28 +0B33 0062; 0B33 +0B40 0062; 0B40 +0B4C 003F; 0B4C +0B88 0041; 0B88 +0B95 0021; 0B95 +0BAA 0021; 0BAA +0BB8 0021; 0BB8 +0BC6 0BBE 0021; 0BC6 0BBE +0BD7 0062; 0BD7 +0C61 0062; 0C61 +0C18 0062; 0C18 +0C22 0062; 0C22 +0C2D 0062; 0C2D +0C38 0062; 0C38 +0C47 0062; 0C47 +0C56 0061; 0C56 +0CE1 0061; 0CE1 +0C98 0061; 0C98 +0CA2 0061; 0CA2 +0CAD 0061; 0CAD +0CB9 0061; 0CB9 +0CC2 0062; 0CC2 +0CCA 0061; 0CCA +0D06 0061; 0D06 +0D0F 0061; 0D0F +0D1A 0061; 0D1A +0D24 0061; 0D24 +0D2F 0061; 0D2F +0D39 0061; 0D39 +0D46 0D3E 003F; 0D46 0D3E +0D85 003F; 0D85 +0D8F 003F; 0D8F +0D9C 003F; 0D9C +0DA6 003F; 0DA6 +0DB0 003F; 0DB0 +0DBB 003F; 0DBB +0DCA 0062; 0DCA +0DD9 0334 0DCA; 0DD9 0334 +0DD9 0DDF 0021; 0DD9 0DDF +0E05 0061; 0E05 +0E0F 0061; 0E0F +0E19 0061; 0E19 +0E23 0061; 0E23 +0E2D 0061; 0E2D +0E35 0062; 0E35 +0E4C 0041; 0E4C +0E95 0041; 0E95 +0EA1 0041; 0EA1 +0EAE 0041; 0EAE +0EB7 0021; 0EB7 +0ECD 003F; 0ECD +0F93 003F; 0F93 +0F99 003F; 0F99 +0F9E 003F; 0F9E +0FA3 003F; 0FA3 +0FA8 003F; 0FA8 +0FAD 003F; 0FAD +0FBB 0061; 0FBB +0F64 0021; 0F64 +0FB8 0021; 0FB8 +0F71 1D165 0F72 0061; 0F71 1D165 0F72 +0F71 0F74 0041; 0F71 0F74 +0F78 0062; 0F78 +0F84 0061; 0F84 +1909 0061; 1909 +1913 0061; 1913 +1920 0061; 1920 +192A 0061; 192A +1938 0061; 1938 +1709 0061; 1709 +0334 1714; 1714 +1729 0021; 1729 +1733 0021; 1733 +1747 0041; 1747 +1751 0041; 1751 +1767 0041; 1767 +1773 0041; 1773 +1009 0041; 1009 +1013 0041; 1013 +101D 0041; 101D +1026 003F; 1026 +102D 0021; 102D +1039 0021; 1039 +1788 0041; 1788 +1792 0041; 1792 +179C 0041; 179C +17A5 0041; 17A5 +17AF 0041; 17AF +17B9 0041; 17B9 +17C3 0041; 17C3 +1956 003F; 1956 +1960 003F; 1960 +196A 003F; 196A +1881 003F; 1881 +1844 003F; 1844 +1824 003F; 1824 +1829 003F; 1829 +182C 003F; 182C +1830 003F; 1830 +1868 003F; 1868 +1853 003F; 1853 +1839 003F; 1839 +1854 003F; 1854 +1840 003F; 1840 +189F 003F; 189F +1894 003F; 1894 +13A0 0062; 13A0 +13AA 0062; 13AA +13B4 0062; 13B4 +13BE 0062; 13BE +13C8 0062; 13C8 +13D2 0062; 13D2 +13DC 0062; 13DC +13E6 0062; 13E6 +13F0 0062; 13F0 +1406 0062; 1406 +1410 0062; 1410 +141A 0062; 141A +1424 0062; 1424 +142E 0062; 142E +1438 0062; 1438 +1442 0062; 1442 +144C 0062; 144C +1456 0062; 1456 +1460 0062; 1460 +146A 0062; 146A +1474 0062; 1474 +147E 0062; 147E +1488 0062; 1488 +1492 0062; 1492 +149C 0062; 149C +14A6 0062; 14A6 +14B0 0062; 14B0 +14BA 0062; 14BA +14C4 0062; 14C4 +14CE 0062; 14CE +14D8 0062; 14D8 +14E2 0062; 14E2 +14EC 0062; 14EC +14F6 0062; 14F6 +1500 0062; 1500 +150A 0062; 150A +1514 0062; 1514 +151E 0062; 151E +1528 0062; 1528 +1532 0062; 1532 +153C 0062; 153C +1546 0062; 1546 +1550 0062; 1550 +155A 0062; 155A +1564 0062; 1564 +156E 0062; 156E +1578 0062; 1578 +1582 0062; 1582 +158C 0062; 158C +1595 0062; 1595 +1599 0062; 1599 +15A3 0062; 15A3 +15AC 0062; 15AC +15B6 0062; 15B6 +15C0 0062; 15C0 +15CA 0062; 15CA +15D4 0062; 15D4 +15DE 0062; 15DE +15E8 0062; 15E8 +15F2 0062; 15F2 +15FC 0062; 15FC +1606 0062; 1606 +1610 0062; 1610 +161A 0062; 161A +1624 0062; 1624 +162E 0062; 162E +1638 0062; 1638 +1642 0062; 1642 +164C 0062; 164C +1656 0062; 1656 +1660 0062; 1660 +166A 0062; 166A +1688 0062; 1688 +1692 0062; 1692 +16A1 0062; 16A1 +16AE 0041; 16AE +16B7 0062; 16B7 +16C1 0061; 16C1 +16C9 0062; 16C9 +16D4 0021; 16D4 +16DC 0061; 16DC +16E4 0062; 16E4 +FFA1 0041; FFA1 +FFA2 0021; FFA2 +3137 0021; 3137 +3139 0021; 3139 +FFB1 0041; FFB1 +3273 0062; 3273 +3274 0062; 3274 +3275 0062; 3275 +321C 0062; 321C +3217 0061; 3217 +314C 0021; 314C +FFBD 0041; FFBD +327B 0062; 327B +1115 0061; 1115 +111C 0061; 111C +3144 0041; 3144 +3176 0062; 3176 +317A 0062; 317A +1134 0062; 1134 +113D 0062; 113D +1146 0062; 1146 +114E 0062; 114E +3184 0062; 3184 +314F 0041; 314F +FFC5 0062; FFC5 +FFCB 0021; FFCB +3159 0041; 3159 +FFD3 0062; FFD3 +FFD7 0021; FFD7 +3163 0041; 3163 +117E 0062; 117E +1186 0062; 1186 +118F 0062; 118F +1196 0062; 1196 +119F 0062; 119F +11AB 0062; 11AB +313A 0041; 313A +FFAD 0062; FFAD +11B9 0062; 11B9 +11C3 0062; 11C3 +11CB 0062; 11CB +11D3 0061; 11D3 +11DA 0062; 11DA +11E2 0062; 11E2 +11EC 0062; 11EC +11F4 0062; 11F4 +30A1 0041; 30A1 +30A3 0041; 30A3 +3045 0061; 3045 +3308 0062; 3308 +30A9 0061; 30A9 +30AB 0061; 30AB +32D6 003F; 32D6 +3314 003F; 3314 +3050 0041; 3050 +30B2 0021; 30B2 +331E 003F; 331E +3055 0061; 3055 +31F1 0061; 31F1 +3059 0041; 3059 +305B 0062; 305B +305E 0062; 305E +32E0 003F; 32E0 +3065 003F; 3065 +30C6 0061; 30C6 +32E3 0041; 32E3 +30CB 003F; 30CB +306D 0061; 306D +30CF 0334 3099; 30CF 0334 +306F 0062; 306F +FF8B 0061; FF8B +32EB 003F; 32EB +3332 0061; 3332 +333B 0061; 333B +3339 0021; 3339 +307B 0061; 307B +30DE 003F; 30DE +30DF 003F; 30DF +32F0 0061; 32F0 +3082 0061; 3082 +3083 0062; 3083 +3088 003F; 3088 +31FB 0041; 31FB +31FD 003F; 31FD +32F9 0061; 32F9 +FF9C 0021; FF9C +32FC 0061; 32FC +32FE 0061; 32FE +3108 003F; 3108 +31B6 0061; 31B6 +3113 003F; 3113 +311B 003F; 311B +3120 003F; 3120 +31AC 003F; 31AC +A001 003F; A001 +A00B 003F; A00B +A015 003F; A015 +A01F 003F; A01F +A029 003F; A029 +A033 003F; A033 +A03D 003F; A03D +A047 003F; A047 +A051 003F; A051 +A05B 003F; A05B +A065 003F; A065 +A06F 003F; A06F +A079 003F; A079 +A083 003F; A083 +A08D 003F; A08D +A097 003F; A097 +A0A1 003F; A0A1 +A0AB 003F; A0AB +A0B5 003F; A0B5 +A0BF 003F; A0BF +A0C9 003F; A0C9 +A0D3 003F; A0D3 +A0DD 003F; A0DD +A0E7 003F; A0E7 +A0F1 003F; A0F1 +A0FB 003F; A0FB +A105 003F; A105 +A10F 003F; A10F +A119 003F; A119 +A123 003F; A123 +A12D 003F; A12D +A137 003F; A137 +A141 003F; A141 +A14B 003F; A14B +A155 003F; A155 +A15F 003F; A15F +A169 003F; A169 +A173 003F; A173 +A17D 003F; A17D +A187 003F; A187 +A191 003F; A191 +A19B 003F; A19B +A1A5 003F; A1A5 +A1AF 003F; A1AF +A1B9 003F; A1B9 +A1C3 003F; A1C3 +A1CD 003F; A1CD +A1D7 003F; A1D7 +A1E1 003F; A1E1 +A1EB 003F; A1EB +A1F5 003F; A1F5 +A1FF 003F; A1FF +A209 003F; A209 +A213 003F; A213 +A21D 003F; A21D +A227 003F; A227 +A231 003F; A231 +A23B 003F; A23B +A245 003F; A245 +A24F 003F; A24F +A259 003F; A259 +A263 003F; A263 +A26D 003F; A26D +A277 003F; A277 +A281 003F; A281 +A28B 003F; A28B +A295 003F; A295 +A29F 003F; A29F +A2A9 003F; A2A9 +A2B3 003F; A2B3 +A2BD 003F; A2BD +A2C7 003F; A2C7 +A2D1 003F; A2D1 +A2DB 003F; A2DB +A2E5 003F; A2E5 +A2EF 003F; A2EF +A2F9 003F; A2F9 +A303 003F; A303 +A30D 003F; A30D +A317 003F; A317 +A321 003F; A321 +A32B 003F; A32B +A335 003F; A335 +A33F 003F; A33F +A349 003F; A349 +A353 003F; A353 +A35D 003F; A35D +A367 003F; A367 +A371 003F; A371 +A37B 003F; A37B +A385 003F; A385 +A38F 003F; A38F +A399 003F; A399 +A3A3 003F; A3A3 +A3AD 003F; A3AD +A3B7 003F; A3B7 +A3C1 003F; A3C1 +A3CB 003F; A3CB +A3D5 003F; A3D5 +A3DF 003F; A3DF +A3E9 003F; A3E9 +A3F3 003F; A3F3 +A3FD 003F; A3FD +A407 003F; A407 +A411 003F; A411 +A41B 003F; A41B +A425 003F; A425 +A42F 003F; A42F +A439 003F; A439 +A443 003F; A443 +A44D 003F; A44D +A457 003F; A457 +A461 003F; A461 +A46B 003F; A46B +A475 003F; A475 +A47F 003F; A47F +A489 003F; A489 +10306 003F; 10306 +10310 003F; 10310 +1031A 003F; 1031A +10335 003F; 10335 +1033F 003F; 1033F +10349 003F; 10349 +1042C 003F; 1042C +10431 003F; 10431 +10436 003F; 10436 +1043B 003F; 1043B +10440 003F; 10440 +10445 003F; 10445 +1044A 003F; 1044A +1044F 003F; 1044F +10458 003F; 10458 +10462 003F; 10462 +1046C 003F; 1046C +10476 003F; 10476 +10480 003F; 10480 +1048A 003F; 1048A +10494 003F; 10494 +10000 003F; 10000 +1000A 003F; 1000A +10015 003F; 10015 +1001F 003F; 1001F +1002A 003F; 1002A +10034 003F; 10034 +10040 003F; 10040 +1004A 003F; 1004A +10056 003F; 10056 +10082 003F; 10082 +1008C 003F; 1008C +10096 003F; 10096 +100A0 003F; 100A0 +100AA 003F; 100AA +100B4 003F; 100B4 +100BE 003F; 100BE +100C8 003F; 100C8 +100D2 003F; 100D2 +100DC 003F; 100DC +100E6 003F; 100E6 +100F0 003F; 100F0 +100FA 003F; 100FA +1080C 003F; 1080C +10816 003F; 10816 +10820 003F; 10820 +1082A 003F; 1082A +10834 003F; 10834 +10384 003F; 10384 +1038E 003F; 1038E +10398 003F; 10398 +3220 0062; 3220 +3222 0061; 3222 +32A5 003F; 32A5 +2F04 003F; 2F04 +3221 003F; 3221 +2E85 003F; 2E85 +F92D 003F; F92D +2F80B 003F; 2F80B +2F810 003F; 2F810 +2F811 003F; 2F811 +2F0E 003F; 2F0E +2F81D 003F; 2F81D +F9FF 003F; F9FF +3238 003F; 3238 +2F13 003F; 2F13 +F9EB 003F; F9EB +323F 003F; 323F +2F830 003F; 2F830 +2F837 003F; 2F837 +F9ED 003F; F9ED +2F842 003F; 2F842 +FA0D 003F; FA0D +3195 0041; 3195 +2F853 003F; 2F853 +F942 003F; F942 +32B0 003F; 32B0 +329B 0041; 329B +2F26 003F; 2F26 +2F86F 0041; 2F86F +2E8E 0021; 2E8E +F9DF 003F; F9DF +2F87F 003F; 2F87F +2F30 003F; 2F30 +2F33 0021; 2F33 +FA0B 003F; FA0B +2F39 003F; 2F39 +F966 003F; F966 +2F8A0 003F; 2F8A0 +FA3E 003F; FA3E +FA40 0041; FA40 +2E98 003F; 2E98 +2F8B7 003F; 2F8B7 +2F8C6 003F; 2F8C6 +2F8C9 003F; 2F8C9 +FA42 003F; FA42 +FA12 003F; FA12 +2F8D4 003F; 2F8D4 +2F8DA 003F; 2F8DA +F9C9 003F; F9C9 +FA44 0041; FA44 +F94C 003F; F94C +2F8F3 003F; 2F8F3 +2F4F 003F; 2F4F +2EA1 003F; 2EA1 +2F8FF 003F; 2F8FF +FA45 0041; FA45 +F9CB 003F; F9CB +F922 003F; F922 +2F835 003F; 2F835 +2F91E 003F; 2F91E +2F921 003F; 2F921 +3235 003F; 3235 +2F928 003F; 2F928 +F9E4 003F; F9E4 +2F932 003F; 2F932 +2F936 003F; 2F936 +F9C1 003F; F9C1 +2F6C 003F; 2F6C +2F6E 003F; 2F6E +F985 003F; F985 +FA4F 003F; FA4F +FA52 003F; FA52 +F956 003F; F956 +2F75 003F; 2F75 +FA1D 003F; FA1D +F96A 003F; F96A +F950 003F; F950 +2EB4 0041; 2EB4 +F9AF 003F; F9AF +2F7E 003F; 2F7E +2F81 003F; 2F81 +3242 003F; 3242 +2F86 003F; 2F86 +2EBF 0061; 2EBF +2F996 003F; 2F996 +2F9A2 003F; 2F9A2 +2F9A9 003F; 2F9A9 +2F8C 003F; 2F8C +2F9BA 003F; 2F9BA +2F8E 003F; 2F8E +2F9C7 003F; 2F9C7 +2F92 0061; 2F92 +F97D 003F; F97D +2EC8 003F; 2EC8 +2F9D4 003F; 2F9D4 +2F9A 003F; 2F9A +F902 003F; F902 +2F98D 003F; 2F98D +FA25 0041; FA25 +2F9E4 003F; 2F9E4 +328E 0021; 328E +2F9EB 003F; 2F9EB +2F9F0 003F; 2F9F0 +F9DC 003F; F9DC +F9B2 003F; F9B2 +2FB0 003F; 2FB0 +2F9FE 0041; 2F9FE +2FB7 0021; 2FB7 +2FB8 003F; 2FB8 +2FBB 003F; 2FBB +2FC2 003F; 2FC2 +F920 003F; F920 +2FA15 003F; 2FA15 +2FA18 003F; 2FA18 +2FD1 003F; 2FD1 +F908 0021; F908 +9FA3 003F; 9FA3 +FA23 003F; FA23 +3405 003F; 3405 +340F 003F; 340F +3419 003F; 3419 +3423 003F; 3423 +342D 003F; 342D +3437 003F; 3437 +3441 003F; 3441 +344B 003F; 344B +3455 003F; 3455 +345F 003F; 345F +3469 003F; 3469 +3473 003F; 3473 +347D 003F; 347D +3487 003F; 3487 +3491 003F; 3491 +349B 003F; 349B +34A4 003F; 34A4 +34AE 003F; 34AE +34B8 003F; 34B8 +34C0 003F; 34C0 +34CA 003F; 34CA +34D4 003F; 34D4 +34DE 003F; 34DE +34E7 003F; 34E7 +34F1 003F; 34F1 +34FB 003F; 34FB +3505 003F; 3505 +350F 003F; 350F +3518 003F; 3518 +3522 003F; 3522 +352C 003F; 352C +3536 003F; 3536 +3540 003F; 3540 +354A 003F; 354A +3554 003F; 3554 +355E 003F; 355E +3568 003F; 3568 +3572 003F; 3572 +357C 003F; 357C +3586 003F; 3586 +3590 003F; 3590 +359A 003F; 359A +35A4 003F; 35A4 +35AE 003F; 35AE +35B8 003F; 35B8 +35C2 003F; 35C2 +35CC 003F; 35CC +35D6 003F; 35D6 +35E0 003F; 35E0 +35EA 003F; 35EA +35F4 003F; 35F4 +35FE 003F; 35FE +3608 003F; 3608 +3612 003F; 3612 +361C 003F; 361C +3626 003F; 3626 +3630 003F; 3630 +363A 003F; 363A +3644 003F; 3644 +364E 003F; 364E +3658 003F; 3658 +3662 003F; 3662 +366C 003F; 366C +3676 003F; 3676 +3680 003F; 3680 +368A 003F; 368A +3694 003F; 3694 +369E 003F; 369E +36A8 003F; 36A8 +36B2 003F; 36B2 +36BC 003F; 36BC +36C6 003F; 36C6 +36D0 003F; 36D0 +36DA 003F; 36DA +36E4 003F; 36E4 +2F867 0021; 2F867 +36F7 003F; 36F7 +3700 003F; 3700 +370A 003F; 370A +3714 003F; 3714 +371E 003F; 371E +3728 003F; 3728 +3732 003F; 3732 +373C 003F; 373C +3746 003F; 3746 +3750 003F; 3750 +375A 003F; 375A +3764 003F; 3764 +376E 003F; 376E +3778 003F; 3778 +3781 0041; 3781 +378B 003F; 378B +3795 003F; 3795 +379F 003F; 379F +37A9 003F; 37A9 +37B3 003F; 37B3 +37BD 003F; 37BD +37C7 003F; 37C7 +37D1 003F; 37D1 +37DB 003F; 37DB +37E5 003F; 37E5 +37EF 003F; 37EF +37F9 003F; 37F9 +3803 003F; 3803 +380D 003F; 380D +3817 003F; 3817 +3821 003F; 3821 +382B 003F; 382B +3834 003F; 3834 +383E 003F; 383E +3848 003F; 3848 +3852 003F; 3852 +385C 003F; 385C +3865 003F; 3865 +386F 003F; 386F +3879 003F; 3879 +3882 003F; 3882 +388C 003F; 388C +3896 003F; 3896 +38A0 003F; 38A0 +38AA 003F; 38AA +38B4 003F; 38B4 +38BE 003F; 38BE +38C7 0041; 38C7 +38D1 003F; 38D1 +38DB 003F; 38DB +38E4 003F; 38E4 +38EE 003F; 38EE +38F8 003F; 38F8 +3902 003F; 3902 +390C 003F; 390C +3916 003F; 3916 +391F 003F; 391F +3929 003F; 3929 +3933 003F; 3933 +393C 003F; 393C +3946 003F; 3946 +3950 003F; 3950 +395A 003F; 395A +3964 003F; 3964 +396E 003F; 396E +3978 003F; 3978 +3982 003F; 3982 +398C 003F; 398C +3996 003F; 3996 +39A0 003F; 39A0 +39AA 003F; 39AA +39B4 003F; 39B4 +39BE 003F; 39BE +39C8 003F; 39C8 +39D2 003F; 39D2 +39DC 003F; 39DC +39E6 003F; 39E6 +39F0 003F; 39F0 +39FA 003F; 39FA +3A04 003F; 3A04 +3A0E 003F; 3A0E +3A18 003F; 3A18 +3A22 003F; 3A22 +3A2C 003F; 3A2C +3A35 003F; 3A35 +3A3F 003F; 3A3F +3A49 003F; 3A49 +3A53 003F; 3A53 +3A5D 003F; 3A5D +3A67 003F; 3A67 +3A70 003F; 3A70 +3A7A 003F; 3A7A +3A84 003F; 3A84 +3A8E 003F; 3A8E +3A98 003F; 3A98 +3AA2 003F; 3AA2 +3AAC 003F; 3AAC +3AB6 003F; 3AB6 +3AC0 003F; 3AC0 +3ACA 003F; 3ACA +3AD4 003F; 3AD4 +3ADE 003F; 3ADE +3AE7 003F; 3AE7 +3AF1 003F; 3AF1 +3AFB 003F; 3AFB +3B05 003F; 3B05 +3B0E 003F; 3B0E +3B18 003F; 3B18 +3B21 003F; 3B21 +3B2B 003F; 3B2B +3B35 003F; 3B35 +3B3F 003F; 3B3F +2F8DE 0021; 2F8DE +3B52 003F; 3B52 +3B5C 003F; 3B5C +3B66 003F; 3B66 +3B70 003F; 3B70 +3B7A 003F; 3B7A +3B84 003F; 3B84 +3B8E 003F; 3B8E +3B98 003F; 3B98 +3BA1 003F; 3BA1 +3BAB 003F; 3BAB +3BB5 003F; 3BB5 +3BBF 003F; 3BBF +3BC9 003F; 3BC9 +3BD3 003F; 3BD3 +3BDD 003F; 3BDD +3BE7 003F; 3BE7 +3BF1 003F; 3BF1 +3BFB 003F; 3BFB +3C05 003F; 3C05 +3C0F 003F; 3C0F +3C18 0041; 3C18 +3C22 003F; 3C22 +3C2C 003F; 3C2C +3C36 003F; 3C36 +3C40 003F; 3C40 +3C4A 003F; 3C4A +3C53 003F; 3C53 +3C5D 003F; 3C5D +3C67 003F; 3C67 +3C71 003F; 3C71 +3C7B 003F; 3C7B +3C85 003F; 3C85 +3C8F 003F; 3C8F +3C99 003F; 3C99 +3CA3 003F; 3CA3 +3CAD 003F; 3CAD +3CB7 003F; 3CB7 +3CC1 003F; 3CC1 +3CCB 003F; 3CCB +3CD5 003F; 3CD5 +3CDF 003F; 3CDF +3CE9 003F; 3CE9 +3CF3 003F; 3CF3 +3CFD 003F; 3CFD +3D07 003F; 3D07 +3D11 003F; 3D11 +3D1B 003F; 3D1B +3D25 003F; 3D25 +3D2F 003F; 3D2F +3D38 003F; 3D38 +3D42 003F; 3D42 +3D4C 003F; 3D4C +3D56 003F; 3D56 +3D60 003F; 3D60 +3D6A 003F; 3D6A +3D74 003F; 3D74 +3D7E 003F; 3D7E +3D88 003F; 3D88 +3D92 003F; 3D92 +3D9B 003F; 3D9B +3DA5 003F; 3DA5 +3DAF 003F; 3DAF +3DB9 003F; 3DB9 +3DC3 003F; 3DC3 +3DCD 003F; 3DCD +3DD7 003F; 3DD7 +3DE1 003F; 3DE1 +3DEB 003F; 3DEB +3DF5 003F; 3DF5 +3DFF 003F; 3DFF +3E09 003F; 3E09 +3E13 003F; 3E13 +3E1D 003F; 3E1D +3E27 003F; 3E27 +3E31 003F; 3E31 +3E3B 003F; 3E3B +3E45 003F; 3E45 +3E4F 003F; 3E4F +3E59 003F; 3E59 +3E63 003F; 3E63 +3E6D 003F; 3E6D +3E77 003F; 3E77 +3E81 003F; 3E81 +3E8B 003F; 3E8B +3E95 003F; 3E95 +3E9F 003F; 3E9F +3EA9 003F; 3EA9 +3EB2 003F; 3EB2 +3EBA 003F; 3EBA +3EC4 003F; 3EC4 +3ECE 003F; 3ECE +3ED8 003F; 3ED8 +3EE2 003F; 3EE2 +3EEC 003F; 3EEC +3EF6 003F; 3EF6 +3F00 003F; 3F00 +3F0A 003F; 3F0A +3F14 003F; 3F14 +3F1D 003F; 3F1D +3F27 003F; 3F27 +3F31 003F; 3F31 +3F3B 003F; 3F3B +3F45 003F; 3F45 +3F4F 003F; 3F4F +3F59 003F; 3F59 +3F63 003F; 3F63 +3F6D 003F; 3F6D +3F77 003F; 3F77 +3F81 003F; 3F81 +3F8B 003F; 3F8B +3F95 003F; 3F95 +3F9F 003F; 3F9F +3FA9 003F; 3FA9 +3FB3 003F; 3FB3 +3FBD 003F; 3FBD +3FC7 003F; 3FC7 +3FD1 003F; 3FD1 +3FDB 003F; 3FDB +3FE5 003F; 3FE5 +3FEF 003F; 3FEF +3FF9 003F; 3FF9 +4002 003F; 4002 +400B 003F; 400B +4015 003F; 4015 +401F 003F; 401F +4029 003F; 4029 +4033 003F; 4033 +403C 003F; 403C +2F94B 0021; 2F94B +404F 003F; 404F +4059 003F; 4059 +4063 003F; 4063 +406D 003F; 406D +4077 003F; 4077 +4081 003F; 4081 +408B 003F; 408B +4095 003F; 4095 +409E 003F; 409E +40A8 003F; 40A8 +40B2 003F; 40B2 +40BC 003F; 40BC +40C6 003F; 40C6 +40D0 003F; 40D0 +40DA 003F; 40DA +40E3 0041; 40E3 +40ED 003F; 40ED +40F7 003F; 40F7 +4101 003F; 4101 +410B 003F; 410B +4115 003F; 4115 +411F 003F; 411F +4129 003F; 4129 +4132 003F; 4132 +413C 003F; 413C +4146 003F; 4146 +4150 003F; 4150 +415A 003F; 415A +4164 003F; 4164 +416E 003F; 416E +4178 003F; 4178 +4182 003F; 4182 +418C 003F; 418C +4196 003F; 4196 +41A0 003F; 41A0 +41AA 003F; 41AA +41B4 003F; 41B4 +41BE 003F; 41BE +41C8 003F; 41C8 +41D2 003F; 41D2 +41DC 003F; 41DC +41E6 003F; 41E6 +41F0 003F; 41F0 +41FA 003F; 41FA +4203 003F; 4203 +420D 003F; 420D +4217 003F; 4217 +4221 003F; 4221 +422A 003F; 422A +4234 003F; 4234 +423E 003F; 423E +4248 003F; 4248 +4252 003F; 4252 +425C 003F; 425C +4266 003F; 4266 +4270 003F; 4270 +427A 003F; 427A +4284 003F; 4284 +428E 003F; 428E +4298 003F; 4298 +42A1 003F; 42A1 +42AB 003F; 42AB +42B5 003F; 42B5 +42BF 003F; 42BF +42C9 003F; 42C9 +42D3 003F; 42D3 +42DD 003F; 42DD +42E7 003F; 42E7 +42F1 003F; 42F1 +42FB 003F; 42FB +4304 003F; 4304 +430E 003F; 430E +4318 003F; 4318 +4322 003F; 4322 +432C 003F; 432C +4335 003F; 4335 +433F 003F; 433F +4349 003F; 4349 +4353 003F; 4353 +435C 003F; 435C +4366 003F; 4366 +4370 003F; 4370 +437A 003F; 437A +4384 003F; 4384 +438E 003F; 438E +4398 003F; 4398 +43A2 003F; 43A2 +43AC 003F; 43AC +43B6 003F; 43B6 +43C0 003F; 43C0 +43CA 003F; 43CA +43D4 003F; 43D4 +43DC 003F; 43DC +43E6 003F; 43E6 +43F0 003F; 43F0 +43FA 003F; 43FA +4404 003F; 4404 +440D 003F; 440D +4417 003F; 4417 +4421 003F; 4421 +442B 003F; 442B +4435 003F; 4435 +443F 003F; 443F +4449 003F; 4449 +4453 003F; 4453 +445D 003F; 445D +4467 003F; 4467 +4470 003F; 4470 +447A 003F; 447A +4484 003F; 4484 +448E 003F; 448E +4498 003F; 4498 +44A2 003F; 44A2 +44AC 003F; 44AC +44B6 003F; 44B6 +44C0 003F; 44C0 +44CA 003F; 44CA +44D4 003F; 44D4 +44DE 003F; 44DE +44E8 003F; 44E8 +44F2 003F; 44F2 +44FC 003F; 44FC +4506 003F; 4506 +4510 003F; 4510 +451A 003F; 451A +4524 003F; 4524 +452D 003F; 452D +4537 003F; 4537 +4541 003F; 4541 +454B 003F; 454B +4555 003F; 4555 +455E 003F; 455E +4567 003F; 4567 +4570 003F; 4570 +457A 003F; 457A +4584 003F; 4584 +458E 003F; 458E +4598 003F; 4598 +45A2 003F; 45A2 +45AC 003F; 45AC +45B6 003F; 45B6 +45C0 003F; 45C0 +45CA 003F; 45CA +45D4 003F; 45D4 +45DD 003F; 45DD +45E7 003F; 45E7 +45F1 003F; 45F1 +45FA 003F; 45FA +4604 003F; 4604 +460E 003F; 460E +4618 003F; 4618 +4622 003F; 4622 +462C 003F; 462C +4635 0041; 4635 +463F 003F; 463F +4649 003F; 4649 +4653 003F; 4653 +465D 003F; 465D +4667 003F; 4667 +4671 003F; 4671 +467B 003F; 467B +4685 003F; 4685 +468F 003F; 468F +4699 003F; 4699 +46A3 003F; 46A3 +46AD 003F; 46AD +46B7 003F; 46B7 +46C0 003F; 46C0 +46C9 003F; 46C9 +46D3 003F; 46D3 +46DD 003F; 46DD +46E7 003F; 46E7 +46F1 003F; 46F1 +46FB 003F; 46FB +4705 003F; 4705 +470F 003F; 470F +4719 003F; 4719 +4723 003F; 4723 +472D 003F; 472D +4737 003F; 4737 +4741 003F; 4741 +474B 003F; 474B +4755 003F; 4755 +475F 003F; 475F +4769 003F; 4769 +4773 003F; 4773 +477D 003F; 477D +4787 003F; 4787 +4791 003F; 4791 +479B 003F; 479B +47A5 003F; 47A5 +47AF 003F; 47AF +47B9 003F; 47B9 +47C3 003F; 47C3 +47CD 003F; 47CD +47D7 003F; 47D7 +47E1 003F; 47E1 +47EB 003F; 47EB +47F5 003F; 47F5 +47FF 003F; 47FF +4809 003F; 4809 +4813 003F; 4813 +481D 003F; 481D +4827 003F; 4827 +4831 003F; 4831 +483B 003F; 483B +4845 003F; 4845 +484F 003F; 484F +4859 003F; 4859 +4863 003F; 4863 +486D 003F; 486D +4877 003F; 4877 +4881 003F; 4881 +488B 003F; 488B +4895 003F; 4895 +489F 003F; 489F +48A9 003F; 48A9 +48B3 003F; 48B3 +48BD 003F; 48BD +48C7 003F; 48C7 +48D1 003F; 48D1 +48DB 003F; 48DB +48E5 003F; 48E5 +48EF 003F; 48EF +48F9 003F; 48F9 +4903 003F; 4903 +490D 003F; 490D +4917 003F; 4917 +4921 003F; 4921 +492B 003F; 492B +4935 003F; 4935 +493F 003F; 493F +4949 003F; 4949 +4953 003F; 4953 +495D 003F; 495D +4967 003F; 4967 +4971 003F; 4971 +497B 003F; 497B +4985 003F; 4985 +498F 003F; 498F +4998 003F; 4998 +49A2 003F; 49A2 +49AC 003F; 49AC +49B6 003F; 49B6 +49C0 003F; 49C0 +49CA 003F; 49CA +49D4 003F; 49D4 +49DE 003F; 49DE +49E7 003F; 49E7 +49F1 003F; 49F1 +49FB 003F; 49FB +4A05 003F; 4A05 +4A0F 003F; 4A0F +4A19 003F; 4A19 +4A23 003F; 4A23 +4A2D 003F; 4A2D +4A37 003F; 4A37 +4A41 003F; 4A41 +4A4B 003F; 4A4B +4A55 003F; 4A55 +4A5F 003F; 4A5F +4A69 003F; 4A69 +4A72 003F; 4A72 +4A7B 003F; 4A7B +4A85 003F; 4A85 +4A8F 003F; 4A8F +4A99 003F; 4A99 +4AA3 003F; 4AA3 +4AAD 003F; 4AAD +4AB6 003F; 4AB6 +4AC0 003F; 4AC0 +4ACA 003F; 4ACA +4AD4 003F; 4AD4 +4ADE 003F; 4ADE +4AE8 003F; 4AE8 +4AF2 003F; 4AF2 +4AFC 003F; 4AFC +4B06 003F; 4B06 +4B10 003F; 4B10 +4B1A 003F; 4B1A +4B24 003F; 4B24 +4B2E 003F; 4B2E +4B37 003F; 4B37 +4B41 003F; 4B41 +4B4B 003F; 4B4B +4B55 003F; 4B55 +4B5F 003F; 4B5F +4B69 003F; 4B69 +4B73 003F; 4B73 +4B7D 003F; 4B7D +4B87 003F; 4B87 +4B91 003F; 4B91 +4B9B 003F; 4B9B +4BA5 003F; 4BA5 +4BAF 003F; 4BAF +4BB9 003F; 4BB9 +4BC3 003F; 4BC3 +4BCD 003F; 4BCD +4BD6 003F; 4BD6 +4BE0 003F; 4BE0 +4BEA 003F; 4BEA +4BF4 003F; 4BF4 +4BFE 003F; 4BFE +4C08 003F; 4C08 +4C12 003F; 4C12 +4C1C 003F; 4C1C +4C26 003F; 4C26 +4C30 003F; 4C30 +4C3A 003F; 4C3A +4C44 003F; 4C44 +4C4E 003F; 4C4E +4C58 003F; 4C58 +4C62 003F; 4C62 +4C6C 003F; 4C6C +4C76 003F; 4C76 +4C80 003F; 4C80 +4C8A 003F; 4C8A +4C94 003F; 4C94 +4C9E 003F; 4C9E +4CA8 003F; 4CA8 +4CB2 003F; 4CB2 +4CBC 003F; 4CBC +4CC6 003F; 4CC6 +4CCF 003F; 4CCF +4CD9 003F; 4CD9 +4CE3 003F; 4CE3 +2FA0E 0021; 2FA0E +4CF6 003F; 4CF6 +4CFF 003F; 4CFF +4D09 003F; 4D09 +4D13 003F; 4D13 +4D1D 003F; 4D1D +4D27 003F; 4D27 +4D31 003F; 4D31 +4D3B 003F; 4D3B +4D45 003F; 4D45 +4D4F 003F; 4D4F +4D58 003F; 4D58 +4D62 003F; 4D62 +4D6C 003F; 4D6C +4D76 003F; 4D76 +4D80 003F; 4D80 +4D8A 003F; 4D8A +4D94 003F; 4D94 +4D9E 003F; 4D9E +4DA8 003F; 4DA8 +4DB2 003F; 4DB2 +2F803 003F; 2F803 +2F860 003F; 2F860 +2F891 0041; 2F891 +2F8E3 003F; 2F8E3 +2F91D 003F; 2F91D +2F942 003F; 2F942 +2F95D 0041; 2F95D +2F97C 003F; 2F97C +2F9B1 003F; 2F9B1 +2F9ED 003F; 2F9ED +2FA12 003F; 2FA12 +2A6D6 003F; 2A6D6 +F8FC 003F; F8FC +E0004 003F; E0004 +F00FA 003F; F00FA +FFFF8 003F; FFFF8 +100004 003F; 100004 +10FF02 003F; 10FF02 diff --git a/icuSources/test/testdata/DataDrivenCollationTest.txt b/icuSources/test/testdata/DataDrivenCollationTest.txt index 1543f2ef..08773dce 100644 --- a/icuSources/test/testdata/DataDrivenCollationTest.txt +++ b/icuSources/test/testdata/DataDrivenCollationTest.txt @@ -1,337 +1,501 @@ -// Copyright (c) 2001-2003 International Business Machines -// Corporation and others. All Rights Reserved. -DataDrivenCollationTest { - Info { - Headers { "sequence" } - Description { "These are the data driven tests" } - LongDescription { "The following entries are separate tests containing test data for various locales." - "Each entry has the following fields: " - "Info/Description - short descrioption of the test" - "Settings - settings for the test." - "Settings/TestLocale - locale for the collator OR" - "Settings/Rules - rules for the collator (can't have both)" - "Settings/Arguments - arguments to be passed to the collator before testing. Use rule syntax." - "Cases - set of test cases, which are sequences of strings that will be parsed" - "Sequences must not change the sign of relation, i.e. we can only have < and = or" - "> and = in single sequence. Cannot mix < and > in the same sequence. Whitespace is" - "is ignored unless quoted." - } - } - TestData { - TestThaiPartialSortKeyProblems { - Info { - Description { "These are examples of strings that caused trouble in partial sort key testing." } - } - Settings { - { - TestLocale { "th_TH" } - } - } - // TODO: the tests that are commented out should be enabled when j2720 is fixed - Cases { "\u0E01\u0E01\u0E38\u0E18\u0E20\u0E31\u0E13\u0E11\u0E4C" - "<\u0E01\u0E01\u0E38\u0E2A\u0E31\u0E19\u0E42\u0E18", - "\u0E01\u0E07\u0E01\u0E32\u0E23" - "<\u0E01\u0E07\u0E42\u0E01\u0E49", - //"\u0E01\u0E23\u0E19\u0E17\u0E32" - //"<\u0E01\u0E23\u0E19\u0E19\u0E40\u0E0A\u0E49\u0E32", - "\u0E01\u0E23\u0E30\u0E40\u0E08\u0E35\u0E22\u0E27" - "<\u0E01\u0E23\u0E30\u0E40\u0E08\u0E35\u0E4A\u0E22\u0E27", - //"\u0E01\u0E23\u0E23\u0E40\u0E0A\u0E2D" - //"<\u0E01\u0E23\u0E23\u0E40\u0E0A\u0E49\u0E32" - } - } - TestJavaStyleRule { - Info { - Description { "java.text allows rules to start as '<<<x<<<y...' " - "we emulate this by assuming a &[first tertiary ignorable] " - "in this case." - } - } - Settings { - { - Rules { "=equal<<<z<<x<<<w<y &[first tertiary ignorable]=a &[first primary ignorable]=b" } - } - } - Cases { "a = equal < z < x < w < b < y" } - } - TestShiftedIgnorable { - Info { - Description { "New UCA states that primary ignorables should be completely " - "ignorable when following a shifted code point." - } - } - Settings { - { - TestLocale { "root" } - Arguments { "[alternate shifted][strength 4]" } - } - } - Cases { - "a' 'b=" - "a' '\u0300b=" - "a' '\u0301b<" - "a_b=" - "a_\u0300b=" - "a_\u0301b<" - "A' 'b=" - "A' '\u0300b=" - "A' '\u0301b<" - "A_b=" - "A_\u0300b=" - "A_\u0301b<" - "a\u0301b<" - "A\u0301b<" - "a\u0300b<" - "A\u0300b" - - } - } - - TestNShiftedIgnorable { - Info { - Description { "New UCA states that primary ignorables should be completely " - "ignorable when following a shifted code point." - } - } - Settings { - { - TestLocale { "root" } - Arguments { "[alternate non-ignorable][strength 3]" } - } - } - Cases { - "a' 'b<" - "A' 'b<" - "a' '\u0301b<" - "A' '\u0301b<" - "a' '\u0300b<" - "A' '\u0300b<" - "a_b<" - "A_b<" - "a_\u0301b<" - "A_\u0301b<" - "a_\u0300b<" - "A_\u0300b<" - "a\u0301b<" - "A\u0301b<" - "a\u0300b<" - "A\u0300b<" - } - } - - TestSafeSurrogates { - Info { - Description { "It turned out that surrogates were not skipped properly " - "when iterating backwards if they were in the middle of a " - "contraction. This test assures that this is fixed." - } - } - Settings { - { - Rules { - "&a < x\ud800\udc00b" - } - } - } - Cases { - "a<x\ud800\udc00b" - } - } - - TestCIgnorableContraction { - Info { - Description { "Checks whether completely ignorable code points are " - "skipped in contractions." - } - } - Settings { - { - TestLocale { "sh" } - } - { - Rules { - "& L < lj, Lj <<< LJ" - "& N < nj, Nj <<< NJ " - } - } - } - Cases { - "njiva=n\ud834\udd65jiva=n\uD834\uDD79jiva=n\u0000\u0000\u0000jiva=n\u0000jiva=n\ud800jiva=n\ufffejiva", - "ljubav=l\u0000jubav=l\uD834\uDD79jubav=l\u0000\u0000\u0000jubav=l\ud800jubav=l\ufffejubav", - "Ljubav=L\u0000jubav=L\uD834\uDD79jubav=L\u0000\u0000\u0000jubav=L\ud800jubav=L\ufffejubav", - } - } - - - TestCIgnorablePrefix { - Info { - Description { "Checks whether completely ignorable code points are " - "skipped in prefix processing." - } - } - Settings { - { - TestLocale { "ja" } - } - } - Cases { - "\u30A1\u30FC" - "= \u30A1\uDB40\uDC30\u30FC" - "= \u30A1\uD800\u30FC" - "= \u30A1\uFFFE\u30FC" - "= \u30A1\uD834\uDD79\u30FC" - "= \u30A1\u0000\u0000\u0000\u30FC" - "= \u30A1\u0000\u30FC" - "= \u30A1\u30FC" - "= \u30A1\u0000\u059a\u30FC" - "= \u30A1\u30FC" - } - } - - da_TestPrimary { - Info { - Description { "This test goes through primary strength cases" } - } - Settings { - { - TestLocale { "da" } - Arguments { "[strength 1]" } - } - } - Cases { - "Lvi=Lwi", - "L\u00e4vi<L\u00f6wi", - "L\u00fcbeck=Lybeck", - } - } - da_TestTertiary { - Info { - Description { "This test goes through tertiary strength cases" } - } - Settings { - { - TestLocale { "da" } - Arguments { "[strength 3]" } - } - } - Cases { - "Luc<luck", - "luck<L\u00fcbeck", - "L\u00fcbeck>lybeck", - "L\u00e4vi<L\u00f6we", - "L\u00f6ww<mast", - // constUCharCollationDanishTest::testBugs[][CollationDanishTest::MAX_TOKEN_LEN]=" - "A/S<" - "ANDRE<" - "ANDR\u00c9<" - "ANDREAS<" - "AS<" - "CA<" - "\u00c7A<" - "CB<" - "\u00c7C<" - "D.S.B.<" - "DA<" - "DB<" - "DSB<" - "DSC<" - "\u00d0A<" - "\u00d0C<" - "EKSTRA_ARBEJDE<" - "EKSTRABUD0<" - "H\u00d8ST<" - "HAAG<" - "H\u00c5NDBOG<" - "HAANDV\u00c6RKSBANKEN<" - "karl<" - "Karl<" - "'NIELS J\u00d8RGEN'<" - "NIELS-J\u00d8RGEN<" - "NIELSEN<" - "'R\u00c9E, A'<" - "'REE, B'<" - "'R\u00c9E, L'<" - "'REE, V'<" - "'SCHYTT, B'<" - "'SCHYTT, H'<" - "'SCH\u00dcTT, H'<" - "'SCHYTT, L'<" - "'SCH\u00dcTT, M'<" - "SS<" - "\u00df<" - "SSA<" - "'STORE VILDMOSE'<" - "STOREK\u00c6R0<" - "'STORM PETERSEN'<" - "STORMLY<" - "THORVALD<" - "THORVARDUR<" - "THYGESEN<" - "\u00feORVAR\u00d0UR<" - "'VESTERG\u00c5RD, A'<" - "'VESTERGAARD, A'<" - "'VESTERG\u00c5RD, B'<" - "\u00c6BLE<" - "\u00c4BLE<" - "\u00d8BERG<" - "\u00d6BERG", - - // constUCharCollationDanishTest::testNTList[][CollationDanishTest::MAX_TOKEN_LEN]=" - "andere<" - "chaque<" - "chemin<" - "cote<" - "cot\u00e9<" - "c\u00f4te<" - "c\u00f4t\u00e9<" - "\u010du\u010d\u0113t<" - "Czech<" - "hi\u0161a<" - "irdisch<" - "lie<" - "lire<" - "llama<" - "l\u00f5ug<" - "l\u00f2za<" - "lu\u010d<" - "luck<" - "L\u00fcbeck<" - "lye<" - "l\u00e4vi<" - "L\u00f6wen<" - "m\u00e0\u0161ta<" - "m\u00eer<" - "myndig<" - "M\u00e4nner<" - "m\u00f6chten<" - "pi\u00f1a<" - "pint<" - "pylon<" - "\u0161\u00e0ran<" - "savoir<" - "\u0160erb\u016bra<" - "Sietla<" - "\u015blub<" - "subtle<" - "symbol<" - "s\u00e4mtlich<" - "waffle<" - "verkehrt<" - "wood<" - "vox<" - "v\u00e4ga<" - "yen<" - "yuan<" - "yucca<" - "\u017eal<" - "\u017eena<" - "\u017den\u0113va<" - "zoo0<" - "Zviedrija<" - "Z\u00fcrich<" - "zysk0<" - "\u00e4ndere" - } - } - } +// Copyright (c) 2001-2004 International Business Machines +// Corporation and others. All Rights Reserved. +DataDrivenCollationTest { + Info { + Headers { "sequence" } + Description { "These are the data driven tests" } + LongDescription { "The following entries are separate tests containing test data for various locales." + "Each entry has the following fields: " + "Info/Description - short descrioption of the test" + "Settings - settings for the test." + "Settings/TestLocale - locale for the collator OR" + "Settings/Rules - rules for the collator (can't have both)" + "Settings/Arguments - arguments to be passed to the collator before testing. Use rule syntax." + "Cases - set of test cases, which are sequences of strings that will be parsed" + "Sequences must not change the sign of relation, i.e. we can only have < and = or" + "> and = in single sequence. Cannot mix < and > in the same sequence. Whitespace is" + "is ignored unless quoted." + } + } + TestData { + TestLithuanian { + Info { + Description { "Lithuanian sort order." } + } + Settings { + { + TestLocale { "lt" } + } + } + Cases { "cz<č<d<iz<y<j<sz<š<t<zz<ž" } + } + TestLatvian { + Info { + Description { "Latvian sort order." } + } + Settings { + { + TestLocale { "lv" } + } + } + Cases { "cz<č<d<gz<ģ<h<iz<y<j<kz<ķ<l<lz<ļ<m<nz<ņ<o<rz<ŗ<s<sz<š<t<zz<ž" } + } + TestEstonian { + Info { + Description { "Estonian sort order." } + } + Settings { + { + TestLocale { "et" } + } + } + Cases { "sy<š<šy<z<zy<ž<v<w<va<õ<õy<ä<äy<ö<öy<ü<üy<x" } + } + TestAlbanian { + Info { + Description { "Albanian sort order." } + } + Settings { + { + TestLocale { "sq" } + } + } + Cases { "cz<ç<d<dz<dh<e<ez<ë<f<gz<gj<h<lz<ll<m<nz<nj<o<rz<rr<s<sz<sh<t<tz<th<u<xz<xh<y<zz<zh" } + } + + TestSimplifiedChineseOrder { + Info { + Description { "Sorted file has different order." } + } + Settings { + { + TestLocale { "root" } + Arguments { "[normalization on]" } + } + } + + Cases { "\u5F20<\u5F20\u4E00\u8E3F" } + } + + TestTibetanNormalizedIterativeCrash { + Info { + Description { "This pretty much crashes." } + } + Settings { + { + TestLocale { "root" } + } + } + + Cases { "\u0f71\u0f72\u0f80\u0f71\u0f72" + "<\u0f80" + } + } + TestThaiPartialSortKeyProblems { + Info { + Description { "These are examples of strings that caused trouble in partial sort key testing." } + } + Settings { + { + TestLocale { "th_TH" } + } + } + // TODO: the tests that are commented out should be enabled when j2720 is fixed + Cases { "\u0E01\u0E01\u0E38\u0E18\u0E20\u0E31\u0E13\u0E11\u0E4C" + "<\u0E01\u0E01\u0E38\u0E2A\u0E31\u0E19\u0E42\u0E18", + "\u0E01\u0E07\u0E01\u0E32\u0E23" + "<\u0E01\u0E07\u0E42\u0E01\u0E49", + "\u0E01\u0E23\u0E19\u0E17\u0E32" + "<\u0E01\u0E23\u0E19\u0E19\u0E40\u0E0A\u0E49\u0E32", + "\u0E01\u0E23\u0E30\u0E40\u0E08\u0E35\u0E22\u0E27" + "<\u0E01\u0E23\u0E30\u0E40\u0E08\u0E35\u0E4A\u0E22\u0E27", + "\u0E01\u0E23\u0E23\u0E40\u0E0A\u0E2D" + "<\u0E01\u0E23\u0E23\u0E40\u0E0A\u0E49\u0E32" + } + } + TestJavaStyleRule { + Info { + Description { "java.text allows rules to start as '<<<x<<<y...' " + "we emulate this by assuming a &[first tertiary ignorable] " + "in this case." + } + } + Settings { + { + Rules { "=equal<<<z<<x<<<w<y &[first tertiary ignorable]=a &[first primary ignorable]=b" } + } + } + Cases { "a = equal < z < x < w < b < y" } + } + TestShiftedIgnorable { + Info { + Description { "New UCA states that primary ignorables should be completely " + "ignorable when following a shifted code point." + } + } + Settings { + { + TestLocale { "root" } + Arguments { "[alternate shifted][strength 4]" } + } + } + Cases { + "a' 'b=" + "a' '\u0300b=" + "a' '\u0301b<" + "a_b=" + "a_\u0300b=" + "a_\u0301b<" + "A' 'b=" + "A' '\u0300b=" + "A' '\u0301b<" + "A_b=" + "A_\u0300b=" + "A_\u0301b<" + "a\u0301b<" + "A\u0301b<" + "a\u0300b<" + "A\u0300b" + + } + } + + TestNShiftedIgnorable { + Info { + Description { "New UCA states that primary ignorables should be completely " + "ignorable when following a shifted code point." + } + } + Settings { + { + TestLocale { "root" } + Arguments { "[alternate non-ignorable][strength 3]" } + } + } + Cases { + "a' 'b<" + "A' 'b<" + "a' '\u0301b<" + "A' '\u0301b<" + "a' '\u0300b<" + "A' '\u0300b<" + "a_b<" + "A_b<" + "a_\u0301b<" + "A_\u0301b<" + "a_\u0300b<" + "A_\u0300b<" + "a\u0301b<" + "A\u0301b<" + "a\u0300b<" + "A\u0300b<" + } + } + + TestSafeSurrogates { + Info { + Description { "It turned out that surrogates were not skipped properly " + "when iterating backwards if they were in the middle of a " + "contraction. This test assures that this is fixed." + } + } + Settings { + { + Rules { + "&a < x\ud800\udc00b" + } + } + } + Cases { + "a<x\ud800\udc00b" + } + } + + TestCIgnorableContraction { + Info { + Description { "Checks whether completely ignorable code points are " + "skipped in contractions." + } + } + Settings { + { + TestLocale { "sh" } + } + { + Rules { + "& L < lj, Lj <<< LJ" + "& N < nj, Nj <<< NJ " + } + } + } + Cases { + "njiva=n\ud834\udd65jiva=n\uD834\uDD79jiva=n\u0000\u0000\u0000jiva=n\u0000jiva=n\ud800jiva=n\ufffejiva", + "ljubav=l\u0000jubav=l\uD834\uDD79jubav=l\u0000\u0000\u0000jubav=l\ud800jubav=l\ufffejubav", + "Ljubav=L\u0000jubav=L\uD834\uDD79jubav=L\u0000\u0000\u0000jubav=L\ud800jubav=L\ufffejubav", + } + } + + + TestCIgnorablePrefix { + Info { + Description { "Checks whether completely ignorable code points are " + "skipped in prefix processing." + } + } + Settings { + { + TestLocale { "ja" } + } + } + Cases { + "\u30A1\u30FC" + "= \u30A1\uDB40\uDC30\u30FC" + "= \u30A1\uD800\u30FC" + "= \u30A1\uFFFE\u30FC" + "= \u30A1\uD834\uDD79\u30FC" + "= \u30A1\u0000\u0000\u0000\u30FC" + "= \u30A1\u0000\u30FC" + "= \u30A1\u30FC" + "= \u30A1\u0000\u059a\u30FC" + "= \u30A1\u30FC" + } + } + da_TestPrimary { + Info { + Description { "This test goes through primary strength cases" } + } + Settings { + { + TestLocale { "da" } + Arguments { "[strength 1]" } + } + } + Cases { + "Lvi<Lwi", + "L\u00e4vi<L\u00f6wi", + "L\u00fcbeck=Lybeck", + } + } + da_TestTertiary { + Info { + Description { "This test goes through tertiary strength cases" } + } + Settings { + { + TestLocale { "da" } + Arguments { "[strength 3]" } + } + } + Cases { + "Luc<luck", + "luck<L\u00fcbeck", + "L\u00fcbeck>lybeck", + "L\u00e4vi<L\u00f6we", + "L\u00f6ww<mast", + // constUCharCollationDanishTest::testBugs[][CollationDanishTest::MAX_TOKEN_LEN]=" + "A/S<" + "ANDRE<" + "ANDR\u00c9<" + "ANDREAS<" + "AS<" + "CA<" + "\u00c7A<" + "CB<" + "\u00c7C<" + "D.S.B.<" + "DA<" + "\u00d0A<" + "DB<" + "\u00d0C<" + "DSB<" + "DSC<" + "EKSTRA_ARBEJDE<" + "EKSTRABUD0<" + "H\u00d8ST<" + "HAAG<" + "H\u00c5NDBOG<" + "HAANDV\u00c6RKSBANKEN<" + "Karl<" + "karl<" + "'NIELS J\u00d8RGEN'<" + "NIELS-J\u00d8RGEN<" + "NIELSEN<" + "'R\u00c9E, A'<" + "'REE, B'<" + "'R\u00c9E, L'<" + "'REE, V'<" + "'SCHYTT, B'<" + "'SCHYTT, H'<" + "'SCH\u00dcTT, H'<" + "'SCHYTT, L'<" + "'SCH\u00dcTT, M'<" + "SS<" + "\u00df<" + "SSA<" + "'STORE VILDMOSE'<" + "STOREK\u00c6R0<" + "'STORM PETERSEN'<" + "STORMLY<" + "THORVALD<" + "THORVARDUR<" + "\u00feORVAR\u00d0UR<" + "THYGESEN<" + "'VESTERG\u00c5RD, A'<" + "'VESTERGAARD, A'<" + "'VESTERG\u00c5RD, B'<" + "\u00c6BLE<" + "\u00c4BLE<" + "\u00d8BERG<" + "\u00d6BERG", + + // constUCharCollationDanishTest::testNTList[][CollationDanishTest::MAX_TOKEN_LEN]=" + "andere<" + "chaque<" + "chemin<" + "cote<" + "cot\u00e9<" + "c\u00f4te<" + "c\u00f4t\u00e9<" + "\u010du\u010d\u0113t<" + "Czech<" + "hi\u0161a<" + "irdisch<" + "lie<" + "lire<" + "llama<" + "l\u00f5ug<" + "l\u00f2za<" + "lu\u010d<" + "luck<" + "L\u00fcbeck<" + "lye<" + "l\u00e4vi<" + "L\u00f6wen<" + "m\u00e0\u0161ta<" + "m\u00eer<" + "myndig<" + "M\u00e4nner<" + "m\u00f6chten<" + "pi\u00f1a<" + "pint<" + "pylon<" + "\u0161\u00e0ran<" + "savoir<" + "\u0160erb\u016bra<" + "Sietla<" + "\u015blub<" + "subtle<" + "symbol<" + "s\u00e4mtlich<" + "verkehrt<" + "vox<" + "v\u00e4ga<" + "waffle<" + "wood<" + "yen<" + "yuan<" + "yucca<" + "\u017eal<" + "\u017eena<" + "\u017den\u0113va<" + "zoo0<" + "Zviedrija<" + "Z\u00fcrich<" + "zysk0<" + "\u00e4ndere" + } + } + hi_TestNewRules { + Info { + Description { "This test goes through new rules and tests against old rules" } + } + Settings { + { + TestLocale { "hi" } + } + } + Cases { + "ॐ<।<॥<॰<०<१<२<३" + "<४<५<६<७<८<९<अ<आ" + "<इ<ई<उ<ऊ<ऋ<ॠ<ऌ<ॡ" + "<ऍ<ऎ<ए<ऐ<ऑ<ऒ<ओ<औ" + "<क<क़=क़<कँ<कं<कः<क॑<क॒" + "<क॓<क॔<कऽ<क्<का<कि<की<कु" + "<कू<कृ<कॄ<कॢ<कॣ<कॅ<कॆ<के" + "<कै<कॉ<कॊ<को<कौ<ख<ख़ =ख़<खँ<खं<खः" + "<ख॑<ख॒<ख॓<ख॔<खऽ<ख्<खा<खि" + "<खी<खु<खू<खृ<खॄ<खॢ<खॣ<खॅ" + "<खॆ<खे<खै<खॉ<खॊ<खो<खौ<ग" + "<ग़=ग़<गँ<गं<गः<ग॑<ग॒<ग॓<ग॔" + "<गऽ<ग्<गा<गि<गी<गु<गू<गृ" + "<गॄ<गॢ<गॣ<गॅ<गॆ<गे<गै<गॉ" + "<गॊ<गो<गौ<घ<ङ<च<छ<ज<ज़ =ज़<जँ<जं<जः" + "<ज॑<ज॒<ज॓<ज॔<जऽ<ज्<जा<जि" + "<जी<जु<जू<जृ<जॄ<जॢ<जॣ<जॅ" + "<जॆ<जे<जै<जॉ<जॊ<जो<जौ<झ" + "<ञ<ट<ठ<ड<ड़=ड़<डँ<डं<डः<ड॑<ड॒<ड॓<ड॔" + "<डऽ<ड्<डा<डि<डी<डु<डू<डृ" + "<डॄ<डॢ<डॣ<डॅ<डॆ<डे<डै<डॉ" + "<डॊ<डो<डौ<ढ<ढ़=ढ़<ढँ<ढं<ढः" + "<ढ॑<ढ॒<ढ॓<ढ॔<ढऽ<ढ्<ढा<ढि" + "<ढी<ढु<ढू<ढृ<ढॄ<ढॢ<ढॣ<ढॅ" + "<ढॆ<ढे<ढै<ढॉ<ढॊ<ढो<ढौ<ण" + "<त<थ<द<ध<न<ऩ =ऩ< नँ<नं< नः" + "<न॑<न॒<न॓<न॔<नऽ<न्<ना<नि" + "<नी<नु<नू<नृ<नॄ<नॢ<नॣ<नॅ" + "<नॆ<ने<नै<नॉ<नॊ<नो<नौ" + "<प<फ<फ़=फ़<फँ<फं<फः<फ॑<फ॒" + "<फ॓<फ॔<फऽ<फ्<फा<फि<फी<फु<फू<फृ" + "<फॄ<फॢ<फॣ<फॅ<फॆ<फे<फै<फॉ" + "<फॊ<फो<फौ<ब<भ<म<य<य़=य़ " + "<यँ<यं<यः<य॑<य॒<य॓<य॔" + "<यऽ<य्<या<यि<यी<यु<यू<यृ" + "<यॄ<यॢ<यॣ<यॅ<यॆ<ये<यै<यॉ" + "<यॊ<यो<यौ<र<ऱ=ऱ<रँ<रं<रः" + "<र॑<र॒<र॓<र॔<रऽ<र्<रा<रि" + "<री<रु<रू<रृ<रॄ<रॢ<रॣ<रॅ" + "<रॆ<रे<रै<रॉ<रॊ<रो<रौ" + "<ल<ळ<ऴ=ऴ<ळँ<ळं<ळः<ळ॑<ळ॒" + "<ळ॓<ळ॔<ळऽ<ळ्<ळा<ळि<ळी<ळु" + "<ळू<ळृ<ळॄ<ळॢ<ळॣ<ळॅ<ळॆ<ळे" + "<ळै<ळॉ<ळॊ<ळो<ळौ<व<श<ष<स<ह" + "<़<ँ<ं<ः<॑<॒<॓<॔<ऽ<्<ा<ि<ी" + "<ु<ू<ृ<ॄ<ॢ<ॣ<ॅ<ॆ" + "<े<ै<ॉ<ॊ<ो<ौ" + } + } + fi_TestNewRules { + Info { + Description { "This test goes through new rules and tests against old rules" } + } + Settings { + { + TestLocale { "fi" } + } + } + Cases { + "xa<xA<Xa<XA<xá<Xá<xax<xAx<xáx<xd<Xd<xð<xÐ<Xð<XÐ<xđ<xĐ<Xđ<XĐ<" + "xdx<xðx<xÐx<xđx<xĐx<xe<Xe<xex<xn<Xn<xŋ<xŊ<Xŋ<XŊ<xnx<xŋx<xŊx<" + "xo<Xo<xó<Xó<xox<xóx<xs<Xs<xß<Xß<xßx<xsx<xt<Xt<xþ<xÞ<Xþ<XÞ<xþx<" + "xÞx<xtx<xu<Xu<xú<Xú<xux<xúx<xv<Xv<xw<Xw<xvx<xwx<xy<Xy<xü<Xü<" + "xű<Xű<xyx<xüx<xűx<xz<Xz<xzx<xå<Xå<xåx<xä<Xä<xæ<xÆ<Xæ<XÆ<xäx<" + "xæx<xÆx<xö<Xö<xø<Xø<xő<Xő<xõ<Xõ<xœ<xŒ<Xœ<XŒ<xöx<xøx<xőx<xõx<xœx<xŒx" + } + } + ro_TestNewRules { + Info { + Description { "This test goes through new rules and tests against old rules" } + } + Settings { + { + TestLocale { "ro" } + } + } + Cases { + "xAx<xă<xĂ<Xă<XĂ<xăx<xĂx<xâ<xÂ<Xâ<XÂ<xâx<xÂx<xb<xIx<xî<xÎ<Xî<XÎ<xîx<xÎx<" + "xj<xSx<xș=xş<xȘ=xŞ<Xș=Xş<XȘ=XŞ<xșx=xşx<xȘx=xŞx<xT<xTx<xț=xţ<xȚ=xŢ<Xț=Xţ<XȚ" + "=XŢ<xțx=xţx<xȚx=xŢx<xU" + } + } + } } \ No newline at end of file diff --git a/icuSources/test/testdata/Makefile.in b/icuSources/test/testdata/Makefile.in index bcb943f5..7b47e4cc 100644 --- a/icuSources/test/testdata/Makefile.in +++ b/icuSources/test/testdata/Makefile.in @@ -1,6 +1,6 @@ #****************************************************************************** # -# Copyright (C) 1998-2000, International Business Machines +# Copyright (C) 1998-2004, International Business Machines # Corporation and others. All Rights Reserved. # #****************************************************************************** @@ -18,29 +18,18 @@ include $(top_builddir)/icudefs.mk ## Build directory information subdir = test/testdata -## Optional directory setup -@EXTRAS_TRUE@EXTRA = extra -@EXTRAS_FALSE@EXTRA = -@TESTS_TRUE@TEST = test -@TESTS_FALSE@TEST = -@SAMPLES_TRUE@SAMPLE = samples -@SAMPLES_FALSE@SAMPLE = - - ## Files to remove for 'make clean' CLEANFILES = *~ -DOCDIRS = SUBDIRS = -## Extra files to install [nothing at present] -EXTRA_DATA = - ## List of phony targets .PHONY : all all-local all-recursive install install-local install-udata install-udata-files install-udata-dlls \ install-recursive clean clean-local clean-recursive distclean \ distclean-local distclean-recursive doc dist dist-local dist-recursive \ -check check-local check-recursive builddata +check check-local check-recursive build-dir + +.NOTPARALLEL: build-dir ## Clear suffix list .SUFFIXES : @@ -53,25 +42,7 @@ distclean : distclean-recursive distclean-local dist: dist-recursive dist-local check: all check-recursive check-local -## Recursive targets -all-recursive install-recursive clean-recursive distclean-recursive dist-recursive check-recursive: - @dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "$(MAKE)[$(MAKELEVEL)]: Making \`$$target' in \`$$subdir'"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-local"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $$local_target) || exit; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) "$$target-local" || exit; \ - fi - -all-local: builddata +all-local: build-dir build-testdata testdata packagetest install-local: @@ -79,27 +50,141 @@ dist-local: clean-local: test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES) -ifneq ($(wildcard .links),) - $(RMV) *.goo *.txt *.bin .links -endif + $(RMV) $(TESTOUTDIR) distclean-local: clean-local - $(RMV) Makefile + $(RMV) Makefile pkgdata.inc check-local: -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ - && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status -builddata: default.goo +pkgdata.inc: $(srcdir)/pkgdata.inc.in Makefile $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status -ifneq ($(srcdir),.) -default.goo: $(srcdir)/default.goo - $(RMV) *.goo *.txt *.bin - ln -s $(srcdir)/*.goo $(srcdir)/*.txt $(srcdir)/*.bin . - touch .links +######################################################################### +############################## Test ## stuff ############################ +ifeq ($(PKGDATA_OPTS),) +PKGDATA_OPTS = -O $(top_builddir)/test/testdata/pkgdata.inc endif +# relative lib links from pkgdata are the same as for tmp +GENRBOPTS=-k +TOOLDIR=$(top_builddir)/tools +SRCDATADIR=$(top_srcdir)/data +UNICODEDATADIR=$(SRCDATADIR)/unidata +OUTDIR=$(top_builddir)/data/out +OUTTMPDIR=$(top_builddir)/data/out/tmp +BUILDDIR=$(OUTDIR)/build/$(ICUDATA_PLATFORM_NAME) +TESTSRCDATADIR=$(top_srcdir)/test/testdata +TESTOUTDIR=$(top_builddir)/test/testdata/out +BUILD_DIRS = $(TESTOUTDIR) $(TESTBUILDDIR) + +PKGDATA = $(BINDIR)/pkgdata $(PKGDATA_OPTS) -q -c -s $(CURDIR)/out/build/$(ICUDATA_PLATFORM_NAME) +PKGDATA_INVOKE:=$(INVOKE) $(PKGDATA_INVOKE_OPTS) + +# Contains all 'intermediate' files (and temp files) except for 'unpackaged data' below +TESTBUILDDIR=$(TESTOUTDIR)/build + +# unpackaged files - live in 'out' so that the path can find them as part of the pkg +UNPACKAGEDTESTDATA=$(TESTOUTDIR)/$(TESTDT)nam.typ + +# pkg name for testdata +TESTDATA=testdata +# prefix for files that are testdata +TESTDT=$(TESTDATA)_ + +# File definitions +TEST_DAT_FILES=$(TESTBUILDDIR)/$(TESTDT)test.icu $(TESTBUILDDIR)/$(TESTDT)nfscsi.spp $(TESTBUILDDIR)/$(TESTDT)nfscss.spp $(TESTBUILDDIR)/$(TESTDT)nfscis.spp $(TESTBUILDDIR)/$(TESTDT)nfsmxs.spp $(TESTBUILDDIR)/$(TESTDT)nfsmxp.spp + +TEST_UCM_SOURCE= test1.ucm test3.ucm test4.ucm test4x.ucm ibm9027.ucm +TEST_UCM_FILES=$(TEST_UCM_SOURCE:%=$(TESTSRCDATADIR)/data/%) +TEST_CNV_FILES=$(TEST_UCM_SOURCE:%.ucm=$(TESTBUILDDIR)/$(TESTDT)%.cnv) + +TEST_RES = casing.txt mc.txt root.txt te.txt te_IN.txt testtypes.txt testaliases.txt testempty.txt structLocale.txt DataDrivenCollationTest.txt idna_rules.txt conversion.txt icuio.txt testtable32.txt +TEST_RES_FILES=$(TEST_RES:%.txt=$(TESTBUILDDIR)/$(TESTDT)%.res) $(TESTBUILDDIR)/$(TESTDT)iscii.res $(TESTSRCDATADIR)/$(TESTDT)icu26_testtypes.res $(TESTSRCDATADIR)/$(TESTDT)icu26e_testtypes.res + +ALL_TEST_FILES = $(TEST_DAT_FILES) $(TEST_BRK_FILES) $(TEST_CNV_FILES) $(TEST_RES_FILES) $(TESTOUTDIR)/$(TESTDT)nam.typ + +# list + +$(TESTBUILDDIR)/testdata.lst: $(SRCLISTDEPS) + @echo "generating $@ (list of data files)" + @-$(RMV) $@ + @for file in $(TEST_RES_FILES) $(TEST_DAT_FILES) $(TEST_CNV_FILES); do \ + echo $$file >> $@; \ + done; + + +build-testdata: build-dir $(ALL_TEST_FILES) $(TESTBUILDDIR)/testdata.lst $(TESTBUILDDIR)/$(TESTDT)iscii.res + +# test.icu +$(TESTBUILDDIR)/$(TESTDT)test.icu: $(TOOLDIR)/gentest/gentest$(EXEEXT) + $(INVOKE) $(TOOLDIR)/gentest/gentest -d $(TESTBUILDDIR) + +$(TESTBUILDDIR)/testtable32.txt: $(TOOLDIR)/gentest/gentest$(EXEEXT) + $(INVOKE) $(TOOLDIR)/gentest/gentest -r -d $(TESTBUILDDIR) + +$(TESTBUILDDIR)/$(TESTDT)testtable32.res: $(TESTBUILDDIR)/testtable32.txt $(BINDIR)/genrb$(EXEEXT) + $(INVOKE) $(BINDIR)/genrb $(GENRBOPTS) -p $(TESTDATA) -q -s $(TESTBUILDDIR) -i $(BUILDDIR) -d $(TESTBUILDDIR) $(<F) + +# Targets for nfscsi.spp +$(TESTBUILDDIR)/$(TESTDT)nfscsi.spp: $(BINDIR)/gensprep$(EXEEXT) $(TESTSRCDATADIR)/nfs4_cs_prep_ci.txt + @echo Building nfscsi.icu + $(INVOKE) $(BINDIR)/gensprep -s $(TESTSRCDATADIR) -i $(BUILDDIR) -d $(TESTBUILDDIR) -b nfscsi -p $(TESTDATA) -u 3.2.0 nfs4_cs_prep_ci.txt + +# Targets for nfscss.spp +$(TESTBUILDDIR)/$(TESTDT)nfscss.spp: $(BINDIR)/gensprep$(EXEEXT) $(TESTSRCDATADIR)/nfs4_cs_prep_cs.txt + @echo Building nfscss.icu + $(INVOKE) $(BINDIR)/gensprep -s $(TESTSRCDATADIR) -i $(BUILDDIR) -d $(TESTBUILDDIR) -b nfscss -p $(TESTDATA) -u 3.2.0 nfs4_cs_prep_cs.txt + +# Targets for nfscis.spp +$(TESTBUILDDIR)/$(TESTDT)nfscis.spp: $(BINDIR)/gensprep$(EXEEXT) $(TESTSRCDATADIR)/nfs4_cis_prep.txt + @echo Building nfscis.spp + $(INVOKE) $(BINDIR)/gensprep -s $(TESTSRCDATADIR) -i $(BUILDDIR) -d $(TESTBUILDDIR) -b nfscis -p $(TESTDATA) -k -n $(UNICODEDATADIR) -u 3.2.0 nfs4_cis_prep.txt + +# Targets for nfsmxs.spp +$(TESTBUILDDIR)/$(TESTDT)nfsmxs.spp: $(BINDIR)/gensprep$(EXEEXT) $(TESTSRCDATADIR)/nfs4_mixed_prep_s.txt + @echo Building nfsmxs.spp + $(INVOKE) $(BINDIR)/gensprep -s $(TESTSRCDATADIR) -i $(BUILDDIR) -d $(TESTBUILDDIR) -b nfsmxs -p $(TESTDATA) -k -n $(UNICODEDATADIR) -u 3.2.0 nfs4_mixed_prep_s.txt + +# Targets for nfsmxp.spp +$(TESTBUILDDIR)/$(TESTDT)nfsmxp.spp: $(BINDIR)/gensprep$(EXEEXT) $(TESTSRCDATADIR)/nfs4_mixed_prep_p.txt + @echo Building nfsmxp.spp + $(INVOKE) $(BINDIR)/gensprep -s $(TESTSRCDATADIR) -i $(BUILDDIR) -d $(TESTBUILDDIR) -b nfsmxp -p $(TESTDATA) -k -n $(UNICODEDATADIR) -u 3.2.0 nfs4_mixed_prep_p.txt + +$(TESTBUILDDIR)/$(TESTDT)%.cnv: $(TESTSRCDATADIR)/%.ucm $(BINDIR)/makeconv$(EXEEXT) + $(INVOKE) $(BINDIR)/makeconv -p $(TESTDATA) -c -d $(TESTBUILDDIR) $(TESTSRCDATADIR)/$(<F) + +$(TESTBUILDDIR)/$(TESTDT)%.res: $(TESTSRCDATADIR)/%.txt $(BINDIR)/genrb$(EXEEXT) $(DAT_FILES) + $(INVOKE) $(BINDIR)/genrb $(GENRBOPTS) -p $(TESTDATA) -q -s $(TESTSRCDATADIR) -i $(BUILDDIR) -d $(TESTBUILDDIR) $(<F) + +$(TESTBUILDDIR)/$(TESTDT)iscii.res: $(TESTSRCDATADIR)/iscii.bin $(BINDIR)/genrb$(EXEEXT) + @echo Testing genrb -e option + @ICU_DATA=$(BUILDDIR) $(INVOKE) $(BINDIR)/genrb $(GENRBOPTS) -s $(TESTSRCDATADIR) -p $(TESTDATA) -eISCII,version=0 -d $(TESTBUILDDIR) $(<F) >/dev/null || ( echo "WARNING: could not open ISCII - it may have been disabled." | tee $@ ) + @echo Finished testing genrb -e option + +################################################################### TYP +# TYP FILES + +$(TESTOUTDIR)/$(TESTDT)nam.typ: $(TESTBUILDDIR)/$(TESTDT)te_IN.res + cp $< $@ + + +testdata: build-dir $(ALL_TEST_FILES) $(UNPACKAGEDTESTDATA) + +#$(ALL_TEST_FILES) $(TESTBUILDDIR)/testtable32.txt $(TESTBUILDDIR)/testdata.lst: build-dir + +packagetest: build-dir testdata pkgdata.inc $(TESTBUILDDIR)/testdata.lst + $(PKGDATA_INVOKE) $(PKGDATA) -T $(TESTBUILDDIR) -d $(TESTOUTDIR) -s $(TESTBUILDDIR) -p $(TESTDATA) -m common $(TESTBUILDDIR)/testdata.lst + +build-dir: $(BUILD_DIRS) +$(BUILD_DIRS): + -$(MKINSTALLDIRS) $(BUILD_DIRS) + + diff --git a/icuSources/test/testdata/NumberFormatTestCases.txt b/icuSources/test/testdata/NumberFormatTestCases.txt new file mode 100644 index 00000000..5003e6df --- /dev/null +++ b/icuSources/test/testdata/NumberFormatTestCases.txt @@ -0,0 +1,85 @@ +###################################################################### +# Copyright (c) 2004, International Business Machines +# Corporation and others. All Rights Reserved. +###################################################################### +# Author: Alan Liu +# Created: March 15 2004 +# Since: ICU 3.0 +###################################################################### + +ref= "#.#" + +rt: "0.###" 1.0 "1" + +# Basics +fp: "0.####" 0.10005 "0.1" 0.1 +fp: - 0.10006 "0.1001" 0.1001 +pat: - "#0.####" +fp: "#.####" 0.10005 "0.1" 0.1 +pat: - "#0.####" + +rt: "0" 1234 "1234" +pat: - "#0" + +# Significant digits +fp: "@@@" 1.234567 "1.23" 1.23 +fp: - 1234567 "1230000" 1230000 +fp: - 0.012345 "0.0123" 0.0123 +pat: - - +fp: "#,@@@" 1234567 "1,230,000" 1230000 +pat: - "#,@@@" +rt: "@@@@" 0.0012 "0.001200" +fp: - 0.99999 "1.000" 1 +pat: - - +rt: "@###" 0.00123 "0.00123" +rt: - 123000 "123000" +fp: - 123456 "123500" 123500 +fp: - 12.3456 "12.35" 12.35 +fp: - 0.0123456 "0.01235" 0.01235 +pat: - - +fp: "@,###" 27182 "27,180" 27180 +rt: - 123000 "123,000" +fp: - 0.99999 "1" 1 +rt: - 0.9999 "0.9999" +pat: - - +rt: "@##E0" 20000 "2E4" +rt: - 27000 "2.7E4" +rt: - 27100 "2.71E4" +fp: - 27182 "2.72E4" 27200 +pat: - - +rt: "@@@E0" 20000 "2.00E4" +rt: - 27000 "2.70E4" +rt: - 27100 "2.71E4" +fp: - 27182 "2.72E4" 27200 +pat: - - +fp: "#,@@##" 314156 "31,4200" 314200 +rt: - 3 "3.0" +rt: - 5000 "5000" +rt: - 0.005 "0.0050" +pat: - - +fp: "@@@@@@" 123456.7 "123457" 123457 +pat: - - + +pat: "##,@@##" "#,@@##" +pat: "##@@##" "@@##" + +pat: "@@.@@" err # decimal sep. disallowed in sig. digits +pat: "@#@" err # only one cluster of sig. digits +pat: "@@0" err # either @ or 0, not both + +# NumberRegression/Test4140009 +rt: "" 123.456 "123.456" +rt: "" -123.456 "-123.456" + +# Currency +fpc: "en_US" 1234.56/USD "$1,234.56" 1234.56/USD +fpc: - 1234.56/JPY "\u00A51,235" 1235/JPY +# ISO codes that overlap display names (QQQ vs. Q) +fpc: - 123/QQQ "QQQ123.00" 123/QQQ # QQQ is fake +fpc: - 123/GTQ "Q123.00" 123/GTQ +# ChoiceFormat-based display names +fpc: - 1/INR "Re.1.00" 1/INR +fpc: - 2/INR "Rs.2.00" 2/INR +# Display names with shared prefix (YDD vs. Y) +fpc: - 100/YDD "YDD100.00" 100/YDD +fpc: - 100/CNY "Y100.00" 100/CNY diff --git a/icuSources/test/testdata/conversion.txt b/icuSources/test/testdata/conversion.txt new file mode 100644 index 00000000..a73ac8bf --- /dev/null +++ b/icuSources/test/testdata/conversion.txt @@ -0,0 +1,1001 @@ +//******************************************************************************* +// +// Copyright (C) 2003-2004, International Business Machines +// Corporation and others. All Rights Reserved. +// +// file name: conversion.txt +// encoding: US-ASCII +// tab size: 8 (not used) +// indentation:4 +// +// created on: 2003jul15 +// created by: Markus W. Scherer +// +// ICU resource bundle source file with test data for data-driven conversion tests. +// +//******************************************************************************* + +conversion { + Info { + Description { "Test data for conversion" } + LongDescription { + "Test data for data-driven conversion tests in icu/source/test/intltest/convtest.cpp\n" + "Run intltest conversion\n" + + "Charset names starting with '*' are for testdata names.\n" + + "ICU callbacks are specified as strings with pairs of characters, each optional.\n" + "Callback function - '?'=Sub '0'=Skip '.'=Stop '&'=Escape\n" + "Callback option - a letter is passed in directly as const char * see ucnv_err.h\n" + "Empty string: Sub callback with NULL option\n" + + "In order to specify a charset substitution character,\n" + "add a NUL (U+0000) to the callback string followed by the subchar bytes as Latin-1\n" + "characters. For example, for a Sub callback with no option and a subchar of FC FC,\n" + "use the string \"?\x00\xFC\xFC\"\n" + + "fallbacks: per-direction boolean, currently only for fromUnicode; see Jitterbug 2401\n" + + "errorCode: (empty)==zero | invalid | illegal | truncated | illesc | unsuppesc\n" + } + } + TestData { + toUnicode { + Headers { "charset", "bytes", "unicode", "offsets", "flush", "fallbacks", "errorCode", "callback", "invalidChars" } + Cases { + // improve coverage of unrolled loops in ucnvmbcs.c/ucnv_MBCSSingleToBMPWithOffsets() + { + "ISO-8859-3", + :bin{ 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324252627 }, + "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\x22#$%&'", + :intvector{ 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39 }, + :int{1}, :int{0}, "", "?", :bin{""} + } + // test that ISO-2022-JP encodes ASCII as itself + { + "ISO-2022-JP", + :bin{ 3f4041424344454647 }, + "?@ABCDEFG", + :intvector{ 0,1,2,3,4,5,6,7,8 }, + :int{1}, :int{1}, "", "?", :bin{""} + } + // test that ISO-2022-CN encodes ASCII as itself + { + "ISO-2022-CN", + :bin{ 3f4041424344454647 }, + "?@ABCDEFG", + :intvector{ 0,1,2,3,4,5,6,7,8 }, + :int{1}, :int{1}, "", "?", :bin{""} + } + + // ISO-2022-KR + + // truncated, partial escape sequence + { + "ibm-25546", + :bin{ 1b }, "", :intvector{}, + :int{1}, :int{1}, "truncated", ".", :bin{ 1b } + } + { + "ibm-25546", + :bin{ 1b24 }, "", :intvector{}, + :int{1}, :int{1}, "truncated", ".", :bin{ 1b24 } + } + { + "ibm-25546", + :bin{ 1b2429 }, "", :intvector{}, + :int{1}, :int{1}, "truncated", ".", :bin{ 1b2429 } + } + // complete escape sequence but nothing else + { + "ibm-25546", + :bin{ 1b242943 }, "", :intvector{}, + :int{1}, :int{1}, "", ".", :bin{""} + } + { + "ibm-25546", + :bin{ 1b2429430e }, "", :intvector{}, + :int{1}, :int{1}, "", ".", :bin{""} + } + // escape plus ASCII character + { + "ibm-25546", + :bin{ 1b24294341 }, "A", :intvector{ 4 }, + :int{1}, :int{1}, "", ".", :bin{""} + } + // escape plus incomplete DBCS character + { + "ibm-25546", + :bin{ 1b2429430e41 }, "", :intvector{}, + :int{1}, :int{1}, "truncated", ".", :bin{ 41 } + } + // all complete with DBCS character + { + "ibm-25546", + :bin{ 1b2429430e4141 }, "\uc88b", :intvector{ 5 }, + :int{1}, :int{1}, "", ".", :bin{""} + } + // more complicated example + { + "ibm-25546", + :bin{ 411b242943420e4141affe0f43 }, + "AB\uc88b%XAF%XFEC", + :intvector{ 0, 5, 7, 9, 9, 9, 9, 9, 9, 9, 9, 12 }, + :int{1}, :int{1}, "", "&", :bin{""} + } + + // truncated, partial escape sequence + { + "ISO-2022-KR", + :bin{ 1b }, "", :intvector{}, + :int{1}, :int{1}, "truncated", ".", :bin{ 1b } + } + { + "ISO-2022-KR", + :bin{ 1b24 }, "", :intvector{}, + :int{1}, :int{1}, "truncated", ".", :bin{ 1b24 } + } + { + "ISO-2022-KR", + :bin{ 1b2429 }, "", :intvector{}, + :int{1}, :int{1}, "truncated", ".", :bin{ 1b2429 } + } + // complete escape sequence but nothing else + { + "ISO-2022-KR", + :bin{ 1b242943 }, "", :intvector{}, + :int{1}, :int{1}, "", ".", :bin{""} + } + { + "ISO-2022-KR", + :bin{ 1b2429430e }, "", :intvector{}, + :int{1}, :int{1}, "", ".", :bin{""} + } + // escape plus ASCII character + { + "ISO-2022-KR", + :bin{ 1b24294341 }, "A", :intvector{ 4 }, + :int{1}, :int{1}, "", ".", :bin{""} + } + // escape plus incomplete DBCS character + { + "ISO-2022-KR", + :bin{ 1b2429430e41 }, "", :intvector{}, + :int{1}, :int{1}, "truncated", ".", :bin{ 41 } + } + // all complete with DBCS character + { + "ISO-2022-KR", + :bin{ 1b2429430e4141 }, "\uc88b", :intvector{ 5 }, + :int{1}, :int{1}, "", ".", :bin{""} + } + // more complicated example + { + "ISO-2022-KR", + :bin{ 411b242943420e4141affe0f43 }, + "AB\uc88b%XAF%XFEC", + :intvector{ 0, 5, 7, 9, 9, 9, 9, 9, 9, 9, 9, 12 }, + :int{1}, :int{1}, "", "&", :bin{""} + } + + // ISO-2022-JP + + // truncated, partial escape sequence + { + "ISO-2022-JP", + :bin{ 1b }, "", :intvector{}, + :int{1}, :int{1}, "truncated", ".", :bin{ 1b } + } + { + "ISO-2022-JP-2", + :bin{ 1b24 }, "", :intvector{}, + :int{1}, :int{1}, "truncated", ".", :bin{ 1b24 } + } + // complete escape sequence but nothing else + { + "ISO-2022-JP-2", + :bin{ 1b2442 }, "", :intvector{}, + :int{1}, :int{1}, "", ".", :bin{""} + } + // escape plus incomplete DBCS character + { + "ISO-2022-JP-2", + :bin{ 1b244241 }, "", :intvector{}, + :int{1}, :int{1}, "truncated", ".", :bin{ 41 } + } + // all complete with DBCS character + { + "ISO-2022-JP-2", + :bin{ 1b24424141 }, "\u758f", :intvector{ 3 }, + :int{1}, :int{1}, "", ".", :bin{""} + } + // test the G2 designator & SS2 shift + { + "ISO-2022-JP-2", + :bin{ 431b2e46461b244241411b4e4e353f }, "CF\u758f\u039e\u7591", :intvector{ 0, 4, 8, 12, 13 }, + :int{1}, :int{1}, "", ".", :bin{""} + } + // JIS7 with Katakana + { + "JIS7", + :bin{ 41420e41420f4142 }, "AB\uff81\uff82AB", :intvector{ 0, 1, 3, 4, 6, 7 }, + :int{1}, :int{1}, "", ".", :bin{""} + } + // JIS8 with Katakana + { + "JIS8", + :bin{ 41c15c1b284a5cc242 }, "A\uff81\\\xa5\uff82B", :intvector{ 0, 1, 2, 6, 7, 8 }, + :int{1}, :int{1}, "", ".", :bin{""} + } + + // ISO-2022-CN + + // truncated, partial escape sequence + { + "ISO_2022,locale=zh,version=1", + :bin{ 1b }, "", :intvector{}, + :int{1}, :int{1}, "truncated", ".", :bin{ 1b } + } + { + "ISO_2022,locale=zh,version=1", + :bin{ 1b24 }, "", :intvector{}, + :int{1}, :int{1}, "truncated", ".", :bin{ 1b24 } + } + { + "ISO_2022,locale=zh,version=1", + :bin{ 1b2429 }, "", :intvector{}, + :int{1}, :int{1}, "truncated", ".", :bin{ 1b2429 } + } + // complete escape sequence but nothing else + { + "ISO_2022,locale=zh,version=1", + :bin{ 1b242941 }, "", :intvector{}, + :int{1}, :int{1}, "", ".", :bin{""} + } + { + "ISO_2022,locale=zh,version=1", + :bin{ 1b2429410e }, "", :intvector{}, + :int{1}, :int{1}, "", ".", :bin{""} + } + // escape plus ASCII character + { + "ISO_2022,locale=zh,version=1", + :bin{ 1b24294141 }, "\x41", :intvector{ 4 }, + :int{1}, :int{1}, "", ".", :bin{""} + } + // escape plus incomplete DBCS character + { + "ISO_2022,locale=zh,version=1", + :bin{ 1b2429410e41 }, "", :intvector{}, + :int{1}, :int{1}, "truncated", ".", :bin{ 41 } + } + // all complete with DBCS character + { + "ISO_2022,locale=zh,version=1", + :bin{ 1b2429410e4141 }, "\u4eae", :intvector{ 5 }, + :int{1}, :int{1}, "", ".", :bin{""} + } + // ISO-2022-CN-EXT with all subcharsets and shifts and with supplementary code points + { + "ISO-2022-CN-EXT", + :bin{ 1b2429411b242a480e41411b2429457e7c1b4e70341b242b4d1b2429477c341b4f664c2421 }, + "\u4eae\u9f82\u56cd\u56cc\U0002a6d6\x30", + :intvector{ 9, 15, 19, 29, 33, 33, 35 }, + :int{1}, :int{1}, "", ".", :bin{""} + } + + // illegal and unsupported escape sequences + // SS2 without designator: illegal + { + "ISO-2022-CN-EXT", + :bin{ 411b4e2121 }, "\x41", :intvector{ 0 }, + :int{1}, :int{1}, "illesc", ".", :bin{ 1b4e } + } + // G3 designator: recognized, but not supported for -CN (only for -CN-EXT) + { + "ISO-2022-CN", + :bin{ 411b242b491b4f2121 }, "\x41", :intvector{ 0 }, + :int{1}, :int{1}, "unsuppesc", ".", :bin{ 1b242b49 } + } + + // ISO-2022 SBCS + // [U_ENABLE_GENERIC_ISO_2022] + // The _generic_ ISO-2022 converter is disabled starting 2003-dec-03 (ICU 2.8). + // For details see the icu mailing list from 2003-dec-01 and the ucnv2022.c file. + // Language-specific variants of ISO-2022 continue to be available as listed below. + //{ + // "ISO_2022", + // :bin{ 0008090a0d1a1c1f203f415c7d7e7f }, + // "\x00\x08\t\n\r\x1a\x1c\x1f ?A\\}~\x7f", + // :intvector{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }, + // :int{1}, :int{1}, "", ".", :bin{""} + //} + + // DBCS-only extensions + { + "ibm-970", + :bin{ 617eece9b2eb }, + "\x61\x7e\u4e00\ub000", + :intvector{ 0, 1, 2, 4 }, + :int{1}, :int{1}, "", "?", :bin{""} + } + + { + "ibm-971", + :bin{ 617eece9b2eb }, + "\ufffd\u4e00\ub000", + :intvector{ 0, 2, 4 }, + :int{1}, :int{1}, "", "?", :bin{""} + } + + { + "ibm-16684", + :bin{ 430e4395ecc1404042e1 }, + "\ufffd\u30C8\u30C8\u309A\u3000\u20ac", + :intvector{ 0, 2, 4, 4, 6, 8 }, + :int{1}, :int{0}, "", "?", :bin{""} + } + + { + "ibm-1399", + :bin{ 430e4395ecc140400fe1 }, + "\uff62\u30C8\u30C8\u309A\u3000\u20ac", + :intvector{ 0, 2, 4, 4, 6, 9 }, + :int{1}, :int{0}, "", "?", :bin{""} + } + + // extensions + { + "ibm-1390", + :bin{ 430e4395ecc1 }, + "\uff63\u30C8\u30C8\u309A", + :intvector{ 0, 2, 4, 4 }, + :int{1}, :int{0}, "", "?", :bin{""} + } + + { + "ibm-16684", + :bin{ ececec8bec8cec8d4386ecb5ecb6ecb7 }, + "\ufffd\u31f6\u31f7\u31f8\u30ab\u304b\u309a\u304d\u309a\u304f\u309a", + :intvector{ 0, 2, 4, 6, 8, 10, 10, 12, 12, 14, 14 }, + :int{1}, :int{0}, "", "?", :bin{""} + } + + { + "ibm-1390", + :bin{ 43860eececec8bec8cec8d4386ecb5ecb6ecb7ecc10fec }, + "\uff63\uff76\ufffd\u31f6\u31f7\u31f8\u30ab\u304b\u309a\u304d\u309a\u304f\u309a\u30C8\u309A\x1a", + :intvector{ 0, 1, 3, 5, 7, 9, 11, 13, 13, 15, 15, 17, 17, 19, 19, 22 }, + :int{1}, :int{0}, "", "?", :bin{""} + } + + { + "*test3", + :bin{ 00050601020b0701020a01020c }, + "\u20ac\x05\x06\x0b\U00101234\U00023456\ufffd", + :intvector{ 0, 1, 2, 3, 6, 6, 7, 7, 10 }, + :int{1}, :int{0}, "", "?", :bin{""} + } + + // normal conversions + { + "UTF-16LE", + :bin{ 310000d801dc00d902dc320000d8330001dc3400 }, + "1\U00010001\U000500022\ufffd3\ufffd4", + :intvector{ 0, 2, 2, 6, 6, 10, 12, 14, 16, 18 }, + :int{1}, :int{0}, "", "?", :bin{""} + } + { "UTF-16LE", :bin{ 00 }, "", :intvector{}, :int{1}, :int{0}, "truncated", ".", :bin{ 00 } } + { "UTF-16LE", :bin{ 00d800 }, "", :intvector{}, :int{1}, :int{0}, "truncated", ".", :bin{ 00d800 } } + + { + "UTF-16BE", + :bin{ 0031d800dc01d900dc020032d8000033dc010034 }, + "1\U00010001\U000500022\ufffd3\ufffd4", + :intvector{ 0, 2, 2, 6, 6, 10, 12, 14, 16, 18 }, + :int{1}, :int{0}, "", "?", :bin{""} + } + { "UTF-16BE", :bin{ 00 }, "", :intvector{}, :int{1}, :int{0}, "truncated", ".", :bin{ 00 } } + { "UTF-16BE", :bin{ d800dc }, "", :intvector{}, :int{1}, :int{0}, "truncated", ".", :bin{ d800dc } } + + // e4b8 is a partial sequence + { "UTF-8", :bin{ 31e4ba8ce4b8 }, "1\u4e8c", :intvector{ 0, 1 }, :int{1}, :int{0}, "truncated", ".", :bin{ e4b8 } } + { "UTF-8", :bin{ 31e4ba8ce4b8 }, "1\u4e8c\ufffd", :intvector{ 0, 1, 4 }, :int{1}, :int{0}, "", "?", :bin{""} } + + // LMBCS with escape callback (1292a0 is unassigned) + { + "LMBCS", + :bin{ 12c9501292a01292a1 }, + "\u4e2e%X12%X92%XA0\ue5c4", + :intvector{ 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6 }, + :int{1}, :int{0}, "", "&", :bin{""} + } + + // IMAP-mailbox-name with SUB + // a<DEL> a&AB~ a&AB\x0c a&AB- a&AB. a&. + { + "IMAP-mailbox-name", + :bin{ 617f612641427e612641420c612641422d612641422e61262e }, + "a\ufffda\ufffda\ufffda\ufffda\ufffda\ufffd", + :intvector{ 0, 1, 2, 4, 7, 9, 12, 14, 17, 19, 22, 23 }, + :int{1}, :int{0}, "", "?", :bin{""} + } + + // using testdata_test1.cnv + { "*test1", :bin{ 000506070809 }, "\u20ac\x05\x06\U00101234\ufffd\ufffd", :intvector{ 0, 1, 2, 3, 3, 4, 5 }, :int{1}, :int{0}, "", "", :bin{""} } + + // surrogates in CESU-8 + { "CESU-8", :bin{ eda080eda081edb081 }, "\ud800\U00010401", :intvector{ 0, 3, 6 }, :int{1}, :int{0}, "", "", :bin{""} } + // e080 is a partial sequence + { "UTF-8", :bin{ 31ffe4ba8ce08061 }, "1\ufffd\u4e8c\ufffda", :intvector{ 0, 1, 2, 5, 7 }, :int{0}, :int{0}, "", "", :bin{ e080 } } + // fbbfbfbfbf exceedes U+10ffff + { "UTF-8", :bin{ 31fbbfbfbfbf61 }, "1\ufffda", :intvector{ 0, 1, 6 }, :int{0}, :int{0}, "", "", :bin{ fbbfbfbfbf } } + + // lead byte a2 without trail byte + { "ibm-1363", :bin{ a2aea2 }, "\u00a1", :intvector{ 0 }, :int{1}, :int{0}, "truncated", ".", :bin{ a2 } } + { "ibm-1363", :bin{ a2aea2 }, "\u00a1\u001a", :intvector{ 0, 2 }, :int{1}, :int{0}, "", "?", :bin{""} } + + // simple sample, no error handling + { "UTF-8", :bin{ 61F48FBFBF }, "a\U0010FFFF", :intvector{ 0, 1, 1 }, :int{1}, :int{0}, "", "", :bin{""} } + } + } + + // --------------------------------------------------------------------- *** + + fromUnicode { + Headers { "charset", "unicode", "bytes", "offsets", "flush", "fallbacks", "errorCode", "callback", "invalidUChars" } + Cases { + // Improve ucnv_ext.c code coverage: + // There will be a partial match up to the lead surrogate of U+603ff + // which then results in one more unit in the prefetch buffer + // than the match length when converting one code unit at a time. + // See ucnv_extContinueMatchFromU() comment + // "the match did not use all of preFromU[] - keep the rest for replay" + { + "*test3", + "\U00101234\U00101234\U00050005\U000603ff", + :bin{ 07070001020e05ff }, + :intvector{ 0, 2, 2, 2, 2, 2, 2, 6 }, + :int{1}, :int{0}, "", "?", "" + } + + // test that ISO-2022-JP encodes ASCII as itself + { + "ISO-2022-JP", + "?@ABCDEFG", + :bin{ 3f4041424344454647 }, + :intvector{ 0,1,2,3,4,5,6,7,8 }, + :int{1}, :int{1}, "", "?", "" + } + // test that ISO-2022-CN encodes ASCII as itself + { + "ISO-2022-CN", + "?@ABCDEFG", + :bin{ 3f4041424344454647 }, + :intvector{ 0,1,2,3,4,5,6,7,8 }, + :int{1}, :int{1}, "", "?", "" + } + + // moved from cintltst /tsconv/nccbtst/TestSkipCallBack + { + "iso-2022-jp", + "\u3000\xe9\u3001", + :bin{ 1b2442212121221b2842 }, + :intvector{ 0,0,0,0,0,2,2,2,2,2 }, + :int{1}, :int{1}, "", "0", "" + } + // moved from cintltst /tsconv/nccbtst/TestSubCallBack + { + "iso-2022-jp", + "A\xe9B\xe9\u3000", + :bin{ 411a421a1b244221211b2842 }, + :intvector{ 0,1,2,3,4,4,4,4,4,4,4,4 }, + :int{1}, :int{1}, "", "?", "" + } + // moved from cintltst /tsconv/nccbtst/TestSubWithValueCallBack + { + "iso-2022-jp", + "A\xe9B\xe9\u3000", + :bin{ 41255530304539422555303045391b244221211b2842 }, + :intvector{ 0,1,1,1,1,1,1,2,3,3,3,3,3,3,4,4,4,4,4,4,4,4 }, + :int{1}, :int{1}, "", "&", "" + } + { + "iso-2022-cn", + "\u4e00\u3712\u4e01", + :bin{ 1b2429410e523b0f2555333731320e36210f }, + :intvector{ 0,0,0,0,0,0,0,1,1,1,1,1,1,1,2,2,2,2 }, + :int{1}, :int{1}, "", "&", "" + } + { + "iso-2022-cn", + "A\u3712\u4e00", + :bin{ 412555333731321b2429410e523b0f }, + :intvector{ 0,1,1,1,1,1,1,2,2,2,2,2,2,2,2 }, + :int{1}, :int{1}, "", "&", "" + } + { + "iso-2022-cn", + "\u3000\u3712\u3001", + :bin{ 1b2429410e21210f2555333731320e21220f }, + :intvector{ 0,0,0,0,0,0,0,1,1,1,1,1,1,1,2,2,2,2 }, + :int{1}, :int{1}, "", "&", "" + } + + // moved from cintltst /tsconv/nucnvtst/TestJIS + { + "JIS", + "\uFF81\uFF82\u30EC\u30ED\u30EE\u30EF\uFF93\uFF94\uFF95\uFF96\uFF97\uFF98", + :bin{ 1b244225412544256c256d256e256F25622564256625682569256a1b2842 }, + :intvector{ 0,0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,11,11,11 }, + :int{1}, :int{1}, "", "?", "" + } + { + "JIS7", + "\uFF81\uFF82\u30EC\u30ED\u30EE\u30EF\uFF93\uFF94\uFF95\uFF96\uFF97\uFF98", + :bin{ 0e41420f1b2442256c256d256e256F0e5354555657580f1b2842 }, + :intvector{ 0,0,1,2,2,2,2,2,2,3,3,4,4,5,5,6,6,7,8,9,10,11,11,11,11,11 }, + :int{1}, :int{1}, "", "?", "" + } + { + "JIS8", + "\uFF81\uFF82\u30EC\u30ED\u30EE\u30EF\uFF93\uFF94\uFF95\uFF96\uFF97\uFF98", + :bin{ C1C21b2442256c256d256e256F1b284AD3D4D5D6D7D81b2842 }, + :intvector{ 0,1,2,2,2,2,2,3,3,4,4,5,5,6,6,6,6,7,8,9,10,11,11,11,11 }, + :int{1}, :int{1}, "", "?", "" + } + + // moved from cintltst /tsconv/ncnvtst/TestErrorBehaviour + { + "iso-2022-jp", + "\u3000\x50\udc01\u3001", + :bin{ 1B244221211B2842501A1B24422122 }, + :intvector{ 0,0,0,0,0,1,1,1,1,2,3,3,3,3,3 }, + :int{0}, :int{1}, "", "?", "\udc01" + } + { + "iso-2022-jp", + "\u3000\x50\udc01\u3001", + :bin{ 1B244221211B2842501A1B244221221b2842 }, + :intvector{ 0,0,0,0,0,1,1,1,1,2,3,3,3,3,3,3,3,3 }, + :int{1}, :int{1}, "", "?", "" + } + { + "iso-2022-kr", + "\x61\u4e00\udc01\u4e00", + :bin{ 1b242943610e6c690f1a0e6c69 }, + :intvector{ -1,-1,-1,-1,0,1,1,1,2,2,3,3,3 }, + :int{0}, :int{1}, "", "?", "\udc01" + } + { + "iso-2022-kr", + "\x61\u4e00\udc01\u4e00", + :bin{ 1b242943610e6c690f1a0e6c690f }, + :intvector{ -1,-1,-1,-1,0,1,1,1,2,2,3,3,3,3 }, + :int{1}, :int{1}, "", "?", "" + } + + // ISO-2022-KR + { + "ibm-25546", + "AB\uc88b\U00050005\uacccC", + :bin{ 1b24294341420e41410f7b552b35303030357d0e306a0f43 }, + :intvector{ -1,-1,-1,-1,0,1,2,2,2,3,3,3,3,3,3,3,3,3,3,5,5,5,6,6 }, + :int{1}, :int{1}, "", "&U", "" + } + { + "ibm-25546", + "AB\uc88b\U00050005\uacccC", + :bin{ 1b24294341420e41410f1a0e306a0f43 }, + :intvector{ -1,-1,-1,-1,0,1,2,2,2,3,3,5,5,5,6,6 }, + :int{1}, :int{1}, "", "?\x00\x1a", "" + } + { + "ibm-25546", + "AB\uc88b\U00050005\uacccC", + :bin{ 1b24294341420e41412f7e306a0f43 }, + :intvector{ -1,-1,-1,-1,0,1,2,2,2,3,3,5,5,6,6 }, + :int{1}, :int{1}, "", "?", "" + } + { + "ibm-25546", + "AB\uc88b\U00050005\uaccc", + :bin{ 1b24294341420e41412f7e306a0f }, + :intvector{ -1,-1,-1,-1,0,1,2,2,2,3,3,5,5,5 }, + :int{1}, :int{1}, "", "?", "" + } + { + "ISO-2022-KR", + "AB\uc88b\U00050005\uacccC", + :bin{ 1b24294341420e41410f7b552b35303030357d0e306a0f43 }, + :intvector{ -1,-1,-1,-1,0,1,2,2,2,3,3,3,3,3,3,3,3,3,3,5,5,5,6,6 }, + :int{1}, :int{1}, "", "&U", "" + } + { + "ISO-2022-KR", + "AB\uc88b\U00050005\uacccC", + :bin{ 1b24294341420e41410f1a0e306a0f43 }, + :intvector{ -1,-1,-1,-1,0,1,2,2,2,3,3,5,5,5,6,6 }, + :int{1}, :int{1}, "", "?", "" + } + { + "ISO-2022-KR", + "AB\uc88b\U00050005\uacccC", + :bin{ 1b24294341420e41412f7e306a0f43 }, + :intvector{ -1,-1,-1,-1,0,1,2,2,2,3,3,5,5,6,6 }, + :int{1}, :int{1}, "", "?\x00\x2f\x7e", "" + } + { + "ISO-2022-KR", + "AB\uc88b\U00050005\uaccc", + :bin{ 1b24294341420e41412f7e306a0f }, + :intvector{ -1,-1,-1,-1,0,1,2,2,2,3,3,5,5,5 }, + :int{1}, :int{1}, "", "?\x00\x2f\x7e", "" + } + + // ISO-2022-JP-2 with G2 designator & SS2 shift + { + "ISO-2022-JP-2", + "CF\u758f\u038f\u7591", + :bin{ 43461b244241411b2e461b4e3f353f1b2842 }, + :intvector{ 0,1,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4 }, + :int{1}, :int{1}, "", ".", "" + } + // JIS7 with Katakana + { + "JIS7", + "AB\uff81\uff82AB", + :bin{ 41420e41420f4142 }, + :intvector{ 0,1,2,2,3,4,4,5 }, + :int{1}, :int{1}, "", ".", "" + } + // JIS7 with shift to ASCII at the very end + { + "JIS7", + "AB\uff81\uff82", + :bin{ 41420e41420f }, + :intvector{ 0,1,2,2,3,3 }, + :int{1}, :int{1}, "", ".", "" + } + // JIS8 with Katakana + { + "JIS8", + "A\uff81\\\xa5\uff82B", + :bin{ 41c15c1b284a5cc2421b2842 }, + :intvector{ 0,1,2,3,3,3,3,4,5,5,5,5 }, + :int{1}, :int{1}, "", ".", "" + } + + // ISO-2022-CN-EXT with all subcharsets and shifts and with supplementary code points + { + "ISO-2022-CN-EXT", + "\u4eae\u9f82\u56cd\u56cc\U0002a6d6\x30", + :bin{ 1b2429410e41411b2429457e7c1b242a481b4e70341b2429477c341b242b4d1b4f664c0f30 }, + :intvector{ 0,0,0,0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4,4,4,6,6 }, + :int{1}, :int{1}, "", ".", "" + } + // ISO-2022-CN-EXT with shift to ASCII at the very end + { + "ISO-2022-CN-EXT", + "\u4eae\u9f82\u56cd\u56cc\U0002a6d6", + :bin{ 1b2429410e41411b2429457e7c1b242a481b4e70341b2429477c341b242b4d1b4f664c0f }, + :intvector{ 0,0,0,0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4 }, + :int{1}, :int{1}, "", ".", "" + } + // ISO-2022-CN-EXT without flush so do not shift to ASCII at the very end + { + "ISO-2022-CN-EXT", + "\u4eae\u9f82\u56cd\u56cc\U0002a6d6", + :bin{ 1b2429410e41411b2429457e7c1b242a481b4e70341b2429477c341b242b4d1b4f664c }, + :intvector{ 0,0,0,0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4,4,4 }, + :int{0}, :int{1}, "", ".", "" + } + + // windows-936 vs. ibm-1386 + { + "ibm-1386", + "\x1a\u20ac\u5555\x80\x81\U00055555", + :bin{ 7fa2e3dffb7f7fa1a1 }, + :intvector{ 0, 1, 1, 2, 2, 3, 4, 5, 5 }, + :int{1}, :int{1}, "", "?", "" + } + { + "windows-936", + "\x1a\u20ac\u5555\x80\x81\U00055555", + :bin{ 1a80dffb3f3f3f }, + :intvector{ 0, 1, 2, 2, 3, 4, 5 }, + :int{1}, :int{1}, "", "?", "" + } + + // verify that if a conversion table does not have any mapping for U+0000, + // then there will not even be a phantom fallback to 00 + { + "ibm-971", + "\x00", + :bin{ affe }, + :intvector{ 0, 0 }, + :int{1}, :int{1}, "", "?", "" + } + + { + "*test4", + "\x00", + :bin{ ff }, + :intvector{ 0 }, + :int{1}, :int{1}, "", "?", "" + } + + // extension in testdata + { + "*test4x", + "\u20ac\x09", + :bin{ 0009 }, + :intvector{ 0, 1 }, + :int{1}, :int{1}, "", "?", "" + } + + // DBCS-only extensions + { + "ibm-970", + "\x61\uffa1\u2015\ub000", + :bin{ 611aa1aab2eb }, + :intvector{ 0, 1, 2, 2, 3, 3 }, + :int{1}, :int{1}, "", "?", "" + } + + { + "ibm-971", + "\x61\uffa1\u2015\ub000", + :bin{ affeaffeaffeb2eb }, + :intvector{ 0, 0, 1, 1, 2, 2, 3, 3 }, + :int{1}, :int{1}, "", "?", "" + } + + { + "ibm-1390,swaplfnl", + "\uff63\u30C8\u30C8\u309A\u3000\x41\u20ac\x0a", + :bin{ 430e4395ecc140400fc1e115 }, + :intvector{ 0, 1, 1, 1, 2, 2, 4, 4, 5, 5, 6, 7 }, + :int{1}, :int{0}, "", "?", "" + } + + { + "ibm-16684", + "\uff63\u30C8\u30C8\u309A\u3000\x41\u20ac\x0a", + :bin{ fefe4395ecc14040fefe42e1fefe }, + :intvector{ 0, 0, 1, 1, 2, 2, 4, 4, 5, 5, 6, 6, 7, 7 }, + :int{1}, :int{0}, "", "?", "" + } + + { + "ibm-1399", + "\uff63\u30C8\u30C8\u309A\u3000\x41\u20ac\x0a", + :bin{ 440e4395ecc140400fc1e125 }, + :intvector{ 0, 1, 1, 1, 2, 2, 4, 4, 5, 5, 6, 7 }, + :int{1}, :int{0}, "", "?", "" + } + + // <subchar1> from |2 mappings + { + "ibm-1390", + "\x0e\x0f\u0901\U00050000\uffe8\uffee", + :bin{ 3f3f0efefefefe0f3f3f }, + :intvector{ 0, 1, 2, 2, 2, 3, 3, 5, 5, 6 }, + :int{1}, :int{1}, "", "?", "" + } + + // <subchar1> from |2 mappings, and also contains a fallback to 00 + { + "*test4", + "\u20ac\u20ad\U00050005\U00023456\U0010ffff\x30", + :bin{ 0000e10102030affff }, + :intvector{ 0, 1, 2, 4, 4, 4, 4, 6, 8 }, + :int{1}, :int{1}, "", "?", "" + } + + // setting a <subchar> resets the <subchar1> + { + "*test4", + "\u20ac\u20ad\U00050005\U00023456\U0010ffff\x30", + :bin{ 00000102030f0102030a0102030f0102030f }, + :intvector{ 0, 1, 2, 2, 2, 2, 4, 4, 4, 4, 6, 6, 6, 6, 8, 8, 8, 8 }, + :int{1}, :int{1}, "", "?\x00\x01\x02\x03\x0f", "" + } + + // fallback to 00 with old single-byte data structure + { + "*test1", + "\u20ac\u20ad\U00101234\U00050000", + :bin{ 000007ff }, + :intvector{ 0, 1, 2, 4 }, + :int{1}, :int{1}, "", "?", "" + } + + // extensions + { + "ibm-1390", + "\u025a\u025a\u0300\u025a\u0301\u025a\u0302\uffe8\U0002a0f9", + :bin{ 0ed896eccaeccbd896ea530f3f0eb7c20f }, + :intvector{ 0, 0, 0, 1, 1, 3, 3, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8 }, + :int{1}, :int{0}, "", "?", "" + } + + { + "*test3", + "\xc4\xc4\xc4\U00101234\xc4\xc4\U00101234\x05", + :bin{ ffffff070501020c }, + :intvector{ 0, 1, 2, 3, 5, 5, 5, 5 }, + :int{1}, :int{0}, "", "?", "" + } + + { + "*test3", + "\U00101234\U00101234\U00050005\U00101234\U00050005\U00060006", + :bin{ 07070001020e05070001020f09 }, + :intvector{ 0, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6 }, + :int{1}, :int{0}, "", "?", "" + } + + // normal conversions + { + "UTF-16LE", + "1\U00010001\U000500022\ud8003\udc014", + :bin{ 310000d801dc00d902dc3200fdff3300fdff3400 }, + :intvector{ 0, 0, 1, 1, 1, 1, 3, 3, 3, 3, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9 }, + :int{1}, :int{0}, "", "?", "" + } + { "UTF-16LE", "\ud800", :bin{""}, :intvector{}, :int{1}, :int{0}, "truncated", ".", "\ud800" } + + { + "UTF-16BE", + "1\U00010001\U000500022\ud8003\udc014", + :bin{ 0031d800dc01d900dc020032fffd0033fffd0034 }, + :intvector{ 0, 0, 1, 1, 1, 1, 3, 3, 3, 3, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9 }, + :int{1}, :int{0}, "", "?", "" + } + { "UTF-16BE", "\ud800", :bin{""}, :intvector{}, :int{1}, :int{0}, "truncated", ".", "\ud800" } + + // escape callback + { + "ISCII", + "A\u0901\U00023456\u0902B\U00023456C", + :bin{ 41ef42a1255544383444255544433536a24225554438344425554443353643 }, + :intvector{ + 0, + 1,1,1, + 2,2,2,2,2,2, + 2,2,2,2,2,2, + 4, + 5, + 6,6,6,6,6,6, + 6,6,6,6,6,6, + 8 + }, + :int{1}, :int{0}, "", "&", "" + } + + // escape callback (hex) + { + "iso-2022-jp", + "\u3000\U00023456\u3001\U00023456B\u901c", + :bin{ 1b244221211b284226237832333435363b1b244221221b284226237832333435363b42262378393031433b }, + :intvector{ + 0,0,0,0,0, + 1,1,1,1,1,1,1,1,1,1,1,1, + 3,3,3,3,3, + 4,4,4,4,4,4,4,4,4,4,4,4, + 6, + 7,7,7,7,7,7,7,7 + }, + :int{1}, :int{0}, "", "&X", "" + } + + // sub callback + { + "gb18030", + "$\x7f\x80\u01f9\u20ac\u4e00\u9fa6\uffff\U00010000\U0010ffff", + :bin{ 247f81308130a8bfa2e3d2bb82358f338431a43990308130e3329a35 }, + :intvector{ 0, 1, 2, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 10, 10, 10, 10 }, + :int{1}, :int{0}, "", "?", "" + } + + // skip callback + { "ibm-930", "\u6D63\u6D64\u6D65\u6D66", :bin{ 0e5d5f5d63466b0f }, :intvector{ 0, 0, 0, 1, 1, 3, 3, 3 }, :int{1}, :int{0}, "", "0", "" } + { "ibm-930", "\u6D63\u6D64\ud89a\u6D66", :bin{ 0e5d5f5d63466b0f }, :intvector{ 0, 0, 0, 1, 1, 3, 3, 3 }, :int{1}, :int{0}, "", "0", "" } + { "ibm-930", "\u6D63\u6D64\ud89a\u6D66", :bin{ 0e5d5f5d63 }, :intvector{ 0, 0, 0, 1, 1 }, :int{1}, :int{0}, "illegal", "0i", "\ud89a" } + + // sub callback for supplementary code point + { "LATIN1", "1\U000104012", :bin{ 311a32 }, :intvector{ 0, 1, 3 }, :int{1}, :int{0}, "", "", "" } + { "ibm-920", "1\U000104012", :bin{ 311a32 }, :intvector{ 0, 1, 3 }, :int{1}, :int{0}, "", "", "" } + + // sub callback with AA as subchar + { "ibm-920", "1\U000104012", :bin{ 31AA32 }, :intvector{ 0, 1, 3 }, :int{1}, :int{0}, "", "?\x00\xAA", "" } + + // same but not flushing + { "LATIN1", "1\U000104012", :bin{ 311a32 }, :intvector{ 0, 1, 3 }, :int{0}, :int{0}, "", "", "\U00010401" } + { "ibm-920", "1\U000104012", :bin{ 311a32 }, :intvector{ 0, 1, 3 }, :int{0}, :int{0}, "", "", "\U00010401" } + + // simple sample, no error handling + { "UTF-8", "a\U0010FFFF", :bin{ 61F48FBFBF }, :intvector{ 0, 1, 1, 1, 1 }, :int{1}, :int{0}, "", "", "" } + } + } + + getUnicodeSet { + // charset - will be opened, and ucnv_getUnicodeSet() called on it + // map - set of code points and strings that must be in the returned set + // mapnot - set of code points and strings that must *not* be in the returned set + // which - numeric UConverterUnicodeSet value + Headers { "charset", "map", "mapnot", "which" } + Cases { + // ISO-2022-KR + { + "ISO-2022-KR", + "[\x00-\x7f\xa1\xa4\xfe\u0111\u4e00\u4e01\uac00-\uac02\uffe6]", + "[\x80-\xa0\xa3\xa5\xff-\u0110\uac03\uffe7-\U0010ffff]", + :int{0} + } + + // versions of ISO-2022-JP + { + "ISO-2022-JP", + "[\x00-\x7f\u0391-\u03a1\uff61-\uff9f\u4e00\u4e01\uffe5]", + "[\u0100-\u0113\u0385-\u038a\u4e02\u4e27-\u4e29\uffe6-\U0010ffff]", + :int{0} + } + { + "ISO-2022-JP-2", + "[\x00-\u0113\u0385-\u038a\u0390-\u03a1\uff61-\uff9f\u4e00-\u4e05\uffe6]", + "[\uffe7-\U0010ffff]", + :int{0} + } + + // versions of ISO-2022-CN + { + "ISO-2022-CN", + "[\x00-\x7f\u4e00\u4e01\u9f98\ufe6b]", + "[\u4e29\uffe6-\U0010ffff]", + :int{0} + } + { + "ISO-2022-CN-EXT", + "[\x00-\x7f\u4e00-\u4e05\u9f98\ufe6b\u4e28-\u4e2b\U00020000\U00020003-\U00020005\U00029664]", + "[\U00020001\U00020002\U0002a6d7-\U0010ffff]", + :int{0} + } + + // DBCS-only + { + "ibm-971", + "[\xa1\xa4\uac01\ub000]", + "[\x00-\x9f\u2015]", + :int{0} + } + + { + "ibm-16684", + "[\xa0\xa1\xa4\xa6-\xab\xad-\u017f\u0254\u309b-\u30ff\u4e00-\u4e05\U00023d00\U000243bc\U0002a6b2" + "{\u0254\u0300}{\u0254\u0301}{\u304b\u309a}{\u30ad\u309a}{\u30af\u309a}]", + "[\x00-0x9f\xa2\xa3\xa5\xac\u0200-\u024f\U00010000-\U0001ffff\U0002a61b-\U0002a6b1]", + :int{0} + } + + // extensions + { + "ibm-1390", + "[\x00-\x0d\x10-\u017f\u0254\u309b-\u30ff\u4e00-\u4e05\U00023d00\U000243bc\U0002a6b2" + "{\u0254\u0300}{\u0254\u0301}{\u304b\u309a}{\u30ad\u309a}{\u30af\u309a}]", + "[\x0e\x0f\u0200-\u024f\U00010000-\U0001ffff\U0002a61b-\U0002a6b1]", + :int{0} + } + + { + "*test3", + "[\x05\x0b\xc0\u20ac\U00023456\U00101234" + "{\U00101234\U00050005\U00060006}{\U00101234\U00050005}{\U00101234\U00060006}{\xc4\xc4\U00101234\x05}]", + "[\x06\x0e\U00034567\U000febcd{\U00101234\U00070007}]", + :int{0} + } + } + } + } +} diff --git a/icuSources/test/testdata/default.goo b/icuSources/test/testdata/default.goo deleted file mode 100644 index 0bda338c..00000000 --- a/icuSources/test/testdata/default.goo +++ /dev/null @@ -1,16 +0,0 @@ -//******************************************************************************* -//* -//* Copyright (C) 1998-2000, International Business Machines -//* Corporation and others. All Rights Reserved. -//* -//******************************************************************************* - -// This is a test default locale file - -default -{ - Version { 44 } - string_in_Default_te_te_IN { GOOGOO } -} - -//eof diff --git a/icuSources/test/testdata/icuio.txt b/icuSources/test/testdata/icuio.txt new file mode 100644 index 00000000..bce8c961 --- /dev/null +++ b/icuSources/test/testdata/icuio.txt @@ -0,0 +1,135 @@ +//***************************************************************************** +// +// Copyright (C) 2004, International Business Machines +// Corporation and others. All Rights Reserved. +// +// file name: icuio.txt +// encoding: US-ASCII +// tab size: 4 (not used) +// indentation:4 +// +// created on: 2004Apr06 +// created by: George Rhoten +// +// ICU resource bundle source file with test data for data-driven ICU I/O tests. +// +//***************************************************************************** + +icuio { + Info { + Description { "Test data for ICU I/O" } + LongDescription { + "Test data for data-driven conversion tests in icu/source/test/iotest/iotest.cpp\n" + "Run iotest printf\n" + + "argumentType:\n" + "\td: double\n" + "\t1: int8_t (hexadecimal)\n" + "\t2: int16_t (hexadecimal)\n" + "\t4: int32_t (hexadecimal)\n" + "\t8: int64_t (hexadecimal)\n" + "\ts: char * string\n" + "\tS: UChar * string\n" + } + } + TestData { + printf { + Headers { "format", "result", "argumentType", "argument" } + Cases { + { "%e", "1.200000e+000", "d", "1.2" } + { "%e", "1.234568e+006", "d", "1234567.89" } + { "%E", "1.234568E+006", "d", "1234567.89" } + { "%10e", "1.234568e+000", "d", "1.23456789" } + { "%10.4e", "1.2346e+000", "d", "1.23456789" } + { "%-10e", "1.234568e+000", "d", "1.23456789" } + { "%10e", "1.234568e+002", "d", "123.456789" } + { "%-10e", "1.234568e+002", "d", "123.456789" } + { "%-+12.1e", "+1.2e+000 ", "d", "1.234" } + { "%-+12.1e", "-1.2e+000 ", "d", "-1.234" } + { "%- 12.10e", " 1.2340000000e+000", "d", "1.234" } + { "%- 12.1e", "-1.2e+000 ", "d", "-1.234" } + { "%+12.1e", " +1.2e+000", "d", "1.234" } + { "%+12.1e", " -1.2e+000", "d", "-1.234" } + { "% 12.1e", " 1.2e+000", "d", "1.234" } + { "% 12.1e", " -1.2e+000", "d", "-1.234" } + { "%12.1e", " 1.2e+000", "d", "1.234" } + { "%12.1e", " -1.2e+000", "d", "-1.234" } + { "%.2e", "1.23e+000", "d", "1.234" } + { "%.2e", "-1.23e+000", "d", "-1.234" } + { "%3e", "1.234000e+000", "d", "1.234" } + { "%3e", "-1.234000e+000", "d", "-1.234" } + { "%g", "12345.7", "d", "12345.6789" } + { "%g", "123457", "d", "123456.789" } + { "%g", "1.23457e+006", "d", "1234567.89" } + { "%G", "12345.7", "d", "12345.6789" } + { "%G", "123457", "d", "123456.789" } + { "%G", "1.23457E+006", "d", "1234567.89" } + { "%.0f", "-12", "d", "-12.34" } + { "%.0e", "-1e+001", "d", "-12.34" } + { "%.0g", "-1e+001", "d", "-12.34" } + { "%hd", "-30002", "2", "8ace" } + { "%ho", "105316", "2", "8ace" } + { "%hx", "8ace", "2", "8ace" } + { "%lx", "8ace1234", "4", "8ace1234" } + { "%llx", "123456789abcdef0", "8", "123456789abcdef0" } + { "%lu", "2328760884", "4", "8ace1234" } + // %llu doesn't work yet. + { "%ld", "-1966206412", "4", "8ace1234" } + { "%lld", "1311768467463790320", "8", "123456789abcdef0" } + { "%+u", "2328760884", "4", "8ace1234" } // Ignore the + sign argument + } + } + printfPrecision { + Headers { "format", "result", "argumentType", "argument", "precision" } + Cases { + { "%+1.*e", "+1.2346e+000", "d", "1.2345678", :int{4} } + { "%+2.*e", "+1.234568e+000", "d", "1.2345678", :int{6} } + { "%*d", "12345678", "4", "BC614E", :int{7} } + { "%*d", "12345678", "4", "BC614E", :int{8} } + { "%*d", " 12345678", "4", "BC614E", :int{9} } + } + } + scanf { + Headers { "format", "argument", "argumentType", "result" } + Cases { + { "%e", "1.200000e+000", "d", "1.2" } + { "%*e%e", "1.200000e+000 4.825000e+000", "d", "4.825" } + { "%C", "1234", "2", "31" } + { "%*C%C", "1234", "2", "32" } + { "%S", "1234 5678", "S", "1234" } + { "%*S%S", "1234 5678", "S", "5678" } + { "%hd", "1234 5678", "2", "4D2" } + { "%*hd%hd", "1234 5678", "2", "162E" } + { "%d", "1234 5678", "4", "4D2" } + { "%ld", "1234 5678", "4", "4D2" } + { "%lld", "1311768467463790320", "8", "123456789abcdef0" } + { "%3d", "1234 5678", "4", "7B" } + { "%4d", "123", "4", "7B" } + { "%40d", "123", "4", "7B" } + { "%*d%d", "1234 5678", "4", "162E" } + { "%x", "abcd ef01", "4", "abcd" } + { "%3x", "abcd ef01", "4", "abc" } + { "%*hx%hx", "abcd ef01", "2", "ef01" } + { "%ho", "1046539", "2", "89AB" } // Extra 9 on the end + { "%3ho", "7700", "2", "1F8" } // Don't read the 0 at the end + { "%llo", "1777777777777777777777", "8", "FFFFFFFFFFFFFFFF" } + { "%lx", "abcdef01", "4", "abcdef01" } + { "%x", "0x7abcdef0", "4", "7abcdef0" } + { "%llx", "123456789abcdef0", "8", "123456789abcdef0" } + { "%S", "a\U00010000b", "S", "a\U00010000b" } + { "%[abce]", "abcd ef01", "S", "abc" } + { "%*[abce]%[de\\ ]", "abcd ef01", "S", "d e" } + { "%[a\U00010000]", "a\U00010000\U00010001b", "S", "a\U00010000" } + { "%[a-f]", "abccdefg", "S", "abccdef" } + { "%[a-c]", "abccdefg", "S", "abcc" } + { "%[^e-f]", "abccdefg", "S", "abccd" } + { "%3[^e-f]", "abccdefg", "S", "abc" } + { "%*3[abc]%[cde]", "abccdefg", "S", "cde" } + { "%*3S%S", "a bc efg", "S", "bc" } + { "%*3S%S", "abcd efg", "S", "d" } + { "%*3s%s", "abcd efg", "s", "d" } + { "%*3d%d", "1234", "4", "4" } + } + } + } +} diff --git a/icuSources/test/testdata/idna_rules.txt b/icuSources/test/testdata/idna_rules.txt index 26be80ef..ebfd6e3b 100644 --- a/icuSources/test/testdata/idna_rules.txt +++ b/icuSources/test/testdata/idna_rules.txt @@ -71,7 +71,7 @@ idna_rules{ "]"} ProhibitedSet{"[ \\u0020 \\u00A0 \\u1680 \\u2000 \\u2001 \\u2002 \\u2003 \\u2004 \\u2005 \\u2006 \\u2007 " - "\\u2008 \\u2009 \\u200A \\u200B \\u202F \\u205F \\u3000 \\u0000-\\u001F \\u007F " + "\\u2008 \\u2009 \\u200A \\u200B \\u202F \\u205F \\u3000 " "\\u0080-\\u009F \\u06DD \\u070F \\u180E \\u200C \\u200D \\u2028 \\u2029 \\u2060 " "\\u2061 \\u2062 \\u2063 \\u206A-\\u206F \\uFEFF \\uFFF9-\\uFFFC \\U0001D173-\\U0001D17A " "\\uE000-\\uF8FF \\U000F0000-\\U000FFFFD \\U00100000-\\U0010FFFD \\uFDD0-\\uFDEF " diff --git a/icuSources/test/testdata/nfs4_cis_prep.txt b/icuSources/test/testdata/nfs4_cis_prep.txt new file mode 100644 index 00000000..0ed83d5d --- /dev/null +++ b/icuSources/test/testdata/nfs4_cis_prep.txt @@ -0,0 +1,1945 @@ +################### +# Copyright (C) 2003, International Business Machines +# Corporation and others. All Rights Reserved. +################### + +################### +# WARNING: This table is generated by filterRFC3454.pl tool. DO NOT EDIT +################### + +# This table contains code points from Table A.1 from RFC 3454 + +0221; ; UNASSIGNED +0234..024F; ; UNASSIGNED +02AE..02AF; ; UNASSIGNED +02EF..02FF; ; UNASSIGNED +0350..035F; ; UNASSIGNED +0370..0373; ; UNASSIGNED +0376..0379; ; UNASSIGNED +037B..037D; ; UNASSIGNED +037F..0383; ; UNASSIGNED +038B; ; UNASSIGNED +038D; ; UNASSIGNED +03A2; ; UNASSIGNED +03CF; ; UNASSIGNED +03F7..03FF; ; UNASSIGNED +0487; ; UNASSIGNED +04CF; ; UNASSIGNED +04F6..04F7; ; UNASSIGNED +04FA..04FF; ; UNASSIGNED +0510..0530; ; UNASSIGNED +0557..0558; ; UNASSIGNED +0560; ; UNASSIGNED +0588; ; UNASSIGNED +058B..0590; ; UNASSIGNED +05A2; ; UNASSIGNED +05BA; ; UNASSIGNED +05C5..05CF; ; UNASSIGNED +05EB..05EF; ; UNASSIGNED +05F5..060B; ; UNASSIGNED +060D..061A; ; UNASSIGNED +061C..061E; ; UNASSIGNED +0620; ; UNASSIGNED +063B..063F; ; UNASSIGNED +0656..065F; ; UNASSIGNED +06EE..06EF; ; UNASSIGNED +06FF; ; UNASSIGNED +070E; ; UNASSIGNED +072D..072F; ; UNASSIGNED +074B..077F; ; UNASSIGNED +07B2..0900; ; UNASSIGNED +0904; ; UNASSIGNED +093A..093B; ; UNASSIGNED +094E..094F; ; UNASSIGNED +0955..0957; ; UNASSIGNED +0971..0980; ; UNASSIGNED +0984; ; UNASSIGNED +098D..098E; ; UNASSIGNED +0991..0992; ; UNASSIGNED +09A9; ; UNASSIGNED +09B1; ; UNASSIGNED +09B3..09B5; ; UNASSIGNED +09BA..09BB; ; UNASSIGNED +09BD; ; UNASSIGNED +09C5..09C6; ; UNASSIGNED +09C9..09CA; ; UNASSIGNED +09CE..09D6; ; UNASSIGNED +09D8..09DB; ; UNASSIGNED +09DE; ; UNASSIGNED +09E4..09E5; ; UNASSIGNED +09FB..0A01; ; UNASSIGNED +0A03..0A04; ; UNASSIGNED +0A0B..0A0E; ; UNASSIGNED +0A11..0A12; ; UNASSIGNED +0A29; ; UNASSIGNED +0A31; ; UNASSIGNED +0A34; ; UNASSIGNED +0A37; ; UNASSIGNED +0A3A..0A3B; ; UNASSIGNED +0A3D; ; UNASSIGNED +0A43..0A46; ; UNASSIGNED +0A49..0A4A; ; UNASSIGNED +0A4E..0A58; ; UNASSIGNED +0A5D; ; UNASSIGNED +0A5F..0A65; ; UNASSIGNED +0A75..0A80; ; UNASSIGNED +0A84; ; UNASSIGNED +0A8C; ; UNASSIGNED +0A8E; ; UNASSIGNED +0A92; ; UNASSIGNED +0AA9; ; UNASSIGNED +0AB1; ; UNASSIGNED +0AB4; ; UNASSIGNED +0ABA..0ABB; ; UNASSIGNED +0AC6; ; UNASSIGNED +0ACA; ; UNASSIGNED +0ACE..0ACF; ; UNASSIGNED +0AD1..0ADF; ; UNASSIGNED +0AE1..0AE5; ; UNASSIGNED +0AF0..0B00; ; UNASSIGNED +0B04; ; UNASSIGNED +0B0D..0B0E; ; UNASSIGNED +0B11..0B12; ; UNASSIGNED +0B29; ; UNASSIGNED +0B31; ; UNASSIGNED +0B34..0B35; ; UNASSIGNED +0B3A..0B3B; ; UNASSIGNED +0B44..0B46; ; UNASSIGNED +0B49..0B4A; ; UNASSIGNED +0B4E..0B55; ; UNASSIGNED +0B58..0B5B; ; UNASSIGNED +0B5E; ; UNASSIGNED +0B62..0B65; ; UNASSIGNED +0B71..0B81; ; UNASSIGNED +0B84; ; UNASSIGNED +0B8B..0B8D; ; UNASSIGNED +0B91; ; UNASSIGNED +0B96..0B98; ; UNASSIGNED +0B9B; ; UNASSIGNED +0B9D; ; UNASSIGNED +0BA0..0BA2; ; UNASSIGNED +0BA5..0BA7; ; UNASSIGNED +0BAB..0BAD; ; UNASSIGNED +0BB6; ; UNASSIGNED +0BBA..0BBD; ; UNASSIGNED +0BC3..0BC5; ; UNASSIGNED +0BC9; ; UNASSIGNED +0BCE..0BD6; ; UNASSIGNED +0BD8..0BE6; ; UNASSIGNED +0BF3..0C00; ; UNASSIGNED +0C04; ; UNASSIGNED +0C0D; ; UNASSIGNED +0C11; ; UNASSIGNED +0C29; ; UNASSIGNED +0C34; ; UNASSIGNED +0C3A..0C3D; ; UNASSIGNED +0C45; ; UNASSIGNED +0C49; ; UNASSIGNED +0C4E..0C54; ; UNASSIGNED +0C57..0C5F; ; UNASSIGNED +0C62..0C65; ; UNASSIGNED +0C70..0C81; ; UNASSIGNED +0C84; ; UNASSIGNED +0C8D; ; UNASSIGNED +0C91; ; UNASSIGNED +0CA9; ; UNASSIGNED +0CB4; ; UNASSIGNED +0CBA..0CBD; ; UNASSIGNED +0CC5; ; UNASSIGNED +0CC9; ; UNASSIGNED +0CCE..0CD4; ; UNASSIGNED +0CD7..0CDD; ; UNASSIGNED +0CDF; ; UNASSIGNED +0CE2..0CE5; ; UNASSIGNED +0CF0..0D01; ; UNASSIGNED +0D04; ; UNASSIGNED +0D0D; ; UNASSIGNED +0D11; ; UNASSIGNED +0D29; ; UNASSIGNED +0D3A..0D3D; ; UNASSIGNED +0D44..0D45; ; UNASSIGNED +0D49; ; UNASSIGNED +0D4E..0D56; ; UNASSIGNED +0D58..0D5F; ; UNASSIGNED +0D62..0D65; ; UNASSIGNED +0D70..0D81; ; UNASSIGNED +0D84; ; UNASSIGNED +0D97..0D99; ; UNASSIGNED +0DB2; ; UNASSIGNED +0DBC; ; UNASSIGNED +0DBE..0DBF; ; UNASSIGNED +0DC7..0DC9; ; UNASSIGNED +0DCB..0DCE; ; UNASSIGNED +0DD5; ; UNASSIGNED +0DD7; ; UNASSIGNED +0DE0..0DF1; ; UNASSIGNED +0DF5..0E00; ; UNASSIGNED +0E3B..0E3E; ; UNASSIGNED +0E5C..0E80; ; UNASSIGNED +0E83; ; UNASSIGNED +0E85..0E86; ; UNASSIGNED +0E89; ; UNASSIGNED +0E8B..0E8C; ; UNASSIGNED +0E8E..0E93; ; UNASSIGNED +0E98; ; UNASSIGNED +0EA0; ; UNASSIGNED +0EA4; ; UNASSIGNED +0EA6; ; UNASSIGNED +0EA8..0EA9; ; UNASSIGNED +0EAC; ; UNASSIGNED +0EBA; ; UNASSIGNED +0EBE..0EBF; ; UNASSIGNED +0EC5; ; UNASSIGNED +0EC7; ; UNASSIGNED +0ECE..0ECF; ; UNASSIGNED +0EDA..0EDB; ; UNASSIGNED +0EDE..0EFF; ; UNASSIGNED +0F48; ; UNASSIGNED +0F6B..0F70; ; UNASSIGNED +0F8C..0F8F; ; UNASSIGNED +0F98; ; UNASSIGNED +0FBD; ; UNASSIGNED +0FCD..0FCE; ; UNASSIGNED +0FD0..0FFF; ; UNASSIGNED +1022; ; UNASSIGNED +1028; ; UNASSIGNED +102B; ; UNASSIGNED +1033..1035; ; UNASSIGNED +103A..103F; ; UNASSIGNED +105A..109F; ; UNASSIGNED +10C6..10CF; ; UNASSIGNED +10F9..10FA; ; UNASSIGNED +10FC..10FF; ; UNASSIGNED +115A..115E; ; UNASSIGNED +11A3..11A7; ; UNASSIGNED +11FA..11FF; ; UNASSIGNED +1207; ; UNASSIGNED +1247; ; UNASSIGNED +1249; ; UNASSIGNED +124E..124F; ; UNASSIGNED +1257; ; UNASSIGNED +1259; ; UNASSIGNED +125E..125F; ; UNASSIGNED +1287; ; UNASSIGNED +1289; ; UNASSIGNED +128E..128F; ; UNASSIGNED +12AF; ; UNASSIGNED +12B1; ; UNASSIGNED +12B6..12B7; ; UNASSIGNED +12BF; ; UNASSIGNED +12C1; ; UNASSIGNED +12C6..12C7; ; UNASSIGNED +12CF; ; UNASSIGNED +12D7; ; UNASSIGNED +12EF; ; UNASSIGNED +130F; ; UNASSIGNED +1311; ; UNASSIGNED +1316..1317; ; UNASSIGNED +131F; ; UNASSIGNED +1347; ; UNASSIGNED +135B..1360; ; UNASSIGNED +137D..139F; ; UNASSIGNED +13F5..1400; ; UNASSIGNED +1677..167F; ; UNASSIGNED +169D..169F; ; UNASSIGNED +16F1..16FF; ; UNASSIGNED +170D; ; UNASSIGNED +1715..171F; ; UNASSIGNED +1737..173F; ; UNASSIGNED +1754..175F; ; UNASSIGNED +176D; ; UNASSIGNED +1771; ; UNASSIGNED +1774..177F; ; UNASSIGNED +17DD..17DF; ; UNASSIGNED +17EA..17FF; ; UNASSIGNED +180F; ; UNASSIGNED +181A..181F; ; UNASSIGNED +1878..187F; ; UNASSIGNED +18AA..1DFF; ; UNASSIGNED +1E9C..1E9F; ; UNASSIGNED +1EFA..1EFF; ; UNASSIGNED +1F16..1F17; ; UNASSIGNED +1F1E..1F1F; ; UNASSIGNED +1F46..1F47; ; UNASSIGNED +1F4E..1F4F; ; UNASSIGNED +1F58; ; UNASSIGNED +1F5A; ; UNASSIGNED +1F5C; ; UNASSIGNED +1F5E; ; UNASSIGNED +1F7E..1F7F; ; UNASSIGNED +1FB5; ; UNASSIGNED +1FC5; ; UNASSIGNED +1FD4..1FD5; ; UNASSIGNED +1FDC; ; UNASSIGNED +1FF0..1FF1; ; UNASSIGNED +1FF5; ; UNASSIGNED +1FFF; ; UNASSIGNED +2053..2056; ; UNASSIGNED +2058..205E; ; UNASSIGNED +2064..2069; ; UNASSIGNED +2072..2073; ; UNASSIGNED +208F..209F; ; UNASSIGNED +20B2..20CF; ; UNASSIGNED +20EB..20FF; ; UNASSIGNED +213B..213C; ; UNASSIGNED +214C..2152; ; UNASSIGNED +2184..218F; ; UNASSIGNED +23CF..23FF; ; UNASSIGNED +2427..243F; ; UNASSIGNED +244B..245F; ; UNASSIGNED +24FF; ; UNASSIGNED +2614..2615; ; UNASSIGNED +2618; ; UNASSIGNED +267E..267F; ; UNASSIGNED +268A..2700; ; UNASSIGNED +2705; ; UNASSIGNED +270A..270B; ; UNASSIGNED +2728; ; UNASSIGNED +274C; ; UNASSIGNED +274E; ; UNASSIGNED +2753..2755; ; UNASSIGNED +2757; ; UNASSIGNED +275F..2760; ; UNASSIGNED +2795..2797; ; UNASSIGNED +27B0; ; UNASSIGNED +27BF..27CF; ; UNASSIGNED +27EC..27EF; ; UNASSIGNED +2B00..2E7F; ; UNASSIGNED +2E9A; ; UNASSIGNED +2EF4..2EFF; ; UNASSIGNED +2FD6..2FEF; ; UNASSIGNED +2FFC..2FFF; ; UNASSIGNED +3040; ; UNASSIGNED +3097..3098; ; UNASSIGNED +3100..3104; ; UNASSIGNED +312D..3130; ; UNASSIGNED +318F; ; UNASSIGNED +31B8..31EF; ; UNASSIGNED +321D..321F; ; UNASSIGNED +3244..3250; ; UNASSIGNED +327C..327E; ; UNASSIGNED +32CC..32CF; ; UNASSIGNED +32FF; ; UNASSIGNED +3377..337A; ; UNASSIGNED +33DE..33DF; ; UNASSIGNED +33FF; ; UNASSIGNED +4DB6..4DFF; ; UNASSIGNED +9FA6..9FFF; ; UNASSIGNED +A48D..A48F; ; UNASSIGNED +A4C7..ABFF; ; UNASSIGNED +D7A4..D7FF; ; UNASSIGNED +FA2E..FA2F; ; UNASSIGNED +FA6B..FAFF; ; UNASSIGNED +FB07..FB12; ; UNASSIGNED +FB18..FB1C; ; UNASSIGNED +FB37; ; UNASSIGNED +FB3D; ; UNASSIGNED +FB3F; ; UNASSIGNED +FB42; ; UNASSIGNED +FB45; ; UNASSIGNED +FBB2..FBD2; ; UNASSIGNED +FD40..FD4F; ; UNASSIGNED +FD90..FD91; ; UNASSIGNED +FDC8..FDCF; ; UNASSIGNED +FDFD..FDFF; ; UNASSIGNED +FE10..FE1F; ; UNASSIGNED +FE24..FE2F; ; UNASSIGNED +FE47..FE48; ; UNASSIGNED +FE53; ; UNASSIGNED +FE67; ; UNASSIGNED +FE6C..FE6F; ; UNASSIGNED +FE75; ; UNASSIGNED +FEFD..FEFE; ; UNASSIGNED +FF00; ; UNASSIGNED +FFBF..FFC1; ; UNASSIGNED +FFC8..FFC9; ; UNASSIGNED +FFD0..FFD1; ; UNASSIGNED +FFD8..FFD9; ; UNASSIGNED +FFDD..FFDF; ; UNASSIGNED +FFE7; ; UNASSIGNED +FFEF..FFF8; ; UNASSIGNED +10000..102FF; ; UNASSIGNED +1031F; ; UNASSIGNED +10324..1032F; ; UNASSIGNED +1034B..103FF; ; UNASSIGNED +10426..10427; ; UNASSIGNED +1044E..1CFFF; ; UNASSIGNED +1D0F6..1D0FF; ; UNASSIGNED +1D127..1D129; ; UNASSIGNED +1D1DE..1D3FF; ; UNASSIGNED +1D455; ; UNASSIGNED +1D49D; ; UNASSIGNED +1D4A0..1D4A1; ; UNASSIGNED +1D4A3..1D4A4; ; UNASSIGNED +1D4A7..1D4A8; ; UNASSIGNED +1D4AD; ; UNASSIGNED +1D4BA; ; UNASSIGNED +1D4BC; ; UNASSIGNED +1D4C1; ; UNASSIGNED +1D4C4; ; UNASSIGNED +1D506; ; UNASSIGNED +1D50B..1D50C; ; UNASSIGNED +1D515; ; UNASSIGNED +1D51D; ; UNASSIGNED +1D53A; ; UNASSIGNED +1D53F; ; UNASSIGNED +1D545; ; UNASSIGNED +1D547..1D549; ; UNASSIGNED +1D551; ; UNASSIGNED +1D6A4..1D6A7; ; UNASSIGNED +1D7CA..1D7CD; ; UNASSIGNED +1D800..1FFFD; ; UNASSIGNED +2A6D7..2F7FF; ; UNASSIGNED +2FA1E..2FFFD; ; UNASSIGNED +30000..3FFFD; ; UNASSIGNED +40000..4FFFD; ; UNASSIGNED +50000..5FFFD; ; UNASSIGNED +60000..6FFFD; ; UNASSIGNED +70000..7FFFD; ; UNASSIGNED +80000..8FFFD; ; UNASSIGNED +90000..9FFFD; ; UNASSIGNED +A0000..AFFFD; ; UNASSIGNED +B0000..BFFFD; ; UNASSIGNED +C0000..CFFFD; ; UNASSIGNED +D0000..DFFFD; ; UNASSIGNED +E0000; ; UNASSIGNED +E0002..E001F; ; UNASSIGNED +E0080..EFFFD; ; UNASSIGNED + +# Total code points 3653 + +# This table contains code points from Table B.1 from RFC 3454 + +00AD; ; MAP +034F; ; MAP +1806; ; MAP +180B; ; MAP +180C; ; MAP +180D; ; MAP +200B; ; MAP +200C; ; MAP +200D; ; MAP +2060; ; MAP +FE00; ; MAP +FE01; ; MAP +FE02; ; MAP +FE03; ; MAP +FE04; ; MAP +FE05; ; MAP +FE06; ; MAP +FE07; ; MAP +FE08; ; MAP +FE09; ; MAP +FE0A; ; MAP +FE0B; ; MAP +FE0C; ; MAP +FE0D; ; MAP +FE0E; ; MAP +FE0F; ; MAP +FEFF; ; MAP + +# Total code points 27 + +################### +# WARNING: This table is generated by filterRFC3454.pl tool. DO NOT EDIT +################### + +# This table contains code points from Table B.2 from RFC 3454 + +0041; 0061; MAP +0042; 0062; MAP +0043; 0063; MAP +0044; 0064; MAP +0045; 0065; MAP +0046; 0066; MAP +0047; 0067; MAP +0048; 0068; MAP +0049; 0069; MAP +004A; 006A; MAP +004B; 006B; MAP +004C; 006C; MAP +004D; 006D; MAP +004E; 006E; MAP +004F; 006F; MAP +0050; 0070; MAP +0051; 0071; MAP +0052; 0072; MAP +0053; 0073; MAP +0054; 0074; MAP +0055; 0075; MAP +0056; 0076; MAP +0057; 0077; MAP +0058; 0078; MAP +0059; 0079; MAP +005A; 007A; MAP +00B5; 03BC; MAP +00C0; 00E0; MAP +00C1; 00E1; MAP +00C2; 00E2; MAP +00C3; 00E3; MAP +00C4; 00E4; MAP +00C5; 00E5; MAP +00C6; 00E6; MAP +00C7; 00E7; MAP +00C8; 00E8; MAP +00C9; 00E9; MAP +00CA; 00EA; MAP +00CB; 00EB; MAP +00CC; 00EC; MAP +00CD; 00ED; MAP +00CE; 00EE; MAP +00CF; 00EF; MAP +00D0; 00F0; MAP +00D1; 00F1; MAP +00D2; 00F2; MAP +00D3; 00F3; MAP +00D4; 00F4; MAP +00D5; 00F5; MAP +00D6; 00F6; MAP +00D8; 00F8; MAP +00D9; 00F9; MAP +00DA; 00FA; MAP +00DB; 00FB; MAP +00DC; 00FC; MAP +00DD; 00FD; MAP +00DE; 00FE; MAP +00DF; 0073 0073; MAP +0100; 0101; MAP +0102; 0103; MAP +0104; 0105; MAP +0106; 0107; MAP +0108; 0109; MAP +010A; 010B; MAP +010C; 010D; MAP +010E; 010F; MAP +0110; 0111; MAP +0112; 0113; MAP +0114; 0115; MAP +0116; 0117; MAP +0118; 0119; MAP +011A; 011B; MAP +011C; 011D; MAP +011E; 011F; MAP +0120; 0121; MAP +0122; 0123; MAP +0124; 0125; MAP +0126; 0127; MAP +0128; 0129; MAP +012A; 012B; MAP +012C; 012D; MAP +012E; 012F; MAP +0130; 0069 0307; MAP +0132; 0133; MAP +0134; 0135; MAP +0136; 0137; MAP +0139; 013A; MAP +013B; 013C; MAP +013D; 013E; MAP +013F; 0140; MAP +0141; 0142; MAP +0143; 0144; MAP +0145; 0146; MAP +0147; 0148; MAP +0149; 02BC 006E; MAP +014A; 014B; MAP +014C; 014D; MAP +014E; 014F; MAP +0150; 0151; MAP +0152; 0153; MAP +0154; 0155; MAP +0156; 0157; MAP +0158; 0159; MAP +015A; 015B; MAP +015C; 015D; MAP +015E; 015F; MAP +0160; 0161; MAP +0162; 0163; MAP +0164; 0165; MAP +0166; 0167; MAP +0168; 0169; MAP +016A; 016B; MAP +016C; 016D; MAP +016E; 016F; MAP +0170; 0171; MAP +0172; 0173; MAP +0174; 0175; MAP +0176; 0177; MAP +0178; 00FF; MAP +0179; 017A; MAP +017B; 017C; MAP +017D; 017E; MAP +017F; 0073; MAP +0181; 0253; MAP +0182; 0183; MAP +0184; 0185; MAP +0186; 0254; MAP +0187; 0188; MAP +0189; 0256; MAP +018A; 0257; MAP +018B; 018C; MAP +018E; 01DD; MAP +018F; 0259; MAP +0190; 025B; MAP +0191; 0192; MAP +0193; 0260; MAP +0194; 0263; MAP +0196; 0269; MAP +0197; 0268; MAP +0198; 0199; MAP +019C; 026F; MAP +019D; 0272; MAP +019F; 0275; MAP +01A0; 01A1; MAP +01A2; 01A3; MAP +01A4; 01A5; MAP +01A6; 0280; MAP +01A7; 01A8; MAP +01A9; 0283; MAP +01AC; 01AD; MAP +01AE; 0288; MAP +01AF; 01B0; MAP +01B1; 028A; MAP +01B2; 028B; MAP +01B3; 01B4; MAP +01B5; 01B6; MAP +01B7; 0292; MAP +01B8; 01B9; MAP +01BC; 01BD; MAP +01C4; 01C6; MAP +01C5; 01C6; MAP +01C7; 01C9; MAP +01C8; 01C9; MAP +01CA; 01CC; MAP +01CB; 01CC; MAP +01CD; 01CE; MAP +01CF; 01D0; MAP +01D1; 01D2; MAP +01D3; 01D4; MAP +01D5; 01D6; MAP +01D7; 01D8; MAP +01D9; 01DA; MAP +01DB; 01DC; MAP +01DE; 01DF; MAP +01E0; 01E1; MAP +01E2; 01E3; MAP +01E4; 01E5; MAP +01E6; 01E7; MAP +01E8; 01E9; MAP +01EA; 01EB; MAP +01EC; 01ED; MAP +01EE; 01EF; MAP +01F0; 006A 030C; MAP +01F1; 01F3; MAP +01F2; 01F3; MAP +01F4; 01F5; MAP +01F6; 0195; MAP +01F7; 01BF; MAP +01F8; 01F9; MAP +01FA; 01FB; MAP +01FC; 01FD; MAP +01FE; 01FF; MAP +0200; 0201; MAP +0202; 0203; MAP +0204; 0205; MAP +0206; 0207; MAP +0208; 0209; MAP +020A; 020B; MAP +020C; 020D; MAP +020E; 020F; MAP +0210; 0211; MAP +0212; 0213; MAP +0214; 0215; MAP +0216; 0217; MAP +0218; 0219; MAP +021A; 021B; MAP +021C; 021D; MAP +021E; 021F; MAP +0220; 019E; MAP +0222; 0223; MAP +0224; 0225; MAP +0226; 0227; MAP +0228; 0229; MAP +022A; 022B; MAP +022C; 022D; MAP +022E; 022F; MAP +0230; 0231; MAP +0232; 0233; MAP +0345; 03B9; MAP +037A; 0020 03B9; MAP +0386; 03AC; MAP +0388; 03AD; MAP +0389; 03AE; MAP +038A; 03AF; MAP +038C; 03CC; MAP +038E; 03CD; MAP +038F; 03CE; MAP +0390; 03B9 0308 0301; MAP +0391; 03B1; MAP +0392; 03B2; MAP +0393; 03B3; MAP +0394; 03B4; MAP +0395; 03B5; MAP +0396; 03B6; MAP +0397; 03B7; MAP +0398; 03B8; MAP +0399; 03B9; MAP +039A; 03BA; MAP +039B; 03BB; MAP +039C; 03BC; MAP +039D; 03BD; MAP +039E; 03BE; MAP +039F; 03BF; MAP +03A0; 03C0; MAP +03A1; 03C1; MAP +03A3; 03C3; MAP +03A4; 03C4; MAP +03A5; 03C5; MAP +03A6; 03C6; MAP +03A7; 03C7; MAP +03A8; 03C8; MAP +03A9; 03C9; MAP +03AA; 03CA; MAP +03AB; 03CB; MAP +03B0; 03C5 0308 0301; MAP +03C2; 03C3; MAP +03D0; 03B2; MAP +03D1; 03B8; MAP +03D2; 03C5; MAP +03D3; 03CD; MAP +03D4; 03CB; MAP +03D5; 03C6; MAP +03D6; 03C0; MAP +03D8; 03D9; MAP +03DA; 03DB; MAP +03DC; 03DD; MAP +03DE; 03DF; MAP +03E0; 03E1; MAP +03E2; 03E3; MAP +03E4; 03E5; MAP +03E6; 03E7; MAP +03E8; 03E9; MAP +03EA; 03EB; MAP +03EC; 03ED; MAP +03EE; 03EF; MAP +03F0; 03BA; MAP +03F1; 03C1; MAP +03F2; 03C3; MAP +03F4; 03B8; MAP +03F5; 03B5; MAP +0400; 0450; MAP +0401; 0451; MAP +0402; 0452; MAP +0403; 0453; MAP +0404; 0454; MAP +0405; 0455; MAP +0406; 0456; MAP +0407; 0457; MAP +0408; 0458; MAP +0409; 0459; MAP +040A; 045A; MAP +040B; 045B; MAP +040C; 045C; MAP +040D; 045D; MAP +040E; 045E; MAP +040F; 045F; MAP +0410; 0430; MAP +0411; 0431; MAP +0412; 0432; MAP +0413; 0433; MAP +0414; 0434; MAP +0415; 0435; MAP +0416; 0436; MAP +0417; 0437; MAP +0418; 0438; MAP +0419; 0439; MAP +041A; 043A; MAP +041B; 043B; MAP +041C; 043C; MAP +041D; 043D; MAP +041E; 043E; MAP +041F; 043F; MAP +0420; 0440; MAP +0421; 0441; MAP +0422; 0442; MAP +0423; 0443; MAP +0424; 0444; MAP +0425; 0445; MAP +0426; 0446; MAP +0427; 0447; MAP +0428; 0448; MAP +0429; 0449; MAP +042A; 044A; MAP +042B; 044B; MAP +042C; 044C; MAP +042D; 044D; MAP +042E; 044E; MAP +042F; 044F; MAP +0460; 0461; MAP +0462; 0463; MAP +0464; 0465; MAP +0466; 0467; MAP +0468; 0469; MAP +046A; 046B; MAP +046C; 046D; MAP +046E; 046F; MAP +0470; 0471; MAP +0472; 0473; MAP +0474; 0475; MAP +0476; 0477; MAP +0478; 0479; MAP +047A; 047B; MAP +047C; 047D; MAP +047E; 047F; MAP +0480; 0481; MAP +048A; 048B; MAP +048C; 048D; MAP +048E; 048F; MAP +0490; 0491; MAP +0492; 0493; MAP +0494; 0495; MAP +0496; 0497; MAP +0498; 0499; MAP +049A; 049B; MAP +049C; 049D; MAP +049E; 049F; MAP +04A0; 04A1; MAP +04A2; 04A3; MAP +04A4; 04A5; MAP +04A6; 04A7; MAP +04A8; 04A9; MAP +04AA; 04AB; MAP +04AC; 04AD; MAP +04AE; 04AF; MAP +04B0; 04B1; MAP +04B2; 04B3; MAP +04B4; 04B5; MAP +04B6; 04B7; MAP +04B8; 04B9; MAP +04BA; 04BB; MAP +04BC; 04BD; MAP +04BE; 04BF; MAP +04C1; 04C2; MAP +04C3; 04C4; MAP +04C5; 04C6; MAP +04C7; 04C8; MAP +04C9; 04CA; MAP +04CB; 04CC; MAP +04CD; 04CE; MAP +04D0; 04D1; MAP +04D2; 04D3; MAP +04D4; 04D5; MAP +04D6; 04D7; MAP +04D8; 04D9; MAP +04DA; 04DB; MAP +04DC; 04DD; MAP +04DE; 04DF; MAP +04E0; 04E1; MAP +04E2; 04E3; MAP +04E4; 04E5; MAP +04E6; 04E7; MAP +04E8; 04E9; MAP +04EA; 04EB; MAP +04EC; 04ED; MAP +04EE; 04EF; MAP +04F0; 04F1; MAP +04F2; 04F3; MAP +04F4; 04F5; MAP +04F8; 04F9; MAP +0500; 0501; MAP +0502; 0503; MAP +0504; 0505; MAP +0506; 0507; MAP +0508; 0509; MAP +050A; 050B; MAP +050C; 050D; MAP +050E; 050F; MAP +0531; 0561; MAP +0532; 0562; MAP +0533; 0563; MAP +0534; 0564; MAP +0535; 0565; MAP +0536; 0566; MAP +0537; 0567; MAP +0538; 0568; MAP +0539; 0569; MAP +053A; 056A; MAP +053B; 056B; MAP +053C; 056C; MAP +053D; 056D; MAP +053E; 056E; MAP +053F; 056F; MAP +0540; 0570; MAP +0541; 0571; MAP +0542; 0572; MAP +0543; 0573; MAP +0544; 0574; MAP +0545; 0575; MAP +0546; 0576; MAP +0547; 0577; MAP +0548; 0578; MAP +0549; 0579; MAP +054A; 057A; MAP +054B; 057B; MAP +054C; 057C; MAP +054D; 057D; MAP +054E; 057E; MAP +054F; 057F; MAP +0550; 0580; MAP +0551; 0581; MAP +0552; 0582; MAP +0553; 0583; MAP +0554; 0584; MAP +0555; 0585; MAP +0556; 0586; MAP +0587; 0565 0582; MAP +1E00; 1E01; MAP +1E02; 1E03; MAP +1E04; 1E05; MAP +1E06; 1E07; MAP +1E08; 1E09; MAP +1E0A; 1E0B; MAP +1E0C; 1E0D; MAP +1E0E; 1E0F; MAP +1E10; 1E11; MAP +1E12; 1E13; MAP +1E14; 1E15; MAP +1E16; 1E17; MAP +1E18; 1E19; MAP +1E1A; 1E1B; MAP +1E1C; 1E1D; MAP +1E1E; 1E1F; MAP +1E20; 1E21; MAP +1E22; 1E23; MAP +1E24; 1E25; MAP +1E26; 1E27; MAP +1E28; 1E29; MAP +1E2A; 1E2B; MAP +1E2C; 1E2D; MAP +1E2E; 1E2F; MAP +1E30; 1E31; MAP +1E32; 1E33; MAP +1E34; 1E35; MAP +1E36; 1E37; MAP +1E38; 1E39; MAP +1E3A; 1E3B; MAP +1E3C; 1E3D; MAP +1E3E; 1E3F; MAP +1E40; 1E41; MAP +1E42; 1E43; MAP +1E44; 1E45; MAP +1E46; 1E47; MAP +1E48; 1E49; MAP +1E4A; 1E4B; MAP +1E4C; 1E4D; MAP +1E4E; 1E4F; MAP +1E50; 1E51; MAP +1E52; 1E53; MAP +1E54; 1E55; MAP +1E56; 1E57; MAP +1E58; 1E59; MAP +1E5A; 1E5B; MAP +1E5C; 1E5D; MAP +1E5E; 1E5F; MAP +1E60; 1E61; MAP +1E62; 1E63; MAP +1E64; 1E65; MAP +1E66; 1E67; MAP +1E68; 1E69; MAP +1E6A; 1E6B; MAP +1E6C; 1E6D; MAP +1E6E; 1E6F; MAP +1E70; 1E71; MAP +1E72; 1E73; MAP +1E74; 1E75; MAP +1E76; 1E77; MAP +1E78; 1E79; MAP +1E7A; 1E7B; MAP +1E7C; 1E7D; MAP +1E7E; 1E7F; MAP +1E80; 1E81; MAP +1E82; 1E83; MAP +1E84; 1E85; MAP +1E86; 1E87; MAP +1E88; 1E89; MAP +1E8A; 1E8B; MAP +1E8C; 1E8D; MAP +1E8E; 1E8F; MAP +1E90; 1E91; MAP +1E92; 1E93; MAP +1E94; 1E95; MAP +1E96; 0068 0331; MAP +1E97; 0074 0308; MAP +1E98; 0077 030A; MAP +1E99; 0079 030A; MAP +1E9A; 0061 02BE; MAP +1E9B; 1E61; MAP +1EA0; 1EA1; MAP +1EA2; 1EA3; MAP +1EA4; 1EA5; MAP +1EA6; 1EA7; MAP +1EA8; 1EA9; MAP +1EAA; 1EAB; MAP +1EAC; 1EAD; MAP +1EAE; 1EAF; MAP +1EB0; 1EB1; MAP +1EB2; 1EB3; MAP +1EB4; 1EB5; MAP +1EB6; 1EB7; MAP +1EB8; 1EB9; MAP +1EBA; 1EBB; MAP +1EBC; 1EBD; MAP +1EBE; 1EBF; MAP +1EC0; 1EC1; MAP +1EC2; 1EC3; MAP +1EC4; 1EC5; MAP +1EC6; 1EC7; MAP +1EC8; 1EC9; MAP +1ECA; 1ECB; MAP +1ECC; 1ECD; MAP +1ECE; 1ECF; MAP +1ED0; 1ED1; MAP +1ED2; 1ED3; MAP +1ED4; 1ED5; MAP +1ED6; 1ED7; MAP +1ED8; 1ED9; MAP +1EDA; 1EDB; MAP +1EDC; 1EDD; MAP +1EDE; 1EDF; MAP +1EE0; 1EE1; MAP +1EE2; 1EE3; MAP +1EE4; 1EE5; MAP +1EE6; 1EE7; MAP +1EE8; 1EE9; MAP +1EEA; 1EEB; MAP +1EEC; 1EED; MAP +1EEE; 1EEF; MAP +1EF0; 1EF1; MAP +1EF2; 1EF3; MAP +1EF4; 1EF5; MAP +1EF6; 1EF7; MAP +1EF8; 1EF9; MAP +1F08; 1F00; MAP +1F09; 1F01; MAP +1F0A; 1F02; MAP +1F0B; 1F03; MAP +1F0C; 1F04; MAP +1F0D; 1F05; MAP +1F0E; 1F06; MAP +1F0F; 1F07; MAP +1F18; 1F10; MAP +1F19; 1F11; MAP +1F1A; 1F12; MAP +1F1B; 1F13; MAP +1F1C; 1F14; MAP +1F1D; 1F15; MAP +1F28; 1F20; MAP +1F29; 1F21; MAP +1F2A; 1F22; MAP +1F2B; 1F23; MAP +1F2C; 1F24; MAP +1F2D; 1F25; MAP +1F2E; 1F26; MAP +1F2F; 1F27; MAP +1F38; 1F30; MAP +1F39; 1F31; MAP +1F3A; 1F32; MAP +1F3B; 1F33; MAP +1F3C; 1F34; MAP +1F3D; 1F35; MAP +1F3E; 1F36; MAP +1F3F; 1F37; MAP +1F48; 1F40; MAP +1F49; 1F41; MAP +1F4A; 1F42; MAP +1F4B; 1F43; MAP +1F4C; 1F44; MAP +1F4D; 1F45; MAP +1F50; 03C5 0313; MAP +1F52; 03C5 0313 0300; MAP +1F54; 03C5 0313 0301; MAP +1F56; 03C5 0313 0342; MAP +1F59; 1F51; MAP +1F5B; 1F53; MAP +1F5D; 1F55; MAP +1F5F; 1F57; MAP +1F68; 1F60; MAP +1F69; 1F61; MAP +1F6A; 1F62; MAP +1F6B; 1F63; MAP +1F6C; 1F64; MAP +1F6D; 1F65; MAP +1F6E; 1F66; MAP +1F6F; 1F67; MAP +1F80; 1F00 03B9; MAP +1F81; 1F01 03B9; MAP +1F82; 1F02 03B9; MAP +1F83; 1F03 03B9; MAP +1F84; 1F04 03B9; MAP +1F85; 1F05 03B9; MAP +1F86; 1F06 03B9; MAP +1F87; 1F07 03B9; MAP +1F88; 1F00 03B9; MAP +1F89; 1F01 03B9; MAP +1F8A; 1F02 03B9; MAP +1F8B; 1F03 03B9; MAP +1F8C; 1F04 03B9; MAP +1F8D; 1F05 03B9; MAP +1F8E; 1F06 03B9; MAP +1F8F; 1F07 03B9; MAP +1F90; 1F20 03B9; MAP +1F91; 1F21 03B9; MAP +1F92; 1F22 03B9; MAP +1F93; 1F23 03B9; MAP +1F94; 1F24 03B9; MAP +1F95; 1F25 03B9; MAP +1F96; 1F26 03B9; MAP +1F97; 1F27 03B9; MAP +1F98; 1F20 03B9; MAP +1F99; 1F21 03B9; MAP +1F9A; 1F22 03B9; MAP +1F9B; 1F23 03B9; MAP +1F9C; 1F24 03B9; MAP +1F9D; 1F25 03B9; MAP +1F9E; 1F26 03B9; MAP +1F9F; 1F27 03B9; MAP +1FA0; 1F60 03B9; MAP +1FA1; 1F61 03B9; MAP +1FA2; 1F62 03B9; MAP +1FA3; 1F63 03B9; MAP +1FA4; 1F64 03B9; MAP +1FA5; 1F65 03B9; MAP +1FA6; 1F66 03B9; MAP +1FA7; 1F67 03B9; MAP +1FA8; 1F60 03B9; MAP +1FA9; 1F61 03B9; MAP +1FAA; 1F62 03B9; MAP +1FAB; 1F63 03B9; MAP +1FAC; 1F64 03B9; MAP +1FAD; 1F65 03B9; MAP +1FAE; 1F66 03B9; MAP +1FAF; 1F67 03B9; MAP +1FB2; 1F70 03B9; MAP +1FB3; 03B1 03B9; MAP +1FB4; 03AC 03B9; MAP +1FB6; 03B1 0342; MAP +1FB7; 03B1 0342 03B9; MAP +1FB8; 1FB0; MAP +1FB9; 1FB1; MAP +1FBA; 1F70; MAP +1FBB; 1F71; MAP +1FBC; 03B1 03B9; MAP +1FBE; 03B9; MAP +1FC2; 1F74 03B9; MAP +1FC3; 03B7 03B9; MAP +1FC4; 03AE 03B9; MAP +1FC6; 03B7 0342; MAP +1FC7; 03B7 0342 03B9; MAP +1FC8; 1F72; MAP +1FC9; 1F73; MAP +1FCA; 1F74; MAP +1FCB; 1F75; MAP +1FCC; 03B7 03B9; MAP +1FD2; 03B9 0308 0300; MAP +1FD3; 03B9 0308 0301; MAP +1FD6; 03B9 0342; MAP +1FD7; 03B9 0308 0342; MAP +1FD8; 1FD0; MAP +1FD9; 1FD1; MAP +1FDA; 1F76; MAP +1FDB; 1F77; MAP +1FE2; 03C5 0308 0300; MAP +1FE3; 03C5 0308 0301; MAP +1FE4; 03C1 0313; MAP +1FE6; 03C5 0342; MAP +1FE7; 03C5 0308 0342; MAP +1FE8; 1FE0; MAP +1FE9; 1FE1; MAP +1FEA; 1F7A; MAP +1FEB; 1F7B; MAP +1FEC; 1FE5; MAP +1FF2; 1F7C 03B9; MAP +1FF3; 03C9 03B9; MAP +1FF4; 03CE 03B9; MAP +1FF6; 03C9 0342; MAP +1FF7; 03C9 0342 03B9; MAP +1FF8; 1F78; MAP +1FF9; 1F79; MAP +1FFA; 1F7C; MAP +1FFB; 1F7D; MAP +1FFC; 03C9 03B9; MAP +20A8; 0072 0073; MAP +2102; 0063; MAP +2103; 00B0 0063; MAP +2107; 025B; MAP +2109; 00B0 0066; MAP +210B; 0068; MAP +210C; 0068; MAP +210D; 0068; MAP +2110; 0069; MAP +2111; 0069; MAP +2112; 006C; MAP +2115; 006E; MAP +2116; 006E 006F; MAP +2119; 0070; MAP +211A; 0071; MAP +211B; 0072; MAP +211C; 0072; MAP +211D; 0072; MAP +2120; 0073 006D; MAP +2121; 0074 0065 006C; MAP +2122; 0074 006D; MAP +2124; 007A; MAP +2126; 03C9; MAP +2128; 007A; MAP +212A; 006B; MAP +212B; 00E5; MAP +212C; 0062; MAP +212D; 0063; MAP +2130; 0065; MAP +2131; 0066; MAP +2133; 006D; MAP +213E; 03B3; MAP +213F; 03C0; MAP +2145; 0064; MAP +2160; 2170; MAP +2161; 2171; MAP +2162; 2172; MAP +2163; 2173; MAP +2164; 2174; MAP +2165; 2175; MAP +2166; 2176; MAP +2167; 2177; MAP +2168; 2178; MAP +2169; 2179; MAP +216A; 217A; MAP +216B; 217B; MAP +216C; 217C; MAP +216D; 217D; MAP +216E; 217E; MAP +216F; 217F; MAP +24B6; 24D0; MAP +24B7; 24D1; MAP +24B8; 24D2; MAP +24B9; 24D3; MAP +24BA; 24D4; MAP +24BB; 24D5; MAP +24BC; 24D6; MAP +24BD; 24D7; MAP +24BE; 24D8; MAP +24BF; 24D9; MAP +24C0; 24DA; MAP +24C1; 24DB; MAP +24C2; 24DC; MAP +24C3; 24DD; MAP +24C4; 24DE; MAP +24C5; 24DF; MAP +24C6; 24E0; MAP +24C7; 24E1; MAP +24C8; 24E2; MAP +24C9; 24E3; MAP +24CA; 24E4; MAP +24CB; 24E5; MAP +24CC; 24E6; MAP +24CD; 24E7; MAP +24CE; 24E8; MAP +24CF; 24E9; MAP +3371; 0068 0070 0061; MAP +3373; 0061 0075; MAP +3375; 006F 0076; MAP +3380; 0070 0061; MAP +3381; 006E 0061; MAP +3382; 03BC 0061; MAP +3383; 006D 0061; MAP +3384; 006B 0061; MAP +3385; 006B 0062; MAP +3386; 006D 0062; MAP +3387; 0067 0062; MAP +338A; 0070 0066; MAP +338B; 006E 0066; MAP +338C; 03BC 0066; MAP +3390; 0068 007A; MAP +3391; 006B 0068 007A; MAP +3392; 006D 0068 007A; MAP +3393; 0067 0068 007A; MAP +3394; 0074 0068 007A; MAP +33A9; 0070 0061; MAP +33AA; 006B 0070 0061; MAP +33AB; 006D 0070 0061; MAP +33AC; 0067 0070 0061; MAP +33B4; 0070 0076; MAP +33B5; 006E 0076; MAP +33B6; 03BC 0076; MAP +33B7; 006D 0076; MAP +33B8; 006B 0076; MAP +33B9; 006D 0076; MAP +33BA; 0070 0077; MAP +33BB; 006E 0077; MAP +33BC; 03BC 0077; MAP +33BD; 006D 0077; MAP +33BE; 006B 0077; MAP +33BF; 006D 0077; MAP +33C0; 006B 03C9; MAP +33C1; 006D 03C9; MAP +33C3; 0062 0071; MAP +33C6; 0063 2215 006B 0067; MAP +33C7; 0063 006F 002E; MAP +33C8; 0064 0062; MAP +33C9; 0067 0079; MAP +33CB; 0068 0070; MAP +33CD; 006B 006B; MAP +33CE; 006B 006D; MAP +33D7; 0070 0068; MAP +33D9; 0070 0070 006D; MAP +33DA; 0070 0072; MAP +33DC; 0073 0076; MAP +33DD; 0077 0062; MAP +FB00; 0066 0066; MAP +FB01; 0066 0069; MAP +FB02; 0066 006C; MAP +FB03; 0066 0066 0069; MAP +FB04; 0066 0066 006C; MAP +FB05; 0073 0074; MAP +FB06; 0073 0074; MAP +FB13; 0574 0576; MAP +FB14; 0574 0565; MAP +FB15; 0574 056B; MAP +FB16; 057E 0576; MAP +FB17; 0574 056D; MAP +FF21; FF41; MAP +FF22; FF42; MAP +FF23; FF43; MAP +FF24; FF44; MAP +FF25; FF45; MAP +FF26; FF46; MAP +FF27; FF47; MAP +FF28; FF48; MAP +FF29; FF49; MAP +FF2A; FF4A; MAP +FF2B; FF4B; MAP +FF2C; FF4C; MAP +FF2D; FF4D; MAP +FF2E; FF4E; MAP +FF2F; FF4F; MAP +FF30; FF50; MAP +FF31; FF51; MAP +FF32; FF52; MAP +FF33; FF53; MAP +FF34; FF54; MAP +FF35; FF55; MAP +FF36; FF56; MAP +FF37; FF57; MAP +FF38; FF58; MAP +FF39; FF59; MAP +FF3A; FF5A; MAP +10400; 10428; MAP +10401; 10429; MAP +10402; 1042A; MAP +10403; 1042B; MAP +10404; 1042C; MAP +10405; 1042D; MAP +10406; 1042E; MAP +10407; 1042F; MAP +10408; 10430; MAP +10409; 10431; MAP +1040A; 10432; MAP +1040B; 10433; MAP +1040C; 10434; MAP +1040D; 10435; MAP +1040E; 10436; MAP +1040F; 10437; MAP +10410; 10438; MAP +10411; 10439; MAP +10412; 1043A; MAP +10413; 1043B; MAP +10414; 1043C; MAP +10415; 1043D; MAP +10416; 1043E; MAP +10417; 1043F; MAP +10418; 10440; MAP +10419; 10441; MAP +1041A; 10442; MAP +1041B; 10443; MAP +1041C; 10444; MAP +1041D; 10445; MAP +1041E; 10446; MAP +1041F; 10447; MAP +10420; 10448; MAP +10421; 10449; MAP +10422; 1044A; MAP +10423; 1044B; MAP +10424; 1044C; MAP +10425; 1044D; MAP +1D400; 0061; MAP +1D401; 0062; MAP +1D402; 0063; MAP +1D403; 0064; MAP +1D404; 0065; MAP +1D405; 0066; MAP +1D406; 0067; MAP +1D407; 0068; MAP +1D408; 0069; MAP +1D409; 006A; MAP +1D40A; 006B; MAP +1D40B; 006C; MAP +1D40C; 006D; MAP +1D40D; 006E; MAP +1D40E; 006F; MAP +1D40F; 0070; MAP +1D410; 0071; MAP +1D411; 0072; MAP +1D412; 0073; MAP +1D413; 0074; MAP +1D414; 0075; MAP +1D415; 0076; MAP +1D416; 0077; MAP +1D417; 0078; MAP +1D418; 0079; MAP +1D419; 007A; MAP +1D434; 0061; MAP +1D435; 0062; MAP +1D436; 0063; MAP +1D437; 0064; MAP +1D438; 0065; MAP +1D439; 0066; MAP +1D43A; 0067; MAP +1D43B; 0068; MAP +1D43C; 0069; MAP +1D43D; 006A; MAP +1D43E; 006B; MAP +1D43F; 006C; MAP +1D440; 006D; MAP +1D441; 006E; MAP +1D442; 006F; MAP +1D443; 0070; MAP +1D444; 0071; MAP +1D445; 0072; MAP +1D446; 0073; MAP +1D447; 0074; MAP +1D448; 0075; MAP +1D449; 0076; MAP +1D44A; 0077; MAP +1D44B; 0078; MAP +1D44C; 0079; MAP +1D44D; 007A; MAP +1D468; 0061; MAP +1D469; 0062; MAP +1D46A; 0063; MAP +1D46B; 0064; MAP +1D46C; 0065; MAP +1D46D; 0066; MAP +1D46E; 0067; MAP +1D46F; 0068; MAP +1D470; 0069; MAP +1D471; 006A; MAP +1D472; 006B; MAP +1D473; 006C; MAP +1D474; 006D; MAP +1D475; 006E; MAP +1D476; 006F; MAP +1D477; 0070; MAP +1D478; 0071; MAP +1D479; 0072; MAP +1D47A; 0073; MAP +1D47B; 0074; MAP +1D47C; 0075; MAP +1D47D; 0076; MAP +1D47E; 0077; MAP +1D47F; 0078; MAP +1D480; 0079; MAP +1D481; 007A; MAP +1D49C; 0061; MAP +1D49E; 0063; MAP +1D49F; 0064; MAP +1D4A2; 0067; MAP +1D4A5; 006A; MAP +1D4A6; 006B; MAP +1D4A9; 006E; MAP +1D4AA; 006F; MAP +1D4AB; 0070; MAP +1D4AC; 0071; MAP +1D4AE; 0073; MAP +1D4AF; 0074; MAP +1D4B0; 0075; MAP +1D4B1; 0076; MAP +1D4B2; 0077; MAP +1D4B3; 0078; MAP +1D4B4; 0079; MAP +1D4B5; 007A; MAP +1D4D0; 0061; MAP +1D4D1; 0062; MAP +1D4D2; 0063; MAP +1D4D3; 0064; MAP +1D4D4; 0065; MAP +1D4D5; 0066; MAP +1D4D6; 0067; MAP +1D4D7; 0068; MAP +1D4D8; 0069; MAP +1D4D9; 006A; MAP +1D4DA; 006B; MAP +1D4DB; 006C; MAP +1D4DC; 006D; MAP +1D4DD; 006E; MAP +1D4DE; 006F; MAP +1D4DF; 0070; MAP +1D4E0; 0071; MAP +1D4E1; 0072; MAP +1D4E2; 0073; MAP +1D4E3; 0074; MAP +1D4E4; 0075; MAP +1D4E5; 0076; MAP +1D4E6; 0077; MAP +1D4E7; 0078; MAP +1D4E8; 0079; MAP +1D4E9; 007A; MAP +1D504; 0061; MAP +1D505; 0062; MAP +1D507; 0064; MAP +1D508; 0065; MAP +1D509; 0066; MAP +1D50A; 0067; MAP +1D50D; 006A; MAP +1D50E; 006B; MAP +1D50F; 006C; MAP +1D510; 006D; MAP +1D511; 006E; MAP +1D512; 006F; MAP +1D513; 0070; MAP +1D514; 0071; MAP +1D516; 0073; MAP +1D517; 0074; MAP +1D518; 0075; MAP +1D519; 0076; MAP +1D51A; 0077; MAP +1D51B; 0078; MAP +1D51C; 0079; MAP +1D538; 0061; MAP +1D539; 0062; MAP +1D53B; 0064; MAP +1D53C; 0065; MAP +1D53D; 0066; MAP +1D53E; 0067; MAP +1D540; 0069; MAP +1D541; 006A; MAP +1D542; 006B; MAP +1D543; 006C; MAP +1D544; 006D; MAP +1D546; 006F; MAP +1D54A; 0073; MAP +1D54B; 0074; MAP +1D54C; 0075; MAP +1D54D; 0076; MAP +1D54E; 0077; MAP +1D54F; 0078; MAP +1D550; 0079; MAP +1D56C; 0061; MAP +1D56D; 0062; MAP +1D56E; 0063; MAP +1D56F; 0064; MAP +1D570; 0065; MAP +1D571; 0066; MAP +1D572; 0067; MAP +1D573; 0068; MAP +1D574; 0069; MAP +1D575; 006A; MAP +1D576; 006B; MAP +1D577; 006C; MAP +1D578; 006D; MAP +1D579; 006E; MAP +1D57A; 006F; MAP +1D57B; 0070; MAP +1D57C; 0071; MAP +1D57D; 0072; MAP +1D57E; 0073; MAP +1D57F; 0074; MAP +1D580; 0075; MAP +1D581; 0076; MAP +1D582; 0077; MAP +1D583; 0078; MAP +1D584; 0079; MAP +1D585; 007A; MAP +1D5A0; 0061; MAP +1D5A1; 0062; MAP +1D5A2; 0063; MAP +1D5A3; 0064; MAP +1D5A4; 0065; MAP +1D5A5; 0066; MAP +1D5A6; 0067; MAP +1D5A7; 0068; MAP +1D5A8; 0069; MAP +1D5A9; 006A; MAP +1D5AA; 006B; MAP +1D5AB; 006C; MAP +1D5AC; 006D; MAP +1D5AD; 006E; MAP +1D5AE; 006F; MAP +1D5AF; 0070; MAP +1D5B0; 0071; MAP +1D5B1; 0072; MAP +1D5B2; 0073; MAP +1D5B3; 0074; MAP +1D5B4; 0075; MAP +1D5B5; 0076; MAP +1D5B6; 0077; MAP +1D5B7; 0078; MAP +1D5B8; 0079; MAP +1D5B9; 007A; MAP +1D5D4; 0061; MAP +1D5D5; 0062; MAP +1D5D6; 0063; MAP +1D5D7; 0064; MAP +1D5D8; 0065; MAP +1D5D9; 0066; MAP +1D5DA; 0067; MAP +1D5DB; 0068; MAP +1D5DC; 0069; MAP +1D5DD; 006A; MAP +1D5DE; 006B; MAP +1D5DF; 006C; MAP +1D5E0; 006D; MAP +1D5E1; 006E; MAP +1D5E2; 006F; MAP +1D5E3; 0070; MAP +1D5E4; 0071; MAP +1D5E5; 0072; MAP +1D5E6; 0073; MAP +1D5E7; 0074; MAP +1D5E8; 0075; MAP +1D5E9; 0076; MAP +1D5EA; 0077; MAP +1D5EB; 0078; MAP +1D5EC; 0079; MAP +1D5ED; 007A; MAP +1D608; 0061; MAP +1D609; 0062; MAP +1D60A; 0063; MAP +1D60B; 0064; MAP +1D60C; 0065; MAP +1D60D; 0066; MAP +1D60E; 0067; MAP +1D60F; 0068; MAP +1D610; 0069; MAP +1D611; 006A; MAP +1D612; 006B; MAP +1D613; 006C; MAP +1D614; 006D; MAP +1D615; 006E; MAP +1D616; 006F; MAP +1D617; 0070; MAP +1D618; 0071; MAP +1D619; 0072; MAP +1D61A; 0073; MAP +1D61B; 0074; MAP +1D61C; 0075; MAP +1D61D; 0076; MAP +1D61E; 0077; MAP +1D61F; 0078; MAP +1D620; 0079; MAP +1D621; 007A; MAP +1D63C; 0061; MAP +1D63D; 0062; MAP +1D63E; 0063; MAP +1D63F; 0064; MAP +1D640; 0065; MAP +1D641; 0066; MAP +1D642; 0067; MAP +1D643; 0068; MAP +1D644; 0069; MAP +1D645; 006A; MAP +1D646; 006B; MAP +1D647; 006C; MAP +1D648; 006D; MAP +1D649; 006E; MAP +1D64A; 006F; MAP +1D64B; 0070; MAP +1D64C; 0071; MAP +1D64D; 0072; MAP +1D64E; 0073; MAP +1D64F; 0074; MAP +1D650; 0075; MAP +1D651; 0076; MAP +1D652; 0077; MAP +1D653; 0078; MAP +1D654; 0079; MAP +1D655; 007A; MAP +1D670; 0061; MAP +1D671; 0062; MAP +1D672; 0063; MAP +1D673; 0064; MAP +1D674; 0065; MAP +1D675; 0066; MAP +1D676; 0067; MAP +1D677; 0068; MAP +1D678; 0069; MAP +1D679; 006A; MAP +1D67A; 006B; MAP +1D67B; 006C; MAP +1D67C; 006D; MAP +1D67D; 006E; MAP +1D67E; 006F; MAP +1D67F; 0070; MAP +1D680; 0071; MAP +1D681; 0072; MAP +1D682; 0073; MAP +1D683; 0074; MAP +1D684; 0075; MAP +1D685; 0076; MAP +1D686; 0077; MAP +1D687; 0078; MAP +1D688; 0079; MAP +1D689; 007A; MAP +1D6A8; 03B1; MAP +1D6A9; 03B2; MAP +1D6AA; 03B3; MAP +1D6AB; 03B4; MAP +1D6AC; 03B5; MAP +1D6AD; 03B6; MAP +1D6AE; 03B7; MAP +1D6AF; 03B8; MAP +1D6B0; 03B9; MAP +1D6B1; 03BA; MAP +1D6B2; 03BB; MAP +1D6B3; 03BC; MAP +1D6B4; 03BD; MAP +1D6B5; 03BE; MAP +1D6B6; 03BF; MAP +1D6B7; 03C0; MAP +1D6B8; 03C1; MAP +1D6B9; 03B8; MAP +1D6BA; 03C3; MAP +1D6BB; 03C4; MAP +1D6BC; 03C5; MAP +1D6BD; 03C6; MAP +1D6BE; 03C7; MAP +1D6BF; 03C8; MAP +1D6C0; 03C9; MAP +1D6D3; 03C3; MAP +1D6E2; 03B1; MAP +1D6E3; 03B2; MAP +1D6E4; 03B3; MAP +1D6E5; 03B4; MAP +1D6E6; 03B5; MAP +1D6E7; 03B6; MAP +1D6E8; 03B7; MAP +1D6E9; 03B8; MAP +1D6EA; 03B9; MAP +1D6EB; 03BA; MAP +1D6EC; 03BB; MAP +1D6ED; 03BC; MAP +1D6EE; 03BD; MAP +1D6EF; 03BE; MAP +1D6F0; 03BF; MAP +1D6F1; 03C0; MAP +1D6F2; 03C1; MAP +1D6F3; 03B8; MAP +1D6F4; 03C3; MAP +1D6F5; 03C4; MAP +1D6F6; 03C5; MAP +1D6F7; 03C6; MAP +1D6F8; 03C7; MAP +1D6F9; 03C8; MAP +1D6FA; 03C9; MAP +1D70D; 03C3; MAP +1D71C; 03B1; MAP +1D71D; 03B2; MAP +1D71E; 03B3; MAP +1D71F; 03B4; MAP +1D720; 03B5; MAP +1D721; 03B6; MAP +1D722; 03B7; MAP +1D723; 03B8; MAP +1D724; 03B9; MAP +1D725; 03BA; MAP +1D726; 03BB; MAP +1D727; 03BC; MAP +1D728; 03BD; MAP +1D729; 03BE; MAP +1D72A; 03BF; MAP +1D72B; 03C0; MAP +1D72C; 03C1; MAP +1D72D; 03B8; MAP +1D72E; 03C3; MAP +1D72F; 03C4; MAP +1D730; 03C5; MAP +1D731; 03C6; MAP +1D732; 03C7; MAP +1D733; 03C8; MAP +1D734; 03C9; MAP +1D747; 03C3; MAP +1D756; 03B1; MAP +1D757; 03B2; MAP +1D758; 03B3; MAP +1D759; 03B4; MAP +1D75A; 03B5; MAP +1D75B; 03B6; MAP +1D75C; 03B7; MAP +1D75D; 03B8; MAP +1D75E; 03B9; MAP +1D75F; 03BA; MAP +1D760; 03BB; MAP +1D761; 03BC; MAP +1D762; 03BD; MAP +1D763; 03BE; MAP +1D764; 03BF; MAP +1D765; 03C0; MAP +1D766; 03C1; MAP +1D767; 03B8; MAP +1D768; 03C3; MAP +1D769; 03C4; MAP +1D76A; 03C5; MAP +1D76B; 03C6; MAP +1D76C; 03C7; MAP +1D76D; 03C8; MAP +1D76E; 03C9; MAP +1D781; 03C3; MAP +1D790; 03B1; MAP +1D791; 03B2; MAP +1D792; 03B3; MAP +1D793; 03B4; MAP +1D794; 03B5; MAP +1D795; 03B6; MAP +1D796; 03B7; MAP +1D797; 03B8; MAP +1D798; 03B9; MAP +1D799; 03BA; MAP +1D79A; 03BB; MAP +1D79B; 03BC; MAP +1D79C; 03BD; MAP +1D79D; 03BE; MAP +1D79E; 03BF; MAP +1D79F; 03C0; MAP +1D7A0; 03C1; MAP +1D7A1; 03B8; MAP +1D7A2; 03C3; MAP +1D7A3; 03C4; MAP +1D7A4; 03C5; MAP +1D7A5; 03C6; MAP +1D7A6; 03C7; MAP +1D7A7; 03C8; MAP +1D7A8; 03C9; MAP +1D7BB; 03C3; MAP + +# Total code points 1371 + +# code points from Table C.1.2 + +00A0; ; PROHIBITED +1680; ; PROHIBITED +2000; ; PROHIBITED +2001; ; PROHIBITED +2002; ; PROHIBITED +2003; ; PROHIBITED +2004; ; PROHIBITED +2005; ; PROHIBITED +2006; ; PROHIBITED +2007; ; PROHIBITED +2008; ; PROHIBITED +2009; ; PROHIBITED +200A; ; PROHIBITED +200B; ; PROHIBITED +202F; ; PROHIBITED +205F; ; PROHIBITED +3000; ; PROHIBITED + +# Total code points 17 + +# code points from Table C.2.2 + +0080..009F; ; PROHIBITED +06DD; ; PROHIBITED +070F; ; PROHIBITED +180E; ; PROHIBITED +200C; ; PROHIBITED +200D; ; PROHIBITED +2028; ; PROHIBITED +2029; ; PROHIBITED +2060; ; PROHIBITED +2061; ; PROHIBITED +2062; ; PROHIBITED +2063; ; PROHIBITED +206A..206F; ; PROHIBITED +FEFF; ; PROHIBITED +FFF9..FFFC; ; PROHIBITED +1D173..1D17A; ; PROHIBITED + +# Total code points 30 + +# code points from Table C.3 + +E000..F8FF; ; PROHIBITED +F0000..FFFFD; ; PROHIBITED +100000..10FFFD; ; PROHIBITED + +# Total code points 2051 + +# code points from Table C.4 + +FDD0..FDEF; ; PROHIBITED +FFFE..FFFF; ; PROHIBITED +1FFFE..1FFFF; ; PROHIBITED +2FFFE..2FFFF; ; PROHIBITED +3FFFE..3FFFF; ; PROHIBITED +4FFFE..4FFFF; ; PROHIBITED +5FFFE..5FFFF; ; PROHIBITED +6FFFE..6FFFF; ; PROHIBITED +7FFFE..7FFFF; ; PROHIBITED +8FFFE..8FFFF; ; PROHIBITED +9FFFE..9FFFF; ; PROHIBITED +AFFFE..AFFFF; ; PROHIBITED +BFFFE..BFFFF; ; PROHIBITED +CFFFE..CFFFF; ; PROHIBITED +DFFFE..DFFFF; ; PROHIBITED +EFFFE..EFFFF; ; PROHIBITED +FFFFE..FFFFF; ; PROHIBITED +10FFFE..10FFFF; ; PROHIBITED + +# Total code points 18 + +# code points from Table C.5 + +D800..DFFF; ; PROHIBITED + +# Total code points 0 + +# code points from Table C.6 + +FFF9; ; PROHIBITED +FFFA; ; PROHIBITED +FFFB; ; PROHIBITED +FFFC; ; PROHIBITED +FFFD; ; PROHIBITED + +# Total code points 5 + +# code points from Table C.7 + +2FF0..2FFB; ; PROHIBITED + +# Total code points 1 + +# code points from Table C.8 + +0340; ; PROHIBITED +0341; ; PROHIBITED +200E; ; PROHIBITED +200F; ; PROHIBITED +202A; ; PROHIBITED +202B; ; PROHIBITED +202C; ; PROHIBITED +202D; ; PROHIBITED +202E; ; PROHIBITED +206A; ; PROHIBITED +206B; ; PROHIBITED +206C; ; PROHIBITED +206D; ; PROHIBITED +206E; ; PROHIBITED +206F; ; PROHIBITED + +# Total code points 15 + +# code points from Table C.9 + +E0001; ; PROHIBITED +E0020..E007F; ; PROHIBITED + +# Total code points 82 + diff --git a/icuSources/test/testdata/nfs4_cs_prep_ci.txt b/icuSources/test/testdata/nfs4_cs_prep_ci.txt new file mode 100644 index 00000000..a47b66eb --- /dev/null +++ b/icuSources/test/testdata/nfs4_cs_prep_ci.txt @@ -0,0 +1,1902 @@ +################### +# Copyright (C) 2003, International Business Machines +# Corporation and others. All Rights Reserved. +################### + +################### +# WARNING: This table is generated by filterRFC3454.pl tool. DO NOT EDIT +################### + +# This table contains code points from Table A.1 from RFC 3454 + +0221; ; UNASSIGNED +0234..024F; ; UNASSIGNED +02AE..02AF; ; UNASSIGNED +02EF..02FF; ; UNASSIGNED +0350..035F; ; UNASSIGNED +0370..0373; ; UNASSIGNED +0376..0379; ; UNASSIGNED +037B..037D; ; UNASSIGNED +037F..0383; ; UNASSIGNED +038B; ; UNASSIGNED +038D; ; UNASSIGNED +03A2; ; UNASSIGNED +03CF; ; UNASSIGNED +03F7..03FF; ; UNASSIGNED +0487; ; UNASSIGNED +04CF; ; UNASSIGNED +04F6..04F7; ; UNASSIGNED +04FA..04FF; ; UNASSIGNED +0510..0530; ; UNASSIGNED +0557..0558; ; UNASSIGNED +0560; ; UNASSIGNED +0588; ; UNASSIGNED +058B..0590; ; UNASSIGNED +05A2; ; UNASSIGNED +05BA; ; UNASSIGNED +05C5..05CF; ; UNASSIGNED +05EB..05EF; ; UNASSIGNED +05F5..060B; ; UNASSIGNED +060D..061A; ; UNASSIGNED +061C..061E; ; UNASSIGNED +0620; ; UNASSIGNED +063B..063F; ; UNASSIGNED +0656..065F; ; UNASSIGNED +06EE..06EF; ; UNASSIGNED +06FF; ; UNASSIGNED +070E; ; UNASSIGNED +072D..072F; ; UNASSIGNED +074B..077F; ; UNASSIGNED +07B2..0900; ; UNASSIGNED +0904; ; UNASSIGNED +093A..093B; ; UNASSIGNED +094E..094F; ; UNASSIGNED +0955..0957; ; UNASSIGNED +0971..0980; ; UNASSIGNED +0984; ; UNASSIGNED +098D..098E; ; UNASSIGNED +0991..0992; ; UNASSIGNED +09A9; ; UNASSIGNED +09B1; ; UNASSIGNED +09B3..09B5; ; UNASSIGNED +09BA..09BB; ; UNASSIGNED +09BD; ; UNASSIGNED +09C5..09C6; ; UNASSIGNED +09C9..09CA; ; UNASSIGNED +09CE..09D6; ; UNASSIGNED +09D8..09DB; ; UNASSIGNED +09DE; ; UNASSIGNED +09E4..09E5; ; UNASSIGNED +09FB..0A01; ; UNASSIGNED +0A03..0A04; ; UNASSIGNED +0A0B..0A0E; ; UNASSIGNED +0A11..0A12; ; UNASSIGNED +0A29; ; UNASSIGNED +0A31; ; UNASSIGNED +0A34; ; UNASSIGNED +0A37; ; UNASSIGNED +0A3A..0A3B; ; UNASSIGNED +0A3D; ; UNASSIGNED +0A43..0A46; ; UNASSIGNED +0A49..0A4A; ; UNASSIGNED +0A4E..0A58; ; UNASSIGNED +0A5D; ; UNASSIGNED +0A5F..0A65; ; UNASSIGNED +0A75..0A80; ; UNASSIGNED +0A84; ; UNASSIGNED +0A8C; ; UNASSIGNED +0A8E; ; UNASSIGNED +0A92; ; UNASSIGNED +0AA9; ; UNASSIGNED +0AB1; ; UNASSIGNED +0AB4; ; UNASSIGNED +0ABA..0ABB; ; UNASSIGNED +0AC6; ; UNASSIGNED +0ACA; ; UNASSIGNED +0ACE..0ACF; ; UNASSIGNED +0AD1..0ADF; ; UNASSIGNED +0AE1..0AE5; ; UNASSIGNED +0AF0..0B00; ; UNASSIGNED +0B04; ; UNASSIGNED +0B0D..0B0E; ; UNASSIGNED +0B11..0B12; ; UNASSIGNED +0B29; ; UNASSIGNED +0B31; ; UNASSIGNED +0B34..0B35; ; UNASSIGNED +0B3A..0B3B; ; UNASSIGNED +0B44..0B46; ; UNASSIGNED +0B49..0B4A; ; UNASSIGNED +0B4E..0B55; ; UNASSIGNED +0B58..0B5B; ; UNASSIGNED +0B5E; ; UNASSIGNED +0B62..0B65; ; UNASSIGNED +0B71..0B81; ; UNASSIGNED +0B84; ; UNASSIGNED +0B8B..0B8D; ; UNASSIGNED +0B91; ; UNASSIGNED +0B96..0B98; ; UNASSIGNED +0B9B; ; UNASSIGNED +0B9D; ; UNASSIGNED +0BA0..0BA2; ; UNASSIGNED +0BA5..0BA7; ; UNASSIGNED +0BAB..0BAD; ; UNASSIGNED +0BB6; ; UNASSIGNED +0BBA..0BBD; ; UNASSIGNED +0BC3..0BC5; ; UNASSIGNED +0BC9; ; UNASSIGNED +0BCE..0BD6; ; UNASSIGNED +0BD8..0BE6; ; UNASSIGNED +0BF3..0C00; ; UNASSIGNED +0C04; ; UNASSIGNED +0C0D; ; UNASSIGNED +0C11; ; UNASSIGNED +0C29; ; UNASSIGNED +0C34; ; UNASSIGNED +0C3A..0C3D; ; UNASSIGNED +0C45; ; UNASSIGNED +0C49; ; UNASSIGNED +0C4E..0C54; ; UNASSIGNED +0C57..0C5F; ; UNASSIGNED +0C62..0C65; ; UNASSIGNED +0C70..0C81; ; UNASSIGNED +0C84; ; UNASSIGNED +0C8D; ; UNASSIGNED +0C91; ; UNASSIGNED +0CA9; ; UNASSIGNED +0CB4; ; UNASSIGNED +0CBA..0CBD; ; UNASSIGNED +0CC5; ; UNASSIGNED +0CC9; ; UNASSIGNED +0CCE..0CD4; ; UNASSIGNED +0CD7..0CDD; ; UNASSIGNED +0CDF; ; UNASSIGNED +0CE2..0CE5; ; UNASSIGNED +0CF0..0D01; ; UNASSIGNED +0D04; ; UNASSIGNED +0D0D; ; UNASSIGNED +0D11; ; UNASSIGNED +0D29; ; UNASSIGNED +0D3A..0D3D; ; UNASSIGNED +0D44..0D45; ; UNASSIGNED +0D49; ; UNASSIGNED +0D4E..0D56; ; UNASSIGNED +0D58..0D5F; ; UNASSIGNED +0D62..0D65; ; UNASSIGNED +0D70..0D81; ; UNASSIGNED +0D84; ; UNASSIGNED +0D97..0D99; ; UNASSIGNED +0DB2; ; UNASSIGNED +0DBC; ; UNASSIGNED +0DBE..0DBF; ; UNASSIGNED +0DC7..0DC9; ; UNASSIGNED +0DCB..0DCE; ; UNASSIGNED +0DD5; ; UNASSIGNED +0DD7; ; UNASSIGNED +0DE0..0DF1; ; UNASSIGNED +0DF5..0E00; ; UNASSIGNED +0E3B..0E3E; ; UNASSIGNED +0E5C..0E80; ; UNASSIGNED +0E83; ; UNASSIGNED +0E85..0E86; ; UNASSIGNED +0E89; ; UNASSIGNED +0E8B..0E8C; ; UNASSIGNED +0E8E..0E93; ; UNASSIGNED +0E98; ; UNASSIGNED +0EA0; ; UNASSIGNED +0EA4; ; UNASSIGNED +0EA6; ; UNASSIGNED +0EA8..0EA9; ; UNASSIGNED +0EAC; ; UNASSIGNED +0EBA; ; UNASSIGNED +0EBE..0EBF; ; UNASSIGNED +0EC5; ; UNASSIGNED +0EC7; ; UNASSIGNED +0ECE..0ECF; ; UNASSIGNED +0EDA..0EDB; ; UNASSIGNED +0EDE..0EFF; ; UNASSIGNED +0F48; ; UNASSIGNED +0F6B..0F70; ; UNASSIGNED +0F8C..0F8F; ; UNASSIGNED +0F98; ; UNASSIGNED +0FBD; ; UNASSIGNED +0FCD..0FCE; ; UNASSIGNED +0FD0..0FFF; ; UNASSIGNED +1022; ; UNASSIGNED +1028; ; UNASSIGNED +102B; ; UNASSIGNED +1033..1035; ; UNASSIGNED +103A..103F; ; UNASSIGNED +105A..109F; ; UNASSIGNED +10C6..10CF; ; UNASSIGNED +10F9..10FA; ; UNASSIGNED +10FC..10FF; ; UNASSIGNED +115A..115E; ; UNASSIGNED +11A3..11A7; ; UNASSIGNED +11FA..11FF; ; UNASSIGNED +1207; ; UNASSIGNED +1247; ; UNASSIGNED +1249; ; UNASSIGNED +124E..124F; ; UNASSIGNED +1257; ; UNASSIGNED +1259; ; UNASSIGNED +125E..125F; ; UNASSIGNED +1287; ; UNASSIGNED +1289; ; UNASSIGNED +128E..128F; ; UNASSIGNED +12AF; ; UNASSIGNED +12B1; ; UNASSIGNED +12B6..12B7; ; UNASSIGNED +12BF; ; UNASSIGNED +12C1; ; UNASSIGNED +12C6..12C7; ; UNASSIGNED +12CF; ; UNASSIGNED +12D7; ; UNASSIGNED +12EF; ; UNASSIGNED +130F; ; UNASSIGNED +1311; ; UNASSIGNED +1316..1317; ; UNASSIGNED +131F; ; UNASSIGNED +1347; ; UNASSIGNED +135B..1360; ; UNASSIGNED +137D..139F; ; UNASSIGNED +13F5..1400; ; UNASSIGNED +1677..167F; ; UNASSIGNED +169D..169F; ; UNASSIGNED +16F1..16FF; ; UNASSIGNED +170D; ; UNASSIGNED +1715..171F; ; UNASSIGNED +1737..173F; ; UNASSIGNED +1754..175F; ; UNASSIGNED +176D; ; UNASSIGNED +1771; ; UNASSIGNED +1774..177F; ; UNASSIGNED +17DD..17DF; ; UNASSIGNED +17EA..17FF; ; UNASSIGNED +180F; ; UNASSIGNED +181A..181F; ; UNASSIGNED +1878..187F; ; UNASSIGNED +18AA..1DFF; ; UNASSIGNED +1E9C..1E9F; ; UNASSIGNED +1EFA..1EFF; ; UNASSIGNED +1F16..1F17; ; UNASSIGNED +1F1E..1F1F; ; UNASSIGNED +1F46..1F47; ; UNASSIGNED +1F4E..1F4F; ; UNASSIGNED +1F58; ; UNASSIGNED +1F5A; ; UNASSIGNED +1F5C; ; UNASSIGNED +1F5E; ; UNASSIGNED +1F7E..1F7F; ; UNASSIGNED +1FB5; ; UNASSIGNED +1FC5; ; UNASSIGNED +1FD4..1FD5; ; UNASSIGNED +1FDC; ; UNASSIGNED +1FF0..1FF1; ; UNASSIGNED +1FF5; ; UNASSIGNED +1FFF; ; UNASSIGNED +2053..2056; ; UNASSIGNED +2058..205E; ; UNASSIGNED +2064..2069; ; UNASSIGNED +2072..2073; ; UNASSIGNED +208F..209F; ; UNASSIGNED +20B2..20CF; ; UNASSIGNED +20EB..20FF; ; UNASSIGNED +213B..213C; ; UNASSIGNED +214C..2152; ; UNASSIGNED +2184..218F; ; UNASSIGNED +23CF..23FF; ; UNASSIGNED +2427..243F; ; UNASSIGNED +244B..245F; ; UNASSIGNED +24FF; ; UNASSIGNED +2614..2615; ; UNASSIGNED +2618; ; UNASSIGNED +267E..267F; ; UNASSIGNED +268A..2700; ; UNASSIGNED +2705; ; UNASSIGNED +270A..270B; ; UNASSIGNED +2728; ; UNASSIGNED +274C; ; UNASSIGNED +274E; ; UNASSIGNED +2753..2755; ; UNASSIGNED +2757; ; UNASSIGNED +275F..2760; ; UNASSIGNED +2795..2797; ; UNASSIGNED +27B0; ; UNASSIGNED +27BF..27CF; ; UNASSIGNED +27EC..27EF; ; UNASSIGNED +2B00..2E7F; ; UNASSIGNED +2E9A; ; UNASSIGNED +2EF4..2EFF; ; UNASSIGNED +2FD6..2FEF; ; UNASSIGNED +2FFC..2FFF; ; UNASSIGNED +3040; ; UNASSIGNED +3097..3098; ; UNASSIGNED +3100..3104; ; UNASSIGNED +312D..3130; ; UNASSIGNED +318F; ; UNASSIGNED +31B8..31EF; ; UNASSIGNED +321D..321F; ; UNASSIGNED +3244..3250; ; UNASSIGNED +327C..327E; ; UNASSIGNED +32CC..32CF; ; UNASSIGNED +32FF; ; UNASSIGNED +3377..337A; ; UNASSIGNED +33DE..33DF; ; UNASSIGNED +33FF; ; UNASSIGNED +4DB6..4DFF; ; UNASSIGNED +9FA6..9FFF; ; UNASSIGNED +A48D..A48F; ; UNASSIGNED +A4C7..ABFF; ; UNASSIGNED +D7A4..D7FF; ; UNASSIGNED +FA2E..FA2F; ; UNASSIGNED +FA6B..FAFF; ; UNASSIGNED +FB07..FB12; ; UNASSIGNED +FB18..FB1C; ; UNASSIGNED +FB37; ; UNASSIGNED +FB3D; ; UNASSIGNED +FB3F; ; UNASSIGNED +FB42; ; UNASSIGNED +FB45; ; UNASSIGNED +FBB2..FBD2; ; UNASSIGNED +FD40..FD4F; ; UNASSIGNED +FD90..FD91; ; UNASSIGNED +FDC8..FDCF; ; UNASSIGNED +FDFD..FDFF; ; UNASSIGNED +FE10..FE1F; ; UNASSIGNED +FE24..FE2F; ; UNASSIGNED +FE47..FE48; ; UNASSIGNED +FE53; ; UNASSIGNED +FE67; ; UNASSIGNED +FE6C..FE6F; ; UNASSIGNED +FE75; ; UNASSIGNED +FEFD..FEFE; ; UNASSIGNED +FF00; ; UNASSIGNED +FFBF..FFC1; ; UNASSIGNED +FFC8..FFC9; ; UNASSIGNED +FFD0..FFD1; ; UNASSIGNED +FFD8..FFD9; ; UNASSIGNED +FFDD..FFDF; ; UNASSIGNED +FFE7; ; UNASSIGNED +FFEF..FFF8; ; UNASSIGNED +10000..102FF; ; UNASSIGNED +1031F; ; UNASSIGNED +10324..1032F; ; UNASSIGNED +1034B..103FF; ; UNASSIGNED +10426..10427; ; UNASSIGNED +1044E..1CFFF; ; UNASSIGNED +1D0F6..1D0FF; ; UNASSIGNED +1D127..1D129; ; UNASSIGNED +1D1DE..1D3FF; ; UNASSIGNED +1D455; ; UNASSIGNED +1D49D; ; UNASSIGNED +1D4A0..1D4A1; ; UNASSIGNED +1D4A3..1D4A4; ; UNASSIGNED +1D4A7..1D4A8; ; UNASSIGNED +1D4AD; ; UNASSIGNED +1D4BA; ; UNASSIGNED +1D4BC; ; UNASSIGNED +1D4C1; ; UNASSIGNED +1D4C4; ; UNASSIGNED +1D506; ; UNASSIGNED +1D50B..1D50C; ; UNASSIGNED +1D515; ; UNASSIGNED +1D51D; ; UNASSIGNED +1D53A; ; UNASSIGNED +1D53F; ; UNASSIGNED +1D545; ; UNASSIGNED +1D547..1D549; ; UNASSIGNED +1D551; ; UNASSIGNED +1D6A4..1D6A7; ; UNASSIGNED +1D7CA..1D7CD; ; UNASSIGNED +1D800..1FFFD; ; UNASSIGNED +2A6D7..2F7FF; ; UNASSIGNED +2FA1E..2FFFD; ; UNASSIGNED +30000..3FFFD; ; UNASSIGNED +40000..4FFFD; ; UNASSIGNED +50000..5FFFD; ; UNASSIGNED +60000..6FFFD; ; UNASSIGNED +70000..7FFFD; ; UNASSIGNED +80000..8FFFD; ; UNASSIGNED +90000..9FFFD; ; UNASSIGNED +A0000..AFFFD; ; UNASSIGNED +B0000..BFFFD; ; UNASSIGNED +C0000..CFFFD; ; UNASSIGNED +D0000..DFFFD; ; UNASSIGNED +E0000; ; UNASSIGNED +E0002..E001F; ; UNASSIGNED +E0080..EFFFD; ; UNASSIGNED + +# Total code points 3653 + +# This table contains code points from Table B.1 from RFC 3454 + +00AD; ; MAP +034F; ; MAP +1806; ; MAP +180B; ; MAP +180C; ; MAP +180D; ; MAP +200B; ; MAP +200C; ; MAP +200D; ; MAP +2060; ; MAP +FE00; ; MAP +FE01; ; MAP +FE02; ; MAP +FE03; ; MAP +FE04; ; MAP +FE05; ; MAP +FE06; ; MAP +FE07; ; MAP +FE08; ; MAP +FE09; ; MAP +FE0A; ; MAP +FE0B; ; MAP +FE0C; ; MAP +FE0D; ; MAP +FE0E; ; MAP +FE0F; ; MAP +FEFF; ; MAP + +# Total code points 27 + +################### +# WARNING: This table is generated by filterRFC3454.pl tool. DO NOT EDIT +################### + +# This table contains code points from Table B.2 from RFC 3454 + +0041; 0061; MAP +0042; 0062; MAP +0043; 0063; MAP +0044; 0064; MAP +0045; 0065; MAP +0046; 0066; MAP +0047; 0067; MAP +0048; 0068; MAP +0049; 0069; MAP +004A; 006A; MAP +004B; 006B; MAP +004C; 006C; MAP +004D; 006D; MAP +004E; 006E; MAP +004F; 006F; MAP +0050; 0070; MAP +0051; 0071; MAP +0052; 0072; MAP +0053; 0073; MAP +0054; 0074; MAP +0055; 0075; MAP +0056; 0076; MAP +0057; 0077; MAP +0058; 0078; MAP +0059; 0079; MAP +005A; 007A; MAP +00B5; 03BC; MAP +00C0; 00E0; MAP +00C1; 00E1; MAP +00C2; 00E2; MAP +00C3; 00E3; MAP +00C4; 00E4; MAP +00C5; 00E5; MAP +00C6; 00E6; MAP +00C7; 00E7; MAP +00C8; 00E8; MAP +00C9; 00E9; MAP +00CA; 00EA; MAP +00CB; 00EB; MAP +00CC; 00EC; MAP +00CD; 00ED; MAP +00CE; 00EE; MAP +00CF; 00EF; MAP +00D0; 00F0; MAP +00D1; 00F1; MAP +00D2; 00F2; MAP +00D3; 00F3; MAP +00D4; 00F4; MAP +00D5; 00F5; MAP +00D6; 00F6; MAP +00D8; 00F8; MAP +00D9; 00F9; MAP +00DA; 00FA; MAP +00DB; 00FB; MAP +00DC; 00FC; MAP +00DD; 00FD; MAP +00DE; 00FE; MAP +00DF; 0073 0073; MAP +0100; 0101; MAP +0102; 0103; MAP +0104; 0105; MAP +0106; 0107; MAP +0108; 0109; MAP +010A; 010B; MAP +010C; 010D; MAP +010E; 010F; MAP +0110; 0111; MAP +0112; 0113; MAP +0114; 0115; MAP +0116; 0117; MAP +0118; 0119; MAP +011A; 011B; MAP +011C; 011D; MAP +011E; 011F; MAP +0120; 0121; MAP +0122; 0123; MAP +0124; 0125; MAP +0126; 0127; MAP +0128; 0129; MAP +012A; 012B; MAP +012C; 012D; MAP +012E; 012F; MAP +0130; 0069 0307; MAP +0132; 0133; MAP +0134; 0135; MAP +0136; 0137; MAP +0139; 013A; MAP +013B; 013C; MAP +013D; 013E; MAP +013F; 0140; MAP +0141; 0142; MAP +0143; 0144; MAP +0145; 0146; MAP +0147; 0148; MAP +0149; 02BC 006E; MAP +014A; 014B; MAP +014C; 014D; MAP +014E; 014F; MAP +0150; 0151; MAP +0152; 0153; MAP +0154; 0155; MAP +0156; 0157; MAP +0158; 0159; MAP +015A; 015B; MAP +015C; 015D; MAP +015E; 015F; MAP +0160; 0161; MAP +0162; 0163; MAP +0164; 0165; MAP +0166; 0167; MAP +0168; 0169; MAP +016A; 016B; MAP +016C; 016D; MAP +016E; 016F; MAP +0170; 0171; MAP +0172; 0173; MAP +0174; 0175; MAP +0176; 0177; MAP +0178; 00FF; MAP +0179; 017A; MAP +017B; 017C; MAP +017D; 017E; MAP +017F; 0073; MAP +0181; 0253; MAP +0182; 0183; MAP +0184; 0185; MAP +0186; 0254; MAP +0187; 0188; MAP +0189; 0256; MAP +018A; 0257; MAP +018B; 018C; MAP +018E; 01DD; MAP +018F; 0259; MAP +0190; 025B; MAP +0191; 0192; MAP +0193; 0260; MAP +0194; 0263; MAP +0196; 0269; MAP +0197; 0268; MAP +0198; 0199; MAP +019C; 026F; MAP +019D; 0272; MAP +019F; 0275; MAP +01A0; 01A1; MAP +01A2; 01A3; MAP +01A4; 01A5; MAP +01A6; 0280; MAP +01A7; 01A8; MAP +01A9; 0283; MAP +01AC; 01AD; MAP +01AE; 0288; MAP +01AF; 01B0; MAP +01B1; 028A; MAP +01B2; 028B; MAP +01B3; 01B4; MAP +01B5; 01B6; MAP +01B7; 0292; MAP +01B8; 01B9; MAP +01BC; 01BD; MAP +01C4; 01C6; MAP +01C5; 01C6; MAP +01C7; 01C9; MAP +01C8; 01C9; MAP +01CA; 01CC; MAP +01CB; 01CC; MAP +01CD; 01CE; MAP +01CF; 01D0; MAP +01D1; 01D2; MAP +01D3; 01D4; MAP +01D5; 01D6; MAP +01D7; 01D8; MAP +01D9; 01DA; MAP +01DB; 01DC; MAP +01DE; 01DF; MAP +01E0; 01E1; MAP +01E2; 01E3; MAP +01E4; 01E5; MAP +01E6; 01E7; MAP +01E8; 01E9; MAP +01EA; 01EB; MAP +01EC; 01ED; MAP +01EE; 01EF; MAP +01F0; 006A 030C; MAP +01F1; 01F3; MAP +01F2; 01F3; MAP +01F4; 01F5; MAP +01F6; 0195; MAP +01F7; 01BF; MAP +01F8; 01F9; MAP +01FA; 01FB; MAP +01FC; 01FD; MAP +01FE; 01FF; MAP +0200; 0201; MAP +0202; 0203; MAP +0204; 0205; MAP +0206; 0207; MAP +0208; 0209; MAP +020A; 020B; MAP +020C; 020D; MAP +020E; 020F; MAP +0210; 0211; MAP +0212; 0213; MAP +0214; 0215; MAP +0216; 0217; MAP +0218; 0219; MAP +021A; 021B; MAP +021C; 021D; MAP +021E; 021F; MAP +0220; 019E; MAP +0222; 0223; MAP +0224; 0225; MAP +0226; 0227; MAP +0228; 0229; MAP +022A; 022B; MAP +022C; 022D; MAP +022E; 022F; MAP +0230; 0231; MAP +0232; 0233; MAP +0345; 03B9; MAP +037A; 0020 03B9; MAP +0386; 03AC; MAP +0388; 03AD; MAP +0389; 03AE; MAP +038A; 03AF; MAP +038C; 03CC; MAP +038E; 03CD; MAP +038F; 03CE; MAP +0390; 03B9 0308 0301; MAP +0391; 03B1; MAP +0392; 03B2; MAP +0393; 03B3; MAP +0394; 03B4; MAP +0395; 03B5; MAP +0396; 03B6; MAP +0397; 03B7; MAP +0398; 03B8; MAP +0399; 03B9; MAP +039A; 03BA; MAP +039B; 03BB; MAP +039C; 03BC; MAP +039D; 03BD; MAP +039E; 03BE; MAP +039F; 03BF; MAP +03A0; 03C0; MAP +03A1; 03C1; MAP +03A3; 03C3; MAP +03A4; 03C4; MAP +03A5; 03C5; MAP +03A6; 03C6; MAP +03A7; 03C7; MAP +03A8; 03C8; MAP +03A9; 03C9; MAP +03AA; 03CA; MAP +03AB; 03CB; MAP +03B0; 03C5 0308 0301; MAP +03C2; 03C3; MAP +03D0; 03B2; MAP +03D1; 03B8; MAP +03D2; 03C5; MAP +03D3; 03CD; MAP +03D4; 03CB; MAP +03D5; 03C6; MAP +03D6; 03C0; MAP +03D8; 03D9; MAP +03DA; 03DB; MAP +03DC; 03DD; MAP +03DE; 03DF; MAP +03E0; 03E1; MAP +03E2; 03E3; MAP +03E4; 03E5; MAP +03E6; 03E7; MAP +03E8; 03E9; MAP +03EA; 03EB; MAP +03EC; 03ED; MAP +03EE; 03EF; MAP +03F0; 03BA; MAP +03F1; 03C1; MAP +03F2; 03C3; MAP +03F4; 03B8; MAP +03F5; 03B5; MAP +0400; 0450; MAP +0401; 0451; MAP +0402; 0452; MAP +0403; 0453; MAP +0404; 0454; MAP +0405; 0455; MAP +0406; 0456; MAP +0407; 0457; MAP +0408; 0458; MAP +0409; 0459; MAP +040A; 045A; MAP +040B; 045B; MAP +040C; 045C; MAP +040D; 045D; MAP +040E; 045E; MAP +040F; 045F; MAP +0410; 0430; MAP +0411; 0431; MAP +0412; 0432; MAP +0413; 0433; MAP +0414; 0434; MAP +0415; 0435; MAP +0416; 0436; MAP +0417; 0437; MAP +0418; 0438; MAP +0419; 0439; MAP +041A; 043A; MAP +041B; 043B; MAP +041C; 043C; MAP +041D; 043D; MAP +041E; 043E; MAP +041F; 043F; MAP +0420; 0440; MAP +0421; 0441; MAP +0422; 0442; MAP +0423; 0443; MAP +0424; 0444; MAP +0425; 0445; MAP +0426; 0446; MAP +0427; 0447; MAP +0428; 0448; MAP +0429; 0449; MAP +042A; 044A; MAP +042B; 044B; MAP +042C; 044C; MAP +042D; 044D; MAP +042E; 044E; MAP +042F; 044F; MAP +0460; 0461; MAP +0462; 0463; MAP +0464; 0465; MAP +0466; 0467; MAP +0468; 0469; MAP +046A; 046B; MAP +046C; 046D; MAP +046E; 046F; MAP +0470; 0471; MAP +0472; 0473; MAP +0474; 0475; MAP +0476; 0477; MAP +0478; 0479; MAP +047A; 047B; MAP +047C; 047D; MAP +047E; 047F; MAP +0480; 0481; MAP +048A; 048B; MAP +048C; 048D; MAP +048E; 048F; MAP +0490; 0491; MAP +0492; 0493; MAP +0494; 0495; MAP +0496; 0497; MAP +0498; 0499; MAP +049A; 049B; MAP +049C; 049D; MAP +049E; 049F; MAP +04A0; 04A1; MAP +04A2; 04A3; MAP +04A4; 04A5; MAP +04A6; 04A7; MAP +04A8; 04A9; MAP +04AA; 04AB; MAP +04AC; 04AD; MAP +04AE; 04AF; MAP +04B0; 04B1; MAP +04B2; 04B3; MAP +04B4; 04B5; MAP +04B6; 04B7; MAP +04B8; 04B9; MAP +04BA; 04BB; MAP +04BC; 04BD; MAP +04BE; 04BF; MAP +04C1; 04C2; MAP +04C3; 04C4; MAP +04C5; 04C6; MAP +04C7; 04C8; MAP +04C9; 04CA; MAP +04CB; 04CC; MAP +04CD; 04CE; MAP +04D0; 04D1; MAP +04D2; 04D3; MAP +04D4; 04D5; MAP +04D6; 04D7; MAP +04D8; 04D9; MAP +04DA; 04DB; MAP +04DC; 04DD; MAP +04DE; 04DF; MAP +04E0; 04E1; MAP +04E2; 04E3; MAP +04E4; 04E5; MAP +04E6; 04E7; MAP +04E8; 04E9; MAP +04EA; 04EB; MAP +04EC; 04ED; MAP +04EE; 04EF; MAP +04F0; 04F1; MAP +04F2; 04F3; MAP +04F4; 04F5; MAP +04F8; 04F9; MAP +0500; 0501; MAP +0502; 0503; MAP +0504; 0505; MAP +0506; 0507; MAP +0508; 0509; MAP +050A; 050B; MAP +050C; 050D; MAP +050E; 050F; MAP +0531; 0561; MAP +0532; 0562; MAP +0533; 0563; MAP +0534; 0564; MAP +0535; 0565; MAP +0536; 0566; MAP +0537; 0567; MAP +0538; 0568; MAP +0539; 0569; MAP +053A; 056A; MAP +053B; 056B; MAP +053C; 056C; MAP +053D; 056D; MAP +053E; 056E; MAP +053F; 056F; MAP +0540; 0570; MAP +0541; 0571; MAP +0542; 0572; MAP +0543; 0573; MAP +0544; 0574; MAP +0545; 0575; MAP +0546; 0576; MAP +0547; 0577; MAP +0548; 0578; MAP +0549; 0579; MAP +054A; 057A; MAP +054B; 057B; MAP +054C; 057C; MAP +054D; 057D; MAP +054E; 057E; MAP +054F; 057F; MAP +0550; 0580; MAP +0551; 0581; MAP +0552; 0582; MAP +0553; 0583; MAP +0554; 0584; MAP +0555; 0585; MAP +0556; 0586; MAP +0587; 0565 0582; MAP +1E00; 1E01; MAP +1E02; 1E03; MAP +1E04; 1E05; MAP +1E06; 1E07; MAP +1E08; 1E09; MAP +1E0A; 1E0B; MAP +1E0C; 1E0D; MAP +1E0E; 1E0F; MAP +1E10; 1E11; MAP +1E12; 1E13; MAP +1E14; 1E15; MAP +1E16; 1E17; MAP +1E18; 1E19; MAP +1E1A; 1E1B; MAP +1E1C; 1E1D; MAP +1E1E; 1E1F; MAP +1E20; 1E21; MAP +1E22; 1E23; MAP +1E24; 1E25; MAP +1E26; 1E27; MAP +1E28; 1E29; MAP +1E2A; 1E2B; MAP +1E2C; 1E2D; MAP +1E2E; 1E2F; MAP +1E30; 1E31; MAP +1E32; 1E33; MAP +1E34; 1E35; MAP +1E36; 1E37; MAP +1E38; 1E39; MAP +1E3A; 1E3B; MAP +1E3C; 1E3D; MAP +1E3E; 1E3F; MAP +1E40; 1E41; MAP +1E42; 1E43; MAP +1E44; 1E45; MAP +1E46; 1E47; MAP +1E48; 1E49; MAP +1E4A; 1E4B; MAP +1E4C; 1E4D; MAP +1E4E; 1E4F; MAP +1E50; 1E51; MAP +1E52; 1E53; MAP +1E54; 1E55; MAP +1E56; 1E57; MAP +1E58; 1E59; MAP +1E5A; 1E5B; MAP +1E5C; 1E5D; MAP +1E5E; 1E5F; MAP +1E60; 1E61; MAP +1E62; 1E63; MAP +1E64; 1E65; MAP +1E66; 1E67; MAP +1E68; 1E69; MAP +1E6A; 1E6B; MAP +1E6C; 1E6D; MAP +1E6E; 1E6F; MAP +1E70; 1E71; MAP +1E72; 1E73; MAP +1E74; 1E75; MAP +1E76; 1E77; MAP +1E78; 1E79; MAP +1E7A; 1E7B; MAP +1E7C; 1E7D; MAP +1E7E; 1E7F; MAP +1E80; 1E81; MAP +1E82; 1E83; MAP +1E84; 1E85; MAP +1E86; 1E87; MAP +1E88; 1E89; MAP +1E8A; 1E8B; MAP +1E8C; 1E8D; MAP +1E8E; 1E8F; MAP +1E90; 1E91; MAP +1E92; 1E93; MAP +1E94; 1E95; MAP +1E96; 0068 0331; MAP +1E97; 0074 0308; MAP +1E98; 0077 030A; MAP +1E99; 0079 030A; MAP +1E9A; 0061 02BE; MAP +1E9B; 1E61; MAP +1EA0; 1EA1; MAP +1EA2; 1EA3; MAP +1EA4; 1EA5; MAP +1EA6; 1EA7; MAP +1EA8; 1EA9; MAP +1EAA; 1EAB; MAP +1EAC; 1EAD; MAP +1EAE; 1EAF; MAP +1EB0; 1EB1; MAP +1EB2; 1EB3; MAP +1EB4; 1EB5; MAP +1EB6; 1EB7; MAP +1EB8; 1EB9; MAP +1EBA; 1EBB; MAP +1EBC; 1EBD; MAP +1EBE; 1EBF; MAP +1EC0; 1EC1; MAP +1EC2; 1EC3; MAP +1EC4; 1EC5; MAP +1EC6; 1EC7; MAP +1EC8; 1EC9; MAP +1ECA; 1ECB; MAP +1ECC; 1ECD; MAP +1ECE; 1ECF; MAP +1ED0; 1ED1; MAP +1ED2; 1ED3; MAP +1ED4; 1ED5; MAP +1ED6; 1ED7; MAP +1ED8; 1ED9; MAP +1EDA; 1EDB; MAP +1EDC; 1EDD; MAP +1EDE; 1EDF; MAP +1EE0; 1EE1; MAP +1EE2; 1EE3; MAP +1EE4; 1EE5; MAP +1EE6; 1EE7; MAP +1EE8; 1EE9; MAP +1EEA; 1EEB; MAP +1EEC; 1EED; MAP +1EEE; 1EEF; MAP +1EF0; 1EF1; MAP +1EF2; 1EF3; MAP +1EF4; 1EF5; MAP +1EF6; 1EF7; MAP +1EF8; 1EF9; MAP +1F08; 1F00; MAP +1F09; 1F01; MAP +1F0A; 1F02; MAP +1F0B; 1F03; MAP +1F0C; 1F04; MAP +1F0D; 1F05; MAP +1F0E; 1F06; MAP +1F0F; 1F07; MAP +1F18; 1F10; MAP +1F19; 1F11; MAP +1F1A; 1F12; MAP +1F1B; 1F13; MAP +1F1C; 1F14; MAP +1F1D; 1F15; MAP +1F28; 1F20; MAP +1F29; 1F21; MAP +1F2A; 1F22; MAP +1F2B; 1F23; MAP +1F2C; 1F24; MAP +1F2D; 1F25; MAP +1F2E; 1F26; MAP +1F2F; 1F27; MAP +1F38; 1F30; MAP +1F39; 1F31; MAP +1F3A; 1F32; MAP +1F3B; 1F33; MAP +1F3C; 1F34; MAP +1F3D; 1F35; MAP +1F3E; 1F36; MAP +1F3F; 1F37; MAP +1F48; 1F40; MAP +1F49; 1F41; MAP +1F4A; 1F42; MAP +1F4B; 1F43; MAP +1F4C; 1F44; MAP +1F4D; 1F45; MAP +1F50; 03C5 0313; MAP +1F52; 03C5 0313 0300; MAP +1F54; 03C5 0313 0301; MAP +1F56; 03C5 0313 0342; MAP +1F59; 1F51; MAP +1F5B; 1F53; MAP +1F5D; 1F55; MAP +1F5F; 1F57; MAP +1F68; 1F60; MAP +1F69; 1F61; MAP +1F6A; 1F62; MAP +1F6B; 1F63; MAP +1F6C; 1F64; MAP +1F6D; 1F65; MAP +1F6E; 1F66; MAP +1F6F; 1F67; MAP +1F80; 1F00 03B9; MAP +1F81; 1F01 03B9; MAP +1F82; 1F02 03B9; MAP +1F83; 1F03 03B9; MAP +1F84; 1F04 03B9; MAP +1F85; 1F05 03B9; MAP +1F86; 1F06 03B9; MAP +1F87; 1F07 03B9; MAP +1F88; 1F00 03B9; MAP +1F89; 1F01 03B9; MAP +1F8A; 1F02 03B9; MAP +1F8B; 1F03 03B9; MAP +1F8C; 1F04 03B9; MAP +1F8D; 1F05 03B9; MAP +1F8E; 1F06 03B9; MAP +1F8F; 1F07 03B9; MAP +1F90; 1F20 03B9; MAP +1F91; 1F21 03B9; MAP +1F92; 1F22 03B9; MAP +1F93; 1F23 03B9; MAP +1F94; 1F24 03B9; MAP +1F95; 1F25 03B9; MAP +1F96; 1F26 03B9; MAP +1F97; 1F27 03B9; MAP +1F98; 1F20 03B9; MAP +1F99; 1F21 03B9; MAP +1F9A; 1F22 03B9; MAP +1F9B; 1F23 03B9; MAP +1F9C; 1F24 03B9; MAP +1F9D; 1F25 03B9; MAP +1F9E; 1F26 03B9; MAP +1F9F; 1F27 03B9; MAP +1FA0; 1F60 03B9; MAP +1FA1; 1F61 03B9; MAP +1FA2; 1F62 03B9; MAP +1FA3; 1F63 03B9; MAP +1FA4; 1F64 03B9; MAP +1FA5; 1F65 03B9; MAP +1FA6; 1F66 03B9; MAP +1FA7; 1F67 03B9; MAP +1FA8; 1F60 03B9; MAP +1FA9; 1F61 03B9; MAP +1FAA; 1F62 03B9; MAP +1FAB; 1F63 03B9; MAP +1FAC; 1F64 03B9; MAP +1FAD; 1F65 03B9; MAP +1FAE; 1F66 03B9; MAP +1FAF; 1F67 03B9; MAP +1FB2; 1F70 03B9; MAP +1FB3; 03B1 03B9; MAP +1FB4; 03AC 03B9; MAP +1FB6; 03B1 0342; MAP +1FB7; 03B1 0342 03B9; MAP +1FB8; 1FB0; MAP +1FB9; 1FB1; MAP +1FBA; 1F70; MAP +1FBB; 1F71; MAP +1FBC; 03B1 03B9; MAP +1FBE; 03B9; MAP +1FC2; 1F74 03B9; MAP +1FC3; 03B7 03B9; MAP +1FC4; 03AE 03B9; MAP +1FC6; 03B7 0342; MAP +1FC7; 03B7 0342 03B9; MAP +1FC8; 1F72; MAP +1FC9; 1F73; MAP +1FCA; 1F74; MAP +1FCB; 1F75; MAP +1FCC; 03B7 03B9; MAP +1FD2; 03B9 0308 0300; MAP +1FD3; 03B9 0308 0301; MAP +1FD6; 03B9 0342; MAP +1FD7; 03B9 0308 0342; MAP +1FD8; 1FD0; MAP +1FD9; 1FD1; MAP +1FDA; 1F76; MAP +1FDB; 1F77; MAP +1FE2; 03C5 0308 0300; MAP +1FE3; 03C5 0308 0301; MAP +1FE4; 03C1 0313; MAP +1FE6; 03C5 0342; MAP +1FE7; 03C5 0308 0342; MAP +1FE8; 1FE0; MAP +1FE9; 1FE1; MAP +1FEA; 1F7A; MAP +1FEB; 1F7B; MAP +1FEC; 1FE5; MAP +1FF2; 1F7C 03B9; MAP +1FF3; 03C9 03B9; MAP +1FF4; 03CE 03B9; MAP +1FF6; 03C9 0342; MAP +1FF7; 03C9 0342 03B9; MAP +1FF8; 1F78; MAP +1FF9; 1F79; MAP +1FFA; 1F7C; MAP +1FFB; 1F7D; MAP +1FFC; 03C9 03B9; MAP +20A8; 0072 0073; MAP +2102; 0063; MAP +2103; 00B0 0063; MAP +2107; 025B; MAP +2109; 00B0 0066; MAP +210B; 0068; MAP +210C; 0068; MAP +210D; 0068; MAP +2110; 0069; MAP +2111; 0069; MAP +2112; 006C; MAP +2115; 006E; MAP +2116; 006E 006F; MAP +2119; 0070; MAP +211A; 0071; MAP +211B; 0072; MAP +211C; 0072; MAP +211D; 0072; MAP +2120; 0073 006D; MAP +2121; 0074 0065 006C; MAP +2122; 0074 006D; MAP +2124; 007A; MAP +2126; 03C9; MAP +2128; 007A; MAP +212A; 006B; MAP +212B; 00E5; MAP +212C; 0062; MAP +212D; 0063; MAP +2130; 0065; MAP +2131; 0066; MAP +2133; 006D; MAP +213E; 03B3; MAP +213F; 03C0; MAP +2145; 0064; MAP +2160; 2170; MAP +2161; 2171; MAP +2162; 2172; MAP +2163; 2173; MAP +2164; 2174; MAP +2165; 2175; MAP +2166; 2176; MAP +2167; 2177; MAP +2168; 2178; MAP +2169; 2179; MAP +216A; 217A; MAP +216B; 217B; MAP +216C; 217C; MAP +216D; 217D; MAP +216E; 217E; MAP +216F; 217F; MAP +24B6; 24D0; MAP +24B7; 24D1; MAP +24B8; 24D2; MAP +24B9; 24D3; MAP +24BA; 24D4; MAP +24BB; 24D5; MAP +24BC; 24D6; MAP +24BD; 24D7; MAP +24BE; 24D8; MAP +24BF; 24D9; MAP +24C0; 24DA; MAP +24C1; 24DB; MAP +24C2; 24DC; MAP +24C3; 24DD; MAP +24C4; 24DE; MAP +24C5; 24DF; MAP +24C6; 24E0; MAP +24C7; 24E1; MAP +24C8; 24E2; MAP +24C9; 24E3; MAP +24CA; 24E4; MAP +24CB; 24E5; MAP +24CC; 24E6; MAP +24CD; 24E7; MAP +24CE; 24E8; MAP +24CF; 24E9; MAP +3371; 0068 0070 0061; MAP +3373; 0061 0075; MAP +3375; 006F 0076; MAP +3380; 0070 0061; MAP +3381; 006E 0061; MAP +3382; 03BC 0061; MAP +3383; 006D 0061; MAP +3384; 006B 0061; MAP +3385; 006B 0062; MAP +3386; 006D 0062; MAP +3387; 0067 0062; MAP +338A; 0070 0066; MAP +338B; 006E 0066; MAP +338C; 03BC 0066; MAP +3390; 0068 007A; MAP +3391; 006B 0068 007A; MAP +3392; 006D 0068 007A; MAP +3393; 0067 0068 007A; MAP +3394; 0074 0068 007A; MAP +33A9; 0070 0061; MAP +33AA; 006B 0070 0061; MAP +33AB; 006D 0070 0061; MAP +33AC; 0067 0070 0061; MAP +33B4; 0070 0076; MAP +33B5; 006E 0076; MAP +33B6; 03BC 0076; MAP +33B7; 006D 0076; MAP +33B8; 006B 0076; MAP +33B9; 006D 0076; MAP +33BA; 0070 0077; MAP +33BB; 006E 0077; MAP +33BC; 03BC 0077; MAP +33BD; 006D 0077; MAP +33BE; 006B 0077; MAP +33BF; 006D 0077; MAP +33C0; 006B 03C9; MAP +33C1; 006D 03C9; MAP +33C3; 0062 0071; MAP +33C6; 0063 2215 006B 0067; MAP +33C7; 0063 006F 002E; MAP +33C8; 0064 0062; MAP +33C9; 0067 0079; MAP +33CB; 0068 0070; MAP +33CD; 006B 006B; MAP +33CE; 006B 006D; MAP +33D7; 0070 0068; MAP +33D9; 0070 0070 006D; MAP +33DA; 0070 0072; MAP +33DC; 0073 0076; MAP +33DD; 0077 0062; MAP +FB00; 0066 0066; MAP +FB01; 0066 0069; MAP +FB02; 0066 006C; MAP +FB03; 0066 0066 0069; MAP +FB04; 0066 0066 006C; MAP +FB05; 0073 0074; MAP +FB06; 0073 0074; MAP +FB13; 0574 0576; MAP +FB14; 0574 0565; MAP +FB15; 0574 056B; MAP +FB16; 057E 0576; MAP +FB17; 0574 056D; MAP +FF21; FF41; MAP +FF22; FF42; MAP +FF23; FF43; MAP +FF24; FF44; MAP +FF25; FF45; MAP +FF26; FF46; MAP +FF27; FF47; MAP +FF28; FF48; MAP +FF29; FF49; MAP +FF2A; FF4A; MAP +FF2B; FF4B; MAP +FF2C; FF4C; MAP +FF2D; FF4D; MAP +FF2E; FF4E; MAP +FF2F; FF4F; MAP +FF30; FF50; MAP +FF31; FF51; MAP +FF32; FF52; MAP +FF33; FF53; MAP +FF34; FF54; MAP +FF35; FF55; MAP +FF36; FF56; MAP +FF37; FF57; MAP +FF38; FF58; MAP +FF39; FF59; MAP +FF3A; FF5A; MAP +10400; 10428; MAP +10401; 10429; MAP +10402; 1042A; MAP +10403; 1042B; MAP +10404; 1042C; MAP +10405; 1042D; MAP +10406; 1042E; MAP +10407; 1042F; MAP +10408; 10430; MAP +10409; 10431; MAP +1040A; 10432; MAP +1040B; 10433; MAP +1040C; 10434; MAP +1040D; 10435; MAP +1040E; 10436; MAP +1040F; 10437; MAP +10410; 10438; MAP +10411; 10439; MAP +10412; 1043A; MAP +10413; 1043B; MAP +10414; 1043C; MAP +10415; 1043D; MAP +10416; 1043E; MAP +10417; 1043F; MAP +10418; 10440; MAP +10419; 10441; MAP +1041A; 10442; MAP +1041B; 10443; MAP +1041C; 10444; MAP +1041D; 10445; MAP +1041E; 10446; MAP +1041F; 10447; MAP +10420; 10448; MAP +10421; 10449; MAP +10422; 1044A; MAP +10423; 1044B; MAP +10424; 1044C; MAP +10425; 1044D; MAP +1D400; 0061; MAP +1D401; 0062; MAP +1D402; 0063; MAP +1D403; 0064; MAP +1D404; 0065; MAP +1D405; 0066; MAP +1D406; 0067; MAP +1D407; 0068; MAP +1D408; 0069; MAP +1D409; 006A; MAP +1D40A; 006B; MAP +1D40B; 006C; MAP +1D40C; 006D; MAP +1D40D; 006E; MAP +1D40E; 006F; MAP +1D40F; 0070; MAP +1D410; 0071; MAP +1D411; 0072; MAP +1D412; 0073; MAP +1D413; 0074; MAP +1D414; 0075; MAP +1D415; 0076; MAP +1D416; 0077; MAP +1D417; 0078; MAP +1D418; 0079; MAP +1D419; 007A; MAP +1D434; 0061; MAP +1D435; 0062; MAP +1D436; 0063; MAP +1D437; 0064; MAP +1D438; 0065; MAP +1D439; 0066; MAP +1D43A; 0067; MAP +1D43B; 0068; MAP +1D43C; 0069; MAP +1D43D; 006A; MAP +1D43E; 006B; MAP +1D43F; 006C; MAP +1D440; 006D; MAP +1D441; 006E; MAP +1D442; 006F; MAP +1D443; 0070; MAP +1D444; 0071; MAP +1D445; 0072; MAP +1D446; 0073; MAP +1D447; 0074; MAP +1D448; 0075; MAP +1D449; 0076; MAP +1D44A; 0077; MAP +1D44B; 0078; MAP +1D44C; 0079; MAP +1D44D; 007A; MAP +1D468; 0061; MAP +1D469; 0062; MAP +1D46A; 0063; MAP +1D46B; 0064; MAP +1D46C; 0065; MAP +1D46D; 0066; MAP +1D46E; 0067; MAP +1D46F; 0068; MAP +1D470; 0069; MAP +1D471; 006A; MAP +1D472; 006B; MAP +1D473; 006C; MAP +1D474; 006D; MAP +1D475; 006E; MAP +1D476; 006F; MAP +1D477; 0070; MAP +1D478; 0071; MAP +1D479; 0072; MAP +1D47A; 0073; MAP +1D47B; 0074; MAP +1D47C; 0075; MAP +1D47D; 0076; MAP +1D47E; 0077; MAP +1D47F; 0078; MAP +1D480; 0079; MAP +1D481; 007A; MAP +1D49C; 0061; MAP +1D49E; 0063; MAP +1D49F; 0064; MAP +1D4A2; 0067; MAP +1D4A5; 006A; MAP +1D4A6; 006B; MAP +1D4A9; 006E; MAP +1D4AA; 006F; MAP +1D4AB; 0070; MAP +1D4AC; 0071; MAP +1D4AE; 0073; MAP +1D4AF; 0074; MAP +1D4B0; 0075; MAP +1D4B1; 0076; MAP +1D4B2; 0077; MAP +1D4B3; 0078; MAP +1D4B4; 0079; MAP +1D4B5; 007A; MAP +1D4D0; 0061; MAP +1D4D1; 0062; MAP +1D4D2; 0063; MAP +1D4D3; 0064; MAP +1D4D4; 0065; MAP +1D4D5; 0066; MAP +1D4D6; 0067; MAP +1D4D7; 0068; MAP +1D4D8; 0069; MAP +1D4D9; 006A; MAP +1D4DA; 006B; MAP +1D4DB; 006C; MAP +1D4DC; 006D; MAP +1D4DD; 006E; MAP +1D4DE; 006F; MAP +1D4DF; 0070; MAP +1D4E0; 0071; MAP +1D4E1; 0072; MAP +1D4E2; 0073; MAP +1D4E3; 0074; MAP +1D4E4; 0075; MAP +1D4E5; 0076; MAP +1D4E6; 0077; MAP +1D4E7; 0078; MAP +1D4E8; 0079; MAP +1D4E9; 007A; MAP +1D504; 0061; MAP +1D505; 0062; MAP +1D507; 0064; MAP +1D508; 0065; MAP +1D509; 0066; MAP +1D50A; 0067; MAP +1D50D; 006A; MAP +1D50E; 006B; MAP +1D50F; 006C; MAP +1D510; 006D; MAP +1D511; 006E; MAP +1D512; 006F; MAP +1D513; 0070; MAP +1D514; 0071; MAP +1D516; 0073; MAP +1D517; 0074; MAP +1D518; 0075; MAP +1D519; 0076; MAP +1D51A; 0077; MAP +1D51B; 0078; MAP +1D51C; 0079; MAP +1D538; 0061; MAP +1D539; 0062; MAP +1D53B; 0064; MAP +1D53C; 0065; MAP +1D53D; 0066; MAP +1D53E; 0067; MAP +1D540; 0069; MAP +1D541; 006A; MAP +1D542; 006B; MAP +1D543; 006C; MAP +1D544; 006D; MAP +1D546; 006F; MAP +1D54A; 0073; MAP +1D54B; 0074; MAP +1D54C; 0075; MAP +1D54D; 0076; MAP +1D54E; 0077; MAP +1D54F; 0078; MAP +1D550; 0079; MAP +1D56C; 0061; MAP +1D56D; 0062; MAP +1D56E; 0063; MAP +1D56F; 0064; MAP +1D570; 0065; MAP +1D571; 0066; MAP +1D572; 0067; MAP +1D573; 0068; MAP +1D574; 0069; MAP +1D575; 006A; MAP +1D576; 006B; MAP +1D577; 006C; MAP +1D578; 006D; MAP +1D579; 006E; MAP +1D57A; 006F; MAP +1D57B; 0070; MAP +1D57C; 0071; MAP +1D57D; 0072; MAP +1D57E; 0073; MAP +1D57F; 0074; MAP +1D580; 0075; MAP +1D581; 0076; MAP +1D582; 0077; MAP +1D583; 0078; MAP +1D584; 0079; MAP +1D585; 007A; MAP +1D5A0; 0061; MAP +1D5A1; 0062; MAP +1D5A2; 0063; MAP +1D5A3; 0064; MAP +1D5A4; 0065; MAP +1D5A5; 0066; MAP +1D5A6; 0067; MAP +1D5A7; 0068; MAP +1D5A8; 0069; MAP +1D5A9; 006A; MAP +1D5AA; 006B; MAP +1D5AB; 006C; MAP +1D5AC; 006D; MAP +1D5AD; 006E; MAP +1D5AE; 006F; MAP +1D5AF; 0070; MAP +1D5B0; 0071; MAP +1D5B1; 0072; MAP +1D5B2; 0073; MAP +1D5B3; 0074; MAP +1D5B4; 0075; MAP +1D5B5; 0076; MAP +1D5B6; 0077; MAP +1D5B7; 0078; MAP +1D5B8; 0079; MAP +1D5B9; 007A; MAP +1D5D4; 0061; MAP +1D5D5; 0062; MAP +1D5D6; 0063; MAP +1D5D7; 0064; MAP +1D5D8; 0065; MAP +1D5D9; 0066; MAP +1D5DA; 0067; MAP +1D5DB; 0068; MAP +1D5DC; 0069; MAP +1D5DD; 006A; MAP +1D5DE; 006B; MAP +1D5DF; 006C; MAP +1D5E0; 006D; MAP +1D5E1; 006E; MAP +1D5E2; 006F; MAP +1D5E3; 0070; MAP +1D5E4; 0071; MAP +1D5E5; 0072; MAP +1D5E6; 0073; MAP +1D5E7; 0074; MAP +1D5E8; 0075; MAP +1D5E9; 0076; MAP +1D5EA; 0077; MAP +1D5EB; 0078; MAP +1D5EC; 0079; MAP +1D5ED; 007A; MAP +1D608; 0061; MAP +1D609; 0062; MAP +1D60A; 0063; MAP +1D60B; 0064; MAP +1D60C; 0065; MAP +1D60D; 0066; MAP +1D60E; 0067; MAP +1D60F; 0068; MAP +1D610; 0069; MAP +1D611; 006A; MAP +1D612; 006B; MAP +1D613; 006C; MAP +1D614; 006D; MAP +1D615; 006E; MAP +1D616; 006F; MAP +1D617; 0070; MAP +1D618; 0071; MAP +1D619; 0072; MAP +1D61A; 0073; MAP +1D61B; 0074; MAP +1D61C; 0075; MAP +1D61D; 0076; MAP +1D61E; 0077; MAP +1D61F; 0078; MAP +1D620; 0079; MAP +1D621; 007A; MAP +1D63C; 0061; MAP +1D63D; 0062; MAP +1D63E; 0063; MAP +1D63F; 0064; MAP +1D640; 0065; MAP +1D641; 0066; MAP +1D642; 0067; MAP +1D643; 0068; MAP +1D644; 0069; MAP +1D645; 006A; MAP +1D646; 006B; MAP +1D647; 006C; MAP +1D648; 006D; MAP +1D649; 006E; MAP +1D64A; 006F; MAP +1D64B; 0070; MAP +1D64C; 0071; MAP +1D64D; 0072; MAP +1D64E; 0073; MAP +1D64F; 0074; MAP +1D650; 0075; MAP +1D651; 0076; MAP +1D652; 0077; MAP +1D653; 0078; MAP +1D654; 0079; MAP +1D655; 007A; MAP +1D670; 0061; MAP +1D671; 0062; MAP +1D672; 0063; MAP +1D673; 0064; MAP +1D674; 0065; MAP +1D675; 0066; MAP +1D676; 0067; MAP +1D677; 0068; MAP +1D678; 0069; MAP +1D679; 006A; MAP +1D67A; 006B; MAP +1D67B; 006C; MAP +1D67C; 006D; MAP +1D67D; 006E; MAP +1D67E; 006F; MAP +1D67F; 0070; MAP +1D680; 0071; MAP +1D681; 0072; MAP +1D682; 0073; MAP +1D683; 0074; MAP +1D684; 0075; MAP +1D685; 0076; MAP +1D686; 0077; MAP +1D687; 0078; MAP +1D688; 0079; MAP +1D689; 007A; MAP +1D6A8; 03B1; MAP +1D6A9; 03B2; MAP +1D6AA; 03B3; MAP +1D6AB; 03B4; MAP +1D6AC; 03B5; MAP +1D6AD; 03B6; MAP +1D6AE; 03B7; MAP +1D6AF; 03B8; MAP +1D6B0; 03B9; MAP +1D6B1; 03BA; MAP +1D6B2; 03BB; MAP +1D6B3; 03BC; MAP +1D6B4; 03BD; MAP +1D6B5; 03BE; MAP +1D6B6; 03BF; MAP +1D6B7; 03C0; MAP +1D6B8; 03C1; MAP +1D6B9; 03B8; MAP +1D6BA; 03C3; MAP +1D6BB; 03C4; MAP +1D6BC; 03C5; MAP +1D6BD; 03C6; MAP +1D6BE; 03C7; MAP +1D6BF; 03C8; MAP +1D6C0; 03C9; MAP +1D6D3; 03C3; MAP +1D6E2; 03B1; MAP +1D6E3; 03B2; MAP +1D6E4; 03B3; MAP +1D6E5; 03B4; MAP +1D6E6; 03B5; MAP +1D6E7; 03B6; MAP +1D6E8; 03B7; MAP +1D6E9; 03B8; MAP +1D6EA; 03B9; MAP +1D6EB; 03BA; MAP +1D6EC; 03BB; MAP +1D6ED; 03BC; MAP +1D6EE; 03BD; MAP +1D6EF; 03BE; MAP +1D6F0; 03BF; MAP +1D6F1; 03C0; MAP +1D6F2; 03C1; MAP +1D6F3; 03B8; MAP +1D6F4; 03C3; MAP +1D6F5; 03C4; MAP +1D6F6; 03C5; MAP +1D6F7; 03C6; MAP +1D6F8; 03C7; MAP +1D6F9; 03C8; MAP +1D6FA; 03C9; MAP +1D70D; 03C3; MAP +1D71C; 03B1; MAP +1D71D; 03B2; MAP +1D71E; 03B3; MAP +1D71F; 03B4; MAP +1D720; 03B5; MAP +1D721; 03B6; MAP +1D722; 03B7; MAP +1D723; 03B8; MAP +1D724; 03B9; MAP +1D725; 03BA; MAP +1D726; 03BB; MAP +1D727; 03BC; MAP +1D728; 03BD; MAP +1D729; 03BE; MAP +1D72A; 03BF; MAP +1D72B; 03C0; MAP +1D72C; 03C1; MAP +1D72D; 03B8; MAP +1D72E; 03C3; MAP +1D72F; 03C4; MAP +1D730; 03C5; MAP +1D731; 03C6; MAP +1D732; 03C7; MAP +1D733; 03C8; MAP +1D734; 03C9; MAP +1D747; 03C3; MAP +1D756; 03B1; MAP +1D757; 03B2; MAP +1D758; 03B3; MAP +1D759; 03B4; MAP +1D75A; 03B5; MAP +1D75B; 03B6; MAP +1D75C; 03B7; MAP +1D75D; 03B8; MAP +1D75E; 03B9; MAP +1D75F; 03BA; MAP +1D760; 03BB; MAP +1D761; 03BC; MAP +1D762; 03BD; MAP +1D763; 03BE; MAP +1D764; 03BF; MAP +1D765; 03C0; MAP +1D766; 03C1; MAP +1D767; 03B8; MAP +1D768; 03C3; MAP +1D769; 03C4; MAP +1D76A; 03C5; MAP +1D76B; 03C6; MAP +1D76C; 03C7; MAP +1D76D; 03C8; MAP +1D76E; 03C9; MAP +1D781; 03C3; MAP +1D790; 03B1; MAP +1D791; 03B2; MAP +1D792; 03B3; MAP +1D793; 03B4; MAP +1D794; 03B5; MAP +1D795; 03B6; MAP +1D796; 03B7; MAP +1D797; 03B8; MAP +1D798; 03B9; MAP +1D799; 03BA; MAP +1D79A; 03BB; MAP +1D79B; 03BC; MAP +1D79C; 03BD; MAP +1D79D; 03BE; MAP +1D79E; 03BF; MAP +1D79F; 03C0; MAP +1D7A0; 03C1; MAP +1D7A1; 03B8; MAP +1D7A2; 03C3; MAP +1D7A3; 03C4; MAP +1D7A4; 03C5; MAP +1D7A5; 03C6; MAP +1D7A6; 03C7; MAP +1D7A7; 03C8; MAP +1D7A8; 03C9; MAP +1D7BB; 03C3; MAP + +# Total code points 1371 + +# code points from Table C.3 + +E000..F8FF; ; PROHIBITED +F0000..FFFFD; ; PROHIBITED +100000..10FFFD; ; PROHIBITED + +# Total code points 2051 + +# code points from Table C.4 + +FDD0..FDEF; ; PROHIBITED +FFFE..FFFF; ; PROHIBITED +1FFFE..1FFFF; ; PROHIBITED +2FFFE..2FFFF; ; PROHIBITED +3FFFE..3FFFF; ; PROHIBITED +4FFFE..4FFFF; ; PROHIBITED +5FFFE..5FFFF; ; PROHIBITED +6FFFE..6FFFF; ; PROHIBITED +7FFFE..7FFFF; ; PROHIBITED +8FFFE..8FFFF; ; PROHIBITED +9FFFE..9FFFF; ; PROHIBITED +AFFFE..AFFFF; ; PROHIBITED +BFFFE..BFFFF; ; PROHIBITED +CFFFE..CFFFF; ; PROHIBITED +DFFFE..DFFFF; ; PROHIBITED +EFFFE..EFFFF; ; PROHIBITED +FFFFE..FFFFF; ; PROHIBITED +10FFFE..10FFFF; ; PROHIBITED + +# Total code points 18 + +# code points from Table C.5 + +D800..DFFF; ; PROHIBITED + +# Total code points 0 + +# code points from Table C.6 + +FFF9; ; PROHIBITED +FFFA; ; PROHIBITED +FFFB; ; PROHIBITED +FFFC; ; PROHIBITED +FFFD; ; PROHIBITED + +# Total code points 5 + +# code points from Table C.7 + +2FF0..2FFB; ; PROHIBITED + +# Total code points 1 + +# code points from Table C.8 + +0340; ; PROHIBITED +0341; ; PROHIBITED +200E; ; PROHIBITED +200F; ; PROHIBITED +202A; ; PROHIBITED +202B; ; PROHIBITED +202C; ; PROHIBITED +202D; ; PROHIBITED +202E; ; PROHIBITED +206A; ; PROHIBITED +206B; ; PROHIBITED +206C; ; PROHIBITED +206D; ; PROHIBITED +206E; ; PROHIBITED +206F; ; PROHIBITED + +# Total code points 15 + +# code points from Table C.9 + +E0001; ; PROHIBITED +E0020..E007F; ; PROHIBITED + +# Total code points 82 + diff --git a/icuSources/test/testdata/nfs4_cs_prep_cs.txt b/icuSources/test/testdata/nfs4_cs_prep_cs.txt new file mode 100644 index 00000000..8d2e73b4 --- /dev/null +++ b/icuSources/test/testdata/nfs4_cs_prep_cs.txt @@ -0,0 +1,522 @@ +################### +# Copyright (C) 2003, International Business Machines +# Corporation and others. All Rights Reserved. +################### + +################### +# WARNING: This table is generated by filterRFC3454.pl tool. DO NOT EDIT +################### + +# This table contains code points from Table A.1 from RFC 3454 + +0221; ; UNASSIGNED +0234..024F; ; UNASSIGNED +02AE..02AF; ; UNASSIGNED +02EF..02FF; ; UNASSIGNED +0350..035F; ; UNASSIGNED +0370..0373; ; UNASSIGNED +0376..0379; ; UNASSIGNED +037B..037D; ; UNASSIGNED +037F..0383; ; UNASSIGNED +038B; ; UNASSIGNED +038D; ; UNASSIGNED +03A2; ; UNASSIGNED +03CF; ; UNASSIGNED +03F7..03FF; ; UNASSIGNED +0487; ; UNASSIGNED +04CF; ; UNASSIGNED +04F6..04F7; ; UNASSIGNED +04FA..04FF; ; UNASSIGNED +0510..0530; ; UNASSIGNED +0557..0558; ; UNASSIGNED +0560; ; UNASSIGNED +0588; ; UNASSIGNED +058B..0590; ; UNASSIGNED +05A2; ; UNASSIGNED +05BA; ; UNASSIGNED +05C5..05CF; ; UNASSIGNED +05EB..05EF; ; UNASSIGNED +05F5..060B; ; UNASSIGNED +060D..061A; ; UNASSIGNED +061C..061E; ; UNASSIGNED +0620; ; UNASSIGNED +063B..063F; ; UNASSIGNED +0656..065F; ; UNASSIGNED +06EE..06EF; ; UNASSIGNED +06FF; ; UNASSIGNED +070E; ; UNASSIGNED +072D..072F; ; UNASSIGNED +074B..077F; ; UNASSIGNED +07B2..0900; ; UNASSIGNED +0904; ; UNASSIGNED +093A..093B; ; UNASSIGNED +094E..094F; ; UNASSIGNED +0955..0957; ; UNASSIGNED +0971..0980; ; UNASSIGNED +0984; ; UNASSIGNED +098D..098E; ; UNASSIGNED +0991..0992; ; UNASSIGNED +09A9; ; UNASSIGNED +09B1; ; UNASSIGNED +09B3..09B5; ; UNASSIGNED +09BA..09BB; ; UNASSIGNED +09BD; ; UNASSIGNED +09C5..09C6; ; UNASSIGNED +09C9..09CA; ; UNASSIGNED +09CE..09D6; ; UNASSIGNED +09D8..09DB; ; UNASSIGNED +09DE; ; UNASSIGNED +09E4..09E5; ; UNASSIGNED +09FB..0A01; ; UNASSIGNED +0A03..0A04; ; UNASSIGNED +0A0B..0A0E; ; UNASSIGNED +0A11..0A12; ; UNASSIGNED +0A29; ; UNASSIGNED +0A31; ; UNASSIGNED +0A34; ; UNASSIGNED +0A37; ; UNASSIGNED +0A3A..0A3B; ; UNASSIGNED +0A3D; ; UNASSIGNED +0A43..0A46; ; UNASSIGNED +0A49..0A4A; ; UNASSIGNED +0A4E..0A58; ; UNASSIGNED +0A5D; ; UNASSIGNED +0A5F..0A65; ; UNASSIGNED +0A75..0A80; ; UNASSIGNED +0A84; ; UNASSIGNED +0A8C; ; UNASSIGNED +0A8E; ; UNASSIGNED +0A92; ; UNASSIGNED +0AA9; ; UNASSIGNED +0AB1; ; UNASSIGNED +0AB4; ; UNASSIGNED +0ABA..0ABB; ; UNASSIGNED +0AC6; ; UNASSIGNED +0ACA; ; UNASSIGNED +0ACE..0ACF; ; UNASSIGNED +0AD1..0ADF; ; UNASSIGNED +0AE1..0AE5; ; UNASSIGNED +0AF0..0B00; ; UNASSIGNED +0B04; ; UNASSIGNED +0B0D..0B0E; ; UNASSIGNED +0B11..0B12; ; UNASSIGNED +0B29; ; UNASSIGNED +0B31; ; UNASSIGNED +0B34..0B35; ; UNASSIGNED +0B3A..0B3B; ; UNASSIGNED +0B44..0B46; ; UNASSIGNED +0B49..0B4A; ; UNASSIGNED +0B4E..0B55; ; UNASSIGNED +0B58..0B5B; ; UNASSIGNED +0B5E; ; UNASSIGNED +0B62..0B65; ; UNASSIGNED +0B71..0B81; ; UNASSIGNED +0B84; ; UNASSIGNED +0B8B..0B8D; ; UNASSIGNED +0B91; ; UNASSIGNED +0B96..0B98; ; UNASSIGNED +0B9B; ; UNASSIGNED +0B9D; ; UNASSIGNED +0BA0..0BA2; ; UNASSIGNED +0BA5..0BA7; ; UNASSIGNED +0BAB..0BAD; ; UNASSIGNED +0BB6; ; UNASSIGNED +0BBA..0BBD; ; UNASSIGNED +0BC3..0BC5; ; UNASSIGNED +0BC9; ; UNASSIGNED +0BCE..0BD6; ; UNASSIGNED +0BD8..0BE6; ; UNASSIGNED +0BF3..0C00; ; UNASSIGNED +0C04; ; UNASSIGNED +0C0D; ; UNASSIGNED +0C11; ; UNASSIGNED +0C29; ; UNASSIGNED +0C34; ; UNASSIGNED +0C3A..0C3D; ; UNASSIGNED +0C45; ; UNASSIGNED +0C49; ; UNASSIGNED +0C4E..0C54; ; UNASSIGNED +0C57..0C5F; ; UNASSIGNED +0C62..0C65; ; UNASSIGNED +0C70..0C81; ; UNASSIGNED +0C84; ; UNASSIGNED +0C8D; ; UNASSIGNED +0C91; ; UNASSIGNED +0CA9; ; UNASSIGNED +0CB4; ; UNASSIGNED +0CBA..0CBD; ; UNASSIGNED +0CC5; ; UNASSIGNED +0CC9; ; UNASSIGNED +0CCE..0CD4; ; UNASSIGNED +0CD7..0CDD; ; UNASSIGNED +0CDF; ; UNASSIGNED +0CE2..0CE5; ; UNASSIGNED +0CF0..0D01; ; UNASSIGNED +0D04; ; UNASSIGNED +0D0D; ; UNASSIGNED +0D11; ; UNASSIGNED +0D29; ; UNASSIGNED +0D3A..0D3D; ; UNASSIGNED +0D44..0D45; ; UNASSIGNED +0D49; ; UNASSIGNED +0D4E..0D56; ; UNASSIGNED +0D58..0D5F; ; UNASSIGNED +0D62..0D65; ; UNASSIGNED +0D70..0D81; ; UNASSIGNED +0D84; ; UNASSIGNED +0D97..0D99; ; UNASSIGNED +0DB2; ; UNASSIGNED +0DBC; ; UNASSIGNED +0DBE..0DBF; ; UNASSIGNED +0DC7..0DC9; ; UNASSIGNED +0DCB..0DCE; ; UNASSIGNED +0DD5; ; UNASSIGNED +0DD7; ; UNASSIGNED +0DE0..0DF1; ; UNASSIGNED +0DF5..0E00; ; UNASSIGNED +0E3B..0E3E; ; UNASSIGNED +0E5C..0E80; ; UNASSIGNED +0E83; ; UNASSIGNED +0E85..0E86; ; UNASSIGNED +0E89; ; UNASSIGNED +0E8B..0E8C; ; UNASSIGNED +0E8E..0E93; ; UNASSIGNED +0E98; ; UNASSIGNED +0EA0; ; UNASSIGNED +0EA4; ; UNASSIGNED +0EA6; ; UNASSIGNED +0EA8..0EA9; ; UNASSIGNED +0EAC; ; UNASSIGNED +0EBA; ; UNASSIGNED +0EBE..0EBF; ; UNASSIGNED +0EC5; ; UNASSIGNED +0EC7; ; UNASSIGNED +0ECE..0ECF; ; UNASSIGNED +0EDA..0EDB; ; UNASSIGNED +0EDE..0EFF; ; UNASSIGNED +0F48; ; UNASSIGNED +0F6B..0F70; ; UNASSIGNED +0F8C..0F8F; ; UNASSIGNED +0F98; ; UNASSIGNED +0FBD; ; UNASSIGNED +0FCD..0FCE; ; UNASSIGNED +0FD0..0FFF; ; UNASSIGNED +1022; ; UNASSIGNED +1028; ; UNASSIGNED +102B; ; UNASSIGNED +1033..1035; ; UNASSIGNED +103A..103F; ; UNASSIGNED +105A..109F; ; UNASSIGNED +10C6..10CF; ; UNASSIGNED +10F9..10FA; ; UNASSIGNED +10FC..10FF; ; UNASSIGNED +115A..115E; ; UNASSIGNED +11A3..11A7; ; UNASSIGNED +11FA..11FF; ; UNASSIGNED +1207; ; UNASSIGNED +1247; ; UNASSIGNED +1249; ; UNASSIGNED +124E..124F; ; UNASSIGNED +1257; ; UNASSIGNED +1259; ; UNASSIGNED +125E..125F; ; UNASSIGNED +1287; ; UNASSIGNED +1289; ; UNASSIGNED +128E..128F; ; UNASSIGNED +12AF; ; UNASSIGNED +12B1; ; UNASSIGNED +12B6..12B7; ; UNASSIGNED +12BF; ; UNASSIGNED +12C1; ; UNASSIGNED +12C6..12C7; ; UNASSIGNED +12CF; ; UNASSIGNED +12D7; ; UNASSIGNED +12EF; ; UNASSIGNED +130F; ; UNASSIGNED +1311; ; UNASSIGNED +1316..1317; ; UNASSIGNED +131F; ; UNASSIGNED +1347; ; UNASSIGNED +135B..1360; ; UNASSIGNED +137D..139F; ; UNASSIGNED +13F5..1400; ; UNASSIGNED +1677..167F; ; UNASSIGNED +169D..169F; ; UNASSIGNED +16F1..16FF; ; UNASSIGNED +170D; ; UNASSIGNED +1715..171F; ; UNASSIGNED +1737..173F; ; UNASSIGNED +1754..175F; ; UNASSIGNED +176D; ; UNASSIGNED +1771; ; UNASSIGNED +1774..177F; ; UNASSIGNED +17DD..17DF; ; UNASSIGNED +17EA..17FF; ; UNASSIGNED +180F; ; UNASSIGNED +181A..181F; ; UNASSIGNED +1878..187F; ; UNASSIGNED +18AA..1DFF; ; UNASSIGNED +1E9C..1E9F; ; UNASSIGNED +1EFA..1EFF; ; UNASSIGNED +1F16..1F17; ; UNASSIGNED +1F1E..1F1F; ; UNASSIGNED +1F46..1F47; ; UNASSIGNED +1F4E..1F4F; ; UNASSIGNED +1F58; ; UNASSIGNED +1F5A; ; UNASSIGNED +1F5C; ; UNASSIGNED +1F5E; ; UNASSIGNED +1F7E..1F7F; ; UNASSIGNED +1FB5; ; UNASSIGNED +1FC5; ; UNASSIGNED +1FD4..1FD5; ; UNASSIGNED +1FDC; ; UNASSIGNED +1FF0..1FF1; ; UNASSIGNED +1FF5; ; UNASSIGNED +1FFF; ; UNASSIGNED +2053..2056; ; UNASSIGNED +2058..205E; ; UNASSIGNED +2064..2069; ; UNASSIGNED +2072..2073; ; UNASSIGNED +208F..209F; ; UNASSIGNED +20B2..20CF; ; UNASSIGNED +20EB..20FF; ; UNASSIGNED +213B..213C; ; UNASSIGNED +214C..2152; ; UNASSIGNED +2184..218F; ; UNASSIGNED +23CF..23FF; ; UNASSIGNED +2427..243F; ; UNASSIGNED +244B..245F; ; UNASSIGNED +24FF; ; UNASSIGNED +2614..2615; ; UNASSIGNED +2618; ; UNASSIGNED +267E..267F; ; UNASSIGNED +268A..2700; ; UNASSIGNED +2705; ; UNASSIGNED +270A..270B; ; UNASSIGNED +2728; ; UNASSIGNED +274C; ; UNASSIGNED +274E; ; UNASSIGNED +2753..2755; ; UNASSIGNED +2757; ; UNASSIGNED +275F..2760; ; UNASSIGNED +2795..2797; ; UNASSIGNED +27B0; ; UNASSIGNED +27BF..27CF; ; UNASSIGNED +27EC..27EF; ; UNASSIGNED +2B00..2E7F; ; UNASSIGNED +2E9A; ; UNASSIGNED +2EF4..2EFF; ; UNASSIGNED +2FD6..2FEF; ; UNASSIGNED +2FFC..2FFF; ; UNASSIGNED +3040; ; UNASSIGNED +3097..3098; ; UNASSIGNED +3100..3104; ; UNASSIGNED +312D..3130; ; UNASSIGNED +318F; ; UNASSIGNED +31B8..31EF; ; UNASSIGNED +321D..321F; ; UNASSIGNED +3244..3250; ; UNASSIGNED +327C..327E; ; UNASSIGNED +32CC..32CF; ; UNASSIGNED +32FF; ; UNASSIGNED +3377..337A; ; UNASSIGNED +33DE..33DF; ; UNASSIGNED +33FF; ; UNASSIGNED +4DB6..4DFF; ; UNASSIGNED +9FA6..9FFF; ; UNASSIGNED +A48D..A48F; ; UNASSIGNED +A4C7..ABFF; ; UNASSIGNED +D7A4..D7FF; ; UNASSIGNED +FA2E..FA2F; ; UNASSIGNED +FA6B..FAFF; ; UNASSIGNED +FB07..FB12; ; UNASSIGNED +FB18..FB1C; ; UNASSIGNED +FB37; ; UNASSIGNED +FB3D; ; UNASSIGNED +FB3F; ; UNASSIGNED +FB42; ; UNASSIGNED +FB45; ; UNASSIGNED +FBB2..FBD2; ; UNASSIGNED +FD40..FD4F; ; UNASSIGNED +FD90..FD91; ; UNASSIGNED +FDC8..FDCF; ; UNASSIGNED +FDFD..FDFF; ; UNASSIGNED +FE10..FE1F; ; UNASSIGNED +FE24..FE2F; ; UNASSIGNED +FE47..FE48; ; UNASSIGNED +FE53; ; UNASSIGNED +FE67; ; UNASSIGNED +FE6C..FE6F; ; UNASSIGNED +FE75; ; UNASSIGNED +FEFD..FEFE; ; UNASSIGNED +FF00; ; UNASSIGNED +FFBF..FFC1; ; UNASSIGNED +FFC8..FFC9; ; UNASSIGNED +FFD0..FFD1; ; UNASSIGNED +FFD8..FFD9; ; UNASSIGNED +FFDD..FFDF; ; UNASSIGNED +FFE7; ; UNASSIGNED +FFEF..FFF8; ; UNASSIGNED +10000..102FF; ; UNASSIGNED +1031F; ; UNASSIGNED +10324..1032F; ; UNASSIGNED +1034B..103FF; ; UNASSIGNED +10426..10427; ; UNASSIGNED +1044E..1CFFF; ; UNASSIGNED +1D0F6..1D0FF; ; UNASSIGNED +1D127..1D129; ; UNASSIGNED +1D1DE..1D3FF; ; UNASSIGNED +1D455; ; UNASSIGNED +1D49D; ; UNASSIGNED +1D4A0..1D4A1; ; UNASSIGNED +1D4A3..1D4A4; ; UNASSIGNED +1D4A7..1D4A8; ; UNASSIGNED +1D4AD; ; UNASSIGNED +1D4BA; ; UNASSIGNED +1D4BC; ; UNASSIGNED +1D4C1; ; UNASSIGNED +1D4C4; ; UNASSIGNED +1D506; ; UNASSIGNED +1D50B..1D50C; ; UNASSIGNED +1D515; ; UNASSIGNED +1D51D; ; UNASSIGNED +1D53A; ; UNASSIGNED +1D53F; ; UNASSIGNED +1D545; ; UNASSIGNED +1D547..1D549; ; UNASSIGNED +1D551; ; UNASSIGNED +1D6A4..1D6A7; ; UNASSIGNED +1D7CA..1D7CD; ; UNASSIGNED +1D800..1FFFD; ; UNASSIGNED +2A6D7..2F7FF; ; UNASSIGNED +2FA1E..2FFFD; ; UNASSIGNED +30000..3FFFD; ; UNASSIGNED +40000..4FFFD; ; UNASSIGNED +50000..5FFFD; ; UNASSIGNED +60000..6FFFD; ; UNASSIGNED +70000..7FFFD; ; UNASSIGNED +80000..8FFFD; ; UNASSIGNED +90000..9FFFD; ; UNASSIGNED +A0000..AFFFD; ; UNASSIGNED +B0000..BFFFD; ; UNASSIGNED +C0000..CFFFD; ; UNASSIGNED +D0000..DFFFD; ; UNASSIGNED +E0000; ; UNASSIGNED +E0002..E001F; ; UNASSIGNED +E0080..EFFFD; ; UNASSIGNED + +# Total code points 3653 + +# This table contains code points from Table B.1 from RFC 3454 + +00AD; ; MAP +034F; ; MAP +1806; ; MAP +180B; ; MAP +180C; ; MAP +180D; ; MAP +200B; ; MAP +200C; ; MAP +200D; ; MAP +2060; ; MAP +FE00; ; MAP +FE01; ; MAP +FE02; ; MAP +FE03; ; MAP +FE04; ; MAP +FE05; ; MAP +FE06; ; MAP +FE07; ; MAP +FE08; ; MAP +FE09; ; MAP +FE0A; ; MAP +FE0B; ; MAP +FE0C; ; MAP +FE0D; ; MAP +FE0E; ; MAP +FE0F; ; MAP +FEFF; ; MAP + +# Total code points 27 + +# code points from Table C.3 + +E000..F8FF; ; PROHIBITED +F0000..FFFFD; ; PROHIBITED +100000..10FFFD; ; PROHIBITED + +# Total code points 2051 + +# code points from Table C.4 + +FDD0..FDEF; ; PROHIBITED +FFFE..FFFF; ; PROHIBITED +1FFFE..1FFFF; ; PROHIBITED +2FFFE..2FFFF; ; PROHIBITED +3FFFE..3FFFF; ; PROHIBITED +4FFFE..4FFFF; ; PROHIBITED +5FFFE..5FFFF; ; PROHIBITED +6FFFE..6FFFF; ; PROHIBITED +7FFFE..7FFFF; ; PROHIBITED +8FFFE..8FFFF; ; PROHIBITED +9FFFE..9FFFF; ; PROHIBITED +AFFFE..AFFFF; ; PROHIBITED +BFFFE..BFFFF; ; PROHIBITED +CFFFE..CFFFF; ; PROHIBITED +DFFFE..DFFFF; ; PROHIBITED +EFFFE..EFFFF; ; PROHIBITED +FFFFE..FFFFF; ; PROHIBITED +10FFFE..10FFFF; ; PROHIBITED + +# Total code points 18 + +# code points from Table C.5 + +D800..DFFF; ; PROHIBITED + +# Total code points 0 + +# code points from Table C.6 + +FFF9; ; PROHIBITED +FFFA; ; PROHIBITED +FFFB; ; PROHIBITED +FFFC; ; PROHIBITED +FFFD; ; PROHIBITED + +# Total code points 5 + +# code points from Table C.7 + +2FF0..2FFB; ; PROHIBITED + +# Total code points 1 + +# code points from Table C.8 + +0340; ; PROHIBITED +0341; ; PROHIBITED +200E; ; PROHIBITED +200F; ; PROHIBITED +202A; ; PROHIBITED +202B; ; PROHIBITED +202C; ; PROHIBITED +202D; ; PROHIBITED +202E; ; PROHIBITED +206A; ; PROHIBITED +206B; ; PROHIBITED +206C; ; PROHIBITED +206D; ; PROHIBITED +206E; ; PROHIBITED +206F; ; PROHIBITED + +# Total code points 15 + +# code points from Table C.9 + +E0001; ; PROHIBITED +E0020..E007F; ; PROHIBITED + +# Total code points 82 + diff --git a/icuSources/test/testdata/nfs4_mixed_prep_p.txt b/icuSources/test/testdata/nfs4_mixed_prep_p.txt new file mode 100644 index 00000000..5fdeb595 --- /dev/null +++ b/icuSources/test/testdata/nfs4_mixed_prep_p.txt @@ -0,0 +1,565 @@ +################### +# Copyright (C) 2003, International Business Machines +# Corporation and others. All Rights Reserved. +################### + +################### +# WARNING: This table is generated by filterRFC3454.pl tool. DO NOT EDIT +################### + +# This table contains code points from Table A.1 from RFC 3454 + +0221; ; UNASSIGNED +0234..024F; ; UNASSIGNED +02AE..02AF; ; UNASSIGNED +02EF..02FF; ; UNASSIGNED +0350..035F; ; UNASSIGNED +0370..0373; ; UNASSIGNED +0376..0379; ; UNASSIGNED +037B..037D; ; UNASSIGNED +037F..0383; ; UNASSIGNED +038B; ; UNASSIGNED +038D; ; UNASSIGNED +03A2; ; UNASSIGNED +03CF; ; UNASSIGNED +03F7..03FF; ; UNASSIGNED +0487; ; UNASSIGNED +04CF; ; UNASSIGNED +04F6..04F7; ; UNASSIGNED +04FA..04FF; ; UNASSIGNED +0510..0530; ; UNASSIGNED +0557..0558; ; UNASSIGNED +0560; ; UNASSIGNED +0588; ; UNASSIGNED +058B..0590; ; UNASSIGNED +05A2; ; UNASSIGNED +05BA; ; UNASSIGNED +05C5..05CF; ; UNASSIGNED +05EB..05EF; ; UNASSIGNED +05F5..060B; ; UNASSIGNED +060D..061A; ; UNASSIGNED +061C..061E; ; UNASSIGNED +0620; ; UNASSIGNED +063B..063F; ; UNASSIGNED +0656..065F; ; UNASSIGNED +06EE..06EF; ; UNASSIGNED +06FF; ; UNASSIGNED +070E; ; UNASSIGNED +072D..072F; ; UNASSIGNED +074B..077F; ; UNASSIGNED +07B2..0900; ; UNASSIGNED +0904; ; UNASSIGNED +093A..093B; ; UNASSIGNED +094E..094F; ; UNASSIGNED +0955..0957; ; UNASSIGNED +0971..0980; ; UNASSIGNED +0984; ; UNASSIGNED +098D..098E; ; UNASSIGNED +0991..0992; ; UNASSIGNED +09A9; ; UNASSIGNED +09B1; ; UNASSIGNED +09B3..09B5; ; UNASSIGNED +09BA..09BB; ; UNASSIGNED +09BD; ; UNASSIGNED +09C5..09C6; ; UNASSIGNED +09C9..09CA; ; UNASSIGNED +09CE..09D6; ; UNASSIGNED +09D8..09DB; ; UNASSIGNED +09DE; ; UNASSIGNED +09E4..09E5; ; UNASSIGNED +09FB..0A01; ; UNASSIGNED +0A03..0A04; ; UNASSIGNED +0A0B..0A0E; ; UNASSIGNED +0A11..0A12; ; UNASSIGNED +0A29; ; UNASSIGNED +0A31; ; UNASSIGNED +0A34; ; UNASSIGNED +0A37; ; UNASSIGNED +0A3A..0A3B; ; UNASSIGNED +0A3D; ; UNASSIGNED +0A43..0A46; ; UNASSIGNED +0A49..0A4A; ; UNASSIGNED +0A4E..0A58; ; UNASSIGNED +0A5D; ; UNASSIGNED +0A5F..0A65; ; UNASSIGNED +0A75..0A80; ; UNASSIGNED +0A84; ; UNASSIGNED +0A8C; ; UNASSIGNED +0A8E; ; UNASSIGNED +0A92; ; UNASSIGNED +0AA9; ; UNASSIGNED +0AB1; ; UNASSIGNED +0AB4; ; UNASSIGNED +0ABA..0ABB; ; UNASSIGNED +0AC6; ; UNASSIGNED +0ACA; ; UNASSIGNED +0ACE..0ACF; ; UNASSIGNED +0AD1..0ADF; ; UNASSIGNED +0AE1..0AE5; ; UNASSIGNED +0AF0..0B00; ; UNASSIGNED +0B04; ; UNASSIGNED +0B0D..0B0E; ; UNASSIGNED +0B11..0B12; ; UNASSIGNED +0B29; ; UNASSIGNED +0B31; ; UNASSIGNED +0B34..0B35; ; UNASSIGNED +0B3A..0B3B; ; UNASSIGNED +0B44..0B46; ; UNASSIGNED +0B49..0B4A; ; UNASSIGNED +0B4E..0B55; ; UNASSIGNED +0B58..0B5B; ; UNASSIGNED +0B5E; ; UNASSIGNED +0B62..0B65; ; UNASSIGNED +0B71..0B81; ; UNASSIGNED +0B84; ; UNASSIGNED +0B8B..0B8D; ; UNASSIGNED +0B91; ; UNASSIGNED +0B96..0B98; ; UNASSIGNED +0B9B; ; UNASSIGNED +0B9D; ; UNASSIGNED +0BA0..0BA2; ; UNASSIGNED +0BA5..0BA7; ; UNASSIGNED +0BAB..0BAD; ; UNASSIGNED +0BB6; ; UNASSIGNED +0BBA..0BBD; ; UNASSIGNED +0BC3..0BC5; ; UNASSIGNED +0BC9; ; UNASSIGNED +0BCE..0BD6; ; UNASSIGNED +0BD8..0BE6; ; UNASSIGNED +0BF3..0C00; ; UNASSIGNED +0C04; ; UNASSIGNED +0C0D; ; UNASSIGNED +0C11; ; UNASSIGNED +0C29; ; UNASSIGNED +0C34; ; UNASSIGNED +0C3A..0C3D; ; UNASSIGNED +0C45; ; UNASSIGNED +0C49; ; UNASSIGNED +0C4E..0C54; ; UNASSIGNED +0C57..0C5F; ; UNASSIGNED +0C62..0C65; ; UNASSIGNED +0C70..0C81; ; UNASSIGNED +0C84; ; UNASSIGNED +0C8D; ; UNASSIGNED +0C91; ; UNASSIGNED +0CA9; ; UNASSIGNED +0CB4; ; UNASSIGNED +0CBA..0CBD; ; UNASSIGNED +0CC5; ; UNASSIGNED +0CC9; ; UNASSIGNED +0CCE..0CD4; ; UNASSIGNED +0CD7..0CDD; ; UNASSIGNED +0CDF; ; UNASSIGNED +0CE2..0CE5; ; UNASSIGNED +0CF0..0D01; ; UNASSIGNED +0D04; ; UNASSIGNED +0D0D; ; UNASSIGNED +0D11; ; UNASSIGNED +0D29; ; UNASSIGNED +0D3A..0D3D; ; UNASSIGNED +0D44..0D45; ; UNASSIGNED +0D49; ; UNASSIGNED +0D4E..0D56; ; UNASSIGNED +0D58..0D5F; ; UNASSIGNED +0D62..0D65; ; UNASSIGNED +0D70..0D81; ; UNASSIGNED +0D84; ; UNASSIGNED +0D97..0D99; ; UNASSIGNED +0DB2; ; UNASSIGNED +0DBC; ; UNASSIGNED +0DBE..0DBF; ; UNASSIGNED +0DC7..0DC9; ; UNASSIGNED +0DCB..0DCE; ; UNASSIGNED +0DD5; ; UNASSIGNED +0DD7; ; UNASSIGNED +0DE0..0DF1; ; UNASSIGNED +0DF5..0E00; ; UNASSIGNED +0E3B..0E3E; ; UNASSIGNED +0E5C..0E80; ; UNASSIGNED +0E83; ; UNASSIGNED +0E85..0E86; ; UNASSIGNED +0E89; ; UNASSIGNED +0E8B..0E8C; ; UNASSIGNED +0E8E..0E93; ; UNASSIGNED +0E98; ; UNASSIGNED +0EA0; ; UNASSIGNED +0EA4; ; UNASSIGNED +0EA6; ; UNASSIGNED +0EA8..0EA9; ; UNASSIGNED +0EAC; ; UNASSIGNED +0EBA; ; UNASSIGNED +0EBE..0EBF; ; UNASSIGNED +0EC5; ; UNASSIGNED +0EC7; ; UNASSIGNED +0ECE..0ECF; ; UNASSIGNED +0EDA..0EDB; ; UNASSIGNED +0EDE..0EFF; ; UNASSIGNED +0F48; ; UNASSIGNED +0F6B..0F70; ; UNASSIGNED +0F8C..0F8F; ; UNASSIGNED +0F98; ; UNASSIGNED +0FBD; ; UNASSIGNED +0FCD..0FCE; ; UNASSIGNED +0FD0..0FFF; ; UNASSIGNED +1022; ; UNASSIGNED +1028; ; UNASSIGNED +102B; ; UNASSIGNED +1033..1035; ; UNASSIGNED +103A..103F; ; UNASSIGNED +105A..109F; ; UNASSIGNED +10C6..10CF; ; UNASSIGNED +10F9..10FA; ; UNASSIGNED +10FC..10FF; ; UNASSIGNED +115A..115E; ; UNASSIGNED +11A3..11A7; ; UNASSIGNED +11FA..11FF; ; UNASSIGNED +1207; ; UNASSIGNED +1247; ; UNASSIGNED +1249; ; UNASSIGNED +124E..124F; ; UNASSIGNED +1257; ; UNASSIGNED +1259; ; UNASSIGNED +125E..125F; ; UNASSIGNED +1287; ; UNASSIGNED +1289; ; UNASSIGNED +128E..128F; ; UNASSIGNED +12AF; ; UNASSIGNED +12B1; ; UNASSIGNED +12B6..12B7; ; UNASSIGNED +12BF; ; UNASSIGNED +12C1; ; UNASSIGNED +12C6..12C7; ; UNASSIGNED +12CF; ; UNASSIGNED +12D7; ; UNASSIGNED +12EF; ; UNASSIGNED +130F; ; UNASSIGNED +1311; ; UNASSIGNED +1316..1317; ; UNASSIGNED +131F; ; UNASSIGNED +1347; ; UNASSIGNED +135B..1360; ; UNASSIGNED +137D..139F; ; UNASSIGNED +13F5..1400; ; UNASSIGNED +1677..167F; ; UNASSIGNED +169D..169F; ; UNASSIGNED +16F1..16FF; ; UNASSIGNED +170D; ; UNASSIGNED +1715..171F; ; UNASSIGNED +1737..173F; ; UNASSIGNED +1754..175F; ; UNASSIGNED +176D; ; UNASSIGNED +1771; ; UNASSIGNED +1774..177F; ; UNASSIGNED +17DD..17DF; ; UNASSIGNED +17EA..17FF; ; UNASSIGNED +180F; ; UNASSIGNED +181A..181F; ; UNASSIGNED +1878..187F; ; UNASSIGNED +18AA..1DFF; ; UNASSIGNED +1E9C..1E9F; ; UNASSIGNED +1EFA..1EFF; ; UNASSIGNED +1F16..1F17; ; UNASSIGNED +1F1E..1F1F; ; UNASSIGNED +1F46..1F47; ; UNASSIGNED +1F4E..1F4F; ; UNASSIGNED +1F58; ; UNASSIGNED +1F5A; ; UNASSIGNED +1F5C; ; UNASSIGNED +1F5E; ; UNASSIGNED +1F7E..1F7F; ; UNASSIGNED +1FB5; ; UNASSIGNED +1FC5; ; UNASSIGNED +1FD4..1FD5; ; UNASSIGNED +1FDC; ; UNASSIGNED +1FF0..1FF1; ; UNASSIGNED +1FF5; ; UNASSIGNED +1FFF; ; UNASSIGNED +2053..2056; ; UNASSIGNED +2058..205E; ; UNASSIGNED +2064..2069; ; UNASSIGNED +2072..2073; ; UNASSIGNED +208F..209F; ; UNASSIGNED +20B2..20CF; ; UNASSIGNED +20EB..20FF; ; UNASSIGNED +213B..213C; ; UNASSIGNED +214C..2152; ; UNASSIGNED +2184..218F; ; UNASSIGNED +23CF..23FF; ; UNASSIGNED +2427..243F; ; UNASSIGNED +244B..245F; ; UNASSIGNED +24FF; ; UNASSIGNED +2614..2615; ; UNASSIGNED +2618; ; UNASSIGNED +267E..267F; ; UNASSIGNED +268A..2700; ; UNASSIGNED +2705; ; UNASSIGNED +270A..270B; ; UNASSIGNED +2728; ; UNASSIGNED +274C; ; UNASSIGNED +274E; ; UNASSIGNED +2753..2755; ; UNASSIGNED +2757; ; UNASSIGNED +275F..2760; ; UNASSIGNED +2795..2797; ; UNASSIGNED +27B0; ; UNASSIGNED +27BF..27CF; ; UNASSIGNED +27EC..27EF; ; UNASSIGNED +2B00..2E7F; ; UNASSIGNED +2E9A; ; UNASSIGNED +2EF4..2EFF; ; UNASSIGNED +2FD6..2FEF; ; UNASSIGNED +2FFC..2FFF; ; UNASSIGNED +3040; ; UNASSIGNED +3097..3098; ; UNASSIGNED +3100..3104; ; UNASSIGNED +312D..3130; ; UNASSIGNED +318F; ; UNASSIGNED +31B8..31EF; ; UNASSIGNED +321D..321F; ; UNASSIGNED +3244..3250; ; UNASSIGNED +327C..327E; ; UNASSIGNED +32CC..32CF; ; UNASSIGNED +32FF; ; UNASSIGNED +3377..337A; ; UNASSIGNED +33DE..33DF; ; UNASSIGNED +33FF; ; UNASSIGNED +4DB6..4DFF; ; UNASSIGNED +9FA6..9FFF; ; UNASSIGNED +A48D..A48F; ; UNASSIGNED +A4C7..ABFF; ; UNASSIGNED +D7A4..D7FF; ; UNASSIGNED +FA2E..FA2F; ; UNASSIGNED +FA6B..FAFF; ; UNASSIGNED +FB07..FB12; ; UNASSIGNED +FB18..FB1C; ; UNASSIGNED +FB37; ; UNASSIGNED +FB3D; ; UNASSIGNED +FB3F; ; UNASSIGNED +FB42; ; UNASSIGNED +FB45; ; UNASSIGNED +FBB2..FBD2; ; UNASSIGNED +FD40..FD4F; ; UNASSIGNED +FD90..FD91; ; UNASSIGNED +FDC8..FDCF; ; UNASSIGNED +FDFD..FDFF; ; UNASSIGNED +FE10..FE1F; ; UNASSIGNED +FE24..FE2F; ; UNASSIGNED +FE47..FE48; ; UNASSIGNED +FE53; ; UNASSIGNED +FE67; ; UNASSIGNED +FE6C..FE6F; ; UNASSIGNED +FE75; ; UNASSIGNED +FEFD..FEFE; ; UNASSIGNED +FF00; ; UNASSIGNED +FFBF..FFC1; ; UNASSIGNED +FFC8..FFC9; ; UNASSIGNED +FFD0..FFD1; ; UNASSIGNED +FFD8..FFD9; ; UNASSIGNED +FFDD..FFDF; ; UNASSIGNED +FFE7; ; UNASSIGNED +FFEF..FFF8; ; UNASSIGNED +10000..102FF; ; UNASSIGNED +1031F; ; UNASSIGNED +10324..1032F; ; UNASSIGNED +1034B..103FF; ; UNASSIGNED +10426..10427; ; UNASSIGNED +1044E..1CFFF; ; UNASSIGNED +1D0F6..1D0FF; ; UNASSIGNED +1D127..1D129; ; UNASSIGNED +1D1DE..1D3FF; ; UNASSIGNED +1D455; ; UNASSIGNED +1D49D; ; UNASSIGNED +1D4A0..1D4A1; ; UNASSIGNED +1D4A3..1D4A4; ; UNASSIGNED +1D4A7..1D4A8; ; UNASSIGNED +1D4AD; ; UNASSIGNED +1D4BA; ; UNASSIGNED +1D4BC; ; UNASSIGNED +1D4C1; ; UNASSIGNED +1D4C4; ; UNASSIGNED +1D506; ; UNASSIGNED +1D50B..1D50C; ; UNASSIGNED +1D515; ; UNASSIGNED +1D51D; ; UNASSIGNED +1D53A; ; UNASSIGNED +1D53F; ; UNASSIGNED +1D545; ; UNASSIGNED +1D547..1D549; ; UNASSIGNED +1D551; ; UNASSIGNED +1D6A4..1D6A7; ; UNASSIGNED +1D7CA..1D7CD; ; UNASSIGNED +1D800..1FFFD; ; UNASSIGNED +2A6D7..2F7FF; ; UNASSIGNED +2FA1E..2FFFD; ; UNASSIGNED +30000..3FFFD; ; UNASSIGNED +40000..4FFFD; ; UNASSIGNED +50000..5FFFD; ; UNASSIGNED +60000..6FFFD; ; UNASSIGNED +70000..7FFFD; ; UNASSIGNED +80000..8FFFD; ; UNASSIGNED +90000..9FFFD; ; UNASSIGNED +A0000..AFFFD; ; UNASSIGNED +B0000..BFFFD; ; UNASSIGNED +C0000..CFFFD; ; UNASSIGNED +D0000..DFFFD; ; UNASSIGNED +E0000; ; UNASSIGNED +E0002..E001F; ; UNASSIGNED +E0080..EFFFD; ; UNASSIGNED + +# Total code points 3653 + +# This table contains code points from Table B.1 from RFC 3454 + +00AD; ; MAP +034F; ; MAP +1806; ; MAP +180B; ; MAP +180C; ; MAP +180D; ; MAP +200B; ; MAP +200C; ; MAP +200D; ; MAP +2060; ; MAP +FE00; ; MAP +FE01; ; MAP +FE02; ; MAP +FE03; ; MAP +FE04; ; MAP +FE05; ; MAP +FE06; ; MAP +FE07; ; MAP +FE08; ; MAP +FE09; ; MAP +FE0A; ; MAP +FE0B; ; MAP +FE0C; ; MAP +FE0D; ; MAP +FE0E; ; MAP +FE0F; ; MAP +FEFF; ; MAP + +# Total code points 27 + +# code points from Table C.1.2 + +00A0; ; PROHIBITED +1680; ; PROHIBITED +2000; ; PROHIBITED +2001; ; PROHIBITED +2002; ; PROHIBITED +2003; ; PROHIBITED +2004; ; PROHIBITED +2005; ; PROHIBITED +2006; ; PROHIBITED +2007; ; PROHIBITED +2008; ; PROHIBITED +2009; ; PROHIBITED +200A; ; PROHIBITED +200B; ; PROHIBITED +202F; ; PROHIBITED +205F; ; PROHIBITED +3000; ; PROHIBITED + +# Total code points 17 + +# code points from Table C.2.2 + +0080..009F; ; PROHIBITED +06DD; ; PROHIBITED +070F; ; PROHIBITED +180E; ; PROHIBITED +200C; ; PROHIBITED +200D; ; PROHIBITED +2028; ; PROHIBITED +2029; ; PROHIBITED +2060; ; PROHIBITED +2061; ; PROHIBITED +2062; ; PROHIBITED +2063; ; PROHIBITED +206A..206F; ; PROHIBITED +FEFF; ; PROHIBITED +FFF9..FFFC; ; PROHIBITED +1D173..1D17A; ; PROHIBITED + +# Total code points 30 + +# code points from Table C.3 + +E000..F8FF; ; PROHIBITED +F0000..FFFFD; ; PROHIBITED +100000..10FFFD; ; PROHIBITED + +# Total code points 2051 + +# code points from Table C.4 + +FDD0..FDEF; ; PROHIBITED +FFFE..FFFF; ; PROHIBITED +1FFFE..1FFFF; ; PROHIBITED +2FFFE..2FFFF; ; PROHIBITED +3FFFE..3FFFF; ; PROHIBITED +4FFFE..4FFFF; ; PROHIBITED +5FFFE..5FFFF; ; PROHIBITED +6FFFE..6FFFF; ; PROHIBITED +7FFFE..7FFFF; ; PROHIBITED +8FFFE..8FFFF; ; PROHIBITED +9FFFE..9FFFF; ; PROHIBITED +AFFFE..AFFFF; ; PROHIBITED +BFFFE..BFFFF; ; PROHIBITED +CFFFE..CFFFF; ; PROHIBITED +DFFFE..DFFFF; ; PROHIBITED +EFFFE..EFFFF; ; PROHIBITED +FFFFE..FFFFF; ; PROHIBITED +10FFFE..10FFFF; ; PROHIBITED + +# Total code points 18 + +# code points from Table C.5 + +D800..DFFF; ; PROHIBITED + +# Total code points 0 + +# code points from Table C.6 + +FFF9; ; PROHIBITED +FFFA; ; PROHIBITED +FFFB; ; PROHIBITED +FFFC; ; PROHIBITED +FFFD; ; PROHIBITED + +# Total code points 5 + +# code points from Table C.7 + +2FF0..2FFB; ; PROHIBITED + +# Total code points 1 + +# code points from Table C.8 + +0340; ; PROHIBITED +0341; ; PROHIBITED +200E; ; PROHIBITED +200F; ; PROHIBITED +202A; ; PROHIBITED +202B; ; PROHIBITED +202C; ; PROHIBITED +202D; ; PROHIBITED +202E; ; PROHIBITED +206A; ; PROHIBITED +206B; ; PROHIBITED +206C; ; PROHIBITED +206D; ; PROHIBITED +206E; ; PROHIBITED +206F; ; PROHIBITED + +# Total code points 15 + +# code points from Table C.9 + +E0001; ; PROHIBITED +E0020..E007F; ; PROHIBITED + +# Total code points 82 + diff --git a/icuSources/test/testdata/nfs4_mixed_prep_s.txt b/icuSources/test/testdata/nfs4_mixed_prep_s.txt new file mode 100644 index 00000000..0ed83d5d --- /dev/null +++ b/icuSources/test/testdata/nfs4_mixed_prep_s.txt @@ -0,0 +1,1945 @@ +################### +# Copyright (C) 2003, International Business Machines +# Corporation and others. All Rights Reserved. +################### + +################### +# WARNING: This table is generated by filterRFC3454.pl tool. DO NOT EDIT +################### + +# This table contains code points from Table A.1 from RFC 3454 + +0221; ; UNASSIGNED +0234..024F; ; UNASSIGNED +02AE..02AF; ; UNASSIGNED +02EF..02FF; ; UNASSIGNED +0350..035F; ; UNASSIGNED +0370..0373; ; UNASSIGNED +0376..0379; ; UNASSIGNED +037B..037D; ; UNASSIGNED +037F..0383; ; UNASSIGNED +038B; ; UNASSIGNED +038D; ; UNASSIGNED +03A2; ; UNASSIGNED +03CF; ; UNASSIGNED +03F7..03FF; ; UNASSIGNED +0487; ; UNASSIGNED +04CF; ; UNASSIGNED +04F6..04F7; ; UNASSIGNED +04FA..04FF; ; UNASSIGNED +0510..0530; ; UNASSIGNED +0557..0558; ; UNASSIGNED +0560; ; UNASSIGNED +0588; ; UNASSIGNED +058B..0590; ; UNASSIGNED +05A2; ; UNASSIGNED +05BA; ; UNASSIGNED +05C5..05CF; ; UNASSIGNED +05EB..05EF; ; UNASSIGNED +05F5..060B; ; UNASSIGNED +060D..061A; ; UNASSIGNED +061C..061E; ; UNASSIGNED +0620; ; UNASSIGNED +063B..063F; ; UNASSIGNED +0656..065F; ; UNASSIGNED +06EE..06EF; ; UNASSIGNED +06FF; ; UNASSIGNED +070E; ; UNASSIGNED +072D..072F; ; UNASSIGNED +074B..077F; ; UNASSIGNED +07B2..0900; ; UNASSIGNED +0904; ; UNASSIGNED +093A..093B; ; UNASSIGNED +094E..094F; ; UNASSIGNED +0955..0957; ; UNASSIGNED +0971..0980; ; UNASSIGNED +0984; ; UNASSIGNED +098D..098E; ; UNASSIGNED +0991..0992; ; UNASSIGNED +09A9; ; UNASSIGNED +09B1; ; UNASSIGNED +09B3..09B5; ; UNASSIGNED +09BA..09BB; ; UNASSIGNED +09BD; ; UNASSIGNED +09C5..09C6; ; UNASSIGNED +09C9..09CA; ; UNASSIGNED +09CE..09D6; ; UNASSIGNED +09D8..09DB; ; UNASSIGNED +09DE; ; UNASSIGNED +09E4..09E5; ; UNASSIGNED +09FB..0A01; ; UNASSIGNED +0A03..0A04; ; UNASSIGNED +0A0B..0A0E; ; UNASSIGNED +0A11..0A12; ; UNASSIGNED +0A29; ; UNASSIGNED +0A31; ; UNASSIGNED +0A34; ; UNASSIGNED +0A37; ; UNASSIGNED +0A3A..0A3B; ; UNASSIGNED +0A3D; ; UNASSIGNED +0A43..0A46; ; UNASSIGNED +0A49..0A4A; ; UNASSIGNED +0A4E..0A58; ; UNASSIGNED +0A5D; ; UNASSIGNED +0A5F..0A65; ; UNASSIGNED +0A75..0A80; ; UNASSIGNED +0A84; ; UNASSIGNED +0A8C; ; UNASSIGNED +0A8E; ; UNASSIGNED +0A92; ; UNASSIGNED +0AA9; ; UNASSIGNED +0AB1; ; UNASSIGNED +0AB4; ; UNASSIGNED +0ABA..0ABB; ; UNASSIGNED +0AC6; ; UNASSIGNED +0ACA; ; UNASSIGNED +0ACE..0ACF; ; UNASSIGNED +0AD1..0ADF; ; UNASSIGNED +0AE1..0AE5; ; UNASSIGNED +0AF0..0B00; ; UNASSIGNED +0B04; ; UNASSIGNED +0B0D..0B0E; ; UNASSIGNED +0B11..0B12; ; UNASSIGNED +0B29; ; UNASSIGNED +0B31; ; UNASSIGNED +0B34..0B35; ; UNASSIGNED +0B3A..0B3B; ; UNASSIGNED +0B44..0B46; ; UNASSIGNED +0B49..0B4A; ; UNASSIGNED +0B4E..0B55; ; UNASSIGNED +0B58..0B5B; ; UNASSIGNED +0B5E; ; UNASSIGNED +0B62..0B65; ; UNASSIGNED +0B71..0B81; ; UNASSIGNED +0B84; ; UNASSIGNED +0B8B..0B8D; ; UNASSIGNED +0B91; ; UNASSIGNED +0B96..0B98; ; UNASSIGNED +0B9B; ; UNASSIGNED +0B9D; ; UNASSIGNED +0BA0..0BA2; ; UNASSIGNED +0BA5..0BA7; ; UNASSIGNED +0BAB..0BAD; ; UNASSIGNED +0BB6; ; UNASSIGNED +0BBA..0BBD; ; UNASSIGNED +0BC3..0BC5; ; UNASSIGNED +0BC9; ; UNASSIGNED +0BCE..0BD6; ; UNASSIGNED +0BD8..0BE6; ; UNASSIGNED +0BF3..0C00; ; UNASSIGNED +0C04; ; UNASSIGNED +0C0D; ; UNASSIGNED +0C11; ; UNASSIGNED +0C29; ; UNASSIGNED +0C34; ; UNASSIGNED +0C3A..0C3D; ; UNASSIGNED +0C45; ; UNASSIGNED +0C49; ; UNASSIGNED +0C4E..0C54; ; UNASSIGNED +0C57..0C5F; ; UNASSIGNED +0C62..0C65; ; UNASSIGNED +0C70..0C81; ; UNASSIGNED +0C84; ; UNASSIGNED +0C8D; ; UNASSIGNED +0C91; ; UNASSIGNED +0CA9; ; UNASSIGNED +0CB4; ; UNASSIGNED +0CBA..0CBD; ; UNASSIGNED +0CC5; ; UNASSIGNED +0CC9; ; UNASSIGNED +0CCE..0CD4; ; UNASSIGNED +0CD7..0CDD; ; UNASSIGNED +0CDF; ; UNASSIGNED +0CE2..0CE5; ; UNASSIGNED +0CF0..0D01; ; UNASSIGNED +0D04; ; UNASSIGNED +0D0D; ; UNASSIGNED +0D11; ; UNASSIGNED +0D29; ; UNASSIGNED +0D3A..0D3D; ; UNASSIGNED +0D44..0D45; ; UNASSIGNED +0D49; ; UNASSIGNED +0D4E..0D56; ; UNASSIGNED +0D58..0D5F; ; UNASSIGNED +0D62..0D65; ; UNASSIGNED +0D70..0D81; ; UNASSIGNED +0D84; ; UNASSIGNED +0D97..0D99; ; UNASSIGNED +0DB2; ; UNASSIGNED +0DBC; ; UNASSIGNED +0DBE..0DBF; ; UNASSIGNED +0DC7..0DC9; ; UNASSIGNED +0DCB..0DCE; ; UNASSIGNED +0DD5; ; UNASSIGNED +0DD7; ; UNASSIGNED +0DE0..0DF1; ; UNASSIGNED +0DF5..0E00; ; UNASSIGNED +0E3B..0E3E; ; UNASSIGNED +0E5C..0E80; ; UNASSIGNED +0E83; ; UNASSIGNED +0E85..0E86; ; UNASSIGNED +0E89; ; UNASSIGNED +0E8B..0E8C; ; UNASSIGNED +0E8E..0E93; ; UNASSIGNED +0E98; ; UNASSIGNED +0EA0; ; UNASSIGNED +0EA4; ; UNASSIGNED +0EA6; ; UNASSIGNED +0EA8..0EA9; ; UNASSIGNED +0EAC; ; UNASSIGNED +0EBA; ; UNASSIGNED +0EBE..0EBF; ; UNASSIGNED +0EC5; ; UNASSIGNED +0EC7; ; UNASSIGNED +0ECE..0ECF; ; UNASSIGNED +0EDA..0EDB; ; UNASSIGNED +0EDE..0EFF; ; UNASSIGNED +0F48; ; UNASSIGNED +0F6B..0F70; ; UNASSIGNED +0F8C..0F8F; ; UNASSIGNED +0F98; ; UNASSIGNED +0FBD; ; UNASSIGNED +0FCD..0FCE; ; UNASSIGNED +0FD0..0FFF; ; UNASSIGNED +1022; ; UNASSIGNED +1028; ; UNASSIGNED +102B; ; UNASSIGNED +1033..1035; ; UNASSIGNED +103A..103F; ; UNASSIGNED +105A..109F; ; UNASSIGNED +10C6..10CF; ; UNASSIGNED +10F9..10FA; ; UNASSIGNED +10FC..10FF; ; UNASSIGNED +115A..115E; ; UNASSIGNED +11A3..11A7; ; UNASSIGNED +11FA..11FF; ; UNASSIGNED +1207; ; UNASSIGNED +1247; ; UNASSIGNED +1249; ; UNASSIGNED +124E..124F; ; UNASSIGNED +1257; ; UNASSIGNED +1259; ; UNASSIGNED +125E..125F; ; UNASSIGNED +1287; ; UNASSIGNED +1289; ; UNASSIGNED +128E..128F; ; UNASSIGNED +12AF; ; UNASSIGNED +12B1; ; UNASSIGNED +12B6..12B7; ; UNASSIGNED +12BF; ; UNASSIGNED +12C1; ; UNASSIGNED +12C6..12C7; ; UNASSIGNED +12CF; ; UNASSIGNED +12D7; ; UNASSIGNED +12EF; ; UNASSIGNED +130F; ; UNASSIGNED +1311; ; UNASSIGNED +1316..1317; ; UNASSIGNED +131F; ; UNASSIGNED +1347; ; UNASSIGNED +135B..1360; ; UNASSIGNED +137D..139F; ; UNASSIGNED +13F5..1400; ; UNASSIGNED +1677..167F; ; UNASSIGNED +169D..169F; ; UNASSIGNED +16F1..16FF; ; UNASSIGNED +170D; ; UNASSIGNED +1715..171F; ; UNASSIGNED +1737..173F; ; UNASSIGNED +1754..175F; ; UNASSIGNED +176D; ; UNASSIGNED +1771; ; UNASSIGNED +1774..177F; ; UNASSIGNED +17DD..17DF; ; UNASSIGNED +17EA..17FF; ; UNASSIGNED +180F; ; UNASSIGNED +181A..181F; ; UNASSIGNED +1878..187F; ; UNASSIGNED +18AA..1DFF; ; UNASSIGNED +1E9C..1E9F; ; UNASSIGNED +1EFA..1EFF; ; UNASSIGNED +1F16..1F17; ; UNASSIGNED +1F1E..1F1F; ; UNASSIGNED +1F46..1F47; ; UNASSIGNED +1F4E..1F4F; ; UNASSIGNED +1F58; ; UNASSIGNED +1F5A; ; UNASSIGNED +1F5C; ; UNASSIGNED +1F5E; ; UNASSIGNED +1F7E..1F7F; ; UNASSIGNED +1FB5; ; UNASSIGNED +1FC5; ; UNASSIGNED +1FD4..1FD5; ; UNASSIGNED +1FDC; ; UNASSIGNED +1FF0..1FF1; ; UNASSIGNED +1FF5; ; UNASSIGNED +1FFF; ; UNASSIGNED +2053..2056; ; UNASSIGNED +2058..205E; ; UNASSIGNED +2064..2069; ; UNASSIGNED +2072..2073; ; UNASSIGNED +208F..209F; ; UNASSIGNED +20B2..20CF; ; UNASSIGNED +20EB..20FF; ; UNASSIGNED +213B..213C; ; UNASSIGNED +214C..2152; ; UNASSIGNED +2184..218F; ; UNASSIGNED +23CF..23FF; ; UNASSIGNED +2427..243F; ; UNASSIGNED +244B..245F; ; UNASSIGNED +24FF; ; UNASSIGNED +2614..2615; ; UNASSIGNED +2618; ; UNASSIGNED +267E..267F; ; UNASSIGNED +268A..2700; ; UNASSIGNED +2705; ; UNASSIGNED +270A..270B; ; UNASSIGNED +2728; ; UNASSIGNED +274C; ; UNASSIGNED +274E; ; UNASSIGNED +2753..2755; ; UNASSIGNED +2757; ; UNASSIGNED +275F..2760; ; UNASSIGNED +2795..2797; ; UNASSIGNED +27B0; ; UNASSIGNED +27BF..27CF; ; UNASSIGNED +27EC..27EF; ; UNASSIGNED +2B00..2E7F; ; UNASSIGNED +2E9A; ; UNASSIGNED +2EF4..2EFF; ; UNASSIGNED +2FD6..2FEF; ; UNASSIGNED +2FFC..2FFF; ; UNASSIGNED +3040; ; UNASSIGNED +3097..3098; ; UNASSIGNED +3100..3104; ; UNASSIGNED +312D..3130; ; UNASSIGNED +318F; ; UNASSIGNED +31B8..31EF; ; UNASSIGNED +321D..321F; ; UNASSIGNED +3244..3250; ; UNASSIGNED +327C..327E; ; UNASSIGNED +32CC..32CF; ; UNASSIGNED +32FF; ; UNASSIGNED +3377..337A; ; UNASSIGNED +33DE..33DF; ; UNASSIGNED +33FF; ; UNASSIGNED +4DB6..4DFF; ; UNASSIGNED +9FA6..9FFF; ; UNASSIGNED +A48D..A48F; ; UNASSIGNED +A4C7..ABFF; ; UNASSIGNED +D7A4..D7FF; ; UNASSIGNED +FA2E..FA2F; ; UNASSIGNED +FA6B..FAFF; ; UNASSIGNED +FB07..FB12; ; UNASSIGNED +FB18..FB1C; ; UNASSIGNED +FB37; ; UNASSIGNED +FB3D; ; UNASSIGNED +FB3F; ; UNASSIGNED +FB42; ; UNASSIGNED +FB45; ; UNASSIGNED +FBB2..FBD2; ; UNASSIGNED +FD40..FD4F; ; UNASSIGNED +FD90..FD91; ; UNASSIGNED +FDC8..FDCF; ; UNASSIGNED +FDFD..FDFF; ; UNASSIGNED +FE10..FE1F; ; UNASSIGNED +FE24..FE2F; ; UNASSIGNED +FE47..FE48; ; UNASSIGNED +FE53; ; UNASSIGNED +FE67; ; UNASSIGNED +FE6C..FE6F; ; UNASSIGNED +FE75; ; UNASSIGNED +FEFD..FEFE; ; UNASSIGNED +FF00; ; UNASSIGNED +FFBF..FFC1; ; UNASSIGNED +FFC8..FFC9; ; UNASSIGNED +FFD0..FFD1; ; UNASSIGNED +FFD8..FFD9; ; UNASSIGNED +FFDD..FFDF; ; UNASSIGNED +FFE7; ; UNASSIGNED +FFEF..FFF8; ; UNASSIGNED +10000..102FF; ; UNASSIGNED +1031F; ; UNASSIGNED +10324..1032F; ; UNASSIGNED +1034B..103FF; ; UNASSIGNED +10426..10427; ; UNASSIGNED +1044E..1CFFF; ; UNASSIGNED +1D0F6..1D0FF; ; UNASSIGNED +1D127..1D129; ; UNASSIGNED +1D1DE..1D3FF; ; UNASSIGNED +1D455; ; UNASSIGNED +1D49D; ; UNASSIGNED +1D4A0..1D4A1; ; UNASSIGNED +1D4A3..1D4A4; ; UNASSIGNED +1D4A7..1D4A8; ; UNASSIGNED +1D4AD; ; UNASSIGNED +1D4BA; ; UNASSIGNED +1D4BC; ; UNASSIGNED +1D4C1; ; UNASSIGNED +1D4C4; ; UNASSIGNED +1D506; ; UNASSIGNED +1D50B..1D50C; ; UNASSIGNED +1D515; ; UNASSIGNED +1D51D; ; UNASSIGNED +1D53A; ; UNASSIGNED +1D53F; ; UNASSIGNED +1D545; ; UNASSIGNED +1D547..1D549; ; UNASSIGNED +1D551; ; UNASSIGNED +1D6A4..1D6A7; ; UNASSIGNED +1D7CA..1D7CD; ; UNASSIGNED +1D800..1FFFD; ; UNASSIGNED +2A6D7..2F7FF; ; UNASSIGNED +2FA1E..2FFFD; ; UNASSIGNED +30000..3FFFD; ; UNASSIGNED +40000..4FFFD; ; UNASSIGNED +50000..5FFFD; ; UNASSIGNED +60000..6FFFD; ; UNASSIGNED +70000..7FFFD; ; UNASSIGNED +80000..8FFFD; ; UNASSIGNED +90000..9FFFD; ; UNASSIGNED +A0000..AFFFD; ; UNASSIGNED +B0000..BFFFD; ; UNASSIGNED +C0000..CFFFD; ; UNASSIGNED +D0000..DFFFD; ; UNASSIGNED +E0000; ; UNASSIGNED +E0002..E001F; ; UNASSIGNED +E0080..EFFFD; ; UNASSIGNED + +# Total code points 3653 + +# This table contains code points from Table B.1 from RFC 3454 + +00AD; ; MAP +034F; ; MAP +1806; ; MAP +180B; ; MAP +180C; ; MAP +180D; ; MAP +200B; ; MAP +200C; ; MAP +200D; ; MAP +2060; ; MAP +FE00; ; MAP +FE01; ; MAP +FE02; ; MAP +FE03; ; MAP +FE04; ; MAP +FE05; ; MAP +FE06; ; MAP +FE07; ; MAP +FE08; ; MAP +FE09; ; MAP +FE0A; ; MAP +FE0B; ; MAP +FE0C; ; MAP +FE0D; ; MAP +FE0E; ; MAP +FE0F; ; MAP +FEFF; ; MAP + +# Total code points 27 + +################### +# WARNING: This table is generated by filterRFC3454.pl tool. DO NOT EDIT +################### + +# This table contains code points from Table B.2 from RFC 3454 + +0041; 0061; MAP +0042; 0062; MAP +0043; 0063; MAP +0044; 0064; MAP +0045; 0065; MAP +0046; 0066; MAP +0047; 0067; MAP +0048; 0068; MAP +0049; 0069; MAP +004A; 006A; MAP +004B; 006B; MAP +004C; 006C; MAP +004D; 006D; MAP +004E; 006E; MAP +004F; 006F; MAP +0050; 0070; MAP +0051; 0071; MAP +0052; 0072; MAP +0053; 0073; MAP +0054; 0074; MAP +0055; 0075; MAP +0056; 0076; MAP +0057; 0077; MAP +0058; 0078; MAP +0059; 0079; MAP +005A; 007A; MAP +00B5; 03BC; MAP +00C0; 00E0; MAP +00C1; 00E1; MAP +00C2; 00E2; MAP +00C3; 00E3; MAP +00C4; 00E4; MAP +00C5; 00E5; MAP +00C6; 00E6; MAP +00C7; 00E7; MAP +00C8; 00E8; MAP +00C9; 00E9; MAP +00CA; 00EA; MAP +00CB; 00EB; MAP +00CC; 00EC; MAP +00CD; 00ED; MAP +00CE; 00EE; MAP +00CF; 00EF; MAP +00D0; 00F0; MAP +00D1; 00F1; MAP +00D2; 00F2; MAP +00D3; 00F3; MAP +00D4; 00F4; MAP +00D5; 00F5; MAP +00D6; 00F6; MAP +00D8; 00F8; MAP +00D9; 00F9; MAP +00DA; 00FA; MAP +00DB; 00FB; MAP +00DC; 00FC; MAP +00DD; 00FD; MAP +00DE; 00FE; MAP +00DF; 0073 0073; MAP +0100; 0101; MAP +0102; 0103; MAP +0104; 0105; MAP +0106; 0107; MAP +0108; 0109; MAP +010A; 010B; MAP +010C; 010D; MAP +010E; 010F; MAP +0110; 0111; MAP +0112; 0113; MAP +0114; 0115; MAP +0116; 0117; MAP +0118; 0119; MAP +011A; 011B; MAP +011C; 011D; MAP +011E; 011F; MAP +0120; 0121; MAP +0122; 0123; MAP +0124; 0125; MAP +0126; 0127; MAP +0128; 0129; MAP +012A; 012B; MAP +012C; 012D; MAP +012E; 012F; MAP +0130; 0069 0307; MAP +0132; 0133; MAP +0134; 0135; MAP +0136; 0137; MAP +0139; 013A; MAP +013B; 013C; MAP +013D; 013E; MAP +013F; 0140; MAP +0141; 0142; MAP +0143; 0144; MAP +0145; 0146; MAP +0147; 0148; MAP +0149; 02BC 006E; MAP +014A; 014B; MAP +014C; 014D; MAP +014E; 014F; MAP +0150; 0151; MAP +0152; 0153; MAP +0154; 0155; MAP +0156; 0157; MAP +0158; 0159; MAP +015A; 015B; MAP +015C; 015D; MAP +015E; 015F; MAP +0160; 0161; MAP +0162; 0163; MAP +0164; 0165; MAP +0166; 0167; MAP +0168; 0169; MAP +016A; 016B; MAP +016C; 016D; MAP +016E; 016F; MAP +0170; 0171; MAP +0172; 0173; MAP +0174; 0175; MAP +0176; 0177; MAP +0178; 00FF; MAP +0179; 017A; MAP +017B; 017C; MAP +017D; 017E; MAP +017F; 0073; MAP +0181; 0253; MAP +0182; 0183; MAP +0184; 0185; MAP +0186; 0254; MAP +0187; 0188; MAP +0189; 0256; MAP +018A; 0257; MAP +018B; 018C; MAP +018E; 01DD; MAP +018F; 0259; MAP +0190; 025B; MAP +0191; 0192; MAP +0193; 0260; MAP +0194; 0263; MAP +0196; 0269; MAP +0197; 0268; MAP +0198; 0199; MAP +019C; 026F; MAP +019D; 0272; MAP +019F; 0275; MAP +01A0; 01A1; MAP +01A2; 01A3; MAP +01A4; 01A5; MAP +01A6; 0280; MAP +01A7; 01A8; MAP +01A9; 0283; MAP +01AC; 01AD; MAP +01AE; 0288; MAP +01AF; 01B0; MAP +01B1; 028A; MAP +01B2; 028B; MAP +01B3; 01B4; MAP +01B5; 01B6; MAP +01B7; 0292; MAP +01B8; 01B9; MAP +01BC; 01BD; MAP +01C4; 01C6; MAP +01C5; 01C6; MAP +01C7; 01C9; MAP +01C8; 01C9; MAP +01CA; 01CC; MAP +01CB; 01CC; MAP +01CD; 01CE; MAP +01CF; 01D0; MAP +01D1; 01D2; MAP +01D3; 01D4; MAP +01D5; 01D6; MAP +01D7; 01D8; MAP +01D9; 01DA; MAP +01DB; 01DC; MAP +01DE; 01DF; MAP +01E0; 01E1; MAP +01E2; 01E3; MAP +01E4; 01E5; MAP +01E6; 01E7; MAP +01E8; 01E9; MAP +01EA; 01EB; MAP +01EC; 01ED; MAP +01EE; 01EF; MAP +01F0; 006A 030C; MAP +01F1; 01F3; MAP +01F2; 01F3; MAP +01F4; 01F5; MAP +01F6; 0195; MAP +01F7; 01BF; MAP +01F8; 01F9; MAP +01FA; 01FB; MAP +01FC; 01FD; MAP +01FE; 01FF; MAP +0200; 0201; MAP +0202; 0203; MAP +0204; 0205; MAP +0206; 0207; MAP +0208; 0209; MAP +020A; 020B; MAP +020C; 020D; MAP +020E; 020F; MAP +0210; 0211; MAP +0212; 0213; MAP +0214; 0215; MAP +0216; 0217; MAP +0218; 0219; MAP +021A; 021B; MAP +021C; 021D; MAP +021E; 021F; MAP +0220; 019E; MAP +0222; 0223; MAP +0224; 0225; MAP +0226; 0227; MAP +0228; 0229; MAP +022A; 022B; MAP +022C; 022D; MAP +022E; 022F; MAP +0230; 0231; MAP +0232; 0233; MAP +0345; 03B9; MAP +037A; 0020 03B9; MAP +0386; 03AC; MAP +0388; 03AD; MAP +0389; 03AE; MAP +038A; 03AF; MAP +038C; 03CC; MAP +038E; 03CD; MAP +038F; 03CE; MAP +0390; 03B9 0308 0301; MAP +0391; 03B1; MAP +0392; 03B2; MAP +0393; 03B3; MAP +0394; 03B4; MAP +0395; 03B5; MAP +0396; 03B6; MAP +0397; 03B7; MAP +0398; 03B8; MAP +0399; 03B9; MAP +039A; 03BA; MAP +039B; 03BB; MAP +039C; 03BC; MAP +039D; 03BD; MAP +039E; 03BE; MAP +039F; 03BF; MAP +03A0; 03C0; MAP +03A1; 03C1; MAP +03A3; 03C3; MAP +03A4; 03C4; MAP +03A5; 03C5; MAP +03A6; 03C6; MAP +03A7; 03C7; MAP +03A8; 03C8; MAP +03A9; 03C9; MAP +03AA; 03CA; MAP +03AB; 03CB; MAP +03B0; 03C5 0308 0301; MAP +03C2; 03C3; MAP +03D0; 03B2; MAP +03D1; 03B8; MAP +03D2; 03C5; MAP +03D3; 03CD; MAP +03D4; 03CB; MAP +03D5; 03C6; MAP +03D6; 03C0; MAP +03D8; 03D9; MAP +03DA; 03DB; MAP +03DC; 03DD; MAP +03DE; 03DF; MAP +03E0; 03E1; MAP +03E2; 03E3; MAP +03E4; 03E5; MAP +03E6; 03E7; MAP +03E8; 03E9; MAP +03EA; 03EB; MAP +03EC; 03ED; MAP +03EE; 03EF; MAP +03F0; 03BA; MAP +03F1; 03C1; MAP +03F2; 03C3; MAP +03F4; 03B8; MAP +03F5; 03B5; MAP +0400; 0450; MAP +0401; 0451; MAP +0402; 0452; MAP +0403; 0453; MAP +0404; 0454; MAP +0405; 0455; MAP +0406; 0456; MAP +0407; 0457; MAP +0408; 0458; MAP +0409; 0459; MAP +040A; 045A; MAP +040B; 045B; MAP +040C; 045C; MAP +040D; 045D; MAP +040E; 045E; MAP +040F; 045F; MAP +0410; 0430; MAP +0411; 0431; MAP +0412; 0432; MAP +0413; 0433; MAP +0414; 0434; MAP +0415; 0435; MAP +0416; 0436; MAP +0417; 0437; MAP +0418; 0438; MAP +0419; 0439; MAP +041A; 043A; MAP +041B; 043B; MAP +041C; 043C; MAP +041D; 043D; MAP +041E; 043E; MAP +041F; 043F; MAP +0420; 0440; MAP +0421; 0441; MAP +0422; 0442; MAP +0423; 0443; MAP +0424; 0444; MAP +0425; 0445; MAP +0426; 0446; MAP +0427; 0447; MAP +0428; 0448; MAP +0429; 0449; MAP +042A; 044A; MAP +042B; 044B; MAP +042C; 044C; MAP +042D; 044D; MAP +042E; 044E; MAP +042F; 044F; MAP +0460; 0461; MAP +0462; 0463; MAP +0464; 0465; MAP +0466; 0467; MAP +0468; 0469; MAP +046A; 046B; MAP +046C; 046D; MAP +046E; 046F; MAP +0470; 0471; MAP +0472; 0473; MAP +0474; 0475; MAP +0476; 0477; MAP +0478; 0479; MAP +047A; 047B; MAP +047C; 047D; MAP +047E; 047F; MAP +0480; 0481; MAP +048A; 048B; MAP +048C; 048D; MAP +048E; 048F; MAP +0490; 0491; MAP +0492; 0493; MAP +0494; 0495; MAP +0496; 0497; MAP +0498; 0499; MAP +049A; 049B; MAP +049C; 049D; MAP +049E; 049F; MAP +04A0; 04A1; MAP +04A2; 04A3; MAP +04A4; 04A5; MAP +04A6; 04A7; MAP +04A8; 04A9; MAP +04AA; 04AB; MAP +04AC; 04AD; MAP +04AE; 04AF; MAP +04B0; 04B1; MAP +04B2; 04B3; MAP +04B4; 04B5; MAP +04B6; 04B7; MAP +04B8; 04B9; MAP +04BA; 04BB; MAP +04BC; 04BD; MAP +04BE; 04BF; MAP +04C1; 04C2; MAP +04C3; 04C4; MAP +04C5; 04C6; MAP +04C7; 04C8; MAP +04C9; 04CA; MAP +04CB; 04CC; MAP +04CD; 04CE; MAP +04D0; 04D1; MAP +04D2; 04D3; MAP +04D4; 04D5; MAP +04D6; 04D7; MAP +04D8; 04D9; MAP +04DA; 04DB; MAP +04DC; 04DD; MAP +04DE; 04DF; MAP +04E0; 04E1; MAP +04E2; 04E3; MAP +04E4; 04E5; MAP +04E6; 04E7; MAP +04E8; 04E9; MAP +04EA; 04EB; MAP +04EC; 04ED; MAP +04EE; 04EF; MAP +04F0; 04F1; MAP +04F2; 04F3; MAP +04F4; 04F5; MAP +04F8; 04F9; MAP +0500; 0501; MAP +0502; 0503; MAP +0504; 0505; MAP +0506; 0507; MAP +0508; 0509; MAP +050A; 050B; MAP +050C; 050D; MAP +050E; 050F; MAP +0531; 0561; MAP +0532; 0562; MAP +0533; 0563; MAP +0534; 0564; MAP +0535; 0565; MAP +0536; 0566; MAP +0537; 0567; MAP +0538; 0568; MAP +0539; 0569; MAP +053A; 056A; MAP +053B; 056B; MAP +053C; 056C; MAP +053D; 056D; MAP +053E; 056E; MAP +053F; 056F; MAP +0540; 0570; MAP +0541; 0571; MAP +0542; 0572; MAP +0543; 0573; MAP +0544; 0574; MAP +0545; 0575; MAP +0546; 0576; MAP +0547; 0577; MAP +0548; 0578; MAP +0549; 0579; MAP +054A; 057A; MAP +054B; 057B; MAP +054C; 057C; MAP +054D; 057D; MAP +054E; 057E; MAP +054F; 057F; MAP +0550; 0580; MAP +0551; 0581; MAP +0552; 0582; MAP +0553; 0583; MAP +0554; 0584; MAP +0555; 0585; MAP +0556; 0586; MAP +0587; 0565 0582; MAP +1E00; 1E01; MAP +1E02; 1E03; MAP +1E04; 1E05; MAP +1E06; 1E07; MAP +1E08; 1E09; MAP +1E0A; 1E0B; MAP +1E0C; 1E0D; MAP +1E0E; 1E0F; MAP +1E10; 1E11; MAP +1E12; 1E13; MAP +1E14; 1E15; MAP +1E16; 1E17; MAP +1E18; 1E19; MAP +1E1A; 1E1B; MAP +1E1C; 1E1D; MAP +1E1E; 1E1F; MAP +1E20; 1E21; MAP +1E22; 1E23; MAP +1E24; 1E25; MAP +1E26; 1E27; MAP +1E28; 1E29; MAP +1E2A; 1E2B; MAP +1E2C; 1E2D; MAP +1E2E; 1E2F; MAP +1E30; 1E31; MAP +1E32; 1E33; MAP +1E34; 1E35; MAP +1E36; 1E37; MAP +1E38; 1E39; MAP +1E3A; 1E3B; MAP +1E3C; 1E3D; MAP +1E3E; 1E3F; MAP +1E40; 1E41; MAP +1E42; 1E43; MAP +1E44; 1E45; MAP +1E46; 1E47; MAP +1E48; 1E49; MAP +1E4A; 1E4B; MAP +1E4C; 1E4D; MAP +1E4E; 1E4F; MAP +1E50; 1E51; MAP +1E52; 1E53; MAP +1E54; 1E55; MAP +1E56; 1E57; MAP +1E58; 1E59; MAP +1E5A; 1E5B; MAP +1E5C; 1E5D; MAP +1E5E; 1E5F; MAP +1E60; 1E61; MAP +1E62; 1E63; MAP +1E64; 1E65; MAP +1E66; 1E67; MAP +1E68; 1E69; MAP +1E6A; 1E6B; MAP +1E6C; 1E6D; MAP +1E6E; 1E6F; MAP +1E70; 1E71; MAP +1E72; 1E73; MAP +1E74; 1E75; MAP +1E76; 1E77; MAP +1E78; 1E79; MAP +1E7A; 1E7B; MAP +1E7C; 1E7D; MAP +1E7E; 1E7F; MAP +1E80; 1E81; MAP +1E82; 1E83; MAP +1E84; 1E85; MAP +1E86; 1E87; MAP +1E88; 1E89; MAP +1E8A; 1E8B; MAP +1E8C; 1E8D; MAP +1E8E; 1E8F; MAP +1E90; 1E91; MAP +1E92; 1E93; MAP +1E94; 1E95; MAP +1E96; 0068 0331; MAP +1E97; 0074 0308; MAP +1E98; 0077 030A; MAP +1E99; 0079 030A; MAP +1E9A; 0061 02BE; MAP +1E9B; 1E61; MAP +1EA0; 1EA1; MAP +1EA2; 1EA3; MAP +1EA4; 1EA5; MAP +1EA6; 1EA7; MAP +1EA8; 1EA9; MAP +1EAA; 1EAB; MAP +1EAC; 1EAD; MAP +1EAE; 1EAF; MAP +1EB0; 1EB1; MAP +1EB2; 1EB3; MAP +1EB4; 1EB5; MAP +1EB6; 1EB7; MAP +1EB8; 1EB9; MAP +1EBA; 1EBB; MAP +1EBC; 1EBD; MAP +1EBE; 1EBF; MAP +1EC0; 1EC1; MAP +1EC2; 1EC3; MAP +1EC4; 1EC5; MAP +1EC6; 1EC7; MAP +1EC8; 1EC9; MAP +1ECA; 1ECB; MAP +1ECC; 1ECD; MAP +1ECE; 1ECF; MAP +1ED0; 1ED1; MAP +1ED2; 1ED3; MAP +1ED4; 1ED5; MAP +1ED6; 1ED7; MAP +1ED8; 1ED9; MAP +1EDA; 1EDB; MAP +1EDC; 1EDD; MAP +1EDE; 1EDF; MAP +1EE0; 1EE1; MAP +1EE2; 1EE3; MAP +1EE4; 1EE5; MAP +1EE6; 1EE7; MAP +1EE8; 1EE9; MAP +1EEA; 1EEB; MAP +1EEC; 1EED; MAP +1EEE; 1EEF; MAP +1EF0; 1EF1; MAP +1EF2; 1EF3; MAP +1EF4; 1EF5; MAP +1EF6; 1EF7; MAP +1EF8; 1EF9; MAP +1F08; 1F00; MAP +1F09; 1F01; MAP +1F0A; 1F02; MAP +1F0B; 1F03; MAP +1F0C; 1F04; MAP +1F0D; 1F05; MAP +1F0E; 1F06; MAP +1F0F; 1F07; MAP +1F18; 1F10; MAP +1F19; 1F11; MAP +1F1A; 1F12; MAP +1F1B; 1F13; MAP +1F1C; 1F14; MAP +1F1D; 1F15; MAP +1F28; 1F20; MAP +1F29; 1F21; MAP +1F2A; 1F22; MAP +1F2B; 1F23; MAP +1F2C; 1F24; MAP +1F2D; 1F25; MAP +1F2E; 1F26; MAP +1F2F; 1F27; MAP +1F38; 1F30; MAP +1F39; 1F31; MAP +1F3A; 1F32; MAP +1F3B; 1F33; MAP +1F3C; 1F34; MAP +1F3D; 1F35; MAP +1F3E; 1F36; MAP +1F3F; 1F37; MAP +1F48; 1F40; MAP +1F49; 1F41; MAP +1F4A; 1F42; MAP +1F4B; 1F43; MAP +1F4C; 1F44; MAP +1F4D; 1F45; MAP +1F50; 03C5 0313; MAP +1F52; 03C5 0313 0300; MAP +1F54; 03C5 0313 0301; MAP +1F56; 03C5 0313 0342; MAP +1F59; 1F51; MAP +1F5B; 1F53; MAP +1F5D; 1F55; MAP +1F5F; 1F57; MAP +1F68; 1F60; MAP +1F69; 1F61; MAP +1F6A; 1F62; MAP +1F6B; 1F63; MAP +1F6C; 1F64; MAP +1F6D; 1F65; MAP +1F6E; 1F66; MAP +1F6F; 1F67; MAP +1F80; 1F00 03B9; MAP +1F81; 1F01 03B9; MAP +1F82; 1F02 03B9; MAP +1F83; 1F03 03B9; MAP +1F84; 1F04 03B9; MAP +1F85; 1F05 03B9; MAP +1F86; 1F06 03B9; MAP +1F87; 1F07 03B9; MAP +1F88; 1F00 03B9; MAP +1F89; 1F01 03B9; MAP +1F8A; 1F02 03B9; MAP +1F8B; 1F03 03B9; MAP +1F8C; 1F04 03B9; MAP +1F8D; 1F05 03B9; MAP +1F8E; 1F06 03B9; MAP +1F8F; 1F07 03B9; MAP +1F90; 1F20 03B9; MAP +1F91; 1F21 03B9; MAP +1F92; 1F22 03B9; MAP +1F93; 1F23 03B9; MAP +1F94; 1F24 03B9; MAP +1F95; 1F25 03B9; MAP +1F96; 1F26 03B9; MAP +1F97; 1F27 03B9; MAP +1F98; 1F20 03B9; MAP +1F99; 1F21 03B9; MAP +1F9A; 1F22 03B9; MAP +1F9B; 1F23 03B9; MAP +1F9C; 1F24 03B9; MAP +1F9D; 1F25 03B9; MAP +1F9E; 1F26 03B9; MAP +1F9F; 1F27 03B9; MAP +1FA0; 1F60 03B9; MAP +1FA1; 1F61 03B9; MAP +1FA2; 1F62 03B9; MAP +1FA3; 1F63 03B9; MAP +1FA4; 1F64 03B9; MAP +1FA5; 1F65 03B9; MAP +1FA6; 1F66 03B9; MAP +1FA7; 1F67 03B9; MAP +1FA8; 1F60 03B9; MAP +1FA9; 1F61 03B9; MAP +1FAA; 1F62 03B9; MAP +1FAB; 1F63 03B9; MAP +1FAC; 1F64 03B9; MAP +1FAD; 1F65 03B9; MAP +1FAE; 1F66 03B9; MAP +1FAF; 1F67 03B9; MAP +1FB2; 1F70 03B9; MAP +1FB3; 03B1 03B9; MAP +1FB4; 03AC 03B9; MAP +1FB6; 03B1 0342; MAP +1FB7; 03B1 0342 03B9; MAP +1FB8; 1FB0; MAP +1FB9; 1FB1; MAP +1FBA; 1F70; MAP +1FBB; 1F71; MAP +1FBC; 03B1 03B9; MAP +1FBE; 03B9; MAP +1FC2; 1F74 03B9; MAP +1FC3; 03B7 03B9; MAP +1FC4; 03AE 03B9; MAP +1FC6; 03B7 0342; MAP +1FC7; 03B7 0342 03B9; MAP +1FC8; 1F72; MAP +1FC9; 1F73; MAP +1FCA; 1F74; MAP +1FCB; 1F75; MAP +1FCC; 03B7 03B9; MAP +1FD2; 03B9 0308 0300; MAP +1FD3; 03B9 0308 0301; MAP +1FD6; 03B9 0342; MAP +1FD7; 03B9 0308 0342; MAP +1FD8; 1FD0; MAP +1FD9; 1FD1; MAP +1FDA; 1F76; MAP +1FDB; 1F77; MAP +1FE2; 03C5 0308 0300; MAP +1FE3; 03C5 0308 0301; MAP +1FE4; 03C1 0313; MAP +1FE6; 03C5 0342; MAP +1FE7; 03C5 0308 0342; MAP +1FE8; 1FE0; MAP +1FE9; 1FE1; MAP +1FEA; 1F7A; MAP +1FEB; 1F7B; MAP +1FEC; 1FE5; MAP +1FF2; 1F7C 03B9; MAP +1FF3; 03C9 03B9; MAP +1FF4; 03CE 03B9; MAP +1FF6; 03C9 0342; MAP +1FF7; 03C9 0342 03B9; MAP +1FF8; 1F78; MAP +1FF9; 1F79; MAP +1FFA; 1F7C; MAP +1FFB; 1F7D; MAP +1FFC; 03C9 03B9; MAP +20A8; 0072 0073; MAP +2102; 0063; MAP +2103; 00B0 0063; MAP +2107; 025B; MAP +2109; 00B0 0066; MAP +210B; 0068; MAP +210C; 0068; MAP +210D; 0068; MAP +2110; 0069; MAP +2111; 0069; MAP +2112; 006C; MAP +2115; 006E; MAP +2116; 006E 006F; MAP +2119; 0070; MAP +211A; 0071; MAP +211B; 0072; MAP +211C; 0072; MAP +211D; 0072; MAP +2120; 0073 006D; MAP +2121; 0074 0065 006C; MAP +2122; 0074 006D; MAP +2124; 007A; MAP +2126; 03C9; MAP +2128; 007A; MAP +212A; 006B; MAP +212B; 00E5; MAP +212C; 0062; MAP +212D; 0063; MAP +2130; 0065; MAP +2131; 0066; MAP +2133; 006D; MAP +213E; 03B3; MAP +213F; 03C0; MAP +2145; 0064; MAP +2160; 2170; MAP +2161; 2171; MAP +2162; 2172; MAP +2163; 2173; MAP +2164; 2174; MAP +2165; 2175; MAP +2166; 2176; MAP +2167; 2177; MAP +2168; 2178; MAP +2169; 2179; MAP +216A; 217A; MAP +216B; 217B; MAP +216C; 217C; MAP +216D; 217D; MAP +216E; 217E; MAP +216F; 217F; MAP +24B6; 24D0; MAP +24B7; 24D1; MAP +24B8; 24D2; MAP +24B9; 24D3; MAP +24BA; 24D4; MAP +24BB; 24D5; MAP +24BC; 24D6; MAP +24BD; 24D7; MAP +24BE; 24D8; MAP +24BF; 24D9; MAP +24C0; 24DA; MAP +24C1; 24DB; MAP +24C2; 24DC; MAP +24C3; 24DD; MAP +24C4; 24DE; MAP +24C5; 24DF; MAP +24C6; 24E0; MAP +24C7; 24E1; MAP +24C8; 24E2; MAP +24C9; 24E3; MAP +24CA; 24E4; MAP +24CB; 24E5; MAP +24CC; 24E6; MAP +24CD; 24E7; MAP +24CE; 24E8; MAP +24CF; 24E9; MAP +3371; 0068 0070 0061; MAP +3373; 0061 0075; MAP +3375; 006F 0076; MAP +3380; 0070 0061; MAP +3381; 006E 0061; MAP +3382; 03BC 0061; MAP +3383; 006D 0061; MAP +3384; 006B 0061; MAP +3385; 006B 0062; MAP +3386; 006D 0062; MAP +3387; 0067 0062; MAP +338A; 0070 0066; MAP +338B; 006E 0066; MAP +338C; 03BC 0066; MAP +3390; 0068 007A; MAP +3391; 006B 0068 007A; MAP +3392; 006D 0068 007A; MAP +3393; 0067 0068 007A; MAP +3394; 0074 0068 007A; MAP +33A9; 0070 0061; MAP +33AA; 006B 0070 0061; MAP +33AB; 006D 0070 0061; MAP +33AC; 0067 0070 0061; MAP +33B4; 0070 0076; MAP +33B5; 006E 0076; MAP +33B6; 03BC 0076; MAP +33B7; 006D 0076; MAP +33B8; 006B 0076; MAP +33B9; 006D 0076; MAP +33BA; 0070 0077; MAP +33BB; 006E 0077; MAP +33BC; 03BC 0077; MAP +33BD; 006D 0077; MAP +33BE; 006B 0077; MAP +33BF; 006D 0077; MAP +33C0; 006B 03C9; MAP +33C1; 006D 03C9; MAP +33C3; 0062 0071; MAP +33C6; 0063 2215 006B 0067; MAP +33C7; 0063 006F 002E; MAP +33C8; 0064 0062; MAP +33C9; 0067 0079; MAP +33CB; 0068 0070; MAP +33CD; 006B 006B; MAP +33CE; 006B 006D; MAP +33D7; 0070 0068; MAP +33D9; 0070 0070 006D; MAP +33DA; 0070 0072; MAP +33DC; 0073 0076; MAP +33DD; 0077 0062; MAP +FB00; 0066 0066; MAP +FB01; 0066 0069; MAP +FB02; 0066 006C; MAP +FB03; 0066 0066 0069; MAP +FB04; 0066 0066 006C; MAP +FB05; 0073 0074; MAP +FB06; 0073 0074; MAP +FB13; 0574 0576; MAP +FB14; 0574 0565; MAP +FB15; 0574 056B; MAP +FB16; 057E 0576; MAP +FB17; 0574 056D; MAP +FF21; FF41; MAP +FF22; FF42; MAP +FF23; FF43; MAP +FF24; FF44; MAP +FF25; FF45; MAP +FF26; FF46; MAP +FF27; FF47; MAP +FF28; FF48; MAP +FF29; FF49; MAP +FF2A; FF4A; MAP +FF2B; FF4B; MAP +FF2C; FF4C; MAP +FF2D; FF4D; MAP +FF2E; FF4E; MAP +FF2F; FF4F; MAP +FF30; FF50; MAP +FF31; FF51; MAP +FF32; FF52; MAP +FF33; FF53; MAP +FF34; FF54; MAP +FF35; FF55; MAP +FF36; FF56; MAP +FF37; FF57; MAP +FF38; FF58; MAP +FF39; FF59; MAP +FF3A; FF5A; MAP +10400; 10428; MAP +10401; 10429; MAP +10402; 1042A; MAP +10403; 1042B; MAP +10404; 1042C; MAP +10405; 1042D; MAP +10406; 1042E; MAP +10407; 1042F; MAP +10408; 10430; MAP +10409; 10431; MAP +1040A; 10432; MAP +1040B; 10433; MAP +1040C; 10434; MAP +1040D; 10435; MAP +1040E; 10436; MAP +1040F; 10437; MAP +10410; 10438; MAP +10411; 10439; MAP +10412; 1043A; MAP +10413; 1043B; MAP +10414; 1043C; MAP +10415; 1043D; MAP +10416; 1043E; MAP +10417; 1043F; MAP +10418; 10440; MAP +10419; 10441; MAP +1041A; 10442; MAP +1041B; 10443; MAP +1041C; 10444; MAP +1041D; 10445; MAP +1041E; 10446; MAP +1041F; 10447; MAP +10420; 10448; MAP +10421; 10449; MAP +10422; 1044A; MAP +10423; 1044B; MAP +10424; 1044C; MAP +10425; 1044D; MAP +1D400; 0061; MAP +1D401; 0062; MAP +1D402; 0063; MAP +1D403; 0064; MAP +1D404; 0065; MAP +1D405; 0066; MAP +1D406; 0067; MAP +1D407; 0068; MAP +1D408; 0069; MAP +1D409; 006A; MAP +1D40A; 006B; MAP +1D40B; 006C; MAP +1D40C; 006D; MAP +1D40D; 006E; MAP +1D40E; 006F; MAP +1D40F; 0070; MAP +1D410; 0071; MAP +1D411; 0072; MAP +1D412; 0073; MAP +1D413; 0074; MAP +1D414; 0075; MAP +1D415; 0076; MAP +1D416; 0077; MAP +1D417; 0078; MAP +1D418; 0079; MAP +1D419; 007A; MAP +1D434; 0061; MAP +1D435; 0062; MAP +1D436; 0063; MAP +1D437; 0064; MAP +1D438; 0065; MAP +1D439; 0066; MAP +1D43A; 0067; MAP +1D43B; 0068; MAP +1D43C; 0069; MAP +1D43D; 006A; MAP +1D43E; 006B; MAP +1D43F; 006C; MAP +1D440; 006D; MAP +1D441; 006E; MAP +1D442; 006F; MAP +1D443; 0070; MAP +1D444; 0071; MAP +1D445; 0072; MAP +1D446; 0073; MAP +1D447; 0074; MAP +1D448; 0075; MAP +1D449; 0076; MAP +1D44A; 0077; MAP +1D44B; 0078; MAP +1D44C; 0079; MAP +1D44D; 007A; MAP +1D468; 0061; MAP +1D469; 0062; MAP +1D46A; 0063; MAP +1D46B; 0064; MAP +1D46C; 0065; MAP +1D46D; 0066; MAP +1D46E; 0067; MAP +1D46F; 0068; MAP +1D470; 0069; MAP +1D471; 006A; MAP +1D472; 006B; MAP +1D473; 006C; MAP +1D474; 006D; MAP +1D475; 006E; MAP +1D476; 006F; MAP +1D477; 0070; MAP +1D478; 0071; MAP +1D479; 0072; MAP +1D47A; 0073; MAP +1D47B; 0074; MAP +1D47C; 0075; MAP +1D47D; 0076; MAP +1D47E; 0077; MAP +1D47F; 0078; MAP +1D480; 0079; MAP +1D481; 007A; MAP +1D49C; 0061; MAP +1D49E; 0063; MAP +1D49F; 0064; MAP +1D4A2; 0067; MAP +1D4A5; 006A; MAP +1D4A6; 006B; MAP +1D4A9; 006E; MAP +1D4AA; 006F; MAP +1D4AB; 0070; MAP +1D4AC; 0071; MAP +1D4AE; 0073; MAP +1D4AF; 0074; MAP +1D4B0; 0075; MAP +1D4B1; 0076; MAP +1D4B2; 0077; MAP +1D4B3; 0078; MAP +1D4B4; 0079; MAP +1D4B5; 007A; MAP +1D4D0; 0061; MAP +1D4D1; 0062; MAP +1D4D2; 0063; MAP +1D4D3; 0064; MAP +1D4D4; 0065; MAP +1D4D5; 0066; MAP +1D4D6; 0067; MAP +1D4D7; 0068; MAP +1D4D8; 0069; MAP +1D4D9; 006A; MAP +1D4DA; 006B; MAP +1D4DB; 006C; MAP +1D4DC; 006D; MAP +1D4DD; 006E; MAP +1D4DE; 006F; MAP +1D4DF; 0070; MAP +1D4E0; 0071; MAP +1D4E1; 0072; MAP +1D4E2; 0073; MAP +1D4E3; 0074; MAP +1D4E4; 0075; MAP +1D4E5; 0076; MAP +1D4E6; 0077; MAP +1D4E7; 0078; MAP +1D4E8; 0079; MAP +1D4E9; 007A; MAP +1D504; 0061; MAP +1D505; 0062; MAP +1D507; 0064; MAP +1D508; 0065; MAP +1D509; 0066; MAP +1D50A; 0067; MAP +1D50D; 006A; MAP +1D50E; 006B; MAP +1D50F; 006C; MAP +1D510; 006D; MAP +1D511; 006E; MAP +1D512; 006F; MAP +1D513; 0070; MAP +1D514; 0071; MAP +1D516; 0073; MAP +1D517; 0074; MAP +1D518; 0075; MAP +1D519; 0076; MAP +1D51A; 0077; MAP +1D51B; 0078; MAP +1D51C; 0079; MAP +1D538; 0061; MAP +1D539; 0062; MAP +1D53B; 0064; MAP +1D53C; 0065; MAP +1D53D; 0066; MAP +1D53E; 0067; MAP +1D540; 0069; MAP +1D541; 006A; MAP +1D542; 006B; MAP +1D543; 006C; MAP +1D544; 006D; MAP +1D546; 006F; MAP +1D54A; 0073; MAP +1D54B; 0074; MAP +1D54C; 0075; MAP +1D54D; 0076; MAP +1D54E; 0077; MAP +1D54F; 0078; MAP +1D550; 0079; MAP +1D56C; 0061; MAP +1D56D; 0062; MAP +1D56E; 0063; MAP +1D56F; 0064; MAP +1D570; 0065; MAP +1D571; 0066; MAP +1D572; 0067; MAP +1D573; 0068; MAP +1D574; 0069; MAP +1D575; 006A; MAP +1D576; 006B; MAP +1D577; 006C; MAP +1D578; 006D; MAP +1D579; 006E; MAP +1D57A; 006F; MAP +1D57B; 0070; MAP +1D57C; 0071; MAP +1D57D; 0072; MAP +1D57E; 0073; MAP +1D57F; 0074; MAP +1D580; 0075; MAP +1D581; 0076; MAP +1D582; 0077; MAP +1D583; 0078; MAP +1D584; 0079; MAP +1D585; 007A; MAP +1D5A0; 0061; MAP +1D5A1; 0062; MAP +1D5A2; 0063; MAP +1D5A3; 0064; MAP +1D5A4; 0065; MAP +1D5A5; 0066; MAP +1D5A6; 0067; MAP +1D5A7; 0068; MAP +1D5A8; 0069; MAP +1D5A9; 006A; MAP +1D5AA; 006B; MAP +1D5AB; 006C; MAP +1D5AC; 006D; MAP +1D5AD; 006E; MAP +1D5AE; 006F; MAP +1D5AF; 0070; MAP +1D5B0; 0071; MAP +1D5B1; 0072; MAP +1D5B2; 0073; MAP +1D5B3; 0074; MAP +1D5B4; 0075; MAP +1D5B5; 0076; MAP +1D5B6; 0077; MAP +1D5B7; 0078; MAP +1D5B8; 0079; MAP +1D5B9; 007A; MAP +1D5D4; 0061; MAP +1D5D5; 0062; MAP +1D5D6; 0063; MAP +1D5D7; 0064; MAP +1D5D8; 0065; MAP +1D5D9; 0066; MAP +1D5DA; 0067; MAP +1D5DB; 0068; MAP +1D5DC; 0069; MAP +1D5DD; 006A; MAP +1D5DE; 006B; MAP +1D5DF; 006C; MAP +1D5E0; 006D; MAP +1D5E1; 006E; MAP +1D5E2; 006F; MAP +1D5E3; 0070; MAP +1D5E4; 0071; MAP +1D5E5; 0072; MAP +1D5E6; 0073; MAP +1D5E7; 0074; MAP +1D5E8; 0075; MAP +1D5E9; 0076; MAP +1D5EA; 0077; MAP +1D5EB; 0078; MAP +1D5EC; 0079; MAP +1D5ED; 007A; MAP +1D608; 0061; MAP +1D609; 0062; MAP +1D60A; 0063; MAP +1D60B; 0064; MAP +1D60C; 0065; MAP +1D60D; 0066; MAP +1D60E; 0067; MAP +1D60F; 0068; MAP +1D610; 0069; MAP +1D611; 006A; MAP +1D612; 006B; MAP +1D613; 006C; MAP +1D614; 006D; MAP +1D615; 006E; MAP +1D616; 006F; MAP +1D617; 0070; MAP +1D618; 0071; MAP +1D619; 0072; MAP +1D61A; 0073; MAP +1D61B; 0074; MAP +1D61C; 0075; MAP +1D61D; 0076; MAP +1D61E; 0077; MAP +1D61F; 0078; MAP +1D620; 0079; MAP +1D621; 007A; MAP +1D63C; 0061; MAP +1D63D; 0062; MAP +1D63E; 0063; MAP +1D63F; 0064; MAP +1D640; 0065; MAP +1D641; 0066; MAP +1D642; 0067; MAP +1D643; 0068; MAP +1D644; 0069; MAP +1D645; 006A; MAP +1D646; 006B; MAP +1D647; 006C; MAP +1D648; 006D; MAP +1D649; 006E; MAP +1D64A; 006F; MAP +1D64B; 0070; MAP +1D64C; 0071; MAP +1D64D; 0072; MAP +1D64E; 0073; MAP +1D64F; 0074; MAP +1D650; 0075; MAP +1D651; 0076; MAP +1D652; 0077; MAP +1D653; 0078; MAP +1D654; 0079; MAP +1D655; 007A; MAP +1D670; 0061; MAP +1D671; 0062; MAP +1D672; 0063; MAP +1D673; 0064; MAP +1D674; 0065; MAP +1D675; 0066; MAP +1D676; 0067; MAP +1D677; 0068; MAP +1D678; 0069; MAP +1D679; 006A; MAP +1D67A; 006B; MAP +1D67B; 006C; MAP +1D67C; 006D; MAP +1D67D; 006E; MAP +1D67E; 006F; MAP +1D67F; 0070; MAP +1D680; 0071; MAP +1D681; 0072; MAP +1D682; 0073; MAP +1D683; 0074; MAP +1D684; 0075; MAP +1D685; 0076; MAP +1D686; 0077; MAP +1D687; 0078; MAP +1D688; 0079; MAP +1D689; 007A; MAP +1D6A8; 03B1; MAP +1D6A9; 03B2; MAP +1D6AA; 03B3; MAP +1D6AB; 03B4; MAP +1D6AC; 03B5; MAP +1D6AD; 03B6; MAP +1D6AE; 03B7; MAP +1D6AF; 03B8; MAP +1D6B0; 03B9; MAP +1D6B1; 03BA; MAP +1D6B2; 03BB; MAP +1D6B3; 03BC; MAP +1D6B4; 03BD; MAP +1D6B5; 03BE; MAP +1D6B6; 03BF; MAP +1D6B7; 03C0; MAP +1D6B8; 03C1; MAP +1D6B9; 03B8; MAP +1D6BA; 03C3; MAP +1D6BB; 03C4; MAP +1D6BC; 03C5; MAP +1D6BD; 03C6; MAP +1D6BE; 03C7; MAP +1D6BF; 03C8; MAP +1D6C0; 03C9; MAP +1D6D3; 03C3; MAP +1D6E2; 03B1; MAP +1D6E3; 03B2; MAP +1D6E4; 03B3; MAP +1D6E5; 03B4; MAP +1D6E6; 03B5; MAP +1D6E7; 03B6; MAP +1D6E8; 03B7; MAP +1D6E9; 03B8; MAP +1D6EA; 03B9; MAP +1D6EB; 03BA; MAP +1D6EC; 03BB; MAP +1D6ED; 03BC; MAP +1D6EE; 03BD; MAP +1D6EF; 03BE; MAP +1D6F0; 03BF; MAP +1D6F1; 03C0; MAP +1D6F2; 03C1; MAP +1D6F3; 03B8; MAP +1D6F4; 03C3; MAP +1D6F5; 03C4; MAP +1D6F6; 03C5; MAP +1D6F7; 03C6; MAP +1D6F8; 03C7; MAP +1D6F9; 03C8; MAP +1D6FA; 03C9; MAP +1D70D; 03C3; MAP +1D71C; 03B1; MAP +1D71D; 03B2; MAP +1D71E; 03B3; MAP +1D71F; 03B4; MAP +1D720; 03B5; MAP +1D721; 03B6; MAP +1D722; 03B7; MAP +1D723; 03B8; MAP +1D724; 03B9; MAP +1D725; 03BA; MAP +1D726; 03BB; MAP +1D727; 03BC; MAP +1D728; 03BD; MAP +1D729; 03BE; MAP +1D72A; 03BF; MAP +1D72B; 03C0; MAP +1D72C; 03C1; MAP +1D72D; 03B8; MAP +1D72E; 03C3; MAP +1D72F; 03C4; MAP +1D730; 03C5; MAP +1D731; 03C6; MAP +1D732; 03C7; MAP +1D733; 03C8; MAP +1D734; 03C9; MAP +1D747; 03C3; MAP +1D756; 03B1; MAP +1D757; 03B2; MAP +1D758; 03B3; MAP +1D759; 03B4; MAP +1D75A; 03B5; MAP +1D75B; 03B6; MAP +1D75C; 03B7; MAP +1D75D; 03B8; MAP +1D75E; 03B9; MAP +1D75F; 03BA; MAP +1D760; 03BB; MAP +1D761; 03BC; MAP +1D762; 03BD; MAP +1D763; 03BE; MAP +1D764; 03BF; MAP +1D765; 03C0; MAP +1D766; 03C1; MAP +1D767; 03B8; MAP +1D768; 03C3; MAP +1D769; 03C4; MAP +1D76A; 03C5; MAP +1D76B; 03C6; MAP +1D76C; 03C7; MAP +1D76D; 03C8; MAP +1D76E; 03C9; MAP +1D781; 03C3; MAP +1D790; 03B1; MAP +1D791; 03B2; MAP +1D792; 03B3; MAP +1D793; 03B4; MAP +1D794; 03B5; MAP +1D795; 03B6; MAP +1D796; 03B7; MAP +1D797; 03B8; MAP +1D798; 03B9; MAP +1D799; 03BA; MAP +1D79A; 03BB; MAP +1D79B; 03BC; MAP +1D79C; 03BD; MAP +1D79D; 03BE; MAP +1D79E; 03BF; MAP +1D79F; 03C0; MAP +1D7A0; 03C1; MAP +1D7A1; 03B8; MAP +1D7A2; 03C3; MAP +1D7A3; 03C4; MAP +1D7A4; 03C5; MAP +1D7A5; 03C6; MAP +1D7A6; 03C7; MAP +1D7A7; 03C8; MAP +1D7A8; 03C9; MAP +1D7BB; 03C3; MAP + +# Total code points 1371 + +# code points from Table C.1.2 + +00A0; ; PROHIBITED +1680; ; PROHIBITED +2000; ; PROHIBITED +2001; ; PROHIBITED +2002; ; PROHIBITED +2003; ; PROHIBITED +2004; ; PROHIBITED +2005; ; PROHIBITED +2006; ; PROHIBITED +2007; ; PROHIBITED +2008; ; PROHIBITED +2009; ; PROHIBITED +200A; ; PROHIBITED +200B; ; PROHIBITED +202F; ; PROHIBITED +205F; ; PROHIBITED +3000; ; PROHIBITED + +# Total code points 17 + +# code points from Table C.2.2 + +0080..009F; ; PROHIBITED +06DD; ; PROHIBITED +070F; ; PROHIBITED +180E; ; PROHIBITED +200C; ; PROHIBITED +200D; ; PROHIBITED +2028; ; PROHIBITED +2029; ; PROHIBITED +2060; ; PROHIBITED +2061; ; PROHIBITED +2062; ; PROHIBITED +2063; ; PROHIBITED +206A..206F; ; PROHIBITED +FEFF; ; PROHIBITED +FFF9..FFFC; ; PROHIBITED +1D173..1D17A; ; PROHIBITED + +# Total code points 30 + +# code points from Table C.3 + +E000..F8FF; ; PROHIBITED +F0000..FFFFD; ; PROHIBITED +100000..10FFFD; ; PROHIBITED + +# Total code points 2051 + +# code points from Table C.4 + +FDD0..FDEF; ; PROHIBITED +FFFE..FFFF; ; PROHIBITED +1FFFE..1FFFF; ; PROHIBITED +2FFFE..2FFFF; ; PROHIBITED +3FFFE..3FFFF; ; PROHIBITED +4FFFE..4FFFF; ; PROHIBITED +5FFFE..5FFFF; ; PROHIBITED +6FFFE..6FFFF; ; PROHIBITED +7FFFE..7FFFF; ; PROHIBITED +8FFFE..8FFFF; ; PROHIBITED +9FFFE..9FFFF; ; PROHIBITED +AFFFE..AFFFF; ; PROHIBITED +BFFFE..BFFFF; ; PROHIBITED +CFFFE..CFFFF; ; PROHIBITED +DFFFE..DFFFF; ; PROHIBITED +EFFFE..EFFFF; ; PROHIBITED +FFFFE..FFFFF; ; PROHIBITED +10FFFE..10FFFF; ; PROHIBITED + +# Total code points 18 + +# code points from Table C.5 + +D800..DFFF; ; PROHIBITED + +# Total code points 0 + +# code points from Table C.6 + +FFF9; ; PROHIBITED +FFFA; ; PROHIBITED +FFFB; ; PROHIBITED +FFFC; ; PROHIBITED +FFFD; ; PROHIBITED + +# Total code points 5 + +# code points from Table C.7 + +2FF0..2FFB; ; PROHIBITED + +# Total code points 1 + +# code points from Table C.8 + +0340; ; PROHIBITED +0341; ; PROHIBITED +200E; ; PROHIBITED +200F; ; PROHIBITED +202A; ; PROHIBITED +202B; ; PROHIBITED +202C; ; PROHIBITED +202D; ; PROHIBITED +202E; ; PROHIBITED +206A; ; PROHIBITED +206B; ; PROHIBITED +206C; ; PROHIBITED +206D; ; PROHIBITED +206E; ; PROHIBITED +206F; ; PROHIBITED + +# Total code points 15 + +# code points from Table C.9 + +E0001; ; PROHIBITED +E0020..E007F; ; PROHIBITED + +# Total code points 82 + diff --git a/icuSources/test/testdata/pkgdata.inc.in b/icuSources/test/testdata/pkgdata.inc.in new file mode 100644 index 00000000..2a9838b5 --- /dev/null +++ b/icuSources/test/testdata/pkgdata.inc.in @@ -0,0 +1,20 @@ +#****************************************************************************** +# +# Copyright (C) 2000-2004, International Business Machines +# Corporation and others. All Rights Reserved. +# +#****************************************************************************** +# This Makefile is used to build the ICU's data. +# It is included with the -O option to pkgdata. + +top_srcdir=@top_srcdir@ +srcdir=@srcdir@ +top_builddir=../.. + +include $(top_builddir)/icudefs.mk + +##### Add the following to source/config/Makefile.in + +GENCCODE=$(BINDIR)/genccode +GENCMN=$(BINDIR)/gencmn + diff --git a/icuSources/test/testdata/ra.txt b/icuSources/test/testdata/ra.txt new file mode 100644 index 00000000..a94e0b3c --- /dev/null +++ b/icuSources/test/testdata/ra.txt @@ -0,0 +1,125 @@ +//******************************************************************************* +//* +//* Copyright (C) 2003, International Business Machines +//* Corporation and others. All Rights Reserved. +//* +//******************************************************************************* + +/** + * These are top level comments for the bundle. Tag name: ra + * @translate yes + * @note Comments for tag named ra + */ +ra{ + /** + * Top level comments for the string.Tag name: test1 + * @translate yes + * @note {0} represents the position of OSNAME and {1} represents the position of job name + * e.g: The OS/400 job named SYSLOG + */ + test1{"The {0} job named {1}"} + /** + * Tag name: test2 + * @note This resource is for test2 + * @translate yes + */ + test2{"some translatable stuff"} + + /** + * Top level comments for TestTable. Tag name: TestTable + * @translate yes + * @note This resource is for TestTable + */ + TestTable{ + /** + * Tag name: test3 + * @translate yes + * @note This resource is for test3 + */ + test3{"jasldjfa"} + /** + * Tag name: test4 + * @translate yes + * @note This resource is for test4 + */ + test4{"asdfasdf"} + /** + * Tag name: test5 + * @translate yes + * @note This resource is for test5 + */ + test5:int{1} + /** + * Tag name: test6 + * @translate yes + * @note This resource is for test6 + */ + test6:bin{"0102"} + } + /** + * Top level comments for Tag name: TestArray + * @translate yes + * @note This resource is for Tag name: Array + */ + TestArray{ + /** + * comments for un-named string + * @translate yes + * @note This resource is un-named string + */ + :string{"abcde"}, + /** + * comments for un-named int + * @translate yes + * @note This resource is un-named int + */ + :int{1}, + /** + * comments for un-named binary + * @translate yes + * @note This resource is for un-named binary + */ + :bin{"12312312"} + } + + /** + * comments for TestInclude + * @translate yes + * @note This resource is for TestInclude + */ + TestInclude:include{"translit_rules.txt"} + + /** + * comments for TestImport + * @translate yes + * @note This resource is for TestImport + */ + TestImpport:import{"importtest.bin"} + + /** + * comments for TestIntVector + * @translate yes + * @note This resource is for TestIntVector + */ + TestIntVector{ + /** + * comments for element 1 + * @translate yes + * @note This resource is for element 1 + */ + 1, + /** + * comments for element 2 + * @translate yes + * @note This resource is for element 2 + */ + 2, + /** + * comments for element 3 + * @translate yes + * @note This resource is for element 3 + */ + 3 + } + +} diff --git a/icuSources/test/testdata/rbbitst.txt b/icuSources/test/testdata/rbbitst.txt index 05fe1e77..bdb45db0 100644 --- a/icuSources/test/testdata/rbbitst.txt +++ b/icuSources/test/testdata/rbbitst.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2001-2003 International Business Machines +# Copyright (c) 2001-2004 International Business Machines # Corporation and others. All Rights Reserved. # # RBBI Test Data @@ -22,6 +22,10 @@ # +# Temp debugging tests +<line> +# to test for bug #4097920 +<data>•dog,cat,mouse •(one)•(two)\n<100></data> ######################################################################################## # @@ -176,6 +180,11 @@ <data>•\u0917\u092a\u00ad\u0936\u092a<200>!•\u092f\u0939<200> •\u0939\u093f\u0928\u094d\u200d\u0926\u0940<200> •\u0939\u0948<200> •\u0905\u093e\u092a<200> •\u0938\u093f\u0916\u094b\u0917\u0947<200>?•\n•:•\u092a\u094d\u0930\u093e\u092f\u0903<200> •\u0935\u0930\u094d\u0937\u093e<200>\r\n•\u092a\u094d\u0930\u0915\u093e\u0936<200>,•\u0924\u0941\u092e\u093e\u0930\u094b<200> •\u092e\u093f\u0924\u094d\u0930<200> •\u0915\u093e<200> •\u092a\u0924\u094d\u0930<200> •\u092a\u095d\u094b<200> •\u0938\u094d\u0924\u094d\u0930\u093f<200>.• •\u0968\u0966.\u0969\u096f<100> •\u0967\u0966\u0966.\u0966\u0966<100>\u20a8•\u0967,\u0967\u0966\u0966.\u0966\u0966<100> •\u0905\u092e\u091c<200>\n•\u0938\u094d\u200d\u0935\u0924\u0902\u0924\u094d\u0930<200>\r•</data> +# +# Failures from monkey tests +# +<data>•\u8527<400>\u02ba<200>\u0027\u0d42•\u00b7•\u09ea<100></data> + ######################################################################################## # # @@ -192,16 +201,16 @@ <sent> -<data>•This\n•</data> +<data>•This\n<100></data> <data>•Hello! •how are you? •I'am fine. •Thankyou. •How are you \ -doing? •This\n• costs $20,00,000. •</data> +doing? •This\n<100> costs $20,00,000. •</data> # Sentence ending in a quote. <data>•"Sentence ending with a quote." •Bye.•</data> # Sentence, and test data, ending without a period or other terminator. -<data>•Here is a random sentence, no ending period•</data> +<data>•Here is a random sentence, no ending period<100></data> <data>• (This is it). •Testing the sentence iterator. •\ @@ -221,7 +230,7 @@ Have you ever said, "This is where\tI shall live"? •He answered, \ Yet another popular saying is: \ 'I'm fine thanks.' •\ What is the proper use of the abbreviation pp.•? •Yes, I am definatelly 12" tall!•!\ -•Now\r•is\n•the\r\n•time\n•\r•for\r•\r•</data> +•Now\r<100>is\n<100>the\r\n<100>time\n<100>\r<100>for\r<100>\r<100></data> <data>•No breaks when . is surrounded by UPPER.Case letters. •</data> <data>•No breaks when . is followed by Numeric .4 a.4 C.4 3.1 .•</data> @@ -242,7 +251,7 @@ What is the proper use of the abbreviation pp.•? •Yes, I am definatelly 12" # # Don't break sentences at boundary between CJK and digits # -<data>•\u5487\u67ff\ue591\u5017\u61b3\u60a1\u9510\u8165\u9de8\u97e48888\u821c\u8165\u7fc8\u51ce\u306d\ue30b\u2494\u56d8\u4ec0\u60b1\u8560\u51ba\u611d\u57b6\u2510\u5d46\u97e5\u7751\u3002•Bye, now•</data>" +<data>•\u5487\u67ff\ue591\u5017\u61b3\u60a1\u9510\u8165\u9de8\u97e48888\u821c\u8165\u7fc8\u51ce\u306d\ue30b\u2494\u56d8\u4ec0\u60b1\u8560\u51ba\u611d\u57b6\u2510\u5d46\u97e5\u7751\u3002•Bye, now<100></data>" # # Breaks around '(' following a sentence TERM. (Rule 9) @@ -253,16 +262,15 @@ What is the proper use of the abbreviation pp.•? •Yes, I am definatelly 12" <data>•How do you do? •(fine). •</data> # -<data>•Hello.123•</data> # Rule 6 -<data>•Hello?•123•</data> +<data>•Hello.123<100></data> # Rule 6 +<data>•Hello?•123<100></data> -<data>•HELLO.Bye•</data> # Rule 7 -<data>•HELLO?•Bye•</data> +<data>•HELLO.Bye<100></data> # Rule 7 +<data>•HELLO?•Bye<100></data> -<data>•Hello.goodbye•</data> #Rule 8 -<data>•Hello. •Goodbye•</data> -<data>•Hello. goodbye•</data> -<data>•Hello.)@#$%^&*()"" goodbye•</data> +<data>•Hello.goodbye<100></data> #Rule 8 +<data>•Hello. •Goodbye<100></data> +<data>•Hello. goodbye<100></data> @@ -295,9 +303,9 @@ What is the proper use of the abbreviation pp.•? •Yes, I am definatelly 12" # make sure there is sentence break after ?,danda(hindi phrase separator), # fullstop followed by space. (VERY old test) # -<data>•\u0928\u092e\u0938\u094d\u200d\u0924\u0947 \u0930\u092e\u0947\u0936\u0905\u093e\u092a\u0915\u0948\u0938\u0947 \u0939\u0948?•\u092e\u0948 \u0905\u091a\u094d\u200d \u091b\u093e \u0939\u0942\u0901\u0964 •\u0905\u093e\u092a\r\n•\ +<data>•\u0928\u092e\u0938\u094d\u200d\u0924\u0947 \u0930\u092e\u0947\u0936\u0905\u093e\u092a\u0915\u0948\u0938\u0947 \u0939\u0948?•\u092e\u0948 \u0905\u091a\u094d\u200d \u091b\u093e \u0939\u0942\u0901\u0964 •\u0905\u093e\u092a\r\n<100>\ \u0915\u0948\u0938\u0947 \u0939\u0948?•\u0935\u0939 \u0915\u094d\u200d\u092f\u093e\n\ -•\u0939\u0948?•\u092f\u0939 \u0905\u093e\u092e \u0939\u0948. •\u092f\u0939 means "this". •"\u092a\u095d\u093e\u0908" meaning "education" or "studies". •\u0905\u093e\u091c(\u0938\u094d\u200d\u0935\u0924\u0902\u0924\u094d\u0930 \u0926\u093f\u0935\u093e\u0938) \u0939\u0948\u0964 •Let's end here. •</data> +<100>\u0939\u0948?•\u092f\u0939 \u0905\u093e\u092e \u0939\u0948. •\u092f\u0939 means "this". •"\u092a\u095d\u093e\u0908" meaning "education" or "studies". •\u0905\u093e\u091c(\u0938\u094d\u200d\u0935\u0924\u0902\u0924\u094d\u0930 \u0926\u093f\u0935\u093e\u0938) \u0939\u0948\u0964 •Let's end here. •</data> # Regression test for bug #1984, Sentence break in Arabic text. @@ -358,7 +366,7 @@ What is the proper use of the abbreviation pp.•? •Yes, I am definatelly 12" <data>• •\u0041•</data> <data>• •\u0009•</data> <data>• •\u00B4•</data> -<data>• \u000C•</data> # LB3C × BK +<data>• \u000C<100></data> # LB3C × BK <data>• •\u2014•</data> <data>• •\uFFFC•</data> <data>• \u0029•</data> # LB 8 × CL @@ -369,7 +377,7 @@ What is the proper use of the abbreviation pp.•? •Yes, I am definatelly 12" <data>• •\u4E00•</data> <data>• •\u2024•</data> <data>• \u002C•</data> # LB 8 × IS -<data>• \u000A•</data> # LB3C × ( BK | CR | LF | NL ) +<data>• \u000A<100></data> # LB3C × ( BK | CR | LF | NL ) <data>• •\u0E5A•</data> <data>• •\u0032•</data> <data>• •\u0028•</data> @@ -387,34 +395,34 @@ What is the proper use of the abbreviation pp.•? •Yes, I am definatelly 12" # 3a Always break after hard line breaks. # 3c Never break before hard line breaks. -<data>• •\u00A1\u2028•\u00A1•</data> -<data>• •\u0041\u2028•\u0041•</data> -<data>• •\u0009\u2028•\u0009•</data> -<data>• •\u00B4\u2028•\u00B4•</data> -<data>• \u000C•\u2028•\u000C•</data> -<data>• •\u2014\u2028•\u2014•</data> -<data>• •\uFFFC\u2028•\uFFFC•</data> -<data>• \u0029\u2028•\u0029•</data> -#<data>• \u0301\u2028•\u0301•</data> # TODO: fix. -<data>• \u0021\u2028•\u0021•</data> -#<data>• \u00A0\u2028•\u00A0•</data> # TODO: fix -<data>• •\u002D\u2028•\u002D•</data> -<data>• •\u4E00\u2028•\u4E00•</data> -<data>• •\u2024\u2028•\u2024•</data> -<data>• \u002C\u2028•\u002C•</data> -<data>• \u000A•\u2028•\u000A•</data> -<data>• •\u0E5A\u2028•\u0E5A•</data> -<data>• •\u0032\u2028•\u0032•</data> -<data>• •\u0028\u2028•\u0028•</data> -<data>• •\u0025\u2028•\u0025•</data> -<data>• •\u0024\u2028•\u0024•</data> -<data>• •\u0022\u2028•\u0022•</data> -<data>• •\u0E01\u2028•\u0E01•</data> -<data>• •\uDB7F\u2028•\uDB7F•</data> -<data>• \u0020\u2028•\u0020•</data> -<data>• \u002F\u2028•\u002F•</data> -<data>• •\uF8FF\u2028•\uF8FF•</data> -<data>• \u200B\u2028•\u200B•</data> +<data>• •\u00A1\u2028<100>\u00A1•</data> +<data>• •\u0041\u2028<100>\u0041•</data> +<data>• •\u0009\u2028<100>\u0009•</data> +<data>• •\u00B4\u2028<100>\u00B4•</data> +<data>• \u000C<100>\u2028<100>\u000C<100></data> +<data>• •\u2014\u2028<100>\u2014•</data> +<data>• •\uFFFC\u2028<100>\uFFFC•</data> +<data>• \u0029\u2028<100>\u0029•</data> +#<data>• \u0301\u2028<100>\u0301•</data> # TODO: fix. +<data>• \u0021\u2028<100>\u0021•</data> +#<data>• \u00A0\u2028<100>\u00A0•</data> # TODO: fix +<data>• •\u002D\u2028<100>\u002D•</data> +<data>• •\u4E00\u2028<100>\u4E00•</data> +<data>• •\u2024\u2028<100>\u2024•</data> +<data>• \u002C\u2028<100>\u002C•</data> +<data>• \u000A<100>\u2028<100>\u000A<100></data> +<data>• •\u0E5A\u2028<100>\u0E5A•</data> +<data>• •\u0032\u2028<100>\u0032•</data> +<data>• •\u0028\u2028<100>\u0028•</data> +<data>• •\u0025\u2028<100>\u0025•</data> +<data>• •\u0024\u2028<100>\u0024•</data> +<data>• •\u0022\u2028<100>\u0022•</data> +<data>• •\u0E01\u2028<100>\u0E01•</data> +<data>• •\uDB7F\u2028<100>\uDB7F•</data> +<data>• \u0020\u2028<100>\u0020•</data> +<data>• \u002F\u2028<100>\u002F•</data> +<data>• •\uF8FF\u2028<100>\uF8FF•</data> +<data>• \u200B\u2028<100>\u200B•</data> # @@ -424,11 +432,11 @@ What is the proper use of the abbreviation pp.•? •Yes, I am definatelly 12" <line> <data>•Multi-•Level •example •of •a •semi-•idiotic •non-•sensical •(non-•important) •sentence. -•Hi •Hello •How\n•are\r•you\u2028•fine.\t•good. •Now\r•is\n•the\r\n•time\n•\r•for\r•\r•all•</data> +<100>Hi •Hello •How\n<100>are\r<100>you\u2028<100>fine.\t•good. •Now\r<100>is\n<100>the\r\n<100>time\n<100>\r<100>for\r<100>\r<100>all•</data> <line> -<data>•Hello! •how\r\n• •(are)\r• •you? •I'am •fine- •Thankyou. •foo\u00a0bar -•How, •are, •you? •This, •costs •$20,00,000.•</data> +<data>•Hello! •how\r\n<100> •(are)\r<100> •you? •I'am •fine- •Thankyou. •foo\u00a0bar +<100>How, •are, •you? •This, •costs •$20,00,000.•</data> # test for bug #4068133 # @@ -438,10 +446,10 @@ What is the proper use of the abbreviation pp.•? •Yes, I am definatelly 12" <data>•foo\u00a0bar•</data> # to test for bug #4097920 -<data>•dog,•cat,•mouse •(one)•(two)\n•</data> +<data>•dog,cat,mouse •(one)•(two)\n<100></data> # to test for bug #4035266 -<data>•The •balance •is •$-23,456.78, •not •-•$32,456.78!\n•</data> +<data>•The •balance •is •$-23,456.78, •not •-•$32,456.78!\n<100></data> # to test for bug #4098467 @@ -462,7 +470,7 @@ What is the proper use of the abbreviation pp.•? •Yes, I am definatelly 12" # Surrogate line break tests. # -<data>•\u4e01•\ud840\udc01•\u4e02•abc•\ue000•\udb80\udc01•</data> +<data>•\u4e01•\ud840\udc01•\u4e02•abc •\ue000 •\udb80\udc01•</data> # Regression for bug 836 <data>•AAA•(AAA •</data> diff --git a/icuSources/test/testdata/regextst.txt b/icuSources/test/testdata/regextst.txt index da7dc051..15737667 100644 --- a/icuSources/test/testdata/regextst.txt +++ b/icuSources/test/testdata/regextst.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2001-2003 International Business Machines +# Copyright (c) 2001-2004 International Business Machines # Corporation and others. All Rights Reserved. # # file: @@ -18,8 +18,13 @@ # x free spacing and comments # s dot-matches-all mode # m multi-line mode. $ and ^ match at embedded new-lines +# v If icu configured without break iteration, this +# regex test pattern should not compile. # d dump the compiled pattern # t trace operation of match engine. +# 2-9 a digit between 2 and 9, specifies the number of +# times to execute find(). The expected results are +# for the last find() in the sequence. # White space must be present between the flags and the match string. # @@ -66,6 +71,7 @@ ".*\Ahello" "stuff\nhello" # don't match after embedded new-line. # \b \B +# ".*?\b(.).*" "<0> $%^&*( <1>h</1>ello123%^&*()gxx</0>" "\ba\b" "-<0>a</0>" "\by\b" "xy" @@ -78,12 +84,26 @@ "(?:.*?\b(.))?(?:.*?\b(.))?(?:.*?\b(.))?(?:.*?\b(.))?(?:.*?\b(.))?.*" "<0> \u0301 \u0301<1>A</1>\u0302BC\u0303\u0304<2> </2>\u0305 \u0306<3>X</3>\u0307Y\u0308</0>" + +# +# Unicode word boundary mode +# +"(?w).*?\b" v "<0></0>hello, world" +"(?w).*?(\b.+?\b).*" v "<0><1> </1> 123.45 </0>" +"(?w).*?(\b\d.*?\b).*" v "<0> <1>123.45</1> </0>" +".*?(\b.+?\b).*" "<0> <1>123</1>.45 </0>" +"(?w:.*?(\b\d.*?\b).*)" v "<0> <1>123.45</1> </0>" +"(?w:.*?(\b.+?\b).*)" v "<0><1>don't</1> </0>" +"(?w:.+?(\b\S.+?\b).*)" v "<0> <1>don't</1> </0>" +"(?w:(\b.+?)(\b.+?)(\b.+?)(\b.+?)(\b.+?)(\b.+?)(\b.+?).*)" v "<0><1>.</1><2> </2><3>,</3><4>:</4><5>$</5><6>37,000.50</6><7> </7> </0>" + + # . does not match new-lines "." "\u000a\u000d\u0085\u000c\u2028\u2029<0>X</0>\u000aY" "A." "A\u000a "# no match # \d for decimal digits -"\d*" "<0>0123456789\u0660\u06F9\u0969\u0A66\u1369\u17E2\uFF10\U0001D7CE\U0001D7FF</0>non-digits" +"\d*" "<0>0123456789\u0660\u06F9\u0969\u0A66\u17E2\uFF10\U0001D7CE\U0001D7FF</0>non-digits" "\D+" "<0>non digits</0>" "\D*(\d*)(\D*)" "<0>non-digits<1>3456666</1><2>more non digits</2></0>" @@ -350,6 +370,140 @@ "(\ud800)(\udc00)" "\U00010000" +# +# Bug 3225 + +"1|9" "<0>1</0>" +"1|9" "<0>9</0>" +"1*|9" "<0>1</0>" +"1*|9" "<0></0>9" + +"(?:a|ac)d" "<0>acd</0>" +"a|ac" "<0>a</0>c" + +# +# Bug 3320 +# +"(a([^ ]+)){0,} (c)" "<0><1>a<2>b</2></1> <3>c</3></0> " +"(a([^ ]+))* (c)" "<0><1>a<2>b</2></1> <3>c</3></0> " + +# +# Bug 3436 +# +"(.*?) *$" "<0><1>test</1> </0>" + +# +# Bug 4034 +# +"\D" "<0>A</0>BC\u00ffDEF" +"\d" "ABC\u00ffDEF" +"\D" "<0>\u00ff</0>DEF" +"\d" "\u00ffDEF" +"\D" "123<0>\u00ff</0>DEF" +"\D" "<0>\u0100</0>DEF" +"\D" "123<0>\u0100</0>DEF" + +# +#bug 4024, new line sequence handling +# +"(?m)^" "<0></0>AA\u000d\u000aBB\u000d\u000aCC\u000d\u000a" +"(?m)^" 2 "AA\u000d\u000a<0></0>BB\u000d\u000aCC\u000d\u000a" +"(?m)^" 3 "AA\u000d\u000aBB\u000d\u000a<0></0>CC\u000d\u000a" +"(?m)^" 4 "AA\u000d\u000aBB\u000d\u000aCC\u000d\u000a" + +"(?m)$" "AA<0></0>\u000d\u000aBB\u000d\u000aCC\u000d\u000a" +"(?m)$" 2 "AA\u000d\u000aBB<0></0>\u000d\u000aCC\u000d\u000a" +"(?m)$" 3 "AA\u000d\u000aBB\u000d\u000aCC<0></0>\u000d\u000a" +"(?m)$" 4 "AA\u000d\u000aBB\u000d\u000aCC\u000d\u000a<0></0>" +"(?m)$" 5 "AA\u000d\u000aBB\u000d\u000aCC\u000d\u000a" + +"$" "AA\u000d\u000aBB\u000d\u000aCC<0></0>\u000d\u000a" +"$" 2 "AA\u000d\u000aBB\u000d\u000aCC\u000d\u000a<0></0>" +"$" 3 "AA\u000d\u000aBB\u000d\u000aCC\u000d\u000a" + +"$" "\u000a\u0000a<0></0>\u000a" +"$" 2 "\u000a\u0000a\u000a<0></0>" +"$" 3 "\u000a\u0000a\u000a" + +"$" "<0></0>" +"$" 2 "" + +"$" "<0></0>\u000a" +"$" 2 "\u000a<0></0>" +"$" 3 "\u000a" + +"^" "<0></0>" +"^" 2 "" + +"\Z" "<0></0>" +"\Z" 2 "" +"\Z" 2 "\u000a<0></0>" +"\Z" "<0></0>\u000d\u000a" +"\Z" 2 "\u000d\u000a<0></0>" + + +# No matching ^ at interior new-lines if not in multi-line mode. +"^" "<0></0>AA\u000d\u000aBB\u000d\u000aCC\u000d\u000a" +"^" 2 "AA\u000d\u000aBB\u000d\u000aCC\u000d\u000a" + +# +# Dot-matches-any mode, and stopping at new-lines if off. +# +"." "<0>1</0>23\u000aXYZ" +"." 2 "1<0>2</0>3\u000aXYZ" +"." 3 "12<0>3</0>\u000aXYZ" +"." 4 "123\u000a<0>X</0>YZ" # . doesn't match newlines +"." 4 "123\u000c<0>X</0>YZ" +"." 4 "123\u000d<0>X</0>YZ" +"." 4 "123\u000d\u000a<0>X</0>YZ" +"." 4 "123\u0085<0>X</0>YZ" +"." 4 "123\u2028<0>X</0>YZ" +"." 4 "123\u2029<0>X</0>YZ" +"." 4s "123<0>\u000a</0>XYZ" # . matches any +"." 4s "123<0>\u000c</0>XYZ" +"." 4s "123<0>\u000d</0>XYZ" +"." 4s "123<0>\u000d\u000a</0>XYZ" +"." 4s "123<0>\u0085</0>XYZ" +"." 4s "123<0>\u2028</0>XYZ" +"." 4s "123<0>\u2029</0>XYZ" +".{6}" "123\u000a\u000dXYZ" +".{6}" s "<0>123\u000a\u000dX</0>Y" + +# +# Bug 4045 +# +"A*" "<0>AAAA</0>" +"A*" 2 "AAAA<0></0>" +"A*" 3 "AAAA" +"A*" 4 "AAAA" +"A*" 5 "AAAA" +"A*" 6 "AAAA" +"A*" "<0></0>" +"A*" 2 "" +"A*" 3 "" +"A*" 4 "" +"A*" 5 "" + +# +# Bug 4046 +# +"(?m)^" "<0></0>AA\u000dBB\u000dCC\u000d" +"(?m)^" 2 "AA\u000d<0></0>BB\u000dCC\u000d" +"(?m)^" 3 "AA\u000dBB\u000d<0></0>CC\u000d" +"(?m)^" 4 "AA\u000dBB\u000dCC\u000d" +"(?m)^" 5 "AA\u000dBB\u000dCC\u000d" +"(?m)^" 6 "AA\u000dBB\u000dCC\u000d" + +"(?m)^" "<0></0>AA\u000d\u000aBB\u000d\u000aCC\u000d\u000a" +"(?m)^" 2 "AA\u000d\u000a<0></0>BB\u000d\u000aCC\u000d\u000a" +"(?m)^" 3 "AA\u000d\u000aBB\u000d\u000a<0></0>CC\u000d\u000a" +"(?m)^" 4 "AA\u000d\u000aBB\u000d\u000aCC\u000d\u000a" + +# +# Bug 4059 +# +"\w+" "<0>イチロー</0>" +"\b....\b." "<0>イチロー?</0>" # # Random debugging, Temporary diff --git a/icuSources/test/testdata/riwords.txt b/icuSources/test/testdata/riwords.txt new file mode 100644 index 00000000..80174e2e --- /dev/null +++ b/icuSources/test/testdata/riwords.txt @@ -0,0 +1,32943 @@ +#******************************************************************************* +#* +#* Copyright (C) 2003, National Electronics and Computer Technology Center +#* and others. All Rights Reserved. +#* +#******************************************************************************* +# Sorted Thai word list used for testing the ThaiCollator class. +# This list was taken from the Web: <http://www.links.nectec.or.th/itech/download.html> +# +# Lines starting with '#' are ignored; others are treated as single words +# in the UTF-8 encoding. +# +# +# License information: +# RIWord License +# +# COPYRIGHT AND PERMISSION NOTICE +# +# Copyright (c) 2003 National Electronics and Computer Technology Center and others +# All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, and/or sell copies of the Software, and to permit persons +# to whom the Software is furnished to do so, provided that the above +# copyright notice(s) and this permission notice appear in all copies of +# the Software and that both the above copyright notice(s) and this +# permission notice appear in supporting documentation. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +# OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +# HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL +# INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING +# FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# +# Except as contained in this notice, the name of a copyright holder +# shall not be used in advertising or otherwise to promote the sale, use +# or other dealings in this Software without prior written authorization +# of the copyright holder. +# +# -------------------------------------------------------------------------------- +# All trademarks and registered trademarks mentioned herein are the property of their respective owners. +ก +ก็ +กก +ก๊ก +กกขนาก +กกช้าง +กกธูป +กกหู +ก กา +กกุธภัณฑ์ +ก ข +ก ข ไม่กระดิกหู +กง +ก่ง +ก้ง +ก๊ง +กงกอน +กงการ +กงเกวียน +กงเกวียนกำเกวียน +กงโก้ +กงค้าง +ก้งโค้ง +ก้งง +กงจักร +กงฉาก +กงไฉ่ +กงเต๊ก +กงพัด +กงวาน +กงสี +กงสุล +กช +กช- +กชกร +กฎ +กฎกระทรวง +กฎเกณฑ์ +กฎข้อบังคับ +กฎทบวง +กฎธรรมชาติ +กฎธรรมดา +กฎบัตร +กฎบัตรกฎหมาย +กฎบัตรสหประชาชาติ +กฎมนเทียรบาล +กฎยุทธวินัย +กฎศีลธรรม +กฎเสนาบดี +กฎหมาย +กฎหมายนานาประเทศ +กฎหมายปิดปาก +กฎหมายพาณิชย์ +กฎหมายแพ่ง +กฎหมายระหว่างประเทศ +กฎหมายเหตุ +กฎหมายอาญา +กฎหมู่ +กฎแห่งกรรม +กฎอัยการศึก +กฏิ +กฏุก +กฏุก- +กฏุกผล +กฐิน +กฐิน- +กฐินทาน +กฐินัตถารกรรม +กณิกนันต์ +กณิการ์ +กด +กดขี่ +กดคอ +กดชา +กดดัน +กดน้ำ +กดราคา +กดหัว +กดเหลือง +ก็ดี +ก็ได้ +กตเวทิตา +กตเวที +กตัญชลี +กตัญญุตา +กตัญญู +กตาธิการ +กตาภินิหาร +ก็ตาม +กติกา +กติกาสัญญา +กถา +กถามรรค +กถามรรคเทศนา +กถามุข +กถิกาจารย์ +กทรรป +กทลี +กน +ก่น +ก้น +กนก +ก้นกบ +ก้นกระดก +ก้นกุฏิ +ก้นขบ +ก้นครัว +ก่นโคตร +ก้นตะกรน +ก่นแต่ +กนน +กนนเชอ +ก่นนโถง +กนนเหิม +ก้นบึ้ง +ก้นปล่อง +ก้นปอด +ก้นปิด +ก้นปูด +ก้นแมลงสาบ +ก้นย้อย +ก่นสร้าง +ก้นหนัก +ก้นหย่อน +ก้นหอย +ก้นอ้อย +กนิษฐ- +กนิษฐ์ +กนิษฐภคินี +กนิษฐภาดา +กนิษฐา +กบ +กบฏ +กบดาน +กบเต้น +กบทู +กบทูด +กบบัว +กบเลือกนาย +กบาล +กบินทร์ +กบิล +กบี่ +กบี่ธุช +กบูร +กเบนทร์ +กโบร +กโบล +กปณ +กปณก +กปณา +กปิ +กปิตัน +กม +ก้ม +กมณฑลาภิเษก +กมณฑโลทก +กมล +กมลา +กมลาศ +กมลาสน์ +กมเลศ +ก้มหน้า +ก้มหน้าก้มตา +ก้มหลัง +ก้มหัว +กมัณฑลุ +กมุท +กร +กรก +กรกช +กรกฎ +กรกฎาคม +กรกฏ +กรง +กรงทอง +กรงเล็บ +กรชกาย +กรณฑ์ +กรณิการ์ +กรณี +กรณีย- +กรณีย์ +กรณียะ +กรด +กรน +กรนทา +กรนนเช้า +กรบ +กรบูร +กรพินธุ์ +กรภุม +กรม +กรมกรอม +กรมการ +กรมการพิเศษ +กรมเกรียม +กรมท่า +กรมท่าขวา +กรมท่าซ้าย +กรมธรรม์ +กรมธรรม์ประกันภัย +กรมนา +กรมวัง +กรมศักดิ์ +กรร +กรรกง +กรรกฎ +กรรกศ +กรรเกด +กรรไกร +กรรเจียก +กรรชิง +กรรชิด +กรรเชอ +กรรเช้า +กรรเชียง +กรรโชก +กรรซ้นน +กรรแซง +กรรฐ์ +กรรฐา +กรรณ +กรรณยุคล +กรรณา +กรรณิกา +กรรณิการ์ +กรรดิ +กรรดิก +กรรดึก +กรรตุ +กรรตุ- +กรรตุการก +กรรตุวาจก +กรรตุสัญญา +กรรไตร +กรรทบ +กรรแทก +กรรแทรก +กรรบาสิก +กรรบาสิกพัสตร์ +กรรบิด +กรรบูร +กรรปาสิก +กรรปุร +กรรพุม +กรรพุ่ม +กรรภิรมย์ +กรรม +กรรม- +กรรม์ +กรรมกร +กรรมกรณ์ +กรรมการ +กรรมการก +กรรมการิณี +กรรมขัย +กรรมคติ +กรรมชรูป +กรรมชวาต +กรรมฐาน +กรรมบถ +กรรมพันธุ์ +กรรม์ภิรมย์ +กรรมวาจก +กรรมวาจา +กรรมวาจาจารย์ +กรรมวิธี +กรรมวิบาก +กรรมเวร +กรรมศาลา +กรรมสัมปาทิก +กรรมสิทธิ์ +กรรมสิทธิ์เครื่องหมายและยี่ห้อการค้าขาย +กรรมสิทธิ์ผู้แต่งหนังสือ +กรรมสิทธิ์รวม +กรรมัชวาต +กรรมาชีพ +กรรมาธิการ +กรรมาร +กรรลี +กรรลึง +กรรษก +กรรสะ +กรรแสง +กรรหาย +กรรเหิม +กรรโหย +กรรเอา +กรรุณา +กรวด +กรวดน้ำ +กรวน +กรวบ +กรวม +กร้วม +กรวย +กรวยเชิง +กรวยบ้าน +กรวยป่า +กรวิก +กรสาปน์ +กรสุทธิ์ +กรอ +กร้อ +กรอก +กร็อกกร๋อย +กรอกแกรก +กรอกรุย +กรอง +กรองกรอย +กรองทอง +กรอด +กร่อน +กรอบ +กรอบเกรียบ +กรอบแกรบ +กรอบเช็ดหน้า +กรอบหน้า +กรอม +กร่อม +กร่อมๆ +กร่อย +กระ +กระกร +กระกรับกระเกรียบ +กระกรี๊ด +กระกรุ่น +กระกลับกลอก +กระกวด +กระกอง +กระกัด +กระกี้ +กระกูล +กระเกรอก +กระเกริก +กระเกริ่น +-กระเกรียบ +กระเกรียม +กระเกรียว +กระเกรี้ยว +กระเกลือก +กระคน +กระคาย +กระคุก +กระงกกระงัน +กระงกกระเงิ่น +กระง่องกระแง่ง +-กระงอด +กระง่อนกระแง่น +กระเง้ากระงอด +กระโงก +กระจก +กระจกเงา +กระจกตา +กระจกนูน +กระจกฝ้า +กระจกเว้า +กระจกหุง +กระจง +กระจร +กระจอก +กระจอกงอกง่อย +กระจอกชวา +กระจอกเทศ +กระจองหง่อง +กระจ๋องหง่อง +กระจองอแง +กระจ้อน +กระจอนหู +กระจ้อย +กระจ้อยร่อย +กระจ๋อหวอ +กระจะ +กระจัก +กระจัง +กระจังหลังเบี้ย +กระจัด +กระจัดกระจาย +กระจัดพลัดพราย +กระจับ +กระจับบก +กระจับปิ้ง +กระจับปี่ +กระจ่า +กระจ่าง +กระจาด +กระจาน +กระจาบ +-กระจาม +กระจาย +กระจายนะมณฑล +กระจายเสียง +กระจายหางดอก +กระจาว +-กระจิก +-กระจิ๋ง +กระจิด +กระจิบ +-กระจิบ +-กระจิ๋ม +กระจิริด +กระจิ๋ว +กระจิ๋วหลิว +กระจี้ +-กระจี๋ +กระจุก +กระจุกกระจิก +กระจุกกระจุย +กระจุ๋งกระจิ๋ง +กระจุบ +กระจุ๊บ +กระจุบกระจิบ +กระจุ๋มกระจิ๋ม +กระจุย +กระจุยกระจาย +กระจู้ +กระจู๋กระจี๋ +กระจูด +กระเจอะกระเจิง +กระเจา +กระเจ่า +กระเจ้า +กระเจาะ +กระเจิง +กระเจิดกระเจิง +กระเจี้ยง +กระเจี๊ยบ +กระเจี๊ยบเปรี้ยว +กระเจียว +กระเจี๊ยว +กระแจะ +กระโจน +กระโจม +กระโจมกระจาม +กระโจมทอง +กระโจมไฟ +กระโจมอก +กระฉง +กระฉอก +กระฉอกกระแฉก +กระฉ่อน +กระฉับกระเฉง +กระฉิ่ง +กระฉีก +กระฉูด +กระเฉก +-กระเฉง +กระเฉด +-กระแฉก +กระแฉ่น +กระโฉกกระเฉก +กระโฉม +กระชง +กระชดกระช้อย +-กระชวย +กระชอก +กระชอน +กระชอม +กระชอมดอก +กระช้อย +กระช้อยนางรำ +กระชัง +กระชังหน้าใหญ่ +กระชั้น +กระชับ +กระชาก +กระช่าง +กระชาเดิม +กระชาย +กระชิง +กระชิด +กระชุ +กระชุก +กระชุ่มกระชวย +กระเชอ +กระเชอก้นรั่ว +กระเชา +กระเช้า +กระเช้าผีมด +กระเช้าสวรรค์ +กระเช้าสีดา +กระเชียง +กระแชง +กระแชะ +กระโชก +กระโชกกระชั้น +กระโชกกระชาก +กระโชกโฮกฮาก +กระซวย +-กระซวย +-กระซ้อ +กระซ่องกระแซ่ง +กระซับ +กระซ่าง +กระซาบ +กระซิก +กระซิกๆ +กระซิกกระซวย +กระซิกกระซี้ +กระซิบ +กระซิบกระซาบ +-กระซี้ +กระซี้กระซ้อ +กระซุง +กระซุบกระซิบ +กระซุ้ม +กระซู่ +-กระเซ +กระเซ็น +กระเซอ +กระเซอะกระเซอ +กระเซอะกระเซิง +กระเซ้า +กระเซ้ากระซี้ +กระเซิง +-กระเซิง +กระแซ +กระแซะ +กระโซกระเซ +กระฎี +กระฎุมพี +กระดก +กระดกกระดนโด่ +กระด้ง +-กระดนโด่ +กระดวง +กระดวน +กระด้วมกระเดี้ยม +กระดอ +กระดอง +กระดองหาย +กระดอน +กระดอม +กระดักกระเดี้ย +กระดังงัว +กระดังงา +กระดังงาจีน +กระดังงาเถา +กระดังงาลนไฟ +กระดาก +กระดากกระเดื่อง +กระด้าง +กระด้างกระเดื่อง +กระดางลาง +กระดาด +กระดาดขาว +กระดาดดำ +กระดาดแดง +กระดาน +กระดานชนวน +กระดานชัย +กระดานดำ +กระดานโต้คลื่น +กระดานถีบ +กระดานพน +กระดานพิง +กระดานไฟ +กระดานลื่น +กระดานเลียบ +กระดานหก +กระดาษ +กระดาษแก้ว +กระดาษข่อย +กระดาษไข +กระดาษเงินกระดาษทอง +กระดาษซับ +กระดาษทราย +กระดาษเทศ +กระดาษฟาง +กระดาษว่าว +กระดาษสา +กระดำกระด่าง +กระดิก +กระดิกกระเดี้ย +กระดิ่ง +-กระดิ้ง +กระดิ่งทอง +กระดิบ +กระดิบๆ +กระดี่ +กระดี้กระเดียม +กระดี่ได้น้ำ +กระดึง +กระดึงช้างเผือก +กระดึงพระราม +กระดืบ +กระดุ +กระดุกกระดิก +กระดุ้งกระดิ้ง +กระดุบๆ +กระดุบกระดิบ +กระดุม +กระดูก +กระดูกกบ +กระดูกไก่ดำ +กระดูกขัดมัน +กระดูกเขียด +กระดูกแข็ง +กระดูกค่าง +กระดูกงู +กระดูกดำ +กระดูกร้องได้ +กระดูกสันหลัง +กระดูกอึ่ง +-กระเดก +กระเด้ง +กระเด็น +กระเด้า +กระเด้าดิน +กระเด้าลม +กระเดาะ +กระเดาะปาก +กระเดิด +-กระเดี้ย +กระเดียด +-กระเดียม +-กระเดี้ยม +กระเดือก +กระเดื่อง +กระแด็กๆ +กระแด้ง +กระแด้แร่ +กระแด่วๆ +กระแดะ +กระแดะกระแด๋ +กระโดก +กระโดกกระเดก +กระโดง +กระโดงคาง +กระโดงแดง +กระโดด +กระโดดร่ม +กระโดน +กระโดนดิน +กระใด +กระได +กระไดแก้ว +กระไดลิง +กระตรกกระตรำ +กระตร้อ +กระตรับ +กระตราก +-กระตรำ +กระตรุด +กระตรุม +กระต้วมกระเตี้ยม +กระต้อ +กระต่องกระแต่ง +กระต๊อบ +กระต้อยตีวิด +กระตัก +กระตั้ว +-กระตาก +กระต่าย +กระต่ายขูด +กระต่ายจันทร์ +กระต่ายจาม +กระต่ายจีน +กระต่ายชมจันทร์ +กระต่ายต้องแร้ว +กระต่ายตื่นตูม +กระต่ายเต้น +กระต่ายสามขา +กระต่ายหมายจันทร์ +กระติก +-กระติก +-กระติ้ง +กระติ๊ด +กระติ๊ดขี้หมู +กระติบ +กระตือรือร้น +กระตุก +กระตุกกระติก +กระตุ้งกระติ้ง +กระตุ่น +กระตุ้น +กระตูบ +กระเตง +กระเต็น +กระเตอะ +กระเตาะ +กระเตาะกระแตะ +-กระเตี้ยม +กระเตื้อง +กระแต +-กระแต่ง +กระแตแต้แว้ด +กระแตไต่ไม้ +กระแตวับ +-กระแตะ +กระโตกกระตาก +กระโตน +กระไตร +กระถด +กระถอบ +กระถั่ว +กระถาง +กระถิก +กระถิน +กระถินหอม +กระถึก +กระเถิบ +กระโถน +กระโถนท้องพระโรง +กระโถนปากแตร +กระโถนฤๅษี +กระทก +กระทง +กระทงแถลง +กระทงน้อย +กระทงป่า +กระทงเพชร +กระทงลอย +กระทงลาย +กระทงเหิน +กระทด +กระทดกระทัน +กระทบ +กระทบกระทั่ง +กระทบกระเทียบ +กระทบกระเทือน +กระทบกระแทก +กระทรวง +กระทวย +กระทอก +กระท้อน +กระท่อนกระแท่น +กระท่อม +กระท้อมกระแท้ม +กระท่อมขี้หมู +กระท่อมเลือด +กระทะ +กระทะใบบัว +กระทั่ง +กระทั่งติด +-กระทัน +-กระทั้น +กระทา +กระทาชาย +กระทาย +กระทายเหิน +กระทาสี +กระทาหอง +กระทำ +กระทำความผิด +กระทิกกระทวย +กระทิง +กระทิงโทน +กระทึง +กระทืบ +กระทืบธรณี +กระทืบยอบ +กระทุ +กระทุง +กระทุ้ง +กระทุงลาย +กระทุ้งเส้า +กระทุงหมาบ้า +กระทุงเหว +กระทุ่ม +กระทุ่มขี้หมู +กระทุ่มนา +กระทุ่มหมู +กระทู้ +กระทู้ถาม +กระเท่ +กระเท่เร่ +-กระเทียบ +กระเทียม +กระเทียมหอม +กระเทือน +กระเทือนใจ +กระเทื้อม +กระแทก +กระแทกกระทั้น +กระแท่น +-กระแท้ม +กระแทะ +กระไทชาย +กระนก +กระน่อง +กระนั้น +กระนี้ +กระโน้น +กระไน +กระบก +กระบกคาย +กระบถ +กระบม +กระบวน +กระบวนกระบิด +กระบวนการ +กระบวนการยุติธรรม +กระบวนความ +กระบวนจีน +กระบวย +กระบวร +กระบอก +กระบอกเพลา +กระบอกสูบ +กระบอกเสียง +กระบอกหัว +กระบอง +กระบองกลึง +กระบองกัน +กระบองเพชร +กระบองราหู +กระบะ +กระบัด +กระบั้วกระเบี้ย +กระบ่า +กระบ้า +กระบาก +กระบาย +กระบาล +กระบิ +กระบิ้ง +กระบิด +กระบิดกระบวน +กระบิล +กระบี่ +กระบี่กระบอง +กระบี่ธุช +กระบี่ลีลา +กระบือ +กระบือเจ็ดตัว +กระบุง +กระบุ่มกระบ่าม +กระบู้กระบี้ +กระบูน +กระบูนเลือด +กระบูร +กระเบง +กระเบญ +กระเบ็ดกระบวน +กระเบน +กระเบนเหน็บ +กระเบา +กระเบิก +-กระเบี้ย +กระเบียด +กระเบียดกระตัก +กระเบียดกระเสียร +กระเบียน +กระเบื้อง +กระเบื้องเกล็ดเต่า +กระเบื้องถ้วย +กระเบื้องถ้วยกะลาแตก +กระเบื้องปรุ +กระเบื้องรู +กระเบื้องหน้าวัว +กระแบ่ +กระแบก +กระแบกงา +กระแบะ +กระแบะมือ +กระโบม +กระปมกระปำ +กระปมกระเปา +กระปรอก +กระปรอกว่าว +กระปรี้กระเปร่า +กระปอก +กระป้อกระแป้ +กระป่อง +กระป๋อง +กระปอดกระแปด +กระป๋อหลอ +กระปั้วกระเปี้ย +-กระปำ +กระป่ำ +-กระปิ่ม +กระปุก +กระปุกหลุก +กระปุ่ม +กระปุ่มกระป่ำ +กระปุ่มกระปิ่ม +-กระเปา +กระเป๋า +กระเป๋าหนัก +กระเปาะ +กระเปาะเหลาะ +-กระเปี้ย +-กระแป้ +-กระแปด +กระโปก +กระโปรง +กระโปรงทอง +กระผม +-กระผลาม +กระผลีกระผลาม +กระผาน +กระผีก +กระผีกริ้น +กระพรวน +กระพริ้ม +กระพอก +กระพอกวัว +กระพอง +กระพ้อม +กระพัก +กระพัง +กระพังเหิร +กระพังโหม +กระพัด +กระพัดแม่ม่าย +กระพัตร +กระพัน +กระพั่น +กระพา +กระพาก +กระพี้ +กระพี้เขาควาย +กระพือ +กระพือข่าว +กระพือปีก +กระพุ้ง +กระพุ่ม +กระพุ่มมือ +กระเพลิศ +กระเพาะ +กระเพาะปลา +กระเพิง +กระเพื่อม +กระแพง +กระแพ้ง +กระฟัดกระเฟียด +-กระฟาย +กระฟูมกระฟาย +-กระเฟียด +กระมล +กระมอบ +กระมอมกระแมม +กระมัง +กระมัน +กระมิดกระเมี้ยน +กระมึน +กระมุท +กระเมาะ +-กระเมี้ยน +-กระแมม +กระย่อง +-กระย่อง +กระย่องกระแย่ง +กระย่อน +กระย่อม +กระยา +กระยาคชวาง +กระยาง +กระยาจก +-กระยาด +กระยาดอก +กระยาดอกเบี้ย +กระยาทาน +กระยาทิพย์ +กระยาบวช +กระยาเบี้ย +กระยารงค์ +กระยาเลย +กระยาสนาน +กระยาสังเวย +กระยาสังแวง +กระยาสารท +กระยาเสวย +กระยาหงัน +กระยาหาร +กระยิก +กระยิ้มกระย่อง +กระยึกกระยือ +กระยืดกระยาด +กระเย้อกระแหย่ง +-กระแย่ง +กระรอก +กระรอกน้ำข้าว +กระเรียน +กระโรกน้ำข้าว +กระโรกใหญ่ +กระไร +กระลด +กระลบ +กระลอก +กระลอม +กระละหล่ำ +กระลัด +กระลับ +กระลับกระเลือก +กระลัมพร +กระลา +กระลาการ +กระลาพิน +กระลายกระลอก +กระลาศรี +กระลำ +กระลำพร +กระลำพัก +กระลำพุก +กระลิง +กระลี +กระลึง +กระลุมพาง +กระลุมพุก +กระลุมพู +กระลูน +กระลู่น์ +กระเล็น +กระเลียด +กระเลือก +กระโลง +กระวน +กระวนกระวาย +กระวัด +กระว่า +-กระวาด +กระวาน +กระวาย +กระวายกระวน +กระวิน +กระวี +กระวีกระวาด +กระวูดกระวาด +กระเวน +กระเวนกระวน +กระเวยกระวาย +กระแวน +กระโวยกระวาย +กระศก +กระศัย +กระษัตริย์ +กระษัตรี +กระษัย +กระษัยกล่อน +กระษาปณ์ +กระษิร +กระเษม +กระเษมสานต์ +กระเษียร +กระสง +-กระสน +กระสบ +กระสม +กระสรวล +กระสร้อย +กระสวน +กระสวย +กระสอบ +กระสะ +กระสัง +กระสัน +กระสับกระส่าย +กระสา +กระสานติ์ +กระสาบ +กระสาย +-กระส่าย +กระสินธุ +กระสือ +กระสือดูด +กระสุงกระสิง +กระสุน +กระสุนปืน +กระสุนวิถี +กระสูทธิ์ +กระสูบ +กระเสด +กระเส็นกระสาย +กระเส่า +กระเสาะกระแสะ +กระเสียน +กระเสียร +กระเสือกกระสน +กระแส +กระแสการเงิน +กระแสความ +กระแสง +กระแสจิต +กระแสตรง +กระแสน้ำ +กระแสพระราชดำรัส +กระแสรับสั่ง +กระแสลม +กระแสสลับ +กระแสเสียง +กระแสะ +กระโสง +กระไส +กระหง่อง +กระหน +กระหนก +กระหนกกินรี +กระหนกนฤมิต +กระหนกนารี +กระหน่อง +กระหนาก +กระหนาบ +กระหนาบคาบเกี่ยว +กระหน่ำ +กระหมวด +กระหมอบ +กระหม่อม +กระหม่อมบาง +กระหมั่ง +กระหม่า +-กระหมิด +กระหมิบ +กระหมุดกระหมิด +กระหมุ่น +กระหมุบ +กระหมุบกระหมิบ +กระหย่ง +กระหยด +กระหยบ +กระหย่อน +กระหย่อม +กระหยะ +กระหยัง +กระหยับ +กระหยิ่ม +กระหรอด +กระหริ่ง +กระหวน +กระหวัด +กระหวัดเกล้า +กระหว่า +กระหอง +กระหัง +กระหัด +กระหาง +กระหาย +กระหึม +กระหึ่ม +กระหืดกระหอบ +กระเห็น +กระเหน็จ +กระเหน็จกระแหน่ +กระเหนียด +กระเหม็ดกระเหมียด +กระเหม็ดกระแหม่ +กระเหม่น +กระเหม่า +กระเหลียก +กระเหว่า +กระเห่อ +กระเหิม +กระเหี้ยนกระหือรือ +กระแห +กระแหทอง +-กระแหน +กระแหน่ +กระแหนบ +กระแหนะ +กระแหนะกระแหน +กระแหมบ +กระแหม่ว +กระแหย่ง +กระแหร่ม +กระแหล่ง +กระโห้ +กระโหนด +กระโหม +กระโหย +กระโหย่ง +-กระอ่วน +กระอวล +กระอ้อกระแอ้ +กระออดกระแอด +กระออบ +กระออม +กระอ้อมกระแอ้ม +กระออมน้ำ +กระอัก +กระอักกระอ่วน +กระอักกระไอ +กระอั้วแทงควาย +กระอ้า +กระอาน +กระอิด +กระอิดกระเอื้อน +กระอึก +กระอึกกระอัก +กระอึด +กระอืด +กระอุ +กระอุก +กระเอบ +กระเอา +กระเอิก +กระเอิบ +-กระแอ้ +กระแอก +-กระแอด +กระแอบ +กระแอม +-กระแอ้ม +กระไอ +กระไอกระแอม +กรัก +กรักขี +กรัง +กรัชกาย +กรัณฑ- +กรัณฑ์ +กรัณย์ +กรัน +กรับ +กรัม +กราก +กราง +กร่าง +กรางเกรียง +กราด +-กราด +กราดเกรี้ยว +กราดวง +กราน +กร้าน +กรานกฐิน +กราบ +กราบพระ +กราฟ +กราม +กรามช้าง +กรามพลู +กราย +กร่าย +กราล +กราว +กร้าว +กราวด่าง +กราวรูด +กราสิก +กรำ +กร่ำ +กร่ำกรุ่น +กริก +กริ๊ก +กริกกริว +กริกกรี +กริ่ง +กริ๊ง +กริงกริว +กริ้งกริ้ว +กริ่งเกรง +กริ่งใจ +กริช +กริณี +กริตย- +กริน +กรินทร์ +กรินี +กริบ +กริม +กริ่ม +กริยา +กริยานุเคราะห์ +กริยาวิเศษณ์ +กริยาวิเศษณ์วลี +กริยาวิเศษณานุประโยค +กริว +กริ้ว +กริวกราว +กริวลาย +กรี +กรีฑา +กรีฑากร +กรีฑาภิรมย์ +กรีฑารมย์ +กรีฑาสถาน +กรีด +กรี๊ด +กรีดกราด +กรีดกราย +กรีดนิ้ว +กรีธา +กรีธาทัพ +กรีธาพล +กรีษ +กรีส +กรึง +กรุ +กรุก +กรุกกรัก +กรุกกรู๊ +กรุง +กรุ้งกริ่ง +กรุงเขมา +กรุงพาลี +กรุณ +กรุณา +กรุณาทฤคุณ +กรุน +กรุ่น +กรุบ +กรุบกริบ +กรุ่ม +กรุ้มกริ่ม +กรุย +กรุยกราย +กรุยเกรียว +กรู +กรูด +กรูม +กเรณุ +กเรณุกา +กเรนทร +กเรนทร์ +กฤช +กฤด- +กฤดยาเกียรณ +กฤดา +กฤดาการ +กฤดาญชลี +กฤดาธิการ +กฤดาภินิหาร +กฤดาอัญชลี +กฤดิ +กฤดีกา +กฤตติกา +กฤตย- +กฤตยฎีกา +กฤตยา +กฤติกา +กฤติยา +กฤษฎา +กฤษฎาญ +กฤษฎาญชลิต +กฤษฎาญชลี +กฤษฎาญชวลิตวา +กฤษฎาญชวลิศ +กฤษฎาญชวเลศ +กฤษฎาญชุลี +กฤษฎาธาร +กฤษฎาภินิหาร +กฤษฎี +กฤษฎีกา +กฤษณา +กล +กล- +กลไก +กลฉ้อฉล +กลด +กลดกำมะลอ +กลดพระสุเมรุ +กล่น +กลบ +กลบเกลี่ย +กลบเกลื่อน +กลบท +กลบบัตรสุมเพลิง +กลพยาน +กลไฟ +กลม +กลมกล่อม +กลมกลืน +กลมกลืนกลอน +กลมเกลียว +กลมดิก +กลมเป็นลูกมะนาว +กลมภ +กลเม็ด +กลยุทธ์ +กลละ +กลวง +กลวม +กล้วย +กล้วยกล้าย +กล้วยแขก +กล้วยงวงช้าง +กล้วยเต่า +กล้วยใต้ +กล้วยน้อย +กล้วยไม้ +กล้วยสั้น +กล้วยหมูสัง +กลวิธี +กลศ +กลศาสตร์ +กลหาย +กลเหย +กล้อ +กลอก +กลอกกลับ +กลอกแกลก +กลอง +กล่อง +กล้อง +กล้องแกล้ง +กล้องจุลทรรศน์ +กล้องตุด +กล้องโทรทรรศน์ +กลองเพล +กล้องระดับ +กล้องวัดมุม +กล้องสนาม +กล้องสลัด +กล้องส่องทางไกล +กล้องสำรวจ +กลอน +กล่อน +กล้อน +กลอนด้น +กลอนตลาด +กลอนลิลิต +กลอนสด +กลอนสวด +กลอนสุภาพ +กล่อม +กล่อมเกลา +กล่อมเกลี้ยง +กล้อมแกล้ม +กล่อมท้อง +กล่อมมดลูก +กล่อมหอ +กลอย +กลอักษร +กลอุปกรณ์ +กลัก +กลัง +กลัด +กลัดกลุ้ม +กลัดมัน +กลั่น +กลั้น +กลั่นกรอง +กลั่นแกล้ง +กลั้นใจ +กลันท +กลันทก์ +กลับ +กลับกลอก +กลับกลาย +กลับเกลือก +กลับคำ +กลับคืน +กลับตาลปัตร +กลับเนื้อกลับตัว +กลับไปกลับมา +กลับหน้ามือเป็นหลังมือ +กลัมพก +กลัมพร +กลัมพัก +กลัว +กลั้ว +กลั้วเกลี้ย +กลั้วคอ +กลัวน้ำ +กลัวลาน +กลา +กล่า +กล้า +กลาก +กลากลาด +กลาง +กลางเก่ากลางใหม่ +กลางคน +กลางคัน +กลางค่ำ +กลางคืน +กลางแจ้ง +กลางใจมือ +กลางช้าง +กลางดิน +กลางดึก +กลางเดือน +กลางทาสี +กลางนอก +กลางบ้าน +กลางแปลง +กลางเมือง +กลางวัน +กลางหาว +กลาด +กลาดเกลื่อน +กล้าได้กล้าเสีย +กล้านักมักบิ่น +กลาบาต +กลาป +กล้าม +กลาย +กล้าย +กลายกลอก +กล่าว +กล่าวเกลี้ยง +กล่าวขวัญ +กล่าวโทษ +กล่าวหา +กล่าวโอม +กลาโหม +กล่ำ +กล้ำ +กล้ำกราย +กล้ำกลืน +กลิ่ง +กลิ้ง +กลิ้งกลอก +กลิ้งกลางดง +กลิ้งเกลือก +กลิงค์ +กลิ้งครกขึ้นเขา +กลิ้งเป็นลูกมะนาว +กลิ่น +กลิ่นอาย +กลิ้ม +กลี +กลี่ +กลีบ +กลีบตา +กลีบบัว +กลีบหิน +กลึง +กลึ้ง +กลึงกล่อม +กลึงค์ +กลืน +กลืนไม่เข้าคายไม่ออก +กลุ่ม +กลุ้ม +กลุ้มใจ +กลุ้มรุม +กลุ้มอกกลุ้มใจ +กลู่ +กลูโคส +กลูน +กลูน์ +กเลวระ +กวด +กวดขัน +กวน +กวนน้ำให้ขุ่น +กวม +กวย +กวยจั๊บ +กวยจี๊ +ก๋วยเตี๋ยว +กวะ +กวะกวัก +กวะแกว่ง +กวัก +กวัด +กวัดแกว่ง +กวัดไกว +กวัดไกวไสส่ง +กวา +กว่า +กว้า +กวาง +กว่าง +กว้าง +กว้างขวาง +กวางเขน +กวางแขม +กวางจุก +กวางโจน +กว่างชน +กวางชะมด +กว่างโซ้ง +กวางเดินดง +กวางตุ้ง +กวางทราย +กวางทอง +กวางป่า +กวางม้า +กว้างใหญ่ +กว่าชื่น +กวาด +กวาดต้อน +กวาดตา +กวาดล้าง +กวาน +กว่าน +กว้าน +กว๊าน +กว่าเพื่อน +กว้าว +กวาวเครือ +กวิน +กวี +กวีนิพนธ์ +กษณะ +กษมา +กษัตร +กษัตรา +กษัตราธิราช +กษัตริย์ +กษัตริยชาติ +กษัตรี +กษัตรีย์ +กษัตรีศูร +กษัย +กษัย- +กษัยกล่อน +กษัยการ +กษัยน้ำ +กษัยเลือด +กษาปณ์ +กษิดิ +กษีณาศรพ +กษีดิ +กษีร +กษีร- +กษีรธารา +กษีรรส +กษีรามพุ +กษีรารณพ +กสานติ์ +กสิ +กสิกร +กสิกรรม +กสิณ +กหังปายา +ก หัน +กหาปณะ +ก็แหละ +กเฬวราก +กอ +ก่อ +ก้อ +ก๊อ +กอก +ก๊อก +ก่อกรรมทำเข็ญ +ก่อกวน +ก่อการ +กอแก +กอง +ก่อง +ก้อง +กองกลาง +กองกอย +กองกูณฑ์ +กองเกิน +กองเกียรติยศ +กองข้าว +กองโจร +กองทัพ +กองทัพน้อย +กองทุน +กองพล +กองพัน +กองฟอน +กองมรดก +กองร้อย +กองหนุน +กอซ +กอด +กอดแข้งกอดขา +กอดมือกอดตีน +กอดอก +ก่อตั้ง +ก่อน +ก้อน +ก้อนขี้หมา +ก้อนเส้า +กอบ +กอบโกย +กอบด้วย +กอบนาง +ก๊อบปี้ +กอปร +ก้อม +กอมก้อ +ก่อมก้อ +กอย +ก้อย +ก๋อย +ก้อร่อ +ก้อร่อก้อติก +ก่อร่างสร้างตัว +กอริลลา +ก่อฤกษ์ +กอล์ฟ +ก่อแล้วต้องสาน +กอและ +ก่อสร้าง +ก่อหวอด +กอเอี๊ยะ +กะ +กะกร่อม +กะกร้าว +กะกลิ้ง +กะก่อง +กะกัง +กะกึก +กะเกณฑ์ +กะเกาะ +กะโกระ +กะง้อนกะแง้น +กะจัง +กะแจะ +กะชะ +กะชัง +กะชามาศ +กะชิง +กะชึ่กกะชั่ก +กะแช่ +กะซวก +กะซ้าหอย +กะซี่ +กะโซ่ +กะโซ้ +กะดก +กะดง +กะดวน +กะดอกๆ +กะดะ +กะดังบาย +กะดัด +กะด้าง +กะดำกะด่าง +กะดี +กะดี่ +กะดุ้ง +กะเด้ +กะเดก +กะเดี๋ยว +กะได +กะตรุด +กะตอก +กะต่อย +กะตัก +กะตัง +กะตังกะติ้ว +กะตังใบ +กะตังมูตร +กะต่า +กะต๊าก +กะต้ำ +กะติ๊กริก +กะติงกะแตง +กะตีบ +กะตึงกะแตง +กะตุ๊ก +กะตุด +กะตุมู +กะตูก +กะเตก +กะเตงๆ +กะเตงเรง +กะแตว +กะแต่ว +กะโต๊ก +กะโตงกะเตง +กะโต้งโห่ง +กะถัว +กะทกรก +กะทอ +กะทัง +กะทังหัน +กะทัดรัด +กะทัน +กะทันหัน +กะทับ +กะทำ +กะทิ +กะทิขูด +กะทือ +กะทุน +กะเทย +กะเทยนางหมั่น +กะเทาะ +กะแท้ +กะแท่ง +กะแทน +กะนวล +กะนัด +กะบอนกะบึง +กะบ่อนกะแบ่น +กะบัง +กะบั้ง +กะบังรังเฝือก +กะบังลม +กะบังหน้า +กะบิ้ง +กะบิล +กะบึงกะบอน +กะบุด +กะเบ้อ +กะเบียน +กะเบือ +กะปริดกะปรอย +กะปริบ +กะปริบกะปรอย +กะปลกกะเปลี้ย +กะปวกกะเปียก +กะปอม +กะปอมขาง +กะปะ +กะปั่น +กะป้ำกะเป๋อ +กะปิ +กะปู +กะปูด +กะปูดหลูด +กะเปะ +กะเปิ๊บกะป๊าบ +กะเปียด +กะแป้น +กะแปะ +กะโปรง +กะโปโล +กะผลุบกะโผล่ +กะเผ่น +กะเผลก +กะโผลกกะเผลก +กะพง +กะพรวดกะพราด +กะพร่องกะแพร่ง +กะพริบ +กะพรุน +กะพรูดกะพราด +กะพล้อ +กะพล่องกะแพล่ง +กะพ้อ +กะเพรา +กะเพียด +กะเพียดช้าง +กะเพียดหนู +กะมง +กะม่ง +กะเม็ง +กะเม็งตัวผู้ +กะเมีย +กะยุ +กะร่องกะแร่ง +กะระตะ +กะระหนะ +กะรัง +กะรัต +กะรัตหลวง +กะราง +กะรางหัวขวาน +กะริง +กะริงกะเรียด +กะรุงกะรัง +กะรุ่งกะริ่ง +กะรุน +กะเร +กะเรกะร่อน +กะเร่กะร่อน +กะเร่อ +กะเร่อกะร่า +กะเรี่ยกะราด +กะโรกะเร +กะลวย +กะลอ +กะล่อกะแล่ +กะลอจี๊ +กะล่อน +กะล่อมกะแล่ม +กะล่อยกะหลิบ +กะละปังหา +กะละมัง +กะละแม +กะละออม +กะลังตังไก่ +กะลัน +กะลันทา +กะลา +กะลาง +กะลาซอ +กะลาสี +กะลำพอ +กะลิง +กะลิงปลิง +กะลิ้มกะเหลี่ย +กะลิอ่อง +กะลุมพี +กะเล็ง +กะเล่อกะล่า +กะเลิด +กะเลียว +กะแล +กะโล่ +กะโลง +กะวอกกะแวก +กะวะ +กะส้มชื่น +กะส้าหอย +กะหนอกะแหน +กะหน็องกะแหน็ง +กะหนะ +กะหนุงกะหนิง +กะหมอก +กะหร่อง +กะหรอด +กะหร็อมกะแหร็ม +กะหราน +กะหรี่ +กะหรี่ปั๊บ +กะหลาป๋า +กะหล่ำ +กะหลี่ +กะหลีกะหลอ +กะหลุกกะหลิก +กะหำ +กะหำแพะ +กะหือ +กะหูด +กะเหรี่ยง +กะเหลาะเปาะ +กะแหยก +กะแหะ +กะโหลก +กะโหล้ง +กะไหล่ +กะอวม +กะออม +กะอาน +กะอาม +กะอิด +กะอุบ +กะเอว +กะแอ +กะแอน +กัก +กั๊ก +กักกรา +กักกัน +กักการุ +กักขฬะ +กักขัง +กักคุม +กักด่าน +กักตัว +กักตุน +กักบริเวณ +กัง +กั้ง +กังก +กั้งกระดาน +กังก้า +กังเกียง +กังขา +กังฉิน +กังฟู +กังวล +กังวาน +กังเวียน +กังส +กังสดาล +กังไส +กังหัน +กังหันใบพัด +กังหันไอพ่น +กัจฉปะ +กัจฉะ +กัจฉา +กัญ +กัญจุก +กัญจุการา +กัญชา +กัญญา +กัฐ +กัณฏกะ +กัณฐ- +กัณฐก +กัณฐกะ +กัณฐชะ +กัณฐัศ +กัณฐัศว์ +กัณฐา +กัณฐี +กัณฑ์ +กัณฑ์เทศน์ +กัณณ์ +กัณห- +กัณหธรรม +กัณหปักษ์ +กัด +กัดป่า +กัดฟัน +กัดลาก +กัดวาง +กัดหางตัวเอง +กัตติกมาส +กัตติกา +กัตติเกยา +กัตรทัณฑ์ +กัตรา +กัทลี +กัน +กั่น +กั้น +กันกง +กั้นกาง +กันเกรา +กันไกร +กันเขากันเรา +กันชน +กันชิง +กันชีพ +กันเชอ +กั้นซู่ +กันแซง +กันดอง +กันดาร +กันดาล +กันแดด +กันได +กันต์ +กันตัง +กันตัว +กันไตร +กันทร +กันทรากร +กันทะ +กันท่า +กันแทรก +กั้นบัง +กันพิรุณ +กันภัย +กันภิรมย์ +กันเมียง +กันย์ +กันยา +กันยายน +กันลง +กันลอง +กันลึง +กันและกัน +กันสาด +กันแสง +กั้นหยั่น +กันเอง +กันเอา +กับ +กับแก้ +กับแกล้ม +กับข้าว +กับบุเรศ +กับระเบิด +กัป +กัปตัน +กัปนก +กัปบาสิก +กัปปาสิก +กัปปิย- +กัปปิยการก +กัปปิยภัณฑ์ +กัปปิยโวหาร +กัปปิยะ +กัปปีย์ +กัมบน +กัมป- +กัมปน- +กัมปนาการ +กัมปนาท +กัมประโด +กัมปี +กัมพล +กัมพุช +กัมพุช- +กัมพุชพากย์ +กัมพู +กัมพูชา +กัมโพช +กัมมัชวาต +กัมมัฏฐาน +กัมมันตภาพรังสี +กัมมันตรังสี +กัมมาร +กัมลาศ +กัยวิกัย +กัลชาญ +กัลบก +กัลป- +กัลป์ +กัลปนา +กัลปพฤกษ์ +กัลปังหา +กัลปาวสาน +กัลปิต +กัลพุม +กัลเม็ด +กัลยา +กัลยาณ- +กัลยาณมิตร +กัลยาณี +กัลยาเยี่ยมห้อง +กัลเว้า +กัลหาย +กัลโหย +กัลออม +กัลเอา +กัศมล +กัศยป +กัษณ +กา +ก๋า +กาก +กาก- +กากกะรุน +กากขยาก +กากข้าว +กากคติ +กากณึก +กากบาท +กากเพชร +กากภาษา +กากรุน +กากหมู +กากะทิง +กากะเยีย +ก๋ากั่น +กากี +กากีแกมเขียว +กาคาบพริก +กาง +ก้าง +กางเกง +กางเกียง +ก้างขวางคอ +กางของ +กางขี้มอด +กางเขน +ก้างปลา +กางเวียน +กาจับหลัก +กาชาด +ก๊าซ +ก๊าซไข่เน่า +ก๊าซเฉื่อย +ก๊าซน้ำตา +กาซะลอง +กาซะลองคำ +กาญจน- +กาญจนา +กาฐ +กาด +ก๊าด +กาน +ก่าน +ก้าน +ก๊าน +ก้านขด +ก้านแข็ง +ก้านคอ +กานดา +กานต์ +ก้านตอง +ก้านต่อดอก +กานท์ +กานน +ก้านบัว +ก้านพร้าว +กานพลู +ก้านมะพร้าว +ก้านยาว +ก้านแย่ง +ก้านเหลือง +กาน้า +กาน้ำ +กาบ +ก้าบๆ +กาบกี้ +กาบเขียง +กาบคู่ +กาบเดียว +กาบเดี่ยว +กาบน้ำจืด +กาบบัว +กาบปูเล +กาบพรหมศร +กาบหอย +กาบุรุษ +กาบู +กาเปี้ยด +กาฝาก +กาพย์ +กาพย์กลอน +กาฟักไข่ +กาเฟอีน +กาแฟ +กาม +กาม- +ก้าม +ก้ามกราม +กามกรีฑา +กามกิจ +ก้ามกุ้ง +ก้ามเกลี้ยง +กามคุณ +กามฉันท์ +ก้ามดาบ +กามตัณหา +กามท- +กามเทพ +กามน +ก้ามปู +ก้ามปูหลุด +กามภพ +กามราค +กามโรค +กามวิตก +กามวิตถาร +กามสมังคี +กามัช +กามา +กามาทีนพ +กามาพจร +กามามิศ +กามารมณ์ +กามาวจร +กามินี +กามิศ +กาเมศ +กาเมสุมิจฉาจาร +กาโมทย +กาย +กาย- +ก่าย +กายกรรม +ก่ายกอง +กายทวาร +กายบริหาร +กายพันธน์ +กายภาพ +กายภาพบำบัด +กายวิภาคศาสตร์ +กายสิทธิ์ +กายาพยพ +กายินทรีย์ +กาเยน +กาเยนทรีย์ +การ +การก +การกลั่นทำลาย +การขนส่งมวลชน +การครัว +การคลัง +การเงิน +การจร +การณ์ +การต่างประเทศ +การ์ตูน +การเต +การนำ +การบ้าน +การบ้านการเมือง +การบุเรียน +การบูร +การบูรป่า +การเปรียญ +การแผ่รังสี +การพา +การเมือง +การย์ +การเรือน +การละเล่น +การวิก +การเวก +การะเกด +การะบุหนิง +การัณย์ +การันต์ +การางหัวขวาน +การิตการก +การิตวาจก +การุญ +การุณย์ +กาเรการ่อน +กาเรียน +กาเรียนทอง +กาล +กาล- +กาลกรรณี +กาลกิณี +กาลกิริยา +กาลจักร +กาลเทศะ +กาลโยค +กาลสมุตถาน +กาลักน้ำ +กาลัญญุตา +กาลัญญู +กาลัด +กาลานุกาล +กาลิก +กาลี +กาแล็กซี +กาแล็กโทส +กาว +ก้าว +ก้าวก่าย +ก้าวเฉียง +ก้าวร้าว +ก้าวล่วง +กาววาว +ก้าวหน้า +กาวาง +กาเวียน +กาแวน +กาศิก +กาศิก- +กาศิกพัสตร์ +กาษฐะ +กาษา +กาสร +กาสะ +กาสัก +กาสา +กาสามปีก +กาสาร +กาสาว- +กาสาวพัสตร์ +กาสาวะ +กาสิโน +กาหล +กาหลง +กาหลงรัง +กาหลา +กาหัก +กาเหว่า +กาไหล่ +กาฬ +กาฬ- +กาฬจักร +กาฬปักษ์ +กาฬปักษี +กาฬพฤกษ์ +กาฬโรค +กาฬวาต +กาฬาวก +กาฮัง +กำ +ก่ำ +ก้ำ +กำกวม +กำกัด +กำกับ +ก้ำกึ่ง +กำกูน +กำเกรียก +ก้ำเกิน +กำเกียง +กำขี้ดีกว่ากำตด +กำคูน +ก่ำเคือ +กำจร +กำจัด +กำจาย +กำชับ +กำชับกำชา +กำชำ +กำโชก +กำซาบ +กำซำ +กำด้น +กำดัด +กำดาล +กำเดา +กำเดาะ +ก่ำต้น +กำตัด +กำตาก +กำถั่ว +กำทวน +กำธร +กำนล +กำนัด +กำนัน +กำนัล +กำเนิด +กำเนียจ +กำบด +กำบน +กำบัง +กำบัด +กำบิด +ก่ำบึ้ง +กำเบ้อ +กำโบล +กำปอ +กำปั่น +กำปั้น +กำผลา +กำพง +กำพด +กำพต +กำพร้า +กำพราก +กำพวด +กำพอง +กำพืด +กำพุด +กำพู +กำเพลิง +กำแพง +กำแพ้ง +กำแพงแก้ว +กำแพงขาว +กำแพงเขย่ง +กำแพงเจ็ดชั้น +กำแพงมีหูประตูมีช่อง +กำแพงมีหูประตูมีตา +กำแพงเศียร +กำภู +กำม +กำมพฤกษ์ +กำมลาศน์ +กำมเลศ +กำมะถัน +กำมะลอ +กำมะหยี่ +กำมะหริด +กำมังละการ +กำมังวิลิต +กำมัชพล +กำมา +กำมือ +กำยาน +กำยำ +กำรอ +กำราก +กำราบ +กำราล +กำรู +กำเริบ +กำเริบเสิบสาน +กำไร +กำลอง +กำลัง +กำลังกิน +กำลังกินกำลังนอน +กำลังใจ +กำลังช้างเผือก +กำลังช้างสาร +กำลังดี +กำลังเทียน +กำลังภายใน +กำลังม้า +กำลังวังชา +กำลังวัวเถลิง +กำลุง +กำลูน +กำเลา +กำเลาะ +กำไล +กำไลคู่ผี +กำสรด +กำสรวล +กำเสาะ +กำแสง +กำหนด +กำหนดการ +กำหนัด +กำหมัด +กำหราก +กำเหน็จ +กำแหง +กิก +กิ๊ก +กิ่ง +กิ่งก้อย +กิ้งก่า +กิ้งกือ +กิ้งกือเหล็ก +กิ้งโครง +กิ่งทองใบหยก +กิงบุรุษ +กิ่งหาย +กิจ +กิจ- +กิจกรรม +กิจการ +กิจจะ +กิจจะลักษณะ +กิจจา +กิจจานุกิจ +กิจวัตร +กิดาการ +กิดาหยัน +กิตติ +กิตติกรรมประกาศ +กิตติคุณ +กิตติมศักดิ์ +กิตติศัพท์ +กิน +กินกริบ +กินกัน +กินกำไร +กินเกลียว +กินเกลือกินกะปิ +กินแกลบกินรำ +กินขวา +กินขาด +กินแขก +กินความ +กินเครา +กินเจ +กินแจ +กินใจ +กินช้อน +กินชัน +กินซ้าย +กินดอก +กินดอกเบี้ย +กินดอง +กินด่าง +กินดาย +กินดิบ +กินตะเกียบ +กินตัว +กินตา +กินตำแหน่ง +กินโต๊ะ +กินแถว +กินทาง +กินที่ +กินที่ลับไขที่แจ้ง +กินนร +กินนรเก็บบัว +กินนรฟ้อนโอ่ +กินนรรำ +กินนรเลียบถ้ำ +กินนอกกินใน +กินนอน +กินน้ำ +กินน้ำตา +กินน้ำใต้ศอก +กินน้ำพริกถ้วยเดียว +กินน้ำไม่เผื่อแล้ง +กินน้ำเห็นปลิง +กินใน +กินบนเรือนขี้บนหลังคา +กินบวช +กินบ้านกินเมือง +กินบุญ +กินบุญเก่า +กินแบ่ง +กินปลิง +กินปลี +กินปูนร้อนท้อง +กินเปล่า +กินเปี้ยว +กินผัว +กินเพรา +กินมือ +กินเมีย +กินเมือง +กินไม่ลง +กินรังแตน +กินริน +กินรี +กินรูป +กินแรง +กินลม +กินลมกินแล้ง +กินล้างกินผลาญ +กินลึก +กินเวลา +กินเศษกินเลย +กินส้อม +กินสั่ง +กินสำรับ +กินสี่ถ้วย +กินเส้น +กินหน้า +กินหลัง +กินหาง +กินหู้ +กินเหมือนหมู อยู่เหมือนหมา +กินเหล็กกินไหล +กินแหนง +กินอยู่กับปาก อยากอยู่กับท้อง +กินอยู่พูวาย +กิ๊บ +กิมตึ๋ง +กิมิชาติ +กิมิวิทยา +กิโมโน +กิโยตีน +กิระ +กิริณี +กิรินท +กิริเนศวร +กิริยา +กิริยาสะท้อน +กิเลน +กิเลส +กิเลส- +กิเลสมาร +กิโล +กิโล- +กิโลกรัม +กิโลไซเกิล +กิโลมกะ +กิโลเมตร +กิโลลิตร +กิโลเฮิรตซ์ +กิ่ว +กิ๋ว +กิ๋วๆ +กี +กี่ +กี้ +กี๋ +กี่กระตุก +กีฏ- +กีฏวิทยา +กีด +กีดกัน +กีดกั้น +กีดขวาง +กีดหน้าขวางตา +กีตาร์ +กีบ +กีบแรด +กี่มากน้อย +กีรติ +กีฬา +กึก +กึกก้อง +กึกกัก +กึกกือ +กึกถอง +กึง +กึ่ง +กึ่งกลาง +กึงกัง +กึ่งราชการ +กึ๋น +กุ +กุก +กุ๊ก +กุกกัก +กุกๆ กักๆ +กุ๊กกิ๊ก +กุ๊กๆ กิ๊กๆ +กุกกุฏ- +กุกกุร- +กุกขี้หมู +กุกรรม +กุก่อง +กุกะ +กุกะมะเทิ่ง +กุกุธภัณฑ์ +กุ้ง +กุ้งดีด +กุ้งดีดขัน +กุ้งเต้น +กุ้งนาง +กุ้งฝอย +กุ้งฟัด +กุ้งมังกร +กุ้งไม้ +กุ้งยิง +กุ้งส้ม +กุ้งหนามใหญ่ +กุ้งหลวง +กุ้งเหลือง +กุ้งแห +กุ้งแห้ง +กุงอน +กุงาน +กุโงก +กุจี +กุญแจ +กุญแจกล +กุญแจประจำหลัก +กุญแจปากตาย +กุญแจผี +กุญแจมือ +กุญแจรหัส +กุญแจเลื่อน +กุญแจเสียง +กุญแจแหวน +กุญชร +กุฎ +กุฎา +กุฎาคาร +กุฎาธาร +กุฎี +กุฎุมพี +กุฏฐัง +กุฏไต +กุฏิ +กุณฑ์ +กุณฑล +กุณฑี +กุณโฑ +กุณาล +กุณิ +กุณี +กุด +กุดัง +กุดั่น +กุดา +กุทัณฑ์ +กุน +กุ๊น +กุนเชียง +กุนที +กุโนกามอ +กุบ +กุบกับ +กุม +กุ่ม +กุมฝอย +กุมภ- +กุมภ์ +กุมภการ +กุมภนิยา +กุมภัณฑ- +กุมภัณฑ์ +กุมภัณฑยักษ์ +กุมภา +กุมภาพันธ์ +กุมภิล +กุมภีล์ +กุมลัคน์ +กุมเหง +กุมาร +กุมารลฬิตา +กุมารา +กุมารี +กุมุท +กุย +กุ๊ย +กุ๋ย +กุ๋ยๆ +กุยช่าย +กุยเฮง +กุรร +กุระ +กุรุง +กุรุพินท์ +กุรุร +กุเรา +กุล +กุล- +กุลทูสก +กุลธิดา +กุลบดี +กุลบุตร +กุลสตรี +กุลสัมพันธ์ +กุลา +กุลาซ่อนผ้า +กุลาดำ +กุลาตีไม้ +กุลาตีอก +กุลาลาย +กุลาหล +กุลี +กุลีกุจอ +กุเลา +กุแล +กุเวร +กุศราช +กุศล +กุศลกรรมบถ +กุศโลบาย +กุสล +กุสุม +กุสุม- +กุสุมภ์ +กุสุมวิจิตร +กุสุมา +กุสุมาลย์ +กุสุมิตลดาเวลลิตา +กุหนี +กุหนุง +กุหร่า +กุหล่า +กุหลาบ +กุแหละ +กู +กู่ +กู้ +กู๊ก +กูฏ +กูฏา +กูฏาคาร +กูณฑ์ +กูด +กูน +กูบ +กูปรี +กู้ภัย +กู่ไม่กลับ +กู้ยืม +กูรม- +กูรมะ +กูรมาวตาร +กูรำ +กู้หน้า +เก +เก่ +เก๊ +เก๋ +เกก +เก๊ก +เกกมะเหรก +เก๊กหน้า +เก๊กฮวย +เก้กัง +เก้ๆ กังๆ +เก็ง +เก่ง +เก้ง +เก๋ง +-เกงกอย +เก้งก้าง +เก่งกาจ +เก็งกำไร +เกงเขง +เก๋งเคง +เก่งแต่ปาก +เก๋งพั้ง +เก็จ +เกจิอาจารย์ +เกชา +เกณฑ์ +เกณฑ์ตะพัด +เกณฑ์เมืองรั้ง +เกณฑ์หัด +เกด +เก็ด +เกตุ +เกตุ- +เกตุมาลา +เกน +เกนๆ +เก่น +เก็บ +เก็บเกี่ยว +เก็บข้าว +เก็บข้าวตก +เก็บความ +เก็บงำ +เก็บตก +เก็บตัว +เก็บเนื้อเก็บตัว +เก็บเบี้ยใต้ถุนร้าน +เก็บผม +เก็บไร +เก็บเล็กผสมน้อย +เก็บเล็ม +เก็บเล่ม +เก็บสี +เก็บหน้าผ้า +เก็บหอมรอมริบ +เกม +เกย +เกยลา +เกยแห้ง +เกยูร +เกรง +เกร็ง +เกรงขาม +เกรงใจ +เกรงอกเกรงใจ +เกร็ด +เกรน +เกร่อ +เกรอะ +เกรอะกรัง +เกราะ +เกริก +เกริน +เกริ่น +เกรียก +เกรียง +เกรียงไกร +เกรียด +เกรียน +เกรียบ +เกรียม +เกรียมกรม +เกรียว +เกรี้ยว +เกรี้ยวๆ +เกรี้ยวกราด +เกรียวกราว +เกเร +เกเรเกตุง +เกเรเกเส +เกล็ด +เกล็ดกระดี่ +เกล็ดกระโห้ +เกล็ดข้าวเม่า +เกล็ดถี่ +เกล็ดนาค +เกล็ดปลาช่อน +เกล็ดหอย +เกลศ +เกลอ +เกลา +เกล้า +เกล้ากระผม +เกล้ากระหม่อม +เกลาะ +เกลี่ย +เกลี้ย +เกลี้ยกล่อม +เกลี่ยไกล่ +เกลียง +เกลี้ยง +เกลี้ยงเกลา +เกลียด +เกลียดตัวกินไข่ +เกลียดปลาไหลกินน้ำแกง +เกลียว +เกลียวกลม +เกลียวข้าง +เกลียวคอ +เกลี่ยวดำ +เกลียวหวาน +เกลือ +เกลื้อ +เกลือก +เกลือกกลั้ว +เกลือกกลิ้ง +เกลือกรด +เกลือแกง +เกลือเงิน +เกลือจิ้มเกลือ +เกลือจืด +เกลือด่าง +เกลือด่างคลี +เกลื่อน +เกลื้อน +เกลื่อนกล่น +เกลื่อนกลาด +เกลื่อนความ +เกลือเบสิก +เกลือปรกติ +เกลือเป็นหนอน +เกลือฟอง +เกลือยูเรต +เกลือสมุทร +เกลือสินเธาว์ +เกไล +เกวัฏ +เกวียน +เกวียนหลวง +เกศ +เกศ- +เกศธาตุ +เกศพ +เกศว +เกศา +เกศากันต์ +เกศินี +เกศี +เกษตร +เกษตรกร +เกษตรกรรม +เกษตรและสหกรณ์ +เกษตรศาสตร์ +เกษม +เกษมศานต์ +เกษมสันต์ +เกษียณ +เกษียณอายุ +เกษียน +เกษียร +เกษียรสมุทร +เกส +เกสร +เกสรทั้งห้า +เกสรี +เกสา +เกสี +เก้อ +เกอิชา +เกะ +เกะกะ +เกา +เก่า +เก้า +เก๋า +เกาต์ +เกาทัณฑ์ +เกาทุมพร +เกาบิน +เกาบิล +เกามาร +เกาลัด +เกาลัดจีน +เกาลิน +เกาไศย +เกาหลี +เกาเหลา +เกาเหลียง +เก้าอี้ +เกาะ +เกาะกิน +เกาะแกะ +เกิง +เกิ้ง +เกิด +เกิดสูรย์ +เกิน +เกินการ +เกินกิน +เกินคน +เกินงาม +เกินดี +เกินตัว +เกินไป +เกินเลย +เกินหน้า +เกิบ +เกีย +เกียกกาย +เกียง +เกี่ยง +เกี๋ยง +เกี่ยงงอน +เกี่ยงตาย +เกียจ +เกียจกล +เกียจคร้าน +เกียด +เกียดกัน +เกียน +เกี้ยมไฉ่ +เกี้ยมอี๋ +เกียร์ +เกียรติ +เกียรติ- +เกียรติ์ +เกียรติคุณ +เกียรตินิยม +เกียรติประวัติ +เกียรติภูมิ +เกียรติยศ +เกียรติศักดิ์ +เกี่ยว +เกี้ยว +เกี๊ยว +เกี่ยวก้อย +เกี้ยวเกไล +เกี่ยวข้อง +เกี่ยวข้าว +เกี้ยวคอไก่ +เกี่ยวดอง +เกี่ยวดองหนองยุ่ง +เกี้ยวนวม +เกี่ยวเบ็ด +เกี้ยวประทีป +เกี่ยวแฝกมุงป่า +เกี่ยวพัน +เกี้ยวพาน +เกี้ยวพาราสี +เกี่ยวโยง +เกี๊ยะ +เกื้อ +เกือก +เกือกม้า +เกื้อกูล +เกือบ +เกือบไป +แก +แก่ +แก้ +แก่กล้า +แก้เกี้ยว +แก้ขัด +แก้ไข +แก้แค้น +แกง +แก่ง +แก้ง +แก๊ง +แก้งก้น +แกงขม +แกงจืด +แกงได +แกงแนง +แกงบวด +แกงเผ็ด +แก่งแย่ง +แกงร้อน +แกงส้ม +แก่ดีกรี +แก่แดด +แกโดลิเนียม +แก้ตก +แก่ตัว +แก้ตัว +แก้ต่าง +แก้ที +แก้โทษ +แกน +แก่น +แก่นแก้ว +แก่นสาร +แกนะ +แกแน +แก้บน +แก่บ้าน +แก้บาป +แก๊ป +แก้เผ็ด +แก้ฝัน +แก่ไฟ +แกม +แก้ม +แก้มช้ำ +แก้มแดง +แกมมา +แก้มแหม่ม +แก้มือ +แกรก +แกร่ง +แกร็น +แกรนิต +แกรไฟต์ +แกร่ว +แกระ +แก่แรด +แกล +แกล่ +แกล้ง +แกล้งเกลา +แกลน +แกลบ +แกลบหนู +แกลบหูหนู +แกล้ม +แกลลอน +แกลเลียม +แกล้ว +แกละ +แก้ลำ +แกแล +แกว +แก้ว +แก้วก๊อ +แก้วกุ้ง +แก้วแกลบ +แกว่ง +แกว่งไกว +แกว่งตีนหาเสี้ยน +แก้วชิงดวง +แก้วตา +แกว่น +แก้วผลึก +แก้วมรกต +แก้ววิเชียร +แก้วสารพัดนึก +แก้วสีไม้ไผ่ +แก้วหิน +แก้วหู +แก่วัด +แก๊ส +แก๊สไข่เน่า +แก๊สเฉื่อย +แก๊สน้ำตา +แก้หน้า +แกะ +แกะดำ +แกะรอย +แกะสะเก็ด +โก่ +โก้ +โก๋ +โกก +โกกเกก +โกกนุท +โกกิล- +โกกิลา +โกโก้ +โกง +โก่ง +โกงกาง +โก้งเก้ง +โกงโก้ +โก้งโค้ง +โกเชาว์ +โกญจ- +โกญจน +โกญจนาท +โกญจา +โกฏิ +โกฐ +โกฐกระดูก +โกฐกะกลิ้ง +โกฐกักกรา +โกฐก้านพร้าว +โกฐเขมา +โกฐจุฬาลัมพา +โกฐจุฬาลำพา +โกฐชฎามังษี +โกฐชฎามังสี +โกฐเชียง +โกฐน้ำเต้า +โกฐพุงปลา +โกฐสอ +โกฐหอม +โกฐหัวบัว +โกฐาส +โกณ +โกณก +โกดัง +โกตไต +โกทัณฑ์ +โกน +โก่น +โก๋น +โกปินำ +โกมล +โกมุท +โกเมน +โกเมศ +โกย +โกยท้อง +โกร้ +โกรก +โกรกกราก +โกรกไกร +โกรกธาร +โกรกหวัด +โกรง +โกร่ง +โกร่งกร่าง +โกรงเกรง +โกร๋งเกร๋ง +โกรญจ +โกรด +โกรต๋น +โกรธ +โกรธขึ้ง +โกรธา +โกร๋น +โกร๋นเกร๋น +โกรม +โกรมธาตุ +โกรย +โกรศ +โกโรโกเต +โกโรโกโรก +โกโรโกโส +โกลง +โกลน +โกลาหล +โกไล +โกวิท +โกวิฬาร +โกศ +โกศล +โกษ +โกษม +โกษย +โกษีย์ +โกส +โกสน +โกสัช +โกสินทร์ +โกสีย์ +โกสุม +โกไสย +โกหก +โกหวา +ใกล้ +ใกล้เกลือกินด่าง +ไก +ไก่ +ไก้ +ไก๊ +ไก๋ +ไก่กอม +ไก่แก่แม่ปลาช่อน +ไก่แก้ว +ไก่เขี่ย +ไก่ชน +ไก๋แดง +ไก่เตี้ย +ไก่นา +ไก่ป่า +ไกพัล +ไก่ฟ้า +ไก่ฟ้าพญาลอ +ไกร +ไกรพ +ไกรลาส +ไกรศร +ไกรศรี +ไกรสร +ไกรสรี +ไกรสิทธิ +ไก่รองบ่อน +ไกล +ไกล่ +ไกล่เกลี่ย +ไกลปืนเที่ยง +ไกลาส +ไกว +ไกวัล +ไก่สามอย่าง +ไก่เห็นตีนงู งูเห็นนมไก่ +ไก่โห่ +ไก่ไห้ +ไก่อ่อน +ข +ขง +ขงจื๊อ +ขจร +ขจรจบ +ขจอก +ขจัด +ขจัดขจาย +ขจ่าง +ขจาย +ขจาว +ขจิต +ขจิริด +ขจี +ขจุย +ขเจา +ขณะ +ขด +ขดถวาย +ขดาน +ขตอย +ขทิง +ขทึง +ขน +ข้น +ข้นแค้น +ขนง +ขนงเนื้อ +ขนด +ขนทรายเข้าวัด +ขนน +ขนบ +ขนบธรรมเนียม +ขนบประเพณี +ขนพอง +ขนเพชร +ขนม +ขนมครก +ขนมจีน +ขนมทราย +ขนมผสมน้ำยา +ขนมผักกาด +ขนมเส้น +ขนมหัวผักกาด +ขนแมว +ขนลุก +ขนลุกขนพอง +ขนส่ง +ขนสัตว์ +ขนหน้าแข้งไม่ร่วง +ขนหนู +ขนหยอง +ขนอง +ขนอน +ขนอบ +ขนอุย +ขนัด +ขนัน +ขนาก +ขนาง +ขนาด +ขนาน +ขนานน้ำ +ขนานลี่ +ขนาบ +ขนาย +ขนำ +ขนิษฐ +ขนิษฐา +ขนุน +ขนุนนก +ขนุนป่า +ขนุนสำปะลอ +ขบ +ขบขัน +ขบเขี้ยวเคี้ยวฟัน +ขบคิด +ขบฉัน +ขบถ +ขบปัญหา +ขบเผาะ +ขบไม่แตก +ขบวน +ขบวนการ +ขบวร +ขบูร +ขม +ข่ม +ข่มขวัญ +ข่มขี่ +ขมขื่น +ข่มขืน +ข่มขืนกระทำชำเรา +ข่มขืนใจ +ข่มขู่ +ข่มเขาโคขืนให้กินหญ้า +ขมงโกรย +ข่มท้อง +ข่มนาม +ขมเป็นยา +ขมม +ขมวด +ขมวดยา +ขมวน +ข่มหมู +ขมหิน +ข่มเหง +ข่มเหงคะเนงร้าย +ขมอง +ขม่อม +ขม่อมบาง +ขมอย +ขมัง +ขมับ +ขมา +ขม้ำ +ขมิ้น +ขมิ้นกับปูน +ขมิ้นขาว +ขมิ้นขึ้น +ขมิ้นเครือ +ขมิ้นชัน +ขมิ้นนาง +ขมิ้นลิง +ขมิ้นหัวขึ้น +ขมิ้นอ้อย +ขมิบ +ขมีขมัน +ขมึง +ขมึงทึง +ขมุ +ขมุกขมัว +ขมุดขมิด +ขมุบ +ขมุบขมิบ +ขมุม +ขโมย +ขย- +ขยด +ขยม +ขย่ม +ขยล +ขยอก +ขยอง +ขย่อน +ขย้อน +ขยะ +ขยะแขยง +ขยัก +ขยักขย่อน +ขยักขย้อน +ขยัน +ขยั้น +ขยับ +ขยับขยาย +ขยับเขยื้อน +ขยาด +ขยาบ +ขยาย +ขยายขี้เท่อ +ขยำ +ขย้ำ +ขยิก +ขยิบ +ขยิ่ม +ขยี้ +ขยี่ขยัน +ขยุกขยิก +ขยุกขยุย +ขยุบ +ขยุบขยิบ +ขยุม +ขยุ้ม +ขยุ้มตีนหมา +ขยุย +ขรม +ขรรค- +ขรรค์ +ขรัว +ขรัวยาย +ขริบ +ขรี +ขรึม +ขรุขระ +ขล้ง +ขลบ +ขลม +ขลวน +ขล้อเงาะ +ขล้อเทียน +ขลัง +ขลับ +ขลา +ขลาด +ขลาย +ขลิบ +ขลึง +ขลุก +ขลุกขลัก +ขลุกขลิก +ขลุกขลุ่ย +ขลุบ +ขลุม +ขลุมประเจียด +ขลุ่ย +ขลู +ขลู่ +ขวง +ข่วง +ขวด +ขวดตีนช้าง +ขวดโหล +ขวน +ข่วน +ขวนขวาย +ขวบ +ขวย +ขวยเขิน +ขวยใจ +ขวะไขว่เขวี่ย +ขวักไขว่ +ขวัญ +ขวัญเกี่ยง +ขวัญข้าว +ขวัญแขวน +ขวัญใจ +ขวัญดี +ขวัญตา +ขวัญบ่า +ขวัญบิน +ขวัญเมือง +ขวัญหนี +ขวัญหนีดีฝ่อ +ขวัญหาย +ขวัญอ่อน +ขวัด +ขวัดขวิด +ขวัดแคว้ง +ขวั้น +ขวับ +ขวับเขวียว +ขวา +ขวาก +ขวากหนาม +ขวาง +ขว้าง +ขว้างกา +ขว้างข้าวเม่า +ขว้างค้อน +ขว้างงูไม่พ้นคอ +ขว้างจักร +ขวางเชิง +ขวางๆ รีๆ +ขวางโลก +ขวาด +ขวาน +ขวานผ่าซาก +ขวานฟ้า +ขวายขวน +ขวาว +ขว้าว +ขวิด +ขษณะ +ขษัย +ขษีณาศรพ +ขษีร +ขอ +ข่อ +ข้อ +ขอก +ข้อกฎหมาย +ข้อกติกา +ข้อกำหนด +ขอแกว +ข้อเขียน +ข้อไข +ข้อความ +ข้อคัดย่อ +ขอคำน้อย +ข้อคิด +ข้อคิดเห็น +ของ +ข้อง +ของกลาง +ของกอง +ของกำนัล +ของกิน +ของเก่า +ของขบเคี้ยว +ของขลัง +ของขวัญ +ข้องขัด +ของแข็ง +ของค้าง +ของคาว +ของเค็ม +ของเคียง +ของโจร +ข้องใจ +ของชำ +ของใช้ +ของดี +ของเถื่อน +ของนอก +ของร้อน +ของลับ +ของเล่น +ของเลื่อน +ของเลื่อนเตือนขันหมาก +ของวัด +ของว่าง +ข้องแวะ +ของสงฆ์ +ของสงวน +ของสด +ของสดของคาว +ของสดคาว +ของหลวง +ของหวาน +ของหายตะพายบาป +ของเหลว +ของแห้ง +ของไหล +ของไหว้ +ของ้อ +ของ้าว +ขอฉาย +ขอช้าง +ขอด +ขอดค่อน +ขอเดชะ +ขอตัว +ขอทอง +ขอทาน +ขอที +ข้อเท็จจริง +ขอโทษ +ขอน +ข่อน +ข้อน +ขอนดอก +ขอนสัก +ขอนิสัย +ขอบ +ขอบข่าย +ขอบเขต +ขอบคุณ +ขอบใจ +ขอบทาง +ขอบพระคุณ +ขอบไร +ขอบเหล็ก +ข้อบังคับ +ข้อบัญญัติ +ขอประทาน +ขอประทานโทษ +ข้อปลีกย่อย +ขอไปที +ขอเฝ้า +ขอพระราชทาน +ข้อพับ +ขอม +ข้อมือขาว +ข้อมูล +ข้อแม้ +ข่อย +ข้อย +ข่อยน้ำ +ข่อยหนาม +ข่อยหยอง +ขอยืม +ขอร้อง +ขอรับ +ขอรับกระผม +ขอรับผม +ข้อราชการ +ขอแรง +ข้อศอก +ข้อสอบ +ขอสับ +ข้อเสือ +ข้อหา +ข้อใหญ่ใจความ +ขออภัย +ข้ออ้อย +ข้ออ้าง +ขะข่ำ +ขะแข่น +ขะแข้น +ขะแจะ +ขะแถก +ขะนาน +ขะเน็ด +ขะมอมขะแมม +ขะมักเขม้น +ขะมุกขะมอม +ขะแมซอ +ขะแมธม +ขะยิก +ขะยุก +ขะเย้อแขย่ง +ขะแยะ +ขัค +ขัง +ขังข้อ +ขังขอก +ขังปล้อง +ขังหน่วย +ขัช +ขัชก +ขัณฑ- +ขัณฑสกร +ขัณฑสีมา +ขัด +ขัดเกลา +ขัดขวาง +ขัดข้อง +ขัดขืน +ขัดเขมร +ขัดเขิน +ขัดแข็ง +ขัดคอ +ขัดเคือง +ขัดแค้น +ขัดจังหวะ +ขัดใจ +ขัดดอก +ขัดตา +ขัดตาทัพ +ขัดตำนาน +ขัดแตะ +ขัดบท +ขัดเบา +ขัดมอน +ขัดมอนตัวผู้ +ขัดมอนหลวง +ขัดยอก +ขัดแย้ง +ขัดลาภ +ขัดสน +ขัดสมาธิ +ขัดหนัก +ขัดห้าง +ขัดหู +ขัตติย- +ขัตติยมานะ +ขัน +ขั้น +ขันกว้าน +ขันแข็ง +ขันชะเนาะ +ขันเชิง +ขันต่อ +ขันติ +ขันตี +ขันโตก +ขันทองพยาบาท +ขันที +ขันธ์ +ขันธาวาร +ขันน้ำพานรอง +ขันลงหิน +ขันสมอ +ขันสาคร +ขันสู้ +ขันหมาก +ขันเหม +ขันอาสา +ขับ +ขับขัน +ขับขี่ +ขับเคลื่อน +ขับเคี่ยว +ขับซอ +ขับถ่าย +ขับพล +ขับไม้ +ขับไม้บัณเฑาะว์ +ขับร้อง +ขัย +ขัว +ขั้ว +ขั้วกระจก +ขั้วบวก +ขั้วแม่เหล็ก +ขั้วแม่เหล็กโลก +ขั้วลบ +ขั้วโลก +ขา +ข่า +ข้า +ขาก +ขากบ +ขากรรไตร +ขาก๊วย +ขากอม +ขาเกวียน +ข้าเก่าเต่าเลี้ยง +ขาไก่ +ขาเขียด +ขาง +ข่าง +ข้าง +ข้างๆ +ข้างกบ +ข้างกระดาน +ข้างขึ้น +ข้างควาย +ข้างๆ คูๆ +ข้างเงิน +ข้างจัน +ขางดัง +ขางแดง +ข้างตก +ข้างตะเภา +ข้างตีน +ข้างแรม +ข้างลาย +ข้างหัวนอน +ข้างออก +ขาจร +ข้าเจ้า +ขาณุ +ขาด +ขาดกัน +ขาดคราว +ขาดคอช้าง +ขาดค่า +ขาดคำ +ขาดแคลน +ขาดใจ +ขาดตกบกพร่อง +ขาดตลาด +ขาดตอน +ขาดตัว +ขาดทุน +ขาดปาก +ขาดมือ +ขาดเม็ด +ขาดลอย +ขาดหัวช้าง +ขาดเหลือ +ขาดอายุ +ข่าแดง +ข่าต้น +ขาทนียะ +ขาทราย +ข้าไท +ขาน +ขานกยาง +ขานไข +ขานนาค +ขานรหัส +ข้านอกเจ้า ข้าวนอกหม้อ +ข้าน้อย +ขานาง +ขาบ +ขาประจำ +ข้าแผ่นดิน +ข้าเฝ้า +ข้าพเจ้า +ข้าพระ +ข้าพระพุทธเจ้า +ขาพับ +ขาม +ข่าม +ข้าม +ข้ามๆ +ข้ามน้ำข้ามทะเล +ข้ามน้ำข้ามท่า +ข้ามสมุทร +ข้ามหน้า +ข้ามหน้าข้ามตา +ข้ามหัว +ขาม้า +ขาย +ข่าย +ขายขาด +ข่ายงาน +ขายชาติ +ขายชื่อ +ขายตัว +ขายตามคำพรรณนา +ขายตามตัวอย่าง +ขายทอดตลาด +ขายบ้านขายเมือง +ขายปลีก +ขายผ้าเอาหน้ารอด +ขายเผื่อชอบ +ขายฝาก +ขายส่ง +ขายหน้า +ขายหน้าขายตา +ขายหน้าวันละห้าเบี้ย +ขายหู +ขายเหมา +ข้าราชการ +ขาล +ขาว +ข่าว +ข้าว +ข่าวกรอง +ข้าวกรู +ข้าวกล้อง +ข้าวกล้า +ข้าวเกรียบ +ข้าวเกรียบปากหม้อ +ข้าวเกรียบอ่อน +ข้าวเก่า +ข้าวแกง +ข้าวโกบ +ข้าวขวัญ +ข้าวของ +ข้าวข้า +ข้าวแขก +ข่าวคราว +ข้าวควบ +ข้าวคำ +ข้าวแคบ +ข้าวงัน +ข้าวจี่ +ขาวจีบ +ข้าวเจ้า +ข้าวแจก +ข้าวแช่ +ข้าวซ้อม +ข้าวซอย +ข้าวแดกงา +ข้าวแดงแกงร้อน +ข้าวต้ม +ข้าวต้มน้ำวุ้น +ข้าวต้มปัด +ข้าวตอก +ข้าวตอกตั้ง +ข้าวตอกแตก +ข้าวตัง +ข้าวตาก +ข้าวตู +ข้าวแตก +ข้าวแตน +ข้าวทิพย์ +ข้าวนก +ข้าวนึ่ง +ข้าวบาตร +ข้าวบิณฑ์ +ข้าวบุหรี่ +ข้าวเบา +ข้าวเบือ +ข้าวประดับดิน +ข้าวปลูก +ข้าวปัด +ข้าวป่า +ข้าวปาด +ข้าวปุ้น +ข้าวเปรต +ข้าวเปลือก +ข้าวเปียก +ข้าวผอก +ข้าวผอกกระบอกน้ำ +ข้าวพระ +ขาวพวง +ข้าวพอง +ข่าวพาดหัว +ข้าวโพด +ข้าวฟ่าง +ข้าวเภา +ข้าวมัน +ขาวม้า +ข้าวมิ่น +ข้าวเม่า +ข้าวเม่าทอด +ข่าวยกเมฆ +ข้าวยากหมากแพง +ข้าวยาคู +ข้าวยำ +ข้าวเย็นใต้ +ข้าวเย็นเหนือ +ข้าวละมาน +ข่าวล่า +ข่าวสด +ข้าวสวย +ข้าวสาก +ข่าวสาร +ข้าวสาร +ข้าวสุก +ข้าวเส้น +ข้าวหนัก +ข้าวหมก +ข้าวหมาก +ข้าวหลาม +ข้าวหลามตัด +ข้าวหัวโขน +ข้าวหางช้าง +ข้าวเหนียว +ข้าวเหนียวดำ +ข้าวเหลือเกลืออิ่ม +ขาวใหญ่ +ข้าวใหม่ +ข้าวใหม่น้อย +ข้าวใหม่ปลามัน +ข้าวใหม่ใหญ่ +ข้าวอังกุลี +ข้าวฮาง +ข้าศึก +ขาหมา +ขาหยั่ง +ข้าหลวง +ข้าหลวงเดิม +ข้าหลวงน้อย +ข้าหลวงหลังลาย +ขาอ่อน +ขำ +ข่ำเขียว +ขิก +ขิกๆ +ขิง +ขิ่ง +ขิงก็รา ข่าก็แรง +ขิงแกลง +ขิงแครง +ขิงแห้ง +ขิด +ขิปสัทโท +ขิม +ขี่ +ขี้ +ขี้กบ +ขี้กระทาเกลือ +ขี้ก้อนใหญ่ให้เด็กเห็น +ขี้กะโล้โท้ +ขี้กา +ขี้ก้าง +ขี้กาดง +ขี้กาแดง +ขี้กาเหลี่ยม +ขี้เกลือ +ขี้ขม +ขี้ขวง +ขี้ข้า +ขี้ขุย +ขี้เข็บ +ขี้ครอก +ขี้ครั่ง +ขี้ควาย +ขี้คุก +ขี้เค้า +ขี้โครง +ขี้จาบ +ขี่ช้างจับตั๊กแตน +ขี้ซ้าย +ขี้เซา +ขี้ไซ้ +ขีณะ +ขีณาสพ +ขีด +ขีดขั้น +ขีดคร่อม +ขีดคั่น +ขีดเส้นตาย +ขี้เดือด +ขี้แดด +ขี้ตด +ขี้ตังนี +ขี้ติ้ว +ขี้ตืด +ขี้เต่า +ขี้แต้ +ขี้ไต้ +ขี้ถัง +ขี้เถ้า +ขี้ไถ +ขี้ทา +ขี้ทูด +ขี้เท่อ +ขี้เทา +ขี้เทือก +ขี้นก +ขีปนาวุธ +ขีปนาวุธนำวิถี +ขี้ปะติ๋ว +ขี้ปาก +ขี้เป้ +ขี้เป็ด +ขี้ผง +ขี้ผึ้ง +ขี้ฝิ่น +ขี้แพ้ชวนตี +ขี้มอด +ขี้ม้า +ขี่ม้าตีคลี +ขี่ม้าเลียบค่าย +ขี่ม้าส่งเมือง +ขี้มิ่น +ขี้มูก +ขี้เมฆ +ขี้แมลงวัน +ขี้แมว +ขี้ไม่ให้หมากิน +ขี้ยอก +ขี้ยา +ขี้แย +ขีร +ขี้รังแค +ขี้ราดโทษล่อง +ขี้ริ้ว +ขี้เรื้อน +ขี้เรื้อนกวาง +ขี้แรด +ขี้แรดล้อมปรวด +ขี้ลม +ขี้ลอก +ขี้ลีบ +ขี้เล็บ +ขี้โล้ +ขี้สูด +ขี้หดตดหาย +ขี้หนอน +ขี้หน้า +ขี้หนู +ขี้หมา +ขี้เหร่ +ขี้เหล็ก +ขี้ใหม่หมาหอม +ขี้อ้น +ขี้อ้าย +ขึง +ขึ้ง +ขึ้งโกรธ +ขึงขัง +ขึ้งเคียด +ขึงตา +ขึงพืด +ขึงอูด +ขึ้น +ขึ้นเขียง +ขึ้นครู +ขึ้นคาน +ขึ้นใจ +ขึ้นฉ่าย +ขึ้นชื่อ +ขึ้นชื่อว่า +ขึ้นซัง +ขึ้นต้นไม้สุดยอด +ขึ้นปาก +ขึ้นพลับพลา +ขึ้นไม้ขึ้นมือ +ขึ้นระวาง +ขึ้นร้าน +ขึ้นสาย +ขึ้นเสียง +ขึ้นหน้าขึ้นตา +ขึ้นหม้อ +ขึ้นหา +ขึ้นเหนือล่องใต้ +ขืน +ขื่น +ขื่นขม +ขืนใจ +ขื่อ +ขื่อกะละปังหา +ขื่อขวาง +ขื่อคัด +ขื่อจมูก +ขื่อเท่าต่อ +ขื่อผี +ขื่อมุก +ขื่อหมู่ +ขุก +ขุด +ขุดคุ้ย +ขุดด้วยปากถากด้วยตา +ขุดดินกินหญ้า +ขุดบ่อล่อปลา +ขุน +ขุ่น +ขุ่นข้องหมองใจ +ขุ่นเคือง +ขุ่นแค้น +ขุ่นใจ +ขุนทอง +ขุนนาง +ขุนนางใช่พ่อแม่ หินแง่ใช่ตายาย +ขุนน้ำ +ขุนบาล +ขุนแผน +ขุนพล +ขุนพัฒน์ +ขุนเพ็ด +ขุ่นมัว +ขุนไม่ขึ้น +ขุนศาล +ขุนศึก +ขุ่นหมอง +ขุนหมื่น +ขุนหลวง +ขุม +ขุย +ขุยไผ่ +ขุยอินทรีย์ +ขู +ขู่ +ขู่กรรโชก +ขู่ขวัญ +ขู่เข็ญ +ขูด +ขูดรีด +ขูดเลือด +ขูดเลือดขูดเนื้อ +เข +เข้ +เขก +เข็ง +เข่ง +เขจร +เข็ญ +เข็ญใจ +เข็ด +เข็ดข้อ +เข็ดข้อเข็ดลำ +เข็ดเขี้ยว +เข็ดฟัน +เขดา +เขต +เขตแดน +เขตเลือกตั้ง +เขตอำนาจศาล +เขน +เข็น +เข่น +เข่นเขี้ยว +เข็นครกขึ้นภูเขา +เข่นฆ่า +เขนง +เขนงนายพราน +เขน็ด +เขนย +เขบ็จขบวน +เขบ็ต +เขม- +เข็ม +เข้ม +เข็มกลัด +เข้มข้น +เข็มขัด +เข้มขาบ +เข้มขาบไหม +เข้มแข็ง +เข็มควัก +เขม็ง +เข้มงวด +เข็มซ่อนปลาย +เขม็ดแขม่ +เข็มทิศ +เขม่น +เขม้น +เขม้นขะมัก +เขมร +เขมรไทรโยค +เขมรพวง +เขมรราชบุรี +เขมรเหลือง +เขมรใหญ่ +เขมา +เขม่า +เขมาโกรย +เขม่าซาง +เขมือบ +เขย +เขยก +เขย่ง +เขย่งเก็งกอย +เขยตาย +เขย้อแขย่ง +เขยอะขยะ +เขย่า +เขยิน +เขยิบ +เขยิบขยาบ +เขยิบฐานะ +เขยียวขยอน +เขยื้อน +เขรอะ +เขลง +เขลอะ +เขละ +เขลา +เขลาะ +เขว +เขษตร +เขษม +เขษียร +เขฬะ +เขะขะ +เขา +เข่า +เข้า +เข้ากระโจม +เข้ากระดูกดำ +เขากวาง +เข้าเกณฑ์ +เข้าเกีย +เขาแกะ +เข้าข้อ +เข้าขา +เข้าข้าง +เข้าคอ +เข้าคิว +เข้าคู่ +เข้าเครื่อง +เข้าเค้า +เข้าไคล +เข้าเงียบ +เข้าแง่ +เข้าเจ้า +เข้าเจ้าเข้านาย +เข้าใจ +เข้าชื่อ +เข้าฌาน +เข้าด้ายเข้าเข็ม +เข้าเดือย +เข้าตรีทูต +เข้าตอง +เข้าตัว +เข้าตาจน +เข้าตามตรอกออกตามประตู +เข้าตาร้าย +เข้าตำรา +เข้าตู้ +เข้าไต้เข้าไฟ +เข้าถ้ำ +เข้าถึง +เข้าเถื่อนอย่าลืมพร้า +เข้าทรง +เข้าท่า +เข้าที +เข้าที่ +เข้าทุน +เข้านอกออกใน +เข้าเนื้อ +เข้าแบบ +เข้าแบบเข้าแผน +เข้าปก +เข้าปากไม้ +เข้าปิ้ง +เข้าปีก +เขาเปล้า +เข้าไป +เข้าผี +เข้าผู้เข้าคน +เข้าฝัก +เข้าฝัน +เข้าเฝ้า +เข้าเฝือก +เข้าพกเข้าห่อ +เข้าพรรษา +เข้าพระเข้านาง +เข้าพุง +เขามอ +เข้าม่าน +เข้าเมืองตาหลิ่วต้องหลิ่วตาตาม +เข้าไม้ +เข้ายา +เข้ารกเข้าพง +เข้ารหัส +เข้าร่องเข้ารอย +เข้ารอบ +เข้ารอย +เข้าร้าย +เข้ารีต +เข้ารูป +เข้ารูปเข้ารอย +เข่าลา +เข้าลิ้น +เข้าเล่ม +เข้าเลือด +เข้าเลือดเข้าเนื้อ +เข้าโลง +เข้าวัดเข้าวา +เข้าว่า +เข้าเวร +เข้าแว่น +เข้าเศียร +เข้าสมาธิ +เข้าสุหนัต +เข้าใส่ +เข้าไส้ +เข้าหน้า +เข้าหม้อ +เข้าหมิ้น +เข้าหลัก +เข้าหา +เข้าหุ้น +เข้าหู +เข้าหูซ้ายทะลุหูขวา +เข้าให้ +เข้าไหนเข้าได้ +เขาอ่อน +เข่าอ่อน +เขิง +เขิน +เขิบ +เขี่ย +เขียง +เขียงเท้า +เขียงพระนางอี่ +เขียงพร้า +เขียด +เขียดตะปาด +เขียน +เขี่ยน +เขียนด้วยมือลบด้วยตีน +เขียนทอง +เขียนไทย +เขียนเสือให้วัวกลัว +เขียม +เขียว +เขี้ยว +เขี้ยวกระแต +เขี้ยวแก้ว +เขียวไข่กา +เขี้ยวงู +เขี้ยวตะขาบ +เขี้ยวเนื้อ +เขียวพระอินทร์ +เขี้ยวเล็บ +เขียวเสวย +เขี้ยวหนุมาน +เขี้ยวหมา +เขียวหวาน +เขียวหางไหม้ +เขียะ +เขือ +เขือง +เขื่อง +เขื่อน +เขื่อนเพชร +เขือม +แข +แข้ +แขก +แขกเต้า +แขกเต้าเข้ารัง +แขกเมือง +แข็ง +แข่ง +แข้ง +แข็งกร้าว +แข็งกล้า +แข็งแกร่ง +แข้งไก่ +แข็งข้อ +แข็งขัน +แข่งขัน +แข็งใจ +แข็งตัว +แข็งมือ +แข็งเมือง +แข็งแรง +แข้งสิงห์ +แขน +แข่น +แข้น +แขนขวา +แขนคู้ +แขนง +แขนซ้ายแขนขวา +แขนทุกข์ +แขนนาง +แขนพับ +แขนะ +แขม +แขม็บ +แขม่ว +แขย็กๆ +แขยง +แขย่ง +แขยงแขงขน +แขยงหนู +แขละ +แขวก +แขวง +แขวน +แขวนคอ +แขวนนวม +แขวนลอย +แขวะ +แขสร์ +โข +โขก +โขกสับ +โขง +โข่ง +โข่งทะเล +โขด +โขดง +โขน +โขนง +โขม +โขม- +โขมง +โขมด +โขมดยา +โขยก +โขยกเขยก +โขยง +โขย่ง +โขยด +โขยม +โขลก +โขลกๆ +โขลง +โขลน +โขลนทวาร +โขษม +ไข +ไข่ +ไข้ +ไขกระดูก +ไข้กาฬ +ไข้กาฬนกนางแอ่น +ไข้กาฬหลังแอ่น +ไข้กำเดา +ไข่ไก่ +ไข่ขวัญ +ไขข้อ +ไข่ขาง +ไข่ขาว +ไข่ข้าว +ไขควง +ไข้ความร้อน +ไข่เค็ม +ไข่จระเข้ +ไข้จับสั่น +ไข่จิ้งจก +ไข่จิ้งหรีด +ไข่เจียว +ไข้ใจ +ไข่ญี่ปุ่น +ไข่ดัน +ไข่ดันหมู +ไข่ดาว +ไข่แดง +ไข้แดด +ไข่ตายโคม +ไข่ตุ๋น +ไข่เต่า +ไข้ทรพิษ +ไข้ทับระดู +ไข่นกกระสา +ไขน้ำ +ไข่น้ำ +ไข่น้ำค้าง +ไข่เน่า +ไข่ในหิน +ไข่ปลา +ไข้ปอดบวม +ไข้ป่า +ไขพระวิสูตร +ไข่พอก +ไข้พิษ +ไขมัน +ไข้มาลาเรีย +ไข่มุก +ไขย่น +ไข่เยี่ยวม้า +ไขรา +ไข่ลม +ไขลาน +ไข่ลูกเขย +ไข่ลูกยอด +ไข้เลือดออก +ไขว่ +ไขว้ +ไขว้เขว +ไขว่คว้า +ไขว้โรง +ไขว่ห้าง +ไขษย +ไข้สันนิบาต +ไขสันหลัง +ไขสันหลังอักเสบ +ไข่สำเภา +ไขสือ +ไขเสนียด +ไข่หงส์ +ไข้หวัด +ไข้หวัดใหญ่ +ไข่หวาน +ไข้หัว +ไข้หัวลม +ไข่หำ +ไข่หิน +ไขหู +ไข้เหลือง +ไข่เหา +ไข่เหี้ย +ไข่แหน +ฃ +ค +คคน- +คคนะ +คคนัมพร +คคนางค์ +คคนานต์ +คง +คงกระพัน +คงกระพันชาตรี +คงแก่เรียน +คงขาด +คงคลัง +คงคา +คงคาเดือด +คงคาลัย +คงไคย +คงตัว +คงทน +คงที่ +คงเส้นคงวา +คงเหลือ +คช- +คชกรรม +คชนาม +คชราช +คชลักษณ์ +คชศาสตร์ +คชส่าน +คชสาร +คชสีห์ +คชาชาติ +คชาชีพ +คชาธาร +คชาภรณ์ +คชินทร์ +คเชนทร์ +คณ- +คณน +คณนา +คณบดี +คณะ +คณะรัฐมนตรี +คณาจารย์ +คณาธิการ +คณาธิปไตย +คณิกา +คณิต +คณิต- +คณิตศาสตร์ +คเณศ +คด +คดกริช +คดโกง +คดเคี้ยว +คดงอ +คดซ่าง +คดในข้องอในกระดูก +คดสร้าง +คดี +คดีดำ +คดีแดง +คดีแพ่ง +คดีมโนสาเร่ +คดีอนาถา +คดีอาญา +-คต +คติ +คติชาวบ้าน +คติธรรม +คตินิยม +คติพจน์ +คทา +คน +ค้น +คนกลาง +คนไข้ +คนไข้นอก +คนไข้ใน +ค้นคว้า +คนจร +คนจริง +คนใช้ +คนดีผีคุ้ม +คนต้องขัง +คนทรง +คนทา +คนทิสอ +คนทิสอทะเล +คนที +คนทีเขมา +คนทีสอ +คนโท +คนธ์ +คนธรรพ- +คนธรรพ์ +คนธรรพวิวาห์ +คนธรรพศาสตร์ +คนนอก +คนใน +คนเมือง +คนรักเท่าผืนหนัง คนชังเท่าผืนเสื่อ +คนร้าย +คนไร้ความสามารถ +คนละ +คนละไม้คนละมือ +คนสวน +คนสาบสูญ +คนเสมือนไร้ความสามารถ +ค้นหูก +คนใหญ่คนโต +คเนจร +คบ +คบคนให้ดูหน้า ซื้อผ้าให้ดูเนื้อ +คบค้า +คบคิด +คบชู้ +คบเพลิง +คบไฟ +คบหา +คม +คมกริบ +คมขำ +คมคาย +คมน- +คมน์ +คมนาการ +คมนาคม +คมในฝัก +คมบาง +คมสัน +คมิกภัต +ครก +ครกกะเบือ +คร่ง +ครบ +ครบครัน +ครบถ้วน +ครบมือ +ครรชิต +ครรภ +ครรภ- +ครรภ์ +ครรภธาตุ +ครรภธาตุมณฑล +ครรภมณฑล +ครรภมล +ครรโภทร +ครรลอง +ครรโลง +ครรไล +ครรหิต +ครวญ +ครวญคราง +ครวญหา +ครวัก +ครวี +ครหา +ครอก +ครอง +ครองแครง +ครองราชสมบัติ +คร่อเงาะ +คร่อเทียน +ครอบ +ครอบครอง +ครอบครองปรปักษ์ +ครอบครัว +ครอบงำ +ครอบจักรวาล +ครอบตลับ +คร่อม +คระ +คระเมิม +คระแลง +คระไล +คระแวง +คระหน +คระหวน +คระหาย +คระหิว +คระโหย +ครั่ง +ครั้ง +ครัดเคร่ง +ครัน +ครั่น +ครั้น +ครั่นคร้าม +ครั่นตัว +ครั่นเนื้อครั่นตัว +ครับ +ครัว +ครัวทาน +ครัวไฟ +ครัวเรือน +ครา +คร่า +คราก +คราง +คราญ +คราด +คร้าน +คราบ +คราบหมู +คราม +คร้าม +ครามครัน +คราว +คร่าว +คร่าวๆ +คราส +ครำ +คร่ำ +คร่ำครวญ +คร่ำคร่า +คร่ำครึ +คร่ำเคร่ง +คร่ำเครอะ +คร่ำเงิน +คร่ำทอง +คร่ำหวอด +คริปทอน +คริสต์ +คริสต์มาส +คริสต์ศักราช +คริสตัง +คริสเตียน +ครี้ +ครีครอ +ครีบ +ครีบสิงห์ +ครีม +ครีษมายัน +ครึ +ครึกครื้น +ครึกโครม +ครึ่ง +ครึ่งๆ กลางๆ +ครึ่งชาติ +ครึ่งต่อครึ่ง +ครึน +ครึม +ครึ้ม +ครึมครุ +ครืด +ครืน +ครื้น +ครืนครั่น +ครื้นครั่น +ครื้นครึก +ครื้นเครง +ครือ +ครุ +ครุก- +ครุคระ +ครุฑ +ครุฑกระทง +ครุฑพ่าห์ +ครุ่น +ครุ่นคิด +ครุภัณฑ์ +ครุมเครือ +ครุย +ครุวนา +ครุวาร +ครุศาสตร์ +ครู +ครู่ +ครูด +คฤโฆษ +คฤนถ์ +คฤห +คฤห- +คฤหบดี +คฤหปัตนี +คฤหัสถ์ +คฤหา +คฤหาสน์ +คล +คลวง +คลอ +คล้อ +คลอก +คลอเคลีย +คลอแคล +คล้อแคล้ +คลอง +คล่อง +คล้อง +คล่องแคล่ว +คล้องจอง +คล่องตัว +คลองเลื่อย +คลองส่งน้ำ +คลอด +คลอน +คลอนแคลน +คล้อย +คล้อยคล้อย +คลอรีน +คลอโรฟอร์ม +คลอโรฟีลล์ +คละ +คละคล่ำ +คละคลุ้ง +คละปน +คลัก +คลั่ก +คลั่กๆ +คลัง +คลั่ง +คลังพิมานอากาศ +คลังเลือด +คลังสินค้า +คลังสินค้าทัณฑ์บน +คลัตช์ +คลับคล้าย +คลับคล้ายคลับคลา +คลา +คล้า +คลาคล่ำ +คลาไคล +คลางแคลง +คลาด +คลาดเคลื่อน +คลาดแคล้ว +คลาน +คลาย +คล้าย +คลายคล้าย +คล้ายคล้าย +คล้ายคลึง +คลายเคล่ง +คล่าว +คลาศ +คลำ +คล่ำ +คล้ำ +คลิง +คลิ้งโคลง +คลิด +คลินิก +คลี +คลี่ +คลี่คลาย +คลึง +คลึงเคล้น +คลึงเคล้า +คลื่น +คลื่นกระทบฝั่ง +คลื่นใต้น้ำ +คลื่นปานกลาง +คลื่นแม่เหล็กไฟฟ้า +คลื่นยาว +คลื่นวิทยุ +คลื่นสั้น +คลื่นไส้ +คลื่นเหียน +คลุก +คลุกคลาน +คลุกคลี +คลุกคลีตีโมง +คลุ้ง +คลุบ +คลุม +คลุ่ม +คลุ้ม +คลุ้มคลั่ง +คลุมเครือ +คลุมถุงชน +คลุมประทม +คลุมโปง +คลุมผทม +ควง +ควงแขน +ควงสว่าน +ควณ +ควน +ควบ +ควบคุม +ควบแน่น +ควย +ควร +ควัก +ควักค้อน +ควักลงหลุม +ควั่งคว้าง +ควัน +ควั่น +ควั่นจุก +ควันหลง +คว้า +ควาก +คว้าไขว่ +คว้าง +คว้างๆ +คว้างเคว้ง +ควาญ +ควาน +คว้าน +คว้านท้อง +คว้าน้ำเหลว +ความ +ความคลาด +ความเค้น +ความเครียด +ความเฉื่อย +ความชอบ +ความชื้น +ความชื้นสัมบูรณ์ +ความชื้นสัมพัทธ์ +ความถ่วง +ความถ่วงจำเพาะ +ความถี่ +ความถี่วิทยุ +ความโน้มถ่วง +ความยาวคลื่น +ความรู้ท่วมหัวเอาตัวไม่รอด +ความรู้สึกเขื่อง +ความรู้สึกด้อย +ความรู้สึกเด่น +ความเร่ง +ความเร็ว +ความหน่วง +ความหลัง +ควาย +ควายปละ +ควายพระอินทร์ +คว่าว +คว่ำ +คว่ำบาตร +คว่ำหลัง +ควินิน +ควิวๆ +ควิวควัง +ควิวคว่าง +ควิวคว้าง +ควีนสิริกิติ์ +คห- +คหกรรมศาสตร์ +คหบดี +คหปตานี +คหัฐ +คอ +ค้อ +คอก +ค็อกคัส +คอกช้าง +ค็อกเทล +คอกระเช้า +คอกลม +คอกะลาสี +คอขาดบาดตาย +คอแข็ง +คอคอด +คอเคซอยด์ +ค่องอ้อย +คอเชิ้ต +คอซอง +คอด +คอแดง +คอตก +คอต่อ +คอตั้ง +คอตั้งบ่า +คอตีบ +คอถ่วง +คอทองแดง +คอน +ค่อน +ค้อน +คอนกรีต +คอนกรีตเสริมเหล็ก +คอนกรีตอัดแรง +ค้อนกลอง +ค่อนขอด +ค่อนข้าง +ค้อนควัก +ค่อนแคะ +คอนเดนเซอร์ +ค้อนติง +ค้อนตีหมา +ค้อนทอง +คอนแวนต์ +คอนเสิร์ต +ค้อนหอย +คอนาค +คอบ +คอบัว +คอแบะ +คอปาด +คอเป็นเอ็น +คอพอก +คอพับ +คอไฟ +คอม +ค่อม +ค้อม +คอมพิวเตอร์ +คอมมานโด +คอมมิวนิสต์ +คอม้า +คอย +ค่อย +ค่อยๆ +ค้อย +ค่อยดีขึ้น +คอยท่า +ค่อยเป็นค่อยไป +ค่อยยังชั่ว +คอยล์ +คอยเหตุ +คอร์ด +คอรวง +คอระฆัง +คอแร้ง +คอแลน +คอวี +คอสติกโซดา +คอสอง +คอสะพาน +คอสูง +คอเสื้อ +คอหอย +คอหอยกับลูกกระเดือก +คอหอยตีบ +คอหอยพอก +คอห่าน +คอแห้ง +คอแหลม +คออ่อน +คอฮาวาย +คะ +ค่ะ +คะไขว่ +คะค้อย +คะคาน +คะคึง +คะนน +คะนอง +คะน้า +คะนึง +คะเน +คะเนงร้าย +คะเน็ด +คะแนน +คะแนนนิยม +คะแนนเสียง +คะใน +คะมำ +คะมึก +คะยั้นคะยอ +คะเยอ +คัก +คั่ก +คัคน- +คัคนะ +คัคนัมพร +คัคนางค์ +คัคนานต์ +คั่ง +คั่งค้าง +คั่งแค้น +คังไคย +คัจฉ +คัณฑมาลา +คัณฑสูตร +คัด +คัดค้าน +คัดเค้า +คัดง้าง +คัดฉาก +คัดช้อน +คัดชุน +คัดท้าย +คัดมอน +คัดเม็ง +คัดเลือก +คัดเลือด +คัทลียา +คัน +คั่น +คั้น +คันขา +คันจาม +คันฉ่อง +คันฉัตร +คันฉาย +คันชัก +คันชั่ง +คันชีพ +คันดาลฉัตร +คันโดง +คันถ- +คันถธุระ +คันถรจนาจารย์ +คันทรง +คันธ +คันธ- +คันธ์ +คันธกุฎี +คันธมาทน์ +คันธารราษฎร์ +คันนา +คันบวย +คันโพง +คันเร่ง +คันหามเสือ +คับ +คับขัน +คับค้อน +คับคั่ง +คับคา +คับแค +คับแค้น +คับแคบ +คับใจ +คับอกคับใจ +คัพภ- +คัพภ์ +คัพภสาลี +คัพโภทร +คัมภีร- +คัมภีร์ +คัมภีรภาพ +คัล +คัว +คั่ว +คา +ค่า +ค้า +คากรอง +ค้าขาย +ค่าขึ้นศาล +ค่าคบ +ค่าครองชีพ +ค้าความ +ค้าค้า +คาง +ค่าง +ค้าง +คางคก +คางคกขึ้นวอ +คางคกไฟ +ค้างคาว +ค้างคืน +ค้างเดือนค้างปี +ค้างเติ่ง +คางทูม +คางโทน +คางเบือน +ค้างปี +คางหมู +คางเหลือง +คาด +คาดคั้น +คาดค่า +คาดไม่ถึง +คาดหน้า +คาดหมัด +ค่าตัว +คาถา +คาถาพัน +คาถาอาคม +คาทอลิก +ค่าที่ +คาธ +ค่าธรรมเนียม +ค่าธรรมเนียมศาล +คาน +ค้าน +คานคอดิน +คานหาม +คาน้า +ค่าน้ำ +คาบ +คาบเกี่ยว +คาบชุด +คาบลูกคาบดอก +คาบศิลา +คาบสมุทร +คาบเส้น +ค้าประเวณี +ค่าป่วยการ +ค่าปากเรือ +ค่าเผา +คาพยุต +ค่าภาคหลวง +คาม +คาม- +คามณี +คามณีย์ +คามภีร์ +คามโภชก +คามวาสี +คามี +คาย +ค่าย +คายก +คายก- +คายกคณะ +ค่ายกักกัน +ค่ายเยาวชน +ค่ายอาสาพัฒนา +คายัน +คาร์บอน +คาร์บอนไดออกไซด์ +คาร์บอนมอนอกไซด์ +คาร์บอเนต +คาร์บอลิก +คาร์บูเรเตอร์ +คาร์โบรันดัม +คาร์โบไฮเดรต +คารพ +คารม +คารวะ +คาราคาก่า +คาราคาซัง +คาราเต้ +คาราวาน +ค่าฤชาธรรมเนียม +คาว +ค่าว +ค้าว +คาวตอง +คาวปลา +คาวี +คาวุต +คาส +ค่าสัมบูรณ์ +ค่าสินไหมทดแทน +ค่าเสมอภาค +ค่าเสียหาย +ค่าหด +คาหนังคาเขา +ค่าหน้าดิน +ค่าหัว +คำ +ค่ำ +ค้ำ +คำขวัญ +คำขอ +คำขาด +คำคม +ค้ำคอ +ค่ำคืน +คำคู่ความ +ค้ำเงิน +ค้ำจุน +ค้ำชู +คำดีควาย +คำโดด +คำตั้ง +คำตาย +คำติดต่อ +คำเติม +คำใต้ +คำแถลง +คำแถลงการณ์ +คำทาย +คำเทียบ +คำนวณ +คำนวร +คำนับ +คำนัล +คำนำ +คำนึง +คำนูณ +คำบังคับ +คำโบล +ค้ำประกัน +คำประสม +คำปรารภ +คำเป็น +คำฝอย +คำพิพากษา +คำเพลิง +คำฟ้อง +คำฟ้องแย้ง +ค้ำฟ้า +คำมั่น +คำมั่นว่าจะให้รางวัล +คำมากพยางค์ +คำมูล +คำเมือง +คำรน +คำรบ +คำร้อง +คำร้องขอ +คำร้องทุกข์ +คำราม +คำสุภาพ +คำแสด +คำหลวง +ค้ำหัว +คำแหง +คำโอง +คิกๆ +คิง +คิด +คิดการใหญ่ +คิดคด +คิดค้น +คิดตก +คิดถึง +คิดมาก +คิดเล็กคิดน้อย +คิดสมบัติบ้า +คิดสั้น +คิดหน้าคิดหลัง +คิดเห็น +คิดอ่าน +คิมห +คิมหันต์ +คิมหานะ +คิริ +คิรี +คิลาน- +คิลานปัจจัย +คิลานเภสัช +คิลานะ +คิว +คิ้ว +คิ้วนาง +คี่ +คีต +คีตกะ +คีบ +คีม +คีรี +คีรีบูน +คึก +คึ่ก +คึ่กๆ +คึกคัก +คึกคาม +คืน +คืนคำ +คืนชีพ +คืนดี +คืนตัว +คืนยังรุ่ง +คืนให้ +คืบ +คืบก็ทะเล ศอกก็ทะเล +คือ +คุ +คุก +คุกกี้ +คุกเข่า +คุกคลาน +คุกคาม +คุกพาทย์ +คุคะ +คุง +คุ้ง +คุณ +คุณ- +คุณชาย +คุณธรรม +คุณนาม +คุณนาย +คุณบท +คุณพิเศษ +คุณภาพ +คุณลักษณะ +คุณลุงคุณป้า +คุณวิเศษ +คุณวุฒิ +คุณศัพท์ +คุณสมบัติ +คุณหญิง +คุณากร +คุณูปการ +คุโณปการ +คุด +คุดคู้ +คุดทะราด +คุดทะราดเหยียบกรวด +คุต +คุตติ +คุ่น +คุ้น +คุ้นเคย +คุป +คุปต์ +คุปติ +คุม +คุ่ม +คุ้ม +คุ้มกัน +คุมกำเนิด +คุ้มเกรง +คุ้มครอง +คุมแค้น +คุมเชิง +คุ้มดีคุ้มร้าย +คุ้มเท้า +คุ้มโทษ +คุมธาตุ +คุมนุม +คุมฝอย +คุ้มห้าม +คุย +คุ้ย +คุ้ยเขี่ย +คุยช้าง +คุยห- +คุยหฐาน +คุยหประเทศ +คุยหรหัสย์ +คุรุ +คุรุกรรม +คุรุวาร +คุรุศึกษา +คุลา +คุลาซ่อนลูก +คุลิก่า +คุลีการ +คุหา +คู +คู่ +คู้ +คู่กรณี +คู่ขา +คู่แข่ง +คู่ครอง +คู่ควร +คู่ความ +คู่ความร่วม +คู่คิด +คู่คี่ +คู่เคียง +คู่โค +คู่ใจ +คู่ฉบับ +คู่ฉีก +คู่ชัก +คู่ชีพ +คู่ชีวิต +คูณ +คูณร่วมน้อย +คูถ +คู่ทุกข์คู่ยาก +คูน +คู้บัลลังก์ +คู่บ้านคู่เมือง +คู่บารมี +คู่บุญ +คู่ปรปักษ์ +คู่ปรับ +คูปอง +คู่ผสม +คู่ผัวตัวเมีย +คู่พระคู่นาง +คู่พิพาท +คู่ม้า +คู่มิตร +คู่มือ +คู่ยาก +คู่รัก +คูเรียงคูราย +คู่เรียงเคียงหมอน +คูเรียม +คู่ลำดับ +คู่ศัตรู +คู่สร้าง +คู่สวด +คู่สัญญา +คู่สายโทรศัพท์ +คู่หมั้น +คูหา +คู่หู +คู่แห่ +คู่อริ +คู่อาฆาต +คู่อาศัย +เค้ก +เค้เก้ +เค้ง +เคจฉ +เคณฑะ +เคด +เคน +เค้น +เคเบิล +เค็ม +เคมี +เคมีภัณฑ์ +เคมีอนินทรีย์ +เคมีอินทรีย์ +เคย +เคยตัว +เคยปาก +เคยมือ +เครง +เคร่ง +เคร่งขรึม +เคร่งครัด +เครงครา +เครงครำ +เครงคร่ำ +เครงครื้น +เคร่งเครียด +เครงเครียว +เครดิต +เครดิตฟองซิเอร์ +เครน +เครา +เคร่า +เคราแพะ +เคราหณี +เคราะห์ +เคราะห์หามยามร้าย +เครียด +เครียว +เครือ +เครือเขา +เครือเขาน้ำ +เครือเขามวก +เครื่อง +เครื่องกล +เครื่องกัณฑ์ +เครื่องกิน +เครื่องแกง +เครื่องเขิน +เครื่องครัว +เครื่องควบแน่น +เครื่องคู่ +เครื่องเครา +เครื่องเงิน +เครื่องจักร +เครื่องช่วงล่าง +เครื่องเซ่น +เครื่องดนตรี +เครื่องต้น +เครื่องตั้ง +เครื่องทอง +เครื่องทองทิศ +เครื่องทองน้อย +เครื่องเทศ +เครื่องใน +เครื่องบน +เครื่องบันทึกเสียง +เครื่องบิน +เครื่องบูชา +เครื่องแบบ +เครื่องประดับ +เครื่องปรุง +เครื่องปั้นดินเผา +เครื่องผูก +เครื่องมั่น +เครื่องมือ +เครื่องยนต์ +เครื่องยนต์ไอพ่น +เครื่องร่อน +เครื่องราง +เครื่องราชอิสริยาภรณ์ +เครื่องร่ำ +เครื่องเรือน +เครื่องล่าง +เครื่องเล่น +เครื่องว่าง +เครื่องสด +เครื่องสะดุ้ง +เครื่องสับ +เครื่องสาย +เครื่องสำอาง +เครื่องสุกำศพ +เครื่องสูง +เครื่องหมาย +เครื่องหมายการค้า +เครื่องหยวก +เครื่องหลัง +เครื่องห้า +เครื่องเหล็ก +เครื่องใหญ่ +เครื่องอังทราย +เครื่องอังน้ำ +เครือจักรภพ +เครือดิน +เครือแย่ง +เครือรัฐ +เครือวัลย์พันไม้ +เคล้ง +เคล็ด +เคล้น +เคล้า +เคล่าคล่อง +เคล้าคลึง +เคล้าเคลีย +เคลิบเคลิ้ม +เคลิ้ม +เคลีย +เคลียคลอ +เคลี้ยคลิง +เคลียเคล้า +เคลื่อน +เคลื่อนคลาด +เคลื่อนที่ +เคลื่อนไหว +เคลือบ +เคลือบคลุม +เคลือบแคลง +เคลือบแฝง +เคลือบฟัน +เคว้ง +เคว้งคว้าง +เคห- +เคหศาสตร์ +เคหเศรษฐศาสตร์ +เคหสถาน +เคหะ +เคหา +เคอย +เคอะ +เคา +เค้า +เค้าโครง +เค้าเงื่อน +เคาน์เตอร์ +เค้ามูล +เคารพ +เค้าสนามหลวง +เคาะ +เคาะแคะ +เคี้ย +เคียง +เคียงบ่าเคียงไหล่ +เคียด +เคียดแค้น +เคียน +เคียม +เคี่ยม +เคี่ยมคะนอง +เคียร +เคียว +เคี่ยว +เคี้ยว +เคี่ยวขัน +เคี่ยวขับ +เคี่ยวเข็ญ +เคี้ยวฟัน +เคี้ยวเอื้อง +เคื้อ +เคือง +แค +แค่ +แค้ +แคแกล +แคดเมียม +แค็ตตาล็อก +แคแตร +แคโทด +แคน +แค่น +แค้น +แค้นคอ +แค่นแคะ +แค่นไค้ +แคบ +แคบหมู +แคปซูล +แคฝรั่ง +แคฝอย +แคม +แคร่ +แครก +แครครั่ง +แครง +แครงเครียว +แคระ +แคลคูลัส +แคลง +แคลงใจ +แคลเซียม +แคลเซียมคาร์ไบด์ +แคลเซียมไซคลาเมต +แคลน +แคล้ว +แคล่วคล่อง +แคล้วคลาด +แคลอรี +แคลิฟอร์เนียม +แคแล +แคว +แควก +แคว้ง +แคว้น +แคแสด +แคะ +แคะไค้ +โค +โคก +โคกกระสุน +โคกกระออม +โคกม้า +โคแก่ชอบกินหญ้าอ่อน +โคคลาน +โคเคน +โค่ง +โค้ง +โคจร +โคจร- +โคจรคาม +โคเซแคนต์ +โคไซน์ +โคตร +โคตร- +โคตรภู +โคตรภูญาณ +โคเถลิง +โคแทนเจนต์ +โคธา +โคน +โค่น +โคนดินสอ +โคนตายปลายเป็น +โคนม +โคนสมอ +โคบอลต์ +โคบาล +โคบุตร +โคปผกะ +โคเพลาะ +โคไพร +โคม +โคมดอกไม้ +โคมตาวัว +โคมลอย +โคมเวียน +โคมัย +โคม่า +โคมูตร +โครก +โครกครอก +โครกคราก +โครง +โคร่ง +โครงการ +โคร่งคร่าง +โครงแคร +โครงจมูก +โครงเรื่อง +โครงสร้าง +โครม +โครมคราม +โครเมียม +โครโมโซม +โครส +โคราช +โครำ +โคโรค +โคล +โคลง +โคลงเคลง +โคลน +โควตา +โควิถี +โคศัพท์ +โคออร์ดิเนต +ใคร +ใคร่ +ใคร่ครวญ +ไค +ไค้ +ไคร้ +ไคร้เครือ +ไคล +ไคล้ +ฅ +ฆ +ฆน +ฆราวาส +ฆ้อง +ฆ้องกระแต +ฆ้องชัย +ฆ้องปากแตก +ฆ้องวง +ฆ้องสามย่าน +ฆ้องหุ่ย +ฆ้องเหม่ง +ฆ้องโหม่ง +ฆ่า +ฆ่าควายอย่าเสียดายพริก +ฆาฏ +ฆาต +ฆาต- +ฆาตกร +ฆาตกรรม +ฆาน +ฆาน- +ฆานประสาท +ฆ่าไม่ตายขายไม่ขาด +เฆี่ยน +โฆรวิส +โฆษก +โฆษณา +โฆษณาการ +โฆษณาชวนเชื่อ +โฆษะ +โฆษิต +ง +งก +งกเงิ่น +งกๆ เงิ่นๆ +งง +งงงวย +งงงัน +งงิด +งด +งดงาม +งบ +งบดุล +งบประมาณ +งม +งมเข็มในมหาสมุทร +งมโข่ง +งมงาย +งวง +ง่วง +ง่วงงุน +งวงช้าง +ง่วงเหงา +ง่วงเหงาหาวนอน +งวด +ง่วน +ง้วน +งวยงง +งอ +ง้อ +งอก +งอกงาม +งอกเงย +งอกแงก +งอก่องอขิง +ง่อง +ง่องแง่ง +ง้องอน +งอแง +งอด +งอดแงด +งอน +ง่อน +งอนง้อ +ง่อนแง่น +งอนไถ +งอนหง่อ +ง้อนหมู +งอบ +งอม +ง้อม +งอมแงม +งอมพระราม +งอมืองอตีน +งอย +ง่อย +ง่อยเปลี้ยเสียขา +งอหาย +งะ +งักๆ +งั่กๆ +งังๆ +งั่ง +งัด +งัดข้อ +งัน +งันงก +งับ +งับแง +งัว +งั่ว +งัวเงีย +งัวซัง +งัวเลีย +งา +ง่า +งากำจาย +งาเครือ +ง้าง +ง่าเงย +งาช้าง +งาแซง +งาไซ +งาตัด +งาน +ง่าน +งานการ +งานหลวงไม่ให้ขาด งานราษฎร์ไม่ให้เสีย +งาบๆ +งาม +ง่าม +งามงอน +งามแงะ +ง่ามถ่อ +งามหน้า +งาย +ง่าย +ง่ายๆ +ง่ายดาย +ง่าย้อย +งาลั่ว +ง้าว +งาสาน +งำ +ง่ำ +ง่ำๆ +ง้ำ +งิ้ว +งีบ +งึกๆ +งึน +งึม +งึมงำ +งุด +งุดๆ +งุนงง +งุ่นง่าน +งุบ +งุบๆ +งุบงิบ +งุ้ม +งุ่มง่าม +งุย +งู +งูกลืนหาง +งูกินหาง +งูบ +งูๆ ปลาๆ +งูผู้ +งูเมีย +งูสวัด +งู่หนี +งูเหลือม +งูเห่า +เง้ +เงก +เง็น +เงย +เงยหน้าอ้าปาก +เงอะ +เงอะงะ +เงา +เงาๆ +เง่า +เง้า +เง้างอด +เง้าๆ งอดๆ +เงาตามตัว +เงามัว +เงามืด +เงาะ +เงาะป่า +เงิน +เงินก้นถุง +เงินก้อน +เงินกู้ +เงินเชื่อ +เงินดาวน์ +เงินเดือน +เงินแดง +เงินได้กำบัง +เงินต้น +เงินตรา +เงินตาย +เงินทองตรา +เงินทอน +เงินนอน +เงินน้ำห้าน้ำหก +เงินปลีก +เงินปันผล +เงินปากถุง +เงินปากผี +เงินปี +เงินแป +เงินผ่อน +เงินฝืด +เงินเฟ้อ +เงินมุ่น +เงินยวง +เงินเยอรมัน +เงินร้อน +เงินรายปี +เงินสด +เงินสเตอร์ลิง +เงินหลวง +เงินแห้ง +เงี่ยง +เงี่ยน +เงียบ +เงียบกริบ +เงียบเชียบ +เงียบเป็นเป่าสาก +เงียบเหงา +เงี้ยว +เงี้ยวระเริง +เงี้ยวรำลึก +เงี่ยหู +เงื้อ +เงือก +เงื่อง +เงื่องๆ +เงื่องหงอย +เงื้อง่าราคาแพง +เงือด +เงือดงด +เงือดเงื้อ +เงือน +เงื่อน +เงื่อนไข +เงื่อนไขบังคับก่อน +เงื่อนไขบังคับหลัง +เงื่อนงำ +เงื่อนเวลา +เงื่อนเวลาเริ่มต้น +เงื่อนเวลาสิ้นสุด +เงือบ +เงื้อม +เงื้อมมือ +แง +แงๆ +แง่ +แง่ง +แง่งๆ +แง่งขิง +แง่งอน +แง่น +แง่นๆ +แง้ม +แงะ +โง +โง่ +โงก +โงกเงก +โง่แกมหยิ่ง +โงง +โง่งๆ +โง้ง +โงงเงง +โง่งเง่ง +โงเง +โง่เง่า +โง่เง่าเต่าตุ่น +โงน +โงนเงน +โง่แล้วอยากนอนเตียง +ไง้ +จ +จก +จง +จ่ง +จ๋ง +จงกรม +จงกรมแก้ว +จงกล +จงกลนี +จงเกลียดจงชัง +จงโคร่ง +จงใจ +จงดี +จงรัก +จงรักภักดี +จงอร +จงอาง +จแจ้น +จญ +จด +จดจ่อ +จดจ้อง +จดๆ จ้องๆ +จดจำ +จดทะเบียน +จดหมัด +จดหมาย +จดหมายเวียน +จดหมายเหตุ +จดุร +จดุรงค์ +จดูร- +จตุ- +จตุกาลธาตุ +จตุตถ- +จตุตถี +จตุทิพยคันธา +จตุบท +จตุบริษัท +จตุปัจจัย +จตุปาริสุทธิศีล +จตุร- +จตุรคูณ +จตุรงค์ +จตุรงคนายก +จตุรงคประดับ +จตุรงคยมก +จตุรถ- +จตุรพักตร์ +จตุรพิธ +จตุรพิธพร +จตุรภุช +จตุรภูมิ +จตุรยุค +จตุราริยสัจ +จตุลังคบาท +จตุโลกบาล +จตุสดมภ์ +จทึง +จน +จ้น +จนกระทั่ง +จนกว่า +จนชั้น +จนด้วยเกล้า +จนถึง +จนแล้วจนรอด +จบ +จบเห่ +จม +จ่ม +จมเบ้า +จมปลัก +จมไม่ลง +จมร +จมรี +จมูก +จมูกปลาหลด +จมูกปลาไหล +จมูกมด +จมูกวัว +จมูกหลอด +จยุติ +จร +จร- +จรก +จรกลู่ +จรแกว่ง +จรคั่ง +จรจรัล +จรจัด +จรณะ +จรด +จรดพระกรรไตรกรรบิด +จรดพระนังคัล +จรดล +จรบน +จรบัน +จรบาท +จรมัน +จรมูก +จรรจา +จรรโจษ +จรรม +จรรม- +จรรมการ +จรรมขัณฑ์ +จรรยา +จรรยาบรรณ +จรรโลง +จรลวง +จรล่วง +จรลาด +จรลาย +จรล่ำ +จรลิ่ว +จรลี +จรลู่ +จรวจ +จรวจไจร +จรวด +จรวดจรี +จรวดนำวิถี +จรวัก +จรส +จรอก +จระกล้าย +จระขาบ +จระเข้ +จระเข้ปากกระทุงเหว +จระเข้หางยาว +จระคลับ +จระคล้าย +จระคลุ่ม +จระแคง +จระจุ่ม +จระทก +จระเทิน +จระนำ +จระบาน +จระบี +จระลิ่ง +จระลึง +จระลุง +จรัล +จรัส +จราก +จราง +จราจร +จราญ +จราย +จราว +จราส +จริก +จริง +จริงๆ +จริงจัง +จริงใจ +จริงอยู่ +จริต +จริม- +จริย- +จริยธรรม +จริยวัตร +จริยศาสตร์ +จริยศึกษา +จริยา +จริยาปิฎก +จริยาวัตร +จริว +จรี +จรึง +จรุก +จรุง +จรูง +จรูญ +จรูส +จเร +จล +จลนพลศาสตร์ +จลนศาสตร์ +จลนี +จลา +จลาจล +จวก +จ๊วก +จวง +จ้วง +จ๋วง +จ๋วงเครือ +จวงจันทน์ +จ้วงจาบ +จวงหอม +จวด +จวดลาก +จวน +จวนเจียน +จวนแจ +จวนตัว +จวบ +จวบจวน +จวัก +จอ +จ่อ +จ้อ +จ๋อ +จอก +จ้อก +จ้อกๆ +จ๊อก +จ๊อกๆ +จ้อกแจ้ก +จ้อกวอก +จอกหูหนู +จอง +จ่อง +จ้อง +จ๋อง +จองคช +จองจำ +จ้องเต +จองถนน +จองเปรียง +จองเวรจองกรรม +จองหง่อง +จ้องหน่อง +จองหอง +จองหองพองขน +จอแจ +จ๋อแจ๋ +จอด +จอน +จ้อน +จอนจ่อ +จอนหู +จอบ +จอม +จ่อม +จอมขวัญ +จ่อมจ่าย +จอมใจ +จอมไตร +จอมทอง +จอมทัพ +จอมปลวก +จอมปลอม +จ้อมป้อม +จอมเปาะ +จอมพล +จอมมารดา +จอมสุรางค์ +จ่อย +จ้อย +จ๋อย +จ๋อยๆ +จอแส +จะ +จ้ะ +จ๊ะ +จ๋ะ +จะกรัจจะกราจ +จะกรุน +จะกรุมจะกราม +จะกรูน +จะกละ +จะกลาม +จะกวด +จะกูด +จะเกร็ง +จะขาบ +จะเข้ +จะเข็บ +จะงอย +จะจะ +จะจ้า +จะแจ้ง +จะแจ่ม +จะไจ้ +จะบัน +จะปิ้ง +จะปิ้งเรือ +จะเพลิง +จะละเม็ด +จะละหวั่น +จะลุง +จ๊ะเอ๋ +จัก +จั้กๆ +จักกาย +จั๊กกิ้ม +จักขุ +จักขุทวาร +จักขุประสาท +จักขุวิญญาณ +จักขุสัมผัส +จักจั่น +จักจี้ +จั๊กจี้ +จั๊กเดียม +จักร +จักร- +จักรปาณิ +จักรปาณี +จักรพรรดิ +จักรพาก +จักรพาล +จักรภพ +จักรยาน +จักรยานยนต์ +จักรราศี +จักรวรรดิ +จักรวรรดินิยม +จักรวาก +จักรวาต +จักรวาล +จักริน +จักรี +จั๊กเล้อ +จักษุ +จักสาน +จักแหล่น +จัง +จั้ง +จั๋ง๑ +จังกวด +จังกอบ +จังกา +จังก้า +จังกูด +จังเก +จังโกฏก์ +จังงัง +จังมัง +จั้งมั่ง +จังไร +จังลอน +จังเว็จ +จังหนับ +จังหน้า +จังหรีด +จังหล่อ +จังหวะ +จังหวัด +จังหัน +จังออน +จัญไร +จัณฑ- +จัณฑ์ +จัณฑวาตา +จัณฑาล +จัด +จัดการ +จัดจอง +จัดจ้า +จัดจ้าน +จัดเจน +จัดแจง +จัดตั้ง +จัดประกัน +จัดมั่น +จัดสรร +จัดหา +จัตตาฬีส +จัตวา +จัตวาทัณฑี +จัตวาศก +จัตุ +จัตุร- +จัตุรงค์ +จัตุรพักตร์ +จัตุรภุช +จัตุรมุข +จัตุรัส +จัตุโลกบาล +จัตุสดมภ์ +จัน +จั่น +จันโจษ +จั่นดิน +จันท์ +จันทน์ +จันทน์กะพ้อ +จันทน์ขาว +จันทน์ชะมด +จันทน์แดง +จันทน์เทศ +จันทน์ผา +จันทน์หอม +จันทนา +จันทร- +จันทร์ +จันทรกลา +จันทรกานต์ +จันทรคติ +จันทรคราส +จันทรพิมพ์ +จันทรมณฑล +จันทรเม็ด +จันทรวงศ์ +จันทรเศขร +จันทรุปราคา +จันทัน +จันทันพราง +จันลอง +จันเลา +จันเลาะ +จั้นหล่อ +จั่นหับ +จั่นห้าว +จันอับ +จับ +จับกลุ่ม +จับกัง +จับกุม +จับเขม่า +จับไข้ +จับความ +จับงูข้างหาง +จับจด +จับจอง +จับจ่าย +จับจิต +จับเจ่า +จับเจี๋ยว +จับใจ +จับฉ่าย +จับเชิง +จับดำถลำแดง +จับเดิม +จับตัววางตาย +จับตา +จับตาดู +จับตาย +จับปิ้ง +จับเป็น +จับโปง +จับผิด +จับพลัดจับผลู +จับแพะชนแกะ +จับยาม +จับยี่กี +จับระบำ +จับเวลา +จับสั่น +จับสายสิญจน์ +จับเสือมือเปล่า +จับหลัก +จับหวัด +จับหัวเข่าพูด +จัมบก +จัมปก +จัมมะ +จัว +จั่ว +จั๊วะ +จา +จ่า +จ้า +จ๋า +จาก +จากพราก +จากพาก +จ่ากลอง +จาค- +จาคี +จาง +จ่าง +จ้าง +จางวาง +จาด +จาดตะกั่ว +จาตุ- +จาตุกรณีย์ +จาตุทสี +จาตุมหาราช +จาตุร- +จาตุรงค- +จาตุรงค์ +จาตุรงคสันนิบาต +จาตุรนต์ +จาตุรนต์รัศมี +จาตุรราชการ +จาตุรันต์ +จาน +จ้าน +จานจ่าย +จานเจือ +จานเชิง +จานบิน +จานผี +จานเสียง +จาบ +จาบจ้วง +จาบัล +จาบัลย์ +จาป +จ่าปี่ +จาม +จ่ามงกุฎ +จามจุรี +จามร +จามรี +จามีกร +จ่าย +จ่ายตลาด +จาร +จ่ารง +จารวาก +จาระไน +จาระบี +จาริก +จารี +จารีต +จารีตนครบาล +จารีตประเพณี +จารึก +จารุ +จ้าละหวั่น +จาว +จาวๆ +จ่าว +จ้าว +จาวมะพร้าว +จ่าหน้า +จ่าหวัก +จำ +จ้ำ +จำกว่า +จำกัด +จำกัดความ +จำกัดจำเขี่ย +จำกัดสินใช้ +จำครบ +จำงาย +จำจอง +จ้ำจี้ +จ้ำจี้จ้ำไช +จำเจ +จำเดิม +จำทวย +จำทับ +จำทาบ +จำเทิด +จำแทง +จำนง +จำนน +จำนรรจ์ +จำนรรจา +จำนวน +จำนวนจริง +จำนวนจินตภาพ +จำนวนเชิงซ้อน +จำนวนตรรกยะ +จำนวนเต็ม +จำนวนนับ +จำนวนอตรรกยะ +จำนอง +จำนับ +จำนัล +จำนำ +จำนำพรรษา +จำเนียน +จำเนียม +จำเนียร +จำแนก +จำโนทย์ +จำบ่ม +จำบัง +จำบับ +จำเบศ +จ้ำเบ้า +จำแบ +จำปา +จำปาขอม +จำปาแขก +จำปาดะ +จำปาทองเทศ +จำปาลาว +จำปาหอม +จำปี +จำปีแขก +จำปูน +จำเป็น +จำพรรษา +จำพวก +จำเพาะ +จำแพรก +จ้ำม่ำ +จำรด +จำรัส +จำราญ +จำราย +จำรูญ +จำเริญ +จำเรียง +จำลอง +จำลองทอง +จำลาย +จำเลย +จำเลาะ +จำเลาะตา +จำแลง +จำแล่น +จำวัด +จำศีล +จำหนับ +จ๋ำหนับ +จำหน่าย +จำหระ +จำหล่อ +จำหลอก +จำหลัก +จำหัน +จำห้าประการ +จำหาย +จำหุด +จำเหียง +จำอวด +จำอื่น +จิ +จิก +จิกปีก +จิกหัว +จิ่ง +จิ้งจก +จิงจ้อ +จิ้งจอก +จิงจัง +จิ้งจัง +จิงโจ้ +จิงโจ้น้ำ +จิ้งหรีด +จิ้งหรีดผี +จิ้งเหลน +จิ้งเหลนด้วง +จิต +จิต- +จิตกาธาน +จิตกึ่งสำนึก +จิตใจ +จิตต- +จิตต์ +จิตตภาวนา +จิตตวิสุทธิ +จิตตานุปัสสนา +จิตใต้สำนึก +จิตนิยม +จิตบำบัด +จิตแพทย์ +จิตภาพ +จิตร +จิตร- +จิตรกร +จิตรกรรม +จิตรจุล +จิตรปทา +จิตรลดา +จิตรเลขา +จิตระ +จิตรา +จิตไร้สำนึก +จิตวิทยา +จิตวิสัย +จิตเวชศาสตร์ +จิตสำนึก +จินเจา +จินดา +จินดามณี +จินดามัย +จินดาหนา +จินดาหรา +จินต- +จินต์ +จินตกวี +จินต์จล +จินตนาการ +จินตภาพ +จิบ +จิปาถะ +จิ่ม +จิ้ม +จิ้มก้อง +จิ้มฟันจระเข้ +จิ้มลิ้ม +จิร- +จิรกาล +จิรัฐิติกาล +จิ๋ว +จี +จี่ +จี้ +จี๋ +จี๋จ้อ +จี่จู้ +จีแจ๊บ +จี๊ด +จีน +จีนเต็ง +จีนแส +จีนแสโสกา +จีบ +จีบปากจีบคอ +จีบพลู +จีโบ +จีพร +จีม +จีวร +จีวร- +จีวรกรรม +จีวรการสมัย +จีวรกาลสมัย +จีวรทานสมัย +จีวรภาชก +จี้เส้น +จึง +จึ่ง +จึ้ง +จืด +จืดจาง +จืดชืด +จืดตา +จื้นเจือก +จุ +จุๆ +จุก +จุ๊กกรู๊ +จุกจิก +จุกเจ่า +จุกช่องล้อมวง +จุกชี +จุกผาม +จุกผามม้ามย้อย +จุกพราหมณ์ +จุกยา +จุกโรหินี +จุ่ง +จุ้งจัง +จุ๋งจิ๋ง +จุใจ +จุฑา +จุฑาธิปไตย +จุฑามณี +จุฑามาศ +จุฑารัตน์ +จุณ +จุณณียบท +จุด +จุดจบ +จุดเด่น +จุดเดือด +จุดไต้ตำตอ +จุดทศนิยม +จุดน้ำค้าง +จุดบอด +จุดยืน +จุดยุทธศาสตร์ +จุดเยือกแข็ง +จุดรวม +จุดลูกน้ำ +จุดศูนย์กลาง +จุดศูนย์ถ่วง +จุดสัมผัส +จุดหมาย +จุดหมายปลายทาง +จุดหลอมเหลว +จุดหลัง +จุดเหี่ยวเฉา +จุดอ่อน +จุดอิ่มตัว +จุติ +จุตูปปาตญาณ +จุทส +จุทสมสุรทิน +จุน +จุ่น +จุ้น +จุ้นจ้าน +จุนจู๋ +จุ้นจู๊ +จุนเจือ +จุนทการ +จุนสี +จุบ +จุ๊บ +จุบจิบ +จุ๊บแจง +จุปาก +จุ่ม +จุ้ม +จุ๋มจิ๋ม +จุมพฏ +จุมพรวด +จุมพล +จุมพิต +จุมโพล่ +จุ้ย +จุรณ +จุรี +จุไร +จุล- +จุลกฐิน +จุลจอมเกล้า +จุลชีพ +จุลชีวัน +จุลชีวิน +จุลทรรศน์ +จุลภาค +จุลวงศ์ +จุลวรรค +จุลศักราช +จุลสาร +จุลินทรีย์ +จุฬา +จุฬามณี +จุฬาราชมนตรี +จุฬาลักษณ์ +จุฬาลัมพา +จู +จู่ +จู่ๆ +จู้ +จู๋ +จูง +จูงจมูก +จูงใจ +จูงนางเข้าห้อง +จูงนางลีลา +จูงมือ +จู้จี้ +จู๋จี๋ +จู่โจม +จู๊ด +จูบ +จูบฝุ่น +จูรณ +จู่ลู่ +เจ +เจ๊ก +เจ๊กตื่นไฟ +เจ่ง +เจ้ง +เจ๊ง +เจ็ด +เจ็ดชั่วโคตร +เจ็ดตะคลี +เจดีย- +เจดีย์ +เจดียถาน +เจดีย์ทิศ +เจดียสถาน +เจต +เจต- +เจตคติ +เจตจำนง +เจตนา +เจตนารมณ์ +เจตพังคี +เจตภูต +เจตมูลเพลิง +เจตมูลเพลิงฝรั่ง +เจตสิก +เจติย- +เจโตวิมุติ +เจน +เจนจบ +เจนจัด +เจนใจ +เจ็บ +เจ็บไข้ +เจ็บแค้น +เจ็บใจ +เจ็บช้ำน้ำใจ +เจ็บท้อง +เจ็บปวด +เจ็บป่วย +เจ็บร้อน +เจ็บแสบ +เจรจา +เจริญ +เจริญตาเจริญใจ +เจริญพร +เจริญพันธุ์ +เจริญรอย +เจริญสมณธรรม +เจริญอาหาร +เจริด +เจรียง +เจลียง +เจว็ด +เจษฎา +เจ๊สัว +เจอ +เจ่อ +เจ๋อ +เจ๋อเจ๊อะ +เจอร์เมเนียม +เจอะ +เจา +เจ่า +เจ้า +เจ๊า +เจ้ากรม +เจ้ากรรม +เจ้ากรรมนายเวร +เจ้ากระทรวง +เจ้ากี้เจ้าการ +เจ้ากู +เจ้าขรัว +เจ้าของ +เจ้าขา +เจ้าข้า +เจ้าข้าวแดงแกงร้อน +เจ้าขุนมุลนาย +เจ้าขุนมูลนาย +เจ้าไข้ +เจ้าคณะ +เจ้าครอก +เจ้าคารม +เจ้าคุณ +เจ้าคุณจอม +เจ้าแง่เจ้างอน +เจ้าแง่แสนงอน +เจ้าจอม +เจ้าจอมมารดา +เจ้าจำนวน +เจ้าจำนำ +เจ่าจุก +เจ้าชีวิต +เจ้าชู้ +เจ้าเซ็น +เจ้าเซ็นเต้นต้ำบุด +เจ้าตัว +เจ้าถ้อยหมอความ +เจ้าท่า +เจ้าที่ +เจ้าทุกข์ +เจ้าไทย +เจ้านาย +เจ้าเนื้อ +เจ้าบ้าน +เจ้าบ่าว +เจ้าบุญนายคุณ +เจ้าเบี้ย +เจ้าประคุณ +เจ้าประคู้น +เจ้าปู่ +เจ้าพนักงาน +เจ้าพนักงานบังคับคดี +เจ้าพนักงานพิทักษ์ทรัพย์ +เจ้าพนักงานภูษามาลา +เจ้าพนักงานสนมพลเรือน +เจ้าพระเดชนายพระคุณ +เจ้าพระยา +เจ้าพ่อ +เจ้าพายุ +เจ้าฟ้า +เจ้าฟ้าหญิงสิรินธร +เจ้าภาพ +เจ้าภาษี +เจ้ามรดก +เจ้ามือ +เจ้าแม่ +เจ้าไม่มีศาล สมภารไม่มีวัด +เจ้ายศ +เจ้าเรือน +เจ้าเล่ห์ +เจ้าสัว +เจ้าสาว +เจ้าสำนวน +เจ้าสำบัดสำนวน +เจ้าสำราญ +เจ้าหน้า +เจ้าหน้าเจ้าตา +เจ้าหน้าที่ +เจ้าหนี้ +เจ้าหลวง +เจ้าหล่อน +เจ้าหัว +เจ้าอธิการ +เจ้าอารมณ์ +เจ้าอาวาส +เจาะ +เจาะจง +เจาะจมูก +เจิ่ง +เจิด +เจิดจ้า +เจิ่น +เจิม +เจีย +เจียง +เจียด +เจียดยา +เจียน +เจี๋ยน +เจี๊ยบ +เจียม +เจี๋ยมเจี้ยม +เจียมสังขาร +เจียร +เจียระไน +เจียระบาด +เจียว +เจี๊ยวจ๊าว +เจือ +เจือจาง +เจือจาน +เจื่อน +เจือปน +เจื้อย +เจื้อยแจ้ว +เจือสม +แจ +แจ้ +แจ๋ +แจก +แจกจ่าย +แจกแจง +แจกไพ่ +แจกัน +แจง +แจ่ง +แจ้ง +แจ้งความ +แจงรูป +แจงลอน +แจงสี่เบี้ย +แจจน +แจจัน +แจ๊ด +แจดแจ้ +แจ๊ดแจ๋ +แจตร +แจ้น +แจบ +แจ่ม +แจ่มแจ้ง +แจ่มใส +แจร +แจรก +แจรง +แจว +แจ่ว +แจ้ว +แจ้วๆ +แจ๋ว +แจ๋วแหวว +แจะ +โจก +โจ๊ก +โจง +โจงกระเบน +โจงกระเบนตีเหล็ก +โจ่งครึ่ม +โจ๋งครึ่ม +โจ่งครุ่ม +โจงโคร่ง +โจ๋งเจ๋ง +โจ่งแจ้ง +โจท +โจทก์ +โจทเจ้า +โจทนา +โจทย์ +โจน +โจนร่ม +โจม +โจมตี +โจมทัพ +โจร +โจร- +โจรกรรม +โจรสลัด +โจล +โจษ +โจษจน +โจษจัน +โจษแจ +ใจ +ใจกลาง +ใจกว้าง +ใจขุ่น +ใจแข็ง +ใจความ +ใจคอ +ใจแคบ +ใจง่าย +ใจจดใจจ่อ +ใจจืด +ใจเฉื่อย +ใจชื้น +ใจดำ +ใจดี +ใจเด็ด +ใจเดียว +ใจเดียวกัน +ใจต่ำ +ใจเติบ +ใจแตก +ใจโต +ใจถึง +ใจน้อย +ใจบาน +ใจบุญ +ใจเบา +ใจปลาซิว +ใจป้ำ +ใจแป้ว +ใจฝ่อ +ใจเพชร +ใจมา +ใจมือ +ใจไม่ดี +ใจไม้ไส้ระกำ +ใจยักษ์ +ใจเย็น +ใจร้อน +ใจร้าย +ใจเร็ว +ใจลอย +ใจสูง +ใจเสาะ +ใจเสีย +ใจหนักแน่น +ใจหาย +ใจเหี่ยวแห้ง +ใจใหญ่ใจโต +ใจอ่อน +ไจ +ไจ้ +ไจ้ๆ +ไจร +ฉ +ฉก +ฉกจวัก +ฉกฉวย +ฉกชิง +ฉกรรจ์ +ฉกรรจ์ลำเครื่อง +ฉกษัตริย์ +ฉกาจ +ฉกาจฉกรรจ์ +ฉกามาพจร +ฉกามาวจร +ฉง +ฉงน +ฉงาย +ฉทวาร +ฉทานศาลา +ฉทึง +ฉนวน +ฉนัง +ฉนาก +ฉนำ +ฉบบ +ฉบัง +ฉบัด +ฉบับ +ฉบำ +ฉพีสติม- +ฉม +ฉมบ +ฉมวก +ฉมวย +ฉม่อง +ฉมัง +ฉมัน +ฉมา +ฉมำ +ฉล +ฉลวย +ฉลวยฉลาด +ฉลอง +ฉลองได +ฉลองพระกรน้อย +ฉลองพระเนตร +ฉลองพระบาท +ฉลองพระศอ +ฉลองพระหัตถ์ +ฉลองพระองค์ +ฉลององค์ +ฉลอม +ฉลอมท้ายญวน +ฉลัก +ฉลับ +ฉลาก +ฉลากบาง +ฉลาง +ฉลาด +ฉลาม +ฉลามเสือ +ฉลาย +ฉลิว +ฉลีก +ฉลุ +ฉลุกฉลวย +ฉลุลาย +ฉลู +ฉวย +ฉวยฉาบ +ฉวะ +ฉวัดเฉวียน +ฉวาง +ฉวี +ฉศก +ฉ้อ +ฉอก +ฉ้อโกง +ฉ่อง +ฉ้อฉล +ฉอดๆ +ฉ่อย +ฉ้อราษฎร์บังหลวง +ฉอเลาะ +ฉะ +ฉะกะ +ฉะฉาด +ฉะฉาน +ฉะฉ่ำ +ฉะฉี่ +ฉะเฉื่อย +ฉะต้า +ฉะนั้น +ฉะนี้ +ฉะหน้าโรง +ฉะอ้อน +ฉักกะ +ฉัฐ +ฉัด +ฉัตร +ฉัตร- +ฉัตรบรรณ +ฉัตรมงคล +ฉัตรสามชั้น +ฉัททันต์ +ฉัน +ฉันใด +ฉันท- +ฉันท์ +ฉันทลักษณ์ +ฉันทวิลาส +ฉันทศาสตร์ +ฉันทะ +ฉันทา +ฉันทาคติ +ฉันทานุมัติ +ฉันนั้น +ฉันวุติ +ฉับ +ฉับๆ +ฉับพลัน +ฉับไว +ฉัพพรรณรังสี +ฉัยยา +ฉ่า +ฉาก +ฉากญี่ปุ่น +ฉากตั้ง +ฉากทิ้ง +ฉากน้อย +ฉากบังเพลิง +ฉากใหญ่ +ฉาง +ฉ่าง +ฉ่าฉาว +ฉาด +ฉาดฉาน +ฉาตกภัย +ฉาทน +ฉาน +ฉาบ +ฉาบฉวย +ฉาป +ฉาย +ฉายเฉิด +ฉายา +ฉายาลักษณ์ +ฉาว +ฉาวโฉ่ +ฉ่ำ +ฉำฉา +ฉำเฉง +ฉำแฉะ +ฉิ่ง +ฉิ่งตรัง +ฉิน +ฉินท- +ฉินท์ +ฉินทฤกษ์ +ฉิบ +ฉิบหาย +ฉิมพลี +ฉิว +ฉี่ +ฉีก +ฉีกหน้า +ฉีด +ฉีดยา +ฉุ +ฉุก +ฉุกคิด +ฉุกใจ +ฉุกเฉิน +ฉุกละหุก +ฉุด +ฉุน +ฉุนเฉียว +ฉุป +ฉุป- +ฉุปศาสตร์ +ฉุย +ฉุยฉาย +ฉุยฉายเข้าวัง +ฉู่ +ฉู่ฉี่ +ฉูด +ฉูดฉาด +เฉ +เฉก +เฉโก +เฉ่ง +เฉไฉ +เฉด +เฉท +เฉนียน +เฉพาะ +เฉพาะกาล +เฉพาะกิจ +เฉพาะตัว +เฉพาะพระพักตร์ +เฉพาะหน้า +เฉย +เฉยๆ +เฉยเมย +เฉลย +เฉลว +เฉลา +เฉลิม +เฉลิมพระชนมพรรษา +เฉลี่ย +เฉลียง +เฉลี่ยง +เฉลียบ +เฉลียว +เฉลียวใจ +เฉลียวฉลาด +เฉวียง +เฉวียงบ่า +เฉวียน +เฉอะแฉะ +เฉา +เฉาก๊วย +เฉาโฉด +เฉาฮื้อ +เฉาะ +เฉาะๆ +เฉาะปล่อง +เฉิด +เฉิดฉัน +เฉิดฉาย +เฉิดฉิน +เฉิบ +เฉิบๆ +เฉียง +เฉียงพร้าดำ +เฉียงพร้านางแอ +เฉียงพร้ามอญ +เฉียด +เฉียบ +เฉียบขาด +เฉียบพลัน +เฉียบแหลม +เฉียว +เฉี่ยว +เฉียวฉุน +เฉือน +เฉื่อย +เฉื่อยๆ +เฉื่อยชา +แฉ +แฉ่ +แฉก +แฉกๆ +แฉง +แฉ่ง +แฉโพย +แฉลบ +แฉล้ม +แฉละ +แฉว +แฉะ +แฉะแบะ +โฉ +โฉ่ +โฉเก +โฉ่งฉ่าง +โฉงเฉง +โฉ่ฉาว +โฉด +โฉดเฉา +โฉนด +โฉบ +โฉเบ๊ +โฉม +โฉมงาม +โฉมฉาย +โฉมเฉลา +โฉมตรู +โฉมยง +โฉมศรี +โฉมหน้า +โฉลก +ไฉน +ไฉไล +ช +ชก +ชกมวย +ชกา +ชค- +ชคดี +ชคัตตรัย +ชง +ชงคา +ชงโค +ชงฆ- +ชงฆ์ +ชงฆา +ชงโลง +ชฎา +ชฎากลีบ +ชฎาเดินหน +ชฎาธาร +ชฎาแปลง +ชฎาพอก +ชฎามหากฐิน +ชฎามังษี +ชฎามังสี +ชฎิล +ชด +ชดช้อย +ชดเชย +ชดใช้ +ชทึง +ชน +ชน- +ชนก +ชนก- +ชนกกรรม +ชนช้าง +ชนนี +ชนบท +ชนม- +ชนม์ +ชนมพรรษา +ชนมาพิธี +ชนมายุพิธี +ชนวน +ชนหมู่น้อย +ชนะ +ชนัก +ชนักติดหลัง +ชนา +ชนาง +ชนิด +ชนินทร์ +ชเนตตี +ชบา +ชบาหนู +ชปโยค +ชม +ชมชัว +ชมชาญ +ชมเชย +ชมไช +ชมดชม้อย +ชมนาด +ชมบ +ชมเปาะ +ชมพู +ชมพู่ +ชมพูทวีป +ชมพูนท +ชมพูนุท +ชมพูพาดบ่า +ชมรม +ชมเลาะ +ชมสวนสวรรค์ +ชม้อย +ชมัน +ชมา +ชม้าย +ชไม +ชย +ชย- +ชยา +ชโย +ชร +ชรทึง +ชรโมล +ชรไม +ชรราง +ชรริน +ชรเรือด +ชรแรง +ชรแร่ง +ชรโลง +ชรอกชรัง +ชรออบ +ชรอัด +ชรอ่ำ +ชรอื้อ +ชรอุ่ม +ชระ +ชระงม +ชระง่อน +ชระงำ +ชระดัด +ชระดื่น +ชระเดียด +ชระเดียดชระดัด +ชระบอบ +ชระบาบ +ชระมด +ชระมัว +ชระมื่น +ชระมุกชระมอม +ชระมุ่น +ชระเมียง +ชระเมียน +ชระลอ +ชระลอง +ชระล่อง +ชระลั่ง +ชระลัด +ชระล้ำ +ชระลุ +ชระแลง +ชระอับ +ชระอาบ +ชระเอม +ชรัด +ชรัว +ชรา +ชรากากี +ชราธรรม +ชราบ +ชราบชรับ +ชราภาพ +ชรายุ +ชริน +ชรุก +ชรูบ +ชล +ชล- +ชลจร +ชลจัณฑ์ +ชลชาติ +ชลธาร +ชลธารก +ชลธิศ +ชลธี +ชลนัยน์ +ชลนา +ชลเนตร +ชลประทาน +ชลมารค +ชลสถาน +ชลัมพุ +ชลาธาร +ชลาพุช +ชลามพุช +ชลาลัย +ชลาศัย +ชลี +ชลูกา +ชเล +ชโลง +ชโลทร +ชโลม +ชว- +ช่วง +ช่วงชัย +ช่วงชิง +ช่วงโชติ +ช่วงใช้ +ช่วงทรัพย์ +ช่วงบาท +ช่วงเมือง +ช่วงสิทธิ์ +ชวด +ชวน +ชวนชม +ชวนหัว +ชวย +ช่วย +ช่วยเหลือ +ชวร +ชวลิต +ชวัก +ชวา +ชวาล +ชวาลา +ช่อ +ชอก +ช็อกโกเลต +ช็อกโกแลต +ชอกช้ำ +ชอง +ช่อง +ช้อง +ช่องกุด +ช่องเขา +ช่องแคบ +ช่องดาล +ช่องตีนกา +ช้องนาง +ช้องนางคลี่ +ช่องไฟ +ช้องแมว +ชองระอา +ชอน +ช่อน +ช้อน +ช้อนนาง +ช้อนหอย +ชอบ +ชอบกล +ชอบใจ +ชอบธรรม +ชอบพอ +ชอบมาพากล +ช่อฟ้า +ชอม +ช่อม่วง +ช่อย +ช้อย +ช้อยชด +ช้อยช่างรำ +ช้อยนางรำ +ชอล์ก +ช่ออินทนิล +ชอ่ำ +ชอื้อ +ชอุ่ม +ชะ +ชะคราม +ชะงอก +ชะง่อน +ชะงัก +ชะงัด +ชะงาบ +ชะง้ำ +ชะงุ้ม +ชะเง้อ +ชะเงื้อม +ชะแง้ +ชะโงก +ชะโงกผา +ชะฉ่า +ชะช่อง +ชะชะ +ชะช้า +ชะชิด +ชะดีชะร้าย +ชะโด +ชะตา +ชะต้า +ชะนี +ชะนีร่ายไม้ +ชะนุง +ชะเนาะ +ชะเนียง +ชะพลู +ชะเพลิง +ชะมด +ชะมดเชียง +ชะมดต้น +ชะมบ +ชะมวง +ชะมัง +ชะมัด +ชะแม่ +ชะรอย +ชะลอ +ชะลอม +ชะล่า +ชะลาน +ชะลิน +ชะลูด +ชะเลง +ชะเลย +ชะแล็ก +ชะแลง +ชะวัง +ชะวาก +ชะวากทะเล +ชะวาด +ชะวุ้ง +ชะเวิกชะวาก +ชะแวง +ชะอม +ชะอ้อน +ชะเอม +ชะโอน +ชัก +ชักกระบี่สี่ท่า +ชักคราม +ชักโครก +ชักเงา +ชักจูง +ชักชวน +ชักช้า +ชักซอสามสาย +ชักซุงตามขวาง +ชักตะพานแหงนเถ่อ +ชักนำ +ชักน้ำเข้าลึก ชักศึกเข้าบ้าน +ชักเนื้อ +ชักใบให้เรือเสีย +ชักแป้งผัดหน้า +ชักพระ +ชักแม่น้ำทั้งห้า +ชักยันต์ +ชักเย่อ +ชักใย +ชักรูป +ชักศพ +ชักสองแถว +ชักสื่อ +ชักหน้า +ชักหน้าไม่ถึงหลัง +ชัค- +ชัง +ชั่ง +ชังคา +ชังฆ- +ชังฆวิหาร +ชั่งใจ +ชั่งหลวง +ชัชวาล +ชัฏ +ชัด +ชัดเจน +ชัดช้า +ชัน +ชั้น +ชันกาด +ชันคอ +ชั้นฉาย +ชั้นชั่ว +ชันชี +ชั้นเชิง +ชันตาฆร +ชันตุ +ชันนะตุ +ชันนุ +ชันนุกะ +ชันพอน +ชันโรง +ชันษา +ชันสน +ชันสูตร +ชันสูตรพลิกศพ +ชัปน +ชัพ +ชัมพูนท +ชัย +ชัย- +ชัยบาน +ชัยพฤกษ์ +ชัยภูมิ +ชัยเภรี +ชัยศรี +ชัลลุกา +ชั่ว +ชั้ว +ชั่วคน +ชั่วคราว +ชัวชม +ชั่วช้า +ชั่วช่างชี ดีช่างสงฆ์ +ชั่วแต่ว่า +ชั่วนาตาปี +ชั่วโมง +ชั่วแล่น +ชา +ช้า +ช้าก่อน +ชาคร +ชาคริต +ชาคริยานุโยค +ช่าง +ช้าง +ช่างกระไร +ช่างเครื่อง +ช้างงวง +ช้างชำนิ +ช้างชูงวง +ช้างต่อ +ช้างตายทั้งตัวเอาใบบัวมาปิด +ช่างทอง +ช้างทำลายโรง +ช้างน้อย +ช้างน้าว +ช้างน้ำ +ช้างประสานงา +ช่างปะไร +ช้างผะชด +ช้างเผือก +ช้างพลาย +ช้างพัง +ช่างฟิต +ช่างไฟ +ช้างร้อง +ช้างสะบัดหญ้า +ช้างเหยียบ +ช่างเหล็ก +ช้างใหญ่ +ช้าช่อน +ชาญ +ชาด +ชาดก +ชาดหรคุณ +ช้าๆ ได้พร้าสองเล่มงาม +ชาต- +ชาตบุษย์ +ชาตรี +ชาตรูป +ชาตสระ +ชาตะ +ชาตา +ชาติ +ชาติ- +ชาติธรรม +ชาตินิยม +ชาติพันธุ์ +ชาติพันธุ์วรรณนา +ชาติพันธุ์วิทยา +ชาติภูมิ +ชาติมาลา +ชาติรส +ชาน +ชานชาลา +ชานวาทิก +ช้านางนอน +ช้านาน +ชานุ +ชานุกะ +ชานุมณฑล +ช้าปี่ +ชาปีไหน +ช้าเป็นการ นานเป็นคุณ +ช้าแป้น +ช้าพลู +ชาม +ชามพูนท +ชามาดร +ชามาดา +ชามาตุ +ชาย +ชายกระเบน +ชายกระเบนเหน็บ +ชายคา +ชายแครง +ชายชาตรี +ชายตา +ชายทะเล +ชายธง +ชายผ้าสีดา +ชายฝั่ง +ชายเฟือย +ชายสามโบสถ์ +ชายไหว +ชายา +ชายาชีพ +ชายานุชีพ +ชาเยนทร์ +ชาเยศ +ชาร +ชารี +ชาล +ชาล- +ชาลกรรม +ชาลา +ชาลินี +ช้าลูกหลวง +ช้าเลือด +ชาว +ชาวนอก +ชาวน้ำ +ชาวม่าน +ชาวเล +ชาววัง +ชาวี +ช้าหมอง +ชำ +ช่ำ +ช้ำ +ชำงัด +ชำงาย +ชำงือ +ช่ำใจ +ช้ำใจ +ช้ำชอก +ช่ำชอง +ช่ำช่า +ชำนน +ชำนรร +ชำนะ +ชำนัญ +ชำนัญพิเศษ +ชำนัน +ชำนาญ +ชำนาญเกลากลอน +ชำนิ +ชำนิชำนาญ +ชำเนียน +ชำเนียร +ช่ำปอด +ชำมะนาด +ชำมะเลียง +ชำร่วย +ชำระ +ช้ำรั่ว +ชำรุด +ชำเรา +ชำเราะ +ชำแรก +ชำแระ +ชำลา +ชำเลือง +ช้ำเลือดช้ำหนอง +ชำแหละ +ชิ +ชิง +ชิ่ง +ชิงคม +ชิงช่วง +ชิงชัง +ชิงชัน +ชิงชัย +ชิงช้า +ชิงช้าชาลี +ชิงช้าสวรรค์ +ชิงชี่ +ชิงเชิง +ชิงดวง +ชิงดีชิงเด่น +ชิงทรัพย์ +ชิงเปรต +ชิงพลบ +ชิงสุกก่อนห่าม +ชิงไหวชิงพริบ +ชิงฮื้อ +ชิชะ +ชิชิ +ชิณณะ +ชิด +ชิเดนทรีย์ +ชิต +ชิต- +ชิตินทรีย์ +ชิน +ชิ่น +ชิ้น +ชินโต +ชินบุตร +ชิ้นเอก +ชิโนรส +ชิม +ชิมแปนซี +ชิมลาง +ชิยา +ชิรณ- +ชิรณะ +ชิรณัคคิ +ชิระ +ชิวหา +ชิวหาสดมภ์ +ชิสา +ชี +ชี่ +ชี้ +ชี้ขาด +ชี้แจง +ชี้ช่อง +ชีต้น +ชี้ตัว +ชี้นกบนปลายไม้ +ชี้นกเป็นนก ชี้ไม้เป็นไม้ +ชี้นำ +ชี้นิ้ว +ชี้แนะ +ชีปะขาว +ชีเปลือย +ชีผะขาว +ชีผ้าขาว +ชีฝรั่ง +ชีพ +ชีพ- +ชีพจร +ชีพิต +ชีพิตักษัย +ชีพุก +ชีฟอง +ชี้ฟ้า +ชีมืด +ชีรณ- +ชีรณัคคิ +ชีระ +ชีล้อม +ชีลา +ชีลาว +ชีว- +ชีวเคมี +ชีวงคต +ชีวประวัติ +ชีวโลก +ชีววิทยา +ชีวะ +ชีวัน +ชีวันตราย +ชีวา +ชีวาตม์ +ชีวาลัย +ชีวิต +ชีวิตชีวา +ชีวิตักษัย +ชีวิตินทรีย์ +ชีวิน +ชีวี +ชี้สองสถาน +ชืด +ชื่น +ชื้น +ชื่นชม +ชื่นชมยินดี +ชื่นบาน +ชื่นมื่น +ชื่อ +ชื้อ +ชื่อตัว +ชื่อย่อ +ชื่อเล่น +ชื่อว่า +ชื่อสกุล +ชื่อเสียง +ชุ +ชุก +ชุกชี +ชุกชุม +ชุ่ง +ชุ้ง +ชุณห- +ชุณหปักษ์ +ชุด +ชุติ +ชุติมา +ชุน +ชุบ +ชุบชีวิต +ชุบชู +ชุบตัว +ชุบมือเปิบ +ชุบย้อม +ชุบเลี้ยง +ชุบสรง +ชุบอาบ +ชุม +ชุ่ม +ชุ่มใจ +ชุมชน +ชุ่มชื่น +ชุ่มชื้น +ชุมทางรถไฟ +ชุมนุม +ชุมนุมชน +ชุมพร +ชุมพา +ชุมเพ็ด +ชุมแพรก +ชุมรุม +ชุมสาย +ชุมสายโทรศัพท์ +ชุมแสง +ชุมเห็ด +ชุ่ย +ชุ่ยๆ +ชุลมุน +ชุลี +ชุษณ- +ชุษณปักษ์ +ชุษณะ +ชู +ชู้ +ชูกลิ่น +ชูคอ +ชูใจ +ชูชีพ +ชูรส +ชูโรง +ชู้สาว +ชูหน้าชูตา +ชู้เหนือขันหมาก +ชู้เหนือผัว +ชู้เหนือผี +เช็ค +เช็คขีดคร่อม +เช็คไปรษณีย์ +เช้ง +เชงเลง +เช้งวับ +เช็ด +เช็ดน้ำ +เช็ดหน้า +เช็ดหม้อ +เชน +เช่น +เชย +เชยชม +เชรา +เชราะ +เชริด +เชลง +เชลย +เชลยศักดิ์ +เชลยศึก +เชลแล็ก +เชลียง +เชวง +เชษฐ- +เชษฐะ +เชษฐา +เชอ +เช่า +เช้า +เช่าช่วง +เช่าซื้อ +เช้าตรู่ +เช่าถือสวน +เช่าทรัพย์ +เช่าพระ +เช้ามืด +เชาว์ +เชาวน์ +เชิง +เชิงกรวย +เชิงกราน +เชิงกล +เชิงกลอน +เชิงชั้น +เชิงชาย +เชิงซ้อน +เชิงเดิน +เชิงเดียว +เชิงเดี่ยว +เชิงตะกอน +เชิงทรง +เชิงเทิน +เชิงมุม +เชิงเวียน +เชิงอรรถ +เชิญ +เชิด +เชิดจีน +เชิดฉิ่ง +เชิดชู +เชิดหนัง +เชิดหน้าชูตา +เชิดหุ่น +เชิ้ต +เชีย +เชี้ย +เชียง +เชี่ยน +เชี่ยนหมาก +เชียบ +เชี่ยม +เชียร +เชียร์ +เชียรณ์ +เชียว +เชี่ยว +เชี่ยวชาญ +เชื่อ +เชื้อ +เชือก +เชือกเขา +เชือกบาศ +เชื่อง +เชื่องช้า +เชื่อใจ +เชื้อชาติ +เชื้อเชิญ +เชือด +เชื่อถือ +เชือน +เชือนแช +เชื้อเพลิง +เชื่อฟัง +เชื้อไฟ +เชื่อม +เชื่อมือ +เชื้อไม่ทิ้งแถว +เชื้อรา +เชื้อโรค +เชื่อวัน +เชื้อสาย +เชื้อหมัก +แช +แช่ +แช่ง +แช่งชักหักกระดูก +แช่งน้ำ +แชงมา +แชบ๊วย +แช่เบ้า +แช่ม +แช่มช้อย +แช่มชื่น +แช่เย็น +แชร์ +แชรง +แชล่ม +แช่อิ่ม +แชะ +โชก +โชกๆ +โชกโชน +โชค +โชงโลง +โชดก +โชดึก +โชต +โชตก +โชติ +โชติ- +โชติก- +โชติช่วง +โชติรส +โชน +โชมโรม +โชย +โชยงการ +โชยชาย +โชยติส +โชรม +โชว์ +โชโหว +ใช่ +ใช้ +ใช้กรรม +ใช้ได้ +ใช้เนื้อ +ใช้บน +ใช้ใบ +ใช้เรือ +ใช้สอย +ไช +ไชนะ +ไชย +ไชย- +ไชยเภท +ไชโย +ซ +ซก +ซ่ก +ซงดำ +ซ่งฮื้อ +ซง้า +ซด +ซน +ซ่น +ซ้น +ซบ +ซบเซา +ซม +ซมซาน +ซรอกซรัง +ซวด +ซวดเซ +ซวดทรง +ซวน +ซวนเซ +ซวย +ซอ +ซอก +ซอกซอน +ซอกซัง +ซอกแซก +ซอง +ซ่อง +ซ่องๆ +ซ้อง +ซ่องแซ่ง +ซองพลู +ซองมือ +ซองแมว +ซ้องแมว +ซ่องสุม +ซ่องเสพ +ซองหาง +ซอแซ +ซ้อแซ้ +ซอน +ซ่อน +ซ้อน +ซ้อนกล +ซ่อนกลิ่น +ซ่อนเงื่อน +ซ้อนซับ +ซ่อนทราย +ซ่อนรูป +ซ่อนหา +ซอม +ซ่อม +ซ้อม +ซ้อมค้าง +ซอมซ่อ +ซ้อมซัก +ซ่อมแซม +ซ่อมแปลง +ซ้อมพยาน +ซ้อมพวน +ซ้อมใหญ่ +ซอย +ซอยผม +ซอส +ซะซร้าว +ซะซ่อง +ซะซอเซีย +ซะซิกซะแซ +ซะซิบ +ซะเซาะ +ซะเซียบ +ซัก +ซักซ้อม +ซักไซ้ +ซักฟอก +ซักส้าว +ซักแห้ง +ซัง +ซั้ง +ซังกะตาย +ซังแซว +ซังตาย +ซัด +ซัดข้าวสาร +ซัดเซ +ซัดทอด +ซัดน้ำ +ซัดยา +ซั้น +ซับ +ซับขนุน +ซับซ้อน +ซับซาบ +ซับซี่ +ซับใน +ซับพระพักตร์ +ซับมัน +ซัม +ซัลฟา +ซั้ว +ซา +ซ่า +ซาก +ซากดึกดำบรรพ์ +ซากศพ +ซาง +ซ่าง +ซาด +ซาน +ซ่าน +ซ่านเซ็น +ซาบซ่าน +ซาบซึ้ง +ซ่าโบะ +ซาแมเรียม +ซ้าย +ซาลาเปา +ซาว +ซาวน้ำ +ซาวเสียง +ซ่าหริ่ม +ซ้ำ +ซ้ำซ้อน +ซ้ำซาก +ซ้ำเติม +ซ้ำร้าย +ซ้ำสาม +ซิ +ซิก +ซิกๆ +ซิกซี้ +ซิกแซ็ก +ซิการ์ +ซิงโคนา +ซิ่น +ซินนามิก +ซินแส +ซิบ +ซิบๆ +ซิบซับ +ซิป +ซิฟิลิส +ซิลิคอน +ซิว +ซี +ซี่ +ซีก +ซี่โครง +ซี้ซอน +ซีเซียม +ซีด +ซีดเซียว +ซีนอน +ซีป่าย +ซีเมนต์ +ซีเรียม +ซีลีเนียม +ซึก +ซึง +ซึ่ง +ซึ้ง +ซึ่งหน้า +ซึม +ซึมกะทือ +ซึมซาบ +ซึมทราบ +ซื่อ +ซื่อๆ +ซื้อ +ซื้อขาย +ซื้อควายหน้านา ซื้อผ้าหน้าตรุษ +ซื้องัวหน้านา ซื้อผ้าหน้าหนาว +ซื่อตรง +ซื้อรำคาญ +ซื้อรู้ +ซื่อสัตย์ +ซื้อหน้า +ซื่อเหมือนแมวนอนหวด +ซุก +ซุกซน +ซุกซ่อน +ซุกซิก +ซุง +ซุน +ซุบ +ซุบซิบ +ซุบซู่ +ซุป +ซุ่ม +ซุ้ม +ซุ้มกระต่าย +ซุ่มคม +ซุ่มซ่าม +ซุมแซว +ซุ่มเสียง +ซุย +ซู่ +ซู่ๆ +ซู่กั้นรั้วไซมาน +ซูโครส +ซู่ซ่า +ซูด +ซู้ด +ซูดซาด +ซูบ +เซ +เซ็ก +เซแคนต์ +เซ็ง +เซ่ง +เซ้ง +เซ็งแซ่ +เซซัง +เซต +เซน +เซ็น +เซ่น +เซนติกรัม +เซนติเกรด +เซนติเมตร +เซนติลิตร +เซ่นเหล้า +เซปักตะกร้อ +เซรา +เซราะ +เซรุ่ม +เซลเซียส +เซลล์ +เซลล์ทุติยภูมิ +เซลล์ปฐมภูมิ +เซลลูลอยด์ +เซลลูโลส +เซ่อ +เซ่อซ่า +เซอร์โคเนียม +เซอะ +เซา +เซ้าซี้ +เซาะ +เซาะลาย +เซิง +เซิ้ง +เซียน +เซียบ +เซียมซี +เซียว +เซี่ยว +เซี่ยวกาง +เซื่อง +แซ +แซ่ +แซ็กคาริน +แซ็กคารินโซเดียม +แซง +แซงแซว +แซ่ซ้อง +แซด +แซดๆ +แซบ +แซม +แซยิด +แซ่ว +แซะ +โซ +โซ่ +โซก +โซ่ง +โซงโขดง +โซซัดโซเซ +โซเซ +โซดา +โซดาแผดเผา +โซดาไฟ +โซเดียม +โซเดียมคาร์บอเนต +โซเดียมซัลเฟต +โซเดียมไซคลาเมต +โซเดียมไฮโดรเจนกลูทาเมต +โซเดียมไฮโดรเจนคาร์บอเนต +โซเดียมไฮโดรเจนซัลเฟต +โซม +โซรม +โซรมประทยด +โซรมโรม +โซรมศัสตราวุธ +โซลา +ไซ +ไซ้ +ไซเกิล +ไซโคลน +ไซน์ +ไซยาไนด์ +ไซร้ +ไซเรน +ไซโล +ฌ +ฌาน +ฌาปน- +ฌาปนกิจ +ฌาปนสถาน +เฌอ +เฌอเอม +ญ +ญญ่าย +ญวน +ญัตติ +ญาณ +ญาณ- +ญาณทัสนะ +ญาณวิทยา +ญาณศาสตร์ +ญาติ +ญาติ- +ญาติกา +ญาติดีกัน +ญาติเภท +ญิบ +ญี่ +ญี่ปุ่น +เญยธรรม +ไญยธรรม +ฎ +ฎีกา +ฏ +ฐ +ฐกัด +ฐากูร +ฐาน +ฐาน- +ฐานกรณ์ +ฐานเขียง +ฐานเชิงบาตร +ฐานเท้าสิงห์ +ฐานบัทม์ +ฐานราก +ฐานสิงห์ +ฐานะ +ฐานันดร +ฐานานุกรม +ฐานานุรูป +ฐานานุศักดิ์ +ฐานียะ +ฐาปน- +ฐาปนา +ฐายี +ฐิต +ฐิติ +ฑ +ฑังส- +ฑาก- +ฑาหก +ฑาหะ +ฒ +เฒ่า +เฒ่าแก่ +เฒ่าหัวงู +ณ +ณรงค์ +เณร +เณรหน้าไฟ +เณรหางนาค +ด +ดก +ดกดื่น +ดง +ด้ง +ดงดาน +ดงดิบ +ดงดึก +ดงวาย +ด้น +ด้นดั้น +ดนโด่ +ดนตรี +ด้นถอยหลัง +ดนย +ดนัย +ดนุ +ดนุช +ดนู +ดบัสวิน +ดบัสวี +ดม +ดมไร +ดร +ดรงค์ +ดรณี +ดรธาน +ดรรชนี +ดรรชนีหักเห +ดราฟต์ +ดรุ +ดรุณ +ดรุณาณัติ +ดรุณี +ดฤถี +ดล +ดล- +ดลใจ +ดลบันดาล +ดลภาค +ดวง +ด้วง +ดวงแก้ว +ดวงใจ +ดวงเดือนประดับดาว +ดวงตา +ดวงสมร +ด้วงโสน +ดวจ +ดวด +ด่วน +ด้วน +ด้วมเดี้ยม +ด้วย +ด้วยว่า +ดอก +ดอกกระบอก +ดอกกะทือ +ดอกก้าน +ดอกข้าวใหม่ +ดอกจอก +ดอกจัน +ดอกจันทน์ +ดอกจิก +ดอกชนต้น +ดอกดั้ว +ดอกด้าย +ดอกดิน +ดอกถวายพระ +ดอกทอง +ดอกน้ำผึ้ง +ดอกบัว +ดอกบุก +ดอกเบี้ย +ดอกเบี้ยทบต้น +ดอกพิกุลร่วง +ดอกฟ้อน +ดอกฟ้า +ดอกมะขาม +ดอกมะตาด +ดอกไม้ +ดอกไม้จันทน์ +ดอกไม้จีน +ดอกไม้จีบ +ดอกไม้เจ้า +ดอกไม้ตาด +ดอกไม้ทะเล +ดอกไม้เทียน +ดอกไม้ไทร +ดอกไม้น้ำ +ดอกไม้พวง +ดอกไม้พุ่ม +ดอกไม้เพลิง +ดอกไม้ไฟ +ดอกไม้ร่วง +ดอกไม้รุ่ง +ดอกไม้ไหว +ดอกรัก +ดอกลำดวน +ดอกลำโพง +ดอกเล็บ +ดอกสร้อย +ดอกหมาก +ดอกหิน +ดอกอาว +ดอกอาวแดง +ดอง +ด่องๆ +ด้อง +ด้องๆ +ดองฉาย +ดองดึง +ดองยา +ดองหาย +ดอด +ดอน +ด่อน +ดอม +ด่อม +ด้อม +ดอย +ด้อย +ดอลลาร์ +ดะ +ดะโต๊ะยุติธรรม +ดะหมัง +ดัก +ดักคอ +ดักดน +ดักดาน +ดักเดี้ย +ดักแด้ +ดักฟัง +ดักษก +ดักษณ +ดักษณี +ดักษัน +ดัง +ดั่ง +ดั้ง +ดังจริง +ดั้งเดิม +ดังนั้น +ดังนี้ +ดังรือ +ดังฤๅ +ดังหนึ่ง +ดัชนี +ดัด +ดัดจริต +ดัดดั้น +ดัดตน +ดัดปลัก +ดัดแปลง +ดัดสันดาน +ดัตช์ +ดัน +ดั้น +ดันทุรัง +ดั้นเมฆ +ดันเหิม +ดับ +ดับขันธ์ +ดับเครื่อง +ดับจิต +ดับชีพ +ดับลม +ดัมพ์ +ดั้วเดี้ย +ดัสกร +ดัสกรี +ดา +ด่า +ดาก +ด่าง +ด้าง +ด่างทับทิม +ด่างพร้อย +ดาด +ดาดๆ +ดาดตะกั่ว +ดาดฟ้า +ดาดาษ +ดาดำ +ด่าทอ +ดาน +ด่าน +ด้าน +ด้านไม้ +ด้านหน้า +ดาบ +ดาบเงิน +ดาบปลายปืน +ดาบลาว +ดาบส +ดาบสองคม +ดาม +ด้าม +ด้ามจิ้ว +ดามพ- +ดามพ์ +ดามพวรรณ +ดามร +ดาย +ด้าย +ด้ายซัง +ด้ายดิบ +ดาร +ดารก +ดารณี +ดารดาษ +ดารา +ดาราบถ +ดาราศาสตร์ +ดาล +ดาลฉัตร +ดาลเดือด +ดาลโทสะ +ดาลัด +ดาลุ +ดาลุช +ดาว +ด่าว +ด้าว +ดาวกระจาย +ดาวเคราะห์ +ดาวดึงส์ +ดาวตก +ดาวเทียม +ดาวบส +ดาวรุ่ง +ดาวเรือง +ดาวฤกษ์ +ดาวล้อมเดือน +ดาวหาง +ดาวเหนือ +ดาษ +ดาษดา +ดาษดื่น +ดาษเดียร +ดาหงัน +ดาฬ +ดำ +ด่ำ +ด้ำ +ดำกล +ดำเกิง +ดำแคง +ดำดง +ดำดิน +ดำแดง +ดำๆ แดงๆ +ดำนา +ดำนาณ +ดำนาน +ดำนู +ดำเนิน +ดำเนินคดี +ดำเนียน +ดำเนียร +ดำบล +ดำปืน +ดำพอง +ดำโพง +ดำรง +ดำรวจ +ดำรัส +ดำริ +ดำรี +ดำรู +ดำไร +ดำฤษณา +ดำเลิง +ดำแลง +ดำหนัก +ดำหนิ +ดำหัว +ดำอวด +ดิก +ดิกๆ +ดิง +ดิ่ง +ดิ่งพสุธา +ดิฉัน +ดิฐ +ดิตถ์ +ดิถี +ดิน +ดิ้น +ดินกรด +ดินขาว +ดินเค็ม +ดินดอนสามเหลี่ยม +ดินดำ +ดินแดง +ดินนวล +ดินประสิว +ดินปืน +ดินเปรี้ยว +ดินพอกหางหมู +ดิ้นรน +ดินร่วน +ดินระเบิด +ดินส้ม +ดินสอ +ดินสอพอง +ดินสำลี +ดินหู +ดินอีหรอบ +ดิบ +ดิบดี +ดิรัจฉาน +ดิลก +ดิ่ว +ดิ้ว +ดิ้วเดี้ยว +ดิษฐ์ +ดิสโพรเซียม +ดี +ดีๆ +ดีเกลือ +ดีเกลือฝรั่ง +ดีงู +ดีใจ +ดีฉัน +ดีฉาน +ดีซ่าน +ดีเซล +ดีด +ดีดขัน +ดีดดิ้น +ดีดฝ้าย +ดีดพิมพ์ +ดีดลูกคิด +ดีดลูกคิดรางแก้ว +-ดีดัก +ดีดีที +ดีเดือด +ดีแตก +ดีนาคราช +ดีเนื้อดีใจ +ดีบัว +ดีบุก +ดีปลี +ดีเปรสชัน +ดีผา +ดีฝ่อ +ดีพร +ดีไม่ดี +ดียา +ดีร้าย +ดีละ +ดีแล้ว +ดีหมี +ดีหลี +ดีหิน +ดีอกดีใจ +ดึก +ดึกดำบรรพ์ +ดึกดื่น +ดึง +ดึ่ง +ดึงดัน +ดึงดื้อ +ดึงดูด +ดึงสะ +ดึ่ม +ดื่น +ดื่นดาษ +ดื่นดึก +ดื่ม +ดื่มด่ำ +ดือ +ดื้อ +ดื้อดัน +ดื้อด้าน +ดื้อดึง +ดื้อแพ่ง +ดื้อยา +ดุ +ดุก +ดุกดิก +ดุกทะเล +ดุกลำพัน +ดุ้ง +ดุ้งดิ้ง +ดุจ +ดุจดัง +ดุจหนึ่ง +ดุด +ดุดัน +ดุเดือด +ดุน +ดุ้น +ดุบๆ +ดุม +ดุ่ม +ดุ่มๆ +ดุ่ย +ดุรค +ดุรงค์ +ดุรงคี +ดุร้าย +ดุริย- +ดุริยะ +ดุริยางค- +ดุริยางค์ +ดุริยางค์จำเรียง +ดุริยางคศาสตร์ +ดุริยางคศิลป์ +ดุล +ดุล- +ดุลการค้า +ดุลการชำระเงิน +ดุลชำระหนี้ +ดุลพินิจ +ดุลภาค +ดุลย- +ดุลยพินิจ +ดุลยภาพ +ดุลอำนาจ +ดุษฎี +ดุษฎีนิพนธ์ +ดุษฎีบัณฑิต +ดุษฎีมาลา +ดุษฎีสังเวย +ดุษณี +ดุษณีภาพ +ดุษิต +ดุสิต +ดุเหว่า +ดู +ดูกไก่ดำ +ดูกค่าง +ดูกร +ดูก่อน +ดูแคลน +ดูใจ +ดูช้างให้ดูหาง ดูนางให้ดูแม่ +ดูซิ +ดูด +ดูดดึง +ดูดดื่ม +ดูดอมดูดาย +ดูดาย +ดูดู๋ +ดูตาม้าตาเรือ +ดูถูก +ดูถูกดูแคลน +ดูเถอะ +ดูเถิด +ดูแน่ะ +ดูเบา +ดูไปก่อน +ดูรา +ดูร้าย +ดูรึ +ดูแล +ดูหมิ่น +ดูหมิ่นถิ่นแคลน +ดูหรือ +ดูหรู +ดูเหมือน +เด +เด่ +เดก +เด็ก +เด็กชา +เด็กชาย +เดกซ์โทรส +เด็กแดง +เด็กเมื่อวานซืน +เด็กหญิง +เด็กอมมือ +เดคากรัม +เดคาเมตร +เดคาลิตร +เด้ง +เด็จ +เดช +เดชน์ +เดชนะ +เดชะ +เดโช +เดโชชัย +เดโชพล +เดซิกรัม +เดซิเมตร +เดซิลิตร +เด็ด +เด็ดขาด +เด็ดดวง +เด็ดดอกไม้ร่วมต้น +เด็ดดอกไม่ไว้ขั้ว +เด็ดเดี่ยว +เด็ดบัวไม่ไว้ใย +เด็ดปลีไม่มีใย +เดน +เด่น +เดนตาย +เดนมาร์ก +เดรัจฉาน +เด๋อ +เด๋อด๋า +เดา +เด่า +เด่าๆ +เด้า +เด้าดิน +เด้าลม +เดาสวด +เดาสุ่ม +เดาะ +เดิน +เดิ่น +เดินขบวน +เดินคาถา +เดินจักร +เดินตลาด +เดินตามหลังผู้ใหญ่หมาไม่กัด +เดินแต้ม +เดินโต๊ะ +เดินทอง +เดินทัพ +เดินทาง +เดินทุ่ง +เดินเทียน +เดินธุระให้ +เดินนา +เดินป้าย +เดินรถ +เดินเรือ +เดินเรื่อง +เดินสวน +เดินสะพัด +เดินสาย +เดินเส้น +เดินหน +เดินเหิน +เดินไหม +เดินอากาศ +เดิม +เดิมที +เดิมพัน +เดี้ย +เดียง +เดียงสา +เดียด +เดียดฉันท์ +เดียร +เดียรดาษ +เดียรถ์ +เดียรถีย์ +เดียรัจฉาน +เดียว +เดี่ยว +เดี๋ยว +เดี๋ยวก่อน +เดียวกัน +เดียวดาย +เดี๋ยวเดียว +เดี๋ยวนี้ +เดียะ +เดื่อ +เดือก +เดื่อง +เดือด +เดือดดาล +เดือดร้อน +เดือน +เดือนขาด +เดือนค้างฟ้า +เดือนคี่ +เดือนคู่ +เดือนเต็ม +เดือนมืด +เดือนเย็น +เดือนร้อน +เดือนหงาย +เดือย +เดือยไก่ +แด +แด่ +แดก +แด็กๆ +แดกงา +แดกดัน +แดกแด้ +แด็กแด้ +แดกห่า +แดง +แดงน้ำ +แดด +แดดาล +แดดิ้น +แดน +แด่น +แดนไตร +แดยัน +แด่วๆ +แดะ +แดะแด๋ +โด +โด่ +โดกเดก +โด่ง +โด่งดัง +โดด +โดดๆ +โดดเดี่ยว +โดดร่ม +โด่เด่ +โดน +โดนดี +โดม +โดมไพร +โดมร +โด่ไม่รู้ล้ม +โดย +โดยจริง +โดยที่ +โดยพยัญชนะ +โดยสาร +โดยเสด็จ +โดยอรรถ +โดร +โดรณ +ใด +...ใด...หนึ่ง +ได +ได้ +ได้กัน +ได้การ +ได้แก่ +ได้แกงเทน้ำพริก +ได้ความ +ได้คิด +ได้ใจ +ได้ช่อง +ได้ชื่อ +ไดแซ็กคาไรด์ +ได้ท่า +ได้ท้าย +ได้ที +ได้ที่ +ได้ทีขี่แพะไล่ +ไดนาโม +ไดนาไมต์ +ไดโนเสาร์ +ได้ยิน +ไดเรกตริกซ์ +ได้ฤกษ์ +ได้สติ +ได้ส่วน +ได้ส่วนสัด +ได้เสีย +ได้เสียกัน +ได้หน้า +ได้หน้าลืมหลัง +ต +ตก +ตกกระ +ตกกระไดพลอยโจน +ตกขอบ +ตกขาว +ตกข้าว +ตกขุย +ตกคลัก +ตกค้าง +ตกเครือ +ตกงาน +ตกจั่น +ตกใจ +ตกดิน +ตกตะกอน +ตกตะลึง +ตกต่ำ +ตกแต่ง +ต๊กโต +ตกใต้เถรเทวทัต +ตกท้องช้าง +ตกทอด +ตกที่นั่ง +ตกนรกทั้งเป็น +ตกน้ำมัน +ตกน้ำไม่ว่าย +ตกน้ำไม่ไหล ตกไฟไม่ไหม้ +ตกใน +ตกเบ็ด +ตกเบิก +ตกประหม่า +ตกปลอก +ตกปลัก +ตกปากตกคำ +ตกเป็น +ตกเป็นเบี้ยล่าง +ตกผลึก +ตกพุ่มม่าย +ตกฟอง +ตกฟาก +ตกมัน +ตกมูก +ตกยาก +ตกรางวัล +ตกลง +ตกล่องปล่องชิ้น +ตกลูก +ตกเลือด +ตกว่า +ตกสนับ +ตกสะเก็ด +ตกแสก +ตกหนัก +ตกหมก +ตกหล่น +ตกหลุม +ตกหลุมพราง +ตกอับ +ตง +ต๋ง +ตงฉิน +ตงิด +ตงุ่น +ตจ- +ตจปัญจกกรรมฐาน +ตจสาร +ตด +ตดหมูตดหมา +ตติย- +ตถาคต +ตน +ต้น +ต้นกล +ต้นขั้ว +ต้นคอ +ต้นคิด +ต้นเงิน +ต้นฉบับ +ต้นชนดอก +ต้นเชือก +ต้นตระกูล +ต้นตอ +ต้นตายใบเป็น +ต้นตำรับ +ต้นทาง +ต้นทุน +ต้นเทียม +ต้นน้ำ +ต้นบท +ต้นแบบ +ต้นเพลิง +ต้นมือ +ต้นไม้ +ต้นร่าง +ต้นร้ายปลายดี +ต้นเรือ +ต้นเรื่อง +ต้นวายปลายดก +ต้นสังกัด +ต้นสายปลายเหตุ +ต้นเสียง +ต้นหน +ต้นเหตุ +ตนัย +ตนุ +ตนุมัธยมา +ตนุมัธยา +ตบ +ตบตา +ตบแต่ง +ตบเท้า +ตบแผละ +ตบมือ +ตบมือข้างเดียวไม่ดัง +ตบยุง +ตบหัวกลางศาลา ขอขมาที่บ้าน +ตบหัวลูบหลัง +ตบะ +ตปนียะ +ตม- +ต้ม +ต้มกะทิ +ต้มกะปิ +ต้มข่า +ต้มเค็ม +ต้มโคล้ง +ต้มปลาร้า +ต้มเปรต +ต้มเปอะ +ต้มยำ +ต้มยำกะทิ +ต้มส้ม +ต้มสุก +ตมูก +ตโม- +ตโมนุท +ตโมไพรี +ตโมหร +ตยาค +ตยาคี +ตยุติ +ตรง +ตรงๆ +ตรงกัน +ตรงกันข้าม +ตรณี +ตรม +ตรมตรอม +ตรมเตรียม +ตรมวล +ตรรก- +ตรรกศาสตร์ +ตรรกะ +ตรลบ +ตรลอด +ตรละ +ตรลา +ตรลาด +ตรเลิด +ตรวจ +ตรวจการณ์ +ตรวจข่าว +ตรวจตรา +ตรวจเลือด +ตรวด +ตรวน +ตรวย +ตรอก +ตรอง +ตรอมใจ +ตรอมตรม +ตระ +ตระกล +ตระกวน +ตระกอง +ตระกัด +ตระการ +ตระกูล +ตระกูลมูลชาติ +ตระคัร +ตระง่อง +ตระจัก +ตระชัก +ตระเชิญ +ตระดก +ตระดาษ +ตระเตรียม +ตระแตร้น +ตระทรวง +ตระนาว +ตระไน +ตระบก +ตระบอก +ตระบอง +ตระบัด +ตระบัดสัตย์ +ตระบัน +ตระเบ็ง +ตระแบ่ +ตระแบก +ตระแบง +ตระแบน +ตระแบ่น +ตระโบม +ตระพอง +ตระพัง +ตระมื่น +ตระโมจ +ตระลาการ +ตระวัน +ตระเว็ด +ตระเวน +ตระเวนไพร +ตระเวนวัน +ตระเวนเวหา +ตระสัก +ตระหง่อง +ตระหง่าน +ตระหนก +ตระหนัก +ตระหน่ำ +ตระหนี่ +ตระหนี่ตัว +ตระอร +ตระอาล +ตระโอม +ตรัง +ตรังค- +ตรังค์ +ตรังคนที +ตรังควชิราวดี +ตรับ +ตรับฟัง +ตรัย +ตรัยตรึงศ์ +ตรัส +ตรัสรู้ +ตรัสสา +ตรา +ตรากตรำ +ตราขุนพล +ตราจอง +ตราชู +ตราแดง +ตราตั้ง +ตราบ +ตราบเท่า +ตราบาป +ตราไปรษณียากร +ตราภูมิ +ตรายาง +ตราสัง +ตราสาร +ตราสิน +ตราหน้า +ตรำ +ตร่ำ +ตริ +ตริตรอง +ตริว +ตรี +ตรีกฏุก +ตรีกันสวาต +ตรีกาล +ตรีกาฬพิษ +ตรีกูฏ +ตรีเกสรมาศ +ตรีโกณ +ตรีโกณมิติ +ตรีคูณ +ตรีจีวร +ตรีฉินทลามกา +ตรีชาต +ตรีญาณรส +ตรีทศ +ตรีทิพ +ตรีทิพยรส +ตรีทุรวสา +ตรีทูต +ตรีเทวตรีคันธา +ตรีโทษ +ตรีธารทิพย์ +ตรีนิศก +ตรีเนตร +ตรีบถ +ตรีบูร +ตรีประดับ +ตรีปวาย +ตรีปิฎก +ตรีปิตผล +ตรีผลธาตุ +ตรีผลสมุตถาน +ตรีผลา +ตรีพิธพรรณ +ตรีพิษจักร +ตรีเพชรทัณฑี +ตรีเพชรพวง +ตรีเพชรสมคุณ +ตรีภพ +ตรีภพนาถ +ตรีภูมิ +ตรีภูว +ตรีมธุร +ตรีมูรติ +ตรียมก +ตรียัมปวาย +ตรีรัตน์ +ตรีโลก +ตรีโลกนาถ +ตรีโลเกศ +ตรีโลจน์ +ตรีโลหก +ตรีโลหะ +ตรีวาตผล +ตรีศก +ตรีศูล +ตรีสมอ +ตรีสมุตถาน +ตรีสัตกุลา +ตรีสันนิบาตผล +ตรีสาร +ตรีสินธุรส +ตรีสุคนธ์ +ตรีสุรผล +ตรีเสมหผล +ตรีอมฤต +ตรีอากาศผล +ตรีเอกภาพ +ตรีเอกานุภาพ +ตรึก +ตรึกตรอง +ตรึกถอง +ตรึง +ตรึงตรา +ตรึงศ- +ตรุ +ตรุณ +ตรุย +ตรุษ +ตรุษจีน +ตรู +ตรู่ +ตฤณ +ตฤณ- +ตฤณชาติ +ตฤณมัย +ตฤตีย- +ตฤตียะ +ตฤท +ตฤป +ตฤษณา +ตฤๅ +ตล +ตลก +ตลกคะนอง +ตลกบาตร +ตลกโปกฮา +ตลกหัวเราะ +ตลบ +ตลบตะแลง +ตลบนก +ตลบหลัง +ตลอด +ตลอดรอดฝั่ง +ตละ +ตลับ +ตลับนาก +ตลาด +ตลาดเงิน +ตลาดท้องน้ำ +ตลาดนัด +ตลาดน้ำ +ตลาดมืด +ตลาดยี่สาน +ตลาดสด +ตลาดหน้าคุก +ตลาดหลักทรัพย์ +ตลาดหุ้น +ตลิ่ง +ตลึง +ตวง +ตวงพระธาตุ +ต่วน +ต้วมเตี้ยม +ตวัก +ตวัด +ตวาด +ตอ +ต่อ +ต้อ +ตอก +ต๊อก +ต๊อกๆ +ต๊อกต๋อย +ต่อกร +ต้อกระจก +ตอกหน้า +ต่อกิ่ง +ต่อความยาวสาวความยืด +ตอง +ต้อง +ตองกราย +ต้องกัน +ต้องการ +ต้องคดี +ต้องใจ +ตองตอย +ต้องตา +ต้องเต +ตองแตก +ต่องแต่ง +ต้องโทษ +ต้องธรณีสาร +ตองเปรียง +ต้องสู้ +ต้องหา +ตองเหลือง +ตอด +ตอดต่อ +ต่อตา +ต่อต้าน +ต่อตาม +ต่อตี +ต่อแต้ม +ตอน +ต้อน +ต้อนรับ +ต้อนรับขับสู้ +ต้อนหมูเข้าเล้า +ต่อนัดต่อแนง +ต้อเนื้อ +ตอบ +ตอบโต้ +ตอบแทน +ตอเบา +ต่อปาก +ต่อปากต่อคำ +ต่อปากหลากคำ +ตอม +ต่อม +ต๋อม +ต่อมน้ำ +ต่อมโลหิต +ตอม่อ +ต่อย +ต้อย +ต้อยๆ +ต้อยตริ่ง +ต้อยติ่ง +ต้อยตีวิด +ต่อยหอย +ตอแย +ต่อแย้ง +ตอร์ปิโด +ต่อล้อต่อเถียง +ต้อลำไย +ต้อลิ้นหมา +ต่อว่า +ต่อสู้ +ต่อไส้ +ต่อหน้า +ต่อหน้ามะพลับ ลับหลังตะโก +ต้อหิน +ตอแหล +ต่ออายุ +ตะ +ตะกรน +ตะกรวย +ตะกร้อ +ตะกร่อม +ตะกรัน +ตะกรับ +ตะกร้า +ตะกราม +ตะกรุด +ตะกรุม +ตะกรุมตะกราม +ตะกละ +ตะกลาม +ตะกวด +ตะกอ +ตะกอน +ตะกัง +ตะกั่ว +ตะกั่วเกรียบ +ตะกั่วแดง +ตะกั่วตัด +ตะกาง +ตะกาด +ตะกาย +ตะกาว +ตะกุกตะกัก +ตะกุย +ตะกุยตะกาย +ตะกู +ตะกูด +ตะเกียกตะกาย +ตะเกียง +ตะเกียงแก๊ส +ตะเกียงรั้ว +ตะเกียงลาน +ตะเกียบ +ตะแก +ตะแก่ +ตะแกรง +ตะโก +ตะโก้ +ตะโกก +ตะโกขาว +ตะโกดำ +ตะโกน +ตะโกรง +ตะโกรม +ตะโกส้ม +ตะไกร +ตะขบ +ตะขบฝรั่ง +ตะขอ +ตะขาบ +ตะขิดตะขวง +ตะเข้ +ตะเข้ขบฟัน +ตะเข็บ +ตะเข็บไต่ขอน +ตะเขิง +ตะโขง +ตะคร้อ +ตะครอง +ตะครั่นตะครอ +ตะคร้ำ +ตะคริว +ตะครุบ +ตะครุบกบ +ตะคลับตะคล้าย +ตะคอก +ตะคัน +ตะค้า +ตะคาก +ตะคาง +ตะค้าทอง +ตะค้าน +ตะคิว +ตะคุ่ม +ตะคุ่มๆ +ตะเครียว +ตะเคียน +ตะเคียนทอง +ตะเคียนเผือก +ตะเคียว +ตะแคง +ตะไคร่ +ตะไคร้ +ตะไคร้แดง +ตะไคร้น้ำ +ตะไคร้บก +ตะไคร้หอม +ตะไคร้หางนาค +ตะเฆ่ +ตะแง้ +ตะติน +ตะแตร้น +ตะนอย +ตะนาว +ตะบม +ตะบอง +ตะบองกัน +ตะบองแดง +ตะบองเพชร +ตะบอย +ตะบัน +ตะบันไฟ +ตะบิ้ง +ตะบิด +ตะบิดตะบอย +ตะบี้ตะบัน +ตะบึง +ตะบุ้ย +ตะบุ้ยๆ +ตะบูน +ตะเบ็ง +ตะเบ็งมาน +ตะแบก +ตะแบง +ตะแบงมาน +ตะโบม +ตะไบ +ตะปบ +ตะปลิง +ตะปัดตะป่อง +ตะปิ้ง +ตะปุ่มตะป่ำ +ตะปู +ตะปูเข็ม +ตะปูควง +ตะปูหัวเห็ด +ตะพง +ตะพด +ตะพอง +ตะพัก +ตะพัง +ตะพัด +ตะพั้น +ตะพาก +ตะพาน +ตะพานช้าง +ตะพานหนู +ตะพาบ +ตะพาบน้ำ +ตะพาย +ตะพายแล่ง +ตะพึด +ตะพึดตะพือ +ตะพุ่น +ตะพุ่นหญ้าช้าง +ตะเพรา +ตะเพิง +ตะเพิด +ตะเพิ่น +ตะเพียน +ตะเพียนทอง +ตะเพียนน้ำเค็ม +ตะโพก +ตะโพง +ตะโพน +ตะเภา +ตะเภาเดียวกัน +ตะใภ้ +ตะม่อ +ตะมอย +ตะยองสะลา +ตะรัง +ตะรังกะนู +ตะรังตังกวาง +ตะรังตังช้าง +ตะราง +ตะลอง +ตะลอน +ตะล่อม +ตะล่อมข้าว +ตะล่อมป้อม +ตะละ +ตะลาน +ตะลิงปลิง +ตะลิบ +ตะลีตะลาน +ตะลึง +ตะลึงพรึงเพริด +ตะลุง +ตะลุ่ม +ตะลุ่มนก +ตะลุมบอน +ตะลุ่มโปง +ตะลุมพอ +ตะลุมพุก +ตะลุ่มอิด +ตะลุย +ตะเลง +ตะแลงแกง +ตะไล +ตะวัน +ตะวันขึ้น +ตะวันตก +ตะวันยอแสง +ตะวันออก +ตะวันออกกลาง +ตะวันออกใกล้ +ตะวันออกไกล +ตะวันอ้อมข้าว +ตะวาง +ตะเวน +ตะหนึ่งรัด +ตะหลิว +ตะหลุก +ตะหลุง +ตะเหลนเป๋น +ตะเหลาะเปาะ +ตะแหง่วๆ +ตะแหมะแขะ +ตะแหลนแป๋น +ตะโหงก +ตัก +ตักกะ +ตักตวง +ตักเตือน +ตั๊กแตน +ตักน้ำรดหัวตอ +ตักน้ำรดหัวสาก +ตักน้ำใส่กะโหลก ชะโงกดูเงา +ตักบาตร +ตักบาตรอย่าถามพระ +ตักษณ +ตักษณี +ตักษัย +ตัง +ตั่ง +ตั้ง +ตั้งกรม +ตังเก +ตั้งเข็ม +ตั้งไข่ +ตั้งเค้า +ตั้งแง่ +ตั้งใจ +ตังฉ่าย +ตั้งต้น +ตั้งตัว +ตั้งตาคอย +ตังติด +ตั้งแต่ +ตั้งแต่ง +ตั้งโต๊ะ +ตั้งท่า +ตั้งธาตุ +ตั้งนาฬิกา +ตั้งนาฬิกาปลุก +ตั้งเป้าหมาย +ตังเม +ตังวาย +ตั้งหน้า +ตั้งหน้าตั้งตา +ตั้งหัวเรือ +ตั้งอกตั้งใจ +ตังโอ๋ +ตัจฉก +ตัจฉนี +ตัณฑุล +ตัณหักษัย +ตัณหา +ตัด +ตัดกัน +ตัดขาด +ตัดใจ +ตัดช่องน้อยแต่พอตัว +ตัดช่องย่องเบา +ตัดเชือก +ตัดญาติขาดมิตร +ตัดต้นไฟ +ตัดตอน +ตัดถนน +ตัดทาง +ตัดบท +ตัดประเด็น +ตัดเป็นตัดตาย +ตัดพ้อ +ตัดไพ่ +ตัดไฟต้นลม +ตัดไฟหัวลม +ตัดไม้ข่มนาม +ตัดรอน +ตัดราคา +ตัดสิน +ตัดสินใจ +ตัดเส้น +ตัดหนทาง +ตัดหน้า +ตัดหน้าฉาน +ตัดหนามอย่าไว้หน่อ +ตัดหางปล่อยวัด +ตัตว- +ตัตวศาสตร์ +ตัถย์ +ตัน +ตันคอหอย +ตันตระ +ตันติ +ตันติภาษา +ตันปัญญา +ตันหยง +ตันเหิม +ตันอกตันใจ +ตับ +ตับแข็ง +ตับเต่า +ตับเต่าขาว +ตับปิ้ง +ตับเป็ด +ตับเพลง +ตับเรื่อง +ตับเหล็ก +ตับอ่อน +ตัว +ตั๋ว +ตัวกลั่น +ตัวกลาง +ตัวการ +ตัวเก็ง +ตัวคูณร่วมน้อย +ตัวโค +ตัวใครตัวมัน +ตัวเงิน +ตั๋วเงิน +ตั๋วเงินคลัง +ตั๋วเงินจ่าย +ตั๋วเงินรับ +ตัวจักรใหญ่ +ตัวจำนำ +ตัวจี๊ด +ตัวเชิด +ตัวดี +ตัวต่อตัว +ตัวตั้ง +ตัวตั้งตัวตี +ตัวตายตัวแทน +ตัวตืด +ตัวเต็ง +ตัวแทน +ตัวแทนค้าต่าง +ตัวแทนช่วง +ตัวแทนเชิด +ตัวนาง +ตัวนำ +ตัวประกอบ +ตัวประกัน +ตัวเป็นเกลียว +ตัวเปล่า +ตัวแปร +ตัวผู้ +ตั้วโผ +ตัวพระ +ตัวพิมพ์ +ตัวเมีย +ตัวเมือง +ตัวไม้ +ตัวยืน +ตัวเลข +ตั๋วแลกเงิน +ตัวสะกด +ตั๋วสัญญาใช้เงิน +ตั้วสิว +ตัวหนังสือ +ตัวหารร่วมมาก +ตั้วเหี่ย +ตัวอย่าง +ตัวเอก +ตา +ตาก +ตากตน +ตากบ +ตากบตาเขียด +ตากล้อง +ตากลับ +ตากล้า +ตากวาง +ตากสมอง +ตากหน้า +ตากอากาศ +ตากุ้ง +ตาโก้ง +ตาไก่ +ตาขวาง +ตาขอ +ตาข่าย +ตาขาว +ตาขุ่นตาเขียว +ตาเข +ตาแข็ง +ตาคม +ตาค้าง +ตาง +ต่าง +ต่างๆ +ต่างด้าว +ต่างว่า +ต่างหาก +ตางัว +ตาจระเข้ +ตาชั่ง +ตาช้าง +ตาด +ตาเดียว +ตาแดง +ตาตกกล้า +ตาตั๊กแตน +ตาตั้ง +ตาตาราง +ตาตี่ +ตาตุ่ม +ตาเต็ง +ตาโต +ตาถั่ว +ตาทวด +ตาทัพ +ตาน +ต่าน +ต้าน +ตานกแก้ว +ตานขโมย +ต้านทาน +ตานนกกด +ตานเสี้ยน +ตานหก +ตานหม่อน +ตานเหลือง +ตาน้ำ +ตานี +ตาบ +ตาบทับ +ตาบทิศ +ตาบอด +ตาบอดคลำช้าง +ตาบอดได้แว่น +ตาบอดตาใส +ตาบอดสอดตาเห็น +ตาบอดสี +ตาปลา +ตาปลาดุก +ตาปี +ตาปีตาชาติ +ตาปู +ตาเป็นมัน +ตาเป็นสับปะรด +ตาโป่ง +ตาฝั่ง +ตาฝาด +ตาพร่า +ตาพอง +ตาฟาง +ตาฟางไก่ +ตาเฟื้องตาสลึง +ตาม +ตามกวาง +ตามควาย +ตามใจ +ตามใจปากมากหนี้ +ตามใจปากลำบากท้อง +ตามด +ตามที +ตามเนื้อผ้า +ตามบุญตามกรรม +ตามพ- +ตามพหัตถี +ตามพะ +ตามเพลง +ตามมี +ตามมีตามเกิด +ตามยถากรรม +ตามเรื่องตามราว +ตามลมตามแล้ง +ตามลำพัง +ตามอำเภอใจ +ตามะแน +ตามิน +ตามีตามา +ตาแมว +ตาย +ต้าย +ตายขาน +ตายขุย +ตายคาที่ +ตายโคม +ตายใจ +ตายซาก +ตายด้าน +ตายดาบหน้า +ตายตัว +ตายทั้งกลม +ตายน้อย +ตายนึ่ง +ตายประชดป่าช้า +ตายเป็นเบือ +ตายฝอย +ตายฝังยังเลี้ยง +ตายพราย +ตายราบ +ตายลาภ +ตายห่า +ตายโหง +ตายอดตายอยาก +ตาราง +ตารางสอน +ตารางเหลี่ยม +ตาราไต +ตาร้าย +ตาริ้ว +ตาเรือ +ตาเรือชัย +ตาล +ตาลปัตร +ตาลปัตรบังเพลิง +ตาลปัตรฤๅษี +ตาลม +ตาลยอดด้วน +ตาลอ +ตาลอย +ตาลาน +ตาลาย +ตาลีตาเหลือก +ตาลุ +ตาลุก +ตาลุกตาชัน +ตาลุชะ +ตาเล็กตาน้อย +ตาว +ต๋าว +ตาโศก +ตาส่อน +ตาสำเภา +ตาสีตาสา +ตาเสือ +ตาหนู +ตาหมากรุก +ตาหยี +ตาหลิ่ง +ตาหวาน +ตาเหล่ +ตาเหลว +ตาเหลือก +ตาเหลือกตาพอง +ตาแหวน +ตาฬ +ตาอ้อย +ตาเอก +ตำ +ต่ำ +ตำข้าวสารกรอกหม้อ +ต่ำใจ +ต่ำช้า +ต่ำตน +ต่ำต้อย +ตำตา +ตำนาน +ตำน้ำพริกละลายแม่น้ำ +ตำเนิน +ตำเนียน +ตำบล +ตำแบ +ต้ำปุก +ต้ำผาง +ต้ำพรวด +ตำแย +ตำแยแมว +ตำรวจ +ตำรวจนครบาล +ตำรวจภูธร +ตำรวจวัง +ตำรวจหลวง +ตำรับ +ตำรา +ตำรุ +ตำลึง +ตำส้ม +ตำเสา +ตำหนัก +ตำหนักน้ำ +ตำหนักแพ +ตำหนิ +ตำหระ +ตำแหน่ง +ตำแหน่งที่ตั้ง +ติ +ติก- +ติกะ +ติกาหรัง +ติง +ติ่ง +ติ๋ง +ติ๋งๆ +ติ่งตั่ง +ติงทุเลา +ติงส- +ติงสติ +ติงสติม- +ติ่งหาย +ติณ +ติณ- +ติณชาติ +ติด +ติดๆ +ติดกระดุม +ติดกัณฑ์เทศน์ +ติดเก้ง +ติดขัด +ติดเครื่อง +ติดจะ +ติดจักรยาน +ติดใจ +ติดตลก +ติดตลาด +ติดต่อ +ติดต้อยห้อยตาม +ติดตะกร้อ +ติดตัว +ติดตา +ติดตาม +ติดตื้น +ติดบวก +ติดบ่อน +ติดปาก +ติดพัน +ติดไฟ +ติดมือ +ติดไม้ติดมือ +ติดร่างแห +ติดลบ +ติดลม +ติดศัพท์ +ติดสอยห้อยตาม +ติดสัด +ติดสำนวน +ติดสินบน +ติดหน้าตามหลัง +ติดหมัด +ติดหลังแห +ติดแห้ง +ติดอันดับ +ติดอ่าง +ติตติก +ติตติร +ติตถ +ติเตียน +ติถี +ติปา +ติปาถะ +ติมิ +ติมิงคละ +ติร +ติรัจฉาน +ติเรือทั้งโกลน +ติล +ติลก +ติ้ว +ติ้วใบเลื่อม +ตี +ตี่ +ตีกรรเชียง +ตีกาก +ตีกิน +ตีเกล็ด +ตีเกลียว +ตีไก่ +ตีขนาบ +ตีขลุม +ตีความ +ตีคอ +ตีคู่ +ตีงูให้กากิน +ตีงูให้หลังหัก +ตีจาก +ตีชิง +ตีตนก่อนไข้ +ตีตนตายก่อนไข้ +ตีตรวน +ตีตั๋ว +ตีต่าง +ตีตื้น +ตีแตะ +ตีโต้ +ตีทอง +ตีทะเบียน +ตีท้ายครัว +ตีท้ายน้ำ +ตีน +ตีนกา +ตีนครุ +ตีนคู้ +ตีนจก +ตีนจ้ำ +ตีนตะขาบ +ตีนตุ๊กแก +ตีนเต่า +ตีนถีบปากกัด +ตีนเท่าฝาหอย +ตีนเทียน +ตีนนก +ตีนเป็ด +ตีนผี +ตีนแรด +ตีนโรงตีนศาล +ตีนเหยียด +ตีบ +ตีบรรทัด +ตีบังกั้น +ตี่ใบ้ +ตีปลาหน้าไซ +ตีป่า +ตี่ป้าบ +ตีป่าให้เสือกลัว +ตีปีก +ตีแปลง +ตีผี +ตีผึ้ง +ตีแผ่ +ตีฝีปาก +ตีโพยตีพาย +ตีมอง +ตีรถะ +ตีระ +ตีรั้ง +ตีลังกา +ตีวง +ตีวัวกระทบคราด +ตีสนิท +ตีสองหน้า +ตีสำนวน +ตีเส้น +ตีเสมอ +ตีเสียง +ตีเสียว่า +ตีหน้า +ตีหน้าตาย +ตีหน้ายักษ์ +ตีหลายหน้า +ตีห่าง +ตีอวน +ตีอีตื้อ +ตึ +ตึๆ +ตึก +ตึกๆ +ตึ้กๆ +ตึ้กตั้ก +ตึกแถว +ตึกระฟ้า +ตึง +ตึงๆ +ตึงเครียด +ตึงตัง +ตึงตัว +ตึงเปรี๊ยะ +ตึดตื๋อ +ตึ๊ดตื๋อ +ตึตัง +ตืด +ตื่น +ตื้น +ตื่นข่าว +ตื้นตัน +ตื้นตันใจ +ตื่นตัว +ตื่นตาตื่นใจ +ตื่นตาย +ตื่นตูม +ตื่นเต้น +ตื่นแต่ดึก สึกแต่หนุ่ม +ตื่นฟ้า +ตื้อ +ตื๊อ +ตื๋อ +ตุ +ตุๆ +ตุ๊ +ตุ๊กแก +ตุ๊กแกใบกลม +ตุ๊กตา +ตุ๊กตาล้มลุก +ตุ๊กตาเสียกบาล +ตุ๊กต่ำ +ตุ๊กต่ำน้ำทอง +ตุกติก +ตุ๊กติ๊ก +ตุ๊กตุ่น +ตุ๊กตุ๋ย +ตุง +ตุ้งก่า +ตุ้งติ้ง +ตุ๊ดตู่ +ตุ๊ต๊ะ +ตุตัง +ตุน +ตุ่น +ตุ่นๆ +ตุ๋น +ตุ่นต่าน +ตุนาหงัน +ตุบๆ +ตุ้บ +ตุ้บๆ +ตุ้บตั้บ +ตุ๊บป่อง +ตุปัดตุป่อง +ตุปัดตุเป๋ +ตุ่ม +ตุ้ม +ตุ๋ม +ตุ้มกว้าว +ตุมกา +ตุ้มแซะ +ตุมตัง +ตุ้มเต๋น +ตุ้มปี่ +ตุมพ +ตุมพรวด +ตุ้มมะพร้าว +ตุ้มหู +ตุ่ย +ตุ่ยๆ +ตุ้ย +ตุ้ยๆ +ตุ๊ย +ตุ๋ยตุ่ย +ตุรค +ตุรงค- +ตุรงค์ +ตุรงคราวี +ตุริยางค์ +ตุล +ตุลสิ +ตุลา +ตุลาการ +ตุลาคม +ตุหรัดตุเหร่ +ตู +ตู่ +ตู้ +ตูก +ตูข้า +ตูด +ตูดงอน +ตู่ตัว +ตู้นิรภัย +ตูบ +ตู้พระมาลัย +ตู่พุทธพจน์ +ตูม +ตูมๆ +ตูมตาม +ตูลิ่นฮื้อ +ตูหนา +เต +เตก +เต๊ก +เต็ง +เต่ง +เตช +เตโช +เตโชธาตุ +เต้น +เต้นกินรำกิน +เต้นเขน +เต็นท์ +เต้นรำ +เต้นแร้งเต้นกา +เต้นแร้งเต้นแฉ่ง +เต็ม +เต็มแกน +เต็มคราบ +เต็มใจ +เต็มตัว +เต็มตา +เต็มตื้น +เต็มเต็ง +เต็มที +เต็มที่ +เต็มบาท +เต็มประดา +เต็มประตู +เต็มปาก +เต็มเปา +เต็มมือ +เต็มเม็ดเต็มหน่วย +เต็มไม้เต็มมือ +เต็มยศ +เต็มรัก +เต็มหู +เต็มเหนี่ยว +เต็มเหยียด +เต็มอก +เต็มอกเต็มใจ +เต็มอัตรา +เตย +เตยเลื้อย +เตร่ +เตร็ด +เตร็ดเตร่ +เตร็ดเตรน +เตรน +เตริง +เตรียด +เตรียบ +เตรียม +เตรียมตรม +เตรียมตัว +เตรียมพร้อม +เตละ +เตลิด +เตว็ด +เต่อ +เตอะ +เตะ +เตะจมูก +เตะฉาก +เตะโด่ง +เตะตา +เตะฝุ่น +เตา +เต่า +เต้า +เต๋า +เต่ากระสุน +เต่ากินผักบุ้ง +เต่าเกียด +เตาแก๊ส +เต๋าเขย่า +เต้าแคน +เต้าเจี้ยว +เต่าดำ +เต่าทอง +เต่าทอเสื่อ +เต้าทึง +เตาทุเรียง +เต่านา +เต่าบ้า +เต้าปืน +เตาผิง +เตาฟู่ +เตาไฟ +เต่ารั้ง +เต้ารับ +เต่าร้าง +เตารีด +เต่าเลือน +เต้าส่วน +เตาสูบ +เต้าเสียบ +เต่าหก +เต่าหวาย +เต่าหับ +เต้าหู้ +เต้าหู้ยี้ +เต่าเหลี่ยม +เต่าเหลือง +เต้าฮวย +เต๊าะ +เตาะแตะ +เติ่ง +เตินเต่อ +เติบ +เติบโต +เติม +เตี้ย +เตียง +เตียงลา +เตี้ยตน +เตียน +เตียบ +เตี๋ยม +เตียรถ์ +เตียว +เตี่ยว +เตี้ยอุ้มค่อม +เตื้อ +เตือน +เตือนใจ +เตือนตา +เตือนสติ +แต่ +แต่ๆ +แต้ +แตก +แตกคอ +แตกเงิน +แตกฉาน +แตกฉานซ่านเซ็น +แตกดับ +แตกตื่น +แตกแตน +แตกทัพ +แตกเนื้อสาว +แตกเนื้อหนุ่ม +แตกฝูง +แตกพาน +แตกมัน +แตกแยก +แตกระแหง +แตกร้าว +แตกหัก +แต่ก่อนแต่กี้ +แต่กี้แต่ก่อน +แตง +แต่ง +แต่งกว้าน +แต่งการ +แต่งงาน +แต่งตั้ง +แต่งตัว +แตงเถาตาย +แตงเม +แตงร่มใบ +แต่งหน้า +แต่งหน้าขนม +แต้จิ๋ว +แตด +แต๊ดแต๋ +แต่ทว่า +แตน +แต้ม +แต้มคู +แต้มต่อ +แตร +แตรงอน +แตรเดี่ยว +แตรฝรั่ง +แตรฟันฟาร์ +แตรรถยนต์ +แตรลำโพง +แตรวง +แตรวงโยธวาทิต +แตระ +แต่ละ +แต้ว +แต้วแร้ว +แต้วแล้ว +แต่ว่า +แต้แว้ด +แตะ +แตะต้อง +โต +โต้ +โตก +โต้คารม +โต่ง +โต้ง +โต้งๆ +โตงเตง +โตงๆ เตงๆ +โตฎก +โต๊ด +โต้ตอบ +โต้เถียง +โตน +โตนด +โต้โผ +โตมร +โตมร- +โตมรธร +โตย +โต้แย้ง +โตรก +โตรกไตร +โตรด +โต้รุ่ง +โตเล่นหาง +โต้วาที +โต้หลง +โต๊ะ +โต๊ะกลม +โต๊ะโขก +โต๊ะเท้าช้าง +โต๊ะหมู่ +โต๊ะหมู่บูชา +โต๊ะอิหม่าม +ใต้ +ใต้ดิน +ใต้ถุน +ใต้เท้า +ใต้เท้ากรุณา +ใต้เท้ากรุณาเจ้า +ใต้ฝ่าพระบาท +ใต้ฝ่าละอองธุลีพระบาท +ใต้ฝ่าละอองพระบาท +ไต +ไต่ +ไต้ +ไต๋ +ไต้ก๋ง +ไต่คู้ +ไต่เต้า +ไต่ถาม +ไตปลา +ไต้ฝุ่น +ไต้ไฟ +ไต่ไม้ +ไต่ไม้ลำเดียว +ไตร +ไตรกิศยา +ไตรจักร +ไตรจีวร +ไตรดายุค +ไตร่ตรอง +ไตรตรา +ไตรตรึงษ์ +ไตรทวาร +ไตรทศ +ไตรทิพ +ไตรทิพย์ +ไตรปิฎก +ไตรเพท +ไตรภพ +ไตรภาคี +ไตรภูมิ +ไตรย +ไตรยางศ์ +ไตรรงค์ +ไตรรัตน์ +ไตรลักษณ์ +ไตรโลก +ไตรโลกย์ +ไตรวัฏ +ไตรวิชชา +ไตรสรณคมน์ +ไตรสรณาคมน์ +ไตรสิกขา +ไต่ลวด +ไต่สวน +ไต้หวัน +ถ +ถก +ถกเขมร +ถกเถียง +ถกล +ถงัน +ถงาด +ถด +ถดถอย +ถน +ถนน +ถนนลาดยาง +ถนป +ถนอม +ถนอมอาหาร +ถนัด +ถนัดขวา +ถนัดใจ +ถนัดซ้าย +ถนัดถนี่ +ถนัดปาก +ถนัดมือ +ถนัน +ถนำ +ถนำทึก +ถนิม +ถนิมกาม +ถนิมสร้อย +ถบ +ถบดี +ถม +ถ่ม +ถมเงิน +ถมตะทอง +ถมถืด +ถมเถ +ถมทอง +ถ่มน้ำลายรดฟ้า +ถมปรักมาศ +ถมปัด +ถมไป +ถ่มร้าย +ถมอ +ถมึงทึง +ถล +ถลก +ถลกบาตร +ถลน +ถลม +ถล่ม +ถลอก +ถลัน +ถลา +ถลาก +ถลากถลำ +ถลากไถล +ถลาย +ถลำ +ถลำใจ +ถลำตัว +ถลำถลาก +ถลีถลำ +ถลึงตา +ถลุง +ถลุน +ถ่วง +ถ่วงดุล +ถ่วงล้อ +ถ้วน +ถ้วนถี่ +ถ้วย +ถ้วยตวง +ถ้วยโถง +ถ้วยรางวัล +ถวัด +ถวัดถวัน +ถวัล +ถวัลย์ +ถวาย +ถวายกร +ถวายตัว +ถวายเนตร +ถวายพระพร +ถวายหัว +ถวิน +ถวิล +ถ่อ +ถ้อ +ถอก +ถอง +ถ่อง +ถ้อง +ถ่องแถว +ถ่องแท้ +ถอด +ถอดเขี้ยวถอดเล็บ +ถอดความ +ถอดถอน +ถอดไพ่ +ถอดรหัส +ถอดรูป +ถอดสี +ถอดหัวโขน +ถ้อถอย +ถ้อถ้อย +ถอน +ถอนเงิน +ถอนใจใหญ่ +ถอนต้นก่นราก +ถอนทุน +ถอนพิษ +ถอนยวง +ถอนรากถอนโคน +ถอนสมอ +ถอนสายบัว +ถอนหงอก +ถอบ +ถอบแถบ +ถ่อม +ถ่อมตัว +ถอย +ถ่อย +ถ้อย +ถอยกรูด +ถ้อยความ +ถ้อยคำ +ถอยใจใหญ่ +ถอยฉะ +ถอยฉาก +ถอยถด +ถ้อยแถลง +ถอยทด +ถอยทัพ +ถ้อยทีถ้อยปฏิบัติต่อกัน +ถ้อยทีถ้อยอาศัยกัน +ถอยหลัง +ถอยหลังเข้าคลอง +ถะ +ถะกัด +ถะเกิน +ถะโกน +ถะถั่น +ถะถับ +ถะถุนถะถัน +ถะมัดถะแมง +ถัก +ถัง +ถั่ง +ถั่งถ้อย +ถัณฑิล +ถัณฑิล- +ถัณฑิลสายี +ถัด +ถัทธ +ถัน +ถั่น +ถั่นๆ +ถับ +ถับๆ +ถัมภ์ +ถัว +ถั่ว +ถั่วขาว +ถั่วคร้า +ถั่วค้าง +ถั่วงอก +ถั่วดำ +ถั่วนา +ถั่วแปบ +ถั่วแปบช้าง +ถั่วฝักยาว +ถั่วพร้า +ถั่วพู +ถั่วเพาะ +ถั่วแม่ตาย +ถั่วแระ +ถั่วเหลือง +ถา +ถ้า +ถาก +ถากถาง +ถาง +ถ่าง +ถ่างตา +ถาด +ถาโถม +ถาน +ถ่าน +ถ่านโค้ก +ถ่านไฟเก่า +ถ่านไฟฉาย +ถ่านไฟแช็ก +ถ่านหิน +ถาบ +ถาม +ถามค้าน +ถามติง +ถามไถ่ +ถามนำ +ถามปากคำ +ถามะ +ถ่าย +ถ่ายเดียว +ถ่ายทอด +ถ่ายทุกข์ +ถ่ายเท +ถ่ายแบบ +ถ่ายปัสสาวะ +ถ่ายภาพยนตร์ +ถ่ายยา +ถ่ายรูป +ถ่ายอุจจาระ +ถ่าว +ถาวร +ถาวร- +ถาวรธิรา +ถาวรวัตถุ +ถ้าว่า +ถ้าหากว่า +ถ้ำ +ถ้ำชา +ถ้ำมอง +ถ้ำยาดม +ถิ่น +ถิร- +ถี +ถี่ +ถี่ๆ +ถี่ถ้วน +ถี่เท้า +ถีน- +ถีบ +ถีบกระดาน +ถีบจักร +ถีบจักรยาน +ถีบฉัด +ถีบตัว +ถีบทาง +ถีบรถ +ถีบหัวส่ง +ถี่ยิบ +ถี่ลอดตาช้าง ห่างลอดตาเล็น +ถึก +ถึง +ถึงกัน +ถึงแก่กรรม +ถึงแก่น +ถึงแก่พิราลัย +ถึงแก่มรณภาพ +ถึงแก่อนิจกรรม +ถึงแก่อสัญกรรม +ถึงขนาด +ถึงคราว +ถึงฆาต +ถึงเงิน +ถึงใจ +ถึงชีพิตักษัย +ถึงชีวิตันตราย +ถึงที่ +ถึงเป็นถึงตาย +ถึงผ้า +ถึงพริกถึงขิง +ถึงลูกถึงคน +ถึงว่า +ถึงไหนถึงกัน +ถือ +ถือกำเนิด +ถือโกรธ +ถือเขาถือเรา +ถือใจ +ถือดี +ถือตัว +ถือท้าย +ถือน้ำพระพิพัฒน์สัตยา +ถือบวช +ถือบังเหียน +ถือปูน +ถือผิว +ถือพล +ถือยศ +ถือยศถือศักดิ์ +ถือเราถือเขา +ถือว่า +ถือศักดินา +ถือศีล +ถือสา +ถือสิทธิ์ +ถือหาง +ถือโอกาส +ถุง +ถุงเค้า +ถุงตะเครียว +ถุงตะเคียว +ถุงย่าม +ถุงสำเร็จ +ถุน +ถุย +ถุล- +ถุลละ +ถู +ถูก +ถูกกระทำ +ถูกกัน +ถูกขา +ถูกคอ +ถูกคู่ +ถูกใจ +ถูกโฉลก +ถูกชะตา +ถูกตา +ถูกน้อย +ถูกปาก +ถูกส่วน +ถูกเส้น +ถูกใหญ่ +ถูกอกถูกใจ +ถูไถ +ถูป- +ถูปารหบุคคล +ถูล- +ถูลู่ถูกัง +เถกิง +เถน +เถมิน +เถมินเชิง +เถมินไพร +เถย- +เถยจิต +เถยเจตนา +เถยสังวาส +เถร +เถร- +เถรตรง +เถรภูมิ +เถรวาท +เถรส่องบาตร +เถระ +เถรานุเถระ +เถรี +เถลไถล +เถลิก +เถลิง +เถลิงศก +เถลือกถลน +เถ่อ +เถอะ +เถอะน่า +เถะๆ +เถา +เถ้า +เถ้าแก่ +เถาคัน +เถาคันเหล็ก +เถาเงาะ +เถาดาน +เถามวก +เถ้ารึง +เถาวัลย์ +เถาวัลย์กรด +เถาวัลย์เขียว +เถาวัลย์ปูน +เถาวัลย์เปรียง +เถาวัลย์ยอดด้วน +เถาวัลย์เหล็ก +เถาสิงโต +เถาหัวด้วน +เถาะ +เถิก +เถิง +เถิด +เถิดเทิง +เถิดน่า +เถิน +เถียง +เถียร +เถือ +เถือก +เถื่อน +แถ +แถก +แถง +แถน +แถบ +แถบบันทึกภาพ +แถบบันทึกเสียง +แถบเหล็กพืด +แถม +แถมพก +แถลง +แถลงการณ์ +แถลงการณ์ร่วม +แถลงข่าว +แถลบ +แถว +โถ +โถเครื่องแป้ง +โถง +โถงเถง +โถบ +โถปริก +โถม +โถมนาการ +โถส้วม +ไถ +ไถ่ +ไถ้ +ไถกลบ +ไถง +ไถดะ +ไถ่ถอน +ไถ่ถาม +ไถนา +ไถ่บาป +ไถแปร +ไถย- +ไถล +ท +ทก +ทกล้า +ทแกล้ว +ท่ง +ทงัน +ทชี +ทด +ทดถอย +ทดแทน +ทดโทร่ห +ทดรอง +ทดลอง +ทดเลข +ทดสอบ +ทท +ทธิ +ทน +ท้น +ทนดี +ทนต- +ทนต์ +ทนตกาษฐ์ +ทนทาน +ทนโท่ +ทนม +ทนาย +ทนายความ +ทนายเรือน +ทนายเลือก +ทนายหน้าหอ +ทบ +ทบทวน +ทบวง +ทบวงการ +ทบวงการเมือง +ทม +ทมก +ทมน +ทมบ +ทมอ +ทมิฬ +ทเมิน +ทโมน +ทยอย +ทยา +ทยาลุ +ทยาลุก +ทแยง +ทแยงมุม +ทร- +ทรกรรม +ทรง +ทรงกระเทียม +ทรงกลด +ทรงข้าวบิณฑ์ +ทรงเครื่อง +ทรงเครื่องใหญ่ +ทรงเจ้า +ทรงเจ้าเข้าผี +ทรงตัก +ทรงบาดาล +ทรงประพาส +ทรงพระเครื่องใหญ่ +ทรงมัณฑ์ +ทรงลังกา +ทรงหม้อตาล +ทรชน +ทรชาติ +ทรทึง +ทรธึก +ทรพล +ทรพิษ +ทรพี +ทรภิกษ์ +ทรมาทรกรรม +ทรมาน +ทรมุก +ทรยศ +ทรยุค +ทรรทึง +ทรรป +ทรรปณ์ +ทรรปณะ +ทรรศนะ +ทรรศนาการ +ทรรศนีย์ +ทรราช +ทรลักษณ์ +ทรเล่ห์ +ทรวง +ทรวด +ทรวดทรง +ทรวาร +ทรสองทรสุม +ทรสาย +ทรสุม +ทรหด +ทรหน +ทรหวล +ทรหึง +ทรหึงทรหวล +ทรหู +ทรเหล +ทรอ +ทรอมโบน +ทรอึง +ทรอุ้ม +ทระนง +ทระนาว +ทรัพย- +ทรัพย์ +ทรัพย์นอกพาณิชย์ +ทรัพย์ในดิน สินในน้ำ +ทรัพย์สมบัติ +ทรัพยสิทธิ +ทรัพย์สิน +ทรัพย์สินส่วนพระมหากษัตริย์ +ทรัพย์สินส่วนพระองค์ +ทรัพย์สินส่วนสาธารณสมบัติของแผ่นดิน +ทรัพยากร +ทรัพยากรธรณี +ทรัพยากรธรรมชาติ +ทรัมเป็ต +ทรานซิสเตอร์ +ทราบ +ทราบเกล้าทราบกระหม่อม +ทราบฝ่าพระบาท +ทราบฝ่าละอองธุลีพระบาท +ทราบฝ่าละอองพระบาท +ทราม +ทรามชม +ทรามเชย +ทรามวัย +ทรามสงวน +ทรามสวาท +ทราย +ทรายแก้ว +ทรายขาว +ทรายแป้ง +ทริทร +ทรุด +ทรุดโทรม +ทรุดนั่ง +ทรุม +ทรู่ +ทฤฆ- +ทฤษฎี +ทฤษฎีบท +ทล +ทลบม +ทลอึง +ทลาย +ทลิท +ทลิททก +ทวง +ท้วง +ท้วงติง +ทวงถาม +ท่วงท่า +ท่วงทำนอง +ท่วงที +ทวด +ทวดน้อย +ทวดึงส์ +ทวน +ท้วน +ทวนทบ +ทวนสบถ +ทวนสาบาน +ท่วม +ท้วม +ท้วมๆ +ท่วมท้น +ทวย +ท่วย +ท้วย +ทวยโถง +ท่วยโถง +ทวยะ +ทวอย +ทวัตดึงส์ +ทวัตดึงสาการ +ทวัย +ทวา +ทว่า +ทวาตรึงประดับ +ทวาทศ +ทวาทศม- +ทวาทศมณฑล +ทวาทศี +ทวาบร +ทวาบรยุค +ทวาย +ทวาร +ทวารทั้งเก้า +ทวารบถ +ทวารบาล +ทวารประดับ +ทวิ +ทวิช +ทวิช- +ทวิชงค์ +ทวิชากร +ทวิชาติ +ทวิตีย +ทวิตียา +ทวิบถ +ทวิบท +ทวิบาท +ทวิป +ทวิภาค +ทวิภาคี +ทวิร +ทวี +ทวีคูณ +ทวีธาภิเษก +ทวีป +ทวีปี +ทศ +ทศ- +ทศชาติ +ทศทิศ +ทศนิยม +ทศเบญจกูล +ทศพร +ทศพล +ทศพิธราชธรรม +ทศม- +ทศมาส +ทศมี +ทศวรรษ +ทศา +ทศางค์ +ทสา +ทหระ +ทหาร +ทหารกองประจำการ +ทหารผ่านศึก +ทหารเลว +ทอ +ท่อ +ท้อ +ทอก +ทอง +ท่อง +ท้อง +ทองกร +ทองกวาว +ท้องกาง +ท้องแก่ +ทองขาว +ท้องขาว +ท้องขึ้น +ท้องขึ้นท้องพอง +ท้องแขน +ท้องแขวน +ท้องคัดท้องแข็ง +ทองคำ +ทองคำขาว +ทองคำเปลว +ท้องคุ้ง +ทองเค +ทองเครือ +ท่องจำ +ท้องฉนวน +ทองชมพูนุท +ทองชุบ +ทองดอกบวบ +ทองดำ +ท้องเดิน +ทองแดง +ทองต้นแขน +ท้องตรา +ท้องตลาด +ทองตากู +ท้องถิ่น +ทองทราย +ทองทศ +ท้องที่ +ทองทึบ +ท่องเที่ยว +ทองธรรมชาติ +ทองนพคุณ +ท้องน่อง +ท้องน้อย +ทองบรอนซ์ +ท้องแบน +ทองใบ +ทองปราย +ทองปลายแขน +ท้องปลิง +ทองแป +ท้องผุท้องพัง +ท้องผูก +ทองเผือก +ทองแผ่นเดียวกัน +ทองพระกร +ทองพระขุน +ท้องพระคลัง +ท้องพระโรง +ทองพลุ +ท้องพลุ +ท้องพอง +ทองพัดดึงส์ +ทองพันชั่ง +ทองพันดุล +ทองพิศ +ท้องเฟ้อ +ทองภู +ทองม้วน +ท้องมาน +ท้องไม้ +ทองไม่รู้ร้อน +ทองย้อย +ท้องยุ้งพุงกระสอบ +ท้องร่วง +ท้องร่อง +ทองรูปพรรณ +ท้องเรื่อง +ท้องลาน +ทองลิน +ท้องเลว +ทองแล่ง +ทองวิทยาศาสตร์ +ทองสักโก +ทองสัมฤทธิ์ +ท้องสาว +ท้องสำนวน +ท่องสื่อ +ท้องเสีย +ทองหมั้น +ท้องหมา +ท้องหมู +ทองหยอง +ทองหยอด +ทองหยิบ +ทองหลาง +ทองเหลือง +ท้องแห้ง +ทองโหลง +ทองอังกฤษ +ท้องอัสดงคต +ท้องอืด +ทองอุไร +ทองเอก +ทอด +ทอดกฐิน +ทอดโกลน +ทอดตัว +ทอดตา +ทอดทฤษฎี +ทอดทิ้ง +ทอดที่ +ทอดน่อง +ทอดน้ำ +ทอดผ้าป่า +ทอดพระที่ +ทอดพระเนตร +ทอดมัน +ทอดยอด +ทอดรวง +ทอดสกา +ทอดสมอ +ทอดสะพาน +ทอดสายตา +ทอดเสียง +ทอดหญ้า +ทอดหุ่ย +ทอดแห +ทอดอาลัย +ท่อถ้อย +ท้อถอย +ท้อถ้อย +ท้อแท้ +ทอน +ท่อน +ทอนซิล +ทอฟฟี่ +ท่อมๆ +ทอย +ทอยกอง +ทอเรียม +ทอแสง +ทอหูก +ท่อไอเสีย +ทะ +ทะงัน +ทะทัด +ทะทา +ทะทาย +ทะท่าว +ทะท้าว +ทะทึก +ทะเทียด +ทะนง +ทะนงตัว +ทะนงศักดิ์ +ทะนน +ทะนะ +ทะนา +ทะนาน +ทะนานหลวง +ทะนุ +ทะนุก +ทะนุกถนอม +ทะนุถนอม +ทะนุบำรุง +ทะบู +ทะเบียน +ทะเบียนบ้าน +ทะเบียนราษฎร +ทะเบียนสำมะโนครัว +ทะมัดทะแมง +ทะมึน +ทะมื่น +ทะแม่ง +ทะแม่งๆ +ทะยาทะแยแส +ทะยาน +ทะยานใจ +ทะยานอยาก +ทะเยอทะยาน +ทะแย +ทะแยสามชั้น +ทะร่อทะแร่ +ทะลวง +ทะลอก +ทะลัก +ทะลักทะแลง +ทะลาย +ทะลิ่น +ทะลิ่นชระลั่ง +ทะลึ่ง +ทะลึ่งทะลั่ง +ทะลุ +ทะลุกลางปล้อง +ทะลุดทะลาด +ทะลุปรุโปร่ง +ทะเล +ทะเลทราย +ทะเล้น +ทะเลใน +ทะเลบ้า +ทะเลภายใน +ทะเลสาบ +ทะเลหน้าใน +ทะเลหลวง +ทะเลไหล่ทวีป +ทะเล่อทะล่า +ทะเลอาณาเขต +ทะเลาะ +ทะเลาะเบาะแว้ง +ทะวาย +ทะเวน +ทัก +ทักข์ +ทักขิญ +ทักขิณ +ทักขิณา +ทักขิณาบถ +ทักขิณาวัฏ +ทักขิโณทก +ทักขิไณยบุคคล +ทักท้วง +ทักทาย +ทักทิน +ทักนิมิต +ทักษ- +ทักษะ +ทักษา +ทักษิณ +ทักษิณนิกาย +ทักษิณา +ทักษิณาจาร +ทักษิณาทาน +ทักษิณานุประทาน +ทักษิณายัน +ทักษิณาวรรต +ทักษิโณทก +ทัคธ์ +ทัง +ทั่ง +ทั้ง +ทั้ง...กับ +ทั้งขึ้นทั้งล่อง +ทั้งคน +ทั้งดุ้น +ทั้ง...ทั้ง +ทั้งที +ทั้งที่ +ทั้งๆ ที่ +ทั้งนั้น +ทั้งนี้ +ทั้งนี้ทั้งนั้น +ทั้งเนื้อทั้งตัว +ทั้งปวง +ทั้งผอง +ทั้งเพ +ทั้งมวล +ทั้ง...และ +ทังวล +ทังวี้ทังวล +ทังสเตน +ทั้งสิ้น +ทั้งหมด +ทั้งหลาย +ทั้งอย่างนั้น +ทัณฑ- +ทัณฑ์ +ทัณฑกรรม +ทัณฑฆาต +ทัณฑนิคม +ทัณฑ์บน +ทัณฑวิทยา +ทัณฑสถาน +ทัณฑะ +ทัณฑิกา +ทัณฑิมา +ทัณฑีบท +ทัด +ทัดดอกไม้ +ทัดทา +ทัดทาน +ทัดเทียม +-ทัต +ทัน +ทันกิน +ทันควัน +ทันใจ +ทันใด +ทันต- +ทันต์ +ทันตชะ +ทันตแพทย์ +ทันตา +ทันติน +ทันตี +ทันท่วงที +ทันที +ทันธ์ +ทันน้ำ +ทันน้ำทันฝน +ทันสมัย +ทับ +ทับเกษตร +ทับถม +ทับทรวง +ทับทาง +ทับทางขาว +ทับทิม +ทับที่ +ทับแพ +ทับลัคน์ +ทับเล็ก +ทับศัพท์ +ทับสมิงคลา +ทับสิทธิ์ +ทับหลัง +ทับหลังลัคน์ +ทัป +ทัปน +ทัพ +ทัพพะ +ทัพพี +ทัพสัมภาระ +ทั่ว +ทั่วถึง +ทั่วทุกสารทิศ +ทั่วทุกหัวระแหง +ทั่วไป +ทั่วๆ ไป +ทัศ +ทัศน- +ทัศน์ +ทัศนคติ +ทัศนวิสัย +ทัศนศาสตร์ +ทัศนศึกษา +ทัศนะ +ทัศนา +ทัศนาการ +ทัศนาจร +ทัศนีย- +ทัศนีย์ +ทัศนียภาพ +ทัศนูปกรณ์ +ทัศไนย +ทัสนานุตริยะ +ทัฬห +ทัฬหิ +ทัฬหิกรณ์ +ทัฬหี +ทัฬหีกรรม +ทา +ท่า +ท้า +ทาก +ทาง +ท้าง +ทางการ +ทางเก็บ +ทางข้าม +ทางช้างเผือก +ทางด่วน +ทางเท้า +ทางโท +ทางใน +ทางผ่าน +ทางพิเศษ +ทางมะพร้าว +ทางม้าลาย +ทางสาธารณะ +ทางหลวง +ทางออก +ทางเอก +ทาฐะ +ทาฐิกะ +ทาฒะ +ทาฒิกะ +ท่าดีทีเหลว +ท่าเดียว +ท่าทาง +ท้าทาย +ท่าที +ทาน +ทาน- +ท่าน +ทานกัณฑ์ +ท่านชาย +ทานต์ +ทานตะวัน +ทานบดี +ทานบารมี +ท่านผู้หญิง +ทานพ +ทานมัย +ทานศีล +ท่านหญิง +ท่านั้นท่านี้ +ทานาธิบดี +ทาบ +ทาบทาม +ทาม +ท่ามกลาง +ทาย +ท้าย +ทายก +ท้ายเขื่อน +ท้ายครัว +ท้ายโต่ง +ท้ายทอย +ท้ายน้ำ +ท้ายฝน +ทายัช +ทายา +ทายาด +ทายาท +ทายาทโดยธรรม +ทาร- +ทารก +ทารพี +ทาริกา +ทารุ +ทารุณ +ทารุณ- +ทารุณกรรม +ท่าเรือ +ทาว +ท่าว +ท้าว +ท่าวกำลัง +ท่าวทบระนับ +ท้าวนาง +ท้าวพญา +ท้าวพระยา +ทาษ +ทาส +ทาส- +ทาสทาน +ทาสปัญญา +ทาสี +ท่าอากาศยาน +ทำ +ทำกรรม +ทำการบ้าน +ทำขวัญ +ทำครัว +ทำคลอด +ทำความ +ทำคุณ +ทำคุณบูชาโทษ +ทำงน +ทำเจ็บ +ทำใจ +ทำได้ +ทำได้ลงคอ +ทำตัว +ทำตา +ทำท่า +ทำที +ทำแท้ง +ทำโทษ +ทำนบ +ทำนวย +ทำนอง +ทำนองเสนาะ +ทำนาบนหลังคน +ทำนาย +ทำนาออมกล้า ทำปลาออมเกลือ +ทำนุ +ทำนุบำรุง +ทำนูล +ทำเนา +ทำเนียบ +ทำเนียบท่าเรือ +ทำเนียบนาม +ทำเนียม +ทำบาป +ทำบุญ +ทำบุญเอาหน้า +ทำปลา +ทำปากทำคอ +ทำเป็น +ทำไปทำมา +ทำพิษ +ทำไพ่ +ทำฟัน +ทำไฟ +ทำมัง +ทำไม +ทำร้าย +ทำฤทธิ์ +ทำลาย +ทำลายขวัญ +ทำลายสถิติ +ทำลิง +ทำเล +ทำวน +ทำวัตร +ทำวัตรค่ำ +ทำวัตรเช้า +ทำเวร +ทำเวลา +ทำสาว +ทำเสน่ห์ +ทำเสียเจ็บ +ทำหน้าทำตา +ทำหมัน +ทำหูทวนลม +ทำเหตุ +ทำให้ +ทำเอา +ทำเอาเจ็บ +ทิคัมพร +ทิฆัมพร +ทิ้ง +ทิ้งกระจาด +ทิ้งขว้าง +ทิ้งๆ ขว้างๆ +ทิ้งจดหมาย +ทิงเจอร์ +ทิ้งถ่อน +ทิ้งทวน +ทิ้งทาน +ทิ้งท้าย +ทิ้งทูด +ทิ้งไพ่ +ทิ้งฟ้อง +ทิ้งมะพร้าวห้าว +ทิ้งย่อ +ทิช +ทิช- +ทิชากร +ทิฏฐะ +ทิฏฐานุคติ +ทิฏฐุชุกรรม +ทิฐ- +ทิฐธรรม +ทิฐิ +ทิด +ทิต +ทิน +ทิน- +ทินกร +ทินศูนย์ +ทินาท +ทิพ +ทิพ- +ทิพย- +ทิพย์ +ทิพยจักษุ +ทิพยจักษุญาณ +ทิพยญาณ +ทิพยเนตร +ทิพยพยาน +ทิพยมานุษ +ทิพยรส +ทิพยโศรตร +ทิพโสต +ทิพา +ทิพากร +ทิม +ทิ่ม +ทิมดาบ +ทิ่มตำ +ทิมทอง +ทิ่มแทง +ทิว +ทิว- +ทิวกาล +ทิวงคต +ทิวทัศน์ +ทิวส- +ทิวสภาค +ทิวสะ +ทิวา +ทิวากร +ทิวากาล +ทิศ +ทิศทาง +ทิศา +ทิศาดร +ทิศานุทิศ +ทิศาปาโมกข์ +ที +ที่ +ที่กัลปนา +ทีใครทีมัน +ทีฆ- +ทีฆชาติ +ทีฆนิกาย +ทีฆสระ +ทีฆายุ +ที่จริง +ที่ดิน +ที่ดินมือเปล่า +ทีเด็ด +ทีเดียว +ทีท่า +ที่ทาง +ที่ทำการ +ที่เท่าแมวดิ้นตาย +ที่แท้ +ที่ธรณีสงฆ์ +ที่นอน +ที่นั่ง +ทีนี้ +ทีป +ที่พึ่ง +ทีม +ที่มั่น +ที่มา +ทีรฆ- +ที่รัก +ที่ราบ +ที่ราบสูง +ทีเล่นทีจริง +ที่วัด +ที่ว่าการ +ที่สุด +ที่หมาย +ทีหลัง +ที่ไหน +ที่ไหนได้ +ทีเอ็นที +ทึก +ทึกทัก +ทึ่ง +ทึ้ง +ทึดทือ +ทึนทึก +ทึบ +ทึม +ทึมๆ +ทึ่ม +ทื่อ +ทุ +ทุก +ทุกๆ +ทุกข- +ทุกข์ +ทุกขนิโรธ +ทุกขลาภ +ทุกขเวทนา +ทุกขสมุทัย +ทุกข์สุข +ทุกขักษัย +ทุกขารมณ์ +ทุกฏ +ทุกที +ทุกนิบาต +ทุกพาย +ทุกเมื่อ +ทุกเมื่อเชื่อวัน +ทุกร- +ทุกรกิริยา +ทุกวันนี้ +ทุกษดร +ทุกสิ่งทุกอย่าง +ทุกหน +ทุกหนทุกแห่ง +ทุกหย่อมหญ้า +ทุกหัวระแหง +ทุกแห่ง +ทุกะ +ทุกัง +ทุกูล +ทุคตะ +ทุคติ +ทุ่ง +ทุ้ง +ทุงงะ +ทุงเทง +ทุจจิณณะ +ทุจริต +ทุด +ทุตวิลัมพิตมาลา +ทุติย- +ทุติยาสาฬห +ทุทรรศนนิยม +ทุน +ทุ่น +ทุนจดทะเบียน +ทุนทรัพย์ +ทุนนอน +ทุนนิมิต +ทุนนิยม +ทุ่นเบ็ด +ทุนรอน +ทุ่นระเบิด +ทุนเรือนหุ้น +ทุนสำรอง +ทุนสำรองเงินตรา +ทุนหมุนเวียน +ทุ่นอวน +ทุนิยม +ทุบ +ทุบตี +ทุบทู +ทุบหม้อข้าว +ทุปปัญญา +ทุพพรรณ +ทุพพล +ทุพพลภาพ +ทุพภิกขภัย +ทุพภิกขันดรกัป +ทุม +ทุม- +ทุ่ม +ทุ้ม +ทุ่มตลาด +ทุ่มเถียง +ทุ่มเท +ทุมโน +ทุมราชา +ทุย +ทุ้ย +ทุร- +ทุรกันดาร +ทุรคม +ทุรชน +ทุรชาติ +ทุรน +ทุรนทุราย +ทุรพล +ทุรภิกษ์ +ทุรลักษณ์ +ทุรัถยา +ทุรัศ +ทุราคม +ทุราจาร +ทุราธวา +ทุเรศ +ทุเรียน +ทุเรียนแขก +ทุเรียนเทศ +ทุลักทุเล +ทุเลา +ทุวิธ +ทุศีล +ทุษฐ- +ทุส- +ทุสสะ +ทุสสีล +ทู +ทู่ +ทู้ +ทูกัง +ทู่ซี้ +ทูต +ทูตานุทูต +ทูน +ทูน้ำจืด +ทูบ +ทูม +ทูมทาม +ทูโม่ง +ทูร- +ทูล +ทูลกระหม่อม +ทูลเกล้าทูลกระหม่อมถวาย +ทูเลียม +ทูษก +เท +เท่ +เทกระจาด +เทกระเป๋า +เทคนิค +เทคนีเชียม +เทคโนโลยี +เทครัว +เทคอนกรีต +เทง +เท้ง +เท้งเต้ง +เท้งทูด +เท็จ +เท็จจริง +เท็จเทียม +เทนนิส +เทน้ำเทท่า +เทปูน +เทพ +เทพ- +เทพกุสุม +เทพเจ้า +เทพชุมนุม +เทพดา +เทพดำรู +เทพทัณฑ์ +เทพทารู +เทพทาโร +เทพธิดา +เทพนม +เทพนารี +เทพนิยม +เทพนิยาย +เทพนิยายวิทยา +เทพนิรมิต +เทพบดี +เทพบริษัท +เทพบุตร +เทพประติมา +เทพพยากรณ์ +เทพย- +เทพยเจ้า +เทพยดา +เทพยุดา +เทพสังหรณ์ +เทพา +เทพาดิเทพ +เทพาธิบดี +เทพารักษ์ +เทพิน +เทพินทร์ +เทพี +เทพีปักษี +เทเพนทร์ +เทโพ +เทริด +เทลลูเรียม +เทว- +เทวดา +เทวทัณฑ์ +เทวทูต +เทวธรรม +เทวธิดา +เทวนะ +เทวนาครี +เทวนิยม +เทวภาวะ +เทวระ +เทวรูป +เทวโลก +เทววาจิกะ +เทววิทยา +เทวศ +เทวษ +เทวสถาน +เทวสุคนธ์ +เทวอ +เทวัญ +เทวัน +เทวาคาร +เทวารัณย์ +เทวาลัย +เทวาวาส +เทวินทร์ +เทวี +เทเวนทร์ +เทเวศ +เทเวศร์ +เทเวศวร์ +เทศ +เทศ- +เทศก +เทศกาล +เทศน์ +เทศน์แจง +เทศนา +เทศบัญญัติ +เทศบาล +เทศมนตรี +เทศะ +เทศาจาร +เทศาภิบาล +เทห- +เทห์ +เท่ห์ +เทห์ฟากฟ้า +เทหวัตถุ +เท่อ +เท้อ +เทอญ +เทอม +เทอร์เบียม +เทอร์โมมิเตอร์ +เทอะทะ +เทา +เท่า +เท้า +เท่ากับ +เท้าแขน +เท้าคู้ +เท้าช้าง +เท่าใด +เท่าตัว +เท่าทัน +เท่าทุน +เท่าเทียม +เท่านั้น +เท่าเผ้า +เท้ายายม่อม +เท่ารึง +เท่าไร +เท้าสาน +เท้าสิงห์ +เทาะห์ +เทิก +เทิ่ง +เทิงบอง +เทิด +เทิดทูน +เทิน +เทิบ +เทิบๆ +เทิบทาบ +เทิ้ม +เทียง +เที่ยง +เที่ยงๆ +เที่ยงตรง +เที่ยงแท้ +เที่ยงธรรม +เทียน +เที้ยน +เทียนกิ่ง +เทียนเกล็ดหอย +เทียนแกลบ +เทียนขม +เทียนขาว +เทียนข้าวเปลือก +เทียนดำ +เทียนแดง +เทียนตากบ +เทียนตาตั๊กแตน +เทียนบ้าน +เทียนพรรษา +เทียนเยาวพาณี +เทียนรุ่ง +เทียนลวด +เทียนสัตตบุษย์ +เทียนอบ +เทียบ +เทียบเคียง +เทียบเท่า +เทียม +เทียร +เที้ยร +เทียรฆ- +เทียรฆชาติ +เทียรฆราตร +เทียว +เที่ยว +เทือ +เทื่อ +เทื้อ +เทือก +เทือกเขา +เทือกเถาเหล่ากอ +เทือน +แท่ +แท้ +แท้ๆ +แท็กซี่ +แท็กซี่มิเตอร์ +แทง +แท่ง +แท้ง +แท็งก์น้ำ +แทงใจ +แทงใจดำ +แทงตะไบ +แทงทวย +แทงวิสัย +แทงหยวก +แท้จริง +แทตย์ +แท้ที่จริง +แทน +แท่น +แทนเจนต์ +แทนทาลัม +แทนที่จะ +แท่นพิมพ์ +แท่นมณฑล +แท่นลา +แท่นหมึก +แทบ +แทรก +แทรกซอน +แทรกซ้อน +แทรกซึม +แทรกแซง +แทรกเตอร์ +แทรกแผ่นดิน +แทรกโพน +แทลเลียม +แทะ +แทะโลม +โท +โท่ +โทกเทก +โทงๆ +โทงเทง +โทณะ +โทโทษ +โทธก +โทน +โทนโท่ +โทมนัส +โทร- +โทรคมนาคม +โทรทรรศน์ +โทรทัศน์ +โทรพิมพ์ +โทรภาพ +โทรม +โทรมศัสตราวุธ +โทรมหญิง +โทรเลข +โทรศัพท์ +โทรสาร +โทลา +โทศก +โทษ +โทษ- +โทษกรณ์ +โทษตรัย +โทษทางวินัย +โทษโพย +โทษา +โทษากร +โทษาดิลก +โทษานุโทษ +โทษารมณ์ +โทส- +โทสะ +โทสาคติ +โทโส +โทหฬะ +โทหฬินี +ไท +ไท้ +ไทเทเนียม +ไทเทรต +ไทย +ไทยดำ +ไทยทาน +ไทยธรรม +ไทยน้อย +ไทยนับสาม +ไทยนับห้า +ไทยหลง +ไทยหลวง +ไทยใหญ่ +ไทร +ไทรทอง +ไทรเลียบ +ไทวะ +ธ +ธง +ธงก์ +ธงกระบี่ธุช +ธงจระเข้ +ธงฉาน +ธงชัย +ธงชัยเฉลิมพลของทหารบก +ธงชัยเฉลิมพลของทหารเรือ +ธงชัยเฉลิมพลของทหารอากาศ +ธงชาติ +ธงชาย +ธงตะขาบ +ธงนำริ้ว +ธงบรมราชวงศ์น้อย +ธงบรมราชวงศ์ใหญ่ +ธงประจำกองทัพบก +ธงประจำกองทัพเรือ +ธงประจำกองทัพอากาศ +ธงพระครุฑพ่าห์ +ธงพิทักษ์สันติราษฎร์ +ธงมหาราชน้อย +ธงมหาราชใหญ่ +ธงเยาวราชน้อย +ธงเยาวราชใหญ่ +ธงราชนาวี +ธงราชินีน้อย +ธงราชินีใหญ่ +ธงสามเหลี่ยม +ธช +ธชี +ธตรฐ +ธน +ธน- +ธนธานี +ธนบดี +ธนบัตร +ธนสมบัติ +ธนสาร +ธนัง +ธนาคม +ธนาคาร +ธนาคารพาณิชย์ +ธนาคารโลก +ธนาคารออมสิน +ธนาณัติ +ธนิต +ธนิษฐะ +ธนิษฐา +ธนุ +ธนุร- +ธนุรมารค +ธนุรวิทยา +ธนุรเวท +ธนู +ธนูศิลป์ +ธเนศ +ธเนศวร +ธโนปจัย +ธไนศวรรย์ +ธม +ธมกรก +ธร +ธรง +ธรณ +ธรณิน +ธรณินทร์ +ธรณิศ +ธรณิศร +ธรณิศวร์ +ธรณี +ธรณีกันแสง +ธรณีประตู +ธรณีมณฑล +ธรณีร้องไห้ +ธรณีวิทยา +ธรณีศวร +ธรณีสงฆ์ +ธรณีสาร +ธรณีสูบ +ธรมาน +ธรรม +ธรรม- +ธรรมกถา +ธรรมกถึก +ธรรมกาม +ธรรมกาย +ธรรมการ +ธรรมการย์ +ธรรมเกษตร +ธรรมขันธ์ +ธรรมคุณ +ธรรมจรณะ +ธรรมจรรยา +ธรรมจริยา +ธรรมจักร +ธรรมจักษุ +ธรรมจาคะ +ธรรมจารี +ธรรมจินดา +ธรรมเจดีย์ +ธรรมชาติ +ธรรมฐิติ +ธรรมดา +ธรรมทรรศนะ +ธรรมธาดา +ธรรมธาตุ +ธรรมนาถ +ธรรมนิตย์ +ธรรมนิยม +ธรรมนิยาม +ธรรมนิเวศ +ธรรมนูญ +ธรรมนูญการปกครองราชอาณาจักร +ธรรมเนียม +ธรรมเนียมประเพณี +ธรรมบท +ธรรมบาล +ธรรมบิฐ +ธรรมปฏิรูป +ธรรมปฏิสัมภิทา +ธรรมประติรูป +ธรรมยุต +ธรรมยุทธ์ +ธรรมรัตน์ +ธรรมราชา +ธรรมวัตร +ธรรมศาสตร์ +ธรรมสถิติ +ธรรมสภา +ธรรมสรีระ +ธรรมสังคีติ +ธรรมสังเวช +ธรรมสากัจฉา +ธรรมสามิสร +ธรรมสามี +ธรรมสาร +ธรรมะ +ธรรมะธัมโม +ธรรมันเตวาสิก +ธรรมาทิตย์ +ธรรมาธรรม +ธรรมาธิปไตย +ธรรมาธิษฐาน +ธรรมานุธรรมปฏิบัติ +ธรรมานุสาร +ธรรมาภิมุข +ธรรมาภิสมัย +ธรรมายตนะ +ธรรมารมณ์ +ธรรมาสน์ +ธรรมิก +ธรรมิก- +ธรา +ธราดล +ธราธร +ธราธาร +ธราธิบดี +ธราธิป +ธริษตรี +ธเรศ +ธเรษตรี +ธเรษตรีศวร +ธวัช +ธังก +ธัช +ธัญ +ธัญ- +ธัญโกศ +ธัญเขต +ธัญชาติ +ธัญญาหาร +ธัญดัจ +ธัญเบญจก +ธัญพืช +ธัญมาส +ธันยา +ธันยาวาท +ธันวาคม +ธัมมะ +ธาดา +ธาตรี +ธาตวากร +ธาตุ +ธาตุ- +ธาตุโขภ +ธาตุครรภ +ธาตุเจดีย์ +ธาตุเบา +ธาตุมมิสสา +ธาตุสถูป +ธาตุหนัก +ธานิน +ธานินทร์ +ธานี +ธาร +ธารกำนัล +ธารคำนัล +ธารณ +ธารณะ +ธารณา +ธารณามัย +ธารพระกร +ธารยักษ์ +ธารา +ธาราเคหะ +ธาราธิคุณ +ธารายนต์ +ธาษตรี +ธำมรงค์ +ธำรง +ธิดา +ธิติ +ธีร- +ธีรภาพ +ธีรราช +ธุช +ธุดงค- +ธุดงค์ +ธุดงควัตร +ธุดงคสมาทาน +ธุต +ธุตตะ +ธุม- +ธุมเกตุ +ธุมชาล +ธุมเพลิง +ธุมา +ธุร- +ธุรการ +ธุรกิจ +ธุระ +ธุรำ +ธุลี +ธุว- +ธุวดารา +ธุวภาค +ธุวมณฑล +ธุวยัษฎี +ธูป +ธูป- +ธูปบาตร +ธูปแพเทียนแพ +ธูปไม้ระกำ +ธูปฤๅษี +เธนุ +เธอ +เธียร +โธ่ +โธวน +น +นก +นกกระจอก +นกกระจอกทอง +นกกระทุง +นกกะปูด +นกกางปีก +นกเขา +นกคุ่ม +นกจาก +นกต่อ +นกยูง +นกรู้ +นกสองหัว +นกหก +นกหวีด +นกอยู่ในปล่อง +นกุล +นข +นข- +นขทารณ์ +นขลิขิต +นขเลขา +นขา +นค +นคร +นคร- +นครบาล +นครบาลจังหวัด +นครรัฐ +นครวาสี +นครโสภิณี +นครโสเภณี +นคราทร +นครินทร์ +นคเรศ +นคินทร +นคินทร์ +นเคนทร์ +นเคศวร +นโคทร +นง +นงคราญ +นงคุฐ +นงนุช +นงพะงา +นงพาล +นงพุธ +นงโพธ +นงเยาว์ +นงราม +นงลักษณ์ +นท +นที +นทีรัย +นนตรา +นนท์ +นนทรี +นนทลี +นนทิ +นบ +นบนอบ +นปุงสกลิงค์ +นปุงสกลึงค์ +นพ +นพ- +นพกะ +นพเก้า +นพคุณ +นพเคราะห์ +นพนิต +นพปฎล +นพพล +นพพวง +นพพัน +นพรัตน์ +นพศก +นพศูล +นภ- +นภจร +นภดล +นภมณฑล +นภวิถี +นภศูล +นภสินธุ์ +นภา +นภาลัย +นม +นมกระแชง +นมข้น +นมควาย +นมชะนี +นมช้าง +นมตาบอด +นมตาสะแก +นมตำเรีย +นมตำเลีย +นมนาง +นมนาน +นมบกอกพร่อง +นมบอด +นมผง +นมผา +นมพวง +นมพิจิตร +นมแมว +นมไม้ +นมวัว +นมสวรรค์ +นมสาว +นมหนู +นมะ +นมักการ +นมัสการ +นมาซ +นย- +นยนะ +นยนา +นยะ +นยักษ์ +นโยบาย +นร- +นรก +นรกานต์ +นรการ +นรเทพ +นรนาถ +นรนายก +นรบดี +นรบาล +นรพยัคฆ์ +นรราช +นรเศรษฐ์ +นรสิงห์ +นรสีห์ +นรา +นราธิป +นรินทร์ +นริศ +นริศร +นริศวร +นรี +นรีเวชวิทยา +นเรนทรสูร +นเรศ +นเรศวร +นเรศวร์ชนช้าง +นเรศูร +นโรดม +นฤ- +นฤคหิต +นฤโฆษ +นฤดม +นฤตย- +นฤตย์ +นฤตยศาลา +นฤตยศาสตร์ +นฤตยสถาน +นฤเทพ +นฤนาท +นฤบดี +นฤบาล +นฤเบศ +นฤป +นฤปนีติ +นฤปเวศม์ +นฤปัตนี +นฤพาน +นฤมล +นฤมาณ +นฤมิต +นลาฏ +นลิน +นลินี +นว- +นวก- +นวกภูมิ +นวกรรม +นวกรรมิก +นวกะ +นวการ +นวกิจ +นวโกวาท +นวครหะ +นวคุณ +นวเคราะห์ +นวชาต +นวด +นวดข้าว +นวดแป้ง +นวดฟั้น +นวทวาร +นวนิต +นวนิยาย +นวปฎล +นวพธู +นวม +น่วม +นวมี +นวมุข +นวย +นวยนาด +นวรัตน์ +นวล +นวลจันทร์ +นวลจันทร์ทะเล +นวลน้อย +นวลระหง +นวลลออ +นวลละออง +นวลหง +นวโลหะ +นววิธ +นวอรหาทิคุณ +นวังคสัตถุศาสน์ +นวารหาทิคุณ +นวาระ +นหาดก +นหาน +นหารุ +นหุต +นฬ +นฬ- +นฬการ +นฬป +นอ +นอก +นอกกฎหมาย +นอกครู +นอกคอก +นอกจาก +นอกใจ +นอกชาน +นอกตำรา +นอกถนน +นอกบาลี +นอกรีต +นอกรีตนอกรอย +นอกลู่นอกทาง +นอกเหนือ +นอง +น่อง +น้อง +น้องๆ +นองเนือง +น่องแน่ง +น้องเพล +นองเลือด +น่องสิงห์ +นองหน้า +นอต +นอน +นอนก้น +นอนกิน +นอนใจ +นอนตาไม่หลับ +นอนตีพุง +นอนนก +นอนแบ็บ +นอนโรง +นอนเล่น +นอนวัน +นอนเวร +นอนหลับทับสิทธิ์ +นอนหลับไม่รู้ นอนคู้ไม่เห็น +นอบ +นอบนบ +นอบน้อม +น้อม +น้อมเกล้าน้อมกระหม่อมถวาย +น้อมนำ +น้อย +น้อยแง่ +น้อยใจ +น้อยเนื้อต่ำใจ +น้อยหน่า +น้อยหน้า +น้อยหรือ +น้อยโหน่ง +นะ +นะแน่ง +นัก +นักกะ +นักการ +นักการเมือง +นักกีฬา +นักขัต +นักขัต- +นักขัตฤกษ์ +นักข่าว +นักงาน +นักตะ +นักท่องเที่ยว +นักเทศ +นักเทศน์ +นักโทษ +นักโทษเด็ดขาด +นักโทษพิเศษ +นักธรรม +นักบวช +นักบิน +นักบุญ +นักปราชญ์ +นักพรต +นักร +นักรบ +นักเรียน +นักเลง +นักศึกษา +นักษัตร +นักษัตร- +นักษัตรจักร +นักษัตรเนมี +นักษัตรบดี +นักษัตรบถ +นักษัตรปาฐก +นักษัตรมณฑล +นักษัตรมาลา +นักษัตรโยค +นักษัตรวิทยา +นักสนม +นักสราช +นักสวด +นักสิทธิ์ +นักสืบ +นักหนา +นัข +นัค +นัคคะ +นั่ง +นั่งกินนอนกิน +นั่งขัดสมาธิ +นังคัล +นั่งคุกเข่า +นั่งซัง +นั่งทาง +นั่งทางใน +นั่งเทียน +นั่งในหัวใจ +นั่งปรก +นั่งโป่ง +นั่งพับเพียบ +นั่งเมือง +นั่งยองๆ +นั่งร้าน +นั่งราว +นั่งเล่น +นั่งห้าง +นัจ +นัฏ +นัฏก +นัฑ +นัด +นัดดา +นัดแนะ +นัดหมาย +นัตถุ์ +นั่น +นั้น +นั่นซี +นันท- +นันททายี +นันทน์ +นันทนาการ +นันทปักษี +นันทิ +นั่นแน่ +นั่นปะไร +นั้นแล +นั่นแหละ +นั่นเอง +นับ +นับถือ +นับประสา +นับหน้าถือตา +นัย +นัยน์ +นัยน์ตา +นัยน์เนตร +นัยนา +นัยนามพุ +นัยว่า +นัว +นัวเนีย +นา +น่า +น้า +นาก +นากบุด +นากสวาด +นากาสาหรี +น่าเกลียดน่าชัง +นาขอบเหล็ก +นาค +นาค- +นาคเกี่ยว +นาคเกี้ยว +นาคเกี้ยวกระหวัด +นาคเกี่ยวพระสุเมรุ +นาคทนต์ +นาคบริพันธ์ +นาคบาศ +นาคปรก +นาคปัก +นาคพันธ์ +นาคร +นาครวย +นาคราช +นาคราชแผลงฤทธิ์ +นาคลดา +นาคเล่นน้ำ +นาควิถี +นาคสะดุ้ง +นาคสังวัจฉร +นาคา +นาคาวโลก +นาคินทร์ +นาคี +นาคู่โค +นาเคนทร์ +นาเคศ +นาเคศวร +นาโครคินทร +นาง +นางกราย +นางกวัก +นางเกล็ด +นางงาม +นางจรัล +นางจุม +นางชม +นางดำ +นางท้าว +นางนวล +นางนูน +นางแนบ +นางใน +นางบำเรอ +นางพญา +นางพระกำนัล +นางฟ้า +นางเมือง +นางไม้ +นางแย้ม +นางรม +นางรมใหญ่ +นางรอง +นางร้องไห้ +นางรำ +นางเรียง +นางล้อม +นางเล็ด +นางเลิ้ง +นางสนองพระโอษฐ์ +นางสาว +นางหงส์ +นางห้าม +นางอ้อม +นางอาย +นางเอก +นางแอ่น +นาเชิงทรง +นาฏ +นาฏ- +นาฏก +นาฏกรรม +นาฏดนตรี +นาฏย- +นาฏศิลป์ +นาด +นาดำ +นาถ +นาท +นาที +นาน +น่าน +นานนม +น่านน้ำ +น่านน้ำอาณาเขต +น่านฟ้า +นานสองนาน +นานแสนนาน +นานัครส +นานัตว +นานัปการ +นานา +นานาเนก +นานาประการ +นาเนก +นาบ +นาบข้าว +นาปรัง +นาปี +นาฟางลอย +นาภิ +นาภี +นาม +นาม- +นามกร +นามธรรม +นามไธย +นามบัตร +นามปากกา +นามแฝง +นามสกุล +นามสงเคราะห์ +นามสมญา +นามานุกรม +นามานุศาสตร์ +นามาภิไธย +นาเมือง +นาย +น่าย +นายก +นายกเทศมนตรี +นายกรัฐมนตรี +นายงาน +นายเงิน +นายจ้าง +นายตรวจ +นายท่า +นายท้าย +นายทุน +นายธง +นายประกัน +นายประเพณี +นายโรง +นายว่าขี้ข้าพลอย +นายเวร +นายหน้า +นายอากร +นายอำเภอ +นายิกา +นารา +นารายณ์ +นารายณ์ทรงเครื่อง +นารายณ์ประลองศิลป์ +นารายณ์หัตถ์ +นารี +นารีบูร +นารีผล +นารีสูร +นาเรศ +นาลิวัน +นาลี +นาว +น้าว +นาวา +นาวิก +นาวิก- +นาวิกโยธิน +นาวิน +นาวี +นาเวศ +นาศ +นาสวน +นาสา +นาสิก +นาหว่าน +นาฬิกา +นาฬิกาแดด +นาฬิกาทราย +นาฬิกาน้ำ +นาฬิเก +นาฬี +นำ +น้ำ +น้ำกรด +น้ำกระด้าง +น้ำกระสาย +น้ำกะทิ +น้ำกาม +น้ำเกลือ +น้ำเกิด +น้ำขาว +น้ำข้าว +น้ำขึ้น +น้ำขึ้นให้รีบตัก +น้ำขุ่นไว้ใน น้ำใสไว้นอก +น้ำแข็ง +น้ำแข็งแห้ง +น้ำครำ +น้ำคร่ำ +น้ำคัน +น้ำค้าง +น้ำค้างแข็ง +น้ำคาวปลา +น้ำคำ +น้ำเค็ม +น้ำเคย +น้ำเงิน +น้ำจัณฑ์ +นำจับ +น้ำจิ้ม +น้ำใจ +น้ำใจใคร่ +น้ำชน +น้ำชุบ +น้ำเชี่ยวอย่าขวางเรือ +น้ำเชื้อ +น้ำเชื่อม +น้ำซับ +น้ำซาวข้าว +น้ำซึม +น้ำซึมบ่อทราย +น้ำดอกไม้ +น้ำดอกไม้เทศ +น้ำดอกไม้สด +น้ำดับไฟ +น้ำดิบ +น้ำดี +น้ำตก +น้ำต้อย +น้ำตะกู +น้ำตะโก +น้ำตะไคร้ +น้ำตับ +น้ำตา +น้ำตาเช็ดหัวเข่า +น้ำตาตกใน +น้ำตาเทียน +น้ำตาย +น้ำตาล +น้ำตาลใกล้มด ใครจะอดได้ +น้ำตาลจีน +น้ำเต้า +น้ำใต้ดิน +น้ำทรง +น้ำท่วมทุ่ง ผักบุ้งโหรงเหรง +น้ำท่วมปาก +น้ำท่า +นำทาง +น้ำทูนหัว +นำเที่ยว +น้ำไทย +น้ำนม +น้ำนมแมว +น้ำนมราชสีห์ +น้ำนวล +น้ำนอง +น้ำนอนคลอง +น้ำน้อยแพ้ไฟ +น้ำนิ่งไหลลึก +น้ำบ่อน้อย +น้ำโบย +น้ำประสานทอง +น้ำปลา +น้ำป่า +น้ำผลึก +น้ำผึ้ง +น้ำพระพิพัฒน์สัตยา +น้ำพริก +น้ำพริกเผา +น้ำพักน้ำแรง +นำพา +น้ำพึ่งเรือเสือพึ่งป่า +น้ำพุ +น้ำมนต์ +น้ำมนตร์ +น้ำมัน +น้ำมันก๊าด +น้ำมันเขียว +น้ำมันเครื่อง +น้ำมันจันทน์ +น้ำมันโซลา +น้ำมันดิน +น้ำมันดิบ +น้ำมันดีเซล +น้ำมันตานี +น้ำมันเตา +น้ำมันเบนซิน +น้ำมันพราย +น้ำมันมนตร์ +น้ำมันยาง +น้ำมันระกำ +น้ำมันสน +น้ำมันสลัด +น้ำมันหม่อง +น้ำมันหล่อลื่น +น้ำมาปลากินมด น้ำลดมดกินปลา +น้ำมือ +น้ำมูก +น้ำเมา +น้ำย่อย +น้ำยา +น้ำยาเคมี +น้ำเย็นปลาตาย +นำร่อง +น้ำร้อนปลาเป็น +น้ำรัก +น้ำแร่ +น้ำลง +น้ำลดตอผุด +น้ำละว้า +น้ำลาย +น้ำลายสอ +น้ำลายหก +น้ำลายไหล +น้ำเลี้ยง +น้ำวน +น้ำว้า +น้ำไว +น้ำส้ม +น้ำส้มสายชู +นำสมัย +น้ำสังข์ +น้ำสั่งฟ้า ปลาสั่งฝน +นำสืบ +น้ำสุก +น้ำเสียง +นำแสดง +น้ำหนวก +น้ำหนัก +น้ำหน้า +น้ำหนึ่ง +น้ำหนึ่งใจเดียวกัน +น้ำหมาก +น้ำหอม +น้ำเหลือง +น้ำเหลืองน้ำตาล +น้ำไหลไฟดับ +น้ำอดน้ำทน +น้ำอบ +น้ำอบฝรั่ง +น้ำอ่อน +น้ำอ้อย +น้ำอัดลม +น้ำอาบงัว +นิ +นิกเกิล +นิกขะ +นิกขันต์ +นิกร +นิกรอยด์ +นิกาย +นิคม +นิคมที่ดิน +นิคมสร้างตนเอง +นิคมสหกรณ์ +นิคมอุตสาหกรรม +นิครนถ์ +นิคห- +นิคหกรรม +นิคหะ +นิคหิต +นิคาลัย +นิคาหก +นิคาหก- +นิเคราะห์ +นิโคติน +นิโครธ +นิโครม +นิง +นิ่ง +นิ่งเงียบ +นิ่งเฉย +นิ่งแน่ +นิจ +นิจ- +นิจศีล +นิด +นิดเดียว +นิดหน่อย +นิดหนึ่ง +นิตย- +นิตย์ +นิตยทาน +นิตยภัต +นิตยสาร +นิติ +นิติกร +นิติกรณ์ +นิติกรรม +นิติการ +นิติการณ์ +นิติธรรม +นิตินัย +นิติบัญญัติ +นิติบุคคล +นิติภาวะ +นิติวิทยาศาสตร์ +นิติเวชศาสตร์ +นิติศาสตร์ +นิติสมมติ +นิติสัมพันธ์ +นิติเหตุ +นิทร +นิทรรศการ +นิทรา +นิทรารมณ์ +นิทัศน์ +นิทาฆ +นิทาน +นิทานวจนะ +นิเทศ +นิเทศศาสตร์ +นิธาน +นิธิ +นินทา +นินนะ +นินนาท +นินหุต +นินาท +นิบาต +นิปริยาย +นิปัจการ +นิพจน์ +นิพนธ์ +นิพพาน +นิพพิทา +นิพพิทาญาณ +นิพัทธ- +นิพัทธ์ +นิพัทธกุศล +นิพันธ์ +นิพิท +นิเพท +นิภา +นิ่ม +นิ้ม +นิมนต์ +นิ่มนวล +นิมมาน +นิมมานรดี +นิมิต +นิยต +นิยต- +นิยม +นิยมนิยาย +นิยยาน +นิยยานิก- +นิยัตินิยม +นิยาม +นิยาย +นิยุต +นิร +นิรคุณ +นิรโฆษ +นิรชร +นิรชรา +นิรทุกข์ +นิรเทศ +นิรโทษ +นิรโทษกรรม +นิรนัย +นิรนาม +นิรพัตร +นิรภัย +นิรมล +นิรมาณ +นิรมาณกาย +นิรมาน +นิรมิต +นิรย- +นิรยบาล +นิรัติศัย +นิรันดร +นิรันตร- +นิรันตราย +นิรัพพุท +นิรา +นิราพาธ +นิรามัย +นิรามิษ +นิราลัย +นิราศ +นิราศรพ +นิราศรัย +นิรินธน์ +นิรินธนพินาศ +นิรุกติ +นิรุกติศาสตร์ +นิรุตติ +นิรุตติปฏิสัมภิทา +นิรุทก +นิรุทธ์ +นิโรช +นิโรธ +นิโรธ- +นิโรธสมาบัติ +นิล +นิล- +นิลบัตร +นิลปัทม์ +นิลรัตน์ +นิลุบล +นิโลตบล +นิโลบล +นิ่ว +นิ้ว +นิวคลิอิก +นิวเคลียร์ +นิวเคลียส +นิวตรอน +นิวรณ์ +นิ้วไหนร้ายก็ตัดนิ้วนั้น +นิวัต +นิวัตน์ +นิวาต +นิวาส +นิเวศ +นิเวศ- +นิเวศน์ +นิเวศวิทยา +นิศา +นิศากร +นิศากาล +นิศาคม +นิศาชล +นิศาทิ +นิศานาถ +นิศาบดี +นิศามณี +นิศารัตน์ +นิษกรม +นิษาท +นิสภ- +นิสัช +นิสัชชาการ +นิสัย +นิสัยใจคอ +นิสาท +นิสิต +นิสีทน- +นิสีทนะ +นิสีทนาการ +นิเสธ +นี่ +นี้ +นีติ +นีติธรรม +นีติศาสตร์ +นี่นัน +นี่แน่ะ +นีร- +นีรจร +นีรช +นีรนาท +นี่แหละ +นีออน +นี่เอง +นีโอดิเมียม +นึก +นึกคิด +นึกดู +นึกถึง +นึกเห็น +นึกออก +นึ่ง +นึ่งหม้อเกลือ +นุ +นุง +นุ่ง +นุ่งกระโจมอก +นุ่งเจียมห่มเจียม +นุงถุง +นุงนัง +นุ่งห่ม +นุช +นุด +นุต +นุ่น +นุ่ม +นุ่มนวล +นุ่มนิ่ม +นุ่มเนื้อ +นุ้ย +นูน +นู่น +นู้น +เนกขะ +เนกขัม +เน่ง +เนตบอล +เนตร +เนติ +เนติบัณฑิต +เน้น +เนบิวลา +เนปจูน +เนปทูเนียม +เนมิ +เนมิตก- +เนมิตกนาม +เนมิตกะ +เนย +เนยเทียม +เนยใส +เนรกัณฐี +เนรคุณ +เนรเทศ +เนรนาด +เนรนาถ +เนรมิต +เนระพูสี +เนษาท +เนอ +เน้อ +เนา +เน่า +เน่าไฟ +เนาว- +เนาวนิต +เนาวรัตน์ +เนิน +เนิ่น +เนิ่นๆ +เนิ่นนาน +เนิบ +เนิบๆ +เนิบนาบ +เนียง +เนียน +เนียม +เนียร +เนียรทุกข์ +เนียรเทศ +เนียรนาท +เนื้อ +เนื้อกษัตริย์ +เนื้อความ +เนื้อคู่ +เนื้อเค็ม +เนือง +เนืองๆ +เนื่อง +เนื่องจาก +เนื่องด้วย +เนื่องแต่ +เนืองนอง +เนืองนิตย์ +เนืองแน่น +เนื้องอก +เนื้อตัว +เนื้อตาย +เนื้อเต่ายำเต่า +เนื้อถ้อยกระทงความ +เนื้อทราย +เนื้อที่ +เนื้อแท้ +เนื้อเปื่อย +เนื้อเพลง +เนื้อไม้ +เนือย +เนือยๆ +เนื้อเยื่อ +เนื้อเยื่อกล้ามเนื้อ +เนื้อเยื่อบุผิว +เนื้อเยื่อประสาท +เนื้อเยื่อยึดต่อ +เนื้อร้อง +เนื้อร้าย +เนื้อเรื่อง +เนื้อสมัน +เนื้อหา +เนื้ออ่อน +แน่ +แน่ง +แน่งน้อย +แน่ใจ +แน่ชัด +แน่แท้ +แน่น +แน่นขนัด +แน่นท้อง +แน่นนันต์ +แน่นแฟ้น +แน่นหนา +แน่นหน้าอก +แน่นอน +แน่นิ่ง +แน่แน่ว +แนบ +แนบเนียน +แนบแน่น +แนม +แนว +แน่ว +แนวทาง +แนวที่ห้า +แน่วแน่ +แนวโน้ม +แนวป่า +แนวรบ +แนวร่วม +แนวเรือ +แนวหน้า +แนวหลัง +แนะ +แน่ะ +แนะนัด +แนะนำ +แนะแนว +แนะแหน +โน +โน้ต +โน้ตเพลง +โนน +โน่น +โน้น +โนเน +โนเบเลียม +โน้ม +โน้มน้าว +โนมพรรณ +โนรา +โนรี +ใน +ในกรม +ในไส้ +ในหลวง +ไน +ไนต์คลับ +ไนโตรเจน +ไนลอน +ไนโอเบียม +บ +บ่ +บก +บกพร่อง +บง +บ่ง +บงก- +บงก์ +บงกช +บงกชกร +บงการ +บ๊งเบ๊ง +บงสุ- +บงสุ์ +บงสุกุล +บงสุกูลิก +บงอับบงรา +บ่งอับบ่งรา +บฏ +บด +บดขยี้ +บดบัง +บดเอื้อง +บดินทร์ +บดี +บดีธรรม +บดีพรต +บดีวรดา +บดีศร +บถ +บท +บท- +บทกลอน +บทกวีนิพนธ์ +บทกำหนดโทษ +บทความ +บทคัดย่อ +บทจร +บทเจรจา +บทเฉพาะกาล +บทดอกสร้อย +บทนำ +บทบงกช +บทบงสุ์ +บทบรรณาธิการ +บทบัญญัติ +บทบาท +บทบาทมาก +บทบูรณ์ +บทประพันธ์ +บทพากย์ +บทเพลง +บทภาชน์ +บทภาชนีย์ +บทมาลย์ +บทร้อง +บทรัช +บทเรศ +บทเรียน +บทวเรศ +บทวลัญช์ +บทวาร +บทศรี +บทสนทนา +บทสังขยา +บทามพุช +บโทน +บน +บ่น +บนข้าวผี ตีข้าวพระ +บ่นถึง +บนบาน +บนบานศาลกล่าว +บพิตร +บพิตรพระราชสมภาร +บพิธ +บ่ม +บ่มผิว +บ่มมัน +บ่มหนอง +บมิ +บร- +บรทาร +บรทารกรรม +บรม +บรม- +บรมธาตุ +บรมบพิตร +บรมวงศานุวงศ์ +บรมอัฐิ +บรมัตถ์ +บรรกวด +บรรจง +บรรจถรณ์ +บรรจบ +บรรจวบ +บรรจุ +บรรเจิด +บรรณ +บรรณ- +บรรณกุฎี +บรรณพิภพ +บรรณโลก +บรรณศาลา +บรรณสาร +บรรณาการ +บรรณาคม +บรรณาธิกร +บรรณาธิการ +บรรณานุกรม +บรรณารักษ์ +บรรณารักษศาสตร์ +บรรดา +บรรดาก +บรรดามี +บรรดาศักดิ์ +บรรตานึก +บรรถร +บรรทม +บรรทัด +บรรทัดฐาน +บรรทับ +บรรทาน +บรรทุก +บรรเทา +บรรเทือง +บรรพ +บรรพ- +บรรพ์ +บรรพชา +บรรพชิต +บรรพต +บรรพต- +บรรพตกีลา +บรรพตชาล +บรรพตธาตุ +บรรพตมาลา +บรรพตราช +บรรพตวาสี +บรรพตศิขร +บรรพบุรุษ +บรรพภาค +บรรพเภท +บรรพมูล +บรรพสตรี +บรรยง +บรรยงก์ +บรรยเวกษก์ +บรรยากาศ +บรรยาย +บรรลัย +บรรลัยกัลป์ +บรรลัยจักร +บรรลาย +บรรลุ +บรรลุนิติภาวะ +บรรเลง +บรรโลม +บรรษัท +บรรสบ +บรรสพ +บรรสม +บรรสาน +บรรสาร +บรรหาน +บรรหาร +บรอนซ์ +บรัด +บรั่นดี +บรัศว์ +บรากรม +บราง +บราทุกรา +บราลี +บริกรม +บริกรรม +บริกัป +บริการ +บริขา +บริขาร +บริขารโจล +บริคณห์ +บริคณห์สนธิ +บริจาค +บริจารก +บริจาริกา +บริเฉท +บริเฉท- +บริเฉทกาล +บริชน +บริณายก +บริณายกรัตน์ +บริดจ์ +บริบท +บริบวรณ์ +บริบาล +บริบูรณ์ +บริพนธ์ +บริพัตร +บริพันธ์ +บริพาชก +บริพาชิกา +บริพาชี +บริพาร +บริภัณฑ์ +บริภาษ +บริโภค +บริโภคเจดีย์ +บริมาส +บริยาย +บริรม +บริรักษ์ +บริราช +บริวรรต +บริวาร +บริวาส +บริเวณ +บริษการ +บริษัท +บริษัทเครดิตฟองซิเอร์ +บริษัทจำกัด +บริษัทบริวาร +บริษัทมหาชนจำกัด +บริสชน +บริสุทธิ์ +บริสุทธิ์ใจ +บริหาร +บริหาส +บแรง +บแรงภักษ์ +บฤงคพ +บล็อก +บวก +บวง +บ่วง +บ่วงบาศ +บวงสรวง +บวช +บวชชี +บวน +บ้วน +บ้วนปาก +บ้วนพระโอษฐ์ +บวบ +บวบขม +บวม +บวมน้ำ +บ๊วย +บวร +บวร- +บวรโตฎก +บหลิ่ม +บอ +บ่อ +บอก +บอกกล่าว +บอกแขก +บอกคำบอก +บอกบท +บอกบัญชี +บอกบุญ +บอกใบ้ +บอกปัด +บอกเปิด +บอกยี่ห้อ +บอกเล่าเก้าสิบ +บอกวัตร +บอกศาลา +บอกหนทาง +บอกหนังสือสังฆราช +บ่อเกิด +บอง +บ่อง +บ้อง +บ๊อง +บ๊องๆ +บ้องกัญชา +บ้องตะลา +บ้องตัน +บ้องตื้น +บ้องแบ๊ว +บ้องไฟ +บ้องยาแดง +บองหลา +บ้องหู +บอด +บอดสี +บอน +บ่อน +บ่อนแตก +บ่อนทำลาย +บอนลายกระหนก +บ่อน้ำร้อน +บอบ +บอบช้ำ +บอบบาง +บอบแบบ +บ้อม +บ๋อม +บ่อย +บ่อยๆ +บอระเพ็ด +บอระมาน +บอล +บอลลูน +บ้อหุ้น +บเอ +บ๊ะ +บะหมี่ +บัก +บักโกรก +บักอาน +บัคเตรี +บัง +บั้ง +บังกะโล +บังกัด +บังเกิด +บังโกรยตัวผู้ +บังโกรยตัวเมีย +บังโกลน +บังคน +บังคนเบา +บังคนหนัก +บังคม +บังคล +บังควร +บังความ +บังคับ +บังคับการ +บังคับครุ +บังคับใจ +บังคับโท +บังคับบัญชา +บังคับลหุ +บังคับสัมผัส +บังคับเอก +บังคัล +บังโคลน +บังเงา +บังตะวัน +บังตา +บังแทรก +บังใบ +บังเพลิง +บังไพร +บังฟัน +บั้งไฟ +บังมืด +บังวาย +บังเวียน +บังสาด +บังสุกุล +บังสุกูลิก +บังสูรย์ +บังหน้า +บังหวนควัน +บังเหตุ +บังเหิน +บังเหียน +บังอร +บังอวจ +บังอาจ +บังอิง +บังอูร +บังเอิญ +บัญจก +บัญจรงค์ +บัญชร +บัญชา +บัญชาการ +บัญชี +บัญชีกระแสรายวัน +บัญชีเดินสะพัด +บัญญัติ +บัญญัติไตรยางศ์ +บัญหา +บัฏ +บัฐยาพฤต +บัณฑร +บัณฑร- +บัณฑรนาค +บัณฑิต +บัณฑิตย์ +บัณฑุ +บัณฑุกัมพล +บัณฑุกัมพลศิลาอาสน์ +บัณฑุนาค +บัณฑุโรค +บัณฑูร +บัณเฑาะก์ +บัณเฑาะว์ +บัณณาส +บัณรส +บัณรสี +บัด +บัดกรี +บัดซบ +บัดดล +บัดเดี๋ยว +บัดนั้น +บัดนี้ +บัดบง +บัดแบ่ง +บัดแมล่ง +บัดสี +บัดสีบัดเถลิง +บัตร +บัตรเทวดา +บัตรธนาคาร +บัตรพลี +บัตรสนเท่ห์ +บัตรหมาย +บัทม์ +บัน +บั่น +บั้น +บันกวด +บันจวบ +บันจอย +บันดล +บันดาล +บันเดิน +บันโดย +บันได +บันไดแก้ว +บันไดลิง +บันไดเลื่อน +บันแถลง +บั่นทอน +บั้นท้าย +บันทึก +บันทึง +บันเทิง +บันเทิงคดี +บันเบา +บั้นปลาย +บั้นพระองค์ +บันยะบันยัง +บันลือ +บั้นหลวง +บันเหิน +บั้นเอว +บัปผาสะ +บัพ +บัพชา +บัพชิต +บัพพาช +บัพพาชน์ +บัพพาชนียกรรม +บัล +บัลลพ +บัลลังก์ +บัลลูน +บัลวะ +บัว +บัวกลุ่ม +บัวขาบ +บัวคอเสื้อ +บัวตะกั่ว +บัวตูม +บัวถลา +บัวนาง +บัวบก +บัวบังใบ +บัวบาท +บัวผุด +บัวไม่ช้ำ น้ำไม่ขุ่น +บัวโรย +บัวลอย +บัวสวรรค์ +บัวสายติ่ง +บัวสายทิ้ง +บัวฮาดำ +บา +บ่า +บ้า +บ้าๆ +บาก +บากท่า +บากบั่น +บากหน้า +บาง +บ่าง +บ้าง +บางขุนนนท์ +บ่างช่างยุ +บางตา +บางที +บางเบา +บางสุ +บาจก +บาจรีย์ +บาจิกา +บ้าจี้ +บาซิลลัส +บาด +บาดคอ +บาดเจ็บ +บาดใจ +บาดตา +บาดทะจิต +บาดทะพิษ +บาดทะยัก +บาดแผล +บาดเสี้ยนบาดหนาม +บาดหมาง +บาดหมาย +บาดหู +บาดไหม +บาดาล +บ้าดีเดือด +บาแดง +บาต +บาตร +บาตรแก้ว +บาตรใหญ่ +บาท +บาท- +บาทนิเกต +บาทบ +บาทบงกช +บาทบงสุ์ +บาทบริจาริกา +บาทบูรณ์ +บาทภัฏ +บาทภาค +บาทมุทรา +บาทมูล +บาทมูลิกากร +บาทยุคล +บาทรช +บาทรัช +บาทสกุณี +บาทหลวง +บาทาธึก +บาทุกา +บาธรรม +บาน +บาน- +บ้าน +บานกบ +บานเกล็ด +บ้านเกิดเมืองนอน +บ้านเคยอยู่ อู่เคยนอน +บ้านจัดสรร +บ้านช่อง +บานชื่น +บานเช้า +บานตะเกียง +บานตะโก้ +บานตะไท +บ้านแตกสาแหรกขาด +บานทะโรค +บ้านนอก +บ้านนอกขอกนา +บานบาตร +บานบุรี +บานบุรีม่วง +บานเบอะ +บานเบิก +บานเบียง +บานแบะ +บานปลาย +บานแผนก +บานแผละ +บ้านพัก +บานพับ +บานแพนก +บานโภชน์ +บานมงคล +บ้านเมือง +บ้านเมืองมีขื่อมีแป +บานไม่รู้โรย +บานเย็น +บ้านรับรอง +บ้านเรือน +บ้าน้ำลาย +บ่านี่ +บานียะ +บานีโยทก +บ้าบ่น +บ้าบ๋า +บ้าบิ่น +บาบี +บาป +บาป- +บาปกรรม +บาปเคราะห์ +บาปมิตร +บาปหนา +บาพก +บาย +บ่าย +บ้าย +บ่ายควาย +บ่ายเบี่ยง +บายศรี +บายศรีปากชาม +บายสุหรี +บ่ายหน้า +บาร์ +บารนี +บารมี +บาร์เรล +บาร์เลย์ +บารอมิเตอร์ +บ้าระบุ่น +บ้าระห่ำ +บ้าร่าท่า +บาเรียน +บาเรียม +บาล +บ้าลำโพง +บาลี +บ้าเลือด +บ่าว +บ่าวขุน +บ่าวไพร่ +บาศ +บาศก์ +บาสเกตบอล +บ้าสมบัติ +บ้าหมู +บาหลี +บ้าหว่า +บ้าหอบฟาง +บ้าห้าร้อยจำพวก +บ๋ำ +บำเทิง +บำนาญ +บำบวง +บำบัด +บำโบ +บำโบย +บำโบล +บำเพ็ญ +บำราบ +บำราศ +บำรุง +บำรุงขวัญ +บำรู +บำเรอ +บำเรอเชอภักดิ์ +บำหยัด +บำเหน็จ +บิ +บิกู +บิกูปะระมาหนา +บิกูปะระหมั่นหนา +บิฐ +บิณฑ- +บิณฑบาต +บิด +บิดขวา +บิดขี้เกียจ +บิดจะกูด +บิดซ้าย +บิดตะกูด +บิดเบี้ยว +บิดเบือน +บิดพลิ้ว +บิดร +บิดไส้ +บิดหล่า +บิดหัวลูก +บิดา +บิตุ +บิตุจฉา +บิตุรงค์ +บิตุเรศ +บิตุล +บิตุลา +บิตุลานี +บิน +บิ่น +บินยา +บิลเลียด +บิวเรตต์ +บิศาจ +บิสมัท +บี้ +บีกู +บีฑา +บีตา +บีบ +บีบขนมจีน +บีบขมับ +บีบคั้น +บีบน้ำตา +บีบบังคับ +บีบรัด +บี้แบน +บีเยศ +บึก +บึกบึน +บึง +บึ่ง +บึ้ง +บึ้งตึง +บึงบาง +บึ้งบูด +บุ +บุก +บุกบัน +บุกบั่น +บุกเบิก +บุกป่าฝ่าดง +บุกรุก +บุคคล +บุคคล- +บุคคลธรรมดา +บุคคลนิติสมมติ +บุคคลผู้ไร้ความสามารถ +บุคคลสิทธิ +บุคลากร +บุคลาธิษฐาน +บุคลิก +บุคลิก- +บุคลิกทาน +บุคลิกภาพ +บุคลิกลักษณะ +บุง +บุ่ง +บุ้ง +บุ้งขัน +บุ้งจีน +บุ้งทะเล +บุ้งฝรั่ง +บุ้งร้วม +บุญ +บุญ- +บุญเขต +บุญญานุภาพ +บุญญาภินิหาร +บุญญาภิสังขาร +บุญทาย +บุญทำกรรมแต่ง +บุญธรรม +บุญนิธิ +บุญมาวาสนาส่ง +บุญราศี +บุญฤทธิ์ +บุญหนักศักดิ์ใหญ่ +บุณฑริก +บุณมี +บุณย์ +บุตร +บุตร- +บุตรธรรม +บุตรบุญธรรม +บุตรา +บุตรี +บุตรีตระสุม +บุถุชน +บุทคล +บุนนะบุนนัง +บุนนาค +บุบ +บุบบิบ +บุบสลาย +บุปผ- +บุปผชาติ +บุปผวิกัติ +บุพ- +บุพกรรม +บุพการี +บุพกิจ +บุพชาติ +บุพทักษิณ +บุพนิมิต +บุพบท +บุพเปตพลี +บุพพ- +บุพพัณชาติ +บุพพัณหสมัย +บุพพาจารย์ +บุพพาษาฒ +บุพพาสาฬหะ +บุพเพนิวาสานุสติญาณ +บุพเพสันนิวาส +บุพโพ +บุพภาค +บุพวิเทห์ +บุ๋ม +บุ่มบ่าม +บุ้ย +บุ้ยใบ้ +บุ้ยปาก +บุรณะ +บุรพ- +บุรพทิศ +บุรพบท +บุรพผลคุนี +บุรพภัทรบท +บุรพอาษาฒ +บุรพาจารย์ +บุระ +บุรัตถิมทิศ +บุราณ +บุราณทุติยิกา +บุรินทร์ +บุริมทิศ +บุริมพรรษา +บุริมสิทธิ +บุรี +บุรุษ +บุรุษ- +บุรุษโทษ +บุรุษธรรม +บุโรทั่ง +บุษกร +บุษบ- +บุษบก +บุษบง +บุษบราค +บุษบวรรษ +บุษบัน +บุษบา +บุษบากร +บุษบาคม +บุษบาบัณ +บุษบามินตรา +บุษบารักร้อย +บุษป- +บุษปราค +บุษปะ +บุษย- +บุษย์ +บุษย์น้ำทอง +บุษยมาส +บุษยสนาน +บุษยะ +บุษยาภิเษก +บุษราคัม +บุหงง +บุหงัน +บุหงา +บุหงาประหงัน +บุหงามลาซอ +บุหงารำไป +บุหงาลำเจียก +บุหรง +บุหรี่ +บุหรี่พระราม +บุหลัน +บู่ +บู้ +บูชนีย- +บูชนียสถาน +บูชา +บูชากัณฑ์เทศน์ +บูชายัญ +บูชิต +บูด +บูดบึ้ง +บูดเบี้ยว +บู่ทะเล +บู้บี้ +บูร +บูรณ- +บูรณ์ +บูรณภาพ +บูรณมี +บูรณะ +บูรณาการรวมหน่วย +บูรพ +บูรพา +บูรพาจารย์ +บูรพาษาฒ +บูรี +เบ้ +เบ่ง +เบ๊จี๋ +เบญกานี +เบญจ +เบญจ- +เบญจก +เบญจกัลยาณี +เบญจกามคุณ +เบญจกูล +เบญจขันธ์ +เบญจคัพย์ +เบญจคีรีนคร +เบญจโครส +เบญจดุริยางค์ +เบญจธรรม +เบญจบรรพต +เบญจพรรณ +เบญจพล +เบญจเพส +เบญจภูต +เบญจม- +เบญจมสุรทิน +เบญจมาศ +เบญจมาศสวน +เบญจมาศหนู +เบญจรงค์ +เบญจโลหกะ +เบญจวรรค +เบญจวรรณ +เบญจวรรณห้าสี +เบญจศก +เบญจศีล +เบญจา +เบญจางค- +เบญจางค์ +เบญจางคประดิษฐ์ +เบญญา +เบญพาด +เบ็ด +เบ็ดเตล็ด +เบ็ดเสร็จ +เบน +เบนซิน +เบรก +เบริลเลียม +เบรียน +เบส +เบ้อ +เบอร์ +เบอร์คีเลียม +เบ้อเร่อ +เบ้อเร่อเท่อ +เบ้อเริ่ม +เบ้อเริ่มเทิ่ม +เบอะ +เบอะบะ +เบะ +เบา +เบ้า +เบ้าขลุบ +เบาความ +เบาใจ +เบาตัว +เบ้าตา +เบาเต็ง +เบาเนื้อเบาตัว +เบาบาง +เบาปัญญา +เบามือ +เบาไม้ +เบาไม้เบามือ +เบาราณ +เบาแรง +เบาสมอง +เบ้าหลุด +เบาหวาน +เบาเหวง +เบาโหวง +เบาะ +เบาะๆ +เบาะลม +เบาะแส +เบิก +เบิกความ +เบิกทาง +เบิกทูต +เบิกบาน +เบิกพยาน +เบิกพระเนตร +เบิกพระโอษฐ์ +เบิกไพร +เบิกไม้ +เบิกเรือ +เบิกโรง +เบิกโลง +เบิกแว่นเวียนเทียน +เบิกอรุณ +เบิ่ง +เบี้ย +เบียก +เบียกบ้าย +เบี้ยกันดาร +เบี้ยแก้ +เบี่ยง +เบี่ยงบ่าย +เบียด +เบียดกรอ +เบียดบัง +เบียดเบียน +เบียดแว้ง +เบียดเสียด +เบี้ยต่อไส้ +เบี้ยทำขวัญ +เบียน +เบียนธาตุ +เบี้ยน้อยหอยน้อย +เบี้ยบน +เบี้ยบ้ายรายทาง +เบี้ยบำนาญ +เบี้ยโบก +เบี้ยประกันภัย +เบี้ยประชุม +เบี้ยปรับ +เบียร์ +เบี้ยล่าง +เบี้ยเลี้ยง +เบี้ยว +เบี้ยวๆ บูดๆ +เบี้ยหวัด +เบี้ยหัวแตก +เบี้ยหัวแหลก +เบือ +เบื่อ +เบื้อ +เบื้อง +เบื้องญวน +เบื้องต้น +เบื้องบน +เบื้องว่า +เบื้องหน้า +เบื้องหลัง +เบือน +แบ +แบ้ +แบก +แบกหน้า +แบกะดิน +แบคทีเรีย +แบ่ง +แบงก์ +แบ่งค้าง +แบ่งเบา +แบ่งปัน +แบ่งภาค +แบ่งแยก +แบ่งรับแบ่งสู้ +แบ่งสันปันส่วน +แบดมินตัน +แบตเตอรี่ +แบไต๋ +แบน +แบนโจ +แบบ +แบ็บ +แบบข้อคำถาม +แบบฉบับ +แบบบาง +แบบแผน +แบบฝึกหัด +แบบพิธี +แบบพิมพ์ +แบบสอบถาม +แบบอย่าง +แบเบาะ +แบมือ +แบรก +แบเรียม +แบหลา +แบะ +แบะแฉะ +แบะท่า +แบะปาก +แบะอก +โบ +โบ้ +โบ๋ +โบก +โบกขร- +โบกขรณี +โบกขรพรรษ +โบกมือ +โบชุก +โบดก +โบแดง +โบต +โบนัส +โบ๊เบ๊ +โบย +โบยบิน +โบรมีน +โบรอน +โบราณ +โบราณ- +โบราณคดี +โบราณวัตถุ +โบราณสถาน +โบสถ์ +ใบ +ใบ้ +ใบก้นปิด +ใบกองเกิน +ใบกองหนุน +ใบขนสินค้า +ใบขนุน +ใบขับขี่ +ใบแข็ง +ใบ้คลั่ง +ใบเงิน +ใบจอง +ใบฎีกา +ใบดาล +ใบดำ +ใบแดง +ใบแดงแจ้งโทษ +ใบตราส่ง +ใบตอง +ใบตาล +ใบทอง +ใบท้องแดง +ใบแทรก +ใบนาก +ใบบอก +ใบบุญ +ใบเบิก +ใบเบิกทาง +ใบเบิกร่อง +ใบปก +ใบปรือ +ใบปลิว +ใบพัด +ใบพัทธสีมา +ใบโพ +ใบเมี่ยง +ใบไม้ +ใบระกา +ใบรับ +ใบรับรอง +ใบลา +ใบเลี้ยง +ใบสอ +ใบสั่ง +ใบสั่งจ่าย +ใบสัจ +ใบสำคัญ +ใบสำคัญคู่จ่าย +ใบสีมา +ใบสุทธิ +ใบเสมา +ใบเสร็จ +ใบหน้า +ใบหุ้น +ใบหูช้าง +ใบเหยียบย่ำ +ใบอนุญาตขับขี่ +ไบ่ๆ +ป +ปก +ปกกระพอง +ปกเกศ +ปกครอง +ปกคลุม +ปกติ +ปกป้อง +ปกปักรักษา +ปกปิด +ปกรณ์ +ปกรณัม +ปการ +ปกิณกะ +ปกีรณัม +ปโกฏิ +ปง +ป่ง +ปงช้าง +ปงปัง +ปฎล +ปฏัก +ปฏิ- +ปฏิกรณ์ +ปฏิกรรมสงคราม +ปฏิการ- +ปฏิการะ +ปฏิกิริยา +ปฏิกูล +ปฏิคคหิต +ปฏิคม +ปฏิคหิต- +ปฏิคาหก +ปฏิฆะ +ปฏิชีวนะ +ปฏิญญา +ปฏิญญาสากลว่าด้วยสิทธิมนุษยชน +ปฏิญาณ +ปฏิทิน +ปฏิบถ +ปฏิบัติ +ปฏิบัติการ +ปฏิบัติธรรม +ปฏิปทา +ปฏิปักษ์ +ปฏิปัน +ปฏิปุจฉาพยากรณ์ +ปฏิปุจฉาวาที +ปฏิพัทธ์ +ปฏิพากย์ +ปฏิภาค +ปฏิภาค- +ปฏิภาคนิมิต +ปฏิภาณ +ปฏิภาณ- +ปฏิภาณกวี +ปฏิภาณปฏิสัมภิทา +ปฏิภาณโวหาร +ปฏิมา +ปฏิมากร +ปฏิยุทธ์ +ปฏิรพ +ปฏิรูป +ปฏิรูป- +ปฏิโลม +ปฏิวัติ +ปฏิวาต +ปฏิวาท +ปฏิเวธ +ปฏิสนธิ +ปฏิสวะ +ปฏิสังขรณ์ +ปฏิสันถาร +ปฏิสัมภิทา +ปฏิเสธ +ปฏิเสธข่าว +ปฐพี +ปฐพีวิทยา +ปฐม +ปฐม- +ปฐมกรรม +ปฐมฌาน +ปฐมดุสิต +ปฐมทัศน์ +ปฐมเทศนา +ปฐมนิเทศ +ปฐมบุรุษ +ปฐมพยาบาล +ปฐมโพธิกาล +ปฐมยาม +ปฐมฤกษ์ +ปฐมวัย +ปฐมสมโพธิ +ปฐมสุรทิน +ปฐมาษาฒ +ปฐวี +ปณต +ปณาม +ปณิธาน +ปณิธิ +ปณีต +ปด +ปดโป้ +ปดิวรัดา +ปติ +ปติยัต +ปติวัตร +ปถพี +ปถมัง +ปถวี +ปทัฏฐาน +ปทัสถาน +ปทานุกรม +ปทีป +ปทุม +ปน +ป่น +ป่นปี้ +ปนเป +ปนัดดา +ปบ +ปปัญจ- +ปปัญจธรรม +ปปัญจะ +ปม +ปมเขื่อง +ปมจิต +ปมด้อย +ปมเด่น +ปมประสาท +ปมเปา +ปโย- +ปโยชนม์ +ปโยธร +ปโยธรา +ปโยนิธิ +ปโยราศิ +ปร- +ปรก +ปรกติ +ปรง +ปรด +ปรตยักษ์ +ปรตยาค +ปรตเยก +ปรน +ปรนนิบัติ +ปรนปรือ +ปรนเปรอ +ปรนัย +ปรบ +ปรบไก่ +ปรบมือให้ +ปรปักษ์ +ปรม- +ปรมัตถ์ +ปรมาจารย์ +ปรมาณู +ปรมาตมัน +ปรมาภิไธย +ปรมาภิเษก +ปรมินทร์ +ปรเมนทร์ +ปรเมศวร์ +ปรเมษฐ์ +ปรเมหะ +ปรโลก +ปรวด +ปรวนแปร +ปรวาที +ปรศุ +ปรสิต +ปรสิต- +ปรสิตวิทยา +ปร๋อ +ปรองดอง +ปรอด +ปรอดๆ +ปรอท +ปรอย +ปรอยๆ +ประ- +ประกบ +ประกบตัว +ประกฤต +ประกฤติ +ประกล +ประกวด +ประกวดประขัน +ประกวดราคา +ประกอบ +ประกอบด้วย +ประกอบอาหาร +ประกัน +ประกันชีวิต +ประกันเชิงลา +ประกันตัวผู้ต้องหาหรือจำเลย +ประกันภัย +ประกันภัยค้ำจุน +ประกันวินาศภัย +ประกับ +ประกาย +ประกายพรึก +ประการ +ประกาศ +ประกาศก +ประกาศนียบัตร +ประกาศิต +ประกำ +ประกิด +ประกิต +ประกีรณก +ประเกียรณก +ประแกก +ประคด +ประคนธรรพ +ประคนธรรพ์ +ประคบ +ประคบประหงม +ประคอง +ประคับประคอง +ประคัลภ์ +ประคารม +ประคำ +ประคำไก่ +ประคำดีควาย +ประคำร้อย +ประคิ่น +ประคิ่นวินชา +ประคุณ +ประเคน +ประเคราะห์ +ประโคน +ประโคนธรรพ +ประโคนธรรพ์ +ประโคม +ประโคมข่าว +ประจง +ประจญ +ประจบ +ประจบประแจง +ประจวบ +ประจ๋อประแจ๋ +ประจักษ- +ประจักษ์ +ประจักษนิยม +ประจักษ์พยาน +ประจัญ +ประจัญบาน +ประจัน +ประจันหน้า +ประจาก +ประจาค +ประจาน +ประจำ +ประจำการ +ประจำครั่ง +ประจำฉัตร +ประจำซอง +ประจำเดือน +ประจำตรา +ประจำเมือง +ประจำยาม +ประจิม +ประจิ้มประจ่อง +ประจิ้มประเจ๋อ +ประจุ +ประจุขาด +ประจุคมน์ +ประจุบัน +ประจุไฟฟ้า +ประจุโลหิต +ประเจก +ประเจิด +ประเจิดประเจ้อ +ประเจียด +ประแจ +ประแจจีน +ประชด +ประชดประชัน +ประชน +ประชวม +ประชวร +ประชัน +ประชา +ประชากร +ประชากรศาสตร์ +ประชาคม +ประชาชน +ประชาชาติ +ประชาทัณฑ์ +ประชาธิปไตย +ประชานาถ +ประชาบดี +ประชาบาล +ประชาภิบาล +ประชามติ +ประชาราษฎร์ +ประชาสงเคราะห์ +ประชาสัมพันธ์ +ประชิด +ประชี +ประชุม +ประชุมเพลิง +ประชุมสุดยอด +ประเชิญ +ประณต +ประณม +ประณาม +ประณิธาน +ประณิธิ +ประณีต +ประณุท +ประดง +ประดงแดง +ประดน +ประดนธรรม +ประดวน +ประดอน +ประดอย +ประดักๆ +ประดักประเดิด +ประดัง +ประดับ +ประดับประดา +ประดา +ประดาก +ประดาตาย +ประดาทัพ +ประดาน้ำ +ประดาป +ประดาพล +ประดามี +ประดาษ +ประดาเสีย +ประดิ- +ประดิชญา +ประดิดประดอย +ประดิทิน +ประดิรพ +ประดิษฐ- +ประดิษฐ์ +ประดิษฐกรรม +ประดิษฐาน +ประดุง +ประดุจ +ประดู่ +ประดู่แขก +ประดู่ชิงชัน +ประดู่แดง +ประดู่ลาย +ประเด +ประเด็น +ประเดยก +ประเดิม +ประเดียง +ประเดี๋ยว +ประเดี๋ยวก่อน +ประเดี๋ยวเดียว +ประเดี๋ยวนี้ +ประเดี๋ยวประด๋าว +ประแดง +ประแดะ +ประโดย +ประตง +ประตยาค +ประตัก +ประตาปะ +ประติ- +ประติชญา +ประติญาณ +ประติทิน +ประติมากรรม +ประติรพ +ประติศรัพ +ประตู +ประตูชัย +ประตูน้ำ +ประตูป่า +ประตูผี +ประตูฟุตบอล +ประตูระบาย +ประตูรับน้ำ +ประตูลม +ประถม +ประถมจินดา +ประทม +ประทยด +ประท้วง +ประทวน +ประทวนสินค้า +ประทักษ์ +ประทักษิณ +ประทัง +ประทัด +ประทัดจีน +ประทัดทอง +ประทัดฝรั่ง +ประทัดลม +ประทัดเล็ก +ประทัดใหญ่ +ประทับ +ประทับใจ +ประทับตรา +ประทับฟ้อง +ประทับแรม +ประท่า +ประทากล้อง +ประทาน +ประทานบัตร +ประทาย +ประทาศี +ประทิน +ประทิ่น +ประทีป +ประทุก +ประทุฐ +ประทุฐจิต +ประทุน +ประทุมราค +ประทุษ +ประทุษฏ์ +ประทุษฏจิต +ประทุษฐ์ +ประทุษฐจิต +ประทุษร้าย +ประเทศ +ประเทศกันชน +ประเทศชาติ +ประเทศราช +ประเทา +ประเท้า +ประเทียด +ประเทียบ +ประเทือง +ประธาน +ประธานาธิบดี +ประนม +ประนมมือ +ประนอ +ประนอม +ประนอมหนี้ +ประนัง +ประนัปดา +ประนี้ +ประนีประนอม +ประนีประนอมยอมความ +ประบัด +ประบาต +ประปราน +ประปราย +ประปา +ประเปรี้ยง +ประเปรียว +ประแป้ง +ประแปร้น +ประพจน์ +ประพนธ์ +ประพรม +ประพฤติ +ประพฤทธิ์ +ประพัด +ประพัทธ์ +ประพันธ์ +ประพาต +ประพาส +ประพาสต้น +ประพาสมหรณพ +ประพาฬ +ประพิณ +ประพิมพ์ประพาย +ประพุทธ์ +ประเพณี +ประเพณีนิยม +ประเพ้อ +ประแพร่งประแพรว +ประโพธ +ประไพ +ประไพร +ประภพ +ประภัสสร +ประภา +ประภากร +ประภาคาร +ประภาพ +ประภามณฑล +ประภาษ +ประภาส +ประเภท +ประมง +ประมวญ +ประมวล +ประมวลกฎหมาย +ประมวลการสอน +ประมวลรัษฎากร +ประมัตตะ +ประมาณ +ประมาณการ +ประมาณตน +ประมาณตัว +ประมาท +ประมาทหน้า +ประมุข +ประมุท +ประมูล +ประเมิน +ประเมินภาษี +ประโมง +ประโมทย์ +ประยงค์ +ประยุกต์ +ประยุทธ์ +ประยุร +ประยูร +ประโยค +ประโยคประธาน +ประโยคสัมปทา +ประโยชน์ +ประโรหิต +ประลมพ์ +ประลอง +ประลองยุทธ์ +ประลัย +ประลัยกัลป์ +ประลัยวาต +ประลาต +ประลาย +ประลึง +ประลุ +ประลุง +ประเล่ห์ +ประเล้าประโลม +ประโลประเล +ประโลม +ประโลมโลก +ประวรรต +ประวรรตน์ +ประวัติ +ประวัติ- +ประวัติการ +ประวัติการณ์ +ประวัติกาล +ประวัติศาสตร์ +ประวาต +ประวาล +ประวาลปัทม์ +ประวาลผล +ประวาลวรรณ +ประวาส +ประวิง +ประวิช +ประวิตร +ประวิสรรชนีย์ +ประวีณ +ประเวณี +ประเวประวิง +ประเวศ +ประเวศน์ +ประศม +ประศาสน์ +ประศุ +ประสก +ประสงค์ +ประสงค์ร้าย +ประสบ +ประสบการณ์ +ประสบการณ์นิยม +ประสพ +ประสม +ประสมประสาน +ประสมประเส +ประสมพันธุ์ +ประสมโรง +ประสะ +ประสัก +ประสันนาการ +ประสัยห- +ประสัยห์ +ประสัยหาการ +ประสัยหาวหาร +ประสา +ประสาท +ประสาท- +ประสาทการ +ประสาทรูป +ประสาทหลอน +ประสาธน์ +ประสาน +ประสานงา +ประสานเนรมิต +ประสานเสียง +ประสาร +ประสิทธิ- +ประสิทธิ์ +ประสิทธิ์ประสาท +ประสิทธิผล +ประสิทธิภาพ +ประสิทธิเม +ประสีประสา +ประสูต +ประสูติ +ประเสบันอากง +ประเสริฐ +ประแสบัน +ประหนึ่ง +ประหม่า +ประหยัด +ประหรณ์ +ประหลาด +ประหล่ำ +ประหลิ่ม +ประหวัด +ประหวั่น +ประหว่า +ประหัต +ประหัตประหาร +ประหาณ +ประหาร +ประหารชีวิต +ประหาส +ประเหล +ประเหส +ประเหียล +ประอบ +ประอร +ประอรประเอียง +ประอึง +ประอุก +ประเอียง +ประแอก +ประฮาม +ปรัก +ปรักปรำ +ปรักมะ +ปรักหักพัง +ปรัง +ปรัชญา +ปรัด +ปรัตถจริยา +ปรัตยนต์ +ปรัตยักษ์ +ปรัตยันต์ +ปรัตยัย +ปรัตยุตบัน +ปรัตยุบัน +ปรัตยูษ +ปรัตยูห์ +ปรัตเยก +ปรัน +ปรั่น +ปรั้น +ปรับ +ปรับทุกข์ +ปรับโทษ +ปรับปรุง +ปรับไหม +ปรับอากาศ +ปรับอาบัติ +ปรัมปรา +ปรัศจิม +ปรัศนา +ปรัศนี +ปรัศว์ +ปร่า +ปรากฏ +ปรากฏการณ์ +ปรากรม +ปรากฤต +ปราการ +ปราคภาร +ปราคาร +ปราง +ปรางค์ +ปรางคณะ +ปรางค์ปรา +ปราจีน +ปราชญ์ +ปราชญา +ปราชัย +ปราชาปัตยวิวาหะ +ปราชิต +ปราณ +ปราณี +ปราด +ปราดเปรียว +ปราดเปรื่อง +ปราติหารย์ +ปราทุกรา +ปราน +ปรานี +ปรานีตีเอาเรือ +ปรานีปราศรัย +ปราบ +ปราบดาภิเษก +ปราบปราม +ปราปต์ +ปราภพ +ปราม +ปรามาส +ปราโมช +ปราโมทย์ +ปราย +ปรารถนา +ปรารภ +ปรารมภ์ +ปราศ +ปราศจาก +ปราศรัย +ปราษณี +ปราษาณ +ปราสัย +ปราสาท +ปรำ +ปริ- +ปริก +ปริกขาร +ปริกรรม +ปริกัป +ปริกัลป- +ปริกัลปมาลา- +ปริขา +ปริคณห์ +ปริจาค +ปริจาริกา +ปริเฉท +ปริชน +ปริซึม +ปริญญา +ปริญญาบัตร +ปริณาม +ปริณามัคคิ +ปริณายก +ปริต +ปริต- +ปริตตะ +ปริตโตทก +ปริตทวีป +ปริตยาค +ปริตร +ปริทรรศน์ +ปริทัยหัคคี +ปริทัศน์ +ปริเทพ +ปริเทพน์ +ปริเทวนะ +ปริเทวะ +ปรินิพพาน +ปริบ +ปริปันถ์ +ปริปาก +ปริพนธ์ +ปริพัตร +ปริพันธ์ +ปริพาชก +ปริภัณฑ์ +ปริภาษ +ปริภาษณ์ +ปริภุญช์ +ปริภูมิ +ปริโภค +ปริ่ม +ปริมณฑล +ปริมัท +ปริมาณ +ปริมาตร +ปริย- +ปริยรณ +ปริยวาท +ปริยวาที +ปริยัติ +ปริยัติธรรม +ปริยานุช +ปริยาย +ปริเยศ +ปริโยสาน +ปริวรรต +ปริวรรต- +ปริวรรตกรรม +ปริวัตร +ปริวาร +ปริวาส +ปริวิตก +ปริเวณ +ปริศนา +ปริศนาธรรม +ปริศนาลายแทง +ปริศนาอักษรไขว้ +ปริษการ +ปริษัท +ปริสัญญู +ปริสุทธิ +ปริหาน +ปริหาร +ปริหาส +ปรี่ +ปรีชญา +ปรีชา +ปรี๊ด +ปรีดา +ปรีดิ +ปรีดิ์ +ปรีดี +ปรีติ +ปรีย +ปรียา +ปรึก +ปรึกษา +ปรึง +ปรือ +ปรื๋อ +ปรุ +ปรุง +ปรุโปร่ง +ปรู +ปรู๋ +ปรูด +ปรูดปราด +ปรู๊ดปร๊าด +ปรู๊ฟ +ปฤงคพ +ปฤจฉา +ปฤจฉาคุณศัพท์ +ปฤจฉาสรรพนาม +ปฤษฎ์ +ปฤษฎางค์ +ปฤษฐ +ปลก +ปลกเปลี้ย +ปลง +ปล่ง +ปลงกรรมฐาน +ปลงใจ +ปลงช้าง +ปลงชีวิต +ปลงตก +ปลงธรรมสังเวช +ปลงธุระ +ปลงบริขาร +ปลงผม +ปลงศพ +ปลงสังขาร +ปลงสังเวช +ปลงอนิจจัง +ปลงอาบัติ +ปลงอายุสังขาร +ปลด +ปลดเกษียณ +ปลดเกษียณอายุ +ปลดทุกข์ +ปลดปลง +ปลดปล่อย +ปลดเปลื้อง +ปลดระวาง +ปลดหนี้ +ปลดออก +ปลดอาวุธ +ปลดแอก +ปล้น +ปล้นทรัพย์ +ปลวก +ปลวังค- +ปลอก +ปลอกกระสุน +ปลอกคอ +ปลอกมีด +ปลอกมือ +ปล่อง +ปล้อง +ปล้องขน +ปล้องฉนวน +ปล้องไฉน +ปล้องทอง +ปล้องอ้อย +ปลอด +ปลอดทหาร +ปลอดโปร่ง +ปลอดภัย +ปล้อน +ปลอบ +ปลอบขวัญ +ปลอบโยน +ปลอม +ปลอมปน +ปลอมแปลง +ปล่อย +ปล่อยเกาะ +ปล่อยแก่ +ปล่อยไก่ +ปล่อยของ +ปล่อยใจ +ปล่อยตัว +ปล่อยตัวปล่อยใจ +ปล่อยนกปล่อยกา +ปล่อยเนื้อปล่อยตัว +ปล่อยปละละเลย +ปล่อยปลาลงน้ำ +ปล่อยปลิง +ปล่อยมือ +ปล่อยเสือเข้าป่า +ปละ +ปลัก +ปลั๊ก +ปลั๊กไฟ +ปลัง +ปลั่ง +ปลัด +ปลัดขิก +ปลา +ปลาก +ปลากริม +ปลาเกลือ +ปลาข้องเดียวกัน +ปลาเค็ม +ปลาเงินปลาทอง +ปลาจ่อม +ปลาจีน +ปลาเจ่า +ปลาชา +ปลาดาว +ปลาแดก +ปลาแดง +ปลาต +ปลาตกน้ำตัวโต +ปลาตะเพียน +ปลาติดหลังแห +ปลาตู้ +ปลาทอง +ปลาแนม +ปลาบ +ปลาบปลื้ม +ปลาบิน +ปลาฝา +ปลาม้ำ +ปลาย +ปลายข้าว +ปลายตีน +ปลายทาง +ปลายนาการ +ปลายน้ำ +ปลายมือ +ปลายอ้อปลายแขม +ปลาร้า +ปลาโลมา +ปลาวาฬ +ปลาสเตอร์ +ปลาสนาการ +ปลาส้ม +ปลาหน้าดิน +ปลาหมอตายเพราะปาก +ปลาหมึก +ปลาเห็ด +ปลาใหญ่กินปลาเล็ก +ปลาไหลเผือก +ปล้ำ +ปล้ำปลุก +ปล้ำผีลุกปลุกผีนั่ง +ปลิง +ปลิงทะเล +ปลิด +ปลิ้น +ปลิ้นปลอก +ปลิ้นปล้อน +ปลิโพธ +ปลิม +ปลิ่ม +ปลิว +ปลี +ปลีก +ปลีกตัว +ปลีกย่อย +ปลีกเวลา +ปลีแข้ง +ปลื้ม +ปลุก +ปลุกใจ +ปลุกตัว +ปลุกปล้ำ +ปลุกปั่น +ปลุกผี +ปลุกพระ +ปลุกระดม +ปลุกเสก +ปลูก +ปลูกฝัง +ปลูกฝี +ปลูกเรือนคร่อมตอ +ปลูกเรือนตามใจผู้อยู่ +ปลูกเรือนพอตัว หวีหัวพอเกล้า +ปวกเปียก +ปวง +ป่วง +ปวด +ปวดถ่วง +ปวดท้องทุ่ง +ปวดท้องเบา +ปวดท้องเยี่ยว +ปวดมวน +ปวดร้าว +ปวดเศียรเวียนเกล้า +ปวดแสบปวดร้อน +ป่วน +ป้วน +ป่วนปั่น +ป้วนเปี้ยน +ป่วย +ป่วยกล่าว +ป่วยการ +ปวัตน- +ปวัตน์ +ปวัตนาการ +ปวารณา +ปวาล +ปวาส +ปวาฬ +ปวิช +ปวิตร +ปวิธ +ปวิเวก +ปวีณ +ปวุติ +ปเวณี +ปเวส +ปเวสน์ +ปศุ +ปสพ +ปสันน- +ปสันนะ +ปสันนาการ +ปสัยห- +ปสัยหะ +ปสัยหาการ +ปสัยหาวหาร +ปสาท +ปสาน +ปสาสน์ +ปสุ +ปสุต +ปสูติ +ปหังส +ปหังสน +ปหาน +ปหาร +ปหาส +ปอ +ป้อ +ป๋อ +ปอก +ปอกกล้วยเข้าปาก +ปอกลอก +ปอง +ป่อง +ป่องๆ +ป้อง +ป้องกัน +ป่องร่า +ปอด +ปอดชื้น +ปอดบวม +ปอดแปด +ปอดลอย +ปอดเหล็ก +ปอน +ปอนๆ +ป้อน +ปอนด์ +ปอเนาะ +ปอบ +ป้อแป้ +ปอม +ป้อม +ป้อมๆ +ป๋อม +ปอมขาง +ปอมข่าง +ป้อมบังคับการ +ปอย +ป้อย +ป้อยอ +ปอเลียงฝ้าย +ปะ +ปะกน +ปะกัง +ปะกาปะกัง +ปะการัง +ปะกำ +ปะขาว +ปะงับปะง่อน +ปะตาปา +ปะตาระกาหลา +ปะติดปะต่อ +ปะติยาน +ปะเตะ +ปะทะ +ปะทะปะทัง +ปะทุ +ปะทุน +ปะบุก +ปะปน +ปะมง +ปะราลี +ปะรำ +ปะลอม +ปะเลง +ปะแล่ม +ปะแล่มๆ +ปะโลง +ปะวะหล่ำ +ปะวะหลิ่ม +ปะว่า +ปะเสหรันอากง +ปะหงับ +ปะหงับๆ +ปะหงับปะง่อน +ปะหนัน +ปะหมันอาหยี +ปะหลิ่ม +ปะหัง +ปะเหลาะ +ปะเหลาะปะแหละ +ปัก +ปักข- +ปักข์ +ปักขคณนา +ปักขพิฬาร +ปักขันดร +ปักใจ +ปักเป้า +ปักษ- +ปักษ์ +ปักษกษัย +ปักษคณนา +ปักษคม +ปักษธร +ปักษเภท +ปักษวาหน +ปักษา +ปักษานดร +ปักษาวสาน +ปักษาสวรรค์ +ปักษิน +ปักษี +ปักหลัก +ปัคหะ +ปัง +ปั๋ง +ปังสุ์ +ปังสุกุล +ปัจจัตตะ +ปัจจัตถรณ์ +ปัจจันต- +ปัจจันต์ +ปัจจันตคาม +ปัจจันตชนบท +ปัจจันตประเทศ +ปัจจัย +ปัจจามิตร +ปัจจุคมน์ +ปัจจุทธรณ์ +ปัจจุบัน +ปัจจุบันทันด่วน +ปัจจุส- +ปัจจุสกาล +ปัจจุสมัย +ปัจจูส +ปัจจูหะ +ปัจเจก +ปัจเจก- +ปัจเจกบุคคล +ปัจเจกพุทธะ +ปัจเจกโพธิ +ปัจเจกสมาทาน +ปัจโจปการกิจ +ปัจโจสกาล +ปัจฉา +ปัจฉาภัต +ปัจฉาสมณะ +ปัจฉิม +ปัจฉิม- +ปัจฉิมชน +ปัจฉิมภาค +ปัจฉิมยาม +ปัจฉิมลิขิต +ปัจฉิมวัย +ปัจฉิมวาจา +ปัจถรณ์ +ปัจนึก +ปัจยาการ +ปัจเวกขณ์ +ปัชชร +ปัชชุน +ปัญจ- +ปัญจก +ปัญจนที +ปัญจม- +ปัญจมี +ปัญจมีดิถี +ปัญจวัคคีย์ +ปัญจวีสติ +ปัญจสาขา +ปัญญัติ +ปัญญา +ปัญญาแค่หางอึ่ง +ปัญญาชน +ปัญญาส- +ปัญญาอ่อน +ปัญหา +ปัญหาโลกแตก +ปัฏ +ปัฏนะ +ปัฐยาวัต +ปัณฑรหัตถี +ปัณณะ +ปัณณาส +ปัณณาสก์ +ปัณรส- +ปัณรสม- +ปัณรสมสุรทิน +ปัณรสี +ปัณรสีดิถี +ปัณหิ +ปัด +ปัดๆ +ปัดเกล้า +ปัดขา +ปัดแข้งปัดขา +ปัดตลอด +ปัดไถม +ปัดเป่า +ปัดรังควาน +ปัดเศษ +ปัดสวะ +ปัตคาด +ปัตตะ +ปัตตานีกะ +ปัตตานึก +ปัตตานุโมทนา +ปัตตาเวีย +ปัตติ +ปัตติก +ปัตติทาน +ปัตถร +ปัตถะ +ปัตนิ +ปัตนี +ปัตยัย +ปัตหล่า +ปัถพี +ปัถวี +ปัทม- +ปัทม์ +ปัทมปาณี +ปัทมราค +ปัทมราช +ปัทมะ +ปัทมาสน์ +ปัน +ปั่น +ปั้น +ปั้นจั่น +ปั้นจิ้มปั้นเจ๋อ +ปันจุเหร็จ +ปั้นเจ๋อ +ปั่นป่วน +ปั้นปึ่ง +ปั่นแปะ +ปั่นฝ้าย +ปั่นไฟ +ปั้นยศ +ปั้นลม +ปั้นล่ำ +ปันส่วน +ปั้นสิบ +ปั้นสีหน้า +ปั้นหยา +ปั่นหัว +ปั้นเหน่ง +ปับ +ปั๊บ +ปัปผาสะ +ปัพพาชนะ +ปัพพาชนียกรรม +ปัพภาระ +ปั๊มน้ำมัน +ปัยกะ +ปัยกา +ปัยยิกา +ปั่ว +ปัวเปีย +ปั้วเปี้ย +ปัศจิม +ปัศตัน +ปัศตู +ปัสสาวะ +ปัสสาสะ +ปา +ป่า +ป้า +ปาก +ปากกบ +ปากกระจับ +ปากกระบะ +ปากกริว +ปากกล้า +ปากกว้าง +ปากกา +ปากกาลูกลื่น +ปากกาหมึกซึม +ปากกาหมึกแห้ง +ปากไก่ +ปากขม +ปากขอ +ปากแข็ง +ปากคม +ปากคอก +ปากคอเราะราย +ปากคัน +ปากคำ +ปากคีบ +ปากจอบ +ปากจะขาบ +ปากจัด +ปากจิ้งจก +ปากฉลาม +ปากช้าง +ปากซ่อม +ปากตลาด +ปากต่อปาก +ปากตะกร้อ +ปากตะไกร +ปากตะขาบ +ปากตำแย +ปากแตร +ปากใต้ +ปากนก +ปากนกกระจอก +ปากนกแก้ว +ปากน้ำ +ปากบอน +ปากบาตร +ปากเบา +ปากแบะ +ปากปราศรัยใจเชือดคอ +ปากปลา +ปากปลาร้า +ปากปลิง +ปากเป็ด +ปากเป็นชักยนต์ +ปากเปราะ +ปากเปราะเราะราย +ปากเปล่า +ปากเปียก +ปากเปียกปากแฉะ +ปากโป้ง +ปากไปล่ +ปากมาก +ปากไม้ +ปากไม่สิ้นกลิ่นน้ำนม +ปากราก +ปากร้าย +ปากเรือ +ปากว่าตาขยิบ +ปากว่ามือถึง +ปากสว่าง +ปากหนัก +ปากหวาน +ปากหวานก้นเปรี้ยว +ปากหอยปากปู +ปากห่าง +ปากเหยี่ยวปากกา +ปากอ่าว +ป่าแคระ +ปาง +ป่าง +ป้าง +ป้างป่า +ปาจนะ +ปาจรีย์ +ปาจารย์ +ปาจิตตีย์ +ปาจีน +ป่าช้า +ป่าชายเลน +ปาฏลิ +ปาฏิบท +ปาฏิบุคลิก +ปาฏิโภค +ปาฏิหาริย์ +ปาฐ- +ปาฐก +ปาฐกถา +ปาฐะ +ปาณ- +ปาณก- +ปาณกชาติ +ปาณทัณฑ์ +ปาณนาศ +ปาณภูต +ปาณวินาศ +ปาณสาร +ปาณะ +ปาณาติบาต +ปาณิ +ปาณิเคราะห์ +ปาณิดล +ปาณิธรรม +ปาณิมุกต์ +ปาณิมูล +ปาณี +ปาด +ป่าดงดิบ +ปาดหาว +ป่าดิบ +ป่าแดง +ปาติโมกข์ +ปาตี +ปาเต๊ะ +ป่าเถื่อน +ปาท +ปาทป +ปาท่องโก๋ +ปาทังกา +ปาทาน +ป่าทึบ +ปาทุกา +ปาน +ป่าน +ป้าน +ปานกลาง +ป่านคม +ปานฉะนี้ +ปานดง +ปานนี้ +ป่านนี้ +ป้านลม +ปานะ +ปานิเยน +ปานีย- +ปานียะ +ปานีโยทก +ป้าบ +ป๊าบ +ป่าเบญจพรรณ +ปาป- +ปาปมุต +ปาปอหยีสังฆาตา +ป่าโปร่ง +ป่าผลัดใบ +ปาพจน์ +ป่าแพะ +ปาม +ปามปึงมา +ปาโมกข์ +ป่าไม้พุ่ม +ป่าย +ป้าย +ป้ายสี +ปายาส +ปาร- +ปาร์เกต์ +ปารคู +ปารมี +ปารเมศ +ปารษณี +ป่าระนาม +ปาราชิก +ปาริฉัตร +ปาริชาต +ปารุปนะ +ปาล +ปาล์ม +ป่าละเมาะ +ปาลิไลยก์ +ปาลี +ป่าเลน +ปาวๆ +ป่าว +ป๊าว +ปาวก +ปาวจนะ +ป่าวประกาศ +ป่าวร้อง +ปาวาร +ปาษาณ +ปาส +ปาสาณ +ปาสาทิกะ +ป่าสูง +ป่าเส็งเคร็ง +ป่าใส +ปาหนัน +ปาหี่ +ปาหุณ +ปาหุไณย- +ปาหุไณยบุคคล +ปำ +ป้ำ +ป้ำเป้อ +ป้ำเป๋อ +ป้ำๆ เป๋อๆ +ปิกนิก +ปิ้ง +ปิงคล- +ปิงคลหัตถี +ปิงคละ +ปิ้งปลาประชดแมว +ปิงปอง +ปิฎก +ปิฏฐะ +ปิฐิ +ปิณฑะ +ปิด +ปิดกล้อง +ปิดคดี +ปิดควันไฟไม่มิด +ปิดฉาก +ปิดตาย +ปิดเต๊าะ +ปิดทองหลังพระ +ปิดบัง +ปิดบัญชี +ปิดเบา +ปิดประตูค้า +ปิดประตูตีแมว +ปิดปาก +ปิดสำนวน +ปิดหนัก +ปิดหีบไม่ลง +ปิตตะ +ปิตา +ปิตามหะ +ปิตามหัยกา +ปิตามหัยยิกา +ปิตุ +ปิตุฆาต +ปิตุจฉา +ปิตุภูมิ +ปิตุล +ปิตุลา +ปิตุลานี +ปิโตรเลียม +ปิ่น +ปิ่นแก้ว +ปิ่นซ่น +ปิ่นตอ +ปิ่นโต +ปิปผลี +ปิ่ม +ปิ้ม +ปิย- +ปิยังคุ +ปิลันธน์ +ปิ๋ว +ปิศาจ +ปิศาจบดี +ปิสัง +ปิไส +ปิหก +ปิหลั่น +ปี +ปี่ +ปี้ +ปี๋ +ปีก +ปีกกล้าขาแข็ง +ปีกกา +ปีกค้างคาว +ปีกนก +ปีกไม้ +ปีกลาย +ปีกหัก +ปีการศึกษา +ปี่แก้ว +ปีงบประมาณ +ปีฐกะ +ปีฐะ +ปี๊ด +ปีติ +ปีน +ปีนเกลียว +ปีบ +ปี๊บ +ปีปฏิทิน +ปี่พาทย์ +ปีมะโว้ +ปีศาจ +ปีแสง +ปีหน้าฟ้าใหม่ +ปีฬ +ปีฬก +ปีฬา +ปึก +ปึกแผ่น +ปึง +ปึ่ง +ปึ๋ง +ปึ่งชา +ปึงปัง +ปึ้ด +ปึมปื้อ +ปืดปึง +ปืน +ปื้น +ปืนยา +ปือ +ปื้อ +ปื๋อ +ปุ +ปุ๊ +ปุก +ปุกปุย +ปุคละ +ปุ้งกี๋ +ปุงคพ +ปุงควะ +ปุงลิงค์ +ปุงลึงค์ +ปุจฉา +ปุฏ +ปุณฑริก +ปุด +ปุดกะลา +ปุตตะ +ปุถุชน +ปุนนาค +ปุนภพ +ปุนัพพสู +ปุนัพสุ +ปุบ +ปุ๊บ +ปุบปับ +ปุ๊บปั๊บ +ปุปผะ +ปุปะ +ปุพพ- +ปุพพผลคุนี +ปุพพผลคุนี- +ปุพพะ +ปุพพะภัททะ +ปุม- +ปุ่ม +ปุ้ม +ปุ๋ม +ปุ่มปลา +ปุ่มป่ำ +ปุ้มเป้ง +ปุ่มเปือก +ปุ้มเปือก +ปุมา +ปุย +ปุ้ย +ปุ๋ย +ปุยกระโดน +ปุยขาว +ปุ๋ยคอก +ปุยฝ้าย +ปุร +ปุรณะ +ปุรพ- +ปุรพผลคุนี +ปุรพษาฒ +ปุราณ +ปุราณะ +ปุเรจาริก +ปุโรหิต +ปุลลิงค์ +ปุลลึงค์ +ปุลินท์ +ปุลู +ปุโลปุเล +ปุษยะ +ปุสสะ +ปุฬวะ +ปู +ปู่ +ปู่ครู +ปูจ๋า +ปู่เจ้า +ปูชกะ +ปูชนีย- +ปูชนียะ +ปูชา +ปูชิต +ปูด +ปูดกกส้มมอ +ปูติ +ปูติลดา +ปู่ทวด +ปูน +ปูนขาว +ปูนซีเมนต์ +ปูนดิบ +ปูนแดง +ปูนปลาสเตอร์ +ปูนปั้น +ปูนเปียก +ปูนผิว +ปูนเพชร +ปูนไฟ +ปูนสอ +ปูนสุก +ปู่น้อย +ปูม +ปู่ย่า +ปู้ยี่ปู้ยำ +ปูระ +ปูลู +ปูเล +ปูวา +ปูเสฉวน +เป้ +เป๋ +เปก +เป๊ก +-เปกข์ +เป่ง +เป้ง +เป๋ง +เป็ด +เป็ดก่า +เป็ดแก้ว +เป็ดขันประชันไก่ +เป็ดถบ +เป็ดเทศ +เป็ดน้ำ +เป็ดผี +เป็ดไฟแดง +เป็ดหงส์ +เปต- +เปตพลี +เปตวิสัย +เปตอง +เปตา +เป็น +เป็นกลาง +เป็นกอง +เป็นกอบเป็นกำ +เป็นการ +เป็นควัน +เป็นความ +เป็นคุ้งเป็นแคว +เป็นงานเป็นการ +เป็นเงาตามตัว +เป็นเงินเป็นทอง +เป็นจริงเป็นจัง +เป็นใจ +เป็นชิ้นเป็นอัน +เป็นชู้ +เป็นดั้งหน้า +เป็นแดน +เป็นใด +เป็นได้ +เป็นต้น +เป็นต่อ +เป็นตัวเป็นตน +เป็นตุเป็นตะ +เป็นน้ำ +เป็นน้ำเป็นนวล +เป็นน้ำยาเย็น +เป็นนิตย์ +เป็นเนื้อเป็นตัว +เป็นเนื้อเป็นหนัง +เป็นบ้า +เป็นบ้าเป็นหลัง +เป็นปากเสียง +เป็นปี่เป็นขลุ่ย +เป็นผู้เป็นคน +เป็นฝั่งเป็นฝา +เป็นฟืนเป็นไฟ +เป็นไฟ +เป็นมั่นเป็นเหมาะ +เป็นรอง +เป็นไร +เป็นลมๆ +เป็นล่ำเป็นสัน +เป็นโล้เป็นพาย +เป็นวรรคเป็นเวร +เป็นหน้าเป็นตา +เป็นหุ่นให้เชิด +เป็นหูเป็นตา +เป็นอัน +เป็นอันขาด +เป็นอันมาก +เป็นเอง +เปยยาล +เปร +เปร็ง +เปรต +เปรต- +เปรตวิษัย +เปรตวิสัย +เปรม +เปรมปรา +เปรย +เปรยๆ +เปรยปราย +เปรอ +เปรอะ +เปรา +เปราะ +เปราะแประ +เปราะหอม +เปรียง +เปรี้ยง +เปรียญ +เปรียบ +เปรียบเทียบ +เปรียบปราย +เปรียบเปรย +เปรี่ยม +เปรียว +เปรี้ยว +เปรี้ยวปาก +เปรี้ยวหวาน +เปรียะ +เปรี๊ยะ +เปรื่อง +เปรื่องปราด +เปรื้อย +เปล +เปล่ง +เปลญวน +เปลว +เปลา +เปล่า +เปล้า +เปล้าขลิบทอง +เปล่าดาย +เปลาะ +เปลี้ย +เปลี่ยน +เปลี่ยนใจ +เปลี่ยนตัว +เปลี่ยนแปลง +เปลี่ยนแผ่นดิน +เปลี่ยนมือ +เปลี่ยนมือไม่ได้ +เปลี่ยนหน้า +เปลี่ยม +เปลี่ยว +เปลี่ยวดำ +เปลือก +เปลือกกระเทียม +เปลือกตา +เปลือกโลก +เปลือง +เปลื้อง +เปลื้องเครื่องสุกำศพ +เปลืองใจ +เปลือย +เปลือยกาย +เปศ +เปศล +เปศลมัธย์ +เปศัส +เปศัส- +เปศัสการิน +เปศัสการี +เปสการ +เปสล +เปสุญ +เปสุญ- +เปสุญวาท +เปสุไณย +เป๋อ +เป้อเย้อ +เปอร์เซ็นต์ +เป๋อเหลอ +เปะ +เปะปะ +เปา +เป่า +เป้า +เป๊า +เป๋า +เป่ากบ +เป่าแตร +เป้าประสงค์ +เป่าปี่ +เป่าฝุ่น +เป่าแล่น +เป้าหมาย +เป่าหลอด +เป่าหู +เป๋าฮื้อ +เปาะ +เปาะเปี๊ยะ +เปาะแปะ +เปาะเหลาะ +เปิก +เปิง +เปิงๆ +เปิงมาง +เปิด +เปิดกล้อง +เปิดคดี +เปิดฉาก +เปิดบัญชี +เปิดเปิง +เปิดโปง +เปิดเผย +เปิดโลก +เปิดหมวกลา +เปิดหมวกให้ +เปิดหูเปิดตา +เปิดอก +เปิ่น +เปิบ +เปิ๊บ +เปิบข้าว +เปีย +เปียก +เปี๊ยก +เปี่ยม +เปียว +เปี้ยว +เปียะ +เปี๊ยะ +เปือก +เปือกตม +เปื้อน +เปื่อย +แป +แป้ง +แป๋ง +แป้งข้าวสาลี +แป้งข้าวหมาก +แป้งแข็ง +แป้งจี่ +แป้งแช่ +แป้งญวน +แป้งนวล +แป้งฝุ่น +แป้งมัน +แป้งมี่ +แป้งร่ำ +แป้งสด +แป้งสารภี +แป้งสาลี +แป้งสิงคโปร์ +แป้งหมี่ +แป้งเหล้า +แปด +แป๊ด +แปดบท +แปดปน +แปดเปื้อน +แปดสาแหรก +แปดเหลี่ยมแปดคม +แปดเหลี่ยมสิบสองคม +แปทู +แป้น +แปบ +แป๊บ +แปม +แปร +แปร๋ +แปรก +แปรขบวน +แปรไข้ +แปรง +แปร่ง +แปรงล้างขวด +แปรงหูหนู +แปรญัตติ +แปร๊ด +แปรธาตุ +แปร้น +แปร้นแปร๋ +แปรปรวน +แปรปากหลากคำ +แปร๋แปร้น +แปรผัน +แปรผันโดยตรง +แปรผันแบบผกผัน +แปรพักตร์ +แปรรูป +แปรอักษร +แประ +แปล +แปล้ +แปลก +แปลกปลอม +แปลง +แปลงชาติ +แปลงผี +แปลงสัญชาติ +แปลตามเนื้อความ +แปลตามพยัญชนะ +แปลตามอรรถ +แปลน +แปลบ +แปลยกศัพท์ +แปลร้อย +แป้ว +แป๊ว +แปะ +แป๊ะ +แป๊ะซะ +โป +โป่ +โป้ +โป๊ +โปก +โป๊ก +โป๊กเกอร์ +โปกขร- +โปกขรณี +โปกขรพรรษ +โปกำ +โปเก +โปง +โป่ง +โป้ง +โป่งข่าม +โป่งดิน +โป่งน้ำ +โป้งเป้ง +โป้งโย้ง +โปงลาง +โป้งโล้ง +โป่งวิด +โป้งโหยง +โปฐบท +โปฐปทมาส +โปดก +โปตถกะ +โปน +โป้ปด +โป๊ยเซียน +โปรง +โปร่ง +โปร่งเปร่ง +โปร่งฟ้า +โปร่งแสง +โปร่งใส +โปรด +โปรดปราน +โปรดสัตว์ +โปรดสัตว์ได้บาป +โปรตอน +โปรตีน +โปรเตสแตนต์ +โปรย +โปรยปราย +โปรีสภา +โปล่ง +โปลิโอ +โปส +โปสก +โปสาวนิกมูล +โปะ +โป๊ะ +โป๊ะจ้าย +ไป +ไป่ +ไป๋ +ไปค้าถ่าน +ไปตายเอาดาบหน้า +ไปทุ่ง +ไปๆ มาๆ +ไปย- +ไปยาล +ไปรษณีย- +ไปรษณีย์ +ไปรษณียนิเทศ +ไปรษณียบรรณ +ไปรษณียบัตร +ไปรษณียภัณฑ์ +ไปรษณีย์รับรอง +ไปรษณียวัตถุ +ไปรษณียากร +ไปล่ +ไปล่ปลิว +ไปลาด +ไปวัดไปวาได้ +ไปศาจ +ไปไหนมาสามวาสองศอก +ไปอย่างน้ำขุ่นๆ +ผ +ผก +ผกผงก +ผกผัน +ผกเรือก +ผกา +ผกากรอง +ผกาย +ผการาย +ผคม +ผง +ผงก +ผงขาว +ผงเข้าตาตัวเอง +ผงคลี +ผงชูรส +ผงซักฟอก +ผงฟู +ผงม +ผงร +ผงอน +ผงอบ +ผงะ +ผงาด +ผง่าน +ผจง +ผจญ +ผจัญ +ผจาน +ผชุม +ผณิน +ผณินทร +ผณินทรสมพัตสร +ผณิศวร +ผด +ผดุง +ผดุงครรภ์ +ผเดิน +ผทม +ผทมเพลิง +ผนวก +ผนวช +ผนัง +ผนิด +ผนึก +ผม +ผมชิงเกิล +ผมทรงมหาดไทย +ผมทัด +ผมนาง +ผมบ๊อบ +ผมปีก +ผมเป๋ +ผมเปีย +ผมโป่ง +ผมไฟ +ผมมหาดไทย +ผมม้า +ผมหลักแจว +ผยอง +ผย่ำเผยอ +ผรณ- +ผรณาปีติ +ผรสุ +ผริต +ผริต- +ผรุพก +ผรุส- +ผรุสวาท +ผล +ผลก +ผลคุน +ผลคุนี +ผลคุนีบูรพมาส +ผลง +ผลพลอยได้ +ผลลัพธ์ +ผลอ +ผล็อง +ผล็อย +ผละ +ผลัก +ผลัด +ผลัดเปลี่ยน +ผลัดแผ่นดิน +ผลับ +ผลัวะ +ผลา +ผลาญ +ผลานิสงส์ +ผลาผล +ผลาหาร +ผลิ +ผลิก- +ผลิกศิขรี +ผลิกศิลา +ผลิกะ +ผลิต +ผลิต- +ผลิตกรรม +ผลิตผล +ผลิตภัณฑ์ +ผลิน +ผลี +ผลีผลาม +ผลึก +ผลึ่ง +ผลือ +ผลุ +ผลุง +ผลุด +ผลุน +ผลุนผลัน +ผลุบ +ผลุบผลับ +ผลุบโผล่ +ผลุบๆ โผล่ๆ +ผลุย +ผลู +ผลูบด +ผลูแบก +ผวน +ผวย +ผวา +ผสม +ผสมเทียม +ผสมผสาน +ผสมผเส +ผสมพันธุ์ +ผสมโรง +ผสมเสร็จ +ผสาน +ผสาย +ผสาร +ผอก +ผอง +ผ่อง +ผ่องแผ้ว +ผ่องใส +ผอด +ผ่อน +ผ่อนคลาย +ผ่อนชำระ +ผ่อนปรน +ผ่อนผัน +ผ่อนส่ง +ผ่อนสั้นผ่อนยาว +ผ่อนหนักเป็นเบา +ผอบ +ผอม +ผอมเกร็ง +ผอมโซ +ผอมแห้ง +ผ็อย +ผ่อย +ผอวด +ผอูน +ผะ +ผะแคง +ผะดา +ผะสา +ผะออบ +ผัก +ผักไก +ผักขวง +ผักขี้ขวง +ผักโฉม +ผักชี +ผักชีโรยหน้า +ผักตบชวา +ผักต้มขนมยำ +ผักทอดยอด +ผักบุ้ง +ผักบุ้งขัน +ผักบุ้งจีน +ผักบุ้งทะเล +ผักบุ้งฝรั่ง +ผักบุ้งร้วม +ผักบุ้งรั้ว +ผักเบี้ย +ผักเบี้ยใหญ่ +ผักปลัง +ผักปุ่มปลา +ผักเผ็ด +ผักไผ่ +ผักรู้นอน +ผักแว่น +ผักสาบ +ผักสามหาว +ผักเสี้ยน +ผักหนอก +ผักหนอง +ผักหนาม +ผักหวาน +ผักหวานบ้าน +ผักหวานป่า +ผักไหม +ผักอีแปะ +ผัคคุณ +ผัคคุณ- +ผัคคุณมาส +ผัคคุณี +ผัง +ผังเมือง +ผัด +ผัดเจ้าล่อ +ผัดช้าง +ผัดผ่อน +ผัดผัน +ผัดเพี้ยน +ผัดวันประกันพรุ่ง +ผัน +ผันแปร +ผันผยอง +ผันผวน +ผันผ่อน +ผันผาด +ผันผาย +ผันหม้อ +ผันอักษร +ผับ +ผับๆ +ผัลคุนี +ผัว +ผัวหาบเมียคอน +ผัวะ +ผัสส- +ผัสสะ +ผัสสาหาร +ผา +ผ่า +ผ้า +ผาก +ผากแผ้ง +ผ้ากราบ +ผ้าเกี้ยว +ผ้าขาวม้า +ผ้าขี้ริ้ว +ผ้าขี้ริ้วห่อทอง +ผาง +ผ้าเช็ดตัว +ผ้าเช็ดหน้า +ผาณิต +ผาด +ผาดผัง +ผาดแผลง +ผาดโผน +ผาดเพ่ง +ผาดำ +ผ้าดำ +ผ้าดิบ +ผ้าแดง +ผ้าตา +ผาติ +ผาติกรรม +ผ้าถุง +ผ้าแถบ +ผ้าทิพย์ +ผ้าเทศ +ผ่าน +ผ้านุ่ง +ผ้าใบ +ผ้าใบกลอย +ผ้าใบเมี่ยง +ผ้าป่า +ผ้าผ่อน +ผ่าเผย +ผาเผือก +ผ้าแฝง +ผ้าพันคอ +ผ้าพันแผล +ผ้าพื้น +ผาม +ผ้ามัดหมี่ +ผาย +ผ่าย +ผ้าย +ผายปอด +ผ่ายผอม +ผายผัง +ผายผัน +ผายลม +ผ้ายาง +ผาล +ผาลคุน +ผาลา +ผาลาเพียงไหล่ +ผ้าลาย +ผ้าลูกไม้ +ผ่าว +ผาสามเส้า +ผ้าสำลี +ผาสุก +ผ่าหมาก +ผาหอม +ผ้าห้อยหอ +ผ่าเหล่า +ผ้าเหลือง +ผ้าเหลืองร้อน +ผ้าไหว้ +ผ้าอนามัย +ผ้าอ้อม +ผ้าอาบ +ผ้าฮาด +ผำ +ผ้ำๆ +ผิ +ผิง +ผิด +ผิดก +ผิดใจ +ผิดตา +ผิดท่า +ผิดนัก +ผิดนัด +ผิดน้ำ +ผิดประหลาด +ผิดผี +ผิดผู้ผิดคน +ผิดแผก +ผิดฝาผิดตัว +ผิดพ้องหมองใจ +ผิดเพี้ยน +ผิดเมีย +ผิดรูปผิดร่าง +ผิดสังเกต +ผิดสำแลง +ผิดเส้น +ผิดหวัง +ผิดหู +ผิดหูผิดตา +ผิต +ผิน +ผินหลังให้ +ผิว +ผิวน้ำ +ผิวบาง +ผิวปาก +ผิวเผิน +ผิวพรรณ +ผิวหนัง +ผิว่า +ผี +ผีเข้าผีออก +ผีซ้ำด้ำพลอย +ผีดิบ +ผีต +ผีตองเหลือง +ผีตากผ้าอ้อม +ผีถ้วยแก้ว +ผีถึงป่าช้า +ผีบ้านไม่ดี ผีป่าก็พลอย +ผีบุญ +ผีพุ่งไต้ +ผีเพลีย +ผีฟ้า +ผีไม่มีศาล +ผีเรือน +ผีเรือนไม่ดี ผีป่าก็พลอย +ผี้ว์ +ผีเสื้อ +ผีเสื้อเงิน +ผีเสื้อน้อย +ผีเสื้อน้ำ +ผีเสื้อยักษ์ +ผีหลอก +ผีอำ +ผึง +ผึ่ง +ผึ้ง +ผึ่งผาย +ผึ้งรวง +ผืน +ผื่น +ผุ +ผุด +ผุดผ่อง +ผุดผาด +ผุดผาย +ผุดผ้าย +ผุดลุกผุดนั่ง +ผุยผง +ผุสราคา +ผู้ +ผูก +ผูกกระได +ผูกขวัญ +ผูกขาด +ผูกดวง +ผูกดอก +ผูกพัทธสีมา +ผูกพัน +ผูกภาษี +ผูกมัด +ผู้กว้างขวาง +ผูกหู +ผู้ก่อการร้าย +ผู้คน +ผู้จัดการ +ผู้ชาย +ผู้ชายพายเรือ +ผู้ชำนาญการพิเศษ +ผู้เชี่ยวชาญ +ผู้ญาณ +ผู้ดี +ผู้ดีแปดสาแหรก +ผู้โดยสาร +ผู้ต้องขัง +ผู้ต้องหา +ผู้ทรง +ผู้แทนเฉพาะคดี +ผู้แทนโดยชอบธรรม +ผู้แทนราษฎร +ผู้ไทย +ผู้น้อย +ผู้เป็นหุ้นส่วน +ผู้พิทักษ์สันติราษฎร์ +ผู้เยาว์ +ผู้รั้ง +ผู้รับประกันภัย +ผู้รับประโยชน์ +ผู้รับเรือน +ผู้รับเหมาก่อสร้าง +ผู้ร้าย +ผู้ลากมากดี +ผู้วิเศษ +ผู้สำเร็จ +ผู้สืบตระกูล +ผู้สืบสันดาน +ผู้สื่อข่าว +ผู้เสียหาย +ผู้หญิง +ผู้หญิงยิงเรือ +ผู้ใหญ่ +ผู้ใหญ่บ้าน +ผู้อนุบาล +ผู้เอาประกันภัย +เผ +เผง +เผชิญ +เผชิญภัย +เผชิญหน้า +เผ็ด +เผด็จ +เผด็จการ +เผ็ดร้อน +เผดิม +เผดียง +เผน- +เผ่น +เผนธรรม +เผนิก +เผย +เผยแผ่ +เผยแพร่ +เผยอ +เผยิบ +เผยิบผยาบ +เผล +เผล่ +เผล้ +เผล็ด +เผลอ +เผลอไผล +เผละ +เผลาะ +เผลาะแผละ +เผลียง +เผอเรอ +เผอเรอกระเชอก้นรั่ว +เผอิญ +เผอิล +เผะ +เผา +เผ่า +เผ้า +เผาขน +เผาจริง +เผ้าผง +เผ่าพันธุ์ +เผาหลอก +เผาหัว +เผาะ +เผิ้ง +เผิน +เผินๆ +เผียน +เผือ +เผื่อ +เผือก +เผือกกะลา +เผือกโทป้าด +เผื่อขาดเผื่อเหลือ +เผือด +เผือน +เผื่อน +เผื่อแผ่ +เผื่อว่า +เผื่อเหนียว +เผื่อเหลือเผื่อขาด +แผ่ +แผก +แผ่กระจาด +แผง +แผงคอ +แผงลอย +แผ่แง่ +แผ่ซ่าน +แผด +แผ่ตน +แผน +แผ่น +แผนก +แผนการ +แผนงาน +แผ่นดิน +แผ่นดินกลบหน้า +แผ่นดินไหว +แผนที่ +แผ่นผงอน +แผนผัง +แผ่นพก +แผ่นภพ +แผนภาพ +แผนภูมิ +แผ่นเสียง +แผ่เผื่อ +แผ่เมตตา +แผล +แผลเก่า +แผลง +แผลงฤทธิ์ +แผล็บ +แผล็บๆ +แผลเป็น +แผลริมแข็ง +แผลริมอ่อน +แผล็ว +แผละ +แผ่ว +แผ่วๆ +แผ้ว +แผ้วพาน +แผ่สองสลึง +แผ่หลา +แผ่อำนาจ +โผ +โผง +โผงผาง +โผงเผง +โผฏฐัพ- +โผฏฐัพธรรม +โผฏฐัพพะ +โผน +โผเผ +โผย +โผล่ +โผลกเผลก +โผละ +โผอน +โผะ +ไผ +ไผ่ +ไผท +ไผทโกรม +ไผ่ผัง +ฝ +ฝน +ฝนชะช่อมะม่วง +ฝนชะลาน +ฝนซู่ +ฝนตกก็แช่ง ฝนแล้งก็ด่า +ฝนตกขี้หมูไหล +ฝนตกไม่ทั่วฟ้า +ฝนตกไม่มีเค้า +ฝนตกอย่าเชื่อดาว +ฝนทอง +ฝนทั่งให้เป็นเข็ม +ฝนเทียม +ฝนไล่ช้าง +ฝนสั่งฟ้า +ฝนสั่งฟ้า ปลาสั่งหนอง +ฝนแสนห่า +ฝนห่าแก้ว +ฝรั่ง +ฝรั่งกังไส +ฝรั่งขี้นก +ฝรั่งมังค่า +ฝรั่งเศส +ฝ่อ +ฝอย +ฝอยทอง +ฝัก +ฝักแค +ฝักถั่ว +ฝักบัว +ฝักฝ่าย +ฝักใฝ่ +ฝักพร้า +ฝักเพกา +ฝักมะขาม +ฝักยาว +ฝัง +ฝั่ง +ฝังเข็ม +ฝังใจ +ฝั่งฝา +ฝังรกฝังราก +ฝังรอย +ฝังรูป +ฝังหัว +ฝัด +ฝัน +ฝันกลางวัน +ฝันเปียก +ฝันเฟื่อง +ฝา +ฝ่า +ฝ้า +ฝาก +ฝากกอง +ฝากกาย +ฝากไข้ +ฝากครรภ์ +ฝากตัว +ฝากท้อง +ฝากเนื้อฝากตัว +ฝากเนื้อไว้กับเสือ +ฝากบำเรอ +ฝากประจำ +ฝากปลาไว้กับแมว +ฝากผี +ฝากผีฝากไข้ +ฝากเผื่อเรียก +ฝากฝัง +ฝากระดาน +ฝากโรงเรียน +ฝากไว้ก่อน +ฝากสู่ +ฝ่าคมหอกคมดาบ +ฝาง +ฝาชี +ฝาด +ฝาน +ฝ่าฝืน +ฝาแฝด +ฝ่าพระบาท +ฝ่าฟัน +ฝ่ามรสุม +ฝาย +ฝ่าย +ฝ้าย +ฝ่ายขวา +ฝ่ายค้าน +ฝ้ายคำ +ฝ่ายซ้าย +ฝ่ายใน +ฝ่ายเป็นกลาง +ฝ้ายผี +ฝ่ายเสนอ +ฝ่ายหน้า +ฝาละมี +ฝาสายบัว +ฝาสำหรวด +ฝาเสี้ยว +ฝาหอยโข่ง +ฝาหุ้มกลอง +ฝาไหล +ฝิ่น +ฝิ่นต้น +ฝี +ฝี่ +ฝีก +ฝีกาฬ +ฝีจัก +ฝีจักร +ฝีดาษ +ฝีดิบ +ฝีเท้า +ฝีในท้อง +ฝีปาก +ฝีพาย +ฝีมะม่วง +ฝีมือ +ฝีไม้ลายมือ +ฝีเย็บ +ฝีหมอบ +ฝึก +ฝึกงาน +ฝึกปรือ +ฝึกฝน +ฝึกสอน +ฝึกหัด +ฝืด +ฝืดเคือง +ฝืน +ฝืนท้อง +ฝุ่น +ฝุ่นเมือง +ฝูง +ฝูงบิน +เฝ้า +เฝ้าไข้ +เฝ้าคอย +เฝ้าแหน +เฝือ +เฝือก +เฝือง +เฝื่อน +แฝก +แฝกหอม +แฝง +แฝด +แฝดน้ำ +แฝดเลือด +ใฝ่ +ใฝ่ใจ +ใฝ่ต่ำ +ใฝ่ฝัน +ใฝ่ร้อนจะนอนเย็น ใฝ่เย็นจะดิ้นตาย +ใฝ่สูง +ใฝ่สูงจนเกินศักดิ์ +ใฝ่สูงให้เกินศักดิ์ +ไฝ +พ +พก +พกจร +พกนุ่น +พกพ่าย +พกลม +พกหิน +พกา +พกุระ +พกุล +พง +พงพี +พงศ- +พงศ์ +พงศกร +พงศธร +พงศ์พันธุ์ +พงศา +พงศาวดาร +พงศาวลี +พจน- +พจน์ +พจนา +พจนานุกรม +พจนารถ +พจนีย์ +พจมาน +พจี +พชระ +พญา +พญากาสัก +พญาขามป้อม +พญาฉัททันต์ +พญาช้างเผือก +พญาณ +พญาดาบหัก +พญาเดิน +พญาไทย +พญาปากกว้าง +พญาแปแล +พญาพยาต +พญาไฟ +พญามะขามป้อม +พญามือเหล็ก +พญามุตติ +พญามูมิน +พญาไม้ +พญายา +พญารากดำ +พญารากเดียว +พญาไร้ใบ +พญาลอ +พญาโศก +พญาสัตบรรณ +ฯพณฯ +พณิช +พณิชย์ +พด +พดกริช +พดด้วง +พธู +พน +พน- +พ่น +พ้น +พนขัณฑ์ +พนโคจร +พนจร +พนจรก +พนชีวี +พนธารา +พนม +พนมเพลิง +พนมศก +พนมศพ +พนมสวรรค์ +พนวาสี +พ้นวิสัย +พนสณฑ์ +พนอง +พนอม +พนัก +พนักงาน +พนักงานเจ้าหน้าที่ +พนักงานสอบสวน +พนักงานอัยการ +พนัง +พนัน +พนันดร +พนัส +พนัส- +พนัสดม +พนัสบดี +พนา +พนาด +พนาดร +พนาดอน +พนาธวา +พนานดร +พนาย +พนาราม +พนาลัย +พนาลี +พนาวา +พนาวาส +พนาเวศ +พนาศรม +พนาศรัย +พนาสณฑ์ +พนาสัณฑ์ +พนิดา +พนิต +พนียก +พเนก +พเนจร +พบ +พบปะ +พบพาน +พบไม้งามเมื่อขวานบิ่น +พบู +พม่า +พม่าแทงกบ +พม่ารำขวาน +พยช +พยชน์ +พยติเรก +พยนต์ +พยศ +พยัก +พยักพเยิด +พยักยิ้ม +พยัคฆ- +พยัคฆ์ +พยัคฆา +พยัคฆิน +พยัคฆินทร์ +พยัคฆี +พยัคเฆนทร์ +พยัชน์ +พยัญชนะ +พยัต +พยับ +พยับแดด +พยับฝน +พยับเมฆ +พยับหมอก +พยากรณ์ +พยาฆร์ +พยางค์ +พยาธิ +พยาน +พยาบาท +พยาบาล +พยาม +พยายาม +พยาล +พยาล- +พยาลมฤค +พยุ +พยุง +พยุงปีก +พยุห- +พยุหบาตร +พยุหบาตรา +พยุหยาตรา +พยุหโยธา +พยุหร +พยุหเสนา +พยุหแสนยา +พยุหแสนยากร +พยุหะ +พยู่ห์ +พเยีย +พร +พรต +พรม +พรมคด +พรมคดตีนเต่า +พรมแดน +พรมน้ำมัน +พรมนิ้ว +พรมมิ +พรรค +พรรค- +พรรค์ +พรรคกลิน +พรรคการเมือง +พรรคนาวิกโยธิน +พรรคนาวิน +พรรคพวก +พรรคานต์ +พรรณ +พรรณนา +พรรณราย +พรรดึก +พรรลาย +พรรษ +พรรษ- +พรรษประเวศ +พรรษฤดู +พรรษวุฒิ +พรรษา +พรรษากาล +พรรษาคม +พรรษายุต +พรรโษทก +พรรโษบล +พรรเหา +พรรเอิญ +พรวงเพรียง +พรวด +พรวดพราด +พรวน +พรสวรรค์ +พรหม +พรหม- +พรหมกาย +พรหมโคล +พรหมจรรย์ +พรหมจักร +พรหมจาริณี +พรหมจารี +พรหมชาติ +พรหมทัณฑ์ +พรหมไทย +พรหมธาดา +พรหมบถ +พรหมบท +พรหมบริษัท +พรหมบุตร +พรหมปุโรหิต +พรหมพักตร์ +พรหมพันธุ์ +พรหมภูติ +พรหมยาน +พรหมเรขา +พรหมฤษี +พรหมลิขิต +พรหมวิหาร +พรหมศร +พรหมสี่หน้า +พรหมสูตร +พรหมหัวเหม็น +พรหมโองการ +พรหมัญตา +พรหมา +พรหมาณฑ์ +พรหมาสตร์ +พรหมินทร์ +พรหเมนทร์ +พรหเมศวร +พรอก +พร่อง +พร้อง +พร้องเพรียก +พรอด +พร้อม +พร่อมพร้อ +พร้อมพรัก +พร้อมพรั่ง +พร้อมเพรียง +พร้อมมูล +พร้อมหน้า +พร้อมหน้าพร้อมตา +พร่อย +พร้อย +พระ +พระกรน้อย +พระครู +พระคุณเจ้า +พระเคราะห์ +พระเครื่อง +พระจันทร์ครึ่งซีก +พระเจ้า +พระเจ้าลอยถาด +พระเจ้าหลวง +พระเจ้าห้าพระองค์ +พระเจ้าอยู่หัว +พระเดชพระคุณ +พระทอง +พระทัย +พระธรรมศาสตร์ +พระนม +พระนอม +พระนาง +พระนางเจ้า +พระนางเธอ +พระนาด +พระนาย +พระบฏ +พระบท +พระประธาน +พระเป็นเจ้า +พระผู้เป็นเจ้า +พระแผง +พระพิมพ์ +พระพุทธเจ้า +พระพุทธเจ้าข้า +พระพุทธเจ้าข้าขอรับ +พระพุทธเจ้าข้าขอรับใส่เกล้าใส่กระหม่อม +พระพุทธเจ้าหลวง +พระพุทธเจ้าอยู่หัว +พระพุทธองค์ +พระภูมิ +พระมาลัยมาโปรด +พระยา +พระยาเทครัว +พระยาเล็บครุฑ +พระยาวัน +พระรอง +พระราชกฤษฎีกา +พระราชกำหนด +พระราชบัญญัติ +พระรูป +พระรูปชี +พระฤๅษี +พระลบ +พระลือ +พระแวว +พระศุกร์เข้าพระเสาร์แทรก +พระหา +พระหาม +พระหารณย์ +พระหารัณย์ +พระหิด +พระองค์ +พระองค์เจ้า +พระอันดับ +พระอิฐพระปูน +พระเอก +พระฮาม +พรักพร้อม +พรั่ง +พรั่งพร้อม +พรั่งพรู +พรัด +พรั่น +พรั่นพรึง +พรับ +พร่า +พร้า +พราก +พรากเด็ก +พรากผู้เยาว์ +พรากลูกนกลูกกา +พราง +พร่าง +พรางพรอก +พร้างัดปากไม่ออก +พราด +พราน +พราย +พรายทะเล +พรายน้ำ +พรายแพรว +พรายย้ำ +พราว +พราวแพรว +พราหมณ์ +พราหมณ์เก็บหัวแหวน +พราหมณ์ขายเมีย +พราหมณ์ดีดน้ำเต้า +พราหมณัศบดี +พราหมณี +พราหมี +พรำ +พรำๆ +พร่ำ +พร้ำ +พร่ำพลอด +พร่ำเพรื่อ +พร่ำเพ้อ +พริก +พริกกระต่าย +พริกกะเกลือ +พริกแกว +พริกขิง +พริกดอง +พริกเทศ +พริกไทย +พริกน้ำส้ม +พริกหอม +พริกเหลือง +พริ้ง +พริ้งพราย +พริ้งเพริศ +พริบ +พริบตาเดียว +พริบไหว +พริ้ม +พริ้มพราย +พริ้มเพรา +พรึง +พรึน +พรึบ +พรืด +พรุ +พรุก +พรุ่ง +พรุ่งนี้ +พรุน +พรู +พรูด +พฤกษ- +พฤกษ์ +พฤกษชาติ +พฤกษทล +พฤกษเทวดา +พฤกษราช +พฤกษศาสตร์ +พฤกษา +พฤฒ +พฤฒา +พฤฒาจารย์ +พฤฒิ +พฤฒิ- +พฤฒิบาศ +พฤต +พฤติ +พฤติ- +พฤติกรรม +พฤติการณ์ +พฤตินัย +พฤทธ์ +พฤทธิ์ +พฤนต์ +พฤนท์ +พฤภูษณ +พฤภูษิต +พฤศจิก +พฤศจิกายน +พฤษภ +พฤษภาคม +พฤหัสบดี +พฤหัสบดีจักร +พล +พล- +พลกาย +พลการ +พลขันธ์ +พลความ +พลตระเวน +พลเทพ +พลบ +พลเมือง +พลเรือน +พลโลก +พลว- +พลวก +พลวง +พลวดกินลูก +พลวดใหญ่ +พลวัต +พลศาสตร์ +พลศึกษา +พลสิงห์ +พลอ +พล้อ +พลอง +พลอด +พลอดรัก +พลอน +พลอมแพลม +พลอย +พล่อย +พลอยฟ้าพลอยฝน +พละ +พละพลา +พลั่ก +พลัง +พลั่ง +พลั้ง +พลังงาน +พลังงานจลน์ +พลังงานศักย์ +พลังจิต +พลั้งปาก +พลั้งปากเสียศีล พลั้งตีนตกต้นไม้ +พลั้งเผลอ +พลัด +พลัดถิ่น +พลัดที่นาคาที่อยู่ +พลัดพราก +พลัน +พลับ +พลับเขา +พลับพลา +พลับพลึง +พลั่ว +พล่า +พลากร +พลาง +พลาญ +พลาด +พลาดท่า +พลาดิศัย +พลาธิการ +พล่าน +พลานามัย +พลานึก +พลาม +พล่าม +พลาย +พลายม้า +พลาสติก +พลาสมา +พลาหก +พลำ +พล้ำ +พลำภัง +พลิ +พลิก +พลิกกระเป๋า +พลิกแผ่นดิน +พลิกแพลง +พลิกศพ +พลิกหน้ามือเป็นหลังมือ +พลิพัท +พลิ้ว +พลี +พลีกรรม +พลีมุข +พลุ +พลุก +พลุ่ก +พลุกพล่าน +พลุ่ง +พลุ้น +พลุ่มพล่าม +พลุ่ย +พลุ้ย +พลู +พลูแก +พลูคาว +พลูต้น +พลูโต +พลูโทเนียม +พวก +พวกพ้อง +พวง +พ่วง +พวงโกเมน +พวงคราม +พวงชมพู +พวงดอกไม้ +พ่วงพี +พวงมาลัย +พวงมาลา +พวงแสด +พวงหยก +พวงหรีด +พวงอุไร +พวน +พวย +พวยน้ำ +พวยพุ่ง +พสก +พสก- +พสกนิกร +พสน +พสุ +พสุธา +พสุธาดล +พสุนธรา +พสุมดี +พสุสงกรานต์ +พหล +พหุ +พหุคูณ +พหุพจน์ +พหุภาคี +พหุล +พหู +พหูพจน์ +พหูสูต +พอ +พ่อ +พ้อ +พอก +พอกพูน +พอกัน +พอกันที +พอการ +พอก้าวขาก็ลาโรง +พ่อเกลอ +พ่อขุน +พ่อครัว +พอควร +พ่อค้าตีเมีย +พ่อคุณ +พอง +พ้อง +พ้องพาน +พ่อเจ้า +พ่อแจ้แม่อู +พอใจ +พอใช้ +พอใช้ได้ +พอดี +พอดีพอร้าย +พอดู +พอดูได้ +พอได้ +พอตัว +พ่อตา +พอทำเนา +พอทำพอกิน +พอที +พอที่ +พอน +พอนเรือ +พ่อบ้าน +พอประมาณ +พอไปได้ +พ่อพวงมาลัย +พอฟัด +พอฟัดพอเหวี่ยง +พ้อม +พ่อม่าย +พอมีพอกิน +พอมีอันจะกิน +พ่อเมือง +พอยกขาก็ลาโรง +พอแย้มปากก็เห็นไรฟัน +พ่อร้าง +พ่อเรือน +พอแรง +พ่อลิ้นทอง +พ่อเลี้ยง +พอเลี้ยงปากเลี้ยงท้อง +พอโลเนียม +พอสถานประมาณ +พ่อสื่อ +พอหอมปากหอมคอ +พอเหมาะ +พออ้าปากก็เห็นลิ้นไก่ +พะ +พ่ะ +พะงา +พะงาบ +พะงาบๆ +พะจง +พะทำมะรง +พะนอ +พะเน้าพะนอ +พะเน้าพะนึง +พะเนิน +พะเนินเทินทึก +พะเนียง +พะแนง +พะพาน +พะพิง +พะเพิง +พะยอม +พ่ะย่ะค่ะ +พะยุพยุง +พะยูง +พะยูน +พะเยิบ +พะเยิบๆ +พะเยิบพะยาบ +พะรุงพะรัง +พะเลย +พะโล้ +พะไล +พะวง +พะวักพะวน +พะวา +พะว้าพะวัง +พะอง +พะอากพะอำ +พะอืดพะอม +พัก +พักตร- +พักตร์ +พักตรา +พักตรากฤติ +พักตา +พักผ่อน +พักพิง +พักแพว +พักฟื้น +พักร +พักสมอง +พัง +พังกา +พังคา +พังงา +พังผืด +พังพวย +พังพอน +พังพาน +พังพาบ +พังเพย +พัช +พัชนี +พัชร +พัญจก +พัญจน์ +พัฒกี +พัฒน- +พัฒนะ +พัฒนา +พัฒนากร +พัฒนาการ +พัด +พัดชัก +พัดชา +พัดดึงส์ +พัดโบก +พัดแพว +พัดยศ +พัดลม +พัดหลวง +พัตติงสะ +พัตร +พัทธ- +พัทธ์ +พัทธยา +พัทธยากร +พัทธสีมา +พัทร +พัน +พันงู +พันจ่า +พันจำ +พันไฉน +พันซาด +พันตัน +พันตา +พันตู +พันทาง +พันธ- +พันธ์ +พันธกรณี +พันธน- +พันธนะ +พันธนาการ +พันธนาคาร +พันธนำ +พันธบัตร +พันธมิตร +พันธะ +พันธุ +พันธุ์ +พันเนตร +พันปี +พันพัว +พันลอก +พันลาย +พันลำ +พันลึก +-พันลือ +พันเลิศ +พันวรรษา +พันแสง +พันเอิญ +พับ +พับเขียง +พับฐาน +พับผ้า +พับเพียบ +พับแพนงเชิง +พัลลภ +พัลวัน +พัว +พัวพัน +พัวะ +พัศดี +พัสดุ +พัสดุไปรษณีย์ +พัสดุภัณฑ์ +พัสเดา +พัสตร์ +พัสถาน +พา +พาก +พากเพียร +พากย์ +พากย์หนัง +พาง +พ่าง +พาชี +พาซื่อ +พาณ +พาณ- +พาณโยชน์ +พาณวาร +พาณาสน์ +พาณิช +พาณิชย์ +พาณินี +พาณี +พาด +พาดควาย +พาดไฉน +พาดพิง +พาดหัวข่าว +พาต +พาท +พาทย์ +พาธ +พาธา +พาน +พ่าน +พานกลีบบัว +พานปากกระจับ +พานร +พานรินทร์ +พานเรศ +พานแว่นฟ้า +พาม +พาย +พ่าย +พายม้า +พายเรือคนละที +พายเรือทวนน้ำ +พายเรือในหนอง +พายเรือในอ่าง +พายัพ +พายุ +พาร์เซก +พารณ +พารณะ +พารา +พาราฟิน +พาล +พาลกระแชง +พาลรีพาลขวาง +พาลา +พาลี +พาลีหลายหน้า +พาลุก +พาโล +พาไล +พาส +พาสน์ +พาสนา +พาสุกรี +พาห +พ่าห์ +พาหนะ +พาหะ +พาหา +พาหิรกะ +พาหิระ +พาหุ +พาหุยุทธ์ +พาหุรัด +พาเหียร +พาฬ +พาฬ- +พาฬมฤค +พาฬหะ +พำ +พำนัก +พำพวก +พำพึม +พำๆ พึมๆ +พำลา +พิกล +พิกเลนทรีย์ +พิกสิต +พิกัด +พิกัดอัตราศุลกากร +พิกัติ +พิกัน +พิการ +พิกุล +พิกุลป่า +พิเคราะห์ +พิฆน์ +พิฆเนศ +พิฆเนศวร +พิฆาต +พิง +พิจย +พิจล +พิจัย +พิจาร +พิจารณ์ +พิจารณา +พิจิก +พิจิต +พิจิตร +พิชญ์ +พิชย +พิชัย +พิชัยสงคราม +พิชาน +พิชิต +พิชิต- +พิชิตมาร +พิเชฐ +พิเชียร +พิฑูรย์ +พิณ +พิณพาทย์ +พิดทูล +พิดรก +พิดาน +พิโดร +พิตร +พิถย- +พิถยันดร +พิถี +พิถีพิถัน +พิทย- +พิทย์ +พิทยา +พิทยาคม +พิทยาคาร +พิทยาธร +พิทยาพล +พิทยาลัย +พิทักษ์ +พิทักษ์สันติ +พิทูร +พิเทศ +พิธาน +พิธี +พิธีกร +พิธีกรรม +พิธีการ +พิธีจุ่ม +พิธีแตก +พิธีธรรม +พิธีมณฑล +พิธีรีตอง +พิธีสาร +พิธุ +พิธุร +พินทุ +พินทุกัป +พินทุสร +พินพง +พิ่นพั่ง +พินอบพิเทา +พินัย +พินัยกรรม +พินาศ +พินิจ +พินิต +พินิศ +พินิศจัย +พิเนต +พิบัติ +พิบาก +พิบุล +พิบูล +พิปริต +พิปลาส +พิปัสสนา +พิพรรธ +พิพรรธน์ +พิพักพิพ่วน +พิพัฒ +พิพัฒน์ +พิพากษ์ +พิพากษา +พิพาท +พิพิธ +พิพิธ- +พิพิธภัณฑ์ +พิพิธภัณฑสถาน +พิภพ +พิภัช +พิภาค +พิภูษณะ +พิเภก +พิมปะการัง +พิมพ- +พิมพ์ +พิมพการัง +พิมพ์เขียว +พิมพ์ใจ +พิมพ์ดีด +พิมพ์ทอง +พิมพ์ลายมือ +พิมพ์สัมผัส +พิมพา +พิมพาภรณ์ +พิมโพหนะ +พิมล +พิมเสน +พิมาน +พิมุข +พิโมกข์ +พิโมกษ์ +พิโยกพิเกน +พิโยค +พิร +พิรอด +พิรากล +พิราบ +พิราม +พิราลัย +พิริย- +พิริยพฤนท์ +พิริยโยธา +พิริยะ +พิรี้พิไร +พิรุณ +พิรุธ +พิรุฬห์ +พิเราะ +พิโรธ +พิโรธนะ +พิไร +พิลังกาสา +พิลาป +พิลาลส +พิลาส +พิลิปดา +พิลึก +พิลึกกึกกือ +พิลึกพิลั่น +พิโลน +พิโลล +พิไล +พิศ +พิศวง +พิศวาส +พิศาล +พิศุทธ์ +พิศุทธิ์ +พิเศษ +พิษ +พิษ- +พิษฐาน +พิษนาศน์ +พิษสง +พิษสมโยค +พิษสุนัขบ้า +พิษสุราเรื้อรัง +พิสดาร +พิสมร +พิสมัย +พิสมัยเรียงหมอน +พิสัง +พิสัช +พิสัญญี +พิสัย +พิสิฐ +พิสุทธิ์ +พิสูจน์ +พิหค +พิหเคนทร์ +พิหาร +พิฬาร +พี +พี่ +พี้ +พีชคณิต +พี่น้อง +พี่เบิ้ม +พี้โพ้ +พีร- +พีระมิด +พี่เลี้ยง +พึง +พึ่ง +พึ่งจมูกคนอื่นหายใจ +พึงใจ +พึงตา +พึ่งลำแข้งตัวเอง +พึ่บ +พึม +พึมพำ +พืช +พืชคาม +พืชชั้นต่ำ +พืชชั้นสูง +พืชพันธุ์ +พืด +พื้น +พื้นๆ +พื้นความรู้ +พื้นฐาน +พื้นดี +พื้นเดิม +พื้นที่ +พื้นบ้าน +พื้นเพ +พื้นเมือง +พื้นเสีย +พุ +พุก +พุกาม +พุง +พุ่ง +พุงแก +พุงจง +พุงดอ +พุงทะลาย +พุงปลา +พุงปลาช่อน +พุงพวง +พุงพ่วง +พุ่งหลาว +พุ่งหอกเข้ารก +พุ่งแหลน +พุฒ +พุฒิ +พุด +พุดตาน +พุทธ +พุทธ- +พุทธกาล +พุทธคุณ +พุทธจักร +พุทธเจดีย์ +พุทธชาด +พุทธฎีกา +พุทธตันตระ +พุทธปฏิมา +พุทธปฏิมากร +พุทธมามกะ +พุทธรักษา +พุทธศักราช +พุทธศาสนิกชน +พุทธสมัย +พุทธะ +พุทธังกูร +พุทธันดร +พุทธางกูร +พุทธาวาส +พุทธิ +พุทธุปบาทกาล +พุทโธ่ +พุทรา +พุธ +พุพอง +พุ่ม +พุ่มข้าวบิณฑ์ +พุ่มพวง +พุ่มม่าย +พุมเรียง +พุ้ย +พู +พู่ +พู่กลิ่น +พู่กัน +พูกาม +พูด +พูดคล่องเหมือนล่องน้ำ +พูดจนลิงหลับ +พูดจริงทำจริง +พูดเป็นต่อยหอย +พูดเป็นนัย +พูดเป็นน้ำไหลไฟดับ +พูดเป็นไฟ +พูดไปสองไพเบี้ย นิ่งเสียตำลึงทอง +พูดอย่างมะนาวไม่มีน้ำ +พูน +พู้น +พูพอน +พู่ระหง +เพ +เพ็ก +เพกา +เพคะ +เพ็ง +เพ่ง +เพ่งเล็ง +เพ็จ +เพ็จไม้ +เพชฉลูกรรม +เพชฌฆาต +เพชร +เพชร- +เพชรกลับ +เพชรซีก +เพชรดา +เพชรตัดเพชร +เพชรตาแมว +เพชรน้ำค้าง +เพชรน้ำหนึ่ง +เพชรนิลจินดา +เพชรปาณี +เพชรร่วง +เพชรร้าว +เพชรฤกษ์ +เพชรลูก +เพชรสังฆาต +เพชรหลีก +เพชรหึง +เพชรายุธ +เพ็ญ +เพฑูริย์ +เพณี +เพ็ดทูล +เพดาน +เพดานบิน +เพตร +เพท +เพทนา +เพทาย +เพทุบาย +เพโท +เพโทบาย +เพ่นพ่าน +เพนียด +เพไนย +เพ้ย +เพรง +เพรซีโอดิเมียม +เพรา +เพรางาย +เพราพริ้ง +เพราเพริศ +เพราะ +เพราะฉะนั้น +เพราะว่า +เพริด +เพริศ +เพริศพราย +เพริศพริ้ง +เพริศแพร้ว +เพรียก +เพรียกพร้อง +เพรียง +เพรียงคอห่าน +เพรียงเมือง +เพรียบ +เพรี้ยม +เพรี้ยมพราย +เพรียว +เพรียวลม +เพรื่อ +เพรือง +เพล +เพลง +เพลงเชิด +เพลงตระเชิญ +เพลงยาว +เพลงสาธุการ +เพลงเสมอ +เพลงหน้าพาทย์ +เพล็ด +เพล้โพล้ +เพลา +เพลาะ +เพลาะแพละ +เพลิง +เพลิงกัลป์ +เพลิงฟ้า +เพลิดเพลิน +เพลิน +เพลีย +เพลี้ย +เพลี่ยง +เพลี่ยงพล้ำ +เพลียใจ +เพศ +เพศยันดร +เพส +เพสลาด +เพ่อ +เพ้อ +เพ้อเจ้อ +เพอิญ +เพะ +เพา +เพาพะงา +เพาพาล +เพาะ +เพิก +เพิกเฉย +เพิกถอน +เพิง +เพิ่ง +เพิดเพ้ย +เพิ่ม +เพิ่มเติม +เพิ่มพูน +เพี้ย +เพี้ยกวาน +เพี้ยกว้าน +เพียง +เพี้ยง +เพียงดัง +เพียงนั้น +เพียงนี้ +เพียงพอ +เพียงออ +เพียชน์ +เพียน +เพี้ยน +เพี้ยนผัด +เพียบ +เพียบพร้อม +เพียร +เพื่อ +เพื่อน +เพื่อนเกลอ +เพื่อนเจ้าบ่าว +เพื่อนเจ้าสาว +เพื่อนบ้าน +เพื่อนฝูง +แพ +แพ้ +แพขนานยนต์ +แพง +แพ่ง +แพงพวย +แพงพวยฝรั่ง +แพ็งแพว +แพแตก +แพทย- +แพทย์ +แพทยศาสตร์ +แพทยา +แพ้ท้อง +แพน +แพ่น +แพนก +แพนงเชิง +แพ้เป็นพระ ชนะเป็นมาร +แพ้เปรียบ +แพ้ผม +แพ้ผัว +แพ้ฟัน +แพ้ภัยตัว +แพ้เมีย +แพร +แพร่ +แพรก +แพร่ข่าว +แพร่ง +แพร่งพราย +แพรว +แพร้ว +แพรวพราย +แพรวพราว +แพร่หลาย +แพ้รู้ +แพ้แรง +แพลง +แพลทินัม +แพลม +แพลเลเดียม +แพละ +แพละโลม +แพลูกบวบ +แพว +แพ้ว +แพศย์ +แพศยา +แพะ +แพะรับบาป +แพะโลม +โพ +โพก +โพกพาย +โพง +โพงพาง +โพชฌงค์ +โพซิตรอน +โพด +โพทะเล +โพแทสเซียม +โพธ +โพธิ- +โพธิ์ +โพธิญาณ +โพธิบัลลังก์ +โพธิปักขิยธรรม +โพธิสมภาร +โพธิสัตว์ +โพน +โพ้น +โพนทะนา +โพ้นทะเล +โพนเพน +โพบาย +โพผัน +โพย +โพยก๊วน +โพยม +โพยมยาน +โพยมัน +โพยมาน +โพรก +โพรง +โพรงแสม +โพรโทแอกทิเนียม +โพรมีเทียม +โพระดก +โพล่ +โพลง +โพล่ง +โพล้ง +โพลน +โพล้เพล้ +โพละ +โพสพ +ไพ +ไพ่ +ไพจิตร +ไพชน +ไพชยนต์ +ไพฑูรย์ +ไพโดร +ไพที +ไพบูลย์ +ไพ่ป๊อก +ไพพรรณ +ไพเพิด +ไพ่ไฟ +ไพมอก +ไพม้า +ไพร +ไพร่ +ไพรคิ้ว +ไพรจิตร +ไพรชน +ไพรชยนต์ +ไพรฑูรย์ +ไพรที +ไพรบูลย์ +ไพรปาก +ไพร่พล +ไพร่ฟ้า +ไพรระหง +ไพรเราะ +ไพรวัน +ไพรสณฑ์ +ไพร่สม +ไพร่ส่วย +ไพรสัณฑ์ +ไพรสาณฑ์ +ไพรสามกอ +ไพร่หลวง +ไพรัช +ไพรัช- +ไพรำ +ไพริน +ไพรินทร์ +ไพรี +ไพรู +ไพเราะ +ไพโรจน์ +ไพล +ไพล่ +ไพล่หลัง +ไพศาข +ไพศาข- +ไพศาขบุรณมี +ไพศาขมาส +ไพศาล +ไพเศษ +ไพสพ +ไพสิฐ +ไพหาร +ฟ +ฟก +ฟกช้ำดำเขียว +ฟ้ง +ฟรักโทส +ฟรี +ฟรีบาร์ +ฟลูออรีน +ฟ่อ +ฟ้อ +ฟอก +ฟอกซัก +ฟอกผ้า +ฟอกพยาน +ฟอกโลหิต +ฟอกหนัง +ฟอง +ฟ่อง +ฟ้อง +ฟ้องกลับ +ฟองกาม +ฟ้องตัวเอง +ฟองเต้าหู้ +ฟองทะเล +ฟองน้ำ +ฟ่องฟู +ฟองมัน +ฟ้องแย้ง +ฟ้องร้อง +ฟอด +ฟอดแฟด +ฟอน +ฟ่อน +ฟ้อน +ฟ้อแฟ้ +ฟอร์มาลดีไฮด์ +ฟอร์มาลิน +ฟอสฟอรัส +ฟอสเฟต +ฟะฟัด +ฟะฟั่น +ฟะฟ่าย +ฟัก +ฟักข้าว +ฟักตัว +ฟักทอง +ฟักฟุ้น +ฟักฟูม +ฟักเหลือง +ฟัง +ฟังก์ชัน +ฟังขึ้น +ฟังได้ +ฟังไม่ได้ศัพท์ จับไปกระเดียด +ฟังหูไว้หู +ฟังออก +ฟัด +ฟัดเฟียด +ฟัน +ฟั่น +ฟั้น +ฟันคลื่น +ฟันช้าง +ฟันดาบ +ฟันถาวร +ฟันแท้ +ฟันน้ำนม +ฟันปลา +ฟันฝ่า +ฟั่นเฝือ +ฟันเฟือง +ฟั่นเฟือน +ฟันม้า +ฟันเลื่อย +ฟันหนู +ฟันหลอ +ฟ้า +ฟาก +ฟ้าคะนอง +ฟ้าเคืองสันหลัง +ฟาง +ฟ่าง +ฟางลอย +ฟาด +ฟาดเคราะห์ +ฟาดหัว +ฟาทอม +ฟาน +ฟ้าผ่า +ฟ้าฝ่อ +ฟ่าม +ฟ้ามุ่ย +ฟ้าไม่กระเทือนสันหลัง +ฟาย +ฟายน้ำตา +ฟายมือ +ฟาร์ม +ฟ้าร้อง +ฟ้าแลบ +ฟาสซิสต์ +ฟ้าหลัว +ฟิก +ฟิด +ฟิบ +ฟิล์ม +ฟิวส์ +ฟิสิกส์ +ฟี่ +ฟี้ +ฟืน +ฟื้น +ฟื้นตัว +ฟื้นฝอย +ฟื้นฟู +ฟื้นองค์ +ฟืม +ฟุ +ฟุ้ง +ฟุ้งซ่าน +ฟุ้งเฟ้อ +ฟุ้งเฟื่อง +ฟุต +ฟุตบอล +ฟุน +ฟุบ +ฟุ่บ +ฟุฟะ +ฟุ่มเฟือย +ฟุลสแก๊ป +ฟู +ฟู่ +ฟูก +ฟูด +ฟูดฟาด +ฟูฟ่อง +ฟูม +ฟูมน้ำ +ฟูมฟัก +ฟูมฟาย +ฟูมเลี้ยง +เฟ็ด +เฟ็ดหาว +เฟ้น +เฟลด์สปาร์ +เฟ้อ +เฟอร์เมียม +เฟอะ +เฟอะฟะ +เฟะ +เฟะฟะ +เฟิน +เฟี้ยม +เฟี้ยมเฝ้า +เฟี้ยว +เฟือ +เฟื่อ +เฟื้อ +เฟือง +เฟื่อง +เฟื้อง +เฟื่องฟ้า +เฟื่องฟุ้ง +เฟื่องฟู +เฟือน +เฟือย +เฟื้อย +แฟ่ +แฟง +แฟชั่น +แฟบ +แฟ้ม +แฟรนเซียม +แฟลกซ์ +แฟลต +แฟะ +โฟกัส +ไฟ +ไฟกัลป์ +ไฟจุกตูด +ไฟฉาย +ไฟแช็ก +ไฟธาตุ +ไฟฟ้า +ไฟฟ้ากระแส +ไฟฟ้าสถิต +ไฟลามทุ่ง +ไฟสุมขอน +ภ +ภค +ภควดี +ภควัต +ภควันต์ +ภควัม +ภควา +ภควาน +ภคันทลา +ภคินี +ภณ +ภณิดา +ภพ +ภมการ +ภมร +ภมริน +ภมรี +ภมุ +ภมุกะ +ภมุกา +ภย- +ภยันตราย +ภยาคติ +ภร +ภรณี +ภรณีภู +ภรต +ภรต- +ภรตวรรษ +ภรตศาสตร์ +ภรรดร +ภรรดา +ภรรยา +ภระมร +ภระมรี +ภรัสดาษ +ภราดร +ภราดรภาพ +ภราดา +ภราตร- +ภราตรภาพ +ภราตฤ- +ภราตฤภาพ +ภริยา +ภรู +ภรูมณฑล +ภฤงคาร +ภฤดก +ภฤดี +ภฤตย์ +ภฤศ +ภฤษฏ์ +ภว +ภว- +ภวกษัย +ภวตัณหา +ภวนะ +ภวปาระ +ภวัคร +ภวังค- +ภวังค์ +ภวังคจิต +ภวันดร +ภวาภพ +ภักขะ +ภักดี +ภักต- +ภักตกฤตย์ +ภักตะ +ภักติ +ภักษ- +ภักษ์ +ภักษการ +ภักษา +ภักษาหาร +ภัค +ภัคน์ +ภังค- +ภังคะ +ภังคี +ภัจ +ภัญชะ +ภัณฑ- +ภัณฑ์ +ภัณฑครรภ +ภัณฑนะ +ภัณฑาคาร +ภัณฑาคาริก +ภัณฑารักษ์ +ภัณฑู +ภัณฑูกรรม +ภัต +ภัต- +ภัตกิจ +ภัตตาคาร +ภัตตาหาร +ภัตร +ภัทร +ภัทร- +ภัทรกัป +ภัทรกุมภ์ +ภัทรบทมาส +ภัทรบิฐ +ภัพ +ภัย +ภัสดา +ภัสตรา +ภัสมะ +ภัสสร +ภา +ภากร +ภาค +ภาค- +ภาคตัดกรวย +ภาคทฤษฎี +ภาคทัณฑ์ +ภาคนิพนธ์ +ภาคปฏิบัติ +ภาคพื้น +ภาคภูมิ +ภาคย์ +ภาคยานุวัติ +ภาคเรียน +ภาคเสธ +ภาคินี +ภาคิไนย +ภาคี +ภาคียะ +ภาชนะ +ภาชนีย- +ภาชี +ภาณ +ภาณ- +ภาณก +ภาณวาร +ภาณี +ภาณุ +ภาณุมาศ +ภาดร +ภาดา +ภาตร +ภาตา +ภาติกะ +ภาติยะ +ภาตุ +ภาพ +ภาพ- +ภาพกาก +ภาพจริง +ภาพถ่าย +ภาพนิ่ง +ภาพประกอบ +ภาพปูนเปียก +ภาพพจน์ +ภาพย์ +ภาพยนตร์ +ภาพลวงตา +ภาพลักษณ์ +ภาพเสมือน +ภาพหุ่นนิ่ง +ภาม +ภาย +ภายนอก +ภายใน +ภายหน้า +ภายหลัง +ภาร +ภาร- +ภารกิจ +ภารดี +ภารต +ภารต- +ภารตวิทยา +ภารตี +ภารธุระ +ภารยทรัพย์ +ภารยา +ภารโรง +ภาระ +ภาระจำยอม +ภาระติดพัน +ภาระติดพันในอสังหาริมทรัพย์ +ภารา +ภาว- +ภาวนา +ภาวนามัย +ภาวศุทธิ +ภาวะ +ภาวะฉุกเฉิน +ภาษ +ภาษก +ภาษณ์ +ภาษา +ภาษาศาสตร์ +ภาษิต +ภาษี +ภาษีเงินได้ +ภาษีบำรุงท้องที่ +ภาษีมูลค่าเพิ่ม +ภาษีโรงเรือนและที่ดิน +ภาษีสรรพสามิต +ภาส +ภาส- +ภาสกร +ภาสน์ +ภาสวร +ภาสา +ภาสุร +ภิกขา +ภิกขาจาร +ภิกขาหาร +ภิกขุ +ภิกขุนี +ภิกษา +ภิกษาจาร +ภิกษาหาร +ภิกษุ +ภิกษุณี +ภิงคาร +ภิงส +ภิงสนะ +ภิงสร +ภิญโญ +ภิญโญภาพ +ภิตติ +ภิท +ภิน- +ภินชาติ +ภินท- +ภินท์ +ภินทน- +ภินทนาการ +ภินวรรณ +ภิยโย +ภิยโยภาพ +ภิรมย์ +ภิรมย์สุรางค์ +ภิษัช +ภิส +ภิสัก +ภีตะ +ภีม +ภีรุ +ภีรุก- +ภีรุกชาติ +ภุกต- +ภุกต์ +ภุกตเศษ +ภุกตาหาร +ภุขัน +ภุช +ภุช- +ภุชค +ภุชงค์ +ภุชงคประยาต +ภุชงคม +ภุชสมโภค +ภุชา +ภุญช +ภุต +ภุม +ภุม- +ภุมเทวดา +ภุมระ +ภุมรัตน์ +ภุมรา +ภุมริน +ภุมรี +ภุมเรศ +ภุมวาร +ภุส +ภู +ภู่ +ภูเขา +ภูเขาน้ำแข็ง +ภูเขาไฟ +ภูโช +ภูดล +ภูดาด +ภูต +ภูต- +ภูตคาม +ภูตบดี +ภูตรูป +ภูติ +ภูตี +ภูเตศวร +ภูธร +ภูธเรศ +ภูธเรศวร +ภูนาถ +ภูนายก +ภูเนตุ +ภูบดินทร์ +ภูบดี +ภูบาล +ภูเบนทร์ +ภูเบศ +ภูเบศวร์ +ภูป +ภูผา +ภูภุช +ภูม +ภูมิ +ภูมิ- +ภูมิคุ้มกัน +ภูมิใจ +ภูมิฐาน +ภูมิธร +ภูมิธรรม +ภูมินทร์ +ภูมินาถ +ภูมิบดี +ภูมิบริมาณ +ภูมิบาล +ภูมิประเทศ +ภูมิปัญญา +ภูมิแพ้ +ภูมิภาค +ภูมิภุช +ภูมิรัฐศาสตร์ +ภูมิรู้ +ภูมิลำเนา +ภูมิศาสตร์ +ภูมิศาสตร์กายภาพ +ภูมิศาสตร์การเกษตร +ภูมิศาสตร์การเมือง +ภูมิศาสตร์ประชากร +ภูมิศาสตร์ประวัติ +ภูมิศาสตร์เศรษฐกิจ +ภูมี +ภูมีศวร +ภูรโลก +ภูริ +ภูรี +ภูว- +ภูวดล +ภูวน- +ภูวนตรัย +ภูวนัตตรัย +ภูวนาถ +ภูวเนตร +ภูวไนย +ภูษณ- +ภูษณพาส +ภูษา +ภูษามาลา +ภูษาโยง +ภูษิต +เภกะ +เภคะ +เภตรา +เภท +เภทภัย +เภทุบาย +เภรว +เภริ +เภรี +เภสัช +เภสัช- +เภสัชกร +เภสัชกรรม +เภสัชเคมี +เภสัชพฤกษศาสตร์ +เภสัชเพลา +เภสัชวิทยา +เภสัชเวท +เภสัชศาสตร์ +เภสัชอุตสาหกรรม +โภค +โภค- +โภคทรัพย์ +โภคภัณฑ์ +โภคยทรัพย์ +โภคะ +โภคิน +โภคี +โภไคย +โภไคศวรรย์ +โภช +โภชก +โภชน- +โภชนะ +โภชนะห้า +โภชนากร +โภชนาการ +โภชนาหาร +โภชย์ +ไภริน +ไภรี +ไภษัชคุรุ +ไภษัชย์ +ม +มก +มกร +มกร- +มกรกุณฑล +มกราคม +มกส +มกุฎ +มกุฎราชกุมาร +มกุล +มคธ +มฆ +มฆวัน +มฆา +ม่ง +มงกุฎ +มงกุฎไทย +มงโกรย +มงคล +มงคล- +มงคลจักร +มงคลแฝด +มงคลวาท +มงคลวาร +มงคลสูตร +มงคลหัตถี +มณฑ์ +มณฑก +มณฑนะ +มณฑป +มณฑล +มณฑา +มณฑารพ +มณฑิร +มณเฑียร +มณเฑียรบาล +มณี +มณีการ +มณีพืช +มณีรัตน์ +มณีราค +มณีศิลา +มด +มดดำ +มดแดง +มดแดงเฝ้ามะม่วง +มดเท็จ +มดยอบ +มดลูก +มดส้ม +มดาย +มดี +มต- +มตก +มตกภัต +มตะ +มติ +มติมหาชน +มท +มทนะ +มทนียะ +มธุ +มธุกร +มธุกรี +มธุการี +มธุโกศ +มธุตฤณ +มธุป +มธุปฎล +มธุปายาส +มธุพรต +มธุมักขิกา +มธุมิศร +มธุร- +มธุรตรัย +มธุรพจน์ +มธุรส +มธุระ +มธุลีห์ +มธุเศษ +มธุสร +มน +ม่น +มนต์ +มนตร์ +มนตรี +มนท- +มนท์ +มนทกานติ +มนทาทร +มนทิร +มนทิราลัย +มนเทียร +มนเทียรบาล +มนสิการ +มนัส +มนัส- +มนัสดาป +มนัสวี +มนิมนา +มนิลา +มนีมนา +มนุ +มนุช +มนุชาธิป +มนุญ +มนุษย- +มนุษย์ +มนุษย์กบ +มนุษยชาติ +มนุษยเทพ +มนุษยธรรม +มนุษยโลก +มนุษยศาสตร์ +มนุษยสัมพันธ์ +มนุษย์อวกาศ +มนุสาร +มนู +มนูสาร +มโน +มโนกรรม +มโนคติ +มโนช +มโนชญ์ +มโนธรรม +มโนนุกูล +มโนภาพ +มโนภินิเวศ +มโนมัย +มโนรถ +มโนรม +มโนรมย์ +มโนราห์ +มโนศิลา +มโนสาร +มโนสาเร่ +มโนหร +มมังการ +มมาก +มยุร- +มยุรคติ +มยุรฉัตร +มยุรอาสน์ +มยุระ +มยุรา +มยุรี +มยุเรศ +มยูข +มยูร +มร +มรกต +มรคา +มรฑป +มรณ- +มรณ์ +มรณกรรม +มรณธรรม +มรณบัตร +มรณภัย +มรณภาพ +มรณะ +มรณันติก- +มรณานต์ +มรดก +มรรค +มรรคนายก +มรรคา +มรรตย +มรรตัย +มรรทน +มรรยาท +มรรษ +มรสุม +มรัมเทศ +มรานควาน +มริจ +มริยาท +มรีจิ +มรุ +มรุต +มฤค +มฤค- +มฤคทายวัน +มฤคย์ +มฤคราช +มฤคศิร +มฤคศิรมาส +มฤคศิรัส +มฤคเศียร +มฤคินทร์ +มฤเคนทร์ +มฤจฉา +มฤจฉาชีพ +มฤจฉาทิฐิ +มฤดก +มฤต +มฤตก +มฤตยู +มฤตยูราช +มฤทิงค์ +มฤทุ +มฤทุกะ +มฤธุ +มฤษา +มฤษาวาท +มล +มล- +มลโค +มลทิน +มลน +มล่น +มลนมลาน +มลพิษ +มลวก +มล่อน +มล่อย +มละ +มลัก +มลังเมลือง +มล้า +มลาก +มล้าง +มลาน +มล่าน +มลาย +มลายู +มลาว +มล่าวเมลา +มลิน +มลิ้น +มลื่น +มวก +มวกผา +มวกเหล็ก +มวกใหญ่ +ม่วง +มวน +ม่วน +ม้วน +ม้วนต้วน +ม้วนเสื่อ +ม้วนหน้า +มวย +ม้วย +มวยไทย +มวยปล้ำ +มวยล้ม +มวยวัด +มวยสากล +มวยหมู่ +มวล +มวลสาร +มวลอากาศ +มสาร +มสารก +มสารคัล +มสิ +มหกรรม +มหรณพ +มหรรฆ +มหรรณพ +มหรสพ +มหัคฆ +มหัจฉริย- +มหัจฉริยะ +มหัณณพ +มหัต +มหัทธนะ +มหันต- +มหันต์ +มหันตโทษ +มหัพภาค +มหัล +มหัลกะ +มหัศจรรย์ +มหา +มหากฐิน +มหากาฬ +มหาขันธก +มหาจักร +มหาชน +มหาชัย +มหาชาติ +มหาโชตรัต +มหาดไทย +มหาดเล็ก +มหาดเล็กรายงาน +มหาตมะ +มหาไถ่ +มหาเทพ +มหาเทพี +มหาเทวี +มหาธาตุ +มหานสะ +มหานิกาย +มหานิล +มหาบพิตร +มหาบัณฑิต +มหาพน +มหาพรหม +มหาภารต +มหาภิเนษกรมณ์ +มหาภูต +มหาเมฆ +มหายาน +มหายุค +มหารณพ +มหาราช +มหาราชลีลา +มหาฤกษ์ +มหาละลวย +มหาละลาย +มหาวงศ์ +มหาวรรค +มหาวิทยาลัย +มหาศาล +มหาสงกรานต์ +มหาสดมภ์ +มหาสดำ +มหาสมุทร +มหาสาวก +มหาหงส์ +มหาหิงคุ์ +มหาอำนาจ +มหาอุจ +มหาอุด +มหาอุปรากร +มหิ +มหิงส์ +มหิดล +มหิทธิ +มหิธร +มหินท์ +มหิบดี +มหิบาล +มหิป +มหิมา +มหิศร +มหิศวร +มหิษ +มหิษี +มหึมา +มหุดิฤกษ์ +มหุรดี +มหู +มเหนทร์ +มเหยงค์ +มเหศ +มเหศวร +มเหศักดิ์ +มเหสักข์ +มเหสิ +มเหสี +มเหาษธ +มเหาฬาร +มโหฆ +มโหรสพ +มโหระทึก +มโหรี +มโหษธ +มโหฬาร +มไหศวรรย์ +มอ +มอคราม +มอง +มองโกลอยด์ +มองคร่อ +มองเสี้ยว +มอซอ +มอญ +มอญซ่อนผ้า +มอญตีดั้ง +มอด +ม่อต้อ +มอเตอร์ +มอน +ม่อน +มอนไข่ +มอบ +มอบฉันทะ +มอบหมาย +มอบอำนาจ +มอม +มอมเมา +มอมแมม +มอมเหล้า +ม่อย +มอร์ฟีน +มอระกู่ +มอลโทส +ม่อลอกม่อแลก +มอหมึก +ม่อห้อม +ม่อฮ่อม +มะ +มะกรูด +มะกล่ำ +มะกอก +มะกอกน้ำ +มะกอกบ้าน +มะกอกป่า +มะกอกฝรั่ง +มะกอกพราน +มะกอกสามตะกร้าปาไม่ถูก +มะก่อง +มะกะโรนี +มะกา +มะเกลือ +มะเกี๋ยง +มะข่วง +มะขวิด +มะขาม +มะขามคราบหมู +มะขามเทศ +มะขามป้อม +มะขามเปียก +มะเขือ +มะเขือทวาย +มะเขือเทศ +มะเขือพวง +มะเขือมอญ +มะแข่น +มะคะ +มะคังแดง +มะค่า +มะค่าแต้ +มะค่าโมง +มะค่าหนาม +มะค่าใหญ่ +มะคำไก่ +มะคำดีควาย +มะงัน +มะงั่ว +มะงุมมะงาหรา +มะซัก +มะซาง +มะซ่าน +มะดะขี้นก +มะดัน +มะดา +มะดูก +มะเดหวี +มะเดื่อ +มะเดื่อดิน +มะต้อง +มะตะบะ +มะตาด +มะตาหะรี +มะตี +มะตึ่ง +มะตื๋น +มะตูม +มะแตก +มะนาว +มะนาวเทศ +มะปราง +มะปริง +มะป่อง +มะป่องต้น +มะฝ่อ +มะพร้าว +มะพร้าวแก้ว +มะพร้าวตื่นดก +มะพร้าวทุย +มะพร้าวห้าว +มะพลับ +มะพูด +มะแพน +มะแพร้ว +มะเฟือง +มะแฟน +มะไฟ +มะไฟเดือนห้า +มะม่วง +มะม่วงหิมพานต์ +มะม่าว +มะมี่ +มะมื่น +มะมุด +มะเมอ +มะเมีย +มะเมื่อย +มะแม +มะยง +มะยงชิด +มะยม +มะระ +มะริด +มะรืน +มะรุม +มะรุมมะตุ้ม +มะเร็ง +มะเรื่อง +มะโรง +มะละกอ +มะลารอกัน +มะลำ +มะลิ +มะลิซ่อม +มะลิน +มะลิ่ม +มะลิเลื้อย +มะลิอ่อง +มะลื่น +มะลืมดำ +มะลุลี +มะวาร +มะแว้ง +มะสัง +มะเส็ง +มะหลิ่ม +มะหวด +มะหะหมัด +มะหัล +มะหาด +มะหิ่ง +มะเหงก +มะเหมื่อย +มะอึก +มะฮอกกานี +มัก +มักกะลีผล +มักกะสัน +มักขะ +มั่กขั้ก +มักขิกา +มักขิกาชาติ +มักคุ้น +มักง่าย +มักฏกะ +มักฏะ +มักได้ +มักน้อย +มักมาก +มักใหญ่ +มัค- +มัคคะ +มัคคุเทศก์ +มัคนายก +มัคสิระ +มัฆวา +มัฆวาน +มั่ง +มังกง +มังกร +มังกุ +มังคละ +มั่งคั่ง +มังค่า +มังคุด +มังตาน +มั่งมี +มั่งมีในใจ แล่นใบบนบก +มังส- +มังสวิรัติ +มังสะ +มังสี +มังหงัน +มัจจะ +มัจจุ +มัจจุราช +มัจฉระ +มัจฉริยะ +มัจฉรี +มัจฉะ +มัจฉา +มัจฉาชาติ +มัช- +มัชชะ +มัชชาร +มัชฌ- +มัชฌันติก- +มัชฌันติกสมัย +มัชฌิม- +มัชฌิมนิกาย +มัชฌิมบุรุษ +มัชฌิมประเทศ +มัชฌิมภูมิ +มัชฌิมยาม +มัชฌิมวัย +มัชฌิมา +มัชฌิมาปฏิปทา +มัชวิรัติ +มัญจก +มัญจา +มัญชิษฐ +มัญชิษฐา +มัญชีร +มัญชุ +มัญชุสา +มัญชูสา +มัญเชฏฐะ +มัญเชฏฐิกา +มัญเชฏฐิกากร +มัญเชียร +มัฏฐะ +มัณฑ- +มัณฑน- +มัณฑนศิลป์ +มัณฑนา +มัณฑุก +มัด +มัดจำ +มัดเชื้อเพลิง +มัดมือชก +มัดหมี่ +มัดหมู +มัดหวาย +มัตตะ +มัตตัญญู +มัตตัย +มัตตา +มัตติกา +มัตถก +มัตถลุงค์ +มัตย +มัตสยะ +มัตสยา +มัตสร +มัตสรรย์ +มัตสริน +มัทนะ +มัทนียะ +มัทยะ +มัธย- +มัธยฐาน +มัธยม +มัธยม- +มัธยมกาล +มัธยมศึกษา +มัธยมา +มัธยันห์ +มัธยัสถ์ +มัน +มั่น +มันแกว +มั่นคง +มั่นใจ +มันดี +มันตา +มันถะ +มันทิร +มันทิราลัย +มันเทศ +มันนก +มันปลา +มันปู +มันฝรั่ง +มันย่อง +มันสมอง +มันเสา +มันไส้ +มั่นหมาย +มั่นเหมาะ +มับ +มับๆ +มั้ม +มัมมี่ +มัย +มัลก +มัลละ +มัลลิกา +มัว +มั่ว +มัวซัว +มัวมอม +มั่วมูล +มัวเมา +มัวเมีย +มั่วสุม +มัวหมอง +มัศยา +มัสดก +มัสดุ +มัสตาร์ด +มัสตุ +มัสมั่น +มัสยิด +มัสรู่ +มัสลิน +มัสสุ +มา +ม้า +มาก +มากขี้ควายหลายขี้ช้าง +มากมาย +มากมายก่ายกอง +มากหน้าหลายตา +มากหมอมากความ +มาแขก +มาคสิร- +มาคสิระ +มาฆ- +มาฆบูชา +มาฆะ +ม้าง +มางสะ +ม้าใช้ +มาณพ +มาณวิกา +มาด +มาดา +ม้าดีดกะโหลก +มาตงค์ +ม้าต้น +มาตร +มาตร- +มาตรการ +มาตรฐาน +มาตรแม้น +มาตรว่า +มาตรา +มาตราพฤติ +มาตราส่วน +มาตฤ +มาตฤกะ +มาตสรรย์ +มาตังค +มาตา +มาตามหะ +มาตามหัยกะ +มาตามหัยกา +มาตามหัยยิกา +มาตามหา +มาติก +มาติกา +มาตี +มาตุ +มาตุคาม +มาตุฆาต +มาตุจฉา +มาตุภูมิ +มาตุรงค์ +มาตุเรศ +มาตุละ +มาตุลา +มาตุลานี +มาตุลุงค์ +มาท +มาทน +ม้าทลายโรง +ม้าเทศ +มาธยมิกะ +มาธุร +มาธุสร +มาธูร +มาน +ม่าน +ม้าน +ม่านตา +มานทะลุน +ม่านบังเพลิง +มานพ +ม่านเมรุ +ม่านลาย +ม่านสองไข +ม่านอินทนิล +มานะ +มานัต +มานัส +ม้าน้ำ +มานิต +มานี +มานุษ +มานุษย- +มานุษยวิทยา +มาโนชญ์ +มาบ +มาปก +มาภา +ม้าม +ม้ามืด +มาย +ม่าย +ม่ายเมียง +ม้าย่อง +มายัง +มายา +มายากร +มายากล +มายาการ +มายาประสาน +มายาวี +มาร +มาร- +มารค +มารคอหอย +มารชิ +มารชิต +มารดร +มารดา +มารผจญ +มารยา +มารยาท +มารวิชัย +มารวิชิต +มารศรี +มารษา +มารสังคม +มารหัวขน +มาระ +มาราธิราช +ม้ารำ +มาริ +มาริต +มารุต +มารุมมาตุ้ม +ม้าเร็ว +มาลย์ +ม้าล่อ +มาลัย +มาลา +มาลากรรม +มาลาการ +มาลาตี +ม้าลาย +มาลาเรีย +มาลำ +มาลินี +มาลี +มาลุต +มาวาร +มาศ +มาส +มาสก +ม้าสะบัดกีบ +มาห์ +ม่าห์ +มาหิส +มาเหนือเมฆ +ม่าเหมี่ยว +มาฬก +ม้าอ้วน +มำเลือง +มิ +มิค +มิค- +มิคลุท +มิคลุทก +มิคเศียร +มิคสัญญี +มิคสิร- +มิคสิระ +มิคี +มิ่ง +มิ่งขวัญ +มิงโค +มิ่งมิตร +มิจฉา +มิจฉากัมมันตะ +มิจฉาจริยา +มิจฉาจาร +มิจฉาชีพ +มิจฉาทิฐิ +มิจฉาบถ +มิจฉาวาจา +มิจฉาวายามะ +มิจฉาสติ +มิจฉาสมาธิ +มิจฉาสังกัปปะ +มิจฉาอาชีวะ +มิญช- +มิด +มิดชิด +มิดเม้น +มิดเมี้ยน +มิดหมี +มิดีมิร้าย +มิได้ +มิต- +มิตภาณี +มิตร +มิตร- +มิตรจิต +มิตรจิตมิตรใจ +มิตรภาพ +มิตรสหาย +มิติ +มิถยา +มิถุน +มิถุนายน +มิทธะ +มิทธี +มินตรา +มินตา +มินหม้อ +มิน่า +มิน่าล่ะ +มิน่าเล่า +มิ่ม +มิ้ม +มิยา +มิไย +มิรันตี +มิลลิกรัม +มิลลิบาร์ +มิลลิเมตร +มิลลิลิตร +มิลักขะ +มิลักขู +มิลาต +มิศร- +มิศรก- +มิส- +มิสก- +มิสกรี +มิสกวัน +มิสซา +มิอย่ารา +มิอย่าเลย +มี +มี่ +มีแก่ใจ +มี่ฉาว +มีชื่อ +มีชู้ +มีด +มีดโกน +มีดตอก +มีดยับ +มีดหมอ +มีตาแต่หามีแววไม่ +มีทองเท่าหนวดกุ้ง นอนสะดุ้งจนเรือนไหว +มีเทน +มีน +มีนาคม +มีเฟื้องมีสลึง +มีภาษีกว่า +มีเรือน +มี่สั้ว +มีเสียง +มีหน้า +มีหน้ามีตา +มีฬห- +มีอันจะกิน +มีอันเป็น +มีอายุ +มึก +มึกมวย +มึง +มึงวาพาโวย +มึน +มึนงง +มึนชา +มึนซึม +มึนตึง +มึนเมา +มืด +มืดค่ำ +มืดแปดด้าน +มืดฟ้ามัวดิน +มืดมน +มืดมัว +มืดหน้า +มืน +มื่น +มือ +มื้อ +มือกาว +มือเก่า +มือขวา +มือขึ้น +มือแข็ง +มือดี +มือตก +มือเติบ +มือถือสาก ปากถือศีล +มือที่สาม +มือบอน +มือเบา +มือปืน +มือผี +มือมืด +มือไม่ถึง +มือไม่พาย เอาตีนราน้ำ +มือเย็น +มือร้อน +มือลิง +มือไว +มือสะอาด +มือสั้นตีนสั้น +มือสี +มือเสือ +มือหนัก +มือหนึ่ง +มือห่างตีนห่าง +มือใหม่ +มืออ่อน +มืออ่อนตีนอ่อน +มุ +มุก +มุกดา +มุกดาหาร +มุกุร +มุกุล +มุข +มุข- +มุขกระสัน +มุขเด็จ +มุขบาฐ +มุขมนตรี +มุขย- +มุขยประโยค +มุขลด +มุโขโลกนะ +มุคคะ +มุคธ์ +มุคร +มุง +มุ่ง +มุ้ง +มุ้งกระต่าย +มุ้งประทุน +มุ่งมาด +มุ่งร้ายหมายขวัญ +มุ้งลวด +มุ้งสายบัว +มุ่งหมาย +มุจฉา +มุจน +มุจลินท์ +มุญจนะ +มุญช +มุฐิ +มุณฑ +มุณฑก +มุด +มุดหัว +มุต +มุต- +มุตกิด +มุตฆาต +มุตตะ +มุตตา +มุตติ +มุติ +มุติงค์ +มุทค +มุทคร +มุททา +มุทธชะ +มุทธา +มุทธาภิเษก +มุทรา +มุทริกา +มุทะลุ +มุทา +มุทิกา +มุทิงค์ +มุทิตา +มุทิน +มุทุ +มุทุตา +มุ่น +มุ่นใจ +มุ่นหมก +มุนิ +มุนิกุญชร +มุนินทร์ +มุนี +มุบ +มุบๆ +มุบมิบ +มุม +มุ่ม +มุ้ม +มุมกดลง +มุมก้ม +มุมกลับ +มุมเงย +มุมฉาก +มุมตกกระทบ +มุมตรง +มุมเท +มุมบ่ายเบน +มุมประชิด +มุมป้าน +มุมมืด +มุมยกขึ้น +มุมแย้ง +มุมสะท้อน +มุมหักเห +มุมเห +มุมแหลม +มุ่ย +มุรช +มุรธา +มุรธาภิเษก +มุลุต +มุลู +มุสละ +มุสลิม +มุสะ +มุสา +มุสาวาท +มุสิก +มุหงิด +มุหน่าย +มุหุต +มุฮัมมัด +มูก +มูกมัน +มูกเลือด +มูกหลวง +มูค- +มูเซอ +มูตร +มู่ทู่ +มูน +มูนมอง +มูมมาม +มูรดี +มูรติ +มูรธ- +มูรธา +มูรธาภิเษก +มูล +มูล- +มูลค่า +มูลโค +มูลจิต +มูลฐาน +มูลไถ +มูลนกการเวก +มูลนาย +มูลนิธิ +มูลฝอย +มูลภัณฑ์กันชน +มูละ +มูลา +มูลิกากร +มู่ลี่ +มู่เล่ +มูสัง +มูสิก +มูสิก- +มูสิกทันต์ +มูฬห- +เม +เม็ก +เมกะเฮิรตซ์ +เมขลา +เมฆ +เมฆคลุ้ม +เมฆฉาย +เมฆพัด +เมฆมาก +เมฆา +เมฆินทร์ +เมฆี +เม็ง +เมงอะปา +เม็ด +เม็ดดี +เม็ดพระศก +เม็ดพราย +เม็ดมะยม +เม็ดละมุด +เม็ดเลือด +เม็ดโลหิต +เมตตา +เมตไตรย +เมตร +เมตริก +เมตริกตัน +เมถุน +เมท +เมทนี +เมทนีดล +เมทินี +เมทิลแอลกอฮอล์ +เมโท +เมธ +เมธา +เมธาวี +เมธี +เมน +เม่น +เม้น +เมนเดลีเวียม +เมนทอล +เม่นทะเล +เม้ม +เม้มปาก +เมรย- +เมรัย +เมรุ +เมรุ- +เมรุมาศ +เมรุราช +เมล์ +เมลก +เมล็ด +เมลือง +เมลื่อย +เมลื้อย +เมลื่อยมล้า +เมษ +เมษายน +เมห +เมห์ +เมหน +เมะ +เมา +เม่า +เม้า +เม้าเค้า +เมาดิบ +เมามัน +เมามัว +เมามาย +เมายศ +เมารี +เมาลี +เมาห์ +เมาอำนาจ +เมาะ +เมาะตาโยกัก +เมาะว่า +เมิง +เมิน +เมิล +เมีย +เมียง +เมี่ยง +เมียงม่าย +เมี้ยน +เมียน้อย +เมียหลวง +เมือ +เมื่อ +เมื้อ +เมือก +เมื่อกี้ +เมือง +เมืองขึ้น +เมืองท่า +เมืองท่าปลอดภาษี +เมืองนอก +เมืองหลวง +เมืองออก +เมื่อตะกี้ +เมื่อนั้น +เมือบ +เมื่อพีเนื้อหอม เมื่อผอมเนื้อเหม็น +เมื่อย +เมื่อยปาก +เมื่อเอยก็เมื่อนั้น +เมื่อเอยเมื่อนั้น +แม่ +แม้ +แมก +แมกนีเซียม +แม่กระชังหน้าใหญ่ +แม่กระแชง +แม่กอง +แม่กุญแจ +แม่คุณ +แม่คู่ +แมง +แมงกวาง +แมงกะพรุน +แมงกานิน +แมงกานีส +แมงคาเรือง +แมงช้าง +แมงดา +แมงดาทะเล +แมงปากจอบ +แมงไฟเดือนห้า +แม่งม้าง +แมงมุม +แมงลัก +แม่งาน +แม่เจ้า +แม่เจ้าโว้ย +แม่ซื้อ +แม่ตะงาว +แม่ตาย +แม่เตาไฟ +แม้แต่ +แม่ทัพ +แม่ท่า +แมน +แม่น +แม้น +แม้นเขียน +แม่นม +แม่นยำ +แม่น้ำ +แม่บท +แม่บ้าน +แม่เบี้ย +แม่ปะ +แม่แปรก +แม่พิมพ์ +แม่มด +แม่ม่าย +แม่ม่ายทรงเครื่อง +แม่ม่ายลองไน +แม่ยั่วเมือง +แม่ย่านาง +แม่ยาย +แม่ย้าว +แมร +แม่ร้า +แม่ร้าง +แม่รีแม่แรด +แม่เรือน +แม่แรง +แมลง +แมลงช้าง +แมลงดา +แมลงดำ +แมลงดำหนาม +แมลงทับเล็ก +แมลงปอ +แมลงภู่ +แมลงวัน +แมลงวันทอง +แมลงวันสเปน +แมลงวันหัวเขียว +แมลบ +แม่ลาย +แม่เล้า +แม่เลี้ยง +แมว +แม้ว +แมวเซา +แมวดาว +แมวน้ำ +แมวป่า +แมวมอง +แม่วี +แม่สายบัวแต่งตัวค้าง +แม่สี +แม่สื่อ +แม่หนัก +แม่หยั่วเมือง +แม่เหย้าแม่เรือน +แม่เหล็ก +แม่อยู่หัว +แมะ +โม +โม่ +โม้ +โมก +โมกข- +โมกข์ +โมกขบริสุทธิ์ +โมกโคก +โมกมัน +โมกษ- +โมกษะ +โมกษะพยาน +โมกใหญ่ +โมฆ- +โมฆกรรม +โมฆะ +โมฆีย- +โมฆียกรรม +โมฆียะ +โมง +โม่ง +โมงครุ่ม +โม่งโค่ง +โมจน- +โมทนา +โมน +โมโนแซ็กคาไรด์ +โมไนย +โมมูห์ +โมมูหะ +โมเม +โมเมนต์ +โมร- +โมรกลาป +โมรา +โมรี +โมเรส +โมลิบดีนัม +โมลี +โมเลกุล +โมษ +โมษก +โมษณ +โมเสก +โมเสส +โมห- +โม่ห์ +โมหะ +โมหันธ์ +โมหาคติ +โมโห +ไม่ +ไม้ +ไม้กง +ไมกา +ไม้กากบาท +ไม้กางเขน +ไม่กี่น้ำ +ไม่กี่อัฐ +ไม่กี่อัฐฬส +ไม้ใกล้ฝั่ง +ไม้ขี้ฉ้อ +ไม้ขีดไฟ +ไม่เข้าใครออกใคร +ไม่เข้ายา +ไม้แข็ง +ไม้คมแฝก +ไมครอน +ไม่ค่อย +ไมโครกรัม +ไมโครฟิล์ม +ไมโครโฟน +ไมโครมิเตอร์ +ไมโครเมตร +ไมโครลิตร +ไมโครเวฟ +ไม่ใคร่ +ไม้งามกระรอกเจาะ +ไม้จริง +ไม้จัตวา +ไม้จำปา +ไม่ชอบมาพากล +ไม่เชิง +ไม่ใช่ขี้ไก่ +ไม้ดัด +ไม้ดำ +ไม่ดูดำดูดี +ไม่ดูดำดูแดง +ไม่ดูตาม้าตาเรือ +ไม้เด็ด +ไม้แดง +ไม่ได้เบี้ยออกข้าว +ไม่ได้เบี้ยเอาข้าว +ไม่ได้ศัพท์ +ไม่ได้สิบ +ไมตรี +ไม้ตรี +ไม้ตาย +ไม้ตายขาน +ไม้ตีพริก +ไม่เต็มเต็ง +ไม่เต็มบาท +ไม่เต็มหุน +ไม้ไต่คู้ +ไม่ถูกโรคกัน +ไม้ทัณฑฆาต +ไม่ทัน +ไม้เท้า +ไม้เท้ายายม่อม +ไม้โท +ไม้นวม +ไม้นอกกอ +ไม้นิ้ว +ไม้บรรทัด +ไม้เบื่อไม้เมา +ไม้ป่าเดียวกัน +ไม้เป็น +ไม้ผัด +ไม่พูดพร่ำทำเพลง +ไม้โพ +ไม่ฟังเสียง +ไม้มลาย +ไม้ม้วน +ไม่มีปี่มีกลอง +ไม่มีมูลฝอยหมาไม่ขี้ +ไม่มีวันเสียละ +ไม้มืด +ไม้มือ +ไม้เมตร +ไม้ยมก +ไมยราบ +ไม้ยามักการ +ไม้ยาว +ไม้ร่มนกจับ +ไม่รู้จักเสือเอาเรือเข้ามาจอด ไม่รู้จักมอดเอาไม้เข้ามาวาง +ไม่รู้จักหัวนอนปลายตีน +ไม่รู้อีโหน่อีเหน่ +ไม้เรียว +ไมล์ +ไม่ลงโบสถ์กัน +ไม้ล้มเงาหาย +ไม้ล้มลุก +ไม้ลอย +ไม้เลี้ยง +ไม้ไล่ +ไม้วา +ไม้สอย +ไม้สั้น +ไม้สั้นไม้ยาว +ไม้สามอัน +ไม่สู้ +ไม้สูง +ไม้หน้า +ไม้หมอน +ไม้หมุน +ไม้หลักปักเลน +ไม้หันอากาศ +ไม้หึ่ง +ไม่เห็นน้ำตัดกระบอก ไม่เห็นกระรอกก่งหน้าไม้ +ไม่เหลือบ่ากว่าแรง +ไม้อ่อนดัดง่าย ไม้แก่ดัดยาก +ไม้อัด +ไม้เอก +ไม่เออออห่อหมก +ไม้โอ +ย +ยก +ยกกระบัตร +ยกครู +ยกเครื่อง +ยกเค้า +ยกตนข่มท่าน +ยกตัวขึ้นเหนือลม +ยกทรง +ยกธงขาว +ยกน +ยกนิ้ว +ยกพื้น +ยกฟ้อง +ยกภูเขาออกจากอก +ยกมือ +ยกเมฆ +ยกยอ +ยกย่อง +ยกยอด +ยกยอปอปั้น +ยกเลิก +ยกเว้น +ยกไว้ +ยกหางตัวเอง +ยกใหญ่ +ยง +ยงโย่ +ยชุรเวท +ยติ +ยติภังค์ +ยถากรรม +ยถาภูตญาณ +ย่น +ยนต์ +ยนตร์ +ย่นย่อ +ยม +ยม- +ยมก +ยมกปาฏิหาริย์ +ยมขันธ์ +ยมโดย +ยมทัณฑ์ +ยมทูต +ยมนา +ยมบาล +ยมราช +ยมล +ยมโลก +ยรรยง +ยล +ยว +ยวกสา +ยวง +ยวด +ยวดยง +ยวดยาน +ยวดยิ่ง +ยวน +ยวนยี +ยวบ +ยวบๆ +ยวบยาบ +ย้วย +ยวรยาตร +ยวา +ยวาคุ +ยศ +ยศอย่าง +ยโส +ยอ +ย่อ +ยอก +ยอกย้อน +ย็อกแย็ก +ย็อกแย็กๆ +ยอง +ยองๆ +ย่อง +ย้อง +ย่องกริบ +ย่องเบา +ย่องแย่ง +ยองใย +ยองไย่ +ย่องเหง็ด +ยอด +ยอดจาก +ยอดด้วน +ยอดดี +ยอดน้ำ +ยอดสร้อย +ย่อท้อ +ยอน +ย้อน +ย้อนเนื้อ +ย้อนยอก +ยอบ +ยอบแยบ +ย่อพล +ยอม +ย่อม +ย้อม +ยอมความ +ย้อมใจ +ย้อมแมวขาย +ย่อมเยา +ย่อมุม +ย่อย +ย้อย +ย่อย่น +ย่อยยับ +ย่อแย่ +ย้อแย้ +ยอแสง +ย่อหน้า +ย่อหย่อน +ย่อแหยง +ยะ +ย่ะ +ยะงันจะคับ +ยะยอบ +ยะยัน +ยะยับ +ยะยาน +ยะย้าย +ยะย้าว +ยะแย้ง +ยะหิทา +ยัก +ยักกระสาย +ยักข์ +ยักขินี +ยักท่า +ยักเพรีย +ยักยอก +ยักย้าย +ยักยิ้ม +ยักยี่ยักยัน +ยักยี่ยักเหยา +ยักเยื้อง +ยักแย่ยักยัน +ยักษ์ +ยักษ์ปักหลั่น +ยักษ์มักกะสัน +ยักษิณี +ยักษี +ยักหยาว +ยักหล่ม +ยัง +ยั้ง +ยังกาหลา +ยังชั่ว +ยั่งยืน +ยังแล้ว +ยังหยัง +ยัชโญปวีต +ยัชน +ยัชมาน +ยัญ +ยัญ- +ยัญกรรม +ยัญญะ +ยัญญังค์ +ยัญพิธี +ยัฐิ +ยัฐิมธุกา +ยัด +ยัดเยียด +ยัติภังค์ +ยัน +ยั่น +ยันต์ +ยันตร- +ยันตร์ +ยันตรกรรม +ยั่นตะนี +ยันเย้า +ยับ +ยับๆ +ยับยง +ยับย่อย +ยับยั้ง +ยับยั้งชั่งใจ +ยับยาน +ยับยาบ +ยับเยิน +ยั่ว +ยั้ว +ยั่วยวน +ยั่วเย้า +ยั้วเยี้ย +ยัวรยาตร +ยัษฏิ +ยา +ย่า +ยาก +ยากแค้น +ยากจน +ยากนาน +ยากเย็น +ยากไร้ +ยาเขียว +ยาค +ยาคุ +ยาคู +ยาง +ย่าง +ยางกราด +ย่างตีน +ย่างทราย +ย่างเท้า +ยางน่อง +ยางบอน +ยางพารา +ยางมะตอย +ย่างเยื้อง +ยางลบ +ยางสน +ย่างสามขุม +ยางอาย +ยาจก +ยาจน +ยาจนก +ยาจนา +ยาจืด +ยาใจ +ยาฉุน +ยาไฉน +ยาชก +ยาด +ยาดา +ยาดำ +ยาแดง +ยาตนา +ยาตร +ยาตรา +ยาตั้ง +ย่าทวด +ยาธาตุ +ยาน +ย่าน +ยานก +ย่านกอบนาง +ยานคาง +ย่านซื่อ +ย่านทราย +ย่านนมควาย +ย่านพาโหม +ยานมาศ +ย่านยาว +ย่านลิเภา +ยานัตถุ์ +ย่านาง +ย่านางช้าง +ยานี +ยานุมาศ +ยาบ +ยาบๆ +ยาปน- +ยาปนมัต +ยาฝอย +ยาแฝด +ยาม +ยาม- +ย่าม +ยามกาลิก +ยามเกา +ยามตูดชาย +ยามพาด +ยามโยค +ยามสามตา +ยามักการ +ยามิก +ยาย +ย้าย +ยายทวด +ยายี +ยาเยีย +ยาว +ย้าว +ยาวกาลิก +ยาวชีวิก +ยาวบั่น สั้นต่อ +ยาวรี +ยาวัส +ยาสลบ +ยาสั่ง +ยาสูบ +ยาเส้น +ยาเสพย์ติด +ยาเสพย์ติดให้โทษ +ยาไส้ +ยาหม้อใหญ่ +ยาหมู่ +ยาหยัง +ย่าหยา +ยาหยี +ยาหัด +ยาอัด +ยำ +ย่ำ +ย้ำ +ยำเกรง +ย่ำเทือก +ยำยาม +ย่ำยี +ยำเยง +ยำเยีย +ย่ำแย่ +ย้ำเหยอ +ยิก +ยิกๆ +ยิง +ยิ่ง +ยิงปืนนัดเดียว ได้นกสองตัว +ยิงฟัน +ยิ่งยวด +ยิฏฐะ +ยิฐ +ยิน +ยินแคลน +ยินใจ +ยินดี +ยินมลาก +ยินยอม +ยินร้าย +ยินลากขากดี +ยิบ +ยิบๆ +ยิปซัม +ยิปซี +ยิ้ม +ยิ้มกริ่ม +ยิ้มแฉ่ง +ยิ้มด้วยปาก ถากด้วยตา +ยิมนาสติก +ยิ้มแป้น +ยิ้มย่อง +ยิ้มเยาะ +ยิ้มแย้ม +ยิ้มละไม +ยิ้มหัว +ยิ้มเหย +ยิ้มแห้ง +ยิ้มแหย +ยิหวา +ยี +ยี่ +ยี้ +ยี่ก่า +ยี่เก +ยี่เข่ง +ยี่โถ +ยี่โถฝรั่ง +ยีน +ยี่โป้ +ยี่ภู่ +ยียวน +ยีราฟ +ยี่สก +ยี่สง +ยี่สน +ยี่สาน +ยี่ส่าน +ยี่สิบ +ยี่สุ่น +ยี่หระ +ยี่หร่า +ยี่หร่าหวาน +ยี่ห้อ +ยี่หุบ +ยึกยือ +ยึด +ยึดครอง +ยึดถือ +ยึดทรัพย์ +ยึดเหนี่ยว +ยืด +ยืดยาด +ยืดเยื้อ +ยืดหยุ่น +ยืน +ยื่น +ยืนกระต่ายสามขา +ยืนกราน +ยื่นแก้วให้วานร +ยืนค้ำหัว +ยืนเครื่อง +ยื่นจมูก +ยืนชิงช้า +ยืนต้น +ยืนพื้น +ยื่นมือ +ยืนยง +ยืนยัน +ยืนยาม +ยืนโรง +ยื่นหมูยื่นแมว +ยืนหยัด +ยืม +ยืมจมูกคนอื่นหายใจ +ยืมใช้คงรูป +ยืมใช้สิ้นเปลือง +ยื้อ +ยื้อยุด +ยุ +ยุกกระบัตร +ยุกดิ +ยุกต์ +ยุกติ +ยุกติธรรม +ยุค +ยุคเข็ญ +ยุคนธร +ยุคล +ยุคลบาท +ยุคันต- +ยุคันต์ +ยุคันตวาต +ยุคันธร +ยุคุนธร +ยุง +ยุ่ง +ยุ้ง +ยุงกวาด +ยุ่งขิง +ยุ่งใจ +ยุงปัด +ยุงปัดแม่ม่าย +ยุ่งยาก +ยุ่งยิ่ง +ยุ่งเหมือนยุงตีกัน +ยุ่งเหยิง +ยุด +ยุต +ยุติ- +ยุติธรรม +ยุทธ- +ยุทธ์ +ยุทธการ +ยุทธนา +ยุทธนาการ +ยุทธนาธิการ +ยุทธภัณฑ์ +ยุทธภูมิ +ยุทธโยธา +ยุทธวิธี +ยุทธวินัย +ยุทธศาสตร์ +ยุทธหัตถี +ยุทโธปกรณ์ +ยุบ +ยุบยอบ +ยุบยับ +ยุบยิบ +ยุบล +ยุพ- +ยุพดี +ยุพยง +ยุพเยาว์ +ยุพราช +ยุพราชา +ยุพเรศ +ยุพา +ยุพาน +ยุพาพาล +ยุพาพิน +ยุ่มย่าม +ยุ่ย +ยุ้ย +ยุยง +ยุแยง +ยุแยงตะแคงแซะ +ยุแยงตะแคงรั่ว +ยุรบาตร +ยุรยาตร +ยุว- +ยุวชน +ยุวดี +ยุวราช +ยุวราชา +ยุวา +ยุวาน +ยุหบาตร +ยุแหย่ +ยุให้รำตำให้รั่ว +ยู +ยู่ +ยูง +ยูโด +ยูถะ +ยูถิกา +ยูปะ +ยู่ยี่ +ยูรยาตร +ยูริก +ยูเรนัส +ยูเรเนียม +ยูโรเพียม +ยูษะ +เยๆ +เย้ +เยง +เยซู +เย็ด +เย็น +เย็นใจ +เย็นชืด +เย็นตา +เย็นตาโฟ +เย็นเตาโฟ +เย็นเยียบ +เย็นเยือก +เย็นหู +เย็บ +เย็บกี่ +เย็บด้าย +เย็บลวด +เย็บเล่ม +เย็บอก +เยภุย- +เยภุยนัย +เยภุยยะ +เยภุยสิกา +เย้ย +เยอ +เย่อ +เยอรมัน +เยอว +เย่อหยิ่ง +เยอะ +เยอะแยะ +เยา +เย้า +เยาว- +เยาว์ +เยาวชน +เยาวน- +เยาวนะ +เยาวพา +เยาวพาณี +เยาวพาน +เยาวมาลย์ +เยาวยอด +เยาวราช +เยาวเรศ +เยาวลักษณ์ +เยาะ +เยิง +เยิน +เยิ่น +เยินยอ +เยิ่นเย้อ +เยิบๆ +เยิบยาบ +เยิ้ม +เยีย +เยี่ยง +เยียงผา +เยี่ยงอย่าง +เยียดยัด +เยียใด +เยียน +เยียบ +เยี่ยม +เยี่ยมๆ มองๆ +เยี่ยมยอด +เยี่ยมเยียน +เยี่ยมเยือน +เยี่ยมวิมาน +เยียมั่ง +เยียรบับ +เยียรยง +เยียว +เยี่ยว +เยี่ยวงัว +เยียวยง +เยียวยา +เยี่ยวอูฐ +เยียใหญ่ +เยือ +เยื่อ +เยื้อ +เยือก +เยือกเย็น +เยื่อเคย +เยือง +เยื่อง +เยื้อง +เยื้องกราย +เยื้องยัก +เยือน +เยื้อน +เยื่อใย +แย่ +แย้ +แยก +แยกเขี้ยว +แยกย้าย +แยกแย้ง +แยกแยะ +แยง +แย่ง +แย้ง +แยงยล +แยงแย่ +แยงแย้ +แย่แต้ +แยบ +แย็บ +แยบคาย +แยบยล +แยม +แย้ม +แย้มพราย +แยแส +แยะ +โย +โย้ +โยก +โยกตร์ +โยกย้าย +โยกเยก +โยกโย้ +โยค- +โยคเกณฑ์ +โยคจักษุ +โยคนิทรา +โยคยะ +โยคะ +โยคาพจร +โยคาวจร +โยคิน +โยคี +โยง +โย่ง +โย่งๆ +โย่งเย่ง +โยงโย่ +โยชก +โยชน์ +โยชนา +โยด +โยต +โยถิกะ +โยทะกา +โยธ- +โยธวาทิต +โยธา +โยธิน +โยน +โยนก +โยนกลอง +โยนกลอน +โยนยาว +โยนหลุม +โยนห่วง +โยนหัวโยนก้อย +โยนิโส +โยนิโสมนสิการ +โยนี +โยพนมัท +โยพนะ +โยม +โยเย +โย้เย้ +โยโส +ใย +ใยฟ้า +ใยยอง +ใยหิน +ไย +ไย่ +ไยดี +ไยไพ +ไยไย +ไย่ไย่ +ร +รก +รกชัฏ +รกช้าง +รกบิน +รกฟ้า +รกราก +รกร้าง +รกเรี้ยว +รง +รงกุ์ +รงค- +รงค์ +รงควัตถุ +รงรอง +รจนา +รจเรข +รจเลข +รจิต +รชกะ +รชตะ +รชนิ +รชนี +รชนีกร +รชนีจร +รชะ +รณ +รณ- +รณเกษตร +รณภู +รณภูมิ +รณรงค์ +รณสถาน +รด +รดน้ำ +รดี +รตนะ +รตะ +รติ +รถ +รถ- +รถจักรยาน +รถจักรยานยนต์ +รถฉุกเฉิน +รถโดยสารประจำทาง +รถปุงคพ +รถปุงควะ +รถไฟ +รถไฟฟ้า +รถยนต์ +รถยา +รถานึก +รเถสภะ +รท +รทนะ +รน +ร่น +ร้น +รนด +รนหาที่ +รบ +รบกวน +รบรา +รบเร้า +รบส +รบาญ +รพ +รพา +รพิ +รพี +รม +ร่ม +ร่มเกล้า +ร่มเกศ +ร่มชูชีพ +รมณี +รมณีย- +รมณีย์ +ร่มธง +ร่มผ้า +ร่มโพธิ์ร่มไทร +ร่มไม้ชายคา +รมย์ +ร่มเย็น +รมเยศ +รยะ +รยางค์ +รวก +รวง +ร่วง +รวงผึ้ง +ร่วงรุ้ง +ร่วงโรย +รวด +รวดเดียว +รวดเร็ว +รวน +ร่วน +รวนเร +รวบ +รวบรวม +รวบรัด +รวบหัวรวบหาง +รวม +ร่วม +ร่วมใจ +ร่วมท้อง +ร่วมประเวณี +ร่วมเพศ +ร่วมมือ +ร่วมรัก +ร่วมเรียงเคียงหมอน +ร่วมหอลงโรง +รวมหัว +ร่วมหัวงาน +ร่วมอุทร +รวย +รวยๆ +รวยริน +รวยรื่น +รวะ +รวิ +รวิวาร +รวี +รศนา +รส +รสก +รสชาติ +รสนา +รสนิยม +รสสุคนธ์ +รสายนเวท +รสิก +รหัท +รหัส +รหิต +รโห +รโหคต +รโหฐาน +รอ +ร่อ +รอก +รอง +ร่อง +ร้อง +ร้องขอ +รองคอ +รองเง็ง +รองจ่าย +รองช้ำ +ร้องฎีกา +รองทรง +รองท้อง +ร้องทุกข์ +รองทุน +รองเท้า +ร่องน้ำ +รองบ่อน +รองพื้น +ร้องเพลง +ร่องมด +ร้องโยนยาว +ร่องรอย +รองรัง +ร้องเรียกร้องหา +ร้องเรียน +ร้องเรือ +ร้องแรก +ร่องแร่ง +ร้องส่ง +ร้องห่ม +ร้องห่มร้องไห้ +ร้องไห้ +รอด +รอดชีวิต +รอดตัว +รอดหูรอดตา +รอน +รอนๆ +ร่อน +ร้อน +ร้อนตัว +ร่อนทอง +ร้อนผ้าเหลือง +ร้อนรน +ร่อนร่อน +ร่อนรับร่อนเร่ +ร่อนเร่ +รอนแรม +ร้อนวิชา +รอนสิทธิ์ +ร้อนอาสน์ +รอบ +รอบคอบ +รอบรู้ +รอม +รอมชอม +รอมร่อ +รอย +ร่อย +ร้อย +ร้อยกรอง +ร้อยแก้ว +ร้อยชั่ง +ร้อยทั้งร้อย +ร้อยแปด +รอยร้าว +ร้อยลิ้น +ร้อยลิ้นกะลาวน +ร้อยสีร้อยอย่าง +ร่อยหรอ +ร้อยหวาย +ร้อยหวี +ร้อยเอ็ด +ร้อยเอ็ดเจ็ดหัวเมือง +ร่อแร่ +ระ +ระกะ +ระกา +ระกำ +ระกำนา +ระกำป่า +ระเกะระกะ +ระคน +ระคาง +ระคาย +ระเค็ดระคาย +ระแคะ +ระแคะระคาย +ระฆัง +ระงม +ระงมไพร +ระงับ +ระงับพิษ +ระงี่ +ระแง้ +ระโงกหิน +ระชวย +ระดม +ระดะ +ระดับ +ระดับทะเล +ระดับทะเลปานกลาง +ระดา +ระด่าว +ระดู +ระดูขาว +ระเด่น +ระเดียง +ระแด +ระตู +ระทก +ระทด +ระทม +ระทวย +ระทอด +ระทา +ระทึก +ระทึง +ระแทะ +ระนัม +ระนาด +ระนาดแก้ว +ระนาดทุ้ม +ระนาดเอก +ระนาบ +ระนาบเอียง +ระนาม +ระนาว +ระเนน +ระเนระนาด +ระเนียด +ระแนง +ระแนะ +ระบบ +ระบบสุริยะ +ระบม +ระบอบ +ระบัด +ระบับ +ระบาญ +ระบาด +ระบานี +ระบานี้ +ระบาย +ระบายสี +ระบำ +ระบิ +ระบิล +ระบิลเมือง +ระบือ +ระบุ +ระเบง +ระเบ็ง +ระเบิด +ระเบิดขวด +ระเบิดทำลาย +ระเบิดน้ำตา +ระเบิดปรมาณู +ระเบิดเพลิง +ระเบิดมือ +ระเบิดเวลา +ระเบิดไฮโดรเจน +ระเบียง +ระเบียน +ระเบียบ +ระเบียบการ +ระเบียบวาระ +ระแบบ +ระใบ +ระฟ้า +ระมัดระวัง +ระมา +ระมาด +ระเมียร +ระย่อ +ระย่อม +ระยะ +ระยัง +ระยั้ง +ระยัด +ระยับ +ระย้า +ระยาน +ระยาบ +ระยำ +ระยำตำบอน +ระยิบระยับ +ระโยง +ระโยงระยาง +ระรวย +ระรอง +ระร่อน +ระรัว +ระราน +ระร่าย +ระราว +ระริก +ระรี่ +ระรึง +ระรื่น +ระรื้น +ระเร +ระเร่ +ระเร้ง +ระเร็ว +ระเริง +ระเรียง +ระเรียม +ระเรื่อย +ระแร่ +ระแรง +ระลง +ระลวง +ระลอก +ระลอง +ระลัด +ระลัดได +ระลึก +ระลุก +ระลุง +ระเลิง +ระเลียด +ระวัง +ระวังไพร +ระวังวัน +ระวาง +ระวาดระไว +ระวาม +ระวาย +ระวิง +ระแวง +ระแวดระวัง +ระไว +ระสะเก็ด +ระสาย +ระส่ำระสาย +ระสี +ระเสิดระสัง +ระหกระเหิน +ระหง +ระหวย +ระหว่าง +ระหองระแหง +ระหอบ +ระหัด +ระหาย +ระหุย +ระเห็จ +ระเหย +ระเหระหน +ระเหหน +ระเหหัน +ระเหิด +ระเหินระหก +ระแหก +ระแหง +ระโหย +ระอมระอา +ระอา +ระอิดระอา +ระอุ +รัก +รักข์ +รักขสะ +รักขา +รักขิต +รักดป +รักดะ +รักดีหามจั่ว รักชั่วหามเสา +รักตะ +รักบี้ +รักพี่เสียดายน้อง +รักยม +รักยาวให้บั่น รักสั้นให้ต่อ +รักร้อย +รักเร่ +รักแร้ +รักษ์ +รักษา +รักษาการ +รักษาการณ์ +รักหมู +รัง +รั้ง +รังกา +รังเกียจ +รังแก +รังไข่ +รังค์ +รังควาน +รังแค +รังดุม +รังแตน +รังนก +รังนาน +รังบวบ +รังผึ้ง +รังเพลิง +รังมด +รังรอง +รังรักษ์ +รังเรข +รังแรก +รังวัด +รังสรรค์ +รังสรัง +รังสฤษฏ์ +รังสิ +รังสิมันตุ์ +รังสิมา +รังสี +รังสีความร้อน +รังสีคอสมิก +รังสีแพทย์ +รังสีวิทยา +รังสีเหนือม่วง +รังหยาว +รัจฉา +รัช +รัช- +รัชกะ +รัชกาล +รัชชุ +รัชชูปการ +รัชฎาภิเษก +รัชด- +รัชดาภิเษก +รัชต- +รัชทายาท +รัชนะ +รัชนี +รัชนีกร +รัญจวน +รัฏฐาภิปาลโนบาย +รัฐ +รัฐ- +รัฐทูต +รัฐธรรมนูญ +รัฐบาล +รัฐบุรุษ +รัฐประศาสน์ +รัฐประศาสนนัย +รัฐประศาสนศาสตร์ +รัฐประศาสโนบาย +รัฐประหาร +รัฐมนตรี +รัฐวิสาหกิจ +รัฐศาสตร์ +รัฐสภา +รัด +รัดกุม +รัดเกล้า +รัดเข็มขัด +รัดช้อง +รัดตัว +รัดทึบ +รัดประคด +รัดประคน +รัดพัสตร์ +รัดรึง +รัดรูป +รัต +รัต- +รัตกัมพล +รัตคน +รัตจันทน์ +รัตตัญญู +รัตติ +รัตติกาล +รัตน- +รัตน์ +รัตนโกสินทร์ +รัตนตรัย +รัตนบัลลังก์ +รัตนสิงหาสน์ +รัตนะ +รัตนา +รัตนากร +รัตนาวลี +รัตมณี +รัตมา +รัถ +รัถยา +รัทเทอร์ฟอร์เดียม +รัน +รั้น +รันชนรันแชง +รันทด +รันทวย +รันทำ +รันแทะ +รันธะ +รับ +รับขวัญ +รับแขก +รับคำ +รับจ้าง +รับท้อง +รับประกัน +รับประทาน +รับปาก +รับผิด +รับผิดชอบ +รับมือ +รับรอง +รับเรือน +รับสั่ง +รับหน้า +รับไหว้ +รัมก- +รัมณีย- +รัมภา +รัมมี่ +รัมย์ +รัย +รัว +รั่ว +รั้ว +รั้วไก่ +รัศมิมัต +รัศมิมาน +รัศมี +รัษฎากร +รัส- +รัสสระ +รัสสะ +รา +ร่า +ร้า +ราก +รากแก้ว +รากขวัญ +รากฐาน +รากดิน +รากฝอย +รากฟัน +รากศัพท์ +รากษส +รากโษส +รากสาด +รากสาดน้อย +รากสาดใหญ่ +รากสามสิบ +รากเหง้า +ราข้อ +ราคะ +ราคา +ราคาตลาด +ราคิน +ราคี +ราง +ร่าง +ร้าง +ร่างกาย +รางจืด +รางชาง +รางดำ +รางแดง +รางนาน +รางบรรทัด +ร่างร้าน +รางวัล +ร่างแห +ราช +ราช- +ราชการ +ราชกิจจานุเบกษา +ราชครู +ราชญี +ราชดัด +ราชทัณฑ์ +ราชทินนาม +ราชทูต +ราชโทรหะ +ราชธรรม +ราชธานี +ราชนิกุล +ราชนีติ +ราชบัณฑิต +ราชบาตร +ราชบุตร +ราชบุรุษ +ราชปะแตน +ราชพฤกษ์ +ราชภัฏ +ราชมัล +ราชมาณพ +ราชมาษ +ราชมาส +ราชย์ +ราชยาน +ราชโยค +ราชโยงการ +ราชรถมาเกย +ราชวงศ์ +ราชวรมหาวิหาร +ราชวรวิหาร +ราชวโรงการ +ราชวัติ +ราชศาสตร์ +ราชสกุล +ราชสันตติวงศ์ +ราชสาสน์ +ราชสีห์ +ราชสีห์ตัวผู้ +ราชสีห์ตัวเมีย +ราชสีห์สองตัวอยู่ถ้ำเดียวกันไม่ได้ +ราชสูยะ +ราชหัตถเลขา +ราชองครักษ์ +ราชโองการ +ราชะ +ราชัน +ราชันย์ +ราชัย +ราชา +ราชาคณะ +ราชาโชค +ราชาธิราช +ราชาภิเษก +ราชายตนะ +ราชาฤกษ์ +ราชาวดี +ราชาวลี +ราชาศัพท์ +ราชิ +ราชินิกุล +ราชินี +ราชินีกุล +ราชินีนาถ +ราชินูปถัมภ์ +ราชี +ราชูปถัมภ์ +ราชูปโภค +ราเชน +ราเชนทร์ +ราเชนทรยาน +ราโชงการ +ราโชปถัมภ์ +ราโชปโภค +ราโชวาท +ราไชศวรรย์ +ราญ +ราญรอน +ราด +ราต +ราตร +ราตรี +ราตรีประดับดาว +ราโท +ราน +ร่าน +ร้าน +ร้านม้า +ราบ +ราบคาบ +ราบเป็นหน้ากลอง +ราบรื่น +ราบเรียบ +ราปีก +ราพณ์ +ราพณาสูร +ราม +รามเกียรติ์ +รามสูร +รามัญ +รามา +ราย +ร่าย +ร้าย +ร้ายกาจ +รายการ +รายงาน +รายงานการประชุม +รายจ่าย +รายทาง +ร่ายไม้ +ร่ายรัง +รายรับ +ร้ายแรง +รายวิชา +ร่าเริง +ราเริด +ราแรม +ราว +ร้าว +ราวกะ +ราวกับ +ราวข่าว +ร้าวฉาน +ราวป่า +ร้าวราน +ราวี +ราศี +ราษฎร +ราษฎร์ +ราษตรี +ราษราตริน +ราษราตรี +ราสี +ราหุ +ร่าหุ์ +ราหู +รำ +ร่ำ +รำเขนง +รำคาญ +รำโคม +รำงับ +รำจวน +รำชั่วโทษพากย์ +รำซุย +รำเท้า +รำบาญ +ร่ำไป +รำผี +รำพัด +รำพัดชา +รำพัน +รำพาย +รำพึง +รำเพย +รำแพน +รำไพ +รำมะแข +รำมะนา +รำมะนาด +รำมะร่อ +รำไม่ดีโทษปี่โทษกลอง +รำยวน +รำย้อย +รำแย้ +รำรงค์ +ร่ำรวย +รำราญ +รำรำ +ร่ำรี้ร่ำไร +รำเร +ร่ำเรียน +รำไร +ร่ำไร +รำลึก +รำวง +รำหัด +รำหัส +ร่ำไห้ +ริ +ริก +ริกๆ +ริดสีดวง +ริน +รินๆ +ริ้น +ริบ +ริบทรัพย์สิน +ริบบิ้น +ริบราชบาตร +ริบรี่ +ริบหรี่ +ริปอง +ริปุ +ริปู +ริม +ริมฝีปาก +ริเริ่ม +ริ้ว +ริษยา +ริอ่าน +รี +รี่ +รี้ +รีๆ ขวางๆ +รีด +รีดนาทาเน้น +รีดนาทาเร้น +รีดลูก +รีดักชัน +รีต +รีเนียม +รีบ +รีบรุด +รี้พล +รีม +รีรอ +รีๆ รอๆ +รี้ริก +รึกต์ +รึง +รึ้ง +รื่น +รื้น +รื่นรมย์ +รื่นเริง +รื้อ +รื้อแต่หลังคาเขา หลังคาเราไม่รื้อ +รื้อฟื้น +รุ +รุก +รุกข- +รุกข์ +รุกขกะ +รุกขชาติ +รุกขมูล +รุกขมูลิกธุดงค์ +รุกขา +รุกฆาต +รุกร้น +รุกราน +รุกรุย +รุกษะ +รุข้าว +รุ่ง +รุ้ง +รุ่งเช้า +รุ้งพราย +รุ้งร่วง +รุงรัง +รุ่งเรือง +รุ่งโรจน์ +รุจ +รุจน +รุจา +รุจิ +รุจิระ +รุจิรา +รุจิเรข +รุจี +รุชา +รุด +รุดหน้า +รุต +รุทธ์ +รุทร +รุธิร +รุเธียร +รุน +รุ่น +รุ่นกระทง +รุ่นตะกอ +รุ่นราวคราวเดียวกัน +รุนแรง +รุบรู่ +รุบาการ +รุม +รุ่ม +รุมไข้ +รุมไฟ +รุ่มรวย +รุ่มร่าม +รุย +รุ่ย +รุ่ยร่าย +รุรุ +รุษฏ์ +รุหะ +รุหาญ +รู +รู่ +รู้ +รู้แกว +รู้ความ +รู้คิด +รู้คิดรู้อ่าน +รู้คุณ +รู้งูๆ ปลาๆ +รู้จัก +รู้จักเก็บรู้จักเขี่ย +รู้จักเก็บรู้จักงำ +รู้จักมักคุ้น +รู้จักมักจี่ +รูจี +รู้ฉลาด +รู้เช่นเห็นชาติ +รูด +รู้ตัว +รู้ตื้นลึกหนาบาง +รู้ทัน +รู้ที +รูทีเนียม +รู้เท่า +รู้เท่าไม่ถึงการณ์ +รู้น้อยพลอยรำคาญ +รูบิเดียม +รูป +รูป- +รูปชี +รูปธรรม +รูปพยัญชนะ +รูปพรรณ +รูปภาพ +รูปร่าง +รูปลอก +รูปสมบัติ +รูปสระ +รูปิยะ +รูปี +รู้มลัก +รู้มลาก +รู้มาก +รู้มากยากนาน +รู้ยาวรู้สั้น +รูเล็ตต์ +รู้ไว้ใช่ว่า ใส่บ่าแบกหาม +รู้สึก +รู้ไส้ +รู้หลบเป็นปีก รู้หลีกเป็นหาง +รูหะ +รู้หาญรู้ขลาด +รู้เห็น +รู้เห็นเป็นใจ +รู้อย่างเป็ด +รู้อยู่ +รู้เองเป็นเอง +เร่ +เรข +เรขา +เรขาคณิต +เรขาคณิตบริสุทธิ์ +เรขาคณิตวิเคราะห์ +เร็ง +เร่ง +เร้ง +เร่งมือ +เร่งรัด +เร่งร่าย +เร่งรีบ +เร่งเร้า +เรณุ +เรณุก +เรณู +เรดอน +เรดาร์ +เรเดียม +เร้น +เร้นลับ +เรรวน +เร่ร่อน +เร่ร่าย +เรไร +เร็ว +เร่ว +เรวดี +เรอ +เร่อ +เร่อร่า +เรา +เร่า +เร่าๆ +เร้า +เร่าร้อน +เราะ +เราะราย +เราะร้าย +เริง +เริด +เริม +เริ่ม +เริ้ม +เริศร้าง +เรี่ย +เรี้ยๆ +เรียก +เรียกเนื้อ +เรียง +เรียงๆ +เรียงความ +เรียงพิมพ์ +เรียงพี่เรียงน้อง +เรียงรัน +เรียงราย +เรียงหน้ากระดาน +เรียงหมอน +เรียด +เรียน +เรียนปฏิบัติ +เรียนผูกต้องเรียนแก้ +เรียบ +เรียบๆ +เรียบร้อย +เรียบเรียง +เรียบวุธ +เรียม +เรี่ยม +เรี่ยราด +เรี่ยราย +เรี่ยไร +เรียว +เรี่ยว +เรี้ยวรก +เรี่ยวแรง +เรียวหนาม +เรือ +เรื่อ +เรื้อ +เรือก +เรือกสวน +เรือขนาน +เรือขาดหางเสือ +เรือง +เรื่อง +เรื้อง +เรืองนาม +เรืองรอง +เรื่องราว +เรืองไร +เรื่องสั้น +เรืองอำนาจ +เรือด +เรือดไม้ +เรือน +เรื้อน +เรือนแก้ว +เรือนเครื่องผูก +เรือนเครื่องสับ +เรือนจำ +เรือนตะเกียง +เรือนธาตุ +เรือนเบี้ย +เรือนฝากระดาน +เรือนแฝด +เรือนแพ +เรือนไฟ +เรือนยอด +เรือนหอ +เรือบิน +เรือพ่วง +เรือไฟ +เรื่อย +เรื้อย +เรื่อยเจื้อย +เรื่อยเปื่อย +เรือโยง +เรือรบ +เรื้อรัง +เรือล่มในหนอง ทองจะไปไหน +เรือล่มเมื่อจอด ตาบอดเมื่อแก่ +เรือแหวด +เรือใหญ่คับคลอง +แร +แร่ +แรก +แร็กเกต +แรกนา +แรกนาขวัญ +แรง +แร่ง +แร้ง +แรงงาน +แรงงานและสวัสดิการสังคม +แรงงานสัมพันธ์ +แรงดึงดูด +แรงเทียน +แรงม้า +แร่งริ้ว +แรงสู่ศูนย์กลาง +แรงหนีศูนย์กลาง +แรงเหวี่ยง +แร่งไหม +แรเงา +แรด +แรดตัวผู้ +แรดตัวเมีย +แร้นแค้น +แรม +แรมรอน +แรมรา +แรมโรย +แร้ว +แรเส้น +แระ +โร +โร่ +โรค +โรค- +โรคจิต +โรคจิตเภท +โรคนิทาน +โรคประจำตัว +โรคประสาท +โรคระบบประสาท +โรคศิลปะ +โรคสมอง +โรคา +โรคาพยาธิ +โรคาพาธ +โรง +โรงคัล +โรงงาน +โรงธาร +โรงธารคำนัล +โรงนา +โรงรับจำนำ +โรงเรียน +โรงเรียนประจำ +โรงเรียนสาธิต +โรงเรือน +โรงแรม +โรงแสง +โรจ +โรจน์ +โรเดียม +โรตี +โรตีสายไหม +โรท +โรทนะ +โรธ +โรธร +โรปนะ +โรม +โรมมัย +โรมรัน +โรมัญจ +โรมัน +โรมันคาทอลิก +โรเมอร์ +โรย +โรยขนมจีน +โรยรา +โรยหน้า +โรเร +โรษ +โรษณะ +โรหิณี +โรหิต +ไร +ไร่ +ไร้ +ไรฟัน +ไรย์ +ไรเรือง +ฤ +ฤกษ์ +ฤกษณะ +ฤกษ์บน +ฤกษ์พานาที +ฤกษ์ล่าง +ฤคเวท +ฤชา +ฤชากร +ฤชุ +ฤณ +ฤดี +ฤดียา +ฤดู +ฤดูกาล +ฤต +ฤติยา +ฤตุ +ฤตุสนาน +ฤทธา +ฤทธิ์ +ฤทัย +ฤษภ +ฤษยา +ฤษี +ฤๅ +ฤๅชุ +ฤๅชุตา +ฤๅดี +ฤๅทัย +ฤๅเยา +ฤๅษี +ฤๅษีแปลงสาร +ฤๅษีผสมแล้ว +ฤๅษีเลี้ยงลิง +ฤๅสาย +ล +ลก +ลการ +ลกุจ +ลคุฑ +ลคุฬ +ลฆุ +ลฆุจิต +ลฆุภาพ +ลฆุโภชน์ +ลง +ล่ง +ลงกลอน +ลงกา +ลงขัน +ลงข่าว +ลงแขก +ลงคอ +ลงเงิน +ลงชื่อ +ลงแดง +ลงตัว +ลงทอง +ลงท้อง +ลงท่า +ลงท้าย +ลงทุน +ลงโทษ +ลงนา +ลงเนื้อเห็นด้วย +ลงโบสถ์ +ลงแป้ง +ลงผี +ลงฝัก +ลงพระบังคน +ลงพื้น +ลงพุง +ลงมีด +ลงมือ +ลงยา +ลงรอยกัน +ลงรัก +ลงราก +ลงแรง +ลงโรง +ล้งเล้ง +ลงสรง +ลงหญ้าช้าง +ลงหิน +ลงอาชญา +ลงอาญา +ลงอุโบสถ +ลงเอย +ลด +ลดเขื่อน +ลดราวาศอก +ลดละ +ลดเลี้ยว +ลดเลี้ยวเกี้ยวพา +ลดหย่อน +ลดหลั่น +ลดา +ลดาวัลย์ +ลน +ล่น +ล้น +ล้นเกล้าล้นกระหม่อม +ลนควัน +ล้นพ้น +ลนลาน +ล้นหลาม +ลบ +ลบม +ลบรอย +ลบล้าง +ลบเลือน +ลบโลก +ลบศักราช +ลบหลู่ +ลบเหลี่ยม +ลบอง +ลปก +ลปน +ลพ +ลพุช +ลม +ลมๆ +ล่ม +ล้ม +ลมกรด +ลมขึ้น +ล้มคว่ำ +ลมค้า +ลมงวง +ล่มจม +ลมจับ +ลมแดง +ลมทวนลมค้า +ลมทะเล +ล้มทั้งยืน +ลมบก +ลมบ้าหมู +ลมปราณ +ลมปาก +ลมพัดชายเขา +ลมพัดหลวง +ลมพิษ +ลมเพลมพัด +ล่มฟ้า +ลมไม่ดี +ลมล่อง +ล้มละลาย +ล้มลุก +ล้มลุกคลุกคลาน +ล้มเลิก +ลมแล้ง +ลมๆ แล้งๆ +ลมว่าว +ลมเสีย +ล้มหมอนนอนเสื่อ +ลมาด +ลรรลุง +ลลนา +ลลาฏ +ลลิต +ลวก +ลวง +ล่วง +ล้วง +ล้วงกระเป๋า +ล่วงเกิน +ล่วงขื่อ +ลวงค์ +ล้วงคองูเห่า +ล่วงคำ +ล้วงตับ +ลวงตา +ล่วงประเวณี +ล่วงแป +ล่วงพ้น +ล้วงมือ +ล่วงรู้ +ล่วงลับ +ล่วงล้ำ +ล่วงเลย +ลวงเล้า +ล่วงว่า +ล่วงเวลา +ล้วงไส้ +ล่วงหน้า +ลวณะ +ลวด +ลวดลาย +ลวดสปริง +ลวดหนัง +ลวดหนาม +ล้วน +ล้วนๆ +ลวนลาม +ลวนะ +ล่วม +ลวะ +ลวิตร +ลหุ +ลหุก- +ลหุกะ +ลหุกาบัติ +ลหุโทษ +ล่อ +ล้อ +ลอก +ล็อกเกต +ลอกคราบ +ลอกท้องร่อง +ลอกเลน +ลอกแลก +ลอการิทึม +ลอง +ล่อง +ลองกอง +ล่องแก่ง +ล่องจวน +ลองจิจูด +ลองใจ +ล่องชาด +ลองเชิง +ลองดี +ล่องถุน +ลองธรรม์ +ลองใน +ลองไน +ลองภูมิ +ล่องแมว +ล่องหน +ลอด +ลอดช่อง +ลอน +ล่อน +ล่อนแก่น +ล่อนจ้อน +ลอนทอง +ลอบ +ลอบกัด +ลอม +ล้อม +ลอมชอม +ล้อมปรวด +ลอมพอก +ล้อมวง +ลอย +ลอยๆ +ล่อยๆ +ลอยกระทง +ลอยแก้ว +ลอยคอ +ลอยช้อน +ลอยชาย +ลอยดอก +ลอยตัว +ลอยนวล +ลอยบาป +ลอยแพ +ลอยฟ้า +ลอยเมฆ +ลอยลำ +ลอยหน้า +ล่อลวง +ล้อเลียน +ล้อเลื่อน +ล่อแล่ +ลอว์เรนเซียม +ล่อหลอก +ล้อหลอก +ล่อแหลม +ลออ +ละ +ล่ะ +ละกล +ละกูมะนิส +ละขัดละขืน +ละคร +ละครยก +ละคิ +ละคึก +ละงาด +ละงิด +ละติจูด +ละทิ้ง +ละบม +ละบอง +ละบองไฟ +ละบองราหู +ละบัด +ละบือ +ละเบ็ง +ละโบม +ละม่อม +ละมั่ง +ละมา +ละมาน +ละม้าย +ละมุ +ละมุด +ละมุน +ละมุนละไม +ละเม็ด +ละเมอ +ละเมาะ +ละเมิด +ละเมิดลิขสิทธิ์ +ละเมิน +ละเมียด +ละเมียบ +ละแมะ +ละโมก +ละโมบ +ละไม +ละรี +ละลด +ละลนละลาน +ละลมละลาย +ละลวย +ละลอก +ละลอบละเล้า +ละลัง +ละลัด +ละล้า +ละลาน +ละลาบละล้วง +ละลาย +ละล้าละลัง +ละล้าว +ละล่ำละลัก +ละลิบ +ละลุง +ละลุม +ละเลง +ละเลงขนมเบื้องด้วยปาก +ละเลย +ละเล้า +ละเลาะ +ละเลาะละลอง +ละเลิง +ละเลียด +ละเลียบ +ละเลือก +ละไล้ +ละวล +ละว้อ +ละว้า +ละวาง +ละวาด +ละเวง +ละเว้น +ละแวก +ละโว้ +ละหมาด +ละหมาดญานาซะฮ์ +ละหลัด +ละห้อย +ละหาน +ละหุ่ง +ละเหย +ละเหี่ย +ละองละมั่ง +ละออง +ละอาย +ละเอียด +ละเอียดลออ +ละแอน +ลัก +ลักไก่ +ลักขณะ +ลักขณา +ลักขะ +ลักขี +ลักเค้า +ลักจั่น +ลักปิดลักเปิด +ลักพา +ลักเพศ +ลักยิ้ม +ลักลอบ +ลักลั่น +ลักลาย +ลักเลียม +ลักศพ +ลักษณ- +ลักษณนาม +ลักษณะ +ลักษณาการ +ลักษมณ์ +ลักษมาณา +ลักษมี +ลักษะ +ลักสร้อย +ลักสี +ลักหลับ +ลัคคะ +ลัคน- +ลัคน์ +ลัคนา +ลัง +ลั่ง +ลังกา +ลังคิ +ลังคี +ลังถึง +ลังลอง +ลังเล +ลังสาด +ลัชชา +ลัชชี +ลัญจ์ +ลัญจกร +ลัญฉ +ลัญฉกร +ลัญฉน์ +ลัฐิ +ลัฐิกา +ลัด +ลัดนิ้วมือ +ลัดเนื้อ +ลัดเลาะ +ลัดแลง +ลัดวงจร +ลัดา +ลัทธ์ +ลัทธิ +ลัน +ลั่น +ลั่นกุญแจ +ลั่นไก +ลั่นฆ้อง +ลั่นดาล +ลันเต +ลันเตา +ลันไต +ลั่นถัน +ลั่นทม +ลันทวย +ลันโทม +ลั่นนก +ลั่นปาก +ลั่นวาจา +ลับ +ลับตา +ลับปาก +ลับฝีปาก +ลับลมคมใน +ลับล่อ +ลับๆ ล่อๆ +ลับลี้ +ลับแล +ลับสมอง +ลับหลัง +ลับหู +ลัพธ์ +ลัพธิ +ลัภ +ลัภนะ +ลัภย์ +ลัมพ์ +ลัย +ลัย- +ลัยกาล +ลัยคต +ลา +ล่า +ล้า +ลาก +ลากข้าง +ลากษา +ลากเส้น +ลากหนามจุกช่อง +ลาขา +ลาข้าวพระ +ลาง +ล่าง +ล้าง +ลางคัล +ล้างแค้น +ลางงิด +ล้างท้อง +ลางที +ลางเนื้อชอบลางยา +ล้างปาก +ล้างป่าช้า +ล้างผลาญ +ล้างไพ่ +ล้างมือ +ลางลิง +ล้างโลก +ล้างสมอง +ลางสาด +ล้างอาย +ลางาด +ล้างาด +ลาเง็ด +ลาช +ลาชา +ลาญ +ลาญทัก +ลาด +ลาดเขา +ลาดตระเวน +ลาดทวีป +ลาดเท +ลาดพระบาท +ลาดยาง +ลาดเลา +ล้าต้า +ลาตาย +ล่าเตียง +ล้าเตียง +ลาน +ล่าน +ล้าน +ลาบ +ลาป +ลาพรรษา +ลาพอน +ลาพุ +ลาพุช +ลาเพ +ลาเพา +ลาภ +ลาภมิควรได้ +ลาม +ล่าม +ลามก +ลามปาม +ลามลวน +ลาย +ล้าย +ลายขัด +ลายคราม +ลายตา +ลายเทศ +ลายแทง +ลายน้ำ +ลายน้ำทอง +ลายพระหัตถ์ +ลายพาดกลอน +ลายมือ +ลายมือชื่อ +ลายไม้ +ลายลักษณ์ +ลายสอ +ลายสอง +ลายสาบ +ลายสือ +ลายอย่าง +ลายฮ่อ +ลาโรง +ลาลนะ +ลาลส +ลาลา +ลาโลก +ลาว +ลาวก +ลาวัณย์ +ลาวา +ลาสนะ +ล้าสมัย +ลาสิกขา +ล้าหลัง +ลำ +ล่ำ +ล้ำ +ลำกระโดง +ลำกล้อง +ลำเข็ญ +ลำแข +ลำแข้ง +ลำเค็ญ +ลำเคือง +ลำงาด +ลำเจียก +ลำเจียกหนู +ลำดวน +ลำดับ +ลำตัด +ลำธาร +ลำนัก +ลำนำ +ลำเนา +ลำบอง +ลำบาก +ลำบุ +ลำปำ +ลำพวน +ลำพอง +ลำพัง +ลำพู +ลำพู่กัน +ลำเพ็ญ +ลำเพา +ลำแพง +ลำแพน +ลำโพง +ลำไพ่ +ลำภุขัน +ลำมะลอก +ลำมาด +ลำมาบ +ลำเมาะ +ลำเมียบ +ลำยอง +ลำยา +ลำไย +ลำลอง +ล่ำลา +ลำลาบ +ลำลำ +ลำลึก +ลำเลาะ +ลำเลิก +ล้ำเลิศ +ลำเลียง +ลำเลียบ +ลำเวียง +ลำเวียน +ล่ำสัน +ลำเสา +ลำไส้ +ลำหนัก +ล้ำหน้า +ลำห้วย +ลำหักลำโค่น +ลำอุด +ลำเอียก +ลำเอียง +ลำโอง +ลิ +ลิกขา +ลิกไนต์ +ลิกษา +ลิกุจ +ลิเก +ลิขนะ +ลิขสิทธิ์ +ลิขิต +ลิง +ลิงค์ +ลิงจุ่น +ลิงชิงหลัก +ลิงตกต้นไม้ +ลิงลม +ลิงโลด +ลิงหลอกเจ้า +ลิด +ลิดตีนปู +ลิดรอน +ลิต +ลิตมัส +ลิตร +ลิเทียม +ลิ่น +ลิ้น +ลิ้นกระด้างคางแข็ง +ลิ้นกระบือ +ลินโกรย +ลิ้นไก่ +ลิ้นควาย +ลิ้นงูเห่า +ลินจง +ลิ้นจะกวด +ลิ้นจี่ +ลิ้นชัก +ลิ่นต้น +ลิ้นตวัดถึงหู +ลิ้นตะกวด +ลิ้นทอง +ลิ่นทะเล +ลิ้นทะเล +ลิ้นปี่ +ลิ้นมังกร +ลิ้นไม่มีกระดูก +ลิ้นลม +ลิ้นลังกา +ลินลา +ลินลากระทุ่ม +ลินลากระบี่ +ลิ้นลาย +ลินสีด +ลิ้นเสือ +ลิ้นหมา +ลิ่นฮื้อ +ลินิน +ลิบ +ลิบลับ +ลิบลิ่ว +ลิปดา +ลิปต์ +ลิปสติก +ลิปิ +ลิปิกร +ลิปิการ +ลิฟต์ +ลิเภา +ลิ่ม +ลิ้ม +ลิมป์ +ลิมปนะ +ลิลิต +ลิว +ลิ่ว +ลิสง +ลี +ลี่ +ลี้ +ลีซอ +ลีบ +ลี้ลับ +ลีลา +ลีลากระทุ่ม +ลีลาศ +ลีฬหา +ลึก +ลึกซึ้ง +ลึกลับ +ลึกล้ำ +ลึงค์ +ลึงค์นายพราน +ลืด +ลื่น +ลื้น +ลืบ +ลืม +ลืมตน +ลืมต้น +ลืมตัว +ลืมตา +ลือ +ลื่อ +ลื้อ +ลือชา +ลือชาปรากฏ +ลื่อชื่อ +ลือสาย +ลุ +ลุก +ลุกลน +ลุกลาม +ลุกลี้ลุกลน +ลุกฮือ +ลุแก่โทษ +ลุแก่อำนาจ +ลุง +ลุ้ง +ลุต +ลุท +ลุทกะ +ลุทธ์ +ลุ่น +ลุ่นๆ +ลุ่นตุ้น +ลุ่นโตง +ลุปต์ +ลุพธ์ +ลุพธกะ +ลุ่ม +ลุ่มๆ ดอนๆ +ลุ่มน้ำ +ลุ่มเนื้อ +ลุมป์ +ลุมพี +ลุมพู +ลุ่มเล้า +ลุ่มหลง +ลุย +ลุ่ย +ลุ้ย +ลุ่ยหู +ลุล่วง +ลุลาย +ลุสา +ลุอำนาจ +ลู่ +ลูก +ลูกกก +ลูกกรง +ลูกกรอก +ลูกกระเดือก +ลูกกระพรวน +ลูกกระแอม +ลูกกลอน +ลูกกลิ้ง +ลูกกวาด +ลูกกะโล่ +ลูกกะแอ +ลูกกัลปพฤกษ์ +ลูกแก้ว +ลูกโกลน +ลูกไก่ +ลูกไก่อยู่ในกำมือ +ลูกขวัญ +ลูกขัด +ลูกข่าง +ลูกข้าว +ลูกขุน +ลูกขุน ณ ศาลหลวง +ลูกขุน ณ ศาลา +ลูกขุนพลอยพยัก +ลูกเขย +ลูกเขยตายแม่ยายชักปรก +ลูกเขยตายแม่ยายทำศพ +ลูกครอก +ลูกครึ่ง +ลูกคลัก +ลูกความ +ลูกคอ +ลูกคอก +ลูกคัน +ลูกค้า +ลูกคำ +ลูกคิด +ลูกเคล้า +ลูกฆ้อง +ลูกจ๊อก +ลูกจ้าง +ลูกเจี๊ยบ +ลูกช่วง +ลูกช้าง +ลูกชิด +ลูกชิ้น +ลูกโซ่ +ลูกดอก +ลูกดิ่ง +ลูกโดด +ลูกตั้ง +ลูกตุ้ม +ลูกเต้า +ลูกเต๋า +ลูกแตก +ลูกถ้วย +ลูกเถื่อน +ลูกแถว +ลูกทอย +ลูกท่านหลานเธอ +ลูกทุ่ง +ลูกเธอ +ลูกน้อง +ลูกนา +ลูกน้ำ +ลูกนิมิต +ลูกบท +ลูกบวบ +ลูกบ้าน +ลูกบาศก์ +ลูกบิด +ลูกบุญธรรม +ลูกเบี้ยว +ลูกประคบ +ลูกประคำ +ลูกประคำผี +ลูกประสม +ลูกประสัก +ลูกประหล่ำ +ลูกปราย +ลูกปละ +ลูกปลา +ลูกปะกน +ลูกปัด +ลูกปา +ลูกป่า +ลูกปืน +ลูกปืนใหญ่ +ลูกแป +ลูกโป่ง +ลูกโป่งสวรรค์ +ลูกผสม +ลูกผักชี +ลูกผีลูกคน +ลูกผู้ชาย +ลูกผู้น้อง +ลูกผู้พี่ +ลูกผู้หญิง +ลูกไผ่ +ลูกฝาแฝด +ลูกแฝด +ลูกพรวน +ลูกพริก +ลูกพลู +ลูกพี่ +ลูกพี่ลูกน้อง +ลูกฟัก +ลูกฟูก +ลูกไฟ +ลูกมโหตร +ลูกมะหวด +ลูกมาด +ลูกมือ +ลูกโม่ +ลูกไม้ +ลูกไม้หล่นไม่ไกลต้น +ลูกยอ +ลูกย่าง +ลูกยาเธอ +ลูกโยน +ลูกรอก +ลูกระมาศ +ลูกรัง +ลูกรุ่ย +ลูกเรือ +ลูกลม +ลูกล้อ +ลูกล่า +ลูกเล่น +ลูกเลี้ยง +ลูกแล่ง +ลูกโลก +ลูกไล่ +ลูกวัด +ลูกศิษย์ +ลูกสมภารหลานเจ้าวัด +ลูกสมุน +ลูกสวรรค์ +ลูกสวาท +ลูกสะบ้า +ลูกสะใภ้ +ลูกสังกะสี +ลูกสูบ +ลูกเสือ +ลูกหนี้ +ลูกหนู +ลูกหมด +ลูกหม้อ +ลูกหมาก +ลูกหมู่ +ลูกหลง +ลูกหลวง +ลูกหาบ +ลูกหิน +ลูกหินบด +ลูกหีบ +ลูกเห็บ +ลูกแห +ลูกแหง่ +ลูกอม +ลูกเอ็น +ลูกเอ็ล +ลูขะ +ลูตา +ลูติกา +ลู่ทาง +ลูทีเชียม +ลูนะ +ลูบ +ลูบคม +ลูบคลำ +ลูบตัว +ลูบไล้ +ลูบหน้าปะจมูก +ลู่หลี่ +เลก +เล็ก +เล็กดา +เล็กน้อย +เล็กพริกขี้หนู +เลกวัด +เลข +เลขกะ +เลขคณิต +เลขจำนวน +เลขชี้กำลัง +เลขโดด +เลขนะ +เลขผา +เลขยะ +เลขยันต์ +เลขลำดับ +เลขหมาย +เลขา +เลขาธิการ +เลขานุการ +เล็ง +เล้ง +เล็งลัคน์ +เล่งฮื้อ +เลเซอร์ +เลฑฑุ +เลณ +เลณฑุ +เล็ด +เล็ดลอด +เลต +เลน +เล็น +เล่น +เล่นกล +เล่นกับไฟ +เล่นขายของ +เล่นคำ +เล่นงาน +เลนจง +เล่นชู้ +เล่นตลก +เล่นตัว +เล่นเบี้ย +เล่นพวก +เล่นพิเรนทร์ +เล่นเพลงยาว +เล่นเพื่อน +เล่นแร่แปรธาตุ +เล่นลิ้น +เลนส์ +เลนส์ตีบแสง +เลนส์ถ่างแสง +เลนส์นูน +เล่นสวาท +เลนส์เว้า +เลนส์สัมผัส +เล่นสำนวน +เลนหะรี +เล่นหัว +เล่นหาง +เล่นหูเล่นตา +เล่นเอาเถิดเจ้าล่อ +เล็บ +เล็บครุฑ +เล็บควาย +เลบง +เล็บนาง +เล็บมือนาง +เล็บเหยี่ยว +เลป- +เลปกร +เลปน์ +เลเป +เลเพ +เลเพลาดพาด +เล็ม +เล่ม +เล็มล่า +เลย +เลยตามเลย +เลยเถิด +เลว +เลวง +เลวูโลส +เลศ +เลษฏุ +เลห +เล่ห์ +เล่ห์กระเท่ห์ +เลหยะ +เลหลัง +เลหลา +เล่ห์เหลี่ยม +เลหะ +เลอ +เล่อ +เลอมาน +เล่อล่า +เลอะ +เลอะเทอะ +เละ +เละเทะ +เลา +เลาๆ +เล่า +เล้า +เลากัย +เล่าเรียน +เล่าลือ +เล้าโลม +เลาะ +เลิก +เลิกล้ม +เลิ่กลั่ก +เลิ้ง +เลินเล่อ +เลิศ +เลีย +เลียง +เลี่ยง +เลี้ยง +เลียงขาว +เลี้ยงแขก +เลี้ยงช้างกินขี้ช้าง +เลี้ยงดู +เลี้ยงต้อย +เลี้ยงโต๊ะ +เลี้ยงปากเลี้ยงท้อง +เลียงผา +เลียงฝ้าย +เลียงมัน +เลี้ยงรับ +เลี้ยงลา +เลี้ยงลูกเสือลูกจระเข้ +เลี้ยงส่ง +เลียน +เลี่ยน +เลียนไฟ +เลียบ +เลียบค่าย +เลียบเคียง +เลียบเมือง +เลียม +เลี่ยม +เลียว +เลี้ยว +เลี้ยวลด +เลือก +เลือกตั้ง +เลือกที่รักมักที่ชัง +เลือกนักมักได้แร่ +เลือกสรร +เลือง +เลื่อง +เลื่องลือ +เลือด +เลือดขึ้นหน้า +เลือดเข้าตา +เลือดเนื้อ +เลือดเนื้อเชื้อไข +เลือดในอก +เลือดฝาด +เลือดไม้ +เลือดเย็น +เลือดร้อน +เลือดล้างหน้า +เลือดอุ่น +เลือน +เลื่อน +เลื่อนที่ +เลื่อนเปื้อน +เลื่อนลอย +เลื่อม +เลื่อมใส +เลื่อย +เลื้อย +เลื้อยคลาน +เลื้อยเจื้อย +เลื่อยล้า +แล +แล่ +แล้ +แลก +แล็กโทส +แลกเปลี่ยน +แลง +แล่ง +แล้ง +แลงกินฟัน +แล่งพระราม +แลน +แล่น +แลนทานัม +แลบ +แล้ว +แล้วกัน +แล้วด้วย +แล้วแต่ +แล้วไป +แล้ว...เล่า +แล้วๆ เล่าๆ +และ +และเล็ม +และเลียม +โล่ +โล้ +โลก +โลก- +โลกเชษฐ์ +โลกธรรม +โลกธาดา +โลกธาตุ +โลกนาถ +โลกบาล +โลกย์ +โลกยะ +โลกวัชชะ +โลกวิทู +โลกสถิติ +โลกอุดร +โลกัตถจริยา +โลกันตร์ +โลกัย +โลกา +โลกาธิบดี +โลกาธิปไตย +โลกานุวัตร +โลกาภิวัตน์ +โลกามิส +โลกายัต +โลกาวินาศ +โลกิยะ +โลกีย์ +โลกียวัตร +โลกุตรธรรม +โลกุตระ +โลเกศ +โลง +โล่ง +โล้ง +โล้งโต้ง +โล่งโถง +โลจนะ +โลณะ +โลด +โลดเต้น +โลดทะนง +โลดโผน +โลดแล่น +โล่ติ๊น +โลโต +โลท +โลน +โล้น +โลปะ +โลภ +โลภโมโทสัน +โลม +โลมชาติ +โลมเล้า +โลมะ +โลมา +โลล +โลลุป +โลเล +โล้เล้ +โลโล +โลโล้ +โลห- +โลหกุมภี +โลหะ +โลหะเจือ +โลหัช +โลหิต +ไล่ +ไล้ +ไล่ช้าง +ไล่ที่ทำวัง +ไล่น้ำ +ไล่เบี้ย +ไลย +ไลลา +ไล่ลูกฆ้อง +ไลเลย +ไล่เลี่ย +ไล่เลียง +ไลไล้ +ไล่ออก +ฦ +ฦๅ +ฦๅชา +ฦๅสาย +ว +วก +วกะ +วกุล +วง +วงก์ +วงกต +วงกบ +วงกลม +วงการ +วงเงิน +วงจร +วงจรปิด +วงจรเปิด +วงเดือน +วงนอก +วงใน +วงพาด +วงรี +วงเล็บ +วงวัง +วงเวียน +วงศ- +วงศ์ +วงศกร +วงศ์วาน +วงศา +วงศาคณาญาติ +วงษ์ +วงแหวน +วจนะ +วจะ +วจา +วจี +วจีกรรม +วจีเภท +วชะ +วชิร- +วชิรปาณี +วชิรหัตถ์ +วชิระ +วชิราวุธ +วฏะ +วฏาการ +วฏุมะ +วณ- +วณบัตร +วณพันธน์ +วณะ +วณิช +วณิชชา +วณิชชากร +วณิชย์ +วณิชยา +วณิพก +วดี +วต- +วตะ +วทนะ +วทะ +วทัญญุตา +วทัญญู +วทานิย- +วธ- +วธก- +วธุกา +วธู +วน +วนจร +วนจรก +วนภู +วนภูมิ +วนเวียน +วนศาสตร์ +วนสณฑ์ +วนสัณฑ์ +วนอุทยาน +วนัปติ +วนัส +วนัส- +วนัสบดี +วนา +วนาดอน +วนานต์ +วนาลัย +วนาลี +วนาวาส +วนาศรม +วนาสณฑ์ +วนาสัณฑ์ +วนิดา +วนิพก +วเนจร +วโนทยาน +วปนะ +วปุ +วยัคฆ์ +วยัญชนะ +วยัมหะ +วยัสย์ +วยากรณ์ +วยาฆร์ +วยาธิ +วยาม +วยายาม +วร- +วรงค์ +วรณะ +วรดนู +วรท +วรทาน +วรมหาวิหาร +วรรค +วรรคย์ +วรรช +วรรชย์ +วรรณ- +วรรณกรรม +วรรณคดี +วรรณนา +วรรณพฤติ +วรรณยุกต์ +วรรณยุต +วรรณศิลป์ +วรรณะ +วรรณึก +วรรธก +วรรธนะ +วรรษ +วรรษา +วรวิหาร +วรัญญู +วรากะ +วรางคณา +วราห์ +วราหะ +วรุณ +วรุตดม +วรุตมะ +วรูถ +วโรดม +วโรตมะ +วฤก +วฤษภ +วฤษล +วลัช +วลัญช์ +วลัญชน์ +วลัย +วลาหก +วลี +วศค +วศะ +วศิน +วสนะ +วสภะ +วสละ +วสลี +วสวัดดี +วสวัตตี +วสะ +วสันต- +วสันต์ +วสันตดิลก +วสันตวิษุวัต +วสา +วสี +วสุ +วสุธา +วสุนธรา +วสุมดี +วหะ +วหา +วอ +วอก +วอกแวก +ว่อง +ว่องไว +วอด +วอดวาย +วอน +ว่อน +วอลเลย์บอล +วอแว +วะ +วัก +วักกะ +วัค +วัคคิย +วัคคีย์ +วัคคุ +วัคคุวัท +วัคซีน +วัง +วังก์ +วังชา +วังช้าง +วังวน +วังเวง +วังศะ +วังสะ +วังหน้า +วังหลวง +วังหลัง +วัจ- +วัจกุฎี +วัจจะ +วัจฉ์ +วัจฉก +วัจฉละ +วัจน์ +วัจมรรค +วัช +วัช- +วัชชะ +วัชฌ์ +วัชพืช +วัชร- +วัชรธาตุมณฑล +วัชรปาณี +วัชรยาน +วัชรอาสน์ +วัชระ +วัชราสน์ +วัชรินทร์ +วัชรี +วัชเรนทร์ +วัญจก +วัญจนะ +วัญฌ์ +วัฏ- +วัฏกะ +วัฏจักร +วัฏฏะ +วัฏฏิ +วัฏทุกข์ +วัฏสงสาร +วัฒกะ +วัฒกี +วัฒน- +วัฒนธรรม +วัฒนะ +วัฒนา +วัณ +วัณ- +วัณฏ์ +วัณณะ +วัณนา +วัณโรค +วัด +วัดแดด +วัดผล +วัดพื้น +วัดรอยตีน +วัดรอยเท้า +วัดราษฎร์ +วัดวา +วัดวาอาราม +วัดหลวง +วัดเหวี่ยง +วัต +วัตต์ +วัตตา +วัตถ์ +วัตถาภรณ์ +วัตถาลังการ +วัตถุ +วัตถุดิบ +วัตถุนิยม +วัตถุวิสัย +วัตนะ +วัตร +วัตร- +วัตรปฏิบัติ +วัตสดร +วัตสะ +วัติ +วัทน์ +วัน +วันโกน +วันแข็ง +วันครู +วันจม +วันดับ +วันดีคืนดี +วันต์ +วันตัว +วันเถลิงศก +วันทน- +วันทนา +วันทนาการ +วันทนีย์ +วันทย- +วันทยหัตถ์ +วันทยาวุธ +วันทา +วันทิ +วันนิพก +วันเนา +วันพระ +วันพระไม่มีหนเดียว +วันเพ็ญ +วันฟู +วันยังค่ำ +วันลอย +วันแล้ววันเล่า +วันสุกดิบ +วันอุโบสถ +วับ +วับๆ +วับวาบ +วับวาม +วับแวบ +วับแวม +วับๆ หวำๆ +วัปปะ +วัมมิก +วัย +วัย- +วัยรุ่น +วัยวุฒิ +วัลก์ +วัลคุ +วัลย์ +วัลลภ +วัลลี +วัว +วัวใครเข้าคอกคนนั้น +วัวตัวผู้ +วัวตัวเมีย +วัวทะเล +วัวพันหลัก +วัวลืมตีน +วัวสันหลังหวะ +วัวหายล้อมคอก +วัส- +วัสคณนา +วัสดุ +วัสตร์ +วัสน์ +วัสนะ +วัสสะ +วัสสานะ +วัสโสทก +วา +ว่า +ว้า +วาก +ว้าก +วากจิรพัสตร์ +วากย- +วากยสัมพันธ์ +วากยะ +วากรา +ว่ากล่าว +วากะ +ว่าการ +ว่าขาน +ว่าความ +วาง +ว่าง +ว้าง +วางก้าม +วางข้อ +วางไข่ +ว่างงาน +วางเงิน +วางใจ +วางตลาด +วางตัว +วางตา +วางโต +วางท่า +วางปุ่ม +วางเพลิง +วางมวย +วางมาด +วางมือ +วางยา +วางวาย +ว่างเว้น +ว้างเวิ้ง +วางอำนาจ +ว่าง่าย +วาจก +วาจา +ว่าจ้าง +วาจาไปยะ +วาจาล +วาชเปยะ +วาฏกะ +วาณิช +วาณิชกะ +วาณิชย์ +วาณี +วาด +วาดเขียน +วาต- +วาตปานะ +วาตภัย +วาตะ +ว่าต่าง +วาตารางเหลี่ยม +ว่าแต่เขาอิเหนาเป็นเอง +วาท +วาท- +วาทก +วาทน +วาทย- +วาทย์ +วาทยกร +วาทศาสตร์ +วาทศิลป์ +วาทิต +วาทิน +วาที +ว่าที่ +วาน +ว่าน +ว่านกีบม้า +ว่านกีบแรด +ว่านเครือ +วานซืน +ว่านธรณีสาร +ว่านนางกวัก +ว่านนางล้อม +ว่านน้ำ +ว่านเพชรหึง +ว่านมหาเมฆ +ว่านมีดยับ +วานร +วานรินทร์ +ว่านเสน่ห์จันทร์ขาว +ว่านเสน่ห์จันทร์แดง +ว่านหางช้าง +ว่านอนสอนง่าย +วาเนเดียม +วาบ +วาบหวาม +วาปะ +วาปิตะ +วาปี +วาม +วามน- +วามนาวตาร +วามแวม +วามะ +วามาจาร +วาโมร +ว่าไม่ได้ +วาย +ว่าย +ว้าย +วายชนม์ +วายชีวิต +ว่ายตา +ว่ายน้ำหาจระเข้ +วายปราณ +วายร้าย +วายวอด +วายสะ +วายสังขาร +วายะ +ว่ายาก +วายามะ +วายุ +วายุกูล +วายุบุตรยาตรา +วายุภักษ์ +วาโย +วาโยธาตุ +วาร +วารณ- +วารณกร +วารวาริ +วารสาร +วารสารศาสตร์ +วาระ +วาริ +วาริจร +วาริช +วาริท +วาริธร +วาริพินทุ +วารี +วารีช +วารุณ +วารุณี +วาล +วาล- +วาลกัมพล +วาลธิ +วาล์ว +วาลวีชนี +วาลิกา +วาลุกา +วาว +ว่าว +ว่าวติดลม +วาววับ +วาววาม +วาวแวว +ว่าวเหลิง +ว่าวอน +ว้าว่อน +ว้าวุ่น +วาสนะ +วาสนา +วาสพ +วาสะ +ว่าสาดเสียเทเสีย +วาสิน +วาสี +วาสุกรี +วาสุกี +วาสุเทพ +วาหนะ +วาหะ +วาหินี +ว้าเหว่ +วาฬ +วาฬ- +วาฬมิค +วิ +วิกขัมภ์ +วิกขัมภนะ +วิกเขป +วิกจะ +วิกรม +วิกรัย +วิกรานต์ +วิกฤต +วิกฤต- +วิกฤตการณ์ +วิกฤตกาล +วิกฤติ +วิกฤติ- +วิกฤติการณ์ +วิกฤติกาล +วิกล +วิกลจริต +วิกสิต +วิกัต +วิกัติ +วิกัติการก +วิกัป +วิกัย +วิการ +วิกาล +วิกาล- +วิกาลโภชน์ +วิคหะ +วิเคราะห์ +วิฆนะ +วิฆเนศ +วิฆเนศวร +วิฆาต +วิฆาส +วิง +วิ่ง +วิ่งกระโดดข้ามรั้ว +วิ่งข้ามรั้ว +วิ่งงัว +วิ่งเต้น +วิ่งเปี้ยว +วิ่งผลัด +วิ่งม้า +วิ่งรอก +วิ่งระแบง +วิ่งราว +วิงวอน +วิ่งวัว +วิ่งว่าว +วิ่งวิบาก +วิงเวียน +วิ่งสามขา +วิจฉิกะ +วิจยุต +วิจรณะ +วิจล +วิจักขณ์ +วิจักษณ์ +วิจัย +วิจาร +วิจารณ- +วิจารณ์ +วิจารณญาณ +วิจิ +วิจิกิจฉา +วิจิต +วิจิตร +วิจิตรพิสดาร +วิจิน +วิจุณ +วิจุรณ +วิชชา +วิชชุ +วิชชุดา +วิชชุตา +วิชชุลดา +วิชญะ +วิชน +วิชนี +วิชย- +วิชัย +วิชา +วิชาการ +วิชาชีพ +วิชาโท +วิชาธร +วิชานนะ +วิชาเอก +วิชิต +วิเชียร +วิญญัตติ +วิญญาณ +วิญญาณกทรัพย์ +วิญญู +วิญญูชน +วิญญูภาพ +วิฑูรย์ +วิณหุ +วิด +วิดพื้น +วิดัสดี +วิตก +วิตก- +วิตกจริต +วิตถาร +วิตามิน +วิถี +วิทธะ +วิทย- +วิทยฐานะ +วิทยา +วิทยากร +วิทยากล +วิทยาเขต +วิทยาคม +วิทยาคาร +วิทยาทาน +วิทยาธร +วิทยานิพนธ์ +วิทยาลัย +วิทยาศาสตร์ +วิทยาศาสตร์กายภาพ +วิทยาศาสตร์ชีวภาพ +วิทยาศาสตร์เทคโนโลยีและสิ่งแวดล้อม +วิทยาศาสตร์ประยุกต์ +วิทยุ +วิทยุต +วิทรุมะ +วิทวัส +วิทัตถิ +วิทารณ์ +วิทาลน์ +วิทิต +วิทู +วิทูร +วิเทวษ +วิเทศ +วิเทศสัมพันธ์ +วิเทโศบาย +วิธ +วิธวา +วิธา +วิธาน +วิธี +วิธุระ +วิธู +วิธูปนะ +วิ่น +วินย- +วินันตู +วินัย +วินัยธร +วินาที +วินายก +วินาศ +วินาศ- +วินาศกรรม +วินาศภัย +วินิจ +วินิจฉัย +วินิต +วินิบาต +วินิปาติก +วิเนต +วิโนทก +วิบัติ +วิบาก +วิบุล +วิบุลย์ +วิบูล +วิบูลย์ +วิปการ +วิปฏิสาร +วิปโยค +วิประการ +วิประติสาร +วิประโยค +วิประลาป +วิประวาส +วิปริต +วิปลาป +วิปลาส +วิปวาส +วิปักษ์ +วิปัสสก +วิปัสสนา +วิพากษ์ +วิพากษ์วิจารณ์ +วิพิธทัศนา +วิพุธ +วิภว- +วิภวตัณหา +วิภังค์ +วิภัช +วิภัช- +วิภัชพยากรณ์ +วิภัชวาที +วิภัตติ +วิภา +วิภาค +วิภาช +วิภาดา +วิภาวี +วิภาษ +วิภาส +วิภู +วิภูษณะ +วิภูษา +วิภูษิต +วิเภตก์ +วิเภทก์ +วิมน +วิมล +วิมลัก +วิมลาก +วิมังสา +วิมัติ +วิมาน +วิมุข +วิมุต +วิมุตติ +วิเมลือง +วิโมกข์ +วิเยน +วิโยค +วิร- +วิรงรอง +วิรตะ +วิรมณะ +วิรวะ +วิระ +วิรังรอง +วิรัช +วิรัต +วิรัติ +วิราคะ +วิราม +วิราวะ +วิริยภาพ +วิริยะ +วิรุธ +วิรุฬห์ +วิรุฬหก +วิรูป +วิรูปักษ์ +วิเรนทร์ +วิโรค +วิโรจ +วิโรจน์ +วิโรฒ +วิโรธ +วิโรธน์ +วิลย- +วิลันดา +วิลัย +วิลาด +วิลาป +วิลาวัณย์ +วิลาศ +วิลาส +วิลาสินี +วิลิปดา +วิเลป +วิเลป- +วิเลปนะ +วิโลก +วิโลกนะ +วิโลจนะ +วิโลม +วิไล +วิไลวรรณ +วิวรณ์ +วิวรรธน์ +วิวระ +วิวัฏ +วิวัฒน- +วิวัฒน์ +วิวัฒนาการ +วิวัน +วิวาท +วิวาห- +วิวาห์ +วิวาหะ +วิวิจ +วิวิต +วิวิธ +วิเวก +วิศรุต +วิศว- +วิศวกร +วิศวกรรม +วิศวกรรมศาสตร์ +วิศัลย์ +วิศาข- +วิศาขบูชา +วิศาขะ +วิศาขา +วิศางค์ +วิศาล +วิศิษฏ์ +วิศุทธ์ +วิศุทธิ์ +วิเศษ +วิเศษณ- +วิเศษณ์ +วิเศษณการก +วิษณุ +วิษณุกรรม +วิษณุโลก +วิษณุเวท +วิษธร +วิษักต์ +วิษัย +วิษาณ +วิษุวัต +วิสกี้ +วิสม- +วิสย- +วิสรรชนีย์ +วิสฤต +วิสสุกรรม +วิสัชนา +วิสัญญี +วิสัญญีแพทย์ +วิสัญญีวิทยา +วิสัย +วิสาข- +วิสาขบูชา +วิสาขะ +วิสาขา +วิสามัญ +วิสามัญฆาตกรรม +วิสามานยนาม +วิสาร +วิสารท +วิสาล +วิสาสะ +วิสาหกิจ +วิสิฐ +วิสุงคามสีมา +วิสุทธ์ +วิสุทธิ์ +วิสูตร +วิเสท +วิหค +วิหงค์ +วิหลั่น +วิหายสะ +วิหาร +วิหาร- +วิหารแกลบ +วิหารคด +วิหารทิศ +วิหารธรรม +วิหารยอด +วิหารหลวง +วิหิงสะ +วิหิงสา +วิเหสา +วิฬังค์ +วิฬาร +วิฬาร์ +วี +วีจิ +วีชนี +วีณา +วี้ด +วีต- +วีร- +วีรกรรม +วีรชน +วีรบุรุษ +วีรสตรี +วี่วัน +วี่แวว +วีสะ +วุ้ง +วุฐิ +วุฒ +วุฒิ +วุฒิ- +วุฒิบัตร +วุฒิสภา +วุฒิสมาชิก +วุด +วุ่น +วุ้น +วุ้นชา +วุ่นเป็นจุลกฐิน +วุ่นวาย +วุ้นเส้น +วุบ +วุ้ย +วุลแฟรม +วู้ +วูดวาด +วูบ +วูบวาบ +วู่วาม +เว้ +เวค +เวคิน +เวคี +เวจ +เวจ- +เวจกุฎี +เวจมรรค +เวช +เวช- +เวชกรรม +เวชภัณฑ์ +เวชยันต์ +เวชศาสตร์ +เวฐน์ +เวณะ +เวณิ +เวณิก +เวณุ +เวณุวัน +เวตน์ +เวตร +เวตาล +เวท +เวท- +เวทคู +เวทนา +เวทมนตร์ +เวทย์ +เวทางค์ +เวทางคศาสตร์ +เวทานต์ +เวทานตะ +เวทิ +เวที +เวธะ +เวน +เว้น +เวนคืนอสังหาริมทรัพย์ +เว้นแต่ +เวนไตย +เวไนย +เวมะ +เวมัต +เวมัติก- +เวมาติก +เว้ย +เวร +เวรมณี +เวรี +เวโรจน์ +เวลา +เวเลนซี +เววัณ +เววัณณิยะ +เวศม์ +เวศย์ +เวศยา +เวสน์ +เวสภู +เวสม์ +เวสมะ +เวสวัณ +เวสสะ +เวสสันดร +เวสสุกรรม +เวสสุวัณ +เวสารัช +เวสิ +เวสิยา +เวหน +เวหะ +เวหังค์ +เวหัปติ +เวหา +เวหายส +เวหาส +เวฬุ +เวฬุการ +เวฬุริย +เวฬุวัน +เว่อ +เว้า +เว้าวอน +เวิก +เวิ้ง +เวิ้งว้าง +เวี่ย +เวียง +เวียน +เวียนเทียน +เวียนหัว +เวียร +เวี่ยว +แว้ +แวง +แว้ง +แว้งกัด +แวด +แวดล้อม +แวดวง +แวตร +แวน +แว่น +แว่นขยาย +แวนดา +แว่นตา +แว่นฟ้า +แว่นไว +แวบ +แวบๆ +แวบวับ +แวม +แวว +แว่ว +แวววาม +แวววาว +แวววิเชียร +แวะ +โว +โว่ +โวการ +โว่ง +โวทาน +โว้ย +โวยวาย +โว้เว้ +โวสาน +โวหาร +ไว +ไว้ +ไวกูณฐ์ +ไว้ใจ +ไวฑูรย์ +ไว้ตัว +ไวทย์ +ไว้ทุกข์ +ไว้ธุระ +ไว้เนื้อเชื่อใจ +ไวพจน์ +ไวไฟ +ไว้ยศ +ไวยากรณ์ +ไวยาวัจกร +ไวยาวัจมัย +ไว้ลาย +ไววรรณ +ไวษณพ +ไว้หน้า +ไว้อาลัย +ไวโอลิน +ศ +ศก +ศกฏ +ศกล +ศกุน +ศกุนต์ +ศกุนิ +ศกุนี +ศงกา +ศจี +ศฐ +ศดก +ศต +ศต- +ศตก +ศตบาท +ศตปที +ศตพรรษ +ศตภิษัช +ศตวรรษ +ศตสังวัตสร์ +ศตัฆนี +ศนิ +ศนิวาร +ศพ +ศพล +ศม +ศมน +ศย +ศยนะ +ศยาม +ศยามล +ศร +ศรนารายณ์ +ศรภ +ศรมณะ +ศรรกรา +ศรวณะ +ศรวณีย์ +ศรวิษฐา +ศรศิลป์ไม่กินกัน +ศระวณ +ศรัณย์ +ศรัณยู +ศรัถนะ +ศรัท +ศรัทธา +ศรัย +ศราทธ- +ศราทธ์ +ศราทธพรต +ศราพ +ศราพก +ศรายุธ +ศราวก +ศราวณะ +ศราวรณ์ +ศราสน์ +ศรี +ศรีตรัง +ศรีสังคีต +ศรุต +ศรุติ +ศฤคาล +ศฤงค์ +ศฤงคาร +ศฤงคาริน +ศฤงคารี +ศลภ +ศลัถ +ศลิษฏ์ +ศลิษา +ศว +ศวศุร +ศวัส +ศวัสน +ศวา +ศวาน +ศวาส +ศศ- +ศศธร +ศศพินทุ์ +ศศลักษณ์ +ศศะ +ศศิ +ศศิกษัย +ศศิขัณฑ์ +ศศิเคราะห์ +ศศิธร +ศศิน +ศศิมณฑล +ศศิวิมล +ศศี +ศสา +ศอ +ศอก +ศอกกลับ +ศอกกำ +ศอกกำมา +ศอกคู้ +ศอกตูม +ศักดา +ศักดิ +ศักดิ์ +ศักดินา +ศักดิ์ศรี +ศักดิ์สิทธิ์ +ศักติ +ศักย- +ศักย์ +ศักยภาพ +ศักยะ +ศักร- +ศักรภพน์ +ศักราช +ศักรินทร์ +ศักเรนทร์ +ศังกร +ศังกา +ศังกุ +ศัตรู +ศัทธนะ +ศันสนะ +ศันสนีย์ +ศัพท- +ศัพท์ +ศัพทมูลวิทยา +ศัยยา +ศัล +ศัลก +ศัลกี +ศัลย- +ศัลยกรรม +ศัลยแพทย์ +ศัลยศาสตร์ +ศัสดร +ศัสตร- +ศัสตรกรรม +ศัสตรการ +ศัสตรศาสตร์ +ศัสตรา +ศัสย +ศาก +ศาก- +ศากตะ +ศากภักษ์ +ศากย- +ศากยเกตุ +ศากยพุทธ +ศากยมุนี +ศากยะ +ศาฎก +ศาฐยะ +ศาณ +ศาต +ศานต- +ศานต์ +ศานตรส +ศานติ +ศานติก- +ศานติโหม +ศาป +ศาป- +ศาปมุกติ์ +ศาปานต์ +ศาพร +ศารท +ศารทวิษุวัต +ศารทูล +ศาริกา +ศาล +ศาลกงสุล +ศาลแขวง +ศาลคดีเด็กและเยาวชน +ศาลจังหวัด +ศาลชั้นต้น +ศาลฎีกา +ศาลเตี้ย +ศาลทหาร +ศาลปกครอง +ศาลโปริสภา +ศาลเพียงตา +ศาลแพ่ง +ศาลยุติธรรม +ศาลเยาวชนและครอบครัว +ศาลโลก +ศาลสถิตยุติธรรม +ศาลสูง +ศาลสูงสุด +ศาลอาญา +ศาลอุทธรณ์ +ศาลอุทธรณ์ภาค +ศาลา +ศาลาประชาคม +ศาลาราย +ศาลาสรง +ศาศวัต +ศาสก +ศาสดา +ศาสตร- +ศาสตร์ +ศาสตรา +ศาสตราจารย์ +ศาสน- +ศาสน์ +ศาสนจักร +ศาสนา +ศาสนีย- +ศาสนีย์ +ศาสนูปถัมภก +ศิกษก +ศิการ +ศิขร +ศิขริน +ศิขรี +ศิขัณฑ์ +ศิขา +ศิคาล +ศิงขร +ศิงขริน +ศิต +ศิถี +ศิพิระ +ศิร- +ศิรประภา +ศิระ +ศิรา +ศิรามพุช +ศิโรรัตน์ +ศิโรราบ +ศิโรเวฐน์ +ศิลป- +ศิลป์ +ศิลปกร +ศิลปกรรม +ศิลปการ +ศิลปกิจ +ศิลปวิทยา +ศิลปศาสตร์ +ศิลปะ +ศิลปิน +ศิลปี +ศิลา +ศิลาฤกษ์ +ศิลาแลง +ศิว- +ศิวโมกข์ +ศิวลึงค์ +ศิวเวท +ศิวะ +ศิศีระ +ศิศุ +ศิษฎิ +ศิษฏ์ +ศิษย์ +ศิษย์มีครู +ศีขร +ศีขริน +ศีขรี +ศีต- +ศีตกาล +ศีตล +ศีรษะ +ศีรษะกระบือ +ศีรษะโค +ศีรษะช้าง +ศีรษะเนื้อ +ศีล +ศีลจุ่ม +ศีลธรรม +ศีลมหาสนิท +ศีลล้างบาป +ศีลวัต +ศีลอด +ศึก +ศึกษา +ศึกษาธิการ +ศึกษานิเทศก์ +ศึกหน้านาง +ศุกร- +ศุกร์ +ศุกรวรรณ +ศุกล- +ศุกลปักษ์ +ศุกลัม +ศุกะ +ศุจิ +ศุจิกรรม +ศุทธ +ศุทธิ +ศุน +ศุนัก +ศุนิ +ศุภ- +ศุภกร +ศุภเคราะห์ +ศุภนิมิต +ศุภมัสดุ +ศุภมาตรา +ศุภมาส +ศุภร- +ศุภอักษร +ศุภางค์ +ศุลก- +ศุลกากร +ศุลการักษ์ +ศุลี +ศุษิร +ศูกร +ศูทร +ศูนย- +ศูนย์ +ศูนย์การค้า +ศูนย์ชุมชน +ศูนย์พ่าห์ +ศูนยภาพ +ศูนย์เยาวชน +ศูนยวาท +ศูนย์สัมบูรณ์ +ศูนย์สูตร +ศูล +ศูลิน +เศรณี +เศรษฐ- +เศรษฐ์ +เศรษฐกิจ +เศรษฐศาสตร์ +เศรษฐี +เศร้า +เศร้าหมอง +เศลษ +เศวดงค์ +เศวดีภ +เศวต +เศวต- +เศวตงค์ +เศวตฉัตร +เศวตร +เศวตัมพร +เศวติภ +เศวตีภ +เศวเตภ +เศวาล +เศษ +เศษเกิน +เศษซ้อน +เศษส่วน +เศษสิบ +เศาจ- +เศาไจย +เศาร์ +เศารยะ +เศิก +เศียร +โศก +โศก- +โศกนาฏกรรม +โศกศัลย์ +โศกา +โศกาดูร +โศกาลัย +โศกี +โศจนะ +โศจนียะ +โศจิ +โศถะ +โศธนะ +โศผะ +โศภ +โศภน +โศภา +โศภิต +โศภิน +โศภิษฐ์ +โศภี +โศรณิ +โศรณี +โศรดา +โศรตร +โศลก +ไศล +ไศล- +ไศวะ +ษ +ษมา +ษมายุมแปลง +ษัฏ +ษัฏกะ +ษัฑ +ษัณ +ษัษ +ษัษฏี +ษัษฐ +ษัษฐี +โษฑศ +โษฑศัน +ส +สก- +สกฏ- +สกฏภาร +สกฏะ +สกทาคามิผล +สกทาคามิมรรค +สกทาคามี +สกนธ์ +สกปรก +สกรณีย์ +สกรรจ์ +สกรรมกริยา +สกล +สกล- +สกลมหาสังฆปริณายก +สกลโลก +สกวาที +สกัด +สกัดแคร่ +สกา +สกาว +สกิทาคามี +สกี +สกีน้ำ +สกุณ +สกุณา +สกุณี +สกุน +สกุนต์ +สกุล +สกุลรุนชาติ +สเกต +สเกตน้ำแข็ง +สแกนเดียม +สขะ +สขา +สขิ +สง +ส่ง +สงกร +สงกรานต์ +ส่งกลิ่น +สงกา +สงโกจ +ส่งข่าว +สงค์ +สงคร +สงคราม +สงครามกลางเมือง +สงครามเย็น +สงครามโลก +สงเคราะห์ +สงฆ์ +ส่งดอก +ส่งเดช +ส่งตัว +ส่งท้าย +สงบ +สงบเสงี่ยม +ส่งภาษา +ส่งลำ +สงวน +สงเษป +ส่งสการ +สงสัย +สงสาร +สงสาร- +สงสารทุกข์ +สงสารวัฏ +ส่งเสริม +ส่งเสีย +ส่งเสียง +สงัด +สง่า +สฐ +สณฑ์ +สด +สดก +สดคาว +สดชื่น +สดน +สดมภ์ +สดๆ ร้อนๆ +สดใส +สดัน +สดับ +สดับตรับฟัง +สดับปกรณ์ +สดำ +สดี +สดุดี +สดูป +สต +สตก +สตน +สตภิสชะ +สตมาหะ +สตรอนเชียม +สตริกนิน +สตรี +สตรีลิงค์ +สตรีลึงค์ +สตัน +สตันย์ +สตัพธ์ +สตัฟฟ์ +สตัมภ์ +สตางค์ +สติ +สติปัญญา +สติปัฏฐาน +สติวินัย +สติสัมปชัญญะ +สตี +สตู +สตูป +สถน +สถบดี +สถล +สถล- +สถลทิน +สถลบถ +สถลมารค +สถวิร- +สถวีร- +สถวีระ +สถาน +สถานการณ์ +สถานภาพ +สถานะ +สถานี +สถาบก +สถาบัน +สถาปนา +สถาปนิก +สถาปนียพยากรณ์ +สถาปนียวาที +สถาปัตยกรรม +สถาปัตยกรรมศาสตร์ +สถาพร +สถาล +สถาวร +สถิต +สถิตยศาสตร์ +สถิติ +สถิติศาสตร์ +สถิร- +สถุล +สถูป +สทึง +สทุม +สธน +สธุสะ +สน +ส้น +สนใจ +สนเดก +สนตะพาย +ส้นตีน +สนทนา +สนทรรศ +สนทรรศน์ +สนทิศ +สนเทศ +สนเท่ห์ +สนธยา +สนธิ +สนธิสัญญา +สนธิอลงกต +สนนราคา +สนแผง +สนม +สนมเอก +สนวน +สนหางสิงห์ +สนอง +สนองไข +สนองได +สนองโอษฐ์ +สนอบ +สนอม +สนะ +สนัด +สนัดใจ +สนั่น +สนับ +สนับแข้ง +สนับงา +สนับทึบ +สนับนิ้วมือ +สนับเพลา +สนับมือ +สนับสนุน +สนาดก +สนาน +สนาบก +สนาบัน +สนาม +สนามเพลาะ +สนามหลวง +สนายุ +สนิก +สนิท +สนิทสนม +สนิธ +สนิม +สนิมสร้อย +สนุก +สนุกเกอร์ +สนุกสนาน +สนุข +สนุต +สนุ่น +สบ +สบง +สบจ +สบถ +สบประมาท +สบสังวาส +สบเสีย +สบัน +สบาย +สบู่ +สบู่เลือด +สไบ +สไบเฉียง +สไบนาง +สปริง +สปาเกตตี +สเปกตรัม +สเปกโทรสโคป +สไปริลลัม +สพั้น +สพาบ +สภา +สภากาชาด +สภาค +สภาจาร +สภานายก +สภาบดี +สภาพ +สภาพธรรม +สภาว- +สภาวการณ์ +สภาวะ +สม +ส้ม +สมการ +สมการเคมี +ส้มกุ้ง +สมคบ +สมควร +สมคะเน +สมจร +สมจริง +สมจารี +ส้มชื่น +ส้มเช้า +สมญา +สมเญศ +สมณ- +สมณบริขาร +สมณโวหาร +สมณศักดิ์ +สมณสารูป +สมณสาสน์ +สมณะ +สมดุล +สมเด็จ +สมเด็จพระสังฆราช +ส้มตำ +สมถ- +สมถยานิก +สมถวิปัสสนา +สมถะ +สมทบ +ส้มทับ +สมนอก +สมนัย +สมนาคุณ +สมน้ำสมเนื้อ +สมน้ำหน้า +สมใน +สมบัติ +สมบัตินักเลง +สมบัติผู้ดี +สมบุกสมบัน +สมบุญ +สมบูรณ์ +สมบูรณาญาสิทธิราชย์ +สมประกอบ +สมประดี +สมปฤดี +สมปฤๅดี +ส้มป่อย +สมปัก +สมผุส +ส้มแผ่น +สมพง +สมพงศ์ +สมพรปาก +สมพล +สมพัตสร +สมพาส +สมเพช +สมโพธน์ +สมโพธิ +ส้มฟัก +สมภพ +สมภาร +สมโภค +สมโภช +สมมต +สมมติ +สมมติ- +สมมติฐาน +ส้มมะขาม +สมมาตร +ส้มมือ +สมมุติ +สมมุติ- +สมมุติฐาน +สมมูล +สมมูลเคมี +สมโมท +สมยอม +สมโยค +สมร +สมร- +สมรด +สมรภูมิ +สมรรถ +สมรรถ- +สมรรถนะ +สมรรถภาพ +สมรส +สมรู้ +สมฤดี +สมฤติ +สมฤๅดี +ส้มลิ้ม +สมวัย +สมวายะ +สมสัก +ส้มสันดาน +สมสู่ +สมเสร็จ +ส้มเสี้ยว +สมหน้าสมตา +สมเหตุสมผล +สมอ +สมอกานน +สมอง +สมองตาย +สมองฝ่อ +สมอจีน +สมอทะเล +สมอสำเภา +สมอ้าง +สมัค +สมัคร +สมัครพรรคพวก +สมัครสมา +สมัครสมาน +สมังคี +สมัช +สมัชชา +สมัญญา +สมัต +สมัน +สมันต์ +สมัย +สมัยเก่า +สมัยใหม่ +สมา +สมาคม +สมาจาร +สมาชิก +สมาทาน +สมาธิ +สมาน- +สมานคติ +สมานฉันท์ +สมานสังวาส +สมาบัติ +สมาพันธรัฐ +สมาส +สม่ำเสมอ +สมิง +สมิงทอง +สมิงพราย +สมิงมิ่งชาย +สมิต +สมิติ +สมิทธ์ +สมิทธิ +สมี +สมีป +สมีร +สมุก +สมุจจัย +สมุจเฉท +สมุจเฉท- +สมุจเฉทปหาน +สมุฏฐาน +สมุด +สมุดไทย +สมุดปูมเดินทาง +สมุตถาน +สมุทร +สมุทร- +สมุทรโคดม +สมุทรโจร +สมุทรศาสตร์ +สมุทรเสนา +สมุทัย +สมุน +สมุนไพร +สมุลแว้ง +สมุห- +สมุห์ +สมุหกลาโหม +สมุหเทศาภิบาล +สมุหนาม +สมุหนายก +สมุหประธาน +สมุหพระกลาโหม +สโมธาน +สโมสร +สโมสรสันนิบาต +สยด +สยดสยอง +สยดแสยง +สยนะ +สยบ +สยมพร +สยมภู +สยอง +สยอน +สยัมพร +สยัมวรา +สยาม +สยาม- +สยามรัฐ +สยาย +สยิว +สยิ้ว +สยุ่น +สยุมพร +สยุมภู +สร +สรก +สรง +สร่ง +สรฏะ +สรณ- +สรณคมน์ +สรณตรัย +สรณะ +สรณาคมน์ +สรดัก +สรดึ่น +สรดื่น +สรตะ +สรตัก +สรทะ +สรทึง +สรแทบ +สรนุก +สรเนาะ +สรไน +สรบ +สรบบ +สรบับ +สรพ +สรเพชญ +สรภะ +สรภัญญะ +สรภู +สรม +สรร +สรรค์ +สรรพ +สรรพ- +สรรพคราส +สรรพคุณ +สรรพนาม +สรรพสามิต +สรรพัชญ +สรรพากร +สรรพางค์ +สรรเพชญ +สรรเพชุดา +สรรเพชุดาญาณ +สรรวง +สรรเสริญ +สรรแสร้ง +สรลน +สรลม +สรลมสลวน +สรลอด +สรลอน +สรละ +สรล้าย +สรลิด +สรเลข +สรวง +สรวงเส +สรวป +สรวม +สรวมชีพ +สรวล +สรวลเส +สรวลเสเฮฮา +สรเสริญ +สร้อย +สร้อยทอง +สร้อยทะแย +สร้อยนกเขา +สร้อยน้ำผึ้ง +สร้อยระย้า +สร้อยเศร้า +สร้อยสน +สร้อยอ่อน +สร้อยอินทนิล +สระ +สระกอ +สระคราญ +สระดะ +สระท้อน +สระพรั่ง +สระอาด +สระอื้น +สรั่ง +สรัสวดี +สร่าง +สร้าง +สร้างวิมานในอากาศ +สร้างสรรค์ +สราญ +สร้าวเสียว +สริต +สรี้ +สรีร- +สรีรกิจ +สรีรธาตุ +สรีรวิทยา +สรีรศาสตร์ +สรีระ +สรีรังคาร +สรีรางคาร +สรีสฤบ +สรุก +สรุกเกรา +สรุง +สรุโนก +สรุป +สรุสระ +สรูป +สโรช +สฤก +สฤคาล +สฤต +สฤษฎี +สฤษฏ์ +สล +สลด +สลบ +สลบไสล +สลบเหมือด +สลวน +สลวย +สลอด +สลอน +สลอย +สละ +สละสลวย +สลัก +สลักเกลียว +สลักเต้ +สลักเพชร +สลักสำคัญ +สลักเสลา +สลักหลัง +สลัด +สลัดได +สลับ +สลับฉาก +สลัว +สลา +สลาก +สลากกินแบ่ง +สลากกินรวบ +สลากภัต +สลาง +สล้าง +สลาด +สลาตัน +สลาบ +สลาย +สลาเหิน +สลิด +สลิล +สลึก +สลึง +สลุต +สลุบ +สลุมพร +สแลง +สว- +สวก +สวกรรม +สวการย์ +ส้วง +สวด +สวน +ส่วน +ส่วนกลาง +สวนควัน +สวนความ +ส่วนได้ส่วนเสีย +ส่วนตัว +ส่วนท้องถิ่น +สวนแทง +ส่วนประกอบ +สวนปากสวนคำ +ส่วนผสม +ส่วนภูมิภาค +ส่วนรวม +ส่วนลด +สวนสนาม +ส่วนสัด +ส่วนหน้า +ส่วนหลัง +สวนะ +สวนาการ +สวนิต +สวนีย- +สวบ +สวภาพ +สวม +ส้วม +สวมกอด +สวมรอย +สวมหัวโขน +สวย +ส่วย +ส้วย +สวยแต่รูป จูบไม่หอม +สวยม +สวยมพร +สวยมภู +ส้วยเสี้ยว +สวร +สวรรค- +สวรรค์ +สวรรคต +สวรรคบดี +สวรรค์อยู่ในอก นรกอยู่ในใจ +สวรรคาลัย +สวรรยา +สวราชย์ +สวะ +สวัสดิ์ +สวัสดิการ +สวัสดี +สวัสติ +สวัสติกะ +สวา +สวาคต +สวาง +สว่าง +สว่างไสว +สวาด +สวาดิ +สวาตี +สวาท +สว่าน +สว้าน +สวาบ +สวาปาม +สวามิ +สวามินี +สวามิภักดิ์ +สวามี +สวาย +สวายสอ +สวาสดิ์ +สวาหะ +สวิง +สวิงสวาย +สวิญญาณกทรัพย์ +สวิตช์ +สสาร +สสาร- +สสารนิยม +สสุระ +สสุรี +สห- +สหกรณ์ +สหการ +สหจร +สหชาต +สหชาติ +สหธรรม +สหธรรมิก +สหบาน +สหประชาชาติ +สหพันธ์ +สหพันธรัฐ +สหภาพ +สหภาพแรงงาน +สหศึกษา +สหัช +สหัมบดี +สหัส- +สหัสธารา +สหัสนัยน์ +สหัสเนตร +สหัสรังสี +สหัสสะ +สหัสา +สหาย +สอ +ส่อ +สอง +ส่อง +ส้อง +สองเกลอ +สองจิตสองใจ +สองใจ +สองต่อสอง +สองผม +สองฝักสองฝ่าย +สองไม้ +สองฤดู +สองสลึงเฟื้อง +สองหน้า +สอด +สอดคล้อง +สอดแคล้ว +สอดแนม +สอดรู้ +สอดรู้สอดเห็น +สอดส่อง +สอดใส่ +สอดไส้ +สอน +ส่อน +สอนจระเข้ให้ว่ายน้ำ +สอนหนังสือสังฆราช +สอบ +สอบซ้อม +สอบปากคำ +สอบพยาน +สอบไล่ +สอบสวน +สอบสวนทวนพยาน +สอปูน +สอพลอ +ส้อม +สอย +สอยดอกฟ้า +สอยดาว +สอยผม +สอยไร +ส่อเสียด +สะ +สะกด +สะกอ +สะกาง +สะการะ +สะการะตาหรา +สะกิด +สะเก็ด +สะแก +สะแกวัลย์ +สะแกแสง +สะคร้อ +สะคราญ +สะค้าน +สะเงาะสะแงะ +สะใจ +สะดม +สะดวก +สะดัก +สะดิ้ง +สะดึง +สะดือ +สะดุ้ง +สะดุ้งมาร +สะดุด +สะดุดใจ +สะดุดตา +สะดุดหู +สะเด็ด +สะเดา +สะเดาดิน +สะเดาอินเดีย +สะเดาะ +สะตอ +สะตอเบา +สะตาหมัน +สะตึ +สะตือ +สะตุ +สะเต๊ะ +สะโตก +สะทก +สะทน +สะท้อน +สะท้อนใจ +สะท้าน +สะทึก +สะทึน +สะทึ่น +สะเทิน +สะเทิ้น +สะเทินน้ำสะเทินบก +สะเทือน +สะเทื้อน +สะเทือนใจ +สะบะ +สะบัก +สะบักจม +สะบักสะบอม +สะบัด +สะบัดก้น +สะบัดมือ +สะบัดร้อนสะบัดหนาว +สะบัดลุกสะบัดนั่ง +สะบัดสะบิ้ง +สะบัดหน้า +สะบั้น +สะบันงา +สะบันงาจีน +สะบันงาต้น +สะบ้า +สะบ้าหัวเข่า +สะบู +สะแบง +สะเปะสะปะ +สะพรัก +สะพรั่ง +สะพรึงกลัว +สะพรึบ +สะพัก +สะพัง +สะพัด +สะพั้น +สะพาน +สะพานแขวน +สะพานชัก +สะพานเชือก +สะพานเดินเรือ +สะพานทุ่น +สะพานเบี่ยง +สะพานปลา +สะพานไฟ +สะพานลอย +สะพานเสี้ยว +สะพานหก +สะพานหัน +สะพาย +สะพายแล่ง +สะเพร่า +สะโพก +สะเภา +สะใภ้ +สะโมง +สะระตะ +สะระแหน่ +สะละปะตุ่น +สะลาง +สะลึมสะลือ +สะวี้ดสะว้าด +สะสม +สะสวย +สะสาง +สะอาง +สะอาด +สะอ้าน +สะอิ้ง +สะอิดสะเอียน +สะอึก +สะอึกเข้าใส่ +สะอึกสะอื้น +สะอื้น +สะเอ้ง +สะเอว +สะเออะ +สะโอดสะอง +สะไอ +สัก +สักกะ +สักกัจจะ +สักกาย- +สักกายทิฐิ +สักการ- +สักการะ +สักขรา +สักขี +สักขี้ไก่ +สักฏะ +สักตะ +สักแต่ว่า +สักยะ +สักวา +สักว่า +สักหลาด +สัขยะ +สัค +สัคคะ +สั่ง +สังกมทรัพย์ +สังกร +สังกรณี +สังกะตัง +สังกะวัง +สังกะวาด +สังกะสี +สังกัด +สังกัปปะ +สังกา +สังการ +สังกาศ +สังกิเลส +สังเกต +สังเกตการณ์ +สังข- +สังข์ +สังขกร +สังขต- +สังขตธรรม +สังขตะ +สังขยา +สังขลิก +สังขลิกา +สังขาร +สังขาร- +สังขารธรรม +สังขารโลก +สังเขป +สังโขภ +สังค- +สังค์ +สังคญาติ +สังคม +สังคม- +สังคมนิยม +สังคมวิทยา +สังคมศาสตร์ +สังคมศึกษา +สังคมสงเคราะห์ +สังคหะ +สังคัง +สังคาตา +สังคายนา +สังคายนาย +สังคีต +สังคีติ +สังเค็ด +สังเคราะห์ +สังฆ- +สังฆกรรม +สังฆการี +สังฆเถระ +สังฆทาน +สังฆนายก +สังฆปาโมกข์ +สังฆภัต +สังฆเภท +สังฆมณฑล +สังฆมนตรี +สังฆราช +สังฆสภา +สังฆาฏิ +สังฆาณัติ +สังฆาทิเสส +สังฆาธิการ +สังฆานุสติ +สังฆาวาส +สังดัก +สังปะติแหงะ +สังปะลิเหงะ +สังโยค +สังโยชน์ +สังวร +สังวัจฉระ +สังวัธยาย +สังวาล +สังวาลพราหมณ์ +สังวาส +สังเวคะ +สังเวช +สังเวย +สังเวียน +สังสกฤต +สังสการ +สังสดมภ์ +สังสนทนา +สั่งสนทนา +สั่งสม +สังสรรค์ +สั่งสอน +สังสารวัฏ +สังสิทธิ +สังสุทธ์ +สังสุทธิ +สั่งเสีย +สังหร +สังหรณ์ +สังหรรษ +สังหาร +สังหาริมทรัพย์ +สังหาริมะ +สังหิต +สัจ +สัจ- +สัจกิริยา +สัจจะ +สัจญาณ +สัจนิยม +สัจพจน์ +สัชฌ- +สัชฌกร +สัชฌการ +สัชฌะ +สัชฌายะ +สัชฌุ +สัชฌุกร +สัชฌุการ +สัญจร +สัญจรโรค +สัญจาร +สัญเจตนา +สัญชาต- +สัญชาตญาณ +สัญชาติ +สัญฌา +สัญญา +สัญญาณ +สัญญาบัตร +สัญญาประกันชีวิต +สัญญาประกันภัย +สัญญาวิปลาส +สัญญี +สัญโญชน์ +สัญประกาศ +สัญโยค +สัญลักษณ์ +สัฐิ +สัณฐาน +สัณฐิติ +สัณฑ์ +สัณห์ +สัด +สัดจอง +สัดส่วน +สัต +สัต- +สัตการ +สัตตบงกช +สัตตบรรณ +สัตตบุษย์ +สัตตะ +สัตตาห- +สัตตาหกาลิก +สัตตู +สัตถ- +สัตถันดร +สัตถา +สัตถิ +สัตถุ +สัตถุศาสนา +สัตบถ +สัตบรรณ +สัตบริภัณฑ์ +สัตบุรุษ +สัตภัณฑ์ +สัตม- +สัตมวาร +สัตย- +สัตย์ +สัตยพรต +สัตยวาที +สัตยาเคราะห์ +สัตยาธิษฐาน +สัตยาบัน +สัตว- +สัตว์ +สัตวบาล +สัตวแพทย์ +สัตวโลก +สัตววิทยา +สัตวา +สัตวาร +สัตสดก +สัทธรรม +สัทธา +สัทธาจริต +สัทธาธิก +สัทธิงวิหาริก +สัทธินทรีย์ +สัทธิวิหาริก +สัทศาสตร์ +สัน +สั่น +สั้น +สันเขา +สันดอน +สันดาน +สันดาป +สันเดก +สันโดษ +สันต์ +สันตติ +สันตะปาปา +สันตะวา +สันติ +สันติกะ +สันติภาพ +สันตุฏฐี +สันถระ +สันถว- +สันถวไมตรี +สันถวะ +สันถัต +สันถาร +สันทนะ +สันทะ +สันทัด +สันทัดกรณี +สันทัสนะ +สันทาน +สันทิฐิก- +สันทิส +สันเทส +สันเทห +สันธาน +สันนิธิ +สันนิบาต +สันนิวาส +สันนิเวส +สันนิษฐาน +สันปันน้ำ +สันพร้านางแอ +สันพร้ามอญ +สันพร้าหอม +สันรวง +สันลึก +สันสกฤต +สันหลัง +สันหลังยาว +สับ +สับเกลียว +สับเงา +สับเชือก +สับนก +สับปลับ +สับปลี้ +สับปะขาว +สับปะรด +สับเปลี่ยน +สับสน +สับหลีก +สัปคับ +สัปคับช้าง +สัปด- +สัปดน +สัปดปกรณ์ +สัปดประกรณ์ +สัปดสดก +สัปดาห์ +สัปดาหะ +สัปต- +สัปตศก +สัปทน +สัปปะ +สัปปิ +สัปปุริส- +สัปปุรุษ +สัประยุทธ์ +สัปหงก +สัปเหร่อ +สัพ +สัพพะ +สัพพัญญู +สัพเพเหระ +สัพยอก +สัมบูรณ์ +สัมปชัญญะ +สัมปทา +สัมปทาน +สัมปยุต +สัมปโยค +สัมประสิทธิ์ +สัมประหาร +สัมปรายภพ +สัมปรายิกภพ +สัมปัตติ +สัมผัปลาป +สัมผัส +สัมผัสนอก +สัมผัสใน +สัมผัสสระ +สัมผัสอักษร +สัมพล +สัมพหุลา +สัมพัจฉร- +สัมพัจฉรฉินท์ +สัมพัตสร +สัมพัทธ์ +สัมพันธ- +สัมพันธ์ +สัมพันธน์ +สัมพันธภาพ +สัมพันธมิตร +สัมพันธไมตรี +สัมพาธะ +สัมพาหน์ +สัมพาหะ +สัมพุทธ- +สัมพุทธะ +สัมโพธิ +สัมภวะ +สัมภเวสี +สัมภัต +สัมภัตตะ +สัมภาระ +สัมภาษณ์ +สัมเภทะ +สัมโภคกาย +สัมมนา +สัมมัปธาน +สัมมา +สัมมากัมมันตะ +สัมมาจริยา +สัมมาชีพ +สัมมาทิฐิ +สัมมาวาจา +สัมมาวายามะ +สัมมาสติ +สัมมาสมาธิ +สัมมาสังกัปปะ +สัมมาอาชีวะ +สัมโมทนียกถา +สัมฤทธิ- +สัมฤทธิ์ +สัมฤทธิศก +สัยน์ +สัลลาป- +สัลเลข- +สัสดี +สัสต- +สัสตทิฐิ +สัสสะ +สัสสุ +สัสสู +สัสุรี +สา +ส่า +สาก +สากกะเบือ +สากรรจ์ +สากล +สากษิน +สากษี +สากหยาก +สากัจฉา +สากัลย์ +สากิย- +สากิยบุตร +สากิยมุนี +สากิยะ +สาเก +ส่าขนุน +สาขา +ส่าไข้ +สาคร +สาคเรศ +สาคู +สาคูลาน +สาคูวิลาด +สาง +ส้าง +สางคลื่น +สางห่า +สาฎก +สาฏิก- +สาณ- +สาณี +สาด +สาดโคลน +สาดน้ำรดกัน +สาดเสียเทเสีย +สาต +สาตรา +สาไถย +สาทร +สาทิส +สาทิส- +สาทิสลักษณ์ +สาทุ +สาโท +สาธก +สาธย- +สาธยะ +สาธยาย +สาธารณ- +สาธารณ์ +สาธารณภัย +สาธารณรัฐ +สาธารณสถาน +สาธารณสมบัติ +สาธารณสมบัติของแผ่นดิน +สาธารณสุข +สาธารณะ +สาธารณูปการ +สาธารณูปโภค +สาธิต +สาธุ +สาธุการ +สาธุชน +สาธุสะ +สาน +ส่าน +สานตวะ +สานุ +สานุศิษย์ +สานู +สาบ +สาบขนุน +สาบแร้ง +สาบแร้งสาบกา +สาบสูญ +สาบเสือ +สาบาน +สาบานธง +สาป +สาปไตย +สาปสรร +สาม +สามกษัตริย์ +สามเกลอ +สามแก้ว +สามขา +สามขุม +สามเขี้ยว +สามคาน +สามง่าม +สามชุก +สามแซ่ +สามเณร +สามเณรี +สามตา +สามนต- +สามนต์ +สามนตราช +สามใบเถา +สามเพลงตกม้าตาย +สามเมา +สามยทรัพย์ +สามรส +สามล +สามล้อ +สามลำคาน +สามวันดีสี่วันไข้ +สามเวท +สามเศียร +สามสลึงเฟื้อง +สามสิบกลีบ +สามเส้า +สามหมุด +สามหาบ +สามหาว +สามเหลี่ยม +สามเหลี่ยมด้านเท่า +สามเหลี่ยมมุมฉาก +สามเหลี่ยมมุมป้าน +สามเหลี่ยมมุมแหลม +สามเหลี่ยมหน้าจั่ว +สามัคคี +สามัญ- +สามัญสำนึก +สามัตถิยะ +สามานย- +สามานย์ +สามานยนาม +สามารถ +สามิก +สามิต +สามินี +สามิภักดิ์ +สามี +สามีจิกรรม +สาย +ส่าย +ส้าย +สายกระได +สายใจ +สายชู +สายซุง +สายดิน +สายตะพาย +สายตัว +สายตา +สายตาพิการ +สายติ่ง +สายน้ำ +สายน้ำผึ้ง +สายบัว +สายพาน +สายฟ้า +สายมงคล +สายม่าน +สายยู +สายโยก +สายใย +สายระเดียง +สายระยาง +สายระโยง +สายรัดทึบ +สายรุ้ง +สายล่อฟ้า +สายลับ +สายเลือด +สายโลหิต +ส่ายศึก +ส่ายเศิก +สายสนกลใน +สายสมร +สายสร้อย +สายสวาท +สายสะพาย +สายสิญจน์ +สายสูตร +สายหยุด +สายเหา +สายอากาศ +สายเอก +สายัณห์ +สายาห์ +สาร +สาร- +สารกรมธรรม์ +สารคดี +สารตรา +สารถี +สารถีชักรถ +สารท +สารทา +สารทุกข์สุกดิบ +สารธรรม +สารนิเทศ +สารบบ +สารบรรณ +สารบัญ +สารบับ +ส้ารบับ +สารบาญ +สารบาญชี +สารประกอบ +สารประโยชน์ +สารพัด +สารพัน +สารพางค์ +สารภาพ +สารภี +สารภีทะเล +สารภีป่า +สารไมย +สารละลาย +สารวัด +สารวัตร +สารสนเทศ +สารส้ม +สารหนู +สารหนูขาว +สาระ +สาระโกก +สาระแน +สาระพา +สาระพาเฮโล +สาระวอน +สาระวารี +สาระสะมา +สารัตถ- +สารัตถะ +สารัตถะประโยชน์ +สารัทธ์ +สารัมภ์ +สาราณีย- +สาราณียกร +สาราณียธรรม +สาราณียะ +สารานุกรม +สารีริกธาตุ +สารูป +สาโรช +สาละ +สาละวน +สาลิ +สาลิกา +สาลินี +สาลี +สาลี่ +สาลู +ส่าเลือด +สาโลหิต +สาว +สาวก +สาวกระทืบหอ +สาวก้าว +สาวแก่ +สาวเท้า +สาวน้อยเล่นน้ำ +สาวนะ +สาวแส้ +สาวไส้ +สาวไส้ให้กากิน +สาวิกา +สาวิตร +สาวิตรี +สาสน +สาสน- +สาสน์ +สาสนธรรม +สาสนา +สาหร่าย +สาหรี +ส่าหรี +สาหัตถ- +สาหัตถิก- +สาหัส +สาหัสสากรรจ์ +ส่าเห็ด +สาเหตุ +ส่าเหล้า +สาแหรก +สาฬุระ +สำ +ส่ำ +สำคัญ +สำซ่าง +สำแดง +สำทับ +สำนวด +สำนวน +สำนวนความ +สำนอง +สำนัก +สำนักสงฆ์ +สำนาน +สำนึก +สำนึง +สำเนา +สำเนียง +สำบอก +สำบัดสำนวน +สำปะลอ +สำปะหลัง +สำปั้น +สำปันนี +สำเภา +สำเภาทอง +สำมะงา +สำมะโน +สำมะโนครัว +สำมะโนประชากร +สำมะลอ +สำมะเลเทเมา +สำมะหา +สำรด +สำรวจ +สำรวม +สำรวมใจ +สำรวย +สำรวล +สำรอก +สำรอง +สำรับ +สำราก +สำราญ +สำริด +สำเร็จ +สำเร็จโทษ +สำเร็จรูป +สำเรา +สำเริง +สำโรง +สำลัก +สำลาน +สำลี +สำแลง +สำสร้าง +สำส่อน +สำสา +สำเส็ด +ส่ำเสีย +สำหรวด +สำหรับ +สำหา +สำเหนียก +สำเหร่ +สำออย +สำอาง +สิ +สิกข์ +สิกขมานา +สิกขา +สิกขากาม- +สิกขาบท +สิขร +สิขรี +สิขเรศ +สิขา +สิขานล +สิขี +สิคาล +สิง +สิ่ง +สิงขร +สิ่งของ +สิงค์ +สิงคลิ้ง +สิงคลี +สิงคาร +สิงคาล +สิงคี +สิงโต +สิงโตทะเล +สิ่งพิมพ์ +สิ่งละอันพันละน้อย +สิ่งแวดล้อม +สิงสถิต +สิงสาราสัตว์ +สิงสู่ +สิงห- +สิงห์ +สิงหนาท +สิงหบัญชร +สิงหรา +สิงหราช +สิงหล +สิงหลก- +สิงหาคม +สิงหาสน์ +สิญจ- +สิญจน์ +สิต- +สิตางศุ์ +สิถิล +สิทธ- +สิทธ์ +สิทธา +สิทธาจารย์ +สิทธานต์ +สิทธารถ +สิทธิ +สิทธิ์ +สิทธิกร +สิทธิการิยะ +สิทธิ์ขาด +สิทธิครอบครอง +สิทธิชัย +สิทธิโชค +สิทธิบัตร +สิทธิยึดหน่วง +สิทธิสภาพนอกอาณาเขต +สิธยะ +สิน +สิ้น +สินค้า +สินค้าเข้า +สินค้าออก +สิ้นคิด +สินจ้าง +สิ้นใจ +สิ้นชีพ +สิ้นชีพตักษัย +สิ้นชีวิต +สิ้นเชิง +สินเชื่อ +สินใช้ +สินเดิม +สิ้นตำรา +สิ้นแต้ม +สินไถ่ +สินทรัพย์ +สิ้นท่า +สินทูระ +สินเทา +สินธพ +สินธุ +สินธุระ +สินเธาว์ +สินน้ำใจ +สิ้นเนื้อประดาตัว +สินบน +สินบริคณห์ +สิ้นบุญ +สิ้นประตู +สิ้นพระชนม์ +สินระบาด +สินแร่ +สิ้นไร้ไม้ตอก +สิ้นฤทธิ์ +สิ้นลม +สินสมรส +สินส่วนตัว +สินสอด +สิ้นสุด +สินหัวบัวนาง +สินไหม +สินไหมทดแทน +สินะ +สินาด +สินิทธ์ +สินี +สิเนรุ +สิเนหก +สิเนหนียะ +สิเนหะ +สิเนหา +สิเน่หา +สิบ +สิบเบี้ยใกล้มือ +สิบแปดมงกุฎ +สิปปะ +สิพนะ +สิมพลี +สิร- +สิระ +สิริ +สิรี +สิโรดม +สิโรตม์ +สิลา +สิโลก +สิว +สิ่ว +สิ่วน่อง +สิวเสี้ยน +สิวะ +สิวาลัย +สิวิกา +สิหนา +สี +สี่ +สี้ +สีกรุด +สีกา +สีกุน +สีข้าง +สีฆ- +สีจัก +สีชมพูดง +สีชมพูสวน +สีซอให้ควายฟัง +สีด +สีดอ +สีต- +สีต้น +สีตล- +สีตลรัศมี +สีตลหฤทัย +สีตโลทก +สีโตทก +สีทันดร +สี่บท +สีผึ้ง +สีฝัด +สีฟันคนทา +สีฟันนางแอ +สีไฟ +สีมันต์ +สีมา +สีลม +สีละมัน +สีวิกา +สีสวรรค์ +สีสอ +สีสะ +สีสา +สีสุก +สีเสียด +สีเสียดแก่น +สีเสียดเปลือก +สีเสียดเหนือ +สีเสื้อน้อย +สีห- +สีห์ +สีหน้า +สีหนาท +สีหบัญชร +สีหราช +สีหะ +สี่เหลี่ยม +สี่เหลี่ยมขนมเปียกปูน +สี่เหลี่ยมคางหมู +สี่เหลี่ยมจัตุรัส +สี่เหลี่ยมด้านขนาน +สี่เหลี่ยมด้านไม่เท่า +สี่เหลี่ยมผืนผ้า +สึก +สึกหรอ +สึง +สืบ +สืบไป +สืบพยาน +สืบพันธุ์ +สืบพันธุ์แบบไม่อาศัยเพศ +สืบพันธุ์แบบอาศัยเพศ +สืบราชสมบัติ +สืบราชสันตติวงศ์ +สืบศาสนา +สืบสวน +สืบสันดาน +สืบสาย +สืบสาวราวเรื่อง +สืบเสาะ +สืบหูก +สื่อ +สื่อการศึกษา +สื่อมวลชน +สื่อสาร +สื่อสารมวลชน +สุ +สุก +สุกก่อนห่าม +สุกข์ +สุกดิบ +สุกๆ ดิบๆ +สุกแดด +สุกร +สุกรม +สุกใส +สุกเอาเผากิน +สุกำศพ +สุกียากี้ +สุข +สุข- +สุขนาฏกรรม +สุขภัณฑ์ +สุขภาพ +สุขลักษณะ +สุขวิทยา +สุขศาลา +สุขศึกษา +สุขา +สุขาภิบาล +สุขารมณ์ +สุขาวดี +สุขิน +สุขี +สุขุม +สุขุมาล +สุคต +สุคติ +สุคนธ- +สุคนธ์ +สุคนธรส +สุคันธ์ +สุงก- +สุงกะ +สุงกากร +สุงสิง +สุงสุมาร +สุงสุมารี +สุจริต +สุจหนี่ +สุจะ +สุจิ +สุจิต +สุจิตร +สุชน +สุชัมบดี +สุชา +สุชาดา +สุญ +สุญ- +สุญญ- +สุญญากาศ +สุญตา +สุญนิยม +สุณ +สุณหา +สุณิสา +สุด +สุดกำลัง +สุดกู่ +สุดขีด +สุดคน +สุดคิด +สุดจิต +สุดใจ +สุดด้าม +สุดแต่ +สุดโต่ง +สุดท้อง +สุดท้าย +สุดท้ายปลายโต่ง +สุดแรงเกิด +สุดลิ่ม +สุดวิสัย +สุดสงวน +สุดสวาทขาดใจ +สุดสายป่าน +สุดเสียง +สุดเสียงสังข์ +สุดหล้าฟ้าเขียว +สุดเหวี่ยง +สุดา +สุต +สุตกวี +สุตตะ +สุตตันตปิฎก +สุตตันตะ +สุติ +สุทธ- +สุทธ์ +สุทธาวาส +สุทธิ +สุทรรศน์ +สุทัศน์ +สุธา +สุธาการ +สุธาโภชน์ +สุธารส +สุธารสชา +สุธาสินี +สุธาสี +สุธี +สุนทร +สุนทร- +สุนทรพจน์ +สุนทรี +สุนทรีย- +สุนทรียภาพ +สุนทรียศาสตร์ +สุนทรียะ +สุนัข +สุนันท์ +สุโนก +สุบดี +สุบรรณ +สุบิน +สุปรีดิ์ +สุปรีย์ +สุปาณี +สุพพัต +สุพรรณ +สุพรรณ- +สุพรรณถัน +สุพรรณบัฏ +สุพรรณภาชน์ +สุพรรณราช +สุพรรณศรี +สุพรรณิการ์ +สุภ- +สุภร +สุภัค +สุภา +สุภาพ +สุภาพชน +สุภาพบุรุษ +สุภาพสตรี +สุภาษิต +สุม +สุ่ม +สุมขอน +สุมควัน +สุ่มตัวอย่าง +สุมทุม +สุมน +สุมนะ +สุมนัส +สุมนา +สุมยุง +สุ่มสี่สุ่มห้า +สุ้มเสียง +สุมหัว +สุมะ +สุมาลี +สุเมธ +สุเมรุ +สุร- +สุรคต +สุรงค์ +สุรเชษฐ์ +สุรบดี +สุรบถ +สุรภาพ +สุรภี +สุรโลก +สุรสีหนาท +สุรเสียง +สุรังค์ +สุรัติ +สุรัสวดี +สุรา +สุรางค์จำเรียง +สุรางคนา +สุรางคนางค์ +สุราบาน +สุรารักษ์ +สุราลัย +สุรินทร์ +สุรินทราหู +สุริย- +สุริยกันต์ +สุริยกานต์ +สุริยการ +สุริยกาล +สุริยคติ +สุริยคราส +สุริยเคราะห์ +สุริยง +สุริยน +สุริยมณฑล +สุริยะ +สุริยัน +สุริยา +สุริยุปราคา +สุริเยนทร์ +สุริเยศ +สุริโย +สุรีย์ +สุรุ่ยสุร่าย +สุเรนทร์ +สุลต่าน +สุว +สุวภาพ +สุวรรณ +สุวรรณ- +สุวรรณภูมิ +สุวาน +สุวินัย +สุวิมล +สุษิร +สุสาน +สุหนัต +สุหร่ง +สุหร่าย +สุหฤท +สุหัท +สุเหร่า +สู +สู่ +สู้ +สูกษม +สู่ขวัญ +สู่ขอ +สูง +สูงเท่านกเขาเหิน +สูงเทียมเมฆ +สูงส่ง +สูงสุดสอย +สูงอายุ +สูจกะ +สูจนะ +สูจิ +สูจิบัตร +สูเจ้า +สูญ +สูด +สูต +สูตร +สูตรเคมี +สูติ- +สูติกรรม +สูติบัตร +สูติแพทย์ +สูติศาสตร์ +สูท +สูท- +สูทกรรม +สูทศาสตร์ +สูน +สูนุ +สูบ +สูบเลือด +สูบเลือดสูบเนื้อ +สูป- +สูปการ +สูปะ +สู้ยิบตา +สู้เย็บตา +สูร +สู้รบตบมือ +สูรย- +สูรย์ +สูรยกานต์ +สูรยคราส +สูริ +สู่รู้ +สู่สม +สูสี +สู้หน้า +สู่หา +สู้เหมือนหมาจนตรอก +เส +เสก +เสกข- +เสกขบุคคล +เสกขะ +เสกสรร +เสข- +เสขบุคคล +เสขะ +เสความ +เส็ง +เส้ง +เส็งเคร็ง +เสงี่ยม +เสฏฐี +เสณี +เสด +เสด็จ +เสด็จในกรม +เสด็จพระราชดำเนิน +เสต- +เสตุ +เสถียร +เสถียร- +เสถียรภาพ +เสท +เสโท +เสน +เส้น +เส้นแกงร้อน +เส้นขนาน +เส้นแข็ง +เสนง +เสน่ง +เส้นด้าย +เส้นตาย +เส้นตื้น +เส้นทาง +เส้นบังคับ +เส้นผมบังภูเขา +เส้นผ่านศูนย์กลาง +เส้นผ่าศูนย์กลาง +เส้นแผลง +เส้นยาแดงผ่าแปด +เส้นใย +เส้นใยแก้ว +เส้นรอบวง +เส้นรัศมี +เส้นแร +เส้นลายมือ +เส้นลึก +เส้นเลือด +เส้นวันที่ +เส้นศูนย์สูตร +เส้นสมมาตร +เส้นสัมผัส +เส้นสาย +เสนห- +เสน่ห์ +เสน่ห์จันทร์ขาว +เสน่ห์จันทร์แดง +เสน่ห์ปลายจวัก +เส้นหมี่ +เสนหา +เสน่หา +เสนอ +เส้นฮ่อ +เสนะ +เสนา +เสน่า +เสนากุฎ +เสนางค์ +เสนางคนิกร +เสนาธิการ +เสนาธิปัต +เสนานี +เสนาบดี +เสนาพยุห์ +เสนาพยูห์ +เสนาสนะ +เสนาะ +เสนี +เสนีย์ +เสนียด +เสนียะ +เสบย +เสบียง +เสบียงกรัง +เสพ +เสพย์ติด +เสเพล +เสภา +เสม็ด +เสมหะ +เสมอ +เสมอใจ +เสมอต้นเสมอปลาย +เสมอตัว +เสมอนอก +เสมอบ่าเสมอไหล่ +เสมอภาค +เสมอหน้า +เสมา +เสมียน +เสมือน +เสย +เสร็จ +เสริด +เสริม +เสริมสวย +เสรี +เสรีไทย +เสรีธรรม +เสรีนิยม +เสรีภาพ +เสล- +เสลด +เสลดพังพอน +เสลดหางวัว +เสลบรรพต +เสลา +เสลี่ยง +เสลือกสลน +เสโล +เสวก +เสวกามาตย์ +เสวนะ +เสวนา +เสวย +เสวยพระชาติ +เสวียน +เสสรวง +เสสรวล +เสแสร้ง +เสา +เส้า +เสากระโดง +เสาเข็ม +เสาชี้ +เสาดั้ง +เสาตะลุง +เสานางเรียง +เสาร์ +เสารภย์ +เสารี +เสาว- +เสาวคนธ์ +เสาวคันธ์ +เสาวณิต +เสาวธาร +เสาวนะ +เสาวนา +เสาวนาการ +เสาวนีย์ +เสาวภา +เสาวภาคย์ +เสาวภาพ +เสาวรภย์ +เสาวรส +เสาวลักษณ์ +เสาหมอ +เสาหฤท +เสาหาน +เสาเอก +เสาะ +เสาะด้าย +เสาะป่าน +เสาะแสะ +เสิร์จ +เสิร์ฟ +เสีย +เสียกบาล +เสียกระบวน +เสียกล +เสียการ +เสียกำซ้ำกอบ +เสียกำได้กอบ +เสียกำลังใจ +เสียกิริยา +เสียขวง +เสียขวัญ +เสียคน +เสียคำพูด +เสียง +เสี่ยง +เสียงเขียว +เสียงแข็ง +เสี่ยงชีวิต +เสียงแตก +เสียงทอง +เสี่ยงทาย +เสี่ยงบุญเสี่ยงกรรม +เสียงพยัญชนะ +เสี่ยงภัย +เสียงสระ +เสียงหลง +เสียงอ่อน +เสียจริต +เสียใจ +เสียโฉม +เสียชาติเกิด +เสียชื่อ +เสียเชิง +เสียด +เสียดใบ +เสียดสี +เสียดาย +เสียเด็ก +เสียตัว +เสียแต้ม +เสียเถอะ +เสียเถิด +เสียท่า +เสียที +เสี้ยน +เสี้ยนศึก +เสี้ยนหนาม +เสียน้ำใจ +เสียน้ำตา +เสียเนื้อเสียตัว +เสียบ +เสียบน +เสียบหนู +เสียปาก +เสียเปรียบ +เสียผี +เสียผู้ใหญ่ +เสียภูมิ +เสียม +เสี่ยม +เสี้ยม +เสี้ยมเขาควายให้ชนกัน +เสี้ยมสอน +เสี่ยมสาร +เสียรอย +เสียรังวัด +เสียราศี +เสียรู้ +เสียรูป +เสียรูปคดี +เสียแรง +เสียว +เสี่ยว +เสี้ยว +เสียวซ่าน +เสียวไส้ +เสียเศวตฉัตร +เสียสละ +เสียสาว +เสียเส้น +เสียหน่อย +เสียหน้า +เสียหลัก +เสียหลาย +เสียหัว +เสียหาย +เสียเหลี่ยม +เสือ +เสื่อ +เสื้อ +เสือก +เสือกกะโหลก +เสือกคลาน +เสือกระดาษ +เสือกระต่าย +เสื้อกล้าม +เสือกสน +เสือกไส +เสื้อกั๊ก +เสือกินวัว +เสือเก่า +เสือข้ามห้วย +เสือจนท่า ข้าจนทาง +เสือซ่อนเล็บ +เสือเฒ่าจำศีล +เสือดาว +เสือดำ +เสือตกถัง +เสือตบก้น +เสือทลายห้าง ช้างทลายโรง +เสือทะเล +เสือนอนกิน +เสือนั่งร่ม +เสื้อน้ำ +เสื่อน้ำมัน +เสือในร่างสมัน +เสือบอง +เสือปลา +เสือป่า +เสือป่าแมวเซา +เสือป่าแมวมอง +เสือไฟ +เสื่อม +เสื่อมทราม +เสื่อมโทรม +เสื่อมสิทธิ์ +เสื่อมเสีย +เสือแมลงวัน +เสือรู้ +เสื่อลวด +เสือลากหาง +เสื่อลำแพน +เสือสมิง +เสือสิ้นตวัก +เสือสุมาตรา +เสื้อแสง +เสือหมอบ +เสือหิว +แส +แส่ +แส้ +แสก +แสกๆ +แสกหน้า +แสง +แสงเงินแสงทอง +แสงจันทร์ +แสงสว่าง +แสงอาทิตย์ +แสด +แสดง +แสดงออก +แสตมป์ +แสเถา +แสน +แสนกล +แสนง +แสนงอน +แสนย- +แสนย์ +แสนยากร +แสนยานุภาพ +แสนรู้ +แสนเสนาะ +แสนา +แสบ +แสบก +แสม +แสมสาร +แส้ม้า +แส้ม้าทะลาย +แสยก +แสยง +แสยงขน +แสยะ +แสรก +แสร้ง +แสร้งว่า +แสลง +แสลงใจ +แสลงเบื่อ +แสวง +แสอก +แสะ +โสก +โสกโดก +โสกันต์ +โสกาดานา +โสโครก +โสณ +โสณฑ์ +โสณิ +โสณี +โสด +โสดก +โสดม +โสดา +โสดาบัน +โสดาปัตติผล +โสดาปัตติมรรค +โสต +โสต- +โสตถิ +โสตทัศนวัสดุ +โสตทัศนอุปกรณ์ +โสทก +โสทร +โสธก +โสธนะ +โสน +โสนกินดอก +โสนคางคก +โสนหางไก่ +โสนหิน +โสภ- +โสภณ +โสภา +โสภิณี +โสภี +โสเภณี +โสม +โสมนัส +โสมม +โสมย์ +โสมส่องแสง +โสร่ง +โสรจ +โสรจสรง +โสวรรณ +โสหุ้ย +โสฬส +ใส +ใส่ +ใส่ความ +ใส่คะแนนไม่ทัน +ใส่ไคล้ +ใส่ใจ +ใส่ตะกร้าล้างน้ำ +ใส่ถ้อยร้อยความ +ใส่ไฟ +ใส่ยา +ใส่ร้าย +ใส่สาแหรกแขวนไว้ +ใส่สีสัน +ใส่ไส้ +ใส่หน้ากาก +ใส่หน้ายักษ์ +ไส +ไส้ +ไส้กรอก +ไส้ไก่ +ไส้แขวน +ไส้เดือน +ไส้ตัน +ไส้ติ่ง +ไส้เป็นน้ำเหลือง +ไส้เป็นหนอน +ไสย +ไสย- +ไสยเวท +ไสยศาสตร์ +ไสยา +ไสยาสน์ +ไสร้ +ไส้ละมาน +ไส้เลื่อน +ไสว +ไส้ศึก +ไสหัว +ไส้แห้ง +ไส้อั่ว +ห +หก +หกคว่ำ +หกคะเมน +หกบท +หกล้ม +หกโล่ +หกหัน +หง +หงกๆ +หงส- +หงส์ +หงสคติ +หงส์ทอง +หงสบาท +หงสรถ +หงส์ร่อนมังกรรำ +หงสราช +หงส์ลีลา +หงส์หยก +หงอ +หงอก +หง่องๆ +หงองแหงง +หงอด +หงอดๆ +หงอน +หงอนไก่ +หงอนไก่ป่า +หง่อม +หงอย +หง่อย +หงอยก๋อย +หงอยเหงา +หงักๆ +หงับๆ +หง่าง +หงาย +หงายท้อง +หงายหลัง +หง่าว +หงำ +หงำเหงอะ +หงิก +หงิงๆ +หงิม +หงิมๆ +หงึกๆ +หงุงหงิง +หงุดหงิด +หงุบ +หงุบหงับ +หงุ่ย +หญ้า +หญ้ากระจาม +หญ้าเกล็ดหอย +หญ้าขัด +หญ้าขัดใบยาว +หญ้าขัดหลวง +หญ้างวงช้าง +หญ้าจาม +หญ้าใต้ใบ +หญ้าถอดปล้อง +หญ้าน้ำดับไฟ +หญ้าบัว +หญ้าปากคอก +หญ้าปีนตอ +หญ้าฝรั่น +หญ้าพันงู +หญ้าเพ็ก +หญ้าแพรก +หญ้ายองไฟ +หญ้ายายเภา +หญ้ารกช้าง +หญ้ารากขาว +หญ้าลิเภา +หญ้าหนวดแมว +หญ้าแห้วหมู +หญิง +หญิบ +หด +หดหาย +หดหู่ +หตะ +หทย- +หทัย +หน +หนทาง +หนนะ +หนวก +หนวกหู +หน่วง +หน่วงเหนี่ยว +หนวด +หนวดนาคราช +หนวดพราหมณ์ +หนวดแมว +หน่วย +หน่วยก้าน +หน่วยกิต +หน่วยดาราศาสตร์ +หนอ +หน่อ +หนอก +หนอกช้าง +หนอง +หนองแซง +หนองใน +หน็องแหน็ง +หนอน +หนอนกระทู้ +หนอนกระสือ +หนอนกอ +หนอนด้น +หนอนตายหยาก +หนอนบ่อนไส้ +หนอนพยาธิ +หนอนม้วนใบข้าว +หนอนหนังสือ +หน่อเนื้อเชื้อไข +หน่อไม้ +หน่อไม้น้ำ +หน่อไม้ฝรั่ง +หน่อย +หน็อยแน่ +หนัก +หนักข้อ +หนักใจ +หนักแน่น +หนักปาก +หนักแผ่นดิน +หนักมือ +หนักไม่เอา เบาไม่สู้ +หนักหน่วง +หนักหนา +หนักหน้า +หนักอก +หนัง +หนังกลางวัน +หนังกำพร้า +หนังไก่ +หนังตะลุง +หนังเรียด +หนังสติ๊ก +หนังสือ +หนังสือเดินทาง +หนังสือบริคณห์สนธิ +หนังสือพิมพ์ +หนังสือรับรองการทำประโยชน์ +หนังสือเวียน +หนังสือสัญญา +หนังหน้าไฟ +หนังใหญ่ +หนั่น +หนับ +หนา +หน้า +หน้ากระฉีก +หน้ากระดาน +หน้ากาก +หนากาสรี +หน้าเก้อ +หน้าขา +หน้าข้าวตัง +หน้าแข้ง +หน้าคว่ำ +หน่าง +หน้างอ +หน้างอก +หน้าเง้า +หน้าแง +หน้าจ๋อย +หน้าจั่ว +หน้าจืด +หน้าฉาก +หน้าฉาน +หน้าโฉนด +หน้าซีด +หน้าซื่อใจคด +หน้าเซียว +หนาด +หน้าด้าน +หน้าตัก +หน้าตั้ง +หนาตา +หน้าตา +หน้าต่าง +หน้าตาย +หน้าตึง +หน้าตื่น +หน้าตูม +หน้าเตา +หน้าถัง +หน้าทับ +หน้าที่ +หน้าที่นั่ง +หนาน +หน้านวล +หน้าเนื้อใจเสือ +หนาแน่น +หน้าบัน +หน้าบาง +หน้าบาน +หน้าบูด +หน้าปัด +หน้าเป็น +หน้าผา +หน้าผาก +หน้าพาทย์ +หน้าไฟ +หนาม +หนามขี้แรด +หนามเขียะ +หนามควายนอน +หนามจี้ +หนามแดง +หนามเตย +หนามพรม +หนามพุงดอ +หนามยอกอก +หนามยอกเอาหนามบ่ง +หนามรอบตัว +หนามหลัง +หนามเหม็น +หนามแหลมไม่มีใครเสี้ยม +หนามใหญ่ +หน้ามอด +หน้าม่อย +หน้าม้า +หน้ามืด +หน้ามุข +หน้าไม้ +หน่าย +หน่ายหนี +หน่ายแหนง +หน้าร่าหุ์ +หน้าราหู +หน้าเลือด +หนาว +หนาวใจ +หน้าวัว +หน้าแว่น +หน้าสิ่วหน้าขวาน +หน้าเสีย +หน้าเสี้ยว +หน้าหนา +หน้าหัก +หนาหู +หนาหูหนาตา +หน้าใหญ่ใจโต +หน้าไหว้หลังหลอก +หน้าอก +หน้าอัด +หนำ +หนำใจ +หนำเลี้ยบ +หนี +หนี้ +หนี้เกลื่อนกลืนกัน +หนีบ +หนี้สิน +หนี้สูญ +หนีเสือ +หนีเสือปะจระเข้ +หนึก +หนึ่ง +หนึบ +หนืด +หนุ +หนุน +หนุนเนื่อง +หนุนหลัง +หนุบ +หนุบๆ +หนุบหนับ +หนุ่ม +หนุ่มทั้งแท่ง +หนุ่มแน่น +หนุ่มเหน้า +หนุ่ย +หนู +หนูตกถังข้าวสาร +หนูติดจั่น +หนูผี +ห่ม +หมก +หมกมุ่น +หมกไหม้ +หมด +หมดกระเป๋า +หมดกัน +หมดเขต +หมดเขี้ยวหมดงา +หมดจด +หมดตัว +หมดตำรา +หมดตูด +หมดเนื้อหมดตัว +หมดบุญ +หมดประตู +หมดเปลือก +หมดพก +หมดพุง +หมดรูป +หมดไส้หมดพุง +ห่มดอง +หมดอายุ +หมดอาลัย +หมดอาลัยตายอยาก +หมดอาลัยไยดี +หม่น +หม่นหมอง +หม่นไหม้ +หมวก +หมวกกะโล่ +หมวกแก๊ป +หมวกแจว +หมวกทรงหม้อตาล +หมวกนิรภัย +หมวกหูกระต่าย +หมวด +หมอ +หม่อ +หม้อ +หมอก +หม้อแกง +หม้อแกงค่าง +หม้อแกงลิง +หมอขวัญ +หม้อข้าวหม้อแกงลิง +หมอความ +หมอง +หม่อง +หมองใจ +หมองมัว +หมองหมาง +หมอช้างเหยียบ +หมอเฒ่า +หมอดู +หมอตาล +หม้อตาล +หมอตำแย +หม้อทะนน +หมอไทย +หมอน +หม่อน +หมอนขวาน +หมอนข้าง +หมอนทอง +หมอน้อย +หม้อน้ำ +หมอน้ำมัน +หมอบ +หมอบกระแต +หมอบราบคาบแก้ว +หม้อแปลง +หม้อแปลงไฟ +หมอผี +หมอพัดโตนด +หม่อม +หม่อมเจ้า +หม่อมฉัน +หม่อมราชวงศ์ +หม่อมหลวง +หม่อมห้าม +หมอย +หมอลำ +หม้อหนู +หม้อห้อม +หมัก +หมักหมม +หมัด +หมัน +หมั่น +หมั้น +หมั่นไส้ +หมับ +หมับๆ +หมา +หม่า +หม้า +หมาก +หมากเก็บ +หมากข่วง +หมากเขียว +หมากแข้ง +หมากคัน +หมากดิบ +หมากแดง +หมากทัน +หมากผาง +หมากผู้หมากเมีย +หมากฝรั่ง +หมากม่วน +หมากมาศ +หมากเม่า +หมากเม่าควาย +หมากยับ +หมากแยก +หมากรุก +หมากลิง +หมากสง +หมากหนาม +หมากหอมควาย +หมากเหลือง +หมากอีแปะ +หมากฮอส +หมาขี้ไม่มีใครยกหาง +หมาง +หมางใจ +หมางเมิน +หมาจิ้งจอก +หมาด +หมาใน +หมาป่า +หมามุ่ย +หมามุ้ย +หมาไม้ +หมาย +หม้าย +หมายกำหนดการ +หมายเกณฑ์ +หมายขัง +หมายค้น +หมายความ +หมายจับ +หมายจำคุก +หมายใจ +หมายตัว +หมายตา +หมายน้ำบ่อหน้า +หมายปล่อย +หมายมั่น +หมายมั่นปั้นมือ +หมายยา +หมายเรียก +หมายเลข +หมายหัว +หมายเหตุ +หมายอาญา +หมาร่า +หมาสองราง +หมาหมู่ +หมาหยอกไก่ +หมาหวงก้าง +หมาหัวเน่า +หมาหางด้วน +หมาเห่าใบตองแห้ง +หม่ำ +หม้ำ +หม้ำตับ +หมิ่น +หมิ่นประมาท +หมิ่นพระบรมเดชานุภาพ +หมิ่นเหม่ +หมี +หมี่ +หมีเหม็น +หมึก +หมืน +หมื่น +หมุด +หมุน +หมุนเงิน +หมุนเวียน +หมุบ +หมุบหมับ +หมุบหมิบ +หมุ่ย +หมุยขาว +หมู +หมู่ +หมูเขาจะหามเอาคานเข้าไปสอด +หมูแดง +หมูตั้ง +หมูเทโพ +หมูน้ำ +หมูแนม +หมูในเล้า +หมูในอวย +หมูป่า +หมูไปไก่มา +หมูแผ่น +หมูยอ +หมูสนาม +หมูสามชั้น +หมูสี +หมูหย็อง +หมูหริ่ง +หมูหรึ่ง +หมูหัน +หมูแฮม +หย- +หยก +หยกๆ +หย่ง +หย่งๆ +หยด +หยดย้อย +หยวก +หยวบ +หยวบๆ +หยอก +หยอกเย้า +หย็อกหย็อย +หยอกเอิน +หย็อง +หย่อง +หย่องๆ +หย็องกรอด +หย็องแหย็ง +หยอด +หยอดหลุม +หยอน +หย่อน +หย่อนใจ +หย่อนอารมณ์ +หย่อม +หย็อมแหย็ม +หย็อย +หย่อย +หยัก +หยักไย่ +หยักรั้ง +หยักศก +หยักเหยา +หยัง +หยั่ง +หยั่งทราบ +หยั่งรู้ +หยั่งเสียง +หยังหยัง +หยัด +หยัน +หยับ +หยับๆ +หยั่วเมือง +หย่า +หยากเยื่อ +หยากไย่ +หย่ากัน +หยาด +หยาดน้ำค้าง +หยาดน้ำฟ้า +หย่านม +หยาบ +หยาบคาย +หยาบช้า +หยาบหยาม +หยาม +หยามน้ำหน้า +หยาว +หย้าว +หยำเป +หยำเหยอะ +หยำแหยะ +หยิก +หยิกแกมหยอก +หยิกหย็อง +หยิ่ง +หยิบ +หยิบผิด +หยิบยก +หยิบยืม +หยิบหย่ง +หยิมๆ +หยี +หยี่ +หยุ +หยุกหยิก +หยุด +หยุดหย่อน +หยุ่น +หยุบๆ +หยุมหยิม +หยูกยา +หโยดม +หร +หรคุณ +หรณ +หรดาล +หรดาลกลีบทอง +หรดาลแดง +หรดี +หรบๆ +หรรษ- +หรรษา +หรอ +หรอก +หร็อมแหร็ม +หรอยๆ +หระ +หรับๆ +หรัสว- +หรัสวมูรดี +หรัสวางค์ +หรา +หริ +หริคันธ์ +หริ่ง +หริ่งๆ +หริจันทน์ +หริณะ +หริต +หริตกี +หริรักษ์ +หริวงศ์ +หรี่ +หรีด +หรีตกี +หรือ +หรุบๆ +หรุบรู่ +หรุบหรู่ +หรุ่ม +หรู +หรูหรา +หฤทย +หฤทย์ +หฤทัย +หฤทัย- +หฤทัยกลม +หฤทัยกัปน์ +หฤทัยกัมป์ +หฤทัยปรีย์ +หฤทัยพันธน์ +หฤษฎ์ +หฤษฎี +หฤหรรษ์ +หฤโหด +หล +หลง +หลงกล +หลงตา +หลงลม +หลงลืม +หลงหูหลงตา +หลงเหลือ +หลงใหล +หลด +หลน +หล่น +หลบ +หลบตา +หลบฝาก +หลบมุม +หลบหน้า +หลบหน้าหลบตา +หลบหลังคา +หล่ม +หลวง +หลวงจีน +หลวม +หลวมตัว +หลอ +หล่อ +หลอก +หลอกๆ +หลอกลวง +หลอกล่อ +หลอกหลอน +หลอด +หลอดลม +หลอดลมคอ +หลอดลมฝอย +หลอดเลือด +หลอดอาหาร +หลอน +หล็อน +หล็อนๆ +หล่อน +หลอม +หลอมตัว +หลอมละลาย +หลอมเหลว +หล่อลื่น +หล่อเลี้ยง +หล่อเหลา +หละ +หละหลวม +หลัก +หลักการ +หลักเกณฑ์ +หลักแจว +หลักชัย +หลักฐาน +หลักตอ +หลักทรัพย์ +หลักประกัน +หลักพยาน +หลักลอย +หลักสูตร +หลักแหล่ง +หลักแหลม +หลัง +หลั่ง +หลังเขียว +หลังคา +หลังคาเรือน +หลังจาก +หลังฉาก +หลังเต่า +หลังยาว +หลั่งไหล +หลัดๆ +หลั่น +หลับ +หลับตา +หลับนก +หลับใน +หลัว +หลา +หล้า +หลาก +หลากใจ +หลากหลาย +หลาท +หลาน +หลาบ +หลาบจำ +หลาม +หลาย +หลายเติบ +หลายหลาก +หลายแหล่ +หลาว +หลาวเหล็ก +หลาหล +หลิก +หลิ่ง +หลิท +หลิน +หลิม +หลิว +หลิ่ว +หลิ่วตา +หลี +หลีก +หลีโก +หลีบ +หลีฮื้อ +หลืบ +หลุกหลิก +หลุด +หลุดปาก +หลุดพ้น +หลุดมือ +หลุดลอย +หลุดลุ่ย +หลุนๆ +หลุบ +หลุบลู่ +หลุม +หลุมโจน +หลุมพราง +หลุมพอ +หลุมพี +หลุมหลบภัย +หลุมอากาศ +หลู่ +หลู่หลี่ +หวง +ห่วง +ห้วง +หวงก้าง +ห่วงใย +หวงห้าม +หวงแหน +หวด +หวน +ห้วน +ห้วนๆ +หวนคำนึง +หวย +ห้วย +หวอ +หวอด +หว็อยๆ +หวะ +หวัง +หวัด +หวัดๆ +หวั่น +หวันยิหวา +หวั่นหวาด +หวั่นไหว +หวัว +หวัวร่อ +หวัวเราะ +หวา +หว่า +หว้า +หวาก +หว่าง +หวาด +หวาดระแวง +หวาดเสียว +หวาดหวั่น +หวาดไหว +หวาน +หว่าน +หวานคอแร้ง +หว่านล้อม +หวาม +หวาย +หวายดิน +หวายตะมอย +หวำ +หวิด +หวิว +หวี +หวี่ +หวีด +หวือ +หวุดหวิด +หวุม +หวูด +หสน- +หอ +ห่อ +ห้อ +หอก +หอกข้างแคร่ +หอกซัด +หอการค้า +หอคอย +หอคำ +หอง +ห้อง +ห้องเครื่อง +ห้องชุด +ห้องแถว +ห้องน้ำ +ห้องสมุด +หอจดหมายเหตุ +ห่อตัว +หอไตร +หอน +ห่อน +หอบ +หอบหิ้ว +หอบหืด +หอบังคับการ +หอประชุม +หอพัก +หอม +ห้อม +หอมกราย +หอมขาว +หอมจันทร์ +หอมแดง +หอมเตียม +หอมป้อม +หอมแป้น +ห้อมเมือง +หอมยับ +ห้อมล้อม +หอมหวน +หอย +ห้อย +หอยโข่ง +ห้อยท้าย +หอยปากเป็ด +หอยแปดเกล็ด +หอยเม่น +ห้อยโหน +หอสมุด +ห่อหมก +ห่อเหี่ยว +ห่อแห่ +ห้อแห้ +หะ +หะยี +หะแรก +หะหาย +หะห้าย +หะแห้น +หัก +หักกลบลบหนี้ +หักคอ +หักใจ +หักด้ามพร้าด้วยเข่า +หักทองขวาง +หักบัญชี +หักมุก +หักราคา +หักร้าง +หักแรง +หักล้าง +หักลำ +หักหน้า +หักหลัง +หักหาญ +หักห้าม +หักเห +หักโหม +หักอก +หักอกหักใจ +หังส- +หัจญ์ +หัจญี +หัช +หัฏฐะ +หัด +หัดเยอรมัน +หัต +หัตถ- +หัตถ์ +หัตถกรรม +หัตถการ +หัตถกิจ +หัตถบาส +หัตถพันธ์ +หัตถศิลป์ +หัตถศึกษา +หัตถาจารย์ +หัตถานึก +หัตถาภรณ์ +หัตถาโรหะ +หัตถาลังการ +หัตถินี +หัตถี +หัน +หั่น +หั้น +หันตรา +หันตา +หันรีหันขวาง +หันหน้าเข้าหากัน +หันหลังให้กัน +หันเห +หั่นแหลก +หันอากาศ +หับ +หับเผย +หัมมียะ +หัย +หัว +หัวกระเด็น +หัวกระไดไม่แห้ง +หัวกระสุน +หัวก๊อก +หัวกะทิ +หัวก่ายท้ายเกย +หัวกุญแจ +หัวเก่า +หัวแก้วหัวแหวน +หัวขโมย +หัวขวาน +หัวข้อ +หัวขั้ว +หัวขาด +หัวขี้แต้ +หัวขี้หมา +หัวเข้า +หัวแข็ง +หัวโขน +หัวคว่ำ +หัวคะแนน +หัวค่ำ +หัวคิด +หัวใคร่ +หัวงอน +หัวงาน +หัวเงิน +หัวเงื่อน +หัวโจก +หัวใจ +หัวชนกำแพง +หัวชนฝา +หัวซุกหัวซุน +หัวซุน +หัวด้วน +หัวดาวหัวเดือน +หัวดื้อ +หัวเด็ดตีนขาด +หัวเดียวกระเทียมลีบ +หัวต่อ +หัวตะกั่ว +หัวตะคาก +หัวตะโหงก +หัวเต่า +หัวเตาไฟ +หัวถอก +หัวเถิก +หัวที +หัวเทียน +หัวเทียม +หัวนกกระจอก +หัวนม +หัวนอก +หัวนอน +หัวนอนปลายตีน +หัวน้ำ +หัวน้ำขึ้น +หัวน้ำลง +หัวเนื้อ +หัวเนื้อทราย +หัวบัว +หัวเบี้ย +หัวโบราณ +หัวปลวก +หัวปลี +หัวปักหัวปำ +หัวปั่น +หัวป่า +หัวปาก +หัวปี +หัวพัน +หัวพุงหัวมัน +หัวฟืนหัวไฟ +หัวมังกุท้ายมังกร +หัวมัน +หัวเม็ด +หัวเมือง +หัวแม่ตีน +หัวแม่เท้า +หัวแม่มือ +หัวแมลงวัน +หัวไม้ +หัวไม่วางหางไม่เว้น +หัวรอ +หัวร่อ +หัวร้อยรู +หัวระแหง +หัวรักหัวใคร่ +หัวรั้น +หัวราน้ำ +หัวรุนแรง +หัวเราะ +หัวเรี่ยวหัวแรง +หัวเรื่อง +หัวเรือใหญ่ +หัวแรง +หัวแร้ง +หัวลม +หัวล้าน +หัวลิง +หัวเลี้ยว +หัวเลี้ยวหัวต่อ +หัวโล้น +หัวว่าว +หัวสำเภา +หัวสูง +หัวเสีย +หัวไส้ +หัวหกก้นขวิด +หัวหงอก +หัวหด +หัวหน้า +หัวหน่าว +หัวหมอ +หัวหมื่น +หัวหมุน +หัวหมู +หัวหลักหัวตอ +หัวหาด +หัวหายตะพายขาด +หัวเห็ด +หัวแหลม +หัวแหวน +หัวใหม่ +หัวไหล่ +หัวอก +หัวออก +หัวอ่อน +หัส +หัสดิน +หัสดี +หัสต +หัสต์ +หัสตะ +หา +ห่า +ห้า +หาก +หากว่า +หากิน +ห่ากิน +หาความ +หาค่ามิได้ +หาง +ห่าง +ห้าง +หางกระเบน +หางกระรอก +หางกระหมวด +หางกราย +หางกะลวย +หางกะลวยไก่ +หางกังหัน +หางกิ่ว +หางแกละ +หางไก่ +หางขมวด +หางขอด +หางข้าว +หางแข็ง +หางค้อ +หางเครื่อง +หางจระเข้ +หางจิ้งเหลน +หางช้าง +หางเต่า +หางแถว +หางนกกะลิง +หางนกยูง +หางนกยูงฝรั่ง +หางนาค +หางปลา +หางเปีย +หางแพน +หางแมงป่อง +หางยาม +หางยาว +หางเลข +หางว่าว +หางสิงห์ +หางเสียง +หางเสือ +หางหงส์ +หางหนู +ห้างหุ้นส่วน +ห้างหุ้นส่วนจำกัด +ห้างหุ้นส่วนสามัญ +ห่างเห +ห่างเหิน +หางไหล +หางไหลแดง +หางไหลเผือก +หาเงิน +หาเช้ากินค่ำ +หาญ +หาด +หาดก +หาตก +หาตัวจับยาก +ห้าแต้ม +หาน +ห่าน +หาบ +หาบมิได้ +หาบเร่ +หาบหลวง +หาม +ห่าม +ห้าม +ห้ามญาติ +ห้ามทัพ +ห้ามปราม +ห้ามเปลี่ยนมือ +ห้ามพระแก่นจันทน์ +หามรอก +หามรุ่งหามค่ำ +ห้ามล้อ +ห้ามเลือด +หามแล่น +ห้ามสมุทร +หามิได้ +หาไม่ +หาไม่ก็ +หาย +หายกัน +หายขาด +หายเข้ากลีบเมฆ +หายใจ +หายใจไม่ทั่วท้อง +หายตัว +หายนะ +หายหกตกหล่น +หายหน้า +หายห่วง +หายหัว +หาร +หารร่วมมาก +หาริ +หาริน +หารี +หารือ +หาเรื่อง +ห่าลง +หาลิท +หาเลือดกับปู +หาว +ห้าว +หาวนอน +ห้าวหาญ +หาเศษหาเลย +หาส +หาสก +หาสยะ +หาสู่ +หาเสียง +หาห่วงมาคล้องคอ +หาเหตุ +หำ +ห้ำ +ห้ำหัก +ห้ำหั่น +หิ้ง +หิงคุ +หิงสา +หิงห้อย +หิ่งห้อย +หิ่งหาย +หิด +หิต +หิต- +หิตกร +หิตประโยชน์ +หิตพจน์ +หิตวจนะ +หิตานุหิตประโยชน์ +หิน +หิน- +หินงอก +หินชนวน +หินชั้น +หินชาติ +หินดินดาน +หินดินสอพอง +หินตะกอน +หินตับเป็ด +หินทราย +หินน้ำมัน +หินปูน +หินแปร +หินฝนทอง +หินย้อย +หินยาน +หินแลง +หินสบู่ +หินโสโครก +หินหนืด +หินอ่อน +หินอัคนี +หิม- +หิมพาน +หิมพานต์ +หิมวัต +หิมวันต์ +หิมวา +หิมวาต +หิมวาน +หิมวาส +หิมเวศ +หิมะ +หิมาลัย +หิรัญ +หิรัญ- +หิรัญญิการ์ +หิรัญบัฏ +หิรัณย- +หิรัณย์ +หิรัณยการ +หิรัณยเกศ +หิรัณยรัศมี +หิริ +หิริโอตตัปปะ +หิว +หิ้ว +หิ้วท้อง +หิ้วปีก +หี +หีด +หีตา +หีเต่า +หีน- +หีนยาน +หีบ +หีบชัก +หีบเชิงชาย +หีบฝ้าย +หีบพระมาลัย +หีบเพลง +หีบเพลงชัก +หีบเพลงปาก +หีบสไบ +หีบเสียง +หีบห่อ +หึๆ +หึง +หึ่ง +หึ่งๆ +หึงส- +หึงสา +หืด +หืน +หื่น +หื่นหรรษ์ +หือ +หื้อ +หือไม่ขึ้น +หือรือโหด +หุง +หุงข้าวประชดหมา +หุต- +หุตโกวิท +หุตาจารย์ +หุน +หุ่น +หุ้น +หุ้นกู้ +หุ่นนิ่ง +หุ้นบุริมสิทธิ +หุ่นพยนต์ +หุ้นลม +หุ่นไล่กา +หุ้นส่วน +หุนหัน +หุนหันพลันแล่น +หุบ +หุบเขา +หุบปาก +หุบผา +หุบเหว +หุ้ม +หุ้มกลอง +หุ้มแผลง +หุ้มแพร +หุ้ยหุย +หุยฮา +หุรัม +หุหนิงหงัน +หู +หู่ +หูก +หูกระต่าย +หูกวาง +หูแจว +หูฉลาม +หูฉี่ +หูชอง +หูช้าง +หูด +หูดับตับไหม้ +หูตาสว่าง +หูติ +หูตึง +หูตูบ +หูทวนลม +หูเบา +หูปลาช่อน +หูป่าตาเถื่อน +หูผีจมูกมด +หูผึ่ง +หูรูด +หูไว +หูไวตาไว +หูเสือ +หูหนาตาโต +หูหนาตาเล่อ +หูหนู +หู่หี่ +หูไห +เห +เห่ +เหง +เหง่ง +เหงา +เหง้า +เหงาหงอย +เหงื่อ +เหงือก +เหงือกปลาหมอ +เหงื่อกาฬ +เห็จ +เห็ด +เห็ดโคน +เห็ดหลุบ +เหติ +เหตุ +เหตุการณ์ +เหตุผล +เหตุสุดวิสัย +เห็น +เห็นกงจักรเป็นดอกบัว +เห็นแก่ +เห็นแก่หน้า +เห็นขี้ดีกว่าไส้ +เห็นเขาขึ้นคานหาม เอามือประสานก้น +เหน่ง +เหนงนายพราน +เห็นจะ +เห็นใจ +เห็นช้างขี้ ขี้ตามช้าง +เหน็ด +เหน็ดเหนื่อย +เห็นดำเห็นแดง +เห็นดี +เหน็บ +เหน็บชา +เหน็บแนม +เห็นหน้าเห็นหลัง +เหน่อ +เห็นอ้ม +เหนอะ +เหนอะหนะ +เหน้า +เหนาะๆ +เหนียง +เหนี่ยง +เหนียงนกกระทุง +เหนี่ยน +เหนียม +เหนียว +เหนี่ยว +เหนี่ยวนำแม่เหล็กไฟฟ้า +เหนียวแน่น +เหนี่ยวรั้ง +เหนียวหนืด +เหนียวหมา +เหนือ +เหนื่อย +เหนื่อยหน่าย +เห็บ +เห็บน้ำ +เหม +เหม- +เหม่ +เหม่ง +เหม็น +เหม็นเขียว +เหม็นเบื่อ +เหม็นเปรี้ยว +เหมวดี +เหม่อ +เหมันต- +เหมันต์ +เหมา +เหมายัน +เหมาะ +เหมาะเจาะ +เหมาะสม +เหมาะเหม็ง +เหมียว +เหมี่ยว +เหมือง +เหมืองฝาย +เหมือด +เหมือดคน +เหมือดโลด +เหมือน +เหมือนกับ +เหมือนว่า +เหมือนหนึ่งว่า +เหมื่อย +เหมื่อยๆ +เหย +เหยเก +เหยง +เหย่อย +เหยา +เหย่า +เหย่าๆ +เหย้า +เหยาะ +เหยาะๆ +เหยาะแหยะ +เหยิง +เหยิบๆ +เหยียด +เหยียดผิว +เหยียดหยาม +เหยียบ +เหยียบขี้ไก่ไม่ฝ่อ +เหยียบจมูก +เหยียบย่ำ +เหยียบเรือสองแคม +เหยี่ยว +เหยี่ยวข่าว +เหยื่อ +เหยือก +เหรัญญิก +เหรา +เหราเล่นน้ำ +เหราะๆ +เหรียญ +เหรียญกระษาปณ์ +เห่เรือ +เหล่ +เหล็ก +เหล็กกล้า +เหล็กกล้าไม่เป็นสนิม +เหล็กใน +เหล็กพืด +เหล็กวิลาด +เหล็กส่ง +เหล็กเส้น +เหล็กหมาด +เหล็กหล่อ +เหล็กเหนียว +เหล็กไหล +เหลน +เหลว +เหลวแหลก +เหลวไหล +เหลอ +เหลา +เหล่า +เหล้า +เหล่ากอ +เหลาชะโอน +เหลาหลก +เหล้าแห้ง +เหลาะแหละ +เหลิง +เหลิงเจิ้ง +เหลียน +เหลี่ยม +เหลี่ยมคู +เหลี่ยมลูกบาศก์ +เหลียว +เหลียวแล +เหลียวหลัง +เหลือ +เหลือก +เหลือกำลัง +เหลือเกิน +เหลือขอ +เหลือเข็ญ +เหลือเข็น +เหลือง +เหลืองหางฟ้า +เหลืองหิน +เหลือใจ +เหลือเชื่อ +เหลือใช้ +เหลือทน +เหลือบ +เหลือบ่ากว่าแรง +เหลือเฟือ +เหลือม +เหลื่อม +เหลื่อมล้ำต่ำสูง +เหลือมือ +เหลือรับ +เหลือร้าย +เหลือล้น +เหลือวิสัย +เหลือสติกำลัง +เหลือแสน +เหลือหลอ +เหลือหลาย +เหลือแหล่ +เหลืออด +เหลืออดเหลือทน +เหว +เหว่ +เหวง +เหวทะเล +เหวย +เหวอะ +เหวอะหวะ +เหวี่ยง +เหวี่ยงแห +เห่อ +เห่อเหิม +เหอะ +เหอะน่า +เหะ +เหะหะ +เหา +เห่า +เหาฉลาม +เหาทะเล +เหาน้ำ +เหาไม้ +เหาะ +เหิน +เหินห่าง +เหินเห่อ +เหิม +เหิมหาญ +เหิมห้าว +เหิมฮึก +เหี้ย +เหียง +เหียงกราด +เหียน +เหี้ยน +เหียนราก +เหี้ยม +เหี้ยมเกรียม +เหี้ยมหาญ +เหี้ยมโหด +เหี่ยว +เหี่ยวแห้ง +เหื่อ +เหือด +เหือดหาย +เหือดแห้ง +แห +แห่ +แห้ +แหก +แหกคอก +แหกปาก +แหง +แหง่ +แห่ง +แห้ง +แหงแก๋ +แหง่ง +แหงน +แหงนเต่อ +แหงนเถ่อ +แห้งผาก +แห้งแล้ง +แห้งเหี่ยว +แห้งเหือด +แหน +แห้น +แหนง +แหนงใจ +แหนงหน่าย +แหนบ +แหนม +แหบ +แหม +แหม่ +แหม่ม +แหมะ +แหย +แหย่ +แหยง +แหย่ง +แหยม +แหย็ม +แหยะ +แหยะๆ +แหล +แหล่ +แหลก +แหลกลาญ +แหลกเหลว +แหล่ง +แหล่งเสื่อมโทรม +แหล่งหล้า +แหลน +แหล่นอก +แหล่ใน +แหลม +แหลมหลัก +แหละ +แหว +แห้ว +แหวก +แหวกแนว +แหว่ง +แหวด +แหวน +แหวนหัว +แห้วหมู +แหวะ +แห่ห้อม +แห่แหน +แหะ +แหะๆ +โห่ +โหก +โหง +โหงพราย +โหด +โหดร้าย +โหดเหี้ยม +โหน +โหนก +โหนกแก้ม +โหน่ง +โหม +โหม- +โหม่ +โหมกรรม +โหมกูณฑ์ +โหม่ง +โหมด +โหมดเทศ +โหมโรง +โหมหัก +โหมฮึก +โหย +โหยกเหยก +โหยง +โหย่ง +โหย่งๆ +โหยหวน +โหยไห้ +โหร +โหรง +โหรงเหรง +โหรดาจารย์ +โหระพา +โหรา +โหรากระบือ +โหราเขาเนื้อ +โหราจารย์ +โหราเดือยไก่ +โหราตีนหมา +โหราเท้าสุนัข +โหราบอน +โหราศาสตร์ +โหล +โหล่ +โหลงโจ้ง +โหว +โหว่ +โหว้ +โหวกเหวก +โหวง +โหวงเหวง +โหวด +โหวต +ให้ +ให้การ +ใหญ่ +ให้โดยเสน่หา +ให้ท่า +ให้ท้าย +ใหม่ +ใหม่ถอดด้าม +ใหม่เอี่ยม +ให้ร้าย +ให้ร้ายป้ายสี +ให้สัตยาบัน +ให้หา +ให้อภัย +ให้ออก +ไห +ไห่ +ไห้ +ไหซอง +ไหน +ไหปลาร้า +ไหม +ไหม้ +ไหมทอง +ไหมสับปะรด +ไหรณย์ +ไหล +ไหล่ +ไหล่เขา +ไหล่ถนน +ไหล่ทวีป +ไหล่ทาง +ไหลน้ำ +ไหล่รวบ +ไหว +ไหวๆ +ไหว้ +ไหว้ครู +ไหว้เจ้า +ไหวตัว +ไหวติง +ไหวทัน +ไหว้ผี +ไหวพริบ +ไหว้วาน +ไหหลำ +ฬ +อ +อก +อกไก่ +อกคราก +อกตั้ง +อกตัญญุตา +อกตัญญู +อกเต่า +อกแตก +อกทะเล +อกนิษฐ์ +อกเมือง +อกรณีย์ +อกรรมกริยา +อกรวบ +อกร่อง +อกโรย +อกเลา +อกหัก +อกัปปิย- +อกัปปิยวัตถุ +อกัปปิยโวหาร +อกัปปิยะ +อกุศล +อกุศล- +อกุศลกรรม +อกุศลกรรมบถ +อกุศลเจตนา +อกุศลมูล +อคติ +อคเนสัน +อคาธ +อคาร- +อฆ +อโฆษะ +อง +องก์ +องค- +องค์ +องค์กฐิน +องค์กร +องค์การ +องค์การสหประชาชาติ +องคชาต +องค์ประกอบ +องค์ประชุม +องคมนตรี +องคมรรษ +องครักษ์ +องควิการ +องควิเกษป +องควิทยา +องคาพยพ +องคุล +องคุลี +องศ์ +องศา +องอาจ +องุ่น +อจร +อจล- +อจลา +อจิตติ +อจินตา +อจินไตย +อจิร- +อจิระ +อเจลก +อเจละ +อช +อชา +อชิน +อชินี +อชิร +อฏวี +อณิ +อณุ +อณู +อโณทัย +อด +อดกลั้น +อดใจ +อดตาหลับขับตานอน +อดทน +อดนม +อดเปรี้ยวไว้กินหวาน +อดสู +อดแห้งอดแล้ง +อดอยาก +อดออม +อดิ +อดิถี +อดิเทพ +อดิเรก +อดิเรก- +อดิเรกลาภ +อดิศร +อดิศวร +อดิศัย +อดีต +อดีต- +อดีตกาล +อดีตชาติ +อดีตภพ +อดีตสมัย +อดุล +อดุลย- +อดุลย์ +อติ +อติชาต +อติชาต- +อติชาตบุตร +อติมานะ +อติราช +อติเรก +อติเรก- +อติเรกจีวร +อติเรกลาภ +อติสาร +อถรรพเวท +อทระ +อทินนาทาน +อทินนาทายี +อธรรม +อธิ +อธิก- +อธิกมาส +อธิกรณ์ +อธิกวาร +อธิกสุรทิน +อธิการ +อธิการบดี +อธิคม +อธิฏฐาน +อธิบดี +อธิบาย +อธิป +อธิป- +อธิปไตย +อธิมาตร +อธิมุตติ +อธิโมกข์ +อธิราช +อธิวาส +อธิวาสนะ +อธิศีล +อธิษฐาน +อธึก +อน- +อ้น +อนงค- +อนงค์ +อนงคณะ +อนงคเลข +อนงคเลขา +อนธ- +อนธการ +อนนต์ +อนยะ +อนรรฆ +อนรรถ +อนล +อนวัช +อนวัช- +อ้นอ้อ +อนัญ +อนัญ- +อนัญคติ +อนัญสาธารณ์ +อนัตตา +อนัตถ- +อนันต- +อนันต์ +อนันตร- +อนันตริยกรรม +อนัม +อนากูล +อนาคต +อนาคต- +อนาคตกาล +อนาคามิผล +อนาคามิมรรค +อนาคามี +อนาจาร +อนาถ +อนาถา +อนาทร +อนาธิปไตย +อนามัย +อนารย- +อนารยชน +อนารยธรรม +อนารยะ +อนาลัย +อนำ +อนิจ +อนิจ- +อนิจกรรม +อนิจจัง +อนิจจา +อนิฏฐารมณ์ +อนิยต +อนิยม +อนิยม- +อนิล +อนิล- +อนิลบถ +อนิวรรต +อนิวรรตน์ +อนิษฏ์ +อนีก- +อนีกทรรศนะ +อนีกทัศนะ +อนีกะ +อนีกัฐ +อนีจ +อนึก +อนึ่ง +อนุ +อนุกร +อนุกรม +อนุกรรมการ +อนุกระเบียด +อนุกาชาด +อนุการ +อนุกูล +อนุคามิก +อนุคามี +อนุเคราะห์ +อนุจร +อนุช +อนุชน +อนุชา +อนุชาต +อนุชาต- +อนุชาตบุตร +อนุชิต +อนุญาต +อนุญาโตตุลาการ +อนุตร- +อนุเถระ +อนุทิน +อนุบท +อนุบาล +อนุปริญญา +อนุปสัมบัน +อนุปัสนา +อนุพงศ์ +อนุพัทธ์ +อนุพันธ์ +อนุโพธ +อนุภรรยา +อนุภริยา +อนุภาค +อนุภาษ +อนุมัติ +อนุมาตรา +อนุมาน +อนุมูล +อนุมูลกรด +อนุโมทนา +อนุโมทนาบัตร +อนุโยค +อนุรักษ- +อนุรักษ์ +อนุรักษนิยม +อนุราช +อนุราธ +อนุราธะ +อนุราธา +อนุรูป +อนุโลม +อนุวงศ์ +อนุวัต +อนุวาต +อนุศาสก +อนุศาสน์ +อนุศาสนาจารย์ +อนุศิษฏ์ +อนุสติ +อนุสนธิ +อนุสภากาชาด +อนุสร +อนุสรณ์ +อนุสัญญา +อนุสัย +อนุสาวรีย์ +อนุสาสนี +อเนก +อเนก- +อเนกคุณ +อเนกประสงค์ +อเนกวิธ +อเนกอนันต์ +อเนกอนันตัง +อเนจอนาถ +อโนชา +อโนดาต +อบ +อบเชย +อบรม +อบอวล +อบอ้าว +อบอุ่น +อบาย +อบาย- +อบายภูมิ +อบายมุข +อป +อปการ +อปจายน- +อปจายนธรรม +อปจายนมัย +อปภาคย์ +อปมงคล +อปมาน +อปยศ +อปร- +อปรภาค +อประมาณ +อประมาท +อประไมย +อปรัณณชาติ +อปรา +อปราชัย +อปราชิต +อปราธ +อปริมาณ +อปลักษณ์ +อปโลกน์ +อปวาท +อปหาร +อปาจี +อปาจีน +อปาน +อเปหิ +อพพะ +อพยพ +อภว +อภัพ +อภัพ- +อภัพบุคคล +อภัพผล +อภัย +อภัย- +อภัยทาน +อภัยโทษ +อภิ +อภิฆาต +อภิจฉา +อภิชฌา +อภิชน +อภิชน- +อภิชนาธิปไตย +อภิชัย +อภิชาต +อภิชาต- +อภิชาตบุตร +อภิชิต +อภิญญา +อภิญญาณ +อภิณห- +อภิธรรม +อภิธาน +อภิไธย +อภินันท์ +อภินันทนาการ +อภินัย +อภินิหาร +อภิเนษกรมณ์ +อภิบาล +อภิปรัชญา +อภิปราย +อภิมหาอำนาจ +อภิมานะ +อภิมุข +อภิรดี +อภิรติ +อภิรมย์ +อภิรักษ์ +อภิรัฐมนตรี +อภิราม +อภิรุต +อภิรุม +อภิรูป +อภิลักขิต +อภิลักขิต- +อภิลักขิตกาล +อภิลักขิตสมัย +อภิเลปน์ +อภิวันท์ +อภิวาท +อภิวาทน์ +อภิเษก +อภิเษกสมรส +อภิสมโพธิ +อภิสมัย +อภิสมาจาร +อภิสัมโพธิ +อภิสัมโพธิญาณ +อภิสิต +อภิสิทธิ์ +อภูต +อม +อ้ม +อมความ +อมต- +อมตบท +อมตะ +อมนุษย์ +อมปาก +อมพะนำ +อมเพลิง +อมภูมิ +อมมือ +อมยิ้ม +อมร +อมร- +อมรบดี +อมรรัตน์ +อมรราช +อมรสตรี +อมรา +อมราวดี +อมรินทร์ +อมเรนทร์ +อมเรศ +อมเรศวร +อมโรค +อมฤต +อมฤต- +อมฤตบท +อมฤตยู +อมฤตรส +อมเลือดอมฝาด +อมเลือดอมหนอง +อมหนอง +อมัจจะ +อมัตร +อมาตย์ +อมาวสี +อมาวสุ +อมาวาสี +อมิตร +อเมริกัน +อย +อยน +อยัส +อย่า +อยาก +อย่าง +อย่างไร +อย่างไรก็ดี +อย่างไรก็ตาม +อยุทธ์ +อยู่ +อยู่กรรม +อยู่กิน +อยู่คง +อยู่งาน +อยู่จริง +อยู่ดีกินดี +อยู่ตัว +อยู่ท้อง +อยู่ไฟ +อยู่มือ +อยู่ไม่สุข +อยู่ยงคงกระพัน +อยู่ยาม +อยู่โยง +อยู่เวร +อยู่หมัด +อร +อรช +อรชร +อรชุน +อรณ +อรดี +อรติ +อรทัย +อรไท +อรธาน +อรนุช +อรพินท์ +อรพิม +อรรค +อรรฆ +อรรฆย์ +อรรจน์ +อรรณพ +อรรถ +อรรถ- +อรรถกถา +อรรถกถาจารย์ +อรรถกร +อรรถกวี +อรรถคดี +อรรถบท +อรรถปฏิสัมภิทา +อรรถประโยชน์ +อรรถรส +อรรถาธิบาย +อรรธ +อรรธ- +อรรธกรรณ +อรรธคราส +อรรธจักร +อรรธจันทร์ +อรรธนิศา +อรรธบท +อรรธภาค +อรรธสระ +อรสุม +อรสุมพล +อรหะ +อรหัง +อรหัต +อรหัต- +อรหัตผล +อรหัตมรรค +อรหัตวิโมกข์ +อรหัน +อรหันต- +อรหันต์ +อรหันตฆาต +อร่อย +อรัญ +อรัญ- +อรัญญิก +อรัญวาส +อรัญวาสี +อรัณย์ +อราดี +อราติ +อร่าม +อริ +อริน +อรินทร์ +อริย- +อริยกะ +อริยทรัพย์ +อริยบุคคล +อริยผล +อริยมรรค +อริยสัจ +อริยะ +อรุ +อรุณ +อรุโณทัย +อรุ่ม +อรูป +อลงกต +อลงกรณ์ +อลงการ +อลวน +อลเวง +อลหม่าน +อล่องฉ่อง +อลักเอลื่อ +อลังการ +อลัชชี +อล่างฉ่าง +อลิงค์ +อลึงค์ +อลึ่งฉึ่ง +อโลหะ +อวก +อ้วก +อวกาศ +อวเคราะห์ +อวจร +อวชัย +อวชาต +อวชาต- +อวชาตบุตร +อวด +อวดดี +อวดรู้ +อวดอ้าง +อวตาร +อวน +อ้วน +อ้วนท้วน +อวนลอย +อวนลาก +อวบ +อวบน้ำ +อวมงคล +อวมอำ +อวย +อวยวะ +อวรุทธ์ +อวรุทธก +อวล +อวสาน +อวหาร +อวัยวะ +อวัสดา +อวาจี +อวิจี +อวิชชา +อวิญญาณก- +อวิญญาณกทรัพย์ +อวิญญู +อวิรุทธ์ +อวิโรธน์ +อวีจิ +อเวจี +อโศก +อสงไขย +อสนี +อสนีบาต +อสภ +อสมการ +อสมมาตร +อสรพิษ +อสังกมทรัพย์ +อสังหาริม- +อสังหาริมทรัพย์ +อสังหาริมะ +อสัญ- +อสัญกรรม +อสัญญี +อสัญญีภาพ +อสัญญีภาวะ +อสัญญีสัตว์ +อสัญแดหวา +อสัตถพฤกษ์ +อสัตย์ +อสัมภิน- +อสัมภินพงศ์ +อสัมภินวงศ์ +อสาธร +อสาธุ +อสิ +อสิจรรยาการ +อสิต +อสิธารา +อสิเลสะ +อสีตยานุพยัญชนะ +อสีติ +อสีติมหาสาวก +อสุ +อสุจิ +อสุนีบาต +อสุภ +อสุภ- +อสุภกรรมฐาน +อสุภสัญญา +อสุร- +อสุรกาย +อสุรี +อสุเรศ +อสูร +อเส +อเสกข- +อเสกขบุคคล +อเสกขะ +อเสข- +อเสขะ +อห +อหังการ +อหิ +อหิงสา +อหิวาตกโรค +อหึงสา +อเหตุกทิฐิ +อโหสิกรรม +ออ +อ้อ +อ๋อ +ออก +ออกกำลัง +ออกขุนนาง +ออกแขก +ออกโขน +ออกไข้หัว +ออกงาน +ออกงิ้ว +ออกชื่อ +ออกซิเจน +ออกซิเดชัน +ออกไซด์ +ออกญา +ออกดอก +ออกดอกออกผล +ออกตัว +ออกท่า +ออกท่าออกทาง +ออกทุกข์ +ออกทุน +ออกนอกหน้า +ออกบวช +ออกปาก +ออกผื่น +ออกฝี +ออกฝีดาษ +ออกพรรษา +ออกไฟ +ออกภาษา +ออกมหาสมาคม +ออกยักษ์ออกโขน +ออกรส +ออกรับ +ออกร้าน +ออกเรือน +ออกแรง +ออกโรง +ออกฤทธิ์ +ออกลาย +ออกลิงออกค่าง +ออกลูก +ออกวัง +ออกเสียง +ออกหน้าออกตา +ออกหัด +ออกหาก +ออกอากาศ +อ่อง +อ๋อง +อ้องแอ้ง +ออเจ้า +ออเซาะ +ออด +ออดๆ +ออดอ้อน +ออดแอด +ออดๆ แอดๆ +อ๊อดแอ๊ด +อ๊อดๆ แอ๊ดๆ +อ้อดิบ +อ่อน +อ้อน +อ่อนข้อ +อ่อนความ +อ่อนจิตอ่อนใจ +อ่อนใจ +อ่อนช้อย +ออนซ์ +ออนซอน +อ่อนซอน +อ่อนไท้ +อ่อนน้อม +อ่อนปวกเปียก +อ่อนเปลี้ย +อ่อนเปียก +อ่อนเพลีย +อ่อนโยน +อ้อนวอน +อ่อนหวาน +อ่อนหัด +อ่อนหู +อ่อนไหว +อ่อนอกอ่อนใจ +อ้อนออด +อ่อนแอ +อ้อนแอ้น +ออฟฟิศ +ออม +อ่อม +อ้อม +ออมครอม +อ้อมค้อม +ออมชอม +ออมซอม +ออมสิน +อ้อมอก +ออมอด +อ้อมแอ้ม +อ่อย +อ้อย +อ๋อย +อ้อยเข้าปากช้าง +อ้อยช้าง +อ้อยแดง +อ้อยเลา +อ้อยส้อย +อ้อยอิ่ง +ออสเมียม +อ้อแอ้ +อ๊ะ +อะคร้าว +อะเคื้อ +อะจีน +อะแจ +อะเซทิลีน +อะดรีนาลีน +อะดัก +อะดักอะเดี้ย +อะดักอะเดื่อ +อะดักอะแด้ +อะดุง +อะตอม +อะนะ +อะนั้น +อะนี้ +อะมีบา +อะเมริเซียม +อะร้าอร่าม +อะไร +อะลุ่มอล่วย +อะลุ้มอล่วย +อะลูมิเนียม +อะหม +อะไหล่ +อะอื้อ +อะเอื้อย +อัก +อั้ก +อั้กๆ +อั๊ก +อั๊กๆ +อักกะ +อักโกธะ +อักข +อักขร- +อักขรวิธี +อักขรวิบัติ +อักขรสมัย +อักขระ +อักขรานุกรม +อักขรานุกรมภูมิศาสตร์ +อักโข +อักโขภิณี +อักโขเภณี +อักษร +อักษร- +อักษรกลาง +อักษรต่ำ +อักษรบฏ +อักษรลักษณ์ +อักษรเลข +อักษรศาสตร์ +อักษรสมัย +อักษรสาสน์ +อักษรสูง +อักษะ +อักเษาหิณี +อักเสบ +อักอ่วน +อัคคะ +อัคคิ +อัคคี +อัคคีภัย +อัคนิ +อัคนิคณะ +อัคนิพ่าห์ +อัคนิรุทร +อัคนิวาหะ +อัคนิโหตร +อัคนี +อัคร- +อัครชายา +อัครมหาเสนาบดี +อัครมเหสี +อัครราชทูต +อัครสมณทูต +อัง +อังก์ +อังกนะ +อังกฤษ +อังกวด +อังกะลุง +อังกา +อังกาบ +อังกาบฝรั่ง +อังกาบหนู +อังกุร +อังกุศ +อังกูร +อังคณะ +อังคณา +อังคาร +อังคาส +อังคีรส +อังคุฐ +อังฆาต +อั้งยี่ +อั้งโล่ +อังศุ +อังศุก +อังศุธร +อังศุมาลี +อังส- +อังสกุฏ +อังสตรอม +อังสนา +อังสภาระ +อังสะ +อังสา +อัจกลับ +อัจจันต์ +อัจจัย +อัจจิ +อัจจิมา +อัจจุต +อัจเจกะ +อัจฉรา +อัจฉริย- +อัจฉริยบุคคล +อัจฉริยภาพ +อัจฉริยลักษณ์ +อัจฉริยลักษณะ +อัจฉริยะ +อัจนา +อัชฌัตติก- +อัชฌา +อัชฌาจาร +อัชฌาศัย +อัชฌาสัย +อัญ- +อัญขยม +อัญชนะ +อัญชลี +อัญชัน +อัญชันป่า +อัญเชิญ +อัญญะ +อัญดิตถีย์ +อัญเดียรถีย์ +อัญประกาศ +อัญประกาศเดี่ยว +อัญมณี +อัญมัญ- +อัญรูป +อัฏ +อัฏฐ- +อัฏฐะ +อัฏฐังค์ +อัฏฐังคิกมรรค +อัฏฐังสะ +อัฏนา +อัฐ +อัฐเคราะห์ +อัฐทิศ +อัฐบริขาร +อัฐบาน +อัฐม- +อัฐมะ +อัฐยายซื้อขนมยาย +อัฐศก +อัฐฬส +อัฐิ +อัฐิมิญชะ +อัฐิสัณฐาน +อัฒ- +อัฒจันทร์ +อัฒภาค +อัฒมณฑล +อัฒมาส +อัฒรัตติ +อัณฑ- +อัณฑโกส +อัณฑชะ +อัณฑะ +อัณฑาการ +อัณณพ +อัด +อัดก๊อบปี้ +อัดแจ +อัดฉีด +อัดแบตเตอรี่ +อัดแผ่นเสียง +อัดรูป +อัดลม +อัดสำเนา +อัดเสียง +อัดอั้น +อัดอั้นตันใจ +อัดแอ +อัต- +อัตคัด +อัตชีวประวัติ +อัตตะ +อัตตา +อัตตาธิปไตย +อัตถ์ +อัตถะ +อัตนัย +อัตโนมัติ +อัตภาพ +อัตรชะ +อัตรา +อัตราเร็ว +อัตราส่วน +อัตลัด +อัตวินิบาตกรรม +อัตหิต- +อัตเหตุ +อัททา +อัทธ- +อัทธ์ +อัทธคต +อัทธคู +อัทธา +อัทธาน +อัทธายุ +อัธยาตมวิทยา +อัธยาย +อัธยาศัย +อัน +อั้น +อั๋น +อันดก +อันดร +อันดับ +อันด๊าก +อันโด๊ก +อันต- +อันตก +อันตกาล +อันตกิริยา +อันตคุณ +อันตคู +อันตชาติ +อันตร +อันตร- +อันตรการณ์ +อันตรธาน +อันตรภาค +อันตรวาสก +อันตรา +อันตราย +อันตรายิกธรรม +อันตลิกขะ +อันตะ +อั้นตั้น +อันติก +อันติม- +อันติมสัจ +อันติมะ +อั้นตู้ +อันเต +อันเตบุระ +อันเตบุริก +อันเตบุริกา +อันเตปุระ +อันเตปุริก +อันเตปุริกา +อันเตวาสิก +อันโต +อันโตชน +อันโตนาที +อันแถ้ง +อันทุ +อันโทล +อันธ- +อันธการ +อันธพาล +อันธิกา +อันนะ +อันนา +อันเป็น +อันเป็นไป +อันโยนย- +อันโยนยะ +อันวย- +อันวัย +อันว่า +อันเวส +อั้นอ้น +อับ +อับจน +อับเฉา +อับปาง +อับอาย +อัป- +อัปกะ +อัปการ +อัปฏิฆะ +อัปฏิภาค +อัปปะ +อัปเปหิ +อัปภาคย์ +อัปมงคล +อัปยศ +อัประมาณ +อัประมาท +อัประไมย +อัปราชัย +อัปรีย์ +อัปลักษณ์ +อัปสร +อัพพุท +อัพโพหาริก +อัพภันดร +อัพภันตร- +อัพภาน +อัพภาส +อัม +อัมพ- +อัมพร +อัมพฤกษ์ +อัมพวัน +อัมพวา +อัมพา +อัมพาต +อัมพิล +อัมพุ +อัมพุช +อัมพุชินี +อัมพุท +อัยกะ +อัยกา +อัยการ +อัยกี +อัยยะ +อัยยิกา +อัลกุรอาน +อัลตราไวโอเลต +อั่ว +อัศจรรย์ +อัศเจรีย์ +อัศว- +อัศวโกวิท +อัศวมุข +อัศวมุขี +อัศวเมธ +อัศวยุช +อัศวานึก +อัศวิน +อัศวินี +อัษฎ- +อัษฎกฉันท์ +อัษฎมงคล +อัษฎมะ +อัษฎางคิกมรรค +อัษฎายุธ +อัษฎาวุธ +อัษฏมงคล +อัส- +อัสดง +อัสดงคต +อัสดม +อัสดร +อัสนี +อัสมิมานะ +อัสมุขี +อัสสนี +อัสสะ +อัสสัตถพฤกษ์ +อัสสานิก +อัสสานีก +อัสสานึก +อัสสาสะ +อัสสุ +อัสสุชล +อัสสุธารา +อา +อ่า +อ้า +อากร +อากรแสตมป์ +อากังขา +อากัป +อากัปกิริยา +อากัมปนะ +อากัมปะ +อาการ +อาการ- +อาการนาม +อากาศ +อากาศ- +อากาศธาตุ +อากาศยาน +อากูล +อาเกียรณ์ +อาขยาต +อาขยาน +อาคเนย์ +อาคม +อาครหายณี +อาคันตุก- +อาคันตุกภัต +อาคันตุกวัตร +อาคันตุกะ +อาคาร +อาคารชุด +อาฆาต +อาฆาตนะ +อาฆาตมาดร้าย +อ่าง +อ้าง +อ่างเก็บน้ำ +อางขนาง +อ้างว้าง +อ้างอิง +อาจ +อาจม +อาจมน +อาจริย- +อาจริยวัตร +อาจริยวาท +อาจหาญ +อาจอง +อาจเอื้อม +อาจาด +อาจาร +อาจาร- +อาจารย์ +อาจารี +อาจิณ +อาจิณ- +อาจิณสมาจาร +อาเจียน +อาชญัปติ +อาชญัปติ์ +อาชญา +อาชญากร +อาชญากรรม +อาชญากรสงคราม +อาชญาบท +อาชญาบัตร +อาชญาศึก +อาชญาสิทธิ์ +อาชวะ +อาชา +อาชาน +อาชานิ +อาชาไนย +อาชีพ +อาชีว- +อาชีวก +อาชีวศึกษา +อาชีวะ +อ้าซ่า +อาญา +อาญาสิทธิ์ +อาฏานา +อาณัติ +อาณัติสัญญาณ +อาณา +อาณาเกษตร +อาณาเขต +อาณาจักร +อาณานิคม +อาณาประชาราษฎร์ +อาณาประโยชน์ +อาด +อาดๆ +อาดุร +อาดุลย์ +อาดูร +อาดูลย์ +อาเด๊ะ +อาตม- +อาตมทาน +อาตมภาพ +อาตมัน +อาตมา +อาตุร +อาถรรพ์ +อาถรรพณ์ +อาถรรพณะ +อาทร +อาทาตา +อาทาน +อาทิ +อาทิตย- +อาทิตย์ +อาทิตยมณฑล +อาทิตยวาร +อาทีนพ +อาทีนว +อาทึก +อาเทศ +อาธรรม +อาธรรม์ +อาธรรมิก +อาธรรมึก +อาธาน +อาธาร +อาน +อ่าน +อานก +อานน +อานนท์ +อานม้า +อ่านเล่น +อานะ +อานันท์ +อานันทนะ +อานัม +อานาปาน +อานาปาน- +อานาปานัสสติ +อานำ +อานิก +อานิสงส์ +อานุภาพ +อานุภาวะ +อาบ +อาบแดด +อาบน้ำร้อนมาก่อน +อาบเหงื่อต่างน้ำ +อาบเอิบ +อาบัติ +อาบัน +อาปณกะ +อาปณะ +อาปะ +อาปาน- +อาปานภูมิ +อาปานศาลา +อาปานะ +อาโป +อาโปกสิณ +อาโปธาตุ +อาพัด +อาพัทธ์ +อาพันธ์ +อาพันธนะ +อาพาธ +อาพาธิก +อาพาธึก +อาพิล +อาเพศ +อาภรณ์ +อาภัพ +อาภัสระ +อาภา +อาภากร +อาภาส +อาม +อ่าม +อามลก +อามัย +อามิษ +อามิส +อาย +อ้าย +อ้ายขิก +อ้ายเข้ +อ้ายงั่ว +อ้ายเจี๊ยว +อ้ายชื่น +อายต +อายตนะ +อายน +อ้ายบ้า +อ้ายเบี้ยว +อ้ายป๊อก +อายเหนียม +อ้ายอ้าว +อายัด +อายัต +อายัน +อายาจนะ +อายาน +อายุ +อายุกตกะ +อายุกษัย +อายุขัย +อายุความ +อายุตกะ +อายุธ +อายุร- +อายุรแพทย์ +อายุรเวช +อายุรเวท +อายุรศาสตร์ +อายุวัฒนะ +อายุษ +อาร์กอน +อารดี +อาร์ต +อารติ +อารทรา +อาร์ม +อารมณ์ +อารมณ์ขัน +อารย- +อารยชน +อารยชาติ +อารยธรรม +อารยประเทศ +อารยะ +อารยัน +อาระ +อารักขา +อารักษ์ +อารัญ +อารัญญิก +อารัณย์ +อารัณยกะ +อารัติ +อารัมภ- +อารัมภ์ +อารัมภกถา +อารัมภบท +อาราธน์ +อาราธนา +อาราธนาธรรม +อาราธนาพระปริตร +อาราธนาศีล +อาราม +อารามิก +อารี +อารีอารอบ +อารุม +อาลปน์ +อาลปนะ +อาละวาด +อาลักษณ์ +อาลัย +อาลัยอาวรณ์ +อาลัว +อาลิ +อาลี +อาโลก +อาโลก- +อาโลกกสิณ +อาโลกนะ +อาว +อ่าว +อ้าว +อาวรณ์ +อาวัชนาการ +อาวัล +อาวาส +อาวาสิก +อาวาห- +อาวาหะ +อาวิล +อาวุต +อาวุธ +อาวุโส +อาเวค +อาเวศ +อาศรม +อาศรมบท +อาศเลษา +อาศัย +อาศัยที่ +อาศัยลำแข้งตัวเอง +อาศิร- +อาศิรพจน์ +อาศิรพาท +อาศิรพิษ +อาศิรวจนะ +อาศิรวาท +อาศิรวิษ +อาศีรพิษ +อาศีรวิษ +อาศุ +อาเศียร- +อาเศียรพจน์ +อาเศียรพาท +อาเศียรวจนะ +อาเศียรวาท +อาษาฒ +อาสน +อาสน์ +อาสน์สงฆ์ +อาสนะ +อาสัญ +อาสัตย์ +อาสันนะ +อาสา +อาสาฬห- +อาสาฬห์ +อาสาฬหบูชา +อาสิญจ์ +อาสิน +อาสูร +อาแสะ +อาหต +อาหนี +อาหนู +อาหม +อาหร +อาหรัดกัดติกา +อาหรับ +อาหลักอาเหลื่อ +อาหาร +อาหารว่าง +อาหุดี +อาฬหก +อาฬาริก +อ่าองค์ +อำ +อ่ำ +อำแดง +อำนด +อำนนต์ +อำนรรฆ +อำนวย +อำนาจ +อำนาจบาตรใหญ่ +อำนาถ +อำนิฐ +อำนิษฐ์ +อำปลัง +อำพน +อำพราง +อำพะนำ +อำพัน +อำพันขี้ปลา +อำพันทอง +อำไพ +อำเภอ +อำเภอใจ +อำมร +อำมฤคโชค +อำมฤต +อำมหิต +อำมาตย์ +อำยวน +อำรุง +อำลา +อำอวม +อ้ำอึ้ง +อิก +อิง +อิงค์ +อิงอร +อิงแอบ +อิจฉา +อิฉัน +อิชยา +อิฏฐ- +อิฏฐารมณ์ +อิฐ- +อิฐผล +อิณ +อิด +อิดโรย +อิดหนาระอาใจ +อิดออด +อิดๆ ออดๆ +อิดเอื้อน +อิดๆ เอื้อนๆ +อิตถี +อิตถีลิงค์ +อิตเทรียม +อิตเทอร์เบียม +อิทธิ +อิทธิ- +อิทธิปาฏิหาริย์ +อิทธิพล +อิทธิฤทธิ์ +อิน +อินซูลิน +อินเดีย +อินเดียนแดง +อินเดียม +อินท์ +อินทขีล +อินทนิล +อินทนิลน้ำ +อินทผลัม +อินทร- +อินทร์ +อินทรธนู +อินทรวงศ์ +อินทรวิเชียร +อินทรศักดิ์ +อินทราณี +อินทราภิเษก +อินทรายุธ +อินทรี +อินทรีย- +อินทรีย์ +อินทรียโคจร +อินทรียญาณ +อินทรียสังวร +อินทีวร +อินทุ +อินธน์ +อินฟราเรด +อินัง +อินังขังขอบ +อิ่ม +อิ่มใจ +อิ่มตัว +อิ่มหนำ +อิ่มหมีพีมัน +อิ่มอกอิ่มใจ +อิ่มเอิบ +อิมัลชัน +อิริเดียม +อิริยา +อิริยาบถ +อิรุพเพท +อิลู +อิเล็กตรอน +อิเล็กทรอนิกส์ +อิเล็กโทน +อิศร +อิศวร +อิษฏ์ +อิษฏี +อิส +อิสตรี +อิสร- +อิสรภาพ +อิสระ +อิสริย- +อิสริยยศ +อิสริยะ +อิสริยาภรณ์ +อิสลาม +อิสสา +อิสัตรี +อิสิ +อิสี +อิหม่าม +อิหลักอิเหลื่อ +อี +อี่ +อี้ +อี๊ +อี๋ +อีก +อีก้อ +อีก๋อย +อีกา +อีก๋า +อีเก้ง +อีเกร็ง +อีเก้อีกัง +อีแก +อีแก่ +อีแก้ +อีโก้ง +อีโก๊ะ +อีคว่ำอีหงาย +อีจู้ +อีฉัน +อีฉุยอีแฉก +อีชุก +อี๊ด +อีดำอีแดง +อีตาล +อีเต้อ +อีโต้ +อีถ่าง +อีทุก +อีทุบ +อีเทอร์ +อีนุงตุงนัง +อีนูน +อีโน +อีโนงโตงเนง +อีบึ้ง +อีเป็ด +อีเป้า +อีแปะ +อีโปง +อีโปงครอบ +อีเพา +อีมู +อีรม +อีรุ้ง +อีลอง +อีล่อยป่อยแอ +อีลุ้ม +อีลุ่ยฉุยแฉก +อีเลิ้ง +อีแล่ง +อีโลง +อีศ +อีศวร +อีส +อีสา +อีสาน +อีสุกอีใส +อีหน็องอีแหน็ง +อีหรอบ +อีหรอบเดียวกัน +อีหลักอีเหลื่อ +อีหลัดถัดทา +อีหลี +อีหลุกขลุกขลัก +อีหลุกขลุกขลุ่ย +อีหลุยฉุยแฉก +อีเห็น +อีเหน็บ +อีเหนียว +อีเหละเขละขละ +อีเหละเขะขะ +อีโหน่อีเหน่ +อีโหลกโขลกเขลก +อี๋อ๋อ +อีแอ่น +อึ +อึก +อึ๊ก +อึกทึก +อึกอัก +อึง +อึ่ง +อึ้ง +อึงคะนึง +อึงมี่ +อึ่งยาง +อึ่งใหญ่ +อึงอล +อึ่งอ่าง +อึด +อึดใจ +อึดตะปือ +อึ้ดทึ่ด +อึดอัด +อึน +อืด +อืดอาด +อื่น +อื้น +อือ +อื้อ +อื้อฉาว +อื้ออึง +อุ +อุก +อุกกา +อุกกาบาต +อุกฉกรรจ์ +อุกฤษฏ์ +อุกลา +อุกลาบาต +อุกอาจ +อุค +อุคร +อุคห- +อุคหนิมิต +อุคหะ +อุโฆษ +อุ้ง +อุจ +อุจจาร- +อุจจารมรรค +อุจจาระ +อุจฉุ +อุจเฉท +อุจเฉท- +อุจเฉททิฐิ +อุจาด +อุชุ +อุฏฐาการ +อุณห- +อุณหภูมิ +อุณหะ +อุณหาการ +อุณหิส +อุณา +อุณานาภี +อุณาโลม +อุด +อุดเตา +อุดม +อุดม- +อุดมการณ์ +อุดมคติ +อุดมศึกษา +อุดร +อุดหนุน +อุดอู้ +อุดากัน +อุตดม +อุตดร +อุตตมะ +อุตตรผลคุนี +อุตตรภัทรบท +อุตตรอาษาฒ +อุตตราสาฬหะ +อุตตะภัททะ +อุตบล +อุตพิด +อุตพิดผี +อุตม- +อุตมภาพ +อุตมัตถ์ +อุตมางค์ +อุตร- +อุตรกุรุ +อุตรกุรู +อุตรนิกาย +อุตรผลคุนี +อุตรภัทรบท +อุตรา +อุตราภิมุข +อุตราวัฏ +อุตราษาฒ +อุตราสงค์ +อุตริ +อุตริมนุสธรรม +อุตลุด +อุตสาห- +อุตส่าห์ +อุตสาหกรรม +อุตสาหกรรมศิลป์ +อุตสาหะ +อุตุ +อุตุนิยมวิทยา +อุท- +อุทก +อุทก- +อุทกธาร +อุทกธารา +อุทกภัย +อุทกวิทยา +อุทกศาสตร์ +อุททาม +อุทธรณ์ +อุทธัจ +อุทบาตร +อุทบาน +อุทพินทุ์ +อุทยาน +อุทยานแห่งชาติ +อุทร +อุทริยะ +อุทลุม +อุทัช +อุทัย +อุทาน +อุทาร +อุทาหรณ์ +อุทิศ +อุทุมพร +อุเทศ +อุธัจ +อุ่น +อุ่นเครื่อง +อุ่นใจ +อุ่นหนาฝาคั่ง +อุนากัน +อุบ +อุบล +อุบอิบ +อุบะ +อุบ๊ะ +อุบัติ +อุบัติ- +อุบัติภัย +อุบัติเหตุ +อุบาท +อุบาทว์ +อุบาย +อุบาสก +อุบาสิกา +อุเบกขา +อุโบสถ +อุโบสถกรรม +อุโบสถหัตถี +อุป +อุปกรณ์ +อุปกรม +อุปการ- +อุปการะ +อุปการี +อุปกิณณะ +อุปกิเลส +อุปจาร +อุปถัมภ์ +อุปถัมภก +อุปทม +อุปทูต +อุปเทศ +อุปเท่ห์ +อุปธิ +อุปนัย +อุปนิกขิต +อุปนิกษิต +อุปนิษัท +อุปนิสัย +อุปบล +อุปบัติ +อุปบาท +อุปปาติก- +อุปพัทธ์ +อุปพันธ์ +อุปโภค +อุปมา +อุปมาน +อุปมาโวหาร +อุปมาอุปไมย +อุปไมย +อุปยุวราช +อุปโยค +อุปโยคบุรพบท +อุปรากร +อุปราคา +อุปราช +อุปริ +อุปริจร +อุปริพุทธิ +อุปริภาค +อุปริภาพ +อุปริม- +อุปริมปริยาย +อุปริวัสน์ +อุปริสัจ +อุปโลกน์ +อุปสมบท +อุปสมบทกรรม +อุปสมบัน +อุปสรรค +อุปสัมบัน +อุปสัมปทา +อุปสัมปทาเปกข์ +อุปสัมปทาเปกษ์ +อุปฮาด +อุปัชฌาย- +อุปัชฌาย์ +อุปัชฌายวัตร +อุปัชฌายะ +อุปัฏฐาก +อุปัฏฐานะ +อุปัทรพ +อุปัทว- +อุปัทวะ +อุปัทวันตราย +อุปาณ- +อุปาทาน +อุปาธยาย +อุปาหนา +อุภัย +อุ้ม +อุมงค์ +อุ้มชู +อุ้มท้อง +อุ้มน้ำ +อุ้มสม +อุโมงค์ +อุย +อุ่ย +อุ้ย +อุ๊ย +อุยยาน +อุยยาม +อุ้ยยุ้ย +อุยโยค +อุยหน่า +อุ่ยหน่า +อุ้ยอ้าย +อุร- +อุรค +อุรเคนทร์ +อุรณ +อุรพี +อุรส +อุระ +อุรังอุตัง +อุรัจฉทะ +อุรัจฉัท +อุรา +อุรุ +อุไร +อุลปนะ +อุลโลจ +อุลโลละ +อุลามก +อุลิด +อุลูก +อุโลก +อุแว้ +อุษณ- +อุษณกร +อุษณกาล +อุษณรัศมี +อุษณรูจี +อุษณาการ +อุษณีษ์ +อุษม +อุษมัน +อุษา +อุษาโยค +อุสภ +อุสวะ +อุสส่าห์ +อุสสาหะ +อุสา +อุสุ +อุสุการ +อุสุภ +อุสุม +อุหรับ +อุหลบ +อุเหม่ +อุฬาร +อู +อู่ +อู้ +อูฐ +อูด +อู่น้ำ +อูม +อูย +อูรุ +อู่ลอย +อู่แห้ง +อู้อี้ +อู๋อี๋ +เอ +เอ้ +เอก +เอก- +เอ๊ก +เอกเขนก +เอกจิต +เอกฉันท์ +เอกชน +เอกซเรย์ +เอกเทศ +เอกโทษ +เอกนัย +เอกบุคคล +เอกบุรุษ +เอกพจน์ +เอกภพ +เอกภริยา +เอกภักดิ์ +เอกภาคี +เอกภาพ +เอกม +เอกมัย +เอกรรถประโยค +เอกรส +เอกระ +เอกราช +เอกรูป +เอกลักษณ์ +เอกศก +เอกส +เอกสาร +เอกสารราชการ +เอกสารสิทธิ +เอกสิทธิ์ +เอกอัครราชทูต +เอกอัครสมณทูต +เอกอุ +เอกัคตา +เอกังสพยากรณ์ +เอกังสวาที +เอกา +เอ้กา +เอกาธิปไตย +เอเคอร์ +เอง +เอ็ง +เอ๋ง +เอ็ด +เอ็ดตะโร +เอ็ดอึง +เอตทัคคะ +เอ้เต +เอทิลแอลกอฮอล์ +เอน +เอ็น +เอนกาย +เอนไซม์ +เอ็นดู +เอนตัว +เอนหลัง +เอ็นอ่อน +เอนเอียง +เอม +เอ็มบริโอ +เอมอร +เอมโอช +เอย +เอ่ย +เอ๊ย +เอ๋ย +เอร็ดอร่อย +เอราวัณ +เอลา +เอลาฬุก +เอว +เอ๊ว +เอวัง +เอฬก +เอฬา +เออ +เอ่อ +เออๆ คะๆ +เออน่ะ +เออแน่ะ +เออร์เบียม +เอ้อระเหย +เอ้อเร้อ +เอ้อเร้อเอ้อเต่อ +เอออวย +เออออ +เออออห่อหมก +เอ้อเฮอ +เอ้แอ่น +เอ้ๆ แอ่นๆ +เอ๊ะ +เอะใจ +เอะอะ +เอะอะมะเทิ่ง +เอา +เอาการ +เอาการเอางาน +เอากุ้งฝอยไปตกปลากะพง +เอาข้างเข้าถู +เอางาน +เอาจมูกผู้อื่นมาหายใจ +เอาจริง +เอาจริงเอาจัง +เอาใจ +เอาใจช่วย +เอาใจใส่ +เอาชนะ +เอาชั้นเอาเชิง +เอาชัย +เอาชีวิต +เอาชื่อ +เอาเชิง +เอาใช้ +เอาดีเอาเด่น +เอาตาย +เอาแต่ +เอาแต่ใจ +เอาถ่าน +เอาเถิด +เอาเถิดเจ้าล่อ +เอาทองไปรู่กระเบื้อง +เอาทาร +เอาทารย์ +เอาน้ำเย็นเข้าลูบ +เอาน้ำลูบท้อง +เอาเนื้อหนูไปปะเนื้อช้าง +เอาบุญเอาคุณ +เอาปูนหมายหัว +เอาเป็นธุระ +เอาเป็นว่า +เอาเป็นเอาตาย +เอาเปรียบ +เอาผิด +เอาพิมเสนไปแลกเกลือ +เอามะพร้าวห้าวไปขายสวน +เอามือซุกหีบ +เอาไม้ซีกไปงัดไม้ซุง +เอาไม้สั้นไปรันขี้ +เอารส +เอารัดเอาเปรียบ +เอาเรื่อง +เอาฤกษ์ +เอาละ +เอาเลย +เอาเลือดกับปู +เอาหน้า +เอาหูไปนา เอาตาไปไร่ +เอาใหญ่ +เอาฬาร +เอาฬาริก +เอาฬารึก +เอาอกเอาใจ +เอาอย่าง +เอาอยู่ +เอาะลาย +เอิก +เอิกเกริก +เอิ้น +เอิบ +เอิบอาบ +เอียง +เอี้ยง +เอี้ยงคำ +เอียงอาย +เอียงเอน +เอียด +เอี๊ยด +เอียน +เอี่ยน +เอี่ยม +เอี๊ยม +เอี้ยมจุ๊น +เอี้ยมเฟี้ยม +เอี่ยมอ่อง +เอี่ยว +เอี้ยว +เอี่ยวลม +เอื้อ +เอื้อง +เอื้องครั่ง +เอื้องน้ำครั่ง +เอื้องศรีเที่ยง +เอื้องหนวดพราหมณ์ +เอือด +เอือน +เอื้อน +เอือนกิน +เอื้อเฟื้อ +เอือม +เอื้อม +เอื้อมอาจ +เอื่อย +เอื่อยๆ +เอื้อย +เอื้ออำนวย +แอ +แอ้ +แอ๋ +แอก +แอกทิเนียม +แอกน้อย +แอ่ง +แอ้งแม้ง +แอด +แอดๆ +แอ้ด +แอ้ดๆ +แอ๊ด +แอ๊ดๆ +แอ่น +แอนติเจน +แอนติบอดี +แอนติอิเล็กตรอน +แอ่นลม +แอโนด +แอบ +แอบแฝง +แอบอ้าง +แอบอิง +แอ้ม +แอมแปร์ +แอมมิเตอร์ +แอมโมเนีย +แอร่ม +แอลกอฮอล์ +แอลฟา +แอว +แอ่ว +แอ้วแซ่ว +แอสทาทีน +แอสไพริน +แอสฟัลต์ +แอหนัง +แออวย +แออัด +โอ +โอ่ +โอ้ +โอ๋ +โอก +โอ้ก +โอ๊ก +โอกาส +โอฆ- +โอฆชล +โอฆสงสาร +โอฆะ +โอ่ง +โองการ +โองโขดง +โอ่งมังกร +โอชะ +โอชา +โอโซน +โอฐ +โอด +โอดกาเหว่า +โอดครวญ +โอดโอย +โอ๊ต +โอตตัปปะ +โอ่โถง +โอ้โถง +โอทน- +โอทนะ +โอน +โอนกรรมสิทธิ์ +โอนชาติ +โอนอ่อน +โอนเอน +โอบ +โอบอ้อมอารี +โอบอุ้ม +โอบเอื้อ +โอปปาติกะ +โอภา +โอภาปราศรัย +โอภาส +โอม +โอย +โอ๊ย +โอร- +โอรส +โอละพ่อ +โอลิมปิก +โอ้โลม +โอ้โลมปฏิโลม +โอ้ว่า +โอวาท +โอษฐ- +โอษฐ์ +โอษฐชะ +โอษฐภัย +โอสถ +โอสถ- +โอสถกรรม +โอสาน +โอหนอ +โอห์ม +โอห์มมิเตอร์ +โอหัง +โอฬาร +โอฬาริก +โอฬารึก +โอ่อวด +โอ้อวด +โอ่อ่า +โอ้เอ้ +โอเอซิส +โอ้โฮ +ไอ +ไอ้ +ไอกรน +ไอโซโทป +ไอแดด +ไอตัว +ไอน์สไตเนียม +ไอพ่น +ไอพิษ +ไอยรา +ไอยเรศ +ไอราพต +ไอราวัณ +ไอศกรีม +ไอศวรรย์ +ไอศุริย- +ไอศุริยสมบัติ +ไอศูรย์ +ไอเสีย +ไอออน +ไอโอดีน +ฮ +ฮกเกี้ยน +ฮด +ฮวงซุ้ย +ฮวน +ฮ้วนหมู +ฮวบ +ฮวบฮาบ +ฮ่อ +ฮ้อ +ฮอกกี้ +ฮอด +ฮ่อม +ฮ่อมดง +ฮ่อมเมือง +ฮอร์โมน +ฮอลแลนด์ +ฮอลันดา +ฮะ +ฮะฮ้าย +ฮะไฮ้ +ฮัก +ฮักๆ +ฮังเล +ฮัจญ์ +ฮัจญะฮ์ +ฮัจญี +ฮั่น +ฮา +ฮ้า +ฮ่างหลวง +ฮาป่า +ฮาม +ฮาเร็ม +ฮาห์เนียม +ฮ้าไฮ้ +ฮิจเราะห์ +ฮินดู +ฮิปโปโปเตมัส +ฮิสทีเรีย +ฮีเลียม +ฮึ +ฮึก +ฮึกหาญ +ฮึกห้าว +ฮึกเหิม +ฮึกโหม +ฮึกฮัก +ฮึด +ฮึดฮัด +ฮึ่ม +ฮึย +ฮึยๆ +ฮึ่ย +ฮืดฮาด +ฮือ +ฮือๆ +ฮื่อ +ฮื้อ +ฮุด +ฮุบ +ฮุยเลฮุย +ฮู้ +ฮูก +ฮูม +เฮ +เฮกตาร์ +เฮกโตกรัม +เฮกโตเมตร +เฮกโตลิตร +เฮง +เฮงซวย +เฮ็ด +เฮโมโกลบิน +เฮย +เฮ้ย +เฮโรอีน +เฮลิคอปเตอร์ +เฮโลสาระพา +เฮ้ว +เฮอ +เฮ้อ +เฮฮา +เฮิรตซ์ +เฮี้ยน +เฮี้ยบ +เฮี้ยว +เฮือก +เฮือกๆ +เฮือกสุดท้าย +เฮือน +แฮ +แฮ่ +แฮก +แฮกๆ +แฮ่กึ๊น +แฮนด์บอล +แฮฟเนียม +แฮม +แฮะ +โฮ +โฮก +โฮกอือ +โฮกฮาก +โฮเต็ล +โฮลเมียม +โฮะ +ไฮ้ +ไฮโกรมิเตอร์ +ไฮดรา +ไฮโดรคาร์บอน +ไฮโดรเจน +ไฮโดรเจนซัลไฟด์ +ไฮโดรเจนเพอร์ออกไซด์ +ไฮโดรมิเตอร์ +ไฮไฟ +ไฮโล +ไฮฮี diff --git a/icuSources/test/testdata/structLocale.txt b/icuSources/test/testdata/structLocale.txt new file mode 100644 index 00000000..9e103cd0 --- /dev/null +++ b/icuSources/test/testdata/structLocale.txt @@ -0,0 +1,2922 @@ +// *************************************************************************** +// * +// * Copyright (C) 2004 International Business Machines +// * Corporation and others. All Rights Reserved. +// * +// *************************************************************************** +// This is a pristine locale structure. +// This is used to validate all keys and general structure is correct. +// Since ICU doesn't follow the traditional fallback model where all keys fallback to root, +// root can't be used to validate the structure. +// This file was generated from en.txt, and all ".*" were replaced with "". +structLocale{ + BreakDictionaryData:bin {00} + Countries{ + AD{""} + AE{""} + AF{""} + AG{""} + AI{""} + AL{""} + AM{""} + AN{""} + AO{""} + AQ{""} + AR{""} + AS{""} + AT{""} + AU{""} + AW{""} + AZ{""} + BA{""} + BB{""} + BD{""} + BE{""} + BF{""} + BG{""} + BH{""} + BI{""} + BJ{""} + BM{""} + BN{""} + BO{""} + BR{""} + BS{""} + BT{""} + BV{""} + BW{""} + BY{""} + BZ{""} + CA{""} + CC{""} + CD{""} + CF{""} + CG{""} + CH{""} + CI{""} + CK{""} + CL{""} + CM{""} + CN{""} + CO{""} + CR{""} + CU{""} + CV{""} + CX{""} + CY{""} + CZ{""} + DE{""} + DJ{""} + DK{""} + DM{""} + DO{""} + DZ{""} + EC{""} + EE{""} + EG{""} + EH{""} + ER{""} + ES{""} + ET{""} + FI{""} + FJ{""} + FK{""} + FM{""} + FO{""} + FR{""} + GA{""} + GB{""} + GD{""} + GE{""} + GF{""} + GH{""} + GI{""} + GL{""} + GM{""} + GN{""} + GP{""} + GQ{""} + GR{""} + GS{""} + GT{""} + GU{""} + GW{""} + GY{""} + HK{""} + HM{""} + HN{""} + HR{""} + HT{""} + HU{""} + ID{""} + IE{""} + IL{""} + IN{""} + IO{""} + IQ{""} + IR{""} + IS{""} + IT{""} + JM{""} + JO{""} + JP{""} + KE{""} + KG{""} + KH{""} + KI{""} + KM{""} + KN{""} + KP{""} + KR{""} + KW{""} + KY{""} + KZ{""} + LA{""} + LB{""} + LC{""} + LI{""} + LK{""} + LR{""} + LS{""} + LT{""} + LU{""} + LV{""} + LY{""} + MA{""} + MC{""} + MD{""} + MG{""} + MH{""} + MK{""} + ML{""} + MM{""} + MN{""} + MO{""} + MP{""} + MQ{""} + MR{""} + MS{""} + MT{""} + MU{""} + MV{""} + MW{""} + MX{""} + MY{""} + MZ{""} + NA{""} + NC{""} + NE{""} + NF{""} + NG{""} + NI{""} + NL{""} + NO{""} + NP{""} + NR{""} + NU{""} + NZ{""} + OM{""} + PA{""} + PE{""} + PF{""} + PG{""} + PH{""} + PK{""} + PL{""} + PM{""} + PN{""} + PR{""} + PS{""} + PT{""} + PW{""} + PY{""} + QA{""} + RE{""} + RO{""} + RU{""} + RW{""} + SA{""} + SB{""} + SC{""} + SD{""} + SE{""} + SG{""} + SH{""} + SI{""} + SJ{""} + SK{""} + SL{""} + SM{""} + SN{""} + SO{""} + SP{""} + SR{""} + ST{""} + SV{""} + SY{""} + SZ{""} + TC{""} + TD{""} + TF{""} + TG{""} + TH{""} + TJ{""} + TK{""} + TL{""} + TM{""} + TN{""} + TO{""} + TR{""} + TT{""} + TV{""} + TW{""} + TZ{""} + UA{""} + UG{""} + UM{""} + US{""} + UY{""} + UZ{""} + VA{""} + VC{""} + VE{""} + VG{""} + VI{""} + VN{""} + VU{""} + WF{""} + WS{""} + YE{""} + YT{""} + YU{""} + ZA{""} + ZM{""} + ZW{""} + } + Currencies{ + ADD{ + "", + "", + } + ADP{ + "", + "", + } + AED{ + "", + "", + } + AFA{ + "", + "", + } + AFN{ + "", + "", + } + AIF{ + "", + "", + } + ALK{ + "", + "", + } + ALL{ + "", + "", + } + ALV{ + "", + "", + } + ALX{ + "", + "", + } + AMD{ + "", + "", + } + ANG{ + "", + "", + } + AOA{ + "", + "", + } + AOK{ + "", + "", + } + AON{ + "", + "", + } + AOR{ + "", + "", + } + AOS{ + "", + "", + } + ARA{ + "", + "", + } + ARM{ + "", + "", + } + ARP{ + "", + "", + } + ARS{ + "", + "", + } + ATS{ + "", + "", + } + AUD{ + "", + "", + } + AUP{ + "", + "", + } + AWG{ + "", + "", + } + AZM{ + "", + "", + } + BAD{ + "", + "", + } + BAM{ + "", + "", + } + BAN{ + "", + "", + } + BBD{ + "", + "", + } + BDT{ + "", + "", + } + BEC{ + "", + "", + } + BEF{ + "", + "", + } + BEL{ + "", + "", + } + BGL{ + "", + "", + } + BGM{ + "", + "", + } + BGN{ + "", + "", + } + BGO{ + "", + "", + } + BGX{ + "", + "", + } + BHD{ + "", + "", + } + BIF{ + "", + "", + } + BMD{ + "", + "", + } + BMP{ + "", + "", + } + BND{ + "", + "", + } + BOB{ + "", + "", + } + BOL{ + "", + "", + } + BOP{ + "", + "", + } + BOV{ + "", + "", + } + BRB{ + "", + "", + } + BRC{ + "", + "", + } + BRE{ + "", + "", + } + BRL{ + "", + "", + } + BRN{ + "", + "", + } + BRR{ + "", + "", + } + BRZ{ + "", + "", + } + BSD{ + "", + "", + } + BSP{ + "", + "", + } + BTN{ + "", + "", + } + BTR{ + "", + "", + } + BUK{ + "", + "", + } + BUR{ + "", + "", + } + BWP{ + "", + "", + } + BYB{ + "", + "", + } + BYL{ + "", + "", + } + BYR{ + "", + "", + } + BZD{ + "", + "", + } + BZH{ + "", + "", + } + CAD{ + "", + "", + } + CDF{ + "", + "", + } + CDG{ + "", + "", + } + CDL{ + "", + "", + } + CFF{ + "", + "", + } + CHF{ + "", + "", + } + CKD{ + "", + "", + } + CLC{ + "", + "", + } + CLE{ + "", + "", + } + CLF{ + "", + "", + } + CLP{ + "", + "", + } + CMF{ + "", + "", + } + CNP{ + "", + "", + } + CNX{ + "", + "", + } + CNY{ + "", + "", + } + COB{ + "", + "", + } + COF{ + "", + "", + } + COP{ + "", + "", + } + CRC{ + "", + "", + } + CSC{ + "", + "", + } + CSK{ + "", + "", + } + CUP{ + "", + "", + } + CUX{ + "", + "", + } + CVE{ + "", + "", + } + CWG{ + "", + "", + } + CYP{ + "", + "", + } + CZK{ + "", + "", + } + DDM{ + "", + "", + } + DEM{ + "", + "", + } + DES{ + "", + "", + } + DJF{ + "", + "", + } + DKK{ + "", + "", + } + DOP{ + "", + "", + } + DZD{ + "", + "", + } + DZF{ + "", + "", + } + DZG{ + "", + "", + } + ECS{ + "", + "", + } + ECV{ + "", + "", + } + EEK{ + "", + "", + } + EGP{ + "", + "", + } + ERN{ + "", + "", + } + ESP{ + "", + "", + } + ETB{ + "", + "", + } + ETD{ + "", + "", + } + EUR{ + "", + "", + } + FIM{ + "", + "", + } + FIN{ + "", + "", + } + FJD{ + "", + "", + } + FJP{ + "", + "", + } + FKP{ + "", + "", + } + FOK{ + "", + "", + } + FRF{ + "", + "", + } + FRG{ + "", + "", + } + GAF{ + "", + "", + } + GBP{ + "", + "", + } + GEK{ + "", + "", + } + GEL{ + "", + "", + } + GHC{ + "", + "", + } + GHO{ + "", + "", + } + GHP{ + "", + "", + } + GHR{ + "", + "", + } + GIP{ + "", + "", + } + GLK{ + "", + "", + } + GMD{ + "", + "", + } + GMP{ + "", + "", + } + GNF{ + "", + "", + } + GNI{ + "", + "", + } + GNS{ + "", + "", + } + GPF{ + "", + "", + } + GQE{ + "", + "", + } + GQF{ + "", + "", + } + GQP{ + "", + "", + } + GRD{ + "", + "", + } + GRN{ + "", + "", + } + GTQ{ + "", + "", + } + GUF{ + "", + "", + } + GWE{ + "", + "", + } + GWM{ + "", + "", + } + GWP{ + "", + "", + } + GYD{ + "", + "", + } + HKD{ + "", + "", + } + HNL{ + "", + "", + } + HRD{ + "", + "", + } + HRK{ + "", + "", + } + HTG{ + "", + "", + } + HUF{ + "", + "", + } + IBP{ + "", + "", + } + IDG{ + "", + "", + } + IDJ{ + "", + "", + } + IDN{ + "", + "", + } + IDR{ + "", + "", + } + IEP{ + "", + "", + } + ILL{ + "", + "", + } + ILP{ + "", + "", + } + ILS{ + "", + "", + } + IMP{ + "", + "", + } + INR{ + "", + "", + } + IQD{ + "", + "", + } + IRR{ + "", + "", + } + ISK{ + "", + "", + } + ITL{ + "", + "", + } + JEP{ + "", + "", + } + JMD{ + "", + "", + } + JMP{ + "", + "", + } + JOD{ + "", + "", + } + JPY{ + "", + "", + } + KES{ + "", + "", + } + KGS{ + "", + "", + } + KHO{ + "", + "", + } + KHR{ + "", + "", + } + KID{ + "", + "", + } + KMF{ + "", + "", + } + KPP{ + "", + "", + } + KPW{ + "", + "", + } + KRH{ + "", + "", + } + KRO{ + "", + "", + } + KRW{ + "", + "", + } + KWD{ + "", + "", + } + KYD{ + "", + "", + } + KZR{ + "", + "", + } + KZT{ + "", + "", + } + LAK{ + "", + "", + } + LBP{ + "", + "", + } + LIF{ + "", + "", + } + LKR{ + "", + "", + } + LNR{ + "", + "", + } + LRD{ + "", + "", + } + LSL{ + "", + "", + } + LTL{ + "", + "", + } + LTT{ + "", + "", + } + LUF{ + "", + "", + } + LVL{ + "", + "", + } + LVR{ + "", + "", + } + LYB{ + "", + "", + } + LYD{ + "", + "", + } + LYP{ + "", + "", + } + MAD{ + "", + "", + } + MAF{ + "", + "", + } + MCF{ + "", + "", + } + MCG{ + "", + "", + } + MDC{ + "", + "", + } + MDL{ + "", + "", + } + MDR{ + "", + "", + } + MGA{ + "", + "", + } + MGF{ + "", + "", + } + MHD{ + "", + "", + } + MKD{ + "", + "", + } + MKN{ + "", + "", + } + MLF{ + "", + "", + } + MMK{ + "", + "", + } + MMX{ + "", + "", + } + MNT{ + "", + "", + } + MOP{ + "", + "", + } + MQF{ + "", + "", + } + MRO{ + "", + "", + } + MTL{ + "", + "", + } + MTP{ + "", + "", + } + MUR{ + "", + "", + } + MVP{ + "", + "", + } + MVR{ + "", + "", + } + MWK{ + "", + "", + } + MWP{ + "", + "", + } + MXN{ + "", + "", + } + MXP{ + "", + "", + } + MXV{ + "", + "", + } + MYR{ + "", + "", + } + MZE{ + "", + "", + } + MZM{ + "", + "", + } + NAD{ + "", + "", + } + NCF{ + "", + "", + } + NGN{ + "", + "", + } + NGP{ + "", + "", + } + NHF{ + "", + "", + } + NIC{ + "", + "", + } + NIG{ + "", + "", + } + NIO{ + "", + "", + } + NLG{ + "", + "", + } + NOK{ + "", + "", + } + NPR{ + "", + "", + } + NZD{ + "", + "", + } + NZP{ + "", + "", + } + OMR{ + "", + "", + } + OMS{ + "", + "", + } + PAB{ + "", + "", + } + PDK{ + "", + "", + } + PDN{ + "", + "", + } + PDR{ + "", + "", + } + PEI{ + "", + "", + } + PEN{ + "", + "", + } + PES{ + "", + "", + } + PGK{ + "", + "", + } + PHP{ + "", + "", + } + PKR{ + "", + "", + } + PLN{ + "", + "", + } + PLX{ + "", + "", + } + PLZ{ + "", + "", + } + PSP{ + "", + "", + } + PTC{ + "", + "", + } + PTE{ + "", + "", + } + PYG{ + "", + "", + } + QAR{ + "", + "", + } + REF{ + "", + "", + } + ROL{ + "", + "", + } + RON{ + "", + "", + } + RUB{ + "", + "", + } + RUR{ + "", + "", + } + RWF{ + "", + "", + } + SAR{ + "", + "", + } + SAS{ + "", + "", + } + SBD{ + "", + "", + } + SCR{ + "", + "", + } + SDD{ + "", + "", + } + SDP{ + "", + "", + } + SEK{ + "", + "", + } + SGD{ + "", + "", + } + SHP{ + "", + "", + } + SIB{ + "", + "", + } + SIT{ + "", + "", + } + SKK{ + "", + "", + } + SLL{ + "", + "", + } + SML{ + "", + "", + } + SOS{ + "", + "", + } + SQS{ + "", + "", + } + SRG{ + "", + "", + } + SSP{ + "", + "", + } + STD{ + "", + "", + } + STE{ + "", + "", + } + SUN{ + "", + "", + } + SUR{ + "", + "", + } + SVC{ + "", + "", + } + SYP{ + "", + "", + } + SZL{ + "", + "", + } + TCC{ + "", + "", + } + TDF{ + "", + "", + } + THB{ + "", + "", + } + TJR{ + "", + "", + } + TJS{ + "", + "", + } + TMM{ + "", + "", + } + TND{ + "", + "", + } + TOP{ + "", + "", + } + TOS{ + "", + "", + } + TPE{ + "", + "", + } + TPP{ + "", + "", + } + TRL{ + "", + "", + } + TRY{ + "", + "", + } + TTD{ + "", + "", + } + TTO{ + "", + "", + } + TVD{ + "", + "", + } + TWD{ + "", + "", + } + TZS{ + "", + "", + } + UAH{ + "", + "", + } + UAK{ + "", + "", + } + UGS{ + "", + "", + } + UGX{ + "", + "", + } + USD{ + "", + "", + } + USN{ + "", + "", + } + USS{ + "", + "", + } + UYF{ + "", + "", + } + UYP{ + "", + "", + } + UYU{ + "", + "", + } + UZC{ + "", + "", + } + UZS{ + "", + "", + } + VAL{ + "", + "", + } + VDD{ + "", + "", + } + VDN{ + "", + "", + } + VDP{ + "", + "", + } + VEB{ + "", + "", + } + VGD{ + "", + "", + } + VND{ + "", + "", + } + VNN{ + "", + "", + } + VNR{ + "", + "", + } + VNS{ + "", + "", + } + VUV{ + "", + "", + } + WSP{ + "", + "", + } + WST{ + "", + "", + } + XAD{ + "", + "", + } + XAF{ + "", + "", + } + XAM{ + "", + "", + } + XAU{ + "", + "", + } + XBA{ + "", + "", + } + XBB{ + "", + "", + } + XBC{ + "", + "", + } + XBD{ + "", + "", + } + XCD{ + "", + "", + } + XCF{ + "", + "", + } + XDR{ + "", + "", + } + XEF{ + "", + "", + } + XEU{ + "", + "", + } + XFO{ + "", + "", + } + XFU{ + "", + "", + } + XID{ + "", + "", + } + XMF{ + "", + "", + } + XNF{ + "", + "", + } + XOF{ + "", + "", + } + XPF{ + "", + "", + } + XTR{ + "", + "", + } + YDD{ + "", + "", + } + YEI{ + "", + "", + } + YER{ + "", + "", + } + YUD{ + "", + "", + } + YUF{ + "", + "", + } + YUG{ + "", + "", + } + YUM{ + "", + "", + } + YUN{ + "", + "", + } + YUO{ + "", + "", + } + YUR{ + "", + "", + } + ZAL{ + "", + "", + } + ZAP{ + "", + "", + } + ZAR{ + "", + "", + } + ZMK{ + "", + "", + } + ZMP{ + "", + "", + } + ZRN{ + "", + "", + } + ZRZ{ + "", + "", + } + ZWD{ + "", + "", + } + } + ExemplarCharacters{""} + Keys{ + calendar{""} + collation{""} + currency{""} + } + Languages{ + aa{""} + ab{""} + ace{""} + ach{""} + ada{""} + ady{""} + ae{""} + af{""} + afa{""} + afh{""} + ak{""} + akk{""} + ale{""} + alg{""} + am{""} + an{""} + ang{""} + apa{""} + ar{""} + arc{""} + arn{""} + arp{""} + art{""} + arw{""} + as{""} + ast{""} + ath{""} + aus{""} + av{""} + awa{""} + ay{""} + az{""} + ba{""} + bad{""} + bai{""} + bal{""} + ban{""} + bas{""} + bat{""} + be{""} + bej{""} + bem{""} + ber{""} + bg{""} + bh{""} + bho{""} + bi{""} + bik{""} + bin{""} + bla{""} + bm{""} + bn{""} + bnt{""} + bo{""} + br{""} + bra{""} + bs{""} + btk{""} + bua{""} + bug{""} + byn{""} + ca{""} + cad{""} + cai{""} + car{""} + cau{""} + ce{""} + ceb{""} + cel{""} + ch{""} + chb{""} + chg{""} + chk{""} + chm{""} + chn{""} + cho{""} + chp{""} + chr{""} + chy{""} + cmc{""} + co{""} + cop{""} + cpe{""} + cpf{""} + cpp{""} + cr{""} + crh{""} + crp{""} + cs{""} + csb{""} + cu{""} + cus{""} + cv{""} + cy{""} + da{""} + dak{""} + dar{""} + day{""} + de{""} + del{""} + den{""} + dgr{""} + din{""} + doi{""} + dra{""} + dsb{""} + dua{""} + dum{""} + dv{""} + dyu{""} + dz{""} + ee{""} + efi{""} + egy{""} + eka{""} + el{""} + elx{""} + en{""} + enm{""} + eo{""} + es{""} + et{""} + eu{""} + ewo{""} + fa{""} + fan{""} + fat{""} + ff{""} + fi{""} + fiu{""} + fj{""} + fo{""} + fon{""} + fr{""} + frm{""} + fro{""} + fur{""} + fy{""} + ga{""} + gaa{""} + gay{""} + gba{""} + gd{""} + gem{""} + gez{""} + gil{""} + gl{""} + gmh{""} + gn{""} + goh{""} + gon{""} + gor{""} + got{""} + grb{""} + grc{""} + gu{""} + gv{""} + gwi{""} + ha{""} + hai{""} + haw{""} + he{""} + hi{""} + hil{""} + him{""} + hit{""} + hmn{""} + ho{""} + hr{""} + hsb{""} + ht{""} + hu{""} + hup{""} + hy{""} + hz{""} + ia{""} + iba{""} + id{""} + ie{""} + ig{""} + ii{""} + ijo{""} + ik{""} + ilo{""} + inc{""} + ine{""} + inh{""} + io{""} + ira{""} + iro{""} + is{""} + it{""} + iu{""} + ja{""} + jbo{""} + jpr{""} + jrb{""} + jv{""} + ka{""} + kaa{""} + kab{""} + kac{""} + kam{""} + kar{""} + kaw{""} + kbd{""} + kg{""} + kha{""} + khi{""} + kho{""} + ki{""} + kj{""} + kk{""} + kl{""} + km{""} + kmb{""} + kn{""} + ko{""} + kok{""} + kos{""} + kpe{""} + kr{""} + krc{""} + kro{""} + kru{""} + ks{""} + ku{""} + kum{""} + kut{""} + kv{""} + kw{""} + ky{""} + la{""} + lad{""} + lah{""} + lam{""} + lb{""} + lez{""} + lg{""} + li{""} + ln{""} + lo{""} + lol{""} + loz{""} + lt{""} + lu{""} + lua{""} + lui{""} + lun{""} + luo{""} + lus{""} + lv{""} + mad{""} + mag{""} + mai{""} + mak{""} + man{""} + map{""} + mas{""} + mdf{""} + mdr{""} + men{""} + mg{""} + mga{""} + mh{""} + mi{""} + mic{""} + min{""} + mis{""} + mk{""} + mkh{""} + ml{""} + mn{""} + mnc{""} + mni{""} + mno{""} + mo{""} + moh{""} + mos{""} + mr{""} + ms{""} + mt{""} + mul{""} + mun{""} + mus{""} + mwr{""} + my{""} + myn{""} + myv{""} + na{""} + nah{""} + nai{""} + nap{""} + nb{""} + nd{""} + nds{""} + ne{""} + new{""} + ng{""} + nia{""} + nic{""} + niu{""} + nl{""} + nn{""} + no{""} + nog{""} + non{""} + nr{""} + nso{""} + nub{""} + nv{""} + nwc{""} + ny{""} + nym{""} + nyn{""} + nyo{""} + nzi{""} + oc{""} + oj{""} + om{""} + or{""} + os{""} + osa{""} + ota{""} + oto{""} + pa{""} + paa{""} + pag{""} + pal{""} + pam{""} + pap{""} + pau{""} + peo{""} + phi{""} + phn{""} + pi{""} + pl{""} + pon{""} + pra{""} + pro{""} + ps{""} + pt{""} + qu{""} + raj{""} + rap{""} + rar{""} + rm{""} + rn{""} + ro{""} + roa{""} + rom{""} + root{""} + ru{""} + rw{""} + sa{""} + sad{""} + sah{""} + sai{""} + sal{""} + sam{""} + sas{""} + sat{""} + sc{""} + sco{""} + sd{""} + se{""} + sel{""} + sem{""} + sg{""} + sga{""} + sgn{""} + sh{""} + shn{""} + si{""} + sid{""} + sio{""} + sit{""} + sk{""} + sl{""} + sla{""} + sm{""} + sma{""} + smi{""} + smj{""} + smn{""} + sms{""} + sn{""} + snk{""} + so{""} + sog{""} + son{""} + sq{""} + sr{""} + srr{""} + ss{""} + ssa{""} + st{""} + su{""} + suk{""} + sus{""} + sux{""} + sv{""} + sw{""} + syr{""} + ta{""} + tai{""} + te{""} + tem{""} + ter{""} + tet{""} + tg{""} + th{""} + ti{""} + tig{""} + tiv{""} + tk{""} + tkl{""} + tl{""} + tlh{""} + tli{""} + tmh{""} + tn{""} + to{""} + tog{""} + tpi{""} + tr{""} + ts{""} + tsi{""} + tt{""} + tum{""} + tup{""} + tut{""} + tvl{""} + tw{""} + ty{""} + tyv{""} + udm{""} + ug{""} + uga{""} + uk{""} + umb{""} + und{""} + ur{""} + uz{""} + vai{""} + ve{""} + vi{""} + vo{""} + vot{""} + wa{""} + wak{""} + wal{""} + war{""} + was{""} + wen{""} + wo{""} + xal{""} + xh{""} + yao{""} + yap{""} + yi{""} + yo{""} + ypk{""} + za{""} + zap{""} + zen{""} + zh{""} + znd{""} + zu{""} + zun{""} + } + LocaleScript{ + "", + } + MeasurementSystem:int{0} + NumberElements{ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + } + NumberPatterns{ + "", + "", + "", + "", + } + PaperSize:intvector{ + 297, + 210, + } + Scripts{ + Arab{""} + Armn{""} + Beng{""} + Bopo{""} + Brai{""} + Buhd{""} + Cans{""} + Cher{""} + Copt{""} + Cprt{""} + Cyrl{""} + Deva{""} + Dsrt{""} + Ethi{""} + Geor{""} + Goth{""} + Grek{""} + Gujr{""} + Guru{""} + Hang{""} + Hani{""} + Hano{""} + Hans{""} + Hant{""} + Hebr{""} + Hira{""} + Hrkt{""} + Ital{""} + Kana{""} + Khmr{""} + Knda{""} + Laoo{""} + Latn{""} + Limb{""} + Linb{""} + Mlym{""} + Mong{""} + Mymr{""} + Ogam{""} + Orya{""} + Osma{""} + Qaai{""} + Runr{""} + Shaw{""} + Sinh{""} + Syrc{""} + Tagb{""} + Tale{""} + Taml{""} + Telu{""} + Tglg{""} + Thaa{""} + Thai{""} + Tibt{""} + Ugar{""} + Yiii{""} + Zyyy{""} + } + Types{ + calendar{ + buddhist{""} + chinese{""} + gregorian{""} + hebrew{""} + islamic{""} + islamic-civil{""} + japanese{""} + } + collation{ + direct{""} + phonebook{""} + pinyin{""} + stroke{""} + traditional{""} + } + } + Variants{ + POSIX{""} + REVISED{""} + } + Version{""} + boundaries{ + grapheme{"char"} + line{"line"} + sentence{"sentence"} + title{"title"} + word{"word"} + } + calendar{ + buddhist{ + DateTimePatterns{ + "", + "", + "", + "", + "", + "", + "", + "", + "", + } + eras{ + abbreviated{ + "", + } + } + } + chinese{ + DateTimePatterns{ + "", + "", + "", + "", + "", + "", + "", + "", + "", + } + } + default{""} + gregorian{ + AmPmMarkers{ + "", + "", + } + DateTimeElements:intvector{ + 1, + 1, + } + DateTimePatterns{ + "", + "", + "", + "", + "", + "", + "", + "", + "", + } + dayNames{ + default{""} + format{ + abbreviated{ + "", + "", + "", + "", + "", + "", + "", + } + default{""} + narrow{ + "", + "", + "", + "", + "", + "", + "", + } + wide{ + "", + "", + "", + "", + "", + "", + "", + } + } + stand-alone{ + abbreviated{ + "", + "", + "", + "", + "", + "", + "", + } + default{""} + narrow{ + "", + "", + "", + "", + "", + "", + "", + } + wide{ + "", + "", + "", + "", + "", + "", + "", + } + } + } + eras{ + abbreviated{ + "", + "", + } + } + monthNames{ + default{""} + format{ + abbreviated{ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + } + default{""} + narrow{ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + } + wide{ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + } + } + stand-alone{ + abbreviated{ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + } + default{""} + narrow{ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + } + wide{ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + } + } + } + weekend:intvector{ + 7, + 0, + 2, + 0, + } + } + hebrew{ + eras{ + abbreviated{ + "", + } + } + monthNames{ + default{""} + format{ + abbreviated:alias{"structLocale/calendar/hebrew/monthNames/format/wide"} + default{""} + wide{ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + } + } + } + } + islamic{ + eras{ + abbreviated{ + "", + } + } + monthNames{ + default{""} + format{ + abbreviated:alias{"structLocale/calendar/islamic/monthNames/format/wide"} + default{""} + wide{ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + } + } + } + } + islamic-civil:alias{"structLocale/calendar/islamic"} + japanese{ + DateTimePatterns{ + "", + "", + "", + "", + "", + "", + "", + "", + "", + } + eras{ + abbreviated{ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + } + } + } + } + localPatternChars{""} + zoneStrings{ + { + "", + "", + "", + "", + "", + "", + } + } +} diff --git a/icuSources/test/testdata/te.txt b/icuSources/test/testdata/te.txt index cdbd2dac..6e8e790a 100644 --- a/icuSources/test/testdata/te.txt +++ b/icuSources/test/testdata/te.txt @@ -1,6 +1,6 @@ //******************************************************************************* //* -//* Copyright (C) 1998-2000, International Business Machines +//* Copyright (C) 1998-2003, International Business Machines //* Corporation and others. All Rights Reserved. //* //******************************************************************************* @@ -89,12 +89,14 @@ te tag0 { TE0 } } - CollationElements - { Version { "1.0" } + collations { + standard { + Version { "1.0" } Override { "FALSE" } Sequence {"& A < a\u0308 , A\u0308 & C < c\u0327 , C\u0327 & G < g" "\u0306 , G\u0306 & H < \u0131 , I , i , \u0130 < \u0132 , \u0133 & O < o\u0308 " ", O\u0308 & S < s\u0327 , S\u0327 & U < u\u0308 , U\u0308 " } + } } } diff --git a/icuSources/test/testdata/te_IN.goo b/icuSources/test/testdata/te_IN.goo deleted file mode 100644 index 1178b251..00000000 --- a/icuSources/test/testdata/te_IN.goo +++ /dev/null @@ -1,17 +0,0 @@ -//******************************************************************************* -//* -//* Copyright (C) 1998-2000, International Business Machines -//* Corporation and others. All Rights Reserved. -//* -//******************************************************************************* - - -// This is a test file which inherits from te, te_IN. - -te_IN -{ - Version { 55 } - string_in_Default_te_te_IN { GOO } -} - -//eof diff --git a/icuSources/test/testdata/test1.ucm b/icuSources/test/testdata/test1.ucm index 9fe7d0fe..b4da4768 100644 --- a/icuSources/test/testdata/test1.ucm +++ b/icuSources/test/testdata/test1.ucm @@ -1,5 +1,5 @@ # ******************************************************************************* -# * Copyright (C) 2001, International Business Machines +# * Copyright (C) 2001-2003, International Business Machines # * Corporation and others. All Rights Reserved. # ******************************************************************************* # @@ -11,13 +11,14 @@ <mb_cur_max> 1 <mb_cur_min> 1 <uconv_class> "MBCS" -<subchar> \xff -<icu:state> 0, 5-9, ff +<subchar> \xff +<icu:state> 0, 5-9, ff CHARMAP # fromUnicode result is zero byte from other than U+0000 <U20ac> \x00 |0 +<U20ad> \x00 |1 # nothing special <U0005> \x05 |0 diff --git a/icuSources/test/testdata/test3.ucm b/icuSources/test/testdata/test3.ucm index f9e6ea85..aee69c28 100644 --- a/icuSources/test/testdata/test3.ucm +++ b/icuSources/test/testdata/test3.ucm @@ -1,20 +1,21 @@ # ******************************************************************************* -# * Copyright (C) 2001, International Business Machines +# * Copyright (C) 2001-2003, International Business Machines # * Corporation and others. All Rights Reserved. # ******************************************************************************* # # test3.ucm # # Test file for MBCS conversion with three-byte codepage data. +# Also contains extension mappings (m:n). <code_set_name> "test3" <mb_cur_max> 3 <mb_cur_min> 1 <uconv_class> "MBCS" -<subchar> \xff -<icu:state> 0, 1:1, 5-9, ff -<icu:state> 2:2 -<icu:state> a-f.p +<subchar> \xff +<icu:state> 0, 1:1, 5-9, ff +<icu:state> 2:2 +<icu:state> a-f.p CHARMAP @@ -24,6 +25,11 @@ CHARMAP # nothing special <U0005> \x05 |0 +# extensions +<U00c0> \x05+\x01\x02\x0d |0 +<U00c0> \x05+\x01\x02\x0e |3 +<U00c0> \x05+\xff |3 + # toUnicode result is fallback direct <U0006> \x06 |3 @@ -31,8 +37,18 @@ CHARMAP <U101234> \x07 |0 <Ufebcd> \x08 |3 +# extensions +<U101234>+<U50005>+<U60006> \x07+\x00+\x01\x02\x0f+\x09 |0 +<U101234>+<U50005> \x07+\x00+\x01\x02\x0e+\x05 |0 +<U101234>+<U60006> \x07+\x00+\x01\x02\x0f+\x06 |0 +<U101234>+<U70007> \x07+\x00+\x01\x02\x0f |1 + #unassigned \x09 +# extensions where the first code point is unassigned, for replay testing +#<U00c4><U0300> \x09+\x09 |0 +<U00c4><U00c4><U101234><U0005> \x05+\x01\x02\x0c |0 + # toUnicode result is surrogate pair: test real pair, single unit, unassigned <U23456> \x01\x02\x0a |0 <U000b> \x01\x02\x0b |0 diff --git a/icuSources/test/testdata/test4.ucm b/icuSources/test/testdata/test4.ucm index 9738964a..3b0aad0f 100644 --- a/icuSources/test/testdata/test4.ucm +++ b/icuSources/test/testdata/test4.ucm @@ -1,27 +1,35 @@ # ******************************************************************************* -# * Copyright (C) 2001, International Business Machines +# * Copyright (C) 2001-2003, International Business Machines # * Corporation and others. All Rights Reserved. # ******************************************************************************* # # test4.ucm # -# Test file for MBCS conversion with three-byte codepage data. +# Test file for MBCS conversion with four-byte codepage data. <code_set_name> "test4" <mb_cur_max> 4 <mb_cur_min> 1 <uconv_class> "MBCS" -<subchar> \xff -<icu:state> 0, 1:1, 5-9, ff -<icu:state> 2:2 -<icu:state> 3:3 -<icu:state> a-f.p + +# both subchars are single-byters, which does not make sense +# but works - adding subchar1 for tests but don't want to +# change old tests for a new subchar -- markus 20031028 +<subchar> \xff +<subchar1> \xe1 +<icu:state> 0, 1:1, 5-9, e1, ff +<icu:state> 2:2 +<icu:state> 3:3 +<icu:state> a-f.p, ff CHARMAP # fromUnicode result is zero byte from other than U+0000 <U20ac> \x00 |0 +# fallback from non-zero to zero possible with extension table +<U20ad> \x00 |1 + # nothing special <U0005> \x05 |0 @@ -42,4 +50,15 @@ CHARMAP <U000e> \x01\x02\x03\x0e |3 #unassigned \x01\x02\x03\x0f +# <subchar1> non-mapping +<U50005> \xe1 |2 +# add a mapping that turns the above's Unicode side into a prefix +<U50005><U60006> \x06 |1 + +# many bytes, and bytes per UChar +<U30ab><U309a> \x01\x02\x03\x0a\x01\x02\x03\x0b\x01\x02\x03\x0c\x01\x02\x03\x0d\x01\x02\x03\x0e\x01\x02\x03\x0f\x01\x02\x03\x0a\x05\x06\x07 |0 + +# many UChars, and UChars per byte +<U304b><U309a><U304d><U309a><U304f><U309a><U3051><U309a><U3053><U309a><U30ab><U309a><U30ad><U309a><U30af><U309a><U30b1><U309a><U0300> \x08\x09 |0 + END CHARMAP diff --git a/icuSources/test/testdata/test4x.ucm b/icuSources/test/testdata/test4x.ucm new file mode 100644 index 00000000..c7692aae --- /dev/null +++ b/icuSources/test/testdata/test4x.ucm @@ -0,0 +1,20 @@ +# ******************************************************************************* +# * Copyright (C) 2003, International Business Machines +# * Corporation and others. All Rights Reserved. +# ******************************************************************************* +# +# test4x.ucm +# +# Test file for MBCS conversion extension with four-byte codepage data. + +<code_set_name> "test4x" +<mb_cur_max> 4 +<mb_cur_min> 1 +<uconv_class> "MBCS" + +# test loading an extension table from the testdata package +<icu:base> "test4" + +CHARMAP +<U0009> \x09 |0 +END CHARMAP diff --git a/icuSources/test/testdata/testaliases.txt b/icuSources/test/testdata/testaliases.txt index 52cd58fc..a2720c3c 100644 --- a/icuSources/test/testdata/testaliases.txt +++ b/icuSources/test/testdata/testaliases.txt @@ -1,6 +1,6 @@ //******************************************************************************* //* -//* Copyright (C) 2002-2003, International Business Machines +//* Copyright (C) 2002-2004, International Business Machines //* Corporation and others. All Rights Reserved. //* //******************************************************************************* @@ -16,17 +16,19 @@ testaliases aab:alias { "testaliases/aaa" } // aliasing nonexist position - nonexisting:alias { "/ICUDATA/uk" } + nonexisting:alias { "/ICUDATA/ja" } // aliasing to another resource simplealias:alias { "testtypes/menu/file/open" } // simple referencing // alias that uses another alias and references parts of the end structure - referencingalias:alias { "testaliases/anotheralias/Sequence" } // Referencing through another alias - anotheralias:alias { "/ICUDATA/uk/CollationElements" } + referencingalias:alias { "testaliases/anotheralias/2" } // Referencing through another alias + anotheralias:alias { "/ICUDATA/ja/LocaleScript" } + + LocaleScript:alias { "/ICUDATA/ja/LocaleScript" } // aliasing using position - CollationElements:alias { "/ICUDATA/uk" } // Referencing corresponding resource in another bundle + BreakDictionaryData:alias { "/ICUDATA/th" } // Referencing corresponding resource in another bundle // aliasing arrays zoneTests { @@ -43,13 +45,13 @@ testaliases // WARNING: this test assumes that on all platforms digits sort normally // if not, the test may fail testGetStringByKeyAliasing { - KeyAlias0PST:alias { "/ICUDATA/en/zoneStrings/0/0" } //"PST", + KeyAlias0PST:alias { "/ICUDATA/en/zoneStrings/0/0" } //"America/Los_Angeles", KeyAlias1PacificStandardTime:alias { "/ICUDATA/en/zoneStrings/0/1" } //"Pacific Standard Time", KeyAlias2PDT:alias { "/ICUDATA/en/zoneStrings/0/4" } //"PDT", KeyAlias3LosAngeles:alias { "/ICUDATA/en/zoneStrings/0/5" } //"Los Angeles", } testGetStringByIndexAliasing { - :alias { "/ICUDATA/en/zoneStrings/0/0" } //"PST", + :alias { "/ICUDATA/en/zoneStrings/0/0" } //"America/Los_Angeles", :alias { "/ICUDATA/en/zoneStrings/0/1" } //"Pacific Standard Time", :alias { "/ICUDATA/en/zoneStrings/0/4" } //"PDT", :alias { "/ICUDATA/en/zoneStrings/0/5" } //"Los Angeles", diff --git a/icuSources/test/testdata/testdata.mak b/icuSources/test/testdata/testdata.mak new file mode 100644 index 00000000..dbe0f079 --- /dev/null +++ b/icuSources/test/testdata/testdata.mak @@ -0,0 +1,136 @@ +#********************************************************************** +#* Copyright (C) 1999-2004, International Business Machines Corporation +#* and others. All Rights Reserved. +#********************************************************************** +# +# 03/19/2001 weiv, schererm Created + +.SUFFIXES : .res .txt + +TESTPKG=testdata +TESTDT=$(TESTPKG)_ + + +ALL : "$(TESTDATAOUT)\testdata.dat" + @echo Test data is built. + +# icu26_testtypes.res is there for cintltst/udatatst.c/TestSwapData() +# I generated it with an ICU 2.6.1 build on Windows after removing +# testincludeUTF (which made it large, unnecessarily for this test) +# and CollationElements (which will not work with a newer swapper) +# markus 2003nov19 + +# icu26e_testtypes.res is the same, but icuswapped to big-endian EBCDIC +# markus 2003nov21 + +"$(TESTDATAOUT)\testdata.dat" : "$(TESTDATABLD)\casing.res" "$(TESTDATABLD)\conversion.res" "$(TESTDATABLD)\icuio.res" "$(TESTDATABLD)\mc.res" "$(TESTDATABLD)\structLocale.res" "$(TESTDATABLD)\root.res" "$(TESTDATABLD)\te.res" "$(TESTDATABLD)\te_IN.res" "$(TESTDATABLD)\testaliases.res" "$(TESTDATABLD)\testtypes.res" "$(TESTDATABLD)\testempty.res" "$(TESTDATABLD)\$(TESTDT)iscii.res" "$(TESTDATABLD)\$(TESTDT)idna_rules.res" "$(TESTDATABLD)\DataDrivenCollationTest.res" "$(TESTDATABLD)\$(TESTDT)test.icu" "$(TESTDATABLD)\$(TESTDT)testtable32.res" "$(TESTDATABLD)\$(TESTDT)test1.cnv" "$(TESTDATABLD)\$(TESTDT)test3.cnv" "$(TESTDATABLD)\$(TESTDT)test4.cnv" "$(TESTDATABLD)\$(TESTDT)test4x.cnv" "$(TESTDATABLD)\$(TESTDT)ibm9027.cnv" "$(TESTDATABLD)\$(TESTDT)nfscsi.spp" "$(TESTDATABLD)\$(TESTDT)nfscss.spp" "$(TESTDATABLD)\$(TESTDT)nfscis.spp" "$(TESTDATABLD)\$(TESTDT)nfsmxs.spp" "$(TESTDATABLD)\$(TESTDT)nfsmxp.spp" + @echo Building test data + @copy "$(TESTDATABLD)\$(TESTDT)te.res" "$(TESTDATAOUT)\$(TESTDT)nam.typ" + @copy "$(TESTDATA)\$(TESTDT)icu26_testtypes.res" "$(TESTDATABLD)" + @copy "$(TESTDATA)\$(TESTDT)icu26e_testtypes.res" "$(TESTDATABLD)" + @"$(ICUP)\bin\pkgdata" -f -v -m common -c -p"$(TESTPKG)" -d "$(TESTDATAOUT)" -T "$(TESTDATABLD)" -s "$(TESTDATABLD)" << +$(TESTDT)casing.res +$(TESTDT)conversion.res +$(TESTDT)mc.res +$(TESTDT)root.res +$(TESTDT)testtable32.res +$(TESTDT)te.res +$(TESTDT)te_IN.res +$(TESTDT)testtypes.res +$(TESTDT)icu26_testtypes.res +$(TESTDT)icu26e_testtypes.res +$(TESTDT)testempty.res +$(TESTDT)testaliases.res +$(TESTDT)structLocale.res +$(TESTDT)icuio.res +$(TESTDT)iscii.res +$(TESTDT)DataDrivenCollationTest.res +$(TESTDT)test.icu +$(TESTDT)test1.cnv +$(TESTDT)test3.cnv +$(TESTDT)test4.cnv +$(TESTDT)test4x.cnv +$(TESTDT)ibm9027.cnv +$(TESTDT)idna_rules.res +$(TESTDT)nfscsi.spp +$(TESTDT)nfscss.spp +$(TESTDT)nfscis.spp +$(TESTDT)nfsmxs.spp +$(TESTDT)nfsmxp.spp +<< + + +# Inference rule for creating resource bundles +# Some test data resource bundles are known to have warnings and bad data. +# The -q option is there on purpose, so we don't see it normally. +{$(TESTDATA)}.txt.res:: + @echo Making Test Resource Bundle files $< + @"$(ICUTOOLS)\genrb\$(CFG)\genrb" -t -p"$(TESTPKG)" -q -s"$(TESTDATA)" -d"$(TESTDATABLD)" $< + +"$(TESTDATABLD)\$(TESTDT)iscii.res": "$(TESTDATA)\iscii.bin" + @echo Making Test Resource Bundle file with encoding ISCII,version=0 + @"$(ICUTOOLS)\genrb\$(CFG)\genrb" -p"$(TESTPKG)" -q -s"$(TESTDATA)" -eISCII,version=0 -d"$(TESTDATABLD)" iscii.bin + +"$(TESTDATABLD)\$(TESTDT)idna_rules.res": "$(TESTDATA)\idna_rules.txt" + @echo Making Test Resource Bundle file for IDNA reference implementation + @"$(ICUTOOLS)\genrb\$(CFG)\genrb" -p"$(TESTPKG)" -q -s"$(TESTDATA)" -d"$(TESTDATABLD)" idna_rules.txt + + +"$(TESTDATABLD)\$(TESTDT)test.icu" : {"$(ICUTOOLS)\gentest\$(CFG)"}gentest.exe + "$(ICUTOOLS)\gentest\$(CFG)\gentest" -d"$(TESTDATABLD)" + +# testtable32 resource file +"$(TESTDATABLD)\testtable32.txt" : {"$(ICUTOOLS)\gentest\$(CFG)"}gentest.exe + "$(ICUTOOLS)\gentest\$(CFG)\gentest" -r -d"$(TESTDATABLD)" + +"$(TESTDATABLD)\$(TESTDT)testtable32.res": "$(TESTDATABLD)\testtable32.txt" + @echo Making Test Resource Bundle file for IDNA reference implementation + @"$(ICUTOOLS)\genrb\$(CFG)\genrb" -p"$(TESTPKG)" -q -s"$(TESTDATABLD)" -d"$(TESTDATABLD)" testtable32.txt + +# Targets for nfscsi.spp +"$(TESTDATABLD)\$(TESTDT)nfscsi.spp" : {"$(ICUTOOLS)\gensprep\$(CFG)"}gensprep.exe "$(TESTDATA)\nfs4_cs_prep_ci.txt" + @echo Building $@ + @"$(ICUTOOLS)\gensprep\$(CFG)\gensprep" -s "$(TESTDATA)" -d "$(TESTDATABLD)\\" -b nfscsi -p "$(TESTPKG)" -u 3.2.0 nfs4_cs_prep_ci.txt + +# Targets for nfscss.spp +"$(TESTDATABLD)\$(TESTDT)nfscss.spp" : {"$(ICUTOOLS)\gensprep\$(CFG)"}gensprep.exe "$(TESTDATA)\nfs4_cs_prep_cs.txt" + @echo Building $@ + @"$(ICUTOOLS)\gensprep\$(CFG)\gensprep" -s "$(TESTDATA)" -d "$(TESTDATABLD)\\" -b nfscss -p "$(TESTPKG)" -u 3.2.0 nfs4_cs_prep_cs.txt + +# Targets for nfscis.spp +"$(TESTDATABLD)\$(TESTDT)nfscis.spp" : {"$(ICUTOOLS)\gensprep\$(CFG)"}gensprep.exe "$(TESTDATA)\nfs4_cis_prep.txt" + @echo Building $@ + @"$(ICUTOOLS)\gensprep\$(CFG)\gensprep" -s "$(TESTDATA)" -d "$(TESTDATABLD)\\" -b nfscis -p "$(TESTPKG)" -u 3.2.0 -k -n "$(ICUTOOLS)\..\data\unidata" nfs4_cis_prep.txt + +# Targets for nfsmxs.spp +"$(TESTDATABLD)\$(TESTDT)nfsmxs.spp" : {"$(ICUTOOLS)\gensprep\$(CFG)"}gensprep.exe "$(TESTDATA)\nfs4_mixed_prep_s.txt" + @echo Building $@ + @"$(ICUTOOLS)\gensprep\$(CFG)\gensprep" -s "$(TESTDATA)" -d "$(TESTDATABLD)\\" -b nfsmxs -p "$(TESTPKG)" -u 3.2.0 -k -n "$(ICUTOOLS)\..\data\unidata" nfs4_mixed_prep_s.txt + +# Targets for nfsmxp.spp +"$(TESTDATABLD)\$(TESTDT)nfsmxp.spp" : {"$(ICUTOOLS)\gensprep\$(CFG)"}gensprep.exe "$(TESTDATA)\nfs4_mixed_prep_p.txt" + @echo Building $@ + @"$(ICUTOOLS)\gensprep\$(CFG)\gensprep" -s "$(TESTDATA)" -d "$(TESTDATABLD)\\" -b nfsmxp -p "$(TESTPKG)" -u 3.2.0 -k -n "$(ICUTOOLS)\..\data\unidata" nfs4_mixed_prep_p.txt + + +# Targets for test converter data +"$(TESTDATABLD)\$(TESTDT)test1.cnv": "$(TESTDATA)\test1.ucm" + @echo Building $@ + @"$(ICUTOOLS)\makeconv\$(CFG)\makeconv" -d"$(TESTDATABLD)" -p $(TESTPKG) $** + +"$(TESTDATABLD)\$(TESTDT)test3.cnv": "$(TESTDATA)\test3.ucm" + @echo Building $@ + @"$(ICUTOOLS)\makeconv\$(CFG)\makeconv" -d"$(TESTDATABLD)" -p $(TESTPKG) $** + +"$(TESTDATABLD)\$(TESTDT)test4.cnv": "$(TESTDATA)\test4.ucm" + @echo Building $@ + @"$(ICUTOOLS)\makeconv\$(CFG)\makeconv" -d"$(TESTDATABLD)" -p $(TESTPKG) $** + +"$(TESTDATABLD)\$(TESTDT)test4x.cnv": "$(TESTDATA)\test4x.ucm" + @echo Building $@ + @"$(ICUTOOLS)\makeconv\$(CFG)\makeconv" -d"$(TESTDATABLD)" -p $(TESTPKG) $** + +"$(TESTDATABLD)\$(TESTDT)ibm9027.cnv": "$(TESTDATA)\ibm9027.ucm" + @echo Building $@ + @"$(ICUTOOLS)\makeconv\$(CFG)\makeconv" -d"$(TESTDATABLD)" -p $(TESTPKG) $** + diff --git a/icuSources/test/testdata/testdata.mk b/icuSources/test/testdata/testdata.mk deleted file mode 100644 index 9cbee624..00000000 --- a/icuSources/test/testdata/testdata.mk +++ /dev/null @@ -1,73 +0,0 @@ -#********************************************************************** -#* Copyright (C) 1999-2003, International Business Machines Corporation -#* and others. All Rights Reserved. -#********************************************************************** -# -# 03/19/2001 weiv, schererm Created - -.SUFFIXES : .res .txt - -TESTPKG=testdata -TESTDT=$(TESTPKG)_ - - -ALL : "$(TESTDATAOUT)\testdata.dat" - @echo Test data is built. - -"$(TESTDATAOUT)\testdata.dat" : "$(TESTDATABLD)\casing.res" "$(TESTDATABLD)\mc.res" "$(TESTDATABLD)\root.res" "$(TESTDATABLD)\te.res" "$(TESTDATABLD)\te_IN.res" "$(TESTDATABLD)\testaliases.res" "$(TESTDATABLD)\testtypes.res" "$(TESTDATABLD)\testempty.res" "$(TESTDATABLD)\$(TESTDT)iscii.res" "$(TESTDATABLD)\$(TESTDT)idna_rules.res" "$(TESTDATABLD)\DataDrivenCollationTest.res" $(TESTDATABLD)\$(TESTDT)test.icu "$(TESTDATABLD)\$(TESTDT)test1.cnv" "$(TESTDATABLD)\$(TESTDT)test3.cnv" "$(TESTDATABLD)\$(TESTDT)test4.cnv" "$(TESTDATABLD)\$(TESTDT)ibm9027.cnv" - @echo Building test data - @copy "$(TESTDATABLD)\$(TESTDT)te.res" "$(TESTDATAOUT)\$(TESTDT)nam.typ" - @"$(ICUTOOLS)\pkgdata\$(CFG)\pkgdata" -f -v -m common -c -p"$(TESTPKG)" -O "$(PKGOPT)" -d "$(TESTDATAOUT)" -T "$(TESTDATABLD)" -s "$(TESTDATABLD)" << -$(TESTDT)casing.res -$(TESTDT)mc.res -$(TESTDT)root.res -$(TESTDT)te.res -$(TESTDT)te_IN.res -$(TESTDT)testtypes.res -$(TESTDT)testempty.res -$(TESTDT)testaliases.res -$(TESTDT)iscii.res -$(TESTDT)DataDrivenCollationTest.res -$(TESTDT)test.icu -$(TESTDT)test1.cnv -$(TESTDT)test3.cnv -$(TESTDT)test4.cnv -$(TESTDT)ibm9027.cnv -$(TESTDT)idna_rules.res -<< - - -# Inference rule for creating resource bundles -# Some test data resource bundles are known to have warnings and bad data. -# The -q option is there on purpose, so we don't see it normally. -{$(TESTDATA)}.txt.res:: - @echo Making Test Resource Bundle files $< - @"$(ICUTOOLS)\genrb\$(CFG)\genrb" -t -p"$(TESTPKG)" -q -s"$(TESTDATA)" -d"$(TESTDATABLD)" $< - -"$(TESTDATABLD)\$(TESTDT)iscii.res": "$(TESTDATA)\iscii.bin" - @echo Making Test Resource Bundle file with encoding ISCII,version=0 - @"$(ICUTOOLS)\genrb\$(CFG)\genrb" -p"$(TESTPKG)" -q -s"$(TESTDATA)" -eISCII,version=0 -d"$(TESTDATABLD)" iscii.bin - -"$(TESTDATABLD)\$(TESTDT)idna_rules.res": "$(TESTDATA)\idna_rules.txt" - @echo Making Test Resource Bundle file for IDNA reference implementation - @"$(ICUTOOLS)\genrb\$(CFG)\genrb" -p"$(TESTPKG)" -q -s"$(TESTDATA)" -d"$(TESTDATABLD)" idna_rules.txt - - -$(TESTDATABLD)\$(TESTDT)test.icu : {"$(ICUTOOLS)\gentest\$(CFG)"}gentest.exe - "$(ICUTOOLS)\gentest\$(CFG)\gentest" -d"$(TESTDATABLD)" - - - -# Targets for test converter data -"$(TESTDATABLD)\$(TESTDT)test1.cnv": "$(TESTDATA)\test1.ucm" - @"$(ICUTOOLS)\makeconv\$(CFG)\makeconv" -d"$(TESTDATABLD)" -p $(TESTPKG) $** - -"$(TESTDATABLD)\$(TESTDT)test3.cnv": "$(TESTDATA)\test3.ucm" - @"$(ICUTOOLS)\makeconv\$(CFG)\makeconv" -d"$(TESTDATABLD)" -p $(TESTPKG) $** - -"$(TESTDATABLD)\$(TESTDT)test4.cnv": "$(TESTDATA)\test4.ucm" - @"$(ICUTOOLS)\makeconv\$(CFG)\makeconv" -d"$(TESTDATABLD)" -p $(TESTPKG) $** - -"$(TESTDATABLD)\$(TESTDT)ibm9027.cnv": "$(TESTDATA)\ibm9027.ucm" - @"$(ICUTOOLS)\makeconv\$(CFG)\makeconv" -d"$(TESTDATABLD)" -p $(TESTPKG) $** - diff --git a/icuSources/test/testdata/testdata_icu26_testtypes.res b/icuSources/test/testdata/testdata_icu26_testtypes.res new file mode 100644 index 0000000000000000000000000000000000000000..d7747ce691cd8f8e44967de5b1455fc4dc104864 GIT binary patch literal 13944 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 Q`&%5pLFJ!uY#b8#A1oGAVgLXD literal 0 HcmV?d00001 diff --git a/icuSources/test/testdata/testdata_icu26e_testtypes.res b/icuSources/test/testdata/testdata_icu26e_testtypes.res new file mode 100644 index 0000000000000000000000000000000000000000..89acde07914a257824607a389b7cdc9e182c5026 GIT binary patch literal 13944 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 literal 0 HcmV?d00001 diff --git a/icuSources/test/testdata/testtypes.txt b/icuSources/test/testdata/testtypes.txt index 454e843d..df5b4627 100644 --- a/icuSources/test/testdata/testtypes.txt +++ b/icuSources/test/testdata/testtypes.txt @@ -33,16 +33,18 @@ testtypes // genrb just includes the test as a string after converting to UTF-16 - testincludeUTF:include{ "th18057.txt" } + testincludeUTF:include{ "riwords.txt" } // No unescaping is done. testinclude:include{ "translit_rules.txt" } // Genrb failed parsing \u0075 sequence this tests it - CollationElements{ + collations { + standard { Version{"x01"} Sequence{ "&'\u0075' = '\uFF55'" // LATIN SMALL LETTER U } + } } string{ } diff --git a/icuSources/test/testdata/th18057.txt b/icuSources/test/testdata/th18057.txt deleted file mode 100644 index 4be387d8..00000000 --- a/icuSources/test/testdata/th18057.txt +++ /dev/null @@ -1,17919 +0,0 @@ -#******************************************************************************* -#* -#* Copyright (C) 1998-2001, International Business Machines -#* Corporation and others. All Rights Reserved. -#* -#******************************************************************************* - -# -# @(#)$RCSfile: th18057.txt,v $ $Revision: 1.1.1.1 $ $Date: 2003/02/05 21:32:03 $ -# -# Sorted Thai word list used for testing the ThaiCollator class. -# This list was taken from the Web: <http://seasrc.th.net/dict/dict.htm> -# and some obvious garbage lines (nulls, etc) were deleted -# -# Lines starting with '#' are ignored; others are treated as single words -# in the UTF-8 encoding. -# -# [12/15/99 aliu] recoded from TIS-620 to UTF-8 -# -ก -ก็ -กก -ก๊ก -กกขนาก -กกัณฏกะ -กกุฏ -กกุท -กกุธภัณฑ์ -กกุสันโธ -กง -ก่ง -ก้ง -ก๊ง -กงกอน -กงการ -กงโก้ -ก้งโค้ง -ก้งง -กงฉาก -กงไฉ่ -กงเต็ก -กงสี -กงสุล -กช -กชกร -กฎุมพี -กฏ -กฏหมาย -กฏะ -กฏาหะ -กฏิ -กฏุก -กฐิน -กฐินกาล -กฐินต้น -กฐินทาน -กฐินราษฎร์ -กฐินหลวง -กฐินัตถารกรรม -กฐินุทธาระ -กณิกนันต์ -กณิการ์ -กเณรุ -กเณรุกา -กด -กดคัง -กดแดง -กดทะเล -กดโป๊ะ -กดหัวโต -กดเหลือง -กตญาณ -กตมาลี -กตเวทิตา -กตเวที -กตัญชลี -กตัญญุตา -กตัญญู -กตาธิการ -กตาภินิหาร -กติกา -กถา -กถิก -กถิกาจารย์ -กทรรป -กทลิมฤค -กทลี -กน -ก่น -ก้น -กนก -กนน -กนนเชอ -ก่นนโถง -กนนเหิม -กนิษฐ์ -กนิษฐา -กบ -กบฏ -กบดาน -กบดำกบแดง -กบทู -กบาล -กบินทร์ -กบิล -กบิลพัสดุ์ -กบี่ -กบูร -กเบนทร์ -กโบร -กโบล -กปณ -กปณก -กปณา -กปิ -กปิตัน -กม -ก้ม -กมณฑลาภิเษก -กมณฑโลทก -กมล -กมลขัณฑ์ -กมลครรภ์ -กมลฉันท์ -กมลพานธพ -กมลา -กมลาศ -กมลาสน์ -กมเลศ -กมัณฑลุ -กมุท -กร -กรก -กรกฎ -กรกฎาคม -กรง -กรชกาย -กรณฑ์ -กรณิการ์ -กรณี -กรณีย์ -กรณียะ -กรด -กรน -กรนทา -กรนนเช้า -กรบ -กรบูร -กรพินธุ์ -กรภก -กรภิน -กรภีร์ -กรภุม -กรม -กรมกรอม -กรมการ -กรมการพิเศษ -กรมเกรียม -กรมขุน -กรมชะแม่ -กรมท่า -กรมท่ากลาง -กรมท่าขวา -กรมท่าซ้าย -กรมธรรม์ -กรมนครบาล -กรมนา -กรมพระ -กรมพระกลาโหม -กรมพระยา -กรมมหาดไทย -กรมเมือง -กรมวัง -กรมศักดิ -กรมสมเด็จ -กรมหมื่น -กรมหลวง -กรมัฏฏ์ -กรร -กรรไกร -กรรเจียก -กรรชิง -กรรชิด -กรรเชอ -กรรเช้า -กรรเชียง -กรรโชก -กรรซ้นน -กรรแซง -กรรฐ์ -กรรฐา -กรรณ -กรรณิการ์ -กรรดิ -กรรดิก -กรรดึก -กรรตุ -กรรไตร -กรรทบ -กรรแทก -กรรแทรก -กรรบาสิก -กรรบิด -กรรบูร -กรรปาสิก -กรรปุระ -กรรพุม -กรรพุ่ม -กรรภิรมย์ -กรรม -กรรม์ -กรรมาชีพ -กรรมาธิการ -กรรมาร -กรรลี -กรรลึง -กรรษก -กรรสะ -กรรแสง -กรรหาย -กรรเหิม -กรรโหย -กรรเอา -กรรุณา -กรวด -กรวน -กรวบ -กรวม -กร้วม -กรวย -กรวิก -กรสาปน์ -กรสุทธิ์ -กรอ -กร้อ -กรอก -กร็อกกร๋อย -กรอกแกรก -กรอง -กรองกรอย -กรอด -กร่อน -กรอบ -กรอม -กร่อม -กร่อย -กระ -กระกร -กระกรับกระเกรียบ -กระกรี๊ด -กระกรุ่น -กระกลับกลอก -กระกวด -กระกอง -กระกัด -กระกี้ -กระกูล -กระเกรอก -กระเกริก -กระเกริ่น -กระเกรียบ -กระเกรียม -กระเกรียว -กระเกรี้ยว -กระเกลือก -กระคน -กระคาย -กระคุก -กระงกกระงัน -กระงกกระเงิ่น -กระง่องกระแง่ง -กระงอด -กระง่อนกระแง่น -กระโงก -กระจก -กระจง -กระจร -กระจอก -กระจองหง่อง -กระจองอแง -กระจ้อน -กระจอนหู -กระจ้อย -กระจ๋อหวอ -กระจะ -กระจัก -กระจัง -กระจังหลังเบี้ย -กระจัด -กระจับ -กระจับปิ้ง -กระจับปี่ -กระจ่า -กระจ่าง -กระจาด -กระจาน -กระจาบ -กระจาม -กระจาย -กระจาว -กระจิก -กระจิ๋ง -กระจิด -กระจิบ -กระจิ๋ม -กระจิริด -กระจิ๋ว -กระจี้ -กระจี๋ -กระจุก -กระจุ๋งกระจิ๋ง -กระจุบ -กระจุ๊บ -กระจุบกระจิบ -กระจุ๋มกระจิ๋ม -กระจุย -กระจู้ -กระจู๋กระจี๋ -กระจูด -กระเจอะกระเจิง -กระเจา -กระเจ่า -กระเจ้า -กระเจาะ -กระเจิง -กระเจิดกระเจิง -กระเจี้ยง -กระเจี๊ยบ -กระเจียว -กระเจี๊ยว -กระแจะ -กระโจน -กระโจม -กระฉง -กระฉอก -กระฉ่อน -กระฉับกระเฉง -กระฉิ่ง -กระฉีก -กระฉุก -กระฉูด -กระเฉก -กระเฉง -กระเฉด -กระแฉก -กระแฉ่น -กระโฉกกระเฉก -กระโฉม -กระชง -กระชดกระช้อย -กระชวย -กระชอก -กระชอน -กระชอม -กระชอมดอก -กระช้อย -กระช้อยนางรำ -กระชัง -กระชั้น -กระชับ -กระชาก -กระช่าง -กระชาเดิม -กระชาย -กระชิง -กระชิด -กระชุ -กระชุก -กระชุ่มกระชวย -กระเชอ -กระเชา -กระเช้า -กระเชียง -กระแชง -กระแชะ -กระโชก -กระซวย -กระซ้อ -กระซ่องกระแซ่ง -กระซับ -กระซับปากเรือ -กระซ่าง -กระซาบ -กระซิก -กระซิบ -กระซี้ -กระซี้กระซ้อ -กระซุง -กระซุบกระซิบ -กระซุ้ม -กระซู่ -กระเซ -กระเซ็น -กระเซอ -กระเซอะกระเซอ -กระเซอะกระเซิง -กระเซ้า -กระเซิง -กระแซ -กระแซะ -กระโซกระเซ -กระฎี -กระฎุมพี -กระดก -กระด้ง -กระดนโด่ -กระดวง -กระดวน -กระด้วมกระเดี้ยม -กระดอ -กระดอง -กระดองหาย -กระดอน -กระดอม -กระดักกระเดี้ย -กระดังงัว -กระดังงา -กระดาก -กระด้าง -กระดางลาง -กระดาด -กระดาดขาว -กระดาน -กระดาษ -กระดาษเทศ -กระดำกระด่าง -กระดิก -กระดิ่ง -กระดิ้ง -กระดิ่งทอง -กระดิบๆ -กระดี่ -กระดี้กระเดียม -กระดี่หม้อ -กระดึง -กระดืบ -กระดุ -กระดุกกระดิก -กระดุ้งกระดิ้ง -กระดุบๆ -กระดุบกระดิบ -กระดุม -กระดูก -กระเด้ง -กระเด็น -กระเด้า -กระเดาะ -กระเดิด -กระเดี้ย -กระเดียด -กระเดียม -กระเดี้ยม -กระเดือก -กระเดื่อง -กระแด็กๆ -กระแด้ง -กระแด้แร่ -กระแด่วๆ -กระแดะ -กระโดก -กระโดง -กระโดงแดง -กระโดด -กระโดน -กระใด -กระได -กระตรกกระตรำ -กระตร้อ -กระตรับ -กระตราก -กระตรำ -กระตรุด -กระตรุม -กระต้วมกระเตี้ยม -กระต้อ -กระต่องกระแต่ง -กระต๊อบ -กระต่อม { กฺระต่อม } -กระต้อยตีวิด -กระตัก -กระตั้ว -กระตาก -กระต๊าก -กระต่าย -กระติก -กระติ้ง -กระติ๊ด -กระติบ -กระตือรือร้น -กระตุก -กระตุกกระติก -กระตุ้งกระติ้ง -กระตุ่น -กระตุ้น -กระตูบ -กระเตง -กระเต็น -กระเตอะ -กระเต่า -กระเตาะ -กระเตาะกระแตะ -กระเตี้ยม -กระเตื้อง -กระแต -กระแต่ง -กระแตแต้แว้ด -กระแตวับ -กระแตะ -กระโตกกระตาก -กระโตน -กระไตร -กระถด -กระถอบ -กระถั่ว -กระถาง -กระถิก -กระถิน -กระถึก -กระเถิบ -กระโถน -กระทก -กระทง -กระทงลาย -กระทด -กระทบ -กระทรวง -กระทวย { กฺระทวย } -กระทอก -กระท้อน -กระท่อนกระแท่น -กระท่อม -กระท้อมกระแท้ม -กระทะ -กระทั่ง -กระทั่งติด -กระทัน -กระทั้น -กระทา -กระทาชาย -กระทาย -กระทายเหิน -กระทาสี -กระทาหอง -กระทำ -กระทิกกระทวย -กระทิง -กระทึง -กระทืบ -กระทุ -กระทุง -กระทุ้ง -กระทุงลาย -กระทุงหมาบ้า -กระทุงเหว -กระทุ่ม -กระทุ่มขี้หมู -กระทุ่มนา -กระทุ่มหมู -กระทู้ -กระเท่ -กระเทียบ -กระเทียม -กระเทือน -กระเทื้อม -กระแทก -กระแท่น -กระแท้ม -กระแทะ -กระไทชาย -กระนก -กระน่อง -กระนั้น -กระนี้ -กระโน้น -กระไน -กระบก -กระบกคาย -กระบถ -กระบวน -กระบวย -กระบวร -กระบอก -กระบอกเสียง -กระบอง -กระบองกัน -กระบองเพชร -กระบองราหู -กระบะ -กระบัด -กระบั้วกระเบี้ย -กระบ่า -กระบ้า -กระบาก -กระบาย -กระบาล { กฺระบาน } -กระบิ -กระบิ้ง -กระบิด -กระบิล -กระบี่ -กระบือ -กระบุง -กระบุม -กระบุ่มกระบ่าม -กระบู้กระบี้ -กระบูน -กระบูร -กระเบง -กระเบญ -กระเบ็ดกระบวน -กระเบน -กระเบา -กระเบิก -กระเบี้ย -กระเบียด -กระเบียน -กระเบื้อง -กระเบื้องถ้วย -กระแบ่ -กระแบก -กระแบกงา -กระแบะ -กระโบม -กระปมกระปำ -กระปมกระเปา -กระปรอก -กระปรอกว่าว -กระปรี้กระเปร่า -กระปอก -กระป้อกระแป้ -กระป่อง -กระป๋อง -กระปอดกระแปด -กระป๋อหลอ -กระปั้วกระเปี้ย -กระป่ำ -กระปิ่ม -กระปุก -กระปุ่ม -กระปุ่มกระป่ำ -กระปุ่มกระปิ่ม -กระเปา -กระเป๋า -กระเปาะ -กระเปี้ย { กฺระเปี้ย } -กระแป้ -กระแปด -กระโปก -กระโปรง -กระโปรงทอง -กระผม -กระผลาม -กระผลีกระผลาม -กระผาน -กระผีก -กระพรวน -กระพริ้ม -กระพอก -กระพอกวัว -กระพอง -กระพ้อม -กระพัก -กระพัง -กระพังเหิร -กระพังโหม -กระพัด -กระพัดแม่ม่าย -กระพัตร -กระพัน -กระพั่น -กระพา -กระพาก { กฺระพาก } -กระพี้ -กระพือ -กระพุ้ง -กระพุ่ม -กระเพลิศ -กระเพาะ -กระเพาะปลา -กระเพิง -กระเพื่อม -กระแพง -กระแพ้ง -กระฟัดกระเฟียด -กระฟาย -กระฟูมกระฟาย -กระเฟียด -กระมล -กระมอบ -กระมอมกระแมม -กระมัง -กระมัน -กระมิดกระเมี้ยน -กระมึน -กระมุท -กระเมาะ -กระเมี้ยน -กระแมม -กระย่อง -กระย่องกระแย่ง -กระย่อน -กระย่อม -กระยา -กระยาง -กระยาจก -กระยาด -กระยาหงัน -กระยิก -กระยิ้มกระย่อง -กระยึกกระยือ -กระยึดกระยาด -กระเย้อกระแหย่ง -กระแย่ง -กระรอก -กระรอกน้ำข้าว -กระเรียน -กระโรกน้ำข้าว -กระโรกใหญ่ -กระไร -กระลด -กระลบ -กระลอก -กระลอม -กระละหล่ำ -กระลัด -กระลับ -กระลัมพร -กระลา -กระลาการ -กระลายกระลอก -กระลำ -กระลำพร -กระลำพัก -กระลำพุก -กระลิง -กระลี -กระลึง -กระลุมพาง -กระลุมพุก -กระลุมพู -กระลูน -กระลู่น์ -กระเล็น -กระเลียด -กระเลือก -กระโลง -กระวน -กระวัด -กระว่า -กระวาด -กระวาน -กระวาย -กระวิน -กระวี -กระวีกระวาด -กระวูดกระวาด -กระเวน -กระเวยกระวาย -กระแวน -กระโวยกระวาย -กระศก -กระศัย -กระษัตริย์ -กระษัตรี -กระษัย -กระษาปณ์ -กระษิร -กระเษม -กระเษียร -กระสง -กระสน -กระสบ -กระสม -กระสรวล -กระสร้อย -กระสวน -กระสวย -กระสอบ -กระสะ -กระสัง -กระสัน -กระสับกระส่าย -กระสา -กระสานติ์ -กระสาบ -กระสาย -กระส่าย -กระสินธุ -กระสือ -กระสุงกระสิง -กระสุน -กระสูทธิ์ -กระสูบ -กระเสด -กระเส็นกระสาย -กระเส่า -กระเสาะกระแสะ -กระเสียน -กระเสียร -กระเสือกกระสน -กระแส -กระแสง -กระแสะ { กฺระแสะ } -กระโสง -กระไส -กระหง่อง -กระหน -กระหนก -กระหนกกินรี -กระหนกนฤมิต -กระหนกนารี -กระหน่อง -กระหนาก -กระหน่ำ -กระหมวด -กระหมอบ -กระหม่อม -กระหมั่ง -กระหม่า -กระหมิด -กระหมิบ -กระหมุดกระหมิด -กระหมุ่น -กระหมุบ -กระหย่ง -กระหยด -กระหยบ -กระหย่อน -กระหย่อม -กระหยะ -กระหยัง -กระหยับ -กระหยิ่ม -กระหรอด -กระหริ่ง -กระหวน -กระหวัด -กระหวัดเกล้า -กระหว่า -กระหอง -กระหัง -กระหัด -กระหาง { กฺระหาง } -กระหาย -กระหึม -กระหึ่ม -กระหืดกระหอบ -กระเห็น -กระเหน็จ -กระเหนียด -กระเหม็ดกระเหมียด -กระเหม็ดกระแหม่ -กระเหม่น -กระเหม่า -กระเหลียก -กระเหว่า -กระเห่อ -กระเหิม -กระเหี้ยนกระหือรือ -กระแหทอง -กระแหน -กระแหน่ -กระแหนบ -กระแหนะ -กระแหมบ -กระแหม่ว -กระแหย่ง -กระแหร่ม -กระแหล่ง -กระโห้ -กระโหนด -กระโหม -กระโหย -กระโหย่ง -กระอ่วน -กระอวล -กระอ้อกระแอ้ -กระออดกระแอด -กระออบ -กระออม -กระอ้อมกระแอ้ม -กระออมน้ำ -กระอัก -กระอักกระอ่วน -กระอักกระไอ -กระอั้วแทงควาย -กระอ้า -กระอาน -กระอิด -กระอิดกระเอื้อน -กระอึก -กระอึกกระอัก -กระอึด -กระอืด -กระอุ -กระอุก -กระเอบ -กระเอา -กระเอิก -กระเอิบ -กระแอ้ -กระแอก -กระแอด -กระแอบ -กระแอม -กระแอ้ม -กระไอ -กรัก -กรักขี -กรัง -กรัชกาย -กรัณฑ์ -กรัณย์ -กรัน -กรับ -กรัม -กราก -กราง -กร่าง -กราด -กราดเกรี้ยว -กราดวง -กราน -กร้าน -กราบ -กราฟ -กราม -กรามพลู -กราย -กร่าย -กราล -กราว -กร้าว -กราวด่าง -กราวรูด -กราสิก -กรำ -กร่ำ -กร่ำกรุ่น -กริก -กริ๊ก -กริกกริว -กริกกรี -กริ่ง -กริ๊ง -กริงกริว -กริ้งกริ้ว -กริช -กริณี -กริตย -กริน -กรินี -กริบ -กริม -กริ่ม -กริยา -กริว -กริ้ว -กรี -กรีฑา -กรีด -กรี๊ด -กรีธา -กรีษ -กรีส -กรึง -กรุ -กรุก -กรุกกรู๊ -กรุง -กรุ้งกริ่ง -กรุงเขมา -กรุงพาลี -กรุณ -กรุณา -กรุน -กรุ่น -กรุบ -กรุ่ม -กรุ้มกริ่ม -กรุย -กรุยเกรียว -กรู -กรูด -กรูม -กเรณุ -กเรนทร -กเรนทร์ -กฤช -กฤดยาเกียรณ -กฤดา -กฤดาการ -กฤดาอัญชลี -กฤดิ -กฤดีกา -กฤต -กฤตกา -กฤตยฎีกา -กฤติกา -กฤศ -กฤโศทร -กฤษฎา -กฤษฎาญ -กฤษฎาญชลิต -กฤษฎาญชลี -กฤษฎาญชวลิตวา -กฤษฎาญชวลิศ -กฤษฎาญชวเลศ -กฤษฎาญชุลี -กฤษฎาธาร -กฤษฎี -กฤษฎีกา -กฤษณ -กฤษณา -กฤษาณ -กฤษิ -กล -กลด -กล่น -กลบ -กลบท -กลม -กลมภ -กลเม็ด -กลยุทธ์ -กลละ -กลวง -กลวม -กล้วย -กล้วยน้อย -กล้วยไม้ -กล้วยหมูสัง -กลวิธี -กลศ -กลศาสตร์ -กลศึก -กลหาย -กลเหย -กล้อ -กลอก -กลอง -กล่อง -กล้อง -กล้องแกล้ง -กลอน -กล่อน -กล้อน -กล่อม -กล้อมแกล้ม -กลอย -กลัก -กลัง -กลัด -กลั่น -กลั้น -กลันท -กลันทก์ -กลันทกนิวาปสถาน -กลับ -กลัมพก -กลัมพร -กลัมพัก -กลัว -กลั้ว -กลา -กล่า -กล้า -กลาก -กลากลาด -กลาง -กลาเซียร์ -กลาด -กลาบาต -กลาป -กล้าม -กลาย -กล้าย -กลายกลอก -กล่าว -กลาโหม -กล่ำ -กล้ำ -กลิ -กลิกาล -กลิกุญจิกา -กลิ่ง -กลิ้ง -กลิ้งกลางดง -กลิงค์ -กลิ่น -กลิปรีย์ -กลิ้ม -กลิยุค -กลี -กลี่ -กลีเซอรีน -กลีบ -กลึง -กลึ้ง -กลึงกล่อม -กลึงค์ -กลืน -กลุ่ม -กลุ้ม -กลู่ -กลูโคส -กลูน -กลูน์ -กเลวระ -กวด -กวน -ก๊วน -กวนอิม -กวม -กวย -กวยจั๊บ -กวยจี๊ -ก๋วยเตี๋ยว -ก๋วยสลาก -กวฬิงการาหาร -กวะ -กวะกวัก -กวะแกว่ง -กวัก -กวัด -กวา -กว่า -กว้า -กวาง -กว่าง -กว้าง -กวางเขน -กวางโจน -กว่างชน -กวางชะมด -กว่างโซ้ง -กวางตุ้ง -กวางทอง -กวางป่า -กวางม้า -กวาด -กวาน -กว่าน -กว้าน -กว๊าน -กว้าว -กวาวเครือ -กวิน -กวี -กษณะ -กษมา -กษัตร -กษัตรา -กษัตริย์ -กษัตรี -กษัตรีย์ -กษัตรีศูร -กษัย -กษัยการ -กษาปณ์ -กษาย -กษิดิ -กษิดินทร -กษิดินทร์ -กษีณาศรพ -กษีดิ -กษีร -กษีรามพุ -กษีรารณพ -กษุธา -กษุรี -กสานติ์ -กสิ -กสิณ -กห -กหังปายา -กหาปณะ -กเฬวราก -กอ -ก่อ -ก้อ -ก๊อ -กอก -ก๊อก -กอแก -กอง -ก่อง -ก้อง -กองกอย -กอซ -กอด -ก่อน -ก้อน -กอบ -กอบนาง -ก๊อบปี้ -กอปร -ก้อม -กอมก้อ -ก่อมก้อ -ก้อมก้อ -กอย -ก้อย -ก๋อย -กอริลลา -กอล์ฟ -กอแหละ -กอเอี๊ยะ -กะ -กะกร่อม -กะกร้าว -กะกลิ้ง -กะก่อง -กะกัง -กะกึก -กะเกาะ -กะโกระ -กะง้อนกะแง้น -กะจัง -กะจั๊ว -กะแจะ -กะชะ -กะชัง -กะชามาศ -กะชิง -กะชึ่กกะชั่ก -กะแช่ -กะซวก -กะซ้าหอย -กะซี่ -กะซี้ -กะโซ่ -กะโซ้ -กะดก -กะดง -กะดวน -กะดอกๆ -กะดะ -กะดังบาย -กะดัด -กะด้าง -กะดำกะด่าง -กะดี -กะดี่ -กะดุ้ง -กะเด้ -กะเดก -กะเดี๋ยว -กะได -กะตรุด -กะตอก -กะต่อย -กะตัก -กะตัง -กะตังกะติ้ว -กะตังใบ -กะต่า -กะต๊าก -กะต้ำ -กะติ๊กริก -กะติงกะแตง -กะตีบ -กะตึงกะแตง -กะตุ๊ก -กะตุด -กะตุมู -กะตูก -กะตู้วู้ -กะเตก -กะเตงๆ -กะเตงเรง -กะแตว -กะแต่ว -กะโต๊ก -กะโตกกะตาก -กะโตงกะเตง -กะโต้งโห่ง -กะถัว -กะทกรก -กะทอ -กะทัง -กะทัดรัด -กะทัน -กะทันหัน -กะทับ -กะทำ -กะทิ -กะทือ -กะทุน -กะทู้เจ็ดตัว -กะเทย -กะเท่เร่ -กะเทาะ -กะแท้ -กะแท่ง -กะแทน -กะนวล -กะนัด -กะบอง -กะบอนกะบึง -กะบ่อนกะแบ่น -กะบัง -กะบั้ง -กะบังรังเฝือก -กะบิ -กะบิ้ง -กะบิล -กะบึงกะบอน -กะบุด -กะเบ้อ -กะเบียน -กะเบือ -กะแบง -กะปริดกะปรอย -กะปริบ -กะปลกกะเปลี้ย -กะปวกกะเปียก -กะปอม -กะปอมขาง -กะปะ -กะปั่น -กะป้ำกะเป๋อ -กะปิ -กะปู -กะปูด -กะปูดหลูด -กะเปะ -กะเปา -กะเปิ๊บกะป๊าบ -กะเปียด -กะแป้น -กะแปะ -กะโปรง -กะโปโล -กะผลึกกะผลาม -กะผลุบกะโผล่ -กะเผ่น -กะเผลก -กะโผลกกะเผลก -กะพง -กะพรวดกะพราด -กะพร่องกะแพร่ง -กะพริบ -กะพรุน -กะพรูดกะพราด -กะพล้อ -กะพล่องกะแพล่ง -กะพ้อ -กะพอก -กะพอง -กะพัง -กะเพรา -กะเพียด -กะเพียดช้าง -กะเพียดหนู -กะมิดกะเมี้ยน -กะมูติง -กะเม็ง -กะเมีย -กะยาหงัน -กะยึกกะยือ -กะยุ -กะร่องกะแร่ง -กะระตะ -กะระหนะ -กะรัง -กะรัต -กะราง -กะริง -กะริงกะเรียด -กะรุงกะรัง -กะรุ่งกะริ่ง -กะรุน -กะเร -กะเรกะร่อน -กะเร่กะร่อน -กะเร่อ -กะเรี่ยกะราด -กะโรกะเร -กะลวย -กะลอ -กะล่อกะแล่ -กะลอจี๊ -กะล่อน -กะล่อมกะแล่ม -กะล่อยกะหลิบ -กะละปังหา -กะละมัง -กะละแม -กะละออม -กะลังตังไก่ -กะลัน -กะลันทา -กะลา -กะลาง -กะลาสี -กะลาหนา -กะลำพอ -กะลำพัก -กะลำเพาะ -กะลิง -กะลิ้มกะเหลี่ย -กะลิอ่อง -กะลุมพี -กะเล็ง -กะเล่อกะล่า -กะเลิด -กะเลียว -กะแล -กะโล่ -กะโลง -กะวอกกะแวก -กะวะ -กะส้มชื่น -กะส้าหอย -กะหนอกะแหน -กะหน็องกะแหน็ง -กะหนะ -กะหนุงกะหนิง -กะหมอก -กะหร่อง -กะหรอด -กะหร็อมกะแหร็ม -กะหรัดกะตีกา -กะหรัดตะปาตี -กะหร่าง -กะหราน -กะหริ่ง -กะหรี่ -กะหรี่ปั๊บ -กะหลับกะเหลือก -กะหลาป๋า -กะหล่ำ -กะหลี่ -กะหลีกะหลอ -กะหลุกกะหลิก -กะหำ -กะหึม -กะหืดกะหอบ -กะหือ -กะหูด -กะเหน็ด -กะเหรี่ยง -กะเหลาะเปาะ -กะเหวียก -กะแห -กะแหน่ -กะแหนะ -กะแหยก -กะแหะ -กะโห้ -กะโหลก -กะโหล้ง -กะไหล่ -กะอวม -กะอ้อกะแอ้ -กะออม -กะอ้อมกะแอ้ม -กะอัก -กะอักกะไอ -กะอาน -กะอาม -กะอิด -กะอุบ -กะแอ -กะแอก -กะแอน -กะแอบ -กะแอม -กะแอว -กัก -กั๊ก -กั้กๆ -กักกรา -กักกสะ -กักกะ -กักการี -กักการุ -กักขฬะ -กักษันตรัง -กัง -กั้ง -กังก -กั้งกระดาน -กังก้า -กังเกียง -กังขา -กังขาวิตรณวิสุทธิ -กังคุ -กังฉิน -กังฟู -กังวล -กังวาน -กังเวียน -กังส -กังสดาล -กังไส -กังหัน -กัจฉปะ -กัจฉะ -กัจฉา -กัจฉุ -กัจโฉทก -กัญ -กัญจุก -กัญจุการา -กัญชา -กัญญา -กัญฐกะ -กัฐ -กัณฏกะ -กัณฐก -กัณฐัศ -กัณฐัศว์ -กัณฐา -กัณฐี -กัณฑ์ -กัณฑมานวก -กัณฑรา -กัณฑุ -กัณฑูวนะ -กัณณ์ -กัณห -กัด -กัตติกมาส -กัตติกา -กัตติเกยา -กัตรทัณฑ์ -กัตรา -กัทลี -กัน -กั่น -กั้น -กันเกรา -กันไกร -กันชิง -กันเชอ -กั้นซู่ -กันแซง -กันดอง -กันดาร -กันดาล -กันได -กันต์ -กันตัง -กันไตร -กันทร -กันทรากร -กันทะ -กั้นบัง -กันภัย -กันภิรมย์ -กันเมียง -กันย์ -กันยา -กันลง -กันลอง -กันลึง -กันแสง -กั้นหยั่น -กันเอา -กับ -กับแก้ -กับแกล้ม -กับบุเรศ -กัป -กัปตัน -กัปนก -กัปบาสิก -กัปปาสิก -กัปปิยะ -กัปปีย์ -กัมบน -กัมปนาการ -กัมปนาท -กัมปนี -กัมประโด -กัมปี -กัมพล -กัมพุช -กัมพุชพากย์ -กัมพู -กัมพูชา -กัมโพช -กัมมสัทธา -กัมมัชวาต -กัมมัฏฐาน -กัมมันตภาพรังสี -กัมมันตรังสี -กัมมัสสกตา -กัมมาร -กัมลาศ -กัยวิกัย -กัลชาญ -กัลบก -กัลป์ -กัลปนา -กัลปังหา -กัลปาวสาน -กัลปิต -กัลพุม -กัลเม็ด -กัลยา -กัลยาณมิตร -กัลยาณี -กัลเว้า -กัลหาย -กัลโหย -กัลออม -กัลเอา -กัศมล -กัศยป -กัษณ -กา -ก๋า -กาก -กากคติ -กากณึก -กากนาสูร -กากบาท -กากภาษา -กากสูร -กากะทิง -กากะเยีย -กากี -กาง -ก้าง -กางเกง -กางเกียง -กางของ -กางเขน -กาจ -ก๊าซ -กาซะลอง -กาซะลองคำ -กาญจนา -กาฐ -กาด -ก๊าด -กาน -ก่าน -ก้าน -ก๊าน -กานดา -กานต์ -กานท์ -กานน -กานพลู -กาน้า -กาบ -ก้าบๆ -กาบบัว -กาบะ -กาบุรุษ -กาบู -กาเปี้ยด -กาพย์ -กาเฟอีน -กาแฟ -กาม -ก้าม -กามกวม -ก้ามกุ้ง -กามท -กามน -ก้ามปู -ก้ามปูหลุด -กามโมทย -กามวิตถาร -กามัช -กามา -กามาทีนพ -กามาพจร -กามามิศ -กามารมณ์ -กามาวจร -กามินี -กามิศ -กาเมศ -กาเมสุมิจฉาจาร -กาย -ก่าย -กายกรรม -กายคตาสติ -กายทวาร -กายทุจริต -กายบริหาร -กายพันธน์ -กายภาพ -กายภาพบำบัด -กายวิภาคศาสตร์ -กายสิทธิ์ -กายสุจริต -กายาพยพ -กายินทรีย์ -กาเยน -กาเยนทรีย์ -การ -การก -การณ์ -การ์ด -การติเกยะ -การ์ตูน -การเต -การโน้มถ่วง -การบูร -การบูรป่า -การย์ -การละเล่น -การวิก -การเวก -การะเกด -การะบุหนิง -การัณฑวะ -การัณย์ -การันต์ -การางหัวขวาน -การุญ -การุณย์ -กาเรการ่อน -กาเรียน -กาล -กาลกรรณี -กาลกัญชิกาสูร -กาลกิณี -กาลจักร -กาลัญญุตา -กาลัญญู -กาลัด -กาลานุกาล -กาลามสูตร -กาลิก -กาลี -กาแล็กซี่ -กาว -ก้าว -กาววาว -กาแวน -กาศิก -กาษฐะ -กาษา -กาสร -กาสะ -กาสา -กาสาร -กาสาวะ -กาสิโน -กาหล -กาหลา -กาหลิบ -กาหัก -กาเหว่า -กาไหล่ -กาฬ -กาฬกูฏ -กาฬปักษ์ -กาฬปักษี -กาฬพฤกษ์ -กาฬโรค -กาฬวาต -กาฬาวก -กาฮัง -กำ -ก่ำ -ก้ำ -กำกวม -กำกัด -กำกับ -ก้ำกึ่ง -กำกูน -ก้ำเกิน -กำเกียง -กำคูน -ก่ำเคือ -กำจร -กำจัด -กำจาย -กำชับ -กำชำ -กำโชก -กำซาบ -กำซำ -กำด้น -กำดัด -กำดาล -กำเดา -กำเดาะ -กำตาก -กำทวด -กำทวน -กำธร -กำนล -กำนัด -กำนัน -กำนัล -กำเนิด -กำเนียจ -กำบด -กำบน -กำบัง -กำบัด -กำบิด -กำเบ้อ -กำโบล -กำปอ -กำปั่น -กำปั้น -กำผลา -กำพง -กำพด -กำพต -กำพร้า -กำพราก -กำพวด -กำพอง -กำพืด -กำพู -กำเพลิง -กำแพง -กำแพ้ง -กำภู -กำมพฤกษ์ -กำมลาศน์ -กำมเลศ -กำมะถัน -กำมะลอ -กำมะหยี่ -กำมะหริด -กำมังละการ -กำมังวิลิต -กำมัชพล -กำยาน -กำยำ -กำรอ -กำราก -กำราบ -กำราล -กำรู -กำเริบ -กำไร -กำลอง -กำลัง -กำลังช้างเผือก -กำลังช้างสาร -กำลังวัวเถลิง -กำลุง -กำลูน -กำเลา -กำเลาะ -กำไล -กำสรด -กำสรวล -กำเสาะ -กำแสง -กำหนด -กำหนัด -กำหราก -กำเหน็จ -กำแหง -กิก -กิ๊ก -กิ่ง -กิ้งก่า -กิ้งกือ -กิ้งโครง -กิงบุรุษ -กิงสุก -กิ่งหาย -กิจ -กิจจะ -กิจจะลักษณะ -กิจจา -กิดาการ -กิดาหยัน -กิตติ -กิตาหรัง -กิน -กินเครา -กินนร -กินริน -กินรี -กินูน -กิ๊บ -กิม -กิมตึ๋ง -กิมิชาติ -กิมิวิทยา -กิโมโน -กิโยตีน -กิระ -กิริณี -กิรินท -กิริเนศวร -กิริยา -กิลมะ -กิเลน -กิเลส -กิโล -กิโลมกะ -กิ่ว -กิ๋ว -กี่ -กี้ -กี๋ -กีฏ -กีด -กีตาร์ -กีบ -กีรติ -กีวี -กีฬา -กึก -กึกถอง -กึง -กึ่ง -กึ๋น -กุ -กุก -กุ๊ก -กุกๆกักๆ -กุ๊กๆกิ๊กๆ -กุกกัก -กุ๊กกิ๊ก -กุกกุฏ -กุกกุร -กุกขี้หมู -กุกรรม -กุก่อง -กุกะ -กุกุธภัณฑ์ -กุ้ง -กุ้งเต้น -กุ้งยิง -กุงอน -กุงาน -กุโงก -กุจี -กุญแจ -กุญชร -กุฎ -กุฎา -กุฎาธาร -กุฎี -กุฏฐัง -กุฏิ -กุณฑ์ -กุณฑล -กุณฑิน -กุณฑี -กุณโฑ -กุณาล -กุณิ -กุณี -กุด -กุดัง -กุดั่น -กุดา -กุทัณฑ์ -กุน -กุ๊น -กุนเชียง -กุนซือ -กุนที -กุโนกามอ -กุบ -กุบกับ -กุม -กุ่ม -กุมฝอย -กุมภ์ -กุมภนิยา -กุมภัณฑ์ -กุมภา -กุมภิล -กุมภีล์ -กุมมาส -กุมเหง -กุมาร -กุมารลฬิตา -กุมารา -กุมาริกา -กุมารี -กุมุท -กุย -กุ๊ย -กุ๋ย -กุ๋ยๆ -กุยช่าย -กุ่ยหลุ่ยส้ม -กุยเฮง -กุรร -กุระ -กุรุเกษตร -กุรุง -กุรุพินท์ -กุรุร -กุเรา -กุล -กุลกัลยา -กุลกูณี -กุลคุรุ -กุลชน -กุลชาต -กุลดิลก -กุลทูสก -กุลธรรม -กุลธิดา -กุลนาค -กุลนารี -กุลนาศ -กุลบดี -กุลบุตร -กุลบุรุษ -กุลพธู -กุลมัจฉริยะ -กุลมิตร -กุลวาร -กุลเวทิตา -กุลสตรี -กุลสัมพันธ์ -กุลา -กุลาหล -กุลี -กุลีกุจอ -กุลุปกาจารย์ -กุเลา -กุแล -กุไล -กุวะ -กุเวร -กุศราช -กุศล -กุศโลบาย -กุสล -กุสะ -กุสุม -กุสุมภ์ -กุสุมา -กุสุมาลย์ -กุสุมิตลดาเวลลิตา -กุหก -กุหนี -กุหนุง -กุหร่า -กุหล่า -กุหลาบ -กุแหละ -กู -กู่ -กู้ -กู๊ก -กูฏ -กูฏา -กูโฏบาย -กูณฑ์ -กูด -กูน -กูบ -กูปรี -กูรมะ -กูรมาวตาร -กูรำ -เก -เก่ -เก๊ -เก๋ -เก้ๆกังๆ -เกก -เก๊ก -เกกมะเหรก -เก๊กฮวย -เก้กัง -เก็ง -เก่ง -เก้ง -เก๋ง -เกงกอย -เก้งก้าง -เกงเขง -เก๋งเคง -เก็จ -เกจิอาจารย์ -เกชา -เกณฑ์ -เกณฑ์ตะพัด -เกด -เก็ด -เกตุ -เกน -เก่น -เกนๆ -เก็บ -เกม -เกย -เกย์ -เกยูร -เกรง -เกร็ง -เกรด -เกร็ด -เกรน -เกร่อ -เกรอะ -เกราะ -เกราะเพชรไพฑูรย์ -เกริก -เกริน -เกริ่น -เกรียก -เกรียง -เกรียด -เกรียน -เกรียบ -เกรียม -เกรียมกรม -เกรียว -เกรี้ยว -เกรี้ยวๆ -เกเร -เกล็ด -เกลศ -เกลอ -เกลา -เกล้า -เกลาะ -เกลี่ย -เกลี้ย -เกลียง -เกลี้ยง -เกลียด -เกลียว -เกลี่ยวดำ -เกลือ -เกลื้อ -เกลือก -เกลื่อน -เกลื้อน -เกไล -เกวล -เกวลาที -เกวลิน -เกวลี -เกวัฏ -เกวียน -เกศ -เกศพ -เกศว -เกศา -เกศินี -เกศี -เกษตร -เกษตรกร -เกษตรกรรม -เกษตรบดี -เกษตรศาสตร์ -เกษม -เกษียณ -เกษียน -เกษียร -เกส -เกสตาโป -เกสร -เกสรี -เกสา -เกสี -เก่หลี -เก้อ -เกอิชา -เกะ -เกะกะ -เกา -เก่า -เก้า -เก๋า -เกาต์ -เกาทัณฑ์ -เกาทุมพร -เกาบิน -เกาบิล -เกามาร -เกาลัด -เกาลิน -เกาศัลย์ -เกาไศย -เกาเหลา -เกาเหลียง -เก้าอี้ -เกาะ -เกาะแกะ -เกิง -เกิ้ง -เกิด -เกิน -เกิบ -เกีย -เกียกกาย -เกียง -เกี่ยง -เกี๋ยง -เกียจ -เกียด -เกียน -เกี้ยมไฉ่ -เกี้ยมอี๋ -เกียรติ -เกียรติ์ -เกี่ยว -เกี้ยว -เกี๊ยว -เกี๊ยะ -เกื้อ -เกือก -เกื้อกูล -เกือบ -แก -แก่ -แก้ -แกง -แก่ง -แก้ง -แก๊ง -แกงขม -แกงได -แกงแนง -แก่งแย่ง -แกโดลิเนียม -แกน -แก่น -แกนะ -แกแน -แก๊ป -แกม -แก้ม -แกมมา -แกรก -แกร่ง -แกร็น -แกรนิต -แกรไฟต์ -แกร่ว -แกระ -แกล -แกล่ -แกล้ง -แกลน -แกลบ -แกล้ม -แกลลอน -แกลเลียม -แกล้ว -แกละ -แกแล -แกว -แก้ว -แกว่ง -แกว่น -แก็ส -แก๊ส -แกะ -โก -โก่ -โก้ -โก๋ -โกก -โกกนุท -โกกิล -โกกิลา -โกโก้ -โกง -โก่ง -โกงกาง -โก้งเก้ง -โกงโก้ -โก้งโค้ง -โกเชาว์ -โกญจน -โกญจา -โกฏิ -โกฐ -โกฐาส -โกณ -โกณก -โกณฑัญญะ -โกดัง -โกตไต -โกทัณฑ์ -โกน -โก่น -โก๋น -โกนาคมน์ -โกโนเรีย -โกปินำ -โกมล -โกมารภัจจ์ -โกมุท -โกเมน -โกเมศ -โกย -โกร้ -โกรก -โกรกกราก -โกรง -โกร่ง -โกร่งกร่าง -โกรงเกรง -โกร๋งเกร๋ง -โกรญจ -โกรด -โกรต๋น -โกรธ -โกรธา -โกร๋น -โกรม -โกรย -โกรศ -โกโรโกเต -โกโรโกโรก -โกโรโกโส -โกลง -โกลน -โกลาหล -โกไล -โกวิท -โกวิฬาร -โกศ -โกศล -โกษ -โกษม -โกษย -โกส -โกสน -โกสัช -โกสินทร์ -โกสีย์ -โกสุม -โกไสย -โกหก -โกหวา -โกหัญ -ใกล้ -ไก -ไก่ -ไก้ -ไก๊ -ไก๋ -ไก่กอม -ไก๋แดง -ไก่เตี้ย -ไก่นา -ไก่พัล -ไก่ฟ้า -ไกร -ไกรพ -ไกรลาส -ไกรศร -ไกรศรี -ไกรสร -ไกรสิทธิ -ไกล -ไกล่ -ไกลาส -ไกว -ไกวัล -ไก่ไห้ -ข -ขคะ -ขคาธิป -ขคาภิราม -ขคาสนะ -ขเคศวร -ขง -ขงจื๊อ -ขจร -ขจอก -ขจัด -ขจ่าง -ขจาย -ขจาว -ขจิต -ขจิริด -ขจี -ขจุย -ขเจา -ขณะ -ขณะจิต -ขณิก -ขณิกสมาธิ -ขด -ขดาน -ขตอย -ขทิง -ขทึง -ขน -ข้น -ขนง -ขนงเนื้อ -ขนด -ขนน -ขนบ -ขนม -ขนมจีน -ขนมเบื้องญวน -ขนมปัง -ขนมผสมน้ำยา -ขนมผักกาด -ขนมเส้น -ขนมหัวผักกาด -ขนอง -ขนอน -ขนอบ -ขนัด -ขนัน -ขนาก -ขนาง -ขนาด -ขนาน -ขนาบ -ขนาย -ขนำ -ขนิษฐ -ขนิษฐา -ขนุน -ขบ -ขบขัน -ขบถ -ขบวน -ขบวร -ขบูร -ขม -ข่ม -ขมงโกรย -ขมม -ขมวด -ขมวดยา -ขมวน -ขมหิน -ขมอง -ขม่อม -ขมอย -ขมักเขม้น -ขมัง -ขมับ -ขมา -ขม้ำ -ขมิ้น -ขมิบ -ขมีขมัน -ขมึง -ขมุ -ขมุกขมอม -ขมุกขมัว -ขมุดขมิด -ขมุบ -ขมุม -ขโมย -ขยด -ขยม -ขย่ม -ขยล -ขยอก -ขยอง -ขย่อน -ขย้อน -ขยะ -ขยะแขยง -ขยัก -ขยัน -ขยั้น -ขยับ -ขยาด -ขยาบ -ขยาย -ขยำ -ขย้ำ -ขยิก -ขยิบ -ขยิ่ม -ขยี้ -ขยี่ขยัน -ขยุกขยิก -ขยุกขยุย -ขยุบ -ขยุม -ขยุ้ม -ขยุ้มตีนหมา -ขยุย -ขรม -ขรรค์ -ขรัว -ขริบ -ขรี -ขรึม -ขรุขระ -ขล้ง -ขลบ -ขลม -ขลวน -ขล้อ -ขลัง -ขลับ -ขลา -ขลาด -ขลาย -ขลิบ -ขลิบทอง -ขลึง -ขลุก -ขลุบ -ขลุม -ขลุมประเจียด -ขลุ่ย -ขลู -ขลู่ -ขวง -ข่วง -ขวด -ขวน -ข่วน -ขวบ -ขวย -ขวะไขว่เขวี่ย -ขวักไขว่ -ขวัญ -ขวัญเมือง -ขวัญอ่อน -ขวัด -ขวัดขวิด -ขวัดแคว้ง -ขวั้น -ขวับ -ขวา -ขวาก -ขวาง -ขว้าง -ขวาด -ขวาน -ขวายขวน -ขวาว -ขว้าว -ขวิด -ขษณะ -ขษัย -ขษีณาศรพ -ขษีร -ขอ -ข่อ -ข้อ -ขอก -ของ -ข้อง -ของระอา -ขอฉาย -ขอด -ขอน -ข่อน -ข้อน -ขอบ -ขอบข่าย -ขอบเขต -ขอบคุณ -ขอบใจ -ขอบพระคุณ -ขอบเหล็ก -ขอม -ข่อย -ข้อย -ขะขำ -ขะแข่น -ขะแข้น -ขะแจะ -ขะแถก -ขะนาน -ขะเน็ด -ขะมอมขะแมม -ขะแมซอ -ขะแมธม -ขะยิก -ขะยุก -ขะเย้อแขย่ง -ขะแยะ -ขัค -ขัง -ขังขอก -ขัช -ขัชก -ขัณฑสกร -ขัด -ขัดมอน -ขัน -ขั้น -ขันแข็ง -ขันติ -ขันตี -ขันโตก -ขันทองพยาบาท -ขันที -ขันธ์ -ขันธกุมาร -ขันธสันดาน -ขันธาวาร -ขันหมาก -ขับ -ขัย -ขัว -ขั้ว -ขา -ข่า -ข้า -ขาก -ขาก๊วย -ขาเกวียน -ขาง -ข่าง -ข้าง -ข้างกระดาน -ข้างเงิน -ขางแดง -ข้างตะเภา -ข้างลาย -ขาณุ -ขาด -ขาทนียะ -ขาน -ข่าน -ขาบ -ขาม -ข้าม -ขาย -ข่าย -ขาล -ขาว -ข่าว -ข้าว -ข้าวคำ -ข้าวจี่ -ขาวจีบ -ข้าวต้ม -ข้าวตอก -ข้าวนก -ขาวพวง -ขาวม้า -ข้าวมิ่น -ข้าวเย็นใต้ -ข้าวเย็นเหนือ -ข้าวสาร -ข้าวหางช้าง -ขาวใหญ่ -ข้าวใหม่น้อย -ข้าวใหม่ใหญ่ -ข้าศึก -ข้าหลวง -ข้าหลวงหลังลาย -ขำ -ข่ำเขียว -ขิก -ขิกๆ -ขิง -ขิ่ง -ขิปสัทโท -ขิม -ขี่ -ขี้ -ขี้กา -ขี้กาดง -ขี้กาแดง -ขี้กาเหลี่ยม -ขี้ขม -ขี้ขวง -ขี้ขุย -ขี้ครอก -ขี้ควาย -ขี้โครง -ขีณะ -ขีณาสพ -ขีด -ขี้ตังนี -ขี้ติ้ว -ขี้ไต้ -ขี้ไถ -ขีปนาวุธ -ขี้ผึ้ง -ขี้มอด -ขี้ยอก -ขี้ราด -ขี้แรด -ขี้สูด -ขี้หนอน -ขี้หน้า -ขี้หนู -ขี้หมู -ขี้เหล็ก -ขี้อ้น -ขี้อ้าย -ขึง -ขึ้ง -ขึ้น -ขึ้นฉ่าย -ขืน -ขื่น -ขื่อ -ขื่อผี -ขุก -ขุด -ขุททกนิกาย -ขุน -ขุ่น -ขุนทอง -ขุนแผน -ขุนเพ็ด -ขุปปิปาสิกเปรต -ขุม -ขุย -ขู -ขู่ -ขูด -เข -เข้ -เขก -เข็ง -เข่ง -เขจร -เข็ญ -เข็ญใจ -เข็ด -เขดา -เขต -เขน -เข็น -เข่น -เขนง -เขน็ด -เขนย -เขบ็จขบวน -เขบ็ต -เข็ม -เข้ม -เข้มขาบ -เขม็ง -เขม็ดแขม่ -เขม่น -เขม้น -เขม้นขะมัก -เขมร -เขมา -เขม่า -เขมาโกรย -เขมือบ -เขย -เขยก -เขย่ง -เขยตาย -เขย้อแขย่ง -เขยอะขยะ -เขย่า -เขยิน -เขยิบ -เขยียวขยอน -เขยื้อน -เขรอะ -เขลง -เขลอะ -เขละ -เขลา -เขลาะ -เขว -เขษตร -เขษม -เขษียร -เขฬะ -เขะขะ -เขา -เข่า -เข้า -เข้าหมิ้น -เขิง -เขิน -เขิบ -เขี่ย -เขียง -เขียงพระนางอี่ -เขียงพร้า -เขียด -เขียน -เขี่ยน -เขียม -เขียว -เขี้ยว -เขียะ -เขือ -เขือง -เขื่อง -เขื่อน -เขือม -แข -แข้ -แขก -แขกเต้า -แข็ง -แข่ง -แข้ง -แขน -แข่น -แข้น -แขนง -แขนะ -แขม -แขม็บ -แขม่ว -แขย็กๆ -แขยง -แขย่ง -แขยงหนู -แขละ -แขวก -แขวง -แขวน -แขวนลอย -แขวะ -แขสร์ -โข -โขก -โข่ง -โขด -โขดง -โขน -โขนง -โขม -โขมง -โขมด -โขมดยา -โขยก -โขยง -โขย่ง -โขยด -โขยม -โขลก -โขลกๆ -โขลง -โขลน -โขลนทวาร -โขษม -ไข -ไข่ -ไข้ -ไข่ดัน -ไข่มุก -ไขรา -ไขว่ -ไขว้ -ไขษย -ไขสือ -ไขเสนียด -ไขหู -ไข่เหลือง -ค -คก -คคนะ -คคนัมพร -คคนางค์ -คคนานต์ -คง -คงคา -คงคาเดือด -คงไคย -คชราช -คชส่าน -คชาชาติ -คชาชีพ -คชาธาร -คชาภรณ์ -คชายุรเวช -คชารี -คชินทร -คเชนทร์ -คณน -คณนา -คณโภชน์ -คณะ -คณิกา -คณิต -คเณศ -คด -คดี -คต -คติ -คทา -คน -ค้น -คนทา -คนทิสอ -คนทิสอทะเล -คนที -คนทีเขมา -คนทีสอ -คนโท -คนธ์ -คนธรรพ์ -คนละ -คเนจร -คบ -คม -คมน์ -คมนาการ -คมนาคม -คมิกภัต -ครก -คร่ง -ครบ -ครบถ้วน -ครรชิต -ครรภ -ครรภ์ -ครรภธาตุ -ครรภมล -ครรภาธาน -ครรโภทร -ครรลอง -ครรโลง -ครรไล -ครรหิต -ครวญ -ครวญหา -ครวัก -ครวี -ครหา -ครอก -ครอง -ครองแครง -คร่อเงาะ -คร่อเทียน -ครอบ -ครอบจักรวาล -ครอบตลับ -คร่อม -คระ -คระเมิน -คระแลง -คระไล -คระแวง -คระหน -คระหวน -คระหาย -คระหิว -คระโหย -ครั่ง -ครั้ง -ครัดเคร่ง -ครัน -ครั่น -ครั้น -ครับ -ครัว -ครา -คร่า -คราก -คราง -คราญ -คราด -คร้าน -คราบ -คราบหมู -คราม -คร้าม -ครามครัน -คราว -คร่าว -คราส -ครำ -คร่ำ -คริปทอน -คริสต์ -ครีครอ -ครีบ -ครีม -ครีษมายัน -ครึ -ครึกครื้น -ครึกโครม -ครึ่ง -ครึน -ครึม -ครึ้ม -ครึมครุ -ครืด -ครืน -ครื้น -ครืนครั่น -ครื้นครึก -ครื้นเครง -ครือ -ครุ -ครุคระ -ครุฑ -ครุฑกระทง -ครุ่น -ครุ่นคิด -ครุมเครือ -ครุย -ครุวนา -ครู -ครู่ -ครูด -คฤโฆษ -คฤนถ์ -คฤห -คฤหบดี -คฤหปัตนี -คฤหัสถ์ -คฤหา -คฤหาสน์ -คล -คลวง -คลอ -คล้อ -คลอก -คลอง -คล่อง -คล้อง -คลอด -คลอน -คล้อย -คลอรีน -คลอโรฟอรม์ -คลอโรฟีลล์ -คละ -คละคลุ้ง -คลัก -คลั่ก -คลั่กๆ -คลัง -คลั่ง -คลัตช์ -คลับ -คลับคล้าย -คลา -คล้า -คลางแคลง -คลาด -คลาน -คลาย -คล้าย -คล้ายคลึง -คล่าว -คลาศ -คลำ -คล่ำ -คล้ำ -คลิง -คลิ้งโคลง -คลินิก -คลี -คลี่ -คลึง -คลื่น -คลื่นไส้ -คลื่นเหียน -คลุก -คลุกคลาน -คลุ้ง -คลุบ -คลุม -คลุ่ม -คลุ้ม -ควง -ควณ -ควน -ควบ -ควบแน่น -ควย -ควร -ควัก -ควักค้อน -ควั่งคว้าง -ควัน -ควั่น -คว้า -ควาก -คว้าง -ควาญ -ควาน -คว้าน -ความ -ความคลาด -ความเครียด -ความแค้น -ความเฉื่อย -ความชื้น -ความถ่วง -ความถี่ -ความยาวคลื่น -ความรู้สึกเขื่อง -ความรู้สึกด้อย -ความรู้สึกเด่น -ความเร่ง -ความเร็ว -ความหน่วง -ควาย -คว่าว -คว่ำ -ควินิน -ควิวๆ -ควิวควัง -ควิวคว่าง -ควิวคว้าง -ควีนสิริกิติ์ -คหัฐ -คอ -ค้อ -คอก -ค็อกคัส -ค็อกเทล -คอคาน -คอเคซอยด์ -คองเกรส -ค่องอ้อย -คอด -คอเต็บ -คอน -ค่อน -ค้อน -คอนกรีต -ค้อนกลอง -คอนเดนเซอร์ -ค้อนตีนหมา -ค้อนทอง -คอนวอย -คอนแวนต์ -คอนเสิร์ต -ค้อนหอย -คอบ -คอม -ค่อม -ค้อม -คอมพิวเตอร์ -คอมมานโด -คอมมิวนิสต์ -คอย -ค่อย -ค้อย -ค่อยๆ -คอยล์ -คอร์ด -คอร์ต -คอรัปชั่น -คอลัมน์ -คอเลสเตอรอล -คอแลน -คอสติกโซดา -คอแห้ง -คะ -ค่ะ -คะไขว่ -คะค้อย -คะคาน -คะคึง -คะนน -คะนอง -คะน้า -คะนึง -คะเน -คะเนงร้าย -คะเน็ด -คะแนน -คะใน -คะมำ -คะมึก -คะยั้นคะยอ -คะเยอ -คัก -คั่ก -คัคน -คัคนะ -คัคนัมพร -คัคนางค์ -คัคนานต์ -คั่ง -คังไคย -คัจฉ -คัณฑมาลา -คัณฑสูตร -คัด -คัดเค้า -คัดช้อน -คัดมอน -คัทลียา -คัน -คั่น -คั้น -คันจาม -คันฉาย -คันโดง -คันทรง -คันธ -คันธ์ -คันธารราษฎร์ -คันหามเสือ -คับ -คับค้อน -คับคา -คับแค -คัพภ์ -คัพโภทร -คัมภีร์ -คัล -คัว -คั่ว -คา -ค่า -ค้า -ค่าคบ -คาง -ค่าง -ค้าง -คางคก -ค้างคาว -คาด -คาดคั้น -คาถา -คาทอลิก -ค่าที่ -คาธ -คาเธย์ -คาน -ค้าน -คาน้า -คาบ -คาพยุต -คาม -คามณีย์ -คามภีร์ -คามี -คาย -ค่าย -คายก -คายัน -คาร์บอน -คาร์บอนไดออกไซด์ -คาร์บอนมอนอกไซด์ -คาร์บอเนต -คาร์บอลิก -คาร์บูเรเตอร์ -คาร์โบรันดัม -คาร์โบไฮเดรต -คารพ -คารม -คารวะ -คาราเต้ -คาราวาน -คาว -ค่าว -ค้าว -คาวตอง -คาวี -คาวุต -คาส -ค่าหด -คำ -ค่ำ -ค้ำ -คำดีควาย -คำใต้ -คำนวณ -คำนวร -คำนับ -คำนัล -คำนึง -คำนูณ -คำโบล -คำฝอย -คำเพลิง -คำรน -คำรบ -คำราม -คำแสด -คำแหง -คำโอง -คิกๆ -คิง -คิด -คินิ -คิมห -คิมหันต์ -คิมหานะ -คิริ -คิรี -คิลานะ -คิว -คิ้ว -คิหิสุข -คี่ -คีต -คีตกะ -คีบ -คีม -คีรี -คีรีบูน -คึก -คึ่ก -คึ่กๆ -คึกคัก -คึกคาม -คืน -คืบ -คือ -คุ -คุก -คุกกี้ -คุกเข่า -คุกคลาน -คุกคาม -คุกพาทย์ -คุคะ -คุง -คุ้ง -คุณ -คุณค่า -คุณธรรม -คุณนาม -คุณบท -คุณประโยชน์ -คุณพิเศษ -คุณภาพ -คุณลักษณะ -คุณลุงคุณป้า -คุณวิเศษ -คุณวุฒิ -คุณศัพท์ -คุณสมบัติ -คุณากร -คุณาลัย -คุณูปการ -คุโณปการ -คุด -คุดทะราด -คุต -คุตติ -คุ่น -คุ้น -คุป -คุปต์ -คุปติ -คุม -คุ่ม -คุ้ม -คุ้มดีคุ้มร้าย -คุ้มเท้า -คุมฝอย -คุย -คุ้ย -คุรุ -คุลา -คุลิก่า -คุลีการ -คู -คู่ -คู้ -คูณ -คูถ -คูน -คูปอง -คูเรียม -คูหา -เค้เก้ -เค้ง -เคจฉ -เคณฑะ -เคด -เคน -เคเบิล -เค็ม -เคมี -เคย -เครง -เคร่ง -เครงครำ -เครงคร่ำ -เครดิต -เครน -เครา -เคร่า -เคราหณี -เคราะห์ -เครียด -เครียว -เครือ -เครือเขาน้ำ -เครือเขามวก -เครื่อง -เครือจักรภพ -เคล้ง -เคล็ด -เคล้น -เคล้า -เคล่าคล่อง -เคลิบเคลิ้ม -เคลิ้ม -เคลีย -เคลี้ยคลิง -เคลื่อน -เคลือบ -เคว้ง -เคหะ -เคหา -เคอะ -เคา -เค้า -เคาน์เตอร์ -เคาเป๋ -เคารพ -เค้าสนามหลวง -เคาะ -เคาะแคะ -เคี้ย -เคียง -เคียด -เคียน -เคียม -เคี่ยม -เคียร -เคียว -เคี่ยว -เคี้ยว -เคื้อ -เคือง -แค -แค่ -แค้ -แคแกล -แคชเชียร์ -แคดเมียม -แคโทด -แคน -แค่น -แค้น -แคบ -แคบหมู -แคปซูล -แคม -แคร่ -แครก -แครครั่ง -แครง -แครงเครียว -แคระ -แคลคูลัส -แคลง -แคลเซียม -แคลน -แคล้ว -แคล่วคล่อง -แคลอรี -แคลิฟอร์เนียม -แคแล -แคว -แควก -แคว้ง -แคว้น -แคะ -โค -โคก -โคกกระสุน -โคกกระออม -โคกม้า -โคคลาน -โคเคน -โค่ง -โค้ง -โคจร -โคจรคาม -โค้ช -โคเซแคนต์ -โคไซน์ -โคตร -โคแทนเจนต์ -โคธา -โคน -โค่น -โคนดินสอ -โคนตายปลายเป็น -โคนสมอ -โคบอลต์ -โคปผกะ -โคม -โคม่า -โครก -โครกครอก -โครกคราก -โครง -โคร่ง -โคร่งคร่าง -โครงแคร -โครม -โครเมียม -โครโมโซม -โคราช -โคล -โคลง -โคลน -โควตา -โคออร์ดิเนต -ใคร -ใคร่ -ใคร่ครวญ -ไค -ไค้ -ไคร้ -ไคร้เครือ -ไคล -ไคล้ -ฆ -ฆง -ฆฏ -ฆโฏทร -ฆต -ฆน -ฆนากร -ฆนาคม -ฆนามัย -ฆนาศัย -ฆโนบล -ฆราวาส -ฆ้อง -ฆ้องสามย่าน -ฆ่า -ฆาฏ -ฆาต -ฆาน -เฆี่ยน -โฆรวิส -โฆษ -โฆษก -โฆษณา -โฆษณาการ -โฆษณาชวนเชื่อ -โฆษิต -โฆสวันต์ -ง -งก -งง -งงิด -งด -งดงาม -งบ -งม -งวง -ง่วง -งวด -ง่วน -ง้วน -งวยงง -งอ -ง้อ -งอก -งอกแงก -ง่อง -ง่องแง่ง -งอแง -งอด -งอดแงด -งอน -ง่อน -ง่อนแง่น -งอนหง่อ -ง้อนหมู -งอบ -งอม -ง้อม -งอย -ง่อย -งะ -งักๆ -งั่กๆ -งั่ง -งังๆ -งัด -งัน -งันงก -งับ -งัว -งั่ว -งัวเงีย -งัวซัง -งัวเลีย -งา -ง่า -ง้าง -ง่าเงย -งาไซ -งาน -ง่าน -งาบๆ -งาม -ง่าม -งาย -ง่าย -ง่าย้อย -ง้าว -งำ -ง่ำ -ง้ำ -ง่ำๆ -งิ้ว -งีบ -งึกๆ -งึน -งึม -งึมงำ -งุด -งุดๆ -งุนงง -งุ่นง่าน -งุบ -งุบๆ -งุบงิบ -งุ้ม -งุ่มง่าม -งุย -งู -งูบ -งู่หนี -เง้ -เงก -เง็น -เงย -เง่หมึง -เงอะ -เงอะงะ -เงา -เง่า -เง้า -เงาะ -เงิน -เงี่ย -เงี่ยง -เงี่ยน -เงียบ -เงี้ยว -เงี้ยวระเริง -เงี้ยวรำลึก -เงี่ยหู -เงื้อ -เงือก -เงื่อง -เงื่องๆ -เงือด -เงือดงด -เงือน -เงื่อน -เงือบ -เงื้อม -แง -แง่ -แง่ง -แง่น -แง้ม -แงะ -โง -โง่ -โงก -โงกเงก -โงง -โง้ง -โง่งๆ -โงงเงง -โง่งเง่ง -โงเง -โงน -ไง -ไง้ -จ -จก -จง -จ่ง -จ๋ง -จงกรม -จงกล -จงกลนี -จงโคร่ง -จงอร -จงอาง -จญ -จด -จดุรงค์ -จดุระ -จตุชาติสุคนธ์ -จตุตถี -จตุรงคโชค -จตุราบายภูมิ -จตุราริยสัจ -จตุสดมภ์ -จทึง -จน -จ้น -จบ -จม -จ่ม -จมร -จมรี -จมู -จมูก -จมูกปลาหลด -จมูกปลาไหล -จมูกหลอด -จยุติ -จร -จรก -จรกลู่ -จรกา -จรแกว่ง -จรคั่ง -จรจรัล -จรจัด -จรณะ -จรด -จรดล -จรบน -จรบัน -จรบาท -จรมัน -จรมูก -จรรจา -จรรโจษ -จรรม -จรรยา -จรรโลง -จรร่ำ -จรลวง -จรล่วง -จรลาด -จรลาย -จรลิ่ว -จรลี -จรลู่ -จรวจ -จรวด -จรวดจรี -จรวัก -จรส -จรอก -จระกล้าย -จระขาบ -จระเข้ -จระคลับ -จระคล้าย -จระคลุ่ม -จระแคง -จระจุ่ม -จระทก -จระเทิน -จระนำ -จระบาน -จระบี -จระลิ่ง -จระลึง -จระลุง -จรัล -จรัส -จราก -จราง -จราจร -จราญ -จราย -จราว -จราส -จริก -จริง -จริงๆ -จริณ -จริต -จริยา -จริว -จรี -จรึง -จรุก -จรุง -จรูง -จรูญ -จรูส -จเร -จล -จลนพลศาสตร์ -จลนศาสตร์ -จลนี -จลา -จลาจล -จวก -จ๊วก -จวง -จ้วง -จ๋วง -จวงหอม -จวด -จวดลาก -จวน -จวบ -จวัก -จอ -จ่อ -จ้อ -จ๋อ -จอก -จ้อก -จ๊อก -จ้อกๆ -จ๊อกๆ -จ้อกแจ้ก -จ้อกวอก -จอง -จ่อง -จ้อง -จ๋อง -จ้องเต -จองเปรียง -จองหง่อง -จ้องหน่อง -จองหอง -จอแจ -จ๋อแจ๋ -จ้อช้าง -จอด -จอน -จ้อน -จอนจ่อ -จอนหู -จอบ -จอม -จ่อม -จ่อมจ่าย -จอมทอง -จอมปลอม -จ้อมป้อม -จอมเปาะ -จอมสุรางค์ -จ่อย -จ้อย -จ๋อย -จะ -จ้ะ -จ๊ะ -จ๋ะ -จะกรัดจะกราด -จะกรุน -จะกรุมจะกราม -จะกรูน -จะกละ -จะกวด -จะเกร็ง -จะขาบ -จะเข้ -จะเข็บ -จะงอย -จะจะ -จะจ้า -จะแจ -จะแจ้ง -จะแจ้น -จะแจ่ม -จะไจ้ -จะบัน -จะปิ้ง -จะเพลิง -จะละเม็ด -จะละหวั่น -จะลุง -จัก -จั้กๆ -จักกาย -จั๊กกิ้ม -จักขุ -จักจั่น -จักจี้ -จั๊กจี้ -จั๊กเดียม -จักร -จักรพาก -จักรวาก -จักริน -จักรี -จั๊กเล้อ -จักษุ -จักแหล่น -จัง -จั้ง -จั๋ง -จังกวด -จังกอบ -จังกา -จังกูด -จังเก -จังโก -จังโก๋ -จังโกฏก์ -จังงัง -จังมัง -จังไร -จังลอน -จังเว็จ -จังหนับ -จังหรีด -จังหล่อ -จังหวะ -จังหวัด -จังหัน -จังออน -จัญไร -จัณฑ์ -จัณฑาล -จัด -จัดจอง -จัตตาฬีส -จัตวา -จัตุ -จัตุร -จัตุโลกบาล -จัตุสดมภ์ -จัน -จั่น -จันโจษ -จันท์ -จันทน์ -จันทนา -จันทร์ -จันทรกลา -จันทรกษัย -จันทรกานต์ -จันทรกุฎ -จันทรเกตุ -จันทรคติ -จันทรคราส -จันทรเคราะห์ -จันทรชนก -จันทรทักษิณ -จันทรทาร -จันทรนิภา -จันทรบุตร -จันทรประภาพ -จันทรพิมพ์ -จันทรภาส -จันทรภูติ -จันทรมณฑล -จันทรเม็ด -จันทรเมาะห์ -จันทรรัตน์ -จันทรวงศ์ -จันทรวรรณ -จันทรเศขร -จันทราริ -จันทรุปราคา -จันทโรทัย -จันทัน -จันลอง -จันเลา -จันเลาะ -จั้นหล่อ -จันอับ -จับ -จับกัง -จับจ่าย -จับเจี๋ยว -จับฉ่าย -จับเดิม -จับปิ้ง -จับโปง -จับยี่กี -จับสั่น -จัมบก -จัมปก -จัมมะ -จั่ว -จัวจี๊ด -จั๊วะ -จา -จ่า -จ้า -จ๋า -จาก -จากพราก -จากพาก -จาคะ -จาคี -จาง -จ่าง -จ้าง -จางวาง -จาด -จาตุ -จาตุรงค์ -จาตุรนต์ -จาตุรันต์ -จาตุริก -จาน -จ้าน -จาบ -จาบัล -จาบัลย์ -จาป -จาปคุณ -จาปธร -จาปเวท -จาม -จามจุรี -จามร -จามรี -จามีกร -จ่าย -จาร -จ่ารง -จารวาก -จาระไน -จาระบี -จาริก -จารี -จารีต -จารึก -จารุ -จ้าละหวั่น -จาว -จ่าว -จ้าว -จ่าหวัก -จำ -จ้ำ -จำกว่า -จำกัด -จำงาย -จ้ำจี้ -จำเจ -จำเดิม -จำทวย -จำทับ -จำทาบ -จำเทิด -จำแทง -จำนง -จำนน -จำนรรจ์ -จำนรรจา -จำนวน -จำนอง -จำนับ -จำนัล -จำนำ -จำเนียน -จำเนียม -จำเนียร -จำแนก -จำโนทย์ -จำบ่ม -จ้ำบ๊ะ -จำบัง -จำบับ -จำเบศ -จ้ำเบ้า -จำแบ -จำปา -จำปาดะ -จำปี -จำปูน -จำพวก -จำเพาะ -จำแพรก -จ้ำม่ำ -จำรด -จำรัส -จำราญ -จำราย -จำรูญ -จำเริญ -จำเรียง -จำลอง -จำลาย -จำเลาะ -จำเลาะตา -จำแลง -จำแล่น -จำหนับ -จ๋ำหนับ -จำหน่าย -จำหระ -จำหล่อ -จำหลอก -จำหลัก -จำหัน -จำหาย -จำหุด -จำเหียง -จำอวด -จำอื่น -จิ -จิก -จิ๊กโก๋ -จิ่ง -จิ้งจก -จิงจ้อ -จิ้งจอก -จิงจัง -จิ้งจัง -จิงโจ้ -จิ้งหรีด -จิ้งหรีดผี -จิงหัน -จิงหุน -จิ้งเหลน -จิต -จิตกาธาน -จิตกึ่งสำนึก -จิตใจ -จิตต์ -จิตตานุปัสสนา -จิตนาถ -จิตนิยม -จิตบำบัด -จิตแพทย์ -จิตภาพ -จิตภู -จิตร -จิตรจุล -จิตรลดา -จิตรา -จิตรารจิส -จิตไร้สำนึก -จิตวิทยา -จิตวิสัย -จิตเวชศาสตร์ -จิตศาสตร์ -จิตสำนึก -จินเจา -จินดา -จินดาส่าหรี -จินดาหนา -จินดาหรา -จินดาอรสา -จินต์ -จิบ -จิ๊บจ๊อย -จิปาถะ -จิ่ม -จิ้ม -จิ๋ม -จิ้มก้อง -จิ้มลิ้ม -จิรันดร -จิรายุส -จิ๊ว -จิ๋ว -จี -จี่ -จี้ -จี๋ -จี๋จ้อ -จีจู้ -จี๊จู้ -จีแจ๊บ -จี๊ด -จีน -จีนแส -จีบ -จีโบ -จีพร -จีม -จีวร -จึง -จึ่ง -จึ้ง -จืด -จื้นเจือก -จุ -จุก -จุ๊กกรู๊ -จุกจิก -จุกชี -จุกผาม -จุกพราหมณ์ -จุกโรหินี -จุ่ง -จุ้งจัง -จุ๋งจิ๋ง -จุ๋จี๋ -จุฑา -จุณ -จุณณียบท -จุด -จุติ -จุตูปปาตญาณ -จุทส -จุน -จุ่น -จุ้น -จุ้นจ้าน -จุนจู๋ -จุ้นจู๊ -จุนทการ -จุนสี -จุบ -จุ๊บ -จุบจิบ -จุ๊บแจง -จุ่ม -จุ้ม -จุ๋มจิ๋ม -จุมพฏ -จุมพรวด -จุมพล -จุมพิต -จุมโพล่ -จุ่ย -จุ้ย -จุรณ -จุรี -จุไร -จุลจอมเกล้า -จุลวงศ์ -จุฬา -จุฬาราชมนตรี -จู -จู่ -จู้ -จู๋ -จูง -จู้จี้ -จู๊ด -จูบ -จูรณ -เจ -เจ๊ -เจ๊ก -เจ่ง -เจ๊ง -เจ็ด -เจ็ดตะคลี -เจดีย์ -เจต -เจตนา -เจตพังคี -เจตมูลเพลิง -เจตสิก -เจติย -เจโตปริยญาณ -เจโตวิมุติ -เจน -เจ็บ -เจรจา -เจริญ -เจริด -เจรียง -เจลียง -เจว็ด -เจษฎา -เจ๊สัว -เจอ -เจ่อ -เจ๋อ -เจ๋อเจ๊อะ -เจอร์เมเนียม -เจอะ -เจา -เจ่า -เจ้า -เจ๊า -เจ้าพระยา -เจ้าฟ้าหญิงสิรินธร -เจาะ -เจิ่ง -เจิด -เจิ่น -เจิม -เจี๊ยก -เจียง -เจียด -เจียน -เจี๋ยน -เจี๊ยบ -เจียม -เจี๋ยมเจี้ยม -เจียร -เจียระไน -เจียระบาด -เจียว -เจี๊ยวจ๊าว -เจือ -เจื่อน -เจื้อย -เจือสม -แจ -แจ้ -แจ๋ -แจก -แจง -แจ้ง -แจงลอน -แจ๊ด -แจดแจ้ -แจ๊ดแจ๋ -แจตร -แจ้น -แจบ -แจ่ม -แจ่มจันทร์ -แจร -แจรก -แจรง -แจว -แจ้ว -แจ๋ว -แจ้วๆ -แจะ -โจก -โจ๊ก -โจง -โจงกระเบนตีเหล็ก -โจ่งครึ่ม -โจ๋งครึ่ม -โจ่งครุ่ม -โจงโคร่ง -โจ๋งเจ๋ง -โจ่งแจ้ง -โจท -โจทก์ -โจทนา -โจทย์ -โจน -โจม -โจร -โจรกรรม -โจล -โจษ -โจษจัน -ใจ -ไจ -ไจ้ -ไจ้ๆ -ไจร -ฉ -ฉก -ฉกมาวจร -ฉกรรจ์ -ฉกาจ -ฉกาจฉกรรจ์ -ฉกามาพจร -ฉงน -ฉงาย -ฉณะ -ฉทวาร -ฉทะ -ฉทานศาลา -ฉทึง -ฉนวน -ฉนัง -ฉนาก -ฉนำ -ฉบบ -ฉบัง -ฉบัด -ฉบับ -ฉบำ -ฉม -ฉมบ -ฉมวก -ฉมวย -ฉม่อง -ฉมัง -ฉมัน -ฉมา -ฉมำ -ฉล -ฉลวย -ฉลอง -ฉลอม -ฉลัก -ฉลับ -ฉลาก -ฉลากบาง -ฉลาง -ฉลาด -ฉลาม -ฉลาย -ฉลิว -ฉลีก -ฉลุ -ฉลุกฉลวย -ฉลู -ฉวย -ฉวะ -ฉวัดเฉวียน -ฉวาง -ฉวี -ฉสก -ฉฬภิญโญ -ฉ้อ -ฉอก -ฉอกษัตริย์ -ฉ่อง -ฉอดๆ -ฉะ -ฉะกะ -ฉะฉาด -ฉะฉาน -ฉะฉ่ำ -ฉะฉี่ -ฉะเฉื่อย -ฉะต้า -ฉะนั้น -ฉะนี้ -ฉะอ้อน -ฉักกะ -ฉัฐ -ฉัฐมะ -ฉัด -ฉัตร -ฉัททันต์ -ฉัน -ฉันท์ -ฉันทะ -ฉันทิต -ฉันวุฒิ -ฉับ -ฉับๆ -ฉัพพรรณรังสี -ฉัยยา -ฉาก -ฉาง -ฉ่าง -ฉ่าฉาว -ฉาด -ฉาดฉาน -ฉาตกภัย -ฉาทนะ -ฉาน -ฉาบ -ฉาบฉวย -ฉาป -ฉาย -ฉายา -ฉาริกา -ฉาว -ฉ่ำ -ฉำฉา -ฉำเฉง -ฉำแฉะ -ฉิ่ง -ฉิน -ฉินท์ -ฉิบ -ฉิมพลี -ฉิว -ฉี่ -ฉีก -ฉีด -ฉุ -ฉุก -ฉุด -ฉุน -ฉุป -ฉุย -ฉุยฉาย -ฉุริกา -ฉู่ -ฉู่ฉี่ -ฉูด -ฉูดฉาด -เฉ -เฉก -เฉโก -เฉ่ง -เฉด -เฉท -เฉนียน -เฉพาะ -เฉย -เฉลย -เฉลว -เฉลา -เฉลิม -เฉลี่ย -เฉลียง -เฉลี่ยง -เฉลียบ -เฉลียว -เฉวียง -เฉวียน -เฉอะ -เฉา -เฉาก๊วย -เฉาโฉด -เฉาฮื้อ -เฉาะ -เฉิด -เฉิบ -เฉิบๆ -เฉียง -เฉียงพร้าดำ -เฉียงพร้านางแอ -เฉียงพร้ามอญ -เฉียด -เฉียบ -เฉี่ยว -เฉือน -เฉื่อย -แฉ -แฉ่ -แฉก -แฉกๆ -แฉง -แฉ่ง -แฉลบ -แฉล้ม -แฉล้มแช่มช้อย -แฉละ -แฉว -แฉะ -โฉ -โฉ่ -โฉเก -โฉ่งฉ่าง -โฉงเฉง -โฉด -โฉนด -โฉบ -โฉเบ๊ -โฉม -โฉมงาม -โฉลก -ไฉน -ไฉไล -ช -ชก -ชกา -ชคร -ชคัต -ชคัท -ชคัน -ชง -ชงคา -ชงโค -ชงฆ์ -ชงฆา -ชฎา -ชฎิล -ชด -ชทึง -ชน -ชนก -ชนกกรรม -ชนนี -ชนบท -ชนม์ -ชนวน -ชนะ -ชนัก -ชนา -ชนาง -ชนิ -ชนิก -ชนิกา -ชนิด -ชนิดา -ชนิศ -ชเนตตี -ชบา -ชปน -ชปโยค -ชม -ชมชวน -ชมดชม้อย -ชมนาด -ชมบ -ชมพู -ชมพู่ -ชมพูพาดบ่า -ชมรม -ชมเลาะ -ชมสวนสวรรค์ -ชม้อย -ชมัน -ชมา -ชม้าย -ชไม -ชย -ชยัมบดี -ชยา -ชยุติ -ชโย -ชร -ชรตา -ชรทึง -ชรโมล -ชรไม -ชรราง -ชรริน -ชรแรง -ชรแร่ง -ชรเลือด -ชรโลง -ชรอกชรัง -ชรออบ -ชรอัด -ชรอ่ำ -ชรอื้อ -ชรอุ่ม -ชระ -ชระงม -ชระง่อน -ชระงำ -ชระดัด -ชระดื่น -ชระเดียด -ชระบอบ -ชระบาบ -ชระมด -ชระมัว -ชระมื่น -ชระมุกชระมอม -ชระมุ่น -ชระเมียง -ชระเมียน -ชระลอ -ชระลอง -ชระล่อง -ชระลั่ง -ชระลัด -ชระล้ำ -ชระลุ -ชระแลง -ชระอับ -ชระอาบ -ชระเอม -ชรัด -ชรัว -ชรา -ชรากากี -ชราบ -ชราบชรับ -ชรายุ -ชริน -ชรุก -ชรูบ -ชล -ชลี -ชลูกา -ชเล -ชโลง -ชโลม -ช่วง -ช่วงทรัพย์ -ช่วงสิทธิ์ -ชวด -ชวน -ชวย -ช่วย -ชวร -ชวลิต -ชวัก -ชวา -ชวาล -ชวาลา -ชแวง -ช่อ -ชอก -ช็อก -ช็อกการี -ช็อกโกเลต -ช็อกโกแลต -ชอง -ช่อง -ช้อง -ช้องนาง -ช้องนางคลี่ -ช้องแมว -ชอน -ช่อน -ช้อน -ช้อนนาง -ชอบ -ชอม -ช่อย -ช้อย -ช้อยช่างรำ -ช้อยนางรำ -ชอล์ก -ชอ่ำ -ชอื้อ -ชอุ่ม -ชะ -ชะคราม -ชะงอก -ชะง่อน -ชะงัก -ชะงัด -ชะงาบ -ชะง้ำ -ชะงุ้ม -ชะเง้อ -ชะเงื้อม -ชะแง้ -ชะโงก -ชะฉ่า -ชะช่อง -ชะช้า -ชะชิด -ชะดีชะร้าย -ชะโด -ชะตา -ชะต้า -ชะนี -ชะนุง -ชะเนาะ -ชะพลู -ชะเพลิง -ชะมด -ชะมดต้น -ชะมบ -ชะมวง -ชะมัง -ชะมัด -ชะแม่ -ชะรอย -ชะลอ -ชะลอม -ชะละกา -ชะล่า -ชะลิน -ชะลูด -ชะเลง -ชะเลย -ชะแล็ก -ชะแลง -ชะวัง -ชะวาก -ชะวาด -ชะวุ้ง -ชะเวิกชะวาก -ชะแวง -ชะอม -ชะอ้อน -ชะเอม -ชะโอน -ชัก -ชักคราม -ชักช้า -ชักหน้า -ชัง -ชั่ง -ชังคา -ชังเฆยยกะ -ชัชวาล -ชัฏ -ชัด -ชัดช้า -ชัน -ชั้น -ชันกาด -ชันชี -ชันตาฆร -ชันตุ -ชันนะตุ -ชันนุ -ชันนุกะ -ชันโรง -ชันษา -ชันสูตร -ชัปน -ชัพ -ชัมพูนท -ชัย -ชัยกระสพ -ชัยบาน -ชัยพฤกษ์ -ชัยภูมิ -ชัยเภรี -ชัยมงคล -ชัยมงคลคาถา -ชัลลุกา -ชั่ว -ชั้ว -ชัวชม -ชั่วแต่ว่า -ชา -ช้า -ชาคร -ชาคริต -ชาคริยานุโยค -ช่าง -ช้าง -ช้างกระ -ช่างกระไร -ช้างดำ -ช้างแดง -ช่างทอง -ช่างน้าว -ช้างเผือก -ช่างเหล็ก -ช้าช่อน -ชาญ -ชาด -ชาดก -ชาตบุษย์ -ชาตรี -ชาตะ -ชาตา -ชาติ -ชาติธรรม -ชาติพันธุ์ -ชาติพันธุ์วรรณนา -ชาติพันธุ์วิทยา -ชาติภูมิ -ชาติมาลา -ชาติรส -ชาติสัมบันน์ -ชาน -ชานวาทิก -ชานุ -ชานุกะ -ช้าปี่ -ช้าปี่ไหน -ช้าแป้น -ช้าพลู -ชาม -ชามพูนท -ชามาดร -ชามาดา -ชามาตุ -ชาย -ชายธง -ชายผ้าสีดา -ชายา -ชาร -ชารี -ชาล -ชาลา -ชาลินี -ช้าเลือด -ชาว -ชาวี -ชาห์ -ช้าหมอง -ชาหรันนาวี -ชำ -ช่ำ -ช้ำ -ชำงัด -ชำงาย -ชำงือ -ช่ำชอง -ช่ำช่า -ชำนน -ชำนรร -ชำนะ -ชำนัญ -ชำนัน -ชำนาญ -ชำนิ -ชำเนียน -ชำเนียร -ชำมะนาด -ชำมะเลียง -ชำร่วย -ชำระ -ช้ำรั่ว -ชำรุด -ชำเรา -ชำเราะ -ชำลา -ชำเลือง -ชำแหละ -ชิ -ชิง -ชิ่ง -ชิงชัง -ชิงชัน -ชิงช้า -ชิงช้าชาลี -ชิงชี่ -ชิงพลบ -ชิงฮื้อ -ชิชะ -ชิชิ -ชิณณะ -ชิด -ชิเดนทรีย์ -ชิต -ชิน -ชิ่น -ชิ้น -ชินโต -ชินบุตร -ชินสาสน์ -ชิม -ชิมแปนซี -ชิยา -ชิรณะ -ชิระ -ชิวหา -ชิสา -ชี -ชี่ -ชี้ -ชีพ -ชีฟอง -ชีรณ -ชีระ -ชีวะ -ชีอะห์ -ชืด -ชื่น -ชื้น -ชื่อ -ชื้อ -ชุ -ชุก -ชุกชี -ชุ่ง -ชุ้ง -ชุด -ชุติ -ชุน -ชุบ -ชุบชู -ชุม -ชุ่ม -ชุมนุม -ชุมพร -ชุมพา -ชุมเพ็ด -ชุมแพรก -ชุมรุม -ชุมสาย -ชุมแสง -ชุมเห็ด -ชุ่ย -ชุ่ยๆ -ชุลมุน -ชุลี -ชุษณะ -ชู -ชู้ -เช็ค -เช้ง -เชงเลง -เช้งวับ -เช็ด -เช็ดหน้า -เชน -เช่น -เชย -เชรา -เชราะ -เชริด -เชลง -เชลย -เชลแล็ก -เชลียง -เชวง -เชษฐา -เชอ -เช่า -เช้า -เชาว์ -เชาวน์ -เชิง -เชิงกล -เชิงซ้อน -เชิงเดียว -เชิงเดี่ยว -เชิงมุม -เชิงเวียน -เชิงอรรถ -เชิญ -เชิด -เชิ้ต -เชีย -เชี้ย -เชียง -เชี่ยน -เชี่ยนหมาก -เชียบ -เชี่ยม -เชียร -เชียร์ -เชียรณ์ -เชียว -เชี่ยว -เชื่อ -เชื้อ -เชือก -เชื่อง -เชื่องช้า -เชือด -เชือน -เชื่อม -เชื่อวัน -แช -แช่ -แช่ง -แชงมา -แชบ๊วย -แช่ม -แชมเปญ -แชมภู -แชร์ -แชรง -แชล่ม -แชะ -โชก -โชกๆ -โชกุน -โชค -โชงโลง -โชดก -โชดึก -โชต -โชตก -โชติ -โชน -โชมโรม -โชย -โชยงการ -โชยชาย -โชยติส -โชรม -โชว์ -ใช่ -ใช้ -ไช -ไชนะ -ไชย -ไชโย -ซ -ซก -ซ่ก -ซงดำ -ซ่งฮื้อ -ซง้า -ซด -ซน -ซ่น -ซ้น -ซบ -ซม -ซรอกซรัง -ซวด -ซวดเซ -ซวดทรง -ซวน -ซวย -ซอ -ซอก -ซอง -ซ่อง -ซ้อง -ซองพลู -ซองแมว -ซ้องแมว -ซอแซ -ซ้อแซ้ -ซอน -ซ่อน -ซ้อน -ซ่อนกลิ่น -ซ่อนทราย -ซอม -ซ่อม -ซ้อม -ซอมซ่อ -ซอย -ซอส -ซะซร้าว -ซะซ่อง -ซะซอเซีย -ซะซิกซะแซ -ซะซิบ -ซะเซาะ -ซะเซียบ -ซัก -ซักส้าว -ซัง -ซั้ง -ซังกะตาย -ซังแซว -ซังตาย -ซัด -ซั้น -ซันตาคลอส -ซับ -ซับซี่ -ซัม -ซัลฟา -ซัลโว -ซั้ว -ซัวปา -ซา -ซ่า -ซาก -ซากุระ -ซาไก -ซาง -ซ่าง -ซาด -ซาน -ซ่าน -ซาบซ่าน -ซาบซึ้ง -ซ่าโบะ -ซาปั๊ว -ซาแมเรียม -ซ้าย -ซาโยนาระ -ซาร์ -ซารินา -ซาลาเปา -ซาว -ซ่าหริ่ม -ซ้ำ -ซิ -ซิก -ซิกซี้ -ซิกแซ็ก -ซิการ์ -ซิงโคนา -ซิ่น -ซินตึ๊ง -ซินนามิก -ซินแส -ซิบ -ซิบๆ -ซิป -ซิฟิลิส -ซิ้ม -ซิลิคอน -ซิว -ซี -ซี่ -ซีก -ซี้ซอน -ซี้ซั้ว -ซีเซ็กไฉ่ -ซีเซียม -ซีด -ซีนอน -ซีป่าย -ซีเมนต์ -ซีเรียม -ซีลีเนียม -ซีอิ้ว -ซึก -ซึ่ง -ซึ้ง -ซึม -ซื่อ -ซื้อ -ซื่อๆ -ซื้อหน้า -ซุก -ซุกซน -ซุง -ซุน -ซุบ -ซุบซิบ -ซุบซู่ -ซุป -ซุ่ม -ซุ้ม -ซุ้มกระต่าย -ซุ่มซ่าม -ซุมแซว -ซุ่มเสียง -ซุย -ซู่ -ซู่กั้นรั้วไซมาน -ซูโครส -ซูด -ซู้ด -ซูดซาด -ซูบ -เซ -เซ็ก -เซแคนต์ -เซ็ง -เซ่ง -เซ้ง -เซ็งแซ่ -เซต -เซน -เซ็น -เซ่น -เซนติกรัม -เซนติเมตร -เซนติลิตร -เซ่นเหล้า -เซปักตะกร้อ -เซฟ -เซรา -เซราะ -เซรุ่ม -เซลเซียส -เซลล์ -เซลลูลอยด์ -เซลลูโลส -เซลส์แมน -เซ่อ -เซอร์ -เซอร์โคเนียม -เซอะ -เซา -เซ้าซี้ -เซาะ -เซิง -เซิ้ง -เซียน -เซียบ -เซียมซี -เซียว -เซี่ยว -เซี้ยว -เซี่ยวกาง -เซื่อง -แซ -แซ่ -แซ็กคาริน -แซกุย -แซง -แซงแซว -แซด -แซดๆ -แซนด์วิช -แซบ -แซม -แซยิด -แซ่ว -แซะ -โซ -โซ่ -โซก -โซ่ง -โซงโขดง -โซเซ -โซดา -โซดาแผดเผา -โซดาไฟ -โซเดียม -โซม -โซรม -โซลา -ไซ -ไซ้ -ไซเกิล -ไซโคลน -ไซน์ -ไซยาไนด์ -ไซร้ -ไซเรน -ไซโล -ไซ่หู้ -ฌ -ฌลา -ฌลิ -ฌษ -ฌัลล์ -ฌัลลกัณฐ์ -ฌาน -ฌานลาภี -ฌานาทิสังกิเลสาทิฌาน -ฌูก -เฌอ -โฌฑ -ญ -ญญ่าย -ญวน -ญัตติ -ญาณี -ญาดา -ญาตปริญญา -ญาตัตถจริยา -ญาติ -ญาน -ญาปก -ญายปฏิบัติ -ญายปฏิปันโน -ญิน -ญิบ -ญี่ -ญี่ปุ่น -เญยธรรม -ไญยธรรม -ฎ -ฎคระ -ฎีกา -ฏ -ฏังกบดี -ฏังกศาลา -ฏังกะ -ฏังการ -ฏังคะ -ฏังคา -ฏัฏฏนี -ฏางกร -ฏาร -ฏุณฐุก -ฐ -ฐกัด -ฐากูร -ฐาน -ฐานะ -ฐานียะ -ฐาปนา -ฐายี -ฐิต -ฐิติ -ฑ -ฑาหก -ฑาหะ -ฑิมภ์ -ฒ -เฒ่า -ณ -ณรงค์ -ณัฐ -เณร -ด -ดก -ดง -ด้ง -ดงวาย -ด้น -ดนโด่ -ดนตรี -ดนย -ดนยา -ดนัย -ดนุ -ดนู -ดบัน -ดบัสวิน -ดบัสวินี -ดบัสวี -ดม -ดมไร -ดร -ดรงค์ -ดรณิ -ดรณี -ดรธาน -ดรรชนี -ดรลา -ดราฟต์ -ดริ -ดรี -ดรุ -ดรุณ -ดรุณี -ดฤถี -ดล -ดลภาค -ดวง -ด้วง -ดวจ -ดวด -ด่วน -ด้วน -ด้วมเดี้ยม -ด้วย -ดวล -ดอก -ดอกกะทือ -ดอกทอง -ดอกฟ้อน -ดอกไม้ทะเล -ดอกสร้อย -ดอกอาว -ดอง -ด้อง -ด่องๆ -ด้องๆ -ดองฉาย -ดองดึง -ดองหาย -ดอด -ดอน -ด่อน -ดอม -ด้อม -ดอย -ด้อย -ดอลลาร์ -ดะ -ดะโต๊ะยุติธรรม -ดะหมัง -ดัก -ดักดน -ดักดาน -ดักเดี้ย -ดักแด้ -ดักษก -ดักษณ -ดักษณี -ดักษัน -ดัง -ดั่ง -ดั้ง -ดั้งเดิม -ดัชนี -ดัด -ดัดปลัก -ดัตช์ -ดัน -ดั้น -ดันเหิม -ดับ -ดัมพ์ -ดั้วเดี้ย -ดัสกร -ดัสกรี -ดา -ด่า -ดาก -ด่าง -ด้าง -ดาด -ดาดตะกั่ว -ดาน -ด่าน -ด้าน -ดาบ -ดาบส -ดาม -ด้าม -ด้ามจิ้ว -ดามพ์ -ดามร -ดาย -ด้าย -ดาร -ดารก -ดารณี -ดารดาษ -ดารา -ดาล -ดาลัด -ดาลุ -ดาลุช -ดาไลลามะ -ดาว -ด่าว -ด้าว -ดาวกระจาย -ดาวดึงส์ -ดาวบส -ดาวเรือง -ดาษ -ดาหงัน -ดาหลัง -ดาฬ -ดำ -ด่ำ -ด้ำ -ดำๆแดงๆ -ดำกล -ดำเกิง -ดำแคง -ดำดง -ดำนาณ -ดำนาน -ดำนู -ดำเนิน -ดำเนียน -ดำเนียร -ดำบล -ดำพอง -ดำรัส -ดำริ -ดำรี -ดำรู -ดำไร -ดำฤษณา -ดำเลิง -ดำแลง -ดำหนัก -ดำหนิ -ดำอวด -ดิก -ดิกๆ -ดิง -ดิ่ง -ดิฉัน -ดิฐ -ดิตถ์ -ดิถี -ดิน -ดิ้น -ดิบ -ดิบดี -ดิรัจฉาน -ดิเรก -ดิลก -ดิ่ว -ดิ้ว -ดิ้วเดี้ยว -ดิษฐ์ -ดิสโพรเซียม -ดี -ดีกรี -ดีฉัน -ดีเซล -ดีด -ดีดีที -ดีนาคราช -ดีบุก -ดีปลี -ดีเปรสชัน -ดีผา -ดีพร -ดียา -ดีหมี -ดีหลี -ดึก -ดึง -ดึ่ง -ดึงสะ -ดึ่ม -ดื่น -ดื่ม -ดือ -ดื้อ -ดุ -ดุก -ดุกดิก -ดุกทะเล -ดุ้ง -ดุ้งดิ้ง -ดุจ -ดุจดัง -ดุจหนึ่ง -ดุด -ดุน -ดุ้น -ดุบๆ -ดุม -ดุ่ม -ดุ่มๆ -ดุ่ย -ดุรค -ดุรงค์ -ดุรงคี -ดุริยะ -ดุริยางค์ -ดุล -ดุษฎี -ดุษณี -ดุษณีภาพ -ดุษิต -ดุสิต -ดุเหว่า -ดู -ดูกไก่ดำ -ดูกค่าง -ดูกช้าง -ดูกร -ดูด -เด -เด่ -เดก -เด็ก -เดกซ์โทรส -เดคากรัม -เดคาเมตร -เดคาลิตร -เด้ง -เด็จ -เดช -เดชน์ -เดชนะ -เดชะ -เดโช -เดซิกรัม -เดซิเมตร -เดซิลิตร -เด็ด -เดน -เด่น -เดนมาร์ก -เดรัจฉาน -เด๋อ -เด๋อด๋า -เดา -เด่า -เด้า -เด่าๆ -เด้าดิน -เด้าลม -เดาะ -เดิน -เดิ่น -เดิม -เดี้ย -เดียง -เดียด -เดียร -เดียรดาษ -เดียรถ์ -เดียรถีย์ -เดียรัจฉาน -เดียว -เดี่ยว -เดี๋ยว -เดียะ -เดื่อ -เดือก -เดื่อง -เดือด -เดือน -เดือย -แด -แด่ -แดก -แด็กๆ -แดกงา -แดกแด้ -แด็กแด้ -แดง -แดงน้ำ -แดด -แดน -แด่น -แด่วๆ -แดะ -โด -โด่ -โดกเดก -โด่ง -โดด -โดน -โดนัต -โด๊ปยา -โดม -โดมร -โดย -โดร -โดรณ -ใด -ได -ได้ -ไดแซ็กคาไรค์ -ไดนาไมต์ -ไดโนเสาร์ -ไดเรกตริกซ์ -ไดอารี -ต -ตก -ต๊กโต -ตง -ต๋ง -ตงฉิน -ตงิด -ตงุ่น -ตด -ตถาคต -ตทังควิมุตติ -ตน -ต้น -ตนัย -ตนุ -ตบ -ตบยุง -ตบะ -ตปะนียะ -ตม -ต้ม -ตมูก -ตโมโชติปรายโน -ตโมตมปรายโน -ตโมนุท -ตโมไพรี -ตโมหร -ตยาค -ตยาคี -ตยุติ -ตรง -ตรงๆ -ตรณี -ตรม -ตรมวล -ตรรกะ -ตรลบ -ตรลอด -ตรละ -ตรลา -ตรลาด -ตรเลิด -ตรวจ -ตรวด -ตรวน -ตรวย -ตรอก -ตรอง -ตรอมใจ -ตรอมตรม -ตระ -ตระกล -ตระกวน -ตระกอง -ตระกัด -ตระการ -ตระกูล -ตระคัร -ตระง่อง -ตระจัก -ตระชัก -ตระดก -ตระดาษ -ตระเตรียม -ตระแต้น -ตระทรวง -ตระนาว -ตระไน -ตระบก -ตระบอก -ตระบอง -ตระบัด -ตระบัน -ตระเบ็ง -ตระแบ่ -ตระแบก -ตระแบง -ตระแบน -ตระแบ่น -ตระโบม -ตระพอง -ตระพัง -ตระมื่น -ตระโมจ -ตระลาการ -ตระวัน -ตระเว็ด -ตระเวน -ตระเวนไพร -ตระเวนวัน -ตระสัก -ตระหง่อง -ตระหง่าน -ตระหนก -ตระหนัก -ตระหน่ำ -ตระหนี่ -ตระอร -ตระอาล -ตระโอม -ตรัง -ตรังค์ -ตรับ -ตรับฟัง -ตรัย -ตรัยตรึงศ์ -ตรัส -ตรัสสา -ตรา -ตรากตรำ -ตราชู -ตราบ -ตราสัง -ตรำ -ตร่ำ -ตริ -ตริว -ตรี -ตรีประดับ -ตรีปวาย -ตรีพิธพรรณ -ตรีเพชรทัณฑี -ตรีเพชรพวง -ตรียมก -ตรียัมปวาย -ตรึก -ตรึง -ตรุ -ตรุณ -ตรุย -ตรุษ -ตรุษจีน -ตรู -ตรู่ -ตฤณ -ตฤตียะ -ตฤท -ตฤป -ตฤษณา -ตฤๅ -ตล -ตลก -ตลกบาตร -ตลบ -ตลอด -ตละ -ตลับ -ตลับนาก -ตลาด -ตลิ่ง -ตลึง -ตวง -ต่วน -ต้วมเตี้ยม -ตวัก -ตวัด -ตวาด -ตอ -ต่อ -ต้อ -ตอก -ต๊อก -ต๊อกต๋อย -ตอง -ต้อง -ตองกราย -ต้องการ -ตองตอย -ตองตึง -ต้องเต -ตองแตก -ต่องแต่ง -ตองเปรียง -ต้องสู้ -ตองเหลือง -ตอด -ตอดต่อ -ตอน -ต้อน -ตอบ -ตอเบา -ตอม -ต่อม -ต๋อม -ต่อมน้ำ -ต่อย -ต้อย -ต้อยตริ่ง -ต้อยติ่ง -ต้อยตีวิด -ตอแย -ตอร์ปิโด -ต่อไส้ -ตอแหล -ตะ -ตะกรน -ตะกรม -ตะกรวย -ตะกร้อ -ตะกร่อม -ตะกรัน -ตะกรับ -ตะกร้า -ตะกราม -ตะกรุด -ตะกรุม -ตะกรุมตะกราม -ตะกละ -ตะกลาม -ตะกวด -ตะกอ -ตะกอน -ตะกัง -ตะกั่ว -ตะกาง -ตะกาด -ตะกาย -ตะกาว -ตะกี้ -ตะกุกตะกัก -ตะกุย -ตะกู -ตะกูด -ตะเกียกตะกาย -ตะเกียง -ตะเกียบ -ตะแก -ตะแก่ -ตะแกรง -ตะโก -ตะโก้ -ตะโกก -ตะโกน -ตะโกรง -ตะโกรม -ตะไกร -ตะขบ -ตะขอ -ตะขาบ -ตะขิดตะขวง -ตะเข้ -ตะเข็บ -ตะเขิง -ตะโขง -ตะคร้อ -ตะครอง -ตะครั่นตะครอ -ตะคร้ำ -ตะคริว -ตะครุบ -ตะคลับตะคล้าย -ตะคอก -ตะคัน -ตะค้า -ตะคาก -ตะคาง -ตะค้าน -ตะคิว -ตะคุ่ม -ตะเครียว -ตะเคียน -ตะเคียนทอง -ตะเคียว -ตะแคง -ตะไคร่ -ตะไคร้ -ตะเฆ่ -ตะแง้ -ตะติน -ตะแตร้น -ตะนอย -ตะนาว -ตะบม -ตะบอง -ตะบองกัน -ตะบองเพชร -ตะบอย -ตะบัน -ตะบิ้ง -ตะบิด -ตะบิดตะบอย -ตะบี้ตะบัน -ตะบึง -ตะบุ้ย -ตะบุ้ยๆ -ตะบูน -ตะเบ็ง -ตะเบ็งมาน -ตะแบก -ตะแบง -ตะโบม -ตะไบ -ตะปบ -ตะปลิง -ตะปัดตะป่อง -ตะปิ้ง -ตะปุ่มตะป่ำ -ตะปู -ตะพง -ตะพด -ตะพอง -ตะพัก -ตะพัง -ตะพัด -ตะพั้น -ตะพาก -ตะพาน -ตะพาบ -ตะพาบน้ำ -ตะพาย -ตะพึด -ตะพุ่น -ตะเพรา -ตะเพิง -ตะเพิด -ตะเพิ่น -ตะเพียน -ตะโพก -ตะโพง -ตะโพน -ตะเภา -ตะใภ้ -ตะม่อ -ตะมอย -ตะมอยสะลา -ตะรัง -ตะรังกะนู -ตะรังตัง -ตะราง -ตะลอง -ตะลอน -ตะล่อม -ตะล่อมป้อม -ตะละ -ตะลาน -ตะลิงปลิง -ตะลิบ -ตะลีตะลาน -ตะลึง -ตะลุง -ตะลุ่ม -ตะลุมบอน -ตะลุ่มโปง -ตะลุมพอ -ตะลุมพุก -ตะลุ่มอิด -ตะลุย -ตะเลง -ตะแลงแกง -ตะไล -ตะวัน -ตะวาง -ตะเวน -ตะหนึ่งรัด -ตะหลิว -ตะหลุก -ตะหลุง -ตะเหลนแป๋น -ตะเหลาะเปาะ -ตะแหง่ว -ตะแหมะแขะ -ตะแหลนแป๋น -ตะโหงก -ตั๊ก -ตักกะ -ตักเตือน -ตั๊กแตน -ตักร -ตักษก -ตักษณ -ตักษณี -ตักษัย -ตัง -ตั่ง -ตั้ง -ตังเก -ตังฉ่าย -ตังติด -ตังเม -ตังวาย -ตังโอ๋ -ตัจฉก -ตัจฉนี -ตัณฑุล -ตัณหักษัย -ตัณหา -ตัด -ตัถย์ -ตัน -ตันตระ -ตันติ -ตันหก -ตันหยง -ตันเหิม -ตับ -ตับเต่า -ตับปิ้ง -ตับเป็ด -ตัว -ตั๋ว -ตัวตืด -ตั้วโผ -ตั้วสิว -ตั้วเหี่ย -ตา -ตาก -ตาง -ต่าง -ตาด -ตาน -ต่าน -ต้าน -ตานนกกด -ตานเสี้ยน -ตานหก -ตานหม่อน -ตานเหลือง -ตานี -ตาบ -ตาฝั่ง -ตาม -ตามพะ -ตามะแน -ตามิน -ตาย -ต้าย -ต๊ายตาย -ตาราไต -ตาเรือชัย -ตาล -ตาลาน -ตาลุ -ตาลุช -ตาว -ตาเสือ -ตาหลิ่ง -ตาฬ -ตำ -ต่ำ -ตำนาน -ตำเนิน -ตำเนียน -ตำบล -ตำแบ -ต้ำปุก -ต้ำผาง -ต้ำพรวด -ตำมะหงง -ตำแย -ตำรวจ -ตำรับ -ตำรา -ตำรุ -ตำลึง -ตำเสา -ตำหนัก -ตำหนิ -ตำหระ -ตำแหน่ง -ติ -ติกขญาณ -ติกะ -ติกาหลัง -ติง -ติ่ง -ติ๋ง -ติ๋งๆ -ติ่งตั่ง -ติงสติ -ติ่งหาย -ติณ -ติณวัตถารกวินัย -ติด -ติดๆ -ติตติก -ติตติร -ติตถ -ติถี -ติปา -ติปาถะ -ติมิ -ติมิงคละ -ติร -ติรัจฉาน -ติล -ติลก -ติ้ว -ติสรณคมนูปสัมปทา -ตี -ตี่ -ตี๋ -ตีทอง -ตีน -ตีนจ้ำ -ตีนเทียน -ตีนแรด -ตีบ -ตีรถะ -ตีระ -ตีหมา -ตึ -ตึๆ -ตึก -ตึกๆ -ตึ้กๆ -ตึ้กตั้ก -ตึง -ตึดตื๋อ -ตึ๊ดตื๋อ -ตืด -ตื่น -ตื้น -ตื้อ -ตื๊อ -ตื๋อ -ตือฮวน -ตุ -ตุ๊ -ตุๆ -ตุ๊กแก -ตุ๊กตา -ตุ๊กต่ำ -ตุ๊กต่ำน้ำทอง -ตุกติก -ตุ๊กติ๊ก -ตุ๊กตุ่น -ตุ๊กตุ๋ย -ตุง -ตุ้งก่า -ตุ้งติ้ง -ตุ๊ดตู่ -ตุน -ตุ่น -ตุ๋น -ตุ้นแซะ -ตุ่นต่าน -ตุนาหงัน -ตุบๆ -ตุ้บๆ -ตุ๊บป่อง -ตุปัดตุป่อง -ตุปัดตุเป๋ -ตุ่ม -ตุ้ม -ตุ๋ม -ตุ๊มๆ -ตุ๊มๆต้อมๆ -ตุ้มกว้าว -ตุมกา -ตุ้มแซะ -ตุมตัง -ตุ้มเต๋น -ตุ้มปี่ -ตุมพ -ตุ่ย -ตุ้ย -ตุ๊ย -ตุ่ยๆ -ตุ้ยๆ -ตุ๋ยตุ่ย -ตุรค -ตุรงค์ -ตุริยางค์ -ตุลสิ -ตุลา -ตุหรัดตุเหร่ -ตู -ตู่ -ตู้ -ตูก -ตูด -ตูดงอน -ตูบ -ตูม -ตูลิ่นฮื้อ -ตูหนา -เต -เตก -เต็ก -เต็ง -เต่ง -เตช -เตโช -เต้น -เต็นท์ -เต็ม -เตย -เต้ย -เต๊ย -เตร่ -เตร็ด -เตร็ดเตร่ -เตร็ดเตรน -เตรน -เตริง -เตรียด -เตรียบ -เตรียม -เตรียมตรม -เตละ -เตลิด -เตว็ด -เต่อ -เตอะ -เตะ -เต๊ะ -เต๊ะจุ๊ย -เต๊ะท่า -เตา -เต่า -เต้า -เต๋า -เต่ากระสุน -เต่ากินผักบุ้ง -เต่าเกียด -เต้าเจี้ยว -เต่าทอง -เต่าทอเสื่อ -เต้าทึง -เต่าบ้า -เต่ารั้ง -เต่าร้าง -เต่าเลือน -เต้าส่วน -เต้าเสียบ -เต่าหับ -เต้าหู้ -เต้าฮวย -เต๊าะ -เตาะแตะ -เติ่ง -เตินเต่อ -เติบ -เติม -เตี่ย -เตี้ย -เตียง -เตียน -เตียบ -เตี๊ยม -เตี๋ยม -เตียรถ์ -เตียว -เตี่ยว -เตื้อ -เตือน -แต่ -แต้ -แต่ๆ -แตก -แต่ก่อนแต่กี้ -แต่กี้แต่ก่อน -แตง -แต่ง -แตงเม -แต้จิ๋ว -แตด -แต๊ดแต๋ -แตน -แต้ม -แตร -แตระ -แต้วแร้ว -แตะ -โต -โต้ -โตก -โต้ง -โต้งๆ -โตงๆเตงๆ -โตงเตง -โตฎก -โต๊ด -โต๋เต๋ -โตน -โตนด -โต้โผ -โตมร -โตมรธร -โตย -โตรก -โตรกไตร -โตรด -โต้หลง -โต๊ะ -ใต้ -ไต -ไต่ -ไต้ -ไต๋ -ไต้ก๋ง -ไต้ฝุ่น -ไต่ไม้ -ไตร -ไตรกิศยา -ไตรดายุค -ไตร่ตรอง -ไตรย -ไต้หวัน -ไต้อ๋อง -ถ -ถก -ถกล -ถงัน -ถงาด -ถด -ถน -ถนน -ถนป -ถนอม -ถนัด -ถนัน -ถนำ -ถนิม -ถนิมสร้อย -ถบ -ถบดี -ถม -ถ่ม -ถมอ -ถมึงทึง -ถล -ถลก -ถลกบาตร -ถลน -ถลม -ถล่ม -ถลอก -ถลัก -ถลัน -ถลา -ถลาก -ถลาย -ถลำ -ถลีถลำ -ถลึงตา -ถลุง -ถลุน -ถ่วง -ถ้วน -ถ้วย -ถ้วยโถง -ถวัด -ถวัล -ถวัลย์ -ถวาย -ถวิน -ถวิล -ถ่อ -ถ้อ -ถอก -ถอง -ถ่อง -ถ้อง -ถอด -ถอน -ถอบ -ถอบแถบ -ถ่อม -ถอย -ถ่อย -ถ้อย -ถะ -ถะกัด -ถะเกิน -ถะโกน -ถะถั่น -ถะถับ -ถะถุนถะถัน -ถะมัดถะแมง -ถัก -ถัง -ถั่ง -ถัณฑิล -ถัด -ถัทธ -ถัน -ถั่น -ถั่นๆ -ถับ -ถับๆ -ถัมภ์ -ถัว -ถั่ว -ถั่วขาว -ถา -ถ้า -ถาก -ถาง -ถ่าง -ถาด -ถาน -ถ่าน -ถาบ -ถาม -ถามะ -ถ่าย -ถ่ายเดียว -ถ่าว -ถาวร -ถาวรธิรา -ถาวรวัตถุ -ถ้ำ -ถิ่น -ถี -ถี่ -ถี่ๆ -ถีบ -ถีบฉัด -ถึก -ถึง -ถือ -ถุง -ถุน -ถุย -ถุล -ถุลละ -ถู -ถูก -เถกิง -เถน -เถมิน -เถร -เถระ -เถลไถล -เถลิก -เถลิง -เถลือกถลน -เถ่อ -เถอะ -เถา -เถ้า -เถาคัน -เถาคันเหล็ก -เถาเงาะ -เถามวก -เถาวัลย์เขียว -เถาวัลย์ปูน -เถาวัลย์เปรียง -เถาวัลย์ยอดด้วน -เถาวัลย์เหล็ก -เถาสิงโต -เถาหัวด้วน -เถาะ -เถิก -เถิง -เถิด -เถิดเทิง -เถิน -เถียง -เถียร -เถือ -เถือก -เถื่อน -แถ -แถก -แถง -แถน -แถบ -แถม -แถลง -แถลบ -แถว -โถ -โถง -โถงเถง -โถบ -โถม -โถมนาการ -ไถ -ไถ่ -ไถ้ -ไถง -ไถล -ท -ทก -ทกล้า -ทแกล้ว -ท่ง -ทงัน -ทชี -ทด -ทดโทร่ห -ทท -ทธิ -ทน -ท้น -ทนดี -ทนต์ -ทนโท่ -ทนม -ทนสมุทร -ทนาย -ทบ -ทบวง -ทม -ทมก -ทมน -ทมบ -ทมอ -ทมิฬ -ทเมิน -ทโมน -ทยอย -ทยา -ทแยง -ทร -ทรง -ทรงกระเทียม -ทรงบาดาล -ทรทึง -ทรพี -ทรมาทรกรรม -ทรมาน -ทรมุก -ทรรทึง -ทรรป -ทรรปณ์ -ทรรปณะ -ทรรศนะ -ทรรศนีย์ -ทรเล่ห์ -ทรวง -ทรวด -ทรวดทรง -ทรวาร -ทรสองทรสุม -ทรสาย -ทรสุม -ทรหด -ทรหน -ทรหวล -ทรหึง -ทรหึงทรหวล -ทรหู -ทรเหล -ทรอ -ทรอมโบน -ทรอึง -ทรอุ้ม -ทระนง -ทระนาว -ทรัพย์ -ทรัมเป็ต -ทรัสต์ -ทรานซิสเตอร์ -ทราบ -ทราม -ทราย -ทรายขาว -ทริทร -ทรุด -ทรุม -ทรุมขัณฑ์ -ทรุมมัย -ทรุมวาสี -ทรุมเศรษฐ์ -ทรุมาริ -ทรุมาลัย -ทรู่ -ทฤษฎี -ทล -ทลบม -ทลอึง -ทลาย -ทลิท -ทลิททก -ทวง -ท้วง -ท่วงท่า -ท่วงทำนอง -ท่วงที -ทวด -ทวดึงส์ -ทวน -ท้วน -ท่วม -ท้วม -ท้วมๆ -ทวย -ท่วย -ท้วย -ทวยะ -ทวอย -ทวัตดึงส์ -ทวัย -ทวา -ทว่า -ทวาบรยุค -ทวาย -ทวาร -ทวาราวดี -ทวิ -ทวิช -ทวิตีย -ทวิตียา -ทวิร -ทวี -ทวีป -ทวีปี -ทศ -ทศา -ทศางค์ -ทสมี -ทสา -ทหระ -ทหาร -ทอ -ท่อ -ท้อ -ทอก -ทอง -ท่อง -ท้อง -ทองกวาว -ทองเครือ -ทองธรรมชาติ -ทองเผือก -ทองพระขุน -ทองพลุ -ท้องพลุ -ทองพันช่าง -ทองพันดุล -ทองภู -ทองม้วน -ทองย้อย -ทองลิน -ทองหลาง -ทองโหลง -ทองอุไร -ทอด -ทอน -ท่อน -ทอนซิล -ทอฟฟี่ -ทอม -ท่อมๆ -ทอย -ทอร์นาโด -ทอเรียม -ทะ -ทะงัน -ทะท่าว -ทะเทียด -ทะนง -ทะนน -ทะนะ -ทะนา -ทะนาน -ทะนุ -ทะบู -ทะเบียน -ทะมัดทะแมง -ทะมึน -ทะมื่น -ทะแม่ง -ทะยาทะแยแส -ทะยาน -ทะเยอทะยาน -ทะแย -ทะร่อทะแร่ -ทะลวง -ทะลอก -ทะล่อทะล่า -ทะลัก -ทะลักทะแลง -ทะลาย -ทะลิ่น -ทะลึ่ง -ทะลุ -ทะลุทะลาด -ทะเล -ทะเล้น -ทะเลาะ -ทะวาย -ทะเวน -ทัก -ทักข์ -ทักขิญ -ทักขิณ -ทักขิณา -ทักขิณาบถ -ทักขิณาวัฏ -ทักขิโณทก -ทักขิไณยบุคคล -ทักทอ -ทักทิน -ทักษะ -ทักษา -ทักษิณ -ทักษิณา -ทัคธ์ -ทัง -ทั่ง -ทั้ง -ทังวล -ทังวี้ทังวล -ทังสเตน -ทัณฑกรรม -ทัณฑฆาต -ทัณฑธร -ทัณฑนายก -ทัณฑนิคม -ทัณฑนีติ -ทัณฑ์บน -ทัณฑปาศก -ทัณฑภัย -ทัณฑมุข -ทัณฑยาตรา -ทัณฑวิทยา -ทัณฑสถาน -ทัณฑสยาม -ทัณฑะ -ทัณฑิกา -ทัณฑิมา -ทัณฑี -ทัณฑีบท -ทัด -ทัดทา -ทัต -ทัน -ทันต์ -ทันติน -ทันตี -ทันธ์ -ทับ -ทับเกษตร -ทับทิม -ทับเล็ก -ทับสมิงคลา -ทัป -ทัปน -ทัพ -ทัพพะ -ทัพพี -ทัมมะ -ทั่ว -ทัศ -ทัศน์ -ทัศนะ -ทัศนา -ทัศนีย์ -ทัศไนย -ทัสนานุตริยะ -ทัฬห -ทัฬหิกรณ์ -ทัฬหีกรรม -ทา -ท่า -ท้า -ทาก -ทาง -ท้าง -ทาฐะ -ทาฐิกะ -ทาฒะ -ทาฒิกะ -ทาน -ท่าน -ทานกัณฑ์ -ทานกาม -ทานต์ -ทานตะวัน -ทานธรรม -ทานบดี -ทานบารมี -ทานพ -ทานศีล -ทานสมาบัติ -ทานาธิบดี -ทาบ -ทาม -ท่ามกลาง -ทามริก -ทาย -ท้าย -ทายก -ทายัช -ทายา -ทายาด -ทายาท -ทารก -ทาร์ซาน -ทารพี -ทาริกา -ทารุ -ทารุณ -ทารุณกรรม -ทาว -ท่าว -ท้าว -ทาษ -ทาส -ทาสี -ทำ -ทำงน -ทำนบ -ทำนวย -ทำนอง -ทำนาย -ทำนุ -ทำนูล -ทำเนา -ทำเนียบ -ทำเนียม -ทำมัง -ทำไม -ทำลาย -ทำเล -ทำวน -ทิคัมพร -ทิฆัมพร -ทิ้ง -ทิงเจอร์ -ทิ้งถ่อน -ทิ้งทูด -ทิช -ทิฏฐชุกรรม -ทิฏฐะ -ทิฏฐานุคติ -ทิฐิ -ทิด -ทิต -ทิน -ทินาท -ทิพ -ทิพย์ -ทิพา -ทิม -ทิ่ม -ทิมทอง -ทิว -ทิวงคต -ทิวทัศน์ -ทิวสะ -ทิวา -ทิศ -ทิศา -ที -ที่ -ทีป -ทีม -ทีวี -ทีเอนที -ทึก -ทึ่ง -ทึ้ง -ทึดทือ -ทึนทึก -ทึบ -ทึม -ทึ่ม -ทื่อ -ทุ -ทุก -ทุกข -ทุกข์ -ทุกขักษัย -ทุกฏ -ทุกษดร -ทุกะ -ทุกัง -ทุกูล -ทุคตะ -ทุคติ -ทุ่ง -ทุ้ง -ทุงงะ -ทุงเทง -ทุจจิณณะ -ทุจริต -ทุฏฐะ -ทุฏฐุลละ -ทุด -ทุตวิลัมพิตมาลา -ทุติยาสาฬห -ทุทรรศนนิยม -ทุน -ทุ่น -ทุนนิมิต -ทุนิยม -ทุบ -ทุบทู -ทุปปัญญา -ทุพพรรณ -ทุพพล -ทุพพลภาพ -ทุพภิกขภัย -ทุพภิกขันดรกัป -ทุม -ทุ่ม -ทุ้ม -ทุมโน -ทุย -ทุ้ย -ทุรน -ทุรัถยา -ทุรัศ -ทุราคม -ทุราจาร -ทุราธวา -ทุเรศ -ทุเรียน -ทุเรียนแขก -ทุลักทุเล -ทุเลา -ทุวิชาน -ทุวิธ -ทุศีล -ทุสสะ -ทุสสีล -ทู -ทู่ -ทู้ -ทู่ซี้ -ทูต -ทูตานุทูต -ทูน -ทูบ -ทูม -ทูเรนิทาน -ทูล -ทูเลียม -ทูษก -เท -เท่ -เทคนิค -เทคนีเซียม -เทคโนโลยี -เทง -เท้ง -เท้งเต้ง -เท้งทูด -เท็จ -เทนนิส -เทเบิลเทนนิส -เทป -เทพ -เทพทารู -เทพทาโร -เทพา -เทพิน -เทพี -เทพีปักษี -เทโพ -เทมปุระ -เทริด -เทลลูเรียม -เทวดา -เทวนะ -เทวภาวะ -เทวระ -เทววาจิกะ -เทววาจิสรณคมน์ -เทวศ -เทวษ -เทวสุคนธ์ -เทวอ -เทวัญ -เทวัน -เทวี -เทศ -เทศก -เทศน์ -เทศนา -เทศะ -เทห์ -เท่ห์ -เท่อ -เท้อ -เทอญ -เทอม -เทอร์เบียม -เทอร์โมมิเตอร์ -เทอะทะ -เทา -เท่า -เท้า -เท้าช้าง -เท่ามัก -เท้ายายม่อม -เท่ารึง -เท้าสาน -เทาะห์ -เทิก -เทิ่ง -เทิงบอง -เทิด -เทิน -เทิบ -เทิบๆ -เทิ้ม -เทียง -เทียน -เที้ยน -เทียบ -เทียร -เที้ยร -เทียว -เที่ยว -เทือ -เทื่อ -เทื้อ -เทือก -เทือกเขา -เทือกเถาเหล่ากอ -เทือน -แท่ -แท้ -แท็กซี่ -แทง -แท่ง -แท้ง -แท็งก์น้ำ -แทงทวย -แทงวิสัย -แทตย์ -แทน -แท่น -แทนเจนต์ -แทนทาลัม -แทบ -แทรก -แทรกเตอร์ -แทลเลียม -แทะ -โท -โท่ -โทกเทก -โทงๆ -โทงเทง -โทณะ -โทธก -โทน -โทนโท่ -โทมนัส -โทรณ -โทรม -โทราวิก -โทลา -โทษ -โทษกรณ์ -โทษคุณ -โทษตรัย -โทษทัณฑ์ -โทษโพย -โทษมหันต์ -โทษา -โทสะ -โทโส -โทหฬะ -โทหฬินี -ไท -ไท้ -ไทกอ -ไทเทเนียม -ไทฟอยด์ -ไทย -ไทยธรรม -ไทร -ไทรอยด์ -ไทวะ -ธ -ธง -ธงก์ -ธช -ธชี -ธตรฐ -ธน -ธนัง -ธนาคาร -ธนาณัติ -ธนาตม -ธนาธาร -ธนาธิบดี -ธนาธิป -ธนาธิปัตย์ -ธนานุเคราะห์ -ธนารักษ์ -ธนิต -ธนิษฐา -ธนุ -ธนู -ธเนศ -ธเนศวร -ธโนปจัย -ธไนศวรรย์ -ธม -ธมกรก -ธร -ธรง -ธรณ -ธรณิน -ธรณินทร์ -ธรณิศ -ธรณิศร -ธรณิศวร์ -ธรณี -ธรมาน -ธรรม -ธรรมะ -ธรา -ธริษตรี -ธเรศ -ธเรษตรี -ธวัช -ธังก -ธัช -ธัญ -ธันยา -ธันยาวาท -ธันวาคม -ธัมมะ -ธาดา -ธาตรี -ธาตวากร -ธาตุ -ธาตุมมิสสา -ธานิน -ธานินทร์ -ธานี -ธาร -ธารกำนัล -ธารคำนัล -ธารณ -ธารณะ -ธารณา -ธารา -ธาษตรี -ธำมรงค์ -ธำรง -ธิดา -ธิติ -ธีระ -ธุช -ธุดงค์ -ธุต -ธุตตะ -ธุม -ธุมะ -ธุระ -ธุรำ -ธุลี -ธุหร่ำ -ธูป -เธนุ -เธอ -เธียร -โธ่ -โธวน -น -นก -นกกระทุง -นกุล -นข -นค -นคร -นครกัณฑ์ -นครบาล -นครมัณฑนา -นครรัฐ -นครวาสี -นครโสภิณี -นครโสเภณี -นครหลวง -นคราทร -นครินทร์ -นคเรศ -นง -นงคุฐ -นท -นที -นนตรา -นนท์ -นนทก -นนทรี -นนทลี -นนทิ -นบ -นปุงสกลิงค์ -นปุงสกลึงค์ -นพเกตน์ -นพเก้า -นพคุณ -นพเคราะห์ -นพนิต -นพปฎล -นพพล -นพพวง -นพพัน -นพรัตน์ -นพศก -นพศูล -นภกานต์ -นภคช -นภคติ -นภจร -นภจักษุ -นภดล -นภทวีป -นภปราณ -นภมณฑล -นภมณี -นภมัย -นภรูป -นภเรณู -นภวิถี -นภศูล -นภสินธุ์ -นภา -นภากาศ -นภาลัย -นม -นมนาน -นมะ -นมักการ -นมัสการ -นมาซ -นยนะ -นยนา -นยะ -นยักษ์ -นรก -นรการ -นราธิป -นรินทร์ -นริศ -นริศวร -นรี -นเรนทรสูร -นเรศ -นเรศวร -นเรศวร์ชนช้าง -นเรศูร -นฤโฆษ -นฤตย์ -นฤนาท -นฤพาน -นฤมล -นฤมาณ -นฤมิต -นลาฏ -นลิน -นวกะ -นวด -นวนิยาย -นวม -น่วม -นวย -นวล -นวอรหาทิคุณ -นวังคสัตถุศาสน์ -นวาระ -นวาอรหาธิคุณ -นหาดก -นหาน -นหารุ -นหุต -นฬ -นฬป -นอ -นอก -นอง -น่อง -น้อง -น่องแน่ง -นอต -นอน -นอบ -น้อม -น้อย -น้อยหน่า -น้อยโหน่ง -นะ -นะแน่ง -นัก -นักกะ -นักขัต -นักงาน -นักตะ -นักร -นักษัตร -นักสราช -นัข -นัค -นัคคะ -นัง -นั่ง -นังคัล -นัจ -นัฏ -นัฏก -นัฑ -นัด -นัดดา -นัตถุ์ -นั่น -นั้น -นันททายี -นันทน์ -นันทนาการ -นันทิ -นับ -นับประสา -นับประสาอะไร -นัย -นัยน์ -นัยนา -นัว -นา -น่า -น้า -นาก -นากบุด -นากาสาหรี -นาค -นาคร -นาคา -นาคาวโลก -นาคาสน์ -นาคินทร์ -นาคี -นาเคนทร์ -นาเคศ -นาเคศวร -นาโครคินทร -นาง -นางนวล -นางนูน -นางแย้ม -นางรม -นางเล็ด -นางเลิ้ง -นางหงส์ -นางอาย -นางแอ่น -นาซา -นาซี -นาฏ -นาฏก -นาฏกรรม -นาฏดนตรี -นาฏศิลป์ -นาด -นาถ -นาท -นาที -นาน -น่าน -นานัครส -นานัตว -นานัปการ -นานา -นาเนก -นาบ -นาภิ -นาภี -นาม -นามบัตร -นามปากกา -นามแฝง -นามสกุล -นาย -น่าย -นายก -นายิกา -นารท -นารา -นารายณ์ -นารี -นาเรศ -นาลิวัน -นาลี -นาว -น้าว -นาวา -นาวิก -นาวิน -นาวี -นาเวศ -นาศ -นาสนะ -นาสา -นาสิก -นาฬิกา -นาฬิเก -นาฬี -นำ -น้ำ -น้ำตะกู -น้ำตะโก -นิ -นิกขะ -นิกขันต์ -นิกเขป -นิกร -นิกรอยด์ -นิกาย -นิเกิล -นิคม -นิครนถ์ -นิคหะ -นิคหิต -นิคาลัย -นิเคราะห์ -นิโคติน -นิโครธ -นิโครม -นิง -นิ่ง -นิจ -นิด -นิตย์ -นิติ -นิทร -นิทรรศการ -นิทรา -นิทัศน์ -นิทาฆ -นิทาน -นิเทศ -นิเทศก์ -นิธาน -นิธิ -นินทา -นินนะ -นินนาท -นินหุต -นินาท -นิบาต -นิปริยาย -นิปัจการ -นิพจน์ -นิพนธ์ -นิพพาน -นิพพิทา -นิพัทธ์ -นิพันธ์ -นิพิท -นิเพท -นิภา -นิ่ม -นิ้ม -นิมนต์ -นิมมาน -นิมมานรดี -นิมิต -นิยต -นิยม -นิยยาน -นิยยานิก -นิยัตินิยม -นิยาม -นิยาย -นิยุต -นิรพัตร -นิรมาณ -นิรมิต -นิรัพพุท -นิราศ -นิรุกติ -นิรุตติ -นิรุทธ์ -นิโรธ -นิล -นิ่ว -นิ้ว -นิวคลีอิก -นิวเคลียร์ -นิวเคลียส -นิวตรอน -นิวรณ์ -นิวัตน์ -นิวัติ -นิวาต -นิวาส -นิวาสน์ -นิเวศ -นิเวศน์ -นิศา -นิษกรม -นิษาท -นิสสัคคิยวัตถุ -นิสสัคคีย์ -นิสัช -นิสัย -นิสาท -นิสิต -นิสีทนะ -นิเสธ -นิหีนะ -นี่ -นี้ -นีติ -นี่นัน -นีรนาท -นีออน -นีโอดีเมียม -นึก -นึง -นึ่ง -นุ -นุง -นุ่ง -นุช -นุด -นุต -นุ่น -นุ้ย -นูน -นู่น -นู้น -เนกขะ -เนกขัม -เนคไท -เนต -เนตบอล -เนตร -เนติ -เน้น -เนบิวลา -เนปจูน -เนปทูเนียม -เนมิ -เนมิตกะ -เนมินธร -เนย -เนยยะ -เนรกัณฐี -เนรคุณ -เนรเทศ -เนรนาถ -เนรมิต -เนระพูสี -เนษาท -เนอ -เน้อ -เนา -เน่า -เนาวนิต -เนิน -เนิ่น -เนิบ -เนียง -เนียน -เนียม -เนียร -เนียรทุกข์ -เนียรเทศ -เนียรนาท -เนื้อ -เนือง -เนื่อง -เนือย -เนื้อเยื้อ -แน่ -แน่ง -แน่น -แนบ -แนม -แนว -แน่ว -แนะ -แนะแหน -โน -โน้ต -โนน -โน่น -โน้น -โนเน -โนเบเลียม -โน้ม -โนมพรรณ -โนรา -โนรี -ใน -ไน -ไนต์คลับ -ไนโตรเจน -ไนท์คลับ -ไนลอน -ไนอาซีน -ไนโอเบียม -บ -บ่ -บก -บง -บ่ง -บงก์ -บ๊งเบ๊ง -บงสุ์ -บงอับบงรา -บ่งอับบ่งรา -บฏ -บด -บดินทร์ -บดี -บถ -บท -บทนี -บทบงกช -บทบงสุ์ -บทบูรณ์ -บทพันธ์ -บทภาชน์ -บทภาชนีย์ -บทมาลย์ -บทรัช -บทวเรศ -บทวลัญช์ -บทวาร -บทศรี -บทศัพท์ -บทสถาน -บทามพุช -บโทน -บน -บ่น -บพิตร -บพิธ -บ่ม -บรม -บรมัตถ์ -บรรกวด -บรรจง -บรรจถรณ์ -บรรจบ -บรรจวบ -บรรจุ -บรรเจิด -บรรณ -บรรณาการ -บรรณาคม -บรรณาธิการ -บรรณานุกรม -บรรณารักษ์ -บรรณารักษศาสตร์ -บรรดา -บรรดาก -บรรดาศักดิ์ -บรรตานึก -บรรถร -บรรทม -บรรทัด -บรรทับ -บรรทาน -บรรทุก -บรรเทา -บรรเทือง -บรรพ -บรรพ์ -บรรพชา -บรรพชิต -บรรพต -บรรยง -บรรยงค์ -บรรยเวกษก์ -บรรยากาศ -บรรยาย -บรรลัย -บรรลาย -บรรลุ -บรรเลง -บรรโลม -บรรษัท -บรรสบ -บรรสพ -บรรสม -บรรสาน -บรรสาร -บรรหาน -บรรหาร -บรัด -บรั่นดี -บรัศว์ -บรากรม -บราทุกรา -บราลี -บริกรม -บริกรรม -บริกัป -บริการ -บริขา -บริขาร -บริคณห์ -บริจาค -บริจารก -บริจาริกา -บริเฉท -บริชน -บริณายก -บริดจ์ -บริบท -บริบวรณ์ -บริบาล -บริบูรณ์ -บริพนธ์ -บริพัตร -บริพันธ์ -บริพาชก -บริพาชิกา -บริพาชี -บริพาร -บริภัณฑ์ -บริภาษ -บริโภค -บริมาส -บริยาย -บริรม -บริรักษ์ -บริราช -บริวรรต -บริวาร -บริวาส -บริเวณ -บริษการ -บริษัท -บริสชน -บริสุทธิ์ -บริหาร -บริหาส -บรื๋อ -บฤงคพ -บล็อก -บวก -บวง -บ่วง -บวช -บวน -บ้วน -บวบ -บวม -บ๊วย -บวร -บวรโตฎก -บหลิ่ม -บอ -บ่อ -บ้อ -บอก -บอง -บ่อง -บ้อง -บ๊อง -บ๊องๆ -บ้องตะลา -บ้องแบ๊ว -บองหลา -บอด -บอน -บ่อน -บอนลายกระหนก -บอบ -บ้อม -บ๋อม -บอมบ์ -บ่อย -บ๋อย -บ่อยๆ -บอระเพ็ด -บอระมาน -บอล -บอลลูน -บ้อหุ้น -บ๊ะ -บะฉ่อ -บะหมี่ -บัก -บัคเตรี -บัง -บั้ง -บังกะโล -บังกัด -บังเกิด -บังโกรยตัวผู้ -บังโกรยตัวเมีย -บังโกลน -บังคน -บังคม -บังคล -บังควร -บังคับ -บังคัล -บังโคลน -บังแทรก -บังวาย -บังเวียน -บังสุกุล -บังสุกูลิก -บังสูรย์ -บังหวน -บังหวนควัน -บังเหตุ -บังเหิน -บังเหียน -บังอร -บังอวจ -บังอาจ -บังอิง -บังอูร -บังเอิญ -บัญจก -บัญจรงค์ -บัญชร -บัญชา -บัญชี -บัญญัติ -บัญหา -บัฏ -บัฐยาพฤต -บัณฑร -บัณฑิต -บัณฑิตย์ -บัณฑุ -บัณฑูร -บัณเฑาะก์ -บัณณาส -บัณรส -บัณรสี -บัด -บัดกรี -บัดซบ -บัดบง -บัดสี -บัตร -บัทม์ -บัน -บั่น -บั้น -บันกวด -บันจวบ -บันจอย -บันดล -บันดาล -บันเดิน -บันโดย -บันได -บันทาย -บันทึก -บันทึง -บันเทิง -บันยะบันยัง -บันลือ -บันเหิน -บัปผาสะ -บัพ -บัพชา -บัพชิต -บัพพาช -บัพพาชน์ -บัพพาชนียกรรม -บัล -บัลลพ -บัลลังก์ -บัลลูน -บัลเล่ต์ -บัลวะ -บัว -บัวเดื่อ -บัวตูม -บัวบก -บัวสวรรค์ -บา -บ่า -บ้า -บ้าๆ -บาก -บาง -บ่าง -บ้าง -บางกอก -บางสุ -บาจก -บาจรีย์ -บาจิกา -บาซาร์ -บาซิลลัส -บาด -บาดทะจิต -บาดทะพิษ -บาดทะยัก -บาดหมาย -บาดไหม -บาดาล -บาแดง -บาต -บาตร -บาท -บาทบ -บาทบงกช -บาทบริจาริกา -บาทวิถี -บาทสกุณี -บาทหลวง -บาทาธึก -บาทุกา -บาน -บ้าน -บานมงคล -บานียะ -บ้าบ่น -บ้าบ๋า -บาบี -บาบู -บาบูน -บาป -บาปเคราะห์ -บาปทฤษฎี -บาปมิตร -บาปวาท -บาพก -บ่าพก -บาย -บ่าย -บ้าย -บายสุหรี -บาเยีย -บาโย -บาร์ -บารนี -บาร์บิคิว -บาร์เบล -บารมี -บาร์เรล -บาร์เลย์ -บารอมิเตอร์ -บ้าระบุ่น -บ้าร่าท่า -บาเรียน -บาเรียม -บาล -บาลี -บ่าว -บ่าวขุน -บาศ -บาศก์ -บาสเกตบอล -บ้าหมู -บาหลี -บ้าหว่า -บ่าอ้าย -บ๋ำ -บำเทิง -บำนาญ -บำบวง -บำบัด -บำโบ -บำโบย -บำโบล -บำเพ็ญ -บำราบ -บำราศ -บำรุง -บำรู -บำเรอ -บำหยัด -บำเหน็จ -บิ -บิกู -บิฐ -บิด -บิดร -บิดหล่า -บิดา -บิตุ -บิตุจฉา -บิตุรงค์ -บิตุเรศ -บิตุล -บิตุลา -บิตุลานี -บิน -บิ่น -บินยา -บิลเลียด -บิวเรตต์ -บิศาจ -บิสมัท -บี้ -บีกู -บีฑา -บีตา -บีบ -บีเยศ -บึก -บึกบึน -บึง -บึ่ง -บึ้ง -บุ -บุก -บุคคล -บุคลากร -บุคลาธิษฐาน -บุคลิก -บุง -บุ่ง -บุ้ง -บุญ -บุญเขต -บุญญานุภาพ -บุญญาภินิหาร -บุญญาภิสังขาร -บุญนิธิ -บุญราศี -บุญฤทธิ์ -บุณฑริก -บุณมี -บุณย์ -บุตร -บุตรธรรม -บุตรา -บุตรี -บุตรีตระสุม -บุถุชน -บุทคล -บุ๋น -บุนนะบุนนัง -บุนนาค -บุบ -บุพเพนิวาสานุสติญาณ -บุพเพสันนิวาส -บุพโพ -บุฟเฟ่ต์ -บุ๋ม -บุ่มบ่าม -บุ้ย -บุ้ยปาก -บุรณะ -บุรพกุศล -บุรพทิศ -บุรพนิมิต -บุรพบท -บุรพภัทรบท -บุรพาจารย์ -บุรพาษาฒ -บุระ -บุรัตถิมทิศ -บุราณ -บุราณทุติยิกา -บุรินทร์ -บุริมทิศ -บุริมพรรษา -บุริมสิทธิ -บุรี -บุรุษ -บุรุษโทษ -บุรุษธรรม -บุเรภพ -บุเรภัต -บุโรทั่ง -บุษกร -บุษบก -บุษบง -บุษบัน -บุษบา -บุษบามินตรา -บุษปราค -บุษปะ -บุษย -บุษย์ -บุษย์น้ำทอง -บุษราคัม -บุหงง -บุหงัน -บุหงา -บุหรง -บุหรี่ -บุหรี่พระราม -บุหลัน -บู่ -บู้ -บู๊ -บูชนียสถาน -บูชา -บูชิโด -บูชิต -บูด -บูดู -บูร -บูรณ์ -บูรณะ -บูรพ -บูรพา -บูรพาจารย์ -บูรี -เบ้ -เบ๊ -เบคอน -เบ่ง -เบงกาละนี -เบ๊จี๋ -เบญกานี -เบญจ -เบญจก -เบญจมาศ -เบญจา -เบญจางค์ -เบญญา -เบญพาด -เบ็ด -เบ็ดเตล็ด -เบ็ดเสร็จ -เบตา -เบนซิน -เบนไซน์ -เบรก -เบริลเลียม -เบรียน -เบเร่ต์ -เบส -เบสบอล -เบ้อ -เบอร์ -เบอร์คีเลียม -เบ้อเร่อ -เบ้อเร่อเท่อ -เบ้อเริ่ม -เบ้อเริ่มเทิ่ม -เบอะ -เบะ -เบา -เบ้า -เบาราณ -เบาะ -เบิก -เบิ่ง -เบี้ย -เบียก -เบี่ยง -เบียด -เบียน -เบียร์ -เบี้ยว -เบือ -เบื่อ -เบื้อ -เบื้อง -เบือน -แบ -แบ้ -แบก -แบคทีเรีย E -แบ่ง -แบงค์ -แบดมินตัน -แบตเตอรี่ -แบน -แบนโจ -แบบ -แบ็บ -แบรก -แบเรียม -แบหลา -แบะ -แบะแซ -โบ -โบ้ -โบ๋ -โบก -โบกขรณี -โบกี้ -โบชุก -โบดก -โบต -โบตั๋น -โบนัส -โบ๊เบ๊ -โบย -โบรมีน -โบรอน -โบราณ -โบว์ลิ่ง -โบสถ์ -ใบ -ใบ้ -ใบระกา -ไบ่ๆ -ไบคาร์บอเนต -ไบเบิล -ป -ปก -ปกติ -ปกรณ์ -ปกรณัม -ปการ -ปกิณกะ -ปกีรณัม -ปโกฏิ -ปคุณ -ปง -ป่ง -ปงปัง -ปชาบดี -ปฎล -ปฏัก -ปฏิกรณ์ -ปฏิกรรม -ปฏิกรรมสงคราม -ปฏิการะ -ปฏิกิริยา -ปฏิกูล -ปฏิคคหิต -ปฏิคม -ปฏิคาหก -ปฏิฆะ -ปฏิจจสมุปบาท -ปฏิชีวนะ -ปฏิญญา -ปฏิญาณ -ปฏิทิน -ปฏิบถ -ปฏิบัติ -ปฏิปทา -ปฏิปักษ์ -ปฏิปัน -ปฏิปุจฉาพยากรณ์ -ปฏิปุจฉาวาที -ปฏิพัทธ์ -ปฏิพากย์ -ปฏิภาค -ปฏิภาณ -ปฏิภาณกวี -ปฏิภาณปฏิสัมภิทา -ปฏิภาณโวหาร -ปฏิมา -ปฏิมากร -ปฏิยาย -ปฏิยุทธ์ -ปฏิรพ -ปฏิรูป -ปฏิโลม -ปฏิวัติ -ปฏิวาต -ปฏิวาท -ปฏิเวธ -ปฏิสนธิ -ปฏิสวะ -ปฏิสังขรณ์ -ปฏิสันถาร -ปฏิสัมภิทา -ปฏิเสธ -ปฐพี -ปฐม -ปฐมดุสิต -ปฐมพยาบาล -ปฐมสมโพธิ -ปฐมาสาฒ -ปฐวี -ปณต -ปณาม -ปณิธาน -ปณิธิ -ปณีต -ปด -ปดโป้ -ปดิวรัดา -ปตัตรี -ปติ -ปติยัต -ปถพี -ปถมัง -ปถวี -ปทักขิณ -ปทัฏฐาน -ปทัสถาน -ปทาน -ปทานุกรม -ปทีป -ปทุม -ปธาน -ปน -ป่น -ปนัดดา -ปนุท -ปบ -ปปัญจะ -ปม -ปรก -ปรกติ -ปรง -ปรด -ปรตยักษ์ -ปรตยาค -ปรตเยก -ปรทัตตูปชีวี -ปรน -ปรนนิบัติ -ปรนัย -ปรบ -ปรปักษ์ -ปรเมหะ -ปรโลก -ปรวด -ปรวนแปร -ปรวาที -ปรวิสัยสีมา -ปรศุ -ปรสิต -ปร๋อ -ปรองดอง -ปรอด -ปรอดๆ -ปรอท -ปรอย -ปรอยๆ -ประ -ประกบ -ประกฤต -ประกฤติ -ประกล -ประกวด -ประกอบ -ประกัน -ประกับ -ประกาย -ประการ -ประกาศ -ประกาศก -ประกาศนียกรรม -ประกาศนียบัตร -ประกาศิต -ประกำ -ประกิด -ประกิต -ประกีรณก -ประเกียรณก -ประแกก -ประคด -ประคนธรรพ -ประคนธรรพ์ -ประคบ -ประคอง -ประคับประคอง -ประคัลภ์ -ประคำ -ประคำไก่ -ประคำดีควาย -ประคิ่น -ประคิ่นวินชา -ประคุณ -ประเคน -ประเคราะห์ -ประโคน -ประโคนธรรบ -ประโคนธรรพ์ -ประโคม -ประจง -ประจญ -ประจบ -ประจวบ -ประจ๋อประแจ๋ -ประจักษ์ -ประจัญ -ประจัน -ประจาก -ประจาค -ประจาน -ประจำ -ประจิม -ประจิ้มประจ่อง -ประจิ้มประเจ๋อ -ประจุ -ประจุคมน์ -ประจุบัน -ประเจก -ประเจิด -ประเจียด -ประแจ -ประชด -ประชน -ประชวม -ประชวร -ประชัน -ประชา -ประชิด -ประชี -ประชุม -ประเชิญ -ประณต -ประณม -ประณาม -ประณิธาน -ประณิธิ -ประณีต -ประณุท -ประดง -ประดงแดง -ประดน -ประดวน -ประดอน -ประดอย -ประดัก -ประดัง -ประดับ -ประดา -ประดาก -ประดาป -ประดาษ -ประดิชญา -ประดิดประดอย -ประดิทิน -ประดิรพ -ประดิษฐ์ -ประดิษฐาน -ประดุ -ประดุง -ประดุจ -ประดู่ -ประเด -ประเด็น -ประเดยก -ประเดิม -ประเดียง -ประเดี๋ยว -ประแดง -ประแดะ -ประโดย -ประตง -ประตยาค -ประตัก -ประตาปะ -ประติชญา -ประติญาณ -ประติทิน -ประติมากรรม -ประติรพ -ประติศรัพ -ประตู -ประถม -ประถมจินดา -ประทม -ประทยด -ประท้วง -ประทวน -ประทักษ์ -ประทักษิณ -ประทัง -ประทัด -ประทับ -ประท่า -ประทากล้อง -ประทาน -ประทาย -ประทาศี -ประทิน -ประทิ่น -ประทีป -ประทุก -ประทุฐ -ประทุฐจิต -ประทุน -ประทุมราค -ประทุษ -ประทุษฏ์ -ประทุษฏจิต -ประทุษฐ์ -ประทุษฐจิต -ประเทศ -ประเทา -ประเท้า -ประเทียด -ประเทียบ -ประเทือง -ประธาน -ประธานาธิบดี -ประนม -ประนอ -ประนอม -ประนัง -ประนัปดา -ประนี้ -ประนีประนอม -ประบัด -ประบาต -ประปราน -ประปราย -ประปา -ประเปรี้ยง -ประเปรี้ยว -ประแปร้น -ประพจน์ -ประพนธ์ -ประพรม -ประพฤติ -ประพฤทธิ์ -ประพัด -ประพัทธ์ -ประพันธ์ -ประพาต -ประพาศมหรณพ -ประพาส -ประพาฬ -ประพิณ -ประพิมพ์ประพาย -ประพุทธ์ -ประเพณี -ประเพ้อ -ประแพร่งประแพรว -ประโพธ -ประไพ -ประไพร -ประภพ -ประภัสสร -ประภา -ประภาพ -ประภาษ -ประภาส -ประภูศักดิ์ -ประเภท -ประมง -ประมวญ -ประมวล -ประมัตตะ -ประมาณ -ประมาท -ประมุข -ประมุท -ประมูล -ประเมิน -ประโมง -ประโมทย์ -ประยงค์ -ประยุกต์ -ประยุทธ์ -ประยุร -ประยูร -ประโยค -ประโยคสัมปทา -ประโยชน์ -ประโรหิต -ประลมพ์ -ประลอง -ประลัย -ประลาต -ประลาย -ประลึง -ประลุ -ประลุง -ประเล่ห์ -ประเล้าประโลม -ประโลประเล -ประโลม -ประวรรต -ประวรรตน์ -ประวัติ -ประวาต -ประวาที -ประวาล -ประวาลปัทม์ -ประวาลผล -ประวาลวรรณ -ประวาส -ประวิง -ประวิช -ประวิตร -ประวีณ -ประเวณี -ประเวประวิง -ประเวศ -ประเวศน์ -ประศม -ประศาสน์ -ประศุ -ประสก -ประสงค์ -ประสบ -ประสพ -ประสม -ประสะ -ประสัก -ประสันนาการ -ประสัยห์ -ประสา -ประสาท -ประสาทการ -ประสาทรูป -ประสาธน์ -ประสาน -ประสาร -ประสิทธิ์ -ประสีประสา -ประสูต -ประสูติ -ประเสบันอากง -ประเสริฐ -ประแสบัน -ประหนึ่ง -ประหมัน -ประหม่า -ประหยัด -ประหรณ์ -ประหลาด -ประหลาท -ประหล่ำ -ประหลิ่ม -ประหวัด -ประหวั่น -ประหว่า -ประหัต -ประหาณ -ประหาร -ประหาส -ประเหล -ประเหส -ประเหียล -ประไหมสุหรี -ประอบ -ประอร -ประอึง -ประอุก -ประเอียง -ประแอก -ประฮาม -ปรัก -ปรักปรำ -ปรักมะ -ปรักหักพัง -ปรัง -ปรัชญา -ปรัด -ปรัตถจริยา -ปรัตยนต์ -ปรัตยักษ์ -ปรัตยันต์ -ปรัตยัย -ปรัตยุตบัน -ปรัตยุบัน -ปรัตยูษ -ปรัตยูห์ -ปรัตเยก -ปรัน -ปรั่น -ปรั้น -ปรับ -ปรัปวาท -ปรัมปรา -ปรัมมุขา -ปรัศจิม -ปรัศนา -ปรัศนี -ปรัศว์ -ปร่า -ปรากฏ -ปรากรม -ปรากฤต -ปราการ -ปราคภาร -ปราคาร -ปราง -ปรางค์ -ปรางคณะ -ปราจีน -ปราชญ์ -ปราชญา -ปราชัย -ปราชาปัตยวิวาหะ -ปราชิต -ปราณ -ปราณี -ปราด -ปราติหารย์ -ปราทุกรา -ปราน -ปรานี -ปราบ -ปราบดาภิเษก -ปราปต์ -ปราภพ -ปราม -ปรามาส -ปราโมช -ปราโมทย์ -ปราย -ปรารถนา -ปรารภ -ปรารมภ์ -ปราศ -ปราศจาก -ปราศัย -ปราษณี -ปราษาณ -ปราสัย -ปราสาท -ปรำ -ปริ -ปริก -ปริกขาร -ปริกรรม -ปริกัป -ปริขา -ปริคณห์ -ปริฆ -ปริจาค -ปริจาริกา -ปริเฉท -ปริชน -ปริซึม -ปริญญา -ปริณาม -ปริณายก -ปริตตะ -ปริตโตทก -ปริตยาค -ปริตร -ปริทรรศน์ -ปริทัยหัคคี -ปริทัศน์ -ปริเทพ -ปริเทพน์ -ปริเทวนะ -ปริเทวะ -ปรินิพพาน -ปริบ -ปริปันถ์ -ปริพนธ์ -ปริพัตร -ปริพันธ์ -ปริพาชก -ปริภัณฑ์ -ปริภาษ -ปริภาษณ์ -ปริภุญช์ -ปริภูมิ -ปริโภค -ปริ่ม -ปริมณฑล -ปริมัท -ปริมาณ -ปริมาตร -ปริยัติ -ปริยัติธรรม -ปริยาย -ปริเยศ -ปริโยสาน -ปริวรรต -ปริวัตร -ปริวาร -ปริวาส -ปริวิตก -ปริเวณ -ปริศนา -ปริษการ -ปริษัท -ปริสัญญู -ปริสุทธิ -ปริหาน -ปริหาร -ปริหาส -ปรี่ -ปรีชญา -ปรีชา -ปรี๊ด -ปรีดา -ปรีดิ -ปรีดิ์ -ปรีดี -ปรีติ -ปรีย -ปรียา -ปรึก -ปรึกษา -ปรึง -ปรือ -ปรื๋อ -ปรุ -ปรุง -ปรู -ปรู๋ -ปรูด -ปรู๊ฟ -ปฤงคพ -ปฤจฉา -ปฤษฎางค์ -ปฤษฐ -ปฤษณ์ -ปลก -ปลกเปลี้ย -ปลง -ปล่ง -ปลด -ปล้น -ปลวก -ปลอก -ปล่อง -ปล้อง -ปลอด -ปล้อน -ปลอบ -ปลอม -ปล่อย -ปละ -ปลัก -ปลั๊ก -ปลั๊กไฟ -ปลัง -ปลั่ง -ปลัด -ปลัดขิก -ปลา -ปลาก -ปลาดาว -ปลาต -ปลาบ -ปลาฝา -ปลาย -ปลายนาการ -ปลาโลมา -ปลาวาฬ -ปลาสเตอร์ -ปลาสนาการ -ปลาหมึก -ปล้ำ -ปล้ำปลุก -ปลิง -ปลิด -ปลิ้น -ปลิโพธ -ปลิม -ปลิ่ม -ปลิว -ปลี -ปลีก -ปลื้ม -ปลุก -ปลูก -ปวกเปียก -ปวง -ป่วง -ปวด -ป่วน -ป้วน -ป้วนเปี้ยน -ป่วย -ปวัตน์ -ปวัตยาการ -ปวาต -ปวารณา -ปวาล -ปวาส -ปวาฬ -ปวิช -ปวิตร -ปวิธ -ปวิเวก -ปวีณ -ปวุติ -ปเวณี -ปเวส -ปเวสน์ -ปศุ -ปสพ -ปสันนะ -ปสัยหะ -ปสาท -ปสาน -ปสาสน์ -ปสุ -ปสุต -ปสูติ -ปหังส -ปหังสน -ปหาน -ปหาร -ปหาส -ปอ -ป้อ -ป๋อ -ปอก -ปอง -ป่อง -ป้อง -ปอด -ปอน -ป้อน -ปอนๆ -ปอนด์ -ปอเนาะ -ปอบ -ปอม -ป้อม -ป๋อม -ปอย -ป้อย -ปะ -ปะกน -ปะกัง -ปะกาปะกัง -ปะการัง -ปะกำ -ปะขาว -ปะงับปะง่อน -ปะตานี -ปะตาปา -ปะตาระกาหลา -ปะติดปะต่อ -ปะติยาน -ปะเตะ -ปะทะ -ปะทะปะทัง -ปะทุ -ปะทุน -ปะบุก -ปะปน -ปะมง -ปะราลี -ปะรำ -ปะลอม -ปะเลง -ปะแล่ม -ปะแล่มๆ -ปะโลง -ปะวะหลำ -ปะวะหลิ่ม -ปะเสหรันอากง -ปะหงับ -ปะหงับๆ -ปะหนัน -ปะหมันอาหยี -ปะหลิ่ม -ปะหัง -ปะเหลาะ -ปะเหลาะปะแหละ -ปัก -ปักข์ -ปักเป้า -ปักษ์ -ปักษา -ปักษาสวรรค์ -ปักษิน -ปักษิบดี -ปักษิมารค -ปักษิราช -ปักษิสิงห์ -ปักษี -ปัคหะ -ปัง -ปั่ง -ปังสุ์ -ปังสุกุล -ปัจจัตตะ -ปัจจัย -ปัจจามิตร -ปัจจุคมน์ -ปัจจุทธรณ์ -ปัจจุบัน -ปัจจูส -ปัจจูหะ -ปัจเจก -ปัจเจกชน -ปัจเจกบุคคล -ปัจเจกพุทธะ -ปัจเจกโพธิ -ปัจเจกสมาทาน -ปัจโจปการกิจ -ปัจฉา -ปัจฉิม -ปัจถรณ์ -ปัจนึก -ปัจยาการ -ปัจเวกขณ์ -ปัชชร -ปัชชุน -ปัญจก -ปัญจม -ปัญจวีสติ -ปัญญัติ -ปัญญา -ปัญหา -ปัฏ -ปัฏนะ -ปัฐยาวัต -ปัณฑรหัตถี -ปัณฑุปลาส -ปัณณะ -ปัณณัตติกวัชชะ -ปัณณาส -ปัณณาสก์ -ปัณรสม -ปัณรสี -ปัณหิ -ปัด -ปัดๆ -ปัดไถม -ปัตคาด -ปัตจัตถรณ์ -ปัตจันต์ -ปัตตะ -ปัตตะเลี่ยน -ปัตตานีกะ -ปัตตานึก -ปัตตามุโมทนา -ปัตตาเวีย -ปัตติ -ปัตติก -ปัตถร -ปัตถะ -ปัตนิ -ปัตนี -ปัตยัย -ปัตหล่า -ปัถพี -ปัถวี -ปัน -ปั่น -ปั้น -ปั้นจั่น -ปันจุเหร็จ -ปันลม -ปั้นหยา -ปั้นเหน่ง -ปับ -ปั๊บ -ปัปผาสะ -ปัพพาชนะ -ปัพพาชนียกรรม -ปัพภาระ -ปั๊ม -ปั๊มแก็ส -ปั๊มน้ำมัน -ปัยกะ -ปัยกา -ปัยยิกา -ปั่ว -ปัวเปีย -ปั้วเปี้ย -ปัศจิม -ปัศตัน -ปัศตู -ปัสสัทธิ -ปัสสาวะ -ปัสสาสะ -ปา -ป่า -ป้า -ป๋า -ปาก -ปาง -ป่าง -ป้าง -ป้างป่า -ปาจนะ -ปาจรีย์ -ปาจารย์ -ปาจิตตีย์ -ปาจีน -ปาฏลิ -ปาฏิบท -ปาฏิบุคคลิก -ปาฏิโภค -ปาฏิหาริย์ -ปาฐะ -ปาณะ -ปาณิ -ปาณี -ปาด -ปาดหาว -ปาติโมกข์ -ปาตี -ปาเต๊ะ -ปาท -ปาทป -ปาท่องโก๋ -ปาทังกา -ปาทาน -ปาทุกา -ปาน -ป่าน -ป้าน -ปานดง -ป้านลม -ปานะ -ปานิเยน -ปานียะ -ป้าบ -ป๊าบ -ปาปอหยีสังฆาตา -ปาพจน์ -ปาม -ปาโมกข์ -ป่าย -ป้าย -ปายาส -ปาร์ก -ปาร์เกต์ -ปาร์ตี -ปารมี -ปารษณี -ปาราชิก -ปาริฉัตร -ปาริชาต -ปาริสุทธิศีล -ปารุปนะ -ปาล -ปาล์ม -ปาลิไลยก์ -ปาลี -ป่าว -ป๊าว -ปาวๆ -ปาวก -ปาวจนะ -ปาวาร -ปาษาณ -ปาส -ปาสาณ -ปาสาทิกะ -ปาหนัน -ปาหี่ -ปาหุณ -ปำ -ป้ำ -ป้ำๆเป๋อๆ -ป้ำเป้อ -ป้ำเป๋อ -ปิกนิก -ปิกอัพ -ปิงคล -ปิงคละ -ปิงปอง -ปิฎก -ปิฏฐะ -ปิฐิ -ปิณฑะ -ปิด -ปิดเต๊าะ -ปิตตะ -ปิตา -ปิตุ -ปิตุจฉา -ปิตุล -ปิตุลา -ปิตุลานี -ปิโตรเลียม -ปิ่น -ปิ๊น -ปิ๊นๆ -ปิ่นตอ -ปิ่นโต -ปิปผลี -ปิ่ม -ปิ้ม -ปิยังคุ -ปิรันฮา -ปิลันธน์ -ปิ๋ว -ปิศาจ -ปิสัง -ปิไส -ปิหก -ปิหลั่น -ปี -ปี่ -ปี้ -ปี๋ -ปีก -ปีฎกฆร -ปีฐกะ -ปีฐะ -ปี๊ด -ปีตกสิณ -ปีติ -ปีน -ปีบ -ปี๊บ -ปีโป๊ -ปีศาจ -ปีฬ -ปีฬก -ปีฬา -ปึก -ปึง -ปึ่ง -ปึ๊ง -ปึ๋ง -ปึ้ด -ปึ้น -ปึมปื้อ -ปืดปึง -ปืน -ปือ -ปื้อ -ปื๋อ -ปุ -ปุ๊ -ปุก -ปุกปุย -ปุ๊กลุก -ปุคละ -ปุ้งกี๋ -ปุงคพ -ปุงควะ -ปุงลิงค์ -ปุงลึงค์ -ปุจฉา -ปุฏ -ปุณฑริก -ปุด -ปุตตะ -ปุตทารทาน -ปุถุชน -ปุนเท่าก๋ง -ปุนนาค -ปุนภพ -ปุนับปุนัง -ปุนัพสุ -ปุบ -ปุ๊บ -ปุบปับ -ปุ๊บปั๊บ -ปุปผะ -ปุปะ -ปุพพะ -ปุ่ม -ปุ้ม -ปุ๋ม -ปุ่มปลา -ปุ้มเป้ง -ปุ่มเปือก -ปุ้มเปือก -ปุมา -ปุย -ปุ้ย -ปุ๋ย -ปุร -ปุรณะ -ปุรัตถิมทิศ -ปุราณ -ปุราณะ -ปุริมทิศ -ปุริมพรรษา -ปุริสภาวะ -ปุริโสดม -ปุเรจาริก -ปุโรหิต -ปุลลิงค์ -ปุลลึงค์ -ปุลินท์ -ปุลู -ปุเลง -ปุเลงๆ -ปุโลปุเล -ปุแหละ -ปุฬวะ -ปู -ปู่ -ปูชกะ -ปูชนียะ -ปูชา -ปูชิต -ปูด -ปูดกกส้มมอ -ปูติ -ปูน -ปูม -ปู้ยยี้ปู้ยำ -ปู่ย่า -ปูระ -ปูลู -ปูวา -เป้ -เป๋ -เปก -เป๊ก -เปกข์ -เป่ง -เป้ง -เป๊ง -เป๋ง -เป็ด -เป็ดไซ้ไก่ตอดสลักรอดหมูสี -เป็น -เป็นต้น -เปยยาล -เปร -เปร็ง -เปรต -เปรม -เปรย -เปรยๆ -เปรอ -เปรอะ -เปรา -เปราะ -เปราะแประ -เปรียง -เปรี้ยง -เปรียญ -เปรียบ -เปรี่ยม -เปรียว -เปรี้ยว -เปรี้ยวหวาน -เปรียะ -เปรี๊ยะ -เปรื่อง -เปรื้อย -เปล -เปล่ง -เปลว -เปลา -เปล่า -เปล้า -เปลาะ -เปลี้ย -เปลี่ยน -เปลี่ยม -เปลี่ยว -เปลี่ยวดำ -เปลือก -เปลือกกระเทียม -เปลือง -เปลื้อง -เปลือย -เปศ -เปศล -เปศัส -เปสการ -เปสล -เปสุญ -เปสุไณย -เป๋อ -เป้อเย้อ -เปอร์เซ็นต์ -เป๋อเหลอ -เปะ -เปะปะ -เปา -เป่า -เป้า -เป๊า -เป๋า -เป๋าฮื้อ -เปาะ -เปาะเปี๊ยะ -เปาะแปะ -เปาะเหลาะ -เปิก -เปิง -เปิงๆ -เปิงมาง -เปิด -เปิ่น -เปิบ -เปิ๊บ -เปิบข้าว -เปีย -เปียก -เปี๊ยก -เปียแชร์ -เปี๊ยบ -เปี่ยม -เปียว -เปี้ยว -เปียหวย -เปียะ -เปือก -เปื้อน -แป -แป้ง -แป๋ง -แป้งแช่ -แปด -แป๊ด -แปทู -แป้น -แปบ -แป๊บ -แปม -แปร -แปร๋ -แปรก -แปรง -แปร่ง -แปรงล้างขวด -แปรงหูหนู -แปร๊ด -แปร้น -แปร๋น -แปร๋แปร้น -แประ -แปล -แปล้ -แปลก -แปลง -แปลน -แปลบ -แป้ว -แป๊ว -แป๋ว -แปะ -แป๊ะ -แป๊ะซะ -โป -โป่ -โป้ -โป๊ -โปก -โป๊ก -โป๊กเกอร์ -โปกขรณี -โปเก -โปง -โป่ง -โป้ง -โป่งข่าม -โปงลาง -โป่งวิด -โป้งโหยง -โปฐปทา -โปดก -โปตถกะ -โปน -โปป -โป๊ยกั้ก -โป๊ยเซียน -โปรง -โปร่ง -โปรด -โปรตอน -โปรตีน -โปรเตสแตนต์ -โปรแทรกเตอร์ -โปรย -โปรีสภา -โปล่ง -โปลิโอ -โปโล -โปส -โปสก -โปสการ์ด -โปสเตอร์ -โปสาวนิกมูล -โปะ -โป๊ะ -โป๊ะจ้าย -ไป -ไป่ -ไป๋ -ไป๋เป๋ -ไปยาล -ไปรษณีย์ -ไปล่ -ไปศาจ -ไปศาจี -ผ -ผก -ผกเรือก -ผกา -ผกาย -ผคม -ผง -ผงก -ผงม -ผงร -ผงอน -ผงอบ -ผงะ -ผงาด -ผง่าน -ผจง -ผจญ -ผจัญ -ผจาน -ผชุม -ผญา -ผณะ -ผณิน -ผด -ผดุง -ผเดิน -ผทม -ผนวก -ผนวช -ผนัง -ผนิด -ผนึก -ผม -ผมนาง -ผยอง -ผย่ำเผยอ -ผรสุ -ผริต -ผรุพก -ผล -ผลก -ผลคุน -ผลคุนี -ผลง -ผลอ -ผล็อง -ผล็อย -ผละ -ผลัก -ผลัด -ผลับ -ผลัวะ -ผลา -ผลาญ -ผลิ -ผลิกะ -ผลิต -ผลิน -ผลี -ผลีผลาม -ผลึก -ผลึ่ง -ผลือ -ผลุ -ผลุง -ผลุด -ผลุน -ผลุบ -ผลุย -ผลู -ผวา -ผสม -ผสมเสร็จ -ผสาน -ผสาย -ผสาร -ผอก -ผอง -ผ่อง -ผ่อน -ผอบ -ผอม -ผ็อย -ผ่อย -ผอวด -ผอูน -ผะ -ผะแคง -ผะดา -ผะสา -ผะหมี -ผะออบ -ผะอืดผะอม -ผัก -ผักไก -ผักขวง -ผักขี้ขวง -ผักโฉม -ผักชี -ผักตบชวา -ผักทอดยอด -ผักบุ้ง -ผักบุ้งขัน -ผักบุ้งจีน -ผักบุ้งทะเล -ผักบุ้งฝรั่ง -ผักบุ้งร้วม -ผักบุ้งรั้ว -ผักเบี้ย -ผักเบี้ยใหญ่ -ผักปลัง -ผักปุ่มปลา -ผักเผ็ด -ผักไผ่ -ผักรู้นอน -ผักแว่น -ผักสาบ -ผักสามหาว -ผักเสี้ยน -ผักหนอก -ผักหนอง -ผักหนาม -ผักหวาน -ผักไหม -ผักอีแปะ -ผัคคุณ -ผัคคุณี -ผัง -ผัด -ผัน -ผับ -ผัลคุนี -ผัว -ผัวะ -ผัสสะ -ผา -ผ่า -ผ้า -ผาก -ผาง -ผ่าง -ผาณิต -ผาด -ผาติ -ผ่าน -ผาม -ผาย -ผ่าย -ผ้าย -ผาล -ผาลคุน -ผาลา -ผ่าว -ผาสุก -ผ้าฮาด -ผำ -ผ้ำๆ -ผิ -ผิง -ผิด -ผิดก -ผิต -ผิน -ผิว -ผี -ผีตองเหลือง -ผี้ว์ -ผึง -ผึ่ง -ผึ้ง -ผื่น -ผุ -ผุด -ผุยผง -ผุสราคา -ผู้ -ผูก -เผ -เผง -เผชิญ -เผ็ด -เผด็จ -เผดิม -เผดียง -เผ่น -เผนิก -เผย -เผยอ -เผยิบ -เผล -เผล่ -เผล้ -เผล็ด -เผลอ -เผละ -เผลาะ -เผลาะแผละ -เผลียง -เผอเรอ -เผอิญ -เผอิล -เผะ -เผา -เผ่า -เผ้า -เผ้าผง -เผาะ -เผิ้ง -เผิน -เผินๆ -เผียน -เผียะ -เผือ -เผื่อ -เผือก -เผือด -เผือน -เผื่อน -แผ่ -แผก -แผง -แผด -แผดเผา -แผดเสียง -แผน -แผ่น -แผนก -แผล -แผลง -แผล็บ -แผล็บๆ -แผล็ว -แผละ -แผ่ว -แผ้ว -โผ -โผง -โผฏฐัพพะ -โผน -โผย -โผล่ -โผลกเผลก -โผละ -โผอน -โผะ -ไผ -ไผ่ -ไผท -ไผ่ผัง -ฝ -ฝน -ฝรั่ง -ฝรั่งเศส -ฝรั่น -ฝ่อ -ฝอย -ฝัก -ฝักฝ่าย -ฝักใฝ่ -ฝัง -ฝั่ง -ฝัด -ฝัน -ฝา -ฝ่า -ฝ้า -ฝาก -ฝาง -ฝาด -ฝาน -ฝาย -ฝ่าย -ฝ้าย -ฝิ่น -ฝี -ฝี่ -ฝีก -ฝีหมอบ -ฝึก -ฝืด -ฝืน -ฝุ่น -ฝูง -เฝ้า -เฝือ -เฝือก -เฝือง -เฝื่อน -แฝก -แฝง -แฝด -ใฝ่ -ไฝ -พ -พก -พกจร -พกนุ่น -พกพ่าย -พกลม -พกหิน -พกอาวุธ -พกา -พกุระ -พกุล -พง -พงศ์ -พจน์ -พจนา -พจนารถ -พจนีย์ -พจมาน -พจี -พชระ -พญา -พญาณ -พญาไฟ -พญาลอ -พณิช -พณิชย์ -พด -พธู -พน -พ่น -พ้น -พนม -พนอง -พนอม -พนัก -พนักงาน -พนัง -พนัดร -พนัน -พนัส -พนา -พนาด -พนานดร -พนานต์ -พนาย -พนิดา -พนิต -พนียก -พเนก -พเนจร -พบ -พบู -พม่า -พยช -พยชน์ -พยติเรก -พยนต์ -พยศ -พยัก -พยัคฆ์ -พยัชน์ -พยัญชนะ -พยัต -พยับ -พยากรณ์ -พยาฆร์ -พยางค์ -พยาธิ -พยาน -พยาบาท -พยาบาล -พยาม -พยายาม -พยาล -พยุ -พยุง -พยุหร -พยุหะ -พยู่ห์ -พเยีย -พร -พรต -พรม -พรมคด -พรมแดน -พรมมิ -พรรค -พรรค์ -พรรคานต์ -พรรณ -พรรณนา -พรรณราย -พรรดึก -พรรลาย -พรรษ -พรรเหา -พรรเอิญ -พรวงเพรียง -พรวด -พรวน -พรหม -พรอก -พร่อง -พร้อง -พรอด -พร้อม -พร่อมพร้อ -พร่อย -พร้อย -พระ -พระจันทร์ครึ่งซีก -พระเจ้าลอยถาด -พระเจ้าห้าพระองค์ -พระนอม -พระนาด -พระยาเล็บครุฑ -พระยาวัน -พระลบ -พระลือ -พระแวว -พระหา -พระหาม -พระหิด -พระฮาม -พรักพร้อม -พรั่ง -พรัด -พรั่น -พรับ -พร่า -พร้า -พราก -พราง -พร่าง -พราด -พราน -พราย -พราว -พราหมณ์ -พราหมณี -พราหมี -พรำ -พร่ำ -พร้ำ -พรำๆ -พริก -พริ้ง -พริบ -พริบไหว -พริ้ม -พรึง -พรึน -พรึบ -พรืด -พรื้อ -พรุ -พรุก -พรุ่ง -พรุ่งนี้ -พรุน -พรู -พรูด -พฤกษ์ -พฤฒ -พฤฒา -พฤฒิ -พฤต -พฤติ -พฤทธ์ -พฤทธิ์ -พฤนต์ -พฤนท์ -พฤนทาร -พฤนทิ์ -พฤภูษณ -พฤภูษิต -พฤษจิก -พฤษภ -พฤหัสบดี -พล -พลกาย -พลการ -พลขันธ์ -พลความ -พลเทพ -พลบ -พลเมือง -พลเรือน -พลโลก -พลวก -พลวง -พลวดกินลูก -พลวดใหญ่ -พลวัต -พลศาสตร์ -พลศีกษา -พลสิงห์ -พลอ -พล้อ -พลอง -พลอด -พลอน -พลอมแพลม -พลอย -พล่อย -พละ -พละกำลัง -พละพลา -พลั่ก -พลัง -พลั่ง -พลั้ง -พลัด -พลัน -พลับ -พลับพลา -พลับพลึง -พลั่ว -พล่า -พลากร -พลาง -พลาญ -พลาด -พลาดิศัย -พลาธิการ -พล่าน -พลานามัย -พลานึก -พลาม -พล่าม -พลาย -พลายม้า -พลาสติก -พลาสมา -พลาหก -พลำ -พล้ำ -พลำภัง -พลิ -พลิก -พลิพัท -พลิ้ว -พลี -พลีมุข -พลุ -พลุก -พลุ่ก -พลุกพล่าน -พลุ่ง -พลุ้น -พลุ่มพล่าม -พลุ่ย -พลุ้ย -พลู -พลูแก -พลูคาว -พลูต้น -พลูโต -พลูโทเนียม -พวก -พวง -พ่วง -พวน -พวย -พสก -พสน -พสุ -พสุสงกรานต์ -พหล -พหุ -พหุล -พหู -พอ -พ่อ -พ้อ -พอก -พอกพูน -พอคเกตบุค -พ่อค้าตีเมีย -พอง -พ้อง -พอน -พ้อม -พอโลเนียม -พะ -พ่ะ -พะงา -พะงาบ -พะงาบๆ -พะจง -พะทำมะรง -พะนอ -พะเน้าพะนอ -พะเน้าพะนึง -พะเนิน -พะเนียง -พะแนง -พะไนย -พะพาน -พะพิง -พะเพิง -พะยอม -พะยุพยุง -พะยูง -พะยูน -พะเยิบ -พะเยิบๆ -พะเยีย -พะรุงพะรัง -พะเลย -พะโล้ -พะไล -พะวง -พะวักพะวน -พะวา -พะว้าพะวัง -พะอง -พะอากพะอำ -พะอืดพะอม -พัก -พักตร์ -พักตรา -พักตา -พักแพว -พักร -พัง -พังกา -พังคา -พังงา -พังผืด -พังพวย -พังพอน -พังพาน -พังพาบ -พังเพย -พังลาง -พัช -พัชนี -พัชร -พัญจก -พัญจน์ -พัฒกี -พัฒนะ -พัฒนา -พัด -พัดชา -พัดซาด -พัดดึงส์ -พัดแพว -พัดหลวง -พัตติงสะ -พัตร -พัทธ์ -พัทธยา -พัทร -พัน -พันงู -พันจำ -พันไฉน -พันตัน -พันตู -พันทาง -พันธ์ -พันธนะ -พันธนำ -พันธะ -พันธุ -พันธุ์ -พันลอก -พันลาย -พันลำ -พันลึก -พันลึกพันลือ -พันเลิศ -พันเอิญ -พับ -พับผ่า -พัฟ -พัลลภ -พัลวัน -พัว -พัวะ -พัศดี -พัสดุ -พัสเดา -พัสตร์ -พัสถาน -พา -พาก -พากเพียร -พากย์ -พาง -พ่าง -พาชี -พาณ -พาณิช -พาณิชย์ -พาณินี -พาณี -พาด -พาดไฉน -พาต -พาท -พาทย์ -พาธ -พาธา -พาน -พ่าน -พานร -พาม -พาย -พ่าย -พายม้า -พายัพ -พายุ -พาร์เซก -พารณ -พารณะ -พาร์ตเนอร์ -พารา -พาราฟิน -พาล -พาลา -พาลี -พาลีหลายหน้า -พาลุก -พาโล -พาไล -พาส -พาสน์ -พาสนา -พาสุกรี -พ่าห์ -พาหนะ -พาหะ -พาหา -พาหิรกะ -พาหิระ -พาหุ -พาเหรด -พาเหียร -พาฬ -พาฬหะ -พาฬะ -พำ -พำๆพึมๆ -พำนัก -พำพวก -พำพึม -พำลา -พิกล -พิกสิต -พิกัด -พิกัติ -พิกัน -พิการ -พิกุล -พิเคราะห์ -พิฆน์ -พิฆเนศ -พิฆเนศวร -พิฆาต -พิง -พิจล -พิจัย -พิจาร -พิจารณ์ -พิจารณา -พิจิต -พิจิตร -พิชญ์ -พิชย -พิชัย -พิชาน -พิชิต -พิเชฐ -พิเชียร -พิฑูรย์ -พิณ -พิดทูล -พิดรก -พิดาน -พิโดร -พิตร -พิถี -พิถีพิถัน -พิทย์ -พิทยา -พิทักษ์ -พิทักษ์สันติ -พิทูร -พิเทศ -พิธาน -พิธี -พิธุ -พิธุร -พิโธ่ -พินทุ -พินพง -พิ่นพั่ง -พินอบพิเทา -พินัย -พินาศ -พินิจ -พินิต -พินิศ -พินิศจัย -พิเนต -พิบัติ -พิบาก -พิบุล -พิบูล -พิปริต -พิปลาศ -พิปัสสนา -พิพรรธ -พิพรรธน์ -พิพักพิพ่วน -พิพัฒ -พิพัฒน์ -พิพากษ์ -พิพากษา -พิพาท -พิพิธ -พิภพ -พิภัช -พิภาค -พิภูษณะ -พิเภก -พิมพ์ -พิมพการัง -พิมพา -พิมโพหนะ -พิมล -พิมเสน -พิมาน -พิมุข -พิโมกข์ -พิโมกษ์ -พิโยกพิเกน -พิโยค -พิร -พิรอด -พิรากล -พิราบ -พิราม -พิราลัย -พิริยะ -พิรี้พิไร -พิรุณ -พิรุธ -พิรุฬห์ -พิเรนทร์ -พิเราะ -พิโรธ -พิโรธนะ -พิไร -พิลังกาสา -พิลาป -พิลาลส -พิลาส -พิลิปดา -พิโลล -พิไล -พิศ -พิศวง -พิศวาส -พิศาล -พิศุทธิ์ -พิเศษ -พิษ -พิษฐาน -พิษนาศน์ -พิสดาร -พิสมร -พิสมัย -พิสัง -พิสัช -พิสัญญี -พิสัย -พิสิฐ -พิสุทธิ์ -พิสูจน์ -พิหค -พิหาร -พิฬาร -พี -พี่ -พี้ -พีช -พีชคณิต -พี้โพ้ -พีระมิด -พึง -พึ่ง -พึ่บ -พึม -พึมพำ -พืช -พืด -พื้น -พุ -พุก -พุกาม -พุง -พุ่ง -พุงแก -พุงจง -พุงดอ -พุงทะลาย -พุงปลา -พุฒ -พุฒิ -พุด -พุดตาน -พุทธ -พุทธชาด -พุทธรักษา -พุทธะ -พุทธิ -พุทโธ่ -พุทรา -พุธ -พุ่ม -พุมเรียง -พุ้ย -พู -พู่ -พูกาม -พูด -พูน -พู้น -เพ -เพ็ก -เพกา -เพคะ -เพ็ง -เพ่ง -เพ็จ -เพชฉลูกรรม -เพชฌฆาต -เพชร -เพชรกลับ -เพชรดา -เพชรนิลจินดา -เพชรปราณี -เพชรฤกษ์ -เพชรสังฆาต -เพชรหลีก -เพชรหึง -เพชรายุธ -เพ็ญ -เพฑูริย์ -เพณี -เพ็ดทูล -เพดาน -เพตร -เพท -เพทนา -เพทยาธร -เพทาย -เพทุบาย -เพโทบาย -เพนกวิน -เพ่นพ่าน -เพนียด -เพ้ย -เพรง -เพรซีโอดีเมียม -เพรา -เพราะ -เพริด -เพริศ -เพรียก -เพรียง -เพรียบ -เพรี้ยม -เพรียว -เพรื่อ -เพรือง -เพล -เพลง -เพล็ด -เพล้โพล้ -เพลา -เพลาะ -เพลาะแพละ -เพลิง -เพลิดเพลิน -เพลิน -เพลีย -เพลี้ย -เพลี่ยง -เพศ -เพศยันดร -เพส -เพสลาด -เพ่อ -เพ้อ -เพอิญ -เพะ -เพิก -เพิกเฉย -เพิง -เพิ่ง -เพิดเพ้ย -เพิ่ม -เพี้ย -เพียง -เพี้ยง -เพียงออ -เพียชน์ -เพียน -เพี้ยน -เพียบ -เพียร -เพื่อ -เพื่อน -แพ -แพ้ -แพง -แพ่ง -แพงพวย -แพงพวยฝรั่ง -แพ็งแพว -แพทย์ -แพทยา -แพน -แพ่น -แพนก -แพนงเชิง -แพนดา -แพร -แพร่ -แพรก -แพร่ง -แพรว -แพร้ว -แพลง -แพลทินัม -แพลม -แพลเลเดียม -แพละ -แพละโลม -แพว -แพ้ว -แพศย์ -แพศยา -แพะ -แพะโลม -โพ -โพก -โพกพาย -โพง -โพงพาง -โพชฌงค์ -โพซิตรอน -โพด -โพแทสเซียม -โพธ -โพธิ์ -โพน -โพ้น -โพนทะนา -โพบาย -โพผัน -โพย -โพยม -โพยมัน -โพยมาน -โพรก -โพรง -โพรโทแอกทิเนียม -โพรมีเทียม -โพระดก -โพล่ -โพลง -โพล่ง -โพล้ง -โพลน -โพล้เพล้ -โพละ -โพสพ -ไพ -ไพ่ -ไพจิตร -ไพชน -ไพชยนต์ -ไพฑูรย์ -ไพโดร -ไพที -ไพบูลย์ -ไพพรรณ -ไพเพิด -ไพมอก -ไพม้า -ไพร -ไพร่ -ไพรจิตร -ไพรชน -ไพรชยนต์ -ไพรฑูรย์ -ไพรที -ไพรบูลย์ -ไพรเราะ -ไพรสามกอ -ไพรัช -ไพรำ -ไพริน -ไพรี -ไพรู -ไพเราะ -ไพโรจน์ -ไพล -ไพล่ -ไพศาข -ไพศาล -ไพเศษ -ไพสพ -ไพสิฐ -ไพหาร -ฟ -ฟก -ฟ้ง -ฟรักโทส -ฟรี -ฟลอร์โชว์ -ฟลูออรีน -ฟ่อ -ฟ้อ -ฟอก -ฟอง -ฟ่อง -ฟ้อง -ฟอด -ฟอน -ฟ่อน -ฟ้อน -ฟ้อแฟ้ -ฟอร์ม -ฟอร์มาลดีไฮด์ -ฟอร์มาลิน -ฟอสซิล -ฟอสฟอรัส -ฟอสเฟต -ฟะฟัด -ฟะฟั่น -ฟะฟ่าย -ฟัก -ฟักฟุ้น -ฟัง -ฟังก์ชัน -ฟังเพราะ -ฟัด -ฟัน -ฟั่น -ฟั้น -ฟันช้าง -ฟ้า -ฟาก -ฟาง -ฟ่าง -ฟาด -ฟาทอม -ฟาน -ฟ้าฝ่อ -ฟ่าม -ฟ้ามุ่ย -ฟาย -ฟาร์ม -ฟาสซิสต์ -ฟิก -ฟิด -ฟิต -ฟิบ -ฟิล์ม -ฟิวส์ -ฟิสิกส์ -ฟี่ -ฟี้ -ฟืน -ฟื้น -ฟืม -ฟุ -ฟุ้ง -ฟุต -ฟุน -ฟุบ -ฟุ่บ -ฟุฟะ -ฟุ่มเฟือย -ฟุลสแก๊ป -ฟู -ฟู่ -ฟูก -ฟูด -ฟูม -เฟ็ด -เฟ้น -เฟลด์สปาร์ -เฟ้อ -เฟอร์นิเจอร์ -เฟอร์เมียม -เฟอะ -เฟะ -เฟิน -เฟิร์น -เฟี้ยม -เฟี้ยว -เฟือ -เฟื่อ -เฟื้อ -เฟือง -เฟื้อง -เฟือน -เฟือย -แฟ่ -แฟง -แฟชั่น -แฟน -แฟนซี -แฟบ -แฟ้ม -แฟร์ -แฟรนเซียม -แฟลกซ์ -แฟลต -แฟะ -โฟกัส -ไฟ -ภ -ภค -ภควดี -ภควัต -ภควัทคีตา -ภควันต์ -ภควัม -ภควา -ภควาน -ภคันทลา -ภคินี -ภณ -ภณิดา -ภพ -ภมการ -ภมร -ภมุ -ภมุกะ -ภมุกา -ภยันตราย -ภยาคติ -ภร -ภรณี -ภรต -ภรตวรรษ -ภรตศาสตร์ -ภรรดร -ภรรดา -ภรรยา -ภระมร -ภระมรี -ภรัสดาษ -ภราดร -ภราดา -ภริยา -ภรู -ภฤงคาร -ภฤดก -ภฤดี -ภฤตย์ -ภฤศ -ภฤษฏ์ -ภว -ภวัคร -ภวังค์ -ภักขะ -ภักดี -ภักตะ -ภักติ -ภักษ์ -ภัค -ภัคน์ -ภังคะ -ภังคี -ภัจ -ภัญชะ -ภัณฑ์ -ภัณฑครรภ -ภัณฑนะ -ภัณฑาคาร -ภัณฑาคาริก -ภัณฑารักษ์ -ภัณฑู -ภัต -ภัตร -ภัทร -ภัพ -ภัย -ภัสดา -ภัสตรา -ภัสมะ -ภัสสร -ภา -ภาค -ภาคภูมิ -ภาคย์ -ภาคยานุวัติ -ภาคินี -ภาคิไนย -ภาคี -ภาคียะ -ภาชนะ -ภาชี -ภาณ -ภาณก -ภาณี -ภาณุ -ภาดร -ภาดา -ภาตร -ภาตา -ภาติกะ -ภาติยะ -ภาตุ -ภาพ -ภาพย์ -ภาพยนต์ -ภาม -ภาย -ภาร -ภารดี -ภารต -ภารตี -ภารยทรัพย์ -ภารยา -ภารโรง -ภาระ -ภารา -ภาวนา -ภาวะ -ภาษ -ภาษก -ภาษณ์ -ภาษา -ภาษิต -ภาษี -ภาส -ภาสน์ -ภาสา -ภาสุร -ภิกขา -ภิกขุ -ภิกขุนี -ภิกษา -ภิกษุ -ภิกษุณี -ภิงคาร -ภิงส -ภิงสนะ -ภิงสร -ภิญโญ -ภิตติ -ภิท -ภินท์ -ภิยโย -ภิรมย์ -ภิรมย์สุรางค์ -ภิษัช -ภิส -ภิสัก -ภีตะ -ภีม -ภีรุ -ภุกต์ -ภุขัน -ภุช -ภุญช -ภุต -ภุม -ภุมระ -ภุมรา -ภุมริน -ภุมรี -ภุมเรศ -ภุส -ภู -ภู่ -ภูโช -ภูดาด -ภูต -ภูติ -ภูตี -ภูม -ภูมิ -ภูมิคุ้มกัน -ภูมิแพ้ -ภูมี -ภูรโลก -ภูริ -ภูรี -ภูษา -ภูษิต -เภกะ -เภคะ -เภตรา -เภท -เภรว -เภริ -เภรี -เภสัช -เภสัชเพลา -โภค -โภคทรัพย์ -โภคภัณฑ์ -โภคยทรัพย์ -โภคิน -โภคี -โภไคย -โภไคศวรรย์ -โภช -โภชก -โภชน์ -โภชนะ -โภชนากร -โภชนาการ -โภชนาหาร -ไภรพ -ไภริน -ไภรี -ไภษัชคุรุ -ไภษัชย์ -ม -มก -มกร -มกรกุณฑล -มกรเกตน์ -มกรธวัช -มกรพาหน -มกรากร -มกราคม -มกราลัย -มกราวาส -มกส -มกุฎ -มกุล -มคธ -มฆ -มฆวัน -มฆา -ม่ง -มงกุฎ -มงโกรย -มงคล -มงคลจักร -มงคลพิธี -มงคลวาท -มงคลวาร -มงคลสมรส -มงคลสมัย -มงคลสูตร -มงคลหัตถี -มณฑ์ -มณฑก -มณฑนะ -มณฑป -มณฑล -มณฑา -มณฑารพ -มณฑิร -มณเฑียร -มณี -มด -มดเท็จ -มดยอบ -มดลูก -มดาย -มดี -มตะ -มติ -มท -มทนะ -มทนียะ -มธุ -มธุระ -มน -ม่น -มนต์ -มนตร์ -มนตรี -มนท์ -มนทิร -มนทิราลัย -มนเทียร -มนสิการ -มนัส -มนาโป -มนิมนา -มนิลา -มนีมนา -มนุ -มนุญ -มนุษย์ -มนุสาร -มนู -มนูสาร -มโน -มโนราห์ -มโนสาร -มโนสาเร่ -มโนห์รา -มมังการ -มมาก -มยุระ -มยูข -มยูร -มร -มรกต -มรคา -มรฑป -มรณ์ -มรณะ -มรดก -มรรค -มรรคา -มรรตย -มรรตัย -มรรทน -มรรยาท -มรรษ -มรสุม -มรัมเทศ -มรานควาน -มริจ -มริยาท -มรีจิ -มรุ -มรุต -มฤค -มฤคย์ -มฤจฉา -มฤดก -มฤต -มฤตก -มฤตยู -มฤทิงค์ -มฤทุ -มฤธุ -มฤษา -มล -มลโค -มลทิน -มลน -มล่น -มลวก -มล่อน -มล่อย -มละ -มลัก -มลังเมลือง -มล้า -มลาก -มล้าง -มลาน -มล่าน -มลาย -มลายู -มลาว -มล่าวเมลา -มลาหรา -มลิน -มลิ้น -มลื่น -มวก -ม่วง -มวน -ม่วน -ม้วน -มวย -ม่วย -ม้วย -มวล -มสาร -มสารก -มสารคัล -มสิ -มหกรรม -มหรณพ -มหรรฆ -มหรรณพ -มหรสพ -มหัจฉริยะ -มหัณณพ -มหัต -มหัตฆ -มหัทธนะ -มหันต์ -มหัพภาค -มหัล -มหัลกะ -มหัศจรรย์ -มหา -มหากฐิน -มหากาฬ -มหาขันธก -มหาจักร -มหาชน -มหาชัย -มหาชาติ -มหาโชตรัต -มหาดไทย -มหาดเล็ก -มหาตมะ -มหาไถ่ -มหาทวีป -มหาเทพ -มหาเทพี -มหาเทวี -มหาธาตุ -มหานรก -มหานสะ -มหานิกาย -มหานิล -มหาบพิตร -มหาบริจาค -มหาบัณฑิต -มหาบุรุษ -มหาพน -มหาพรหม -มหาภารต -มหาภิเนษกรมณ์ -มหาภูต -มหาเมฆ -มหายาน -มหายุค -มหารณพ -มหาราช -มหาราชลีลา -มหาฤกษ์ -มหาละลวย -มหาละลาย -มหาวงศ์ -มหาวรรค -มหาวัต -มหาวิทยาลัย -มหาศักราช -มหาศาล -มหาศูนย์ -มหาเศรษฐี -มหาสงกรานต์ -มหาสงคราม -มหาสดมภ์ -มหาสดำ -มหาสมุทร -มหาสันนิบาต -มหาสาวก -มหาสาวิกา -มหาสิทธิโชค -มหาสีมา -มหาเสวก -มหาหงส์ -มหาหิงคุ์ -มหาอำนาจ -มหาอำมาตย์ -มหาอุจ -มหาอุด -มหาอุปรากร -มหิ -มหิงส์ -มหิทธิ -มหินท์ -มหิมา -มหิศร -มหิศวร -มหิษ -มหิษี -มหึมา -มหุดิฤกษ์ -มหุรดี -มหุรติสัญญา -มหู -มเหนทร์ -มเหยงค์ -มเหศ -มเหศวร -มเหศักดิ์ -มเหสักข์ -มเหสิ -มเหสี -มเหาษธ -มเหาฬาร -มโหฆ -มโหรทึก -มโหรสพ -มโหรี -มโหษธ -มโหฬาร -มไหศวรรย์ -มอ -มอง -ม่อง -มองโกลอยด์ -มองคร่อ -ม่องเท่ง -มอญ -ม่อต้อ -มอเตอร์ -มอน -ม่อน -มอนไข่ -มอบ -ม่อย -มอร์ฟีน -มอระกู่ -มอลโทส -ม่อลอกม่อแลก -ม่อฮ่อม -มะ -มะกรูด -มะกล่ำ -มะกอก -มะก่อง -มะก่อตาหมู -มะกะโรนี -มะกา -มะเกลือ -มะเกี๋ยง -มะข่วง -มะขวิด -มะขาม -มะขามเทศ -มะขามป้อมดิน -มะเขือ -มะเขือทวาย -มะเขือเทศ -มะเขือพวง -มะเขือมอญ -มะแข่น -มะคะ -มะคังแดง -มะค่า -มะคำไก่ -มะคำดีควาย -มะงัน -มะงั่ว -มะงุมมะงาหลา -มะซัก -มะซาง -มะซ่าน -มะดะขี้นก -มะดัน -มะดา -มะดูก -มะเดหวี -มะเดื่อ -มะต้อง -มะตะบะ -มะตาด -มะตาหะรี -มะตี -มะตึ่ง -มะตื๋น -มะตูม -มะแตก -มะนาว -มะปราง -มะปริง -มะป่อง -มะฝ่อ -มะพร้าว -มะพลับ -มะพูด -มะแพน -มะแพร้ว -มะเฟือง -มะแฟน -มะไฟ -มะม่วง -มะม่าว -มะมี่ -มะมื่น -มะมุด -มะเมอ -มะเมีย -มะเมื่อย -มะแม -มะยง -มะยม -มะระ -มะริด -มะรืน -มะรุม -มะรุมมะตุ้ม -มะเร็ง -มะเรื่อง -มะโรง -มะละกอ -มะลารอกัน -มะลำ -มะลิ -มะลิน -มะลิ่ม -มะลิเลื้อย -มะลิอ่อง -มะลื่น -มะลืมดำ -มะลุลี -มะวาร -มะหลิ่ม -มะหวด -มะหะหมัด -มะหัล -มะหาด -มะหิ่ง -มะเหมื่อย -มะอึก -มะฮอกกานี -มัก -มักกะลีผล -มักกะสัน -มักขะ -มั่กขั้ก -มักขิกา -มักขิกาชาติ -มักฏกะ -มักฏะ -มัคคะ -มัคคุเทศก์ -มัคสิระ -มัฆวา -มัฆวาน -มั่ง -มังกง -มังกร -มังกุ -มังคละ -มังค่า -มังคุด -มังตาน -มังสะ -มังสี -มังหงัน -มัจจะ -มัจจุ -มัจฉระ -มัจฉริยะ -มัจฉรี -มัจฉะ -มัจฉา -มัชชะ -มัชชาร -มัญจก -มัญจา -มัญชิษฐ -มัญชิษฐา -มัญชีร -มัญชุ -มัญชุสา -มัญชูสา -มัญเชฏฐะ -มัญเชฏฐิกา -มัญเชียร -มัฏฐะ -มัณฑนา -มัณฑุก -มัด -มัดหมี่ -มัดหมู -มัดหวาย -มัตตะ -มัตตัย -มัตตา -มัตติกา -มัตถก -มัตถลุงค์ -มัตย -มัตสยะ -มัตสยา -มัตสร -มัตสรรย์ -มัทนะ -มัทนียะ -มัทยะ -มัธยม -มัธยมา -มัธยันห์ -มัธยัสถ์ -มัน -มั่น -มันดี -มันตา -มันถะ -มันทิร -มันทิราลัย -มันไส้ -มับ -มับๆ -มั้ม -มัมมี่ -มัย -มัลก -มัลละ -มัลลิกา -มัว -มั่ว -มัศยา -มัสดก -มัสดุ -มัสตาร์ด -มัสตุ -มัสมั่น -มัสยิด -มัสรู่ -มัสลิน -มัสสุ -มา -ม้า -มาก -มาคสิระ -มาฆะ -ม้าง -มางสะ -มาณพ -มาณวิกา -มาด -มาดา -มาตงค์ -มาตร -มาตรการ -มาตรจอดรถ -มาตรฐาน -มาตรแม้น -มาตรว่า -มาตรา -มาตฤ -มาตฤกะ -มาตสรรย์ -มาตังค -มาตา -มาตามหะ -มาตามหัยกะ -มาตามหัยกา -มาตามหัยยิกา -มาตามหา -มาติก -มาติกา -มาตี -มาตุ -มาตุจฉา -มาตุรงค์ -มาตุเรศ -มาตุละ -มาตุลา -มาตุลานี -มาตุลุงค์ -มาท -มาทน -ม้าทลายโรง -มาธยมิกะ -มาธุร -มาธุสร -มาธูร -มาน -ม่าน -ม้าน -มานพ -ม่านลาย -ม่านอินทนิล -มานะ -มานัต -มานัส -มานิต -มานี -มานุษ -มาโนชญ์ -มาบ -มาปก -มาภา -ม้าม -มาย -ม่าย -ม้าย -มายัง -มายา -มาร -มารค -มารคอหอย -มารชิ -มารชิต -มารดร -มารดา -มาร์ดิกราส์ -มารผจญ -มารยา -มารยาท -มารวิชัย -มารวิชิต -มารเวตาล -มารศรี -มารษา -มารสังคม -มารหัวขน -มารหัวใจ -มาระ -มาราธอน -ม้ารำ -มาริ -มาริต -มาริษะ -มาริสะ -มารุต -มารุมมาตุ้ม -มาลย์ -มาลัย -มาลา -มาลาตี -มาลาเรีย -มาลำ -มาลินี -มาลี -มาลุต -มาวสะ -มาวาร -มาศ -มาส -มาสก -ม้าสะบัดกีบ -มาห์ -ม่าห์ -มาหิส -ม่าเหมี่ยว -มาฬก -ม้าอ้วน -มำเลือง -มิ -มิค -มิ่ง -มิงโค -มิจฉา -มิชชันนารี -มิซซัง -มิด -มิดหมี -มิตร -มิติ -มิถยา -มิถุน -มิทธะ -มิทธี -มินตรา -มินตา -มินหม้อ -มิน่า -มิน่าล่ะ -มิน่าเล่า -มิ้ม -มิยา -มิไย -มิรันตี -มิลลิกรัม -มิลลิบาร์ -มิลักขะ -มิลักขู -มิลาต -มิลิเมตร -มิสกรี -มิสซา -มี -มี่ -มีด -มีดยับ -มีเทน -มีน -มี่สั้ว -มึก -มึง -มึงวาพาโวย -มึน -มืด -มืน -มื่น -มือ -มื้อ -มุ -มุก -มุกดา -มุกดาหาร -มุกุร -มุกุล -มุข -มุโขโลกนะ -มุคคะ -มุคธ์ -มุคร -มุง -มุ่ง -มุ้ง -มุงกระต่าย -มุจฉา -มุจน -มุจลินท์ -มุญจนะ -มุญช -มุฐิ -มุณฑ -มุณฑก -มุด -มุต -มุตตะ -มุตตา -มุตติ -มุติ -มุติงค์ -มุทค -มุทคร -มุททา -มุทธชะ -มุทธา -มุทรา -มุทริกา -มุทะลุ -มุทา -มุทิกา -มุทิงค์ -มุทิตา -มุทิน -มุทุ -มุ่น -มุนิ -มุนี -มุบ -มุบๆ -มุม -มุ่ม -มุ้ม -มุ่ย -มุรช -มุรธา -มุลสะ -มุลุต -มุลู -มุสลิม -มุสะ -มุสา -มุสิก -มุหงิด -มุหน่าย -มุหุต -มูก -มูกมัน -มูกหลวง -มูซัง -มูเซอ -มูตร -มู่ทู่ -มูน -มูมมาม -มูรดี -มูรติ -มูรธา -มูล -มูลา -มูลิกากร -มู่ลี่ -มู่เล่ -มูสิก -เม -เม็ก -เมกะเฮิรตซ์ -เมขลา -เมฆ -เมฆฉาย -เมฆพัด -เม็ง -เมงอะปา -เม็ด -เมตตา -เมตไตรย -เมตร -เมตริก -เมตริกตัน -เมถุน -เมท -เมทนี -เมทินี -เมทิลแอลกอฮอล์ -เมโท -เมธ -เมธา -เมธาวี -เมธี -เมน -เม่น -เม้น -เมนเดวีเลียม -เมนทอล -เมนู -เม้ม -เมย์เดย์ -เมรัย -เมรุ -เมล์ -เมลก -เมล็ด -เมลือง -เมลื่อย -เมลื้อย -เมษ -เมห -เมห์ -เมหน -เมะ -เมา -เม่า -เม้า -เม้าเค้า -เมารี -เมาลิด -เมาลี -เมาห์ -เมาะ -เมาะตาโยกัก -เมิง -เมิน -เมิล -เมีย -เมียง -เมี่ยง -เมี้ยน -เมี้ยวๆ -เมือ -เมื่อ -เมื้อ -เมือก -เมือง -เมือบ -เมื่อย -แม่ -แม้ -แมก -แมกนีเซียม -แมง -แมงกานิน -แมงกานีส -แมงปากจอบ -แมงไฟเดือนห้า -แม่งม้าง -แมงลัก -แม่ตะงาว -แม่ตาย -แมน -แม่น -แม้น -แม้นเขียน -แมนดาริน -แม่ม่านลองไน -แมร -แมลง -แมลบ -แมว -แม้ว -แมะ -โม -โม่ -โม้ -โมก -โมกข์ -โมกโคก -โมกษะ -โมกุล -โมฆะ -โมฆียะ -โมง -โม่ง -โมงครุ่ม -โมเต็ล -โมทนา -โมน -โมเนต์ -โมโนแซ็กคาไรด์ -โมไนย -โมมูห์ -โมมูหะ -โมเม -โมรา -โมรี -โมเรศ -โมลิบดีนัม -โมลี -โมเลกุล -โมษ -โมษก -โมษณ -โมเสส -โม่ห์ -โมหะ -โมโห -ไมกา -ไมครอน -ไมโคกรัม -ไมโครฟิล์ม -ไมโครโฟน -ไมโครมิเตอร์ -ไมโครเมตร -ไมโครลิตร -ไมโครเวฟ -ไมตรี -ไม่ไม้ -ไมยราบ -ไมล์ -ย -ยก -ยกกระบัตร -ยกน -ยง -ยงยุทธ์ -ยงโย่ -ยชุรเวท -ยติ -ยถา -ย่น -ยนต์ -ยนตร์ -ยม -ยมก -ยมโดย -ยมนา -ยมล -ยรรยง -ยล -ยว -ยวกสา -ยวง -ยวด -ยวดยาน -ยวน -ยวบ -ย้วย -ยวรยาตร -ยวา -ยวาคุ -ยศ -ยโส -ยอ -ยอก -ยอกย้อน -ย็อกแย็ก -ย็อกแย็กๆ -ยอง -ย่อง -ย้อง -ยองๆ -ย่องเหง็ด -ยอด -ยอดจาก -ยอน -ย้อน -ยอบ -ยอม -ย่อม -ย้อม -ย่อย -ย้อย -ย้อแย้ -ยะ -ย่ะ -ยะงันจะคับ -ยะยอบ -ยะยัน -ยะยับ -ยะยาน -ยะย้าย -ยะย้าว -ยะแย้ง -ยะหิทา -ยัก -ยักข์ -ยักขินี -ยักเพรีย -ยักยี่ยักยัน -ยักยี่ยักหยา -ยักแย่ยักยัน -ยักษ์ -ยักษิณี -ยักษี -ยักหยาว -ยัง -ยั้ง -ยังกาหลา -ยั่งยืน -ยังหยัง -ยัชโญปวีต -ยัชน -ยัชมาน -ยัญ -ยัญญะ -ยัญญังค์ -ยัฐิ -ยัฐิมธุกา -ยัด -ยัติภังค์ -ยัน -ยั่น -ยันต์ -ยันตร์ -ยั่นตะนี -ยันเย้า -ยับ -ยับๆ -ยับยั้ง -ยั่ว -ยั้ว -ยั้วเยี้ย -ยัวรยาตร -ยัษฏิ -ยา -ย่า -ยาก -ยาค -ยาคุ -ยาคู -ยาง -ย่าง -ย่างทราย -ยาจก -ยาจน -ยาจนก -ยาจนา -ยาไฉน -ยาชก -ยาด -ยาดา -ยาตนา -ยาตร -ยาตรา -ยาน -ย่าน -ยานก -ย่านกอบนาง -ย่านทราย -ย่านพาโหม -ย่านมควาย -ยานมาศ -ย่านลิเภา -ย่านาง -ย่านางช้าง -ยานี -ยานุมาศ -ยาบ -ยาบๆ -ย่าม -ยามกาลิก -ยามเกา -ยามักการ -ยามิก -ยาย -ย้าย -ยายี -ยาว -ย้าว -ยาวกาลิก -ยาวชีวิก -ยาวัส -ยาหยัง -ยาหยา -ยาหยี -ยำ -ย่ำ -ย้ำ -ยำยาม -ยำเยีย -ย่ำแย่ -ย้ำเหยอ -ยิก -ยิกๆ -ยิง -ยิ่ง -ยิงฟัน -ยิฏฐะ -ยิฐ -ยิน -ยิบ -ยิบๆ -ยิปซัม -ยิปซี -ยิ้ม -ยิมนาสติก -ยิหวา -ยี -ยี่ -ยี่ก่า -ยี่เก -ยี่เข่ง -ยี่โถ -ยีน -ยี่โป้ -ยี่ภู่ -ยีราฟ -ยี่สก -ยี่สง -ยี่สน -ยี่สาน -ยี่ส่าน -ยี่สิบ -ยี่สุ่น -ยี่หระ -ยี่หร่า -ยี่ห้อ -ยี่หุบ -ยึกยือ -ยืด -ยืน -ยื่น -ยืม -ยื้อ -ยุ -ยุกกระบัตร -ยุกดิ -ยุกต์ -ยุกติ -ยุค -ยุคนธร -ยุคล -ยุคลบาท -ยุคันต์ -ยุคันธร -ยุคุนธร -ยุง -ยุ่ง -ยุ้ง -ยุงกวาด -ยุงปัด -ยุด -ยุต -ยุติ -ยุทธ์ -ยุทธนา -ยุบ -ยุ่บยั่บ -ยุบยิบ -ยุบล -ยุพดี -ยุพา -ยุพาน -ยุพาพาล -ยุพาพิน -ยุ่มย่าม -ยุ่ย -ยุ้ย -ยุรบาตร -ยุรยาตร -ยุวดี -ยุวา -ยุวาน -ยุหบาตร -ยู -ยู่ -ยูคาลิปตัส -ยูง -ยูโด -ยูถะ -ยูถิกา -ยูปะ -ยูรยาตร -ยูริก -ยูเรนัส -ยูเรเนียม -ยูโรเพียม -ยูษะ -ยู่อี่ -เย้ -เยๆ -เยง -เยซู -เย็ด -เย็น -เย็นตาโฟ -เย็นเตาโฟ -เย็บ -เยภุยยะ -เย้ย -เยอ -เย่อ -เยอรมัน -เยอว -เย่อหยิ่ง -เยอะ -เยา -เย้า -เยาว์ -เยาวพา -เยาวพาณี -เยาวพาน -เยิง -เยิน -เยิ่น -เยินยอ -เยิบๆ -เยิบยาบ -เยิ้ม -เยีย -เยี่ยง -เยียงผา -เยี่ยงอย่าง -เยียดยัด -เยียน -เยียบ -เยี่ยม -เยี่ยมวิมาน -เยียรบับ -เยียรยง -เยียว -เยี่ยว -เยี่ยวงีว -เยียวยง -เยียวยา -เยือ -เยื่อ -เยื้อ -เยือก -เยือง -เยื่อง -เยื้อง -เยือน -เยื้อน -แย่ -แย้ -แยก -แยง -แย่ง -แย้ง -แยงแย่ -แยงแย้ -แยบ -แย็บ -แยม -แย้ม -แยแส -แยะ -โย -โย้ -โยก -โยกตร์ -โยคเกณฑ์ -โยคยะ -โยคะ -โยคิน -โยคี -โยง -โย่งๆ -โยงโย่ -โยชก -โยชน์ -โยชนา -โยด -โยต -โยถิกะ -โยทะกา -โยธา -โยน -โยนก -โยนิโส -โยนิโสมนสิการ -โยนี -โยพนะ -โยม -โยโส -ใย -ไย -ไย่ -ไยดี -ไยไพ -ไยไย -ไย่ไย่ -ร -รก -รกช้าง -รกฟ้า -รง -รงกุ์ -รงค์ -รงรอง -รจนา -รจเรข -รจเลข -รจิต -รชกะ -รชตะ -รชนิ -รชนี -รชนีย์ -รชะ -รณ -รด -รดี -รตนะ -รตะ -รติ -รถ -รถปุงคพ -รถปุงคว -รถยา -รถานึก -รเถสภะ -รท -รทนะ -รน -ร่น -ร้น -รนด -รบ -รบส -รบาญ -รพ -รพา -รพิ -รพี -รม -รมณีย์ -รมย์ -รมเยศ -รยะ -รวก -รวง -ร่วง -รวด -รวน -ร่วน -รวบ -รวม -ร่วม -รวย -รวยๆ -รวะ -รวิ -รวี -รศนา -รส -รสก -รสนา -รสสุคนธ์ -รสายนเวท -รสิก -รหัท -รหัส -รหัสย์ -รหิต -รโห -รอ -ร่อ -รอก -รอง -ร่อง -ร้อง -รองเง็ง -ร่องแร่ง -รอด -รอน -ร่อน -ร้อน -ร่อนทอง -รอบ -รอม -รอมชอม -รอมร่อ -รอย -ร่อย -ร้อย -ร้อยรู -ร่อแร่ -ระ -ระกะ -ระกา -ระกำ -ระเกะระกะ -ระคน -ระคาง -ระคาย -ระเค็ดระคาย -ระแคะ -ระฆัง -ระงม -ระงมไพร -ระงับ -ระงับพิษ -ระงี่ -ระแง้ -ระโงกหิน -ระชวย -ระดม -ระดะ -ระดับ -ระดา -ระด่าว -ระดู -ระเด่น -ระเดียง -ระแด -ระตู -ระทก -ระทด -ระทม -ระทวย -ระทอด -ระทา -ระทึก -ระทึง -ระแทะ -ระนัม -ระนาด -ระนาบ -ระนาม -ระนาว -ระเนน -ระเนนระนาด -ระเนระนาด -ระเนียด -ระแนง -ระแนะ -ระบบ -ระบม -ระบอบ -ระบัด -ระบับ -ระบาญ -ระบาด -ระบานี -ระบานี้ -ระบาย -ระบำ -ระบิ -ระบิล -ระบือ -ระบุ -ระบู -ระเบง -ระเบ็ง -ระเบิด -ระเบียง -ระเบียน -ระเบียบ -ระแบบ -ระใบ -ระมัดระวัง -ระมา -ระมาด -ระเมียร -ระย่อ -ระย่อม -ระยะ -ระยัง -ระยั้ง -ระยัด -ระยับ -ระย้า -ระยาน -ระยาบ -ระยามระยับ -ระยำ -ระยิบระยับ -ระโยง -ระรวย -ระรอง -ระร่อน -ระรัว -ระราน -ระร่าย -ระราว -ระริก -ระรี่ -ระรึง -ระรื่น -ระรื้น -ระเร -ระเร่ -ระเร้ง -ระเร็ว -ระเริง -ระเรียง -ระเรียม -ระเรื่อย -ระแร่ -ระแรง -ระลง -ระลวง -ระลอก -ระลัด -ระลึก -ระลุก -ระลุง -ระเลิง -ระเลียด -ระวัง -ระวังไพร -ระวังวัน -ระวาง -ระวาดระไว -ระวาม -ระวาย -ระวิง -ระแวง -ระแวดระวัง -ระไว -ระสาย -ระส่ำระสาย -ระสี -ระเสิดระสัง -ระหกระเหิน -ระหง -ระหวย -ระหว่าง -ระหองระแหง -ระหอบ -ระหัด -ระหาย -ระหุย -ระเห็จ -ระเหย -ระเหระหน -ระเหหน -ระเหหัน -ระเหิด -ระเหินระหก -ระแหก -ระแหง -ระโหย -ระอมระอา -ระอา -ระอิดระอา -ระอึก -ระอุ -ระแอน -รัก -รักข์ -รักขสะ -รักขา -รักขิต -รักดป -รักดะ -รักตะ -รักบี้ -รักเร่ -รักแร้ -รักษ์ -รักษา -รัง -รั้ง -รังแก -รังค์ -รังควาน -รังแค -รังนาน -รังรอง -รังวัด -รังสิ -รังสิมันตุ์ -รังสิมา -รังสี -รังหยาว -รัจฉา -รัช -รัชกะ -รัชชุ -รัชฎาภิเษก -รัชนะ -รัชนี -รัญจวน -รัฏฐาภิปาลโนบาย -รัฐ -รัด -รัต -รัตคน -รัตตัญญู -รัตติ -รัตน์ -รัตนะ -รัตมา -รัถ -รัถยา -รัทเทอร์ฟอร์เดียม -รัน -รั้น -รันชนรันแชง -รันทด -รันทวย -รันทำ -รันแทะ -รันธะ -รับ -รัมภา -รัมมี่ -รัมย์ -รัย -รัว -รั่ว -รั้ว -รัศมิมัติ -รัศมิมาน -รัศมี -รัษฎากร -รัสสะ -รา -ร่า -ร้า -ราก -รากษส -รากโษส -รากสาด -ราคะ -ราคา -ราคิน -ราคี -ราง -ร่าง -ร้าง -รางจืด -รางชาง -รางดำ -รางแดง -รางนาน -รางวัล -ราช -ราชญี -ราชดัด -ราชพฤกษ์ -ราชมาณพ -ราชย์ -ราชะ -ราชัน -ราชันย์ -ราชัย -ราชา -ราชายตนะ -ราชาวดี -ราชิ -ราชินี -ราชี -ราเชน -ราเชนทรยาน -ราญ -ราญรอน -ราด -ราต -ราตร -ราตรี -ราตรีประดับดาว -ราโท -ราธา -ราน -ร่าน -ร้าน -ราบ -ราพณ์ -ราม -รามเกียรติ์ -รามสูร -รามัญ -รามา -ราย -ร่าย -ร้าย -ร่ายรัง -ราว -ร้าว -ราวี -ราศี -ราษฎร -ราษฎร์ -ราษตรี -ราษราตริน -ราษราตรี -ราสี -ราหุ -ร่าหุ์ -ราหู -รำ -ร่ำ -รำคาญ -รำงับ -รำจวน -รำซุย -รำบาญ -รำพัน -รำพาย -รำพึง -รำเพย -รำไพ -รำมะเข -รำมะนา -รำมะนาด -รำมะร่อ -รำยวน -รำย้อย -รำแย้ -ร่ำรวย -รำราญ -รำรำ -รำเร -รำไร -รำลึก -รำหัด -รำหัส -ริ -ริก -ริกๆ -ริดสีดวง -ริน -ริ้น -รินๆ -ริบ -ริบบิ้น -ริบรี่ -ริบหรี่ -ริปุ -ริปู -ริม -ริ้ว -ริษยา -รี -รี่ -รี้ -รีๆขวางๆ -รีๆรอๆ -รีด -รีดักชัน -รีต -รีเนียม -รีบ -รีม -รีรอ -รี้ริก -รึกต์ -รึง -รึ้ง -รื่น -รื้น -รื้อ -รุ -รุก -รุกข์ -รุกขกะ -รุกขา -รุกรุย -รุกษะ -รุ่ง -รุ้ง -รุงรัง -รุจ -รุจน -รุจา -รุจิ -รุจิระ -รุจิรา -รุจี -รุชา -รุด -รุต -รุทธ์ -รุทร -รุธิร -รุเธียร -รุน -รุ่น -รุบรู่ -รุบาการ -รุม -รุ่ม -รุ่มร่าม -รุย -รุ่ย -รุรุ -รุษฏ์ -รุหะ -รุหาญ -รู -รู่ -รู้ -รูจี -รูด -รูทีเนียม -รู้นอน -รูบิเดียม -รูป -รูปิยะ -รูปี -รูเล็ตต์ -รูหา -เร่ -เรข -เรขา -เรขาคณิต -เร็ง -เร่ง -เร้ง -เรณุ -เรณุก -เรณู -เรดอน -เรดาร์ -เรเดียม -เร้น -เรยอง -เรรวน -เรไร -เร็ว -เร่ว -เรวดี -เรอ -เร่อ -เรา -เร่า -เร้า -เร่าๆ -เราะ -เริง -เริด -เริม -เริ่ม -เริ้ม -เริศร้าง -เรี่ย -เรี้ยๆ -เรียก -เรียง -เรียงๆ -เรียด -เรียน -เรียบ -เรียม -เรี่ยม -เรียว -เรี่ยว -เรี้ยวรก -เรือ -เรื่อ -เรื้อ -เรือก -เรือกสวน -เรือง -เรื่อง -เรื้อง -เรืองรอง -เรือด -เรือน -เรื้อน -เรื้อย -แร -แร่ -แรก -แร็กเกต -แรง -แร่ง -แร้ง -แร่งริ้ว -แร่งไหม -แรด -แร้นแค้น -แรม -แร้ว -แระ -โร -โร่ -โรค -โรง -โรจ -โรจน์ -โรเดียม -โรตี -โรท -โรทนะ -โรธ -โรธร -โรเนียว -โรปนะ -โรม -โรมัญจ -โรมัน -โรมันคาทอลิก -โรเมอร์ -โรย -โรเร -โรษ -โรษณะ -โรหิณี -โรหิต -ไร -ไร่ -ไร้ -ไรฟัน -ไรย์ -ฤ -ฤกษ์ -ฤกษณะ -ฤคเวท -ฤชา -ฤชุ -ฤณ -ฤดี -ฤดียา -ฤดู -ฤต -ฤติยา -ฤตุ -ฤตุสนาน -ฤทธา -ฤทธิ์ -ฤทัย -ฤษภ -ฤษยา -ฤษี -ฤๅ -ฤๅชุ -ฤๅดี -ฤๅทัย -ฤๅษี -ฤๅสาย -ล -ลก -ลการ -ลกุจ -ลคุฑ -ลคุฬ -ลฆุ -ลง -ล่ง -ลงกา -ล้งเล้ง -ลด -ลดา -ลน -ล่น -ล้น -ลบ -ลบม -ลบอง -ลปก -ลปน -ลพ -ลพุช -ลม -ล่ม -ล้ม -ลมาด -ลรรลุง -ลลนา -ลลาฏ -ลลิต -ลวก -ลวง -ล่วง -ล้วง -ลวงค์ -ลวงเล้า -ลวณะ -ลวด -ล้วน -ลวนลาม -ลวนะ -ล่วม -ลวะ -ลวิตร -ลหุ -ลหุกะ -ล่อ -ล้อ -ลอก -ล็อกเกต -ลอกแลก -ลอการิทึม -ลอง -ล่อง -ลองกอง -ลองจิจูด -ลองไน -ลอด -ลอตเตอรี่ -ลอน -ล่อน -ลอบ -ลอม -ล้อม -ลอมชอม -ล้อมปรวด -ลอมพอก -ลอย -ล่อย -ล่อแล่ -ลอว์เรนเซียม -ลออ -ละ -ล่ะ -ละกล -ละกูมะนิส -ละขัดละขืน -ละคร -ละคิ -ละคึก -ละงาด -ละงิด -ละติจูด -ละบมละบอง -ละบัด -ละบือ -ละเบ็ง -ละโบม -ละม่อม -ละมั่ง -ละมา -ละมาน -ละม้าย -ละมุ -ละมุด -ละมุน -ละเม็งละคร -ละเม็ด -ละเมอ -ละเมาะ -ละเมิด -ละเมียด -ละเมียบ -ละแมะ -ละโมก -ละโมบ -ละไม -ละรี -ละลนละลาน -ละลมละลาย -ละลวย -ละลอก -ละลอบละเล้า -ละลัง -ละลัด -ละล้า -ละลาน -ละลาบละล้วง -ละลาย -ละล้าว -ละล่ำละลัก -ละลิบ -ละลุง -ละลุม -ละเลง -ละเล้า -ละเลาะ -ละเลาะละลอง -ละเลิง -ละเลียด -ละเลียบ -ละเลือก -ละไล้ -ละวล -ละว้อ -ละว้า -ละวาด -ละเวง -ละแวก -ละโว้ -ละหมาด -ละหมาดญานาซะฮ์ -ละหลัด -ละห้อย -ละหาน -ละหุ่ง -ละเหย -ละเหี่ย -ละออง -ละอองมั่ง -ละอาย -ละเอียด -ละแอน -ลัก -ลักขณะ -ลักขณา -ลักขะ -ลักจั่น -ลักปิดลักเปิด -ลักษณะ -ลักษมณ์ -ลักษมาณา -ลักษมี -ลักษะ -ลัคคะ -ลัคน์ -ลัคนา -ลัง -ลั่ง -ลังกา -ลังคิ -ลังคี -ลังถึง -ลังลอง -ลังเล -ลังสาด -ลัชชา -ลัชชี -ลัญจ์ -ลัญจกร -ลัญฉ -ลัญฉกร -ลัญฉน์ -ลัฐิ -ลัฐิกา -ลัด -ลัดา -ลัทธ์ -ลัทธิ -ลัน -ลั่น -ลันเต -ลันเตา -ลันไต -ลั่นถัน -ลั่นทม -ลันทวย -ลันโทม -ลับ -ลัพธ์ -ลัพธิ -ลัภ -ลัภนะ -ลัภย์ -ลัมพ์ -ลัย -ลัวะ -ลา -ล่า -ล้า -ลาก -ลากษา -ลาขา -ลาง -ล่าง -ล้าง -ลางคัล -ลางงิด -ลางลิง -ลางสาด -ลางาด -ล้างาด -ลาเง็ด -ลาช -ลาชา -ลาญ -ลาด -ลาดเลา -ล้าต้า -ล่าเตียง -ล้าเตียง -ลาน -ล่าน -ลาบ -ลาป -ลาพอน -ลาพุ -ลาเพ -ลาเพา -ลาภ -ลาม -ล่าม -ลามะ -ลาย -ล้าย -ลาลนะ -ลาลส -ลาลา -ลาว -ลาวก -ลาวัณย์ -ลาวา -ลาสนะ -ลำ -ล่ำ -ล้ำ -ลำเข็ญ -ลำแข -ลำเค็ญ -ลำเคือง -ลำงาด -ลำเจียก -ลำดวน -ลำดับ -ลำนัก -ลำเนา -ลำบอง -ลำบาก -ลำบุ -ลำปำ -ลำพวน -ลำพอง -ลำพัง -ลำพู -ลำเพ็ญ -ลำเพา -ลำแพง -ลำแพน -ลำโพง -ลำไพ่ -ลำภุขัน -ลำมะลอก -ลำมาด -ลำเมาะ -ลำเมียบ -ลำยอง -ลำยา -ลำไย -ลำลอง -ล่ำลา -ลำลาบ -ลำลำ -ลำลึก -ลำเลาะ -ลำเลิก -ลำเลียง -ลำเลียบ -ลำเวียง -ลำเวียน -ลำอุด -ลำเอียก -ลำโอง -ลิ -ลิกขา -ลิกไนต์ -ลิกษา -ลิกุจ -ลิเก -ลิขนะ -ลิขสิทธ์ -ลิขิต -ลิง -ลิงค์ -ลิงโลด -ลิด -ลิต -ลิตมัส -ลิตร -ลิเทียม -ลิ่น -ลิ้น -ลินโกรย -ลินจง -ลิ้นจี่ -ลิ่นต้น -ลิ่นทะเล -ลิ่นฮื้อ -ลินิน -ลิบ -ลิปดา -ลิปต์ -ลิปสติก -ลิปิ -ลิฟต์ -ลิเภา -ลิ่ม -ลิ้ม -ลิมป์ -ลิมปนะ -ลิลิต -ลิว -ลิ่ว -ลิสง -ลี -ลี่ -ลี้ -ลีซอ -ลีบ -ลีลา -ลีลาศ -ลีฬหา -ลึก -ลึงค์ -ลึงค์นายพราน -ลืด -ลื่น -ลื้น -ลืบ -ลืม -ลือ -ลื่อ -ลื้อ -ลุ -ลุก -ลุกลน -ลุกลี้ลุกลน -ลุง -ลุ้ง -ลุต -ลุท -ลุทกะ -ลุทธ์ -ลุ่น -ลุปต์ -ลุพธ์ -ลุพธกะ -ลุ่ม -ลุ่มเนื้อ -ลุมป์ -ลุมพี -ลุมพู -ลุมหมา -ลุย -ลุ่ย -ลุ้ย -ลุลาย -ลุสา -ลู่ -ลูก -ลูกเขยตายแม่ยายชักปรก -ลูกเคล้า -ลูกประคำผี -ลูกปืนใหญ่ -ลูกเอ็น -ลูกเอ็ล -ลูขะ -ลูตา -ลูติกา -ลูทีเชียม -ลูนะ -ลูบ -ลู่หลี่ -เลก -เล็ก -เล็กดา -เล็กฮอร์น -เลข -เลขกะ -เลขนะ -เลขยะ -เลขา -เล็ง -เล้ง -เล่งฮื้อ -เลเซอร์ -เลฑฑุ -เลณ -เลณฑุ -เล็ด -เลต -เลน -เล็น -เล่น -เลนจง -เลนส์ -เลนหะรี -เล็บ -เลบง -เลปกร -เลปน์ -เลเป -เลเพ -เล็ม -เล่ม -เลย -เลว -เลวง -เลวูโลส -เลศ -เลษฏุ -เลสเบียน -เลห -เล่ห์ -เลหยะ -เลหลัง -เลหลา -เลหะ -เลอ -เละ -เลา -เล่า -เล้า -เลากัย -เล่าเต๊ง -เล้าโลม -เลาะ -เลิก -เลิ้ง -เลินเล่อ -เลิศ -เลีย -เลียง -เลี่ยง -เลี้ยง -เลียงขาว -เลียงผา -เลียงฝ้าย -เลียงมัน -เลียน -เลี่ยน -เลียนไฟ -เลียบ -เลียม -เลี่ยม -เลียว -เลี้ยว -เลือก -เลือง -เลื่อง -เลือด -เลือน -เลื่อน -เลื่อม -เลื่อมใส -เลื่อย -เลื้อย -เลื่อยล้า -แล -แล่ -แล้ -แลก -แล็กโทส -แลง -แล่ง -แล้ง -แลน -แล่น -แลนทานัม -แลบ -แล้ว -และ -โล่ -โล้ -โลก -โลกคติ -โลกจักษุ -โลกชนนี -โลกเชษฐ์ -โลกธรรม -โลกธาดา -โลกธาตุ -โลกนาถ -โลกบถ -โลกบาล -โลกบิดร -โลกประทีป -โลกมารดา -โลกย์ -โลกยาตรา -โลกวัชชะ -โลกวิทู -โลกศัพท์ -โลกสถิติ -โลกอุดร -โลกัตถจริยา -โลกันตร์ -โลกา -โลกิยะ -โลกีย์ -โลกียชน -โลกียวัตร -โลกุตร -โลกุตรธรรม -โลกุตรภูมิ -โลเกศ -โลง -โล่ง -โล้ง -โล้งโต้ง -โลจนะ -โลณะ -โลด -โลดทะนง -โล่ติ๊น -โลโต -โลท -โลน -โล้น -โลปะ -โลภ -โลม -โลมะ -โลมา -โลล -โลลุป -โลเล -โล้เล้ -โลโล -โลโล้ -โลหะ -โลหัช -โลหิต -โละ -ไล่ -ไล้ -ไลย -ไลลา -ไลเลย -ไลไล้ -ว -วก -วกะ -วกุล -วง -วงก์ -วงกต -วงศ์ -วงศา -วงษ์ -วจนะ -วจะ -วจา -วจี -วชะ -วชิระ -วฏะ -วฏาการ -วฏุมะ -วณะ -วณิช -วณิชชา -วณิชย์ -วณิชยา -วณิพก -วดรนู -วดี -วตะ -วทนะ -วทะ -วทัญญุตา -วทัญญู -วธุกา -วธู -วน -วนจร -วนัปติ -วนัส -วนา -วนานต์ -วนิดา -วนิพก -วเนจร -วโนทยาน -วปนะ -วปุ -วยัคฆ์ -วยัญชนะ -วยัมหะ -วยัสย์ -วยากรณ์ -วยาฆร์ -วยาธิ -วยาม -วยายาม -วรกัญญา -วรกาย -วรงค์ -วรณะ -วรท -วรทาน -วรนารี -วรปักษ์ -วรพนิต -วรมหาวิหาร -วรยิตา -วรรค -วรรคย์ -วรรช -วรรชย์ -วรรณนา -วรรณพฤติ -วรรณะ -วรรณึก -วรรธก -วรรธนะ -วรรษ -วรรษา -วรรูป -วรวรรณินี -วรวิหาร -วรัญญู -วรากะ -วรางคณา -วราภรณ์ -วรายุทธ -วราโรหาร -วราห์ -วราหร -วราหะ -วรุณ -วรุตดม -วรุตมะ -วรูถ -วโรดม -วโรตมะ -วฤก -วฤษภ -วฤษล -วลัช -วลัญช์ -วลัณชน์ -วลัย -วลาหก -วลี -วศค -วศะ -วศิน -วสนะ -วสภะ -วสละ -วสลี -วสวัดดี -วสวัตตี -วสะ -วสันต์ -วสันตดิลก -วสา -วสี -วสุ -วสุธา -วสุนธรา -วสุมดี -วหะ -วหา -วอ -วอก -วอกแวก -ว่อง -ว่องไว -วอด -วอน -ว่อน -วอลเลย์บอล -วอแว -วะ -วัก -วักกะ -วัค -วัคคิย -วัคคีย์ -วัคคุ -วัคซีน -วัง -วังก์ -วังชา -วังเวง -วังศะ -วังสะ -วัจจะ -วัจฉ์ -วัจฉก -วัจฉละ -วัจน์ -วัช -วัชชะ -วัชฌ์ -วัชพืช -วัชระ -วัญจก -วัญจนะ -วัญฌ์ -วัฏกะ -วัฏฏะ -วัฏฏิ -วัฒกะ -วัฒกี -วัฒนะ -วัฒนา -วัณ -วัณฏ์ -วัณณะ -วัณนา -วัด -วัต -วัตต์ -วัตตา -วัตถ์ -วัตถุ -วัตนะ -วัตร -วัตรปฏิบัติ -วัตสดร -วัตสะ -วัติ -วัทน์ -วัน -วันต์ -วันทนา -วันทนีย์ -วันทา -วันทิ -วันนิพก -วันเวย์ -วับ -วับๆหวำๆ -วัปปะ -วัมมิก -วัย -วัลก์ -วัลคุ -วัลย์ -วัลลภ -วัลลี -วัว -วัสดุ -วัสตร์ -วัสน์ -วัสนะ -วัสสะ -วา -ว่า -ว้า -วาก -ว้ากเพ้ย -วากยะ -วากรา -วากะ -วาง -ว่าง -ว้าง -วาจก -วาจา -วาจาไปยะ -วาจาล -วาชเปยะ -วาฏกะ -วาณิช -วาณิชกะ -วาณิชย์ -วาณี -วาด -วาตะ -วาท -วาทก -วาทน -วาทย์ -วาทิต -วาทิน -วาที -วาน -ว่าน -ว่านเครือ -วานร -วาเนเดียม -วาบ -วาปะ -วาปิตะ -วาปี -วาม -วามะ -วาโมร -วาย -ว่าย -ว้าย -วายสะ -วายะ -วายัง -วายามะ -วายุ -วายุกูล -วายุบุตรยาตรา -วาโย -วาร -วารวาริ -วาระ -วาริ -วารี -วารุณ -วารุณี -วาล -วาล์ว -วาลิกา -วาลุกา -วาว -ว่าว -ว้าว่อน -ว้าวุ่น -วาสนะ -วาสนา -วาสพ -วาสะ -วาสิน -วาสี -วาสุกรี -วาสุกี -วาสุเทพ -วาหนะ -วาหะ -วาหินี -วาฬ -วิ -วิก -วิกขัมภ์ -วิกขัมภนะ -วิกเขป -วิกจะ -วิกรม -วิกรัย -วิกรานต์ -วิกฤต -วิกฤติ -วิกล -วิกลจริต -วิกสิต -วิกัต -วิกัติ -วิกัป -วิกัย -วิการ -วิกาล -วิคตปัจจัย -วิคหะ -วิเคราะห์ -วิฆนะ -วิฆเนศ -วิฆเนศวร -วิฆาต -วิฆาส -วิง -วิ่ง -วิงวอน -วิจฉิกะ -วิจยุต -วิจรณะ -วิจล -วิจักขณ์ -วิจักษณ์ -วิจัย -วิจาร -วิจารณ์ -วิจิ -วิจิกิจฉา -วิจิต -วิจิตร -วิจิน -วิจุณ -วิจุรณ -วิชชา -วิชชุ -วิชชุดา -วิชชุตา -วิชชุลดา -วิชญะ -วิชน -วิชนี -วิชัย -วิชา -วิชานนะ -วิชิต -วิเชียร -วิญญัตติ -วิญญาณ -วิญญาณกทรัพย์ -วิญญู -วิฑูรย์ -วิณหุ -วิด -วิดีสดี -วิตก -วิตถาร -วิตามิน -วิถี -วิทธะ -วิทธังสะ -วิทยา -วิทยุ -วิทยุต -วิทรุมะ -วิทวัส -วิทัตถิ -วิทารณ์ -วิทาลน์ -วิทิต -วิทู -วิทูร -วิเทวษ -วิเทศ -วิธ -วิธวา -วิธา -วิธาน -วิธี -วิธุระ -วิธู -วิธูปนะ -วิน -วิ่น -วินท์ -วินันตู -วินัย -วินาที -วินายก -วินาศ -วินิจ -วินิจฉัย -วินิต -วินิบาต -วินิปาติก -วินีต -วิเนต -วิโนทก -วิบัติ -วิบาก -วิบุล -วิบูล -วิปการ -วิปฏิสาร -วิปโยค -วิประการ -วิประติสาร -วิประโยค -วิประลาป -วิประวาส -วิปริณามทุกข์ -วิปริต -วิปลาป -วิปลาส -วิปวาส -วิปักษ์ -วิปัสสก -วิปัสสนา -วิปากขันธ์ -วิพากษ์ -วิพากษ์วิจารณ์ -วิพิธทัศนา -วิพุธ -วิภังค์ -วิภัช -วิภัตติ -วิภา -วิภาค -วิภาช -วิภาดา -วิภาวี -วิภาษ -วิภาส -วิภู -วิภูษณะ -วิภูษา -วิภูษิต -วิเภตก์ -วิเภทก์ -วิมน -วิมล -วิมลัก -วิมลาก -วิมังสา -วิมัติ -วิมาน -วิมานิกเปรต -วิมุข -วิมุต -วิมุตติ -วิเมลือง -วิโมกข์ -วิโมกษวิถี -วิเยน -วิโยค -วิรงรอง -วิรตะ -วิรมณะ -วิรวะ -วิระ -วิรังรอง -วิรัช -วิรัต -วิรัติ -วิราคะ -วิราม -วิราวะ -วิรุธ -วิรุฬห์ -วิรุฬหก -วิรูป -วิรูปักษ์ -วิเรก -วิเรนทร์ -วิโรค -วิโรจ -วิโรจน์ -วิโรฒ -วิโรธ -วิโรธน์ -วิลันดา -วิลัย -วิลาด -วิลาป -วิลาวัณย์ -วิลาศ -วิลาส -วิลาสินี -วิลิปดา -วิลิศมาหรา -วิเลป -วิเลปนะ -วิโลก -วิโลกนะ -วิโลจนะ -วิโลม -วิไล -วิว -วิวรณ์ -วิวรรธน์ -วิวระ -วิวัฏ -วิวัฒน์ -วิวัน -วิวาท -วิวาห์ -วิวาหะ -วิวิจ -วิวิต -วิวิธ -วิเวก -วิศรุต -วิศัท -วิศัลย์ -วิศาขะ -วิศาขา -วิศางค์ -วิศาล -วิศิษฏ์ -วิศุทธ์ -วิศุทธิ์ -วิเศษ -วิเศษณ์ -วิษณุ -วิษณุกรรม -วิษธร -วิษักต์ -วิษัย -วิษาณ -วิษุวัต -วิสกี้ -วิสรรชนีย์ -วิสฤต -วิสสุกรรม -วิสังโยค -วิสัชนา -วิสัญญี -วิสัย -วิสาขะ -วิสาขา -วิสามัญ -วิสาร -วิสารท -วิสาล -วิสาสะ -วิสาหกิจ -วิสิฐ -วิสุงคามสีมา -วิสุทธ์ -วิสุทธิ์ -วิสูตร -วิเสท -วิเสสนะ -วิหค -วิหงค์ -วิหลั่น -วิหัปปติ -วิหายสะ -วิหาร -วิหิ -วิหิงสะ -วิหิงสา -วิเหสภาคี -วิเหสา -วิฬังค์ -วิฬาร -วี -วีจิ -วีชนี -วีซ่า -วีณา -วี้ด -วี่วัน -วี่แวว -วีสะ -วุ้ง -วุฐิ -วุฒ -วุฒิ -วุด -วุ่น -วุ้น -วุบ -วุ้ย -วุลแฟรม -วู้ -วูดวาด -วูบ -วู่วาม -เว้ -เวค -เวคิน -เวคี -เวจ -เวช -เวชยันต์ -เวไชยยันต์ราชรถ -เวฐน์ -เวณะ -เวณิ -เวณิก -เวณุ -เวตน์ -เวตร -เวตาล -เวท -เวทนา -เวทย์ -เวทางค์ -เวทางคศาสตร์ -เวทานต์ -เวทานตะ -เวทิ -เวที -เวธะ -เวธี -เวน -เว้น -เวนไตย -เวไนย -เวมะ -เวมัต -เวมาติก -เว้ย -เวร -เวรมณี -เวรี -เวโรจน์ -เวลา -เวเลนซี -เววัณ -เววัณณิยะ -เวศม์ -เวศย์ -เวศยา -เวสน์ -เวสภู -เวสม์ -เวสมะ -เวสวัณ -เวสสะ -เวสสันดร -เวสสุกรรม -เวสสุวัณ -เวสารัช -เวสิ -เวสิยา -เวหน -เวหะ -เวหังค์ -เวหัปติ -เวหา -เวหายส -เวฬุ -เวฬุริย -เว่อ -เว้า -เวิก -เวิ้ง -เวี่ย -เวียง -เวียน -เวียร -เวี่ยว -แว้ -แวง -แว้ง -แวด -แวตร -แวน -แว่น -แวนดา -แวบ -แวม -แวว -แว่ว -แวววิเชียร -แวะ -โว -โว่ -โวการ -โว่ง -โวต -โวทาน -โวย -โว้ย -โวยวาย -โว้เว้ -โวสาน -โวหาร -ไว -ไว้ -ไวกูณฐ์ -ไวฑูรย์ -ไวทย์ -ไวพจน์ -ไวยากรณ์ -ไวยาวัจกร -ไวยาวัจมัย -ไวรัส -ไววรรณ -ไวษณพ -ไวโอลิน -ศ -ศก -ศกฏ -ศกล -ศกุน -ศกุนิ -ศกุนี -ศงกา -ศจิบดี -ศจี -ศฐ -ศดก -ศต -ศตก -ศนิ -ศไนส์ -ศพ -ศพล -ศม -ศมน -ศมนี -ศมนีย์ -ศมศาน -ศย -ศยนะ -ศยนีย์ -ศยาม -ศยามกัณฐ์ -ศยามล -ศร -ศรณิ -ศรนารายณ์ -ศรภ -ศรมณะ -ศรรกร -ศรรกรา -ศรรพรี -ศรวณะ -ศรวณีย์ -ศรวิษฐา -ศรัถ -ศรัถนะ -ศรัท -ศรัทธา -ศรันถ์ -ศรันย์ -ศรันยู -ศรัย -ศราทธ์ -ศรานต์ -ศราพ -ศราพก -ศรายะ -ศราวก -ศราวณะ -ศราวรณ์ -ศราวุธ -ศราสน์ -ศรี -ศรีตรัง -ศรีษะ -ศรีสังคีต -ศรุต -ศรุติ -ศฤกาล -ศฤคาล -ศฤงค์ -ศฤงคาร -ศฤงคาริน -ศฤงคารี -ศลภ -ศลัถ -ศลิษฏ์ -ศลิษา -ศว -ศวศุร -ศวัศน -ศวัส -ศวา -ศวาน -ศวาส -ศวิต -ศวิตร -ศศะ -ศศิ -ศศิน -ศศี -ศสา -ศอ -ศอก -ศักดา -ศักดิ -ศักดิ์ -ศักติ -ศักย์ -ศักยะ -ศักราช -ศังกร -ศังกา -ศังกุ -ศัตรุ -ศัตรู -ศัทธนะ -ศันสนะ -ศันสนีย์ -ศัพท์ -ศัมยุ -ศัยยา -ศัล -ศัลก -ศัลกี -ศัสดร -ศัสตรา -ศัสตรี -ศัสย -ศาก -ศากตะ -ศากยะ -ศากวร -ศากางค์ -ศากินี -ศาฎก -ศาฐยะ -ศาณ -ศาต -ศาน -ศานต์ -ศานติ -ศานิต -ศาป -ศาพท์ -ศาพร -ศามะ -ศามา -ศามีล -ศารท -ศารทูล -ศาริกา -ศาล -ศาลา -ศาลิ -ศาศวัต -ศาสก -ศาสดา -ศาสตร์ -ศาสตรา -ศาสน์ -ศาสนา -ศาสนีย์ -ศาสโนวาท -ศิกษก -ศิการ -ศิขร -ศิขริน -ศิขรี -ศิขัณฑ์ -ศิขา -ศิคาล -ศิงขร -ศิงขริน -ศิต -ศิถี -ศิพิระ -ศิระ -ศิรา -ศิรามพุช -ศิโรราบ -ศิลป์ -ศิลปะ -ศิลา -ศิวะ -ศิวิกา -ศิศีระ -ศิศุ -ศิษฎิ -ศิษฏ์ -ศิษย์ -ศีกร -ศีขร -ศีตล -ศีล -ศึก -ศึกษา -ศุกร์ -ศุกลัม -ศุกะ -ศุจิ -ศุณฑา -ศุณฑี -ศุทธ -ศุทธิ -ศุน -ศุนัก -ศุนิ -ศุลี -ศุษิร -ศุษิล -ศูกร -ศูทร -ศูนย์ -ศูล -ศูลิน -เศรณี -เศรษฐ์ -เศรษฐี -เศร้า -เศลษ -เศวดงค์ -เศวดีภ -เศวต -เศวตร -เศวาล -เศษ -เศาไจย -เศาร์ -เศารยะ -เศิก -เศียร -โศก -โศกา -โศกี -โศจนะ -โศจนียะ -โศจิ -โศถะ -โศธนะ -โศผะ -โศภ -โศภน -โศภา -โศภิต -โศภิน -โศภิษฐ์ -โศภี -โศรณิ -โศรณี -โศรดา -โศรตร -โศลก -โศวภาพ -ไศล -ไศวะ -ษ -ษมา -ษัฏ -ษัฏกะ -ษัฑ -ษัณ -ษัษ -ษัษฏี -ษัษฐ -ษัษฐี -ษารภาคอร -โษฑศ -โษฑศัน -ส -สก -สกฏะ -สกฐาน -สกทาคามี -สกนธ์ -สกปรก -สกรณีย์ -สกรรจ์ -สกรรถ -สกรรมกริยา -สกรัม -สกรู -สกล -สกัด -สกัดแคร่ -สกา -สกายแลบ -สกาว -สกิทาคามี -สกี -สกุณ -สกุณา -สกุณี -สกุน -สกุนต์ -สกุล -สเกต -สแกนเดียม -สขะ -สขา -สขิ -สง -ส่ง -สงกร -สงกรานต์ -สงกา -สงโกจ -สงค์ -สงคร -สงคราม -สงเคราะห์ -สงฆ์ -สงบ -สงวน -สงเษป -ส่งสการ -สงสัย -สงสาร -สงัด -สง่า -สจ๊วด -สฐ -สณฑ์ -สด -สดก -สดน -สดมภ์ -สดัน -สดับ -สดับปกรณ์ -สดำ -สดี -สดุดี -สดูป -สต -สตก -สตน -สตรอนเชียม -สตริกนิน -สตรี -สตัน -สตันย์ -สตัพธ์ -สตัฟฟ์ -สตัมภ์ -สตางค์ -สตาฟฟ์ -สติ -สติ๊ก -สตี -สตีม -สตู -สตูป -สเต็ก -สเตนเลส -สเตย์ -สไตร๊ค์ -สถน -สถบดี -สถล -สถวีระ -สถาน -สถานะ -สถานี -สถาบก -สถาบัน -สถาปนา -สถาปนิก -สถาปนียพยากรณ์ -สถาปนียวาที -สถาปัตยกรรม -สถาพร -สถาล -สถาวร -สถิต -สถิตนศาสตร์ -สถิติ -สถุล -สถูป -สทาร -สทึง -สทุม -สธน -สธุสะ -สน -ส้น -สนเดก -สนทนา -สนทรรศ -สนทรรศน์ -สนทิศ -สนเทศ -สนเท่ห์ -สนธยา -สนธิ -สนธิอลงกต -สนนราคา -สนม -สนวน -สนสร้อย -สนอง -สนอบ -สนอม -สนะ -สนัด -สนั่น -สนับ -สนับสนุน -สนาดก -สนาน -สนาบก -สนาบัน -สนาม -สนายุ -สนิก -สนิท -สนิธ -สนิม -สนิมสร้อย -สนุก -สนุกเกอร์ -สนุข -สนุต -สนุ่น -สบ -สบง -สบจ -สบถ -สบเสีย -สบัน -สบาย -สบู่ -สไบ -สปริง -สปาเกตตี -สปาย -สปิริต -สเปกตรัม -สเปกโทรสโคป -สไปริลลัม -สพั้น -สพาบ -สภังคมณฑล -สภา -สภาค -สภาพ -สภาวะ -สม -ส้ม -สมการ -สมจารี -สมชีวิตา -สมชีวิธรรม -สมญา -สมเญศ -สมณะ -สมดึงส์ -สมดุล -สมเด็จ -สมถะ -สมนาคุณ -สมบัติ -สมบุกสมบัน -สมบูรณ์ -สมบูรณาญาสิทธิราชย์ -สมประดี -สมปฤดี -สมปฤๅดี -สมผุส -สมพงศ์ -สมพล -สมพักนักการ -สมพัตสร -สมพาส -สมเพช -สมโพธน์ -สมโพธิ -สมภพ -สมภาร -สมโภค -สมโภช -สมมต -สมมติ -สมมาตร -สมมุติ -สมมูล -สมโมท -สมโยค -สมร -สมรด -สมรรถ -สมรส -สมฤดี -สมฤติ -สมฤๅดี -สมวัย -สมวายะ -สมเสร็จ -สมอ -สมอง -สมอสำเภา -สมัค -สมัคร -สมังคี -สมัช -สมัชชา -สมัต -สมัน -สมันต์ -สมัย -สมา -สมาคม -สมาจาร -สมาชิก -สมาทาน -สมาธิ -สมาน -สมานัตตา -สมาโนตม์ -สมาบัติ -สมาพันธรัฐ -สมาส -สม่ำเสมอ -สมิง -สมิงทอง -สมิต -สมิติ -สมิทธ์ -สมิทธิ -สมี -สมีป -สมีร -สมุก -สมุจจัย -สมุจเฉท -สมุฏฐาน -สมุด -สมุตถาน -สมุทร -สมุทรก -สมุทัย -สมุทิต -สมุน -สมุนไพร -สมุลแว้ง -สมุห์ -สโมธาน -สโมสร -สยด -สยนะ -สยบ -สยมพร -สยมภู -สยอง -สยอน -สยัมพร -สยัมวรา -สยาม -สยาย -สยิว -สยิ้ว -สยุ่น -สยุมพร -สยุมภู -สร -สรก -สรง -สร่ง -สรฏะ -สรณะ -สรดัก -สรดึ่น -สรดื่น -สรตะ -สรตัก -สรทะ -สรทึง -สรแทบ -สรนุก -สรเนาะ -สรไน -สรบ -สรบบ -สรบับ -สรพ -สรเพชญ -สรภะ -สรภัญญะ -สรภู -สรม -สรร -สรรค์ -สรรพ -สรรพัชญ -สรรเพชญ -สรรเพชุดา -สรรวง -สรรเสริญ -สรลน -สรลม -สรลมสลวน -สรลอด -สรลอน -สรละ -สรล้าย -สรลิด -สรเลข -สรวง -สรวป -สรวม -สรวล -สรวลเส -สรวลเสเฮฮา -สรเสริญ -สร้อย -สร้อยทะแย -สระ -สระกอ -สระคราญ -สระดะ -สระท้อน -สระพรั่ง -สระอาด -สระอื้น -สรั่ง -สรัสวดี -สร่าง -สร้าง -สราญ -สร้าวเสียว -สริต -สรี้ -สรีระ -สรีสฤบ -สรุก -สรุง -สรุโนก -สรุป -สรุสระ -สรูป -สโรช -สฤก -สฤคาล -สฤต -สฤษฎ์ -สฤษฎี -สล -สลด -สลบ -สลวน -สลวย -สลอด -สลอน -สลอย -สละ -สละสลวย -สลัก -สลักเต้ -สลักสำคัญ -สลัด -สลัดได -สลับ -สลัม -สลัว -สลา -สลาก -สลากา -สลาง -สล้าง -สลาด -สลาตัน -สลาบ -สลาม -สลาย -สลิด -สลิล -สลึก -สลึง -สลุต -สลุบ -สลุมพร -สแลง -สโลด -สไลด์ -สวก -ส้วง -สวด -สวน -ส่วน -สวนะ -สวนิต -สวบ -สวม -ส้วม -สวย -ส่วย -ส้วย -สวยม -สวร -สวรรค์ -สวรรยา -สวะ -สวัสดิ์ -สวัสดี -สวัสติกะ -สวา -สวาคต -สวาง -สว่าง -สวาด -สวาดิ -สวาท -สวาน -สว่าน -สว้าน -สวาบ -สวามิ -สวามี -สวาย -สวาสดิ์ -สวาหะ -สวิง -สวิงสวาย -สวิญญาณกทรัพย์ -สวิตซ์ -สสาร -สสุระ -สสุรี -สหัมบดี -สหัสรังสี -สหัสสะ -สหัสา -สอ -ส่อ -สอง -ส่อง -ส้อง -สอด -สอน -ส่อน -สอบ -สอพลอ -ส้อม -สอย -ส่อเสียด -สะ -สะกด -สะกอ -สะกาง -สะการะ -สะการะตาหรา -สะกิด -สะเก็ด -สะแก -สะคร้อ -สะคราญ -สะค้าน -สะเงาะสะแงะ -สะใจ -สะดม -สะดวก -สะดัก -สะดิ้ง -สะดึง -สะดือ -สะดุ้ง -สะดุด -สะเด็ด -สะเดา -สะเดาะ -สะตอ -สะตาหมัน -สะตึ -สะตือ -สะตุ -สะเต๊ะ -สะโตก -สะทก -สะทน -สะท้อน -สะท้าน -สะทึก -สะทึน -สะทึ่น -สะเทิน -สะเทิ้น -สะเทือน -สะเทื้อน -สะบะ -สะบัก -สะบัด -สะบั้น -สะบันงา -สะบันงาต้น -สะบ้า -สะบู -สะแบง -สะเปะสะปะ -สะพรัก -สะพรั่ง -สะพรึงกลัว -สะพรึบ -สะพัก -สะพัง -สะพัด -สะพั้น -สะพาน -สะพาย -สะเพร่า -สะโพก -สะเภา -สะใภ้ -สะโมง -สะระตะ -สะระแหน่ -สะรีตพงศ์ -สะละปะตุ่น -สะลาง -สะลึมสะลือ -สะวี้ดสะว้าด -สะสม -สะสาง -สะอาง -สะอาด -สะอ้าน -สะอิ้ง -สะอิดสะเอียน -สะอึก -สะอื้น -สะเอว -สะเออะ -สะโอดสะอง -สะไอ -สัก -สักกะ -สักกัจจะ -สักการะ -สักขรา -สักขี -สักฏะ -สักตะ -สักยะ -สักวา -สักหลาด -สัขยะ -สัค -สัคคะ -สั่ง -สังกมทรัพย์ -สังกร -สังกะตัง -สังกะวัง -สังกะวาด -สังกะสี -สังกัด -สังกัปปะ -สังกา -สังการ -สังกาศ -สังกิเลส -สังเกต -สังข์ -สังขตะ -สังขยา -สังขลิก -สังขลิกา -สังขวานร -สังขาร -สังขารทุกข์ -สังขารธรรม -สังขารโลก -สังขารอุเบกขา -สังเขป -สังโขภ -สังค์ -สังคม -สังคมนิยม -สังคมวิทยา -สังคมศาสตร์ -สังคมศึกษา -สังคมสงเคราะห์ -สังคหะ -สังคัง -สังคาตา -สังคายนา -สังคายนาย -สังคีต -สังคีติ -สังเค็ด -สังเคราะห์ -สังฆาฏิ -สังดัก -สังปะติเหงะ -สังปะลิเหงะ -สังโยค -สังโยชน์ -สังวร -สังวัจฉระ -สังวัธยาย -สังวาล -สังวาส -สังเวช -สังเวย -สังเวียน -สังสกฤต -สังสการ -สังสดมภ์ -สังสนทนา -สั่งสนทนา -สังสรรค์ -สังสารวัฏ -สังสิทธิ -สังสุทธ์ -สังสุทธิ -สังหร -สังหรณ์ -สังหรรษ -สังหาร -สังหาริมทรัพย์ -สังหาริมะ -สังหิต -สัจ -สัจจะ -สัจจา -สัชฌะ -สัชฌายะ -สัชฌุ -สัญจร -สัญจาร -สัญเจตนา -สัญชาตญาณ -สัญชาตสระ -สัญชาติ -สัญชีพนรก -สัญฌา -สัญญา -สัญญาณ -สัญญี -สัญโญชน์ -สัญโยค -สัญลักษณ์ -สัฐิ -สัณฐาน -สัณฐิติ -สัณฑ์ -สัณห์ -สัด -สัดจอง -สัต -สัตตบงกช -สัตตบรรณ -สัตตบุษย์ -สัตตวณิชชา -สัตตะ -สัตตู -สัตถ -สัตถันดร -สัตถา -สัตถิ -สัตถุ -สัตบรรณ -สัตบริภัณฑ์ -สัตย์ -สัตว์ -สัตวา -สัทธรรม -สัทธา -สัทธิงวิหาริก -สัทธิวิหาริก -สัทศาสตร์ -สัน -สั่น -สั้น -สันดาน -สันดาป -สันดุษฎี -สันเดก -สันโดษ -สันต์ -สันตติ -สันตะปาปา -สันตะโร -สันตะวา -สันติ -สันติกะ -สันติเกนิทาน -สันตุฏฐี -สันถระ -สันถวะ -สันถัต -สันถาร -สันทนะ -สันทนาการ -สันทะ -สันทัด -สันทัสนะ -สันทาน -สันทิฐิ -สันทิส -สันเทส -สันเทห -สันเท่ห์ -สันธาน -สันนิธิ -สันนิบาต -สันนิวาส -สันนิเวส -สันนิษฐาน -สันพร้านางแอ -สันพร้ามอญ -สันพร้าหอม -สันรวง -สันลึก -สันสกฤต -สับ -สับปลับ -สับปลี้ -สับปะรังเค -สับปาก -สัปคับ -สัปดน -สัปโดก -สัปโดกสัปดน -สัปทน -สัปปะ -สัปปายการี -สัปปิ -สัปปุรุษ -สัประยุทธ์ -สัปหงก -สัปเหร่อ -สัพ -สัพพะ -สัพพัญญู -สัพเพสัตตา -สัพเพเหระ -สัพยอก -สัฟันคนทา -สัมญญา -สัมบูรณ์ -สัมปชัญญะ -สัมปทา -สัมปทาน -สัมปยุต -สัมปโยค -สัมประสิทธิ์ -สัมประหาร -สัมปรายภพ -สัมปรายิกภพ -สัมปัตติ -สัมผัปลาป -สัมผัส -สัมพล -สัมพหุลา -สัมพัตสร -สัมพัทธ์ -สัมพันธ์ -สัมพันธน์ -สัมพาธะ -สัมพาระ -สัมพาหน์ -สัมพาหะ -สัมพุทธะ -สัมโพธิ -สัมภวะ -สัมภเวสี -สัมภัต -สัมภัตตะ -สัมภาษณ์ -สัมเภทะ -สัมโภคกาย -สัมมนา -สัมมัปธาน -สัมมา -สัมโมทนียกถา -สัมฤทธิ -สัมฤทธิ์ -สัยน์ -สัลละ -สัลลาป -สัสดี -สัสสะ -สัสสุ -สัสสู -สัสุรี -สา -ส่า -สาก -สากรรจ์ -สากล -สากษิน -สากษี -สากัจฉา -สากัลย์ -สากิยะ -สาเก -สาขา -สาคร -สาคเรศ -สาคู -สาง -สางห่า -สาฎก -สาณี -สาด -สาต -สาตรา -สาไถย -สาทร -สาทิส -สาทุ -สาโท -สาธก -สาธน -สาธยะ -สาธยาย -สาธารณ์ -สาธารณะ -สาธิต -สาธุ -สาธุสะ -สาน -สานตวะ -สานุ -สานุศิษย์ -สานู -สาบ -สาบสูญ -สาบาน -สาป -สาปไตย -สาปสรร -สาม -สามชุก -สามเณร -สามเณรี -สามนต์ -สามยทรัพย์ -สามรส -สามล -สามสิบ -สามัคคี -สามัญ -สามัตถิยะ -สามานย์ -สามารถ -สามิก -สามิต -สามินี -สามิภักดิ์ -สามิส -สามี -สามีจิกรรม -สาย -ส่าย -ส้าย -สายชู -สายตา -สายเวทย์ -สายัณห์ -สายาห์ -สาร -สารกรมธรรม์ -สารคดี -สารเคมี -สารณียธรรม -สารตรา -สารถี -สารท -สารทา -สารทิศ -สารทุกข์ -สารธรรม -สารนิเทศ -สารบบ -สารบรรณ -สารบริสุทธิ์ -สารบัญ -สารบับ -ส้ารบับ -สารบาญ -สารประกอบ -สารประโยชน์ -สารพัด -สารพัน -สารพางค์ -สารภาพ -สารภี -สารไมย -สารรัก -สารละลาย -สารเลว -สารวัด -สารวัตร -สารส้ม -สารหนู -สาระ -สาระโกก -สาระเน -สาระพา -สาระพาเฮโล -สาระวอน -สาระวารี -สาระสะมา -สาระสำคัญ -สารัตถะ -สารัทธ์ -สารัมภ์ -สาราณียกร -สาราณียะ -สารานุกรม -สารีริกธาตุ -สารูป -สาโรช -สาละ -สาละวน -สาลิ -สาลิกา -สาลินี -สาลี -สาลี่ -สาลู -สาโลหิต -สาว -สาวก -สาวกระทืบหอ -สาวน้อยเล่นน้ำ -สาวนะ -สาวิกา -สาวิตร -สาวิตรี -สาสน์ -สาสนา -สาหร่าย -สาหรี -ส่าหรี -สาหัส -สาเหตุ -สาแหรก -สาฬุระ -สำ -ส่ำ -สำคัญ -สำซ่าง -สำแดง -สำทับ -สำนวด -สำนวน -สำนอง -สำนัก -สำนาน -สำนึง -สำเนา -สำเนียง -สำเนียน -สำบอก -สำบัดสำนวน -สำปะลอ -สำปะหลัง -สำปั้น -สำปันนี -สำเภา -สำเภาทอง -สำมะงา -สำมะโนครัว -สำมะโนปะชากร -สำมะลอ -สำมะเลเทเมา -สำมะหา -สำรด -สำรวจ -สำรวม -สำรวย -สำรวล -สำรอก -สำรอง -สำรับ -สำราก -สำราญ -สำริด -สำเร็จ -สำเรา -สำเริง -สำโรง -สำลัก -สำลาน -สำลี -สำแลง -สำสร้าง -สำสา -สำเส็ด -ส่ำเสีย -สำหรวด -สำหรับ -สำหา -สำเหนียก -สำเหร่ -สำออย -สำอาง -สิ -สิกข์ -สิกขมานา -สิกขา -สิขร -สิขรี -สิขเรศ -สิขา -สิขี -สิคาล -สิง -สิ่ง -สิงขร -สิงค์ -สิงคลิ้ง -สิงคลี -สิงคาร -สิงคาล -สิงคี -สิงโต -สิงโตทะเล -สิงสาราสัตว์ -สิงห์ -สิงหล -สิญจน์ -สิต -สิโตทกวารี -สิถิล -สิทธ์ -สิทธิ -สิทธิ์ -สิธยะ -สิน -สิ้น -สินทูระ -สินธพ -สินธุ -สินธุระ -สินเธาว์ -สินะ -สินาด -สินิทธ์ -สินี -สิเนรุ -สิเนหก -สิเนหนียะ -สิเนหะ -สิเนหา -สิเน่หา -สิบ -สิปปะ -สิพนะ -สิมพลี -สิระ -สิริ -สิรี -สิลา -สิโลก -สิว -สิ่ว -สิวะ -สิวิกา -สิหนา -สี -สี่ -สี้ -สีกรุด -สีกา -สีกุน -สีข้าง -สีจัก -สีชมพูดง -สีชมพูสวน -สีด -สีดอ -สีต้น -สีทันดร -สี่บท -สีฟันนางแอ -สีมันต์ -สีมา -สีละมัน -สีลัพพตปรามาส -สีวิกา -สีวิภา -สีสอ -สีสะ -สีสา -สีสุก -สีเสียด -สีเสื้อน้อย -สีห์ -สีหะ -สึก -สึง -สืบ -สื่อ -สุ -สุก -สุกข์ -สุกร -สุกรม -สุกำ -สุกี้ยากี้ -สุข -สุขิน -สุขี -สุขุม -สุขุมาล -สุคต -สุคติ -สุคนธ์ -สุคันธ์ -สุงกะ -สุงสิง -สุงสุมาร -สุงสุมารี -สุจริต -สุจหนี่ -สุจะ -สุจิ -สุจิต -สุจิตร -สุชน -สุชัมบดี -สุชา -สุชาดา -สุญ -สุณ -สุณหา -สุณิสา -สุด -สุดสงวน -สุดา -สุต -สุตตะ -สุตตันตะ -สุตตันตะปิฎก -สุติ -สุทธ์ -สุทธิ -สุทรรศน์ -สุทัศน์ -สุธรรมเทวสภา -สุธา -สุธี -สุนทร -สุนทรี -สุนทรียะ -สุนัข -สุนันท์ -สุโนก -สุบดี -สุบรรณ -สุบิน -สุปรีดิ์ -สุปรีย์ -สุปาณี -สุพพัต -สุพรรณ -สุพรรณถัน -สุพรรณิการ์ -สุภร -สุภัค -สุภา -สุภาพ -สุภาษิต -สุม -สุ่ม -สุมทุม -สุมน -สุมนะ -สุมนัส -สุมนา -สุ้มเสียง -สุมะ -สุมาลี -สุเมธ -สุเมรุ -สุ้ย -สุรงค์ -สุรภี -สุรังค์ -สุรัติ -สุรัสวดี -สุรา -สุรางค์จำเรียง -สุราธิปไตย -สุรินทราหู -สุริยง -สุริยน -สุริยะ -สุริยัน -สุริยา -สุริยุปราคา -สุริเยนทร์ -สุริเยศ -สุริโย -สุรุ่ยสุร่าย -สุลต่าน -สุว -สุวภาพ -สุวรรณ -สุวาน -สุวินัย -สุวิมล -สุษิร -สุสาน -สุหนัต -สุหร่ง -สุหร่าย -สุหฤท -สุหัท -สุเหร่า -สู -สู้ -สูกษม -สูง -สูจกะ -สูจนะ -สูจิ -สูญ -สูด -สูต -สูตร -สูติ -สูท -สูนุ -สูบ -สูปะ -สูร -สูรย์ -สูริ -สูสี -เส -เสก -เสกขะ -เสขะ -เส็ง -เส้ง -เสงี่ยม -เสฉวน -เสฏฐี -เสณี -เสด -เสด็จ -เสตุ -เสถียร -เสโท -เสน -เส้น -เสนง -เสน่ง -เสน่ห์ -เสน่ห์จันทร์ขาว -เสน่ห์จันทร์แดง -เสนหา -เสน่หา -เสนอ -เสนะ -เสนา -เสน่า -เสนากุฎ -เสนางค์ -เสนางคนิกร -เสนานี -เสนาสนะ -เสนาะ -เสนี -เสนีย์ -เสนียด -เสนียะ -เสบย -เสบียง -เสพ -เสพย์ -เสเพล -เสภา -เสม็ด -เสมอ -เสมา -เสมียน -เสมือน -เสย -เสร็จ -เสริด -เสริม -เสรี -เสลด -เสลดพังพอน -เสลา -เสลี่ยง -เสลือกสลน -เสโล -เสวก -เสวกามาตย์ -เสวนะ -เสวนา -เสวย -เสวยพระชาติ -เสวียน -เสสรวง -เสสรวล -เสา -เส้า -เสาร์ -เสารภย์ -เสารี -เสาวณิต -เสาวนะ -เสาวนา -เสาวนาการ -เสาวนีย์ -เสาหฤท -เสาะ -เสาะแสะ -เสิร์จ -เสิร์ฟ -เสีย -เสี่ย -เสียง -เสี่ยง -เสียด -เสี้ยน -เสียบ -เสียม -เสี่ยม -เสี้ยม -เสียว -เสี่ยว -เสี้ยว -เสือ -เสื่อ -เสื้อ -เสือก -เสื่อม -แส -แส่ -แส้ -แสก -แสง -แสด -แสดง -แสตมป์ -แสน -แสนง -แสนย์ -แสนเสนาะ -แสบ -แสบก -แสม -แสยก -แสยง -แสยะ -แสรก -แสร้ง -แสลง -แสลงใจ -แสลงเบื่อ -แสวง -แสอก -แสะ -โสก -โสกโดก -โสกันต์ -โสกาดานา -โสโครก -โสณ -โสณฑ์ -โสณิ -โสณี -โสด -โสดก -โสดม -โสดา -โสต -โสตถิ -โสทก -โสทร -โสธก -โสธนะ -โสน -โสปาน -โสภณ -โสภา -โสภิณี -โสภี -โสเภณี -โสม -โสมนัส -โสมม -โสมย์ -โสมส่องแสง -โสร่ง -โสรจ -โสรัจจะ -โสวรรณ -โสหุ้ย -โสฬส -ใส -ใส่ -ไส -ไส้ -ไสย -ไสยา -ไสร้ -ไสว -ไส้หู้ -ห -หก -หกบท -หกโล่ -หง -หงก -หงส์ -หงส์ทอง -หงส์หยก -หงอ -หงอก -หง่อง -หงองแหงง -หงอด -หงอดๆ -หงอน -หง่อม -หงอย -หง่อย -หงัก -หงับ -หง่าง -หงาย -หง่าว -หงำ -หงิก -หงิง -หงิม -หงึก -หงุงหงิง -หงุดหงิด -หงุบ -หงุบหงับ -หงุ่ย -หญ้า -หญ้าปากคอก -หญ้าฝรั่น -หญ้ายองไฟ -หญ้าหนวดแมว -หญิง -หญิบ -หด -หตะ -หทัย -หน -หนวก -หน่วง -หนวด -หนวดนาคราช -หนวดพราหมณ์ -หนวดแมว -หน่วย -หน่วยกิต -หนอ -หน่อ -หนอก -หนอกช้าง -หนอง -หนองแซง -หนอน -หนอนตานหยาก -หน่อย -หน็อยแน่ -หนะ -หนัก -หนัง -หนังกลางวัน -หนังสือ -หนั่น -หนับ -หนา -หน้า -หนากาสรี -หน่าง -หนาด -หนาน -หนาม -หน่าย -หนาว -หนำ -หนำเลี้ยบ -หนี -หนี้ -หนีบ -หนีเสือ -หนึก -หนึ่ง -หนึบ -หนืด -หนุ -หนุงหนิง -หนุน -หนุบ -หนุ่ม -หนุ่ย -หนู -ห่ม -หมก -หมด -หม่น -หมวก -หมวด -หมอ -หม่อ -หม้อ -หมอก -หมอง -หม่อง -หมอน -หม่อน -หมอบ -หม่อม -หมอย -หมัก -หมัด -หมัน -หมั่น -หมั้น -หมั่นไส้ -หมับ -หมา -หม่า -หม้า -หมาก -หมาง -หมาจ่อ -หมาด -หมาต๋า -หมามุ่ย -หมามุ้ย -หมาไม้ -หมาย -หม้าย -หมาร่า -หม่ำ -หมิ่น -หมี -หมี่ -หมีเหม็น -หมึก -หมืน -หมื่น -หมุด -หมุน -หมุบ -หมุ่ย -หมุยขาว -หมู -หมู่ -หมูสัง -หมูสี -หยก -หย่ง -หยด -หยวก -หยวน -หยวนโล้ -หยวบ -หยอก -หย็อกหย็อย -หยอง -หย่อง -หย็องแหย็ง -หยอด -หยอน -หย่อน -หย่อม -หยอมแหยม -หยอย -หย่อย -หยัก -หยักเหยา -หยัง -หยั่ง -หยังหยัง -หยัด -หยัน -หยับ -หยั่วเมือง -หย่า -หยากเยื่อ -หยากไย่ -หย่างค้ำ -หยาด -หยาบ -หยาม -หยาว -หย้าว -หยำฉ่า -หยำเป -หยำแหยอะ -หยำแหยะ -หยิก -หยิ่ง -หยิบ -หยิม -หยี -หยี่ -หยุ -หยุกหยิก -หยุด -หยุ่น -หยุบๆ -หยุมหยิม -หยูกยา -หร -หรคุณ -หรดาล -หรดี -หรบ -หรรษ -หรรษา -หรอ -หรอก -หร็อมแหร็ม -หรอยๆ -หระ -หรับๆ -หรา -หริ -หริ่ง -หริณะ -หริณังค์ -หริต -หริตกี -หรี่ -หรีด -หรีตกี -หรือ -หรุ่น -หรุบๆ -หรุบรู่ -หรุบหรู่ -หรุ่ม -หรู -หรูหรา -หฤทย -หฤทย์ -หฤทัย -หฤษฎ์ -หฤษฎี -หฤหรรษ์ -หฤโหด -หล -หลง -หลด -หลน -หล่น -หลบ -หล่ม -หลวง -หลวม -หลอ -หล่อ -หลอก -หลอด -หลอน -หล็อน -หล่อน -หล็อนๆ -หลอม -หละ -หละหลวม -หลัก -หลัง -หลั่ง -หลัดๆ -หลั่น -หลับ -หลัว -หลา -หล้า -หลาก -หลาท -หลาทวด -หลาน -หลาบ -หลาม -หลาย -หลาว -หลาหล -หลิก -หลิ่ง -หลิท -หลิน -หลิม -หลิว -หลิ่ว -หลี -หลีก -หลีโก -หลีบ -หลีฮื้อ -หลืบ -หลุกหลิก -หลุด -หลุนๆ -หลุบ -หลุม -หลุมพอ -หลุมพี -หลู่ -หวง -ห่วง -ห้วง -หวด -หวน -ห้วน -หวนคำนึง -หวย -ห่วย -ห้วย -หวอ -หวอด -หว็อยๆ -หวะ -หวัง -หวัด -หวั่น -หวันยิหวา -หวัว -หวัวร่อ -หวัวเราะ -หวา -หว่า -หว้า -หวาก -หว่าง -หวาด -หวาน -หว่าน -หวาม -หวาย -หวำ -หวิด -หวิว -หวี -หวี่ -หวีด -หวือ -หวุดหวิด -หวุม -หวูด -หอ -ห่อ -ห้อ -หอก -หอง -ห้อง -หอน -ห่อน -หอบ -หอม -ห้อม -หอม0� -เหมันต์ -เหมา -เหมายัน -เหมาะ -เหมียว -เหมี่ยว -เหมือง -เหมือด -เหมือดคน -เหมือดโลด -เหมือน -เหมื่อย -เหมื่อยๆ -เหย -เหยง -เหย่อย -เหยา -เหย่า -เหย้า -เหย่าๆ -เหยาะ -เหยาะๆ -เหยาะย่าง -เหยาะแหยะ -เหยิง -เหยิบๆ -เหยียด -เหยียบ -เหยี่ยว -เหยื่อ -เหยือก -เหรัญญิก -เหรา -เหราะๆ -เหรียญ -เหล่ -เหล็ก -เหลน -เหลว -เหลอ -เหลา -เหล่า -เหล้า -เหลาชะโอน -เหลาหลก -เหลาเหย่ -เหลาะแหละ -เหลิง -เหลิงเจิ้ง -เหลียน -เหลี่ยม -เหลียว -เหลือ -เหลือก -เหลือง -เหลือบ -เหลือม -เหลื่อม -เหว -เหว่ -เหวง -เหวย -เหวอะ -เหวอะหวะ -เหวี่ยง -เห่อ -เหอะ -เหะ -เหะหะ -เหา -เห่า -เหาะ -เหิน -เหิม -เหี้ย -เหียง -เหียน -เหี้ยน -เหี้ยม -เหี่ยว -เหื่อ -เหือด -แห -แห่ -แห้ -แหก -แหง -แหง่ -แห่ง -แห้ง -แหง็ก -แหงแก๋ -แหง่ง -แหงน -แหน -แห้น -แหนง -แหนบ -แหนม -แหบ -แหม -แหม่ -แหม่ม -แหมะ -แหย -แหย่ -แหยง -แหย่ง -แหยม -แหยะ -แหยะๆ -แหล -แหล่ -แหลก -แหล่ง -แหลน -แหลม -แหละ -แหว -แห้ว -แหวก -แหว่ง -แหวด -แหวน -แหวะ -แหะ -แหะๆ -โห่ -โหก -โหง -โหด -โหน -โหนก -โหน่ง -โหม -โหม่ -โหมกรรม -โหมกูณฑ์ -โหม่ง -โหมด -โหย -โหยกเหยก -โหยง -โหย่ง -โหร -โหรง -โหรงเหรง -โหรดาจารย์ -โหระพา -โหล -โหล่ -โหลงโจ้ง -โหว -โหว่ -โหว้ -โหวกเหวก -โหวง -โหวด -โหวต -ให้ -ใหญ่ -ใหม่ -ไห -ไห่ -ไห้ -ไหน -ไหม -ไหม้ -ไหรณ -ไหล -ไหล่ -ไหว -ไหว้ -ไหวๆ -ไหหลำ -อ -อก -อกตัญญุตา -อกตัญญู -อกนิษฐ์ -อกรณีย์ -อกรรมกริยา -อกัปปิยะ -อกาลจีวร -อกาลิโก -อกิริยทิฐิ -อกุศล -อคติ -อคเนสัน -อคาธ -อฆ -อง -องก์ -องค์ -องคมนตรี -องคมรรษ -องคุล -องคุลี -องศ์ -องศา -องอาจ -องุ่น -อจร -อจลา -อจิตติ -อจินตา -อจินไตย -อจิระ -อเจลก -อเจละ -อช -อชิน -อชินี -อชิร -อชีววิทย -อฏวี -อณิ -อณุ -อณู -อโณทัย -อด -อดิ -อดิถี -อดิเทพ -อดิเรก -อดิศร -อดิศวร -อดิศัย -อดีต -อดุล -อดุลย์ -อติ -อติชาต -อติตัณหา -อติถิพลี -อติเทพ -อติราช -อติเรก -อติสาร -อติามนะ -อตีตังสญาณ -อถรรพเวท -อทิติ -อทินนาทาน -อทินนาทายี -อธรรม -อธิ -อธิกรณ์ -อธิการ -อธิคม -อธิจิต -อธิฏฐาน -อธิบดี -อธิบาย -อธิป -อธิมาตร -อธิมุตติ -อธิโมกข์ -อธิราช -อธิวาส -อธิวาสนะ -อธิศีล -อธิษฐาน -อธึก -อ้น -อนงค์ -อนงคณะ -อนธิวร -อนนต์ -อนภิรติ -อนยะ -อนรรฆ -อนรรถ -อนริยปริเยสนา -อนล -อนวัช -อ้นอ้อ -อนัญ -อนัตตลักษณะ -อนัตตา -อนันต์ -อนัม -อนาคต -อนาคามี -อนาคาริก -อนาคาริยเพศ -อนาจาร -อนาถ -อนาถา -อนาทร -อนาธิปไตย -อนามัย -อนารยะ -อนาลัย -อนาวรณญาณ -อนำ -อนิจ -อนิจจัง -อนิจจา -อนิฏฐารมณ์ -อนิยต -อนิยม -อนิล -อนิวรรต -อนิวรรตน์ -อนิษฏ์ -อนีกะ -อนีจ -อนึก -อนึ่ง -อนุ -อนุกร -อนุกรม -อนุกรรมการ -อนุกระเบียด -อนุกาชาด -อนุการ -อนุกูล -อนุคามิก -อนุคามี -อนุเคราะห์ -อนุจร -อนุช -อนุชา -อนุชาต -อนุชิต -อนุญาต -อนุญาโตตุลาการ -อนุเถระ -อนุทิน -อนุบท -อนุบาล -อนุบุพ -อนุปริญญา -อนุปสัมบัน -อนุปัสนา -อนุพงศ์ -อนุพนธ์ -อนุพันธ์ -อนุโพธ -อนุภรรยา -อนุภาค -อนุภาษ -อนุมัติ -อนุมาตรา -อนุมาน -อนุมูล -อนุโมทนา -อนุโยค -อนุรักษ์ -อนุราช -อนุราธา -อนุรูป -อนุโลม -อนุวงศ์ -อนุวัต -อนุวาต -อนุศาสก -อนุศาสน์ -อนุศาสนาจารย์ -อนุศิษฏ์ -อนุสติ -อนุสนธิ -อนุสภากาชาด -อนุสร -อนุสรณ์ -อนุสัญญา -อนุสัย -อนุสาวรีย์ -อนุสาสนี -อเนก -อเนกคุณ -อเนกวิธ -อเนจอนาถ -อเนญชาภิสังขาร -อเนสนา -อโนชา -อโนดาต -อบ -อบเชย -อบาย -อป -อปการ -อปทาน -อปเทศ -อปภาคย์ -อปมงคล -อปมาน -อปยศ -อปรกติ -อประมาณ -อประมาท -อประไมย -อปรัณ -อปรา -อปราชัย -อปราชิต -อปราธ -อปราปรเจตนา -อปราปรเวทนียกรรม -อปริมาณ -อปริหาริยธรรม -อปลักษณ์ -อปโลกน์ -อปวาท -อปหาร -อปัณณกปฏิปทา -อปัทรพ -อปาจายนะ -อปาจี -อปาจีน -อปุญญาภิสังขาร -อเปหิ -อพจน์ -อพพะ -อพยพ -อพยาบาทวิตก -อพล -อพลา -อพาร์ตเมนต์ -อภว -อภัพ -อภัย -อภิ -อภิคม -อภิฆาต -อภิจฉา -อภิจฌา -อภิชน -อภิชัย -อภิชาต -อภิชิต -อภิญญา -อภิญญาณ -อภิฐาน -อภิธรรม -อภิธาน -อภิไธย -อภินันท์ -อภินัย -อภินาท -อภินิหาร -อภิเนษกรมณ์ -อภิบาล -อภิปรัชญา -อภิปราย -อภิมหาอำนาจ -อภิมานะ -อภิมุข -อภิรดี -อภิรติ -อภิรมย์ -อภิรักษ์ -อภิรัฐมนตรี -อภิราม -อภิรุต -อภิรุม -อภิรูป -อภิลักขิต -อภิลาส -อภิเลปน์ -อภิวันท์ -อภิวาท -อภิวาทน์ -อภิเษก -อภิสทธิ์ -อภิสมโพธิ -อภิสมัย -อภิสังขาร -อภิสัมโพธิ -อภิสิต -อภูต -อม -อ้ม -อมตะ -อมนุษย์ -อมร -อมรบดี -อมรปุระ -อมรรัตน์ -อมรราช -อมรสตรี -อมเรศ -อมเรศวร -อมฤต -อมฤตยู -อมัจจะ -อมัตร -อมาตย์ -อมาวสุ -อมาวาสี -อมิตร -อเมริกัน -อย -อยน -อยัส -อย่า -อยาก -อย่าง -อยุติธรรม -อยุทธ์ -อยู่ -อร -อรช -อรชร -อรชุน -อรณ -อรดี -อรติ -อรไท -อรธาน -อรนุช -อรพินท์ -อรพิม -อรรค -อรรฆ -อรรฆย์ -อรรจน์ -อรรณพ -อรรถ -อรรธ -อรรธางค์ -อรสุม -อรหะ -อรหัง -อรหัต -อรหัน -อรหันต์ -อร่อย -อรัญ -อรันต์ -อราดี -อราติ -อร่าม -อริ -อริน -อริยกะ -อริยะ -อรุ -อรุณ -อรุ่ม -อรูป -อลงกต -อลงกรณ์ -อลงการ -อลวน -อลเวง -อลหม่าน -อล่องฉ่อง -อลักเอลื่อ -อลัชชี -อล่างฉ่าง -อลิ -อลิงค์ -อลึงค์ -อลึ่งฉึ่ง -อโลหะ -อวก -อ้วก -อวกาศ -อวเคราะห์ -อวจร -อวชัย -อวชาต -อวด -อวตาร -อวน -อ้วน -อวนิ -อวบ -อวมงคล -อวมอำ -อ้วมเอีย -อวย -อวยวะ -อวรุทธ์ -อวรุธทก -อวล -อวสาน -อวหาร -อวัตถา -อวัยวะ -อวัสดา -อวาจี -อวิจี -อวิชชา -อวิญญู -อวิรุทธ์ -อวิโรธน์ -อวีจิ -อเวจี -อเวไนยสัตว์ -อโศก -อสงไขย -อสนี -อสภ -อสมการ -อสมมาตร -อสรพิษ -อสังกมทรัพย์ -อสังขตธรรม -อสังหาริมะ -อสัญญี -อสัญแดหวา -อสัตถพฤกษ์ -อสัตย์ -อสาธร -อสาธุ -อสาพติ -อสิ -อสิต -อสีตยานุพยัญชนะ -อสีติ -อสุ -อสุจิ -อสุญกัลป์ -อสุนีบาต -อสุภ -อสุรินทร์ -อสุรี -อสุเรนทร์ -อสุเรศ -อสูร -อเส -อเสกขะ -อเสขะ -อเสวนะ -อเสวนา -อห -อหังการ -อหิ -อหิงสา -อหึงสา -อเหตุกทิฐิ -อโหสิ -ออ -อ้อ -อ๋อ -ออก -ออกซิเจน -ออกซิเดชัน -ออกไซด์ -อ่อง -อ๋อง -อ้องแอ้ง -ออเซาะ -ออด -อ๊อดๆแอ๊ดๆ -อ๊อดแอ๊ด -อ่อน -อ้อน -ออนซ์ -ออนซอน -อ่อนซอน -อ้อนแอ้น -ออฟฟิศ -ออม -อ่อม -อ้อม -ออมครอม -ออมชอม -ออมซอม -อ้อมแอ้ม -อ่อย -อ้อย -อ๋อย -อ้อยส้อย -อ้อยอิ่ง -ออร์แกน -ออร์เดิร์ฟ -ออสเมียม -อ้อแอ้ -อ๊ะ -อะคร้าว -อะเคื้อ -อะจีน -อะแจ -อะเซทิลีน -อะดรืนาลิน -อะดัก -อะดุง -อะตอม -อะนะ -อะนั้น -อะนี้ -อะมีบา -อะเมริเซียม -อะร้าอร่าม -อะไร -อะลังการ -อะลุ่มอล่วย -อะลุ้มอล่วย -อะลูมิเนียม -อะหม -อะไหล่ -อะอื้อ -อะเอื้อย -อัก -อั้ก -อั๊ก -อั้กๆ -อั๊กๆ -อักกะ -อักโกธะ -อักโกสวัตถุ -อักข -อักขระ -อักขรานุกรมภูมิศาสตร์ -อักขาน -อักโข -อักโขภิณี -อักโขเภณี -อักษร -อักษะ -อักเษาหิณี -อักเสบ -อักอ่วน -อัคคะ -อัคคิ -อัคคี -อัคนิ -อัคนี -อัคนีกรีฑา -อัง -อังก์ -อังกนะ -อังกฤษ -อังกวด -อังกะลุง -อังกา -อังกาบ -อังกุร -อังกุศ -อังกูร -อังคณะ -อังคณา -อังคะ -อังคาร -อังคาส -อังคีรส -อังคุฐ -อังฆาต -อั้งเปา -อั้งม้อ -อั้งยี่ -อั้งโล่ -อังศะ -อังศุ -อังศุก -อังสตรอม -อังสนา -อังสะ -อัจกลับ -อัจจันต์ -อัจจัย -อัจจิ -อัจจุต -อัจเจกะ -อัจฉรา -อัจฉริยะ -อัจนา -อัชฌา -อัชฌาจาร -อัชฌาศัย -อัชฌาสัย -อัชบาล -อัญขยม -อัญชนะ -อัญชลี -อัญชัน -อัญเชิญ -อัญญะ -อัญประกาศ -อัญมัญญะ -อัญรูป -อัฏ -อัฏฐ -อัฏนา -อัฐ -อัฐมะ -อัฐฬส -อัฐิ -อัณฑะ -อัณณพ -อัด -อัดแจ -อัตคัด -อัตจริยา -อัตตะ -อัตตา -อัตถ์ -อัตถะ -อัตโนมัติ -อัตรชะ -อัตรา -อัตลัด -อัททา -อัทธ์ -อัทธา -อัทธาน -อัธยาตมวิทยา -อัธยาย -อัธยาศัย -อัน -อั้น -อั๋น -อันดก -อันดร -อันดับ -อันด๊าก -อันโด๊ก -อันตร -อันตรธาน -อันตรา -อันตราย -อันติก -อันติมะ -อันเต -อันโต -อันแถ้ง -อันทุ -อันโทล -อันนะ -อันยะ -อันโยนยะ -อันวัย -อันเวส -อับ -อับปาง -อัปกะ -อัปการ -อัปฏิฆะ -อัปฏิภาค -อัปปะ -อัปภาคย์ -อัปมงคล -อัปยศ -อัประมาณ -อัประมาท -อัประไมย -อัปราชัย -อัปรีย์ -อัปลักษณ์ -อัปสร -อัพพุท -อัพโพหาริก -อัพภันดร -อัพภาน -อัพภาส -อัม -อัมพร -อัมพา -อัมพิล -อัมพุ -อัยกะ -อัยกา -อัยการ -อัยกี -อัยยะ -อัยยาภริยา -อัยยิกา -อัลตราไวโอเลต -อั่ว -อั๊ว -อัศจรรย์ -อัศเจรีย์ -อัษฎมะ -อัสดง -อัสดม -อัสนี -อัสมิมานะ -อัสสะ -อัสสัตถพฤกษ์ -อัสสุ -อา -อ่า -อ้า -อากง -อากร -อากังขา -อากัป -อากัมปนะ -อากัมปะ -อาการ -อากาศ -อากิญจัญญะ -อากูล -อาเกียรณ์ -อาขยาต -อาขยาน -อาคเนย์ -อาคม -อาครหายณี -อาคันตุกะ -อาคาร -อาฆาต -อาฆาตนะ -อ่าง -อ้าง -อางขนาง -อ้างว้าง -อาจ -อาจม -อาจมน -อาจาด -อาจาร -อาจารย์ -อาจิณ -อาเจียน -อาชญัปติ -อาชญัปติ์ -อาชญา -อาชวะ -อาชา -อาชาน -อาชานิ -อาชาไนย -อาชีพ -อาชีวก -อาชีวนะ -อาชีวะ -อาญา -อาฏาตา -อาณัติ -อาณา -อาณาปก -อาณาปน -อาด -อาดๆ -อาดุลย์ -อาดูร -อาดูลย์ -อาเด๊ะ -อาตมัน -อาตุร -อาถรรพ์ -อาถรรพณ์ -อาถรรพณะ -อาทมาฏ -อาทร -อาทาตา -อาทาน -อาทิกวี -อาทิตย์ -อาทีนพ -อาทีนว -อาทึก -อาเทศ -อาธรรม -อาธรรม์ -อาธรรมิก -อาธรรมึก -อาธาน -อาธาร -อาน -อ่าน -อานก -อานน -อานนท์ -อานะ -อานันท์ -อานันทนะ -อานัม -อานำ -อานิก -อานิสงฆ์ -อานุภาพ -อานุภาวะ -อาบ -อาบัง -อาบัติ -อาบัน -อาบู -อาปณะ -อาปะ -อาปานะ -อาโป -อาพัด -อาพัทธ์ -อาพันธ์ -อาพันธนะ -อาพาธ -อาพิล -อาเพศ -อาภรณ์ -อาภัพ -อาภัสระ -อาภา -อาภาส -อาโภค -อามลก -อามัย -อามา -อามิษ -อามิส -อาย -อ้าย -อายต -อายตนะ -อายน -อายัด -อายัต -อายัน -อายาจนะ -อายาน -อายุ -อายุกตกะ -อายุตกะ -อายุธ -อายุษ -อาร์กอน -อารดี -อาร์ต -อารติ -อารทรา -อารบิค -อาร์ม -อารมณ์ -อารยะ -อาระ -อารักขา -อารักษ์ -อารัญ -อารัญญิก -อารัณย์ -อารัณยกะ -อารัติ -อารัมภ์ -อาราธน์ -อาราธนา -อาราม -อารี -อารุม -อาลปน์ -อาลปนะ -อาละวาด -อาลักษณ์ -อาลัย -อาลัว -อาลิ -อาลี -อาโลก -อาว -อ่าว -อ้าว -อาวรณ์ -อาวัชนาการ -อาวาส -อาวาหะ -อาวิล -อาวุต -อาวุธ -อาวุโส -อาเวค -อาเวศ -อาศรม -อาศรมบท -อาศเลษา -อาศัย -อาศุ -อาเศียร -อาษาฒ -อาสนะ -อาสภิวาจา -อาสยานุสัย -อาสวกษัย -อาสวกิเลส -อาสัญ -อาสัตย์ -อาสันนะ -อาสา -อาสาฬห์ -อาสิญจ์ -อาสิน -อาสูร -อาเสี่ย -อาแสะ -อาหต -อาหตี -อาหนี -อาหนู -อาหม -อาหยัง -อาหยัน -อาหร -อาหรัดกัดติกา -อาหรับ -อาหลักอาเหลื่อ -อาหาร -อาหุดี -อาฬหก -อาฬาหนะ -อำ -อ่ำ -อำแดง -อำนด -อำนนต์ -อำนรรฆ -อำนวย -อำนาจ -อำนาถ -อำนิฐ -อำนิษฐ์ -อำปลัง -อำพน -อำพะนำ -อำพัน -อำไพ -อำเภอ -อำเภอใจ -อำมร -อำมฤคโชค -อำมฤต -อำมหิต -อำมาตย์ -อำยวน -อำรุง -อำลา -อำอวม -อ้ำอึ้ง -อิก -อิง -อิงค์ -อิงอร -อิจฉา -อิฉัน -อิชยา -อิฐ -อิณ -อิด -อิตถี -อิตเทรียม -อิตเทอร์เบียม -อิติหาส -อิทธิ -อิธโลก -อิน -อินซูลิน -อินเดีย -อินเดียนแดง -อินเดียม -อินท์ -อินทขีล -อินทนิล -อินทนิลน้ำ -อินทผลัม -อินทร์ -อินทรี -อินทรีย์ -อินทีวร -อินทุ -อินธน์ -อินฟราเรด -อินและหยัง -อินวอยซ์ -อิ่ม -อิมัลชัน -อิริเดียม -อิริยา -อิรุพเพท -อิลู -อิเล็กตรอน -อิเล็กทรอนิกส์ -อิเล็กโทน -อิศ -อิศร -อิศวร -อิษฏ์ -อิษฏี -อิส -อิสตรี -อิสระ -อิสริยะ -อิสสา -อิสัตรี -อิสิ -อิสี -อิหม่าม -อี -อี่ -อี้ -อี๊ -อี๋ -อีก -อีก้อ -อีก๋อย -อีกา -อีก๋า -อีเก้ง -อีเกร็ง -อีเก้อีกัง -อีแก -อีแก่ -อีแก้ -อีโก้ง -อีโก๊ะ -อีคว่ำอีหงาย -อีจู้ -อีฉัน -อีฉุยอีแฉก -อีชุก -อี๊ด -อีดอก -อีดำอีแดง -อีตัว -อีตาล -อีเต้อ -อีโต้ -อีถ่าง -อีทุก -อีทุบ -อีเทอร์ -อีนุงตุงนัง -อีนูน -อีโน -อีโนงโตงเนง -อีบึ้ง -อีปุด -อีเป็ด -อีเป้า -อีแปะ -อีโปง -อีเพา -อีมู -อีรม -อีรุ้ง -อีแรดแจ๊ดแจ๋ -อีแร้แท้แต่ -อีลอง -อีล่อยป่อยแอ -อีลุ้ม -อีลุ่ยฉุยแฉก -อีเลิ้ง -อีแล่ง -อีโลง -อีศวร -อีส -อีสเตอร์ -อีสา -อีสาน -อีสุกอีใส -อีหนองอีแหนง -อีหรอบ -อีหลักอีเหลื่อ -อีหลัดถัดทา -อีหลี -อีหลุกขลุกขลัก -อีหลุกขลุกขลุ่ย -อีหลุยฉุยแฉก -อีเห็น -อีเหน็บ -อีเหนียว -อีเหยี่ยว -อีเหละเขละขละ -อีเหละเขะขะ -อีโหน่อีเหน่ -อีโหลกโขลกเขลก -อีแอ่น -อึ -อึก -อึ๊ก -อึกทึก -อึกอัก -อึง -อึ่ง -อึ้ง -อึด -อึดตะปือ -อึ้ดทึ่ด -อึน -อืด -อื่น -อื้น -อือ -อื้อ -อุ -อุก -อุกกา -อุกฤษฏ์ -อุกลา -อุค -อุคร -อุคหนิมิต -อุคหะ -อุโฆษ -อุ้ง -อุจ -อุจจาระ -อุจฉุ -อุจเฉท -อุจาด -อุชุ -อุญฉาจริยา -อุฏฐาการ -อุณหะ -อุณหิส -อุณา -อุด -อุดเตา -อุดม -อุดร -อุดหนุน -อุดากัน -อุตดม -อุตดร -อุตตมะ -อุตบล -อุตพิด -อุตรา -อุตริ -อุตลุด -อุตส่าห์ -อุตสาหะ -อุตุ -อุทก -อุททาม -อุทธรณ์ -อุทธัจ -อุทยาน -อุทร -อุทริยะ -อุทลุม -อุทัย -อุทาน -อุทาร -อุทาหรณ์ -อุทิศ -อุทุมพร -อุเทศ -อุเทสิกเจดีย์ -อุธัจ -อุ่น -อุนากัน -อุบ -อุบล -อุบะ -อุบ๊ะ -อุบัติ -อุบาท -อุบาทว์ -อุบาย -อุบาสก -อุบาสิกา -อุเบกขา -อุโบสถ -อุโบสถหัตถี -อุป -อุปกรณ์ -อุปกรม -อุปการ -อุปการะ -อุปกาศสาร -อุปกิณณะ -อุปกิเลส -อุปฆาตกกรรม -อุปจาร -อุปถัมภ์ -อุปถัมภก -อุปทม -อุปทูต -อุปเทศ -อุปเท่ห์ -อุปธิ -อุปธิวิเวก -อุปนัย -อุปนายก -อุปนายน -อุปนิกขิต -อุปนิกษิต -อุปนิษัท -อุปนิสัย -อุปบล -อุปบัติ -อุปบาท -อุปพัทธ์ -อุปพันธ์ -อุปภิเษก -อุปโภค -อุปมา -อุปมาน -อุปมาอุปไมย -อุปไมย -อุปยุวราช -อุปโยค -อุปโยราช -อุปรากร -อุปราคา -อุปราช -อุปริ -อุปโลกน์ -อุปโลกห์ -อุปสมบท -อุปสมบัน -อุปสรรค -อุปสัมบัน -อุปสัมปทา -อุปฮาด -อุปัชฌาย์ -อุปัชฌายะ -อุปัฏฐาก -อุปัฏฐานะ -อุปัทวะ -อุปาขยาน -อุปาธยาย -อุปายาส -อุปาหนา -อุภโตสงฆ์ -อุภัย -อุ้ม -อุมงค์ -อุมมัต -อุมา -อุโมงค์ -อุย -อุ้ย -อุ๊ย -อุยยาน -อุยยาม -อุยโยค -อุรค -อุรณ -อุรพี -อุรส -อุระ -อุรังอุตัง -อุรัจฉทะ -อุรัจฉัท -อุรา -อุรุ -อุไร -อุลปนะ -อุลโลจ -อุลโลละ -อุลามก -อุลิด -อุลูก -อุโลก -อุวะ -อุแว้ -อุษณีษ์ -อุษม -อุษมัน -อุษา -อุษาหะ -อุสภ -อุสวะ -อุสส่าห์ -อุสสาหะ -อุสา -อุสุ -อุสุภ -อุสุม -อุหรับ -อุหลบ -อุเหม่ -อุฬาร -อู -อู่ -อู้ -อู๋ -อูฐ -อูด -อูม -อูรู -อู๋อี๋ -เอ -เอ้ -เอ้ๆแอ่น -เอก -เอ๊ก -เอกเขนก -เอกจักษุ -เอกจิต -เอกฉันท์ -เอกชน -เอกซโป -เอกซเรย์ -เอกเทศ -เอกโทษ -เอกนัย -เอกบุคคล -เอกบุรุษ -เอกพจน์ -เอกพันธ์ -เอกภพ -เอกภริยา -เอกภักดิ์ -เอกภาคี -เอกภาพ -เอกม -เอกมติ -เอกมัย -เอกรรถประโยค -เอกรส -เอกระ -เอกราช -เอกลักษณ์ -เอกศก -เอกส -เอกสมังคี -เอกสาร -เอกสิทธิ์ -เอกอัครราชทูต -เอกอุ -เอกัคตา -เอกังสพยากรณ์ -เอกังสวาที -เอกัตภาพ -เอกา -เอ้กา -เอกิกา -เอกีภูต -เอเคอร์ -เอง -เอ็ง -เอ๋ง -เอเชี่ยนเกมส์ -เอ็ด -เอดส์ -เอตทัคคะ -เอ้เต -เอทิลแอลกอฮอล์ -เอน -เอ็น -เอนไซม์ -เอ็นดู -เอนทรานซ์ -เอม -เอ็มบริโอ -เอย -เอ่ย -เอ๊ย -เอ๋ย -เอเย่นต์ -เอร็ดอร่อย -เอราวัณ -เอลา -เอลาฬุก -เอว -เอ๊ว -เอวัง -เอ้หมึง -เอหิปัสสิโก -เอหิภิกขุอุปสัมปทา -เอฬก -เอฬา -เออ -เอ่อ -เออร์เบียม -เอ้อระเหย -เอ้อเร้อ -เอ้อเฮอ -เอ้แอ่น -เอ๊ะ -เอะใจ -เอะอะ -เอา -เอ้า -เอาทาร -เอาทารย์ -เอารส -เอาฬาร -เอาะลาย -เอิก -เอิ้ก -เอิน -เอิ้น -เอิบ -เอียง -เอี้ยง -เอียด -เอี๊ยด -เอียน -เอี่ยน -เอี่ยม -เอี๊ยม -เอี้ยมจุ๊น -เอี้ยมเฟี้ยม -เอี่ยว -เอี้ยว -เอื้อ -เอื้อง -เอื้องชัน -เอือด -เอือน -เอื้อน -เอือม -เอื้อม -เอื่อย -เอื้อย -เอื่อยๆ -แอ -แอ้ -แอ๋ -แอก -แอกทิเนียม -แอ่ง -แอ้งแม้ง -แอด -แอ้ด -แอ๊ด -แอดๆ -แอ๊ดๆ -แอ่น -แอนติเจน -แอนติบอดี -แอนติอิเล็กตรอน -แอ่นลม -แอโนด -แอบ -แอ้ม -แอมแปร์ -แอมเฟตามีน -แอมมิเตอร์ -แอมโมเนีย -แอร่ม -แอร์โฮสเตส -แอลกอฮอล์ -แอลฟา -แอว -แอ่ว -แอ้วแซ่ว -แอสทาทีน -แอสไพริน -แอสฟัลต์ -แอหนัง -แออวย -แออัด -โอ -โอ่ -โอ้ -โอ๋ -โอก -โอ้ก -โอ๊ก -โอกาส -โอฆะ -โอ่ง -โองการ -โองโขดง -โอชะ -โอชา -โอโซน -โอฐ -โอด -โอต -โอตตัปปะ -โอทนะ -โอน -โอบ -โอปปาติกะ -โอเปก -โอภา -โอภาส -โอม -โอย -โอ๊ย -โอรส -โอละพ่อ -โอลิมปิก -โอเลี้ยง -โอวาท -โอษฐ์ -โอสถ -โอสาน -โอหนอ -โอห์ม -โอหัง -โอฬาร -โอ้เอ้ -โอเอซิส -โอ้โฮ -ไอ -ไอ้เข้ -ไอโซโทป -ไอน์สไตเนียม -ไอยรา -ไอยเรศ -ไอราพต -ไอราวัณ -ไอศกรีม -ไอศวรรย์ -ไอออน -ไอโอดีน -ฮ -ฮกเกี้ยน -ฮกลกซิ่ว -ฮ้ง -ฮด -ฮวงซุ้ย -ฮวน -ฮ้วน -ฮ้วนหมู -ฮวบ -ฮวย -ฮ่อ -ฮ้อ -ฮอกกี้ -ฮ่อง -ฮ่องเต้ -ฮองเฮา -ฮอด -ฮอตดอก -ฮ่อม -ฮ่อมดง -ฮ่อมเมือง -ฮ่อมริน -ฮอร์โมน -ฮอลแลนด์ -ฮอลันดา -ฮะ -ฮัก -ฮักๆ -ฮังเล -ฮัดเช้ย -ฮั่น -ฮั้ว -ฮา -ฮ้า -ฮ่าๆ -ฮ่างหลวง -ฮาม -ฮาราคีรี -ฮาเร็ม -ฮาห์เนียม -ฮิๆ -ฮิจเราะห์ -ฮินดู -ฮิปปี้ -ฮิปโปโปเตมัส -ฮิสทีเรีย -ฮี้ -ฮีเลียม -ฮึ -ฮึก -ฮึด -ฮึม -ฮึ่ม -ฮึย -ฮืดฮาด -ฮือ -ฮื่อ -ฮื้อ -ฮุด -ฮุบ -ฮุยเลฮุย -ฮู้ -ฮูก -ฮูม -เฮ -เฮ้ -เฮกตาร์ -เฮกโตกรัม -เฮกโตเมตร -เฮกโตลิตร -เฮง -เฮโมโกลบิน -เฮย -เฮ้ย -เฮโรอีน -เฮลิคอปเตอร์ -เฮ้ว -เฮอ -เฮ้อ -เฮิรตซ์ -เฮีย -เฮี้ยน -เฮี้ยบ -เฮี้ยว -เฮือก -เฮือน -แฮ -แฮ่ -แฮ่กึ๊น -แฮนด์บอล -แฮฟเนียม -แฮม -แฮมเบอร์เกอร์ -แฮะ -โฮ -โฮก -โฮเต็ล -โฮลเมียม -โฮะ -ไฮ้ -ไฮโกรมิเตอร์ -ไฮด์ปาร์ก -ไฮดรา -ไฮโดรคาร์บอน -ไฮโดรเจน -ไฮโดรเจนซัลไฟด์ -ไฮโดรเจนเพอร์ออกไซด์ -ไฮโดรมิเตอร์ -ไฮไฟ -ไฮโล -ไฮฮี diff --git a/icuSources/test/testdata/translit_rules.txt b/icuSources/test/testdata/translit_rules.txt index c650d1df..b45837d6 100644 --- a/icuSources/test/testdata/translit_rules.txt +++ b/icuSources/test/testdata/translit_rules.txt @@ -1,11 +1,7 @@ #-------------------------------------------------------------------- -# Copyright (c) 1999-2003, International Business Machines +# Copyright (c) 1999-2004, International Business Machines # Corporation and others. All Rights Reserved. #-------------------------------------------------------------------- -# $Source: /cvs/root/ICU/icuSources/test/testdata/translit_rules.txt,v $ -# $Date: 2003/07/03 18:13:53 $ -# $Revision: 1.1.1.1 $ -#-------------------------------------------------------------------- # InterIndic-Bengali #:: NFD (NFC) ; diff --git a/icuSources/test/thaitest/thaitest.cpp b/icuSources/test/thaitest/thaitest.cpp index 65831dcc..910d9db2 100644 --- a/icuSources/test/thaitest/thaitest.cpp +++ b/icuSources/test/thaitest/thaitest.cpp @@ -1,6 +1,6 @@ /* ****************************************************************************** - * Copyright (C) 1998-2001, International Business Machines Corporation and * + * Copyright (C) 1998-2003, International Business Machines Corporation and * * others. All Rights Reserved. * ****************************************************************************** */ diff --git a/icuSources/test/threadtest/converttest.cpp b/icuSources/test/threadtest/converttest.cpp index 519f3e4c..8de22efa 100644 --- a/icuSources/test/threadtest/converttest.cpp +++ b/icuSources/test/threadtest/converttest.cpp @@ -1,6 +1,6 @@ // //******************************************************************** -// Copyright (C) 2002, International Business Machines +// Copyright (C) 2002-2003, International Business Machines // Corporation and others. All Rights Reserved. //******************************************************************** // diff --git a/icuSources/test/threadtest/threadtest.cpp b/icuSources/test/threadtest/threadtest.cpp index 1b678d74..33a89b8c 100644 --- a/icuSources/test/threadtest/threadtest.cpp +++ b/icuSources/test/threadtest/threadtest.cpp @@ -1,6 +1,6 @@ // //******************************************************************** -// Copyright (C) 2002, International Business Machines +// Copyright (C) 2002-2003, International Business Machines // Corporation and others. All Rights Reserved. //******************************************************************** // diff --git a/icuSources/test/threadtest/threadtest.dsp b/icuSources/test/threadtest/threadtest.dsp index e2c3b2bf..63bfe223 100644 --- a/icuSources/test/threadtest/threadtest.dsp +++ b/icuSources/test/threadtest/threadtest.dsp @@ -92,7 +92,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /MD /W3 /I "..\..\..\include" /I "..\..\..\source\common" /I "..\..\..\source\i18n" /D"WIN64" /D"NDEBUG" /D"_CONSOLE" /D"_MBCS" /FD /c /O2 /GX /Op /QIA64_fmaopt /D"_IA64_" /Zi /D"WIN64" /D"WIN32" /D"_AFX_NO_DAO_SUPPORT" /Zm600 +# ADD CPP /nologo /MD /W3 /I "..\..\..\include" /I "..\..\..\source\common" /I "..\..\..\source\i18n" /D"WIN64" /D"NDEBUG" /D"_CONSOLE" /D"_MBCS" /FD /c /O2 /GX /Op /D"_IA64_" /Zi /D"WIN64" /D"WIN32" /D"_AFX_NO_DAO_SUPPORT" /Zm600 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -116,7 +116,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /I "..\..\..\include" /I "..\..\..\source\common" /I "..\..\..\source\i18n" /D"WIN64" /D"_DEBUG" /D"_CONSOLE" /D"_MBCS" /FR /FD /GZ /c /Od /GX /Op /QIA64_fmaopt /D"_IA64_" /Zi /D"WIN64" /D"WIN32" /D"_AFX_NO_DAO_SUPPORT" /Zm600 +# ADD CPP /nologo /MDd /W3 /Gm /I "..\..\..\include" /I "..\..\..\source\common" /I "..\..\..\source\i18n" /D"WIN64" /D"_DEBUG" /D"_CONSOLE" /D"_MBCS" /FR /FD /GZ /c /Od /GX /Op /D"_IA64_" /Zi /D"WIN64" /D"WIN32" /D"_AFX_NO_DAO_SUPPORT" /Zm600 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe diff --git a/icuSources/test/usetperf/bitset.cpp b/icuSources/test/usetperf/bitset.cpp index ae40ebd7..d1356c0e 100644 --- a/icuSources/test/usetperf/bitset.cpp +++ b/icuSources/test/usetperf/bitset.cpp @@ -1,10 +1,8 @@ /* ********************************************************************** -* Copyright (c) 2002, International Business Machines +* Copyright (c) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** -* $Source: /cvs/root/ICU/icuSources/test/usetperf/bitset.cpp,v $ -********************************************************************** * 2002-09-20 aliu Created. */ diff --git a/icuSources/test/usetperf/bitset.h b/icuSources/test/usetperf/bitset.h index 9e0a4c1f..8b7122df 100644 --- a/icuSources/test/usetperf/bitset.h +++ b/icuSources/test/usetperf/bitset.h @@ -1,10 +1,8 @@ /* ********************************************************************** -* Copyright (c) 2002, International Business Machines +* Copyright (c) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** -* $Source: /cvs/root/ICU/icuSources/test/usetperf/bitset.h,v $ -********************************************************************** * 2002-09-20 aliu Created. */ #ifndef __BITSET_H__ diff --git a/icuSources/test/usetperf/timer.h b/icuSources/test/usetperf/timer.h index 3e698ebe..4aa5824f 100644 --- a/icuSources/test/usetperf/timer.h +++ b/icuSources/test/usetperf/timer.h @@ -1,10 +1,8 @@ /* ********************************************************************** -* Copyright (c) 2002, International Business Machines +* Copyright (c) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** -* $Source: /cvs/root/ICU/icuSources/test/usetperf/timer.h,v $ -********************************************************************** * 2002-09-20 aliu Created. */ #ifndef __PERFTIMER_H__ diff --git a/icuSources/test/usetperf/usetperf.cpp b/icuSources/test/usetperf/usetperf.cpp index beb41ff5..cdff2adb 100644 --- a/icuSources/test/usetperf/usetperf.cpp +++ b/icuSources/test/usetperf/usetperf.cpp @@ -1,10 +1,8 @@ /* ********************************************************************** -* Copyright (c) 2002, International Business Machines +* Copyright (c) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** -* $Source: /cvs/root/ICU/icuSources/test/usetperf/usetperf.cpp,v $ -********************************************************************** * 2002-09-20 aliu Created. */ diff --git a/icuSources/test/usetperf/usetperf.dsp b/icuSources/test/usetperf/usetperf.dsp index 9af028ea..3d012285 100644 --- a/icuSources/test/usetperf/usetperf.dsp +++ b/icuSources/test/usetperf/usetperf.dsp @@ -95,7 +95,7 @@ LINK32=link.exe # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /Op /I "..\..\..\include" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /Op /I "..\..\..\include" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -120,7 +120,7 @@ LINK32=link.exe # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /Op /I "..\..\..\include" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /GZ /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /Op /I "..\..\..\include" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /GZ /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe diff --git a/icuSources/test/utfperf/utfperf.dsp b/icuSources/test/utfperf/utfperf.dsp index 0b1ba596..83512224 100644 --- a/icuSources/test/utfperf/utfperf.dsp +++ b/icuSources/test/utfperf/utfperf.dsp @@ -95,7 +95,7 @@ LINK32=link.exe # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /Op /I "..\..\..\include" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /Op /I "..\..\..\include" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -120,7 +120,7 @@ LINK32=link.exe # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /Op /I "..\..\..\include" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /GZ /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /Op /I "..\..\..\include" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /GZ /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe diff --git a/icuSources/tools/Makefile.in b/icuSources/tools/Makefile.in index 448fc4ff..d8509e61 100644 --- a/icuSources/tools/Makefile.in +++ b/icuSources/tools/Makefile.in @@ -1,5 +1,5 @@ ## Makefile.in for ICU tools -## Copyright (c) 1999-2003, International Business Machines Corporation and +## Copyright (c) 1999-2004, International Business Machines Corporation and ## others. All Rights Reserved. ## Source directory information @@ -10,55 +10,12 @@ top_builddir = .. include $(top_builddir)/icudefs.mk -include @platform_make_fragment@ - -## - -CPPFLAGS = @CPPFLAGS@ -I$(top_srcdir)/common -I$(top_builddir)/common -CFLAGS = @CFLAGS@ -CXXFLAGS = @CXXFLAGS@ - ## Build directory information subdir = tools -# OBJDATADIR must be a short path (with ..'s) to the data. - -SRCDATADIR=$(top_srcdir)/../data - -OBJDATADIR=$(top_builddir)/data -# tmpdir is INSIDE pkgdata dir. if you change TMPDATADIR then the invokation -# of pkgdata will break... -TMPDATADIR=tmp - -# DATABUILDDIR must be an absolute path because of the way pkgdata is invoked -# from the temporary directory. - -DATABUILDDIR=$(OBJDATADIR) - -# relative lib links from pkgdata are the same as for tmp -top_builddir_from_tmp = $(patsubst ..%,../..%,$(top_builddir)) -INVOKE = $(LDLIBRARYPATH_ENVVAR)=$(top_builddir_from_tmp)/common:$(top_builddir_from_tmp)/tools/toolutil:$$$(LDLIBRARYPATH_ENVVAR) -PKGDATA = ../pkgdata/pkgdata -T . -s $(DATABUILDDIR) -O ./icupkg.inc -d $(DATABUILDDIR) -PKGDATA_VERSIONING = -r $(SO_TARGET_VERSION) - -## Install program information -MKINSTALLDIRS = $(SHELL) $(top_srcdir)/mkinstalldirs - -INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ - -## for cleaning up libraries -STRIP = @STRIP@ - -## Package information -PACKAGE = @PACKAGE@ -VERSION = @VERSION@ - - SUBDIRS = ctestfw toolutil makeconv genrb genuca genbrk \ -genccode genprops gennames genpname gennorm gencmn gencnval gentz gentest genidna pkgdata +genprops gencase gennames genpname gennorm gencmn gencnval gensprep genccode pkgdata \ +gentest icuswap ## List of phony targets .PHONY : all all-local all-recursive install install-local install-files install-dlls build-cmnfile build-dll \ @@ -97,107 +54,23 @@ all-recursive install-recursive clean-recursive distclean-recursive dist-recursi all-local: build-local -DAT_FILES=uprops.dat unames.dat cnvalias.dat tz.dat -# ALL of these files can be deleted (the following BRK files) - they are copied -BRK_FILES=char.brk line.brk line_th.brk sent.brk word.brk title.brk word_th.brk -# don't include thaidict.brk - it goes into a resource bundle - plus it isn't deleted - -DATAFILESD=$(DAT_FILES:%=$(OBJDATADIR)/%) -DATAFILESB=$(BRK_FILES:%=$(OBJDATADIR)/%) - -# copy the right endianness - -ifeq (@U_IS_BIG_ENDIAN@,1) -$(OBJDATADIR)/%.brk: $(SRCDATADIR)/%BE.brk - cp $< $@ -else -$(OBJDATADIR)/%.brk: $(SRCDATADIR)/%LE.brk - cp $< $@ -endif - -#include $(srcdir)/makeconv/ucmfiles.mk -#-include $(srcdir)/makeconv/ucmebcdic.mk -#-include $(srcdir)/makeconv/ucmlocal.mk -ALL_UCM_SOURCE= $(UCM_SOURCE) $(UCM_EBCDIC_SOURCE) $(UCM_SOURCE_LOCAL) - -#include $(srcdir)/genrb/genrbfiles.mk -#-include $(srcdir)/genrb/reslocal.mk -ALL_RES_SOURCE= $(GENRB_SOURCE) $(TRANSLIT_SOURCE) $(RESOURCE_SRC) $(GENRB_SOURCE_LOCAL) - -UCM_FILES = $(ALL_UCM_SOURCE:%=$(SRCDATADIR)/%) -CNV_FILES = $(ALL_UCM_SOURCE:%.ucm=$(OBJDATADIR)/%.cnv) -CNV_FILESL = $(ALL_UCM_SOURCE:%.ucm=%.cnv) - -RES_SRC_FILES = $(ALL_RES_SOURCE:%=$(SRCDATADIR)/%) -RES_FILES = $(ALL_RES_SOURCE:%.txt=$(OBJDATADIR)/%.res) -RES_FILESL = $(ALL_RES_SOURCE:%.txt=%.res) - -DATAFILESC=$(CNV_FILES) -DATAFILESR=$(RES_FILES) - -DATAFILES=$(DATAFILESD) $(CNV_FILES) $(DATAFILESB) $(RES_FILES) -DATAFILESL=$(DAT_FILES) $(CNV_FILESL) $(BRK_FILES) $(RES_FILESL) - ## Files to remove for 'make clean' -CLEANFILES = *~ $(BRK_FILES) +CLEANFILES = *~ install-local: dist-local: -clean-local: clean-pkgdata +clean-local: test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES) - test -z "$(SRCDATAFILES)" || $(RMV) $(SRCDATAFILES) - $(RMV) $(DATAFILES) - $(RMV) icupkg.inc - -@if [ -f $(TMPDATADIR)/$(ICUDATA_NAME)_dll.mak ]; then \ - (cd pkgdata ; $(INVOKE) ./pkgdata -T $(TMPDATADIR) -m dll $(PKGDATA_VERSIONING) -p $(ICUDATA_NAME) -O $(DATABUILDDIR)/icupkg.inc $(TMPDATADIR)/$(ICUDATA_NAME).lst -d $(DATABUILDDIR) --clean ) \ - fi - -@if [ -f $(TMPDATADIR)/$(ICUDATA_NAME)_common.mak ]; then \ - (cd pkgdata; $(INVOKE) ./pkgdata -T $(TMPDATADIR) -m common -p $(ICUDATA_NAME) -O $(DATABUILDDIR)/icupkg.inc $(TMPDATADIR)/$(ICUDATA_NAME).lst -d $(DATABUILDDIR) --clean ) \ - fi - -@$(RMV) $(TMPDATADIR) $(TMPDATADIR)2 # Clean up any old variations.. distclean-local: clean-local $(RMV) Makefile -$(TMPDATADIR)/$(ICUDATA_NAME).lst: Makefile $(srcdir)/Makefile.in $(srcdir)/genrb/genrbfiles.mk $(srcdir)/makeconv/ucmfiles.mk - @echo "generating $@ (list of data files)" - @$(MKINSTALLDIRS) $(TMPDATADIR) - @-$(RMV) $(TMPDATADIR)/$(ICUDATA_NAME).lst - @for file in $(DATAFILESL); do \ - echo $(OBJDATADIR)/$$file >> $(TMPDATADIR)/$(ICUDATA_NAME).lst; \ - done; - -$(TMPDATADIR)/testdata.lst: Makefile - $(MKINSTALLDIRS) $(TMPDATADIR) - echo $(DATABUILDDIR)/test.dat > $@ - -$(TMPDATADIR)2/testdata.lst: Makefile $(top_builddir)/test/testdata/root.res - $(MKINSTALLDIRS) $(TMPDATADIR)2 - echo $(DATABUILDDIR)/test.dat > $@ - echo $(DATABUILDDIR)/../test/testdata/root.res >> $@ - -$(TMPDATADIR)/icupkg.inc: pkgdata/icupkg.inc - $(MKINSTALLDIRS) $(TMPDATADIR) - cp pkgdata/icupkg.inc $(TMPDATADIR)/icupkg.inc - -$(TMPDATADIR)2/icupkg.inc: pkgdata/icupkg.inc - $(MKINSTALLDIRS) $(TMPDATADIR)2 - cp pkgdata/icupkg.inc $(TMPDATADIR)2/icupkg.inc - -# build the ICU and test data - build-local: -clean-pkgdata: - -(cd $(TMPDATADIR); $(INVOKE) $(PKGDATA) -m dll -p $(ICUDATA_NAME) ./$(ICUDATA_NAME).lst --clean || echo '### Warning, cannot clean up icu/data if pkgdata is already gone.' ) - -(cd $(TMPDATADIR); $(INVOKE) $(PKGDATA) -m common -p testdat1 ./testdata.lst --clean || echo '### Warning, cannot clean up icu/data if pkgdata is already gone.' ) - -(cd $(TMPDATADIR)2; $(INVOKE) $(PKGDATA) -m common -p testdat2 ./testdata.lst --clean || echo '### Warning, cannot clean up icu/data if pkgdata is already gone.' ) - -$(RMV) $(TMPDATADIR)/$(ICUDATA_NAME).lst $(TMPDATADIR)/testdata.lst $(TMPDATADIR)/icupkg.inc $(TMPDATADIR)2/testdata.lst - check-local: Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status diff --git a/icuSources/tools/cpysearch/cpyscan.pl b/icuSources/tools/cpysearch/cpyscan.pl new file mode 100644 index 00000000..d435e356 --- /dev/null +++ b/icuSources/tools/cpysearch/cpyscan.pl @@ -0,0 +1,22 @@ +#!/usr/bin/perl -w +# *********************************************************************** +# * COPYRIGHT: +# * Copyright (c) 2002-2004, International Business Machines Corporation +# * and others. All Rights Reserved. +# *********************************************************************** +use strict; + +my $icuSource = $ARGV[0]; +my $ignore = "data/out/build|CVS|\\~|\\#|Debug|Release|\\.dll|\\.ilk|\\.idb|\\.pdb|\\.dsp|\\.dsw|\\.opt|\\.ncb|\\.vcproj|\\.sln|\\.suo|\\.cvsignore|\\.cnv|\\.res|\\.icu|\\.exe|\\.obj|\\.bin|\\.exp|\\.lib|\\.out|\\.plg|positions|unidata|\\.jar|\\.spp|\\.stub|\\.policy"; + +my $command = "find $icuSource -type f | fgrep -v -f cpyskip.txt"; +my @files = `$command`; +@files = grep(!/$ignore/, @files); +my $file; +foreach $file (@files) { + chomp $file; + my @lines = `head -n 20 "$file"`; + if (grep(/copyright.*(international|ibm)/i, @lines) == 0) { + print "$file\n"; + } +} diff --git a/icuSources/tools/cpysearch/cpysearch.pl b/icuSources/tools/cpysearch/cpysearch.pl index 5ae92c2f..c6405b5f 100644 --- a/icuSources/tools/cpysearch/cpysearch.pl +++ b/icuSources/tools/cpysearch/cpysearch.pl @@ -1,22 +1,25 @@ #!/usr/bin/perl -w -# ******************************************************************** +# *********************************************************************** # * COPYRIGHT: -# * Copyright (c) 2002, International Business Machines Corporation and -# * others. All Rights Reserved. -# ******************************************************************** +# * Copyright (c) 2002-2004, International Business Machines Corporation +# * and others. All Rights Reserved. +# *********************************************************************** use strict; -my $icuSource = "/icu/source"; -my $ignore = "CVS|\\~|\\#|Debug|Release|dsp|dsw|opt|ncb|cvsignore|cnv|res|\\.icu|exe|out|build|plg|positions|unidata"; +my $icuSource = $ARGV[0]; +my $ignore = "CVS|\\~|\\#|Debug|Release|\\.dll|\\.ilk|\\.idb|\\.pdb|\\.dsp|\\.dsw|\\.opt|\\.ncb|\\.vcproj|\\.sln|\\.suo|\\.cvsignore|\\.cnv|\\.res|\\.icu|\\.exe|\\.obj|\\.bin|\\.exp|\\.lib|\\.out|\\.plg|positions|unidata|\\.jar|\\.spp|\\.stub|\\.policy"; -my $command = "find $icuSource -type f"; -#my $command = "find $icuSource -type f\|grep -v \"$ignore\""; +my ($sec, $min, $hour, , $day, $mon, $year, $wday, $yday, $isdst) = localtime; +$year += 1900; + +my $command = "find $icuSource -type f -mtime -$yday | fgrep -v -f cpyskip.txt"; my @files = `$command`; @files = grep(!/$ignore/, @files); my $file; foreach $file (@files) { - my @lines = `head -n 10 $file`; - if (grep(/copyright/i, @lines) == 0) { - print "$file"; + chomp $file; + my @lines = `head -n 20 "$file"`; + if (grep(/copyright.*$year/i, @lines) == 0) { + print "$file\n"; } } diff --git a/icuSources/tools/cpysearch/cpyskip.txt b/icuSources/tools/cpysearch/cpyskip.txt new file mode 100644 index 00000000..76fb80cd --- /dev/null +++ b/icuSources/tools/cpysearch/cpyskip.txt @@ -0,0 +1,76 @@ +# Copyright (c) 2004 International Business Machines +# Corporation and others. All Rights Reserved. +# ICU4C files that don't need an IBM copyright +as_is/os400/configure +debian/changelog +debian/control +debian/icu-doc.doc-base +debian/icu.conffiles.in +source/config.guess +source/config.sub +source/configure +source/data/brkitr/thaidict.brk +source/extra/uconv/pkgdatain.txt +source/extra/uconv/samples/danish-ISO-8859-1.txt +source/extra/uconv/samples/eucJP.txt +source/extra/uconv/samples/hangul-eucKR.txt +source/extra/uconv/samples/hania-eucKR.txt +source/extra/uconv/samples/ISO-8859-2.txt +source/extra/uconv/samples/ISO-8859-3.txt +source/extra/uconv/samples/iso8859-1.txt +source/extra/uconv/samples/koi8r.txt +source/extra/uconv/samples/utf8/armenian.txt +source/extra/uconv/samples/utf8/banviet.txt +source/extra/uconv/samples/utf8/chinese-ulysses.txt +source/extra/uconv/samples/utf8/croat.txt +source/extra/uconv/samples/utf8/danish.txt +source/extra/uconv/samples/utf8/greek.txt +source/extra/uconv/samples/utf8/hangul.txt +source/extra/uconv/samples/utf8/hania.txt +source/extra/uconv/samples/utf8/jap.txt +source/extra/uconv/samples/utf8/korean.txt +source/extra/uconv/samples/utf8/linji.txt +source/extra/uconv/samples/utf8/many.txt +source/extra/uconv/samples/utf8/maopoem.txt +source/extra/uconv/samples/utf8/russian.txt +source/extra/uconv/samples/utf8/simplechinese.txt +source/extra/uconv/samples/utf8/turkish.txt +source/extra/uconv/samples/utf8/utf-8-demo.txt +source/install-sh +source/samples/layout/Sample.txt +source/samples/ucnv/data01.txt +source/samples/ufortune/resources/res-file-list.txt +source/test/testdata/CollationTest_NON_IGNORABLE_STUB.txt +source/test/testdata/CollationTest_SHIFTED_STUB.txt +source/test/testdata/re_tests.txt +source/test/testdata/riwords.txt +source/test/thaitest/space.txt +source/test/unalignedtest/unaligned.c +source/tools/gendraft/DeprecatedApi.txt +source/tools/gendraft/DraftApi.txt +source/tools/gendraft/ObsoleteApi.txt +source/tools/tzcode/patch-icu-tzcode +#ICU4JNI files that don't need an IBM copyright +src/classes/com/ibm/icu4jni/test/text/NormalizationTest.txt +src/native/converter/ConverterInterface.h +#ICU4J files that don't need an IBM copyright +src/com/ibm/icu/dev/data/holidays_jp.ucs +src/com/ibm/icu/dev/data/rbbi/english.dict +src/com/ibm/icu/dev/data/rbbi/words.txt +src/com/ibm/icu/dev/data/riwords.txt +src/com/ibm/icu/dev/data/thai6.ucs +src/com/ibm/icu/dev/data/ThaiWordFreq.xls +src/com/ibm/icu/dev/data/unicode/CompositionExclusions.txt +src/com/ibm/icu/dev/data/unicode/NormalizationCorrections.txt +src/com/ibm/icu/dev/data/unicode/NormalizationTest-3.2.0.txt +src/com/ibm/icu/dev/data/unicode/NormalizationTest.txt +src/com/ibm/icu/dev/data/unicode/SpecialCasing.txt +src/com/ibm/icu/dev/data/unicode/ucdterms.txt +src/com/ibm/icu/dev/data/unicode/UnicodeData.txt +src/com/ibm/icu/dev/tool/docs/icu4j28.api.gz +src/com/ibm/icu/dev/tool/docs/icu4j30.api.gz +src/com/ibm/icu/dev/tool/ime/indic/services/java.awt.im.spi.InputMethodDescriptor +src/com/ibm/icu/dev/tool/ime/translit/services/java.awt.im.spi.InputMethodDescriptor +src/com/ibm/icu/impl/data/th.brk +src/com/ibm/richtext/textapps/resources/unicode.arabic.red +src/com/ibm/richtext/textapps/resources/unicode.hebrew.red diff --git a/icuSources/tools/ctestfw/Makefile.in b/icuSources/tools/ctestfw/Makefile.in index 0e7a36eb..37a9434b 100644 --- a/icuSources/tools/ctestfw/Makefile.in +++ b/icuSources/tools/ctestfw/Makefile.in @@ -1,5 +1,5 @@ ## Makefile.in for ICU - tools/ctestfw -## Copyright (c) 1999-2003, International Business Machines Corporation and +## Copyright (c) 1999-2004, International Business Machines Corporation and ## others. All Rights Reserved. ## Stephen F. Booth @@ -15,20 +15,20 @@ include $(top_builddir)/icudefs.mk subdir = tools/ctestfw ## Extra files to remove for 'make clean' -CLEANFILES = *~ $(DEPS) $(ALL_TARGETS) +CLEANFILES = *~ $(DEPS) $(IMPORT_LIB) $(MIDDLE_IMPORT_LIB) $(FINAL_IMPORT_LIB) ## Target information ifneq ($(ENABLE_STATIC),) -TARGET = $(LIBICU)ctestfw$(ICULIBSUFFIX).a +TARGET = $(LIBSICU)$(CTESTFW_STUBNAME)$(ICULIBSUFFIX).$(A) endif -CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common -I$(top_srcdir)/i18n -I$(srcdir)/../toolutil +CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common -I$(srcdir) DEFS += -DT_CTEST_IMPLEMENTATION ifneq ($(ENABLE_SHARED),) -SO_TARGET = $(LIBICU)ctestfw$(ICULIBSUFFIX).$(SO) +SO_TARGET = $(LIBICU)$(CTESTFW_STUBNAME)$(ICULIBSUFFIX).$(SO) ALL_SO_TARGETS = $(SO_TARGET) $(MIDDLE_SO_TARGET) $(FINAL_SO_TARGET) endif @@ -38,9 +38,10 @@ DYNAMICCPPFLAGS = $(SHAREDLIBCPPFLAGS) DYNAMICCFLAGS = $(SHAREDLIBCFLAGS) DYNAMICCXXFLAGS = $(SHAREDLIBCXXFLAGS) -LIBS = $(DEFAULT_LIBS) +LDFLAGS += $(LDFLAGSCTESTFW) +LIBS = $(LIBICUUC) $(DEFAULT_LIBS) -OBJECTS = ctest.o +OBJECTS = ctest.o tstdtmod.o testdata.o datamap.o STATIC_OBJECTS = $(OBJECTS:.o=.$(STATIC_O)) @@ -83,7 +84,7 @@ dist-local: clean-local: test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES) - $(RMV) $(OBJECTS) $(STATIC_OBJECTS) $(ALL_TARGETS) + $(RMV) $(OBJECTS) $(STATIC_OBJECTS) $(ALL_TARGETS) distclean-local: clean-local $(RMV) Makefile diff --git a/icuSources/tools/ctestfw/ctest.c b/icuSources/tools/ctestfw/ctest.c index f2190d4e..f493be14 100644 --- a/icuSources/tools/ctestfw/ctest.c +++ b/icuSources/tools/ctestfw/ctest.c @@ -1,7 +1,7 @@ /* ***************************************************************************************** * -* Copyright (C) 1996-2003, International Business Machines +* Copyright (C) 1996-2004, International Business Machines * Corporation and others. All Rights Reserved. * ***************************************************************************************** @@ -12,6 +12,8 @@ #include <assert.h> #include <stdarg.h> +#include "unicode/utrace.h" + /* NOTES: 3/20/1999 srl - strncpy called w/o setting nulls at the end */ @@ -69,7 +71,6 @@ static void help ( const char *argv0 ); * @param ap vprintf style arg list */ static void vlog_err(const char *prefix, const char *pattern, va_list ap); -static void vlog_info(const char *prefix, const char *pattern, va_list ap); static void vlog_verbose(const char *prefix, const char *pattern, va_list ap); /* If we need to make the framework multi-thread safe @@ -85,6 +86,7 @@ int VERBOSITY = 0; /* be No-verbose by default */ int ERR_MSG =1; /* error messages will be displayed by default*/ int QUICK = 1; /* Skip some of the slower tests? */ int WARN_ON_MISSING_DATA = 0; /* Reduce data errs to warnings? */ +UTraceLevel ICU_TRACE = UTRACE_OFF; /* ICU tracing level */ /*-------------------------------------------*/ /* strncmp that also makes sure there's a \0 at s2[0] */ @@ -135,7 +137,9 @@ static TestNode *createTestNode( ) return newNode; } -void cleanUpTestTree(TestNode *tn) { +void T_CTEST_EXPORT2 +cleanUpTestTree(TestNode *tn) +{ if(tn->child != NULL) { cleanUpTestTree(tn->child); } @@ -147,9 +151,10 @@ void cleanUpTestTree(TestNode *tn) { } -void addTest ( TestNode** root, - TestFunctionPtr test, - const char* name ) +void T_CTEST_EXPORT2 +addTest(TestNode** root, + TestFunctionPtr test, + const char* name ) { TestNode *newNode; @@ -298,7 +303,8 @@ static void iterateTestsWithLevel ( const TestNode* root, -void showTests ( const TestNode *root ) +void T_CTEST_EXPORT2 +showTests ( const TestNode *root ) { /* make up one for them */ const TestNode *aList[MAXTESTS]; @@ -310,7 +316,8 @@ void showTests ( const TestNode *root ) } -void runTests ( const TestNode *root ) +void T_CTEST_EXPORT2 +runTests ( const TestNode *root ) { int i; const TestNode *aList[MAXTESTS]; @@ -347,7 +354,8 @@ void runTests ( const TestNode *root ) } } -const char* getTestName(void) +const char* T_CTEST_EXPORT2 +getTestName(void) { if(currentTest != NULL) { return currentTest->name; @@ -356,7 +364,8 @@ const char* getTestName(void) } } -const TestNode* getTest(const TestNode* root, const char* name) +const TestNode* T_CTEST_EXPORT2 +getTest(const TestNode* root, const char* name) { const char* nextName; TestNode *nextNode; @@ -427,7 +436,8 @@ static void vlog_err(const char *prefix, const char *pattern, va_list ap) va_end(ap); } -static void vlog_info(const char *prefix, const char *pattern, va_list ap) +void T_CTEST_EXPORT2 +vlog_info(const char *prefix, const char *pattern, va_list ap) { fprintf(stdout, "%-*s", INDENT_LEVEL," " ); if(prefix) { @@ -452,7 +462,8 @@ static void vlog_verbose(const char *prefix, const char *pattern, va_list ap) va_end(ap); } -void log_err(const char* pattern, ...) +void T_CTEST_EXPORT2 +log_err(const char* pattern, ...) { va_list ap; if(strchr(pattern, '\n') != NULL) { @@ -466,7 +477,8 @@ void log_err(const char* pattern, ...) vlog_err(NULL, pattern, ap); } -void log_info(const char* pattern, ...) +void T_CTEST_EXPORT2 +log_info(const char* pattern, ...) { va_list ap; @@ -474,7 +486,8 @@ void log_info(const char* pattern, ...) vlog_info(NULL, pattern, ap); } -void log_verbose(const char* pattern, ...) +void T_CTEST_EXPORT2 +log_verbose(const char* pattern, ...) { va_list ap; @@ -483,7 +496,8 @@ void log_verbose(const char* pattern, ...) } -void log_data_err(const char* pattern, ...) +void T_CTEST_EXPORT2 +log_data_err(const char* pattern, ...) { va_list ap; va_start(ap, pattern); @@ -502,7 +516,8 @@ void log_data_err(const char* pattern, ...) } -int processArgs(const TestNode* root, +int T_CTEST_EXPORT2 +processArgs(const TestNode* root, int argc, const char* const argv[]) { @@ -580,7 +595,22 @@ int processArgs(const TestNode* root, { subtreeOptionSeen=FALSE; } - else if (strcmp( argv[1], "-h" )==0 ) + else if (strcmp( argv[i], "-t_info") == 0) { + ICU_TRACE = UTRACE_INFO; + } + else if (strcmp( argv[i], "-t_error") == 0) { + ICU_TRACE = UTRACE_ERROR; + } + else if (strcmp( argv[i], "-t_warn") == 0) { + ICU_TRACE = UTRACE_WARNING; + } + else if (strcmp( argv[i], "-t_verbose") == 0) { + ICU_TRACE = UTRACE_VERBOSE; + } + else if (strcmp( argv[i], "-t_oc") == 0) { + ICU_TRACE = UTRACE_OPEN_CLOSE; + } + else if (strcmp( argv[i], "-h" )==0 || strcmp( argv[i], "--help" )==0) { help( argv[0] ); return 0; @@ -619,19 +649,22 @@ int processArgs(const TestNode* root, static void help ( const char *argv0 ) { - printf("Usage: %s [ -l ] [ -v ] [ -verbose] [-a] [ -all] [-n] \n [ -no_err_msg] [ -h ] [ /path/to/test ]\n", + printf("Usage: %s [ -l ] [ -v ] [ -verbose] [-a] [ -all] [-n] [ -no_err_msg]\n" + " [ -h ] [-t_info | -t_error | -t_warn | -t_oc | -t_verbose]" + " [ /path/to/test ]\n", argv0); - printf(" -l To get a list of test names\n"); - printf(" -e to do exhaustive testing\n"); + printf(" -l To get a list of test names\n"); + printf(" -e to do exhaustive testing\n"); printf(" -verbose To turn ON verbosity\n"); - printf(" -v To turn ON verbosity(same as -verbose)\n"); - printf(" -h To print this message\n"); - printf(" -n To turn OFF printing error messages\n"); - printf(" -w Don't fail on data-loading errs, just warn. Useful if\n" + printf(" -v To turn ON verbosity(same as -verbose)\n"); + printf(" -h To print this message\n"); + printf(" -n To turn OFF printing error messages\n"); + printf(" -w Don't fail on data-loading errs, just warn. Useful if\n" " user has reduced/changed the common set of ICU data \n"); + printf(" -t_info | -t_error | -t_warn | -t_oc | -t_verbose Enable ICU tracing\n"); printf(" -no_err_msg (same as -n) \n"); - printf(" -r repeat tests after calling u_cleanup \n"); - printf(" -[/subtest] To run a subtest \n"); + printf(" -r repeat tests after calling u_cleanup \n"); + printf(" -[/subtest] To run a subtest \n"); printf(" eg: to run just the utility tests type: cintltest /tsutil) \n"); } diff --git a/icuSources/tools/ctestfw/ctestfw.dsp b/icuSources/tools/ctestfw/ctestfw.dsp index 55832f9f..e5a4b884 100644 --- a/icuSources/tools/ctestfw/ctestfw.dsp +++ b/icuSources/tools/ctestfw/ctestfw.dsp @@ -45,7 +45,7 @@ RSC=rc.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CTESTFW_EXPORTS" /FD /c -# ADD CPP /nologo /G6 /MD /Za /W3 /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CTESTFW_EXPORTS" /D "T_CTEST_IMPLEMENTATION" /FD /c +# ADD CPP /nologo /G6 /MD /Za /W3 /GX /O2 /I "..\..\..\include" /I "..\..\common" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CTESTFW_EXPORTS" /D "T_CTEST_IMPLEMENTATION" /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" @@ -71,7 +71,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CTESTFW_EXPORTS" /FD /GZ /c -# ADD CPP /nologo /G6 /MDd /Za /W3 /Gm /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CTESTFW_EXPORTS" /D "T_CTEST_IMPLEMENTATION" /FR /FD /GZ /c +# ADD CPP /nologo /G6 /MDd /Za /W3 /Gm /GX /ZI /Od /I "..\..\..\include" /I "..\..\common" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CTESTFW_EXPORTS" /D "T_CTEST_IMPLEMENTATION" /FR /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" @@ -97,7 +97,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CTESTFW_EXPORTS" /FD /c -# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\..\include" /D "WIN64" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CTESTFW_EXPORTS" /D "T_CTEST_IMPLEMENTATION" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\..\include" /I "..\..\common" /D "WIN64" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CTESTFW_EXPORTS" /D "T_CTEST_IMPLEMENTATION" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win64 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win64 # ADD BASE RSC /l 0x409 /d "NDEBUG" @@ -107,7 +107,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:IX86 /machine:IA64 -# ADD LINK32 /nologo /dll /machine:IA64 /out:"..\..\..\bin\ctestfw.dll" +# ADD LINK32 /nologo /dll /machine:IX86 /out:"..\..\..\bin\ctestfw.dll" /machine:IA64 !ELSEIF "$(CFG)" == "ctestfw - Win64 Debug" @@ -123,7 +123,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CTESTFW_EXPORTS" /FD /GZ /c -# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\..\include" /D "WIN64" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CTESTFW_EXPORTS" /D "T_CTEST_IMPLEMENTATION" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\..\include" /I "..\..\common" /D "WIN64" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CTESTFW_EXPORTS" /D "T_CTEST_IMPLEMENTATION" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /Wp64 /Zm600 /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win64 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win64 # ADD BASE RSC /l 0x409 /d "_DEBUG" @@ -133,7 +133,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:IX86 /pdbtype:sept /machine:IA64 -# ADD LINK32 /nologo /dll /incremental:no /debug /machine:IA64 /out:"..\..\..\bin\ctestfwd.dll" /pdbtype:sept +# ADD LINK32 /nologo /dll /incremental:no /debug /machine:IX86 /out:"..\..\..\bin\ctestfwd.dll" /pdbtype:sept /machine:IA64 !ENDIF @@ -150,6 +150,18 @@ LINK32=link.exe SOURCE=.\ctest.c # End Source File +# Begin Source File + +SOURCE=.\datamap.cpp +# End Source File +# Begin Source File + +SOURCE=.\testdata.cpp +# End Source File +# Begin Source File + +SOURCE=.\tstdtmod.cpp +# End Source File # End Group # Begin Group "Header Files" @@ -157,49 +169,26 @@ SOURCE=.\ctest.c # Begin Source File SOURCE=.\unicode\ctest.h +# End Source File +# Begin Source File -!IF "$(CFG)" == "ctestfw - Win32 Release" - -# Begin Custom Build -InputPath=.\unicode\ctest.h - -"..\..\..\include\unicode\ctest.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - copy $(InputPath) ..\..\..\include\unicode - -# End Custom Build - -!ELSEIF "$(CFG)" == "ctestfw - Win32 Debug" - -# Begin Custom Build -InputPath=.\unicode\ctest.h - -"..\..\..\include\unicode\ctest.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - copy $(InputPath) ..\..\..\include\unicode - -# End Custom Build - -!ELSEIF "$(CFG)" == "ctestfw - Win64 Release" - -# Begin Custom Build -InputPath=.\unicode\ctest.h - -"..\..\..\include\unicode\ctest.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - copy $(InputPath) ..\..\..\include\unicode - -# End Custom Build - -!ELSEIF "$(CFG)" == "ctestfw - Win64 Debug" - -# Begin Custom Build -InputPath=.\unicode\ctest.h +SOURCE=.\unicode\datamap.h +# End Source File +# Begin Source File -"..\..\..\include\unicode\ctest.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - copy $(InputPath) ..\..\..\include\unicode +SOURCE=.\unicode\testdata.h +# End Source File +# Begin Source File -# End Custom Build +SOURCE=.\unicode\testlog.h +# End Source File +# Begin Source File -!ENDIF +SOURCE=.\unicode\testtype.h +# End Source File +# Begin Source File +SOURCE=.\unicode\tstdtmod.h # End Source File # End Group # Begin Group "Resource Files" diff --git a/icuSources/tools/ctestfw/ctestfw.vcproj b/icuSources/tools/ctestfw/ctestfw.vcproj index a4e8fd1c..63a65e8f 100644 --- a/icuSources/tools/ctestfw/ctestfw.vcproj +++ b/icuSources/tools/ctestfw/ctestfw.vcproj @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding = "Windows-1252"?> +<?xml version="1.0" encoding="Windows-1252"?> <VisualStudioProject ProjectType="Visual C++" - Version="7.00" + Version="7.10" Name="ctestfw" SccProjectName="" SccLocalPath=""> @@ -22,13 +22,13 @@ Name="VCCLCompilerTool" InlineFunctionExpansion="2" ImproveFloatingPointConsistency="TRUE" - AdditionalIncludeDirectories="..\..\..\include" + AdditionalIncludeDirectories="..\..\..\include,..\..\common" PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;CTESTFW_EXPORTS;T_CTEST_IMPLEMENTATION" StringPooling="TRUE" RuntimeLibrary="2" EnableFunctionLevelLinking="TRUE" DisableLanguageExtensions="TRUE" - PrecompiledHeaderFile=".\Release/ctestfw.pch" + PrecompiledHeaderFile=".\Release/icutest.pch" AssemblerListingLocation=".\Release/" ObjectFile=".\Release/" ProgramDataBaseFileName=".\Release/" @@ -40,19 +40,18 @@ <Tool Name="VCLinkerTool" AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="odbc32.lib odbccp32.lib" - OutputFile="..\..\..\bin\ctestfw.dll" + OutputFile="..\..\..\bin\icutest.dll" LinkIncremental="1" SuppressStartupBanner="TRUE" - ProgramDatabaseFile=".\..\..\..\lib/ctestfw.pdb" - ImportLibrary=".\..\..\..\lib/ctestfw.lib"/> + ProgramDatabaseFile=".\..\..\..\lib\icutest.pdb" + ImportLibrary=".\..\..\..\lib\icutest.lib"/> <Tool Name="VCMIDLTool" PreprocessorDefinitions="NDEBUG" MkTypLibCompatible="TRUE" SuppressStartupBanner="TRUE" TargetEnvironment="1" - TypeLibraryName=".\..\..\..\lib/ctestfw.tlb"/> + TypeLibraryName=".\..\..\..\lib\icutest.tlb"/> <Tool Name="VCPostBuildEventTool"/> <Tool @@ -65,8 +64,14 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> <Configuration Name="Debug|Win32" @@ -81,12 +86,12 @@ Optimization="0" ImproveFloatingPointConsistency="TRUE" OptimizeForProcessor="2" - AdditionalIncludeDirectories="..\..\..\include" + AdditionalIncludeDirectories="..\..\..\include,..\..\common" PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;CTESTFW_EXPORTS;T_CTEST_IMPLEMENTATION" BasicRuntimeChecks="3" RuntimeLibrary="3" DisableLanguageExtensions="TRUE" - PrecompiledHeaderFile=".\Debug/ctestfw.pch" + PrecompiledHeaderFile=".\Debug/icutest.pch" AssemblerListingLocation=".\Debug/" ObjectFile=".\Debug/" ProgramDataBaseFileName=".\Debug/" @@ -100,20 +105,19 @@ <Tool Name="VCLinkerTool" AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="odbc32.lib odbccp32.lib" - OutputFile="..\..\..\bin\ctestfwd.dll" + OutputFile="..\..\..\bin\icutestd.dll" LinkIncremental="2" SuppressStartupBanner="TRUE" GenerateDebugInformation="TRUE" - ProgramDatabaseFile=".\..\..\..\lib/ctestfwd.pdb" - ImportLibrary=".\..\..\..\lib/ctestfwd.lib"/> + ProgramDatabaseFile=".\..\..\..\lib\icutestd.pdb" + ImportLibrary=".\..\..\..\lib\icutestd.lib"/> <Tool Name="VCMIDLTool" PreprocessorDefinitions="_DEBUG" MkTypLibCompatible="TRUE" SuppressStartupBanner="TRUE" TargetEnvironment="1" - TypeLibraryName=".\..\..\..\lib/ctestfw.tlb"/> + TypeLibraryName=".\..\..\..\lib\icutestd.tlb"/> <Tool Name="VCPostBuildEventTool"/> <Tool @@ -126,10 +130,18 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> </Configurations> + <References> + </References> <Files> <Filter Name="Source Files" @@ -137,28 +149,36 @@ <File RelativePath=".\ctest.c"> </File> + <File + RelativePath=".\datamap.cpp"> + </File> + <File + RelativePath=".\testdata.cpp"> + </File> + <File + RelativePath=".\tstdtmod.cpp"> + </File> </Filter> <Filter Name="Header Files" Filter="h;hpp;hxx;hm;inl"> <File RelativePath=".\unicode\ctest.h"> - <FileConfiguration - Name="Release|Win32"> - <Tool - Name="VCCustomBuildTool" - CommandLine="copy $(InputPath) ..\..\..\include\unicode -" - Outputs="..\..\..\include\unicode\ctest.h"/> - </FileConfiguration> - <FileConfiguration - Name="Debug|Win32"> - <Tool - Name="VCCustomBuildTool" - CommandLine="copy $(InputPath) ..\..\..\include\unicode -" - Outputs="..\..\..\include\unicode\ctest.h"/> - </FileConfiguration> + </File> + <File + RelativePath=".\unicode\datamap.h"> + </File> + <File + RelativePath=".\unicode\testdata.h"> + </File> + <File + RelativePath=".\unicode\testlog.h"> + </File> + <File + RelativePath=".\unicode\testtype.h"> + </File> + <File + RelativePath=".\unicode\tstdtmod.h"> </File> </Filter> <Filter diff --git a/icuSources/test/intltest/datamap.cpp b/icuSources/tools/ctestfw/datamap.cpp similarity index 67% rename from icuSources/test/intltest/datamap.cpp rename to icuSources/tools/ctestfw/datamap.cpp index 4eff1f89..30da4500 100644 --- a/icuSources/test/intltest/datamap.cpp +++ b/icuSources/tools/ctestfw/datamap.cpp @@ -1,13 +1,14 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 2002-2003, International Business Machines Corporation and + * Copyright (c) 2002-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /* Created by weiv 05/09/2002 */ -#include "datamap.h" +#include "unicode/datamap.h" #include "unicode/resbund.h" +#include "hash.h" #include <stdlib.h> int32_t @@ -93,38 +94,96 @@ void RBDataMap::init(UResourceBundle *headers, UResourceBundle *data, UErrorCode ures_close(t); } - -const UnicodeString RBDataMap::getString(const char* key, UErrorCode &status) const +const ResourceBundle *RBDataMap::getItem(const char* key, UErrorCode &status) const { + if(U_FAILURE(status)) { + return NULL; + } + UnicodeString hashKey(key, ""); - ResourceBundle *r = (ResourceBundle *)fData->get(hashKey); + const ResourceBundle *r = (ResourceBundle *)fData->get(hashKey); if(r != NULL) { + return r; + } else { + status = U_MISSING_RESOURCE_ERROR; + return NULL; + } +} + +const UnicodeString RBDataMap::getString(const char* key, UErrorCode &status) const +{ + const ResourceBundle *r = getItem(key, status); + if(U_SUCCESS(status)) { return r->getString(status); } else { status = U_MISSING_RESOURCE_ERROR; - return UnicodeString("", ""); + return UnicodeString(); + } +} + +int32_t +RBDataMap::getInt28(const char* key, UErrorCode &status) const +{ + const ResourceBundle *r = getItem(key, status); + if(U_SUCCESS(status)) { + return r->getInt(status); + } else { + return 0; + } +} + +uint32_t +RBDataMap::getUInt28(const char* key, UErrorCode &status) const +{ + const ResourceBundle *r = getItem(key, status); + if(U_SUCCESS(status)) { + return r->getUInt(status); + } else { + return 0; } } +const int32_t * +RBDataMap::getIntVector(int32_t &length, const char *key, UErrorCode &status) const { + const ResourceBundle *r = getItem(key, status); + if(U_SUCCESS(status)) { + return r->getIntVector(length, status); + } else { + return NULL; + } +} + +const uint8_t * +RBDataMap::getBinary(int32_t &length, const char *key, UErrorCode &status) const { + const ResourceBundle *r = getItem(key, status); + if(U_SUCCESS(status)) { + return r->getBinary(length, status); + } else { + return NULL; + } +} int32_t RBDataMap::getInt(const char* key, UErrorCode &status) const { - int32_t result = 0; UnicodeString r = this->getString(key, status); if(U_SUCCESS(status)) { - result = utoi(r); + return utoi(r); + } else { + return 0; } - return result; } const UnicodeString* RBDataMap::getStringArray(int32_t& count, const char* key, UErrorCode &status) const { - UnicodeString hashKey(key, ""); - ResourceBundle *r = (ResourceBundle *)fData->get(hashKey); - if(r != NULL) { + const ResourceBundle *r = getItem(key, status); + if(U_SUCCESS(status)) { int32_t i = 0; count = r->getSize(); + if(count <= 0) { + return NULL; + } + UnicodeString *result = new UnicodeString[count]; for(i = 0; i<count; i++) { result[i] = r->getStringEx(i, status); @@ -138,12 +197,15 @@ const UnicodeString* RBDataMap::getStringArray(int32_t& count, const char* key, const int32_t* RBDataMap::getIntArray(int32_t& count, const char* key, UErrorCode &status) const { - UnicodeString hashKey(key, ""); - ResourceBundle *r = (ResourceBundle *)fData->get(hashKey); - if(r != NULL) { + const ResourceBundle *r = getItem(key, status); + if(U_SUCCESS(status)) { int32_t i = 0; count = r->getSize(); + if(count <= 0) { + return NULL; + } + int32_t *result = new int32_t[count]; UnicodeString stringRes; for(i = 0; i<count; i++) { @@ -156,5 +218,3 @@ const int32_t* RBDataMap::getIntArray(int32_t& count, const char* key, UErrorCod return NULL; } } - - diff --git a/icuSources/test/intltest/testdata.cpp b/icuSources/tools/ctestfw/testdata.cpp similarity index 96% rename from icuSources/test/intltest/testdata.cpp rename to icuSources/tools/ctestfw/testdata.cpp index 94499bd0..68a5b535 100644 --- a/icuSources/test/intltest/testdata.cpp +++ b/icuSources/tools/ctestfw/testdata.cpp @@ -1,12 +1,12 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 2002, International Business Machines Corporation and + * Copyright (c) 2002-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /* Created by weiv 05/09/2002 */ -#include "testdata.h" +#include "unicode/testdata.h" TestData::TestData(const char* name) : name(name), diff --git a/icuSources/test/intltest/tstdtmod.cpp b/icuSources/tools/ctestfw/tstdtmod.cpp similarity index 95% rename from icuSources/test/intltest/tstdtmod.cpp rename to icuSources/tools/ctestfw/tstdtmod.cpp index 2eeb3143..6846680a 100644 --- a/icuSources/test/intltest/tstdtmod.cpp +++ b/icuSources/tools/ctestfw/tstdtmod.cpp @@ -1,12 +1,12 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 2002, International Business Machines Corporation and + * Copyright (c) 2002-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /* Created by weiv 05/09/2002 */ -#include "tstdtmod.h" +#include "unicode/tstdtmod.h" #include "cmemory.h" TestDataModule *TestDataModule::getTestDataModule(const char* name, TestLog& log, UErrorCode &status) @@ -152,8 +152,7 @@ RBTestDataModule::getTestBundle(const char* bundleName, UErrorCode &status) { if(U_SUCCESS(status)) { UResourceBundle *testBundle = NULL; - //const char* icu_data = (char*)loadTestData(status); - const char* icu_data = IntlTest::loadTestData(status); + const char* icu_data = fLog.getTestDataPath(status); if (testBundle == NULL) { testBundle = ures_openDirect(icu_data, bundleName, &status); if (status != U_ZERO_ERROR) { diff --git a/icuSources/tools/ctestfw/unicode/ctest.h b/icuSources/tools/ctestfw/unicode/ctest.h index 7d554b4c..9c2f04c5 100644 --- a/icuSources/tools/ctestfw/unicode/ctest.h +++ b/icuSources/tools/ctestfw/unicode/ctest.h @@ -1,59 +1,25 @@ /* -***************************************************************************************** +******************************************************************************** * -* Copyright (C) 1996-2000, International Business Machines +* Copyright (C) 1996-2004, International Business Machines * Corporation and others. All Rights Reserved. * -***************************************************************************************** +******************************************************************************** */ - #ifndef CTEST_H #define CTEST_H -#include "unicode/utypes.h" - -/*Deals with imports and exports of the dynamic library*/ -#if defined(_WIN32) || defined(U_CYGWIN) - #define T_CTEST_EXPORT __declspec(dllexport) - #define T_CTEST_IMPORT __declspec(dllimport) -#else - #define T_CTEST_EXPORT - #define T_CTEST_IMPORT -#endif - -#ifdef __cplusplus - #define C_CTEST_API extern "C" -#else - #define C_CTEST_API -#endif - -#ifdef T_CTEST_IMPLEMENTATION - #define T_CTEST_API C_CTEST_API T_CTEST_EXPORT - #define T_CTEST_EXPORT_API T_CTEST_EXPORT -#else - #define T_CTEST_API C_CTEST_API T_CTEST_IMPORT - #define T_CTEST_EXPORT_API T_CTEST_IMPORT -#endif - - - -/* True and false for sanity. (removes ICU dependancy) */ - -#ifndef FALSE -#define FALSE 0 -#endif -#ifndef TRUE -#define TRUE 1 -#endif - - +#include "unicode/testtype.h" +#include "unicode/utrace.h" /* prototypes *********************************/ -typedef void (*TestFunctionPtr)(void); +U_CDECL_BEGIN +typedef void (U_CALLCONV *TestFunctionPtr)(void); typedef struct TestNode TestNode; +U_CDECL_END /** * Set this to zero to disable log_verbose() messages. @@ -61,7 +27,7 @@ typedef struct TestNode TestNode; * * @internal Internal APIs for testing purpose only */ -T_CTEST_EXPORT_API extern int REPEAT_TESTS; +extern T_CTEST_EXPORT_API int REPEAT_TESTS; /** * Set this to zero to disable log_verbose() messages. @@ -69,7 +35,7 @@ T_CTEST_EXPORT_API extern int REPEAT_TESTS; * * @internal Internal APIs for testing purpose only */ -T_CTEST_EXPORT_API extern int VERBOSITY; +extern T_CTEST_EXPORT_API int VERBOSITY; /** * Set this to zero to disable log_verbose() messages. @@ -77,7 +43,7 @@ T_CTEST_EXPORT_API extern int VERBOSITY; * * @internal Internal APIs for testing purpose only */ -T_CTEST_EXPORT_API extern int ERR_MSG; +extern T_CTEST_EXPORT_API int ERR_MSG; /** * Set this to zero to disable some of the slower tests. @@ -85,7 +51,7 @@ T_CTEST_EXPORT_API extern int ERR_MSG; * * @internal Internal APIs for testing purpose only */ -T_CTEST_EXPORT_API extern int QUICK; +extern T_CTEST_EXPORT_API int QUICK; /** * Set this to nonzero to warn (not error) on missing data. @@ -95,7 +61,14 @@ T_CTEST_EXPORT_API extern int QUICK; * @see log_data_err * @internal Internal APIs for testing purpose only */ -T_CTEST_EXPORT_API extern int WARN_ON_MISSING_DATA; +extern T_CTEST_EXPORT_API int WARN_ON_MISSING_DATA; + +/** + * ICU tracing level, is set by command line option + * + * @internal + */ +extern T_CTEST_EXPORT_API UTraceLevel ICU_TRACE; /** * Show the names of all nodes. @@ -103,7 +76,8 @@ T_CTEST_EXPORT_API extern int WARN_ON_MISSING_DATA; * @param root Subtree of tests. * @internal Internal APIs for testing purpose only */ -T_CTEST_API void showTests ( const TestNode *root); +T_CTEST_API void T_CTEST_EXPORT2 +showTests ( const TestNode *root); /** * Run a subtree of tests. @@ -111,7 +85,8 @@ T_CTEST_API void showTests ( const TestNode *root); * @param root Subtree of tests. * @internal Internal APIs for testing purpose only */ -T_CTEST_API void runTests ( const TestNode* root); +T_CTEST_API void T_CTEST_EXPORT2 +runTests ( const TestNode* root); /** * Add a test to the subtree. @@ -125,11 +100,19 @@ T_CTEST_API void runTests ( const TestNode* root); * @param path Path from root under which test will be placed. Ex. '/a/b/mytest' * @internal Internal APIs for testing purpose only */ -T_CTEST_API void addTest ( TestNode** root, - TestFunctionPtr test, - const char *path); +T_CTEST_API void T_CTEST_EXPORT2 +addTest(TestNode** root, + TestFunctionPtr test, + const char *path); -T_CTEST_API void cleanUpTestTree(TestNode *tn); +/** + * Clean up any allocated memory. + * Conditions for calling this function are the same as u_cleanup(). + * @see u_cleanup + * @internal Internal APIs for testing purpose only + */ +T_CTEST_API void T_CTEST_EXPORT2 +cleanUpTestTree(TestNode *tn); /** * Retreive a specific subtest. (subtree). @@ -139,8 +122,9 @@ T_CTEST_API void cleanUpTestTree(TestNode *tn); * @return The subtest, or NULL on failure. * @internal Internal APIs for testing purpose only */ -T_CTEST_API const TestNode* getTest (const TestNode* root, - const char *path); +T_CTEST_API const TestNode* T_CTEST_EXPORT2 +getTest(const TestNode* root, + const char *path); /** @@ -148,14 +132,26 @@ T_CTEST_API const TestNode* getTest (const TestNode* root, * @param pattern printf-style format string * @internal Internal APIs for testing purpose only */ -T_CTEST_API void log_err(const char* pattern, ...); +T_CTEST_API void T_CTEST_EXPORT2 +log_err(const char* pattern, ...); /** * Log an informational message. (printf style) * @param pattern printf-style format string * @internal Internal APIs for testing purpose only */ -T_CTEST_API void log_info(const char* pattern, ...); +T_CTEST_API void T_CTEST_EXPORT2 +log_info(const char* pattern, ...); + +/** + * Log an informational message. (vprintf style) + * @param prefix a string that is output before the pattern and without formatting + * @param pattern printf-style format string + * @param ap variable-arguments list + * @internal Internal APIs for testing purpose only + */ +T_CTEST_API void T_CTEST_EXPORT2 +vlog_info(const char *prefix, const char *pattern, va_list ap); /** * Log a verbose informational message. (printf style) @@ -163,7 +159,8 @@ T_CTEST_API void log_info(const char* pattern, ...); * @param pattern printf-style format string * @internal Internal APIs for testing purpose only */ -T_CTEST_API void log_verbose(const char* pattern, ...); +T_CTEST_API void T_CTEST_EXPORT2 +log_verbose(const char* pattern, ...); /** * Log an error message concerning missing data. (printf style) @@ -172,7 +169,8 @@ T_CTEST_API void log_verbose(const char* pattern, ...); * @param pattern printf-style format string * @internal Internal APIs for testing purpose only */ -T_CTEST_API void log_data_err(const char *pattern, ...); +T_CTEST_API void T_CTEST_EXPORT2 +log_data_err(const char *pattern, ...); /** * Processes the command line arguments. @@ -187,14 +185,14 @@ T_CTEST_API void log_data_err(const char *pattern, ...); * @return positive for error count, 0 for success, negative for illegal argument * @internal Internal APIs for testing purpose only */ - -T_CTEST_API int processArgs(const TestNode* root, - int argc, - const char* const argv[]); +T_CTEST_API int T_CTEST_EXPORT2 +processArgs(const TestNode* root, + int argc, + const char* const argv[]); -T_CTEST_API -const char* getTestName(void); +T_CTEST_API const char* T_CTEST_EXPORT2 +getTestName(void); diff --git a/icuSources/test/intltest/datamap.h b/icuSources/tools/ctestfw/unicode/datamap.h similarity index 54% rename from icuSources/test/intltest/datamap.h rename to icuSources/tools/ctestfw/unicode/datamap.h index 7bd0b3d0..bd812796 100644 --- a/icuSources/test/intltest/datamap.h +++ b/icuSources/tools/ctestfw/unicode/datamap.h @@ -1,16 +1,20 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 2002-2003, International Business Machines Corporation and + * Copyright (c) 2002-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /* Created by weiv 05/09/2002 */ -#ifndef INTLTST_DATAMAP -#define INTLTST_DATAMAP +#ifndef U_TESTFW_DATAMAP +#define U_TESTFW_DATAMAP -#include "hash.h" -#include "unicode/ures.h" +#include "unicode/resbund.h" +#include "unicode/testtype.h" + +U_NAMESPACE_BEGIN +class Hashtable; +U_NAMESPACE_END /** Holder of test data and settings. Allows addressing of items by name. * For test cases, names are defined in the "Headers" section. For settings @@ -18,7 +22,7 @@ * and integers and arrays of strings and integers. Arrays should be deposited * of by the user. */ -class DataMap { +class T_CTEST_EXPORT_API DataMap { public: virtual ~DataMap() {}; @@ -35,20 +39,55 @@ public: virtual const UnicodeString getString(const char* key, UErrorCode &status) const = 0; /** get the string from the DataMap. Addressed by name + * parses a bundle string into an integer * @param key name of the data field. * @return an integer containing the data */ virtual int32_t getInt(const char* key, UErrorCode &status) const = 0; - + + /** + * Get a signed integer without runtime parsing. + * @param key name of the data field. + * @param status UErrorCode in/out parameter + * @return the integer + */ + virtual int32_t getInt28(const char* key, UErrorCode &status) const = 0; + + /** + * Get an unsigned integer without runtime parsing. + * @param key name of the data field. + * @param status UErrorCode in/out parameter + * @return the integer + */ + virtual uint32_t getUInt28(const char* key, UErrorCode &status) const = 0; + + /** + * Get a vector of integers without runtime parsing. + * @param length output parameter for the length of the vector + * @param key name of the data field. + * @param status UErrorCode in/out parameter + * @return the integer vector, do not delete + */ + virtual const int32_t *getIntVector(int32_t &length, const char *key, UErrorCode &status) const = 0; + + /** + * Get binary data without runtime parsing. + * @param length output parameter for the length of the data + * @param key name of the data field. + * @param status UErrorCode in/out parameter + * @return the binary data, do not delete + */ + virtual const uint8_t *getBinary(int32_t &length, const char *key, UErrorCode &status) const = 0; + /** get an array of strings from the DataMap. Addressed by name. - * The user must dispose of it after usage. + * The user must dispose of it after usage, using delete. * @param key name of the data field. * @return a string array containing the data */ virtual const UnicodeString* getStringArray(int32_t& count, const char* key, UErrorCode &status) const = 0; /** get an array of integers from the DataMap. Addressed by name. - * The user must dispose of it after usage. + * The user must dispose of it after usage, using delete. * @param key name of the data field. * @return an integer array containing the data */ @@ -59,7 +98,7 @@ public: // This one is already concrete - it is going to be instantiated from // concrete data by TestData children... -class RBDataMap : public DataMap{ +class T_CTEST_EXPORT_API RBDataMap : public DataMap{ private: Hashtable *fData; @@ -75,8 +114,15 @@ public: public: void init(UResourceBundle *data, UErrorCode &status); void init(UResourceBundle *headers, UResourceBundle *data, UErrorCode &status); - + + virtual const ResourceBundle *getItem(const char* key, UErrorCode &status) const; + virtual const UnicodeString getString(const char* key, UErrorCode &status) const; + virtual int32_t getInt28(const char* key, UErrorCode &status) const; + virtual uint32_t getUInt28(const char* key, UErrorCode &status) const; + virtual const int32_t *getIntVector(int32_t &length, const char *key, UErrorCode &status) const; + virtual const uint8_t *getBinary(int32_t &length, const char *key, UErrorCode &status) const; + virtual int32_t getInt(const char* key, UErrorCode &status) const; virtual const UnicodeString* getStringArray(int32_t& count, const char* key, UErrorCode &status) const; diff --git a/icuSources/test/intltest/testdata.h b/icuSources/tools/ctestfw/unicode/testdata.h similarity index 93% rename from icuSources/test/intltest/testdata.h rename to icuSources/tools/ctestfw/unicode/testdata.h index 8f3a9219..ef9e73e3 100644 --- a/icuSources/test/intltest/testdata.h +++ b/icuSources/tools/ctestfw/unicode/testdata.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 2002, International Business Machines Corporation and + * Copyright (c) 2002-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -8,11 +8,11 @@ /* Base class for data driven tests */ -#ifndef INTLTST_TESTDATA -#define INTLTST_TESTDATA +#ifndef U_TESTFW_TESTDATA +#define U_TESTFW_TESTDATA -#include "tstdtmod.h" -#include "datamap.h" +#include "unicode/tstdtmod.h" +#include "unicode/datamap.h" /** This is the class that abstracts one of the tests in a data file * It is usually instantiated using TestDataModule::CreateTestData method @@ -34,7 +34,7 @@ * } */ -class TestData { +class T_CTEST_EXPORT_API TestData { const char* name; protected: @@ -83,7 +83,7 @@ public: // implementation of TestData that uses resource bundles -class RBTestData : public TestData { +class T_CTEST_EXPORT_API RBTestData : public TestData { UResourceBundle *fData; UResourceBundle *fHeaders; UResourceBundle *fSettings; diff --git a/icuSources/tools/ctestfw/unicode/testlog.h b/icuSources/tools/ctestfw/unicode/testlog.h new file mode 100644 index 00000000..83abd597 --- /dev/null +++ b/icuSources/tools/ctestfw/unicode/testlog.h @@ -0,0 +1,27 @@ +/******************************************************************** + * COPYRIGHT: + * Copyright (c) 2004, International Business Machines Corporation and + * others. All Rights Reserved. + ********************************************************************/ + +/* Created by grhoten 03/17/2004 */ + +/* Base class for data driven tests */ + +#ifndef U_TESTFW_TESTLOG +#define U_TESTFW_TESTLOG + +#include "unicode/unistr.h" + +/** Facilitates internal logging of data driven test service + * It would be interesting to develop this into a full + * fledged control system as in Java. + */ +class TestLog { +public: + virtual void errln( const UnicodeString &message ) = 0; + virtual const char* getTestDataPath(UErrorCode& err) = 0; +}; + + +#endif diff --git a/icuSources/tools/ctestfw/unicode/testtype.h b/icuSources/tools/ctestfw/unicode/testtype.h new file mode 100644 index 00000000..b89bcd2c --- /dev/null +++ b/icuSources/tools/ctestfw/unicode/testtype.h @@ -0,0 +1,40 @@ +/* +***************************************************************************************** +* +* Copyright (C) 2004-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +***************************************************************************************** +*/ + +#include "unicode/utypes.h" + +/*Deals with imports and exports of the dynamic library*/ +#if !defined(U_STATIC_IMPLEMENTATION) && (defined(_WIN32) || defined(U_CYGWIN)) + #define T_CTEST_EXPORT __declspec(dllexport) + #define T_CTEST_IMPORT __declspec(dllimport) +#else + #define T_CTEST_EXPORT + #define T_CTEST_IMPORT +#endif + +#if defined(_WIN32) +#define T_CTEST_EXPORT2 __cdecl +#else +#define T_CTEST_EXPORT2 +#endif + +#ifdef __cplusplus + #define C_CTEST_API extern "C" +#else + #define C_CTEST_API +#endif + +#ifdef T_CTEST_IMPLEMENTATION + #define T_CTEST_API C_CTEST_API T_CTEST_EXPORT + #define T_CTEST_EXPORT_API T_CTEST_EXPORT +#else + #define T_CTEST_API C_CTEST_API T_CTEST_IMPORT + #define T_CTEST_EXPORT_API T_CTEST_IMPORT +#endif + diff --git a/icuSources/test/intltest/tstdtmod.h b/icuSources/tools/ctestfw/unicode/tstdtmod.h similarity index 87% rename from icuSources/test/intltest/tstdtmod.h rename to icuSources/tools/ctestfw/unicode/tstdtmod.h index a33ec18e..77def6b6 100644 --- a/icuSources/test/intltest/tstdtmod.h +++ b/icuSources/tools/ctestfw/unicode/tstdtmod.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 2002, International Business Machines Corporation and + * Copyright (c) 2002-2004, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -8,15 +8,15 @@ /* Base class for data driven tests */ -#ifndef INTLTST_TESTMODULE -#define INTLTST_TESTMODULE +#ifndef U_TESTFW_TESTMODULE +#define U_TESTFW_TESTMODULE -#include "unicode/utypes.h" #include "unicode/unistr.h" -#include "intltest.h" #include "unicode/ures.h" -#include "testdata.h" -#include "datamap.h" +#include "unicode/testtype.h" +#include "unicode/testdata.h" +#include "unicode/datamap.h" +#include "unicode/testlog.h" /* This class abstracts the actual organization of the * data for data driven tests @@ -26,19 +26,12 @@ class DataMap; class TestData; -/** Facilitates internal logging of data driven test service - * It would be interesting to develop this into a full - * fledged control system as in Java. - */ -class TestLog : public IntlTest{ -}; - /** Main data driven test class. Corresponds to one named data * unit (such as a resource bundle. It is instantiated using * a factory method getTestDataModule */ -class TestDataModule { +class T_CTEST_EXPORT_API TestDataModule { const char* testName; protected: @@ -88,7 +81,7 @@ public: virtual TestData* createTestData(const char* name, UErrorCode &status) const = 0; }; -class RBTestDataModule : public TestDataModule { +class T_CTEST_EXPORT_API RBTestDataModule : public TestDataModule { public: virtual ~RBTestDataModule(); diff --git a/icuSources/tools/dumpce/dumpce.cpp b/icuSources/tools/dumpce/dumpce.cpp index 7e178d6c..17d9c254 100644 --- a/icuSources/tools/dumpce/dumpce.cpp +++ b/icuSources/tools/dumpce/dumpce.cpp @@ -73,7 +73,7 @@ static FILE *OUTPUT_; static UColAttributeValue ATTRIBUTE_[UCOL_ATTRIBUTE_COUNT] = { UCOL_DEFAULT, UCOL_DEFAULT, UCOL_DEFAULT, UCOL_DEFAULT, UCOL_DEFAULT, - UCOL_DEFAULT, UCOL_DEFAULT + UCOL_DEFAULT, UCOL_DEFAULT, UCOL_DEFAULT, }; typedef struct { @@ -90,6 +90,7 @@ static const EnumNameValuePair ATTRIBUTE_NAME_[] = { "UCOL_NORMALIZATION_MODE|UCOL_DECOMPOSITION_MODE"}, {UCOL_STRENGTH, "UCOL_STRENGTH"}, {UCOL_HIRAGANA_QUATERNARY_MODE, "UCOL_HIRAGANA_QUATERNARY_MODE"}, + {UCOL_NUMERIC_COLLATION, "UCOL_NUMERIC_COLLATION"}, NULL }; diff --git a/icuSources/tools/genbrk/Makefile.in b/icuSources/tools/genbrk/Makefile.in index 00820143..489e70a9 100644 --- a/icuSources/tools/genbrk/Makefile.in +++ b/icuSources/tools/genbrk/Makefile.in @@ -1,5 +1,5 @@ ## Makefile.in for ICU - tools/genbrk -## Copyright (c) 2002-2003 International Business Machines Corporation and +## Copyright (c) 2002-2004 International Business Machines Corporation and ## others. All Rights Reserved. ## Source directory information @@ -12,9 +12,11 @@ include $(top_builddir)/icudefs.mk ## +TARGET_STUB_NAME = genbrk + SECTION = 1 -MAN_FILES = $(TARGET:$(EXEEXT)=).$(SECTION) +MAN_FILES = $(TARGET_STUB_NAME).$(SECTION) ## Build directory information subdir = tools/genbrk @@ -23,7 +25,7 @@ subdir = tools/genbrk CLEANFILES = *~ $(MAN_FILES) $(DEPS) ## Target information -TARGET = genbrk$(EXEEXT) +TARGET = $(BINDIR)/$(TARGET_STUB_NAME)$(EXEEXT) CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common -I$(srcdir)/../toolutil LIBS = $(LIBICUTOOLUTIL) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M) @@ -54,7 +56,7 @@ install-local: all-local $(MKINSTALLDIRS) $(DESTDIR)$(bindir) $(INSTALL) $(TARGET) $(DESTDIR)$(bindir) -<dist-local: +dist-local: clean-local: test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES) diff --git a/icuSources/tools/genbrk/genbrk.cpp b/icuSources/tools/genbrk/genbrk.cpp index d9942f03..2ca7a4df 100644 --- a/icuSources/tools/genbrk/genbrk.cpp +++ b/icuSources/tools/genbrk/genbrk.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2002-2003, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -26,13 +26,13 @@ // //-------------------------------------------------------------------- -#include <stdio.h> #include "unicode/utypes.h" #include "unicode/ucnv.h" #include "unicode/unistr.h" #include "unicode/rbbi.h" #include "unicode/uclean.h" #include "unicode/udata.h" +#include "unicode/putil.h" #include "uoptions.h" #include "unewdata.h" @@ -52,11 +52,22 @@ static UOption options[]={ { "rules", NULL, NULL, NULL, 'r', UOPT_REQUIRES_ARG, 0 }, /* 3 */ { "out", NULL, NULL, NULL, 'o', UOPT_REQUIRES_ARG, 0 }, /* 4 */ UOPTION_ICUDATADIR, /* 5 */ - UOPTION_DESTDIR /* 6 */ + UOPTION_DESTDIR, /* 6 */ + UOPTION_COPYRIGHT, /* 7 */ }; void usageAndDie(int retCode) { - printf("Usage: %s [-v] -r rule-file -o output-file\n", progName); + printf("Usage: %s [-v] [-options] -r rule-file -o output-file\n", progName); + printf("\tRead in break iteration rules text and write out the binary data\n" + "options:\n" + "\t-h or -? or --help this usage text\n" + "\t-V or --version show a version message\n" + "\t-c or --copyright include a copyright notice\n" + "\t-v or --verbose turn on verbose output\n" + "\t-i or --icudatadir directory for locating any needed intermediate data files,\n" + "\t followed by path, defaults to %s\n" + "\t-d or --destdir destination directory, followed by the path\n", + u_getDataDirectory()); exit (retCode); } @@ -97,8 +108,8 @@ DataHeader dh ={ 0, // reserved { 0x42, 0x72, 0x6b, 0x20 }, // dataFormat="Brk " - { 2, 1, 0, 0 }, // formatVersion - { 3, 1, 0, 0 } // dataVersion (Unicode version) + { 3, 0, 0, 0 }, // formatVersion + { 4, 0, 0, 0 } // dataVersion (Unicode version) }}; #endif @@ -113,8 +124,7 @@ int main(int argc, char **argv) { const char *ruleFileName; const char *outFileName; const char *outDir = NULL; - char *outFullFileName; - int32_t outFullFileNameLen; + const char *copyright = NULL; // // Pick up and check the command line arguments, @@ -140,24 +150,27 @@ int main(int argc, char **argv) { } ruleFileName = options[3].value; outFileName = options[4].value; - outFullFileNameLen = strlen(outFileName); if (options[5].doesOccur) { u_setDataDirectory(options[5].value); } + /* Initialize ICU */ + u_init(&status); + if (U_FAILURE(status)) { + fprintf(stderr, "%s: can not initialize ICU. status = %s\n", + argv[0], u_errorName(status)); + exit(1); + } + status = U_ZERO_ERROR; + /* Combine the directory with the file name */ if(options[6].doesOccur) { outDir = options[6].value; - outFullFileNameLen += strlen(outDir); } - outFullFileName = (char*)malloc(outFullFileNameLen + 2); - outFullFileName[0] = 0; - if (outDir) { - strcpy(outFullFileName, outDir); - strcat(outFullFileName, U_FILE_SEP_STRING); + if (options[7].doesOccur) { + copyright = U_COPYRIGHT_STRING; } - strcat(outFullFileName, outFileName); #if UCONFIG_NO_BREAK_ITERATION @@ -200,7 +213,7 @@ int main(int argc, char **argv) { // // Read in the rule source file // - int result; + long result; long ruleFileSize; FILE *file; char *ruleBufferC; @@ -215,7 +228,7 @@ int main(int argc, char **argv) { fseek(file, 0, SEEK_SET); ruleBufferC = new char[ruleFileSize+10]; - result = fread(ruleBufferC, 1, ruleFileSize, file); + result = (long)fread(ruleBufferC, 1, ruleFileSize, file); if (result != ruleFileSize) { fprintf(stderr, "Error reading file \"%s\"\n", ruleFileName); exit (-1); @@ -288,12 +301,12 @@ int main(int argc, char **argv) { // This will compile the rules. // UParseError parseError; - parseError.line = 0; - parseError.offset = 0; + parseError.line = 0; + parseError.offset = 0; RuleBasedBreakIterator *bi = new RuleBasedBreakIterator(ruleSourceS, parseError, status); if (U_FAILURE(status)) { fprintf(stderr, "createRuleBasedBreakIterator: ICU Error \"%s\" at line %d, column %d\n", - u_errorName(status), parseError.line, parseError.offset); + u_errorName(status), (int)parseError.line, (int)parseError.offset); exit(status); }; @@ -310,28 +323,30 @@ int main(int argc, char **argv) { // Create the output file // size_t bytesWritten; - file = fopen(outFullFileName, "wb"); - if (file == 0) { - fprintf(stderr, "Could not open output file \"%s\"\n", outFullFileName); - exit(-1); + UNewDataMemory *pData; + pData = udata_create(outDir, NULL, outFileName, &(dh.info), copyright, &status); + if(U_FAILURE(status)) { + fprintf(stderr, "genbrk: Could not open output file \"%s\", \"%s\"\n", + outFileName, u_errorName(status)); + exit(status); } - - bytesWritten = fwrite(&dh, 1, sizeof(DataHeader), file); - - // // Write the data itself. - // - bytesWritten = fwrite(outData, 1, outDataSize, file); + udata_writeBlock(pData, outData, outDataSize); + // finish up + bytesWritten = udata_finish(pData, &status); + if(U_FAILURE(status)) { + fprintf(stderr, "genbrk: error %d writing the output file\n", status); + exit(status); + } + if (bytesWritten != outDataSize) { - fprintf(stderr, "Error writing to output file \"%s\"\n", outFullFileName); + fprintf(stderr, "Error writing to output file \"%s\"\n", outFileName); exit(-1); } - fclose(file); delete bi; delete[] ruleSourceU; delete[] ruleBufferC; - free(outFullFileName); u_cleanup(); @@ -340,3 +355,4 @@ int main(int argc, char **argv) { #endif /* #if !UCONFIG_NO_BREAK_ITERATION */ } + diff --git a/icuSources/tools/genbrk/genbrk.dsp b/icuSources/tools/genbrk/genbrk.dsp index 93ba159c..8cb33549 100644 --- a/icuSources/tools/genbrk/genbrk.dsp +++ b/icuSources/tools/genbrk/genbrk.dsp @@ -116,7 +116,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\common" /I "..\..\i18n" /I "..\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Zm600 /c +# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\common" /I "..\..\i18n" /I "..\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Zm600 /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -151,7 +151,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\common" /I "..\..\i18n" /I "..\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /QIA64_fmaopt /Zm600 /c +# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\common" /I "..\..\i18n" /I "..\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /Zm600 /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" diff --git a/icuSources/tools/genbrk/genbrk.vcproj b/icuSources/tools/genbrk/genbrk.vcproj index 89102de2..24018853 100644 --- a/icuSources/tools/genbrk/genbrk.vcproj +++ b/icuSources/tools/genbrk/genbrk.vcproj @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding = "Windows-1252"?> +<?xml version="1.0" encoding="Windows-1252"?> <VisualStudioProject ProjectType="Visual C++" - Version="7.00" + Version="7.10" Name="genbrk" SccProjectName="" SccLocalPath=""> @@ -37,17 +37,14 @@ CompileAs="0"/> <Tool Name="VCCustomBuildTool" - CommandLine="copy $(TargetPath) ..\..\..\bin + CommandLine="copy "$(TargetPath)" ..\..\..\bin " - Outputs="..\..\..\bin\$(InputName).exe"/> + Outputs="..\..\..\bin\$(TargetFileName)"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icuuc.lib icutu.lib" OutputFile=".\Release/genbrk.exe" LinkIncremental="1" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\toolutil\Release,..\..\..\lib" ProgramDatabaseFile=".\Release/genbrk.pdb" SubSystem="1"/> <Tool @@ -65,8 +62,14 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> <Configuration Name="Debug|Win32" @@ -97,17 +100,14 @@ CompileAs="0"/> <Tool Name="VCCustomBuildTool" - CommandLine="copy $(TargetPath) ..\..\..\bin + CommandLine="copy "$(TargetPath)" ..\..\..\bin " - Outputs="..\..\..\bin\$(InputName).exe"/> + Outputs="..\..\..\bin\$(TargetFileName)"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icuucd.lib icutud.lib" OutputFile=".\Debug/genbrk.exe" LinkIncremental="2" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\toolutil\Debug,..\..\..\lib" GenerateDebugInformation="TRUE" ProgramDatabaseFile=".\Debug/genbrk.pdb" SubSystem="1"/> @@ -126,10 +126,18 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> </Configurations> + <References> + </References> <Files> <Filter Name="Source Files" diff --git a/icuSources/tools/gentz/Makefile.in b/icuSources/tools/gencase/Makefile.in similarity index 76% rename from icuSources/tools/gentz/Makefile.in rename to icuSources/tools/gencase/Makefile.in index 7ba1b291..0125abd6 100644 --- a/icuSources/tools/gentz/Makefile.in +++ b/icuSources/tools/gencase/Makefile.in @@ -1,7 +1,7 @@ -## Makefile.in for ICU - tools/gentz -## Copyright (c) 1999-2003, International Business Machines Corporation and +## Makefile.in for ICU - tools/gencase +## Copyright (c) 1999-2004, International Business Machines Corporation and ## others. All Rights Reserved. -## Steven R. Loomi +## Steven R. Loomis ## Source directory information srcdir = @srcdir@ @@ -13,35 +13,32 @@ include $(top_builddir)/icudefs.mk ## +TARGET_STUB_NAME = gencase + SECTION = 8 -MAN_FILES = $(TARGET:$(EXEEXT)=).$(SECTION) +MAN_FILES = $(TARGET_STUB_NAME).$(SECTION) ## Build directory information -subdir = tools/gentz - -## -ICUDATADIR=$(top_builddir)/data/ -TZFILE=$(srcdir)/tz.txt -TZALIAS=$(srcdir)/tz.alias +subdir = tools/gencase ## Extra files to remove for 'make clean' -CLEANFILES = *~ $(DEPS) $(RES_FILES) $(TEST_FILES) $(MAN_FILES) +CLEANFILES = *~ $(DEPS) $(MAN_FILES) ## Target information -TARGET = gentz$(EXEEXT) +TARGET = $(BINDIR)/$(TARGET_STUB_NAME)$(EXEEXT) -CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common -I$(top_srcdir)/i18n -I$(srcdir)/../toolutil +CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common -I$(srcdir)/../toolutil LIBS = $(LIBICUTOOLUTIL) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M) -OBJECTS = gentz.o +OBJECTS = gencase.o store.o DEPS = $(OBJECTS:.o=.d) ## List of phony targets .PHONY : all all-local install install-local clean clean-local \ distclean distclean-local dist dist-local check \ -check-local build-data install-man +check-local install-man ## Clear suffix list .SUFFIXES : @@ -56,9 +53,9 @@ check: all check-local all-local: $(TARGET) $(MAN_FILES) -install-local: all-local +install-local: all-local install-man $(MKINSTALLDIRS) $(DESTDIR)$(sbindir) - $(INSTALL) $(TARGET) $(DESTDIR)$(sbindir)/$(TARGET) + $(INSTALL) $(TARGET) $(DESTDIR)$(sbindir) # man page install-man: $(MAN_FILES) @@ -78,7 +75,7 @@ install-man: $(MAN_FILES) dist-local: -clean-local: +clean-local: test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES) $(RMV) $(TARGET) $(OBJECTS) @@ -101,4 +98,3 @@ ifneq ($(patsubst %clean,,$(MAKECMDGOALS)),) -include $(DEPS) endif endif - diff --git a/icuSources/tools/gencase/gencase.8.in b/icuSources/tools/gencase/gencase.8.in new file mode 100644 index 00000000..af93f656 --- /dev/null +++ b/icuSources/tools/gencase/gencase.8.in @@ -0,0 +1,136 @@ +.\" Hey, Emacs! This is -*-nroff-*- you know... +.\" +.\" gencase.8: manual page for the gencase utility +.\" +.\" Copyright (C) 2004 IBM, Inc. and others. +.\" +.TH GENCASE 8 "16 September 2004" "ICU MANPAGE" "ICU @VERSION@ Manual" +.SH NAME +.B gencase +\- compile case mapping properties from the Unicode Character Database +.SH SYNOPSIS +.B gencase +[ +.BR "\-h\fP, \fB\-?\fP, \fB\-\-help" +] +[ +.BR "\-v\fP, \fB\-\-verbose" +] +[ +.BI "\-u\fP, \fB\-\-unicode" " version" +] +[ +.BI "\-c\fP, \fB\-\-copyright" +] +[ +.BI "\-s\fP, \fB\-\-sourcedir" " source" +] +[ +.BI "\-d\fP, \fB\-\-destdir" " destination" +] +[ +.BI "\-i\fP, \fB\-\-icudatadir" " path" +] +[ +.I suffix +] +.SH DESCRIPTION +.B gencase +reads some of the Unicode Character Database files and compiles their +information information into a binary form. +The resulting file, +.BR ucase.icu , +can then be read directly by ICU, or used by +.BR pkgdata (8) +for incorporation into a larger archive or library. +.LP +The files read by +.B gencase +are described in the +.B FILES +section. If +.I suffix +is passed on the command line, the names of these files will actually +be changed to include a dash followed by +.I suffix +in their basename. For example, the file +.B UnicodeData.txt +would be looked for under the name +.BR UnicodeData\-\fIsuffix\fP.txt . +.SH OPTIONS +.TP +.BR "\-h\fP, \fB\-?\fP, \fB\-\-help" +Print help about usage and exit. +.TP +.BR "\-v\fP, \fB\-\-verbose" +Display extra informative messages during execution. +.TP +.BI "\-u\fP, \fB\-\-unicode" " version" +Specify which +.I version +of Unicode the Unicode Character Database refers to. +Defaults to +.BR 3.0.0 . +.TP +.BI "\-c\fP, \fB\-\-copyright" +Include a copyright notice into the binary data. +.TP +.BI "\-s\fP, \fB\-\-sourcedir" " source" +Set the source directory to +.IR source . +The default source directory is the current working directory. +.TP +.BI "\-d\fP, \fB\-\-destdir" " destination" +Set the destination directory to +.IR destination . +The default destination directory is specified by the environment variable +.BR ICU_DATA . +.TP +.BI "\-i\fP, \fB\-\-icudatadir" " path" +Set the directory for loading ICU data files to +.IR path . +The default ICU data directory is specified by the environment variable +.BR ICU_DATA . +.SH ENVIRONMENT +.TP 10 +.B ICU_DATA +Specifies the directory containing ICU data. Defaults to +.BR @thepkgicudatadir@/@PACKAGE@/@VERSION@/ . +Some tools in ICU depend on the presence of the trailing slash. It is thus +important to make sure that it is present if +.B ICU_DATA +is set. +.SH FILES +The following files are read by +.B gencase +and are looked for in the +.I source +directory. +.TP 20 +.B UnicodeData.txt +The main file in the Unicode Character Database. Contains character +properties, combining classes information, decompositions, names, +etc.\|.\|.. +.TP +.B PropList.txt +Listing of auxiliary binary character properties. +.TP +.B DerivedCoreProperties.txt +Derived binary properties, generated by Unicode from other files. +.TP +.B SpecialCasing.txt +List of properties required for full case mapping. +.TP +.B CaseFolding.txt +Mapping from characters to their case-folded forms. (Note: this file +is derived from +.B UnicodeData.txt +and +.B SpecialCasing.txt +when generated by the Unicode Consortium.) +.SH VERSION +@VERSION@ +.SH COPYRIGHT +Copyright (C) 2004 IBM, Inc. and others. +.SH SEE ALSO +.BR pkgdata (8) diff --git a/icuSources/tools/gencase/gencase.c b/icuSources/tools/gencase/gencase.c new file mode 100644 index 00000000..a49b73c1 --- /dev/null +++ b/icuSources/tools/gencase/gencase.c @@ -0,0 +1,810 @@ +/* +******************************************************************************* +* +* Copyright (C) 2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: gencase.c +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2004aug28 +* created by: Markus W. Scherer +* +* This program reads several of the Unicode character database text files, +* parses them, and the case mapping properties for each character. +* It then writes a binary file containing the properties +* that is designed to be used directly for random-access to +* the properties of each Unicode character. +*/ + +#include <stdio.h> +#include "unicode/utypes.h" +#include "unicode/uchar.h" +#include "unicode/uset.h" +#include "unicode/putil.h" +#include "unicode/uclean.h" +#include "cmemory.h" +#include "cstring.h" +#include "uarrsort.h" +#include "unewdata.h" +#include "uoptions.h" +#include "uparse.h" +#include "uprops.h" +#include "propsvec.h" +#include "gencase.h" + +#define LENGTHOF(array) (sizeof(array)/sizeof((array)[0])) + +/* data --------------------------------------------------------------------- */ + +uint32_t *pv; + +UBool beVerbose=FALSE, haveCopyright=TRUE; + +/* + * Unicode set collecting the case-sensitive characters; + * see uchar.h UCHAR_CASE_SENSITIVE. + * Add code points from case mappings/foldings in + * the root locale and with default options. + */ +static USet *caseSensitive; + +/* prototypes --------------------------------------------------------------- */ + +static void +parseSpecialCasing(const char *filename, UErrorCode *pErrorCode); + +static void +parseCaseFolding(const char *filename, UErrorCode *pErrorCode); + +static void +parseDB(const char *filename, UErrorCode *pErrorCode); + +/* parse files with multiple binary properties ------------------------------ */ + +/* TODO: more common code, move functions to uparse.h|c */ + +/* TODO: similar to genprops/props2.c but not the same */ + +struct Binary { + const char *propName; + int32_t vecWord; + uint32_t vecValue, vecMask; +}; +typedef struct Binary Binary; + +struct Binaries { + const char *ucdFile; + const Binary *binaries; + int32_t binariesCount; +}; +typedef struct Binaries Binaries; + +static const Binary +propListNames[]={ + { "Soft_Dotted", 0, UCASE_SOFT_DOTTED, UCASE_DOT_MASK } +}; + +static const Binaries +propListBinaries={ + "PropList", propListNames, LENGTHOF(propListNames) +}; + +static const Binary +derCorePropsNames[]={ + { "Lowercase", 0, UCASE_LOWER, UCASE_TYPE_MASK }, + { "Uppercase", 0, UCASE_UPPER, UCASE_TYPE_MASK } +}; + +static const Binaries +derCorePropsBinaries={ + "DerivedCoreProperties", derCorePropsNames, LENGTHOF(derCorePropsNames) +}; + +static void U_CALLCONV +binariesLineFn(void *context, + char *fields[][2], int32_t fieldCount, + UErrorCode *pErrorCode) { + const Binaries *bin; + char *s; + uint32_t start, limit; + int32_t i; + + bin=(const Binaries *)context; + + u_parseCodePointRange(fields[0][0], &start, &limit, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + fprintf(stderr, "gencase: syntax error in %s.txt field 0 at %s\n", bin->ucdFile, fields[0][0]); + exit(*pErrorCode); + } + ++limit; + + /* parse binary property name */ + s=(char *)u_skipWhitespace(fields[1][0]); + for(i=0;; ++i) { + if(i==bin->binariesCount) { + /* ignore unrecognized properties */ + return; + } + if(isToken(bin->binaries[i].propName, s)) { + break; + } + } + + if(bin->binaries[i].vecMask==0) { + fprintf(stderr, "gencase error: mask value %d==0 for %s %s\n", + (int)bin->binaries[i].vecMask, bin->ucdFile, bin->binaries[i].propName); + exit(U_INTERNAL_PROGRAM_ERROR); + } + + if(!upvec_setValue(pv, start, limit, bin->binaries[i].vecWord, bin->binaries[i].vecValue, bin->binaries[i].vecMask, pErrorCode)) { + fprintf(stderr, "gencase error: unable to set %s, code: %s\n", + bin->binaries[i].propName, u_errorName(*pErrorCode)); + exit(*pErrorCode); + } +} + +static void +parseBinariesFile(char *filename, char *basename, const char *suffix, + const Binaries *bin, + UErrorCode *pErrorCode) { + char *fields[2][2]; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return; + } + + writeUCDFilename(basename, bin->ucdFile, suffix); + + u_parseDelimitedFile(filename, ';', fields, 2, binariesLineFn, (void *)bin, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + fprintf(stderr, "error parsing %s.txt: %s\n", bin->ucdFile, u_errorName(*pErrorCode)); + } +} + +/* -------------------------------------------------------------------------- */ + +enum +{ + HELP_H, + HELP_QUESTION_MARK, + VERBOSE, + COPYRIGHT, + DESTDIR, + SOURCEDIR, + UNICODE_VERSION, + ICUDATADIR +}; + +/* Keep these values in sync with the above enums */ +static UOption options[]={ + UOPTION_HELP_H, + UOPTION_HELP_QUESTION_MARK, + UOPTION_VERBOSE, + UOPTION_COPYRIGHT, + UOPTION_DESTDIR, + UOPTION_SOURCEDIR, + { "unicode", NULL, NULL, NULL, 'u', UOPT_REQUIRES_ARG, 0 }, + UOPTION_ICUDATADIR +}; + +extern int +main(int argc, char* argv[]) { + char filename[300]; + const char *srcDir=NULL, *destDir=NULL, *suffix=NULL; + char *basename=NULL; + UErrorCode errorCode=U_ZERO_ERROR; + + U_MAIN_INIT_ARGS(argc, argv); + + /* preset then read command line options */ + options[DESTDIR].value=u_getDataDirectory(); + options[SOURCEDIR].value=""; + options[UNICODE_VERSION].value=""; + options[ICUDATADIR].value=u_getDataDirectory(); + argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), options); + + /* error handling, printing usage message */ + if(argc<0) { + fprintf(stderr, + "error in command line argument \"%s\"\n", + argv[-argc]); + } + if(argc<0 || options[HELP_H].doesOccur || options[HELP_QUESTION_MARK].doesOccur) { + /* + * Broken into chucks because the C89 standard says the minimum + * required supported string length is 509 bytes. + */ + fprintf(stderr, + "Usage: %s [-options] [suffix]\n" + "\n" + "read the UnicodeData.txt file and other Unicode properties files and\n" + "create a binary file " UCASE_DATA_NAME "." UCASE_DATA_TYPE " with the case mapping properties\n" + "\n", + argv[0]); + fprintf(stderr, + "Options:\n" + "\t-h or -? or --help this usage text\n" + "\t-v or --verbose verbose output\n" + "\t-c or --copyright include a copyright notice\n" + "\t-u or --unicode Unicode version, followed by the version like 3.0.0\n"); + fprintf(stderr, + "\t-d or --destdir destination directory, followed by the path\n" + "\t-s or --sourcedir source directory, followed by the path\n" + "\t-i or --icudatadir directory for locating any needed intermediate data files,\n" + "\t followed by path, defaults to %s\n" + "\tsuffix suffix that is to be appended with a '-'\n" + "\t to the source file basenames before opening;\n" + "\t 'gencase new' will read UnicodeData-new.txt etc.\n", + u_getDataDirectory()); + return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR; + } + + /* get the options values */ + beVerbose=options[VERBOSE].doesOccur; + haveCopyright=options[COPYRIGHT].doesOccur; + srcDir=options[SOURCEDIR].value; + destDir=options[DESTDIR].value; + + if(argc>=2) { + suffix=argv[1]; + } else { + suffix=NULL; + } + + if(options[UNICODE_VERSION].doesOccur) { + setUnicodeVersion(options[UNICODE_VERSION].value); + } + /* else use the default dataVersion in store.c */ + + if (options[ICUDATADIR].doesOccur) { + u_setDataDirectory(options[ICUDATADIR].value); + } + + /* prepare the filename beginning with the source dir */ + uprv_strcpy(filename, srcDir); + basename=filename+uprv_strlen(filename); + if(basename>filename && *(basename-1)!=U_FILE_SEP_CHAR) { + *basename++=U_FILE_SEP_CHAR; + } + + /* initialize */ + pv=upvec_open(1, 10000); + caseSensitive=uset_open(1, 0); /* empty set (start>end) */ + + /* process SpecialCasing.txt */ + writeUCDFilename(basename, "SpecialCasing", suffix); + parseSpecialCasing(filename, &errorCode); + + /* process CaseFolding.txt */ + writeUCDFilename(basename, "CaseFolding", suffix); + parseCaseFolding(filename, &errorCode); + + /* process additional properties files */ + *basename=0; + + parseBinariesFile(filename, basename, suffix, &propListBinaries, &errorCode); + + parseBinariesFile(filename, basename, suffix, &derCorePropsBinaries, &errorCode); + + /* process UnicodeData.txt */ + writeUCDFilename(basename, "UnicodeData", suffix); + parseDB(filename, &errorCode); + + /* process parsed data */ + makeCaseClosure(); + + makeExceptions(); + + if(U_SUCCESS(errorCode)) { + /* write the properties data file */ + generateData(destDir); + } + + u_cleanup(); + return errorCode; +} + +U_CFUNC void +writeUCDFilename(char *basename, const char *filename, const char *suffix) { + int32_t length=(int32_t)uprv_strlen(filename); + uprv_strcpy(basename, filename); + if(suffix!=NULL) { + basename[length++]='-'; + uprv_strcpy(basename+length, suffix); + length+=(int32_t)uprv_strlen(suffix); + } + uprv_strcpy(basename+length, ".txt"); +} + +/* TODO: move to toolutil */ +U_CFUNC UBool +isToken(const char *token, const char *s) { + const char *z; + int32_t j; + + s=u_skipWhitespace(s); + for(j=0;; ++j) { + if(token[j]!=0) { + if(s[j]!=token[j]) { + break; + } + } else { + z=u_skipWhitespace(s+j); + if(*z==';' || *z==0) { + return TRUE; + } else { + break; + } + } + } + + return FALSE; +} + +static int32_t +getTokenIndex(const char *const tokens[], int32_t countTokens, const char *s) { + const char *t, *z; + int32_t i, j; + + s=u_skipWhitespace(s); + for(i=0; i<countTokens; ++i) { + t=tokens[i]; + if(t!=NULL) { + for(j=0;; ++j) { + if(t[j]!=0) { + if(s[j]!=t[j]) { + break; + } + } else { + z=u_skipWhitespace(s+j); + if(*z==';' || *z==0 || *z=='#' || *z=='\r' || *z=='\n') { + return i; + } else { + break; + } + } + } + } + } + return -1; +} + +static void +_set_addAll(USet *set, const UChar *s, int32_t length) { + UChar32 c; + int32_t i; + + /* needs length>=0 */ + for(i=0; i<length; /* U16_NEXT advances i */) { + U16_NEXT(s, i, length, c); + uset_add(set, c); + } +} + +/* parser for SpecialCasing.txt --------------------------------------------- */ + +#define MAX_SPECIAL_CASING_COUNT 500 + +static SpecialCasing specialCasings[MAX_SPECIAL_CASING_COUNT]; +static int32_t specialCasingCount=0; + +static void U_CALLCONV +specialCasingLineFn(void *context, + char *fields[][2], int32_t fieldCount, + UErrorCode *pErrorCode) { + char *end; + + /* get code point */ + specialCasings[specialCasingCount].code=(UChar32)uprv_strtoul(u_skipWhitespace(fields[0][0]), &end, 16); + end=(char *)u_skipWhitespace(end); + if(end<=fields[0][0] || end!=fields[0][1]) { + fprintf(stderr, "gencase: syntax error in SpecialCasing.txt field 0 at %s\n", fields[0][0]); + *pErrorCode=U_PARSE_ERROR; + exit(U_PARSE_ERROR); + } + + /* is this a complex mapping? */ + if(*(end=(char *)u_skipWhitespace(fields[4][0]))!=0 && *end!=';' && *end!='#') { + /* there is some condition text in the fifth field */ + specialCasings[specialCasingCount].isComplex=TRUE; + + /* do not store any actual mappings for this */ + specialCasings[specialCasingCount].lowerCase[0]=0; + specialCasings[specialCasingCount].upperCase[0]=0; + specialCasings[specialCasingCount].titleCase[0]=0; + } else { + /* just set the "complex" flag and get the case mappings */ + specialCasings[specialCasingCount].isComplex=FALSE; + specialCasings[specialCasingCount].lowerCase[0]= + (UChar)u_parseString(fields[1][0], specialCasings[specialCasingCount].lowerCase+1, 31, NULL, pErrorCode); + specialCasings[specialCasingCount].upperCase[0]= + (UChar)u_parseString(fields[3][0], specialCasings[specialCasingCount].upperCase+1, 31, NULL, pErrorCode); + specialCasings[specialCasingCount].titleCase[0]= + (UChar)u_parseString(fields[2][0], specialCasings[specialCasingCount].titleCase+1, 31, NULL, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + fprintf(stderr, "gencase: error parsing special casing at %s\n", fields[0][0]); + exit(*pErrorCode); + } + + uset_add(caseSensitive, (UChar32)specialCasings[specialCasingCount].code); + _set_addAll(caseSensitive, specialCasings[specialCasingCount].lowerCase+1, specialCasings[specialCasingCount].lowerCase[0]); + _set_addAll(caseSensitive, specialCasings[specialCasingCount].upperCase+1, specialCasings[specialCasingCount].upperCase[0]); + _set_addAll(caseSensitive, specialCasings[specialCasingCount].titleCase+1, specialCasings[specialCasingCount].titleCase[0]); + } + + if(++specialCasingCount==MAX_SPECIAL_CASING_COUNT) { + fprintf(stderr, "gencase: too many special casing mappings\n"); + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + exit(U_INDEX_OUTOFBOUNDS_ERROR); + } +} + +static int32_t U_CALLCONV +compareSpecialCasings(const void *context, const void *left, const void *right) { + return ((const SpecialCasing *)left)->code-((const SpecialCasing *)right)->code; +} + +static void +parseSpecialCasing(const char *filename, UErrorCode *pErrorCode) { + char *fields[5][2]; + int32_t i, j; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return; + } + + u_parseDelimitedFile(filename, ';', fields, 5, specialCasingLineFn, NULL, pErrorCode); + + /* sort the special casing entries by code point */ + if(specialCasingCount>0) { + uprv_sortArray(specialCasings, specialCasingCount, sizeof(SpecialCasing), + compareSpecialCasings, NULL, FALSE, pErrorCode); + } + if(U_FAILURE(*pErrorCode)) { + return; + } + + /* replace multiple entries for any code point by one "complex" one */ + j=0; + for(i=1; i<specialCasingCount; ++i) { + if(specialCasings[i-1].code==specialCasings[i].code) { + /* there is a duplicate code point */ + specialCasings[i-1].code=0x7fffffff; /* remove this entry in the following sorting */ + specialCasings[i].isComplex=TRUE; /* make the following one complex */ + specialCasings[i].lowerCase[0]=0; + specialCasings[i].upperCase[0]=0; + specialCasings[i].titleCase[0]=0; + ++j; + } + } + + /* if some entries just were removed, then re-sort */ + if(j>0) { + uprv_sortArray(specialCasings, specialCasingCount, sizeof(SpecialCasing), + compareSpecialCasings, NULL, FALSE, pErrorCode); + specialCasingCount-=j; + } + if(U_FAILURE(*pErrorCode)) { + return; + } + + /* + * Add one complex mapping to caseSensitive that was filtered out above: + * Greek final Sigma has a conditional mapping but not locale-sensitive, + * and it is taken when lowercasing just U+03A3 alone. + * 03A3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK CAPITAL LETTER SIGMA + */ + uset_add(caseSensitive, 0x3c2); +} + +/* parser for CaseFolding.txt ----------------------------------------------- */ + +#define MAX_CASE_FOLDING_COUNT 2000 + +static CaseFolding caseFoldings[MAX_CASE_FOLDING_COUNT]; +static int32_t caseFoldingCount=0; + +static void U_CALLCONV +caseFoldingLineFn(void *context, + char *fields[][2], int32_t fieldCount, + UErrorCode *pErrorCode) { + char *end; + static UChar32 prevCode=0; + int32_t count; + char status; + + /* get code point */ + caseFoldings[caseFoldingCount].code=(UChar32)uprv_strtoul(u_skipWhitespace(fields[0][0]), &end, 16); + end=(char *)u_skipWhitespace(end); + if(end<=fields[0][0] || end!=fields[0][1]) { + fprintf(stderr, "gencase: syntax error in CaseFolding.txt field 0 at %s\n", fields[0][0]); + *pErrorCode=U_PARSE_ERROR; + exit(U_PARSE_ERROR); + } + + /* get the status of this mapping */ + caseFoldings[caseFoldingCount].status=status=*u_skipWhitespace(fields[1][0]); + if(status!='L' && status!='E' && status!='C' && status!='S' && status!='F' && status!='I' && status!='T') { + fprintf(stderr, "gencase: unrecognized status field in CaseFolding.txt at %s\n", fields[0][0]); + *pErrorCode=U_PARSE_ERROR; + exit(U_PARSE_ERROR); + } + + /* ignore all case folding mappings that are the same as the UnicodeData.txt lowercase mappings */ + if(status=='L') { + return; + } + + /* get the mapping */ + count=caseFoldings[caseFoldingCount].full[0]= + (UChar)u_parseString(fields[2][0], caseFoldings[caseFoldingCount].full+1, 31, (uint32_t *)&caseFoldings[caseFoldingCount].simple, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + fprintf(stderr, "gencase: error parsing CaseFolding.txt mapping at %s\n", fields[0][0]); + exit(*pErrorCode); + } + + /* there is a simple mapping only if there is exactly one code point (count is in UChars) */ + if(count==0 || count>2 || (count==2 && UTF_IS_SINGLE(caseFoldings[caseFoldingCount].full[1]))) { + caseFoldings[caseFoldingCount].simple=0; + } + + /* update the case-sensitive set */ + if(status!='T') { + uset_add(caseSensitive, (UChar32)caseFoldings[caseFoldingCount].code); + _set_addAll(caseSensitive, caseFoldings[caseFoldingCount].full+1, caseFoldings[caseFoldingCount].full[0]); + } + + /* check the status */ + if(status=='S') { + /* check if there was a full mapping for this code point before */ + if( caseFoldingCount>0 && + caseFoldings[caseFoldingCount-1].code==caseFoldings[caseFoldingCount].code && + caseFoldings[caseFoldingCount-1].status=='F' + ) { + /* merge the two entries */ + caseFoldings[caseFoldingCount-1].simple=caseFoldings[caseFoldingCount].simple; + return; + } + } else if(status=='F') { + /* check if there was a simple mapping for this code point before */ + if( caseFoldingCount>0 && + caseFoldings[caseFoldingCount-1].code==caseFoldings[caseFoldingCount].code && + caseFoldings[caseFoldingCount-1].status=='S' + ) { + /* merge the two entries */ + uprv_memcpy(caseFoldings[caseFoldingCount-1].full, caseFoldings[caseFoldingCount].full, 32*U_SIZEOF_UCHAR); + return; + } + } else if(status=='I' || status=='T') { + /* check if there was a default mapping for this code point before (remove it) */ + while(caseFoldingCount>0 && + caseFoldings[caseFoldingCount-1].code==caseFoldings[caseFoldingCount].code + ) { + prevCode=0; + --caseFoldingCount; + } + /* store only a marker for special handling for cases like dotless i */ + caseFoldings[caseFoldingCount].simple=0; + caseFoldings[caseFoldingCount].full[0]=0; + } + + /* check that the code points (caseFoldings[caseFoldingCount].code) are in ascending order */ + if(caseFoldings[caseFoldingCount].code<=prevCode && caseFoldings[caseFoldingCount].code>0) { + fprintf(stderr, "gencase: error - CaseFolding entries out of order, U+%04lx after U+%04lx\n", + (unsigned long)caseFoldings[caseFoldingCount].code, + (unsigned long)prevCode); + *pErrorCode=U_PARSE_ERROR; + exit(U_PARSE_ERROR); + } + prevCode=caseFoldings[caseFoldingCount].code; + + if(++caseFoldingCount==MAX_CASE_FOLDING_COUNT) { + fprintf(stderr, "gencase: too many case folding mappings\n"); + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + exit(U_INDEX_OUTOFBOUNDS_ERROR); + } +} + +static void +parseCaseFolding(const char *filename, UErrorCode *pErrorCode) { + char *fields[3][2]; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return; + } + + u_parseDelimitedFile(filename, ';', fields, 3, caseFoldingLineFn, NULL, pErrorCode); +} + +/* parser for UnicodeData.txt ----------------------------------------------- */ + +/* general categories */ +const char *const +genCategoryNames[U_CHAR_CATEGORY_COUNT]={ + "Cn", + "Lu", "Ll", "Lt", "Lm", "Lo", "Mn", "Me", + "Mc", "Nd", "Nl", "No", + "Zs", "Zl", "Zp", + "Cc", "Cf", "Co", "Cs", + "Pd", "Ps", "Pe", "Pc", "Po", + "Sm", "Sc", "Sk", "So", + "Pi", "Pf" +}; + +static int32_t specialCasingIndex=0, caseFoldingIndex=0; + +static void U_CALLCONV +unicodeDataLineFn(void *context, + char *fields[][2], int32_t fieldCount, + UErrorCode *pErrorCode) { + Props p; + char *end; + static UChar32 prevCode=0; + UChar32 value; + int32_t i; + + /* reset the properties */ + uprv_memset(&p, 0, sizeof(Props)); + + /* get the character code, field 0 */ + p.code=(UChar32)uprv_strtoul(fields[0][0], &end, 16); + if(end<=fields[0][0] || end!=fields[0][1]) { + fprintf(stderr, "gencase: syntax error in field 0 at %s\n", fields[0][0]); + *pErrorCode=U_PARSE_ERROR; + exit(U_PARSE_ERROR); + } + + /* get general category, field 2 */ + i=getTokenIndex(genCategoryNames, U_CHAR_CATEGORY_COUNT, fields[2][0]); + if(i>=0) { + p.gc=(uint8_t)i; + } else { + fprintf(stderr, "gencase: unknown general category \"%s\" at code 0x%lx\n", + fields[2][0], (unsigned long)p.code); + *pErrorCode=U_PARSE_ERROR; + exit(U_PARSE_ERROR); + } + + /* get canonical combining class, field 3 */ + value=(UChar32)uprv_strtoul(fields[3][0], &end, 10); + if(end<=fields[3][0] || end!=fields[3][1] || value>0xff) { + fprintf(stderr, "gencase: syntax error in field 3 at %s\n", fields[0][0]); + *pErrorCode=U_PARSE_ERROR; + exit(U_PARSE_ERROR); + } + p.cc=(uint8_t)value; + + /* get uppercase mapping, field 12 */ + value=(UChar32)uprv_strtoul(fields[12][0], &end, 16); + if(end!=fields[12][1]) { + fprintf(stderr, "gencase: syntax error in field 12 at code 0x%lx\n", + (unsigned long)p.code); + *pErrorCode=U_PARSE_ERROR; + exit(U_PARSE_ERROR); + } + if(value!=0 && value!=p.code) { + p.upperCase=value; + uset_add(caseSensitive, p.code); + uset_add(caseSensitive, value); + } + + /* get lowercase value, field 13 */ + value=(UChar32)uprv_strtoul(fields[13][0], &end, 16); + if(end!=fields[13][1]) { + fprintf(stderr, "gencase: syntax error in field 13 at code 0x%lx\n", + (unsigned long)p.code); + *pErrorCode=U_PARSE_ERROR; + exit(U_PARSE_ERROR); + } + if(value!=0 && value!=p.code) { + p.lowerCase=value; + uset_add(caseSensitive, p.code); + uset_add(caseSensitive, value); + } + + /* get titlecase value, field 14 */ + value=(UChar32)uprv_strtoul(fields[14][0], &end, 16); + if(end!=fields[14][1]) { + fprintf(stderr, "gencase: syntax error in field 14 at code 0x%lx\n", + (unsigned long)p.code); + *pErrorCode=U_PARSE_ERROR; + exit(U_PARSE_ERROR); + } + if(value!=0 && value!=p.code) { + p.titleCase=value; + uset_add(caseSensitive, p.code); + uset_add(caseSensitive, value); + } + + /* set additional properties from previously parsed files */ + if(specialCasingIndex<specialCasingCount && p.code==specialCasings[specialCasingIndex].code) { + p.specialCasing=specialCasings+specialCasingIndex++; + } else { + p.specialCasing=NULL; + } + if(caseFoldingIndex<caseFoldingCount && p.code==caseFoldings[caseFoldingIndex].code) { + p.caseFolding=caseFoldings+caseFoldingIndex++; + + /* ignore "Common" mappings (simple==full) that map to the same code point as the regular lowercase mapping */ + if( p.caseFolding->status=='C' && + p.caseFolding->simple==p.lowerCase + ) { + p.caseFolding=NULL; + } + } else { + p.caseFolding=NULL; + } + + /* check for non-character code points */ + if((p.code&0xfffe)==0xfffe || (uint32_t)(p.code-0xfdd0)<0x20) { + fprintf(stderr, "gencase: error - properties for non-character code point U+%04lx\n", + (unsigned long)p.code); + *pErrorCode=U_PARSE_ERROR; + exit(U_PARSE_ERROR); + } + + /* check that the code points (p.code) are in ascending order */ + if(p.code<=prevCode && p.code>0) { + fprintf(stderr, "gencase: error - UnicodeData entries out of order, U+%04lx after U+%04lx\n", + (unsigned long)p.code, (unsigned long)prevCode); + *pErrorCode=U_PARSE_ERROR; + exit(U_PARSE_ERROR); + } + + /* properties for a single code point */ + setProps(&p); + + prevCode=p.code; +} + +static void +parseDB(const char *filename, UErrorCode *pErrorCode) { + char *fields[15][2]; + UChar32 start, end; + int32_t i; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return; + } + + u_parseDelimitedFile(filename, ';', fields, 15, unicodeDataLineFn, NULL, pErrorCode); + + /* are all sub-properties consumed? */ + if(specialCasingIndex<specialCasingCount) { + fprintf(stderr, "gencase: error - some code points in SpecialCasing.txt are missing from UnicodeData.txt\n"); + *pErrorCode=U_PARSE_ERROR; + exit(U_PARSE_ERROR); + } + if(caseFoldingIndex<caseFoldingCount) { + fprintf(stderr, "gencase: error - some code points in CaseFolding.txt are missing from UnicodeData.txt\n"); + *pErrorCode=U_PARSE_ERROR; + exit(U_PARSE_ERROR); + } + + if(U_FAILURE(*pErrorCode)) { + return; + } + + for(i=0; + 0==uset_getItem(caseSensitive, i, &start, &end, NULL, 0, pErrorCode) && U_SUCCESS(*pErrorCode); + ++i + ) { + addCaseSensitive(start, end); + } + if(*pErrorCode==U_INDEX_OUTOFBOUNDS_ERROR) { + *pErrorCode=U_ZERO_ERROR; + } +} + +/* + * Hey, Emacs, please set the following: + * + * Local Variables: + * indent-tabs-mode: nil + * End: + * + */ diff --git a/icuSources/tools/gentz/gentz.dsp b/icuSources/tools/gencase/gencase.dsp similarity index 69% rename from icuSources/tools/gentz/gentz.dsp rename to icuSources/tools/gencase/gencase.dsp index b3f1583f..aa37702c 100644 --- a/icuSources/tools/gentz/gentz.dsp +++ b/icuSources/tools/gencase/gencase.dsp @@ -1,26 +1,26 @@ -# Microsoft Developer Studio Project File - Name="gentz" - Package Owner=<4> +# Microsoft Developer Studio Project File - Name="gencase" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 -CFG=gentz - Win32 Debug +CFG=gencase - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE -!MESSAGE NMAKE /f "gentz.mak". +!MESSAGE NMAKE /f "gencase.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE -!MESSAGE NMAKE /f "gentz.mak" CFG="gentz - Win32 Debug" +!MESSAGE NMAKE /f "gencase.mak" CFG="gencase - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE -!MESSAGE "gentz - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "gentz - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE "gentz - Win64 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "gentz - Win64 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "gencase - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "gencase - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "gencase - Win64 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "gencase - Win64 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project @@ -30,7 +30,7 @@ CFG=gentz - Win32 Debug CPP=cl.exe RSC=rc.exe -!IF "$(CFG)" == "gentz - Win32 Release" +!IF "$(CFG)" == "gencase - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 @@ -45,7 +45,7 @@ RSC=rc.exe # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /G6 /MD /Za /W3 /GX /O2 /I "..\..\common" /I "..\..\i18n" /I "..\toolutil" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c +# ADD CPP /nologo /G6 /MD /Za /W3 /GX /O2 /I "..\toolutil" /I "..\..\common" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -53,11 +53,11 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 icuuc.lib icutu.lib /nologo /subsystem:console /machine:I386 /libpath:"..\toolutil\Release" /libpath:"..\..\..\lib" +# ADD LINK32 icuuc.lib icutu.lib /nologo /subsystem:console /machine:I386 /libpath:"..\toolutil\Release" /libpath:"..\..\..\lib\Release" /libpath:"..\..\..\lib" # Begin Custom Build -TargetPath=.\Release\gentz.exe -InputPath=.\Release\gentz.exe -InputName=gentz +TargetPath=.\Release\gencase.exe +InputPath=.\Release\gencase.exe +InputName=gencase SOURCE="$(InputPath)" "..\..\..\bin\$(InputName).exe" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" @@ -65,7 +65,7 @@ SOURCE="$(InputPath)" # End Custom Build -!ELSEIF "$(CFG)" == "gentz - Win32 Debug" +!ELSEIF "$(CFG)" == "gencase - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 @@ -80,7 +80,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /G6 /MDd /Za /W3 /Gm /GX /ZI /Od /I "..\..\common" /I "..\..\i18n" /I "..\toolutil" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /FD /GZ /c +# ADD CPP /nologo /G6 /MDd /Za /W3 /Gm /GX /ZI /Od /I "..\toolutil" /I "..\..\common" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe @@ -88,11 +88,11 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 icuucd.lib icutud.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\toolutil\Debug" /libpath:"..\..\..\lib" +# ADD LINK32 icuucd.lib icutud.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\toolutil\Debug" /libpath:"..\..\..\lib\Debug" /libpath:"..\..\..\lib" # Begin Custom Build -TargetPath=.\Debug\gentz.exe -InputPath=.\Debug\gentz.exe -InputName=gentz +TargetPath=.\Debug\gencase.exe +InputPath=.\Debug\gencase.exe +InputName=gencase SOURCE="$(InputPath)" "..\..\..\bin\$(InputName).exe" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" @@ -100,7 +100,7 @@ SOURCE="$(InputPath)" # End Custom Build -!ELSEIF "$(CFG)" == "gentz - Win64 Release" +!ELSEIF "$(CFG)" == "gencase - Win64 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 @@ -115,7 +115,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\common" /I "..\..\i18n" /I "..\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\toolutil" /I "..\..\common" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -123,11 +123,11 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:IX86 /machine:IA64 -# ADD LINK32 icuuc.lib icutu.lib /nologo /subsystem:console /machine:IX86 /libpath:"..\toolutil\Release" /libpath:"..\..\..\lib" /machine:IA64 +# ADD LINK32 icuuc.lib icutu.lib /nologo /subsystem:console /machine:IX86 /libpath:"..\toolutil\Release" /libpath:"..\..\..\lib\Release" /libpath:"..\..\..\lib" /machine:IA64 # Begin Custom Build -TargetPath=.\Release\gentz.exe -InputPath=.\Release\gentz.exe -InputName=gentz +TargetPath=.\Release\gencase.exe +InputPath=.\Release\gencase.exe +InputName=gencase SOURCE="$(InputPath)" "..\..\..\bin\$(InputName).exe" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" @@ -135,7 +135,7 @@ SOURCE="$(InputPath)" # End Custom Build -!ELSEIF "$(CFG)" == "gentz - Win64 Debug" +!ELSEIF "$(CFG)" == "gencase - Win64 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 @@ -150,7 +150,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\common" /I "..\..\i18n" /I "..\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\toolutil" /I "..\..\common" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe @@ -158,11 +158,11 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:IX86 /pdbtype:sept /machine:IA64 -# ADD LINK32 icuucd.lib icutud.lib /nologo /subsystem:console /incremental:no /debug /machine:IX86 /pdbtype:sept /libpath:"..\toolutil\Debug" /libpath:"..\..\..\lib" /machine:IA64 +# ADD LINK32 icuucd.lib icutud.lib /nologo /subsystem:console /incremental:no /debug /machine:IX86 /pdbtype:sept /libpath:"..\toolutil\Debug" /libpath:"..\..\..\lib\Debug" /libpath:"..\..\..\lib" /machine:IA64 # Begin Custom Build -TargetPath=.\Debug\gentz.exe -InputPath=.\Debug\gentz.exe -InputName=gentz +TargetPath=.\Debug\gencase.exe +InputPath=.\Debug\gencase.exe +InputName=gencase SOURCE="$(InputPath)" "..\..\..\bin\$(InputName).exe" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" @@ -174,25 +174,21 @@ SOURCE="$(InputPath)" # Begin Target -# Name "gentz - Win32 Release" -# Name "gentz - Win32 Debug" -# Name "gentz - Win64 Release" -# Name "gentz - Win64 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Name "gencase - Win32 Release" +# Name "gencase - Win32 Debug" +# Name "gencase - Win64 Release" +# Name "gencase - Win64 Debug" # Begin Source File -SOURCE=.\gentz.cpp +SOURCE=.\gencase.c # End Source File -# End Group -# Begin Group "Header Files" +# Begin Source File -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# End Group -# Begin Group "Resource Files" +SOURCE=.\gencase.h +# End Source File +# Begin Source File -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group +SOURCE=.\store.c +# End Source File # End Target # End Project diff --git a/icuSources/tools/gencase/gencase.h b/icuSources/tools/gencase/gencase.h new file mode 100644 index 00000000..2ca8eddf --- /dev/null +++ b/icuSources/tools/gencase/gencase.h @@ -0,0 +1,89 @@ +/* +******************************************************************************* +* +* Copyright (C) 2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: gencase.h +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2004aug28 +* created by: Markus W. Scherer +*/ + +#ifndef __GENCASE_H__ +#define __GENCASE_H__ + +#include "unicode/utypes.h" +#include "utrie.h" +#include "ucase.h" + +U_CDECL_BEGIN + +/* gencase ------------------------------------------------------------------ */ + +#define UGENCASE_EXC_SHIFT 16 +#define UGENCASE_EXC_MASK 0xffff0000 + +/* special casing data */ +typedef struct { + UChar32 code; + UBool isComplex; + UChar lowerCase[32], upperCase[32], titleCase[32]; +} SpecialCasing; + +/* case folding data */ +typedef struct { + UChar32 code, simple; + char status; + UChar full[32]; +} CaseFolding; + +/* case mapping properties */ +typedef struct { + UChar32 code, lowerCase, upperCase, titleCase; + SpecialCasing *specialCasing; + CaseFolding *caseFolding; + uint8_t gc, cc; +} Props; + +/* global flags */ +extern UBool beVerbose, haveCopyright; + +/* properties vectors in gencase.c */ +extern uint32_t *pv; + +/* prototypes */ +U_CFUNC void +writeUCDFilename(char *basename, const char *filename, const char *suffix); + +U_CFUNC UBool +isToken(const char *token, const char *s); + +extern void +setUnicodeVersion(const char *v); + +extern void +setProps(Props *p); + +U_CFUNC uint32_t U_EXPORT2 +getFoldedPropsValue(UNewTrie *trie, UChar32 start, int32_t offset); + +extern void +addCaseSensitive(UChar32 first, UChar32 last); + +extern void +makeCaseClosure(void); + +extern void +makeExceptions(void); + +extern void +generateData(const char *dataDir); + +U_CDECL_END + +#endif diff --git a/icuSources/test/ieeetest/ieeetest.vcproj b/icuSources/tools/gencase/gencase.vcproj similarity index 67% rename from icuSources/test/ieeetest/ieeetest.vcproj rename to icuSources/tools/gencase/gencase.vcproj index ea084b21..a95c874d 100644 --- a/icuSources/test/ieeetest/ieeetest.vcproj +++ b/icuSources/tools/gencase/gencase.vcproj @@ -1,8 +1,9 @@ -<?xml version="1.0" encoding = "Windows-1252"?> +<?xml version="1.0" encoding="Windows-1252"?> <VisualStudioProject ProjectType="Visual C++" - Version="7.00" - Name="ieeetest" + Version="7.10" + Name="gencase" + ProjectGUID="{DB312A49-12A9-4E07-9E96-451DC2D8FF61}" SccProjectName="" SccLocalPath=""> <Platforms> @@ -11,48 +12,45 @@ </Platforms> <Configurations> <Configuration - Name="Debug|Win32" - OutputDirectory=".\Debug" - IntermediateDirectory=".\Debug" + Name="Release|Win32" + OutputDirectory=".\Release" + IntermediateDirectory=".\Release" ConfigurationType="1" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="FALSE" CharacterSet="2"> <Tool Name="VCCLCompilerTool" - Optimization="0" + InlineFunctionExpansion="2" ImproveFloatingPointConsistency="TRUE" - OptimizeForProcessor="2" - AdditionalIncludeDirectories="..\..\..\include,..\..\common" - PreprocessorDefinitions="WIN32,_DEBUG,_CONSOLE" - BasicRuntimeChecks="3" - RuntimeLibrary="3" + AdditionalIncludeDirectories="..\toolutil,..\..\common" + PreprocessorDefinitions="WIN32,NDEBUG,_CONSOLE" + StringPooling="TRUE" + RuntimeLibrary="2" + EnableFunctionLevelLinking="TRUE" DisableLanguageExtensions="TRUE" - PrecompiledHeaderFile=".\Debug/ieeetest.pch" - AssemblerListingLocation=".\Debug/" - ObjectFile=".\Debug/" - ProgramDataBaseFileName=".\Debug/" - BrowseInformation="1" + PrecompiledHeaderFile=".\Release/gencase.pch" + AssemblerListingLocation=".\Release/" + ObjectFile=".\Release/" + ProgramDataBaseFileName=".\Release/" WarningLevel="3" SuppressStartupBanner="TRUE" - DebugInformationFormat="4" CompileAs="0"/> <Tool - Name="VCCustomBuildTool"/> + Name="VCCustomBuildTool" + CommandLine="copy "$(TargetPath)" ..\..\..\bin +" + Outputs="..\..\..\bin\$(TargetFileName)"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icuucd.lib" - OutputFile=".\Debug/ieeetest.exe" - LinkIncremental="2" + OutputFile=".\Release/gencase.exe" + LinkIncremental="1" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\..\..\lib" - GenerateDebugInformation="TRUE" - ProgramDatabaseFile=".\Debug/ieeetest.pdb" + ProgramDatabaseFile=".\Release/gencase.pdb" SubSystem="1"/> <Tool Name="VCMIDLTool" - TypeLibraryName=".\Debug/ieeetest.tlb"/> + TypeLibraryName=".\Release/gencase.tlb"/> <Tool Name="VCPostBuildEventTool"/> <Tool @@ -61,53 +59,62 @@ Name="VCPreLinkEventTool"/> <Tool Name="VCResourceCompilerTool" - PreprocessorDefinitions="_DEBUG" + PreprocessorDefinitions="NDEBUG" Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> <Configuration - Name="Release|Win32" - OutputDirectory=".\Release" - IntermediateDirectory=".\Release" + Name="Debug|Win32" + OutputDirectory=".\Debug" + IntermediateDirectory=".\Debug" ConfigurationType="1" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="FALSE" CharacterSet="2"> <Tool Name="VCCLCompilerTool" - InlineFunctionExpansion="2" + Optimization="0" ImproveFloatingPointConsistency="TRUE" - AdditionalIncludeDirectories="..\..\include,..\..\source\common,..\..\..\include,..\..\common" - PreprocessorDefinitions="WIN32,NDEBUG,_CONSOLE" - StringPooling="TRUE" - RuntimeLibrary="2" - EnableFunctionLevelLinking="TRUE" + OptimizeForProcessor="2" + AdditionalIncludeDirectories="..\toolutil,..\..\common" + PreprocessorDefinitions="WIN32,_DEBUG,_CONSOLE" + BasicRuntimeChecks="3" + RuntimeLibrary="3" DisableLanguageExtensions="TRUE" - PrecompiledHeaderFile=".\Release/ieeetest.pch" - AssemblerListingLocation=".\Release/" - ObjectFile=".\Release/" - ProgramDataBaseFileName=".\Release/" + PrecompiledHeaderFile=".\Debug/gencase.pch" + AssemblerListingLocation=".\Debug/" + ObjectFile=".\Debug/" + ProgramDataBaseFileName=".\Debug/" + BrowseInformation="1" WarningLevel="3" SuppressStartupBanner="TRUE" + DebugInformationFormat="4" CompileAs="0"/> <Tool - Name="VCCustomBuildTool"/> + Name="VCCustomBuildTool" + CommandLine="copy "$(TargetPath)" ..\..\..\bin +" + Outputs="..\..\..\bin\$(TargetFileName)"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icuuc.lib" - OutputFile=".\Release/ieeetest.exe" - LinkIncremental="1" + OutputFile=".\Debug/gencase.exe" + LinkIncremental="2" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\..\..\lib" - ProgramDatabaseFile=".\Release/ieeetest.pdb" + GenerateDebugInformation="TRUE" + ProgramDatabaseFile=".\Debug/gencase.pdb" SubSystem="1"/> <Tool Name="VCMIDLTool" - TypeLibraryName=".\Release/ieeetest.tlb"/> + TypeLibraryName=".\Debug/gencase.tlb"/> <Tool Name="VCPostBuildEventTool"/> <Tool @@ -116,27 +123,38 @@ Name="VCPreLinkEventTool"/> <Tool Name="VCResourceCompilerTool" - PreprocessorDefinitions="NDEBUG" + PreprocessorDefinitions="_DEBUG" Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> </Configurations> + <References> + </References> <Files> <Filter Name="Source Files" - Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"> + Filter="c;cpp;rc"> + <File + RelativePath=".\gencase.c"> + </File> <File - RelativePath=".\ieeetest.cpp"> + RelativePath=".\store.c"> </File> </Filter> <Filter Name="Header Files" - Filter="h;hpp;hxx;hm;inl"> + Filter="h"> <File - RelativePath=".\ieeetest.h"> + RelativePath=".\gencase.h"> </File> </Filter> <Filter diff --git a/icuSources/tools/gencase/store.c b/icuSources/tools/gencase/store.c new file mode 100644 index 00000000..4746429c --- /dev/null +++ b/icuSources/tools/gencase/store.c @@ -0,0 +1,608 @@ +/* +******************************************************************************* +* +* Copyright (C) 2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: store.c +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2004aug28 +* created by: Markus W. Scherer +* +* Store Unicode case mapping properties efficiently for +* random access. +*/ + +#include <stdio.h> +#include <stdlib.h> +#include "unicode/utypes.h" +#include "unicode/uchar.h" +#include "unicode/ustring.h" +#include "cmemory.h" +#include "cstring.h" +#include "filestrm.h" +#include "utrie.h" +#include "unicode/udata.h" +#include "unewdata.h" +#include "propsvec.h" +#include "gencase.h" + +/* Unicode case mapping properties file format --------------------------------- + +The file format prepared and written here contains several data +structures that store indexes or data. + +Before the data contents described below, there are the headers required by +the udata API for loading ICU data. Especially, a UDataInfo structure +precedes the actual data. It contains platform properties values and the +file format version. + +The following is a description of format version 1 . + +The file contains the following structures: + + const int32_t indexes[i0] with values i0, i1, ...: + (see UCASE_IX_... constants for names of indexes) + + i0 indexLength; -- length of indexes[] (UCASE_IX_TOP) + i1 dataLength; -- length in bytes of the post-header data (incl. indexes[]) + i2 trieSize; -- size in bytes of the case mapping properties trie + i3 exceptionsLength; -- length in uint16_t of the exceptions array + + i4..i14 reservedIndexes; -- reserved values; 0 for now + + i15 maxFullLength; -- maximum length of a full case mapping/folding string + + + Serizalied trie, see utrie.h; + + const uint16_t exceptions[exceptionsLength]; + + +Trie data word: +Bits +if(exception) { + 15..4 unsigned exception index +} else { + if(not uncased) { + 15..6 signed delta to simple case mapping code point + (add delta to input code point) + } else { + 6 the code point is case-ignorable + (U+0307 is also case-ignorable but has an exception) + } + 5..4 0 normal character with cc=0 + 1 soft-dotted character + 2 cc=230 + 3 other cc +} + 3 exception + 2 case sensitive + 1..0 0 uncased + 1 lowercase + 2 uppercase + 3 titlecase + + +Exceptions: +A sub-array of the exceptions array is indexed by the exception index in a +trie word. +The sub-array consists of the following fields: + uint16_t excWord; + uint16_t optional values []; + UTF-16 strings for full (string) mappings for lowercase, case folding, uppercase, titlecase + +excWord: (see UCASE_EXC_...) +Bits + 15 conditional case folding + 14 conditional special casing +13..12 same as non-exception trie data bits 5..4 + moved here because the exception index needs more bits than the delta + 0 normal character with cc=0 + 1 soft-dotted character + 2 cc=230 + 3 other cc +11.. 9 reserved + 8 if set, then for each optional-value slot there are 2 uint16_t values + (high and low parts of 32-bit values) + instead of single ones + 7.. 0 bits for which optional value is present + +Optional-value slots: +0 lowercase mapping (code point) +1 case folding (code point) +2 uppercase mapping (code point) +3 titlecase mapping (code point) +4..6 reserved +7 there is at least one full (string) case mapping + the length of each is encoded in a nibble of this optional value, + and the strings follow this optional value in the same order: + lower/fold/upper/title + +For space saving, some values are not stored. Lookups are as follows: +- If special casing is conditional, then no full lower/upper/title mapping + strings are stored. +- If case folding is conditional, then no simple or full case foldings are + stored. +- Fall back in this order: + full (string) mapping -- if full mappings are used + simple (code point) mapping of the same type + simple fold->simple lower + simple title->simple upper + finally, the original code point (no mapping) + +----------------------------------------------------------------------------- */ + +/* UDataInfo cf. udata.h */ +static UDataInfo dataInfo={ + sizeof(UDataInfo), + 0, + + U_IS_BIG_ENDIAN, + U_CHARSET_FAMILY, + U_SIZEOF_UCHAR, + 0, + + /* dataFormat="cAsE" */ + { UCASE_FMT_0, UCASE_FMT_1, UCASE_FMT_2, UCASE_FMT_3 }, + { 1, 0, UTRIE_SHIFT, UTRIE_INDEX_SHIFT }, /* formatVersion */ + { 4, 0, 1, 0 } /* dataVersion */ +}; + +enum { + /* maximum number of exceptions expected */ + MAX_EXC_COUNT=1000 +}; + +/* exceptions values */ +static uint16_t exceptions[UCASE_MAX_EXCEPTIONS+100]; +static uint16_t exceptionsTop=0; +static Props excProps[MAX_EXC_COUNT]; +static uint16_t exceptionsCount=0; + +/* becomes indexes[UCASE_IX_MAX_FULL_LENGTH] */ +static int32_t maxFullLength=U16_MAX_LENGTH; + +/* -------------------------------------------------------------------------- */ + +extern void +setUnicodeVersion(const char *v) { + UVersionInfo version; + u_versionFromString(version, v); + uprv_memcpy(dataInfo.dataVersion, version, 4); +} + +/* store a character's properties ------------------------------------------- */ + +extern void +setProps(Props *p) { + UErrorCode errorCode; + uint32_t value, oldValue; + int32_t delta; + + /* get the non-UnicodeData.txt properties */ + value=oldValue=upvec_getValue(pv, p->code, 0); + + /* default: map to self */ + delta=0; + + if(p->gc==U_TITLECASE_LETTER) { + /* the Titlecase property is read late, from UnicodeData.txt */ + value|=UCASE_TITLE; + } + + if(p->upperCase!=0) { + /* uppercase mapping as delta if the character is lowercase */ + if((value&UCASE_TYPE_MASK)==UCASE_LOWER) { + delta=p->upperCase-p->code; + } else { + value|=UCASE_EXCEPTION; + } + } + if(p->lowerCase!=0) { + /* lowercase mapping as delta if the character is uppercase or titlecase */ + if((value&UCASE_TYPE_MASK)>=UCASE_UPPER) { + delta=p->lowerCase-p->code; + } else { + value|=UCASE_EXCEPTION; + } + } + if(p->upperCase!=p->titleCase) { + value|=UCASE_EXCEPTION; + } + if(p->specialCasing!=NULL) { + value|=UCASE_EXCEPTION; + } + if(p->caseFolding!=NULL) { + value|=UCASE_EXCEPTION; + } + + if(delta<UCASE_MIN_DELTA || UCASE_MAX_DELTA<delta) { + value|=UCASE_EXCEPTION; + } + + if(p->cc!=0) { + if(value&UCASE_DOT_MASK) { + fprintf(stderr, "gencase: a soft-dotted character has cc!=0\n"); + exit(U_INTERNAL_PROGRAM_ERROR); + } + if(p->cc==230) { + value|=UCASE_ABOVE; + } else { + value|=UCASE_OTHER_ACCENT; + } + } + + /* encode case-ignorable as delta==1 on uncased characters */ + if( + (value&UCASE_TYPE_MASK)==UCASE_NONE && + p->code!=0x307 && + ((U_MASK(p->gc)&(U_GC_MN_MASK|U_GC_ME_MASK|U_GC_CF_MASK|U_GC_LM_MASK|U_GC_SK_MASK))!=0 || + p->code==0x27 || p->code==0xad || p->code==0x2019) + ) { + /* + * We use one of the delta/exception bits, which works because we only + * store the case-ignorable flag for uncased characters. + * There is no delta for uncased characters (see checks above). + * If there is an exception for an uncased, case-ignorable character + * (although there should not be any case mappings if it's uncased) + * then we have a problem. + * There is one character which is case-ignorable but has an exception: + * U+0307 is uncased, Mn, has conditional special casing and + * is therefore handled in code instead. + */ + if(value&UCASE_EXCEPTION) { + fprintf(stderr, "gencase error: unable to encode case-ignorable for U+%04lx with exceptions\n", + (unsigned long)p->code); + exit(U_INTERNAL_PROGRAM_ERROR); + } + + delta=1; + } + + /* handle exceptions */ + if(value&UCASE_EXCEPTION) { + /* simply store exceptions for later processing and encoding */ + value|=(uint32_t)exceptionsCount<<UGENCASE_EXC_SHIFT; + uprv_memcpy(excProps+exceptionsCount, p, sizeof(*p)); + if(++exceptionsCount==MAX_EXC_COUNT) { + fprintf(stderr, "gencase: too many exceptions\n"); + exit(U_INDEX_OUTOFBOUNDS_ERROR); + } + } else { + /* store the simple case mapping delta */ + value|=((uint32_t)delta<<UCASE_DELTA_SHIFT)&UCASE_DELTA_MASK; + } + + errorCode=U_ZERO_ERROR; + if( value!=oldValue && + !upvec_setValue(pv, p->code, p->code+1, 0, value, 0xffffffff, &errorCode) + ) { + fprintf(stderr, "gencase error: unable to set case mapping values, code: %s\n", + u_errorName(errorCode)); + exit(errorCode); + } +} + +extern void +addCaseSensitive(UChar32 first, UChar32 last) { + UErrorCode errorCode=U_ZERO_ERROR; + if(!upvec_setValue(pv, first, last+1, 0, UCASE_SENSITIVE, UCASE_SENSITIVE, &errorCode)) { + fprintf(stderr, "gencase error: unable to set UCASE_SENSITIVE, code: %s\n", + u_errorName(errorCode)); + exit(errorCode); + } +} + +extern void +makeCaseClosure() { + /* TODO */ +} + +/* exceptions --------------------------------------------------------------- */ + +static UBool +fullMappingEqualsSimple(const UChar *s, UChar32 simple, UChar32 c) { + int32_t i, length; + UChar32 full; + + length=*s++; + if(length==0 || length>U16_MAX_LENGTH) { + return FALSE; + } + i=0; + U16_NEXT(s, i, length, full); + + if(simple==0) { + simple=c; /* UCD has no simple mapping if it's the same as the code point itself */ + } + return (UBool)(i==length && full==simple); +} + +static uint16_t +makeException(uint32_t value, Props *p) { + uint32_t slots[8]; + uint32_t slotBits; + uint16_t excWord, excIndex, excTop, i, count, length, fullLengths; + UBool doubleSlots; + + /* excIndex will be returned for storing in the trie word */ + excIndex=exceptionsTop; + if(excIndex>=UCASE_MAX_EXCEPTIONS) { + fprintf(stderr, "gencase error: too many exceptions words\n"); + exit(U_BUFFER_OVERFLOW_ERROR); + } + + excTop=excIndex+1; /* +1 for excWord which will be stored at excIndex */ + + /* copy and shift the soft-dotted bits */ + excWord=((uint16_t)value&UCASE_DOT_MASK)<<UCASE_EXC_DOT_SHIFT; + + /* update maxFullLength */ + if(p->specialCasing!=NULL) { + length=p->specialCasing->lowerCase[0]; + if(length>maxFullLength) { + maxFullLength=length; + } + length=p->specialCasing->upperCase[0]; + if(length>maxFullLength) { + maxFullLength=length; + } + length=p->specialCasing->titleCase[0]; + if(length>maxFullLength) { + maxFullLength=length; + } + } + if(p->caseFolding!=NULL) { + length=p->caseFolding->full[0]; + if(length>maxFullLength) { + maxFullLength=length; + } + } + + /* set the bits for conditional mappings */ + if(p->specialCasing!=NULL && p->specialCasing->isComplex) { + excWord|=UCASE_EXC_CONDITIONAL_SPECIAL; + p->specialCasing=NULL; + } + if(p->caseFolding!=NULL && p->caseFolding->simple==0 && p->caseFolding->full[0]==0) { + excWord|=UCASE_EXC_CONDITIONAL_FOLD; + p->caseFolding=NULL; + } + + /* + * Note: + * UCD stores no simple mappings when they are the same as the code point itself. + * SpecialCasing and CaseFolding do store simple mappings even if they are + * the same as the code point itself. + * Comparisons between simple regular mappings and simple special/folding + * mappings need to compensate for the difference by comparing with the + * original code point if a simple UCD mapping is missing (0). + */ + + /* remove redundant data */ + if(p->specialCasing!=NULL) { + /* do not store full mappings if they are the same as the simple ones */ + if(fullMappingEqualsSimple(p->specialCasing->lowerCase, p->lowerCase, p->code)) { + p->specialCasing->lowerCase[0]=0; + } + if(fullMappingEqualsSimple(p->specialCasing->upperCase, p->upperCase, p->code)) { + p->specialCasing->upperCase[0]=0; + } + if(fullMappingEqualsSimple(p->specialCasing->titleCase, p->titleCase, p->code)) { + p->specialCasing->titleCase[0]=0; + } + } + if( p->caseFolding!=NULL && + fullMappingEqualsSimple(p->caseFolding->full, p->caseFolding->simple, p->code) + ) { + p->caseFolding->full[0]=0; + } + + /* write the optional slots */ + slotBits=0; + count=0; + + if(p->lowerCase!=0) { + slots[count]=(uint32_t)p->lowerCase; + slotBits|=slots[count]; + ++count; + excWord|=U_MASK(UCASE_EXC_LOWER); + } + if( p->caseFolding!=NULL && + p->caseFolding->simple!=0 && + (p->lowerCase!=0 ? + p->caseFolding->simple!=p->lowerCase : + p->caseFolding->simple!=p->code) + ) { + slots[count]=(uint32_t)p->caseFolding->simple; + slotBits|=slots[count]; + ++count; + excWord|=U_MASK(UCASE_EXC_FOLD); + } + if(p->upperCase!=0) { + slots[count]=(uint32_t)p->upperCase; + slotBits|=slots[count]; + ++count; + excWord|=U_MASK(UCASE_EXC_UPPER); + } + if(p->upperCase!=p->titleCase) { + if(p->titleCase!=0) { + slots[count]=(uint32_t)p->titleCase; + } else { + slots[count]=(uint32_t)p->code; + } + slotBits|=slots[count]; + ++count; + excWord|=U_MASK(UCASE_EXC_TITLE); + } + + /* lengths of full case mapping strings, stored in the last slot */ + fullLengths=0; + if(p->specialCasing!=NULL) { + fullLengths=p->specialCasing->lowerCase[0]; + fullLengths|=p->specialCasing->upperCase[0]<<8; + fullLengths|=p->specialCasing->titleCase[0]<<12; + } + if(p->caseFolding!=NULL) { + fullLengths|=p->caseFolding->full[0]<<4; + } + if(fullLengths!=0) { + slots[count]=fullLengths; + slotBits|=slots[count]; + ++count; + excWord|=U_MASK(UCASE_EXC_FULL_MAPPINGS); + } + + /* write slots */ + doubleSlots=(UBool)(slotBits>0xffff); + if(!doubleSlots) { + for(i=0; i<count; ++i) { + exceptions[excTop++]=(uint16_t)slots[i]; + } + } else { + excWord|=UCASE_EXC_DOUBLE_SLOTS; + for(i=0; i<count; ++i) { + exceptions[excTop++]=(uint16_t)(slots[i]>>16); + exceptions[excTop++]=(uint16_t)slots[i]; + } + } + + /* write the full case mapping strings */ + if(p->specialCasing!=NULL) { + length=(uint16_t)p->specialCasing->lowerCase[0]; + u_memcpy((UChar *)exceptions+excTop, p->specialCasing->lowerCase+1, length); + excTop+=length; + } + if(p->caseFolding!=NULL) { + length=(uint16_t)p->caseFolding->full[0]; + u_memcpy((UChar *)exceptions+excTop, p->caseFolding->full+1, length); + excTop+=length; + } + if(p->specialCasing!=NULL) { + length=(uint16_t)p->specialCasing->upperCase[0]; + u_memcpy((UChar *)exceptions+excTop, p->specialCasing->upperCase+1, length); + excTop+=length; + + length=(uint16_t)p->specialCasing->titleCase[0]; + u_memcpy((UChar *)exceptions+excTop, p->specialCasing->titleCase+1, length); + excTop+=length; + } + + exceptionsTop=excTop; + + /* write the main exceptions word */ + exceptions[excIndex]=excWord; + + return excIndex; +} + +extern void +makeExceptions() { + uint32_t *row; + uint32_t value; + int32_t i; + uint16_t excIndex; + + i=0; + while((row=upvec_getRow(pv, i, NULL, NULL))!=NULL) { + value=*row; + if(value&UCASE_EXCEPTION) { + excIndex=makeException(value, excProps+(value>>UGENCASE_EXC_SHIFT)); + *row=(value&~(UGENCASE_EXC_MASK|UCASE_EXC_MASK))|(excIndex<<UCASE_EXC_SHIFT); + } + ++i; + } +} + +/* generate output data ----------------------------------------------------- */ + +extern void +generateData(const char *dataDir) { + static int32_t indexes[UCASE_IX_TOP]={ + UCASE_IX_TOP + }; + static uint8_t trieBlock[40000]; + + const uint32_t *row; + UChar32 start, limit; + int32_t i; + + UNewDataMemory *pData; + UNewTrie *pTrie; + UErrorCode errorCode=U_ZERO_ERROR; + int32_t trieSize; + long dataLength; + + pTrie=utrie_open(NULL, NULL, 20000, 0, 0, TRUE); + if(pTrie==NULL) { + fprintf(stderr, "gencase error: unable to create a UNewTrie\n"); + exit(U_MEMORY_ALLOCATION_ERROR); + } + + for(i=0; (row=upvec_getRow(pv, i, &start, &limit))!=NULL; ++i) { + if(!utrie_setRange32(pTrie, start, limit, *row, TRUE)) { + fprintf(stderr, "gencase error: unable to set trie value (overflow)\n"); + exit(U_BUFFER_OVERFLOW_ERROR); + } + } + + trieSize=utrie_serialize(pTrie, trieBlock, sizeof(trieBlock), NULL, TRUE, &errorCode); + if(U_FAILURE(errorCode)) { + fprintf(stderr, "error: utrie_serialize failed: %s (length %ld)\n", u_errorName(errorCode), (long)trieSize); + exit(errorCode); + } + + indexes[UCASE_IX_EXC_LENGTH]=exceptionsTop; + indexes[UCASE_IX_TRIE_SIZE]=trieSize; + indexes[UCASE_IX_LENGTH]=(int32_t)sizeof(indexes)+trieSize+2*exceptionsTop; + + indexes[UCASE_IX_MAX_FULL_LENGTH]=maxFullLength; + + if(beVerbose) { + printf("trie size in bytes: %5d\n", (int)trieSize); + printf("number of code points with exceptions: %5d\n", exceptionsCount); + printf("size in bytes of exceptions: %5d\n", 2*exceptionsTop); + printf("data size: %5d\n", (int)indexes[UCASE_IX_LENGTH]); + } + + /* write the data */ + pData=udata_create(dataDir, UCASE_DATA_TYPE, UCASE_DATA_NAME, &dataInfo, + haveCopyright ? U_COPYRIGHT_STRING : NULL, &errorCode); + if(U_FAILURE(errorCode)) { + fprintf(stderr, "gencase: unable to create data memory, %s\n", u_errorName(errorCode)); + exit(errorCode); + } + + udata_writeBlock(pData, indexes, sizeof(indexes)); + udata_writeBlock(pData, trieBlock, trieSize); + udata_writeBlock(pData, exceptions, 2*exceptionsTop); + + /* finish up */ + dataLength=udata_finish(pData, &errorCode); + if(U_FAILURE(errorCode)) { + fprintf(stderr, "gencase: error %d writing the output file\n", errorCode); + exit(errorCode); + } + + if(dataLength!=indexes[UCASE_IX_LENGTH]) { + fprintf(stderr, "gencase: data length %ld != calculated size %d\n", + dataLength, (int)indexes[UCASE_IX_LENGTH]); + exit(U_INTERNAL_PROGRAM_ERROR); + } + + utrie_close(pTrie); +} + +/* + * Hey, Emacs, please set the following: + * + * Local Variables: + * indent-tabs-mode: nil + * End: + * + */ diff --git a/icuSources/tools/genccode/Makefile.in b/icuSources/tools/genccode/Makefile.in index 355f4e89..cffd2dab 100644 --- a/icuSources/tools/genccode/Makefile.in +++ b/icuSources/tools/genccode/Makefile.in @@ -1,5 +1,5 @@ ## Makefile.in for ICU - tools/genccode -## Copyright (c) 1999-2003, International Business Machines Corporation and +## Copyright (c) 1999-2004, International Business Machines Corporation and ## others. All Rights Reserved. ## Steven R. Loomis @@ -16,20 +16,22 @@ subdir = tools/genccode ## +TARGET_STUB_NAME = genccode + SECTION = 8 -MANX_FILES = $(TARGET:$(EXEEXT)=).$(SECTION) +MANX_FILES = $(TARGET_STUB_NAME).$(SECTION) ALL_MAN_FILES = $(MANX_FILES) ## Extra files to remove for 'make clean' -CLEANFILES = *~ $(DEPS) $(RES_FILES) $(TEST_FILES) $(ALL_MAN_FILES) +CLEANFILES = *~ $(DEPS) $(ALL_MAN_FILES) ## Target information -TARGET = genccode$(EXEEXT) +TARGET = $(BINDIR)/$(TARGET_STUB_NAME)$(EXEEXT) CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common -I$(srcdir)/../toolutil $(BIR_CPPFLAGS) -LIBS = $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M) $(LIBICUTOOLUTIL) +LIBS = $(LIBICUTOOLUTIL) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M) OBJECTS = genccode.o @@ -51,11 +53,11 @@ distclean : distclean-local dist: dist-local check: all check-local -all-local: $(TARGET) $(RES_FILES) $(TRANSLIT_RES) $(TEST_FILES) $(ALL_MAN_FILES) +all-local: $(TARGET) $(ALL_MAN_FILES) install-local: all-local install-man $(MKINSTALLDIRS) $(DESTDIR)$(sbindir) - $(INSTALL) $(TARGET) $(DESTDIR)$(sbindir)/$(TARGET) + $(INSTALL) $(TARGET) $(DESTDIR)$(sbindir) # man page install-man: install-manx diff --git a/icuSources/tools/genccode/genccode.8.in b/icuSources/tools/genccode/genccode.8.in index 6632628d..add079ed 100644 --- a/icuSources/tools/genccode/genccode.8.in +++ b/icuSources/tools/genccode/genccode.8.in @@ -2,18 +2,21 @@ .\" .\" genccode.8: manual page for the gennames utility .\" -.\" Copyright (C) 2000 IBM, Inc. and others. +.\" Copyright (C) 2003-2004 IBM, Inc. and others. .\" -.TH GENCCODE 8 "19 November 2001" "ICU MANPAGE" "ICU @VERSION@ Manual" +.TH GENCCODE 8 "11 March 2004" "ICU MANPAGE" "ICU @VERSION@ Manual" .SH NAME .B genccode -\- generate C code from an ICU data file +\- generate C or platform specific assembly code from an ICU data file. .SH SYNOPSIS .B genccode [ .BR "\-h\fP, \fB\-?\fP, \fB\-\-help" ] [ +.BI "\-a\fP, \fB\-\-assembly" " name" +] +[ .BI "\-d\fP, \fB\-\-destdir" " destination" ] [ @@ -23,6 +26,9 @@ .BI "\-e\fP, \fB\-\-entrypoint" " name" ] [ +.BI "\-f\fP, \fB\-\-filename" " name" +] +[ .IR filename " .\|.\|." ] .SH DESCRIPTION @@ -37,6 +43,15 @@ replacing dots by underscores, and adding a .I .c file extension. .PP +If the \fB-a\fP option is used, platform specific assembly +code is generated instead of C code. +Most C compilers will accept both C and assembly files. +Instead of writing a filename with a +.I .c +file extension, a filename with a +.I .s +will be written instead. +.PP If .B genccode is called with no @@ -47,6 +62,11 @@ it terminates gracefully. .BR "\-h\fP, \fB\-?\fP, \fB\-\-help" Print help about usage and exit. .TP +.BI "\-a\fP, \fB\-\-assembly" " name" +Output assembly code instead of C code. +Use \fB-h\fP to see the list of available types of assembly to generate and +to specify for this option. +.TP .BI "\-d\fP, \fB\-\-destdir" " destination" Set the destination directory to .IR destination . @@ -66,6 +86,11 @@ indicated big endian data, and the letter .I l indicates little endian ones). .TP +.BI "\-f\fP, \fB\-\-filename" " name" +Normally, an ICU data file such as mydata.icu will be turned into mydata_icu.c and mydata_icu.o. +However, if this parameter was set to "somedata", the output files will be somedata.o and +somedata.c, respectively. +.TP .BI "\-e\fP, \fB\-\-entrypoint" " name" Set the data entry point (used for linking against the data in a shared library form) to @@ -78,4 +103,4 @@ option). .SH VERSION @VERSION@ .SH COPYRIGHT -Copyright (C) 2000-2001 IBM, Inc. and others. +Copyright (C) 2000-2004 IBM, Inc. and others. diff --git a/icuSources/tools/genccode/genccode.c b/icuSources/tools/genccode/genccode.c index 6b9fc166..60dfaf40 100644 --- a/icuSources/tools/genccode/genccode.c +++ b/icuSources/tools/genccode/genccode.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -22,7 +22,6 @@ #ifdef WIN32 # define VC_EXTRALEAN # define WIN32_LEAN_AND_MEAN -# define NOGDI # define NOUSER # define NOSERVICE # define NOIME @@ -31,9 +30,12 @@ #include <time.h> /* _M_IA64 should be defined in windows.h */ -#ifdef _M_IA64 +#if defined(_M_IA64) # define ICU_OBJECT_MACHINE_TYPE IMAGE_FILE_MACHINE_IA64 # define ICU_ENTRY_OFFSET 0 +#elif defined(_M_AMD64) +# define ICU_OBJECT_MACHINE_TYPE IMAGE_FILE_MACHINE_AMD64 +# define ICU_ENTRY_OFFSET 0 #else # define ICU_OBJECT_MACHINE_TYPE IMAGE_FILE_MACHINE_I386 # define ICU_ENTRY_OFFSET 1 @@ -49,6 +51,7 @@ #include "cstring.h" #include "filestrm.h" #include "toolutil.h" +#include "unicode/uclean.h" #include "uoptions.h" #define MAX_COLUMN ((uint32_t)(0xFFFFFFFFU)) @@ -64,6 +67,9 @@ static uint32_t column=MAX_COLUMN; static void writeCCode(const char *filename, const char *destdir); +static void +writeAssemblyCode(const char *filename, const char *destdir); + #ifdef CAN_GENERATE_OBJECTS static void writeObjectCode(const char *filename, const char *destdir); @@ -75,46 +81,159 @@ getOutFilename(const char *inFilename, const char *destdir, char *outFilename, c static void write8(FileStream *out, uint8_t byte); +static void +write32(FileStream *out, uint32_t byte); + #ifdef OS400 static void write8str(FileStream *out, uint8_t byte); #endif /* -------------------------------------------------------------------------- */ +enum { + kOptHelpH = 0, + kOptHelpQuestionMark, + kOptDestDir, + kOptName, + kOptEntryPoint, +#ifdef CAN_GENERATE_OBJECTS + kOptObject, +#endif + kOptFilename, + kOptAssembly +}; + +/* +Creating Template Files for New Platforms + +Let the cc compiler help you get started. +Compile this program + const unsigned int x[5] = {1, 2, 0xdeadbeef, 0xffffffff, 16}; +with the -S option to produce assembly output. + +For example, this will generate array.s: +gcc -S array.c + +This will produce a .s file that may look like this: + + .file "array.c" + .version "01.01" +gcc2_compiled.: + .globl x + .section .rodata + .align 4 + .type x,@object + .size x,20 +x: + .long 1 + .long 2 + .long -559038737 + .long -1 + .long 16 + .ident "GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)" + +which gives a starting point that will compile, and can be transformed +to become the template, generally with some consulting of as docs and +some experimentation. + +If you want ICU to automatically use this assembly, you should +specify "GENCCODE_ASSEMBLY=-a name" in the specific config/mh-* file, +where the name is the compiler or platform that you used in this +assemblyHeader data structure. +*/ +static const struct AssemblyType { + const char *name; + const char *header; + const char *beginLine; +} assemblyHeader[] = { + {"gcc", + ".globl %s\n" + "\t.section .rodata\n" + "\t.align 8\n" /* Either align 8 bytes or 2^8 (256) bytes. 8 bytes is needed. */ + "%s:\n\n", + + ".long " + }, + {"gcc-darwin", + /*"\t.section __TEXT,__text,regular,pure_instructions\n" + "\t.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32\n"*/ + ".globl _%s\n" + "\t.data\n" + "\t.const\n" + "\t.align 4\n" /* 1<<4 = 16 */ + "_%s:\n\n", + + ".long " + }, + {"gcc-cygwin", + ".globl _%s\n" + "\t.section .rodata\n" + "\t.align 8\n" /* Either align 8 bytes or 2^8 (256) bytes. 8 bytes is needed. */ + "_%s:\n\n", + + ".long " + }, + {"sun", + "\t.section \".rodata\"\n" + "\t.align 8\n" + ".globl %s\n" + "%s:\n", + + ".word " + }, + {"xlc", + ".globl %s{RO}\n" + "\t.toc\n" + "%s:\n" + "\t.csect %s{RO}, 4\n", + + ".long " + }, + {"aCC", + "\t.SPACE $TEXT$\n" + "\t.SUBSPA $LIT$\n" + "%s\n" + "\t.EXPORT %s\n" + "\t.ALIGN 16\n", + + ".WORD " + } +}; + +static int32_t assemblyHeaderIndex = -1; + static UOption options[]={ /*0*/UOPTION_HELP_H, UOPTION_HELP_QUESTION_MARK, UOPTION_DESTDIR, UOPTION_DEF("name", 'n', UOPT_REQUIRES_ARG), - UOPTION_DEF( "entrypoint", 'e', UOPT_REQUIRES_ARG) + UOPTION_DEF("entrypoint", 'e', UOPT_REQUIRES_ARG), #ifdef CAN_GENERATE_OBJECTS -/*5*/, UOPTION_DEF("object", 'o', UOPT_NO_ARG) +/*5*/UOPTION_DEF("object", 'o', UOPT_NO_ARG), #endif - + UOPTION_DEF("filename", 'f', UOPT_REQUIRES_ARG), + UOPTION_DEF("assembly", 'a', UOPT_REQUIRES_ARG) }; -char symPrefix[100]; - extern int main(int argc, char* argv[]) { UBool verbose = TRUE; + int32_t idx; U_MAIN_INIT_ARGS(argc, argv); - options[2].value = "."; + options[kOptDestDir].value = "."; /* read command line options */ argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), options); - symPrefix[0] = 0; - /* error handling, printing usage message */ if(argc<0) { fprintf(stderr, "error in command line argument \"%s\"\n", argv[-argc]); } - if(argc<0 || options[0].doesOccur || options[1].doesOccur) { + if(argc<0 || options[kOptHelpH].doesOccur || options[kOptHelpQuestionMark].doesOccur) { fprintf(stderr, "usage: %s [-options] filename1 filename2 ...\n" "\tread each binary input file and \n" @@ -128,16 +247,43 @@ main(int argc, char* argv[]) { #ifdef CAN_GENERATE_OBJECTS "\t-o or --object write a .obj file instead of .c\n" #endif + "\t-f or --filename Specify an alternate base filename. (default: symbolname_typ)\n" , argv[0]); + fprintf(stderr, + "\t-a or --assembly Create assembly file. (possible values are: "); + + fprintf(stderr, "%s", assemblyHeader[0].name); + for (idx = 1; idx < (int32_t)(sizeof(assemblyHeader)/sizeof(assemblyHeader[0])); idx++) { + fprintf(stderr, ", %s", assemblyHeader[idx].name); + } + fprintf(stderr, + ")\n"); } else { const char *message, *filename; void (*writeCode)(const char *, const char *); + + if(options[kOptAssembly].doesOccur) { + message="generating assembly code for %s\n"; + writeCode=&writeAssemblyCode; + for (idx = 0; idx < (int32_t)(sizeof(assemblyHeader)/sizeof(assemblyHeader[0])); idx++) { + if (uprv_strcmp(options[kOptAssembly].value, assemblyHeader[idx].name) == 0) { + assemblyHeaderIndex = idx; + break; + } + } + if (assemblyHeaderIndex < 0) { + fprintf(stderr, + "Assembly type \"%s\" is unknown.\n", options[kOptAssembly].value); + return -1; + } + } #ifdef CAN_GENERATE_OBJECTS - if(options[5].doesOccur) { + else if(options[kOptObject].doesOccur) { message="generating object code for %s\n"; writeCode=&writeObjectCode; - } else + } #endif + else { message="generating C code for %s\n"; writeCode=&writeCCode; @@ -148,16 +294,88 @@ main(int argc, char* argv[]) { fprintf(stdout, message, filename); } column=MAX_COLUMN; - writeCode(filename, options[2].value); + writeCode(filename, options[kOptDestDir].value); } } return 0; } +static void +writeAssemblyCode(const char *filename, const char *destdir) { + char entry[64]; + uint32_t buffer[1024]; + char *bufferStr = (char *)buffer; + FileStream *in, *out; + size_t i, length; + + in=T_FileStream_open(filename, "rb"); + if(in==NULL) { + fprintf(stderr, "genccode: unable to open input file %s\n", filename); + exit(U_FILE_ACCESS_ERROR); + } + + getOutFilename(filename, destdir, bufferStr, entry, ".s"); + out=T_FileStream_open(bufferStr, "w"); + if(out==NULL) { + fprintf(stderr, "genccode: unable to open output file %s\n", bufferStr); + exit(U_FILE_ACCESS_ERROR); + } + + if(options[kOptEntryPoint].doesOccur) { + uprv_strcpy(entry, options[kOptEntryPoint].value); + uprv_strcat(entry, "_dat"); + } + + /* turn dashes or dots in the entry name into underscores */ + length=uprv_strlen(entry); + for(i=0; i<length; ++i) { + if(entry[i]=='-' || entry[i]=='.') { + entry[i]='_'; + } + } + + sprintf(bufferStr, assemblyHeader[assemblyHeaderIndex].header, + entry, entry, entry, entry, + entry, entry, entry, entry); + T_FileStream_writeLine(out, bufferStr); + T_FileStream_writeLine(out, assemblyHeader[assemblyHeaderIndex].beginLine); + + for(;;) { + length=T_FileStream_read(in, buffer, sizeof(buffer)); + if(length==0) { + break; + } + if (length != sizeof(buffer)) { + /* pad with extra 0's when at the end of the file */ + for(i=0; i < (length % sizeof(uint32_t)); ++i) { + buffer[length+i] = 0; + } + } + for(i=0; i<(length/sizeof(buffer[0])); i++) { + write32(out, buffer[i]); + } + } + + T_FileStream_writeLine(out, "\n"); + + if(T_FileStream_error(in)) { + fprintf(stderr, "genccode: file read error while generating from file %s\n", filename); + exit(U_FILE_ACCESS_ERROR); + } + + if(T_FileStream_error(out)) { + fprintf(stderr, "genccode: file write error while generating from file %s\n", filename); + exit(U_FILE_ACCESS_ERROR); + } + + T_FileStream_close(out); + T_FileStream_close(in); +} + static void writeCCode(const char *filename, const char *destdir) { - char buffer[4096], entry[40]; + char buffer[4096], entry[64]; FileStream *in, *out; size_t i, length; @@ -167,7 +385,14 @@ writeCCode(const char *filename, const char *destdir) { exit(U_FILE_ACCESS_ERROR); } - getOutFilename(filename, destdir, buffer, entry, ".c"); + if(options[kOptName].doesOccur) { /* prepend 'icudt28_' */ + strcpy(entry, options[kOptName].value); + strcat(entry, "_"); + } else { + entry[0] = 0; + } + + getOutFilename(filename, destdir, buffer, entry+uprv_strlen(entry), ".c"); out=T_FileStream_open(buffer, "w"); if(out==NULL) { fprintf(stderr, "genccode: unable to open output file %s\n", buffer); @@ -181,7 +406,7 @@ writeCCode(const char *filename, const char *destdir) { entry[i]='_'; } } - + #ifdef OS400 /* TODO: Fix this once the compiler implements this feature. Keep in sync with udatamem.c @@ -202,8 +427,8 @@ writeCCode(const char *filename, const char *destdir) { "const struct {\n" " double bogus;\n" " const char *bytes; \n" - "} %s%s={ 0.0, \n", - symPrefix, entry); + "} %s={ 0.0, \n", + entry); T_FileStream_writeLine(out, buffer); for(;;) { @@ -226,8 +451,8 @@ writeCCode(const char *filename, const char *destdir) { "const struct {\n" " double bogus;\n" " uint8_t bytes[%ld]; \n" - "} %s%s={ 0.0, {\n", - (long)T_FileStream_size(in), symPrefix, entry); + "} %s={ 0.0, {\n", + (long)T_FileStream_size(in), entry); T_FileStream_writeLine(out, buffer); for(;;) { @@ -273,7 +498,7 @@ writeObjectCode(const char *filename, const char *destdir) { char longNames[100]; } symbolNames; FileStream *in, *out; - size_t i, entryLength, length, size; + DWORD i, entryLength, length, size; in=T_FileStream_open(filename, "rb"); if(in==NULL) { @@ -285,12 +510,12 @@ writeObjectCode(const char *filename, const char *destdir) { entry[0]='_'; getOutFilename(filename, destdir, buffer, entry+ICU_ENTRY_OFFSET, ".obj"); - if(options[4].doesOccur) { - uprv_strcpy(entry+ICU_ENTRY_OFFSET, options[4].value); + if(options[kOptEntryPoint].doesOccur) { + uprv_strcpy(entry+ICU_ENTRY_OFFSET, options[kOptEntryPoint].value); uprv_strcat(entry, "_dat"); } /* turn dashes in the entry name into underscores */ - entryLength=uprv_strlen(entry); + entryLength=(int32_t)uprv_strlen(entry); for(i=0; i<entryLength; ++i) { if(entry[i]=='-') { entry[i]='_'; @@ -359,7 +584,7 @@ writeObjectCode(const char *filename, const char *destdir) { if(length==0) { break; } - T_FileStream_write(out, buffer, length); + T_FileStream_write(out, buffer, (int32_t)length); } /* write the symbol table */ @@ -404,9 +629,14 @@ getOutFilename(const char *inFilename, const char *destdir, char *outFilename, c if(suffix==NULL) { /* the filename does not have a suffix */ uprv_strcpy(entryName, inFilename); - uprv_strcpy(outFilename, inFilename); + if(options[kOptFilename].doesOccur) { + uprv_strcpy(outFilename, options[kOptFilename].value); + } else { + uprv_strcpy(outFilename, inFilename); + } uprv_strcat(outFilename, newSuffix); } else { + char *saveOutFilename = outFilename; /* copy basename */ while(inFilename<suffix) { if(*inFilename=='-') { @@ -430,11 +660,73 @@ getOutFilename(const char *inFilename, const char *destdir, char *outFilename, c *entryName=0; - /* add ".c" */ - uprv_strcpy(outFilename, newSuffix); + if(options[kOptFilename].doesOccur) { + uprv_strcpy(saveOutFilename, options[kOptFilename].value); + uprv_strcat(saveOutFilename, newSuffix); + } else { + /* add ".c" */ + uprv_strcpy(outFilename, newSuffix); + } } } +static void +write32(FileStream *out, uint32_t bitField) { + int32_t i; + char bitFieldStr[64]; /* This is more bits than needed for a 32-bit number */ + char *s = bitFieldStr; + uint8_t *ptrIdx = (uint8_t *)&bitField; + static const char hexToStr[16] = { + '0','1','2','3', + '4','5','6','7', + '8','9','A','B', + 'C','D','E','F' + }; + + /* write the value, possibly with comma and newline */ + if(column==MAX_COLUMN) { + /* first byte */ + column=1; + } else if(column<32) { + *(s++)=','; + ++column; + } else { + *(s++)='\n'; + uprv_strcpy(s, assemblyHeader[assemblyHeaderIndex].beginLine); + s+=uprv_strlen(s); + column=1; + } + + if (bitField < 10) { + /* It's a small number. Don't waste the space for 0x */ + *(s++)=hexToStr[bitField]; + } + else { + int seenNonZero = 0; /* This is used to remove leading zeros */ + + *(s++)='0'; + *(s++)='x'; + + /* This creates a 32-bit field */ +#if U_IS_BIG_ENDIAN + for (i = 0; i < sizeof(uint32_t); i++) +#else + for (i = sizeof(uint32_t)-1; i >= 0 ; i--) +#endif + { + uint8_t value = ptrIdx[i]; + if (value || seenNonZero) { + *(s++)=hexToStr[value>>4]; + *(s++)=hexToStr[value&0xF]; + seenNonZero = 1; + } + } + } + + *(s++)=0; + T_FileStream_writeLine(out, bitFieldStr); +} + static void write8(FileStream *out, uint8_t byte) { char s[4]; @@ -471,14 +763,17 @@ static void write8str(FileStream *out, uint8_t byte) { char s[8]; - sprintf(s, "\\x%02X", byte); + if (byte > 7) + sprintf(s, "\\x%X", byte); + else + sprintf(s, "\\%X", byte); /* write the value, possibly with comma and newline */ if(column==MAX_COLUMN) { /* first byte */ column=1; T_FileStream_writeLine(out, "\""); - } else if(column<16) { + } else if(column<24) { ++column; } else { T_FileStream_writeLine(out, "\"\n\""); @@ -488,4 +783,3 @@ write8str(FileStream *out, uint8_t byte) { } #endif - diff --git a/icuSources/tools/genccode/genccode.dsp b/icuSources/tools/genccode/genccode.dsp index 15927507..dae00742 100644 --- a/icuSources/tools/genccode/genccode.dsp +++ b/icuSources/tools/genccode/genccode.dsp @@ -114,7 +114,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /Op /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /Op /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -149,7 +149,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /Op /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /Op /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe diff --git a/icuSources/tools/genccode/genccode.vcproj b/icuSources/tools/genccode/genccode.vcproj index c571d0f8..7379af12 100644 --- a/icuSources/tools/genccode/genccode.vcproj +++ b/icuSources/tools/genccode/genccode.vcproj @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding = "Windows-1252"?> +<?xml version="1.0" encoding="Windows-1252"?> <VisualStudioProject ProjectType="Visual C++" - Version="7.00" + Version="7.10" Name="genccode" SccProjectName="" SccLocalPath=""> @@ -36,17 +36,14 @@ CompileAs="0"/> <Tool Name="VCCustomBuildTool" - CommandLine="copy $(TargetPath) ..\..\..\bin + CommandLine="copy "$(TargetPath)" ..\..\..\bin " - Outputs="..\..\..\bin\$(InputName).exe"/> + Outputs="..\..\..\bin\$(TargetFileName)"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icuuc.lib icutu.lib" OutputFile=".\Release/genccode.exe" LinkIncremental="1" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\toolutil\Release,..\..\..\lib" ProgramDatabaseFile=".\Release/genccode.pdb" SubSystem="1"/> <Tool @@ -64,8 +61,14 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> <Configuration Name="Debug|Win32" @@ -94,17 +97,14 @@ CompileAs="0"/> <Tool Name="VCCustomBuildTool" - CommandLine="copy $(TargetPath) ..\..\..\bin + CommandLine="copy "$(TargetPath)" ..\..\..\bin " - Outputs="..\..\..\bin\$(InputName).exe"/> + Outputs="..\..\..\bin\$(TargetFileName)"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icuucd.lib icutud.lib" OutputFile=".\Debug/genccode.exe" LinkIncremental="2" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\toolutil\Debug,..\..\..\lib" GenerateDebugInformation="TRUE" ProgramDatabaseFile=".\Debug/genccode.pdb" SubSystem="1"/> @@ -123,10 +123,18 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> </Configurations> + <References> + </References> <Files> <Filter Name="Source Files" diff --git a/icuSources/tools/gencmn/Makefile.in b/icuSources/tools/gencmn/Makefile.in index 4f853814..905c173f 100644 --- a/icuSources/tools/gencmn/Makefile.in +++ b/icuSources/tools/gencmn/Makefile.in @@ -1,5 +1,5 @@ ## Makefile.in for ICU - tools/gencmn -## Copyright (c) 1999-2003, International Business Machines Corporation and +## Copyright (c) 1999-2004, International Business Machines Corporation and ## others. All Rights Reserved. ## Steven R. Loomis @@ -16,18 +16,21 @@ subdir = tools/gencmn ## +TARGET_STUB_NAME = gencmn +DECMN_STUB_NAME = decmn + SECTION = 8 -MANX_FILES = $(TARGET:$(EXEEXT)=).$(SECTION) $(DECMN:$(EXEEXT)=).$(SECTION) +MANX_FILES = $(TARGET_STUB_NAME).$(SECTION) $(DECMN_STUB_NAME).$(SECTION) ALL_MAN_FILES = $(MANX_FILES) ## Extra files to remove for 'make clean' -CLEANFILES = *~ mkmap.tmp $(DEPS) $(RES_FILES) $(TEST_FILES) $(DECMN_DEP) $(ALL_MAN_FILES) +CLEANFILES = *~ $(DEPS) $(DECMN_DEP) $(ALL_MAN_FILES) ## Target information -TARGET = gencmn$(EXEEXT) -DECMN = decmn$(EXEEXT) +TARGET = $(BINDIR)/$(TARGET_STUB_NAME)$(EXEEXT) +DECMN = $(BINDIR)/$(DECMN_STUB_NAME)$(EXEEXT) CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common -I$(srcdir)/../toolutil $(BIR_CPPFLAGS) LIBS = $(LIBICUTOOLUTIL) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M) @@ -54,12 +57,12 @@ distclean : distclean-local dist: dist-local check: all check-local -all-local: $(TARGET) $(RES_FILES) $(TRANSLIT_RES) $(TEST_FILES) $(DECMN) $(ALL_MAN_FILES) +all-local: $(TARGET) $(DECMN) $(ALL_MAN_FILES) install-local: all-local install-man $(MKINSTALLDIRS) $(DESTDIR)$(sbindir) - $(INSTALL) $(TARGET) $(DESTDIR)$(sbindir)/$(TARGET) - $(INSTALL) $(DECMN) $(DESTDIR)$(sbindir)/$(DECMN) + $(INSTALL) $(TARGET) $(DESTDIR)$(sbindir) + $(INSTALL) $(DECMN) $(DESTDIR)$(sbindir) dist-local: @@ -88,6 +91,9 @@ install-manx: $(MANX_FILES) $(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man$(SECTION) $(INSTALL_DATA) $? $(DESTDIR)$(mandir)/man$(SECTION) +# This line is needed to serialize builds when the gmake -j option is used. +$(DECMN:$(EXEEXT)=).$(SECTION): $(TARGET:$(EXEEXT)=).$(SECTION) + %.$(SECTION): $(srcdir)/%.$(SECTION).in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status @@ -101,3 +107,4 @@ ifneq ($(patsubst %clean,,$(MAKECMDGOALS)),) -include $(DECMN_DEP) endif endif + diff --git a/icuSources/tools/gencmn/decmn.c b/icuSources/tools/gencmn/decmn.c index 32bba2ef..49643c9a 100644 --- a/icuSources/tools/gencmn/decmn.c +++ b/icuSources/tools/gencmn/decmn.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2000-2003, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -23,6 +23,7 @@ #include <stdio.h> #include <stdlib.h> #include "unicode/utypes.h" +#include "unicode/putil.h" #include "unicode/udata.h" #include "uoptions.h" #include "cstring.h" diff --git a/icuSources/tools/gencmn/decmn.dsp b/icuSources/tools/gencmn/decmn.dsp index eb1e3dd4..7a7b6636 100644 --- a/icuSources/tools/gencmn/decmn.dsp +++ b/icuSources/tools/gencmn/decmn.dsp @@ -114,7 +114,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /MD /Za /W4 /GX /Zi /O2 /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MD /Za /W4 /GX /Zi /O2 /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -149,7 +149,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /MDd /Za /W4 /Gm /GX /Zi /Od /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MDd /Za /W4 /Gm /GX /Zi /Od /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe diff --git a/icuSources/tools/gencmn/decmn.vcproj b/icuSources/tools/gencmn/decmn.vcproj index 4bd79c57..3d0d1d4e 100644 --- a/icuSources/tools/gencmn/decmn.vcproj +++ b/icuSources/tools/gencmn/decmn.vcproj @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding = "Windows-1252"?> +<?xml version="1.0" encoding="Windows-1252"?> <VisualStudioProject ProjectType="Visual C++" - Version="7.00" + Version="7.10" Name="decmn" SccProjectName="" SccLocalPath=""> @@ -12,8 +12,8 @@ <Configurations> <Configuration Name="Release|Win32" - OutputDirectory=".\Release" - IntermediateDirectory=".\Release" + OutputDirectory=".\decmn_Win32_Release" + IntermediateDirectory=".\decmn_Win32_Release" ConfigurationType="1" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="FALSE" @@ -28,31 +28,28 @@ RuntimeLibrary="2" EnableFunctionLevelLinking="TRUE" DisableLanguageExtensions="TRUE" - PrecompiledHeaderFile=".\Release/decmn.pch" - AssemblerListingLocation=".\Release/" - ObjectFile=".\Release/" - ProgramDataBaseFileName=".\Release/" + PrecompiledHeaderFile=".\decmn_Win32_Release/decmn.pch" + AssemblerListingLocation=".\decmn_Win32_Release/" + ObjectFile=".\decmn_Win32_Release/" + ProgramDataBaseFileName=".\decmn_Win32_Release/" WarningLevel="4" SuppressStartupBanner="TRUE" CompileAs="0"/> <Tool Name="VCCustomBuildTool" - CommandLine="copy $(TargetPath) ..\..\..\bin + CommandLine="copy "$(TargetPath)" ..\..\..\bin " - Outputs="..\..\..\bin\$(InputName).exe"/> + Outputs="..\..\..\bin\$(TargetFileName)"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icuuc.lib icutu.lib" - OutputFile=".\Release/decmn.exe" + OutputFile=".\decmn_Win32_Release/decmn.exe" LinkIncremental="1" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\..\..\lib" - ProgramDatabaseFile=".\Release/decmn.pdb" + ProgramDatabaseFile=".\decmn_Win32_Release/decmn.pdb" SubSystem="1"/> <Tool Name="VCMIDLTool" - TypeLibraryName=".\Release/decmn.tlb"/> + TypeLibraryName=".\decmn_Win32_Release/decmn.tlb"/> <Tool Name="VCPostBuildEventTool"/> <Tool @@ -65,13 +62,19 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> <Configuration Name="Debug|Win32" - OutputDirectory=".\Debug" - IntermediateDirectory=".\Debug" + OutputDirectory=".\decmn_Win32_Debug" + IntermediateDirectory=".\decmn_Win32_Debug" ConfigurationType="1" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="FALSE" @@ -86,10 +89,10 @@ BasicRuntimeChecks="3" RuntimeLibrary="3" DisableLanguageExtensions="TRUE" - PrecompiledHeaderFile=".\Debug/decmn.pch" - AssemblerListingLocation=".\Debug/" - ObjectFile=".\Debug/" - ProgramDataBaseFileName=".\Debug/" + PrecompiledHeaderFile=".\decmn_Win32_Debug/decmn.pch" + AssemblerListingLocation=".\decmn_Win32_Debug/" + ObjectFile=".\decmn_Win32_Debug/" + ProgramDataBaseFileName=".\decmn_Win32_Debug/" BrowseInformation="1" WarningLevel="4" SuppressStartupBanner="TRUE" @@ -97,23 +100,20 @@ CompileAs="0"/> <Tool Name="VCCustomBuildTool" - CommandLine="copy $(TargetPath) ..\..\..\bin + CommandLine="copy "$(TargetPath)" ..\..\..\bin " - Outputs="..\..\..\bin\$(InputName).exe"/> + Outputs="..\..\..\bin\$(TargetFileName)"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icuucd.lib icutud.lib" - OutputFile=".\Debug/decmn.exe" + OutputFile=".\decmn_Win32_Debug/decmn.exe" LinkIncremental="2" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\..\..\lib" GenerateDebugInformation="TRUE" - ProgramDatabaseFile=".\Debug/decmn.pdb" + ProgramDatabaseFile=".\decmn_Win32_Debug/decmn.pdb" SubSystem="1"/> <Tool Name="VCMIDLTool" - TypeLibraryName=".\Debug/decmn.tlb"/> + TypeLibraryName=".\decmn_Win32_Debug/decmn.tlb"/> <Tool Name="VCPostBuildEventTool"/> <Tool @@ -126,10 +126,18 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> </Configurations> + <References> + </References> <Files> <Filter Name="Source Files" diff --git a/icuSources/tools/gencmn/gencmn.c b/icuSources/tools/gencmn/gencmn.c index 7c4f2cbd..5e83a5c6 100644 --- a/icuSources/tools/gencmn/gencmn.c +++ b/icuSources/tools/gencmn/gencmn.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1999-2001, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -25,6 +25,7 @@ #include "cstring.h" #include "filestrm.h" #include "toolutil.h" +#include "unicode/uclean.h" #include "unewdata.h" #include "uoptions.h" @@ -34,6 +35,42 @@ #define COMMON_DATA_NAME U_ICUDATA_NAME #define DATA_TYPE "dat" +/* ICU package data file format (.dat files) ------------------------------- *** + +Description of the data format after the usual ICU data file header +(UDataInfo etc.). + +Format version 1 + +A .dat package file contains a simple Table of Contents of item names, +followed by the items themselves: + +1. ToC table + +uint32_t count; - number of items +UDataOffsetTOCEntry entry[count]; - pair of uint32_t values per item: + uint32_t nameOffset; - offset of the item name + uint32_t dataOffset; - offset of the item data +both are byte offsets from the beginning of the data + +2. item name strings + +All item names are stored as char * strings in one block between the ToC table +and the data items. + +3. data items + +The data items are stored following the item names block. +Each data item is 16-aligned. +The data items are stored in the sorted order of their names. + +Therefore, the top of the name strings block is the offset of the first item, +the length of the last item is the difference between its offset and +the .dat file length, and the length of all previous items is the difference +between its offset and the next one. + +----------------------------------------------------------------------------- */ + /* UDataInfo cf. udata.h */ static const UDataInfo dataInfo={ sizeof(UDataInfo), @@ -61,6 +98,7 @@ typedef struct { static File files[MAX_FILE_COUNT]; static uint32_t fileCount=0; +static UBool embed = FALSE; /* prototypes --------------------------------------------------------------- */ @@ -73,6 +111,12 @@ allocString(uint32_t length); static int compareFiles(const void *file1, const void *file2); +static char * +pathToFullPath(const char *path); + +/* map non-tree separator (such as '\') to tree separator ('/') inplace. */ +static void +fixDirToTreePath(char *s); /* -------------------------------------------------------------------------- */ static UOption options[]={ @@ -85,7 +129,9 @@ static UOption options[]={ /*6*/ UOPTION_DEF( "name", 'n', UOPT_REQUIRES_ARG), /*7*/ UOPTION_DEF( "type", 't', UOPT_REQUIRES_ARG), /*8*/ UOPTION_DEF( "source", 'S', UOPT_NO_ARG), -/*9*/ UOPTION_DEF( "entrypoint", 'e', UOPT_REQUIRES_ARG) +/*9*/ UOPTION_DEF( "entrypoint", 'e', UOPT_REQUIRES_ARG), +/*10*/UOPTION_SOURCEDIR, +/*11*/UOPTION_DEF( "embed", 'E', UOPT_NO_ARG) }; static char *symPrefix = NULL; @@ -107,6 +153,7 @@ main(int argc, char* argv[]) { options[4].value=u_getDataDirectory(); options[6].value=COMMON_DATA_NAME; options[7].value=DATA_TYPE; + options[10].value="."; argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), options); /* error handling, printing usage message */ @@ -117,6 +164,11 @@ main(int argc, char* argv[]) { } else if(argc<2) { argc=-1; } + + if(options[11].doesOccur) { + embed = TRUE; + } + if(argc<0 || options[0].doesOccur || options[1].doesOccur) { FILE *where = argc < 0 ? stderr : stdout; @@ -125,11 +177,11 @@ main(int argc, char* argv[]) { * required supported string length is 509 bytes. */ fprintf(where, - "%csage: %s [ -h, -?, --help ] [ -v, --verbose ] [ -c, --copyright ] [ -C, --comment comment ] [ -d, --destdir dir ] [ -n, --name filename ] [ -t, --type filetype ] [ -S, --source tocfile ] [ -e, --entrypoint name ] [ maxsize ] [ [ -f ] filename ]\n", argc < 0 ? 'u' : 'U', *argv); + "%csage: %s [ -h, -?, --help ] [ -v, --verbose ] [ -c, --copyright ] [ -C, --comment comment ] [ -d, --destdir dir ] [ -n, --name filename ] [ -t, --type filetype ] [ -S, --source tocfile ] [ -e, --entrypoint name ] maxsize listfile\n", argc < 0 ? 'u' : 'U', *argv); if (options[0].doesOccur || options[1].doesOccur) { fprintf(where, "\n" - "Read the list file (default: standard input) and create a common data\n" - "file from specified files; omit any larger than maxsize.\n"); + "Read the list file (default: standard input) and create a common data\n" + "file from specified files. Omit any files larger than maxsize, if maxsize > 0.\n"); fprintf(where, "\n" "Options:\n" "\t-h, -?, --help this usage text\n" @@ -193,7 +245,14 @@ main(int argc, char* argv[]) { } /* add the file */ - +#if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR) + { + char *t; + while((t = uprv_strchr(line,U_FILE_ALT_SEP_CHAR))) { + *t = U_FILE_SEP_CHAR; + } + } +#endif addFile(getLongPathname(line), sourceTOC, verbose); } @@ -277,11 +336,17 @@ main(int argc, char* argv[]) { length=files[i].fileSize; if (nread != files[i].fileSize) { - fprintf(stderr, "gencmn: unable to read %s properly (got %ld/%ld byte%s)\n", files[i].pathname, (long)nread, (long)files[i].fileSize, files[i].fileSize == 1 ? "" : "s"); + fprintf(stderr, "gencmn: unable to read %s properly (got %ld/%ld byte%s)\n", files[i].pathname, (long)nread, (long)files[i].fileSize, files[i].fileSize == 1 ? "" : "s"); exit(U_FILE_ACCESS_ERROR); } } + /* pad to 16-align the last file (cleaner, avoids growing .dat files in icuswap) */ + length&=0xf; + if(length!=0) { + udata_writePadding(out, 16-length); + } + /* finish */ udata_finish(out, &errorCode); if(U_FAILURE(errorCode)) { @@ -325,16 +390,18 @@ main(int argc, char* argv[]) { #if 0 - symPrefix = (char *) uprv_malloc(uprv_strlen(entrypointName) + 2); - - /* test for NULL */ - if (symPrefix == NULL) { - sprintf(buffer, "U_MEMORY_ALLOCATION_ERROR"); - exit(U_MEMORY_ALLOCATION_ERROR); - } - - uprv_strcpy(symPrefix, entrypointName); - uprv_strcat(symPrefix, "_"); + if(!embed) { + symPrefix = (char *) uprv_malloc(uprv_strlen(entrypointName) + 2); + + /* test for NULL */ + if (symPrefix == NULL) { + sprintf(buffer, "U_MEMORY_ALLOCATION_ERROR"); + exit(U_MEMORY_ALLOCATION_ERROR); + } + + uprv_strcpy(symPrefix, entrypointName); + uprv_strcat(symPrefix, "_"); + } #endif /* write the source file */ @@ -360,7 +427,7 @@ main(int argc, char* argv[]) { sprintf( buffer, - "U_EXPORT const struct {\n" + "U_EXPORT struct {\n" " uint16_t headerSize;\n" " uint8_t magic1, magic2;\n" " UDataInfo info;\n" @@ -410,6 +477,7 @@ static void addFile(const char *filename, UBool sourceTOC, UBool verbose) { char *s; uint32_t length; + char *fullPath = NULL; if(fileCount==MAX_FILE_COUNT) { fprintf(stderr, "gencmn: too many files, maximum is %d\n", MAX_FILE_COUNT); @@ -419,38 +487,53 @@ addFile(const char *filename, UBool sourceTOC, UBool verbose) { if(!sourceTOC) { FileStream *file; + fullPath = pathToFullPath(filename); + /* store the pathname */ - length = (uint32_t)(uprv_strlen(filename) + 1); - s=allocString(length); - uprv_memcpy(s, filename, length); - files[fileCount].pathname=s; + if(!embed) { + length = (uint32_t)(uprv_strlen(filename) + 1 + uprv_strlen(options[6].value) + 1); + s=allocString(length); + uprv_strcpy(s, options[6].value); + uprv_strcat(s, U_TREE_ENTRY_SEP_STRING); + uprv_strcat(s, filename); + } else { + /* compatibility mode */ + const char *base; + base = findBasename(filename); + length = (uint32_t)(uprv_strlen(base) + 1); + s=allocString(length); + uprv_memcpy(s, base, length); + } /* get the basename */ - s=(char *)findBasename(s); + fixDirToTreePath(s); files[fileCount].basename=s; - length = (uint32_t)(uprv_strlen(s) + 1); files[fileCount].basenameLength=length; + + files[fileCount].pathname=fullPath; + basenameTotal+=length; /* try to open the file */ - file=T_FileStream_open(filename, "rb"); + file=T_FileStream_open(fullPath, "rb"); if(file==NULL) { - fprintf(stderr, "gencmn: unable to open listed file %s\n", filename); + fprintf(stderr, "gencmn: unable to open listed file %s\n", fullPath); exit(U_FILE_ACCESS_ERROR); } /* get the file length */ length=T_FileStream_size(file); if(T_FileStream_error(file) || length<=20) { - fprintf(stderr, "gencmn: unable to get length of listed file %s\n", filename); + fprintf(stderr, "gencmn: unable to get length of listed file %s\n", fullPath); exit(U_FILE_ACCESS_ERROR); } + T_FileStream_close(file); /* do not add files that are longer than maxSize */ if(maxSize && length>maxSize) { if (verbose) { - printf("%s ignored (size %ld > %ld)\n", filename, (long)length, (long)maxSize); + printf("%s ignored (size %ld > %ld)\n", fullPath, (long)length, (long)maxSize); } return; } @@ -458,17 +541,30 @@ addFile(const char *filename, UBool sourceTOC, UBool verbose) { } else { char *t; + if(embed) { + filename = findBasename(filename); + } /* get and store the basename */ - filename=findBasename(filename); - length = (uint32_t)(uprv_strlen(filename) + 1); - s=allocString(length); - uprv_memcpy(s, filename, length); + if(!embed) { + /* need to include the package name */ + length = (uint32_t)(uprv_strlen(filename) + 1 + uprv_strlen(options[6].value) + 1); + s=allocString(length); + uprv_strcpy(s, options[6].value); + uprv_strcat(s, U_TREE_ENTRY_SEP_STRING); + uprv_strcat(s, filename); + } else { + length = (uint32_t)(uprv_strlen(filename) + 1); + s=allocString(length); + uprv_memcpy(s, filename, length); + } + fixDirToTreePath(s); files[fileCount].basename=s; + /* turn the basename into an entry point name and store in the pathname field */ t=files[fileCount].pathname=allocString(length); while(--length>0) { - if(*s=='.' || *s=='-') { + if(*s=='.' || *s=='-' || *s=='/') { *t='_'; } else { *t=*s; @@ -478,7 +574,6 @@ addFile(const char *filename, UBool sourceTOC, UBool verbose) { } *t=0; } - ++fileCount; } @@ -496,12 +591,71 @@ allocString(uint32_t length) { return p; } +static char * +pathToFullPath(const char *path) { + int32_t length; + int32_t newLength; + char *fullPath; + int32_t n; + + length = (uint32_t)(uprv_strlen(path) + 1); + newLength = (length + 1 + (int32_t)uprv_strlen(options[10].value)); + fullPath = uprv_malloc(newLength); + if(options[10].doesOccur) { + uprv_strcpy(fullPath, options[10].value); + uprv_strcat(fullPath, U_FILE_SEP_STRING); + } else { + fullPath[0] = 0; + } + n = (int32_t)uprv_strlen(fullPath); + uprv_strcat(fullPath, path); + + if(!embed) { +#if (U_FILE_ALT_SEP_CHAR != U_TREE_ENTRY_SEP_CHAR) +#if (U_FILE_ALT_SEP_CHAR != U_FILE_SEP_CHAR) + /* replace tree separator (such as '/') with file sep char (such as ':' or '\\') */ + for(;fullPath[n];n++) { + if(fullPath[n] == U_FILE_ALT_SEP_CHAR) { + fullPath[n] = U_FILE_SEP_CHAR; + } + } +#endif +#endif +#if (U_FILE_SEP_CHAR != U_TREE_ENTRY_SEP_CHAR) + /* replace tree separator (such as '/') with file sep char (such as ':' or '\\') */ + for(;fullPath[n];n++) { + if(fullPath[n] == U_TREE_ENTRY_SEP_CHAR) { + fullPath[n] = U_FILE_SEP_CHAR; + } + } +#endif + } + return fullPath; +} + static int compareFiles(const void *file1, const void *file2) { /* sort by basename */ return uprv_strcmp(((File *)file1)->basename, ((File *)file2)->basename); } +static void +fixDirToTreePath(char *s) +{ +#if (U_FILE_SEP_CHAR != U_TREE_ENTRY_SEP_CHAR) || ((U_FILE_ALT_SEP_CHAR != U_FILE_SEP_CHAR) && (U_FILE_ALT_SEP_CHAR != U_TREE_ENTRY_SEP_CHAR)) + char *t; +#endif +#if (U_FILE_SEP_CHAR != U_TREE_ENTRY_SEP_CHAR) + for(t=s;t=uprv_strchr(t,U_FILE_SEP_CHAR);) { + *t = U_TREE_ENTRY_SEP_CHAR; + } +#endif +#if (U_FILE_ALT_SEP_CHAR != U_FILE_SEP_CHAR) && (U_FILE_ALT_SEP_CHAR != U_TREE_ENTRY_SEP_CHAR) + for(t=s;t=uprv_strchr(t,U_FILE_ALT_SEP_CHAR);) { + *t = U_TREE_ENTRY_SEP_CHAR; + } +#endif +} /* * Hey, Emacs, please set the following: * diff --git a/icuSources/tools/gencmn/gencmn.dsp b/icuSources/tools/gencmn/gencmn.dsp index 52da680d..b62ec3ad 100644 --- a/icuSources/tools/gencmn/gencmn.dsp +++ b/icuSources/tools/gencmn/gencmn.dsp @@ -115,7 +115,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -150,7 +150,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe diff --git a/icuSources/tools/gencmn/gencmn.vcproj b/icuSources/tools/gencmn/gencmn.vcproj index 4e48dd22..8e51fbd3 100644 --- a/icuSources/tools/gencmn/gencmn.vcproj +++ b/icuSources/tools/gencmn/gencmn.vcproj @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding = "Windows-1252"?> +<?xml version="1.0" encoding="Windows-1252"?> <VisualStudioProject ProjectType="Visual C++" - Version="7.00" + Version="7.10" Name="gencmn" SccProjectName="" SccLocalPath=""> @@ -37,17 +37,14 @@ CompileAs="0"/> <Tool Name="VCCustomBuildTool" - CommandLine="copy $(TargetPath) ..\..\..\bin + CommandLine="copy "$(TargetPath)" ..\..\..\bin " - Outputs="..\..\..\bin\$(InputName).exe"/> + Outputs="..\..\..\bin\$(TargetFileName)"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icuuc.lib icutu.lib" OutputFile=".\Release/gencmn.exe" LinkIncremental="1" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\toolutil\Release,..\..\..\lib" ProgramDatabaseFile=".\Release/gencmn.pdb" SubSystem="1"/> <Tool @@ -65,8 +62,14 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> <Configuration Name="Debug|Win32" @@ -97,17 +100,14 @@ CompileAs="0"/> <Tool Name="VCCustomBuildTool" - CommandLine="copy $(TargetPath) ..\..\..\bin + CommandLine="copy "$(TargetPath)" ..\..\..\bin " - Outputs="..\..\..\bin\$(InputName).exe"/> + Outputs="..\..\..\bin\$(TargetFileName)"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icuucd.lib icutud.lib" OutputFile=".\Debug/gencmn.exe" LinkIncremental="2" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\toolutil\Debug,..\..\..\lib" GenerateDebugInformation="TRUE" ProgramDatabaseFile=".\Debug/gencmn.pdb" SubSystem="1"/> @@ -126,10 +126,18 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> </Configurations> + <References> + </References> <Files> <Filter Name="Source Files" diff --git a/icuSources/tools/gencnval/Makefile.in b/icuSources/tools/gencnval/Makefile.in index 79c18d9e..dfe91aa4 100644 --- a/icuSources/tools/gencnval/Makefile.in +++ b/icuSources/tools/gencnval/Makefile.in @@ -1,5 +1,5 @@ ## Makefile.in for ICU - tools/gencnval -## Copyright (c) 1999-2003, International Business Machines Corporation and +## Copyright (c) 1999-2004, International Business Machines Corporation and ## others. All Rights Reserved. ## Steven R. Loomi @@ -16,23 +16,19 @@ subdir = tools/gencnval ## -SECTION = 1 - -MANX_FILES = $(TARGET:$(EXEEXT)=).$(SECTION) -MAN5_FILES = convrtrs.txt.5 $(srcdir)/cnvalias.dat.5 +TARGET_STUB_NAME = gencnval -GENERATED_MAN_FILES = $(TARGET).$(SECTION) convrtrs.txt.5 +SECTION = 1 -ALL_MAN_FILES = $(MANX_FILES) $(MAN5_FILES) +MANX_FILES = $(TARGET_STUB_NAME).$(SECTION) -ICUDATADIR=$(top_builddir)/data/ -CONVRTRSFILE=$(top_srcdir)/../data/convrtrs.txt +ALL_MAN_FILES = $(MANX_FILES) ## Extra files to remove for 'make clean' -CLEANFILES = *~ $(GENERATED_MAN_FILES) $(DEPS) $(RES_FILES) $(TEST_FILES) +CLEANFILES = *~ $(ALL_MAN_FILES) $(DEPS) ## Target information -TARGET = gencnval$(EXEEXT) +TARGET = $(BINDIR)/$(TARGET_STUB_NAME)$(EXEEXT) CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common -I$(srcdir)/../toolutil LIBS = $(LIBICUTOOLUTIL) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M) @@ -43,9 +39,9 @@ DEPS = $(OBJECTS:.o=.d) ## List of phony targets -.PHONY : all all-local install install-local clean clean-local \ +.PHONY : all all-local install install-local clean clean-local \ distclean distclean-local dist dist-local check \ -check-local build-data install-man install-man5 install-manx +check-local install-man install-manx ## Clear suffix list .SUFFIXES : @@ -58,11 +54,11 @@ distclean : distclean-local dist: dist-local check: all check-local -all-local: $(TARGET) $(ALL_MAN_FILES) build-data +all-local: $(TARGET) $(ALL_MAN_FILES) -install-local: all-local build-data install-man +install-local: all-local install-man $(MKINSTALLDIRS) $(DESTDIR)$(bindir) - $(INSTALL) $(TARGET) $(DESTDIR)$(bindir)/$(TARGET) + $(INSTALL) $(TARGET) $(DESTDIR)$(bindir) dist-local: @@ -84,10 +80,7 @@ $(TARGET) : $(OBJECTS) $(LINK.cc) $(OUTOPT)$@ $^ $(LIBS) # man page -install-man: install-man5 install-manx -install-man5: $(MAN5_FILES) - $(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man5 - $(INSTALL_DATA) $? $(DESTDIR)$(mandir)/man5 +install-man: install-manx install-manx: $(MANX_FILES) $(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man$(SECTION) $(INSTALL_DATA) $? $(DESTDIR)$(mandir)/man$(SECTION) @@ -95,9 +88,6 @@ install-manx: $(MANX_FILES) %.$(SECTION): $(srcdir)/%.$(SECTION).in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status -%.5: $(srcdir)/%.5.in - cd $(top_builddir) \ - && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status # only on linux probably ? #$(TARGET).ps: $(TARGET).$(SECTION) diff --git a/icuSources/tools/gencnval/cnvalias.dat.5 b/icuSources/tools/gencnval/cnvalias.dat.5 deleted file mode 100644 index 3bd7b6da..00000000 --- a/icuSources/tools/gencnval/cnvalias.dat.5 +++ /dev/null @@ -1,3 +0,0 @@ -.\" Hey, Emacs! This is -*-nroff-*- you know... -.so man5/convrtrs.txt.5 - diff --git a/icuSources/tools/gencnval/convrtrs.txt.5.in b/icuSources/tools/gencnval/convrtrs.txt.5.in deleted file mode 100644 index 18a7c3b8..00000000 --- a/icuSources/tools/gencnval/convrtrs.txt.5.in +++ /dev/null @@ -1,131 +0,0 @@ -.\" Hey, Emacs! This is -*-nroff-*- you know... -.\" -.\" convrtrs.txt.5: manual page for the convrtrs.txt file -.\" -.\" Copyright (C) 2000-2002 IBM, Inc. and others. -.\" -.\" Manual page by Yves Arrouye <yves@realnames.com>. -.\" -.TH CONVRTRS.TXT 5 "22 July 2002" "ICU MANPAGE" "ICU @VERSION@ Manual" -.SH NAME -.B convrtrs.txt -\- ICU converters aliases file -.br -.B cnvalias.icu -\- binary ICU converters aliases file -.SH DESCRIPTION -The file -.B convrtrs.txt -lists the names of the converters that ICU can handle, along with -their known aliases. ICU can open a converter given either its real name or -any of its aliases. -.B convrtrs.txt -is read by -.BR gencnval (1) -in order to generate the binary data that ICU uses to represent the converters -aliases information. -.PP -Each converter and its aliases are described on a separate lines; fields -on each line are separated by white space. The order of records in -.B convrtrs.txt -is significant: if a given name appears multiple times, the last one prevails. -Names of converters and aliases are compared without considering case; the -characters dash (U+002D HYPHEN-MINUS), underscore (U+005F LOW LINE), and -space (U+0020 SPACE) are also ignored during comparison -(even though spaces cannot be used in -.B convrtrs.txt -since white space is significant as a field delimiter). -Thus the names -.BR UTF-8 , -.BR utf_8 , -and -.BR "Utf 8" -are equivalent converters names. -.PP -The format of -.B convrtrs.txt -can be described by the following BNF grammar: -.PP -.RS -.nf -converters ::= tags { converter } -converter ::= name [ tags ] { alias } -alias ::= name [ tags ] -tags ::= '{' { tag } '}' -tag ::= standard{*} -comment ::= '#' \fIanything\fP -.fi -.RE -.PP -Line continuation and comment sytax are similar to the GNU make syntax. -Any lines beginning with whitespace (e.g. U+0020 SPACE or U+0009 HORIZONTAL -TABULATION) are presumed to be a continuation of the previous line. -.PP -The file must start with a list of recognized tags. These tags are used to -get the correct converter implementation based on the defined standard tag. -For instance, Shift-JIS on an IBM platform may be different from Shift-JIS -on a Windows platform. -.PP -A -.I name -can use any character other than white space and the '{' and '#' delimiters. -In practice, names are usually restricted to the set of uppercase and -lowercase latin letters plus arabic digits, the dash, the underscore, -and the colon characters. It is recommended to follow this convention -when naming new converters or their aliases. -.PP -A -.I comment -starts with the pound character '#' and ends with the current -line. Comments are ignored. -.PP -The -.I name -of a given -.I converter -must match its algorithmic name if the converter is algorithmic, or -its file name if the converter is table-driven. The table for the -converter -.B ibm-912 -for example, is expected to be in the -.B ibm-912.cnv -file. -An -.I alias -has no such restriction, as aliases are just arbitrary names -associated to a given converter. -.PP -The presence of a -.I tag -after a converter or alias name means that this name is associated to -a given standard set of names. Two well-known such standards are the -.B MIME -and -.B IANA -registries of names. The default ICU -.B convrtrs.txt -file already uses these tags. -These tags must be declared at the beginning of the file. -Names appropriate for a given standard can be retrieved -programmatically by using the ucnv_getStandardName() or the -ucnv_openStandardNames() function. The asterisk (U+002A) is -used to note which standard name is the default, and the -preceding alias is returned by ucnv_getStandardName(). A standard -tag may have multiple aliases recognized by the same standard for -the same converter name. -.SH CAVEATS -The -.B convrtrs.txt -file is not directly read by ICU. It must be transformed into a binary -file by -.BR gencnval (1) -first. Also, depending on the way ICU was packaged, even the resulting -.B cnvalias.icu -file may not be read by ICU. Please refer to the ICU manual for more -information on which files are effectively read by ICU at runtime, and -how to produce them. -.SH COPYRIGHT -Copyright (C) 2000-2002 IBM, Inc. and others. -.SH SEE ALSO -.BR gencnval (1), -.BR pkgdata (1) diff --git a/icuSources/tools/gencnval/gencnval.1.in b/icuSources/tools/gencnval/gencnval.1.in index e7ca76c1..e9e65964 100644 --- a/icuSources/tools/gencnval/gencnval.1.in +++ b/icuSources/tools/gencnval/gencnval.1.in @@ -2,11 +2,12 @@ .\" .\" gencnval.1: manual page for the gencnval utility .\" -.\" Copyright (C) 2000 IBM, Inc. and others. +.\" Copyright (C) 2000-2004 IBM, Inc. and others. .\" .\" Manual page by Yves Arrouye <yves@realnames.com>. +.\" Manual page by George Rhoten .\" -.TH GENCNVAL 1 "16 April 2002" "ICU MANPAGE" "ICU @VERSION@ Manual" +.TH GENCNVAL 1 "11 March 2004" "ICU MANPAGE" "ICU @VERSION@ Manual" .SH NAME .B gencnval \- compile the converters aliases file @@ -16,6 +17,9 @@ .BR "\-h\fP, \fB\-?\fP, \fB\-\-help" ] [ +.BR "\-v\fP, \fB\-\-verbose" +] +[ .BR "\-c\fP, \fB\-\-copyright" ] [ @@ -32,7 +36,7 @@ converts the ICU aliases file .I converterfile into the binary file -.BR cnvalias.dat . +.BR cnvalias.icu . This binary file can then be read directly by ICU, or used by .BR pkgdata (1) for incorporation into a larger archive or library. @@ -47,6 +51,10 @@ file is used. .BR "\-h\fP, \fB\-?\fP, \fB\-\-help" Print help about usage and exit. .TP +.BR "\-v\fP, \fB\-\-verbose" +Display verbose output. This information can include information about +conflicting aliases and the converters the aliases resolve to. +.TP .BR "\-c\fP, \fB\-\-copyright" Include a copyright notice in the binary data. .TP @@ -71,14 +79,13 @@ important to make sure that it is present if .B ICU_DATA is set. .SH FILES -.TP \w'\fB@thesysconfdir@/@PACKAGE@/convrtrs.txt'u+3n -.B @thesysconfdir@/@PACKAGE@/convrtrs.txt -Description of ICU's converters and their aliases. +.TP \w'\fB@PACKAGE@/source/data/mappings/convrtrs.txt'u+3n +.B @PACKAGE@/source/data/mappings/convrtrs.txt +Description of ICU's converters and their aliases. This data file is not +normally installed, and it is available as a part of ICU source code. .SH VERSION @VERSION@ .SH COPYRIGHT -Copyright (C) 2000-2002 IBM, Inc. and others. +Copyright (C) 2000-2004 IBM, Inc. and others. .SH SEE ALSO -.BR convrtrs.txt (5) -.br .BR pkgdata (1) diff --git a/icuSources/tools/gencnval/gencnval.c b/icuSources/tools/gencnval/gencnval.c index a81ee51e..bc38e9ca 100644 --- a/icuSources/tools/gencnval/gencnval.c +++ b/icuSources/tools/gencnval/gencnval.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -28,7 +28,9 @@ #include "ucnv_io.h" #include "cmemory.h" #include "cstring.h" +#include "uinvchar.h" #include "filestrm.h" +#include "unicode/uclean.h" #include "unewdata.h" #include "uoptions.h" @@ -133,7 +135,7 @@ static uint16_t aliasListsSize = 0; /* Were the standard tags declared before the aliases. */ static UBool standardTagsUsed = FALSE; static UBool verbose = FALSE; -static int32_t lineNum = 1; +static int lineNum = 1; /* prototypes --------------------------------------------------------------- */ @@ -156,7 +158,7 @@ static uint16_t addConverter(const char *converter); static char * -allocString(StringBlock *block, uint32_t length); +allocString(StringBlock *block, const char *s, int32_t length); static uint16_t addToKnownAliases(const char *alias); @@ -213,7 +215,7 @@ main(int argc, char* argv[]) { U_MAIN_INIT_ARGS(argc, argv); /* preset then read command line options */ - options[3].value=options[4].value=u_getDataDirectory(); + options[DESTDIR].value=options[SOURCEDIR].value=u_getDataDirectory(); argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), options); /* error handling, printing usage message */ @@ -243,10 +245,12 @@ main(int argc, char* argv[]) { if(argc>=2) { path=argv[1]; } else { - path=options[4].value; + path=options[SOURCEDIR].value; if(path!=NULL && *path!=0) { - char *end = pathBuf+uprv_strlen(pathBuf); + char *end; + uprv_strcpy(pathBuf, path); + end = uprv_strchr(pathBuf, 0); if(*(end-1)!=U_FILE_SEP_CHAR) { *(end++)=U_FILE_SEP_CHAR; } @@ -274,8 +278,8 @@ main(int argc, char* argv[]) { T_FileStream_close(in); /* create the output file */ - out=udata_create(options[3].value, DATA_TYPE, U_ICUDATA_NAME "_" DATA_NAME, &dataInfo, - options[2].doesOccur ? U_COPYRIGHT_STRING : NULL, &errorCode); + out=udata_create(options[DESTDIR].value, DATA_TYPE, DATA_NAME, &dataInfo, + options[COPYRIGHT].doesOccur ? U_COPYRIGHT_STRING : NULL, &errorCode); if(U_FAILURE(errorCode)) { fprintf(stderr, "gencnval: unable to open output file - error %s\n", u_errorName(errorCode)); exit(errorCode); @@ -307,7 +311,7 @@ parseFile(FileStream *in) { /* Add the empty tag, which is for untagged aliases */ getTagNumber("", 0); getTagNumber(ALL_TAG_STR, 3); - allocString(&stringBlock, 1); + allocString(&stringBlock, "", 0); /* read the list of aliases */ while (validParse) { @@ -410,9 +414,7 @@ parseLine(const char *line) { /* store the converter name */ length=(uint16_t)(limit-start); - converter=allocString(&stringBlock, length+1); - uprv_memcpy(converter, line+start, length); - converter[length]=0; + converter=allocString(&stringBlock, line+start, length); /* add the converter to the converter table */ cnv=addConverter(converter); @@ -448,9 +450,7 @@ parseLine(const char *line) { addAlias(alias, ALL_TAG_NUM, cnv, TRUE); } else { - alias=allocString(&stringBlock, length+1); - uprv_memcpy(alias, line+start, length); - alias[length]=0; + alias=allocString(&stringBlock, line+start, length); addAlias(alias, ALL_TAG_NUM, cnv, FALSE); } addToKnownAliases(alias); @@ -526,9 +526,7 @@ getTagNumber(const char *tag, uint16_t tagLen) { } /* allocate a new entry in the tag table */ - atag = allocString(&tagBlock, tagLen + 1); - uprv_memcpy(atag, tag, tagLen); - atag[tagLen] = 0; + atag = allocString(&tagBlock, tag, tagLen); if (standardTagsUsed) { fprintf(stderr, "error(line %d): Tag \"%s\" is not declared at the beginning of the alias table.\n", @@ -557,7 +555,6 @@ static void addOfficialTaggedStandards(char *line, int32_t lineLen) { char *atag; char *tag = strchr(line, '{') + 1; - uint16_t tagSize; static const char WHITESPACE[] = " \t"; if (tagCount > UCNV_NUM_RESERVED_TAGS) { @@ -570,11 +567,8 @@ addOfficialTaggedStandards(char *line, int32_t lineLen) { while (tag != NULL) { /* printf("Adding original tag \"%s\"\n", tag);*/ - tagSize = strlen(tag) + 1; /* allocate a new entry in the tag table */ - - atag = allocString(&tagBlock, tagSize); - uprv_memcpy(atag, tag, tagSize); + atag = allocString(&tagBlock, tag, -1); /* add the tag to the tag table */ tags[tagCount++].tag = (uint16_t)((atag - tagStore) >> 1); @@ -990,16 +984,40 @@ writeAliasTable(UNewDataMemory *out) { } static char * -allocString(StringBlock *block, uint32_t length) { - /* The (length&1) is used to keep the addresses on a 16-bit boundary */ - uint32_t top=block->top + length + (length&1); +allocString(StringBlock *block, const char *s, int32_t length) { + uint32_t top; char *p; + if(length<0) { + length=(int32_t)uprv_strlen(s); + } + + /* + * add 1 for the terminating NUL + * and round up (+1 &~1) + * to keep the addresses on a 16-bit boundary + */ + top=block->top + (uint32_t)((length + 1 + 1) & ~1); + if(top >= block->max) { fprintf(stderr, "error(line %d): out of memory\n", lineNum); exit(U_MEMORY_ALLOCATION_ERROR); } + + /* get the pointer and copy the string */ p = block->store + block->top; + uprv_memcpy(p, s, length); + p[length] = 0; /* NUL-terminate it */ + if((length & 1) == 0) { + p[length + 1] = 0; /* set the padding byte */ + } + + /* check for invariant characters now that we have a NUL-terminated string for easy output */ + if(!uprv_isInvariantString(p, length)) { + fprintf(stderr, "error(line %d): the name %s contains not just invariant characters\n", lineNum, p); + exit(U_INVALID_TABLE_FORMAT); + } + block->top = top; return p; } @@ -1010,7 +1028,7 @@ compareAliases(const void *alias1, const void *alias2) { int result = ucnv_compareNames(GET_ALIAS_STR(*(uint16_t*)alias1), GET_ALIAS_STR(*(uint16_t*)alias2)); if (!result) { /* Sort the shortest first */ - return uprv_strlen(GET_ALIAS_STR(*(uint16_t*)alias1)) - uprv_strlen(GET_ALIAS_STR(*(uint16_t*)alias2)); + return (int)uprv_strlen(GET_ALIAS_STR(*(uint16_t*)alias1)) - (int)uprv_strlen(GET_ALIAS_STR(*(uint16_t*)alias2)); } return result; } diff --git a/icuSources/tools/gencnval/gencnval.dsp b/icuSources/tools/gencnval/gencnval.dsp index d8a7d09d..12e2154f 100644 --- a/icuSources/tools/gencnval/gencnval.dsp +++ b/icuSources/tools/gencnval/gencnval.dsp @@ -115,7 +115,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -150,7 +150,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe diff --git a/icuSources/tools/gencnval/gencnval.vcproj b/icuSources/tools/gencnval/gencnval.vcproj index 61527c8c..5c6d5235 100644 --- a/icuSources/tools/gencnval/gencnval.vcproj +++ b/icuSources/tools/gencnval/gencnval.vcproj @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding = "Windows-1252"?> +<?xml version="1.0" encoding="Windows-1252"?> <VisualStudioProject ProjectType="Visual C++" - Version="7.00" + Version="7.10" Name="gencnval" SccProjectName="" SccLocalPath=""> @@ -37,17 +37,14 @@ CompileAs="0"/> <Tool Name="VCCustomBuildTool" - CommandLine="copy $(TargetPath) ..\..\..\bin + CommandLine="copy "$(TargetPath)" ..\..\..\bin " - Outputs="..\..\..\bin\$(InputName).exe"/> + Outputs="..\..\..\bin\$(TargetFileName)"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icuuc.lib icutu.lib" OutputFile=".\Release/gencnval.exe" LinkIncremental="1" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\toolutil\Release,..\..\..\lib" ProgramDatabaseFile=".\Release/gencnval.pdb" SubSystem="1"/> <Tool @@ -65,8 +62,14 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> <Configuration Name="Debug|Win32" @@ -97,17 +100,14 @@ CompileAs="0"/> <Tool Name="VCCustomBuildTool" - CommandLine="copy $(TargetPath) ..\..\..\bin + CommandLine="copy "$(TargetPath)" ..\..\..\bin " - Outputs="..\..\..\bin\$(InputName).exe"/> + Outputs="..\..\..\bin\$(TargetFileName)"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icuucd.lib icutud.lib" OutputFile=".\Debug/gencnval.exe" LinkIncremental="2" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\toolutil\Debug,..\..\..\lib" GenerateDebugInformation="TRUE" ProgramDatabaseFile=".\Debug/gencnval.pdb" SubSystem="1"/> @@ -126,10 +126,18 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> </Configurations> + <References> + </References> <Files> <Filter Name="Source Files" diff --git a/icuSources/tools/gendraft/DeprecatedApi.txt b/icuSources/tools/gendraft/DeprecatedApi.txt new file mode 100644 index 00000000..b6a8527a --- /dev/null +++ b/icuSources/tools/gendraft/DeprecatedApi.txt @@ -0,0 +1,225 @@ +ubrk.h UBRK_TITLE ICU 2.8 Use the word break iterator for titlecasing for Unicode 4 and later. +ucol.h ucol_getLocale ICU 2.8 Use ucol_getLocaleByType instead +uloc.h ULOC_REQUESTED_LOCALE ICU 2.8 +ures.h RES_NONE ICU 2.6 Use the URES_ constant instead. +ures.h RES_STRING ICU 2.6 Use the URES_ constant instead. +ures.h RES_BINARY ICU 2.6 Use the URES_ constant instead. +ures.h RES_TABLE ICU 2.6 Use the URES_ constant instead. +ures.h RES_ALIAS ICU 2.6 Use the URES_ constant instead. +ures.h RES_INT ICU 2.6 Use the URES_ constant instead. +ures.h RES_ARRAY ICU 2.6 Use the URES_ constant instead. +ures.h RES_INT_VECTOR ICU 2.6 Use the URES_ constant instead. +ures.h RES_RESERVED ICU 2.6 Not used. +ures.h ures_countArrayItems ICU 2.8 User ures_getSize instead +ures.h ures_getLocale ICU 2.8 Use ures_getLocaleByType instead. +ures.h ures_getVersionNumber ICU 2.8 Use ures_getVersion instead. +utf_old.h (null) ICU 2.4. Use the macros in utf.h, utf16.h, utf8.h instead. +utf_old.h UTF16_APPEND_CHAR_SAFE ICU 2.4. Use U16_APPEND instead, see utf_old.h. +utf_old.h UTF16_APPEND_CHAR_UNSAFE ICU 2.4. Renamed to U16_APPEND_UNSAFE, see utf_old.h. +utf_old.h UTF16_ARRAY_SIZE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF16_BACK_1_SAFE ICU 2.4. Renamed to U16_BACK_1, see utf_old.h. +utf_old.h UTF16_BACK_1_UNSAFE ICU 2.4. Renamed to U16_BACK_1_UNSAFE, see utf_old.h. +utf_old.h UTF16_BACK_N_SAFE ICU 2.4. Renamed to U16_BACK_N, see utf_old.h. +utf_old.h UTF16_BACK_N_UNSAFE ICU 2.4. Renamed to U16_BACK_N_UNSAFE, see utf_old.h. +utf_old.h UTF16_CHAR_LENGTH ICU 2.4. Renamed to U16_LENGTH, see utf_old.h. +utf_old.h UTF16_FWD_1_SAFE ICU 2.4. Renamed to U16_FWD_1, see utf_old.h. +utf_old.h UTF16_FWD_1_UNSAFE ICU 2.4. Renamed to U16_FWD_1_UNSAFE, see utf_old.h. +utf_old.h UTF16_FWD_N_SAFE ICU 2.4. Renamed to U16_FWD_N, see utf_old.h. +utf_old.h UTF16_FWD_N_UNSAFE ICU 2.4. Renamed to U16_FWD_N_UNSAFE, see utf_old.h. +utf_old.h UTF16_GET_CHAR_SAFE ICU 2.4. Use U16_GET instead, see utf_old.h. +utf_old.h UTF16_GET_CHAR_UNSAFE ICU 2.4. Renamed to U16_GET_UNSAFE, see utf_old.h. +utf_old.h UTF16_GET_PAIR_VALUE ICU 2.4. Renamed to U16_GET_SUPPLEMENTARY, see utf_old.h. +utf_old.h UTF16_IS_LEAD ICU 2.4. Renamed to U16_IS_LEAD, see utf_old.h. +utf_old.h UTF16_IS_SINGLE ICU 2.4. Renamed to U16_IS_SINGLE, see utf_old.h. +utf_old.h UTF16_IS_TRAIL ICU 2.4. Renamed to U16_IS_TRAIL, see utf_old.h. +utf_old.h UTF16_LEAD ICU 2.4. Renamed to U16_LEAD, see utf_old.h. +utf_old.h UTF16_MAX_CHAR_LENGTH ICU 2.4. Renamed to U16_MAX_LENGTH, see utf_old.h. +utf_old.h UTF16_NEED_MULTIPLE_UCHAR ICU 2.4. Use U16_LENGTH or test ((uint32_t)(c)>0xffff) instead, see utf_old.h. +utf_old.h UTF16_NEXT_CHAR_SAFE ICU 2.4. Use U16_NEXT instead, see utf_old.h. +utf_old.h UTF16_NEXT_CHAR_UNSAFE ICU 2.4. Renamed to U16_NEXT_UNSAFE, see utf_old.h. +utf_old.h UTF16_PREV_CHAR_SAFE ICU 2.4. Use U16_PREV instead, see utf_old.h. +utf_old.h UTF16_PREV_CHAR_UNSAFE ICU 2.4. Renamed to U16_PREV_UNSAFE, see utf_old.h. +utf_old.h UTF16_SET_CHAR_LIMIT_SAFE ICU 2.4. Renamed to U16_SET_CP_LIMIT, see utf_old.h. +utf_old.h UTF16_SET_CHAR_LIMIT_UNSAFE ICU 2.4. Renamed to U16_SET_CP_LIMIT_UNSAFE, see utf_old.h. +utf_old.h UTF16_SET_CHAR_START_SAFE ICU 2.4. Renamed to U16_SET_CP_START, see utf_old.h. +utf_old.h UTF16_SET_CHAR_START_UNSAFE ICU 2.4. Renamed to U16_SET_CP_START_UNSAFE, see utf_old.h. +utf_old.h UTF16_TRAIL ICU 2.4. Renamed to U16_TRAIL, see utf_old.h. +utf_old.h UTF32_APPEND_CHAR_SAFE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF32_APPEND_CHAR_UNSAFE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF32_ARRAY_SIZE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF32_BACK_1_SAFE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF32_BACK_1_UNSAFE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF32_BACK_N_SAFE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF32_BACK_N_UNSAFE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF32_CHAR_LENGTH ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF32_FWD_1_SAFE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF32_FWD_1_UNSAFE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF32_FWD_N_SAFE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF32_FWD_N_UNSAFE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF32_GET_CHAR_SAFE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF32_GET_CHAR_UNSAFE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF32_IS_LEAD ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF32_IS_SAFE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF32_IS_SINGLE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF32_IS_TRAIL ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF32_MAX_CHAR_LENGTH ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF32_NEED_MULTIPLE_UCHAR ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF32_NEXT_CHAR_SAFE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF32_NEXT_CHAR_UNSAFE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF32_PREV_CHAR_SAFE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF32_PREV_CHAR_UNSAFE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF32_SET_CHAR_LIMIT_SAFE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF32_SET_CHAR_LIMIT_UNSAFE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF32_SET_CHAR_START_SAFE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF32_SET_CHAR_START_UNSAFE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF8_APPEND_CHAR_SAFE ICU 2.4. Use U8_APPEND instead, see utf_old.h. +utf_old.h UTF8_APPEND_CHAR_UNSAFE ICU 2.4. Renamed to U8_APPEND_UNSAFE, see utf_old.h. +utf_old.h UTF8_ARRAY_SIZE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF8_BACK_1_SAFE ICU 2.4. Renamed to U8_BACK_1, see utf_old.h. +utf_old.h UTF8_BACK_1_UNSAFE ICU 2.4. Renamed to U8_BACK_1_UNSAFE, see utf_old.h. +utf_old.h UTF8_BACK_N_SAFE ICU 2.4. Renamed to U8_BACK_N, see utf_old.h. +utf_old.h UTF8_BACK_N_UNSAFE ICU 2.4. Renamed to U8_BACK_N_UNSAFE, see utf_old.h. +utf_old.h UTF8_CHAR_LENGTH ICU 2.4. Use U8_LENGTH instead, see utf_old.h. +utf_old.h UTF8_COUNT_TRAIL_BYTES ICU 2.4. Renamed to U8_COUNT_TRAIL_BYTES, see utf_old.h. +utf_old.h UTF8_ERROR_VALUE_1 ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF8_ERROR_VALUE_2 ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF8_FWD_1_SAFE ICU 2.4. Renamed to U8_FWD_1, see utf_old.h. +utf_old.h UTF8_FWD_1_UNSAFE ICU 2.4. Renamed to U8_FWD_1_UNSAFE, see utf_old.h. +utf_old.h UTF8_FWD_N_SAFE ICU 2.4. Renamed to U8_FWD_N, see utf_old.h. +utf_old.h UTF8_FWD_N_UNSAFE ICU 2.4. Renamed to U8_FWD_N_UNSAFE, see utf_old.h. +utf_old.h UTF8_GET_CHAR_SAFE ICU 2.4. Use U8_GET instead, see utf_old.h. +utf_old.h UTF8_GET_CHAR_UNSAFE ICU 2.4. Renamed to U8_GET_UNSAFE, see utf_old.h. +utf_old.h UTF8_IS_LEAD ICU 2.4. Renamed to U8_IS_LEAD, see utf_old.h. +utf_old.h UTF8_IS_SINGLE ICU 2.4. Renamed to U8_IS_SINGLE, see utf_old.h. +utf_old.h UTF8_IS_TRAIL ICU 2.4. Renamed to U8_IS_TRAIL, see utf_old.h. +utf_old.h UTF8_MASK_LEAD_BYTE ICU 2.4. Renamed to U8_MASK_LEAD_BYTE, see utf_old.h. +utf_old.h UTF8_MAX_CHAR_LENGTH ICU 2.4. Renamed to U8_MAX_LENGTH, see utf_old.h. +utf_old.h UTF8_NEED_MULTIPLE_UCHAR ICU 2.4. Use U8_LENGTH or test ((uint32_t)(c)>0x7f) instead, see utf_old.h. +utf_old.h UTF8_NEXT_CHAR_SAFE ICU 2.4. Use U8_NEXT instead, see utf_old.h. +utf_old.h UTF8_NEXT_CHAR_UNSAFE ICU 2.4. Renamed to U8_NEXT_UNSAFE, see utf_old.h. +utf_old.h UTF8_PREV_CHAR_SAFE ICU 2.4. Use U8_PREV instead, see utf_old.h. +utf_old.h UTF8_PREV_CHAR_UNSAFE ICU 2.4. Renamed to U8_PREV_UNSAFE, see utf_old.h. +utf_old.h UTF8_SET_CHAR_LIMIT_SAFE ICU 2.4. Renamed to U8_SET_CP_LIMIT, see utf_old.h. +utf_old.h UTF8_SET_CHAR_LIMIT_UNSAFE ICU 2.4. Renamed to U8_SET_CP_LIMIT_UNSAFE, see utf_old.h. +utf_old.h UTF8_SET_CHAR_START_SAFE ICU 2.4. Renamed to U8_SET_CP_START, see utf_old.h. +utf_old.h UTF8_SET_CHAR_START_UNSAFE ICU 2.4. Renamed to U8_SET_CP_START_UNSAFE, see utf_old.h. +utf_old.h UTF_APPEND_CHAR ICU 2.4. Use U16_APPEND instead, see utf_old.h. +utf_old.h UTF_APPEND_CHAR_SAFE ICU 2.4. Use U16_APPEND instead, see utf_old.h. +utf_old.h UTF_APPEND_CHAR_UNSAFE ICU 2.4. Renamed to U16_APPEND_UNSAFE, see utf_old.h. +utf_old.h UTF_ARRAY_SIZE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF_BACK_1 ICU 2.4. Renamed to U16_BACK_1, see utf_old.h. +utf_old.h UTF_BACK_1_SAFE ICU 2.4. Renamed to U16_BACK_1, see utf_old.h. +utf_old.h UTF_BACK_1_UNSAFE ICU 2.4. Renamed to U16_BACK_1_UNSAFE, see utf_old.h. +utf_old.h UTF_BACK_N ICU 2.4. Renamed to U16_BACK_N, see utf_old.h. +utf_old.h UTF_BACK_N_SAFE ICU 2.4. Renamed to U16_BACK_N, see utf_old.h. +utf_old.h UTF_BACK_N_UNSAFE ICU 2.4. Renamed to U16_BACK_N_UNSAFE, see utf_old.h. +utf_old.h UTF_CHAR_LENGTH ICU 2.4. Renamed to U16_LENGTH, see utf_old.h. +utf_old.h UTF_ERROR_VALUE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF_FIRST_SURROGATE ICU 2.4. Renamed to U16_LEAD, see utf_old.h. +utf_old.h UTF_FWD_1 ICU 2.4. Renamed to U16_FWD_1, see utf_old.h. +utf_old.h UTF_FWD_1_SAFE ICU 2.4. Renamed to U16_FWD_1, see utf_old.h. +utf_old.h UTF_FWD_1_UNSAFE ICU 2.4. Renamed to U16_FWD_1_UNSAFE, see utf_old.h. +utf_old.h UTF_FWD_N ICU 2.4. Renamed to U16_FWD_N, see utf_old.h. +utf_old.h UTF_FWD_N_SAFE ICU 2.4. Renamed to U16_FWD_N, see utf_old.h. +utf_old.h UTF_FWD_N_UNSAFE ICU 2.4. Renamed to U16_FWD_N_UNSAFE, see utf_old.h. +utf_old.h UTF_GET_CHAR ICU 2.4. Renamed to U16_GET, see utf_old.h. +utf_old.h UTF_GET_CHAR_SAFE ICU 2.4. Use U16_GET instead, see utf_old.h. +utf_old.h UTF_GET_CHAR_UNSAFE ICU 2.4. Renamed to U16_GET_UNSAFE, see utf_old.h. +utf_old.h UTF_IS_ERROR ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF_IS_FIRST_SURROGATE ICU 2.4. Renamed to U_IS_LEAD and U16_IS_LEAD, see utf_old.h. +utf_old.h UTF_IS_LEAD ICU 2.4. Renamed to U_IS_LEAD and U16_IS_LEAD, see utf_old.h. +utf_old.h UTF_IS_SECOND_SURROGATE ICU 2.4. Renamed to U_IS_TRAIL and U16_IS_TRAIL, see utf_old.h. +utf_old.h UTF_IS_SINGLE ICU 2.4. Renamed to U_IS_SINGLE and U16_IS_SINGLE, see utf_old.h. +utf_old.h UTF_IS_SURROGATE ICU 2.4. Renamed to U_IS_SURROGATE and U16_IS_SURROGATE, see utf_old.h. +utf_old.h UTF_IS_SURROGATE_FIRST ICU 2.4. Renamed to U_IS_SURROGATE_LEAD and U16_IS_SURROGATE_LEAD, see utf_old.h. +utf_old.h UTF_IS_TRAIL ICU 2.4. Renamed to U_IS_TRAIL and U16_IS_TRAIL, see utf_old.h. +utf_old.h UTF_IS_UNICODE_CHAR ICU 2.4. Renamed to U_IS_UNICODE_CHAR, see utf_old.h. +utf_old.h UTF_IS_UNICODE_NONCHAR ICU 2.4. Renamed to U_IS_UNICODE_NONCHAR, see utf_old.h. +utf_old.h UTF_IS_VALID ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF_MAX_CHAR_LENGTH ICU 2.4. Renamed to U16_MAX_LENGTH, see utf_old.h. +utf_old.h UTF_NEED_MULTIPLE_UCHAR ICU 2.4. Use U16_LENGTH or test ((uint32_t)(c)>0xffff) instead. +utf_old.h UTF_NEXT_CHAR ICU 2.4. Renamed to U16_NEXT, see utf_old.h. +utf_old.h UTF_NEXT_CHAR_SAFE ICU 2.4. Use U16_NEXT instead, see utf_old.h. +utf_old.h UTF_NEXT_CHAR_UNSAFE ICU 2.4. Renamed to U16_NEXT_UNSAFE, see utf_old.h. +utf_old.h UTF_PREV_CHAR ICU 2.4. Renamed to U16_PREV, see utf_old.h. +utf_old.h UTF_PREV_CHAR_SAFE ICU 2.4. Use U16_PREV instead, see utf_old.h. +utf_old.h UTF_PREV_CHAR_UNSAFE ICU 2.4. Renamed to U16_PREV_UNSAFE, see utf_old.h. +utf_old.h UTF_SAFE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF_SECOND_SURROGATE ICU 2.4. Renamed to U16_TRAIL, see utf_old.h. +utf_old.h UTF_SET_CHAR_LIMIT ICU 2.4. Renamed to U16_SET_CP_LIMIT, see utf_old.h. +utf_old.h UTF_SET_CHAR_LIMIT_SAFE ICU 2.4. Renamed to U16_SET_CP_LIMIT, see utf_old.h. +utf_old.h UTF_SET_CHAR_LIMIT_UNSAFE ICU 2.4. Renamed to U16_SET_CP_LIMIT_UNSAFE, see utf_old.h. +utf_old.h UTF_SET_CHAR_START ICU 2.4. Renamed to U16_SET_CP_START, see utf_old.h. +utf_old.h UTF_SET_CHAR_START_SAFE ICU 2.4. Renamed to U16_SET_CP_START, see utf_old.h. +utf_old.h UTF_SET_CHAR_START_UNSAFE ICU 2.4. Renamed to U16_SET_CP_START_UNSAFE, see utf_old.h. +utf_old.h UTF_SIZE ICU 2.4. Obsolete, see utf_old.h. +utf_old.h UTF_SURROGATE_OFFSET ICU 2.4. Renamed to U16_SURROGATE_OFFSET, see utf_old.h. +utrans.h utrans_getAvailableID ICU 2.8 Use utrans_openIDs() instead, see utrans.h +utrans.h utrans_getID ICU 2.8 Use utrans_getUnicodeID() instead, see utrans.h +utrans.h utrans_open ICU 2.8 Use utrans_openU() instead, see utrans.h +utrans.h utrans_unregister ICU 2.8 Use utrans_unregisterID() instead, see utrans.h +Calendar EAmpm ICU 2.6. Use C enum UCalendarAMPMs defined in ucal.h +Calendar EDateFields ICU 2.6. Use C enum UCalendarDateFields defined in ucal.h +Calendar EDaysOfWeek ICU 2.6. Use C enum UCalendarDaysOfWeek defined in ucal.h +Calendar EMonths ICU 2.6. Use C enum UCalendarMonths defined in ucal.h +Calendar add ICU 2.6. use add(UCalendarDateFields field, int32_t amount, UErrorCode& status) instead. +Calendar clear ICU 2.6. Use clear(UCalendarDateFields field) instead. +Calendar fieldDifference ICU 2.6. Use fieldDifference(UDate when, UCalendarDateFields field, UErrorCode& status). +Calendar get ICU 2.6. Use get(UCalendarDateFields field, UErrorCode& status) instead. +Calendar getActualMaximum ICU 2.6. Use getActualMaximum(UCalendarDateFields field, UErrorCode& status) instead. +Calendar getActualMinimum ICU 2.6. Use getActualMinimum(UCalendarDateFields field, UErrorCode& status) instead. +Calendar getFirstDayOfWeek ICU 2.6 use the overload with error code +Calendar getGreatestMinimum ICU 2.6. Use getGreatestMinimum(UCalendarDateFields field) instead. +Calendar getLeastMaximum ICU 2.6. Use getLeastMaximum(UCalendarDateFields field) instead. +Calendar getMaximum ICU 2.6. Use getMaximum(UCalendarDateFields field) instead. +Calendar getMinimum ICU 2.6. Use getMinimum(UCalendarDateFields field) instead. +Calendar internalGet ICU 2.6. Use internalGet(UCalendarDateFields field) instead. +Calendar internalSet ICU 2.6. Use internalSet(UCalendarDateFields field, int32_t value) instead. +Calendar isSet ICU 2.6. Use isSet(UCalendarDateFields field) instead. +Calendar roll ICU 2.6. Use roll(UCalendarDateFields field, int32_t amount, UErrorCode& status) instead. +Calendar roll ICU 2.6. Use roll(UCalendarDateFields field, UBool up, UErrorCode& status) instead. +Calendar set ICU 2.6. Use set(UCalendarDateFields field, int32_t value) instead. +Calendar setFirstDayOfWeek ICU 2.6. Use setFirstDayOfWeek(UCalendarDaysOfWeek value) instead. +Calendar fIsSet ICU 2.8 use (fStamp[n]!=kUnset) +CollationKey (null) ICU 2.8 Use Collator::getSortKey(...) instead +CollationKey CollationKey ICU 2.8 Use Collator::getSortKey(...) instead +CollationKey CollationKey ICU 2.8 Use Collator::getSortKey(...) instead +CollationKey CollationKey ICU 2.8 Use Collator::getSortKey(...) instead +CollationKey ~CollationKey ICU 2.8 Use Collator::getSortKey(...) instead +CollationKey compareTo ICU 2.8 Use Collator::getSortKey(...) instead +CollationKey compareTo ICU 2.6 use the overload with error code +CollationKey getByteArray ICU 2.8 Use Collator::getSortKey(...) instead +CollationKey getDynamicClassID ICU 2.8 Use Collator::getSortKey(...) instead +CollationKey getStaticClassID ICU 2.8 Use Collator::getSortKey(...) instead +CollationKey hashCode ICU 2.8 Use Collator::getSortKey(...) instead +CollationKey isBogus ICU 2.8 Use Collator::getSortKey(...) instead +CollationKey operator!= ICU 2.8 Use Collator::getSortKey(...) instead +CollationKey operator= ICU 2.8 Use Collator::getSortKey(...) instead +CollationKey operator== ICU 2.8 Use Collator::getSortKey(...) instead +Collator EComparisonResult ICU 2.6. Use C enum UCollationResult defined in ucol.h +Collator Collator ICU 2.4. Subclasses should use the default constructor +Collator compare ICU 2.6 use the overload with UErrorCode & +Collator compare ICU 2.6 use the overload with UErrorCode & +Collator compare ICU 2.6 use the overload with UErrorCode & +Collator getCollationKey ICU 2.8 Use getSortKey(...) instead +Collator getCollationKey ICU 2.8 Use getSortKey(...) instead +Collator getLocale ICU 2.8 This API is under consideration for revision +Collator getStrength ICU 2.6 Use getAttribute(UCOL_STRENGTH...) instead +Collator setStrength ICU 2.6 Use setAttribute(UCOL_STRENGTH...) instead +GregorianCalendar getActualMaximum ICU 2.6. Use getActualMaximum(UCalendarDateFields field) instead. +GregorianCalendar getActualMinimum ICU 2.6. Use getActualMinimum(UCalendarDateFields field) instead. (Added to ICU 3.0 for signature consistency) +GregorianCalendar getActualMinimum ICU 2.6. Use getActualMinimum(UCalendarDateFields field) instead. +GregorianCalendar roll ICU 2.6. Use roll(UCalendarDateFields field, int32_t amount, UErrorCode& status) instead. +ResourceBundle getLocale ICU 2.8 Use getLocale(ULocDataLocaleType type, UErrorCode &status) overload instead. +ResourceBundle getVersionNumber ICU 2.8 Use getVersion instead. +RuleBasedCollator compare ICU 2.6 Use overload with UErrorCode& +RuleBasedCollator compare ICU 2.6 Use overload with UErrorCode& +RuleBasedCollator compare ICU 2.6 Use overload with UErrorCode& +RuleBasedCollator getCollationKey ICU 2.8 Use getSortKey(...) instead +RuleBasedCollator getCollationKey ICU 2.8 Use getSortKey(...) instead +RuleBasedCollator getEComparisonResult ICU 2.6. We will not need it. +RuleBasedCollator getLocale ICU 2.8 likely to change in ICU 3.0, based on feedback +RuleBasedCollator getStrength ICU 2.6 Use getAttribute(UCOL_STRENGTH...) instead +RuleBasedCollator setStrength ICU 2.6 Use setAttribute(UCOL_STRENGTH...) instead +SimpleTimeZone inDaylightTime ICU 2.4. Use Calendar::inDaylightTime() instead. +TimeZone inDaylightTime ICU 2.4. Use Calendar::inDaylightTime() instead. diff --git a/icuSources/tools/gendraft/DraftApi.txt b/icuSources/tools/gendraft/DraftApi.txt new file mode 100644 index 00000000..89959580 --- /dev/null +++ b/icuSources/tools/gendraft/DraftApi.txt @@ -0,0 +1,372 @@ +coll.h URegistryKey ICU 2.6 +ubrk.h ULineBreakTag ICU 2.8 +ubrk.h USentenceBreakTag ICU 2.8 +ubrk.h ULineBreakTag ICU 2.8 +ubrk.h USentenceBreakTag ICU 2.8 +ubrk.h ubrk_getLocaleByType ICU 2.8 likely to change in ICU 3.0, based on feedback +ubrk.h ubrk_getRuleStatusVec ICU 3.0 +ucal.h UCAL_EXTENDED_YEAR ICU 2.8 +ucal.h UCAL_JULIAN_DAY ICU 2.8 +ucal.h UCAL_MILLISECONDS_IN_DAY ICU 2.8 +ucal.h UCAL_DAY_OF_MONTH ICU 2.8 +ucal.h ucal_getDSTSavings ICU 2.6 +ucal.h ucal_getDefaultTimeZone ICU 2.6 +ucal.h ucal_getLocaleByType ICU 2.8 likely to change in ICU 3.0, based on feedback +ucal.h ucal_openCountryTimeZones ICU 2.6 +ucal.h ucal_openTimeZones ICU 2.6 +ucal.h ucal_setDefaultTimeZone ICU 2.6 +ucat.h u_catclose ICU 2.6 +ucat.h u_catgets ICU 2.6 +ucat.h u_catopen ICU 2.6 +ucat.h u_nl_catd ICU 2.6 +uchar.h UHangulSyllableType ICU 2.6 +uchar.h UBLOCK_NO_BLOCK ICU 2.6 +uchar.h UBLOCK_LIMBU ICU 2.6 +uchar.h UBLOCK_TAI_LE ICU 2.6 +uchar.h UBLOCK_KHMER_SYMBOLS ICU 2.6 +uchar.h UBLOCK_PHONETIC_EXTENSIONS ICU 2.6 +uchar.h UBLOCK_MISCELLANEOUS_SYMBOLS_AND_ARROWS ICU 2.6 +uchar.h UBLOCK_YIJING_HEXAGRAM_SYMBOLS ICU 2.6 +uchar.h UBLOCK_LINEAR_B_SYLLABARY ICU 2.6 +uchar.h UBLOCK_LINEAR_B_IDEOGRAMS ICU 2.6 +uchar.h UBLOCK_AEGEAN_NUMBERS ICU 2.6 +uchar.h UBLOCK_UGARITIC ICU 2.6 +uchar.h UBLOCK_SHAVIAN ICU 2.6 +uchar.h UBLOCK_OSMANYA ICU 2.6 +uchar.h UBLOCK_CYPRIOT_SYLLABARY ICU 2.6 +uchar.h UBLOCK_TAI_XUAN_JING_SYMBOLS ICU 2.6 +uchar.h UBLOCK_VARIATION_SELECTORS_SUPPLEMENT ICU 2.6 +uchar.h UHangulSyllableType ICU 2.6 +uchar.h U_JG_FE ICU 2.6 +uchar.h U_JG_KHAPH ICU 2.6 +uchar.h U_JG_ZHAIN ICU 2.6 +uchar.h UCHAR_CASE_SENSITIVE ICU 2.6 +uchar.h UCHAR_HANGUL_SYLLABLE_TYPE ICU 2.6 +uchar.h u_isISOControl ICU 2.6 +uchar.h u_isJavaSpaceChar ICU 2.6 +uchar.h u_isblank ICU 2.6 +uchar.h u_isgraph ICU 2.6 +uchar.h u_ispunct ICU 2.6 +uchar.h u_isxdigit ICU 2.6 +uclean.h UMTX ICU 2.8 +uclean.h UMemAllocFn ICU 2.8 +uclean.h UMemFreeFn ICU 2.8 +uclean.h UMemReallocFn ICU 2.8 +uclean.h UMtxAtomicFn ICU 2.8 +uclean.h UMtxFn ICU 2.8 +uclean.h UMtxInitFn ICU 2.8 +uclean.h u_init ICU 2.6 +uclean.h u_setAtomicIncDecFunctions ICU 2.8 +uclean.h u_setMemoryFunctions ICU 2.8 +uclean.h u_setMutexFunctions ICU 2.8 +ucnv.h UCNV_GET_MAX_BYTES_FOR_STRING ICU 2.8 +ucnv.h UConverterUnicodeSet ICU 2.6 +ucnv.h UConverterUnicodeSet ICU 2.6 +ucnv.h UCNV_ROUNDTRIP_SET ICU 2.6 +ucnv.h UCNV_SET_COUNT ICU 2.6 +ucnv.h ucnv_convertEx ICU 2.6 +ucnv.h ucnv_fromAlgorithmic ICU 2.6 +ucnv.h ucnv_getUnicodeSet ICU 2.6 +ucnv.h ucnv_toAlgorithmic ICU 2.6 +ucol.h ucol_getLocaleByType ICU 2.8 likely to change in ICU 3.0, based on feedback +ucol.h ucol_getUCAVersion ICU 2.8 +ucol.h ucol_nextSortKeyPart ICU 2.6 +ucol.h ucol_strcollIter ICU 2.6 +ucoleitr.h ucol_primaryOrder ICU 2.6 +ucoleitr.h ucol_secondaryOrder ICU 2.6 +ucoleitr.h ucol_tertiaryOrder ICU 2.6 +uconfig.h UCONFIG_NO_IDNA ICU 2.6 +uconfig.h UCONFIG_NO_NORMALIZATION ICU 2.6 +uconfig.h UCONFIG_NO_SERVICE ICU 2.8 +ucurr.h UCurrNameStyle ICU 2.6 +ucurr.h UCurrNameStyle ICU 2.6 +ucurr.h UCURR_SYMBOL_NAME ICU 2.6 +ucurr.h UCURR_LONG_NAME ICU 2.6 +ucurr.h ucurr_forLocale ICU 2.8 +ucurr.h ucurr_getDefaultFractionDigits ICU 3.0 +ucurr.h ucurr_getName ICU 2.6 +ucurr.h ucurr_getRoundingIncrement ICU 3.0 +ucurr.h ucurr_register ICU 2.6 +udat.h UDateFormatField ICU 3.0 +udat.h UDateFormatField ICU 3.0 +udat.h UDAT_ERA_FIELD ICU 3.0 +udat.h UDAT_YEAR_FIELD ICU 3.0 +udat.h UDAT_MONTH_FIELD ICU 3.0 +udat.h UDAT_DATE_FIELD ICU 3.0 +udat.h UDAT_HOUR_OF_DAY1_FIELD ICU 3.0 +udat.h UDAT_HOUR_OF_DAY0_FIELD ICU 3.0 +udat.h UDAT_MINUTE_FIELD ICU 3.0 +udat.h UDAT_SECOND_FIELD ICU 3.0 +udat.h UDAT_FRACTIONAL_SECOND_FIELD ICU 3.0 +udat.h UDAT_DAY_OF_WEEK_FIELD ICU 3.0 +udat.h UDAT_DAY_OF_YEAR_FIELD ICU 3.0 +udat.h UDAT_DAY_OF_WEEK_IN_MONTH_FIELD ICU 3.0 +udat.h UDAT_WEEK_OF_YEAR_FIELD ICU 3.0 +udat.h UDAT_WEEK_OF_MONTH_FIELD ICU 3.0 +udat.h UDAT_AM_PM_FIELD ICU 3.0 +udat.h UDAT_HOUR1_FIELD ICU 3.0 +udat.h UDAT_HOUR0_FIELD ICU 3.0 +udat.h UDAT_TIMEZONE_FIELD ICU 3.0 +udat.h UDAT_YEAR_WOY_FIELD ICU 3.0 +udat.h UDAT_DOW_LOCAL_FIELD ICU 3.0 +udat.h UDAT_EXTENDED_YEAR_FIELD ICU 3.0 +udat.h UDAT_JULIAN_DAY_FIELD ICU 3.0 +udat.h UDAT_MILLISECONDS_IN_DAY_FIELD ICU 3.0 +udat.h UDAT_TIMEZONE_RFC_FIELD ICU 3.0 +udat.h UDAT_FIELD_COUNT ICU 3.0 +udat.h udat_getLocaleByType ICU 2.8 likely to change in ICU 3.0, based on feedback +uidna.h UIDNA_ALLOW_UNASSIGNED ICU 2.6 +uidna.h UIDNA_DEFAULT ICU 2.6 +uidna.h UIDNA_USE_STD3_RULES ICU 2.6 +uidna.h uidna_IDNToASCII ICU 2.6 +uidna.h uidna_IDNToUnicode ICU 2.6 +uidna.h uidna_compare ICU 2.6 +uidna.h uidna_toASCII ICU 2.6 +uidna.h uidna_toUnicode ICU 2.6 +uiter.h UITER_NO_STATE ICU 2.6 +uiter.h UCharIteratorGetState ICU 2.6 +uiter.h UCharIteratorSetState ICU 2.6 +uiter.h @1 ICU 2.6 +uiter.h UITER_UNKNOWN_INDEX ICU 2.6 +uiter.h uiter_getState ICU 2.6 +uiter.h uiter_setState ICU 2.6 +uiter.h uiter_setUTF16BE ICU 2.6 +uiter.h uiter_setUTF8 ICU 2.6 +uloc.h ULOC_KEYWORDS_CAPACITY ICU 2.8 +uloc.h ULOC_KEYWORD_AND_VALUES_CAPACITY ICU 2.8 +uloc.h ULOC_KEYWORD_ASSIGN ICU 2.8 +uloc.h ULOC_KEYWORD_ITEM_SEPARATOR ICU 2.8 +uloc.h ULOC_KEYWORD_SEPARATOR ICU 2.8 +uloc.h ULOC_SCRIPT_CAPACITY ICU 2.8 +uloc.h uloc_getBaseName ICU 2.8 +uloc.h uloc_getDisplayKeyword ICU 2.8 +uloc.h uloc_getDisplayKeywordValue ICU 2.8 +uloc.h uloc_getDisplayScript ICU 2.8 +uloc.h uloc_getKeywordValue ICU 2.8 +uloc.h uloc_getScript ICU 2.8 +uloc.h uloc_openKeywords ICU 2.8 +ulocdata.h UMeasurementSystem ICU 2.8 +ulocdata.h UMeasurementSystem ICU 2.8 +ulocdata.h ulocdata_getExemplarSet ICU 2.8 +ulocdata.h ulocdata_getMeasurementSystem ICU 2.8 +ulocdata.h ulocdata_getPaperSize ICU 2.8 +umachine.h INT64_C ICU 2.8 +umachine.h UINT64_C ICU 2.8 +umsg.h umsg_getLocaleByType ICU 2.8 likely to change in ICU 3.0, based on feedback +unistr.h operator+ ICU 2.8 +unorm.h UNORM_COMPARE_NORM_OPTIONS_SHIFT ICU 2.6 +unorm.h @2 ICU 2.6 +unorm.h UNORM_UNICODE_3_2 ICU 2.6 +unorm.h unorm_isNormalizedWithOptions ICU 2.6 +unorm.h unorm_quickCheckWithOptions ICU 2.6 +unum.h UNUM_MIN_SIGNIFICANT_DIGITS ICU 3.0 +unum.h UNUM_MAX_SIGNIFICANT_DIGITS ICU 3.0 +unum.h UNUM_LENIENT_PARSE ICU 3.0 +unum.h UNUM_PATTERN_DECIMAL ICU 3.0 +unum.h UNUM_ORDINAL ICU 3.0 +unum.h UNUM_DURATION ICU 3.0 +unum.h UNUM_PATTERN_RULEBASED ICU 3.0 +unum.h UNUM_SIGNIFICANT_DIGIT_SYMBOL ICU 3.0 +unum.h UNUM_DEFAULT_RULESET ICU 3.0 +unum.h UNUM_PUBLIC_RULESETS ICU 3.0 +unum.h unum_getLocaleByType ICU 2.8 likely to change in ICU 3.0, based on feedback +unum.h unum_parseInt64 ICU 2.8 +uobject.h U_HAVE_PLACEMENT_NEW ICU 2.6 +uregex.h URegularExpression ICU 3.0 +uregex.h UREGEX_CANON_EQ ICU 2.4 +uregex.h UREGEX_UWORD ICU 2.8 +uregex.h uregex_appendReplacement ICU 3.0 +uregex.h uregex_appendTail ICU 3.0 +uregex.h uregex_clone ICU 3.0 +uregex.h uregex_close ICU 3.0 +uregex.h uregex_end ICU 3.0 +uregex.h uregex_find ICU 3.0 +uregex.h uregex_findNext ICU 3.0 +uregex.h uregex_flags ICU 3.0 +uregex.h uregex_getText ICU 3.0 +uregex.h uregex_group ICU 3.0 +uregex.h uregex_groupCount ICU 3.0 +uregex.h uregex_lookingAt ICU 3.0 +uregex.h uregex_matches ICU 3.0 +uregex.h uregex_open ICU 3.0 +uregex.h uregex_openC ICU 3.0 +uregex.h uregex_pattern ICU 3.0 +uregex.h uregex_replaceAll ICU 3.0 +uregex.h uregex_replaceFirst ICU 3.0 +uregex.h uregex_reset ICU 3.0 +uregex.h uregex_setText ICU 3.0 +uregex.h uregex_split ICU 3.0 +uregex.h uregex_start ICU 3.0 +ures.h URES_NONE ICU 2.6 +ures.h URES_STRING ICU 2.6 +ures.h URES_BINARY ICU 2.6 +ures.h URES_TABLE ICU 2.6 +ures.h URES_ALIAS ICU 2.6 +ures.h URES_INT ICU 2.6 +ures.h URES_ARRAY ICU 2.6 +ures.h URES_INT_VECTOR ICU 2.6 +ures.h ures_getLocaleByType ICU 2.8 +uscript.h USCRIPT_CANADIAN_ABORIGINAL ICU 2.6 +uset.h uset_addAll ICU 2.6 +uset.h uset_applyPattern ICU 2.8 +usprep.h USPREP_ALLOW_UNASSIGNED ICU 2.8 +usprep.h USPREP_DEFAULT ICU 2.8 +usprep.h UStringPrepProfile ICU 2.8 +usprep.h usprep_close ICU 2.8 +usprep.h usprep_open ICU 2.8 +usprep.h usprep_prepare ICU 2.8 +ustring.h u_strCompareIter ICU 2.6 +utf.h U_IS_BMP ICU 2.8 +utf.h U_IS_SUPPLEMENTARY ICU 2.8 +utrace.h UTraceData ICU 2.8 +utrace.h UTraceEntry ICU 2.8 +utrace.h UTraceExit ICU 2.8 +utrace.h UTraceFunctionNumber ICU 2.8 +utrace.h UTraceLevel ICU 2.8 +utrace.h UTraceFunctionNumber ICU 2.8 +utrace.h UTraceLevel ICU 2.8 +utrace.h UTRACE_OFF ICU 2.8 +utrace.h UTRACE_ERROR ICU 2.8 +utrace.h UTRACE_WARNING ICU 2.8 +utrace.h UTRACE_OPEN_CLOSE ICU 2.8 +utrace.h UTRACE_INFO ICU 2.8 +utrace.h UTRACE_VERBOSE ICU 2.8 +utrace.h utrace_format ICU 2.8 +utrace.h utrace_functionName ICU 2.8 +utrace.h utrace_getFunctions ICU 2.8 +utrace.h utrace_getLevel ICU 2.8 +utrace.h utrace_setFunctions ICU 2.8 +utrace.h utrace_setLevel ICU 2.8 +utrace.h utrace_vformat ICU 2.8 +utrans.h utrans_getUnicodeID ICU 2.8 +utrans.h utrans_openIDs ICU 2.8 +utrans.h utrans_openU ICU 2.8 +utrans.h utrans_unregisterID ICU 2.8 +utypes.h U_LAYOUTEX_API ICU 2.6 +uversion.h U_ICU_VERSION_MINOR_NUM ICU 2.6 +uversion.h U_ICU_VERSION_SHORT ICU 2.6 +uversion.h U_ICU_VERSION_SUFFIX ICU 2.6 +BreakIterator getLocale ICU 2.8 likely to change in ICU 3.0, based on feedback +Calendar add ICU 2.6. +Calendar clear ICU 2.6. +Calendar fieldDifference ICU 2.6. +Calendar get ICU 2.6. +Calendar getActualMaximum ICU 2.6. +Calendar getActualMinimum ICU 2.6. +Calendar getFirstDayOfWeek ICU 2.6 +Calendar getGreatestMinimum ICU 2.6. +Calendar getLeastMaximum ICU 2.6. +Calendar getLocale ICU 2.8 likely to change in ICU 3.0, based on feedback +Calendar getMaximum ICU 2.6. +Calendar getMinimum ICU 2.6. +Calendar internalSet ICU 2.6. +Calendar isSet ICU 2.6. +Calendar roll ICU 2.6. +Calendar roll ICU 2.6. +Calendar set ICU 2.6. +Calendar setFirstDayOfWeek ICU 2.6. +ChoiceFormat format ICU 2.8 +Collator compare ICU 2.6 +Collator compare ICU 2.6 +Collator compare ICU 2.6 +Collator getAvailableLocales ICU 2.6 +Collator registerFactory ICU 2.6 +Collator registerInstance ICU 2.6 +Collator unregister ICU 2.6 +CollatorFactory (null) ICU 2.6 +CollatorFactory createCollator ICU 2.6 +CollatorFactory getDisplayName ICU 2.6 +CollatorFactory getSupportedIDs ICU 2.6 +CollatorFactory visible ICU 2.6 +DateFormatSymbols getLocale ICU 2.8 likely to change in ICU 3.0, based on feedback +DecimalFormat format ICU 2.8 +DecimalFormat format ICU 2.8 +DecimalFormat getMaximumSignificantDigits ICU 3.0 +DecimalFormat getMinimumSignificantDigits ICU 3.0 +DecimalFormat setCurrency ICU 3.0 +DecimalFormat setMaximumSignificantDigits ICU 3.0 +DecimalFormat setMinimumSignificantDigits ICU 3.0 +DecimalFormatSymbols kSignificantDigitSymbol ICU 3.0 +DecimalFormatSymbols getLocale ICU 2.8 likely to change in ICU 3.0, based on feedback +FieldPosition clone ICU 2.8 +Format getLocale ICU 2.8 likely to change in ICU 3.0, based on feedback +Formattable kInt64 ICU 2.8 +Formattable Formattable ICU 2.8 +Formattable clone ICU 2.8 +Formattable getArray ICU 2.8 +Formattable getDate ICU 2.8 +Formattable getDouble ICU 2.8 +Formattable getInt64 ICU 2.8 +Formattable getInt64 ICU 2.8 +Formattable getString ICU 2.8 +Formattable getString ICU 2.8 +Formattable getString ICU 2.8 +Formattable setInt64 ICU 2.8 +GregorianCalendar getActualMaximum ICU 2.6 +GregorianCalendar getActualMinimum ICU 3.0 +GregorianCalendar roll ICU 2.6. +Locale clone ICU 2.8 +Locale createKeywords ICU 2.8 +Locale getBaseName ICU 2.8 +Locale getDisplayScript ICU 2.8 +Locale getDisplayScript ICU 2.8 +Locale getKeywordValue ICU 2.8 +Locale getScript ICU 2.8 +Normalizer isNormalized ICU 2.6 +Normalizer quickCheck ICU 2.6 +NumberFormat format ICU 2.8 +NumberFormat format ICU 2.8 +NumberFormat getAvailableLocales ICU 2.6 +NumberFormat getCurrency ICU 2.6 +NumberFormat registerFactory ICU 2.6 +NumberFormat setCurrency ICU 3.0 +NumberFormat unregister ICU 2.6 +NumberFormatFactory createFormat ICU 2.6 +NumberFormatFactory getSupportedIDs ICU 2.6 +NumberFormatFactory visible ICU 2.6 +ParsePosition clone ICU 2.8 +RegexMatcher RegexMatcher ICU 2.6 +RegexMatcher RegexMatcher ICU 2.6 +RegexMatcher lookingAt ICU 2.8 +RegexMatcher matches ICU 2.8 +RegexMatcher reset ICU 2.8 +RegexMatcher split ICU 2.6 +RegexPattern compile ICU 2.6 +RegexPattern matcher ICU 2.6 +Replaceable clone ICU 2.6 +ResourceBundle clone ICU 2.8 +ResourceBundle getLocale ICU 2.8 +RuleBasedBreakIterator RuleBasedBreakIterator ICU 2.8 +RuleBasedBreakIterator getRuleStatusVec ICU 3.0 +RuleBasedCollator compare ICU 2.6 +RuleBasedCollator compare ICU 2.6 +RuleBasedCollator compare ICU 2.6 +RuleBasedNumberFormat getDefaultRuleSetName ICU 3.0 +RuleBasedNumberFormat setDefaultRuleSet ICU 2.6 +SimpleNumberFormatFactory SimpleNumberFormatFactory ICU 2.6 +SimpleNumberFormatFactory getSupportedIDs ICU 2.6 +SimpleNumberFormatFactory visible ICU 2.6 +SimpleNumberFormatFactory _id ICU 2.6 +SimpleNumberFormatFactory _visible ICU 2.6 +SimpleTimeZone getOffset ICU 2.8 +StringEnumeration StringEnumeration ICU 2.8 +StringEnumeration clone ICU 2.8 +StringEnumeration ensureCharsCapacity ICU 2.8 +StringEnumeration setChars ICU 2.8 +StringEnumeration chars ICU 2.8 +StringEnumeration charsBuffer ICU 2.8 +StringEnumeration charsCapacity ICU 2.8 +StringEnumeration unistr ICU 2.8 +StringSearch clone ICU 2.8 +SymbolTable (null) ICU 2.8 +TimeZone getOffset ICU 2.8 +Transliterator countElements ICU 3.0 +Transliterator getAvailableIDs ICU 3.0 +Transliterator getElement ICU 3.0 +UCharIterator getState ICU 2.6 +UCharIterator setState ICU 2.6 +UMemory operator delete ICU 2.6 +UMemory operator new ICU 2.6 +UnicodeSet UnicodeSet ICU 2.8 +UnicodeSet applyPattern ICU 2.8 +UnicodeString clone ICU 2.6 diff --git a/icuSources/tools/gendraft/ObsoleteApi.txt b/icuSources/tools/gendraft/ObsoleteApi.txt new file mode 100644 index 00000000..319a98ef --- /dev/null +++ b/icuSources/tools/gendraft/ObsoleteApi.txt @@ -0,0 +1,19 @@ +DateFormat EField ICU 3.4 use UDateFormatField instead, since this API will be +ICULayoutEngine (null) ICU 3.0. Use LayoutEngine.h instead since this API will be removed in that release. +ICULayoutEngine ~ICULayoutEngine ICU 3.0. Use LayoutEngine.h instead since this API will be removed in that release. +ICULayoutEngine countGlyphs ICU 3.0. Use LayoutEngine.h instead since this API will be removed in that release. +ICULayoutEngine createInstance ICU 3.0. Use LayoutEngine.h instead since this API will be removed in that release. +ICULayoutEngine getCharIndices ICU 3.0. Use LayoutEngine.h instead since this API will be removed in that release. +ICULayoutEngine getCharIndices ICU 3.0. Use LayoutEngine.h instead since this API will be removed in that release. +ICULayoutEngine getDynamicClassID ICU 3.0. Use LayoutEngine.h instead since this API will be removed in that release. +ICULayoutEngine getGlyphPosition ICU 3.0. Use LayoutEngine.h instead since this API will be removed in that release. +ICULayoutEngine getGlyphPositions ICU 3.0. Use LayoutEngine.h instead since this API will be removed in that release. +ICULayoutEngine getGlyphs ICU 3.0. Use LayoutEngine.h instead since this API will be removed in that release. +ICULayoutEngine getStaticClassID ICU 3.0. Use LayoutEngine.h instead since this API will be removed in that release. +ICULayoutEngine layoutChars ICU 3.0. Use LayoutEngine.h instead since this API will be removed in that release. +ICULayoutEngine layoutString ICU 3.0. Use LayoutEngine.h instead since this API will be removed in that release. +MessageFormat EFormatNumber ICU 3.0. The 10-argument limit was removed as of ICU 2.6, +MessageFormat kMaxFormat ICU 3.0. The 10-argument limit was removed as of ICU 2.6, +Transliterator countAvailableIDs ICU 3.4 use getAvailableIDs() instead +Transliterator getAvailableID ICU 3.4 use getAvailableIDs() instead + diff --git a/icuSources/tools/gendraft/gendraft.pl b/icuSources/tools/gendraft/gendraft.pl new file mode 100644 index 00000000..06ee2366 --- /dev/null +++ b/icuSources/tools/gendraft/gendraft.pl @@ -0,0 +1,172 @@ +#!/usr/bin/perl +#* +#******************************************************************************* +#* Copyright (C) 2004, International Business Machines +#* Corporation and others. All Rights Reserved. +#******************************************************************************* +#* +#* file name: gendraft.pl +#* encoding: US-ASCII +#* tab size: 8 (not used) +#* indentation:4 +#* +#* Created by: Ram Viswanadha +#* +#* This tool filters the DraftAPI txt file generated by Doxygen and generates udarft.h +#* udeprctd.h and uobslete.h +#* + +use File::Find; +use File::Basename; +use IO::File; +use Cwd; +use File::Copy; +use Getopt::Long; +use File::Path; +use File::Copy; + +$draftHeaderName = "udraft.h"; +$draftAppend = "DRAFT_API_DO_NOT_USE"; +$draftDefine = "U_HIDE_DRAFT_API"; + +$deprecatedHeaderName = "udeprctd.h"; +$deprecatedAppend = "DEPRECATED_API_DO_NOT_USE"; +$deprecatedDefine = "U_HIDE_DEPRECATED_API"; + +$obsoleteHeaderName = "uobslete.h"; +$obsoleteAppend = "OBSOLETE_API_DO_NOT_USE"; +$obsoleteDefine = "U_HIDE_OBSOLETE_API"; + +$versionAppend=""; + +#run the program +main(); + +#--------------------------------------------------------------------- +# The main program + +sub main(){ + GetOptions( + "--draft-file=s" => \$draftFile, + "--deprecated-file=s" => \$deprecatedFile, + "--obsolete-file=s" => \$obsoleteFile, + "--destdir=s" => \$destDir, + "--version=s" => \$version, + ); + usage() unless defined $draftFile; + usage() unless defined $deprecatedFile; + usage() unless defined $obsoleteFile; + usage() unless defined $destDir; + usage() unless defined $version; + + $versionAppend = $version; + $versionAppend=~ s/\./_/; + + writeFile($draftFile, $draftHeaderName, $destDir, $draftAppend, $draftDefine); + writeFile($deprecatedFile, $deprecatedHeaderName, $destDir, $deprecatedAppend, $deprecatedDefine); + writeFile($obsoleteFile, $obsoleteHeaderName, $destDir, $obsoleteAppend, $obsoleteDefine); +} + +#----------------------------------------------------------------------- +sub getHeaderDef{ + ($headerName) = @_; + $headerDef = uc($headerName); # this is building the constant for #define + $headerDef =~ s/\./_/; + return $headerDef; +} + +#----------------------------------------------------------------------- +sub writeFile{ + ($inFileName,$outFileName,$destDir, $symbolAppend, $symbolDef) = @_; + + $outFN = $destDir."/".$outFileName; + + $inFH = IO::File->new($inFileName,"r") + or die "could not open the file $infile for reading: $! \n"; + $outFH = IO::File->new($outFN,"w") + or die "could not open the file $outfile for writing: $! \n"; + + $headerDef = getHeaderDef($outFileName); + + printHeader($outFH, $outFileName, $headerDef, $symbolDef); + parseWriteFile($inFH, $outFH, $symbolAppend); + printFooter($outFH, $headerDef, $symbolDef); + close($inFH); + close($outFH); +} + +#----------------------------------------------------------------------- +sub printHeader{ + ($outFH, $headername, $HEADERDEF, $symbolDef) = @_; +#We will print our copyright here + warnings +print $outFH <<END_HEADER_COMMENT; +/* +******************************************************************************* +* Copyright (C) 2004, International Business Machines +* Corporation and others. All Rights Reserved. +******************************************************************************* +* +* file name: $headername +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* Created by: gendraft.pl, a perl script written by Ram Viswanadha +* +* Contains data for commenting out APIs. +* Gets included by umachine.h +* +* THIS FILE IS MACHINE-GENERATED, DON'T PLAY WITH IT IF YOU DON'T KNOW WHAT +* YOU ARE DOING, OTHERWISE VERY BAD THINGS WILL HAPPEN! +*/ + +#ifndef $HEADERDEF +#define $HEADERDEF + +#ifdef $symbolDef + +END_HEADER_COMMENT +} + +#----------------------------------------------------------------------- +sub parseWriteFile{ + ($inFH, $outFH, $symbolAppend) = @_; + while (defined ($line = <$inFH>)){ + ($a,$b,$c) = split( /\t/, $line); + #just process C APIs for now + if($b =~ /^[uU]/){ + $realSymbol = $b."_".$versionAppend; + $nonExSymbol = $b."_".$symbolAppend; + print $outFH "#define ".$realSymbol." ".$nonExSymbol."\n"; + } + } +} + +#----------------------------------------------------------------------- +sub printFooter{ + + ($outFH, $headerDef, $symbolDef ) = @_; +#print the footer +print $outFH <<END_FOOTER; + +#endif /* $symbolDef */ +#endif /* $headerDef */ + +END_FOOTER +} +#----------------------------------------------------------------------- +sub usage { + print << "END"; +Usage: +gendraft.pl +Options: + --draft-file=<path and name of output file of Doxygen containing draft API symbols> + --deprecated-file=<path and name of output file of Doxygen containing deprecated API symbols> + --obsolete-file=<path and name of output file of Doxygen containing obsolete API symbols> + --destdir=<directory> + --version=<current version of ICU> + +e.g.: gendraft.pl --draft-file=c:\blah\DraftAPI.txt --deprecated-file=c:\blah\DeprecatedAPI.txt --obsolete-file=c:\blah\ObsoleteFile.txt --destdir=<icu>/source/common/unicode --version=2.8 +END + exit(0); +} diff --git a/icuSources/tools/genidna/filterRFC3454.pl b/icuSources/tools/genidna/filterRFC3454.pl deleted file mode 100644 index bc8ef8a3..00000000 --- a/icuSources/tools/genidna/filterRFC3454.pl +++ /dev/null @@ -1,174 +0,0 @@ -#/usr/bin/perl -# Copyright (c) 2001-2003 International Business Machines -# Corporation and others. All Rights Reserved. - -#################################################################################### -# filterRFC3454.pl: -# This tool filters the RFC-3454 txt file for String prep tables -# Author: Ram Viswanadha -# -#################################################################################### - -use File::Find; -use File::Basename; -use IO::File; -use Cwd; -use File::Copy; -use Getopt::Long; -use File::Path; -use File::Copy; - -$warning = "###################\n# WARNING: This table is generated by filterRFC3454.pl tool. DO NOT EDIT \n#################\n\n"; -#run the program -main(); - -#--------------------------------------------------------------------- -# The main program - -sub main(){ - GetOptions( - "--sourcedir=s" => \$sourceDir, - "--destdir=s" => \$destDir, - "--filename=s" => \$fileName, - ); - usage() unless defined $sourceDir; - usage() unless defined $destDir; - usage() unless defined $fileName; - - $infile = $sourceDir."/".$fileName; - $inFH = IO::File->new($infile,"r") - or die "could not open the file for reading: $! \n"; - - while(defined ($line=<$inFH>)){ - next unless $line=~ /Start\sTable/; - if($line =~ /A.1/){ - createUnassignedTable($inFH,$destDir); - } - if($line =~ /B.1/){ - createCaseMapNoNorm($inFH,$destDir); - } - if($line =~ /B.2/){ - createCaseMap($inFH,$destDir); - } - if($line =~ /C.*/ ){ - createProhibitedTable($inFH,$destDir,$line); - } - } - close($inFH); -} - -#----------------------------------------------------------------------- -sub readPrint{ - local ($inFH, $outFH,$comment, $print) = @_; - $count = 0; - print $outFH $comment."\n"; - while(defined ($line = <$inFH>)){ - next if $line =~ /Hoffman\s\&\sBlanchet/; # ignore heading - next if $line =~ /RFC\s3454/; # ignore heading - next if $line =~ /\f/; # ignore form feed - next if $line eq "\n"; # ignore blank lines - # break if "End Table" is found - if( $line =~ /End\sTable/){ - print $outFH "\n# Total code points $count\n\n"; - return; - } - if($print==1){ - print $line; - } - $line =~ s/-/../; - $line =~ s/^\s+//; - if($line =~ /\;/){ - }else{ - $line =~ s/$/;/; - } - if($line =~ /\.\./){ - ($code, $noise) = split /;/ , $line; - ($startStr, $endStr ) = split /\.\./, $code; - $start = atoi($startStr); - $end = atoi($endStr); - #print $start." ".$end."\n"; - while($start <= $end){ - $count++; - $start++; - } - }else{ - $count++; - } - print $outFH $line; - } -} -#----------------------------------------------------------------------- -sub atoi { - my $t; - foreach my $d (split(//, shift())) { - $t = $t * 16 + $d; - } - return $t; -} -#----------------------------------------------------------------------- -sub createUnassignedTable{ - ($inFH,$destDir) = @_; - $outfile = $destDir."/"."rfc3454_A_1.txt"; - $outFH = IO::File->new($outfile,"w") - or die "could not open the file $outfile for writing: $! \n"; - $comment = $warning."# This file contains code points from Table A.1 from RFC 3454\n"; - readPrint($inFH,$outFH, $comment); - close($outFH); -} -#----------------------------------------------------------------------- -sub createCaseMapNoNorm{ - ($inFH,$destDir) = @_; - $outfile = $destDir."/"."rfc3454_B_1.txt"; - $outFH = IO::File->new($outfile,"w") - or die "could not open the file $outfile for writing: $! \n"; - $comment = $warning."# This file contains code points from Table B.1 from RFC 3454\n"; - readPrint($inFH,$outFH,$comment); - close($outFH); -} -#----------------------------------------------------------------------- -sub createCaseMap{ - ($inFH,$destDir) = @_; - $outfile = $destDir."/"."rfc3454_B_2.txt"; - $outFH = IO::File->new($outfile,"w") - or die "could not open the file $outfile for writing: $! \n"; - $comment = $warning."# This file contains code points from Table B.2 from RFC 3454\n"; - readPrint($inFH,$outFH,$comment); - close($outFH); -} -#----------------------------------------------------------------------- -sub createProhibitedTable{ - ($inFH,$destDir,$line) = @_; - $outfile = $destDir."/"."rfc3454_C_X.txt"; - if($line =~ /C.1.1/ && stat($outfile)){ - unlink($outfile) - or die "could not delete the file $outfile : $! \n"; - - } - $line =~ s/Start//; - $line =~ s/-//g; - $comment = $warning."# code points from $line"; - $outFH = IO::File->new($outfile, "a") - or die "could not open the file $outfile for writing: $! \n"; - readPrint($inFH,$outFH,$comment); - close($outFH); -} -#----------------------------------------------------------------------- -sub usage { - print << "END"; -Usage: -filterRFC3454.pl -Options: - --sourcedir=<directory> - --destdir=<directory> - --filename=<name of RFC file> - -e.g.: filterRFC3454.pl --sourcedir=. --destdir=./output --filename=rfc3454.txt - -filterRFC3454.pl filters the RFC file and creates String prep table files. -The RFC text can be downloaded from ftp://ftp.rfc-editor.org/in-notes/rfc3454.txt - -END - exit(0); -} - - diff --git a/icuSources/tools/genidna/genidna.c b/icuSources/tools/genidna/genidna.c deleted file mode 100644 index 038113aa..00000000 --- a/icuSources/tools/genidna/genidna.c +++ /dev/null @@ -1,548 +0,0 @@ -/* -******************************************************************************* -* -* Copyright (C) 2003, International Business Machines -* Corporation and others. All Rights Reserved. -* -******************************************************************************* -* file name: genidna.c -* encoding: US-ASCII -* tab size: 8 (not used) -* indentation:4 -* -* created on: 2003-02-06 -* created by: Ram Viswanadha -* -* This program reads the rfc3454_*.txt files, -* parses them, and extracts the data for Nameprep conformance. -* It then preprocesses it and writes a binary file for efficient use -* in various IDNA conversion processes. -*/ - -#include <stdio.h> -#include <stdlib.h> -#include "unicode/utypes.h" -#include "unicode/uchar.h" -#include "unicode/putil.h" -#include "cmemory.h" -#include "cstring.h" -#include "unicode/udata.h" -#include "unewdata.h" -#include "uoptions.h" -#include "uparse.h" -#include "unicode/uset.h" -#include "uprops.h" - -U_CDECL_BEGIN -#include "genidna.h" -U_CDECL_END - -#ifdef WIN32 -# pragma warning(disable: 4100) -#endif - -UBool beVerbose=FALSE, haveCopyright=TRUE, printRules = FALSE; - -/* prototypes --------------------------------------------------------------- */ - -static void -parseMappings(const char *filename, UBool withNorm, UBool reportError, UErrorCode *pErrorCode); - -static void -parseTable(const char *filename, UBool isUnassigned, UErrorCode *pErrorCode); - -static void -parseNormalizationCorrections(const char *filename, UErrorCode *pErrorCode); - -/*static void -setLDHValues(UErrorCode* pErrorCode);*/ - -static void -setLabelSeperators(UErrorCode* pErrorCode); - -static void -printMapping(UChar32 cp,UChar32* mapping, int32_t mappingLength); - -static const char* fileNames[] = { - "rfc3454_A_1.txt", /* contains unassigned code points */ - "rfc3454_C_X.txt", /* contains code points that are prohibited */ - "rfc3454_B_1.txt", /* contains case mappings when normalization is turned off */ - "rfc3454_B_2.txt", /* contains case mappings when normalization it turned on */ - "NormalizationCorrections.txt",/* normalization corrections */ - }; -static const char *UNIDATA_DIR = "unidata"; -static const char *MISC_DIR = "misc"; - -/* -------------------------------------------------------------------------- */ - -static UOption options[]={ - UOPTION_HELP_H, - UOPTION_HELP_QUESTION_MARK, - UOPTION_VERBOSE, - UOPTION_COPYRIGHT, - UOPTION_DESTDIR, - UOPTION_SOURCEDIR, - { "unicode", NULL, NULL, NULL, 'u', UOPT_REQUIRES_ARG, 0 }, - { "generate-rules", NULL, NULL, NULL, 'g', UOPT_NO_ARG, 0 } -}; - -extern int -main(int argc, char* argv[]) { -#if !UCONFIG_NO_IDNA - char* filename = NULL; -#endif - const char *srcDir=NULL, *destDir=NULL, *suffix=NULL; - char *basename=NULL; - char *saveBasename = NULL; - UErrorCode errorCode=U_ZERO_ERROR; - - U_MAIN_INIT_ARGS(argc, argv); - - /* preset then read command line options */ - options[4].value=u_getDataDirectory(); - options[5].value=""; - options[6].value="3.0.0"; - argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), options); - - /* error handling, printing usage message */ - if(argc<0) { - fprintf(stderr, - "error in command line argument \"%s\"\n", - argv[-argc]); - } - if(argc<0 || options[0].doesOccur || options[1].doesOccur) { - /* - * Broken into chucks because the C89 standard says the minimum - * required supported string length is 509 bytes. - */ - fprintf(stderr, - "Usage: %s [-options] [suffix]\n" - "\n" - "Read the rfc3454_*.txt files and\n" - "create a binary file " U_ICUDATA_NAME "_" DATA_NAME "." DATA_TYPE " with the normalization data\n" - "\n", - argv[0]); - fprintf(stderr, - "Options:\n" - "\t-h or -? or --help this usage text\n" - "\t-v or --verbose verbose output\n" - "\t-c or --copyright include a copyright notice\n"); - fprintf(stderr, - "\t-d or --destdir destination directory, followed by the path\n" - "\t-s or --sourcedir source directory of ICU data, followed by the path\n" - "\t-g or --generate-rules generate IDN rules for testing. Will print out rules to STDOUT\n" - ); - return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR; - } - - /* get the options values */ - beVerbose=options[2].doesOccur; - haveCopyright=options[3].doesOccur; - srcDir=options[5].value; - destDir=options[4].value; - printRules = options[7].doesOccur; - - if(argc>=2) { - suffix=argv[1]; - } else { - suffix=NULL; - } - -#if UCONFIG_NO_IDNA - - fprintf(stderr, - "genidna writes dummy " U_ICUDATA_NAME "_" DATA_NAME "." DATA_TYPE - " because UCONFIG_NO_IDNA is set, \n" - "see icu/source/common/unicode/uconfig.h\n"); - generateData(destDir); - -#else - - setUnicodeVersion(options[6].value); - filename = (char* ) uprv_malloc(uprv_strlen(srcDir) + 300); /* hopefully this should be enough */ - /* prepare the filename beginning with the source dir */ - if(uprv_strchr(srcDir,U_FILE_SEP_CHAR) == NULL){ - filename[0] = 0x2E; - filename[1] = U_FILE_SEP_CHAR; - uprv_strcpy(filename+2,srcDir); - }else{ - uprv_strcpy(filename, srcDir); - } - basename=filename+uprv_strlen(filename); - if(basename>filename && *(basename-1)!=U_FILE_SEP_CHAR) { - *basename++=U_FILE_SEP_CHAR; - } - - /* initialize */ - init(); - if(printRules){ - printf("// Copyright (C) 2003, International Business Machines\n\n"); - printf("// WARNING: This file is machine generated by %s tool. Please DO NOT edit.\n\n",argv[0]); - - printf("idn_rules{\n"); - } - - /* first copy misc directory */ - saveBasename = basename; - uprv_strcpy(basename,MISC_DIR); - basename = basename + uprv_strlen(MISC_DIR); - *basename++=U_FILE_SEP_CHAR; - - /* process unassigned */ - uprv_strcpy(basename,fileNames[0]); - parseTable(filename,TRUE, &errorCode); - if(U_FAILURE(errorCode)) { - fprintf(stderr, "Could not open file %s for reading \n", filename); - return errorCode; - } - /* process prohibited */ - uprv_strcpy(basename,fileNames[1]); - parseTable(filename,FALSE, &errorCode); - if(U_FAILURE(errorCode)) { - fprintf(stderr, "Could not open file %s for reading \n", filename); - return errorCode; - } - - /* setLDHValues(&errorCode); */ - setLabelSeperators(&errorCode); - - /* process mappings */ - if(printRules){ - printf("\n\tMapNoNormalization{\n"); - } - uprv_strcpy(basename,fileNames[2]); - parseMappings(filename, FALSE, FALSE, &errorCode); - if(U_FAILURE(errorCode)) { - fprintf(stderr, "Could not open file %s for reading \n", filename); - return errorCode; - } - if(printRules){ - printf("\n\t}\n"); - } - - if(printRules){ - printf("\n\tMapNFKC{\n"); - } - uprv_strcpy(basename,fileNames[3]); - parseMappings(filename, TRUE, FALSE, &errorCode); - if(U_FAILURE(errorCode)) { - fprintf(stderr, "Could not open file %s for reading \n", filename); - return errorCode; - } - /* set up directory for NormalizationCorrections.txt */ - basename = saveBasename; - uprv_strcpy(basename,UNIDATA_DIR); - basename = basename + uprv_strlen(UNIDATA_DIR); - *basename++=U_FILE_SEP_CHAR; - uprv_strcpy(basename,fileNames[4]); - - parseNormalizationCorrections(filename,&errorCode); - if(U_FAILURE(errorCode)){ - fprintf(stderr,"Could not open file %s for reading \n", filename); - return errorCode; - } - - /* process parsed data */ - if(U_SUCCESS(errorCode)) { - /* write the data file */ - generateData(destDir); - - cleanUpData(); - } - if(printRules){ - printf("\t\t\"::[:AGE=3.2:]NFKC;\"\n\t}\n}"); - } - - uprv_free(filename); - -#endif - - return errorCode; -} - -#if !UCONFIG_NO_IDNA - -static void U_CALLCONV -normalizationCorrectionsLineFn(void *context, - char *fields[][2], int32_t fieldCount, - UErrorCode *pErrorCode) { - uint32_t mapping[40]; - char *end, *s; - uint32_t code; - int32_t length; - UVersionInfo version; - UVersionInfo thisVersion; - - /* get the character code, field 0 */ - code=(uint32_t)uprv_strtoul(fields[0][0], &end, 16); - if(U_FAILURE(*pErrorCode)) { - fprintf(stderr, "genidn: error parsing FCNFKC_3_2_0.txt mapping at %s\n", fields[0][0]); - exit(*pErrorCode); - } - /* Original (erroneous) decomposition */ - s = fields[1][0]; - - /* parse the mapping string */ - length=u_parseCodePoints(s, mapping, sizeof(mapping)/4, pErrorCode); - - /* ignore corrected decomposition */ - - u_versionFromString(version,fields[3][0] ); - u_versionFromString(thisVersion, "3.2.0"); - - - - if(U_FAILURE(*pErrorCode)) { - fprintf(stderr, "genidn error parsing NormalizationCorrection of U+%04lx - %s\n", - (long)code, u_errorName(*pErrorCode)); - exit(*pErrorCode); - } - - /* store the mapping */ - if( version[0] > thisVersion[0] || - ((version[0]==thisVersion[0]) && (version[1] > thisVersion[1])) - ){ - storeMapping(code,mapping, length, TRUE, pErrorCode); - if(printRules){ - printMapping(code,(UChar32*)mapping,length); - } - } -} - -static void -parseNormalizationCorrections(const char *filename, UErrorCode *pErrorCode) { - char *fields[4][2]; - - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return; - } - - u_parseDelimitedFile(filename, ';', fields, 4, normalizationCorrectionsLineFn, NULL, pErrorCode); - - /* fprintf(stdout,"Number of code points that have NormalizationCorrections mapping with length >1 : %i\n",len); */ - - if(U_FAILURE(*pErrorCode) && ( *pErrorCode!=U_FILE_ACCESS_ERROR)) { - fprintf(stderr, "genidn error: u_parseDelimitedFile(\"%s\") failed - %s\n", filename, u_errorName(*pErrorCode)); - exit(*pErrorCode); - } -} - -static void U_CALLCONV -caseMapLineFn(void *context, - char *fields[][2], int32_t fieldCount, - UErrorCode *pErrorCode) { - uint32_t mapping[40]; - char *end, *s; - uint32_t code; - int32_t length; - UBool* mapWithNorm = (UBool*) context; - - - /* get the character code, field 0 */ - code=(uint32_t)uprv_strtoul(fields[0][0], &end, 16); - if(end<=fields[0][0] || end!=fields[0][1]) { - fprintf(stderr, "genidn: syntax error in field 0 at %s\n", fields[0][0]); - *pErrorCode=U_PARSE_ERROR; - exit(U_PARSE_ERROR); - } - - s = fields[1][0]; - /* parse the mapping string */ - length=u_parseCodePoints(s, mapping, sizeof(mapping)/4, pErrorCode); - - if(U_FAILURE(*pErrorCode)) { - fprintf(stderr, "genidn error parsing UnicodeData.txt decomposition of U+%04lx - %s\n", - (long)code, u_errorName(*pErrorCode)); - exit(*pErrorCode); - } - - /* store the mapping */ - - storeMapping(code,mapping, length, *mapWithNorm, pErrorCode); - if(printRules){ - printMapping(code,(UChar32*)mapping,length); - } -} - -static void -parseMappings(const char *filename,UBool withNorm, UBool reportError, UErrorCode *pErrorCode) { - char *fields[3][2]; - - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return; - } - - u_parseDelimitedFile(filename, ';', fields, 3, caseMapLineFn, &withNorm, pErrorCode); - - /*fprintf(stdout,"Number of code points that have mappings with length >1 : %i\n",len);*/ - - if(U_FAILURE(*pErrorCode) && (reportError || *pErrorCode!=U_FILE_ACCESS_ERROR)) { - fprintf(stderr, "genidn error: u_parseDelimitedFile(\"%s\") failed - %s\n", filename, u_errorName(*pErrorCode)); - exit(*pErrorCode); - } -} - -/* parser for UnicodeData.txt ----------------------------------------------- */ -static int32_t printedCharCount = 0; - -static void printEscaped(UChar32 ch){ - if(ch > 0xFFFF){ - printf("\\\\U%08X",ch); - printedCharCount+=11; - }else{ - if(uprv_isRuleWhiteSpace(ch)){ - /* double escape the rule white space */ - printf("\\\\u%04X", ch); - printedCharCount+=7; - }else if(0x20< ch && ch <0x7f){ - if(ch == 0x2E){ - /* double escape dot */ - printf("\\\\%c",(char)ch); - printedCharCount+=3; - }else{ - printf("%c",(char)ch); - printedCharCount++; - } - }else{ - printf("\\\\u%04X",ch); - printedCharCount+=7; - } - } -} -static void printEscapedRange(UChar32 rangeStart, UChar32 rangeEnd){ - if(rangeStart != rangeEnd){ - printEscaped(rangeStart); - printf("-"); - printedCharCount++; - printEscaped(rangeEnd); - printf(" "); - }else{ - printEscaped(rangeStart); - printf(" "); - } - if(printedCharCount > 70){ - printf("\"\n\t\t\t\""); - printedCharCount =0 ; - } -} -static void printMapping( UChar32 cp, UChar32* mapping, int32_t mappingLength){ - - int32_t i; - printf("\t\t\""); - printEscaped(cp); - printf(" > "); - for(i=0;i<mappingLength;i++){ - printEscaped(mapping[i]); - } - printf(";\"\n"); - - printedCharCount=0; -} -static void U_CALLCONV -unicodeDataLineFn(void *context, - char *fields[][2], int32_t fieldCount, - UErrorCode *pErrorCode) { - uint32_t rangeStart=0,rangeEnd =0; - UBool* isUnassigned = (UBool*) context; - - - u_parseCodePointRange(fields[0][0], &rangeStart,&rangeEnd, pErrorCode); - - if(U_FAILURE(*pErrorCode)){ - fprintf(stderr, "Could not parse code point range. Error: %s\n",u_errorName(*pErrorCode)); - return; - } - - if(*isUnassigned == TRUE){ - storeRange(rangeStart,rangeEnd,UIDNA_UNASSIGNED, pErrorCode); - }else{ - storeRange(rangeStart,rangeEnd,UIDNA_PROHIBITED, pErrorCode); - } - /*TODO: comment out the printer */ - if(printRules){ - printEscapedRange(rangeStart,rangeEnd); - } -} - -static void -parseTable(const char *filename,UBool isUnassigned, UErrorCode *pErrorCode) { - char *fields[1][2]; - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return; - } - /*TODO: comment out the printer */ - if(printRules){ - printedCharCount = 0; - if(isUnassigned){ - printf("\n\tUnassignedSet{\"[ "); - }else{ - printf("\n\tProhibitedSet{\"[ "); - } - } - u_parseDelimitedFile(filename, ';', fields, 1, unicodeDataLineFn, &isUnassigned, pErrorCode); - - - if(U_FAILURE(*pErrorCode)) { - fprintf(stderr, "genidn error: u_parseDelimitedFile(\"%s\") failed - %s\n", filename, u_errorName(*pErrorCode)); - exit(*pErrorCode); - } - if(printRules){ - printf("]\"}\n"); - } -} - -/* -static void -setLDHValues(UErrorCode* pErrorCode){ - USet* set = uset_openPattern(LDH_PATTERN, LDH_PATTERN_LEN, pErrorCode); - int32_t itemCount; - int32_t index = 0; - UChar32 start,end; - - if(U_FAILURE(*pErrorCode)){ - fprintf(stderr,"Could not open USet. Error :%s \n",u_errorName(*pErrorCode)); - exit(*pErrorCode); - } - - itemCount = uset_getItemCount(set); - - for(;index < itemCount; index++){ - uset_getItem(set,index, &start, &end, NULL, 0, pErrorCode); - storeRange(start,end,UIDNA_LDH_OR_MAP_NFKC, pErrorCode); - } - if(printRules){ - printf(PAT); - } - -} -*/ -static void -setLabelSeperators(UErrorCode *pErrorCode){ - /* U+002E, U+3002, U+FF0E, U+FF61 */ - storeRange(0x002E, 0x002E, UIDNA_LABEL_SEPARATOR, pErrorCode); - storeRange(0x3002, 0x3002, UIDNA_LABEL_SEPARATOR, pErrorCode); - storeRange(0xFF0E, 0xFF0E, UIDNA_LABEL_SEPARATOR, pErrorCode); - storeRange(0xFF61, 0xFF61, UIDNA_LABEL_SEPARATOR, pErrorCode); - if(U_FAILURE(*pErrorCode)){ - fprintf(stderr, "Could not store values for label separators\n"); - } - if(printRules){ - printf("\tLabelSeparatorSet{\"[ "); - printEscaped(0x002E); - printEscaped(0x3002); - printEscaped(0xFF0E); - printEscaped(0xFF61); - printf(" ]\"}\n\n"); - } -} - -#endif /* #if !UCONFIG_NO_IDNA */ - -/* - * Hey, Emacs, please set the following: - * - * Local Variables: - * indent-tabs-mode: nil - * End: - * - */ diff --git a/icuSources/tools/genidna/store.c b/icuSources/tools/genidna/store.c deleted file mode 100644 index 4a8039f6..00000000 --- a/icuSources/tools/genidna/store.c +++ /dev/null @@ -1,383 +0,0 @@ -/* -******************************************************************************* -* -* Copyright (C) 1999-2003, International Business Machines -* Corporation and others. All Rights Reserved. -* -******************************************************************************* -* file name: store.c -* encoding: US-ASCII -* tab size: 8 (not used) -* indentation:4 -* -* created on: 2003-02-06 -* created by: Ram Viswanadha -* -*/ - -#include <stdio.h> -#include <stdlib.h> -#include "unicode/utypes.h" -#include "unicode/uchar.h" -#include "cmemory.h" -#include "cstring.h" -#include "filestrm.h" -#include "unicode/udata.h" -#include "utrie.h" -#include "unicode/uset.h" -#include "unewdata.h" -#include "genidna.h" - -#ifdef WIN32 -# pragma warning(disable: 4100) -#endif - -#define DO_DEBUG_OUT 0 - - -/** -This is a simple Trie with the following structure - -16-bit IDN sets: - -Each 16-bit IDN word contains: - - 0..2 Category flags - Contains the enum values IDNStates - - 3..4 Contains the length of the mapping - If length of the mapping is < 2 the length is stored - If length of the mapping is > 2 then _IDNA_LENGTH_IN_MAPPING_TABLE - enum is stored and the length of mapping is stored in the first index - in the data array - - 5..16 Contains the index into the data array that contains the mapping - If it contains _IDNA_MAP_TO_NOTHING, then the codepoint is stripped from - the input - -*/ - -/* file data ---------------------------------------------------------------- */ -/* indexes[] value names */ - -#if UCONFIG_NO_IDNA - -/* dummy UDataInfo cf. udata.h */ -static UDataInfo dataInfo = { - sizeof(UDataInfo), - 0, - - U_IS_BIG_ENDIAN, - U_CHARSET_FAMILY, - U_SIZEOF_UCHAR, - 0, - - { 0, 0, 0, 0 }, /* dummy dataFormat */ - { 0, 0, 0, 0 }, /* dummy formatVersion */ - { 0, 0, 0, 0 } /* dummy dataVersion */ -}; - -#else - -static int32_t indexes[_IDNA_INDEX_TOP]={ 0 }; - -static uint16_t mappingData[_IDNA_MAPPING_DATA_SIZE]={0}; - -/* UDataInfo cf. udata.h */ -static UDataInfo dataInfo={ - sizeof(UDataInfo), - 0, - - U_IS_BIG_ENDIAN, - U_CHARSET_FAMILY, - U_SIZEOF_UCHAR, - 0, - - { 0x49, 0x44, 0x4e, 0x41 }, /* dataFormat="IDNA" */ - { 2, 2, UTRIE_SHIFT, UTRIE_INDEX_SHIFT }, /* formatVersion */ - { 3, 2, 0, 0 } /* dataVersion (Unicode version) */ -}; -void -setUnicodeVersion(const char *v) { - UVersionInfo version; - u_versionFromString(version, v); - uprv_memcpy(dataInfo.dataVersion, version, 4); -} - - -static UNewTrie idnTrie={ {0},0,0,0,0,0,0,0,0,{0} }; - -static int32_t currentIndex = 1; /* the current index into the data trie */ -static int32_t maxLength = 0; /* maximum length of mapping string */ - -#define MAX_DATA_LENGTH 11500 - -extern void -init() { - - /* initialize the two tries */ - if(NULL==utrie_open(&idnTrie, NULL, MAX_DATA_LENGTH, 0, FALSE)) { - fprintf(stderr, "error: failed to initialize tries\n"); - exit(U_MEMORY_ALLOCATION_ERROR); - } -} - -static void -store(uint32_t codepoint, uint32_t* mapping, int32_t length, uint32_t flags, UErrorCode* status){ - - uint32_t trieWord = 0; - int32_t i =0; - if(flags == _IDNA_MAP_TO_NOTHING){ - trieWord = flags << 5; - }else{ - if(length==0){ - trieWord = flags; - }else{ - int32_t adjustedLen = 0; - int32_t i=0; - /* - int32_t delta; - - if(length==1 && (delta=(int32_t)codepoint-(int32_t)mapping[0])>=-4096 && delta<=4095) { - printf("mapping of U+%04lx to U+%04lx could fit into a 13-bit delta (0x%lx)\n", codepoint, mapping[0], delta); - } - */ - /* set the 0..2 bits the flags */ - trieWord = flags; - - /* figure out the real length */ - for(i=0; i<length; i++){ - if(mapping[i] > 0xFFFF){ - adjustedLen +=2; - }else{ - adjustedLen++; - } - } - length = adjustedLen; - - /* set the 3..4 bits the length */ - if(length > 2){ - trieWord += _IDNA_LENGTH_IN_MAPPING_TABLE << 3; - }else{ - trieWord += (uint32_t)((length)<<3); - } - if(length > maxLength) - maxLength = length; - - /* get the current index in the data array - * and store in 5..15 bits - */ - trieWord += currentIndex << 5; - - - /* load mapping into the data array */ - i = 0; - - if(trieWord > 0xFFFF){ - fprintf(stderr,"size of trie word is greater than 0xFFFF.\n"); - } - /* set the length in mapping table */ - if(length > 2){ - mappingData[currentIndex++] = (uint16_t)length; - } - while(i<length){ - if(currentIndex < _IDNA_MAPPING_DATA_SIZE){ - if(mappingData[currentIndex]==0){ - if(mapping[i] <= 0xFFFF){ - mappingData[currentIndex++] = (uint16_t)mapping[i++]; - }else{ - mappingData[currentIndex++] = UTF16_LEAD(mapping[i]); - if(currentIndex < _IDNA_MAPPING_DATA_SIZE){ - mappingData[currentIndex++] = UTF16_TRAIL(mapping[i++]); - }else{ - fprintf(stderr, "Data Array index out of bounds.currentIndex = %i size of mapping arry = %i \n",currentIndex, _IDNA_MAPPING_DATA_SIZE); - *status = U_INDEX_OUTOFBOUNDS_ERROR; - return; - } - } - } - }else{ - fprintf(stderr, "Data Array index out of bounds.currentIndex = %i size of mapping arry = %i \n",currentIndex, _IDNA_MAPPING_DATA_SIZE); - *status = U_INDEX_OUTOFBOUNDS_ERROR; - return; - } - } - - } - } - - - i = utrie_get32(&idnTrie,codepoint,NULL); - - if(i==0){ - /* now set the value in the trie */ - if(!utrie_set32(&idnTrie,codepoint,trieWord)){ - fprintf(stderr, "error: too many mapping entries\n"); - exit(U_BUFFER_OVERFLOW_ERROR); - } - - }else{ - if(i== UIDNA_PROHIBITED){ - i += _IDNA_MAP_TO_NOTHING << 5; - /* now set the value in the trie */ - if(!utrie_set32(&idnTrie,codepoint,i)){ - fprintf(stderr, "error: too many mapping entries\n"); - exit(U_BUFFER_OVERFLOW_ERROR); - } - }else{ - fprintf(stderr, "Index array has been set for codepoint 0x%06X. \n",codepoint); - exit(U_INTERNAL_PROGRAM_ERROR); - } - } - -} -extern void -storeMapping(uint32_t codepoint, uint32_t* mapping,int32_t length, UBool withNorm, UErrorCode* status){ - - if(withNorm){ - store(codepoint,mapping,length,UIDNA_MAP_NFKC,status); - }else{ - store(codepoint,mapping,length,_IDNA_MAP_TO_NOTHING,status); - } -} - - -extern void -storeRange(uint32_t start, uint32_t end, int8_t flag,UErrorCode* status){ - uint32_t trieWord = 0, i=0; - - trieWord += flag; - - if(start == end){ - i = utrie_get32(&idnTrie,start,NULL); - if(i == 0 || i==(uint8_t)flag){ - if(!utrie_set32(&idnTrie,start,trieWord)){ - fprintf(stderr, "error: too many entries\n"); - exit(U_BUFFER_OVERFLOW_ERROR); - } - }else{ - fprintf(stderr, "Index array has been set for codepoint 0x%06X. \n",start); - exit(U_INTERNAL_PROGRAM_ERROR); - } - }else{ - if(!utrie_setRange32(&idnTrie,start,end+1,trieWord,FALSE)){ - fprintf(stderr, "error: too many entries\n"); - exit(U_BUFFER_OVERFLOW_ERROR); - } - } - -} - -/* folding value: just store the offset (16 bits) if there is any non-0 entry */ -static uint32_t U_CALLCONV -getFoldedValue(UNewTrie *trie, UChar32 start, int32_t offset) { - uint32_t foldedValue, value; - UChar32 limit; - UBool inBlockZero; - - foldedValue=0; - - limit=start+0x400; - while(start<limit) { - value=utrie_get32(trie, start, &inBlockZero); - if(inBlockZero) { - start+=UTRIE_DATA_BLOCK_LENGTH; - } else { - foldedValue|=value; - ++start; - } - } - - if(foldedValue!=0) { - return (uint32_t)(offset|0x8000); - } else { - return 0; - } -} - -#endif /* #if !UCONFIG_NO_IDNA */ - -extern void -generateData(const char *dataDir) { - static uint8_t idnTrieBlock[100000]; - - UNewDataMemory *pData; - UErrorCode errorCode=U_ZERO_ERROR; - int32_t size, dataLength; - -#if UCONFIG_NO_IDNA - - size=0; - -#else - - int32_t idnTrieSize; - - idnTrieSize=utrie_serialize(&idnTrie, idnTrieBlock, sizeof(idnTrieBlock), getFoldedValue, TRUE, &errorCode); - if(U_FAILURE(errorCode)) { - fprintf(stderr, "error: utrie_serialize(idn trie) failed, %s\n", u_errorName(errorCode)); - exit(errorCode); - } - size = idnTrieSize + sizeof(mappingData) + sizeof(indexes); - if(beVerbose) { - printf("size of idn trie %5u bytes\n", idnTrieSize); - printf("size of " U_ICUDATA_NAME "_" DATA_NAME "." DATA_TYPE " contents: %ld bytes\n", (long)size); - printf("size of mapping data array %5u bytes\n", sizeof(mappingData)); - printf("Number of code units in mappingData (currentIndex) are: %i \n", currentIndex); - printf("Maximum length of the mapping string is : %i \n", maxLength); - } - -#endif - - /* write the data */ - pData=udata_create(dataDir, DATA_TYPE, U_ICUDATA_NAME "_" DATA_NAME, &dataInfo, - haveCopyright ? U_COPYRIGHT_STRING : NULL, &errorCode); - if(U_FAILURE(errorCode)) { - fprintf(stderr, "gennorm: unable to create the output file, error %d\n", errorCode); - exit(errorCode); - } - -#if !UCONFIG_NO_IDNA - - indexes[_IDNA_INDEX_TRIE_SIZE]=idnTrieSize; - indexes[_IDNA_INDEX_MAPPING_DATA_SIZE]=sizeof(mappingData); - - udata_writeBlock(pData, indexes, sizeof(indexes)); - udata_writeBlock(pData, idnTrieBlock, idnTrieSize); - udata_writeBlock(pData, mappingData, sizeof(mappingData)); - -#endif - - /* finish up */ - dataLength=udata_finish(pData, &errorCode); - if(U_FAILURE(errorCode)) { - fprintf(stderr, "genidn: error %d writing the output file\n", errorCode); - exit(errorCode); - } - - if(dataLength!=size) { - fprintf(stderr, "genidn error: data length %ld != calculated size %ld\n", - (long)dataLength, (long)size); - exit(U_INTERNAL_PROGRAM_ERROR); - } -} - -#if !UCONFIG_NO_IDNA - -extern void -cleanUpData(void) { - - utrie_close(&idnTrie); - -} - -#endif /* #if !UCONFIG_NO_IDNA */ - -/* - * Hey, Emacs, please set the following: - * - * Local Variables: - * indent-tabs-mode: nil - * End: - * - */ diff --git a/icuSources/tools/gennames/Makefile.in b/icuSources/tools/gennames/Makefile.in index 9bf76cf0..785bc533 100644 --- a/icuSources/tools/gennames/Makefile.in +++ b/icuSources/tools/gennames/Makefile.in @@ -1,5 +1,5 @@ ## Makefile.in for ICU - tools/gennames -## Copyright (c) 1999-2003, International Business Machines Corporation and +## Copyright (c) 1999-2004, International Business Machines Corporation and ## others. All Rights Reserved. ## Steven R. Loomi @@ -16,23 +16,19 @@ subdir = tools/gennames ## +TARGET_STUB_NAME = gennames + SECTION = 8 -MANX_FILES = $(TARGET:$(EXEEXT)=).$(SECTION) +MANX_FILES = $(TARGET_STUB_NAME).$(SECTION) ALL_MAN_FILES = $(MANX_FILES) -## - -ICUDATADIR=$(top_builddir)/data/ -UNICODEDATADIR=$(top_srcdir)/../data/unidata -UNICODEFILE=$(UNICODEDATADIR)/UnicodeData.txt - ## Extra files to remove for 'make clean' -CLEANFILES = *~ $(DEPS) $(RES_FILES) $(TEST_FILES) $(ALL_MAN_FILES) +CLEANFILES = *~ $(DEPS) $(ALL_MAN_FILES) ## Target information -TARGET = gennames$(EXEEXT) +TARGET = $(BINDIR)/$(TARGET_STUB_NAME)$(EXEEXT) CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common -I$(srcdir)/../toolutil LIBS = $(LIBICUTOOLUTIL) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M) @@ -44,7 +40,7 @@ DEPS = $(OBJECTS:.o=.d) ## List of phony targets .PHONY : all all-local install install-local clean clean-local\ distclean distclean-local dist dist-local check \ -check-local build-data install-man install-manx +check-local install-man install-manx ## Clear suffix list .SUFFIXES : @@ -59,9 +55,9 @@ check: all check-local all-local: $(TARGET) $(ALL_MAN_FILES) -install-local: all-local build-data install-man +install-local: all-local install-man $(MKINSTALLDIRS) $(DESTDIR)$(sbindir) - $(INSTALL) $(TARGET) $(DESTDIR)$(sbindir)/$(TARGET) + $(INSTALL) $(TARGET) $(DESTDIR)$(sbindir) # man page install-man: install-manx diff --git a/icuSources/tools/gennames/gennames.c b/icuSources/tools/gennames/gennames.c index e6714447..18958d9c 100644 --- a/icuSources/tools/gennames/gennames.c +++ b/icuSources/tools/gennames/gennames.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1999-2001, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -119,12 +119,13 @@ */ #include <stdio.h> -#include <stdlib.h> #include "unicode/utypes.h" #include "unicode/putil.h" +#include "unicode/uclean.h" +#include "unicode/udata.h" #include "cmemory.h" #include "cstring.h" -#include "unicode/udata.h" +#include "uarrsort.h" #include "unewdata.h" #include "uoptions.h" #include "uparse.h" @@ -223,8 +224,8 @@ compressLines(void); static int16_t compressLine(uint8_t *s, int16_t length, int16_t *pGroupTop); -static int -compareWords(const void *word1, const void *word2); +static int32_t +compareWords(const void *context, const void *word1, const void *word2); static void generateData(const char *dataDir); @@ -282,9 +283,22 @@ extern int main(int argc, char* argv[]) { UVersionInfo version; UBool store10Names=FALSE; + UErrorCode errorCode = U_ZERO_ERROR; U_MAIN_INIT_ARGS(argc, argv); + /* Initialize ICU */ + u_init(&errorCode); + if (U_FAILURE(errorCode) && errorCode != U_FILE_ACCESS_ERROR) { + /* Note: u_init() will try to open ICU property data. + * failures here are expected when building ICU from scratch. + * ignore them. + */ + fprintf(stderr, "%s: can not initialize ICU. errorCode = %s\n", + argv[0], u_errorName(errorCode)); + exit(1); + } + /* preset then read command line options */ options[5].value=u_getDataDirectory(); options[6].value="3.2"; @@ -307,7 +321,7 @@ main(int argc, char* argv[]) { "Usage: %s [-1[+|-]] [-v[+|-]] [-c[+|-]] filename\n" "\n" "Read the UnicodeData.txt file and \n" - "create a binary file " U_ICUDATA_NAME "_" DATA_NAME "." DATA_TYPE " with the character names\n" + "create a binary file " DATA_NAME "." DATA_TYPE " with the character names\n" "\n" "\tfilename absolute path/filename for the Unicode database text file\n" "\t\t(default: standard input)\n" @@ -340,6 +354,7 @@ main(int argc, char* argv[]) { compress(); generateData(options[5].value); + u_cleanup(); return 0; } @@ -354,6 +369,22 @@ init() { /* parsing ------------------------------------------------------------------ */ +/* get a name, strip leading and trailing whitespace */ +static int16_t +getName(char **pStart, char *limit) { + /* strip leading whitespace */ + char *start=(char *)u_skipWhitespace(*pStart); + + /* strip trailing whitespace */ + while(start<limit && (*(limit-1)==' ' || *(limit-1)=='\t')) { + --limit; + } + + /* return results */ + *pStart=start; + return (int16_t)(limit-start); +} + static void U_CALLCONV lineFn(void *context, char *fields[][2], int32_t fieldCount, @@ -371,9 +402,8 @@ lineFn(void *context, /* get the character name */ names[0]=fields[1][0]; - if(fields[1][0][0]!='<') { - lengths[0]=(int16_t)(fields[1][1]-names[0]); - } else { + lengths[0]=getName(names+0, fields[1][1]); + if(names[0][0]=='<') { /* do not store pseudo-names in <> brackets */ lengths[0]=0; } @@ -382,15 +412,16 @@ lineFn(void *context, /* get the second character name, the one from Unicode 1.0 */ /* do not store pseudo-names in <> brackets */ names[1]=fields[10][0]; - if(*(UBool *)context && fields[10][0][0]!='<') { - lengths[1]=(int16_t)(fields[10][1]-names[1]); + lengths[1]=getName(names+1, fields[10][1]); + if(*(UBool *)context && names[1][0]!='<') { + /* keep the name */ } else { lengths[1]=0; } /* get the ISO 10646 comment */ names[2]=fields[11][0]; - lengths[2]=(int16_t)(fields[11][1]-names[2]); + lengths[2]=getName(names+2, fields[11][1]); if(lengths[0]+lengths[1]+lengths[2]==0) { return; @@ -540,9 +571,12 @@ static void compress() { uint32_t i, letterCount; int16_t wordNumber; + UErrorCode errorCode; /* sort the words in reverse order by weight */ - qsort(words, wordCount, sizeof(Word), compareWords); + errorCode=U_ZERO_ERROR; + uprv_sortArray(words, wordCount, sizeof(Word), + compareWords, NULL, FALSE, &errorCode); /* remove the words that do not save anything */ while(wordCount>0 && words[wordCount-1].weight<1) { @@ -557,7 +591,7 @@ compress() { } } if(!beQuiet) { - printf("number of letters used in the names: %d\n", letterCount); + printf("number of letters used in the names: %d\n", (int)letterCount); } /* do we need double-byte tokens? */ @@ -569,7 +603,7 @@ compress() { tokens[i]=wordNumber; if(beVerbose) { printf("tokens[0x%03x]: word%8ld \"%.*s\"\n", - i, (long)words[wordNumber].weight, + (int)i, (long)words[wordNumber].weight, words[wordNumber].length, words[wordNumber].s); } ++wordNumber; @@ -588,7 +622,9 @@ compress() { } /* sort these words in reverse order by weight */ - qsort(words+tokenCount, wordCount-tokenCount, sizeof(Word), compareWords); + errorCode=U_ZERO_ERROR; + uprv_sortArray(words+tokenCount, wordCount-tokenCount, sizeof(Word), + compareWords, NULL, FALSE, &errorCode); /* remove the words that do not save anything */ while(wordCount>0 && words[wordCount-1].weight<1) { @@ -638,7 +674,7 @@ compress() { tokens[i]=wordNumber; if(beVerbose) { printf("tokens[0x%03x]: word%8ld \"%.*s\"\n", - i, (long)words[wordNumber].weight, + (int)i, (long)words[wordNumber].weight, words[wordNumber].length, words[wordNumber].s); } ++wordNumber; @@ -653,7 +689,7 @@ compress() { tokens[i]=wordNumber; if(beVerbose) { printf("tokens[0x%03x]: word%8ld \"%.*s\"\n", - i, (long)words[wordNumber].weight, + (int)i, (long)words[wordNumber].weight, words[wordNumber].length, words[wordNumber].s); } ++wordNumber; @@ -792,8 +828,8 @@ compressLine(uint8_t *s, int16_t length, int16_t *pGroupTop) { return length; } -static int -compareWords(const void *word1, const void *word2) { +static int32_t +compareWords(const void *context, const void *word1, const void *word2) { /* reverse sort by word weight */ return ((Word *)word2)->weight-((Word *)word1)->weight; } @@ -810,7 +846,7 @@ generateData(const char *dataDir) { long dataLength; int16_t token; - pData=udata_create(dataDir, DATA_TYPE,U_ICUDATA_NAME "_" DATA_NAME, &dataInfo, + pData=udata_create(dataDir, DATA_TYPE,DATA_NAME, &dataInfo, haveCopyright ? U_COPYRIGHT_STRING : NULL, &errorCode); if(U_FAILURE(errorCode)) { fprintf(stderr, "gennames: unable to create data memory, error %d\n", errorCode); diff --git a/icuSources/tools/gennames/gennames.dsp b/icuSources/tools/gennames/gennames.dsp index 2f56f750..d331ae39 100644 --- a/icuSources/tools/gennames/gennames.dsp +++ b/icuSources/tools/gennames/gennames.dsp @@ -115,7 +115,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -150,7 +150,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe diff --git a/icuSources/tools/gennames/gennames.vcproj b/icuSources/tools/gennames/gennames.vcproj index d4e06d96..b552c71f 100644 --- a/icuSources/tools/gennames/gennames.vcproj +++ b/icuSources/tools/gennames/gennames.vcproj @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding = "Windows-1252"?> +<?xml version="1.0" encoding="Windows-1252"?> <VisualStudioProject ProjectType="Visual C++" - Version="7.00" + Version="7.10" Name="gennames" SccProjectName="" SccLocalPath=""> @@ -37,17 +37,14 @@ CompileAs="0"/> <Tool Name="VCCustomBuildTool" - CommandLine="copy $(TargetPath) ..\..\..\bin + CommandLine="copy "$(TargetPath)" ..\..\..\bin " - Outputs="..\..\..\bin\$(InputName).exe"/> + Outputs="..\..\..\bin\$(TargetFileName)"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icuuc.lib icutu.lib" OutputFile=".\Release/gennames.exe" LinkIncremental="1" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\toolutil\Release,..\..\..\lib\Release,..\..\..\lib" ProgramDatabaseFile=".\Release/gennames.pdb" SubSystem="1"/> <Tool @@ -65,8 +62,14 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> <Configuration Name="Debug|Win32" @@ -97,17 +100,14 @@ CompileAs="0"/> <Tool Name="VCCustomBuildTool" - CommandLine="copy $(TargetPath) ..\..\..\bin + CommandLine="copy "$(TargetPath)" ..\..\..\bin " - Outputs="..\..\..\bin\$(InputName).exe"/> + Outputs="..\..\..\bin\$(TargetFileName)"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icuucd.lib icutud.lib" OutputFile=".\Debug/gennames.exe" LinkIncremental="2" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\toolutil\Debug,..\..\..\lib\Debug,..\..\..\lib" GenerateDebugInformation="TRUE" ProgramDatabaseFile=".\Debug/gennames.pdb" SubSystem="1"/> @@ -126,10 +126,18 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> </Configurations> + <References> + </References> <Files> <Filter Name="Source Files" diff --git a/icuSources/tools/gennorm/Makefile.in b/icuSources/tools/gennorm/Makefile.in index caf6dc1b..9a2d5447 100644 --- a/icuSources/tools/gennorm/Makefile.in +++ b/icuSources/tools/gennorm/Makefile.in @@ -1,5 +1,5 @@ ## Makefile.in for ICU - tools/gennorm -## Copyright (c) 2001-2003, International Business Machines Corporation and +## Copyright (c) 2001-2004, International Business Machines Corporation and ## others. All Rights Reserved. ## Steven R. Loomis/Markus W. Scherer @@ -13,21 +13,20 @@ include $(top_builddir)/icudefs.mk ## +TARGET_STUB_NAME = gennorm + SECTION = 8 -MAN_FILES = $(TARGET:$(EXEEXT)=).$(SECTION) +MAN_FILES = $(TARGET_STUB_NAME).$(SECTION) ## Build directory information subdir = tools/gennorm -ICUDATADIR=$(top_builddir)/data -UNICODEDATADIR=$(top_srcdir)/../data/unidata - ## Extra files to remove for 'make clean' -CLEANFILES = *~ $(DEPS) $(RES_FILES) $(TEST_FILES) $(MAN_FILES) +CLEANFILES = *~ $(DEPS) $(MAN_FILES) ## Target information -TARGET = gennorm$(EXEEXT) +TARGET = $(BINDIR)/$(TARGET_STUB_NAME)$(EXEEXT) CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common -I$(srcdir)/../toolutil LIBS = $(LIBICUTOOLUTIL) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M) @@ -39,7 +38,7 @@ DEPS = $(OBJECTS:.o=.d) ## List of phony targets .PHONY : all all-local install install-local clean clean-local \ distclean distclean-local dist dist-local check \ -check-local build-data install-man +check-local install-man ## Clear suffix list .SUFFIXES : @@ -52,11 +51,11 @@ distclean : distclean-local dist: dist-local check: all check-local -all-local: $(TARGET) build-data $(MAN_FILES) +all-local: $(TARGET) $(MAN_FILES) install-local: all-local install-man $(MKINSTALLDIRS) $(DESTDIR)$(sbindir) - $(INSTALL) $(TARGET) $(DESTDIR)$(sbindir)/$(TARGET) + $(INSTALL) $(TARGET) $(DESTDIR)$(sbindir) # man page install-man: $(MAN_FILES) diff --git a/icuSources/tools/gennorm/gennorm.c b/icuSources/tools/gennorm/gennorm.c index 71f4ef9f..1a872476 100644 --- a/icuSources/tools/gennorm/gennorm.c +++ b/icuSources/tools/gennorm/gennorm.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2001-2003, International Business Machines +* Copyright (C) 2001-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -23,10 +23,13 @@ #include <stdlib.h> #include "unicode/utypes.h" #include "unicode/uchar.h" +#include "unicode/ustring.h" #include "unicode/putil.h" +#include "unicode/uclean.h" +#include "unicode/udata.h" +#include "unicode/uset.h" #include "cmemory.h" #include "cstring.h" -#include "unicode/udata.h" #include "unewdata.h" #include "uoptions.h" #include "uparse.h" @@ -52,6 +55,17 @@ parseDB(const char *filename, UErrorCode *pErrorCode); /* -------------------------------------------------------------------------- */ +enum { + HELP_H, + HELP_QUESTION_MARK, + VERBOSE, + COPYRIGHT, + DESTDIR, + SOURCEDIR, + UNICODE_VERSION, + ICUDATADIR +}; + static UOption options[]={ UOPTION_HELP_H, UOPTION_HELP_QUESTION_MARK, @@ -59,7 +73,8 @@ static UOption options[]={ UOPTION_COPYRIGHT, UOPTION_DESTDIR, UOPTION_SOURCEDIR, - { "unicode", NULL, NULL, NULL, 'u', UOPT_REQUIRES_ARG, 0 } + { "unicode", NULL, NULL, NULL, 'u', UOPT_REQUIRES_ARG, 0 }, + UOPTION_ICUDATADIR }; extern int @@ -77,6 +92,7 @@ main(int argc, char* argv[]) { options[4].value=u_getDataDirectory(); options[5].value=""; options[6].value="3.0.0"; + options[ICUDATADIR].value=u_getDataDirectory(); argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), options); /* error handling, printing usage message */ @@ -106,9 +122,12 @@ main(int argc, char* argv[]) { fprintf(stderr, "\t-d or --destdir destination directory, followed by the path\n" "\t-s or --sourcedir source directory, followed by the path\n" + "\t-i or --icudatadir directory for locating any needed intermediate data files,\n" + "\t followed by path, defaults to <%s>\n" "\tsuffix suffix that is to be appended with a '-'\n" "\t to the source file basenames before opening;\n" - "\t 'gennorm new' will read UnicodeData-new.txt etc.\n"); + "\t 'gennorm new' will read UnicodeData-new.txt etc.\n", + u_getDataDirectory()); return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR; } @@ -136,6 +155,28 @@ main(int argc, char* argv[]) { setUnicodeVersion(options[6].value); + if (options[ICUDATADIR].doesOccur) { + u_setDataDirectory(options[ICUDATADIR].value); + } + + /* + * Verify that we can work with properties + * but don't call u_init() because that needs unorm.icu which we are just + * going to build here. + */ + { + U_STRING_DECL(ideo, "[:Ideographic:]", 15); + USet *set; + + U_STRING_INIT(ideo, "[:Ideographic:]", 15); + set=uset_openPattern(ideo, -1, &errorCode); + if(U_FAILURE(errorCode) || !uset_contains(set, 0xf900)) { + fprintf(stderr, "gennorm is unable to work with properties (uprops.icu): %s\n", u_errorName(errorCode)); + exit(errorCode); + } + uset_close(set); + } + /* prepare the filename beginning with the source dir */ uprv_strcpy(filename, srcDir); basename=filename+uprv_strlen(filename); @@ -241,12 +282,26 @@ derivedNormalizationPropertiesLineFn(void *context, return; } - if(0==uprv_memcmp(s, "NO", 2)) { + if(0==uprv_strncmp(s, "NO", 2)) { qcFlags&=0xf; - } else if(0==uprv_memcmp(s, "MAYBE", 5)) { + } else if(0==uprv_strncmp(s, "MAYBE", 5)) { qcFlags&=0x30; + } else if(0==uprv_strncmp(s, "QC", 2) && *(s=(char *)u_skipWhitespace(s+2))==';') { + /* + * Unicode 4.0.1: + * changes single field "NFD_NO" -> two fields "NFD_QC; N" etc. + */ + /* start of the field */ + s=(char *)u_skipWhitespace(s+1); + if(*s=='N') { + qcFlags&=0xf; + } else if(*s=='M') { + qcFlags&=0x30; + } else { + return; /* do nothing for "Yes" because it's the default value */ + } } else { - return; + return; /* do nothing for "Yes" because it's the default value */ } /* set this flag for all code points in this range */ @@ -258,7 +313,11 @@ derivedNormalizationPropertiesLineFn(void *context, while(start<=end) { setCompositionExclusion(start++); } - } else if(0==uprv_memcmp(s, "FNC", 3) && *(s=(char *)u_skipWhitespace(s+3))==';') { + } else if( + ((0==uprv_memcmp(s, "FNC", 3) && *(s=(char *)u_skipWhitespace(s+3))==';') || + (0==uprv_memcmp(s, "FC_NFKC", 7) && *(s=(char *)u_skipWhitespace(s+7))==';')) + + ) { /* FC_NFKC_Closure, parse field 2 to get the string */ char *t; diff --git a/icuSources/tools/gennorm/gennorm.dsp b/icuSources/tools/gennorm/gennorm.dsp index b0053b2c..e528ff1f 100644 --- a/icuSources/tools/gennorm/gennorm.dsp +++ b/icuSources/tools/gennorm/gennorm.dsp @@ -115,7 +115,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\toolutil" /I "..\..\common" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\toolutil" /I "..\..\common" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -150,7 +150,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\toolutil" /I "..\..\common" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\toolutil" /I "..\..\common" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe diff --git a/icuSources/tools/gennorm/gennorm.vcproj b/icuSources/tools/gennorm/gennorm.vcproj index b1b2e487..ed098248 100644 --- a/icuSources/tools/gennorm/gennorm.vcproj +++ b/icuSources/tools/gennorm/gennorm.vcproj @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding = "Windows-1252"?> +<?xml version="1.0" encoding="Windows-1252"?> <VisualStudioProject ProjectType="Visual C++" - Version="7.00" + Version="7.10" Name="gennorm" SccProjectName="" SccLocalPath=""> @@ -37,17 +37,14 @@ CompileAs="0"/> <Tool Name="VCCustomBuildTool" - CommandLine="copy $(TargetPath) ..\..\..\bin + CommandLine="copy "$(TargetPath)" ..\..\..\bin " - Outputs="..\..\..\bin\$(InputName).exe"/> + Outputs="..\..\..\bin\$(TargetFileName)"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icutu.lib" OutputFile=".\Release/gennorm.exe" LinkIncremental="1" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\toolutil\Release,..\..\..\lib\Release,..\..\..\lib" ProgramDatabaseFile=".\Release/gennorm.pdb" SubSystem="1"/> <Tool @@ -65,8 +62,14 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> <Configuration Name="Debug|Win32" @@ -97,17 +100,14 @@ CompileAs="0"/> <Tool Name="VCCustomBuildTool" - CommandLine="copy $(TargetPath) ..\..\..\bin + CommandLine="copy "$(TargetPath)" ..\..\..\bin " - Outputs="..\..\..\bin\$(InputName).exe"/> + Outputs="..\..\..\bin\$(TargetFileName)"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icutud.lib" OutputFile=".\Debug/gennorm.exe" LinkIncremental="2" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\toolutil\Debug,..\..\..\lib\Debug,..\..\..\lib" GenerateDebugInformation="TRUE" ProgramDatabaseFile=".\Debug/gennorm.pdb" SubSystem="1"/> @@ -126,10 +126,18 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> </Configurations> + <References> + </References> <Files> <Filter Name="Source Files" diff --git a/icuSources/tools/gennorm/store.c b/icuSources/tools/gennorm/store.c index dfb8d101..5dc0162a 100644 --- a/icuSources/tools/gennorm/store.c +++ b/icuSources/tools/gennorm/store.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -20,12 +20,14 @@ #include <stdlib.h> #include "unicode/utypes.h" #include "unicode/uchar.h" +#include "unicode/ustring.h" #include "cmemory.h" #include "cstring.h" #include "filestrm.h" #include "unicode/udata.h" #include "utrie.h" #include "unicode/uset.h" +#include "toolutil.h" #include "unewdata.h" #include "unormimp.h" #include "gennorm.h" @@ -35,6 +37,8 @@ #define DO_DEBUG_OUT 0 +#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) + /* * The new implementation of the normalization code loads its data from * unorm.icu, which is generated with this gennorm tool. @@ -73,7 +77,7 @@ static UDataInfo dataInfo={ 0, { 0x4e, 0x6f, 0x72, 0x6d }, /* dataFormat="Norm" */ - { 2, 2, UTRIE_SHIFT, UTRIE_INDEX_SHIFT }, /* formatVersion */ + { 2, 3, UTRIE_SHIFT, UTRIE_INDEX_SHIFT }, /* formatVersion */ { 3, 2, 0, 0 } /* dataVersion (Unicode version) */ }; @@ -86,96 +90,15 @@ setUnicodeVersion(const char *v) { static int32_t indexes[_NORM_INDEX_TOP]={ 0 }; -/* tool memory helper ------------------------------------------------------- */ - -/* - * UToolMemory is used for generic, custom memory management. - * It is allocated with enough space for count*size bytes starting - * at array. - * The array is declared with a union of large data types so - * that its base address is aligned for any types. - * If size is a multiple of a data type size, then such items - * can be safely allocated inside the array, at offsets that - * are themselves multiples of size. - */ -typedef struct UToolMemory { - char name[64]; - uint32_t count, size, index; - union { - uint32_t u; - double d; - void *p; - } array[1]; -} UToolMemory; - -static UToolMemory * -utm_open(const char *name, uint32_t count, uint32_t size) { - UToolMemory *mem=(UToolMemory *)uprv_malloc(sizeof(UToolMemory)+count*size); - if(mem==NULL) { - fprintf(stderr, "error: %s - out of memory\n", name); - exit(U_MEMORY_ALLOCATION_ERROR); - } - uprv_strcpy(mem->name, name); - mem->count=count; - mem->size=size; - mem->index=0; - return mem; -} - -static void -utm_close(UToolMemory *mem) { - if(mem!=NULL) { - uprv_free(mem); - } -} - - - -static void * -utm_getStart(UToolMemory *mem) { - return (char *)mem->array; -} - -static int32_t -utm_countItems(UToolMemory *mem) { - return mem->index; -} - -static void * -utm_alloc(UToolMemory *mem) { - char *p=(char *)mem->array+mem->index*mem->size; - if(++mem->index<=mem->count) { - uprv_memset(p, 0, mem->size); - return p; - } else { - fprintf(stderr, "error: %s - trying to use more than %ld preallocated units\n", - mem->name, (long)mem->count); - exit(U_MEMORY_ALLOCATION_ERROR); - } -} - -static void * -utm_allocN(UToolMemory *mem, int32_t n) { - char *p=(char *)mem->array+mem->index*mem->size; - if((mem->index+=(uint32_t)n)<=mem->count) { - uprv_memset(p, 0, n*mem->size); - return p; - } else { - fprintf(stderr, "error: %s - trying to use more than %ld preallocated units\n", - mem->name, (long)mem->count); - exit(U_MEMORY_ALLOCATION_ERROR); - } -} - /* builder data ------------------------------------------------------------- */ typedef void EnumTrieFn(void *context, uint32_t code, Norm *norm); static UNewTrie - normTrie={ {0},0,0,0,0,0,0,0,0,{0} }, - norm32Trie={ {0},0,0,0,0,0,0,0,0,{0} }, - fcdTrie={ {0},0,0,0,0,0,0,0,0,{0} }, - auxTrie={ {0},0,0,0,0,0,0,0,0,{0} }; + *normTrie, + *norm32Trie, + *fcdTrie, + *auxTrie; static UToolMemory *normMem, *utf32Mem, *extraMem, *combiningTriplesMem; @@ -187,6 +110,9 @@ static Norm *norms; */ static uint32_t haveSeenFlags[256]; +/* set of characters with NFD_QC=No (i.e., those with canonical decompositions) */ +static USet *nfdQCNoSet; + /* see addCombiningCP() for details */ static uint32_t combiningCPs[2000]; @@ -220,7 +146,8 @@ static uint16_t combiningTable[0x8000]; static uint16_t combiningTableTop=0; #define _NORM_MAX_SET_SEARCH_TABLE_LENGTH 0x4000 -static uint16_t canonStartSets[_NORM_MAX_CANON_SETS+2*_NORM_MAX_SET_SEARCH_TABLE_LENGTH]; +static uint16_t canonStartSets[_NORM_MAX_CANON_SETS+2*_NORM_MAX_SET_SEARCH_TABLE_LENGTH + +10000]; /* +10000 for exclusion sets */ static int32_t canonStartSetsTop=_NORM_SET_INDEX_TOP; static int32_t canonSetsCount=0; @@ -228,30 +155,42 @@ extern void init() { uint16_t *p16; + normTrie = (UNewTrie *)uprv_malloc(sizeof(UNewTrie)); + uprv_memset(normTrie, 0, sizeof(UNewTrie)); + norm32Trie = (UNewTrie *)uprv_malloc(sizeof(UNewTrie)); + uprv_memset(norm32Trie, 0, sizeof(UNewTrie)); + fcdTrie = (UNewTrie *)uprv_malloc(sizeof(UNewTrie)); + uprv_memset(fcdTrie, 0, sizeof(UNewTrie)); + auxTrie = (UNewTrie *)uprv_malloc(sizeof(UNewTrie)); + uprv_memset(auxTrie, 0, sizeof(UNewTrie)); + /* initialize the two tries */ - if(NULL==utrie_open(&normTrie, NULL, 30000, 0, FALSE)) { + if(NULL==utrie_open(normTrie, NULL, 30000, 0, 0, FALSE)) { fprintf(stderr, "error: failed to initialize tries\n"); exit(U_MEMORY_ALLOCATION_ERROR); } /* allocate Norm structures and reset the first one */ - normMem=utm_open("gennorm normalization structs", 20000, sizeof(Norm)); + normMem=utm_open("gennorm normalization structs", 20000, 20000, sizeof(Norm)); norms=utm_alloc(normMem); /* allocate UTF-32 string memory */ - utf32Mem=utm_open("gennorm UTF-32 strings", 30000, 4); + utf32Mem=utm_open("gennorm UTF-32 strings", 30000, 30000, 4); /* reset all "have seen" flags */ uprv_memset(haveSeenFlags, 0, sizeof(haveSeenFlags)); + /* open an empty set */ + nfdQCNoSet=uset_open(1, 0); + /* allocate extra data memory for UTF-16 decomposition strings and other values */ - extraMem=utm_open("gennorm extra 16-bit memory", _NORM_EXTRA_INDEX_TOP, 2); + extraMem=utm_open("gennorm extra 16-bit memory", _NORM_EXTRA_INDEX_TOP, _NORM_EXTRA_INDEX_TOP, 2); /* initialize the extraMem counter for the top of FNC strings */ p16=(uint16_t *)utm_alloc(extraMem); *p16=1; /* allocate temporary memory for combining triples */ - combiningTriplesMem=utm_open("gennorm combining triples", 0x4000, sizeof(CombiningTriple)); + combiningTriplesMem=utm_open("gennorm combining triples", 0x4000, 0x4000, sizeof(CombiningTriple)); /* set the minimum code points for no/maybe quick check values to the end of the BMP */ indexes[_NORM_INDEX_MIN_NFC_NO_MAYBE]=0xffff; @@ -272,13 +211,13 @@ createNorm(uint32_t code) { Norm *p; uint32_t i; - i=utrie_get32(&normTrie, (UChar32)code, NULL); + i=utrie_get32(normTrie, (UChar32)code, NULL); if(i!=0) { p=norms+i; } else { /* allocate Norm */ p=(Norm *)utm_alloc(normMem); - if(!utrie_set32(&normTrie, (UChar32)code, (uint32_t)(p-norms))) { + if(!utrie_set32(normTrie, (UChar32)code, (uint32_t)(p-norms))) { fprintf(stderr, "error: too many normalization entries\n"); exit(U_BUFFER_OVERFLOW_ERROR); } @@ -291,7 +230,7 @@ static Norm * getNorm(uint32_t code) { uint32_t i; - i=utrie_get32(&normTrie, (UChar32)code, NULL); + i=utrie_get32(normTrie, (UChar32)code, NULL); if(i==0) { return NULL; } @@ -321,7 +260,7 @@ enumTrie(EnumTrieFn *fn, void *context) { count=0; for(code=0; code<=0x10ffff;) { - i=utrie_get32(&normTrie, code, &isInBlockZero); + i=utrie_get32(normTrie, code, &isInBlockZero); if(isInBlockZero) { code+=UTRIE_DATA_BLOCK_LENGTH; } else { @@ -499,7 +438,7 @@ processCombining() { triples=utm_getStart(combiningTriplesMem); /* add lead and trail indexes to the triples for sorting */ - count=(uint16_t)combiningTriplesMem->index; + count=(uint16_t)utm_countItems(combiningTriplesMem); for(i=0; i<count; ++i) { /* findCombiningCP() must always find the code point */ triples[i].leadIndex=findCombiningCP(triples[i].lead, TRUE); @@ -880,6 +819,10 @@ setQCFlags(uint32_t code, uint8_t qcFlags) { indexes[_NORM_INDEX_MIN_NFKD_NO_MAYBE]=(uint16_t)code; } } + + if(qcFlags&_NORM_QC_NFD) { + uset_add(nfdQCNoSet, (UChar32)code); + } } extern void @@ -931,7 +874,7 @@ setHangulJamoSpecials() { norm->specialTag=_NORM_EXTRA_INDEX_TOP+_NORM_EXTRA_HANGUL; norm->qcFlags=_NORM_QC_NFD|_NORM_QC_NFKD; - if(!utrie_setRange32(&normTrie, 0xac00, 0xd7a4, (uint32_t)(norm-norms), TRUE)) { + if(!utrie_setRange32(normTrie, 0xac00, 0xd7a4, (uint32_t)(norm-norms), TRUE)) { fprintf(stderr, "error: too many normalization entries (setting Hangul)\n"); exit(U_BUFFER_OVERFLOW_ERROR); } @@ -1108,7 +1051,7 @@ postParseFn(void *context, uint32_t code, Norm *norm) { } else { uset_add(otherNorm->canonStart, code); if(!uset_contains(otherNorm->canonStart, code)) { - fprintf(stderr, "gennorm error: uset_add(setOf(U+%4x), U+%4x)\n", c, code); + fprintf(stderr, "gennorm error: uset_add(setOf(U+%4x), U+%4x)\n", (int)c, (int)code); exit(U_INTERNAL_PROGRAM_ERROR); } } @@ -1256,12 +1199,12 @@ makeAll32() { uint32_t n; int32_t i, normLength, count; - count=(int32_t)normMem->index; + count=(int32_t)utm_countItems(normMem); for(i=0; i<count; ++i) { norms[i].value32=make32BitNorm(norms+i); } - pNormData=utrie_getData(&norm32Trie, &normLength); + pNormData=utrie_getData(norm32Trie, &normLength); count=0; for(i=0; i<normLength; ++i) { @@ -1283,7 +1226,7 @@ makeFCD() { int32_t i, count, fcdLength; uint16_t bothCCs; - count=(int32_t)normMem->index; + count=utm_countItems(normMem); for(i=0; i<count; ++i) { bothCCs=norms[i].canonBothCCs; if(bothCCs==0) { @@ -1294,7 +1237,7 @@ makeFCD() { norms[i].value32=bothCCs; } - pFCDData=utrie_getData(&fcdTrie, &fcdLength); + pFCDData=utrie_getData(fcdTrie, &fcdLength); for(i=0; i<fcdLength; ++i) { n=pFCDData[i]; @@ -1371,7 +1314,7 @@ makeCanonSetFn(void *context, uint32_t code, Norm *norm) { canonStartSets[_NORM_SET_INDEX_CANON_SETS_LENGTH]=(uint16_t)canonStartSetsTop; if(U_FAILURE(errorCode)) { - fprintf(stderr, "gennorm error: uset_serialize()->%s (canonStartSetsTop=%d)\n", u_errorName(errorCode), canonStartSetsTop); + fprintf(stderr, "gennorm error: uset_serialize()->%s (canonStartSetsTop=%d)\n", u_errorName(errorCode), (int)canonStartSetsTop); exit(errorCode); } if(tableLength>_NORM_MAX_SET_SEARCH_TABLE_LENGTH) { @@ -1391,7 +1334,7 @@ combine(uint32_t lead, uint32_t trail) { /* search for all triples with c as lead code point */ triples=utm_getStart(combiningTriplesMem); - count=combiningTriplesMem->index; + count=utm_countItems(combiningTriplesMem); /* triples are not sorted by code point but for each lead CP there is one contiguous block */ for(i=0; i<count && lead!=triples[i].lead; ++i) {} @@ -1440,8 +1383,8 @@ doesComposeConsume(const uint32_t *s, int32_t length, uint32_t c, uint8_t cc) { for(i=1; i<length; ++i) { starter=combine((uint32_t)starter, s[i]); if(starter<0) { - fprintf(stderr, "error: unable to consume normal decomposition in doesComposeConsume(<%04x, %04x, ...>[%ld], U+%04lx, %u)\n", - s[0], s[1], (long)length, (long)c, cc); + fprintf(stderr, "error: unable to consume normal decomposition in doesComposeConsume(<%04x, %04x, ...>[%d], U+%04x, %u)\n", + (int)s[0], (int)s[1], (int)length, (int)c, cc); exit(U_INTERNAL_PROGRAM_ERROR); } } @@ -1503,7 +1446,7 @@ canChangeWithFollowing(const uint32_t *s, int32_t length, uint8_t trailCC) { /* search for all triples with c as lead code point */ triples=utm_getStart(combiningTriplesMem); - count=combiningTriplesMem->index; + count=utm_countItems(combiningTriplesMem); c=s[0]; /* triples are not sorted by code point but for each lead CP there is one contiguous block */ @@ -1600,7 +1543,7 @@ makeAux() { uint32_t *pData; int32_t i, length; - pData=utrie_getData(&auxTrie, &length); + pData=utrie_getData(auxTrie, &length); for(i=0; i<length; ++i) { norm=norms+pData[i]; @@ -1746,9 +1689,9 @@ processData() { enumTrie(makeCanonSetFn, NULL); /* clone the normalization builder trie to make the final data tries */ - if( NULL==utrie_clone(&norm32Trie, &normTrie, NULL, 0) || - NULL==utrie_clone(&fcdTrie, &normTrie, NULL, 0) || - NULL==utrie_clone(&auxTrie, &normTrie, NULL, 0) + if( NULL==utrie_clone(norm32Trie, normTrie, NULL, 0) || + NULL==utrie_clone(fcdTrie, normTrie, NULL, 0) || + NULL==utrie_clone(auxTrie, normTrie, NULL, 0) ) { fprintf(stderr, "error: unable to clone the normalization trie\n"); exit(U_MEMORY_ALLOCATION_ERROR); @@ -1793,21 +1736,24 @@ generateData(const char *dataDir) { #else + U_STRING_DECL(nxCJKCompatPattern, "[:Ideographic:]", 15); + U_STRING_DECL(nxUnicode32Pattern, "[:^Age=3.2:]", 12); + USet *set; int32_t normTrieSize, fcdTrieSize, auxTrieSize; - normTrieSize=utrie_serialize(&norm32Trie, normTrieBlock, sizeof(normTrieBlock), getFoldedNormValue, FALSE, &errorCode); + normTrieSize=utrie_serialize(norm32Trie, normTrieBlock, sizeof(normTrieBlock), getFoldedNormValue, FALSE, &errorCode); if(U_FAILURE(errorCode)) { fprintf(stderr, "error: utrie_serialize(normalization properties) failed, %s\n", u_errorName(errorCode)); exit(errorCode); } - fcdTrieSize=utrie_serialize(&fcdTrie, fcdTrieBlock, sizeof(fcdTrieBlock), getFoldedFCDValue, TRUE, &errorCode); + fcdTrieSize=utrie_serialize(fcdTrie, fcdTrieBlock, sizeof(fcdTrieBlock), getFoldedFCDValue, TRUE, &errorCode); if(U_FAILURE(errorCode)) { fprintf(stderr, "error: utrie_serialize(FCD data) failed, %s\n", u_errorName(errorCode)); exit(errorCode); } - auxTrieSize=utrie_serialize(&auxTrie, auxTrieBlock, sizeof(auxTrieBlock), getFoldedAuxValue, TRUE, &errorCode); + auxTrieSize=utrie_serialize(auxTrie, auxTrieBlock, sizeof(auxTrieBlock), getFoldedAuxValue, TRUE, &errorCode); if(U_FAILURE(errorCode)) { fprintf(stderr, "error: utrie_serialize(auxiliary data) failed, %s\n", u_errorName(errorCode)); exit(errorCode); @@ -1828,8 +1774,48 @@ generateData(const char *dataDir) { } canonStartSetsTop+=canonStartSets[_NORM_SET_INDEX_CANON_SUPP_TABLE_LENGTH]; + /* create the normalization exclusion sets */ + /* + * nxCJKCompatPattern should be [[:Ideographic:]&[:NFD_QC=No:]] + * but we cannot use NFD_QC from the pattern because that would require + * unorm.icu which we are just going to generate. + * Therefore we have manually collected nfdQCNoSet and intersect Ideographic + * with that. + */ + U_STRING_INIT(nxCJKCompatPattern, "[:Ideographic:]", 15); + U_STRING_INIT(nxUnicode32Pattern, "[:^Age=3.2:]", 12); + + canonStartSets[_NORM_SET_INDEX_NX_CJK_COMPAT_OFFSET]=canonStartSetsTop; + set=uset_openPattern(nxCJKCompatPattern, -1, &errorCode); + if(U_FAILURE(errorCode)) { + fprintf(stderr, "error: uset_openPattern([:Ideographic:]&[:NFD_QC=No:]) failed, %s\n", u_errorName(errorCode)); + exit(errorCode); + } + uset_retainAll(set, nfdQCNoSet); + canonStartSetsTop+=uset_serialize(set, canonStartSets+canonStartSetsTop, LENGTHOF(canonStartSets)-canonStartSetsTop, &errorCode); + if(U_FAILURE(errorCode)) { + fprintf(stderr, "error: uset_serialize([:Ideographic:]&[:NFD_QC=No:]) failed, %s\n", u_errorName(errorCode)); + exit(errorCode); + } + uset_close(set); + + canonStartSets[_NORM_SET_INDEX_NX_UNICODE32_OFFSET]=canonStartSetsTop; + set=uset_openPattern(nxUnicode32Pattern, -1, &errorCode); + if(U_FAILURE(errorCode)) { + fprintf(stderr, "error: uset_openPattern([:^Age=3.2:]) failed, %s\n", u_errorName(errorCode)); + exit(errorCode); + } + canonStartSetsTop+=uset_serialize(set, canonStartSets+canonStartSetsTop, LENGTHOF(canonStartSets)-canonStartSetsTop, &errorCode); + if(U_FAILURE(errorCode)) { + fprintf(stderr, "error: uset_serialize([:^Age=3.2:]) failed, %s\n", u_errorName(errorCode)); + exit(errorCode); + } + uset_close(set); + + canonStartSets[_NORM_SET_INDEX_NX_RESERVED_OFFSET]=canonStartSetsTop; + /* make sure that the FCD trie is 4-aligned */ - if((extraMem->index+combiningTableTop)&1) { + if((utm_countItems(extraMem)+combiningTableTop)&1) { combiningTable[combiningTableTop++]=0x1234; /* add one 16-bit word for an even number */ } @@ -1841,30 +1827,31 @@ generateData(const char *dataDir) { size= _NORM_INDEX_TOP*4+ normTrieSize+ - extraMem->index*2+ + utm_countItems(extraMem)*2+ combiningTableTop*2+ fcdTrieSize+ auxTrieSize+ canonStartSetsTop*2; if(beVerbose) { - printf("size of normalization trie %5u bytes\n", normTrieSize); - printf("size of 16-bit extra memory %5u UChars/uint16_t\n", extraMem->index); + printf("size of normalization trie %5u bytes\n", (int)normTrieSize); + printf("size of 16-bit extra memory %5u UChars/uint16_t\n", (int)utm_countItems(extraMem)); printf(" of that: FC_NFKC_Closure size %5u UChars/uint16_t\n", ((uint16_t *)utm_getStart(extraMem))[0]); printf("size of combining table %5u uint16_t\n", combiningTableTop); - printf("size of FCD trie %5u bytes\n", fcdTrieSize); - printf("size of auxiliary trie %5u bytes\n", auxTrieSize); - printf("size of canonStartSets[] %5u uint16_t\n", canonStartSetsTop); + printf("size of FCD trie %5u bytes\n", (int)fcdTrieSize); + printf("size of auxiliary trie %5u bytes\n", (int)auxTrieSize); + printf("size of canonStartSets[] %5u uint16_t\n", (int)canonStartSetsTop); printf(" number of indexes %5u uint16_t\n", _NORM_SET_INDEX_TOP); printf(" size of sets %5u uint16_t\n", canonStartSets[_NORM_SET_INDEX_CANON_SETS_LENGTH]-_NORM_SET_INDEX_TOP); - printf(" number of sets %5d\n", canonSetsCount); + printf(" number of sets %5d\n", (int)canonSetsCount); printf(" size of BMP search table %5u uint16_t\n", canonStartSets[_NORM_SET_INDEX_CANON_BMP_TABLE_LENGTH]); printf(" size of supplementary search table %5u uint16_t\n", canonStartSets[_NORM_SET_INDEX_CANON_SUPP_TABLE_LENGTH]); + printf(" length of exclusion sets %5u uint16_t\n", canonStartSets[_NORM_SET_INDEX_NX_RESERVED_OFFSET]-canonStartSets[_NORM_SET_INDEX_NX_CJK_COMPAT_OFFSET]); printf("size of " U_ICUDATA_NAME "_" DATA_NAME "." DATA_TYPE " contents: %ld bytes\n", (long)size); } indexes[_NORM_INDEX_TRIE_SIZE]=normTrieSize; - indexes[_NORM_INDEX_UCHAR_COUNT]=(uint16_t)extraMem->index; + indexes[_NORM_INDEX_UCHAR_COUNT]=(uint16_t)utm_countItems(extraMem); indexes[_NORM_INDEX_COMBINE_DATA_COUNT]=combiningTableTop; indexes[_NORM_INDEX_COMBINE_FWD_COUNT]=combineFwdTop; @@ -1880,7 +1867,7 @@ generateData(const char *dataDir) { #endif /* write the data */ - pData=udata_create(dataDir, DATA_TYPE, U_ICUDATA_NAME "_" DATA_NAME, &dataInfo, + pData=udata_create(dataDir, DATA_TYPE, DATA_NAME, &dataInfo, haveCopyright ? U_COPYRIGHT_STRING : NULL, &errorCode); if(U_FAILURE(errorCode)) { fprintf(stderr, "gennorm: unable to create the output file, error %d\n", errorCode); @@ -1891,7 +1878,7 @@ generateData(const char *dataDir) { udata_writeBlock(pData, indexes, sizeof(indexes)); udata_writeBlock(pData, normTrieBlock, normTrieSize); - udata_writeBlock(pData, utm_getStart(extraMem), extraMem->index*2); + udata_writeBlock(pData, utm_getStart(extraMem), utm_countItems(extraMem)*2); udata_writeBlock(pData, combiningTable, combiningTableTop*2); udata_writeBlock(pData, fcdTrieBlock, fcdTrieSize); udata_writeBlock(pData, auxTrieBlock, auxTrieSize); @@ -1919,7 +1906,7 @@ extern void cleanUpData(void) { int32_t i, count; - count=(int32_t)normMem->index; + count=utm_countItems(normMem); for(i=0; i<count; ++i) { uset_close(norms[i].canonStart); } @@ -1928,10 +1915,17 @@ cleanUpData(void) { utm_close(utf32Mem); utm_close(extraMem); utm_close(combiningTriplesMem); - utrie_close(&normTrie); - utrie_close(&norm32Trie); - utrie_close(&fcdTrie); - utrie_close(&auxTrie); + utrie_close(normTrie); + utrie_close(norm32Trie); + utrie_close(fcdTrie); + utrie_close(auxTrie); + + uset_close(nfdQCNoSet); + + uprv_free(normTrie); + uprv_free(norm32Trie); + uprv_free(fcdTrie); + uprv_free(auxTrie); } #endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/icuSources/tools/genpname/Makefile.in b/icuSources/tools/genpname/Makefile.in index 9d5af646..0c30400c 100644 --- a/icuSources/tools/genpname/Makefile.in +++ b/icuSources/tools/genpname/Makefile.in @@ -1,5 +1,5 @@ ## Makefile.in for ICU - tools/genpname -## Copyright (c) 1999-2003, International Business Machines Corporation and +## Copyright (c) 1999-2004, International Business Machines Corporation and ## others. All Rights Reserved. ## Steven R. Loomis @@ -16,11 +16,13 @@ include $(top_builddir)/icudefs.mk ## Build directory information subdir = tools/genpname +TARGET_STUB_NAME = genpname + ## Extra files to remove for 'make clean' -CLEANFILES = *~ $(DEPS) $(OBJECTS) $(TARGET) +CLEANFILES = *~ $(DEPS) ## Target information -TARGET = genpname$(EXEEXT) +TARGET = $(BINDIR)/$(TARGET_STUB_NAME)$(EXEEXT) CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common -I$(srcdir)/../toolutil LIBS = $(LIBICUTOOLUTIL) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M) @@ -32,7 +34,7 @@ DEPS = $(OBJECTS:.o=.d) ## List of phony targets .PHONY : all all-local install install-local clean clean-local \ distclean distclean-local dist dist-local check \ -check-local build-data +check-local ## Clear suffix list .SUFFIXES : @@ -45,11 +47,11 @@ distclean : distclean-local dist: dist-local check: all check-local -all-local: $(TARGET) build-data $(MAN_FILES) +all-local: $(TARGET) $(MAN_FILES) install-local: all-local $(MKINSTALLDIRS) $(DESTDIR)$(sbindir) - $(INSTALL) $(TARGET) $(DESTDIR)$(sbindir)/$(TARGET) + $(INSTALL) $(TARGET) $(DESTDIR)$(sbindir) dist-local: diff --git a/icuSources/tools/genpname/SyntheticPropertyAliases.txt b/icuSources/tools/genpname/SyntheticPropertyAliases.txt index 335ce660..fa9b1b26 100644 --- a/icuSources/tools/genpname/SyntheticPropertyAliases.txt +++ b/icuSources/tools/genpname/SyntheticPropertyAliases.txt @@ -1,5 +1,5 @@ ###################################################################### -# Copyright (c) 2003, International Business Machines +# Copyright (c) 2003-2004, International Business Machines # Corporation and others. All Rights Reserved. ###################################################################### # Author: Alan Liu @@ -21,6 +21,11 @@ # Enumerated Non-Binary Properties # ================================================ +# lccc(c)=ccc(NFD(c)[0]) +# tccc(c)=ccc(NFD(c)[last]) +lccc; Lead_Canonical_Combining_Class +tccc; Trail_Canonical_Combining_Class + # ================================================ # Bitmask Properties # ================================================ @@ -30,3 +35,10 @@ gcm ; General_Category_Mask # Binary Properties # ================================================ Sensitive ; Case_Sensitive + +nfdinert; NFD_Inert +nfkdinert; NFKD_Inert +nfcinert; NFC_Inert +nfkcinert; NFKC_Inert + +segstart; Segment_Starter diff --git a/icuSources/tools/genpname/data.h b/icuSources/tools/genpname/data.h index 237ea490..9b370d5e 100644 --- a/icuSources/tools/genpname/data.h +++ b/icuSources/tools/genpname/data.h @@ -1,5 +1,5 @@ /** - * Copyright (C) 2002-2003, International Business Machines Corporation and + * Copyright (C) 2002-2004, International Business Machines Corporation and * others. All Rights Reserved. * * MACHINE GENERATED FILE. !!! Do not edit manually !!! @@ -11,18 +11,18 @@ * PropertyAliases.txt * PropertyValueAliases.txt * - * Date: Tue Jun 3 17:01:25 2003 - * Unicode version: 4.0.0 + * Date: Mon May 3 17:13:38 2004 + * Unicode version: 4.0.1 * Script: preparse.pl */ -/* Unicode version 4.0.0 */ +/* Unicode version 4.0.1 */ const uint8_t VERSION_0 = 4; const uint8_t VERSION_1 = 0; -const uint8_t VERSION_2 = 0; +const uint8_t VERSION_2 = 1; const uint8_t VERSION_3 = 0; -const int32_t STRING_COUNT = 629; +const int32_t STRING_COUNT = 663; /* to be sorted */ const AliasName STRING_TABLE[] = { @@ -30,1634 +30,1779 @@ const AliasName STRING_TABLE[] = { AliasName("A", 1), AliasName("AHex", 2), AliasName("AI", 3), - AliasName("AIN", 4), - AliasName("AL", 5), - AliasName("ALAPH", 6), - AliasName("ALEF", 7), - AliasName("AN", 8), - AliasName("AR", 9), - AliasName("ASCII_Hex_Digit", 10), - AliasName("ATAR", 11), - AliasName("ATB", 12), - AliasName("Above", 13), - AliasName("Above_Left", 14), - AliasName("Above_Right", 15), - AliasName("Aegean_Numbers", 16), - AliasName("Age", 17), - AliasName("Alpha", 18), - AliasName("Alphabetic", 19), - AliasName("Alphabetic_Presentation_Forms", 20), - AliasName("Ambiguous", 21), - AliasName("Arab", 22), - AliasName("Arabic", 23), - AliasName("Arabic_Letter", 24), - AliasName("Arabic_Number", 25), - AliasName("Arabic_Presentation_Forms-A", 26), - AliasName("Arabic_Presentation_Forms-B", 27), - AliasName("Armenian", 28), - AliasName("Armn", 29), - AliasName("Arrows", 30), - AliasName("Attached_Above_Right", 31), - AliasName("Attached_Below", 32), - AliasName("B", 33), - AliasName("B2", 34), - AliasName("BA", 35), - AliasName("BB", 36), - AliasName("BEH", 37), - AliasName("BETH", 38), + AliasName("AL", 4), + AliasName("AN", 5), + AliasName("AR", 6), + AliasName("ASCII_Hex_Digit", 7), + AliasName("ATAR", 8), + AliasName("ATB", 9), + AliasName("ATBL", 10), + AliasName("Above", 11), + AliasName("Above_Left", 12), + AliasName("Above_Right", 13), + AliasName("Aegean_Numbers", 14), + AliasName("Age", 15), + AliasName("Ain", 16), + AliasName("Alaph", 17), + AliasName("Alef", 18), + AliasName("Alpha", 19), + AliasName("Alphabetic", 20), + AliasName("Alphabetic_Presentation_Forms", 21), + AliasName("Ambiguous", 22), + AliasName("Arab", 23), + AliasName("Arabic", 24), + AliasName("Arabic_Letter", 25), + AliasName("Arabic_Number", 26), + AliasName("Arabic_Presentation_Forms-A", 27), + AliasName("Arabic_Presentation_Forms-B", 28), + AliasName("Armenian", 29), + AliasName("Armn", 30), + AliasName("Arrows", 31), + AliasName("Attached_Above_Right", 32), + AliasName("Attached_Below", 33), + AliasName("Attached_Below_Left", 34), + AliasName("B", 35), + AliasName("B2", 36), + AliasName("BA", 37), + AliasName("BB", 38), AliasName("BK", 39), AliasName("BL", 40), AliasName("BN", 41), AliasName("BR", 42), AliasName("Basic_Latin", 43), - AliasName("Below", 44), - AliasName("Below_Left", 45), - AliasName("Below_Right", 46), - AliasName("Beng", 47), - AliasName("Bengali", 48), - AliasName("Bidi_C", 49), - AliasName("Bidi_Class", 50), - AliasName("Bidi_Control", 51), - AliasName("Bidi_M", 52), - AliasName("Bidi_Mirrored", 53), - AliasName("Bidi_Mirroring_Glyph", 54), - AliasName("Block", 55), - AliasName("Block_Elements", 56), - AliasName("Bopo", 57), - AliasName("Bopomofo", 58), - AliasName("Bopomofo_Extended", 59), - AliasName("Boundary_Neutral", 60), - AliasName("Box_Drawing", 61), - AliasName("Brai", 62), - AliasName("Braille", 63), - AliasName("Braille_Patterns", 64), - AliasName("Break_After", 65), - AliasName("Break_Before", 66), - AliasName("Break_Both", 67), - AliasName("Break_Symbols", 68), - AliasName("Buhd", 69), - AliasName("Buhid", 70), - AliasName("Byzantine_Musical_Symbols", 71), - AliasName("C", 72), - AliasName("CB", 73), - AliasName("CJK_Compatibility", 74), - AliasName("CJK_Compatibility_Forms", 75), - AliasName("CJK_Compatibility_Ideographs", 76), - AliasName("CJK_Compatibility_Ideographs_Supplement", 77), - AliasName("CJK_Radicals_Supplement", 78), - AliasName("CJK_Symbols_and_Punctuation", 79), - AliasName("CJK_Unified_Ideographs", 80), - AliasName("CJK_Unified_Ideographs_Extension_A", 81), - AliasName("CJK_Unified_Ideographs_Extension_B", 82), - AliasName("CL", 83), - AliasName("CM", 84), - AliasName("CR", 85), - AliasName("CS", 86), - AliasName("Canadian_Aboriginal", 87), - AliasName("Canonical_Combining_Class", 88), - AliasName("Cans", 89), - AliasName("Carriage_Return", 90), - AliasName("Case_Folding", 91), - AliasName("Case_Sensitive", 92), - AliasName("Cased_Letter", 93), - AliasName("Cc", 94), - AliasName("Cf", 95), - AliasName("Cher", 96), - AliasName("Cherokee", 97), - AliasName("Close_Punctuation", 98), - AliasName("Cn", 99), - AliasName("Co", 100), - AliasName("Combining_Diacritical_Marks", 101), - AliasName("Combining_Diacritical_Marks_for_Symbols", 102), - AliasName("Combining_Half_Marks", 103), - AliasName("Combining_Mark", 104), - AliasName("Common", 105), - AliasName("Common_Separator", 106), - AliasName("Comp_Ex", 107), - AliasName("Complex_Context", 108), - AliasName("Connector_Punctuation", 109), - AliasName("Contingent_Break", 110), - AliasName("Control", 111), - AliasName("Control_Pictures", 112), - AliasName("Coptic", 113), - AliasName("Cprt", 114), - AliasName("Cs", 115), - AliasName("Currency_Symbol", 116), - AliasName("Currency_Symbols", 117), - AliasName("Cypriot", 118), - AliasName("Cypriot_Syllabary", 119), - AliasName("Cyrillic", 120), - AliasName("Cyrillic_Supplementary", 121), - AliasName("Cyrl", 122), - AliasName("D", 123), - AliasName("DA", 124), - AliasName("DAL", 125), - AliasName("DALATH_RISH", 126), - AliasName("DB", 127), - AliasName("DI", 128), - AliasName("Dash", 129), - AliasName("Dash_Punctuation", 130), - AliasName("Decimal", 131), - AliasName("Decimal_Number", 132), - AliasName("Decomposition_Type", 133), - AliasName("Default_Ignorable_Code_Point", 134), - AliasName("Dep", 135), - AliasName("Deprecated", 136), - AliasName("Deseret", 137), - AliasName("Deva", 138), - AliasName("Devanagari", 139), - AliasName("Dia", 140), - AliasName("Diacritic", 141), - AliasName("Digit", 142), - AliasName("Dingbats", 143), - AliasName("Double_Above", 144), - AliasName("Double_Below", 145), - AliasName("Dsrt", 146), - AliasName("Dual_Joining", 147), - AliasName("E", 148), - AliasName("EN", 149), - AliasName("ES", 150), - AliasName("ET", 151), - AliasName("EX", 152), - AliasName("East_Asian_Width", 153), - AliasName("Enclosed_Alphanumerics", 154), - AliasName("Enclosed_CJK_Letters_and_Months", 155), - AliasName("Enclosing_Mark", 156), - AliasName("Ethi", 157), - AliasName("Ethiopic", 158), - AliasName("European_Number", 159), - AliasName("European_Separator", 160), - AliasName("European_Terminator", 161), - AliasName("Exclamation", 162), - AliasName("Ext", 163), - AliasName("Extender", 164), - AliasName("F", 165), - AliasName("FE", 166), - AliasName("FEH", 167), - AliasName("FINAL_SEMKATH", 168), - AliasName("False", 169), - AliasName("Final_Punctuation", 170), - AliasName("Format", 171), - AliasName("Full_Composition_Exclusion", 172), - AliasName("Fullwidth", 173), - AliasName("GAF", 174), - AliasName("GAMAL", 175), - AliasName("GL", 176), - AliasName("General_Category", 177), - AliasName("General_Category_Mask", 178), - AliasName("General_Punctuation", 179), - AliasName("Geometric_Shapes", 180), - AliasName("Geor", 181), - AliasName("Georgian", 182), - AliasName("Glue", 183), - AliasName("Goth", 184), - AliasName("Gothic", 185), - AliasName("Gr_Base", 186), - AliasName("Gr_Ext", 187), - AliasName("Gr_Link", 188), - AliasName("Grapheme_Base", 189), - AliasName("Grapheme_Extend", 190), - AliasName("Grapheme_Link", 191), - AliasName("Greek", 192), - AliasName("Greek_Extended", 193), - AliasName("Greek_and_Coptic", 194), - AliasName("Grek", 195), - AliasName("Gujarati", 196), - AliasName("Gujr", 197), - AliasName("Gurmukhi", 198), - AliasName("Guru", 199), - AliasName("H", 200), - AliasName("HAH", 201), - AliasName("HAMZA_ON_HEH_GOAL", 202), - AliasName("HE", 203), - AliasName("HEH", 204), - AliasName("HEH_GOAL", 205), - AliasName("HETH", 206), - AliasName("HY", 207), - AliasName("Halfwidth", 208), - AliasName("Halfwidth_and_Fullwidth_Forms", 209), - AliasName("Han", 210), - AliasName("Hang", 211), - AliasName("Hangul", 212), - AliasName("Hangul_Compatibility_Jamo", 213), - AliasName("Hangul_Jamo", 214), - AliasName("Hangul_Syllable_Type", 215), - AliasName("Hangul_Syllables", 216), - AliasName("Hani", 217), - AliasName("Hano", 218), - AliasName("Hanunoo", 219), - AliasName("Hebr", 220), - AliasName("Hebrew", 221), - AliasName("Hex", 222), - AliasName("Hex_Digit", 223), - AliasName("High_Private_Use_Surrogates", 224), - AliasName("High_Surrogates", 225), - AliasName("Hira", 226), - AliasName("Hiragana", 227), - AliasName("Hyphen", 228), - AliasName("ID", 229), - AliasName("IDC", 230), - AliasName("IDS", 231), - AliasName("IDSB", 232), - AliasName("IDST", 233), - AliasName("IDS_Binary_Operator", 234), - AliasName("IDS_Trinary_Operator", 235), - AliasName("ID_Continue", 236), - AliasName("ID_Start", 237), - AliasName("IN", 238), - AliasName("IPA_Extensions", 239), - AliasName("IS", 240), - AliasName("ISO_Comment", 241), - AliasName("Ideo", 242), - AliasName("Ideographic", 243), - AliasName("Ideographic_Description_Characters", 244), - AliasName("Infix_Numeric", 245), - AliasName("Inherited", 246), - AliasName("Initial_Punctuation", 247), - AliasName("Inseperable", 248), - AliasName("Iota_Subscript", 249), - AliasName("Ital", 250), - AliasName("Join_C", 251), - AliasName("Join_Causing", 252), - AliasName("Join_Control", 253), - AliasName("Joining_Group", 254), - AliasName("Joining_Type", 255), - AliasName("KAF", 256), - AliasName("KAPH", 257), - AliasName("KHAPH", 258), - AliasName("KNOTTED_HEH", 259), - AliasName("KV", 260), - AliasName("Kana", 261), - AliasName("Kana_Voicing", 262), - AliasName("Kanbun", 263), - AliasName("Kangxi_Radicals", 264), - AliasName("Kannada", 265), - AliasName("Katakana", 266), - AliasName("Katakana_Phonetic_Extensions", 267), - AliasName("Khmer", 268), - AliasName("Khmer_Symbols", 269), - AliasName("Khmr", 270), - AliasName("Knda", 271), - AliasName("L", 272), - AliasName("LAM", 273), - AliasName("LAMADH", 274), - AliasName("LC", 275), - AliasName("LF", 276), - AliasName("LOE", 277), - AliasName("LRE", 278), - AliasName("LRO", 279), - AliasName("LV", 280), - AliasName("LVT", 281), - AliasName("LVT_Syllable", 282), - AliasName("LV_Syllable", 283), - AliasName("Lao", 284), - AliasName("Laoo", 285), - AliasName("Latin", 286), - AliasName("Latin-1_Supplement", 287), - AliasName("Latin_Extended-A", 288), - AliasName("Latin_Extended-B", 289), - AliasName("Latin_Extended_Additional", 290), - AliasName("Latn", 291), - AliasName("Leading_Jamo", 292), - AliasName("Left", 293), - AliasName("Left_Joining", 294), - AliasName("Left_To_Right", 295), - AliasName("Left_To_Right_Embedding", 296), - AliasName("Left_To_Right_Override", 297), - AliasName("Letter", 298), - AliasName("Letter_Number", 299), - AliasName("Letterlike_Symbols", 300), - AliasName("Limb", 301), - AliasName("Limbu", 302), - AliasName("Linb", 303), - AliasName("Line_Break", 304), - AliasName("Line_Feed", 305), - AliasName("Line_Separator", 306), - AliasName("Linear_B", 307), - AliasName("Linear_B_Ideograms", 308), - AliasName("Linear_B_Syllabary", 309), - AliasName("Ll", 310), - AliasName("Lm", 311), - AliasName("Lo", 312), - AliasName("Logical_Order_Exception", 313), - AliasName("Low_Surrogates", 314), - AliasName("Lower", 315), - AliasName("Lowercase", 316), - AliasName("Lowercase_Letter", 317), - AliasName("Lowercase_Mapping", 318), - AliasName("Lt", 319), - AliasName("Lu", 320), - AliasName("M", 321), - AliasName("MEEM", 322), - AliasName("MIM", 323), - AliasName("Malayalam", 324), - AliasName("Mandatory_Break", 325), - AliasName("Mark", 326), - AliasName("Math", 327), - AliasName("Math_Symbol", 328), - AliasName("Mathematical_Alphanumeric_Symbols", 329), - AliasName("Mathematical_Operators", 330), - AliasName("Mc", 331), - AliasName("Me", 332), - AliasName("Miscellaneous_Mathematical_Symbols-A", 333), - AliasName("Miscellaneous_Mathematical_Symbols-B", 334), - AliasName("Miscellaneous_Symbols", 335), - AliasName("Miscellaneous_Symbols_and_Arrows", 336), - AliasName("Miscellaneous_Technical", 337), - AliasName("Mlym", 338), - AliasName("Mn", 339), - AliasName("Modifier_Letter", 340), - AliasName("Modifier_Symbol", 341), - AliasName("Mong", 342), - AliasName("Mongolian", 343), - AliasName("Musical_Symbols", 344), - AliasName("Myanmar", 345), - AliasName("Mymr", 346), - AliasName("N", 347), - AliasName("NA", 348), - AliasName("NChar", 349), - AliasName("NK", 350), - AliasName("NL", 351), - AliasName("NOON", 352), - AliasName("NO_JOINING_GROUP", 353), - AliasName("NR", 354), - AliasName("NS", 355), - AliasName("NSM", 356), - AliasName("NU", 357), - AliasName("NUN", 358), - AliasName("Na", 359), - AliasName("Name", 360), - AliasName("Narrow", 361), - AliasName("Nd", 362), - AliasName("Neutral", 363), - AliasName("Next_Line", 364), - AliasName("Nl", 365), - AliasName("No", 366), - AliasName("No_Block", 367), - AliasName("Non_Joining", 368), - AliasName("Noncharacter_Code_Point", 369), - AliasName("None", 370), - AliasName("Nonspacing_Mark", 371), - AliasName("Nonstarter", 372), - AliasName("Not_Applicable", 373), - AliasName("Not_Reordered", 374), - AliasName("Nukta", 375), - AliasName("Number", 376), - AliasName("Number_Forms", 377), - AliasName("Numeric", 378), - AliasName("Numeric_Type", 379), - AliasName("Numeric_Value", 380), - AliasName("ON", 381), - AliasName("OP", 382), - AliasName("OV", 383), - AliasName("Ogam", 384), - AliasName("Ogham", 385), - AliasName("Old_Italic", 386), - AliasName("Open_Punctuation", 387), - AliasName("Optical_Character_Recognition", 388), - AliasName("Oriya", 389), - AliasName("Orya", 390), - AliasName("Osma", 391), - AliasName("Osmanya", 392), - AliasName("Other", 393), - AliasName("Other_Letter", 394), - AliasName("Other_Neutral", 395), - AliasName("Other_Number", 396), - AliasName("Other_Punctuation", 397), - AliasName("Other_Symbol", 398), - AliasName("Overlay", 399), - AliasName("P", 400), - AliasName("PDF", 401), - AliasName("PE", 402), - AliasName("PO", 403), - AliasName("PR", 404), - AliasName("Paragraph_Separator", 405), - AliasName("Pc", 406), - AliasName("Pd", 407), - AliasName("Pe", 408), - AliasName("Pf", 409), - AliasName("Phonetic_Extensions", 410), - AliasName("Pi", 411), - AliasName("Po", 412), - AliasName("Pop_Directional_Format", 413), - AliasName("Postfix_Numeric", 414), - AliasName("Prefix_Numeric", 415), - AliasName("Private_Use", 416), - AliasName("Private_Use_Area", 417), - AliasName("Ps", 418), - AliasName("Punctuation", 419), - AliasName("QAF", 420), - AliasName("QAPH", 421), - AliasName("QMark", 422), - AliasName("QU", 423), - AliasName("Qaac", 424), - AliasName("Qaai", 425), - AliasName("Quotation", 426), - AliasName("Quotation_Mark", 427), - AliasName("R", 428), - AliasName("REH", 429), - AliasName("REVERSED_PE", 430), - AliasName("RLE", 431), - AliasName("RLO", 432), - AliasName("Radical", 433), - AliasName("Right", 434), - AliasName("Right_Joining", 435), - AliasName("Right_To_Left", 436), - AliasName("Right_To_Left_Embedding", 437), - AliasName("Right_To_Left_Override", 438), - AliasName("Runic", 439), - AliasName("Runr", 440), - AliasName("S", 441), - AliasName("SA", 442), - AliasName("SAD", 443), - AliasName("SADHE", 444), - AliasName("SD", 445), - AliasName("SEEN", 446), - AliasName("SEMKATH", 447), - AliasName("SG", 448), - AliasName("SHIN", 449), - AliasName("SP", 450), - AliasName("SWASH_KAF", 451), - AliasName("SY", 452), - AliasName("SYRIAC_WAW", 453), - AliasName("Sc", 454), - AliasName("Script", 455), - AliasName("Segment_Separator", 456), - AliasName("Sensitive", 457), - AliasName("Separator", 458), - AliasName("Shavian", 459), - AliasName("Shaw", 460), - AliasName("Simple_Case_Folding", 461), - AliasName("Simple_Lowercase_Mapping", 462), - AliasName("Simple_Titlecase_Mapping", 463), - AliasName("Simple_Uppercase_Mapping", 464), - AliasName("Sinh", 465), - AliasName("Sinhala", 466), - AliasName("Sk", 467), - AliasName("Sm", 468), - AliasName("Small_Form_Variants", 469), - AliasName("So", 470), - AliasName("Soft_Dotted", 471), - AliasName("Space", 472), - AliasName("Space_Separator", 473), - AliasName("Spacing_Mark", 474), - AliasName("Spacing_Modifier_Letters", 475), - AliasName("Specials", 476), - AliasName("Superscripts_and_Subscripts", 477), - AliasName("Supplemental_Arrows-A", 478), - AliasName("Supplemental_Arrows-B", 479), - AliasName("Supplemental_Mathematical_Operators", 480), - AliasName("Supplementary_Private_Use_Area-A", 481), - AliasName("Supplementary_Private_Use_Area-B", 482), - AliasName("Surrogate", 483), - AliasName("Symbol", 484), - AliasName("Syrc", 485), - AliasName("Syriac", 486), - AliasName("T", 487), - AliasName("TAH", 488), - AliasName("TAW", 489), - AliasName("TEH_MARBUTA", 490), - AliasName("TETH", 491), - AliasName("Tagalog", 492), - AliasName("Tagb", 493), - AliasName("Tagbanwa", 494), - AliasName("Tags", 495), - AliasName("Tai_Le", 496), - AliasName("Tai_Xuan_Jing_Symbols", 497), - AliasName("Tale", 498), - AliasName("Tamil", 499), - AliasName("Taml", 500), - AliasName("Telu", 501), - AliasName("Telugu", 502), - AliasName("Term", 503), - AliasName("Terminal_Punctuation", 504), - AliasName("Tglg", 505), - AliasName("Thaa", 506), - AliasName("Thaana", 507), - AliasName("Thai", 508), - AliasName("Tibetan", 509), - AliasName("Tibt", 510), - AliasName("Titlecase_Letter", 511), - AliasName("Titlecase_Mapping", 512), - AliasName("Trailing_Jamo", 513), - AliasName("Transparent", 514), - AliasName("True", 515), - AliasName("U", 516), - AliasName("UIdeo", 517), - AliasName("Ugar", 518), - AliasName("Ugaritic", 519), - AliasName("Unassigned", 520), - AliasName("Unicode_1_Name", 521), - AliasName("Unified_Canadian_Aboriginal_Syllabics", 522), - AliasName("Unified_Ideograph", 523), - AliasName("Unknown", 524), - AliasName("Upper", 525), - AliasName("Uppercase", 526), - AliasName("Uppercase_Letter", 527), - AliasName("Uppercase_Mapping", 528), - AliasName("V", 529), - AliasName("VR", 530), - AliasName("Variation_Selectors", 531), - AliasName("Variation_Selectors_Supplement", 532), - AliasName("Virama", 533), - AliasName("Vowel_Jamo", 534), - AliasName("W", 535), - AliasName("WAW", 536), - AliasName("WJ", 537), - AliasName("WS", 538), - AliasName("WSpace", 539), - AliasName("White_Space", 540), - AliasName("Wide", 541), - AliasName("Word_Joiner", 542), - AliasName("XIDC", 543), - AliasName("XIDS", 544), - AliasName("XID_Continue", 545), - AliasName("XID_Start", 546), - AliasName("XX", 547), - AliasName("YEH", 548), - AliasName("YEH_BARREE", 549), - AliasName("YEH_WITH_TAIL", 550), - AliasName("YUDH", 551), - AliasName("YUDH_HE", 552), - AliasName("Yi", 553), - AliasName("Yi_Radicals", 554), - AliasName("Yi_Syllables", 555), - AliasName("Yiii", 556), - AliasName("Yijing_Hexagram_Symbols", 557), - AliasName("Z", 558), - AliasName("ZAIN", 559), - AliasName("ZHAIN", 560), - AliasName("ZW", 561), - AliasName("ZWSpace", 562), - AliasName("Zl", 563), - AliasName("Zp", 564), - AliasName("Zs", 565), - AliasName("Zyyy", 566), - AliasName("age", 567), - AliasName("bc", 568), - AliasName("blk", 569), - AliasName("bmg", 570), - AliasName("can", 571), - AliasName("canonical", 572), - AliasName("ccc", 573), - AliasName("cf", 574), - AliasName("circle", 575), - AliasName("com", 576), - AliasName("compat", 577), - AliasName("de", 578), - AliasName("di", 579), - AliasName("dt", 580), - AliasName("ea", 581), - AliasName("enc", 582), - AliasName("fin", 583), - AliasName("final", 584), - AliasName("font", 585), - AliasName("fra", 586), - AliasName("fraction", 587), - AliasName("gc", 588), - AliasName("gcm", 589), - AliasName("hst", 590), - AliasName("init", 591), - AliasName("initial", 592), - AliasName("isc", 593), - AliasName("iso", 594), - AliasName("isolated", 595), - AliasName("jg", 596), - AliasName("jt", 597), - AliasName("lb", 598), - AliasName("lc", 599), - AliasName("med", 600), - AliasName("medial", 601), - AliasName("na", 602), - AliasName("na1", 603), - AliasName("nar", 604), - AliasName("narrow", 605), - AliasName("nb", 606), - AliasName("noBreak", 607), - AliasName("none", 608), - AliasName("nt", 609), - AliasName("nu", 610), - AliasName("nv", 611), - AliasName("sc", 612), - AliasName("sfc", 613), - AliasName("slc", 614), - AliasName("small", 615), - AliasName("sml", 616), - AliasName("sqr", 617), - AliasName("square", 618), - AliasName("stc", 619), - AliasName("sub", 620), - AliasName("suc", 621), - AliasName("sup", 622), - AliasName("super", 623), - AliasName("tc", 624), - AliasName("uc", 625), - AliasName("vert", 626), - AliasName("vertical", 627), - AliasName("wide", 628), + AliasName("Beh", 44), + AliasName("Below", 45), + AliasName("Below_Left", 46), + AliasName("Below_Right", 47), + AliasName("Beng", 48), + AliasName("Bengali", 49), + AliasName("Beth", 50), + AliasName("Bidi_C", 51), + AliasName("Bidi_Class", 52), + AliasName("Bidi_Control", 53), + AliasName("Bidi_M", 54), + AliasName("Bidi_Mirrored", 55), + AliasName("Bidi_Mirroring_Glyph", 56), + AliasName("Block", 57), + AliasName("Block_Elements", 58), + AliasName("Bopo", 59), + AliasName("Bopomofo", 60), + AliasName("Bopomofo_Extended", 61), + AliasName("Boundary_Neutral", 62), + AliasName("Box_Drawing", 63), + AliasName("Brai", 64), + AliasName("Braille", 65), + AliasName("Braille_Patterns", 66), + AliasName("Break_After", 67), + AliasName("Break_Before", 68), + AliasName("Break_Both", 69), + AliasName("Break_Symbols", 70), + AliasName("Buhd", 71), + AliasName("Buhid", 72), + AliasName("Byzantine_Musical_Symbols", 73), + AliasName("C", 74), + AliasName("CB", 75), + AliasName("CJK_Compatibility", 76), + AliasName("CJK_Compatibility_Forms", 77), + AliasName("CJK_Compatibility_Ideographs", 78), + AliasName("CJK_Compatibility_Ideographs_Supplement", 79), + AliasName("CJK_Radicals_Supplement", 80), + AliasName("CJK_Symbols_and_Punctuation", 81), + AliasName("CJK_Unified_Ideographs", 82), + AliasName("CJK_Unified_Ideographs_Extension_A", 83), + AliasName("CJK_Unified_Ideographs_Extension_B", 84), + AliasName("CL", 85), + AliasName("CM", 86), + AliasName("CR", 87), + AliasName("CS", 88), + AliasName("Canadian_Aboriginal", 89), + AliasName("Canonical", 90), + AliasName("Canonical_Combining_Class", 91), + AliasName("Cans", 92), + AliasName("Carriage_Return", 93), + AliasName("Case_Folding", 94), + AliasName("Case_Sensitive", 95), + AliasName("Cased_Letter", 96), + AliasName("Cc", 97), + AliasName("Cf", 98), + AliasName("Cher", 99), + AliasName("Cherokee", 100), + AliasName("Circle", 101), + AliasName("Close_Punctuation", 102), + AliasName("Cn", 103), + AliasName("Co", 104), + AliasName("Combining_Diacritical_Marks", 105), + AliasName("Combining_Diacritical_Marks_for_Symbols", 106), + AliasName("Combining_Half_Marks", 107), + AliasName("Combining_Mark", 108), + AliasName("Common", 109), + AliasName("Common_Separator", 110), + AliasName("Comp_Ex", 111), + AliasName("Compat", 112), + AliasName("Complex_Context", 113), + AliasName("Connector_Punctuation", 114), + AliasName("Contingent_Break", 115), + AliasName("Control", 116), + AliasName("Control_Pictures", 117), + AliasName("Coptic", 118), + AliasName("Cprt", 119), + AliasName("Cs", 120), + AliasName("Currency_Symbol", 121), + AliasName("Currency_Symbols", 122), + AliasName("Cypriot", 123), + AliasName("Cypriot_Syllabary", 124), + AliasName("Cyrillic", 125), + AliasName("Cyrillic_Supplement", 126), + AliasName("Cyrillic_Supplementary", 127), + AliasName("Cyrl", 128), + AliasName("D", 129), + AliasName("DA", 130), + AliasName("DB", 131), + AliasName("DI", 132), + AliasName("Dal", 133), + AliasName("Dalath_Rish", 134), + AliasName("Dash", 135), + AliasName("Dash_Punctuation", 136), + AliasName("De", 137), + AliasName("Decimal", 138), + AliasName("Decimal_Number", 139), + AliasName("Decomposition_Type", 140), + AliasName("Default_Ignorable_Code_Point", 141), + AliasName("Dep", 142), + AliasName("Deprecated", 143), + AliasName("Deseret", 144), + AliasName("Deva", 145), + AliasName("Devanagari", 146), + AliasName("Di", 147), + AliasName("Dia", 148), + AliasName("Diacritic", 149), + AliasName("Digit", 150), + AliasName("Dingbats", 151), + AliasName("Double_Above", 152), + AliasName("Double_Below", 153), + AliasName("Dsrt", 154), + AliasName("Dual_Joining", 155), + AliasName("E", 156), + AliasName("EN", 157), + AliasName("ES", 158), + AliasName("ET", 159), + AliasName("EX", 160), + AliasName("East_Asian_Width", 161), + AliasName("Enclosed_Alphanumerics", 162), + AliasName("Enclosed_CJK_Letters_and_Months", 163), + AliasName("Enclosing_Mark", 164), + AliasName("Ethi", 165), + AliasName("Ethiopic", 166), + AliasName("European_Number", 167), + AliasName("European_Separator", 168), + AliasName("European_Terminator", 169), + AliasName("Exclamation", 170), + AliasName("Ext", 171), + AliasName("Extender", 172), + AliasName("F", 173), + AliasName("False", 174), + AliasName("Fe", 175), + AliasName("Feh", 176), + AliasName("Final", 177), + AliasName("Final_Punctuation", 178), + AliasName("Final_Semkath", 179), + AliasName("Font", 180), + AliasName("Format", 181), + AliasName("Fraction", 182), + AliasName("Full_Composition_Exclusion", 183), + AliasName("Fullwidth", 184), + AliasName("GL", 185), + AliasName("Gaf", 186), + AliasName("Gamal", 187), + AliasName("General_Category", 188), + AliasName("General_Category_Mask", 189), + AliasName("General_Punctuation", 190), + AliasName("Geometric_Shapes", 191), + AliasName("Geor", 192), + AliasName("Georgian", 193), + AliasName("Glue", 194), + AliasName("Goth", 195), + AliasName("Gothic", 196), + AliasName("Gr_Base", 197), + AliasName("Gr_Ext", 198), + AliasName("Gr_Link", 199), + AliasName("Grapheme_Base", 200), + AliasName("Grapheme_Extend", 201), + AliasName("Grapheme_Link", 202), + AliasName("Greek", 203), + AliasName("Greek_Extended", 204), + AliasName("Greek_and_Coptic", 205), + AliasName("Grek", 206), + AliasName("Gujarati", 207), + AliasName("Gujr", 208), + AliasName("Gurmukhi", 209), + AliasName("Guru", 210), + AliasName("H", 211), + AliasName("HY", 212), + AliasName("Hah", 213), + AliasName("Halfwidth", 214), + AliasName("Halfwidth_and_Fullwidth_Forms", 215), + AliasName("Hamza_On_Heh_Goal", 216), + AliasName("Han", 217), + AliasName("Hang", 218), + AliasName("Hangul", 219), + AliasName("Hangul_Compatibility_Jamo", 220), + AliasName("Hangul_Jamo", 221), + AliasName("Hangul_Syllable_Type", 222), + AliasName("Hangul_Syllables", 223), + AliasName("Hani", 224), + AliasName("Hano", 225), + AliasName("Hanunoo", 226), + AliasName("He", 227), + AliasName("Hebr", 228), + AliasName("Hebrew", 229), + AliasName("Heh", 230), + AliasName("Heh_Goal", 231), + AliasName("Heth", 232), + AliasName("Hex", 233), + AliasName("Hex_Digit", 234), + AliasName("High_Private_Use_Surrogates", 235), + AliasName("High_Surrogates", 236), + AliasName("Hira", 237), + AliasName("Hiragana", 238), + AliasName("Hrkt", 239), + AliasName("Hyphen", 240), + AliasName("ID", 241), + AliasName("IDC", 242), + AliasName("IDS", 243), + AliasName("IDSB", 244), + AliasName("IDST", 245), + AliasName("IDS_Binary_Operator", 246), + AliasName("IDS_Trinary_Operator", 247), + AliasName("ID_Continue", 248), + AliasName("ID_Start", 249), + AliasName("IN", 250), + AliasName("IPA_Extensions", 251), + AliasName("IS", 252), + AliasName("ISO_Comment", 253), + AliasName("Ideo", 254), + AliasName("Ideographic", 255), + AliasName("Ideographic_Description_Characters", 256), + AliasName("Infix_Numeric", 257), + AliasName("Inherited", 258), + AliasName("Initial", 259), + AliasName("Initial_Punctuation", 260), + AliasName("Inseparable", 261), + AliasName("Inseperable", 262), + AliasName("Iota_Subscript", 263), + AliasName("Isolated", 264), + AliasName("Ital", 265), + AliasName("Join_C", 266), + AliasName("Join_Causing", 267), + AliasName("Join_Control", 268), + AliasName("Joining_Group", 269), + AliasName("Joining_Type", 270), + AliasName("KV", 271), + AliasName("Kaf", 272), + AliasName("Kana", 273), + AliasName("Kana_Voicing", 274), + AliasName("Kanbun", 275), + AliasName("Kangxi_Radicals", 276), + AliasName("Kannada", 277), + AliasName("Kaph", 278), + AliasName("Katakana", 279), + AliasName("Katakana_Or_Hiragana", 280), + AliasName("Katakana_Phonetic_Extensions", 281), + AliasName("Khaph", 282), + AliasName("Khmer", 283), + AliasName("Khmer_Symbols", 284), + AliasName("Khmr", 285), + AliasName("Knda", 286), + AliasName("Knotted_Heh", 287), + AliasName("L", 288), + AliasName("LC", 289), + AliasName("LF", 290), + AliasName("LOE", 291), + AliasName("LRE", 292), + AliasName("LRO", 293), + AliasName("LV", 294), + AliasName("LVT", 295), + AliasName("LVT_Syllable", 296), + AliasName("LV_Syllable", 297), + AliasName("Lam", 298), + AliasName("Lamadh", 299), + AliasName("Lao", 300), + AliasName("Laoo", 301), + AliasName("Latin", 302), + AliasName("Latin-1_Supplement", 303), + AliasName("Latin_Extended-A", 304), + AliasName("Latin_Extended-B", 305), + AliasName("Latin_Extended_Additional", 306), + AliasName("Latn", 307), + AliasName("Lead_Canonical_Combining_Class", 308), + AliasName("Leading_Jamo", 309), + AliasName("Left", 310), + AliasName("Left_Joining", 311), + AliasName("Left_To_Right", 312), + AliasName("Left_To_Right_Embedding", 313), + AliasName("Left_To_Right_Override", 314), + AliasName("Letter", 315), + AliasName("Letter_Number", 316), + AliasName("Letterlike_Symbols", 317), + AliasName("Limb", 318), + AliasName("Limbu", 319), + AliasName("Linb", 320), + AliasName("Line_Break", 321), + AliasName("Line_Feed", 322), + AliasName("Line_Separator", 323), + AliasName("Linear_B", 324), + AliasName("Linear_B_Ideograms", 325), + AliasName("Linear_B_Syllabary", 326), + AliasName("Ll", 327), + AliasName("Lm", 328), + AliasName("Lo", 329), + AliasName("Logical_Order_Exception", 330), + AliasName("Low_Surrogates", 331), + AliasName("Lower", 332), + AliasName("Lowercase", 333), + AliasName("Lowercase_Letter", 334), + AliasName("Lowercase_Mapping", 335), + AliasName("Lt", 336), + AliasName("Lu", 337), + AliasName("M", 338), + AliasName("Malayalam", 339), + AliasName("Mandatory_Break", 340), + AliasName("Mark", 341), + AliasName("Math", 342), + AliasName("Math_Symbol", 343), + AliasName("Mathematical_Alphanumeric_Symbols", 344), + AliasName("Mathematical_Operators", 345), + AliasName("Maybe", 346), + AliasName("Mc", 347), + AliasName("Me", 348), + AliasName("Medial", 349), + AliasName("Meem", 350), + AliasName("Mim", 351), + AliasName("Miscellaneous_Mathematical_Symbols-A", 352), + AliasName("Miscellaneous_Mathematical_Symbols-B", 353), + AliasName("Miscellaneous_Symbols", 354), + AliasName("Miscellaneous_Symbols_and_Arrows", 355), + AliasName("Miscellaneous_Technical", 356), + AliasName("Mlym", 357), + AliasName("Mn", 358), + AliasName("Modifier_Letter", 359), + AliasName("Modifier_Symbol", 360), + AliasName("Mong", 361), + AliasName("Mongolian", 362), + AliasName("Musical_Symbols", 363), + AliasName("Myanmar", 364), + AliasName("Mymr", 365), + AliasName("N", 366), + AliasName("NA", 367), + AliasName("NChar", 368), + AliasName("NFC_Inert", 369), + AliasName("NFC_QC", 370), + AliasName("NFC_Quick_Check", 371), + AliasName("NFD_Inert", 372), + AliasName("NFD_QC", 373), + AliasName("NFD_Quick_Check", 374), + AliasName("NFKC_Inert", 375), + AliasName("NFKC_QC", 376), + AliasName("NFKC_Quick_Check", 377), + AliasName("NFKD_Inert", 378), + AliasName("NFKD_QC", 379), + AliasName("NFKD_Quick_Check", 380), + AliasName("NK", 381), + AliasName("NL", 382), + AliasName("NR", 383), + AliasName("NS", 384), + AliasName("NSM", 385), + AliasName("NU", 386), + AliasName("Na", 387), + AliasName("Name", 388), + AliasName("Narrow", 389), + AliasName("Nd", 390), + AliasName("Neutral", 391), + AliasName("Next_Line", 392), + AliasName("Nl", 393), + AliasName("No", 394), + AliasName("No_Block", 395), + AliasName("No_Joining_Group", 396), + AliasName("Nobreak", 397), + AliasName("Non_Joining", 398), + AliasName("Noncharacter_Code_Point", 399), + AliasName("None", 400), + AliasName("Nonspacing_Mark", 401), + AliasName("Nonstarter", 402), + AliasName("Noon", 403), + AliasName("Not_Applicable", 404), + AliasName("Not_Reordered", 405), + AliasName("Nu", 406), + AliasName("Nukta", 407), + AliasName("Number", 408), + AliasName("Number_Forms", 409), + AliasName("Numeric", 410), + AliasName("Numeric_Type", 411), + AliasName("Numeric_Value", 412), + AliasName("Nun", 413), + AliasName("ON", 414), + AliasName("OP", 415), + AliasName("OV", 416), + AliasName("Ogam", 417), + AliasName("Ogham", 418), + AliasName("Old_Italic", 419), + AliasName("Open_Punctuation", 420), + AliasName("Optical_Character_Recognition", 421), + AliasName("Oriya", 422), + AliasName("Orya", 423), + AliasName("Osma", 424), + AliasName("Osmanya", 425), + AliasName("Other", 426), + AliasName("Other_Letter", 427), + AliasName("Other_Neutral", 428), + AliasName("Other_Number", 429), + AliasName("Other_Punctuation", 430), + AliasName("Other_Symbol", 431), + AliasName("Overlay", 432), + AliasName("P", 433), + AliasName("PDF", 434), + AliasName("PO", 435), + AliasName("PR", 436), + AliasName("Paragraph_Separator", 437), + AliasName("Pc", 438), + AliasName("Pd", 439), + AliasName("Pe", 440), + AliasName("Pf", 441), + AliasName("Phonetic_Extensions", 442), + AliasName("Pi", 443), + AliasName("Po", 444), + AliasName("Pop_Directional_Format", 445), + AliasName("Postfix_Numeric", 446), + AliasName("Prefix_Numeric", 447), + AliasName("Private_Use", 448), + AliasName("Private_Use_Area", 449), + AliasName("Ps", 450), + AliasName("Punctuation", 451), + AliasName("QMark", 452), + AliasName("QU", 453), + AliasName("Qaac", 454), + AliasName("Qaai", 455), + AliasName("Qaf", 456), + AliasName("Qaph", 457), + AliasName("Quotation", 458), + AliasName("Quotation_Mark", 459), + AliasName("R", 460), + AliasName("RLE", 461), + AliasName("RLO", 462), + AliasName("Radical", 463), + AliasName("Reh", 464), + AliasName("Reversed_Pe", 465), + AliasName("Right", 466), + AliasName("Right_Joining", 467), + AliasName("Right_To_Left", 468), + AliasName("Right_To_Left_Embedding", 469), + AliasName("Right_To_Left_Override", 470), + AliasName("Runic", 471), + AliasName("Runr", 472), + AliasName("S", 473), + AliasName("SA", 474), + AliasName("SD", 475), + AliasName("SG", 476), + AliasName("SP", 477), + AliasName("STerm", 478), + AliasName("SY", 479), + AliasName("Sad", 480), + AliasName("Sadhe", 481), + AliasName("Sc", 482), + AliasName("Script", 483), + AliasName("Seen", 484), + AliasName("Segment_Separator", 485), + AliasName("Segment_Starter", 486), + AliasName("Semkath", 487), + AliasName("Sensitive", 488), + AliasName("Separator", 489), + AliasName("Shavian", 490), + AliasName("Shaw", 491), + AliasName("Shin", 492), + AliasName("Simple_Case_Folding", 493), + AliasName("Simple_Lowercase_Mapping", 494), + AliasName("Simple_Titlecase_Mapping", 495), + AliasName("Simple_Uppercase_Mapping", 496), + AliasName("Sinh", 497), + AliasName("Sinhala", 498), + AliasName("Sk", 499), + AliasName("Sm", 500), + AliasName("Small", 501), + AliasName("Small_Form_Variants", 502), + AliasName("So", 503), + AliasName("Soft_Dotted", 504), + AliasName("Space", 505), + AliasName("Space_Separator", 506), + AliasName("Spacing_Mark", 507), + AliasName("Spacing_Modifier_Letters", 508), + AliasName("Specials", 509), + AliasName("Square", 510), + AliasName("Sub", 511), + AliasName("Super", 512), + AliasName("Superscripts_and_Subscripts", 513), + AliasName("Supplemental_Arrows-A", 514), + AliasName("Supplemental_Arrows-B", 515), + AliasName("Supplemental_Mathematical_Operators", 516), + AliasName("Supplementary_Private_Use_Area-A", 517), + AliasName("Supplementary_Private_Use_Area-B", 518), + AliasName("Surrogate", 519), + AliasName("Swash_Kaf", 520), + AliasName("Symbol", 521), + AliasName("Syrc", 522), + AliasName("Syriac", 523), + AliasName("Syriac_Waw", 524), + AliasName("T", 525), + AliasName("Tagalog", 526), + AliasName("Tagb", 527), + AliasName("Tagbanwa", 528), + AliasName("Tags", 529), + AliasName("Tah", 530), + AliasName("Tai_Le", 531), + AliasName("Tai_Xuan_Jing_Symbols", 532), + AliasName("Tale", 533), + AliasName("Tamil", 534), + AliasName("Taml", 535), + AliasName("Taw", 536), + AliasName("Teh_Marbuta", 537), + AliasName("Telu", 538), + AliasName("Telugu", 539), + AliasName("Term", 540), + AliasName("Terminal_Punctuation", 541), + AliasName("Teth", 542), + AliasName("Tglg", 543), + AliasName("Thaa", 544), + AliasName("Thaana", 545), + AliasName("Thai", 546), + AliasName("Tibetan", 547), + AliasName("Tibt", 548), + AliasName("Titlecase_Letter", 549), + AliasName("Titlecase_Mapping", 550), + AliasName("Trail_Canonical_Combining_Class", 551), + AliasName("Trailing_Jamo", 552), + AliasName("Transparent", 553), + AliasName("True", 554), + AliasName("U", 555), + AliasName("UIdeo", 556), + AliasName("Ugar", 557), + AliasName("Ugaritic", 558), + AliasName("Unassigned", 559), + AliasName("Unicode_1_Name", 560), + AliasName("Unified_Canadian_Aboriginal_Syllabics", 561), + AliasName("Unified_Ideograph", 562), + AliasName("Unknown", 563), + AliasName("Upper", 564), + AliasName("Uppercase", 565), + AliasName("Uppercase_Letter", 566), + AliasName("Uppercase_Mapping", 567), + AliasName("V", 568), + AliasName("VR", 569), + AliasName("VS", 570), + AliasName("Variation_Selector", 571), + AliasName("Variation_Selectors", 572), + AliasName("Variation_Selectors_Supplement", 573), + AliasName("Vertical", 574), + AliasName("Virama", 575), + AliasName("Vowel_Jamo", 576), + AliasName("W", 577), + AliasName("WJ", 578), + AliasName("WS", 579), + AliasName("WSpace", 580), + AliasName("Waw", 581), + AliasName("White_Space", 582), + AliasName("Wide", 583), + AliasName("Word_Joiner", 584), + AliasName("XIDC", 585), + AliasName("XIDS", 586), + AliasName("XID_Continue", 587), + AliasName("XID_Start", 588), + AliasName("XX", 589), + AliasName("Y", 590), + AliasName("Yeh", 591), + AliasName("Yeh_Barree", 592), + AliasName("Yeh_With_Tail", 593), + AliasName("Yes", 594), + AliasName("Yi", 595), + AliasName("Yi_Radicals", 596), + AliasName("Yi_Syllables", 597), + AliasName("Yiii", 598), + AliasName("Yijing_Hexagram_Symbols", 599), + AliasName("Yudh", 600), + AliasName("Yudh_He", 601), + AliasName("Z", 602), + AliasName("ZW", 603), + AliasName("ZWSpace", 604), + AliasName("Zain", 605), + AliasName("Zhain", 606), + AliasName("Zl", 607), + AliasName("Zp", 608), + AliasName("Zs", 609), + AliasName("Zyyy", 610), + AliasName("age", 611), + AliasName("bc", 612), + AliasName("blk", 613), + AliasName("bmg", 614), + AliasName("can", 615), + AliasName("ccc", 616), + AliasName("cf", 617), + AliasName("com", 618), + AliasName("dt", 619), + AliasName("ea", 620), + AliasName("enc", 621), + AliasName("fin", 622), + AliasName("font", 623), + AliasName("fra", 624), + AliasName("gc", 625), + AliasName("gcm", 626), + AliasName("hst", 627), + AliasName("init", 628), + AliasName("isc", 629), + AliasName("iso", 630), + AliasName("jg", 631), + AliasName("jt", 632), + AliasName("lb", 633), + AliasName("lc", 634), + AliasName("lccc", 635), + AliasName("med", 636), + AliasName("na", 637), + AliasName("na1", 638), + AliasName("nar", 639), + AliasName("nb", 640), + AliasName("nfcinert", 641), + AliasName("nfdinert", 642), + AliasName("nfkcinert", 643), + AliasName("nfkdinert", 644), + AliasName("none", 645), + AliasName("nt", 646), + AliasName("nv", 647), + AliasName("sc", 648), + AliasName("segstart", 649), + AliasName("sfc", 650), + AliasName("slc", 651), + AliasName("sml", 652), + AliasName("sqr", 653), + AliasName("stc", 654), + AliasName("sub", 655), + AliasName("suc", 656), + AliasName("sup", 657), + AliasName("tc", 658), + AliasName("tccc", 659), + AliasName("uc", 660), + AliasName("vert", 661), + AliasName("wide", 662), }; /* to be filled in */ -int32_t REMAP[629]; +int32_t REMAP[663]; -const int32_t NAME_GROUP_COUNT = 888; +const int32_t NAME_GROUP_COUNT = 926; int32_t NAME_GROUP[] = { - 18, -19, /* 0: "Alpha", "Alphabetic" */ - 2, -10, /* 2: "AHex", "ASCII_Hex_Digit" */ - 49, -51, /* 4: "Bidi_C", "Bidi_Control" */ - 52, -53, /* 6: "Bidi_M", "Bidi_Mirrored" */ - 457, -92, /* 8: "Sensitive", "Case_Sensitive" */ - 129, -129, /* 10: "Dash", "Dash" */ - 128, -134, /* 12: "DI", "Default_Ignorable_Code_Point" */ - 135, -136, /* 14: "Dep", "Deprecated" */ - 140, -141, /* 16: "Dia", "Diacritic" */ - 163, -164, /* 18: "Ext", "Extender" */ - 107, -172, /* 20: "Comp_Ex", "Full_Composition_Exclusion" */ - 186, -189, /* 22: "Gr_Base", "Grapheme_Base" */ - 187, -190, /* 24: "Gr_Ext", "Grapheme_Extend" */ - 188, -191, /* 26: "Gr_Link", "Grapheme_Link" */ - 222, -223, /* 28: "Hex", "Hex_Digit" */ - 228, -228, /* 30: "Hyphen", "Hyphen" */ - 242, -243, /* 32: "Ideo", "Ideographic" */ - 232, -234, /* 34: "IDSB", "IDS_Binary_Operator" */ - 233, -235, /* 36: "IDST", "IDS_Trinary_Operator" */ - 230, -236, /* 38: "IDC", "ID_Continue" */ - 231, -237, /* 40: "IDS", "ID_Start" */ - 251, -253, /* 42: "Join_C", "Join_Control" */ - 277, -313, /* 44: "LOE", "Logical_Order_Exception" */ - 315, -316, /* 46: "Lower", "Lowercase" */ - 327, -327, /* 48: "Math", "Math" */ - 349, -369, /* 50: "NChar", "Noncharacter_Code_Point" */ - 422, -427, /* 52: "QMark", "Quotation_Mark" */ - 433, -433, /* 54: "Radical", "Radical" */ - 445, -471, /* 56: "SD", "Soft_Dotted" */ - 503, -504, /* 58: "Term", "Terminal_Punctuation" */ - 517, -523, /* 60: "UIdeo", "Unified_Ideograph" */ - 525, -526, /* 62: "Upper", "Uppercase" */ - 539, -540, /* 64: "WSpace", "White_Space" */ - 543, -545, /* 66: "XIDC", "XID_Continue" */ - 544, -546, /* 68: "XIDS", "XID_Start" */ - 611, -380, /* 70: "nv", "Numeric_Value" */ - 568, -50, /* 72: "bc", "Bidi_Class" */ - 569, -55, /* 74: "blk", "Block" */ - 573, -88, /* 76: "ccc", "Canonical_Combining_Class" */ - 580, -133, /* 78: "dt", "Decomposition_Type" */ - 581, -153, /* 80: "ea", "East_Asian_Width" */ - 588, -177, /* 82: "gc", "General_Category" */ - 590, -215, /* 84: "hst", "Hangul_Syllable_Type" */ - 596, -254, /* 86: "jg", "Joining_Group" */ - 597, -255, /* 88: "jt", "Joining_Type" */ - 598, -304, /* 90: "lb", "Line_Break" */ - 609, -379, /* 92: "nt", "Numeric_Type" */ - 612, -455, /* 94: "sc", "Script" */ - 589, -178, /* 96: "gcm", "General_Category_Mask" */ - 567, -17, /* 98: "age", "Age" */ - 570, -54, /* 100: "bmg", "Bidi_Mirroring_Glyph" */ - 574, -91, /* 102: "cf", "Case_Folding" */ - 593, -241, /* 104: "isc", "ISO_Comment" */ - 599, -318, /* 106: "lc", "Lowercase_Mapping" */ - 602, -360, /* 108: "na", "Name" */ - 613, -461, /* 110: "sfc", "Simple_Case_Folding" */ - 614, -462, /* 112: "slc", "Simple_Lowercase_Mapping" */ - 619, -463, /* 114: "stc", "Simple_Titlecase_Mapping" */ - 621, -464, /* 116: "suc", "Simple_Uppercase_Mapping" */ - 624, -512, /* 118: "tc", "Titlecase_Mapping" */ - 603, -521, /* 120: "na1", "Unicode_1_Name" */ - 625, -528, /* 122: "uc", "Uppercase_Mapping" */ - 8, -25, /* 124: "AN", "Arabic_Number" */ - 33, -405, /* 126: "B", "Paragraph_Separator" */ - 41, -60, /* 128: "BN", "Boundary_Neutral" */ - 86, -106, /* 130: "CS", "Common_Separator" */ - 356, -371, /* 132: "NSM", "Nonspacing_Mark" */ - 149, -159, /* 134: "EN", "European_Number" */ - 150, -160, /* 136: "ES", "European_Separator" */ - 151, -161, /* 138: "ET", "European_Terminator" */ - 272, -295, /* 140: "L", "Left_To_Right" */ - 278, -296, /* 142: "LRE", "Left_To_Right_Embedding" */ - 279, -297, /* 144: "LRO", "Left_To_Right_Override" */ - 381, -395, /* 146: "ON", "Other_Neutral" */ - 401, -413, /* 148: "PDF", "Pop_Directional_Format" */ - 428, -436, /* 150: "R", "Right_To_Left" */ - 5, -24, /* 152: "AL", "Arabic_Letter" */ - 431, -437, /* 154: "RLE", "Right_To_Left_Embedding" */ - 432, -438, /* 156: "RLO", "Right_To_Left_Override" */ - 441, -456, /* 158: "S", "Segment_Separator" */ - 538, -540, /* 160: "WS", "White_Space" */ - 165, -169, /* 162: "F", "False" */ - 487, -515, /* 164: "T", "True" */ - 0, -16, /* 166: "", "Aegean_Numbers" */ - 0, -20, /* 168: "", "Alphabetic_Presentation_Forms" */ - 0, -23, /* 170: "", "Arabic" */ - 0, -26, /* 172: "", "Arabic_Presentation_Forms-A" */ - 0, -27, /* 174: "", "Arabic_Presentation_Forms-B" */ - 0, -28, /* 176: "", "Armenian" */ - 0, -30, /* 178: "", "Arrows" */ - 0, -43, /* 180: "", "Basic_Latin" */ - 0, -48, /* 182: "", "Bengali" */ - 0, -56, /* 184: "", "Block_Elements" */ - 0, -58, /* 186: "", "Bopomofo" */ - 0, -59, /* 188: "", "Bopomofo_Extended" */ - 0, -61, /* 190: "", "Box_Drawing" */ - 0, -64, /* 192: "", "Braille_Patterns" */ - 0, -70, /* 194: "", "Buhid" */ - 0, -71, /* 196: "", "Byzantine_Musical_Symbols" */ - 0, -97, /* 198: "", "Cherokee" */ - 0, -74, /* 200: "", "CJK_Compatibility" */ - 0, -75, /* 202: "", "CJK_Compatibility_Forms" */ - 0, -76, /* 204: "", "CJK_Compatibility_Ideographs" */ - 0, -77, /* 206: "", "CJK_Compatibility_Ideographs_Supplement" */ - 0, -78, /* 208: "", "CJK_Radicals_Supplement" */ - 0, -79, /* 210: "", "CJK_Symbols_and_Punctuation" */ - 0, -80, /* 212: "", "CJK_Unified_Ideographs" */ - 0, -81, /* 214: "", "CJK_Unified_Ideographs_Extension_A" */ - 0, -82, /* 216: "", "CJK_Unified_Ideographs_Extension_B" */ - 0, -101, /* 218: "", "Combining_Diacritical_Marks" */ - 0, -103, /* 220: "", "Combining_Half_Marks" */ - 0, -102, /* 222: "", "Combining_Diacritical_Marks_for_Symbols" */ - 0, -112, /* 224: "", "Control_Pictures" */ - 0, -117, /* 226: "", "Currency_Symbols" */ - 0, -119, /* 228: "", "Cypriot_Syllabary" */ - 0, -120, /* 230: "", "Cyrillic" */ - 0, -121, /* 232: "", "Cyrillic_Supplementary" */ - 0, -137, /* 234: "", "Deseret" */ - 0, -139, /* 236: "", "Devanagari" */ - 0, -143, /* 238: "", "Dingbats" */ - 0, -154, /* 240: "", "Enclosed_Alphanumerics" */ - 0, -155, /* 242: "", "Enclosed_CJK_Letters_and_Months" */ - 0, -158, /* 244: "", "Ethiopic" */ - 0, -179, /* 246: "", "General_Punctuation" */ - 0, -180, /* 248: "", "Geometric_Shapes" */ - 0, -182, /* 250: "", "Georgian" */ - 0, -185, /* 252: "", "Gothic" */ - 0, -194, /* 254: "", "Greek_and_Coptic" */ - 0, -193, /* 256: "", "Greek_Extended" */ - 0, -196, /* 258: "", "Gujarati" */ - 0, -198, /* 260: "", "Gurmukhi" */ - 0, -209, /* 262: "", "Halfwidth_and_Fullwidth_Forms" */ - 0, -213, /* 264: "", "Hangul_Compatibility_Jamo" */ - 0, -214, /* 266: "", "Hangul_Jamo" */ - 0, -216, /* 268: "", "Hangul_Syllables" */ - 0, -219, /* 270: "", "Hanunoo" */ - 0, -221, /* 272: "", "Hebrew" */ - 0, -224, /* 274: "", "High_Private_Use_Surrogates" */ - 0, -225, /* 276: "", "High_Surrogates" */ - 0, -227, /* 278: "", "Hiragana" */ - 0, -244, /* 280: "", "Ideographic_Description_Characters" */ - 0, -239, /* 282: "", "IPA_Extensions" */ - 0, -263, /* 284: "", "Kanbun" */ - 0, -264, /* 286: "", "Kangxi_Radicals" */ - 0, -265, /* 288: "", "Kannada" */ - 0, -266, /* 290: "", "Katakana" */ - 0, -267, /* 292: "", "Katakana_Phonetic_Extensions" */ - 0, -268, /* 294: "", "Khmer" */ - 0, -269, /* 296: "", "Khmer_Symbols" */ - 0, -284, /* 298: "", "Lao" */ - 0, -287, /* 300: "", "Latin-1_Supplement" */ - 0, -288, /* 302: "", "Latin_Extended-A" */ - 0, -290, /* 304: "", "Latin_Extended_Additional" */ - 0, -289, /* 306: "", "Latin_Extended-B" */ - 0, -300, /* 308: "", "Letterlike_Symbols" */ - 0, -302, /* 310: "", "Limbu" */ - 0, -308, /* 312: "", "Linear_B_Ideograms" */ - 0, -309, /* 314: "", "Linear_B_Syllabary" */ - 0, -314, /* 316: "", "Low_Surrogates" */ - 0, -324, /* 318: "", "Malayalam" */ - 0, -329, /* 320: "", "Mathematical_Alphanumeric_Symbols" */ - 0, -330, /* 322: "", "Mathematical_Operators" */ - 0, -333, /* 324: "", "Miscellaneous_Mathematical_Symbols-A" */ - 0, -334, /* 326: "", "Miscellaneous_Mathematical_Symbols-B" */ - 0, -335, /* 328: "", "Miscellaneous_Symbols" */ - 0, -336, /* 330: "", "Miscellaneous_Symbols_and_Arrows" */ - 0, -337, /* 332: "", "Miscellaneous_Technical" */ - 0, -343, /* 334: "", "Mongolian" */ - 0, -344, /* 336: "", "Musical_Symbols" */ - 0, -345, /* 338: "", "Myanmar" */ - 0, -367, /* 340: "", "No_Block" */ - 0, -377, /* 342: "", "Number_Forms" */ - 0, -385, /* 344: "", "Ogham" */ - 0, -386, /* 346: "", "Old_Italic" */ - 0, -388, /* 348: "", "Optical_Character_Recognition" */ - 0, -389, /* 350: "", "Oriya" */ - 0, -392, /* 352: "", "Osmanya" */ - 0, -410, /* 354: "", "Phonetic_Extensions" */ - 0, -417, /* 356: "", "Private_Use_Area" */ - 0, -439, /* 358: "", "Runic" */ - 0, -459, /* 360: "", "Shavian" */ - 0, -466, /* 362: "", "Sinhala" */ - 0, -469, /* 364: "", "Small_Form_Variants" */ - 0, -475, /* 366: "", "Spacing_Modifier_Letters" */ - 0, -476, /* 368: "", "Specials" */ - 0, -477, /* 370: "", "Superscripts_and_Subscripts" */ - 0, -478, /* 372: "", "Supplemental_Arrows-A" */ - 0, -479, /* 374: "", "Supplemental_Arrows-B" */ - 0, -480, /* 376: "", "Supplemental_Mathematical_Operators" */ - 0, -481, /* 378: "", "Supplementary_Private_Use_Area-A" */ - 0, -482, /* 380: "", "Supplementary_Private_Use_Area-B" */ - 0, -486, /* 382: "", "Syriac" */ - 0, -492, /* 384: "", "Tagalog" */ - 0, -494, /* 386: "", "Tagbanwa" */ - 0, -495, /* 388: "", "Tags" */ - 0, -496, /* 390: "", "Tai_Le" */ - 0, -497, /* 392: "", "Tai_Xuan_Jing_Symbols" */ - 0, -499, /* 394: "", "Tamil" */ - 0, -502, /* 396: "", "Telugu" */ - 0, -507, /* 398: "", "Thaana" */ - 0, -508, /* 400: "", "Thai" */ - 0, -509, /* 402: "", "Tibetan" */ - 0, -519, /* 404: "", "Ugaritic" */ - 0, -522, /* 406: "", "Unified_Canadian_Aboriginal_Syllabics" */ - 0, -531, /* 408: "", "Variation_Selectors" */ - 0, -532, /* 410: "", "Variation_Selectors_Supplement" */ - 0, -557, /* 412: "", "Yijing_Hexagram_Symbols" */ - 0, -554, /* 414: "", "Yi_Radicals" */ - 0, -555, /* 416: "", "Yi_Syllables" */ - 354, -374, /* 418: "NR", "Not_Reordered" */ - 383, -399, /* 420: "OV", "Overlay" */ - 12, -32, /* 422: "ATB", "Attached_Below" */ - 11, -31, /* 424: "ATAR", "Attached_Above_Right" */ - 40, -45, /* 426: "BL", "Below_Left" */ - 33, -44, /* 428: "B", "Below" */ - 42, -46, /* 430: "BR", "Below_Right" */ - 272, -293, /* 432: "L", "Left" */ - 428, -434, /* 434: "R", "Right" */ - 5, -14, /* 436: "AL", "Above_Left" */ - 1, -13, /* 438: "A", "Above" */ - 9, -15, /* 440: "AR", "Above_Right" */ - 127, -145, /* 442: "DB", "Double_Below" */ - 124, -144, /* 444: "DA", "Double_Above" */ - 240, -249, /* 446: "IS", "Iota_Subscript" */ - 350, -375, /* 448: "NK", "Nukta" */ - 260, -262, /* 450: "KV", "Kana_Voicing" */ - 530, -533, /* 452: "VR", "Virama" */ - 571, -572, /* 454: "can", "canonical" */ - 582, -575, /* 456: "enc", "circle" */ - 576, -577, /* 458: "com", "compat" */ - 583, -584, /* 460: "fin", "final" */ - 585, -585, /* 462: "font", "font" */ - 586, -587, /* 464: "fra", "fraction" */ - 591, -592, /* 466: "init", "initial" */ - 594, -595, /* 468: "iso", "isolated" */ - 600, -601, /* 470: "med", "medial" */ - 604, -605, /* 472: "nar", "narrow" */ - 606, -607, /* 474: "nb", "noBreak" */ - 0, -608, /* 476: "", "none" */ - 616, -615, /* 478: "sml", "small" */ - 617, -618, /* 480: "sqr", "square" */ - 620, -620, /* 482: "sub", "sub" */ - 622, -623, /* 484: "sup", "super" */ - 626, -627, /* 486: "vert", "vertical" */ - 628, -628, /* 488: "wide", "wide" */ - 1, -21, /* 490: "A", "Ambiguous" */ - 165, -173, /* 492: "F", "Fullwidth" */ - 200, -208, /* 494: "H", "Halfwidth" */ - 359, -361, /* 496: "Na", "Narrow" */ - 347, -363, /* 498: "N", "Neutral" */ - 535, -541, /* 500: "W", "Wide" */ - 331, -474, /* 502: "Mc", "Spacing_Mark" */ - 406, -109, /* 504: "Pc", "Connector_Punctuation" */ - 94, -111, /* 506: "Cc", "Control" */ - 454, -116, /* 508: "Sc", "Currency_Symbol" */ - 407, -130, /* 510: "Pd", "Dash_Punctuation" */ - 362, -132, /* 512: "Nd", "Decimal_Number" */ - 332, -156, /* 514: "Me", "Enclosing_Mark" */ - 408, -98, /* 516: "Pe", "Close_Punctuation" */ - 409, -170, /* 518: "Pf", "Final_Punctuation" */ - 95, -171, /* 520: "Cf", "Format" */ - 99, -520, /* 522: "Cn", "Unassigned" */ - 411, -247, /* 524: "Pi", "Initial_Punctuation" */ - 365, -299, /* 526: "Nl", "Letter_Number" */ - 563, -306, /* 528: "Zl", "Line_Separator" */ - 310, -317, /* 530: "Ll", "Lowercase_Letter" */ - 468, -328, /* 532: "Sm", "Math_Symbol" */ - 311, -340, /* 534: "Lm", "Modifier_Letter" */ - 467, -341, /* 536: "Sk", "Modifier_Symbol" */ - 339, -371, /* 538: "Mn", "Nonspacing_Mark" */ - 312, -394, /* 540: "Lo", "Other_Letter" */ - 366, -396, /* 542: "No", "Other_Number" */ - 412, -397, /* 544: "Po", "Other_Punctuation" */ - 470, -398, /* 546: "So", "Other_Symbol" */ - 564, -405, /* 548: "Zp", "Paragraph_Separator" */ - 100, -416, /* 550: "Co", "Private_Use" */ - 565, -473, /* 552: "Zs", "Space_Separator" */ - 418, -387, /* 554: "Ps", "Open_Punctuation" */ - 115, -483, /* 556: "Cs", "Surrogate" */ - 319, -511, /* 558: "Lt", "Titlecase_Letter" */ - 320, -527, /* 560: "Lu", "Uppercase_Letter" */ - 72, -393, /* 562: "C", "Other" */ - 275, -93, /* 564: "LC", "Cased_Letter" */ - 272, -298, /* 566: "L", "Letter" */ - 321, -326, /* 568: "M", "Mark" */ - 347, -376, /* 570: "N", "Number" */ - 400, -419, /* 572: "P", "Punctuation" */ - 441, -484, /* 574: "S", "Symbol" */ - 558, -458, /* 576: "Z", "Separator" */ - 272, -292, /* 578: "L", "Leading_Jamo" */ - 281, -282, /* 580: "LVT", "LVT_Syllable" */ - 280, -283, /* 582: "LV", "LV_Syllable" */ - 348, -373, /* 584: "NA", "Not_Applicable" */ - 487, -513, /* 586: "T", "Trailing_Jamo" */ - 529, -534, /* 588: "V", "Vowel_Jamo" */ - 0, -4, /* 590: "", "AIN" */ - 0, -6, /* 592: "", "ALAPH" */ - 0, -7, /* 594: "", "ALEF" */ - 0, -37, /* 596: "", "BEH" */ - 0, -38, /* 598: "", "BETH" */ - 0, -125, /* 600: "", "DAL" */ - 0, -126, /* 602: "", "DALATH_RISH" */ - 0, -148, /* 604: "", "E" */ - 0, -166, /* 606: "", "FE" */ - 0, -167, /* 608: "", "FEH" */ - 0, -168, /* 610: "", "FINAL_SEMKATH" */ - 0, -174, /* 612: "", "GAF" */ - 0, -175, /* 614: "", "GAMAL" */ - 0, -201, /* 616: "", "HAH" */ - 0, -202, /* 618: "", "HAMZA_ON_HEH_GOAL" */ - 0, -203, /* 620: "", "HE" */ - 0, -204, /* 622: "", "HEH" */ - 0, -205, /* 624: "", "HEH_GOAL" */ - 0, -206, /* 626: "", "HETH" */ - 0, -256, /* 628: "", "KAF" */ - 0, -257, /* 630: "", "KAPH" */ - 0, -258, /* 632: "", "KHAPH" */ - 0, -259, /* 634: "", "KNOTTED_HEH" */ - 0, -273, /* 636: "", "LAM" */ - 0, -274, /* 638: "", "LAMADH" */ - 0, -322, /* 640: "", "MEEM" */ - 0, -323, /* 642: "", "MIM" */ - 0, -352, /* 644: "", "NOON" */ - 0, -353, /* 646: "", "NO_JOINING_GROUP" */ - 0, -358, /* 648: "", "NUN" */ - 0, -402, /* 650: "", "PE" */ - 0, -420, /* 652: "", "QAF" */ - 0, -421, /* 654: "", "QAPH" */ - 0, -429, /* 656: "", "REH" */ - 0, -430, /* 658: "", "REVERSED_PE" */ - 0, -443, /* 660: "", "SAD" */ - 0, -444, /* 662: "", "SADHE" */ - 0, -446, /* 664: "", "SEEN" */ - 0, -447, /* 666: "", "SEMKATH" */ - 0, -449, /* 668: "", "SHIN" */ - 0, -451, /* 670: "", "SWASH_KAF" */ - 0, -453, /* 672: "", "SYRIAC_WAW" */ - 0, -488, /* 674: "", "TAH" */ - 0, -489, /* 676: "", "TAW" */ - 0, -490, /* 678: "", "TEH_MARBUTA" */ - 0, -491, /* 680: "", "TETH" */ - 0, -536, /* 682: "", "WAW" */ - 0, -548, /* 684: "", "YEH" */ - 0, -549, /* 686: "", "YEH_BARREE" */ - 0, -550, /* 688: "", "YEH_WITH_TAIL" */ - 0, -551, /* 690: "", "YUDH" */ - 0, -552, /* 692: "", "YUDH_HE" */ - 0, -559, /* 694: "", "ZAIN" */ - 0, -560, /* 696: "", "ZHAIN" */ - 123, -147, /* 698: "D", "Dual_Joining" */ - 72, -252, /* 700: "C", "Join_Causing" */ - 272, -294, /* 702: "L", "Left_Joining" */ - 516, -368, /* 704: "U", "Non_Joining" */ - 428, -435, /* 706: "R", "Right_Joining" */ - 487, -514, /* 708: "T", "Transparent" */ - 5, -19, /* 710: "AL", "Alphabetic" */ - 3, -21, /* 712: "AI", "Ambiguous" */ - 35, -65, /* 714: "BA", "Break_After" */ - 36, -66, /* 716: "BB", "Break_Before" */ - 34, -67, /* 718: "B2", "Break_Both" */ - 452, -68, /* 720: "SY", "Break_Symbols" */ - 85, -90, /* 722: "CR", "Carriage_Return" */ - 83, -98, /* 724: "CL", "Close_Punctuation" */ - 84, -104, /* 726: "CM", "Combining_Mark" */ - 442, -108, /* 728: "SA", "Complex_Context" */ - 73, -110, /* 730: "CB", "Contingent_Break" */ - 152, -162, /* 732: "EX", "Exclamation" */ - 176, -183, /* 734: "GL", "Glue" */ - 207, -228, /* 736: "HY", "Hyphen" */ - 229, -243, /* 738: "ID", "Ideographic" */ - 240, -245, /* 740: "IS", "Infix_Numeric" */ - 238, -248, /* 742: "IN", "Inseperable" */ - 276, -305, /* 744: "LF", "Line_Feed" */ - 39, -325, /* 746: "BK", "Mandatory_Break" */ - 351, -364, /* 748: "NL", "Next_Line" */ - 355, -372, /* 750: "NS", "Nonstarter" */ - 357, -378, /* 752: "NU", "Numeric" */ - 382, -387, /* 754: "OP", "Open_Punctuation" */ - 403, -414, /* 756: "PO", "Postfix_Numeric" */ - 404, -415, /* 758: "PR", "Prefix_Numeric" */ - 423, -426, /* 760: "QU", "Quotation" */ - 450, -472, /* 762: "SP", "Space" */ - 448, -483, /* 764: "SG", "Surrogate" */ - 547, -524, /* 766: "XX", "Unknown" */ - 537, -542, /* 768: "WJ", "Word_Joiner" */ - 561, -562, /* 770: "ZW", "ZWSpace" */ - 578, -131, /* 772: "de", "Decimal" */ - 579, -142, /* 774: "di", "Digit" */ - 0, -370, /* 776: "", "None" */ - 610, -378, /* 778: "nu", "Numeric" */ - 22, -23, /* 780: "Arab", "Arabic" */ - 29, -28, /* 782: "Armn", "Armenian" */ - 47, -48, /* 784: "Beng", "Bengali" */ - 57, -58, /* 786: "Bopo", "Bopomofo" */ - 62, -63, /* 788: "Brai", "Braille" */ - 69, -70, /* 790: "Buhd", "Buhid" */ - 89, -87, /* 792: "Cans", "Canadian_Aboriginal" */ - 96, -97, /* 794: "Cher", "Cherokee" */ - 566, -105, /* 796: "Zyyy", "Common" */ - 424, -113, /* 798: "Qaac", "Coptic" */ - 114, -118, /* 800: "Cprt", "Cypriot" */ - 122, -120, /* 802: "Cyrl", "Cyrillic" */ - 146, -137, /* 804: "Dsrt", "Deseret" */ - 138, -139, /* 806: "Deva", "Devanagari" */ - 157, -158, /* 808: "Ethi", "Ethiopic" */ - 181, -182, /* 810: "Geor", "Georgian" */ - 184, -185, /* 812: "Goth", "Gothic" */ - 195, -192, /* 814: "Grek", "Greek" */ - 197, -196, /* 816: "Gujr", "Gujarati" */ - 199, -198, /* 818: "Guru", "Gurmukhi" */ - 217, -210, /* 820: "Hani", "Han" */ - 211, -212, /* 822: "Hang", "Hangul" */ - 218, -219, /* 824: "Hano", "Hanunoo" */ - 220, -221, /* 826: "Hebr", "Hebrew" */ - 226, -227, /* 828: "Hira", "Hiragana" */ - 425, -246, /* 830: "Qaai", "Inherited" */ - 271, -265, /* 832: "Knda", "Kannada" */ - 261, -266, /* 834: "Kana", "Katakana" */ - 270, -268, /* 836: "Khmr", "Khmer" */ - 285, -284, /* 838: "Laoo", "Lao" */ - 291, -286, /* 840: "Latn", "Latin" */ - 301, -302, /* 842: "Limb", "Limbu" */ - 303, -307, /* 844: "Linb", "Linear_B" */ - 338, -324, /* 846: "Mlym", "Malayalam" */ - 342, -343, /* 848: "Mong", "Mongolian" */ - 346, -345, /* 850: "Mymr", "Myanmar" */ - 384, -385, /* 852: "Ogam", "Ogham" */ - 250, -386, /* 854: "Ital", "Old_Italic" */ - 390, -389, /* 856: "Orya", "Oriya" */ - 391, -392, /* 858: "Osma", "Osmanya" */ - 440, -439, /* 860: "Runr", "Runic" */ - 460, -459, /* 862: "Shaw", "Shavian" */ - 465, -466, /* 864: "Sinh", "Sinhala" */ - 485, -486, /* 866: "Syrc", "Syriac" */ - 505, -492, /* 868: "Tglg", "Tagalog" */ - 493, -494, /* 870: "Tagb", "Tagbanwa" */ - 498, -496, /* 872: "Tale", "Tai_Le" */ - 500, -499, /* 874: "Taml", "Tamil" */ - 501, -502, /* 876: "Telu", "Telugu" */ - 506, -507, /* 878: "Thaa", "Thaana" */ - 508, -508, /* 880: "Thai", "Thai" */ - 510, -509, /* 882: "Tibt", "Tibetan" */ - 518, -519, /* 884: "Ugar", "Ugaritic" */ - 556, -553, /* 886: "Yiii", "Yi" */ + 338, -346, /* 0: "M", "Maybe" */ + 366, -394, /* 2: "N", "No" */ + 590, -594, /* 4: "Y", "Yes" */ + 19, -20, /* 6: "Alpha", "Alphabetic" */ + 2, -7, /* 8: "AHex", "ASCII_Hex_Digit" */ + 51, -53, /* 10: "Bidi_C", "Bidi_Control" */ + 54, -55, /* 12: "Bidi_M", "Bidi_Mirrored" */ + 488, -95, /* 14: "Sensitive", "Case_Sensitive" */ + 135, -135, /* 16: "Dash", "Dash" */ + 132, -141, /* 18: "DI", "Default_Ignorable_Code_Point" */ + 142, -143, /* 20: "Dep", "Deprecated" */ + 148, -149, /* 22: "Dia", "Diacritic" */ + 171, -172, /* 24: "Ext", "Extender" */ + 111, -183, /* 26: "Comp_Ex", "Full_Composition_Exclusion" */ + 197, -200, /* 28: "Gr_Base", "Grapheme_Base" */ + 198, -201, /* 30: "Gr_Ext", "Grapheme_Extend" */ + 199, -202, /* 32: "Gr_Link", "Grapheme_Link" */ + 233, -234, /* 34: "Hex", "Hex_Digit" */ + 240, -240, /* 36: "Hyphen", "Hyphen" */ + 254, -255, /* 38: "Ideo", "Ideographic" */ + 244, -246, /* 40: "IDSB", "IDS_Binary_Operator" */ + 245, -247, /* 42: "IDST", "IDS_Trinary_Operator" */ + 242, -248, /* 44: "IDC", "ID_Continue" */ + 243, -249, /* 46: "IDS", "ID_Start" */ + 266, -268, /* 48: "Join_C", "Join_Control" */ + 291, -330, /* 50: "LOE", "Logical_Order_Exception" */ + 332, -333, /* 52: "Lower", "Lowercase" */ + 342, -342, /* 54: "Math", "Math" */ + 641, -369, /* 56: "nfcinert", "NFC_Inert" */ + 642, -372, /* 58: "nfdinert", "NFD_Inert" */ + 643, -375, /* 60: "nfkcinert", "NFKC_Inert" */ + 644, -378, /* 62: "nfkdinert", "NFKD_Inert" */ + 368, -399, /* 64: "NChar", "Noncharacter_Code_Point" */ + 452, -459, /* 66: "QMark", "Quotation_Mark" */ + 463, -463, /* 68: "Radical", "Radical" */ + 649, -486, /* 70: "segstart", "Segment_Starter" */ + 475, -504, /* 72: "SD", "Soft_Dotted" */ + 478, -478, /* 74: "STerm", "STerm" */ + 540, -541, /* 76: "Term", "Terminal_Punctuation" */ + 556, -562, /* 78: "UIdeo", "Unified_Ideograph" */ + 564, -565, /* 80: "Upper", "Uppercase" */ + 570, -571, /* 82: "VS", "Variation_Selector" */ + 580, -582, /* 84: "WSpace", "White_Space" */ + 585, -587, /* 86: "XIDC", "XID_Continue" */ + 586, -588, /* 88: "XIDS", "XID_Start" */ + 647, -412, /* 90: "nv", "Numeric_Value" */ + 612, -52, /* 92: "bc", "Bidi_Class" */ + 613, -57, /* 94: "blk", "Block" */ + 616, -91, /* 96: "ccc", "Canonical_Combining_Class" */ + 619, -140, /* 98: "dt", "Decomposition_Type" */ + 620, -161, /* 100: "ea", "East_Asian_Width" */ + 625, -188, /* 102: "gc", "General_Category" */ + 627, -222, /* 104: "hst", "Hangul_Syllable_Type" */ + 631, -269, /* 106: "jg", "Joining_Group" */ + 632, -270, /* 108: "jt", "Joining_Type" */ + 635, -308, /* 110: "lccc", "Lead_Canonical_Combining_Class" */ + 633, -321, /* 112: "lb", "Line_Break" */ + 370, -371, /* 114: "NFC_QC", "NFC_Quick_Check" */ + 373, -374, /* 116: "NFD_QC", "NFD_Quick_Check" */ + 376, -377, /* 118: "NFKC_QC", "NFKC_Quick_Check" */ + 379, -380, /* 120: "NFKD_QC", "NFKD_Quick_Check" */ + 646, -411, /* 122: "nt", "Numeric_Type" */ + 648, -483, /* 124: "sc", "Script" */ + 659, -551, /* 126: "tccc", "Trail_Canonical_Combining_Class" */ + 626, -189, /* 128: "gcm", "General_Category_Mask" */ + 611, -15, /* 130: "age", "Age" */ + 614, -56, /* 132: "bmg", "Bidi_Mirroring_Glyph" */ + 617, -94, /* 134: "cf", "Case_Folding" */ + 629, -253, /* 136: "isc", "ISO_Comment" */ + 634, -335, /* 138: "lc", "Lowercase_Mapping" */ + 637, -388, /* 140: "na", "Name" */ + 650, -493, /* 142: "sfc", "Simple_Case_Folding" */ + 651, -494, /* 144: "slc", "Simple_Lowercase_Mapping" */ + 654, -495, /* 146: "stc", "Simple_Titlecase_Mapping" */ + 656, -496, /* 148: "suc", "Simple_Uppercase_Mapping" */ + 658, -550, /* 150: "tc", "Titlecase_Mapping" */ + 638, -560, /* 152: "na1", "Unicode_1_Name" */ + 660, -567, /* 154: "uc", "Uppercase_Mapping" */ + 5, -26, /* 156: "AN", "Arabic_Number" */ + 35, -437, /* 158: "B", "Paragraph_Separator" */ + 41, -62, /* 160: "BN", "Boundary_Neutral" */ + 88, -110, /* 162: "CS", "Common_Separator" */ + 385, -401, /* 164: "NSM", "Nonspacing_Mark" */ + 157, -167, /* 166: "EN", "European_Number" */ + 158, -168, /* 168: "ES", "European_Separator" */ + 159, -169, /* 170: "ET", "European_Terminator" */ + 288, -312, /* 172: "L", "Left_To_Right" */ + 292, -313, /* 174: "LRE", "Left_To_Right_Embedding" */ + 293, -314, /* 176: "LRO", "Left_To_Right_Override" */ + 414, -428, /* 178: "ON", "Other_Neutral" */ + 434, -445, /* 180: "PDF", "Pop_Directional_Format" */ + 460, -468, /* 182: "R", "Right_To_Left" */ + 4, -25, /* 184: "AL", "Arabic_Letter" */ + 461, -469, /* 186: "RLE", "Right_To_Left_Embedding" */ + 462, -470, /* 188: "RLO", "Right_To_Left_Override" */ + 473, -485, /* 190: "S", "Segment_Separator" */ + 579, -582, /* 192: "WS", "White_Space" */ + 173, -174, /* 194: "F", "False" */ + 525, -554, /* 196: "T", "True" */ + 0, -14, /* 198: "", "Aegean_Numbers" */ + 0, -21, /* 200: "", "Alphabetic_Presentation_Forms" */ + 0, -24, /* 202: "", "Arabic" */ + 0, -27, /* 204: "", "Arabic_Presentation_Forms-A" */ + 0, -28, /* 206: "", "Arabic_Presentation_Forms-B" */ + 0, -29, /* 208: "", "Armenian" */ + 0, -31, /* 210: "", "Arrows" */ + 0, -43, /* 212: "", "Basic_Latin" */ + 0, -49, /* 214: "", "Bengali" */ + 0, -58, /* 216: "", "Block_Elements" */ + 0, -60, /* 218: "", "Bopomofo" */ + 0, -61, /* 220: "", "Bopomofo_Extended" */ + 0, -63, /* 222: "", "Box_Drawing" */ + 0, -66, /* 224: "", "Braille_Patterns" */ + 0, -72, /* 226: "", "Buhid" */ + 0, -73, /* 228: "", "Byzantine_Musical_Symbols" */ + 0, -100, /* 230: "", "Cherokee" */ + 0, -76, /* 232: "", "CJK_Compatibility" */ + 0, -77, /* 234: "", "CJK_Compatibility_Forms" */ + 0, -78, /* 236: "", "CJK_Compatibility_Ideographs" */ + 0, -79, /* 238: "", "CJK_Compatibility_Ideographs_Supplement" */ + 0, -80, /* 240: "", "CJK_Radicals_Supplement" */ + 0, -81, /* 242: "", "CJK_Symbols_and_Punctuation" */ + 0, -82, /* 244: "", "CJK_Unified_Ideographs" */ + 0, -83, /* 246: "", "CJK_Unified_Ideographs_Extension_A" */ + 0, -84, /* 248: "", "CJK_Unified_Ideographs_Extension_B" */ + 0, -105, /* 250: "", "Combining_Diacritical_Marks" */ + 0, -107, /* 252: "", "Combining_Half_Marks" */ + 0, -106, /* 254: "", "Combining_Diacritical_Marks_for_Symbols" */ + 0, -117, /* 256: "", "Control_Pictures" */ + 0, -122, /* 258: "", "Currency_Symbols" */ + 0, -124, /* 260: "", "Cypriot_Syllabary" */ + 0, -125, /* 262: "", "Cyrillic" */ + 0, 126, -127, /* 264: "", "Cyrillic_Supplement", "Cyrillic_Supplementary" */ + 0, -144, /* 267: "", "Deseret" */ + 0, -146, /* 269: "", "Devanagari" */ + 0, -151, /* 271: "", "Dingbats" */ + 0, -162, /* 273: "", "Enclosed_Alphanumerics" */ + 0, -163, /* 275: "", "Enclosed_CJK_Letters_and_Months" */ + 0, -166, /* 277: "", "Ethiopic" */ + 0, -190, /* 279: "", "General_Punctuation" */ + 0, -191, /* 281: "", "Geometric_Shapes" */ + 0, -193, /* 283: "", "Georgian" */ + 0, -196, /* 285: "", "Gothic" */ + 0, -205, /* 287: "", "Greek_and_Coptic" */ + 0, -204, /* 289: "", "Greek_Extended" */ + 0, -207, /* 291: "", "Gujarati" */ + 0, -209, /* 293: "", "Gurmukhi" */ + 0, -215, /* 295: "", "Halfwidth_and_Fullwidth_Forms" */ + 0, -220, /* 297: "", "Hangul_Compatibility_Jamo" */ + 0, -221, /* 299: "", "Hangul_Jamo" */ + 0, -223, /* 301: "", "Hangul_Syllables" */ + 0, -226, /* 303: "", "Hanunoo" */ + 0, -229, /* 305: "", "Hebrew" */ + 0, -235, /* 307: "", "High_Private_Use_Surrogates" */ + 0, -236, /* 309: "", "High_Surrogates" */ + 0, -238, /* 311: "", "Hiragana" */ + 0, -256, /* 313: "", "Ideographic_Description_Characters" */ + 0, -251, /* 315: "", "IPA_Extensions" */ + 0, -275, /* 317: "", "Kanbun" */ + 0, -276, /* 319: "", "Kangxi_Radicals" */ + 0, -277, /* 321: "", "Kannada" */ + 0, -279, /* 323: "", "Katakana" */ + 0, -281, /* 325: "", "Katakana_Phonetic_Extensions" */ + 0, -283, /* 327: "", "Khmer" */ + 0, -284, /* 329: "", "Khmer_Symbols" */ + 0, -300, /* 331: "", "Lao" */ + 0, -303, /* 333: "", "Latin-1_Supplement" */ + 0, -304, /* 335: "", "Latin_Extended-A" */ + 0, -306, /* 337: "", "Latin_Extended_Additional" */ + 0, -305, /* 339: "", "Latin_Extended-B" */ + 0, -317, /* 341: "", "Letterlike_Symbols" */ + 0, -319, /* 343: "", "Limbu" */ + 0, -325, /* 345: "", "Linear_B_Ideograms" */ + 0, -326, /* 347: "", "Linear_B_Syllabary" */ + 0, -331, /* 349: "", "Low_Surrogates" */ + 0, -339, /* 351: "", "Malayalam" */ + 0, -344, /* 353: "", "Mathematical_Alphanumeric_Symbols" */ + 0, -345, /* 355: "", "Mathematical_Operators" */ + 0, -352, /* 357: "", "Miscellaneous_Mathematical_Symbols-A" */ + 0, -353, /* 359: "", "Miscellaneous_Mathematical_Symbols-B" */ + 0, -354, /* 361: "", "Miscellaneous_Symbols" */ + 0, -355, /* 363: "", "Miscellaneous_Symbols_and_Arrows" */ + 0, -356, /* 365: "", "Miscellaneous_Technical" */ + 0, -362, /* 367: "", "Mongolian" */ + 0, -363, /* 369: "", "Musical_Symbols" */ + 0, -364, /* 371: "", "Myanmar" */ + 0, -395, /* 373: "", "No_Block" */ + 0, -409, /* 375: "", "Number_Forms" */ + 0, -418, /* 377: "", "Ogham" */ + 0, -419, /* 379: "", "Old_Italic" */ + 0, -421, /* 381: "", "Optical_Character_Recognition" */ + 0, -422, /* 383: "", "Oriya" */ + 0, -425, /* 385: "", "Osmanya" */ + 0, -442, /* 387: "", "Phonetic_Extensions" */ + 0, -449, /* 389: "", "Private_Use_Area" */ + 0, -471, /* 391: "", "Runic" */ + 0, -490, /* 393: "", "Shavian" */ + 0, -498, /* 395: "", "Sinhala" */ + 0, -502, /* 397: "", "Small_Form_Variants" */ + 0, -508, /* 399: "", "Spacing_Modifier_Letters" */ + 0, -509, /* 401: "", "Specials" */ + 0, -513, /* 403: "", "Superscripts_and_Subscripts" */ + 0, -514, /* 405: "", "Supplemental_Arrows-A" */ + 0, -515, /* 407: "", "Supplemental_Arrows-B" */ + 0, -516, /* 409: "", "Supplemental_Mathematical_Operators" */ + 0, -517, /* 411: "", "Supplementary_Private_Use_Area-A" */ + 0, -518, /* 413: "", "Supplementary_Private_Use_Area-B" */ + 0, -523, /* 415: "", "Syriac" */ + 0, -526, /* 417: "", "Tagalog" */ + 0, -528, /* 419: "", "Tagbanwa" */ + 0, -529, /* 421: "", "Tags" */ + 0, -531, /* 423: "", "Tai_Le" */ + 0, -532, /* 425: "", "Tai_Xuan_Jing_Symbols" */ + 0, -534, /* 427: "", "Tamil" */ + 0, -539, /* 429: "", "Telugu" */ + 0, -545, /* 431: "", "Thaana" */ + 0, -546, /* 433: "", "Thai" */ + 0, -547, /* 435: "", "Tibetan" */ + 0, -558, /* 437: "", "Ugaritic" */ + 0, -561, /* 439: "", "Unified_Canadian_Aboriginal_Syllabics" */ + 0, -572, /* 441: "", "Variation_Selectors" */ + 0, -573, /* 443: "", "Variation_Selectors_Supplement" */ + 0, -599, /* 445: "", "Yijing_Hexagram_Symbols" */ + 0, -596, /* 447: "", "Yi_Radicals" */ + 0, -597, /* 449: "", "Yi_Syllables" */ + 383, -405, /* 451: "NR", "Not_Reordered" */ + 416, -432, /* 453: "OV", "Overlay" */ + 10, -34, /* 455: "ATBL", "Attached_Below_Left" */ + 9, -33, /* 457: "ATB", "Attached_Below" */ + 8, -32, /* 459: "ATAR", "Attached_Above_Right" */ + 40, -46, /* 461: "BL", "Below_Left" */ + 35, -45, /* 463: "B", "Below" */ + 42, -47, /* 465: "BR", "Below_Right" */ + 288, -310, /* 467: "L", "Left" */ + 460, -466, /* 469: "R", "Right" */ + 4, -12, /* 471: "AL", "Above_Left" */ + 1, -11, /* 473: "A", "Above" */ + 6, -13, /* 475: "AR", "Above_Right" */ + 131, -153, /* 477: "DB", "Double_Below" */ + 130, -152, /* 479: "DA", "Double_Above" */ + 252, -263, /* 481: "IS", "Iota_Subscript" */ + 381, -407, /* 483: "NK", "Nukta" */ + 271, -274, /* 485: "KV", "Kana_Voicing" */ + 569, -575, /* 487: "VR", "Virama" */ + 615, -90, /* 489: "can", "Canonical" */ + 621, -101, /* 491: "enc", "Circle" */ + 618, -112, /* 493: "com", "Compat" */ + 622, -177, /* 495: "fin", "Final" */ + 623, -180, /* 497: "font", "Font" */ + 624, -182, /* 499: "fra", "Fraction" */ + 628, -259, /* 501: "init", "Initial" */ + 630, -264, /* 503: "iso", "Isolated" */ + 636, -349, /* 505: "med", "Medial" */ + 639, -389, /* 507: "nar", "Narrow" */ + 640, -397, /* 509: "nb", "Nobreak" */ + 645, -400, /* 511: "none", "None" */ + 652, -501, /* 513: "sml", "Small" */ + 653, -510, /* 515: "sqr", "Square" */ + 655, -511, /* 517: "sub", "Sub" */ + 657, -512, /* 519: "sup", "Super" */ + 661, -574, /* 521: "vert", "Vertical" */ + 662, -583, /* 523: "wide", "Wide" */ + 1, -22, /* 525: "A", "Ambiguous" */ + 173, -184, /* 527: "F", "Fullwidth" */ + 211, -214, /* 529: "H", "Halfwidth" */ + 387, -389, /* 531: "Na", "Narrow" */ + 366, -391, /* 533: "N", "Neutral" */ + 577, -583, /* 535: "W", "Wide" */ + 347, -507, /* 537: "Mc", "Spacing_Mark" */ + 438, -114, /* 539: "Pc", "Connector_Punctuation" */ + 97, -116, /* 541: "Cc", "Control" */ + 482, -121, /* 543: "Sc", "Currency_Symbol" */ + 439, -136, /* 545: "Pd", "Dash_Punctuation" */ + 390, -139, /* 547: "Nd", "Decimal_Number" */ + 348, -164, /* 549: "Me", "Enclosing_Mark" */ + 440, -102, /* 551: "Pe", "Close_Punctuation" */ + 441, -178, /* 553: "Pf", "Final_Punctuation" */ + 98, -181, /* 555: "Cf", "Format" */ + 103, -559, /* 557: "Cn", "Unassigned" */ + 443, -260, /* 559: "Pi", "Initial_Punctuation" */ + 393, -316, /* 561: "Nl", "Letter_Number" */ + 607, -323, /* 563: "Zl", "Line_Separator" */ + 327, -334, /* 565: "Ll", "Lowercase_Letter" */ + 500, -343, /* 567: "Sm", "Math_Symbol" */ + 328, -359, /* 569: "Lm", "Modifier_Letter" */ + 499, -360, /* 571: "Sk", "Modifier_Symbol" */ + 358, -401, /* 573: "Mn", "Nonspacing_Mark" */ + 329, -427, /* 575: "Lo", "Other_Letter" */ + 394, -429, /* 577: "No", "Other_Number" */ + 444, -430, /* 579: "Po", "Other_Punctuation" */ + 503, -431, /* 581: "So", "Other_Symbol" */ + 608, -437, /* 583: "Zp", "Paragraph_Separator" */ + 104, -448, /* 585: "Co", "Private_Use" */ + 609, -506, /* 587: "Zs", "Space_Separator" */ + 450, -420, /* 589: "Ps", "Open_Punctuation" */ + 120, -519, /* 591: "Cs", "Surrogate" */ + 336, -549, /* 593: "Lt", "Titlecase_Letter" */ + 337, -566, /* 595: "Lu", "Uppercase_Letter" */ + 74, -426, /* 597: "C", "Other" */ + 289, -96, /* 599: "LC", "Cased_Letter" */ + 288, -315, /* 601: "L", "Letter" */ + 338, -341, /* 603: "M", "Mark" */ + 366, -408, /* 605: "N", "Number" */ + 433, -451, /* 607: "P", "Punctuation" */ + 473, -521, /* 609: "S", "Symbol" */ + 602, -489, /* 611: "Z", "Separator" */ + 288, -309, /* 613: "L", "Leading_Jamo" */ + 295, -296, /* 615: "LVT", "LVT_Syllable" */ + 294, -297, /* 617: "LV", "LV_Syllable" */ + 367, -404, /* 619: "NA", "Not_Applicable" */ + 525, -552, /* 621: "T", "Trailing_Jamo" */ + 568, -576, /* 623: "V", "Vowel_Jamo" */ + 0, -16, /* 625: "", "Ain" */ + 0, -17, /* 627: "", "Alaph" */ + 0, -18, /* 629: "", "Alef" */ + 0, -44, /* 631: "", "Beh" */ + 0, -50, /* 633: "", "Beth" */ + 0, -133, /* 635: "", "Dal" */ + 0, -134, /* 637: "", "Dalath_Rish" */ + 0, -156, /* 639: "", "E" */ + 0, -175, /* 641: "", "Fe" */ + 0, -176, /* 643: "", "Feh" */ + 0, -179, /* 645: "", "Final_Semkath" */ + 0, -186, /* 647: "", "Gaf" */ + 0, -187, /* 649: "", "Gamal" */ + 0, -213, /* 651: "", "Hah" */ + 0, -216, /* 653: "", "Hamza_On_Heh_Goal" */ + 0, -227, /* 655: "", "He" */ + 0, -230, /* 657: "", "Heh" */ + 0, -231, /* 659: "", "Heh_Goal" */ + 0, -232, /* 661: "", "Heth" */ + 0, -272, /* 663: "", "Kaf" */ + 0, -278, /* 665: "", "Kaph" */ + 0, -282, /* 667: "", "Khaph" */ + 0, -287, /* 669: "", "Knotted_Heh" */ + 0, -298, /* 671: "", "Lam" */ + 0, -299, /* 673: "", "Lamadh" */ + 0, -350, /* 675: "", "Meem" */ + 0, -351, /* 677: "", "Mim" */ + 0, -403, /* 679: "", "Noon" */ + 0, -396, /* 681: "", "No_Joining_Group" */ + 0, -413, /* 683: "", "Nun" */ + 0, -440, /* 685: "", "Pe" */ + 0, -456, /* 687: "", "Qaf" */ + 0, -457, /* 689: "", "Qaph" */ + 0, -464, /* 691: "", "Reh" */ + 0, -465, /* 693: "", "Reversed_Pe" */ + 0, -480, /* 695: "", "Sad" */ + 0, -481, /* 697: "", "Sadhe" */ + 0, -484, /* 699: "", "Seen" */ + 0, -487, /* 701: "", "Semkath" */ + 0, -492, /* 703: "", "Shin" */ + 0, -520, /* 705: "", "Swash_Kaf" */ + 0, -524, /* 707: "", "Syriac_Waw" */ + 0, -530, /* 709: "", "Tah" */ + 0, -536, /* 711: "", "Taw" */ + 0, -537, /* 713: "", "Teh_Marbuta" */ + 0, -542, /* 715: "", "Teth" */ + 0, -581, /* 717: "", "Waw" */ + 0, -591, /* 719: "", "Yeh" */ + 0, -592, /* 721: "", "Yeh_Barree" */ + 0, -593, /* 723: "", "Yeh_With_Tail" */ + 0, -600, /* 725: "", "Yudh" */ + 0, -601, /* 727: "", "Yudh_He" */ + 0, -605, /* 729: "", "Zain" */ + 0, -606, /* 731: "", "Zhain" */ + 129, -155, /* 733: "D", "Dual_Joining" */ + 74, -267, /* 735: "C", "Join_Causing" */ + 288, -311, /* 737: "L", "Left_Joining" */ + 555, -398, /* 739: "U", "Non_Joining" */ + 460, -467, /* 741: "R", "Right_Joining" */ + 525, -553, /* 743: "T", "Transparent" */ + 4, -20, /* 745: "AL", "Alphabetic" */ + 3, -22, /* 747: "AI", "Ambiguous" */ + 37, -67, /* 749: "BA", "Break_After" */ + 38, -68, /* 751: "BB", "Break_Before" */ + 36, -69, /* 753: "B2", "Break_Both" */ + 479, -70, /* 755: "SY", "Break_Symbols" */ + 87, -93, /* 757: "CR", "Carriage_Return" */ + 85, -102, /* 759: "CL", "Close_Punctuation" */ + 86, -108, /* 761: "CM", "Combining_Mark" */ + 474, -113, /* 763: "SA", "Complex_Context" */ + 75, -115, /* 765: "CB", "Contingent_Break" */ + 160, -170, /* 767: "EX", "Exclamation" */ + 185, -194, /* 769: "GL", "Glue" */ + 212, -240, /* 771: "HY", "Hyphen" */ + 241, -255, /* 773: "ID", "Ideographic" */ + 252, -257, /* 775: "IS", "Infix_Numeric" */ + 250, 261, -262, /* 777: "IN", "Inseparable", "Inseperable" */ + 290, -322, /* 780: "LF", "Line_Feed" */ + 39, -340, /* 782: "BK", "Mandatory_Break" */ + 382, -392, /* 784: "NL", "Next_Line" */ + 384, -402, /* 786: "NS", "Nonstarter" */ + 386, -410, /* 788: "NU", "Numeric" */ + 415, -420, /* 790: "OP", "Open_Punctuation" */ + 435, -446, /* 792: "PO", "Postfix_Numeric" */ + 436, -447, /* 794: "PR", "Prefix_Numeric" */ + 453, -458, /* 796: "QU", "Quotation" */ + 477, -505, /* 798: "SP", "Space" */ + 476, -519, /* 800: "SG", "Surrogate" */ + 589, -563, /* 802: "XX", "Unknown" */ + 578, -584, /* 804: "WJ", "Word_Joiner" */ + 603, -604, /* 806: "ZW", "ZWSpace" */ + 137, -138, /* 808: "De", "Decimal" */ + 147, -150, /* 810: "Di", "Digit" */ + 400, -400, /* 812: "None", "None" */ + 406, -410, /* 814: "Nu", "Numeric" */ + 23, -24, /* 816: "Arab", "Arabic" */ + 30, -29, /* 818: "Armn", "Armenian" */ + 48, -49, /* 820: "Beng", "Bengali" */ + 59, -60, /* 822: "Bopo", "Bopomofo" */ + 64, -65, /* 824: "Brai", "Braille" */ + 71, -72, /* 826: "Buhd", "Buhid" */ + 92, -89, /* 828: "Cans", "Canadian_Aboriginal" */ + 99, -100, /* 830: "Cher", "Cherokee" */ + 610, -109, /* 832: "Zyyy", "Common" */ + 454, -118, /* 834: "Qaac", "Coptic" */ + 119, -123, /* 836: "Cprt", "Cypriot" */ + 128, -125, /* 838: "Cyrl", "Cyrillic" */ + 154, -144, /* 840: "Dsrt", "Deseret" */ + 145, -146, /* 842: "Deva", "Devanagari" */ + 165, -166, /* 844: "Ethi", "Ethiopic" */ + 192, -193, /* 846: "Geor", "Georgian" */ + 195, -196, /* 848: "Goth", "Gothic" */ + 206, -203, /* 850: "Grek", "Greek" */ + 208, -207, /* 852: "Gujr", "Gujarati" */ + 210, -209, /* 854: "Guru", "Gurmukhi" */ + 224, -217, /* 856: "Hani", "Han" */ + 218, -219, /* 858: "Hang", "Hangul" */ + 225, -226, /* 860: "Hano", "Hanunoo" */ + 228, -229, /* 862: "Hebr", "Hebrew" */ + 237, -238, /* 864: "Hira", "Hiragana" */ + 455, -258, /* 866: "Qaai", "Inherited" */ + 286, -277, /* 868: "Knda", "Kannada" */ + 273, -279, /* 870: "Kana", "Katakana" */ + 239, -280, /* 872: "Hrkt", "Katakana_Or_Hiragana" */ + 285, -283, /* 874: "Khmr", "Khmer" */ + 301, -300, /* 876: "Laoo", "Lao" */ + 307, -302, /* 878: "Latn", "Latin" */ + 318, -319, /* 880: "Limb", "Limbu" */ + 320, -324, /* 882: "Linb", "Linear_B" */ + 357, -339, /* 884: "Mlym", "Malayalam" */ + 361, -362, /* 886: "Mong", "Mongolian" */ + 365, -364, /* 888: "Mymr", "Myanmar" */ + 417, -418, /* 890: "Ogam", "Ogham" */ + 265, -419, /* 892: "Ital", "Old_Italic" */ + 423, -422, /* 894: "Orya", "Oriya" */ + 424, -425, /* 896: "Osma", "Osmanya" */ + 472, -471, /* 898: "Runr", "Runic" */ + 491, -490, /* 900: "Shaw", "Shavian" */ + 497, -498, /* 902: "Sinh", "Sinhala" */ + 522, -523, /* 904: "Syrc", "Syriac" */ + 543, -526, /* 906: "Tglg", "Tagalog" */ + 527, -528, /* 908: "Tagb", "Tagbanwa" */ + 533, -531, /* 910: "Tale", "Tai_Le" */ + 535, -534, /* 912: "Taml", "Tamil" */ + 538, -539, /* 914: "Telu", "Telugu" */ + 544, -545, /* 916: "Thaa", "Thaana" */ + 546, -546, /* 918: "Thai", "Thai" */ + 548, -547, /* 920: "Tibt", "Tibetan" */ + 557, -558, /* 922: "Ugar", "Ugaritic" */ + 598, -595, /* 924: "Yiii", "Yi" */ }; -#define MAX_NAMES_PER_GROUP 2 +#define MAX_NAMES_PER_GROUP 3 + +const int32_t VALUES_NFC_QC_COUNT = 3; + +const Alias VALUES_NFC_QC[] = { + Alias((int32_t) UNORM_MAYBE, 0), + Alias((int32_t) UNORM_NO, 2), + Alias((int32_t) UNORM_YES, 4), +}; + +const int32_t VALUES_NFD_QC_COUNT = 2; + +const Alias VALUES_NFD_QC[] = { + Alias((int32_t) UNORM_NO, 2), + Alias((int32_t) UNORM_YES, 4), +}; + +const int32_t VALUES_NFKC_QC_COUNT = 3; + +const Alias VALUES_NFKC_QC[] = { + Alias((int32_t) UNORM_MAYBE, 0), + Alias((int32_t) UNORM_NO, 2), + Alias((int32_t) UNORM_YES, 4), +}; + +const int32_t VALUES_NFKD_QC_COUNT = 2; + +const Alias VALUES_NFKD_QC[] = { + Alias((int32_t) UNORM_NO, 2), + Alias((int32_t) UNORM_YES, 4), +}; const int32_t VALUES_bc_COUNT = 19; const Alias VALUES_bc[] = { - Alias((int32_t) U_ARABIC_NUMBER, 124), - Alias((int32_t) U_BLOCK_SEPARATOR, 126), - Alias((int32_t) U_BOUNDARY_NEUTRAL, 128), - Alias((int32_t) U_COMMON_NUMBER_SEPARATOR, 130), - Alias((int32_t) U_DIR_NON_SPACING_MARK, 132), - Alias((int32_t) U_EUROPEAN_NUMBER, 134), - Alias((int32_t) U_EUROPEAN_NUMBER_SEPARATOR, 136), - Alias((int32_t) U_EUROPEAN_NUMBER_TERMINATOR, 138), - Alias((int32_t) U_LEFT_TO_RIGHT, 140), - Alias((int32_t) U_LEFT_TO_RIGHT_EMBEDDING, 142), - Alias((int32_t) U_LEFT_TO_RIGHT_OVERRIDE, 144), - Alias((int32_t) U_OTHER_NEUTRAL, 146), - Alias((int32_t) U_POP_DIRECTIONAL_FORMAT, 148), - Alias((int32_t) U_RIGHT_TO_LEFT, 150), - Alias((int32_t) U_RIGHT_TO_LEFT_ARABIC, 152), - Alias((int32_t) U_RIGHT_TO_LEFT_EMBEDDING, 154), - Alias((int32_t) U_RIGHT_TO_LEFT_OVERRIDE, 156), - Alias((int32_t) U_SEGMENT_SEPARATOR, 158), - Alias((int32_t) U_WHITE_SPACE_NEUTRAL, 160), + Alias((int32_t) U_ARABIC_NUMBER, 156), + Alias((int32_t) U_BLOCK_SEPARATOR, 158), + Alias((int32_t) U_BOUNDARY_NEUTRAL, 160), + Alias((int32_t) U_COMMON_NUMBER_SEPARATOR, 162), + Alias((int32_t) U_DIR_NON_SPACING_MARK, 164), + Alias((int32_t) U_EUROPEAN_NUMBER, 166), + Alias((int32_t) U_EUROPEAN_NUMBER_SEPARATOR, 168), + Alias((int32_t) U_EUROPEAN_NUMBER_TERMINATOR, 170), + Alias((int32_t) U_LEFT_TO_RIGHT, 172), + Alias((int32_t) U_LEFT_TO_RIGHT_EMBEDDING, 174), + Alias((int32_t) U_LEFT_TO_RIGHT_OVERRIDE, 176), + Alias((int32_t) U_OTHER_NEUTRAL, 178), + Alias((int32_t) U_POP_DIRECTIONAL_FORMAT, 180), + Alias((int32_t) U_RIGHT_TO_LEFT, 182), + Alias((int32_t) U_RIGHT_TO_LEFT_ARABIC, 184), + Alias((int32_t) U_RIGHT_TO_LEFT_EMBEDDING, 186), + Alias((int32_t) U_RIGHT_TO_LEFT_OVERRIDE, 188), + Alias((int32_t) U_SEGMENT_SEPARATOR, 190), + Alias((int32_t) U_WHITE_SPACE_NEUTRAL, 192), }; const int32_t VALUES_binprop_COUNT = 2; const Alias VALUES_binprop[] = { - Alias((int32_t) 0, 162), - Alias((int32_t) 1, 164), + Alias((int32_t) 0, 194), + Alias((int32_t) 1, 196), }; const int32_t VALUES_blk_COUNT = 126; const Alias VALUES_blk[] = { - Alias((int32_t) UBLOCK_AEGEAN_NUMBERS, 166), - Alias((int32_t) UBLOCK_ALPHABETIC_PRESENTATION_FORMS, 168), - Alias((int32_t) UBLOCK_ARABIC, 170), - Alias((int32_t) UBLOCK_ARABIC_PRESENTATION_FORMS_A, 172), - Alias((int32_t) UBLOCK_ARABIC_PRESENTATION_FORMS_B, 174), - Alias((int32_t) UBLOCK_ARMENIAN, 176), - Alias((int32_t) UBLOCK_ARROWS, 178), - Alias((int32_t) UBLOCK_BASIC_LATIN, 180), - Alias((int32_t) UBLOCK_BENGALI, 182), - Alias((int32_t) UBLOCK_BLOCK_ELEMENTS, 184), - Alias((int32_t) UBLOCK_BOPOMOFO, 186), - Alias((int32_t) UBLOCK_BOPOMOFO_EXTENDED, 188), - Alias((int32_t) UBLOCK_BOX_DRAWING, 190), - Alias((int32_t) UBLOCK_BRAILLE_PATTERNS, 192), - Alias((int32_t) UBLOCK_BUHID, 194), - Alias((int32_t) UBLOCK_BYZANTINE_MUSICAL_SYMBOLS, 196), - Alias((int32_t) UBLOCK_CHEROKEE, 198), - Alias((int32_t) UBLOCK_CJK_COMPATIBILITY, 200), - Alias((int32_t) UBLOCK_CJK_COMPATIBILITY_FORMS, 202), - Alias((int32_t) UBLOCK_CJK_COMPATIBILITY_IDEOGRAPHS, 204), - Alias((int32_t) UBLOCK_CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT, 206), - Alias((int32_t) UBLOCK_CJK_RADICALS_SUPPLEMENT, 208), - Alias((int32_t) UBLOCK_CJK_SYMBOLS_AND_PUNCTUATION, 210), - Alias((int32_t) UBLOCK_CJK_UNIFIED_IDEOGRAPHS, 212), - Alias((int32_t) UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A, 214), - Alias((int32_t) UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B, 216), - Alias((int32_t) UBLOCK_COMBINING_DIACRITICAL_MARKS, 218), - Alias((int32_t) UBLOCK_COMBINING_HALF_MARKS, 220), - Alias((int32_t) UBLOCK_COMBINING_MARKS_FOR_SYMBOLS, 222), - Alias((int32_t) UBLOCK_CONTROL_PICTURES, 224), - Alias((int32_t) UBLOCK_CURRENCY_SYMBOLS, 226), - Alias((int32_t) UBLOCK_CYPRIOT_SYLLABARY, 228), - Alias((int32_t) UBLOCK_CYRILLIC, 230), - Alias((int32_t) UBLOCK_CYRILLIC_SUPPLEMENTARY, 232), - Alias((int32_t) UBLOCK_DESERET, 234), - Alias((int32_t) UBLOCK_DEVANAGARI, 236), - Alias((int32_t) UBLOCK_DINGBATS, 238), - Alias((int32_t) UBLOCK_ENCLOSED_ALPHANUMERICS, 240), - Alias((int32_t) UBLOCK_ENCLOSED_CJK_LETTERS_AND_MONTHS, 242), - Alias((int32_t) UBLOCK_ETHIOPIC, 244), - Alias((int32_t) UBLOCK_GENERAL_PUNCTUATION, 246), - Alias((int32_t) UBLOCK_GEOMETRIC_SHAPES, 248), - Alias((int32_t) UBLOCK_GEORGIAN, 250), - Alias((int32_t) UBLOCK_GOTHIC, 252), - Alias((int32_t) UBLOCK_GREEK, 254), - Alias((int32_t) UBLOCK_GREEK_EXTENDED, 256), - Alias((int32_t) UBLOCK_GUJARATI, 258), - Alias((int32_t) UBLOCK_GURMUKHI, 260), - Alias((int32_t) UBLOCK_HALFWIDTH_AND_FULLWIDTH_FORMS, 262), - Alias((int32_t) UBLOCK_HANGUL_COMPATIBILITY_JAMO, 264), - Alias((int32_t) UBLOCK_HANGUL_JAMO, 266), - Alias((int32_t) UBLOCK_HANGUL_SYLLABLES, 268), - Alias((int32_t) UBLOCK_HANUNOO, 270), - Alias((int32_t) UBLOCK_HEBREW, 272), - Alias((int32_t) UBLOCK_HIGH_PRIVATE_USE_SURROGATES, 274), - Alias((int32_t) UBLOCK_HIGH_SURROGATES, 276), - Alias((int32_t) UBLOCK_HIRAGANA, 278), - Alias((int32_t) UBLOCK_IDEOGRAPHIC_DESCRIPTION_CHARACTERS, 280), - Alias((int32_t) UBLOCK_IPA_EXTENSIONS, 282), - Alias((int32_t) UBLOCK_KANBUN, 284), - Alias((int32_t) UBLOCK_KANGXI_RADICALS, 286), - Alias((int32_t) UBLOCK_KANNADA, 288), - Alias((int32_t) UBLOCK_KATAKANA, 290), - Alias((int32_t) UBLOCK_KATAKANA_PHONETIC_EXTENSIONS, 292), - Alias((int32_t) UBLOCK_KHMER, 294), - Alias((int32_t) UBLOCK_KHMER_SYMBOLS, 296), - Alias((int32_t) UBLOCK_LAO, 298), - Alias((int32_t) UBLOCK_LATIN_1_SUPPLEMENT, 300), - Alias((int32_t) UBLOCK_LATIN_EXTENDED_A, 302), - Alias((int32_t) UBLOCK_LATIN_EXTENDED_ADDITIONAL, 304), - Alias((int32_t) UBLOCK_LATIN_EXTENDED_B, 306), - Alias((int32_t) UBLOCK_LETTERLIKE_SYMBOLS, 308), - Alias((int32_t) UBLOCK_LIMBU, 310), - Alias((int32_t) UBLOCK_LINEAR_B_IDEOGRAMS, 312), - Alias((int32_t) UBLOCK_LINEAR_B_SYLLABARY, 314), - Alias((int32_t) UBLOCK_LOW_SURROGATES, 316), - Alias((int32_t) UBLOCK_MALAYALAM, 318), - Alias((int32_t) UBLOCK_MATHEMATICAL_ALPHANUMERIC_SYMBOLS, 320), - Alias((int32_t) UBLOCK_MATHEMATICAL_OPERATORS, 322), - Alias((int32_t) UBLOCK_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A, 324), - Alias((int32_t) UBLOCK_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B, 326), - Alias((int32_t) UBLOCK_MISCELLANEOUS_SYMBOLS, 328), - Alias((int32_t) UBLOCK_MISCELLANEOUS_SYMBOLS_AND_ARROWS, 330), - Alias((int32_t) UBLOCK_MISCELLANEOUS_TECHNICAL, 332), - Alias((int32_t) UBLOCK_MONGOLIAN, 334), - Alias((int32_t) UBLOCK_MUSICAL_SYMBOLS, 336), - Alias((int32_t) UBLOCK_MYANMAR, 338), - Alias((int32_t) UBLOCK_NO_BLOCK, 340), - Alias((int32_t) UBLOCK_NUMBER_FORMS, 342), - Alias((int32_t) UBLOCK_OGHAM, 344), - Alias((int32_t) UBLOCK_OLD_ITALIC, 346), - Alias((int32_t) UBLOCK_OPTICAL_CHARACTER_RECOGNITION, 348), - Alias((int32_t) UBLOCK_ORIYA, 350), - Alias((int32_t) UBLOCK_OSMANYA, 352), - Alias((int32_t) UBLOCK_PHONETIC_EXTENSIONS, 354), - Alias((int32_t) UBLOCK_PRIVATE_USE_AREA, 356), - Alias((int32_t) UBLOCK_RUNIC, 358), - Alias((int32_t) UBLOCK_SHAVIAN, 360), - Alias((int32_t) UBLOCK_SINHALA, 362), - Alias((int32_t) UBLOCK_SMALL_FORM_VARIANTS, 364), - Alias((int32_t) UBLOCK_SPACING_MODIFIER_LETTERS, 366), - Alias((int32_t) UBLOCK_SPECIALS, 368), - Alias((int32_t) UBLOCK_SUPERSCRIPTS_AND_SUBSCRIPTS, 370), - Alias((int32_t) UBLOCK_SUPPLEMENTAL_ARROWS_A, 372), - Alias((int32_t) UBLOCK_SUPPLEMENTAL_ARROWS_B, 374), - Alias((int32_t) UBLOCK_SUPPLEMENTAL_MATHEMATICAL_OPERATORS, 376), - Alias((int32_t) UBLOCK_SUPPLEMENTARY_PRIVATE_USE_AREA_A, 378), - Alias((int32_t) UBLOCK_SUPPLEMENTARY_PRIVATE_USE_AREA_B, 380), - Alias((int32_t) UBLOCK_SYRIAC, 382), - Alias((int32_t) UBLOCK_TAGALOG, 384), - Alias((int32_t) UBLOCK_TAGBANWA, 386), - Alias((int32_t) UBLOCK_TAGS, 388), - Alias((int32_t) UBLOCK_TAI_LE, 390), - Alias((int32_t) UBLOCK_TAI_XUAN_JING_SYMBOLS, 392), - Alias((int32_t) UBLOCK_TAMIL, 394), - Alias((int32_t) UBLOCK_TELUGU, 396), - Alias((int32_t) UBLOCK_THAANA, 398), - Alias((int32_t) UBLOCK_THAI, 400), - Alias((int32_t) UBLOCK_TIBETAN, 402), - Alias((int32_t) UBLOCK_UGARITIC, 404), - Alias((int32_t) UBLOCK_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS, 406), - Alias((int32_t) UBLOCK_VARIATION_SELECTORS, 408), - Alias((int32_t) UBLOCK_VARIATION_SELECTORS_SUPPLEMENT, 410), - Alias((int32_t) UBLOCK_YIJING_HEXAGRAM_SYMBOLS, 412), - Alias((int32_t) UBLOCK_YI_RADICALS, 414), - Alias((int32_t) UBLOCK_YI_SYLLABLES, 416), + Alias((int32_t) UBLOCK_AEGEAN_NUMBERS, 198), + Alias((int32_t) UBLOCK_ALPHABETIC_PRESENTATION_FORMS, 200), + Alias((int32_t) UBLOCK_ARABIC, 202), + Alias((int32_t) UBLOCK_ARABIC_PRESENTATION_FORMS_A, 204), + Alias((int32_t) UBLOCK_ARABIC_PRESENTATION_FORMS_B, 206), + Alias((int32_t) UBLOCK_ARMENIAN, 208), + Alias((int32_t) UBLOCK_ARROWS, 210), + Alias((int32_t) UBLOCK_BASIC_LATIN, 212), + Alias((int32_t) UBLOCK_BENGALI, 214), + Alias((int32_t) UBLOCK_BLOCK_ELEMENTS, 216), + Alias((int32_t) UBLOCK_BOPOMOFO, 218), + Alias((int32_t) UBLOCK_BOPOMOFO_EXTENDED, 220), + Alias((int32_t) UBLOCK_BOX_DRAWING, 222), + Alias((int32_t) UBLOCK_BRAILLE_PATTERNS, 224), + Alias((int32_t) UBLOCK_BUHID, 226), + Alias((int32_t) UBLOCK_BYZANTINE_MUSICAL_SYMBOLS, 228), + Alias((int32_t) UBLOCK_CHEROKEE, 230), + Alias((int32_t) UBLOCK_CJK_COMPATIBILITY, 232), + Alias((int32_t) UBLOCK_CJK_COMPATIBILITY_FORMS, 234), + Alias((int32_t) UBLOCK_CJK_COMPATIBILITY_IDEOGRAPHS, 236), + Alias((int32_t) UBLOCK_CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT, 238), + Alias((int32_t) UBLOCK_CJK_RADICALS_SUPPLEMENT, 240), + Alias((int32_t) UBLOCK_CJK_SYMBOLS_AND_PUNCTUATION, 242), + Alias((int32_t) UBLOCK_CJK_UNIFIED_IDEOGRAPHS, 244), + Alias((int32_t) UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A, 246), + Alias((int32_t) UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B, 248), + Alias((int32_t) UBLOCK_COMBINING_DIACRITICAL_MARKS, 250), + Alias((int32_t) UBLOCK_COMBINING_HALF_MARKS, 252), + Alias((int32_t) UBLOCK_COMBINING_MARKS_FOR_SYMBOLS, 254), + Alias((int32_t) UBLOCK_CONTROL_PICTURES, 256), + Alias((int32_t) UBLOCK_CURRENCY_SYMBOLS, 258), + Alias((int32_t) UBLOCK_CYPRIOT_SYLLABARY, 260), + Alias((int32_t) UBLOCK_CYRILLIC, 262), + Alias((int32_t) UBLOCK_CYRILLIC_SUPPLEMENT, 264), + Alias((int32_t) UBLOCK_DESERET, 267), + Alias((int32_t) UBLOCK_DEVANAGARI, 269), + Alias((int32_t) UBLOCK_DINGBATS, 271), + Alias((int32_t) UBLOCK_ENCLOSED_ALPHANUMERICS, 273), + Alias((int32_t) UBLOCK_ENCLOSED_CJK_LETTERS_AND_MONTHS, 275), + Alias((int32_t) UBLOCK_ETHIOPIC, 277), + Alias((int32_t) UBLOCK_GENERAL_PUNCTUATION, 279), + Alias((int32_t) UBLOCK_GEOMETRIC_SHAPES, 281), + Alias((int32_t) UBLOCK_GEORGIAN, 283), + Alias((int32_t) UBLOCK_GOTHIC, 285), + Alias((int32_t) UBLOCK_GREEK, 287), + Alias((int32_t) UBLOCK_GREEK_EXTENDED, 289), + Alias((int32_t) UBLOCK_GUJARATI, 291), + Alias((int32_t) UBLOCK_GURMUKHI, 293), + Alias((int32_t) UBLOCK_HALFWIDTH_AND_FULLWIDTH_FORMS, 295), + Alias((int32_t) UBLOCK_HANGUL_COMPATIBILITY_JAMO, 297), + Alias((int32_t) UBLOCK_HANGUL_JAMO, 299), + Alias((int32_t) UBLOCK_HANGUL_SYLLABLES, 301), + Alias((int32_t) UBLOCK_HANUNOO, 303), + Alias((int32_t) UBLOCK_HEBREW, 305), + Alias((int32_t) UBLOCK_HIGH_PRIVATE_USE_SURROGATES, 307), + Alias((int32_t) UBLOCK_HIGH_SURROGATES, 309), + Alias((int32_t) UBLOCK_HIRAGANA, 311), + Alias((int32_t) UBLOCK_IDEOGRAPHIC_DESCRIPTION_CHARACTERS, 313), + Alias((int32_t) UBLOCK_IPA_EXTENSIONS, 315), + Alias((int32_t) UBLOCK_KANBUN, 317), + Alias((int32_t) UBLOCK_KANGXI_RADICALS, 319), + Alias((int32_t) UBLOCK_KANNADA, 321), + Alias((int32_t) UBLOCK_KATAKANA, 323), + Alias((int32_t) UBLOCK_KATAKANA_PHONETIC_EXTENSIONS, 325), + Alias((int32_t) UBLOCK_KHMER, 327), + Alias((int32_t) UBLOCK_KHMER_SYMBOLS, 329), + Alias((int32_t) UBLOCK_LAO, 331), + Alias((int32_t) UBLOCK_LATIN_1_SUPPLEMENT, 333), + Alias((int32_t) UBLOCK_LATIN_EXTENDED_A, 335), + Alias((int32_t) UBLOCK_LATIN_EXTENDED_ADDITIONAL, 337), + Alias((int32_t) UBLOCK_LATIN_EXTENDED_B, 339), + Alias((int32_t) UBLOCK_LETTERLIKE_SYMBOLS, 341), + Alias((int32_t) UBLOCK_LIMBU, 343), + Alias((int32_t) UBLOCK_LINEAR_B_IDEOGRAMS, 345), + Alias((int32_t) UBLOCK_LINEAR_B_SYLLABARY, 347), + Alias((int32_t) UBLOCK_LOW_SURROGATES, 349), + Alias((int32_t) UBLOCK_MALAYALAM, 351), + Alias((int32_t) UBLOCK_MATHEMATICAL_ALPHANUMERIC_SYMBOLS, 353), + Alias((int32_t) UBLOCK_MATHEMATICAL_OPERATORS, 355), + Alias((int32_t) UBLOCK_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A, 357), + Alias((int32_t) UBLOCK_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B, 359), + Alias((int32_t) UBLOCK_MISCELLANEOUS_SYMBOLS, 361), + Alias((int32_t) UBLOCK_MISCELLANEOUS_SYMBOLS_AND_ARROWS, 363), + Alias((int32_t) UBLOCK_MISCELLANEOUS_TECHNICAL, 365), + Alias((int32_t) UBLOCK_MONGOLIAN, 367), + Alias((int32_t) UBLOCK_MUSICAL_SYMBOLS, 369), + Alias((int32_t) UBLOCK_MYANMAR, 371), + Alias((int32_t) UBLOCK_NO_BLOCK, 373), + Alias((int32_t) UBLOCK_NUMBER_FORMS, 375), + Alias((int32_t) UBLOCK_OGHAM, 377), + Alias((int32_t) UBLOCK_OLD_ITALIC, 379), + Alias((int32_t) UBLOCK_OPTICAL_CHARACTER_RECOGNITION, 381), + Alias((int32_t) UBLOCK_ORIYA, 383), + Alias((int32_t) UBLOCK_OSMANYA, 385), + Alias((int32_t) UBLOCK_PHONETIC_EXTENSIONS, 387), + Alias((int32_t) UBLOCK_PRIVATE_USE_AREA, 389), + Alias((int32_t) UBLOCK_RUNIC, 391), + Alias((int32_t) UBLOCK_SHAVIAN, 393), + Alias((int32_t) UBLOCK_SINHALA, 395), + Alias((int32_t) UBLOCK_SMALL_FORM_VARIANTS, 397), + Alias((int32_t) UBLOCK_SPACING_MODIFIER_LETTERS, 399), + Alias((int32_t) UBLOCK_SPECIALS, 401), + Alias((int32_t) UBLOCK_SUPERSCRIPTS_AND_SUBSCRIPTS, 403), + Alias((int32_t) UBLOCK_SUPPLEMENTAL_ARROWS_A, 405), + Alias((int32_t) UBLOCK_SUPPLEMENTAL_ARROWS_B, 407), + Alias((int32_t) UBLOCK_SUPPLEMENTAL_MATHEMATICAL_OPERATORS, 409), + Alias((int32_t) UBLOCK_SUPPLEMENTARY_PRIVATE_USE_AREA_A, 411), + Alias((int32_t) UBLOCK_SUPPLEMENTARY_PRIVATE_USE_AREA_B, 413), + Alias((int32_t) UBLOCK_SYRIAC, 415), + Alias((int32_t) UBLOCK_TAGALOG, 417), + Alias((int32_t) UBLOCK_TAGBANWA, 419), + Alias((int32_t) UBLOCK_TAGS, 421), + Alias((int32_t) UBLOCK_TAI_LE, 423), + Alias((int32_t) UBLOCK_TAI_XUAN_JING_SYMBOLS, 425), + Alias((int32_t) UBLOCK_TAMIL, 427), + Alias((int32_t) UBLOCK_TELUGU, 429), + Alias((int32_t) UBLOCK_THAANA, 431), + Alias((int32_t) UBLOCK_THAI, 433), + Alias((int32_t) UBLOCK_TIBETAN, 435), + Alias((int32_t) UBLOCK_UGARITIC, 437), + Alias((int32_t) UBLOCK_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS, 439), + Alias((int32_t) UBLOCK_VARIATION_SELECTORS, 441), + Alias((int32_t) UBLOCK_VARIATION_SELECTORS_SUPPLEMENT, 443), + Alias((int32_t) UBLOCK_YIJING_HEXAGRAM_SYMBOLS, 445), + Alias((int32_t) UBLOCK_YI_RADICALS, 447), + Alias((int32_t) UBLOCK_YI_SYLLABLES, 449), }; -const int32_t VALUES_ccc_COUNT = 18; +const int32_t VALUES_ccc_COUNT = 19; const Alias VALUES_ccc[] = { - Alias((int32_t) 0, 418), - Alias((int32_t) 1, 420), - Alias((int32_t) 202, 422), - Alias((int32_t) 216, 424), - Alias((int32_t) 218, 426), - Alias((int32_t) 220, 428), - Alias((int32_t) 222, 430), - Alias((int32_t) 224, 432), - Alias((int32_t) 226, 434), - Alias((int32_t) 228, 436), - Alias((int32_t) 230, 438), - Alias((int32_t) 232, 440), - Alias((int32_t) 233, 442), - Alias((int32_t) 234, 444), - Alias((int32_t) 240, 446), - Alias((int32_t) 7, 448), - Alias((int32_t) 8, 450), - Alias((int32_t) 9, 452), + Alias((int32_t) 0, 451), + Alias((int32_t) 1, 453), + Alias((int32_t) 200, 455), + Alias((int32_t) 202, 457), + Alias((int32_t) 216, 459), + Alias((int32_t) 218, 461), + Alias((int32_t) 220, 463), + Alias((int32_t) 222, 465), + Alias((int32_t) 224, 467), + Alias((int32_t) 226, 469), + Alias((int32_t) 228, 471), + Alias((int32_t) 230, 473), + Alias((int32_t) 232, 475), + Alias((int32_t) 233, 477), + Alias((int32_t) 234, 479), + Alias((int32_t) 240, 481), + Alias((int32_t) 7, 483), + Alias((int32_t) 8, 485), + Alias((int32_t) 9, 487), }; const int32_t VALUES_dt_COUNT = 18; const Alias VALUES_dt[] = { - Alias((int32_t) U_DT_CANONICAL, 454), - Alias((int32_t) U_DT_CIRCLE, 456), - Alias((int32_t) U_DT_COMPAT, 458), - Alias((int32_t) U_DT_FINAL, 460), - Alias((int32_t) U_DT_FONT, 462), - Alias((int32_t) U_DT_FRACTION, 464), - Alias((int32_t) U_DT_INITIAL, 466), - Alias((int32_t) U_DT_ISOLATED, 468), - Alias((int32_t) U_DT_MEDIAL, 470), - Alias((int32_t) U_DT_NARROW, 472), - Alias((int32_t) U_DT_NOBREAK, 474), - Alias((int32_t) U_DT_NONE, 476), - Alias((int32_t) U_DT_SMALL, 478), - Alias((int32_t) U_DT_SQUARE, 480), - Alias((int32_t) U_DT_SUB, 482), - Alias((int32_t) U_DT_SUPER, 484), - Alias((int32_t) U_DT_VERTICAL, 486), - Alias((int32_t) U_DT_WIDE, 488), + Alias((int32_t) U_DT_CANONICAL, 489), + Alias((int32_t) U_DT_CIRCLE, 491), + Alias((int32_t) U_DT_COMPAT, 493), + Alias((int32_t) U_DT_FINAL, 495), + Alias((int32_t) U_DT_FONT, 497), + Alias((int32_t) U_DT_FRACTION, 499), + Alias((int32_t) U_DT_INITIAL, 501), + Alias((int32_t) U_DT_ISOLATED, 503), + Alias((int32_t) U_DT_MEDIAL, 505), + Alias((int32_t) U_DT_NARROW, 507), + Alias((int32_t) U_DT_NOBREAK, 509), + Alias((int32_t) U_DT_NONE, 511), + Alias((int32_t) U_DT_SMALL, 513), + Alias((int32_t) U_DT_SQUARE, 515), + Alias((int32_t) U_DT_SUB, 517), + Alias((int32_t) U_DT_SUPER, 519), + Alias((int32_t) U_DT_VERTICAL, 521), + Alias((int32_t) U_DT_WIDE, 523), }; const int32_t VALUES_ea_COUNT = 6; const Alias VALUES_ea[] = { - Alias((int32_t) U_EA_AMBIGUOUS, 490), - Alias((int32_t) U_EA_FULLWIDTH, 492), - Alias((int32_t) U_EA_HALFWIDTH, 494), - Alias((int32_t) U_EA_NARROW, 496), - Alias((int32_t) U_EA_NEUTRAL, 498), - Alias((int32_t) U_EA_WIDE, 500), + Alias((int32_t) U_EA_AMBIGUOUS, 525), + Alias((int32_t) U_EA_FULLWIDTH, 527), + Alias((int32_t) U_EA_HALFWIDTH, 529), + Alias((int32_t) U_EA_NARROW, 531), + Alias((int32_t) U_EA_NEUTRAL, 533), + Alias((int32_t) U_EA_WIDE, 535), }; const int32_t VALUES_gc_COUNT = 30; const Alias VALUES_gc[] = { - Alias((int32_t) U_COMBINING_SPACING_MARK, 502), - Alias((int32_t) U_CONNECTOR_PUNCTUATION, 504), - Alias((int32_t) U_CONTROL_CHAR, 506), - Alias((int32_t) U_CURRENCY_SYMBOL, 508), - Alias((int32_t) U_DASH_PUNCTUATION, 510), - Alias((int32_t) U_DECIMAL_DIGIT_NUMBER, 512), - Alias((int32_t) U_ENCLOSING_MARK, 514), - Alias((int32_t) U_END_PUNCTUATION, 516), - Alias((int32_t) U_FINAL_PUNCTUATION, 518), - Alias((int32_t) U_FORMAT_CHAR, 520), - Alias((int32_t) U_GENERAL_OTHER_TYPES, 522), - Alias((int32_t) U_INITIAL_PUNCTUATION, 524), - Alias((int32_t) U_LETTER_NUMBER, 526), - Alias((int32_t) U_LINE_SEPARATOR, 528), - Alias((int32_t) U_LOWERCASE_LETTER, 530), - Alias((int32_t) U_MATH_SYMBOL, 532), - Alias((int32_t) U_MODIFIER_LETTER, 534), - Alias((int32_t) U_MODIFIER_SYMBOL, 536), - Alias((int32_t) U_NON_SPACING_MARK, 538), - Alias((int32_t) U_OTHER_LETTER, 540), - Alias((int32_t) U_OTHER_NUMBER, 542), - Alias((int32_t) U_OTHER_PUNCTUATION, 544), - Alias((int32_t) U_OTHER_SYMBOL, 546), - Alias((int32_t) U_PARAGRAPH_SEPARATOR, 548), - Alias((int32_t) U_PRIVATE_USE_CHAR, 550), - Alias((int32_t) U_SPACE_SEPARATOR, 552), - Alias((int32_t) U_START_PUNCTUATION, 554), - Alias((int32_t) U_SURROGATE, 556), - Alias((int32_t) U_TITLECASE_LETTER, 558), - Alias((int32_t) U_UPPERCASE_LETTER, 560), + Alias((int32_t) U_COMBINING_SPACING_MARK, 537), + Alias((int32_t) U_CONNECTOR_PUNCTUATION, 539), + Alias((int32_t) U_CONTROL_CHAR, 541), + Alias((int32_t) U_CURRENCY_SYMBOL, 543), + Alias((int32_t) U_DASH_PUNCTUATION, 545), + Alias((int32_t) U_DECIMAL_DIGIT_NUMBER, 547), + Alias((int32_t) U_ENCLOSING_MARK, 549), + Alias((int32_t) U_END_PUNCTUATION, 551), + Alias((int32_t) U_FINAL_PUNCTUATION, 553), + Alias((int32_t) U_FORMAT_CHAR, 555), + Alias((int32_t) U_GENERAL_OTHER_TYPES, 557), + Alias((int32_t) U_INITIAL_PUNCTUATION, 559), + Alias((int32_t) U_LETTER_NUMBER, 561), + Alias((int32_t) U_LINE_SEPARATOR, 563), + Alias((int32_t) U_LOWERCASE_LETTER, 565), + Alias((int32_t) U_MATH_SYMBOL, 567), + Alias((int32_t) U_MODIFIER_LETTER, 569), + Alias((int32_t) U_MODIFIER_SYMBOL, 571), + Alias((int32_t) U_NON_SPACING_MARK, 573), + Alias((int32_t) U_OTHER_LETTER, 575), + Alias((int32_t) U_OTHER_NUMBER, 577), + Alias((int32_t) U_OTHER_PUNCTUATION, 579), + Alias((int32_t) U_OTHER_SYMBOL, 581), + Alias((int32_t) U_PARAGRAPH_SEPARATOR, 583), + Alias((int32_t) U_PRIVATE_USE_CHAR, 585), + Alias((int32_t) U_SPACE_SEPARATOR, 587), + Alias((int32_t) U_START_PUNCTUATION, 589), + Alias((int32_t) U_SURROGATE, 591), + Alias((int32_t) U_TITLECASE_LETTER, 593), + Alias((int32_t) U_UPPERCASE_LETTER, 595), }; const int32_t VALUES_gcm_COUNT = 38; const Alias VALUES_gcm[] = { - Alias((int32_t) U_GC_CC_MASK, 506), - Alias((int32_t) U_GC_CF_MASK, 520), - Alias((int32_t) U_GC_CN_MASK, 522), - Alias((int32_t) U_GC_CO_MASK, 550), - Alias((int32_t) U_GC_CS_MASK, 556), - Alias((int32_t) U_GC_C_MASK, 562), - Alias((int32_t) U_GC_LC_MASK, 564), - Alias((int32_t) U_GC_LL_MASK, 530), - Alias((int32_t) U_GC_LM_MASK, 534), - Alias((int32_t) U_GC_LO_MASK, 540), - Alias((int32_t) U_GC_LT_MASK, 558), - Alias((int32_t) U_GC_LU_MASK, 560), - Alias((int32_t) U_GC_L_MASK, 566), - Alias((int32_t) U_GC_MC_MASK, 502), - Alias((int32_t) U_GC_ME_MASK, 514), - Alias((int32_t) U_GC_MN_MASK, 538), - Alias((int32_t) U_GC_M_MASK, 568), - Alias((int32_t) U_GC_ND_MASK, 512), - Alias((int32_t) U_GC_NL_MASK, 526), - Alias((int32_t) U_GC_NO_MASK, 542), - Alias((int32_t) U_GC_N_MASK, 570), - Alias((int32_t) U_GC_PC_MASK, 504), - Alias((int32_t) U_GC_PD_MASK, 510), - Alias((int32_t) U_GC_PE_MASK, 516), - Alias((int32_t) U_GC_PF_MASK, 518), - Alias((int32_t) U_GC_PI_MASK, 524), - Alias((int32_t) U_GC_PO_MASK, 544), - Alias((int32_t) U_GC_PS_MASK, 554), - Alias((int32_t) U_GC_P_MASK, 572), - Alias((int32_t) U_GC_SC_MASK, 508), - Alias((int32_t) U_GC_SK_MASK, 536), - Alias((int32_t) U_GC_SM_MASK, 532), - Alias((int32_t) U_GC_SO_MASK, 546), - Alias((int32_t) U_GC_S_MASK, 574), - Alias((int32_t) U_GC_ZL_MASK, 528), - Alias((int32_t) U_GC_ZP_MASK, 548), - Alias((int32_t) U_GC_ZS_MASK, 552), - Alias((int32_t) U_GC_Z_MASK, 576), + Alias((int32_t) U_GC_CC_MASK, 541), + Alias((int32_t) U_GC_CF_MASK, 555), + Alias((int32_t) U_GC_CN_MASK, 557), + Alias((int32_t) U_GC_CO_MASK, 585), + Alias((int32_t) U_GC_CS_MASK, 591), + Alias((int32_t) U_GC_C_MASK, 597), + Alias((int32_t) U_GC_LC_MASK, 599), + Alias((int32_t) U_GC_LL_MASK, 565), + Alias((int32_t) U_GC_LM_MASK, 569), + Alias((int32_t) U_GC_LO_MASK, 575), + Alias((int32_t) U_GC_LT_MASK, 593), + Alias((int32_t) U_GC_LU_MASK, 595), + Alias((int32_t) U_GC_L_MASK, 601), + Alias((int32_t) U_GC_MC_MASK, 537), + Alias((int32_t) U_GC_ME_MASK, 549), + Alias((int32_t) U_GC_MN_MASK, 573), + Alias((int32_t) U_GC_M_MASK, 603), + Alias((int32_t) U_GC_ND_MASK, 547), + Alias((int32_t) U_GC_NL_MASK, 561), + Alias((int32_t) U_GC_NO_MASK, 577), + Alias((int32_t) U_GC_N_MASK, 605), + Alias((int32_t) U_GC_PC_MASK, 539), + Alias((int32_t) U_GC_PD_MASK, 545), + Alias((int32_t) U_GC_PE_MASK, 551), + Alias((int32_t) U_GC_PF_MASK, 553), + Alias((int32_t) U_GC_PI_MASK, 559), + Alias((int32_t) U_GC_PO_MASK, 579), + Alias((int32_t) U_GC_PS_MASK, 589), + Alias((int32_t) U_GC_P_MASK, 607), + Alias((int32_t) U_GC_SC_MASK, 543), + Alias((int32_t) U_GC_SK_MASK, 571), + Alias((int32_t) U_GC_SM_MASK, 567), + Alias((int32_t) U_GC_SO_MASK, 581), + Alias((int32_t) U_GC_S_MASK, 609), + Alias((int32_t) U_GC_ZL_MASK, 563), + Alias((int32_t) U_GC_ZP_MASK, 583), + Alias((int32_t) U_GC_ZS_MASK, 587), + Alias((int32_t) U_GC_Z_MASK, 611), }; const int32_t VALUES_hst_COUNT = 6; const Alias VALUES_hst[] = { - Alias((int32_t) U_HST_LEADING_JAMO, 578), - Alias((int32_t) U_HST_LVT_SYLLABLE, 580), - Alias((int32_t) U_HST_LV_SYLLABLE, 582), - Alias((int32_t) U_HST_NOT_APPLICABLE, 584), - Alias((int32_t) U_HST_TRAILING_JAMO, 586), - Alias((int32_t) U_HST_VOWEL_JAMO, 588), + Alias((int32_t) U_HST_LEADING_JAMO, 613), + Alias((int32_t) U_HST_LVT_SYLLABLE, 615), + Alias((int32_t) U_HST_LV_SYLLABLE, 617), + Alias((int32_t) U_HST_NOT_APPLICABLE, 619), + Alias((int32_t) U_HST_TRAILING_JAMO, 621), + Alias((int32_t) U_HST_VOWEL_JAMO, 623), }; const int32_t VALUES_jg_COUNT = 54; const Alias VALUES_jg[] = { - Alias((int32_t) U_JG_AIN, 590), - Alias((int32_t) U_JG_ALAPH, 592), - Alias((int32_t) U_JG_ALEF, 594), - Alias((int32_t) U_JG_BEH, 596), - Alias((int32_t) U_JG_BETH, 598), - Alias((int32_t) U_JG_DAL, 600), - Alias((int32_t) U_JG_DALATH_RISH, 602), - Alias((int32_t) U_JG_E, 604), - Alias((int32_t) U_JG_FE, 606), - Alias((int32_t) U_JG_FEH, 608), - Alias((int32_t) U_JG_FINAL_SEMKATH, 610), - Alias((int32_t) U_JG_GAF, 612), - Alias((int32_t) U_JG_GAMAL, 614), - Alias((int32_t) U_JG_HAH, 616), - Alias((int32_t) U_JG_HAMZA_ON_HEH_GOAL, 618), - Alias((int32_t) U_JG_HE, 620), - Alias((int32_t) U_JG_HEH, 622), - Alias((int32_t) U_JG_HEH_GOAL, 624), - Alias((int32_t) U_JG_HETH, 626), - Alias((int32_t) U_JG_KAF, 628), - Alias((int32_t) U_JG_KAPH, 630), - Alias((int32_t) U_JG_KHAPH, 632), - Alias((int32_t) U_JG_KNOTTED_HEH, 634), - Alias((int32_t) U_JG_LAM, 636), - Alias((int32_t) U_JG_LAMADH, 638), - Alias((int32_t) U_JG_MEEM, 640), - Alias((int32_t) U_JG_MIM, 642), - Alias((int32_t) U_JG_NOON, 644), - Alias((int32_t) U_JG_NO_JOINING_GROUP, 646), - Alias((int32_t) U_JG_NUN, 648), - Alias((int32_t) U_JG_PE, 650), - Alias((int32_t) U_JG_QAF, 652), - Alias((int32_t) U_JG_QAPH, 654), - Alias((int32_t) U_JG_REH, 656), - Alias((int32_t) U_JG_REVERSED_PE, 658), - Alias((int32_t) U_JG_SAD, 660), - Alias((int32_t) U_JG_SADHE, 662), - Alias((int32_t) U_JG_SEEN, 664), - Alias((int32_t) U_JG_SEMKATH, 666), - Alias((int32_t) U_JG_SHIN, 668), - Alias((int32_t) U_JG_SWASH_KAF, 670), - Alias((int32_t) U_JG_SYRIAC_WAW, 672), - Alias((int32_t) U_JG_TAH, 674), - Alias((int32_t) U_JG_TAW, 676), - Alias((int32_t) U_JG_TEH_MARBUTA, 678), - Alias((int32_t) U_JG_TETH, 680), - Alias((int32_t) U_JG_WAW, 682), - Alias((int32_t) U_JG_YEH, 684), - Alias((int32_t) U_JG_YEH_BARREE, 686), - Alias((int32_t) U_JG_YEH_WITH_TAIL, 688), - Alias((int32_t) U_JG_YUDH, 690), - Alias((int32_t) U_JG_YUDH_HE, 692), - Alias((int32_t) U_JG_ZAIN, 694), - Alias((int32_t) U_JG_ZHAIN, 696), + Alias((int32_t) U_JG_AIN, 625), + Alias((int32_t) U_JG_ALAPH, 627), + Alias((int32_t) U_JG_ALEF, 629), + Alias((int32_t) U_JG_BEH, 631), + Alias((int32_t) U_JG_BETH, 633), + Alias((int32_t) U_JG_DAL, 635), + Alias((int32_t) U_JG_DALATH_RISH, 637), + Alias((int32_t) U_JG_E, 639), + Alias((int32_t) U_JG_FE, 641), + Alias((int32_t) U_JG_FEH, 643), + Alias((int32_t) U_JG_FINAL_SEMKATH, 645), + Alias((int32_t) U_JG_GAF, 647), + Alias((int32_t) U_JG_GAMAL, 649), + Alias((int32_t) U_JG_HAH, 651), + Alias((int32_t) U_JG_HAMZA_ON_HEH_GOAL, 653), + Alias((int32_t) U_JG_HE, 655), + Alias((int32_t) U_JG_HEH, 657), + Alias((int32_t) U_JG_HEH_GOAL, 659), + Alias((int32_t) U_JG_HETH, 661), + Alias((int32_t) U_JG_KAF, 663), + Alias((int32_t) U_JG_KAPH, 665), + Alias((int32_t) U_JG_KHAPH, 667), + Alias((int32_t) U_JG_KNOTTED_HEH, 669), + Alias((int32_t) U_JG_LAM, 671), + Alias((int32_t) U_JG_LAMADH, 673), + Alias((int32_t) U_JG_MEEM, 675), + Alias((int32_t) U_JG_MIM, 677), + Alias((int32_t) U_JG_NOON, 679), + Alias((int32_t) U_JG_NO_JOINING_GROUP, 681), + Alias((int32_t) U_JG_NUN, 683), + Alias((int32_t) U_JG_PE, 685), + Alias((int32_t) U_JG_QAF, 687), + Alias((int32_t) U_JG_QAPH, 689), + Alias((int32_t) U_JG_REH, 691), + Alias((int32_t) U_JG_REVERSED_PE, 693), + Alias((int32_t) U_JG_SAD, 695), + Alias((int32_t) U_JG_SADHE, 697), + Alias((int32_t) U_JG_SEEN, 699), + Alias((int32_t) U_JG_SEMKATH, 701), + Alias((int32_t) U_JG_SHIN, 703), + Alias((int32_t) U_JG_SWASH_KAF, 705), + Alias((int32_t) U_JG_SYRIAC_WAW, 707), + Alias((int32_t) U_JG_TAH, 709), + Alias((int32_t) U_JG_TAW, 711), + Alias((int32_t) U_JG_TEH_MARBUTA, 713), + Alias((int32_t) U_JG_TETH, 715), + Alias((int32_t) U_JG_WAW, 717), + Alias((int32_t) U_JG_YEH, 719), + Alias((int32_t) U_JG_YEH_BARREE, 721), + Alias((int32_t) U_JG_YEH_WITH_TAIL, 723), + Alias((int32_t) U_JG_YUDH, 725), + Alias((int32_t) U_JG_YUDH_HE, 727), + Alias((int32_t) U_JG_ZAIN, 729), + Alias((int32_t) U_JG_ZHAIN, 731), }; const int32_t VALUES_jt_COUNT = 6; const Alias VALUES_jt[] = { - Alias((int32_t) U_JT_DUAL_JOINING, 698), - Alias((int32_t) U_JT_JOIN_CAUSING, 700), - Alias((int32_t) U_JT_LEFT_JOINING, 702), - Alias((int32_t) U_JT_NON_JOINING, 704), - Alias((int32_t) U_JT_RIGHT_JOINING, 706), - Alias((int32_t) U_JT_TRANSPARENT, 708), + Alias((int32_t) U_JT_DUAL_JOINING, 733), + Alias((int32_t) U_JT_JOIN_CAUSING, 735), + Alias((int32_t) U_JT_LEFT_JOINING, 737), + Alias((int32_t) U_JT_NON_JOINING, 739), + Alias((int32_t) U_JT_RIGHT_JOINING, 741), + Alias((int32_t) U_JT_TRANSPARENT, 743), }; const int32_t VALUES_lb_COUNT = 31; const Alias VALUES_lb[] = { - Alias((int32_t) U_LB_ALPHABETIC, 710), - Alias((int32_t) U_LB_AMBIGUOUS, 712), - Alias((int32_t) U_LB_BREAK_AFTER, 714), - Alias((int32_t) U_LB_BREAK_BEFORE, 716), - Alias((int32_t) U_LB_BREAK_BOTH, 718), - Alias((int32_t) U_LB_BREAK_SYMBOLS, 720), - Alias((int32_t) U_LB_CARRIAGE_RETURN, 722), - Alias((int32_t) U_LB_CLOSE_PUNCTUATION, 724), - Alias((int32_t) U_LB_COMBINING_MARK, 726), - Alias((int32_t) U_LB_COMPLEX_CONTEXT, 728), - Alias((int32_t) U_LB_CONTINGENT_BREAK, 730), - Alias((int32_t) U_LB_EXCLAMATION, 732), - Alias((int32_t) U_LB_GLUE, 734), - Alias((int32_t) U_LB_HYPHEN, 736), - Alias((int32_t) U_LB_IDEOGRAPHIC, 738), - Alias((int32_t) U_LB_INFIX_NUMERIC, 740), - Alias((int32_t) U_LB_INSEPERABLE, 742), - Alias((int32_t) U_LB_LINE_FEED, 744), - Alias((int32_t) U_LB_MANDATORY_BREAK, 746), - Alias((int32_t) U_LB_NEXT_LINE, 748), - Alias((int32_t) U_LB_NONSTARTER, 750), - Alias((int32_t) U_LB_NUMERIC, 752), - Alias((int32_t) U_LB_OPEN_PUNCTUATION, 754), - Alias((int32_t) U_LB_POSTFIX_NUMERIC, 756), - Alias((int32_t) U_LB_PREFIX_NUMERIC, 758), - Alias((int32_t) U_LB_QUOTATION, 760), - Alias((int32_t) U_LB_SPACE, 762), - Alias((int32_t) U_LB_SURROGATE, 764), - Alias((int32_t) U_LB_UNKNOWN, 766), - Alias((int32_t) U_LB_WORD_JOINER, 768), - Alias((int32_t) U_LB_ZWSPACE, 770), + Alias((int32_t) U_LB_ALPHABETIC, 745), + Alias((int32_t) U_LB_AMBIGUOUS, 747), + Alias((int32_t) U_LB_BREAK_AFTER, 749), + Alias((int32_t) U_LB_BREAK_BEFORE, 751), + Alias((int32_t) U_LB_BREAK_BOTH, 753), + Alias((int32_t) U_LB_BREAK_SYMBOLS, 755), + Alias((int32_t) U_LB_CARRIAGE_RETURN, 757), + Alias((int32_t) U_LB_CLOSE_PUNCTUATION, 759), + Alias((int32_t) U_LB_COMBINING_MARK, 761), + Alias((int32_t) U_LB_COMPLEX_CONTEXT, 763), + Alias((int32_t) U_LB_CONTINGENT_BREAK, 765), + Alias((int32_t) U_LB_EXCLAMATION, 767), + Alias((int32_t) U_LB_GLUE, 769), + Alias((int32_t) U_LB_HYPHEN, 771), + Alias((int32_t) U_LB_IDEOGRAPHIC, 773), + Alias((int32_t) U_LB_INFIX_NUMERIC, 775), + Alias((int32_t) U_LB_INSEPARABLE, 777), + Alias((int32_t) U_LB_LINE_FEED, 780), + Alias((int32_t) U_LB_MANDATORY_BREAK, 782), + Alias((int32_t) U_LB_NEXT_LINE, 784), + Alias((int32_t) U_LB_NONSTARTER, 786), + Alias((int32_t) U_LB_NUMERIC, 788), + Alias((int32_t) U_LB_OPEN_PUNCTUATION, 790), + Alias((int32_t) U_LB_POSTFIX_NUMERIC, 792), + Alias((int32_t) U_LB_PREFIX_NUMERIC, 794), + Alias((int32_t) U_LB_QUOTATION, 796), + Alias((int32_t) U_LB_SPACE, 798), + Alias((int32_t) U_LB_SURROGATE, 800), + Alias((int32_t) U_LB_UNKNOWN, 802), + Alias((int32_t) U_LB_WORD_JOINER, 804), + Alias((int32_t) U_LB_ZWSPACE, 806), +}; + +const int32_t VALUES_lccc_COUNT = 19; + +const Alias VALUES_lccc[] = { + Alias((int32_t) 0, 451), + Alias((int32_t) 1, 453), + Alias((int32_t) 200, 455), + Alias((int32_t) 202, 457), + Alias((int32_t) 216, 459), + Alias((int32_t) 218, 461), + Alias((int32_t) 220, 463), + Alias((int32_t) 222, 465), + Alias((int32_t) 224, 467), + Alias((int32_t) 226, 469), + Alias((int32_t) 228, 471), + Alias((int32_t) 230, 473), + Alias((int32_t) 232, 475), + Alias((int32_t) 233, 477), + Alias((int32_t) 234, 479), + Alias((int32_t) 240, 481), + Alias((int32_t) 7, 483), + Alias((int32_t) 8, 485), + Alias((int32_t) 9, 487), }; const int32_t VALUES_nt_COUNT = 4; const Alias VALUES_nt[] = { - Alias((int32_t) U_NT_DECIMAL, 772), - Alias((int32_t) U_NT_DIGIT, 774), - Alias((int32_t) U_NT_NONE, 776), - Alias((int32_t) U_NT_NUMERIC, 778), + Alias((int32_t) U_NT_DECIMAL, 808), + Alias((int32_t) U_NT_DIGIT, 810), + Alias((int32_t) U_NT_NONE, 812), + Alias((int32_t) U_NT_NUMERIC, 814), }; -const int32_t VALUES_sc_COUNT = 54; +const int32_t VALUES_sc_COUNT = 55; const Alias VALUES_sc[] = { - Alias((int32_t) USCRIPT_ARABIC, 780), - Alias((int32_t) USCRIPT_ARMENIAN, 782), - Alias((int32_t) USCRIPT_BENGALI, 784), - Alias((int32_t) USCRIPT_BOPOMOFO, 786), - Alias((int32_t) USCRIPT_BRAILLE, 788), - Alias((int32_t) USCRIPT_BUHID, 790), - Alias((int32_t) USCRIPT_CANADIAN_ABORIGINAL, 792), - Alias((int32_t) USCRIPT_CHEROKEE, 794), - Alias((int32_t) USCRIPT_COMMON, 796), - Alias((int32_t) USCRIPT_COPTIC, 798), - Alias((int32_t) USCRIPT_CYPRIOT, 800), - Alias((int32_t) USCRIPT_CYRILLIC, 802), - Alias((int32_t) USCRIPT_DESERET, 804), - Alias((int32_t) USCRIPT_DEVANAGARI, 806), - Alias((int32_t) USCRIPT_ETHIOPIC, 808), - Alias((int32_t) USCRIPT_GEORGIAN, 810), - Alias((int32_t) USCRIPT_GOTHIC, 812), - Alias((int32_t) USCRIPT_GREEK, 814), - Alias((int32_t) USCRIPT_GUJARATI, 816), - Alias((int32_t) USCRIPT_GURMUKHI, 818), - Alias((int32_t) USCRIPT_HAN, 820), - Alias((int32_t) USCRIPT_HANGUL, 822), - Alias((int32_t) USCRIPT_HANUNOO, 824), - Alias((int32_t) USCRIPT_HEBREW, 826), - Alias((int32_t) USCRIPT_HIRAGANA, 828), - Alias((int32_t) USCRIPT_INHERITED, 830), - Alias((int32_t) USCRIPT_KANNADA, 832), - Alias((int32_t) USCRIPT_KATAKANA, 834), - Alias((int32_t) USCRIPT_KHMER, 836), - Alias((int32_t) USCRIPT_LAO, 838), - Alias((int32_t) USCRIPT_LATIN, 840), - Alias((int32_t) USCRIPT_LIMBU, 842), - Alias((int32_t) USCRIPT_LINEAR_B, 844), - Alias((int32_t) USCRIPT_MALAYALAM, 846), - Alias((int32_t) USCRIPT_MONGOLIAN, 848), - Alias((int32_t) USCRIPT_MYANMAR, 850), - Alias((int32_t) USCRIPT_OGHAM, 852), - Alias((int32_t) USCRIPT_OLD_ITALIC, 854), - Alias((int32_t) USCRIPT_ORIYA, 856), - Alias((int32_t) USCRIPT_OSMANYA, 858), - Alias((int32_t) USCRIPT_RUNIC, 860), - Alias((int32_t) USCRIPT_SHAVIAN, 862), - Alias((int32_t) USCRIPT_SINHALA, 864), - Alias((int32_t) USCRIPT_SYRIAC, 866), - Alias((int32_t) USCRIPT_TAGALOG, 868), - Alias((int32_t) USCRIPT_TAGBANWA, 870), - Alias((int32_t) USCRIPT_TAI_LE, 872), - Alias((int32_t) USCRIPT_TAMIL, 874), - Alias((int32_t) USCRIPT_TELUGU, 876), - Alias((int32_t) USCRIPT_THAANA, 878), - Alias((int32_t) USCRIPT_THAI, 880), - Alias((int32_t) USCRIPT_TIBETAN, 882), - Alias((int32_t) USCRIPT_UGARITIC, 884), - Alias((int32_t) USCRIPT_YI, 886), + Alias((int32_t) USCRIPT_ARABIC, 816), + Alias((int32_t) USCRIPT_ARMENIAN, 818), + Alias((int32_t) USCRIPT_BENGALI, 820), + Alias((int32_t) USCRIPT_BOPOMOFO, 822), + Alias((int32_t) USCRIPT_BRAILLE, 824), + Alias((int32_t) USCRIPT_BUHID, 826), + Alias((int32_t) USCRIPT_CANADIAN_ABORIGINAL, 828), + Alias((int32_t) USCRIPT_CHEROKEE, 830), + Alias((int32_t) USCRIPT_COMMON, 832), + Alias((int32_t) USCRIPT_COPTIC, 834), + Alias((int32_t) USCRIPT_CYPRIOT, 836), + Alias((int32_t) USCRIPT_CYRILLIC, 838), + Alias((int32_t) USCRIPT_DESERET, 840), + Alias((int32_t) USCRIPT_DEVANAGARI, 842), + Alias((int32_t) USCRIPT_ETHIOPIC, 844), + Alias((int32_t) USCRIPT_GEORGIAN, 846), + Alias((int32_t) USCRIPT_GOTHIC, 848), + Alias((int32_t) USCRIPT_GREEK, 850), + Alias((int32_t) USCRIPT_GUJARATI, 852), + Alias((int32_t) USCRIPT_GURMUKHI, 854), + Alias((int32_t) USCRIPT_HAN, 856), + Alias((int32_t) USCRIPT_HANGUL, 858), + Alias((int32_t) USCRIPT_HANUNOO, 860), + Alias((int32_t) USCRIPT_HEBREW, 862), + Alias((int32_t) USCRIPT_HIRAGANA, 864), + Alias((int32_t) USCRIPT_INHERITED, 866), + Alias((int32_t) USCRIPT_KANNADA, 868), + Alias((int32_t) USCRIPT_KATAKANA, 870), + Alias((int32_t) USCRIPT_KATAKANA_OR_HIRAGANA, 872), + Alias((int32_t) USCRIPT_KHMER, 874), + Alias((int32_t) USCRIPT_LAO, 876), + Alias((int32_t) USCRIPT_LATIN, 878), + Alias((int32_t) USCRIPT_LIMBU, 880), + Alias((int32_t) USCRIPT_LINEAR_B, 882), + Alias((int32_t) USCRIPT_MALAYALAM, 884), + Alias((int32_t) USCRIPT_MONGOLIAN, 886), + Alias((int32_t) USCRIPT_MYANMAR, 888), + Alias((int32_t) USCRIPT_OGHAM, 890), + Alias((int32_t) USCRIPT_OLD_ITALIC, 892), + Alias((int32_t) USCRIPT_ORIYA, 894), + Alias((int32_t) USCRIPT_OSMANYA, 896), + Alias((int32_t) USCRIPT_RUNIC, 898), + Alias((int32_t) USCRIPT_SHAVIAN, 900), + Alias((int32_t) USCRIPT_SINHALA, 902), + Alias((int32_t) USCRIPT_SYRIAC, 904), + Alias((int32_t) USCRIPT_TAGALOG, 906), + Alias((int32_t) USCRIPT_TAGBANWA, 908), + Alias((int32_t) USCRIPT_TAI_LE, 910), + Alias((int32_t) USCRIPT_TAMIL, 912), + Alias((int32_t) USCRIPT_TELUGU, 914), + Alias((int32_t) USCRIPT_THAANA, 916), + Alias((int32_t) USCRIPT_THAI, 918), + Alias((int32_t) USCRIPT_TIBETAN, 920), + Alias((int32_t) USCRIPT_UGARITIC, 922), + Alias((int32_t) USCRIPT_YI, 924), +}; + +const int32_t VALUES_tccc_COUNT = 19; + +const Alias VALUES_tccc[] = { + Alias((int32_t) 0, 451), + Alias((int32_t) 1, 453), + Alias((int32_t) 200, 455), + Alias((int32_t) 202, 457), + Alias((int32_t) 216, 459), + Alias((int32_t) 218, 461), + Alias((int32_t) 220, 463), + Alias((int32_t) 222, 465), + Alias((int32_t) 224, 467), + Alias((int32_t) 226, 469), + Alias((int32_t) 228, 471), + Alias((int32_t) 230, 473), + Alias((int32_t) 232, 475), + Alias((int32_t) 233, 477), + Alias((int32_t) 234, 479), + Alias((int32_t) 240, 481), + Alias((int32_t) 7, 483), + Alias((int32_t) 8, 485), + Alias((int32_t) 9, 487), }; -const int32_t PROPERTY_COUNT = 62; +const int32_t PROPERTY_COUNT = 75; const Property PROPERTY[] = { - Property((int32_t) UCHAR_ALPHABETIC, 0, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_ASCII_HEX_DIGIT, 2, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_BIDI_CONTROL, 4, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_BIDI_MIRRORED, 6, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_CASE_SENSITIVE, 8, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_DASH, 10, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_DEFAULT_IGNORABLE_CODE_POINT, 12, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_DEPRECATED, 14, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_DIACRITIC, 16, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_EXTENDER, 18, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_FULL_COMPOSITION_EXCLUSION, 20, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_GRAPHEME_BASE, 22, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_GRAPHEME_EXTEND, 24, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_GRAPHEME_LINK, 26, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_HEX_DIGIT, 28, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_HYPHEN, 30, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_IDEOGRAPHIC, 32, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_IDS_BINARY_OPERATOR, 34, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_IDS_TRINARY_OPERATOR, 36, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_ID_CONTINUE, 38, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_ID_START, 40, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_JOIN_CONTROL, 42, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_LOGICAL_ORDER_EXCEPTION, 44, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_LOWERCASE, 46, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_MATH, 48, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_NONCHARACTER_CODE_POINT, 50, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_QUOTATION_MARK, 52, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_RADICAL, 54, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_SOFT_DOTTED, 56, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_TERMINAL_PUNCTUATION, 58, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_UNIFIED_IDEOGRAPH, 60, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_UPPERCASE, 62, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_WHITE_SPACE, 64, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_XID_CONTINUE, 66, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_XID_START, 68, VALUES_binprop_COUNT, VALUES_binprop), - Property((int32_t) UCHAR_BIDI_CLASS, 72, VALUES_bc_COUNT, VALUES_bc), - Property((int32_t) UCHAR_BLOCK, 74, VALUES_blk_COUNT, VALUES_blk), - Property((int32_t) UCHAR_CANONICAL_COMBINING_CLASS, 76, VALUES_ccc_COUNT, VALUES_ccc), - Property((int32_t) UCHAR_DECOMPOSITION_TYPE, 78, VALUES_dt_COUNT, VALUES_dt), - Property((int32_t) UCHAR_EAST_ASIAN_WIDTH, 80, VALUES_ea_COUNT, VALUES_ea), - Property((int32_t) UCHAR_GENERAL_CATEGORY, 82, VALUES_gc_COUNT, VALUES_gc), - Property((int32_t) UCHAR_HANGUL_SYLLABLE_TYPE, 84, VALUES_hst_COUNT, VALUES_hst), - Property((int32_t) UCHAR_JOINING_GROUP, 86, VALUES_jg_COUNT, VALUES_jg), - Property((int32_t) UCHAR_JOINING_TYPE, 88, VALUES_jt_COUNT, VALUES_jt), - Property((int32_t) UCHAR_LINE_BREAK, 90, VALUES_lb_COUNT, VALUES_lb), - Property((int32_t) UCHAR_NUMERIC_TYPE, 92, VALUES_nt_COUNT, VALUES_nt), - Property((int32_t) UCHAR_SCRIPT, 94, VALUES_sc_COUNT, VALUES_sc), - Property((int32_t) UCHAR_AGE, 98, 0, NULL), - Property((int32_t) UCHAR_BIDI_MIRRORING_GLYPH, 100, 0, NULL), - Property((int32_t) UCHAR_CASE_FOLDING, 102, 0, NULL), - Property((int32_t) UCHAR_ISO_COMMENT, 104, 0, NULL), - Property((int32_t) UCHAR_LOWERCASE_MAPPING, 106, 0, NULL), - Property((int32_t) UCHAR_NAME, 108, 0, NULL), - Property((int32_t) UCHAR_SIMPLE_CASE_FOLDING, 110, 0, NULL), - Property((int32_t) UCHAR_SIMPLE_LOWERCASE_MAPPING, 112, 0, NULL), - Property((int32_t) UCHAR_SIMPLE_TITLECASE_MAPPING, 114, 0, NULL), - Property((int32_t) UCHAR_SIMPLE_UPPERCASE_MAPPING, 116, 0, NULL), - Property((int32_t) UCHAR_TITLECASE_MAPPING, 118, 0, NULL), - Property((int32_t) UCHAR_UNICODE_1_NAME, 120, 0, NULL), - Property((int32_t) UCHAR_UPPERCASE_MAPPING, 122, 0, NULL), - Property((int32_t) UCHAR_NUMERIC_VALUE, 70, 0, NULL), - Property((int32_t) UCHAR_GENERAL_CATEGORY_MASK, 96, VALUES_gcm_COUNT, VALUES_gcm), + Property((int32_t) UCHAR_ALPHABETIC, 6, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_ASCII_HEX_DIGIT, 8, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_BIDI_CONTROL, 10, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_BIDI_MIRRORED, 12, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_CASE_SENSITIVE, 14, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_DASH, 16, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_DEFAULT_IGNORABLE_CODE_POINT, 18, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_DEPRECATED, 20, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_DIACRITIC, 22, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_EXTENDER, 24, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_FULL_COMPOSITION_EXCLUSION, 26, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_GRAPHEME_BASE, 28, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_GRAPHEME_EXTEND, 30, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_GRAPHEME_LINK, 32, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_HEX_DIGIT, 34, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_HYPHEN, 36, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_IDEOGRAPHIC, 38, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_IDS_BINARY_OPERATOR, 40, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_IDS_TRINARY_OPERATOR, 42, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_ID_CONTINUE, 44, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_ID_START, 46, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_JOIN_CONTROL, 48, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_LOGICAL_ORDER_EXCEPTION, 50, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_LOWERCASE, 52, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_MATH, 54, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_NFC_INERT, 56, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_NFD_INERT, 58, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_NFKC_INERT, 60, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_NFKD_INERT, 62, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_NONCHARACTER_CODE_POINT, 64, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_QUOTATION_MARK, 66, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_RADICAL, 68, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_SEGMENT_STARTER, 70, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_SOFT_DOTTED, 72, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_S_TERM, 74, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_TERMINAL_PUNCTUATION, 76, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_UNIFIED_IDEOGRAPH, 78, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_UPPERCASE, 80, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_VARIATION_SELECTOR, 82, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_WHITE_SPACE, 84, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_XID_CONTINUE, 86, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_XID_START, 88, VALUES_binprop_COUNT, VALUES_binprop), + Property((int32_t) UCHAR_BIDI_CLASS, 92, VALUES_bc_COUNT, VALUES_bc), + Property((int32_t) UCHAR_BLOCK, 94, VALUES_blk_COUNT, VALUES_blk), + Property((int32_t) UCHAR_CANONICAL_COMBINING_CLASS, 96, VALUES_ccc_COUNT, VALUES_ccc), + Property((int32_t) UCHAR_DECOMPOSITION_TYPE, 98, VALUES_dt_COUNT, VALUES_dt), + Property((int32_t) UCHAR_EAST_ASIAN_WIDTH, 100, VALUES_ea_COUNT, VALUES_ea), + Property((int32_t) UCHAR_GENERAL_CATEGORY, 102, VALUES_gc_COUNT, VALUES_gc), + Property((int32_t) UCHAR_HANGUL_SYLLABLE_TYPE, 104, VALUES_hst_COUNT, VALUES_hst), + Property((int32_t) UCHAR_JOINING_GROUP, 106, VALUES_jg_COUNT, VALUES_jg), + Property((int32_t) UCHAR_JOINING_TYPE, 108, VALUES_jt_COUNT, VALUES_jt), + Property((int32_t) UCHAR_LEAD_CANONICAL_COMBINING_CLASS, 110, VALUES_lccc_COUNT, VALUES_lccc), + Property((int32_t) UCHAR_LINE_BREAK, 112, VALUES_lb_COUNT, VALUES_lb), + Property((int32_t) UCHAR_NFC_QUICK_CHECK, 114, VALUES_NFC_QC_COUNT, VALUES_NFC_QC), + Property((int32_t) UCHAR_NFD_QUICK_CHECK, 116, VALUES_NFD_QC_COUNT, VALUES_NFD_QC), + Property((int32_t) UCHAR_NFKC_QUICK_CHECK, 118, VALUES_NFKC_QC_COUNT, VALUES_NFKC_QC), + Property((int32_t) UCHAR_NFKD_QUICK_CHECK, 120, VALUES_NFKD_QC_COUNT, VALUES_NFKD_QC), + Property((int32_t) UCHAR_NUMERIC_TYPE, 122, VALUES_nt_COUNT, VALUES_nt), + Property((int32_t) UCHAR_SCRIPT, 124, VALUES_sc_COUNT, VALUES_sc), + Property((int32_t) UCHAR_TRAIL_CANONICAL_COMBINING_CLASS, 126, VALUES_tccc_COUNT, VALUES_tccc), + Property((int32_t) UCHAR_AGE, 130, 0, NULL), + Property((int32_t) UCHAR_BIDI_MIRRORING_GLYPH, 132, 0, NULL), + Property((int32_t) UCHAR_CASE_FOLDING, 134, 0, NULL), + Property((int32_t) UCHAR_ISO_COMMENT, 136, 0, NULL), + Property((int32_t) UCHAR_LOWERCASE_MAPPING, 138, 0, NULL), + Property((int32_t) UCHAR_NAME, 140, 0, NULL), + Property((int32_t) UCHAR_SIMPLE_CASE_FOLDING, 142, 0, NULL), + Property((int32_t) UCHAR_SIMPLE_LOWERCASE_MAPPING, 144, 0, NULL), + Property((int32_t) UCHAR_SIMPLE_TITLECASE_MAPPING, 146, 0, NULL), + Property((int32_t) UCHAR_SIMPLE_UPPERCASE_MAPPING, 148, 0, NULL), + Property((int32_t) UCHAR_TITLECASE_MAPPING, 150, 0, NULL), + Property((int32_t) UCHAR_UNICODE_1_NAME, 152, 0, NULL), + Property((int32_t) UCHAR_UPPERCASE_MAPPING, 154, 0, NULL), + Property((int32_t) UCHAR_NUMERIC_VALUE, 90, 0, NULL), + Property((int32_t) UCHAR_GENERAL_CATEGORY_MASK, 128, VALUES_gcm_COUNT, VALUES_gcm), }; /*eof*/ diff --git a/icuSources/tools/genpname/genpname.cpp b/icuSources/tools/genpname/genpname.cpp index 7f483168..b2df4d5c 100644 --- a/icuSources/tools/genpname/genpname.cpp +++ b/icuSources/tools/genpname/genpname.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2002, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -8,19 +8,21 @@ ********************************************************************** */ -#include <stdio.h> -#include <stdlib.h> #include "unicode/utypes.h" #include "unicode/putil.h" +#include "unicode/uclean.h" #include "cmemory.h" #include "cstring.h" #include "filestrm.h" +#include "uarrsort.h" #include "unewdata.h" #include "uoptions.h" #include "uprops.h" #include "propname.h" #include "uassert.h" +#include <stdio.h> + // TODO: Clean up and comment this code. //---------------------------------------------------------------------- @@ -32,6 +34,7 @@ #include "unicode/uchar.h" #include "unicode/uscript.h" +#include "unicode/unorm.h" class AliasName { public: @@ -214,9 +217,12 @@ public: NameToEnumEntry(int32_t a, int32_t b) { nameIndex=a; enumValue=b; } }; -// Sort function for NameToEnumEntry (sort by name index) -U_CAPI int compareNameToEnumEntry(const void* e1, const void* e2) { - return ((NameToEnumEntry*)e1)->nameIndex - ((NameToEnumEntry*)e2)->nameIndex; +// Sort function for NameToEnumEntry (sort by name) +U_CFUNC int32_t +compareNameToEnumEntry(const void * /*context*/, const void* e1, const void* e2) { + return + STRING_TABLE[((NameToEnumEntry*)e1)->nameIndex]. + compare(STRING_TABLE[((NameToEnumEntry*)e2)->nameIndex]); } //---------------------------------------------------------------------- @@ -245,7 +251,8 @@ public: }; // Sort function for EnumToNameGroupEntry (sort by name index) -U_CAPI int compareEnumToNameGroupEntry(const void* e1, const void* e2) { +U_CFUNC int32_t +compareEnumToNameGroupEntry(const void * /*context*/, const void* e1, const void* e2) { return ((EnumToNameGroupEntry*)e1)->enumValue - ((EnumToNameGroupEntry*)e2)->enumValue; } @@ -276,7 +283,8 @@ public: }; // Sort function for EnumToValueEntry (sort by enum) -U_CAPI int compareEnumToValueEntry(const void* e1, const void* e2) { +U_CFUNC int32_t +compareEnumToValueEntry(const void * /*context*/, const void* e1, const void* e2) { return ((EnumToValueEntry*)e1)->enumValue - ((EnumToValueEntry*)e2)->enumValue; } @@ -639,7 +647,7 @@ void Builder::buildStringPool(const AliasName* propertyNames, // first string must be "" -- we skip it U_ASSERT(*propertyNames[0].str == 0); for (i=1 /*sic*/; i<propertyNameCount; ++i) { - stringPool_size += uprv_strlen(propertyNames[i].str) + 1; + stringPool_size += (int32_t)(uprv_strlen(propertyNames[i].str) + 1); } stringPool = MALLOC(char, stringPool_size); stringPool_offsetArray = MALLOC(Offset, stringPool_count); @@ -648,7 +656,7 @@ void Builder::buildStringPool(const AliasName* propertyNames, stringPool_offsetArray[0] = -1; // we don't use this entry for (i=1 /*sic*/; i<propertyNameCount; ++i) { const char* str = propertyNames[i].str; - int32_t len = uprv_strlen(str); + int32_t len = (int32_t)uprv_strlen(str); uprv_strcpy(p, str); p += len; *p++ = 0; @@ -685,21 +693,22 @@ void Builder::computeOffsets() { #define COMPUTE_OFFSET(foo) COMPUTE_OFFSET2(foo,int32_t) #define COMPUTE_OFFSET2(foo,type) \ - if (debug>0) printf(#foo "\t offset=%4d size=%5d\n", off, foo##_size); \ - foo##_offset = off; \ - U_ASSERT(IS_VALID_OFFSET(off + foo##_size)); \ - U_ASSERT(foo##_offset % sizeof(type) == 0); \ + if (debug>0)\ + printf(#foo "\t offset=%4d size=%5d\n", off, (int)foo##_size);\ + foo##_offset = off;\ + U_ASSERT(IS_VALID_OFFSET(off + foo##_size));\ + U_ASSERT(foo##_offset % sizeof(type) == 0);\ off = (Offset) (off + foo##_size); COMPUTE_OFFSET(enumToName); // 0: - COMPUTE_OFFSET(nameToEnum); // 2: - COMPUTE_OFFSET(enumToValue); // 3: - COMPUTE_OFFSET(valueMap); // 4: + COMPUTE_OFFSET(nameToEnum); // 2: + COMPUTE_OFFSET(enumToValue); // 3: + COMPUTE_OFFSET(valueMap); // 4: for (i=0; i<valueMap_count; ++i) { if (debug>0) { printf(" enumToName[%d]\t offset=%4d size=%5d\n", - i, off, valueEnumToName_size[i]); + (int)i, off, (int)valueEnumToName_size[i]); } valueEnumToName_offset[i] = off; // 5: @@ -708,7 +717,7 @@ void Builder::computeOffsets() { if (debug>0) { printf(" nameToEnum[%d]\t offset=%4d size=%5d\n", - i, off, valueNameToEnum_size[i]); + (int)i, off, (int)valueNameToEnum_size[i]); } valueNameToEnum_offset[i] = off; // 6: @@ -721,7 +730,7 @@ void Builder::computeOffsets() { COMPUTE_OFFSET2(stringPool,char); // 99: total_size = off; - if (debug>0) printf("total size=%5d\n\n", total_size); + if (debug>0) printf("total size=%5d\n\n", (int)total_size); U_ASSERT(total_size <= (MAX_OFFSET+1)); } @@ -761,7 +770,7 @@ void Builder::fixupEnumToNameGroup(EnumToOffset* e2ng) { void Builder::fixupNCEnumToNameGroup(NonContiguousEnumToOffset* e2ng) { int32_t i; - EnumValue* e = e2ng->getEnumArray(); + /*EnumValue* e = e2ng->getEnumArray();*/ Offset* p = e2ng->getOffsetArray(); for (i=0; i<e2ng->count; ++i) { p[i] = nameGroupPool_offset + sizeof(Offset) * p[i]; @@ -798,7 +807,7 @@ void Builder::fixupMiscellaneousOffsets() { header.nameToEnum_offset = nameToEnum_offset; header.enumToValue_offset = enumToValue_offset; // header meta-info used by Java: - U_ASSERT(total_size > 0 && total_size < 0x7FFF); + U_ASSERT(total_size > 0 && total_size < 0x7FFF); header.total_size = (int16_t) total_size; header.valueMap_offset = valueMap_offset; header.valueMap_count = (int16_t) valueMap_count; @@ -807,13 +816,13 @@ void Builder::fixupMiscellaneousOffsets() { header.stringPool_offset = stringPool_offset; header.stringPool_count = (int16_t) stringPool_count - 1; // don't include "" entry - U_ASSERT(valueMap_count <= 0x7FFF); - U_ASSERT(nameGroupPool_count <= 0x7FFF); - U_ASSERT(stringPool_count <= 0x7FFF); + U_ASSERT(valueMap_count <= 0x7FFF); + U_ASSERT(nameGroupPool_count <= 0x7FFF); + U_ASSERT(stringPool_count <= 0x7FFF); // 3: Offset* p = enumToValue->getOffsetArray(); - EnumValue* e = enumToValue->getEnumArray(); + /*EnumValue* e = enumToValue->getEnumArray();*/ U_ASSERT(valueMap_count == enumToValue->count); for (i=0; i<valueMap_count; ++i) { p[i] = (Offset)(valueMap_offset + sizeof(ValueMap) * i); @@ -875,7 +884,10 @@ int8_t* Builder::createData(int32_t& length) const { APPEND(nameGroupPool); APPEND(stringPool); - U_ASSERT(p == limit); + if (p != limit) { + fprintf(stderr, "p != limit; p = %p, limit = %p", p, limit); + exit(1); + } return result; } @@ -897,11 +909,6 @@ static UDataInfo dataInfo = { {VERSION_0, VERSION_1, VERSION_2, VERSION_3} /* Unicode version */ }; -// Glue for C<->C++ -U_CAPI int compareAliasNames(const void* elem1, const void* elem2) { - return ((const AliasName*)elem1)->compare(*(const AliasName*)elem2); -} - class genpname { // command-line options @@ -922,9 +929,22 @@ private: }; int main(int argc, char *argv[]) { + UErrorCode status = U_ZERO_ERROR; + u_init(&status); + if (U_FAILURE(status) && status != U_FILE_ACCESS_ERROR) { + // Note: u_init() will try to open ICU property data. + // failures here are expected when building ICU from scratch. + // ignore them. + fprintf(stderr, "genpname: can not initialize ICU. Status = %s\n", + u_errorName(status)); + exit(1); + } + genpname app; U_MAIN_INIT_ARGS(argc, argv); - return app.MMain(argc, argv); + int retVal = app.MMain(argc, argv); + u_cleanup(); + return retVal; } static UOption options[]={ @@ -963,14 +983,20 @@ NameToEnumEntry* genpname::createNameIndex(const AliasList& list, NameToEnumEntry(names[j], p.enumValue); } } - qsort((void*) nameIndex, nameIndexCount, sizeof(nameIndex[0]), - compareNameToEnumEntry); + + /* + * use a stable sort to ensure consistent results between + * genpname.cpp and the propname.cpp swapping code + */ + UErrorCode errorCode = U_ZERO_ERROR; + uprv_sortArray(nameIndex, nameIndexCount, sizeof(nameIndex[0]), + compareNameToEnumEntry, NULL, TRUE, &errorCode); if (debug>1) { - printf("Alias names: %d\n", nameIndexCount); + printf("Alias names: %d\n", (int)nameIndexCount); for (i=0; i<nameIndexCount; ++i) { printf("%s => %d\n", STRING_TABLE[nameIndex[i].nameIndex].str, - nameIndex[i].enumValue); + (int)nameIndex[i].enumValue); } printf("\n"); } @@ -1015,14 +1041,16 @@ EnumToNameGroupEntry* genpname::createEnumIndex(const AliasList& list) { const Alias& p = list[i]; enumIndex[i] = EnumToNameGroupEntry(p.enumValue, p.nameGroupIndex); } - qsort((void*) enumIndex, count, sizeof(enumIndex[0]), - compareEnumToNameGroupEntry); + + UErrorCode errorCode = U_ZERO_ERROR; + uprv_sortArray(enumIndex, count, sizeof(enumIndex[0]), + compareEnumToNameGroupEntry, NULL, FALSE, &errorCode); if (debug>1) { - printf("Property enums: %d\n", count); + printf("Property enums: %d\n", (int)count); for (i=0; i<count; ++i) { printf("%d => %d: ", - enumIndex[i].enumValue, - enumIndex[i].nameGroupIndex); + (int)enumIndex[i].enumValue, + (int)enumIndex[i].nameGroupIndex); UBool done = FALSE; for (j=enumIndex[i].nameGroupIndex; !done; ++j) { k = NAME_GROUP[j]; @@ -1040,9 +1068,17 @@ EnumToNameGroupEntry* genpname::createEnumIndex(const AliasList& list) { return enumIndex; } -int genpname::MMain(int argc, char* argv[]) { - +int genpname::MMain(int argc, char* argv[]) +{ int32_t i, j; + UErrorCode status = U_ZERO_ERROR; + + u_init(&status); + if (U_FAILURE(status) && status != U_FILE_ACCESS_ERROR) { + fprintf(stderr, "Error: u_init returned %s\n", u_errorName(status)); + status = U_ZERO_ERROR; + } + /* preset then read command line options */ options[3].value=u_getDataDirectory(); @@ -1061,7 +1097,7 @@ int genpname::MMain(int argc, char* argv[]) { debug < 0 || debug > 9) { fprintf(stderr, "usage: %s [-options]\n" - "\tcreate " U_ICUDATA_NAME "_" PNAME_DATA_NAME "." PNAME_DATA_TYPE "\n" + "\tcreate " PNAME_DATA_NAME "." PNAME_DATA_TYPE "\n" "options:\n" "\t-h or -? or --help this usage text\n" "\t-v or --verbose turn on verbose output\n" @@ -1077,35 +1113,22 @@ int genpname::MMain(int argc, char* argv[]) { verbose = options[4].doesOccur; // ------------------------------------------------------------ - // Sort the string table. This produces the proper sorting - // using the actual comparison function we will use. - qsort((void*) STRING_TABLE, STRING_COUNT, sizeof(STRING_TABLE[0]), - compareAliasNames); + // Do not sort the string table, instead keep it in data.h order. + // This simplifies data swapping and testing thereof because the string + // table itself need not be sorted during swapping. + // The NameToEnum sorter sorts each such map's string offsets instead. + if (debug>1) { - printf("String pool: %d\n", STRING_COUNT); - } - for (i=0; i<STRING_COUNT; ++i) { - REMAP[STRING_TABLE[i].index] = i; - if (debug>1) { - if (i != 0) printf(", "); - printf("%s (%d)", STRING_TABLE[i].str, STRING_TABLE[i].index); + printf("String pool: %d\n", (int)STRING_COUNT); + for (i=0; i<STRING_COUNT; ++i) { + if (i != 0) { + printf(", "); + } + printf("%s (%d)", STRING_TABLE[i].str, (int)STRING_TABLE[i].index); } - } - if (debug>1) { printf("\n\n"); } - // ------------------------------------------------------------ - // Fixup the NAME_GROUP indices so they match the sorted order - for (i=0; i<NAME_GROUP_COUNT; ++i) { - // keep negative entries (end markers) negative - if (NAME_GROUP[i] < 0) { - NAME_GROUP[i] = -REMAP[-NAME_GROUP[i]]; - } else { - NAME_GROUP[i] = REMAP[NAME_GROUP[i]]; - } - } - // ------------------------------------------------------------ // Create top-level property indices @@ -1132,8 +1155,9 @@ int genpname::MMain(int argc, char* argv[]) { ++j; } enumToValue_count = j; - qsort((void*) enumToValue, enumToValue_count, sizeof(enumToValue[0]), - compareEnumToValueEntry); + + uprv_sortArray(enumToValue, enumToValue_count, sizeof(enumToValue[0]), + compareEnumToValueEntry, NULL, FALSE, &status); // ------------------------------------------------------------ // Build PropertyAliases layout in memory @@ -1174,7 +1198,7 @@ int32_t genpname::writeDataFile(const char *destdir, const Builder& builder) { UNewDataMemory *pdata; UErrorCode status = U_ZERO_ERROR; - pdata = udata_create(destdir, PNAME_DATA_TYPE, U_ICUDATA_NAME "_" PNAME_DATA_NAME, &dataInfo, + pdata = udata_create(destdir, PNAME_DATA_TYPE, PNAME_DATA_NAME, &dataInfo, useCopyright ? U_COPYRIGHT_STRING : 0, &status); if (U_FAILURE(status)) { die("Unable to create data memory"); diff --git a/icuSources/tools/genpname/genpname.dsp b/icuSources/tools/genpname/genpname.dsp index 6bc10b51..1b38e485 100644 --- a/icuSources/tools/genpname/genpname.dsp +++ b/icuSources/tools/genpname/genpname.dsp @@ -115,7 +115,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\common" /I "..\..\i18n" /I "..\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\common" /I "..\..\i18n" /I "..\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -150,7 +150,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\common" /I "..\..\i18n" /I "..\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\common" /I "..\..\i18n" /I "..\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe diff --git a/icuSources/tools/genpname/genpname.vcproj b/icuSources/tools/genpname/genpname.vcproj index 08cc1c7f..5ec0debb 100644 --- a/icuSources/tools/genpname/genpname.vcproj +++ b/icuSources/tools/genpname/genpname.vcproj @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding = "Windows-1252"?> +<?xml version="1.0" encoding="Windows-1252"?> <VisualStudioProject ProjectType="Visual C++" - Version="7.00" + Version="7.10" Name="genpname" SccProjectName="" SccLocalPath=""> @@ -37,17 +37,14 @@ CompileAs="0"/> <Tool Name="VCCustomBuildTool" - CommandLine="copy $(TargetPath) ..\..\..\bin + CommandLine="copy "$(TargetPath)" ..\..\..\bin " - Outputs="..\..\..\bin\$(InputName).exe"/> + Outputs="..\..\..\bin\$(TargetFileName)"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icuuc.lib icutu.lib" OutputFile=".\Release/genpname.exe" LinkIncremental="1" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\toolutil\Release,..\..\..\lib" ProgramDatabaseFile=".\Release/genpname.pdb" SubSystem="1"/> <Tool @@ -65,8 +62,14 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> <Configuration Name="Debug|Win32" @@ -97,17 +100,14 @@ CompileAs="0"/> <Tool Name="VCCustomBuildTool" - CommandLine="copy $(TargetPath) ..\..\..\bin + CommandLine="copy "$(TargetPath)" ..\..\..\bin " - Outputs="..\..\..\bin\$(InputName).exe"/> + Outputs="..\..\..\bin\$(TargetFileName)"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icuucd.lib icutud.lib" OutputFile=".\Debug/genpname.exe" LinkIncremental="2" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\toolutil\Debug,..\..\..\lib" GenerateDebugInformation="TRUE" ProgramDatabaseFile=".\Debug/genpname.pdb" SubSystem="1"/> @@ -126,10 +126,18 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> </Configurations> + <References> + </References> <Files> <Filter Name="Source Files" @@ -141,6 +149,9 @@ <Filter Name="Header Files" Filter="h;hpp;hxx;hm;inl"> + <File + RelativePath=".\data.h"> + </File> </Filter> <Filter Name="Resource Files" diff --git a/icuSources/tools/genpname/preparse.pl b/icuSources/tools/genpname/preparse.pl index e7532ae3..5925d223 100644 --- a/icuSources/tools/genpname/preparse.pl +++ b/icuSources/tools/genpname/preparse.pl @@ -1,7 +1,7 @@ #!/bin/perl -w #******************************************************************* # COPYRIGHT: -# Copyright (c) 2002-2003, International Business Machines Corporation and +# Copyright (c) 2002-2004, International Business Machines Corporation and # others. All Rights Reserved. #******************************************************************* @@ -53,7 +53,7 @@ use FileHandle; use strict; use Dumpvalue; -my $DEBUG = 0; +my $DEBUG = 1; my $DUMPER = new Dumpvalue; my $count = @ARGV; @@ -94,10 +94,6 @@ my %UNSUPPORTED = (Composition_Exclusion => 1, Expands_On_NFKD => 1, FC_NFKC_Closure => 1, ID_Start_Exceptions => 1, - NFC_Quick_Check => 1, - NFD_Quick_Check => 1, - NFKC_Quick_Check => 1, - NFKD_Quick_Check => 1, Special_Case_Condition => 1, ); @@ -298,7 +294,7 @@ END $i = $groupToInt{$groupString}; } else { my @names = split(/\|/, $groupString); - die "Error: Wrong number of names in " . $groupString if (@names != 2); + die "Error: Wrong number of names in " . $groupString if (@names < 2); $i = @nameGroups; # index of group we are making $groupToInt{$groupString} = $i; # Cache for reuse push @nameGroups, map { $stringToID{$_} } @names; @@ -314,6 +310,7 @@ END print "int32_t NAME_GROUP[] = {\n"; # emit one group per line, with annotations + my $max_names = 0; for (my $i=0; $i<@nameGroups; ) { my @a; my $line; @@ -329,12 +326,14 @@ END ' 'x(20-length($line)), "/* ", sprintf("%3d", $start), ": \"", join("\", \"", map { $strings[$_] } @a), "\" */\n"; + $max_names = @a if(@a > $max_names); + } print "};\n\n"; # This is fixed for 3.2 at "2" but should be calculated dynamically # when more than 2 names appear in Property[Value]Aliases.txt. - print "#define MAX_NAMES_PER_GROUP 2\n\n"; + print "#define MAX_NAMES_PER_GROUP $max_names\n\n"; #------------------------------------------------------------ # Emit enumerated property values @@ -689,11 +688,14 @@ sub merge_PropertyValueAliases { } # Merge the combining class values in manually + # Add the same values to the synthetic lccc and tccc properties die "Error: No ccc data" unless exists $va->{'ccc'}; for my $ccc (keys %{$va->{'ccc'}}) { die "Error: Can't overwrite ccc $ccc" if (exists $h->{'ccc'}->{$ccc}); + $h->{'lccc'}->{$ccc} = + $h->{'tccc'}->{$ccc} = $h->{'ccc'}->{$ccc} = $va->{'ccc'}->{$ccc}; } delete $va->{'ccc'}; @@ -1196,6 +1198,25 @@ sub read_uchar { $in->close(); + # hardcode known values for the normalization quick check properties + # see unorm.h for the UNormalizationCheckResult enum + + addDatum($hash, 'NFC_QC', 'UNORM_NO', 'N'); + addDatum($hash, 'NFC_QC', 'UNORM_YES', 'Y'); + addDatum($hash, 'NFC_QC', 'UNORM_MAYBE', 'M'); + + addDatum($hash, 'NFKC_QC', 'UNORM_NO', 'N'); + addDatum($hash, 'NFKC_QC', 'UNORM_YES', 'Y'); + addDatum($hash, 'NFKC_QC', 'UNORM_MAYBE', 'M'); + + # no "maybe" values for NF[K]D + + addDatum($hash, 'NFD_QC', 'UNORM_NO', 'N'); + addDatum($hash, 'NFD_QC', 'UNORM_YES', 'Y'); + + addDatum($hash, 'NFKD_QC', 'UNORM_NO', 'N'); + addDatum($hash, 'NFKD_QC', 'UNORM_YES', 'Y'); + $hash; } diff --git a/icuSources/tools/genprops/Makefile.in b/icuSources/tools/genprops/Makefile.in index 1a0a4a38..2f63f60e 100644 --- a/icuSources/tools/genprops/Makefile.in +++ b/icuSources/tools/genprops/Makefile.in @@ -1,5 +1,5 @@ ## Makefile.in for ICU - tools/genprops -## Copyright (c) 1999-2003, International Business Machines Corporation and +## Copyright (c) 1999-2004, International Business Machines Corporation and ## others. All Rights Reserved. ## Steven R. Loomis @@ -13,33 +13,32 @@ include $(top_builddir)/icudefs.mk ## +TARGET_STUB_NAME = genprops + SECTION = 8 -MAN_FILES = $(TARGET:$(EXEEXT)=).$(SECTION) +MAN_FILES = $(TARGET_STUB_NAME).$(SECTION) ## Build directory information subdir = tools/genprops -ICUDATADIR=$(top_builddir)/data -UNICODEDATADIR=$(top_srcdir)/../data/unidata - ## Extra files to remove for 'make clean' -CLEANFILES = *~ $(DEPS) $(RES_FILES) $(TEST_FILES) $(MAN_FILES) +CLEANFILES = *~ $(DEPS) $(MAN_FILES) ## Target information -TARGET = genprops$(EXEEXT) +TARGET = $(BINDIR)/$(TARGET_STUB_NAME)$(EXEEXT) CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common -I$(srcdir)/../toolutil LIBS = $(LIBICUTOOLUTIL) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M) -OBJECTS = genprops.o props2.o propsvec.o store.o +OBJECTS = genprops.o props2.o store.o DEPS = $(OBJECTS:.o=.d) ## List of phony targets .PHONY : all all-local install install-local clean clean-local \ distclean distclean-local dist dist-local check \ -check-local build-data install-man +check-local install-man ## Clear suffix list .SUFFIXES : @@ -52,11 +51,11 @@ distclean : distclean-local dist: dist-local check: all check-local -all-local: $(TARGET) build-data $(MAN_FILES) +all-local: $(TARGET) $(MAN_FILES) install-local: all-local install-man $(MKINSTALLDIRS) $(DESTDIR)$(sbindir) - $(INSTALL) $(TARGET) $(DESTDIR)$(sbindir)/$(TARGET) + $(INSTALL) $(TARGET) $(DESTDIR)$(sbindir) # man page install-man: $(MAN_FILES) diff --git a/icuSources/tools/genprops/genprops.c b/icuSources/tools/genprops/genprops.c index 95091d52..3c09e197 100644 --- a/icuSources/tools/genprops/genprops.c +++ b/icuSources/tools/genprops/genprops.c @@ -26,6 +26,7 @@ #include "unicode/uchar.h" #include "unicode/uset.h" #include "unicode/putil.h" +#include "unicode/uclean.h" #include "cmemory.h" #include "cstring.h" #include "unewdata.h" @@ -66,6 +67,20 @@ parseDB(const char *filename, UErrorCode *pErrorCode); /* -------------------------------------------------------------------------- */ + +enum +{ + HELP_H, + HELP_QUESTION_MARK, + VERBOSE, + COPYRIGHT, + DESTDIR, + SOURCEDIR, + UNICODE_VERSION, + ICUDATADIR +}; + +/* Keep these values in sync with the above enums */ static UOption options[]={ UOPTION_HELP_H, UOPTION_HELP_QUESTION_MARK, @@ -73,7 +88,8 @@ static UOption options[]={ UOPTION_COPYRIGHT, UOPTION_DESTDIR, UOPTION_SOURCEDIR, - { "unicode", NULL, NULL, NULL, 'u', UOPT_REQUIRES_ARG, 0 } + { "unicode", NULL, NULL, NULL, 'u', UOPT_REQUIRES_ARG, 0 }, + UOPTION_ICUDATADIR }; extern int @@ -86,9 +102,10 @@ main(int argc, char* argv[]) { U_MAIN_INIT_ARGS(argc, argv); /* preset then read command line options */ - options[4].value=u_getDataDirectory(); - options[5].value=""; - options[6].value=""; + options[DESTDIR].value=u_getDataDirectory(); + options[SOURCEDIR].value=""; + options[UNICODE_VERSION].value=""; + options[ICUDATADIR].value=u_getDataDirectory(); argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), options); /* error handling, printing usage message */ @@ -97,7 +114,7 @@ main(int argc, char* argv[]) { "error in command line argument \"%s\"\n", argv[-argc]); } - if(argc<0 || options[0].doesOccur || options[1].doesOccur) { + if(argc<0 || options[HELP_H].doesOccur || options[HELP_QUESTION_MARK].doesOccur) { /* * Broken into chucks because the C89 standard says the minimum * required supported string length is 509 bytes. @@ -118,17 +135,20 @@ main(int argc, char* argv[]) { fprintf(stderr, "\t-d or --destdir destination directory, followed by the path\n" "\t-s or --sourcedir source directory, followed by the path\n" + "\t-i or --icudatadir directory for locating any needed intermediate data files,\n" + "\t followed by path, defaults to %s\n" "\tsuffix suffix that is to be appended with a '-'\n" "\t to the source file basenames before opening;\n" - "\t 'genprops new' will read UnicodeData-new.txt etc.\n"); + "\t 'genprops new' will read UnicodeData-new.txt etc.\n", + u_getDataDirectory()); return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR; } /* get the options values */ - beVerbose=options[2].doesOccur; - haveCopyright=options[3].doesOccur; - srcDir=options[5].value; - destDir=options[4].value; + beVerbose=options[VERBOSE].doesOccur; + haveCopyright=options[COPYRIGHT].doesOccur; + srcDir=options[SOURCEDIR].value; + destDir=options[DESTDIR].value; if(argc>=2) { suffix=argv[1]; @@ -136,11 +156,15 @@ main(int argc, char* argv[]) { suffix=NULL; } - if(options[6].doesOccur) { - setUnicodeVersion(options[6].value); + if(options[UNICODE_VERSION].doesOccur) { + setUnicodeVersion(options[UNICODE_VERSION].value); } /* else use the default dataVersion in store.c */ + if (options[ICUDATADIR].doesOccur) { + u_setDataDirectory(options[ICUDATADIR].value); + } + /* prepare the filename beginning with the source dir */ uprv_strcpy(filename, srcDir); basename=filename+uprv_strlen(filename); @@ -178,17 +202,18 @@ main(int argc, char* argv[]) { generateData(destDir); } + u_cleanup(); return errorCode; } U_CFUNC void writeUCDFilename(char *basename, const char *filename, const char *suffix) { - int32_t length=uprv_strlen(filename); + int32_t length=(int32_t)uprv_strlen(filename); uprv_strcpy(basename, filename); if(suffix!=NULL) { basename[length++]='-'; uprv_strcpy(basename+length, suffix); - length+=uprv_strlen(suffix); + length+=(int32_t)uprv_strlen(suffix); } uprv_strcpy(basename+length, ".txt"); } @@ -1031,3 +1056,4 @@ parseDB(const char *filename, UErrorCode *pErrorCode) { * End: * */ + diff --git a/icuSources/tools/genprops/genprops.dsp b/icuSources/tools/genprops/genprops.dsp index f7e8576a..c987e0a7 100644 --- a/icuSources/tools/genprops/genprops.dsp +++ b/icuSources/tools/genprops/genprops.dsp @@ -115,7 +115,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\toolutil" /I "..\..\common" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\toolutil" /I "..\..\common" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -150,7 +150,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\toolutil" /I "..\..\common" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\toolutil" /I "..\..\common" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe @@ -178,41 +178,21 @@ SOURCE="$(InputPath)" # Name "genprops - Win32 Debug" # Name "genprops - Win64 Release" # Name "genprops - Win64 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=.\genprops.c # End Source File # Begin Source File -SOURCE=.\props2.c +SOURCE=.\genprops.h # End Source File # Begin Source File -SOURCE=.\propsvec.c +SOURCE=.\props2.c # End Source File # Begin Source File SOURCE=.\store.c # End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\genprops.h -# End Source File -# Begin Source File - -SOURCE=.\propsvec.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group # End Target # End Project diff --git a/icuSources/tools/genprops/genprops.h b/icuSources/tools/genprops/genprops.h index 7827897e..0afaa7f9 100644 --- a/icuSources/tools/genprops/genprops.h +++ b/icuSources/tools/genprops/genprops.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -89,7 +89,7 @@ getProps(uint32_t c); extern void repeatProps(uint32_t first, uint32_t last, uint32_t props); -U_CAPI uint32_t U_EXPORT2 +U_CFUNC uint32_t U_EXPORT2 getFoldedPropsValue(UNewTrie *trie, UChar32 start, int32_t offset); extern void diff --git a/icuSources/tools/genprops/genprops.vcproj b/icuSources/tools/genprops/genprops.vcproj index 382d9a86..92332816 100644 --- a/icuSources/tools/genprops/genprops.vcproj +++ b/icuSources/tools/genprops/genprops.vcproj @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding = "Windows-1252"?> +<?xml version="1.0" encoding="Windows-1252"?> <VisualStudioProject ProjectType="Visual C++" - Version="7.00" + Version="7.10" Name="genprops" SccProjectName="" SccLocalPath=""> @@ -37,17 +37,14 @@ CompileAs="0"/> <Tool Name="VCCustomBuildTool" - CommandLine="copy $(TargetPath) ..\..\..\bin + CommandLine="copy "$(TargetPath)" ..\..\..\bin " - Outputs="..\..\..\bin\$(InputName).exe"/> + Outputs="..\..\..\bin\$(TargetFileName)"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icuuc.lib icutu.lib" OutputFile=".\Release/genprops.exe" LinkIncremental="1" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\toolutil\Release,..\..\..\lib\Release,..\..\..\lib" ProgramDatabaseFile=".\Release/genprops.pdb" SubSystem="1"/> <Tool @@ -65,8 +62,14 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> <Configuration Name="Debug|Win32" @@ -97,17 +100,14 @@ CompileAs="0"/> <Tool Name="VCCustomBuildTool" - CommandLine="copy $(TargetPath) ..\..\..\bin + CommandLine="copy "$(TargetPath)" ..\..\..\bin " - Outputs="..\..\..\bin\$(InputName).exe"/> + Outputs="..\..\..\bin\$(TargetFileName)"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icuucd.lib icutud.lib" OutputFile=".\Debug/genprops.exe" LinkIncremental="2" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\toolutil\Debug,..\..\..\lib\Debug,..\..\..\lib" GenerateDebugInformation="TRUE" ProgramDatabaseFile=".\Debug/genprops.pdb" SubSystem="1"/> @@ -126,36 +126,38 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> </Configurations> + <References> + </References> <Files> <Filter Name="Source Files" - Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"> + Filter="c;cpp;rc"> <File RelativePath=".\genprops.c"> </File> <File RelativePath=".\props2.c"> </File> - <File - RelativePath=".\propsvec.c"> - </File> <File RelativePath=".\store.c"> </File> </Filter> <Filter Name="Header Files" - Filter="h;hpp;hxx;hm;inl"> + Filter="h"> <File RelativePath=".\genprops.h"> </File> - <File - RelativePath=".\propsvec.h"> - </File> </Filter> <Filter Name="Resource Files" diff --git a/icuSources/tools/genprops/props2.c b/icuSources/tools/genprops/props2.c index 8dc53441..331f821f 100644 --- a/icuSources/tools/genprops/props2.c +++ b/icuSources/tools/genprops/props2.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2002-2003, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -199,7 +199,7 @@ singleEnumLineFn(void *context, uv=(uint32_t)(value<<sen->vecShift); if((uv&sen->vecMask)!=uv) { fprintf(stderr, "genprops error: %s value overflow (0x%x) at %s\n", - sen->propName, uv, s); + sen->propName, (int)uv, s); exit(U_INTERNAL_PROGRAM_ERROR); } @@ -265,7 +265,11 @@ propListNames[]={ { "Unified_Ideograph", 1, UPROPS_UNIFIED_IDEOGRAPH }, { "Deprecated", 1, UPROPS_DEPRECATED }, { "Soft_Dotted", 1, UPROPS_SOFT_DOTTED }, - { "Logical_Order_Exception", 1, UPROPS_LOGICAL_ORDER_EXCEPTION } + { "Logical_Order_Exception", 1, UPROPS_LOGICAL_ORDER_EXCEPTION }, + + /* new properties in Unicode 4.0.1 */ + { "STerm", 2, UPROPS_V2_S_TERM }, + { "Variation_Selector", 2, UPROPS_V2_VARIATION_SELECTOR } }; static const Binaries @@ -346,7 +350,7 @@ binariesLineFn(void *context, if(bin->binaries[i].vecShift>=32) { fprintf(stderr, "genprops error: shift value %d>=32 for %s %s\n", - bin->binaries[i].vecShift, bin->ucdFile, bin->binaries[i].propName); + (int)bin->binaries[i].vecShift, bin->ucdFile, bin->binaries[i].propName); exit(U_INTERNAL_PROGRAM_ERROR); } uv=U_MASK(bin->binaries[i].vecShift); @@ -399,7 +403,7 @@ generateAdditionalProperties(char *filename, const char *suffix, UErrorCode *pEr /* process various UCD .txt files */ /* add Han numeric types & values */ - parseMultiFieldFile(filename, basename, "DerivedNumericValues", suffix, 3, numericLineFn, pErrorCode); + parseMultiFieldFile(filename, basename, "DerivedNumericValues", suffix, 2, numericLineFn, pErrorCode); /* set proper bidi class for unassigned code points (Cn) */ parseTwoFieldFile(filename, basename, "DerivedBidiClass", suffix, bidiClassLineFn, pErrorCode); @@ -470,7 +474,7 @@ generateAdditionalProperties(char *filename, const char *suffix, UErrorCode *pEr /* parse EastAsianWidth.txt */ parseSingleEnumFile(filename, basename, suffix, &eawSingleEnum, pErrorCode); - trie=utrie_open(NULL, NULL, 50000, 0, TRUE); + trie=utrie_open(NULL, NULL, 50000, 0, 0, TRUE); if(trie==NULL) { *pErrorCode=U_MEMORY_ALLOCATION_ERROR; upvec_close(pv); @@ -537,7 +541,7 @@ numericLineFn(void *context, Props newProps; char *s, *end; uint32_t start, limit, value, oldProps32; - int32_t type, oldType; + int32_t oldType; char c; UBool isFraction; @@ -586,26 +590,22 @@ numericLineFn(void *context, } } - /* parse numeric type */ - s=trimTerminateField(fields[2][0], fields[2][1]); - type=u_getPropertyValueEnum(UCHAR_NUMERIC_TYPE, s); - if(type<=0) { - fprintf(stderr, "genprops error: unknown numeric type in DerivedNumericValues.txt field 1 at %s\n", s); - exit(U_PARSE_ERROR); - } + /* + * Unicode 4.0.1 removes the third column that used to list the numeric type. + * Assume that either the data is the same as in UnicodeData.txt, + * or else that the numeric type is "numeric". + * This should work because we only expect to add numeric values for + * Han characters; for those, UnicodeData.txt lists only ranges without + * specific properties for single characters. + */ for(; start<limit; ++start) { oldProps32=getProps(start); oldType=(int32_t)GET_NUMERIC_TYPE(oldProps32); - if(oldType==type) { + if(oldType!=0) { /* this code point was already listed with its numeric value in UnicodeData.txt */ continue; } - if(oldType!=0) { - /* the numeric type differs from what we got from UnicodeData.txt */ - fprintf(stderr, "genprops error: new numeric value for an already numeric character in DerivedNumericValues.txt at %s\n", fields[0][0]); - exit(U_PARSE_ERROR); - } /* * Do not set a numeric value for code points that have other @@ -630,7 +630,7 @@ numericLineFn(void *context, } if(beVerbose) { - printf("adding U+%04x numeric type %d value %u\n", start, type, value); + printf("adding U+%04x numeric type %d value %u\n", (int)start, U_NT_NUMERIC, (int)value); } /* reconstruct the properties and set the new numeric type and value */ @@ -639,8 +639,8 @@ numericLineFn(void *context, newProps.generalCategory=(uint8_t)GET_CATEGORY(oldProps32); newProps.bidi=(uint8_t)GET_BIDI_CLASS(oldProps32); newProps.isMirrored=(uint8_t)(oldProps32&(1UL<<UPROPS_MIRROR_SHIFT) ? TRUE : FALSE); - newProps.numericType=(uint8_t)type; /* newly parsed numeric type */ - newProps.numericValue=(int32_t)value; /* newly parsed numeric value */ + newProps.numericType=(uint8_t)U_NT_NUMERIC; /* assumed numeric type, see Unicode 4.0.1 comment */ + newProps.numericValue=(int32_t)value; /* newly parsed numeric value */ addProps(start, makeProps(&newProps)); } } @@ -666,7 +666,7 @@ bidiClassLineFn(void *context, /* parse bidi class */ s=trimTerminateField(fields[1][0], fields[1][1]); value=u_getPropertyValueEnum(UCHAR_BIDI_CLASS, s); - if(value<0) { + if((int32_t)value<0) { fprintf(stderr, "genprops error: unknown bidi class in DerivedBidiClass.txt field 1 at %s\n", s); exit(U_PARSE_ERROR); } @@ -700,7 +700,7 @@ bidiClassLineFn(void *context, } if(didSet && beVerbose) { - printf("setting U+%04x..U+%04x bidi class %d\n", oldStart, limit-1, value); + printf("setting U+%04x..U+%04x bidi class %d\n", (int)oldStart, (int)limit-1, (int)value); } } @@ -721,7 +721,7 @@ writeAdditionalData(uint8_t *p, int32_t capacity, int32_t indexes[UPROPS_INDEX_C p+=length; capacity-=length; if(beVerbose) { - printf("size in bytes of additional props trie:%5u\n", length); + printf("size in bytes of additional props trie:%5u\n", (int)length); } /* set indexes */ @@ -745,7 +745,7 @@ writeAdditionalData(uint8_t *p, int32_t capacity, int32_t indexes[UPROPS_INDEX_C if(p!=NULL && (pvCount*4)<=capacity) { uprv_memcpy(p, pv, pvCount*4); if(beVerbose) { - printf("number of additional props vectors: %5u\n", pvCount/UPROPS_VECTOR_WORDS); + printf("number of additional props vectors: %5u\n", (int)pvCount/UPROPS_VECTOR_WORDS); printf("number of 32-bit words per vector: %5u\n", UPROPS_VECTOR_WORDS); } } diff --git a/icuSources/tools/genprops/store.c b/icuSources/tools/genprops/store.c index 949deedd..d3368efb 100644 --- a/icuSources/tools/genprops/store.c +++ b/icuSources/tools/genprops/store.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -291,12 +291,12 @@ static UDataInfo dataInfo={ { 0x55, 0x50, 0x72, 0x6f }, /* dataFormat="UPro" */ { 3, 2, UTRIE_SHIFT, UTRIE_INDEX_SHIFT }, /* formatVersion */ - { 4, 0, 0, 0 } /* dataVersion */ + { 4, 0, 1, 0 } /* dataVersion */ }; /* definitions of expected data size limits */ enum { - MAX_PROPS_COUNT=25000, + MAX_PROPS_COUNT=26000, MAX_UCHAR_COUNT=10000 }; @@ -341,7 +341,7 @@ setUnicodeVersion(const char *v) { extern void initStore() { - pTrie=utrie_open(NULL, NULL, MAX_PROPS_COUNT, 0, TRUE); + pTrie=utrie_open(NULL, NULL, MAX_PROPS_COUNT, 0, 0, TRUE); if(pTrie==NULL) { fprintf(stderr, "error: unable to create a UNewTrie\n"); exit(U_MEMORY_ALLOCATION_ERROR); @@ -458,9 +458,10 @@ makeProps(Props *p) { */ } else if(value<UPROPS_MIN_VALUE || UPROPS_MAX_VALUE<value) { printf("*** U+%04x needs an exception because its value is out-of-bounds at %ld (not [%ld..%ld]\n", - p->code, (long)value, (long)UPROPS_MIN_VALUE, (long)UPROPS_MAX_VALUE); + (int)p->code, (long)value, (long)UPROPS_MIN_VALUE, (long)UPROPS_MAX_VALUE); } else { - printf("*** U+%04x needs an exception because it has %u values\n", p->code, count); + printf("*** U+%04x needs an exception because it has %u values\n", + (int)p->code, count); } } @@ -471,7 +472,7 @@ makeProps(Props *p) { value=exceptionsTop; if(value>=UPROPS_MAX_EXCEPTIONS_COUNT) { fprintf(stderr, "genprops: out of exceptions memory at U+%06x. (%d exceeds allocated space)\n", - p->code, value); + (int)p->code, (int)value); exit(U_MEMORY_ALLOCATION_ERROR); } else { uint32_t first=0; @@ -707,7 +708,8 @@ compactProps(void) { /* we saved some space */ if(beVerbose) { - printf("compactProps() reduced propsTop from %u to %u\n", propsTop, newIndex); + printf("compactProps() reduced propsTop from %u to %u\n", + (int)propsTop, (int)newIndex); } propsTop=newIndex; @@ -738,7 +740,7 @@ compareProps(const void *l, const void *r) { /* generate output data ----------------------------------------------------- */ /* folding value: just store the offset (16 bits) if there is any non-0 entry */ -U_CAPI uint32_t U_EXPORT2 +U_CFUNC uint32_t U_EXPORT2 getFoldedPropsValue(UNewTrie *trie, UChar32 start, int32_t offset) { uint32_t value; UChar32 limit; @@ -802,11 +804,11 @@ generateData(const char *dataDir) { indexes[UPROPS_ADDITIONAL_TRIE_INDEX]=offset; if(beVerbose) { - printf("trie size in bytes: %5u\n", trieSize); - printf("number of unique properties values: %5u\n", propsTop); + printf("trie size in bytes: %5u\n", (int)trieSize); + printf("number of unique properties values: %5u\n", (int)propsTop); printf("number of code points with exceptions: %5u\n", exceptionsCount); printf("size in bytes of exceptions: %5u\n", 4*exceptionsTop); - printf("number of UChars for special mappings: %5u\n", ucharsTop); + printf("number of UChars for special mappings: %5u\n", (int)ucharsTop); } additionalPropsSize=writeAdditionalData(additionalProps, sizeof(additionalProps), indexes); @@ -817,7 +819,7 @@ generateData(const char *dataDir) { } /* write the data */ - pData=udata_create(dataDir, DATA_TYPE, U_ICUDATA_NAME "_" DATA_NAME, &dataInfo, + pData=udata_create(dataDir, DATA_TYPE, DATA_NAME, &dataInfo, haveCopyright ? U_COPYRIGHT_STRING : NULL, &errorCode); if(U_FAILURE(errorCode)) { fprintf(stderr, "genprops: unable to create data memory, %s\n", u_errorName(errorCode)); diff --git a/icuSources/tools/genrb/Makefile.in b/icuSources/tools/genrb/Makefile.in index eb3d56fe..e43634ac 100644 --- a/icuSources/tools/genrb/Makefile.in +++ b/icuSources/tools/genrb/Makefile.in @@ -1,5 +1,5 @@ ## Makefile.in for ICU - tools/genrb -## Copyright (c) 1999-2003, International Business Machines Corporation and +## Copyright (c) 1999-2004, International Business Machines Corporation and ## others. All Rights Reserved. ## Source directory information @@ -12,25 +12,28 @@ include $(top_builddir)/icudefs.mk ## +TARGET_STUB_NAME = genrb +DERB_STUB_NAME = derb + SECTION = 1 -MAN_FILES = $(TARGET:$(EXEEXT)=).$(SECTION) $(DERB:$(EXEEXT)=).$(SECTION) +MAN_FILES = $(TARGET_STUB_NAME).$(SECTION) $(DERB_STUB_NAME).$(SECTION) ## Build directory information subdir = tools/genrb ## Extra files to remove for 'make clean' -CLEANFILES = *~ $(MAN_FILES) $(DEPS) +CLEANFILES = *~ $(MAN_FILES) $(DEPS) $(DERB_DEPS) ## Target information -TARGET = genrb$(EXEEXT) -DERB = derb$(EXEEXT) +TARGET = $(BINDIR)/$(TARGET_STUB_NAME)$(EXEEXT) +DERB = $(BINDIR)/$(DERB_STUB_NAME)$(EXEEXT) CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common -I$(top_srcdir)/i18n -I$(srcdir)/../toolutil LIBS = $(LIBICUI18N) $(LIBICUTOOLUTIL) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M) OBJECTS = errmsg.o genrb.o parse.o read.o reslist.o ustr.o util.o \ -wrtjava.o rle.o wrtxml.o +wrtjava.o rle.o wrtxml.o prscmnts.o DERB_OBJ = derb.o DEPS = $(OBJECTS:.o=.d) @@ -59,7 +62,7 @@ install-local: all-local install-man $(INSTALL) $(TARGET) $(DESTDIR)$(bindir) $(INSTALL) $(DERB) $(DESTDIR)$(bindir) -<dist-local: +dist-local: clean-local: test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES) @@ -75,7 +78,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status $(TARGET) : $(OBJECTS) - $(LINK.c) $(OUTOPT)$@ $^ $(LIBS) + $(LINK.cc) $(OUTOPT)$@ $^ $(LIBS) $(DERB) : $(DERB_OBJ) $(LINK.c) $(OUTOPT)$@ $^ $(LIBS) @@ -86,7 +89,10 @@ $(DERB) : $(DERB_OBJ) # man page install-man: $(MAN_FILES) $(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man$(SECTION) - $(INSTALL_DATA) $< $(DESTDIR)$(mandir)/man$(SECTION) + $(INSTALL_DATA) $? $(DESTDIR)$(mandir)/man$(SECTION) + +# This line is needed to serialize builds when the gmake -j option is used. +$(TARGET_STUB_NAME).$(SECTION): $(DERB_STUB_NAME).$(SECTION) %.$(SECTION): $(srcdir)/%.$(SECTION).in cd $(top_builddir) \ diff --git a/icuSources/tools/genrb/derb.c b/icuSources/tools/genrb/derb.c index 17d8f331..9ea70ea0 100644 --- a/icuSources/tools/genrb/derb.c +++ b/icuSources/tools/genrb/derb.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -17,6 +17,7 @@ #include "unicode/ucnv.h" #include "unicode/ustring.h" +#include "unicode/putil.h" #include "uresimp.h" #include "cmemory.h" @@ -29,8 +30,7 @@ #include <stdio.h> #include <ctype.h> -#ifdef WIN32 -#include <direct.h> +#if defined(WIN32) || defined(U_CYGWIN) #include <io.h> #include <fcntl.h> #endif @@ -273,9 +273,9 @@ main(int argc, char* argv[]) { if (tostdout) { out = stdout; -#ifdef WIN32 +#if defined(WIN32) || defined(U_CYGWIN) if (_setmode(_fileno(out), _O_BINARY) == -1) { - fprintf(stderr, "%s: couldn't set standard output to binary mode\n, pname"); + fprintf(stderr, "%s: couldn't set standard output to binary mode\n", pname); return 4; } #endif @@ -328,7 +328,7 @@ main(int argc, char* argv[]) { if (locale) { printCString(out, converter, locale, -1); } else { - printCString(out, converter, filename, ext - filename); + printCString(out, converter, filename, (int32_t)(ext - filename)); printString(out, converter, sp, (int32_t)(sizeof(sp)/sizeof(*sp))); } printOutBundle(out, converter, bundle, 0, pname, &status); @@ -422,7 +422,7 @@ static void printCString(FILE *out, UConverter *converter, const char *str, int3 ucnv_toUnicode(defaultConverter, &bufp, bufend, &str, strEnd, 0, 0, &err); *bufp = 0; - printString(out, converter, buf, bufp - buf); + printString(out, converter, buf, (int32_t)(bufp - buf)); } while (str < strEnd); } @@ -508,15 +508,15 @@ static void printOutAlias(FILE *out, UConverter *converter, UResourceBundle *pa len = truncsize; } if(U_SUCCESS(*status)) { - static const UChar open[] = { 0x003A, 0x0061, 0x006C, 0x0069, 0x0061, 0x0073, 0x0020, 0x007B, 0x0020, 0x0022 }; /* ":alias { \"" */ - static const UChar close[] = { 0x0022, 0x0020, 0x007D, 0x0020 }; /* "\" } " */ + static const UChar openStr[] = { 0x003A, 0x0061, 0x006C, 0x0069, 0x0061, 0x0073, 0x0020, 0x007B, 0x0020, 0x0022 }; /* ":alias { \"" */ + static const UChar closeStr[] = { 0x0022, 0x0020, 0x007D, 0x0020 }; /* "\" } " */ printIndent(out, converter, indent); if(key != NULL) { printCString(out, converter, key, -1); } - printString(out, converter, open, (int32_t)(sizeof(open) / sizeof(*open))); + printString(out, converter, openStr, (int32_t)(sizeof(openStr) / sizeof(*openStr))); printString(out, converter, string, len); - printString(out, converter, close, (int32_t)(sizeof(close) / sizeof(*close))); + printString(out, converter, closeStr, (int32_t)(sizeof(closeStr) / sizeof(*closeStr))); if(verbose) { printCString(out, converter, " // ALIAS", -1); } @@ -552,19 +552,19 @@ static void printOutBundle(FILE *out, UConverter *converter, UResourceBundle *re } printIndent(out, converter, indent); if(key != NULL) { - static const UChar open[] = { 0x0020, 0x007B, 0x0020, 0x0022 }; /* " { \"" */ - static const UChar close[] = { 0x0022, 0x0020, 0x007D }; /* "\" }" */ + static const UChar openStr[] = { 0x0020, 0x007B, 0x0020, 0x0022 }; /* " { \"" */ + static const UChar closeStr[] = { 0x0022, 0x0020, 0x007D }; /* "\" }" */ printCString(out, converter, key, (int32_t)uprv_strlen(key)); - printString(out, converter, open, (int32_t)(sizeof(open)/sizeof(*open))); + printString(out, converter, openStr, (int32_t)(sizeof(openStr)/sizeof(*openStr))); printString(out, converter, string, len); - printString(out, converter, close, (int32_t)(sizeof(close) / sizeof(*close))); + printString(out, converter, closeStr, (int32_t)(sizeof(closeStr) / sizeof(*closeStr))); } else { - static const UChar open[] = { 0x0022 }; /* "\"" */ - static const UChar close[] = { 0x0022, 0x002C }; /* "\"," */ + static const UChar openStr[] = { 0x0022 }; /* "\"" */ + static const UChar closeStr[] = { 0x0022, 0x002C }; /* "\"," */ - printString(out, converter, open, (int32_t)(sizeof(open) / sizeof(*open))); + printString(out, converter, openStr, (int32_t)(sizeof(openStr) / sizeof(*openStr))); printString(out, converter, string, (int32_t)(u_strlen(string))); - printString(out, converter, close, (int32_t)(sizeof(close) / sizeof(*close))); + printString(out, converter, closeStr, (int32_t)(sizeof(closeStr) / sizeof(*closeStr))); } if(verbose) { @@ -578,18 +578,18 @@ static void printOutBundle(FILE *out, UConverter *converter, UResourceBundle *re case RES_INT : { - static const UChar open[] = { 0x003A, 0x0069, 0x006E, 0x0074, 0x0020, 0x007B, 0x0020 }; /* ":int { " */ - static const UChar close[] = { 0x0020, 0x007D }; /* " }" */ + static const UChar openStr[] = { 0x003A, 0x0069, 0x006E, 0x0074, 0x0020, 0x007B, 0x0020 }; /* ":int { " */ + static const UChar closeStr[] = { 0x0020, 0x007D }; /* " }" */ UChar num[20]; printIndent(out, converter, indent); if(key != NULL) { printCString(out, converter, key, -1); } - printString(out, converter, open, (int32_t)(sizeof(open) / sizeof(*open))); + printString(out, converter, openStr, (int32_t)(sizeof(openStr) / sizeof(*openStr))); uprv_itou(num, 20, ures_getInt(resource, status), 10, 0); printString(out, converter, num, u_strlen(num)); - printString(out, converter, close, (int32_t)(sizeof(close) / sizeof(*close))); + printString(out, converter, closeStr, (int32_t)(sizeof(closeStr) / sizeof(*closeStr))); if(verbose) { printCString(out, converter, "// INT", -1); @@ -610,17 +610,17 @@ static void printOutBundle(FILE *out, UConverter *converter, UResourceBundle *re len = truncsize; } if(U_SUCCESS(*status)) { - static const UChar open[] = { 0x003A, 0x0062, 0x0069, 0x006E, 0x0061, 0x0072, 0x0079, 0x0020, 0x007B, 0x0020 }; /* ":binary { " */ - static const UChar close[] = { 0x0020, 0x007D, 0x0020 }; /* " } " */ + static const UChar openStr[] = { 0x003A, 0x0062, 0x0069, 0x006E, 0x0061, 0x0072, 0x0079, 0x0020, 0x007B, 0x0020 }; /* ":binary { " */ + static const UChar closeStr[] = { 0x0020, 0x007D, 0x0020 }; /* " } " */ printIndent(out, converter, indent); if(key != NULL) { printCString(out, converter, key, -1); } - printString(out, converter, open, (int32_t)(sizeof(open) / sizeof(*open))); + printString(out, converter, openStr, (int32_t)(sizeof(openStr) / sizeof(*openStr))); for(i = 0; i<len; i++) { printHex(out, converter, *data++); } - printString(out, converter, close, (int32_t)(sizeof(close) / sizeof(*close))); + printString(out, converter, closeStr, (int32_t)(sizeof(closeStr) / sizeof(*closeStr))); if(verbose) { printCString(out, converter, " // BINARY", -1); } @@ -635,15 +635,15 @@ static void printOutBundle(FILE *out, UConverter *converter, UResourceBundle *re int32_t len = 0; const int32_t *data = ures_getIntVector(resource, &len, status); if(U_SUCCESS(*status)) { - static const UChar open[] = { 0x003A, 0x0069, 0x006E, 0x0074, 0x0076, 0x0065, 0x0063, 0x0074, 0x006F, 0x0072, 0x0020, 0x007B, 0x0020 }; /* ":intvector { " */ - static const UChar close[] = { 0x0020, 0x007D, 0x0020 }; /* " } " */ + static const UChar openStr[] = { 0x003A, 0x0069, 0x006E, 0x0074, 0x0076, 0x0065, 0x0063, 0x0074, 0x006F, 0x0072, 0x0020, 0x007B, 0x0020 }; /* ":intvector { " */ + static const UChar closeStr[] = { 0x0020, 0x007D, 0x0020 }; /* " } " */ UChar num[20]; printIndent(out, converter, indent); if(key != NULL) { printCString(out, converter, key, -1); } - printString(out, converter, open, (int32_t)(sizeof(open) / sizeof(*open))); + printString(out, converter, openStr, (int32_t)(sizeof(openStr) / sizeof(*openStr))); for(i = 0; i < len - 1; i++) { int32_t numLen = uprv_itou(num, 20, data[i], 10, 0); num[numLen++] = 0x002C; /* ',' */ @@ -655,7 +655,7 @@ static void printOutBundle(FILE *out, UConverter *converter, UResourceBundle *re uprv_itou(num, 20, data[len - 1], 10, 0); printString(out, converter, num, u_strlen(num)); } - printString(out, converter, close, (int32_t)(sizeof(close) / sizeof(*close))); + printString(out, converter, closeStr, (int32_t)(sizeof(closeStr) / sizeof(*closeStr))); if(verbose) { printCString(out, converter, "// INTVECTOR", -1); } @@ -668,8 +668,8 @@ static void printOutBundle(FILE *out, UConverter *converter, UResourceBundle *re case RES_TABLE : case RES_ARRAY : { - static const UChar open[] = { 0x007B }; /* "{" */ - static const UChar close[] = { 0x007D, '\n' }; /* "}\n" */ + static const UChar openStr[] = { 0x007B }; /* "{" */ + static const UChar closeStr[] = { 0x007D, '\n' }; /* "}\n" */ UResourceBundle *t = NULL; ures_resetIterator(resource); @@ -677,7 +677,7 @@ static void printOutBundle(FILE *out, UConverter *converter, UResourceBundle *re if(key != NULL) { printCString(out, converter, key, -1); } - printString(out, converter, open, (int32_t)(sizeof(open) / sizeof(*open))); + printString(out, converter, openStr, (int32_t)(sizeof(openStr) / sizeof(*openStr))); if(verbose) { if(ures_getType(resource) == RES_TABLE) { printCString(out, converter, "// TABLE", -1); @@ -722,7 +722,7 @@ static void printOutBundle(FILE *out, UConverter *converter, UResourceBundle *re } printIndent(out, converter, indent); - printString(out, converter, close, (int32_t)(sizeof(close) / sizeof(*close))); + printString(out, converter, closeStr, (int32_t)(sizeof(closeStr) / sizeof(*closeStr))); ures_close(t); } break; diff --git a/icuSources/tools/genrb/derb.dsp b/icuSources/tools/genrb/derb.dsp index 94a9c7b6..b74a4c73 100644 --- a/icuSources/tools/genrb/derb.dsp +++ b/icuSources/tools/genrb/derb.dsp @@ -121,7 +121,7 @@ MTL=midl.exe # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win64 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win64 # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /FD /c -# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -158,7 +158,7 @@ MTL=midl.exe # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win64 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win64 # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /GZ /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /GZ /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe diff --git a/icuSources/tools/genrb/derb.vcproj b/icuSources/tools/genrb/derb.vcproj index cbad668c..99f14895 100644 --- a/icuSources/tools/genrb/derb.vcproj +++ b/icuSources/tools/genrb/derb.vcproj @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding = "Windows-1252"?> +<?xml version="1.0" encoding="Windows-1252"?> <VisualStudioProject ProjectType="Visual C++" - Version="7.00" + Version="7.10" Name="derb" SccProjectName="" SccLocalPath=""> @@ -37,17 +37,14 @@ CompileAs="0"/> <Tool Name="VCCustomBuildTool" - CommandLine="copy $(TargetPath) ..\..\..\bin + CommandLine="copy "$(TargetPath)" ..\..\..\bin " - Outputs="..\..\..\bin\$(InputName).exe"/> + Outputs="..\..\..\bin\$(TargetFileName)"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icuuc.lib icutu.lib" OutputFile=".\derb_Win32_Release/derb.exe" LinkIncremental="1" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\..\..\lib" ProgramDatabaseFile=".\derb_Win32_Release/derb.pdb" SubSystem="1"/> <Tool @@ -69,8 +66,14 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> <Configuration Name="Debug|Win32" @@ -100,17 +103,14 @@ CompileAs="0"/> <Tool Name="VCCustomBuildTool" - CommandLine="copy $(TargetPath) ..\..\..\bin + CommandLine="copy "$(TargetPath)" ..\..\..\bin " - Outputs="..\..\..\bin\$(InputName).exe"/> + Outputs="..\..\..\bin\$(TargetFileName)"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icuucd.lib icutud.lib" OutputFile=".\derb_Win32_Debug/derb.exe" LinkIncremental="2" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\..\..\lib" GenerateDebugInformation="TRUE" ProgramDatabaseFile=".\derb_Win32_Debug/derb.pdb" SubSystem="1"/> @@ -133,10 +133,18 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> </Configurations> + <References> + </References> <Files> <Filter Name="Source Files" diff --git a/icuSources/tools/genrb/errmsg.c b/icuSources/tools/genrb/errmsg.c index 64694026..8b47f261 100644 --- a/icuSources/tools/genrb/errmsg.c +++ b/icuSources/tools/genrb/errmsg.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1998-2000, International Business Machines +* Copyright (C) 1998-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -25,7 +25,7 @@ void error(uint32_t linenumber, const char *msg, ...) va_list va; va_start(va, msg); - fprintf(stderr, "%s:%d: ", gCurrentFileName, linenumber); + fprintf(stderr, "%s:%u: ", gCurrentFileName, (int)linenumber); vfprintf(stderr, msg, va); fprintf(stderr, "\n"); va_end(va); @@ -63,7 +63,7 @@ void warning(uint32_t linenumber, const char *msg, ...) va_list va; va_start(va, msg); - fprintf(stderr, "%s:%d: warning: ", gCurrentFileName, linenumber); + fprintf(stderr, "%s:%u: warning: ", gCurrentFileName, (int)linenumber); vfprintf(stderr, msg, va); fprintf(stderr, "\n"); va_end(va); diff --git a/icuSources/tools/genrb/gendtjar.pl b/icuSources/tools/genrb/gendtjar.pl new file mode 100644 index 00000000..38aada8d --- /dev/null +++ b/icuSources/tools/genrb/gendtjar.pl @@ -0,0 +1,178 @@ +#!/usr/bin/perl +# ******************************************************************** +# * COPYRIGHT: +# * Copyright (c) 2002-2004, International Business Machines Corporation and +# * others. All Rights Reserved. +# ******************************************************************** + +# Script to generate the icudata.jar and testdata.jar files. This file is +# part of icu4j. It is checked into CVS. It is generated from +# locale data in the icu4c project. See usage() notes (below) +# for more information. + +# This script requires perl. For Win32, I recommend www.activestate.com. + +# Ram Viswanadha +# copied heavily from genrbjar.pl +use File::Find; +use File::Basename; +use IO::File; +use Cwd; +use File::Copy; +use Getopt::Long; +use File::Path; +use File::Copy; + + +main(); + +#------------------------------------------------------------------ +sub main(){ + +GetOptions( + "--icu-root=s" => \$icuRootDir, + "--jar=s" => \$jarDir, + "--icu4j-root=s" => \$icu4jDir, + "--version=s" => \$version + ); +usage() unless defined $icuRootDir; +usage() unless defined $jarDir; + #usage() unless defined $icu4jRootDir; + $icuswap = $icuRootDir."/bin/icuswap -tb"; + $tempDir =cwd(); + $tempDir .= "/temp"; + $version =~ s/\.//; + $icu4jDataDir ="com/ibm/icu/impl/data/icudt".$version."b"; + $icu4jTestDataDir = "com/ibm/icu/dev/data/testdata"; + $icuDataDir =$icuRootDir."/source/data/out/build/icudt".$version.checkPlatform(); + $icuTestDataDir =$icuRootDir."/source/test/testdata/out/build/"; + convertData($icuDataDir, $icuswap, $tempDir, $icu4jDataDir); + #convertData($icuDataDir."/coll/", $icuswap, $tempDir, $icu4jDataDir."/coll"); + createJar("$jarDir/jar", "icudata.jar", $tempDir, $icu4jDataDir); + + convertTestData($icuTestDataDir, $icuswap, $tempDir, $icu4jTestDataDir); + createJar("$jarDir/jar", "testdata.jar", $tempDir, $icu4jTestDataDir); +} + +#----------------------------------------------------------------------- +sub createJar{ + local($jar, $jarFile, $tempDir, $dirToJar) = @_; + chdir($tempDir); + $command = "$jar cvf $jarFile -C $tempDir $dirToJar"; + cmd($command); +} +#----------------------------------------------------------------------- +sub checkPlatform { + my $is_big_endian = unpack("h*", pack("s", 1)) =~ /01/; + if ($is_big_endian) { + return "b"; + }else{ + return "l"; + } +} +#----------------------------------------------------------------------- + +#----------------------------------------------------------------------- +sub convertData{ + local($icuDataDir, $icuswap, $tempDir, $icu4jDataDir) =@_; + my $dir = $tempDir."/".$icu4jDataDir; + # create the temp directory + mkpath("$tempDir/$icu4jDataDir"); + # cd to the temp directory + chdir($tempDir); + + my @list; + opendir(DIR,$icuDataDir); + print $icuDataDir; + @list = readdir(DIR); + closedir(DIR); + print "{Command: $op*.*}\n"; + my $op = $icuswap; + $i=0; + # now convert + foreach $item (@list){ + next if($item eq "." || $item eq ".."); + next if($item =~ /^t_.*$\.res/ ||$item =~ /^translit_.*$\.res/ || $item =~ /$\.cnv/ || + $item=~/$\.crs/ || $item=~ /$\.txt/ || $item=~ /^zoneinfo/ || + $item=~/icudata\.res/ || $item=~/$\.exp/ || $item=~/$\.lib/ || $item=~/$\.obj/ || + $item=~/cnvalias\.icu/ || $item=~/$\.lst/); + if(-d "$icuDataDir/$item"){ + convertData("$icuDataDir/$item/", $icuswap, $tempDir, "$icu4jDataDir./$item/"); + next; + } + $command = $icuswap." $icuDataDir/$item $tempDir/$icu4jDataDir/$item"; + cmd($command); + + } + chdir(".."); + print "\nDONE\n"; +} +#----------------------------------------------------------------------- +sub convertTestData{ + local($icuDataDir, $icuswap, $tempDir, $icu4jDataDir) =@_; + my $dir = $tempDir."/".$icu4jDataDir; + # create the temp directory + mkpath("$tempDir/$icu4jDataDir"); + # cd to the temp directory + chdir($tempDir); + print "{Command: $op*.*}\n"; + my $op = $icuswap; + my @list; + opendir(DIR,$icuDataDir); + print $icuDataDir; + @list = readdir(DIR); + closedir(DIR); + + $i=0; + # now convert + foreach $item (@list){ + next if($item eq "." || $item eq ".."); + next if($item =~ /$\.cnv/ || item=~/$\.crs/ || $item=~ /$\.txt/ || + $item=~/$\.exp/ || $item=~/$\.lib/ || $item=~/$\.obj/ || + $item=~/$\.mak/ || $item=~/test\.icu/ || $item=~/$\.lst/); + + if($item =~ /^testdata_/){ + $file = $item; + $file =~ s/testdata_//g; + $command = "$icuswap $icuDataDir/$item $tempDir/$icu4jDataDir/$file"; + cmd($command); + } + + } + chdir(".."); + print "\nDONE\n"; +} +#------------------------------------------------------------------------------------------------ +sub cmd { + my $cmd = shift; + my $prompt = shift; + $prompt = "Command: $cmd.." unless ($prompt); + print $prompt."\n"; + system($cmd); + my $exit_value = $? >> 8; + #my $signal_num = $? & 127; + #my $dumped_core = $? & 128; + if ($exit_value == 0) { + print "ok\n"; + } else { + ++$errCount; + print "ERROR ($exit_value)\n"; + exit(1); + } +} +#----------------------------------------------------------------------- +sub usage { + print << "END"; +Usage: +gendtjar.pl +Options: + --icu-root=<directory where icu4c lives> + --jar=<directory where jar.exe lives> + --icu4j-root=<directory> + --version=<ICU4C version> +e.g: +gendtjar.pl --icu-root=\\work\\icu --jar=\\jdk1.4.1\\bin --icu4j-root=\\work\\icu4j --version=3.0 +END + exit(0); +} + diff --git a/icuSources/tools/genrb/genjp/README.txt b/icuSources/tools/genrb/genjp/README.txt deleted file mode 100644 index 2bcfc082..00000000 --- a/icuSources/tools/genrb/genjp/README.txt +++ /dev/null @@ -1,7 +0,0 @@ -Copyright (c) 2002, International Business Machines Corporation and others. All Rights Reserved. -This tool is used to automatically generate collation rules for JIS X 4061 sort ordering. It requires ICU to be built beforehand. - -The way to use it is to capture the output to a file and then copy and paste it instead of CollationElements section in the Japanese resource bundle. - -There is no need for anybody to do that, since this data is already in its proper place. This tool is included for documentation purposes only. - diff --git a/icuSources/tools/genrb/genjp/genjp.cpp b/icuSources/tools/genrb/genjp/genjp.cpp deleted file mode 100644 index b3d67122..00000000 --- a/icuSources/tools/genrb/genjp/genjp.cpp +++ /dev/null @@ -1,1053 +0,0 @@ -/* -******************************************************************************* -* Copyright (C) 2001, International Business Machines -* Corporation and others. All Rights Reserved. -******************************************************************************* -* file name: genjp. -* encoding: US-ASCII -* -* Modification history -* Date Name Comments -* 10/13/2001 weiv created -* -* The GenJP class is useful for generating various stuff related to Japanese language. -* Right now, it uses ICU to generate rules for JIS X 4061 compliant collation. -* Also, it is useful for getting compatibility versions of the characters. -*/ - -#include "genjp.h" - -int main(int argc, const char* const argv[]) { - UErrorCode status = U_ZERO_ERROR; - GenJP jp; - jp.writeHeader(status); - jp.processLengthMark(status); - jp.processIterationMark(status); - jp.equalKatakanaToHiragana(status); - jp.processCompatibility(status); - jp.printOutKanji(status); - jp.writeFooter(status); - return status; -} - -// Here is the deal -// We need to produce the following things -// 1. &katakana=katakana=hiragana=compatibilityform -// 2. &otherchars=compatibilitychar -// 3. &[before 3]small_katakana_vowel -// <<<katakanas_ending_in_vowel|\u30fc...= -// =hiraganas_ending_in_vowel|\u30fc...= -// =copmatibility_ending_in_vowel|\u30fc -// 4. &[before 3]large_katakana -// <<< - -GenJP::GenJP() { - UErrorCode status = U_ZERO_ERROR; - kanaToHalf = ucmpe32_open(0xFFFF, 0, &status); - nameBuff = (char *)uprv_malloc(_bufferSize*sizeof(char)); - out = stdout; - const char *nameBuffer; - UChar decompBuff[_bufferSize]; - uint32_t decompLen = 0; - UChar ch = 0; - for(ch = 0; ch < 0xFFFF; ch++) { - nameBuffer = getName(ch, status); - if(strstr(nameBuffer, "FULLWIDTH") || strstr(nameBuffer, "HALFWIDTH")) { - decompLen = unorm_normalize(&ch, 1, UNORM_NFKD, 0, decompBuff, 254, &status); - ucmpe32_set32(kanaToHalf, decompBuff[0], ch); - } - } -} - -GenJP::~GenJP() { - uprv_free(nameBuff); - ucmpe32_close(kanaToHalf); -} - -UChar GenJP::getHalf(UChar u) { - return (UChar)ucmpe32_get(kanaToHalf, u); -} - -char *GenJP::printUnicodeStuff(UChar *zTStuff, char *resBuf) { - uint32_t resBufLen = 0; - while(*zTStuff!=0) { - if(*zTStuff >= 0x20 && *zTStuff <= 0x7F) { - resBuf[resBufLen++] = (char)(*zTStuff); - } else { - sprintf(resBuf+resBufLen, "\\u%04X", *zTStuff); - resBufLen+=6; - } - zTStuff++; - } - resBuf[resBufLen] = 0; - return resBuf; -} - -UBool GenJP::isSemivoiced(UChar ch, UErrorCode &status) { - UChar decompBuff[256]; - uint32_t decompLen = 0; - - decompLen = unorm_normalize(&ch, 1, UNORM_NFD, 0, decompBuff, 256, &status); - - if(decompBuff[decompLen-1]==0x309A) { - return TRUE; - } else { - return FALSE; - } -} - -UBool GenJP::isVoiced(UChar ch, UErrorCode &status) { - UChar decompBuff[256]; - uint32_t decompLen = 0; - - decompLen = unorm_normalize(&ch, 1, UNORM_NFD, 0, decompBuff, 256, &status); - - if(decompBuff[decompLen-1]==0x3099) { - return TRUE; - } else { - return FALSE; - } -} - -const char *GenJP::getName(const UChar ch, UErrorCode &status) { - uint32_t nameLen = 0; - nameLen = u_charName(ch, U_UNICODE_CHAR_NAME, nameBuff, _bufferSize, &status); - nameBuff[nameLen]=0; - - return nameBuff; -} - -void GenJP::writeHeader(UErrorCode &status) { -fprintf(out, - "CollationElements {\n" - " Version { \"3.0\" }\n" - " Sequence {\n" - " \"[strength 4][hiraganaQ on]\"\n"); -} - -void GenJP::writeFooter(UErrorCode &status) { - fprintf(out, - " }\n" - " }\n"); -} - - -void GenJP::processCompatibility(UErrorCode &status) { - UChar ch; - fprintf(out, "\n// Equaling normal and halfwidth/fullwidth characters\n"); - fprintf(out, "\"&' '=\\u3000\" // IDEOGRAPHIC SPACE\n"); - for(ch = 0; ch < _hiraganaStart; ch++) { - UChar compat = getHalf(ch); - if(compat < 0xFFFF) { - if(ch != 0x0027) { - fprintf(out, "\"&'\\u%04X' = '\\u%04X'\" // %s\n", ch, compat, getName(ch, status)); // no name currently - } else { - fprintf(out, "\"&'' = '\\u%04X'\" // %s\n", compat, getName(ch, status)); // no name currently - } - } - } -} - -void GenJP::equalKatakanaToHiragana(UErrorCode &status) { - UChar katakana=0, decompBuff[_bufferSize]; - const char *nameBuffer; - uint32_t nameLen = 0, decompLen = 0; - - fprintf(out, "\n// Equaling Katakana, Hiragana and compatibility\n"); - // Make Hiragana and Katakana equal at the first three level - for(katakana = _katakanaStart; katakana < _katakanaEnd; katakana++) { - decompLen = unorm_normalize(&katakana, 1, UNORM_NFD, 0, decompBuff, 254, &status); - if(decompLen == 1) { - fprintf(out, "\"&\\u%04X = \\u%04X", katakana, katakana); - - UChar hiragana = getHiragana(katakana); - if(hiragana <= _hiraganaEnd) { - fprintf(out, " = \\u%04X", hiragana); - } - - UChar compat = getHalf(katakana); - if(compat < 0xFFFF) { - fprintf(out, " = \\u%04X", compat); - } - - nameBuffer = getName(katakana, status); - - fprintf(out, "\" // %s\n", nameBuffer); - } - } -} - -void GenJP::processLengthMark(UErrorCode &status) { // This will do small vowels and generate rules for the length mark - const UChar *vowel = _vowels; - UChar kana = 0; - char *vowelName = NULL, vowelNameBuffer[_bufferSize], nameBuffer[_bufferSize]; - uint32_t vowelNameLen = 0, nameLen = 0; - - fprintf(out, "\n// Rules for treating length mark\n"); - while(*vowel != NULL) { // process one vowel - wasReset = TRUE; - // printout "&[before 3]vowel" - vowelNameLen = u_charName(*vowel, U_UNICODE_CHAR_NAME, vowelNameBuffer, _bufferSize, &status); - vowelNameBuffer[vowelNameLen]=0; - vowelName = vowelNameBuffer+vowelNameLen-1; // point at the vowel name - - - fprintf(out, "\n\"&[before 3]\\u%04X\" //%s\n", *vowel, vowelNameBuffer); - - for(kana = _katakanaStart; kana <= _katakanaEnd; kana++) { // we iterate through Katakanas first - - nameLen = u_charName(kana, U_UNICODE_CHAR_NAME, nameBuffer, _bufferSize, &status); - nameBuffer[nameLen]=0; - if(strcmp(vowelName, nameBuffer+nameLen-1)==0) { // This is the syllable ending in our vowel - fprintf(out, " %s \\u%04X|\\u%04X", getRelation(), kana, _prolongedSoundMark); - UChar comp = getHalf(kana); - if(comp < 0xFFFF) { // if there is a compatibility, emit it... - fprintf(out, " = \\u%04X|\\u%04X", comp, _prolongedSoundMark); - } - UChar hiragana = getHiragana(kana); - if(hiragana <= _hiraganaEnd) { // there is a corresponding Hiragana - fprintf(out, " = \\u%04X|\\u%04X", hiragana, _prolongedSoundMark); - } - fprintf(out, "\" // %s\n", strrchr(nameBuffer, ' ')); - } - } - vowel++; - } -} - -void GenJP::processIterationMark(UErrorCode &status) { - UChar katakana = _katakanaStart; - const char *name; - UBool hasSmall = FALSE; - - fprintf(out, "\n// Rules for treating iteration mark\n"); - while(katakana <= 0x30F3) { // We have anomalies for 0x30F3 and further. - wasReset = TRUE; - name = getName(katakana, status); - fprintf(out, "\n"); - if (katakana == 0x30AB) { // KA needs to pick up small Ka (0x30F5) - fprintf(out, "\"&[before 3]\\u%04X\" //%s\n", katakana, name); - processIterationMark(katakana, status); - processIterationMark(0x30F5, status); - } else if (katakana == 0x30b1) { // KE needs to pick up small Ke (0x30F6) - fprintf(out, "\"&[before 3]\\u%04X\" //%s\n", katakana, name); - processIterationMark(katakana, status); - processIterationMark(0x30F6, status); - } else if (katakana == 0x30EE) { // Small WA, takes WA and VA - katakana++; - name = getName(katakana, status); - fprintf(out, "\"&[before 3]\\u%04X\" //%s\n", katakana, name); - processIterationMark(katakana, status); - processIterationMark(katakana-1, status); - processIterationMark(0x30F7, status); - processVoicedIterationMark(katakana, status); - processVoicedIterationMark(0x30F7, status); - processVoicedIterationMark(katakana-1, status); - } else if (katakana >= 0x30F0 && katakana <= 0x30F2) { // WI, WE, WO -> VI, VE, VO - uint16_t offset = 0x30F8-0x30F0; - fprintf(out, "\"&[before 3]\\u%04X\" //%s\n", katakana, name); - processIterationMark(katakana, status); - processIterationMark(katakana+offset, status); - processVoicedIterationMark(katakana, status); - processVoicedIterationMark(katakana+offset, status); - } else if (katakana == 0x30A5) { // U -> VU (0x30F4) - katakana++; - name = getName(katakana, status); - fprintf(out, "\"&[before 3]\\u%04X\" //%s\n", katakana, name); - processIterationMark(katakana, status); - processIterationMark(katakana-1, status); - processIterationMark(0x30F4, status); - processVoicedIterationMark(katakana, status); - processVoicedIterationMark(katakana-1, status); - processVoicedIterationMark(0x30F4, status); - } else { - if(strstr(name, "SMALL")) { // this is small Katakana - hasSmall = TRUE; - katakana++; - name = getName(katakana, status); - } - fprintf(out, "\"&[before 3]\\u%04X\" //%s\n", katakana, name); - - // This is done for all the normal stuff - processIterationMark(katakana, status); - if(hasSmall) { - processIterationMark(katakana-1, status); - } - - if(katakana < 0x30F3 && isVoiced(katakana+1, status)) { // Do the voiced part if we are not at the end - processVoicedKana(katakana+1, status); - if(hasSmall) { - processVoicedKana(katakana, status); - } - - if(isSemivoiced(katakana+2, status)) { - processSemivoicedKana(katakana+2, status); - // No semivoiced small kana - katakana++; - } - katakana++; - } - - hasSmall = FALSE; - } - katakana++; - } - -} - -const char *GenJP::getRelation() { - if(wasReset==TRUE) { - wasReset = FALSE; - return _tertiaryLess; - } else { - return _equal; - } -} - -void GenJP::processIterationMark(UChar katakana, UErrorCode &status) { - fprintf(out, " %s \\u%04X|\\u%04X", getRelation(), katakana, _katakanaIterationMark); - UChar compat = getHalf(katakana); - if(compat < 0xFFFF) { - fprintf(out, " = \\u%04X|\\u%04X", compat, _katakanaIterationMark); - } - UChar hiragana = getHiragana(katakana); - if(hiragana <= _hiraganaEnd) { - fprintf(out, " = \\u%04X|\\u%04X", hiragana, _hiraganaIterationMark); - } - fprintf(out, "\"\n"); -} - -void GenJP::processVoicedIterationMark(UChar katakana, UErrorCode &status) { - fprintf(out, " %s \\u%04X|\\u%04X/\\u%04X", getRelation(), katakana, _katakanaVoicedIterationMark, _voicedMark); - UChar compat = getHalf(katakana); - if(compat < 0xFFFF) { - fprintf(out, " = \\u%04X|\\u%04X/\\u%04X", compat, _katakanaVoicedIterationMark, _voicedMark); - } - UChar hiragana = getHiragana(katakana); - if(hiragana <= _hiraganaEnd) { - fprintf(out, " = \\u%04X|\\u%04X/\\u%04X", hiragana, _hiraganaVoicedIterationMark, _voicedMark); - } - fprintf(out, "\"\n"); -} - -void GenJP::processVoicedKana(UChar katakana, UErrorCode &status) { - processIterationMark(katakana, status); - processVoicedIterationMark(katakana-1, status); - processVoicedIterationMark(katakana, status); -} - -void GenJP::processSemivoicedKana(UChar katakana, UErrorCode &status) { - processIterationMark(katakana, status); - processVoicedIterationMark(katakana, status); -} - -void GenJP::printOutKanji(UErrorCode &status) { - fprintf(out, " // Kanji, positioned over the top\n"); - fprintf(out, " \"& [top] \"\n"); - fprintf(out, " \"<\\u4e9c<\\u5516<\\u5a03<\\u963f<\\u54c0<\\u611b<\\u6328<\\u59f6<\\u9022\"\n"); - fprintf(out, " \"<\\u8475<\\u831c<\\u7a50<\\u60aa<\\u63e1<\\u6e25<\\u65ed<\\u8466<\\u82a6\"\n"); - fprintf(out, " \"<\\u9bf5<\\u6893<\\u5727<\\u65a1<\\u6271<\\u5b9b<\\u59d0<\\u867b<\\u98f4\"\n"); - fprintf(out, " \"<\\u7d62<\\u7dbe<\\u9b8e<\\u6216<\\u7c9f<\\u88b7<\\u5b89<\\u5eb5<\\u6309\"\n"); - fprintf(out, " \"<\\u6697<\\u6848<\\u95c7<\\u978d<\\u674f<\\u4ee5<\\u4f0a<\\u4f4d<\\u4f9d\"\n"); - fprintf(out, " \"<\\u5049<\\u56f2<\\u5937<\\u59d4<\\u5a01<\\u5c09<\\u60df<\\u610f<\\u6170\"\n"); - fprintf(out, " \"<\\u6613<\\u6905<\\u70ba<\\u754f<\\u7570<\\u79fb<\\u7dad<\\u7def<\\u80c3\"\n"); - fprintf(out, " \"<\\u840e<\\u8863<\\u8b02<\\u9055<\\u907a<\\u533b<\\u4e95<\\u4ea5<\\u57df\"\n"); - fprintf(out, " \"<\\u80b2<\\u90c1<\\u78ef<\\u4e00<\\u58f1<\\u6ea2<\\u9038<\\u7a32<\\u8328\"\n"); - fprintf(out, " \"<\\u828b<\\u9c2f<\\u5141<\\u5370<\\u54bd<\\u54e1<\\u56e0<\\u59fb<\\u5f15\"\n"); - fprintf(out, " \"<\\u98f2<\\u6deb<\\u80e4<\\u852d<\\u9662<\\u9670<\\u96a0<\\u97fb<\\u540b\"\n"); - fprintf(out, " \"<\\u53f3<\\u5b87<\\u70cf<\\u7fbd<\\u8fc2<\\u96e8<\\u536f<\\u9d5c<\\u7aba\"\n"); - fprintf(out, " \"<\\u4e11<\\u7893<\\u81fc<\\u6e26<\\u5618<\\u5504<\\u6b1d<\\u851a<\\u9c3b\"\n"); - fprintf(out, " \"<\\u59e5<\\u53a9<\\u6d66<\\u74dc<\\u958f<\\u5642<\\u4e91<\\u904b<\\u96f2\"\n"); - fprintf(out, " \"<\\u834f<\\u990c<\\u53e1<\\u55b6<\\u5b30<\\u5f71<\\u6620<\\u66f3<\\u6804\"\n"); - fprintf(out, " \"<\\u6c38<\\u6cf3<\\u6d29<\\u745b<\\u76c8<\\u7a4e<\\u9834<\\u82f1<\\u885b\"\n"); - fprintf(out, " \"<\\u8a60<\\u92ed<\\u6db2<\\u75ab<\\u76ca<\\u99c5<\\u60a6<\\u8b01<\\u8d8a\"\n"); - fprintf(out, " \"<\\u95b2<\\u698e<\\u53ad<\\u5186<\\u5712<\\u5830<\\u5944<\\u5bb4<\\u5ef6\"\n"); - fprintf(out, " \"<\\u6028<\\u63a9<\\u63f4<\\u6cbf<\\u6f14<\\u708e<\\u7114<\\u7159<\\u71d5\"\n"); - fprintf(out, " \"<\\u733f<\\u7e01<\\u8276<\\u82d1<\\u8597<\\u9060<\\u925b<\\u9d1b<\\u5869\"\n"); - fprintf(out, " \"<\\u65bc<\\u6c5a<\\u7525<\\u51f9<\\u592e<\\u5965<\\u5f80<\\u5fdc<\\u62bc\"\n"); - fprintf(out, " \"<\\u65fa<\\u6a2a<\\u6b27<\\u6bb4<\\u738b<\\u7fc1<\\u8956<\\u9d2c<\\u9d0e\"\n"); - fprintf(out, " \"<\\u9ec4<\\u5ca1<\\u6c96<\\u837b<\\u5104<\\u5c4b<\\u61b6<\\u81c6<\\u6876\"\n"); - fprintf(out, " \"<\\u7261<\\u4e59<\\u4ffa<\\u5378<\\u6069<\\u6e29<\\u7a4f<\\u97f3<\\u4e0b\"\n"); - fprintf(out, " \"<\\u5316<\\u4eee<\\u4f55<\\u4f3d<\\u4fa1<\\u4f73<\\u52a0<\\u53ef<\\u5609\"\n"); - fprintf(out, " \"<\\u590f<\\u5ac1<\\u5bb6<\\u5be1<\\u79d1<\\u6687<\\u679c<\\u67b6<\\u6b4c\"\n"); - fprintf(out, " \"<\\u6cb3<\\u706b<\\u73c2<\\u798d<\\u79be<\\u7a3c<\\u7b87<\\u82b1<\\u82db\"\n"); - fprintf(out, " \"<\\u8304<\\u8377<\\u83ef<\\u83d3<\\u8766<\\u8ab2<\\u5629<\\u8ca8<\\u8fe6\"\n"); - fprintf(out, " \"<\\u904e<\\u971e<\\u868a<\\u4fc4<\\u5ce8<\\u6211<\\u7259<\\u753b<\\u81e5\"\n"); - fprintf(out, " \"<\\u82bd<\\u86fe<\\u8cc0<\\u96c5<\\u9913<\\u99d5<\\u4ecb<\\u4f1a<\\u89e3\"\n"); - fprintf(out, " \"<\\u56de<\\u584a<\\u58ca<\\u5efb<\\u5feb<\\u602a<\\u6094<\\u6062<\\u61d0\"\n"); - fprintf(out, " \"<\\u6212<\\u62d0<\\u6539<\\u9b41<\\u6666<\\u68b0<\\u6d77<\\u7070<\\u754c\"\n"); - fprintf(out, " \"<\\u7686<\\u7d75<\\u82a5<\\u87f9<\\u958b<\\u968e<\\u8c9d<\\u51f1<\\u52be\"\n"); - fprintf(out, " \"<\\u5916<\\u54b3<\\u5bb3<\\u5d16<\\u6168<\\u6982<\\u6daf<\\u788d<\\u84cb\"\n"); - fprintf(out, " \"<\\u8857<\\u8a72<\\u93a7<\\u9ab8<\\u6d6c<\\u99a8<\\u86d9<\\u57a3<\\u67ff\"\n"); - fprintf(out, " \"<\\u86ce<\\u920e<\\u5283<\\u5687<\\u5404<\\u5ed3<\\u62e1<\\u64b9<\\u683c\"\n"); - fprintf(out, " \"<\\u6838<\\u6bbb<\\u7372<\\u78ba<\\u7a6b<\\u899a<\\u89d2<\\u8d6b<\\u8f03\"\n"); - fprintf(out, " \"<\\u90ed<\\u95a3<\\u9694<\\u9769<\\u5b66<\\u5cb3<\\u697d<\\u984d<\\u984e\"\n"); - fprintf(out, " \"<\\u639b<\\u7b20<\\u6a2b<\\u6a7f<\\u68b6<\\u9c0d<\\u6f5f<\\u5272<\\u559d\"\n"); - fprintf(out, " \"<\\u6070<\\u62ec<\\u6d3b<\\u6e07<\\u6ed1<\\u845b<\\u8910<\\u8f44<\\u4e14\"\n"); - fprintf(out, " \"<\\u9c39<\\u53f6<\\u691b<\\u6a3a<\\u9784<\\u682a<\\u515c<\\u7ac3<\\u84b2\"\n"); - fprintf(out, " \"<\\u91dc<\\u938c<\\u565b<\\u9d28<\\u6822<\\u8305<\\u8431<\\u7ca5<\\u5208\"\n"); - fprintf(out, " \"<\\u82c5<\\u74e6<\\u4e7e<\\u4f83<\\u51a0<\\u5bd2<\\u520a<\\u52d8<\\u52e7\"\n"); - fprintf(out, " \"<\\u5dfb<\\u559a<\\u582a<\\u59e6<\\u5b8c<\\u5b98<\\u5bdb<\\u5e72<\\u5e79\"\n"); - fprintf(out, " \"<\\u60a3<\\u611f<\\u6163<\\u61be<\\u63db<\\u6562<\\u67d1<\\u6853<\\u68fa\"\n"); - fprintf(out, " \"<\\u6b3e<\\u6b53<\\u6c57<\\u6f22<\\u6f97<\\u6f45<\\u74b0<\\u7518<\\u76e3\"\n"); - fprintf(out, " \"<\\u770b<\\u7aff<\\u7ba1<\\u7c21<\\u7de9<\\u7f36<\\u7ff0<\\u809d<\\u8266\"\n"); - fprintf(out, " \"<\\u839e<\\u89b3<\\u8acc<\\u8cab<\\u9084<\\u9451<\\u9593<\\u9591<\\u95a2\"\n"); - fprintf(out, " \"<\\u9665<\\u97d3<\\u9928<\\u8218<\\u4e38<\\u542b<\\u5cb8<\\u5dcc<\\u73a9\"\n"); - fprintf(out, " \"<\\u764c<\\u773c<\\u5ca9<\\u7feb<\\u8d0b<\\u96c1<\\u9811<\\u9854<\\u9858\"\n"); - fprintf(out, " \"<\\u4f01<\\u4f0e<\\u5371<\\u559c<\\u5668<\\u57fa<\\u5947<\\u5b09<\\u5bc4\"\n"); - fprintf(out, " \"<\\u5c90<\\u5e0c<\\u5e7e<\\u5fcc<\\u63ee<\\u673a<\\u65d7<\\u65e2<\\u671f\"\n"); - fprintf(out, " \"<\\u68cb<\\u68c4<\\u6a5f<\\u5e30<\\u6bc5<\\u6c17<\\u6c7d<\\u757f<\\u7948\"\n"); - fprintf(out, " \"<\\u5b63<\\u7a00<\\u7d00<\\u5fbd<\\u898f<\\u8a18<\\u8cb4<\\u8d77<\\u8ecc\"\n"); - fprintf(out, " \"<\\u8f1d<\\u98e2<\\u9a0e<\\u9b3c<\\u4e80<\\u507d<\\u5100<\\u5993<\\u5b9c\"\n"); - fprintf(out, " \"<\\u622f<\\u6280<\\u64ec<\\u6b3a<\\u72a0<\\u7591<\\u7947<\\u7fa9<\\u87fb\"\n"); - fprintf(out, " \"<\\u8abc<\\u8b70<\\u63ac<\\u83ca<\\u97a0<\\u5409<\\u5403<\\u55ab<\\u6854\"\n"); - fprintf(out, " \"<\\u6a58<\\u8a70<\\u7827<\\u6775<\\u9ecd<\\u5374<\\u5ba2<\\u811a<\\u8650\"\n"); - fprintf(out, " \"<\\u9006<\\u4e18<\\u4e45<\\u4ec7<\\u4f11<\\u53ca<\\u5438<\\u5bae<\\u5f13\"\n"); - fprintf(out, " \"<\\u6025<\\u6551<\\u673d<\\u6c42<\\u6c72<\\u6ce3<\\u7078<\\u7403<\\u7a76\"\n"); - fprintf(out, " \"<\\u7aae<\\u7b08<\\u7d1a<\\u7cfe<\\u7d66<\\u65e7<\\u725b<\\u53bb<\\u5c45\"\n"); - fprintf(out, " \"<\\u5de8<\\u62d2<\\u62e0<\\u6319<\\u6e20<\\u865a<\\u8a31<\\u8ddd<\\u92f8\"\n"); - fprintf(out, " \"<\\u6f01<\\u79a6<\\u9b5a<\\u4ea8<\\u4eab<\\u4eac<\\u4f9b<\\u4fa0<\\u50d1\"\n"); - fprintf(out, " \"<\\u5147<\\u7af6<\\u5171<\\u51f6<\\u5354<\\u5321<\\u537f<\\u53eb<\\u55ac\"\n"); - fprintf(out, " \"<\\u5883<\\u5ce1<\\u5f37<\\u5f4a<\\u602f<\\u6050<\\u606d<\\u631f<\\u6559\"\n"); - fprintf(out, " \"<\\u6a4b<\\u6cc1<\\u72c2<\\u72ed<\\u77ef<\\u80f8<\\u8105<\\u8208<\\u854e\"\n"); - fprintf(out, " \"<\\u90f7<\\u93e1<\\u97ff<\\u9957<\\u9a5a<\\u4ef0<\\u51dd<\\u5c2d<\\u6681\"\n"); - fprintf(out, " \"<\\u696d<\\u5c40<\\u66f2<\\u6975<\\u7389<\\u6850<\\u7c81<\\u50c5<\\u52e4\"\n"); - fprintf(out, " \"<\\u5747<\\u5dfe<\\u9326<\\u65a4<\\u6b23<\\u6b3d<\\u7434<\\u7981<\\u79bd\"\n"); - fprintf(out, " \"<\\u7b4b<\\u7dca<\\u82b9<\\u83cc<\\u887f<\\u895f<\\u8b39<\\u8fd1<\\u91d1\"\n"); - fprintf(out, " \"<\\u541f<\\u9280<\\u4e5d<\\u5036<\\u53e5<\\u533a<\\u72d7<\\u7396<\\u77e9\"\n"); - fprintf(out, " \"<\\u82e6<\\u8eaf<\\u99c6<\\u99c8<\\u99d2<\\u5177<\\u611a<\\u865e<\\u55b0\"\n"); - fprintf(out, " \"<\\u7a7a<\\u5076<\\u5bd3<\\u9047<\\u9685<\\u4e32<\\u6adb<\\u91e7<\\u5c51\"\n"); - fprintf(out, " \"<\\u5c48<\\u6398<\\u7a9f<\\u6c93<\\u9774<\\u8f61<\\u7aaa<\\u718a<\\u9688\"\n"); - fprintf(out, " \"<\\u7c82<\\u6817<\\u7e70<\\u6851<\\u936c<\\u52f2<\\u541b<\\u85ab<\\u8a13\"\n"); - fprintf(out, " \"<\\u7fa4<\\u8ecd<\\u90e1<\\u5366<\\u8888<\\u7941<\\u4fc2<\\u50be<\\u5211\"\n"); - fprintf(out, " \"<\\u5144<\\u5553<\\u572d<\\u73ea<\\u578b<\\u5951<\\u5f62<\\u5f84<\\u6075\"\n"); - fprintf(out, " \"<\\u6176<\\u6167<\\u61a9<\\u63b2<\\u643a<\\u656c<\\u666f<\\u6842<\\u6e13\"\n"); - fprintf(out, " \"<\\u7566<\\u7a3d<\\u7cfb<\\u7d4c<\\u7d99<\\u7e4b<\\u7f6b<\\u830e<\\u834a\"\n"); - fprintf(out, " \"<\\u86cd<\\u8a08<\\u8a63<\\u8b66<\\u8efd<\\u981a<\\u9d8f<\\u82b8<\\u8fce\"\n"); - fprintf(out, " \"<\\u9be8<\\u5287<\\u621f<\\u6483<\\u6fc0<\\u9699<\\u6841<\\u5091<\\u6b20\"\n"); - fprintf(out, " \"<\\u6c7a<\\u6f54<\\u7a74<\\u7d50<\\u8840<\\u8a23<\\u6708<\\u4ef6<\\u5039\"\n"); - fprintf(out, " \"<\\u5026<\\u5065<\\u517c<\\u5238<\\u5263<\\u55a7<\\u570f<\\u5805<\\u5acc\"\n"); - fprintf(out, " \"<\\u5efa<\\u61b2<\\u61f8<\\u62f3<\\u6372<\\u691c<\\u6a29<\\u727d<\\u72ac\"\n"); - fprintf(out, " \"<\\u732e<\\u7814<\\u786f<\\u7d79<\\u770c<\\u80a9<\\u898b<\\u8b19<\\u8ce2\"\n"); - fprintf(out, " \"<\\u8ed2<\\u9063<\\u9375<\\u967a<\\u9855<\\u9a13<\\u9e78<\\u5143<\\u539f\"\n"); - fprintf(out, " \"<\\u53b3<\\u5e7b<\\u5f26<\\u6e1b<\\u6e90<\\u7384<\\u73fe<\\u7d43<\\u8237\"\n"); - fprintf(out, " \"<\\u8a00<\\u8afa<\\u9650<\\u4e4e<\\u500b<\\u53e4<\\u547c<\\u56fa<\\u59d1\"\n"); - fprintf(out, " \"<\\u5b64<\\u5df1<\\u5eab<\\u5f27<\\u6238<\\u6545<\\u67af<\\u6e56<\\u72d0\"\n"); - fprintf(out, " \"<\\u7cca<\\u88b4<\\u80a1<\\u80e1<\\u83f0<\\u864e<\\u8a87<\\u8de8<\\u9237\"\n"); - fprintf(out, " \"<\\u96c7<\\u9867<\\u9f13<\\u4e94<\\u4e92<\\u4f0d<\\u5348<\\u5449<\\u543e\"\n"); - fprintf(out, " \"<\\u5a2f<\\u5f8c<\\u5fa1<\\u609f<\\u68a7<\\u6a8e<\\u745a<\\u7881<\\u8a9e\"\n"); - fprintf(out, " \"<\\u8aa4<\\u8b77<\\u9190<\\u4e5e<\\u9bc9<\\u4ea4<\\u4f7c<\\u4faf<\\u5019\"\n"); - fprintf(out, " \"<\\u5016<\\u5149<\\u516c<\\u529f<\\u52b9<\\u52fe<\\u539a<\\u53e3<\\u5411\"\n"); - fprintf(out, " \"<\\u540e<\\u5589<\\u5751<\\u57a2<\\u597d<\\u5b54<\\u5b5d<\\u5b8f<\\u5de5\"\n"); - fprintf(out, " \"<\\u5de7<\\u5df7<\\u5e78<\\u5e83<\\u5e9a<\\u5eb7<\\u5f18<\\u6052<\\u614c\"\n"); - fprintf(out, " \"<\\u6297<\\u62d8<\\u63a7<\\u653b<\\u6602<\\u6643<\\u66f4<\\u676d<\\u6821\"\n"); - fprintf(out, " \"<\\u6897<\\u69cb<\\u6c5f<\\u6d2a<\\u6d69<\\u6e2f<\\u6e9d<\\u7532<\\u7687\"\n"); - fprintf(out, " \"<\\u786c<\\u7a3f<\\u7ce0<\\u7d05<\\u7d18<\\u7d5e<\\u7db1<\\u8015<\\u8003\"\n"); - fprintf(out, " \"<\\u80af<\\u80b1<\\u8154<\\u818f<\\u822a<\\u8352<\\u884c<\\u8861<\\u8b1b\"\n"); - fprintf(out, " \"<\\u8ca2<\\u8cfc<\\u90ca<\\u9175<\\u9271<\\u783f<\\u92fc<\\u95a4<\\u964d\"\n"); - fprintf(out, " \"<\\u9805<\\u9999<\\u9ad8<\\u9d3b<\\u525b<\\u52ab<\\u53f7<\\u5408<\\u58d5\"\n"); - fprintf(out, " \"<\\u62f7<\\u6fe0<\\u8c6a<\\u8f5f<\\u9eb9<\\u514b<\\u523b<\\u544a<\\u56fd\"\n"); - fprintf(out, " \"<\\u7a40<\\u9177<\\u9d60<\\u9ed2<\\u7344<\\u6f09<\\u8170<\\u7511<\\u5ffd\"\n"); - fprintf(out, " \"<\\u60da<\\u9aa8<\\u72db<\\u8fbc<\\u6b64<\\u9803<\\u4eca<\\u56f0<\\u5764\"\n"); - fprintf(out, " \"<\\u58be<\\u5a5a<\\u6068<\\u61c7<\\u660f<\\u6606<\\u6839<\\u68b1<\\u6df7\"\n"); - fprintf(out, " \"<\\u75d5<\\u7d3a<\\u826e<\\u9b42<\\u4e9b<\\u4f50<\\u53c9<\\u5506<\\u5d6f\"\n"); - fprintf(out, " \"<\\u5de6<\\u5dee<\\u67fb<\\u6c99<\\u7473<\\u7802<\\u8a50<\\u9396<\\u88df\"\n"); - fprintf(out, " \"<\\u5750<\\u5ea7<\\u632b<\\u50b5<\\u50ac<\\u518d<\\u6700<\\u54c9<\\u585e\"\n"); - fprintf(out, " \"<\\u59bb<\\u5bb0<\\u5f69<\\u624d<\\u63a1<\\u683d<\\u6b73<\\u6e08<\\u707d\"\n"); - fprintf(out, " \"<\\u91c7<\\u7280<\\u7815<\\u7826<\\u796d<\\u658e<\\u7d30<\\u83dc<\\u88c1\"\n"); - fprintf(out, " \"<\\u8f09<\\u969b<\\u5264<\\u5728<\\u6750<\\u7f6a<\\u8ca1<\\u51b4<\\u5742\"\n"); - fprintf(out, " \"<\\u962a<\\u583a<\\u698a<\\u80b4<\\u54b2<\\u5d0e<\\u57fc<\\u7895<\\u9dfa\"\n"); - fprintf(out, " \"<\\u4f5c<\\u524a<\\u548b<\\u643e<\\u6628<\\u6714<\\u67f5<\\u7a84<\\u7b56\"\n"); - fprintf(out, " \"<\\u7d22<\\u932f<\\u685c<\\u9bad<\\u7b39<\\u5319<\\u518a<\\u5237<\\u5bdf\"\n"); - fprintf(out, " \"<\\u62f6<\\u64ae<\\u64e6<\\u672d<\\u6bba<\\u85a9<\\u96d1<\\u7690<\\u9bd6\"\n"); - fprintf(out, " \"<\\u634c<\\u9306<\\u9bab<\\u76bf<\\u6652<\\u4e09<\\u5098<\\u53c2<\\u5c71\"\n"); - fprintf(out, " \"<\\u60e8<\\u6492<\\u6563<\\u685f<\\u71e6<\\u73ca<\\u7523<\\u7b97<\\u7e82\"\n"); - fprintf(out, " \"<\\u8695<\\u8b83<\\u8cdb<\\u9178<\\u9910<\\u65ac<\\u66ab<\\u6b8b<\\u4ed5\"\n"); - fprintf(out, " \"<\\u4ed4<\\u4f3a<\\u4f7f<\\u523a<\\u53f8<\\u53f2<\\u55e3<\\u56db<\\u58eb\"\n"); - fprintf(out, " \"<\\u59cb<\\u59c9<\\u59ff<\\u5b50<\\u5c4d<\\u5e02<\\u5e2b<\\u5fd7<\\u601d\"\n"); - fprintf(out, " \"<\\u6307<\\u652f<\\u5b5c<\\u65af<\\u65bd<\\u65e8<\\u679d<\\u6b62<\\u6b7b\"\n"); - fprintf(out, " \"<\\u6c0f<\\u7345<\\u7949<\\u79c1<\\u7cf8<\\u7d19<\\u7d2b<\\u80a2<\\u8102\"\n"); - fprintf(out, " \"<\\u81f3<\\u8996<\\u8a5e<\\u8a69<\\u8a66<\\u8a8c<\\u8aee<\\u8cc7<\\u8cdc\"\n"); - fprintf(out, " \"<\\u96cc<\\u98fc<\\u6b6f<\\u4e8b<\\u4f3c<\\u4f8d<\\u5150<\\u5b57<\\u5bfa\"\n"); - fprintf(out, " \"<\\u6148<\\u6301<\\u6642<\\u6b21<\\u6ecb<\\u6cbb<\\u723e<\\u74bd<\\u75d4\"\n"); - fprintf(out, " \"<\\u78c1<\\u793a<\\u800c<\\u8033<\\u81ea<\\u8494<\\u8f9e<\\u6c50<\\u9e7f\"\n"); - fprintf(out, " \"<\\u5f0f<\\u8b58<\\u9d2b<\\u7afa<\\u8ef8<\\u5b8d<\\u96eb<\\u4e03<\\u53f1\"\n"); - fprintf(out, " \"<\\u57f7<\\u5931<\\u5ac9<\\u5ba4<\\u6089<\\u6e7f<\\u6f06<\\u75be<\\u8cea\"\n"); - fprintf(out, " \"<\\u5b9f<\\u8500<\\u7be0<\\u5072<\\u67f4<\\u829d<\\u5c61<\\u854a<\\u7e1e\"\n"); - fprintf(out, " \"<\\u820e<\\u5199<\\u5c04<\\u6368<\\u8d66<\\u659c<\\u716e<\\u793e<\\u7d17\"\n"); - fprintf(out, " \"<\\u8005<\\u8b1d<\\u8eca<\\u906e<\\u86c7<\\u90aa<\\u501f<\\u52fa<\\u5c3a\"\n"); - fprintf(out, " \"<\\u6753<\\u707c<\\u7235<\\u914c<\\u91c8<\\u932b<\\u82e5<\\u5bc2<\\u5f31\"\n"); - fprintf(out, " \"<\\u60f9<\\u4e3b<\\u53d6<\\u5b88<\\u624b<\\u6731<\\u6b8a<\\u72e9<\\u73e0\"\n"); - fprintf(out, " \"<\\u7a2e<\\u816b<\\u8da3<\\u9152<\\u9996<\\u5112<\\u53d7<\\u546a<\\u5bff\"\n"); - fprintf(out, " \"<\\u6388<\\u6a39<\\u7dac<\\u9700<\\u56da<\\u53ce<\\u5468<\\u5b97<\\u5c31\"\n"); - fprintf(out, " \"<\\u5dde<\\u4fee<\\u6101<\\u62fe<\\u6d32<\\u79c0<\\u79cb<\\u7d42<\\u7e4d\"\n"); - fprintf(out, " \"<\\u7fd2<\\u81ed<\\u821f<\\u8490<\\u8846<\\u8972<\\u8b90<\\u8e74<\\u8f2f\"\n"); - fprintf(out, " \"<\\u9031<\\u914b<\\u916c<\\u96c6<\\u919c<\\u4ec0<\\u4f4f<\\u5145<\\u5341\"\n"); - fprintf(out, " \"<\\u5f93<\\u620e<\\u67d4<\\u6c41<\\u6e0b<\\u7363<\\u7e26<\\u91cd<\\u9283\"\n"); - fprintf(out, " \"<\\u53d4<\\u5919<\\u5bbf<\\u6dd1<\\u795d<\\u7e2e<\\u7c9b<\\u587e<\\u719f\"\n"); - fprintf(out, " \"<\\u51fa<\\u8853<\\u8ff0<\\u4fca<\\u5cfb<\\u6625<\\u77ac<\\u7ae3<\\u821c\"\n"); - fprintf(out, " \"<\\u99ff<\\u51c6<\\u5faa<\\u65ec<\\u696f<\\u6b89<\\u6df3<\\u6e96<\\u6f64\"\n"); - fprintf(out, " \"<\\u76fe<\\u7d14<\\u5de1<\\u9075<\\u9187<\\u9806<\\u51e6<\\u521d<\\u6240\"\n"); - fprintf(out, " \"<\\u6691<\\u66d9<\\u6e1a<\\u5eb6<\\u7dd2<\\u7f72<\\u66f8<\\u85af<\\u85f7\"\n"); - fprintf(out, " \"<\\u8af8<\\u52a9<\\u53d9<\\u5973<\\u5e8f<\\u5f90<\\u6055<\\u92e4<\\u9664\"\n"); - fprintf(out, " \"<\\u50b7<\\u511f<\\u52dd<\\u5320<\\u5347<\\u53ec<\\u54e8<\\u5546<\\u5531\"\n"); - fprintf(out, " \"<\\u5617<\\u5968<\\u59be<\\u5a3c<\\u5bb5<\\u5c06<\\u5c0f<\\u5c11<\\u5c1a\"\n"); - fprintf(out, " \"<\\u5e84<\\u5e8a<\\u5ee0<\\u5f70<\\u627f<\\u6284<\\u62db<\\u638c<\\u6377\"\n"); - fprintf(out, " \"<\\u6607<\\u660c<\\u662d<\\u6676<\\u677e<\\u68a2<\\u6a1f<\\u6a35<\\u6cbc\"\n"); - fprintf(out, " \"<\\u6d88<\\u6e09<\\u6e58<\\u713c<\\u7126<\\u7167<\\u75c7<\\u7701<\\u785d\"\n"); - fprintf(out, " \"<\\u7901<\\u7965<\\u79f0<\\u7ae0<\\u7b11<\\u7ca7<\\u7d39<\\u8096<\\u83d6\"\n"); - fprintf(out, " \"<\\u848b<\\u8549<\\u885d<\\u88f3<\\u8a1f<\\u8a3c<\\u8a54<\\u8a73<\\u8c61\"\n"); - fprintf(out, " \"<\\u8cde<\\u91a4<\\u9266<\\u937e<\\u9418<\\u969c<\\u9798<\\u4e0a<\\u4e08\"\n"); - fprintf(out, " \"<\\u4e1e<\\u4e57<\\u5197<\\u5270<\\u57ce<\\u5834<\\u58cc<\\u5b22<\\u5e38\"\n"); - fprintf(out, " \"<\\u60c5<\\u64fe<\\u6761<\\u6756<\\u6d44<\\u72b6<\\u7573<\\u7a63<\\u84b8\"\n"); - fprintf(out, " \"<\\u8b72<\\u91b8<\\u9320<\\u5631<\\u57f4<\\u98fe<\\u62ed<\\u690d<\\u6b96\"\n"); - fprintf(out, " \"<\\u71ed<\\u7e54<\\u8077<\\u8272<\\u89e6<\\u98df<\\u8755<\\u8fb1<\\u5c3b\"\n"); - fprintf(out, " \"<\\u4f38<\\u4fe1<\\u4fb5<\\u5507<\\u5a20<\\u5bdd<\\u5be9<\\u5fc3<\\u614e\"\n"); - fprintf(out, " \"<\\u632f<\\u65b0<\\u664b<\\u68ee<\\u699b<\\u6d78<\\u6df1<\\u7533<\\u75b9\"\n"); - fprintf(out, " \"<\\u771f<\\u795e<\\u79e6<\\u7d33<\\u81e3<\\u82af<\\u85aa<\\u89aa<\\u8a3a\"\n"); - fprintf(out, " \"<\\u8eab<\\u8f9b<\\u9032<\\u91dd<\\u9707<\\u4eba<\\u4ec1<\\u5203<\\u5875\"\n"); - fprintf(out, " \"<\\u58ec<\\u5c0b<\\u751a<\\u5c3d<\\u814e<\\u8a0a<\\u8fc5<\\u9663<\\u976d\"\n"); - fprintf(out, " \"<\\u7b25<\\u8acf<\\u9808<\\u9162<\\u56f3<\\u53a8<\\u9017<\\u5439<\\u5782\"\n"); - fprintf(out, " \"<\\u5e25<\\u63a8<\\u6c34<\\u708a<\\u7761<\\u7c8b<\\u7fe0<\\u8870<\\u9042\"\n"); - fprintf(out, " \"<\\u9154<\\u9310<\\u9318<\\u968f<\\u745e<\\u9ac4<\\u5d07<\\u5d69<\\u6570\"\n"); - fprintf(out, " \"<\\u67a2<\\u8da8<\\u96db<\\u636e<\\u6749<\\u6919<\\u83c5<\\u9817<\\u96c0\"\n"); - fprintf(out, " \"<\\u88fe<\\u6f84<\\u647a<\\u5bf8<\\u4e16<\\u702c<\\u755d<\\u662f<\\u51c4\"\n"); - fprintf(out, " \"<\\u5236<\\u52e2<\\u59d3<\\u5f81<\\u6027<\\u6210<\\u653f<\\u6574<\\u661f\"\n"); - fprintf(out, " \"<\\u6674<\\u68f2<\\u6816<\\u6b63<\\u6e05<\\u7272<\\u751f<\\u76db<\\u7cbe\"\n"); - fprintf(out, " \"<\\u8056<\\u58f0<\\u88fd<\\u897f<\\u8aa0<\\u8a93<\\u8acb<\\u901d<\\u9192\"\n"); - fprintf(out, " \"<\\u9752<\\u9759<\\u6589<\\u7a0e<\\u8106<\\u96bb<\\u5e2d<\\u60dc<\\u621a\"\n"); - fprintf(out, " \"<\\u65a5<\\u6614<\\u6790<\\u77f3<\\u7a4d<\\u7c4d<\\u7e3e<\\u810a<\\u8cac\"\n"); - fprintf(out, " \"<\\u8d64<\\u8de1<\\u8e5f<\\u78a9<\\u5207<\\u62d9<\\u63a5<\\u6442<\\u6298\"\n"); - fprintf(out, " \"<\\u8a2d<\\u7a83<\\u7bc0<\\u8aac<\\u96ea<\\u7d76<\\u820c<\\u8749<\\u4ed9\"\n"); - fprintf(out, " \"<\\u5148<\\u5343<\\u5360<\\u5ba3<\\u5c02<\\u5c16<\\u5ddd<\\u6226<\\u6247\"\n"); - fprintf(out, " \"<\\u64b0<\\u6813<\\u6834<\\u6cc9<\\u6d45<\\u6d17<\\u67d3<\\u6f5c<\\u714e\"\n"); - fprintf(out, " \"<\\u717d<\\u65cb<\\u7a7f<\\u7bad<\\u7dda<\\u7e4a<\\u7fa8<\\u817a<\\u821b\"\n"); - fprintf(out, " \"<\\u8239<\\u85a6<\\u8a6e<\\u8cce<\\u8df5<\\u9078<\\u9077<\\u92ad<\\u9291\"\n"); - fprintf(out, " \"<\\u9583<\\u9bae<\\u524d<\\u5584<\\u6f38<\\u7136<\\u5168<\\u7985<\\u7e55\"\n"); - fprintf(out, " \"<\\u81b3<\\u7cce<\\u564c<\\u5851<\\u5ca8<\\u63aa<\\u66fe<\\u66fd<\\u695a\"\n"); - fprintf(out, " \"<\\u72d9<\\u758f<\\u758e<\\u790e<\\u7956<\\u79df<\\u7c97<\\u7d20<\\u7d44\"\n"); - fprintf(out, " \"<\\u8607<\\u8a34<\\u963b<\\u9061<\\u9f20<\\u50e7<\\u5275<\\u53cc<\\u53e2\"\n"); - fprintf(out, " \"<\\u5009<\\u55aa<\\u58ee<\\u594f<\\u723d<\\u5b8b<\\u5c64<\\u531d<\\u60e3\"\n"); - fprintf(out, " \"<\\u60f3<\\u635c<\\u6383<\\u633f<\\u63bb<\\u64cd<\\u65e9<\\u66f9<\\u5de3\"\n"); - fprintf(out, " \"<\\u69cd<\\u69fd<\\u6f15<\\u71e5<\\u4e89<\\u75e9<\\u76f8<\\u7a93<\\u7cdf\"\n"); - fprintf(out, " \"<\\u7dcf<\\u7d9c<\\u8061<\\u8349<\\u8358<\\u846c<\\u84bc<\\u85fb<\\u88c5\"\n"); - fprintf(out, " \"<\\u8d70<\\u9001<\\u906d<\\u9397<\\u971c<\\u9a12<\\u50cf<\\u5897<\\u618e\"\n"); - fprintf(out, " \"<\\u81d3<\\u8535<\\u8d08<\\u9020<\\u4fc3<\\u5074<\\u5247<\\u5373<\\u606f\"\n"); - fprintf(out, " \"<\\u6349<\\u675f<\\u6e2c<\\u8db3<\\u901f<\\u4fd7<\\u5c5e<\\u8cca<\\u65cf\"\n"); - fprintf(out, " \"<\\u7d9a<\\u5352<\\u8896<\\u5176<\\u63c3<\\u5b58<\\u5b6b<\\u5c0a<\\u640d\"\n"); - fprintf(out, " \"<\\u6751<\\u905c<\\u4ed6<\\u591a<\\u592a<\\u6c70<\\u8a51<\\u553e<\\u5815\"\n"); - fprintf(out, " \"<\\u59a5<\\u60f0<\\u6253<\\u67c1<\\u8235<\\u6955<\\u9640<\\u99c4<\\u9a28\"\n"); - fprintf(out, " \"<\\u4f53<\\u5806<\\u5bfe<\\u8010<\\u5cb1<\\u5e2f<\\u5f85<\\u6020<\\u614b\"\n"); - fprintf(out, " \"<\\u6234<\\u66ff<\\u6cf0<\\u6ede<\\u80ce<\\u817f<\\u82d4<\\u888b<\\u8cb8\"\n"); - fprintf(out, " \"<\\u9000<\\u902e<\\u968a<\\u9edb<\\u9bdb<\\u4ee3<\\u53f0<\\u5927<\\u7b2c\"\n"); - fprintf(out, " \"<\\u918d<\\u984c<\\u9df9<\\u6edd<\\u7027<\\u5353<\\u5544<\\u5b85<\\u6258\"\n"); - fprintf(out, " \"<\\u629e<\\u62d3<\\u6ca2<\\u6fef<\\u7422<\\u8a17<\\u9438<\\u6fc1<\\u8afe\"\n"); - fprintf(out, " \"<\\u8338<\\u51e7<\\u86f8<\\u53ea<\\u53e9<\\u4f46<\\u9054<\\u8fb0<\\u596a\"\n"); - fprintf(out, " \"<\\u8131<\\u5dfd<\\u7aea<\\u8fbf<\\u68da<\\u8c37<\\u72f8<\\u9c48<\\u6a3d\"\n"); - fprintf(out, " \"<\\u8ab0<\\u4e39<\\u5358<\\u5606<\\u5766<\\u62c5<\\u63a2<\\u65e6<\\u6b4e\"\n"); - fprintf(out, " \"<\\u6de1<\\u6e5b<\\u70ad<\\u77ed<\\u7aef<\\u7baa<\\u7dbb<\\u803d<\\u80c6\"\n"); - fprintf(out, " \"<\\u86cb<\\u8a95<\\u935b<\\u56e3<\\u58c7<\\u5f3e<\\u65ad<\\u6696<\\u6a80\"\n"); - fprintf(out, " \"<\\u6bb5<\\u7537<\\u8ac7<\\u5024<\\u77e5<\\u5730<\\u5f1b<\\u6065<\\u667a\"\n"); - fprintf(out, " \"<\\u6c60<\\u75f4<\\u7a1a<\\u7f6e<\\u81f4<\\u8718<\\u9045<\\u99b3<\\u7bc9\"\n"); - fprintf(out, " \"<\\u755c<\\u7af9<\\u7b51<\\u84c4<\\u9010<\\u79e9<\\u7a92<\\u8336<\\u5ae1\"\n"); - fprintf(out, " \"<\\u7740<\\u4e2d<\\u4ef2<\\u5b99<\\u5fe0<\\u62bd<\\u663c<\\u67f1<\\u6ce8\"\n"); - fprintf(out, " \"<\\u866b<\\u8877<\\u8a3b<\\u914e<\\u92f3<\\u99d0<\\u6a17<\\u7026<\\u732a\"\n"); - fprintf(out, " \"<\\u82e7<\\u8457<\\u8caf<\\u4e01<\\u5146<\\u51cb<\\u558b<\\u5bf5<\\u5e16\"\n"); - fprintf(out, " \"<\\u5e33<\\u5e81<\\u5f14<\\u5f35<\\u5f6b<\\u5fb4<\\u61f2<\\u6311<\\u66a2\"\n"); - fprintf(out, " \"<\\u671d<\\u6f6e<\\u7252<\\u753a<\\u773a<\\u8074<\\u8139<\\u8178<\\u8776\"\n"); - fprintf(out, " \"<\\u8abf<\\u8adc<\\u8d85<\\u8df3<\\u929a<\\u9577<\\u9802<\\u9ce5<\\u52c5\"\n"); - fprintf(out, " \"<\\u6357<\\u76f4<\\u6715<\\u6c88<\\u73cd<\\u8cc3<\\u93ae<\\u9673<\\u6d25\"\n"); - fprintf(out, " \"<\\u589c<\\u690e<\\u69cc<\\u8ffd<\\u939a<\\u75db<\\u901a<\\u585a<\\u6802\"\n"); - fprintf(out, " \"<\\u63b4<\\u69fb<\\u4f43<\\u6f2c<\\u67d8<\\u8fbb<\\u8526<\\u7db4<\\u9354\"\n"); - fprintf(out, " \"<\\u693f<\\u6f70<\\u576a<\\u58f7<\\u5b2c<\\u7d2c<\\u722a<\\u540a<\\u91e3\"\n"); - fprintf(out, " \"<\\u9db4<\\u4ead<\\u4f4e<\\u505c<\\u5075<\\u5243<\\u8c9e<\\u5448<\\u5824\"\n"); - fprintf(out, " \"<\\u5b9a<\\u5e1d<\\u5e95<\\u5ead<\\u5ef7<\\u5f1f<\\u608c<\\u62b5<\\u633a\"\n"); - fprintf(out, " \"<\\u63d0<\\u68af<\\u6c40<\\u7887<\\u798e<\\u7a0b<\\u7de0<\\u8247<\\u8a02\"\n"); - fprintf(out, " \"<\\u8ae6<\\u8e44<\\u9013<\\u90b8<\\u912d<\\u91d8<\\u9f0e<\\u6ce5<\\u6458\"\n"); - fprintf(out, " \"<\\u64e2<\\u6575<\\u6ef4<\\u7684<\\u7b1b<\\u9069<\\u93d1<\\u6eba<\\u54f2\"\n"); - fprintf(out, " \"<\\u5fb9<\\u64a4<\\u8f4d<\\u8fed<\\u9244<\\u5178<\\u586b<\\u5929<\\u5c55\"\n"); - fprintf(out, " \"<\\u5e97<\\u6dfb<\\u7e8f<\\u751c<\\u8cbc<\\u8ee2<\\u985b<\\u70b9<\\u4f1d\"\n"); - fprintf(out, " \"<\\u6bbf<\\u6fb1<\\u7530<\\u96fb<\\u514e<\\u5410<\\u5835<\\u5857<\\u59ac\"\n"); - fprintf(out, " \"<\\u5c60<\\u5f92<\\u6597<\\u675c<\\u6e21<\\u767b<\\u83df<\\u8ced<\\u9014\"\n"); - fprintf(out, " \"<\\u90fd<\\u934d<\\u7825<\\u783a<\\u52aa<\\u5ea6<\\u571f<\\u5974<\\u6012\"\n"); - fprintf(out, " \"<\\u5012<\\u515a<\\u51ac<\\u51cd<\\u5200<\\u5510<\\u5854<\\u5858<\\u5957\"\n"); - fprintf(out, " \"<\\u5b95<\\u5cf6<\\u5d8b<\\u60bc<\\u6295<\\u642d<\\u6771<\\u6843<\\u68bc\"\n"); - fprintf(out, " \"<\\u68df<\\u76d7<\\u6dd8<\\u6e6f<\\u6d9b<\\u706f<\\u71c8<\\u5f53<\\u75d8\"\n"); - fprintf(out, " \"<\\u7977<\\u7b49<\\u7b54<\\u7b52<\\u7cd6<\\u7d71<\\u5230<\\u8463<\\u8569\"\n"); - fprintf(out, " \"<\\u85e4<\\u8a0e<\\u8b04<\\u8c46<\\u8e0f<\\u9003<\\u900f<\\u9419<\\u9676\"\n"); - fprintf(out, " \"<\\u982d<\\u9a30<\\u95d8<\\u50cd<\\u52d5<\\u540c<\\u5802<\\u5c0e<\\u61a7\"\n"); - fprintf(out, " \"<\\u649e<\\u6d1e<\\u77b3<\\u7ae5<\\u80f4<\\u8404<\\u9053<\\u9285<\\u5ce0\"\n"); - fprintf(out, " \"<\\u9d07<\\u533f<\\u5f97<\\u5fb3<\\u6d9c<\\u7279<\\u7763<\\u79bf<\\u7be4\"\n"); - fprintf(out, " \"<\\u6bd2<\\u72ec<\\u8aad<\\u6803<\\u6a61<\\u51f8<\\u7a81<\\u6934<\\u5c4a\"\n"); - fprintf(out, " \"<\\u9cf6<\\u82eb<\\u5bc5<\\u9149<\\u701e<\\u5678<\\u5c6f<\\u60c7<\\u6566\"\n"); - fprintf(out, " \"<\\u6c8c<\\u8c5a<\\u9041<\\u9813<\\u5451<\\u66c7<\\u920d<\\u5948<\\u90a3\"\n"); - fprintf(out, " \"<\\u5185<\\u4e4d<\\u51ea<\\u8599<\\u8b0e<\\u7058<\\u637a<\\u934b<\\u6962\"\n"); - fprintf(out, " \"<\\u99b4<\\u7e04<\\u7577<\\u5357<\\u6960<\\u8edf<\\u96e3<\\u6c5d<\\u4e8c\"\n"); - fprintf(out, " \"<\\u5c3c<\\u5f10<\\u8fe9<\\u5302<\\u8cd1<\\u8089<\\u8679<\\u5eff<\\u65e5\"\n"); - fprintf(out, " \"<\\u4e73<\\u5165<\\u5982<\\u5c3f<\\u97ee<\\u4efb<\\u598a<\\u5fcd<\\u8a8d\"\n"); - fprintf(out, " \"<\\u6fe1<\\u79b0<\\u7962<\\u5be7<\\u8471<\\u732b<\\u71b1<\\u5e74<\\u5ff5\"\n"); - fprintf(out, " \"<\\u637b<\\u649a<\\u71c3<\\u7c98<\\u4e43<\\u5efc<\\u4e4b<\\u57dc<\\u56a2\"\n"); - fprintf(out, " \"<\\u60a9<\\u6fc3<\\u7d0d<\\u80fd<\\u8133<\\u81bf<\\u8fb2<\\u8997<\\u86a4\"\n"); - fprintf(out, " \"<\\u5df4<\\u628a<\\u64ad<\\u8987<\\u6777<\\u6ce2<\\u6d3e<\\u7436<\\u7834\"\n"); - fprintf(out, " \"<\\u5a46<\\u7f75<\\u82ad<\\u99ac<\\u4ff3<\\u5ec3<\\u62dd<\\u6392<\\u6557\"\n"); - fprintf(out, " \"<\\u676f<\\u76c3<\\u724c<\\u80cc<\\u80ba<\\u8f29<\\u914d<\\u500d<\\u57f9\"\n"); - fprintf(out, " \"<\\u5a92<\\u6885<\\u6973<\\u7164<\\u72fd<\\u8cb7<\\u58f2<\\u8ce0<\\u966a\"\n"); - fprintf(out, " \"<\\u9019<\\u877f<\\u79e4<\\u77e7<\\u8429<\\u4f2f<\\u5265<\\u535a<\\u62cd\"\n"); - fprintf(out, " \"<\\u67cf<\\u6cca<\\u767d<\\u7b94<\\u7c95<\\u8236<\\u8584<\\u8feb<\\u66dd\"\n"); - fprintf(out, " \"<\\u6f20<\\u7206<\\u7e1b<\\u83ab<\\u99c1<\\u9ea6<\\u51fd<\\u7bb1<\\u7872\"\n"); - fprintf(out, " \"<\\u7bb8<\\u8087<\\u7b48<\\u6ae8<\\u5e61<\\u808c<\\u7551<\\u7560<\\u516b\"\n"); - fprintf(out, " \"<\\u9262<\\u6e8c<\\u767a<\\u9197<\\u9aea<\\u4f10<\\u7f70<\\u629c<\\u7b4f\"\n"); - fprintf(out, " \"<\\u95a5<\\u9ce9<\\u567a<\\u5859<\\u86e4<\\u96bc<\\u4f34<\\u5224<\\u534a\"\n"); - fprintf(out, " \"<\\u53cd<\\u53db<\\u5e06<\\u642c<\\u6591<\\u677f<\\u6c3e<\\u6c4e<\\u7248\"\n"); - fprintf(out, " \"<\\u72af<\\u73ed<\\u7554<\\u7e41<\\u822c<\\u85e9<\\u8ca9<\\u7bc4<\\u91c6\"\n"); - fprintf(out, " \"<\\u7169<\\u9812<\\u98ef<\\u633d<\\u6669<\\u756a<\\u76e4<\\u78d0<\\u8543\"\n"); - fprintf(out, " \"<\\u86ee<\\u532a<\\u5351<\\u5426<\\u5983<\\u5e87<\\u5f7c<\\u60b2<\\u6249\"\n"); - fprintf(out, " \"<\\u6279<\\u62ab<\\u6590<\\u6bd4<\\u6ccc<\\u75b2<\\u76ae<\\u7891<\\u79d8\"\n"); - fprintf(out, " \"<\\u7dcb<\\u7f77<\\u80a5<\\u88ab<\\u8ab9<\\u8cbb<\\u907f<\\u975e<\\u98db\"\n"); - fprintf(out, " \"<\\u6a0b<\\u7c38<\\u5099<\\u5c3e<\\u5fae<\\u6787<\\u6bd8<\\u7435<\\u7709\"\n"); - fprintf(out, " \"<\\u7f8e<\\u9f3b<\\u67ca<\\u7a17<\\u5339<\\u758b<\\u9aed<\\u5f66<\\u819d\"\n"); - fprintf(out, " \"<\\u83f1<\\u8098<\\u5f3c<\\u5fc5<\\u7562<\\u7b46<\\u903c<\\u6867<\\u59eb\"\n"); - fprintf(out, " \"<\\u5a9b<\\u7d10<\\u767e<\\u8b2c<\\u4ff5<\\u5f6a<\\u6a19<\\u6c37<\\u6f02\"\n"); - fprintf(out, " \"<\\u74e2<\\u7968<\\u8868<\\u8a55<\\u8c79<\\u5edf<\\u63cf<\\u75c5<\\u79d2\"\n"); - fprintf(out, " \"<\\u82d7<\\u9328<\\u92f2<\\u849c<\\u86ed<\\u9c2d<\\u54c1<\\u5f6c<\\u658c\"\n"); - fprintf(out, " \"<\\u6d5c<\\u7015<\\u8ca7<\\u8cd3<\\u983b<\\u654f<\\u74f6<\\u4e0d<\\u4ed8\"\n"); - fprintf(out, " \"<\\u57e0<\\u592b<\\u5a66<\\u5bcc<\\u51a8<\\u5e03<\\u5e9c<\\u6016<\\u6276\"\n"); - fprintf(out, " \"<\\u6577<\\u65a7<\\u666e<\\u6d6e<\\u7236<\\u7b26<\\u8150<\\u819a<\\u8299\"\n"); - fprintf(out, " \"<\\u8b5c<\\u8ca0<\\u8ce6<\\u8d74<\\u961c<\\u9644<\\u4fae<\\u64ab<\\u6b66\"\n"); - fprintf(out, " \"<\\u821e<\\u8461<\\u856a<\\u90e8<\\u5c01<\\u6953<\\u98a8<\\u847a<\\u8557\"\n"); - fprintf(out, " \"<\\u4f0f<\\u526f<\\u5fa9<\\u5e45<\\u670d<\\u798f<\\u8179<\\u8907<\\u8986\"\n"); - fprintf(out, " \"<\\u6df5<\\u5f17<\\u6255<\\u6cb8<\\u4ecf<\\u7269<\\u9b92<\\u5206<\\u543b\"\n"); - fprintf(out, " \"<\\u5674<\\u58b3<\\u61a4<\\u626e<\\u711a<\\u596e<\\u7c89<\\u7cde<\\u7d1b\"\n"); - fprintf(out, " \"<\\u96f0<\\u6587<\\u805e<\\u4e19<\\u4f75<\\u5175<\\u5840<\\u5e63<\\u5e73\"\n"); - fprintf(out, " \"<\\u5f0a<\\u67c4<\\u4e26<\\u853d<\\u9589<\\u965b<\\u7c73<\\u9801<\\u50fb\"\n"); - fprintf(out, " \"<\\u58c1<\\u7656<\\u78a7<\\u5225<\\u77a5<\\u8511<\\u7b86<\\u504f<\\u5909\"\n"); - fprintf(out, " \"<\\u7247<\\u7bc7<\\u7de8<\\u8fba<\\u8fd4<\\u904d<\\u4fbf<\\u52c9<\\u5a29\"\n"); - fprintf(out, " \"<\\u5f01<\\u97ad<\\u4fdd<\\u8217<\\u92ea<\\u5703<\\u6355<\\u6b69<\\u752b\"\n"); - fprintf(out, " \"<\\u88dc<\\u8f14<\\u7a42<\\u52df<\\u5893<\\u6155<\\u620a<\\u66ae<\\u6bcd\"\n"); - fprintf(out, " \"<\\u7c3f<\\u83e9<\\u5023<\\u4ff8<\\u5305<\\u5446<\\u5831<\\u5949<\\u5b9d\"\n"); - fprintf(out, " \"<\\u5cf0<\\u5cef<\\u5d29<\\u5e96<\\u62b1<\\u6367<\\u653e<\\u65b9<\\u670b\"\n"); - fprintf(out, " \"<\\u6cd5<\\u6ce1<\\u70f9<\\u7832<\\u7e2b<\\u80de<\\u82b3<\\u840c<\\u84ec\"\n"); - fprintf(out, " \"<\\u8702<\\u8912<\\u8a2a<\\u8c4a<\\u90a6<\\u92d2<\\u98fd<\\u9cf3<\\u9d6c\"\n"); - fprintf(out, " \"<\\u4e4f<\\u4ea1<\\u508d<\\u5256<\\u574a<\\u59a8<\\u5e3d<\\u5fd8<\\u5fd9\"\n"); - fprintf(out, " \"<\\u623f<\\u66b4<\\u671b<\\u67d0<\\u68d2<\\u5192<\\u7d21<\\u80aa<\\u81a8\"\n"); - fprintf(out, " \"<\\u8b00<\\u8c8c<\\u8cbf<\\u927e<\\u9632<\\u5420<\\u982c<\\u5317<\\u50d5\"\n"); - fprintf(out, " \"<\\u535c<\\u58a8<\\u64b2<\\u6734<\\u7267<\\u7766<\\u7a46<\\u91e6<\\u52c3\"\n"); - fprintf(out, " \"<\\u6ca1<\\u6b86<\\u5800<\\u5e4c<\\u5954<\\u672c<\\u7ffb<\\u51e1<\\u76c6\"\n"); - fprintf(out, " \"<\\u6469<\\u78e8<\\u9b54<\\u9ebb<\\u57cb<\\u59b9<\\u6627<\\u679a<\\u6bce\"\n"); - fprintf(out, " \"<\\u54e9<\\u69d9<\\u5e55<\\u819c<\\u6795<\\u9baa<\\u67fe<\\u9c52<\\u685d\"\n"); - fprintf(out, " \"<\\u4ea6<\\u4fe3<\\u53c8<\\u62b9<\\u672b<\\u6cab<\\u8fc4<\\u4fad<\\u7e6d\"\n"); - fprintf(out, " \"<\\u9ebf<\\u4e07<\\u6162<\\u6e80<\\u6f2b<\\u8513<\\u5473<\\u672a<\\u9b45\"\n"); - fprintf(out, " \"<\\u5df3<\\u7b95<\\u5cac<\\u5bc6<\\u871c<\\u6e4a<\\u84d1<\\u7a14<\\u8108\"\n"); - fprintf(out, " \"<\\u5999<\\u7c8d<\\u6c11<\\u7720<\\u52d9<\\u5922<\\u7121<\\u725f<\\u77db\"\n"); - fprintf(out, " \"<\\u9727<\\u9d61<\\u690b<\\u5a7f<\\u5a18<\\u51a5<\\u540d<\\u547d<\\u660e\"\n"); - fprintf(out, " \"<\\u76df<\\u8ff7<\\u9298<\\u9cf4<\\u59ea<\\u725d<\\u6ec5<\\u514d<\\u68c9\"\n"); - fprintf(out, " \"<\\u7dbf<\\u7dec<\\u9762<\\u9eba<\\u6478<\\u6a21<\\u8302<\\u5984<\\u5b5f\"\n"); - fprintf(out, " \"<\\u6bdb<\\u731b<\\u76f2<\\u7db2<\\u8017<\\u8499<\\u5132<\\u6728<\\u9ed9\"\n"); - fprintf(out, " \"<\\u76ee<\\u6762<\\u52ff<\\u9905<\\u5c24<\\u623b<\\u7c7e<\\u8cb0<\\u554f\"\n"); - fprintf(out, " \"<\\u60b6<\\u7d0b<\\u9580<\\u5301<\\u4e5f<\\u51b6<\\u591c<\\u723a<\\u8036\"\n"); - fprintf(out, " \"<\\u91ce<\\u5f25<\\u77e2<\\u5384<\\u5f79<\\u7d04<\\u85ac<\\u8a33<\\u8e8d\"\n"); - fprintf(out, " \"<\\u9756<\\u67f3<\\u85ae<\\u9453<\\u6109<\\u6108<\\u6cb9<\\u7652<\\u8aed\"\n"); - fprintf(out, " \"<\\u8f38<\\u552f<\\u4f51<\\u512a<\\u52c7<\\u53cb<\\u5ba5<\\u5e7d<\\u60a0\"\n"); - fprintf(out, " \"<\\u6182<\\u63d6<\\u6709<\\u67da<\\u6e67<\\u6d8c<\\u7336<\\u7337<\\u7531\"\n"); - fprintf(out, " \"<\\u7950<\\u88d5<\\u8a98<\\u904a<\\u9091<\\u90f5<\\u96c4<\\u878d<\\u5915\"\n"); - fprintf(out, " \"<\\u4e88<\\u4f59<\\u4e0e<\\u8a89<\\u8f3f<\\u9810<\\u50ad<\\u5e7c<\\u5996\"\n"); - fprintf(out, " \"<\\u5bb9<\\u5eb8<\\u63da<\\u63fa<\\u64c1<\\u66dc<\\u694a<\\u69d8<\\u6d0b\"\n"); - fprintf(out, " \"<\\u6eb6<\\u7194<\\u7528<\\u7aaf<\\u7f8a<\\u8000<\\u8449<\\u84c9<\\u8981\"\n"); - fprintf(out, " \"<\\u8b21<\\u8e0a<\\u9065<\\u967d<\\u990a<\\u617e<\\u6291<\\u6b32<\\u6c83\"\n"); - fprintf(out, " \"<\\u6d74<\\u7fcc<\\u7ffc<\\u6dc0<\\u7f85<\\u87ba<\\u88f8<\\u6765<\\u83b1\"\n"); - fprintf(out, " \"<\\u983c<\\u96f7<\\u6d1b<\\u7d61<\\u843d<\\u916a<\\u4e71<\\u5375<\\u5d50\"\n"); - fprintf(out, " \"<\\u6b04<\\u6feb<\\u85cd<\\u862d<\\u89a7<\\u5229<\\u540f<\\u5c65<\\u674e\"\n"); - fprintf(out, " \"<\\u68a8<\\u7406<\\u7483<\\u75e2<\\u88cf<\\u88e1<\\u91cc<\\u96e2<\\u9678\"\n"); - fprintf(out, " \"<\\u5f8b<\\u7387<\\u7acb<\\u844e<\\u63a0<\\u7565<\\u5289<\\u6d41<\\u6e9c\"\n"); - fprintf(out, " \"<\\u7409<\\u7559<\\u786b<\\u7c92<\\u9686<\\u7adc<\\u9f8d<\\u4fb6<\\u616e\"\n"); - fprintf(out, " \"<\\u65c5<\\u865c<\\u4e86<\\u4eae<\\u50da<\\u4e21<\\u51cc<\\u5bee<\\u6599\"\n"); - fprintf(out, " \"<\\u6881<\\u6dbc<\\u731f<\\u7642<\\u77ad<\\u7a1c<\\u7ce7<\\u826f<\\u8ad2\"\n"); - fprintf(out, " \"<\\u907c<\\u91cf<\\u9675<\\u9818<\\u529b<\\u7dd1<\\u502b<\\u5398<\\u6797\"\n"); - fprintf(out, " \"<\\u6dcb<\\u71d0<\\u7433<\\u81e8<\\u8f2a<\\u96a3<\\u9c57<\\u9e9f<\\u7460\"\n"); - fprintf(out, " \"<\\u5841<\\u6d99<\\u7d2f<\\u985e<\\u4ee4<\\u4f36<\\u4f8b<\\u51b7<\\u52b1\"\n"); - fprintf(out, " \"<\\u5dba<\\u601c<\\u73b2<\\u793c<\\u82d3<\\u9234<\\u96b7<\\u96f6<\\u970a\"\n"); - fprintf(out, " \"<\\u9e97<\\u9f62<\\u66a6<\\u6b74<\\u5217<\\u52a3<\\u70c8<\\u88c2<\\u5ec9\"\n"); - fprintf(out, " \"<\\u604b<\\u6190<\\u6f23<\\u7149<\\u7c3e<\\u7df4<\\u806f<\\u84ee<\\u9023\"\n"); - fprintf(out, " \"<\\u932c<\\u5442<\\u9b6f<\\u6ad3<\\u7089<\\u8cc2<\\u8def<\\u9732<\\u52b4\"\n"); - fprintf(out, " \"<\\u5a41<\\u5eca<\\u5f04<\\u6717<\\u697c<\\u6994<\\u6d6a<\\u6f0f<\\u7262\"\n"); - fprintf(out, " \"<\\u72fc<\\u7bed<\\u8001<\\u807e<\\u874b<\\u90ce<\\u516d<\\u9e93<\\u7984\"\n"); - fprintf(out, " \"<\\u808b<\\u9332<\\u8ad6<\\u502d<\\u548c<\\u8a71<\\u6b6a<\\u8cc4<\\u8107\"\n"); - fprintf(out, " \"<\\u60d1<\\u67a0<\\u9df2<\\u4e99<\\u4e98<\\u9c10<\\u8a6b<\\u85c1<\\u8568\"\n"); - fprintf(out, " \"<\\u6900<\\u6e7e<\\u7897<\\u8155<\\u5f0c<\\u4e10<\\u4e15<\\u4e2a<\\u4e31\"\n"); - fprintf(out, " \"<\\u4e36<\\u4e3c<\\u4e3f<\\u4e42<\\u4e56<\\u4e58<\\u4e82<\\u4e85<\\u8c6b\"\n"); - fprintf(out, " \"<\\u4e8a<\\u8212<\\u5f0d<\\u4e8e<\\u4e9e<\\u4e9f<\\u4ea0<\\u4ea2<\\u4eb0\"\n"); - fprintf(out, " \"<\\u4eb3<\\u4eb6<\\u4ece<\\u4ecd<\\u4ec4<\\u4ec6<\\u4ec2<\\u4ed7<\\u4ede\"\n"); - fprintf(out, " \"<\\u4eed<\\u4edf<\\u4ef7<\\u4f09<\\u4f5a<\\u4f30<\\u4f5b<\\u4f5d<\\u4f57\"\n"); - fprintf(out, " \"<\\u4f47<\\u4f76<\\u4f88<\\u4f8f<\\u4f98<\\u4f7b<\\u4f69<\\u4f70<\\u4f91\"\n"); - fprintf(out, " \"<\\u4f6f<\\u4f86<\\u4f96<\\u5118<\\u4fd4<\\u4fdf<\\u4fce<\\u4fd8<\\u4fdb\"\n"); - fprintf(out, " \"<\\u4fd1<\\u4fda<\\u4fd0<\\u4fe4<\\u4fe5<\\u501a<\\u5028<\\u5014<\\u502a\"\n"); - fprintf(out, " \"<\\u5025<\\u5005<\\u4f1c<\\u4ff6<\\u5021<\\u5029<\\u502c<\\u4ffe<\\u4fef\"\n"); - fprintf(out, " \"<\\u5011<\\u5006<\\u5043<\\u5047<\\u6703<\\u5055<\\u5050<\\u5048<\\u505a\"\n"); - fprintf(out, " \"<\\u5056<\\u506c<\\u5078<\\u5080<\\u509a<\\u5085<\\u50b4<\\u50b2<\\u50c9\"\n"); - fprintf(out, " \"<\\u50ca<\\u50b3<\\u50c2<\\u50d6<\\u50de<\\u50e5<\\u50ed<\\u50e3<\\u50ee\"\n"); - fprintf(out, " \"<\\u50f9<\\u50f5<\\u5109<\\u5101<\\u5102<\\u5116<\\u5115<\\u5114<\\u511a\"\n"); - fprintf(out, " \"<\\u5121<\\u513a<\\u5137<\\u513c<\\u513b<\\u513f<\\u5140<\\u5152<\\u514c\"\n"); - fprintf(out, " \"<\\u5154<\\u5162<\\u7af8<\\u5169<\\u516a<\\u516e<\\u5180<\\u5182<\\u56d8\"\n"); - fprintf(out, " \"<\\u518c<\\u5189<\\u518f<\\u5191<\\u5193<\\u5195<\\u5196<\\u51a4<\\u51a6\"\n"); - fprintf(out, " \"<\\u51a2<\\u51a9<\\u51aa<\\u51ab<\\u51b3<\\u51b1<\\u51b2<\\u51b0<\\u51b5\"\n"); - fprintf(out, " \"<\\u51bd<\\u51c5<\\u51c9<\\u51db<\\u51e0<\\u8655<\\u51e9<\\u51ed<\\u51f0\"\n"); - fprintf(out, " \"<\\u51f5<\\u51fe<\\u5204<\\u520b<\\u5214<\\u520e<\\u5227<\\u522a<\\u522e\"\n"); - fprintf(out, " \"<\\u5233<\\u5239<\\u524f<\\u5244<\\u524b<\\u524c<\\u525e<\\u5254<\\u526a\"\n"); - fprintf(out, " \"<\\u5274<\\u5269<\\u5273<\\u527f<\\u527d<\\u528d<\\u5294<\\u5292<\\u5271\"\n"); - fprintf(out, " \"<\\u5288<\\u5291<\\u8fa8<\\u8fa7<\\u52ac<\\u52ad<\\u52bc<\\u52b5<\\u52c1\"\n"); - fprintf(out, " \"<\\u52cd<\\u52d7<\\u52de<\\u52e3<\\u52e6<\\u98ed<\\u52e0<\\u52f3<\\u52f5\"\n"); - fprintf(out, " \"<\\u52f8<\\u52f9<\\u5306<\\u5308<\\u7538<\\u530d<\\u5310<\\u530f<\\u5315\"\n"); - fprintf(out, " \"<\\u531a<\\u5323<\\u532f<\\u5331<\\u5333<\\u5338<\\u5340<\\u5346<\\u5345\"\n"); - fprintf(out, " \"<\\u4e17<\\u5349<\\u534d<\\u51d6<\\u535e<\\u5369<\\u536e<\\u5918<\\u537b\"\n"); - fprintf(out, " \"<\\u5377<\\u5382<\\u5396<\\u53a0<\\u53a6<\\u53a5<\\u53ae<\\u53b0<\\u53b6\"\n"); - fprintf(out, " \"<\\u53c3<\\u7c12<\\u96d9<\\u53df<\\u66fc<\\u71ee<\\u53ee<\\u53e8<\\u53ed\"\n"); - fprintf(out, " \"<\\u53fa<\\u5401<\\u543d<\\u5440<\\u542c<\\u542d<\\u543c<\\u542e<\\u5436\"\n"); - fprintf(out, " \"<\\u5429<\\u541d<\\u544e<\\u548f<\\u5475<\\u548e<\\u545f<\\u5471<\\u5477\"\n"); - fprintf(out, " \"<\\u5470<\\u5492<\\u547b<\\u5480<\\u5476<\\u5484<\\u5490<\\u5486<\\u54c7\"\n"); - fprintf(out, " \"<\\u54a2<\\u54b8<\\u54a5<\\u54ac<\\u54c4<\\u54c8<\\u54a8<\\u54ab<\\u54c2\"\n"); - fprintf(out, " \"<\\u54a4<\\u54be<\\u54bc<\\u54d8<\\u54e5<\\u54e6<\\u550f<\\u5514<\\u54fd\"\n"); - fprintf(out, " \"<\\u54ee<\\u54ed<\\u54fa<\\u54e2<\\u5539<\\u5540<\\u5563<\\u554c<\\u552e\"\n"); - fprintf(out, " \"<\\u555c<\\u5545<\\u5556<\\u5557<\\u5538<\\u5533<\\u555d<\\u5599<\\u5580\"\n"); - fprintf(out, " \"<\\u54af<\\u558a<\\u559f<\\u557b<\\u557e<\\u5598<\\u559e<\\u55ae<\\u557c\"\n"); - fprintf(out, " \"<\\u5583<\\u55a9<\\u5587<\\u55a8<\\u55da<\\u55c5<\\u55df<\\u55c4<\\u55dc\"\n"); - fprintf(out, " \"<\\u55e4<\\u55d4<\\u5614<\\u55f7<\\u5616<\\u55fe<\\u55fd<\\u561b<\\u55f9\"\n"); - fprintf(out, " \"<\\u564e<\\u5650<\\u71df<\\u5634<\\u5636<\\u5632<\\u5638<\\u566b<\\u5664\"\n"); - fprintf(out, " \"<\\u562f<\\u566c<\\u566a<\\u5686<\\u5680<\\u568a<\\u56a0<\\u5694<\\u568f\"\n"); - fprintf(out, " \"<\\u56a5<\\u56ae<\\u56b6<\\u56b4<\\u56c2<\\u56bc<\\u56c1<\\u56c3<\\u56c0\"\n"); - fprintf(out, " \"<\\u56c8<\\u56ce<\\u56d1<\\u56d3<\\u56d7<\\u56ee<\\u56f9<\\u5700<\\u56ff\"\n"); - fprintf(out, " \"<\\u5704<\\u5709<\\u5708<\\u570b<\\u570d<\\u5713<\\u5718<\\u5716<\\u55c7\"\n"); - fprintf(out, " \"<\\u571c<\\u5726<\\u5737<\\u5738<\\u574e<\\u573b<\\u5740<\\u574f<\\u5769\"\n"); - fprintf(out, " \"<\\u57c0<\\u5788<\\u5761<\\u577f<\\u5789<\\u5793<\\u57a0<\\u57b3<\\u57a4\"\n"); - fprintf(out, " \"<\\u57aa<\\u57b0<\\u57c3<\\u57c6<\\u57d4<\\u57d2<\\u57d3<\\u580a<\\u57d6\"\n"); - fprintf(out, " \"<\\u57e3<\\u580b<\\u5819<\\u581d<\\u5872<\\u5821<\\u5862<\\u584b<\\u5870\"\n"); - fprintf(out, " \"<\\u6bc0<\\u5852<\\u583d<\\u5879<\\u5885<\\u58b9<\\u589f<\\u58ab<\\u58ba\"\n"); - fprintf(out, " \"<\\u58de<\\u58bb<\\u58b8<\\u58ae<\\u58c5<\\u58d3<\\u58d1<\\u58d7<\\u58d9\"\n"); - fprintf(out, " \"<\\u58d8<\\u58e5<\\u58dc<\\u58e4<\\u58df<\\u58ef<\\u58fa<\\u58f9<\\u58fb\"\n"); - fprintf(out, " \"<\\u58fc<\\u58fd<\\u5902<\\u590a<\\u5910<\\u591b<\\u68a6<\\u5925<\\u592c\"\n"); - fprintf(out, " \"<\\u592d<\\u5932<\\u5938<\\u593e<\\u7ad2<\\u5955<\\u5950<\\u594e<\\u595a\"\n"); - fprintf(out, " \"<\\u5958<\\u5962<\\u5960<\\u5967<\\u596c<\\u5969<\\u5978<\\u5981<\\u599d\"\n"); - fprintf(out, " \"<\\u4f5e<\\u4fab<\\u59a3<\\u59b2<\\u59c6<\\u59e8<\\u59dc<\\u598d<\\u59d9\"\n"); - fprintf(out, " \"<\\u59da<\\u5a25<\\u5a1f<\\u5a11<\\u5a1c<\\u5a09<\\u5a1a<\\u5a40<\\u5a6c\"\n"); - fprintf(out, " \"<\\u5a49<\\u5a35<\\u5a36<\\u5a62<\\u5a6a<\\u5a9a<\\u5abc<\\u5abe<\\u5acb\"\n"); - fprintf(out, " \"<\\u5ac2<\\u5abd<\\u5ae3<\\u5ad7<\\u5ae6<\\u5ae9<\\u5ad6<\\u5afa<\\u5afb\"\n"); - fprintf(out, " \"<\\u5b0c<\\u5b0b<\\u5b16<\\u5b32<\\u5ad0<\\u5b2a<\\u5b36<\\u5b3e<\\u5b43\"\n"); - fprintf(out, " \"<\\u5b45<\\u5b40<\\u5b51<\\u5b55<\\u5b5a<\\u5b5b<\\u5b65<\\u5b69<\\u5b70\"\n"); - fprintf(out, " \"<\\u5b73<\\u5b75<\\u5b78<\\u6588<\\u5b7a<\\u5b80<\\u5b83<\\u5ba6<\\u5bb8\"\n"); - fprintf(out, " \"<\\u5bc3<\\u5bc7<\\u5bc9<\\u5bd4<\\u5bd0<\\u5be4<\\u5be6<\\u5be2<\\u5bde\"\n"); - fprintf(out, " \"<\\u5be5<\\u5beb<\\u5bf0<\\u5bf6<\\u5bf3<\\u5c05<\\u5c07<\\u5c08<\\u5c0d\"\n"); - fprintf(out, " \"<\\u5c13<\\u5c20<\\u5c22<\\u5c28<\\u5c38<\\u5c39<\\u5c41<\\u5c46<\\u5c4e\"\n"); - fprintf(out, " \"<\\u5c53<\\u5c50<\\u5c4f<\\u5b71<\\u5c6c<\\u5c6e<\\u4e62<\\u5c76<\\u5c79\"\n"); - fprintf(out, " \"<\\u5c8c<\\u5c91<\\u5c94<\\u599b<\\u5cab<\\u5cbb<\\u5cb6<\\u5cbc<\\u5cb7\"\n"); - fprintf(out, " \"<\\u5cc5<\\u5cbe<\\u5cc7<\\u5cd9<\\u5ce9<\\u5cfd<\\u5cfa<\\u5ced<\\u5d8c\"\n"); - fprintf(out, " \"<\\u5cea<\\u5d0b<\\u5d15<\\u5d17<\\u5d5c<\\u5d1f<\\u5d1b<\\u5d11<\\u5d14\"\n"); - fprintf(out, " \"<\\u5d22<\\u5d1a<\\u5d19<\\u5d18<\\u5d4c<\\u5d52<\\u5d4e<\\u5d4b<\\u5d6c\"\n"); - fprintf(out, " \"<\\u5d73<\\u5d76<\\u5d87<\\u5d84<\\u5d82<\\u5da2<\\u5d9d<\\u5dac<\\u5dae\"\n"); - fprintf(out, " \"<\\u5dbd<\\u5d90<\\u5db7<\\u5dbc<\\u5dc9<\\u5dcd<\\u5dd3<\\u5dd2<\\u5dd6\"\n"); - fprintf(out, " \"<\\u5ddb<\\u5deb<\\u5df2<\\u5df5<\\u5e0b<\\u5e1a<\\u5e19<\\u5e11<\\u5e1b\"\n"); - fprintf(out, " \"<\\u5e36<\\u5e37<\\u5e44<\\u5e43<\\u5e40<\\u5e4e<\\u5e57<\\u5e54<\\u5e5f\"\n"); - fprintf(out, " \"<\\u5e62<\\u5e64<\\u5e47<\\u5e75<\\u5e76<\\u5e7a<\\u9ebc<\\u5e7f<\\u5ea0\"\n"); - fprintf(out, " \"<\\u5ec1<\\u5ec2<\\u5ec8<\\u5ed0<\\u5ecf<\\u5ed6<\\u5ee3<\\u5edd<\\u5eda\"\n"); - fprintf(out, " \"<\\u5edb<\\u5ee2<\\u5ee1<\\u5ee8<\\u5ee9<\\u5eec<\\u5ef1<\\u5ef3<\\u5ef0\"\n"); - fprintf(out, " \"<\\u5ef4<\\u5ef8<\\u5efe<\\u5f03<\\u5f09<\\u5f5d<\\u5f5c<\\u5f0b<\\u5f11\"\n"); - fprintf(out, " \"<\\u5f16<\\u5f29<\\u5f2d<\\u5f38<\\u5f41<\\u5f48<\\u5f4c<\\u5f4e<\\u5f2f\"\n"); - fprintf(out, " \"<\\u5f51<\\u5f56<\\u5f57<\\u5f59<\\u5f61<\\u5f6d<\\u5f73<\\u5f77<\\u5f83\"\n"); - fprintf(out, " \"<\\u5f82<\\u5f7f<\\u5f8a<\\u5f88<\\u5f91<\\u5f87<\\u5f9e<\\u5f99<\\u5f98\"\n"); - fprintf(out, " \"<\\u5fa0<\\u5fa8<\\u5fad<\\u5fbc<\\u5fd6<\\u5ffb<\\u5fe4<\\u5ff8<\\u5ff1\"\n"); - fprintf(out, " \"<\\u5fdd<\\u60b3<\\u5fff<\\u6021<\\u6060<\\u6019<\\u6010<\\u6029<\\u600e\"\n"); - fprintf(out, " \"<\\u6031<\\u601b<\\u6015<\\u602b<\\u6026<\\u600f<\\u603a<\\u605a<\\u6041\"\n"); - fprintf(out, " \"<\\u606a<\\u6077<\\u605f<\\u604a<\\u6046<\\u604d<\\u6063<\\u6043<\\u6064\"\n"); - fprintf(out, " \"<\\u6042<\\u606c<\\u606b<\\u6059<\\u6081<\\u608d<\\u60e7<\\u6083<\\u609a\"\n"); - fprintf(out, " \"<\\u6084<\\u609b<\\u6096<\\u6097<\\u6092<\\u60a7<\\u608b<\\u60e1<\\u60b8\"\n"); - fprintf(out, " \"<\\u60e0<\\u60d3<\\u60b4<\\u5ff0<\\u60bd<\\u60c6<\\u60b5<\\u60d8<\\u614d\"\n"); - fprintf(out, " \"<\\u6115<\\u6106<\\u60f6<\\u60f7<\\u6100<\\u60f4<\\u60fa<\\u6103<\\u6121\"\n"); - fprintf(out, " \"<\\u60fb<\\u60f1<\\u610d<\\u610e<\\u6147<\\u613e<\\u6128<\\u6127<\\u614a\"\n"); - fprintf(out, " \"<\\u613f<\\u613c<\\u612c<\\u6134<\\u613d<\\u6142<\\u6144<\\u6173<\\u6177\"\n"); - fprintf(out, " \"<\\u6158<\\u6159<\\u615a<\\u616b<\\u6174<\\u616f<\\u6165<\\u6171<\\u615f\"\n"); - fprintf(out, " \"<\\u615d<\\u6153<\\u6175<\\u6199<\\u6196<\\u6187<\\u61ac<\\u6194<\\u619a\"\n"); - fprintf(out, " \"<\\u618a<\\u6191<\\u61ab<\\u61ae<\\u61cc<\\u61ca<\\u61c9<\\u61f7<\\u61c8\"\n"); - fprintf(out, " \"<\\u61c3<\\u61c6<\\u61ba<\\u61cb<\\u7f79<\\u61cd<\\u61e6<\\u61e3<\\u61f6\"\n"); - fprintf(out, " \"<\\u61fa<\\u61f4<\\u61ff<\\u61fd<\\u61fc<\\u61fe<\\u6200<\\u6208<\\u6209\"\n"); - fprintf(out, " \"<\\u620d<\\u620c<\\u6214<\\u621b<\\u621e<\\u6221<\\u622a<\\u622e<\\u6230\"\n"); - fprintf(out, " \"<\\u6232<\\u6233<\\u6241<\\u624e<\\u625e<\\u6263<\\u625b<\\u6260<\\u6268\"\n"); - fprintf(out, " \"<\\u627c<\\u6282<\\u6289<\\u627e<\\u6292<\\u6293<\\u6296<\\u62d4<\\u6283\"\n"); - fprintf(out, " \"<\\u6294<\\u62d7<\\u62d1<\\u62bb<\\u62cf<\\u62ff<\\u62c6<\\u64d4<\\u62c8\"\n"); - fprintf(out, " \"<\\u62dc<\\u62cc<\\u62ca<\\u62c2<\\u62c7<\\u629b<\\u62c9<\\u630c<\\u62ee\"\n"); - fprintf(out, " \"<\\u62f1<\\u6327<\\u6302<\\u6308<\\u62ef<\\u62f5<\\u6350<\\u633e<\\u634d\"\n"); - fprintf(out, " \"<\\u641c<\\u634f<\\u6396<\\u638e<\\u6380<\\u63ab<\\u6376<\\u63a3<\\u638f\"\n"); - fprintf(out, " \"<\\u6389<\\u639f<\\u63b5<\\u636b<\\u6369<\\u63be<\\u63e9<\\u63c0<\\u63c6\"\n"); - fprintf(out, " \"<\\u63e3<\\u63c9<\\u63d2<\\u63f6<\\u63c4<\\u6416<\\u6434<\\u6406<\\u6413\"\n"); - fprintf(out, " \"<\\u6426<\\u6436<\\u651d<\\u6417<\\u6428<\\u640f<\\u6467<\\u646f<\\u6476\"\n"); - fprintf(out, " \"<\\u644e<\\u652a<\\u6495<\\u6493<\\u64a5<\\u64a9<\\u6488<\\u64bc<\\u64da\"\n"); - fprintf(out, " \"<\\u64d2<\\u64c5<\\u64c7<\\u64bb<\\u64d8<\\u64c2<\\u64f1<\\u64e7<\\u8209\"\n"); - fprintf(out, " \"<\\u64e0<\\u64e1<\\u62ac<\\u64e3<\\u64ef<\\u652c<\\u64f6<\\u64f4<\\u64f2\"\n"); - fprintf(out, " \"<\\u64fa<\\u6500<\\u64fd<\\u6518<\\u651c<\\u6505<\\u6524<\\u6523<\\u652b\"\n"); - fprintf(out, " \"<\\u6534<\\u6535<\\u6537<\\u6536<\\u6538<\\u754b<\\u6548<\\u6556<\\u6555\"\n"); - fprintf(out, " \"<\\u654d<\\u6558<\\u655e<\\u655d<\\u6572<\\u6578<\\u6582<\\u6583<\\u8b8a\"\n"); - fprintf(out, " \"<\\u659b<\\u659f<\\u65ab<\\u65b7<\\u65c3<\\u65c6<\\u65c1<\\u65c4<\\u65cc\"\n"); - fprintf(out, " \"<\\u65d2<\\u65db<\\u65d9<\\u65e0<\\u65e1<\\u65f1<\\u6772<\\u660a<\\u6603\"\n"); - fprintf(out, " \"<\\u65fb<\\u6773<\\u6635<\\u6636<\\u6634<\\u661c<\\u664f<\\u6644<\\u6649\"\n"); - fprintf(out, " \"<\\u6641<\\u665e<\\u665d<\\u6664<\\u6667<\\u6668<\\u665f<\\u6662<\\u6670\"\n"); - fprintf(out, " \"<\\u6683<\\u6688<\\u668e<\\u6689<\\u6684<\\u6698<\\u669d<\\u66c1<\\u66b9\"\n"); - fprintf(out, " \"<\\u66c9<\\u66be<\\u66bc<\\u66c4<\\u66b8<\\u66d6<\\u66da<\\u66e0<\\u663f\"\n"); - fprintf(out, " \"<\\u66e6<\\u66e9<\\u66f0<\\u66f5<\\u66f7<\\u670f<\\u6716<\\u671e<\\u6726\"\n"); - fprintf(out, " \"<\\u6727<\\u9738<\\u672e<\\u673f<\\u6736<\\u6741<\\u6738<\\u6737<\\u6746\"\n"); - fprintf(out, " \"<\\u675e<\\u6760<\\u6759<\\u6763<\\u6764<\\u6789<\\u6770<\\u67a9<\\u677c\"\n"); - fprintf(out, " \"<\\u676a<\\u678c<\\u678b<\\u67a6<\\u67a1<\\u6785<\\u67b7<\\u67ef<\\u67b4\"\n"); - fprintf(out, " \"<\\u67ec<\\u67b3<\\u67e9<\\u67b8<\\u67e4<\\u67de<\\u67dd<\\u67e2<\\u67ee\"\n"); - fprintf(out, " \"<\\u67b9<\\u67ce<\\u67c6<\\u67e7<\\u6a9c<\\u681e<\\u6846<\\u6829<\\u6840\"\n"); - fprintf(out, " \"<\\u684d<\\u6832<\\u684e<\\u68b3<\\u682b<\\u6859<\\u6863<\\u6877<\\u687f\"\n"); - fprintf(out, " \"<\\u689f<\\u688f<\\u68ad<\\u6894<\\u689d<\\u689b<\\u6883<\\u6aae<\\u68b9\"\n"); - fprintf(out, " \"<\\u6874<\\u68b5<\\u68a0<\\u68ba<\\u690f<\\u688d<\\u687e<\\u6901<\\u68ca\"\n"); - fprintf(out, " \"<\\u6908<\\u68d8<\\u6922<\\u6926<\\u68e1<\\u690c<\\u68cd<\\u68d4<\\u68e7\"\n"); - fprintf(out, " \"<\\u68d5<\\u6936<\\u6912<\\u6904<\\u68d7<\\u68e3<\\u6925<\\u68f9<\\u68e0\"\n"); - fprintf(out, " \"<\\u68ef<\\u6928<\\u692a<\\u691a<\\u6923<\\u6921<\\u68c6<\\u6979<\\u6977\"\n"); - fprintf(out, " \"<\\u695c<\\u6978<\\u696b<\\u6954<\\u697e<\\u696e<\\u6939<\\u6974<\\u693d\"\n"); - fprintf(out, " \"<\\u6959<\\u6930<\\u6961<\\u695e<\\u695d<\\u6981<\\u696a<\\u69b2<\\u69ae\"\n"); - fprintf(out, " \"<\\u69d0<\\u69bf<\\u69c1<\\u69d3<\\u69be<\\u69ce<\\u5be8<\\u69ca<\\u69dd\"\n"); - fprintf(out, " \"<\\u69bb<\\u69c3<\\u69a7<\\u6a2e<\\u6991<\\u69a0<\\u699c<\\u6995<\\u69b4\"\n"); - fprintf(out, " \"<\\u69de<\\u69e8<\\u6a02<\\u6a1b<\\u69ff<\\u6b0a<\\u69f9<\\u69f2<\\u69e7\"\n"); - fprintf(out, " \"<\\u6a05<\\u69b1<\\u6a1e<\\u69ed<\\u6a14<\\u69eb<\\u6a0a<\\u6a12<\\u6ac1\"\n"); - fprintf(out, " \"<\\u6a23<\\u6a13<\\u6a44<\\u6a0c<\\u6a72<\\u6a36<\\u6a78<\\u6a47<\\u6a62\"\n"); - fprintf(out, " \"<\\u6a59<\\u6a66<\\u6a48<\\u6a38<\\u6a22<\\u6a90<\\u6a8d<\\u6aa0<\\u6a84\"\n"); - fprintf(out, " \"<\\u6aa2<\\u6aa3<\\u6a97<\\u8617<\\u6abb<\\u6ac3<\\u6ac2<\\u6ab8<\\u6ab3\"\n"); - fprintf(out, " \"<\\u6aac<\\u6ade<\\u6ad1<\\u6adf<\\u6aaa<\\u6ada<\\u6aea<\\u6afb<\\u6b05\"\n"); - fprintf(out, " \"<\\u8616<\\u6afa<\\u6b12<\\u6b16<\\u9b31<\\u6b1f<\\u6b38<\\u6b37<\\u76dc\"\n"); - fprintf(out, " \"<\\u6b39<\\u98ee<\\u6b47<\\u6b43<\\u6b49<\\u6b50<\\u6b59<\\u6b54<\\u6b5b\"\n"); - fprintf(out, " \"<\\u6b5f<\\u6b61<\\u6b78<\\u6b79<\\u6b7f<\\u6b80<\\u6b84<\\u6b83<\\u6b8d\"\n"); - fprintf(out, " \"<\\u6b98<\\u6b95<\\u6b9e<\\u6ba4<\\u6baa<\\u6bab<\\u6baf<\\u6bb2<\\u6bb1\"\n"); - fprintf(out, " \"<\\u6bb3<\\u6bb7<\\u6bbc<\\u6bc6<\\u6bcb<\\u6bd3<\\u6bdf<\\u6bec<\\u6beb\"\n"); - fprintf(out, " \"<\\u6bf3<\\u6bef<\\u9ebe<\\u6c08<\\u6c13<\\u6c14<\\u6c1b<\\u6c24<\\u6c23\"\n"); - fprintf(out, " \"<\\u6c5e<\\u6c55<\\u6c62<\\u6c6a<\\u6c82<\\u6c8d<\\u6c9a<\\u6c81<\\u6c9b\"\n"); - fprintf(out, " \"<\\u6c7e<\\u6c68<\\u6c73<\\u6c92<\\u6c90<\\u6cc4<\\u6cf1<\\u6cd3<\\u6cbd\"\n"); - fprintf(out, " \"<\\u6cd7<\\u6cc5<\\u6cdd<\\u6cae<\\u6cb1<\\u6cbe<\\u6cba<\\u6cdb<\\u6cef\"\n"); - fprintf(out, " \"<\\u6cd9<\\u6cea<\\u6d1f<\\u884d<\\u6d36<\\u6d2b<\\u6d3d<\\u6d38<\\u6d19\"\n"); - fprintf(out, " \"<\\u6d35<\\u6d33<\\u6d12<\\u6d0c<\\u6d63<\\u6d93<\\u6d64<\\u6d5a<\\u6d79\"\n"); - fprintf(out, " \"<\\u6d59<\\u6d8e<\\u6d95<\\u6fe4<\\u6d85<\\u6df9<\\u6e15<\\u6e0a<\\u6db5\"\n"); - fprintf(out, " \"<\\u6dc7<\\u6de6<\\u6db8<\\u6dc6<\\u6dec<\\u6dde<\\u6dcc<\\u6de8<\\u6dd2\"\n"); - fprintf(out, " \"<\\u6dc5<\\u6dfa<\\u6dd9<\\u6de4<\\u6dd5<\\u6dea<\\u6dee<\\u6e2d<\\u6e6e\"\n"); - fprintf(out, " \"<\\u6e2e<\\u6e19<\\u6e72<\\u6e5f<\\u6e3e<\\u6e23<\\u6e6b<\\u6e2b<\\u6e76\"\n"); - fprintf(out, " \"<\\u6e4d<\\u6e1f<\\u6e43<\\u6e3a<\\u6e4e<\\u6e24<\\u6eff<\\u6e1d<\\u6e38\"\n"); - fprintf(out, " \"<\\u6e82<\\u6eaa<\\u6e98<\\u6ec9<\\u6eb7<\\u6ed3<\\u6ebd<\\u6eaf<\\u6ec4\"\n"); - fprintf(out, " \"<\\u6eb2<\\u6ed4<\\u6ed5<\\u6e8f<\\u6ea5<\\u6ec2<\\u6e9f<\\u6f41<\\u6f11\"\n"); - fprintf(out, " \"<\\u704c<\\u6eec<\\u6ef8<\\u6efe<\\u6f3f<\\u6ef2<\\u6f31<\\u6eef<\\u6f32\"\n"); - fprintf(out, " \"<\\u6ecc<\\u6f3e<\\u6f13<\\u6ef7<\\u6f86<\\u6f7a<\\u6f78<\\u6f81<\\u6f80\"\n"); - fprintf(out, " \"<\\u6f6f<\\u6f5b<\\u6ff3<\\u6f6d<\\u6f82<\\u6f7c<\\u6f58<\\u6f8e<\\u6f91\"\n"); - fprintf(out, " \"<\\u6fc2<\\u6f66<\\u6fb3<\\u6fa3<\\u6fa1<\\u6fa4<\\u6fb9<\\u6fc6<\\u6faa\"\n"); - fprintf(out, " \"<\\u6fdf<\\u6fd5<\\u6fec<\\u6fd4<\\u6fd8<\\u6ff1<\\u6fee<\\u6fdb<\\u7009\"\n"); - fprintf(out, " \"<\\u700b<\\u6ffa<\\u7011<\\u7001<\\u700f<\\u6ffe<\\u701b<\\u701a<\\u6f74\"\n"); - fprintf(out, " \"<\\u701d<\\u7018<\\u701f<\\u7030<\\u703e<\\u7032<\\u7051<\\u7063<\\u7099\"\n"); - fprintf(out, " \"<\\u7092<\\u70af<\\u70f1<\\u70ac<\\u70b8<\\u70b3<\\u70ae<\\u70df<\\u70cb\"\n"); - fprintf(out, " \"<\\u70dd<\\u70d9<\\u7109<\\u70fd<\\u711c<\\u7119<\\u7165<\\u7155<\\u7188\"\n"); - fprintf(out, " \"<\\u7166<\\u7162<\\u714c<\\u7156<\\u716c<\\u718f<\\u71fb<\\u7184<\\u7195\"\n"); - fprintf(out, " \"<\\u71a8<\\u71ac<\\u71d7<\\u71b9<\\u71be<\\u71d2<\\u71c9<\\u71d4<\\u71ce\"\n"); - fprintf(out, " \"<\\u71e0<\\u71ec<\\u71e7<\\u71f5<\\u71fc<\\u71f9<\\u71ff<\\u720d<\\u7210\"\n"); - fprintf(out, " \"<\\u721b<\\u7228<\\u722d<\\u722c<\\u7230<\\u7232<\\u723b<\\u723c<\\u723f\"\n"); - fprintf(out, " \"<\\u7240<\\u7246<\\u724b<\\u7258<\\u7274<\\u727e<\\u7282<\\u7281<\\u7287\"\n"); - fprintf(out, " \"<\\u7292<\\u7296<\\u72a2<\\u72a7<\\u72b9<\\u72b2<\\u72c3<\\u72c6<\\u72c4\"\n"); - fprintf(out, " \"<\\u72ce<\\u72d2<\\u72e2<\\u72e0<\\u72e1<\\u72f9<\\u72f7<\\u500f<\\u7317\"\n"); - fprintf(out, " \"<\\u730a<\\u731c<\\u7316<\\u731d<\\u7334<\\u732f<\\u7329<\\u7325<\\u733e\"\n"); - fprintf(out, " \"<\\u734e<\\u734f<\\u9ed8<\\u7357<\\u736a<\\u7368<\\u7370<\\u7378<\\u7375\"\n"); - fprintf(out, " \"<\\u737b<\\u737a<\\u73c8<\\u73b3<\\u73ce<\\u73bb<\\u73c0<\\u73e5<\\u73ee\"\n"); - fprintf(out, " \"<\\u73de<\\u74a2<\\u7405<\\u746f<\\u7425<\\u73f8<\\u7432<\\u743a<\\u7455\"\n"); - fprintf(out, " \"<\\u743f<\\u745f<\\u7459<\\u7441<\\u745c<\\u7469<\\u7470<\\u7463<\\u746a\"\n"); - fprintf(out, " \"<\\u7476<\\u747e<\\u748b<\\u749e<\\u74a7<\\u74ca<\\u74cf<\\u74d4<\\u73f1\"\n"); - fprintf(out, " \"<\\u74e0<\\u74e3<\\u74e7<\\u74e9<\\u74ee<\\u74f2<\\u74f0<\\u74f1<\\u74f8\"\n"); - fprintf(out, " \"<\\u74f7<\\u7504<\\u7503<\\u7505<\\u750c<\\u750e<\\u750d<\\u7515<\\u7513\"\n"); - fprintf(out, " \"<\\u751e<\\u7526<\\u752c<\\u753c<\\u7544<\\u754d<\\u754a<\\u7549<\\u755b\"\n"); - fprintf(out, " \"<\\u7546<\\u755a<\\u7569<\\u7564<\\u7567<\\u756b<\\u756d<\\u7578<\\u7576\"\n"); - fprintf(out, " \"<\\u7586<\\u7587<\\u7574<\\u758a<\\u7589<\\u7582<\\u7594<\\u759a<\\u759d\"\n"); - fprintf(out, " \"<\\u75a5<\\u75a3<\\u75c2<\\u75b3<\\u75c3<\\u75b5<\\u75bd<\\u75b8<\\u75bc\"\n"); - fprintf(out, " \"<\\u75b1<\\u75cd<\\u75ca<\\u75d2<\\u75d9<\\u75e3<\\u75de<\\u75fe<\\u75ff\"\n"); - fprintf(out, " \"<\\u75fc<\\u7601<\\u75f0<\\u75fa<\\u75f2<\\u75f3<\\u760b<\\u760d<\\u7609\"\n"); - fprintf(out, " \"<\\u761f<\\u7627<\\u7620<\\u7621<\\u7622<\\u7624<\\u7634<\\u7630<\\u763b\"\n"); - fprintf(out, " \"<\\u7647<\\u7648<\\u7646<\\u765c<\\u7658<\\u7661<\\u7662<\\u7668<\\u7669\"\n"); - fprintf(out, " \"<\\u766a<\\u7667<\\u766c<\\u7670<\\u7672<\\u7676<\\u7678<\\u767c<\\u7680\"\n"); - fprintf(out, " \"<\\u7683<\\u7688<\\u768b<\\u768e<\\u7696<\\u7693<\\u7699<\\u769a<\\u76b0\"\n"); - fprintf(out, " \"<\\u76b4<\\u76b8<\\u76b9<\\u76ba<\\u76c2<\\u76cd<\\u76d6<\\u76d2<\\u76de\"\n"); - fprintf(out, " \"<\\u76e1<\\u76e5<\\u76e7<\\u76ea<\\u862f<\\u76fb<\\u7708<\\u7707<\\u7704\"\n"); - fprintf(out, " \"<\\u7729<\\u7724<\\u771e<\\u7725<\\u7726<\\u771b<\\u7737<\\u7738<\\u7747\"\n"); - fprintf(out, " \"<\\u775a<\\u7768<\\u776b<\\u775b<\\u7765<\\u777f<\\u777e<\\u7779<\\u778e\"\n"); - fprintf(out, " \"<\\u778b<\\u7791<\\u77a0<\\u779e<\\u77b0<\\u77b6<\\u77b9<\\u77bf<\\u77bc\"\n"); - fprintf(out, " \"<\\u77bd<\\u77bb<\\u77c7<\\u77cd<\\u77d7<\\u77da<\\u77dc<\\u77e3<\\u77ee\"\n"); - fprintf(out, " \"<\\u77fc<\\u780c<\\u7812<\\u7926<\\u7820<\\u792a<\\u7845<\\u788e<\\u7874\"\n"); - fprintf(out, " \"<\\u7886<\\u787c<\\u789a<\\u788c<\\u78a3<\\u78b5<\\u78aa<\\u78af<\\u78d1\"\n"); - fprintf(out, " \"<\\u78c6<\\u78cb<\\u78d4<\\u78be<\\u78bc<\\u78c5<\\u78ca<\\u78ec<\\u78e7\"\n"); - fprintf(out, " \"<\\u78da<\\u78fd<\\u78f4<\\u7907<\\u7912<\\u7911<\\u7919<\\u792c<\\u792b\"\n"); - fprintf(out, " \"<\\u7940<\\u7960<\\u7957<\\u795f<\\u795a<\\u7955<\\u7953<\\u797a<\\u797f\"\n"); - fprintf(out, " \"<\\u798a<\\u799d<\\u79a7<\\u9f4b<\\u79aa<\\u79ae<\\u79b3<\\u79b9<\\u79ba\"\n"); - fprintf(out, " \"<\\u79c9<\\u79d5<\\u79e7<\\u79ec<\\u79e1<\\u79e3<\\u7a08<\\u7a0d<\\u7a18\"\n"); - fprintf(out, " \"<\\u7a19<\\u7a20<\\u7a1f<\\u7980<\\u7a31<\\u7a3b<\\u7a3e<\\u7a37<\\u7a43\"\n"); - fprintf(out, " \"<\\u7a57<\\u7a49<\\u7a61<\\u7a62<\\u7a69<\\u9f9d<\\u7a70<\\u7a79<\\u7a7d\"\n"); - fprintf(out, " \"<\\u7a88<\\u7a97<\\u7a95<\\u7a98<\\u7a96<\\u7aa9<\\u7ac8<\\u7ab0<\\u7ab6\"\n"); - fprintf(out, " \"<\\u7ac5<\\u7ac4<\\u7abf<\\u9083<\\u7ac7<\\u7aca<\\u7acd<\\u7acf<\\u7ad5\"\n"); - fprintf(out, " \"<\\u7ad3<\\u7ad9<\\u7ada<\\u7add<\\u7ae1<\\u7ae2<\\u7ae6<\\u7aed<\\u7af0\"\n"); - fprintf(out, " \"<\\u7b02<\\u7b0f<\\u7b0a<\\u7b06<\\u7b33<\\u7b18<\\u7b19<\\u7b1e<\\u7b35\"\n"); - fprintf(out, " \"<\\u7b28<\\u7b36<\\u7b50<\\u7b7a<\\u7b04<\\u7b4d<\\u7b0b<\\u7b4c<\\u7b45\"\n"); - fprintf(out, " \"<\\u7b75<\\u7b65<\\u7b74<\\u7b67<\\u7b70<\\u7b71<\\u7b6c<\\u7b6e<\\u7b9d\"\n"); - fprintf(out, " \"<\\u7b98<\\u7b9f<\\u7b8d<\\u7b9c<\\u7b9a<\\u7b8b<\\u7b92<\\u7b8f<\\u7b5d\"\n"); - fprintf(out, " \"<\\u7b99<\\u7bcb<\\u7bc1<\\u7bcc<\\u7bcf<\\u7bb4<\\u7bc6<\\u7bdd<\\u7be9\"\n"); - fprintf(out, " \"<\\u7c11<\\u7c14<\\u7be6<\\u7be5<\\u7c60<\\u7c00<\\u7c07<\\u7c13<\\u7bf3\"\n"); - fprintf(out, " \"<\\u7bf7<\\u7c17<\\u7c0d<\\u7bf6<\\u7c23<\\u7c27<\\u7c2a<\\u7c1f<\\u7c37\"\n"); - fprintf(out, " \"<\\u7c2b<\\u7c3d<\\u7c4c<\\u7c43<\\u7c54<\\u7c4f<\\u7c40<\\u7c50<\\u7c58\"\n"); - fprintf(out, " \"<\\u7c5f<\\u7c64<\\u7c56<\\u7c65<\\u7c6c<\\u7c75<\\u7c83<\\u7c90<\\u7ca4\"\n"); - fprintf(out, " \"<\\u7cad<\\u7ca2<\\u7cab<\\u7ca1<\\u7ca8<\\u7cb3<\\u7cb2<\\u7cb1<\\u7cae\"\n"); - fprintf(out, " \"<\\u7cb9<\\u7cbd<\\u7cc0<\\u7cc5<\\u7cc2<\\u7cd8<\\u7cd2<\\u7cdc<\\u7ce2\"\n"); - fprintf(out, " \"<\\u9b3b<\\u7cef<\\u7cf2<\\u7cf4<\\u7cf6<\\u7cfa<\\u7d06<\\u7d02<\\u7d1c\"\n"); - fprintf(out, " \"<\\u7d15<\\u7d0a<\\u7d45<\\u7d4b<\\u7d2e<\\u7d32<\\u7d3f<\\u7d35<\\u7d46\"\n"); - fprintf(out, " \"<\\u7d73<\\u7d56<\\u7d4e<\\u7d72<\\u7d68<\\u7d6e<\\u7d4f<\\u7d63<\\u7d93\"\n"); - fprintf(out, " \"<\\u7d89<\\u7d5b<\\u7d8f<\\u7d7d<\\u7d9b<\\u7dba<\\u7dae<\\u7da3<\\u7db5\"\n"); - fprintf(out, " \"<\\u7dc7<\\u7dbd<\\u7dab<\\u7e3d<\\u7da2<\\u7daf<\\u7ddc<\\u7db8<\\u7d9f\"\n"); - fprintf(out, " \"<\\u7db0<\\u7dd8<\\u7ddd<\\u7de4<\\u7dde<\\u7dfb<\\u7df2<\\u7de1<\\u7e05\"\n"); - fprintf(out, " \"<\\u7e0a<\\u7e23<\\u7e21<\\u7e12<\\u7e31<\\u7e1f<\\u7e09<\\u7e0b<\\u7e22\"\n"); - fprintf(out, " \"<\\u7e46<\\u7e66<\\u7e3b<\\u7e35<\\u7e39<\\u7e43<\\u7e37<\\u7e32<\\u7e3a\"\n"); - fprintf(out, " \"<\\u7e67<\\u7e5d<\\u7e56<\\u7e5e<\\u7e59<\\u7e5a<\\u7e79<\\u7e6a<\\u7e69\"\n"); - fprintf(out, " \"<\\u7e7c<\\u7e7b<\\u7e83<\\u7dd5<\\u7e7d<\\u8fae<\\u7e7f<\\u7e88<\\u7e89\"\n"); - fprintf(out, " \"<\\u7e8c<\\u7e92<\\u7e90<\\u7e93<\\u7e94<\\u7e96<\\u7e8e<\\u7e9b<\\u7e9c\"\n"); - fprintf(out, " \"<\\u7f38<\\u7f3a<\\u7f45<\\u7f4c<\\u7f4d<\\u7f4e<\\u7f50<\\u7f51<\\u7f55\"\n"); - fprintf(out, " \"<\\u7f54<\\u7f58<\\u7f5f<\\u7f60<\\u7f68<\\u7f69<\\u7f67<\\u7f78<\\u7f82\"\n"); - fprintf(out, " \"<\\u7f86<\\u7f83<\\u7f88<\\u7f87<\\u7f8c<\\u7f94<\\u7f9e<\\u7f9d<\\u7f9a\"\n"); - fprintf(out, " \"<\\u7fa3<\\u7faf<\\u7fb2<\\u7fb9<\\u7fae<\\u7fb6<\\u7fb8<\\u8b71<\\u7fc5\"\n"); - fprintf(out, " \"<\\u7fc6<\\u7fca<\\u7fd5<\\u7fd4<\\u7fe1<\\u7fe6<\\u7fe9<\\u7ff3<\\u7ff9\"\n"); - fprintf(out, " \"<\\u98dc<\\u8006<\\u8004<\\u800b<\\u8012<\\u8018<\\u8019<\\u801c<\\u8021\"\n"); - fprintf(out, " \"<\\u8028<\\u803f<\\u803b<\\u804a<\\u8046<\\u8052<\\u8058<\\u805a<\\u805f\"\n"); - fprintf(out, " \"<\\u8062<\\u8068<\\u8073<\\u8072<\\u8070<\\u8076<\\u8079<\\u807d<\\u807f\"\n"); - fprintf(out, " \"<\\u8084<\\u8086<\\u8085<\\u809b<\\u8093<\\u809a<\\u80ad<\\u5190<\\u80ac\"\n"); - fprintf(out, " \"<\\u80db<\\u80e5<\\u80d9<\\u80dd<\\u80c4<\\u80da<\\u80d6<\\u8109<\\u80ef\"\n"); - fprintf(out, " \"<\\u80f1<\\u811b<\\u8129<\\u8123<\\u812f<\\u814b<\\u968b<\\u8146<\\u813e\"\n"); - fprintf(out, " \"<\\u8153<\\u8151<\\u80fc<\\u8171<\\u816e<\\u8165<\\u8166<\\u8174<\\u8183\"\n"); - fprintf(out, " \"<\\u8188<\\u818a<\\u8180<\\u8182<\\u81a0<\\u8195<\\u81a4<\\u81a3<\\u815f\"\n"); - fprintf(out, " \"<\\u8193<\\u81a9<\\u81b0<\\u81b5<\\u81be<\\u81b8<\\u81bd<\\u81c0<\\u81c2\"\n"); - fprintf(out, " \"<\\u81ba<\\u81c9<\\u81cd<\\u81d1<\\u81d9<\\u81d8<\\u81c8<\\u81da<\\u81df\"\n"); - fprintf(out, " \"<\\u81e0<\\u81e7<\\u81fa<\\u81fb<\\u81fe<\\u8201<\\u8202<\\u8205<\\u8207\"\n"); - fprintf(out, " \"<\\u820a<\\u820d<\\u8210<\\u8216<\\u8229<\\u822b<\\u8238<\\u8233<\\u8240\"\n"); - fprintf(out, " \"<\\u8259<\\u8258<\\u825d<\\u825a<\\u825f<\\u8264<\\u8262<\\u8268<\\u826a\"\n"); - fprintf(out, " \"<\\u826b<\\u822e<\\u8271<\\u8277<\\u8278<\\u827e<\\u828d<\\u8292<\\u82ab\"\n"); - fprintf(out, " \"<\\u829f<\\u82bb<\\u82ac<\\u82e1<\\u82e3<\\u82df<\\u82d2<\\u82f4<\\u82f3\"\n"); - fprintf(out, " \"<\\u82fa<\\u8393<\\u8303<\\u82fb<\\u82f9<\\u82de<\\u8306<\\u82dc<\\u8309\"\n"); - fprintf(out, " \"<\\u82d9<\\u8335<\\u8334<\\u8316<\\u8332<\\u8331<\\u8340<\\u8339<\\u8350\"\n"); - fprintf(out, " \"<\\u8345<\\u832f<\\u832b<\\u8317<\\u8318<\\u8385<\\u839a<\\u83aa<\\u839f\"\n"); - fprintf(out, " \"<\\u83a2<\\u8396<\\u8323<\\u838e<\\u8387<\\u838a<\\u837c<\\u83b5<\\u8373\"\n"); - fprintf(out, " \"<\\u8375<\\u83a0<\\u8389<\\u83a8<\\u83f4<\\u8413<\\u83eb<\\u83ce<\\u83fd\"\n"); - fprintf(out, " \"<\\u8403<\\u83d8<\\u840b<\\u83c1<\\u83f7<\\u8407<\\u83e0<\\u83f2<\\u840d\"\n"); - fprintf(out, " \"<\\u8422<\\u8420<\\u83bd<\\u8438<\\u8506<\\u83fb<\\u846d<\\u842a<\\u843c\"\n"); - fprintf(out, " \"<\\u855a<\\u8484<\\u8477<\\u846b<\\u84ad<\\u846e<\\u8482<\\u8469<\\u8446\"\n"); - fprintf(out, " \"<\\u842c<\\u846f<\\u8479<\\u8435<\\u84ca<\\u8462<\\u84b9<\\u84bf<\\u849f\"\n"); - fprintf(out, " \"<\\u84d9<\\u84cd<\\u84bb<\\u84da<\\u84d0<\\u84c1<\\u84c6<\\u84d6<\\u84a1\"\n"); - fprintf(out, " \"<\\u8521<\\u84ff<\\u84f4<\\u8517<\\u8518<\\u852c<\\u851f<\\u8515<\\u8514\"\n"); - fprintf(out, " \"<\\u84fc<\\u8540<\\u8563<\\u8558<\\u8548<\\u8541<\\u8602<\\u854b<\\u8555\"\n"); - fprintf(out, " \"<\\u8580<\\u85a4<\\u8588<\\u8591<\\u858a<\\u85a8<\\u856d<\\u8594<\\u859b\"\n"); - fprintf(out, " \"<\\u85ea<\\u8587<\\u859c<\\u8577<\\u857e<\\u8590<\\u85c9<\\u85ba<\\u85cf\"\n"); - fprintf(out, " \"<\\u85b9<\\u85d0<\\u85d5<\\u85dd<\\u85e5<\\u85dc<\\u85f9<\\u860a<\\u8613\"\n"); - fprintf(out, " \"<\\u860b<\\u85fe<\\u85fa<\\u8606<\\u8622<\\u861a<\\u8630<\\u863f<\\u864d\"\n"); - fprintf(out, " \"<\\u4e55<\\u8654<\\u865f<\\u8667<\\u8671<\\u8693<\\u86a3<\\u86a9<\\u86aa\"\n"); - fprintf(out, " \"<\\u868b<\\u868c<\\u86b6<\\u86af<\\u86c4<\\u86c6<\\u86b0<\\u86c9<\\u8823\"\n"); - fprintf(out, " \"<\\u86ab<\\u86d4<\\u86de<\\u86e9<\\u86ec<\\u86df<\\u86db<\\u86ef<\\u8712\"\n"); - fprintf(out, " \"<\\u8706<\\u8708<\\u8700<\\u8703<\\u86fb<\\u8711<\\u8709<\\u870d<\\u86f9\"\n"); - fprintf(out, " \"<\\u870a<\\u8734<\\u873f<\\u8737<\\u873b<\\u8725<\\u8729<\\u871a<\\u8760\"\n"); - fprintf(out, " \"<\\u875f<\\u8778<\\u874c<\\u874e<\\u8774<\\u8757<\\u8768<\\u876e<\\u8759\"\n"); - fprintf(out, " \"<\\u8753<\\u8763<\\u876a<\\u8805<\\u87a2<\\u879f<\\u8782<\\u87af<\\u87cb\"\n"); - fprintf(out, " \"<\\u87bd<\\u87c0<\\u87d0<\\u96d6<\\u87ab<\\u87c4<\\u87b3<\\u87c7<\\u87c6\"\n"); - fprintf(out, " \"<\\u87bb<\\u87ef<\\u87f2<\\u87e0<\\u880f<\\u880d<\\u87fe<\\u87f6<\\u87f7\"\n"); - fprintf(out, " \"<\\u880e<\\u87d2<\\u8811<\\u8816<\\u8815<\\u8822<\\u8821<\\u8831<\\u8836\"\n"); - fprintf(out, " \"<\\u8839<\\u8827<\\u883b<\\u8844<\\u8842<\\u8852<\\u8859<\\u885e<\\u8862\"\n"); - fprintf(out, " \"<\\u886b<\\u8881<\\u887e<\\u889e<\\u8875<\\u887d<\\u88b5<\\u8872<\\u8882\"\n"); - fprintf(out, " \"<\\u8897<\\u8892<\\u88ae<\\u8899<\\u88a2<\\u888d<\\u88a4<\\u88b0<\\u88bf\"\n"); - fprintf(out, " \"<\\u88b1<\\u88c3<\\u88c4<\\u88d4<\\u88d8<\\u88d9<\\u88dd<\\u88f9<\\u8902\"\n"); - fprintf(out, " \"<\\u88fc<\\u88f4<\\u88e8<\\u88f2<\\u8904<\\u890c<\\u890a<\\u8913<\\u8943\"\n"); - fprintf(out, " \"<\\u891e<\\u8925<\\u892a<\\u892b<\\u8941<\\u8944<\\u893b<\\u8936<\\u8938\"\n"); - fprintf(out, " \"<\\u894c<\\u891d<\\u8960<\\u895e<\\u8966<\\u8964<\\u896d<\\u896a<\\u896f\"\n"); - fprintf(out, " \"<\\u8974<\\u8977<\\u897e<\\u8983<\\u8988<\\u898a<\\u8993<\\u8998<\\u89a1\"\n"); - fprintf(out, " \"<\\u89a9<\\u89a6<\\u89ac<\\u89af<\\u89b2<\\u89ba<\\u89bd<\\u89bf<\\u89c0\"\n"); - fprintf(out, " \"<\\u89da<\\u89dc<\\u89dd<\\u89e7<\\u89f4<\\u89f8<\\u8a03<\\u8a16<\\u8a10\"\n"); - fprintf(out, " \"<\\u8a0c<\\u8a1b<\\u8a1d<\\u8a25<\\u8a36<\\u8a41<\\u8a5b<\\u8a52<\\u8a46\"\n"); - fprintf(out, " \"<\\u8a48<\\u8a7c<\\u8a6d<\\u8a6c<\\u8a62<\\u8a85<\\u8a82<\\u8a84<\\u8aa8\"\n"); - fprintf(out, " \"<\\u8aa1<\\u8a91<\\u8aa5<\\u8aa6<\\u8a9a<\\u8aa3<\\u8ac4<\\u8acd<\\u8ac2\"\n"); - fprintf(out, " \"<\\u8ada<\\u8aeb<\\u8af3<\\u8ae7<\\u8ae4<\\u8af1<\\u8b14<\\u8ae0<\\u8ae2\"\n"); - fprintf(out, " \"<\\u8af7<\\u8ade<\\u8adb<\\u8b0c<\\u8b07<\\u8b1a<\\u8ae1<\\u8b16<\\u8b10\"\n"); - fprintf(out, " \"<\\u8b17<\\u8b20<\\u8b33<\\u97ab<\\u8b26<\\u8b2b<\\u8b3e<\\u8b28<\\u8b41\"\n"); - fprintf(out, " \"<\\u8b4c<\\u8b4f<\\u8b4e<\\u8b49<\\u8b56<\\u8b5b<\\u8b5a<\\u8b6b<\\u8b5f\"\n"); - fprintf(out, " \"<\\u8b6c<\\u8b6f<\\u8b74<\\u8b7d<\\u8b80<\\u8b8c<\\u8b8e<\\u8b92<\\u8b93\"\n"); - fprintf(out, " \"<\\u8b96<\\u8b99<\\u8b9a<\\u8c3a<\\u8c41<\\u8c3f<\\u8c48<\\u8c4c<\\u8c4e\"\n"); - fprintf(out, " \"<\\u8c50<\\u8c55<\\u8c62<\\u8c6c<\\u8c78<\\u8c7a<\\u8c82<\\u8c89<\\u8c85\"\n"); - fprintf(out, " \"<\\u8c8a<\\u8c8d<\\u8c8e<\\u8c94<\\u8c7c<\\u8c98<\\u621d<\\u8cad<\\u8caa\"\n"); - fprintf(out, " \"<\\u8cbd<\\u8cb2<\\u8cb3<\\u8cae<\\u8cb6<\\u8cc8<\\u8cc1<\\u8ce4<\\u8ce3\"\n"); - fprintf(out, " \"<\\u8cda<\\u8cfd<\\u8cfa<\\u8cfb<\\u8d04<\\u8d05<\\u8d0a<\\u8d07<\\u8d0f\"\n"); - fprintf(out, " \"<\\u8d0d<\\u8d10<\\u9f4e<\\u8d13<\\u8ccd<\\u8d14<\\u8d16<\\u8d67<\\u8d6d\"\n"); - fprintf(out, " \"<\\u8d71<\\u8d73<\\u8d81<\\u8d99<\\u8dc2<\\u8dbe<\\u8dba<\\u8dcf<\\u8dda\"\n"); - fprintf(out, " \"<\\u8dd6<\\u8dcc<\\u8ddb<\\u8dcb<\\u8dea<\\u8deb<\\u8ddf<\\u8de3<\\u8dfc\"\n"); - fprintf(out, " \"<\\u8e08<\\u8e09<\\u8dff<\\u8e1d<\\u8e1e<\\u8e10<\\u8e1f<\\u8e42<\\u8e35\"\n"); - fprintf(out, " \"<\\u8e30<\\u8e34<\\u8e4a<\\u8e47<\\u8e49<\\u8e4c<\\u8e50<\\u8e48<\\u8e59\"\n"); - fprintf(out, " \"<\\u8e64<\\u8e60<\\u8e2a<\\u8e63<\\u8e55<\\u8e76<\\u8e72<\\u8e7c<\\u8e81\"\n"); - fprintf(out, " \"<\\u8e87<\\u8e85<\\u8e84<\\u8e8b<\\u8e8a<\\u8e93<\\u8e91<\\u8e94<\\u8e99\"\n"); - fprintf(out, " \"<\\u8eaa<\\u8ea1<\\u8eac<\\u8eb0<\\u8ec6<\\u8eb1<\\u8ebe<\\u8ec5<\\u8ec8\"\n"); - fprintf(out, " \"<\\u8ecb<\\u8edb<\\u8ee3<\\u8efc<\\u8efb<\\u8eeb<\\u8efe<\\u8f0a<\\u8f05\"\n"); - fprintf(out, " \"<\\u8f15<\\u8f12<\\u8f19<\\u8f13<\\u8f1c<\\u8f1f<\\u8f1b<\\u8f0c<\\u8f26\"\n"); - fprintf(out, " \"<\\u8f33<\\u8f3b<\\u8f39<\\u8f45<\\u8f42<\\u8f3e<\\u8f4c<\\u8f49<\\u8f46\"\n"); - fprintf(out, " \"<\\u8f4e<\\u8f57<\\u8f5c<\\u8f62<\\u8f63<\\u8f64<\\u8f9c<\\u8f9f<\\u8fa3\"\n"); - fprintf(out, " \"<\\u8fad<\\u8faf<\\u8fb7<\\u8fda<\\u8fe5<\\u8fe2<\\u8fea<\\u8fef<\\u9087\"\n"); - fprintf(out, " \"<\\u8ff4<\\u9005<\\u8ff9<\\u8ffa<\\u9011<\\u9015<\\u9021<\\u900d<\\u901e\"\n"); - fprintf(out, " \"<\\u9016<\\u900b<\\u9027<\\u9036<\\u9035<\\u9039<\\u8ff8<\\u904f<\\u9050\"\n"); - fprintf(out, " \"<\\u9051<\\u9052<\\u900e<\\u9049<\\u903e<\\u9056<\\u9058<\\u905e<\\u9068\"\n"); - fprintf(out, " \"<\\u906f<\\u9076<\\u96a8<\\u9072<\\u9082<\\u907d<\\u9081<\\u9080<\\u908a\"\n"); - fprintf(out, " \"<\\u9089<\\u908f<\\u90a8<\\u90af<\\u90b1<\\u90b5<\\u90e2<\\u90e4<\\u6248\"\n"); - fprintf(out, " \"<\\u90db<\\u9102<\\u9112<\\u9119<\\u9132<\\u9130<\\u914a<\\u9156<\\u9158\"\n"); - fprintf(out, " \"<\\u9163<\\u9165<\\u9169<\\u9173<\\u9172<\\u918b<\\u9189<\\u9182<\\u91a2\"\n"); - fprintf(out, " \"<\\u91ab<\\u91af<\\u91aa<\\u91b5<\\u91b4<\\u91ba<\\u91c0<\\u91c1<\\u91c9\"\n"); - fprintf(out, " \"<\\u91cb<\\u91d0<\\u91d6<\\u91df<\\u91e1<\\u91db<\\u91fc<\\u91f5<\\u91f6\"\n"); - fprintf(out, " \"<\\u921e<\\u91ff<\\u9214<\\u922c<\\u9215<\\u9211<\\u925e<\\u9257<\\u9245\"\n"); - fprintf(out, " \"<\\u9249<\\u9264<\\u9248<\\u9295<\\u923f<\\u924b<\\u9250<\\u929c<\\u9296\"\n"); - fprintf(out, " \"<\\u9293<\\u929b<\\u925a<\\u92cf<\\u92b9<\\u92b7<\\u92e9<\\u930f<\\u92fa\"\n"); - fprintf(out, " \"<\\u9344<\\u932e<\\u9319<\\u9322<\\u931a<\\u9323<\\u933a<\\u9335<\\u933b\"\n"); - fprintf(out, " \"<\\u935c<\\u9360<\\u937c<\\u936e<\\u9356<\\u93b0<\\u93ac<\\u93ad<\\u9394\"\n"); - fprintf(out, " \"<\\u93b9<\\u93d6<\\u93d7<\\u93e8<\\u93e5<\\u93d8<\\u93c3<\\u93dd<\\u93d0\"\n"); - fprintf(out, " \"<\\u93c8<\\u93e4<\\u941a<\\u9414<\\u9413<\\u9403<\\u9407<\\u9410<\\u9436\"\n"); - fprintf(out, " \"<\\u942b<\\u9435<\\u9421<\\u943a<\\u9441<\\u9452<\\u9444<\\u945b<\\u9460\"\n"); - fprintf(out, " \"<\\u9462<\\u945e<\\u946a<\\u9229<\\u9470<\\u9475<\\u9477<\\u947d<\\u945a\"\n"); - fprintf(out, " \"<\\u947c<\\u947e<\\u9481<\\u947f<\\u9582<\\u9587<\\u958a<\\u9594<\\u9596\"\n"); - fprintf(out, " \"<\\u9598<\\u9599<\\u95a0<\\u95a8<\\u95a7<\\u95ad<\\u95bc<\\u95bb<\\u95b9\"\n"); - fprintf(out, " \"<\\u95be<\\u95ca<\\u6ff6<\\u95c3<\\u95cd<\\u95cc<\\u95d5<\\u95d4<\\u95d6\"\n"); - fprintf(out, " \"<\\u95dc<\\u95e1<\\u95e5<\\u95e2<\\u9621<\\u9628<\\u962e<\\u962f<\\u9642\"\n"); - fprintf(out, " \"<\\u964c<\\u964f<\\u964b<\\u9677<\\u965c<\\u965e<\\u965d<\\u965f<\\u9666\"\n"); - fprintf(out, " \"<\\u9672<\\u966c<\\u968d<\\u9698<\\u9695<\\u9697<\\u96aa<\\u96a7<\\u96b1\"\n"); - fprintf(out, " \"<\\u96b2<\\u96b0<\\u96b4<\\u96b6<\\u96b8<\\u96b9<\\u96ce<\\u96cb<\\u96c9\"\n"); - fprintf(out, " \"<\\u96cd<\\u894d<\\u96dc<\\u970d<\\u96d5<\\u96f9<\\u9704<\\u9706<\\u9708\"\n"); - fprintf(out, " \"<\\u9713<\\u970e<\\u9711<\\u970f<\\u9716<\\u9719<\\u9724<\\u972a<\\u9730\"\n"); - fprintf(out, " \"<\\u9739<\\u973d<\\u973e<\\u9744<\\u9746<\\u9748<\\u9742<\\u9749<\\u975c\"\n"); - fprintf(out, " \"<\\u9760<\\u9764<\\u9766<\\u9768<\\u52d2<\\u976b<\\u9771<\\u9779<\\u9785\"\n"); - fprintf(out, " \"<\\u977c<\\u9781<\\u977a<\\u9786<\\u978b<\\u978f<\\u9790<\\u979c<\\u97a8\"\n"); - fprintf(out, " \"<\\u97a6<\\u97a3<\\u97b3<\\u97b4<\\u97c3<\\u97c6<\\u97c8<\\u97cb<\\u97dc\"\n"); - fprintf(out, " \"<\\u97ed<\\u9f4f<\\u97f2<\\u7adf<\\u97f6<\\u97f5<\\u980f<\\u980c<\\u9838\"\n"); - fprintf(out, " \"<\\u9824<\\u9821<\\u9837<\\u983d<\\u9846<\\u984f<\\u984b<\\u986b<\\u986f\"\n"); - fprintf(out, " \"<\\u9870<\\u9871<\\u9874<\\u9873<\\u98aa<\\u98af<\\u98b1<\\u98b6<\\u98c4\"\n"); - fprintf(out, " \"<\\u98c3<\\u98c6<\\u98e9<\\u98eb<\\u9903<\\u9909<\\u9912<\\u9914<\\u9918\"\n"); - fprintf(out, " \"<\\u9921<\\u991d<\\u991e<\\u9924<\\u9920<\\u992c<\\u992e<\\u993d<\\u993e\"\n"); - fprintf(out, " \"<\\u9942<\\u9949<\\u9945<\\u9950<\\u994b<\\u9951<\\u9952<\\u994c<\\u9955\"\n"); - fprintf(out, " \"<\\u9997<\\u9998<\\u99a5<\\u99ad<\\u99ae<\\u99bc<\\u99df<\\u99db<\\u99dd\"\n"); - fprintf(out, " \"<\\u99d8<\\u99d1<\\u99ed<\\u99ee<\\u99f1<\\u99f2<\\u99fb<\\u99f8<\\u9a01\"\n"); - fprintf(out, " \"<\\u9a0f<\\u9a05<\\u99e2<\\u9a19<\\u9a2b<\\u9a37<\\u9a45<\\u9a42<\\u9a40\"\n"); - fprintf(out, " \"<\\u9a43<\\u9a3e<\\u9a55<\\u9a4d<\\u9a5b<\\u9a57<\\u9a5f<\\u9a62<\\u9a65\"\n"); - fprintf(out, " \"<\\u9a64<\\u9a69<\\u9a6b<\\u9a6a<\\u9aad<\\u9ab0<\\u9abc<\\u9ac0<\\u9acf\"\n"); - fprintf(out, " \"<\\u9ad1<\\u9ad3<\\u9ad4<\\u9ade<\\u9adf<\\u9ae2<\\u9ae3<\\u9ae6<\\u9aef\"\n"); - fprintf(out, " \"<\\u9aeb<\\u9aee<\\u9af4<\\u9af1<\\u9af7<\\u9afb<\\u9b06<\\u9b18<\\u9b1a\"\n"); - fprintf(out, " \"<\\u9b1f<\\u9b22<\\u9b23<\\u9b25<\\u9b27<\\u9b28<\\u9b29<\\u9b2a<\\u9b2e\"\n"); - fprintf(out, " \"<\\u9b2f<\\u9b32<\\u9b44<\\u9b43<\\u9b4f<\\u9b4d<\\u9b4e<\\u9b51<\\u9b58\"\n"); - fprintf(out, " \"<\\u9b74<\\u9b93<\\u9b83<\\u9b91<\\u9b96<\\u9b97<\\u9b9f<\\u9ba0<\\u9ba8\"\n"); - fprintf(out, " \"<\\u9bb4<\\u9bc0<\\u9bca<\\u9bb9<\\u9bc6<\\u9bcf<\\u9bd1<\\u9bd2<\\u9be3\"\n"); - fprintf(out, " \"<\\u9be2<\\u9be4<\\u9bd4<\\u9be1<\\u9c3a<\\u9bf2<\\u9bf1<\\u9bf0<\\u9c15\"\n"); - fprintf(out, " \"<\\u9c14<\\u9c09<\\u9c13<\\u9c0c<\\u9c06<\\u9c08<\\u9c12<\\u9c0a<\\u9c04\"\n"); - fprintf(out, " \"<\\u9c2e<\\u9c1b<\\u9c25<\\u9c24<\\u9c21<\\u9c30<\\u9c47<\\u9c32<\\u9c46\"\n"); - fprintf(out, " \"<\\u9c3e<\\u9c5a<\\u9c60<\\u9c67<\\u9c76<\\u9c78<\\u9ce7<\\u9cec<\\u9cf0\"\n"); - fprintf(out, " \"<\\u9d09<\\u9d08<\\u9ceb<\\u9d03<\\u9d06<\\u9d2a<\\u9d26<\\u9daf<\\u9d23\"\n"); - fprintf(out, " \"<\\u9d1f<\\u9d44<\\u9d15<\\u9d12<\\u9d41<\\u9d3f<\\u9d3e<\\u9d46<\\u9d48\"\n"); - fprintf(out, " \"<\\u9d5d<\\u9d5e<\\u9d64<\\u9d51<\\u9d50<\\u9d59<\\u9d72<\\u9d89<\\u9d87\"\n"); - fprintf(out, " \"<\\u9dab<\\u9d6f<\\u9d7a<\\u9d9a<\\u9da4<\\u9da9<\\u9db2<\\u9dc4<\\u9dc1\"\n"); - fprintf(out, " \"<\\u9dbb<\\u9db8<\\u9dba<\\u9dc6<\\u9dcf<\\u9dc2<\\u9dd9<\\u9dd3<\\u9df8\"\n"); - fprintf(out, " \"<\\u9de6<\\u9ded<\\u9def<\\u9dfd<\\u9e1a<\\u9e1b<\\u9e1e<\\u9e75<\\u9e79\"\n"); - fprintf(out, " \"<\\u9e7d<\\u9e81<\\u9e88<\\u9e8b<\\u9e8c<\\u9e92<\\u9e95<\\u9e91<\\u9e9d\"\n"); - fprintf(out, " \"<\\u9ea5<\\u9ea9<\\u9eb8<\\u9eaa<\\u9ead<\\u9761<\\u9ecc<\\u9ece<\\u9ecf\"\n"); - fprintf(out, " \"<\\u9ed0<\\u9ed4<\\u9edc<\\u9ede<\\u9edd<\\u9ee0<\\u9ee5<\\u9ee8<\\u9eef\"\n"); - fprintf(out, " \"<\\u9ef4<\\u9ef6<\\u9ef7<\\u9ef9<\\u9efb<\\u9efc<\\u9efd<\\u9f07<\\u9f08\"\n"); - fprintf(out, " \"<\\u76b7<\\u9f15<\\u9f21<\\u9f2c<\\u9f3e<\\u9f4a<\\u9f52<\\u9f54<\\u9f63\"\n"); - fprintf(out, " \"<\\u9f5f<\\u9f60<\\u9f61<\\u9f66<\\u9f67<\\u9f6c<\\u9f6a<\\u9f77<\\u9f72\"\n"); - fprintf(out, " \"<\\u9f76<\\u9f95<\\u9f9c<\\u9fa0<\\u582f<\\u69c7<\\u9059<\\u7464<\\u51dc\"\n"); - fprintf(out, " \"<\\u7199\"\n"); -} - diff --git a/icuSources/tools/genrb/genjp/genjp.dsw b/icuSources/tools/genrb/genjp/genjp.dsw deleted file mode 100644 index ce178504..00000000 --- a/icuSources/tools/genrb/genjp/genjp.dsw +++ /dev/null @@ -1,41 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "common"=..\..\..\icu\source\common\common.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "genjp"=.\genjp.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/icuSources/tools/genrb/genjp/genjp.h b/icuSources/tools/genrb/genjp/genjp.h deleted file mode 100644 index f25e8def..00000000 --- a/icuSources/tools/genrb/genjp/genjp.h +++ /dev/null @@ -1,85 +0,0 @@ -/* -******************************************************************************* -* Copyright (C) 2001, International Business Machines -* Corporation and others. All Rights Reserved. -******************************************************************************* -* file name: genjp. -* encoding: US-ASCII -* -* Modification history -* Date Name Comments -* 10/13/2001 weiv created -* -* The GenJP class is useful for generating various stuff related to Japanese language. -* Right now, it uses ICU to generate rules for JIS X 4061 compliant collation. -* Also, it is useful for getting compatibility versions of the characters. -*/ - -#ifndef ICU_GENJP -#define ICU_GENJP - -#include <stdio.h> - -#include "unicode/utypes.h" -#include "unicode/uchar.h" -#include "unicode/unorm.h" -#include "ucmpe32.h" -#include "cmemory.h" - -static const uint32_t _bufferSize = 256; -static const UChar _vowels[] = { 0x30A1, 0x30A3, 0x30A5, 0x30A7, 0x30A9, 0 }; // katakana AIUEO -static const UChar _prolongedSoundMark = 0x30FC; -static const UChar _voicedMark = 0x3099; -static const UChar _hiraganaIterationMark = 0x309D; -static const UChar _hiraganaVoicedIterationMark = 0x309E; -static const UChar _katakanaIterationMark = 0x30FD; -static const UChar _katakanaVoicedIterationMark = 0x30FE; - -static const UChar _hiraganaStart = 0x3041; -static const UChar _hiraganaEnd = 0x3094; -static const UChar _katakanaStart = 0x30A1; -static const UChar _katakanaEnd = 0x30FA; - -static const char *_tertiaryLess = "\"<<<"; -static const char *_equal = " \"="; - - - -class GenJP { - public: - GenJP(); - ~GenJP(); - UChar getHalf(UChar u); // Gets the compatibility version of an UChar. - // The structure holds halfwidth and fullwidth compatibility characters. - UBool isSemivoiced(UChar ch, UErrorCode &status); // Is a code point semivoiced - UBool isVoiced(UChar ch, UErrorCode &status); // Is a code point voiced - - void writeHeader(UErrorCode &status); - void processLengthMark(UErrorCode &status); // This will do small vowels and generate rules for the length mark - void processIterationMark(UErrorCode &status); // This will generate the rules for the iteration mark - void processCompatibility(UErrorCode &status); // This will generate the rules for making compatibility chars - // equal with their normal counter part (only halfwidth and fullwidth). - void equalKatakanaToHiragana(UErrorCode &status); // This will generate the rules &K=K=hK=H - void printOutKanji(UErrorCode &status); // Just prints out Kanji ordering... - void writeFooter(UErrorCode &status); - - private: - const char *getRelation(); - UChar getHiragana(UChar katakana); - const char *getName(const UChar ch, UErrorCode &status); - char *printUnicodeStuff(UChar *zTStuff, char *resBuf); - void processIterationMark(UChar katakana, UErrorCode &status); - void processVoicedIterationMark(UChar katakana, UErrorCode &status); - void processVoicedKana(UChar katakana, UErrorCode &status); - void processSemivoicedKana(UChar katakana, UErrorCode &status); - CompactEIntArray *kanaToHalf; - FILE *out; - char *nameBuff; - UBool wasReset; -}; - -inline UChar GenJP::getHiragana(UChar katakana) { - return katakana - (_katakanaStart - _hiraganaStart); -} - -#endif diff --git a/icuSources/tools/genrb/genrb.c b/icuSources/tools/genrb/genrb.c index 827e3302..f6929bb7 100644 --- a/icuSources/tools/genrb/genrb.c +++ b/icuSources/tools/genrb/genrb.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1998-2003, International Business Machines +* Copyright (C) 1998-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -17,17 +17,18 @@ */ #include "genrb.h" +#include "unicode/uclean.h" /* Protos */ static void processFile(const char *filename, const char* cp, const char *inputDir, const char *outputDir, const char *packageName, UErrorCode *status); -static char *make_res_filename(const char *filename, const char *outputDir, +static char *make_res_filename(const char *filename, const char *outputDir, const char *packageName, UErrorCode *status); /* File suffixes */ #define RES_SUFFIX ".res" #define COL_SUFFIX ".col" -static char theCurrentFileName[4096]; +static char theCurrentFileName[2048]; const char *gCurrentFileName = theCurrentFileName; #ifdef XP_MAC_CONSOLE #include <console.h> @@ -48,7 +49,7 @@ enum COPYRIGHT, PACKAGE_NAME, BUNDLE_NAME, - WRITE_XML, + WRITE_XLIFF, TOUCHFILE, STRICT, NO_BINARY_COLLATION, @@ -70,7 +71,7 @@ UOption options[]={ UOPTION_COPYRIGHT, UOPTION_PACKAGE_NAME, UOPTION_BUNDLE_NAME, - UOPTION_DEF( "write-xml", 'x', UOPT_NO_ARG), + UOPTION_DEF( "write-xliff", 'x', UOPT_OPTIONAL_ARG), UOPTION_DEF( "touchfile", 't', UOPT_NO_ARG), UOPTION_DEF( "strict", 'k', UOPT_NO_ARG), /* 14 */ UOPTION_DEF( "noBinaryCollation", 'C', UOPT_NO_ARG),/* 15 */ @@ -79,14 +80,14 @@ UOption options[]={ }; static UBool write_java = FALSE; -static UBool write_xml = FALSE; +static UBool write_xliff = FALSE; static UBool touchfile = FALSE; static const char* outputEnc =""; static const char* gPackageName=NULL; static const char* bundleName=NULL; /*added by Jing*/ static const char* language = NULL; - +static const char* xliffOutputFileName = NULL; int main(int argc, char* argv[]) @@ -97,7 +98,7 @@ main(int argc, const char *inputDir = NULL; const char *encoding = ""; int i; - + U_MAIN_INIT_ARGS(argc, argv); argc = u_parseArgs(argc, argv, (int32_t)(sizeof(options)/sizeof(options[0])), options); @@ -146,15 +147,15 @@ main(int argc, "\t defaults to ASCII and \\uXXXX format.\n" "\t-p or --package-name For ICU4J: package name for writing the ListResourceBundle for ICU4J,\n" "\t defaults to com.ibm.icu.impl.data\n" - "\t For ICU4C: Package name on output. Specfiying\n" + "\t For ICU4C: Package name for the .res files on output. Specfiying\n" "\t 'ICUDATA' defaults to the current ICU4C data name.\n"); fprintf(stderr, "\t-b or --bundle-name bundle name for writing the ListResourceBundle for ICU4J,\n" "\t defaults to LocaleElements\n" - "\t-x or --write-xml write a XML file for the resource bundle.\n" + "\t-x or --write-xliff write a XLIFF file for the resource bundle. Followed by an optional output file name.\n" "\t-k or --strict use pedantic parsing of syntax\n" /*added by Jing*/ - "\t-l or --language language code compliant with ISO 639.\n"); + "\t-l or --language For XLIFF: language code compliant with ISO 639.\n"); return argc < 0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR; } @@ -194,7 +195,7 @@ main(int argc, if(options[TOUCHFILE].doesOccur) { if(gPackageName == NULL) { - fprintf(stderr, "%s: Don't use touchfile (-t) option with no package.\n", + fprintf(stderr, "%s: Don't use touchfile (-t) option with no package.\n", argv[0]); return -1; } @@ -208,6 +209,18 @@ main(int argc, if(options[ICUDATADIR].doesOccur) { u_setDataDirectory(options[ICUDATADIR].value); } + /* Initialize ICU */ + u_init(&status); + if (U_FAILURE(status) && status != U_FILE_ACCESS_ERROR) { + /* Note: u_init() will try to open ICU property data. + * failures here are expected when building ICU from scratch. + * ignore them. + */ + fprintf(stderr, "%s: can not initialize ICU. status = %s\n", + argv[0], u_errorName(status)); + exit(1); + } + status = U_ZERO_ERROR; if(options[WRITE_JAVA].doesOccur) { write_java = TRUE; outputEnc = options[WRITE_JAVA].value; @@ -217,8 +230,11 @@ main(int argc, bundleName = options[BUNDLE_NAME].value; } - if(options[WRITE_XML].doesOccur) { - write_xml = TRUE; + if(options[WRITE_XLIFF].doesOccur) { + write_xliff = TRUE; + if(options[WRITE_XLIFF].value != NULL){ + xliffOutputFileName = options[WRITE_XLIFF].value; + } } if(options[NO_BINARY_COLLATION].doesOccur) { @@ -226,7 +242,7 @@ main(int argc, } else { initParser(TRUE); } - + /*added by Jing*/ if(options[LANGUAGE].doesOccur) { language = options[LANGUAGE].value; @@ -236,7 +252,7 @@ main(int argc, for(i = 1; i < argc; ++i) { status = U_ZERO_ERROR; arg = getLongPathname(argv[i]); - + if (inputDir) { uprv_strcpy(theCurrentFileName, inputDir); uprv_strcat(theCurrentFileName, U_FILE_SEP_STRING); @@ -265,10 +281,10 @@ processFile(const char *filename, const char *cp, const char *inputDir, const ch char *inputDirBuf = NULL; char outputFileName[256]; - + int32_t dirlen = 0; int32_t filelen = 0; - + if (status==NULL || U_FAILURE(*status)) { return; } @@ -284,12 +300,12 @@ processFile(const char *filename, const char *cp, const char *inputDir, const ch openFileName[0] = '\0'; if (filenameBegin != NULL) { /* - * When a filename ../../../data/root.txt is specified, + * When a filename ../../../data/root.txt is specified, * we presume that the input directory is ../../../data * This is very important when the resource file includes * another file, like UCARules.txt or thaidict.brk. */ - int32_t filenameSize = filenameBegin - filename + 1; + int32_t filenameSize = (int32_t)(filenameBegin - filename + 1); inputDirBuf = uprv_strncpy((char *)uprv_malloc(filenameSize), filename, filenameSize); /* test for NULL */ @@ -316,7 +332,7 @@ processFile(const char *filename, const char *cp, const char *inputDir, const ch openFileName[0] = '\0'; /* - * append the input dir to openFileName if the first char in + * append the input dir to openFileName if the first char in * filename is not file seperation char and the last char input directory is not '.'. * This is to support : * genrb -s. /home/icu/data @@ -341,16 +357,16 @@ processFile(const char *filename, const char *cp, const char *inputDir, const ch } uprv_strcpy(openFileName, inputDir); - + } } uprv_strcat(openFileName, filename); ucbuf = ucbuf_open(openFileName, &cp,getShowWarning(),TRUE, status); - + if(*status == U_FILE_ACCESS_ERROR) { - + fprintf(stderr, "couldn't open file %s\n", openFileName == NULL ? filename : openFileName); goto finish; } @@ -359,7 +375,7 @@ processFile(const char *filename, const char *cp, const char *inputDir, const ch goto finish; } /* auto detected popular encodings? */ - if (cp!=NULL) { + if (cp!=NULL && isVerbose()) { printf("autodetected encoding %s\n", cp); } /* Parse the data into an SRBRoot */ @@ -396,12 +412,12 @@ processFile(const char *filename, const char *cp, const char *inputDir, const ch } else { - T_FileStream_write(q, msg, uprv_strlen(msg)); + T_FileStream_write(q, msg, (int32_t)uprv_strlen(msg)); T_FileStream_close(q); } uprv_free(tfname); } - + } if(U_FAILURE(*status)) { fprintf(stderr, "couldn't make the res fileName for bundle %s. Error:%s\n", filename,u_errorName(*status)); @@ -409,8 +425,8 @@ processFile(const char *filename, const char *cp, const char *inputDir, const ch } if(write_java== TRUE){ bundle_write_java(data,outputDir,outputEnc, outputFileName, sizeof(outputFileName),packageName,bundleName,status); - }else if(write_xml ==TRUE){ - bundle_write_xml(data,outputDir,outputEnc, filename, outputFileName, sizeof(outputFileName),language, packageName,status); + }else if(write_xliff ==TRUE){ + bundle_write_xml(data,outputDir,outputEnc, filename, outputFileName, sizeof(outputFileName),language, xliffOutputFileName,status); }else{ /* Write the data to the file */ bundle_write(data, outputDir, packageName, outputFileName, sizeof(outputFileName), status); @@ -457,7 +473,7 @@ make_res_filename(const char *filename, if(packageName != NULL) { - pkgLen = 1 + uprv_strlen(packageName); + pkgLen = (int32_t)(1 + uprv_strlen(packageName)); } /* setup */ diff --git a/icuSources/tools/genrb/genrb.dsp b/icuSources/tools/genrb/genrb.dsp index bfbc2763..a8507075 100644 --- a/icuSources/tools/genrb/genrb.dsp +++ b/icuSources/tools/genrb/genrb.dsp @@ -115,7 +115,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\..\include" /I "..\..\..\source\common" /I "..\toolutil" /I "..\..\..\source\i18n" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\..\include" /I "..\..\..\source\common" /I "..\toolutil" /I "..\..\..\source\i18n" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -150,7 +150,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\..\include" /I "..\..\..\source\common" /I "..\toolutil" /I "..\..\..\source\i18n" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\..\include" /I "..\..\..\source\common" /I "..\toolutil" /I "..\..\..\source\i18n" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe @@ -195,6 +195,10 @@ SOURCE=.\parse.c # End Source File # Begin Source File +SOURCE=.\prscmnts.cpp +# End Source File +# Begin Source File + SOURCE=.\read.c # End Source File # Begin Source File @@ -239,6 +243,10 @@ SOURCE=.\parse.h # End Source File # Begin Source File +SOURCE=.\prscmnts.h +# End Source File +# Begin Source File + SOURCE=.\read.h # End Source File # Begin Source File diff --git a/icuSources/tools/genrb/genrb.vcproj b/icuSources/tools/genrb/genrb.vcproj index 83ad4fd8..4fa36270 100644 --- a/icuSources/tools/genrb/genrb.vcproj +++ b/icuSources/tools/genrb/genrb.vcproj @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding = "Windows-1252"?> +<?xml version="1.0" encoding="Windows-1252"?> <VisualStudioProject ProjectType="Visual C++" - Version="7.00" + Version="7.10" Name="genrb" SccProjectName="" SccLocalPath=""> @@ -35,17 +35,14 @@ CompileAs="0"/> <Tool Name="VCCustomBuildTool" - CommandLine="copy $(TargetPath) ..\..\..\bin + CommandLine="copy "$(TargetPath)" ..\..\..\bin " - Outputs="..\..\..\bin\$(InputName).exe"/> + Outputs="..\..\..\bin\$(TargetFileName)"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icuin.lib icuuc.lib icutu.lib" OutputFile=".\Release/genrb.exe" LinkIncremental="1" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\toolutil\Release,..\..\..\lib" ProgramDatabaseFile=".\Release/genrb.pdb" SubSystem="1"/> <Tool @@ -63,8 +60,14 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> <Configuration Name="Debug|Win32" @@ -95,17 +98,14 @@ CompileAs="0"/> <Tool Name="VCCustomBuildTool" - CommandLine="copy $(TargetPath) ..\..\..\bin + CommandLine="copy "$(TargetPath)" ..\..\..\bin " - Outputs="..\..\..\bin\$(InputName).exe"/> + Outputs="..\..\..\bin\$(TargetFileName)"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icuind.lib icuucd.lib icutud.lib" OutputFile=".\Debug/genrb.exe" LinkIncremental="2" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\toolutil\Debug,..\..\..\lib" GenerateDebugInformation="TRUE" ProgramDatabaseFile=".\Debug/genrb.pdb" SubSystem="1"/> @@ -124,10 +124,18 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> </Configurations> + <References> + </References> <Files> <Filter Name="Source Files" @@ -141,6 +149,9 @@ <File RelativePath=".\parse.c"> </File> + <File + RelativePath=".\prscmnts.cpp"> + </File> <File RelativePath=".\read.c"> </File> @@ -175,6 +186,9 @@ <File RelativePath=".\parse.h"> </File> + <File + RelativePath=".\prscmnts.h"> + </File> <File RelativePath=".\read.h"> </File> diff --git a/icuSources/tools/genrb/genrbjar.pl b/icuSources/tools/genrb/genrbjar.pl index eb1fb2df..12be04de 100644 --- a/icuSources/tools/genrb/genrbjar.pl +++ b/icuSources/tools/genrb/genrbjar.pl @@ -1,7 +1,7 @@ #!/usr/bin/perl # ******************************************************************** # * COPYRIGHT: -# * Copyright (c) 2002-2003, International Business Machines Corporation and +# * Copyright (c) 2002-2004, International Business Machines Corporation and # * others. All Rights Reserved. # ******************************************************************** @@ -19,21 +19,31 @@ use warnings; use File::Path; use File::Copy; -usage() unless (@ARGV >= 3); +my $isMSWin32 = ($^O eq 'MSWin32'); +usage() unless (@ARGV >= ($isMSWin32 ? 3:2)); my $ICU_ROOT = shift; my $ICU4J_ROOT = shift; -my $ldVar = shift; +my $prefix = ''; # e.g. "LD_LIBRARY_PATH=..." +my $flavor = ''; # e.g. "Debug/" +if ($isMSWin32) { + $flavor = shift() . '/'; +} else { + my $isDarwin = ($^O eq 'darwin'); + my $ldVar = ($isDarwin ? 'DYLD_LIBRARY_PATH' : 'LD_LIBRARY_PATH'); + $prefix = ($isMSWin32 ? '' : "$ldVar=$ICU_ROOT/source/common:$ICU_ROOT/source/i18n:$ICU_ROOT/source/tools/toolutil:$ICU_ROOT/source/data/out:$ICU_ROOT/source/data: "); +} +checkPlatform(); # Step 1. Run genrb. print "\n[Step 1: Run genrb]\n"; -my $genrb = "$ICU_ROOT/source/tools/genrb/genrb"; +my $genrb = "$ICU_ROOT/source/tools/genrb/${flavor}genrb"; my $dataDir = "$ICU_ROOT/source/data/locales"; my $javaRootDir = "$dataDir/java"; my $pkg = "com/ibm/icu/impl/data"; my $javaDir = "$javaRootDir/$pkg"; chdir($dataDir); mkpath($javaDir); -my $op = "$ldVar=$ICU_ROOT/source/common:$ICU_ROOT/source/i18n:$ICU_ROOT/source/tools/toolutil:$ICU_ROOT/source/data/out:$ICU_ROOT/source/data: $genrb -s. -d$javaDir -j -p com.ibm.icu.impl.data -b LocaleElements "; +my $op = "$prefix$genrb -s. -d$javaDir -j -p com.ibm.icu.impl.data -b LocaleElements "; print "{Command: $op*.txt}\n"; print "Directory: $dataDir\n"; my @list; @@ -160,6 +170,7 @@ print " $jarFile updated\n"; # Done! print "\n[All done]\n"; +checkPlatform(); exit(0); #----------------------------------------------------------------------- @@ -298,10 +309,25 @@ sub patchIndex { print " $file patched (index)\n"; } +#----------------------------------------------------------------------- +sub checkPlatform { + my $is_big_endian = unpack("h*", pack("s", 1)) =~ /01/; + if (!$is_big_endian) { + print "*******\n"; + print "WARNING: You are running on a LITTLE ENDIAN machine.\n"; + print "WARNING: You cannot use the resulting ICULocaleData.jar\n"; + print "WARNING: *.col files will have incorrect byte order.\n"; + print "*******\n"; + } +} + #----------------------------------------------------------------------- sub usage { print << "END"; -Usage: genrbjar.pl <icu_root_dir> <icu4j_root_dir> <ld_path_variable_name> [<locale>+] +Usage: genrbjar.pl <icu_root_dir> <icu4j_root_dir> [<locale>+] + genrbjar.pl <icu_root_dir> <icu4j_root_dir> ('Debug' | 'Release') [<locale>+] + +'Debug' or 'Release' is required on MSWin32, and absent on UNIX. genrbjar creates the ICULocaleData.jar file in the icu4j project. It uses locale data files in the icu4c directory and processes them with @@ -316,9 +342,14 @@ are listed, all locales are processed. Before running this tool, a JDK must be installed and the javac and jar binaries for that JDK must be on the system path. -e.g: - i) on MacOSX: ./genrbjar.pl /Users/build/ICU_MACOSX/icu /Users/build/icu4j DYLD_LIBRARY_PATH - ii) on Linux: ./genrbjar.pl /Users/build/ICU_MACOSX/icu /Users/build/icu4j LD_LIBRARY_PATH +Examples: + i) on Linux: ./genrbjar.pl ~/icu ~/icu4j + ii) on Win32: perl genrbjar.pl C:\\icu C:\\icu4j Debug + +NOTE: You CANNOT use the ICULocaleData.jar created on little endian +machines (e.g. Win32) because the *.col files will have the wrong byte +order. However, you can use the *.class files and look at the *.java +files. END exit(0); } diff --git a/icuSources/tools/genrb/parse.c b/icuSources/tools/genrb/parse.c index d6a641c5..786bf67a 100644 --- a/icuSources/tools/genrb/parse.c +++ b/icuSources/tools/genrb/parse.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1998-2003, International Business Machines +* Copyright (C) 1998-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -24,6 +24,7 @@ #include "uhash.h" #include "cmemory.h" #include "cstring.h" +#include "uinvchar.h" #include "read.h" #include "ustr.h" #include "reslist.h" @@ -31,12 +32,13 @@ #include "unicode/putil.h" /* Number of tokens to read ahead of the current stream position */ -#define MAX_LOOKAHEAD 2 +#define MAX_LOOKAHEAD 3 #define U_ICU_UNIDATA "unidata" #define CR 0x000D #define LF 0x000A #define SPACE 0x0020 +#define TAB 0x0009 #define ESCAPE 0x005C #define HASH 0x0023 #define QUOTE 0x0027 @@ -90,12 +92,13 @@ const char *resourceNames[] = struct Lookahead { enum ETokenType type; - struct UString value; - uint32_t line; + struct UString value; + struct UString comment; + uint32_t line; }; /* keep in sync with token defines in read.h */ -const char *tokenNames[] = +const char *tokenNames[TOK_TOKEN_COUNT] = { "string", /* A string token, such as "MonthNames" */ "'{'", /* An opening brace character */ @@ -104,7 +107,7 @@ const char *tokenNames[] = "':'", /* A colon */ "<end of file>", /* End of the file has been reached successfully */ - "<error>", /* An error, such an unterminated quoted string */ + "<end of line>" }; /* Just to store "TRUE" */ @@ -120,7 +123,7 @@ static uint32_t inputdirLength; static UBool gMakeBinaryCollation = TRUE; -static struct SResource *parseResource(char *tag, UErrorCode *status); +static struct SResource *parseResource(char *tag, const struct UString *comment, UErrorCode *status); void initParser(UBool makeBinaryCollation) { @@ -176,8 +179,7 @@ initLookahead(UCHARBUF *buf, UErrorCode *status) for (i = 0; i < MAX_LOOKAHEAD; i++) { - lookahead[i].type = getNextToken(buffer, &lookahead[i].value, &lookahead[i].line, status); - + lookahead[i].type = getNextToken(buffer, &lookahead[i].value, &lookahead[i].line, &lookahead[i].comment, status); if (U_FAILURE(*status)) { return; @@ -188,7 +190,7 @@ initLookahead(UCHARBUF *buf, UErrorCode *status) } static enum ETokenType -getToken(struct UString **tokenValue, uint32_t *linenumber, UErrorCode *status) +getToken(struct UString **tokenValue, struct UString* comment, uint32_t *linenumber, UErrorCode *status) { enum ETokenType result; uint32_t i; @@ -205,9 +207,16 @@ getToken(struct UString **tokenValue, uint32_t *linenumber, UErrorCode *status) *linenumber = lookahead[lookaheadPosition].line; } + if (comment != NULL) + { + ustr_cpy(comment, &(lookahead[lookaheadPosition].comment), status); + } + i = (lookaheadPosition + MAX_LOOKAHEAD) % (MAX_LOOKAHEAD + 1); lookaheadPosition = (lookaheadPosition + 1) % (MAX_LOOKAHEAD + 1); - lookahead[i].type = getNextToken(buffer, &lookahead[i].value, &lookahead[i].line, status); + ustr_setlen(&lookahead[i].comment, 0, status); + ustr_setlen(&lookahead[i].value, 0, status); + lookahead[i].type = getNextToken(buffer, &lookahead[i].value, &lookahead[i].line, &lookahead[i].comment, status); /* printf("getToken, returning %s\n", tokenNames[result]); */ @@ -215,7 +224,7 @@ getToken(struct UString **tokenValue, uint32_t *linenumber, UErrorCode *status) } static enum ETokenType -peekToken(uint32_t lookaheadCount, struct UString **tokenValue, uint32_t *linenumber, UErrorCode *status) +peekToken(uint32_t lookaheadCount, struct UString **tokenValue, uint32_t *linenumber, struct UString *comment, UErrorCode *status) { uint32_t i = (lookaheadPosition + lookaheadCount) % (MAX_LOOKAHEAD + 1); @@ -240,14 +249,19 @@ peekToken(uint32_t lookaheadCount, struct UString **tokenValue, uint32_t *linenu *linenumber = lookahead[i].line; } + if(comment != NULL){ + ustr_cpy(comment, &(lookahead[lookaheadPosition].comment), status); + } + return lookahead[i].type; } static void -expect(enum ETokenType expectedToken, struct UString **tokenValue, uint32_t *linenumber, UErrorCode *status) +expect(enum ETokenType expectedToken, struct UString **tokenValue, struct UString *comment, uint32_t *linenumber, UErrorCode *status) { uint32_t line; - enum ETokenType token = getToken(tokenValue, &line, status); + + enum ETokenType token = getToken(tokenValue, comment, &line, status); if (U_FAILURE(*status)) { @@ -270,21 +284,27 @@ expect(enum ETokenType expectedToken, struct UString **tokenValue, uint32_t *lin } } -static char *getInvariantString(uint32_t *line, UErrorCode *status) +static char *getInvariantString(uint32_t *line, struct UString *comment, UErrorCode *status) { struct UString *tokenValue; char *result; uint32_t count; - expect(TOK_STRING, &tokenValue, line, status); + expect(TOK_STRING, &tokenValue, comment, line, status); if (U_FAILURE(*status)) { return NULL; } - count = u_strlen(tokenValue->fChars) + 1; - result = uprv_malloc(count); + count = u_strlen(tokenValue->fChars); + if(!uprv_isInvariantUString(tokenValue->fChars, count)) { + *status = U_INVALID_FORMAT_ERROR; + error(*line, "invariant characters required for table keys, binary data, etc."); + return NULL; + } + + result = uprv_malloc(count+1); if (result == NULL) { @@ -292,7 +312,7 @@ static char *getInvariantString(uint32_t *line, UErrorCode *status) return NULL; } - u_UCharsToChars(tokenValue->fChars, result, count); + u_UCharsToChars(tokenValue->fChars, result, count+1); return result; } @@ -300,10 +320,11 @@ static enum EResourceType parseResourceType(UErrorCode *status) { struct UString *tokenValue; + struct UString comment; enum EResourceType result = RT_UNKNOWN; uint32_t line=0; - - expect(TOK_STRING, &tokenValue, &line, status); + ustr_init(&comment); + expect(TOK_STRING, &tokenValue, &comment, &line, status); if (U_FAILURE(*status)) { @@ -352,6 +373,7 @@ parseUCARules(char *tag, uint32_t startline, UErrorCode *status) { struct SResource *result = NULL; struct UString *tokenValue; + struct UString comment; FileStream *file = NULL; char filename[256] = { '\0' }; char cs[128] = { '\0' }; @@ -366,10 +388,11 @@ parseUCARules(char *tag, uint32_t startline, UErrorCode *status) UChar *targetLimit = NULL; int32_t size = 0; - expect(TOK_STRING, &tokenValue, &line, status); + ustr_init(&comment); + expect(TOK_STRING, &tokenValue, &comment, &line, status); if(isVerbose()){ - printf(" %s at line %i \n", (tag == NULL) ? "(null)" : tag,startline); + printf(" %s at line %i \n", (tag == NULL) ? "(null)" : tag, (int)startline); } if (U_FAILURE(*status)) @@ -389,7 +412,7 @@ parseUCARules(char *tag, uint32_t startline, UErrorCode *status) u_UCharsToChars(tokenValue->fChars, cs, tokenValue->fLength); - expect(TOK_CLOSE_BRACE, NULL, NULL, status); + expect(TOK_CLOSE_BRACE, NULL, NULL, NULL, status); if (U_FAILURE(*status)) { @@ -415,6 +438,7 @@ parseUCARules(char *tag, uint32_t startline, UErrorCode *status) */ size = ucbuf_size(ucbuf); pTarget = (UChar*) uprv_malloc(U_SIZEOF_UCHAR * size); + uprv_memset(pTarget, 0, size*U_SIZEOF_UCHAR); target = pTarget; targetLimit = pTarget+size; @@ -423,16 +447,16 @@ parseUCARules(char *tag, uint32_t startline, UErrorCode *status) { c = ucbuf_getc(ucbuf, status); if(c == QUOTE) { - quoted = !quoted; + quoted = (UBool)!quoted; } /* weiv (06/26/2002): adding the following: * - preserving spaces in commands [...] * - # comments until the end of line */ - if (c == STARTCOMMAND) + if (c == STARTCOMMAND && !quoted) { - /* preserve commands - * closing bracket will be handled by the + /* preserve commands + * closing bracket will be handled by the * append at the end of the loop */ while(c != ENDCOMMAND) { @@ -444,6 +468,7 @@ parseUCARules(char *tag, uint32_t startline, UErrorCode *status) while(c != CR && c != LF) { c = ucbuf_getc(ucbuf, status); } + continue; } else if (c == ESCAPE) { c = unescape(ucbuf, status); @@ -455,7 +480,7 @@ parseUCARules(char *tag, uint32_t startline, UErrorCode *status) return NULL; } } - else if (c == SPACE || c == CR || c == LF) + else if (!quoted && (c == SPACE || c == TAB || c == CR || c == LF)) { /* ignore spaces carriage returns * and line feed unless in the form \uXXXX @@ -474,7 +499,13 @@ parseUCARules(char *tag, uint32_t startline, UErrorCode *status) } } - result = string_open(bundle, tag, pTarget, target - pTarget, status); + /* terminate the string */ + if(target < targetLimit){ + *target = 0x0000; + } + + result = string_open(bundle, tag, pTarget, (int32_t)(target - pTarget), NULL, status); + ucbuf_close(ucbuf); uprv_free(pTarget); @@ -484,7 +515,7 @@ parseUCARules(char *tag, uint32_t startline, UErrorCode *status) } static struct SResource * -parseString(char *tag, uint32_t startline, UErrorCode *status) +parseString(char *tag, uint32_t startline, const struct UString* comment, UErrorCode *status) { struct UString *tokenValue; struct SResource *result = NULL; @@ -494,18 +525,18 @@ parseString(char *tag, uint32_t startline, UErrorCode *status) return parseUCARules(tag, startline, status); } if(isVerbose()){ - printf(" string %s at line %i \n", (tag == NULL) ? "(null)" : tag,startline); + printf(" string %s at line %i \n", (tag == NULL) ? "(null)" : tag, (int)startline); } - expect(TOK_STRING, &tokenValue, NULL, status); + expect(TOK_STRING, &tokenValue, NULL, NULL, status); if (U_SUCCESS(*status)) { /* create the string now - tokenValue doesn't survive a call to getToken (and therefore doesn't survive expect either) */ - result = string_open(bundle, tag, tokenValue->fChars, tokenValue->fLength, status); + result = string_open(bundle, tag, tokenValue->fChars, tokenValue->fLength, comment, status); if(U_SUCCESS(*status) && result) { - expect(TOK_CLOSE_BRACE, NULL, NULL, status); + expect(TOK_CLOSE_BRACE, NULL, NULL, NULL, status); if (U_FAILURE(*status)) { @@ -519,15 +550,15 @@ parseString(char *tag, uint32_t startline, UErrorCode *status) } static struct SResource * -parseAlias(char *tag, uint32_t startline, UErrorCode *status) +parseAlias(char *tag, uint32_t startline, const struct UString *comment, UErrorCode *status) { struct UString *tokenValue; - struct SResource *result = NULL; + struct SResource *result = NULL; - expect(TOK_STRING, &tokenValue, NULL, status); + expect(TOK_STRING, &tokenValue, NULL, NULL, status); if(isVerbose()){ - printf(" alias %s at line %i \n", (tag == NULL) ? "(null)" : tag,startline); + printf(" alias %s at line %i \n", (tag == NULL) ? "(null)" : tag, (int)startline); } if (U_SUCCESS(*status)) @@ -535,9 +566,9 @@ parseAlias(char *tag, uint32_t startline, UErrorCode *status) /* create the string now - tokenValue doesn't survive a call to getToken (and therefore doesn't survive expect either) */ - result = alias_open(bundle, tag, tokenValue->fChars, tokenValue->fLength, status); + result = alias_open(bundle, tag, tokenValue->fChars, tokenValue->fLength, comment, status); - expect(TOK_CLOSE_BRACE, NULL, NULL, status); + expect(TOK_CLOSE_BRACE, NULL, NULL, NULL, status); if (U_FAILURE(*status)) { @@ -550,30 +581,23 @@ parseAlias(char *tag, uint32_t startline, UErrorCode *status) } static struct SResource * -parseCollationElements(char *tag, uint32_t startline, UErrorCode *status) +addCollation(struct SResource *result, uint32_t startline, UErrorCode *status) { - struct SResource *result = NULL; struct SResource *member = NULL; struct UString *tokenValue; + struct UString comment; enum ETokenType token; char subtag[1024]; UVersionInfo version; UBool override = FALSE; uint32_t line; - - result = table_open(bundle, tag, status); - - if (result == NULL || U_FAILURE(*status)) - { - return NULL; - } - if(isVerbose()){ - printf(" collation elements %s at line %i \n", (tag == NULL) ? "(null)" : tag,startline); - } /* '{' . (name resource)* '}' */ + version[0]=0; version[1]=0; version[2]=0; version[3]=0; + for (;;) { - token = getToken(&tokenValue, &line, status); + ustr_init(&comment); + token = getToken(&tokenValue, &comment, &line, status); if (token == TOK_CLOSE_BRACE) { @@ -605,7 +629,7 @@ parseCollationElements(char *tag, uint32_t startline, UErrorCode *status) return NULL; } - member = parseResource(subtag, status); + member = parseResource(subtag, NULL, status); if (U_FAILURE(*status)) { @@ -667,7 +691,10 @@ parseCollationElements(char *tag, uint32_t startline, UErrorCode *status) if (U_SUCCESS(intStatus) && coll != NULL) { - data = ucol_cloneRuleData(coll, &len, &intStatus); + len = ucol_cloneBinary(coll, NULL, 0, &intStatus); + data = (uint8_t *)uprv_malloc(len); + len = ucol_cloneBinary(coll, data, len, &intStatus); + /*data = ucol_cloneRuleData(coll, &len, &intStatus);*/ /* tailoring rules version */ /* This is wrong! */ @@ -680,7 +707,7 @@ parseCollationElements(char *tag, uint32_t startline, UErrorCode *status) if (U_SUCCESS(intStatus) && data != NULL) { - member = bin_open(bundle, "%%CollationBin", len, data, NULL, status); + member = bin_open(bundle, "%%CollationBin", len, data, NULL, NULL, status); /*table_add(bundle->fRoot, member, line, status);*/ table_add(result, member, line, status); uprv_free(data); @@ -700,7 +727,7 @@ parseCollationElements(char *tag, uint32_t startline, UErrorCode *status) { warning(line, "%%Collation could not be constructed from CollationElements - check context!"); if(isStrict()){ - *status = U_INVALID_FORMAT_ERROR; + *status = intStatus; return NULL; } } @@ -729,6 +756,124 @@ parseCollationElements(char *tag, uint32_t startline, UErrorCode *status) return NULL;*/ } +static struct SResource * +parseCollationElements(char *tag, uint32_t startline, UBool newCollation, UErrorCode *status) +{ + struct SResource *result = NULL; + struct SResource *member = NULL; + struct SResource *collationRes = NULL; + struct UString *tokenValue; + struct UString comment; + enum ETokenType token; + char subtag[1024], typeKeyword[1024]; + uint32_t line; + + result = table_open(bundle, tag, NULL, status); + + if (result == NULL || U_FAILURE(*status)) + { + return NULL; + } + if(isVerbose()){ + printf(" collation elements %s at line %i \n", (tag == NULL) ? "(null)" : tag, (int)startline); + } + if(!newCollation) { + return addCollation(result, startline, status); + } else { + for(;;) { + ustr_init(&comment); + token = getToken(&tokenValue, &comment, &line, status); + + if (token == TOK_CLOSE_BRACE) + { + return result; + } + + if (token != TOK_STRING) + { + table_close(result, status); + *status = U_INVALID_FORMAT_ERROR; + + if (token == TOK_EOF) + { + error(startline, "unterminated table"); + } + else + { + error(line, "Unexpected token %s", tokenNames[token]); + } + + return NULL; + } + + u_UCharsToChars(tokenValue->fChars, subtag, u_strlen(tokenValue->fChars) + 1); + + if (U_FAILURE(*status)) + { + table_close(result, status); + return NULL; + } + + if (uprv_strcmp(subtag, "default") == 0) + { + member = parseResource(subtag, NULL, status); + + if (U_FAILURE(*status)) + { + table_close(result, status); + return NULL; + } + + table_add(result, member, line, status); + } + else + { + token = peekToken(0, &tokenValue, &line, &comment, status); + /* this probably needs to be refactored or recursively use the parser */ + /* first we assume that our collation table won't have the explicit type */ + /* then, we cannot handle aliases */ + if(token == TOK_OPEN_BRACE) { + token = getToken(&tokenValue, &comment, &line, status); + collationRes = table_open(bundle, subtag, NULL, status); + table_add(result, addCollation(collationRes, startline, status), startline, status); + } else if(token == TOK_COLON) { /* right now, we'll just try to see if we have aliases */ + /* we could have a table too */ + token = peekToken(1, &tokenValue, &line, &comment, status); + u_UCharsToChars(tokenValue->fChars, typeKeyword, u_strlen(tokenValue->fChars) + 1); + if(uprv_strcmp(typeKeyword, "alias") == 0) { + member = parseResource(subtag, NULL, status); + + if (U_FAILURE(*status)) + { + table_close(result, status); + return NULL; + } + + table_add(result, member, line, status); + } else { + *status = U_INVALID_FORMAT_ERROR; + return NULL; + } + } else { + *status = U_INVALID_FORMAT_ERROR; + return NULL; + } + } + + /*member = string_open(bundle, subtag, tokenValue->fChars, tokenValue->fLength, status);*/ + + /*expect(TOK_CLOSE_BRACE, NULL, NULL, status);*/ + + if (U_FAILURE(*status)) + { + table_close(result, status); + return NULL; + } + + } + } +} + /* Necessary, because CollationElements requires the bundle->fRoot member to be present which, if this weren't special-cased, wouldn't be set until the entire file had been processed. */ static struct SResource * @@ -736,6 +881,7 @@ realParseTable(struct SResource *table, char *tag, uint32_t startline, UErrorCod { struct SResource *member = NULL; struct UString *tokenValue=NULL; + struct UString comment; enum ETokenType token; char subtag[1024]; uint32_t line; @@ -743,11 +889,12 @@ realParseTable(struct SResource *table, char *tag, uint32_t startline, UErrorCod /* '{' . (name resource)* '}' */ if(isVerbose()){ - printf(" parsing table %s at line %i \n", (tag == NULL) ? "(null)" : tag,startline); + printf(" parsing table %s at line %i \n", (tag == NULL) ? "(null)" : tag, (int)startline); } for (;;) { - token = getToken(&tokenValue, &line, status); + ustr_init(&comment); + token = getToken(&tokenValue, &comment, &line, status); if (token == TOK_CLOSE_BRACE) { @@ -768,13 +915,20 @@ realParseTable(struct SResource *table, char *tag, uint32_t startline, UErrorCod } else { - error(line, "enexpected token %s", tokenNames[token]); + error(line, "unexpected token %s", tokenNames[token]); } return NULL; } - u_UCharsToChars(tokenValue->fChars, subtag, u_strlen(tokenValue->fChars) + 1); + if(uprv_isInvariantUString(tokenValue->fChars, -1)) { + u_UCharsToChars(tokenValue->fChars, subtag, u_strlen(tokenValue->fChars) + 1); + } else { + *status = U_INVALID_FORMAT_ERROR; + error(line, "invariant characters required for table keys"); + table_close(table, status); + return NULL; + } if (U_FAILURE(*status)) { @@ -783,7 +937,7 @@ realParseTable(struct SResource *table, char *tag, uint32_t startline, UErrorCod return NULL; } - member = parseResource(subtag, status); + member = parseResource(subtag, &comment, status); if (member == NULL || U_FAILURE(*status)) { @@ -810,54 +964,67 @@ realParseTable(struct SResource *table, char *tag, uint32_t startline, UErrorCod } static struct SResource * -parseTable(char *tag, uint32_t startline, UErrorCode *status) +parseTable(char *tag, uint32_t startline, const struct UString *comment, UErrorCode *status) { struct SResource *result; if (tag != NULL && uprv_strcmp(tag, "CollationElements") == 0) { - return parseCollationElements(tag, startline, status); + return parseCollationElements(tag, startline, FALSE, status); + } + if (tag != NULL && uprv_strcmp(tag, "collations") == 0) + { + return parseCollationElements(tag, startline, TRUE, status); } if(isVerbose()){ - printf(" table %s at line %i \n", (tag == NULL) ? "(null)" : tag,startline); + printf(" table %s at line %i \n", (tag == NULL) ? "(null)" : tag, (int)startline); } - result = table_open(bundle, tag, status); + + result = table_open(bundle, tag, comment, status); if (result == NULL || U_FAILURE(*status)) { return NULL; } - return realParseTable(result, tag, startline, status); + return realParseTable(result, tag, startline, status); } static struct SResource * -parseArray(char *tag, uint32_t startline, UErrorCode *status) +parseArray(char *tag, uint32_t startline, const struct UString *comment, UErrorCode *status) { struct SResource *result = NULL; struct SResource *member = NULL; struct UString *tokenValue; + struct UString memberComments; enum ETokenType token; UBool readToken = FALSE; - result = array_open(bundle, tag, status); + result = array_open(bundle, tag, comment, status); if (result == NULL || U_FAILURE(*status)) { return NULL; } if(isVerbose()){ - printf(" array %s at line %i \n", (tag == NULL) ? "(null)" : tag,startline); + printf(" array %s at line %i \n", (tag == NULL) ? "(null)" : tag, (int)startline); } + + ustr_init(&memberComments); + /* '{' . resource [','] '}' */ for (;;) { + /* reset length */ + ustr_setlen(&memberComments, 0, status); + /* check for end of array, but don't consume next token unless it really is the end */ - token = peekToken(0, &tokenValue, NULL, status); + token = peekToken(0, &tokenValue, NULL, &memberComments, status); + if (token == TOK_CLOSE_BRACE) { - getToken(NULL, NULL, status); + getToken(NULL, NULL, NULL, status); if (!readToken) { warning(startline, "Encountered empty array"); } @@ -875,12 +1042,12 @@ parseArray(char *tag, uint32_t startline, UErrorCode *status) /* string arrays are a special case */ if (token == TOK_STRING) { - getToken(&tokenValue, NULL, status); - member = string_open(bundle, NULL, tokenValue->fChars, tokenValue->fLength, status); + getToken(&tokenValue, &memberComments, NULL, status); + member = string_open(bundle, NULL, tokenValue->fChars, tokenValue->fLength, &memberComments, status); } else { - member = parseResource(NULL, status); + member = parseResource(NULL, &memberComments, status); } if (member == NULL || U_FAILURE(*status)) @@ -898,11 +1065,11 @@ parseArray(char *tag, uint32_t startline, UErrorCode *status) } /* eat optional comma if present */ - token = peekToken(0, NULL, NULL, status); + token = peekToken(0, NULL, NULL, NULL, status); if (token == TOK_COMMA) { - getToken(NULL, NULL, status); + getToken(NULL, NULL, NULL, status); } if (U_FAILURE(*status)) @@ -917,7 +1084,7 @@ parseArray(char *tag, uint32_t startline, UErrorCode *status) } static struct SResource * -parseIntVector(char *tag, uint32_t startline, UErrorCode *status) +parseIntVector(char *tag, uint32_t startline, const struct UString *comment, UErrorCode *status) { struct SResource *result = NULL; enum ETokenType token; @@ -927,8 +1094,9 @@ parseIntVector(char *tag, uint32_t startline, UErrorCode *status) /* added by Jing/GCL */ char *stopstring; uint32_t len; + struct UString memberComments; - result = intvector_open(bundle, tag, status); + result = intvector_open(bundle, tag, comment, status); if (result == NULL || U_FAILURE(*status)) { @@ -936,26 +1104,28 @@ parseIntVector(char *tag, uint32_t startline, UErrorCode *status) } if(isVerbose()){ - printf(" vector %s at line %i \n", (tag == NULL) ? "(null)" : tag,startline); + printf(" vector %s at line %i \n", (tag == NULL) ? "(null)" : tag, (int)startline); } - + ustr_init(&memberComments); /* '{' . string [','] '}' */ for (;;) { + ustr_setlen(&memberComments, 0, status); + /* check for end of array, but don't consume next token unless it really is the end */ - token = peekToken(0, NULL, NULL, status); + token = peekToken(0, NULL, NULL,&memberComments, status); if (token == TOK_CLOSE_BRACE) { /* it's the end, consume the close brace */ - getToken(NULL, NULL, status); + getToken(NULL, NULL, NULL, status); if (!readToken) { warning(startline, "Encountered empty int vector"); } return result; } - string = getInvariantString(NULL, status); + string = getInvariantString(NULL, NULL, status); if (U_FAILURE(*status)) { @@ -972,13 +1142,13 @@ parseIntVector(char *tag, uint32_t startline, UErrorCode *status) /* The following is added by Jing/GCL to handle illegal char in the Intvector */ value = uprv_strtoul(string, &stopstring, 0);/* make intvector support decimal,hexdigit,octal digit ranging from -2^31-2^32-1*/ - len=stopstring-string; + len=(uint32_t)(stopstring-string); if(len==uprv_strlen(string)) { intvector_add(result, value, status); uprv_free(string); - token = peekToken(0, NULL, NULL, status); + token = peekToken(0, NULL, NULL, NULL, status); } else { @@ -997,7 +1167,7 @@ parseIntVector(char *tag, uint32_t startline, UErrorCode *status) consecutive entries) so that a missing comma on the last entry isn't an error */ if (token == TOK_COMMA) { - getToken(NULL, NULL, status); + getToken(NULL, NULL, NULL, status); } readToken = TRUE; } @@ -1010,7 +1180,7 @@ parseIntVector(char *tag, uint32_t startline, UErrorCode *status) } static struct SResource * -parseBinary(char *tag, uint32_t startline, UErrorCode *status) +parseBinary(char *tag, uint32_t startline, const struct UString *comment, UErrorCode *status) { struct SResource *result = NULL; uint8_t *value; @@ -1023,14 +1193,14 @@ parseBinary(char *tag, uint32_t startline, UErrorCode *status) char *stopstring; uint32_t len; - string = getInvariantString(&line, status); + string = getInvariantString(&line, NULL, status); if (string == NULL || U_FAILURE(*status)) { return NULL; } - expect(TOK_CLOSE_BRACE, NULL, NULL, status); + expect(TOK_CLOSE_BRACE, NULL, NULL, NULL, status); if (U_FAILURE(*status)) { @@ -1039,10 +1209,10 @@ parseBinary(char *tag, uint32_t startline, UErrorCode *status) } if(isVerbose()){ - printf(" binary %s at line %i \n", (tag == NULL) ? "(null)" : tag,startline); + printf(" binary %s at line %i \n", (tag == NULL) ? "(null)" : tag, (int)startline); } - count = uprv_strlen(string); + count = (uint32_t)uprv_strlen(string); if (count > 0){ if((count % 2)==0){ value = uprv_malloc(sizeof(uint8_t) * count); @@ -1060,7 +1230,7 @@ parseBinary(char *tag, uint32_t startline, UErrorCode *status) toConv[1] = string[i + 1]; value[i >> 1] = (uint8_t) uprv_strtoul(toConv, &stopstring, 16); - len=stopstring-toConv; + len=(uint32_t)(stopstring-toConv); if(len!=uprv_strlen(toConv)) { @@ -1070,7 +1240,7 @@ parseBinary(char *tag, uint32_t startline, UErrorCode *status) } } - result = bin_open(bundle, tag, (i >> 1), value,NULL, status); + result = bin_open(bundle, tag, (i >> 1), value,NULL, comment, status); uprv_free(value); } @@ -1084,7 +1254,7 @@ parseBinary(char *tag, uint32_t startline, UErrorCode *status) } else { - result = bin_open(bundle, tag, 0, NULL, "",status); + result = bin_open(bundle, tag, 0, NULL, "",comment,status); warning(startline, "Encountered empty binary tag"); } uprv_free(string); @@ -1093,7 +1263,7 @@ parseBinary(char *tag, uint32_t startline, UErrorCode *status) } static struct SResource * -parseInteger(char *tag, uint32_t startline, UErrorCode *status) +parseInteger(char *tag, uint32_t startline, const struct UString *comment, UErrorCode *status) { struct SResource *result = NULL; int32_t value; @@ -1102,14 +1272,14 @@ parseInteger(char *tag, uint32_t startline, UErrorCode *status) char *stopstring; uint32_t len; - string = getInvariantString(NULL, status); + string = getInvariantString(NULL, NULL, status); if (string == NULL || U_FAILURE(*status)) { return NULL; } - expect(TOK_CLOSE_BRACE, NULL, NULL, status); + expect(TOK_CLOSE_BRACE, NULL, NULL, NULL, status); if (U_FAILURE(*status)) { @@ -1118,7 +1288,7 @@ parseInteger(char *tag, uint32_t startline, UErrorCode *status) } if(isVerbose()){ - printf(" integer %s at line %i \n", (tag == NULL) ? "(null)" : tag,startline); + printf(" integer %s at line %i \n", (tag == NULL) ? "(null)" : tag, (int)startline); } if (uprv_strlen(string) <= 0) @@ -1133,10 +1303,10 @@ parseInteger(char *tag, uint32_t startline, UErrorCode *status) /* to make integer support hexdecimal, octal digit and decimal*/ /* to handle illegal char in the integer*/ value = uprv_strtoul(string, &stopstring, 0); - len=stopstring-string; + len=(uint32_t)(stopstring-string); if(len==uprv_strlen(string)) { - result = int_open(bundle, tag, value, status); + result = int_open(bundle, tag, value, comment, status); } else { @@ -1148,7 +1318,7 @@ parseInteger(char *tag, uint32_t startline, UErrorCode *status) } static struct SResource * -parseImport(char *tag, uint32_t startline, UErrorCode *status) +parseImport(char *tag, uint32_t startline, const struct UString* comment, UErrorCode *status) { struct SResource *result; FileStream *file; @@ -1158,14 +1328,14 @@ parseImport(char *tag, uint32_t startline, UErrorCode *status) uint32_t line; char *fullname = NULL; int32_t numRead = 0; - filename = getInvariantString(&line, status); + filename = getInvariantString(&line, NULL, status); if (U_FAILURE(*status)) { return NULL; } - expect(TOK_CLOSE_BRACE, NULL, NULL, status); + expect(TOK_CLOSE_BRACE, NULL, NULL, NULL, status); if (U_FAILURE(*status)) { @@ -1174,7 +1344,7 @@ parseImport(char *tag, uint32_t startline, UErrorCode *status) } if(isVerbose()){ - printf(" import %s at line %i \n", (tag == NULL) ? "(null)" : tag,startline); + printf(" import %s at line %i \n", (tag == NULL) ? "(null)" : tag, (int)startline); } /* Open the input file for reading */ @@ -1185,7 +1355,7 @@ parseImport(char *tag, uint32_t startline, UErrorCode *status) else { - int32_t count = uprv_strlen(filename); + int32_t count = (int32_t)uprv_strlen(filename); if (inputdir[inputdirLength - 1] != U_FILE_SEP_CHAR) { @@ -1244,7 +1414,7 @@ parseImport(char *tag, uint32_t startline, UErrorCode *status) numRead = T_FileStream_read (file, data, len); T_FileStream_close (file); - result = bin_open(bundle, tag, len, data, fullname, status); + result = bin_open(bundle, tag, len, data, fullname, comment, status); uprv_free(data); uprv_free(filename); @@ -1254,7 +1424,7 @@ parseImport(char *tag, uint32_t startline, UErrorCode *status) } static struct SResource * -parseInclude(char *tag, uint32_t startline, UErrorCode *status) +parseInclude(char *tag, uint32_t startline, const struct UString* comment, UErrorCode *status) { struct SResource *result; int32_t len=0; @@ -1268,15 +1438,15 @@ parseInclude(char *tag, uint32_t startline, UErrorCode *status) const char* cp = NULL; const UChar* uBuffer = NULL; - filename = getInvariantString(&line, status); - count = uprv_strlen(filename); + filename = getInvariantString(&line, NULL, status); + count = (int32_t)uprv_strlen(filename); if (U_FAILURE(*status)) { return NULL; } - expect(TOK_CLOSE_BRACE, NULL, NULL, status); + expect(TOK_CLOSE_BRACE, NULL, NULL, NULL, status); if (U_FAILURE(*status)) { @@ -1285,7 +1455,7 @@ parseInclude(char *tag, uint32_t startline, UErrorCode *status) } if(isVerbose()){ - printf(" include %s at line %i \n", (tag == NULL) ? "(null)" : tag,startline); + printf(" include %s at line %i \n", (tag == NULL) ? "(null)" : tag, (int)startline); } fullname = (char *) uprv_malloc(inputdirLength + count + 2); @@ -1295,7 +1465,7 @@ parseInclude(char *tag, uint32_t startline, UErrorCode *status) *status = U_MEMORY_ALLOCATION_ERROR; uprv_free(filename); return NULL; - } + } if(inputdir!=NULL){ if (inputdir[inputdirLength - 1] != U_FILE_SEP_CHAR) @@ -1325,7 +1495,7 @@ parseInclude(char *tag, uint32_t startline, UErrorCode *status) } uBuffer = ucbuf_getBuffer(ucbuf,&len,status); - result = string_open(bundle, tag, uBuffer, len, status); + result = string_open(bundle, tag, uBuffer, len, comment, status); uprv_free(pTarget); @@ -1336,7 +1506,7 @@ parseInclude(char *tag, uint32_t startline, UErrorCode *status) } static struct SResource * -parseResource(char *tag, UErrorCode *status) +parseResource(char *tag, const struct UString *comment, UErrorCode *status) { enum ETokenType token; enum EResourceType resType = RT_UNKNOWN; @@ -1344,10 +1514,10 @@ parseResource(char *tag, UErrorCode *status) uint32_t startline; uint32_t line; - token = getToken(&tokenValue, &startline, status); + token = getToken(&tokenValue, NULL, &startline, status); if(isVerbose()){ - printf(" resource %s at line %i \n", (tag == NULL) ? "(null)" : tag,startline); + printf(" resource %s at line %i \n", (tag == NULL) ? "(null)" : tag, (int)startline); } /* name . [ ':' type ] '{' resource '}' */ @@ -1367,7 +1537,7 @@ parseResource(char *tag, UErrorCode *status) case TOK_COLON: resType = parseResourceType(status); - expect(TOK_OPEN_BRACE, &tokenValue, &startline, status); + expect(TOK_OPEN_BRACE, &tokenValue, NULL, &startline, status); if (U_FAILURE(*status)) { @@ -1402,7 +1572,7 @@ parseResource(char *tag, UErrorCode *status) { string } => string */ - token = peekToken(0, NULL, &line, status); + token = peekToken(0, NULL, &line, NULL,status); if (U_FAILURE(*status)) { @@ -1417,7 +1587,7 @@ parseResource(char *tag, UErrorCode *status) } else if (token == TOK_STRING) { - token = peekToken(1, NULL, &line, status); + token = peekToken(1, NULL, &line, NULL, status); if (U_FAILURE(*status)) { @@ -1451,15 +1621,15 @@ parseResource(char *tag, UErrorCode *status) function and return. */ switch (resType) { - case RT_STRING: return parseString (tag, startline, status); - case RT_TABLE: return parseTable (tag, startline, status); - case RT_ARRAY: return parseArray (tag, startline, status); - case RT_ALIAS: return parseAlias (tag, startline, status); - case RT_BINARY: return parseBinary (tag, startline, status); - case RT_INTEGER: return parseInteger (tag, startline, status); - case RT_IMPORT: return parseImport (tag, startline, status); - case RT_INCLUDE: return parseInclude (tag, startline, status); - case RT_INTVECTOR: return parseIntVector (tag, startline, status); + case RT_STRING: return parseString (tag, startline, comment, status); + case RT_TABLE: return parseTable (tag, startline, comment, status); + case RT_ARRAY: return parseArray (tag, startline, comment, status); + case RT_ALIAS: return parseAlias (tag, startline, comment, status); + case RT_BINARY: return parseBinary (tag, startline, comment, status); + case RT_INTEGER: return parseInteger (tag, startline, comment, status); + case RT_IMPORT: return parseImport (tag, startline, comment, status); + case RT_INCLUDE: return parseInclude (tag, startline, comment, status); + case RT_INTVECTOR: return parseIntVector (tag, startline, comment, status); default: *status = U_INTERNAL_PROGRAM_ERROR; @@ -1473,6 +1643,7 @@ struct SRBRoot * parse(UCHARBUF *buf, const char *currentInputDir, UErrorCode *status) { struct UString *tokenValue; + struct UString comment; uint32_t line; /* added by Jing/GCL */ enum EResourceType bundleType; @@ -1481,21 +1652,24 @@ parse(UCHARBUF *buf, const char *currentInputDir, UErrorCode *status) initLookahead(buf, status); inputdir = currentInputDir; - inputdirLength = (inputdir != NULL) ? uprv_strlen(inputdir) : 0; + inputdirLength = (inputdir != NULL) ? (uint32_t)uprv_strlen(inputdir) : 0; + + ustr_init(&comment); + expect(TOK_STRING, &tokenValue, &comment, NULL, status); - bundle = bundle_open(status); + bundle = bundle_open(&comment, status); if (bundle == NULL || U_FAILURE(*status)) { return NULL; } - expect(TOK_STRING, &tokenValue, NULL, status); + bundle_setlocale(bundle, tokenValue->fChars, status); /* Commented by Jing/GCL */ /* expect(TOK_OPEN_BRACE, NULL, &line, status); */ /* The following code is to make Empty bundle work no matter with :table specifer or not */ - token = getToken(NULL, &line, status); + token = getToken(NULL, NULL, &line, status); if(token==TOK_COLON) { @@ -1512,7 +1686,7 @@ parse(UCHARBUF *buf, const char *currentInputDir, UErrorCode *status) if(bundleType==RT_TABLE) { - expect(TOK_OPEN_BRACE, NULL, &line, status); + expect(TOK_OPEN_BRACE, NULL, NULL, &line, status); } else { @@ -1547,7 +1721,7 @@ parse(UCHARBUF *buf, const char *currentInputDir, UErrorCode *status) return NULL; } - if (getToken(NULL, &line, status) != TOK_EOF) + if (getToken(NULL, NULL, &line, status) != TOK_EOF) { warning(line, "extraneous text after resource bundle (perhaps unmatched braces)"); if(isStrict()){ diff --git a/icuSources/tools/genrb/prscmnts.cpp b/icuSources/tools/genrb/prscmnts.cpp new file mode 100644 index 00000000..75a8b0ee --- /dev/null +++ b/icuSources/tools/genrb/prscmnts.cpp @@ -0,0 +1,233 @@ +/* +******************************************************************************* +* +* Copyright (C) 2003, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* +* File prscmnts.cpp +* +* Modification History: +* +* Date Name Description +* 08/22/2003 ram Creation. +******************************************************************************* +*/ +#include "unicode/regex.h" +#include "unicode/unistr.h" +#include "unicode/parseerr.h" +#include "prscmnts.h" +#include <stdio.h> +#include <stdlib.h> + +#if UCONFIG_NO_REGULAR_EXPRESSIONS==0 /* donot compile when RegularExpressions not available */ + +#define MAX_SPLIT_STRINGS 20 + +const char *patternStrings[UPC_LIMIT]={ + "^translate\\s*?(.*)", + "^note\\s*?(.*)" +}; + +U_CFUNC int32_t +removeText(UChar *source, int32_t srcLen, + UnicodeString patString,uint32_t options, + UnicodeString replaceText, UErrorCode *status){ + + if(status == NULL || U_FAILURE(*status)){ + return 0; + } + + UnicodeString src(source, srcLen); + + RegexMatcher myMatcher(patString, src, options, *status); + if(U_FAILURE(*status)){ + return 0; + } + UnicodeString dest; + + + dest = myMatcher.replaceAll(replaceText,*status); + + + return dest.extract(source, srcLen, *status); + +} +U_CFUNC int32_t +trim(UChar *src, int32_t srcLen, UErrorCode *status){ + srcLen = removeText(src, srcLen, "^[ \\r\\n]+ ", 0, "", status); // remove leading new lines + srcLen = removeText(src, srcLen, "^\\s+", 0, "", status); // remove leading spaces + srcLen = removeText(src, srcLen, "\\s+$", 0, "", status); // remvoe trailing spcaes + return srcLen; +} + +U_CFUNC int32_t +removeCmtText(UChar* source, int32_t srcLen, UErrorCode* status){ + srcLen = trim(source, srcLen, status); + UnicodeString patString = "^\\s*?\\*\\s*?"; // remove pattern like " * " at the begining of the line + srcLen = removeText(source, srcLen, patString, UREGEX_MULTILINE, "", status); + return removeText(source, srcLen, "[ \\r\\n]+", 0, " ", status);// remove new lines; +} + +U_CFUNC int32_t +getText(const UChar* source, int32_t srcLen, + UChar** dest, int32_t destCapacity, + UnicodeString patternString, + UErrorCode* status){ + + if(status == NULL || U_FAILURE(*status)){ + return 0; + } + + UnicodeString stringArray[MAX_SPLIT_STRINGS]; + RegexPattern *pattern = RegexPattern::compile("@", 0, *status); + UnicodeString src (source,srcLen); + + if (U_FAILURE(*status)) { + return 0; + } + pattern->split(src, stringArray, MAX_SPLIT_STRINGS, *status); + + RegexMatcher matcher(patternString, UREGEX_DOTALL, *status); + if (U_FAILURE(*status)) { + return 0; + } + for(int32_t i=0; i<MAX_SPLIT_STRINGS; i++){ + matcher.reset(stringArray[i]); + if(matcher.lookingAt(*status)){ + UnicodeString out = matcher.group(1, *status); + + return out.extract(*dest, destCapacity,*status); + } + } + return 0; +} + + +#define AT_SIGN 0x0040 + +U_CFUNC int32_t +getDescription( const UChar* source, int32_t srcLen, + UChar** dest, int32_t destCapacity, + UErrorCode* status){ + if(status == NULL || U_FAILURE(*status)){ + return 0; + } + + UnicodeString stringArray[MAX_SPLIT_STRINGS]; + RegexPattern *pattern = RegexPattern::compile("@", UREGEX_MULTILINE, *status); + UnicodeString src(source, srcLen); + + if (U_FAILURE(*status)) { + return 0; + } + pattern->split(src, stringArray,MAX_SPLIT_STRINGS , *status); + + if(stringArray[0].indexOf((UChar)AT_SIGN)==-1){ + int32_t destLen = stringArray[0].extract(*dest, destCapacity, *status); + return trim(*dest, destLen, status); + } + return 0; +} + +U_CFUNC int32_t +getCount(const UChar* source, int32_t srcLen, + UParseCommentsOption option, UErrorCode *status){ + + if(status == NULL || U_FAILURE(*status)){ + return 0; + } + + UnicodeString stringArray[MAX_SPLIT_STRINGS]; + RegexPattern *pattern = RegexPattern::compile("@", UREGEX_MULTILINE, *status); + UnicodeString src (source, srcLen); + + + if (U_FAILURE(*status)) { + return 0; + } + int32_t retLen = pattern->split(src, stringArray, MAX_SPLIT_STRINGS, *status); + + RegexMatcher matcher(patternStrings[option], UREGEX_DOTALL, *status); + if (U_FAILURE(*status)) { + return 0; + } + int32_t count = 0; + for(int32_t i=0; i<retLen; i++){ + matcher.reset(stringArray[i]); + if(matcher.lookingAt(*status)){ + count++; + } + } + if(option == UPC_TRANSLATE && count > 1){ + fprintf(stderr, "Multiple @translate tags cannot be supported.\n"); + exit(U_UNSUPPORTED_ERROR); + } + return count; +} + +U_CFUNC int32_t +getAt(const UChar* source, int32_t srcLen, + UChar** dest, int32_t destCapacity, + int32_t index, + UParseCommentsOption option, + UErrorCode* status){ + + if(status == NULL || U_FAILURE(*status)){ + return 0; + } + + UnicodeString stringArray[MAX_SPLIT_STRINGS]; + RegexPattern *pattern = RegexPattern::compile("@", UREGEX_MULTILINE, *status); + UnicodeString src (source, srcLen); + + + if (U_FAILURE(*status)) { + return 0; + } + int32_t retLen = pattern->split(src, stringArray, MAX_SPLIT_STRINGS, *status); + + RegexMatcher matcher(patternStrings[option], UREGEX_DOTALL, *status); + if (U_FAILURE(*status)) { + return 0; + } + int32_t count = 0; + for(int32_t i=0; i<retLen; i++){ + matcher.reset(stringArray[i]); + if(matcher.lookingAt(*status)){ + if(count == index){ + UnicodeString out = matcher.group(1, *status); + return out.extract(*dest, destCapacity,*status); + } + count++; + + } + } + return 0; + +} + +U_CFUNC int32_t +getTranslate( const UChar* source, int32_t srcLen, + UChar** dest, int32_t destCapacity, + UErrorCode* status){ + UnicodeString notePatternString = "^translate\\s*?(.*)"; + + int32_t destLen = getText(source, srcLen, dest, destCapacity, notePatternString, status); + return trim(*dest, destLen, status); +} + +U_CFUNC int32_t +getNote(const UChar* source, int32_t srcLen, + UChar** dest, int32_t destCapacity, + UErrorCode* status){ + + UnicodeString notePatternString = "^note\\s*?(.*)"; + int32_t destLen = getText(source, srcLen, dest, destCapacity, notePatternString, status); + return trim(*dest, destLen, status); + +} + +#endif /* UCONFIG_NO_REGULAR_EXPRESSIONS */ + diff --git a/icuSources/tools/genrb/prscmnts.h b/icuSources/tools/genrb/prscmnts.h new file mode 100644 index 00000000..c4f27054 --- /dev/null +++ b/icuSources/tools/genrb/prscmnts.h @@ -0,0 +1,62 @@ +/* +******************************************************************************* +* +* Copyright (C) 1998-2003, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* +* File read.h +* +* Modification History: +* +* Date Name Description +* 05/26/99 stephen Creation. +* 5/10/01 Ram removed ustdio dependency +******************************************************************************* +*/ + +#ifndef PRSCMNTS_H +#define PRSCMNTS_H 1 + +#if UCONFIG_NO_REGULAR_EXPRESSIONS==0 /* donot compile when no RegularExpressions are available */ + +enum UParseCommentsOption { + UPC_TRANSLATE, + UPC_NOTE, + UPC_LIMIT +}; + +typedef enum UParseCommentsOption UParseCommentsOption; + +U_CFUNC int32_t +getNote(const UChar* source, int32_t srcLen, + UChar** dest, int32_t destCapacity, + UErrorCode* status); +U_CFUNC int32_t +removeCmtText(UChar* source, int32_t srcLen, UErrorCode* status); + +U_CFUNC int32_t +getDescription( const UChar* source, int32_t srcLen, + UChar** dest, int32_t destCapacity, + UErrorCode* status); +U_CFUNC int32_t +getTranslate( const UChar* source, int32_t srcLen, + UChar** dest, int32_t destCapacity, + UErrorCode* status); + +U_CFUNC int32_t +getAt(const UChar* source, int32_t srcLen, + UChar** dest, int32_t destCapacity, + int32_t index, + UParseCommentsOption option, + UErrorCode* status); + +U_CFUNC int32_t +getCount(const UChar* source, int32_t srcLen, + UParseCommentsOption option, UErrorCode *status); + +#endif /* UCONFIG_NO_REGULAR_EXPRESSIONS */ + +#endif + diff --git a/icuSources/tools/genrb/read.c b/icuSources/tools/genrb/read.c index 619302ce..be8cea11 100644 --- a/icuSources/tools/genrb/read.c +++ b/icuSources/tools/genrb/read.c @@ -30,7 +30,9 @@ #define SPACE 0x0020 #define COLON 0x003A #define BADBOM 0xFFFE - +#define CR 0x000D +#define LF 0x000A + static int32_t lineCount; /* Protos */ @@ -39,9 +41,9 @@ static enum ETokenType getStringToken(UCHARBUF *buf, struct UString *token, UErrorCode *status); -static UChar32 getNextChar (UCHARBUF *buf, UBool skipwhite, UErrorCode *status); -static void seekUntilNewline (UCHARBUF *buf, UErrorCode *status); -static void seekUntilEndOfComment (UCHARBUF *buf, UErrorCode *status); +static UChar32 getNextChar (UCHARBUF *buf, UBool skipwhite, struct UString *token, UErrorCode *status); +static void seekUntilNewline (UCHARBUF *buf, struct UString *token, UErrorCode *status); +static void seekUntilEndOfComment (UCHARBUF *buf, struct UString *token, UErrorCode *status); static UBool isWhitespace (UChar32 c); static UBool isNewline (UChar32 c); @@ -60,6 +62,7 @@ void resetLineNumber() { enum ETokenType getNextToken(UCHARBUF* buf, struct UString *token, uint32_t *linenumber, /* out: linenumber of token */ + struct UString *comment, UErrorCode *status) { enum ETokenType result; UChar32 c; @@ -69,7 +72,7 @@ enum ETokenType getNextToken(UCHARBUF* buf, } /* Skip whitespace */ - c = getNextChar(buf, TRUE, status); + c = getNextChar(buf, TRUE, comment, status); if (U_FAILURE(*status)) { return TOK_ERROR; @@ -120,6 +123,8 @@ static enum ETokenType getStringToken(UCHARBUF* buf, UChar *pTarget = target; int len=0; UBool isFollowingCharEscaped=FALSE; + UBool isNLUnescaped = FALSE; + UChar32 prevC=0; /* We are guaranteed on entry that initialChar is not a whitespace character. If we are at the EOF, or have some other problem, it @@ -175,6 +180,9 @@ static enum ETokenType getStringToken(UCHARBUF* buf, if (c == U_ERR) { return TOK_ERROR; } + if(c == CR || c == LF){ + isNLUnescaped = TRUE; + } } if(c==ESCAPE && !isFollowingCharEscaped){ @@ -185,11 +193,18 @@ static enum ETokenType getStringToken(UCHARBUF* buf, ustr_uscat(token, pTarget,len, status); isFollowingCharEscaped = FALSE; len=0; + if(c == CR || c == LF){ + if(isNLUnescaped == FALSE && prevC!=CR){ + lineCount++; + } + isNLUnescaped = FALSE; + } } if (U_FAILURE(*status)) { return TOK_ERROR; } + prevC = c; } } else { if (token->fLength > 0) { @@ -232,14 +247,14 @@ static enum ETokenType getStringToken(UCHARBUF* buf, pTarget = target; ustr_uscat(token, pTarget,len, status); len=0; - + if (U_FAILURE(*status)) { return TOK_ERROR; } for (;;) { /* DON'T skip whitespace */ - c = getNextChar(buf, FALSE, status); + c = getNextChar(buf, FALSE, NULL, status); /* EOF reached */ if (c == U_EOF) { @@ -284,7 +299,7 @@ static enum ETokenType getStringToken(UCHARBUF* buf, } /* DO skip whitespace */ - c = getNextChar(buf, TRUE, status); + c = getNextChar(buf, TRUE, NULL, status); if (U_FAILURE(*status)) { return TOK_STRING; @@ -297,12 +312,13 @@ static enum ETokenType getStringToken(UCHARBUF* buf, } } -/* Retrieve the next character, ignoring comments. If skipwhite is +/* Retrieve the next character. If skipwhite is true, whitespace is skipped as well. */ static UChar32 getNextChar(UCHARBUF* buf, UBool skipwhite, + struct UString *token, UErrorCode *status) { - UChar32 c; + UChar32 c, c2; if (U_FAILURE(*status)) { return U_EOF; @@ -332,11 +348,18 @@ static UChar32 getNextChar(UCHARBUF* buf, switch (c) { case SLASH: - seekUntilNewline(buf, status); + seekUntilNewline(buf, NULL, status); break; case ASTERISK: - seekUntilEndOfComment(buf, status); + c2 = ucbuf_getc(buf, status); + if(c2== ASTERISK){ + /* parse multi-line comment and store it in token*/ + seekUntilEndOfComment(buf, token, status); + }else{ + ucbuf_ungetc(c, buf); + seekUntilEndOfComment(buf, NULL, status); + } break; default: @@ -344,10 +367,12 @@ static UChar32 getNextChar(UCHARBUF* buf, /* If get() failed this is a NOP */ return SLASH; } + } } static void seekUntilNewline(UCHARBUF* buf, + struct UString *token, UErrorCode *status) { UChar32 c; @@ -357,10 +382,15 @@ static void seekUntilNewline(UCHARBUF* buf, do { c = ucbuf_getc(buf,status); + /* add the char to token */ + if(token!=NULL){ + ustr_u32cat(token, c, status); + } } while (!isNewline(c) && c != U_EOF && *status == U_ZERO_ERROR); } static void seekUntilEndOfComment(UCHARBUF *buf, + struct UString *token, UErrorCode *status) { UChar32 c, d; uint32_t line; @@ -383,6 +413,13 @@ static void seekUntilEndOfComment(UCHARBUF *buf, break; } } + /* add the char to token */ + if(token!=NULL){ + ustr_u32cat(token, c, status); + } + /* increment the lineCount */ + isNewline(c); + } while (c != U_EOF && *status == U_ZERO_ERROR); if (c == U_EOF) { diff --git a/icuSources/tools/genrb/read.h b/icuSources/tools/genrb/read.h index 9538e027..96bd9608 100644 --- a/icuSources/tools/genrb/read.h +++ b/icuSources/tools/genrb/read.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1998-2000, International Business Machines +* Copyright (C) 1998-2003, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -45,6 +45,7 @@ void resetLineNumber(void); enum ETokenType getNextToken(UCHARBUF *buf, struct UString *token, uint32_t *linenumber, /* out: linenumber of token */ + struct UString *comment, UErrorCode *status); #endif diff --git a/icuSources/tools/genrb/reslist.c b/icuSources/tools/genrb/reslist.c index 8ecf8792..32b45937 100644 --- a/icuSources/tools/genrb/reslist.c +++ b/icuSources/tools/genrb/reslist.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2000-2003, International Business Machines +* Copyright (C) 2000-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -16,9 +16,11 @@ */ #include <assert.h> +#include <stdio.h> #include "reslist.h" #include "unewdata.h" #include "unicode/ures.h" +#include "unicode/putil.h" #include "errmsg.h" #define BIN_ALIGNMENT 16 @@ -38,7 +40,7 @@ static const UDataInfo dataInfo= { 0, {0x52, 0x65, 0x73, 0x42}, /* dataFormat="resb" */ - {1, 0, 0, 0}, /* formatVersion */ + {1, 1, 0, 0}, /* formatVersion */ {1, 4, 0, 0} /* dataVersion take a look at version inside parsed resb*/ }; @@ -171,7 +173,8 @@ static uint32_t table_write(UNewDataMemory *mem, struct SResource *res, uint32_t usedOffset, UErrorCode *status) { uint8_t pad = 0; uint32_t i = 0; - uint16_t *keys = NULL; + uint16_t *keys16 = NULL; + int32_t *keys32 = NULL; uint32_t *resources = NULL; struct SResource *current = NULL; @@ -183,17 +186,25 @@ static uint32_t table_write(UNewDataMemory *mem, struct SResource *res, pad = calcPadding(res->fSize); if (res->u.fTable.fCount > 0) { - keys = (uint16_t *) uprv_malloc(sizeof(uint16_t) * res->u.fTable.fCount); - - if (keys == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - return 0; + if(res->fType == URES_TABLE) { + keys16 = (uint16_t *) uprv_malloc(sizeof(uint16_t) * res->u.fTable.fCount); + if (keys16 == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return 0; + } + } else { + keys32 = (int32_t *) uprv_malloc(sizeof(int32_t) * res->u.fTable.fCount); + if (keys32 == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return 0; + } } resources = (uint32_t *) uprv_malloc(sizeof(uint32_t) * res->u.fTable.fCount); if (resources == NULL) { - uprv_free(keys); + uprv_free(keys16); + uprv_free(keys32); *status = U_MEMORY_ALLOCATION_ERROR; return 0; } @@ -204,8 +215,12 @@ static uint32_t table_write(UNewDataMemory *mem, struct SResource *res, while (current != NULL) { assert(i < res->u.fTable.fCount); - /* where the key is plus root pointer */ - keys[i] = (uint16_t) (current->fKey + sizeof(uint32_t)); + /* where the key is */ + if(res->fType == URES_TABLE) { + keys16[i] = (uint16_t) current->fKey; + } else { + keys32[i] = current->fKey; + } if (current->fType == URES_INT) { resources[i] = (current->fType << 28) | (current->u.fIntValue.fValue & 0xFFFFFFF); @@ -225,18 +240,30 @@ static uint32_t table_write(UNewDataMemory *mem, struct SResource *res, current = current->fNext; } - udata_write16(mem, res->u.fTable.fCount); + if(res->fType == URES_TABLE) { + udata_write16(mem, (uint16_t)res->u.fTable.fCount); + + udata_writeBlock(mem, keys16, sizeof(uint16_t) * res->u.fTable.fCount); + udata_writePadding(mem, pad); + } else { + udata_write32(mem, res->u.fTable.fCount); + + udata_writeBlock(mem, keys32, sizeof(int32_t) * res->u.fTable.fCount); + } - udata_writeBlock(mem, keys, sizeof(uint16_t) * res->u.fTable.fCount); - udata_writePadding(mem, pad); udata_writeBlock(mem, resources, sizeof(uint32_t) * res->u.fTable.fCount); - uprv_free(keys); + uprv_free(keys16); + uprv_free(keys32); uprv_free(resources); } else { /* table is empty */ - udata_write16(mem, 0); - udata_writePadding(mem, pad); + if(res->fType == URES_TABLE) { + udata_write16(mem, 0); + udata_writePadding(mem, pad); + } else { + udata_write32(mem, 0); + } } return usedOffset; @@ -263,6 +290,7 @@ uint32_t res_write(UNewDataMemory *mem, struct SResource *res, case URES_ARRAY: return array_write (mem, res, usedOffset, status); case URES_TABLE: + case URES_TABLE32: return table_write (mem, res, usedOffset, status); default: @@ -279,7 +307,9 @@ void bundle_write(struct SRBRoot *bundle, const char *outputDir, const char *out uint8_t pad = 0; uint32_t root = 0; uint32_t usedOffset = 0; + uint32_t top, size; char dataName[1024]; + int32_t indexes[URES_INDEX_TOP]; if (writtenFilename && writtenFilenameLen) { *writtenFilename = 0; @@ -306,7 +336,7 @@ void bundle_write(struct SRBRoot *bundle, const char *outputDir, const char *out if(outputPkg != NULL) { uprv_strcpy(writtenFilename+off, outputPkg); - off += uprv_strlen(outputPkg); + off += (int32_t)uprv_strlen(outputPkg); writtenFilename[off] = '_'; ++off; } @@ -345,23 +375,53 @@ void bundle_write(struct SRBRoot *bundle, const char *outputDir, const char *out } pad = calcPadding(bundle->fKeyPoint); - usedOffset = sizeof(uint32_t) + bundle->fKeyPoint + pad ; /*this is how much root and keys are taking up*/ + usedOffset = bundle->fKeyPoint + pad ; /* top of the strings */ - root = ((usedOffset + bundle->fRoot->u.fTable.fChildrenSize) >> 2) | (URES_TABLE << 28); /* we're gonna put the main table at the end */ + /* we're gonna put the main table at the end */ + top = usedOffset + bundle->fRoot->u.fTable.fChildrenSize; + root = (top) >> 2 | (bundle->fRoot->fType << 28); + /* write the root item */ udata_write32(mem, root); - udata_writeBlock(mem, bundle->fKeys, bundle->fKeyPoint); - + /* add to top the size of the root item */ + top += bundle->fRoot->fSize; + top += calcPadding(top); + + /* + * formatVersion 1.1 (ICU 2.8): + * write int32_t indexes[] after root and before the strings + * to make it easier to parse resource bundles in icuswap or from Java etc. + */ + indexes[URES_INDEX_LENGTH]= URES_INDEX_TOP; + indexes[URES_INDEX_STRINGS_TOP]= (int32_t)(usedOffset>>2); + indexes[URES_INDEX_RESOURCES_TOP]= (int32_t)(top>>2); + indexes[URES_INDEX_BUNDLE_TOP]= indexes[URES_INDEX_RESOURCES_TOP]; + indexes[URES_INDEX_MAX_TABLE_LENGTH]= bundle->fMaxTableLength; + + /* write the indexes[] */ + udata_writeBlock(mem, indexes, sizeof(indexes)); + + /* write the table key strings */ + udata_writeBlock(mem, bundle->fKeys+URES_STRINGS_BOTTOM, + bundle->fKeyPoint-URES_STRINGS_BOTTOM); + + /* write the padding bytes after the table key strings */ udata_writePadding(mem, pad); + /* write all of the bundle contents: the root item and its children */ usedOffset = res_write(mem, bundle->fRoot, usedOffset, status); - udata_finish(mem, status); + size = udata_finish(mem, status); + if(top != size) { + fprintf(stderr, "genrb error: wrote %u bytes but counted %u\n", + (int)size, (int)top); + *status = U_INTERNAL_PROGRAM_ERROR; + } } /* Opening Functions */ -struct SResource* table_open(struct SRBRoot *bundle, char *tag, UErrorCode *status) { +struct SResource* res_open(const struct UString* comment, UErrorCode* status){ struct SResource *res; if (U_FAILURE(*status)) { @@ -374,16 +434,40 @@ struct SResource* table_open(struct SRBRoot *bundle, char *tag, UErrorCode *stat *status = U_MEMORY_ALLOCATION_ERROR; return NULL; } + uprv_memset(res, 0, sizeof(struct SResource)); + + res->fComment = NULL; + if(comment != NULL){ + res->fComment = (struct UString *) uprv_malloc(sizeof(struct UString)); + if(res->fComment == NULL){ + *status = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + ustr_init(res->fComment); + ustr_cpy(res->fComment, comment, status); + } + return res; + +} +struct SResource* table_open(struct SRBRoot *bundle, char *tag, const struct UString* comment, UErrorCode *status) { + + struct SResource *res = res_open(comment, status); - res->fType = URES_TABLE; res->fKey = bundle_addtag(bundle, tag, status); if (U_FAILURE(*status)) { + uprv_free(res->fComment); uprv_free(res); return NULL; } res->fNext = NULL; + + /* + * always open a table not a table32 in case it remains empty - + * try to use table32 only when necessary + */ + res->fType = URES_TABLE; res->fSize = sizeof(uint16_t); res->u.fTable.fCount = 0; @@ -394,17 +478,11 @@ struct SResource* table_open(struct SRBRoot *bundle, char *tag, UErrorCode *stat return res; } -struct SResource* array_open(struct SRBRoot *bundle, char *tag, UErrorCode *status) { - struct SResource *res; - - if (U_FAILURE(*status)) { - return NULL; - } +struct SResource* array_open(struct SRBRoot *bundle, char *tag, const struct UString* comment, UErrorCode *status) { - res = (struct SResource *) uprv_malloc(sizeof(struct SResource)); + struct SResource *res = res_open(comment, status); - if (res == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; + if (U_FAILURE(*status)) { return NULL; } @@ -412,6 +490,7 @@ struct SResource* array_open(struct SRBRoot *bundle, char *tag, UErrorCode *stat res->fKey = bundle_addtag(bundle, tag, status); if (U_FAILURE(*status)) { + uprv_free(res->fComment); uprv_free(res); return NULL; } @@ -427,24 +506,18 @@ struct SResource* array_open(struct SRBRoot *bundle, char *tag, UErrorCode *stat return res; } -struct SResource *string_open(struct SRBRoot *bundle, char *tag, const UChar *value, int32_t len, UErrorCode *status) { - struct SResource *res; +struct SResource *string_open(struct SRBRoot *bundle, char *tag, const UChar *value, int32_t len, const struct UString* comment, UErrorCode *status) { + struct SResource *res = res_open(comment, status); if (U_FAILURE(*status)) { return NULL; } - res = (struct SResource *) uprv_malloc(sizeof(struct SResource)); - - if (res == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - return NULL; - } - res->fType = URES_STRING; res->fKey = bundle_addtag(bundle, tag, status); if (U_FAILURE(*status)) { + uprv_free(res->fComment); uprv_free(res); return NULL; } @@ -467,24 +540,18 @@ struct SResource *string_open(struct SRBRoot *bundle, char *tag, const UChar *va } /* TODO: make alias_open and string_open use the same code */ -struct SResource *alias_open(struct SRBRoot *bundle, char *tag, UChar *value, int32_t len, UErrorCode *status) { - struct SResource *res; +struct SResource *alias_open(struct SRBRoot *bundle, char *tag, UChar *value, int32_t len, const struct UString* comment, UErrorCode *status) { + struct SResource *res = res_open(comment, status); if (U_FAILURE(*status)) { return NULL; } - res = (struct SResource *) uprv_malloc(sizeof(struct SResource)); - - if (res == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - return NULL; - } - res->fType = URES_ALIAS; res->fKey = bundle_addtag(bundle, tag, status); if (U_FAILURE(*status)) { + uprv_free(res->fComment); uprv_free(res); return NULL; } @@ -507,24 +574,18 @@ struct SResource *alias_open(struct SRBRoot *bundle, char *tag, UChar *value, in } -struct SResource* intvector_open(struct SRBRoot *bundle, char *tag, UErrorCode *status) { - struct SResource *res; +struct SResource* intvector_open(struct SRBRoot *bundle, char *tag, const struct UString* comment, UErrorCode *status) { + struct SResource *res = res_open(comment, status); if (U_FAILURE(*status)) { return NULL; } - res = (struct SResource *) uprv_malloc(sizeof(struct SResource)); - - if (res == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - return NULL; - } - res->fType = URES_INT_VECTOR; res->fKey = bundle_addtag(bundle, tag, status); if (U_FAILURE(*status)) { + uprv_free(res->fComment); uprv_free(res); return NULL; } @@ -544,24 +605,18 @@ struct SResource* intvector_open(struct SRBRoot *bundle, char *tag, UErrorCode * return res; } -struct SResource *int_open(struct SRBRoot *bundle, char *tag, int32_t value, UErrorCode *status) { - struct SResource *res; +struct SResource *int_open(struct SRBRoot *bundle, char *tag, int32_t value, const struct UString* comment, UErrorCode *status) { + struct SResource *res = res_open(comment, status); if (U_FAILURE(*status)) { return NULL; } - res = (struct SResource *) uprv_malloc(sizeof(struct SResource)); - - if (res == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - return NULL; - } - res->fType = URES_INT; res->fKey = bundle_addtag(bundle, tag, status); if (U_FAILURE(*status)) { + uprv_free(res->fComment); uprv_free(res); return NULL; } @@ -573,28 +628,22 @@ struct SResource *int_open(struct SRBRoot *bundle, char *tag, int32_t value, UEr return res; } -struct SResource *bin_open(struct SRBRoot *bundle, const char *tag, uint32_t length, uint8_t *data,const char* fileName,UErrorCode *status) { - struct SResource *res; +struct SResource *bin_open(struct SRBRoot *bundle, const char *tag, uint32_t length, uint8_t *data, const char* fileName, const struct UString* comment, UErrorCode *status) { + struct SResource *res = res_open(comment, status); if (U_FAILURE(*status)) { return NULL; } - res = (struct SResource *) uprv_malloc(sizeof(struct SResource)); - - if (res == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - return NULL; - } - res->fType = URES_BINARY; res->fKey = bundle_addtag(bundle, tag, status); if (U_FAILURE(*status)) { + uprv_free(res->fComment); uprv_free(res); return NULL; } - + res->fNext = NULL; res->u.fBinaryValue.fLength = length; @@ -623,7 +672,7 @@ struct SResource *bin_open(struct SRBRoot *bundle, const char *tag, uint32_t len return res; } -struct SRBRoot *bundle_open(UErrorCode *status) { +struct SRBRoot *bundle_open(const struct UString* comment, UErrorCode *status) { struct SRBRoot *bundle = NULL; if (U_FAILURE(*status)) { @@ -636,10 +685,16 @@ struct SRBRoot *bundle_open(UErrorCode *status) { *status = U_MEMORY_ALLOCATION_ERROR; return 0; } + uprv_memset(bundle, 0, sizeof(struct SRBRoot)); bundle->fLocale = NULL; - bundle->fKeyPoint = 0; + bundle->fKeys = (char *) uprv_malloc(sizeof(char) * KEY_SPACE_SIZE); + bundle->fKeysCapacity = KEY_SPACE_SIZE; + + if(comment != NULL){ + + } if (bundle->fKeys == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; @@ -647,11 +702,17 @@ struct SRBRoot *bundle_open(UErrorCode *status) { return NULL; } + /* formatVersion 1.1: start fKeyPoint after the root item and indexes[] */ + bundle->fKeyPoint = URES_STRINGS_BOTTOM; + uprv_memset(bundle->fKeys, 0, URES_STRINGS_BOTTOM); + bundle->fCount = 0; - bundle->fRoot = table_open(bundle, NULL, status); + bundle->fRoot = table_open(bundle, NULL, comment, status); if (bundle->fRoot == NULL || U_FAILURE(*status)) { - *status = U_MEMORY_ALLOCATION_ERROR; + if (U_SUCCESS(*status)) { + *status = U_MEMORY_ALLOCATION_ERROR; + } uprv_free(bundle->fKeys); uprv_free(bundle); @@ -747,7 +808,8 @@ void res_close(struct SResource *res, UErrorCode *status) { case URES_ARRAY: array_close(res, status); break; - case URES_TABLE : + case URES_TABLE: + case URES_TABLE32: table_close(res, status); break; default: @@ -803,12 +865,31 @@ void table_add(struct SResource *table, struct SResource *res, int linenumber, U /* here we need to traverse the list */ list = &(table->u.fTable); + if(table->fType == URES_TABLE && res->fKey > 0xffff) { + /* this table straddles the 64k strings boundary, update to a table32 */ + table->fType = URES_TABLE32; + + /* + * increase the size because count and each string offset + * increase from uint16_t to int32_t + */ + table->fSize += (1 + list->fCount) * 2; + } + ++(list->fCount); - table->fSize += sizeof(uint32_t) + sizeof(uint16_t); + if(list->fCount > (uint32_t)list->fRoot->fMaxTableLength) { + list->fRoot->fMaxTableLength = list->fCount; + } + + /* + * URES_TABLE: 6 bytes = 1 uint16_t key string offset + 1 uint32_t Resource + * URES_TABLE32: 8 bytes = 1 int32_t key string offset + 1 uint32_t Resource + */ + table->fSize += table->fType == URES_TABLE ? 6 : 8; table->u.fTable.fChildrenSize += res->fSize + calcPadding(res->fSize); - if (res->fType == URES_TABLE) { + if (res->fType == URES_TABLE || res->fType == URES_TABLE32) { table->u.fTable.fChildrenSize += res->u.fTable.fChildrenSize; } else if (res->fType == URES_ARRAY) { table->u.fTable.fChildrenSize += res->u.fArray.fChildrenSize; @@ -870,7 +951,7 @@ void array_add(struct SResource *array, struct SResource *res, UErrorCode *statu array->fSize += sizeof(uint32_t); array->u.fArray.fChildrenSize += res->fSize + calcPadding(res->fSize); - if (res->fType == URES_TABLE) { + if (res->fType == URES_TABLE || res->fType == URES_TABLE32) { array->u.fArray.fChildrenSize += res->u.fTable.fChildrenSize; } else if (res->fType == URES_ARRAY) { array->u.fArray.fChildrenSize += res->u.fArray.fChildrenSize; @@ -912,27 +993,35 @@ void bundle_setlocale(struct SRBRoot *bundle, UChar *locale, UErrorCode *status) } -uint16_t bundle_addtag(struct SRBRoot *bundle, const char *tag, UErrorCode *status) { - uint16_t keypos; + +int32_t +bundle_addtag(struct SRBRoot *bundle, const char *tag, UErrorCode *status) { + int32_t keypos, length; if (U_FAILURE(*status)) { - return (uint16_t) - 1; + return -1; } if (tag == NULL) { - return (uint16_t) - 1; + /* do not set an error: the root table has a NULL tag */ + return -1; } - keypos = (uint16_t)bundle->fKeyPoint; + keypos = bundle->fKeyPoint; - bundle->fKeyPoint += (uint16_t) (uprv_strlen(tag) + 1); + bundle->fKeyPoint += length = (int32_t) (uprv_strlen(tag) + 1); - if (bundle->fKeyPoint > KEY_SPACE_SIZE) { - *status = U_MEMORY_ALLOCATION_ERROR; - return (uint16_t) - 1; + if (bundle->fKeyPoint >= bundle->fKeysCapacity) { + /* overflow - resize the keys buffer */ + bundle->fKeysCapacity += KEY_SPACE_SIZE; + bundle->fKeys = uprv_realloc(bundle->fKeys, bundle->fKeysCapacity); + if(bundle->fKeys == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return -1; + } } - uprv_strcpy(bundle->fKeys + keypos, tag); + uprv_memcpy(bundle->fKeys + keypos, tag, length); return keypos; } diff --git a/icuSources/tools/genrb/reslist.h b/icuSources/tools/genrb/reslist.h index 07993723..34e35fd2 100644 --- a/icuSources/tools/genrb/reslist.h +++ b/icuSources/tools/genrb/reslist.h @@ -18,7 +18,7 @@ #ifndef RESLIST_H #define RESLIST_H -#define KEY_SPACE_SIZE 65532 +#define KEY_SPACE_SIZE 65536 #define RESLIST_MAX_INT_VECTOR 2048 #include "unicode/utypes.h" @@ -28,19 +28,22 @@ #include "cmemory.h" #include "cstring.h" #include "unewdata.h" +#include "ustr.h" U_CDECL_BEGIN /* Resource bundle root table */ struct SRBRoot { char *fLocale; - uint32_t fKeyPoint; + int32_t fKeyPoint; char *fKeys; + int32_t fKeysCapacity; int32_t fCount; - struct SResource *fRoot; + struct SResource *fRoot; + int32_t fMaxTableLength; }; -struct SRBRoot *bundle_open(UErrorCode *status); +struct SRBRoot *bundle_open(const struct UString* comment, UErrorCode *status); void bundle_write(struct SRBRoot *bundle, const char *outputDir, const char *outputPkg, char *writtenFilename, int writtenFilenameLen, UErrorCode *status); /* write a java resource file */ @@ -58,18 +61,19 @@ void bundle_write_xml(struct SRBRoot *bundle, const char *outputDir,const char* void bundle_close(struct SRBRoot *bundle, UErrorCode *status); void bundle_setlocale(struct SRBRoot *bundle, UChar *locale, UErrorCode *status); -uint16_t bundle_addtag(struct SRBRoot *bundle, const char *tag, UErrorCode *status); +int32_t bundle_addtag(struct SRBRoot *bundle, const char *tag, UErrorCode *status); /* Various resource types */ +struct SResource* res_open(const struct UString* comment, UErrorCode* status); struct SResTable { - uint16_t fCount; + uint32_t fCount; uint32_t fChildrenSize; struct SResource *fFirst; struct SRBRoot *fRoot; }; -struct SResource* table_open(struct SRBRoot *bundle, char *tag, UErrorCode *status); +struct SResource* table_open(struct SRBRoot *bundle, char *tag, const struct UString* comment, UErrorCode *status); void table_close(struct SResource *table, UErrorCode *status); void table_add(struct SResource *table, struct SResource *res, int linenumber, UErrorCode *status); @@ -80,7 +84,7 @@ struct SResArray { struct SResource *fLast; }; -struct SResource* array_open(struct SRBRoot *bundle, char *tag, UErrorCode *status); +struct SResource* array_open(struct SRBRoot *bundle, char *tag, const struct UString* comment, UErrorCode *status); void array_close(struct SResource *array, UErrorCode *status); void array_add(struct SResource *array, struct SResource *res, UErrorCode *status); @@ -89,10 +93,10 @@ struct SResString { UChar *fChars; }; -struct SResource *string_open(struct SRBRoot *bundle, char *tag, const UChar *value, int32_t len, UErrorCode *status); +struct SResource *string_open(struct SRBRoot *bundle, char *tag, const UChar *value, int32_t len, const struct UString* comment, UErrorCode *status); void string_close(struct SResource *string, UErrorCode *status); -struct SResource *alias_open(struct SRBRoot *bundle, char *tag, UChar *value, int32_t len, UErrorCode *status); +struct SResource *alias_open(struct SRBRoot *bundle, char *tag, UChar *value, int32_t len, const struct UString* comment, UErrorCode *status); void alias_close(struct SResource *string, UErrorCode *status); struct SResIntVector { @@ -100,7 +104,7 @@ struct SResIntVector { uint32_t *fArray; }; -struct SResource* intvector_open(struct SRBRoot *bundle, char *tag, UErrorCode *status); +struct SResource* intvector_open(struct SRBRoot *bundle, char *tag, const struct UString* comment, UErrorCode *status); void intvector_close(struct SResource *intvector, UErrorCode *status); void intvector_add(struct SResource *intvector, int32_t value, UErrorCode *status); @@ -108,7 +112,7 @@ struct SResInt { uint32_t fValue; }; -struct SResource *int_open(struct SRBRoot *bundle, char *tag, int32_t value, UErrorCode *status); +struct SResource *int_open(struct SRBRoot *bundle, char *tag, int32_t value, const struct UString* comment, UErrorCode *status); void int_close(struct SResource *intres, UErrorCode *status); struct SResBinary { @@ -117,17 +121,18 @@ struct SResBinary { char* fFileName; /* file name for binary or import binary tags if any */ }; -struct SResource *bin_open(struct SRBRoot *bundle, const char *tag, uint32_t length, uint8_t *data, const char* fileName, UErrorCode *status); +struct SResource *bin_open(struct SRBRoot *bundle, const char *tag, uint32_t length, uint8_t *data, const char* fileName, const struct UString* comment, UErrorCode *status); void bin_close(struct SResource *binres, UErrorCode *status); /* Resource place holder */ struct SResource { UResType fType; - uint16_t fKey; + int32_t fKey; uint32_t fSize; /* Size in bytes outside the header part */ int line; /* used internally to report duplicate keys in tables */ struct SResource *fNext; /*This is for internal chaining while building*/ + struct UString *fComment; union { struct SResTable fTable; struct SResArray fArray; diff --git a/icuSources/tools/genrb/rle.c b/icuSources/tools/genrb/rle.c index 81b33d4f..053cb33e 100644 --- a/icuSources/tools/genrb/rle.c +++ b/icuSources/tools/genrb/rle.c @@ -90,22 +90,22 @@ encodeRunByte(uint16_t* buffer,uint16_t* bufLimit, uint8_t value, int32_t length } #define APPEND( buffer, bufLimit, value, num, status){ \ - if(buffer<bufLimit){ \ - *buffer++=(value); \ - }else{ \ - *status = U_BUFFER_OVERFLOW_ERROR; \ - } \ - num++; \ + if(buffer<bufLimit){ \ + *buffer++=(value); \ + }else{ \ + *status = U_BUFFER_OVERFLOW_ERROR; \ + } \ + num++; \ } /** * Encode a run, possibly a degenerate run (of < 4 values). * @param length The length of the run; must be > 0 && <= 0xFFFF. */ -static uint16_t* +static uint16_t* encodeRunShort(uint16_t* buffer,uint16_t* bufLimit, uint16_t value, int32_t length,UErrorCode* status) { int32_t num=0; - if (length < 4) { + if (length < 4) { int j=0; for (; j<length; ++j) { if (value == (int32_t) ESCAPE){ @@ -144,10 +144,10 @@ encodeRunShort(uint16_t* buffer,uint16_t* bufLimit, uint16_t value, int32_t leng * The ESCAPE value is chosen so as not to collide with commonly * seen values. */ -int32_t +int32_t usArrayToRLEString(const uint16_t* src,int32_t srcLen,uint16_t* buffer, int32_t bufLen,UErrorCode* status) { uint16_t* bufLimit = buffer+bufLen; - uint16_t* saveBuffer = buffer; + uint16_t* saveBuffer = buffer; if(buffer < bufLimit){ *buffer++ = (uint16_t)(srcLen>>16); if(buffer<bufLimit){ @@ -173,7 +173,7 @@ usArrayToRLEString(const uint16_t* src,int32_t srcLen,uint16_t* buffer, int32_t }else{ *status = U_BUFFER_OVERFLOW_ERROR; } - return (buffer - saveBuffer); + return (int32_t)(buffer - saveBuffer); } /** @@ -252,7 +252,7 @@ rleStringToUCharArray(uint16_t* src, int32_t srcLen, uint16_t* target, int32_t t return 2; } length = (((int32_t) src[0]) << 16) | ((int32_t) src[1]); - + if(target == NULL){ return length; } @@ -284,7 +284,7 @@ rleStringToUCharArray(uint16_t* src, int32_t srcLen, uint16_t* target, int32_t t if (ai != length){ *status = U_INTERNAL_PROGRAM_ERROR; } - + return length; } @@ -313,7 +313,7 @@ rleStringToByteArray(uint16_t* src, int32_t srcLen, uint8_t* target, int32_t tgt return 2; } length = (((int32_t) src[0]) << 16) | ((int32_t) src[1]); - + if(target == NULL){ return length; } @@ -321,7 +321,7 @@ rleStringToByteArray(uint16_t* src, int32_t srcLen, uint8_t* target, int32_t tgt *status = U_BUFFER_OVERFLOW_ERROR; return length; } - + for (; ai<tgtLen; ) { /* This part of the loop places the next byte into the local * variable 'b' each time through the loop. It keeps the @@ -393,7 +393,7 @@ rleStringToByteArray(uint16_t* src, int32_t srcLen, uint8_t* target, int32_t tgt return 0; } - + if (i != srcLen){ /*("Excess data in RLE byte array string");*/ *status = U_INTERNAL_PROGRAM_ERROR; diff --git a/icuSources/tools/genrb/ustr.c b/icuSources/tools/genrb/ustr.c index 93c268e5..2a35db0b 100644 --- a/icuSources/tools/genrb/ustr.c +++ b/icuSources/tools/genrb/ustr.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1998-2000, International Business Machines +* Copyright (C) 1998-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -19,6 +19,7 @@ #include "cmemory.h" #include "cstring.h" #include "unicode/ustring.h" +#include "unicode/putil.h" /* Protos */ static void ustr_resize(struct UString *s, int32_t len, UErrorCode *status); @@ -85,7 +86,9 @@ ustr_cpy(struct UString *dst, if(U_FAILURE(*status)) return; } - + if(src->fChars == NULL || dst->fChars == NULL){ + return; + } uprv_memcpy(dst->fChars, src->fChars, sizeof(UChar) * src->fLength); dst->fLength = src->fLength; dst->fChars[dst->fLength] = 0x0000; @@ -157,7 +160,19 @@ ustr_ucat(struct UString *dst, dst->fLength += 1; dst->fChars[dst->fLength] = 0x0000; } - +void +ustr_u32cat(struct UString *dst, UChar32 c, UErrorCode *status){ + if(c > 0x10FFFF){ + *status = U_ILLEGAL_CHAR_FOUND; + return; + } + if(c >0xFFFF){ + ustr_ucat(dst, U16_LEAD(c), status); + ustr_ucat(dst, U16_TRAIL(c), status); + }else{ + ustr_ucat(dst, (UChar) c, status); + } +} void ustr_uscat(struct UString *dst, const UChar* src,int len, diff --git a/icuSources/tools/genrb/ustr.h b/icuSources/tools/genrb/ustr.h index 2160969c..085643a8 100644 --- a/icuSources/tools/genrb/ustr.h +++ b/icuSources/tools/genrb/ustr.h @@ -28,10 +28,10 @@ } \ else \ { \ - target[0] = U16_LEAD(c); \ - target[1] = U16_TRAIL(c); \ + target[0] = U16_LEAD(c); \ + target[1] = U16_TRAIL(c); \ len=2; \ - target +=2; \ + target +=2; \ } \ } @@ -61,5 +61,6 @@ void ustr_ncat(struct UString *dst, const struct UString *src, int32_t n, UErrorCode *status); void ustr_ucat(struct UString *dst, UChar c, UErrorCode *status); +void ustr_u32cat(struct UString *dst, UChar32 c, UErrorCode *status); void ustr_uscat(struct UString *dst, const UChar* src,int len,UErrorCode *status); #endif diff --git a/icuSources/tools/genrb/util.c b/icuSources/tools/genrb/util.c index 44ae246e..0f0bdf58 100644 --- a/icuSources/tools/genrb/util.c +++ b/icuSources/tools/genrb/util.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1998-2000, International Business Machines +* Copyright (C) 1998-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* diff --git a/icuSources/tools/genrb/wrtjava.c b/icuSources/tools/genrb/wrtjava.c index 8ec3709a..7df45260 100644 --- a/icuSources/tools/genrb/wrtjava.c +++ b/icuSources/tools/genrb/wrtjava.c @@ -33,7 +33,7 @@ void res_write_java(struct SResource *res,UErrorCode *status); -static const char copyRight[] = +static const char copyRight[] = "/* \n" " *******************************************************************************\n" " *\n" @@ -46,7 +46,7 @@ static const char copyRight[] = " * $" "Revision: $ \n" " *******************************************************************************\n" " */\n\n"; -static const char warningMsg[] = +static const char warningMsg[] = "/*********************************************************************\n" "######################################################################\n" "\n" @@ -64,7 +64,7 @@ static const char* closeClass=" };\n" static const char* javaClass = "import java.util.ListResourceBundle;\n" "import com.ibm.icu.impl.ICUListResourceBundle;\n\n" "public class "; - + static const char* javaClass1= " extends ICUListResourceBundle {\n\n" " /**\n" " * Overrides ListResourceBundle \n" @@ -93,10 +93,14 @@ static void write_tabs(FileStream* os){ T_FileStream_write(os," ",4); } } + +#define ZERO 0x30 + static const char* enc =""; static UConverter* conv = NULL; +static char NUMBER = ZERO; -static int32_t +static int32_t uCharsToChars( char* target,int32_t targetLen, UChar* source, int32_t sourceLen,UErrorCode* status){ int i=0, j=0; char str[30]={'\0'}; @@ -119,7 +123,7 @@ uCharsToChars( char* target,int32_t targetLen, UChar* source, int32_t sourceLen, } j+=2; }else if(source[i-1]!='\\'){ - + if(j+2<targetLen){ uprv_strcat(target,"\\"); target[j+1]= (char)source[i]; @@ -169,7 +173,7 @@ uCharsToChars( char* target,int32_t targetLen, UChar* source, int32_t sourceLen, if(j<targetLen){ target[j] = (char) source[i]; } - j++; + j++; }else{ if(*enc =='\0' || source[i]==0x0000){ uprv_strcpy(str,"\\u"); @@ -196,7 +200,7 @@ uCharsToChars( char* target,int32_t targetLen, UChar* source, int32_t sourceLen, } -static uint32_t +static uint32_t strrch(const char* source,uint32_t sourceLen,char find){ const char* tSourceEnd =source + (sourceLen-1); while(tSourceEnd>= source){ @@ -227,7 +231,7 @@ str_write_java( uint16_t* src, int32_t srcLen, UBool printEndLine, UErrorCode *s uint32_t length = srcLen*8; uint32_t bufLen = 0; char* buf = (char*) malloc(sizeof(char)*length); - + uint32_t columnCount = getColumnCount(srcLen); /* test for NULL */ @@ -235,9 +239,9 @@ str_write_java( uint16_t* src, int32_t srcLen, UBool printEndLine, UErrorCode *s *status = U_MEMORY_ALLOCATION_ERROR; return; } - + memset(buf,0,length); - + bufLen = uCharsToChars(buf,length,src,srcLen,status); if(printEndLine) write_tabs(out); @@ -245,7 +249,7 @@ str_write_java( uint16_t* src, int32_t srcLen, UBool printEndLine, UErrorCode *s if(U_FAILURE(*status)){ return; } - + if(bufLen+(tabCount*4) > columnCount ){ uint32_t len = 0; char* current = buf; @@ -297,12 +301,9 @@ str_write_java( uint16_t* src, int32_t srcLen, UBool printEndLine, UErrorCode *s } } -/* Writing Functions */ -static void -string_write_java(struct SResource *res,UErrorCode *status) { - if(uprv_strcmp(srBundle->fKeys+res->fKey,"%%UCARULES")==0 ){ +static void +write_utf8_file(struct SResource *res, const char *file, UErrorCode *status){ char fileName[1024] ={0}; - const char* file = "UCARules.utf8"; FileStream* datFile = NULL; const char* type = "new ICUListResourceBundle.ResourceString("; char* dest = (char*) uprv_malloc( 8 * res->u.fString.fLength); @@ -314,7 +315,7 @@ string_write_java(struct SResource *res,UErrorCode *status) { } } uprv_strcat(fileName,file);/* UCARULES.utf8 UTF-8 file */ - + write_tabs(out); T_FileStream_write(out, type, (int32_t)uprv_strlen(type)); @@ -322,11 +323,11 @@ string_write_java(struct SResource *res,UErrorCode *status) { T_FileStream_write(out, file, (int32_t)uprv_strlen(file)); T_FileStream_write(out, "\")\n", 3); datFile=T_FileStream_open(fileName,"w"); - + if(!dest){ *status=U_MEMORY_ALLOCATION_ERROR; } - + u_strToUTF8(dest,8*res->u.fString.fLength,&len,res->u.fString.fChars,res->u.fString.fLength,status); if(U_FAILURE(*status)){ T_FileStream_close(datFile); @@ -336,32 +337,49 @@ string_write_java(struct SResource *res,UErrorCode *status) { T_FileStream_write(datFile,dest,len); T_FileStream_close(datFile); uprv_free(dest); - +} +#define MAX_SEQUENCE_LENGTH 30000 +/* Writing Functions */ +static void +string_write_java(struct SResource *res,UErrorCode *status) { + if(res->fKey > 0 && uprv_strcmp(srBundle->fKeys+res->fKey,"%%UCARULES")==0 ){ + + const char* file = "UCARules.utf8"; + write_utf8_file(res, file, status); + }else if(res->fKey > 0 && uprv_strcmp(srBundle->fKeys+res->fKey,"Sequence")==0 + && res->fType == RES_STRING + && res->u.fString.fLength > MAX_SEQUENCE_LENGTH){ + char file[1024] = {0}; + uprv_strcpy(file, "CollationSequence_"); + uprv_strcat(file, srBundle->fLocale); + uprv_strcat(file, ".utf8"); + write_utf8_file(res, file, status); + }else{ str_write_java(res->u.fString.fChars,res->u.fString.fLength,TRUE,status); - if(uprv_strcmp(srBundle->fKeys+res->fKey,"Rule")==0){ + if(res->fKey > 0 && uprv_strcmp(srBundle->fKeys+res->fKey,"Rule")==0){ UChar* buf = (UChar*) uprv_malloc(sizeof(UChar)*res->u.fString.fLength); - uprv_memcpy(buf,res->u.fString.fChars,res->u.fString.fLength); + uprv_memcpy(buf,res->u.fString.fChars,res->u.fString.fLength); uprv_free(buf); } } } -static void +static void alias_write_java(struct SResource *res,UErrorCode *status) { static const char str[] = "new ICUListResourceBundle.Alias("; write_tabs(out); - T_FileStream_write(out,str,uprv_strlen(str)); - + T_FileStream_write(out,str,(int32_t)uprv_strlen(str)); + /*str_write_java(res->u.fString.fChars,res->u.fString.fLength,FALSE,status);*/ /*if(*res->u.fString.fChars == RES_PATH_SEPARATOR) {*/ - /* there is a path included + /* there is a path included locale = u_strchr(res->u.fString.fChars +1, RES_PATH_SEPARATOR); *locale = 0; locale++; - + T_FileStream_write(out,"\"/",2); T_FileStream_write(out,apName,(int32_t)uprv_strlen(apName)); T_FileStream_write(out,"/",1); @@ -371,13 +389,13 @@ alias_write_java(struct SResource *res,UErrorCode *status) { } else { str_write_java(res->u.fString.fChars,res->u.fString.fLength,FALSE,status); }*/ - + str_write_java(res->u.fString.fChars,res->u.fString.fLength,FALSE,status); - + T_FileStream_write(out,"),\n",3); } -static void +static void array_write_java( struct SResource *res, UErrorCode *status) { uint32_t i = 0; @@ -435,24 +453,24 @@ array_write_java( struct SResource *res, UErrorCode *status) { } else { write_tabs(out); - T_FileStream_write(out,arr,uprv_strlen(arr)); + T_FileStream_write(out,arr,(int32_t)uprv_strlen(arr)); write_tabs(out); T_FileStream_write(out,"},\n",3); } } -static void +static void intvector_write_java( struct SResource *res, UErrorCode *status) { uint32_t i = 0; const char* intArr = "new Integer[] {\n"; const char* intC = "new Integer("; - const char* stringArr = "new String[]{\n"; + const char* stringArr = "new String[]{\n"; char buf[100]; int len =0; buf[0]=0; write_tabs(out); - if(uprv_strcmp(srBundle->fKeys+res->fKey,"DateTimeElements")==0){ + if(res->fKey > 0 && uprv_strcmp(srBundle->fKeys+res->fKey,"DateTimeElements")==0){ T_FileStream_write(out, stringArr, (int32_t)uprv_strlen(stringArr)); tabCount++; for(i = 0; i<res->u.fIntVector.fCount; i++) { @@ -480,7 +498,7 @@ intvector_write_java( struct SResource *res, UErrorCode *status) { T_FileStream_write(out,"},\n",3); } -static void +static void int_write_java(struct SResource *res,UErrorCode *status) { const char* intC = "new Integer("; char buf[100]; @@ -496,7 +514,7 @@ int_write_java(struct SResource *res,UErrorCode *status) { } -static void +static void bin_write_java( struct SResource *res, UErrorCode *status) { const char* type = "new ICUListResourceBundle.CompressedBinary("; const char* ext; @@ -507,7 +525,7 @@ bin_write_java( struct SResource *res, UErrorCode *status) { uint16_t* saveTarget = NULL; int32_t tgtLen = 0; - if(uprv_strcmp(srBundle->fKeys+res->fKey,"%%CollationBin")==0 || uprv_strcmp(srBundle->fKeys+res->fKey,"BreakDictionaryData")==0){ + if(res->fKey > 0 && (uprv_strcmp(srBundle->fKeys+res->fKey,"%%CollationBin")==0 || uprv_strcmp(srBundle->fKeys+res->fKey,"BreakDictionaryData")==0)){ char fileName[1024] ={0}; char fn[1024] = {0}; FileStream* datFile = NULL; @@ -521,8 +539,13 @@ bin_write_java( struct SResource *res, UErrorCode *status) { if(uprv_strcmp(srBundle->fLocale,"root")!=0){ uprv_strcat(fileName,"_"); uprv_strcat(fileName,srBundle->fLocale); + if(NUMBER > ZERO){ + uprv_strcat(fileName, "_"); + uprv_strcat(fileName, &NUMBER); + } + NUMBER++; } - + uprv_strcat(fileName,ext); if(outDir ){ uprv_strcat(fn,outDir); @@ -564,7 +587,7 @@ bin_write_java( struct SResource *res, UErrorCode *status) { /* test for NULL */ if(myTarget == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; - return; + return; } int i=0; @@ -604,10 +627,10 @@ bin_write_java( struct SResource *res, UErrorCode *status) { free(target); } - + }else{ write_tabs(out); - T_FileStream_write(out,type,uprv_strlen(type)); + T_FileStream_write(out,type,(int32_t)uprv_strlen(type)); T_FileStream_write(out,"null),\n",7); } @@ -616,7 +639,7 @@ bin_write_java( struct SResource *res, UErrorCode *status) { static UBool start = TRUE; -static void +static void table_write_java(struct SResource *res, UErrorCode *status) { uint32_t i = 0; UBool allStrings =TRUE; @@ -627,7 +650,7 @@ table_write_java(struct SResource *res, UErrorCode *status) { if (U_FAILURE(*status)) { return ; } - + if (res->u.fTable.fCount > 0) { if(start==FALSE){ write_tabs(out); @@ -642,7 +665,7 @@ table_write_java(struct SResource *res, UErrorCode *status) { while (current != NULL) { assert(i < res->u.fTable.fCount); write_tabs(out); - + T_FileStream_write(out, openBrace, 2); @@ -650,14 +673,14 @@ table_write_java(struct SResource *res, UErrorCode *status) { allStrings=FALSE; write_tabs(out); + if(current->fKey > 0){ + T_FileStream_write(out, "\"", 1); + T_FileStream_write(out, srBundle->fKeys+current->fKey, + (int32_t)uprv_strlen(srBundle->fKeys+current->fKey)); + T_FileStream_write(out, "\",\n", 2); - T_FileStream_write(out, "\"", 1); - T_FileStream_write(out, srBundle->fKeys+current->fKey, - (int32_t)uprv_strlen(srBundle->fKeys+current->fKey)); - T_FileStream_write(out, "\",\n", 2); - - T_FileStream_write(out, "\n", 1); - + T_FileStream_write(out, "\n", 1); + } res_write_java(current, status); if(U_FAILURE(*status)){ return; @@ -676,7 +699,7 @@ table_write_java(struct SResource *res, UErrorCode *status) { } else { write_tabs(out); - T_FileStream_write(out,obj,uprv_strlen(obj)); + T_FileStream_write(out,obj,(int32_t)uprv_strlen(obj)); write_tabs(out); T_FileStream_write(out,"},\n",3); @@ -685,9 +708,9 @@ table_write_java(struct SResource *res, UErrorCode *status) { } -void +void res_write_java(struct SResource *res,UErrorCode *status) { - + if (U_FAILURE(*status)) { return ; } @@ -713,6 +736,7 @@ res_write_java(struct SResource *res,UErrorCode *status) { array_write_java (res, status); return; case URES_TABLE: + case URES_TABLE32: table_write_java (res, status); return; @@ -724,21 +748,21 @@ res_write_java(struct SResource *res,UErrorCode *status) { *status = U_INTERNAL_PROGRAM_ERROR; } -void -bundle_write_java(struct SRBRoot *bundle, const char *outputDir,const char* outputEnc, - char *writtenFilename, int writtenFilenameLen, +void +bundle_write_java(struct SRBRoot *bundle, const char *outputDir,const char* outputEnc, + char *writtenFilename, int writtenFilenameLen, const char* packageName, const char* bundleName, UErrorCode *status) { char fileName[256] = {'\0'}; char className[256]={'\0'}; - char constructor[1000] = { 0 }; + char constructor[1000] = { 0 }; UBool j1 =FALSE; outDir = outputDir; bName = (bundleName==NULL) ? "LocaleElements" : bundleName; pName = (packageName==NULL)? "com.ibm.icu.impl.data" : packageName; - + uprv_strcpy(className, bName); srBundle = bundle; if(uprv_strcmp(srBundle->fLocale,"root")!=0){ @@ -764,7 +788,7 @@ bundle_write_java(struct SRBRoot *bundle, const char *outputDir,const char* outp if (U_FAILURE(*status)) { return; } - + out= T_FileStream_open(fileName,"w"); if(out==NULL){ diff --git a/icuSources/tools/genrb/wrtxml.c b/icuSources/tools/genrb/wrtxml.c index aab0e63c..57813b76 100644 --- a/icuSources/tools/genrb/wrtxml.c +++ b/icuSources/tools/genrb/wrtxml.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2002-2003, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -28,6 +28,8 @@ #include "uresimp.h" #include "unicode/ustring.h" #include "unicode/uchar.h" +#include "ustr.h" +#include "prscmnts.h" #include <time.h> static int tabCount = 0; @@ -53,7 +55,7 @@ static void write_tabs(FileStream* os){ /*get ID for each element. ID is globally unique.*/ static char* getID(const char* id, char* curKey, char* result) { - if(curKey == NULL) { + if(curKey == NULL) { result = uprv_malloc(sizeof(char)*uprv_strlen(id) + 1); uprv_memset(result, 0, sizeof(char)*uprv_strlen(id) + 1); uprv_strcpy(result, id); @@ -76,16 +78,16 @@ static char* getID(const char* id, char* curKey, char* result) { * of information. It's also used as a hashing function. Unlike a regular * checksum, it's sensitive to the order of the characters. * It produces a 32 bit - * + * * @author Michael Lecuyer (mjl@theorem.com) * @version 1.1 August 11, 1998 */ - + /* ICU is not endian portable, because ICU data generated on big endian machines can be - * ported to big endian machines but not to little endian machines and vice versa. The - * conversion is not portable across platforms with different endianess. + * ported to big endian machines but not to little endian machines and vice versa. The + * conversion is not portable across platforms with different endianess. */ - + static uint32_t computeCRC(char *ptr, uint32_t len, uint32_t lastcrc){ int32_t crc; uint32_t temp1; @@ -113,8 +115,8 @@ static uint32_t computeCRC(char *ptr, uint32_t len, uint32_t lastcrc){ crc = lastcrc; while(len--!=0) { - temp1 = (uint32_t)crc>>8; - temp2 = crc_ta[(crc^*ptr) & 0xFF]; + temp1 = (uint32_t)crc>>8; + temp2 = crc_ta[(crc^*ptr) & 0xFF]; crc = temp1^temp2; ptr++; } @@ -151,45 +153,45 @@ static UBool checkISOCountry(char* country) { return FALSE; } -/* Parse the filename, and get its language information. - * If it fails to get the language information from the filename, +/* Parse the filename, and get its language information. + * If it fails to get the language information from the filename, * use "en" as the default value for language */ static char* parseFilename(const char* fileName, char* lang) { char* pos; char* pos2; - int first; - int second; + int32_t first; + int32_t second; char* str0 = NULL; char* str1 = NULL; char* str2 = NULL; char* str3 = NULL; - int index = 0; - UBool ISO_tag = TRUE; + int32_t index = 0; + UBool ISO_tag = TRUE; ISOLanguages = uloc_getISOLanguages(); ISOCountries = uloc_getISOCountries(); pos = uprv_strrchr(fileName, U_FILE_SEP_CHAR); pos2 = uprv_strrchr(fileName, '.'); - + if(pos == NULL) { first = -1; }else { - first = pos - fileName; + first = (int32_t)(pos - fileName); } if(pos2 == NULL) { - second = uprv_strlen(fileName); + second = (int32_t)uprv_strlen(fileName); } else { - second = pos2 - fileName; + second = (int32_t)(pos2 - fileName); } - index = second - first - 1; + index = (int32_t)(second - first - 1); str0 = uprv_malloc(sizeof(char) * index + 1); uprv_memset(str0, 0, sizeof(char) * index + 1); uprv_strncpy(str0, fileName + first + 1, index); - + pos = uprv_strchr( str0, '_' ); - first = pos - str0; + first = (int32_t)(pos - str0); if (pos == NULL) { str1 = uprv_malloc(sizeof(char)*uprv_strlen(str0)+1); uprv_memset(str1, 0, sizeof(char)*uprv_strlen(str0)+1); @@ -199,13 +201,13 @@ static char* parseFilename(const char* fileName, char* lang) { uprv_memset(str1, 0, sizeof(char)*first+1); uprv_strncpy(str1, str0, first); pos = uprv_strrchr( str0, '_' ); - second = pos - str0; + second = (int32_t)(pos - str0); if(first != second && second-first != 1) { index = second - first-1; str2 = uprv_malloc(sizeof(char)*index+1); uprv_memset(str2, 0, sizeof(char)*index+1); uprv_strncpy(str2, str0 + first + 1, index ); - index = uprv_strlen(str0) - second -1; + index = (int32_t)(uprv_strlen(str0) - second -1); str3 = uprv_malloc(sizeof(char)*index+1); uprv_memset(str3, 0, sizeof(char)*index+1); uprv_strncpy(str3, str0 + second + 1, index); @@ -214,7 +216,7 @@ static char* parseFilename(const char* fileName, char* lang) { str1 = uprv_malloc(sizeof(char)*first+1); uprv_memset(str1, 0, sizeof(char)*first+1); uprv_strncpy(str1, str0, index ); - index = uprv_strlen(str0) - second -1; + index = (int32_t)(uprv_strlen(str0) - second -1); str2 = uprv_malloc(sizeof(char)*index+1); uprv_memset(str2, 0, sizeof(char)*index+1); uprv_strncpy(str2, str0 + second + 1, index ); @@ -284,14 +286,14 @@ static char* parseFilename(const char* fileName, char* lang) { } static const char* xmlHeader = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" - "<!DOCTYPE xliff " + "<!DOCTYPE xliff " "SYSTEM \"http://www.oasis-open.org/committees/xliff/documents/xliff.dtd\">\n"; static const char* bundleStart = "<xliff version = \"1.0\">\n"; static const char* bundleEnd = "</xliff>\n"; void res_write_xml(struct SResource *res, const char* id, const char* language, UErrorCode *status); -static char* convertAndEscape(char** pDest, int32_t destCap, int32_t* destLength, +static char* convertAndEscape(char** pDest, int32_t destCap, int32_t* destLength, const UChar* src, int32_t srcLen, UErrorCode* status){ int32_t srcIndex=0; char* dest=NULL; @@ -322,7 +324,7 @@ static char* convertAndEscape(char** pDest, int32_t destCap, int32_t* destLength fprintf(stderr, "Illegal Surrogate! \n"); uprv_free(dest); return NULL; - } + } if((destLen+UTF8_CHAR_LENGTH(c)) < destCap){ @@ -331,23 +333,23 @@ static char* convertAndEscape(char** pDest, int32_t destCap, int32_t* destLength switch(c) { case '&': uprv_strcpy(dest+( destLen),"&"); - destLen+=uprv_strlen("&"); + destLen+=(int32_t)uprv_strlen("&"); break; case '<': uprv_strcpy(dest+(destLen),"<"); - destLen+=uprv_strlen("<"); + destLen+=(int32_t)uprv_strlen("<"); break; case '>': uprv_strcpy(dest+(destLen),">"); - destLen+=uprv_strlen(">"); + destLen+=(int32_t)uprv_strlen(">"); break; case '"': uprv_strcpy(dest+(destLen),"""); - destLen+=uprv_strlen("""); + destLen+=(int32_t)uprv_strlen("""); break; case '\'': uprv_strcpy(dest+(destLen),"'"); - destLen+=uprv_strlen("'"); + destLen+=(int32_t)uprv_strlen("'"); break; /* Disallow C0 controls except TAB, CR, LF*/ @@ -384,7 +386,7 @@ static char* convertAndEscape(char** pDest, int32_t destCap, int32_t* destLength case 0x1E: case 0x1F: *status = U_ILLEGAL_CHAR_FOUND; - fprintf(stderr, "Illegal Character \\u%04X! \n",c); + fprintf(stderr, "Illegal Character \\u%04X!\n",(int)c); uprv_free(dest); return NULL; default: @@ -395,14 +397,14 @@ static char* convertAndEscape(char** pDest, int32_t destCap, int32_t* destLength U8_APPEND((unsigned char*)dest,destLen,destCap,c,isError); if(isError){ *status = U_ILLEGAL_CHAR_FOUND; - fprintf(stderr, "Illegal Character \\U%08X! \n",c); + fprintf(stderr, "Illegal Character \\U%08X!\n",(int)c); uprv_free(dest); return NULL; - } + } } }else{ destCap += destLen; - + temp = (char*) uprv_malloc(sizeof(char)*destCap); if(temp==NULL){ *status=U_MEMORY_ALLOCATION_ERROR; @@ -420,66 +422,247 @@ static char* convertAndEscape(char** pDest, int32_t destCap, int32_t* destLength return dest; } +#define ASTERISK 0x002A +#define SPACE 0x0020 +#define CR 0x000A +#define LF 0x000D +#define AT_SIGN 0x0040 + +static const UChar tokens[][11] = { + {0x0040, 0x0074, 0x0072, 0x0061, 0x006e, 0x0073, 0x006c, 0x0061, 0x0074, 0x0065, 0x0000}, /* @translate */ + {0x0040, 0x006e, 0x006f, 0x0074, 0x0065, 0x0000} /* @note */ +}; + +static const UChar yes[] = { 0x0079, 0x0065, 0x0073, 0x0000}; /* yes */ +static const UChar no[] ={ 0x006e, 0x006f, 0x0000 }; /* no */ + + + +static void +trim(char **src, int32_t *len){ + + char *s = NULL; + int32_t i = 0; + if(src == NULL || *src == NULL){ + return; + } + s = *src; + /* trim from the end */ + for( i=(*len-1); i>= 0; i--){ + switch(s[i]){ + case ASTERISK: + case SPACE: + case CR: + case LF: + s[i] = 0; + continue; + default: + break; + } + break; + + } + *len = i+1; +} + +static void +print(UChar* src, int32_t srcLen,const char *tagStart,const char *tagEnd, UErrorCode *status){ + int32_t bufCapacity = srcLen*4; + char *buf = NULL; + int32_t bufLen = 0; + + if(U_FAILURE(*status)){ + return; + } + + buf = (char*) (uprv_malloc(bufCapacity)); + if(buf==0){ + fprintf(stderr, "Could not allocate memory!!"); + exit(U_MEMORY_ALLOCATION_ERROR); + } + buf = convertAndEscape(&buf, bufCapacity, &bufLen, src, srcLen,status); + if(U_SUCCESS(*status)){ + trim(&buf,&bufLen); + T_FileStream_write(out,tagStart, (int32_t)uprv_strlen(tagStart)); + T_FileStream_write(out, buf, bufLen); + T_FileStream_write(out,tagEnd, (int32_t)uprv_strlen(tagEnd)); + T_FileStream_write(out,"\n",1); + + } +} +static void +printNoteElements(struct UString *src, UErrorCode *status){ + +#if UCONFIG_NO_REGULAR_EXPRESSIONS==0 /* donot compile when no RegularExpressions are available */ + + int32_t capacity = 0; + UChar* note = NULL; + int32_t noteLen = 0; + int32_t count = 0,i; + + if(src == NULL){ + return; + } + + capacity = src->fLength; + note = (UChar*) uprv_malloc(U_SIZEOF_UCHAR * capacity); + + count = getCount(src->fChars,src->fLength, UPC_NOTE, status); + if(U_FAILURE(*status)){ + return; + } + for(i=0; i < count; i++){ + noteLen = getAt(src->fChars,src->fLength, ¬e, capacity, i, UPC_NOTE, status); + if(U_FAILURE(*status)){ + return; + } + if(noteLen > 0){ + write_tabs(out); + print(note, noteLen,"<note>", "</note>", status); + } + } + uprv_free(note); +#else + fprintf(stderr, "Warning: Could not output comments to XLIFF file. ICU has been built without RegularExpression support.\n"); + +#endif /* UCONFIG_NO_REGULAR_EXPRESSIONS */ + +} + +static void +printComments(struct UString *src, const char *resName, UBool printTranslate, UErrorCode *status){ + +#if UCONFIG_NO_REGULAR_EXPRESSIONS==0 /* donot compile when no RegularExpressions are available */ + + int32_t capacity = src->fLength; + char* buf = NULL; + int32_t bufLen = 0; + const char* translateAttr = " translate=\""; + UChar* desc = (UChar*) uprv_malloc(U_SIZEOF_UCHAR * capacity); + UChar* trans = (UChar*) uprv_malloc(U_SIZEOF_UCHAR * capacity); + + int32_t descLen = 0, transLen=0; + if(status==NULL || U_FAILURE(*status)){ + uprv_free(desc); + uprv_free(trans); + return; + } + if(desc==NULL || trans==NULL){ + *status = U_MEMORY_ALLOCATION_ERROR; + uprv_free(desc); + uprv_free(trans); + return; + } + src->fLength = removeCmtText(src->fChars, src->fLength, status); + descLen = getDescription(src->fChars,src->fLength, &desc, capacity, status); + transLen = getTranslate(src->fChars,src->fLength, &trans, capacity, status); + + /* first print translate attribute */ + if(transLen > 0){ + if(printTranslate==TRUE){ + /* print translate attribute */ + buf = convertAndEscape(&buf, 0, &bufLen, trans, transLen, status); + if(U_SUCCESS(*status)){ + T_FileStream_write(out,translateAttr, (int32_t)uprv_strlen(translateAttr)); + T_FileStream_write(out,buf, bufLen); + T_FileStream_write(out,"\">\n", 3); + } + }else if(getShowWarning() == TRUE){ + fprintf(stderr, "Warning: Tranlate attribute for resource %s cannot be set. XLIFF prohibits it.\n", resName); + /* no translate attribute .. just close the tag */ + T_FileStream_write(out,">\n", 2); + } + }else{ + /* no translate attribute .. just close the tag */ + T_FileStream_write(out,">\n", 2); + } + if(descLen > 0){ + write_tabs(out); + print(desc, descLen, "<!--", "-->", status); + } +#else + + fprintf(stderr, "Warning: Could not output comments to XLIFF file. ICU has been built without RegularExpression support.\n"); + +#endif /* UCONFIG_NO_REGULAR_EXPRESSIONS */ + +} /* Writing Functions */ -static void +static void string_write_xml(struct SResource *res, const char* id, const char* language, UErrorCode *status) { char* buf = NULL; int32_t bufLen = 0; - + char* sid = NULL; const char* strStart = "<trans-unit xml:space = \"preserve\" id = \""; const char* valStrStart = "<source xml:lang = \""; const char* valStrEnd = "</source>\n"; const char* strEnd = "</trans-unit>\n"; - + if(status==NULL || U_FAILURE(*status)){ return; } - if(res->fKey==0xFFFF || uprv_strcmp(srBundle->fKeys+res->fKey ,"")==0){ + if(res->fKey<0 || uprv_strcmp(srBundle->fKeys+res->fKey ,"")==0){ write_tabs(out); - T_FileStream_write(out,strStart, uprv_strlen(strStart)); + T_FileStream_write(out,strStart, (int32_t)uprv_strlen(strStart)); sid = getID(id, NULL, sid); - T_FileStream_write(out,sid, uprv_strlen(sid)); - T_FileStream_write(out,"\">\n", 3); + T_FileStream_write(out,sid, (int32_t)uprv_strlen(sid)); + T_FileStream_write(out,"\"", 1); tabCount++; + if(res->fComment!=NULL && res->fComment->fChars != NULL){ + printComments(res->fComment, srBundle->fKeys+res->fKey, TRUE, status); + + }else{ + T_FileStream_write(out,">\n", 2); + } + write_tabs(out); - T_FileStream_write(out,valStrStart, uprv_strlen(valStrStart)); - T_FileStream_write(out,language, uprv_strlen(language)); + + T_FileStream_write(out,valStrStart, (int32_t)uprv_strlen(valStrStart)); + T_FileStream_write(out,language, (int32_t)uprv_strlen(language)); T_FileStream_write(out,"\">", 2); - + buf = convertAndEscape(&buf,0,&bufLen,res->u.fString.fChars,res->u.fString.fLength,status); if(U_FAILURE(*status)){ return; } + T_FileStream_write(out,buf,bufLen); - T_FileStream_write(out,valStrEnd,uprv_strlen(valStrEnd)); - + T_FileStream_write(out,valStrEnd,(int32_t)uprv_strlen(valStrEnd)); + + printNoteElements(res->fComment, status); + tabCount--; write_tabs(out); - T_FileStream_write(out,strEnd,uprv_strlen(strEnd)); + T_FileStream_write(out,strEnd,(int32_t)uprv_strlen(strEnd)); }else{ const char* keyStrStart = "resname = \""; - + write_tabs(out); - - T_FileStream_write(out, strStart, uprv_strlen(strStart)); + + T_FileStream_write(out, strStart, (int32_t)uprv_strlen(strStart)); sid = getID(id, srBundle->fKeys+res->fKey,sid); - T_FileStream_write(out,sid, uprv_strlen(sid)); + T_FileStream_write(out,sid, (int32_t)uprv_strlen(sid)); T_FileStream_write(out,"\" ", 2); - T_FileStream_write(out,keyStrStart, uprv_strlen(keyStrStart)); - - T_FileStream_write(out,srBundle->fKeys+res->fKey, uprv_strlen(srBundle->fKeys+res->fKey)); - - T_FileStream_write(out,"\">\n", 3); + T_FileStream_write(out,keyStrStart, (int32_t)uprv_strlen(keyStrStart)); + + T_FileStream_write(out,srBundle->fKeys+res->fKey, (int32_t)uprv_strlen(srBundle->fKeys+res->fKey)); + T_FileStream_write(out,"\"", 1); tabCount++; + if(res->fComment!=NULL && res->fComment->fChars != NULL){ + printComments(res->fComment, srBundle->fKeys+res->fKey, TRUE, status); + }else{ + T_FileStream_write(out,">\n", 2); + } + write_tabs(out); - T_FileStream_write(out,valStrStart,uprv_strlen(valStrStart)); + T_FileStream_write(out,valStrStart, (int32_t)uprv_strlen(valStrStart)); - T_FileStream_write(out,language, uprv_strlen(language)); + T_FileStream_write(out,language, (int32_t)uprv_strlen(language)); T_FileStream_write(out,"\">", 2); buf = convertAndEscape(&buf,0,&bufLen,res->u.fString.fChars,res->u.fString.fLength,status); @@ -488,19 +671,22 @@ string_write_xml(struct SResource *res, const char* id, const char* language, UE } T_FileStream_write(out,buf,bufLen); - T_FileStream_write(out,valStrEnd,uprv_strlen(valStrEnd)); + T_FileStream_write(out,valStrEnd,(int32_t)uprv_strlen(valStrEnd)); + + printNoteElements(res->fComment, status); + tabCount--; write_tabs(out); - T_FileStream_write(out,strEnd,uprv_strlen(strEnd)); + T_FileStream_write(out,strEnd,(int32_t)uprv_strlen(strEnd)); } uprv_free(sid); - sid = NULL; - + sid = NULL; + uprv_free(buf); buf = NULL; } -static void +static void alias_write_xml(struct SResource *res, const char* id, const char* language, UErrorCode *status) { static const char* startKey = "resname=\""; static const char* val = "<source>"; @@ -508,18 +694,24 @@ alias_write_xml(struct SResource *res, const char* id, const char* language, UEr static const char* start = "<trans-unit restype = \"alias\" xml:space = \"preserve\" id = \""; static const char* end = "</trans-unit>\n"; char* sid = NULL; - + char* buf = NULL; int32_t bufLen=0; write_tabs(out); - if(res->fKey==0xFFFF || uprv_strcmp(srBundle->fKeys+res->fKey ,"")==0){ + if(res->fKey<0 || uprv_strcmp(srBundle->fKeys+res->fKey ,"")==0){ T_FileStream_write(out, start, (int32_t)uprv_strlen(start)); - + sid = getID(id, NULL, sid); T_FileStream_write(out, sid, (int32_t)uprv_strlen(sid)); - T_FileStream_write(out, "\">\n", 3); + T_FileStream_write(out, "\"", 1); tabCount++; - write_tabs(out); + if(res->fComment!=NULL && res->fComment->fChars != NULL){ + printComments(res->fComment,srBundle->fKeys+res->fKey, TRUE, status); + + }else{ + T_FileStream_write(out,">\n", 2); + } + write_tabs(out); T_FileStream_write(out, val, (int32_t)uprv_strlen(val)); }else{ sid = getID(id, srBundle->fKeys+res->fKey, sid); @@ -528,47 +720,63 @@ alias_write_xml(struct SResource *res, const char* id, const char* language, UEr T_FileStream_write(out, "\" ", 2); T_FileStream_write(out, startKey, (int32_t)uprv_strlen(startKey)); T_FileStream_write(out, srBundle->fKeys+res->fKey, (int32_t) uprv_strlen(srBundle->fKeys+res->fKey)); - - T_FileStream_write(out, "\">\n", 3); + + T_FileStream_write(out, "\"", 1); tabCount++; + if(res->fComment!=NULL && res->fComment->fChars != NULL){ + printComments(res->fComment, srBundle->fKeys+res->fKey, TRUE, status); + + }else{ + T_FileStream_write(out,">\n", 2); + } + write_tabs(out); - + T_FileStream_write(out, val, (int32_t)uprv_strlen(val)); } - + buf = convertAndEscape(&buf,0,&bufLen,res->u.fString.fChars,res->u.fString.fLength,/*FALSE,*/status); if(U_FAILURE(*status)){ return; } T_FileStream_write(out,buf,bufLen); - T_FileStream_write(out, endKey, uprv_strlen(endKey)); - + T_FileStream_write(out, endKey, (int32_t)uprv_strlen(endKey)); + + printNoteElements(res->fComment, status); + tabCount--; write_tabs(out); - - T_FileStream_write(out, end, uprv_strlen(end)); + + T_FileStream_write(out, end, (int32_t)uprv_strlen(end)); uprv_free(buf); uprv_free(sid); } -static void +static void array_write_xml( struct SResource *res, const char* id, const char* language, UErrorCode *status) { const char* start = "<group restype = \"array\" xml:space = \"preserve\" id = \""; const char* end = "</group>\n"; const char* startKey= "resname=\""; - const char* endKey = "\">\n"; + char* sid = NULL; int index = 0; - + struct SResource *current = NULL; struct SResource *first =NULL; - + write_tabs(out); - if(res->fKey==0xFFFF ||uprv_strcmp(srBundle->fKeys+res->fKey ,"")==0){ + tabCount++; + if(res->fKey<0 ||uprv_strcmp(srBundle->fKeys+res->fKey ,"")==0){ T_FileStream_write(out, start, (int32_t)uprv_strlen(start)); sid = getID(id, NULL, sid); T_FileStream_write(out, sid, (int32_t)uprv_strlen(sid)); - T_FileStream_write(out, "\">\n", 3); + T_FileStream_write(out, "\"", 1); + if(res->fComment!=NULL && res->fComment->fChars != NULL){ + printComments(res->fComment, sid, FALSE, status); + printNoteElements(res->fComment, status); + }else{ + T_FileStream_write(out,">\n", 2); + } }else{ T_FileStream_write(out, start, (int32_t)uprv_strlen(start)); sid = getID(id, srBundle->fKeys+res->fKey, sid); @@ -576,18 +784,24 @@ array_write_xml( struct SResource *res, const char* id, const char* language, UE T_FileStream_write(out, "\" ", 2); T_FileStream_write(out, startKey, (int32_t)uprv_strlen(startKey)); T_FileStream_write(out, srBundle->fKeys+res->fKey, (int32_t) uprv_strlen(srBundle->fKeys+res->fKey)); - T_FileStream_write(out, endKey, uprv_strlen(endKey)); + T_FileStream_write(out, "\"", 1); + if(res->fComment!=NULL && res->fComment->fChars != NULL){ + printComments(res->fComment, srBundle->fKeys+res->fKey, FALSE, status); + printNoteElements(res->fComment, status); + }else{ + T_FileStream_write(out,">\n", 2); + } } current = res->u.fArray.fFirst; first=current; - tabCount++; + while (current != NULL) { char c[256] = {0}; char* subId = NULL; itostr(c, index,10,0); index++; subId = getID(sid, c, subId); - + res_write_xml(current, subId, language, status); uprv_free(subId); subId = NULL; @@ -598,129 +812,157 @@ array_write_xml( struct SResource *res, const char* id, const char* language, UE } tabCount--; write_tabs(out); - T_FileStream_write(out,end,uprv_strlen(end)); + T_FileStream_write(out,end,(int32_t)uprv_strlen(end)); uprv_free(sid); sid = NULL; } -static void +static void intvector_write_xml( struct SResource *res, const char* id, const char* language, UErrorCode *status) { const char* start = "<group restype = \"intvector\" xml:space = \"preserve\" id = \""; const char* end = "</group>\n"; const char* startKey= "resname=\""; - const char* endKey = "\">\n"; - const char* intStart = "<trans-unit restype = \"int\" translate = \"no\" xml:space = \"preserve\" id = \""; + const char* intStart = "<trans-unit restype = \"int\" xml:space = \"preserve\" translate=\"no\" id = \""; const char* valIntStart = "<source>"; const char* valIntEnd = "</source>\n"; const char* intEnd = "</trans-unit>\n"; char* sid = NULL; char* ivd = NULL; - + uint32_t i=0; uint32_t len=0; char buf[256] = {'0'}; write_tabs(out); - if(res->fKey==0xFFFF || uprv_strcmp(srBundle->fKeys+res->fKey ,"")==0){ + tabCount++; + + if(res->fKey<0 || uprv_strcmp(srBundle->fKeys+res->fKey ,"")==0){ T_FileStream_write(out, start, (int32_t)uprv_strlen(start)); sid = getID(id, NULL, sid); - T_FileStream_write(out,sid, uprv_strlen(sid)); - T_FileStream_write(out,"\">\n", 3); + T_FileStream_write(out,sid, (int32_t)uprv_strlen(sid)); + T_FileStream_write(out, "\"", 1); + if(res->fComment!=NULL && res->fComment->fChars != NULL){ + printComments(res->fComment, sid, FALSE, status); + + }else{ + T_FileStream_write(out,">\n", 2); + } }else{ T_FileStream_write(out, start, (int32_t)uprv_strlen(start)); sid = getID(id, srBundle->fKeys+res->fKey, sid); - T_FileStream_write(out,sid, uprv_strlen(sid)); + T_FileStream_write(out,sid, (int32_t)uprv_strlen(sid)); T_FileStream_write(out,"\" ", 2); - + T_FileStream_write(out, startKey, (int32_t)uprv_strlen(startKey)); T_FileStream_write(out, srBundle->fKeys+res->fKey, (int32_t) uprv_strlen(srBundle->fKeys+res->fKey)); - T_FileStream_write(out, endKey, uprv_strlen(endKey)); + T_FileStream_write(out, "\"", 1); + if(res->fComment!=NULL && res->fComment->fChars != NULL){ + printComments(res->fComment, srBundle->fKeys+res->fKey, FALSE, status); + printNoteElements(res->fComment, status); + }else{ + T_FileStream_write(out,">\n", 2); + } } - tabCount++; - + + for(i = 0; i<res->u.fIntVector.fCount; i++) { char c[256] = {0}; itostr(c, i,10,0); ivd = getID(sid, c, ivd); len=itostr(buf,res->u.fIntVector.fArray[i],10,0); - + write_tabs(out); T_FileStream_write(out, intStart, (int32_t)uprv_strlen(intStart)); - T_FileStream_write(out, ivd, uprv_strlen(ivd)); + T_FileStream_write(out, ivd, (int32_t)uprv_strlen(ivd)); T_FileStream_write(out,"\">\n", 3); tabCount++; write_tabs(out); - T_FileStream_write(out,valIntStart, uprv_strlen(valIntStart)); - + T_FileStream_write(out,valIntStart, (int32_t)uprv_strlen(valIntStart)); + T_FileStream_write(out,buf,len); - - T_FileStream_write(out,valIntEnd, uprv_strlen(valIntEnd)); + + T_FileStream_write(out,valIntEnd, (int32_t)uprv_strlen(valIntEnd)); tabCount--; write_tabs(out); T_FileStream_write(out, intEnd, (int32_t)uprv_strlen(intEnd)); - + uprv_free(ivd); ivd = NULL; } - + tabCount--; write_tabs(out); - - T_FileStream_write(out, end, uprv_strlen(end)); + + T_FileStream_write(out, end, (int32_t)uprv_strlen(end)); uprv_free(sid); sid = NULL; } -static void +static void int_write_xml(struct SResource *res, const char* id, const char* language, UErrorCode *status) { - const char* intStart = "<trans-unit restype = \"int\" translate = \"no\" xml:space = \"preserve\" id = \""; + const char* intStart = "<trans-unit restype = \"int\" xml:space = \"preserve\" id = \""; const char* valIntStart = "<source>"; const char* valIntEnd = "</source>\n"; const char* intEnd = "</trans-unit>\n"; const char* keyIntStart = "resname = \""; char* sid = NULL; char buf[256] = {0}; - + uint32_t len=0; write_tabs(out); - + tabCount++; - - if(res->fKey==0xFFFF || uprv_strcmp(srBundle->fKeys+res->fKey ,"")==0){ + + if(res->fKey<0 || uprv_strcmp(srBundle->fKeys+res->fKey ,"")==0){ T_FileStream_write(out, intStart, (int32_t)uprv_strlen(intStart)); sid = getID(id, NULL, sid); - T_FileStream_write(out, sid, uprv_strlen(sid)); - T_FileStream_write(out,"\">\n", 3); + T_FileStream_write(out, sid, (int32_t)uprv_strlen(sid)); + T_FileStream_write(out,"\"", 1); + + if(res->fComment!=NULL && res->fComment->fChars != NULL){ + printComments(res->fComment, sid, TRUE, status); + + }else{ + T_FileStream_write(out,">\n", 2); + } write_tabs(out); - T_FileStream_write(out,valIntStart, uprv_strlen(valIntStart)); + T_FileStream_write(out,valIntStart, (int32_t)uprv_strlen(valIntStart)); }else{ - T_FileStream_write(out, intStart, uprv_strlen(intStart)); + T_FileStream_write(out, intStart, (int32_t)uprv_strlen(intStart)); sid = getID(id, srBundle->fKeys+res->fKey, sid); - T_FileStream_write(out, sid, uprv_strlen(sid)); + T_FileStream_write(out, sid, (int32_t)uprv_strlen(sid)); T_FileStream_write(out,"\" ", 2); - T_FileStream_write(out,keyIntStart, uprv_strlen(keyIntStart)); - + T_FileStream_write(out,keyIntStart, (int32_t)uprv_strlen(keyIntStart)); + T_FileStream_write(out, srBundle->fKeys+res->fKey, (int32_t) uprv_strlen(srBundle->fKeys+res->fKey)); - T_FileStream_write(out, "\">\n", 3); + T_FileStream_write(out,"\"", 1); + + if(res->fComment!=NULL && res->fComment->fChars != NULL){ + printComments(res->fComment, srBundle->fKeys+res->fKey, TRUE, status); + + }else{ + T_FileStream_write(out,">\n", 2); + } write_tabs(out); T_FileStream_write(out, valIntStart, (int32_t)uprv_strlen(valIntStart)); - + } len=itostr(buf,res->u.fIntValue.fValue,10,0); T_FileStream_write(out,buf,len); - - T_FileStream_write(out, valIntEnd, uprv_strlen(valIntEnd)); + + T_FileStream_write(out, valIntEnd, (int32_t)uprv_strlen(valIntEnd)); + printNoteElements(res->fComment, status); tabCount--; write_tabs(out); - T_FileStream_write(out, intEnd, uprv_strlen(intEnd)); + T_FileStream_write(out, intEnd, (int32_t)uprv_strlen(intEnd)); uprv_free(sid); sid = NULL; } -static void +static void bin_write_xml( struct SResource *res, const char* id, const char* language, UErrorCode *status) { - const char* start = "<bin-unit restype = \"bin\" translate = \"no\" id = \""; - const char* importStart = "<bin-unit restype = \"import\" translate = \"no\" id = \""; + const char* start = "<bin-unit restype = \"bin\" id = \""; + const char* importStart = "<bin-unit restype = \"import\" id = \""; const char* mime = " mime-type = "; const char* key = "\" resname = \""; const char* valStart = "<bin-source>\n"; @@ -733,16 +975,16 @@ bin_write_xml( struct SResource *res, const char* id, const char* language, UErr const char* m_type = "\"application"; char* sid = NULL; uint32_t crc = 0xFFFFFFFF; - + char fileName[1024] ={0}; - int32_t tLen = ( outDir == NULL) ? 0 :uprv_strlen(outDir); - char* fn = (char*) uprv_malloc(sizeof(char) * (tLen+1024 + - (res->u.fBinaryValue.fFileName !=NULL ? + int32_t tLen = ( outDir == NULL) ? 0 :(int32_t)uprv_strlen(outDir); + char* fn = (char*) uprv_malloc(sizeof(char) * (tLen+1024 + + (res->u.fBinaryValue.fFileName !=NULL ? uprv_strlen(res->u.fBinaryValue.fFileName) :0))); const char* ext = NULL; - - char* f = NULL; - + + char* f = NULL; + fn[0]=0; if(res->u.fBinaryValue.fFileName!=NULL){ @@ -763,7 +1005,7 @@ bin_write_xml( struct SResource *res, const char* id, const char* language, UErr write_tabs(out); T_FileStream_write(out, importStart, (int32_t)uprv_strlen(importStart)); - if(res->fKey==0xFFFF || uprv_strcmp(srBundle->fKeys+res->fKey ,"")==0){ + if(res->fKey<0 || uprv_strcmp(srBundle->fKeys+res->fKey ,"")==0){ sid = getID(id, NULL, sid); T_FileStream_write(out, sid, (int32_t)uprv_strlen(sid)); } else { @@ -773,25 +1015,35 @@ bin_write_xml( struct SResource *res, const char* id, const char* language, UErr T_FileStream_write(out, "\" ", 2); T_FileStream_write(out, mime, (int32_t)uprv_strlen(mime)); T_FileStream_write(out, m_type, (int32_t)uprv_strlen(m_type)); - if(!(res->fKey==0xFFFF || uprv_strcmp(srBundle->fKeys+res->fKey ,"")==0)){ + if(!(res->fKey<0 || uprv_strcmp(srBundle->fKeys+res->fKey ,"")==0)){ T_FileStream_write(out, key, (int32_t)uprv_strlen(key)); T_FileStream_write(out, srBundle->fKeys+res->fKey, (int32_t) uprv_strlen(srBundle->fKeys+res->fKey)); - } - T_FileStream_write(out, "\">\n", 3); + } + T_FileStream_write(out,"\"", 1); tabCount++; + if(res->fComment!=NULL && res->fComment->fChars != NULL){ + printComments(res->fComment, sid, TRUE, status); + + }else{ + T_FileStream_write(out,">\n", 2); + } + write_tabs(out); - T_FileStream_write(out, valStart, uprv_strlen(valStart)); + + T_FileStream_write(out, valStart, (int32_t)uprv_strlen(valStart)); tabCount++; write_tabs(out); - T_FileStream_write(out, externalFileStart, uprv_strlen(externalFileStart)); + T_FileStream_write(out, externalFileStart, (int32_t)uprv_strlen(externalFileStart)); T_FileStream_write(out, f, (int32_t)uprv_strlen(f)); - T_FileStream_write(out, externalFileEnd, uprv_strlen(externalFileEnd)); + T_FileStream_write(out, externalFileEnd, (int32_t)uprv_strlen(externalFileEnd)); tabCount--; write_tabs(out); - T_FileStream_write(out, valEnd, uprv_strlen(valEnd)); + T_FileStream_write(out, valEnd, (int32_t)uprv_strlen(valEnd)); + + printNoteElements(res->fComment, status); tabCount--; write_tabs(out); - T_FileStream_write(out,end,uprv_strlen(end)); + T_FileStream_write(out,end,(int32_t)uprv_strlen(end)); } else { char temp[256] = {0}; uint32_t i = 0; @@ -799,53 +1051,62 @@ bin_write_xml( struct SResource *res, const char* id, const char* language, UErr write_tabs(out); T_FileStream_write(out, start, (int32_t)uprv_strlen(start)); - if(res->fKey==0xFFFF || uprv_strcmp(srBundle->fKeys+res->fKey ,"")==0){ + if(res->fKey<0 || uprv_strcmp(srBundle->fKeys+res->fKey ,"")==0){ sid = getID(id, NULL, sid); T_FileStream_write(out, sid, (int32_t)uprv_strlen(sid)); } else { sid = getID(id, srBundle->fKeys+res->fKey, sid); T_FileStream_write(out, sid, (int32_t)uprv_strlen(sid)); } - + T_FileStream_write(out, "\" ", 2); T_FileStream_write(out, mime, (int32_t)uprv_strlen(mime)); T_FileStream_write(out, m_type, (int32_t)uprv_strlen(m_type)); - if(!(res->fKey==0xFFFF || uprv_strcmp(srBundle->fKeys+res->fKey ,"")==0)){ + if(!(res->fKey<0 || uprv_strcmp(srBundle->fKeys+res->fKey ,"")==0)){ T_FileStream_write(out, key, (int32_t)uprv_strlen(key)); T_FileStream_write(out, srBundle->fKeys+res->fKey, (int32_t) uprv_strlen(srBundle->fKeys+res->fKey)); } - T_FileStream_write(out, "\">\n", 3); + T_FileStream_write(out,"\"", 1); tabCount++; + if(res->fComment!=NULL && res->fComment->fChars != NULL){ + printComments(res->fComment, sid, TRUE, status); + + }else{ + T_FileStream_write(out,">\n", 2); + } + write_tabs(out); - T_FileStream_write(out, valStart, uprv_strlen(valStart)); + T_FileStream_write(out, valStart, (int32_t)uprv_strlen(valStart)); tabCount++; write_tabs(out); - T_FileStream_write(out, fileStart, uprv_strlen(fileStart)); - + T_FileStream_write(out, fileStart, (int32_t)uprv_strlen(fileStart)); + while(i <res->u.fBinaryValue.fLength){ len = itostr(temp,res->u.fBinaryValue.fData[i],16,2); crc = computeCRC(temp, len, crc); i++; } - + len = itostr(temp, crc, 10, 0); T_FileStream_write(out,temp,len); T_FileStream_write(out,"\">",2); - + i = 0; while(i <res->u.fBinaryValue.fLength){ len = itostr(temp,res->u.fBinaryValue.fData[i],16,2); T_FileStream_write(out,temp,len); i++; } - T_FileStream_write(out, fileEnd, uprv_strlen(fileEnd)); + T_FileStream_write(out, fileEnd, (int32_t)uprv_strlen(fileEnd)); tabCount--; write_tabs(out); - T_FileStream_write(out, valEnd, uprv_strlen(valEnd)); + T_FileStream_write(out, valEnd, (int32_t)uprv_strlen(valEnd)); + printNoteElements(res->fComment, status); + tabCount--; write_tabs(out); - T_FileStream_write(out,end,uprv_strlen(end)); - + T_FileStream_write(out,end,(int32_t)uprv_strlen(end)); + uprv_free(fn); uprv_free(sid); sid = NULL; @@ -854,7 +1115,7 @@ bin_write_xml( struct SResource *res, const char* id, const char* language, UErr -static void +static void table_write_xml(struct SResource *res, const char* id, const char* language, UErrorCode *status) { uint32_t i = 0; @@ -867,17 +1128,18 @@ table_write_xml(struct SResource *res, const char* id, const char* language, UEr const char* idstr = " id = \""; const char* end = "</group>\n"; const char* startKey= "resname=\""; - const char* endKey = ">\n"; if (U_FAILURE(*status)) { return ; } - + if (res->u.fTable.fCount > 0) { write_tabs(out); - if(res->fKey==0xFFFF || uprv_strcmp(srBundle->fKeys+res->fKey ,"")==0){ + tabCount++; + + if(res->fKey<0 || uprv_strcmp(srBundle->fKeys+res->fKey ,"")==0){ T_FileStream_write(out, start, (int32_t)uprv_strlen(start)); - + sid = getID(id, NULL, sid); /* only write the id if the sid!="" */ if(sid[0]!='\0'){ @@ -886,8 +1148,13 @@ table_write_xml(struct SResource *res, const char* id, const char* language, UEr T_FileStream_write(out, "\" ", 2); } - T_FileStream_write(out, endKey, (int32_t)uprv_strlen(endKey)); - + + if(res->fComment!=NULL && res->fComment->fChars != NULL){ + printComments(res->fComment, sid, FALSE, status); + printNoteElements(res->fComment, status); + }else{ + T_FileStream_write(out,">\n", 2); + } }else{ T_FileStream_write(out, start, (int32_t)uprv_strlen(start)); sid = getID(id, srBundle->fKeys+res->fKey, sid); @@ -898,19 +1165,24 @@ table_write_xml(struct SResource *res, const char* id, const char* language, UEr T_FileStream_write(out, sid, (int32_t)uprv_strlen(sid)); T_FileStream_write(out, "\" ", 2); } - + T_FileStream_write(out, startKey, (int32_t)uprv_strlen(startKey)); T_FileStream_write(out, srBundle->fKeys+res->fKey, (int32_t) uprv_strlen(srBundle->fKeys+res->fKey)); T_FileStream_write(out, "\" ", 2); - T_FileStream_write(out, endKey, uprv_strlen(endKey)); + + if(res->fComment!=NULL && res->fComment->fChars != NULL){ + printComments(res->fComment, srBundle->fKeys+res->fKey, FALSE, status); + printNoteElements(res->fComment, status); + }else{ + T_FileStream_write(out,">\n", 2); + } } - tabCount++; - + save = current = res->u.fTable.fFirst; i = 0; while (current != NULL) { res_write_xml(current, sid, language, status); - + if(U_FAILURE(*status)){ return; } @@ -919,14 +1191,19 @@ table_write_xml(struct SResource *res, const char* id, const char* language, UEr } tabCount--; write_tabs(out); - T_FileStream_write(out,end,uprv_strlen(end)); + T_FileStream_write(out,end,(int32_t)uprv_strlen(end)); } else { write_tabs(out); - if(res->fKey==0xFFFF || uprv_strcmp(srBundle->fKeys+res->fKey ,"")==0){ + if(res->fKey<0 || uprv_strcmp(srBundle->fKeys+res->fKey ,"")==0){ T_FileStream_write(out, start, (int32_t)uprv_strlen(start)); sid = getID(id, NULL, sid); T_FileStream_write(out, sid, (int32_t)uprv_strlen(sid)); - T_FileStream_write(out, endKey, (int32_t)uprv_strlen(endKey)); + if(res->fComment!=NULL && res->fComment->fChars != NULL){ + printComments(res->fComment, sid, FALSE, status); + printNoteElements(res->fComment, status); + }else{ + T_FileStream_write(out,">\n", 2); + } }else{ T_FileStream_write(out, start, (int32_t)uprv_strlen(start)); sid = getID(id, srBundle->fKeys+res->fKey, sid); @@ -934,19 +1211,25 @@ table_write_xml(struct SResource *res, const char* id, const char* language, UEr T_FileStream_write(out, "\" ", 2); T_FileStream_write(out, startKey, (int32_t)uprv_strlen(startKey)); T_FileStream_write(out, srBundle->fKeys+res->fKey, (int32_t) uprv_strlen(srBundle->fKeys+res->fKey)); - T_FileStream_write(out, endKey, uprv_strlen(endKey)); + + if(res->fComment!=NULL && res->fComment->fChars != NULL){ + printComments(res->fComment, srBundle->fKeys+res->fKey, FALSE, status); + printNoteElements(res->fComment, status); + }else{ + T_FileStream_write(out,">\n", 2); + } } - + write_tabs(out); - T_FileStream_write(out,end,uprv_strlen(end)); + T_FileStream_write(out,end,(int32_t)uprv_strlen(end)); } uprv_free(sid); sid = NULL; } -void +void res_write_xml(struct SResource *res, const char* id, const char* language, UErrorCode *status) { - + if (U_FAILURE(*status)) { return ; } @@ -972,6 +1255,7 @@ res_write_xml(struct SResource *res, const char* id, const char* language, UErro array_write_xml (res, id, language, status); return; case URES_TABLE: + case URES_TABLE32: table_write_xml (res, id, language, status); return; @@ -983,10 +1267,10 @@ res_write_xml(struct SResource *res, const char* id, const char* language, UErro *status = U_INTERNAL_PROGRAM_ERROR; } -void +void bundle_write_xml(struct SRBRoot *bundle, const char *outputDir,const char* outputEnc, const char* filename, - char *writtenFilename, int writtenFilenameLen, - const char* language, const char* package, UErrorCode *status) { + char *writtenFilename, int writtenFilenameLen, + const char* language, const char* outFileName, UErrorCode *status) { char* xmlfileName = NULL; char* outputFileName = NULL; @@ -996,38 +1280,37 @@ bundle_write_xml(struct SRBRoot *bundle, const char *outputDir,const char* outpu const char* file2 = "original = \""; const char* file3 = "\" tool = \"genrb\" "; const char* file4 = "date = \""; - const char* file5 = "\" ts = \""; const char* fileEnd = "</file>\n"; const char* headerStart = "<header>"; const char* headerEnd = "</header>\n"; const char* bodyStart = "<body>\n"; const char* bodyEnd = "</body>\n"; - const char* defaultLang = "en"; + char* pid = NULL; char* temp = NULL; char* lang = NULL; char* pos; - int first, index; + int32_t first, index; time_t currTime; char timeBuf[128]; - + outDir = outputDir; srBundle = bundle; - + pos = uprv_strrchr(filename, '\\'); if(pos != NULL) { - first = pos - filename + 1; + first = (int32_t)(pos - filename + 1); } else { first = 0; } - index = uprv_strlen(filename) - uprv_strlen(textExt) - first; + index = (int32_t)(uprv_strlen(filename) - uprv_strlen(textExt) - first); originalFileName = uprv_malloc(sizeof(char)*index+1); uprv_memset(originalFileName, 0, sizeof(char)*index+1); uprv_strncpy(originalFileName, filename + first, index); - + if(uprv_strcmp(originalFileName, srBundle->fLocale) != 0) { - fprintf(stdout, "warning! The file name is not same as the resource name!\n"); + fprintf(stdout, "Warning: The file name is not same as the resource name!\n"); } temp = originalFileName; @@ -1042,9 +1325,29 @@ bundle_write_xml(struct SRBRoot *bundle, const char *outputDir,const char* outpu if (language == NULL) { lang = parseFilename(filename, lang); if (lang == NULL) { - lang = uprv_malloc(sizeof(char)*uprv_strlen(defaultLang) +1); - uprv_memset(lang, 0, sizeof(char)*uprv_strlen(defaultLang) +1); - uprv_strcpy(lang, defaultLang); + /* now check if locale name is valid or not + * this is to cater for situation where + * pegasusServer.txt contains + * + * en{ + * .. + * } + */ + lang = parseFilename(srBundle->fLocale, lang); + /* + * Neither the file name nor the table name inside the + * txt file contain a valid country and language codes + * throw an error. + * pegasusServer.txt contains + * + * testelements{ + * .... + * } + */ + if(lang==NULL){ + fprintf(stderr, "Error: The file name and table name do not contain a valid language code. Please use -l option to specify it.\n"); + exit(U_ILLEGAL_ARGUMENT_ERROR); + } } } else { lang = uprv_malloc(sizeof(char)*uprv_strlen(language) +1); @@ -1052,16 +1355,16 @@ bundle_write_xml(struct SRBRoot *bundle, const char *outputDir,const char* outpu uprv_strcpy(lang, language); } - if(package) { - outputFileName = uprv_malloc(sizeof(char)*uprv_strlen(package) + 1); - uprv_memset(outputFileName, 0, sizeof(char)*uprv_strlen(package) + 1); - uprv_strcpy(outputFileName,package); + if(outFileName) { + outputFileName = uprv_malloc(sizeof(char)*uprv_strlen(outFileName) + 1); + uprv_memset(outputFileName, 0, sizeof(char)*uprv_strlen(outFileName) + 1); + uprv_strcpy(outputFileName,outFileName); } else { outputFileName = uprv_malloc(sizeof(char)*uprv_strlen(srBundle->fLocale) + 1); uprv_memset(outputFileName, 0, sizeof(char)*uprv_strlen(srBundle->fLocale) + 1); uprv_strcpy(outputFileName,srBundle->fLocale); } - + if(outputDir) { xmlfileName = uprv_malloc(sizeof(char)*(uprv_strlen(outputDir) + uprv_strlen(outputFileName) + uprv_strlen(xliffExt) + 1) +1); uprv_memset(xmlfileName, 0, sizeof(char)*(uprv_strlen(outputDir)+ uprv_strlen(outputFileName) + uprv_strlen(xliffExt) + 1) +1); @@ -1069,7 +1372,7 @@ bundle_write_xml(struct SRBRoot *bundle, const char *outputDir,const char* outpu xmlfileName = uprv_malloc(sizeof(char)*(uprv_strlen(outputFileName) + uprv_strlen(xliffExt)) +1); uprv_memset(xmlfileName, 0, sizeof(char)*(uprv_strlen(outputFileName) + uprv_strlen(xliffExt)) +1); } - + if(outputDir){ uprv_strcpy(xmlfileName, outputDir); if(outputDir[uprv_strlen(outputDir)-1] !=U_FILE_SEP_CHAR){ @@ -1086,15 +1389,15 @@ bundle_write_xml(struct SRBRoot *bundle, const char *outputDir,const char* outpu if (U_FAILURE(*status)) { return; } - + out= T_FileStream_open(xmlfileName,"w"); if(out==NULL){ *status = U_FILE_ACCESS_ERROR; return; } - T_FileStream_write(out,xmlHeader, uprv_strlen(xmlHeader)); - + T_FileStream_write(out,xmlHeader, (int32_t)uprv_strlen(xmlHeader)); + if(outputEnc && *outputEnc!='\0'){ /* store the output encoding */ enc = outputEnc; @@ -1103,52 +1406,46 @@ bundle_write_xml(struct SRBRoot *bundle, const char *outputDir,const char* outpu return; } } - T_FileStream_write(out,bundleStart,uprv_strlen(bundleStart)); + T_FileStream_write(out,bundleStart, (int32_t)uprv_strlen(bundleStart)); write_tabs(out); - T_FileStream_write(out, fileStart, uprv_strlen(fileStart)); - T_FileStream_write(out,lang,uprv_strlen(lang)); - T_FileStream_write(out,file1, uprv_strlen(file1)); - T_FileStream_write(out,file2, uprv_strlen(file2)); - T_FileStream_write(out,originalFileName, uprv_strlen(originalFileName)); - T_FileStream_write(out,file3, uprv_strlen(file3)); - T_FileStream_write(out,file4, uprv_strlen(file4)); + T_FileStream_write(out, fileStart, (int32_t)uprv_strlen(fileStart)); + /* check if lang and language are the same */ + if(language != NULL && uprv_strcmp(lang, srBundle->fLocale)!=0){ + fprintf(stderr,"Warning: The top level tag in the resource and language specified are not the same. Please check the input.\n"); + } + T_FileStream_write(out,lang, (int32_t)uprv_strlen(lang)); + T_FileStream_write(out,file1, (int32_t)uprv_strlen(file1)); + T_FileStream_write(out,file2, (int32_t)uprv_strlen(file2)); + T_FileStream_write(out,originalFileName, (int32_t)uprv_strlen(originalFileName)); + T_FileStream_write(out,file3, (int32_t)uprv_strlen(file3)); + T_FileStream_write(out,file4, (int32_t)uprv_strlen(file4)); time(&currTime); strftime(timeBuf, sizeof(timeBuf), "%Y-%m-%dT%H:%M:%SZ", gmtime(&currTime)); - T_FileStream_write(out,timeBuf, uprv_strlen(timeBuf)); + T_FileStream_write(out,timeBuf, (int32_t)uprv_strlen(timeBuf)); - if(package) { - T_FileStream_write(out,file5, uprv_strlen(file5)); - T_FileStream_write(out,package, uprv_strlen(package)); - } T_FileStream_write(out,"\">\n", 3); tabCount++; write_tabs(out); - T_FileStream_write(out,headerStart, uprv_strlen(headerStart)); - T_FileStream_write(out,headerEnd, uprv_strlen(headerEnd)); + T_FileStream_write(out,headerStart, (int32_t)uprv_strlen(headerStart)); + T_FileStream_write(out,headerEnd, (int32_t)uprv_strlen(headerEnd)); write_tabs(out); tabCount++; - T_FileStream_write(out,bodyStart, uprv_strlen(bodyStart)); - - if(package) { - pid = uprv_malloc(sizeof(char) * uprv_strlen(package)+1); - uprv_memset(pid, 0, sizeof(char) * uprv_strlen(package)+1); - uprv_strcpy(pid, package); - res_write_xml(bundle->fRoot, pid, lang, status); - } else { - res_write_xml(bundle->fRoot, "", lang, status); - } + T_FileStream_write(out,bodyStart, (int32_t)uprv_strlen(bodyStart)); + + + res_write_xml(bundle->fRoot, srBundle->fLocale, lang, status); tabCount--; write_tabs(out); - T_FileStream_write(out,bodyEnd, uprv_strlen(bodyEnd)); + T_FileStream_write(out,bodyEnd, (int32_t)uprv_strlen(bodyEnd)); tabCount--; write_tabs(out); - T_FileStream_write(out,fileEnd, uprv_strlen(fileEnd)); + T_FileStream_write(out,fileEnd, (int32_t)uprv_strlen(fileEnd)); tabCount--; write_tabs(out); - T_FileStream_write(out,bundleEnd,uprv_strlen(bundleEnd)); + T_FileStream_write(out,bundleEnd,(int32_t)uprv_strlen(bundleEnd)); T_FileStream_close(out); ucnv_close(conv); @@ -1171,6 +1468,6 @@ bundle_write_xml(struct SRBRoot *bundle, const char *outputDir,const char* outpu } if(outputFileName != NULL){ uprv_free(outputFileName); - pid = NULL; - } + pid = NULL; + } } diff --git a/icuSources/tools/genren/Makefile b/icuSources/tools/genren/Makefile index 682beb38..a1f5925e 100644 --- a/icuSources/tools/genren/Makefile +++ b/icuSources/tools/genren/Makefile @@ -1,6 +1,6 @@ #****************************************************************************** # -# Copyright (C) 2002-2003, International Business Machines +# Copyright (C) 2002-2004, International Business Machines # Corporation and others. All Rights Reserved. # #****************************************************************************** @@ -9,12 +9,12 @@ ICUDIR=ICUunrenamed TOP=../.. SO=so -COM=$(ICUDIR)/common/libicuuc.$(SO) -I18=$(ICUDIR)/i18n/libicui18n.$(SO) -LAY=$(ICUDIR)/layout/libicule.$(SO) -LEX=$(ICUDIR)/layoutex/libiculx.$(SO) +COM=$(ICUDIR)/lib/libicuuc.$(SO) +I18=$(ICUDIR)/lib/libicui18n.$(SO) +LAY=$(ICUDIR)/lib/libicule.$(SO) +LEX=$(ICUDIR)/lib/libiculx.$(SO) DAT=$(ICUDIR)/stubdata/libicudata.$(SO) -UIO=$(ICUDIR)/extra/ustdio/libicuio.$(SO) +UIO=$(ICUDIR)/lib/libicuio.$(SO) LIBS=$(COM) $(I18) $(LAY) $(LEX) $(UIO) diff --git a/icuSources/tools/genren/genren.pl b/icuSources/tools/genren/genren.pl index 4c8b49aa..ddf78786 100644 --- a/icuSources/tools/genren/genren.pl +++ b/icuSources/tools/genren/genren.pl @@ -1,7 +1,7 @@ #!/usr/bin/perl #* #******************************************************************************* -#* Copyright (C) 2001-2003, International Business Machines +#* Copyright (C) 2001-2004, International Business Machines #* Corporation and others. All Rights Reserved. #******************************************************************************* #* @@ -60,7 +60,7 @@ $HEADERDEF =~ s/\./_/; print HEADER <<"EndOfHeaderComment"; /* ******************************************************************************* -* Copyright (C) 2002-2003, International Business Machines +* Copyright (C) 2002-2004, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************* * diff --git a/icuSources/tools/genidna/Makefile.in b/icuSources/tools/gensprep/Makefile.in similarity index 78% rename from icuSources/tools/genidna/Makefile.in rename to icuSources/tools/gensprep/Makefile.in index 73a657d9..3bdb909c 100644 --- a/icuSources/tools/genidna/Makefile.in +++ b/icuSources/tools/gensprep/Makefile.in @@ -1,5 +1,5 @@ -## Makefile.in for ICU - tools/genidna -## Copyright (c) 2001-2003, International Business Machines Corporation and +## Makefile.in for ICU - tools/gensprep +## Copyright (c) 2001-2004, International Business Machines Corporation and ## others. All Rights Reserved. ## Steven R. Loomis/Markus W. Scherer @@ -13,33 +13,32 @@ include $(top_builddir)/icudefs.mk ## +TARGET_STUB_NAME = gensprep + SECTION = 8 -MAN_FILES = $(TARGET:$(EXEEXT)=).$(SECTION) +MAN_FILES = $(TARGET_STUB_NAME).$(SECTION) ## Build directory information -subdir = tools/genidna - -ICUDATADIR=$(top_builddir)/data -UNICODEDATADIR=$(top_srcdir)/../data/unidata +subdir = tools/gensprep ## Extra files to remove for 'make clean' -CLEANFILES = *~ $(DEPS) $(RES_FILES) $(TEST_FILES) $(MAN_FILES) +CLEANFILES = *~ $(DEPS) $(MAN_FILES) ## Target information -TARGET = genidna$(EXEEXT) +TARGET = $(BINDIR)/$(TARGET_STUB_NAME)$(EXEEXT) CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common -I$(srcdir)/../toolutil LIBS = $(LIBICUTOOLUTIL) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M) -OBJECTS = genidna.o store.o +OBJECTS = gensprep.o store.o DEPS = $(OBJECTS:.o=.d) ## List of phony targets .PHONY : all all-local install install-local clean clean-local \ distclean distclean-local dist dist-local check \ -check-local build-data install-man +check-local install-man ## Clear suffix list .SUFFIXES : @@ -52,11 +51,11 @@ distclean : distclean-local dist: dist-local check: all check-local -all-local: $(TARGET) build-data $(MAN_FILES) +all-local: $(TARGET) $(MAN_FILES) install-local: all-local install-man $(MKINSTALLDIRS) $(DESTDIR)$(sbindir) - $(INSTALL) $(TARGET) $(DESTDIR)$(sbindir)/$(TARGET) + $(INSTALL) $(TARGET) $(DESTDIR)$(sbindir) # man page install-man: $(MAN_FILES) diff --git a/icuSources/tools/gensprep/filterRFC3454.pl b/icuSources/tools/gensprep/filterRFC3454.pl new file mode 100644 index 00000000..fc52836f --- /dev/null +++ b/icuSources/tools/gensprep/filterRFC3454.pl @@ -0,0 +1,294 @@ +#/usr/bin/perl +# Copyright (c) 2001-2004 International Business Machines +# Corporation and others. All Rights Reserved. + +#################################################################################### +# filterRFC3454.pl: +# This tool filters the RFC-3454 txt file for StringPrep tables and creates a table +# to be used in NamePrepProfile +# +# Author: Ram Viswanadha +# +#################################################################################### + +use File::Find; +use File::Basename; +use IO::File; +use Cwd; +use File::Copy; +use Getopt::Long; +use File::Path; +use File::Copy; + +$copyright = "#################\n# This file was generated from RFC 3454 (http://www.ietf.org/rfc/rfc3454.txt)\n# Copyright (C) The Internet Society (2002). All Rights Reserved. \n###################\n\n"; +$warning = "###################\n# WARNING: This table is generated by filterRFC3454.pl tool. DO NOT EDIT \n###################\n\n"; +#run the program) +main(); + +#--------------------------------------------------------------------- +# The main program + +sub main(){ + GetOptions( + "--sourcedir=s" => \$sourceDir, + "--destdir=s" => \$destDir, + "--src-filename=s" => \$srcFileName, + "--dest-filename=s" => \$destFileName, + "--A1" => \$a1, + "--B1" => \$b1, + "--B2" => \$b2, + "--B3" => \$b3, + "--C11" => \$c11, + "--C12" => \$c12, + "--C21" => \$c21, + "--C22" => \$c22, + "--C3" => \$c3, + "--C4" => \$c4, + "--C5" => \$c5, + "--C6" => \$c6, + "--C7" => \$c7, + "--C8" => \$c8, + "--C9" => \$c9, + "--ldh-chars" => \$writeLDHChars, + "--iscsi" => \$writeISCSIChars, + ); + usage() unless defined $sourceDir; + usage() unless defined $destDir; + usage() unless defined $srcFileName; + usage() unless defined $destFileName; + + $infile = $sourceDir."/".$srcFileName; + $inFH = IO::File->new($infile,"r") + or die "could not open the file $infile for reading: $! \n"; + $outfile = $destDir."/".$destFileName; + + unlink($outfile); + $outFH = IO::File->new($outfile,"a") + or die "could not open the file $outfile for writing: $! \n"; + print $outFH $copyright; + print $outFH $warning; + close($outFH); + + if(defined $b2 && defined $b3){ + die "ERROR: --B2 and --B3 are both specified\!\n"; + } + + while(defined ($line=<$inFH>)){ + next unless $line=~ /Start\sTable/; + if($line =~ /A.1/){ + createUnassignedTable($inFH,$outfile); + } + if($line =~ /B.1/ && defined $b1){ + createMapToNothing($inFH,$outfile); + } + if($line =~ /B.2/ && defined $b2){ + createCaseMapNorm($inFH,$outfile); + } + if($line =~ /B.3/ && defined $b3){ + createCaseMapNoNorm($inFH,$outfile); + } + if($line =~ /C.1.1/ && defined $c11 ){ + createProhibitedTable($inFH,$outfile,$line); + } + if($line =~ /C.1.2/ && defined $c12 ){ + createProhibitedTable($inFH,$outfile,$line); + } + if($line =~ /C.2.1/ && defined $c21 ){ + createProhibitedTable($inFH,$outfile,$line); + } + if($line =~ /C.2.2/ && defined $c22 ){ + createProhibitedTable($inFH,$outfile,$line); + } + if($line =~ /C.3/ && defined $c3 ){ + createProhibitedTable($inFH,$outfile,$line); + } + if($line =~ /C.4/ && defined $c4 ){ + createProhibitedTable($inFH,$outfile,$line); + } + if($line =~ /C.5/ && defined $c5 ){ + createProhibitedTable($inFH,$outfile,$line); + } + if($line =~ /C.6/ && defined $c6 ){ + createProhibitedTable($inFH,$outfile,$line); + } + if($line =~ /C.7/ && defined $c7 ){ + createProhibitedTable($inFH,$outfile,$line); + } + if($line =~ /C.8/ && defined $c8 ){ + createProhibitedTable($inFH,$outfile,$line); + } + if($line =~ /C.9/ && defined $c9 ){ + createProhibitedTable($inFH,$outfile,$line); + } + } + if( defined $writeISCSIChars){ + create_iSCSIExtraProhibitedTable($inFH, $outfile); + } + close($inFH); +} + +#----------------------------------------------------------------------- +sub readPrint{ + local ($inFH, $outFH,$comment, $table) = @_; + $count = 0; + print $outFH $comment."\n"; + while(defined ($line = <$inFH>)){ + next if $line =~ /Hoffman\s\&\sBlanchet/; # ignore heading + next if $line =~ /RFC\s3454/; # ignore heading + next if $line =~ /\f/; # ignore form feed + next if $line eq "\n"; # ignore blank lines + # break if "End Table" is found + if( $line =~ /End\sTable/){ + print $outFH "\n# Total code points $count\n\n"; + return; + } + if($print==1){ + print $line; + } + $line =~ s/-/../; + $line =~ s/^\s+//; + if($line =~ /\;/){ + }else{ + $line =~ s/$/;/; + } + if($table =~ /A/ ){ + ($code, $noise) = split /;/ , $line; + $line = $code."; ; UNASSIGNED\n"; + }elsif ( $table =~ /B\.1/ ){ + $line =~ s/Map to nothing/MAP/; + }elsif ( $table =~ /B\.[23]/ ){ + $line =~ s/Case map/MAP/; + $line =~ s/Additional folding/MAP/; + }elsif ( $table =~ /C/ ) { + ($code, $noise) = split /;/ , $line; + $line = $code."; ; PROHIBITED\n"; + } + if($line =~ /\.\./){ + ($code, $noise) = split /;/ , $line; + ($startStr, $endStr ) = split /\.\./, $code; + $start = atoi($startStr); + $end = atoi($endStr); + #print $start." ".$end."\n"; + while($start <= $end){ + $count++; + $start++; + } + }else{ + $count++; + } + print $outFH $line; + } +} +#----------------------------------------------------------------------- +sub atoi { + my $t; + foreach my $d (split(//, shift())) { + $t = $t * 16 + $d; + } + return $t; +} +#----------------------------------------------------------------------- +sub createUnassignedTable{ + ($inFH,$outfile) = @_; + $outFH = IO::File->new($outfile,"a") + or die "could not open the file $outfile for writing: $! \n"; + $comment = "# This table contains code points from Table A.1 from RFC 3454\n"; + readPrint($inFH,$outFH, $comment, "A"); + close($outFH); +} +#----------------------------------------------------------------------- +sub createMapToNothing{ + ($inFH,$outfile) = @_; + $outFH = IO::File->new($outfile,"a") + or die "could not open the file $outfile for writing: $! \n"; + $comment = "# This table contains code points from Table B.1 from RFC 3454\n"; + readPrint($inFH,$outFH,$comment, "B.1"); + close($outFH); +} +#----------------------------------------------------------------------- +sub createCaseMapNorm{ + ($inFH,$outfile) = @_; + $outFH = IO::File->new($outfile,"a") + or die "could not open the file $outfile for writing: $! \n"; + $comment = $warning."# This table contains code points from Table B.2 from RFC 3454\n"; + readPrint($inFH,$outFH,$comment, "B.2"); + close($outFH); +} +#----------------------------------------------------------------------- +sub createCaseMapNoNorm{ + ($inFH,$outfile) = @_; + $outFH = IO::File->new($outfile,"a") + or die "could not open the file $outfile for writing: $! \n"; + $comment = $warning."# This table contains code points from Table B.3 from RFC 3454\n"; + readPrint($inFH,$outFH,$comment, "B.3"); + close($outFH); +} +#----------------------------------------------------------------------- +sub createProhibitedTable{ + ($inFH,$outfile,$line) = @_; + $line =~ s/Start//; + $line =~ s/-//g; + $comment = "# code points from $line"; + + $outFH = IO::File->new($outfile, "a") + or die "could not open the file $outfile for writing: $! \n"; + readPrint($inFH,$outFH,$comment, "C"); + close($outFH); +} + +#----------------------------------------------------------------------- +sub create_iSCSIExtraProhibitedTable{ + ($inFH,$outfile,$line) = @_; + $comment ="# Additional prohibitions from draft-ietf-ips-iscsi-string-prep-06.txt\n"; + + $outFH = IO::File->new($outfile, "a") + or die "could not open the file $outfile for writing: $! \n"; + print $outFH $comment; + print $outFH "0021..002C; ; PROHIBITED\n"; + print $outFH "002F; ; PROHIBITED\n"; + print $outFH "003B..0040; ; PROHIBITED\n"; + print $outFH "005B..0060; ; PROHIBITED\n"; + print $outFH "007B..007E; ; PROHIBITED\n"; + print $outFH "3002; ; PROHIBITED\n"; + print $outFH "\n# Total code points 30\n"; + close($outFH); +} +#----------------------------------------------------------------------- +sub usage { + print << "END"; +Usage: +filterRFC3454.pl +Options: + --sourcedir=<directory> + --destdir=<directory> + --src-filename=<name of RFC file> + --dest-filename=<name of destination file> + --A1 Generate data for table A.1 + --B1 Generate data for table B.1 + --B2 Generate data for table B.2 + --B3 Generate data for table B.3 + --C11 Generate data for table C.1.1 + --C12 Generate data for table C.1.2 + --C21 Generate data for table C.2.1 + --C22 Generate data for table C.2.2 + --C3 Generate data for table C.3 + --C4 Generate data for table C.4 + --C5 Generate data for table C.5 + --C6 Generate data for table C.6 + --C7 Generate data for table C.7 + --C8 Generate data for table C.8 + --C9 Generate data for table C.9 + --iscsi Generate data for extra prohibited iSCSI chars + +Note, --B2 and --B3 are mutually exclusive. + +e.g.: filterRFC3454.pl --sourcedir=. --destdir=./output --src-filename=rfc3454.txt --dest-filename=NamePrepProfile.txt --A1 --B1 --B2 --C12 --C22 --C3 --C4 --C5 --C6 --C7 --C8 --C9 + +filterRFC3454.pl filters the RFC file and creates String prep table files. +The RFC text can be downloaded from ftp://ftp.rfc-editor.org/in-notes/rfc3454.txt + +END + exit(0); +} + + diff --git a/icuSources/tools/genidna/genidna.8.in b/icuSources/tools/gensprep/gensprep.8.in similarity index 89% rename from icuSources/tools/genidna/genidna.8.in rename to icuSources/tools/gensprep/gensprep.8.in index d95eb79e..f50a3a4d 100644 --- a/icuSources/tools/genidna/genidna.8.in +++ b/icuSources/tools/gensprep/gensprep.8.in @@ -1,15 +1,15 @@ .\" Hey, Emacs! This is -*-nroff-*- you know... .\" -.\" genidna.8: manual page for the genidna utility +.\" gensprep.8: manual page for the gensprep utility .\" .\" Copyright (C) 2003 IBM, Inc. and others. .\" -.TH GENIDNA 8 "18 March 2003" "ICU MANPAGE" "ICU @VERSION@ Manual" +.TH gensprep 8 "18 March 2003" "ICU MANPAGE" "ICU @VERSION@ Manual" .SH NAME -.B genidna -\- compile IDNA data from files filtered by filterRFC3454.pl +.B gensprep +\- compile StringPrep data from files filtered by filterRFC3454.pl .SH SYNOPSIS -.B genidna +.B gensprep [ .BR "\-h\fP, \fB\-?\fP, \fB\-\-help" ] @@ -26,17 +26,17 @@ .BI "\-d\fP, \fB\-\-destdir" " destination" ] .SH DESCRIPTION -.B genidna +.B gensprep reads filtered RFC 3454 files and compiles their information into a binary form. The resulting file, -.BR uidna.icu , +.BR <name>.icu , can then be read directly by ICU, or used by .BR pkgdata (8) for incorporation into a larger archive or library. .LP The files read by -.B genidna +.B gensprep are described in the .B FILES section. @@ -73,7 +73,7 @@ important to make sure that it is present if is set. .SH FILES The following files are read by -.B genidna +.B gensprep and are looked for in the .I source /misc for rfc3454_*.txt files and in diff --git a/icuSources/tools/gensprep/gensprep.c b/icuSources/tools/gensprep/gensprep.c new file mode 100644 index 00000000..e8f9608f --- /dev/null +++ b/icuSources/tools/gensprep/gensprep.c @@ -0,0 +1,421 @@ +/* +******************************************************************************* +* +* Copyright (C) 2003-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: gensprep.c +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2003-02-06 +* created by: Ram Viswanadha +* +* This program reads the Profile.txt files, +* parses them, and extracts the data for StringPrep profile. +* It then preprocesses it and writes a binary file for efficient use +* in various StringPrep conversion processes. +*/ + +#define USPREP_TYPE_NAMES_ARRAY 1 + +#include <stdio.h> +#include <stdlib.h> + +#include "cmemory.h" +#include "cstring.h" +#include "unewdata.h" +#include "uoptions.h" +#include "uparse.h" +#include "sprpimpl.h" + +#include "unicode/udata.h" +#include "unicode/utypes.h" +#include "unicode/putil.h" + + +U_CDECL_BEGIN +#include "gensprep.h" +U_CDECL_END + +#ifdef WIN32 +# pragma warning(disable: 4100) +#endif + +UBool beVerbose=FALSE, haveCopyright=TRUE; + +#define NORM_CORRECTIONS_FILE_NAME "NormalizationCorrections.txt" + +/* prototypes --------------------------------------------------------------- */ + +static void +parseMappings(const char *filename, UBool reportError, UErrorCode *pErrorCode); + +static void +parseNormalizationCorrections(const char *filename, UErrorCode *pErrorCode); + + +/* -------------------------------------------------------------------------- */ + +static UOption options[]={ + UOPTION_HELP_H, + UOPTION_HELP_QUESTION_MARK, + UOPTION_VERBOSE, + UOPTION_COPYRIGHT, + UOPTION_DESTDIR, + UOPTION_SOURCEDIR, + UOPTION_ICUDATADIR, + UOPTION_PACKAGE_NAME, + UOPTION_BUNDLE_NAME, + { "normalization", NULL, NULL, NULL, 'n', UOPT_REQUIRES_ARG, 0 }, + { "check-bidi", NULL, NULL, NULL, 'k', UOPT_NO_ARG, 0}, + { "unicode", NULL, NULL, NULL, 'u', UOPT_REQUIRES_ARG, 0 }, +}; + +enum{ + HELP, + HELP_QUESTION_MARK, + VERBOSE, + COPYRIGHT, + DESTDIR, + SOURCEDIR, + ICUDATADIR, + PACKAGE_NAME, + BUNDLE_NAME, + NORMALIZE, + CHECK_BIDI, + UNICODE_VERSION +}; + +static int printHelp(int argc, char* argv[]){ + /* + * Broken into chucks because the C89 standard says the minimum + * required supported string length is 509 bytes. + */ + fprintf(stderr, + "Usage: %s [-options] [file_name]\n" + "\n" + "Read the files specified and\n" + "create a binary file [package-name]_[bundle-name]." DATA_TYPE " with the StringPrep profile data\n" + "\n", + argv[0]); + fprintf(stderr, + "Options:\n" + "\t-h or -? or --help print this usage text\n" + "\t-v or --verbose verbose output\n" + "\t-c or --copyright include a copyright notice\n"); + fprintf(stderr, + "\t-d or --destdir destination directory, followed by the path\n" + "\t-s or --sourcedir source directory of ICU data, followed by the path\n" + "\t-b or --bundle-name generate the ouput data file with the name specified\n" + "\t-i or --icudatadir directory for locating any needed intermediate data files,\n" + "\t followed by path, defaults to %s\n", + u_getDataDirectory()); + fprintf(stderr, + "\t-p or --package-name prepend the output data file name with the package name specified\n" + "\t-n or --normalize turn on the option for normalization and include mappings\n" + "\t from NormalizationCorrections.txt from the given path,\n" + "\t e.g: /test/icu/source/data/unidata\n" + "\t-k or --check-bidi turn on the option for checking for BiDi in the profile\n" + "\t-u or --unicode version of Unicode to be used with this profile followed by the version\n" + ); + return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR; +} + + +extern int +main(int argc, char* argv[]) { +#if !UCONFIG_NO_IDNA + char* filename = NULL; +#endif + const char *srcDir=NULL, *destDir=NULL, *icuUniDataDir=NULL; + const char *packageName=NULL, *bundleName=NULL, *inputFileName = NULL; + char *basename=NULL; + int32_t sprepOptions = 0; + + UErrorCode errorCode=U_ZERO_ERROR; + + U_MAIN_INIT_ARGS(argc, argv); + + /* preset then read command line options */ + options[DESTDIR].value=u_getDataDirectory(); + options[SOURCEDIR].value=""; + options[UNICODE_VERSION].value="0"; /* don't assume the unicode version */ + options[BUNDLE_NAME].value = DATA_NAME; + options[PACKAGE_NAME].value = NULL; + options[NORMALIZE].value = ""; + + argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), options); + + /* error handling, printing usage message */ + if(argc<0) { + fprintf(stderr, + "error in command line argument \"%s\"\n", + argv[-argc]); + } + if(argc<0 || options[HELP].doesOccur || options[HELP_QUESTION_MARK].doesOccur) { + return printHelp(argc, argv); + + } + + /* get the options values */ + beVerbose=options[VERBOSE].doesOccur; + haveCopyright=options[COPYRIGHT].doesOccur; + srcDir=options[SOURCEDIR].value; + destDir=options[DESTDIR].value; + packageName = options[PACKAGE_NAME].value; + bundleName = options[BUNDLE_NAME].value; + icuUniDataDir = options[NORMALIZE].value; + + if(argc<2) { + /* print the help message */ + return printHelp(argc, argv); + } else { + inputFileName = argv[1]; + } + if(!options[UNICODE_VERSION].doesOccur){ + return printHelp(argc, argv); + } + if(options[ICUDATADIR].doesOccur) { + u_setDataDirectory(options[ICUDATADIR].value); + } +#if UCONFIG_NO_IDNA + + fprintf(stderr, + "gensprep writes dummy " U_ICUDATA_NAME "_" DATA_NAME "." DATA_TYPE + " because UCONFIG_NO_IDNA is set, \n" + "see icu/source/common/unicode/uconfig.h\n"); + generateData(destDir, packageName, bundleName); + +#else + + setUnicodeVersion(options[UNICODE_VERSION].value); + filename = (char* ) uprv_malloc(uprv_strlen(srcDir) + 300); /* hopefully this should be enough */ + + /* prepare the filename beginning with the source dir */ + if(uprv_strchr(srcDir,U_FILE_SEP_CHAR) == NULL && uprv_strchr(srcDir,U_FILE_ALT_SEP_CHAR) == NULL){ + filename[0] = '.'; + filename[1] = U_FILE_SEP_CHAR; + uprv_strcpy(filename+2,srcDir); + }else{ + uprv_strcpy(filename, srcDir); + } + + basename=filename+uprv_strlen(filename); + if(basename>filename && *(basename-1)!=U_FILE_SEP_CHAR) { + *basename++=U_FILE_SEP_CHAR; + } + + /* initialize */ + init(); + + /* process the file */ + uprv_strcpy(basename,inputFileName); + parseMappings(filename,FALSE, &errorCode); + if(U_FAILURE(errorCode)) { + fprintf(stderr, "Could not open file %s for reading. Error: %s \n", filename, u_errorName(errorCode)); + return errorCode; + } + + if(options[NORMALIZE].doesOccur){ + /* set up directory for NormalizationCorrections.txt */ + uprv_strcpy(filename,icuUniDataDir); + basename=filename+uprv_strlen(filename); + if(basename>filename && *(basename-1)!=U_FILE_SEP_CHAR) { + *basename++=U_FILE_SEP_CHAR; + } + + *basename++=U_FILE_SEP_CHAR; + uprv_strcpy(basename,NORM_CORRECTIONS_FILE_NAME); + + parseNormalizationCorrections(filename,&errorCode); + if(U_FAILURE(errorCode)){ + fprintf(stderr,"Could not open file %s for reading \n", filename); + return errorCode; + } + sprepOptions |= _SPREP_NORMALIZATION_ON; + } + + if(options[CHECK_BIDI].doesOccur){ + sprepOptions |= _SPREP_CHECK_BIDI_ON; + } + + setOptions(sprepOptions); + + /* process parsed data */ + if(U_SUCCESS(errorCode)) { + /* write the data file */ + generateData(destDir, packageName, bundleName); + + cleanUpData(); + } + + uprv_free(filename); + +#endif + + return errorCode; +} + +#if !UCONFIG_NO_IDNA + +static void U_CALLCONV +normalizationCorrectionsLineFn(void *context, + char *fields[][2], int32_t fieldCount, + UErrorCode *pErrorCode) { + uint32_t mapping[40]; + char *end, *s; + uint32_t code; + int32_t length; + UVersionInfo version; + UVersionInfo thisVersion; + + /* get the character code, field 0 */ + code=(uint32_t)uprv_strtoul(fields[0][0], &end, 16); + if(U_FAILURE(*pErrorCode)) { + fprintf(stderr, "gensprep: error parsing NormalizationCorrections.txt mapping at %s\n", fields[0][0]); + exit(*pErrorCode); + } + /* Original (erroneous) decomposition */ + s = fields[1][0]; + + /* parse the mapping string */ + length=u_parseCodePoints(s, mapping, sizeof(mapping)/4, pErrorCode); + + /* ignore corrected decomposition */ + + u_versionFromString(version,fields[3][0] ); + u_versionFromString(thisVersion, "3.2.0"); + + + + if(U_FAILURE(*pErrorCode)) { + fprintf(stderr, "gensprep error parsing NormalizationCorrections.txt of U+%04lx - %s\n", + (long)code, u_errorName(*pErrorCode)); + exit(*pErrorCode); + } + + /* store the mapping */ + if( version[0] > thisVersion[0] || + ((version[0]==thisVersion[0]) && (version[1] > thisVersion[1])) + ){ + storeMapping(code,mapping, length, USPREP_MAP, pErrorCode); + } + setUnicodeVersionNC(version); +} + +static void +parseNormalizationCorrections(const char *filename, UErrorCode *pErrorCode) { + char *fields[4][2]; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return; + } + + u_parseDelimitedFile(filename, ';', fields, 4, normalizationCorrectionsLineFn, NULL, pErrorCode); + + /* fprintf(stdout,"Number of code points that have NormalizationCorrections mapping with length >1 : %i\n",len); */ + + if(U_FAILURE(*pErrorCode) && ( *pErrorCode!=U_FILE_ACCESS_ERROR)) { + fprintf(stderr, "gensprep error: u_parseDelimitedFile(\"%s\") failed - %s\n", filename, u_errorName(*pErrorCode)); + exit(*pErrorCode); + } +} + +static void U_CALLCONV +strprepProfileLineFn(void *context, + char *fields[][2], int32_t fieldCount, + UErrorCode *pErrorCode) { + uint32_t mapping[40]; + char *end, *map; + uint32_t code; + int32_t length; + /*UBool* mapWithNorm = (UBool*) context;*/ + const char* typeName; + uint32_t rangeStart=0,rangeEnd =0; + const char* filename = (const char*) context; + + typeName = fields[2][0]; + map = fields[1][0]; + + if(uprv_strstr(typeName, usprepTypeNames[USPREP_UNASSIGNED])!=NULL){ + + u_parseCodePointRange(fields[0][0], &rangeStart,&rangeEnd, pErrorCode); + if(U_FAILURE(*pErrorCode)){ + fprintf(stderr, "Could not parse code point range. Error: %s\n",u_errorName(*pErrorCode)); + return; + } + + /* store the range */ + storeRange(rangeStart,rangeEnd,USPREP_UNASSIGNED, pErrorCode); + + }else if(uprv_strstr(typeName, usprepTypeNames[USPREP_PROHIBITED])!=NULL){ + + u_parseCodePointRange(fields[0][0], &rangeStart,&rangeEnd, pErrorCode); + if(U_FAILURE(*pErrorCode)){ + fprintf(stderr, "Could not parse code point range. Error: %s\n",u_errorName(*pErrorCode)); + return; + } + + /* store the range */ + storeRange(rangeStart,rangeEnd,USPREP_PROHIBITED, pErrorCode); + + }else if(uprv_strstr(typeName, usprepTypeNames[USPREP_MAP])!=NULL){ + + /* get the character code, field 0 */ + code=(uint32_t)uprv_strtoul(fields[0][0], &end, 16); + if(end<=fields[0][0] || end!=fields[0][1]) { + fprintf(stderr, "gensprep: syntax error in field 0 at %s\n", fields[0][0]); + *pErrorCode=U_PARSE_ERROR; + exit(U_PARSE_ERROR); + } + + /* parse the mapping string */ + length=u_parseCodePoints(map, mapping, sizeof(mapping)/4, pErrorCode); + + /* store the mapping */ + storeMapping(code,mapping, length,USPREP_MAP, pErrorCode); + + }else{ + *pErrorCode = U_INVALID_FORMAT_ERROR; + } + + if(U_FAILURE(*pErrorCode)) { + fprintf(stderr, "gensprep error parsing %s line %s at %s. Error: %s\n",filename, + fields[0][0],fields[2][0],u_errorName(*pErrorCode)); + exit(*pErrorCode); + } + +} + +static void +parseMappings(const char *filename, UBool reportError, UErrorCode *pErrorCode) { + char *fields[3][2]; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return; + } + + u_parseDelimitedFile(filename, ';', fields, 3, strprepProfileLineFn, (void*)filename, pErrorCode); + + /*fprintf(stdout,"Number of code points that have mappings with length >1 : %i\n",len);*/ + + if(U_FAILURE(*pErrorCode) && (reportError || *pErrorCode!=U_FILE_ACCESS_ERROR)) { + fprintf(stderr, "gensprep error: u_parseDelimitedFile(\"%s\") failed - %s\n", filename, u_errorName(*pErrorCode)); + exit(*pErrorCode); + } +} + + +#endif /* #if !UCONFIG_NO_IDNA */ + +/* + * Hey, Emacs, please set the following: + * + * Local Variables: + * indent-tabs-mode: nil + * End: + * + */ diff --git a/icuSources/tools/genidna/genidna.dsp b/icuSources/tools/gensprep/gensprep.dsp similarity index 82% rename from icuSources/tools/genidna/genidna.dsp rename to icuSources/tools/gensprep/gensprep.dsp index 9ef53538..d1bb22b4 100644 --- a/icuSources/tools/genidna/genidna.dsp +++ b/icuSources/tools/gensprep/gensprep.dsp @@ -1,26 +1,26 @@ -# Microsoft Developer Studio Project File - Name="genidna" - Package Owner=<4> +# Microsoft Developer Studio Project File - Name="gensprep" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 -CFG=genidna - Win32 Debug +CFG=gensprep - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE -!MESSAGE NMAKE /f "genidna.mak". +!MESSAGE NMAKE /f "gensprep.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE -!MESSAGE NMAKE /f "genidna.mak" CFG="genidna - Win32 Debug" +!MESSAGE NMAKE /f "gensprep.mak" CFG="gensprep - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE -!MESSAGE "genidna - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "genidna - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE "genidna - Win64 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "genidna - Win64 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "gensprep - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "gensprep - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "gensprep - Win64 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "gensprep - Win64 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project @@ -30,7 +30,7 @@ CFG=genidna - Win32 Debug CPP=cl.exe RSC=rc.exe -!IF "$(CFG)" == "genidna - Win32 Release" +!IF "$(CFG)" == "gensprep - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 @@ -55,9 +55,9 @@ LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 icuuc.lib icutu.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\..\lib" # Begin Custom Build -TargetPath=.\Release\genidna.exe -InputPath=.\Release\genidna.exe -InputName=genidna +TargetPath=.\Release\gensprep.exe +InputPath=.\Release\gensprep.exe +InputName=gensprep SOURCE="$(InputPath)" "..\..\..\bin\$(InputName).exe" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" @@ -65,7 +65,7 @@ SOURCE="$(InputPath)" # End Custom Build -!ELSEIF "$(CFG)" == "genidna - Win32 Debug" +!ELSEIF "$(CFG)" == "gensprep - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 @@ -90,9 +90,9 @@ LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 icutud.lib icuucd.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\lib" # Begin Custom Build -TargetPath=.\Debug\genidna.exe -InputPath=.\Debug\genidna.exe -InputName=genidna +TargetPath=.\Debug\gensprep.exe +InputPath=.\Debug\gensprep.exe +InputName=gensprep SOURCE="$(InputPath)" "..\..\..\bin\$(InputName).exe" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" @@ -100,7 +100,7 @@ SOURCE="$(InputPath)" # End Custom Build -!ELSEIF "$(CFG)" == "genidna - Win64 Release" +!ELSEIF "$(CFG)" == "gensprep - Win64 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 @@ -115,7 +115,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /W3 /GX /Zi /O2 /Op /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Zm600 /c +# ADD CPP /nologo /W3 /GX /Zi /O2 /Op /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Zm600 /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -125,9 +125,9 @@ LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:IX86 /machine:IA64 # ADD LINK32 icuuc.lib icutu.lib /nologo /subsystem:console /machine:IX86 /libpath:"..\..\..\lib" /machine:IA64 # Begin Custom Build -TargetPath=.\Release\genidna.exe -InputPath=.\Release\genidna.exe -InputName=genidna +TargetPath=.\Release\gensprep.exe +InputPath=.\Release\gensprep.exe +InputName=gensprep SOURCE="$(InputPath)" "..\..\..\bin\$(InputName).exe" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" @@ -135,7 +135,7 @@ SOURCE="$(InputPath)" # End Custom Build -!ELSEIF "$(CFG)" == "genidna - Win64 Debug" +!ELSEIF "$(CFG)" == "gensprep - Win64 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 @@ -150,7 +150,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /Op /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /GZ /QIA64_fmaopt /Zm600 /c +# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /Op /I "..\..\common" /I "..\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /GZ /Zm600 /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe @@ -160,9 +160,9 @@ LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:IX86 /pdbtype:sept /machine:IA64 # ADD LINK32 icutud.lib icuucd.lib /nologo /subsystem:console /incremental:no /debug /machine:IX86 /pdbtype:sept /libpath:"..\..\..\lib" /machine:IA64 # Begin Custom Build -TargetPath=.\Debug\genidna.exe -InputPath=.\Debug\genidna.exe -InputName=genidna +TargetPath=.\Debug\gensprep.exe +InputPath=.\Debug\gensprep.exe +InputName=gensprep SOURCE="$(InputPath)" "..\..\..\bin\$(InputName).exe" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" @@ -174,16 +174,16 @@ SOURCE="$(InputPath)" # Begin Target -# Name "genidna - Win32 Release" -# Name "genidna - Win32 Debug" -# Name "genidna - Win64 Release" -# Name "genidna - Win64 Debug" +# Name "gensprep - Win32 Release" +# Name "gensprep - Win32 Debug" +# Name "gensprep - Win64 Release" +# Name "gensprep - Win64 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File -SOURCE=.\genidna.c +SOURCE=.\gensprep.c # End Source File # Begin Source File @@ -195,7 +195,7 @@ SOURCE=.\store.c # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File -SOURCE=.\genidna.h +SOURCE=.\gensprep.h # End Source File # End Group # Begin Group "Resource Files" diff --git a/icuSources/tools/genidna/genidna.h b/icuSources/tools/gensprep/gensprep.h similarity index 69% rename from icuSources/tools/genidna/genidna.h rename to icuSources/tools/gensprep/gensprep.h index 14ea595a..9b76e8e8 100644 --- a/icuSources/tools/genidna/genidna.h +++ b/icuSources/tools/gensprep/gensprep.h @@ -1,11 +1,11 @@ /* ******************************************************************************* * -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* -* file name: genidn.h +* file name: gensprep.h * encoding: US-ASCII * tab size: 8 (not used) * indentation:4 @@ -18,12 +18,11 @@ #define __GENIDN_H__ #include "unicode/utypes.h" -#include "unicode/uset.h" #include "sprpimpl.h" /* file definitions */ -#define DATA_NAME "uidna" -#define DATA_TYPE "icu" +#define DATA_NAME "sprep" +#define DATA_TYPE "spp" /* * data structure that holds the IDN properties for one or more @@ -39,16 +38,24 @@ extern UBool beVerbose, haveCopyright; extern void setUnicodeVersion(const char *v); +extern void +setUnicodeVersionNC(UVersionInfo version); + extern void init(void); +#if !UCONFIG_NO_IDNA extern void -storeMapping(uint32_t codepoint, uint32_t* mapping,int32_t length, UBool withNorm, UErrorCode* status); +storeMapping(uint32_t codepoint, uint32_t* mapping,int32_t length, UStringPrepType type, UErrorCode* status); extern void -storeRange(uint32_t start, uint32_t end, UBool isUnassigned,UErrorCode* status); +storeRange(uint32_t start, uint32_t end, UStringPrepType type,UErrorCode* status); +#endif extern void -generateData(const char *dataDir); +generateData(const char *dataDir, const char* packageName, const char* bundleName); + +extern void +setOptions(int32_t options); extern void cleanUpData(void); @@ -72,5 +79,3 @@ processData(void); * End: * */ - - diff --git a/icuSources/tools/genidna/genidna.vcproj b/icuSources/tools/gensprep/gensprep.vcproj similarity index 72% rename from icuSources/tools/genidna/genidna.vcproj rename to icuSources/tools/gensprep/gensprep.vcproj index a3b3e04a..d984e261 100644 --- a/icuSources/tools/genidna/genidna.vcproj +++ b/icuSources/tools/gensprep/gensprep.vcproj @@ -1,8 +1,8 @@ -<?xml version="1.0" encoding = "Windows-1252"?> +<?xml version="1.0" encoding="Windows-1252"?> <VisualStudioProject ProjectType="Visual C++" - Version="7.00" - Name="genidna" + Version="7.10" + Name="gensprep" SccProjectName="" SccLocalPath=""> <Platforms> @@ -27,7 +27,8 @@ StringPooling="TRUE" RuntimeLibrary="4" EnableFunctionLevelLinking="TRUE" - PrecompiledHeaderFile=".\Release/genidna.pch" + DisableLanguageExtensions="TRUE" + PrecompiledHeaderFile=".\Release/gensprep.pch" AssemblerListingLocation=".\Release/" ObjectFile=".\Release/" ProgramDataBaseFileName=".\Release/" @@ -36,22 +37,19 @@ CompileAs="0"/> <Tool Name="VCCustomBuildTool" - CommandLine="copy $(TargetPath) ..\..\..\bin + CommandLine="copy "$(TargetPath)" ..\..\..\bin " - Outputs="..\..\..\bin\$(InputName).exe"/> + Outputs="..\..\..\bin\$(TargetFileName)"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icuuc.lib icutu.lib" - OutputFile=".\Release/genidna.exe" + OutputFile=".\Release/gensprep.exe" LinkIncremental="1" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\..\..\lib" - ProgramDatabaseFile=".\Release/genidna.pdb" + ProgramDatabaseFile=".\Release/gensprep.pdb" SubSystem="1"/> <Tool Name="VCMIDLTool" - TypeLibraryName=".\Release/genidna.tlb"/> + TypeLibraryName=".\Release/gensprep.tlb"/> <Tool Name="VCPostBuildEventTool"/> <Tool @@ -64,8 +62,14 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> <Configuration Name="Debug|Win32" @@ -82,7 +86,8 @@ PreprocessorDefinitions="WIN32,_DEBUG,_CONSOLE" BasicRuntimeChecks="3" RuntimeLibrary="5" - PrecompiledHeaderFile=".\Debug/genidna.pch" + DisableLanguageExtensions="TRUE" + PrecompiledHeaderFile=".\Debug/gensprep.pch" AssemblerListingLocation=".\Debug/" ObjectFile=".\Debug/" ProgramDataBaseFileName=".\Debug/" @@ -92,23 +97,20 @@ CompileAs="0"/> <Tool Name="VCCustomBuildTool" - CommandLine="copy $(TargetPath) ..\..\..\bin + CommandLine="copy "$(TargetPath)" ..\..\..\bin " - Outputs="..\..\..\bin\$(InputName).exe"/> + Outputs="..\..\..\bin\$(TargetFileName)"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icutud.lib icuucd.lib" - OutputFile=".\Debug/genidna.exe" + OutputFile=".\Debug/gensprep.exe" LinkIncremental="2" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\..\..\lib" GenerateDebugInformation="TRUE" - ProgramDatabaseFile=".\Debug/genidna.pdb" + ProgramDatabaseFile=".\Debug/gensprep.pdb" SubSystem="1"/> <Tool Name="VCMIDLTool" - TypeLibraryName=".\Debug/genidna.tlb"/> + TypeLibraryName=".\Debug/gensprep.tlb"/> <Tool Name="VCPostBuildEventTool"/> <Tool @@ -121,16 +123,24 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> </Configurations> + <References> + </References> <Files> <Filter Name="Source Files" Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"> <File - RelativePath=".\genidna.c"> + RelativePath=".\gensprep.c"> </File> <File RelativePath=".\store.c"> @@ -140,7 +150,7 @@ Name="Header Files" Filter="h;hpp;hxx;hm;inl"> <File - RelativePath=".\genidna.h"> + RelativePath=".\gensprep.h"> </File> </Filter> <Filter diff --git a/icuSources/tools/gensprep/store.c b/icuSources/tools/gensprep/store.c new file mode 100644 index 00000000..6a70d615 --- /dev/null +++ b/icuSources/tools/gensprep/store.c @@ -0,0 +1,681 @@ +/* +******************************************************************************* +* +* Copyright (C) 1999-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: store.c +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2003-02-06 +* created by: Ram Viswanadha +* +*/ + +#include <stdio.h> +#include <stdlib.h> +#include "unicode/utypes.h" +#include "cmemory.h" +#include "cstring.h" +#include "filestrm.h" +#include "unicode/udata.h" +#include "utrie.h" +#include "unewdata.h" +#include "gensprep.h" +#include "uhash.h" + + +#ifdef WIN32 +# pragma warning(disable: 4100) +#endif + +#define DO_DEBUG_OUT 0 + + +/* + * StringPrep profile file format ------------------------------------ + * + * The file format prepared and written here contains a 16-bit trie and a mapping table. + * + * Before the data contents described below, there are the headers required by + * the udata API for loading ICU data. Especially, a UDataInfo structure + * precedes the actual data. It contains platform properties values and the + * file format version. + * + * The following is a description of format version 2. + * + * Data contents: + * + * The contents is a parsed, binary form of RFC3454 and possibly + * NormalizationCorrections.txt depending on the options specified on the profile. + * + * Any Unicode code point from 0 to 0x10ffff can be looked up to get + * the trie-word, if any, for that code point. This means that the input + * to the lookup are 21-bit unsigned integers, with not all of the + * 21-bit range used. + * + * *.spp files customarily begin with a UDataInfo structure, see udata.h and .c. + * After that there are the following structures: + * + * int32_t indexes[_SPREP_INDEX_TOP]; -- _SPREP_INDEX_TOP=16, see enum in sprpimpl.h file + * + * UTrie stringPrepTrie; -- size in bytes=indexes[_SPREP_INDEX_TRIE_SIZE] + * + * uint16_t mappingTable[]; -- Contains the sequecence of code units that the code point maps to + * size in bytes = indexes[_SPREP_INDEX_MAPPING_DATA_SIZE] + * + * The indexes array contains the following values: + * indexes[_SPREP_INDEX_TRIE_SIZE] -- The size of the StringPrep trie in bytes + * indexes[_SPREP_INDEX_MAPPING_DATA_SIZE] -- The size of the mappingTable in bytes + * indexes[_SPREP_NORM_CORRECTNS_LAST_UNI_VERSION] -- The index of Unicode version of last entry in NormalizationCorrections.txt + * indexes[_SPREP_ONE_UCHAR_MAPPING_INDEX_START] -- The starting index of 1 UChar mapping index in the mapping table + * indexes[_SPREP_TWO_UCHARS_MAPPING_INDEX_START] -- The starting index of 2 UChars mapping index in the mapping table + * indexes[_SPREP_THREE_UCHARS_MAPPING_INDEX_START] -- The starting index of 3 UChars mapping index in the mapping table + * indexes[_SPREP_FOUR_UCHARS_MAPPING_INDEX_START] -- The starting index of 4 UChars mapping index in the mapping table + * indexes[_SPREP_OPTIONS] -- Bit set of options to turn on in the profile, e.g: USPREP_NORMALIZATION_ON, USPREP_CHECK_BIDI_ON + * + * + * StringPrep Trie : + * + * The StringPrep tries is a 16-bit trie that contains data for the profile. + * Each code point is associated with a value (trie-word) in the trie. + * + * - structure of data words from the trie + * + * i) A value greater than or equal to _SPREP_TYPE_THRESHOLD (0xFFF0) + * represents the type associated with the code point + * if(trieWord >= _SPREP_TYPE_THRESHOLD){ + * type = trieWord - 0xFFF0; + * } + * The type can be : + * USPREP_UNASSIGNED + * USPREP_PROHIBITED + * USPREP_DELETE + * + * ii) A value less than _SPREP_TYPE_THRESHOLD means the type is USPREP_MAP and + * contains distribution described below + * + * 0 - ON : The code point is prohibited (USPREP_PROHIBITED). This is to allow for codepoint that are both prohibited and mapped. + * 1 - ON : The value in the next 14 bits is an index into the mapping table + * OFF: The value in the next 14 bits is an delta value from the code point + * 2..15 - Contains data as described by bit 1. If all bits are set + * (value = _SPREP_MAX_INDEX_VALUE) then the type is USPREP_DELETE + * + * + * Mapping Table: + * The data in mapping table is sorted according to the length of the mapping sequence. + * If the type of the code point is USPREP_MAP and value in trie word is an index, the index + * is compared with start indexes of sequence length start to figure out the length according to + * the following algorithm: + * + * if( index >= indexes[_SPREP_ONE_UCHAR_MAPPING_INDEX_START] && + * index < indexes[_SPREP_TWO_UCHARS_MAPPING_INDEX_START]){ + * length = 1; + * }else if(index >= indexes[_SPREP_TWO_UCHARS_MAPPING_INDEX_START] && + * index < indexes[_SPREP_THREE_UCHARS_MAPPING_INDEX_START]){ + * length = 2; + * }else if(index >= indexes[_SPREP_THREE_UCHARS_MAPPING_INDEX_START] && + * index < indexes[_SPREP_FOUR_UCHARS_MAPPING_INDEX_START]){ + * length = 3; + * }else{ + * // The first position in the mapping table contains the length + * // of the sequence + * length = mappingTable[index++]; + * + * } + * + */ + +/* file data ---------------------------------------------------------------- */ +/* indexes[] value names */ + +#if UCONFIG_NO_IDNA + +/* dummy UDataInfo cf. udata.h */ +static UDataInfo dataInfo = { + sizeof(UDataInfo), + 0, + + U_IS_BIG_ENDIAN, + U_CHARSET_FAMILY, + U_SIZEOF_UCHAR, + 0, + + { 0, 0, 0, 0 }, /* dummy dataFormat */ + { 0, 0, 0, 0 }, /* dummy formatVersion */ + { 0, 0, 0, 0 } /* dummy dataVersion */ +}; + +#else + +static int32_t indexes[_SPREP_INDEX_TOP]={ 0 }; + +static uint16_t* mappingData= NULL; +static int32_t mappingDataCapacity = 0; /* we skip the first index in mapping data */ +static int16_t currentIndex = 0; /* the current index into the data trie */ +static int32_t maxLength = 0; /* maximum length of mapping string */ + + +/* UDataInfo cf. udata.h */ +static UDataInfo dataInfo={ + sizeof(UDataInfo), + 0, + + U_IS_BIG_ENDIAN, + U_CHARSET_FAMILY, + U_SIZEOF_UCHAR, + 0, + + { 0x53, 0x50, 0x52, 0x50 }, /* dataFormat="SPRP" */ + { 3, 2, UTRIE_SHIFT, UTRIE_INDEX_SHIFT }, /* formatVersion */ + { 3, 2, 0, 0 } /* dataVersion (Unicode version) */ +}; +void +setUnicodeVersion(const char *v) { + UVersionInfo version; + u_versionFromString(version, v); + uprv_memcpy(dataInfo.dataVersion, version, 4); +} + +void +setUnicodeVersionNC(UVersionInfo version){ + uint32_t univer = version[0] << 24; + univer += version[1] << 16; + univer += version[2] << 8; + univer += version[3]; + indexes[_SPREP_NORM_CORRECTNS_LAST_UNI_VERSION] = univer; +} +static UNewTrie *sprepTrie; + +#define MAX_DATA_LENGTH 11500 + + +#define SPREP_DELTA_RANGE_POSITIVE_LIMIT 8191 +#define SPREP_DELTA_RANGE_NEGATIVE_LIMIT -8192 + + +extern void +init() { + + sprepTrie = (UNewTrie *)uprv_malloc(sizeof(UNewTrie)); + uprv_memset(sprepTrie, 0, sizeof(UNewTrie)); + + /* initialize the two tries */ + if(NULL==utrie_open(sprepTrie, NULL, MAX_DATA_LENGTH, 0, 0, FALSE)) { + fprintf(stderr, "error: failed to initialize tries\n"); + exit(U_MEMORY_ALLOCATION_ERROR); + } +} + +static UHashtable* hashTable = NULL; + + +typedef struct ValueStruct { + UChar* mapping; + int16_t length; + UStringPrepType type; +} ValueStruct; + +/* Callback for deleting the value from the hashtable */ +static void U_CALLCONV valueDeleter(void* obj){ + ValueStruct* value = (ValueStruct*) obj; + uprv_free(value->mapping); + uprv_free(value); +} + +/* Callback for hashing the entry */ +static int32_t U_CALLCONV hashEntry(const UHashTok parm) { + return parm.integer; +} + +/* Callback for comparing two entries */ +static UBool U_CALLCONV compareEntries(const UHashTok p1, const UHashTok p2) { + return (UBool)(p1.integer != p2.integer); +} + + +static void +storeMappingData(){ + + int32_t pos = -1; + const UHashElement* element = NULL; + ValueStruct* value = NULL; + int32_t codepoint = 0; + int32_t elementCount = uhash_count(hashTable); + int32_t writtenElementCount = 0; + int32_t mappingLength = 1; /* minimum mapping length */ + int32_t oldMappingLength = 0; + uint16_t trieWord =0; + int32_t limitIndex = 0; + + /*initialize the mapping data */ + mappingData = (uint16_t*) uprv_malloc(U_SIZEOF_UCHAR * (mappingDataCapacity)); + + uprv_memset(mappingData,0,U_SIZEOF_UCHAR * mappingDataCapacity); + + while(writtenElementCount < elementCount){ + + while( (element = uhash_nextElement(hashTable, &pos))!=NULL){ + + codepoint = element->key.integer; + value = (ValueStruct*)element->value.pointer; + + /* store the start of indexes */ + if(oldMappingLength != mappingLength){ + /* Assume that index[] is used according to the enums defined */ + if(oldMappingLength <=_SPREP_MAX_INDEX_TOP_LENGTH){ + indexes[_SPREP_NORM_CORRECTNS_LAST_UNI_VERSION+mappingLength] = currentIndex; + } + if(oldMappingLength <= _SPREP_MAX_INDEX_TOP_LENGTH && + mappingLength == _SPREP_MAX_INDEX_TOP_LENGTH +1){ + + limitIndex = currentIndex; + + } + oldMappingLength = mappingLength; + } + + if(value->length == mappingLength){ + uint32_t savedTrieWord = 0; + trieWord = currentIndex << 2; + /* turn on the 2nd bit to signal that the following bits contain an index */ + trieWord += 0x02; + + if(trieWord > _SPREP_TYPE_THRESHOLD){ + fprintf(stderr,"trieWord cannot contain value greater than 0x%04X.\n",_SPREP_TYPE_THRESHOLD); + exit(U_ILLEGAL_CHAR_FOUND); + } + /* figure out if the code point has type already stored */ + savedTrieWord= utrie_get32(sprepTrie,codepoint,NULL); + if(savedTrieWord!=0){ + if((savedTrieWord- _SPREP_TYPE_THRESHOLD) == USPREP_PROHIBITED){ + /* turn on the first bit in trie word */ + trieWord += 0x01; + }else{ + /* + * the codepoint has value something other than prohibited + * and a mapping .. error! + */ + fprintf(stderr,"Type for codepoint \\U%08X already set!.\n", (int)codepoint); + exit(U_ILLEGAL_ARGUMENT_ERROR); + } + } + + /* now set the value in the trie */ + if(!utrie_set32(sprepTrie,codepoint,trieWord)){ + fprintf(stderr,"Could not set the value for code point.\n"); + exit(U_ILLEGAL_ARGUMENT_ERROR); + } + + /* written the trie word for the codepoint... increment the count*/ + writtenElementCount++; + + /* sanity check are we exceeding the max number allowed */ + if(currentIndex+value->length+1 > _SPREP_MAX_INDEX_VALUE){ + fprintf(stderr, "Too many entries in the mapping table %i. Maximum allowed is %i\n", currentIndex+value->length, _SPREP_MAX_INDEX_VALUE); + exit(U_INDEX_OUTOFBOUNDS_ERROR); + } + + /* copy the mapping data */ + if(currentIndex+value->length+1 <= mappingDataCapacity){ + /* write the length */ + if(mappingLength > _SPREP_MAX_INDEX_TOP_LENGTH ){ + /* the cast here is safe since we donot expect the length to be > 65535 */ + mappingData[currentIndex++] = (uint16_t) mappingLength; + } + /* copy the contents to mappindData array */ + uprv_memmove(mappingData+currentIndex, value->mapping, value->length*U_SIZEOF_UCHAR); + currentIndex += value->length; + + }else{ + /* realloc */ + UChar* newMappingData = (uint16_t*) uprv_malloc(U_SIZEOF_UCHAR * mappingDataCapacity*2); + if(newMappingData == NULL){ + fprintf(stderr, "Could not realloc the mapping data!\n"); + exit(U_MEMORY_ALLOCATION_ERROR); + } + uprv_memmove(newMappingData, mappingData, U_SIZEOF_UCHAR * mappingDataCapacity); + mappingDataCapacity *= 2; + uprv_free(mappingData); + mappingData = newMappingData; + /* write the length */ + if(mappingLength > _SPREP_MAX_INDEX_TOP_LENGTH ){ + /* the cast here is safe since we donot expect the length to be > 65535 */ + mappingData[currentIndex++] = (uint16_t) mappingLength; + } + /* continue copying */ + uprv_memmove(mappingData+currentIndex, value->mapping, value->length*U_SIZEOF_UCHAR); + currentIndex += value->length; + } + + } + } + mappingLength++; + pos = -1; + } + /* set the last length for range check */ + if(mappingLength <= _SPREP_MAX_INDEX_TOP_LENGTH){ + indexes[_SPREP_NORM_CORRECTNS_LAST_UNI_VERSION+mappingLength] = currentIndex+1; + }else{ + indexes[_SPREP_FOUR_UCHARS_MAPPING_INDEX_START] = limitIndex; + } + +} + +extern void setOptions(int32_t options){ + indexes[_SPREP_OPTIONS] = options; +} +extern void +storeMapping(uint32_t codepoint, uint32_t* mapping,int32_t length, + UStringPrepType type, UErrorCode* status){ + + + UChar* map = NULL; + int16_t adjustedLen=0, i; + uint16_t trieWord = 0; + ValueStruct *value = NULL; + uint32_t savedTrieWord = 0; + + /* initialize the hashtable */ + if(hashTable==NULL){ + hashTable = uhash_open(hashEntry, compareEntries, status); + uhash_setValueDeleter(hashTable, valueDeleter); + } + + /* figure out if the code point has type already stored */ + savedTrieWord= utrie_get32(sprepTrie,codepoint,NULL); + if(savedTrieWord!=0){ + if((savedTrieWord- _SPREP_TYPE_THRESHOLD) == USPREP_PROHIBITED){ + /* turn on the first bit in trie word */ + trieWord += 0x01; + }else{ + /* + * the codepoint has value something other than prohibited + * and a mapping .. error! + */ + fprintf(stderr,"Type for codepoint \\U%08X already set!.\n", (int)codepoint); + exit(U_ILLEGAL_ARGUMENT_ERROR); + } + } + + /* figure out the real length */ + for(i=0; i<length; i++){ + if(mapping[i] > 0xFFFF){ + adjustedLen +=2; + }else{ + adjustedLen++; + } + } + + if(adjustedLen == 0){ + trieWord = (uint16_t)(_SPREP_MAX_INDEX_VALUE << 2); + /* make sure that the value of trieWord is less than the threshold */ + if(trieWord < _SPREP_TYPE_THRESHOLD){ + /* now set the value in the trie */ + if(!utrie_set32(sprepTrie,codepoint,trieWord)){ + fprintf(stderr,"Could not set the value for code point.\n"); + exit(U_ILLEGAL_ARGUMENT_ERROR); + } + /* value is set so just return */ + return; + }else{ + fprintf(stderr,"trieWord cannot contain value greater than threshold 0x%04X.\n",_SPREP_TYPE_THRESHOLD); + exit(U_ILLEGAL_CHAR_FOUND); + } + } + + if(adjustedLen == 1){ + /* calculate the delta */ + int16_t delta = (int16_t)((int32_t)codepoint - (int16_t) mapping[0]); + if(delta >= SPREP_DELTA_RANGE_NEGATIVE_LIMIT && delta <= SPREP_DELTA_RANGE_POSITIVE_LIMIT){ + + trieWord = delta << 2; + + + /* make sure that the second bit is OFF */ + if((trieWord & 0x02) != 0 ){ + fprintf(stderr,"The second bit in the trie word is not zero while storing a delta.\n"); + exit(U_INTERNAL_PROGRAM_ERROR); + } + /* make sure that the value of trieWord is less than the threshold */ + if(trieWord < _SPREP_TYPE_THRESHOLD){ + /* now set the value in the trie */ + if(!utrie_set32(sprepTrie,codepoint,trieWord)){ + fprintf(stderr,"Could not set the value for code point.\n"); + exit(U_ILLEGAL_ARGUMENT_ERROR); + } + /* value is set so just return */ + return; + } + } + /* + * if the delta is not in the given range or if the trieWord is larger than the threshold + * just fall through for storing the mapping in the mapping table + */ + } + + map = (UChar*) uprv_malloc(U_SIZEOF_UCHAR * (adjustedLen+1)); + uprv_memset(map,0,U_SIZEOF_UCHAR * (adjustedLen+1)); + + i=0; + + while(i<length){ + if(mapping[i] <= 0xFFFF){ + map[i] = (uint16_t)mapping[i]; + }else{ + map[i] = UTF16_LEAD(mapping[i]); + map[i+1] = UTF16_TRAIL(mapping[i]); + } + i++; + } + + value = (ValueStruct*) uprv_malloc(sizeof(ValueStruct)); + value->mapping = map; + value->type = type; + value->length = adjustedLen; + if(value->length > _SPREP_MAX_INDEX_TOP_LENGTH){ + mappingDataCapacity++; + } + if(maxLength < value->length){ + maxLength = value->length; + } + uhash_iput(hashTable,codepoint,value,status); + mappingDataCapacity += adjustedLen; + + if(U_FAILURE(*status)){ + fprintf(stderr, "Failed to put entries into the hastable. Error: %s\n", u_errorName(*status)); + exit(*status); + } +} + + +extern void +storeRange(uint32_t start, uint32_t end, UStringPrepType type,UErrorCode* status){ + uint16_t trieWord = 0; + + trieWord += (_SPREP_TYPE_THRESHOLD + type); /* the top 4 bits contain the value */ + if(trieWord > 0xFFFF){ + fprintf(stderr,"trieWord cannot contain value greater than 0xFFFF.\n"); + exit(U_ILLEGAL_CHAR_FOUND); + } + if(start == end){ + uint32_t savedTrieWord = utrie_get32(sprepTrie, start, NULL); + if(savedTrieWord>0){ + if(savedTrieWord < _SPREP_TYPE_THRESHOLD && type == USPREP_PROHIBITED){ + /* + * A mapping is stored in the trie word + * and the only other possible type that a + * code point can have is USPREP_PROHIBITED + * + */ + + /* turn on the 0th bit in the savedTrieWord */ + savedTrieWord += 0x01; + + /* the downcast is safe since we only save 16 bit values */ + trieWord = (uint16_t)savedTrieWord; + + /* make sure that the value of trieWord is less than the threshold */ + if(trieWord < _SPREP_TYPE_THRESHOLD){ + /* now set the value in the trie */ + if(!utrie_set32(sprepTrie,start,trieWord)){ + fprintf(stderr,"Could not set the value for code point.\n"); + exit(U_ILLEGAL_ARGUMENT_ERROR); + } + /* value is set so just return */ + return; + }else{ + fprintf(stderr,"trieWord cannot contain value greater than threshold 0x%04X.\n",_SPREP_TYPE_THRESHOLD); + exit(U_ILLEGAL_CHAR_FOUND); + } + + }else if(savedTrieWord != trieWord){ + fprintf(stderr,"Value for codepoint \\U%08X already set!.\n", (int)start); + exit(U_ILLEGAL_ARGUMENT_ERROR); + } + /* if savedTrieWord == trieWord .. fall through and set the value */ + } + if(!utrie_set32(sprepTrie,start,trieWord)){ + fprintf(stderr,"Could not set the value for code point \\U%08X.\n", (int)start); + exit(U_ILLEGAL_ARGUMENT_ERROR); + } + }else{ + if(!utrie_setRange32(sprepTrie, start, end+1, trieWord, FALSE)){ + fprintf(stderr,"Value for certain codepoint already set.\n"); + exit(U_ILLEGAL_CHAR_FOUND); + } + } + +} + +/* folding value: just store the offset (16 bits) if there is any non-0 entry */ +static uint32_t U_CALLCONV +getFoldedValue(UNewTrie *trie, UChar32 start, int32_t offset) { + uint32_t foldedValue, value; + UChar32 limit=0; + UBool inBlockZero; + + foldedValue=0; + + limit=start+0x400; + while(start<limit) { + value=utrie_get32(trie, start, &inBlockZero); + if(inBlockZero) { + start+=UTRIE_DATA_BLOCK_LENGTH; + } else if(value!=0) { + return (uint32_t)offset; + } else { + ++start; + } + } + return 0; + +} + +#endif /* #if !UCONFIG_NO_IDNA */ + +extern void +generateData(const char *dataDir, const char *packageName, const char* bundleName) { + static uint8_t sprepTrieBlock[100000]; + + UNewDataMemory *pData; + UErrorCode errorCode=U_ZERO_ERROR; + int32_t size, dataLength; + char* fileName = (char*) uprv_malloc(uprv_strlen(bundleName) +100); + +#if UCONFIG_NO_IDNA + + size=0; + +#else + + int32_t sprepTrieSize; + + /* sort and add mapping data */ + storeMappingData(); + + sprepTrieSize=utrie_serialize(sprepTrie, sprepTrieBlock, sizeof(sprepTrieBlock), getFoldedValue, TRUE, &errorCode); + if(U_FAILURE(errorCode)) { + fprintf(stderr, "error: utrie_serialize(sprep trie) failed, %s\n", u_errorName(errorCode)); + exit(errorCode); + } + + size = sprepTrieSize + mappingDataCapacity*U_SIZEOF_UCHAR + sizeof(indexes); + if(beVerbose) { + printf("size of sprep trie %5u bytes\n", (int)sprepTrieSize); + printf("size of " U_ICUDATA_NAME "_%s." DATA_TYPE " contents: %ld bytes\n", bundleName,(long)size); + printf("size of mapping data array %5u bytes\n",(int)mappingDataCapacity * U_SIZEOF_UCHAR); + printf("Number of code units in mappingData (currentIndex) are: %i \n", currentIndex); + printf("Maximum length of the mapping string is : %i \n", (int)maxLength); + } + +#endif + + if(packageName != NULL) { + uprv_strcpy(fileName,packageName); + uprv_strcat(fileName,"_"); + } else { + fileName[0]=0; + } + uprv_strcat(fileName,bundleName); + /* write the data */ + pData=udata_create(dataDir, DATA_TYPE, fileName, &dataInfo, + haveCopyright ? U_COPYRIGHT_STRING : NULL, &errorCode); + if(U_FAILURE(errorCode)) { + fprintf(stderr, "gensprep: unable to create the output file, error %d\n", errorCode); + exit(errorCode); + } + +#if !UCONFIG_NO_IDNA + + indexes[_SPREP_INDEX_TRIE_SIZE]=sprepTrieSize; + indexes[_SPREP_INDEX_MAPPING_DATA_SIZE]=mappingDataCapacity*U_SIZEOF_UCHAR; + + udata_writeBlock(pData, indexes, sizeof(indexes)); + udata_writeBlock(pData, sprepTrieBlock, sprepTrieSize); + udata_writeBlock(pData, mappingData, indexes[_SPREP_INDEX_MAPPING_DATA_SIZE]); + + +#endif + + /* finish up */ + dataLength=udata_finish(pData, &errorCode); + if(U_FAILURE(errorCode)) { + fprintf(stderr, "gensprep: error %d writing the output file\n", errorCode); + exit(errorCode); + } + + if(dataLength!=size) { + fprintf(stderr, "gensprep error: data length %ld != calculated size %ld\n", + (long)dataLength, (long)size); + exit(U_INTERNAL_PROGRAM_ERROR); + } + +#if !UCONFIG_NO_IDNA + /* done with writing the data .. close the hashtable */ + uhash_close(hashTable); +#endif +} + +#if !UCONFIG_NO_IDNA + +extern void +cleanUpData(void) { + + utrie_close(sprepTrie); + uprv_free(sprepTrie); +} + +#endif /* #if !UCONFIG_NO_IDNA */ + +/* + * Hey, Emacs, please set the following: + * + * Local Variables: + * indent-tabs-mode: nil + * End: + * + */ diff --git a/icuSources/tools/gentest/Makefile.in b/icuSources/tools/gentest/Makefile.in index 429e531a..422a53f1 100644 --- a/icuSources/tools/gentest/Makefile.in +++ b/icuSources/tools/gentest/Makefile.in @@ -1,6 +1,6 @@ ## Makefile.in for ICU - tools/gentest -## Copyright (c) 1999-2003, International Business Machines Corporation and +## Copyright (c) 1999-2004, International Business Machines Corporation and ## others. All Rights Reserved. ## Madhu Katragadda @@ -17,10 +17,8 @@ subdir = tools/gentest ## -ICUDATADIR=$(top_builddir)/data - ## Extra files to remove for 'make clean' -CLEANFILES = *~ $(DEPS) $(RES_FILES) $(TEST_FILES) +CLEANFILES = *~ $(DEPS) ## Target information TARGET = gentest$(EXEEXT) @@ -28,16 +26,14 @@ TARGET = gentest$(EXEEXT) CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common -I$(srcdir)/../toolutil LIBS = $(LIBICUTOOLUTIL) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M) -OBJECTS = gentest.o +OBJECTS = gentest.o genres32.o DEPS = $(OBJECTS:.o=.d) -TEST_FILES = $(ICUDATADIR)/test.dat - ## List of phony targets .PHONY : all all-local install install-local clean clean-local \ distclean distclean-local dist dist-local check \ -check-local build-data +check-local ## Clear suffix list .SUFFIXES : diff --git a/icuSources/tools/gentest/genres32.c b/icuSources/tools/gentest/genres32.c new file mode 100644 index 00000000..4925d876 --- /dev/null +++ b/icuSources/tools/gentest/genres32.c @@ -0,0 +1,101 @@ +/* +******************************************************************************* +* +* Copyright (C) 2003-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +* file name: genres32.c +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2003sep10 +* created by: Markus W. Scherer +* +* Write an ICU resource bundle with a table whose +* number of key characters and number of items both exceed 64k. +* Writing it as the root table tests also that +* the new table type is recognized for the root resource by the reader code. +*/ +#include <stdio.h> +#include "unicode/putil.h" +#include "cstring.h" +#include "gentest.h" + +static void +incKey(char *key, char *limit) { + char c; + + while(limit>key) { + c=*--limit; + if(c=='o') { + *limit='1'; + break; + } else { + *limit='o'; + } + } +} + +U_CFUNC int +genres32(const char *prog, const char *path) { + /* + * key string, gets incremented binary numbers + * letter 'o'=0 and digit '1'=1 so that data swapping can be tested + * with reordering (ASCII: '1'<'o' EBCDIC: '1'>'o') + * + * need 17 digits for >64k unique items + */ + char key[20]="ooooooooooooooooo"; + char *limit; + int i; + char file[512]; + FILE *out; + + uprv_strcpy(file,path); + if(file[strlen(file)-1]!=U_FILE_SEP_CHAR) { + uprv_strcat(file,U_FILE_SEP_STRING); + } + uprv_strcat(file,"testtable32.txt"); + out = fopen(file, "w"); + puts(file); + if(out == NULL) { + fprintf(stderr, "%s: Couldn't create resource test file %s\n", + prog, file); + return 1; + } + + /* find the limit of the key string */ + for(limit=key; *limit!=0; ++limit) { + } + + /* output the beginning of the bundle */ + fputs( + "testtable32 {", out + ); + + /* output the table entries */ + for(i=0; i<66000; ++i) { + if(i%10==0) { + /* + * every 10th entry contains a string with + * the entry index as its code point + */ + fprintf(out, "%s{\"\\U%08x\"}\n", key, i); + } else { + /* other entries contain their index as an integer */ + fprintf(out, "%s:int{%d}\n", key, i); + } + + incKey(key, limit); + } + + /* output the end of the bundle */ + fputs( + "}", out + ); + + fclose(out); + return 0; +} diff --git a/icuSources/tools/gentest/gentest.c b/icuSources/tools/gentest/gentest.c index 9365efab..57869c10 100644 --- a/icuSources/tools/gentest/gentest.c +++ b/icuSources/tools/gentest/gentest.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1999-2001, International Business Machines +* Copyright (C) 1999-2004, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -20,11 +20,13 @@ #include <stdlib.h> #include "unicode/utypes.h" #include "unicode/putil.h" +#include "unicode/uclean.h" #include "unicode/udata.h" #include "unewdata.h" #include "cmemory.h" #include "cstring.h" #include "uoptions.h" +#include "gentest.h" #define DATA_PKG "testdata" #define DATA_NAME "test" @@ -45,16 +47,19 @@ static const UDataInfo dataInfo={ {1, 0, 0, 0} /* dataVersion */ }; -static void createData(const char*); +static void createData(const char*, UErrorCode *); static UOption options[]={ - UOPTION_HELP_H, - UOPTION_HELP_QUESTION_MARK, - UOPTION_DESTDIR + /*0*/ UOPTION_HELP_H, + /*1*/ UOPTION_HELP_QUESTION_MARK, + /*2*/ UOPTION_DESTDIR, + /*3*/ UOPTION_DEF("genres", 'r', UOPT_NO_ARG) }; extern int main(int argc, char* argv[]) { + UErrorCode errorCode = U_ZERO_ERROR; + /* preset then read command line options */ options[2].value=u_getDataDirectory(); argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), options); @@ -68,24 +73,28 @@ main(int argc, char* argv[]) { if(argc<0 || options[0].doesOccur || options[1].doesOccur) { fprintf(stderr, "usage: %s [-options]\n" - "\tcreate the test file " DATA_PKG "_" DATA_NAME "." DATA_TYPE "\n" + "\tcreate the test file " DATA_PKG "_" DATA_NAME "." DATA_TYPE " unless the -r option is given.\n" "\toptions:\n" "\t\t-h or -? or --help this usage text\n" - "\t\t-d or --destdir destination directory, followed by the path\n", + "\t\t-d or --destdir destination directory, followed by the path\n" + "\t\t-r or --genres generate resource file testtable32.txt instead of UData test \n", argv[0]); return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR; } - /* printf("Generating the test memory mapped file\n"); */ - createData(options[2].value); - return 0; + if ( options[3].doesOccur ) { + return genres32( argv[0], options[2].value ); + } else { + /* printf("Generating the test memory mapped file\n"); */ + createData(options[2].value, &errorCode); + } + return U_FAILURE(errorCode); } /* Create data file ----------------------------------------------------- */ static void -createData(const char* outputDirectory) { +createData(const char* outputDirectory, UErrorCode *errorCode) { UNewDataMemory *pData; - UErrorCode errorCode=U_ZERO_ERROR; char stringValue[]={'Y', 'E', 'A', 'R', '\0'}; uint16_t intValue=2000; @@ -93,10 +102,10 @@ createData(const char* outputDirectory) { uint32_t size; pData=udata_create(outputDirectory, DATA_TYPE, DATA_PKG "_" DATA_NAME, &dataInfo, - U_COPYRIGHT_STRING, &errorCode); - if(U_FAILURE(errorCode)) { - fprintf(stderr, "gentest: unable to create data memory, error %d\n", errorCode); - exit(errorCode); + U_COPYRIGHT_STRING, errorCode); + if(U_FAILURE(*errorCode)) { + fprintf(stderr, "gentest: unable to create data memory, error %d\n", *errorCode); + exit(*errorCode); } /* write the data to the file */ @@ -105,10 +114,10 @@ createData(const char* outputDirectory) { udata_writeString(pData, stringValue, sizeof(stringValue)); /* finish up */ - dataLength=udata_finish(pData, &errorCode); - if(U_FAILURE(errorCode)) { - fprintf(stderr, "gentest: error %d writing the output file\n", errorCode); - exit(errorCode); + dataLength=udata_finish(pData, errorCode); + if(U_FAILURE(*errorCode)) { + fprintf(stderr, "gentest: error %d writing the output file\n", *errorCode); + exit(*errorCode); } size=sizeof(stringValue) + sizeof(intValue); diff --git a/icuSources/tools/gentest/gentest.dsp b/icuSources/tools/gentest/gentest.dsp index cd16afdd..9a597425 100644 --- a/icuSources/tools/gentest/gentest.dsp +++ b/icuSources/tools/gentest/gentest.dsp @@ -115,7 +115,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\..\include" /I "..\..\..\source\common" /I "..\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MD /Za /W3 /GX /Zi /O2 /I "..\..\..\include" /I "..\..\..\source\common" /I "..\toolutil" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FD /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe @@ -150,7 +150,7 @@ SOURCE="$(InputPath)" # PROP Target_Dir "" MTL=midl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\..\include" /I "..\..\..\source\common" /I "..\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /QIA64_fmaopt /Wp64 /Zm600 /c +# ADD CPP /nologo /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\..\include" /I "..\..\..\source\common" /I "..\toolutil" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_IA64_" /D "WIN32" /D "_AFX_NO_DAO_SUPPORT" /FR /FD /GZ /Wp64 /Zm600 /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe @@ -185,6 +185,10 @@ SOURCE="$(InputPath)" SOURCE=.\gentest.c # End Source File +# Begin Source File + +SOURCE=.\genres32.c +# End Source File # End Group # Begin Group "Header Files" diff --git a/icuSources/tools/gentest/gentest.h b/icuSources/tools/gentest/gentest.h new file mode 100644 index 00000000..ed71042c --- /dev/null +++ b/icuSources/tools/gentest/gentest.h @@ -0,0 +1,14 @@ +/* +******************************************************************************* +* +* Copyright (C) 2003-2004, International Business Machines +* Corporation and others. All Rights Reserved. +* +******************************************************************************* +*/ + +#include "unicode/utypes.h" + +U_CFUNC int genres32(const char *prog, const char *path); + + diff --git a/icuSources/tools/gentest/gentest.vcproj b/icuSources/tools/gentest/gentest.vcproj index e0514d1f..4397f374 100644 --- a/icuSources/tools/gentest/gentest.vcproj +++ b/icuSources/tools/gentest/gentest.vcproj @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding = "Windows-1252"?> +<?xml version="1.0" encoding="Windows-1252"?> <VisualStudioProject ProjectType="Visual C++" - Version="7.00" + Version="7.10" Name="gentest" SccProjectName="" SccLocalPath=""> @@ -36,18 +36,12 @@ SuppressStartupBanner="TRUE" CompileAs="0"/> <Tool - Name="VCCustomBuildTool" - CommandLine="copy $(TargetPath) ..\..\..\bin -" - Outputs="..\..\..\bin\$(InputName).exe"/> + Name="VCCustomBuildTool"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icuuc.lib icutu.lib" OutputFile=".\Release/gentest.exe" LinkIncremental="1" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\toolutil\Release,..\..\..\lib" ProgramDatabaseFile=".\Release/gentest.pdb" SubSystem="1"/> <Tool @@ -65,8 +59,14 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> <Configuration Name="Debug|Win32" @@ -96,18 +96,12 @@ DebugInformationFormat="4" CompileAs="0"/> <Tool - Name="VCCustomBuildTool" - CommandLine="copy $(TargetPath) ..\..\..\bin -" - Outputs="..\..\..\bin\$(InputName).exe"/> + Name="VCCustomBuildTool"/> <Tool Name="VCLinkerTool" - AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="icuucd.lib icutud.lib" OutputFile=".\Debug/gentest.exe" LinkIncremental="2" SuppressStartupBanner="TRUE" - AdditionalLibraryDirectories="..\toolutil\debug\,..\..\..\lib" GenerateDebugInformation="TRUE" ProgramDatabaseFile=".\Debug/gentest.pdb" SubSystem="1"/> @@ -126,14 +120,25 @@ Culture="1033"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> </Configurations> + <References> + </References> <Files> <Filter Name="Source Files" Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"> + <File + RelativePath=".\genres32.c"> + </File> <File RelativePath=".\gentest.c"> </File> @@ -141,6 +146,9 @@ <Filter Name="Header Files" Filter="h;hpp;hxx;hm;inl"> + <File + RelativePath=".\gentest.h"> + </File> </Filter> <Filter Name="Resource Files" diff --git a/icuSources/tools/gentz/gentz.8.in b/icuSources/tools/gentz/gentz.8.in deleted file mode 100644 index 6cb4ac17..00000000 --- a/icuSources/tools/gentz/gentz.8.in +++ /dev/null @@ -1,73 +0,0 @@ -.\" Hey, Emacs! This is -*-nroff-*- you know... -.\" -.\" gentz.8: manual page for the gentz utility -.\" -.\" Copyright (C) 2000-2001 IBM, Inc. and others. -.\" -.TH GENTZ 8 "16 January 2001" "ICU MANPAGE" "ICU @VERSION@ Manual" -.SH NAME -.B gentz -\- compile timezone information -.SH SYNOPSIS -.B gentz -[ -.BR "\-h\fP, \fB\-?\fP, \fB\-\-help" -] -[ -.BI "\-c\fP, \fB\-\-copyright" -] -[ -.BI "\-d\fP, \fB\-\-destdir" " destination" -] -.I timezone -.SH DESCRIPTION -.B gentz -reads a -.I timezone -file and compile it into a binary form. -The resulting file, -.BR tz.dat , -can then be read directly by ICU, or used by -.BR pkgdata (8) -for incorporation into a larger archive or library. -.LP -The file read by -.B gentz -is described in the -.B FILES -section. -.SH OPTIONS -.TP -.BR "\-h\fP, \fB\-?\fP, \fB\-\-help" -Print help about usage and exit. -.TP -.BI "\-c\fP, \fB\-\-copyright" -Include a copyright notice into the binary data. -.TP -.BI "\-d\fP, \fB\-\-destdir" " destination" -Set the destination directory to -.IR destination . -The default destination directory is specified by the environment variable -.BR ICU_DATA . -.SH ENVIRONMENT -.TP 10 -.B ICU_DATA -Specifies the directory containing ICU data. Defaults to -.BR @thepkgicudatadir@/@PACKAGE@/@VERSION@/ . -Some tools in ICU depend on the presence of the trailing slash. It is thus -important to make sure that it is present if -.B ICU_DATA -is set. -.SH FILES -The following file is read by -.BR gentz . -.TP 20 -.B timezone.txt -Contains UNIX timezone data in a format that can be understood by -.BR gentz . -.SH VERSION -@VERSION@ -.SH COPYRIGHT -Copyright (C) 2000-2002 IBM, Inc. and others. -.SH SEE ALSO -.BR pkgdata (8) diff --git a/icuSources/tools/gentz/gentz.cpp b/icuSources/tools/gentz/gentz.cpp deleted file mode 100644 index 159b3714..00000000 --- a/icuSources/tools/gentz/gentz.cpp +++ /dev/null @@ -1,848 +0,0 @@ -/* -********************************************************************** -* Copyright (C) 1999-2003, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -* Date Name Description -* 11/24/99 aliu Creation. -* 09/26/00 aliu Support for equivalency groups added. -* 01/31/01 aliu Support for ISO 3166 country codes added. -********************************************************************** -*/ - -/* This program reads a text file full of parsed time zone data and - * outputs a binary file, tz.dat, which then goes on to become part of - * the memory-mapped (or dll) ICU data file. - * - * The data file read by this program is generated by a perl script, - * tz.pl. The input to tz.pl is standard unix time zone data from - * ftp://elsie.nci.nih.gov. - * - * As a matter of policy, the perl script tz.pl wants to do as much of - * the parsing, data processing, and error checking as possible, and - * this program wants to just do the binary translation step. - * - * See tz.pl for the file format that is READ by this program. - */ - -#include <stdio.h> -#include <stdlib.h> -#include "unicode/utypes.h" -#include "unicode/putil.h" -#include "cmemory.h" -#include "cstring.h" -#include "filestrm.h" -#include "unewdata.h" -#include "uoptions.h" -#include "tzdat.h" - -#define INPUT_FILE "tz.txt" -#define OUTPUT_FILE "tz.icu" - -#if UCONFIG_NO_FORMATTING - -/* dummy UDataInfo cf. udata.h */ -static UDataInfo dummyDataInfo = { - sizeof(UDataInfo), - 0, - - U_IS_BIG_ENDIAN, - U_CHARSET_FAMILY, - U_SIZEOF_UCHAR, - 0, - - { 0, 0, 0, 0 }, /* dummy dataFormat */ - { 0, 0, 0, 0 }, /* dummy formatVersion */ - { 0, 0, 0, 0 } /* dummy dataVersion */ -}; - -#else - -/* UDataInfo cf. udata.h */ -static UDataInfo dataInfo = { - sizeof(UDataInfo), - 0, - - U_IS_BIG_ENDIAN, - U_CHARSET_FAMILY, - sizeof(UChar), - 0, - - {TZ_SIG_0, TZ_SIG_1, TZ_SIG_2, TZ_SIG_3}, - {TZ_FORMAT_VERSION, 0, 0, 0}, /* formatVersion */ - {0, 0, 0, 0} /* dataVersion - will be filled in with year.suffix */ -}; - -#endif - -class gentz { - // These must match SimpleTimeZone!!! - enum { WALL_TIME = 0, - STANDARD_TIME, - UTC_TIME - }; - - // The largest number of zones we accept as sensible. Anything - // larger is considered an error. Adjust as needed. - enum { MAX_ZONES = 1000 }; - - // The maximum sensible GMT offset, in seconds - static const int32_t MAX_GMT_OFFSET; - - static const char COMMENT; - static const char CR; - static const char LF; - static const char MINUS; - static const char SPACE; - static const char TAB; - static const char ZERO; - static const char STANDARD_MARK; - static const char DST_MARK; - static const char SEP; - static const char NUL; - - static const char* END_KEYWORD; - -#if! UCONFIG_NO_FORMATTING - enum { BUFLEN = 1024 }; - char buffer[BUFLEN]; - int32_t lineNumber; - - // Binary data that we construct from tz.txt and write out as tz.icu - TZHeader header; - TZEquivalencyGroup* equivTable; - OffsetIndex* offsetIndex; - CountryIndex* countryIndex; - uint32_t* nameToEquiv; - char* nameTable; - - uint32_t equivTableSize; // Total bytes in equivalency group table - uint32_t offsetIndexSize; // Total bytes in offset index table - uint32_t countryIndexSize; // Total bytes in country index table - uint32_t nameToEquivSize; // Total bytes in nameToEquiv - uint32_t nameTableSize; // Total bytes in name table - - uint32_t maxPerOffset; // Maximum number of zones per offset - uint32_t maxPerEquiv; // Maximum number of zones per equivalency group - uint32_t equivCount; // Number of equivalency groups -#endif - - UBool useCopyright; - UBool verbose; - - -public: - int MMain(int argc, char *argv[]); - -#if! UCONFIG_NO_FORMATTING -private: - int32_t writeTzDatFile(const char *destdir); - void parseTzTextFile(FileStream* in); - - // High level parsing - void parseHeader(FileStream* in); - - TZEquivalencyGroup* parseEquivTable(FileStream* in); - - void fixupNameToEquiv(); - - void parseDSTRule(char*& p, TZRule& rule); - - OffsetIndex* parseOffsetIndexTable(FileStream* in); - - CountryIndex* parseCountryIndexTable(FileStream* in); - - char* parseNameTable(FileStream* in); - - // Low level parsing and reading - void readEndMarker(FileStream* in); - int32_t readIntegerLine(FileStream* in, int32_t min, int32_t max); - int32_t _parseInteger(char*& p); - int32_t parseInteger(char*& p, char nextExpectedChar, int32_t, int32_t); - int32_t readLine(FileStream* in); - - // Error handling - void die(const char* msg); -#endif -}; - -int main(int argc, char *argv[]) { - gentz x; - - U_MAIN_INIT_ARGS(argc, argv); - - return x.MMain(argc, argv); -} - -const int32_t gentz::MAX_GMT_OFFSET = (int32_t)24*60*60; // seconds -const char gentz::COMMENT = '#'; -const char gentz::CR = '\r'; -const char gentz::LF = '\n'; -const char gentz::MINUS = '-'; -const char gentz::SPACE = ' '; -const char gentz::TAB = '\t'; -const char gentz::ZERO = '0'; -const char gentz::SEP = ','; -const char gentz::STANDARD_MARK = 's'; -const char gentz::DST_MARK = 'd'; -const char gentz::NUL = '\0'; -const char* gentz::END_KEYWORD = "end"; - -static UOption options[]={ - UOPTION_HELP_H, - UOPTION_HELP_QUESTION_MARK, - UOPTION_COPYRIGHT, - UOPTION_DESTDIR, - UOPTION_VERBOSE -}; - -int gentz::MMain(int argc, char* argv[]) { - /* preset then read command line options */ - options[3].value=u_getDataDirectory(); - argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), options); - - /* error handling, printing usage message */ - if(argc<0) { - fprintf(stderr, - "error in command line argument \"%s\"\n", - argv[-argc]); - } else if(argc<2) { - argc=-1; - } - if(argc<0 || options[0].doesOccur || options[1].doesOccur) { - fprintf(stderr, - "usage: %s [-options] timezone-file\n" - "\tread the timezone file produced by tz.pl and create " U_ICUDATA_NAME "_" TZ_DATA_NAME "." TZ_DATA_TYPE "\n" - "options:\n" - "\t-h or -? or --help this usage text\n" - "\t-v or --verbose turn on verbose output\n" - "\t-c or --copyright include a copyright notice\n" - "\t-d or --destdir destination directory, followed by the path\n", - argv[0]); - return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR; - } - - /* get the options values */ - useCopyright=options[2].doesOccur; - verbose = options[4].doesOccur; - -#if UCONFIG_NO_FORMATTING - - UNewDataMemory *pData; - const char *msg = "gentz writes dummy " U_ICUDATA_NAME "_" TZ_DATA_NAME "." TZ_DATA_TYPE " because of UCONFIG_NO_FORMATTING, see uconfig.h"; - UErrorCode status = U_ZERO_ERROR; - - fprintf(stderr, "%s\n", msg); - pData = udata_create(options[3].value, TZ_DATA_TYPE, U_ICUDATA_NAME "_" TZ_DATA_NAME, &dummyDataInfo, - NULL, &status); - udata_writeBlock(pData, msg, strlen(msg)); - udata_finish(pData, &status); - return (int)status; - -#else - - //////////////////////////////////////////////////////////// - // Read the input file - //////////////////////////////////////////////////////////// - *buffer = NUL; - lineNumber = 0; - if (verbose) { - fprintf(stdout, "Input file: %s\n", argv[1]); - } - FileStream* in = T_FileStream_open(argv[1], "r"); - if (in == 0) { - die("Cannot open input file"); - } - parseTzTextFile(in); - T_FileStream_close(in); - *buffer = NUL; - - //////////////////////////////////////////////////////////// - // Write the output file - //////////////////////////////////////////////////////////// - int32_t wlen = writeTzDatFile(options[3].value); - if (verbose) { - fprintf(stdout, "Output file: %s.%s, %ld bytes\n", - U_ICUDATA_NAME "_" TZ_DATA_NAME, TZ_DATA_TYPE, (long)wlen); - } - - return 0; // success - -#endif -} - -#if !UCONFIG_NO_FORMATTING - -int32_t gentz::writeTzDatFile(const char *destdir) { - UNewDataMemory *pdata; - UErrorCode status = U_ZERO_ERROR; - - // Careful: The order in which the tables are written must match the offsets. - // Our order is: - // - equiv table - // - offset index - // - country index - // - name index (name to equiv map) - // - name table (must be last!) - header.equivTableDelta = sizeof(header); - header.offsetIndexDelta = header.equivTableDelta + equivTableSize; - header.countryIndexDelta = header.offsetIndexDelta + offsetIndexSize; - header.nameIndexDelta = header.countryIndexDelta + countryIndexSize; - // Must be last: - header.nameTableDelta = header.nameIndexDelta + nameToEquivSize; - -/* // Don't need to check for negative values on unsigned numbers. - if (header.equivTableDelta < 0 || - header.offsetIndexDelta < 0 || - header.countryIndexDelta < 0 || - header.nameIndexDelta < 0 || - header.nameTableDelta < 0) { - die("Table too big -- negative delta"); - } -*/ - - // Convert equivalency table indices to offsets. This can only - // be done after the header offsets have been set up. - fixupNameToEquiv(); - - // Fill in dataInfo with year.suffix - *(uint16_t*)&(dataInfo.dataVersion[0]) = header.versionYear; - *(uint16_t*)&(dataInfo.dataVersion[2]) = header.versionSuffix; - - pdata = udata_create(destdir, TZ_DATA_TYPE, U_ICUDATA_NAME "_" TZ_DATA_NAME, &dataInfo, - useCopyright ? U_COPYRIGHT_STRING : 0, &status); - if (U_FAILURE(status)) { - die("Unable to create data memory"); - } - - udata_writeBlock(pdata, &header, sizeof(header)); - udata_writeBlock(pdata, equivTable, equivTableSize); - udata_writeBlock(pdata, offsetIndex, offsetIndexSize); - udata_writeBlock(pdata, countryIndex, countryIndexSize); - udata_writeBlock(pdata, nameToEquiv, nameToEquivSize); - udata_writeBlock(pdata, nameTable, nameTableSize); - - uint32_t dataLength = udata_finish(pdata, &status); - if (U_FAILURE(status)) { - die("Error writing output file"); - } - - if (dataLength != (sizeof(header) + equivTableSize + - offsetIndexSize + countryIndexSize + - nameTableSize + nameToEquivSize - )) { - die("Written file doesn't match expected size"); - } - return dataLength; -} - -void gentz::parseTzTextFile(FileStream* in) { - parseHeader(in); - - // Read name table, create it, also create nameToEquiv index table - // as a side effect. - nameTable = parseNameTable(in); - - // Parse the equivalency groups - equivTable = parseEquivTable(in); - - // Parse the GMT offset index table - offsetIndex = parseOffsetIndexTable(in); - - // Parse the ISO 3166 country index table - countryIndex = parseCountryIndexTable(in); -} - -/** - * Convert equivalency table indices to offsets. The equivalency - * table offset (in the header) must be set already. - */ -void gentz::fixupNameToEquiv() { - uint32_t i; - - // First make a list that maps indices to offsets - uint32_t *offsets = (uint32_t*) uprv_malloc(sizeof(uint32_t) * equivCount); - /* test for NULL */ - if(offsets == NULL) { - die("Out of memory"); - } - offsets[0] = header.equivTableDelta; - if (offsets[0] % 4 != 0) { - die("Header size is not 4-aligned"); - } - TZEquivalencyGroup *eg = equivTable; - for (i=1; i<equivCount; ++i) { - offsets[i] = offsets[i-1] + eg->nextEntryDelta; - if (offsets[i] % 4 != 0) { - die("Equivalency group table is not 4-aligned"); - } - eg = (TZEquivalencyGroup*) (eg->nextEntryDelta + (int8_t*)eg); - } - - // Now remap index values to offsets - for (i=0; i<header.count; ++i) { - uint32_t x = nameToEquiv[i]; - if (x >= equivCount) { - die("Equiv index out of range"); - } - nameToEquiv[i] = offsets[x]; - } - - uprv_free(offsets); -} - -TZEquivalencyGroup* gentz::parseEquivTable(FileStream* in) { - uint32_t n = readIntegerLine(in, 1, MAX_ZONES); - if (n != equivCount) { - die("Equivalency table count mismatch"); - } - - // We don't know how big the whole thing will be yet, but we can use - // the maxPerEquiv number to compute an upper limit. - // - // The gmtOffset field within each struct must be - // 4-aligned for some architectures. To ensure this, we do two - // things: 1. The entire struct is 4-aligned. 2. The gmtOffset is - // placed at a 4-aligned position within the struct. 3. The size - // of the whole structure is padded out to 4n bytes. We achieve - // this last condition by adding two bytes of padding after the - // last entry, if necessary. We adjust - // the nextEntryDelta and add 2 bytes of padding if necessary. - uint32_t maxPossibleSize = sizeof(TZEquivalencyGroup) + - (maxPerEquiv-1) * sizeof(uint16_t); - // Pad this out - if ((maxPossibleSize % 4) != 0) { - maxPossibleSize += 2; - } - if ((maxPossibleSize % 4) != 0) { - die("Bug in 4-align code for equiv table"); - } - maxPossibleSize *= n; // Get size of entire set of structs. - - int8_t *result = (int8_t*) uprv_malloc(sizeof(int8_t) * maxPossibleSize); - if (result == 0) { - die("Out of memory"); - } - - // Read each line and construct the corresponding entry - TZEquivalencyGroup* eg = (TZEquivalencyGroup*)result; - for (uint32_t i=0; i<n; ++i) { - char *p; - - readLine(in); - - // Each line starts with 's,' or 'd,' to specify the zone type - char flavor = buffer[0]; - if (buffer[1] != SEP) { - die("Syntax error in equiv table"); - } - p = buffer + 2; - - // This pointer will be adjusted to point to the start of the - // list of zones in this group. - uint16_t* pList = 0; - - switch (flavor) { - case STANDARD_MARK: - eg->isDST = 0; - eg->u.s.zone.gmtOffset = 1000 * // Convert s -> ms - parseInteger(p, SEP, -MAX_GMT_OFFSET, MAX_GMT_OFFSET); - pList = &(eg->u.s.count); - break; - case DST_MARK: - eg->isDST = 1; - eg->u.d.zone.gmtOffset = 1000 * // Convert s -> ms - parseInteger(p, SEP, -MAX_GMT_OFFSET, MAX_GMT_OFFSET); - parseDSTRule(p, eg->u.d.zone.onsetRule); - parseDSTRule(p, eg->u.d.zone.ceaseRule); - eg->u.d.zone.dstSavings = (uint16_t) parseInteger(p, SEP, 0, 12*60); - pList = &(eg->u.d.count); - break; - default: - die("Invalid equiv table type marker (not s or d)"); - } - - // Now parse the list of zones in this group - uint16_t egCount = (uint16_t) parseInteger(p, SEP, 1, maxPerEquiv); - *pList++ = egCount; - for (uint16_t j=0; j<egCount; ++j) { - *pList++ = (uint16_t) parseInteger(p, (j==(egCount-1)) ? NUL : SEP, - 0, header.count-1); - } - - // At this point pList points to the byte after the last byte of this - // equiv group struct. Time to 4-align it. - uint16_t structSize = (uint16_t) (((int8_t*)pList) - ((int8_t*)eg)); - if ((structSize % 4) != 0) { - // assert(structSize % 4 == 2); - *pList++ = 0xFFFF; // Pad with invalid zone index - structSize += 2; - } - - // Set up next entry delta - eg->nextEntryDelta = (i==(n-1)) ? (uint16_t) 0 : structSize; - - eg->reserved = 0; // ignored - - eg = (TZEquivalencyGroup*) (structSize + (int8_t*)eg); - } - equivTableSize = (int8_t*)eg - (int8_t*)result; - readEndMarker(in); - if (verbose) { - fprintf(stdout, " Read %lu equivalency table entries, in-memory size %ld bytes\n", - (unsigned long)equivCount, (long)equivTableSize); - } - return (TZEquivalencyGroup*)result; -} - -OffsetIndex* gentz::parseOffsetIndexTable(FileStream* in) { - uint32_t n = readIntegerLine(in, 1, MAX_ZONES); - - // We don't know how big the whole thing will be yet, but we can use - // the maxPerOffset number to compute an upper limit. - // - // The gmtOffset field within each OffsetIndex struct must be - // 4-aligned for some architectures. To ensure this, we do two - // things: 1. The entire struct is 4-aligned. 2. The gmtOffset is - // placed at a 4-aligned position within the struct. 3. The size - // of the whole structure is padded out to 4n bytes. We achieve - // this last condition by adding two bytes of padding after the - // last zoneNumber, if count is _even_. That is, the struct size - // is 10+2count+padding, where padding is (count%2==0 ? 2:0). - // - // Note that we don't change the count itself, but rather adjust - // the nextEntryDelta and add 2 bytes of padding if necessary. - // - // Don't try to compute the exact size in advance - // (unless we want to avoid the use of sizeof(), which may - // introduce padding that we won't actually employ). - uint32_t maxPossibleSize = n * (sizeof(OffsetIndex) + - (maxPerOffset-1) * sizeof(uint16_t)); - - int8_t *result = (int8_t*) uprv_malloc(sizeof(int8_t) * maxPossibleSize); - if (result == 0) { - die("Out of memory"); - } - - // Read each line and construct the corresponding entry - OffsetIndex* index = (OffsetIndex*)result; - for (uint32_t i=0; i<n; ++i) { - uint16_t alignedCount; - readLine(in); - char* p = buffer; - index->gmtOffset = 1000 * // Convert s -> ms - parseInteger(p, SEP, -MAX_GMT_OFFSET, MAX_GMT_OFFSET); - index->defaultZone = (uint16_t)parseInteger(p, SEP, 0, header.count-1); - index->count = (uint16_t)parseInteger(p, SEP, 1, maxPerOffset); - uint16_t* zoneNumberArray = &(index->zoneNumber); - UBool sawOffset = FALSE; // Sanity check - make sure offset is in zone list - for (uint16_t j=0; j<index->count; ++j) { - zoneNumberArray[j] = (uint16_t) - parseInteger(p, (j==(index->count-1))?NUL:SEP, - 0, header.count-1); - if (zoneNumberArray[j] == index->defaultZone) { - sawOffset = TRUE; - } - } - if (!sawOffset) { - die("Error: bad offset index entry; default not in zone list"); - } - alignedCount = index->count; - if((alignedCount%2)==0) /* force count to be ODD - see above */ - { - // Use invalid zoneNumber for 2 bytes of padding - zoneNumberArray[alignedCount++] = (uint16_t)0xFFFF; - } - int8_t* nextIndex = (int8_t*)&(zoneNumberArray[alignedCount]); - - index->nextEntryDelta = (uint16_t) ((i==(n-1)) ? 0 : (nextIndex - (int8_t*)index)); - index = (OffsetIndex*)nextIndex; - } - offsetIndexSize = (int8_t*)index - (int8_t*)result; - if (offsetIndexSize > maxPossibleSize) { - die("Yikes! Internal error while constructing offset index table"); - } - readEndMarker(in); - if (verbose) { - fprintf(stdout, " Read %lu offset index table entries, in-memory size %ld bytes\n", - (unsigned long)n, (long)offsetIndexSize); - } - return (OffsetIndex*)result; -} - -CountryIndex* gentz::parseCountryIndexTable(FileStream* in) { - uint32_t n = readIntegerLine(in, 1, MAX_ZONES); - - // We know how big the whole thing will be: Each zone occupies an - // int, and each country adds 3 ints (one for the intcode, one for - // next entry offset, one for the zone count). Each int is 16 - // bits. - // - // This assumes each zone belongs to exactly one country and each - // country lists 1 or more zones. - // - // Everything is 16-bits, so we don't 4-align the entries. - // However, we do pad at the end of the table to make the whole - // thing of size 4n, if necessary. - uint32_t expectedSize = n*(sizeof(CountryIndex)-sizeof(uint16_t)) + - header.count * sizeof(uint16_t); - uint32_t pad = (4 - (expectedSize % 4)) % 4; // This will be 0 or 2 - int8_t *result = (int8_t*) uprv_malloc(sizeof(int8_t) * (expectedSize + pad)); - if (result == 0) { - die("Out of memory"); - } - - // Read each line and construct the corresponding entry. - // Along the way, make sure we don't write past 'limit'. - CountryIndex* index = (CountryIndex*)result; - int8_t* limit = ((int8_t*)result) + expectedSize; // Don't include pad - uint32_t i; - for (i=0; i<n && (int8_t*)(&index->zoneNumber) < limit; ++i) { - readLine(in); - char* p = buffer; - index->intcode = (uint16_t)parseInteger(p, SEP, 0, 25*32+25 /*ZZ*/); - index->count = (uint16_t)parseInteger(p, SEP, 0, header.count-1); - uint16_t* zoneNumberArray = &(index->zoneNumber); - if ((int8_t*)(&index->zoneNumber + index->count - 1) >= limit) { - // Oops -- out of space - fprintf(stderr, "ERROR, out of space parsing country %d\n", i); - break; - } - for (uint16_t j=0; j<index->count; ++j) { - zoneNumberArray[j] = (uint16_t) - parseInteger(p, (j==(index->count-1))?NUL:SEP, - 0, header.count-1); - } - int8_t* nextIndex = (int8_t*)&(zoneNumberArray[index->count]); - index->nextEntryDelta = (uint16_t) ((i==(n-1)) ? 0 : (nextIndex - (int8_t*)index)); - index = (CountryIndex*)nextIndex; - } - readEndMarker(in); - - // Add padding - countryIndexSize = (int8_t*)index - (int8_t*)result + pad; - if (pad != 0) { - expectedSize += pad; - *(uint16_t*)index = 0; // Clear pad bits - } - - // Make sure size matches expected value - if (i != n) { - die("Yikes! Failed to parse all country index table entries"); - } - if (countryIndexSize != expectedSize) { - fprintf(stderr, "ERROR, country index size 0x%0X, expected 0x%0X\n", - countryIndexSize, expectedSize); - die("Yikes! Internal error while constructing country index table"); - } - if (verbose) { - fprintf(stdout, " Read %lu country index table entries, in-memory size %ld bytes\n", (unsigned long)n, (long)countryIndexSize); - } - return (CountryIndex*)result; -} - -void gentz::parseHeader(FileStream* in) { - - int32_t version = readIntegerLine(in, 0, 0xFFFF); - if (version != TZ_FORMAT_VERSION) { - die("Version mismatch between gentz and input file"); - } - - // Version string, e.g., "1999j" -> (1999<<16) | 10 - header.versionYear = (uint16_t) readIntegerLine(in, 1990, 0xFFFF); - header.versionSuffix = (uint16_t) readIntegerLine(in, 0, 0xFFFF); - - header.count = readIntegerLine(in, 1, MAX_ZONES); - equivCount = readIntegerLine(in, 1, header.count); - maxPerOffset = readIntegerLine(in, 1, header.count); - maxPerEquiv = readIntegerLine(in, 1, equivCount); - - // Size of name table in bytes - // (0x00FFFFFF is an arbitrary upper limit; adjust as needed.) - nameTableSize = readIntegerLine(in, 1, 0x00FFFFFF); - - readEndMarker(in); - - if (verbose) { - fprintf(stdout, " Read header, data version %u(%u), in-memory size %ld bytes\n", - header.versionYear, header.versionSuffix, - (unsigned long)sizeof(header)); - } -} - -void gentz::parseDSTRule(char*& p, TZRule& rule) { - rule.month = (uint8_t) parseInteger(p, SEP, 0, 11); - rule.dowim = (int8_t) parseInteger(p, SEP, -31, 31); - rule.dow = (int8_t) parseInteger(p, SEP, -7, 7); - rule.time = (uint16_t) parseInteger(p, SEP, 0, 24*60); - rule.mode = *p++; - if (*p++ != SEP) { - die("Separator missing"); - } - switch ((char)rule.mode) { - case 'w': - rule.mode = WALL_TIME; - break; - case 's': - rule.mode = STANDARD_TIME; - break; - case 'u': - rule.mode = UTC_TIME; - break; - default: - die("Invalid rule time mode"); - break; - } -} - -/** - * Parse the name table. - * Each entry of the name table looks like this: - * |36,Africa/Djibouti - * The integer is an equivalency table index. We build up a name - * table, that just contains the names, and we return it. We also - * build up the name index, which indexes names to equivalency table - * entries. This is stored in the member variable nameToEquiv. - */ -char* gentz::parseNameTable(FileStream* in) { - int32_t n = readIntegerLine(in, 1, MAX_ZONES); - if (n != (int32_t)header.count) { - die("Zone count doesn't match name table count"); - } - char* names = (char*) uprv_malloc(sizeof(char) * nameTableSize); - nameToEquiv = (uint32_t*) uprv_malloc(sizeof(uint32_t) * n); - if (names == 0 || nameToEquiv == 0) { - die("Out of memory"); - } - nameToEquivSize = n * sizeof(nameToEquiv[0]); - char* p = names; - char* limit = names + nameTableSize; - for (int32_t i=0; i<n; ++i) { - readLine(in); - char* q = buffer; - // We store an index here for now -- later, in fixNameToEquiv, - // we convert it to an offset. - nameToEquiv[i] = (uint32_t) parseInteger(q, SEP, 0, equivCount-1); - int32_t len = uprv_strlen(q); - if ((p + len) <= limit) { - uprv_memcpy(p, q, len); - p += len; - *p++ = NUL; - } else { - die("Name table longer than declared size"); - } - } - if (p != limit) { - die("Name table shorter than declared size"); - } - readEndMarker(in); - if (verbose) { - fprintf(stdout, " Read %ld names, in-memory size %ld bytes\n", - (long)n, (long)nameTableSize); - } - return names; -} - -/** - * Read the end marker (terminates each list). - */ -void gentz::readEndMarker(FileStream* in) { - readLine(in); - if (uprv_strcmp(buffer, END_KEYWORD) != 0) { - die("Keyword 'end' missing"); - } -} - -/** - * Read a line from the FileStream and parse it as an - * integer. There should be nothing else on the line. - */ -int32_t gentz::readIntegerLine(FileStream* in, int32_t min, int32_t max) { - readLine(in); - char* p = buffer; - return parseInteger(p, NUL, min, max); -} - -/** - * Parse an integer from the given character buffer. - * Advance p past the last parsed character. Return - * the result. The integer must be of the form - * /-?\d+/. - */ -int32_t gentz::_parseInteger(char*& p) { - int32_t n = 0; - int32_t digitCount = 0; - int32_t digit; - UBool negative = FALSE; - if (*p == MINUS) { - ++p; - negative = TRUE; - } - for (;;) { - digit = *p - ZERO; - if (digit < 0 || digit > 9) { - break; - } - n = 10*n + digit; - p++; - digitCount++; - } - if (digitCount < 1) { - die("Unable to parse integer"); - } - if (negative) { - n = -n; - } - return n; -} - -int32_t gentz::parseInteger(char*& p, char nextExpectedChar, - int32_t min, int32_t max) { - int32_t n = _parseInteger(p); - if (*p++ != nextExpectedChar) { - die("Character following integer unexpected"); - } - if (n < min || n > max) { - die("Integer field out of range"); - } - return n; -} - -void gentz::die(const char* msg) { - fprintf(stderr, "ERROR, %s\n", msg); - if (*buffer) { - fprintf(stderr, "Input file line %ld: \"%s\"\n", (long)lineNumber, buffer); - } - exit(1); -} - -/** - * Read a line. Trim trailing comment and whitespace. Ignore (skip) - * blank lines, or comment-only lines. Return the number of characters - * on the line remaining. On EOF, die. - */ -int32_t gentz::readLine(FileStream* in) { - ++lineNumber; - char* result = T_FileStream_readLine(in, buffer, BUFLEN); - if (result == 0) { - *buffer = 0; - die("Unexpected end of file"); - } - // Trim off trailing comment - char* p = uprv_strchr(buffer, COMMENT); - if (p != 0) { - *p = NUL; - } - // Delete trailing whitespace - p = buffer + uprv_strlen(buffer); - while (p > buffer && (p[-1] == CR || p[-1] == LF || - p[-1] == SPACE || p[-1] == TAB)) { - p--; - } - *p = NUL; - // If line is empty after trimming comments & whitespace, - // then read the next line. - return (*buffer == NUL) ? readLine(in) : uprv_strlen(buffer); -} - -#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icuSources/tools/gentz/readme.txt b/icuSources/tools/gentz/readme.txt deleted file mode 100644 index f6ff6301..00000000 --- a/icuSources/tools/gentz/readme.txt +++ /dev/null @@ -1,114 +0,0 @@ -Copyright (C) 1999-2001, International Business Machines Corporation -and others. All Rights Reserved. - -Readme file for ICU time zone data (source/tools/gentz) - -Alan Liu -Last updated 2 Feb 2001 - - -RAW DATA --------- -The time zone data in ICU is taken from the UNIX data files at -ftp://elsie.nci.nih.gov/pub/tzdata<year>. The other input to the -process is an alias table, described below. - - -BUILD PROCESS -------------- -Two tools are used to process the data into a format suitable for ICU: - - tz.pl directory of raw data files + tz.alias -> tz.txt - gentz tz.txt -> tz.dat (memory mappable binary file) - -After gentz is run, standard ICU data tools are used to incorporate -tz.dat into the icudata module. The tz.pl script is run manually; -everything else is automatic. - -In order to incorporate the raw data from that source into ICU, take -the following steps. - -1. Download the archive of current zone data. This should be a file - named something like tzdata1999j.tar.gz. Use the URL listed above. - -2. Unpack the archive into a directory, retaining the name of the - archive. For example, unpack tzdata1999j.tar.gz into tzdata1999j/. - Place this directory anywhere; one option is to place it within - source/tools/gentz. - -3. Run the perl script tz.pl, passing it the directory location as a - command-line argument. On Windows system use the batch file - tz.bat. Also specify one or more ourput files: .txt, .htm|.html, - and .java. - - For ICU4C specify .txt; typically - - <icu>/source/data/misc/timezone.txt - - where icu is the ICU4C root directory. Double check that this is - the correct location and file name; they change periodically. - - It is useful to generate an html file. After it is generated, - review it for correctness. - - As the third argument, pass in "tz.java". This will generate a - java source file that will be used to update the ICU4J data. - -4. Do a standard build. The build scripts will automatically detect - that a new .txt file is present and rebuild the binary data (using - gentz) from that. - -The .txt and .htm files and typically checked into CVS, whereas -the raw data files are not, since they are readily available from the -URL listed above. - -Additional steps are required to update the ICU4J data. First you -must have a current, working installation of icu4j. These instructions -will assume it is in directory "/icu4j". - -5. Copy the tz.java file generated in step 3 to /icu4j/tz.java. - -6. Change to the /icu4j directory and compile the tz.java file, with - /icu4j/classes on the classpath. - -7. Run the resulting java program (again with /icu4j/classes on the - classpath) and capture the output in a file named tz.tmp. - -8. Open /icu4j/src/com/ibm/util/TimeZoneData.java. Delete the section - that starts with the line "BEGIN GENERATED SOURCE CODE" and ends - with the line "END GENERATED SOURCE CODE". Replace it with the - contents of tz.tmp. If there are extraneous control-M characters - or other similar problems, fix them. - -9. Rebuild icu4j and make sure there are no build errors. Rerun all - the tests in /icu4j/src/com/ibm/test/timezone and make sure they - all pass. If all is well, check the new TimeZoneData.java into - CVS. - - -ALIAS TABLE ------------ -For backward compatibility, we define several three-letter IDs that -have been used since early ICU and correspond to IDs used in old JDKs. -These IDs are listed in tz.alias. The tz.pl script processes this -alias table and issues errors if there are problems. - - -IDS ---- -All *system* zone IDs must consist only of characters in the invariant -set. See utypes.h for an explanation of what this means. If an ID is -encountered that contains a non-invariant character, tz.pl complains. -Non-system zones may use non-invariant characters. - - -Etc/GMT... ----------- -Users may be confused by the fact that various zones with names of the -form Etc/GMT+n appear to have an offset of the wrong sign. For -example, Etc/GMT+8 is 8 hours *behind* GMT; that is, it corresponds to -what one typically sees displayed as "GMT-8:00". The reason for this -inversion is explained in the UNIX zone data file "etcetera". -Briefly, this is done intentionally in order to comply with -POSIX-style signedness. In ICU we reproduce the UNIX zone behavior -faithfully, including this confusing aspect. diff --git a/icuSources/tools/gentz/tz.bat b/icuSources/tools/gentz/tz.bat deleted file mode 100644 index 1e5798c3..00000000 --- a/icuSources/tools/gentz/tz.bat +++ /dev/null @@ -1,17 +0,0 @@ -@echo off -REM Copyright (C) 1999, International Business Machines -REM Corporation and others. All Rights Reserved. - -REM This script is a Windows launcher for the tz.pl script. For this -REM to work, the perl executable must be on the path. We recommend -REM the ActiveState build; see http://www.activestate.com. See the -REM tz.pl script itself for more documentation. - -if "%OS%" == "Windows_NT" goto WinNT -perl -w -x -S "tz.pl" %1 %2 %3 %4 %5 %6 %7 %8 %9 -goto end -:WinNT -perl -w -x -S "tz.pl" %* -if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto end -if %errorlevel% == 9009 echo You do not have Perl in your PATH. -:end diff --git a/icuSources/tools/gentz/tz.default b/icuSources/tools/gentz/tz.default deleted file mode 100644 index 9883feea..00000000 --- a/icuSources/tools/gentz/tz.default +++ /dev/null @@ -1,42 +0,0 @@ -###################################################################### -# Copyright (C) 1999-2003, International Business Machines -# Corporation and others. All Rights Reserved. -###################################################################### -# Default zone list. If ICU cannot find an exact match for the host -# time zone, it picks a zone that matches the host offset. There may -# be many such zones, however, so it must know which one to select. -# -# This list is read by tz.pl and the default names listed here are -# incorporated into the tz.txt file as preferred default zones. -# Any conflicts (multiple defaults for the same offset) or absences -# (no defaults specified for an offset) are reported. -# -# Format: default_name # optional comment - -Africa/Addis_Ababa -Africa/Cairo -America/Anchorage -America/Buenos_Aires -America/Chicago -America/Denver -America/New_York -America/Los_Angeles -America/Puerto_Rico -America/St_Johns -Asia/Calcutta -Asia/Dhaka # spelling changed in 2000h; was Asia/Dacca -Asia/Karachi -Asia/Riyadh89 # Pick the chronologically lastest of this group -Asia/Saigon -Asia/Shanghai -Asia/Tokyo -Asia/Yerevan -Atlantic/Azores # Windows lists Azores, Cape Verde -Australia/Darwin -Australia/Sydney -Europe/Paris -GMT -Pacific/Apia -Pacific/Auckland -Pacific/Guadalcanal -Pacific/Honolulu diff --git a/icuSources/tools/gentz/tz.pl b/icuSources/tools/gentz/tz.pl deleted file mode 100644 index f44a1af7..00000000 --- a/icuSources/tools/gentz/tz.pl +++ /dev/null @@ -1,1598 +0,0 @@ -#!/usr/bin/perl -###################################################################### -# Copyright (C) 1999-2003, International Business Machines -# Corporation and others. All Rights Reserved. -###################################################################### -# See: ftp://elsie.nci.nih.gov/pub/tzdata<year> -# where <year> is "1999b" or a similar string. -###################################################################### -# This script takes time zone data in elsie.nci.nih.gov format and -# parses it into a form usable by ICU. The raw data contains more -# data than we need, since it contains historical zone data. We -# parse out the current zones and create a listing of current zones. -# Author: Alan Liu -###################################################################### -# This script reads an alias table, $TZ_ALIAS, and creates clones of -# standard UNIX zones with alias names. -###################################################################### -# To update the zone data, download the latest data from the NIH URL -# listed above into a directory. Run this script with the directory -# name as an argument. THE DIRECTORY NAME MUST END IN tzdataYYYYR. -###################################################################### -# OUTPUT FILE FORMAT (filename $OUT) -# -# As a matter of policy, this script wants to do as much of -# the parsing, data processing, and error checking as possible, -# leaving the C++ program that parses this file to just do the binary -# translation step. -# -# - The file is line based, with one record per line. -# - Lines may be followed by a comment; the parser must ignore -# anything of the form /\s+#.*$/ in each line. -# |3065,14400 # Asia/Dubai GMT+4:00 -# - The file contains a header and 4 lists. -# - The header contains the version of this data file: -# 2 original version, without equivalency groups -# 3 current version, described here -# then the version of the unix data, and other counts: -# | 3 # format version number of this file -# | 1999 # (tzdata1999j) version of Olson zone -# | 10 # data from ftp://elsie.nci.nih.gov -# | 402 # total zone count -# | 40 # maximum zones per offset (used by gentz) -# - Lists start with a count of the records to follow, the records -# themselves (one per line), and a single line with the keyword -# 'end'. -# - The first list is the name table: -# | 387 # count of names to follow -# | 34,Africa/Abidjan -# | 23,Africa/Accra -# ... -# | end -# Each name is terminated by a newline (like all lines in the file). -# The zone numbers in other lists refer to this table. The -# integer that precedes the name is an index into the equivalency -# table, with the first table entry being entry 0. -# - The second list is the equivalency table. It lists, in sorted -# order, the equivalency groups. Each group represents a -# set of one or more zones that have the same GMT offset and the -# same rules. While there are about 400 zones, there are less than -# 120 equivalency groups (as of this writing). -# | 120 # count of equivalency groups to follow -# | s,0,1,0 # GMT+0:00 -# | d,0,8,1,0,0,w,11,31,0,0,w,20,4,15,16,17,18 # GMT+0:00 Sep 1... -# ... -# | end -# Entries start with 's' for standard zones, or 'd' for DST zones. -# Both zone descriptors start with the GMT offset in SECONDS. DST -# zones contain, in addition, data for the onset rule and the cease -# rule. Each rule is described by the following integers: -# month (JAN = 0) -# dowim } These two values are in SimpleTimeZone encoded -# dow } format for DOM, DOWIM, DOW>=DOM, or DOW<=DOM. -# time MINUTES -# time mode ('w', 's', 'u') -# The last rule integer in the record is the DST savings in MINUTES, -# typically 60. - -# After either a standard or a DST zone, there is a list of the -# members of the equivalency group. This consists of a number of -# entries to follow (>=1), then the zone numbers themselves. -# - The third list is an index by GMT offset. Each line lists the -# zones with the same offset. The first number on the line is the -# GMT offset in seconds. The second number is the default zone -# number in the following list, taken from tz.default. The list -# consists of a number of entries to follow (>=1), then the zone -# numbers themselves. -# | 39 # index by offset entries to follow -# | -43200,280,1,280 # -12:00 d=Etc/GMT+12 Etc/GMT+12 -# | -39600,374,6,279,366,374,394,396,399 # -11:00 d=Pacific/Apia Etc/GMT+11 MIT Pacific/Apia Pacific/Midway Pacific/Niue Pacific/Pago_Pago -# ... -# | end -# - The fourth list is an index by ISO 3166 country code. Each line -# lists a country and the zones mapped into that country by the -# zone.tab file. Zones not mapped into any file are listed on the -# first line. The first number on each line is the intcode for the -# country code. The intcode for 'US' for example is ('U'-'A') * 32 -# + ('S' - 'A') == 658. The second number is the count of list -# items, and the following number are the zone indices. -# | 238 # index by country entries to follow -# | 0,38,230,231,232,276,282,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,364,380,429,431 # (None) Asia/Riyadh87 Asia/Riyadh88 Asia/Riyadh89 CET EET Etc/GMT Etc/GMT+1 Etc/GMT+10 Etc/GMT+11 Etc/GMT+12 Etc/GMT+2 Etc/GMT+3 Etc/GMT+4 Etc/GMT+5 Etc/GMT+6 Etc/GMT+7 Etc/GMT+8 Etc/GMT+9 Etc/GMT-1 Etc/GMT-10 Etc/GMT-11 Etc/GMT-12 Etc/GMT-13 Etc/GMT-14 Etc/GMT-2 Etc/GMT-3 Etc/GMT-4 Etc/GMT-5 Etc/GMT-6 Etc/GMT-7 Etc/GMT-8 Etc/GMT-9 Etc/UCT Etc/UTC GMT MET UTC WET -# | 3,1,314 # AD (Andorra) Europe/Andorra -# | 4,1,199 # AE (United Arab Emirates) Asia/Dubai -# | ... -# | 822,2,28,275 # ZW (Zimbabwe) Africa/Harare CAT -# | end -###################################################################### -# As of 1999j, here are the various possible values taken by the -# rule fields. See code below that generates this data. -# -# at: 0:00, 0:00s, 1:00, 1:00s, 1:00u, 23:00s, 2:00, 2:00s, 2:30, 2:45s, -# 3:00, 3:00s -# in: Apr, Dec, Feb, Jan, Jun, Mar, May, Nov, Oct, Sep -# letter: -, D, GHST, GMT, HS, S, SLST -# on: 1, 12, 15, 18, 2, 20, 21, 22, 23, 25, 28, 3, 30, 31, 4, 7, Fri>=1, -# Fri>=15, Sat>=1, Sat>=15, Sun<=14, Sun>=1, Sun>=10, Sun>=11, Sun>=15, -# Sun>=16, Sun>=23, Sun>=8, Sun>=9, lastFri, lastSun, lastThu -# save: 0, 0:20, 0:30, 1:00 -# type: - - -require 5; # Minimum version of perl needed -use strict; -use Getopt::Long; -use vars qw(@FILES $YEAR $DATA_DIR $OUT $SEP @MONTH - $VERSION_YEAR $VERSION_SUFFIX $RAW_VERSION - $TZ_ALIAS $TZ_DEFAULT $URL $TXT_FILE $HTML_FILE $JAVA_FILE - $TZ_TXT_VERSION %ZONE_ID_TO_INDEX $END_MARKER - %COUNTRY_CODES); -require 'dumpvar.pl'; -use tzparse; -use tzutil; - -# Current version of the data file. Matches formatVersion[0] in the -# binary data file. SEE tzdat.h -# 1 - unreleased version (?) -# 2 - original version -# 3 - added equivalency groups -# 4 - added country code index -$TZ_TXT_VERSION = 4; - -# File names -$TZ_ALIAS = 'tz.alias'; -$TZ_DEFAULT = 'tz.default'; - -# Source of our data -$URL = "ftp://elsie.nci.nih.gov/pub"; - -# Separator between fields in the output file -$SEP = ','; # Don't use ':'! - -# Marker between sections -$END_MARKER = 'end'; - -@FILES = qw(africa - antarctica - asia - australasia - backward - etcetera - europe - factory - northamerica - pacificnew - solar87 - solar88 - solar89 - southamerica); - -# We get the current year from the system here. Later -# we double check this against the zone data version. -$YEAR = 1900+@{[localtime]}[5]; # Get the current year - -$DATA_DIR = shift; - -if (!$DATA_DIR || ! -d $DATA_DIR) { - print STDERR "No data directory or invalid directory specified\n\n"; - usage(); -} - -$TXT_FILE = ''; -$HTML_FILE = ''; -$JAVA_FILE = ''; -while (@ARGV) { - local $_ = shift; - if (/\.java$/i) { - if ($JAVA_FILE) { - print STDERR "Error: Multiple java files specified\n"; - usage(); - } - $JAVA_FILE = $_; - } elsif (/\.html?$/i) { - if ($HTML_FILE) { - print STDERR "Error: Multiple html files specified\n"; - usage(); - } - $HTML_FILE = $_; - } elsif (/\.txt$/i) { - if ($TXT_FILE) { - print STDERR "Error: Multiple txt files specified\n"; - usage(); - } - $TXT_FILE = $_; - } else { - print STDERR "Error: Unexpected command line parameter \"$_\"\n"; - usage(); - } -} - -if (!($TXT_FILE || $JAVA_FILE || $HTML_FILE)) { - print STDERR "Nothing to do! Please specify one or more output files.\n"; - usage(); -} - -if ($DATA_DIR =~ /(tzdata(\d{4})(\w?))/) { - $RAW_VERSION = $1; - $VERSION_YEAR = $2; - $VERSION_SUFFIX = $3; - if ($YEAR != $VERSION_YEAR) { - print STDERR "WARNING: You appear to be building $VERSION_YEAR data. Don't you want to use current $YEAR data?\n\n"; - #usage(); # Add an override option for this check, if needed - } - $VERSION_SUFFIX =~ tr/a-z/A-Z/; - if ($VERSION_SUFFIX =~ /[A-Z]/) { - $VERSION_SUFFIX = ord($VERSION_SUFFIX) - ord('A') + 1; - } else { - if ($VERSION_SUFFIX) { - print STDERR "Warning: Ignoring version suffix '$VERSION_SUFFIX' for \"$DATA_DIR\"\n"; - } - $VERSION_SUFFIX = 0; - } - print "Time zone version $RAW_VERSION = $VERSION_YEAR($VERSION_SUFFIX)\n"; -} else { - print STDERR "The directory specified doesn't contain \"tzdataNNNNR\", so I can't tell what version the data is. Please rename the directory and try again.\n"; - usage(); -} - -@MONTH = qw(jan feb mar apr may jun - jul aug sep oct nov dec); - -main(); -exit(); - -sub usage { - print STDERR "Usage: $0 data_dir [txt_out] [html_out] [java_out]\n\n"; - print STDERR " data_dir contains the unpacked files from\n"; - print STDERR " $URL/tzdataYYYYR,\n"; - print STDERR " where YYYY is the year and R is the revision\n"; - print STDERR " letter.\n"; - print STDERR "\n"; - print STDERR " Files that are expected to be present are:\n"; - print STDERR " ", join(", ", @FILES), "\n"; - print STDERR "\n"; - print STDERR " [txt_out] optional name of .txt file to output\n"; - print STDERR " [html_out] optional name of .htm|.html file to output\n"; - print STDERR " [java_out] optional name of .java file to output\n"; - exit 1; -} - -sub main { - my (%ZONES, %RULES, @EQUIV, %LINKS, %COUNTRIES); - - print "Reading"; - foreach (@FILES) { - if (! -e "$DATA_DIR/$_") { - print STDERR "\nMissing file $DATA_DIR/$_\n\n"; - usage(); - } - print "."; - TZ::ParseFile("$DATA_DIR/$_", \%ZONES, \%RULES, \%LINKS, $YEAR); - } - print "done\n"; - - # Add country data from zone.tab - TZ::ParseZoneTab("$DATA_DIR/zone.tab", \%ZONES, \%LINKS); - - # We'll also read the iso3166.tab file here. We don't really need - # this except for documentation purposes (in generated files) - # and for the HTML file. - local(*FILE); - open(FILE, "$DATA_DIR/iso3166.tab") or die "Can't open $DATA_DIR/iso3166.tab"; - while (<FILE>) { - s/\#.*//; - next unless (/\S/); - s/\s+$//; - if (/^([A-Z]{2})\s+(\S.*)/) { - $COUNTRY_CODES{$1} = $2; # Map from code to country name - } else { - print STDERR "Ignoring $DATA_DIR/iso3166.tab line: $_"; - } - } - close(FILE); - - TZ::Postprocess(\%ZONES, \%RULES); - - my $aliases = incorporateAliases($TZ_ALIAS, \%ZONES, \%LINKS); - - print - "Read ", scalar keys %ZONES, " current zones and ", - scalar keys %RULES, " rules for $YEAR\n"; - - # Make sure we have a zone named GMT from either the - # UNIX data or the alias table. If not, add one. - if (!exists $ZONES{GMT}) { - print "Adding GMT zone\n"; - my %GMT = ('format' => 'GMT', - 'gmtoff' => '0:00', - 'rule' => $TZ::STANDARD, - 'until' => ''); - $ZONES{GMT} = \%GMT; - } - - # Validate names - foreach my $z (keys %ZONES) { - # Make sure zone IDs only contain invariant chars - assertInvariantChars($z); - } - - # Create the offset index table, that includes the zones - # for each offset and the default zone for each offset. - # This is a hash{$name -> array ref}. Element [0] of - # the array is the default name. Elements [1..n] are the - # zones for the offset, in sorted order, including the default. - my $offsetIndex = createOffsetIndex(\%ZONES, $TZ_DEFAULT); - - # Group zones into equivalency groups - TZ::FormZoneEquivalencyGroups(\%ZONES, \%RULES, \@EQUIV); - print - "Equivalency groups (including unique zones): ", - scalar @EQUIV, "\n"; - - # Sort equivalency table first by GMT offset, then by - # alphabetic order of encoded rule string. - @EQUIV = sort { my $x = $ZONES{$a->[0]}; - my $y = $ZONES{$b->[0]}; - TZ::ParseOffset($x->{gmtoff}) <=> - TZ::ParseOffset($y->{gmtoff}) || - TZ::ZoneCompare($x, $y, \%RULES); } @EQUIV; - - # Sort the zones in each equivalency table entry - foreach my $eg (@EQUIV) { - next unless (@$eg > 1); # Skip single-zone entries - my @zoneList = sort @$eg; - $eg = \@zoneList; - } - - # Create an index from zone ID to index # - my $i = 0; - foreach my $z (sort keys %ZONES) { - $ZONE_ID_TO_INDEX{$z} = $i++; - } - - # Create the country -> zone array hash - # This hash has the form: - # $COUNTRIES{'US'}->{zones}->[13] == "America/Los_Angeles" - # $COUNTRIES{'US'}->{intcode} == 658 - - # Some zones are not affiliated with any country (e.g., UTC). We - # use a fake country code for these, chosen to precede any real - # country code. 'A' or 'AA' work. - my $NONE = 'A'; - foreach (sort keys %ZONES) { - my $country = $ZONES{$_}->{country}; - $country = $NONE unless ($country); - push @{$COUNTRIES{$country}->{zones}}, $_; - } - foreach my $country (keys %COUNTRIES) { - # Compute the int code, which is just a numerical - # rep. of the two letters. Use 0 to represent no - # country; this MUST BE CHANGED if AA ever becomes - # a valid country code. - my $intcode = 0; - if ($country ne $NONE) { - if ($country =~ /^([A-Z])([A-Z])$/) { - $intcode = ((ord($1) - ord('A')) << 5) | - (ord($2) - ord('A')); - } else { - die "Can't parse country code $country"; - } - } - $COUNTRIES{$country}->{intcode} = $intcode; - } - - # Emit the text file - if ($TXT_FILE) { - emitText($TXT_FILE, \%ZONES, \%RULES, \@EQUIV, $offsetIndex, $aliases, - \%COUNTRIES); - print "$TXT_FILE written.\n"; - } - - # Emit the Java file - if ($JAVA_FILE) { - emitJava($JAVA_FILE, \%ZONES, \%RULES, \@EQUIV, $offsetIndex, $aliases, - \%COUNTRIES); - print "$JAVA_FILE written.\n"; - } - - # Emit the HTML file - if ($HTML_FILE) { - emitHTML($HTML_FILE, \%ZONES, \%RULES, \@EQUIV, $offsetIndex, $aliases, - \%COUNTRIES); - print "$HTML_FILE written.\n"; - } - - #::dumpValue($ZONES{"America/Los_Angeles"}); - #::dumpValue($RULES{"US"}); - #::dumpValue($RULES{"Tonga"}); - - # Find all the different values of rule fields: - # in, at, on, save, type, letter - if (0) { - my %RULEVALS; - foreach my $ruleName (keys %RULES) { - for (my $i=0; $i<2; ++$i) { - foreach my $key (qw(in on at save type letter)) { - if (@{$RULES{$ruleName}} < 2) { - print $ruleName, ":"; - ::dumpValue($RULES{$ruleName}); - } - my $x = $RULES{$ruleName}->[$i]->{$key}; - $RULEVALS{$key}->{$x} = 1; - } - } - } - foreach my $key (sort keys %RULEVALS) { - print "$key: ", join(", ", sort keys %{$RULEVALS{$key}}), "\n"; - } - } -} - -# Create an index of all the zones by GMT offset. This index will -# list the zones for each offset and also the default zone for that -# offset. -# -# Param: Ref to zone table -# Param: Name of default file -# -# Return: ref to hash; the hash has offset integers as keys and arrays -# of zone names as values. If there are n zone names at an offset, -# the array contains n+1 items. The first item, [0], is the default -# zone. Items [1..n] are the zones sorted lexically. Thus the -# default appears twice, once in slot [0], and once somewhere in -# [1..n]. -sub createOffsetIndex { - my $zones = shift; - my $defaultFile = shift; - - # Create an index by gmtoff. - my %offsetMap; - foreach (sort keys %{$zones}) { - my $offset = TZ::ParseOffset($zones->{$_}->{gmtoff}); - push @{$offsetMap{$offset}}, $_; - } - - # Select defaults. We do this by reading the file $defaultFile. - # If there are multiple errors, we want to report them all, - # so we set a flag and die at the end if there are problems. - my %defaults; # key=offset integer, value=zone name - my $ok = 1; - open(IN, $defaultFile) or die "Can't open $defaultFile: $!"; - while (<IN>) { - my $raw = $_; - s/\#.*//; # Trim comments - next unless (/\S/); # Skip blank lines - if (/^\s*(\S+)\s*$/) { - my $z = $1; - if (! exists $zones->{$z}) { - print "Error: Nonexistent zone $z listed in $defaultFile line: $raw"; - $ok = 0; - next; - } - my $offset = TZ::ParseOffset($zones->{$z}->{gmtoff}); - if (exists $defaults{$offset}) { - print - "Error: Offset ", formatOffset($offset), " has both ", - $defaults{$offset}, " and ", $z, - " specified as defaults\n"; - $ok = 0; - next; - } - $defaults{$offset} = $z; - } else { - print "Error: Can't parse line in $defaultFile: $raw"; - $ok = 0; - } - } - close(IN); - die "Error: Aborting due to errors in $defaultFile\n" unless ($ok); - print "Incorporated ", scalar keys %defaults, " defaults from $defaultFile\n"; - - # Go through and record the default for each GMT offset, and unshift - # it into slot [0]. - # Fill in the blanks, since the default table will typically - # not list a default for every single offset. - my $missing; - foreach my $gmtoff (keys %offsetMap) { - my $aref = $offsetMap{$gmtoff}; - my $def; - if (exists $defaults{$gmtoff}) { - $def = $defaults{$gmtoff}; - } else { - # If there is an offset for which we have no listed default - # in $defaultFile, we try to figure out a reasonable default - # ourselves. We ignore any zone named Etc/ because that's not - # a "real" zone; it's just one listed as a POSIX convience. - # We take the first (alphabetically) zone of what's left, - # and if there are more than one of those, we emit a warning. - - my $ambiguous; - # Ignore zones named Etc/ and take the first one we otherwise see; - # if there is more than one of those, emit a warning. - foreach (sort @{$aref}) { - next if (m|^Etc/|i); - if (!$def) { - $def = $_; - } else { - $ambiguous = 1; - } - } - $def = $aref->[0] unless ($def); - if ($ambiguous) { - $missing = 1; - print - "Warning: No default for GMT", formatOffset($gmtoff), - ", using ", $def, "\n"; - } - } - # Push $def onto front of list - unshift @{$aref}, $def; - } - print "Defaults may be specified in $TZ_DEFAULT\n" if ($missing); - - return \%offsetMap; -} - -# Given a zone and an offset index, return the gmtoff if the name -# is a default zone, otherwise return ''. -# Param: zone name -# Param: zone offset, as a string (that is, raw {gmtoff}) -# Param: ref to offset index hash -sub isDefault { - my $name = shift; - my $offset = shift; - my $offsetIndex = shift; - my $aref = $offsetIndex->{TZ::ParseOffset($offset)}; - return ($aref->[0] eq $name); -} - -# Emit a text file that contains data for the system time zones. -# Param: File name -# Param: ref to zone hash -# Param: ref to rule hash -# Param: ref to equiv table -# Param: ref to offset index -# Param: ref to alias hash -sub emitText { - my $file = shift; - my $zones = shift; - my $rules = shift; - my $equiv = shift; - my $offsetIndex = shift; - my $aliases = shift; - my $countries = shift; - - # Find the maximum number of zones with the same value of - # gmtOffset. - my %perOffset; # Hash of offset -> count - foreach my $z (keys %$zones) { - # Use TZ::ParseOffset to normalize values - probably unnecessary - ++$perOffset{TZ::ParseOffset($zones->{$z}->{gmtoff})}; - } - my $maxPerOffset = 0; - foreach (values %perOffset) { - $maxPerOffset = $_ if ($_ > $maxPerOffset); - } - - # Count maximum number of zones per equivalency group - my $maxPerEquiv = 0; - foreach my $eg (@$equiv) { - $maxPerEquiv = @$eg if (@$eg > $maxPerEquiv); - } - - # Count total name size - my $name_size = 0; - foreach my $z (keys %$zones) { - $name_size += 1 + length($z); - } - - local(*OUT); - open(OUT,">$file") or die "Can't open $file for writing: $!"; - - ############################################################ - # EMIT HEADER - ############################################################ - # Zone data version - print OUT "#####################################################################\n"; - print OUT "# Copyright (C) 2000-$YEAR, International Business Machines Corporation and\n"; - print OUT "# others. All Rights Reserved.\n"; - print OUT "#####################################################################\n"; - print OUT "#--- Header --- Generated by tz.pl\n"; - print OUT $TZ_TXT_VERSION, " # format version number of this file\n"; - print OUT $VERSION_YEAR, " # ($RAW_VERSION) version of Olson zone\n"; - print OUT $VERSION_SUFFIX, " # data from $URL\n"; - print OUT scalar keys %$zones, " # total zone count\n"; - # The following counts are all used by gentz during its parse - # of the tz.txt file and creation of the tz.dat file, even - # if they don't show up in the tz.dat file header. For example, - # gentz needs the maxPerOffset to preallocate the offset index - # entries. It needs the $name_size to allocate the big buffer - # that will receive all the names. - print OUT scalar @$equiv, " # equivalency groups count\n"; - print OUT $maxPerOffset, " # max zones with same gmtOffset\n"; - print OUT $maxPerEquiv, " # max zones in an equivalency group\n"; - print OUT $name_size, " # length of name table in bytes\n"; - print OUT $END_MARKER, "\n\n"; - - ############################################################ - # EMIT ZONE TABLE - ############################################################ - # Output the name table, followed by 'end' keyword - print OUT "#--- Zone table ---\n"; - print OUT "#| equiv_index,name\n"; - print OUT scalar keys %$zones, " # count of zones to follow\n"; - - # IMPORTANT: This sort must correspond to the sort - # order of UnicodeString::compare. That - # is, it must be a plain sort. - foreach my $z (sort keys %$zones) { - # Make sure zone IDs only contain invariant chars - assertInvariantChars($z); - - print OUT equivIndexOf($z, $equiv), ',', $z, "\n"; - } - print OUT $END_MARKER, "\n\n"; - - ############################################################ - # EMIT EQUIVALENCY TABLE - ############################################################ - print OUT "#--- Equivalency table ---\n"; - print OUT "#| ('s'|'d'),zone_spec,id_count,id_list\n"; - print OUT scalar @$equiv, " # count of equivalency groups to follow\n"; - my $i = 0; - foreach my $aref (@$equiv) { - # $aref is an array ref; the array is full of zone IDs - # Use the ID of the first array element - my $z = $aref->[0]; - - # Output either 's' or 'd' to indicate standard or DST - my $isStd = ($zones->{$z}->{rule} eq $TZ::STANDARD); - if (!$isStd) { - my $rule = $rules->{$zones->{$z}->{rule}}; - if (!(@{$rule} >= 4 && ($rule->[3] & 1) && ($rule->[3] & 2))) { - $isStd = 1; - } - } - - print OUT $isStd ? 's,' : 'd,'; - - # Format the zone - my ($spec, $notes) = formatZone($z, $zones->{$z}, $rules); - - # Now add the equivalency list - push @$spec, scalar @$aref; - push @$notes, "["; - my $min = -1; - foreach $z (@$aref) { - my $index = $ZONE_ID_TO_INDEX{$z}; - # Make sure they are in order - die("Unsorted equiv table indices") if ($index <= $min); - $min = $index; - push @$spec, $index; - push @$notes, $z; - } - push @$notes, "]"; - - unshift @$notes, $i++; # Insert index of this group at front - print OUT join($SEP, @$spec) . " # " . join(' ', @$notes), "\n"; - } - print OUT $END_MARKER, "\n\n"; - - ############################################################ - # EMIT INDEX BY GMT OFFSET - ############################################################ - # Create a hash mapping zone name -> integer, from 0..n-1. - # Create an array mapping zone number -> name. - my %zoneNumber; - my @zoneName; - $i = 0; - foreach (sort keys %$zones) { - $zoneName[$i] = $_; - $zoneNumber{$_} = $i++; - } - - # Emit offset index - print OUT "#--- Offset INDEX ---\n"; - print OUT "#| gmt_offset,default_id,id_count,id_list\n"; - print OUT scalar keys %{$offsetIndex}, " # index by offset entries to follow\n"; - foreach (sort {$a <=> $b} keys %{$offsetIndex}) { - my $aref = $offsetIndex->{$_}; - my $def = $aref->[0]; - # Make a slice of 1..n - my @b = @{$aref}[1..$#{$aref}]; - print OUT - $_, ",", $zoneNumber{$def}, ",", - scalar @b, ",", - join(",", map($zoneNumber{$_}, @b)), - " # ", formatOffset($_), " d=", $def, " ", - join(" ", @b), "\n"; - } - - print OUT $END_MARKER, "\n\n"; - - ############################################################ - # EMIT INDEX BY COUNTRY - ############################################################ - print OUT "#--- Country INDEX ---\n"; - print OUT "#| country_int_code,id_count,id_list\n"; - print OUT scalar keys %$countries, " # index by country entries to follow\n"; - foreach my $country (sort keys %$countries) { - my $intcode = $countries->{$country}->{intcode}; - my $aref = $countries->{$country}->{zones}; - print OUT - $intcode, ",", scalar @$aref, ",", - join(",", map($zoneNumber{$_}, @$aref)), " # ", - ($intcode ? ($country . " (" . $COUNTRY_CODES{$country} . ") ") : "(None) "), - join(" ", @$aref), "\n"; - } - - print OUT $END_MARKER, "\n"; - - ############################################################ - # END - ############################################################ - close(OUT); -} - -# Emit a Java file that contains data for the system time zones. -# Param: File name -# Param: ref to zone hash -# Param: ref to rule hash -# Param: ref to equiv table -# Param: ref to offset index -# Param: ref to alias hash -sub emitJava { - my $file = shift; - my $zones = shift; - my $rules = shift; - my $equiv = shift; - my $offsetIndex = shift; - my $aliases = shift; - my $countries = shift; - - my $_indent = " "; - - ############################################################# - # Zone table - my $_IDS; - foreach my $z (sort keys %$zones) { - $_IDS .= "$_indent\"$z\",\n"; - } - - ############################################################# - # Equivalency table - # - While we output this, keep track of a mapping from equivalency table ID - # (a value from, e.g., 0..114) to equivalency int[] array index (e.g., - # 0, 15, 30, 34, etc.). - my $_DATA; - - my %equiv_id_to_index; - my $i = 0; - my $index = 0; - foreach my $aref (@$equiv) { - $equiv_id_to_index{$i} = $index; - - # $aref is an array ref; the array is full of zone IDs - # Use the ID of the first array element - my $z = $aref->[0]; - - $_DATA .= $_indent; # Indent - - # Output either 's' or 'd' to indicate standard or DST - my $isStd = ($zones->{$z}->{rule} eq $TZ::STANDARD); - if (!$isStd) { - my $rule = $rules->{$zones->{$z}->{rule}}; - if (!(@{$rule} >= 4 && ($rule->[3] & 1) && ($rule->[3] & 2))) { - $isStd = 1; - } - } - $_DATA .= $isStd ? '0/*s*/,' : '1/*d*/,'; - - # Format the zone - my ($spec, $notes) = formatZone($z, $zones->{$z}, $rules); - - # Now add the equivalency list - push @$spec, scalar @$aref; - push @$notes, "["; - my $min = -1; - foreach $z (@$aref) { - my $index = $ZONE_ID_TO_INDEX{$z}; - # Make sure they are in order - die("Unsorted equiv table indices") if ($index <= $min); - $min = $index; - push @$spec, $index; - push @$notes, $z; - } - push @$notes, "]"; - - unshift @$notes, $i++; # Insert index of this group at front - - # Convert to Java constants: - # 'w' -> 0, 's' -> 1, 'u' -> 2 - foreach (@$spec) { - if (/^w$/) { - $_ = "0/*w*/"; - } elsif (/^s$/) { - $_ = "1/*s*/"; - } elsif (/^u$/) { - $_ = "2/*u*/"; - } - } - - $_DATA .= join($SEP, @$spec) . ", // " . join(' ', @$notes) . "\n"; - $index += (scalar @$spec) + 1; # +1 for s/d - } - - ############################################################# - # Zone->Equivalency mapping - my $_INDEX_BY_NAME; - foreach my $z (sort keys %$zones) { - $_INDEX_BY_NAME .= - $_indent . - $equiv_id_to_index{equivIndexOf($z, $equiv)} . - ", // $z\n"; - } - - ############################################################# - # Index by offset - # Create a hash mapping zone name -> integer, from 0..n-1. - # Create an array mapping zone number -> name. - my $_INDEX_BY_OFFSET; - my %zoneNumber; - my @zoneName; - $i = 0; - foreach (sort keys %$zones) { - $zoneName[$i] = $_; - $zoneNumber{$_} = $i++; - } - # Emit offset index - foreach (sort {$a <=> $b} keys %{$offsetIndex}) { - my $aref = $offsetIndex->{$_}; - my $def = $aref->[0]; - # Make a slice of 1..n - my @b = @{$aref}[1..$#{$aref}]; - $_INDEX_BY_OFFSET .= - $_indent . $_ . "," . $zoneNumber{$def} . "," . - scalar @b . "," . - join(",", map($zoneNumber{$_}, @b)) . - ", // " . formatOffset($_) . " d=" . $def . " " . - join(" ", @b) . "\n"; - } - - ############################################################ - # Index by country - my $_INDEX_BY_COUNTRY; - foreach my $country (sort keys %$countries) { - my $intcode = $countries->{$country}->{intcode}; - my $aref = $countries->{$country}->{zones}; - # Emit int code (n1*32 + n0), #of zones, - # and list of zones. - $_INDEX_BY_COUNTRY .= - $_indent . $intcode . ", " . - scalar(@$aref) . ", " . - join(", ", map($zoneNumber{$_}, @$aref)) . ", // " . - ($intcode ? ($country . " (" . $COUNTRY_CODES{$country} . ")") : "(None)") . ": " . - join(" ", @$aref) . - "\n"; - } - -############################################################ -# BEGIN JAVA TEMPLATE -############################################################ - my $java = <<"END"; -// Instructions: Build against icu4j. Run and save output. -// Paste output into icu4j/src/com/ibm/util/TimeZoneData.java -import com.ibm.icu.impl.Utility; -import java.util.Date; -public class tz { - public static void main(String[] args) { - System.out.println(" // BEGIN GENERATED SOURCE CODE"); - System.out.println(" // Date: " + new Date()); - System.out.println(" // Version: $RAW_VERSION from $URL"); - System.out.println(" // Tool: icu/source/tools/gentz"); - System.out.println(" // See: icu/source/tools/gentz/readme.txt"); - System.out.println(" // DO NOT EDIT THIS SECTION"); - System.out.println(); - - System.out.println(" /**"); - System.out.println(" * Array of IDs in lexicographic order. The INDEX_BY_OFFSET and DATA"); - System.out.println(" * arrays refer to zones using indices into this array. To map from ID"); - System.out.println(" * to equivalency group, use the INDEX_BY_NAME Hashtable."); - System.out.println(" * >> GENERATED DATA: DO NOT EDIT <<"); - System.out.println(" */"); - System.out.println(" static final String[] IDS = {"); - for (int i=0;i<IDS.length;++i) { - System.out.println(" \\\"" + IDS[i] + "\\\","); - } - System.out.println(" };\\n"); - - System.out.println(" /**"); - System.out.println(" * RLE encoded form of DATA."); - System.out.println(" * \@see com.ibm.util.Utility.RLEStringToIntArray"); - System.out.println(" * >> GENERATED DATA: DO NOT EDIT <<"); - System.out.println(" */"); - System.out.println(" static final String DATA_RLE ="); - System.out.println(Utility.formatForSource(Utility.arrayToRLEString(DATA))); - System.out.println(" ;\\n"); - - System.out.println(" /**"); - System.out.println(" * RLE encoded form of INDEX_BY_NAME_ARRAY."); - System.out.println(" * \@see com.ibm.util.Utility.RLEStringToIntArray"); - System.out.println(" * >> GENERATED DATA: DO NOT EDIT <<"); - System.out.println(" */"); - System.out.println(" static final String INDEX_BY_NAME_ARRAY_RLE ="); - System.out.println(Utility.formatForSource(Utility.arrayToRLEString(INDEX_BY_NAME_ARRAY))); - System.out.println(" ;\\n"); - - System.out.println(" /**"); - System.out.println(" * RLE encoded form of INDEX_BY_OFFSET."); - System.out.println(" * \@see com.ibm.util.Utility.RLEStringToIntArray"); - System.out.println(" * >> GENERATED DATA: DO NOT EDIT <<"); - System.out.println(" */"); - System.out.println(" static final String INDEX_BY_OFFSET_RLE ="); - System.out.println(Utility.formatForSource(Utility.arrayToRLEString(INDEX_BY_OFFSET))); - System.out.println(" ;\\n"); - - System.out.println(" /**"); - System.out.println(" * RLE encoded form of INDEX_BY_COUNTRY."); - System.out.println(" * \@see com.ibm.util.Utility.RLEStringToIntArray"); - System.out.println(" * >> GENERATED DATA: DO NOT EDIT <<"); - System.out.println(" */"); - System.out.println(" static final String INDEX_BY_COUNTRY_RLE ="); - System.out.println(Utility.formatForSource(Utility.arrayToRLEString(INDEX_BY_COUNTRY))); - System.out.println(" ;\\n"); - - System.out.println(" // END GENERATED SOURCE CODE"); - } - - static final String[] IDS = { -$_IDS - }; - - static final int[] DATA = { -$_DATA - }; - - static final int[] INDEX_BY_NAME_ARRAY = { -$_INDEX_BY_NAME - }; - - static final int[] INDEX_BY_OFFSET = { - // gmt_offset,default_id,id_count,id_list -$_INDEX_BY_OFFSET - }; - - static final int[] INDEX_BY_COUNTRY = { -$_INDEX_BY_COUNTRY - }; -} -END -############################################################ -# END JAVA TEMPLATE -############################################################ - - open(OUT, ">$file") or die "Can't open $file for writing: $!"; - print OUT $java; - close(OUT); -} - -# Emit an HTML file that contains a description of the system zones. -# Param: File name -# Param: ref to zone hash -# Param: ref to rule hash -# Param: ref to equiv table -# Param: ref to offset index -# Param: ref to alias hash -sub emitHTML { - my $file = shift; - my $zones = shift; - my $rules = shift; - my $equiv = shift; - my $offsetIndex = shift; - my $aliases = shift; - my $countries = shift; - - # These are variables for the template - my $_count = scalar keys %{$zones}; - my $_equiv = scalar @$equiv; - - # Build table in order of zone offset - my $_offsetTable = "<p><table>\n"; - foreach (sort {$a <=> $b} keys %{$offsetIndex}) { - my $aref = $offsetIndex->{$_}; - my $def = $aref->[0]; - # Make a slice of 1..n - my @b = @{$aref}[1..$#{$aref}]; - my $gmtoff = "GMT" . formatOffset($_); - $_offsetTable .= - "<tr valign=top>" . - "<td><a name=\"" . bookmark($gmtoff) . "\">$gmtoff</a></td>" . - "<td>" . - join(", ", map($_ eq $def ? - "<a href=\"#" . bookmark($_) . "\"><b>$_</b></a>" : - "<a href=\"#" . bookmark($_) . "\">$_</a>", @b)) . - "</td>" . - "</tr>\n"; - } - $_offsetTable .= "</table>\n"; - - # Build table in alphabetical order of zone name - my $_nameTable = "<p><table>\n"; - $_nameTable .= "<tr><td>ID</td>"; - $_nameTable .= "<td>Offset</td><td>DST Begins</td><td>DST Ends</td>"; - $_nameTable .= "<td>Savings</td><td></td></tr>\n"; - - $_nameTable .= "<tr><td><hr></td>"; - $_nameTable .= "<td><hr></td><td><hr></td>"; - $_nameTable .= "<td><hr></td><td><hr></td><td></td></tr>\n"; - # Need a reverse alias table - my %revaliases = reverse(%$aliases); - foreach my $z (sort keys %$zones) { - $_nameTable .= emitHTMLZone($z, $zones->{$z}, $rules, $offsetIndex, - $aliases, \%revaliases); - } - $_nameTable .= "</table>\n"; - - # Build equivalency group table - my $_equivTable = "<p><table>\n"; - $_equivTable .= "<tr><td>Offset</td><td>DST Begins</td><td>DST Ends</td>"; - $_equivTable .= "<td>Savings</td><td>Zones</td></tr>\n"; - - $_equivTable .= "<tr><td><hr></td>"; - $_equivTable .= "<td><hr></td><td><hr></td>"; - $_equivTable .= "<td><hr></td><td><hr></td><td><hr></td></tr>\n"; - - # Equiv table is sorted elsewhere -- output it in native order - foreach my $eg (@$equiv) { - $_equivTable .= emitHTMLEquiv($eg, $zones, $rules); - } - $_equivTable .= "</table>\n"; - - # Build country table - my $_countryTable; - $_countryTable .= "<p><table>\n"; - $_countryTable .= "<tr><td>Country</td><td>Zones</td></tr>\n"; - $_countryTable .= "<tr><td><hr></td><td><hr></td></tr>\n"; - - foreach my $country (sort keys %$countries) { - $_countryTable .= - "<tr valign=top><td nowrap>" . - (($country ne 'A') ? ($country . " (" . $COUNTRY_CODES{$country} . ")") : "(None)") . - "</td>" . "<td>" . - join(", ", map("<a href=\"#" . bookmark($_) . "\">$_</a>", @{$countries->{$country}->{zones}})) . - #join(", ", @{$countries->{$country}->{zones}}) . - "</td></tr>\n"; - } - $_countryTable .= "</table>\n"; - - # Time stamp - my $_timeStamp = localtime; - -############################################################ -# BEGIN HTML TEMPLATE -############################################################ - my $html = <<"END"; -<html> - -<head> -<title>ICU System Time Zones - - - - -

      ICU System Time Zones

      - - - - - - - - - - - - - - - - - - - - - - -
      Version$RAW_VERSION ($VERSION_YEAR.$VERSION_SUFFIX)
      Total zone count$_count in $_equiv equivalency groups
      Original source$URL
      AuthorAlan Liu <liuas\@us.ibm.com>
      This document generated$_timeStamp
      - -

      Background

      - -

      A time zone represents an offset applied to Greenwich Mean Time -(GMT) to obtain local time. The offset may vary throughout the year, -if daylight savings time (DST) is used, or may be the same all year -long. Typically, regions closer to the equator do not use DST. If DST -is in use, then specific rules define the point at which the offset -changes, and the amount by which it changes. Thus, a time zone is -described by the following information: - -

        -
      • An identifying string, or ID. This consists only of invariant characters (see the file utypes.h). - It typically has the format continent / city. The city chosen is - not the only city in which the zone applies, but rather a representative city for the - region. Some IDs consist of three or four uppercase letters; these are legacy zone - names that are aliases to standard zone names.
      • -
      • An offset from GMT, either positive or negative. Offsets range from approximately minus - half a day to plus half a day.
      • -
      - -

      If DST is observed, then three additional pieces of information are needed: - -

        -
      • The precise date and time during the year when DST begins. This is in the first - half of the year in the northern hemisphere, and in the second half of the year in the - southern hemisphere.
      • -
      • The precise date and time during the year when DST ends. This is in the first half - of the year in the southern hemisphere, and in the second half of the year in the northern - hemisphere.
      • -
      • The amount by which the GMT offset changes when DST is in effect. This is almost - always one hour.
      • -
      - -

      System and User Time Zones

      - -

      ICU supports local time zones through the classes -TimeZone and SimpleTimeZone in the C++ -API. In the C API, time zones are designated by their ID strings.

      - -

      Users may construct their own time zone objects by specifying the -above information to the C++ API. However, it is more typical for -users to use a pre-existing system time zone, since these represent -all current international time zones in use. This document lists the -system time zones, both in order of GMT offset, and in alphabetical -order of ID.

      - -

      Since this list changes one or more times a year, this document -only represents a snapshot. For the current list of ICU system -zones, use the method TimeZone::getAvailableIDs().

      - -

      Notes

      - -

      The zones are listed in binary sort order. That is, 'A' through -'Z' come before 'a' through 'z'. This is the same order in which the -zones are stored internally, and the same order in which they are -returned by TimeZone::getAvailableIDs(). The reason for -this is that ICU locates zones using a binary search, and the binary -search relies on this sort order.

      - -

      You may notice that zones such as Etc/GMT+1 -appear to have the wrong sign for their GMT offset. In fact, their -sign is inverted because the the Etc zones follow the POSIX sign -conventions. This is the way the original Olson data is set up, and -ICU reproduces the Olson data faithfully, including this confusing -aspect. See the Olson files for more details. - -

      References

      - -

      The ICU system time zones are derived from the Olson data at $URL. This is the data used by UNIX systems and is -updated one or more times each year. Unlike the Olson zone data, ICU -only contains data for current zone usage. There is no support for -historical zone data in ICU at this time.

      - -
      - -

      Time Zones in order of GMT offset

      - -

      Zone listed in bold are the default zone for a -given GMT offset. This default is used by ICU if it cannot identify -the host OS time zone by name. In that case, it uses the default zone -for the host zone offset.

      - -$_offsetTable -
      - -

      Time Zones in order of ID

      - -

      Zone listed in bold are the default zone for their -GMT offset. This default is used by ICU if it cannot identify the host -OS time zone by name. In that case, it uses the default zone for the -host zone offset. See above for a description of columns. See note above for an explanation of the -sort order.

      - -

      Times suffixed with 's' are in standard time. Times suffixed with 'u' are in UTC time. -Times without suffixes are in wall time (that is, either standard time or daylight savings -time, depending on which is in effect).

      - -$_nameTable -
      - -

      Time Zone Equivalency Groups

      - -

      ICU groups zones into equivalency groups. These are -groups of zones that are identical in GMT offset and in rules, but -that have different IDs. Knowledge of equivalency groups allows ICU -to reduce the amount of data stored. More importantly, it allows ICU -to apply data for one zone to other equivalent zones when appropriate -(e.g., in formatting). Equivalency groups are formed at build time, -not at runtime, so the runtime cost to lookup the equivalency group of -a given zone is negligible.

      - -$_equivTable -
      - -

      Time Zones by Country

      - -

      ICU captures and exports the country data from the Olson database. -The country code is the ISO 3166 two-letter code. Some zones have no -associated country; these are listed under the entry "(None)". - -$_countryTable - - -END -############################################################ -# END HTML TEMPLATE -############################################################ - - open(HTML, ">$file") or die "Can't open $file for writing: $!"; - print HTML $html; - close(HTML); -} - -# Make a bookmark name out of a string. This just means normalizing -# non-word characters. -sub bookmark { - local $_ = shift; - s/-/m/g; - s/\+/p/g; - s/\W//g; - $_; -} - -# Emit an equivalency group as an HTML table row. Return the string. -# Param: ref to array of zone IDs -# Param: ref to zone hash -# Param: ref to rule hash -sub emitHTMLEquiv { - my $eg = shift; - my $zone = shift; - my $rule = shift; - local $_ = "

    " . join(" ", @$eg) . "
    $gmtoff" . emitHTMLRule($rule->[0]) . "" . emitHTMLRule($rule->[1]) . "" . $rule->[0]->{save} . "
    " . ($isDefault?"":"") . - "$name" . ($isDefault?"":"") . "alias for $aliasalias $revalias
    ly-Ad-m3j3J(}jAJ|rB$7ljDWsA{IvGqLlPo4OiOEc1D$~ej zIyvN$M?Nzsppco&qKINjC}lQf%%PkLDw#_a)znZ+9rZNONE6Mp&`KNabkIo`-Sp6B zq46hxK>89yFd_7#KLZG5AcF{FFhdwhIKvpu2qK7NBvC{Y!ze}*OB`c}XDs6wPXdV~ zkxUAyq>)Yr6UZcsiA-WLQ<%y$vYAc}x#W@03<@Y@CbKA_m=a2vO&N12r-Dl6Qbjd2 z)KW)14K&h3GcB~zMmrsJ(nU8t^jT#52_TTZ1QARK{pimCLK(;)!WhgDh7!&&hBJZ) zA{j{((Zn!{(ZmwR7~&brIL4DeB1t5ZLMmyblfeWs$zmdtn9LNWGL3AelS3|fGRa8?$Ep^n>KqE~w z(?Tn4w9`Q+U3AmKa`)gBtYj6dS;Ievdlx;BuX)2ye(}LI>m#4|%oo1$jqm*6C%^dY z{QAOIzVV$O{Nxu~9sg}?X9qjk#cuX+m1|t*1~<9IZC>z__k7|rU--&5zVm~h{9>Qq zx}O6aX^MKLB6374f z?%(*GKlqd0{Ken=L$9N~i~f(__?>2-YoV1k+UcN^F1qPq9{(|)H@xK?@A<$-KJl3^ zeB~S8`N2CIpK%|G;-Z9RVDcmCi{dh-{5^AEks ztjBNs&L8|qZ~o$M{-M_#>+u`E^9O&@o4@#*f9O?iJ$~bN{@_n~^A~^f54|d^$8Y@3 zAN)yg{^D=`p;x8#_>JHBgForbU;NEK^qSkNxYL;ZpZtyA`GY^{&0qY@KlG}yO@8Bd z{@_n~^A~^f5520b$8Y@3AN)yg{-VqG{Vo5YSB-V~jo@0?7azK zRmJuAKkp?Mco76e78N83ARvT>v}ukOkS01G$g~`H=Bl>>v}ukOkS01G$g~ z`H*oHc902S$bxLhfn3Oge8{*OJII7EWI;CMKrZA#K4e^j9b`fnvLG9BAQ$o=A2P1R z4l*GOS&$7mkPCT`4;gE*gG>lR7Gy&X(@NAQQrn z1=)}TxsV6>kZ}WckO^VPf^5ivT*!lb$hZ+Z$b>LtK{n(-F62QzWZZ-uWI`CSARBTZ z7xEwR>(mfqR$tBOibV;URb!>R}^%4<3O>;W2m|o`CPelkgNg z4bQ+2;8}PMo`)CUhwvi21TRAayaJnGGyDjC3_pRN!q4DU_&NLnUW3=+m+&ii1KxyR z!xnf8-iF`6JMb>N2fu~i!Taz5d>v}ukOkS01G$g~`H*oNc902S$bxLhfn3Oge8{*RJII7EWI;CMKrZA#K4jd1 z9b`fnvLG9BAQ$o=A2RO54l*GOS&$7mkPCT`4;kyQgG>lR7Gy&X(fBAQQrn1=)}TxsV6>kZ})okO^VPf^5ivT*!lb$ha3f$b>LtK{n(- zF62QzWZZ`xWI`CSARBTZ7xEwJ_~4ak;$lFe@i9HGWR zGoz%cAV4^f7|q=~V3KE-R92N%l$&uyE5{TUSC*VxT2xKEN)%IzmX=hR!iw_h#ZA*x zWmBgvUs_yJIlio9X-Ro?m6=j8zo@Ka(l|4IMaj}-Wkr=^7Z+6)&99~wGj@4pWl8z` zQpy}Za~i+A7JnX0HYNc%-pn-9kU>CYQXybgnf{#qBz>HzFiVjVo?@1payMLPicDoB zye$%*gZ;U#ezqxz*v~W{n_~3s;W$Wx39)>N@-Ct@W2EbB-BpC@>)Wxl z^;c7a)pbyv_%WY6l@Yyz-uh%MC9m}>Y9l)9Uy)g$HP+XQ9}{2-NdKGyr^9z(0d&=P z5$#w-zkLkb;0yQ){ullQJItBbN#D((zr4OX5$~igMDOp%F=(TGT4YKid6!d?SI%-% z=7z_({Uhbfq|9npe=_^Y3s3d!k8#+{$EG8k4;Mi#Tn1ObRd6j_4>!TBa0lE4(jT@B zCHPgTy(E2Z+ai7GY3u8y&uzO_shz}a+e+1U*`JbL>h`t7=iu`WH*WWtw6jb#vVUw_ zt7w;ui28b|+qSuc@hSag_2Q>(|MG}dY;8X@wH3YXlcsvTwpLe>$4p<_vo6SdO-F99092Ngl;< z&N!<%2iw_PHs4G5bLbQ>HAhiKJ)gbJXO~b;bUv#tnN_;9Br-FNE3%4dMb*qkOmKGQ zibNwbSABgD9|Wp3NidOr$Fp~rvaRA@GRK;Dw5K%Lr?L4YkBq6P-k8IPk9Yqib3`wo z^g{PvvRUc=v;DsN)cX1m<=A|-lp&ha81X~$rE6-stF`mWYBS7SKz*y(GZ$bdWpsmH zAY)??$k@mQ_K%K_$w)b;^ktOwj>QjWQ^W_F@kwi;Q3ZA-=z=ZDC6 ziWx2ST`0r)=k-9e{hmf@5xWhvHrf`kYpM}D85dr8(%RUz%6uYYRrhCU!khUgL z28V0S0Mevw^4Z(*@)O_rKQjEM6qPSpUbKjl^rGcvY{l~O>Pk6dPnv4RESG7o3lb%kx*F2i^Afd;SUP^in`4ES2z1m!vw1M~r?3%Zc z`9Q7>3f%tf7~uMSWxzZ{eAamZ^Et?;!$lmc1jjK&yw70!1-hTj512Q~0;YgMj;IKj ztSW0O_A*x{FmcLwK2V=Kdl)0*P>yYpf{Z0;lZ4yiqXW*}aJ+GiQqD|Y$(&il*|U@x zvxsx1oN3EVvTo&y#2(Yb+;c;M`7!6Xr#Nq#F1L_+A4tDE!rpqEeIxb(=ADPpiSLgm zy`nlfRwi*~o#E;qL&`ZbU_LTWb4*D3ik zPRjB8@w8%ReeyJR?)H51v@*{}{qwZ89_wdRC-wXmK7!xFHuy7q1#(W8bNuQ2JDw}g z<>qYm;_+NRc1-S+Z17N1xqq zqT87C)1>cdpIV*t^P}2JuP5C>xni?6sa`E!PWnC?dwzbDd=i%ZxsKyoj%3NZ4!^!n z{wv)0_3Yhe$$gI-e^$%7M{|q)^}0vzVMN%m@et!gN|tuq$KHL`tw;LgXxfns{b3Lc zg<+5dd2j-ZhH)?f@_y8Asmv^iZyr>i7%vEv`<7o3+fF9r^oY z9)EjPF)r%sxdy7)U`#UC=E+=_C;yr_x1np=QBGIRsS{}akzBVGry-@T>N)y?LYyfQwbWhXO>+jEBhnzi{W*82KG zuw8%`&0Wt*opN28rm1PZD_vV>(-b?$Hg~-$=XbfjJO*U!90yq-<4Mld>-OC z>NuRjn47>g?ZwD7*zIk69md%7#@8;_ZILUwX0Fh;q*;G$f21)crTnJ)LT2)b zsxPM5PI)U`L?WvWt zW)ZPyD?5`ui+ZXUO{KJG5wf}!eJdsJsc&TtE2Kv0tJogi)wia5V0Zo8w9KZxx@(zD z(`6nJe@ZyoWBdJ3Us^f)B6*iRV9y1QV8?Z_c?mYd&){`<3%vVC+X(Lf9)D~y|Jc8) z<<5=Xx2ZXWx#wO8aE_DfKmXqWdz+8=Q^_|Uweo%q6$SB4pxQm&r;+g+z2{=@;fSZZ z(>qP<|KGbuBlmn|ZcK(_!8_-jK)3)Vg3O`b*~q&ev8Q`9V!xqDj_8@qUyf+KxiG5l zuR58_{r6{1B`#-x3aAE2_pY%LnGJd~N67UQe}irtC4xY8$){=KP$UN$4}%Y zK#T7b?D;&m`}1S;2Fc>0^L%$mPMO)<9SpB6J-HAO9-@8z`vpUo4CH=+eB^$Ce69{N z|FJXWe!;sVIR<5?x*vzpelYGAu#fau6WJCY$GPq($GHJ+f?MD=xC7R~-Ec3|9W@-A z;m(~MMvxv2-$eM9h<>eOdOK_RJ5l5{uDsEe_qp;eSKh8N#d%O=e>Y!$H(!6p=IifR z`!qK_%}q~p)6?AaT*sE5@7m?NcKNPdek9$NH{P`y@7j%b?Z&(16^cIOm@%ObjAQ_nmDrp~5+lSQlskHgDeHyp++CJjiK9#myZ69%MA5z<=(w3v` z)3~iaU;HPo?Ne#(w0#=4>DoTxg<`+P>2#v(hc!-z6Q!TlI6Y64_B*cLarI6_Pr8@S zvqNe*>Nn*fHNM_02dVK}-8gcMbLfeV#;siAbkTf{D>Z(-*rP{kT+1V_m1`WwwYPGO)6Q+Dl^WObh--OB_0LM}A8jxFr0qqjy_K4-_QbV)UET7n zT;m|s-b#(DJ#n=^!nL<@jf2$wv{K`mpSb#m)cjViak{zXTd8qPC$8lux#d}@`&r9p zf9n47_UnJCSRgj&8fG)VSm=6dQDI zSoLqBKg`v;VehzUa;#{(7|+^YR_Zv9l#4D>F5yVI(XiUa}{Y-luIj*$b$VmCo zu-Zl1i9XVQ?R@spupWnAIoh6Rnr#>HNO{q4B%k(^n}_fkr@cF#t<<>o3vr~zz52w~ z4eRl&b{x-Yhm6=o!)h1t2YsY{u8sN=4X<%Ru0K|4T~#N=9`P$0*5gRa=NQuZ++(Rw%7}*5?izHSts7Ro99N#+4M&boDaT9m{Ly+i zHdSwBLY%mkMyT&^SbyM4X<&!>v_v@rN+H_MHlHW<~^NntX$(DuaUB> z)VLl8#Pv8ps=rohdZb)*k#c*uc2=%&kXnwFI`3#X%sbi-%$qvzTB-ACq+E27atTNJ z!5`)rjOghH&u6{npbn(gscj{$b1O1ZM>MQFC5R(SN-JmePv9Odf2940 zKgc@pO;t~m%x?uUOr9BSzLdXA104ePTC_``N1%@zmcM>>|2a7(X(r!u%#YE@T_d^k z@t^*j=c{nF-VNb7EOaY<`hyj`?f_RjAdnu&4U7uN_a^*G#@(0EN^ddih}1Za6I2H-jBQo`oega05`*(NsjXXw%5Yn;r0&063w?` zU^*1RIdCyt5BI?n@CrE2^VmNF>nY=Yco04(eq#suep2q~%l&(~*G{~@+)J1H=W?%` zc$$27B=@c5p0eB@mV3PD^W|Rc8s~863P(UU(T|sVj&grc?)}LORKD+%`*=y*&BO#wn!UjkNn@@g~G&>R;vm*?Sv%P&WvKH!K6Es4wo!PP0nRiS`ZYn|fbgB`Gi0w{)B?AJP#(>4%pgkXqt zD1c(91&8|Uu-inq5rRqBKmim(E!2TS{hP3BBpf^h8z_Kc;25H>ijS`)TnC$=QNZ4z z{$MBlDbasy{$c(&kzK#H`n=JxH@p2w_v+XmDfREmXJ7o5dUls@Piec$)7JXferQSg z{yZ(Q-xr&5FV?TvcuUIIUmLGZPwsDdvH87n{W8{O zU*rBVz3{%4)m%QW%vjl+ZEJL~<+V26n!4KBR(x&iGMg*U-zQ$Wr}N@|>81JQ-qQWH z`x^G@*i(Mbrmbacoo!uyYs>Tek$m!LZT_~hx3wRs%;+*6z1r^3*~dY=TAzcBVWifMTeH)|Ttp*O7M`FQmKrz%p9c+S@)YY6# zBYA^IP%aceG1NjGY=TAzb|W2{%kSw5NH2z3sM~|>rkJ!w;=%6GvQr5c_~Ksq`znhm zs}|~DQ#0j$g05>1vtuk&fmcr*;Z44{r{7oENLj(2(ehhcPAYi|U_RUko8c?yd!*Sh z6KbIjHp5rY_bBvG3w5v=zJiw4n|d_$K{3=q9c+S6pldJEpcrbQ4mQJA5LeZiG$H2tgLzNrkac1$D3qK7p<&=%EVM!xo6GKQmJghmJs#0MyVVyJ~W*aV+I*FmH~G1NjGY=TAz9!Fjn3stZlwm`yQ zvm+B`KqYwfx0SqsGQSU7AYlk~!3?N`8=$rItl?f-YxA_kKDmP~!_%U3;pkS_wxsUX z+DQHL4zdq^pKI`?fjf^4JfPRm$^O2&p&Rl@=nW~*9|l1h41;XQhY>Ia#=|5igz0b! zoCaq?5tKkFEQNDmIq*Y1`3-r)#c&zFeY_G0&Q)*?VbI@+UQZb0x0($%Bl(@{2>Gq+ z?Zm;k6Ye4m&OLA+VbI@<-cK0xchnCP2KkMyyeC$EXW8%s@@XVE&mn~u;T8BXx>u3H z>+mML4e!AR@G*P}+u#e>0e^#U;9D>zp~3V_Y%trwI1MI&d!&uE@*?w5|> zUVDQn>mbkegq#tD4>uP^K!dr3_$|b5Aui$DkhdZ4K;D5| zhg^re8}221FS3q&=4j|eU0{0Wa^IL|b$UMs_zv5_^g-VTT_3_Jgj29dxe@3mXh;b; z#i^wAC9N-MeH+Y1F#QSlM-JdwpaIwqpo{^;2Vpmev_Z7}IO2oR4@Rb8mxewK+ce@s zAst;h@pQ@rGYs2d4d!A<$Rr*nJxqCF@`dR~NXSB;%{}aF^x5dM$&-y98bs!ho=d)5 z(vgevi02c}$2Onv@w6SxaPkdDj=*jN^@|*Z%_#Jv(2u4*;5jFrZz63BX=55pK>_^% zW-Pj~=*D6*9yy+T;|ZS#6G)#x`UKiG0sREVgUCtv2xcgkc1vIdjm>K{p589CUNg%|$mC z-CT5Y(Fw)GR}f!8cm?5A*lopbE8(r^x1!&QZacc|=(eNVj!wdVLjN`TuZe$sDs7rG z%yH&~VVKh%*&f*m*$LSh*%^5l@~}B+&e4RACVcdq5gP7IxHsY6r1dAQKk@#=2hCx8 zf;kONXH0-O6V8I~KoQ4XG5ZV5eD*t-1spSAN*Egpk&D=`(6E?rDSZp$N(rCM^MUXH zJasnlCD_3&WrUYfFPI9-ScW`@I9yywxQeo>k;~z{kkb#Qp656dS9Ai$ISHn~RG0=c zU>3}VIWQN_fU{s86vF~o2#eutD1&lX2GwvbtbkQ;K3oVjPz#sB8n^RS4^DuQFd7QrM3@LuSLQm?kTYNw zoI!jZa^6bDG~qHRCoU`_T#c+oUWmMKC4IVzI#<)bU@m}*;9`z3=n3W$_6rnTO87Fu zYmk@26>ueE0?bu#4XlOh;YRc~Q}!){Z-v|84!DytAz>ZiyC@UPJ#ZhaCk?i5Abdam zJb-)<9!3vlBYclC!8}6VN0E=g6YwNF4L@MKfO(EOo=3ib1oI-iOj-l-733!5X2#l& zsOQIoUxiIfwyCL~HCA=!vYP*O$uHck+;V0+QpPhyaGkSvj{o1mhDY^g~N z)X2>lDIgk`a`;%`My$%!Me;~-?#B%{62*T{9hDU1YMV)nm}#2bkiqA|;h1P6BBoND zSgLhY+f1lw8+I{}p5D!eK4aH7iB5vkUUrM)1lvoM?GX})`Rt`4w>>t~uC_7Fiz!>8 zto`}Q&Yf%%jQ!Mnv{T}3_n|oZxoGFsmXy50^JKR!{Cnp=ckXYZ7Zs&9q#4tHBOiH`k%Dx!W*4x(&rv2x;+9vyXXCHo_^2-?eHjfruX^V6RXq%TGEif+{Jn*5>EQivX zTCi{M+Y_(x#|fkIeG<()UrZ8f{PEcNp=p{)jEQ^E?xxuzbhMWqm+>BG+5_GiIYCan z$FjCpGAr;Wo5ikN;>t2tE_G$OE0?+QJXgLDwE2tO_stL_;lj7Pi%Y! zaoaaGF6+44KCM_-x{~&un}Saocw`ej0IkcY(yDKj$(y>>7cxZq+bi2__wz zW6WSq!hb!CKi&_w?>%@SIEJ2-^#@Do@gnk0Wb~9Gr{@dXdF1>s zg)}K&!qc>LFP!PqhkfBJUpU(r&e5=35?)Q&YvBgC8E%6+;ck!%ohhu0zYNdH@Kx&W zz;+s|V!aS7Qom*8I?+p6p1urw@x7_7tf#kJZKYh#cCoI!-?Uum6IuH(wp>|%xdN@! z^)UWD3Qxgv@G|@eeh&OMr<32lS3-`dKp>gbO_R-FCsdqgN;&&h^2%9c8u^y_;<656nJ+H;xoNtr)ELb_i9Yd{ zC-K<)%YF8fW9oY$cryDTTAr+1c%CmV_Fj5N{QZJSe#$_RH9?eJ5kU_JJMiWt1X)C+AsN3s9`2A8kL_G3K~& zv6Xc3LCRRJBW?+~?3#JDFQhKJR^~FdY+I-Fi=dz4X^{^g%jg z!|^a0#=-=c4AbCLI1}cBw97m8L#z{bsX2qOd_A+uNHd+5t~%T#e;4jM+|>LE-l6~h zNW6Df-XQ_!QihyU_O^c93KLyFZg0!%9)eH1TVZ!kX`yEG*?GY$&#tOlU(eKL#=HN9 za1_Zb-rU-`Qs3^KV(+c-@2VT}_jw%%tD5hO@3RJVYP+*DrjQ zi6?gb!iNU1wswXwvVP%TGZ`njWO6?ax`VNPp&VOs&hO$mvY#@(exa_PI9|S^mgkV< z`)K5U)%t}z_cP7e!e8AhIrlqVZ1`abA3e=^3w3*HsCHl&8!_P^6 zH!S)2l1l5=a64bPy)WFs7Y_Nt9ev?LePOpfTIOL9eLE)_<{2=bzN;^ML?q0!VZLyW zNVuKj5BH4dd1lNPKFSxSAHBYDdila`TVD0`!#A8SJU=z;)?l z9*ePjGA8~)OuVh4n|a^on{8Ft9?E%}?{hxTe|s=GfJvW9*Ie#=uw@4-;S#Ool=@+1cY-Ql^hX{m>U!OUev@ zK`^M%e9IQXN{jmQ;wcpb>&e)CUDn47E@P zx|S5O5rT(c0|ihF&TiI{3U;(>Nu?s2nR{eDXz`q+_tEA4xx;;Phx_FY_sJdZDLdR3 zcRB(0#O2;T_mlOWvfT4_x)SDow{rxNd);!6+vyHHh;y&m>51f?w%p5hxQ8v@0dUW{ zIlovhjkH6cOS9?C<%!V|)lZAtjCE^m-75A=NS*ugX|1nbJ^PZct@6aSvnA#F^R&c% zUu>j~eaY8cp0+Hjx$-@o*DqfDKuE7Go@_}Sv3|wITT;gU+IV$(a(~N<&F_`#m$5ec z8uyp!h4;0r=JI)E#>(bwTce9DueI^k)YaCu;%i%%*<5-4KJn5$ofr2@FU>FamhQLR z*RWT|p7MJ(Z7pN#Z0qt{TVAX`2P@uMzuU@Q+S^uTwW^%4?saTc^VhS@mbD(+E#R;= z)hVzZwm<@FONC)R+z6ZDE9mR4FEtZ+2|Nj(Kv#E7sIjiBLaukiTaXFvT2Nu+e7F%d z!&lIk^_*tHCGaF1i2h4%#abbwTVZ=3e3km=9b_N;?W)0-_}V7?E{NYt#n(28uWiB_ zA7P%)hxpni@wH9jYn#N^Hi@ro!d&=5Lws!$U8;jMHsWiW=xQahbcB?Wba*He9a^>5u+=i5O zCSE50E3g@U3_pce;TItFzvsN|$as?dwT{khY zOx|~W`aif~sa3{+*lck=qi1dV`r_BIFbIY~I%GmN4<8 zcq(4oed4u8>}`AA)8ks|_u3@=B>U8k6uXX$#ATF7Ia0Q5+uQ6TX_eL4Hh$>#o?UZC z?EZj_v{Jl~ytd6zJMqP~-P*|hokg4Gz?m=)7QiA{0u@jVE8#-81ZJ``S1}qYnd6hq zKxX`MR&J_b&RNEJpoDWk3Hk+kHYhTK%y43FFygj2657UodXIk}xUu)~cN?k0O_IrC zbcyX2TJV|bl9}y(jfISMv61|qb*@^=$oFiwu}@_jSj+8L+LR<_jSRK^4BZyePp71j z{5uoxl9-kKsp4DH^st*QN3VFht3{S;;rYI+MYd}ZJ)&c4$%)j`Tn)LARB7+7<>y7x zZ6EAvk?&gAe%Uo$`pEW!jLzoz$fnveYjZZX1ZySduuo$8QTo}d!4Igw}EPi1wl#bz=idko`O zjx$+nV+?DKRWicolP}$jWm^TsjB_bRw6=~3oU>-NFf7O5R0^L1r^8uL1OfC54l^}} zG3$;r|HKzrFX&wJTh4k{nAcf3XoLBJne{RAiYe)AlFMNQJk7cPb@(TA>|$ynmBSzl)*mTz|ol2tlpdVqIvpL!mjJ+$ho!~q{0A@xz^kN3Fc^eHqmrS zG|P@NrY4;<>4UwsKk3M5`&++$&Jsd78e=T;#pj37FU|ZL|2+p zmeyKeN?Cx5mAa}-DcA7J&Dllf>~qZ$R?S*smXw(#OU;sUv!sIm#H-8_7T{WG%DC_^ zH)Sm6R&C18HA@$nr7YLB#4If{OUuntP6_;VP-T`@o24sFIY&&1DK9hS6{dpo#ZpsI zX_gh4Wo2erm04D8&RK3Mi&$u4si`bCmHcHv{5(^|A-BL(EizS$O;xF>T4JioOclp& zxv8o!Rp*$hN>jz9ZnddeZmP~TRp*&%{tn?Zw8&I1Hr1u3dWoqnGu7p$y24afn(8W3 zU2Uq*Gs_p5Np2a^qV7X{wnp!%UcE zPC3m?IMqxz&CDKSW)+&*6U^*MX4Vul`xG;As+l;$Oq^vVo?@nrH@ei()S{*ApJrA) zV)Z1Ow#za~W0p=^T3A%Mgu~A0N=o*?8(&tkw4|ICv}Q>p{~}0JXPA09Mve;=gfc>f zq3qDeP(E@XO1XA)LdT(x>g4Z?r{H;zW99KNTvtQv`bkgm2ZpSll*a-0EEC))!u?oi zYY1y5$@)pl@{PG}1ckVt|2yj^nHrw&xEN~T61WsD174YAE{7}N%J@1<@pYCyGl5Vr zln^>0G=d{+RA_W)3`gPE(74d}(21c5p^2eMp_4+BLsK{&r-x>QW`<^kibL~5J9ox& z#(QXgM*?%ZW7fgla1Y!IcftMeAUp&QLp^MS@4+MRI6ML0hbQ4Fcp9F8AHV}}AJoBm z*Z_~hV<7cC3(vy~@I!bGUV+Wp z1NeBsc^Ph0f3g4uiv?D;xpcAQAXe-7&v~ z-@*GlXN9hl=&A20WH0Cq$H39h7y84oFaQR^AUF;N!%#?v3>XHP5QZ$shJMfok|70B zVF;vw)OS3b03%=|42Q8W9!`V_FcBufNiZ3v!pSfVro#-F3A5l77zd+ZG>m})m;!|$ z_05Jka2m{oQ{g*M1jR5P7C;Fsghg;REP*mu3gu7%%itWC2dBdsa3-7ui=h;xzVl!u ztb*0B0&1WZE`dwoGFStb!xeB9Tn*R2wXhbhgX`f2xERid3*bVy2(E!$a^e)Wb&j9y|h%!eekZ+zxlZov;obfCoY9dlH_8XW$3$ z6#Nigf|sEIUV%-p8GZymg`dHz@N@VDyaunsFX2Ua7M_FW;RX0H`~;-FU%{L3YuEyB zz`O8U_#M0tAHaw35p0D|;P>z;dh!1>ZvAM;yP<4%$Np2tg7Y0)NM52mA%Tg1^GQVJH0QL;u=&S8&s< zt=7(4>|M~hlD{(|uaNMPE;MV*RbFH_a*mnD9f@hXN!>T~b-rvjnL9PMp6v}j{lN-8 ze6T8Z>wU~TP3SU8J7q33v1Mwb+_dvV{;yn=Wfp`zZdm!Ee|IhV+tb=!0t2i>? z*&ju|_$S^2&G*2|W^+u!Ph;Z0iix*X^d0k&`LwMH+e10qcwqe-{kI3B1DGW1UYait zGJ9P z?@Air+;r3c=N9rUY#(w?n9hA`(mTV2?FTqFkS6O4j_pvzx_Rq?->kB>-1hcC*1=1K z0w{)BsDri6ykj;Y8zIO#c&ShT#ZU`%unA=Cyhdb@_3%=m0E(d&ytVV{2ycQ$2(k`d zDy(%Xr;S6_LLF>^MhLP7UaGE%H}9ANWHHo29c+R|2>RB@leP0?oxED8gH6x~c742i z=&R!6WsST7D27_71Bd!IsqD=?-(#Q;Btr`HgZ^+V41j?!2#$lnaFo3AS?4W|-}Cui z2VHmQ0X-vWVng~}Am3H--OGd z+_^4b{_-6B2Iv>s*aLdPksp4gx*Wo}kO%o6b_trlqyhVccokH`aya+HlT^Qg@QoiX z((vPipMdXwcq#GwR43mx{PDw=G%Vi%bfhhv;85rcT_XF0W1IMqa5VIa==acfB{b3NK!7#`Mek0z%Z^RqMz<8Jhg)kjXfzyD;4jYP~1WI8koCC{Y zC0qa(!)5&5@k%5({P@PXhA=p5;d;U#?|f~z8Og)UBfz8cclczWCaG7oQw*7ETK}i($>Q24kj= zaI&U9=ggi?cm~XDFg?MX5^@GY7UaQ6Pz=Y-4mp{S1Ied`VVIMOOhxuX_CpRq4nbxj zGfz!(rkt7%!ypVJAkCSBZVtLR=;olCgKjRmx#;Gin~P2;Ccc9B3c@Q0uflFCc3TN= zMZXpOR&?9ZZAZ5q-F9>m{uBDI(SJ?+>r-jdoMHT6mKTR0+au#^_r=%li?7|+5MR45 zAu%x_zIGq0)7fSF2n6G6_en1_{TQ?Jm7P1;CK&sv`G_UI+;E!+SwT!c7wz2Il9E?= zp6s^vfA9R~&YdsFGv4+y%8IXd26iR{JSDPW=RG56SB*SniU;xl>OOo9wRyhWIqDem zTC``TndBO3h!n^Z@lxY%IdKiqSQ}h_zquh5zLRRLasH`}T>i-Pc^djc!i4 z|2jG9Y$=_0Us#R#nmvEMYtUpr@9e{OxWC+e*0xD0;BRR8xC7Ki4#@Vvtlj6IA7s57 z_cNL$AiQu(B=!w{JK{C|IAK)2PokOUi%DXQKOQ?jG)*&!F>x;%U%SuiiMVW856HR= z-lvpd)v|T_PUlIs3RZMF)0|+Yg-$RFpahn|LRbWgp%l)BB~S)Sp&Tl}fp*XyIzR}L z;1HMx9ia$1!J*I@y1-#@ICO<0pqnK$!pzZ7K(|5N@;p81({(#Tw=;D+OSdC*Td3QS zx*et4(YhU@+XCH=)$KUl7VCDtZpZ8PMBPr%?L^&9((OsQovhm_Y`a@RvR=_?8Wvx> z^W48|#nXSm$3NSo#*^zE53H;*?-xJuiaTAK(^v*ch(A!t@zrVH3MWTzIJDY z0NIMK-C0LKw&H7d))SDe_}ZOy1!OC}c4vJ7*@~|{EcEJJ4T+~c)YBg7X%F?ZhkDvW zJ?){M_E1lIsHZ*D(;n(+5B0Q%dfG!h?V+CbP)~cPr#;lu9_nci^|Xh2+Cx3U%Hsy_fplOMUO9zV}k!d#Ufe@$4Ar1IdtL zq1VsQka(V=o~NkiDe8HOdY+=5r>N&C>UoNKo}!+osOKr_d5U_TqMoOy=PBxWih7=+ zo~NkiDe8HOdY+=5r>N&C>UoNKo}!+o;u+xSnHmyLQ`OT{^)yvIO;t}*)zeh(m&J6OFPtlkb*ZwITl zgVo!?>g{0lcCdOoSiK#r-VRo8hu~Qn425(HUVn$)mbmzxu70Ph-|6aiy84~2ey6M7 z>FRg7`kk(Rr>o!T>UX;OovwbTtKaGBce?tWu70Ph-|6aiy84~2ey6M7>FRg7`kk(R zXW$v&>o5(8ry1&LhI*Qzo@S`08R}_S>00nxUR% zsHYj~X@+{5p`K=_ry1&LhI*Qzo@S`08R}^!b%ZT=o24P~Hmu%;)!VRo8&+?_>TOuP z4Xd|d^){^DhSl4!dK*@6!|H8Vy$!3kVf8kw-iFoNuzDL-Z^PHk%TPUFR*Gb%&3UrvSR}?l)7~mG9!XRFX56?5{lRJ7|1zs2^=RmLAFk zS>a07$(8e%9Or3f2)&j^N=Vb>k7_x)$w-wsLG0Pk){*qqz>v(rGB&*OyJ>xsLphWs zdBk4)5c>|HK4|S4o%!rhISYz!Vk1}nY1m}oofkh&(+e~%K6ap%Ldr8%C)% zhuX5qR~VABRP#tb==D z18jt+;5m2+egW@-{7oxIuk=d-;YntynSm7jKS=*y2$)|4zwK&jBt3%_(?($};XHbM zC}G)OLvpNnFHK3>1D4D+5b7j?f$XlmXE`sZown6Z9Fby80%ehq*jFbr~FIE(=) zOUCI))|B&Bo0EQ)zRlASX2VmlodwaghR3l2=eew{DQgXPOzxD-m;U6FzH>sHBi+`^ zao~hxgv#~u>GWYbrOGI@Z4+C2#COvpiv;Y4qLU*~=5N^xcK!;BGo^SbbJ}E5#eXkFjwGpD`n8MNi;ZZbW5f1= z%+rPL2(W99%gTq+62GmqQLd%Da^+Y*3!gl{q%297GxzDPuU2RM4~C9X|D|2tXymUK z_1+sRGAGJt6u&uLX^2KKFK?V@gco2(%rLC zpY*Tvqj#qA`cT><=V2N3(H^wtbSbNVGDeeLK%YrVWxvXCejIqmy7ZgqWL6ZNocqNW z`D@TSQ+jQevD1xFGLreq8`Iv{AK1h@J7;ub|H^DNgx-+9^}KS#4>?22s+}o}B`Hh% zu*a)hYuG(w?IzR1-9mkJ5881qV=IT;Ln+g{=CHPMo|1hnBhk(&-PEQh+tXDi<3{>X zu3qGrmU_Lt=v_rgzsfw)HPjy~&l}sXV%wj+v} zMD&@IB6~SnidUx`Q_1RuToc%GZNFGQ<$6j+pEvi)sF3nyq}Vd#S~4BKtV^;ReQwFuu{Gpi_#}@r81eBWFSYSJ%bL^9+f;H z9YxZz=(*%LdP2sv|D1RnV_H0y(IMqZJV)nXDfc+`s*MdIO~!y|#80`RlWS`6$Bt9$ zyIg0;aW8YV^rGBNk)G;L*gL-Ddyx#zfD`aeM#5yS%57`x86bMCEn~TWe1-08W%sG* zWIsrGUO&lkC^JiUa)?h7m+LccEJ@pB+)G)~Cvwd-k|U^4$AI0pdGwF?+Ks=Tc!5B zQGL_-R*nmMB_lJcz1ETI#lGa1wp+htbVSFSy{?k8`Vjivf27*uFVFSfe=Jzvtf%6e zjQVK#vR@~&U*&9V_e&oAZTD4l-juN+?U18P<~tc@UYn&%IX`*FgzU3^cr6;Q9{F2N z<_tNXM0GN*ycyqKzsUINfQ7VEu8*Q~u-)I1SL%)ZJ4*E8qg*H1>#WI0TaL^#a+a|E zOPg%}O8?8Km3hTG&qm9QUMETacs9~DIfCU3DRtVo^h}?YW9wOX}6?jl1F^G*334iu_pd^Sbv`t z%vr;~+?>O=6z8#K{{^PTT*5kgSDLHMT2{Eb+1$p8cXylnSX2H%Q*RzIkDDjWGv+z- zL-VrPWPWUZW`4m}r*E3K%sZ^G|AEHNII4y8S z;5&ihKuKV6U`e1NP#IVrm~K`CRtGK&TpYMGaCzXnfolTS1#S%761Y9EE^tqvE^vR~ zp}@w#qk$&^PX&Gucs}rApdqk1@RPu+f!6}R3j8|ocHrH>?*bnNJ`Vgo@Q1+mz!!lp z178LH9{48kuRwi$F@HlXgr!gkE8u*nfy>}(xDIZGyJ0;%43EN-@GQIto8c$$bND6v z8s355!N>49d;x!jZ(t`RbYotGj&K|ufeb3UHAmH!58pX_y%@DJ8o7aK_@sIdce_; z41M7^NQYcF0mi_1D1@0X2fhP~p&Y7V1)L9;!j*6>+z9KS4jzKX;7Rxa{17(7tMDs$ z3w{e9!Kbhd{tREi-{D(G;Kob`=nP$PB z+PPQ0TaojSlqKJ`$h;zRvBVwbNSQz7d}_}HqX^q8V43Gc=jbfgPiGO)NuA)I2mTZDR3H`3B|Ao%E0>gf2aKy(xzHi1K)+Ua0A>7x5Hgf z2M@ycK*qsP5IMw^!(G|ml?&MilHS*ir@3;xD>IU9`Z1|ie#`G&ymDoqyhJ?>unB$y zKY^dY&*3%rCAs$Bgg zb9FHkDdSSgnZ(;)X0^gj#=~d$@MriNd<{E6+7mp|)O0b`!H#BUpdmOvI5$`md?Yx5 z_qf~}oDe)Acv&#f+!U;@f0^mHtgA`>0C;Ii@=-^aniJtvn9Dp`+`}a2^SXo+dYYPZ z;0gE*d_p}Ps6)QT-`o32)|lw~N@CvEGOnn)WLD|Yl3icmLb>v{#bWNc`QIK_gq!jP zxjm)Pq0Qv8$EH_avhI=k`YzbE)jQxBR z4r4@SW_khH#$H_{Bza0W+(==!>EtMT4R6Pqe^A4C2P z^kH*l$UAT3eK&hbmoj7=@0wqZKs%26(xVx~WFDUh^Pw76ga3F*7$@n^lcMf^)18V*IaQrpZ*S~)}@1KK*@L|?@0rNTNhsJpC6FHwo zq@bKOfO9SlmG_CP$vP9Ac2kLVt=SmsBGG;`2$T?2JZSi6Kpw*6Z zFWd)pupTzR{qO)h2oJ$^tQm6y+yt_I%x!Q7tb@DZUZ^{2I5xwbJ3EXZJsQ4=@GTL& ztRp1P#i_i;l{dQbK3DQAoTl@995TguP-TBNUw?VN4t;-lrcR}`Pjl1L-1IazJx!jk z!!Fmc<>$M0`L12QYnLBMxAx;*yYa5wc-L;cTVA2)Lk?dfe!zL9i0AqUv$l!0PbKLp z@lz%BtE7CD^8BCMKBTr!rOl`9)3~+Q_7T_iskG&4`-p4%klH?#wj6Dr#%=xi;y-b1 zpGs?|?bEnT*Y*)F6#Mpk!zw?T-uJE4xtOt33L=-mIj*ciR)fe>;CffiM&1A-PlX#@ zc?R+(5LpB_yRsO03y53-x4Nht-L_LY7` zGhtbmUDjuB%g?pG!fr4OIz9{qbDf3`?uJAApne|VFLnN+JE%UyE06a;ya(bv5buF_ z55#*Q-UIO-i1)yMPY<*Y@a;mY=n?Sjdy+5yiT6PBJ@6v$E^qqzanmU8IX^I;xA~6u zlLJ$9lT!b{_s9Rxe@)c?v4}oU{3X>LO!nH^_}c6yjr*VJFbu+w4Y`mH!(jxBf-x`_ z#=``d1e2irSG*P$fUG-i`alZwh5j%A2EkxRgLGhdBE#}TCL3~r z^~TL`7y+X|?w^i@@h|}Mx|;jjY#wGV%%es-oFXd~Npsp0(K-0IZ*0z`fnE zFiyUPB0iq*i7){s!X!8eCc_jcgsE^cOoQn#17^ak)%Uah_(QN!*CC&S?lhPSr>}lg zb!QSj3%&#MRzHF6Db>#>z5q&KAuL)g>zvzr-e<4=friV_FNN~e&lA5#b#foPa&?`C zfuJV<4HSufU zT38F$Mbd12axY%)!OOjOx#uqT+T|X*+*_A>>bJuka3`#TyWsBC!&rBI3`~b2I0r6< z>)}3l0$u^$RnVk9sk4<}uAkQCYmL2E$NosEZ(lyG@zb-Fdc1I~+*4Yt?SYEN_CrhR z@#krY{l3_=W#6=AS$k@W*Drgr+21s;EuL&id9i-Q##>Ux{@QqTdUAiui_Pzq>zA=M z`x^I`>4o>Ttmg80WyZ?pY+Iv?Ew8ol*3{M3w&H7Bm)Tr-{yy>2J)IZ#OE1kY_m=Lr z-Pf>J$DZul@tTU(yzkK~h2YxB32y{-M=ZQH6Htu5z(^m%eC)-oU63fluQ zKBWG62iXUIyK3;I!Qr=0{3tWN_Bws=B5=#Gf!mDEt4M)cj16zX+wdNI03XArunoR| z9q>2!2EGM;UdS5Ni4A5u7^lG`@V>T2_#FP;elU!H5btgq!F&H2Oj!r{-Cf9ek@$z;uTma3ua5 zIl{?2suRBl?8I;VI`MnJTo?iIwbxBJzV>>2?e+ND>nE+?9ve)BX)pt3!EBfVbKwj) z3+6#FEP#cu7|w<=D2HWG4d=oNSOw?9g-`>va4D>TE8x3uHCzkV!3}T|+yb}39k34W zhI^q7Hoyb$(254L5zNXFPBILIOvr&eH~~h&XefXaVIoXjnd?kL&VX5P2Jv~wc`JFJ z0O2wyCoU`_T#c+oUWmMKWrMkR6?Lv=4hC}pTm%<0_d-uFmoQI5!KH*RBfJKAIa~o( zGQWel3a){*a6R0J{$|R)h48I#JKOyZ$Dap~55mLf z!EA)@Q6`v2$onYrF?a%=gs0&LoJYVsM;*^2UqFI+5nd*(0r?7Y6LK@>j2}_Yj|smD zzd#QgUnBfF{0iQLEtK&V@@;qr-lJ`>5w?T*9lQ@8z(?>gG{PtFDgE^s@(=JicKrqU6=eh0H6{VlpaBa00bis4hQ5G}VEzf;qKAZk2ZIhviwnBW zIx*i5_H#xyUcY>D!GSA6Yt(}E9cs~_WE8$G`E zdJ8&j7nAtf>$`LbiqXv}_g@!Zd%bBN%2SUA?9(Ntci zC%*Q&uQTGogVqD`v};DdupX&@J@r6H*2xX(HbJ+JZrka$y>2_`HpKd-Ng6stw;grc zNw^AE@gMs_z}A8rrYki?V;PAy0t56i}leO@1@(`x;;j>vc9OSS}j{v z8e{cm3H8-&Ki&4%?XkKYpj%lN^aLX-E+40%!MYuy+cez{)vY{_FRSRvR@UOp)KFNr zS-Q>Et*kmK>&nVj))V#CmX**5jkEq1;ZeFBt=loWEzqr9NmeYzYy3prPSEW{-A>Z& zNxGFavSdYBS(#Qs({wvsw=;A*Q@68pJ4d&&&ih;qovzz6bbF?5&(f`37kQqBi?A-% zkgRLFKtmQr(`d+a*|+X=tf#%XM3!+hrl|S@2;zo1VdFPcU{3+^#&D z{MwKU$}z>ol_lqv7FCy4lviP~a%$01tfv%}FIrx-h|uCnGo@mFQCZ2Pai*}Myn1od z9ICQ;?CJ;O%Sx7(lvh`oGRfsGeK2-$QDv1`RZ(6t6K~2FRhjWCN|r7wE2@-~qWRS& zB#&KQSy@s(-#R;4I;rPyV}yt3L;v&Y=O^0d)idbidm)$fs|Of!6FWnmSAUo1)xY*X zua55j#`Eg&=g|2b=J@~S=g`+UPO7X2;J9*)lUU%am$;RmnLt9vgfR&_cSb`2p2WT| zAexTo17@zQ;l;{Wp2pLk&3nND<|JdKKV~g<-AcXkn^$~t5<#R%VIQT4pZEq&s>IRv zeL#QTSJY3!9J2gQv8bO&())g&w8!9bbSHx7Bu&C11xXW0er_`-W{Jcud^zD0LBiwfGWuyE{m;rTW6p_vR(>MR zuu_I@TeF!HV|)gysFcO%%2|_nb&T#m5v}o6a;dpWV>hy`_2~~*@b&{-@i(@7t{|KL z++*%1VPo@&ac#T@;yn=Wfp`zZdm!Ee@g9ixK)eUyJ}0&S{~z|iW4aES-|-*#BZOa$iMLhsr{-7Y?Y1gx59PdPK4!&r`FC(WJEU5@k8=>^ zUYq{^^0V^8cwTf2Oot*k2QG%|;XZf*UIE8>o@dgZf%QBqem^`2pA)~a1NXIhL!Z02 z*Y+?F?hgZC5DbRMv+~c{^z4_dZ1Sx9Ppq!lXXRfbZEw%Y--eBS-q-Z!zS{uU_~9TjxadR_V&fdTBw6f&R=Nz0&D0dt#yiz4|c#73ZNKjVXad+Z3D6qf+5m@ zw@mCPhFaivu*cLPH$fu=ldypTD27_71AZUdZxgZ+f`?!O1yBsE<;xf^KE9T49c+R| zV3BarDyO9)cQ^0oJ$3F=$EI^1Snq4c>i0D+_nYPZ^S(hnAG@&(jk7eX(iFzG=&{_S6=yU-o3PziD1u zJlT@+V*QGZx1@~ywejlo~ao+FHie+1BN^wmi=t$tR!I z=5H%|Tl>M=wpBY?TTYAmynt)w;yqk9x7B{DrH;D)Kt0K=cy@erD{R}UAN=J={qqj8 z4}O1Y@Fo7NJHK~&j$g+MFTyMEV|1?~h1cOt;C5d8S@(53AAdL8%k%N~BI|fY-W(0R zcwP`p?_BOh@yvMd=YVGoVLO;U==-4SLpX(S3N|S>0?!^oLkiE8rjpi|w7#VE<#|Lf z{R#I+4&a?M1F#=J83Tw9!fp_0gLu~RIO2oR4@Rb8mxewK+ce@sAst;h@pQ@rGYs2d zJR1oKnZ(1Shbb@qthmGmBJ^rkF{8{(-v+nU{-FJPQ+dk$ldLAv0KkFXTLB40* z6OH`4^dlaTHM{@J+kH~=De}avelFU%b&n;x*;gbqUrto}@16hLx$^~HiR^wxS^4$O zz)tyDM-^PUkq6HE;c-S9jCugu$@PyAW;Xz#U)23r}5KkMFHhmCGdx&Jyj>TD@I z>bJX3jrp2mqJ2(}7XzaWSzAuuL{n+;Yo!I?yY33gKwJDdr^gV5)0b?z5cQ#BwT@ z$!a^(wJq}1KTqqM>!$cUyC7hntM=YW?>%?Tl}MK)Cfjk)!5A}h&KrFr+1W_@UyPkeBi zl*hu8#O1x|@^2{ZEp-1S^E}`J()N}vK1B0N?xAi@`yTV%rO72(bMI*X4sDlb*Ox*S zoCg=dGspSI4ksaZy#-KU43xAluZ(X=J#JbRmL z4htk3IU40Cl@VS9tF>hpkh+@Io^5PMj?D|qnMUdpUl%tS+tR}_wrfm67q8z-$!o*s zYH!(a1?4Pv_0^P7Ke2H7V9+8CDg9 zJHjFOb?E=c-gy8pD+77Q#14Ae%j~j z)LOO5zQ=OjzC3w0?em|+m72ue!`=_}b&z`YG27Qdo_|?eKE2NKCf8*IXEV{d&T@YC z^^vojNZmB6u3W2DoPRtdK^N!={a`R8LpqFsNiZEu)~N-O*72q-y=i4{TF;wS^rp4F zX*;Jp#$Ny83U>Mr+SS>v9MiSz=X$siZi1WP7Pt-WfVsaK+bb_X~Uy=Qrj2@IhG+DbmD~*N5GGi6O`#Iwc zBZ;^jyD%6r;~1VgW5kHj zW2Q})iz?b6k>^vcusz>5bG|ck-K-_w)o;azO?Z@icYKn?#qIbcvE0NBAT6K`RSo0W zdUkx0W5g#ZCqYZRQ#21^BtFUQWm-nx3HK4Z`|dLMpoxb5 zxAT^_^Om>smUoq9-V?@^+-n#aDF%bPSurN8^TE&EIv*?Le5{oHSt-Y7rJN6`bv~rl z`B*92wNiUM>wH+Y&c{maa_fAoWqW(p`LJxAkCoc>tn;y!?fqNl!?JZgR%-9ZIv(9_8D6{kmmdo}24fP6F#0;yp3tH8@_d`b1Qx zyawepD3?A84Jjw~h%f#K<&7wJ;*Zczfpd(G25Wr5=5o&Xn73ek>BA7m`j#KK%##<# z`thvq#3E^DT`LA~qg=)zY{&ZTS--u^lh>W~EuU_gC$Br}_h9`jF-xZNJrpcvNmtrD zG99)4nx>WH@+T6rB$o@6O|jR^mQCsL&yK__IsVr;vWLhOh+Kil6^LAc$Q6iOfyfnz zT!F|H@Lhr8w699#iE~V+{<$Hw&3yZc%>9450+E;{$NO&oBs=)AkjeEV|G&g6d62js z*t;r%6|-cGz3dmWGslY%eG5w9_Q=IzngY`W|_?#VlEF)iEk! zce7%aJZdl3WVtrfh58%pyvEEomG~*7Eul5E&9IjfUbE9A@;X9i=(@|wi^MEBQ87!z zChNp3k@zK1#3rc#Vrz{jm6#P%WO+juer*mf&|N%OnC!1bN&y3@cq;V!$k z>CA__tzhdp+YC&D)y+#@;P&#moR@tSbX_^tg5GAZ?YXasQ|{zB%kI=EbEmnLyX%HK z@9ZO|^_@Beod)i+ptqmb?K#II>&cYY^$V)Lz4yZVTTthb*Xo9m$G5RL^DT(q z0!B;XrL-h%O}*B{P?5APb=s2Omi$=8xCeYA@q42zPJAO7Lq49EE?^{(mq1Qy|UC0~RgY$uFdQhil>*z*3pNsC-llflIo0v0T^eq`(4H`i+=me=yqhHDB2G9gz z`Zt97(G^H5kX9nCL|Tiq7HI?02K{SCcj;dj>O(_l4Yi{OkT-z50ptxJZvc6N$Qwl7 zAo2#0C#14Gi{)9&&tiTK_4ZM3AM^Xj-$(vF@(z-Bki3KB9VAcY50U>T`G2zfXMfIV zK>g_G0g)Ickr*bC7$%VzCXpB>0U1qElFMTd1mATqd+E! zq+m^v7$!!BH>Ly^Hr9yo7#`oUVZ)#vsM2jH4wJyDspUD=tlez7eKo|7=ANDPx;7cMqfX8!Z!Q)h2Q zXTPz~W0=_A58>bYY>pxRdb_~;fM!#xAhIJdOng_7PDMed^Q^wVS&Cw_Qv%0|(% z(3wwiEkw_ZZ=bw_Lz8yx(*@hg` z>D2MXNb!%qBJmV*D?iO|eP8?)SvRLLIksT&SDxVdJPX_4C6KrxZ^MTmF-5)txfcCE z(hlCVGpPtTc~a6z<(kQ7#lG(L2=z|+Bywf{zp}00;ZOJr{sE&j>w?6nkmwoHxO-Er z7!{MrvE$c_X8gG6#AxWr0mv`GIQD2qt8wCI$T3XyMps$2O75F{rjN1K@8rwhapZ{@ zn9Q~&l9TR=-67A+B%&}#q>ky-kz+lbV>%loc1T%}xFHfVq$bEQjN!RVw<2JyTIDRy z@Gi@>XhuDWts(RAhFmRq9=S&3olk1VXpy)q`{6q{48Oo%@H-rXo@R_O#T-g~Ira&z zXWic3N~5p$cqAIhMDPBisXLOROXb|MWUF8y?#6F@`tK_phgmaOYBO_om zjEBh}aYtssT(|j{(R)HzQ3`uxIuvUBA# zU|%Eux{_~SEB}1CX7_R(i2q?c2#>)!cmke*E$|||4ibChJuq3P7D&3>n-+BZmT%b4 zckn$Nh9mG3`~tthA8-`@hJQf5CyHYHma=CO;2o+#O{fEM-Rhrdc+Te6=K`Y>y(~ua zn>5?F!MM#RYaTW3HXbt887~++`Ih*U&vZ}2@DRf)W+f0~DrUVl_8sJRCYm@c^&l47 zLkF(IAmX~5!6Q%18_y^3ACzLB8k(|CCkjYz@mK2eb>&1>={93RYWmb3DbuH?Pn}2z zlu2nR0?9;$%*IVfh7wKm2VhlvE0u4ua@DjcVyYoLb9%CAOCoC{xwA3 z*yR$f&c95KN6PA2%Al^bUD>95&j-^z@{24HDF(uDNP~$m6XwB{AkSl4u9=6El6krQ zlU(yxdFMNFb)7n~T;DWreh03$lb^($NF`s6=T^7_?uPqdDXf48K|VM3K2zA&IM%T5 zgS~ILig(vPr+t*0bYZ*;9Zcvvnw{eFF@|uU?LsH@tZh-tKY&K zb58bQKhx=)*(mFYHHnV(Bl)s@r@oxO$?_i{_op2-o$KA3XWp4lWNtnuB6WCw>B^tM zXU4a#Z+?7ceqXMUli!uAJjYuur6CJ%0IeEfTp?_SxB=J^TE|MUUqg_-~cZ;9ko) z$o+M;Z|B(G({|o?Z!P;XBj-Jfwd9*a)|KbXKL7a~$#kA&xi@yceJ%X+dEse+p0`z&-;Emm$5JU z0vS)hMv!txLrHA88GO53U{p7Hpe`2}H`C&6z_;+T#$$Yfuq=8y8b-`@q>sRd@C_Vf z8^4iX6Akh=%jF63I00@2`W1P$vLE>c&h7V?-}FrVVFzAwREPb2Am0V}D#Xavda9f^xIdb_P zljf@&hkULQ$!!kq^K$a!NTt5~R$l~iUh+F}IiDYym+vZPK9uh&S=aeaish5;%;)F3 zsuIUh6>30j5RKLlnm}`C1#KZ7+JW37`P_@1xZL^&m|VFrkO$OG5FLU4aBqj`p#@D$YKIp#CsDGwb0J>XeJUFUiB7@t%X zy)92!+QgaDOYrbS@sPzNOqx7<>X=cZr^i%Fs2_ClO$fUhwlmxzaJj-qlfQbVrv>6zGFQ!n>>6z zX{#9?uBS(?`FVi-#lvUOb0Khyp0ZF5_-uMEhD#s@%0mUH2$i5RQ~^FGo@!7X_`G;( zLM`BPBkdGVUEuTMp&jOF0DO)-jetw&;q&Ba3i2Jy=gQLp_|5Y0`SP@eHo)i16AN(= z4+)S6eC|B$AqnKU;XB;Z2|7a;=nCDSJM@5_&X=(VFFBqNxD3pS-u$FZ$A-&>Xjs+IM-+yvEq_;r7 zzq#&k8}oO-T`-d6(Qps*_rd+J4CatG7gjL;06YYbz+-S7`Kw9S!b0ZPlioo3IO&tH z5uSnPU^8rm=iw#T4zI%wcmsCAoA4IA4ZC1BybJHchp>oke@c2Q>FuzW`Oje=?1wL4 zDfwTKegjv-VR)FlN8vG81s?LQha2EVI7Z$-@GoqDbugFwdEhaY8?lA-Z#Qpsj6$9; z1@Rjki+)Syx5Z;D=6Y;6fycCs7{s3%-(%@4X;~xP964a&v>3VeT^bnLnDmkceVP$f&weZKJwJ4Ud|{QdpBVb(Aiq zi|c4zLZ70QE~!t|r|DAqbbW@_y0ku1pQX>%=je0wdHQ^Pfxb|e(PecxeUZLcU!r4l zd0jzQ)RlB)T}4;b)pT`TL)X-`bZuQn*VXlOeceDe)Qxmw-9$Il&2)3!LbuedbZgy4 zx7D#aPRHv6ov7RC_Bu&-&>eLr-C1|hU3E9zUH8yEbuZmp_tAZIKiyvs&;#`#Jy;LX zL-jB{Tqo-kovPFH2%WA+>QQ>M9;3(VaeBO-peO1{da|CPr|M~Xx}KqD>Pz)3JzLMw zm+85Bp1xeq*B*U^UZAhkSLv(uHTqh8oxWb*pl{R*^-X$_zF9BUx9D5-ZTfb7hrUza zrSI1F=zH~jdWpVYFV)NRa-H2(muUULr`6e%tnucrBmGUSS6HQi7|H5M^^AH}ZBg6Q zi|S?ds(MYmuHH~@s<+i{^{#qfeV{&6pIUY8J$|nCv-FKRs1B3<=qi!&e*>27b)3H| z)JpY$dQd&29#)S~^D(tbRaUiB9aY0xZ-ri|AJ7l#hxEhx5&fusOv~5=!6tcc=bJXN zB%>C%r%fzx4#>01Gst}*ONqSs+X*}13#(M#{e5lCxwmT=hy3z>V(Dl7iC>v#Q!{!{;{Ht5Iolln>ZlzvJ*qq%?j zS@oQLPHoX!)KzCCl`W5x6=KgB#u;w0X?y`PUy`|q$ zZ|k?!F1<_b*1Od^`W^MIepkJx-{bD{Ps=mFKh2Y%KhhuTPxPmHkKU_4)1T|l)jqvX z?brL&0e!%_hhOS1)i?SZ^{xI+AJhlc_xgKvSRYnD=pQnljUTlz4OTQXgJ%~o^NWooXPr!ME{yQ`wt zUTM%coc4-YoQI6|3c8y%N$?+*VC|I$OW03mxnfr8*Ip4lSrSCAik=nC>FCqbm@fsV z!x_Lso~6AaT2%Bd7uwRh7m!{EqGxZ0a&Qq`43~fhu7CyL=;c$HKOf4%br7hRqsikG ztoD?nm(OE4P%m?NvgqY=$U7HAFPDKBSPs34)82rd&ePbD zFdW(d_uX?UWv4+Y5FO8ZCy$11P!H-uGWji_BE*8U16xA{Xis?xX)2__2uO#K;BGH9 zqF!T2goe-#nn802r7hKhdM%+9w1zg&7P`ab>?^mnRxI`6ARZE+2{eE%&>5OS2j~hN zAqhG`9ViWFLKQd%&V@>FHeANO;~*XqAQ9R@dq{!~&=D$A_X4;O7+b4@>4^>*dNUyMtR`yHrbwlTYz z!)OJ`yNIwRZ+oPvxBYM)?UKqt+9T3_Xh4fY+9PdgcR1~lSlSHp(f5OC0rWuQccq;$ zgqFlOS_++MEBvT`(zX)(P1{QCDD8n^v^Ord+6!~_3;IRe9^=tZdy<5Md z-_`Hw_w@(bR#yk~7y3*6mHt|PqeVk?()(zY45!U8J4kyXYYQS!L1)lr*`-&|{_?e_ z&ZRwezNTe?RPE7$Ys1kru~%a*IKe$NO&;O zLV8Yb(uei)dW+tw521hG&^z^;`YrvoS5JzXJgC3d+w=~-S^tYZ{)aZ%5&eTcrk_P^ zO8aU(EhlL~tT895R^Op# z_n}#bqey3~E7SsYrMgO8t*%kms_WGC>K1jYx=r1#?ofBCyVTw49>3Prqv|o0fuh}| zRv@Arttx5Jv9C7>%f5~d3QMoHDq-Kr#9~$&(X0G!AAm1mAMA%O;42V4^Al``?DXn) zlpTcc;afNiKfn<<1fK)%^*!|~ZWzwG!Sw2%l)Vl+;0<^U z-h{W{ZP*F*Sy%Mx2QZBJs-&V<_rOPx0;!M&BOsVwT}}RG5Pg;m55wbtEixp%x{7+6 z;A?mmUWEr?Bm54z>D3j~c^-yBC5VM}uo51Chu|4_3`GAu4O?IO%u)2#ugIG=Zkj44T7}@F`S)kKq%r^{T%P-D>zRAKxXO)Iy$u z>(vZnm$6U$j7%KUAqFZy!A}j2%T_}<&N#EDnPN^cuQ0>5p%;LTJcb5Z8>Wt27nY73 zjm>V2r6X?&OGkD%vl-qtza@#!{O%g{3w-sLg7j+R4%1 zooO2_T6(il({Svg*gW#3H!UX^es}oF^F%>0SOO*C8ki4v!A-CTPJ>c#I-CJKEdMk1 z(F2^zm#`1^!x!)sh#nEWxf1F?E2suFVJ=jG?;tn5S)Mwglk%!Jx3iAu&4(dey_w9q zqBljW#6ndNy;%YBsyF!!_WT3?LP6=xQ0${C*q`XlT_76#GZ4KgI`RR?O>gd{&ZDp% zhJvFvFJnFq;voTY)0?7=-FkB#%blPzbb+qW4Z1@Q=n1{R(VL<#-FkBf%X!h8A5cF( zdUFr!NAxD&o8BpRz3J3EKB=hL!kI2H>zZxN?)Yy^3ilZDtv3f1g57d0dTDFE?3UdN z%x<{~m1yhDvFOdsUcI>?EWJ58i{4y=Ux=eO54rT_F%<1OY@*_S;?tWQvgpl)_@#&? zRP^Rfm)_iC`HAGLH$^KBDg?{qS}c=W^JSUr?zK$vMOkG0eH+&gM<4PI&*$%(&8w(j z@6VT)u)mRx6|+)5eaI#w{=Qs;_K*Y}KoN}_8-4~RY)2E!p4QXm!5U<9PY zNEij9VGN9gaWEbxz(kk?lVJ)>g=sJyX249i6lTF}m;<7P=7MM%(PX0kJ#YmqfGgoD zxEij3YvDS$9&UgeVIer}g`1gQ47b3oa2wnXcfg$>ZHv3%9=I3ogC%f3EQMw8?|;dj z4AK|jHP``fz+3P(h>lA(Vmz-#+4^n|spy+e;Q{j7#NZdp{6FvsW!p)=f!**Etbpg? zL3jW}M?M15w`L{j0XPW1!r!nTMDPCsf5ATZ7Ji1K@Fjc?q7#q7EARt|&VCiXg2V79 zd<`$dArM`+2VRFG@HxB(FThLi1&H?j5#EHI@GgiJ6uaYZkjycsz$eVlBK?n4bn?IO z3~VW8+hMmcU)zYuw8ySuc@wOL<&|x_^5e|Qwf7kQ7RRl|mjOBc; zdLg_TG~&w}o-eONnRy=Nxe5EGVQj^UNel>=59q%v)1#5Uzv4q6^M7Hr6mQSpuz9XP zORq#3euN@^7xnr8wp{U&{Te?3@s#}nJL$Lh3w(~hz$dKz4z}gPXwOeky+2~Rd<~z2 z41EA~`5s;d8}U1M1sn34_;S9F2f|+b4W2;@zlwLlL3F5Le1I0+j;F%gSZII3iu#3; zBg%gI9&2{?rH1iCK&eFA$!-en@%toeI6ll-*Zd`i?cw8WmCn!M9CGv5J-IzqvtBPd z=a_XxCa9vLzne7=M}Nl^=X}EGZ&$B`eI4*glqsUWxd!o&0Ey5J+Cvg_fR4}!Izt!e z3c+k}y~*zbeW4%phXF7U2Ekw$0z+XK42NV$fmBF?5s(feVHAvpF)$X!!FZSe|10`? zIp-oe(BZ*=WhdWBrO(~kTCZ9Kvk#))u9H|gj!G= z>OfuKv*f7{4WJ=3g2vDUnnE*Z4lTgFZ)ZN1{5Xh*1W1H-&>oVY19XH=&>6ZwSLg=a zp$GJYUf^sqFKJ=+w~IBl%lA*APQmr}i8~~xzun))X{N*jDafg&+0yK64mQV`mzg)3 z_nE8BP38{s6Z4??mw9Sbn0t!o;R5N~Ch;fzr|kQ-WvBm~US7|$t*jolJ6xWoyMp-J zie7f6eQ4}J|6B1%J!IK;k9a+No!VK`V11U{{oB4*-}6?VsBrLu`avDx-;b8>sCbY5 zY`wJ?FH!Lm6;Dy|6}A6uw|qul!*5jj=e@3Wc>ldYUp@J^)BEpDdhW@;x4i$}rXSxf z{_W=9JC?ucyZD@n*Qx!_>fvR1pjv&r@I$r#eS|-%{QKDZ?-OPJ+fVO5`FFtk?+ZLu z<=>aye_!FfD*wLr{`&?`R{8g><-GP&zk}#B(JNQbr+)$bMLYy|Yy{DHb)XeggPJfGs({1`xDu{{ zqpT-!1te~OJDx&$>Q#aoP#s#r8mJ9*LEtQ~-&`5Q?4`Tj*v87P}!7t?!QS@B+v561)Nu=izd;I}N78444Ul zw)p(Uf{?b1v}2r@5c}Ehhb&(PaS#s)kO;xrQ=;L&V4bf(Vn;~ai0@z?`JuG6zNhXX zc#!Mujwd1QE7A42wZ%kt{|JF`KI*Z4eP{p;p%FBOCeRd`L30Qe4`dnng{h~DZu|<~ z2pBuy_)qV+dV^){n^l*u=A5VIxz@;eeRpX)w$%;&J=UC=xz)=u=iD{(GjA*V&E^~C zr{?!;U9^3fs2Wi%qB`*-6xMW7`dw_oRxFA*{QhDE=XYUW^-eB@O~gQaLU#D&`0mY( z0r{fngHQ3pF~`(L(@L<9hOsL|Jd6#e?AW%lV`s1~Wk>OQN^Dz(l^ z?L8jUPpGF@mdF@8QPFQ%WeJ)46(vtp0~GvU>TkSt|55+qtvin1U_-2$zE*?8dN^kJ zAZI<7KKLPb%-p7w4`eCTFUMJH47rnomWYd}Om++miD&;@(0YckC!2i3u;V#!)hvG% ziHp)#+t*IE+)wvY5<#WECX#|4V4Y!_CVGM?_>7VE|8UVX2+Pv57O=q2iYeZN|&m#SrY znOd%wE2n4QI=sWhZ~O`Fj1&E0quyv8i$uY2N57Eh7CZG$E5e0Dw~&|>66vCFyk$1w zEwh<@hu@FS@s=rC{?yHzg=4R$KfTqym`{?IcoWM{ktdP&Id(h4uYJKLkBh%dIksCC zI99)S6EQ582hqBse=C7#XwmJWgR6n)ana?X=|y9UCKs(=7edunqOV(mv=2mEJNi79 z`8dc;UxuO~bJK{TaYavx&K(BBAsJF271Ce?oG5#J8TRGacBOqKZ5YwIIkmGwX-nnS zR+2W6X!{lD?FZl?cmy5;ce^O3SaeQ%=N9}wZiU+*3MzpUr_O1|q>yg1={PS`eI`# ze^=$QX2BFcVK}}yj7gbglM>-O=jkG|e6DqTTc~gPw@2dhu&!?_&Rj1u6<=(LYQ4~0 z!rwKfv>HA(zczn%ZTFa2igrUe$m>)sjCHcxMfWeTQJbQ6MB%+>d>3^zs${VXi&ZbyyjbA2I*=2>5rpx6WIiz{%KT5n{wwE=;3l3v za{bP=G%BOhu=Jy!0zb!F!l(j%`HYGXu(wl!3=|ZAJ+(gSp*1DcJ5r%Om z5hCtY%ZLWyMBsar=zD9Ft)I8^PQbT^U-XA+FUwzI#s8Lf76+}et26iOj&k9&e%$Xl ze#L9aiGbp?etcUeQnqVf?tGa)+gnyvU7*US3)MyHte~~e51Q-SS~;TL8HV@`1y0Tz zAE$Mh;jQzrH+?B{ou@MA>}|Z5x%@)roL%yYclk{`yd>v!>#zN0>NRU#{J!i6gHG%0 z4J*fP3yas4Opdp|(@y);n{StjFO#%?oTb3j_96?+HH`DT*XrVcYgU@&OEUA$%$$=g zl=NGY9Hmapk|+75ic;EJQi}AnptYnXvEr?=X#N&c#l7`TS7!uS<7VPz`r89;=e!w9 zD9E&g-1~!;JmSr@`|ciK>5HKCvihj`c5}pv>%(WtisC7;JEg_yl;5InQ4-hlR!uY( zeVdhkrzRqcCMJs}DvQ1+vvupVXjf<=VQOMwYCemac$k`qnEGM$s3vNQCMu?0rB>_J zYK>l_*6OuNTDec_r!!+cN_r9r#F5b-sl9ry`b>Xj9gDF#W}|? z;x(ePt!a<_o9@?sUV^4B3D_&-6zYKmIQ{pJ-C7;+}Ev z70YLn5@#&e{>a3J_M8u=!!)=!hV~d#Wd3uuQywaT*a3pQpG&6R%aqYS$iw(Ap0V%> z%V&|!gNK<9_I^(KHM|atpW`_X7+1$L6>30Br~t{7XZL>YBg#@B71Ce?1Z%%L?NyWQ zp_o01Abl1#z*rau<6#0!gh?oVY z19Svwr*>tX-%067kQx7G9?PNFR-U8YDXe#llvaypFkBd8+f)7^FE`uE6V&O#Iv62BYUkdIi31^I5w?vqSwnjRU9 zCnmSj)7ws(rR&H;5hfej({UeQz-RK(%<3;UTYHj#?C!vrSfjcp6u8+ zGT$>ZPnM(|;`Bn6W#1d4HAMfB_j{ zAf0zeMaDm^egmKW#hE13DYZB?!_dD@{KrbgtUX2aFFN1=h!)xh`{4@^ZSxKM1fr?x zKr5&QHK9CIfn+!c-@~_X7=C~wa0o>IJ_w>`-TGIwTWzQdFG5AgfEVB;s07<#H;C@a zPX7*}YzMpnufdz}7Q78R;X4rh`!a}rstT>40_0Wyrl6btVLfRR;Kv(Dn-Ju8cgkB)}_iwlyj>2E?A4uCJRQ>xN zbz|Wjco*J>P~V?EN!?Fj4}1)tKrsCqiT}8q@s-^1AC1hZv`K5YfG66gg*4SSeGwqT zJcN8}Ux_0w+AX{|;)lYD|G1GTiOZ~bJUzpT|CoSRSrYw@3oicSAXMN^BJ+eB|4|~b zFJ)Aw>3F=!I84FfKhE`w$0L19eDQcPu%0eKwe}%iqxd@oi~l&*6^~~H>QF57juOu9 z=@GS>U76(D@g3(g_ROd-<2xP-E574KJl~dCF?)K372h!dAEqQ?L>Afjj`bTf49A|D zR-Bs>hMs(|gngIm6|>Tap5(Vx#=p4*3TynE#q8UJ;t&lb;1r0Ae`CiUisf3wK|CZt zWc(Z2G+c*J^<-rH8~Zyi@NaN?YGAG7x9oT$`NqG=+Uw!??cFeP9}zUadv9iTFb9~U z%~|Gk;cDjs(XEm3Z|plMJq(=5H~x*-M}4D(7QOLr7`+|~s67^{|M)kl#6x$^Cs^ul z!L@7rZ;XjkgzTY>GWBbdVD}(+-UzRLolkLI{ONPjuWa(T_|unRyJevqTm%=xB@hGU zL2Ppsp%PSvDj;^dYET`-jwm)ru?dO|u@2OQP=CK$P`4$tg4WOm+CnVEL2mZ2P;6ek z*-jtm3;m!!41j?!2nNFt7z)E+I3z;~q(T~ufOHrMqhK_Qfw3?S#=``d2$NtkOo6E| z4W`2km*;4+vC^FZu!JU1Q>TmcKpfXf}svu(?%6Nx0K=h)FnC2+9khoekTEG`JW3ghQpTy2@hWAEN*SM1 z#=eyCL8Z;*w7>c=A2{}C;P|4CaLtENPsSMa7#W89Eq`SEMzM#UxGADvL%7yq_>@P+ zlh1BEc^RkNne3Q5GWxn<_>aCWV=9W@y3_OWNup0~B-*4s7SASZ!ZM!YHms}}L9Eib z$KLUcB%WLB9m9~(H6=b~pl`Xn_5Y8Um^nv*^!K~B&pZ-uX2!HJ6Vscqs2A0N|e%&5`Rr^WP2pO!v#X8MRaG4@qN zs~BTaC)CEB)i?flQ@bpbzv;!Ph5Z#Bk|+JzJ`-2W4Z!qN4A9NVy!y%{spra@s z4I>~O2EqX71-)S$jD^7dpbN=c4ALJo77dvn{c5tl=vUGHw?J_a4J-Ehejqmd{_qF) zTKq3W?>ksO$U;j1gm~K6LeCPX`_BT=C{SCCg%8@KKXjxg)qu%uRCC?DU@_KYO%&gk#A}Y z+GCOT3GVj^D|jYW!UG^}g@@o_5W6=c|5$wnS24dD*1%d=2kQabuhq_Yf>eBnWt^vt zq))>$(2M2gNH@V|*aBN&8$1sg@B+LDQPh2z^c8p&w!>>6KF~Yh4PcC5KmYa8th1Z^ zlH|WjDn8K5$@_rxL-+_jhEL#A*aPb+FGl^(ncoNd;Q$mP|4Y)Z;A{8>zJ>4LAbbxd z>m4Tj0gk|#tn(9TMe=_k{S{V__dBVy!TyA!@E80I$6y2Ht7B~cZja&L;(9t@*}t@) zm$=G>JO#GLoc@KojD5zBe65x?V`wSJM6X}NZlAO_=`9=LG?JS1H_mqAc|Bp%wdP&s zBjz*acJssV_8LZeBVyNg+x7ih0EY1x{nW&Azm}eJKFhsf*p_>VKa$mQZx}B#DwL?# z*U+_Mxi<_MmGo`W-S93dS4M{V5GDIDqfCkAULLW}@xGR*`9zChG^(!|h3Z>Ip^~Wi z#JSf$FnW|&?hWG?ZMT4AOsk{XjtV2||3{f&yu=t*k_MZ05qCdWzLWQ?mT|L!PfrDu zywBT%;58+8FHt(PFO`y=)<{>rK87;ZmU|6(LlJ!PY4(#_`;JmYN8dKAm+3E)2YoxX zICm%vfA5_1?Gk?fO2RcTAMOIjKjJjzOTp=I2Jndd&&1CVeIeRnAM6Lw8lp2qV~Bnj z40WItRD+sO9;$#_e~2D&>kmiA3?;u3)PU;H5{5x-s0%N`%a8#tfM_kzS=&MM)5A~; zD#LJS18qU{%j@9iFVSOf!dvh*h>l4nZ2=V_7OFyPr~snBQXm!5U<9PYNEij9VGOK> z%^-S8w4CU?$5|GAITpsjc$feaVG>M+DImT)t3Wj7*C3knRniARwCLq94RZ4JSwZ>p zAbL`?oanrDEUyI7#Sg(V@EAM-qHni=qh;4HKNr@6XlBvDA2NR##6dhHKq9n*_K*Y} zpd+jW(T<`UMIVZm6dgH_v=elOF3=UaL3ii@J)swf#{L_QfulG7V}1zy0llFQ^o4%V z9|pic7zCo<--8c8^zpl-qND4P)`ter5E?;aXaY^488n9{;ZxWHAHyfG3?lkA#;9k+ z8a<3;V=|9*MBf_OPybK-t~X=%Tv34i1((rZ(213CFA>)^p;FglaSawL<323twvWnc zEgspan&|KJxU~BVPOq-Row=BiH)74+l(Z{kCciahCc2BwWC%hlKvb(-}ep^7v5lgSTYq;nA zV`#WbocTqx7!1Sh>n(jAeUt4e zchPq(p%sX>bM#>>^P%XQP&7<#8f7s15+wrS;hI{=W zIDR)5RzM%K9Ow@o@uv}gntP2CH9clLXS{BFY@(!=J{jM(~``95AXzRiAb{>{>9QNEnxGv|yUH7F`;)brV) z?L7?p_Wz#b-u5V~z$`l>Z=4Mtkxdan`v| zd}hM&jPco+8M&a);-43$XUxeH>HOq=3*i4u`#fOmxbYoT(Tum<&=+qI17E1q_~O(I z<9)%9680X>DQ2a9?WrYviIs$FK-xZc!A-CTPJ>c#I-CLWg;yHRgtOpmxF4p)gWKSC zxC8D4E>D*Jo#&8uE-VFUPsG4-xZ(_s0j`2;;W}6aH-NN*R)VzQT7k6jq-`f{lPVzN z7TrX>+u;tl6Yhe0;9ijSQ+cQaH9*>jEny8v+psR&N4+I*KP-i1umVh^;$qhhy`hPTL1(mv1^`aypf00UtVNS$DWYEKBZ?lQJ( zzc0Aka6Db!%A9j@j%WIrQP@*(f0z?@RL>i48heey#yj1msb`5BK4?;YFD?(1D^7!q;&4Lr+jpB#w>?u-WH-zQh{Wh_@ogHMyKvciaA-H~xn z2dXgz5W~8N>Puhz!KT5leX!gK#mPlqqLU2M4E_~RoNT8ghWdizkMd`fwN*cTNwJ@P z6P+k}^Hc~$Upo3t^qy!$M_-DT6TKLyFJs6n4;4W4PbClyCAv*?kZ3v4W1`DM(}~6s zO(t5eE`<8~D*8$^o#;c+R*pW4Wj+q#At!wiiiXHdBMfFAq9;Ue4g=AN$&do6kOm_l zn7$iJ{x}#96JR1tg2^xirb2ESO|;Zp5KSbSZa#S63RnPF!c}lJTm#p_b#Oi005`%y zxCs`)&9E3m-%I=9HgN0vyI8&(?ty#ZK3D?x!%`4^Bf94bv{rW7J}2FtlP1qeZ#!Bm zP%CGrfwR-LvYlX>HJAb9|wsdC}Lhy_H<^HSjPjhd_OKJk?~@ZNF+1 z_H?r8%lurga%L^Fl_^&8@n%@t3Bw*8@wfK*TZ_lC)0fe0adm9Ib{v%lsAWe}F${YY zLZ6qi0b{E|k6bMgz3a1M3Oh4bKixBxDM zGEf%EfoS2%AUd)Qw1tbvzZfoo7$^@FpdwU)%8*Pw(ZdxX7DQ*ah6+%H@=)|>Rq9oP z8c-8zL2al5p=i~*)T;*#pdmDdCQvFSH2>tL)NKaML3DL1($>%h+CnVEK|CZtBD90{ zkOUo|BXokHtlycm3y4OJgLp`QL}&-?AqhG_N9ao39?%ndfuq&tQPv4MLl>zB-Jm=4 z0LR{#%sMHM3TZF`(qRa7PLIjmKY1i|N5Na0591 ze$1S6a*k)3*;KW^kP6{%;p@S-jn9oEhQy=3#AIaA0-pT+Eed$!A#5(*8W(Y@xxlwGy$eN^es1+7lrgHMC!sTzyjyh#+sbmhuqD4RY@BPcac;FnS(zQy zC@UGt8KDfkM^|zZIrk-`i>nj)0vz{1!)0e{m_!9QPe)s~uf^Xm_SP9wb+3zSj z2;alEa2S4oBX9^lhw@Mf+oyWwG|1(m_AXa8jRb=U!K zz-#a(yajK=PDqCA^z28Jr9djA!3ao)kuVBI!x&f%o8d?J2mXb}VFQeXaWEbxz(kk? zlVJ*o?R6Dwg0JCOcoo*flG5Iy?`h!;BkD^WTj@M`RzjMaxTgZsb@>X0Tt@-!A z6UAze+??HmBV+LepO$gHG8Kk~EV!|rMMD-HduXGu`m@a_&TR<89vab)S^Y0XKZ=&v z2m9d*_zJ#(pFp%-9cTsBpeB@uDv+Cgyqr3Fpc2%8>d+EI`_zWIAo_7IWWWpX61)Q2 zVK<0wDG2>2+NvtFh6+#=^rPtOX)qmTz)ZLlX2EQj11sQp2-J@&$qUqvvE)4sTfote zYnY!4>%pxbzhpTM;voSNp&hh`B5fSJLO|68d~yO;^`7bWL4Lm(-`~vbvtGugmC$ zx{+?In`ot*>E^nHZmEmwb95U<=7_^WxWTI*cj~!VP@lqvm^FSwZu+rPK>UVa`f;CY zyyrny{IeC6ZwSLg=ap$GJYUho|J4bqly>qpUpdC`xeH}j(( z_pp9MKN^`+@b~E%h7->=v*K}@`TuQy6#XdbXT0vA=jpC`s2-xb>2W$)ch)IHN0pJ$ z{Jr|-=wZ5xzFbe#lX!#sf__oIq}}mdck6c;vmht^xD@;2vV7>rCFsW_6lB5b$H|PW z5Uzeq(}Pjrqj|S&$NvhZAI1JSm)`q!{I5X!<1RF$FaB3{_Q$bW-dul5?6dsX9|vjs zqa^yVlNzPQs~&2e>Z*pSA*!1ir;=4?m7;!BKdGP9FX~tIoBCb-q5f1y)f_cUby1hA ziE5Jagry&s@(z1hKJ?=f^kWhVvdHPju=?j*TAVu((T@eDA4S{jgJAkmG)Z>)F`2T1 z@I8DBhv5e}0*4?}{U{nW1A^&C(Ji&0G7N_{&=y2jiU!#MZ$L2p_#OG8A4Q*v{-_F$ zeiS`)}y&3OwbUjwm%k}eoPBnKOPE8KWz_+7mXZihSIPT=xn>0f*fdFR4XC<8ID z931GV_TqURh)uAN}gW6CRUWAt+ z173ia;1$>oyFoNdcKT5?NKX1u>|LTC9{|z81*soJtBr+F?T>E#xF*K7KZ?fAkNr_} z_e1auJO;54s(#!@-Mr|>->EMe(s_R^?S)Pds{Qd8b(7&Q_z%8;yy(Xds2|afMuANc z{aD!g@p05oc=|EC_t%S2NsSGJJBoVAbnGE zdw(4`{y;GO7|j1M!~6c)_J7=miX3F=#}zL9IM&bqakgcD+>hI6I;r3tT^no^b0&`F$6?AUY{fKZ-r8 z3Wzp52szmwMPml)N3n^8q8~*ciG~eVKZ;%v{U|y#779{7=Jow`F#Ra@!2IY((Zz24 z_z25^`cbrcc@X=fXnM!~DD8#3>PNTzQQ8Z6)sK<)*N)HSn+2u=!`)CsKNhBb+>HHk zOxXHyZdmrmPQ1S!#28We>p!!#!1SZtf2JevuUB~e9}BMk%w_rPKQs0?_Mh2|ejF3F zew-VY{jn48uLr43`HVBUwdm=`CgJGEIT8JMLiD3(H_?9i(T}2CMCa51$Nm_qeiYp& z8aBWBQFLfg)Q_U+@}nO`+lQhbMZ=4B6ulbJkCFZ}qB$e_u`u9|v3ZM;ZUrd4Fx|#}%35pB^v!qtk!pc=W$sfyN3xIrc}p|8=J@?T_K< z$H&o+oAa$7rEhr=>p$a*N12EB*Ox`~V}a|(ShR)P{us*pYq4QD_Q$~Y*M}&R_t#<* z3$#Dx<^8qTtisig(nrO4f4z_Sg0w%1b{h-fzQ0apUD0#-(T}2w-TF~A4{9=U)ld}@q5JoG5q(}iDB6v<^A;3ie zu-;$ywBBDAoc+;$f4vu*sAGTJA_Q(9i?+MTTXurQ6o{#s} zoADG}QDFARtnnWm{kZrz`#&B}`(y6$AM+Q#Cp`P3{r-A*KHgt%R=bqgR*RVZv3WT9 zab83}o-qCRSw8jStE?Yrf0Vuuq4+=M_x<&c>__a6VyD{$`LRDHv;IFIHrK}?ul|o> zpOyaCVk2A=WA~r=o%vApV=Q&|g6R2muoA-2k78H;5dMX{*dImfy8R!&W;w6+N4Ni@ z=-9mUpBYB|NdFm8eg!i{^yA5^AJ>Fse_Tg@l%>RgoWMBKSLg-$N_~~ST3@5D)z|6k zb?#%;EW-Y{gm~Ho)qf^;{kSiL_~C`$FV%EMQ<0}79%|!#Qt~+X>Rt%3#lXhXC{#zCj9~0Fy8{?{k7<& zK>a9MAW%Q!Btw4fkA2z3FYKcy z={(X<^kW(7PJv_8PbZc4*JVjX$A+RGHFe*kuCzJ&F#j%T57K(1^`QYYghtR9ngFga znd8r#LEXu)hrAJ_pO7wt!1&=$^H%x9{i9V?$WwOu(H`aSU!#;+&NPf_W>YiC>~D@@ zKD23Oh@-kJ40(&8?Kh`d_nE8B&E^~Cr{?$J?X{5Og%_5+acqIv8{KzD{2iTTd-TA? z-sNrH^#06pyIwlu8X88Ll{=chQ(zj%h=zu-232DiGTMw`NN;OdlJNv3T90821c?@I z7ztn)9r)W5dV@skkvzkYv1SZI-c`%eXZ#hdDDxwUGyXU_b_|+QmSq}69HYPJA-)DB zZs*v4r}7s3lc4%?7X8+x&ZW9P=_aD3Z)QXt$ysfU#VB*mbc9iFWd1OHcqCoNm^Z74 zt}gTIvCM8k#Xm_5^nXyblINbL(?kAmB2~Kc4C6Wd3_X;d(9hxx;9oL1V3{vQBD)*L zQW%k?%vsm*ZFuRPwcE zLF~eD5Dy8E2<@OfBtZx02$iXO0bB@Wpe&SwQ1$Rd)V&xkfw~X_9!kCc9P@#MErFxcLkHVIb$k(Avol(eT407KHkFKCBzju#clnpF;C5 z=Li$g^a=Q(wnvM1K%3hmNcN$`r|Pqwp{?(od|Q({OLls4YuXG;(-t8;>x+++2R(ab zn0nT+?paTWT=-?w^#s4m&{XyRX5UAokt2 zVJFmQUD2~*8x)&pRnpcVw!V)b1yUgmMnF1@gi$aW#=vUW45HtX;b92JKj3TD6Z`I~ zAUaO^PW=wkU^>iznQ$r0g4r+!R>1S%vU@okO zN8u^>5Wayph=&BoPS38T>{k%&?e-5q4}@gjeUA11h9Phi{(}GD82kab>Dec!^Bz=$ z{P+h{VEvEb6R`EHzh;ftcLT?VENvP_3{-%EpBfyOtp-2NIJ2jjVoouyFmDNOuLYnb zkD-IshS{HeU0D7AqZx~5jnyCNrm*}0I-txJ7PvpaB3FO*@cc|MA2P!#AF|+aF+`wf^VU-{4OcqlIGwAFOBRSZA&tn{BzzR(g#0 z_iMxK^}a4FuYu8w*t5p!wRBThUIQKQ8dzv~4cwh+D=lL7QeXU}=GooBtoc`ksV`$o z*xNc*%t|Bv1N_#?du`E|@; zRrDmYuINkACb8h?OVJv6)t4sQlXvxrkQaT~kNW-LYxdcc^i@(vUxs2Yy(q@^2QXMy zd<4W7K=h?(^ar3O%Q@*w(dnX1#h0K7v;xtWmq8rFLjoj1J7^C{&;dGv=*zCGBU-pU z=`WKLtdO%O;1)?v-4@LB3Jn3M#FeY^W0nwLTSmy)McBJo;z7L_= zOP{2!_@V3}jUyF*j9~imdBb0C9^a+6?JuH2{2Sa}nt>H_k8#L2YLqn3H!GWs%|x@8 znQBfBPnYFze)F?zaZ#3>99GX~(f#IHbF2BLxz{`#?q2h)Iqeuq;l^+e&!=FM6+>x5 zKKd|qFF>DyPSzOYh9NPO4C5)d0X@6}%c5a8eV7bmxn(~zj8DkD5i8=eSTCL1Z%1&K zCGjcnO+T=71V#Tm)<-+{n3ak*fj!x=lVo1J34GIAEWM4Y7Ozt~caJx9yah&}SKaUE z<(<9M9E}}Q(rJt&B%TB^?@W&WfU`Uko2ksFV*z#YB;AVr)Ly<6Z((~*`~<{@!0{)r zbHBGd9_)Gfd#~3Y;a_^{JGrTr--NSdr{WLcfz3@carkSrMW(>Sc~u}84nj`$SJ8r^cis9}v|Vke z3ok-N$bc8%B@jKm9d?80vh4Kn5XyEycJ^1%@1l=Ie~Z4V3az06d=XY2znQq6I%brrRDHI6kJ^9-H0xm~MM);P{w^@p%@%+Q3Iw)NEj$dpY|U z0PZo^Pu?*!i;%wb#gEE^zPzS5cPk8i>G-Qg^d)|S{LU^1@mIYC3d>)0G5a>5I7Iwa zv%cSt<+{W{JVg9eBmS!H->Lk}2iKSR*<#+-&FZh}??IZkt>wKo?}uDdJ-;PaL4nP- zHM^U`%}M5b^XBmORUn#HMl26+%+B!az4?z>b$t4exo@k_Usd`n6=i=_>4_HHUo{n9 zR`)pt&i}9bt=?Hg{R^7Z%ZzW82Yq{;Ti^2HH`v7cYF^3OQw;Tm@g?l#bBbAM#D0pt zHP4{m6cmHv5Dg{Z6cBry*y#f8r(%z*0v*nX@hIw*gj3-(C8jOH+7zv}m@n5}&dKbeb5Ci3*0t|w&)EfumVFFBqNiZ3vz*MM6y-H9Ssz6n! z27^Itin-ZOt5dHA)P!148|pw0=n1``H}rwN&=2~<02l~$p&rzS2G9^1f!NIBARZDR z5rWxIJ93X3Q@;r`g=Wwk=21Ts`)Ld6#zGv#Ljoki5LusX_a^NFeW4%phXF7U20=UO zwudC>03D$dgz8_=nYvw|D|BXmYhv8?)8&R^*Zd%J&dE8R>DTrbQ6c^NmG1=x}eI^i&cb zRa^V@;{ARf??~?h=wp@U>SZ-mPs96F;u=T~Dd`=xkT>d!=pQBT=L363t;5q{6JEU1 z3u_y`3hrK5&SNl{XaIYx_*b73vEX}r8V=J7>j-_e{-!V16#N^+Qv3uxte(P);%Tpc z#A2(Dm9q{1^k45;6~NS}?uoDPh+MW>004o@k(o=M+#-5>AEFpcI@AX8;d`r!<@iXTjNU4x9_; z!TE3jTnHSar!16%i{N6o1Y)2(Q~=RKm7p?I0ntU(pgM?7s|ljHM5BrJs|%t2-iqF8 z39X8fA9xHNL-gcw>#xjxo;fE=$NS$Aqp+uwU2m2% z@m%+tPR@7!#dWkUL5xzROX^egX}Xj?U7w+~F0IehXX&%`Ir?0Eo<3h+pfA*AbXi?a zU!*VAm*^N>-rFC(vaX`5>T0^WuAyt{TDrEbqwDH=y1s6p8|p^7v2LQ9>SnsRZlPQ1 zR=Txrquc6O9cT3@_vy5bygBczyXdaEo9?cAWcDzZ{^k9N=QNO!mj>%0dZ-?T*J-j& z3D9z5=oK^$YwZL*QBU&ro_DLe*?Nw?OwZNx^yQ3ZWf)FOSHo~(y1MnB6C=yH#dqs_ z{4}BTiO*?Tp;zh$^n>~#{jh#SKdK+Y6LU3h+SlS6x<04|bSuk@AU)J}xb)^Oy<5Md z-_`Hw_w@(*L;aEdm`DK5@qCU_->(noFZ7rCEB&?pMt`fn^HZZg>Ywz_`WOAH{!Ra` z|ImNxqn1K-ws5Du%eys+b1S*G>D#UJ4sZU|-qcycmpUH2Z-b-DtoA&s+a1m`l!CDpX#p$pi>8_!D@&as)o@AD_NzeRF$SisB|?_ zjZ&jgv18RZ`h!hS6V)U&Sxr$>)igC-%}_JdrD_%mcaFMD%~kW%<%q8$s#n8`SG5pv z8P5BE$G`MYG3)L|?4xL=1Mns6gZ)smQmk@^zGzkkkoz2|w( zbIx<_opZvPa2A{cUxV}D0{9kW%JloE(4e zZ-M*pzV5>BL;(TEJQxH9gCSrj7zT!e5#TvM?4xUe2~L3yxW{Icq1dp0DbdcqrL~vf z8V}ryzD4ocG+=SO6f6TPK*Yav73vxJmv+QGUI6=W9ntXhK?BebGy;u56VMbi1I+;g zh=1u7z@zVFluJ+&?cV~l1g$`8&<3;x?Ld3b0T|#K_yzn7u7X7HH24wx)>ucxHJ^jM zfWzzVM!6VeMU<65Wl#k?3aWx?pgMRA)BqAV2)+dS!2v+V3vpCRO?t<_H0ApKd+As@ z>06S*sz?ee_pmjgv6}D}xBj>i>oL>a#-=zoHN{c7o&J;)bLkbdLT{q?&?j&ARsXQP z^G^P#h<|Bh?bZ9RR;FI>AHDW!0c@G!wO8ws?499=t^*M5>De3W{lgJm#|A@zfx+mA zu5pNUnvi6#B!57W_5LKHYg5=no84INACCP*BCL{Ft;sQ6ljHxB{^6BK(d(EpDf^Bp=sYg~_McO0LTqDOR%am)fQl1MR&4fOusOU&l;kdMsYe|gT^tbdp zVP6PF)>{2<#=DAS!+Q1K74NEY)ntDG{AYHn+p)~JGGf1_)BaLR%YNG^YxotOCH?V# zB6`Nf0LbGwG~Kb^;u)mYL${)NeoNDI!+nYVc?NU`MA!BNy+Ci!2lNH~Kz}d*JPQVb zThW}OaNTI|JQxGUf)~IzFdh)?_Yxo)j%d({AdZSnvft*94cl)EqAU(#L18eBg62Zm z6WXf=O0tfhix?P{1-sEkG;2H5iEiBoNZy5EfauQ=D2X2Z3iL+(FiMge;V8;uAQS2*P}W454V*@u z#J4zulEk|>hZ6I{H^y5e#{n6iGy){o#ATfS9<)dO3d$cr7u1IXqQ9R*`3uTlK_Apf zE{N26`0tHJunS*5|Lk@z6-!m5>QU{ep412`j(Up<>*2pIpTP%oh>m^+T8blz+LY=z z`r1FI{yBYu{+`YpbAQYuF}HQc>$>>AY=fn!DK`|=v>UbX)4bURoAN0~Y_QAGFJfgS z5&pwgR*DL1W)i6&GSg1_TQ^=MKDZwBjY-E_@bhCp@)B$hlBfco2FTUK#!6Ad#!8Ne zjg`#qhgB`Hu~O8Dq%)`S^9&$a5y*@`xtgMgg_WX+g_Rs##m`@$tx0_Ytg|Z+8DTT* zv*eg;AHhz$6TSkU2EV(}M%uT+cKZoD2}nKVwh8uK(qbn?A6N#jg3n;tB`v#P-z8=8 zwg{jd)o#E2kr94==;)pGEI zn2AwE$}>w+9aGfOU?SQ`6b0w{xs*2M$!H}u=2uV>dwfQA=GU*^A^A0DT#u%Z+>%@) zQ|V-T@1|bicJlLo+gAOr@u#Rw4VI zl=Ml);gUOg9M7O3Xav%-PyT<^<1v|`0|C+FB%efjdYt5RAbOnSZy>oFNDhY}AnW>W zMURu56GV@byb~nn1j#)?a!xG9^UjHqqqx4f7O+?nX)UILVDc*8h=w86;OmB-aATQ9$x5MDi_=yagl&L0UN! zqH`m};+n#s2q+330mVRZPy&z~1|)w$X+ZKHkUR(^r$Kp80aOH)KxIJkR7CPtkbDs& zM?@rNMSA%t>fxIDpaEzI8iB^331|wM0g_*WK+mwE(1QEPC;%_9Jc3XcH7_fH-HtcE}CBzR^x z@W|!huQ5F-0|K%5E`bm5?RjA&`~Tjq7X}$4BqZr&J@^*#4x3Q-5_Gl=h5iAwHi6ZMO|9=(s(0}K8xyn_q`!83nSg~UA=kQy#6VT4LqqigW zZ;JGX2Ei9<91I_K?B93>jlh3NZ^z;Hodk&9o=xAZw>QV6w0{#{jyG}rOfU=lmi_xn z^pCcG6JLxE(QhFjJ{gNqE&)ryGO!%101>?%v45{cTWY<{p)I1fiNAyd(z1U;Jtg^~ z5WQ^!2e`lkK8OeF!3MAqYyz7Bv44LAi2Zvj*akiU5&QQ})ISBE0a$Wx*uVFn9WLtZN~xvq*uPWygHY7HG?la!q|4L99|W@vx3IOz zP{k(Spf^2|o}A$w-_G!C@||wKwwUH=pZ=6SLVtIAuk|0-yF`1Y{q)0Y&{EsKldmON zyNI{PKjCHk=jq$9g+2MVN?nUsr&G6+V`8mNt3A>d@wbQ^C(klOT9V6~#~G1xk@3b~ zqolbc%k=+W)g1Am{ukM&tK5!#`ebJOJ=}(UI--|XXG;2ex}%q&8ybLypb=;cnt-OD z8E6jvzuKqc@ViX{>FMQZI7j?NrlTbG={HdR9=-f7t|xl=eUvrP{{xf}y}StZ#o*OU zSYHU1p}rif04u>Nuo@8i^jeTwFFz1_vtE7$_ldSoPs8!+U^=jHk2g>fy*v};Ebtb1 z8_WiCz&l_rmo{}U=!F3wt$bo$6zbi20j7X z!45#)^BujMw!cWyH)EPV;3@P6wgc2z>ME6;&QF(0(x%nu-}1)pdwUx8cf7|@^b~py zy^NOV4Y&7Ncl2@!%|~?GbP$QzkXkPj^+r@;B#uMaTAbdhys*CriOg`bwK(jvkdcOz zle9QRk!%+x?qCBFBjQ$U$YC#&=#_kbmc~y0-_#qAB_LM zs&-W1U!-S~*8^5f{n@5}eCiMC*;vva|F`2y?2i2x&)|-py<`8~h`)nP;8yLw1!2Sf zz4qUV=tKOu{|x&t$v6Ca?Z1`KhxmivvH!xlOQo%6lk-gw`)@2LPuGF=q$qgI-@?|N zhL`^>Y{dGDd6x{f#TlN>pyMr{;%JZFNgt-ar4w)OweINIB<*$c1OIo}e<>=hC=*1R zl6U;uQ6?xV?I;t!B=sl$!0B(q2l}h)zS8Mkm7aZ=crpKfun&{p`~RE&6&f7xH$u@A@9gLbM9?%0Pj_NTaA`*6gcA|v}Su~RO^XF%-3Yh%;4 z50h(B+lM(^|6BePq#yC8ASJO6NBdKdHa-jNvp@tAkbweJpaC5iAgMn}8#urP9`Hdt zSPwRU@4!WH36MU&#izLLGq4Nn2A_jHU@zDQz5x5d0dNp}3BCe{z+rF%90kX~ac}~h z1gF4h@HIFC&VtB$$%$ti1mrl5VyS44iVG=@qR;#l^>h|NhrgcwmY?bA>GWTGXZok2 z&g`d-L>>K}Dm-N9dlA(Gqpm-=RiPWw9cio_joMOsBV$eNU%btr7trfyi{3^byxrHj zqt|cJtQpy#$p@O+{!F66QB-nNxMXkTo1?-}l!0p_@rKFWGO|GbwiiQMwrH~A@sl7~ z@wgM~4#Rq%yi!`*?fEk&-zgleF8TQ88u5D$xBfLA7b#zHdDN%*|5s;s`#0IEt3h8^ zs#va4jT+Tceij)WeSMqy`u=R;yFL}x*>~*K&|Uv!eLW#-`u-OYf8~h2CjQD(as9hs z7M>f2@i2PHsBPzsa=Wk6X_4wMHKKt)gqR0dVRqo69N21vY)>L?!r zH9$>J57Y+@Ktpf@*EB+T3}s`KO+Zu744g*W*C5(oxjEWffQY|xOVnF|)}Rd_@jBX~ zYzIiZj`k>tzj6nZ*H99F<(#q6`kG0hsL!W3`YSYb@;xc!i^%Bv?e933zP=7e>_~nO zzh1BAxTW{}z%5;seD|Ac55YsD2Hl+QLJy?J(NpQUSVOn+#$DALwVQi}TW-YzIpH_& zlHT2ae|sQ?qV9_+7*iJIpSe9A(<*oK};ydj@cG-Fy>s$wU`{43WP04 zzxU<-^LqZ~2S)UKc$;;j7HNt2lZ1~KCFSf$9pyPAJx_c?QtJ80ohd3DUnKdMqDYhu z5?>^|CC6|k$0Vc3^%E3{FhWrz!pP5nWElycNzXb?&feZQ;^wFx;a4L5E@bmil9(zR zf*XUI5ZPo)@T1_z!Sv%+hoe>>yxyDKA(A=e=#ALbB!5aIS~ZDP{S)F;lPlBS(uyig zQDqTvI_>Mjttq|mQ^xxXUy*VCYl?a+nD#5D{i?)!|L+*-WHhFkgeO9{d3zJBgqydS zQLS&GPDpF}F7RF8BF?6{Ks*q=K)0kRzb!gYf4-#&=WKSjRA@O*b3zyl#%tXBXLaP zT6P74z?V2j;#QLQnZ*Ao3(5)rGZ#rQA5Wm|Bp~q~bAw3y$MLA=1w}!1PzF2>dI7A+ zjDu%R()!odD1Siz$of~r;!cW-*$w4jK*p0K?&SnPo>d%`Jia5fJL_K~@gKjWzM+1m z?xOS3#ptSZBf10Kn;!9}kH1J>@I@KkmC5jI(l_`Y{9)6d&|lKu(7(`k$K2Mf{`2E6 zqP&yGBDdquA0B^&<3FYq{UxP8e_G=&GFA!uz?1lo$=hxmg?;i@UvH22Jw>h|*>%X6 zCmi`P(n_K}QdBsvj()voWK6a`DPm+e1|x|88RkMoi&4i6t4Xk@$@yGGxlAke??-r;PLqM}Z_q2cpJUsbf)+^U;wY zNfb%a7T!ptO5(LeJg~wof89JzMx&cM@f=(C>htWtVf{wMHXJ^3#PE^5Mh_f5EVkFM zzOlncKihBQsPeJ(hYX4BFmS-LqesPd=r^k0$T9u;mX8g8W_?i%>^-zxrOH(wyP>at z$9&D%%(%fHSTBpXd1Skzukj2Tfd9I_hM)6I`Z}%on%|?ZQ~N{xo8!yG;P>B%zk`g{ z7f@uqDXzh)$)tQv_o5G3UqEs&5q?{UAEN49ORi3D*;SeFPi@$3P~u zpFm0UHPQZQ&DYTAcOK^=^ELOO4_RMO6z!4tGE2}F(br^rLFQ|s0i0HK(sNW6l0XYHwSZ~U2Phy$83NWP<_ZoN*g4IJQtZr~YECpH{IM@D@gcoEbG4M0QC z2s8#wKvU2RGzScbe(gy8Wwf^dEkP^L8ngjzK|9bMbN~h@7mL3kP!>e`KaKVuK}YZe zcoK91oxxL}3+M_&5a|UA4?_3L@*^B~`Su{84Blf3kmk;$Iqxvz_S_K`gI^^kRbBJ##}LuUDQ z$Q|Dr`RAWThWf$CK;IHM=p()<(V5i8BSU>FWSJ*<=wC`Bll#r9YE$QGH<6>qLYDZU z!EuNYITImJF5(mJXH)mJQw&%pNQdtQf2m%pa^0d^A`!SS=U`J{GJItQo8o%pANwSO+o4 zM+YgYMNmMraWP18k2*;)$EOE-z^{i`&EGq*R?=#6+$eT9ri;gLx6ndrKms#o~jLbQHx{Y=-uMC6q3hOG1L zkXODna??MJ?Dd0@oxUaV(-SY5OYo2RKFL4kM|j8lj2!gck>h?sQjYqUl00RImkjZc zA)YZGC;7MRhF8lTc(Uw+7t8*@G5DgKfd9#)XF)eQx#JTAzC@Gd`Kyutzt`7XCy}kpB2T4PQZVF(4B_QwqI^$CadSv!l!b z?gsaOoB)3eH|g2?(e?ny1M-3gK|VmVV*&6Gco-A}g+MGQ42poF;1NJH8_|g+KuJLK zUujSVlm+ELc~Ak|>i_3N&(#8tgW8}DAbPMKs1F)|jP%T{XqMm7Bt%mY{X%pV(P2G6 zPtXhW27N$Zkd~etg!aK;2p9^6f#D!pGmgUXXpo*JB--sIKs49{FcEA7o4^+EG58GZ z1z&=r;0QPdPJrX!BsdMufUm(>a1NXY-+&9?TW}FTtt7?a{vPEO@B_FCeg@aTFCaEH ztcjPRz6`7aMbM_AJPcT{1{5hAj%B_Y^`1q-@o1nn;tHZJpzMpXA6S990%B0V4+H^; zaaacBTC|&>IPP@{C6q)`%=0BELm)q{AvXDDD6@ifXtO}^SlF0R`d|at13KV3Vq4E0 z8(t^z5Xy(agCHLu8g*;2u+5jmb#H{WLf;XQ)FsB37?kFp@B2-f3xD~Jc% zz(-&^*a3EePrz>QIY|5|9Bcgm>IcDoK;qeuc?2>Sz~PwWQYE=P4*(s}4cpZF( zlD6;)T4ZERcY|k8x*J*hx)$eEusO}^cBI*w?hT_(>`SBPu{7E!>f1D1lW%qTH_j(t znO-eZOnPVjtoB?nMPe$)G>GXC)BE;b>p$-EvK8Y2qSg;4>FDLiRk{XBe@jv(($(;# zSOTq0KC5-m+AHDNL2TJJ{OH4^?~(IR;pdWaguVhl z53)XBJ4Or?#lgqpQt&dy4&)B2g42*&^Y!42q)bOHa(&K1_RhD0Z(}?$J848gQS&gO zn2#~V0z_Ef3;&i6lX4D)?cHDCF5xVq;rDa%PqL2q=GJh_{#0i+raF%9cO@zRQFIGg z-*6QGc!7{=`jp4rhIh zyxM`A&WF#ez1|+laT>Xvlw@>7w#_&7C0;_>O|2WQx9~Te3E#)OseMzb7UueK*as@y zEBfbsf#{=1J>^Q2+-Y2sD~+~DZ&H%%wTFU-Q@xw$EAIH`{5k$P)yaD5ib?CKt42TH zjO)K-#`)VA4=v6bzVFwWlFEPWc!=oAlF)DepT|Q)Klj4#*coCm1m#k&43Kfd3Y27ALdHhRK?y*{8)STvdOSh;lQBswC=AHhg0zwG zR1q9U#u;R+Vxg@#N;2jk*LXN4WlxkcNNWtS`ua7Iu>`q3dOUG|Z1^6e{dU=W{WZvV zE%iO><2ihRb~64VW4YAl$?>UF?PNR@xvl}~KjAzXyOHr_q&-sJJRbTpM?4wdYbTkO z{D-&H^U4O4w`EU!{qcm10+``s^?n)1$$K2Ajw{W}Pc?t0z z`fIm$=;gFbZ=^q`Pu$*X{i)-OHBol+a>4S!3Q2bJ$~Wxh)o<9%$vi?G%plYY-fYQk zff<8Vm_cX*>wLR3?Al#1%kVVj7rMi`9*?<&)OPMcm~|L}IRP@SFe3O|aAa^4?DNkD z#{|a)U%*Vkc+6A0ggJ@{n6V(^gVgf|)1mv5W98pGi|{@)ezXcEX|6|$im}W#l;<##3IA23wDjL>knkA7~J07-$q|9B2|~8fX@19%zBti&mJ;XoH!8c7gVR4uOt= zCjw6fIt4lho(gmcbj6Iv)0pe%9_WD?j9!7>fj)u0fqsGhfdPSM0|NttFat6K^Ap1Y z!viA%&jm&XMg>L(o)3%(j19biS&Q+QGkFQ~B@+VSIf#GJ{KIXnH~lqQZ_{aion=OI znOE9l;ae zNze&&22X)5peyJGo(9i=$o#|qy51(*t|xvUnTn0ltFbq1-mB40^mbUU#wO|QXuY}^ z=azto-d>J6(c3El(c47tt^q`g61`342^c`;B{;wX0f;~XL^msd=xw6CbzlIZRf*oV zfdgDX^tKP;!FsR(Yy_LYX0Qc(1U?2^!8Sl_|Iu>+pW^s4unR=y1ooi57wiK>EAIyf zz(MdO_zD~XME@QEN5L_09Gn0r!6|SWd=1Wkv)~-~2Al^Mz_$R3@OQ`C{}p`_KqB}j z^>#gKC-qNn>FezyL~URH>b&=QdF$^sKV9UO`c%B7t8V>uf8UjL>9%wadN@s1z5c$Q zH?ICu^)N*x`;q)Tdid?XSP$QLPB$v=1xYpH$??CQYn6EF-1ybfsLX+fPwHmkUGzR; z)x3i_fYj%RwvBF!R+;$g_?uPc+ka4H4!_~MO zZBPf)1@%CE&;a}sdb1~9w-@LQ`hdQmALtJTfM>x#FbE6=L%>il3=9V&z;j?E7zIXy z=fM~-7Q6t)f$`u)@Dg|#OaK$XMnLo!(Q8Ck5zR)l646Dk!cXJ~N}`2MfLCz58YR&| zL<12m6wyJ;P$xbq5gk+{HmvI^qWm7`u7H(*0Y8Il;1>`Zo17<<idNo>Y<}mE=c_ z&QnVAhLU`#BzI^eUn$8g8p&6>8FiAsl;kWW`ASKC($qOiBl${6?$LO#0c->$$0^BC zx*lu+n*hmw8p&Boasl>+n&+1L6>VJ4ktvAWrAvRu?(y5P9_-|tr@F#2+DVn|y zzSfoKdPxeeHT?`dG^v)}%@GafH@7LcX3i~K_nSA$@PehZNUx`N(Z}dZxA$6qsx~e0 zx7%ua{y}ZJHAzX$#!nd**br>AYfvXXAs@j0N>MC)LMFolJo!VIggWsFnSY~=IGKjG zDK~25_|>SRWFHWUdL8YNwV)9n5OO{7Dkmk`hyo@)AjGSiq88pzi0ONH%z$^vc32~K z1os7rugHFI0G%mblHe2*COW0wxA8~7Lqx2 z9emCGBp>Xr;PY`5{u`%*WF_cTc)R=nzZc@|avq*8XW{Ge9eiAVgqO?rh;woZw%_B3 z6iIxz55dnP+M0YS5dO_l{v`I=u%`&|6Cvk_p9m=z3M5JE9??~yB)XZA5_>8U-EyMzOHmT`kKB?ef`~aeZ4w!(kFgLUqcK1 zm-Y1~{Qg@2(bu1Wh`v6G`VkP(*T+$Z%1BdR6B{G3HAeLHMbs~YOCX}Je?a{zNUg7l zR$dB-Mko52Xmb^1w7w?VT}B(x_y3Fj-fjJlF<40^7k3uoHX&c7xABTK?ojH>c$b67d0vwx{2$uTN3+{-!-IUE=n1TKGSz zKjmk7`kJSFio`g97a@5ayw98fpCVQEmfmwUWLqU2)7#oyKiiESOlPd1U(et^^XXMI z@g-jmc4cr~dha6K{%1u{Iey#kAmjI!eD*S(DJFMJ(U>YR4P%m9e^>24ukpiv-$dh+ znf(7fzwh)v?E}|UdiqyTRC<2lY5570QA6}b#s=wa|29AIl<)I@%O5scG2-V|g-J+*zm8QR-{J-D_# zN)oF)cWlP%SxG!`tlErw5Go1e~_5x z6Tl!48Gn$NuN!CTx0+~Sp^=~w6(8D9Hd24};g zkMLXCoWXS&zv)kIyJyDtO+I^&K1W}pbHo&gDRXDs5RAkt`8|Hz;kkij*A;Mh+z_4{ zpeQmou;ls~^30Qcmm}*%DJmRK{N~w#v)B72uM{PBAaMexCizaULhZGrYr?Yxcsb)l&@gDDe*Wbb+VC_r(~@usYhlS$a>SIu=a;zPLeZN zLyonr;ad2okhEHstY+m?v@1!T+z#do$b16HluJ>+V16MU^9dei4>l$FrIUN?Oq!1% zQPg)N-C;lC)Evg_z(LFrkm!<;S38P122%eTGYpY7l7WiUFDA_}gd@90&Qa7Xte?Gx z8IJJk+vIkv{th$ObxtyFeF^9drdxfh-_09+(ZCoL+pJ9JsCp&SpZP25#s6|88vQ?HTJ`kC1L14&S8>y3 z-qi9(8a}4>Q)eiWHwmNNe_$gycr$w0hBQXL>25vf{z+#^Z24C+xGvor{H_!KuC<~6 zoBl>*ZD&}YE{Ez|10peK$e2R7u0%-;n#f0!Jf;Y@5Wk?5TSj*Jub}YRBxSw|N?n6e zccIO<;~rl?iT}~ns^LiS$CLbnPQg!zsP}L@9O5BF{DUqgMZt-V(n(^;`~uyckQAxp z5N2dJj3Rboq+wy?;9&d^9xLp}7$N+7rd02wjra)>RZRSZGFI;?pAo_te9DJ#{{jH-@jo4(a!u^N$DW@bpG9Kgh&cQW&@OFiKTOfX3Q~00LKJ-#td6DV{)H*}ks=g*3@k26(cK@R=!c3? z^a1d0afbdz!vow+&IT0y37FoHqMJ3M=&X$?dLx+Jgre&;rRW4;H>2qB z%_;h^78HF2$So;)WGjlU*qWj*fKVHX9@LhiOSYrvQ($>}itgQkqGLN!^da!U6BOO` zNs4~36GiU@?{uc<4o^|^y zC=7~#qTmrw3={_?KuJ&vlm=x$Sx^p?2Ngg?Pzh89RluX5DyRmkgU3J(P!rSwkAvEv z4j`X>U6l1eeb4|j1dTvr&;&FE%|LU|0<;9JKx@zjv<2-zd(Z)N1W$k`K_}1|JO#Rd zuAm!u8axBKgC3wK=mmO%KAbri3^fWh4mAli z4K)ij548xj3bhHf4Ydok4|NE23_Tguzf-7ls7t78s9WfnQ1?)eP|r}WQ14KmP~T9$ zQ2)??(6ga|p+TX+p&_B6p<$unp^>3cq31(mLgPX&hF%K29GVcC7@8bicj)ub-q07J{hqL~;b6O)C>#srwV znCwgrCMR<*lZ(mCBqZL?Jiz2(@-q3D{7eDnVWuEch$+kzVTv-3FvXbSObMnWQ<^Em zlxHe16`4v*Wu^*xCGXXk>P!u$CR2;4&D3G)GWD4HOarDN(}Zcpv|w5?t(ewK8>TJO zp6S4JWS(R?F`c9OcVW6R-I%ADXPE9x52h#6o9WB+WBM}#m}i-R%phhkGmII|JjaY= z#xgH3QW4>VaGY6Q1%va1I<}h=VImR4k zPBN#M)6Cb*8Rjf=j`@Z;&s<=>WxiuBGMAXk%=gR>%oXNGJcX;wHRe|)fr()=v6VYVP!h>c|nvqjjV z>?3S3wm4gYEy@@aub~-zQeUqKZ&SKwU-)3jCbJ%y-x$Hc4KKm~F z9{WDKfc=2|kX^_wVi&VZ*rn_;b~(F(UCFLuSF>x_wd^`J#4;?)axBjZtjJ2N%qpzP zYOKy0tjSue$Huek*$wO_b~C$${fPaT-O6rbcd)zI-R$S=9(FIgk3GO1WWQn$v4`0s z>{0d@dz?MNp2Sl)#hzx*uxHtC*bD5p?04)%_7Z!U{eiv0{>c8!US+Sbzp@EzB1>^J z7sF-ZGILqD=x3jmyNk=t<>2n-a&kfLJ}wuRo4cQTfXl<>MTtTi7 z7t0mqif~1v`ai-I&f-vdUJia{@eiW zS#BUVh#Sle;f8Xkl zxmDb1ZVk7VTgQbshGRL7<2iv7If;`wg;P0=GdYWMI2TXB;0|(Mafi6W+!5|*)U!)SJjNa8PH-o=Q`~9pEO(Ck zhC9z);J)Q9ahJItxGUU`+|S%q?i%+C_bZpcC2}!*CO-MI%fe^nv+)7`EH+4fuw96TT_moNvju=G*e^ z`1X7Uz7zix-<9viKh1aNd+Z}ATA@*eN=@%(yz1HYNy%5UR8 z;kWZU_?`T&sArduxSQX@@8$RL`}qU>LH;-$nJm$Y0_w^WXD7@K^XB`Jeco`K$aj{ulmNK7mijiC?S**N(*I#azc5bf>2SYBvclv z2-Sp|LM`EOp|(&*s4FxO8VZetCPGu8xzIvrDYOz=3vGn9LI7=-Gpa^ z?m`ctm(W}2BlH#e3H^lu!n49aVURFb7$OW6h6%%k5yErANMV#PT6kUm@d2_%oJt`ZwYS;bA@@reBnLeePMy{p^%WcP*@}^7M2K0 zg=NBWVTG_#SS73x)(Y!{kiZD6zzMt{2%;bfvY-g6pb0v9CGUn{3YK6Cj^GNO;0y7> zdSQdGQP?DG7Pbf<2_Fkvg>AxiVTZ6&_)OR(>=yP!_1`P(6TT4k3kQUQ!Xe>^a8x)Z z92ZUqCxuhOY2mDJPB<@I5WW>I3YUb-!uP@t!WH31;V0p$@QaWjBnp&Bi!ov*F{_wO zyi3e3-XrD|gW|p7ePS*#x0pwKP|PnD5FZjB77L1n#KK|`v8ecnSWGM~mJmydrNq)= z8L_NbPAo505G#t6#L8k7v8q^2tS&w#)(~rowZz(D9kH%hPpmIC5F3h(#KvM1v8mWh zY%aDCTZ*m3)?yp6t=LX%FLn?+icg47ik-yHVi&Qi*iC#!>@M~Ydx^cpK4M?7pV(g< zAPy1-i$lbr;xI8Gakw}_d`=uGjuOX+W5pN5apHLKMe${Ef;dr(6DNt2#VO)c@ilRp zI9;3}z9GIT&P1=|eU>;|oFmQ^=ZW*h1>y(dhvGtUk+@V`F0K++i)+MnA|tXQCkmn{ zN}?jFq88O(7Y)%AEzuSo(G@+>7vshC;s$Y}xJleBZV|VN+r;hS4soaWnYdg0T-+n> z759k;#4p7|;$iWKcvL(to)*uDXT|Tti{d5miujB8tC%3hNSUN8QdTLObeEJ}$|2n? z-6Q3cf>JIikCaz>P|7FemkLM^O9iDuQmj;1Dk2q?9+8Sk#ibHbNvV`nS}G%zmC8xw zr3z9-sghJ#svE9WY0~S`bZLh4CVD0BGo@M5+tO@ljx<-AC(W1M zmEM!ymljALNFPcIrA5+GX_>TKS|P2JR!M85wbD9?iR#ZvoWx6lBubJbONyjQnxspH zWJ;D~OOE79p5#mM(t2rwv{~9BeJpL2wo5yu&!k<_ZfURdg>*prQaU6ZmX1otq~p>_ z>6CO@IwPHx&Pm@$=cNnMx6*ggMd^}sS^8f3LAoOSDE%b;EM1kZNxw=7Qldo3v>YR6 zk~7O$t|nKPACqgyHRW3J<8p1ej$Bu+C)bx7 z$PML2azbKbxry9VZYDRETgWZtR&r~(joeo5Aa|6Xlsn0t%D|sIvKPwNE2g!rwq4F?!xI99BP97A1 z59EdNB6+dAL|!T{lUK+qJYD#sbhEh|hr97_GR_Z8ql?F-^^h(~FD$SJUN(-fp(pG7&bWl1fPb!_1 z&dO6t7p1GxP3f-mR{AJ?m3~TpWq|UmGEf;5)qk)uL>a0KQ-&)el;@O@$|z;D^1L!e z8LPaYj8n!dFDfr7FDnz2iAtO@NtvunQC?AARi-MhDbtkKmFdb1sw`7hC@Ym!${Ho4Fbb=1im0fHrs#^H zn2M`-O1!dO*`RDvHY;0{kCcyN#9<)HGV@|AK(IjkH} zjw;8LepG%^epaq3*OXtB zUzG$U5l?|qX*EX8q-IvLs9Du)YCye9&93H9?^f?obE-i#mzrCBK+U7(Rr9I&)dK26 z>ceXClgDSL7E)u?!fFw1wY*wEt*BN~E2~x1s%ka0y84(} zL#-Lrzn1#AT3fB7)>Z4N_0)ShZDwYSUq~tJBpP>Kp2t z>P&T(`j+~(I$NEizN5}n=c)76ch&dQ_tgdJLUob4L|v*bQ&*@f)m7?hb&a}KWmHz> zR9+QTNtIPaRaH&ZRYNsZOSM%;byZLG)p&J1p27xoqq<4mtZq?1Qa@I=s@v30)a~jH zb*K8N`kA^*-L39X_p1BUFVy|&0rjBzrTSIWvr9-kq#jm}s7KXf>T&gidQv^5o>sqB z&!}hBbLuzhdG&(&t$I5VS|Ke~E36gKifWH& z#kAsD39YnNMk}Y4*D7h1wJO@9T2-x@R$Z&9J+9T(>S%SfdRl$0f!0uKtToY^YR$D4 zT1&09)<$cqwbR;b9kh;GC#|#gl-5P-s&&(z)}GP2Ydy4HT5qk7)=%rN4bTQ^gS5fg z5N)V7OdGC^)JAJ#w6WR?+Bj{z_M$dHo2X6FCTml)SGB3yYuYsJb#1yfLz}71(caPK zYVT_cv=6m~T0-I?ZHcy2Tc$17R%k1=RoYsO)i{mU1WnW=P1Q8b&`izJY|YVJ&C`4> z9=($H_1Xq)qqa%gtbL?y)wXG$Xxp_N+D`3L?K5qcwp;sL+oSE(_Gw>e`?UkwLG4TJ ztEm2mw8PpF?WlH4JFcD3PHLyL)7sbC8SSigPP?Fet6kJCX_vJhv@6<=+E3cg+EwkE zmY~Jxne@zh7Coz;UC*K4qvzCv`h9vXJ-2?p{(zoG&#ULxAJPlzh4fgxuwFzjsu$Nw z=%w`1dKtZ(US6-DSJW%%mGvrmHNB=@OMhIit=G}(>h<*odPBXj-b8PzH`ANzE%cUp zE4{VeMsKUP(>v%-=uhgM^v?QIdKbN`-c9eW_t1Okz4bnNKfS*`Kz~*rs1MQy>%;UB z`bd40K3acXAES@e$LZts7xkC*3Hn4mPM@St)~D#N=n09h>QnXC^lAF*`gDDU{)RqN zpQXR0zpc;K=jiX~bM<-peEnVhJ^g)sf&PL1p}tUGgkH(}Vtt9eR9~hq*H`E(^;P;B zeXYJu59y4~>YOgs$1X^pEwe`Zj&LzC+)s zf2Qx!ck6rfz4|`=3w^(SKtHH|sUOmh=*RTq`U(A{eo8;BpViOl=k*KvxB5l>l73nL zUjISAqW`F0)ql|w^hBL9Xd}kRWMnb28rh71ahH+Z$YI=V++*Z4g2uhZeMT-Lw{gGm zfRV?@YveQX8wHGqjE9YaMj@lHQN$=}JYp0xiW?=2l13?`v{A+=Ym_s}8x@R-MkS-N zQN?)FsA^O*svD0PHH?}@Eu)T6*QjqaFd7<-jV4A@qnXj%XkoN8S{rSQc18!Iqw$3C zq|wRfY$POhHM$wk7~PE?MlYkc(Z}d(^fUS!1B^k&5M!7z+!$dzXN)vP8DosG#yDfV z@uKlEdL{1@jEP2^G0B*0OfjY!(~KF$8^$c-E#qxtwlT+e$Czu(Gv*ub8t)nJ8w-pN zj1P^4QT-Pgi;X45Qe&C1+*o0(G*%g_jWxzvW1YbooFN#ZAsLFH8k(UShG80(;TpcN z-q>JlG&UKVjV;DjW1F$v*lm1n>@oHl`-}s|m&Re^h;hs~Wt=w77-x-h#(Cp{@vZTl zanZPBTsE#4*Nk6`UyTGK(TFiKnVHQjW>zzsd6${p%wgVb-ecx8gXX>FeP%8*w|T#r z$INR!Xy!BXn+42=%!kc_W+5}yENm7ri<*y^#mwSn3A3bG$}DY`G0U3e%<^Uhv!Yqa ztZY^>A2q9*)y(QQpvx%9I*wk!cwldqA?acOO2eXse+3aF= zHM^P5nBC1DW>2%1+1u=6_BRKagUuo4P;;0$9KDkFk>)7#d2@_8)*NS!H(xYgGG8_) zm=n!7bCNmPoN7)pUpJ?lGt4*5ndU6>E%R-2c2xg4<~!zGbDlZheAj%>eBWGPeqerR zE;JXJi_InGQgfNP++1O-*4&28o<=5}+3xzqgA{LI{C?lwO+_n3RledYo4p!ucwm3hcKY#uR>n#auJ<_Ytp zdCEL(er=vH&zk4VZ_M-N1@l|;JM*G>$-HcSZ~kCjF@H3FGJiI&n%B%<%>*;iq^%e$ zlaqGTd{%y|fc3Cd&?;mVwu)Fqtw*e4 zR&lF@m5^A{Ds7du%30;D3RXp{l2zHNVpX?lST(J>Rz0h})xc_KHL;pmEv%MSE31vw z-s*r}$$LlZNvo69+3I3-wYphPThCbCtsYiStGCtH>Sy)023XHp1Fb>UU~8x~%o=Wu zu%3(RKhhdyjkcb*##m#m7p!sCcox0jYq~YV zdefR|&9dIMW?OTtcdWVAJZrx7uJxYvzO}&m!1~ZyXf3i9TT85^)-r2_wbEK;t+Ccx z>nz4%EzaUC!4fUWQY_WdEyFS`%d#!UaxKq_x7J%5tWDNtYm4=!@|iI&Ph?PFkm|)7ID48SAWd&ickW zZ(XpywZ5}1T9>TL*7w#A))nhV>#B9l`qfIXXgeV>lbzYlVrR9p+1c%!_Pus4JGY(B z&Tq%sh3z7CQMEy^{B8c6GakUDK{*KW^8y>)3Ve26hv> zsol(OVYjr~*lq3hb_cto{e=Cb-O283KV^4`>fhDwWy_GtTgdyGBSe!(7RkGEg6U$S4eC)gA1ID3*k z*`8ugwO_Mex2M~0+OzDp?6>XN_8fbj{jR;h{=ojwUT80}m)gth74}MdjlI@hXNPRY zW^K+EZPnIn-8O8~wrtn-?09>;Nv-jHv z?1T1K_96SQeZ)R$AG43!C+w5~HPw?2Gm#`?CF`{j+`5 zzGnYQo`RidQx5IKIGLQRPQc0T73Wc>s#DFW?mXty zi0WU{spUNG)OPAPb)EW71E-3~~lLL!6<`FlV?k!g5OtlJI^~~oUzUe z&Nyeh^P=;T^RhF+ndnS*rZ}%UQ=J*k8_t`~OlOue+j+;C=gfEBbrv`uIt!ge&SGbY zv(#DUtZ-I3tDM!&8fUGu&Ivh;!#bQJIHDstvZFYvqdA6SI+kNQj^jF><2&)rdS`>P z(b?o|cD6VlIUhS)oo&u1&UR;qv(x$1`3z5Cm$Td1>+Ey(I|rPD&R5PM=dg3cIqDp9 zjyorulg=sUwDYxd);Z^VVga3{Kx+{x|~_f>bQ`XbQigc-6if)cbU7~UE!{DSGjB4weC7M?*G6 zYIq8|Yq+Lsxwh-LuIstJ8}F`nH@F+!P3~rQi~EuLvAfmX=6>RCcXzlu-CgePsArdu zxX0b=?spHk2i-5-uiQiKVfUze%su6vcE5JdxM$sS?s@lu`>p$(d(pk*UUt8Ce~9XT z#r@I!$^F^A>Rxkyaes9a+(ei1V!TXVW-p7E)yw8(_i}i5d-r%by`Xomcb}Kb%kACo zJ>cc>@_PBbf?gpn)+_84@rrtnc*VTpUJ0+HSIR5xmGR1Y<-GD<1+Su4$*b&D@gDW6 zdeyw@-eX=3uclYad)%w-)$!_j4ZMb4W3P$V)NAgw@LGDUyw+YDudUa?>*zhGkq@dwsmVUO%tDH^6(=8|V%4275!iq24fWxHrOk&Kv2C z@)9Rd1^Inm5gR-J9;s@ZRv= z^k#aqytll!z1iLzZ>~4boA15rz308}E$}|@K18qNeWAC=TkI|ImU_#)<=zT!rMJpk z?XB_Fdh5K9$9SyAd4eZ;k|%qLr+S*FNA)*6)3ZF=b3E7cJl~7=)_WVgjoxN&i}#WD zvA5OR=I!uydY^f_yxra&Z?Ct{`@-Ar9q7DXUdtZBJytCdp z?;G#DcftGC`_8-QUGgq_-+MoJSG*s+pS+*FtKK#57w=au!AtZgpY~(?OnzoRi=Wlc z<_G+{{Oo=X|8D;tKc^q`@AdEVbNRXb`~3&}JbqsPK|i0L-!I@lJRgW`y>44{E_}Bf3*L+KgJ*Hzu=FH z>ObCp(SON**`MG~^yBu+e%lUg4|V`Mft|rFU{|mk*d6Qv_6GZd1Hggc zAaF1^1RMqq&!hg85#UI06gV0j1C9m9fyv-_Z~{0PoDR+aXM(f9+29;-9ylLd04@R- zgG<0=;Bs(9K7J**3S14Y0oQ`-!1dq;a3i=G+yZU|w}IQi9pD~tAGjYp03HI5fJeb& z;BoK-cp5wlo(C_07s1Qm74SNE1GIwmhZqNg!f?hBU^nrdb0H%W(U=Yj#v%wq? z1R)RxQ4j-hkOV1^23e2;c~AgFPy%I81vT&%cpJO}-UaW0_rV9?L+}y!7<>vo1D}I0 z!B^mG@D2DDdI!wsqyCldP!FgV)Envp^@aLD{hm!SE9fS@+hoK|TG3YpS5;_f? zfzCqbp!3iL=rVK#x&~c`Za@ww1#&_z$PIa*G{_I7Lm5yI%7n6@Y$yi;AqavY1VSMU z!XW}8Aqt`)24W!&;voSNAqkQp1yUgm(xIEsE$B9M2f7bEfF44Rpr_C?=sENPdI`OP z-a#LrPta%R3-lHG4*i1uLb*^Fii8WmQLq6n2p572!^Pm@a4EPnoEt6!mxas0mEg*7 zRk#{l9j*b_gloYua4Z}L*M{TaI&gis0o)L71UH78zyNH9EqTULq1K@%1Ab2o51Wtg5 z!o%RhtME1WI(!4R!FJdIr@&6w1-oGnoC^NMWQXQVc1Mlt4-%rI6A{S)?3N9;tv-L@FVbkt#@4q#E*X z4Wq|`XT+10mwjP5Hc7Uf+QeAkzvSiBoP^b zj6_BuNyunq3^EoOha@B8kqO9TWC}73nU2grW+AhYImldO9x@+UfGkFqAWMd7 zvI<#^tU=Zx>yZt}Mr0GR8QFqtMYbW^ksZiRWEZj<*@Nsw_96R`1IQudFmePriX20Z zBPWnk$Z6yZauzv2#yd4iBJfQFbIoq2#*Meh)9TxD2R$^h>qMu zZXvgkJIGz+9&#UfkdF@`50OX6W8?|)6nTa`M_wSWkk`l?rWHRw8YJ-PwiglkJnqYg9$b)qiRje5|uJnCQZq3LKgnuCHUgu*C| zvM7&AsEn$phU(}o^fr12y^G#M@1qaUN9Ysu8TvdQ{{nr9zCvH4@6nIwC-gJ=75#z! zM1P^b(E?Z$X26PK#jxU7NvsrB8Y_#H!^&e7u!>kEtTI*&tAW+TYGE;0EEb2=#^SL$ zSUs#h)&OgQnK2929BYZS#@b@-u=ZF7tTWaH>xOm5dSJb<-dG>3FV+w1j}5>EW5clF zSRyt88;Om=#$aQyWNbV(0h@?T!X{%=u&LNIY&tdrn}yBB=3?`)1=vDt5w;jxf-T2Z zV5_jz*cxmdwjSGnZNxTVo3Sm}c5ElM8{32J#r9$Qu>;s)>ePGP69GuT<| z9CjYNfL+FN!&kBE*bU5v*)a!}g1Ipd=Ec%5AC`dyu}mxr%f=uK!7vQR2#mxijK;V; z>R;h85tA?(Q!x$Gv76W}>^61>yN^A<9$}BMC)iW$8TK4|g}uh!V(+l`*hlPBKK?WI z1^bG9!@gs`u;17pEEfx75qKnC0FS~8;f3*{crm;o8ry!mUt_?HQokqk9WX3;hpg= zcsIN|-UIK6_rm+&{qceL2z(?y3LlM+!N=ms_;`E*J`taUPsXR<)9~r|OneqT8=r&E z#pmJk@dfx|dxDU_!U5f|sbUXvk!XX^S5gf%a9LFh~##x-lMO?yV zT)|ab!*%=?ejC4o-_4``mHYSuJcK{QAK{Pjr}#7cIsOuVg}=t%;_vYH_y_zW{t5q# zf5E@v-|+AF5Bw+oD?aNohls<(5#lIuj5to5AWjmeiL=Cc;sSAz$h#+yxJ+Cjt`XOX z8-$Ip6AmJUa1t)UO?Ze@!b_wPKEh7~h;$-@$Re_d90JUv{uPLT36#JHoFEB`pb3`X z2%ZoKk&p4bm$*mVCms-wh{wd!eEc)wIq`ycNxULn6K{yO#5>|W@qzeA zd?G#*Ux;tScj5=}llVpaCUS`|5lI#xqsYQ!5wa**j4V!;A|rrEpaAe2FvY~jT#bkV z%EVNNF~zkFM*~%2s>Vde)QG77R0N6uMS)^Kai9cH5-0_f2Fd_s0at_`@jYT(+{Cy^ zaW&(b#yKM_G1i!<*aoqo@Wb%aaOe1r@iB3i;>y)75LY-ZIc{*=m54Smh2jgw(a$8C<= z61P5XLtOp1dU18)>c&0Fb6AEfN0uimkQK>FWM#4{S&ghtMw2zjnq)09hKwcS$l9cl zG?DRS9kMQ2kE~BNApe=q4L2eilTAo~G?Nz6N;V^#lP$=WWGk{Y*@kROwj%USw~w580RONA@QNkb}t~*DaYh9rI{wikBd)^pA%Y zFU%-6}g&RL#`#)k?Y9~?~sw<0^z8zAzUzAC|o#PBwRFHEL=QXB3v?DDqK2TCR{dLE?hobAzU$B zDO@>RC0sRJEnGbu9j+0s8LkzM3CD)x!nMQ3uqhlLt`n{st{1K!ZV+x5ZWL}DZW0E< z=CCDf4L1!p3pWq92)7Kk3bzio2|o+B3%3t<2zLy33U>~733m;53wICq2=@&43il58 z3HJ^63-=EX2oDSo3J(qs2`7YyhKGfRhZDmi!Xv|@!b#!L;m3K${eAKQ`H*}}J|&-# zFUXhVEAln@j{HP^Cclth$#3L$@)!A={7dGNVKR~`Kt)joD*u=kqzX}msbW+qsx(!G zDod54%2O4oN>pX4DpifDPDN8SsG3wQDu#-s;;7n`kuv4u%+nYO>JDNM0JDa*k6B=czV81q>3ICHXjym^9oqIr^evU!Sms(G4u zx_O3qrg@fmwt0?uu6dq$zIlOpp?Q&cv3ZGksd<@sxp{?orFoTkwRw$st$Ce!y?KLq zqj{5gvw4eot9hGwyLpFsr+Jrow>j_sTB;}2i|S4Fq54w;s6o_VY6vxy8b%GL5~&f? zNNN-{h8j;zpe9n2sL9k6Y8o{?pS#@f3~DAdi<(W%q2^NasQJ_aY9Y0VT1+jWmQu^8 z<~sa@1=Y7e!S+DGlD4p0ZFL)2mF z2z87)PMx4mQm3fX)EVk5b&fhuU7#*fm#E9s6>4tmyx94%3t|_>E{a_oyCimL?6TN@ zN5;6=P}Je5BT+}Ajzt}hIuUg; z>QvO}s54P#qs~QLh`JbcDe7|6m8h#x*P{Nl{r}ZmQSK;DRBDtrDlN(v<&O$PrAK8% z1*0;fvZAu1a-zT}I0}hEqp&DEiijfr7yc@Bjk-?Vplp<#a!@IhlX6jR%0s16UMh|9 zQGO~wrBfMH7L`qb6hy%kn$KO{Zz~F?2#TaAil#V9pd?D6R7#_C>Na(Ux=Y=o?o$t_ zhtwnLG4+IcNKpZ)`a%7qeo?=vKh$3; zmkLu6bR=DXj-m~8LAnrKm@Y~eqa#cOOeIWZOjS%3Owp!>CZnmTsjVr}6lE%HDsQT8 zs%)xlvYHy0+L-#7VoXg;bxkcy9ZWS$fXQTPY3gh$XDVx|W~yqcWU6Q?Wh!Z^X{u$4 zHN~0YO?6E5O!ZBTOpQ%ulf~4`)ZEm{)Y{a})ZWz5)XCJv)Ya6@)ZNs>)YH_<)Z6sG zj>&)TeQ~-3U6L+Em!`|o<>>NsMY~K|x)I%&ZbAdJnYPeYx+&d^ZcewLThguQ)^r=XE!~c8Pj{d@(w*rpbk}@* zH@Z9BgYHfDq5IMO=>ha0dN4hNPN0XVl5wg)QVUyST9;HSub0US&v&!SWj9{Sx;NfSkGF|Sn`hV z>mDm_-D=%tC9GGhSFKK~%j&jztf^M7HO=a?`mF)$TI)LNdg})3Mr*n?!y2?^TC=R# z*1gt!*8SE4)`Qmg*c>Zp-EQ4s-D%aVsMT(DSW~QbtkpiPrm94OqwBEI1 z*8HCSPxV>!YLu`?eq?MC%uc_P4A)i();NB^a1)HeTY6xAEA%Z$LQnq3HlU$nm$9HrO(ml z=?nSzi}WS>GJS=G`vZKoY{3hks_w43(OskE0)qkVLMPNy^IAe~8P(b;qk z4bl(|(+G{_J=x)UM0{l4weY-GhsaKmHzNi|rbpb5m>k(VZ_7AKvSqwwf@Pv*l4Y`G zie;*0nq|6WhGnK@mSwhOj%BW8o@Ksefn}j(k!7)EiDju}nPs_Ug+(xmM#(4}6{Bj@ zjJolr@s{zn@s9DX@t*O%@qsa9d}w@Rd~AGTd}@4Vd~SSUd}$nKOg4@;PB2b1PBKn5 zPBBh3PBTt7&M?k2&N9w6W=0H&O^6LfWJQdMO^O{IJ0@@SLuri0X@Vwcil%9XW@(P* zX@M4LiI!=V)@Yr+N#CMx(|72*^ga4M{UD#a+;E6~NI#+<(@*JV^b7hG{hEG5zop;N z@97WpNBR@}nf^k5rN7bN=^yk@`WOA1{*#aYOXt#II)aI03NTTOfhouoVhS@wn4(NE zrZ`iIDb18+$}#1cicBS@GE;@A%2Z>jGc}o7Obk<-F*460%0_;OsFU}6Icr`<+m4Z) zBY#8;iF^=|8!;uaPh_vi2uq};fF;UeuoScuvJ|!yu@towvlO?Ku#~ivvXr)zv6Qux zvy`_~uvD~EvQ)NIu~fBGvsAa7G@de^Hl8t_HJ&q`H(oGaG+r`ZHeNAaHC{7bH{LMX zjCP~Lm|}DqT}HRjV@x%AjSG#7jEjv+j7yEnjLVHHj4O?+jH``njBAbSjO&eo2zP`h zVqwghm~}DhV>ZNWjL8j~n0Tf>(|~EjG-1q)g|RYCnPyCLrUlcQ>A-YkIx(G@E=+f( z2h)q`&GcdVG5wkR^Jf4vkQu}bW`;1sn32pVCW#r%jA6zy$;^0W0yBx3!c1ePGc%Z( z%q(U$Gl!YS%+JR!U=}iqnI+6pW*M`bS;4GiRxzuYHOyLO9kZU|}N^yO}-AUS=P&pEC?E+K4U7TC0^@*WU_3AZmCdKbW7)FXlJ%hxyB#1I_~%fQ!H-;4*LpxC&eYt^+p!8(;?HKn4&5GJz~08^{4b00LkD0Z;$~aDV_vfC6ZM0a$qgVr5kS)X(W{a`K*^+E2wlrIoEytE;E3g&WN^E7e z8XL{lWNWc8Z2qx}W#ib|tci_h>#+6M`fLNX5!;w;!UC+BwXjyUDcg)~&bDA%vaQ)R zY+JS++dd!Pf$hk4Vmq^4*sg3hwmaK{?aB6Hd$WDmzHC3XKRbXO$PQu$vqRVfb|^cH z9nL1QBiNDbD0VbEh8@e6F_blwGn6+}FjO=|8Y&qo8>$$p8mbwp8=?(03^fh43^9gS zL!6>hS6yN}(^9$*i%N7!TRarOjziapJq$;Y2%&#~v( z3+!d~Dtn#1!P;0m>tIt@7wcv{Y%1$z(^wztX9H|Ho52RzOg4+nW^-7Og;dG|RFa%d;XYu`;W$Dyy+Ndy~Dz-e&KxciDUFef9wxVjuobJ$}SK zW}mQ6*=Ou?_9gp@ea*gQ-?8u6kL)M*Gy8@8%6?a>cmfTuH7JSDGusmF3ED<++MnC9X18g{#I@=c2h9TurVP7su7+Ok6xyhpWfc z=NjZ|>0g`w@6;M{jkv~K6VAdl<(hLXxRzWit~J+&Ys+!$^=H-VeTP2whV zQ@H8e%zXT8ZVoq>o5#)P7I2HXCEPM@Ik$pa#jWPnaBI1B+f9i1t7vwUzEH0bN;UEs?5Dw)q4(AAt?yQj^_kU zwuQDOwxzb^wzal(whgw8 zwoSIpwr#fUwjH*ew!OB4wv)C~wllV~wsW?twrjTQHk&QQ=Ct{30b7PGXv?&LHpE8Q z7@KO-Z6Vu3+Y{S!+Y8$(+Z)?^+Xvf6+h^NX+c(=E+h1FR-C!?d&&!{~NAU&uLVRJq zC|`^(&X?dz@}>CFd^x@XUx}~GSK+Jj)%fas4ZbE{i;v~w_}cuxk;^+r<>UD}d|kdC zU!QNlH|8z8m2b*7_*Q&tz75}&Z^yUiJMbO(PJCy+3*R*#-;M9i_uzZ-z4+dI zAHFZ&kMGY9;0N-9_`&=Tei%QTAHk30NAaWiG5lD59G}dO=O^%!`KkPLeg;32FJUif zFKsVtuVRn3$Jp!H8`>M$o7$V%TiV;&yV|?id)Rx~2igvUDDEifsNet`W=B&;3r9;wYez>%Cr1}YH%E6zZ%1E8KSzJZKu3aO zm?OzC+A-EK&XMexsac@4bS3d^Kh`OW+mek;F?-_Gygcja@J8{WXQ-~BYg-&5pxD+Mj zZpw?4mnk1oKBjz0`H>RgjC2~DC7flP6`aw|8qT`TuFh`Gp3dIRzRv#6AE+6J2g#tp9P*5l&6c&mIMTKI*zj;$! zC?S*-N(rTfGD10_yih@?C{z+E3sr?`LUkcps3Fu8Y6&qytPm&E7L0;Ph!^Szb%lCD zeW8KSP#Eo8>0ISp>)hzv>D=YqOAH=?mX!{<2>s;=REJc>b&N>;j}sJPKPta z>2i9UsZOuc?+iK-C+ftVgp+g%PSL42Z#qNHr_Lg-qORhu60S0?a<1~ODz2)o>aJ*4 z4OeZK(PeVgbv1M~bv1LfaJ6)`a&>fda&>j}bPaS3awWKix)NPUu5qrVu4S&3uC=c9 zuC1aS`U?Go{=$HK?sCI}gu%iPVW==n7%q$uMhc^ZBw@5L zMi?t33*&_e!bD+`Fj<%)OckaH(}fwrY++75ex5L2SRgDC77I&+rNS~{xv)Z5EvymN z3hRXp!bV|}uvyq5Y!$W%+l3v%PGOg@Ti7G)74`}Hg#*Gt;eqRg>!s_B>x1j3>$mH# z%iu2PF5)ikF5#}=uIR4puIi3)H+8plC%Ti|QJ$o<6q)cwr;!u{I) z#{Jg)&i&r~+5N@+)&1T5!~N6!%l+FO&bxFF=`nbUc*=Onddhn$cq)3LJqezno?)Iu z&nQolXN+g8XQF3PUS@+s!eQZva8x)Z92ZUqCxuhOY2l1;RyZe|7cK~wg)71};ks}` zunP_$MQ{o(!JW@tZrCHF34S46$Pj`;rjR9M3y=T{sDKH$Knb+K2&}*fydVjhpbIyJ zTf*&p{2k%G@IZJdJQ5xYPlac~bK!;XQg|i27TyV;gwMhk;j8dX_%8euehI&YKf+%j zR|pFcVx(9=j1mpv6wfrz49{%OT+ckuLeEmqTF*Mq2G2&%CeKdKUe7_#SZH_}scTcWrk+Z@n0htUmg-IQr3O-SQjt_5RY+A+@21{M4W&L#eUkbt z^-b#A)c2_$Q-7pZ@K*Fz@mBXndyQU`w~n{2x1P7Y7x0?BO}#Di;>rt(g~Y;Q5wWOP zOe`*z5KD=r#WG@9v7A_5tRPktD~XlGDq>Z!npjw1Xc4VqGqJhYLTn|r5!;IG#P<344q|7qyVyhQDfSY3 zi+#lY;s9}wI9MDa4i$%q!^K2#gg8^b>s0;dOdlUXM4`>-A=MgWgPU zju-JVUe?Qd1+VD6>3!oZlU6pZLRytHQ(D8crfEIXCZR!*G*_CE z_95*{+K;pdU!<>~udc72uc5Dr5Ae10weq#`b@lc1_4OtAhWf_&Ci%{fq2624yTv`?UU8qeUpycl6c34q#UtWT z@tAmAJRzPGPl>0+Gvayif_O>1EMCdSUlXs3H$aY{PX-v{VV;u{8#->f2!Z_&+&tP*pK=dzu;H=_xun1 z5B)FvFa2-)AN)W3KmEV`fBl9)l|W3OZJ=GCW1wrGZ(u-RP#`fdB9Igq7nmBDmKW(N zh@vQovZ#ovsEN9GOS~=K5$}rk#QWj{F(f_|ABm5}C*o7_nfP3MA-)t}<#U%Cel5Nc z--_?V_u>cfqxebuEPfTgiQmPa;xF;H_(%LJ=89o4?~%k(0Vzr{NCl-r(!Y6AL@Fi~ zmr6(_rBYI9sjO5^Dlb)#DoT~4%2E}ns#Hy?E=5ZHX7(q$i{gO;1cuN}rfMDSb-%)bwfTbJORgFHB#Wz9D^M`lj?P z={wV}re90Hk#0+Orn}Sq>4Ef&^vrZ5ok+i#ek=V?UZiV%se#m3Y9g5>i)59WNzJ7e zQcJ0o)LLpIwU;_douw{PSE-xSUFsqAl6p&hq`vvw<%au7{iOlYKxvRPSQ;WFNJFJz z(r_tJ8X=98MoFWkG16FRoRln$mnKM)q{-40X=*-xnlxRSAI@Q8Mchn3|~f029iN!2pMw5kBpxge=@=u5y1k%BEh1;;=vNZlEKo!vcU?$ zior_3%E2nZ>cQw>jbP1St)MYz3f2kM3pNS@L36Nauw}4guv4&0uxqeeuvf5euwQUs zaCC5Ea8qz=a7S=waCh)v@KEqbUYy}BX}7dT+AkfD4oZimBhpdnm~>n^A)S&=OJ}5W z(s}8EbV<4_U6HOz*QD#x4auI*U2fPRrASW6EqSC=$t$HvJ}F(wkTRt#36x+7kx&Vf zaEX!_iIq5smjp@7$4indsgfq?(kbVs@;-IpFnA?cy?NO~+ilb%a2q?ghw>9zDm zdMmw?-buBgG7DxF&McZ)CbL4OF|%Q2$IPCYy)ye|4$Mr<9FaLO zb86<=%ypR?Gq+@J&D@r`J#%m7zRUxehcb_49?v|Pc`?(O>CaR$)y$ijcQapRe#rci z`6DwTD=MpCR*9^VS!J>+WJPDy$f}jqHLF`z&#b;#{j(CXhGq@V8j&?JYgE>_tmLeT zc~NJ-r9aYNDOUcFk&DX3CA1LZ;TV0nm~AP<#?$;0JDd4xPt9wjHqqvbL3Sb3bBERUBb$P?vB z@??36JXM}1PtBU1H8*Qs)`F~sS&On(WUb6vm9;i&W7f{BU0Hjw_GazNI+}GX>uQ#e zC1xpEde+UXP}bwDCs|Lk-eg5)7s)P~T_w9}cJ=J&>>Ak}vpZ#X&F+~!Fndt;(CmZR z&TKTB$!4>KY$f|{_Jiz)*==(McY&gPuUxsY=y$ChKy zNy%~Mcydy6yg6w(!JN#T?3|n&FbB;ca>yJeN65LEb1Uag&fT1QIZyH;pQg(*0~5fZU?P|VP6Q``Q^2X`H}oYekwncpUW@gm+~w5wfs(gFMpIj$)Dw~ z@;CW=K6km{AM#K6m;77Kl_Qh_N|a(y3Mz$^!b(x4m{MFRp_EigDW#P%N?E0xQeLT` zR8%S{|K?3)rHWEjsiss{qLrFTEhR>YRpOM|icv8s@k$+~u2N5_uQX5^DvgxJN)rW8 z%!);^DovGUN^_-!(gZR?7N{xI6B-B&f)b!aXdE;NnhDK<=0XdhmC!0^4YUs03T=b- zLPwz!&?)F5bP2i&*&sWV3V9(P6oBqR_n;8;78}h>1}cM;!OD<)?sCHk%1~vPGF(YiMkphdQOam#j51b9 zR>mt6lu62DWr{LYnWjuvW+*e2*~(mHo-#ilzd%{2EK(LLOO)lx3T2hDT3M%TP&O)? zl+DT(WxKLd*{$qR_A2|7{mKF5kaAc#q8wF@DaVx)%1Pyv(iCZnv_pC#6Ol>CRAeTy z5LtvQL)Ib(k&}oY2_i3%56DO43-SZ`g@lm^G!iX=mO(3^(P&+?9@-EE(3WT`v<=!0 z?TU6od!oJ2-e_O6AKD)sf+nCt(cx$!IszSyjzPzv$>>CMDmoXPhb}-DqKnX#=qhwA zx)I%i?nHN?d(eI8A@m4(6g`QaMX#Z$s2BC40W<>*qM2wGil8Wpp*TvQBub$S%H>5N zoL0^#XO(lxdF6s~QMsgCR<0;lmFvn4#irO5hmxW=6_?^xJW8tKRnion;?L(UHylvX zl?)}QWGY!owvwZO3Z%daqM!<<;0mFT3Z>8rt8fahh>E1hikgqt6kWNg+){2Uca(d| zeI=wkR30ghl_$zm<(cwad8xcoUMp{vcglO^qw-1ltb9?vD&Lgv%1`B&@<$O+5mnHe zXb63XK1QFSZ_u~sJM;tk1^tG8NB^LI(Ofi)MqrUxL97r~7%PI6z{+4%u&P*fEE+Rn zCaf;j5Nm`r#sJKUHN~1?EwENt8>}PN3G0gW#0Fx6upw9iHWW+3Mq}f!nb;g`9<~%) zhONZbVq39o*bZzLb`U#+9mP&!7qLs&73>=3#9UY^=Enk9I+lZh7>uD9gRz)^DcD`? z9u~qLVlVzH3PA}g5o)AbK#fuhs)f|TYEiYAT3juumQqWrWz@22Ikmi6Nv)z*RjaAh z)o8Vb`ftt1%cr2$Qe)IuHBPOq8dZ}TuhvoPs`b?RY6G>Q+DL7zHcJT+S9jXpfhpQvi zQR--Qj5=0LR>!Lo)R)*B>;v`#`-%O<40u7j2wnoOfLFvT<5lq(JQg?Nb#VYU<5s*G z-U4rnx5GQ)UGd&{U%Vea03U=8#)seu_)vTpJ{(WPlkjo)RD1@$5MP8Z#aH61@YVPR zd?UUI--2(&x8d9I-S}R7AAS%&j32>|;>Yo`_&NLnei6TfU&d{?9e3iXco5ITv+*1p z#0i|l8Jxof{3d=6e}ccj-{28MBw-+m5XJKDgrBHRR;Q@b)tTySb&fh$ou|%M7pRNX zCF(MDxw=AKrLI=jsB6`A>Uwp9x>?<>?#SmZH@s8brS4YusQc9Y>H+njdPqI29#M~~ z$JFEM3H79UNKxs}{T?j-k;N6BO43Gx(~LxLni;v_**q(F+KoOd@irP3;^aw@Ni zs;nxis%omP-d69b_tgh#NPVb2QXi|&)aU9;^_BWseXG99=Poz=Uj3kcR6nVo)obJeg~K#S4}YK64IT2ZZ-R$MEgmDEaUrL}U}zj;$htE^Sgs%q7=>RJu0 zrdCUf)#9|;nn{b->S%SfdRl$0f!0uKtToX9&8%58tJYL&rZv}EXsxw2no4TqE%G*b zm%K-Y$VcQ8@;Uj2d`rG3Kad~EALLK+4;eufp^8$)sS;F4ssdGosz>#u`cVU^1S*Ld zO^v0-QOVR)Y8ADSI!XnpOe%*$D28Gwo)RgUx=G!lLev}T3srC=k!au1XGeJ!&G3RnHo$i6UWqH>N541hD>7y zU|KS*m^OKL%CytkYaO&sT4$|`)>Z4S_0W22eYO7D0BxW)SR0}Z(}rs!w2|5@}elJmLC4Ug9*XcM(b+GK62HeH*c&D3UTv$Z+ed~JcYNL#Ee(Uxk2aY3sF(+GcHwwpH7vZP#{ayR|*qK5f5tKs%%z){baLwPV_G?SytxJFT77 z&TAL6i`pgavUWwgrd`+CGVPf5Ojo8G)064TBrrpn;Y=bkf*Hq5WF|9HnYqj&<|uQF zImw)5t}@q{8;p&yGpUT1@iRdNVNeEVNJd~3<_YtL`M^Z7McATj3APMdg{{g~XKS!V zwl3R{ZN(eRWw){i*+cA6_9T0ey~JK&udz-RVHs9nU$Af359|;2 zC;OZI%Nn>MTnVlMSCxz5VmTvMmjgI6XXTpZ{d0Olvuh45MRRFx&7-AiUM)@YX?`tT z3u>8KmX@vMXrKmZu!d>4MrxEs=W~}EW;IUZH9?a!SyMGlyQ$sQ?r3+ld)j^Nf%Z^) zq&?Q2YR|Oi+Dq+~_F8+Rz0JqJ)81y@aermt8-&(E~)*|%+dX!#J zFQgaNi|9r5VtR4CgkDlFrI*&r=;ieCdIdd^8^I-UW4Uo$GB=f*#?9bnaSORc+){2O zw~^b#ZQ-_Yd%1nwLGCDbmOIB?;4X5PI2&i@K<)|mlzYLw=H75$xUbxI?g#gii{K-9 z17CzM!CmoQLB5E6xP!c1Y7FjrV8tQ1xW>x7HKCE==I6H*1Q;1dEujsOaXKnSED2%;bh zil7R2g?mCscp|(J-U{!955h;`hfq=kM6=jbY$>)DJBppeE@D@)o7h+ECk_-7#3XUF zI95y+r;0PhmEuNmt9VvCCteh;Wib`dqhEgL5keW(u zrFK#Wsgu-GO3J&kvP<8s@6q?^`}G6*LH&?^SU;j4*H7xF^)vce{hWSYzmU&We(V1U z^@-A2X`QrD+A8gp_DP4NlhRq~qGXd?l3xl)K`C3xksyhXNQssd>85m7dLliQK1d&> zFVYVwLXMQ9IgMS9j8uGr>fJ`8R{%`p}I(2s;*Qws+-g;>Q;4|x>voV5-O=Os-Q~hP4$*~ zN4=*$QJ<Q(frdbA#+*VXIk4fIBO zQ@xqqQg5qw)qCi@^nv;yJwYF)57!g*5&AeiS)ZU!(x>S&^||^&eWkuiU#D-?x9L0e zz4}r8n0`V(^&h;N{P#vSA`}@a5Q+*JLIp#GLWM&`LPbNxLd8QRLM20`LZw4xLS;kc zLghmhLKQ=mLX|^RLRCZ6Le)djp&Fr@p<1DsP;4kJR6Ar0nL_cQI-$CudZGHE2BC(b zMxn-`CLthX4p~ChP}5MeQ1eiWP|HxOQ0q{eP}@+uQ2S7aP{&ZGQ0GvWP}fkmQ1?)e zP|r}WQ14KmP~T9$Q2)??(7@23(BROJP(o;EXjo`?C^0l5G%_?QloT2r`tSAdKlfYh z1}qrRW8lw$X9vF@vMAwcLeXJhUV88?dC9lm$yk*6u_4LMw zpH~j-IJ9=?`B8(0NB;Dz46O0)t2;1bNVlXHqowh)C)}R+d}7RO+uTvh?(M3%yTH#? zd%NxbvHyRNcOPI)Y<;8X*AyUN1A8~vd+#+UDz;Qw2&6$0Nf4 zYse>|vm_uQ#^{?pyFgbms8Yx*VrvwPa92(~x0t&m^2c)c^M=}$;9h*OW;J)1_)Vb? zd!^)g=<%@0;hB+*YO`^1?n1j$pgwj@EU8PSIyQ>Oz&k$ z<;;~VO6imrP;4z(13%$(XYXMSFnPx4pA6)c+ z_mnr+H^%pq|2ck`U{dgE;RoqB*-TlitPWl|wl8A0@=u*DJ}qHd^1^h&u-H&&d}R7! zdX=#+YlL}=x!yuh)rCV#j@T9DS1a4pKKHGXy^$A&Gm^(y#fx6~hXr_qILkMNp9=pP z-CtW{eoz&zB&mkVDwdKH!>Q%^3Lb{A#VYY@>59-vvTJe4$xE}BSPRQWGVcm#(rU#` z?T_W~=M8l(=|V=1Ws~JeKGQa@WLEhF;gg7OSW@Vg*X@+o|3)O^h_?N#mK z6n6TdjK6&jW9 z&or>-2Hp-FDDEeLhISENRfU3%`i%xr;WFkqHZ)`QYc8k@c^ooO#*}%6&x^bpTM+*; zL8zzF>x|5-JK01bv+%f$sPL;?UDc5}lNrK1!hFq2;C$u&yrueMDP!>N^B(dFeB1i# z0+s|E5#)rN75*u?D&@$wDV{1$M6ja{NBtf(UAZVaQFA5M9!F^RCOl1uPfpjn8vZmo zncPfwOj7fxyg#jt1s=AIwy@$~iqBWftbAI1Wl?o)vj9f$@r=5%)n!|1y7-nSFH65> zK2>nnh5~(p%R_6E*9qE)l9JaY7ns%*^kt9de&ie~R%5t(`UWGH2AWw|iV*Rlk{=A_kSGiEX@rDF2`G-S4M?8z0nYbhQQ1aJQ zU1ni!T>cnaL+NMk?10%iamvYz?!`1JFmfJe9yf>ELwYq_7g1q9#9qdIz&#*YCYuoc zEh0@jFJ-&ww~S4>6Y|a#&Z%&vjx)>n=fgbY1(Bn*#-!azD@|$Ubh9Yejp|#{jCGvX zM;s%KRd&|P_2o<{=Vros1IB8}isu+OH~qr>Ck1>8_%om_e>T5_e^6ixZW;1ABu#iy zWRPBw-Ix8mrTSwj>#pdb5W*jt9}E{oPK@fM)GJN!pr`VKgP&(tPp$=-6;QqYgZ`cOZX!=E=)3w>Xz9~Emp z?%y$}KQ(|FNDZO}Q!|)DCqm6ly9pjbcz<)O2bFbwKS+&7}4k zHx<4X&!T2ia-$D5hnf~Vmzqb-rxs95ibb(04)rvsk0nLnuIExb%9rw^{HXxyiy@HW zQms^~X{+f%yw_7HgefNBGIlU-YZ&k<1XeHEKch^Msel-BWMt zPh=OHM-~Z6c82XyC&z8m`P%&b76j~&TnsxRzpD~NtJK@ouXHn@A(U5E2K*=(l-HxA zL$|U|^tB=pwBNbA-q1E~jqJc~WzqX%2`E=*MpnyfJvJFiSLAdN*uy z+$Uq6d7IT@zfqGV_*Jx7+?tKJ!@2DP#smfgwhR^rzYop}SuQMw2mO15=7x3%oAI|l z$E3pdM_yHVMqiA6p#Bv40 zDA?h5!n>NwZAiH~xY1Z?^0KLI zEsD!Ti$eI3M`Kdr=cGKyBJ=tc4X@1cdoK}C5%F2+KUTYb-cZxBcjSCD7utfUE~;yq z+i?>8l*|w+vgmb%kTNlKJTj_v)KpEE*df{7Yvyy87P3Pgh7FdrkNQnLBegp1R90B- z?%ZS2tHvJYPOmn+$n0C#%Qm-UH>U%4DYv=msAj+U zn9w9!7qwqKHB}e)fH{^$`HLuMI2_VdyeV!-N@e=#^jU`Pw$a7!?LK84%O$mWtQG2Y zNn473wcqB7DRbDtunUnwbw`bR?BjUM;G7+t{W9OFaAcXf>eC`!jWsbnsZM_^gDgp} zDXF<^xf4i=`YHNp&S=G{X$DVDe~mQuc;bHRb?ZCp2YWX2I{Ss-vamvSI%azO+Jw1= zKQn(Uhd*zqR9nBQ{MxI5UP02}Hj&p=t<;m^hv~h z-Ad!C6>ItMu#c$3!Fj@R6=$e4(QaoAVs{F8rrM?-SePgBmUIZ0P}%nL+&sfg&Pk3i zqHFRV{p$>!{W@y^x186?x22yfc!ij$Xb4xTjIkeMowXTSDRob$OifDPmY$n&#(dX& zvgmBlJ^Qh$ZoX;ivoYn`Pg$!9mf8cVYir6BCsd=fPmJx$1}FZ!rTSwjJCRIJDNcGA#Z_$I)p_-b6 z!I^EcCYjq5&a9YJ-PLcqbdX}T(lsM8H@R#vGn0Q+bWPMnu}SZnUThkau{)!CVTJ8P zz;=Fd&{;u0d8HyN{7h6>j4u6G>wT-yHnWOmv{>ic8I|=lB0(Evm$*0acjB98uHuyB zF5r}M-~ou?3zcL7Jz=l@cfGW1Yt5nPAIss-8_FZAp3}lt@7q$oNZv1^HhOP-Q9_4| z{h75n5k=+2@2XAab*y5}9qwWN6rrCaF)S%;o&2oA6CN6IBT5u2iS^QsPq>lL!LZBZ zl!5a4=UJ`&6*i?J_C>rrVOH|WMd?w+%AWkbii%7%uOzU7e@A#GbhJE9F)?~j9Q=%I z>R)n=`&-C5$q9*@^oVqIm_x>okVl<}@{IWq7owY$*4>0>L}o3u?6vkQlPqcoyjtVI zZpoeG%ksdtL}P zh<8fbDr{5OXvO%*j5dUZV*~HI@gOg_I2b&x@7YkdLzbrq%y(p~@>mAMc+aGIF<4@#o zERq(#sGL#Ni=EG&8_>Y-A3R%_AettfD%&pGCv%nODXJs(M;}V`)UPrajDt*@O^Y+F z*#j*d@|N31+HJKh*l$^(6ctb|x+yIVRV!vhcZxX>f6{Q>@Xq{)xl^vgI-qbtQKWqs zOT+3SJfr9tu8&WP_pXu%-6A7mF2+Ra!YHq_8Cg%WZkD^VSSgzH`qH}`XW`cHsY<5u zhH`!E!4x9nl5(QH5K2d&9aVUJV2GbqV9ZR~E+^>*cL94vQ@(dgi_+Ah# zmqmG~lB4zN2XTXRPcv?s+vEo4wJmJLy2N(p1@lS-D@837g-J=qVHs_+TynE>ClpR9 ztgmQYJy;RX{K%Ta$AVu5zY11_o)7<`SrRiyJ1FhK4qa%$KYzwm(-sy=#bY~Pe=sbkaGMvk%4$S_ry zR%Q^EI_o3rXR9`UNB$Gr&7!V$Z~L{1$JHHp&fEdMTKKbLUw$~{7CP{6w9L0)=i&2-Ou0&mp+NKPr#%Mq3S|=7IUP`)}l#zNue>c6}@bi}HkELv? zali3RM(3O-=Is_`-cD<$B4OE$@=3L8{09n@BCBk3 zl5xsF16H|!na8YRUSdvUO=hLD?!Y5--|#;2oc-?m-SGb{P|EiR`c3djKnA}J86>O_ zbrXk&R?F7Q-YY&U)`q7P2?vomZpa;kQK?V$v?{5hrbCo z#0s_1Dbf1N`q;nyJ%xvc)~5AY>A5AAZng)-r)uc6?f5GG5aCU6TX~$^reMSCFhuIN z2`dv1XPzh;RC0}ZobAKO^lK(qDwr)zlbw)_jMm3sT5oNRcCS_$zbfgv-Y=~oJ=wU~ zIKk98`}Z83<$ivmt*E%q!UYxUs=|4kVBd&?$^oiD(alX&S(9>ySXNn{*%h@C?soa6 zD0|x1oEG^Rr6KlivRu`Rm}u&Bzy)vAeW~TqGY5N5$QU#}bq&KelE6yrKLJ zu?Cs3&Qe^|o_UWO8`VMOlsqA2xL!?du>Q^)=FbV-Drgn#5qvL%AqHIE>C2F*? zlWK(eam>@$#5fo2CT-t%NkU^%K=QNX?Wu+OHF`-}P5J=ihzwii^~`5kcJl^{EpL3` zbX$f^S!6HXUYuuNVQ;WswxcpyxxL~-W#_7kytKehe2rkQ;G8N*T^r-6-LB0te95>Q zk|SCrnlAob);e4r!Hdj|8l!rvx*zv7eoexHl(za_#;ztt#=FeWEUD$7C8wx+iF5gu zisn+D`BkB;*d?T2$dBdl=M5DRBGN80hUZ*Tf0dq3ADbJS+npK6e9XSZoy|*^y2vBa zoXkRdKC2UNtp5rAvY_$7%-{vVxX?p1L%dryOgWW z2+LiIpEcR~F5se|l}IgqE^QHEj|z^?j5(j;mlK%xwct+q*Yfc!BkL|J#g`tmO)y!q zK^89mGiH=dm^4byG~PFsXROLPokirhSymTR6~<793P&z@iA zTV7kWScc`DDA-jx#&2ct<&dqyGWq=YcNs@YF9hzAo{sIm=oND)zm<5BJR|CHQr|@- zyhh&x0qsM&NG{9QtMU`mOyzd(vP@p8)E>G?<(4+jxS;&Ua`^Lx`W!hwef^@&H6rFD z_Ai{Sd`kR2ba=$X*s%sJb-HMTNJqs}r2e5vow+mfVOD-Y0;OgpQc2WBWmGaKjQzdzgMS6Q0ZJ(4yxtL~}CS*)23@OZ}I#%RRW-6Cj&a_Z> z0+K{+JL?0buo2EGd6}FQ$ihxxfHXIVkN2*ODSE-eZ8F;mR3eBFyARCrz)sQN>E%yy|1pO z7Ev`+mN-jQOKps)qZU&eOV{$2P)n(0)CEO7RnYX1Wo^9ayy@qy(La{5<t!by0gXo|#;dww~HRy*7z0rwcbyJ|&x|PGy^^E!1@8K=xLO#=XmXD_1FxtKH(# z6Qs%OOt-S|>|dyh=1_}1FUtBWwYhj3)uzn7d?B+1>lkYj+lM#Rca-mSKWX5OKn1@` z&;voOcsq4m;xGFq3zM%14^nRa+uut&0}r<3#_3aNIm;{~t6gg61!pL|<8tFB7O#$$ zX?w&+B)3a*%Vuy61?~%bp>3zr#P3TlwVks2R`iX2q+OZ3D*2)DT6SVi7t5R=tDs7- zI2=WUs#eCe(GJ#@B|g>vmfq3mXROJXZyjp)D1Rk4h(5`36_LukxFKvJC^G6rLVLb4 z?#9A%thMa2raxs4 z$PL^s*e0AVDUGnI6w$v#FN~3D`|Ael;tb<6j%B(PEG)TQa*!%ua#-=~ft;hf6TG*) z9Ki)a@8Hf7ljNOD5L*_<(C&|CClw`aPjc4pPR}!4$`WSpFPv@r!}hEw%l^dv)P9+( z5IvWTkPizFjv1T0&*oNM#5_cCBWt2;>fD%)hHWNZ){kx3KX0gcwo>~W`{%OGStF`! zOiRo``wUJk@2+o~fYt#^1FC`!1|1Oe7f+MC3(ZnaP{l^uqKC&$iwn@6Ga1b@3&pm> zl++$r-enO@VaXR3FJR4K-)6_~S_E9=V?nOL8i`FlBzk1*Jnc*U0Yl47dFHe%QI5de zF&EGCvz;hoRmCxjSgkpcoFmjQzmN<6UN;kBWcGZOI^K))ebpa9L*^*zQ_E-$X8|{2%58vNZL$WmXw`DKN zFNfY&7TIobj!AYHsYQ!eo!N*}EodeACiy+gDdJF6k?wxN%JeW(Vbf7-}!K>v0^_G-@sbkGI?KI{UCY?7r zaA)AlKqcQLc$6?xI7Va*-6Z!{^oU#<**t2RdRFWwiXE4ybtJDyO*GyyJ~mo1l$pJ< z7G|Bvx@B&Yzosam^ye+rA4^%aJs%z<(LZ2=V1bmam=azRJ|+4>v|i(xw$HrS>RLFj zmRUO_wlL+CrE|$_7LzrSWAHu8FBNW;>J-rt9U|8$J4auO9T>M;w=HFi{;`S52*~`9 zC9tfw<`i_YZL^)Wi)!z4-F)xDi`N6gbh3BR2V*}|nehvfyQC~gotkzhJtbohycjJk z|8Bmh;8`J67-2hCGJ}=O+RP5;BytvTBe{~m)Ic$x7VH;%Ls%sqE^QOOH;Sg*__sgD zWX907!*%0z99?Yu{FJF3e%!3Qw!%5PAe`c?pZQu;b(hLc~p7#3K#A`X}OfI z3X4CU+?W!t7xVT6mkGzKw`gc%08uRe)-(m)2vyX6P%UYk^XH(QKD6$ zr^24fyyTzcl)Rf_QTUbcFA?q3(P~A^!n$^NkVjLaoFtEv_HCOi&}*AdZq; z3cscrsvVjX=4Wcnl~i&e-9V&CE) zG(`G_`+oIf@hb$kL#_)$`9g^ zizeR!uYen2V-|6XyceFWppxrTkFzk&Vb0Njmx9m1eEF2fAeBA(cXjg^weEg$PqU{@ zXFFm4R)J*UEMKJ9tdK^Dm6giD>W2w^66YiZBz4j+G2q6x#zm%I zO&xQrmOm*ne@}j_?OlAQ%sCAp?`OZ#jbmQ`k+XgO#7tzbjpNZZ;t@{z(5IK@=3Brb}boxTFG-| zd$M)h5q^_{972s~v_vRtE*~pjB0m*z5MI*PKF%|~Bzc07Z@QeZD|0LRRY0TQi6BC> zIJ9r#R{hNk&#WUwe-v3be<=L__P-gfu^!~?yWp`zNqkOp&gY}Zm(hJfzVfC_; z(e!vXqqsn1-)X1y(b28>+nXFm)(xSYgbwvkQ=lq|? zTuDGVA9FtnE{iyd2HQPeP~abeWn!a595y9QW9XBWQM@i}4ZCd!Qd9@-mNta8j7W^= z9vKzABmP9vPSb$QGnR(@FNLj(<`q>JxtDY-sVuo+A6wa?+JhOa3rYHv%t<+xGBoXA zCci*i@Ug(%)<-@qVutn;XQ<+4%}kC%WLLh)2{9*_w}`hIiNAdtaHsssya~Re{l^B4 z2)1Y(=|Ki(<8$NE{M;f@<(oxX_CaPH@3VMtbXc&N)tmjm?^>`(C=)LX->E#P+7ok8 z_f98?@0>g*`H23rK05uKabw<*RZD=6Qv)dMoRmpj2U2CaSt< z`z78gN-a5<^8jAb{F~@9bD8f{zjcB2{8wV0^s;oU!Y^WsiDBPZajRl5o5%C^OAWw2 z1xoQx_rjv&w-o!-FV#J@nwlkts;2~5;6Q3fo=5t>02J-3Rd6MiXjq;VUd&+5e)Xw4j4YrNtRaN_w5nT(jtN=v|0Kx;E@nSc2l7a;j=@>{#vS#Dw&HI*e|gil5=twSyiF}HKl1Vwv_B;vDjYH z*|A4bp6H*ZFR-mG>s0xRH8LPhxIxh()6YWpZ7&EF-V?fsGGsdpQ?hbP1$G~n6R!oY z6))TOlP?iK2-}ORq#LDvq0XP~D&?w;x{-;u4a1DLO_Iz_nfd0{xy@|PiocW>Rm~J` zk>8SgXq;nRKK;Scb0bAO2~W`}5?9~Th9`xaldMO|50=lU{IMMVyrK5__DJSMe6Y;5 zHk7ZcNENM?ZqlubUu{meO}9_rO%@#z!OL6Yq`Exatdy^&MHMXOWLq<)A8R?U75}Jk zxO}tHPn(b-&uO%>ZQaY-Ri6t?6tJ_~=51MYUJx$M7r&MTD0`}xsyl1^(qE+)l@^z> z?H9^ox!#3eID>q*`G)#g{B}leRbAD~P1VH-_M{q`?@{0L@ei_>m0m0jwl872vR?2X z1$_wNip!)bg;#jCa#-~E^eV%^zx{89v`?;|oXYE&e(cS@B>_SF2*GB-QAt8Xf~uE> z%DJB#Yk6!j*`8NytK7pKAKspwC}b&SXUsRRW_rL&zaGW4EBaRES`koDQNi=C4HRUL zuxygNk4%X>Uobmrl|7)+kB?%b@*~PFvfc&v6@8QlLypne~XGxol*Hme~ezJcBr4KLo{b&`)Gr- z4sA(%aMJPA?rC=o%S}<4do!8YqHJwWLSCeGO$jQOm7f#0mnIYi1+|iYP)&`Vrk!5( zMRZ-j%5H9%w5UDL>gyz!7#XF}>3%GSKX0h~q&-O+O)oQI zEM9pHR&80cPw&D8$#x{}OpHn%&#d%g^Op-!giFOYLM2f$IWN3Zv@B+WmZs0NMO5~w zo}@Y#JvGkDdc5=%XTGpOv_SkGUgbPrGDGeyuaDTL6h$A4ma6B+RBLnM_oehpTx8lF&7o^HqmcKX0l2Sjr~FZZYVJ7F4chbz)cYTKZ1*&GkFvH%(|2 zO;N~WZpAs-ZgAgn!vaqSk}-ubpJO&;wXvAx4OuJvGUan)Mr6+6Rru|T;)`~RUWDe# zXUDv@bSvCb+iXuPqikA`zK?c}|p$~BjCgl|%?i@v>u z9yKLuR@8W3jd+UcQaa6anSGm6?HA>L%Kvx1tDw2CLQ*anAr;CW$tz;E$Lxq%5xXJ@ zC2vaC{O!*%g$~%II3y0KBh&$ZXy%YR6pnC5gd@@sf1GVjXb~twZOC zcO*Cx9Z8O4M~WlWp?9P?(j5ke(P46AI5Hhsj%-Jc!|cd)SR8o{t0Ui0;3#z197T>| zM~P#hqtsz{lsU>B6^=?rm806R$Wh~{b<{Z)JC-<>I+i)=9m^dn91V_@j#ZA;jx~<8 zj&+Xpjt!2Dj!llujxCO@j$a(VI<`5sJ9apBI>e|B(f{)A4(fz84fDT${&Pwhb_MHz z2jFG+6}$tSZj}*Nhz?``Sw>zVJ2(Y6Ep)o*)YjS8d7<+^=D6tG*2ULlq02>=wlrVb zLfS=ITUTG#rfCbmfBqxXLDz?_=>O*(hQ58n0Rc$h1f0>gmoD&41OF@@S5!RH4T(N9 zLk!d$8TYk-@0Q5u)ik{o!jU^_L>{Q6u{CmO*#<(ih2j4bT{~nz?GZNZe;}4n9)J$x{{PZ>B9Bo$Q7Gz#TG0NQ=ibQO&?Ixga=@ZebZ60HgtVT5kjo-^tKCO zdn!d5%#J+iWe6wA5gJ~B)-Wm&J-Z4?y{l0jeGx*I8pOkE5oxGHIJp>Qwq1fgrz}OJ z`!cjFy&m23SdP4UuRzOC1M+OU5;f9SA@;=82x->9{&Ovw(Qh3(Hgi2P(Kn#svo@lA ztu`U^dXjRXhDD1agut(mF`k&f^=!^HF zyLcmNmbnk|ydPEdJAi6@4PiID?3Wv&hTs9HI%%Bhu*tr0pU?PM6TY@t2Vo`wGI)Rpj338lrh#M{T}uv^P*s z$xTF(x6oO}ZG^esf%12to{YPQZMcVg821qkJwV9)Av)*$2zF18kwMs0b)LYv%v0pP z@EPieenUw7J7VC^kqy0o`ClU6rXc7Q%=;Q4*Ef*%w{Q$?>fRwb`w!&q{vM&;9}qtO zBczE!nDZypalmIZ-}om&o?j3~`--x{zBTPvFs?U-dAj2m=}KTUL}D$z$K!;V=Qv}? z;DTX@h84AU#bhpS7-BTTiZh#IqsSH*vbMyEXSTxHBX^9>^}zb$tufl!HW-@G7NgB? zhb>{W#|9qgfVr1<#L&=A5LahR)4mIq8Qm2#F}h*41Kr_uy*;q3R65qt(-Z4T_Qa0j zy)e2*Zw$@tgZa4i#k!2`hcW#6V<>k3=7t7hc*P*h6CaE*+=pP(@u3(Zhhg5|)7$hh z93z{L!2Ypo8i}?4ew-Nv;hLt6#^{~LU<@=C=4l!phqSW?C`?29`CTh!=xZF^{tzYrL&Z($ z3B(LEK8EN)m=h_$(3oK855c^}LhR8T5mqA>WAoi5*z|!?jNU&K^I05*ZFHAmbb}mg zi4<6MN;qcAjKJ#JMq>N=M_~>xB}TfausPOftcAN8JK9`>wa$#ecI3uljd&c^v#l0G zembntEgm~KH37>gPQ;dWO~P_!BxA(v6s)diD%O9v9&04hFpQRt(d!Jb{*0LSa1*vP zt0}!1SW9{))~9C{Hu=|V$VU!FA8E$e)?BOtS+I~1c~~8?V)(**D3bzgUduvk`h6Ql zw-#XrRE!m!Ex{IcTZr{vT8dTAv19whWtg*fIo8Id0<#5GV&2|WnECs0u^QIdBJ5yk z4QABUVzV>rFx-1F#%o-HWei%1(XeGuC+o54#mg}d=M~s;*9NGrE3uvrAT9ho;`NVy5heKY2XwqORYtyre@7mU{CSIpaW8@9rwDSz8B zj$sGp)qE$0i+5pX(QXXY?ZM8v@5RXBjTrh~>Goj=+mB(U0~m5S2>pk!mfnZ4;o(Ox zC)!bLQ`j-AtqeFkehaTcTBJ%{aQoX6%5zkqG=x`?fD zzl3E}UdA?+U%`wcuVOvRuVI+ouFejhKSl78vu(SA6j4|>V=7oO47G3!ra~<>?+wkNC)~J7p zaeKeQ82evi^Ul73e7(h1AAN@zEPr4tN56;l`~f@W^$~M7P*{)NpP-yRV<|pOW%4I> z5`Dp(GrwYJ)Hke^7s9(BC{j9(GYkaY(?H_obxwHpVrM)Gx!}VG((q+juDH?54JVzO z;hy5=IEh-|2GkPA>RREj^T)T%^1xd?ZH?E#jtHSPIK5+AypGWhcc-<--NtvoVI#qj zQzslXbjC@t3vSup6?a43aC*P)xVvi)ym^hqbD>4?RXU5@eDz&hJb-2_LkN5nNfSZkpxPg%bmubm3 z;h6$uor+^4^f=u+4JTdF@z&c6xS25GDA$CerA=j*f#W?harf3)IGUA>Pe(bp7c%1p z|6JUQYr$V}^Pmn{arf+eysfDKC*2Eie3lJ&n^A<1F%;ttaS4vDE`)hXag1ii(daT< zrYy(zc~s!!>PkEtufoZm)%f=+gcjkMwx(s);O!W-xDl_zaeOh3MlFH*wiIWKUxw3L z*5i$h%kkl81)hZ(pnk2y`?OevpPjoJKWkir8+xwAo8#+nr(f3N4Cw|usqaSIAl-yN z!#6`-x8RCfTk)i8- zFJSD0I=>%pjSk>F^AFr`88t#;I9Y4#s0rl)A zq~#WlGH>Jao$lb?R~>jI<1XHoa}RIb>^@9;fMfVW+|ce3#P=BDd4kWSJ;l-fXVCu} ztmofx`tawtE1bq5^a3|@e2EXf_X_I#Ye>f%@D_Ktzr)+2KXAI?J*>A6I4b`Lb%DZ7 znoqb1ea6lBpKuxc1@AfkD{Q}TL!bx|bQ(tB44hyff3AcMK2%=?6qOY+PaTa$c5Y2<|9MGDu+1n5pqb;$2TRXx_+MY0= z4urE?M}o7w6VV#$Obj-5A<*Hj1R}c;8=7|~3`=?t1D4SVMz$w`3_S^aZZE=Xcy9vX zeF(;mzC-}(M_}y!1f4#BFqj7t8+s2SaQa|~YY1@xA4-sD7~z38mBnya)(C=Rj3i9W zM-j*|nxGAD8b5~ca34$1&^UsIk0+KHClGaviA2lklOPR~2}a`-!ic64$Y&by#}Ecl z)XIx+xjLN~;5>s!Mc$B?nZ&G_vk0bXHh~&_2%7sG!fE(iV(jyIgrWI-f+1T#G%H~e z?lcyGoY@5Z35Rey$|X!<9&sG`5~CS@1U}TCz*+|oq%Dx}>C}{_|E}W`45uIhxeJI9 zC>TyzLWp`?NYMR6guAzxa3>@L*-J|F^bI9O8^Q>}O$PDHiKx~JVlfs@AbJGhQx{42 zkWmC{gAc;Q04~-#5hEZxOy1!bOh3Jlt68dK|MT9z!4L=6Ogu( zguCSw;Z8pdVb2gPu(Jee*EFrEI|t*=6Lp3Q1OvNBu(3-7Nxuy7UV%D)m7tN=i0?^8 z*9pvagCOVLB_@{0H3ecu(NY z9|*GdM*^-}AT6IDPoD{Q>`$VF-xuQO%CAKK-rorB_v1PuNBCgm0x1qhaDuEGPLln- zoX8X>XVU4s3%Rg?MtXO2CHE`c$o(^$ksTP#$#X+nkXWadBn^&k_|me$hk8~w(UY9aaS^@wi|hEdv~(d zsR!xiOD98mdy?+sdy*Ua^di5XI{iyzy-7B$4_SfwLR|ewg!dj+K#^5<*R?oSldgVNF^P~A>E5-t{FNaBHD_P{EST@=09*11El}pxU@yMRIFF8NU zkL-o{lQ`T*M~pxc_vDjwdJrr}K=#IiNdr9u`h_G)6T!EbB-=~KI!sC$28NQPdl*zX z895TkN#iF4nK2@qG?Nh|9YvCe9!2Ibn)0S3-7{6BCmu~2eAMLkO%Z9x0Vsx?>(Mkl zmOP5bk;tZn_;sW^8BZdQ1kxQPlGvdnG5{{=5lSY}kQCCLmI`UqlXP|(iQLmkHfbQu z!;Mg;CMfd^5)Rx@23aHnWyAbAB*M%jot8_|F$)amkzG3cKM_M6_Bo$ zLb5w%BgcCdk$A^qNJ$B)abHOOW53iCcPXUNPU7BWBxx=u+l{Xvv5%ExSF(zH>RC;S zm5a#XU1~_PQ!Qzt)sb(L7n9=7OUULqOUXlS%gBAGo}9~F4$E3WI`wQI+hQxp>Fiac zbI;YJja);*?H1_PlGuQz?{y@Dww|PY-|#n(KIV<2y4@zS5U$b@eG7>-+e$JtzmV=T ze7Vek+|VFiSIiB+s8?$&!-?Sr^x~IGi06hEZO^i z6cEI64%X3m&=lbXvLkkpq%)fOo4QM|?OcX(y+Y#dSIMb{Yfv|?lgQ9C?FQ6?o3NZ) zB;0t0?lvsz4y<Ha;gyO551WFK@N>f!^Eq&*}J_#@KL6!ibGdra2hPsl*@6ykdZ zY5$F6V86q6(@f7voc@9&++RXH{b%8n)ox>n*S%1#TSU{D{1ih26Y-a!NsW)++cS?^9d&?3@1}t zCnp1Pc0zO)C(nQE=>IMLra_w1w{Nb%4KxGIK?~3lv;ywH1GENhKwHobv+#U=o-Nrhutn8ejk~FdfVQ-e4w}1!e;uFbB*9^T2$t05AayumJ~f0T1{BKj04n zKp^0QARqw2AOr}32#A3MNI@tF12P~73J?w=KqQC)N}vMKKn*k?2E>9mpanV*4-!Bk zNCL?q1*8H!NCWA>0F1x{GC(HC0@)x3m_aVEfIMIY`Jez40vjj-#h?T%1f{?Z%0M}& z0F|H$RD(sJ2GoK&uox@>OTjWw50--!paHA|tH5fo2CN0^z;OB#F0dQy0ee9s*a!B51K=Py1P+5E;3zl-j)N26Bsc|5gEQbPI0w#y3*aKS z1TKRs;3~KVu7exkCb$J|gFCnOE9YH718FT?%K{wDH^Z<0=33`HFpf~6P`htF-KNtW8f7MKluz#K3a%meem z0>A_;zy=(^1w7yj{D40Q0D*uHf`9-7gAgDDA|M75AO)cy49I{SC_p%f0FfXHD1iz@ z12xcq7!V8MfEMULJV*eEAPFRc6p#w^APuAg126&;$N-rj3uJ>FUa75oBz1>3-OumkJ_yTER+2kZrnU?12I4uFH;5I78ufTQ3TI1WyL zli(CM4bFhG;2by)E`W>R61WVmfUDpdxDIZBo8T6>4ekI3xC`!q```h12p)mQ;0bsN zo`K)M@8CIj0bYVv;5B#y-hy}F5AYs*03QJbK7r5RPw)kN1>XR2f$bmQfB+!bOYT%4?qW=peN`BdV@Zo zFX#vQg8^V57z74`Az&yN28M$XU?dm?MuRb6EEosIg9%_Fm;@$+DPSs?1{lB#Ob0W7 zH<$@#f!V+Z%mH)3JTM98EgSt!7t!funlYnJHSq`3+x7az+TV@_JRE_ z-*2z~mowl4Fzp~X1P+5E;3zl-j)N26Bsc|5yZqO79RDT4zuAa0kgv1g95@dyfQ#S~ zxD2jzukqr+ynQ)1Mtx0+qC~~RX%c2|93(DV>Vi6>ZqTBt z2cjcS)D!hWy-^?37xhE^p#{}IGzblb)>1>!Ff<&EKqH|g)M#h{H5OVwjYkvEL^KK7 zC{00Ap?wkqd7;vg>KL5l-FWl$)BhvOqTQXqIN6^cYrNQqP^8mW;6#h_RehqOqC;!y%hM9@$c zrJz)3m6G=Tw$-}t*Rfl^e_mOJRM?(pJ0i$ARVxUwGl&o5cFc+Hac zE7!nus^NXZr-t?4=lYL=M2o-A_s^k!d@uQzaeEi9`pfXzhBYhy8hY`+4En{z~)ZsDD}is{S>Ee^dXq{$2ea_3!IH)PMZ9`B$v@ zYi$4C4;5z3(lyKeFUsEPyKyFo8=lMW{=I$wnPq0)^WH2o^WKRpDa*`Y$1x`{hM8lE z9W%xdG-DFScFtF7wPe{z=6SZy8L7Lvy1L+3)omv;W0|q&ED&ys$zrxxEVGt5%e=*E zv03aEhs9}eSr#mdmLdmR= z(c7xFp?63V)}SwfUd^a=m{(jOJ{KSghw7t=nYjA@D4C$&dp7b9K6-ztzLNNo|$>|>Oxb%^aSD(INb_)!uZZ`ugF`_*)T8+4Ua&x z&e&$`GmaVOjB93LW^ra|W_b)B>KV<<^o(|9W=1!opE1lBXG~-BSL$o^rTRu)Qb#m# zO;nT6#GYuW28!khRnQA+70^R!EuIalJ4o{`*53hi`;(P5G}}<`ssHb*fNZH5dIR-P z-B&-TTk1B9Y>Jip>ZZ&o>^rNj%j2lr6K2NSwmO1lchtKwS4CZw`vUj9x`)QM>bo)e zxFl(`tFYE4jVH!{F=#wBhKylj#27WkjB#Vam^7x0 zX=BEiHJ%xB#=Nm$EE>;^7sktHckvngh7&`;5Hy?`LWZy*Vu%`IhPWYNNE%Xxv>{{2 z8qN$kL*7s@6b^h@vL+8`^b<4UFT|noABPFOi)h+4Pbs=3?=g^sS z5nWWbqTAHPba9Qb*1X?wkJ<<5b){bUgy$Zlg@Wol-?;(io1Z4Ur2SOTD08R4=KQ)hp^%^_qGe=E`cj+9C4@@@M6d z+N3c}o3y4Glg^|!8B9i#$z(QJOtYpr)4a)QvYG5AhskMjnHEforX|y|X~nc^S~IPi zHcXqQEz`DX$FytOGwquWOoyf;)3M2I@|e6PpUH1JF$GLP)2S(B3Y#LPs3~TOn-Zp^ zDP>BVGN!EQ%#<_bO$AfYbZ)vZU7D^;*QOg&$y7E~OjT3OR5vwDO;gL%HYt5F-dCG7 z=4rFmJY&|G^}}W)*=P2fPs{;x(0pnRnZxFYIckoXwN|Z7Yu7roPOVG3pk351X_vJt+EwkE zc3r!n-PCSrx3xRkUG1KBUwfcE)E;S%wQj9P>(%PF% z&?dDhZCabrX0>P9oHnm5Xp7o&?S=MId!@bB-e^nOvbLhFYHQlMwxMlmTiUj^qwQ*M zwRhTkZBP54?P~|xq4rS=XNb{mbQqmRmvO)*al^Q2+%j$(cZ|En zJ>$Odz<6jpG9DY`)(q>04a25k%dl1uhwhy)A|{`S#QzL>gV+HdaK^1x9c5xr(Ul&=#6@leqFzzztCUmuk_dYyuP3> z>NoXU`fdG=epkPz-`5}L5A{cSzy3rY&FfHuW=&t!yX1Su zvc81+W%N9Q=Q*)8S566gi%M-oUSJi|xTD^fC81wT&%&>#k6PIy_U9wwyBh`jki@O* zbmi46-_5I6`qJ&qYX8-%n=3E)>D8;tfbiVT3Qxo7;mxTYot6 z`sxuZSD*+@1C|Rd2(qQ7KR-ny8;U?5`5+kB1kJQniAQ)Fsyo@jZMxb`FXu$MAMA5= z#C|H|ifR>7MXK<;1RYD*+ZE3iwz#F>Eg_3WD_Xso${El~SLHx3eUtJIM|1ycFP4&4 z678t8RI@Z^ntq6a(AF>(dKaZiG_y12 z9g#zP&d3s8y;`}5BMmfYFJDmPsG{BARI2QQCOOdP*nQK2a}eUS0CCvyAA+V%pwEKm z3J5#G%AFYCp)K@Efan^=p)h{F*%LDg-$iZ<6L^65Aziy(S9ca+Nsv>%ir{#yHiWSY z>_7HK5U#?Ifv;XgK@Y$n_P`5GwAVRM>JwRG!xiNgq5dPyRpV?_FB;L`KFuD z;0lkY-Fok_>~DyMB9=2~cR}79_{Wd3Q7OF&JHOnlw@7INVp+jf|3l%oi31&Dwb>C+#xSCCK~+eayL8}zGU zZASEfY`I8V2J6LELjnxgjgS5VmW%+Lf zN40W2V}YSN70~G_o{3kq<4XEj_$%b098X z3-nSpR9&HNV!zEahO!5xO*%M^Ro@J<#2np`akSA`Khc>@Gl5>=4P>qBrV95z^;FwOx6CarOAq0sQAk=j#)w>{UDB ze)Jo#4+ZW3_yf)sgejpHgz@QpNcMRl)9Y_%;5<^)82B7m-GeBr$2?R7F0o~>U!}3| zo=4FTDg9IRi2<^Eq4S6kI9IG*Z4V1bD+l(&d8XcI-Zqf0x==a5Q!pO}y>#$rQ*jQQ zfF_BYC|P_)6XA*nRj*CA73{wO>!ntOY&(&CeE&?1kvO5o$+K~Ygk7-DUchberIs4=7x-GnX7I+?&IL{((nUpVAQA<*Ki+oG`46#F%tfv?yPA`E-!!(( z>U(TX2j=tB5I>!J^{&)9%7)~+bqqJ2r!70&!WmiW`GaA|pVRPk!Z1w4{C6A3^W$rx zuvY^-kuUEf)QGbW2rIh~{j)Joz>Nc{ir6lO)8Mf|!U#UBVd@3WCV?XW@wDNJEw0eq ziSIY}v_n*FsE$hfc93QUf9Vx9r%+t$YfI)s6aY2jULLGEE$Z z6?TXeKmyR**#o%cj#?5T7*N#b(aft?`*G#yrT!)8mciIf$~hu&pUb%cKjDD>&e-io z;2NSByn1zu@^EEBmw8!YUiO+K`;FeZhR6}ZnYNY#`#TR|IKzg8*GOCJ>BooI-vHdw0m|MEI@p^x03o?zmDv#g0IHgUS@p! z+~^MD{kb_f3C8N}EY!J8g;q^`x0BZHp*)pFxHUc7qbzJC<&jMQWUQ|W1pic~C z@g&D+oEfWS0(~*+ctVTZ$FY7T6sG_@y^vdCn=8$teiQIEGlsd7C$&*4R}U@nv_^qD zNgmX0G$)LwVg6p0;y`pGx>2r%Du5(iGcs{jjiiXZE3`TbHfgb(EnI&xpld)rVRgtd zX?0tH_d9&533F*=-=iXO0#!dT7HDEilwtN{UiOtlAAi?zC0V|SqnwGO>ekAQb3Gk7 zF9+$TR3)X^7DoY;8-4KRL8=K}Y+(xoNe+-_r@`ha3l#-tI)2OcRAPw{l zVSWo?yb5sVi(P4t1YyPK);iHj@c$&VZRxlyt@!v8}hy##jYJX1u0t?@flPt z+O;NdJD+6igwR(<7-^@-BOSnD2<|Lm3xY-^TzgjJyNEOkS%lAl5yb~Ow3>%c;(njl zff_Eh3mHTEW7VT|b%wIrgZ%V>&yFb+&{=3+8JnBPp8{=oagp&U?h~CcEd`D)%9iT& zDZJydwZhD(U7~24a5Qtc){N$*UIKQSMwydAPk|n+3r`o4Y=)RE%064IIiYg3b3VC( zbSpK8gV8fTak|3y!C;#abT0$a>wq2jUx%KwZIq#LY@r4A@`L0v6xk=th;Sl%R~YJ$ zA3ImkpfK9GEXtZ%an*1tJSp&u+KikJ@aZ09p)fZSlQ^!C&kkOri^zE?M-Gp1oF8T6 zND{?&azZ0Z(kgpX;#`vLkSNmIu3)4|>!o)eYu$jz ztmley7EAL`neRva*Y)NU5!pvoYeSKZ<11&YC8TN1r-N9}RjW{^)!?uB>iqzaf<4po zx&UQjGXj4`t__jG39J*E26@>HHeQ1-s!w(-L+*!f9`atm!Fm1=MKOh~j6h^uckMyD zG4FRZPwPk5O*j{&7WQo9?u$1iJ7^@eP7ZFXa5l{#@0uQVFYS4=8zdK374%!#LiM(GQmQouAmc352|2)zPT7|sld@*Z_~v6ECu-J=QT1l z2O4YwZ42^aBk6{pBeD2Y(|WhJK0j@?0CNkv4?zvJZMc+Yd9{UAPLR$5t$N7EtzO3oe9#x=-J{@MjQiis+=YAnSSob0w6$L1#x-apGn3HH@*f zViZ-@nj*KFGKv?_N`>v>2ss1;>5Jfa~ERU_Oj3lQhYk*Ul`S zHAQu+mOkveih!ohX)RKox>G;ro$s3nM&>0nmAd>Q`=X6r08Pub+jy zJ(v+&BYc>O$fsKetPeyIW7&Qwuz_l>BvpJLAq+MkQ*M#v4V(p=*q@uSl>ES24Gve4 zO((r%c^fi#>9h$eL&Zyl7susKj;i?kr3a*osSz0ScLB7~WBV@hJ)B>+S5=gw&cP1y zbNb2I)ddV(XR4tA%x^-x`(Uxq9zt3iXK@U<1323aOQX@dh|xQuRDm*^6UMcYqrWp& z^+#M{@9H)K(eWbR9V3q#FK%-VMf@M-y4--gs+StbBFNLE^S)Ic$=j9piQP1DzYd;O zwwN3fiRwmsLWKZyLvF$jV!Hq@?|YnRuXV`EW8}G1*#=c$*Sm4&!Rtis4tRbsA@oD- zFp>l(D^!9Y{DGOc&A)>*arO_;4!5Z8TtSTsU~2@vuyN9`D`2|@e}5aI1)1fJ(eWB6Vg--L=7xoeQ+LTkw0 z+k@N?TEK07D3|ZAF7Qf`Dm`OCsW<-CVvqF0#X%hQion>6&V_b)06rMCaA*KoaS76U z1$7||(Y?#r&j%Qj=NM^b8JX*#S5wwflCy*>;ugg0q1HheRs@@NCXjj^nM*C?7Zp`u zGq>9>fu}T30d+Ws1gY0D9=mc++U@1H8~MC|eFqZJxQw1XgwXlo0M8C&o7TLgvG|=| zG*NcsfqK_lMz+NjIzP9+u{WY7Fz-6H=O8Z370>;sA_)Bi(n#oCC6-TjQA9410jLIv zU>q_g>#=nDFuJ*IUt3NZ4XF2>qm;n^a@+EUizmS@AhZP$Eu&~d)r0=1>554}%uGu` zfxchPW0Bs+XdH39anA_*3hh`STciljc>Ne^=~BFnaX*?7dM<=kE%I7Bc!aAi-0R=K z=fc{XbWA>7;WWnCT*1}@1x2|NT!ES=v=%-y7Udc@T^JyHFQLvz?HK#|0X&mMvI24) z3q`u^IfR!ZKt|hl(rsVtK!l_g#M#k=I-`@3D9t7lW(DsRm2&fX<5{x?6Lpj!3djcuiRHvGc>1O0k50~b?&i+A@@FAo)`g=Vk*$Rj zurrW-0rdtdVEOJCbXx-(P8BnvbeCe~0+M|aT>)$zBcGU1z1(d?aor3-+}H7nK42-Q zIA!1z2;HHYwi5BR^YTmwV?o$&79^V#h^S!C-@?vUSU2yB(GWG3p4;+mvzC)+P)|_J zk;a#P^I#QG3}gPEDJ=V1r9;rMgX+k9DxrwP3ZnI7J=p&%Qt%zO@ zcIW{@V!k+Q6E?OK4+69Gyv`C_<>yamZ2hS6}Nf~ zv~vpdJV!nOY3Un9P1n!fo;h}7&9c&AhI&w{{1heP6 zGOBdQ^J{>u3v8F93*3;97gi7lZe#-@*q1#a%}MVT z@enoBF-tb`no`=VD#v}4hIdv@430EDc7mpaWx#|u#d3*4r<{1AGI)in015Aw&Y>FkoLDbNcJ*1%R`Vw zB@`8~6J_+=6Kzk?S?84for$eH=xggBrHgF6mazr*eem6MFe;zBBQ2!feGg8aRL>Iz z&NOJX0r_9WRjzg_a9!qm6IHJYcBjB&4xE#BL2FLnEP#v{Xx~Gbm;vjDKJzmu5_pwu z-M51@w;gyUlBv~1+a0>SzwAO(q;`w?J?u@1D!u2?4k6^r zdAId+1^n-b?G}gaqf&_fH>7VzGX7ii`V_H#EjzRd5f%nQ|{@ zjKHG~+Z8pzjcykLy{otp2;)dGfbtVo;I}}1ebeKLHsUhN^>9QJdmgxXH=mWf|76W{ zFO@4p1e$O+C?zy_RSM z)!%YXU>ZKRK&)%B=Y_RSg(RmOcQm6w8vOScuWn@h#67JiiMva5DkK!K5a(Y1Gy(q+ zc;WR;54L&$FNg4k?>Q7XC5&@pwk0EQ@4?z{K~CPHiX`xzc5kY1Lxq?gJc)=fKi;NM zRKiJpVbB+5(sC6LMjcdd;6{P)b~9%6{mq3Or{zEkYN^z8kO%%T^olbbh=tfp82=VI zGjq6VU0g(v^%AG>9>|to$`asK=P7}muWL5BGKyS9I6Fp76TU??bwru$1)@qyDN-Br zjWp+Zkb3GT{Bk>l7vw*YIle1Ks7v5F{@`bS;ybe`==opI< z+|P!7SwkztQx7P&z1DIK!oKD&dZ>}FTDx7BtGeFi`vmX*ExY=1|+3X4V(wW?IOGmARl(I z?{3R>+13i^wGMyI(3!Cm-YD0hGBh&HObbb~!eBebC-x%WBf|wO?9;$H_Tt~TT40@5T9*gi-sA0uI>7nPnjH7cFDi^K-9`NL8 z!V|iS8vM;xh-U3fM^H74=-LB?0ec_G|@Od)OK)p)m zBnhjX2=>(aW{ zy$>%ea>Y1Ar@zQ;giJ9(By}j$V~R=%XFo)u54L4;ZO~TP){#zEg%}|D$iE0YTTuP3 zhIOQyE2iXq>q)4XCT#x;wwtDp62MXM)!R8a_HRW5DKz(zqjZVHkdY+F(R9auG3%%OO#;rZ~I56Wp zdcZz80#C-qs?BuxzG1+#SEz1n;uA=ecnqbJ=0?;CuslS=c9=bKagp9Q(+oogCC=Sg{Bw8v-?x zfV)Z3RJ)OJ;7Pe~?g^_m5FRXJdJFVp;6Fj9?N%rTwe+$cP@Iwi#}=-rA(V;f%Ho|s zT`Kjk--HohOo7;C&_`-nw68c?h`FHZ7(i3-enohiWVC2}bJ)^#@NiJBFxznq7-qWvk7FYdFEBwuA60jVf^3Exkc)c|?)l zKs9&JD#IvVh@w+67^$8_KqT@o)(LM3<5dRRn2jJ5u!K8v`jq|Jx0(}hxJ%ai@aOSqw4Nh28i_0a~Ao}4=0__ z)N;iX$M89%ug6}yg$Rd0!>p{g$YaOxD&svx>H?MspFdH&bBbCf$rj(eSwvpZLzH%Kor*$5C z37rR{6>!T?>;WUZgB|5X?<@x%etlaVMMRFh1FdeSPC>RC@;y0GEd+_@py`QRX#~n5 zRF~Ze&JwIvwpm3Cm2|P6k9ASRjw2R@hsOC53REa(Ztxif-vh_@ip`1h`T`^NA-7k{ z$~moEuPINDouWH~RXJ14*M(=#kvinyw44h~u>bXK4SZdK+?U!0*wR8{CyMeMcxN%> zRiIYnOasMLEkdSPV7Cm~@kUWe*8xLIC#f3?sv(l}!wIY$gMD7C?V@bYTJ%CblR@^_ z-cgWXb4&7s_fb*@m~iw?;fAv}Hse8&?)pS->(BsMw2kWQO~IXZR<@92Lm&PVS!k6B z-2_?<;?mCvJ@8UJi}?3)aHj^px+8_yJa}j689e*s2%x2}lDFa;ep95LEDX>n(4Ph0 zoP&0A!D`wMD|!u=e}Jk^KNbyiGfl{xA@JUz3M)t`_0u=opi`^6pOYjC@34%E5p|~r z)g0*ir@{W#)eLz0;Y?Fp25omCn}^r)NXJmi*q@0@t30o*Ge^iz@Vkn^BDVP;2NnTN z8ZTD$qJU|pg&A)LXHF#nXw9dR+N!5xc;Wl2+mcA@*(UuYIS_4 z&7;~N&`Y3;*miJEE&v9$V2?+Pf>Wpu_xFA9EL5|JC@oHmq2@hf*GgJg>y-BtM#^@F z5C*tF(ry8f+Vd!`sF%1h>fwELwhh^{ht4@qdLN&6({){W+H-?X$9_-?IaOBVm2xN0 z0!IXL9@%#Zd(Hs2H&m6;yaEx3v@W`JxyCpF84!oa39hb18DIJ4LPgr)u^)phv_Yh7 z9*Jg$(Wu!yJIL02$Au*B=6ArNyRn)z;x=I0C5l^?3i+fsYqR&J-W_;t5&3>86h%=^ zg!gL=9B(_!!f#|k9PY8Nh4G@Sxf|{xTelfxT`^pMNQF_n1umgoU`&dm@#ikstb=^m zMmZ|Z-DW@@#!njG&c{~?BhL#nd*BnPS+A{~Qo9DRSp^+z7}?V7%Wu<|#(f#(qZMax z_C=9j;8QS;z@r@35g**FkY%efriSRWJ<5qZ%YY!AJO|iCc6Y++R63PW$VhVM% zTSu)7xweh?Ly%?vdov>xJzW=;@3}^V;mnN>Y2t^t>_VP<<;aU`D_D+KM%W-{04qb) zIz%=GD7tsoQGSHSJn2Kyq3R3q$5;zt)HZ;>gyJ>K3A^0mnmK>B05dV{d2#=jo^g=b z!|O&oXAh(PWUqd*13H~TeGEc;g|-N_?D>{^jhu=iqIR%i9mU*_?SeO zX2+L&;ii+o-V(S>vQ%NDY#U>?&!Rdi&6f)U6pJ46WK!N!oR4+Xkj3zG&l8DXd@o^S z>?W?|N(d)j@g6e3hILxSYi2|F>k7INK;6uZ%NZXP<(tSjT^ij1?%ufBTes~L$~A%a zQIWxC_i%#Wy^#c?!Xk+`si>0@O?vC(ERiUq_gbuo{Fi!heMYv)p{Vgy88_Kz=e&+8 z*}cpOx9ukuY4Y%HO=4`;7jZ5q*eg!&n%EltR_|D_qQ z+;e2VQ(;?Nk+Us@RQ-#7G)&CsUi9X;hLy;Dq^;Otd=`EhickAr@t{z}bY;#aWo^MO?j%SdAv1f26tWyta z^*F@yOrgQ^@+4~JqCXV+$2pO5j56E=x$RY)l{qXg9?%Rn!j8g~Y=O9HExm9WQFvbM zH=Nr|4 z3*Oyn?ZRHCD8DtmsI0-{9&rCgb2;D^Tl;1g>t+r++&Vz_t}ltsPjUVPRnk4opQ-IV zslLuJeZ2x!lu};*bvFY0_`s4!Z24#f z*!qkwh55%Ee3BizfoCSFm-d-j?!z}I17JgFPGqOhizk<%Y8a73E7D^Rc@u6Z_>2{} zl+B1`M9`WTiWAg6S)$0hUXLQIcA)y3>dTN{H*$0&X$f2}rLppTfW5gXNB?@Fo+!CX z2*XN>(BFB+uL6A@d=9u$U?hfgjaLs}jG?eXZ1IjGI*Spp5s|3Ud$)OpJW<9dNpz$c z@qLNvi$q&|&1oX=^cBcEQS`<2(+HypkP&a};i!l+afKaW$e|XFk~o_}TBjp>?U;PC zhI3l3LCrB);u_%@fvkD1#gRWpGl5K^;ZR71?|z>6X~eDU=}`r<0QOe^m3yGM$}gshV|gO1TCVPc%#*e`WX&JuxdvQ<&$7$b!TapnT-iNa0x44pOb+eS#Q z=v^u6L|)oJ{&p!OuAfZGRE}HqMI5VZ#Tt=gfHNTn_&WewC)-lN44Medp58T01>fO%KpM(%kqv)f(W>PUCdDqTVH8&vYx=x5N1~3vn&t2uLexaJE48 z?dCwQp`vD36j{07%^^fwK;_CJdmD-AXV1GH_;;`6$w|_sw-#|P%lRbIZN>7y0Qg=& zF-s|S7w1=yuZ$=IM9MCTj3iZjClGGUI79c*4dEsS5kkCM;mv0(bb3AId`dAjgJ{(uM6nFsdqg1(_dsai#RlzgMUHhRznEaeZd*8BK=EO6X(D$$S}tMy8{P|l_y8#aOFk8LWn zm*km2me_{i)ikcs2fhU)^%2Km(Ypkg6WdJy&K&<1NYp5z=Ya@~w`j@Q9H;m}#x8j1 zxptD$A`In_oLFDrahKJ(=Xl{}hvJ>a_m{Y=$E_UMMWp}jgX#9};S#dMHgQ)_$~^^S z?Yql3ZqiImkqN8NpT(NzpI8b%7m=%p`o){n5LMU;;C?=1MSflMgk(%hyNP~dPp zV=>?<2US2uPX+J*UJO+RsnasVMT7ltIi4S~4Fb2+_QvXJrz+B`pvw;Ur&}FBbz4PL zGtLr$W2tqd7+r=ktxd>s3(`Z9yag1)psW#uOaMUk)r_KdiER_q!yuGc&g{%2cd-^Cq~VYsi0h1hL|s6$-=DP6GxetfSiZ( zD$}`3U(LV{({N*4#VA{84R72qAMNfZoG_<{NUfJ1L9e~LS$_^JwhT`Do_Yw}||4-E1YgDVO^I%RU~nX2dV_%$R4KsvNB$Y=yCm zB-~@xQ0`X;xymEt-{Fl3tQob2qB4LVApUb*6Y`V5(+Ar&D{=79>)QpcUc1O5I6I&5 zgCyZ5b}MCtj9_uD0=Zp7Su2jixT4&HR-@+3xX!Jw@sY$C!8|2gEtgRxfZtz|YLYW=ZK8q;dycnr&_HSrNcO@-9r-`m&%vF-0usyMm4%$Z zbp*M80yXUz?^v5a5oDyo^OD@jcO9ZQqqxU3C)Pa5b86UqE1m*=s0Gy}uxkeUX%=cZ zd@~4|-h;OeQQQQI(A@bVL@FzvJ0ey2^n%q1kaQ4&%Bb+syey}I5epR?-;ad#3vzaj zq_t%2TPMqRZ4?0y`UD{HWKg|dMo)52Sp&kU|p!uaSR z2Kc+UNl(N&@Qk;W`w9Kqi8Yh+fL}ntdP+$z;4@4~Q}*wCSvjW1ikpg(N9fmaF4_Ro z(`nxAXITjD- ztXh^&w85vHyn9vAYdXUEamDx8gB{zA4)k}th2 zPqM}LBJW&n4r$yhiy!tTeUCU2X8hYQ_3=rz&G>cv=ykavp_0{D$2AR zDZ5-T1P-yKQGJz0!uuNhae42T>FLtxSY;aVI^^>qbvL3adj>$*9MU$Q8_`!hLO-au z$&BXSsF#NLiEUf93-VY-mpEs95!u=td~O204^f0O={X$pCAjGdZ4S$CA&Ks1<;-JV zaRq#K4+kf5)hlZ$@*E(H?I4X;m4idB(CBdW3&#~HCQmH~hs@O!83 zl0QY70H-am^A2iOK#t=II@j{U$J?!-Aax(AI|$kBWvg7N&>e-@QpTa29I zE1BPf$nARrl~u^eHnPJcXSK+8glc86wvO^xq`|3)YLYneO`u&jaVGcW*q;u!LBsKu z0&9=KODA&08O>J}nWjhDtzN2e6qnIl7Emj-0>aGpGj%_}vr3YD)-U24u|!e6`}ZfZB#~~N z$muJnR>vq#%5{_d`TJYQpM}hP?OwKODXSk0?re9fesxFS_toZ5hVND$A;O#Yh4?i> zupxWi*#XaY6Z^eTrWqYn8psP<)n!2DIm%vXzdW3o%P3kBr3EnRTaU56-s<(#x1+;>o>q;Rzw(MP=t z(77vX8A5p`%z6-7=L5?~x7{ar9Z9gsQ8<8nd%5LNO&FiIfbL>T$WkPV@Gg(7S;2nV z9J`G`=F0V2le$H7D-ez6S{FDk(76kzJ6ImdNnA62sVBVS*z5CSu~2e6*FTnPhCj3e zaeb*>Vhtwe)yU@})ed!3Y#IesqKR(@@Hml&Iv#7--d~GrJ4wnjJ{gUY1nFIr@5mBG zd>1B=F`BI*>sJvj(sCVXLDUmC)>dT0Xayjpvl9=bYpBAC^jyS!>mEkqCu82zMK_?b zhEs>~+3<+<@X4{;Eo6b`4F14Pscx3_&-6BN*38w#Jp!Hf7#2n9=xKqqS;WzcjHqv} z*C__%nkTGSLK23M6-K0)K)Z!%U`iKT&YSe9Fn+mRBD~+q-jq1qsEYdo!uSrKv(nsi z?=_sQ*R?Eg-yz@i;e67`o?iv}4USI|MKXO?%5VE^ke{~UI(TFjVgCy5Qhum*g}Zw9 z5aGxku7i|o;5(_sP@T}_wxj8Mv2osPru8`X<63o5bp6e9q=^;TQLl(RD{#iSP;OSk zd+2T>(65juoMkn{a_wFR(K+ZP2k=v!@Ny`N<7-Ad`TR-f7UXZ0PC(BU*+Tf4CbsXq z;cVAHU*JLeUjT-7JK-FhS+K7#asoCphZ^a`r#J!jANl=H?O>@XLXWDTzKkgi6#mkDdC`ob>L(s#!Qo9U##q z*X5aK&i%~Tp3-{ht*H#*#^CHOK{ibTD&R9^Gy!;f+QMU1{sC?tOMth_ntRu0FceNGsm>T}QFhcpvZ9WS{wPE{Lla zQAUgX9YqD0mG7?e^%>df8{E6bIC@Tl1DwZKsIDL4jMst(k52}L2N_YLwOORm5kw=a zz}{#cZqhmUT?e%C5TZMe@3mJ@e@5*BRa*B+5F&l_1UVzVQLm3A_K+t@APZ(`cP5P1qp7zbOYyMZo+1W zD&(2ag7O}@{spS~4Se2+^DjLsa;`t+C}VFvo$;VNYamVMIGkvJ8%#2y+Y!JyTQcSGMX9nj=|D_$I_qu#eAE3BMbm6VW^&yJu z=r*!U$#IGCx_n-RJeq@Awjs+C_^h$(_&V}ba;(ltGW_?AUNz?^I?&!brOVcWA_Jm| z{mvl*a4&;gio_Pe*S&2S=aI3K3+`PvUOaabI))mW8q6y0$X2fgRrA~PEr`%!Lp_#N zw|J$y;DMDVV<*HJ(m>SQgR7uZ_L;AGiehFgt(4W}QO%K7i|>8l zy+Y^95LxL*{WP4ZhfiX2i>kA7y#@G^*lLlk#b{fSBlZADzr%Rm8{-vLRAgU0%31@) zV6_R|<;yD%v0+E%0QntZbKA}!IPLgztWt&Ml~V>pIHm}137z? z+=1K6au0GvY=>iLg5Rjf-rQ&9PrO})XLcWAP+5*J|1mm2R%K7kDXRGbcwuv*_O2@= zNqdX$U5wfjs6X(ZXtiTGtXXgl@UV_*?cNiADrKCYT;In$OJkmfpRgfKtPmxk8RKUc zdc;w?g>T1i@8vqtobW_W_K~=9{CV2+o_Zi#Ktq%{U@@-rb&%V87H6UaC)RTopM&Fa z#nBa<`Ws_1wiNz63LZZb*^M`Wky~{32z&Gtd0Oa(9QLlTtPZlN4#Jmp|`Hls$#FC7STwfV`MfWSDYJ=-<6)JAC&BC-xTPzHcH= zgmvw-H36Ud6}3^IKHt_}h>4PWPsWXsT7i`pZ(=o6cU%R9)vGT=WF1LL`|d#Vr|k?^ zIbp_MeLDX#C7_TuEhF9c2GN~+F|U<7`JeGUeELLHNaPC*tL5}-vj!>~)@os_PG#__ z8?31o>PZpNJi&83*HWx_fVzFJz)R@`%!zuzKMtdqH>18suCVE6ux-e-(QXOEHI1X# zL*6Zgx{y7GDF2oIfxBvGd@PODUwg_)T!!m;MRrUB;>8wuF*?Sa#Ph$rEn{cixc+*$H6@&t<1JZ~y{MDA%6+a37~dBo?xID3MT zsJ3dXZz0}FOk3YZyq(ZmXRJD_-ue#Woy5C{cN6a+3|6DnWHnnY)>-SEb>8}3!fLfy z?N*1?X?-8@e!^w_0P#WML&Sph!^B63j}jjvK2Cgs_$0AtU9x_PShlWMSFN8WK0|z# z_#E+h;tRx@b=~?!;!DJa^~=Oph_4cx)~^v?C%!>^llT_#ZQ?t`cZu&2-zT=LKOnZP zKO}xc{FwL&@l)bw#E$jn1VNC*u9YHaf+6;-DuN|Af+wbkUl6|}entG6_zm$};&;UF zi9Zm3B>qJFnfMFwS7P6KVEr5McjD0c58|K1k@eX6FT!p8H}N0hzl5655FV@7I!*Yj ze(Q-fVAT>cM9_L_4Ozoh9ib--M8s+&OoW+;S}nvZF-Oc3R>DTuiI_ERbr1<_(wee5 z2^XxK2wx=$Ps zhs2fjh&U#$t!~0Yc!?XUkMI*GM9CT;g2X8iBEm$3h!QcPY>g8YYl27;DI!f|h%9kN zm|{)UJ=(s$J({tT5pIuYl*nG_N-;1LR5(wQ70a( zeQSeg5(8_CXcHY`Xzdb@)?4C^xF>qV1EIEQY<*(dHXyXNA@NAOg?uadHuCM{jO`ud zJIQyEI@`O+_mJ-;^|tqs?Are${mHZm{b@ChJH_3UM)%GpYX8Sg2w|$5FF8Mw3 z`{WPEACeB+kH{aBKOvpApOQZ#e@?n=1WA$JaXqzH`LH?5b75QuO zH{@^0-;qnUW!vw`KaeZ7KazhUS8Z#yb=!vR&*Wdozmk6=H*H(CZQI|;9os+1UE7}R zpX9&Df0O?q|4Z)M4s2>tLmt|uNi8`;9@%uHo-~j~(nOj`3pq>9k@KXLJhr)QHquTy zNGItc7f6q7kz68|$rW;yTqD=X4RVv*BDcvMa+lmA_sIkDkUS#2wqw#wdPpznBmLwF z86bT&zb#0fk|(wh873oSz!oKAWSmTpNis#I$)N4jmLWs7EO|!e$UIpfi{v?ZL56LY zO0hTsqazW zr+z>cY(?7-sUK12wjWbJp)PEfwx3d0wx3ZyrwEFqDC*jFW232(jiJi6icLka6h~EU zJXN#RZ4KKL)wKPB`X%)%s%85%)wcbH`YrW4>i5(isE(~``y+L0yR+Tf{zUzm`U};w z{gwI~^pe1^YYbMf*GHchT>r-$TEbejmMLe?R>J`h)bc z{X_JJ>5tGW_K(sZqd!i6g8n4^Df-j&XXww;pQBgpYxd96U!cE8e~DhVf0_OYy`{we)4`sXx3lQc!sG()RsmgeY9 z`<9)jr|50_FX$cnFX>(TujpUXzoCCi|Bn7W{Reu_zHk2{ePI6+eP}AaRso6P( zXQr6C{TIwHnO`vt`>&bbFu!Gf$NZl81M^3wX>Zy8#Qd503-edzZ_MABe=z@K{>A*8 zY1{w9{FhNP8fKc&GBb>h(K80d$e0*2V_{~QIcA=*GB(D}I2b46ViuT1W{Fv5I`*!8 zg;`~8?Q6`PeVw_tZ!kUkCbPwCGds+Ky>B1bcbTDmk9oB3GY8BeqjnrI$BditFkZ&T z_?Z(Xzyz67Cd7o92oq&uOq@wDNhZalnGBO<&X^pNX9`S_IcF{yjbqwz$y_m7$2D`q zl$aSunW->UrpDBn2GeA84!xtr7#wZJ=;$zA=9al*?wKBAa+n zI&6+1^T@nK^;Xr}RCb5M@phHd;c_fE79C5Dcc_*f?^LZgRvl}Ocd6d3T6erh^t3IImpz1@a534?+`lxEtvE}%fYTL2n*mZnd^$FD{Ri9FQTJ;&#o@3wfS=HxM z2aeCHzM%S|>d^5e)t6OYQGHeQHPzQu-%uSnzNz|_>f5UCsE!@qReewOeboW`{F zss60`i^}crIR2{gI(&}5ss66|hsy8xr|QHJaQsX4Z`FTP|5XJYrw+9$A=DuXKFFse){vnuJZsAg4js(F=FWmDNzDM#AjP-Prh$C<;aa;X+n zi>f8nvMT4uJ62Sys)A!pwXWJw6&;(ZE!DPaN42ZkQ|+tH9T$!R)uHOrapgEt9jmS# zZk0#nRoyszD!=MPRdNJWLDi`$qzbDds;DZaimMW;q$;IKt1_yr>P(eWDfZLsXV}lOpJPAIeu4cW`z7|v>{r;YvR`Ar&VGaaCi^Y+ z+w6DP@3P-xzt8@FeQ^Ac{So_Pw(s}}`&0I3?7;DJmS9PiVriCPRqW95=wMm3lVf>y ziv0!qOZHdnui4+Q8t1h0x9sm&t@HQnAJ{*#GtNJ;e`f!}{+0b3`*-#q>_1tZ^Ixpq z`ES^wW?oOfDTtJB8X zoOag1I$0OHz%H_O=MuZjuCS}@8oSPJu$$}_yUp&fyX+pj&mORc>=Ap+x><+Q!+KdC z>t|2c02^eT&QmtThS>-kWn*ldO|VHe#irQ|n`O_~9GhngY>_=@FW5`=ioIrU*b-Z2 zE3C^|WovAmU2rzoCfi~coo%+mcG+9@j=g7l?2>cY`M~zs0Xt+L*|%_S<=)1lcW2f8s zZSFhVcR7#qdz{z#eeMU`4>_OnN8FFOpKyNXPr09QKj#RJ?_dD>=)~igT8mgPV zv|_YyS?)BI=n zIoD_T&+(t<=UrdmzsP@yx4OQ}e}(@l|26*W{5SY-^55dW&3}jgE^l+$UEkxs&;Nk` zA^#)($GpS!6aJ_C&v>Wn=RCoaJjK&I!>f3f=Xjo<;(x*alK&O|YyLO^uzrZi@OZ+mw!msjc z{5rqE@4GhnEqimOpl#@i{)v7x*H7&R_6um&bLiY83SEjx?^|h(5Pkm$Rn^WJK`u5a!roKD%y{Yd{{b1^cQ$L#e@zhVI zemWI%{cP&zQ^XWGMNQFD%v9W^nqsH8DSm2d>K9YLoch(&ucvMzNW!@+FM4#l7eTwf^S@rpS0pIO%&=>NBeRs+cU(^@##eE51(wFk3eRsFs%6Hm##&_2DwEV1m&UfDTynMlT(f6YKvV6(+s(jgZ#dp>BpYNLQb@@&Cy6BmG8Chjqk1Ro$tNx zgYTp7lkc>AFvYW2Y#3Tlm~!Sz~Ay}U=SDr{*~7NYk_sZdSC-E3~U7a zT0k2Cf?7xmYoovzunE`g40~PHIa27ZRoChud7lBJaRjX;2fx6bvn%WiMD)1k04Y&^609x8j;1+Nj zxC7h;?g96K2f#z%5%3sz0z3tt0ndRKz)Rp2@ET}qZ-BSJJK#O=0r&`f0zLy@fUm$e z;5+aG_zC<1egl7izra7B16&3!2Rp$oup3+f_JF-$AGi|i2M54a;A(IXT+&WzL*N?l zl(rUJ2d)QCYa75}a3eSZj)G(0CU7&j1>6d51INKL+IDaP+yU+ccY%}OS#3AC2iyzp z1NVbd-~sTQHVqyG4}pilBj8c+7&rsYf^*1pa@E!3@V@s`oRDg1VdmLjDS%v242wOU;<2n7qt|a1~Xt5%z=5Z z02aX#SOzsv2My2!EzkxX&;>oP0#?BqSO*(m6KsKPa0xsKo&ryUXTY=IIq*Dq0lWxa z0xyGCz^mYY;5G0%cmuo%-U4rfcfh;gJ@ArtS-THD0Iz5d!AIa@@T&F%d@FVyM{0x2pzk=Vu@8A#cC-@8e4gLZDg8#q{Xc@E| z>V&$WZfFJ61NB0E&`PKu8h}(1hoHmIZS4qj6gmdYK(o*s zG!Na;?rO)O6VL*5Pg{h15CDM?1i=sjp%4b)5CM@81;kF_k6gYr-TDnccw3_a1FY8v!R(;)*g zAq%o02XY|~dahNVDpZ4BXmzLoHKCVU3u;44&`IbNbQ(GXz0zK5XQ6Y@dFTRk5xN9j zhOR(Yq5q&a+BN7pbOU;;-GpvIx1o319q2A}54sOMfF44Rp!eDb?J@LGdjfsZo=8hxLfw3rF>s9@qQem2f{i z0Iz~q!wEg955hxmN?!x7h1bFB;SKOGyb&ION8vGe6TBJT0&j)W`ZhSDkHg#H33vy* z6W#?+!n@%;@LqTyydR!|55Uv#LHH1S7(N0Yg^$5A@GLwB&%?*z6Yv7O2>W0F24M(> z;jEt15g3K@ItJq~0T*-4?J9xm!7U4YBFrt7*0ORx+punHTxsav`q4#2h^ zghOx`cJv4wg=26WPQXbx1-rVZr{Rj8fvb8J&cS)O02kpBT+{1%8P?#2uEPdw!cEjNmy#_DoC-qZ$9d5u)xCOW2CHS;{5htMGsDHTbN49X_YufN#RL;M?#W_%3`8z7L<*FX#{8hww%H5&Rf_0$zU)HbaZ{Vx?Tlhcy9sC~t0Dpu(!Jpx4`WN^s{0+XYe}{j-KjB~SZ}<=V z7ybu#Aj^>DNGH;TbR#Q}9^{7Ji}WEYk$z+VS%s`d29Y6T4YC$lhpb07Aj8N;WCR&S z#*j_OW@HPp71@T2BioUi`UJ8A*@^5zCXwC99^{t37ukpGM{es=$N^*;xuYLM4k3q; zBgj$Y7&3$0)$i%E$bEedd7#fD$B`4r0efCz*<(qRNaP~@?WAvi)HBtjuH z!XPa2MCXvFI*&Zl1w=$7L`D=uMV{*~bUzY6Ug|+4goKe-dIX6gF(i&8kR*~qUh8l4 zH1bx@An)`nl0))H0VyISyxsKdGZX&mk+sGZ{E^-gKk32vgB9D;A z$P?r#@(g*7yg*(epY+fAE95ouMSp|5McyG__4mjJBn%cc9DA-}-X26YWC(=-ucFv^b1M#xx?Za~AvFuD;PK_kW}I)-jSH=|q7t>`v1YQ&6jG;VB16GqaQ zKzE=iBW>(NccGK$Zgda27u|>MN2kyO=rno|J%k=ckDy1&>k#Ymu4BZ=0Gx{*TDXv4^$O`~PBjVzi&myA4G zK#S-}qlA`G4b@QtHBk#aWt=u_^o()VIA@$U9MnZUw1QUA3&usGhSt#r+C*Du8@*&K zp(oK(=xOu}dKNv0o<}dB7tu@TW%ROf1-**?hh9Ukqc_l-=q>a%dI!CW-b3%B5739` zBlI!)1bvD=L!YBB(3j{d^fmeheT%+B-=iPUkLV}#Gx`O+Vq7)8qTkT}jPK|V^e1}F z_=R3KexrZTzvw@-1G{0|G?rnvjOEyE z0c;hv8XLrhur=6P?2+-4q=C}BiK>w7&e2= zVsqF$b{so_Enth74+Ag|gD@CFFciZu93wCiqp%OgM}x*b8J`UXV=)f8# z!emUrz8T*Q75icMv7bf&3t}NGj76|0_REN2aV&xTHj-EhOJf-|jV)m(u~XP->*c0q2_6&QDy}({#LGu+B zGGAk1^9}YEdxyQpK42fQi1`WojD5kP=2z?+_8p6vKd_(JFYGt=2m6ct!#eP|xeQO3 z%kfUU3-88P;5~RR-iIg6l$kbH;u*6aAHcI_&di$ya}~ZCAH;|7HF(i1nQQT~xenLN z_4o#S7}w2>xM7;+2tJCB;g-1x-;8g;ZF4KW4Ijt1;}iG}d?&sOcg#uLHFx8C@V)px zd_O*gAHb(^&pe19!Vlv|@T2%KdkM!LxYX%;9;w zfH%w{Uc$?G)6{SsH*gcTa2t2P4kv{+q`4mHCGb- z#69!A`M`W=J~9W0Rm5syka%o9F^7n!<{ILext3T*tS6qE8;D`zh56FlNQ@A#%u!;D z*hIWGHxpZkt;9BBoY+oG5O2)4<__YW`QH3s?j&{*lf*}JH?fEKWPUdH68nfR=6+&| zI6zDj2Z=+(Vd4mJlsHDr5VOQrbB>rNjuR({1!9r#5dZ-a5CIbiff5*j69hpL6hRXV z!4e$769OR;5+M@`p%Q)~Km>^p5hfx;l!y^=;+y&1Ob|)phnXVM#82~=nIV3gSt3W| zi2_k1{+NHw67kP06MidTX@pJ~gh^OL&UK4MKx5PW*J@J9~ zNPHqb6JLn0#5dwQ@q_qD7?x>S)-S@geiMI)zl3A`BRa@s>|5K*Yd0tWX0+s zt5z@BN3JCM$pLZ|S+iD?gX9odx7Ltr$#vv5}KI3zkP# z$ct8$tdWZSp_snzck;w@#8btW)G^@(g*?x@DauZ(HZc^W+8c zB6*3tOkN@HSXasa$ZO-&Q7`2Id zYHg;rP+O^I);4OK+D=VSJE)!1F6y~8N$sXySbM0K)?R8KwV#@z4p7t7E9ligd%~EsJJawEpLA|ryTMN_&YmxF%00mMI1ycxxQW%9(1VvI5MNQ5EW+Ri$cFo$}iaDquIM7S*Pf zsFPIC4%w%uupP0Z_G#)2b(T6uou^`U+)mgRsEbt6zC>N7u23oaD)k?Ajk-?Vpl(vP zsI;B2Z&O)2XXouZ)LrTxb)R}bJ){bD(SAfdrk+qwsb|!4>IL9VcaBlIY(+hg=5+OSP~Grfi0N^hgb>Fx9cZP`2M zowRK`wrlUAC+Xev9(pgmkM`{S^b~!7o~94dhv>uf5&9^7jGm!q={b6yK2D#Y7wARW zM+0=l25E?fX@o{;jIP=>8>b1Hq$!%F8JeXznx_R?q$OIW6}oOWY?W@>ExT>|=>Q$1 zLv)yq&`~-@$LR!}q*HX7&d^ypN9XARU8GBNnbv5XHfWQ!Xq$Fum-griU8QSuonEp} z+6}r%pR!wYn_i+%+b8K$^lADGeU?5)pQq2*XYC90Mfwtb&b~}vp|8^a(bwqf^bPtZ zeT%+L-=Xi)_vrid1NtHTh<;2zp`X&v=;!nc`X&8}eoeoj-_q~s_w)z)BmIf~On;%j z(%|^#b7wjqK z05i=TWDYThnIp_m<`^@>%rbM#Jae2m!7MO~jE?~rkhy3>49p-5%3uu6T(U3Q1Vb`c zY>J^7hPi6949D<{z=({*$jpDX!l=wO+s|CL15A(!F<~acM41>9XA(@3Nik_A!(^Ep zlV=J{kts1{Mq_lwU`)nhY{p?+#$zf>m8mgxrol9s7Sm>yn3K#Y<}`DLIm?`5&NCO7 zi_9hFGINEw%KXP%W3Dqdn48Qk<~DPOxy#&R?lTXVhs-19G4q6Z$~SW4<##n4ioq<~MW0{=@ub{xKcwGIlxJ$#${b>)8$LFni11$d0h1>}`9D-NbHY@7P<|t?V{- zoZZe&ushhh_C0$iyNjJ>>6rdxSm89%E=ygm{$u~O z+w2m1l0C(qX3wzyY`=4sJ;w%|^XvuoA{%rrv6tB^>{a$Z_8NPg4LM=w1{-m1vQg(2 zdz-z(-evEx_t}{9fPKh5V&l$Z_6hrxO*qfk=j;piCHsnf&Awri&Rg~!`=0&4rks!L zC-yV@h5gEYW7AH?$vQbF?|f%}umz{+{A5c`+4;r(X8*8%S*FfUO0J(9;8t;~xj}A-t2#Aj4Oe#>PSaV-t>e~n8@OR^ zBiC};&ImWkEjeS{CT=r#(%Hgo<+gF-+;(n)+rgc3PCGlfGtOD(oU@CY~o8k^|7o2JCAa{tn=p5#ba7Vdg+zdC%&2jVGaqa}Sz%6o@93Ka8AO~?Uhj5pj zE6!C1<^FRp4(AB&nnQBe9g3qlhGRL7yW!k)c zcY<7q3v&;g2p8pIT%1dANiM~uxeS-(a$KH!=oGjjSK`W?#_8N6$KXuP;vPFT=Ws6f z#PPTaSLJG4oojGS?y1w_+T1hexwFKb=Og#k`NVzZzHnc;Z`^n8oAcfI!TscZIKQ~x+)wA1 z^N0J({o^|LW&Co!lmG4fak}`wPB;J0S;70=9zNg(-CjQA_VFwEetv*o#joZE`5}G{ zzm{Leuje=L!~8~mgdgR{_)UD+-OO*{xANQgaeg~L!AIPvyMy1!$J|}~B)^-FyL0?kUzv9=8y16_b7jipW$cuIewl`xoP(}e}d1r3;ZJQC;i}MAS;EOKFQ#{QxJj-)@$t}A)FYqES@iMRQnyd1DKEMb05Fh3vyzWN% z7;m_7-gFaul27qzKEr2u%eCDcpXVL7z!&)v@4B8_<~3gD4c_D}zT#G0o3FVJUw2*J z<12iXukm%h!8iF9-{zP2ll&?EG=GLa%b(-V^B4Gw{3ZS}e}%uw|HohBuk$zfoBS>Q zHh+h|%irT0ZqvQbKj2&LL;expc9-18{1g5u|BQdmzu-^0r`*%-Oa6@eia+bV=HKvd z`FH#|_dS2!z2JV}FS?i9kNhY8Gk@9r!hhwz@!$C${7?QDf5pA({^tMi|GC%Pzx+SG zLs%v(7p}WE+?#Hv&?Ve*yM+}(k8s=V75apgLccH|tP)lWcig+~pfDudbML!rgtfvt zVZE?H7#21PBf_XKCTtQm3tNP(!Zu-C*e*;6JA|FWE@4vGE$k8Y3j2ip!UK0oI3P?5 z2ZckzVd02yR5&Kg2(!YRFfSYzP6!LaqTmw%0Tdts77zgyFaZ|`ffOi#78rpQIDr=) zx{q8z5QWFCB*=myJaJXwsp}U4LQn_^Vd0tk+>HoP;f4FsjR|ofAtZ&AkQQFK86hj= zgx79fCa96k|+!r1Q4~0js@JIM7ymQ~X|AY?lgS$*z zE`D@Bxt-!?w@d66SBO1gulU9N>h_5%#eVUdJ0PwSSBrz9 zI4o`yN5oNaOxz@H7Pp97#ckraxLuqOf4Muvo#HNWQrs=>5%-F}-F@PIaY{TOPKyV{ zL*ilahyCeDbn;+!}y9v4rD3*w^q$MuPT2#Syhi-?Gde_c$(MMC`Nk|HJ2qTgdg zR^&up6hu*!#DEv{WKj`S(JuzXpcoRvVnmFJAulGz#e|p?Q({`oh*>cw=EZ_o6iZ@R z)I?o0L{qdxTXaNM^u&r-6>DN$40{o;AvVRR*Am;}k{I(&il@ZW;u-O*cuqVo#=V4h zLA)ql5|iF#@rrm={7<|lUKdl|4e_RUOS~=K5$}rk#QWj{@uB!gd@Mc@pNh}K=i&?T zrT9urd#}Ye;#={Z_+I=VeiSp_C-JlRMf@s$6Tgc;#Gm3X@wfO#{44$wJEUdOa;a15 zlDef8QjgRt^+_wGerZ5jC1t(U(x5aX<-9f0T4|lMUfLiHOBTmrh6v z(xR02d=emm5+uPAA{D%%hf0`K@^FceNU7{mlIGD8Be4=E>7L=49xn-!C`pnmDUvGr zrGONaEH5O5rHEvEQ7IW+UBwaEjQ?evm^1O=Y zNUl`%JgFj8rJ7fh>QX~$N-e1^ElG8+;hmJ4-YKc&otDl>XQgw}dFg`G_LjVh(k1Dn zcgj2MU6#&xXT5XY73r$8- zUwd70x4c4rj>L_kMUkyPX=UAhU8o&Unx|Il~Sc#fn`KSWv!xDjEY&oWLzd>t3t|@Ov`qK zky)9Od0CJ}S(2TKTajh2QmH7iD*NSt9F#+HSguxTm53ab>y?-smlJZM(yX*9Nx5A~ z$!U41ay?x8Dfvd_w0uTBE1#3k%NOK}@+JAQd_}%0 z->m#6Uz2ZDuFJP8H{_f0E%~;5N4_iHsobsHlkdy-Di7p`@+0|v<+1!kekwncpUW@g zm-2(k!^$i9QRTJ#xbjARE5DQ9%OB*A@{`Kb$|w1={H*dt{wjZypI5%iKjfeCFZs9p zNB%3nsJyKFlV4Rjl-HGI%5tSs=~B9t70R2++e(kptGui9DJzwJ<$dKts{tD8tG|WkmT_`Cb`S#*`nGP0D6vi}JIwRoSMDE8CR` zWrwm;`BnK{*`-V>e=2_~yOll4US*%MUzt+=Rs7Wh%Cr)w9#jq~hm~OUh;mdprpzd_ z%A7K}6j@OeRq-nUC0or^gGxxrSHns~i7JI^Oo=NAC8?y8w31PZ)lxO9l&d*K ztL7EGT2P8gNhvEv)vRiYu2@w=F%?U(tG41OuHq>b#i>>mx9U}EN~Ky?s?}PxUTsvH z)mF7#U8**erqWVQR@=&wa#A@}J*Avh&M0Sh0)i2dSbx2*Ku2t8m>(veF*XppkQ5{i7)o;}? zb(6YT-J)()x2fN&TY$9x>wz&?pLSO1M0MTP(7p`R*$Gh z)nn?6I;+m9^Xjka@9J^&g!-qtpf0LD^=}nW|5ZU1QehQQQPp1y)G#$z!_`nNTq9Ic zrBqsF)JQE_V^vO#)p%7PhvKdRjfBo>kAO=hX}9MfH+;S-qlORsU13sn^vT>P_{QdRx_MdhL#SS2b$) z)cfiK)vP^Kt=c2?vHC=PsyhEBrnF zUVoo|rN7@l;9uom?H}|H`PcZ@`q%l_`#1Pc)lS!j{Tuxw{!#y!f0O@AZL@!if2;p& zZJU4GzukYXHsRml-|64wpY-qc@A03nU8wE#U##u(U#ji*Px%k{r~L>0hy0goS89j- zNBmc7NBzhAGyYlsoPXYb+<(Hq;9vCn{D2?yLw?wg`2VY+e$0>i2|wwl{MTyNYqX#7 z->9*E&d>XA)^62q*95=lm;AC{@!zT4t*QQdwT{63+Ooj%Kxd#U&>dJ2cu?yJ^alC@ zD+B$3fxxQ3>cC)ND6l55Hn1+RKCmG$9M~8b35*6F*2V&x0-FO{0$T&y0^@;4we5k4 zz>dJqz^=e#V0U0oU~gbwV1HmLa3C-pI2bq-I2m0NJgdP0B!C9603IL$WZ-%2MU4u)tkD4`zy`Pg9}og!KnlF7$pIyx z242@Xg3E%-gKuh`!LDF;a7C~u*cv-Yb-2Y=U?ARFX@d{7Afsr{{q!GAR==&uLra!?5d>!G?D4A&#| zj?l7Dw7xtPt9ORt^{!BNC{bS#>IwCR`a;Qis=hLmu4n4mdVgpjv?{bZG#DBRCnN@q0r&bkHgodyX9wI_yhzijmCd7ug5FZjkVn_O7s%fp@FuCP;g>)qiM zVXxj3?hW^aEA^G({_sF}Rd{uHFgz5l)@$`O;d;GMZ`Rj_*M--IH-v}78^f*oNO&|n z7Ty%z9NrS%8r~Kj4{r}ogm;8@hIfT0!@I+K!h6H}!u!MR`c(KpcshJAd?5Ht4^hX9Ft0Jo-gOQ=gn#kJ7y2z>e>H7M} zhRB)vaAad-ByzSs8X1dhifoQ-iENE*i=3;Uua8GA)VD`2)+ZvD>N_GkBfBD#k<0Zf z_1%#@k-d?9k^PaW$kqCR$aLgjtT{8yik9FLrcEJPL~z6cPx zRtF1u9(dbxoQ*?85 zOLS{=TXa0SJvtHH5#1Tx6`hRkj_!%>jqZ!?k4{AoM5m(%qlcn*>xZL9qDQ00qBGIi z=)L;=`doBA`k;P1dLp_IeOOO_=`Qc*g}MA_)m zIv3@mLR5@OQ8}ta)o4d-S!{W%Gu9RBj;)CG#Cl_Wv6ZoB_2>2e*g$MmY;|lfHWXVE zTN_&!TOZpH8;)&^jl@P{W3f%K&9N=9t+8#f@!0m*L~KWFXKYt&GPXOmC$=}XFSb86 z6?;)X5Sxx2j2(&{jva{|jU9{4#Aai2vH95X*ooLeY%%7G0WmNJ#o!ncLt|JBj}b94 z_OedJ=ok}YV_b}n2{ADy#pIY0Q)3$6qn;)>R;kQh#EOhg+aiP6MZVpC#sVoPFcBG!mEwj~mcWFyrWPi#+2Bz7cr zCUzy#jmgCB#GXW^u{V)z>`UYt`x8@%1BvOx!Nj4&;Y7Z1ByluxEHRTPG-eZXiTT9w z#EHa0Vlm-M00}SwCEx^-KoeL3PY?+*K_%z}lVB5Ef=>tuF(D=7gpyDb9m!?M<;l)u zu~BMtCA*X5#)@Q5vNx$U`jRV?{mFsks^seAU{Y@wjiIF3uo`w_O>%8=U2=VLLvlFj zG~C9<07l8ec9! zY4oL5rp`9{Qv<10sdJ6hsln7xYE5cwYF%o5>U`ruV?*jorGu`xB08cmI*Hl;SF zE;qKMwx+hFt~AC|+fx&%tBoD0ovB@^$<*%Dp48sdzSREIRO&!#I`v=UVCqonaOz0v zXzEyMCN-OyOU?Pc#24oDJn&$m=v4hQhZ8Ci76>{ zts$qBl$yHU=twV1FHhfSbf&w~-RTwSo^)@zFMYFdtFbbDyV0M%(-=svO0P~2riapN z(svtc)9cdf(;L#m>5b`;^k{l4y(zspy(PUhy)8YSzSr2Eo=ERV?@aGXPo{UL_oVlx z_oerz?>8ParqTz}4;$0zgXu%*M~%bjBk7~*W9ganY<7pyIrl~ZYX3}h$OY>m>J5f$*j$+%dF3A$P8yTW=1ljnX$~K%;wCN z%+}1d%jF^!!zZ!Bz$*7r*?6U0gY-jd&<4>b2`?t}Z{nuEL?aB6L z`?4#u{n>%+s_g3QV0I|GCc8GfF1tRvAv>Jim>tQEX2-IdvYWG8vRkv;vg6t9*@^6q z?9S}2>|}O#*53>?_hk2GgUx-}{n=16+>A7*vInx$*@M|b*~8grGuAwkjW>^G6U}4U zne1$KE<2w+o=rAW%@f&$Y`VFa^<{x^8jHQSL}mRp|d%ys3ub9&QguE?29t7$iTa=p2}+{#>k zZXoA0-R7#?>fB&%D7PlJHn%RfKDQw^oZFZi$&Kd5a+`9Sb6av-bK7!Wb3C^_H<8crgH~#hjNE=M{-AV$8s~d+1y-iK6m{86mucBnDga; z9GHW0aIVsk8=RsLdgb$&2ElwXry zn_ri|)Lft6kRQ%pZf?wv0&HSagY{DY>Hf7q1sN?y%( z6qXg17albqH#-Ymg(uDK!iqvq;c2tC&{tSl=r0TuRuxtko;3#xLxnYkwT0)+b%phX z4Ta&t#==P9MRT+;R@hY7T-Z|BTG&10WKf~w15@x0#P6f zRDmuq1-8Hy-Zc4wP!J1JK`tl-wa`&qR$N}}EOr&Uiz|vf#ol6Hab>Z;I8aZmSi-(Gbi${t_i^qyH#o6LqalUxG z_@jBExKLay`iejiEdFdlMYxC*(IQsFi$swuQboGR6xkwIsl>Rn*OMRu4rGL%-(m-idX?1C^G*nts^0xx5wWVNdT`AOB zU)oR_E^RE0ltxS8)>vs%X>%#k+EUtD+E$9T#!K5v6Qv!couyr+$x^JfyR@gYx3sUc zzcf`kP?|0sEFCHxF2!4k){)ZDQnGcdG*g-_rCM{P`O@*yiPA!8vE(bITbUM60!vUS z+k#6-2`ynIyhN195>=v0Oo=UVCB7t-#FA8!OG-&Cb(EKtmzO)sUFGibigHi6x7=4= zS?(_nlvkBkmvgOrYp^_2F0|H^*Ou3ni>>wL4dvnT#_~vcv^-WWwaTqcWv#Wjthct5 zx0bh+$IIKx6J?`iwsw?vmaW#V@??2;*={+lJ>|XSedYb-sq%rc+wxk|kCcy=kCp4KMr)=#TW+@I%Jb#pm_LYG$Scb~&)=~>DpKP6Koo*pz zw2YPUGEpYWXIfO5E;D7e%$51FP!`KlSuQJOwcMdC)0S(UT9?+Xtznu1#n=w4K^6ZBpB< z?a}sX=UV4m`?USqh1QgIK%3Sswhn5ST8Fg5+7a!jc1*k6y3(4_uD1SbU2Dy1bK1Oi zTsxsHXxCdeT8o-byV(LXP=mBvEm%V|RKqk}BQ#RG-MZ7Fw7V@@yVqhgR^v2Y6Esn~ z-;y+0Q?v&yRqN1~>C5#_y-V-bSLi)@uimGx)cf@TeU<*OwOSw4hx9f2T78|qUVqfu zpbzUC^~bFdeN-RQH|d-8E&5h{n?9~@*C+HH`c8e9KB@24_vm}|efoZVNrYxw zTL<++`m@$y{fK^4f8IK#&*-!IoIbA~*H7p#S}$7*`m5HW{<`JU0UgvK{Y?wj-?k7P z)iM2D3)cyq)G3|T8J*QRo!13j)FoZk628|(Ojj`5PXRJ3i7{kU!W5gIW#*9tIW@C%7)!1f?8{3Tu<3nqQvD4UPd~8h` zyNx}@USprJ-V!4M6}kPXF9jSh2}`L*?}wcPA9zqh)~ZgYkCqt#>f zntkR#rSD8Oszgnx!->pIOPix3rW3DyVnd{9B=HJ$^xzQXkN6j&FleyX4Vs16J znd9bmbHdzV?lgCqljd%7kNK~)*W73BH>b=4=Cpax^tTV0hs`7AQS+ENW6qj$=Dc~_ zJYg=Fi>A*6Owfc(*hEa!#7x{IOwy!G+GNZ?JJ@DT&J4AAQ!qs{+?Gt)R7}bK(U0c(}D+Dfzsts!fTm29uI)>-SV4c4%=(HgN* z?NMvY+GK6E((NtQR%@FzZf&93$d)W-9|0U z!Y#rgEy|)T#$qkba@ua2w*<>;i;^f@b?erLd0<*arFogrt9 zbGv<~z1CUh+-ojuN8=Xradv)`F=4mi`!LFbV3qW!Xc*m>1H;=FDjb&feR&a5-% z%sX$|$DI?-g7db$==dDKdDjLV$blWiK^@G&o%ihzZNed)kL^!w%Ap;`VI9ulozHE- z5go~q9mP?d4);rYnY-NWbi3SccZJ*I_PSr&eeSpRO1Iw~a96pj-9dNAUE_Xl|7fpu z*SSC2>)j3Ru=}gM(H(I|-7$BQyV>31{%-$iZ*~8+x4Hk?cgCG{=iGVsxEokH;V!s~uFnNr(1l#sMO@Uy zT-+sG(xqJ5Wn9+fT;3I2(Un};Rb18W@RoVYy-u&o>-JW7Jzj9B*X#3EdZDF$Z@^pS zt@Z}JA#aVh)?4ST_cnOL-bQc48}-J#P2Og2i?`L==8b#Xz3|e6x5L}%MV5AXliqGG zy0pjJ>+SRQdsE&4Z`wQP#g-0v@ukDw5$~vX%$xCMy*Y2*ODrXqj(aD()Y5{t=%tr3 zOFl3Ae})ZukOzB+ms`p&p~QZ=#UMDyAB&VoWaI6HrNJpVL))=?w7kji@UZ3in}JynH1J;-~0GJ_n*J# z`0YAgZD@N2`bp@qmiPO0{ucc``bYH7==SJe(H+t5Xb-d}+6(QC_Cfoi@1p(C{^$VI z!wy6Tp@Y%)&>`qhbQn4ueINY*9f6KSKSW2NqtQv|WONET6`h7oM`xfj(OKwh^doc* zIv1UX&PNxZAEOJ=MW~luj4nZ!qCR#R`U$!m^|LF`Pto=02J|!Zb95sbV81}WM1$;C z=qB`Q^c!?Dx&{3f{SFPW-=ka6ZD^SN0sRsE35~EnqrafPqQ9ZPqko`(qEU7``WK3_ zJ5Y@6j`hHLV!g25SRV{$`(p26{V;;EVkA2V8;re&4Z((D!?58P#nSBi7{h*m zjlf1?A7Z1h(byzxGByR9icQ0&V>7Us*eq-|_7OG*n~TlE=3@)6kFkZ=B5X0X1Y3$N z!#=^5V=J&vvGv#n>@$pIIrejGBgV5|U|(WiVFJ4e`x^TO+l+0&zQw-7L{?(I$7FUZ zrm)+vAFv;>pRk{?U$DdM5%yQ?H!O?&9s2|O6U%0|V}D^gu?nLRJ_((J?nDnFhwVx9B6<_KY#$k;I3@U3L^PnwUgPCZ-TmiD|?= z_C7nEc)-pe9WJj4wo2a$tGGxr`jgtTy0ZYVj7v~k19_sI`PJ2!$HNq$IzA&Kz>XvBo~p3$tC1cavAvv zxtv@AipHPBK=%|+eCg%2Dxv@&Eys`#C=PCM}ALkCAX13 zkUx??kzwvCk{e9DM-8EdQp2d>)ce#26vffp2x=t7a34~msL>S5O`;}KQ>dvF$4#TA zQ#?0=nn?-VEK1~NQy)=tsJYZUYCa`#3#gB&g_O)Kq83w2D1}=}Eu%i6mQyRJPpS3P zVQvHU8TC1}kvhVCL48SmMQx(KroN%FxNL4SwS_v$eM@~ueNP?Zwo==uAE+OxpQxXy zU#MTH->BcIKd3*cElG(Cx)Okd`v&{OGY^mKX# zJ(HeAU*TrcAJJF2IrKGdE2356^pEr-?lJch{WJXw{e=6K{*C^f{)7IL-cCQ|o^gNCJLu`}qJLVDT6FkXNJk2va%X2)> z3%tlnyv!^7Vg3l8#b@(J`D6TX{se!LKgFNs&+upYbNqS!0)LUe#9!vG@K^b3d=8(> z=keG18~jZ^pTEW5=I`)#`Fs3*{sI4xf5boLpYTulXZ&;i1^<$N#lPlb{La{}m?^e9 zwkNhXwlB6nb|7{zb|_|!Sz^|hEoP57V$PT==8kz{-k2}uj|F1ESSS{bMPkty8pC3E zjEIpjDn`ec7#rhad`yUmF)1d;l-S|ekyutNJ9ad7EOtD0B6c!%Dt0<{CU!P}FVvl1_Vozhw zV$WkQVlQK_Vy|Pd*xSe9hq^$utZP|0S-Dx)vuG}Hf8V2-k*IS z`(XB=Y)iH?JDN>oli5@@lg(yx*?hK;EoRHvO7`LGBiUKm+1W?4k7XavK9PMg`*il1 z>?ycOrx%YD)cO>s<-o?CYdAWH{^YX4=zkcuf{p(M!KfnI+dhGhX8|E9* zji)#8n>jZh-F$lU)y>$=-TC|S59A-r59WvRBl&nfk6Da%cd))tEOwF98<0-&ve~%!*tV>Z@Oi=ZMtK+Yr1E;Z+c*QXnJINYEhxkDpg8xl`5_0`~}Mw&YCfEaayCEjnfPWVr-VyZ{Ff*3+GK*JZt{ENpsSA zELk*b-n2!F(gsbMGBa@tW)?1(zcBg!v`O=(rp;eGbK1g1Ez-KrnUgjwabJtlhD}>E zZQ;^sQ(L4Ze^b>|cr|PC+~#^?8{>o_dVP=P`u6SH6}<1ic{#iod{l}$W#=V$rBbWb z{)ZurI`O`O|I*%3sTz^6{S!9&z?)TA!6Us6Zm)xnS(gfE0Jz(Aa185805Gx+&T3sL zpfpehC<~MW$^#XEia;fxG63hft}0Lss1DQsY65kD+5r3+*VP5;0ri12ARWj68UR{A z2V?>bfkr@Mpb5|vXa+O~S^zBp1keKpzzDPgS_5r>wg4RGy7oW^pd-);=nQlLx&qyR z?m!QqC(sM%4fFx}0`CI-fd0S$U?4CE7!14z3;~7$!+_zy`@jdl2w)`eAutLU4U7TC z0^@-3zyx3-FbS9pOab6Iv2GeL9hd>k1ZDxVfscSWz+7M+FdtX|d<-lE76FTaCBRZ( z8Sn|P99RLY1Xcm7fi(d9O;{I?FIcC7r$ZE2rB59$+o5 zQqL)&Qa5==rM?dAEvZsZEu~Utlvb%P0o%){)MLx4)V0c~)Te--%B$4xS5T=dRaB{u z09z`l)B`K4)TOGZ)Euy}s!H9fno6BgU8Tl=H8oV~PBm5P7l6N(O1-qUO5LiCO8o$^ z*Hx+K)l;dP)mN!+0{hcc>gnk!wKhYgz5?uMpi+<5s?>FKD)kxQmrRvf_g1MXV0|Bzx?5kBItGN_RjF6>Q>okaSE-)> z?g1+G!htF^GDxMq1DFS^)U)4HsT&PZsdItdLsja@!&K_D;VSh7;E(rJ>d_yl)HOz^ z)F*%+Myk}qK2)hIj8dr;;G5AZb^kFc^*du#Y6eI=_WyrJrRoM>|GL4~zi#mLuiH8e zPz)#zlmOlVN&=;T(m)xYEKm+84^#ju0+oQuKoy`WPz|UK)BtJ%wSd|{9iT2y52z2M z0qH;n&;ZZ^Iv^8h2s8p315JRYKr^5@&;n=)Ab=h)07jq{&>Cn1v<2D$?ST$JN1zkX z8R!Be9{aBFx*O0P=mGQudI7zGK0sgKU7#P(9~b}(1O@?vf%kwRz))ZqFdTRv_y8CI zj08ReMggONF~C@0955c3089iX0h56#z*JxwFddiy%miiuvw@F*Ilx?C9xxwR0DKHA z1Qr2{fhE9FU>WcUupC$ctOQm8tARDZT3{XUDX<>c0DJ~~4r~Oz0KNpi0yY6(1K$9f zfi1wdz<0p+z*b-z@B{E8@DuPe@C)!O@EhE;Y`1GCPYX>Mq4WNvJ3Vs2_~VK$hJ=2qrdyzpvmZewn1?qKd{ z?riR2?rJVb&J@kf^fwQLv`k@E=7S>hBg`X{NtrR`apv*n3Fe7!GBX8n= zDYL}96cREk&8y6-&1=kSAt#f_#}wpZ3Q{ru%*1Rr?=qXryUlydd(HdIhs+kU)$A}k z%`UUs>@j=IK6B6|T3Qf`-eRyAVXE+IV`*z?Z|Pv^Xz6U}V(Dt>W+_Pg^ns*Lf6D;NKubZs zCz0+M{wCQ|IGsrNjIoThjI)flOt4IZtk2t|&)b|&BIA=t_$;#&Bzo3Z)+G}?pIbIs zzDTBc3KBg3Ilq(0?(DGawCu8&EPE__E&D9{Ee9+IEr%>-i^XEK*erI7!{W5KEN+X( z;oVJ{? zoVA>{T(DfUT((@XT(#s_axHn5>y{gqo0fdbEz51o9m`$IJR*)mV#Ji(5-rOIgcU%UR1?D_AR9D_JXBt6HmBt6OVWYg%hrYg_AB z3(qbVuWPMmt#3`Urdu~dYev4WRu<|lZxh&5}BleL{dQ>X{U9U)nwgm-DBNr-Dllz zJzza(J!CaoEmo`5X0=-#R;Sfvbz41FuhnPuTLadhHDpDtxRtPyR@%x~Su1Ddt%6mw zD%Nc4QR^}5aq9`|N$VNwS?hW01?xrYCF^DD73)1Y-nHJd z-nTxmKD0izKCwQvKDWNGzO=r!#;kFx%BHrZ*ivm8TQOVFvoCHdX)9$bZ7X9dXDe^3 zXscwaY^!3cYO7|eZmVIdX{%+cZL4FeYpZ9gZ%ebK+cInoip*rrA==$+FIM%*xK6K+1lGW*gD#}*t$VRtGBI>t?xf_S^p`OHO4mHHo-RWO*-p; zCbJT$tVAZOXc}vUZKZ9MZMAKUZLO^!jrBQXvA(bsWU$^Qu(sN^*?uUJx%%B!khR)j z+iBZnGud|A_Sp8?_SyE^4%iOb4%y5$i_L1Y+3Yrl&1rMl+%}KRYxCKHwva7ii^3_O zP%j~Dq>ZxCHpV8{B->%z5nGlm+ji7;+;+lt(ss&r+IGfv)^^@@!FJJh$#%KO*~Q{l zY*%g9Y&o`ETb}KvE#G#_cH4HxcGvd6_R#j&_Qdwo_T2Wu_R{vs_SzP+#ce6}RD0oL zSIl1AUc&y4y`;UAy|lfoy_~(gy`sI6y|TTky_&tcy@tJ}y_UVUy`H_kJ;v(ff3_ObTy_6hch|45wuw|TRb_BHmkZ&GLf%$#k3 zq}f(`VZ!Y9WS-1q-wmg*C%HlFpxq8z!n}5$J&@c17O_X|s2#K8cEV1=PANA1V$C+sKfr<1$23ifGTggshUU~|?r*qW7Rziz)_ziH36-?HC^?N@j0 z_lnHlw?D8yv_DGjy?SbY20O1_z^1EL_Sg29J#JSy)Q%KKszc)_<|ytc;V9)O>nP_a z@2Kdg;;8DV=BVzd<*4VV??`i`J2D)Zj)soLjwX(#j^>UQj+PF@p?4S@Mn@Y*2S-Oo zCr4*T7e`mf&h>=cTp~61HZwQKG1&25GAEZv$R*NoV;tig;~f(m|IEnEbQDd-{m)$7 z3dc&vYR4MKTFAz2_&XW52{LhsL|h^bSCD}#NWlH+h{X$%Z#x~k945zZ#~#OC$3Dja z$3e#-huL9qSRFQp-QjRJ9WIC4;c<8!K8GKs3a@}8=m~ zJ8nDfz+R{O4*1cW;}L9ddXn7V^uqDV5p%>HDyQ0+;!JfGcb0ILbe3|Kb(V9McUEv# zbXIa!c2;xNaMp6xcGhv$b=Gs%ccwctoDG~>r_Pz_Z0Ky{Z0u~}Z0c<0Z0>B~Z0SUt zdZ)o@bhdW3akh1~bGCPOaCUTdc6M=gb#`+WWCIhqz=Bj@zkg%`hrCGyzRd%Ua*lS6 zagKA2cTV_MCa^FM7>gGs0++tY0AY}=YH50b;xOfolrK|2jzqvP#&k(>2ns&`<(%2&>4dLO%Z3*nb^LB zI|(Q0q@1*qak5UqDLQ4R;ymokavpUaa~^k|aKc6-=Q(F$?Tk57T&b>NuHvo|u9B`&uF|eDuClIjuJW!*u4=C8t{SeIu3E0zuDY&z zuKKPtSGp_1)xf27>0FtvhOS1g#;zu=rmkkL=B^g5mM+AlcNttpS1VU*R~uJbS36gG zR|i)|S0`6zR~J`TS2x#xmwFrtImgkiajuDPl8&+Xbk|JCHYSpd^IZ!e&sdOUOe7gs zx>mVXyVkhYLZWe_>x;jWjGJABXBUfafkfl?uC0(~{Lg8|U9c@^w`-3pu@&fm>!9n9 z%Ti?C>MGa*l}7v!7iPnt`o31 z=L~GefgkF_E}Sc_tF9bZE^NEG;kxO{hix^tU3Xk}UH1}uX+^KGjyO_JUyM+54cS(0CcWHMScUgBicX@Y3cO`dacNKS4cQto) zcTIOKcWrlFcRhD~ce*>n-N3DN>)e^{hVCZrX71+h7VegA#I1K5+(vh6cN=$GcRP1` zcL#SzcPDpecNce8cQ^OjY-cQ7CrkJf9E;py664JEa!5_ajtZ)a<6u;aj$hJ@|=b98{BVmorzRuL89}2&vR~1 zra5=IcfqEdJ?_2keeMIW`{odAys;*B+_)WXr`zRryS;9|I|y52!tMy{hCyKu4B;kW z_X`6XUwGK{BDy8F>{i@|-C6Ez_fhvT_X+n&_bK=3{59EdsH5|A1Ak&JclhNFJXttYuH^9cdI;VPl_kiqwy5;6!(Y zDd#Egso<&TspP5bsphHfsp+ZZsq2Zw>v`&X(md&&3{L}3rl+Z=nWwp@g{P&*;4yky zd)j!~dfIzBcshDIc{+Q#c)CJ@wGT`cUVY!>SO-Ibb*N_;Bv*^3R>ye8dnS9Pc#7s# zXBV0O$WxG6Et*$d;wen2uJo+(toE$&to5ve#A+g~T98%!XHs>Gr)WO)Kc`c7c}$)? zu*qeg=YYrTv3RT=o5$(#dVC(gC*TQsq8`+Pdk7Edp*@U;^>7~EBfusS#gh&DL5_Kj zdro*xdQN-Jc+PsxdCq$-crJP_c`kddc&>V`d2&3to;=TW*r9RLlkd6hx#PL(xd;0$ z9(W$Yo{Pt@+2ZM&y%sNFo5gES%oB%GPIUqNEG zAg{aSA8Fkmy+3&iQ@YzBpSu(Gewe&_ynDU-VAIC|??JC6xy!@ub$VT1H*C=G!sZNr za&JZ`xh*5=MZK68_Y!aliLDs4m+`V*&dYlRujrM$vRCmQ_8#$Od9%Goy~n*LyeGY< zyr;cqyl1`VyyuIYT`YdVdlB{&T=rgp{RG!wBSEe=&wJf_!+R694BYbG_TKT{_1^bB z@ILfD_CE1G^*;B$C^G-j`^x*;8}r7!DZW&n##h`|!uO7^q_32(w6Bb>tgoD}ysv_< zqOX##vagD-s;`=_y03<>rmvQ-wy%z_uCJc2zAw#}?#u8s@M(QIU#732uZgdzueq;< zPwzAMjJ{UB*1k5rw!RL&PQK2*F21h5ZoclxG;{A{mbqUt$(+bB7p9m;B=gIoAiX@s zH`X`KH{LhlO^$h5GQ~XW9~tI_kX~L2x#fb?@=D(t-&)_N$>j3q$=vdnzOQ_nAg{c| zSCCHr4N}Q}LMAyD|I4=%b|9F1yM23L*TFvDL7&xU^Vxk4pVQ~^d3`=#z!&s|d|_Y2 z7xke&%!k8N;YIjJALXNA9{}eQe4a{zrUSzHG4eAM+jeo$#IXo${Ubo$;OZ zo%5Y9GJnB$(Rayr*>}Zv)pyO8RU(R3NU(sL5U)f*9U)5jDU)^8JU&mk1U*DhRPxoi| z8~8K*4gHP%P5e#$&HXL>E&YgJ?>G33{x<#&{*L}m{?7g`{;vLlboSe9_P>+a!~T`Z z9^)VHpYSG|U6{;H0j+%<6rAv=l|4SkjRe33o_Y-iR}L-k6n23 zvG@-EPX8{y30(Ml{CoZT{0IC8!FF#3)4dgZ^$x!itn?ng7aa6~zuohN^9lDn;itef z&-yt(4@P-0X_G(f&+=#ckNP35;6Ld<1qSys{)D~#g8!2L3V7KItn7LIoBn*Ttl#n9 z1xNY=Fr+{7KlZ~v&HG>YU-@JHxL*}e2T}s5fntH;ff9jt0wn{b0;L0G0%Zf`0_6i0 z0u=+50+j<*0#yUm0@VXG1GNIR19bv*1N8#+1L=W`K!bobpbKOM8U`8#8V8yLng*H$ zng?10S_Y7SK41tK1FZtB18o9r1MLFs104b#16=}L1BtYH&p<&+{cT1)kx(B}B$Ylg z5Q~ovj0ubjj1NrsS2BGzWYQCf^tXBRrGaJ19Qw+@YM3g#)&$lD*1bumZ-iWWB9s0< z^XQ2zdO;FBkwY(>P9)NI26hEZf!%>UfxUr!f&GC4frEiV0c*e(a0HwISHKhS27Cd3 zAP@)!LV;)i3lIS^Kn3Uk6JP^EKm_;q(ZI2!+xsN=yw4>q-d6&-fjqEu-wfn~i@U(Y zeLwI3{M%0gF9WZ@dmRhJ11Z7Ope9%>SUgxFSTa~DSUOlHST=^7E>=Nu6><;PsUdiNrEZ!GV_X8nqUy!vQ0U7&I!O_7n z!EwRy!3n{MZ<6-YgR>!7pUBnE3(gM~o?R@SNY*b&Ch8M;`jx>|!PUVv!L`A4$!z^b z$kTt7Ow(^pX6XxZ^o8^POw=dR^aWY^M3O#X12+YC2loW`2KNOI1})(AwgnwYZ?`At z4f?>k9R{~H8pMKlkO-1NI>>Epo@!INN^J{vq2 zJRiIeOn9F!2d@OL2CoHkg1N!G;Pv2*;7zbI-wNIi-T@2qz2JRtCqE263O)`#2|f)z z3qB9N2)+!y4#tAmsvfEt zsuijosvD{osvk-ZWrP}pv>{z6Gt@8?i#G~22{j8f548xj3?U(X$PhAy+J@SPI)u80 zx`hgw1bss9zG)5&hOWRcm@2%6ziAANf|kIT(Adzp(D=}V(8SQ>&{XIN6tn~iIs$W( z4S@xrkBiI~HU!?b16GDsg;s~wgw}@E{i`WZ&=c64YzcfH`rkVOJ43rdrci+w`T)3~ z4}~mXd@k@kJHhen0q?Ru6bJ=Fp-?y!2}MIFn2`yvAJbqyWWi4}=ef4~5NPOVTsz412*R z>rdKbL*Zx`1xqXej#wJ3uxywM^I(4!!TqX)vy8$J&{){Egw;mhGG z;j7_m;hbI#MQ5Hc~E9K2kAKDN;F7HBv27JyIi5Gg2#3J5nc7H&S?Z@c;Lb`jNCq zdL$##Afk(8MjA#MMH)w%M4CpLM_NQ$Mv#a;Vu%Z6a+W?IP`q%y)=%jC6{0 zj&zB1jdYI`?R@l)40zM@7z#a)M8~6`;W0WgCNefME;2qcAu{nz&tqC-dSu4m-Hy5c zOS5BTWL0E!WKCpkvf+{FcNDfdwnlz<)8_d7?;gj_$S&}@?uqOLKkNR;fylwgp@riV-OyM-*_A zCd{O zqexUAHAIckR?*hcHqo}xcG33H4$+R$PSMWMF43;hZqe?^)=M8~y!1=9T?Q5Dxr~5@ z%h>3+==kV_WXEM%vf(ldx-D~(&6fGlX;~Uw7X2jIWLXnk`=-tEd2}Q6SQ0IkP0_ER zyRx-NTjifUm7URDQB!nxbPqT(_eBqY3G-0Y9JNHPQCrj=bwr)uh;&CiQE$`-r{D)8 zWH1_vhNF>aG>S&CC>|xi+DJv|CPj%G)X7CF0E{CM<4^mO!0 z^lbE8^nCO}^kVdK^hz{0nistuy#fBj{OIlI9k3zZ0~6wdHy*^ovw!jr58~@+EE z>d;KIA=(ISj5a}=qRr6eXbZF@ilBPbfEv+OXlt|$+7@kxwnsal9nnr`XS562HQDOv zo$T}!GGKRrc6mnp-Q*dAjz!0zL#sv*&wsE4mF$bb9{T=qWrq`1wEj7rF!83C>6px*OdCZpeM; ze)K@n1!+bts1*#5j=#N+-lXxda6W(r(GVI2!($Zuju;pn2{hqxWKcHgZxm1wY>kJ} zEO0U&1s~%Ha4?=iPornhvk9vrdI`OPUPZ5gDKQt#L$8Ao@g|y&-U0*S9kjrE_yBB& zkI={H6R;aTL!YBBz+(6c42Cf@j;b& zRm3V`m9Z*VRje9T9jk%W#A;!+u{u~?tR7Y$OT*H!46FgB#dKIE)(~riHO87?O|fQJ zbF2l{5<@UOX26VCE37rv25XD8!`fpVu#Q+~tP9o^i^aQPMf*?%ZK#4S)Y~Rhq6hUp zR?vV-^qSeMnnZW z3>L)fr2VkKeRwA6IJ|^i2Cv~&EEmheZeTaDeC&48RCo{Ugb%QX*c0p-mM{mt!d_!B zERL!16g(9#h8M?6;3e@=cxk*0UKTHhm&YsOmGH`V6}%c=9j}4c#B1TT@pL=`*Wr!u z#&{FFDc%B)#SOR-Z-uwU+u|MYj(BIh3*Hs)jwkwDz3|?6qQ})AFX(L*w6+qBt-`a5 z#S@LKG59!qJU#)R_@=ux{U3d;g0@ycS1ZxeT3KX%6}}o@gRjNc{oURw+THs0O=s&z zys)pe9hzFZa1*{8Pk0a$u0soM#cg=PUYIZ!dhmpI(2oc3ARYq4V1Zi@Pg(_OoWWT< z;r|nH8Bciqj^J5%HhBDw<0tR}58pYk?_Izz;+OF&_*Fay&&Bg_h|lBs_$~Z4eg_n4N z6SauiL|vjDkxpa~4TxA=OX!G9q9M_QXhyUk5W+~bCfX2fiFQPLq65*9=tOiTx)5E7 zZbWzJr4_W&ik^KRqVJn-+CX9uk?5oigFe~^#0co2je-u^7-B3jju=l&_`8iZ9e&rh z*9_uq8!gd7`xqK%i;A?*RuC(RHN?6iy|XWfP07C5=49LK`!`*)f~MK8&@=l3I%bJ} z*-o(KnTWl_KH>mzkT{g|;Mu`_=OkQ&7u_T=WyO9O`x?ag{U7}gnpBz9AghpNA^k6d4tQ!igy5Y%A-H5*%bz{h}q$fhxC#O%T^%i*h+Y{q9h9T zEP^CSilj+~WJ!+X$%M&DB4sjRtU5wwk=f)?@)&uXJVBlWH&iTsmOM{hATN^%b5jnP zOXiU`$$at_c?S$h_sIL?1M(sHgnUXqCtr{+!D959gfdf+vyYQ1N=>Cusg#B)Mir+@ zP$j8SRB5UVRhBA8m8U9Fm8i;86{;##jjB%7plVXJsKWW$R2`}=RgbDqrBUfr2GxMl zQJGXjsu9(gYC<)ono}*PmXw|{P)4dX)rM+IwWHco9jJ~}7pg1Ojp|Mn^a~5xg>Sos zgQ&s(>J^TlMp6Zh!ZFlXY8*A5nm|pYCMCOt)2SKMENV8i3FjuegbR{Q!bMa;gK!14 zl3GQrrq)nvlTE_6J;I_b!p+biEa(qzh4$b-yMupH+mpS)onUM-QM;3-rhQ;%Ism6| zkU9iDCJSYyY~WpTP)^DPo+S_ErF>K%=~9YNQ3?g85l#`{GD_Hs3ePSUXObSHgu6(j zBuWNH(P8Qcl|^M!N2z0A9y*cq4xOgXfHmkGb)LEacA&!fOVnlR3V4C8Q8`pDl}BBt zZc_QwEh^#CxeLCWhty;03H6kEPQ3(c&1)(~rO>IghAu`Ir%TZ9&?V_obZNRQU5+kK zSEMV^mFcQ3Vd1I*m@JGw24ime$dkbVIrc-IQ)lx1d|ndfGr6 z=~i@Wx((fy?m%~#K(#o|6XNEi5M2yoDdv`inS zv%%tW91Jce>C^NX`YgCv&eIp@i}V%x8l6k$6`8*dK9rkuK7E(IPd}g^(vRt9^mA~5 zyrff@R7S&;WJ)omnX*hdraV)Tsl-%fsxVcVYD{&e7E_n0$JA%im~5;rVZ1M>A-YiIx}6EuF39Z?__T?(b^oq3}gl++nU3e5zI*DLuM2+ni<24 zXC^R{n90l(W-2p{na<2$W-_yw*~~}GTxK4#fLX{aViq$?n5E1zW(Bj7SzNJAXUyl!M&=7<6Y~wTh545Gj`^P1%4}nPVt!_RWqxCRXZ~ciGk-BVn4Qcn#>DJp zV)6aVLFN!+W-N>qJRnZS1-1__;{$g`7(5+O24x6_0`CUPa174~;Mh=Ls_;4tc8zT2 zD07@S!JK4HF{ha`%vt6Fb1~_uxCU;DTqcjX$>cM)nLEr~=04aY3a1}3kC?~I6Xq%N zf=T!vVoaP-v1&GjO=XL-CD@W|DYi6QmMzDYXDhH3*-C6>wi;W5t;N=6>#%j%dTf0* zgKfa-*i5z|+n8;_Hf5W!&Dj=gOV+@)V%xCo*!FA(wjz~ta$U95-ovOX5RuVn*lkPWd>mS9Pi0-piHvaG<0tjr!}v)F9*D0>X-0Vmj# z;0idyo@LL$RN-|Y=?1vWUSY4YIczSQ2TlB&Y(Dhv@342-d(f|cz&>OjL7)B!`;>hK zz4;eK<`ez-*KCZ9vngCESBxvpmEcNprMWU(S*{#co~y)F;i_{rxSCuot~OVXtIwr# z8C(NS$7OO2xkg-Lt_jzaYr!F$firTgxYk@7t}WM|>%ev7I&)pPu3UGn2iKG9#r5X; zaDBP{+yHJc_Z~Nd8_EsihI1cqBe;>=hukP`G&hDD%Z=m4a}&6U+$3%?H-($ZP2;9> zGq{=DEN(XU5jTgM%gy8Fa|^je+!Agnw~SlPt>jj5tGPAYT5dh}8TTdk6}O4o!hOqq z$9>Oj<+gD@azAlDbH8xEa=&rEbANE#xgFdtF46agOdz+H+Xv15gWMs`%q6<~HqOpD zI476r=X*FW=i?HM`ydzMq8!R$91c^37r~Lxk7qcR<2iv7Ihj+q!`u-r(PBT!o#0M! ziQf4+?mU<1nP1_qaydojbGbb3ZFfA;7r(>Z zioAoAL`os0kupeGq#RNnsen{O9IBJ5r>cn=Q!}Pz)XQjEES) zpS~^qhxE$G?2L~xYGriJsGHF`qiII7jCV3hXKc*)B4d5VhKwc|jWZf%G|IRFXIO!+ z#8>94@KyP0e09DiUyHBJ*Wv5(_4xXH8lTQ*@C|q^uj4cMhI}KwG2eu5$`_t|EZ&@N z!MEfQUe6nNBj1{D!?)$z@$LBzd`G?$-P zBrJl8L1g=)wvWlPSk9jEWiMGj^*=rXy*%4%7K` zUftBpiJ6l!r)AE_oRZ1wIGss%M3<%8s@tvGqua0Br`xMLpqrUlKC@hAoy>ZfUR7FJ zdfJcaKd1ki{!{ud>2ot@WzNo=leyMV$51VuHD;s}##6@hbaR?jRrFl`o7*4r3;9L- z5`HPajQ@mR&adEC@~inZ{91k;|0%zo-@t#yf6i~@zu-6VU-O&!E&R7d&Mp@Jp5MxE zm%=lZ|<1rlz7gjs+u;uOdRn?S-OaF$ocQ{t&{ zO}tpVc)UdXop{N3sd(vlnRwZFxp?__g?PnyrFi9dm3Y;7wRrV-jd;y?t$6Ktop{}N zy?Fh2T0A|T5pNLJ#&z+`c*A(3c;k4Jc++^Zc=LFRc*{5v*T)TUW4u+ob-YcyZM~zBIo>7SHQp`WJ>DbUGu|uSJKiVWH~wzCU%Y>OKzv|)P<(Lwz4(y$(D<&N5x0S$Hd3R$HlM0^FHA}xXfQonh)N35AOWKc91X~Bs>RkUM-{u zse(o*JiA!Dm{43OA(Rrz3FUNTHHBJ2ZJ~}(SEwh{7t(}uAwy^& zXa!x7`Angq&`4+^G!>c&&4m_1O92t|f8=;9>4)ft>WArv>)+RZpdX0h68%#BGW{p| z<@y!+mHJis)%rF1wfc4XPxb5d8}y&)Ki6;6f1&?U|CN4|{%id=`px<+dieKR;a#Dh z&|erJ3>MxKh6=-k;lc;P2w|k~p)g7qEsPPy3zLN@!c<|JFkP4-%o1i7IlEZ=BVmp( zSC}Wv7ZwN~3k!us!eU{GuvAzkd?G9tRtPJFRl*u!t*}n`R9G);5Iz?+7McG-_)_>v z*d%-{d?RcYwg}$}-wEFfTZL`H55kYaPr}c_uflJ_@4_F#pTc(GFJXtUQ`jY#gx$g( zVXv@HSdjj4`oi=@>5J2sq%Tchmi|fl^7O)I#>DhV>66o^q)$zsmOedwM*7V3Sw-HP z__*&=x2A4O{UPhI*VNxqe^31*_0QDpseh&JNZpxgO5L5hCv|V?zSRAx z2T}{~yWo~1)tTx_b*Fk#y{W!be`+8#m>NnAr$$nvsc0&eil>sPR4Sdyq_U}8D*vzf z{lWp^pm0bq3l_mD*aW-a5S)Tba0?#6EBFMz5Da7;KZoDfb5XN0rDIpMr;LAWSf7On_ag=<2NkSpXBnZGXF5N- za96k|+!r1Q4~56V6XB`wOn5H55MBzegx5k$hzlxFEvAU6qDCwx78gs1CB;&rN|&N5 zqpP5+p{t^+qid$q>RRbK>D0PZU3pz)U2R=;T?3s_*HqV0H$a!BYpH9bYpd(3tE)qF zI$b+m4_zf)MO`gjOTx^BAex}LgTy571zy1u%1b^Ubxb^m@${<~k77R!ib#d2bKv7%T>tSnX)tBKXc znqn=nwpd53E7lY1iy2}AQ7h`iOtGQZNNg+?z2_!kQ?Z%YTx=n>6cJG`8bqVmN^C8* z5!;IG#P(tbv7^{Y>@0Q>yNcb!9%4_iSCRSNVjr=u*k2qV4iX28?}E(fE_`XJh5`UyPK|WZZ4s zW87=})%ct7cjF(%KaJase;IcecN%vY1>$KI49)-RLknjV`0x z=rMYYKBM0lFs?IxYFuyJVEoJ&G=_{}W5gIWqQ>ux-y63Yw;6vhW~O6C+_=g3wecI{ z2_tQ^7_CN|@vQNH@u2aL(QG_#JYqa*B#pfBoRKjWJ*WS4d#*T7oG&gAKNc5?i^Rp^ z5^<@xOk5$Z6jzC>#Wmtuah>?7xL({KekOh{ZWO-|zbtZgvG`ZwCh=?W8*#I^Mf_I$ zPW)cnDsB^h5PuYZ5`Pwd5q}kb6Mq-~6t|0ii95ud;x5rtWPZ1}N8Bs!6ZeY;#Dn4? z(JWd-t7sGLqC<3wF3~M|M6c)*17c7NiD5A!MnzP_L|i09QlvyibwqVgm8piGg#%sH z-PNa5!_-051=VzQe|XD8!z9CG!xY0*!!*Nm!wkbr!z{yW!$*cWhPj4$hWUmChK~&k z4T}tm4NDA54a*Fl7?vAW7*-mNXtT80+N0WI+T+?2+LPK-+SA%I+Oyho+Vk2A+Kbvt z+RNH2+N;`Y+8k}JHcxw9dqX=>J4riPJ4HKHJ54)XJ3~8DJ4-uT`;m5zcCL1wHliAy z{(gE`6;+K%ADccdeLQ^iqeVt!MNZ^JK@>$vlto26EFKZF#BA}XcpMx&C&g3ZY4MDB zRy-%37cYnxi=167eo4G6UJcu%}9J`f*@kHp8~6Y;6| zOnffB5MPR~ip;+jV`5xXNopxYN|iKHF{!vzLV8CkDV35+OXZ~UQbnnfR9UJjRg&PLwQ35Lq$U+LuEr1LsdgHLv=$9Lrp_1Lv6z! z+CR11wSQ@MXm@INX-(SQ+CAF6+I`yn+5_5y+Cy5i)}pm)ZCbn5p>=9qTDR7tU94TA zU8-HC{Y1N5yF$BCyGpxSyGFZKyH5M5cD**Ba;jXa#c6BPK22Mnwju4av{+mxWlBw? zrc!gMrKFb(l2K|UwU*jQZKV!USE-xSUFsqAl=?`0rG8R>X@E3H8Y~t4`}3YOL>ej$ zlZHzpq|wqCX{Eqx@-k>*PCr1{dv(!wJ1i=@TUQfZm= ziL_i=A+3~FNvowb(pqVq^r^I7+8})`cv92{Uz;`c1b2_x3ovvEA5jGN><4x*(HbMlw6Wm z@=1XrXBUeHrH~Ynq7o`$5-t%EDKQc!36dyDk}N6GVJS<>mX1otr4!Og>6CO@I#Xo+ ztaMH~FI|u>N|&U|(iQ2dlq2OzdD3<1hICWPmu^dUq`T66>4Ef6dL%uTo=8unXVP=& zh4fN-CB2q*BD)Y1vK!fh>_zq=`;i04LF5o(Ml6UGu_1QEfjAKt;zm4(7x5u}B!C2w z5E4crNEAU448aisArT6p5e8uq4&f025fKTI5d}Gn96_>>Y~(0%3^|URKu#j3kkiN+ zw~*V&9po-@54n##KprBGkjKcA z|MUn*aY-eo$f>eME+!Y3OUR|<(sEh3oLpY6C|8mz%T?s6ay7ZSTuZJa*OTkZX>!rW zE?v%$8^}62Q*J0XmYc{;<>qn=xuuNAdf6ZwU<=)1+%MGz~ObjZTxP zX{c$WX{>3YX{u?aX|8FZX{jmtx%|)Dh(@n5XpEXxn%0`3nl_rYns%D@nhu(dnogR| znl75Inr@oznjV^-nqHdTnm(Gons+t*H2pOLGy^q*G=nwo{jc{wNuDfEk*CSipUUgy4f1F5=kiAR z3;8Q~ll-;(jl5ajB7ZA?Cx0(*mAA=1$v?}#%D>6K%YVw-<-dx|?~r%OyJVBRSKcol zln=>f*&oG;&&@5p!M`|<<%q5MdGEI*N-$}i+sa!iiPDn+fND21nzsuWX-DZ8O{uQbP--c)l{!jYrJhn>$xs?7IwezSs5DlZC{2sp zQ{jF7zjLdZ(p+hwv{VdAE2WLnR%xfSS2`#il}<`$rHj&4>85m7dMG`WUP^DJkJ49p zSLyeU&$z!bKpChEQU)vUDMOT@$}nZP^1kwcGC~=tj8?`dP%R9U7hS5_!1mDS1`Wv#MK`BYi2Y*02TUn-lFua$3<&B_+# zTV<=VP5DvzN%>j%wa7jFzjNY+f70KS-<3a7j&7pRulS)m7KN*0I2UunJr|G`wFViE_6VuA6;MF0Nr4ng>Hy$sLoP1S~o^FRyR&JUN=EEQ8!sPMK@J9O*dUPOE*`yRJTmG zLbp=4O1D9`QMX06gYuY;=xlT>9k*9flK1*aK{^%XC;cBi>Ho+{8cIw0<|BQxkxuI_ z>MrRn>vXz8U6HO*SEZ}b>2ha{jGbZd#QV+d#!t; zd#8J^`=a}*>ytkqe^5TvKL_X!3z*bHm| zwgTIL?Z6ITC-57v3)uZ#{2pL0un*V|8~_dihk(Pt5r76*0d#-?Fac}eC}0P$0egT0 zH~>6=4+sDuAOai#3E&L40&ai|7@j{Oe^mbH{7L!K@@M5Q%3qqlEPqY@+WZaqTk>~P zYScbTjG|L26pON;9DCg-ul#S;(>LiUI6ov`nIG2cJbhE067x0r-^`|S`4#!~`3?Ea z`EB`NK9rB--_AGZKgj=>Pv(Eg@5%2|(6_*%U`WBRf)NGd3RV`ZDp*snzF zJ1OO94`nl1>6FM0)Byj(wxM-f|HCgn*s{Dd)xsJz!UHRd;taE2lxYl zKoAfNgaAq)6bJ*tfe0WHhyr4OSRf9F2h>0Ukn~;csI$#L3ZMZ}fixf;I0j?@S|Ah1 z0)3~&}W2b>3f2QC1YzKg#MTmf`IK2QJ@0>wZHPzsa*<-k>- z0;mM4fNG!y&;zwV9dHe(2O5Azpb2OJS^)#l2DAemKqnAb5L^&aprmA}XiAdO7t|Ki z71S3r7Z?k=3V;Hz04lg%aHHUM!Q+Cb1Yc<(X zPE&V}5$FO;004jh1i%0Spa2Ho00CSFZU8rdTflAL4)6zX7x)vn4?G0^0v-WRzN=k# z&)>jP;2H27cmccw{sG^acBY{lS6YAaF2f0S*C&g8#d2 zhJnMu5#UI06le*K0mp*l!13S&a3VMvoB~b-r-9SK8Q@HC7C0OH1)KxU1?PeD!3E$# za1po|Tmmiy9g0GVltn5^j7p@8sFb4AUI{9P(x37u`RR1gnWBqDmx`_w>5B4;3W^Gg zii=8%%8JU1DvR_*%|$ImhN8Bj_9CzdDng5{7nzG57FiSzDIQilyx6jMO!3&_NyU?k zrxs5uo?bkscy95$;)TUai`NvdEnZ)|p?G8Qj^dq^D7C-WjIt@VEoK#Siv_*bQ%JFj zvYz6K<0;=MsW`1Tz4%yhR&j3e#bRSISd13mF1|x`l~@k009S&mz}4Wd;5u+UxDnh0 zZU(o4+raJM4sa*<8@LPH3+@LGf``Dv;1Q4pT76f$?j8on1g$|^@F-{pvO#;019CwJ zkO%TXAt(YJK_^fQNpd07`dVUx04f=q-paS#*{lNe*5DWr?!B8*^RDls- zBp3xogE3$%7zf6KYA^vz1e3sIFa^|rsbCtI4ju#V7C$b2Qv9s=RWVuox%g}GfRceF z7A3<dEBR3Jv4kx7RPwo`hkA9;w{$?MMX6=!=+d#J<4VVuPNM`VTS|{&m2yhCrMyyp zuNu|elL2bMOfU<~26MpUU@mw9JPGE3r@+(T8SpIlJ9q)S1YQQOfcannSO^w@#bC*I zwd?LF1+P+_maD-UP!HCEb>KCy5o`imz*f)zc7UCr5$pm@AOON34ieyX@CJDEyZBq+ zAK+c^9{4ACAAAV@1wH~FgHOP}!KdI0@E`CE_!fKzz6U>mB=`yZ41NK>g56*b*azwh z^@I9D10ZRs3*}sS^!iqEO0-f@o>gS8W|df~DLqEnRHsWXmg-8IOIu3YN;^x9rKVD_ z6fMO{iP9UTw@UAnnoA#)J}&)IYFRd^Y+Bi@vV~=f%9fO^Df?zs*_5%$1Z6_Xq!LpC zm5TDDPL!Q1yI7_xD=(`kt17E6Yc6Xm1Iw_o+hupk%w_k>9+dr6_N?rA*~_xmWgpAN zm5(oLCc{P&}!&cXf3o3S`Tf6HbYyWt@{zp&jKr|EpyE$Ht;l78bYM zp`2eXpcJfA<)_Qfm0v8sTz;jzsJytmw7jgmyu7AdUtU{YU*249Ebl4@%E5A|{CfGb za?7iuua3Jq>FT_zORuh>L@FoBm&(0*;_9iZ=dND4s=Hcz6}|fE>f5UyulA|vTQRU= zVa1|~r4=hGR#t4N*jTZdlArcd+LH~XI|(Su$+_2U@}2VB(xGEe2Bd{Dp)4pH%7KnUxzGvdB$Nl8fzCqbq2Hkk-^E{o zE<;x!9h46hK!s2VR0dszDxgZJ3aWu>p*rXq)BrU?O;9t`0<}U0s10g|I-pL-2z5aw z2!OIGvMX{aGwNc+rHU&Rx{CaYvWoJG$_hh8d&RSg=M}Fi-d236_*&6Z(WkO+<={$- z$|04*D=jN0RZgy)S~K?wS!Wj4p&)KF?yXRZk3?dcIxf{AqavY1p3yS9ft_$26XfP>d<}< z`t$$q(f$bfPnY)Z*ZouI8T1@_0e$P*{+jCB{swwS^=|(FkyQWo&;RY<-UIc4`@;R; z{_p^JAUp{EU%Ul86dnc-heyC8;Zg8tcnmxi9tV$yC%_ZoN$_NN3Op5_22Y1)z%$`l z@ND=Ocn&-lo(Io|7r+bQMX(#?Qhk%C0;)oK?Wx#acPfc8r*u{MRYg^0Rr;#hs%upZ zRc%%6RmLh)6;K6MK~-?o^{N|Hx2o<`{ZVzV>VDOOs)tpNtDaT8t$J7Wq3UB5S@o%^ zPj%mFi|X;!8>%-}Z>iovxm5cphw4!E5lW!4?p3E))!b?)N|}=O8dF}BB_*fqsK{P1 zDwZ;$E>>TvzEZ8LE~+l6uB@)AuBooAZmw>tzFvK!`U`bZb}_sJUJkE-SHY{{U*Waz zI(R+20p192f;Yq4;2rR9@Gf{aya(P3?}HD(2jN5T;qPkK-E#z{!B#LGX249?8n%IL z;iIq}%!1jlJ?ke1+Wkn!H%#PmcUZj`MY=**cEnzWw1N!0eiw;us7@j`@(Wq z0sF!JZ~z<#2f@K`2&{xd;V?J?j)bG(7&sP=ht+TboCx=+8BjB#W>n4Snn^X&YG&0e zs##LAreVosrgt#)_keysp+Hdr?=1#(GSxP*N@PT(vQ}U(~s9r&`;D)(ofY- z(@)pW(9hJ*)z8x}&@a+2)34O8(y!5P(C^Ui{I5cFpx2(F>m7O}s5nZ0N~GkcWBLqA zdFt*-f|KDCI1NsRkHK0v6V8IO;T-rld;&fR=fS7pGw@mXJp4QSy*%*0b=%!j02jhV zltoYqm%-)mRk#AKhHKzj$|h*&wFz2!b%GAq_?=AfzxZ!P!T*GUTkswDn^IuzbqenP zUrNC<_&NLne%UJ(yo29UQUM8ng0m^3>XiPp{+#}T{-VA}U#u_Hm+8y(dVQ_FUf-59u-eb^UGqTm3uzd;LfK7yW?RfwhBchtyiuj;ozpyR>#kuVrmO|4C@&8W?;&8f|;Jy%;)TUm?NVzt+6Z`VGleO3Fm_G4|Iy8d+o z>xS2jsI#maS2wM0dfm)kX=;DnVM>;=p*$(OUQ3EoC#VxrmQ;7oXZQ>J74C+6;C{#e zWDqhKu|S3(Ly=*~C}cD;1{sTtMyP|Bb$(I$aZ80vJ?3Y*@f&y_96R`1K-6TL=GW`ks}BVu|ntw z17RZ8hz(+k97XI97Q#mC5e~vd91tGDM+Arv5h0F<6Cy?=h!k-~To7kU!1AKZtN(~s z!F3^Z$~qOLTqRPLRZ5+vF17BPS#_}vtb^*%I->4+ow@FQ-GjP^b+19C3+s#OOY6((%j>V!>+5UluhrMrH`KS(x7D}T8|%UP z>-9J4Z`I$fzf=E!IyvQvxFIsc9q~Xs5ii6W@j-kMIif)P5Pu{92}FXBU?da?L&A{= zBoc{6VvyMHYS-Nphr}alBmqfA(vWoI7?Oc#kxV29IgXq_P9k~8Y2*xY7CDEUM}9{x zAeRvxQt(}TAyR}CBPB>FQjT0jDv&Cq8mU2QkvilWQjatsjYt#HiWra%q!TeBU5E(* z5D0-01VIrD!I6jckL#b+zpZ~)|Dm3&@6#}#!J@&kVSK~1hUpD68fG@kYM9e7w_$$6 zf`+9H%NkZRtZZ1-u&!Z4!^Va!4Lf>OszVKjDUa%#KgDX`Qqq+8zsi&sWl9B5epF(w z8Kr4B)}Zb6q4F9|H=J*{*l?*q*HF|@+d$Dm4aNqvfoQniU~YKO@VMbs!|R4O4PP3* zHuPy6&^WwtMB}K&(T$TDCpS)OoY^?5abe@4#wCr*sM9wDas#=E+(K?6caT4jyNDV2 z6M29&eE?jb9r3G+8taX&T-%qG@c?xTf(sgNdRQxs)JB{tPJU2nS4bi3(pley{7rpHZBnw~ek zZF<-AvB{#@vUzUv(&m-aDTEE^MsyRp8Qp?zMYo~b(VggT=q_{*x)?-F?y*5_(W9sx%0k(wJ<35HP#(%hg{TO1M8&8Cm7>n53+jrx zp)%A1^+LT-pYP&*Q8}tW{ZM~22n|M+Xeb(vMxs$@G#Z1(qG~h|O-55t4VsFkq3LJ_ zszo!=EHoRwhV8vY#G-wtz}`$qL!sCD_b_SY;4)wvbE)#BDKHe0HsI$$Bz1s6=m1* zO^I@7;k5`TC(4Pkp}Z&u%9j$L6fGew$`(~iR7-42B4s+IP?}Rl%QwL(m-3n}wUkl9 zZY8DZ)=+|OEv4o*x3sjhQVMQcuYqf%99rspESiU&LQkV-(6i_{^gQ}IdI7zNUPiB= zIy4_GKnu|#v=}WxOVKj49KDKGpq1a%uDhoStww85Jz9&_q1VuQv;l2Io6u&o1#LwQ zXdBv&cA%YT7ivNQ6hdJXL9y@Rag;!>qc_l-=q>aP`Uh%8@1cL9_t6LFL-a575&8uE z8-0pCM_-^X(bwod=o|Dc`VM`Men3g|6J-K{El>+exwz(*doA}{9=1GddEWA(9apw_{y7OlfuEn6qGPHvsrI<0kX>%7*5txH>%wJvX6 z+4^hin%1?g>svRrZf@Pty0djRIg;`>wu`$?KYyvh3n~Y7t zref2u>Dd478B{+7Y$i4fn~nW~&B5kk^RW5Y0&F3+2wRLT!Iomnu;thaY$dh|TaEpS zt-;n}>#+6T#c#kiVw zRvCUZtTn7RY%y##>@e&$95fs@95GlK7zU=n+F)a_H5@hA8CV9cL11t;xEbUIg(1KY zVo(}F4UvW@L$o2*5NC)ts13;mjUm-=%%C-78nO&IhEs;qhO>rqhVzEs4LU=LzE*9`TB2Fg-wr@TZHWg}jv9K#2O$A)KyK5c#52DDkU4W)L%J7E$`in(Gk%meep zyfAOf2lK`JFn=r%3&MgiB^HW>VJa*fi@+kW7)*^Nd{?{foLR4ffk$Btnc zm=?>#vaoC{2Rn}CVkfYZSRQr?JB^*e&SK}V-?0nd#b3lOVV5b-N{8iBrd1(UgcV~Y zSSeP9m19@23ak>V!m6MdD?>2c`KwD6osx7=NvMstTrY*KD zp)Ij3sqI+XiMG79(`^^q^li0m6sy-}Y(v{H%Co!CW^TLJ_J9)MzO;R9>(f4|99O?z$fC9@X7cTd@4R2pMlTBXXC%%bMSfie0%}E5MP8Z#+Tqr@#Xjm zd?mgLUyc8Yuff;i>+tpXCVVrFQLfw#%9OiJiE`%lKieO)KkC)vUiR8?-@Ldl?R`2d zI)-!%>lofKqGMdgq>e=$hdYjR&^v58xE&51{0>2fu*11S*%8%|)uHdG?Wpf)?l5+A zbpRbu2hwr9<3@+M<5|bs4vS99&T*ZSI%jpx?%dhAzw7g7 z+gaI(c0TBQ)cK@yxN(Hh(m2jI%{bjS+xUxdfpMX6k#VVUxpAd&gK?vAGqqD@E4~fi zj_<^O!*}7k@xAyy{2+c9r{PvO9cSX!_)**rXXExb2Y0}EI3E|_!tZL=-6O&saVK1i zOK@l06?emBxI6BFd*VL0FRsA-aDO}i55$A;U_1m@;-PpLuKF%M9FM@G@EAN6kHh0} zHJ*Sc<0*J5o`$F68MqeD#Ix{hJO@9H=i(>vQ}`MDEPf6@kN=Kez%SvK@h!%!#%;#k z#y!UU#=}M%qpi`-$TG5x0;7{rVstio85PDXW41BZc*=Ouc*%Ihs59mp%Z%m5N~7M` zY-}+ajO|9yh#DUlpBY~n`*vA$4e1)*W!W{UYjW4ruIXKKyB2mW?b_JI?Gki3b;-Ki zyF9zRy8^o6x{h^abY*qrcAe`w-*utuQddz|bCD|kL$fEVJ$cnMyLm*M63RlEYP#H(>VUW?b^ z*YJA00dK^c@K)S_x8ogn=XbU1?&-o!IDmsVj3YRPO5tAGuF4PXnf050GJhyf|!0(b%5fE)+_R6sP4 z2%H8k0!2VGUmJ=(8mBcDyHSsI4j#y7@B>s2L=Y$mo6 z+lcMN4q_+q8?lSnL+mB?69QqWB8W&Liijp+h*&~RBoMp7J>Wj@ z07wUIKo%$fWuQCg1E=fLyeMNkKpf#qNYSOwOD4PZ0a2DVeOBLpHK3S!`G z%6K$`55Q;ObMPhj3VaQI1V=zCp;gctXalqf+5zo^c0s$LJn7i(nIx>8u=Fb2n~jZz?Se*cp1DBUITA|x5C@u zo$!8`OTE=fB9e&|B9%xZ(ure42B9S~i5w!AI7#FYr-;+U8RG1Bwfes5Kf}*XunG=` zqu@AL1E<0na4vibJ_qaIVz?5ng7xqy-J>)*}40(>cLf#@@ zkgrG&()YV3?Vq8N|L-|ipwrPE=x&sY3Q#B19rZ*5&_FZ<4MSCE1R96NqX}pddJMgU z8c`5M(c9=<^fCGjeT9BRKcipK0hk3g92g4J0ayqYg+*hrSR59QX|VHH8`h2)F%W~X>(~wK7Ip`FfIY+>W6!X+ z*gNb4Mq+*NzW4y#0=L9R<74r0_;`F8KI^+X@BjO}e};&;_%eJ0z7gMo@4)xq`|$(# zA^Zr=z-@3_oP~37Dei)M;oi6$kHn+#L_7)C;K%S2cpiQlzliJbBD@N(!JBakNXCsg zgrhit-@wiI1N<@m3V(-x!N1~thylcCViGZ#m`2PZ77~kyCB!mf4Y8KkKx`p)6Z?n* z1f5_IHpEfFj$jdNLO=)!M?y@v5HiAxkP{(0Y93}DZXRJCX&z;^G>uVxD83Yo2GGZ(d+tXkKJqY+hnsYF=huZeC$tXb!@Se{n|YUcw|S3wuX&$&zxjaqp!tybu=$9Y zX0|fZ%?vZsY;CqN+nSG>?aVAQ+iY*)zO+`@JhT~d zw88!=CsuM*S|NQYJ?!?a9nY4aTM+{y?c(C%)~VYPfuzsLf2CmAo0)R!0XD7zC!yXA z@SPG~9S_H!&4{!b%B*7ru>WHF@B(=TVZGyC=`(4VbEYTFZ=v^QJIoZ;QAh1WVo18%b*jfCMXBPx zUy=VNWub;~jCm|0@8_-Rk7YK;TE|_jxTV^WmX*O_TCi@jPje?yjk`DT5Aywmd|8kp zMqv)|RTe7~!)(H5N2EsYjGvnDCGCiIUv4Mu18o@nHN%RvUbs!@EZivm+hw%pc}0vL z?iU+;KB6{hflmgLOU1laGRKY$%^zPIXqe_-AlT|c?ctknZ`Wh`eQTv zc}MB}Ez{7GSC}gV|D^1vUlKld>~PxR9OYW?85e#!{+M>^n?yi~rQ zP$x7w$;6(L8p&HprgN-&wAX8|Jo$Nfhx~>@7Vs?KZqWOnJ<4?Dc-3~*)NpO2Bw>8Y zc+I`^{#hHc>~kI;Z?v+u-Na(B9XWfsm4Y#%-<*q_f8MJ8SZ0r%FMAwT1o)W(wg!C; zaSIIzwNRf{Z%<6tHlKK4{lxm9jknFGqY&GPvzdE^_d&E?yhrRKK1GpZ4KB5^FA9xc zsQ>n$V`2SOr&TH8e?@$acoo?Yy(+FO?!3A`nVYga-Jq3bUC$Yt_uS^V_#a7%^NyhP ziGmZajylYI?x5~g4d!8j+@0d ze1n3{#+*q^$y`ml$FUIQN^i@5Y=%GYC@2t#j8&JYA1Bc?htl_EA-u;fJ<-oK1Ibg2 zEY35IqwtgSHn+oGE9BSZr-SKXEs^!{R}yb$EX-ccbPzlf_0y=W4lrh0-(cP6nI#+C zbG#a~?TFB2Q&r$t*iL)g~+GT-c4cuH<`~KCJ!REXTZ{0?t@|U{FC&a)d5j;F9~ofOZ>4J{=B2M93M6Doz+2=ao1&B`vuGm5ZT~`5U#pQ;ehd}kwypEg&32#c zzSxap?_;O4n>iZpNQc)Bp*$mBB_hQ4#XoOVe=M^Z(wR~obY8400xUUptGmatv~`vz|?+NChsw9>0+5 z6?4eBYZv zQ%B%CzD&?23U++NAvl+rD@Zwe5r2$eCAo@RO|s>`l55Ddmq;Ns{UAJ8);W*d#ws=CsCjL zj`AzSe~DGDV;`Tq zPm8njuv@?$!7b*l<3;n=i0(O+`hE&eh^tIgYj2&5=2Y-Y1!L%am@AnR?AEgESR=Ut z?t5;6!|%K_s?q;w$9TtyPP_i~&zPihqw96|*&e9J1J7>n+kS!m#etiH21H$of1daz zX@7Em%{Yy<=BwsNx}WxTChRuIi{*31$Jy7>|61UK;NzjHgi9=gKqCH1wPR0|&G2sb zwoe?JO9xXlHjx0LRD*Lj9}h^Jmr>i;n4t;#VfI*rT76mzBN((4LC zkZ+_txi@j5W?7aew>~^4VyDJaGa@aMf5L(7+U6bXcOdvd^nio~sVj40ZQlzyq>Ep4 z*pIEQpLf*unCjS%aVZ)uIo17!*B`z@<<=+%(lzyUHjj*;DXa&$jd9!NHPvTX%#4$V znP*ez4iBA{iYK@|_1qPb8`>4^6ki+PF1j8*Gp>U-QR?dc#b==0QyvlfhbG2qgu^NR z(5MQ=DMzuQfHsKk!f0oNJCAlP2q_ME6yg~HtEZ*_saLJmGu|4f5BVnA5nDP?=)fb_7F=_hgZUDg2p0_g%TKrRRgRn2BB^b+}W1T-ez zOnjU8K^sH6Nq@n?dD&u<_iujr{s&cGqJC_KKkujz&4S}edDmGx?M2+Nt~cFBd2aSw zp7MH`%4>*RAZJs}KHLJ9Ch)S{8OuchTCLR*`ecW{ z-7A%gQxf>Qg%h2HWQ-POCa7*Rj0~R3w4gfW>qv$6rqv>5mh~u`k+x#)1p!TZ(OKpm z?(@-SkUUZ@BL7s#LIT4o!{Q@>xO;KNR50~VZTs=*Hld!Ncb5E9^yTEUTD#o5lbO;^ z_h03Y!zW}e4fuJh`eT`O2F(gi3vqFBmH(sA2RshYW!oIDIr#_2mN&~YH~dOuoMtfX zi1i|S*n!3u3AZ}BNWMsVJeGJmdY$xN8Z|b0bKKaJJ=vRcr`cACmPoJ2hD5r?2W6h7 zMX|5*Z}6u|OO!TYX%R~zYa?f*WNSL@s@Q4vAZLLjM;h%6xH)+%!YUH)Cx&bG9JdHp zCmz=B$T@$K&lxM5>idu1UBBT`ml^5tM;I9lssW<&G1&nBS^n3Q&y=Ff@{=tdKQ_ak zchuhr=+;=ecO(upv)G}$lg z`O@qtPwRA6Hv29Qa9kttm2UD_;!Ax-j#!v}gZb21R(`Uf%3(^LN*$xhc&Y7S zX2@K8d~I^*(Qj8@LHSjz+lroDBSXp~cl(;Ddp*A7{|?@9Tw;Ea%|q3ZB; z5mC`kQ%G$?_8O~$)?L=Otc{|jPJP6w;wG0DGM49aUmL|Qeh>V<_<;eR1C|EvRW6M% z$D%1?vR-C2F;UTZr@0=CfBoOu5Wmi(;#5)Ei=17@=g^br2kkDh7jpOU{Q28O+r(Ak z2JsL{f;88q(W50`w(_z{6}}{*G~#qrV$5Ro#Dw29tF@ZE5%f1!jwET9#lI~|bM%z% z@|f)1bLv2kT=xT#T)f@RXCA5 zLw7|#iN2j>X=N4c6?Q)39%B%%+E@hMz zMz^%)TBma^@kdBg0t3TWM2?Fd93KQjk-C4NqnCsijs*4$2=rroW* zk^LxlqV*u=A{#k%?AV6w!S3Oo6MBd&C84q@-mQM|A%BESRq7%d5?^VhB*$tZKaAff zTI4WHdeb>1U{|Q@#CTdZeZ2KzYld|sTVx;0D-o!L2SkA)jW||%!3A~0-3YhqZj~}; za;^N6VoX4402X*XFfyc5c`xj|>gTQMk7c$kyfOTr$SJXpt|ErE8NhS4@zZLtcox=Xdt z{m1&F^&s2(wzrNxWr^6M?VoZ!aRzYTI4t31^QQ}(9dpHn;`h?e(tPJ&w`>_9o8vLW zYmaZgfNg<00tJB$flq=bDt(kOsu2;%kx-N&=58Ea%~MZLxSc3T%1^nh`I2=v`^3qE zOc!#T)b(HgE-j0`nCZ=R6x+%=eCH@mC^Ca{qXJS_X8P08oT}Y;-j||>(A>xa(ihGX zJ@O(ZMZ3j)a18exlUA5DlvY6p=rb96Z7GQ9Dr|?iUCZaGpEIwU5 zUGpHV>*TDw@oabYGTv>$IEk-BBc)Ru2H*3I|D}M|sLs?S={IN{^!Kfk6qb6@2I0HAC)-#lsYYS0_{(xkK07|fk7LCS1LWp zqQqy`D~>W)<(yI6(cC{Bc8DS!$2l#NlsfBWaqfj4Gri7H$9d-~QWVLG$$q1Q&B04T zW+^u+mqxos4~|)*9-$Fx$~6^f?=#ou5LPlSUz+Nk7m^q{Az?z&OpP1otHTJV`Y5jE zURJDc0w+fhD*eNKruuhvU(N8W^-M34;guYqP4|i;QeRjR)?aOJ9*wa3%4)Qa<6Pm^ zbLa8;3V+_J{#a%sM2AFij?tIBFfrn#}g%T;o9Q_MUm(v*lItXw}!qdk(Su%lzL2&%|S#JzcC_K2tg`IkBI~$UDdM!j4htN9Y=%GYC>IC5 z{6x5OEaurQg2UFu`^3+nv1pIzcbNOE!$gB6E};YCc-kbZ$=2(RcCydeZ{X6nN4WiX zqxri8wc-_$-z0U?x6*08fBJ6k;J*2iwN761tP`W_4$6unM=jXBBKS%f6DcMOY+umVEL4Rly7VRY?oKAD$I?IocH6 zKX$14O7ig(Z?Yw275g0LFHXGR31=9$i61Wed8_(knfZ{f-G_NiQ4~hJSJ%^aTKkeW zw4-DvDc*|7;MvZzf6N^%V*AuaT#oFHVaH8ZZ`ZbH$7T;X;c#LotCV7Jck}KE#tZK` z_H&)*(J$2|ot9;p>z^0TspJlEw36(1-s0b&P0F;%$~%5q+&7^!S)Z}i_7WF&DCcEL z4*R{0G-Mzwy~yOV@WdS!q3|PFKQ_akchqOs!(oLdrkv!{Hq);%rm;!Ed&iY7n|#)(&kCHs?}Rsm!n`GB>H!xr3hoFsM^XGwy{gD!Jihq?Fll6k|55q_nC zUO~a6IxK|T9j_$Q6Y5iy+E8+6_5i!ne7(4@XCJ@c15c{+v+a+|@&+)j3R6W%uC3v_ z=qp(g{t)jz>QCwr&V-mxR$CZlM|ZO?Ig;*|9o$`F7;!YVRT!xv!^sGC#J~O-Gm_-H zImn{Oa`}Y7XmW7Go`{W++fy7;V#rC^v1A+>PyS9*lXvX``C}ysWFmP*5g6*3kVFpB zaB|KcUBLRto@rmkNhaU(Qb-L+ciillN^W(Dm0go1yQjOqb06oKM&9*W=gsy`C!4%6 z?_;D@fM-AksR+KW)RHSgGsz=ycayWoY%+)Bq#Y;U=jM_p$dhEWAlf~TEcQM{o+gVk z@~zL1XUTIUB0Wzge`~TV_ltlde%=-RW10O<)?_@)QJ!p;Tp$~~4@6xgFOi2>m&q$+ zrGqzLN6wNYO9EXATsFww$kuu6^t|ag)oXgmlpb107Ll(b z1Zq=CF}Xjzgq)mNN|uqo(H7IoNekvZ>o*d2S%>FP-!OksP(j3<=zcL*Ni@z;txRxB ztRPF%D#@{#mRZMWBdpr3O6dEox7qw^bJJGDs%A;qQ|%vc@&r|6hw!MlN9-iI;A}4| z{nx)s1H5$JOkZWNMeI5C>fFJ3hq#fl-M;a@o6@d$h~+c=T!O}j4vpEtXkj%ty^xPr zc={Rsu`$W!h&S~d9E{^V(e8TWng+cp5d7*t&Ug3@8 z%h>SvSqW@S6RFZLvqOce-Q?~wL+8a8r$AQu^vrKZneF0PRh&xRZ^8_hM0csjRgYud zBKbnaQiZQ-Lu7l@(Bxz3f222)$ux$QAAK>S&AQY2jdd&s;mqYu5k?5#ia9=+zB}ZN ze)Pc9z^cGO%G$7m2rQZx)0nbP^G@@3YP9yT_K6l}O8L*lt0XI&x!&u78Z<+*QfVzD z)AgjA#xve~lBzPoI{L@1?4NhkAx(z%AMNMNDbcHrYiMfkX6-IUp7lMOv36tZ&e|Qf zZ?vg8 zZ9T#cW%soo!u1krB+EQj`y7(LR5qzbMoFT!NAqJjag*ZvCD>{@Gp&yM(o(I)FkBf1 za)s?B+aS()P6$uQtK*##+!a^|hX|V;H;9Kw+elP;Q`$}nT|_QbvIXuPzy|0nv%2z46NT#2O1ju}4cld@VEG|oZOZ{BEGWoaUgPLucAkBf)_Ee8_kc7w~ zESN;x;#DOogha`m3^(>hE=J;{ljjBB2dcqI1UWG+CF44IgS<)JBEwW8Mbo^Tl}WL; z$y0VNf_=gYw>q^dtys&Z&9r&yzAV~H`zG^67Vdaoma4hKXctz8lP6ACO`-Q;lmk3|GX>u$1?LuxRRPkdq^8YzDxe& zFqO~Y&lZ@;d*q+weR7-6L*ECam!eDYko+9@7dc$@t13!$FM<*Ih{)}QHR{hX||F(3WRZsCmQckw+uUXU+ISLNEs zS7drjlKM62p6Q?Y5BY}dL$kLEwIW#$#b-P=Xo}LSvOm+FvDEAv?45$Q>f6qW5?lg90mJ@ogUd<9^Ns& zALQkVhJYo?fvUg57e-EuZjXMUHY6IgT&qt^{n0Dpg_01jO0Ts(waTQ3!>RRJpA+7k zN6uMpL7sp3rE;%GIG$y}i$m7M-PT&r2-+;`HLM!eOO}j1nENX)ino@Z=vX2-DxK+i z)^)hscF(;&pGdlIg4`T*AtWIDZup~cb)+n6PV}*8Ao@<+*d$%5f5y*S)gQ|&SDQpN zl2~Y0#5p3OOSd|wJ8$(sJd|FuLmT2wCk{zDlt;^3=93cKrJj<$&x&TXnxV1**%`cY zkwWU>GSRg_HpSzH&tl(NMP=|><)a8P(k|*lG)G;S7@Isig&`FZ!5Lv8L+@H)#$ zA%5%8?DLt7@;eeVHTX!#w$Qs_!I4WS7|ki^UJ^g~?-Vk{MFXYpvI?>)r8_eM7)O|{ zOd%_TC16`{ZMnC2#|0}zW1X+LS;&h2_0O0z?^*JdiVX^e!pHA$a6)i?aBFZ%sE2x6 z%7K*aY3XUdq%S%4S!0}^6Lny5B5_Etn0X$ybYdJURfcdGn0@1 zaq_%lkdt3*Us?t&pT?yt==*J&*g2dXynNmVUO2x+u*q?|SS~h-{UiaBZmF|NysM+z z4q3hXWA~XJJdYV(r@fMWzxr-caQtHfk^_eYDTC@ll9l@+`l|Sy{bJ>!uuJ-O)k7u64y*(B8gMNvdtx;$?wLRH=BbU+sq3w<9N>y6la&>dr zDGQ1^$x0S>OJ0iZc#T#V6wJ`dr~?TWNrz~E|LgzOUa?tex5JL$_jMfX=;^dV{8$_$ zIUy~TirfUU9NALOhyL>d4g}f-PF9{#^$UL!ej=hGVp43P`U^QAsV>P!^VV;2(E1>o zP=D26Thvy;TH*MM(*emLiM#W0mngS+?!_KmzRvQ~a*m=(anEmte}eyCfkQ&4hkg!U z5uF*gNev}FO)g4Vt;tV!)cR@%XGU4Qw*H&lZa&&@*GFYvYJV6x4vuZ>F~l~wwse%XFyJH zH+dkrBiTc9z;TVd%rg6M z_D1Gi&RzN8pkAsB-!%yL!%Jjtl>^Cu1v zH$z=wGoyxGE3l23M(-hQn47pt;S>=f`p4hY^ieC^{BNuEiDOdU@Z^$@?n+fdWT%>ui68It zX&19clHvZ+!>s&EyCy7!MQVUX>te~UMy$Sz5u^;0u>ZO_&9hp|(q@#~>=p)T#)ru}Uj&uodnc?c@QSH|mSQD`*3Q%86`kFE(^-yYV zs%845^qllt+I2Z2a!1p+3WvZ?L5$$`;N_vsQS4-S^2cOL%{<9=mtFEtjOEhXC-*SS ze68%CScf?OxH3U`c>jO>9`J!lxb;SxHAmOkui~n`%whJbLE+EC&nCsE@^k((b8-6KfT1vaN zG@F^XkJ-X}o^?6CKMj@+@+`OdlanEhlLfd>l`jamlNyrV9Q%MmnxFD<+ButTwgs&7 z>{kM75iVLMwRKq=u|r#&eJ6V<-P(G$ZHQgpPb^WtPk%bON$yA+JYRbLBHtjN_^*Gb zu;CcPX3$ZI-F|+Kkmknn%J-^KW~g1+OTy1MTKI2OT~4%NEpw`I$>5CUd3yB!YC~S+zYrGeEsL~ZR@|=-oHb?Z{o&?mtS5wZ_{(T&V5$*Mg3PVo^bp1 z+TZ+-zrT9-I?s2mJh`tZI_N}cc7SGs@WLGOd#9-Z>_6(<@_4xjqr_h;An zZZ6q8dB>PtV+Xol{$lz2>sM@C@y@mHv)e27yu0_^qkE5^I~9BCncx1i9sbYl6}9r_ zPglIxdu;J>{VDg;pRYG<^8V2MBh%5ZPR#%1(G^duk6Vv_ymj}c55M_v;b-Uf|9Sf5 zm!3Fr#Y?MR)~=YeCVt)A%|2UK?fLk?<|C2Em!7!k*Q@`?c=eODOAk-|#`n+6weN2D zc0>EytGCYF?z;WD9jm@-`|5|EPyW30m#klREno2c@UlBs2CjT_)v;9}@B3}b|6=q0 zKTdx9%ih22SH`c*{HW@%`seJQU;oABrExE}tf_ge_l@Nne%-X~oq6vb-g?gmk9_sJ z^PKU5MjmHe9U^2!xYtr>p(sW)&O!Z|pvo18FDc zp3=XxVAm+h>(T$2WSiDUZ%zHcZpYFc9y?C%tl$0Kp2Y`Tj%++?f5PR2>yP@= zA1qtFUfA%?MxV`V4lVx9FMYl;=hcB%zgXk<`t9o<+O%lX_|5NZZrt+T zwzO@pe9-s7Puqp<_1oXrk-qEJJ+JK%_WbzK>w6PFzv;_zXYKwi2O|!?ba?&YJx4zN z=KbU5AIYh=Pi1VFw&~*^UVClQ=H6{jeem?2`M(dZFWfNcv)Gl>*RR`}wRO(6{2g{* z>^(f;*yDdrTXB4)-P*_A-?HPw5C5|r{?G08?cVUcUi(`Q>^wH_8~yP;zg{uW_12wl z2Y(Xs$(BzadFi)ROV?=EezwkaL(!WXx4gZ1#k<#j@b*s6J@#K5Jn`OdxBl_?wu}#+ z+CA@h;?Hf%maNmSe{n+({we1r8=u*{V6*1EsIBWiNcdpW_9Z+2*mLBgsLyWyeEEUZ zN0y!V_LrEy?paa#%HXo;xqX+!VE&6~M*{&>G-oBQ@1JKo>@{+HqV9ypMFSbr?` z_<`lScK@<=%lrIKEh`Vd^2XXlZy$O)Ve{Ybe!K1Lw*R?W{m&$Oe3!5Dhd;ddo5#!7 zF8yuA#FbC1{CZW~s;Ac-U;pGgn|GG%wmVU@ymR?mucp4r@BDt};7-p&R~fq+ZJMTUC{EE}7qPDDAAGW^b&965vPWd>*~$7Y&o?f=ROTOV};!5k3??5LSKK{zS=DEuV+Ec_z; zDx4Bd3%?1!3x5cI3V#WI3ugqC;3BvRYC$7t1)ZQ541!TG31-1fa2GrTPr*y@7JLL> z!B6lP0)#*zNC*}}gbm~jaa8{R=e_CMKY+fN<0a-7)q6aBRG ziXB%yj{HAf7;@nP3pl_7J1_=}1@^$Io^j;lv*XG7-YbX`nLzeMU5V>NvTvT)K8diz zfkcwYWa7RlWbDMN&|@l||4)>wi8Gl-n5X}nxvwGTFH9$c+_kt~hpTez^^pAr?DIx& z6Sx^TqVE5dGJ{OMezJIF$L>>M)v zlRL=;?k*q>`ImIH4!;|oVJ-KNZ@->P*thN_s`dAgxsGD}{e&kEkozZy_Yaa}@(`{M zBW^EO9zp;A-SQ~8@YQ3a?ZV?^EO~;EwkKixr-;S1p2oeCB>Oxvsck-#bm_IULYGHmk_elI_5=UM{i#uArD*Y{!dR-kE8t@ue3tlH*$+i_`d;@*fp?*Es05*b6(BnVJ|0epp zMG#t}%G;>lOfGyss`|fve23h8;a$x29(W&YAs3EpCC@+lUr+S^@qlgQn|nSWyPnxj zh~o~zU$K+iRkw>cRqiHa_8t=N^dVWW<|Fd(^B{&R>%o79JzN zslOpywt`xoJz|0XPdh8&!#B7>i~5Z=L+sJ~K^ipd%>Zq!t=!>-Km5y4yDk48JX!M zkfqM$WRX(^u_u+tiB%+HOf}L|4RKy4x=tKcaJJsoph z%j}qT9dq!5>zVydH!vq+Zp1&=dlPf$^P8FJGaQ*4_!&$*JCkvod<#Ps&tevhzm>WE zq1zazRkt(b>)FhBatFhnp2N&w?_``D?qcS%|6&M#H?x4sD}LO=@Dt`Tmeh1FGi{1k zcOUwR*ZUdA>mFd7$b%RoK0m~aBM&n^evdHI$3M#4a`j`(ncp90>TZ65`F!b<%-#b} zF~bf|Gk-=pF+D}|m<@LGnUk&0V6Fv>1M@7ymMvs9zV{q6(|!^2;ECrMmaegw;m8XN zd)*So`0R_&+e-{#UuKwnOPOV}mod&8mNS{`3dWiCUCEH?tI+2ahMW}TS?R?#?kq0W+K_l z{PEd4%!z~VGH0f~$3)G3pAqJ5Vfe9IndgshW3F`gfQg^5otbiQ2NV4DP9~Dw#mt<# zn<1}9y;K4s3#{EV4B_j4wa`+{NYzhoTGd_)+FG`I>p--eb%e@(siObR0VQ zmU&^~cg+0C?-|GACm3h)1M@@rN#>^;e`IF6{>1$8{Lf6(hF_R53w~v;8heU4@!Dx- z!GhnIqm#sSeuvHeU}As%liBy-U(9m{|7O?)XP6a{D(1kQE{r|n3ZGOn^G|A+$z!yP zcASnO_IhUKeFo;BkC7?4-o%hLGjlA`joHt-Gc567$Wc#*Z1sZPy_p&KC!?L``7#HO z`!V)c`7;Z~1u(j?;<|y%GUp&>-h^O=-4Md0lTe1731iY7!Wn*U1VgCPMKXkmVwnBW z2$2}v$1)Qa#4&T;I|yc`&2Ho@4h@{=Ba$r1(R=A$((qmiiw#~&DbrfVQyGl%cQe)jMIJf%skS-{F&Ft zjJvam@vLiRBEM*1md|QsoTA&97t-6YuMWl(-^n;1>tYNKbi>X)Ov1cg#=*Idxp`JU z^fbVHwn)^;Ad^gnm@x;38FK%5X41S1%=H8*(2-%CoLP3JGsm7f!?TA~cI*~1hMhZS zEUP|b&+eNyj^)RUXJ>4tKI1JN}VrEJLngiQROT=&xmY{yO$p^!4m`as%sl`;Dx_xSQAs2X1Cr`cC1}6PI#6bM;2n9=h*#=7qMr? zJkP$hWie953oMzogkAK?i|mO5FR^EKzs$}dOIhN)jGaZ6v;9X`uowM?U@hw$|2jK?=Cn81d7kUoS;yD2^Z5F=;(_PvYs-(ydvyw6VEu!UvzY-Oix+{XSuK44EpZfD2O z-@#7ece0KLcd=Lfwwq<0_OP3deaOxn{)j!g?_<{4=@a~zwwL8*d+Sv7Go=CSgGT~cyl=3_#|N_{BZM{Dg|fH0gt1Ns!&!%`BiI+6BH{B< z>=Y8s&ipopefQc}_ItZH*7?L)_PWQ;v2PuWXEz>7U?Y_P$2u{b6W$QX4ID=n@Z15;j*I$y3^!xOSdJXD=U8DJ$CB|} z@f8y|ZsL{PZTlv2>Fgwq*gJ4D?wHJ-_+<*mI92TtYYZMvGn&+pur@z-$6 zw9~mM%(dKI`>x~2+3PvN-@tiJxRG;qxrw_&eKY5D*pVa7GdOnfOm5!XTR6hb;+%qS zdG z!u_26T(SNEZnDFJoIQDnvu7XX)cYRc&Nw~FO`QK2WO$r&ihP3GN1o)!qNlj-e?86p zFv*D$oPAfU~?o}K!4)5Tm@jJQcOLt-J-Q0a- z4>x7Thg_B2M;y8GW6u8ACmfl-7drWryPtf`}`-+GXn{`w*A%!7wHKK}^E-f)x?*snPiIR-m^!!3ho0~c947bQZ#gSt!+%+>@x#@ev&T5WK(QxbxE!Ng?&h~n4@hJo6 zNb|3en>@t?A2xIRX*X`w9Cwc8Jvg$|lXGwo$9i$UJ?qWQ@$})y8DDPvd_VY%KWBft z*cQN@a1P|A*avY=M}j$q58>E~P|k5~7&muJIOlvkf{W!Nxkx?=vPDDZF&uG<9ClS@3>h2MB|bL^NNj-S=b;pY~}(vLk2a1P8Mcjc-fF5WQA&7O6hTTajQ3*5bn z2>;?HhQEhp`7;R5+4Fe*Gdnx{Xf}rbNk5ifFx{Sy-a3wtes(;6jnfr;#@!Qm=GrTH zdv+qvMo;3&)egMViOKvAj#GGszlwj6+R>sR+s~=Iv-8#b{Hv$&j{G$|J7GFc#$3zu zQ?KL6hU@twf8W3t1l`F0ZFdtte&x;l8?zjFheu}cp102A>8q2?WVi53?Pu|)$*q{{ zHlDDz^Y+Ya-hROyywj;UJehqbKYrg`ygm6BPY&MAGfwyLgrCdLAoub=jlGX2`|sx& z@&Lb-Jjm~#B~JVhj~{YT9_E=R9^rZCM|ooZ7*C#moS)4;!9UUWBp-SBDc(NmX@2e| zC!U;vlEm(`%;(AUXZS^`1^ig@EI-R>AwPvY$2;A%h(9#*d49WLG4E6J0zb)V34hzN z7x}|mU*aF%^)i1&#Zq4Fw~YV$&~knzyMkYGXeECOvx;Z=S9s#InrCOc$~!u)!8)(; zv)Hw~v*YWye}gAquETXb&rjRHpJ6ug&T}^Lyu+J3$$yK#kG#$A8`#Vrxc43YDE}_+ zNZ#X#IAXRUY`8xQ{KV;GsyTk@3`~}o;ZBTFXg}DkIr?5PWM6Q`+3&s z0CaGWcOr){{xDCNBfO*iQQndH8qdf0G4y@&8|YD-^MAJ-=bg#7{J3M^;V0nl`A24) z;MwUv@Xq{6euu-4yd^J*bN>Vxf9BZ*zwrFgU-_#aImI)5r}-QB-}w3&zw;Zm{=v_^ z{!jj>-Cz8E`@i|lPtWihu2b<7j=1n~<6ZeEqUIMb*I+FzZ#PrNPi6G{{G|qd%uFMH zf;aI*FRo$cnLEU*8}DTA&fC+#_uv;D_2jo-?Zto3c*71pJadIF@3g~@cX-yHKXX*< zZ!G~l*%!#OB#1vjf_ZW(gdZb>@(w$~c>8JL{J41$Jbpk#iR2w0i{gK=4x`s--f3nG z@3=D-Z})MS<1Bx>%Q>tU&$G@6JR6mW_(+03Cu1)u{2h*|{F&ov{HzfLVU~2*CiM9G3uk6cXSb}didjKdLdsQKX*|-Z@*!HpR#5U zx){P-!@Tpn^YG~lJho#;>=`?EIj{&k4;F(Lz!LBxcnQ1=mV#wqIamQ!f>q!Zuo}Dy)_~W*TJSn}1FQq< z!3MAqYyxkBx4_$AGk6EQ3*H0ogDqey*akiT+rbX76YK)J!5;7-_y~LqJ^_2dr{FX2 zIrsv63BCf(U?12I4uFH;5I78ufTQ4Ra149{j)QN(ci?+)0{j3@f*-+8;Aij)_!XQ2 zr@?RFckl=J6Z{4K24{c@xByq61{$CRI-myzU<4*$25!I|cmPk}1-yX|@CAOr9|V9v z5Cnoj2nYpXARI)1NDu|0K@5lmao{XC2jW2jNCZhB8Ki(zkOtC02FL_iARFX>T#yIy zK>;WPMW7gzfKpHf1W*ntKqaUG)u0B{f;vzS8bBjx0?nWWw1PI!4mv<5=mOoK2lRqI z&<_T{AQ%F};5@hh$e0Tk7{CG!@W2j?0b_wZ7zf6KE5HPBC71{%0S7P{OaWJcso-ib z4O|1JgKNQc;CgTaxDnh0ZU&BE2ABzM0kgoZ;5KkOm<{d#bHJV8F7PjKH@FAP1^0sc z!2RF>@E~{yJPaNIkAla*N@CsNBUIlBwYhW#S9lQb7f%RYm*a$X(H^E!rZLk@<1KtJif%m}{ zuoY|rAAs#(2iOUAf!$ya_z-*qJ_etFz2H;u8TcH00loxZ0cWre><0(HL2w8h21meA z@HIFFz5&O1C-4H^zz6sOKj04nKp+SL!5{>Lf-n#cB0waF0?{A_#DX|* z7Mug|AOR$TB#;bJKq^QB=^z7Sf-H~?azHM~1Noo;6oMj93`#&LC<6j02Nj?aRDo(x z18PAXs0R(85j25j&;nXP8)yd|pc8a~ZqNgIK_BP`17HvgfnjhSTmWP&;vcYp13a(; zW58Ho55|G<;0iDSTnQ$ENx%V222;RQU@Ev8Oas?|>EK#$9k?Fc0B!^~ft!INm;q*j zTfi)EE4U5Z4rYTpz#MQVxC{IX+zsvlbHTmfK5##H06YjD0uO^nz@y+X@Hlt^JPDox zPXi|~56lP8fCb=Lun;^47J=u%V(C@ETYP zUI%Z0bznW%05*b6;7#xrcpGd6?|^r~d*FSr1#AV|zz1ME*a3EeU0^rZ13m;Ffser_ zU@!O-df>Yo$_znCH{s4c1zrf$%3{U|V;0n}01GGQ~^uPd&zy!>|4Y&gj;0e5dH}C?;kVgA9-fvOqS-0l6R#4C;_GaKhR0p*z*?z?4=x3fJ#s` z_JZY$J^x_O>apAZp;g(0KN92b@H~D%8-wo-*^_Z(Jh=kjdb<+eiJOGK>`x|B$W{2J z)7AK{+BNuN)V25y$MxhoawEP`bu)1!GssMG3zqbSx#2q8wab%EBIE=t7Hv%jjScF`%BXmDqxUX~8s%&k->dcNOZ3$kw0f;vuaob@@p`@9 zV8H(?=khdo=sj#|OnQ^ev$D7H-d*qhZ~EzM^eK+@995%tF}WCB++4IS2B{@V6RnBS z#A@O+XEo%`N6u zbDOyxvgQ4wdnN2(5t7)i(a!_vL!uhR9dO8WrXF^AFbz9@uOPuM?E86 zE@}Az)D9Yk48w-=muy$AWW9f#-qhImMS@~IKbscID78+!3YTahq}ruIsxP3u#GZ+Y z`NZd5eV-z3A+vr+Kde8GI!}$4##`f~@zwZg{51iZKuwU1f2cGr8dr^4qtR$JI*ndq z&=_snYgKis8dbfjL6zf@?~?0M;F5Qdlq%G?TvRK{gco?mVq~1EUG6Ea>!xazpL69qvBkDTsd8v* zv?@mK)ud{c@5SDIs($+1qw2M(x1GuQ6s3^LS|?sJE;}~!vMuYMb< z`WAhwzD?h*@6dPZyY$@(o7WoZ4E2TvL!+U|&}?Wiv>MtB?S>9Rr=iQx{U7`8h`cF= zR708}-H>6(G-MgF4LOEfL!KeuP+%xD6d8&QC5BQ%nL#j=8!8NyhAKm~q2`jSr07%i zY5H`1hCWlDrO(#q=yUaX`h0zXzEEGJFV>gnOZ8=XL0_(~&{yiK^ws(r#jXfZY0X*} zt($g4GRvK-HeP#9>#kL6qqR|553N>vRvV}F(rUD^+8C{;R;LZsCTJ720oo*OvesK` z(1vSMw5i%4ZJIV+>x&~LLz}4$)P`xZwAor8tx=n!&D92LBeZ$ie663>q%F`EYD2U| z+G1^_wnSU1Ez=6xa&3jSQd_0xRDtM33UlWuSk~=mvCGoTvA+$T#9j5;!=oD*iYr6a#iW&8GKcKDt}dg zDo_=q3RZ=vLRDdCYgBoweB?gjI5+u8WppvR8r4RPQESv0^+toyXfzqkMmM9o(ZlFz z^fG!IeT=?FKcl}fz!+!@G6ow%jG@LbW4JNG7-@_$MjK;{vBo&#S>rilyfML;XiPFD z8&iy_#x!HPF~gW?%ra&hbBwvhJY&AGz*uN3G8P+4jHSjhqhKsIRv0UdRmN&#jj`5P zXRJ3i7#odE#%5!SvDMgSY&UioJMmTA%N3Q$#pG&In=~e^NhiLFn2aWq$!u~nxtlyp zo+dAox5>xkYw|Psn*vOMrXW+WDZ~_N3NwY9B21B{C{wg4#uRIcGo3Y^GsT+{Oo^r> zQ?e<=lxj*drJFKLnWijLwkgMyYsxd_n+i;YrXo|Zsl-%jDl-YDa#Mw=(o|)tHr1GF zO?9SvQ-i6|)MRQlwU}B>ZKifphpE%lW$HHdn5=tH%i4zp)h=pRwOXxFYt=gO6-{ka zo785to7!FNq4rdJslC-cYG1XV+Fu=@4paxJgViDGP<5C(Tpgi~R7a_!)iLT=b)5RF z`kXpmouE!sC#jRwDe6>pnmS#bq0Urisk7BN>Rff6I$vF&E>st(i`6CSQgxYHP?xJK z)RpQgb+x)iU8}BB*Q*=Ujp`MnJ+x<}os?o;=x2h@Y=A@#8O zyc%bO!Q0?t@HO}u{0#wyKtqrr*brg}HG~<$4H1S&LzE%f5Mzin#2L;S&Kcqj35G;N zk|EhpM!gr~_1=0Py|3O+@2?Ng2kL|L!TJz=s6I>|u8+`1>ZA10`WStzK2CpDe@-8- zPtYgolk~|_4l8v@&?V}Ubji9D>Ff^Hh3JZPCAw0bzb-%*sLR&n=yG*=x_q5V=c04f zX>=x?S?8v6*LmnXbzVAeosZ5}r_uPkhx;kCCu0mI-i_k^tqIA)^ z7+tI`PIp#!P8Y9B)urjubs4%$U6!s;SEQ?SY0_zRg059p?h>kN*7?cr5ka~Jdf!Mt z%kWu6_g$rH(bdzs`lh5-yr1@1Ji|M`sM)(Lyey<2e|amm)K%fD)P!g|g%WK!&dO9z zsUGiam6jft{;Y4e)(@mu?+Ec2QsFD(Cb>;)$*47F;tefzq}MRoBT9n@gCNI9$wUuR zrO;@p8A$C-(o~PMD(}h@2}#Z#sVT=-$O)+|b}JjHLsm+%JbC0;uHCuVADuC>)U}C_ zlzKvR4L$WCgM`%ACPPnz)TE1_QTQ4={%%|)ekSL)L&~yL^?-K`-pmHXy0C%x5~_=z#!E@MtTG!Q{$`dBSqgFU0Tso+}vFpBv@)wu|K~q z%Y9LnU#?m)>&Uno$k-rhyD2GB+Hr@XZv)-Y$cT=9O;Z`_8fqKUGm7hrl7~my{@c5} zBI}6qLPGqZ-!k}2473+ps)CKIrKv@{bIl59N$a!L#Ww`DnADSH59hg(ACBH+@YUT8jZ@?o3Zlci)T+-YZ^3J+H2b< zi$TMOUKr)qQ z&}P5l43#$PDCdlVe9e+HBlYR>&MkF8*uAAxQV+|@fHowH`_{!Y;v{Jp8tCZ`ZOa}G z5n{04;Pl|$&ioX~R_=0aSm!|=QDpa8s<~n0H22Kbmb{#*2A96Zl!!d9L9u_6bozJ~ zH>D4!wn?%?OS*5Cv@Z7Sm1G*Cnsbq*_9+lsyYlfZ#Zf!MijdY)Txc)xz8yW&6!J+O zh^{(QkpT=gdUHWMv4uOST+oQ{Kf5Ma%ZgLI3!! zhPuvfu}3M*r>$AyeHL_w{8kdsnq3ROf`^D@knU($jyu>%A#)!j9x1)OW+{I1@?0b@ z4~K5r==_#`>b9ox+O(ujLvy&af^~eWG*@bmSTk4}k{*!LF6&>c)1yb99HBbwDYa0n zN7fPOMgGt4;*w)8bL_(1G02FRj}?WEmcs-e2TJvn%qZq&H35u&hDrB3+Ul zn^QD&C#KwJ*^k28!ZOv8cUk*i`sz z=cxy}S2ov14OdX9d?Y;TlX>Xn>=i6P=J<45S zKW$=2Z$n3XX_lO~67a@zaVZ^+lp?aBKQ$v8@spYDTA&{;$V=@Fr<%7NlZ&<5po#Lv zIO;W))&c4(F|dA_jVAEMfvjRF)x)mP*ieB1I&6_@tEFfXd!)mjUQ))kjBx3-T>rCA zZ&=lf=22^ZZ_H+bzI2M5Q&AZ@sHU+KEawVjLFHa>cBrw-LAodFT$jIAN`7E$7W=3= z%HfM6MJwx2kTsJ_J-($%MQd8=S%vuScU4Fv&S0kgiwsERACR+dZc5LPWrYN}&hnhC z*oUPCo`AZ<(zAHW9VvydV7ekdkF*dHm#=)f+vC6?;fjBlEubrU*b{nf z8m>_Ii*>aycx`P%Oj%||1?;P~k=KMa;i4T{N1jt?z72lgLNl;Y(p^$%ph8#HG5>t+ zF88tVbNu{7BgJqDxe3wG>=1id`7XVdC(Snz(4`vk`P*cE<%qMge=BP*b>B+&-3(pX zme>;8=Sw~HO8$PSHk<@D`PL12ED+)U#M;DFuyaP4kd-Wv#cpwn~{K zs6L;@Og_zS9fEDIi=TXJhKet)Ro1k3TAtErYz#u1XN%gQ#STfs#n^QQ-IG^xKJ=qc z3T+IR^O|y|i|>nRUXP{{=-R~gNb2Lwu#2TM*40(V(Du^i4!Vk1-z)1}>Ne_@sg)yQjK)M53}&jVksGrs6om- z!ScI^wG~k$odY8^DUhL~{oF-%?< zN8${AbWaI54Ju%fFnR*3^Wu=%EhQ(lCf9l&W|KcsN;_%X3v?Z8AIr6=DSWUId+k$r zwQY})r*Qcs>P$BZ74$bI*%iZ?@Ds&)S+aIYA%9?3Xzws=-c(mh{is)wmGx9A>-_Bs z?RC)ky3#!|t7VVYr2Dpe4fRoPIa`u}-euGa^onuauw$zH&e%!)#@rj*Sl(LGlJ?Zqm9nIsQr7TQ zXj1GmQZ#Zr;HP^Ug<_i~&)TDo>g?=4$YSYPBU?^-mh609_8jYsmTTcCiOhwbvNo+f z1Lb{KYphpeVm~6qOCHe#?c(&6eK1Ep(YmO|j^0W&2@@VcGf~QED=}-29msyGd{Y&KB zkW-O{abj_yT290s>!6F~i&ktz>}S^xlqbUvs>;t%D;7z+%z)LTHT1$3PxX@Qw-{1|2tffo9+bYf`4b`r3Ag0E<+?0r!D?=3dIk%z%ew5qd-O!U> z(3Dh&|NM_sTqU0;=)sg+_+@u(Yh8b3NM>i}AbO^kdP4Hv z+yX_6MRmtw7a_>|84CU5_dBS?&!e=iqPeFft)ZoD2y>KWb!GWLkG`@lvuM1ZmChNf zq?T*0v@4U8KSo-$il`wZs4}k6(B+@fkDa&`R%T|%J1$NdK&C9A&jx5eq%xT9xlpjo z)k`&Lx%Z(mi}&5Inidi0*Ha|Np;(_orEb7k<~mB=vSG2^T6)v7CI7J2jJ_I2y`L4q zKL*QP|=5(4RyDE8BKPd|p+l&b6@~6>PTH!~1pfyF;UY%M({ic$hlxDiS{&Z7Q zR%tywJGvDoUTJxYLzeoHPd7;mBQ?+@e7USBE9)GUU)iF( zPfd*K^QD>1w>W4Z4W8pO)X>n_FhKp&(zA+6SWA5`L6)&uzQf-yksqR{w3)~wYRO9z z6+Qa0^inK|vX89N%}Awu^nNrA9Faaxk@ATuly@sWqugp+KvJmVfy&oBDd?0Ti3aybgX9&LGC`Cgx)v!3)4SwgT@I~YIy?KK+B`}<=`Ms$59wzmv9DVZGC6(2 z)6@0yOA6|8B|BBXJIiSP5{BaQ+$8^REz3&oM~kJjWuGg`kx#cS>^?oGz$V(y4doUK zQWo^Y9!82QEY*aWlBg~48#-wPvBxlU>}8{o!So`VJ&L_TyVV`3`Dr#<=|x_>xRfI< zMwft5c4>mv;w3L0-PihDM>9^8G%`>23!I+0xl|8fz3!5n<%p(k!3RE_D|@3R8K*{5 zc||zQxz<@N*LdoKZHSZ}y7M+E3L+$ZM#!_24|z6c42RG?rS%s!Mj?U&GutsTtFlI+ zMcesDKQ&9gUmBpY7~9fq^j!gIbkhE+%loDH>Zxs}G3q-MP4!%S(b?4vAE+y7&Kg2{ z1nfPC9gAfkOD);i@{HJlpT%TbpGK~glJ}0(G^55%5T9Ebdol&sY`+%c@BtBO5GN&+2|1^ek?;i$qKd{$A3@q20MO{h}x+)zZhSlVRm#UeJu zlAdT9Xl(4Ot(HbwYOSAn8P+@7t6I{?V0PtDKGw>?vx%MyosC1#!AQx@8bVamVD|nB zRYf+e+beii4M{#(C3%`j_RKKI)h@__KuZ^muuAMHdX%Tu<+vC5mj@`a zLWB@A*Z@trAOmWp7!qf#ll`$1RLnP>;$XsdY%+Q)qI7 zjs2>s+i7%^qqes{i0&<4A@ilyH}sFx7D#==r2U-D7uzbUQfWpI?+d6z;$3Y)P-YCZ zNOfU4vOz&cJ|d&w6+!&m=t|$ z5pQCNtoBo6x7bnku=K%iqLR-JTkoMY%x|m?mi9AJfBCyI>^TEoWhsGp>Z%)-ZLOBx zLB!U?OIWd{(8nf9q-p3SMUu;(T2k49Q%n)nVoR(X1=fCQ8XuM?-9;-076cU}K+~5i zskx(Dl6u|Cy5*mR#8yAa`Z@A$aRPP?$+|$kK?ZE>O@M5n*h8kG#WK5}Vx&KvJ1sXD zzLh|AVx;*prY%>>n^~}Xm^5M#z9cA48Jq%Hy)>r<=cII&%Pn1!FNo{8VP>PkBbp@5 z_h98(Nw(z6TEil-^)pI-+iVf6b;u_)=UAU>QcXi4v_@~Ee@#VDN=L&v$k;{mh(}R@ z!Vu3wh3v#d5X8q&GZh!N-RuhrYca0PTLmX1U<_1oBN%d_~ImmDoi8iJV%Tl3*L zx)QCzFCzs@f6v@R%sYUU&&%hcr<4bpO6nBW6R<)*JR~nApSJg5f4MZi;?murWxbS% z{zrB07U$E8=)&>k!4aE)CRt6#d`)EYO73WJ4 zoI+X(iCB(Z(w+GlbLKnG-{X&&m7r#@;d-y5yYLlu=q0BYTyWYCaUcRW0qy zDhu9_s1|~055!or-(ZvMxwQi1r*fTz1*}DbwYqb{VZlLJ6V^8CwS#J-o66Hy*Gy+T zC!ZwvIYyS;Is#`UVmv=3x3-Y3See*UcCPI#JR}%e>S}N6N`}?219{E3hEALWMJ4d@ z;*nY4d8Pf(+BwNb(=j@}O_kw-^M9mdQq?AfdETz*AyYG)UnJBXg;S%{(rY8C90 zMzs4y(q_`L&R5oVNnY@Pt|bh!bkn`o$-ag6edx|LBUe6mN2IXc_4VWADe6zkM$ckM z6^{6Cma<$+rr4{dynj^IYsS8dpfMjQCVMkH1+ixZ=E#He{WKCwu>0W@(8aXVmPq$!skMIAr4~uru-1f7i;7R} zimYO34H!6!e1V@2lJ#`Xfu#Qa;pFr1YfDL2M05+Zl9QbRdj}4s+jx?-_di`zF4BMI zC~M*;GH9Vd^4U^YZFDI>^oqsM5=ymMB;^aSE&)+8gt$nkJKrTfi)E;`RMt>2bZBln zpInYPg5ig)Mc#^&!qR`_QG&>ZRy2&iEZJ~UNOATQgX9%WzC5- z>CGy66y8ImNa>R!M(m@?_EzMCMEZ6i)^{u32*l@{%5)l^7$IH7+J7!ODWi?_GRgUH zq|S1egg5W@OU@j3(HPhMBB2o$Xve!jLxGDlDg(Oi%jj$9Z}5>dTSk4h6&~1A9nn&y zIL#xVIrBh9w~u@x*-8|y@YU1~-%&n|pIcz-7FqM+SYO3VzOvnEi^9{wVUc=SKFgY( zX$8GC^i(KN*uv8G&!0y0kB1iix#+OhB>2lYT=9DjMNEm$g3aCvbMW3HNgs)r?4cP+ z?3dYH-;6g@*!1j077^QRiz~HCcA>6fXi#h^ma~BP)J5|R-YBTQ)!Xd4ufAHgQ&4&b za;ddw5eKO@-fL;;f-Nk?DEYrxj!Z$yTGiD#bobVt;&n*gd5t^+-s+MXu+M)gUUFu% z^s2jyJr$lWKI@=$Wc^_u8!O@cY&cbx&=dC5!OOk=apx|GasMH=j`CLb z&a=ghQg#sJoFlG-w_^E}?#UUZ^OZ>Y&X7hlRHY%CN6@IMsnE;bVi|A!%*A<`q0meJ zsC`-cS+8EX-gKQhL98*slZt5$^nl03P=6glJj6)4>uL0s_u2%x!ax~4GXk^28(WbX z+Dh6>I%tLnm*lptH2QjW&_|xjwrvciu+F4`RxPqrDW|-1aj}C*J zqpZ@|UgN30qGVl0QMtuFoh1Veuw73`c|=NfR|@1*LK-Ixg=Y(+sL%Q6 zw*ir2geA2!((@FV5@$awF^IjD2%V5tS;DAHwH0~rc@s8!Al#zVR?%xa+awan;6W6^D(pr?!K#!_ok*s%q+C{7M7ZxzJ0 zi2C87RMgh?#-i5om964kOImo3w{U*QB*oEyq?34P zGS4R4xMugY>7~|MnztgP6UZ`S73Pb}tDt$LmYy*#SiKH&q+<_tgLPe9)uCNEm)VOy zVk~GVx}}?DAN<_aT9KrNm4(vb!n0N3RLkNzrGjryChRy!_Y^H4H)BKqylfb?B?Wjl zDKxg!%YKklj%ky1v@qLEnK6woWy z1~&9ddJ~`EV+xNAf;`qzO4qeK`RDl|>*ygVwBICt8f9;BNpY8U8U_t#$QdR|T78H{ znmEQ%{EFbso#$!Hqd#Q!ZuWqNUFrU#@N8<)K#Tu<>5%PIAmx%oS*OTrDIr+1sJd73 z;%q5*jjUsUrzFs~wTzl%ypLU6+%ZE||9KkEBdwwNp7O3u6?HhlttFcJtM#b~r(NK` z$t~xpeoEA|*I`>j9j z+>!@+ymRwyJR)Dwdt^0@{L^%h-0s$vJgA~O*UJ8p0!hPi%BZgn!lJ%5nQml0yn|7z z#Y^vM>cJp7M>+bt(u{+Mgoauq@9?AZWMYRo{lT?4jlDUwt>H9-;2Q-}POQ&uvC%+? zEU9JPBpNAJ8GJ^0jkR99`lec*G=nYD8kT20)w6h?s_^76c%iZk%Wd`W4Q26{{NWt_ z6I{xAWF6{ZVx10J6UzY2-}q^kW(!MQ@vu*Gf+U-zrjB}agpHI%1C>bzNUD|O2r9Pp zjcku^jNBC)RAQOOT&;oz(#w1h?HLLiHa7?M z4M_28Qph57jjSJ>?StG?2y6Hw-$cOoA`4n&8I$pBr02oN2)tz|*1(grf;Wwe{xSg? z{^t@hViDQ)K6G?vQ6}b2M7$S{$`;~`Rgg4I&NO080J2NWsGbcNtt@T|8!GE9_vLxr z)M5!aW`%}q`xPj>LfKL;oniPraDHrM`>6A}TJqQdA-1Jdj%nq1mqu5cQ#5)gM2-|w zUBxBOkygZ@s~ijM*#AG5Q0Te=v2QKm*h>d}_N7*Khjs$8k`-QS=~;{#zvfCriW#ew z&=uBlKI{Ud%zLJ3bB}>u<$omP+t(MPZ%x$xFE@tpbw9Y49;|sO$ z37`HkAJ`!+?=ne~JEbg@U%DA~li7T9G_5bvO+ z)>7I(R=_(o^qQDck>>&J1YW|QQ)CO!p`@_Ka>X}AS_>D)7#i&HV8 zzs)aoh-RI^yxjEel6FMSF#7h=3@gsiFj!n41(`a!;{@xB;x$|Li;>#seq?jh$7N;= zM%HSe>47qr${SE^PnEK8N*2N~`ovTTXL> zSl<9yEG1fsNq_i2B-S`Dc|j)fLtoz@G>dFD%1QyFo{{q|v9I7_ajdVrrud{Rz0||t z7j(8Bc%-^2SIVe0QfAcQT3Z%{=!vE0TvBnIbl$nPY8zdX>ZQ|hFhh-)YE;CPawSM1 zSp+dp_g8~8HRzq3)hv5+Ff5SMQQh4t=NMmj2JDcNCS})3*}ux${hO>SoFB|X6neo@ zUP;zEZ#<0@@1$tD*YYkuI%7!rP0YZB#I5l@PAq7M}xT$rJG|64_HicUPHR0ZV05dyBoqQZ4zU<;nIl z27A^b9-?TBTH1O_FrVZ<#nRik?I`gn=`t;`(22Ep)_Ha{bhf}YA&|jK@@#AC<*!B? zi3epb9~n`GvoDwG1wRE#7C0~4b)+BOtmw`{WS<(Qr)|7o=@SGG(#mb{UAphCY*kTl zQHf%{Vw|c;NjZqtk;F;OqNcwDypo@<~!TvDGxB}s){Vi4!avgIvf zo1}S?We*z?^w?!qb1N*H2QTVNY^Cv$ZKKH)Iy8snB#Ue`q52#_}g+j(rC zD&;p3+j{F$FZ}M`7w?Xq&LSFXV&C(M2rlcx3EunfW-usrWbIq1$dlGO>s2d9iM3|r z8k$#0^;dM+@g?$}d=xppS@xUK+^(utn#ua)o_O27=)|JP`cW;~%WBhB z!ls&reHx8qK7!QvZ^c*o(5S?r%%6q<+?k11UVck)g&6A}z zvMx%>5|wE#mzWKjO}CC8xkh!GP+LW132jx$*sksZ$t0| zq-KS0dbEY*ihV9Frcv{a^ziQ&@4K;&gmhhN6L!&1l$=`Eor85!u#@xB&PPUIub0rJ z*nVEXPqH>|;3cE7m--U9JVkng(!)2z;!F4WzbN~vF1MAY-QN~w=G=vuId_&VSzv)h zwj>9JdB)5hW@ct)W?H95V>_O}{@&AT#cEYoR~J6jcCz-~o3(fP0BWSE60NEp#i}>K z4JF)T_qbw5T3AMlx~ENz6TrTx#C_h-T&tR^%K-h;=X{{PCZf@aNb3mWW#m2fSsM0c zUNrjSzu`$N_oSM`v6Q`e;a~i^N6!I12YD5fBW|L~cuj z8hI8i^r@bh3TH{ja%5%yIjZ7Igy#8=ZnDR-6_a^&G4uWX32KgZ02%G`#o?&zue8V5 z(F|&6F&w4+)h<=*?v~=Ew&=|o^yw%DEgX=wzi02W1ys%7M!V|IUn})J9rKPD$>6u2 zKm7EIJ9d_$B3LHKeLu*`VxYNWWMyk$qJJj{A{5`50BntG+}kmyeu7`*RIMj^yK7yG z!}SeOAC(Vyx`qza$=)vCObL)#x0KPAsd{J%WMEl1b1McmV=`iodux7RvvYo|digI= z$_rP?9^da{My;H*mch;al@VZ1E4az_sl5jLZJVlB>)K?mQ}t4=>Tg$!#8BPuGGpHt z=RDz9jmPZS=hzNcLO;mAQef-v!#kJ(G}#-jss@lhwaaU2m6U?K3^b$zM5>%=YTJxK zzdha(wRcrFY)AdOM~#dfV9yA^xXS)L%Fdz{fFRhn7>`;;OzG7+i!&ki+jGr|>GqTUcD`ay(L-u&jgzf@W_uwom;C;yLZIVgMY zEk1m&@Txfs?nCXZYWMn+^G{0pLW8=i3`B7XcyCwD^8pa?C6HHRF+PsnyQ?C6umRL1 zINJ>>!V97p8O1UF$PMR;KgP4|;Yz9Q-w5Y*WG9I5&ae4+Tf16o;7$>ar9YfEWzjBF zGY#qi{K*TSlLA&+`^ICWMC1+3rmpU&xe=j&>RAWh?xVTb_J`MIRo~PB`FkU2q6M5% z0<81Tgn;ef&Zb%t2(R11_y+oBHOR7#?Z0N=-oD>Qt}1Px8dRla#oW@tud*N(lR)O) zC<;7?pk(U8v?T;Pc)$TA#m)5vdsk`Agc&fc1=k~`$J?J^L z`9NZPO!TTigbt3@N$bKvN-dC41U&S&QP-8I=1{*Xr)_JGr*bN;|8KnDW~auxJA8j> zkLs}+jjTu2e|0l`b!~GLREh1kyF#qoMvz%0l~dukMOJ2GDj@*oSz*lw{;(AMy+{;I z;{JJ)+EEd98svRWk5%=nr>ZHM(~(mTJ`)D|qZaK(Q7w65QT0`XcWI`hyQV+#*16`3 z#%iCI4J_-5=2clt)kpRK{{W40+7r}zom0KLqSIHiScdj!uC5C;+p*{^@9R;`<{!k!RlW9EkElM;XXk?*aeraqMpRyH=t; zjO>|S?d}}j1nAlyq3k{FYIOHzX`t^c&F#(pd(1@hCzfv$*fRPX*7a2O0&n$J4u|hw zJK%)OXcU0A{@Ta)qz(bRsG1oDe%KpLpeB9|N6)lcOFj^DPgwHaYHd}!T8SN?=0U&e zSzhZNO9Ce(fE!~VoMrySory}Y-nvrK;RI_bAX1^pU7%O-S{Bf(zhiGN_+F%9%iww; z&>&aEPCy$euPLA1UyuDPKk)7R*Gff=NA<_}!eYltm#eZgEW6@>HNW`xW*K3ggVfl! zpqg9FVHus^9urh+e`dRXdKc7R*+e?9=GT~yK?dLl5dZ9zbk$FLJX^rFyyLmZcJxPcwIXbL zPmE`GS2DvM+LO@$vVOk3XuU0ZyNx}eO|5{usD=5U;(v{-C?=!>DSsQO|H!vJ-pa6U zW8vPoM;lrPJy6xIJ*rQ~)|wh4R}A81MLo6<(+fjkE6byCYf*DFJz9Ce-w=H7%!6YX zXb>5js%-bjoa+D1t$uK)$OICnfLGl8dtBw9_UizqRfJER{Vj_?MaFnOBKP;_9Ef64 z%spn|w>`VjwK#BketQ?-2UsxU1$HHc{gef;9Q-l}G+hVYDpTXON7);d14AHEz0tn2 zPmTSo23B_fNu^By8Do5u6O}U`&RBrh;rr3ves{Dwe@R=6YQI?LTU$~iP^EqYi175N zc<)m`BQ#LoKt~_&C9on~llyD^{rk^@pZTDYf;+apxoE5t`h5qobD!TfAG@!rCiV?P zCwx+V%ly!0%&EgMHiGZ#Ej&sVXUqQ+w~_n{6QfMkcy{ zi*@~9yd8Vq-hB19J-@Gm`~_JM>WZZghI?2nEq1-n zk)>98#{U`djsx+C|I2y3|A^}9Km63tzo%QOTC*D<2ERtmCioRW)qS%67Zuzj|KXWf zp5Nyss-{B=vwzVz!do51myRf!6hyn{G|(n8regY5aC0zv4;tCr3?qsgMBD?istd$* zGi+7nR#DwfG!~m`ukuB^+X6t8L~yU#A6o}J(OKUGdS>pVO^wn%heyq+F%XZDXxFoc zqmw__cOd6SqLxMEN1mB~R7=f2d9!D;0hauIOsXAhZ>@hUJ8WZzdaJJK-U8m72bD4v z<=Nv)`lH+KQQP|JyBbtPNr*?>P?qF}hwGrFTy@9zdpFypCvp z=vw_gC%B8)9xUzt;Y*SvQE^{wRpr1?o7OUHfZk|IF;fe(=2s z=v}5pxTiZi9CI(Y>F$l}u>3_;V&z}udTjAyldUuMS6Hy)F~r_3lp6wr#TmSl1XnuQR4k?`yFCSqaWe zh=Mv4s@8I@JV}e3ji`DMy2ji zl2wa#ft;SHeznHBfJVzIf|ZAnWC~DRz{Ykp8hvUe0K|#nfOTppYDG;n>z0@8sxMdO z`hX{GQ+WUZfQO=Yj^yFQ4F@=JI$TR*AXa4^ZNoj2AfC;8ya$KB6a2ab{_KrvfLNUa zc_4Bn)%DW>P?Jll9qG}k-sdY@<1wg}t zqYGGD0lZWfMVw#jGclExqG}fyjSEN7r>^yatc{F8HD?O`Vs~nc>_QNi_N6A(V;xKT zdrQO5h@@Z7E|3ecBNMzAMeQ2{XB7gAl7KH;{(+tc%^7xHI(ATx*6>W!Q?0D7iRjaG!R z2=aUxP`ZHSO(5gOHiy~^zC&k-SQrCCDZ@G(c0ClUTwn284 zsqvfYkDLeYJ8GqLh0*F4{nu;+=)4luvPrG8z11o;TXX7ts%}Mp~zCSvmQX-VS=hT5c{;;3&4%|jSW^?G)kbD}&-Sp_a}LBJmg8^piYR8(HWh-n{%eeeHTZo!PWAad)edlUf5gX7Beeae z1MoOi4=q<&o9#=U7!)|jx%W05Y^VJcpupJ6ZsQx`0dEu(bp4&g8etGFYF78u*eP)8ay(-5>%P;ExHd`L5k7C~5 z4zDU<2UJCxs@WcG6`(~{Gi9V z)Y_bBE>`b0d-O5Y6V9nP5X<0tGKfy;M&~y8Tb*WKQ*SuF87j}fKwZ-+ke@$U2lVtu zEd+n38MbeD-nldj^aVWX`6D2Qik6%ELC*r`#5yW*u)e`)69`49(faBoE-Wq7wqvV5LlncDN7VQIDm8EOt;X15WyGMOkyI&HP zqi7eQEd#s%mrPVr2w&vma<&$M*ag{!_kTK#|DVORBwtYvp(0>6|-b1Fhl z*a1kim2sf!N7f?G6|gG{^il_q=!)WU(qH<1&w(=|`yOK}CR! z{Vme_TwCg`CbHxIe$J_}jIZ8Z3r2lb6Rw5*-5#}~_veK%2#^)MyXMR#MXjC)&&I=f z^fwJk!*x8S;(A%Q;uC=fE9$lfH=`N#Yj3ZrQ8|c4Z%pp}S_e1je(-M{)SYD@x;f!{ z?HItHUt>f?+RC~H5b5$iGUpfHui2I=aYMCbF^U(z)_se z=U|L~WB2y{mWO@d-5ti5)xpZ9?YZIx8_=}`WKl1O*MMrjw|`GYLyhl`oTvt#NNr64 z*x@?h&+-Ep;ryQ}+NZ`QqV387i+VuzCj3WTm&G9Zo`gz})AQjv?ElSX5LHlTd!r$G zM*r4`iu&{6ezU*+ug~ddt^dg}753(zD^+Tp&8wQ`MDHwr@2%YHT+ZVcI8g^UJ>C1cZ1)0%deGRvvOdq|2KUb5+SBLXKggo{L%4fZv!3ZtMi>a&`eMm1(>lm6lOrABaK z74XRDLcvUMyy3tZWAoK2vZn+7ftAjfOq^|7Xoz@bYGQg~xIgli(%B6Bnh@?oMXk%= z{63J0j%a<=#B__Dxp5V9BD?pWC4hHK?Jqm3m9^@;8}!t&KVq}0qI2y2Ou*L}wtAnQ z7|u3tG-8_|)7QfJTzr6cZ^v}hSG!TIL5_jl>FP}`*tvb+M%x_r{>TC3OjT=QRHaoN z;E&ZdGWP*IZUP!@)HKyaX#3Ae6-$}{H5AVBU+ZO2P5Z(gkF0h5;VDmZWNq&`qUK0r z^q!U&-e0&mur;$8KfeGlI$?7S#HtqjSpm2`73LiuYa3thtO`q8T`T#+f3fGp&L`A8 zn+I|g{Ptblvj%YQuXp6sC}x0PwB~n*E5b3`liD1f7Xi(k;W*`nt78Au!9AabE6Nq- znE35BE%<(ORs zzmBi2M{#1|H&66OeYC&x;Ai7Pbz>E%7NDV8Il$sD($4|88-LBSeF@I6o>}2Ocu?;C z+ZgEjxd&wA$N00nq2e!*&HW#8WL51wduMFK)al?#Q?x=O+DxcX*#$DIRVyQO@V6p6 zzvg?hRS?;F)uyHD+;A3T10R5Up=x1eSl8U`h5xX4BBm$p?freY!d^Q_uOD1n-lsJG zbAN)0>#_Ti)EbGU?9Usbx$yg1yjt-?2P!uCH!R%W69=+*e{|MPZ6$a0c8!GdJ3`-k z_DA=o$E^1M*12PM9GrLkCmNQjC^QLT_pi|st=oefYigCY_aCJ0zs(&$y;zQ!a13H; zk@;viF3SMv|F6n&0YVZ{Je4wF7+bkHN-0>fcB3A2EsLE{^6+EOi>}9Qhx1 z19T6g;NI@QKOz!RC3V-V0nPs$ePNW_TdAG-bN%0x`WSf$(M+%TKcbuc&$^C1srE0v z2j4zb6x!!&+L@W^{?Dob$QIVheE_F=!n-EInkE7~8B%Fg4a4EJ#h4wN0Jqm;@@4WL zIk&GD_>aTHtY@h6swl#C|0TCm`p#{%;I7(q@ICSt z`p+&G;YuCPiK&hRkn#JY<)6_>>yPmK|2#7f^t|79`sZ!4do;WH2`X;&caF$=Bj6|v z$7YW<(!ci^0C$#wXy)xvBBSbms-AuB1U0sW(H^oJ?*IF%b>U2mv&LHwX%1@=tVc9Q zHHp?FYqB-PdQ5X%b3$`cb4rtHO|zz3Gpw1`ENiwk$9h_0wc4z9tHbKFp3$7uxUAY;f zhnh#4$C^Cr6U|f2GtG0&3(ZT-E6r=o8_ioyzV)4^!1`YELGw}bN%L9rMN??~s?lg5 zO_5cr(P>~!u@%wiHK+#D;2J_>(2yERLu(j~QNwCD4X+V2qQ;~#Yf7x8R!Jjk%B+gU zqA9mlSifm1t=~02G(Rwc47Xsj=2t>#X(GL`{;W!P;nTvNl_jH7S}@O^Y>6 zldj3ov|2MYS(f97Y3!OdYrEB<>9BTMyR1%)OXJpfG+vEQ({1gs_FDa#K5IY| z)bv{itRYRVCQp;EDbN&ZiZp}PA#1T_*g9ezwU%f~HD#JHYq_REGj6TaRB5U;6V@6{ zt)@;hX|2~ZXc{$5nr2Olrd89XnXCPED7lThpWI)%0olH8a*(>wsoZGiM#r z3~T1C3)T_MqIFcWWF6CtYnH7m)>Z3-X3aXOS+{Ojr!>==8O^L_PP1v{?efYnpY<3vIt(3wjzUScW6*Kv1e9z$ z37vvYLn*d1&{^mlbRN0@U4$+{m!VYK73eCIW=pqSgRVn2pqtPw=r)vL%e38r?m}6% zd(eI80hDcf2t9%xLrclw-5nUO+b6OUQ0}1-*veKyRUU(0j;X`v84}K0!{~ zXXp#`6>`}$5Cmx<9Rx!Nq=!(*ZNngs4TlKG0Fe*{(GUX}A+OD6V<8Um+jvNT0=A$n zWXrXQkO?wF5|n4lw-wlAsL-ZBMYdv_1^Nbkhkigmp%PoEEe?u@%4`WxB9sJ`+mfLa zC>2VB(xD6}6Uu_Jp&ZBxRoE(RHpmV+ASdL4+)$Ox19>4It@8Y!lEVGzGQVrlA>V7Mg?Rp#^9W zT7s6L6=)S&gVv!9XcO9kwxJzp7izP$+YV_DYddU5v`4j_wk}(@?U?qs_JsDN_LTOt zw#U|MJEQHhoz?c+&S}qUFK91nFKI7p2W(fgSGCu)*R?maH?_C4x3zb)ceVGl_q7kS z54Df9kF`&5YWu7mvwhKi z)oQemR;wMiP1tnWNgJ%4vQ66%tzL_2XKa{u);4FGx8d3a8=*C5N$sMI(k|I(Eu%GR zSuLkswyoHB?W%3fwr&%&qSmC{u$i@zcGI?HleLO=+h);z(|*_P*nVh#YU8x=+5~N) zHc7i{i?b(d(P3( zKCNFH&<3?3ZLT&?o3Aa<7HW&M#o7{WskTg8uC35kYOA!>+8S-GwoY5GZO}Gqo3zc^ z7HzAxP1~;R&~|FOwB6bsZLhXZ+pitarrOi&>GnZwhJ8potR2y2+DElx+HviKc2YZ~ zoz`aAv+Xn59J|$Sv(IYhwDZ~p?V@%`YqvY>%i0yK)4r-*)2?ebw42&3?Y4GDyQ@8< zJFIirkLZr--1cKSkNvprgzlv7lHPM~x+}V?x@)@Y zx*NKix?8&2x;wgnJ!rqHyQjOad!P&1AL<_Ia_x_GPjpXp&vegqFLW<;uXL|U26-hv@V=RF`MZw_`e7S70Y}g?59k$WH1g9j#+@ zMjfl;bj9`(JFhFX3%W9UxxKP$MbPSRD{tL(B)(OGogbl-J9bk+8sx;S0DEZ)|rx+Z&#u2xs4Yqrqc~=x-s3jZbCPyo6=3| zW^}W|1D}P@!RO&2`vv$Sd5lZh>3jHn<(`fIHzXxEt<)d*ME~ zA0B`Q;URb!9)aT>364>C3{G^6!xQi%oaC5-r{NiR7M_FW;RQI^k>Xf{QyoiinqwJW zfmh)*cpct=(;XR(Ovfgi<=BF^;cQ2a!|Jd(cHmw35ONqfg4i7n$5F)Ta5>x#kHhOY zhWH%E5x*ng2s%z6Cy|ij6ml9lgXB8SBIl6v$OYsgatXPN&kSC9fnp`*xg6}g67 zM{XcDky}Wyqr`C=xr3BC?jrY)`$(DN0rC)eggi!`AWxBJNV(%V@&b8@yh17*uaP&% zTjU+`9{GTLL_Q&(kuS(sM1w$x7SSOvf*^VXMKAc?;;*cgsv!lfkk0c<8ND`8av^v@x z?T!>A73pxKA?Zj4(&@-VvXE>f2eBeH#Ex`1x*ZOr$IT#WWrH{)FO4r zq@x~bKpK%Iq#0>JT9G!S9qB+ikuIbg=|OstKBONRKn9T^WEdGiMv*DUv||hzM`j!o z$Rsj_%sQr#ImZk#i_9VO$O1C&Sa2*Ni;g8^$+3*AAgjn4vg}xKtUA__4P+Bpb8I2o z$PTjZ*hLQM59^QUkLr)rcAB^$xvL@6x;V9=+Y^)%)~*eLx@7 zhxEDnJbk{tKwqdY(iiJX^riYTeYw6uU#WLEtMt|S8hx$4PG7HY&^w)t`X+s|zD3`v zZ_~HyJM^9UE`7JYN8hXO)A#EK^n>~#{jh#SKdK+okLxG&llm$BwBF^M(a-AV^ls<8 zenG#e_c)jI%lZ}ls(wwsuHVpmoj&KLeoMct-_h^t521(ABj{1|80vQhoX61<=t=Yx zdKx{02AyZobLe^W0(ud>gkDBN&Rpje^eTD{&2wHyZ=g5PTj*`{4w~;QaNb4lp@q)- z=mYd2TI4KtmN*}wkI^USQ}h{H>MV0UN6Vcr&=oj=WszD)Ci|SAqMNmD8q8N&!1ZqG@ltO8gLF=6LP9w^q4NeZ_Q2}jq zifEJ5gql$al~Dz4cD6VzXsh!Z+UER@{y=}CacH|U9_?^;I=h?+Xty&FO+tH|z0N*o zzjMHujHaNe=%91RIqXbBN1UV1G3U5*!kLa{pqc2TbILjG%tEu#8D|b^MQ!M;(~de& zC+b4os0a0;bIy6E4_$CBI+vV&G=K)t5SokTq07#Ev;Zwci_l`U1T96&&~mf_twgKP zYP1HeMeERdv;l2Io6u&o1#Ly!&~~%~?L@oKZnOvOMf=cxbO0ShhtOek1RX`k&~bDE zokXY5X>aFc$ARf+e_)V#lyV*KsV#mFzl!oy1aHr?Au587$Rx7CVQX$1Y$Ou}j!x zEX|efx`Ji6GF@4&tJpQ{I(7rQiQU4oUAM72*j+5gbq~9bJ;1E4hu9tHZ?L!6JM2C70sDwKT%WMd*cZ&{`if~V2-9LZ48{;lkD(Zb;TVA# zFcPCM8e=dc#$p`CV*(~(E|=S7!pxY*C1En=b@^Nh=66}Jfa@Ff9s7X=T_M*`EY}r> z<+V!m6ahl_)YXVJVa-?z z){3=Z?O2(s1M9@PuyR*7)`Rt86|O$49~;01u_0_28^J1FRjyI2+BJraV-wgUHib=N zGuSLvJq-!`874Y!lnUwy_;-7dwO>#*g4f@niUL`~-dyKZT#h z&)~JLI@ekJ9A57_k6*wq;tj4#_+|VGeigrlU&n9YjjkrwO}yE43vY4V#_!;F@q74v z`~lwTdWb*5ALCE(r}#7cIsO8FiNC^M<8Sb{_&fYP{sI4pf5JcGZLTl)S6qWbxE9yp zFy8J$a6OLV7>?rvZoo;L!fBkrjW~;QIFAdsh?{UTF5w+68CP%%{tf?*|G+z4Kk+y` z9`AA`;E8w=-t9`pQ}9$g4Nu22@Ju`l?{Q`0y{;U*&t=7JxE*)kPTYm}yWF@3_u>OC zAMVEk_@FC@hwxlH56{O7@IrjZRfHGgC3q=5>?*^{@d~^WufnVG5!a}z2Cv1(Ty=Oo zKJJ=uHQZ@5Sd_eRw}UfDhtB_%J?# zkK$waI6i?-;#2rEK7-HVbND>IfG^@p_%gnNui|U?I=+F=yB1uV_!hqC+QxVACD*cR z7e7QCCXNtCiDSfZV#T%UIzgeOI#1kUj z{gik{JSScdFNs&gYa+v)>3&0GxwG9l?zhA{;yv+!_(*&rJ`-PvuY`tx2rZ!_U;-iZ z1WI58P7s8FAPI_~35GBdEWr^xArK;ABFuzD$b>>zh;PJq;s^1Qh$G^O1R{}0B9e&| zB9%xZ(uoWrlgJ{ni5$X8*a$n}Ae@AYu)1w-H{l`dZZF{@{Di|DAe?TOJ4l3xTq2Kf zyFKoF!t3_A{q6#ykSHRGi4r2<4!T3`QlgB=b(a$rL?w~ut|F?58lsk{BkG9;BHvx$ zZX^obMebsE6VXhx5UoTT(N2`OJBUuAi|8hLh+d+P=qCnl=Cb30q6FbB%amaAkaKv!baLjPraKdoX zaLRDnaK>=faL#bvaKUiVQ06XoUou=aRJgAgt{ScxD&5x&Hw-row+y!pcMNw8_YC(9 z4-5|tj|^4r$A%|{r-o;S=Y|)CYWGXSE5mEU8^c?}JHvZJjr)V)qv4a`v*C;3t3hLc z3|fQE02>g4-hdh~18yJ;1_NoRbyEh~z!;1M*1#EfgJ2L1CWF}^8DxWEuo%7>z8iiR zej4Ho@rDFLq9MtUY)CPr8tU9>hIB)Qq28To$TDObatv03&0se;3{Hc~;5K*+UW3oz zHv|kpL&%V8$TQ>{3JisYB15sE#87G|Gn5-D43&l|L$#sCP;00&)EgQMjfN&ev!TV% zYG^aG8#)Y~hAu<5p~ui`XmB^W`wabtCij40&@g0Zb`Kjy45NlI!?(Bf`&Pa38S z(}o#Cn|szUXP7rE7#0mnhGoNwVb!o^ST}4KHVs>bZNrXX*KmkDOdcVRlE=v7q>*Gvj^s&!6iE|lCM8lP71Ba}BfpbB$e&~!8BZpViDVL) zOs0^jWEz=H_PP7r8Du6o;Lakm$wBv!JBPHAHquTyNGItchutG?H#zF|kY3V9`pEzp zBtv8_Ip)qI^T`5o++9c(k;UYMyM!zy%gA!Ff~+K~$VvB&a*kYe&yx$}BDq8^lPlyZx#nJXuaO(>P4||2+r3V1kelR=d)FQ3 ziT7-g+hl@ghukF(QHh?z)Dh|^b&NVrouE!qNuFfSDJsR2>PhpQrp{1jsdLnM>H?MS z$?#mHE>W4D%hVO>Ds_#zPTinxQn#qv)E(+Bb&tAFJ)p8Y52NWL-dP}{d-cui_kJKmXGxde~N@*yF(o#AKrVvU`p%g~p6hRp%lA@>_kJUp{ z3}y2eDVE|WyN9O)N~BDbnUW}(a(J8`g>re^9*@UDeWSipKd7IS*W>f}J#kb#74Rfb ziBu95^dwU$R4SE5rBfMHCKdAJda|fIPd1hB$)T*2jj~e?%1IS?3Oz2$O%-`Ol$Y{R z#U4Kupn_D0%BAwCe5%A#>M5YgJmsDWPa#!A6;mZtDOE;QddjH^s*<)krl_%~T83N>zK>s2Wc@)j@SqT~s&KL-kU9RIR7Z(@zah^`1d$h#ICEJR{U7 zHAan76VxO%MKyYwJkwOOXNGF=%u;jIJhebAQcF~;XPH`|R;f168nsSsP@B{iwN33% zyVN22FnxqRN*|+-(y=jjXdMfwtbnZ80_rLWP~=^OM-`WAhg zzC+)o@6q?^2lPYw5&f9%@I0ZP($DDU^b7hW{fh4Nyr$pKZ|N@2JNiBSf$sKvq(9N0 z=`ZwGT0=v0kEhq8rTaWOy59rS2(7148l!P~z(ddmnxqFk6iw3%J>)UcEX~n8Ezlxu zqRsTMN1{hOGCk^1Xbb&~{!ag(f6`-~aZel_PfvIf=tMe+p7bQsDRe5GMyJymbS6FJ znf7GSGoEaE){{e9X&Y^)9ki34^SEd??V-K2kM`36I!K4;Tsn`=rwiypx`-~OOXyO% zjGp(D(-m|jT}4;ZHFPb#;HjhQ=?1!yZlas%7P^&gquc2Yx|8mryXhXfm+qtc=>d9> z9-@co5qgv!qsQq9deO7wnWU%aWzRG{L(kGHo;iA+UZ5B0C3=}&p;tYt^cub9S*O=M z8}uf-bC*;<~oz)y}{gMZZXN;+sqy2E_08$&pcorGAZ6v?;|G7`AKziLrYfUYT)v6~^VYFyEN(%n#-# z6UVr{9&bF8z<9lhjL+-$2E0LU$eY9@Gbv0elg8wF^StRyzBhv@@D_SAnJlKro6Qt^ zOT4At9LCC&d2NiHaWLgxC*xw=jEC_uKE}^fcq_dDrpjCGt?|}+gG`9YW%8JOrp{aM zEno_nBBq!rVM>_>Zy8h0R4|oH6;sXBFttn_Q_nOojZCAriD_n9m{z8ZX=gf^PNs|L zW_p-jrjO}o2ADx+h#6)^m{Deo8D}P#NoI7MMk5iCJcvyv^PfW|e92 zt}*M(2Gi=@WZJx2%r>*b>@tUp?cNUWVPmKFh_TDt?LBHdW;|{@VeIktdi%U5ji-$L z-qXf2#Xan;|1eI<0a!|;}zqecgTCyIP4wqj(V>duN!X|ZyIkIZyU$FQ zyT%FcJ>z}j1LLIkq4AONvGIxVsqvZdx$%YZrSX+<$~*0y@xC_Bdfyn|8s8b;8|S$&y zdY8N=quD4Km%Xxa#j6-C#&5>&#vjI2@0$0gaornd-0;R56O4(*BxABM#klEBHKrNU zja%LfW2Q07m~G54T8%cN-RLknjV`0x=rMYYKI67`$Llu+j6q|_m}|^4<{Jx)g~lRd zv9ZKhYAiFB8!L>J#wugAvBp?ytTWad8;p&{CS$X)#n@_WGqxK$jGe|Vc*kkN9 z#`*e;{l)=fyl>DrWE?h*7)Om`#&P3>F~K)!O!Q3|lYG<08RM*R&Ny#eFedvJjZ4O5 zV~TIZxN2N8rux>68^%rJmT}v-W85_!V$*zw*>v9#_9%OdJ)0gEt z!)E)=vgg}~cA z>-XJd@3HsUfbRkOkbT5HW}mQ6*=Ou?Ht2i7hI}vCSL|!{4f~dT$G&Gju(`gE>?ig! z`-T0=YFLQXvN{%K5mwKlEXLw2!5UbSrC6F}SR>1_9Luu;E3$b$6KiHAHs2?+3Tt5t zeBapb><{)Q8^^}832Y*p#3r*TY$}_^rn4DrCY!}(vpH;`&&t|ZJ6q&)uuj&+7W>?+ zhxM{P*3SmmAY0-KvAJxiFOSV<3)n)oh%IJI*iyF4SH_mJ6>Pb$lC5H^*$Q6`Tg%q5 z^=t#%$TqQ+zGk+Ct@5?9ZEQQ+!FIA;Y&YA(_Og9!KRdt@+*W&a!jtJiEXyvPFLo@Ezg~b4R$N z+%c}v*W^3SHTzn8t-cdno9`so?mNYu<~n?xzAj(4ug7UFEKEW4`O$4Q|{w;k(J*;wF8!xjWolZpwF$yU#t~9&(Sk z$J`Tc+Bf5S%FX)beDl6%+;i>)x8Qrpz2X*qOTO3K8*bV6mV3v&=RR;Bxli0@?hE&o z({K={R=YDWM zxi~JKOW+c@Brcgt;ZnIYZq>KuOXo7Ubzdfz#clXDec9ZWFNd>oHqOpDxNYB#&&loj zTwI(#-tXo-oR{-)elEeE=nrr~F3BI_a=B!Gia(Fb=L)z&u81q zZjD>#HaM@}=lAH3 zPvVpL8h;9(%BS(^d`6YgtU*T8zHGZAn;5Yd#ew*LnclkrYVWH38?>{0O6$bprgyX^q zVbFh4I3=7G&Io6PbHaJyf^bo|BwQA*2t)p>!ZqQ#a6`B$+!BWUw}m^xU17w3Pq;5U z5JvqEg-60;;fe56cqTj-#{4gYm%_OJl`!FdExZxl3h#vX!Uti}Kjr@@d=jSppM@{N zS7FAl5g@y~4WRCv5mP{ab#&5Df*cNt#UEz>;SUe&g6_1I>#S`L5@sxO4JR_bJ&xz;7 z3*trbl6YCXB3>1*iPyy&;!V*Na0hOQw?$9jj(At}27G~g;(hUf_)vT#J{F&d{=if5 znHUHJ1EIik@rC$Od?mgX--x+^x8ghTz4$@=D1H(@i(kaAqDF*7t*8@W5fSwwDqiMM86migJMX`74yV= zu|O;o%L3(rBC%Mk2$YDWVwqSOC>JZlO0i0;7Hh;>u_{m?oi?2@oi&{^oi|-DT{K-X z)dnt`u9&Wxu9>czZkTSGZkcYI?wIbH?wRhJ9+)1Q9+@7So|vARo|>UYK5*UYTB- z-k9E+>H_af?@b>}A5EW3pG{v(UriblWYU^+CfJ0S^d{7VnQ#+fGMMTEq=_=oCdOnm zv8IMVV}LX9rlx>k5=|ykbHHqpOtMKaSxnzd-%TxnAEuwC)rP=ly1r}Wty@~*`^$m)nqf-O%9XOp{dAJ zY$`F8n#xS&rV3M~smfGssxj4?>P+>f22-P{$<%CWF}0f7Ozox)Q>UrR)NSf9^_u!j z{iXraplQf7Y#K3*n#N4yrU}!eY05Nhnla6q=1lXZ1=FHw$+T=*F|C@`OzWl%)23<5 z)E?M2?U;5=hs=k~N6bgf$IQpgC(I|!r_86#XUu2K=gjBL7t9yUm&_f3%jPTQtLAIw z>*gEg&cIFcE%R-2SKyBMuKAw1J8<9p!2Hns$o$y+#QfCU6X*>*Ge0-KFuydvGQT#z zF~2pxGru=~Fn=_EGJiIIF@H5{%#c}Y)|p{5V%D2cGiJukgxO#w&6JroGiIZiHFIX( zESN=eU!Xr=GMmi<0m&?z74u-gV*Y0SZvJ8ZX^u0;n}-6!fdunNAkjP;NHQmzQ_QL6 zG;_LnEHEC(Fi!*~1DWP5^Hg9uFcX*!WSeu$R1aGG6aw|P0> zF?-D`fz^P|>^H9k0_LDOWL^*Cn)A&0<^pq}xyW2>-Uw_4O3YhV| z%~j^zKwPleTw{(8)|%_g_2z_NgSpY%WNtRMm|M+l=EPu9u-%*->@cSUJI!6@ZgY>h z*W71L4fdM{%!B5%;E;LPJYr4{j+)2J)3 zg2$v_Fcds4ose>aC#6%;X(=ywMmj5*Qq>IueDL+^cyet(4i-N_$E7Dcznsi;d zA>EWpf~CP*(ru|Mct^S`-IL0L_oWBYL+O$9Sb8Eol`4Xj!DmucusT>1d@j9^UP`Z| z*U}rQHuzS0C%u>If*+)h(kH1t_*wcQeU&s4Bxxm`1WSmdmrx0l8iKe)NCt_ND2bLD zgH6HaAS1N|jS?$yQfrWx+Jb^4N+!uHNm6^TBPdIqK}G5cTBL8%cd0x0L;5N81bc&V zQoPg`Opp?#B&k1`ETu@PQks-5Wk{J)mXs~!NLI-v4Fv6yLvl(k$t`)L!Jt?2Nq%W4 z7?6TeNE#02N_kSgR3H^fMN+Xe5-gEQrP1J6uuLkKDx^xON~)G>r14;_R43I-6Tt?l zQEHMVgUwQl)GD<}?NW!-DNO~ZgI&^0uv_YpdZj+8UmB1Gr6FlHI2Rn2Mx^=Rs5B;x zOAEmXX;PY!rllEaR+^I*gG<4AX*swctppdPC23h&kyfQOX*IYOT$eVa_28zoC2a&Z zgWJ-Mv@0Ew56eg7qw-d8J9tdq2_BbsgD2#;&`CKyln^>4Cx%YTXXLZ;Ir+SNLB1$o zk}u0w zoEORu1>}NIP%aFGbuLNO?$LMgPuC`N@m*Q4DidXR|ekGs;m5`FF!p=$hra<%Z>^<(B2P<&Nd9<(}of<$>j)<&ovF<%wl8^wjdq^4#*m^3w9k z^4hW$dSiKOd1rZV`C$2I`DFQQ`C|EM(O4jh)}ph(7Q~{rpcc%s9l|Yy#b6;Vl!dl1 zmYtB%!df`XZiu%C7SR%yYqFRvl0~*C7K`PZB|bMH_q*kX<)&5~}(uw+`YEZLSEi`8PY*ewo=)8ewYEgp;4;vGiK{Ed7=N%b;b*GHe;Kj9SJlq^s8<4-5lZh>3jHn<(`fIHzXxEt<)d*ME~A0B`QVYy`p9)?HYQFsgtH=>fQ_)lVzroHGi6HmfeB3gABFc@4pVmSpLwH&jYhR?vqEob3#@Ok)z8%_{@ij8 zz7JotJb)jY6L`(?6ux4427d+n;H#EUkH3Xr>&FD>^h z_br7;5mJnlAf?Cy%R|c}%VWzE%TvoUOBwQ&r5y2DDiDU1X{|)65Zqdg)F8D8%UXxj zBMnF+(u6c4EePAnv9=;yYa7C|wj&)#C(?yW)Y)x4w*+5kVRw( zSw>*QWHnn6#A3BtQ3OL62ou2(7Q#ksR>I0bxQN}#L->dQaac*K(<($wc>m(I5w`T11EFk%LwPVnj@c8L=Q%#D=U`SFHqc z$O`LLyGYg}9NU)?-!=;zf>IcO!d{y~sXfKXL#$h^!#1$RXq~a>9B9If|UL z9z#x9k0U3LlgKILG;#(xZ9QW>i=0EwTF)aFkk65G){Dp`1d-mxa4NoX>ff~KN(tzTNx z(0kT&^u9F%%|x@%Y%~YWMITrnTJz9+^pUjyEkujZ$JS!B1T96&&~mf_twf(#pIWQX zYV?`)D{Bo}i`Jp_Xam}a`m79F6WWY2Z7pak+J@q`cC-WSM7z*#v zP>yX79YTlE5p)zCL%BAdZ5*9I`L;=P3Y|s;wq589I*ZPs^XLM)hze~Y+Y&0aEu#_} zj3OwCVkiS;qEeg8hNCQ0Zeybyl#42CJd}?LP$4Qp#i#^T+Eg|vss^cs5Fb{#!qJ8L^5GkeuetbP%I1!$0D#Bwsl)1cGLES?UpSHi^gKGSS${U z$8Ov1*b=Zr?5-^d`_h(--Ls`&saP78j%8q(SQd8QmW}0LxmX_dz?P2{V1-x_R*aQk z4{fDb8CH%xvQ=P}SQYlzR*ltQwOAcik2PS8SQFNawP3AS8`h3>V4YYO){XUGz1S1m zQ(GU_k3F*uV1w8Y_LXfI^VvqQQEUtw$0jfa!6YUzoS4E`1e=(~c40HvEH;O62re;? zEnqxi5nIBRF+Krf2!>)9#=w{ujtK}M!NNoY8xs>8jEnIwJ|@6~n1m2vVoZWb2`MJS zD z_F#Lleb|2N0Co^t!B(+D*kSAlb`(2?9mh^!C$UqQhR_nHu``&CIE$Ub&SQGw0%jmS z$1Y-*u*=vQW+Y6+70gUr#VmxCuo2g=>(~v9Anb&LSjTQ+UtqVe+t?k9B<^BgV)wB7 z*aPe#_6U27If*Bji+GB;iD%eXm=6nOgfYSy9wLGf$%tY^Gh!IAj5tO-BY}~~NMa;2 zQW&X>G)6ijgOSO|Vt9$&L^dObk;}+q?HqGkO@kj6Oy` zV}LQp7-9@FMi`@vF~&IK2r) zW(G5pnZ?Xz<}h=adCUt$KC^&X$Sh(OGfSAI%+HB3W;wHhS;?$oRx@juwahwZJ+pz? z$ZTRZGh3Lg%r<5_vxC{m>|%B^dzihPIe0FfhuJ?jvBFVQ1PA9K~@v%Z}k}JI5Z%3S)8Y;Vhm#g2lH-vZ7c5do(MC70Zfa3GE_# zJWFhs*roOaRw65jmCQuz-0#+eQWmnsa zSQ@+5uCo`jN?4_=GFCaOf~B`tvZ`3sEQ7s{PbRPT14f zcDut)+SAz?>`ZnRJDZ)ucG`2~eMmyOLeSu4dP;YuR<| zdUgZbWp89Rv76Z~>{fOg+ih=Wcd$FzUF>dl54)G$$L?njum{;g>|yo@dz3xK9%oOm zC)pnR6nmPzi#@}hWzVta*$eDN_7Z!U4YLt8%Es8CoG?x}CxR2niQ+_aVmPs!I8Hn# zfs@Ed;v{oYIH{a8PC6%pV z=YYM8bI@MSS+Q4eDmhi0YR;Y%v~xN*ot!RC zH>Zbl#NNy4tC3#&A#AW4UqMc}}k3ZU?uM+r{nXp0%H|_i%f;=k0yme(nJGf_;!X#2x02a7Vdg+;Q&b z_KWrj?j(1Ld&xe{-Nl{Z&T{9t^W4k!1@0nuiMz~&xd<2KV%$((7%!X`!HeWY@uGP# zyjWfwFP^t%zhY0|CGwJZ$-ER^Dld(f&dcCs^0Ii@yc}LGFOQecE8rFKig?Am5?(2< zj91R9;8pUfc-6cbUM;VVSI=wUHS(_7n|RH<7G5i_jn~fW;C1r4c-_1nUN5hY*UuZ^ z4f2L~!@LpRC~u56&YR#(@}_vxyj{F&_8HzRZ;m(5Ti`A7mUzoNn1}FC9>xphhw;Pt z5&TGg6hE3D!;j_1@#Fak{6u~dKbe2sp2AP%r}5MI8T?Fs7C)Px!_VdC@$>lw{6c;a z|AxJoU&3Fvm-27g%lPH|3VtQOieJsI;n(u(`1Sk-ej~q$-^_2}xANQg?fedYC%=o| z&F|s&^85Jx`~m(Te~3TKAK{Pk$N1y?FYLGM6Z}d3ZTl2|n!k&G$3DZK<I=zd4haFfuK-O zBq$c}9DGNKK;RHMM2=EHnV?)yA*d8o3B-g%l%+Vld6f_B%1ucSB zL7PDCXcu${It5(0Bj^?M3Hk*Cfa6bg%k#ljL{sjy5~ zF0?raM}^Sts1!OJRl;gvjj&c&C#)Bejs{_)uu152Gz(jVt->~8yRbvpDeMw<3wwmU z!aiZYa6mXHbUB8E!@?2asBla;E}Rg$9h1T-;k3}>*d?41&I;#*^TGw;qHsyLEQE!K z5EWv=P*IpDT;z2`h$2N%qG(Z!C|0!FvBwc7iWlv5B#074Nuqs@WKoJJRg@-57iEYt zMf)8G99g1+j%?A2BS(}g$`j>_3PgpXRY#GiSX3f9?0-eAcort>VueZQ^!uhqzPR zCGHmYh%Y)WIeNvH9ev_8N56PLJSZL#4~s{{R~)0_G4Z%~LOdy+5>JbFiD$&K;yLlW zctN}(~@118Of|ENyDWP(x;ARj!5ZOjwq?m5iO08#!BO)@zMloqBKdGEKQN7O4Fq2(hO;)G)tN- z&5`Cx^Q8IG0%@VNNLnl{k(Nr!q~+2IX{EGES}m=SGDs#_E3K2_WWBUO$|Bh$hisHK zNt>lD(pG7kluPo+b}66ikP667X_vHH+9U0i_DO}Li0qdRNX6u!bVxcZm5?LSQR$d; zTsk40luk*dq>P-F%E?_)1vw*~mCi}$r3=zUsghKYOVVYjnuMi@6qRa7Od2W+lZDG7 zWRbEcnU>U%(K0=0AdO^aWht^$S(+?emLbcOWy!K-IkH?? zo-AKhAS;v=$%WS+lG~)+%e0waYqW zow6=jx2#9jE9(QdVh+d#Wka%I*@$dZHYT%@Hga4xAtT61*_6yqI>>3+F4>H1RyHS_ zmo3Oh(n&7LT%?=ykV~><87xC&s0@>N$=zhAJWRfa43|g9BjtO^D0#FzMjk7VlgG;w z=x;#U^LT1XdUYSld+08MZ6+Gk*G*g zBrDd)6h*2cO_8p+LS`s36=m(XHrF^eXxkH^_d)fMQTFq!?C= zC`J`yigCq+Vp1`sm{#mk%qV6RbBcMzf?}OqR4gf$6|e$PpbAV8sti+xDH63lsCyQ$V_FH@)nt`%u(hlZMP+6ob zR+cF5kax*a<(Fic@*Y{PtWZ`etCZEs8s&YmR#~U4S3V#cl#R+J98o?dN0npBapi<^QaPoZR_;>HC})*(%6a92 za#6XYTvozLM2RXfJoLSx=dZJ);aag3U#I0;H*+tt83Ior^#8Xu2a{m8`O>J zCbijVaW<>1PMec(wy0axZR&P)hq_a3cRHM1>TWgZ>{0is`_xWnzj{DDs2)-et4GwM zYM0aP98-IoUgvJ-xOzf8sh(0#t9PmQIA_$e>N)kidO^LYUQ#csVKt&g)tEX|6Q&8* zL}(&4QJQE?jApMhRuiX**Cc2XHA$LeO^PN}lcq`6WN0!qS(x-bMr&iV zvD!Foyf#6bs7=yda3*V0w5i%OZMrr?o2mWWnWfFv=4dZEbG3Qed~JcYP+O!e)|O~X zwPo6JZH2Z{Tcxem)@Ww&NgkkwnKZx*{SW)c58dI zz1lu)zxJy0nsY#V-8rbe;T+NqYe%%B+I8oc_NH@OJE5J_e&L+bPHT5*XSB20Iqkf5 zLA$73(k^RZEuuxWm^M@wrVH0a=puDdx@cXD?v^uF7pIHYCFl}$NxEcRiY`@`rc2jl z=rVO#x@=vJE?1YQ%hwg?3Ux)gVqJ-@R9B`e*WGqj=qhzpx;xHlU5&0*SEsAjHRu|3 zO}b`Xi>_7Irfb)A=ErbY`b2$_{;~6kGg<%CnWBH@Ox369)AbqpOnsLAD`&PoN1vh%ZGhD6uHhsIkL*J?I(s%27^u78% zeZPJ{Kd2wl59>$tqxv!ZxPC%Esh`qM>v!pA^t1XoJ=2A|=JgADmTOVJq+iyvU9cX} zqk2pqY6vrg8#pemE5ZnO%#9C4));Gzhh0Zpb;hHvW3J<_dSipJ(b!~cHntc~xK6rSjcvwuV~4TR*k$ZC_85DO zea3#{fN{_`WE?h*7)Om`#&P3>and+toHp(<&KPHnbH;h&f^pHfWL!4FM#P93F=MDH z%oJ{lFh!c8OwpzoQ>-b@6mLo}C7O~<$)*%jswvHM%5~b6Zptv7ab=paOxdQht{hXY zDbJK|DliqAicIHR=Uv673$D*y7hNT$Qd60!+*DzzG+lCCc2$|GO>3?iQ?04abj4L~ zYA`jLnoP~67E`O~s_UAo&2-(>Zo1*>Fm;-`Ox>m)Q?F^=)o1EA4VZ4a22DezVbd3` z5!0w?%rtJAFio1KOt)OOUDKvrraP{?t{Ky;Y0flnS}-k|zH}{_mQAn;F`*{R6l%Wb z3NweBBg~QJD08$q#vE(D?}{@&aK)Pw%!%eCbFw+boN7)pKXg5ErJFO%k6oGOEOWN` zi7UsPYtA$0n+wc^<|6Y`*E3hK`72k6+2<-Xmzm4W73NBFm6_qLHrJSI&2{E_bA!3j z++=Pxx0qYaZRU1!hq=?-W$rfjn0w8AW~RH}JYXI)51EI}Bj!=_n0eehVV*QknWxRW z%roX$^PG9!ykK55FPWFkuo*FAEaMiLTkf8)DBP14rF+UUZP{g+vCLZLEGqZBWx=v&S+Xo!U<+bF zEtnEwz?e%dHjGN^6z1+FE0+wbohdtqs;jtH#}AZML>pweD7Ho3-7l zb9Y!ftzFh`Ymc?p+Go|f`>g|3gL}|AWF5ASSVyg6)^Y2E)##qIPFbg|CigDujCIy( zcF$Sotqayg>ymZZ3R^91#EM$2Zp>qv(?)gY>l=iTeGdj)@p0Bwc9#uowhDpx2?zKc6;2twmzHJ-ESMP4cd0Q zhit>P5!GpN^O?QSp)Bc4!%bsn|vEOp%+VkxB z_5ypMy~ti{zwN%`F0tQrm)gH{m)Xnh74}MdmA%@2&wbxrW3RP8aM#)E?G5&a?nZl) zz1iMkZ?(7C+wG6skKG;iC+?^2XYNjWm%ZEGWAC;1*}ro4+Xw7}cAtC5K5QScGd!dA zG5ffE!aixAvQOK0*_oah`>cJ=K5t*JFWQ&v%XZj~*l`cbgW54W+Y{;tbA&rMo(M;z zBgzr&;Cf;lu@0Vx?}>8=Jn;^pC&7{ENOFig$&M6<*dy_zI?^0cPr4(+k?D|mvK-lt z97nDr&ynvaa1=U<9K{Z~r^KP~lsd{B<&FwRrK8HB^r$@5jv9yBQ|qX6)H@m+jgBTq zv!lh)>S%McJ31VljxLAB)9uiDdK|ruK1aV}z%l61dGwwk$FRfT8F7p{#vDe^xMRXG z>6mg%J9ar{9J3CSXU<{v%!7}!EI1Y&OO9m+>;NBo@SqON5lY%TVPrTNK@y%wGK!2Q zW5`%Cj*KT0NV_MIba;};WHNyPCFjU_ za)DeVm&j!jCXaX!5+yM*)EVXscOLZ|^F%l!oyR><&S+F zNzW-yiu1H5)p^E~=1g~HI5VAD&TQvd&pA(yGuL_EljqEL7C0|>3Y|sHVrPl7)LG^% zcYf}va8^1mda9h4Jk`z`XRWi&S?_FcUiPec8l6qfE1qWORnIlgbK^*oinFdLDUDC+2+Y33Y|J!d*{15w1vAlq=d5 z4Z2 z&+N1KtUjBM@Y#J1AL(=YTt2tYJD=Ty?FwS3RrV)!nOmR`;#$Up=sTaCK#M zb@kBd;ngFnM^}%no>)D(dUo~P>V?(MS1+wzUR_(gvU+v(+UoVy8>_ch@2uWk{c`o* z>iyM+tB+RK4nI50J|a9KIifqd@93UmmyS74T{^`+%|3JF%)K+u&icS0dKb=JJ$L84 z_`=N#_b)Oo@h?d(%P%V~>n|HGn=X@=_g_AEdG+$q%TF#pz5ML5?=oYJwZ>f&uSwTr zYw|Vans!aMW?CcHTx;&N-D|6BN7qiQonAY)c46((+U2#iwX18_*KVw>uiaX^vvzmw z{@R1Jhii}57*{w~_*Vp1L|4RDWLKB`!bhgYs# zy?XWb)jL-oUVVJ^=~drV?lsZ1z1JRIBd%Y*e((Cj>(8$HuCs1%Z}4vjZWwMDZ%_Wq-L>vr-@Sfh z{mlB=^$Y8l)~~EzU4OX#X#L4L<0kVae)Ef)r@k=XeR5a+CHLMJ_wGG-@Id#_^YGBa zQ;%*xVmx6!S$o3&yYb2yI1|Tl7S6^wI2Y&Pd|ZGFaS<-YCAbuq;c{GoD{&RB#x=MW z*Wr5HfE#fWZpJOR6}RC8ZpR%si92x@?#4a17vGKV!S~|(@csA!{2;!9ui}UB!}t;W zD1Hn-j-S9!;-_#C;|zWlKZl>kFW{f!7x7E@Wqb|4f?vh2;n(pS_&Rq_*XcG31%x|>}B{EJ{*iP&NvO0|M9Vta`N?;|79bU zQdrZ{^ffAlLj4+rvN^oAuDzkWw5)0KFT#JhIhall`Ss@5nx^80n*65n+M4{T&0)=r zx`{@Dt#tz|Vkx+ff%tcLP1ZH-H}i zuK@$VATR_B10w)v_D;~IonHqgfJxx{z%;N6m;q)1e_$S102YBI09@~#uK)<}BVaS& z+t|Jn+o0@Z089V}SO6Q~09*icr=7n6{tWyA_!aO8uod`Qc^=5a2Lyl+5CLL90!V=X zkS`E;1NbHICqM+e3H%n2fjn|R0Vn|#pawL67T|z9zXoW)N5Ef!cY$rd-;S>XdGvq* zFajpP3|N5eAkRC%&w=-V*MYwPTYwLMe4qd*1d4!Spadud%7Ajf4))^!NWclW05|Zr zV^@H9B~S%a12sS`PzTfl4Zv=YcMq@^*az$f4gi1MOxgJXC~yq;5XAmghxh;A_21I}BPT)LQ^0B9@8chXa-l#N5Dr8Dkw6p>4a5Mk zz~7ho`}7VFiv!|;1RxPe0+N9gAQeah{=UrLr}>-zHI@$YWB{2!7LX0(0J%UO@b_i@ zK1~O)ARrhB0e%Pk9{2$a56x9YFdu3bp#{6zZ>@r%>gF^lG zuPD?#z~HYb)aW-U)aQOfp*n!h-%_aW(kaxh0Amn^+8#`yz7;~D-UpPwqfqOAPoe(y z4;1Q6K=>AgTK-20_4T(Y)XM<=4uzWkCkpjvf2L5+084+NP;>uEq5j}q3iSvu{T_vy z8cLylH;h8v2MmW(sId_g>enMFR433KMWKd9Q>Yt&Ifg?0IF>?vJB~tq2&m&J)W!q~ zH7Jony#32~4gV0lLw^MN7qDYH=wJDue*xM8%5(oe;J>j^ z*ZE%^h4NnKCV&d~0sg>qz}JAU1J4650N((<349CqHt-$byTFS81bh#833wTJ1^7Pj z1K?HQhro}3*MJ`bKLLIU{0!I(1OQurp96sa4cH324*UZ6CGZCDE8y3_o4{{?-vV?X z2nYs3fZqYX2mS!O1^f|s8+Zr!6Yyu?FTh`ccY*hSP#_El2O@w-APR^EVt`m64u}U5 zfJ7h(NCr}XR3HsV2Qq+6APdL_a)4YQ57-904}1W82z&%=2l9aepb#hmih&ZK6et7A zfeN4!r~;~i8lV=a1L}bWpb=;Snt>Le6=(z6fezqf;1gg6@G0;auoLJ6x`1w=2j~U* zfPP>A7zBoZVPFIp1;&7JU;>x~rhsW+7cc|N0&~DTumCIqOTaP!0|N0}4P1r~oyf0knV)&;tg*2$%pf@L&CP|F`y2{&^n$ z*$@8t9{A5b@XtQ*&pzr5)oAhtdzfJ!R{k!xR=@4B`IYxO% zv2QBbQo7}*TYk4iMhV^=ve_@-jex&yT-dn0F&i=$@=^d9vK#`3AR%KR;~`wipEiGO z>vLQ8&<@b{)7&%{jX}d`N}7UZrkQ9{0TTg}0n-7y0$!s3Y2z;&+qV>LDcF3UGB>g|vNv)z zayRn+L;Qb!eYR}`Y;4*1`9|OdZDZ@k>l?q=_~pMV|G~x^8^7B4^~ReUzuEZh27M!F zBlzFN*TA!ojo)qje&Y`tZ*BZ>D|Gd5bjQ-mh2&IS7!|4(9NO}}K znjS-srN`0Z=?U~idJ;XEo(YMjxr++~Ikp2;UJ3XIX zKrf^h(TnLN^ip~my_{Y_ucTMetLZiLT6!J5p58!jq&Lx<=`HkDdK@eVYDnwf)ChGw4h@ zPG`~CbPklPJ#;U9H+>I%FMS_BM!!P8O20}zAfPayD4;l?B%m~)ETH`FqJPUb z={My!?YGNs#&6bd&Trmt!Ee!T$#2;Y_Cx$oKg^Hehx@Vo*nS*8t{=~j@Au#K{jVvx zpTbY+r}9(#Y5cT)IzPRi!O!St@-zEc{H%U9Kf=%9NBTMaTz+mpkDvFyEB_z&_n+xG zg+`@)i}oVzRoct6AJcwK3#9#y_Gj8Anjh`Ew3leF(SAVtIW2_tE83rE@wCmf-_m|T zdyDoi?I$!kjYj(;EsXX(8btdM?T57Q(_W!{hxTpSPia4+1<Qm zXhF1K+V5$9puJ6dhxQlRUuo~rLTTZ&2wEg9iWW_ap~ceTX#bhc+5f4!&V;kli7pAqPSRLIy)TA>0sNh%7`Nq6krjs6x~snhE<_)) zGo&-5E2KN5C&Un93^9e6Lo6ZIkcp7Vkg1UAkX<2L18gBg$WX{|$VkZ15NC)uL=qwm zITgYW5rhasL?LHF4u%{GafEn7PKUTc{!g{(Kg)i8vgP+%ezoP-Tb|$Y%`JUf`nPm# z>E80jmS1jpeakPltOgtopltEmqN1Fpx~a#hXQ(HsC#X8gDJp|vr5vRGW(&0CyIWY4 z7Xs*;37U>4X$NU5v?&^k#-{OTTpEYQr||2X*j0q&430rrsNAprpfs%W!> z@}K3L{;$^aMSsZud;Tx^zwG~t|0e(M`~SfIRsSFQ|H%I}{~!DR#Q&%MKl9)0AK<^m z|L6XJ{xtus{;&K0!vB~4Z}|Vp|JVL+`v1oNxBhhhApcW39b#U3$71t2yP5+3T_T=32qH;3vLhY2>v+uVBkvNYT%*3!+}Qvj|LtK zJRW!=@MPerz|(yV18ghU}0cUU~ync zU}<1kV0mCgU}a!cV0B_SSZ^9-VgX7;6w1Pzea&J-KM<0DQHv3rax|a zZ&TQ&N0jtU=O{i(>8AKiv70Etn}Vsqe!>31&jo)i`0K&X2fq;fjo@zve=GRg!QTn~ zZt#o2Q1JJHUkZLX_?6)A2mc`W)!-in|0wvi;N?I#5D7#Bu|P&3GY}7C1+oJgLLTykx)B$}AeFE)(K7~Gm zc0!#{7t{^)K)p~O)DI0ngU}E(42?je&=@ohO+b^-6f_O(f@YvuXbzf(7NA9F30j6= z2!T)tgBTF=ALe}if9V%Ihz|)MAtZvtkOY!KGDr?7ASI-N)Q|?!LOMtf86YEMg3OQw zvO+e9fb5V1A|WT_g4~b?@{guZ}oLARkh&|T#Lp!BnCJ-oT&X-U~{D(WDp#AWj zkK#UR&Ht#XuUWn$bnyHq8J&~8uMIz&N}S!3^f2k0DR)xe%KvMAS^nF_*UO<=c5`3L z(U$&?*@ye*VqE-9>*c z>#4BSG6r|eniikS;qTnhAZqY$Zr@S;>F{9FaN$HMoKf3Rm9pcV&wf7iNorg^{IS00 zhr=V&q9jWSk+v`Gv-Gbrx^oskocyRI-&hh}u)nCPxVGe8$y^y$(O=yQh6zENb~nW} zpJ=XXTW>qp@t`Ae$MlX@cD}pwwa(e@lHpgzUzxZt?Kl6&`MkxeOZMdS%+%b%ZBg&* zwtuf6tV~uWs7YvUYuVox`RFelPd};r^pj7Y2Qy8N&AvNwc9w*%rC&;q%c#$IlC_ds zv`zTo!-BVpBa0h~rKJs}=Bj7S6D>gl=GJ#RK5g~e$=EsGxzWEiNTjrPimS zX&Kutf5056-k!4k4jAa|PsKrHhsrxTmOs9*?fHV`($h^V?T5M(`uo8g*GUsm^M^jX zTE5YHbK=``&ppOc=eMnIE6jgVcD(7Yl?ip1TNodweCF)74GKq2&-`NHHRLyGA8cPQ zpiac52Be?Jx%lDvl0R148;&-ne0*o;wp}IZONEu6WhL!QiOV^g^Tzhq^A8prEDv28 z-}dSb`Oc5VSxGA?e;cOiTidV?u6&SG{6=v=S$xHXhOw4gtsm}q{2A7n)O)Va56tJe zd!lX1Zy^&5i1lhxWYPyo?xYWr?|{KbT2p;#@1anRt49z)g1#;N?(~uOY1``y8mgZE_(wZRcFZRgq@He-?%b68o#d9( zovEiY%d-BI{UrP4-00ltTyopQ`!OTm`QXzJ?|iWLqn!oEiZ2%btn|auJ!NFsM-}f> z{=8~ORacd}dTY}gO?XpV^JmSSZMWK@+hf{0+Gjqd>@e(ze)P4SZ|)q~`P0%@hmwa| zM+2rmpHE%*&f<5$ToG?BPa(T^v?RZf@kK#K*~(MzcA6ebsDr*~(*)%@)pyR%-+yH*mORGJ!-d%N_-olnLabDKWg-G2Y0s_mYFj|)Fc zzOpU$ksz%pw|LtxKlZ;ltjKephgzNZB~u_M~%oKsPcpdkX2@ru|5{{d*~t zGq>C>IV{2cf85^y{I zNR_ufZ{(%EXGA(hgI0U0MGvDSZ^bEdk zED5_4t~Sq34J>$HZjnSdg(@2bbqJbc>=`yXy-&?5$BS+o^Bue%`;PMK677OAvsosVAxBngl;aX2nZ_TLrU zJ`jpWlyfwP{cZ&QG`L5Oh_NK!N()gB%Z?GWBXFFtaMUg zw=(tGY$+5&6woDi95a0{25JrM!nzrsM%GUXvNTEeOn;l(ShN&RC^b~pRY%k`H{?XG ztX*eblHaJPs3x)IiuJC0Bh^sdP~%yXcYH!pf0-uiM6@bCAuZMVNwlPYElHQ$a9CCQ zMsY=XCUk)~0I%F{Mbh`wcw6q;0}j{RHJ%*@G&uo`gkzoZ00G^ zbo!t~Cb~F!JD&?JGu5T-$lF-rR<*XKRCh9XqUmGAv*a$NTRcZapN#DnR~WzBBfvM% z^daI|^wA8U+_{pkxubAV_A^u^?@Sr)aluQX(x_+q1Zcl&e}#-R_!w)VMx}O4o0&N$ zyJP!G_C|J1S(_11P*!Nk zgrs*JXDg4$UDVOOkhV~EPS-#1bkNNpRhT+#TGY*`MoC?h8mH9D9+sVxlTbKJXVdG# z-b8Anmc%9o73v4bhv;q^jz*QI8k~yU%jI{KXMHAV!*w%4MuuOt3@f_s_|og7x`pPb zW~c8xKW)&-p#Gs=5la&KSQ?}RrfszD%^6y%uHNQ;t)`9ROy>;0NPSCl3$rynsaWcw zO#0;*5EkxS;W5W^rI)&Nl?qag(9H@NXKWr79)Bx7FEJynP4?G(%Dc6Cr&{Xw-S3-U zd;MGe+VJDyYeY-n5k;?zcG;3zFGmlj)0(!vnC~Rrw7>>IC-lzZkck@8nz)_`#qrkU zDVEfr$6&E8_0Q1YzZk4r@ zO5==)n~U$unkY&CIeLlyrXCJE6xT52vVMl?n?t7Ke)ns>TTQN!Tcg+JKPaAF>L)0j z>Z?q8DBqgBEg#NzsI}T2ln-`XqS_p_ysFvS?ve%$5i*5ml(LU@hE^O5XRIG_IO2Bf z@tC3cwfX(ZZ%g~Tk9Yr~2+{fl#fG#GHXBAp+{)~j<(b_nziIXNnzqu*4(*&gor)CO zRrxWkbur0fQ#z%kXL)Bd&6=6Nxx7QwC|#svoTOH|TwdSvo#$ImozFMWyuc76{4`~o27Y1L+iSnCpq78Ou1a{Guy3#UZP8JWZCud!pf&rU7eaZnp|bI zxVy7FME*;)Ngbj|(Dw*E5}6f$C%&f{u&C4CmFNV8)Umd!>VW1`#kZQ_UM+Pu{Ntk+ zCg`g>OUfNOJB@IXIi<)q$~7JtO3d4;UapDJ*!-Mow+58y{RKvUDd<|zWK&&)UsQ+a zg6L~8PvTCR?~z*#l;-G>aA~% zA1)5Fd~fJ%^a^X4zBR|WcBW{l8&FxGo~n0Gs$a2Mk}au}T$ap|&XBgYB#K88J~-7n z-E?i@^3dg_yGDLN-rnP-qE7MAYoyYpwp`WQ+uui<3;R|1eba&d3j)prl6uj4zIgD@&_4M&`(Vqw(7*QQj8dsGXT~O%D1w~1=r!|)Z3CneF{JVw( zWv;b!OIsN9)hF2im-!a8DQzL49nL!Rl`V1E;nLN0cGx^ccTcNwo$`Qkn)0J}ZKTX! z9k?mTJ!D_lyfD8QH11O3$IMSz>YO_{;nrTIO84ESA2}VX^nyBefH}+(7S=ana73`s zJx=fX%{|RM(IY8rmsh@$Qrc85-i4ageg)d=+FETF{}293Q;7MBIV|yUQU?p1mMBVr z9~Jhtovv}M?YFkGJXr2lJ6d_myOTCtYtuRC4+pCZAH`wFM^aA~j4WCvyDmB5;9i^R zvQg2`v!Qya=A@sz)*LE??uc1r$}sIU=_7BLT@tn>#wO#*(=9#HUu8sCALd5e3JN`H zp-Q8Jzf&uVqE_bF%*Q!kc<{)O%Cyne9o82mSWrpA&y3c&tTv_iO=xewtl$vgjN3)| zQ13eLcACCgm3Dae&B*#u`Z(95uq40ab=JayE|Le1VL@Gk8^=zM8)r5MNX{##v92=r zww~=hNyP)N6rWDM^E9Kixc@GFrZ^V0uW^&{Lg(dZ5iSFGO`s3y1v#e*7~+qWm6rE zg3Rb+%8M>3GG<;acq6^)bl2&I>kk);+Yk2x9+?Wy+MS+*m8~`P)hjibKD~UW_(l8a zwbKKwK~F;`>AQ;qGRGU9hee00VunPjqr7VO#kj@3h-KsR&45{*P?I=3d3=g3^+xK8 zw31B3IxT;JEyboUC=qSh*`i1EN=d!aW}w6 z7I?q%GX!J>O%DDT{4o5dI8JzVTqpCuc+%jzR>mppY?>XfKys=e(PkkB|&S&}R5?iA-T#r32( z5?@(6&2zP917&;FLhs#vW3>y!(Nmvvy}}E@p`Q&y< z(N<;feywR8P!i-Bk{ars{WI@w+0U|R()-dl=YAfHVwM{5^Vfb4ofz>nN*OcJEJ=Qt zT$ZvUtzkwB>rPQ>7AhRhA1~jec%sPiR@FXNwDdfv3KNp`?}J+!dqlvNeUkZ3;llNj zw)z@zfQ+MTu*Wmc_8NKEZp+Vfd1i0x+>*m39m|_ndsVk^$31s@bynZ^zVFi@aB#@1 zR7qLX+AIa*+1y8}UFJV4YJW+~+}u*ZzU<1P50{UeV@8caKT1 z>~k(FStR;XQ=LkDu;7)+!%9|{eG6Qb2v_&0QAuWsLnM32y=%Ytj0>0%HYLd<2;OH3 z#;b0|`NcOfKeiZBAE)K!8KjTg7b@i5H+;JJ1&eae6#)YSTL#xR>O+mO7b03mS`*6> z7iAS??<+8uv?y=nwqE7zx67}-VM|Pn6)g9t)URzMqtpeO+`uEr3mwL}YgNrd>sjlp z@rqe8!gY~+yN?jO!z(zz!#h(Vms;eiATNDWOSkeZlDlr|+89+w?aqjp1VeTco1$W~ z>rnSvd0!7g@kQz2Qy|O^*egoP^MXGIcQV{HP6?HV9t^!4DvdToN5nleYih42cg|d$ znUj4tPf_@#szyljP76ju*9&Md=oH|7QI{tk+%eZ&utZw;V$br&6^FF@LzkznbRVY( zRrS;6X=4JQfNA=V`uT>Q#=D^k6C_+R9g8eVcyIBxp2;8K(9H3^(?{(ILyK_#sKls` ziI8Pw+U>Lk>6bEntmf>X9K5h&X}hvDlGakpVVToJ=Nm4ZyH4KILNewH8@-v@z_C-jddR_FOlDnZ}7UR>Eip-_m7>&~r~1wrii?Uto_UfUYKvMCb|BIr zrXYrm*`1heQKlcrUuyeoOZ$g0__cUo&NFmM?0#E|vI5Crp(dzX5@T6uD;C|s-%7WI z_DCCFX$?J8vQW0x>ArIZw~lV(!Zx~9dK^>?^Pa2zeSlplDxU+LZwk%-(z&hgs_#Sx8{RMZBn(VstiS@GP6Op zi|u5ov@%>W&96Y(K^7>BSB`brE*?OPRcuyFRhpH1lba9*kWzV3yv3r6y2`57?hQS zCC#jyFAI`S_w+Sv4S$rBU!0iKM&obJ%~7a zon|a~Q}(fRy3ZA#hx!8BZP{@(mn>9QOM5uflNCffjH*(!RsT}I@;w~1J<-?lEyE{s zm(`fPvmi(ESkgi|RsKx=!3)pnsZyx=d*2hr_|FM@9Bzy_9q}!uRno*HS<0ufR^D-T=eWytr{6H`9bLSUF-{KK zZO*ll?T+uvO4p!&~>Jo=d{&1c&f!)1=6Iv0LM#lkX;5Q}n3=)7GS&O*@=< zJF{ahP!LsIRgx<^?mWy5QLNTD=w|yD`Ckk%8`mW4&s?9=Jb$I=5*r-y`ID*og4m5lq}ui(Bf~v?J*Xt3C(L$;j(&V{8u{ z?|U3jxcf%)uW}nFM&Ap$i%6pM7%=h_J{T(b;ie+>yBageQq1);amh z^XC>86%Hu+R^m|>RMw}wspAMunMNL*5_=+cUtFZw+i8zysdAcuHQuQyi*H}L*(cVw zQ9xuyeMzwdlz2KsI4pBMD4(bNs!Uc@C_v?5?-@RG{Y-wR{35l{+7y5P0H2_F`e(s? zLuN!MqB5fMVp_(UV_i%4#4oipu)eU?mh49|4^WAqHLO24mXs6&i>9nU8M4I#T_p%@ksD{-3Wi$_)I(o;8<`kJR_oS+N$^l z=27Mi=CY(iNqsFh(`Q=Ktj1icc%)rYFy6Lk&ADtj=E-1F3LHMfmFwe2I0 zMlh+ftjn{T<*t;x5Cs|I+~&DmRn_-t>SOR7>-WqrR+L}jI!%zbew5*1#N(*J(QYxz zW4fC+BsEC>DC#b|W#m}D3ypI3$6;288BEJG=DnW z-?UyF4SYYcPgHi)lbGfSGpy%xUgk}(fki$g;U!H=-#Zn?zK|dH=&qFb?}>OGvoZN~ z`iq=Xxv%rr`gPWQbvsgW+dMX(RDDpV8ahe(I#k3Rce?BH#>?QzuI=9=X$#1UBwgM z(Yn_T2c2Tv-PLlnhq_J;_+5`J%1+KrSwlbTJX8RD*LQ+jjIAwVL#~Gexbq~!&%?DA3bSk7@WQ*iU83lQ&629cFWT8`;%W(N^ufx8_^>x8@hQ!#O zmMv+Ia@yrZ*`5~MFYaG*q_kGXsy;ZUyKM5!G!W+1`IFZicj)4|NB=FjX9OQLHQqP= zfOU_&i!#c`G0Ykf6m`qGE2l&LN2N(y8*EP6pE5J!q*YdWrLtb#LdRd);^4O-t)lOl zpIFD(l(r?MmnwQYK68HUxkjC;xvAOU-yy&wU~*ugaY(3Fbp4n%F&AQ5$EKJ|l9s0| zPqXBtwXZ|3M%Bxx%}UEVUs0>LqLS$zIC;2#R*d)d_MM$z zObSg+DTI6hhfZEP-+H<#_uZOpK5YV`19Y{00)s*tier{f#uUc!mf@+}a)0D^C|Frg zRnV=dUC~WZjnuj-S#(>rm-yFu#dt>4#meH2$BjvtXgQQ>%B#(5XB(`Y8&D^^RkK)z z$?mC2^dB<3GNUpHZ!)=I>J_Ky&XZiHc#QX48fZ1%6Mt=OlKeV3pmt+!R)MPGL-iqv z$>E##s1RSzOz9wpM=sYrKYOW^gldgHFOGKH6M8A)Q-nJ5cu9}gqvmhskVHT4PszRV z@$yC0j%$}X9(H_Pwj-;dij^rXXR2(4LsP3rmCPQFtfo~%}iL9M-U$-_^l{(VDaox=b$GA{)4_g!W z#N-iK^=#A2q8;4ifV^1K);6NjOC1xo#6#`&$;+w%eWP>_^mBqog-tO{ijGPIEjM$! zmMw4_i7PdWSOa4RCh>{@LYo}E{0n$b;CEk_##Nbt7Kf=1kR_D0+Wn=}b@(hA; zTXGxqUa8b!zGi9I(YR;k=ZW%+)i$t{$_aD}SGG=dvG#NBqVQ2ZP_|H|_;E?I)3S;c zCCj9ZomxA!bxL=xb8hHXqHL(_;*Dx5H7-8)_1a*_h(=6^zLPXIxr;@eilydecF0;; z_@Xei^ha4i_p%vwuSNi*kT&KDvdrEegDKNstMN3 z_fOZ44JkHGORP*9VQF61xNNh;#Q}HrkQccHC~(Cyw-^C$XDb=mY+$m}A47qkLcoP1rw0XH(d3m{$>soh3`gkj*zK|CezBFh@iCcw> zyk1yPZb0cL&mpQ>^-kl@@YL|(Q47r)^T33u7RSsMbq{iu7aGcB3RCR7%=%@gJc4WQ zNu8bM$bWdw@rel*!cN9DO>UgLAtj{tY~i@FZIbqm*=`!uB3WZ2Y8f;7MpX7PjjaGEs#oS$cHX;-CaS>0qpkL9 z@SKpjrUjKhR5!fa#_`qNREM0E`iuGz!85BHn`6>jS-UtjR?G+tGUmoaMC^&laYij~ zQ$nq#(rq~{>puC8^y8xW=%CmYYo`tP0JD+#lzd;+7$^<(3?* zx#RjxX;o>w*LZ(bYqbq^Re^7UA%oEv7#^6gC;3wPHtV6B6vwdepujiI>8=M{y%fv* zj%(NY&kQ4yA_`z>cZUk6HqNu0vs@0l;JS&kk;8x#Cde66E?y-dxd2`9xc; z9&>~C3GC3UYSY%NN18Rnpf>65p(&@CV|d7givW4po+`I*UC8n?oW(moDN zWJWhY{oc6QG{gOw|4h$y+Wi4*5`S3Ur3^DYs=OY)F+IO@g5+85%A&C*tF*!x;nqBf zD%@FmJu}Y|=5sLEE!;n?i4djz7H~NBo8!`mO^&7V_S)^1meTKTW#Jan{FuzdK}9Wv zRzfe2)%0TPLk0)~ zg+an#VTdqP2+JHM3>QWSBZX1IXkm;{;d@mvRv0IY7bXZ3g-OC>VTv$Sm?oSrpDxT0 zW(u=}*}@!Qt}suSFDwui3X6or!V+PruuNDktPoZTtAy2pM34&NZ2}=q=O{P{&Vq~J zD!2*mf?S{^uBttT)oz?x5i&omZ;?|(Qw^RG;+E}|<#Ql#d)5!XKA~N06_#o*h2SM9 zh1Oo{R8wVHCY8W>j*eTBwAJ7(9P(8f5@U|13^U%y8Cp5tV`gNZv`0l3{Ms5zq_<>k zT=c;jfl16txu2O}*cF{=Ybsgo)XSxLN}v2S`k?^@Q3q0EeCL~XS+-YSjfK?mfUn{0 z9p07{>nVSqfJGsnYG}{<<^hr4BhN(-3dz%I5>*+xD?wL-F2|(A1FoLIVEA3>7hQGDxKd?khr)ZF zM_m$qLgHE~68t8F)He-Yv%36{erA?#t=iG61W*X!-6QYC6$E$5?vne%YhUX9vI_4z z!TUU$nlO_sduxe@p}&bWWvDv%I|Y79^+`Kq^(&Nky5wAlbIC}So=N*+Rl4j*S)^=G z;9S(MYHj6Ym+hYMnidHWLZrZ_MhVeEj1Vi}F>yk?U=|XDdXZhy>!j(jL?KB?7A!)F zkSdU-E-`7sV$1ZDx%poC=|YB(DP##&AzR21a)mr0U$6-?eKPcgLXogWC>BbDu?eL@ znNTiN2$e#WP%W$#)(IPgjlw2jvoOxIMc68A6SfOGgq;H81qf3@ZWzWI9YT%apdg8b z1w=rFWks0Ky%ZM+VS$7cg7unMN}vTsI4;$=pHRE{;RYbo95DtZ-&gDB|*ZbEC z=xFMe+|Wbs#R; znVOg{r@bh+;;2)N^>+-k8L~p1(rl7L9%=gN!C@gs1evG_Nw_Rr5t`;+6}lE)6Rrz4gquPy<1L|aKz`b7;f`=u zxGy{q9tw|y$HEgKHR-mMo8e1QnY2Uv7;{PXBz2eYeTrv_ zUJl-QYr^~H&yJ6=_Hj>ijJ901Y_o0hPF4?2J8P{dno=RpTWA`iYn;2zX?g7S^q!_o z&Q~;OdAwVYcABYKRKvPc0auFaeA^dxuRwH7>h4%t+HPx`)*UTdSh1kwRQOLzb@>*j z9>%J|n3_w)Pdu8{4KyxI`4V_Zx;pBmo()%M59rT?I2a2<15C|qxOPPz>8aBWHf^!& zO}%EEpY0&`)2>pEQ!mnP4p4c7lu{xa|Lm-+whI{5!p zZTw$;?e&2AKm(v5&eSv;Je_#MG5Euju28IAbfnmUKU<5D{7$tI}fib{XU>qPReat_9{jZJ8KYvvNe~irQfepY$U=y$z*aB>|?|mDv9oPZv1ONa8AOHps00l4r z2MB-!D1ZhSkz)Z4;DKGhZeS0v7uW~v2Mz!S?fFB%Vc-aG6gUPP2TlMdfm6U~;0$mU zI0u{uE&vySOCom}xB^@St^wD98^BHA7H}K51KhRe?*aFL2f#z%5%3sz0z3tt0ndRK zz)Rp2@EUjnyanEg+C5fSpU7cf!)C#U{A0Y*c9_j#f6zjiNC#W;j1?mcQgStaKpq@}Ks5jIH>I?OQ`a=VtfzTk48w?GB zhC;)j;m`&a7o;T&Hf8pr?i|4+V7_{;14s{dPOx&rbP_vi&FAr<8PZw7Upeeb_5>VF*S!T)AZ zH$mcU`hS?yfByRIPLG4)Av2T!B|=G}NBy@&{m-YC3jHyu|GP*1pBD8Z(V_nH*FP=l zzYXet{OP~#>3{O;p!LuOXd|=<+6--hwnE#W?a&TrCj>ws1VJ!_h#U%G5DpO#2~iLY zF%S!J5O2@#f_6iDpuNyOXg_oSItU$t4ns$vqtG$vICKI!37rzT)6f~{EOZV!4_$yR zLYJV+&=u&aSic5chi*VOpx=nixjx(D5d9zYKvQ8NTRfu2IoMCLj40(uF(f?h*! zptsOF=solS`e^U{3Hl6ufxbeukO0*|-=Oc%59lZK3#td#ha12R;YRS!Uyb1=a8tM$ z+#GHJw}e~4t>HFsTe1FowS(Kk9pH{|C%7}*1?~!WgS*2$;GS?VxHsGf?hE%5x&H6~ zcpy9o9t;nGhr+|);qVA}q&+_h9u1Fy$HL>_@$dwAB0LG63{Qcl!qedC@CoCHxA04Znfk z+Vk(=_wWb!Bm4>e41a;Y!nLpf*TLW5@9+=!C;SVphy46iA8CLzL>eKDktRq}q#4p2 zX@Rs9>%Uhkq&3n8X^XT&+9Ms1jz}k@Gtvd=igZJ|BR!CwNH3A=jr2kKBK?s5$N*#@ zG6)%r3_*s9^eBp3-n42V(WLXj{e95EpgNF)-4 zL?basED~qW$0KGW0ZBxXkYvPyq#&tC8j_A=Ael%OVnwo%9FfaK@{oMQh7=%$ND;CI zDMm_=QhWZ-C-|Rvo%EO2`!b{)sX!``Dx?~zLDnMckoCw0WFxW(*^F#Kwj$faJ#I&K zAUhEN0TBp+5d=XI48iStClC^$5E@|+7U2*c*@f&z_8@zaeaL>~0CEsHByxw5Bgj$Y z7;+prft*B6A*Ycu$XR>-9C9AHfLuf_A(xRW$W`PTaviyW+(d36w~;%@UF4p~-A5iE z50OX6W8?|)6nTa`M_wQ=?fF;8Yvc{`7I}xfM?N4Qkx$5Hj2kndYL;Irx(1Buo5IPtgf(}K8p~KM;=ty)FIvO2=jz!0zV~?ba?}G=*z=yK7pg>6s5h!cHK-5ji~6BjREPSb0cao^ zgz803Jk*04P$L?OhN0o835`G_(I|U98jV3?(Ks|7HKPe=BASFIqZTv;O-0ktbTk9a z6uB(aie{rZXfB$E=A$;W04+p|?D;ilF^auJA{e{-U>SGPChS;C~H;u5ySQD%%)(mTowZK|pt+3Wu8>}tX4r`Bf zz&c``M6NT|1?!4+!@6TVu%1{itT)yN>ub;V!}?e}3s48$M|#t;m}Fbu~CjKnC6#u$vnIE=@3 ziQH~%54IQEhwaA>UiECw{s?=FJ;9!0&#>p%3+yHK z3VV&c!QNu;u=m&p>?8I`+~a5L3-%SO#RRMl`-XkTeqcYbU-rG%!|US>@P>FJyfNMc zZ;Cg=o8v9;mUt_?HQokqi?_qY`$2dIyd&NT?~HfByW-vO?syNpr&#~Jdf~nCK6qce zAKo7yfDgn6;e+uZ_)vTpJ{%u`kHklb+-Q6ZJ{BK`kH;tA6Y)v-WPA!f)t;Y*PseBA zGx1sYY39a7iD%(fJlozo2hYXx@O<2c z7vP0>5xxd5#!K*0ybLeLEAUFZO602X8hkCj4quONz&GNX@Xh!Ze5*ab4d0IMz<1&R z4&o3F;|Px87>?rvPT~|!2j7eD!}sF{@PqdJA^b3Y1V4%&!;j-9 z@RRr{{4{-Y`)CVmUQjf>h;d;T7NAAf*9#2?|0 z@hA9G{2Bfne}TWmU*WIuH~3rpoyfh%Kj0tnPxxp23;q?a#Ra?$|7OpB$A92I@n3j7 zqCU}pXh<|78WT;3rbIKMInjb>Nwgxw`$0q-qAk&mXisz?Iuf0T&O{fYt61+wbSHWc zJ&9gKZ=w&;m*_|ICk7A$i9y6*VhAym7$!2qi4nv|ViYl&7(Mg_AOeXXdtOfj z6Cs3wFcP6e7!gjGhzKH*h$5ni7$TO4BjQEQOe7GAL=urqScnuNl}IDfi41!_lgJ{h zL^hE_SVI&OB}6GvCUWIO1yM;<5!FNuv6fgztS2@Q8}0c`#Aad( zv6a|HY$tXQI|+aQ35b9Rgg^<5zzIU+NP;40f+1LfBY0vLv76XK>=o<#i2cL?;vjK| zI7}QNjuOX+Z-}?VJK{a@f%r&#B0dveh_Cj1Eg=wf z#5dwQ@q_qD{37a+^~nZgL$VRsm~28eC7Y4r{UEXh*^+EUwkF$>`x9L2an_HG&zPG zYtR3Am;cP`w7d9a-gfx&wGL#G>!$}hvK}M2MWVFb|kg;SO8BdzY z1Tv9KB9loAnPShUl4)c*nL%cfS)`TBCUeMKGLOtBZDaviNEVT6M6Q@DAxp_JvYf0S zE6FOdnyew$+Vktk_2dR}Be{v(Ol~2!lH17b zBujE6FV=UFyU9J|UUDC~pFBVwBoC2?$s^=Z@)&uXJVBl$Pl?QF@(g*FJV%} zOXOwp3VGGu`x<$jyg}Y1Z;`jjJLFyR9(kX9Kt3cNk&nqI1 zPPL#~Qmv@gR2!erchIJ^5NmMdrp;D++Dve5~GN?={i?UMLR1TF(uwLaK;b zLlsjcR4G+Pl~WZ|r9EFoRZ}(8T527&p4vcdq&88TsV&r2Y8$nk+ClB40FeVJh=M7E zLMe>GDS{#?ilXg#hGHp>;;CKKZfXy;m)b||rw&jDsYBFZ>Iij|Iwo?*sT0&m>J)XF zIzyeM&Qa&73)Dq>{t|VWxP*166 z)N|?u^^$r;y{6t!Z|(Va)O+d!^^y8SeWt!pU#VJ3pz5e^)OYF!^^^KV)uYAxL39JU zA>D{>OgEvM(#`1RbPKwrSZ_tQrrXeM>2`E`x&z&j?nHN{yU<dkv$9(j;3SiSUS$0|Fet#%TJOj%m+y zU^+6Ln9fWWrYqA;WV$mwn4U~8rZ>}v>C5zE`ZEKVfnxpl8pI4{hA=~!Va#x51T&Hu z#f)agFk_i<%y?!3Gm)7ja+8@U%v5F?Go6{i%w%RUvza-}Tzh^VGoM+&EMyiji|%B^dzihQ!8=;Q^$N`zB50VpUf|&9$TMnz&2$6eD52vjoBt_Q??n~oNd9j zWLvSV**0ujwjJA^?Z9?qJBeIpwhP;p?Z$Rzd$2v(UTkl+58KzC@5lCM2e1R#LF{05 z2s@M=#tvskup`+~>}YljJC+?Ma^u+v>_m1FJDHurPGzUD)7cs9OnZJ7JDZ)u&SmGZ z^VtRLLUs|mm|emyWtXwb*%jn7ISSvl*$Dp*g} zi&e5J)|*wc8rFyPW&Kz!t7H8|CV&lOgIGNq%!aVyqo!;q8^(s)dy5YYvXN{Q8_mYB zv1}Y0&zji;HjzzYlUWO!!lsH`8k^2$u$gQYYh|<995$EDWAp8K8(Y8@vPJ9~wwNtp zOW88EoULFh*($c0tzp-)>qKrnyMf)vZelmHTiC7aHg-F^gWYM*11!iwEX*P-%3>_e z5-iD5EX^`3%W^Ew?h?7(>>hS6yN}(^9$*i$huFjH5%#D(|DU~)F_5=Ho{Umaq*)Qx@ww4vxI`$j;o&CZ7WPjQ7 z^|<<61Fj+0h-=I>;hJ*IxaM37t|ixsYt6Oc+H&nU@qQ53f$PY1;yQC(xUO6`t~=L* z>nYZMuU=elt`FCj>&Nxy250VIXUOSDL7Bgi&Jtc&YM$n8qSCF6&XKH%jr0OE`ST)30Vy=WM<;u8nu7a!Nszk1utKrsi>$vsY25uv_iQCL= z;kMfI+qmuA4sIt0a3BY9Fo$p`hjBPZa3n`@G{=Y>%W)jf?c#QGd$_&aK5jpEfIDc< zAL0&kN4TThG442bf;-8b;!bmCxU<|j?mTyayU1M($hHuNaO!h zzBAv2?<&@RuWo#Iz6alv@5T4#`|y4Fetds^06&l)#1H0&@I(1wA~&2L!H?ue@uT@M z{8)Y*Kc1h!PqgPJ@ss%}{8WA#Kb@b!&*W$Ev-vsvTz(!upI^W)kUg*GgZU8Nz#I8cK8z3NO?(6&$w%?gd<-AU$MNwZXXX?5L_Ud6<}G{* zpUS84>3oJgpUG$OR$d&J#pm*Qd_HgE3;065h+o4O^Cf&KUnX+pd<9?0SMk++4ZoIO z$FJu%@EgVYCVn%&h2P3==r8{xpAvKg*vJx%2!5{vv;gzsz6ZukzRU z>--J=raga)zs=v_@ACKf`}_m`A^(36cTY`sENuXWW81cE+qP}nwr$(C-?44P8LZfL z-mg=cf3Od}>Z*0{)OGJpC#&Y5YuB1s+~c?>aZlr(#XXOE5%)6g6>zWP-o(9)dl&aU z?nB(ixKDAPhjKtUpR0*mKRe`EP)u8H74X7qm3#tv( zf$Bo_p!!e);2J`WpvF)Ws43J8Y7Vu4T0*U$)=}REY74c4+Cv?nj!-A4Gt>p@3U!0J zLp`9LP%o%A)Cah}P(P?YGyob14T1(kL!hD1FlczxkAOx(qoC2y7-%ds4jK(jXl&AQQ468*(5w>Tg4Lpu5mL=sxrSdI&v&JjjOvD1>6r zW9SL=6nX~SbLa*15_$!_hTcGLp?A=G=mYdI>OVoBp)b%^=o|DM`T_lfenG#XKTtfB z08R)ef)m3@U~nG;PP+TnIXCR_`y4c7s#E?f_;4>y1t!j0g@a1*#G+zf6G<}Kisa4Wbq+y-t7w}acm z9pH{|C%7}*1?~!WgS*2$fawYMf_uY#;J$D_xIa7q9taPD2S_@$dwAB0LG63{L@WDm)FI4$pvR!n5Gn@Emw9JP)29^$XyI@FI9IyaZkf zFN2rEE8vyzDtI-#23`xVgV)0wfZGUff;Yok;H~gBcsslU-U;u5cSrpmcrUyU-VYyu z55kAw!|)OKD0~b)4xfNe!l&TV@EPFF!sp=g@CEoHde*?Y=--6>{ z2!>$FE9u{B`mS7oHU=`M29X4Py>MhuY9oU6$!*}4j@IClG z`~ZFkKY~5jhXXi-W57LzpTJMyXYh0Q1^g0z1;2*hz;D6)9sC~t0Dpu(!JpwT@K^X7 z{2l%Q|Ac?Rzu`Y{Je&XlcR@%ZBr%c%Ns1&xk|QaQlt?NhHJJZhX^^x?IwU=k0m+DD zLNX&+kgP~HBs-D=$%*7bawBdjsmL^BIx+*9 ziOfP~M`xdd%thuQ^N|I}LSzxL7+HcWMV2AUkrl{FWEHX+Sp(c!WF4{|*???BHX)ml zEyz}68?rs>cOW~FUC3@^53(28hwMiVAP12{$YJCNauhj+97j$7cM>^;oJP(dXOVNr zdE^3e5xIn1j`}OeRpc6S9l3$rL~bE*2!y~0f}jY7;0S?`2n8ICFbIoq2#*Meh)9Tx zD2N*M8locxVj>n|BM#ysw~;%@UF05eA9;X0L>?g?a6S?sAreC#BTta0$TQ?Q@&b7Y z=C6>~$Q$G>@(y{Ad_X=TpODYU7vwAQ4f&4zKz<^>fccI5LE@1FXhJj*nix%jCPkB> z$c}O@pRI)1m3n3}{9)6Pg*#f@Vdtq1n+Kz~w}9p}EmKXkIiQnjbBI z7DNl7g`>U*S`;mY7Dr2!5YfdT9NqZ-6#L8=;NSCTLT%8QL6efwn|jp{>z2Xj`-$+8*ryTt~DM+8OPFc163P z-O(OsPqY`>JL>zOebIhse{=vk5FLaLMu(t7(P8LtbObsQ9fgiY#{f4L9fyubC!iD2 zN$6yB3OW^?hE9+A8R$%O7CIZ9gU&_gq4UuN=t6W6x)@!8E=8B2%h46UtwdL$tI;*+ zT67({9^HU$L^q+E!F&t472SqzM|Yq*(Ou|nbPu{0-G}Z+51fQnHsp)#tVDypG6YM>@+p*HHEE_xfigWg5&q4$A%fIdVYp&sg^0UDw) z^fCGbeH!)8(C6q2^dtVpwsk1XdC&g_Xw2U}dp#Sb3}ha22siSY@mV zRu!v;RmW;zHL+S)Z7{Ec)y3*z^|1z6L#z?j7;Azx#hPKwu@+cMtQFQ8YXeMMtR2=K z>wtB{I$@o$E?8Hr8`eGAy9d@2>xK2k`e1#repr8O05%XCgbl`qU_-HC*l=tFa3ir% z*l27FHWnL)jmIWn6EX0E(osJJn~F`treia(nHczqGHebu7n_I8#};4C>>PF;yMSH9E@79kE7(=+ z8g?DKf!)MzVR0A)&In@&hGH0oV+2NG6h>nV#ztr7Fdh>y5tA?(Q!o|NFdZ{66SFWI zb1)aX4cr~;?7`dxgEm-e7OBci4OE z1NIU71l(ur3-%TJhJD9=U_Y^6*l+9)79aHq@Pv3GJTaaGPl_kQljAAylz1vUHJ%1f zi>JfW;~8*pAB1PZGvitCtavs&JDvm2iRZ#|gZbZ;2hWS=!}H?>@Pc?Dyf9t_FNzn# zi{mBml6Wb+G+qX{vUoYXJYE5>h*!cZ<5lpgcs0B_nAgB-; zjqt{J6TB(j3~!FN0H!703U7_K!Q0~P@b-8Iyd&NT?;P#j1@DS?!@J`>@Sb=tyf@wl z?~C`t`{M)ff%qVNFg^shq4+R-I6eX&iI2iZ<74o#_&9ug)K9=C;*;>n_!N99J`D#y zj)>31XW_H)Irv`e;c+;G!#IMYIELdmfs;{B;WWNJXS3(h%T2h)74ICo&KjiA+RhA`6j~$VOxb^S>(xk(0HMsu9(R8bnQ^ z7Ezn1L)0be5%q}%L_?wx(U@ogTvMVM(VS>Ov?N*)t%){7TcRD&KI%IV9f?jvXQB(y zmFPxvCwdS)3GnlfL?5Cr(U0g)3;=E*F^CvU3?YUR!-(O;2x25LiWnXBV~DZDIAT08 zftW~40zZc{g_ufABc>BGh?&GJVm2`cxVgkUVm`5eSV$})786T|rNlB~Ihd~?RuZd- z)x;WNEwPSRPi!DI5}Sz4#1>*Jv5nYH>;Psbv5VME>>>6N`-uI-0pcKWh&UYWeS|nl z93zesCy0~8DdIG7hB!-{BhC{Sh>OG};xcgsxU0l9;yQ7IxJle1;s}U<34}nS9wTsq zAV`8DXo4YFf+KiBAVfkUWI`cSLIX}G48kNV!X_NTC2kXUh`YqSsJ~Ap3`2T!1`;X82 zZ^U=v2l12mMf@iI5b;C;G9j6WOiU&rlak5E?$oymhvLIQAEKC*wt|(cIEKZgnOOmC?(qtL3 zELn~$AN3W;iex3SGFgSJN>(GQlQqbiWG%8bS%<7k)+6ha4S;J%HX<97O~|HXGqO3^ zf^12)B3nm&8?r6gj%-hMAUl$s$j)RJvMbq*>`wL|dy>7#-ee!(`jY*~{^S61AUTK} zOb#K3lEcX1Q9ptlNsb~%lVixSYE4hu_PVOLg zlDo*=;AB!ERZ=5$(jZOJ zB5l$k-Kf7!-XZUj_sIL?1M(sHi1bLG49Jj-k&nqIsXw~z9rw0 z@5vA3$Eg2AekQ+=U&(Leck&1Mll(>gCjXG}WCAK7m554AC85B55S5HdPNkqyQmLra zR2nKRm5xde=6_cPDkGJN%1mXUvQpWo>{JdaCzXrJP358TQu(O-Q~}@$QiZ6(R1vBu zRg5Z5m7q#erKr+iUWO`5m7~g26{w0-C8{!2g{n$bqpDLisG3wQsy0;zn7ULwsy@|# zYDhJr8dFWErc^Vkd9-&6swLHmYE8AF+EVSP_EZO|Bh`uOOm(5UQr)QTR1e^KQoX3& zR3EA@)sN~=4WI^6gQ&q#KZF`e4WourBdC$oC~7n{h8jzaqsCJcsEO1hYBDtixT(}M zYC1K8nn}%~W>a&hxzs#re$+3Z7E+6-#ncjNDYcARPOYF;Qmd%d)Ea6nwT@a(Z2)c~ zwTaqHZK1YO+osH4;|>Ns_RI!T?PPE%)q zJ4>CT&Qlkti_|6RGIfQzN?oI_NBs@zCUuL7qaX^V5DKL*3a1E)q$rA}7>cDh;CM=) zL`tG$N}*IrqjbukOfa`7n{p_Zx=r1o?o#)t`_u#KA@zvzD4zJ{~xdPBX9_I^jbr#?_0sZZ2r>I?Oi`bK@Heo#NDU(|2v4;4=(puv3*orq3M zC!v$l$>`*C3OXg7icSsYe^(khEuD@|PiLSr(wXSYbQU@*osG^;=b&@ax#-+<9^mrQ z`RM#~0lFYvh%QVQp^MVR=;Bddf-XsyqD#|d=(2PG1#abU=r6jDAc%p`X&v=;!nc`en5DEBZD4hJH)GquuI}0$f$58dIIA!PI1GF}0aGOkJiPQ$Ok(Fb$bTOk<`A)0An( zG-p~cEtytKYo-m;mTAYdXF34ak?F*AX1Xw4nQlyXrU%oL>BaPp`aVowrXSOv8Ndu= z1~G$~AQ_bG2@vD%tU4qGntvfOl77q)4_ZOGn1Lc%x2~= zbD4R}d}aZ&kXghmW|lBZnPtp!W(6=SnN`ecW(~8JS;wqrHZU8RP0Z$K?=8$$W*f7e z*}?2&b}_q|J;?hlexvjF%SbY2!k>ha5zISBttPY!!RtvF+3wMV$@5F%qWb?XpGJn zjLBGx%{Yw9+-B}DcbR+4ec&E251B`d$M{UZgiMTi%sgS9M*TD9IrD;f$-H7-GjEu; z%sb{i^MU!ud}2N`Uzo4VH{iZAKbW7)FXlJ%hlytrunE~jY-0A`cP9y(lugDaXH&2# z*;H(5HVvDWO~Zh<% z*=g)_b_P3>oyE>(=dg3xdF*_40lSc0#4cu+0JoG~#x7@9uq)YB>}qxmyOv$Yu8;cv z&y)V&t}XuK^L_)nk=?{@X1B0g*=_80b_ctY-No)^_pp1}ee8br06618_7HoRJ;EMk zkFm$u6YNR$6ni>4`x*8udyYNNUSKb>m)Ohf74|B7jlIs^U~jUw*fX z4cIX1W9(!03Hy|N#y)3XurJwH>}&Q7`<8vjzGpwMAK6d9eP+L~U)gW$clHPSll{g1 zX8*A9QJ;WI$R*+ub4j?QTrw^>mx4>lrQ%X^X}GjpIxanzfdltJTqZ6vmxas9W#h7Q zIk=o$E-p8i=i%~l`MCUC0j?ldh%3w$;fiv_xZ+$1t|V8AE6tSwrYu*EE6-KnDsq*$ z%3Kw$Dp!rG4(5MX4X!3vi>uAm;p%erxcXcJt|8ZmYs@v_nsUv!=3EQlT5_$p)?6E| zE!U1~&voEBa-F!&QQw8@%5~$qb3M48TraLS*N5xN_2c?;1Gs_QAZ{=>1h}ExFm5p)MIGz(Yk&`%?Q#h5=IGr;%le2)aIfrw(+uR-Q zE_aW+&pqHCa*v|DJF63g|W9|v}lzYZK=U#9xxmVn4?hW^rdk5Tm?gRIc`^0_b zzHnc;Z`^n82lq4Te{sLLKU_SQfKSLL;uG^p_@sO?J~^L)Psyj^Q}bzfa392{6oeJ~N+%&&p@xvxE8Hm4na8=i+nodHB41K0ZHRfG@}w;tTUd_@aCU<5pCSQxM&DY`U^7Z)od;`8A--vI_Hvz6G z-;8h0x8Pgyt@ze_8@?^yj&C3J;Pt0`C%!Y^h40FDKVei}cWpTW=MXYsT7 zIl#>2=kfFT1^hyO5f5JA!!PBR@ynyVSMV$ORs3px4ZoIO$FJu%@EiF}{APX&zm?y{ zZ|8Rax0Bz+@8 zd4+sJexZO+P$(o67K#8@R467C7fJ{vg;GLkp^Q*gC?}MU`U*ltp^{Kps3KGqstMJF z8bVE>mQY)$Bh(e@3H5~rz%>*a35|s&LQ|oc&|GLCv=mwit)sq;&{k+Cv==%E9feLp zXQ7MGRp=&k7kUUigVRVSq4D7$ksK$qPe;VZv}QA0dnsMhW2Mq{3KX zoG@OPAWRe{36q5>!c_25qv^s7U}g%lgxSIzVXiPwm@h0477B}m#nIkNgr&kVVY#qE zSShR$Rtsx{wZb|9ytG`{C~Oio3tNEODr^(B3p<3J!Y*OAut(S{>=X7!{Q=>ia7Z{T z91)HR$Asg;3E`x0N;oZ?5zY$dg!94$;4TW6gv-Je;i_;=xGvlfZVI=AxTuE&SU?0+ zzyw?%1X7>`T3`fL-~?U}1W}NHlLbXk1x?TeLofwPumwkOqyDyVN4P886YdKSgonZ- z!4rHT5JDj)JQkh^Plac|Jr`aGFNIgaYvGOXR(L187d{9dqyCfdS@+&X~eW*Ix#(%XAm=rnZ(Ru7BQ=s zP0TLl5Oa#T#N1*YF|U|U%r6!Irl43zEG!lgi;Bg>;$jK0q*zKU4d#DW8L_NbPAo50 z5G#t6#L8k7v8q^2tS;6NYl^kR+F~8x>WcNm`eFmIq1Z@lEH)9Fip|94QQtyrDYg<@ zi*3ZVVmq_UBs?pH?h0e1Gt`IFR{1SN9-&16Z?w;#DU@My zMDS{Kailm(94(F!$BN^`@!|w=qBu#MEKUJ#syI!YF3u2VinGMo;v8|VI8U4(^$Wy> z;v#XexI|nkE)$oFE5w!JDsi>AMqDed6W5CyfZHf;5;u!m#I52sal5!f+$ru7cSrpm zaj&>f+%Fyw4~mDx!{QO~sCY~~E}jriil@ZW;u+x1is!`h;sx=dcuBl0UJ-$eK8P2F$UaY@rn3Ud?r2@Ux+WoSK@2&jrca|--++V58_Ah zllWQuB7POWiQmN^;!p9H_*?uV#)}Cga33Tkk`hZvq@+?ZDY=wFN-3q1QiJ*5l}1V{ zrIXT28KjI-CMmO&Man8=ld?-Wq?}SNDYujdxV%z6DZf-eDkv3_3QI+#qEa!bc+~&< zul#>LTm8r9eF>?gR7xr>m66Iy<)rdb1*xJ`NvbSWk*Z47r0P-)aK@TaEvdFtN2)8; zlj=(iq=r%>sd04nCQ?(WnbcfrA+?lRNv)+eQd_B=)L!Z!b(A_uouw|ob(OkF-K8E< zPpOyGTk0eAmHJ8jqke!iP#Po+mWD_}rD4)=X@oRV8YPXE#zUT&xrCri)X^*s5+9&Oo4oC;3L(*aCh;&psCLNbf0C!S4 zC7qVeNN1&U(s}8EbWyq_T?X?j(pBl2bX~e3-IQ)gaS|lK5+b1zCgBnxkrD+AEin=+ zaS|^Hk|;@%EGd#2?X5|=WJsoDNw(xju5??vBi)tmN%y4((nINy9O=g zdMZ7Wo=Y#Jmr?&pdM&+?-b(MJ_tFRHqx4DoEPau_O5ddK(hupU^b5G((jO^aN+2hc z6Um9?Byv(YnVeky_gzgPr<7C4spT|sS~;DZUd|wAlrzbh)S5>Yi zSC?zZHRW1zZMlwISFR`5kNO63L%EUMSZ*RWm7B@UFxs}{nZX>sq+sWxPz9HX~Z^>~oB*QWy zqcR2@E)y~-Q!*_xGAna3FAK65^^z>himb|-tjmUM%9d=)j_k^} z`H}3&z8uJ*9Frf*Pvoaj|4e=^zmQ+bujJSA8~LsLPJSN8x~7x+>k2?or=E>8bQmdMkaDzDhr(zcN4>s0>mDD?^l_ z$}nZPG6J}f$|z;DGDaDzj8n!d6O@U{BxQ2c|9_tJ|8{NtAD{PAl&Q)zWx6s$nW@ZD zW-D`)xyn3czOq1Bs4P+zD@(u`mnzGY<;n_WrLsy{t*lYjD(jT>(b+dB8a$UKh+*EEUaS8++tRM=iU<$4f3aL;EtuP83^_;>hf+8xCA}flb zDw?7zhGHs~Vk?f~Dz|~Vquf>QDfg8J%0uOm;wiooC}Gscl*h^w<*D*ad9J)rUMjDY z*UB5^t@2KJuY6EGDxZM+tb9?vD&Lgv$`9qI@=N)x{88e;Jb{`}O{6APlc-76WNLCX zg_=@LrKVQXsA<)7YI-$;3hsi`OloE|i<(uO7_Vrp@Z4N_0R@#Ua6{E$>Tq?0I#L~_j#kI0W7To$_^6+tPE;qU zlhrBeRCSs#udb&UMR9x>Mby?pF5zw^!Y#?pF_}2h~IBVfBc5R6V912lEr^ zN%fR^T0NtlRnMvC)eGuH^^$s7y`o-Kuc_D78^GLDZ>e!Aq{1qqqAI51Dxs3m-jqtK zjLNE<%BzAZs*)Zq=ITfL*+Rqv_y)d%WB^-rWsK(UC z>J#;;`b>SUzEEGPuhiG-8}+UF4!HN~2lb=+N&T#TQNOC+)bHvK^=H)oQh%#|)Oa<4 zmQYKiCDxK?Nws8JaxI0HQcIz zrRCQ0XnD1KT7Ip7R!}RX71oMqMYUpDajgV!CACsoX|0S_Rx78K*D7cgwMts$sIQ_` z)v9ULwHjJYt(I0>tE1J`>S^`023kX{k=9si0$fwAnburup|#XnX|1(3T3fB1)*j3| zXdSgqT4$|`)>Z4Kb=P`mJ+)q1Z>^8kSL>(s*9HJHP#dHT)`n<9wPD(DZG<*b8>Nko z_8y~+)y8S#wF%lpZIU)wo1#tCrfJi)8QM&3mNr|P1KeC~o;F`wpe@uEX^XWb+EQ(q zwmj-rXe+f<+G=f$wpLrGt=Bea8?{Z^W^IeMRokX**LDE6Q`@EO*7j(7wSC%t?SOVr zJER?s`Xky=?U;64JE5J_PHCsLGum10oOWKjpk351X_vJtz+Kg@Y1g$I+D+}27N{^Ro=({PQ@NR85HjnP<*(|AqLL`~9UP0>_M183AVLo+o?vo%L^ zwcFYq?XGq&I{SU?f%Z^)qL?Wy)md#=6EUTUv^d#%0E-fHi(_u2>T zqxMPrtbNhGM*TPKyY@r-sr}M^Yk#zOErFg;PoyW-ljuqHWO{Nvg%0k6^i+CkJ&m4L zPp7BXGw2!hOnPQ8|GTp2S@mpsc0GrlQ_rR6*7N9j^?Z7My?|a&FQgaNivU+tFQymQ zOXwx_QhI5DBcbdQH8SUR$rD*VXIk_4Nk8HPjpF zjrAsaQ@xqqTyLSb)LZGT!Mu&$R&S@b*E{GP^-g+cy^G#e@1}Rxd+0s&UV3l64={c8 zetLg>fId(kqz~4I=tK2k`tWG)5&B4dls;M?qk|Xq>ErbY`b2$_K3SilPt~XC)Abp^ z&D3Y4)_r`ceIueq2AHpVUw3r}Z=XS^b=T zUcUg`Mg5X~S-+xR)vxK-^&9$4{gxgV^^gwhh>q%*j_ZU@>Xc6FjLzzu&g+6M>Jo6W zuIQ?+>AG&{rf%uB?&xmR-`4NwclCSvef@#{P=BO*x~~U%sK@lj`V;-B{tUS1`V0M~ z{z`wXztP|7@AUWj2mK?Mf6_neU-Yl~H~qW*L;tD&(tqoJ^msjik>8LMblr_p3<&6qPMWd2Y*{EVvHL4lajT%Nxqn1(I zr~_PGqn=UUXkaun8X1j^CPq`EnbADzTNo{kRz_>1jnUR#&tTxsd zYmIfrdSe4{8;woIW@C%7)!1fiH+C31ja|lWFyCYBHTD_%jRVF(| z6UIs7lyTZP1I$_DoN?Z`U|cjV8JCSK##Q5*aXs4mhH=xlWyBef0UL;c8km6_gh3jV zK^u(08XR!EAsC_|8M2`ms-YRWVHjrATZU~ohHKn5?ihECd&Yg^f$`9IWO#;e1V(7Y zfO~8_F`gRFjOWG+)69GoP8?EMOKi3z>z@B4$yum{~kJdkM3oS;{PJmNCnk<;?PC z1+$`A$*gQvF{_%@%<5(h;A)z+%-Uuhv#wdstZz0j8=8&G#!=tIY-%<$o0~1nmS!un zwb{mOYqm4nn;p!KW+$_=*#)?+W;e6D*~9E<_A+~$eayaQKeK<-4=@LsgUrF^5Ob(G z%p7ixFh`oB%+cl;bF4Ye9B)nlZlXEKoNP`pr<&8u>E;Y`ra8-;9rbg}x#m1`zPZ3$ zXf84rn@h~4<}!1+xx!p&t}<7fYk*s8t~1x08_bR7CUdj7#oTIcGq;2J4s)lu%iL}5 zG54DL%>Cv8^PqXiJZv5@kDABKy#6(TZ#7)8^O$s>LWK7oNOx_es(UeTtR7^GMHB&bY(=;v9HXYM7 zZ<}|_yXHOfzWKm>Xg)GM;CwSMLo;SRHlLVJ&1dFw^M&~`>R*|!%{S&-^PTzL{9t}G zKbfD+FXmVCoB7@RVg59K0r%VdW5$~atb|q~E3uWtN@^vul3V}2b1AHpRw^sCmBvbI zrL)po8LW&}CM&a*#mZ`Bv$9(`fXiv+vT|E_th`n}E5B91Drgn53P*hrtEg4XDsGjq zN?N6?(pDL(tX0k`Z&k1=T9vHIRu$l?TGg!TRt>ABRm-Yv)v@YY^{o0}-oR>THL@C8 zO{}I?Gpo7P!fI)?vRYehthQD=tG(3$n2uH_tFzU`>S}efx?4T0o>nibceHmOtFP71 z>TeCO23mux!PXFKs5Q(QZjG=;TBEGd))?T%TH~zo)&y&!HOZQ6O|hn0)2!)HKf{`7 z&9Y`&bF8`6JZrwSz*=Z6vKCuQtfkg6Yq_-oxRur_Yqhn;T5GMd)>|8_jn*b>bJTCK zwp!b)?bZ%!r?t!4ZSAr4TKla1)&c9Fb;vqw9RcpBb<8?$ov=xV~8SAWd&N?6U z7p#lcCF`E?tv^=0mB3DDC$baU|Gqa#?4))w zJGq_0PHCsIQ`>3mw01f>y`90%XlJrB+gX6iYG<>v+d1r)Q?NhIS*nvE9UOYB#f++b!&tb}PHJ-3GX}c00Sh-NEi?cd|R%UF@!QH@kb( z|Fbd!9YtUSKb@7uk#LCBQAUm)Xnh z74}MdmA%?tW3RQ>+3TZzgT2w-WN)^&*jw#w_I7)Rz0=-h@3!~Yd+mMpe)|A$2kk@l zVf%=E)IMe(w@=t7?Nj#Ys6S($wa?k-?F;rr`;vXxzG7dsui4k_8}?26mK|q9z`-_R zqc&#aHer)CWz#levr*64ye-(GE!ncI*s87Bx^38|ZP~W%*sgsWxI6Y;`<{K@eqcYe zAK9Mm+kqW|dCY!nKe3XxU{%-%U zf7-w7-}WCnKH58hlh8@zBzBTGNu6X)awmn8(n;l{cG5U$opermCxZj-gPcrGW+#i2 z)yd{$cXBv6om@_CF#o&qIC-6XPJX9=Q_v~o6n2U@MV(?!ai@e+(kbPXcFF)()+y(d zcPcm)ok~t+r;1b6speFV`WjA6rN)kD22Mk#k<-{|;xu)dInA9Gz_oN* zIjx;GPFts))86UebaXm7ouj^s)79zbba#3Nvb*XifP(b?o|cD6WMoo&u`XNR-X+2!nZ z_5icj+2`zc4mby$L(XC6h;!6A<{XdqKH;2nPC2KYGtOD(oO9l};9PVrIhUO)&Q<4{ zbKSWC+)d|}6X!q<>>v*6U=HpO4jJ{7LpzMaI-J8hf+ISTBRh(tI+~+9hGRMwaJJ(( zu5;VD)O(Ka1WxG0oX5@+=c)6|dG5S$UOKOw*UlT~t@94J_s$3B zqw~r6?0j*)I^Ue{&JX8j)c zP3NX}Gq@SuOm1d3i<{NW=4J=;zbl8E)6M1PcJsJ--F$9-w}4yFE#wwZe=j9;#PI5xz*hoZcVqATidPU)^+Q-_1y+;L${IJ z*lhw#Q@5Gh+->2ubX&Qt-8ODpx1HNQ+Pj0>(e31RcDuM;-EMAow};!)?dA4%`?!7G zer|tv0B{4{LGEC8h&$9B<_>p9xFg+B?&zo=Q}fc-Bs>tca6K&UFWWMH@F+!P3~rQ zi@Vj`=5BX)0JqcKCO|O<$+pFW%_3C+l z;_G`2yoO#Qud&y}Yw9)gntLt0mR>8bwb#aL>$UURdmX%vUMH`!*Tw7Vb@RG=J-nV? zFR!=P$Ls6$^ZI)Oyn)^zZ?HGS8|n@7hI=Etk=`h8v^T~Z>y7iqdlS5g-Xw3bH^rOk zP4lLEGrXDJEN`|q$D8ZT^X7XCyoKH(Z?U(;Tk0+ImU}C_mEJ0EwYSDw>#g(FdmFrs z-X?Fex5eA)ZS%H!JG`CVE^oKD$J^`e^Y(iOyo25$@342oJL(z(t?dl$Tm-X-s{cg4HvUGuJcH@utPEiVq79r9og@lX%*aF6gvkMd}b@mP=Zcu(*| zPx53>@l;RqbkFci&+=@~@m%k=cgMTy-Sh5y54?xoBhT}EFYrPy<~{bFcu&1&-gEDT z_tJaiz4qRCZ@qWkd+&qy(fj0m_P%&uy>H%k?+4ibr}xYI?fvoMy##(jKaro?!e~>@eAL0-7hxx<(5&lSjlt0=Zn`Q!Zw{zQM0KiQw+ zPxYty(|z#&-}^KDS^jK)jz8C*=g;>S_zV3-{$hWLztmsmFZWmYEB#geYJZKt)?eqZ z_c!<({Z0O6e~Z7>-{x=kclbN~UH)!=kH6R7=kNCq_y_$%{$c-!f7CzbANNoAC;e0Y zY5$CW)<5T;_b>Pt{Y(C3|B8RrzXtZd?%(il`nUWzAM#-z@lhZ1ai8!>pYmy+@mZhq zd0+5FU-D&N@l{{*b>Hw!-|}tW@m>G6f5*S;-}CSL5B!JzBj59VKk!38=0EnI_)q<3 z{&W9@|I&ZuzxLnwZ~b@vd;f#~(f{Os_P_XF{crwv|A+t6|KBKf*@g#C`cS6 z36ciMg5*JpAZ3s$NFAgJ(gx{*^g)IoV~{Dx9ApWy2HAq_L5?72kSoX?@ju$_C|v@elX4;lmwgGNE)ph?g)XcjaNS_CbFRzd5aP0%)I7qkyL1RaA;LFb@L&^725 zbPsw2J%e6B@1Rf6H|Q7i4+aDSgF(UIU`Q}D7#0i(<%76yxg#lezbX|OC<9;^sf2CIVA!J1%g zur631YzQ_6n}W^3mSAhJE!ZCH2zCa$g5ANMU~jN5*dH7S4hDyU!@-f@XmBhz9-IhH z2B(74!I|J}a4t9>TnH`(mx9Z|mEdY{Ew~=s2yO zfD8CQ2*f}N;6?B zFmae9Od2K&lZPq7lwqncb(khh8>S1>hZ(|*VWu#1m?g{_W(%{2Il`P_t}u6)C(Ik> z3-gBs!h&I;uy9x;EE*OIi-#q`l3}T^bXX=V8?-d4;zFH!$x7_uu0f7Y!)^TTZApcR$=R~P1rVU7q$;OgdM|9Vdt<* z*fs1Hb`N`mJ;PpM@32qUH|!Vo4+n$;!$INTa7Z{b92O1_M}#B8QQ_!tOgJ_i7mg1n zgcHL_;pA{iI5nIWP7h~~KyvH=GyF4;O?B!$slZa7nl{Tox`5SA;9WRpIJz zO}I8(7p@OCgd4+6;pT8lxHa4sZVz{aJHuV!?r=}IH{2KQ4-bR~!$aZW@JM(xJQf}g zPlPAKQ{icF_A}wx@LYI4ybxXtFNK%GE8*4fT6jIY5#9`Mg>fMi!XXl(Ar|5x5t1Pl z(jgPFAs6zY5Q?D`%Apdfp%&_)5t^YD+MyG=;qCBFcsINk-VYyy55q^H7y4lkhG8sx z96kx3hR?$1;R~?;%kWkBI(!qp4c~?D!w=!d@Kg9X{1Sc*zlGn!AK}mNSNJ>p6UK)L zVhLl3Vu@o(Vo77kV##AEVku*(VyRmD7$$~`5n`kmB}R)e zVyqY^#)}DJqUaEl#AGo=Ocm3_bTLE3yRc%Gm@VdrZN+wCd$EJqQS2mk7Q2XD#cpDE zv4_}G>?QUV`-pwTeqw)dfanx+#XNDKm@gKHg<_FdEDjO}i$lbr;xKWzI6^EDM~b7w z(c&0!tT;{_FHR6Aij&02;uLYJI8B@`mWngPnc^&Qwm3(ei}~k?^Th??Lh*ZXk+@h~ zA}$q|i9d+T#TDX8ah14QTqCX(*NN-J4dO;|lek&jB9@6;#ckqtafi55+$HW7_lSGN zed2!cfcT^MllZfEQ2a$aBpw!zh)2a^;&JhWcv3ti{wn?^o)*uDXT@{kdGUgHQ4~c< zltq_#NxUpx5wD8Z#NWj~#6QLB;$Pwo@uql7ye-}l?~3=tzs39F1M#8wNPH|l5sAb| zti(yYL_)R zI!j%ou2MItyVOJKDfN(oAWVG+UY@&6Va!^Q8sS zLg{;Hk+fJ^A}y7cNk2%-r4`ajX_d5ES|hEM)=BH74bnzwleAgdB9%#7rESu7X@|5^ z+9mCl_DFlBebRpEfb^sElk~H6Q2IqWBpsHHNJph((sAj8bW%Dc{VM$?otDl>XR-Ek z(s}8EbWsu|Ns=X(bV<4_U6HOz*QDR2KcqjU>(XD+4e6$IOS&!Hk?u&kv|J-NR8yxc&3L2f9&C^wQ{ zk{in}%dg0<%CE_fpS&*n%T45_@*8q9`AzvP`E9wm+(K?CzazgZzbC&he;~J#TgxBH zAITrfpU9uepUI!gU&vp|U&&v~-^ky}-^l^8Mh=vNWUZ`|^|C=W$|l(?3$jJF$~L); zY?p)O5IIy1lf&f*IZ}?2qvaSmR*sY7?)Rl1Iy9`H%A4fP@)o&F z-YRdCx63=^o$@Yux4cK*EANx{%Ln8i<)7rA<%9As@*(-Kd_+DfACr&EC*+gzDa`+? z{F{7QJ|mx%&&lWI3-U!-lqFe~UGgRQvV29pDqoX-m;aFel&{Nw$v5Pi@-6wcd`G@3 z-;@8A@5>M5hw>x&vHV0PF2=>WI2Z5oaaD6wclo+%xN5qdbJcRycGYp!b@{pKx$3)~ zcQtUm;A-f4(bdTHlB==nW!EdNS6#2UUU&Jsnz)*}-f%T@z3F<(^|q_ItA(qj>mAp- zuJ>H;yFPHWa@UjpS!+red+qj^|k98*SD_kTmdePE6^3>(z@Kb-YOU zXI1}Kb&Uw&Um{M@m@wb{R|AwzFBAM~N*-{p;`|!Uo?~B!?*3R`6VMdA0h*!i|CZxT ztoJSOHfRo7fR^ORz;|$d7rY1F2Op5?Pg>#J8hi*o0v{8E&Hv`(6H@P^Pe}^-jMO%I zs`5GUbACZyqg7uLgy%DkuZS=EH8GNJh`v@u^S7i?&+o9V0A+2ODr*cR4Jx{lATn%_ zmawThG9yt>TKT&h42W+dxk=@j$N^$Toqz~?)?q=V_5Vda*vOLsZOHW}c2b=L6LLKS zJ_#k|sS$>9xT1Rmse3&V*HIuE#E>U-tLhUAJ>rlX@#H|O1hRd9BB^w(gE-2P2(i1z zB!d*gmeeKfP~RTq4xl6G1Ui!e zz7^x#=Pu~e74_XfchCd$gdIKmR4w;HpWfuj>s9OfpuR78GNNkz|Ma>adHqR$$Ql5g zAeTHT$|I&P{-<*OzwSSf4EZ3RbPg&Y#J`aEJXb{Cy;MvBE)F83`CzgqU9|-B0GIY6ZVfWh@-KDIL8tDC*#SU^ApG${U;KVH;I^b zOeQglr;xxFQwb@XMjX!RnY3sI;mT%`mOitHw&iT1KQ@P)`erU6zVk@&!1=_# z!2;ydLeh!(o;2}aL|ASyA+45>jR8wZv%+O0S^EPi^61H$3X;!+Q6u)tRR4e|Gyj15WLIQp!3!5G!saJm?uaHBe z`HzQ*|BNH#JbRQpmwyavK29dTeS%C2J4rOTr^t%ZUvUThjrbOvCQ1Hhu)edz_k(lf zVDWkK?dA)361qql-xUcrUm}{CGVzUd5#Hw#bh}K5&lS@0^Q$D-evL5XcjEWbAH=uG zpX7O(wAV?~q`wH?>;^d)aFZ~8w_yL-cK@g>z5@@jR)kN7eHw5|r@Z?DPt z`8~(@G^@q1mf8$M>M%@UU8YeBKgKe$9z&YcXBgk-nS#^?3`bsILbMH;CVnq6{7a1> z?&H%wlFfJqlsx)-^@6PfPU^a3*+C|3LDulrVZ9) zXKIjOX2q%y=JT4N%o{I+F{P8knMOW@=dsbLZDs#^DpkjQTSk zvJ#kjOd`XcbudX;Nla7UWag8S6ozF}8RC})d!{pijWd{qx=hTG#Sk`|VP@no!Ohz; zPDeZD5Zj({Qhhowq)|u42bqKP#L=0__wB+E|E`P=-;E)kbVs=dV{!CkWK%C@b8>IS z;@5`>Y}uFbZ{CmDGowGV&TjzY?{qSF0%WH3$zw|L2Qudx#x!j(9CjVSl+`R@c6>XM88~VbGwYSnOi|DnhBJ(1 zmNgy6G;cMYDdQ#}Rwgn{=TCx-Co|g5r!cb$rotD~m^%K`nK$1mWxifB18beh_3mNmp?-~E0i{O*R%*caFm@%&|Wtz`h#!NB& zz-)CaXR2veFwa+C$&|#bVzk=TOfkJLu7S_iGCNkSV{*H#XAC6% z#+TWGm@H!gM{Q;5RolkQt+AaUzB`zvAMRv!tk}hzet9=TuJ2(6m+fWpxP1(ZzlcnV z4=|+tkFfhsOcU}mB$7AqXA&63hO?9x4T zS?6FscEQK>SmLbD?$tcc`Z*i0ucyAi@}nBEedzPti|hf?h^@BcC6@iDFhyl)5P}Y&20W4fsLwWVFNT)*00RQ&K}c-O`dOOf2$G9 zx;J1#LRkOYP|O{M>B89(O$1v#Ad;OSMzPGB(QJ5X4EsmDShio?IF=aWS>Fc>_VCgomuDbE^ME*UD>d1-PlIWy0ZZ%d$7(uJ=t2kTgP6kW?65x z+0Z_$p6|=_V+w{>Wwm5e*n;S5OC4OUBuE{vo zw|G3uw4T8FYbUbJs!w9;-tAOpd$4R9+lp*w3&;+{*G~4$+Pm0;=H2YU+&!$b>0Y)LyN~r*y`K$8KEU>S z>qpj^{1bbH{h9UkJ;-L9{)O#TaESfN_b^*}<_P;u(NUHJ9Ak&pJkF9|POuAoPO@*# zJjDj&|H}Hk@EdClIE|P;!#4Ii%QhW$j?H}OJUhbY0_z-ek!}2?$fo8?Y*K;DmK|`h ztp6p}-}f^6ewQokZ2zn5$Io3u9RJR~+TahC@&A)0dDq$FT*2s zq{RnZ$+%V=6VRI5w)R6#ll&2M{Ftj&^Aj$3?x$R1<}>cy+|N0(>kG*Hl3P~$E6zFd zYp%uYZ@7TMZ#h!%9mkpjxTIDZjP_DIK80-_y`LYq*?A%Chc0d$Y zCoq~Ld<++GFqX@8#&LFIJa_xO1a4&AM6UV?2iKxn64#d`bBr;C)9X?>TV5LHTb9oG z`ekrFtunb!f6wBawX(T@v>Z+t-Inw7ZO4&n?K%HT9k`l%I&yiAPTW4ynfo}P3&+0S zm1F96q$;SdP>l$N3H(&ym0h95GJhz9N%2hwo&LE1JUj z6insF$J4kP%yh1~Sjy@AXK-ZTOm6<0v$#fav$@%y%;B^r=5p*S^SDdwd~OC=z!7dC zXW#QZr`IgvNakXWpSy%}+*ryD-r%;uGH&ypAGix-ImfnL!F|iFM7*rx$e`6+XKoFb zTez01MoqPjEB0N_5&Z@(K(mqK>ukarH*-xJZsCk2WgHp2m3y)2Hm*@ucjxUKslS6` zTkk{+?c(x$cXQ?md$^`_|J}>gtG^F1yr1JIAK=1U{>TOLKXJtVGv`OYFCXM4?fivn zx$F=}N)K~2%||$2?kLyz?PDAXIL?i9p5W^Hp5y|GP9bl8<=6|qAs0_`t*V{joI}rY zJ8GTd%J}op?E-9m5o1KI^$7`Uk~tPXHIoLHxaQO z%{65{g{EGqa@xQ$PKF_@L0q+~wif6aA=E(~m@&P3u z@gw~|=9vbc@K)+ay6`F=pYl%UXMErbpF{sIc=nYqc~b2wo^S9qPaNOyMbp3KPpQ`G6Nv$`j67jYyf0(M&*K6gFu{UHBr9LD zz=n0V;Yq%oX99wG!iVrlB$OXhJ&gCy3+L;R2;NR2`I*h4V25ZPUvhE8@XXh-uw@*4 z5YH1+0^giX;L8e=c;EfWe8=Pzo|LBY4ONxWcrqcKH=fVntCLLrtR%H;FTmIb_zUm;IU z6!9ODVm|l&Abw!$!F(}4g!d;ydE!5eA0OaWb~x{sKZ0*kvxIjVNAg|CD4u9W^DW32 z-dxY!K9=9Zj^jzmc*viCn3~9wdXo@`lX+(66h3mVyU$dfyf=;a^PSH71(fps_8GXH z&E)O;EWWtaY{c6f*nBR}I_AL!^Z5X>0OJ?(g!`WN_g%#MGm9a2317{3Deps;!H#a3 z|4)w}cqduT*BHEle~nqmfBwcQo^7<6ck*laj(%(Tw^Xs~pyPU;)otMU;*I&E_Y0=DAaRK*wKsKizM9Y4K^;tKvArliag>AUVgEkn=GA1-{z3i@aY)k@syV z@ijCuk1vQgT)h96m-um1e#O|!d_dDHynm;wd}H<+?EX9d_RK$c-v3XYbzbM$t$!gu zZXlj-@>|I*zJ>p7zI5mvzFGOktq8e`HQa;0|K=IzeZDdCfNvh~5WaICk9bn>m>bO~$!+1|*QlkBQ}d3GFL~F8A@5=S_aW;8AKux@XIq2TnCC;R?<1ck zUjFc$=VPBIPd)*kg3rL`;0y32_zHXtz5(BY??3?1fItugv_J>+zyOTE1k6AH7GMQ7 z&<5B+FbDymAPj_q2oMRPKs1N}u^g7PJHH zK?l$gbON107tj@S1KmLn&=d3my+I$)7xV-D!2sX{xgZY=1o@x<6oMj93@Ag9TtA z_#P|*i@_4G6f6TjfaPEXSP52v)nE-+3)X@4U<23)Hi6Ax3n&9y!8WiR>;OB#F0dQy z0eitdupb-%KZ2jY&)^{V1snp0!4Ys290SL}32+je0>6Uaz-e#>oCW8=d2j(-1R{`t z3|!z6xD2jWus0OM7Ur+H|nw4v++rK?+C(X&@bBfJ~4DvOx}L3)+G9pabX#I)Toh3+M{Ef$pFO=m~m(-k=ZY z3;KcnU;uD}T#yF_f_zW_3PBMl27|z0Fa!(*!@zJb0+fJ}U=$b)#(=S492gHKfQeud zm<*n#Dc7UB=7uXH<12iyhsz~A6LcmN)PN8mAd0`SN3PZ+=g4)DMSR0Gw4FQ@@(g6BXjP#e?%b%7tK z2kL|8K?CptXb4^ejlfHwF?bog0$v5Lf!BdQXabsoH$XG+CU^_H4Vr@%pe1+*ybIm~ z?}HCOE6^Hz2tEQIgHOPx;4|{H5Kqkln*&qkB z1?@n4&;fJ=oj_;M1#|`7KzGms^aQ;?Z_o$y1^qyOFaS6~F31A|K|Uw|g`fx&gF#?0 z7y^cZVPH5I0ZPC~Fba$YW58H24vYsAz(gU^!R;R)SSvHCO}If^}d$*Z?+yO<*(F0?NQvunlYnJHSq` z3+x7az+SKq><0(HkKiZpGdKu-0f)e0a0DC$$G~xL0-OY=z^~vpa2lKeXTdpe9$Wwy zfe0iZ0~fdiE`uxJD!2xI2Y*z5>J<$782l&Nu7kh84R90O0=K~(a2MPIe}ntr0eA== zfydwpAimfW01G(410PTgR0qDG2B-<11GPYHPzTfnexM$x51t1Nzzd)uco8%LFM-D3 zW$+4k6}$#s2mYW5XbRo{&A^-BE$}vI4qAYg;2rQTcn`b}J^-yiYw#iX2z(4a0iS}; zz~|r#@Fn;Pd=0(<--7Qz0MLLy5CpV92lT)IjKBoUKmZnC1vbzI*g-G|0ihrago6kW z38FwWhyk%64#a~5kO&+g2_%CQkm~!y^DEB3meYLiJxRxy4Bvl$C#6D2Ci-T9Y>)%m zf_9)i=m0u`PM|aB0=j~3pgZURdip;7E>MN+|5MJrd>=pQjkWXveL+9a-}lLPRrMc$ zdME6f>-+Fwp6|m~2Ko-D+T|av8GLEx@Q&Ggp%uP69{_89@4wSke|RQT4++U-5X?%0_aC1Mh|< zk?Z6ya)aC?x5#aBhukIi@ODOTl7KJa{YiV$f%GN#A4C%T56%ew7d>P*!T%nB;GZ-i z_y;-2QG&k=OiqxK~U=szW2Byq}1!GT+&Rhxg?XvT4B~R`py>g!W^}Ju3B=B zH45_tlQ7?_ZmG~lSmIS92n)Tgy=SewvI&cy+0Ox+|4)uFURL)U8U9pDLY0~bQ?x0{ z6l)4IMJg>x`ec2IK2@KlPuFMYGxb^eY<-Ttt-hVUy}pCKqrQ_KZ=>kD=)3B>>AUND z=zHSY^T^fb=?Cib^#%GueUZLcKS)1VKSV!NKTJPdKSE!kABp~>^rQ7-^keno^yBpt zs*E?d!|xvtjXBU9WY(H>X1&>HHkr+4!E7;G%{Frzv)vqQ4l#$C!_4942y>)4${cNu zF~^$Y%<<*~bE4T{PBJH(Q_QL6G;_K+!<=Q#Hs_ezn%kM%n>(00nmd_0o4c61n!B01 zn|qjhntPdhoBNpin){jin+KSk=3H|gbj$pA{Vai&AdA+bv*;}bi_v1Tm@R_EVzF9m zmNpifz}|a z)~d7Wtp=;nYOvq<)Q0S^HZDSe@2fYo2wWHQ!q4evK{A7G%@fbT+-sU^CiGHnUBzS!`CD&DO?dw*}im zY@xO=TevO47HNyJMcZO*v9>r{ye+|&Xmi+-Y{|A1TdFP1mTt?iW!kcA*|r>8TU$F@ zds_!vM_VUbXImFrS6eq*cUuozPg^frZ(AQ*Ut2$0f7<|?)0S(?vkkQ6+X`%jwjx`x zZIErSZHR5CZJ2GiZG^4FHqtiAR;ev^2qkw-8WSy9H8y%~qp{O-t|`w{ezVhRbV^^( z@u|qdbWKK;mL3}Sm{O09_nx_P{EgcC!UN%<@aUQC9s<GgVp-l#X}&0g(=nj%esrdTsbGtg9M$~P663ZBxk4QlL9)t0X; z81>^cAxi6bjgFS|%5@UX4y9b)-~Bm-u1;f0ftNb8JHQ7uSlVA!mX)!9%V`Qo( z(Bq1b8G%#PkrUNY(5rzuGgyF&np+p!dj1oo*V}!9DF(C^s;gWD! zxFTE?t_i;je+YjH*M+}?8^TTDmPbGDng99ffbgU6lkl@}Q20eSBpeow2uFou!g1k* za8fuW{3`q=oEFXqXN7aZdEtU^Q4j^`nX|ML+6x_ojzTA)v(QE8Ds&UN3q6FMLNB4W z&`0Pi^b`6E0|cj#E940Sg?ynvDD;w}F<1E5rNrpBCy&>I@ zW(YRu45@|`gWX^-#2K;-*@j3%j-jm~#9%Tc7}^=y8=?&z3>^(&2BV>qp|c^%5O3&W z=xPWxm<`8@L_-flPeZstF!VC?HpCkG82TCSpS0>SgL_>S5~rRPQ`ZE{%XpQ-<1>uNg?|(oJc!&K*PjHT^Ul zP44*XP22iv`e-_vx~OB^^SPhdpMCVw^rWLITl<;%dX24Y!CYt=@Q+i30DU~PytR2!xZ z*G6a~wNct=ZHzWn8>fxeCTJ724sDV)S(~Cw)uw6FwHew>ZI(7$o1<;3ZKrLo?V#VkAyold9M8FWUSNoUpxI*ZP#v+3IC?7CoG zh%QtYrVH0a=puDdx@cXDE>;((i`OOS5_Jw;k}g@7qD$4K>C$x>x=dY`E?bwQYpZLg zYp?5|>!|Cb>#Xad>#FOf>#pme>#6Id>#ggf>#OUh>#rN2bLw(+dAfnRd|iRAP*m89r2O3c8TniD&*y6j zk_vJQW)y5KIA5SCOe)MRoKd*7@H}o$NkzFuGm13%nxMd-pdf9KE=V6_2r>qlg3Lie zkR`|(WD9B&WDg1s3JD4g3JVGkiU^7fiVBJjiV2DhiVKPlN(f2}as(v>B?qMhr3R%1 zr3YmMWd>yhWe4G%CgBHRxv)Z5DXbD!3u}b6!a8BSutC@;Y!WsLTZA%UtFTSjF6EEG@6W^G@UhFG-jh2_%Afwi(GwO|D#&Ba_V?Sem;{an%V=rTG zV}vo%7-ft$#u#IbamILKf-%vUW=uC`7&DDo#%yCJV`t+?(?DZKO%G$CafB(*go^<{+eFYI$U|&$^X(JX(rgkVeR)tn#|^Dem)( z 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޿RV|k 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

    25IYfGAzH7#md+O);I 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%0D8Mn7YK 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%0DHKnpe%I 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

    ?L*pc!mARPhuN@ z*BFs_gB=9kVjJ@BuoJ*Z;63&M`-pwQK4aH_x7j+TVLEmWFfbFl1>6QK%*Gt-0?rUB`-*+TzGFYIo2je7PwY70VRteOtd_n9TnDZIzpy*NZ|n?k5x4~W!Tw?+ zz!dfmy8+w;n(({8H2f?u9dE{G;4OG7zBoMrwBe8c(+K!*KOVq?cnA;U4}kmO2p+}9 zfEa!yI8uz`2|S6X@HC#mvv>~Ivw6ILJFy~O!bgGgKpC�R9Mg2vqTQ{0UIQXW|`r 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 #IqumI^_+SIcA5GeHHKba zQseA5w0h-l?RWMEyV&*PID_7D3S$aI-vTgZx@uY6CiS;(%%FI%aZP8vK$kI55An!ySpQ%Ta| zIb~UxTr`ta%#5#kSdUh4Y@Wr*CCR19Wy$3dV?}ahavnTIq#u!6>`7badsZcvnHG3T zldF>skDd6OM6OA$O|C<%%j5Q}N4p`pF}W$ZIqC6G9wze?PV@S(eXy?T5F1j<~PS&ZeBtIBlTX&IMyFFKv*OG0?>&ZRDzJa)Q)N-k( z4(K;gJ5ljXQrnfhm8{j@hSiqtxxr@=+2Cp|~Z$>e@*iuf7r4m^$c9jrLZedFHP{rVChq9jfPZ+;8Dnw#|Tft6Zg0+EbOGm1lyci zjWxn}(jH673OnPmrRJgK!05$2E`na1%6f7h-ZLNif|NZac=8?xbcNcP+J{wGYT_|V zQJE{{PPLPDL8Uw?Z%V0Nr1hozVA82Ts^IDO>{SO-_dF%3g{k|V2cAXn44|K4%Od&u zqHZttA>%_&v37B45a=V%lGIW#9((Ni7VWas@>JMx%djHl!~cN|el?|5!S}b6rk;4t zDxZ4hsc;@ZtXNj3UU=4|9$CvZmo3jdo8)W%#eYdS>r(4e8&VrnzsZ>KED^@$)E2Z` zXV}}IUA4aQyhcn}>J8*u&vsx#o*k)ou+-X}srP7yJtL62QXRG!zE6DcM6uKE2G6Sd z=wZmSx(8NyYSdGa+MC)3y)v~Q61xlJ!PKEt9oEk$&tZa9r9LCu5$M&ZM^nA}W2qWw zt8j&1J;zfgpx37AQkx7<)F)G?Qm0dAQeQmdp4ry3sW*oD)I)hgYNz}hSop4)vZ#37 zh18hmVyatzDb+|&(Su)}`lf$b(-_XyDUET$GvD^W+yd_{HCCm!HMPz%2lr@}_lM_l z>YL|E>bvJ^>b~5qZnItkt1Yzv^LQQF4b)N0!KCLGuAx2E0ei|b*ZT+7%~U6>uGCMD zT>jg$(OS^V_TEa}PRYF8sUCQ+F0p6)yQsb2EoStKRiAok>`mQG^??^kg;T`@6+K$a zHTDv3Bo$4?QbsS6(s(yn<0+L_;a#Unq<-jhUKUZwREqSWMPxdaNpUHIx80HjHe1AierO}+Wq*v*!K(~8s>CN5^h9#zL-ksigX+1_) zlrBy`G|o?N@-9ek@jl0U)1G!n8Jy`djBKOVCE4PLev%a^YSkFMJ58lu89b8z7HXf@#zpDH=?d?X^daw3 zu#Vz>S9zDEm#23c_js2YR-`Ktu`+$oTZa*>A{md697nwe&~BP}hlxG^Ev1CF8nObT z9M`N#uT8H@uZLYjVmA=~#`LCirD-$tW8Plm*^=H$@YCLHq!qK3LEDbHBfSLY=1sO! z-jm31+@^M27Tu%1x8kl#$VdnYVCBn~};)0MuJzMby#_5$lp_oVNndx7>C?m|wNK4^Em zp>!DSM|~uH*Bg@Jal$296rPw^y%E?x=~-RrpPxSxKIPJ0JP zzK28(rc=Z#_VWnHV}jyW1aj?gXJ&l(w?gndMSX_)JpBTa^S(^KO239CmN!y6ZRNbJ zYWy<6%6OZ8m!32W-l6pS^l*A4y$Vl+(flD@Vat0zrbpAC(x1~`NNfSUeTA0Rj1hYr zvR@j(xAgb)57?cipXs@{hyT4yfYD+Y@D6%^kqp=s(cVK2r{OoWKd4ivvoe3%xCYg zH<&3Q{osnM3p2kE(|{2!$}9%D1a&FuPtxzQ%miu0UYBQ90AHC|1^JDjOK~?#GpjQ{ zylXORGwU+nz3bt_Zzjl%M8jzgnH$W1yqhvpGnrIAoN*3_Z!220 zZ(F7;6UAMf1FuYCD16)D+mYD`ISbe_>`1>!&Rsynq9M$=zTKHUnet3UW^ZO+rV_sW znFE;!ezoB=NSKEp52IFPj%2C{BKnSI^uA-Tw7wb%J1(_0--%3ZrY>VZ{*%Cp(4LZf zSS_acuuZq6!tVP48KqHQ92bH)K* zOQtn*nb=|!cB{cAk!t0 zVWB58i+m}9r8A2WkM-iqWS06ki8n`+%`EffGRu8@rb2^VCzH<wJysSDCfGO*3q)Y4XHavGeShLAOd;k$Q{ob*9YsCi6D)4jDH4 zhBEKbZij!T#2JP?k~x4Y!B+%ejCBw3EHLawtHe%=w+J|R@-m~DUA|A5UKM31_f_~# zko6{dK4-pUzGlWUj_5H-D5a$SACGz~tEK=?FO=R|Av^tVg^x+#; zri%17ZQ=RI{LcKz9Pu?7RF=c=Ol9U64iLs6-zM1st;n0j9RyO1I-4_*aUX|%)HjEl z%gHzwvUi(K0FiSF4p+dbI5pZqQ;n|{s0R9Usq<+$9jAwV%y$x=>0;oFoQZJE+!>(t zJ_~2%P7}Wk_&n~EuZTPATWl=m<`domBG366z_AnEK_pg=)k!oL=jJGA7kt;O=Y1Z| z%lWuQurHFVc=P!D@HY8quGtrW_DmP#T6`tYS_xwzw}@NJE#WTvit*dXhIze0@UOaG znybF0+%;bh@MYjn%9lgp8S<^*R&qx5h~+w%TJzIEVr`L-(8a~rsg+$Iur3%<=wsRfaO(6Guo!kT8Jzp2sA)Z;my~VB7Y{j^5bKTsa zuZOG0b9T;fhwJ6i>bu+%auxVnud7^ z-%H%TR*c|2GQBW7;B7Cn4FlXmZk)sqa*wz%XcHLY58q?b=X==SeLo>LtG@Y` zsh@B?x~JSTZo;=kH{B=BM(}PYZ-OabgY7wqdqLzcc*OD&RypCnf;P)9Vw1kt+#BvK z_l_F^_MVdybhdw(o9mxL^bt ze+H)aZ&$4KY{D$6!TiEKQhnvd2zQ(__`h*Rzsdg{_F~fy?kB;;_zL?3XZHW%EdEJu z3fE)v&-4H0{%}R4H>Nhf=d$HYYnbJD>1mS$WnDZ2_?``fROQnRWP8 zS*2W^bpmzyHCeY`iyXSFK1%^HWQ|!GN0H{C;Pa7V}Gt02x7v-<_p^1pN#Bo~+-v$iEo4SB%N}vr7pFd#s-Z z637O#!>UfKPF8hI^#$`%6LEcqJ$Pn%8?G%n6A$r|PB{7bWc49k#hgMYn$IodOr;Rjg#E3zv| zAFHyP{G+;~hSKa6^lLDz&c0D>^arp;8?m0(fb#+4TAK}Hb*{^9Mlb7uZSik_+?d@2 zxy@hZKcwI4-<;h7YpaN47g$y!!*>5>ZCQ4Qe;4#!h}`Ml1G(E@?yo?**S{THvFwoA zX-kw7@|{_eX&+d-;LBKcXDj`CptY#?1527laRmqb{LDLiIm+M5K!UZOki?<9H`i$ zP`1f`$sf)}ve9fz%EFK~o=s#gVib*J-dg-u{jL6HKbyVmPi9luboL5-V##E0NZK{D zTsE7{W%+E0<+@+U=CkeoHpz<}mE`Tu-a~so`ye}zy$RoUti}$)d6*r{KFW5@@NfAa zXP;!d{kMU1qCU;u@%Nx@AouiH_OAbVw%6b1e<6)KGw~`0DJhY)~ z#D7XL*Z4j=oV8dsTB67`0{p`a>tlA5=rMRcWj{mzlKq;E`x*aOHUZ2cXZ;C`I6t=_ z_tbCCO&Oo~U-%u!^PKoz`bVv={7%@eoI6M5JUK7)*M1+QSl;;kIXc&jmG;8?*8k2w zE0-jbL?d4YaknX1v$d5AMe`j3B5(_@@OZ!XhkKZa=JQqU#+0U z*}05s*3(Df|7rc9J(jD>>YBRz&E z@kGvMt<9NWzmjXMb-9QhdwR*qoP{>i8RWo@mYZWLwp!`a=%EO_Gr47E8*R5Zm1lE< z=xMQeKG2xfPH(al(=w`AR}bbMQ$ub6J#0LeI}htZ&Ou+y9U;#Mesut8%r)hj(YByY zm)6|n+?AXhck^nF!7kl|-Tf9uGhJNtwVa!7%U#di$We4VqPAn#oh}`@nJJ$_q#;WW=yG%CCyhC`skau%^xe!_(9nM8^emV;MjLL&6@zOEEI!0m`=w6H@ zo=XrE@A+JpHkms{=4LvpL6*v;a~b$)#B;f9E(e{L_*frA%R`pHU&saN{@lIX{oF$O z0k8qohp2<7k8+P8pP()V^C?=fSWVAz&vQ%Y7r8}1UjluVdky&}_ZIS9Zb;&Z-1m|` zoEyoN8kW*ZTaS56QDyr;@M6Ws+-A(_GI}((oc@&iocr>x*sr;(nicd|ZY6pd2fm8# z#r&yE-)1gYG zYMRZjx6I+^@-kSzOmaxEEXT8^Ai9!Y5B4@A`h=}U-9&GoHN2MB@f&G9Z{Ur*iQhtR zrp@q0z}re&cq?y%HILs$m(fLhG4%Po+|p;+pfh8AZ>N_i&dV0cZYp-rdt^BO@pdrE z>D~0W!NKpOchMPjg=!C7fu8rGzS16`57BDNXFS19-UY6k-$(DKDc-|-VTq-ZK1lnZ z`%!70HwDlhp@V!0@h{{T@rUWf(3kMXkZ~#R(;vb$R?`d3%lPH|QTjN&0^XH`jalYP z`6}?H%W8fNzm{JI-+KN8L2Dp4@EiF}guj`;D%-+u<@;>g_)GLj_|Br1@fYYbXt(n_ z_y@8&dMCe&ucuGZyZJ_-d-w*roIgijg#NeG(iQx9x|!}*?dA9J)fitTzn^cy+Bi)g z;5!UW^g;fRG(wz<_$vMg?<2b}u7p3zU#73n$KbEwkMk$^ou*oTKiRon;u#MSp2l3q zpClPh@ux|9MSF(7hA~{HuhM7v$GUpHOy5SgkWn@8=cL}w^B17C(ie$+2~vsm)<~=- zBJmdvzK3q%yXjW`GJl1?3iKM^#$V@e@a@n$_?vtu-$l5$_}hFp-@~`lUFb(;?S;IJ zdXv7xcaola`MY5D@ptGD+Atq7N5mX-l)pjyFfTEFxsCx6N4;wcOLKtd&UDlgp&7b? zoKcf>0{$$?h&MR)WES>xNkR+Jhb<|Br1=bKKUouW8hnn=&@7$hi}X=CMRRnH57P%V zJpb7u@Oi$-{MLZexB0qJ%(X{Z;QRSL`W}Cu+Tp;iM zhx{P_2uO?dG2c($qn|*3$|sap@RU4*E=ZZ4^Dkh%M194-hFoEI!x!kcJWs!aHN?N? zW%^-gVi`f3r$6w$mXG`>|B3%B;iB&g^soFF?^TUM`$jz9AqVLn{0iN1(@*GA)(L|D zB61S)H$Q-J{Na~cr}$X{PDH{o%R_oER@DP(d~<}kf(#yF2afm?u1w`kT)E zKV^|HL>CM5g$0PPlRWsFg5VTB&@N(qq}>7~;U2*&_yo=*<`|~m(|&;#0s^bencvOy z5d?Q+#`>qXPXsFw7Q+9TUL-6QmI(7qqd+ULHowqIfiFW{j`|ho3gH_)PGY`8t^~RY zb-L*FWArTC?NSL@E&QZ^&}(2#(rbkYdY$l#UO&U$0PQ!u5pt8TS=b^>(OZRW#QO)C zX9fOdog0`FkOgMLmZO#l+h;QTW&F2xr)-C?bB4JKS__^dMc|ZaH$jzwJ;D}^D!|Fh zg$iM>;Kp~WhdOm2EYqMDEvhb{hZM^`p;Fi{7y<_bM)qEP(z?oYP%s6IfkVi2Sf~=r z5)WrU6LxB#)uazw;HY2?SOUj{d4U>&;N3yE#|6LTgitFK1?mKQU;)8S3a5nA!WqFC za0FaHGMckOJ)+!!2H~7=UbrAo0Wa{2f+uiE$~HZ||6T4;Gzv|G?+Y}eZ4p|9%V_<` zRVBk0LFjZK0PCu7M{$iX@$F8yF5D2>g-?bK;U=)F@*zW~5Cm&Kp7?*tqQJty8=O^2 z0#~qeb%A*c^|sJ0^pH$Nrp19JfmPRfd|5X@Q`?ps}{_h>z=3vg&x&KJTGE-Bpfz87VeNQ6Zq?m@jhmGZ{Ufr z19xb;Oyd3bRCp%r3p^Jp15b7P11|&(_HLZu1BU}gFoG)7Lu4e?L>>sd6kZ8Ky4S*M zat&{Ux57K&DDf%vLm1I9qEF|q3A`8Ln&UG_&VB-VEoxohBteIT`oNjMY3Qd=&juO- zBjl>i1wIJpfm{e^3lSUT&R?9{;8`wF+$5%J# zk4?J?vL~MkOewx74qB7omgg(-d-J!HZ`Awp=|GXTGQU3`CgbmxPxp2pe-Lq*z@hvo zS&@hHT%d|%$_8=)9y#&>0rLN+yuEzDKJDGMpdD zhtQ)o_#yu>KbqIiWWiUx{AaL=jk@5M{MUS5*Fo;e7|CFm;f=%ohWb7KBma~5Ch~)1 zltyrV#Jp=YeGo&MsJkw&0wC1=d{Rl@;U#MWHx2pY)_G zh&fe-qM*89C&)eR0<;=%9mIA*Qb9M-(PPjP^h)|aef`xgV#m=UQdjT=^#w!052g{e zsbDTx(4MkcA#DX3_`E_K{ zkhQ3Fg_DI-h0}#Ig>k&S@P-ebEgTLWLS%iRp>Ph2zvX=40l@EkUO9-6*sd>Vh4GtgTCbvruJu zkJaBvALpvMn2G&!!Q#c*$CE3Ib4Z*vGzCzq^M#>o~oC}5v=Ytnu zH=({ZL<&*D9>DGwgT|mX2QLLL1{;HM=!wF5%pzMz5*EIL7fiO+;N@T%b_+6O3S1#u z$Pq6ODHN^)%|p9__9kj)@J8@fuu$j-uEf64U#K?UD|7|hgKfcU!TaDnC=3)H7On;d zp+7>!`84>r@TAZa><&IHJS#jeyePaR_%iG5AZzOlzAE$~FGgQ@Q+Nx{J;X%LyW)|C9|1ML!GgG0b2hm?S*R zAX;VrCH)HQyD_T@asQXSyN-%uOBaS;({RS`xNDLb&YbZYcS%EpkU)SKfj~%tl)JlE zM~S<;ySux0+}+)^zkQhV-go5Q^?mDI>;2T;uKv%yGmSG}D>zkmx~@n1O?$Ir&vdW!dGPY*-)65(*QGDl^=>?KuGC!w z*%ul|fM+Xdq%r4e9h$~K4gb$Mi8Kl7RQeLgOqSA({Y;uo_isF>xik-YgtVBJ(lV%B z`(VDmtxsvpzW$$mH|o^%%{mSA>gg-sI5*O_Kum3AHs;-{v(oqL?$+6jEe9;`)IF+m z)3-s+gE|ki{dCY6dw=$aAI$o+E=))1IGqBKCw09)i1$hNP51lH-2Un3bpt@F0T>9p zs2h}iSvMHe9uy2o4+Z7>U(f2)g87Y)Jzmuf`=D?52PJsjzOgp)gZ3y;j!utBk8Ny^ zOOJ0X-`2gZds8>sZJBIr8EtdxC#5H+r=;^hdw9#K=@#|V($mv3(lf#6 zS?QLIS*_|@gK~Cy4(MxB|Dt#txVQ4_=cXUEo!7XI`CwU4zaTxj@m_p?{)Oqb_2~oP%KODv+_d zF>6h_w0>U4>BSxDJJxrqSHL5d&h={>BMp^nzGHc^<;nD^G}gEs zr$Nt|^jWYx*BCnwmKV|&({I{dN?%Un^;baqDsU}*J$)m6GkvQui>QCnc)ODIRO2jk z{p~bUeBoAqUv_x7Vt&x1B4N`!#McN^SND=(WIQqfnTSk6CL>djsmL^BIx+*9iOfP~BXf|s z$UI~|vH)3#EJ79|OOU0=GGsZj0$GWyLRKSdkhRD>hFnK(AUBa)$Zg~fau>OW+(#ZD50OX6W8?|)6nTa`M_wQ=kyprT}Dfwn|jp{>z;v<+H-f{%DZ3(+F9Jz9*GprvRBv?JOH?TmIo%h0Z9Ia+~sLo3lL zv^!dj_CR~0z0ex87Og|;Q3OR%48>6bB~c2cQ3hpE4&_k+6;TP5Q3X{|4b@QtHBk$- zQ3rKV5B1Ri4bcdV(G=Pn?SuA3`=R~O0cZm{5FLaLMu(t7(P8LtbObsQ9fgiY$Dm`; zap-t-0y+_$gic1Mpi|Ll=yY@jIuo6R&PL~;bJ2O|d~^Z25M6{WMwg&V(PijzbOpK+ zU4^bj*Pv_Bb?AC@1G*92glM;aEF$}{o z0wXaBqcH|!F%IJ~0TVF^lQ9KTF%8o(12ZuTvoQyAF%R>x01L4Qi?I~e8|#Dh#rk3W zu>n{EHV_+x4aSCGL$P7laBKuN5*vk$#>QY{v2oaVYyvhBn}kiqreIUCY1njZ1~wC$ zh0Vt1U~{o~*nDgOwh&u{Eyk8$OR;6xa%=^*5?h6>#@1kKv31ybYy-9t+k|b#wqRSa zZP<2f2euR2h3&@nV0*EB*naE)b`U#+9mdkw5$q^-3_FgUz)oVPu+!KX>@0Q;JC9w! zE@GFk%h(m{Ds~OKj@`g+Vz;o{*d6RHb`QIcJ-{AfkFdws6YMGW4112fz+Pgnu-Did z>@C(DPvW_F9^L|PiMPUADx5EqZBD_6bjF;f0cn7>A-U;uFcfrf>u6Q|K zfp^0z@hZGKUXAy_d*Z$D8oU;-!|QPbM{x|taRMiC3a4=fXK@baaRC=`372sNS8)y3 zaRWDT3%79xcX1E*@c<9;2#@g;-W%_O_r?3+{qX^K13nNRgb&7t;6w3Y_;7p#J`x{= zkH*K~WASnLczgmr5ub!l#;4#@@oD&UdmXdVB-E5#NMw#<$>G@oo5ad4M4nL1yz%SyL@XPoW{3?D8zmDI)Z{oM`+xQ*) zE`ATck3Ya4;*aph_!Imo{tSPPzrbJOukhFS8~iQaoJbP6L>|$CXi2mpS`+z18=`<{ zOSB^ji6WvsQB0H&r9=m!BhiWIOmrd2h^|CAQ9*PgDv2thJ5f#aAbJwLh#I1ns3YnL zgg^<5zzKpN35uWzhF}Sf;0b{c35k#ig-{8N&$sC~=H9PMjc45~qmM#2Ml& zagI1oTp%tImx#;672+y!jkr$SAZ`-3h}*;+;x2KIxKBJF9ukj;$HWujDe;VWPP`yq z60eBY#2ex*(VR?@xnv&Mf^12)B3qOBWE--8Y)iHy3&|p~Jy}eakfme?vLo4v>`Znc z%gC-|Iaxt=BP+=&vO8H#_8@zby~rA}maHS|NrXg6jKoQTBuR>-Nrq%ej^s&!6iJDc zNrhBNjnqklG)arJNr!YvkMzla49SR$$rRa}>_he?`;q<00b~O?kQ_t~CWnwi$zkMh zas)Y&97T>M$B<*mapZV%0y&YKL{28BkWw<-1G$mhL~bUxkXy-ZM4XmDU8A?f+8u3qA7-ADURYPff6Z+k|~8!DUH%8gEA?LvMGmhDUb50fC{OI zim4RUo9aXLrTS6*sR2|2HIN!a4W@=rL#biZaB2iKk{U&grp8cXsd3bJY63NpnnX>e zrchIP;;qy)O>0IwUAmwEvA-GOQ~hla%u&&l3GQrrq)nvsddzP zY6G>A+C*)pwoqHCZPa#Z2ep&hMeU~cPMV7RI!|4oE>f4M%hVO>Ds_#zPTinxQn#qv)E(+Bb&tAFJ)j;^kEqAg6Y44T zjCxMJpk7k1sMpjR>MhlrPSUw_9^Ha&Nw=a~)A@88x`1v=x1$T`BDy_YOqbB5bO*X4 z-HGl@ccIJZu5>wFL3g7o=_3|ODh>qzL-J9-1_oe&M{pkU813i!)L=UEi z&_n5A^l*9vJ(31p(IdImj{o<+~5=g@QMdGvgG z0lko3L@%b7&`arM^m2Lyy^>x236OdI!Ce-bL@G z_t1Okee{0%0DX`?L?5Qp^bz_feT+U%pP*0Dr|8r48Tu@Jjy_LcpfA#w=*#pK`YL^m zzE0nuZ_>Bu+w>j!E`5)_Pd}g^(vRrJ^b`6i{fvH2zo1{zujtqG8~QEXoJlgdOdivM zY00!=S~K}f8>WD1%d}$(nIfh=Q_PewrA!B=Bh!iL%yePOn66AYQ^9m&Dw!&#J5$Z{ zV0tpWm>Q;*sblIHgh3gM!5M-f8H%A9hG7|w;TeGu8Hte@g;5!e(HVm=8H=$QhjAH? z@tJ@LnTUy*6w{mO!}MkPG5whVOan8J8N>``hA=~!Va#x51T&Hu#f)agFk_i<%y?!3 zGm)9ZOlGDqQ<-VZbY=!KlbOZLX67(+nR(27W&yL1S;Q=6mM}}1Wz2GB1+$V_#jIx5 zFl(80%z9=6vys`vY-YAFTbXUlc4h~&li9`WX7(_9nSIQD<^Xe$Im8@h(##R&D07TC z&YWOQGN+i+%o*k^bB;OBTwpFTmzc}U73L~)jk(U;U~V$EnA^-9<}P!Oxz9Xc9x{)Z z$IKJvDf5hZ&b(k=GOw7|%p2w{)0|DRxojTWf^EsRVq3HMY#X+KZOgV}3)v#JJzLC{ zu%&DVwj~wYpJCmKo&SvMZ zbJ=<9e0Bl5kX^(sW|y!_*=6i~?ks zyOZ6;?q>I}d)a;Le)a%+kUhj6X4C8u_9%OdJ=pJZdyT!$-e7OCx7ge49riAJkG;=6U>~xN*vIS>_9^>}ea^mMU$U>**X$eiE!&(+ za=Ba{*Me)wwc=WH`CJ>WfNRUO;|jSVu02=Gm2jmTxO9Z;#C7JnaAjOquAHmjx^b0U z71y1s=6Y~Fxn5iiSIgCL^&G;X9LC`s!I2!r(Hz6E9LMpTz=@p1$(+KeoW|*#!I_-J z*_^|a{aje+yJhD8^{gf26IEWq1-TTI5&bD$&KPhb7Q!% z+&FGLH-VeTP2whVQ@E+zG;TUKgPY0C;%0MmxVhXsZa%kwTgWZq7IRCurQ9-ZIk$pa z$*tm6b8EP@+&XSOw}IQpZQ?d_Tez*&Gfgi{Z;s^6X_@VqTemFmZAIXp6NAqL&vHUoGJU@Y-$WP)Y^Hcb#{4{<#KZBpi z&*EqEbNIRZJbpgEfM3Wj;urHv_@(?ZemTE_U&*iHSMzK5wfs7MJ->n9$Zz5|^IQ0> z{5F0&zk}b&@8Wm!d-%QlK7K!cfIr9|;t%s_{s@1RKgJ*DPw*%CQ~YWE41bnC$Dijf z@E7?@{AKBbDQlW#;QRpOe7P<&!LRX<& zs1Ujdl|q%!U8oj%2t9>fLXA)>)Cu(hBA@~$-~u6#0wvG_Bd`J|@PZ(Sf+Wa-BB+8U z=z<}bf+g63Be;Sm_(C9rLL|gOO6V>05&8=Kg#N++p+OiZ3=#$lLxiEiFk!ebLKrEG z5=IMSgt5XnVZ1Owm?%sVCJR%9slqg2x-dhSDa;aP3v-0I!aQNVus~QSED{zAON6Du zGGV!}LRcxR5>^XqgtfvtVZE?H*eGlgHVa#Xt->~8yRbvpDeMw<3wwmU!aiZYa6mXH z91;!-Y2k=)R5&Ia7fuK#g;T<5;f!!rI47JJE(jNeOTuO0if~o9CR`V82sedW!foM> za96k|+!r1Q4~0jA z5;u!m#I52sal5!f+$ru7cZ++(z2ZJ`zj#1AC>|0Ii)rzQcvL(l9v4rDC&g3ZY4MDB zRy-%37cYnx#Y^I4@rrm=ye3{3Z-_U=TjFi;j(AtRC*Btyh!4d_;$!iN_*8r*J{Mnz zFU42lYw?ZvR%|XMrCcdbY9Y0hT1l;?e5s98Ahng+Nrh68)Ltr7%rCw5vR4dg<^%5eX5+>miA(0X#(GnxE5-0JJAc>MB z$&w3ZVG-5g<)x+mS29!L+RN77^IiS$%@COwy4NH3*V(rf9B^j2yvC*@o@Pi`T%lv~NI z<$Sq~Tp+iV+sTD;k=$M`mP_PPxr5wM?j(1XyU1m7SGioSkh{s1a+Ta&u9kbqJ>_0< zja)0&$@MZKqcSGrG9i;PCDSq^voa_1vLK7HB+IfQtFk8RvLTzYCEKziyRs+yav+Ct zB*$_}?k)F``^x>~{_+61K^`a%k_XE}1ygWgkC{L0n z%Twg3@-%t6JVTx-&yr`$bL6@5JbAvnKwc;>k{8QMk`HB2g zekMPcU&t@zSMqE5jr>+_t|XOQB~NLgv{YItt(APGjZ&brRoW?qN|DlDDOO69Ql*2^ zQR$>~R=Ox`;^sZhEpl}eS;U8z=jC_R;4N{v#h)G74}qM!<<;0mFT3Z>8rqp%96 z@QR>_iloSjqNs|d=!&73ilx|!qqvHv_)4IJN~FX}O6jfiQTi(Vl>W*9r9l~}3{nOw zLzJP)FlD$hLK&%yQbsFdl(EVAZ<&E-IX|5*KTs2Q^ zp|(_8sjby~wT)V!wpH7yg=&%7UM*Hj)KayB+EMMKc2>KnWolQoT&+;Msg-J#+Fh+y zd#F9tUTTe6tJbOYDx#t)rs680k}9RrDx`_EGz){nY;I0JT9Ks18yGt3%YG>M(VN0h?xDOC)HExY4wbHRz0VlS1+g+)l2GS^@@5`y{2AQZ>TrbTk37~j(S(Ur`}f|s1Mag z>SOhZ`c!?UK389;FV$D-YxRx#R&A~&wOlPvYoWE&T4}Ade65XEptaT7X@y#m)?O>t zO0-g~gVs^&q;=N1Xk}Vgtz4_nx@nbKmDXLW)_Q0?wO(3{R;$%%^%|m~8m8eIp^+M; z(Hf(%8mIA^poyBK$(o|6nx^TRp_!Vc*_xxdny2|%poLnb#ac@1t@Y9RYW=kS+5oLV z8>kJ^25UpKq1rHQxHdu?sg2S`Yh$#r+Bj{zHbI-HP0}W7Q?#ktG;O*zLz}71(q?OO zw7J?mZN9cZTc|D47HdnirP?xWxwb-EsjbphYiqQ%+B$8$wn5vdZPGStTePj(Hf_7M zL))qC(spZmw7uFsZNGLvJE$Gf4r^)ch;~#vrXAN#XeYH(+G*{Kc2+y5o!2gC7qv^; zW$lV~RlBBL*KTMxwOiV4?T&U=yQkgP9%v7>N7`fUiS|@`rajkQXfL%_+H38N_Eu}I zC-q!CPj8{O)LZGT^?bdJUZA(t+v$aRk=|Y})=TtKy@TFS@1%FuyXa+lSG`=X(7WlC zdX?T?uhx6$J@sCCjb5wQ>Ge9IqdKPJI-!#~rPDg2vpT2qx}b}?q|3UZtGcG^x}lr8 zrQ5orySk_QdZ34Tq{n(n@2&UI`|ADl{`vsDK_93O(g*89^r8ANeYieCAE}ShN9$ws zvHCcDygosns87-->r?cp`ZRsIK0}|W&(de>bM(3TJbk{tKwqdY(iiJX^riYTeYw6u zU#YLsSLs$1#`Zj&LzC+)s@6vbcd-T2fK7GG_KtHG-(huut z{fK^4Kc*koPv|H0Q~GKBjDA)>r=Qm^=oj@%`epr!epSDwU)OKwH}zZkZT*gZSHGv< z*B|H)^+)<+{fYimf2KdzU+6FOSNd!Hjs8||ZX}IdBhP4Iv@}{7t&M!6jZt89pC^kxrQlo>>(dcA!Ho6#PMpvWUs4%)2l}44(-KaKt7(I<%MvYNx)EV^#VxR_Q z;09rk24&C&W3UEi@P=TBhGfWwVyK2@=!RjKhGp1>W4MNA_(ouaMr6cB%IIzMG5Q+) zjQ+*|qrn(x3^E2ALyV!uFk`qe!We0cGDaI?jIqWzW4tlJm}pEgCL2?Xsm3&8x-r9; zY0NTa8*_}g#yn%bvA|epEHV}wON^z)GGn>1!dPjnGFBUFjJ3u(W4*D#*l27rHXB=v zt;RNEyRpOAY3wp~8+(ks#y(@ealkle95N0YY2%1-)Hr4wH%=HQjZ?;H%i zjxtA^W6ZJUICH!?!JKGLGAEl;%&F!ybGkXhoN3N7XPa}(x#m1`zPZ3$Xf84rn@h~4 z<}!1+xx!p&t}<7fYs|IgI&;0b!Q5zWGB=xB%&q1&bGy02+-dGIcbj|6z2-i1zj?qs zXdW^Tn`!fidDJ{+9yd>zC(TplY4ePE);wpPH!qkM%}eHG^NM-Zyk=fEZSY=jMtK6!vx>=Q0mDSy#a7Dd zZS}GGTK%m4)&Q%)8fXo&23td{q1G^KxHZBWX^pZ*TVt%T);MdtHNl!_O|m9iQ>>}h zG;6vw!T4*h@7F$cKrPeZQxwXPtX|1wWTWhSf);epwwZYnG zZL&67Tdb|tHfy`J!`f->vUXd0ti9GgYrl2CI%plT4qIvKh;`IDW*xUqSSPJh)@kdE zb=Ep(owqJn7p+UyW$TJ{)w*U~w{BQBty|V@>yCBTx@Xk9U0}Dh+u4P7k=@=dwoB|%yMx`)?qqki zyVzxRSG(Me*wqT34 zWXrZO?rrz6``Z2N{`LU7!5(N2vIpBk?4kBB zd$>Kq9%+xVN84lUvGzE7ygk95Xiu^y+f(eR_B4CCJ;R=9&$4IRbL_eHJbS*qz+PxC zvKQM+?4|ZHd%3;BUTLqgSKDjswe~uDy}iNSXm7GN+gt3d_BMOFy~EyV@3ME>d+fdT zK6}4?z&>anvJcy7`-pwiK4u@cPuM5zQ}${5jD6NVXP>t(*ca_f_GSBuebv5ZU$<}A zH|<;YZTpUW*S=@pw;$LK?ML=w`-%P3er7+nU)V40SN3cBjs4bc?j)UDC(mi&v~*fI zt(|>CAFwJ9C`5&OB$nv%p#CEOHh*OPr<7GH1E7!ddC8a#lNQoVCt6 zXT7t*+30L?HalCKtFjcLJA0hH&OT?qbHF+19C8jjY3GP@)H&uHcTPAb zom0+f=ZtgKIp>^rE;tvROU`BIigVSu=3IAfI5(YJ&TZ$8bJw}&+;<*051mKOW9NzU z)OqGScV0Lzomb9l=Z*8$Y3?T7TsO~c;kI;JxvkxNw~briwsqUNg>I4C-Ys@Z+)}rL z+tKahc6PhCWo}ou+^ulCxs`5}+uf~pd$>K_UT%$B>(;sTF5;pt=Hf2lk}l=aF5|K; z=kl)Limv3!uHve$=IXBDny%&AuH(9{=lX8ohHm7>Zp!WL_Hp~V{oMZU0Jp&%=nirR zyF=We?l5<_JHj35j&eu4W8AUsICs1|!JX(%awoe}+^Oy~ce*>no$1bUXS;LUx$Zo7 zzPrF(=q_>>yGz`q?lO0|yTV=Ru5wqqYuvT&I(NOh!QJR?ayPqM+^z05ce}g8-RbUf zce{Jsz3x7Dzk9$v=pJ$pyJ`1`d(=JV9(PZ;C*4!-Y4?nK);;H*cQ3dX-AnFe_lkSf zz2;tbZ@4$zTkdW5j(gX==iYZ8xDVY&?qm0f`_z5rK6hWZFWpz}Yxj-&)@|-3y<9KP zYvHx@T6wL#e6NjH;I;MId4*n)*WN4kO1x69gV)jP5cM6dtyZ@#y{Tj(wF7JEy)rQR}cxwpbw>8B1g z_DlRyzk}b=@8oy(yZB{(SHIk^@VohyewE+dul9TRJ^fyOjbH26`Sm{Hqdw;2KH-x- z<@9p>T`}+O-{{8^J z!5`=k@(24v{Gt9Zf4D!wAL){xpBOKf|Bt&+=#c zbNspfJb%8wz+dPu@)!F{{H6Xff4RTHU+J&%SNm)Hwf;JPy}!ZV=x_2j`&<02{x*NR zzr)|@@A7y1d;GorK7YS|z(438@(=rI|A>FoKjt6zPxvSOQ~qiHjDOZY=b!g4_!s?4 z{$>A)f7QR{U-xhLH~m}wZU2sc*T3iA_aFEV{YU;||B3(9f95~;U-&QmSN?1NjsMnf z9wdX@ATMYUvs0g|R zl|fa|J*W8g8spPpdlC-35h7CI?f3sll{hdN3oH8O#c12XlhC!MtF8upn3%ED9C}OM<1rvS4|z zB3K!$3RVYeg0;cAV12M5*cfaIHV0dRt--cnd$1$e8SDyn2YZ6O!MEK9kG&mL<4^9LpgHyrj;7o8fI2W7`E(8~YOTp#fN^mu}7F-W*1UG|Q!R_Eqa5uOY z+z%cE4}(X+gIB@p;7#y0XdWiR+%PX}5w;9lg{{NtheN`l;jnOcI3gSwjtWPIW5TiFxNv+pA)FXa3MYqC!l~i3aC$f+ zoEgpvXNPmbx#7HUez+i97%mDIhfBhx;j(afxFTE`t_oL&Yr?hRx^R8CA>0^l3O9#a z!mZ)9aC^8T+!^i)cZYkzz2Uxae|R7~7#<1_hw1Q0cr-i~9uH51C&N?W>F`W=Har)e z4=;ol!%N}i@Je_!ycS*$Z-h6)TjA~SPIx!G7v2vagb%|<;p6a0_%wVLJ`Z1nFT+>i z>+ntZHf$axqueMjY7w=JT1Bm+{HRS-5VeikMTJpO)IKVXN}|%JL)0yRn$GIj(S8rqh3)>R2$Vr^$`-G5f zrO~ozd9)&08Lf&|M{A_4oB(eNOUwh79EdHL?@$D(dp<+bT&E{osTX=7o$tj<>*RuHM$mEk8VUaqg&DK z=uUJux)9yToO2*SI{ch`Ys=aaG(su8w=eJ>y<+OjvoRO*u@H-~6w9#^tFadAu@RfG72B~ByRjGhaS(@b6vuHY z?j84u`^Np^{_%jgAs!eHiU-F-;-T@dcz8S_9vP2{N5^C0vGKTgd^{nZ7*C2P$5Y~| z@w9k)JR_bN&x&WqbK<%2ym)@RAYK?RiWkRA;-&GjczL`cUKy{7SI2AOweh-meY_#w z7;lO<$6Mm9@wRw-yd&Nj?}~TFd*Z$EzIcCpAU+r$iVw%>_(*&-J{BL3PsAtVQ}OBe zOnf#z7oU$W#24dB@#XkRd^NrnUypCZH{)CJ?f6c7H@+9&j~~Pj<45u1_(}XUeilEE zU&JrtSMlrkP5d@)o=T>2Q+cTtsg|i$sn)6dRGU;ms%@%WsxVcQYM&}jm842j9a0@r zol>1sT~cMKuBq}=MXFn>GF6r8o~lmuNcBwhO4X!lQ+28O6p}(ySPD-ODKbT+=oFJ; zQ(THq2`MoprR0>7Qd3$=PZ=pQWu@$tlX6pD%1;HUFcqcZR4Uaw)hE?A)i2dQH6YcH z8kicC8k`!E8k!oG8lD=F8kriE8l4)G8k-uI8lRewnwXlDnw*-FnwpxHnx2}GnwgrF znw^@Hnwy%Jnx9&bT9{gtTAW&vTAEsxTAo^wTA5mvTAf;xTATX&s}TOXI+^#ck)7rL z+V`(LeB+g?|JwieJ^jHy0^Kfl*}U@F3b`V`vUjCgb*Sn{)rqPzRb}1hf`1CG?6I%M z#U6Ki_V4weSAI=x&5D|BHFE8l+H6JPCiLKO+HILPrgX1$;xEgq?sg>R8miFOm0eU zPHstVO>RqWPwq(WOdd=gN*+$8lSh(AlgETsB$uKU7OAV}o4l9%{U$$$;a~iyNj}Nfuw*rlP-HdUBq?wRS;KKn+Ew?g zf4>ICur$Rs#+y`=y_!&beGSX~q)BreZ&LF9TwIe9@LpT2Skvn#O&V7Ufj5tXkRHU3 zfA)*t{jRG0&tUk+Kl|P9e)qT7|Cgoo4#-M;DDn2~`^AT#zx)@2vOfetV3#0JK<|A8 zT;I7HT$y|if11D^oEIQu^U@Z$jXXTajK zz~_L^17m>z_$UwoV3qb)fkD6k;2XdGVpaE2EgfV_Xhd^ zeF3oBHrOZoBR~T%5cm=>7#IQ!1%?6HzzAR@FbWtAfcxA2A}|j48qfrIo9S*>XCS)= z&=cqd)Bv?W9Z(NU0(n0H{s_DW{1DKAcL4;%Q2+yQfB;B<0%(8%nu5IV0zUx05Bvd` z1N<2HDZqjp4&VU+5CI900R?z}8-E1yasco#!}gy6aDUq>h-rWh7=Q^_fDJf+3v>s0 zzX!ep{1x~f@F$=d(75lQ>;d!ydI2>+El>y40|?-Od3+!MLLdTS;QjF^h+_Z_5C92K z01Yqz3#349Z=es*7w8A{2magyY%_>+01pU&2uOeoD1ZtK0J#moKmhy_w+Df8Fi;8V zlYyzg5YQe93C}1=&1{e!;1G(csIUdkJy*ZEsa)CUc1<(>`1+)h8f%o_G zzhZz`8=wGa3$z2kg^zX-050`>|6_}6aC!cJIrjbeDnM*b6UZ(FWe1=m&A}J_IHHkbn{|faO_GLdb>^zjy~qJOJi@7)lTyff7IbD3rJXO#c{^sQEaQ z_|7Mw#06mdC!s{Q|9}!-{}hxs0Sx~%l<4>wDDnBvLWzUGfX_jRcAtk5pZEfl*a<{m zgc2>j1SPV*3?()K)>oj!pS}tuUI8n=1|_7gLy2E~14=vs7Jd^-P~Ubp?ln>kS86fp8#DAD&-55=Vf+ ze}xjo&7s7nlTczW&?gs4^v?eU*_jOO{7(l#e|0_tB!Da+8+Zr!Fz^xJqrk_2 zj{~0oJ_-B>@G0Qaz-NHZ0-pmu4}1amBJd^P%fMHFuL55Kz7Bi?_$Kfz;M+hGpefJ{ z_zv)0AP0CC_#W^c@O|J1zz=~R0Y3(Q0{j$!fu8|C2Yvzk68IJHYv4D)Z-L(dzX$#R z{1NyQ@MqvJz+ZvpKoZCW@_-gVOQ03d8psFQ00lr>pdC;M6anplVxR;l1v&s7flfeY zpbJn2bOp+R3ZNTM2~+{yfoh-!&=cqd)Bv?W9Z(M-0199L4iEqdPyh`u01I#c4+ww= zNPr9|fC^}U4j6z5Sbz;UfD3ql4+KC6L_iFrfZjkKpfAu5=no748i0YoAYd>s1Q-eo z1BL@5fRVr`U^FlW7z>O8#sd?8iNGXaGB5?03QPm012ce`z${=kFb9|m%md~F3xI{d zB49DF1Xv0z1C|3TfR(^1U^TD?SPT45Kkwh)f9T)0!@rM%fBy~q_c8GAW8mM%z`u`y z|B=T4cx}Y_w}0OT|I?0v_aFaOffv8P>yHowFU(q$wK!`@*3ztHS?C)mhWWSsJz3lh0zn}es>>p5~cBtX1* zCYj02H1Icf8M))Y?o)6W}0Qbllg8YC-ZLRdztq#-~Wg4-7-JO{4n#Q%#Sla$^0|}XMUFX z`9H+7LF*TpUuJ%l`E}+uncrr9m-+oa#6OeyZ02*B&u6}n`C{fvnJ;I)lKJZ2#S`!+ z;s1a?1iykG!V}@i@KpGGrb)A@%|7>?M6-`Hdz+aK&x9|*SKw>#X811r8h!#lg{zyD zG(($V&A!&`PtCsB?1#;M)a;|pKG7^}7BzF5dCh*%?EB5W*X+G!hnl9FLd~+8{je$A zgnE~F7k#%$lcr6ULHBarW}uuz&L?v|18S4tDeyFS20RO%4bO$=!wccX@Y~E%csaZh zUJb8>*TWm(E$}vY2fPd34ex>X!uvq{ZDv1w2tER8-++(9r{J^jIruz$0lo-dhOdI& z>+lWuCVUJ2O3oK@zLE2zobTrRGUtyuAIizf`E<^0_zrvzeguz($G~&odGG>w5xfLm z2Cslu!E4}k@CJAjycOOK?}QJ)hvB2}3HUVp7(NK6;bZVg_zZj>egMCL-!^W=A2XlN z`FhTmbH0=Fi<}?k{2`|xr%BFFbKcAOP0n9(zL^8(MddGPoS>23Nt=a4)zP zu7^<=gK?OE$;PdqU=|h{Ycj0CCTzhr?7%MU!y)L6;S}5(?$a3m=l$*r_k#z(gBxRQ z;X=4QTmpB1JHcJxu5blh33rEkz%_6kjKDO^!6K}{I>=>U9+qGgHsA($AUqZx*EoK6 z&i3#+S}1 zY+uw9GwZ6*z8&7gzY+RdAM5a`ZjYqj^nEo<8oC<1AKJlz3u-Qv7N9K(2Pl8-!Bqyu zZ#sRc^asP{m9HwSD7xP84%rl&X?4 zkt&xf&lLTjY)^R={>wq_O0Gz?*vE^0T>IgYGbQf{US*SpFXNx-(I@r&lCKrjmd~vC zj`07Gch8NDc5S@($F^S(Wfp1ohi z^VfP2>-c>?p2{)YmmsaQy0W`$mTIQ3iKRrfOg<^)kjhGllAmN%vHK=;kzmZjj;6Hv z?q!q-yyo%OxC7%a8`g^#GcQrpl985f&bthoWHCP|kj5<&3ga84&E?hzK9~#BzcWu{ z4U1{X5($17qM0Ga7V(n82HL1NEvGEC8~=o@cZOcd_Z8FY6;M@6ZF>6MI72$a=i>!b zkmS5=u3DFJ$-YODU-m~3&AXgsOy3hXBI!_Ev3Ft-Q*w!VUoucVGiz%=MXwc4(Js-9 zb2c%n=!%&3$XtzL;1Zm33&_R%T%o;a*5nG$`Iw~#GglJQuC@;NmBU-#GNST8Fj!Y zj7F~&{Bmcd{Nl2lZCUr2OR^2>XB<=IGG~C+Q##ArlG4PlrT-Navhy_W{MEKUsn7lM zjbeWsou&x{7P4tZZ7Gr=Nj#Y~iLu^!H12zjL%_*K;$T*i%3A47m=bfu)@s(h)G;y&1~T4KE#*||)}qI;QYV$I;#;|=CE4jORG&1u_?NbajEiwm z;!;5^cUAWLxF~8J4Nh4ed$&|szNg$#HYa|irLp>%NRzDN)pefr4%d8S9TZ9^PGL{R zkb*^wJF&k_$(BkvVn18Z-+7PHHcoA1xaQ=pqM8zVY93Hzn!d^PO-9``N^995d1Ho> zu_$GXu}Q)>Lw)fTmskiHn)2CHp*BbIQ*$Z(Bkv^TL;QOtUbQzoT9u}{Ro0Y~$`X_& zSqF1VQs0%wCiU?4bR0@*Md_YE*PGl1!&=I*yrs-*%u)R7#x9mL^<`biTck~5*0FTf zZn1w?FQfM{p7Wl_UQB%bIMv#`M*d{_wD{|; z#tO7-t)NQNfYn_y&fCDaTW0i{D4#f`loWF-LrdK|CPTV{nn^z^2^t4Vhj7<$yR*KE zt)jZr`r4M7UCAj77E>4dkvWWRSIv_91k<%U9euLfalcy{=QG)eZJ=bM-zRCWX39tU z->CM*B8*ANC})L#M&SxqbHfqGOjd8%W5HEs2SXj7Gr=3T+<(-uq`;T`IDNNcjk9jX z1KoeIZH1R9_nDu35#t?xq4*Saf6CM>pEwjfOnW(DqqafrCnh1f#LRRq5T2EOHf~EA z5=eIUjj_be%&np<&HYH>@=D{Gr9E_=HAR9NMmOPqw)N6_`A~K$wXbm_ovuBcsYw|` z89)PfWVUT!q4=MmFXdj&=CW~~!o*{$LxRWt*+NHzHdw(Gc^{L6ZC4! z5cPBJm-uq}Rocz0=+HYu2j^lfS8&ggL%+ZrtuVNIL)a`xIbi#lCCZ#saEQ?? z@R703)YV#+)S6$9cU{Alj}cE#j?JuVN;kX^JauhTH4wfP(L{cE8`B!WWxiEnjRgjg z?VFRyM7&#yvST}%t}3@vTol-eG3Lf?vH1l@_}5FPXN;!qFkH;Gdmk(2YR?AtYZq}> z*^De}>h8jm&PZn4?2l@_ZY=MHV!Gv}m+d@R>J6OL)3kglk%m#Gu!f}$(+C(VZ4;<< z=)+k$=NZQ|;S~`p`?sT&r3ppgKApVVayUuu4QjThXIPILBi^?1GlJ}bqwKZ=57;e^id+brI)?x_*cZlksIC*_>LTY55%TUg(5HukS? zlWl>RFmG1mOHO9?GH+&VHU#)Sc?ZX>ywlW+EQ9y6y1O++yh$?5GBaM0QJ~~mDYEG3 zqVgNb)BP_}rtzpb1tcY@|typ%WlzH0MDc4o&&8r1c-TLb1 z45ucf&>PwQPojpr%a%2jiqefXg}@?S!ivirZd`3+Fw>0(ZAnQvtOX!}vpe-8XIJ({ zUcO$k>W1VUGyvHx#E4a zr-EBraoSJab_vQ(vV0c|;PDFDODe^QN!|1fji@v!w;e5t@vb11IaV?}=5y5*=D7GR z6gOo=q0NG*>LzY7{RpR68QEo(Y4NKSPSq_zSH(`t^Yo2@G{YqG!cv)utLn#}@7+>5 z$g?bapFEkFFMcl2Q%~}ENtcXKEGYE>qY2|iX8+hI?L0~=T}HvpgpdBDd~WG?yFKek z!8J$S+&1iul<^k1>!&zTT1;7{)+#zPIHuq9x#_*lMc(VQ(dy|`K4nHsGG!{`x`h|> zSKVAQO*PJUTHM}Z<}Q=Q7C)%mB&|!it~ilcrP^w1Sg;|7CjI8UDru=?30gaE%MbDS z$y@2~vqrP^44?YD$xpdXxk?v?=hHog51Ki=zB#hevBF1M()BU?R-sqDEu6*}7wgY4 z^Q*iiWi>gCoR8&C)NF-Wx0Ney^?Z4mVCRii*aVkTLGzRQl42&G8&8IH9Bb`GheOn&JgdC4@+5^u-!vs z;mokWzo?5Td~vCDS4+-drMkn?UsU094{-s+^!OmqRDY^ z{K(=RDb4KeoG#|^rVR?0yDN>Iud_V2?^Tb_cj^1Y>eOGH<0vmvXX#4PjY(6Di)D?A z{{}Ad$7OcR%yX_X%@VFwcd3{k&laPWY0<%U(q@baX?6Vu zX9G4TYYbyIYl3Bs_Y<|ijk=~7OTBce%y?L|J!F!IvV28r%B4BYgev`}qI(Kobw8t? z`7$`yIU}~Y(XH5QdSRSab1sk>KUOoA?NsR!y}m;zv}u310OU zc2mb2x7YKQBGgAERy*>u>IxxwBy_=*F2Ag5ZSQLh={m{X(FdK6XwS3e#3eEGt|?ZL zR?n--uM(75QY?;eh9Zr>*0PHs*DV&lsG6$Tt?w1zk{X}8IQvQ-p<2g(k=0KAETMVE z2HR1UsPu8nQem2@(0RpvU-g4)PimByBi@?vg}Q|QCVxTbS6*iRZ{4N1^SWDEJ*^L` zZ|6@pXtRWgyA@B%3lvoeth3sA8E9SKD zANfkDt1=KTm-*d7MPpw|*$gdAXN7Fieu6WBLCL9>9zJjC9nBhPTgrRNW7|$!yR0-{ zaoIxp6Yh<`X;W0ehRmzQMR`kTi_Fb+D{@{k2T2Ad@=^ZK=kn^Iq7 z&?|&in~9>?Mj6dZ)!(w?aeX}B9OI3rQaYRarJXg82~N!@l%#sMDO3bXdPL&LqPa>M_dM^HO>D_CgtdcmXB+0HzOvk>Dh!iM?~Lb6Z!Eo2 zUpiV*t$GW6g65&*yljW+Q`IH0-2Gg8Fz&PIGB*&n(yJ7F;GNO7VU6&YSi}^KY)fdf zb0_9seh;w zMLPvYy$OmZ(#2U%>5Ymnidp&ueuLO~)Qap!nx}G$yqE8d{A@xwZNCOH{a3wDY*Sn< z()iCZI!P~UZ^-D}p^nXxjrnrph2#^gE4rDnTUDnO3#r|+i(|i+)@O`LEm3zie&)93 z+GWjrvvTTK^D`lvl~s~0NNbyuRO)9gW_^n5m-v;rx3n%Z)=*g-%Nr^>ReDR_i!zCJ z!mCJ~W=W?9lA*lP(q6e#%H_i0iF{t1=LIvmc!}#>aU*eK_9$niCa!RuV4Znvp)I~v zv5s<%K17j}ClMSIT?o8p7G<$4@~r2jO$Ga?E~-7`roZ>@h#xI?7Cy1*X^^l3rGU!H zxmma;x&GE?&fl;i&oF_T7EG!!w||jOY7>iBw2G_D5_OSR_212w#ua_7QJe#mbaK;h?0qzUR_EmIl^}!h4||<`JGo>e=2? zg7d{ovO1f(>fA}wytz5I`9eW=;{%r|=0#CMohNQ2Z9U~=-dfouo639B^MPsMZ?!*= zYqWQhHQ7{P(cCnb`>bh)O_Ne7^oIGDoJ)CsG#?UwOU|XY3L0q@-f!ZA*(;osxSvJg z{2iL*oJJg*?Gfiq>KWTv$5$^cZhqM;hu9dA{z|DbDhhuJ7qU8uR>kefujTC(G|BJH zI%+e^Hf6$zYh54H`$+$!Uo4!Icb+2BcQ(8({H&i!jn_!iKFRweVp%^*Dx?$SThuMg zfx@XNS0qhk*OO!^G=rb^Ca4qjkZRO>1KHx4$}zl)%o;8#P7GZv@hQ~BuVXQrX?RKwB2;o&yUsQ4Jy$;5_%BeDC%2VLp3)`?vytyy|+O59%h zSWcgs_3CDlE&A_ts^&|1Qe3PhPrp?-M|<1$IHWK1Xj>FMPRY<~i>7883fo9}6tvfN zOV|N=oPQEi)0zt7!oLci=WNSPuu%A` zIl=rzS(DT-vn2Bh&*y2Mz+qU;HPr=`HkGG(LF%A{#^D0~R^v(UahY6mt$HJv&9$nD z%K1PK6fI}8V%5zOtF&rZsMcRd&noW8Y{VXv)voMa#)+KfTp`_(D`ZM78&v8NH8&FT zv!s*wr6IMvSB4=KQn#sy&2N(Z%QcycCB_u7bGd=TB};XV{J-KJWj9h5`X5&Z%I}E| z$+sxesk3A|v>hZZOyAunv;Q!t>I~Oc`buAQfk8R7>WhY&Bhe;?meu^sTkQEtbyxdb zkG+K8O5C3uW<@{kA@v=>XFp+K{#@yB zPqd(_&?UU;eJB?K-^?hc6(6eJCA?;;V>oK5!}Xd{jBVY1Q;t)XF}XzVH000BS)CyE zI&<%*{O0YE7W+zbb9sFdo)pS-+cJFgVX6$xRZ(5pC=ZLTQIu!>HQY1p;b~>3V+zvT zp=Rol$}V(;CS+<;b&<-{^)UQpu%-6&y!^SGcu7U_k)%m!;Cj8}5qn~qGyRqKsk(=L zhT>v^5)_Um#tS`zlLm@=CLLpSlcnln;)3k1@mIXC;3q#vx7^hX+@QTj+hzJLzGF6IUDB+`y{bDy zpOG?DyC*PRB6AGavSlvSE=TuVzmE~fC>FDGPU^U7=r*pL4NGg38aOgo~w(*3FKK%bugTpV7axkh#Nd zN{O|VXR4ALn|Em&lxH}5B@vEhpc3()PN%uDzAN^Vvk!zQN0o|t(kYp~>=n5o_B zsd9DGHRA15F3WWoKWf({JT|*s^B6nr`OfYsmyMkCt$ZkPh;_ATK08UeRB}N(RS{J| z4dMBnW1c2$&@Gp>a<}np3*Bdk-9OwOzBm1+TF1SVnwj1^rYg6s|E6s=Z;7Hu$qo5l zX<6*sVkNgHZ%NU_6h`_q|70_rIY4-v-;vkTxmUNeU{iIhuh_JWsg-W0o=$HV6Vm2- z?gq}gItj(R4YGjuIW^PFs9GRtA}h~HG<_4rmha>u{`%bivb_8`S?1XZ@DK?|A=KyxHP%2 zTXOgKy(T1Wd|F<#(AmP@m6_n&8@sv4msxAr9@D1GQQ1O1gPKDaSHhOSdr2P^VM&Xf|iB$m?&}t00oss+uOwC`zFn zHg;k+$o`#jJFZ`0Z}~RbM01ytuKXd=98LekLwcdE6{Cx(uJuiFdv0s>s{&@< zG_G)T@#u;=i)_GPJ72OrYa*{f;T-3kJX?ao(j?qk6ZC9VjFuwGa_IptS0O80=6awf zrR@XUszUy&c(1rB{(a~OFC%Nebe7_apq<~!zHMGacgmQcekh7NT)ntzV>u+AXZ$6m z6k#?vI>PEtJI;7*Y+IyO&x~81^2E}zYF$P>Ys2!ki4*)keLrdXy!z4Yi}q8OD`a7- zse-XeW#Dl6&C4eOXXi(fxOi70Nq?31l3yZ@iKXg|$rRTJW0p-W?Iz!t*Ii`hsDiV4NE_|C%a`rfgdZ5@yb)!y8Cezy3ti+#zk$UJTCsEW^*Vg z+ob52)X1~KBa7k53m60SC7gn|3EFC9h{8xA_@^AlBoE@h711r7{U-w}75O=11XJ?s zv&^}T@`o|)F|m0sSecwdmX4a+f=uNfWzX1Cw##%!?*IGEX(4Gt=|~wu8AcgPnM9dI znM>hNcoaFsOevyRD0WIqNi}69Wi@3dWe;UP`+^0OFyrDd&{Gv3a z_Mq0G)~7~O$52JoDO4_X5mij(Pz6*s)j}<$I;cVFHmaYRP2ED(QIn_@)I@4A)l0oY zy+(aNeN4SceMG%My-LNXIJFyXHf;#418o>>Agv*-FRdSKC~XAoFZB=g9kng37p)O( z9&HhgO{38k)1qk{T5H-uS`uw8EsmB+Gtnw&L0S=QFRi|2H|-+r5^WFd6zwzZ84agB zpuM4?w70Y$v@f)#^t$wV^ltQy^bYh+^uF||^vU$;^l9{2^x5>K^yPF0okf?^m2@3F zhMqt-(arP+92>oi?x4Hq9(pC+OApi6($~{h(>KvK)3?y~(09>y(|6MM(T~%Q(a+K^ z(jU_y`V0DN`WyOt`WN~idILstMh8Ym#$d)U#wf;k#uUbU#xe$#A!e``$&46ADkF`d zW8^W6jB-XP!_9Cpsu=4TTN&FJM;ZGVCmAOgR~e5P&lo6!U_gvdj4zDuj2~cr+KAbh z*@PLTZ^>-KY|ZS*?8Y3x?9Uv{9LpTfjAG7aE?_QXE@5`2tYF@wH#LiyI%Wbhg_*(3 zW}2BErkA;rxt_U>xt+O_xtqD4d79ZS=PC0!^Ow3+?c3zH%n0)hvzA$xHG?&qHG(yg zHJvqzHHkHp)ssbGIaqp@oh4xFWo=>|XW^{BEP~aV-GTj^^_KO9g|McuXR{UT=O1y_F49G_8ImQHpafg{=x3R z`NrUI{NViMG~hPnHsQA9o@aOAcH;Kn4&p{}DcosXK6f^k z%2jboxiW4Zw~XuIuH>%e?%{6bZswlmp5tENp5Wf$p6A};-saxpwytf)L%Gd)U3qW*H{&(QVN!(PPmo(HBv3aW`>Saa(bB@g(tl@jUTt@ggxr%oVf5a@pbW2@gwnLF(QV=5%CN0Yw>&W2k|HIXK{T=Q%Q44TS+HLU&&C(NXcl) z1WA-+j%2Z9xr8F2OE?m)gf9_FL=u@qBT1EHND3roNuIkMV+Ev;{I#k+9I#$|U+EF@OI!M}DI#n7iog zMba2)hEyV5DqSdDAyr7{NtMz#X{?klEt2L-3#375p)@45NWD^@)Ggg0wMt>>LFqFo zB)u&?COs$JC%r3uAnhajDD5a~B>O7;Caoj;EUlH+m-UtXlzx!5l(mwzl`WF3kWH2i zkqws3lr5EwkxiG4kWG-OWFpxN*<9ItS*ol=mLcQG__AnOtSn8IC`*<}WK5Y}=9dLz zUfEVzh0G#z$+pP0%dW^S$u7z+$WF`7$qvgd%d+yW$_N=M`z-q=`zre_tCjtg{gVBW z)sZ)mHtP?RZZ6tN1OVxQu;;)UXb;+*1(0##g8+){j1oKZ|r zHd3}%4pL51_E2_K4pFvNc2ZK58fBtVs!UfNQihe+l$FXON{@1#a+9)Dc~tpGc}sa# zd0u%(`9OIJ6c|V)q=c2I@}2Ut@~iTrvQ}9~^;_9R)kD=&)lfA+)n7GSH9|E(HBmKL zHAxkvTBcvDqNq5k6)K*JtrDqHRGBKXsz7D2hEz4GEvf^m)1c>YQgudkMRiN{Pz9?X z)dy7_bw_nQb&96G`lqU?dX{>kdX&1CdV;!#dVqSqdWl-4=BmYNrJApnt3~Q|wW;bP zb%DB6U8oMI{pywKuzI)pjQXVdKlMfRarII4LG?ZLBhZU@p?(k4_;2c3bt}!#ADuM4 zH2rc1X$EVee4{k8G?O%wHBmrR7i;($wMGd%>>{9gZ_>nQteRBKdd(`$5zPV3JI!9r zYt0KFG?N-k!_YnjKJQ!23C%UlAx&NFIZZF^LhTCeZ0&sQI4wo100L_{Fh}#WHQHRQ zL%U5|p)JrJ)gA&W=|1gYZEIa!-6d@k-2?3)9jtAkyQ;mTCAD|8?R4+74Roj$(q7k| z)ArL1)AiN$*A3CNugwC6=OmzbvViiL2DHx^I=*gWXq-AZ6~Rsu6~R7^xyFQ$9UUm#(A1Y#zl>lO1x*CFPWu31dKn07J! zW7@}z0gC1Pm=-{ooCMU$ML@aa1L1NpP%@+biIz?vR2KfTCv$;IxfQ6BM}Q=G5LlBZ zfeeWNH}X*o7SpM?bMecVhOy0JYh&8Qc8cvC8x=b_c1rA%^tb*+zbHGTv4MfD}KstN{e8YFKP2$?e zb%^U8Hz2Nm+$`V|vVl`52fkoAumuz2g1{OK0d-IdJVJMz6PSM=fC6|HIDwCV=C=!Y zfQNzX_YMeuFXMX0H;A7UKRkX${P_5G@hyO|R{|uwL}2Yj14WMye7s5^;S~WF??-&I zgi#6mfIxR1$ae>UTXzl!bkBfd7XjkjEnwT#0=MoXQ0Fk<*u4ZY-AEwBbp<+{BwEwD+7?vOu$1E02eI{h-alhK;r>% z%np1rHSo#S0H16Xu*n_+z3dcl#qI(@>;X{6z5qq6VN&Cyrb*3{Y7^Tg)lF)h)IF(N zQtzZsi9?dQB#lX$nKTYKVG3Y)1%SD=1?XD`fxh(|I9d;rnkKhSZjk%|cvn4=yCw_& zNmpv%RxMBF0I8}JI8%kdm+Dx%6=+b0fD3gCNKO}l`E(x`P+x%Y^!lIJ^aF@Zf0J9L zv`HC~GBRaE%9xaKDbrG>r_4&34g98Mz-LMWu2Mdbl+3_Q@&X%a!#@G(I53XR0p;ir zP>pV-ASwTIi+%u)sB>zw)E=pwQhTNjNS%;6G<9@pr`mz3Gl4!t0pieu>KLF3CH=F5 z^gs@}0OX!Mz~(su?4FCj8IAAra6J+*P#m(+%7gVKhj4NM!FHY#mg+Ek$D z%mP{tKWz?>b96w(Q2-@JnI;F?O(Jk`YSOBKVzU9rGuMGM0|8Hl1dhyGpvQa!e#|$Z z#?;j}(AU>D)VI{P(6`dJ*Z0y7(vQ$j2X@Q~V8$!~evCjL4I~&1@Lv*v_!1Aamvo@J z6a&}A0$i60Ah(3|>-1}YxUvVBEBk=Kau7%?yMVQF2`DQMfur&as3?Ddj#4-MJ#bR~ zC#N(|Z<^jaeQ|WqyXzA2e>9C zAe)o|&E$V(Nfq!)Lcl252`rNTPa!##-nsTFP(^M5Nd!*Efg3Wq_-A^PjK&!aG6rM} z%@~+5D5HDEqeK{oxL< zA&vqO;u3HiNZ>vE27W{1thQNQvqoeM&l;1}rFJ&Z7rNF;vZ8^_(5*HPxCs?m-D|@@ zN7xL+gTp{FxC=yr*FYy|VrXgTV(4n739(^^a%)bC#`EQ^u-yx??PWzn3IiIpy=6ucWpEEdTSWfSp z$vMMwX5`EU&G>ns5l;h+cu9^56yWus>+S?)_SK-rz6$i%H-ZlPZqQ@j4jSw|Ymb5A z`YF&>M?h2k2`Ht11da5sIgO0ufXaCS zXrn7Ym%I$L(6<}cfV%hrP!B%_%HykzJB%wqXS@cq$M1q(_*2jg$3QFmr?GkNM^FoY zVr-b(EVplNyWHNnO>?J$^0zv7Z0?NQiMi8qr+^yx)Z^pmgw+2+ZV?fzE z2b8;wx!WCipx9jo`rNkv+vfIyB6n2YRM4?r1nSik(5+^JYBld)qgo5f)H=|fHiO1= z!N1D14HTuTK|?y2w<>Q9=tOS^mFPpD5PdK&+1ji2e=X=sp!f`frt=F>Z~l?jz|`E- z&eYY^!_?O_#5Bt^&9v0C5Y(A@pu;Q&<>gdRT22C$Ue3c=?5 zm7xB+22_Ce<*&`(1RB0OL8tdPDEOWL?cT$n*n1UJdLR5N^Zu{MTMPQSfAZ^^>zNyx zTbkRL+nGC=hnk0*N13C{O1Eto_1?>yZgUaeR&_b^bQNfY{sraF&P82{Milif>R8mFs1fLSMii4LjiBFI0Xm!8L6frzbUSlFiL-ZYGxJW+$2<(Wn1?_a^Dby$;-G~2 zqo`SN`{L%se~S7QcPk!KJgc}*?TTVHg$){&8qlEhfJWpd(3RW_%98s*7xE0KJ?;dp z$7{uXYqx;9<1^50d<}YzkBi%tG%9IQQm3ST$`!Ifh9vr zx`FayCTKKLKv$6qnu})8T$F;|A|I3*6`-oP8ng^+K>hGCs2rXE4a0lhEue6?2b2tt zfF|KbP%Ug#+PJiJX{XYbrGNf)3EP%-EbUj?w{&pn*wRU*Q%a|SGU0sCA!LB&pcqsJ zV?ir07jy)TpeSet^*<*Xx2l{m<${v+HEhEc5mwhj*Z|P)dV`*V&XX$R~X&Gpl zWSL``Y!O%(mW7tZmK;mGCC(zZWLb(VW=o-Eqh*!FWm#ugZwXq~ST0pH{hy}JhxAd$1YWZe)W_fIBVQp;fX6L5>R+H6cwOa#Lx7B0yT7%Z9wmG(0w#ByP zHj0gAW837mI9sO8V9T+YZDqD1o5facv)lZ(3R_S4Hrr;~cH1%AZrdK)N!xzg1=}^- zRU2x1WP5M>Z2N7iwf(d;E^k)ey1Zq1yYe>W?aMoqcPiJE$CoFUri5BRr&LBwES0j6Z_xtruLrpUiLQj-uAiniS{w}3HGJ-MfN53 z<#w8Vv7K*M+NE~3U13kRr`SvEIre;ek-gAvwOi~SyUSi-57<}PH`{mFkK51L&)P58 zFWax%AKOv;FZ)mXEBhaNGe-+YLq|tPJ4bs*4@Xx=Z^t0Vc*iuy6vqO`T*pku630Tv zatFo1bqF1Dhr*$BR5@xKYaAOL8ywplI~)fb18N^Ra0lXe=Xl}x>}crx;rQ-o>+I-k zFnj~jV)+i|F6TZc;>4VfozI;0T!U&my4tzAy2iN%yT-Vdx;QSLOW{(vbgooaip%OM zbD3SMU0Yl`T$^3{Tzg%IT_;>8U6)-qT#sCjUH4tjT=!hhU9jto>x=8H3v+#S;jTvR zUhcoHHtr7YX6_O0j_#puu6u!ds(XoB>7MPL?q2MsxM^;_dzPE-p5k8S*0`hHRqhS$ z40op6>-M-q?n?Iy_jNbvzVCkMzTqBRd)Ix)eZUR5Z@Z^@CVECyJ!?JNJQbb`o_n5ip8KAN2lqVi zoc28RJoDV}V4iLj-#r~F+E?_gs9({zVp7HMim??_E9O)%Di&1CuUK3msEDqRR>&*F z6)_e1ilmB+io6PAMNUO-MSg|3vZT^d>8`A(^j7*S1C=W)H&$+_+*WzC@<`>O%Hx%n zD!(S4uDn`#rSfj&oyvQaPb%R`yb`JG>mA}9!o^^dzX2IUXfSgReLkMDc(45 zx!3A_^26_~^!mI*Ys20R-p$@!-re4v-W}e(-u>Q#-b3DN-pk&*-Y4FN-XGouzDB+# zzOKHOzV^OWzP7&BzD~XYzG1#GzVW^(zG=Q0zL~y-zWKg+zQw+|z9qgDKB|xIWBY_Y zsZZ%s`?S7zA21zBRr*zP-NFzH`0{zRSKRzBj&)zUPK7 zzSjP3{sI2J{>lCseyV?&pX*ooWBrN#B!99$&7bPu?BC(v<=^i=<3H^`=YQgV4Ebd>i~6{1E&W{26Q%>JsV}>K*DA>K_^y8XOuD8X6iF8WkEH8XFoHniiTL znipCTqJ-!nUPvEG3#EiSAxEenkOMCelJNa#@LTcbSDIdzJxx6K86}pb+77J)uF0RRnw~WRV}I-RW+$xKVgmcu;smxPQ2JxMR3ocusg$cz$?h zcwu;PSQHkA`C)pP7FLE+!b#zhaBMg+YzPO#Yr~tuTf)1;XTm4LN5Tighr{Q>*Tbj6 zBWoXqZ->8!iSV27yYTODx9aZIU8{Rl>#MV>jn(z`bqV(>ZjFEHC`R5epmgu`fK&K>L1lVtAADhu5Mh@q~<_+ z$C|!1BWh;WEUlr`P-_@9tQtj)q()jJt5MfzYT{~QYBFk4YSL>eYpQBi){GQB)Tx~5 zX;0|v7HS8zhdMwV zp-xa|s0-8;>IQX(dO$s)UQlnS57Zax2la;rKm(yc&|qi?G!z;J4TnZRBcV~yXlM*H z78(bQhbBN1p-IqWC<>YaO@*dG)1evAOlTG~8=3>nh2}x?p#{)FXc4p+S^_PFmO;y* z6%YlYLNtgDF(4+yg4hrT;zB%#4@E-)NC=4_F(iSckPMPT3P=g5AT^|cw2%&pfnuRJ zC>~0H5}_n08A^dtp)^Pjr9&A|CX@vkplm1yGD5jf9%O>@Av06}6+%T&F;oJTLS>Kz zvO+ef9I`_W$O*Y1H{^jTpi0OK`5-?OfPzp6s)E8$HB!SE9fS@+hoK|TQRoO;iJ-9yH0B#63f*Zq4;HGdhxH;ScZV9)7Tf=SOws1SRJ=_8A2zP=z!(HI6 za5uO++ym|j_kw%Fec--uKe#_U03HYrf(OGx;Gys^csM))9tn?vN5f;_vG6!}JUjuO z2v341!%^@Qcq%*%o(|7|XTr1K+3*~AE<6vO4=;ch!i(U=@Dg|_ybN9ruYf5q6{f*- zm;p0k7R-h@Fc;>*d^j2wz~Fco7Q+%)3d>+QtbmoU3Rc4!SPSdm7&sON$I);CoCqhu z$#4ps3a7z(I33P_!O;Y4fV1Ho*a+vsd9Vr2hs|&STnHDz#c&B+3YWna*b3X=a@Y<# zU?=Q?-LMC)fGc4y?1TMq01m<-xC#!#)o=~G5?%$bhS$Jr;dStOcmuo<-UM%kx4>KB zZSZz@2fP#B1@DIUzN8w}eari&@1bh-c1)qk`z-Qre@Ok(G zd=b6`Uxu&1SK({$b@&E+6TSuChVQ_4;d}6X_yPP7egr>;pTJMyXYg|vf?*heQ5b`9 zn1D$*0>6M?!mr@h@EiCo{0@E(e}F&2pWx5%7x*ju4gL=QfNSBO@Gtl`{0IIE*Fowc z^^p2V1Ee9+2x*KoL7F1Xkmg7Wq$Sb{X^pf&+9K_c_DBb$Bhm@!jC4V|BHfVgNDrhZ z(hKR0^g;R}{gD310AwIC2pNnFL53p3km1M(WF#^Q8I6oV#v8 zAY6op@R4XlfCv#0B1R;L6pyP|BO8#7$R=bnvIW_SY(usqJCL2o zE@U^d2ic44L-r#Fkb}q})o5(HXHgX5Ki`+x*BM*>=$Rp%2@&tK`JVTx%5CS6zf+84#BLqSs5#$B( z5_yHZM&2NAk$1>@Xlt|$+7@kxwnsal9nnr`XS562743$0M|+?>(Ozh8v=7=B z?T7Y92cQGdLFiy~2s#uUh7LzZpd-;y=xB5dIu;#=jz=e;6VXZNWHbt$f=)%Jq0`YB z=uC7LIvbsX&PC^;^U($9LUa+j7+r!cMVFz=(G@5KrJ^*Hjxtat%0k&F2j!wXl#fQE z0#t~KP%$b&rKk**qY6}ss!%nmLA9t3jX`74I5ZwjKoijdgg4%CUdP&ev9E6_^Ri~3MM z8bE_+2(3cHXf;}cu0&U%tI;*+T67({9^HU$L^q+E(Jkm!bQ`)I-GS~zccHt{J?LI^ zAG#ksfF48-p@-2U=uz|-dK~=^J%OG?PobyLGw50L9C{wTfL=r|p_kDs=vDL@dL6xi z-b8Pqx6wQ3UGyG$AANv6L?5A#(I@Cr^cngbg-{qpP!z>b93@Z^ji4{km*^|>HTnj9 zi@rnOqaVbKhRqAC;AKhjs8LZqIIykSUs#h)&OgWHNqNWO|Yg| zGpsq*0&9u2!dhc(u(nt`tUcBN>xgy2I%8e1u2?s$JJtj1iS@#IV|}o`SU;>kHUJxl z4Z;RvL$IOPFl;zB0vm~q!bW3bu(8-UY&VSFqa6JSD2go!Z; zCdFi!98+LQOogd24W`9(SPT}6#bNPS0+xs+VaZqumWriedMq8wz%sEc%z$NMIhYa4 z#qux{mXDdS0;~`#!iupHtQ0H5ESMFuVda<|b6`%)g}E^gR)JMwUd)I2u>cmtLRb|R z#;UOzY$dh|TaB&3)?(|h_1Fe%Ben_KjBUZTV%xCo*bZzbwhP;h?ZNh9`>_4k0qh`l z2s?}&!H#0bu;bW&*a_?;b_zRD4!LDN0u?U>#yN%t! z?qc__``82QA@&G+j6K1gV$ZPW7=*zXf}t3O;TVCDSOj~4y~JK&udz4STkIY79{YfO z#6Dr4u`k$H>>KtS`+?PBKe1ofZ|o2D7psHU#p~hq@dkK9yb<0QZ-O_)o8isz7I;g% z72X;p6cM_(XgXJ{ga~r{GiZY4~(}20jy?h0n(4;B)bL_D!(;GRJPwb?6YxYl2~WmT@Kihv*W>AU2A+v$;RZY#&%up&E}n;*@O<2i z7vP0>5nha!;H7vOZo#d%4KK&-xC3|MF5HcK@Cv*V_u@X>j|cD|9>S~eFkX$<;4AS} z_-cF&z7}7Hug5pw8}Uu}W_%0272k$$$9Ld6@m=_Cd=I`C--qwV58wy!L-=9*2!0el zh9AfO!%yHR@l*I|{0x2;KZl>kFW?vPOZa8{3Vs#8hF`~T;5YGG_-*_Seiy%o-^U-| z5AjF%WBdvJ6n}<4#~~cX5gf%a9LEWq#3T3%{3ZShe~rJv-{SA^_xK0=BmN2hjDNwu z;@|M^_z%1m|B3&?f8&4fzjz&@E>VxDPc$GJ5{-z)L=&PZ(Tr$Lv>;j%t%%k{8=@`I zj%ZJGAUYDAh|WY8qASsj=uY$?dJ?^e-b5dwFVThnP#uBjyteh=s%=VllCV zSV}A-mJ=%o3PB}k1f5_IOoBzQ2@b&}cm$t_CIp0#5D{WRLP!Z2Atw}sl28$9LPKZ? z9T7vs5^+R4kw7F8NklS{LZlLDgq}zzGKfqfi!cz`L=Isja)~^`MC21@qJStQiil#O zgeWD-2n%5)Y(zO>Cme*6a1n08LsSrzgqQFUej-2wi4ajmgo$dRhFD3gB32V?h_%Ez zVm+~e*hp+5HWOQjt;9BBJF$b> zNt_~16K9CC#5v+Tae=rW#B1UW@s@Z;yeB>oABj)IXW|R-mH0+{Cw>sM z#82WE@tgQV{3Ys;b;){UeX;@BkZeRYCYz8=$!278vIW_aY(=&v+mLO^c4T|91KE-6 zM0O^-kX^}cWOuR$*^}%=_9pv~eaU`ge{ujhkQ_t~CWnwi$zkMhas)Y&97T>M$B<*m zapZV%0y&YKL{287$SLGhavC|EoI%bcXOXkXIpkb&9yy;}KrSQ~k&DSC#&s$s_q>G$|m3q=*!g5>iUaNI9t>m86PPlNwS>>c|)}mW(6g z$pkWyOd^xX6f%`eBlToDnL%cfS)_r?CUZz5nM>x8CNiHilLcfUSwt3-C1fdCMp{TK zX(P)?JLw>uq>FTu9MN%9nVnmj|E zCC`!P$qVE~@)CKOyh2_juaVcu8{|#$7I~YzL*6Ctk@v|5@;&*1{78NxKa*d`ujDuKJNbjGC4Z8?$lv52 z@-JB@Qa4gBQa{ol(lF8}(m2v2(lpX6(mc{4(lXL2(mK*6(l*jA(mv85(lOF0(mB#4 z(lyd8(mm26(lgR4(mT>8(l^pC(mygFGB7eIGB`3MGBh$QGCVROGBPqMGCDFQGBz?U zGCndPGBGkKGC2|znG%^AnHHHInGu;8nH8BGnG=~CnHQNKSrAzmSrl0uSrS|nD$a$h^;i?OggxO%I1{dfJK;%`BuW$BgfHPw1QNkSC=pIX z6468~5l@sQ<|gJP<|h^;7A6)Y7AKY@mL`@ZmM2yuRwh;@RwvdZ)+W{^)+aV3HYPSD zHYc_uwkEbEwkLKZb|!Wub|>~E_9pfv_9qS`4kivI4kwNzjwX&JjweneP9{zzPAASJ z&L++!&L=J;E+#G|E+?)et|qP}t|x9JZYFLeZYS;}?k4Uf?k6539wr_o9w(k8o+h3p zo+n-;UM5~8UMJop-X`89-X}gJJ|;dTJ}3T5d`Wywd`o;!BoaUZOh5@Zfh5obmcSE4 zf=o~eI>98^1eYjJ{7C#v{7U>z{7L*x{7X~-Dgu>&%0LyMDo_om4%7f@0=0nJKpmhi zP!FgNGyoa`jey2L6QC*33}_Ct09pdAfYv}8pe@i2Xb*G%Is%=5&OjHSE6@$-4)g$e z0=Km+6gS|AV50eZjyXZ08tO5tAN$O8elE34p|D?1?z$J!3JPM zuo2i8Yyvg~n}N;27GO)T71$bV1GWX*f$hN#U`MbM*ct2sb_KhE-N7DUPp}u*8|(x2 z1^a>h!2#eva1b~c90DeRL&0I-aBu`T5*!7N2FHM7!ExYtZ~{0HoCHn=r+`zzY2b8l z1~?O(1L$5>N`tz%(!&%m6dNEKm+AKqZ(Bsz5cE18Trr zPz&aPI#3T9z{ICug)37!H^gJ;0A;5qO- zcmcc!UIH(JSHP>_HSjuk1H1{|0&jzNz`Ni*@ILqed zrcg7eIn)Ab3AKV+Lv5h8P&=qS)B)-Ub%HuWU7)T|H>f+*1L_I&f_g)JpuSK)s6R9S z8VC)7217%jBxoo!3>prNfJQ>2pwZA6Xe=}i8V^l?CPI^-$Sck;z4{!012TKC>0VxVn_l>AsLhgr9&A|CX@xqAqAv_vLO|uhH@YclnZI0JV*!W zAp?{T6+lL)5GsO-AroYVERYqlL3YRiIUyJ1hCEOSR0??^ALNGuP!I}1VJHGcp%@g0 z%AmQ>JZL_&09ptwf)+zdprz0{g)j(*2#ACzh=v%5g*d1j`T_lfenG#X zKhR(3A5;OZ2v>qD!&Ts_a5cC(Tm!BN*Me)qb>O;iJ-9yH0B#63f*Zq4;HGdhxH;Sc zZV9)7Tf=SOws1SRJ=_8A2zP=z!(HI6a5uO++ym|j_kw%Fec--uKe#_U03HYrf(OGx z;3Rk`JPaNVkAO$Qqu|l-7tO?&4;R2j zxDYOai(wONhApraw!wDT0XtzA?1nvX30w+$VIS;=18@)y!C^Q8N8uP8hs)r(@H}`v zyZ~MZFM=1tOW>vOGI%+>0$vHPf>*<9;I;5Ncs;xU-Ux4kH^W=tt?)K@JG=wl3Gae; z!+YSp@IH7yd;mTOAA%3VN8qFIG59!q0zL_!f=|O|;Ir^K_&j_8z6f7}FT+>htME1W zI(!4Z3EzTm!*}4j@IClG`~ZFkKY|~_PvEEUGx$0D0)7d4u1GheJJJK`iS$BxBYlv*NI#@MG5{Hf3_=DYLy#n7C^8Hg zj*LJ?BBPMe$QWcSG7cG!Oh6_glaR^C6l5wg4VjM2KxQJdklDx_BpKl$d_;fw7ve@dNC{Gkco84sM*>I?2_a!5f<%!R5=Y9AxyU?ZKC%E=h%7=D zBTJB_$TDO(vI1F&tU^{JYml|bI%GYv0ojObLN+5?kgdozWIM70*@^5zb|ZU`y~sXf zKXL#$h#W!=BS(;<$T8$NasoMtoI*|`XOOeVIpjQY0lA1=LM|g$kgLcw#rqeIXnbSOFu9gdDbN1~(9 z(dZa-EIJMyk4``*qLa|c=oEA+It`tU&Om3Pv(VY-95fl_p?p+;3egla6&0akRDw!T z8JdQsqZw!>nuW?y1*$}|Q5C92b5ISMi)zt4REO$O1DcN(phmRtfAL!}YC_GZ1+}6! z)Q&n(C+b4os0S@UOHnWCL;Yv~4Wc15j7HEX8bjk~89Eo8ht5YApbODO=wfsUx)fc8 zE=O0OE74WxYIF^{7F~y~M>n7w(M{-PbPKu_-G**Qcc44bUFdFf54soKhweuYpa;=I z=wb8-dK5i|9!F20C(%>rY4i+w7CncaM=zik(M#xM^a^?vy@p;#Z=g5PTj*`{4tf{8 zhu%jYpbybU=wtK=`V@VJK1W}mFVR=%YxE8J7JY}lM?at+(NE}S^gr|q`W5|#en%51 zfPyH5!YG2GD2C!Ffs!bN(kO$nD2JA#KhU4(FZ4J12mOowLn~kvu}WBFtO`~YtAxOm5dSE@VURZCe57rm!hxNw>U<0v1*kEi3mV^z(hGE085!gs<6gC#D96=FqLF=oQdm<6+9Hq4GWFem21 z+?WR|!AdbN=EMA001ILvER034C>F!wSQ$1Kn}^NE7GMjpMc86&3APklhAqcdU@Ngz z*lKJIwia85t;aTC8?jB;W^4<#72Aew$97;lv0d11Y!9{<+lTGP4qykdL)c;L2zC@Z zh8@RFU?;It*lFwxb{0E_oyRU<7qLs&W$X%e6}yIA$8KOZv0K<}><)GpyNBJ!9$*i# zN7!TR3HB6whCRn#U@x&(*lX+!_7;1Gy~jRaAF)r^XY4=h3-%TJhJD8p7=VEoguxhs zp%{kY7=e)(h0z#;u^5MyV?VH;*e~oi_6Pfm{lhBY74b@VWxNVr6|aU@$7|p<@mhFo zybfL$uZP#i8{iG`MtEbq3EmWMhBwDs;4Sf1cx${3-WG3%x5qo+9q~?hXS@sE74L?3 z$9v#C@m_duybsa5=8P zm3TI;!qs>VuEBG0EuM$#a6N9o^YH@Qh!^5Tcrk9m&A0`(;x^olJ8&oN!rizBFTqQ3 zFYd$rcmNOLAv}yn@F*U`<9Hc97oUgE#~0uW@kRJzd?7r%$!#~HHlh8ZK4iQm#9b7 zCmIk9iAF?Yq6yKIXht+AS`aOXRzz!}4bhfpN3ttA(29)5+XuONC+t*BhrX;B7?{zvIse$Ae2Nlp(4~o z4xu4(2`!OF=m?aNo2Z=+(Vd4mJlsHBlCr%J2iBrUB;tX+? zI7gf(E)W-qOT=a33UQUVMqDRu5I2ci#BJgZahJG9+$SCo4~a*_W8w+%lz2uwCteUQ ziC4sH;tlbZct^Y^J`f*?PsC^9KjI7VmH0+{ClUlefCNOq1VW$$M&JZNkOW201VgX{ zN0bvkh@ZqS;y3Y!_)GjFDv%Y)N@QiS3R#t`Mph?lkTuC#WNoqzS(mIw)+ZZ~4ar7i zW3ma^lx#*eCtHv$$yQ`*vJKgmY)7^yJCGg8PGo1Y3)z+IMs_EAkUhy>WN)$$*_Z4` z_9q9B1Ia<;U~&kVL=Gi~k;BOm_4tbZnN8TqNkPpd6PB^^dQd&7UQ}x< zQ#^`K2`C|zLZwn7N=!*8DJ7%QsB|iW%A~R=Ii;YKR5qoe)Km_op>ioLl}G6)J!PQs zsRGJK6;ef1F=e96l!dZVHp)&pC@1Bj+?0nZp-L$)<)i#mfC^F}DojPFC>5jPR2emw znn%s27ElYRMbu(y3AL13MlGjSP%Eib)M{!CwU$~(t*16n8>vmyW@-zymD)yar*=>~ zsa@1=Y7e!S+DGlD4p0ZFL)2mF2z8V?MjfY4P$#KV)M@Grb(T6uou@8P7pY6sW$Frb zmAXbJD|6x<}oo9#9XdN7Q5L3H6kEMm?uqP%o)h)NASu^_F@^y{A4< zAE{5&XX-!d3-y)yMt!Fe6hMI#M8On7p%g~p6hV;`MbQ*Pu@py@Q$MJm)Gz8c^@sXP z{i7<-73oTJWx5Jom99otr)$tP=~{Gcx(;2Ju1D9W8_*5uMs#Dk3Eh-#MmMKh&@Jg! zbZfc|-Ii`gx2HSM9qCSVXSxgBmF`A&r+d&n>0Weix)0r#?nn2h2haoQLG)mH2%SU^ zrH9eO=@IludK5jH9z&0%$I;{I3G_sI5QJZ^k#Ysy_McZZ>M+AJLz5YZh8;B zm)=M3rw`Bv=|l8k`UriLK1Ls>PtYgnQ}k*241Jb9N1vxJ&==`T^kw=AeU-jOU#D-- zH|bmSZTb#!hf^k@1% z`V0M){ziYN6Er}BG(^KRLZdWB<1|5&G)2=iL$fqTm(xG!pY$*KH~okHOaG%QFcq0f zOl77DQA5^m+8m!X9h3>nL*58W(bqS3}uEf!ni<24WyUe%nF-89W)d@*nZitErZLl*8O%&(7Bicf!z432hR+BXA(O(SG9pII zNEj(2W73#(CWFajvKTp|V3bTYqhi!d4x?dm87-5?=omd?VDgy)#>f;hMNBbcV$6(% zu`)Ks&Nvt+<6_*5hbdu78872w{7ireG9f0+M3^WOW8zF1Gnbji%x4xb3z}L)z z2bn|6Vde;PlsU#6XHGCDnN!SZ<_vR|Imeu5E-)9FOUz~F3UigY#$0D^FgKZ7%x&fl zbC*;Z_8whh~sZO67}JFp$u zPHbnk3)_|L#&&0WuszvcY;U#?+n4Rf_GbsM1KC0BV0H+b#13VLvBTLB>_~PLJDMHC zj%CNO)xJeJQ2SRtFjrm`Yd%t}}(D`V5x zbT)&{WV2W~t6-IEHmhRQY!0hob6G8$$Ld%;Yhd%)0@lbDvPEn$Yhul;g|)Ia*3LRu zC+lL}tcNXOOIa`LWBqJ^4YDCN%tqKK8)M^a89SGq$IfRLunXBm>|%BayOdqVE@xM; zE7?`-YIY5~mR-lLXE(4L*-h+bb_=_e-NtTbcd$FzUF>dl54)G$$L?njum{;g>|yo@ zdz3xK9%oOmC)rc%Y4!|zmOaOwXD_f9*-PwY_6mEIy~bW=Z?HGnTkLK24ttlq$KGcj zun*Zs>|^!``;>jgK4)LBFWFb@YxWKMmVL**XFsqX*-z|e_CNLu`<4C1erFRbz=ABq z!Ysm~EXLw2!ICV+(k#QWEXS6!KiHq_FZMV4hyBa`V=HhKxk_ARt_oL`tHxF5YH&5V zT3l_e4p*0}$JOT=a1FUeTw|^Y*OY6&A8GdT>3tUR-ak57(FL$Mxq1a09tP++c19m&6U_hH=BW5!^^_6gQe1!;R&}apSoO z+(d2?H<_ElP35L>)43VkOl}r8o14QWb3BgE2{<8_!liN|PRvO-DJSF7xO6Uq%jB{+ zIj7*1TsEiT)Lagy;c_`Gm&fTiJ!jzZxdP6}6>>#fF=yh;oQ1P;HqOpDI49@g+?P`6Tp2f)o5#)P7H|u>MciU;3AdD6#x3Voa4Wf0+-hzO zx0YMSt>-py8@Wx~W^N0&mD|Q`=XP*Axn10DZV$JY+sEza4sZv#L)>BR2zQh_#vSKQ za3{G_+-dF%ca}THo#!ra7r9H^W$p@hmAl4W=WcK}xm(S1hkoUb(zVdDZf2<<-k;l-De;RbIQi zPI=w(dgb-Y8 zdDrr8<=xABl=m#}Ro=V2PkG<+e&zkk2b2#iA5=cLd`Njx`OxxV<-^NIl#eVQRX)1> z|9@jqDY;5=)#N(Kjgs3ZcTVn-+&j5na{uH3$w|rMlP4rkPM(%5NKQ-6NLD3llk<|z z$(CeCa%u9s*P1dACo^PCz7#bBAH5NlK&+CP5zf$iC2SH zn^%X|h}V?YjMtpklGl$nkT;l@#2dyN#T&~T&zs1b&YQuT#hc9&@=|$Ho}8!Psdze` zfmgsQ;@Nn1o`dJ)d3Yr}AJ5MV@Zy|39Zv}4^Z#{1V?=bHK?-cJ0?=0^e z?>z4!?-K7C?>g@$?+))S?*Z>I?=9~m?=uhQk-Xo$KfDV3iu@}4>ik;#I{bS42K>hS z=KL1?*8Dd7w*2n=e*6LaLHxn|B>pJ=1pXBMO#WBQ{zKk#DEBOB#-ih_8~K~~oB6x>2lxm1r}(G& z=lB=-SNK=?H~4q?_xTU`Pxw#yZ~5=|ANZg7U-;kn2|mEb_ynKiv;3d@zx>LAYJ%#5 z8iLw_I)b`_dV&Um=7N@j)`B*Iwt{wo&VufO9)doCzJmUOfr7z;A%Y~qaKQ+{L;+8b zA`l5A0;xbQ&6ZH`ksnb&D zr1Da;QnORlshZT>)Vx%EYJO@#syVeZ)t4Gb4W&j?W2y5}7o{#sU7orjbyMp0)E%k2 zQ}?CrPd$`+BK1`2>C`i+7gDdM-cG%jdO!7JDwqnVVySHE@6^Ak6+{(9RYf&KHAQtq zbw%|=O+~##y+wmWNur^mQKHeJF`@~gX`&gTnW8x&zDOXFiqb^sqAZa@q!g(|8d0gp zC-RG;qWPi)qD7*`q9vlGq7|YoqOGERqQjyKqD!JHqU)ktqC29yqWhvpqQ{~qq8Fl< zqBo-VqR%2g#ESljs)}ofYl-WM>xt`&8;Bc<8;M(r`-lgK2aA)$!^9)Rqr{`dW5nac z98=ZlTvB5|?UA`Xf};;6VxJXgF- zyh^-UyiUAcyg|HOyhFTGyi2@CyjQ$Wd`Nsmd_sI)d`)~yd|P}+d{=x={6PFr{7U>* z{7(Eq{7L*p{8ju-{9T+7Lt;csh*>cwt|+M_sV=D{sUvA9X)0+YX)S3h=^*JO=`86Y z=_=_d=_TnS=_lzg87vth86z1h87G+{nJSqrnIjQOvL(3^twb-$mlQ~hl0r$5#3V6G zEE1cYbEO>>m?f`nCARirhfHKlc=b)~JP?WFCc9i-i) z-KBk{gQO#*O41o2A>OyQGJtXQh{=SEVYLuchy#pQN9qfRvI} zl~t3~ku{PvmNk*Jm35SLmUWT!koA`hkPVh4$%e|t$tKCB%7ikREK4SrDP?+DzRV~q zmRV$0nM3B1xn*Utxw84P#j<6x6|xPo9kPA0{jvkHgR&#C6SA|iOR_7ntFoK2+p>GI z$Fg^__p%SN|72fe-({!_lMymfM$0%^g|sSZb<*ml)k|xX);O(QTIaMbY2DL$r1eVc zn>HYAa@v%%X=&5bW~cGfL}^)Rs0Q(NrVmLUo<1RcR{HF8VR}}&HoYL-nC?#Zq?e?Zru))^ z>EZNv`uy~T>5I~rr2lW+oxU@DSNh)ced!0%52YVYKaqYq{cQTB^n2+K(x0clNPm_7 zI{jlhmQJM8>3`DeWHircpV2v^TSm`}-Wh!|`eh8r7?hEeF*HM#k(QB>k)5H+$j#7Z z=vvX#b%x;;zGY4i4$sCb6CUacoq|B+A(=%sg3Nl5R zvP^lVB2$@}ovF^$Wfo>SGM$+vnWdS&%s^%|GoHCPb4ljX%w?IYGS_5o$lRE@BXdvY z!OX*%M>DTv-pIU@c|Y@I=Bvz)nO`!2%<{}1nH93CXVuMWl+`4wX;zD@_E{aWdSvy> z8kCikH8yKT)~qakmLN-rmE_taDlCvo2&^&$^R!H|u`ZqpZhSPqUt7z0G=`^)(C1swA%_uP(14uP1LQ zZzFFj?)Oa-+Oh zZkAi*cDYmTk(bD0@_F(F^5yci@^$jf@~!e6@;&ms@&odN@6PiB1MU!RN+^I6;Z`}#UjNL#WKZ8#X7}$ z#b(7;#WuxG#X-d(#Rk#Vy5c#T~_c#RJ7t#Vf@d#XH4k#a9KRC|CSe z{83a=R#(WHHdnS(wo$fIc2f3I_Erv5CMkz1M<^#Krzoc?XDG9j z3Z+3=th6g#O1H99=~eoa0cB8Grktl-tX!g8ps{F15l&}&}V#kv%4RV)mr$$=Or0XJ_-X1=+&v)NFBfT6RXZIy*nxm~F~-W_z;dWzWxE zki9T_XZDfoVs;8=#s;??ZHB>c1HCi=6HBmK5HCZ)PHB&W9m8=q~QdFrbsVZHSqtd7hs(e+E z%B-@e>?*g)qbgPTRY6rm6;~}(EmbX3tx~O4tygVTZCCA6?N=R8ol{*>T~pmu-B&$Q zJyAVXJyX3^eN=r_fht%t>W8YPx|X_ux{WF%QdZBuedZl`m zdX0L6dXsvKdb@h3dawG3`keZ_`hxnZ`j+~(`i}ap`l0%f`kDHL`iuIj8c>63M2)K% zHK+ci{->^(QzfTHPR*QJIrVcI=QPP_meVq)bxymS_Bow$y5;oD>6bGwXJpRkoH03* za;D|X$l>P*b5e8UIf|Uz9DR;6$CKmB3FX9d7UwL>S(&pgXJgKmob5ULa}MVm$vK*H zA?I?=&74~~_j4ZRJk5EY^D^f{4xU5i&^b)bkDR|b|8lBmYG~?e8fqG8nrYfW12IXi<--tE1H{{yPEr& z2b!mvH<}Ncga*>U8dOs?w|Z{l+?Kg*ay#U9${n0LHg`(ywA|^rvvX5(MY)-|hTMW& zbFMYlmFvq5=FZPukh>^%N$&F8mAR{O*W@0|J(PPm_gL=P+;h2?bFbuH%e|RroF3usC}e;qJ6G?rG2Y?r~Rr;XhAKcg|&zl*AiMr%W8jVe{26}tL4?q ztCiOvuVG%}yk>dL^9JS(&P&Q0o;NCQV&0Uz8F|ThlDzahRh~L8Cr^`?muJW;%qz+( z&U5Cu@=Ei(dGqoX=Pl3Ml(#K!d*05xJ$d``4&!RzS8>Abe8>Snj8><_qo1&Yco2g6I z@pS^7P$$xfb?G{_E?1}173qAsfG(_y=wiAu-6Gu@-8$WR-3Hw@-5%Wm-9gD-CNx|-FF?V!*zs?)cw}|(N)q{)>qS4*Vok7*Ei5N z)Hm0+*0PP9v>8I*v>gVW%da+)r&(tgQxq7|6Kwqf0=so%p zyFuh6g2Z_sblZ`N%gr3v?(Erm{GE^~CHPkfJHPkaSFf=l>G_*H#GjuofF!V9>GYmE)8HO508b%pr z8fF>h7}5nPG)trD3gMgW;gzu;HlT zvf;Ynp5cMvq2ZC?vEixVx#6whqv5*&FhB;_fEq{xZK$4KE5BZT{rracjq_XOcgydd z-y^?Ye*gS|`6Kd2=a0*mi|@3w9LjE7)If zsNhJ!nSzT2mkO>F+$gwNaJ%4M!To{<1yBJ}fEN5H_*L+ypo+1Ev6iupv97V1v4ydf zv9+WakPB`D+|{YZY?}mc&PAb;fccAg^voK z6h19{R`|T|W#QYxFNHq~D;HHQs#a9JsCH4EqIN|cih39IE$Ux1plD#x@S+JtQ;KF5 z%_`y-35z5}X+>E@iXv^1qsUtnDvA`%Em~Z(x@b+&#-hzd2Z|0B9WFXjbh_w5(Z!;x zMR$ts7Ck9?Ui7Nyb+X>Tc>`>SG#c8e~c`jWmrijWJC!%`x#!LX+4eHD#KzOmdUL zq%q~1@=SV@!Bk)}nu<&gliTDq`Ah**$P_lsH!Uu$VEJhIWcgzGZhzj=&lo55CSE4Gt+acRA+j-j+ z+b!E8+hf}^+bi39+Xvf6+ZWq68)$=VxQ(#UwsPAqTUC2Cdrf;?dp&zYds}-aduMxJ zdq4XCdy;*aeUg2$eVTo`eYRa_&#-6N6?UavW!Ktu_5yo}J#JrMUus`zUuR!$-(cTl z-)i4!-)rAzKWIN>KWsl@KVv^1U z2koStva@#1{?q=;{?A^)QO!}u(ZJEl(ZnWV7~>e{ znCzJ1nCh76nC0L(1dddP)RFGUaO67j9C}Bw!{Kl_+>R1QnPaYFkzCV|skyGrHIWwG@PPtRz%yH&Ab}VTUFUu08)w1^IAJH@q@BN)r{apiG16@O0V_f50<6RS6(_G0ekxSuHyELvmm(G>%GP;UgCYQ|>bj4irT?<`{ zT+3Z+TpL~6Tzg#yTnAl;UB_IyX&~?x$C=Ix?8(DxVyT$xqG<#xCgoi zyN9@kx<|N2x~IBlx&>~bJH;(>%iL-1ba#e3)1Bp3x>fF6cb+@nUEnTs7rPy9x7*_m zyCd!e?xpVa?v3v4?t|{*?i23Q?lbPQ?hEd#?i=o#?pyAA?g#EC?x*f&?icP??$_>j z?r(0u4Y?V2Wlwca4Npx^eNRJABTr*bGf!JjJ5Og%H%~85U(Z0#XwMkWSkHLR1kW_j z9FM@0;*oe{o-|LUC&!cP(Rm6zc8}BJ@|1df9=|8x330Z*Kq)$oTlKv%wONN$=E16s}rDR%3atXggS|Tq| zmSmUYl;}$eN{l6@5_?HWiLWGF5-FKivZ!QP$;y(|CF@Gomy9YMT{@<8Z0WetNu`rZ zd8NYAl+yIljMB_fWvQxEU7Ay>Da|h}D)p3>l$MryOUp{ROKS6ba$ z!&}Q+*IUn9-`mjJ*xSV0%-h!6&fDJG!P~{#&D+P@&pW_7#GB+D<{jZ3=^gDI>mBc% z>{WQxUX3^3TjaHPecq^dzIUy6y?48Jhj)+nr1zBfruUxrf%mcZsrQ-ph4-cRqZjd_ zUffH1DKG2&;r;3T>#gjo?Q7<1?rY&|<7?;Z;OpY+?(5?l;7jt2^o{mS@lEs1^v(7O zeG;F-r}X9ew7xuFzR&2h`Fy^hFXRjR%6$JLzkJJmD}8Hx>wTMj`+bLfM}22}SA5re zw|#ef_k9n1&wMX@Z+!23?|q+qUwn`c_TfIlNBS5a>nr#D@cr@q^HuOy_Sg3}_BZjj z^tbZ2^>_4l^7rr$@(=Nk^iT3n_D}Io_0RGr`+0tWU+mBDEBq>du0P*z_PhKZf2rT= z_xS_1X$U%@}YN}Y+NJdZ7lPHlcQ*PNB}BE}^cW z?x9|x-l6`XL7~B+A)%q6aiOUpUWgwOgoGh+C?k{^$_mLtijXpt9a4vkAxFp=a)msh z(vU9{3WYr z=yvE%=zi#B=ym8r=ws+xC=o(JREQ1z4*d&N2v-SL4c86V3pWTi3^xk52)7Kk4z~+; z40jLr3=a(t504Cw4vz_s4^IeB3{MRU!zp2LSQ3_oW#P=QBCHH&hgD&9I4^7n8^e~c zHEatz!_n}(@S^bY@XGM&@Y?XE@b>VI@XqkQ@S*UL@X_$G@QLur@Tu^H@Wt?@@Rjhj z@T2hK@U!rX@ayo~@W=3f;jiKE;h*8(;XmOjk*bmEk=l`Zk@}Gak;aiGk(QBmk@k^} zkk%5sxkr9!Rk!#OjI4^Rk8F%=iR_5%jqHo;j~t2|i=2;Kh+K-?jNFRc zj@*wti#(6KioA}zjeLlFj{Fz-5&S}D6Kxl5AMFwC8|@bz5FHdvijItqj!uY9icX16kIsnBjLwQCM+H$) zR2-E?)1nzsc~lWqNAsdZQAgAj^+s1lS4Y=G*G4x)H%50xcSlc0&qdEiFGg=i??mrL z??vxNA4MNWpG4n8-$%bku_zuTqFl6MtXiyYtX`~stZA%StVOJ4tW~T-tXr&mtVe7> zY+!6qEGaf3HZnFgHa<2nHYGMSHY3K131gC2S}Z-55mUypW2%@wRuC(UnPQfhGvurb~JV@c06_>b~g4j_AK^1_9FH&_B95?pcoP( zVpNQc{fPaE{fkwJSB+PX*N-=hH;Ffmw~Kd(cZzq3cZ>Iq_lft9C&kCa$HvFUC&j14 zr^RQ)=fsoaDRFUJ5|_p^;+b(}JSUzTx5TY+Tih9U#Y^I)ac?{j568>m3*rmoi{s1V zE8?r-8{)g-`{M`VN8-ohC*o(~SK`;>H{-YBx8slEPvTGG&*CrQ@8WPAkJE7`{yY9J zUbU=RS*^0#Wev;Pl(j2sU)Hy5K-sXe(Pb0MCY4Ptn^HElY`C#z4w-c-XT=EfGuGIp(a3p z5JKWNXYV`>y$ZnbBxwG#bfq@QkFm0dYg)M#YVfn;Ew-Zc*Ig zxTSG1am(XY#jTEui%W>p#wErj#ihpC;~a6V;#2v{$_k;{G)gw-W~6ae;WTX{%w3t{Kxpu@p>h!qtRp2{#h%B-~4QnD8jUncz-%mhe0wE8%Uz`-Be(9}_+$6ea)-(omXW znv$CGnx8b4G%^jXVKlWh3Js@es^K*)G%Yo)G_5u5G{0z6n(msOnqHdTngN>Onh~0j zno*junsJ(`ni-mznpv9JnmL-qnkAYj%?iy*&3cVaW6&gNEE=oErm<@_Yj$XMY4&OM zYmR7+X-;d-XwGTQYc6UoX|8JSX&!2xXkKdGX|gr%H6Jv2ntaVS4WWhF5N&a7S#3FO zC2eJG6>X?irlqyDwXBxY*3mZ5Hqqjr;at9F}qyY`s&xb~zrU3*S@UVBA*Lwi$uTYFb~U;9A&NGoXr z+GpCA+HCCy?Pu*5ZGpB(3w20WTvtk0MOR%{M^{%@PuD=#P}f+;>ze6W>cVttUAV4? zZn$owZk%qCZia5QZoY1@ZnbWmE>0J()97@%B%Mi@qBHBPx{bO`y3M+6x`VpIx+A)y zy5qVuUApd~?vn1Z?yByZ?w0Pp?vc)^bLrf=CpxcA)IHa|(dFpg>ptne=!$ef9ic~h zN?%N0TwhvWPXCj>lD@LOioTk@hCWm;(=+tB-&EgB-$LI~-&)^B|FgcG zUajw}@1pOm@2?-MAF3awAFdy(pP-+tpQ)d(U#wrEkJ2yKuhg&BuhDPNYxH`(QJ<(! z(x>R{`c3-n`knf{`hEKS`h)sI`osDo`s4aD`m_2peTM#m{-XY}{(=6X-mQP7f31J3 z&(Xivf6(XY^YsP#LOo#s24tWNA%+r$QickK9}SfZRSY!@H4U{5asz8n80r`r85$d! z7poa>kS(W2?mY9U@#fX28UszVXI-AVW(k_;eg?=;kejv6gE7vSVAL87#w25k(Q33CHyO7Ww;OjFcNzB> zj~b5|j~h=L&l@ipFB`8KuN!X|ZyIkIZyO&N-Nq+I(dak6FlHI^jQPfI#sXuZ5hTJy zlvq5mL}Ka0GKpmqD<)P-tejXYu~A~3|IoXozNZy*fEqQzLuH^m6N0Lt`-$=fn>`L||dy{?1V)Coxoa7J5 z-;$w;G*PA!rfR0@rkW<&#F%QE>X@3ERHkmGUZ%mOA*Nxb;imDX$);(h2-7^%LQ|w^ zktxa)ZHhH5Gp#oznUYN=li6f3*-Z}9X478Ne$ye-Vbd|wanniDDbs1wSyQ?x!*t$s z$#mIt)pXr-!*t7Z+jPft*L2VH(Bw3^Om5R-lh@=kNv5Z!XQmv}2h%50p6RRUn<*sa zhm_JOWm0}hsgzPRrAA6aPg4RZ z&r@EcWTm`L$xZo^0?i@j;^y+^isnk@%I0e3>gF2eT4u(qFxNLXH7m`$xtY1SxwW~C zxvlwU^DkzVxs$oGxr@1{xtDo>d5C$adANCmd6apyd5qa=wwWE~?dF5#L*~QgW9C!l z)8;gDhWVoTy7__mq1kQrn4g$^<}CAT^BeP9^Lz6r^JjCuxzJo>h8EI-EF~?aEafca zEtM>x7MX>y)V9bioTZ_qk%hN3x3sXdvZyTKmd=)LmhP4wmcEt&mO+-0mfe=Umi?9k zmcy2#mSdLVmQ$89mUK&o<-Fyh<%;E+<&Nd9<-X;SMX)$6k1dkrndP}9%ks+d*7DJk zYx!)+w|uh{T7nkB3arpdT9K8q7PpqLmb8|#mbR9$ma|r{Ru+Fna zS{GRtTVt)utgEc6t!u1nt?R8DtZ~)^tInEewODOdyLG#Dhjo{Aul1nyu=RxXr1h*d z-I`%NZ@p^0X1!y*Yjs*(RFPD)RL)XQ_H7T zO0AMwHMLr5jnvRoCbf2|B9%+6lUg^mUTV|S=BX`GTc);4Ri&y^!&5t^c1`V;+AFnp zYM<2psRL36r4C6Qo;o6RWa_BY(W&E8r=(6zot8R1H6nF(>fF=?sgbEssV`DLrsk#Q zr$SpvTX|b$TNPUkTTNT2t+B0%O=;t8&1`LKKik^bI@r{X|{#7NL!R`sV&B~(zeRB#$V%VhqgyH!REAiY(AT4lWfmzS+-ZUH@0lsdt0vUldZ@G?IHFb>}Blb z?B(qh>=o^m>^1B)?Mv)Y_NDe^_7(P(_Eq-P_O*76U29Lar`WA_yM3#Dr+u$|zx{yy zp#6ybsQsAziv61Xru~s!v_G?F+27jV*|Y8M?H}wP?Vs&m?Lj+qkd6|LvW{|&@{S6Q zpB$AOl^sQFkGIa)eeJK8vYcC>SZIaCg{Bizx^(aF)- z(cdx9F~~94F~l*}G1C#@nB|!5nB$n|Sm0RVh<0clI)~n2a3ngC9VUm} zvB|O7vBj~?@&ElS-T(P5*hp+5wi3ID-NYVZAF-b}KpZBH5XXoU#7W{5ahf4*N!%sw5%-A)#6#i{ArLOYO?ZgM z#1q0x_z01}H~S{=4SxxI(@z55_>aIh|03`WfCzjO5CY!_fWQ|66ZnEa0$&tFd?CIP z`NTJ(fcQ=n5=BIi_^&z+1ONa65+FcEGP%cg9_kB@Dr#A zDuK$N3aARIf$E?Js0l(rEg%ClU_fmk2P{wk4%7j4K|N3(Gyn}jBhVN$0ZoAt@SquJ z4qAYgpcQBh+JLs;XV4C`2VvkBpaLC$8ia$6pcCi}x`3{r8|V&tfS#Zi=neV+Jnil3=9W&IvE%RMuRZ`PvrsQ0iHqvCIS4AN-z~n1Jl6_FcU<8SztDp z1LlHx06&fnECi8Y5m*eC0Q^NWhz2nr78t+ z7(4-=!8cFt0;XpVD4u<#<&2ShT4oAR|a1~{$mp2KcJum;*VX3 zKXjl2ZiJiQX1E1zh1=kExC8Elf4f&#;8l1HUWd2fZFm>ngZJSB_z*sV0(3z)^uWjP z3G_lAd=6j0Ecg<>`n&RfTibvA(tL6OxrB@%SCOm9HRM`y9l4&|K*p0AQcLQ{-Q*r} zFS(E0PaYr-k{8GuL08JSQDG9wGZ zk9t8iWJeCP5p6=7(H687ZA0794zv^PLc7r(v={9|`_Tb(5FJ8?(GheM9Ye>_33L*j zLZ{IgbQYzdbd-V4q4Vehx`-~JtLPfKiEg30=pMR{9-xQl5fYFSxsV%q&|~xjd65r^ zNJ3AM9|h1e^c=lFS?DEtg!OV_vi!qh;q><^cj6c`RMx7$vVi?vT#{PStr^5oxYnbn=e}+TPTZ^ zEs`ykEs;gZmdc`KF|t_MGTCz33fW58D%on;8rfReI@x;J23edeUX~!!{L8J`DBC34 zEZZX6D%&R8F54m7DcdF6{V$jP=le|1fQB@pDY_UPLKmk?&_B>6=~8rQx(r>GE=QNA zE6_jEKhYKG%5)XFDqW4PPS>Do(xG%MT1GQ;ZCXyVw1Vd7I&@vS9^HU$NH?Mz(@p56 zw36oOW^{A91>KTvMgQ}*{60s2dH_9;9z+kOhtNamVf1i%1U-@-MUSSZ(bMS}^h`Q} zo<%RAqv)k{G#x|7(#z=O^ooDFl|&jp){QpNDYTik&{jH?w$XOlL2slt(VOWl^j3Ns zy`A1c@1%FpyXigjUV0zBpFThzqz}=D=_B+}`WStjK0%+PPtm98GxS+HjZUXC=yUXW z`T~8CzC>T9uh3WNYxH&c27QyhMc=0H(3$jI`X2p&enbnjlXlT=+Cx94pU_^~M~k#X zKc)S2fPO|lr(e)n^h^2`{raEo$zOX5Fo>a;VoV9<2c{HLnkmDSWy&$-nID;-n2Jm# zrZQ87smfGmYB04JnqipQjGSQ^1=Eme#587_FijaH!!s?ImP{+AHPeP^%lyo=XTq3Y z7!}ijQ8VF8N2U|gnd!oGWx6rlnI23}rWezj>BID8`ZEKVfy^LgFf)W1$_!(MGb5Oh z%qV6wGmaV0OkgH5_!05U3}z-1!OUW2Gjo`^%sgg3vw&I1L^6w*#mo{Wido7;Gcimo zvy55JtYTI(>zMV-1}2V)XA&3|%B^dzihnDfj9<|1>6xy)Q)t}@q{>&y-2CUc9q&D>!!nY+wA=05X)dB{9s1jfm@7&qf# z9y3oEFXLlGMq-{aekQ;?W1cfFm@MWc^NM-RykXul@0e^Rhk4I@VE%fv{xJq?Q?-lL zE?2usZCP!)c7xjgnB)I;${6`r`8fG_`2_hy`6T&d`4st7`84@-`3(6?d4znHe71a! ze6D<+e7<~ve4#v2zDT}UzC<1+Un-B5$H-&l%jC=DE95KXtK_TYYvgO?>*VX@8{~2F zczJ?cBiG7xa=qLjH_8*`N%Ca5NuDA%%Pn%NJXLO!+vN`VM)@ZBX89KRR{1vhcKHtZ zPWdkRZuuVhUim)xe)$3ULHQy1VfhjHQTZ|Xarp`PN%<-HY55uXS$Uc~U7jI7CqFO0 zAipTTB)=@bBEKrXCciGfA-^fVCBH4dBhQrImEV)!mp_m{ls}RSa;MxScgsEU$MPp~ zuiPgW<&ylV+%FHvpUI!gU&yoMFXgY~ujT)GuOpUXi?JbWakd2e16z_U&6Z)yvlZBi zY$diTTa686Yq2!TunLxA>$3IOhHN9YDXV0gvn|-xY#X*6+n)V}Rk3O|obAYVVmq^4 z*sg3hwg=mj?Zx(H`>=i4er$hs06UN!#13YMutV8l>~MAjJCYs6j%LTOW7%=+cyjbLZ7v)MW9Ty`EipIyK%WFy%{>|%Ba8^tbVquCfXmR-g! zXIHQ**;VXnb`86hUB|9xH?VPRJe$C3SS_n#^{jz4vWaXG`$xU9ncc!}Ww){0*&Xao zb{D&w-NWu>_p$rg1METe5POt8#vW%+uqWA5>}mE4o6csi=h*Y?1@iAF_{FfpxMj*3Ej@$Ltf<%lcT6mDs1OpAE3j*yrpEHj919zG7dq zZ`il&J2v|d+xGkR5(=Pz3Q~a-A&TOP5{e%bB^9L9YtM5Jw<&*14TncBSm9H6Gc;nQo$>lDVi%3FL30xbfTsZX!2{o6IfbBDqD}Vr~f+#VzHcxfm{%TgENtR&Xo1RorTB4Y!tC$F1i! zaB*Bbm%wQ_EvMu3oPjfPiChY2<}93*OXX~wopW#-xlP<=ZVR`S+s19@c5pknUEFSN z54V@w$L;41aEG|V+!5|5cZ@sEo#0M#r?}JH8SX5X#-(%raqs@~wWvv@CY761X;QUG zwIX=n>1_Eyh)2DEt~xFdVZfH@gMT%HTl{kzsa{>(`8Cp z$tY_peLwzBj1xTIAy4v%r}$!g2w$8p!T-RQuz75}&|Cw*cx97w7Uw9SYfmie4d`G?$-_U(2uK z*Yg|rI6j_F;5EFK*YSGZz#I8QK8a7}O?(P(<}JLHPvvdAopq9&J!pPwWK1cqtqv=S+V)Wju!h%iGMHrRIFLZ{E(v|pF)}ypI>}i zapM2yFF*vtAQ23b7{Vy57#4yR$4X#7U?s6qSZS;bRu(IVmB%VzKVm;&6|qWKWvmMJ zr|zvvpx=7A8iAzhM6lMM5^4~#@4v11U8E*17mC%wWEhPxL=gNbOKsvDFDGJSSwbRz zSL6?)3Zh9kN4$5|!R6}`1;KhatWN}Ef1kMlQ6x6R>5Z_)SQD%%Q6wsH$YafjSfV)& zTVO4*R)nK!YaF&Af|+fJuz%Wy-*4-`WBg|V4+;O>s~r*cTS|MpK8*P5ZvH})`fc4G zMO42#)_=7APiY-+|EaNXd@MTRuoLd%zq~pVAA()}e2lsh_%!;1S2tXyJJtj1`RDVZ z7x6XN8!z|4`Vt{TKOFYQ24DlRLD*mdpVs&_1jmPB!?5Al2y7%a3LA}$!Ny|au<_Ug zY$7%Zn~eKn3NeA0N>E@LL6-Z2=Ka&8>A0R5*i0+}n}yBB=3sNNd4F!_d>mhZEyN1esF&k#b97L@}8*%z39N&y>!M0-C{_cJHueA5y%d;KVw*%Wrl>M75yKvfWY!9{< zw{ag4EW01a4`2uJ_7CCkFm?nxiXFp_V<)haMC{j7I6RG=!Omi7SUUcFnt{V}|Ap=U zn@0a97S0nHu@{KEix-Ju?=BIOt(S?6msbdX-c_O$d5vgu;W{xf_6G5#;3g57e~ai^ z>^333y+eG+$t1#_-X(Ir-XqEe?-N-q9^l^r4~c@iWC?U9rH$gWM6Z8;b z&SQdn`Gk1(%}c}veS|4ZB*M-~#LUl6iQFPTAqE5Z+;~RJ{NXu~<9tEnBxe!tn!O|< z=~qP5v)9CE@eL7j^evG#=^c^wC7X!)oI`vMyeAg+`ap>I<@b}FpqKm!}IkgLj*s$+J@N*$C|4b1Pu{cO%EhIp2G62Dz5ERiQINBM3 zoLUq(nO+RM_lAI|E5$*^mJ(oJ%O60Itt7}#F9mXAOM`+VWx$t$vLINw90*=54|38f zfH%P(!I_MoK;vLVkP}u3*hg0e(?3=L88@qfR8=)FWJh%{FQ*15Y*-UC42FX5*|h-v z+yXfi4MKwqD7m*bxEPd!xlt_eW+?zX$AO2l>VSfibwO0H9+<4F555E&08OwVa87On z2s{I2a$XY<{;4U*%~gUq_>X(yRx=P0)g0s=Zvk#bw* zn!M-^o=5cno<2SCKK24}!QP-?Y9Elfy)STN^aBxT{Xt>g0APMK5Ip}h2!z1F;7iUB zaK<+jl&L-pocuBzI4X|-CFqghx_cB@`hGNc%!~ma^2UPbuyH{4dOUcrbpmL)eIg*! zCxH`JCxhgYQvmy5D%f*k8gRd#4mx+A0m_V?363v_0KvRjpoM2P(6*lgCfMiVI_81& z;CzsCegSY@TnI99BEf;+BCxdWVi3A?33$6Z3Y`3~6eNs_2E!W1fLdQ-!Pnc%fUs^k zs6KZEDD!9~IJILH7+Y>N$o+8*pu^XKx6RgpWw+J?qWA{T(-#L;mx~9D@MQ#ptQv6s zCoP!XNe9L>&;zo%0i3I61d3*fV4x}q)UT2Z@(N90(ajW4|Fans1TCN-!wQz>rh=f! z27-s}z?K8~|k2K@i#C5V$bqF!-W90-pSE6ja!J4D=Xz95gnZ0F{rQ z1YNJ30`{7xLA%{&!0I7qK~l>!ux?2@=s7(D6m&la(x;yXw_9BR3lCfb^s7tY-Pp_E z)UYcc*L@X)MqdNb!Rx?!>jsd1x(PnFy9Hi9y$yPacR=j-OwhRcUGUg@5BP%jLBW{^ zps3&>$jyHQjw}$s4l=`DfV}NlxZF#y<=iU}6Z;wzy?X-+L*9bm;&aKjoEy!LYKB{8SDWy)O^#VHIHal|RB|2Y!NMzEp&xiYmdhs+FM>RRw-Ys|sz- zYH&ejbr=lRfX$}Vgi#kmVQh_Bu>K$!TpB{dU$!&Q+qX7ca6%5}JYylcrhuVo9E{ss z2M%di7w%kM4>r!J50^wWfTh1RgvVnV!4p(t7(Ctt=DlqS`L#+oq=1Jbe9hp;U~{-L z&;sTKTEg2^TESy%Yq)=K8@S_4TUhY*XJ|Xz4#qrg4GbZUd`wZ2Tth$TRiRw9S?fJKIy%oYIq-*7VHam zz3B(Pe(Mh}M-PCW=L4bt!5|p*aWIViGz11+L*Zf1F!&~HIPAP)1Przv31hF0f{w`1 zP`Ez^25*dop~N`o@{fmWGA6)UXC}hf1(RULnaOb7wJ9*qHxD_`Mo{x%)Sd-U-f1B`850R(gNtBBa4`&-ummow z8U+KdmcnFjG~68>18>;_`dfVI5}=D6iTgw zWzMgMkEd;bE5F9UhEL*Q^;Ze7*N++)^<4`SE9zj#&wBWMjR9VLX@pjDB7ByU1g|Yj zh9mcwpm-+*wti!V(Tyxnx^9IvgQ>VZHn@0+9gawFz#FcOaKnmCuvuU;bZpoHU46I0 zueZ0skhk06v7#Mt^}d~O2T7U3>Yb% zgTY$o;i0k@V4duXF!=2f3?F?Nw#vBzefd{m{PkgFd)m`2}t$F7`li)niz2 z`3am}!3%RJA8c}4gg-u(;Pi!0VPLl(ZhjYl*Y(d}QorZ0%IFtRIW`Nna=nCO=e&aB zI=zOUO1^>RzP^RlvhN^~kPVj{$${mF_Yf*Rz^|5%u-u?rsNVSrs>^?d{!w4x^Fev= zbN{c9VDjOiq;Ig9rT|j<@38EZLRfux5iCp&!l$zdQuY{-=W9c9{a%tRmxjm%L5j?A z7b9l|LrCq-;$(6`3DPv~2eL=;lH}?SrN}`YN|U~RWyt4oWl2t1j!cOyPabVhfxK1l zBY9N(iTv`mBH2o+L|%ScnY=DmA$QcON)~jhM!vdNot)UH2D$fiO>$x|l&JW7T*flKqxQ>F{Uc`~!oH}IhU+R)?Hq;|Sob}1f%myU4yCF%K z8j)4KjY)526VhpGN-mkLB(op!WPzg@nHg+Ox`Qo9Q&CGYZ+|QDaj-S{;!YbftVLV$ z=i)z;?ep4^!B6eUqmRQ#$NgW(T7rsnWON{Bd{dJ_CY)?nt0Nh#)rp*7>`Wfd>p~8W z?n(w1cO$13btela_8|2;dXf>by~u~2-ekeRKIGuxeaQ!-`;kX|{mBJ^0p$D0f#maN zgUCxy29v>>L&%yhhLYtM4I}4X8cuHeG=iM|Z6vvl8AWdQjV24fj3KL69ZOD_JC1B2 z8&BqpnLr*}HIY2ocM^$aPbRB-r;tAlm`YywG>ts{d^%}4F@tRUeJ1H29YMy%&mtcr z%_g7hokL#iGnWhz=8;d^&nNls3&>pULb9MRlH68*5xL5@7^mUeQnZdDFJvwytLH?M zCT$G4@Odm5Y`=^ot1c%KVpoud#g*jBm#fGV!PR78?i%vx;kD#}M(fBqS?kHz(i_O& z`8cwK5Km6ECy-x*8nRKkmdwe}k^OV@dLUd=*S2qc$gzfr4Z*Qf4AQd`TfQ zkeR&u+Ct_9tz_+^sbpk38=2>@lXn|A$T{3b^84UTr1)(!Y2UDgd{c8P>B-tgc0IbC zj1BG}&&=IPHk`YQyt8{ZdF=WgGH>c$GP7tOc`R!``91Fdd3nP@a(>T4WZ{9sWH9y! z+57uZvhkN=WHA3Yc{An&nceXuIqSeFGUCi>@Y_?7yr$2U*rHfqnSh>ky zu7~X3_c57Y^n~n-ykz)gA31oFNCy29`EmGDvP-m|e32d?D}_8GhkSTWewy`yRhtjyHDiI zoX_O$oG;{=c6qp;zmf;?@=0&-8(D000r@@TJDGp2knC`xi1fY-lENzjSt9@%bO54) zAc-77gvJmQ%J3CK!F?gf6Hy!mdzV1x@_#^O@=Ky%%Tg%qMQIcSWe_6DqFtxTq0f`b zqou(L=yKSPh>?CmTZD>e_@PP&Xe%RU+bYQOy(+2)t05}6I%4=5NXn{-uG9)e!J=BI zprs78C{Ckx_Zie-M{QIoC`Zl=7Im+rK+7I-$aJ<2y4|NPI`gO=Dmq&qE#24vbw za`GCXS_c}VW!X(ouA?cko>8LDK_1=9YlhZjH%Iib7HAIF5?%APLZ4@}Mwz|apf#J@ zBGs{O7gU(j z71eTfL-j6pN6AG!P~9ax(atTsP}Jq#XwdpT=zH6~XxGJlDB){=RPXHo^q}`ZG%oF*#?pSn59EU3Q9FLAX zn}EW;PekntCZQF}C!>scQ;_g!Dw-KN4LvPA9Zl{%1H~Smi7q{fK%?KzLTTS;qZJ{koV$Do`g zu_(v43>BVUj&iQ9Kn1xg(QVHv^dw_7D*C<#ITx)(1&`LDybdi)FNlD4z>NRN72H+_x>@UWm!h#7ZcH$#z|;YSTdS2+Jv6Pq@bEnW@HLl zkT=7Mf;p*ZT8s^iK4wS93LWV5fsM%f58q2~LhqMsMvs?mK`q#=sP=_zsH=H9+B<3o zdhXqcKJMRzPTO{)u!DQhTM6rFPo<<7c}V)JjHf}ER3n|BKpJ-Ch1i|(Mt2RCn@6lgy>8~@W`1!|f4N6Hrb zi5eBCNCn$gq6QRIrmlrmp}x zO~vFe)W?k4RQ^>tCDvl8+!zHlDacW!v~{SfW$IFeS@o!HG4&}s)qpBHy&*L!s}c2L zbYn`K)r9h7G^OV4R#H!$Jk@h?Gb+Z}ocb2qg0e=nq<)lIQAG)@sqD{fC~q3l%Kv zN;!viquR%Gr?R4YP$wSuq<;PS|JU-psB>?6Q)A}zp~8;$rIwKWsIXvvYSq#KRLeI5 zsrIfxRPPRhDcjT`)GO6cDr4y|>f_$wRI@U_Z5&5NP{ikv)Pl#OsNv^FQ^Ch$sKTPL zRQmpLRBY6Es-t59^)6>3mEL|5)joeR^|9v^YFgn`>g>vCRDSk!N_;khIv+ceGChu< zE?%8QId{#b(i7%T2X@S*24>8oVn@%Xin10^SrH4VZ&xEJZ{Z?peecE8^Af*r!|&ru zD5+W$<%LVBTiv6n?fEfO7h5b<^ZPQYh+0ln|G0t*v#+Esk61;yUaY3xQfsIRzO_^f z$2!WlWo}_B8aUy2CB7ar26D1 zQY{OTs6!u;sk}2LD*j>$71Wri&Z!nExyVX=yOm0Pe{Q2P^XycP+(8i=H&S`CH&KoM zQtjV_n<@MqF18ihhHb}oU^}s0*luhOwinxn?Z*ya2eCugVeANY6g!3;$4+1;u~XP- z>>73*yMf)rZeh2vJ6I-m7rTeu#~xr0u}7GI zIWZUJ#yr?#>bL<6{g}uaHVXv__*jwx!mW}0L@39ZqM=Tfn zgnh=oV0qYAEFb%Z6=2`7LaYc2VnnfE5MU4^F@#ZAF)Rctj+MZEz)E7Ju+mr=tSnXz zE00yce#CylDq@we%2*YwDpn1vj@7_wVxd?qOoq`IgVo057>g+|4y%LJ#p+@8u?AQ} ztP$22Yl1b!lo*dS!RNpY#=rW8;lLXhGN68;n)alBsK~gjg7&^V&ky!*aU1M zHVK=IO~IyO)3E8-3~VMAfz85ZV{@>%*gR}Lwg6j*MPiGv#n=)o3R{XrV=-7PwhUX2 zt-w}dtFYDB8f-1L4qK0Hz~ZoYECJJCT1IKRRxA~>VRp=c zZNxTVo3Sm}R%{!#9ovEJ#CBo3u|3#cY#+8CJAfU;4q=C}BiK>w7xft|!oVW+V( z*jX$MOUE*>bJ%(80(KF*gk8q2U{|qg*mdj%b`!gW-Nx=VFKpF zT$mg4V2`mUm>2V5A|_!^F+Uc-o?*|i7g!ed5_^Tc#@=9Wv3FQDmV>>=K42fQT>E~qea8y1A}ojzA^81|L5#!@Mq$OU5Ue;>0{a0giIu`iV`Z?iSUIdb zRss7F`w6RvRl+J`Rj{g9HLN;T1FMOJVzn?CMq>M(FP&K{^h*?T{AWeDGD~ieb5+d zf;GjIA;DN4r#Hj#=2#2t@7v!pBJbK zJ2Cd}t|G?|7{k|*FCj(|J@80(1Tl+P`Ulsr|Ng3V=dahT|NV99`v?hN1Ama1Nh~Jt z4GZz;_$mV5a*kL_tRvRr@oap993qiOB9aLck%GsoHxpa%HTBzw?ZggZC%(4+9MKzJ z9lr_BEszm3!Qh!Fa-t$pjHpc1A?gzKi26hWq6F~+QJrW)G$pDLJkbo#9BDxmCt4A$ zi8e%AJTu}aqCFl5R|y@2Zp0x%EgUAMb(j`DCOll|D0C7=6P<-FLRaBkc=zybLU*B0 zcn@K*x~I@f=q>aS`U?Go{=xuZpfE@nEDRBb3d4lq!U$ocFiIFLj1k5P2*335$g#LX@ynh!$dmSYes4 zTv#Ej6jlkVg*C!jVV$sE*dW9SQQ`4If}jz!f=r7On_ag=@lf;f8QixFy^c?g*K}UE!W^Uw9xq6dnnJ;1pbfTkr^vg(ren z@Cl+I2~P#T5D=aT&xIF4mhe(|CA=2i2ycaVLbi}2yca$QAB9}ulki#iBIF5Qg?!PWon4$=o!y+>ojsgAoxPmBoqe2ro&B8sodcW$or9c% zokN^Mox_~Nogoe|Di&e_g6 z&biKc&iT#-&V|lM=OX7~=bujUCBOds`*+Y^m!tl0{ZePNGsYR~T;^QvT;W{lT;*Kt zT;p8pT<2Wx+~AD+hcfZMr6f2tPOVet)H@B%cvpf;p<$(7AY zQP(loan}jgN!KaYY1bLoSy!4X-Id`w=Q{7Y;JWC#;kxO%<+|;< zw4$P zcIEt<~HDI{v2EWTM9v}aIbW)a<6u;aj$i+!|Cg>4emI1ynC!_oNBykf@-2_l4`PQ zifXEAnrgaghH9oNLN!Y@TQx^T5OY=YRP$8}R0~y+szs^)d*`!EJP_R2@`m zRk*67s*|d-s*9?ts++32s)wqls+X#_s*kF#D$(6f)n7G0HBdE3HCQ!7mE=x#o7^dG z^RMl@qVl;#x8#26_PYb_XYS|j7w#b&ZL>Z0nB>ayyp>YD1h>W1p3 z>Xz!Z>W(T?bysyybzk*B^-%Rlh2I=1++`|{>apsH%B%9JM3tmkrdqCAp<1b0rCP08 zt6Ha8uiBuBQ^l(iR2r35rBmru29;5js7g{Lt4yjCm04v`Syibjo64?os5at#U!!{C ze(Qec&UWXx-@8A!Ke}_>pWL5u`@XpI++W@K?r-h__jh-py9jT*gGcQN_jL4h@^toe z@pScc^K|$0@bvWb^7Quf@$~id^Yr%&@C@_}@(lJ2@eK70^9=Wl@Qn0~@{IP3@%-gz z{xuxy8Rr@Anc$h|ndF)5nc|u1ndX`9ncDO&1drZHEDIW8m+hXxpJ*gg>$L?`>HhMOBHhZ>swtBXCwtIGXc6xSsc6;`C_Imbt z_InO^4tfrG4ttJxj(U#$TKc%>gy*E^l;^bPjOVN;?boz)PsX2X{_8&edoiC!^hlnk z9=|8xdFFZkFPHmEeJ?y&o|m3i|Fqm|&zt`+&$uUlsqr7ft=?_k?cN>Uo!(vE-QGRk zz21G^{oVuKgWf~l!`>s_Vc|!;$GpeA-NH|JmxiD8jt!p^e#(2=J1%@~_!;k6Z=`yW zI?bEz&G5#A$A+Ktp7&nxUi4n_UiMz`UiA{hJoPnic6d(sb?*)DP46x5ZSNg#rgwVy zUGF{bM&iErf%l>Jkyr3Ky)LgC=l}axXWzf2bn$idb@O%i_3-ud_44)h_3`!f_4D=j z4e$;04e|~44e<^24f756jqr{1jq;85jq#23jl*RleT#gHeM@{%zNNlsUyLu-x6HR3 zr$7DkhIaUN`gZwxh41$5@$L2P^X>N?@E!CW@*Vaa@g4OY^Bwn{@SXIX@}2gb@kNB6 z^`-gJeHp%UzVp5dzKgy~zRSK@;a7ZDeb;=~eK&kJeYbqKeRq6w)tSD#zI(p=z6ZXC zzDGX6=k&RJZlA~Z_|N`q zQ|u-77W;^QyS3jheF*;;{ysc6e5^Q594}4~CyJBA$>J1osyI!YF3u2ViV@;0ake-| zoQo%m%oi7k3&lurk+@h~B1VZz#b_}`j1`xO%f%JqN^zCAT3jQp71xRD#SLPd7%wJ> z8c{3iM7?MbjbfshBqoa{F-0_s7SSrEiZ;e2{w#hG^Te-WzW7Zn5WkCs zViEq8-9b`I;ZjGblhj%2B6XFzNh8$Vr5;jGsh8AS>Lc})`bqtz0n$KekTh885k6c! zL>ej$lZH!^!z05-NciD$>QU-Z(r9UnG*%iXjh7}!6QxPgWNC^tRhlMEmu5&ar3h)3 zG+UY@&6Va!Q`A${^Q8sSB=uzVLMc*OBrTSfNKw*KDO!q=Vx?u$a%qLMQd%XgmexpX zrFGJJX@e9e#Y+j2M$$?;NiP|s9%`eMC?!eBl1WOD%#ua2N~w}fvP%wWqqIrdENzjt zO53FE(hg~-v`gA8?UD9M`=tHS0qLN0NIEPXk&a5oq~p>F>7;Z@IxU@%&Pr)gx|AWE zlg>*Qq>Iue>9TZ1x+-0hu1hzho6;@mwsc3zl7n#U5+tYOlH8IcAm@9W)>Hl0QXl><&qpcu?^6CP@25Yf&i2po&-Ksq&-X9z zFZ4(H7x@?am-wUnOa0OQ7=NsPnSZ%|g@2`gm4CH=jeo6woqxT5gFnt6?@#b+{93=x zulF1LMt`C|$)D^u`BVI6zr}C$r}}MvyWip8=-=eu?BC+w>fh$y?%(0x>EGqw?cd|y z>)+?!??2!_=s)B?>_6f^>ObZ`?myu_=|AN^?LXr`>reBi`!oFK{OA1_{1^R~{FnV# z{8#*#E@u_51vyU-Cco z`~3m`Gyik{3xAgXrT>-xwf~L(t^b`r+n?iq@BiTc=+E_k@_+V!@#p!!`t$wY{QuTR zfBLypeL@|rKB?{(=pPsm7#J877#tW97#fIC4+{(roKnZCM+8O&o~jS2M+HU)0_ub6 zF@doGzxuE`TRko?KJZFCAuuuUOnp@SUOg!=Iq*h3B``JcLVZL%EigUsTAibw5ttcx zu0E!Y2+Rt+Rew;=4$KK;sgJAY2Id9cspkh41U{-41|kEC0*eDn0#Sjbf#|?Xbxa^O zuq?1Vup+QBuqv=RuqLoJur9DZuptl^hz}$LGy!cu7tjX`0b?LBkQ7J`m;xyQbHEa? z22umIfIZ*{Yz%A)Yz}M*Yz=G+Y!B=R><;V+><#P-><=6W91I)^91a`_91R=` z91olboD7@_oDQ4`oDHM}(gPWR|A&$H;EH02+J*UPS10G(J=2pwNs5XI%pw>t2UG+R zQ80^&d3r)mPv{vlWDA&wN_Q_{p@G&s;<;EZQwJpOgxjw zBr`%Ll}Ts*8MS|;m-3?gZsuO*e&#{uVdhb0C^MXSoEgbH$&6;kGEXzlGS4#^`3w1r zOeT}f$^P?1_`Q`~ zmR+7*kzJW>%C5>bXIrwXvum_VIjeYr!q!?`25va+MOW4YtG6OhWvPUiY^r*fxrXL19%v$=D*^SKMTi@8g= z%eg>~%>{FzTsRlWak*%Y&&6`_Tq2ju3Aq$})440TtGR2r>$w}bo4H%L!QAcKo!s5r zz1;oWgWSX1qufw#IQKX=l6#UH&5h-r=APxA=U(J8xoj?%%jXI?F;_&Km&mVjuXAs5 zZ%L2J%HE-VpZk#enERCboEy)5A^6wax7_#KkKE7PuiS5m`S02INB)zWlAoHF<>h%r zUYS?r)p<=`o7d&_c|+cqH|5QFOWvBdp zT7G)IGGCRi&e!B?^E2`@^L6=I`Pun7`TG3a{Ji}9{DS<#d_%qwUW@XJ^Gote^ULzf z^DFWz^G*3x`R05}esz8gtpDf#$YoPxZu#N7SMHPh<(2Y<@+x_Qe5y<)n<|&dtL2UI zS@IR~>GB2gBl)BGWBKFx6Zw<*gR=hosr>2u8L40YJmr6-f&AJ0x%~P3h5W_*rTpdp z2U{g?maFA0a*ceo+#+8ix60Sb*U5Q#t2`!OFOSPN$P@C7@}zvTT##>(r{r7ZY56w! z75R4gRrwD2HF=x-x}1{ll;4o=lHZi?mfw=M%lF7Tj|yhnaV z{z%>{zbhY-_sQ?chvkRlhvi4)N9D)lHu-V6U4BCDkoU_^$xqAA$b<5boR){>kL4qB zr92`Z{7=t0Syc8!J}NIgt4h`^Q_EUp8rf=@MYcv}m93Snlku`vSxmNG7ME?1C1e|A zN!ezZAlo8K$+pVUvTd>}vhA{~vK_K(vNqXu8712(yCK^pyD8f(yCrLv?U8lJI%Ruh z-LgU11KEDrZP`OvkL-@@k*rsCS2iT;liiaI%MQs7%Z|v7%8towvg0zl?1aoA>zAF9 zotB-E1!W-_Eep#Y%SL2MSwwbU=8`e8q5N?EaegGPkU3>fWTV)9WBI4~XZh#(7x_#+ zo6qI*`9faI7xORkukx?+Z}M;Rv*qvd@ADt>AM>B`pY!ASFZr+eZ~5=}ANim8U-{qp zKlv$zsfGW}`ahbiATKBi%7Ut(E@%qcg07%17z)OMsbDTx3f6+HU@tfdRDmuy3$6lF za2GrUZ^2ja7s?A2g=vN9g~~!zp}J60s4dJW%q-LuW))@^<`n7+a|`nd^9u|9*On*x zu&~fjXe=x$EG{f5EG;Z6EHA7mtSmH5daWun7g`Fd3u_8%3+oE4h4qCEg^h(xh0TR6 zg{_5ch3$nMg|@=Z!mh&ZLVICPp`*}Q*jwl->??E^_7{2z2MPxZy@kHQp~B(9k;2i! zvBL4fiNeW3f8kW&G+L<;r-{?WO0i0;7Hh;>afUcktP^L6v&A`Ly*O8#C(aiahzrFA zu~A$kE*6)FOT}g4a&d*YQfv}eiOph*h`*61t`*mbt>SudgSb)LByJYBh+D;N;&yR| z*e322cZs{jc5#o`A$E#;#V&E5*e&iCd&C3cL9tit6Ay`p#UtWT@tAmAJRzPG`^8h@ zY4MCWAf6S^iRZ-&;zjY2cv%dHtQZtSVpxoboEQ~(F($^vgqRcsF(szOE8I^kiG$*8@s4;`yeHllABYddN8;ak9}v{z#HZpj@wxay%!pYrC+5Y1 zD2he#rT9vGExr-oitoht;s^1g_(}XMj*DN!ui`iHyZA%=DgF|Fi+{u^#i>PEQC?IO zl|@xiUDOn{MO{%}G!%_RQ_)&MDRx=N9J`=NA_g7Zw|ejm1U9#lQ)x|Z%wZ(PC*5dl&hT_KJrsC$}mg3gpw&M2Uj$&JJXK`0?cd@;= zr`S>KEbc9KA;J{JE!~uWN-;Gc3*aWKxTldRdnu7 zGCk#xIAvv2fS!~~wz9IQuB@y>>kPOgoSC%G)wlyZA{fxGvN9ue7RM6E~b{*Pj z)a<~VKz*Q!x~rNSs3tut+2#eNQ|A=(0}BG3h92W;?H6;ib|Hz`5NHf6g0wggLH{eM zVf69;J1q$u(bQ5);j=7oRkJ*xwXX<#R?eh0npXzGx(a&}EUS>415b^mNPmp8sFuKL zAZr3^16Nds)X$WSioAYZpk3J-n5&vY)lusMF-;9sPwi67pk`AW0vo|DE89fMl2lf< zgxU;k3-Z>$a%w5H4N@cex=Z)MvOTaP&=%MkSVT>;?+WY=Tms%6*c0e5bp$#CD=-T4 zsl9=Dlv3Ljh@18W7Es-REvC8D{=hQWR#H8IM(RLdAr*$-e(k|PZ{W3+A!~4=?Z4$> zup21WmLcQaM|!u}wA^tB(qZHyfun(Af#U(a?nK~Zz@nb1P22ker(ii9*kvtOo(T*D z)={gdvw^kLYU&*DCNe{NjLoRmP%YH?zzNJk(sm(mSaC6+)wNRV3FB`MO7)nsow@|y z%YoprhPtfmDaymtGa~m<&jWXH*2pxw zO$j{vk;zeVk-c`5dI4T0kPV!ma>S#oEKh1&0s>;77)Y3223`e@!S6Njedd1Uaq3Or zE#!BB_kjZY=%9Eirs*^u@=M(!ePEe4!Ntdc!Xsn}ARYW6av zVJ}cxc8yWT>Iqg>c8Lm52FOO%gz_8}q|C&^QWkbGV&Y_leoYgmB9x6aVl~-W2TQRb zv_P{?*2OZgyOHbhBs>+RVw8v7ZuPPpQ4s7(W~08xJvC;U85+S z*<8=|;8eR#&1G*;^WZ<9U4T-jDJ$c!mdnZ(Lc_{JtXou-vH{vzxAg?oo@_#q3svf}Efase{HP>;vkRdMW#e>aG}~wwZ>( zdQ6Q_E3M1eBs@#$35mYUxSV}Ttzbu~8v7WK#p-9&bLs^(rdvt+mZ!2*j>=G1%>_zn z`K4|Gx(d0OEm9)YLO82YKC!-}R$&FKVP7H2cZb}T$9h={%R07|U5|PLyNJf0X%Uat z)SB91<0i;&sON^w1lz*q)f+LdZ>jy5uXogYYAf&$RKH~#yPe&^exzPo+SoyJ-rPmr zKbLf$(2`ldlikJ2O`oaV>;*-Ystc_?(vOp8%ODO`iN2lP!+xQ@QXT9CT_!&bE4~wNtZmez`h9FS`xDZBHmMv`*Xe#yyl!0AGa088Yl-bQbpVI~ zF%PoawSTD7mNV$(6g=@nlF_|vr=^cQ1lD0TtvSLr+o#e;*<rhp zB(IaKQMcA0ryr`6w2FR?C+lZVv8M^EtV|1*hCTyrfPIK@I}7Q(Mo+J`oP%_p)k#r| zw1K|Bu5w&tFR_=|0BkJ#Rbe95x#}J=mbJzp8)D6L7}j~pN^Qz+p{-z?@JHA->{i@n z)OMOk4&$F$Sv>2xJp9cCZ1BWyLKTDpdQ0^2C^40^kQ zQH-&)eJ1^sea2q4JZE39bw&f8Zx&rgXTZs_IX2I}aTHjQEkd77zhvjouh@FTdJP@t zHhsrrSF~#1uy5IS><9BaTB~@^>M@G*=>@dP_*Aiw-mdz5wbEPl+Mq7Dp4JBquo#2aaBiB2pBd#{^#-skL?2fl zHha|fmGgApRXbExg4u%h;9-*^ctokk+88%e!E;zSn`k#yW4(DvKmPjof`edpBg#_qbDMwCX401jD}wvzX~FB7J#+`Xm!1w= zC9ziptAkze=+GrGdO2Gsy_^1mDDA+^x|(1uSPRTEf|Tj4)=tKEW^g}U2XuhEr~kJ7 z?|N3SmpsXAu;w7w2j>P4s^57_c;&x`O+N-W}W@>4rYwR_(tb~ z*UX>je6Y!02!5o+;Ags6iWYnoe2w}|@NMv2u*>>B_yO8S;`0gR=ioH+c_CHO&V z=_|4QZEXcviQj;I5B>=L4E_p!0q-~TUy47$AM`l=ot_fH*9&A>NRD#0QGpWoAn+J3^G`&;nR6BLhJjAAQdPBaDKU5y72pOEy zLeoPg*o?@fWOm-CDnnIfxuPmm9XhV832C&o@O!VC5tCD+Xj z{m{n9{+Sn=58Ue9g||;x**3fhY|d)yg3!Xypv_KNXb4eGhqEyhu`CMFKs30KE)G3c z6)@gQLJSZW^3u?);kwC=Mt&kcoEhS#U;X7=xlJ#cU}%P zPDa5FF$6+vsHk3P34*i48A2HjMNo3Y2j9I&%}biv6br>ev>_4dH+;ZZ*QZQ|gitEf z4Y^5^4qXWqwDZu{tD$S5#m=S9>!BNxr!+8S1JXNe8G3OOwxhONp~2AY&~nnN3Y_$J zLU)NzKlz=153#E@tJCWER$`G6*{%By`A29Q z*jtT1Az#5equuf=^c(V@&<^L6@OJ0aFzb+o+nl?cJDu_{>`p~^w{s7ClwlS04reE6 z4POJGtx%e9CiUp|I%jDHj14Lcuu|#*XPj++^O7d zs1Daa3pi_0&Ir#8@0aG1b$-+JS`7bsC&YwyI1!;E`O)-QF&bVio%64?XN>Qh9PSZg;rEE+!@a_oU|^!XLwJ zicjJD#?RsLaII#s`JHv0@=N%;bA$RT7~cr1Mg7b9JzO;Xa6Z+n(NfxvYEvT?PCe-?vbZ!6D=apbHgX!PRtKxyrAKLq7$d7{O_0oyw>k^) zvPNvE9WJk>PJc_YPRp9EC{p@OYKp|hoT+I@yRepy8j5H)=y1AZcE)uMd(;KXsMM-G z;)uxX6k^TBDEzeX4m#qDY}NK+&Rr2E;wG(mT%L&6HEQxks>mGqBL0YvwB&b{M=B!I zBGU=4^gREh%19N^YUFalt%+z=jI|be1=0Uu;vE8XW~44MUok5(8#2CjgTvaRiaC+# zt_PD}Ev8xPBTB>E$h=6EtJqp%VuTzmhO|$hhv^~%|T^%TKo?)iXL|KPv3HutcR61>5yTZ5+*mc{5$VJ$9VlOF;D{z)xf@V|HArk(?(sUVG zDRsLpY6Fsdz{NreMnaJ^+7Cy1T>D)I5o;e}L?WETLeI!eAWC#OBHMI)q+HX2KExsd z`WTP&x;Xng>DGlA(kH+@OnQ3A)#viT=LobUP$5zWzoXDnku-^T+;vTVC34Jlm1x%@ z*HPbytj5_eras|nGM*%H@XG}Ft;k^HcH~avF64X2_1Z0paz(%E6gbBfkJYDLz2-9p zzm?XVaovx!;Y7TwFq6||3%Lcp(LR6|-og86A?G3&T^C&WNFj2{E=G!xS>(Qm-ns&=myt`ZSCKQ0X^x=A>&1 zWuZPswke;R1$a)^g$QAH^ zM1DrDx_(8jxqe6HkY~H@3abA^?kaDpKdAJOuoU23W1=EL&esX!&To14Sc1AXbL zP%89&k0 z!cJbtHJd+?7_Hn5)i2i^<(U18Yo75Zu=R*C70>t$@&?EoNz_vOKg6RX;jHJTGL%)% zlw=LFncKo`<+$+N&?l8AN?PiW}H+5Cy+?{CS zD0htO);C)FY?X}Nah&s!9-QD5mTAmM5+8Rx)TcPVdOA~OJk6cq2Dr1ta*jKXdNH1> zg1Nv|5zlJoBG+xd#62=z=KRbvQ#s>h0$eTD3Jb2*F=z7LG0}d&zJRG^&a3AzL9ULO z#e}%|_IhSM6XqhMjoD0#mE-1;*fW_Zcg5CW=3$9(3z-IHx+=~!G6^op3ET`O#ie1n z!kx3G6jvc#PUO|f6UULnW zH(VF9hk48GBhm2nh`e2KbHhx&0$OWhnQ~W z2s6%o;XabxUK)k3QcDvf@{Rk>{osBA`^Ej{j=}#Aca)hD#hydPSMR7CwSvetv~wJc zlgtSwg^@Z1`3%#~3^1pevy2iPRa8xwn&>&^JW~OFx%~puggU4g(;P5dWG*q%DE(aA>*yK13ZK$89 zHY=ixJ?e;3(CFwjgSYAwnAa7~=m!lCUssfgx}z^uo@lei3(f)cUVDjnm9chMyegD@=yS)zO-0 zZFEMo+HjS*&fH=wsvAs=b_?0tPnfk>n=2=MO6}q8g0^RpmX4V2P4;6Q+OGq;T{kN_ z8}&2Goai0qxyELwkIp6RVQ}X~4{Gl-Bg_M4lo^7qumw%?qj#BJ+ij-8G@^UNEQl_Q z4l)X}$J!A6t$WD4AgwPlMWkoUqUaX$;%JW9Z@M`7&RG&& z8hvEQ!#<>Z!7Pg|Cq22O$}k)3E21l-V@wl4Rz*j!3z~`Cf^v1Vg}j$0S~@!!Z$f|0 zG@I5$*G9MDHn9%uFaPRWYjiz{vLV`v_xr}^F>8@=z<*P8b975|D{R|{{eW$IbVqcB zLuA^bFPQ>*xHGydx;r`rGjMB*NfR_H%6Msq%KcXL{q|~3# zgh*uE$D`$l{tG@43HiowkfO*RrJ3TRvFHQsPiBf6J0+TkuKd?8kBNvAr5twbsHi|9 z4Z&OIPC-sb749pj^=^&(DzV{S2JSV;*O6}^-;CahDuHR;gVEd2uNb!BB)${93%QhJ z?t4)ciH~!c%**{~pZNi?ZYKH!Z=!riaD)31>Y?ax^l@}VigO)L`y@IV9g98%@+@k0 zKS%vSvKrCC9cj&FfSIHgv(X$h3$$^pxObL3w1VVQYH=avQ-ofOGLpwcKVC*(MPEn9 zY&1{@vAl`CjjC<$z_qzY9Pd$oK>iqAYIM3kLHZnZf%n`p9-U@fg!!6}wVpP9f#q+q z!cMu}?yu2r(eJ>GmT5qKM13gz$UmdMqQ9emqFow0v?=^l-ix~2E#tBJ_zK7#3zWKhv!ThWC)$fO?Mmi^IszcAE%h z=I4{B7T(I+2m)f6U6LF;1&KzkcRNwK__^+RZiaUgyN6%sUI1?|(R_T9wZYv8-On$> zo3EUpi`WH~a<#F6HzMK&_Z?j$^o{OC zd^1+mVt&v*#j=Et!>g1wxqlfqXqNJajjedXW&Cn}1z*B9qn(@NnGYG(W1X%9y3O6h zZ*gyT4{Eo1P^>=pTMb7+#YRSkJe+H^6rzzX@e2ZRYz-`w#=)E%>ec9!Q<;F84MbJHqrwxt;HJ zZ!PUy)y$hVbsn5NeKj=QL>Q}Y%d-x9ikb9c4lkawj>b-my zzmM|$CMZOOR!(&13b&GMo-SV&l8@~bk2PTr%{j( z@nQZX&dCVRnK*DuX_n!I?xOpGJIeEXjK2(zIDZLc8W9pa&OzK#3C z=bS#pmuykD4C9gJIbacY$bE$my07xrcosU&1^snCOr#q;RtkR$*P7!Wx^=o$cAx5qWruax-KZQQ7JO|% zo#!{13;cBb6F05c>we}I`6JpQzY1ekN-z1Rc(TQc3ux;VUqW8@ z@NfAS+IO(OM_z3D!1pRX@}Kx&&1arf%_sf5YkJ|nEk%7!+8-rlDJJfq=5hWD|CPUL z&%3|zqA}|(xSMP%${l<(X*w>tJxr-{8(9#ws?Xk)q< z-r~p$$k|{w$FM>_x$ju-seULv{A(qZBK$jL%m#SfFm%Ds2&t4zv2nKMv$2 zW{r(mDfJ7hEoO(!5u;*s?1$SKdyG@El=katFmA5cnCcmxh>3l3KQy1jecSOeK%TVvZu zzjoO#Ikv}k#M+2fYd66cWA6EC+6lzs*%jLz`)zP|1l0kZ(bFE=6JtCbgxeY0i~5ae zu5G$yHs)y}P4`rIDiPy{&4#iHc^Zj0VV&pcg3rF#QG0i62Jro{H&`t_!0Mp|$y?w6 ziGGljxRb{oNweA~A^5Iit@8+2L5G0M_2_MfV=wFrJo6FZsdl+_r{PHKXzW<*IIMF# zCt|Zaz4nu_I>kHNX;XjfRP1!@ymhwcGDg4FGt*P!ITIU*1+5jTg`TsqbFl``RMLyT z&x0>QXLZ<}WWk$0hN^Q2=}fL)Dk^;|=J9l4aYz~;ddUN+o_ZT8%Z z-HL7W48j(Y&S8wU$E4{dac%>@6WinI^z8K9g}e!zYR$daCRp#sc6hpM4`P+-c29@r zp%nd5?1}oLqMnT4da(8)55YDZTkGiYJdPdp3@T?BM}Tm;C$Uk<3oFDk7CYiO=sE0p z8haMofHNPrXjoswGO;XS<|9yFU*7If@c#sL8n5K#pNh* zzLOFsT098uI)^H*j%y?=m+K6+v8(K-s6ZLm&jFa;R->LOQj}hK4VSj`f-yDBI?jCsS z1K9%pR??qs@$IC>diK1AWk>uS$~ItcQJ2zA$h#y?N#9N6c9eVK9YlWb>6Gky<6ZHs z>V0ua)gAxf`A8zLnCtzpf0E+$NZfJHXCMdS2jjgG(uewxB;!kGe4pY-{Am1;{wE?F ziytSJIgT$LgKdrBfb^WD9+lFG_(|CN<397L_)NUfPeVHs|ArQlc;^npTa0Jp-#tFZ zSI;Shha06tB!1Bdj>e2J>3<;lJrM z*_Q_RCgNsqGR`Ok!pE~2JxZ&0jUuJgc`e?0JdabGf=%Pqd((vTRvExr{%yGe?P~m5 z{CfOG{E_`;T&uhlPobXzP~pg)Owy`z%15%Dz2E9W88+vDT~OuYZtr|;0rD@hmapo!NNf7v zz51WB2!6G<5^-K)%!~1t&|e|@z0EzYgXVas3FV`@sIHe@27aJx6b=HJ|2IJv7X^IBmV!Ez98Ow z;=6;KC<^rFYrG!FxA+3@chcHI;}6t7sR_Ij9V?;9AjuPpyo!V}aagZ{*6dX$=EAbXt4XZ(8Xb+0*LbxFU1E`{$-7If zPrOtc5=z}t?=0^M?+)!M5)-$1_?D6>(T)+FVxOVnwX?l#lefDGYX{ycmC~)O)tfbM z#A(#&H7DA_QY;5 zH%WcKndEgOD8ix>&cu4X3-S){9xsF1o$w^Q2_Gb@!JlxDUVO4`^_C|p5*tW_X^H8? z7r&@Yl|`6m9i zutK}NGl`ru7%+3kymip#k+*jv_WUej+ehNfPRvOhfK;F8_0AkgBs{o+6so#^o*Pb8wt88u{klvw9&W)+SbIj#DMplcRR7{ zK)HbQxh=61@`TN; zGm_X3)?L`sh|mMMlnx{~?@oQ#t0Xft>est-dpHBn@DryUMl_Gl1upc4suf!@JLM7mSDA`-WJ;0s9MR54_Im5;L9{ftE-l6Rq$O5~Cy* zZWi8DVhHju@?+#Q;*6nwf?P^>O3#tVLVM(61(Xk!9>D(lo%pfJ2}To{TWU? zmVEFg@Qx&&OltU2sv3nhmZ;K=lXX+#KTSLXwm@1BGwoshbK>zr@_Xsc5NU08+@b8H)-XDpdiC?gM2L3zohj7LxId930rWE0a*Mu?r4$G7zZcj-+ zIU!4yyfj{TKfxkLRwR{473zuf4otPAt)9H|X(U9O{N??PsP%eXQlFga!|z(OV}R92 z7;9@~J`5?os9dS0yo5bh)_DL2&+nwB>Jc<># zz_$?g9^h7T8(A{RZXnWuBx7v!Erz_vcMz;z5}^;}QeY$K`!d2ilsueVXg!h~#695& zIrH%+B*_)NmA>V~evJ5mO-67;yZ>LS|9J8Qv99v{u{QZmCi|21=7;uElE-P(XOaUb z&l04?cMkP=BA1@_Lh>S!*Z7)!my(wuTePcvYkh%aH~NA%7m#(nP3T218A`7A37Xrc zFffH_1F%SvgWT$iCQas1a*FWD7?5~!vyYMbm`Lt6_DFBAQp8e9Cb#;w_yjOh$fcA{ zZu4D{WV~~e*OJ$hH;7(EPVAe>Tgf)xU~-4=cJdDJyUBaWoxc0Y3UV&Bqc6LByL}Im z*DZT|52ZMdl0%S&lXLWslOxI1IH7)Hm7XQ1(-T-m32zML(`3=`Ecu-1c%!1uB(upJ z>O8>;Ns-igV=?&>(kr5s`u$zI7j3_W{s#Fi@;=|YWGArq$!?T;$tZkCeuSmNx8K)k z`;`2g^cuQ+<3O+?d|yc211?T_BICD2@-XyH-FN5*Asz7jNdAQUE6I|0)#g6JKSavk z$z!PhB#-!}2vY@_fb&_ntW*d}K?Qk4trm{^UMY@(^VO^Y@=wzKM=RkvLH{4jgH>P< z`h6$hZ4^%VPWnuOS+EGFeOAFH*o8Abn|(;%XYCBx z7x2{xwZeL`wpQ1c+WaR);WI;+3GQa}tWKCE%!V8RYLNEV9HCyAE6fA>H_aCo2n(S% zAjf>XuTfYe#C?kiV~LRPEftmt%Y_w0Unw*Rtag>qOtcnK;#)83HOLyYxmLpdM#nx9 zT7@Kfu%1{1-v&}|6jH!SX%qC#!WN+tW4=|`CZvH|?N@x;fyXsheLI9}zBXYe@w)EY zCEW1c^4$byH<0`KLEml2?ZO_RgD^T#-T`vYch`5{x0hfO?L727@I8VBp7t(b2vXj* zPv{mLxPMh6A4TtneVvN^LJz!n#R1`wnoUT}|JfN;2`{|Id zTv0_I795I2$|t@f!cpOvaGbPxLKp@Ax$mUVFFf--^(}XwR*m^i3ELc}g-xn6;5;EG z%>bm6s*LZ2Z@yuj`K)kG_@g;5?8Unx>wB-iV96oMZ!4?Lqb?#Be8;sH;A1z6&|djQ z%`bfyg-gO^At10qP`HnI4hgSe!zvQq_})T#?|bJvKw6t;8E`~|3wln73Lktt=_zJi z_y|^9_(Z%)o(W;xmlQrv>bT=d>!)P>?b~Dc>JxTs4zzSp9;?elmEG3 z^uG{HnBfdTvqBDaUMLVvL|GJG3a^CMg4u8N+x&L_8^Pg!E4&jdi29zea5p724dkQn zNud0ni9RlT5xxpe|2K*CUHBnf*8LQI3BLu8-{oige}pNisVS9ok1CDe3G&vErBO(}D#6C-d488;EkizU@g`Z32}@1O6V>$j%n z`E4mX;yO}PicUFG3;eDW1Ko{`^DFfjt9~Jghx3BewY81@MgGM^_JWnho5`12;twLS zKSg7XE?UY{3sn`VX{lxY=_C&RB@XzNkeBZ`35)@C3xP&X*?e5tzBD#Tp~c^0t6%GoGa`{$r+0bZX{kz2_+_{>eM^{?@Vt@Bd7 z1}ny9J~*Yc0QJID1Ik9^MXAN9P5vd2u34rkXJTZQLT>eM@NYznWvTTjOKEv(MQSB1 z6R9b+D%G6Y?BC*VN%`S(ShG5{2G$dJ?UK(P)E%kL)Lu!){m$P-mq?9FppN{==y*SdS2WK2D*dL^_6Yz_7x4 zJar<~?LP^v3-^=$)P54F2W6lCpug9DDs_M$_>MsQu-c%Xk>taYZ6I})Am>n;u};pX zj`-i0kHUH(buo1bXiRy`e>pXv2&Ar}4+bL(ESPH19`}bVp;Q>!Dn$fkDRHEZrcO%H zOPHIS&U`9HY;jWd`xB`ok%ZJKaPKJ-|GH0>yi&wE;6Lq8r>;O&7%te=WVe*8xSyr2 z0lkhKhbO1K0qG_(Zc>wH(HW^1w^Dm)_W3G^8K6cry4a6fImz< zLOGN=FL8&VJx;CByu&ScBsGKV*eH5+L9&Xm0<4cU6_rFhlNPSGD{4xJ0SUw}~(?$K`sV}Lx|7+?S z^isO&|1L>CQa@9_i2NJnpVSrq114;>(J$C1uQr#(<;>0fT+`& z^uXl3TbsTy*+(51`!H|%^iBW!$=~%Q?^}KYY(`{L+MKqao=Da-Yq3GIr}dWG{z1Qk zSnl{KQqyVYB-5sLrJWikJzeQe-}B!kbL2^T)4p_@Wytu-Jo}G**iU zQi^}V@yN6|y(In2zm#C(_GRfG=H-x|`&US;mFbzb7yc$_UdMF%ZQBQY!e0fgnb=#> ztJ4|(nzU0n(ciT|->8G=;ktCz-wJImo@zbeZb)xTuQqH-U$k#d7yR4IThbf#IrOQ= zur<9co%e4itf#siq@IX}KMf>WgJ!3MR$^7}O7E7m_O$5VlkP}=R&}O}{-mnpwU^j_ zsJc+MnqT@~`3DXA((Ul;PQUh7+xAPoC2o%-A3%LD-KOkK_od(XXR2_rr4Ivp=RcA@ znm(3(@8=9@(_8-o(=NOV?yEoekEc(hIqS)EfBF*{*Hh^oYP&UH?wUL+PN&bLKf*RZ z+Blm&hx&Z_LVDc)+24UE7olH5{^Gx!_Fygpg!hd^!}#gg^g67NVEVg%i>lPuAO28! zhcTS~t&OB-SUT-oItq`U;PdGi@h!39=|p>dW3Qwp5I$OuJG80pbe)Vr&}?LxPgHA01>8@kE9228dQ{*11TkcImQ)U zI4emMoNKl!U{lCmsV*N)KU0;gW3Ya<4x65)Ys;UdpQm4>S1L2KT8-86Dg7Ck(Keo5Q2r%7uY7*_*Yvma-10f#e<$pE;#u%VEKD{e*M~=ftA&U+HD#ztexxOUv=i+jv7i<%&$*P`^r=gc)q^h zf6W3UAt9uRib~oh+1?9c!H!*QC}KfH5$xCz8={-CNj3@gF4zlJM3nR1jQRTeKF|A{ z=e%>y+`0F2KljdLc6N4l`IgDL=9m17{fd8z{<$=&sro(5n!?z2cS23EC@bwZ6!I#_7^Kt!{mReMng=*u-3M}- zUZYQkb_w#ymZBG)fVLI>Wqx>v)|dKcf){rCzbEKgeT{#XK3iYsU+$ly*Xe%n2cQO_ zuJniWu#V{w(4+cl$Pfb!*9m>CpVTSPJl^$6c$)p2{UTx%SrTZnu7FhaP5y3|rq?6i7C+~LrZv@{i3%q@SCl1f0O?o?c4#A$g zS+4{+!!ZiK7Vd5oxkVqZ+^To@_W@_GzuVoS7b*{e4(kWx0e?5hZF-mgkiQc&I92Mc zkpHlMhu)^|)Q|e9@?H8xn9<|l-K`%3xkqo;_v$>la{F|@Yd`Se^x^N&59kN=rIt>; z$A3ug0`!!>Ti@timFN8@^pkpz-sc~K-}(&h(^L9s=V|?nepWwFanTR|Np7cRZ!G^} z{o?HPpVu!yFS{#L%U63Z>hEHy*FJs3w$XP{D?|k_s|A2o$zwR$`F8iCxZ|HG<%73~1CS=u7X5Al$HlZi=tpA2T zrPJuy@X|h7Wk8gn*HonS1ZbJkIFg`e^+lGL`zB~ZwlAkssYU`enB9zmN149>0k6VPq8WW`%ASN&9fra$oC1J50Q4*8$! zL*R#h%16KL-{)$ynEt!|hyJ9+V|$^;9eMvtz2Lv^f2HTW2cYj;{s-2bmLmVP{ziYR zzti9AgZ`r3QaRuALI0?a=$k6wP06wYoe&@SpZY)PkNuzZ6>!a7`Jeco1G~}o(*Ff| zedhnFe}lHl^2`2RAJs|U53pKc-pBM8!1G&v>f?aGmk0f~J_N|0GNE^&6+Of98ex;- zAN+6p!$>bOCda45-yv&i9CkIR#qz>k9$88%Uj^+~zcc>B56@@+NB=iyzxX4TYQSf}Zyfcz;_mo}-xL1?o|r|1dB5lO zg4YN2H(;%nf@>VwY4HjFq`?1y^3(szUjyFh@fjfDuNe?K89ZfysexKRS{<|Ev*S4W zb#oA-$f}D^0Zv7rJYWg<<2KL(@wdK8lrb0&#WlA*a2f84sz5mI2>kSkZY=H$R0mvv zNZbvqC}fJoJ%Kh49w+{0EoO$Vdaxe7!0`phI2EVkOq?w-xHuo52A&$!Pmw!4ko3+7 z2ywZU>z)W zE{Jc3`w2LJb@)Poj?%wBwlLlpUld;q(cwS@vi@{nfoLEGnrT}S#{)~_^UIdSm&aG2 zF%p0`#aAMo27OhW3XsskULRN;X9FkTDy;$UR^PU=wTQJY&IdTe5J0X6OoCPphzQ#d zUk?$@@s06u*ef@IR}0jGXESJXp>2cReM@{R%7nxE9`iP!xMGiR2Ou1F&p7U!2l#fd zTjTRV+Yw&?a<#7wke%^e@iTBI?T#<}S8QWoPyD;d`X}?emLH0JraNC9P%zjxt0Zv#*f91$4|tUBl{%8 z^*~)w>gg2dr=gyK3g0B{XXEGM+pErlbs^pxUm3U3Akyh4$rQ%s=J3V;``0 zK%d!CpC@f*Jmk(HD-W^|AB;D-Z^duN+XMRpyMetoa0c?+iHBgNz#dt(2aWNcjBtL9 z--{mz+>aj&JcvJxcSG(+kmq^jPQmzHOsxvJm!o>$aYcLe5mo|ioT z$yU^c;=}P5;F;y<47`N)71Y;=c_{D(wQoUgMR(gfWOoJL$4|k0_5k()ArRsF2-*nL zBWT3OOXL0&KOFdsIA7x3fv=!lhq(?qjs?EOj|M8-#~{adpfKRs_8B zfilqGbeg#1szBOhK>Gp~(5+CLUADw3hrhZK^o!uJCoTo9qWmzzs%s?;zBGaVI#^W+ zrP`Ueg7AKji9j`YZU$}y>O4Bw@qi0#cS3?SG7v}xJP9w@semsr4O#;jeQ=FyK%bsS z2Qq7?@Zh zlE?=Nft9vsVlWU(;E7v-+W`VRcc7o?9->^Uxe$bXsQPYTx}8ki1N44?O3=V~5U8!{ zvNH)ban*Uw$t6PYKd^zfri1{#e~OrR7}#xj6qsg(^8myaiiC<{Ua4#Xoyu^HH7yM-}1nsEzd0+@)8WY1HUj!Bb_A0PA@e(YX zeM#aqv~L1$K`u?4@?D4T6Ym23u+uIBp4ag{Fo5pW#+7dex zyAq!QUjvi9yA#9CJ&C*J?TIDjdw~VtH4`3d*0DeFCD4($P<0@25TQj6ym?l2{>%D< z!Pz=dSv?k*;k)hb0`EB+tjb__LiJ36Ycwf18aSNz7C4gl9ypq~RbFR1?mY&q&{Dz*yDX=F3Q-i<3I-NKJ*4f05KzaGEz+7*>a&quo;(Vekcp=dX z9$1&KXZ*X^g5N!E=oeOf;#qZH;!@%=@UA4TCZ;2_=&{3G!(I}+mgrAhPgDm75|zOQ z?~Q~tSP@jMHxr`{M^J~Tcp`!NutQ`rkxCc|XRybU25hpW2VJ8~BAcjlRRzt&gYsM= zpC}{-6SopUbY3a;@tk!Z6C6qmCtf5zxO~9?VAD#xmx))2aPW1) z8|?AENxVfp!7nZCHgig>e?}$;-zDBBJ|vhD?tz($g8nga8_q2v+{dxtNa9oCGvsmE zzkqCnRY{fDot0k!DR{X5mi1eLaD7j_EKN{o&g-meydi@m?WHvu&Q_@v~YkxwqQe=HF^cS^neL2OnPFd1E^DZrhF z-UZ=jFNLD4C z$;X!J66Q))__QEj?M`}B+m*Gm;I#naTOV zC-B^?P0lK1n4N5dka_~g1^D~v!u88@OFn}chiZTR~PEB5?P5fM)U*#x8fS}7-$q?**g-il)D zk$-NoA-UQ$5A-d;KFBjaxd7oig9}kx%+?6nBB+a#6r7tId~LxUkf9~G4P-0K=o0WP zO}2v7>0Opwo?MY^O13*!qWD$G)yeI_)v$Z4LH63@y5#!gobnCG`e&>rWNA+B33fn^ zQS@szf`5Oo({mtr5HMJ?zD>!^$t}sP$z5O{3brJhz59ag!QEhOOKwlLCU+#;k~@>T zl6!-@OSvCak9hO0PGB5|y63<22&YlN+LL>e`-(j!&jve^UBLs0v(a`i*_k{QJRCff zJR0mub|ds~@?7u;#2iVU013|$`_bePxC>7PPX~_y<9PA}$dgdJgFVU1&Qr-_!B6&? z-fh;W<)@Q9!7)!Sii4hkb2fP{c|LhL*az5!WN-3fvJcQ+=OvJT%4N_l2CpQqLi@hz zTJloxN+}*rxJc^<&-G#rUITj|c?0xfiIw#SZ-TBTzdN_UT7rG2N1MF5!4~KnaqJNpDZK?lQ&V{eX}mjx|O`0Oa||u ze0Pz&mrNjUv7h^ZJU}SCML@2_b*aBT_-BQ{^9br=s85nlK^nnl$>+%-(28Za)c&zD z!EPJ8nZU|;k$jmPcbmai$=As@$+t-X?ucslyJV9u7kr=mko=e&Nq$1HdFbskXvxYi z$o>klP#VFvWSDZMs=;=p z9tPd1N5MDn%bq~&9oT=y98b~6Jt;3RhJrqj)1dbHYErL*(?J^!z6#EO7M^XXYrb00 zWIP0Qn7} zG+a$FC8b7#a!N_5sqaAzeDKZ$axT)~GzXd6-M@nksfoXttRXn#0zNr3FJ%F}SmpzN zJXjuD0Ie;wFx8mqhpRdTyk#XuMQ9QD7N?egoCFvHJJK(db15LjQi+&TL(5XjQ!7$U zsglB%;+g@rE3`AUE9DODM))*99HFn?J*oE8-c&VMa9RY92ej$P+Mnt` z%mb-|&~_sIP-+(Vx>DV#!^kd1!ETj0ntJ6q2FOhC9#7SVP9Se66b_wCZK&=^-9YO< z7&-;`X{cwQ_W91H<^ca(>U`<~*n!aOP+h1ug@rDr`cjutk&qv}ms3|#S5wzg{lK`M z8UPs!MMEyQHpPO6ZUFM9+)U}9$5TWofv{wXgm_plp;U?v871D7%5;heWm0S?n`)|r zT_=@G!{xU8!h&Z=We29W;aXWP<)lqpjC4}y!8Y}LnIvir?LF!@ZeWet7V|!G} zccuI>Xfo=l*qhh+BsCXV8pzkM{+@#W8Pxia8ailuo>D>$f7!66(H-N3ooDf1bU{h0 zvCR(+r5Z!SsTZl2kYQfvRq8dgi@?96#CZeu+tgb4CGZsiumSIK_s^eM)^!eMx;y?T3@Yx77F4XliBX2b>Dw91&U# zd48k_>zdG5Y88yufpQjo@C_@~jC%WH!Tpi?mHM6980vIdJsZF?k(%OMix}%e4P|TX zMcyQ19Uz;aPBvU<+%2GQ4oxwp8fC^D$bP}K4Ulr9!hm03SPdJr_gq^;+X1Zv{ZDBP z*$szL1@@NE4)FXbPNUjzA&%SF1?ZlT$M70Ek>3aSG@~t4W9$x*)zgg`h&L0-y`gsC z)FOQrlCW~TvynE(s5AVa?GGLE?h6Hspb;_-0=olcg(pua4BpNVW*iDdKzrKypy85cmF5A~L! zOVjl~HuK@6Jl|MgEHoO8MUdel#P~gZ|B5^djKzj&zXaG4U@V2Y4D|(n*@bq6aTz>K zpj`>AEa9u5U2U{NCYc*z1fq{PNFmcDxS!oOQj?AKG9Hg!Ia0W212`bjG$B zo!W1J_hx95@v(X{L~Sur-mQinYAI#rZQG3P#xuy&3P>y5OGhdn+jki8P!i%`$8bcP z7p!f@PVnwB5`gUnZI6)-wHukx-cpu*#(vNg*K?l{>M)v|zpV$1gGMLvrb35|E@K1C z_ElH6kq?c-Dm`pitVh6m99DI{Iu|lS>tL6wtE{eA>v-vaF9*gk<2d*Wp%cbQBMZIu z7^jTWfZPh5F>Z$jLuZXs#WO2#&lyVP0vPvsxeOz1WQ;GCEXp$!`W)hXrtvBC zKJ+H^F7y_dFQJyZUw|x@tyMXrt*Q-1oi|!fckt5_V>^akn^nHLX7R9(d&3*JT}Hc^BsTs zgtHNN7ojJ?M5x{O1jRi?@+WwT>-LpuTNN$JVyQir8xQQ4IA)btF*D@&KBYeAcdEEs)yyUmiG6}F}=<+k)}K<9)j z({*7xFTsAow2(C^OSOLwg$r9v=6LlP;1iD(=ofx6AaHN`HNl81idyr z3uGv~$rldKPGiOVB}N2|AQrAm`vHlD@o*p=t|r1H;K5={I-I5v2lm)721q0wO~0|8 zfz_#7k6Ay#yv9(jeU7)b*)}fRZp~G)VLlwRe{{f!E-Zx?!k(vuCF@rko+i@S@`h>w zG76SS<#PCk&runzCeu{9x?By@>EBKUvek#RFbnN2nBm*7`nfcZ`Vi6$;SY|@PBDE1 z`gJ;`^l-)8a0J%qL0Hc+aNfbVl=M|tooad>^r8VaKU@!TZn^>F!f<1Febs{Sy!3pq z78H^6OpgQ^7KP{88`F!!OF>@>kxRnMK`slg2sc5yGQ0@5#j?26{;`U3tb9q@mZevRmxI=2TLW0!^#Ojt+Hm&oGyG5F3Sg`cH-TK4*3jx)1^Q!j*RKW*cANBC z)WY6dY9IZ5H(8(FkZwlkd-SB<2zmfU4o~a!W`u7+a%=i0WNZO_8`SOTjp5ex4$zum zWNpxHfENB5l-`xzo!$d>dwN@VD`0!mn?UXZ1fHeoj`WuB0niVoH-}pQzXn%!2ebzC z-4^al9|B)jItl%654VQ9QPk3k!|5aGqv=!C$I>Ruz<Bq76bI3~b%l?HyTgaVdiroUo=&8b=_BAPmQ?y=NjnCu zkxr*G>1;aYIT1F~xpYtXc*zSpD#}|(4?=q@eLH<8eHwhHF!kfBEOa z57H0Q7sBTOIRo`k`eL{j+IDnJAEz&cpQQW3m%~p>vQBQ~GoIMtC6nC4CbxPq`lM zalvmP^&U`!_G`~=4;hi7`ZFs&Ui8h&{c)gXxN+aWu|3nGMmaDgr{fj zqwJ5vRP~I^%*>;3ZDykSVfbly7UX$?e9yukywAh4!Jd<;%lI>aOc3;;a0q0v42Q!R zEOQ7}+Ee$7@XPS4aHQn<T;@*ad44I)a@5Ap<@5Sg3VQb)H z_;JOsyA16bbcV@{gjrw@mVK+31Q?fD;N>$y<}v(A!y2m=OCyjnGH6QX5Ion^j99K^ z>NB@2b4y-0Vf^g_zT5%&H9RjfKl3F#8+O_SneX9URUeCgo$)Npd<(bP8d2P6cu{6? zW_s1n@L2eecL`vobty<|<GrM}N#e&(eO3aQ` zm+ddVXmvtlHTDJW#BCX$cYDSK_VaSPw>5LE3ikBaj*JI$V=2f1J6dLnYr5Bq?Svj` zfVV5dxP4fyXSQW`<{tD!x@Q1--Cm0|c&1}z{zHyEz+CQX&&j30nrZaO0+AgSnN_XaP=18U-uIACq0PND8u)Cjw(flcMuw$7z?0Dux=48f? z^+41j*meJuQ<>8!OAn0qOy+Fn99ZWw7eKmURrW&5l>K2|M7%zbmok?#SD+1HS2Nc# zVXPnYUDg2nk|1^+v9_R?0nmdmk{g+u2!-c-=Bz!Q*@EWgPgZAHB9qLdz>h(^kx6GV zpl3^bSRY8sfsBDapNV3H%wXnL2FGp#b_eQRsP~}W&pZJ65Go1GN6;3F*Y!B_Btv0O zGX$W|0DYbr0y&&{0rF+$Rf$*RzAou+GH)}Ylg2E*UiX)ZX5Tx6Pp^2NnFn*qU>`Cp z_AxV(`Sh>Y&zYl@9QGx{LoZ(e7qC8=JA#ma;Wjmt#%P^Gc}C?Q601 zn9VZ+ckt}&9N^YvS7B=~e>RW}f>kW5v2|Do^e|K`n{`E?-H1iAG33XyM0Nv4f=*?( zKt?(ns#*`faTA8SnJk;#jJ04KczMKzS;b;!MZZLD!U2Bw>rBf+X-u9C$=_w%Grsn%dRht5Y9!}=Iq972<^V` zOR}4@hp{8r7VvM)wq&#Io;{I0ne74nRQ7cCO!h3|p39!kUdZ-ld$6<6kJZ};@;ubj*v0G_)N^0<5-=}k zFJf1qy_&t^zE;eE^=D6FA()rzS=KQC$PK8Md{;|z0Qa41v*#K%fVHDDY8<->{xr%6 zPjJ|ib+G@GIA~X}4W0x-lGzk$KYDLsN#GmV6sBY8Y)w@^mcR@wlf8bB`j0wvD6hb*Aa3%JLO?lk8Kloim>ntMMc*gTKWD#WgVwL0eM6q_An#$LSP&wL512tSWE!qwjyKqAENo(C#MJE> z_shS1M1lMEul1kaJ|Zk;;@}^_2$M7^bDHY|piQtgKVdZB3{)2CXFxgg8}=2&dS*J#(M9LzQ!7hi|XfFDj;UC8T)GjGoY%clBTnbtj+(#9WHrFzQS|ZEM`IXj) zQNF@#GFO^)@ZIXJ!xp((Rtde>p*kW}Ad6*{x!PP~IwNb%fwI@O9bUn;&U8hpBkLj4 z2D908mw0dnbiqyy=qA*MFS6P6Mm&)%=CsIGgut@{aa+u=XPdd*tckRmwUL1iZrxL=Kd){Tbi?E|*svG&>PL6gdQK zm)UI|hBgejn#PuCu^A2lc#p!R$quYFuQ5iU@8RA}^YEtV`{*b;8MjRV@9mbMT<| z0XGNtAQuT#T{3T0pS7`(0A!_Xm(45Y<%+B3HDL6c*UbU*hIzhnb~&6*>^IF#HW8wQ z$RVo&PZk~ZII~)b#7#9KNBTVpv!!CJvK}}|^C&v&J+Y@u!%UlVBh#>q*#Mqm$(joz z3nKF(^CPC&2-u=XnQw7qNhD|9a}J_7m@nskSCPw=l~wGiaKLC)Z{A!MIqR-~Y}d1x+%EA*#~!}ITv`Pf_)d19`PJaVjwJT)s}?}ih6WJ6>ljG!6ndNh(v zNUn`MGoPEU97E<1`VGV83-hJ98Tl+#uV6%5kp3tC*2rt~MrF%iBvZQ$^zBevBRdfK z#@rLx71;@T8`RyA_Q+fGtM*3Tnfn0QAF-Dgb9F@eE$___=G5|!=7@O!JWpY59E`YQ z&E=oWPOuL}KAT;UeYP*=Y1n1DBVSRTG|a^}^AkLczni1x5A$&3cx22x8u8qFMV5_zA%5uVsP3Exq!;Rih%YxS*BhzHU5rf6 z&B*mdX69;hv%oVuHwUC#RRnMly(_%YW!RC&a!&(H+G%ueMa{UpTW2dLa zH`gTsCgp~FhE2|0hu^4xtwPmuH^8dT4MgVV8o>Tj=H+^--d4=dEyyhdtTDGJr}!3w zb~7?wtpmT?GuNg^mi*{zwCASUQ?YUNz9loETwk>xjayzm!cNdtuN}k=N_J8hkmE|7FdafM) zE|N=o+JU_{w=cIJ+6R%2+#~Sbk0fTD20whkt2~e^bHiHySI+e|tD~lL*LUWg0RJ+q z*F(9k+(mCa;0M7fmL6Ys?pdVL_dIeqcO-W-Hw4UMx#PJLxu=m=k(0SMk(ZGk$om@b zQ@P?>;(dx-&0Wj& z=SIN#68RRno*RIO&ylZ@S8h0m=Dq_y=(?HH0gdMpAd|UN&Vcs+w_LK0Mt(&4%HhNc zQJLIWB>S)EpAi$RWu@mxxO_bF3wq4u^0`9pvAex`u*AKUyA9g!$Q_V(p$@}Zx|bVv z9JWrt?z_x+zr_19s&9^|(O=dFxrez+u&2NmuIQuO+R)g)zyYn7s+k9S-zB~r_ zw0uoI5}gkAjQoHb-hx4^h5ApKm5)Ye=ZWZ?d@PDb>+=45AkUYP5E;xi zi|o7#xR$Ta&&@Z0HV^82sKv4X+PTq%`G#m?ei6dvMHd(S(FG8>FuEk)7+n-y99>w5?*+y`WnX?jvNlIM@(1z<^PONF%6H|vp*@^m=iC%MlHU?t>)seW z3dq)I3mVHY6mvX(BEK!V9U*`6oy_;-TcfA)Y2VqZ)A?r4Ygqkf@;jnuf!~IB=kn+C zdqCSAy#QEm{$hS-v=3z~W@wLI%3sdkaPBJQyprD=y_(+_-4Avr)FJ1!d_Q8}f!*&q zXai6WMGr(fq6eclK);#SU>5a!9I@a#c;4mfjvkIC!R~?#sl1U-=QGHg1!?9_0Gb2s z2(+i6o{64}o{Q%5r=mRU8-@HP_h9~Pv?qEzdMtVic(?O+@^|w`qxV3+4;9X*(Fgg5 z`QGS-=%f7O{FD6C{4<0z-t$r2*B5=BzYKX{^!efZ3-AnjMqJ(S-taPi72&S{d!2ui zf1AG&y%hEP-sRt;c(~5_kNFYMZ+JfCKSTQ^Z})wL_FD8?{(F8j|06$^??*X)mLjf4 z$Me7Pzw;Bwo>YK0Rj5;-!o6P@h?W&@AbvSQis*kzeMLn<2k#b`!JE-I;=v3;YbhM4 z;$Yvs?zKXk?f;3bETjUTkU+f{u{Ic?X^g%RO_+7og7b=7cPvGyAORv5l!98&Kzmur_ou&l z#D4V`dmWuycoS^^bY5W?*7^LxTky@TSb%sRqYDco(GSr^WGw>uKKdoPxbO}*pQ1~^ zURqd&e8udaOIg21mlswPnhGny^DVlnG_Q&{_#yRPsfx*n_zP@AESMK>0HMmK@> zsd95+3$(>D8l78t44pm3qgzW@OR0tL_DI`avRk3uQD`gdME0)2Zq!ahe?@;s_Y~R- zlVX2z{*jZBHQzoZwzsgau)i=B?3VJ5LRsuU;b5V&a0sHi3gw7Z5wk$sT{sMwEjH%b z1y{=&J5u;!KZ^P|2C_1Cys!gZ#bW*w1$*oXJey7yPI;;zwx{5XohqCzoI(7vg>!}T zNOQyj?mFK=OEqv@u{Wi+IJgHP_5v_^5$j^X6FcfV=<>#Vv1ze-II+~k`jBVCoQrVH zAG)T;X2xd3E){Cgc;OsXm<8IE!t9cLwQ#M_Ux5GcWnrLj10w5UHw*q)Af^|BzzD^{ zF$~%`%9$u6Q44Pav1lw+(qT4SMj>6u6tab5PP2f=a)mtj3WdSKtrF*UAz4kt?v$*% zrS@Loet|^ecmT-5!XuE6k?#q}r-f&Q-}dK)p#l{f2KxonmxWh_*M&EQw}?f@zM*+# zVl2wS#oiV8*!#kV!pFi0Fg_vH=fanQ7?WahtkEtYo)S}IUkl#~^CB{K=R)!ha<7{~Ak9>rrgjuSYEQ#g$?IE!;Qj|;enOSp_H zxQc6dJw6w2z~|xf@dfxoyb)i7FUFVPOYvp+a(o5egs;R`;j8gA_*#4&z8>FzH{%=e zP55Sf3%(U^!MEYt@m72X-iGhQcj3G7J$O657vG2P$2;%?_(8lAKZJMT-S}br2!0el zh9AdI;3x4O{1ko~KZBpe&*A6s3wSSn5%0q<;g|6%_*MKG-j83$2k;yCOPobh-pL(F`bw}%p_`wS;TB&4pB$=i2xBKLPVIr zhzJoSVgybQ1W8Z?O)vyYa0E{Xgh)t)Oelm(Xhc0RmuMj75%Y-!#6qHxSVSx)mJmyc zWyEq~1<^#TBvuiti8aJpVjZ!b*g!NB8;MQCW?~Dmm1rTh5!;DYVh7Pi>?C#(yNNwS zJF%D8N9-p$hy%nyqLVm8bP?UeVd4mJlsHBlCr%J2i5}t;urCom>?#RlgTOMRI-dLCo4z`X(erBC21!eWEJTot4SB>COxE=^pVrZ z8ge>0gPcj$lC#L!BuJ8^NSb6wmgGpD6iAVjNSRbf zmDI?3axU3G&LiiO3&@3JBe{rNOfDgplFP{Dsot>g}}joeA@B6pK}$aZosxsTjWc8~|igJdUpi0mS}$;0Fk@+f(X zJWieDZpS(^EkT=Miq)x`k1eqjL zq(P?144EZOGDqgg0y#+DB5#v-$h+h{@;>>1d`LbbACphWr{pv8IXOfQlP}1ZFTpOnxE1lHbVh$H#tF0q9#*QsHs#LRZdk< z7RpN5s7lICIjAbiNmWxW%1wDFFXf}AQ8mJZgMbyJ6_Bh*pq7I`+3I!B$SE>OMHMXHaw zL|vw?P*6Mr#?_0sS)ZE^_luYeWkup->FgR z2Q^0hq{gXV)Ng8nnnX{gr_fXBGP<0upe?kOw$YWeop#Vww3Du;U9_9_&|ca{Porz- z>GTYGCS6Omqj_4OMOva|TA@{1 zqwDFpbOSw)o=-2J7t)RNB6=~sgkDN7qnFbw=q7q4y^3B*)3L2D+KvNN=Jy z(_84RbPK(W-cGmDJLoogC%uc_P4A)G>AmzmdOzJkAD|D?o%A8Pi|(cm(?{r|^fCH4 zeS$to_t2;4)ASkoEPakXPhX&W>5Ft9eTlwIU!kwk*XVxwIz2$&pl{MT9j6m?l1|YE zou)H%mNw}eou>=*AbpFzP2ZvK()Z~5^aJ`K{fK@{KcSz}&*bC%uJ@1nZ?Xz<}h`Pp9wHQCd7mpjEOK& zCdS|l!H^8a&N@f+anpwlFW!5q4nGH-cvys`vY-YAFTbUMS8?&8hWp*%a%uZ$(vzyt&v@?5| zeawEQgE_z)WICBcOc&G59A=I%N10>HapnYblIdYiF{ha`%vt6fbDp`t^fDKjKIRg0 znYqGTWv(&(%ynjfxxw6IbSBOum?V>83?|KFm@H#5IVR5(m_g~zy&CX%#SU($JgKUTmvlts;qil@DS%M{5ilteGWm%5pS%DQ^ycpyMSHDHnNM@#q1JxDZ7ka&aPma*p=)mb~U?(UCXXx*RvbgW_BaHiQUX@ zVYjj^>^62g+sf`>+t{7#E_OG&hizx~visQmYzKRQJ;-*lhuAK*n?1}PVUM!M*yHR8 z_9WZGo?=h4XV|msIrcnzf$e24vVH6&_A+~gy~^E%r8hhrP?*WAC#M*oW*R_A&c}eab##pR+^kF#Cdi$-ZJ=vv1h9 z>^t^7`+@z)jOWbAd z3U`&e#`Sa8xdHA5cazh(IG5m(T#7TeG?(GBoXO?5JXhcbxm(<{6&lIiBYQUgRZS<`rJ$HNKvo z%Qx`z`1$+-ej(q;FX9*TOZcVyGJZL~f^Xti@~imO{2G2Ozm8weZ{VBxjr=BlGrxu3 z%D3>_`0acvzk_e%ck;XV-TWTDo!`svB>a9?;JJQN-Y zkA)|~Q{kELTo@9Dg%`q0;g#@Ocq6S-lVO01bj0r!5 zap9NnTbK|giIc@C;#9FrEEg+8i)a;XVx?#o9b%Q}6stv-=oUR9{Hr74G_gjUF3u2V zinZb_ake-|tP}lWKn#i@F)U(YM2w0t5f=%O6e*Dw8Ict^krxF~6eUp>6;Ty6v0j`j zHi+}Y`Qid`q1Y%c5*Le0#HHdgak;ocY!X+BtHjmf8gZ?-PFyc;5Szt~;wEvkxJBG5 zwusxr?P9CALu?awio3+!;vTVG+$-)A_lq6k0r8;NDIOBL#BTAhctkuZ9utp?C&ZIt zk9bNvEuIn2is!`h;svo+yeRgGm&D8B74fQgP3#x1iv!{f@usMYaWNq##gu4>X)z;a zMN`a)d9ff4inqku;vMm>cu%}9J`f*@kHp8~6Y;6|Onfd5iNoRx@um1md@a5a--_?V z_u>cfqc|dd566_Q1=N;aud zvP%xBN^(lol1p++9?2{Dq-j!(G+mk@&6H}TS<-B2j#MZ4rGONaLQ+`5q=*!iViGP9 z5-CvLOsW@(GGRcev8N!z7XX@}G%?UZ&&yQMu+yR=u@C+(Ly zqyy4HsZ%;6bxGaQVd;o;R5~Udmrh70r5@>&bXqziot4f>=cNl$uXIuBlP*b@r7O}^ z>6+9pU6%%=8`4clm*P@FN=hlokkV2{%1Wk`lk!qQ8kBBHx1~GMUFn{5UwR-tlpaZs zr66!Fg8j^;k7t%}VmGoMABfXX0N$;f((no1T`XqgpzDQrCZ_;;ZRQe%}Nk64= z>6i3dnvf>RljSM$RJlwpmn&q8Y?W*jL8u>D#v78CS+2kWLjoqR_0`07GzPDWLZ{ZRo3Ksd9K_b z&y(lN3*?1zqr6C7EH9Cl%FE>C@(Q_0UMa7VSIcYUwemW7y}UtgmN&|qQNbZum<-_t3`KWwMJ}#e-Ps%;= zDfzT~Mm{T_lh4Z+FUwcttMWCuU%oC6$T#GhvM$Hvgq)O9vLUDCjGUEC zIVb1kf;=eSl5fj*ekebZAIneVr}8uTxjZBf%P-`Y@+B&zmwm~ zALNhni2O0w>%+FQYI@?l&MOYQm#}e7R9RAluE^} zIFu^IsZ=X2#jSW0ui{gtDK*M;Wri|Ssa0kvvz0kYo#IylN>B+YVFgnnN>qs{xI!qT zLMgPuD6GOMydo%~A}O+>D5|0<^~zkOL7At_R~9G>l}2TevRGN7ELD~%%as*Mld@7- zrL0!gC~K8<%6esk(yVM$HYuBxEy`Ap`28DlvB!S<&1JxIj5XgE-1aqMWs)FO^ryYvqmdR(YqqS3W2ol@aBW@>%(!d{w?F-<472hcc%8RK}HG z%5P;tnWRour>IlaGPPW-P%WxewW*b=U3I8cs#C32U8-C4s9x2lPE%{t>FNx1rdq4c zQfI4k)H>C#2GpP$Qo|~yM%1VpQ*o70NtIG*l~GxhQ+ZWTMO9K|RZ&${Q|r~aYJ)mY zov$uX7pjfwB6YF4L|v*bQ(uq?2DMq;sBTg>t6S8qYKyu} z-LAH(JJdFHr@Bkst?p6V)xGLIb-&u79#9Xeo$4XAOYK$M`}WdO|&^_Nb@S z)9M-Zta?s8uU=4l)r)GMdP%*kUQw^A*VKOXx;miVP;aWb8dno)QcbCbnpQJvRyEa} znpX?zpn6Nat=>`Zs`u3U>I3zm`bd4OK2e{l&(!DYkUFfsP+zLA)Ys}8^{x6&eXo8{ zKdK|@C-t-XMg6LNQ@^XD>JN2H{i%+tztrFAggQx^tWD9TYGqovR-sumt7g+GHM{1} zsx+rot+_O}=Fz;GPn)LIXw$VB+Dxrho2AXx=4f@AUkhkKEu@7tOp9nyEvDfbp^+M; z(Hf(%8mIA^poyBK$(o|6nx@rjbF~I-o;F`wpe@uIwME)uZHcy2Tc$17R%lJyN^O<4 zT3e&7)z)e2wGCRcwo%)pZPvDETeTK#o3>qR)plrY+D>hkwp-hywQGB|ecFDlLpz`y z)H=08T9?+X9oCL$N3~J0Gq;1-yO~FoIr)`oplVZ}8qA-ckk|kTRB+E>)HOwTF zY{#-4LztPFnVFfHnXEHk&$;V--}~OP?)~Tfao6`Qt)INLpBc^USzD6VlAdP=w*Uj$zU zUj<(WTY~)|B{TpU2n~V;LqnjU&@gB?Gy)n4je=B=8qz>oNC)X517w6ukQuT-Rwxm& zL3St!azIWf8A^d%kQ+*cJdhXiL1~a5N{2F_OehP=hH{`>C=beq3ZOzL02M*SP!NJ3 z7(yTv!XO+XAQGY=8e$+8;vgOpAQ6(F5L5z{LS;}nQ~`ydN~j8|hDJj*Pz0)l>Y#dP z4AcNMLQPOJG!_~MjfW;c6QN1aWM~RB6`BT3hh{)Cp;^#uXbvx z=nixjx(D5d9zYMFN6=&F3G@_t20e#fKrf+J&}*m#>JKa70q{V05Ih(j0uP0U!NcJZ z@JM(Rtb*0B2G+tlSPvUuBW!}rum!fliLec}!%46McEZVU3haX2a4PJ9y|52XgZ*$i zoB?OTS#UO-1Lwkda6ViB7s3I!2rh<$Fa*Oe0;4bn<1hh}Fa^^v1G6v(^RNJmump$T z61WsDgUjIxI1E?9Rd6*t8m@sOa4lR1*TZAr2DlM!f}7#7@HlupJOQ2vPl6}IQ{bua zG*b!)M^L z@HzNAd;z`)UxF{gSKzDgHTXJw1HK90f^Wlj;JffW_&)pqeh5E;AHz@Jr|>iQIs5{C z3BQ70!!2-sM2QSQ1|oxy!N?F~C^8Hgj*LJ?BBKx$qDC}`7SSPk#DEwP6Jkazh!sgh zY=|96LL7(_Nk&o-7ve@z5f9=;d`KGNN79iDBooO(vXLAl7s*5NkpiR;2_QvCF%m=| z1V#`9MKA)w=$V6lkG8vhIOhu+4(~%j-Ok@@^8<~U5Mdl&%kp;*?WD&9$ zS%NG@mLbcL7060t6|x#xgRDi?A?uM1$VOxnvKiTeY(=&q+mRi}PGlFd8`*>GMfM^4 zkpsv<d96Ua&A6ml9lgPcXqA?J|`$VKE5av8aTTt%)S*O42@P2?7G z8@YqrMeZT@kq5{_hoD2zVd!vl z1UeEOg{n|BszJ4=4%MRu)QFl;GipJtXd-Gu?PwC}K%HnZnu5AeH=2riP%r93(@;N} zj%J{lXcn4{=AgM~9-5C9poM4vEkcXYAPS){il8Wpp*TvQBub$)%AhRDp*$*}A}XOF zv;-|h%g}PP0u7^;XcbzGjz(+H2wIEQq4nq(v;l2Io6u%-EIJMyk4``*qLa|c=oEA+ zIt`tU&Om3Pv(VY-9CR)^51o%LKo_Em(8cHybSb(FU5>6mSE8%X)#w^@ExHa}k8VIW zqMOjo=oWMYiHDhD3aoBil0yYtwgiXe#U{kSa*mP_LHWQnL&Bo?nbFq2Yd~5->5L<*T z#+G19v1QnDYz4LwTZOI0)?jO~b=Z1r1GW*{gl)#QU|X?m*mi6OwiDZh?Z);!faJB6Lb&R}P;bJ%(80(KF*gk8q2U{|qg*mdj%b`!gW z-Nx=ieee41D5PO6@#-3nLv1izG>;?7`dxgEmTCo1O5+8sM#0TMn@gew7d>B3) zAAyg=N8u`5jcaf%uEX`X0XO0%+>BdrE1rnka66uaJ8&nSjHlo(+>NK=9^8xj@HE_y zr{fuTCZ2_7<2iUPo`>h-1$ZGIz>Dx=JcvU$j3YRTV>pfzIEhm@jWallb2yI+xQI)5 z2rt1)@iM#|ufW52C0>PBB!Jc8Hab$C5K25-O{@g}?(AB&H}$Kw<5iTEUZGCl>L ziciC*<1_G?_$+)jJ_nzR&%@{A3-E>bB78Bv1Ye3T!P@!=K|X z@R#^2{59T!_a~IZ0Ae69h!{)^A%+seh~dNtVk9w&P!VcELud&dp(hN4kuVWv!a`Vy zM8Zbci6p{7IEiE;g>VsWB9-tEUcyJD5q=__$RIL_EFzo8A##a4BA+NA3W)$wL=+Q2 z0wQ1nAy5J%aDpI6f+A>wAy|SVctRjVLLx#$2~kRv5#>Y$5hf~$Dx#VgP1Fz(qL!#5 z>WMK#1JOt{5zWL{VjMA^m_SS!#9m?_ zv7b0V93&1AhlwM^QQ{bJoH#+8Bu){hi8I7m;v8|FxIkPaE)kcBE5ude8gZStLEI#6 z5x0pu#9iVZai4fVJR}|wkBKM5Q{ox%oOnUJBwi7(i58+isU!!G1Ia<;U~&jKlpID5 zCr6MY$x)<=RFfJ~OX^5HX&{ZHi8PZI(n=SxHur)#PZhhK!K4WF1*gjv*V!MzV=)CdZQF$noR^aw0j2oJ>w3 zr;^ji>EsM@COM0oP0k_blJm&<uA=i@Y$o1p~ zawEBk+)QpEx02h)?c@$}C%KE*NjcCV7jzP2M5zlK05_J|Uly&&cQG z3-TrTihNDBko_qoHGmpO4Wb59L#UzDFlsn8f*MJUqEwWc(okATN9id8Wu#1$nX*t; zDv`2Lb}ET-P);hDN}*hon@XiTl$Y{RX_TKzr!uHaDvQdda;RJ?kIJVCs6r}06;Z`h zkb)?fLMW8ND4ZfFlAtoRYH|gWmGv;L4~PGs*0+nMpHFZgsP?L zsCsG))j%~;O;j^AmKsNmrzTJnsY%piY6>-#nnq2hW>7P!S=4N54mFpWN6n`ePz$L= z)M9E0wUk;$EvHscE2&k~YHAI&mRd)xr#4UoY74cM+D2`sc2GO1UDR%B54D%t zNA0H$PzR|))M4rfb(A_r9j8uEC#h4^Y3dAhmO4kBr!G(zsY}#l>I!w0x<*~6ZcsO= zThwjp4t1BhN8P6$P!Fj`)MM%i^^|%>J*Qq!FR545YpR9nPb=vG^gwzLJ(wOs52c6E z!|4(9NO}~lqSds9*3vp!Pa9|>ZKBPzg|^a(w2ijYNwkA@(#doR?V{auD(#`Yw2w}s z{d78=L1)rgbT*ws=hAs}K3zZ;(gC`NE~bMtM8h;fqcle2G(nRzMbk7xvouHZv_Olr zM2F}Sx|A-X%jpU_OjpuXbTvJiuAw7zEnP>~(_`ocx{+?8o9VIiIC?xifu2ZDq9@Z+ z=&AHHdOAIWo=MN5XVY`&x%51GKD~fmNH3xn(@W^3^fG!my@FmzucBAeYv{G~I(j|5 zf!;`OqBql9=&kfNdON*?-bwGGchh_5z4ShMKYf5cNFSmP(?{r|^fCH4eS$topQ2CG zXXvx^Ir=<(fxbvzqA$}|=&STK`Z|4szDeJrZ_{_^yYxN!KK+1xNI#+<(@*H9^fUT7 z{epf;zoK8$Ep&fI$qZlyGJ}}G%n)WMGmII|j9^AGqZk#VW;BeJ(J^|)z!(`5V`eOj zl}Ti5jGakh9E_7mW>Odz<7QGB594KgOd8{7(wPhnZwLw<}ve`1zNJAMrISUnc2c@WwtTfnH|hdW*4)Y*~9E* z_A&dJ1I$6@5ObJ0!W?CeF~^w`%t_`HbDBBBoMp~2=a~!4MdlK7nYqGTWv(&TnH$Va z<`#3Cxx?IL?lJe72h2m}5%ZXN!aQZ3G0&M7%uD7K^O|X4`m;)Q06UN!#13YMutV8l z>~MAjJCYs6s#rCvVYRG|)w2fH$eLI)YhkTyB5PyqY!d5Wooq6j!n#;Do634vFY9B| zSU;Q2X0VxT7MsoHu(@m=o6i=og=~N=VvE@z3$ZYZuqcbMI7_f3OR+S|uq?~5JS(sw zE3qNAge_&u*mAal4YQSO6>740yN+GY zZeTaEo7m0l7IrJUjor@fV0W^+*xl?Nb}ze+-OnCi53+~Y!|W0ED0_@O&YoaTvZvV7 z>>2hfdyYNNUSKb>m)Ohf74|B7jlIs^U~jUw*xT$K_AYymz0W>iAF_|w$LtgKDf^6l z&c0w@vai_JYzy0;Q*r~if!rW&FgJu7$_?X&b0fHs+$c`PsW}a&<#e2$GjK-E#F;q@ zXXO$(8)xT|I0xtClDQPl#ksju&ck^*AD71YxpXdr%jB}SY%Yh(BiF<=b7Q%2+<0yRH<6pfP3ER>Q@Lr}bZ!PWlbglO=H_s7xp~}tZUMKD zTf{BqmT*hCW!!RZ1-Fu0#jWPnaBI1B+1b31<#hvEPaA&!5+S`&8PAn-pl*= zG~Umr^BH_5pT%eMIeadk$LI3}d?6p;i}+$b$U{8LBRtAuJkAq5$x}SdGd#<4JkJZf z$V+^PFX2o1GQOOz;KO_+U&UARqxl*>!q@V3d_6ygZ{QpGCcc>;%a7y7^Aq@q{3L!d zKZT#lPvfWaGx(YOEPggWho8&Om%dg|t z^Bee${3d=gzlGn*Z{xS~JNTXaE`B$^hu_QZ{xScAf671O zpYt#Hm;5XKHQ&Pb7nH&PVW2Qb7%U7Ch6=-k;lc=Eq%cZQ32H$jXa$|17Yu??FbQVC zB3Ok)!6w*+B*7s#g=8T`a0zZ9RqzO2!6&2%ej#1R5Hf`-DSb-CGK@dbi5<)_WP%4xO!c<|JFkP4-%oJt`vxParTw$ItUsxb4 z6c!1Kg(bpLVVSU8SRt$wRtc+xHNsk9ov>cmAZ!#i37ds2!d79MuwB?8>=bqhyM;Z% zUSXfGUpOEf6b=c8g(JdI;h1n-I3b)AP6?-lGs0QnoN!*aAY2qK373T{!d2m#a9y|| z+!SsJw}m^xUE!W^Uw9xq6dnnWg(t#O;hFGUcpO{S05RIZqG>aC|Dkh3H(Jm&54$&zliz%W@bc?B?NA!w5 zF-`P~>0*YMDQ1b;Vvd+A=85@YfmkR8#3Hd+42qBli-?Gdn23vnNQ#t5i;T#MoXCrU zD2kF85=+EVu}mx%E5xu^DOQQq;%Ko(jEJ>jomel95gWutu}N$e$BN^`@!|w=qBu#M zEKU)piqpjD;tX-7I7^%@&JpK|^The$0&$_ZNL(x~5toX~#O2}&aizFQTrI8<*NW@J z_2LF`qqs@jEN&6Eird8P;tp}AxJ%qE?h*Hj`^5d?0r8-CNIWba5s!+;#N*-#@uYZ4 zJT0CP&x+^7^Wp{ZqIgNXEM5_>ir2*J;tlbpcuTx3-VyJL_r&|+1M#8wNPH|l5ub|B z#OLA*@um1md@Z(!{UxO|KpH3wk_Jmdq@mI zNySo7f+Sc%BvisATp}b=q9j^kBv#@iUJ@ixlBAGSB9%&IQn^$ig{4ZVN~)GdOEpqN zs+H=bdTET*AT>%&QnNHx8YhjHCP)*dNz!C#iZoT4CQX-SNHe8b(rjstG*_A@&6gHP z3#CQUVrhxAR9Yr2msUtCrB%{u=|5*7{GZy{1OGL$-S)42|JqadcjoH9_W$Rea`}ru z+Cp0A*u3_jeV8NUfSm`Nhn>frr=8a1+47fy%Uye17hHGT<*D~mhk3l7Wu7gbp!c-* ztoMrd(f`UVns|NE_5b{=|J+Vg5=umQPMN9HC^6+IWs=gaR4Fr*53i3sUCxk0&6xkV2IdaTQbI~fNh=v8tK^itQc#LY zNm;3^QdTQRD{GVyWv#MKS+AU+oT!|noUELpoT{9roUUA_R4ex>AN@TpB`^RO2n+%S z14DqJz%W1y=m0%n0E~bMFas9A3b+6_kP3JJFW>{x06&lm;=ovRGyU>%Lol@w}$xg|PQw9qB*`9)exKSzYwEt+y`{d{56>Yi;Ehc~ZZN`}?5sxaGPNuB>l+|NL{GADx=sAoy+XzJ2@t z&*1-y`=0&fjas#8)zTvW0TjTW|2O-@DgfY(|J5HS4|d&F0O)xWkhcbazb^kBh>`FA zJ8LCh3&mO)rT`TE7Pe3u` zTR`!~cYtD}jOqm_{saNVYuU=)fCBm+Q2g=(pm;1>_#>dm`w39=`WcA*|0%`op8>_p zUjT)_51{y}FQB+AoA@iBNa+VCzW5DLoR&5G4k)aD0E$k30*b@3>c0Smwm+a~uLKmk zWhDau#jt^Z;>|&TVzZ1H3@G{!0TfZ$>Y;!F83ri&4hIxZW%62m3V979Mek97Laq_4 zn5_a78EQcBjRuI7DXz*UYXOB@2Poq8fa0tkh?Oat41mIB1QZ{e0L4*RjTunrEr8-Z zE1=kG1!Dg{5EG5&lK}^?F**mg#W$k3`WgTSi z$=;WJAnPdmQ1+3mldQAsW7#LNF0xN$pUFO#eIbjJ#ml>F8k zSr1uH*|)OqWW8jdthelY*$=WGWk1P&mi;2@BkL>sRn|}To9uVlAF@AXf64mGl(GS` zfwDoe!LlK;p|WAJ;j$63k+M-Tl}s(u$h0z@OfNIYj53qVEVIb0vP79pW|t+&95SaY zS(YMm$=tG3nMdZ8`DAG_zbsvrA7Pi#jKCn z7_%v6bIg{QtufnTw#T$Y|Ld(XrYfd7W^_zVOeCf@rY@#FW=u>&Ok+$_OmocGm~k=V zVf#g`+n>Pu^nSSj8(*b6x%7bbL_{lpTu^F{WSKo*w16Xh>eSl zkL?=!W$Zs<6Joo?eii$5>^HI9V|&E*jQuwDyVzd;kH=4rPl;iJ@MXnUwm4; z|34l7f1k=okMIYl;39{UjO_jf=h+{Vdu_j`xo$qXVJ?ql2P@qeG%Yqr?7bpW)FF(UH+n zQB_nO)kL*X-9N=IM)grc)EG5I%~4C#8cqDC_&<;Czdp7_PXs;+3?H&F8zrp%qaQ^(MLS17{!j5%;5*>EpaOgeJ^;sq6T!*gxoBM1$z9+7vQ^hNyS7B9 zg44l^;AQYCxDmVqz5*YEPr#I}x~}P6GrE4#_4lryb?wo$XVkHG!lA@C@8 z0z3`g1Mh>c!IrrY+(>UI=(3Vamz0hkciEv_Z11P6kH!J*)Aa0ECCRD)VjFCWDSnn5dQ1Cu}} zm;$DPUN8+z2Q$D-FbmB7`z&(6d@%5LD+nSW4iX>pt9>2ThZ`O56t{Bxs{b{h_2u~p$*k|B|H}HU zs=fVfRa;e|<1OE14;awc^6Wi*r;{#mdnzv{W%n@u!^T(=Dy357hjJMU_dRyyG>%I;!j<|5A%nq&+=^NcAYOig&{mVdg4QRe0msFWh z(*xICo)T3b*Lp*vF+RJq^OAl=MH|h)su8LmEp4;*m=m&g!c!bW z^*dBv=eMCx!iROG&Y{*Zw&ctac6(OqLZx}E?LN&GJ=3p)x~IQuNU}YL6ZH+cnT}y> zY+9epG?P^DiFIA+7sY{OYb~#B#i%{QO9R@&nQ)P=w$@VbIp^G3s`UEvca$%5Qc{a8 z(Xtc5iWX+}%w3+zM}Fe;&K>Hb&IIot(5!lo_JyNw+A!bu;kRgS)*AF3!&k`#=o{p8 zU6XHr#UnZA)#K|Icvf_vxsR$Z-8*p8(h~{geT;cD^U@a5UzpqYme@|nnICII-&nu! zWfOz4Bu{&%%jv594(?O&k#&GpuO^zuI}5B!9UrN->Hs+zM5BFSdsPMHzcL%b?-`Eh zhas@{jESrn5w6#Kmi%YrUDaE4Y1*ibH4?tNbkJ z&Ybno&$=n$RhiGw3Y!VJka^ya>nW*;WcN*9S^AFm7iY)dPQ75eOz&V6?)mhGP5{#} z3A#J#P?=gii#wT-99A1W))MnZCsK6X^U&wdx>0&uw>`6uL$tjxk4Nrh_E7`A%c_wX zhsD&gg=G~||EzJLH@#<)e0hG0BD^`$!}q|j%03H+8AHA^9NoR`&OBjAK`&!+s8K zV>PPnX{ht1Z%5Gs%X-!Qtb6*)jfV&Y?o@PJcs$OUu;*p-yQt%b$5iXydRgk#)#W?dfbd z)9UGnJ@QRz9>zyHTq%=U3}k1VzC7& zScFtPG>NKwx*hzk|E^w_JW3tZZg!5r5|Y0*Pc(NiJaLpHDbz7(@A~HFUeCLR-3jW=*#b>`iDmT{YdF-IWuXkEnam5 zogsZ+&E~B3EVrGk`^&C@RN?lSeLa_oM!{{fUnV`wI^~p9yURC=!Ab*u(D#{REheGe z>F)z+hT|&EsZ#I9UYD+HLLhEuIgb`nP94|*OuCPW!tJhwGPsjjh&C(XTAt;*Zra^F7u~u&@VA6 z;c4ze6~&}0<1;nnh$;Lg-Dpp7*x1<)N9|L+MPHC{-gQOW9QxXO*8DiDOuJjNA4+Vv z3wI0;O*7k$gi!4^eJ?lZTJHST_Y$pkF4c}mxo7Wf9iuPQT+8g49aCpkc|+;uZ`edF zmf2*>N^YC}O?I(oR%jVL+)$X&lWwW|4Qg$_7-<#!hYoV)IbVBwIf9YW>aC$%=Zxf! z(|-sowC&C~C6095v!q7)BHlz?^#pFBZTU+}UqVU2pPA*lx9cD1CX*kRNV)B;tt@+e zMi=P#EiWUeAdBGZw$qifJ+byXNt&cOR|j&UZKt)wS&|{IJyQBKtk++N%;b=a56RuB zb5xb8^WjT6W#-J%I@?O?Uh%i$Uh28FQQ;q_vqese&RW>sG)yrk-D=w8s>XVZ-<{ZS2Qdl>xTO%?s@yOIpZ z>xy=vw^X*Ojd=?~D{@_tF}^uP#U*R7YmxU{n`{WP%JnXGv8V?=D)O!Q6ub#pk_O5PsVTct*6dJ3>QZnmX#rLuzEo|oMa1=)W;Ui`b4Ijwdg&m?6?%r7a;^`4 zPS4QIfa|Tbu8tK4h>hy)1~~G_+odGmG2Pic^hcJvm`Syis8SLWxw3tEztvsO|JBlx zR2JIgJBPiezFpj2z1i02`pw=?zb@+)wLdaEoSk*PI@SKFZn*Ac7R!YqFHDTZTl_{{ zfogDR@6ZA4UPXFVlR78ktBlRAFSP#JLjANc0Usg0p_j{Km8tl<_A{lAoz8r|Xl(K> z@}{*n^^T)cs3>xjo>#bxJ*;^U8JhoNaDP^t?5NL>^P%-!&8+-Q&4ZEO8r+_h`nu4m z%FcBgb2fXv(1eK8oZjI-oR8dn!rqcgNbCFoX}9wCdZy45Y{~v9&1ZFCUxPb<8S5S< zy>L=S#T|<^r)>w)9EC6abDS5A zxuIvae^@Nc2hJKtPVOgxH?WJzx%m5I>nY>A_+OY4&ur4vfqcyH$@s7Q6EFl;f-| zpk8mWW7f4 z@}(munOBYQrnx)mOyp~=vgiw%i|p0(^8Ti_s(w$;Q~j#j8?vNFy={H{Jm1%DbbJt^ z%_EXC_+vHGlNGAH?sYkho>`@DFjG-Y^3%v}=ewx}Tl?@q*K(^hZEx3XVjszwJ{<{W6{>(lde-< zqnq~6()4p3bDnUY3=ppD6fa$aX6J2sjW=u+1{wbc*h|r8z#WRgri(?_yGVX`bs5^{c(gIVj8)49hzvR~U#1?_w4?%WRNq zPHJcDkNi8ftDd*Yg3VWTZzj3M`jd0?l-C{k-7(+QJ%4!ioa!skWqlLbA}-X6nM8Jf zZDlw+XA^sa`-VD@@tZfF*ii6=vmLY`S*{OdfvB=_kNs-WFPZ1FzUAlUzg=F1cBX$I zr@AYvKGqm1f9P!aBJU4WWgsrY?|mHpUUj43Prp!v<^GBdO?i`#)^E3dAN(*#gvXPA z+9!BBj~IT3)DrYIi|HMO*uMcYc9}I#1TyjuutAZh3wU4Y6MH;Mo!HOkH?L0OOnz8mPV@4CWZ1t z6-~wNLhGc^e4Wcb)PBA3SKorb=UMNnv+$wFF5-%3vh_OjzUxeO+v2IEt2{~K$@Jm& zLXr*dDnIIZZZ6Mlor5}N6+c!Fv)-l#HM}B%)NB8a%&qON^gS&Z-7^WFQxAl)gZ|J)@6SAqaK=tdSA^NXse@)#Qn3OZU;Ciukw7sO1RQYDB zdRYnr2g)yJ##KM9_yOCH--+&8xS0mW{94R93nH^q->o`TxHb7U|3W=c_iK7wah!fh zN};JpSet3rbWirOk&IPY2Wu-LMQQt!gZfFS>zSMl+n} zGc%p*6MN=-%PCVe=B<`jrH&8*H>GvM|AGe=+zcI6yWyY7yVw@;cIbkGYjbv)W{K|-xwd(+qtv~d^VMzEeU!X2 zZC{Gk{7uCS=QPTNZOdC{*yaBtW0q&5d$76-!e=}aV|3pY2;NTEBXfImdCJ?hf1*GM z6+Bm3Vh|8p;d^MVSf?Lqc$nEW=ZSuisL*G?HGGEUo1_im0oUiMpEc_u?t*@yB5i%% zIYJaa$JMHxY>ynPCA0dvK9L_*d6#ePc+>b@xW<>sPPR>^d$XlkFWi$=TeM%ha|x$y zb<(!_TY3&Mgj~>Bv5jr9x>8-JdFH~bDapqn)xheNp~=&e+z*X8L^&{sdsH`UlZ z>rePf>Qv~MuN$&5@}7HKevZ9c?w#7R$t|JSlF{suhPial>ek-BA{%U5`C(8e@?(Eh zZodeQ9<lIEiJzLIj@~tirS6AG@~O=9m|kWVO8c!u8ErK8)<57DlI)> zx?QlTbaTa%h$eHO^k;^?Tu8mJEV8{tePLKtN~cT@p3j+7 z`JgB+xus}3`!lgsl@#a%-(nvHepP4rk_#WY;&LuQ&xO&+Ke}dm-=XW-U-Nf4+obHx zP0825b(-5_{7IiC`@DQmRfJh^FL#bnQ#Kvo#x zS0yje{$lNgWmeAdpF_Jt9h26l-m)}Wyk*C|4^qCZv}FG@+7`*rPj`-Sbg8JZ^|gNx zRx^9hw_UfxUHl(rpY*hN$Es!+8TdNGlw`5@7!6TY8Lli3Os=^~T?kB1(S#P%Ow&KH zeo$8#?1cWBan9V%b%Z$(IuyXGPFW?L5N^pSC~RZTYMQ0<~A(eH4X$&<4`q_J4 zF9dg4YO6oUHt9;}vCT|Psi(SmP(iosH=7viENp#bO^VC6r+J#3F4JyoAN0Pqo*Sua zXHY;6Pn!3<-5c0e1o5BgTN}GU?@M=!*P(6Ac5Mi^>ytxMJzl|UzLx${_{ebsE-3rF z7%n*H?JzondJB0~`HT5dPC94A&GjpU;riAUJmp{1fWOIGlk)-9WnW;tUKU3zW zb#%T%KC4=fwCL2{;>su5akb41oce3yW1kvzrsXt@82geKTKz;_)m&S7GIGVXE3*aF zkM5eb+(k<)$q3W+tkilx37Wh z(70W#_kRjUb;jiKB7#zyvYeyyR_6X(2#_O$6ULtk!$mhEr@fyBes^!rPL(U0{FG&{ z{wg=Y@mcO_!zU>P{`AZ-#*edhMb6t^T2cSV$~MISHyF+jUaGoX`U36Jq@p&B8JD&* ztFv`J^Np#0Lv7l^+`QV4M^EszN~;M@O*^8QPd;-TqG4!wj~m zRP;zQrc`?7S9HPaYIXI+VozId?>Kc||I75nwry}X%|NR)oFG@_DJ&nrSuE{J`f3dP zlUje^S^iU%)bx>Nmv)zHOQlg5lln-!QfWv_^#7HaiS+j!E&ftu^>fR~{EX7FpeOH5 zdVX4LS#kLD+$$At%h}Il37dyqCc`y^deIY2kBoC$UmH!-ked(le6_{$#c{ji{40YNW-fS*Ke)- z$nLOAO{tHZRR?KZ;~?i-DP?F5`7|k`Y@Yc-U5t4x6tVV)-Zq?N`ZgZW9n09suTyatZ!qyEXrCAYAfh_H0^hzm2f9xj7??mWl_eepa_QQo`rOJob~kE?JAn z3xz)v5{dTkJ9QuHv%`xrW^lE^7x0|)4pK$UJFef=sCo_5uIZ3!f?570v|ma_b1%Xs zX=?Sijqht;=yssblY_Zis3v2je|zK)V z*9>23*640w?{Qx5ADJWbPleuXoLtK4;$kDp- z9@u2Iwk`WfUSH#Ru7jVSb5(njxM39>=^5$(mZz%hi9w~Vlk`ui4#v)=?4o!hKTTp+1{_>Uxou zl>a+<*fPp~oNsG*Lwr#6OI3>9R(FX{kGS%U{-c?r{kSq}nN_T22@c--EoOhfZR3ECoR&`hPR{gB{Q>9dy zR2G#>MXNYfNL8+S*V(KZr<$Oer&_35qS~X{t=gp8qS~N3uR5waqq?m+t9qqsqyAJ4 zsAJTLYEYe|?yEMdho~KDliH@PQis%{xOJaX z>XYjI>J#dH>fP!~>dWd+G=FKn)^yZ#*Cc4((8O!HYQE9*)I`-S>bvUqG@ol)YX)eB zXp9<-W~e4nW74$O4A$gol$uOUP(x})YsP3e%_2>VZ-HjJW`|~>W`pLD=8WdD=9uQT z=A!0~=DFsvrj1siZKeH0`=Pd@_9Jb)_E+sM+TXPOw0~;<(hk>-)atYbtxKD#^=s3$ z*;-OdYmb>qwUV|%TdA$q)@UQzCha8c6zv4ReRTtMBXnw=Lub(C>C$xtx%77S1L!+U{z#75^-VicuHLNnsHB2xp zGfXzjGHfy&Gi)FibK`H>@#SHbf0q4DF2_jjs)N47Uvz41JA%8QsQ_#_x=F z;~=BSXg2mS{$NZp)*DG<$T-%B7;$5rvDrAsh#Gk#W1MajjMI#pjc1LUjHis3jE9WR zjU7!-jUSm>jIWJdOe&Mc^t0)EQy)`?Db>WAdYLj!>87)JqfHei(iAd{Gfg(lF)cAI zGHo+$Fs(AJH*GYnGwm@QH0?JXHQg~iH$_dc<~HWH%5%lO@*vvhcoYk@4BCEqgEGSjlm(rlSySzuXiSz+01IcV8$Ichm>Ic7Oy zIb}I(xn#L)xodf9d2V@Wd1Yy3ecRgB+QHhzIwdW^+SB^2^?Pd{>mOF5Rb$m#6Rj4j z&6;F&TV2*xsP-o=swon*?p$_Z1-vI%iLGFuXa!Kb$9o54|ETAk93cA-{2nSp5&h5zR&%F z`)&7o?l;^YxDShd?*88Wt2^h8xg+klJL@jFtL}F9`W_8E8hJGLaP;Wr(Zi#sM}Lp; z9@9PMc({11@L1}x9wcu~Y!SoX2^OeIA!Q?s{DDxaaY~gZB92 zQRAU|@E(juQ_r@Z-90;dw)X7j+0(O=XGhNto{Kz}d#>Ok9Z#QJnwnI^NQz1&j+5*Jzsgg^!((>dg`7{y*hby^lI(Z z*=wxVEU%ef)4b+-xp=MdTIpr>^6`rHit&o`+U&K%>!#N&ulruly`Fh}@%rfX$qVs< zy(ll*i}RAaWG~fA^QvoTY-nm|ZD?n3G7K;bF$^<|HjFn+H_S6EGPoF)8CDzC7+eh= z22X>@;BSaD#2Qiz$%f4aiy_UBYREH`8Y&GXh8>0jhNFh_hAW1*hF=EE@WUV*B(T=~ zYWQbxGIlh!G7d1dFpe;GHnuemGWIpLG)^?S8K)bKMo(jqG1h1>E-=n9E;f1_XBvHs zA;w^%t8trgi!sGmX54DD87;zBb5jdbYtvlQV$(QNe^Wn`vuS~8xM{L!uxYf(*W_uM zVwz!^Wr{SVnqp0BO|B+4Q?Mz@6lPj)GMHAFqD>{HQd6<%h^f$IG3A*Kn~s?tn;x1T znC_cyo2pHhOpi<(H$O2ECe);vzMJf(Kc*VfKhtm1UsEk}BXeVObF-tljk&YAo7u@c z&^**U+&t1e$~@idV)in7o88SubAUPCoNP`v=bIDF1?FONin-AI&iulB+5F6W#9VE@ zZ~kn4ZGLFJW!`7LXSSIin45VEX4%}&yN-7wZ_%uq|CyJ1FZOo!UgBNso$a0Eeb_t3 zd$)Ivce;0#cd&P$_gU|2-n91(?`m(|8})wR{nFd+eaCyWPXixEpT0h0eY*Ix_v!D` z(x;t|i;urgn2*sX#^<6>h0jx;BA?4X1wMOy4*I0|T=Dtn^U~+8&pn^lKJR^Qf#o&n z1Np!{sE_EQ`Ph9FpBgYW{^QfZw~KFA-}=72eS7&1@*V6u+INiaIN!0p<9!!K&+~Qh zUG2NrcdhR#Ur*l%-wnRWzA3(z44ZG2?_uBbzPG`S`=;+5-^ac$eLwiZzL2jB=F4sU z>i9+Y*Y*45+t_ca-x$B4e%<^=`*rc_?KjJBzMrq(8b2>TA3s+=v!AD*LrtV#IB4Cc z`EB(p^(*n)0SfP@{O3`Y(yuavw z#-H=2L7A2G$NZNEd;wif!T*N;Q~!(pwF9dCy9LY%SR61dU{=7$0G9x7P+rUet-;L! zRRM_sIRQrl3IkFCt^`~JHNvw2mjYS_)((6a&?xYIK;J+(pjqIPfY$+Jz?%SvKrx_R zAQ}J#JPW7}=ovUL&?&H2VE;hJnvI~{Hx|_UR)V@;6sY`733Lq{9_SV52`YYDKwKybB6z~*K%0mLX1@VDx zg4n<&K|O;Uf_eox1`P-Gx>-TZKv`}qsMXB{bvsv3wwnj)c;o*o+2w*V-PZq_bBUlw zcLdbtE`x&H1<;tg35swC=*4{u!h+guZ@--hsvq1WxF*OUxLt7f;PJuZf+qxjjuA@c zg67-&;HAN?!7GE^gAJhKwgHsc{?}vM3TkXwptDv4`f7XrYpEUoKMl3>pqf?<+Gwvp z3GEvwoUx#5CI&YOaSUk_(mAAeNUxBopi8z2^vTSiE0zVCVqqa=pfP3xwXp!uA4&K)-?lltyECJ3ImNT zH&D-V1zoHnP{7&-dRRZ#H3=OWdKQ$Y?t$Xf1<wWi~s(RAv+4pR>3Hr)d4r|F=Z#DSvH-_WUHO6Z6%F?3|uwN*{6LpzH|P@W1Wlq(pjvbb^n~7ka?pEF8`42N zsD60E@W$ay!)wA?hu02o8QwX(Q+W4qHLQPlhw$Oy&fz0LAIKZDdrCoT=P;=5TmaRb zZ=j#^A-wVWmh0=SmqF*I%leM%J^m})_<>%{qV=mmp(YLVWwwH@Oxv0xpaOFd^k80s zg3ANYdU*%hFFI(uaQ~HBeu7fVzxB-{T1E7a7!ol!VtB;Jh)EHXBc?`71KpN|pvw{k zdMaB$K_waVQi?$nW&eNWlWU-DQVr@R7eUSBWdsuOzh22t&>?9b*(9<{WV^_&k-Z~F zM-GS_7TK<*Poy)bj<|r*$otA5P!kFNuNe{ziXrzwvEwvoa$E+@jt8K{frIMCOVHSm zL5Jf5mYm#f=Y&K)O1kH2n00@Z&1hZi86!AMHuK` zR7F*Sdc}TFoOlKb6A3CXMq=g94PPAKz)A=O!zB6f`177b`m)6e}LQG zaAWI@9XAf%IB4VWjU8&H0d>7&jbWo3FxflRYzAI>;l|E26+lHl1f=szKrnv;BytX@ zH!hr~$0Nn2)V0#w>;rk#kyU)d? zH{`QwRI1Y&;;>frzH7t;}CE#k;+0=4V(@jk_ zHP|$2)7VWNH+9=IW>bG)XfFny_G}<#M+5sh>OT`Z6!_I8z^~2%l64snu5*BE{p>$? z`V4TWD}gRe15f%pP^H_%*NS(HZy2v`Y94Rj)GNMU{J{9`@#EqL#ZQT!2CV3rz=mE5 zY-mHgFOZ+3f#;kHMCM(nv}cj2#`u~AeMdszUjxL##=<7k#^qF zYs)a8jLzBO3~bS5TYe|42U@5v@I?K96q*7QPz#Vjleg>u>gR5tf1cg4XUjogcb)(~ z=QSXA-T-FjB_MS^0XpaV|3uFJNt`vn)%?4qc5ycvfd8b-^+3f;1lnbO@?qdvUIua{oQwilvUbW#phl|6byI!;GxBS4 zgOtxej%=LrA$bf?A4jLOOBskX z&jJCmAY}(I9@Bx)sHHe=y$5u~@4!H;yY+oa)2%mC8g7Mvlh}M~kF9nfGyX~$2xP;_ zKqia@p5aCyBZdO0Fc2t-VOz&<9RrlWi@*=80HkT8!9ey)+O`MCdwD?KI{@6iLg4Ei z0~TL7@cI&gz}LN|N%9Hc;#~qB-bEndy#e+e4g|cP+nQ{5+}?Ei-)%j&ciKLD`_%0{ zY8G!_<+2LcbpF7eD*!g!LEy<90;1eG;KAJi%G(KGygl9SRC5@pZeM}d#sSCe({_i{ z2C0owYo*pr{k6SyYU9-AsXwx{ z<_d&1Z=k8|0)|-?P|qF#-RuUi%ib0r2C~^{AedbS7MTLHvKDC#(^{srOKYC?_dk!U zbz0lBo@q{L{nAFHjZK@7HVKGivw%Og99UysKo<)JMpz>7!xDfbmJHM{D-gks0S9as zFv9i#!|NQef3;8xv8 z|Cs(IolMu#f27y7w6nCbG_yEZI$OG0`dG$Vrd!5Y+%3y3b1d^L@s@R#5R2Ke(X!2w zY}sl#VA*NOv+T9(vy@qOTlQNXTdrB2SZ-N9T2u>Z!7Q?+O$KB^EU@L9rDu)Z^4;>) z^2yRHqhUs;jCL8VGTLYK$QYF|J>#&oZ^obu=Zr-eOEO$CR%Fc2Se@aX;g%7V5eyFT zLNdZK5;8VtBxPh~WM`CSJGnHw_WGUGFo zGt)D-Wm+<`GP5&FG7B@invZ54$~=~NHS<*F>CBs%=Q8hSKFxfRiDrJxlrpu}%Q8*>|(=XFtk*mi;Lk z&HkPJE1S*!o82U*Sx)_&wmA+tjyYX&I_7lG>6^UTL{Pv)M@MRKv+Pq|-n>*V#VX`APe*D-HoUcbEIc?pt8g7|{ag4G3U3N99$ zDA-eQw4kuye!<&<>VkI#Q~_S_zTkGjmx8Ya&kL}EPK7@T+7vn#Iu+I}Y*;w9a8Tih z!ij~`3zrwpE}T_3uh6~FtoeC$R2jP=txz*9y!rI!}(%R12+d9xX+&aoS z!8*x0#p-OGW1VH4X`N@CVV!SXY+YhqW?g0Vuo|sCRzGWib)6L)hFRmSTdZ-`3~P=x z*II5pVBKfkZ9Q#0W4&#yw%)fsvVOMmR>k@)PPeu!=~U9Y#HnOl$&`{MB@0W|l=zke zmxPssm#i;|Dv2yPRC2uJWXZXbJ0-VEs!KkX@FjG~z#6t>P)*&^uB8s8ZAv?o_A4D+ z<5b$Mw0CKb(!r%eOQ)1Nm(D1iUpl*VY3ah!Wu=QsSCv{zOG+zC_m&{}}s%&wYOPPDw znleL~xh$~Ex6G$3s4TebXxWLfD`hvzo|U~SdtLUT>_ge-vae;|%8)X&j3^V!*fOC^ zE0fEOB-rKY?$q}4Yuhv z*{0a)m3J<0Ti&L;R(a!c$MR<74ayspJCrvmA6nk0ymz@%`S9|&9DSG28gsF+?cwPIF@&UKOqt z%PN*u_*6txgjb|i1XqMr#8s44?5Q|dak%1C#hr?q6_+b6R9vd4u6R~)t71sahl*Df zKPrd{zCx_{Q_-oib7jZMZk5rM8!Hnkw^XK8W>jWY7FFg|R#fh-yij?l@@VCi%4?M- z>*LC2mCq|*RKBkKT=})~OC?l^S5lQ?rB-RL{9gI9@>k{W%0HD2s~T0Ek7--wR5iHD zxoSa`OVyI96OjS`;dDV`pAs!zBeRE@?J}+Cf z{{Q}@{lD|pf@(u`pt?{!s6NyHY6vxg8beK>rcg7eIn)Ab3AKV+Lk^H5)COt`wS(G2 z9iWa-C#W;j1?mcQgStaKASb9N)C=kj^?~|A{h!4653<`(VLlICU6a_^?F;FbD0on+~L7Sj>C;>`@HbY6!7AP4?fwn^1pzTm9lm?|k z7AOPCgtDM)CNaItCqwPCzH2Q_yMX40IMc2c3s5Ko_A)&}HZfbQQV=U59Q!H=$e5 zZRiek7pjKtLHD5t&_n1E^cZ>qJ%ye@&!HF4OXwB!8hQi0h2BB$p%2hU=o9oA`T~80 zzCjQKLkNUI7=%LvL_!oqLkz@19K=HcBtjA-Lkgrq8l*#Z=sWZS`U%xQzo6gHALuXi z52^*%hU>s};d*d=xB=V{ZUi@mo4`%sW^i-31>6#D1-FJBU`MzO+!k&Jw}(5x9pO%J zXSfU8748OihkL+Ia8I}w+#Bu#_l5hx{ow)dKzI;57#;!-g@?hz;SumicoaMu9s`es z$HC*_3GhUC5<#*b!)M^L@HzNAd;z`)UxF{gSKzDgHTXJw1HK90f^Wlj;Ja`& zd=I`4KY$;?kKo7f6Zk3o41Ny3fM3F|;MedQ_$~Yneh+_uKf<5j&+r%cEBpHVV z6vkj2CSVe#U>as%7Up0c7GM#UU>R0m71m%Kw!`1yAMj7O2L1*AhX25S;eT)~q&89q zsf*M@>LU%1hDal%G13HSiZnx-BQ21YNGqf@;($0JZIHG|JET3*0qKZzLOLT|kgiBK zq&w0BaYA|`y^!8WAEYnR59yB#Kn5a%kip0hWGFHW8IFuVMk1q-(a0ENEHVxmk4!)& zB9oBG$P~mGnTkw9rXw?unaC_;HZlj9i_AmjBMXp)$RcDh;({zemLkiL<;V(TC9(=x zjjTb|BCd!V;*NMAo`@G>K#Yh9F(clH58{jXA^u1J5{LvL!AJGm?aCL6VUaWGk`_*^Zs$e6S;-lM(!YYk!s`~avyns zJVYKLkC7+HQ{)-)9C?AfL|!4UkvGU&e@Avi)H zBtjuH!XPZdAv_`=A|fF&q97`wAv$75z9T=7pGXbz3;B)wLH;8DkXmSMv<_Mqt%ue} z8=wu*MrdQS3EC8GhBilApe@l>Xlv8~bwt~sZP9jUd$a@E5$%L_M!TS0(QasWvh z_C$N3z0p2sU$h_EA02=WLz9G3Z!y96BDIfKEgwp_9=m zs53ehorX?FXP`6DS?FwZ4muZ|ht5YApbODO=wj3bU4kw}m!Zqi73fNI6}lQ-gRVtg zQ8&~b^*}vQFVuhkLS&m;>gBwZYnA?XdP(2dpF33G0k?!MbAIu^}>2% zeXzb*Kde7C02_!6!UkhQu%Xy6Y&bRo8;Om=Mq^{JvDi3lJT?KFh)u#KV^c6^Y$`Sl zn~u%EW@59j+1MOxE;bLFk1fC!VvDfFmJ%Rz&2uW z*d{C;sa>=1SsJAxg>j$y~K6WB@Y6m}Xr zgPq0BVdt?6*hTCTb{V^ZUB#|p*RdPeP3#tS8@q$u#j3G;*nR8)_7Ho7J;t73PqAm% zbL<875_^Tc#@=9Wv3J;e>;v`@`-FYQzF=RmZy1EZ7=ob~hT#~2kr;*17=y7Ghw+$z ziI{}Rn1ZR8hUu6c`;Ps8SjF3#k=9%@gBGn-V^VI_s09+eer&H ze|!Kw5FdmO#)sfT@nQIId;~rcABB&`$KYe}ark(A0zMI+gipq&;Li9|d>TF-pMlTB zXW_H)IrvdJ6= z#7(#v_r`s2U)&G(#{=*{JO~fQL-2KYC?1A~qwyF#7T2j7eD!}sF{@Pqgv{4jn5KZ+m2kK-rsllUq8G=2s@i=V^K z;}`IY_$B-@eg(gZU&F8CH}ISIE&Miq2fvF~ zNwgwb6ApwU(S~SCv?JOR9f*!ZC!#aah3HCjBf1kk2q&T^(TnI!^db5Z{fPd=0Ae69 zh!{)^A%+seh~dNtVk9w&7)^{J#uDR*@x%mTA~A`WOiUr1iK)aiVmdK{m`ThcW)pLW zxx_qTKCysUNGu{26E4IOVkxnVSWc`URuZd-)x;WNE#XSI5$=Qs;YoNA2Es^~2s7bL z_z=E?AK^~~5P?Jx5ln;->xfVyj0h*z6A?rt5k*83F+?n}f!IjI5u1p3B7sOGHWNw2 z79yEQA+{3Ri0wowkw&Bw79xYlB(jKXB8SK&@`!w*fG8x2h+@J@ln|vv8DS&Ji3*~U zs3LX{JBeMyZekCym)J+_Ck_w?i9^I;;s|k+I7S>NP7o)FQ^aZF3~`n?N1P`v5EqF{ z#AV_Nah146TqkZ2H;G%sZQ>4bm#8N05%-A)#6#i{@tAl*JSCnH&xserOX3yrns`IJ zCEgM5i4Vj_;uGfb5 zC5Ms2$r0p8auhk597B#J$C2a73FJg_5;>WiLOPRE$!X+tat1k*oJGzi=a6&BdE|U@ z0lAP|L@p*>$R*@bav8atTtTiRSCOm9HRM{-m2@NBNe|MK^db$Uku;HJ(wp=leMvvk zp9~-a$sjVA3?bK%p=1~tPOc{-$Vf7Zj3#5qSaJiok&GiZk?~{#nMiIXlgKS(GMPed zCAX2=$y73pOeZa52AN4_k=bMpnM>x8`D6iENEVUBq?IfoOUW|QMwXKmWF=We?jU!P zyU5+-9&#_akK9ilAPgi4q3TlgsQOd`sv*^gYD_huno`ZE=2Q!+CDn>*O*v4GR2!-- z)sAXUb)Y&@ov6-K7pg1Ojp|PIpq!|lR4=MG)raa!^`rVz1E_)2AZjo*gc?c>qlQx> zsFBntYBV*58cU6%##0lhiPR)&GBt&ArlwNUsOi)UY9=*{noZ52=2G*h`P2exA+?BF zOu0}?sHN00YB{xnT1l;KJvLIzgSJPEn_+Gt^n?9Ce<$KwYFRQJ1MJ)K%&lb)C9F z-K1_&x2ZeSU8J*Qq!FR545Yw8X4mU>6Mr#?_0sZZ2r z>I?Oi`bI$%Od%9XVH8dg6iHDOO)(TpaTHGplt@XGOevH~X_QXcsqfSe>L*o0{i1$T zf2hCIKdKg8o32CGrR&l4=>~K|x)I%&ZbCPuo6*hb7IaIx72TS4pdINpbX&R|-Jb41 zcceSfo#`%gSGpVBo$f(9(LL#2bZ@#3-Iwl1_ooNY1L;BZV0s8WlpaP8r$^8u=~47( zdJH|59!HO-C(sk=N%UlT3hhi!rKi!;=^6A)dKNvKo1FhCdIi0bUPZ5_*U)QeSK5tsr#)y-+KV>OM%qN1X>Zzx_ND!3e>#8;q=V>SI)q+F zhtgqmIK7^Zpd;xhI+~85W9bd_Mmmn(M90$!bRxZ(PNKKa$#e?6mEJ~gr&H-PI-R!A z8FVI{MQ77FbS|Ao=hFprAzefl(^k5KE~U$88(mIU(3Nx*y@TFK@1p-#O4&>AqxaJX z=!5hj`Y?TjK1v^>kJBgUlk_S2G<}9XOP{09(--KA^dO${z3nwYv^C}Z~71Ym;OiB zVrnyWn7T|orasevX~;BU8Z%9prc5)YIn#n^$+TixGY*U+(}rowv}4*c9hiGD(~IfN^kMok{h0pD0A?UFh#AZbVTLlpnBmL_W+XF;8O@Ag#xmoW z@yrBfA~T7Z%uHdNnW@Y)W;!#2naRvzW;1h`xy(FfKC^&X$Sh(OGcL>$W+}6bSk22FA#k7&GI|_%ObVALGviFo8@E6U>A#>zGg`j0tDf zGZ9QA6U9U`F-$D8f!WB!F`JlpCV@$0HZw`g7ABcVVZhj)+0LXgX-qm}VKSIZCX2~t za+q8ukI82Wm_nwADQ2up2~*0HF*c^0sbDIZDrN_>li9`WX7(_9nSIQD<^Xe$Im8@h zjxa}=W6W{p1ap!(#hhl&FlU)_%z5SlbCJ2kTxPB?SD9;?hlexv*X6`U|nQG=9 zbDw#@JY*g*kC`XTQ|1}-oO!{#WL`0^nK#T^<{k5%`M`W+J~5w}FU(iw8v`*ggD@zA zF*rjoBttPY!!RtvF+3wMA|o*}qcAF?F*;*szB50VpG*z&i}}s`Vg54zm|ARYwhmjD zt;g198?X)8Mr>oY3EPxy#x`eLur1kEY-`qmb!6MHZP|8gd$t4Hk?q8GX1lOm*=}ri zwg>CP_GEjpz1co&U$!6HpB=ysWCyW>*&*yub{IRH9l?%dN3o;XG3;1&96O$!z)oZ* zv6I;;tTQ{6oyJaQXRtHbS?p|f4m+2f$IfRLunXBm>|)l1UBWJ9m$A#)73@lO6}y^U z!>(mrSvS_5^4Pt}Y5Oy6K%7(Gw?0PnWjbx+P zXf}q8WjC-J**JC+8_y=NiR@-JiQU2`vnlLWb{o5$O=Z*Abk@RVu$gQYo6Y91xojSr z&la$SY!O?`TG4t6KIi`~ucVfV88*!}DQ_8@zRJ;?8Bdx^cwUSY4Y*Vyaq4fZB`i@nX>Vehil>^=5A`+$AO zK4KrUPuQpIGxj=5oCD{`wc*-w?YQ<_2d*R6iR;XD;kt6&xb9pJ&WY>E z_2PPSeYn0{KdwJFfE&mS;s$d=xS`xIZa6oB8_A90Mss7hvD`RrJU4-x$W7uVb5l5H zZYnp8o6gPPW^%K*+1wm%E;o;x&n@5V97 z;5Kq`+$JubOW+c@&0G?so7=`8s@Ez8+tnZ@@R?8}W_# zCVW%A8Q+|5!MEgF@vV6W-jQ#^x8>XM?fDLTN4^u^neW1P<-76S`5wFz-;?jf_vZWX zeffTTe|`WzkRQYk=7;b@`C~AH|R6$M9qMar}6G0zZ+T#82j@@Xq{Hei}cW zpTW=MXYsT7Is9CH9zUO7z%S$%@r!vEehI&nU&b%zSMV$ORs3px4ZoIm<=uF9-h=n# zy?6s}FgKjEM9&-my3 z3;relihs?&;otJ_`1kw={v-d1|IB~kzw+OBh=+NEM|q6Ld4eZ-il=#oXL*k2d4U&s ziI;hWS9y)sc{~4||H1#{YxrOMZ~hPem;cAt5^4)|gt|gKp}x>SXecxi8VgN?rb08J zxzIvrDYOz=3l4&#&_-x0v=iD39fXcTC!w>@Md&JY6S@mM1Sg@V&`ano^bz_B{e=F) z0AZjoNEj>(5rzuGgyF&nVWcoh7%hwu#tP$v@xlaQqA*FAEKCucg{i_cVY)Cwm?_K> zW(#wKxxzeQzOX=8C@c~d3ogPEVX3f8ST3v(Rtl?x)xsKKt>7xS3GRZ2;3;?s2Eizp z1he2R_z1p&pWrV92!TS75G;fU>x57tOb7?#w+JCph!UcO7$H{JAZ!%kgiS)ckRT)q zn}sA{i;yg&2wR11!ge85NE6Zpi;y8?3Ryz7kR#*@c|yKWAQTEkLa|^KN`z9OOt1;% zLWNK%R0%tTox(0*x3EXpE9?{Y3kQUQ!Xe?Xa6~vN921TUCxny2DdDtmMmQ^+6V3}4 zgp0x@;j(Z=xGG!|t_wGWo5C&Ows1$dD^v^jg!{q+;i2$Icq}{-o(j)|=fVr&rSM94 zExZxl3h#vX!Uy4_@JaYAd=b71-vmg21w=pvOuz*~AO%XG1x8>6PT&PW5Cut)1w~K= zP0$6q@Ll*J{1j@0U&3$UkMLLcC)5&ai*>}hVm-0G*g$M3HWC|)O~j^RGqJhYLTo9v z5?hN7qNCVGY%8`C+lw8@D^Y`-=U<{^9^}pg2ez zEDjNeio?X=;s|l1I7%EXjuFR-tHjmf8gZ@YD!Pg8qKD`ydWit) zzM`M#F9wK#VvrathKTFLP%%sl7uSmsVx$-)MvF0GthhnkD8`AK#CS15OcXbZN#YhU zSxgbPird8PVyc)Xri&IaL(CMj#B4D~%oX#*e6c_*6pO@S(JGdRrDBDnqi-bsult_z=$cmiEi-IVMk|>LcsEV4Xi+1t5 z_(S|D)`-8v-{K$fulP@_CDoSdNOh%pQhlj`)KF?9HI|x4O{Hd1bE$>YQfei&mK-EU zsg2ZDYA3aqI!GO*PEu#7i_}%>CUuv3NKR5ush8AS>Lc})`bqtz0n$KekTh5tA`O*> zNyDWP(nx8PG+G)Xjg`hp97QjU}>DOBGV3R3+_@c1pXX z-O?Uuue49vFCCB$N{6Jw(h=#XbWA!fosdpSr=-);8R@KaPC74LkSq|4G3>8f;1 zx-Q+2Zc4YL+tMBBu2e1ElkQ6oq=(WY>9O=gdMZ7Wo=Y#Jm(nZgwe&`ME4`E6OCO|< z(kJP&^hNqAeUl&wmJkV*FbS6kiIgabmKceZIEj}8Nt7f>mJ~^qG)b52(s${H^i!&l zeo4QjKhj_6pHxe(E!UCj%Jt;>as#=c+(>RLH<6pl&E)2C3%RA-N^UJX$c}Owxvktz zZZCI`JIbBp&T<#ItK3cQF87d~?IpyqimARvbXFb`^tW@zZ@V3%0Y6l z93roiL*+0zTwX6n$dPiC94*JlvGN9aqZ}u1lH=tBIZ@s$C&^pnWI09NDsPjw%c*jj zoGx4B3^`NIlC$L;Iakh;^W_4$P%e^-Wvg5wm&#?bO)i%!xPz9HX~ zZ^^giJMvw*TD~XWmmkOvk`HB2gekMPcU&t@zSMqE5jr>-AC%>0J$RFiT@@M&r z{8j!YLozHQGAd&-E)y~-Q!*_xGAna3FAK6LOR_90vMOt`F5Bhr@(=l^TqFOIf6IU5 zzw$r1mQq`(qtsREDfN{GN<*cQ(pYJtG*y}@&6O5POQn_4T5(Vul{QLSrJd4V>7aB} zIw_r%E=pIWo6=qBp*Sf$m0n73rH|5A>8JEp1}FoSLCRodh%!_erVLj`C?l0o%4lVb zGFBOP%SaDI7C`*-P z%5r6evQk;4tX9@2YZX_;O>tK|6i>xVF(^jGq?i?N#Ygc~{1ksBKnYZWlwc)9S*L_5 zVM@5NUWrg5l_(`ziBV#e4a!C(PT8cyD+x-XvRO$|wkXL;in3MNrfgSIl{6(?u_zfz zrjn&(D>+K8lBeV=1xle(q!cSwr9>%J$`qSYu2d+MN|mxh*{SSOb}M_7y~;jizj8o1 zs2oxbD@T;0$}#1*azZ(&oKj9JXOy$bIpw@^LAj`0QZ6f3l&i`$<+^f1xvAVzZYy_` zyGpfkPr0u=P#!9el*h^w<*D*ad9J)rUMjDY*UB5^t@2KJuY6EGDxZ|k$`|FU@=bvh zSV0t2!4zB}6jGrST45Ac;S^pG6j6~BSy2>K(G*>=E8mqL%1@<6`KA0;{wRNye@ZR2 zwpvH6tJYKNs}0nKY9qC=+C*)tHdC9cE!383E48)ipgO8;)V69nwY}Ow?WlHAJF8vP zu4*^6yV^r_QhTbs)ZS_zwXfPw?XM0{2dabA!Rioos5(p?u8vSgs-x7=>KJvbI!+z0 zPEaSRlhn!T6xCUss!mgMV7(I!B$W&Qs^B3)F?`B6YFqqApRFs>{^n>I!wG zx=LNGu2I*juBw~ru6n4Rs+Vd|jjBmCtKO=Q>Z|&x{%U|4s0OLQYKXc{4OPR`aCN;J zp+>4vYP1@o#;P0CjcS~_NsU(%)I@c&nxt+~lhqV;tGZ3yuBNJKYPxDsGt^8qOU+hu z)Lb=B%~uQ5LbXUOR;_A@TB??*Hnm)>P%G6cb%(lB-KFkU_o#c-ed>PofO=3pq#jm} zs7KXf>T&gidQv^5o>tGOXVr7+dG&&NQN5&IRR0uf3aPM)sHlpm zxJsy`N~yHUsI1DVyeg=oDyg!nsH&=|x@uRyt3TAAYK{6!{jL5{|EmAgT3T(bj#gKz zr`6XQXbrVST4Sw=)>LbzHP>2bEwxr!Yt2D()Y@omwRT#2t%KH4>!fwox@cXsZd!M( zhvua9)Ou;XwLV&3t)JFk8=wu;25Ez}A=*%Fm^NG+p^el=X`{6<+E{IzHeQ>cP1Gi7 zleHp`)zY+d&7x&!nOc^Xt>tLBTAr4# z6=;Q8kyfl(wGypVE7NRRxmKZ7YE{|}ZKt+N+pX=<_GW%cqdK0~=-b`<tpn>`Z#^OK0%+TPtqsrQ*>v2 zsya+CO`W$_(K2M*oFVGk2i}c01i@ro(sxQ-*>nrq?`YL_3zD8fGyXtPb zyY8WT>R!4*H|i$ctb6M|y07l1`|AOEpdO?L>mm9&JyZ|V!}axggdV9!>Ct+O9;FK&f&(JgVEInJ#(R1}YJzp=-3-uzs zShwmWdZ}Kf+w^k1La)@T^d0(6eV4vl-=pu<_v!of1NuSzkbYP{q94_d>BsdG`bqti zep)}HpViOl=k*KvMg5X~S-+xR)vxK-^&9$4{g!@PzoXyPtMz;Oef@#{P=BO9)}QE4 z^=JBX{e}Kgf2F_H-{^1kclvw%gZ@$fq<_}G=wJ13I;6uoqN6&d<2s>}I;GP(qq91v z^SYpmx}?jxqN}>5>$+Y4uK&<~>NWZ={kQ%{|EvGgYuRht>)7ks>)Gqu8`vA#8`&G% zo7kJ$o7tP&Ti9FLTiILN9qf+wHukpmcJ}u64)%`rPWI0BF7~eWZuai>9(E^tPkS$W zZ+jnmUwc1$fBOLYK>Hy3VEYjJQ2Q|ZaQg`RNc$-JX!{uZSo=8pc>4tVMEfNBWcw7m zvwf<4nti%`hJB`emVLH;j(x6uo_)T3fqkKUk$th<#lFP8)V|EV+`huT(!R>R+P=oV z*6wO|v%A|p?4EWnyTNX>o9t%0x829?YxlGJ+XL)@_8@z(J;c7w9%>J>huhcNBkYm( zD0{R$#{U1Y_a4w`EZu@GpmxqV%h0B2XUnwZ9FNm+5wO7O_Vh5oe@4QW2?)xFS^%cf=F%MtqU#NKK?R z;*Zot0+ISiFwzhSMH(aF$im2?$l}P7$kNEN$nwaF$jZp7$m+F$nMCV$ll1l$o|NI$ic{=$l=J5$kE8L$nnUD$jQj5$mz(L z$l1ub$oa^H$i>K|$mPhD$koWT$o0sL$j!*D$nD6T$lb`j$otrm8c7?Lfxnb^`bts z8m&QVQ9oLT2GDvmh&G@hv=I%X3(-aBVsr_*6kUccM^~UL(N*YbbPc)|U5BnmH=rBQ zP3UHH3%V8EhHgi9pgYlB=x%fmx)M^B(9(NpMY^bC3y zJ%^r0FQ6CEOXy|v3VId2hF(W+pf}N5=xy{4dKbNi-bWvx579^HWAqR73HlU$hCWAM zpfAx^=xg*1`WAhMzDGZxAJI?fpXg`w3mQRDve$q&sdH18rmjuhnz}djXzJP2tEqQWpQgS| z{hDH%`ZwX52u)zqfF@!S)I@56n+7%wY8u=$q-ki=u%_WnBbwrxMmCX~kfu>h@lB(f z#x#v>8rL+wX+qP)rvLTtSl|+Xgk}kC6FMjKPZ*FuOc;_dJYhsaTta-p)P!jXGZJPe z&=OJ-(h>v-;)Lu3c|vi5I-xY7GNCrXpAbsekgzM^NW#U0+X;6P9wt0ac#-fv;bX#| z311R^B>YVHm4KtPq_m;5rF5orqjabAp!A{)r;MZ^lz7S*$^^<}%2dj4l;0_HDDx=u zDRfE_g-zj7coYFeLdm7%Qwk|cii)D9XefG03B^D$Qp^+!#X+f{xF~LlkK(5UD2TWWi1M`{;p4{A?pA8KD}KPpTePK~3IsR%WmI)OTkI+Hq=I-iTbuo1{ zbpv%Hbr*FvbszO0^$7JS^#t`S^*r?=^$PVW^)B@u^#S!U^$GPE^#%1M^*!|?^%FHh z{YL#sjiEKCwV<`6wV}18wWGDCb)@y6^`iBm^`-Tr#nJ}QVA??1P}(rs2--**LK{Vk zr;VkJqy0vs&=P438jHrJacLr23C%<^)5>WsS{-c>Z3%51Z6|FvZ7=Nr?J(^m?E>u* z?K15O?HcVS?LO@>?J4aY?Gx=!+GiR{!_sl|X7tYVF7)p7o^+5tkUo-5rpMDK(r41= z&>3_VolQ@nr_s4|9-U7Y(evp_x{9u*m(h)M3*AYtp!?`G^jf-~UPrH|FQqS|ub^+F zZ>R5|@1*ah@1gIbAEh6spQN9qU!Y&2U!`BC-=#mIKc&B*zofsSzoCDif24n=N9ZU$ zCb4y5o5Z$>of5kw_Dt-P*f%jYv40|z2qz9q9F#aDacJVO#JEIqVtnGn#7T*h6Msvb zmpDH$IWaYnpD0MoOw3KpOH?P8B$^U!iS|TSVs&C5F_gF{acSb}#5IW<61OI9OWcvT zGjVs~zQlux#}Y3jUQWD{crEdE;{C*jiO&+BCw@u9C3Q*aokU22lLjUYP8yLkGHFy& zeA4u!8A-E~79>%UI7t~v!X!~rR#J9SPEuY{ev&+?G|7-;O0p!`lN?EvNuH#dq}rr# z(xRm0Nh^|8C#_3bpR_4yN7AmO-AQ|r4kR53q_|q*qCAlHMmplD;SXOu{g* zjAo3Mj8=@cjCPFnjBbpmmE*VLVPad5-C3$-CtYms}axy2Go6Jwn zNzO}_CKn|aCo7WG$=YOHa(Qw^vMbq}T$Aii4kxcjUYEQ+c|-EXEv_Cmy_=$-%oy!{73SWiO^P<9B&9sXo#IQW zO$nqlq%@|4Qx>KyPFaz%Hf2-F=9Dcd+fsI>>`vK}avnDR8` zRm!`RFDa3fA1RnrY--EY9;v-j`=s_uC8R>B!%|13j!m7GIxls8Dm|5xDo)K$m8R-a z^{FMPrKyHgbE-Afnd(Y)r+QL-sZqn-sVh@grLIj~m%1T!Q|ji_9jUuh_og07J(qeR z^?K@!)LW^yQy-?jPyLwsIrT?s+q52O{nG}dk%TCKnD@c>46{l&^v}w9DeVQ%Jp5{!eO7o_L(!yyA(-x;KNn4$^Ic;m& zwzN}eXVNaG-AKEa_Ac#X+NZS7Y1s7U>Fv@xrw>Rcrjyc#q>oG=l|C+gQu>ti>FKl5 ze@~yAPD^K`C#Q4MdFlN0jC5hTB)uSAovukQNiR(|q?^+1>CSX-x-Y#ty(T@79!w9X zFHB#Nz9xNR`sVbl=||E}q@PJYpMEp_R{F#AC+RQKo6^6gV>m51?Kqt|T{+!2Jvse3 zc+No1a1NOh&za1b!1N^TXmmfOG$aTjx!a#wKIaMyA-a5r){ad&c$a!+tia!+y3a4&K% zaW8YPaIbP7aUXMEa9?s?ao=#?a^G>^b3bwaR;~P36tz{mz@io6n>1l6XuWi^u0>@d|k*yi%T#XXV*>E}nrCVv)x4xhv4 z@pJh_d=+2I*YQjFWqbqQ#5eQH`IUSx-^cg!8~7o9n7@#}jK7k}lfR3&GX`Y9 z8G|y0WQ@z0l<`}}^o$u9vohvqP%~&5^o*noW=2XzT81zqFGHFk%g|)#Gb%G&8C4nX zjFlN%GPY;z$k?5+KjT2g(TwvM*D|hW+|GEF@hRhT#`laL88HGt&|1(&&`!`%&_&Q) z&{Hr-Fjz255HA=l7$=x0m?rp5FkLW1FiS93Fi(&mpbHWONdmSYRgftV333H_fv_*VEq_(g~c z{}TQZVl#ovmYJN^O+YjuV!A)yqWnR^F!vR%+Hx$GQVd2%>0!Jh+2x;i8_foi@J;Yi3lQ4G(bcW z4H69&4G|3$#fcEn7|}SS7ehp1i@6g7y#qNSpBqD`W0qCKL6qQjyiqLZStqVu8)qN}1i zq6eZEqSvA~qIaTZSuL`&r)P* zvkY10ELT=lmM6=XRhw0p703!^ZOqz~wK;2B*50grS%wZSiZ6;UiLZ#Si*JeVitmY^ieHFdiC>G~h~J7oh(C(Ih$G^^#NWj~#Lcr?Ww*}m znB6J6OLq6{9@!(ak?i>FvDp){f6JbkJtsRMo0XlKEyxyTXJ(7Cv$J!v3$hEdi?TJ@ z+U(Novh2!iZ+30=qU>ea%d=NzugPAQy&-!?_Rj3x*?Y5(WuMHxlzlz>M)uR}ciHc= zKW6`#{U!TnHb#P##7H_wI!U@odQ19A@DieApoA86O+?Cr$tVyoDMl1b2{bp z$mx?4n?uYQm@_12XwHb7_?*!>6LO~H%*vUYvml3_!^~mlr04K*vT|~A@^cDuigWZi zB{{|%OO8J$m=n%fn6o%%NzTfgRXJ;O*5$0v*_g94XIIX?oc%dRa*pPl$~l{JJLgf( zA34u*p69&F`Iv*|e9iflgUbbSo8`93ZI|0Vw_|SS++Ml;b4j^y?!erkxx;gj-1ywl zx#M#u&UInt;zN0*5x+j zhI2ROZqD7BdpP%a?z!9xxfgRUZtla}=eaL)U+2EbeV6+w_j7KGyw-W` z^E%{p%IlKXJCBqH=MBsoo;MHKr~=kqV*zs`S~|1SS){$Ke&@&Rc} zX=`a)X*+3mX-{cyX&)&`I!HQLI!ro38Ye}hqoot16QvX>O-h$0N?FomX^J#m%8~M= z8B(z{SE`qmNKI0kv|L&tt(3Z@Ua3!7Ev=Q-OT*HI(q+=+(iPH`()H2}(v8yX(!J7S z(i75?($mu0()-dE(wEW?(y!9*(jQVxLGyxk1w9Jz1p^936pShuQ!uVzV!`x+83n%= z%qf^#Fs~q?AgO>+kY2zk5Ef(>j zIJR(F;mpFhh4Tujh4eyJVM-yVkXI-!R2P;NS_*B26@}iy`odu0!otOc8wxiTZZ6zX zxV!K`;laYAg=Y%S7G5d5UU;kUcH!N^rb0|ni=viAt%|x7^(g9H)UT+25wU1U(TJi^ zMPrM`6-_Jpt!R4D%%X%MN)fdvv4~N`EJ`U#E8-OKiUdXCqMV}qB56@!k+Mitq%G1F zl@^(c97UByt|DJiuxMq`x}x<(TZ;}AohUk0bhhYP(eJ=r7KGud<5OW9``D*Gz? zCi_eFL-tFCkz?h6ytTZOytllMoG2eCA0i(rA0{6mkCTs-kCRW8PnXY-&yvrU&yz2Z z)8uqHOP($l$+P5Qd5%0!o-Z$y7s<=y2DwFUmD}W1a<|+g_sZ+!0eQW=LB3GFNWMhA zT)tAiO1@gYM!sIYLB2`8S-wraOTI^bKz>qwN`6*;QGP{!Q+`{1M}A-aK>kGjLjFqr zTK-=CS^iD_m;Af@m%Mp#=i=_gJ&N(ggkoYbTs)|FaPjEkamAC0Cl^mCo?1M;cy{sc z#RB~7Vj=T zP<*iXQ1Q{?4g?TwzdH6cvg}MU5h)2rCvU7Aux0mMWGh zRwz~~Rx8#i_9+f2jwwzl&M3|*&MU4eZYdrro+(}^-Y7mOJ}M%LuZr&qjIz11wX(gk zv$CtQo3e+pm$J9AuM$)aR1Q-PSB_AQQpPJsE5|7(DJLs`Q_fV*RW48_C@D(1lBr}V z)07+~SIJXmD22)_r9_#lEKn9HWlFhHqtq+QlxAgxvQk;CtWnk~>y=^UV&w|uYUO(6 z2IVH@HsyZh5#=f6CFN!1HRUbkedPn?L**0YGvzDg8|4S(N9AW_lkzWRGgWg{D^)vH zdsQb@KNYANpcb*hc3O{&eREvh}LeX0Yh6RMM{Q>wG7^Qz0LE2?X%>#94d z2damvN2({PXR24KPpUsv5f!TXrus|uONCK4SGQGnRQFc*RmZCPtMO_`4XX#Khp9)Z zN2%l06V#K`Q`9rmGu5-ybJg?I6g5qqq-LvA)oJQ1b+$T3U8Gj4wQ8NZL|v|~PQ?ygH)3md-30j7hrxj{N+H9>vo2Qj(i?lMW zQft;av@We%>(SO~gW84KW!kmc4cd*`&Dw3+?b_YiJ=(q6ecHp?W7?D2)7q=r>)IRI zTiV;&JK7i8SK3e7&)P5AChb@4H|=-rPc2r5)5YijU2|P4T^n6nU3*;zT`yf99bO0N zNV9Tcsx_n)M zu1KfW>2!LXRcF&x>8f>&x`n#sx{bQ+x*fXRx;?tRx&ykSx)ZvSx>LGyx(m81x~sZt zx*NJ%y4$*Yx@WqVy4Sidx)^;6eM@~SeFuFfeP?|aeRq97eXM?fo}?eFAEqCvpQxXt zpRAv%pQfL!U!bSy6ZI^8vOYzhuFuqG=_UFCy-KgqYxSjigWjk&=`DJz-mWj#SLiGC z9(}FeuMg=P^~?1u^sDt-^xO5j^oR9F^hfo_^vCsQ_2=~G^*8jl^pEvV_0ROL^sn`A z^&j7>%h zrBh0$m(D1ql+sHROH)hJO4CdErGipnX=bUYG_SOS!`MVGJF}aj8rzXY|xp4vUg=4%089-Sr#e#TK28%XIYG)jiI}thoPsTuOZfeHxLc5VW=U_ z5N{Z7m}r=3m~EJAm~WsPSO%VfZ^$x;4cUe~gVdlj7z}2E#b7m*8=@}147G+jL(tG@ zSZr8t*lgHp*kd?iIA%C)IAb_(xL~+uxM8?sxM#R;cw~5Dcx`xN_+a>G_+W5mKw{92BXPnHrk91qtoazdW_Y^T4SBD-WW74G%hkOF)lT(Fs?MN zGOjkRH*Pd;Hf}ZUFzz<)HSRYaFdjEvG+r~_Ha;{yHa;=FFupRrHNH1SjHvO4@uv}E zYGG<=YHey`>SO9>iZ%5&5lol|B(*e^# z(<##h(?!!I(^bAMMQZf~9$_A5o@t(Ko@-uUrkH7F zx|wNao0H8c<}@?UEHr1Dv&<56fmvpjn-yl2S!dRp4Q7kkYxbFI%#G&d=9T7E=GEp6 z=1u0^=6&Y<=7Z+L<`d?V=CkGt<}2ps=2zzT<`3qN=1*qS{LTEA`G*;2iLtb>w6(Oi zbhPxf#9Bbh01MFqSzyax%Mi;53)zBLMp;H%rdVcKC>E-PW}#b{mNZMcg=67bcox1T z!y>duEozI#qP6HPr51z5VzF8rmU2slrOM*7)LBB7uw|iTv1OTMg=L*(t7W@ohh?W_ zuVtTQzvY1Cu;qm1wB?NDyyd3lw&j84q2-z7h2^c~PfNt|-SW$Vu>#g+)^^tR){fRr z*3QtdS3R?$RM_b2Q$6F^_Ct0Ujr&)iq&a%?2iB_hSWo28Ft?5>tm2b_k z3amnFwl&u(wH8|yR;5*AwOcE#9&4?&&RTD6ur9JLx2~|Rw63#mvTm_%wQjTSuvh^u^zKtvR<}cv)-`Yw%)ZqwEkgzYJG0~X8mscVFhf>Y%OeUZ0&6wY#nV~ zY+Y@=Y_YcfHiB({ZJ=$qZG>&4jcgld8*iIvn`E18n`)bGn`v8MW82bge4EggX_MLt zZACV%&15s%EH>>cf$?Op6$?LFv zKG#0ao?xfh8Fr?fZBMbM*|~O}U1-m?7uwZ!t-Z`%XRo&h?G5&@eW87&eYJhJeV={5 z{hp-5ot0y&SzA zcn8S=I|e%993vfMN4#U4W4vRsW2)mf$4tj8#~cU6L3gkmDUMV}nuG7ia0nbZj(kUf zL*^)UXdGIH&Y^cW9F-2YquNp92s#=ZVaGzpGRH>8R>wBScE=9KUdL6(HOF@yCTzX+0Hr61#TM9odIXqxyrfTxxu-`x!t+LxyO0LdE9x@dCGa(dC7UjdDVH%dBb_n`NsLd z`Puo!`Q7=;*{r;IdF%2v<(4bGfCwyu7l!s=T_qro5rNu{>Npwqjhxq>9NEGb?6S z%&C}HL8+isBvvFvZG*$ep z_*H?ejHzr@*`u;gWoBh|Wo~7DWof0c(p+h;tgLibdMaxw8!N+=3oDmbuBlvGxuJ4% z<+jQlmAfkURPL=jSb41Sc;$)8la;3{&sScmyjpp!@gw*oy9h4OHNZu3!LE@m#5LMA#x>S8&Naz3)iupE&$Ymn z;G(#aT&b=!SGtSi;=3|j*{)nyo=fT~a22}LE{#j;GP+DIhs*8qx@uhYuAnRAYIH4j zt#GY!t#hq+ZEP9dsRX9dR9Xop4=pU3J}cy>PvCy>oqVeRQF&udZ({Ock!G zMODkH4pkkix>xn6>RAu;HrUDL#u{W4X+wi6<;;FYE0Gms;O1es-{=X zuA)@Ys_0dTRY_HhDt1+R6{jk*Dpa+wYEjkFs%2HntF~2bui9C)zv^Jsp{nCmr>o9X zovXT7b-C(F)wQaJRew}Hsd`cMuIgjem#RqBUsXS=aBjfe(%shG)7{5C&^^dK*ge!e z%ss-5xJS9ixTmCd4r>`g0gZF@*0UpRR$TQqC z!ZXq{$}`$C#xu?{-ZRlN$ur$E+w;4J;z{(dJjtFEPpXIS5qh#bc^+4l@pkw2^!D}k z^A7M5y^xpW9q1kI9pR1hBHnoKXzy6>Wbbd@>E2o1+1|O{1zw7m?M?HhdwE{IH`6Qj zW_$C!Qg4B`*sJiWy;`r%tM`_A9bTum((Ceiy?$@N8}=^rF7+<+uJo?)Zt!mQZujo= z?)L8S?)C2T9`GLY9`YXc9`PRY9`~N`p7fsap7oydp7-AL-u2$|KJY&B{^5Ps>8tX2eKo#1U(na+TjX2f zTkc!wTjg8h+v?lq+wR-#JLEg+JLWs#JLNm=JL5a+JLkLNyXCvJioCYNUEp^@Qq4)l;gcSI@1U zU(Kjau1>4wR`aU`)#B=$>b&awYH4+0by2mc+FY%wQP-5zm}~4c6*ZMLu9{FyV@01^RVVg z&9j<*wXwBeEwL7=CDjhC9a)Rij;S46JFa$o?ZnziwbN?pwMn(iT2?K)mS3A+E3eho z>S{}BOKT0a##&RYxz-~-Xuz#_Ct$)3LlYg^+n}551r+=4!w|}pH zzyE;$kpHOvnE!fBdl)8*ML7k{hQkPq|rfyx``nrvETkCez?X25fx2Ntv-Ql`pbtmi2 z);+5GqwZA+i`3x)EdnhAodVqg-2*)Wy#sv$eFOaiV1N`D5*QgE2av$1 zKzv|aV0>UgU}9iuU|L{SV0Pg5z=A+RASu8OBnMIhX#q}v8{h?kflweESRU9I*c8|t z*cR9o*d5pxI1o4zI2E`OxEi<>xE;6~xF2{PcoldZcoX;#_#F5W_!{^T_!+>}$J7J$ zZR*?BcdYMJ-@QJz9$ydE52z>B!}Y`Jhu0(Z@%5wY$JS4)pHV-%es2A|`uX*=`lNbh zeR}=s`nC1z>o?SIuHRa}t$us`uKGRo`|A(XAF4l6f4u%={rUQf^_T0f)nBi_QGciY zVf~Z(r}fY4U)H~=|5X2H{g?W$_224$)c>l-1hGL}FeV5Dn+012TLs$$+XmYO+Xp)a zI|sW5djE$xAS;*}0|s%7V(EDyR;Y2Frrxpe1Mx+JcUtGguz147!8W!TMk**ce(+#fs;JQO?;JQ+M6ycoO@ycxU~d=PvZd>(uid>wor{4yhS&zMVL$_^0d5%BFsNa0!^npChS3dU8YVSN zYna|JqhV&loQAm#2@RA6YC~c}QUkMr-H_Ul){x%7Y2Y>p8pI9R4U&eOhWv(thN6bz z24#b`;aS6{2DIU811{7i)G5>>)HBpK)Grhp8WD;MkwZvmRA_u?VrWw6x6t&^%+T!6 z+)!dDDZ~wBgao0?PxI(5cYr(AChj(Dl%b(CyIu(1Xy!(9_WK(96*4(7Vuw(4V2t zp`RgKV~fVtjqMvdHg;<4+}N$Ldt=|mevO(&ZKJNStkKwLYBV=m8f}fP#;V5J#=6E} zV`Jme#+8k08`n2(Xx!MirEzQHw#MU)CmYW+UTb{N_@wc9b zsqt4ME*ukX748u3815AA9PS$K9_|tD749AG6Yd`d!=&)w@R0C`@W?PZJSsdUJT5#w zJTW{eJS99WJUu)kJTp8iJUg5iW`vnxR+t@538#lSVR1M+oEOdyOTz`>!mun{9M**O z;i|AZ>5?V6I}WVXk9tVs2q>WA0$?V(ww?V;*3l#=bF8gTI)l(N9d&@E;~>{0kE` z0ECGe0l`EK0brsp17o5u1Y)8u1z{qXCd^mNH_Ts{@0cH$pO{~mf3JDKV6j*nHU?VdJr*v171fvE#7g zu@kTpv6HZqu~V>9vD2`>VW(qfU}s`yVP|81$Iijd#m>Xd$1cDoU@2HCHoEZ_n}|)q zGO$c63(LkPV^grH*ywgLEC!tO~2fYOv9TW~?4tf-S{*v4^qeu;;NCuotnHu$Qq{uvf9yu-CCS zus5-{u(z>yuy?Uvu-~wMVZUR4V1HtNVgJ1}|9|`Ww`hQhqv7bd=yqou1INU%a8Vb{ zxD;F}E)AEC~wQ{ZxOdANL>6jy*N#6=(2;^equ zoC2rBsc_N9FE}kuhtuOqaHY61oB?OVnQ+l1J)9M1!$loB;heZ~Tm`NY=fXw*=;1s# zFV2Un#?|1WHH zfTh4PU^%b?SP85GRs(B*wZJ-HJ+J}T2y6m216zQtz&2nzumji$>;iTJdw{*bK43p^ z05}L70uBR5fTO?(;3RMcI15|^E&-Q;E5KFY8gL!B0o(*`0k?rWz+K=Ta36R8JOmyA zkAXjcC%{wS8Sor<0lWlW0k45~z;F%y$+1&n%VG_& z##mFVIo1-pKlVWE!PrBwpJM-v{r}SMe^1+@{{KC-|8L#@(=>p=WAQkA3?9HY!#Bsb zz_-M=!nek^!MDY?!?(wGz<0uT#&^MY!}q}V#`nR;;``%4`~W-=590^o2jK_fhv0|e zhvA3gN8(4})`T{MwuE+s_Jj_Ej)YEx z&V(+6u7qxc9)zBRUWDF+K7_u6euP*;e*&HW5(W^61c*Q)z=VN>L4?7Cp@d31bLj3IAA@zpar-NFp!@OahC*CL|M52&sfLLOOv%;1VQ+96~N3 zkC0E05;O!YK}XONN(iNdGJ=6%{D;3%O^CX6Blrn*gaDzQ5F|7ZLWD*_n6Qwrh_INj zgs_ybjIf-rg0PaXim;lnhOm~fj>ig226hH#c}j&PoEfpC#gB`$*U?;E(*cI#sb_aWaJ;7dJAFwajA0&VvH~=Jq5J&=tfy2QOU>rCSB!dVz z8XNHo!3p3*a56XroC;0@e*>q3Gr*bPEO0jXJ2(fN3(f=QgA2d}kOERc8kh(s zfeerdvOqSN45omoU>cYXazHMa0SZ7Nm?EOTbdF3^agd&;r^)2j~RL!3wYvbb(c%8}xut=Ye1~SOeCAey|P9^3$K1UG@3!7boca2vQC+yU+c zcY(XXJ>Xt&AGjYp03HMnfrr5(;8E}xcpN+do&-;Ur@=GeS@0Zq9=rfv1TTS?!7JcZ z@EUj>yaC<>Z-KYLJK$aL9(W&o06qjCfsesIz$f5S@EQ0Vd;z`$UxBZ|H{e_F9rzyn z0Dc7j^KAXsDcpc&1DX%$IH2bM`~bp$p#%Qw8vnC%ctk!igD4;hiJ3$ZF^ecBW)mgE z9AYjpkC;!C5(|ih#3G`MC?^&Z6+|UbMN|_tL@iNA)DugHrNlC#foLR}h-RXNXeHW+ zcA|smB$g8^h?PVav5M#>dWc@4k62BtA=VQ8#5!VtSWgTR8;BudBQZ=|NL)l*Ok6@- zN?b-PuxJ1<2_PYq35lRANDO5|5-11Ch4P?$ND37|g-{VBgXB;#q=1x=3Q|KFNDJv8JyZgf zLS>KvGD0TE3|Sy6WP|LG19C#;Pz6*8xu7b@4S66hq`9Pdr1_);qy!R$L?zKk zbW$QIiNqi=Nh}hZluSw?rIOM}=_C$`OX89EqzsaPBqU{$M5HW|n3PS*A?1?tNq;+{ z|C|1AYXA%5;20Qyo5L;OmT)V$E!+-n4|jk&!kysGa2L2M+zsvy_kerCz2M$(AGj~v z4~~WV!+4kggYW>D2tzOlhT%c*V0Z{T6dnc-heyD1@JN^pBk(9V9v%&kfyct*;PLPT zcp^Lro(xZcr^3_V-{9%+40t9y3!V-C4$pz-!t>w-Fa@T>i?=f8rKx}HSXJg%*T@nWRN_7Oe8~O z5*a2BBo87FCJ!MGB@ZJHCyyYgE66L!tH`U#YshQK>&WZL8^{~U2g!%Xhsj6C zN6E*?$H^ziC&{PCr^#o?7s;2%m&sSiSIO7N*U2}?H_5lix5;4u1Ghe zJJJK`iS$BxBYlv*NIxVN>5t$M0sGG7K4xj6mX$kq8+< zkWolHG8!3!j77#F$$PhVFj3^K-qC@mZ2~vubAqK>Vm=H5!L9B=ku_F$|iIgK1NG0Mzst`Bg zLA;0$sYYs$TEvgkApxWw2_g+h2x&yZ$UH$B`4rN#qoA z8aacUMb07TkqgL0o(P^1a@ihM)9U)}sawfKLFUo{`xLegS&i&rfMx0JLDw#5AZ zJYX?b-s3R8e#JxqqBM)rJW7iwEu*xG(mG0;C~c#(i_$*IKdG$)2KX24b;JMDWaADxQ{m|q7bMs@t3!X(VcUz7iNj;3IuQ~!6u)M(pjQGSau z{h!Z^8JMPDGo#0|qRhs$!2BMK=R}zsWnPr|Q5ImLr)xAMMAMWg)F`wl^eBl@lAG(-QIt_sQT|B?bu`vsI(*mu2j<>8 zJc{dj_@A~Wj=LSlaU2_$Bu?zuPGZMS;@EhZS@m9KcWI&v5Fi9d0(E*79f>N@MG*)D zLbFW*L~jBFvqkLAXlBbS5)wka?t3)I*vU8fzImVL_s4IZ=X3A5=bm$JnS1Zd?urM< zGk{DW3&;lkubl*g9K_MG0Bjc`zWzm!FGhSNOA!C;rSL2LGUSYJIp|g(LwzeDUxoDl za1#fEuLgZCum(YqweY+CI{0OOJ(M>98-Y#0W@PBRJkaNZyam__Yy-Cc%Rc>Y`um@3 zc0jzHKmnXYKfVe37kTF!^$8({r_SAf86K)7r7j%%w~{|DjhQ7p&p6fZa^v}BO-K|kmvCV_;m1`jDevA!z?j6z!_O(3Wf*?Kw%H?L7+A z_r^1*@6r&o$@CMn-uEnOsQfAVneREYY1s2RlZ-Mv(w)~?Vewu*qOJ{yNU0hJ-SmQ*r(?3RAPX7VD zmiY-f68RKGET5rV^&ioKjz6JWvj2>#az019M|^=6*#Cn53i}d0BYcI9_52kzKle8j z+3;4D&O29X0T;;dumx^I%^Um+kKf0BuD}6X>iy&c)6uQc%LVKqAq16Zc z(Zb3Abfzf~?du3aw|aw7S8E751Pevmo5E0oBOHD4tq7E9k3(i&`IzL;Zut zqc6ryKu;%6M138T&@XM1(Y4>kqZ13JK#Zwqg>M?#bT$FCR82=Kn`WRTzL{vo*NNym z8MDxa!$~O9JR8j&GY1{<*<5sJdotR2BL!ubr=oAoo`=48Z$7FkN<+uJoQ}4$@Vf58KN6?Vb#pq`nj-qdzK86NfEI|w2K8}8K z_yoE{Q;Kf>>Lj{6?GzfCP=@vdpGGSZ%F!EtWzduo9r~VEk3Jk{Ky@RGXp7Z^zLQyj zX8J18?bpws{Ljv!ZQqPq5%c&tf?xKgGtjKZlL!e;zZv`2xnLzlgP)Ucz>oU&fNF zU%`C7SFtaqyoRM${S3?g)$7>D^v|)3A#Y&c9ry)ik9-qLF8?K#O9$MiO~ zYR@~E=98h=!3FPPpEbRQrKP`*z0myub~@|VSh?ainD6v&v5tlhvCo(N4%77f9vkKO z2z%`N7&|Eb0qYPy!EXHGQ>^SapJB(;f5eImf5Lh?|BUS{{T$1x{Q|qU>Mxk*^DnWl zZhnQ?JN}AgJ^CB;@9$X8wy&{l$3L*8J>Os*+_zX4Hw@dJ{vCFyQi;V*8IFBfOJapJ z6c$mT!jvQZFq6+8J5(Qlb#@107czq|n=2R-YC^E|$DvquYZ&IUgkz<)2&{fsB<8;` z3iEv(jb&eo!3tAjG4>9P`L3$5cMuI`5wzIS$`RO5!$>SUc@$P@7>zBzJO=A<#9>*x z$6^-KIIPJt9!q>@0ye91BIYZfgdORFzjyjJ9-HHvf>pmW6`QG;hNT}#z<%vF9b>X) zVA;NzSfwu!8!~Ygmhxs2CVFRMdG4Q}4vmNuWipKfa(C{>@ zttlOQ6rO>_ugb*O=d-XE&t_w_({ivyoeQu}?k~jN@-D){UR#W%_b$OUy}lG1@{eU$ z@6zSiC20k=ed|ih*|Z9~oU$4leIys-Zmz-pR=*a@{B#}0Us;d6?b`tT*@(?g+k}nE z-Hcte4)X9@rv;7n{xxNfb93459LV&uUG82L&)CX8voT=YY%ExHjy-fzNAY<`4&v8EYQtbdHXbg>0{ zYh)|dm)C~X&1%Qqt?j_he$a`nDDJ{uHg#jkz8}CTBX20{PQ#Tmh2(;sXzP#zuxmKev11k-rn#W{#X8a{6gIe_!aI& zylCi4cu&yFxcBxe_@qx?#f$Z?;gftn!$Zcuj@M8AIbPcI2Hx|`FL3PnH}Sc?U*g$I z-@i6*v4}X9o`M<{BwEqUTSN|3_@B9!? zoAo=q@!s$8p2CmtYTw7W)%OQHzyA}wW%wf21{&)D) zekI;FX*j;Vh{R`RQ}|t*3h#;a!__1G@tU{*{FEaQPZoplN2$TM%Nc^7zaNVG-VVdx zc8BAy%!|NhpO3`%w?^R!-O>2+_haw_j##{}oyOmKQ;koYt--&1SBp1|9f6lE9*HxN zqi|x@X#6ev82o23arn8`vAEtf4&PQj9{;R&0xrZ&#IsjV!fQ59#_t!$<5dw;@FDC} zyzbj+_~*R|c+1-9cu(I9eE-KY@x_ir(9Ocr{+5KFtDcR&)iejsUpp61aV6uvZ&Psm z%~U)$dmdiO&Bqr>X?VFW9q((&!0Spg@sdxo@FY(*p8Y}&?mN2xf0kW{Pc2x4cls9N zpH?ivn<|&$(M`+nySdBpSFf$Wy}p%r`kqy|*s~f>eK!|xZeN2}5^M2W57yxwzV-MA zr#9fJ-)zJ?3OC`mKHZEbeVB*$s`GKKdkbE$aw}f{_BPz+*^URE+JR^LcH)NF1^6ek z3-OzWcj0AMcHQKD@VMKYn550eo&~5#CpF5cg#t!ozzH)?X&omszulAq7Z}gVpzNV9SZ|^DGomz&cR-VRFUM$Bye~H11I(2w; zmmY6yG~nISjd-%hgu5Fn@Mn7}@tYlI@a)Y0<}<}v{JXw$IP<6qAErBx_at7xi^Plg z!@f&+&D_iQ7|#_v=Hyj8;odd;i{;nxgxVYU3;j3YURC41mRopqO>-^Yns^`ooVVj~sSdp1B@RC`n#Z?psKY;| z1)Lux;*~j0T&#ED8<)B9>>D0@YNmw0O?vTf9zMWlG}YsWn;LM#HxFT+8}X8kCfx3O zgg+D4jQ0+CjCWmb!H1W(;`WDaIO}c4x6kar>5@*o$Jd1y`nvJ4NDp4==*4|U`*7RL ze%u%C!_Raf#EV@h;rj|BOm3X;q3}nUh=MqzdxmJ6JcP*b{e-wM>{;S{{-?xV_BmqY ziRTG)?F)qY>lX=I?@Po-*vo_>?-k7NnR;eRBS?)ej; zEc-LzKlXE?uj31%aNA!9;l(crxe4&j?W zmuN~$CYl^6M4vvDXu33y=xLcx+_0q)_bbzh{@x72JTH^zxtB$BjLIfz`f~{KZwrVO zQ45KzmPN!UZZQ$SEFsJ-ONp<0ml2ulf7(CGi5$-gLf}>shR;?JV}`9Jro`nE&a5@W z+v#hGeBV04Ub&v|HEkfKWo;zl$~F;YeVYk=NgiSUAKy3U6OYoi5Vbj5i7$V%jric) zb|P@=4x)I>PQqm`ARZqpB=kFX5yOt}CT6eQLqzj?iE8+(+@25iLpukEKXn%oLrV`5 z>URzi6`vj^hRr-eEbT8QJ`Oob^q7tjKi^V9JU{g~u_*flaWub_=z|Z!^&O{(&gwG4 z_xLnX(Ogb^`*fHLfpqGKo;p3@u^Wig=|*B0{5@}GQw7nISV?4eogsRf&Jt@o&Jq1J zRYXPqc_KUg0@2iRk!UNwL{xH@iM`KVArhBdC9=m|BlNM?iG4jch%XP_B%1kZBKf^r zM4S3Haa6cNn7^zcmiz7!_g}h4RD8)2#+S@Q<4g-t8EGZxJ{ys3swJ9w?h~~>JJH?l zAVfV!w50Gvc2XTNuSOuc%p$B|CydKQbX2(svByLFK3*ak3%$gNLl21amGwkZR|9eM z4N?5^ z={)|w3O`Zgkk2Z1`hKbyBR;3_ef_*5rvC-SvO8W^~^Br+=b&jsH~9pZl4jvF(ovPW>lEdgq@Nrum;MZuNel=nwykqG89EinpHj@hb)L z@UM!R+`lO@UirHM+48lbvGE^@QM0~L6u&x-ZR8*!yNGR)i-iT+jZv4?mV?DfnL|DeTy6#r5DhiUVD96#+Yw6>s;Z zDEbwtinkumQw%GZuedNOO<{4TD;g9TidP+(iZ2VZ6pp3Yiq4BUin<326mQ2bR4k?z zDdMw!9Q%8DvEtpzC5lSxQbnV8nPOJQa>d`c6^e+im5Q%=Rw+(2uU2#zauutq)+l^y z)++pWtW)ImuUB+m-=OGqZB$fuY*IA+db0xAm8a;Km9O~h`>_9%Z&AQ^xWG1GJFo-T z2^0W@z%F1num{)+>;v`#2Y@2rAaDpc3>*Q9fuq1NpaeJ$oB&FJlfWsU3^)yx0}P-8 z^nd{{0w$mWs07XcXMuA-6>uK709*tv0hfU*z*XQHa2>b-+yttDTflAL4p0N!1?~YX zUi;CCE#V? z72s9iHQ;B!>%h-}H-KLNZvwvr-U5CFybZhq3HfTh4PU^%b?SP85GRs*@f8elE34pPun*V|8~}=dgTNu+FmMDY295&9fD+(1Z~`a=P6DTZGT<~& z4lsZY&;tg*2$+Bhpb|I(oCVGSRls@R0&o$y1Y8EL09S!)z;)mTa1*EoZUMJ}J3tL^ z7q|zofElm=R=@_-0`~zs-~c#)2kHO;5CJFP0^EQHkN_|60H_BVfQLXM&;&dJnt{ha z3(yL*0qsBs&@H<{MX|9L!SAsZU6sj_`#5V->+c~egpg#_z?KrkbnNW zhkw`i-w*lkrcB8Wmp}86kWL#ujT%c)tcvx6l0O^32C@&SU@C|WW+SK&c0L)(hOyyn z1RKdlvC(V{8_UwHn$@scb_6?;9mS4j$FOniSauvco}Iu>WGAtc*?4veJC&WrCa}}l zG-?JrlTBo2u}SP~b`Cq2O=eTrRCXRapG{-a*$g(5&0@3J9CiV_kX^(sW|y!_*=6i< zb_KhVUB#wTtJz$34ZD_I$F65Lup3#1)v=pJZdyT!$-e7OC)$A?yHhYJyVehi{Se7-j7S_tz*jn~JYiAuS$MS3)E3hK#WL>PA z^{^7_WgoEhYyL#8bD%lM9Bd9ThnmC8;pPZ)q&dnQZH_U=nrXAztTAiNBg`Ysqs*htW6W{pvF35+ z@#YEUiRMY>$>w?&bCx;VoMT>KUT9uqUTj`sUTR)uUT$7tUTI$SKYUg{)#RGjnAe)u znb(^)m{(hJEo&@mE$b}nEgLKwEt@QxEqRuF%NEO4%Qnk)%MQyIj$2MxN-ZZXrz~Zb)0T1zW6@dk7K6oTFvzBv~D$9Ax1Y70Xr2HOqC&4a-eSwdI!Ow&jkc#&Xwk&%#>F7K_Dd zu~}*@_bqmd!@^m3OPxiqh!&^iKhINx<)Nj~(j;3vvNX&2V@r#r)zW5Zw{%!KLDOaF zw)9wfEq#`Li_-ezSi`NPm9na=e*dKX-XhDI{ZyYbC@pxZL6C*kMb^dECDx_ZW!B}O zUjeMNuClJSj#G|TPEbx%PEt-*#w({Nrz)o@6O_}HGn6xxiON~ZBqf5(R?bn*RVFJ_ zl&Q*j%3SLj>ssqN>w4=3>qe_mIb2C9DWyv3r}S3_Clx)) zUxlp-CxmdYGxlFlSxk9;8xk|ZOnX6o*T&rBCT(8`q+^F27+^oz~<}0@- zw<@e6m)TF-gQ#+Q2F2LNQAw1}uD6e;W>W^c z(Vj}qBTe=Sd!;>#%BIfP&)Uz~tL*3P7wi}9m+S~KhrDcWq?)KJ_N(@5_UrZ=_M7%< zdjfUKej94<*lX-}?f2}g-E6nmt)ThW%ir-t6W|DR1UZ5oA&yW-m?PW~;fQoZIiejg zj#vlnP&+gZtz(2^q+^t0v}24T&N0?8&M_W*Qyudh^Brl9bVr6G(~;%KcH}q~fWB_{ zlek5WgN{RvFzT@5h@;qX)N#yF;yCU&;V5;SbewXOIZivu9gIWg&^ru{nUv9Ca#T1f z9cLV89p@ZXj`NNSjzsFB|VgsxaGL*xZ|jC+;!Y@unx1s z;;=ewj@rTT{PQ?l9IcKvN4ulL(dp=NbUS(+y^cOdKO6zg%E!tUWvjAH*{^hU@n9U<-)jdE`s~#)_z=S zrXEv|s1|A*H=dioP2?tVleu_q3OALT#wBpmxf$F{E|HtXC2_O4Iow<>nM>hPxp~}t zE{#j)GPq1Gi_7M6xCPuoZV|VbTf!~nmT}9u72Ha06}Otp<<@X(xpmxnZUeWG+r(|= z^0<6%3%8Zq#%)Z|QCKpalB&)ew+$8cgcZaLt?sE4ymK!_V%vm@q zXX9$Q`<$JNBOM&ajUz)To(m@HIDr#6C+Fha+;nmVnLth>$CDFC4<~V6?g3ZNHE<8P zDbzfwk!#`}an0Ogu7zvm#*%GZJJ-Q=a$Q_E*TeO4eOx~r*~58~r+5|b$NTdEd>|jh zk0OKl5I&R-IIffj=$MIwN zar}6G0zZ+T#82kq`6>KVej1;^Pv>XwGxj-^Go=p{4#zyzk*-Mui{tpx%?V_Ex(Rm&u`#E$c_9a zelwrP=kr_mt^78AJHLb9$rtd2{4RbszlYz;@8kFL2lyiXAb*HI%pc*4`J?Zj6cnn^9--!^}K;M@+Q85ujJ40XZdq{6@Q+;z+dDq@t654{8j!Mf1SU< z-{hkSfd*<_l>;x{x7c3Ryz7kRvP*77B}m#ljL{ zsjy5~F02q%3af6bOaFE@8K@ zN7yUu6ZQ)Sgd*Xfa7Z{T91)6zqrx$vL^v*-5K4uU!YQFlI4zV5jGzyoca9+3|Tof(|mxU|BRpFX&UAQ6K6sm<=!foM>P$S$G?g^}57A%5QunD!o zeZej`1Ww?EIzbRb!6~=|x8M;Z!7Drv>V*d3q0lHa36F$k;jz#nvmQM3FpBjupp= z0$EBnlHi0{CX0{B6fsqtC(aks#B?!3%oHUuOUxE?#0BC)agn%KTp}(N zmx;^872-;9mAG2W71xMs#dYF(af7%~+$3%m^Td2{i?~(XCTqLAUo@x`@MJH89b%>o} zm)I@#h`nN;*e@!b!=0p)a;ltuPJd^BGte3240eV%L!DvHaA$-w(i!E9cE&hkowQT! zOe3c_r#h!O6P(kXZpuZ?aL#llI%hePoU@&CoO7MY&J<^=bDnd)^M?_^=PhTtGsBtb z%yMQsbDRsD3!RIci=9iHOP$M{%bhEnE1j#HtDU*dHO{rpb=PwjF}rFJ{_IQKgDIrlpcIE$PIorj!a3M&M>!9n9>o7P~aI_f&+Dsdfmop6=9PP$IH%3P;i?{Iaxx?J6^9#^lcZ_x6`cjE`S-=%a9cav_)t#bRh{oMiX zKzEQk*d5{yb%(jb-4X6cca%HY9pjF5({8m}0yQjFPx~I7l+|%7N+%w&Y?pf|6_iXnZ_gr_fI|aN_-Sgb@-D&Q0cZNID zo#oDU=eQTR7rGa@7enoL-%+HJ97*kWkEX^@anwX=E;WftriPOwIh-P?$y5q8oyw#p zP;;mQ?jrX=_aXOT_YwDQver9+gjRp|(=nsGU?bb&o2bZc!{%NZqE))E?>%Wuf*` zHI$XwNA0H$P({>1Dw;Y(#ZZT-SgM#hN*$w0C_QDM)Rd93QMHsGWumJ8spl1BC3&B+ zQv+l5Cl`CU25?WInlt+)8dEcaqiQJ+gqjMY3ced7Cto zd&oPah1^TlkXCXZxt}~h7Lfpo%xv%Jrg_=J(E0> zJ@K9?o~fQ`o&?Wy&kWB@Poig*C&@G0Gv`0H{G<a)hX|t3kK#q(@S-^jK<< zTBSCrUFwiJr7o#k>XCY-KB-?)dWU;SFXdHv{k;C(0B@i-$Q$ep@rHWCyy4ymZ=^TM z8|{tp#(HV5+N<$uy(7FMy`#LNy<@y_-m%_s-tpcE-ih8x-pSs0?-cJ;?=)|Mce;0m zccwSdJIkBoo$a0Do$F2Zrg&4m^StxDY2I{ihIe2zncggKwl~MSz`M}9$h+9P#JkkH z%)8vX!n@MD%DdW|>s{kr>s{wv@7>_t=-uSq?9KD$d$)MEdbfGELj8P<9-)js)TQ|y0ju%;mtzKW0dyD>&IHnh!4b?#6@o;9 z-@s)7`B3csnCap0*9n8VTjPUh|G;3{6dVnj7$#6v78VFSM34|VcF+bvXh!{19;ic* z%3uW95~N|YgZdFq>t_XyWX?c@Q0N!@OE~%jSf2CG3kaugs)nmZF%hzUXW(4Wt5h>o zqnR;`GgyN0-;a$Ch-0GY_{eDbW=IU!t?|ze?}pwMgDrfk5uB`w3fmDlmWh>P&~mDl z({ap37~S`mH9EzA6g{390d*tkCGyJOVvFJu;h zW-+sbx$M6$fcHyLxkHvRd49{7S^hKW1bR7hHZYz}q&KOi(lh84%u29EkX3RzAi=-% zqgO*I7g)n&&}sBqkW!$pn}UVNbeHyzY^v+ zvy{%EPcTd9MRY0Xv*kOKAGQGU#q>h@By$+iTsksz zBi$8#1)^OAt})jky}?X?{ed9eQ3!Gq%1^G9bTzY&-UiWcF?;CkbOGHHdK+r*05wct z#7_DybB|%6w1eJ7n<2L_gxYzeDsx zrV->O<`L7(JZ4%3{RW4Gv_hE-u|cbCOgqR&>ErYfS_3D;NVpFjOs8z$#gH(2-5{T! zdzfD43d~L)l#bCQ&{jXw5TMlQgNN&m#zHh5r85NGg_$dZx`m-|9_jpaCux7(K$`)& zayn3ViVo5(4hzT$YHv0NK0uw9U<4~=t$i>hzTbvl&=OFX%ii-3xm}Z zql?wiIs>$z)@gKF-3X{32_(Wu&d`2vPxS8A0Yk304-wx=By+ zONP=3ziRpx9iTG!`KfNpZJZq3pMiey;U)f821~85gHyo%4%pPtsk(W(H7b>Sg0l4P zu=%=sbbUaY&P?wdXQ9`ITfxdk*V0*0>ALgaIdI*Vqo;>u=r}r4XQ$(19H5yOz|(cK zKs$o7N3vk21rQ4i=GSOJT5^$?{imWp=6 zdRYQBOLfb1%OPK(OI5>fTCzt2y?BZ>Y!%24>AKL>vMyKW4p<5IwUI7>`_)80qSt`F znJ$i8t6QgAuX{{4L~hVkN4O)l%g>+F!7b2IM94LCNS-cV*G_lPTXd&_x5{k|=!2i0d)q)aD$owI*GX^J8C6}fH>_>Q?IAmKJ9RxE z73j|URR<&l_tIyA+ky+9#ue3Jg&%i7W-_q%L?cN|-uSeM*-TTc$g$E7vhlr_*() z!sXgo0fq8hP6^ZN47v!l5o(kCCI(%MiBv~{#o;)UZUgLAc$*1`QCH|Hb!T+*0?+Es z>7vzDx@piVt&Rn|6EWv?O<@;wJNz!{Zp!QHl1>f!%MkC1j)kYlRh?6HO}8O>Tku1e zXN~&0u1uv>*9DDI-_SMsk5Cr|-qej$XN6SjZs~4=*BxNss?pumr3H>w-_wmzvpTab zPCZsVOTMr0`(tE&)HwCX@M~cfus#?xUOhoQ5n8qCY`R+AWRRw)&heRbb>A+EEL8!U7es7!N#d`>D;=9u^yeI^Fn!s`hjkyx?YzEu^ONZ z=eGKGc#LXU&_i9Lu1VJ%k)#e%J<^51EY4QXQTvB+s=4ZQ{>{3_x)kskxQ<3Y4$2EO z%d1VR5(8Rv?W$JY8QA~x!J;v+4dS)~9lBciX`3edb?Ulw>FR|cTm9DuXQ*cc?+a>! zvo}*cKdc*Uvt*kdogjN;t9x}(vec*RmwWl7Wu^W}4m(yo9OMPy6&p_Khr{^;Z@QqF zt6Hd5$yR>)#p*>+KQA&q+Fu_4y7K5H>OlQc&@EH12?^2%>zAuT^r27_roRg3X1MGZ z0qLE96<`%9m)ipNM~n)%>z5SV<-guPO4dc|WAyvOWAz98LSSvQMbP?ESUIcIYW-@p zM!zYtEqb}?u4+|?RzE_&UY!)K47(S)G<<`4o%*8xJpbVlR{s&;H&U++7Xlu^OmBqN zez-QNN9iBL>IZl8E>)JQCfXP~!>>hE5_vJAG;BYtx6yJxzV{iUuLkR#5G5_5E;{aM zU3kb?{W$#&^?3cYzG6Sq;0*U%r`rQFZ`rMe=1JU$z zA>FUu3pUyQ$@*RD!|HvqJ$#d=ZVx&Rt)%D=s#C#gp8kk>zWylGrs>o5$J7zwX{rqU zZgru$Se>aqAbVx$v%&KF>yWI=0nGw^Dac0kDfL4ABE3#+QZLr))n)1>`lb34P_s<$ z2=U6R3qh9aPpVhwSL#>kkE>5aRj60%yTWd%3}AH{$kmsq8FfO?8o8ad`gK2Q@B4Pk z!S2V`di^!OOR}y~eHQX5v5#UmfZs;_MfC;sCOLxt;Jw{E7%v0%f1dulI$wWAy+yxO z*4Bn>(=(AN;oJ2)RamLP&%P6)!$Ips851?N?!))RrP5|%YpyyvZ(FQ3#*#Z-&5=KdOfE;39H~ngX`mVYR-otLIl4EMsW{5IyRq4;m^)=ywnpaPW zoDmuqazTF|YIX3QdU3E{HG^*sPkaW_OHgwexT1HdMfFv^Mgt><@^$?UNN)lNQmwzG zzpa<#mhR|lK({CAuHFshdwQp=W%Xl%J+d@lZ6@YSSoUdwv{gSoqD}uu-L7vQY^g)8 z`@XeIc_ns&u1nvo@6q?_+rh36%Dt+7eYd(z-KAC<;M)s;G*FPv2vb1{??Z5B7s_|{ zNv!_C_2_gTPMGZlA1_E zlp)#>1GTXR+MqU2PzTRyC~FOVAgeSZ24ldR2b4!bDMS;b3D5*XX_Q>&uNiF^V~8`1 zHHdf~GRE~84g2w z#87NFYB*+?swpu{j=AYSP43lk!wEyFVFt+4t2P21tzt6QmWg4}9+> z=Vt~>0pVv2=M3u5DnoH-Gn{pM{mvUM7%m!if}9TZRm|SL5KMziqf9`xMKc^J_qk4%-*O1l|S7s%js6 zdfYQ)$m=f${8&R_bp7BH=KFTchUkb)jm2OEFPov(a4~EFSY8Xc59MhAol%M5YUuO8 zbvD`#I)@<(>N$`Qgg4X~NLcG*@i-opTdTooK;j5h8E%aN)W<4V6HsyV6ynj*~x|5zh!R0bZ@sKHia z)EfOG56Nvk>CIuyh`|^mjgO%>ql{BS-KtXgJ`Gr`jf@T{)=Uf;Z9J-39CZXd7sZxn z#u$%jj)Qzc6K5Q2Jf#_DJgF&#vI}}wrnwqct}%p-H=fo^FxtZ=%JC-|xB9IMootMU z5~G;{=~Ux1W5M9P)M+|{_e6&N=$Sx9Bp9a~^_m%jy_;#=3~N8pcsqI)XePs2F+h7p zAZgITq^ZypK)+`j8wTH2v!mx2=NglZDPU2lNgcGC2l@TrGn&1D^Fb<+cT^fk>BbC5 z&qBmZ<#26dph+S$t z2X(7sPs%%NnQ=MPuQ0BJbQLf^a`m9SZt&g@56(4Cg3~rFcFkZ7Jij3V%)N1)alNd& zq}gEH__Q_#cIy?exD0GEUetuhkv1Fij2A$YZ`@)mjM*w%Z-cZfV*69io0@7l@<4Q0 zuY;$-HBF~HV>^sHjn~5pjD^MU$KVoX}%(xkOHn8}Ddh15SWkYCLH? z1$mjQAMiZ=R4RWeF-DzH4<&=FF+yrGRv2qE7R_BvC6rc#nW4XDKspPYGxD%1SWT7u z{brT%-jC+YuCd9b^I&%Y7`QGP<6-4mL4V0uE7#uFTpp~uGMGQHylT8QSaxVQu)Hpp zZWwR=lU22G6`Y-Q8eWd|#Pj=9(A)ys+rS;5X3+1h(JAlPdxK?o_XFPtQLJ2+pm!pa z%}{bdZh2}2Pgy8?HCE7gK$3v(FPpJ;&~BpYf#yEQ*5Gb4XqtWiaCvak@M|C7(RcI*e z(TDPziz8@lAmg7F-U)G=jF04=Hya-tH>g^Scf(qZZN@2q^CFs}mio0DyEH2TI>4e+ zwptj_tLZX&!@D(H;Nl=Us0SkS0q{+gsv9hNj7sSJg5cIz3iesAvClYM+iz5wI^h|o z4JNf4gNK`#C_k`KY5ldmk%z*wMlFMW1!yVIrG=2DKrLm0@4B=q6CE22y0Nf-cgZK8 zpNaM>1t}%82Rv2=hG?~cq1rI*ipZvrxKMvnxb|4UXc%7*oIDZW32QVu0Aj(ZH+U9B zY6DGCP!p{UG980e8w|BE+7L)XO<|^-Dd8YRm>Pp4Wv?hxG~}_`(UA!uHv^Xj>B29o zE{3cMpyk+b&jQpSZGyE_6zYX`^|2Z)88bp#3VT!wHTJ<)V@$CoGKPj&Ghh~aqR+&t zO&ZghpgnNUwWblKk#cLJw4+R;wf6AQrb+TW8e@txjgec5(~dQbGmSS*knIM>^TRdK zGzqkmfw8h}yeY_kMAQ^0kCV$kSi&;|w9`xprrE0LrWqi^x7}c)i>Xx2G)>Und-|=# z_^3paU+64Tl4+85vNizvJViTEI}L2d|5MDVP)Y!1L##P+yzg6^`?Qn{()2;E6j_@W zep3GQ@xATN@EO|KvPF_M)l?kRA281}A1u>Mv$TowOu&;&I~#g8b1+W&)94wdYh8aY=xH=;QvLz}Km)20miCd>JJZMG=~Y!;a2K{*cgsDxYfM%!Z zw*P9m3@t!jU@A22GVLDp+5`DsU=7slGwlZ{chD9-g$&vhnbv`BJ#Y{-hk(O!%?9m8 z?Pje6v%E>W_~|<;e3}^aD~3D|ypEcx0~bUcgHk?}wraOP3g;Qz=@Qd%&~Afryh;gc z>4eE2c1(OoscD*OWWe5#sGyTjzg@Op1^XIe`3DENgEGT*fbLrKDN`BLZ-l+%7nTWU z>1ilMs}dj*{9+ki4yA!>r?xDJ8I*Tvbs*_Y2Gb>I-)Jh-7HD@vtQ`=;WU3gnf}Y85 z0+n)^g2>UqXG~)Q7eXJ-nl3;e&zbgUD`J`k-@4!qg;as;>7e$CT)Jwy2KjZ!> z8?nuA^xzJIyJ_N0b)Y|?E!AF5a-yx6SYSJY?Iz~HwcD&V0 zH_vnY>fpg2>-gP~Df!bOl#F+jlWWVC+|^EW+*jw|#TORlrF}ZnrJupfWJH3fm^7|V z&E#QifmSHdFcNev(}~uv)-gDBlsqWWGhMI^%)^pLkobPWbeHT=n;0|vuT(w2L{o`v ztGUK}6jy3t!aASM$~-QyF?KMXlsFi#&IxUa#>LEHo|Oz31Nx^Wy(P5y6z#LIa#^00ooq4Z$UD8MTbu%8OAKIIe!)h;>K2(g8d0Vnb|J_V8 z0p?wa*AQevOc)-gx{}=Y_azbLC&~4pQY9)GdP%9({g2TB5JmGKlg86MPrE%}E2E$T(gV)#ChQQ^9n3Z{~wjZ2wj%yMQ0Gg$Ja zWF@l-j4S%pXg`CuhWS{smYIb$Go(aKjsjnDz`!pL(pE8}CF3RE!FXicz-(m3O1_#m zF`Jo@k}b@yk`va;c#^j=8?3`5M>Uhv{3$6{KX?8pS#16dtOi-8;~IZL-v)g<$tvfc zAQ7^Ly`Gs)&9WOQS=UiJnO)3oMoS5XT1HQ>hlV{&8Z)z(Ic(p@>_-kOHH~;?qSa6{ zr~}Lamw_@-dCbc}=C)&lQAJrOGiAmO(qh=`s8jl#f$^$Iq}-QW4l#$}vs3kqgK|+e zssYv!W{$In@=*PznXaQG@)$!=$C6HGBxLNx+&QnQe!i8;w!)AwM9IK_N4oo3E3 z6k>tl&5ArhO*M_Kw`3iHD zX<@Dr&vm91as{p{K;2*>B(jvc$sBXGG2P}{jGuaGp(!tQn<>LuxdX1=RX%m@nC$0<%4(atc7Nbb2*l;ItRtt>n-rjlApg*0(y z8I@p?49Co&QcM~ip1E#MsWQ+6W>hnqT1;h0Cb_@W)GB1kF(Ok%GGawhdE(tb6&Q(G z3AB^g>#5Du8mb@r&wXYK(5=)1ri)olF~*0?T54Ro+p&ULhBv}w*#|~HdB1F@c2GM> z?oHGqW-rx^Y`vxjxCpXFf+n55#~wi zw7HQwK^><~Q^%;Y)OY3wGen+tc@{>Mo+fAHC-aLLV}1ks!;CY{h@W82QPZM$=1}p~ zJ313mMRW)HISH?L*OkIY4mAXW=P*psERfddUCKu6c50vH9{TE_7;2xg zE(jh1Oy0<4Fte)S=rv@p6CXh7o3Nf zdtWp``Ju<)PoiSpDH^t1IAY6MAbQIg1Ud(Og@|_*8UHe47*>jkL9{bYhxZx4iM|xjwdPCkPlOvdHmmw=>d1HP-y+)>&)bi*q>x$?b z>bT|R)H`QobXBz5^cMaebsx1lx`vFTP18?pbFPi9i$15;6QnBIi>F`%(Kn*q6x~SP zOOriao60w7zoIr+Hb=KaYjK*`3igkG##SAzAz8LXtMPu{9&NUNpj?RG5#1Tx72OSA zE%7%x_C)ta*Sg+Q`=SHXJB)CD^g#4rbQ04pOzI6NqOmtg|uN1np$>GuWr13Daqk_e?Zk9HP!b|Ag32 z)HmuJ^fC0@96cZX2<}YNh3Lg-KiQcsMTe=kE{kEk;VX4H+N`+}y<~i-m0Yy`3pLGk zHQExrMzY2*R?+zb(SOS+jOcoF6v!{C6`XPNboY(u80?$T@hM(gv|zZSyA_?FZb$D# z??#6(4!Nj}7j*3;GtT2t8rlCKrb9t~QVg^x>X34$*k~;JQ2(2n=Ejo}O+?rI^UGs0 z<77J%emqf8j%4aVw85Q%o{p;AJfzXBb7zPT=Q3~w=vmYpsu;~j)xh-bLR5myn`*HW zcSi3+m&*+IgQ$k&$G%MNOIP%i^&#=@B=#h4vVBBwle-(TC;B-0B-*Rw$>M6CMxRBW zM_&MW8MV4!LG~$LGkWM$)?7a@i_+uk=o?rzSl_YY25oO)y;EZ39xHJ_-^2b8rId)t zaSTL1Mn6TLJBon1i05ffcMJwJsLDG$NgG@ zwVpQrfahgQOwpo4TjtiYA@@9>bKC}YuGI_6y!mK?E_bhRuX3++uXfjJ11x6dk|sQx=RTkUtQhn z+#2<4)?+LKGKbyhUhm#+*x){+yiGT`ui56Z^WZC3GURz2(#=<57qBe~D~D6xW{hQx zW*F<)rrQF&oUj%u+(qnGcQw$(um#oU;@#>c(2n8V*NYrghS&BA!mLEQ$-I;`BjYxA zr(qfF?e6952CS$RY{5Crwvvq_N-jIxf6Uu-tJpK{IVRI>-&2i(ia za~@P3Gp#nxHGRPN@Jqt@nASZ3BCRJ<1+qTUCwjcEfS@BeI=fPr6UI_uCqgp$YYbh|ke$dz7oAJkl9f9kKZt?Ui9S$&gjgZ~zLo4vzs!bq;UTM18X zx$f@7ZgiJzXYa8Wu}^lejD-PLF7r)&hMVpi?kLN$G4>WB;%pn*G%_Su?1MPDOqTu7 zlI#Rol^lB;oa@FEEBm7E8JLeW%K+>b$H7mQi<9?^0vRtlR(J6Q_Q zSmLqUVs43@Fr1a|5}Q+2g3OA;f1gdDeZY2s{}43^t4(*$yg<)EOSz9}?wix@LylcV zeqE_8Vfao~%O(8%%tv5%vjNo>AW5vKE)DM#tK5_-gW6g&1a_9SNYzWaf@3s@Zx{AsH7Iok=#f*n#W zFW86fm+ULHjEty{#nWn*toPKjkTK@$XJ4};WPZCzRmw^8pV(eR`QU#7 z`NBN}|7Z3K+ovCd|10VW%QyCf1jnNzU+Z>9?8?l`|bdoEe&2EV1uyEA*&# zx-wqev6wyf+&)X&XLrP$@VR2MVnwkrcX8|qc1gJ$H_XPomBgNFUgCqY!$ zWPZ8bu^$-oH>@xZBE7Lu_ixy&Zl(5WKy0z52JyqnnEwEii&}XC zgW%%S9}CAKvC`OVSO!m7Y`J-w2XB(t+}OO>d|)#@(_zmvFNkS9<*~z>g}@e(NI81K zJ>gctFPA4)4Yb9voP7!W6|sAc%Gf^Kg&CfdeQE5Hbs5m*vD3v5?8Vv@v6Uo;+OsP5 z+O|<$;#eIEV2v9+mvwS3y~pHP6VoY~WkfF5%xhybu&oZkW%YbBuft!q$Mt&F$EsqK zVMDA4f1t537I)e`n_`1_Iyc9*pqKMzpT`NFSB`{T?5Rdu6WbQs9@`N+rgD3B#&*S) zk|%6;td@-HfV0iDC$=}Xk62|+3t}9wwAU4l|*umJi$>rfRjRv!)E_NtJc@7h9 zeXIfUvt^MZWLtpyG+9EPfG3O`V-5$}2x^dIob)dC96`*{*g5C1*c{-;W1q2FP5@g7 z>n?caiN3@`L+?E6h;W9MSc zvGeejdoIN0drmqp#^$L89ak)uVwYoAVy*TCo?DpxGS6JkY|qtLOYE*apsDm+i(QW` z^-L$D_)A&118Dbo(lH)bCbrunKxR?pvI{;BuJD#A z7u)F(WBJ&2PXWGmWgo_Ddn~$RB##8VGj_;R@7eFU4}AwXrMd^P9q@L=_Ii#u9>&7j zI?rLxBPDxx?5TE0wUEqU4Ok7RJ@7q_ZE>COJc*t26x4Ify+9bl)7Ud53M<6(Ja*R8 zMc5qlZihCLsrXn6Z#{jt}C^(OWfGHy79jPI1VmEd)`P6Bxkz419Pl)*(y9E48Y!Lca)NiO4JzucmE_jBZ|1B*_^l;2&8i{?6 z{fHe0a@lhQ?dTNmy60!?8W6AZS8ObX|E1Xfw0Zt0-kT&tE86kc1pd=sxDTEio*iTd zoepb8d?s4#@1(_!7QYMbR+lEOjq4Pw-E-EYkK-R@d4lAg-2vks$!m;rcy^-DO$yf> zx5TZA{`V^4o-cM=+&+am;?DSUGwX51X8|jU$4D-jT^uioQ}KjiCp~T@#sfL(^2RyO zP2(ZlgJT9C@iglFMAGp9kwMb_Agdu1569D$I8r#$|^)1zIkGU9D;O|=kMk7l=P5hV8O z_zC?IqP^C-bQMJF@;pRrJ)Z2!_|o_zPdBV(@yDJX&+_)(+a+mZ3TXGeUF?mO9k@SWQD!DB}B0Q}v! z<2&Ph)G=Op1tuwwEKX4ft1UB=m!*zY#$_g9oj?j!$kk; zsaO0B@gwow+N1GVnq%>Ao*|Oq4(|1F_=lBzClu~?&j^slcvJkOf}Dapt?2mD89%Bz z8$TC6ZTyW4&GGZZQ||iVF*!Dy8kOsmMp zx|!hOeCqw}d5kChZhYL+9k8alJYpPhp%cui5MH7UC8%dMRFQ7Sskr%tEft_)OjX_$=>( zco(7{#+}|_wch(EUS#Pex&M2V|60W)TMuD9jz3ZPU_XiX!hRa}dY>uLW}Fw>?9by? za`HTEDk4#nd7i3X#9zi=#cx@=EEK`};{Aww9baPbz`kTJL3_{o2G|YF+qm1iME?%@ zAF`G+#$C#q{&!UWTYnFJsW*%~1DNv<@d4N$QT^VK_fveH`m=1Sk71NK%+yYO(EA05 zT-K32=$vYrDMH3JsNk~iE79iyr@ix(bIn@p1+xkBTYM-U@D9hzyz{&x@$c~`nCm%S zEAsz;l^@8rgv9P8JBkY98I3Ol@-trH#s6LsrP4eG`8!?%pIrXL*LatD7kkHnPQ=sp z6<|+GRHBXQSCd>Dz0(tTC%V?bngMNQV!2n9P$$k9HLx~#wTVUWtn}&5jcdd7?zKZ0;X&$k1u_Wp+qtl#oG^~Dsci+_MZqj=g zZ3 zHh8yt>%7jyK`?hHW5Ax|btPsIR#BojQDZEDzSn!mOF_C5o`g5ygJw7R6D~4}VaIMS zod_hhkqp5^h{WO-wIxinT?F6i?I8Wvcq0VeGu2-y?AeKVraeYCuH?uRK6$lrJLW6{ z=ZyCc{J7sFK93c8%sZFpNs|e8uGu>e)?)JZUWR9WKJgtT`4%L~6OGUoCQf=65uDK; zC!Ryj#jsC6KkHqRs7RdiRwkOfZ}I#tO)N{Cw=Yi=Xo+h#K zXeP@kO%qn)|6NumE_&A_)+Vlzn5$@Sk(GGMd&#>FIoG3BB`$k!z_Y?|555gRt{~sW zgyh@=eRE<9+9Y<*rC8~0-p{%w=T;!qs5OagXeY~VFp4cN$$qe%pgR&f6Xlle=3TIM zCu$Qd-s|2y#IqM|1sU_c#D3^Ey;soxc``=qjEel5S(XRDI+&phjI#!9*EJ)MXV-kHSN#JL0qy*ZKco=;pzTm<)0;x5T{S?L2ambjY8f|c(a!3ZoTJYvE`a6lF_imyc_&vopc_ou= zm$#F|JwV%$5Q)wtByW{t9qs_GUwJyC2^P_(T=&6v5SAEQ1&O(V~9$fu}s>6EV{@fy}k?+dgoc8}wgH$%oMkoLLd zioIW9yUA{zO}v5q4mC#@BHBFB3TWRdT>Q%6D0<30&j2P>6C>prJ853o+l!P?_}M`{1=Irz$%pWFxPp{_=-gIDRBed zexj|_Wy!OGbG`C>eS!Tt@h0&$@h>+`F%c{FWF>3@1jQeNPM%-;cyj%+NQ5 zhxZG~|2NCOa&(F_iB`LQ67J7`@L!1^-m%2*#2%yD)WW+6Ff6fRY`SH136g+!PF|&rl~WZPC@j^Ki+XNIc%oJEca?{tkL*+}m2Okl?U^}Bv@6i!6Q zWe<6SyA%umX%%QiNfqMOW9=3bTn!6ftDqmVYl)6;2o@^oR-&S24>Yf0$=r5jed!6? zm-HteYUpI(ABNEvR4kJ(lnf^gU_R7E6zr$j3cEBp8@2=5N~~YAuPkZvX{>XSb|7<; z^Wd9L_`i!>KqgD6G4HfYS+jg^owZZ{dQE0HiElx&1hU9ijF$4bedS8OGUKs+VRBJ& zv4VIA-%Hvh3RXd6WpWKx!&2zW6dYf_6wL>IwQ)s~_W7Z$Oa{;fQCB6;J90Q-tWK^; z)>%WouI zj_PEEt|ocQwJmv7zdhMtO}ci#BbU|Mok=_H-Y#PAPS!&1Nfu+Dn~O2vOp)A|JPH5) zm%o7 zCE^O?)np6WYXsToyAIh(bopv;BySRZvu}g1EqM#NO~1*v#dkY-3}eBY3&>XA4vgY% zvOQVj<8+ec9x#<<8?cTf1HIZ8O4_g z_zwCWCbPCfzDG))?qm_cX|rXGs1h0_C@l8>1Fa2vGGQQ z>`%TkQ>k^|5_5=$QUFMR|0#{W+Ke?FsrK|SglOx6SYnmmTKfy~0U z)_@_xbo@|DkNS^ggnIPA~dEwzeMa~kNqS}k|p_fd5YoKdR|$bX9dzbqLy zaK`__JXi%L?vn2UqRrf8-$kE=vvM}>iqFnDI45`2=WzBIPuWk9x1Nh@AtRDAUH8r6 zZo(?!ijlE|qm;aENROg>IUmukf#-*I!}rZ$x3u|a&TVM*?ZlIC&v(by4sU=9av|=P z@2)QlUW6;<7~gH*Y_5!}A!}<>ncU}pN)$13xVhl&#K`7x^SK4kJAj&$=c}As$SvX) z1N~c;a1~r7?4_tNAM0DjE$8CC6@;;pOZZlCtGPAYT4Jx`)^m6CRon(*Z6qze^+Ik& z)uGQV3idZUo+GZBOJW2y#KZZv5xJd90h7xP*gLshTo`k{o2%v0!0k@nw+DD!m+|f8 z1m8YxKZ(lv4sbbN-Y0@{5J;D?;FF-&afi6Wgi(*S6UYPKeP5TafnbyUJn}vCb;E;5 z=Mk<4+FQp_?ilC7`KuK597g}xSFbwGoj??;YUH|IPkc>Wo9ZNYiYqqtlGusjkZO&( zQ9GMFPp7#xsz}ip&ZSzee(F2Ro#UFh^Q6xU+%xcB`7UyoxR<^czBTSEn&-aDT&?R0 zw?lIkoTp@`X@Pc8)9>r^EirAiUgNHF6S`Ke0q=^}zOTj`wl~N!Zoi{_3;6-{o$tK< z24bA%_pm>QcH@Pb z_kgRk&GdH>=0min$qD2Uv~I44)B7KD_~$(SZBrw9!Woc3i>mf({Josc|CD>iJty%m zxR;#8|B5sF`#1~ka6ds`b8jHua_@-s9_p*uPRwu<9#GKI|7nmX$5@FZZt?x)-c8 z-b}vKO8;GC_NR()k8axNRHY`63Z_>3LnIIWB@Xyu=xh8D@FUP>YBTscxz4}YP?}l~ zZ@+Gjw#q*{HR>pXcLR_)kW1CLzSO)_74lX>pAT$>dI8!^{&KV%fiFyH$f;y2Viu*g z_&59S*%zlyn(UaHCE&=V0PTpX+<9OpGh5o_bjoOU>7<^ zv}Uv|rnUC-sSBxN{)@1V;Cyl^b(~~6f%cTY$$!#+In_uId`BR0SZ%PcD*744*OIzM zkn3ozSSPKiv;NQ4bMW3s-AuIsjj5acw^A*t+o=r3U^3qUb~m+Af8O72Yfs&SRi)}c zD;I{yXzHSpUB=vGcV<&D;)|2^l0T735{*k;2KRwF@y~fuj!F@4i~ov0o#LUZOgEfb z^0dfaoX=7M&@5^kk&HeEO+>{>YHBaKs*EC^Dx|JKmr|XCfwLRrb;bKY!Q|M#r7N{e z_YnA_R5#k5RI9>$4C_g1vu+Tl;NH|6^2A0lsvC-5j&Fm02lXk*YbIw$8NcN}NX`k* zfZz4ca@_PkhqfBnHOq_CePnSvUjn&Ja=l9RrTSsLMs4@ML5nk)>1}GQwFCZlsrNt_ z|A*8->SO8?^m`;qX06hGP9^PIT>A5Hy)Etib{m!gfOey9EreH`sXiud2Zy_}ZD&O&;-K%VXC=^5!P?3rm5JlHGK z8b|?%HmysyOr5*+>D<&94PYF_eKV#-|JSMC^>TFHZ-UQ^YDrtuHpt0hPv5aQU^&x9 zo8&L}UBuJrpG9O*x_FA|(3Yf&byPZ}cBdcs?~{AvNqf`2^gdgU`J=_3rWI}=y;B>6 z?s0|EJ^rW0h$9TE+aF1nrau~+RFC{!81Xi82Y=zpXQ!j4GBD<#E}mMib74&u2cD04 z=^p$1^a5bz=_meo)}`d?u2`$5)C4r{wsCPxw`^ zHW2^D^rm#be{;H6JvrVjKtF5mVuV}Mul?1q7U8OD2zOh0dwP>;NBX97XZoGL*19Xb z-S`G$I$_$Ku1&x7?;)%ghP^~i=EI)`5^Je$zk-Ibst=?ODpp7grYY>Hl_EePo__$Kl|ruu(PGl z02}n5O`l6Qr@#6cQ`+*y|Il&(?}9GvH~;zcg*0Qon7))ACi8kZy;tkB-?ko^+AFT4 zucn9KYaxAHOJ9d-W;%RUT&#tjFmm>1y0XoIt>QhzvoxH(kJP5TI!wa`DrcS43g2 zBw4VpIU>NOk!PipewKczk-g919kD;QyhxYPFVnBmed%@T{`BkgoAlfCJNQEM`}Ax& zj7U6nBp=R@zz5PF)1M&aGM`TCKc|nF&SCA>8s^b+=`ZQ;_Bpi5um-<3B;8;-qdXOp z`~|cuzbet+(wm(_X)RXEaC!uo+3`JHLH|fErkBv8>7VIEbUFCH2zw!kl%xMs#^5>P zvf;XZLpzOqVmbXMy_z0RPo!7T_~vcS8K?0xv`gtV^h$aqaltG)r&*gW~^Z5DD9hU7y+vys3aHhjGEdW-I ziWTkLM=#_*;qKJZ*qQjn{2qDMnjE?$HU-2YxjZe=Wa<|4LTzJJ%L-Bk}F!_rZ5ui(g;x zWbj_v&o{wy9((Qq-hj5mG>WUm(@i1|^1lsr{2BTbI49|g_CtJ^;T&|VAGBxbi)at? z7wGeJGc=qk`3B^_L?7Xg^2hiq^nCSk{vKwu1>O_ z!dRsq)(ui4-Ao~5<6GEJ0^(IpsH0=>)SwXp-) zSw6$U!=+N0*Xy&IkIqHbS9~A;lzswF4}G8b`}x=K<8S%! z-SjD2m9~?9Oh2QuT8I8EpD{h4-|<~^Fa4f>;5>`IAJI>B$Fws413$ojS@ zA2O_UeBlTAul#-ueko~>kQ3r_`W5|+e?brN)wpNx>6dgr*j4&>^e}quqeuAfkY?>4 z;}3q6pXd4ss{!-=i+>9qtsUck1HqREew=>|WU@@~7s!e((S9J~S72Uder7?YJhMV5#xkHKFu1GmjE;|+bCf4dM=qt(ok6)GA z-2pbU%}@(0hWI$@o~hUbEWxoqkj(50>H}?# zX@+!WI%a#l%Zi`xBlG5jOePw*e3&R$kUSvVWnV?G&hnl{>_Np zWJ|!Jc}22gU26NF*{q*j{hF25GXbBYU-A4Wo2qUZ<$MhA;KBXTnvmrOJc5rrmKPP znJWQ}{VH<&ApZZ1>PBER^HafE12+S|GGm$Fu=CiV{$#EP#xti4*GT?0(oSUBOpV5c z$U9jY>~{mxg!aI#z;t1TFjK&|DSl%z_lb=)gTLf?h1-1BHMTD1lB1ZlN=9Kj49`(R+pMScMff3A2qd<3HE<8Qxr`R!9y`t!D5c`nzaiG{Z zPj~{fH!xpV0LIgR+kC-TE-VycmfMy^LJ0o@8~kb#mcaM7R0z)kC$!H4vvfEQAXYAw z!mGeiq1Rb$xa4>lSgl_655JFamJ2I{mBK3F4;eF_CBj%Etc6@R#a<8XinBlP8ZlME z8?8KJh7#z)rgbJg4b%fFsZ9R#?@-mq3lM zP1p{7hp-bZb{Dj}g<7Ej>t`^qhhTe!ugJC!`hL^{LWlXFPzP-Zu5c)DNH`3=UT6?j zTb}8U2uFou!g1kSU?eczc|v$&X%rr-n}kj3lVIVyrr^*?rqjZ3;EZtBd{#I|P}zfD zp62F%tVs-KYr$as6)16a+b_U-TaQ&4yeKSp%)mXG790&+621p63qJx^ghy(>zQuVJ ztQLX7JYIu#9rX+5;CEmQ*U&25fIShI861aoQ)q*AOZXX3tN#R6IUg9N2X6~^1Xb{^ z&<+pQCH9Pei$3_nVMo7M^+KPuLtum`c&rc;iU}%vjF@ZeCBe9m5R!s5$O(qvYG+E& z1vSCty0kEAG6i`=WdworVMJtB$O)og3AQ@&z@}?k$vr9vlHj+QgPp=t^?l)i&?P(+ z9tlBmUXlCwPti{G{vYhG)=hfxgF&G-8G4BQQs)gmhUN}FLEDS^R0sy230v_5hJqfF z@3~N-|@z(=G-lf?64z6C4$OB5qmmmoQg}9D_YCIEskh!a{=m z5f%h{txJL%o#XILpq2ukmYp2=bVW{D74Y;Zy-gx|-Ev?{$$gpu?i%u25Kkbw>>j8p6>yoBfG@x1iB&U%B~5nw9L1y4{i$1%9=5{qHJ;Yv9%<-I!I;L24CX6>CSqT4Bl)N zMz$*GQ*3!eKgkM|wfz{qKTBu(Edj-Uki5N1yo)4Fv8hLwv;gU0G|!5 zEPEY0#dd{tS6>~RlieA-W1X9wm#qoT&(;PPfOP=(dvCBjyD+=Sx;41KvM9R)5sS0C zgAEwL5|VKr$#EdK3v%_;J528RZ>b=>O0+c?<%nTvc3F0Lb_MJ@61$T4S7ldcci7fI zKN##lp0(L^1V0vBPo$i!3fczLjoJA)H?MXb4IV*;L&3vn8!)4r;M<&SfYt2WlHHoE z&emj`EZa!@_Uw*qeQ*bMkDbKcmEE1K&HB`Pi1l}@oyf8`+Za599HZoF_Q8KT*z7nP zJO>PG*0n!-AbT)dmpu;qeDF|quk%!}DR=_b;cR`jA$ufyGWYt>BsLh2UAj*{463ZO+~ZUJ9PiUI|{vUL@$H?Cs!X z#9Yo^LyLEb@k;hGp2F+Fo58DKv}CWLy^eY@*qV)6Ze*_pzZog#VcjeB&1`G%m!qA; zp=WSzWp8KiWTU|jV0W|a*?ZXzpzRh0?PQ5UyBB1$G04y6c$NvWN<2=uL`%Svlxr{! zo6Dx4%cV?}2&SR)*&mjJSWDP<6pyS6M9*gXa4)&wXNTXK1Cj}f**s(&?nEIgWuKU% zBr+A`k-IZ{AHE0KuI$5Xn)Kb_VLXqr-Pvrghva)q+9z3oc;$Y2fjlKBenlYHMt^R~ zhrcTX&vVols4ugx(2BvnY=8DOG`YM{YBPZnOQ&&cr?ZzsoN$ zE?9bkPl97419nBohsfcz{DC%(I)OSZ_cwkzv`4{{nAsV*nK@OiJNP)*555}s)8LDs z22z{T<@CAUpdn|>nWiFfGR#?WR@k=Ov!FfqJUD_5LuugJ(9IVTvegD$kQ zP}^Naxevi&Xm5h=gC&r7x8>q4H#86GTN3pySZY4ws6@X1E@u01(3=|!`f~nUJ;wYQ zY|;EBNaq5%kHKK>Q}A1GBp5=Tpq1fK=O6dG|h z=9+RRb5>Y5EyCk~R!pqZxif@$Hg^uPnds+p9{4WgF6J%~TaLnRmAjIA@3;ztg105- z4qYSOP$(R_p4($>&85it4~A|4zlqw0+TpsD^MQXmcPDojb|B;p`9tlwNa$X!Bgf=Q zLo~e69Gi>f;<*GE$sC8aEHpc0!@ZHqoKOnLWJ%|E=$YKykU+3(ZXV*XUP8Itf{>{2 zW*G9h@=zhSFeK$_4A^yY_j3<&UAfb$MWKg;^C-7CG#~e(JJ*vtV|bif5_*!W()8xe zm?}a~bI)?04V9q*{c|NBt9}7(Dd|b>&1rd=TScrDXg^^6y@J0Fb!BLI=$yVkw=A@J zij6f*o){-~o{dxJIz=neuMNGOB03~{EY5`D;i*LE0)TGWWR0#PUGA)nal zLiIom&?ien$S9gbGwg$*Bk)WXi)a;Xgku+v18odBM5lO+_+7wfiAO_4;)&2aYq3~D zcob<*hMK@}6Wv2vtQ@D8Xg<*|($G$at~yVJ0%A}MiRZvRL$cz{6AHuI9EynNL#5DO zm}ZL?LS@h{62=^Ht~gJeFJ1~2B zi&p(d$2BmG`Xyoo!7Ih3;&r9hW#WyHgdL_ev;}waCPCXm%fY)9TBltht`t{^t4Y*t z_|}Mb(cTHQE78hy{hwkjPReV=b>e!lO5A`9_YgxnI{t~g1;$3P)5rkZ1jc66Eu=5} z$u4BI7=@<>8XMZC;M*a0hz*ELT4JG{;x5>`#SE@|2xrG6`1f_SVj{Fh_esoAPsnyE*oALkBFI27ID}y zOr@5)x})MTc#n$$uoKW4#eAqqEQC%fSx$+kp)IrZyTs5LvBom4J1d?On~66UIxk)j z_h7bTwu|C}&~L2LOQKeH8QvDG>Ic^Qq0Z25>~emCRkO?V&V(-q;#IK){;tq9@wzCX z*H-a{coWE@P@C8tdKkJT-jL6%;NBLO8P;Lkcf`BmlTf?Zi0AC2<(}9fX7!Btj9dl& ztXCTq$JLKvJrC_Q^@g5?UW9r=EHdJ2j?SWwiE(igo~TE<1i_Lb2RVedZc2>EJ5gvG zd8YeAY4JMdoEJm7j3|g%@xA_Ks1JE#h|Y-{Y@(PK3*xX=B6(hihC+*6o#MC9=g>gt zQ|Kd@?@-nDw`k>3XTC2UH6O*OABgXPy$N-R55>XI*H9ns-$jhz5i-59bc-g-8)pUV zK1+}ISR5hoPsCnv7}_t4aWwRl^!WkykI+xFYjod3<@#r0yXm?3Li`n4Yntp6XCrtw zkT=0ZsLAz`#JwWz7(8<6gH=uV{m`a`W$bt8wfIJSE4~xo1N$JV2|7JIAkGZWAo@p9 z75)UD2G&yjXHgf{hAp^LUqmDE<2N(BcthZhO%_Ag6#fd#9NwT=7Fdm0)Pwm=?9~m4 z!-P8`TEgE&YuFb40ehZpRQySBIljjIOSFf_L`V3yIDzYNg=dBTh~r`r>CG7~hMWL< zT7G(7=}-|HR5S83^Cg6*%B%BkXcVz9`h2}!oA-oud97NX_X72W4S9dqh#aQ8IZp$z zCoQ@CrQVdc*|vkV8NQrjOMXXq zE3^yxoxn1-FSvqTVQK0eJ{egJMs2tT?Y8_1vO2dze?gx59ni4b2!_CH<1jAlpIu&js z`Yp7#6?8I7Q}|@~bofsGZoWN#k9a!r43U5S>FHcJ3XIJ+htGy%`FK8&PbyhBB2)Qv z{tQNOj?CMI@Rjhz@cA&GzZA~og?u)D89uq>^4AsZDx{dt=L>l$U*@h7kTi>}zC< zc1;$%$udgtJnWzOU(m<$zyFE+lRs-1&rjsVa4vjSTL5cX0q4pBg|&Yl){Mf;Lb*wT z)`^N=Y6Ug?UEzn}GW~77g^}9| z_JX5umfTgGM#Ij6t1zojRM@Y68ZIvMlI$6f&*4v`cRBh?SQi)!ztFs~tH`dgpio};8eRzYL)CZ9G+>Jg>zs=V zOA0S=m7=c9TA_@fval4|vch@1*OnJ5)GG=r3y-v`6faH~Q+?pe9ng{Rn!?(`aM+8T zc3t5|__%pc{?i%9`oj0{QGFGO8x3zLY%CO;$HKqD=bf8?b?P>w)fr}LwiK2aw-$be z|DeBW!k!taDNKuuho2bQt-sNm&-PXOCp;t4YS~s0Ed8qOU|n-ekBHjas)=ykz8v2McwD z1z3xpFm6+1hyJ4aP{C{6rPW6C5ktfnv8qn1@98Xvv_^*UBpxofob?48?0&V;*-(g^ zv8R_EDL5kbNDeu$qZMY@ik;5LG4xOb-tj`Y-4$^=yxJ3mC+KOOy##2|=#H#*6h~C_ zc~c{pTWw7RDl%X_SvUpjbiorjQ`kqI5&Y@^a<0%^I1hONb+TM6Tq;~HsBt&16gceC z&Dh;FY+7r9#SM_LNk3fBvCq!m#cu9g?ym^T~hd1A4I#4whaCUh1rp=!o$L&!kkDqupZRMs83LP3s2EL zL!Afab4a;3Z7&Kh3-cqd3Uh(>0qrlmM*F7l7VW#jdxa-+KPdV@;bWn~vLK>$wcCd^ zdtILhUaa|CSc5q&k9;XCj0_gO7QX!xJ5;!0SQHs9EJiOQz?VciFn>DR_bEgveKh(R(+CTUf~ELkM0WRuoL)^#lc$_aY#3#Q61S58L@bzO_9x! zoW4f4HBy6~x1shMcSUL=ddF8h!CuJ+u3y?7*%_gwfE0u!mmQJakr4DSYDAK3rI7m~ zv!ycPpCiqc_C)4EpD!Im#syNyT#IYmADLq>mljF~B8MW2;9X4Em}RL#+6&%fsg#yV z%cSM-t&k2Av<~e`X_d5^@YhIJRBNSmQq;9xIvY6x-wD(z>2%~cEpjDtLV9Xyl&Z`vkqcy0P0~rFw^Pz-Xcr@Ah9TYM=vApjx+YzhTA|;NZc1&^EyBGm-I4A}?NV#x7W&aSJJ8-iy&1VD zwUM4XBnHf=bT7g}#w6ArmvclC()CCP^OBSnnm8aSRK^uk<^a!~?SLa5;UZ1sjGBq0 z;m?zdc!Oh4=3!5k3^X>f#~~0TE9HnBbfzO&@I@&X;Ujse$ef4>5iwGbVv*ejN&4#O zl5%Ow^aie?>MVCWj%>rK>Q=@#qjP4b3Lcy(BWfaLT`n3}eGzS^uJc($ z-`N{6bQ(KNo#svpVZDh=v*N8s^rw;MkyjBL(e0i6k=GFi^j&%<+P9IH5m)E`BksN9 zAm-U1|&g(4eY)5-h1!l z6tH&^1i=pW0wUR*%Xjsnr}(3P{K@9$yVu%l{q{QN%qer`%xA!cFO{?;Dek zJ4Yo)C&z#pP1!o&JB8%9!{;ZaOH{2LWN*>Q2ESXzJS9d3? zqgBz#pwg6NPqOB_4%`D)gDW+NPRlN%J~};F7p;xXNH#=gW+ULeBdhIAcGS*F&Q3N) z=Omk=W3sWi$$827$py)A(Xr9-AabsBVR8|e)f`=%T#{UxT$XH!wt@KaWNUQA_i8__ z-@m)}3s)vrW%cdR)xfSvu1&53wgc4a$p=paf!`U8g3*TLzQT=JC3tq1+??E!+?sq@ zxh=UJ#5NQ>uH2D~0o6os#{X4=qfoRT+^fW+>%o<4Cs6JJ>`v}U?#)(etVW_}l&-Yfr$=#*n3c%e-*~#Rz5(dnsqpOQ~@Xm57yTmb7eDriuh;q@RwP%vOg`Y|# zpgEh|kiFNtTXrsaK6xQ2M;kgXCKZtR)-ENDs2)|LS~Qt7LClKg*V|Dino3@;?90vr zuUF-=>Tg;yKfiEMVL4b^p)Q^DqC0DvYTRs{u98f44g6>wc*@q745OEmU#f%XmE_gr zwQQ!hc+AiDb+?MIC-)XF2j|PTb|X2Z@@8^h_Q?eJ_NMAGc$E{;TS*)2p`Y3p@cwr@ zc_-Nwy_=j6y!7s&;^Wd)6Cn zFG@|QD+W4nN0=&2?TYS>mZi$UxFS`VssgqeP?M?!eH~y=v_934+8b?5?Td~|jZW>4 zj!8A8#)8ba)OgTy70sXr-wLE!Q*FR&PaTMMq&k5YO~taAc((th`Bgg@y;BK+D4aSJ zEiXb+N20?uXbJ-nJSAk`Tfwy-92wWjn#v2n@zYzfrI1K%DgehK&@|LhDLQpDT2em0 zwy|EWWSRwYB1Dp_bB928fv{E5+B_ zz&jcJQgsUG*Vf7 zvI(h)sl(az-&63@(k7+4!MtQCjz3PAi(3jFa8U%bqFl6EcPt*JoO?~@pBdMR4?@ks76(l$A(g`Q>pT8*}d{6TcPr2-CHnz2Y8?Q zkouU-eM()=u4NU_d`^7p)+h?ga6MbYnUi8wJLr)5mMTr(obU z0e;oSrem>jX*f1M9gjh==5$NCHBIFsU}jqy1w9tSW9>js#K>4jx-(71qF@wDzb|8A z@$~#EHbw&#AA{0xnu{SICx9`U#?m6N__vv9GEJrFG?Ql2Tw403P75F|rlqu;R)D7h zG{Co}11rajv=TGZRyL-_>~Hy)4rUrLCvC>8m>qLsE{J+*H|Bx39}8lBI!K2gmH>36 zC#1vJsgjAn|JKgdtg7mYC1TsMPmU&KquuGr=?Srku|zGn{|7a|kykz?-IJc0?gpb5 zMbomX>Dhh;=w||Y)3ZQ78!#t5H$5*sKfNIR7QB0bclg-C^px0SFmq9Qae4_*{HiTY zFUyXm$Cjs8q*ta_fzj&pn)F&=*QL8Fr^VK%XT&DeOpR>-k(sgH?7D2s&e@dSoSqe% zosIldZ%cY>dQNOx`a=EAitXv1+Cgyi??}&$?F9OHS>3Mm?(`zyEsX5}vAyYi>G`q! z*=pY^ERG#WA55R9T=2c-q4bj2;q=njGB92RcvyKPeKf1S3a);~fOj0QI<_LVJhn1+ z0{AD>B6t-~rB7#7;5m4@x_)hJUF<9vuK^X#rO&4?q%UT(mq4FPZwAp6@YVyn9k3&| zCAKS;PH&4*;JT4XPpj!m?~HAYZHjG-T?V=<>8t5$=?$^#z`p?i_ouO&>09Z&u|2Wd z={xDW>3iw>**IReJ9esmf9yf}AgBx0KHZ;w1TuZKud3IA&kY0V!`b*_5F1QCNk2^= ziXDix)IUo<&&~(?IsG#I3iu~#htjWseUmP$e+%r9*t_)m^oR7v^r!UEY>m&~XB>-t zNe`#Lrbn{loDBG+3djY3b3b!DmY+G1)fZ$V-=crjq{70?DUh83Ucr;G(^(yO1%WNf ztf(Ntb@y0ZF_>5K8*@uD=d$YavBlNHb!UNJmeq9BeXCxc$z-!>&{t$CvzencRhjBc zO(vDifc=oQ7eQYKj+qOwJyn;ok=jfh(AQ@gGL6}JKdtSk%;oaYnK7BGvCBZ!7i-Fl z&0L9%%Up|%&s+zQ=3mp^iQNW~mQ3r`g_&)F+USz!b}2W-o?7U=O<()W+wft?aq9RO$MVW zfF8i7*woDD*fih`l}^vh0QOt^5R*$cX74?|#Abev^?tYDxqa4~{e3(K*twZ`nfclA zg3Q9K9f=LczQz`17H4weKh^xHk7P$$S#EquW@%NGpjPI!R$4e zf~=}AUIgsg%sLP&iGQkI0QOdKe0}Ck*@o;gHiEu1z9};|yBELJ-<&Cn-v#eYTQb{f zE5O{XnacRK%=XNVtbS)^S7vwCE04F=FS;=nlw=I#NCy;;@1Ol^Ea z{mSaPczwJfE`d9i#`ykhX3F?|V4vTr9u*%GA00oCY09oIxR1(=1>T{|xbNe`nIoB_ z8SsZMGsiP0z|7|O$xKVUHGV471{Ce_j(8`qr?WNBWX@(S_%slY#m{~B!K+byK64>+ zF>@)iu`-!~;;Bp;#h+(hWL{=o0mV>O z^*Zw=!^GJ*7dOl3td5Th@wb_G83~NU`1{O<%*V{9%;$^}{{m(VXVkcy)qTy*AIbK= zeuVtL{WC@2c~4)YFSjqR4}4bZ)8Ykvg~0o%>G2QEMPOvai~CCYN`Y7QbM9A~Z#D;t zK)FyJln)g^g-{Vx43$8oP#IJXRX~+c6;ut?K($aER1Y;kjnF7)G&BZkg2qDQpz%;M z)B?3aZBRSZ0d+!ACCg;lCe#bff@VW=pt;aIXg;(6 zS_mzI7DG#*rO+~HIkW;=39W)wLu;V5&^l;6v;o=(ZGtvKTcEAbHfTGv1KJ7gf_6iD zpuNyOXg_oSItU$t4ns$vqtG$vICKI!37vvYLua6~&^hQlbOE{uU4oKO3Q9v6s1Ldf zU4gDb*P!dr4d^Cx3%U*6f$l>0p!?7R=pob(J%R?H$Iu}31bPZRgPub#pqJ1qXb5@@ zy@B3B@1Xb42k0a83Hl6ufrg>4&qi3 z5~g4pW?&ZPU>+7=5td*XR$vv@U>!DK6SiO*c3>CwU>^?P5Kh2d@C0}wJPGcGC&N?V z9(XD|4W16qfM>$J@GN*XJO`c&&x7Z~3*d$DB6u;p1YQa+gO|fA;Fa(ycs0BRUJI{- z*TWm&jqoOTGrR@f3U7nA!#m)e@Gf{aya(P3?}PWl2jGM7A^0$S1U?EMgO9@};FItv z_%wV5J`10N&%+nsi|{2l38&yRoPqn`%kUNWDtryT4&Q)p!nfet@E!Ord=I`4KY$;? z{qQ4r0DcS)!cX9*@H6;1`~rRnzk-M0*YF$oE&L9C4}X9^!k^&J@E3R({tA!4IYk*qyQ;IijZQY1Sv(zkaDB~sYI%fYNQ6KMe2}xqycF}Mj@k-F-Q|K78!?(N1Blq zq!npH+K~>V6Nw@*B#uA`j35Y#U2K; zjW~#lc!-Y#NQfkmE@T2S5t)Q^Ba@LSNDndUSt+B8<~U5Mdl&%kp;*? zWD&9$S%NG@mLbcL7060t6|x#xgRDi?A?uM1$VOxnvKiTeY(=&q+mRi}PGlFd8`*>G zMfM^4kpsv<d96Ua&A6ml9lgPcXqA?J|`$VKE5l0;HS8p$Ai$YtaT zauvCTTt{voH<4S&ZR8Ge7rBSrM;;&#k$&V6GJrfr29YPoQ{)-)9C?AfL|!37$ZO;c z@)miAyhlDDACXVUXXFbqjC@5#kQ_9E=AwCMK3aelqD5#iT7s6MWoS8CfmWhbXf;}c z)}nQ2J=%aaqNC8!=oqvK9gB`b$D_??3)+gdq3vh~+KEQd7#c?*6h;vgMKKgd36w-B zltvkpMLCp51yn>OR7Mq4MKx4M4b(&})J7fDMLpC<12jYvXcsyGorq3CyV1$$6toAO zicUkPqchN%XfHYoosG^x=c4n_`RD?4A-V`%j4nZ!qRY_b=n8Ztx(Z#5u0hwL>(KS+ z26Q933EhltLARpY(Cz3BbSJtC-Hq-+_oDmI{pbPoAbJQrj2=OcqQ}tV=n3>BdI~*_ zovA^KJ+qr1-*)1L$9MZ(3|Kj^fr12y^G#M@1qaUhiE_g z2pvElql4%Z^eOrbeU83BU!t$jA@nu+27QaZL*Jtx(2wXR^fUSe9Y(*RBWMm5!E&)Y zEFUYt3b7)r7%Ra_u`;Y2tH3I;Dy$l-!D_KOtR8E?8nIE>XlxADgpI|nV#$p`CV*(~(5+-8`reYeVV+Lko7G`4( z=3*Y^V*wUo39Jj7fK9|EVcpndYzo$cO~s~R)3F)YOsp51h0Vt1U~{o~*nDgOwh&u{ zEyk8$OR;6xa%=^*5?h6>#@1kKv31ybYy-9t+k|b#wqRSaZP<2f2euR2h3&@nV0*EB z*naE)b`U#+9mbAeN3mnraqI+k5<7*R#?D}8v2)mY>;iTXyM!gN6qd#^SRZy7yMkTC zu3^`)8`w?k7IquEgWbjMVfV2I*h8!zdxQ;OkFi1Q3HB6whCRn#U@x&(*bw#_dxO2j z-eK>t57I|u@Ni>kKnm@9-faE;DvY*UW}LErFa=$j#uE7cokla*Wk5y z9bS(&;Enhwd^A1=Z^FmoF18i+<>6fv3@Lo^X%iE+euqM2wRT8TEI zo#-Gsi6{{x;siv%1VW$$M&JZNkOW201VgX{NAQF|h=fGQghHrey zCB#x<8L^yLL98TJ5vz$c#9Cqaqblek6PChib-iF?F-;sNoH=qDZ#1H@xuka$8oC7uz_i5J96;uSGOye8fdZ;5xr zd*TD}k@!S>CcY5E#8+a3$RQ(SE}2K>lLcfUSwt3-C1fdCMwXKmWF=WeR+BYkEm=p_ zlMQ4eIf@)jjv<@KvE(>%JlRaPkga4J*-mzlon(}Zk#Q0tVGr^wUf8S*T7 zjyz9ZATN@a$RwE}(`1J1BQKLz$gAWv@;Z5gyh+|7ZSspOVkW=j03WCHaaRB43kl$hYJ>@;&*1{78NxKa*d`Ve%_ELgr8rDwoQm@~Hx< zkSd~zsS>J`Dx=D&3aXN-qN=GHs+Ovw>Zt~*ks3vfrp8cB)L3d9HJ)mwTBug4jcTVl zs7@+M#i%$1Q80y2D1}itMNlL~Q8dL+EX7egB~T(IQ8J}aDy306Wl$z%Q8wjJF6B`^ z6;L6Spt`6D)I@3$)lE&Nrcgc9RB9SEoti<-qP1I&;3$>NnMs25dP&=tz)NX1IwU^pQ?WYb< z2dP8UVd@BVlsZNor%q5OsZ-Qx>I`+3I!B$SE>IV#OH`6dQE4he^--6pE7Vo$8g-qz zLEWToQMai()LrTxb)R}bJ*4`nN7MlIm>Q&>P*166)N|?u^^$r;4NQJ<+V)G+mx8liIN2%Ssk(fM=%T}T(v#dHZ>N|({)bOl{WSJBmU4P8su(e-o# z-AIq3N7G~ICVDJAjvh}p(=Bu>-A1?59dsuhrDJrQhG>{ZXq3iioF-_Jrf8aGXqM(^ zo)&14mS~w)XqDDzoi=EbwrHDnXqWbApAP7dPS9QS1bQMpiSDK+(^KdkdMZ7Qo=(r8 zXVSg&EP6IQhn`E%qvz8L=!NtmdNI9(UP>>cm(wfgmGmllHNA#jORuBX(;MiG^d@>U zy@lRNZ=<)kJBgUlk_S2G<}9XOP{09 z(--KA^d&k;r|2}Dq5J5|^cDIleT}|O-=J^Ox9HpS9r`YPkG@YopdZrx^dowJeoPP2 zPw1!gGx|CGf__QAqKD|$^c(su{f>T5f1p3opXkr@7kZffN{`SvOoYj0@|b+4fGK2( zm|~`cDP_u-a;Ac*WU82IriQ6yz)we*2Bwi2#f)agFip%@W*jq~X=YlOR;G<-gD@zAF*rjoBttPY!!RtvF+3wMA|o*}qcAF?F*;)~CSx%+<1jAcF+LM8 zA(LRbmQ8Z(`l!OUcOnOV$iW)3r#na9j$7BCB$Ma*Jm3A2=0 z#w=%6Fe{l=%xY#0vzA%MtY4loCq zL(F032y>J<#vEr(FejN)%xUHfbCx;BoM$dD7nw^;l1VXXCd2eGmzgWfRpuIVow>o> zWNtCHnLEr~<{opOdB8km`k6<}0P~m`WS%fjnP<#%<^}VTdBqGdubDT@Tjm|}p83Fh zWIi#UnJ>&R^OYH4a@Yu)%jU89Yyn%y7O}-_30umRvE^(9Tgg_j)ocx0%hs{=Yy;cK zj$%i%W7sBkEIW=J&o;9yY%ANwwzC~>_qCyM$fJE@PLoE7+CnDt0xyhF#09W7o4A*p2Kab~C$$ z-O6rbx3fFgo$M}lH@k=3%kE?Mvj^CN>>>6rdxSm89%GNQC)kthDfTpbhCR!kW6!e} z*o*8XHp!;gG@D`j*vsq{_9}agz0TfXZ?d=8+w2|oE_;u?&pu!uviZWXthTf?p8)^Y2(4cta<6StY$!foZYaof2a+)i#6x0~C;?dA4y`?&+$LGBQD zm^;E9<&JU3xf9$;?i6>LJHwsj&T;3t3*1HS5|`vsT$;;pecWa43U`&e#$D%ba5uSI z+->d-cbB`z-RB-~54nEs5jVg+<_5VZ+*9ru_ndpdz2shTL)>fb4fmFN$Gzu1a38r( z+-L3!H_UzIMz|b4!sqgNd_G^m7xG1XF<-)$@@0HEU%^-MReUvH!`Je4d_CX5H}a$S z(fk;`i66_42pUO|;r}H!TnS3ul zi=WNU;pg)6`1$+-ej&ezU(7Gzm-5T_<@^eMCBKSa&9C9t^6U8Z{04p_zlq<>Z{fG{ z+xYGL4t^)Ui{H)f;rH_U`2G9={vdydKg=KDkMhU(DL&0-_&)wJe}%uwU*oUyH~5?UE&euthri3;@*{kX5D{{PJRx5w5DJANp;#yp zN`*3^T&NH#g({(1s1a&~I-y=@5E_M1!f0WP&?Jl%#tGwvW}!uB721S$p+o2tqC!lF z3y=T{h=2;1fD42`3Y0(#jKB(^6PCJEibWMPWXBTN;h3Dboc!c3u8m?g{><_L3zdBS{Qfv`|mBrFz|2up=!!g67S zuu@nhtQOV?YlU^fdSQdGQP?DG7Pbgmg>AxiVTZ6&*d^>1_6U20eZqd>fN)SaBpeow z2uFou!g1k*a8fuWoEFXqXN7aZdEtU^QMe=|g_MvMGD4qlS-2ux6|M=_g&V?6;g)b) zxFg&Z?g{sW2f{<4Uw9-82#qn zMr;ztisQubVzbyHwu)_HyVxOiicv8p#zjbkMMOkJOvFV(Bt=T3MMh*rPUJ;F6h%pt zMMYFaP1Hq0G(}6aMMrc+PxQq=48?@lB~B10ij%}{ak4l?>=CDm)5PiG3~{E|E6x&U zi*v-e;yiJ_xIkPeE)o}uOT?w(GI6=MLR=}X5?70B#I@o&alN=f+$e4mH;Y@ut>QLu zySPK#Dee+?i+jYq;y!V|ctAWT9ug0WN5rGzG4Z%~LOdy+5>Ja~#Ixc#@w|9JyeM80 zlVVCtiy5&`yewW3uZq{i>*5XZrg%%dE#49Diuc6(;sf!a*e^a32gJwXp!h_5Dn1jR zi!a2N;wy1Td@a5a--_?V_u>cfqxebuEPfG(#joOsm?K4`Tq#e=mkOjpsYoi8N~BV$ zOe&Wuq)Mqus+MY`TB%N|ml~u-X_Pct8Y4AHW2JG@c&S-xky@oTsa@)jI;E%-lj0I2 z!4e{&5+>miA(0X#(GnxE5-0JJAc>MB$&wXIf% z6QxN~w=`LrBK1g9rD@W1X@)dY>Xl|mv!yxGTxp&(Us@n7lom;gr6tl*X_>TKS|P2J zR!OU+HPTvXowQ!sAZ?U3Nt>lD(pG7kv|ZXE?UZ&&yQMwSUTL4SUpgQilnzOUr6bZ& z>6mm}Iw75uPD!VwGtyb_CqC0ENea;;n^*UJrZqdZC;Esv3# zo7^sU$enUjj>&Nul3^K=x;#UkDfh~=ekk|LkK_UQu{GDI0x7V9 zD5!!dxI!qTLMgPuD6GOMydo%~A}O+>D5|0jxtx7r_5ItC<~QE%3@`SvQ$~7ELT=2E0tBs zYGsYGR#~U4S2idcl}*ZKWs9;^*`{n)b|^cQUCM4{kFr#CzVsmY2}P^Ryn7fS1u?Ql}k!eNhxV1qx314l`G0s<(hI`xuM)tZYj5wJIY<< zo^oG#pgdIil}E~e@>m&Eo+wY1XUcQsh4NB)r3@*rl{d;;<(=|g`JjAMJ}IA-FUqj; zRT)uo)QFm^=BfE=fm)~*sl{rETB??*Z})~WSsgW9N$Qb(&})FyST zI!+z0HmfaatJR9+QSQI%9#Ra8~g zR9!VxQ?*oEbyQdNR9_9$P)(>^>I8M7I!WzTC#zG`9(AfZO`WdJP-m*W>MV7(I!B$W z&Qs^B3)F?`B6YF4L|v*bQMnJ+x<}os?o;=x2h@Y=A@#6&L_Mk=Q;(}B)RXEd^|X3MJ*%Em&#M>Ii|QpcsixGl zno;}I%jy;Ns(MYmuHH~@s<+hJ>K*m2dQZKtK2RU3{puriKz*zZs!!CX>NEAZ`a*rF zzEX$O*XkSft@=)VuYOQJs-M))>KAob{i=?rIa)-^)$+7_tw1Z(inL;_L@U+Gv~sON ztJJErYOO}A)#|i*twC$lMrot9F1)ny5*dtSOqRX_~GXnyFcutvQ;jd77^UTBs$oE^UG~QJbW7 zYm>DpT8}nWo2E_IW@t0DUTu~(TbrZJ)#hpQwFTNjZIQNETcR!1mTAki71~N|m9|=2 zqpj7}Y3sEO+D2`YwprVvZPm7E+qE6qPHmUATic`U)%I!owFBBg?T~g@JE9%cj%mlW z6WU4bly+J>qn*{xY3H>I+C}Y>mef*OTFYpC+GXvEc2&EkUDs}CH?>>ZZS9VBSG%X( z*B)pOwSMi9HlRJ$2DK;JQ|+1dTzjFt)Lv;r+H38N_EvkRz1KcyAGJ@~XYGqNtbNr+ zv>ZL6=jwTSzFwdg>P337UZR)kWqP?@p;zivdbM7o*Xnh8z22ZV>ZA10`WU@QAFGek z$Lq~{i{7fY>Fs)l-l<3Rm>$<59o7*Y)iE8{37ym_oz@wh)j6Hl1zpr7UDg#{)iqt$ z4c*i&-PRr5)ji$U13lCedY3*ypQumLyYofG3dapi9pRLc)=j!wH z`T7EVp}t68tS`}*>dW-y`U-uezDi%MuhG})>-6>d27RNxN#Cq*(YNZ`^zHf%eW$)l z->vV__v-uf{rUm@pnga{tRK;j>c{ls`U(A{eo8;BpV80i=k)XX1^uFaNl)r2J*{W- zKK-(OMZcx23e{i*&;f3CmKU+S;) zA^o-fMt`fn)8FeK^pE-{{j>f>AJ)I>BYKVzF>;MOBi|@63XLM8*eEedjWVO$s4yyx zDx=z{F=~xEquyvR8jVrLXk(1gWQ;Y&8RLy+qs3@7+KhIi!{{`kM$CvCkO3Qrff|^B z8-zg`ltCMe!5W;w8-gJkk|7(4p&FW@8-`&TmSG!?;ToRd8-WoT38TxHU`#Y78QsQY zV~WvZOf{w%(~TL%OrzJBWz06_7;}wz#(ZOevCvp#EH;)HOO0j5a$|+D(pY7zHr5zx zjdjL)V}r5L*ko)rwisKDZN_$Ehq2SxW$ZTg7<-L<#(v{~anLwq95#*^M~!2~apQz> z(l}+DHqIDljdR9%We3amn_$SSrMZ0t#Q_PtJ!L?TCFy#-RiJ9t*8~V;ud7V7Gj|mX5kiL zkrrjq7Gtp%XYrO`iI!x^mSU-vX6cq;nU-bQmSee=XZcoOg;v7qvL;v)tw~n5HQAbC z^;lD_Y1VXWhBedbwPsnftvS|QYo0aVT3{`-7Fmm}CDu}FnYG+nVXd@QS*xuz)>>I$#~N4q1n-Bi2#tn04GbVV$&2 zS*NWt)>-SEb>6yQU9>J)Nh@Wgt&G)YUAC@RSFLN-b?b(8)4FBdw(eMWt$Wse>w)#q z>bD+Q1J+|}(0XD$wVqketryly>y@LMd+USs(fVY4w!T=y)>mu9%CRGM zuAOJ++XZ%^U1S&AC3dM@W|!L)cBNfqSKBpqtzBo=+YNT3J<1+!kFlHVvGzE7yxnZK z*sXS(-EMc-op#iY*>M}PVH>eg8?$knut}S;X`8WGo3nXauti(4Wm~aTTeEfBuua>t zZQHS3+p~Q;utPgxci9u{iS{JB+n#Jsv3u;P_B4CCJ;R=9_u8}U+4dZJu07A5Z!fSH z+KcSP_7Z!kz06*2udr9ztL)YG8hfq1&R%bCus7P9?9KKTd#k<8-fr)(ciOw`-S!@P zuf5OSZy&G^+K24J_7VH2eat>?pRiBbr|i@A8T+h#&OUEnurJz|?4+Ht({{%0voG6M z?5p-Q`?`I@zG>gGZ`*h5yY@Z%zWu;{X!qNX>;e0+J!n6%pW4st=k^QxrTxktvR~V8 z?6>wi`@Q|a{%C))KigmIVf(8+V&^y!C)dey@|^;w&?$0?of4YWCs(HZ58cE&hO&RA!hGu~--TAWs=&1rW!oK7d|#GJSTIk1B`sDnAULpY>E zIkdw#tiw6HBRHZXIkKZTs-ro&V>qT`Ikw|CuH!kr6F8xhaJrlc&O~RD)9p-lrZ_#$ zRA-tq-I?Lcbb6gx&TMCnGuN5t%y$+z3!O#IVrPl7)LG^%cUCwnomI|iXN|MgS?8>G zHaHudP0nU#i?h|)=4^L%I6IwP&TeOqv)9?@>~{`02c1LCVdsc*)H&uHcTPAbom0+f z=ZtgKIp>^rE;tvROHR^BIcX>3^f{NEE6!EtnseQ`;oNj?Ik%lV&Ryr8bKiO3Jaqb< zN6vur*co)5I8U8t&U5F5^U`_c3^}izH_ltXy0XZiQRvR=L$~ja%#1x%F;?+vtvRN4sO(CU>km&K>VIyDe_3 z+vc{r9d4%^bz^Sag#lRxyBpk%?k0D$yT#q=ZgaQ0JKUY_E_b)P$KC7h zbN9Ok+=K2R_pp1!J?b8FkGm(_lkO?^w0p)q>z;GZyBFMx?j<+rrrflfar@lM?iKf{ zd(FM>-f(Zax7^$A9rvz#&%N(Ha38w;?jv`=ee4dpPu!>OGxxds!hPw!a);d4?i=^5 z`_6suesDj!pWM&x7kAkG>W;WMUc}4w^1OVnz$^5Mykf7!EA`5}a<9Ux^s2mSug0tO z>b!cd!E5wJd855CUXwT08|RJpn!OgU)ob(Gy$-L_i+V9H?m-^xAs*^s9_|qy=}{i- zF&^u29`6aB=t-XJDW2+Sp6(f*=~--=q0=^Z-O_`o8)zSlf5Zkk2lqu z=1uozcr(3TZQn$k+;}e;w|--dCR>O-b!zkx7u6dt@YM<>%9%$ zMsJh1+1ui6^|pE2y&c|8ZW$%i2)w||h_ilJMy<6UG?~ZrZyXW2a9(WJEe(#Yt z;63&Ry(ivN@0s`9d*QwGUU@^_YwwNs)_do@_da+Zy-(g}?~6C=ef37X96#dc`gwl7 zU*H$|MSihg;+Ohmez{-aSNc_cwO`}c`gMN2-{3d;qx{kS7{AFM>yPut`^|of-|Dyd z?S6;f=|}yTANL_2_7NZTF(3B{pY$o8_8Fh`IiL3hU-Ttk_7z|CHDC7)-}Eit_8s5# zJ>T~OKlBrRmp{Ru=uh&y{mK3mzsH~IPxGhyGyIu;uRqJ5?a%S&`t$tx{sMoYzsO(g zFY%Z9%lzg33V)@)%3tlT@z?t6{Pq3@f1|(2-|TPkxBA=s?fwpbr@zbJ?eFpT`uqI- z{sI4>f5<=VAMua+$Nb~|3IC*j%0KO&@z46_{PX?=|Du1%Px>i8?PvTx|FVC@zv^G} zulqOroBl2TwtvUJ>)-S5`w#qwe!u_7AMhXhgZ>l$ssGG>?!WL~`mg*U|F!?df9t>V z-}@i@kNzkBv;V~(_P_cgeohbxa)Z1eKPU(agQB1~C<#h~vY<;z>dxL$!{@_4xFgO$(4vqvzgJZ$*;6!jTI2D`@&ID(J zbHVxGLU1v-6eNRGkPb3IUvN3N5?l?g1=oWc!Oh@Sa67mY+zsvp_k#z)!=OKS6buB9 zgTdfQ@HBW9JP%$3FN0UXQ1Ci<6TA)H1@D6o!N=fJ@HzMr3ksv3Ggt=i}m>(8| zg<(-x9F~NoVOdxnR)m#dRahO?gtcK^SRXcojp3+pbT}q#3de@y!tr5q*b=seZDD)Z z5q5^rFc!u`D1<{KL_;jZLn0(YDx^auWJ50GLm?DHDU?GcR6{M)LnAapE3`u=bVD!n z!ypX9MA#Kh2q%VEVoUX4o6f3TKCN!nxtRaDKQTTo^727l%v2 zrQx!0dAK568LkRfhik&M;ks~rxFOsaZVEStTf(j3ws3p6BitG83U`Nl!oA_XaDR9p zJQyAd4~Iv>qv5gecz7Z_8J-GHhiAgG;kod9cpBml&UDPP8Oi6K#q1L`R}C5lzGr@dT8B6G#G0UhZ5Atc0vl#mljLQQB1Jz*rwgq5%pPQp!i2|p1e!bBp`m6(v2n3$C4PE1Zr zN%SP9CZ;8(CuSsOCVCUI60;L?5_1#t67v%a5(^WH5{nZ{5=#@y63Y`S5-Ss{5~~wy z5^EFd66+Hi5*rhn5}OlS5?d4765A6y5<3&S61x+75_=Q-68jUs{wsw4FCWkQ&CKbh z-;Dicgw6hP^*7_c9_a>O1lps_(HokgW5uz>imQk&}^Ak<*c6Bo#?VGLgQ><;a!D)yTET{m6sJ!$^PRQDh+UI5HT?%e$MKpGW3l z5h-Ft?1&R_BVNRh1d%Y3i1b9JMy5rkM`lE3MtUQ&BC{h)B1eVsZAz-^=~|AOH9lzxb0s_^}vgJ88U?g$TSA{V~EZ5Z=i!KbE()$G>@C4ownt zHveNQ-ti;B#ye@|kABQS(I0ER)nb0E0e|a?<~uw7=*R3re*k~H?FXn0`@>)U*`NR7 zPn$>m@|VB(!(aZzU;M>S$-hOvEC+~w`?r4U{{rT>z`wt#{T&egRp!UP1GWt?9c<&b z<^mry6XZ>>>E?d`m}#Dd0Z?{O5pw0QfHe|0UqR0?Y?^ zfd2>(0RDTx{{WZ@m<;%z0RJ=Ke*yd>fC;bwHoyV6fd2&W-vRz1AOwKZ&Flh9089k@ zhXAk%=HCTO0rUX=Tfj8HbifS2OaRzCa~5DWU=Cm|0PJt`zX2=&{EvVi0gC|Dzw?8s zjr?H#C9r?*#~;jp4D3Gv*dX>#fn5SLe+2m70lx?MmjD&;&jBvb{4<~#`M+DT{Bz*{ zE}$F4e-GFmVE-}D{WHM70Q^4Se*>%o{2}090e&Co{so{HX#XX!bAkN>U>5@Whrq4? znm+*iuK@7h{F?tK0PJ^jDaij3$gc$UUjh3Iz%K!R4EPhkRuKRD!2VmH{ilGx1pF@G z{{Z|Gz@LI#E3j>Vc0dQ96A%S}i-Z{mK!BZ~&c6oQy}1#`aDefHfJfw}((Py%wLfHFWipaM_{06(?-_TL7X;OFsXG0?pN^Gbky z4eT303-GUi+~5822eTH~IzT<30ni8-1sDw&184=>Ho&*#w*%V&=mh)%K!AlHZvL?7hrj%_e|LY)|MmF4AOF)2|9`iC z@WYQk`~qxq)ekK{kU#uC?41RC6UqOu6B;1s;x28WxGZwG6!&gE%4Gk@iRjq$5%XDT}xvm5|Cv6{ISHAk~oSNDZVW z(g*2_bVgbr^^p2Vf21YS2x*KoL7F1&h!+x#L?9x>gs_k(WDMesh!F;2L}bV)M2_4= z{zC2{_mKz4L*x>@f5ubX=Vj z*;g#($hrJM8uoGcD92IH@d*1w$<{adM<5)E3`0gB9K@6Efp{VUM1d#~HKIlIh#wMw z1R_C5FcN~qAgM??l7VC*laQ&!dL4``L>41Uk>$t+WD~LlIgFe|&KD~mSSL~bFskvqsU&Jd5M_lM*1kam|nad+$H^{pCO;@ujrE{1L=cal?|m2qYp<$ z(Afxw&Y^qK`LE95LHBUP5dmF57a~Hs0uCh{DnvzB!=XVmbS)e@L`T=d;fwgv{owFN z{OJL31i}#nM=%^AaD*bE^cXm-h?SlSM;ekwPlsbXGM=9C=E$VKJ|@u%k;%vuWGa0c zG96ifETk`_FG3d47sIgxSwde5$1-FYeK{QKk@fTqaBM_2(l^1e8QDzV0>^&jAaa;~ zn0}Ui4mnT1fLuf_(pMlWkyXfQWG#IieJ!%?%`@XgkETb^MRXILMUSG7p?kx#%z$TG z2G6&gewY3i{T}^3{Q>*+Qzed0Q_rIbUVzKl%dOSUWo=8uk zkE18kQ|MXrY;a2PlM$bh&0KNsRHfw%sD8sc(50Vn|#pawL67SI6>|6d4f z0PX@WfS15>09@&-{C@$|TMrPxT3|OY3s?0$`Goa2E;0SO5xCkr(W&*zgvw`1$ z`G7mH2G|H}0yYDS0LS;WrNBI372t4h3>W|m1O@?vfg!+9U>GnQ7y&E>9sqNId%%6* zA@Cd+34F=_*Fl|UKokJh8&d?3z)9dS@Fo9W0d-CQV&E8X9QXr3fv@rZl~C^-;0>Gs z&H}If|9!LHM0r2`&!*s&`Y%69_W!MvBb3V&c&$?@lxn~~_o(rY_Wrr+cA<8n4xqBB za;jfxui?8ro%vm!zPePNu0(Ev9ZC^15{8t<(+7c_o=1epkMQ&b$TG0qX~+uX0DSA% z1fDesu_Eii)0ZL}!H+Y*X^W7};B#xh!lr-^7lJ$ghB!QIA)*4eRv;Q=BpCKoLDXC})0`C$27)Co1VT z>Cfp>x|tqEFO4S-0y92O7sA!&zw$(fD>@$k9bfETDqpPa_&fjUi$7$%_$qvUI^5wh za0Rddj?Z>G;PAy}KnI`?&%a}*Pv9DG3%Cuu^+ksdIo!zMe{F!)KyTnf zU)%|KTY+uB4xl-(2XOeJ!wXCDMTfua1@-~^f!~2o`QmOUbNFFPpfBJGxC3%P0Vn|# z@K5?;1oZFlMG@d|7l$u8oGSnb1cHEIAOr{n!hmpK2Jp4MI2Y=EtuGQ#cK|RD7z7Lk zKIe;%puD&*;*kCpUmOedi~FL(|Gvc+9e(*ezIYzm|MW$8-+c4<>5KoiFFI_ebmO`) zrSiq8;7-%N!xtxmFAf7^{BgeM1-|GDBXXtnMJ0@kM|{B-Z-OsIzVXH9uY6JXw=WI? z1Kj!rUpxT5Xn5m`GrrLmN5Tkc>BbdfO67}F>6hu#zQY$MgD(yPWBl*>Vvkb!VjU{H z>HYM@ALfe=m$?jF0c=2VUvxOgr+iTcWk13fn?XNYfo;GJptvtOJf$RGbar$ z4xjA>>;xRXQQQ|D{wN3jSH9@*Glwra-1VRGMTd*70X71gfPZp)@q2yI;rid=i|$bW zr!P`|*yE=!{@cE&EVVD*ER`>=hEcfJzQ`{1_~MWE#RD)(SXy6ntfY87zIgeQI#jW6rug4d|zG{5&TYXVkYG1rrDqma;Gxo22kzMNX#s9P~_CQPJi}il`;tyMo zdKEs0F~H%BZ++3>0uC2*j4wLoT|ecE4)1yEiw?&uKECJ}PjZYeI-Jene{F!)KyTnn zc_@41ahiA_QegozM4yXEBU%U);2LRtPzBmW!-v=H7j`8G?z$joe zFa}@%On?Qj0S>SZcm_NNWIz!>0(RhAe9__iKYj6s=_2K)FaF!UxV+TsMoTvzoe3jp z>{sK97fR)egJFD;2XnSRYJ4%`)qM2966T{ve&u|$!??dRAMF@ld^;cg))%+FnU5ay zYCifhSfke~Uz|~FKHBhRKH4$9=nFIWj``^G-#EUwywvL!OE({#NgqyUzZze>P%2*> z4C9MDSW)_)9bfFxwN$>?=%+9Ka9?!zLvdepe4ab}z~Mz7`eG#HwE!G0cmw#{e6+(U zKlH^#kk=mQ2y6#-0$YJ?fMa~|tuH!!$lj`77W`J%&59KPuAPIur( z`l7?5ztzSbfcOC5TYS;s?r(k3@%`Xi zeevgf^xIXD2Pyyd(b(Q%*Ax2#|Mv@b^dy?(JIUwpfM@wG3Ow0_a>_xi=xzW93m;IvnnMe9__ZU*n4o zXLq=w!%u(u;?MhC9IpD)7ynIPe0^W~$WpFfES)bd2VdOq-M+Z-hxwxD)%c>J*!soS zzBuEn?|1pMFTT6qrF6dd?tYij_~HyOuGjZPk1XZ-#nSoWa`43s-|dTzyLJAf_q+5g z-F&p`clzS#GLCo5pZg=pNm#!JC;=6q1~h;c&;feD;d-C)MFW%@0TW;bEPxN-*vrQE zP3Z7Nhtqt@7v)f<0F;0VPy-r33+MnxUnTjX!F=f?PCQ0^FCEXfxg4&?{e=nn({ zfj|%t41@roKo}4X_(9zW2qS?gU@Q;~z{F}yED#680|`JPkOYhal7SS!F)!`-J**H< z1=0YAzx8v5J-8q~9>@SPfh-^!$N?q*69I=)=0cbUum|hd4qmggn3l@C5jP01yIRz^B@yP}T|P40Hjy z0>1#=fbKvKpeImL`)QCLLwP&a_d5J}fArh^kzTzw{^LJ3{o`l&)Cms!y)#oI*qNy} zbreoC8U-Ikm#pyr57adRaa#*)Wp@@KY59xcUclobljvb6%TiE6QsfGE{ zSHMm^%U+GzId=VV?D*r@?Z>gx5A5*sYIh&U&OWfK5A5Vq2)pyFq_3i{rmvy@MtAJ3 z^Lo^7I#}2MxGQ_mtGjI+`zgULLvQZO=DnH+7nHC{zzX+jJMPJL?5XtePE(T{y8?lA zf4Jk+0%XyvJA0PGw}TCEzxgJ((|ilWUf=EfAG+VUXX);DZvCD9_j7-ocl%>rh0j6^ za0jjcHo!4n_%-Vh9S(5=aLg||eBc&v8@L191TFz{0mo;3asP9;%h${=JH`tgbCMj9Pm4(EJ3Ug%gGFaQ_`3<3rNLx7>cFkm<^0$2<@03HFw=a;WRdL-~I z>k;Qb{UU$_?7+|Uh_64{{*9kM#|!_>@j}P`IHg~YIJi{zuQ=8tu70&1ae4`+@v&We zXcg>N>k)t4{POGdh!Cgtw#*|?EW~V9WRXhXg%WAPu{=sdc4r^KVFYG zxK#JAIMySsezhKPda2eUvR|!7{O`^$cj?l-b7z=g?);7WsjrWRci1virw1<~fUUn8 zl<AZ!dY0h$8NfD7OXI6n6sPUQx)032S^ z3UJKFwgK7#4rg*WmSgO$Bk;B3CB2|-Z=es*7w8A{2i$?L@rAE(f-jBvINWMB;P4p< zAO&QA98dsCKn17)4WI>dz?a4Y-#XcsoXg?04rhu2`Z>SeFFyw2u|OOEFQ-@g*(XAn z1dIccffT?BqylLGyo8_`rOaRo#VHfwSwJ?B155xW0=YmQkPj39lYl~CGB5?03QPk? z(l_QweG1jH0fo8>sL_x@^#u+A?HW<2R^S>iv@wM`3njxg=zqP2U;|vP!oWwfO~Tabt>>2@N%P2*8+7~P^f{xF#v5zp^gV` z0wY^dsPlkwttnI$upMx2L!piZ&I7&LQmFaBBY@YALR|q=YfqtCfCE6A4isuKKmda~ zQm8Wl*ua}A0X6~+I#H;hz)7HMX9_hNxC=14P^gQ5id`vG9k3f{{tJZ~2V4gFb)!%x z14V$KJB7LisMUi)^#_gs9ePrzX}}F&crOZd4nXTop(=o_K$AWcs^hu;$kq0%`+wfVx0Epgzz5 zXb3a{8Usy$rhqfx0=NRrfaZW3&;n=)v;tZKZGg5wJD@$#0q6+8e*7?I?+#=3?l5NW z4rBK2FlO%#WA^SaX73JT_UXfK07e3%fYHDhfB`T87QhBL02kl^9)Ksn2Lyl+@B&1D81M%E z?SJ>5=l}WM<9H4H{QH0Z@BioD#m~Qs|DRq1@LhriP~kfftrSo?UsiU2`*aA}|x9b6hX0(7VVE)CoO zhF1ia256PQrGc$LlgbooBybk!QH4Uy1s+tP&;Tl@DuucXsESZ%Z=jkG3Kjlm6Kbn! z6lxNH0RyX3sMCR$fVc*Qx*n)klR^y!P5_;2QK*@~ZD4e53hfh67u2Ru>2)Yn4X_h% ztxKVT1W_*nedv zHK`%Bq>j{+2GU5HNHb|6eMn!@kMt)4$UriP3?@U!P%?}RCnLy6GKw5aMw2mQEEz|} zlL=%ZnM95wlgSj)N~V%&WI8#X%pfz#EHazSAt#U%$y_pz%qI)TNn{~8nVdpSC8v=y zDZf${QN)z7l$Yf9A9H?4FW-M1tr*|a$CVOVQLOU(VS7wel^*$_^6 z6`%Ckc6(oy9xR~_Swh~svo&G4vfia$lJ1Zi2n>BMw|I@Waougxhb_gnKOzv^WU{9O7$e_KCDza-Cnl=Jp% z6z<#D_k{lM^^)^m%F*wNk8<9f?ZRiu-qrfH*ks<@`t$#ez0LVlNPczAPxbIRKgr|s z0VoUzbhM9EdDO{bUCXh33(s(@}=~}AJE6^b9l=>JeT#OoDXY! zoc`lYn~Sf)dnNQxUH)+^M-KWXzxyZ3OKz3_O|?tzqo$(d{IAcQ^W8ms{keWj&4qn;geETV1C_nUt^3V7FPnS|Ojx$tv_46fJ`&HQFO{)2u&{3lU#5)yBzq>9zcK;P2SGx^H6zf0s>v6I<~r-12w++nUA0qF1F=wZ-#3jB7qy`mXkdH}$rDp*~0V zuFc1>!JjStxc;YdeusVz|De7;JcmyIVb0rh{wGV`*0}n`8jhN%;cflb;m{A##Y+PW zV?R?`yk^O9?7Lc*+~>FDo-}@2{r7A4H@%;JNs3?P_`H{&^j_-27RA$NOQ=aR7q9W< zxX+vVnKau}_%`IP5>-{#RNhSMy zO{>+PsP*vg{Ib3;$?`zyj>L~zF8nCx{hn!l@6t%I_`BSpe#73&7r&Q!SMTH4wvuX= zlvm2%_Tw|Y&ROpNlH3e@`_Vk$+uJx=gp{(~rZ?^Oz6p;(c=Ao$_9lEuKKwiO?&``1 zzKgejcmD|uJvT}<(r@|2ItrhSz2uBY#hbqxAaA3k5K@ueRAt@6U)$-(cR zd(H>x_e;MwH8kXVd-&e=E}@_5f$?66>P;&Az1&Z={cq$?2zz}Ug>SMpR-%6YLU-)fWX8l`NaSG0SHtS**mW98$hFe*; zKXEnXvK?1h5q?&C75maP_ss5<-3MyAzgL?9DK;Q1ma8omck~*P9a=0WxmdjTIp=;N zzj&SE@gv#Cv;W9G1+C7!X?gigX#cyXr`gZ4Nl2B+Dc-ViP7_GG0B-N)JL(KCmcuU= zf7jl(#N2n~@5g3+qW10*@-M!Z_vF3Q`@OzRb(-)t_BtFgVfY6*@0b5qQ&Vz_U)j?4 zQpHO?7w?kyk{krQB$;_0ufosO{;!tt^WR>X`tR7=obL%+7JN_Z|4m!Qq|%+|d@0+N z?riV33Mza*T|AXhV%hRHxf@C>E#CgaIA!vOIsetPafB6E?uC|r~-Di^hj#zpI*bJ4q$C(DqXI@fV=arx0#Q2PEh_&#Sm zVBKVw=Qih7Ewb{2e59ya(Nw`p@}}sanCo4==r?Ji%vsJ*_tvO2HHun4rRr)H)haR? zt{R@0@4*~VE11=&T~w!t8Wa~iHMnjO%pZo;E2>}Apr~PyJ-iX58y8KFIvLfZND<$( zXj!6jkxNl|_$K9A6rK7YEjYbdQS&0VqKla=ifU)IENWGhJ@Ne0)a@-J*(bo9M{yG6Fewk5Wuwq>^EwiULOwpF&(wl%ijY-?@nZ0l_sY#VKx zY@2OcY+G&HY};)+Y&&hcY`blHY`@#~+V zvYob_v7NP@vz@nHuwArWvR$@av0b&$g27wd=h$K0_2*g$L$HW(X% z4aJ6G!?6+ANNf}~8XJQ#Feb*r*cb=nVm!73%~-gAS@UQ!9uYxEF6o#BC#lJEEbK$V6j*n z7LO%hiC7Xg4ok*TFe{ddrD5sVcq{|U#Imq#EC-u_O~i7sJS-n8z$RgZ*ko)9HWizO zO~+S=elB4mKB?ht0mVb*k)`CwiVlkZO3+CJF#8ZZfpUeRU>C7V*k$Yrb``T>7=~j6X2-5!*RdPepV&?87IquEgWbjc!tP=B zu?N^g>=E`DdxAa1im+$cbL<875+gARPQ}aMPB;xOi^JW4sC86nDm5a96w;-W+$sTi`A6R(NZ?4c-=S zhquQ&;2m)k?}T^8yWm~%U+`{tcf1GQ6Yquh#{1xX@qT!J+#Mf)55x!IgYhBwP<$9Z z93O#?#7E(y@i909XW}fJjdO4=&ci)$Pn?ena3Su6i*PaSjZ1JTF2m)x0$1WHT#ajR zEw01$xB)lfCftl$a39b%}aJeWC%;kZ43SCYlgU31`BEa3z`%%?UT61<{gdMYJZ`5N(NeM0=tG z(UCxjPDE#-3(=MMh3H0fCwdS)iC#o+q7TuR=tuM?+=&6iKw=Ovm>5C~C592hi4nv| zViYl&7(*}!Ccz@u1c%@fJi>$UB>04Y5E5R5h!7LrgoKb1GD1!$2qmE+)P#o65;{Up z7ziU_BFuz^@F9E&Kf<2~AOeXXBA5svLWwXUoQNPIi6~+$5lzGpu|ymZPb3hDL=rKM zNG4JUE0Id15$VKuB7?{zvWRRVhnPT2Byx#7BA+NACJ}|iWMT?2m6%3MCuR^ciC>9X z#B5>?F_)M}%qJEQ3yDR?aNo2Z=+(Vd4mJlsHBlCr%K55GRRK#A)ITah5no zoF^_27l}*6W#S5Pm9P;QffEE_C$16Ki5tY9#7*KBahte9+$H`Z?h*Hi2gF0-5%HLK zLOdmkh-bue;sx=NAPI_{YA<7VveWEk?d9y{?R0wudqsOCdu4kSdsRDPuV$}quVJrg zuVt@ouVb%kuV=4sZ(wg|Z)9(5Z(?t1cecCOUG2^6&FyaX7WS6*R`%BRHukpmcJ}u6 z4)%_A)ZWS7+1|z8)&7gUo4vcehrOr0m%X>WkG-$GpS{1`-9ErR&_2jM*gnKQ)IQ8U z+&;oS(mu*Q+CIk4uruu}JKN5&bL~94huzc8w^L9mS_Z95RwbXI4akOMQ<6#+qLa~8 z6nAnSr5|Y{`;#xwm*^C9D(Zw@V3bA6q2Gkwb9;WUs6PRlXSEKS`n>;Rz|C!RZ#@3hE_)_ku_YGQ%+GHQyP;p*G6O$ zQsb(1ZQ|P1bzlqk7RxA|ox3E63H~YIJSj+Sj$Q>o2ZtUE6)ormYL= z?9;;B!qCFm*~NJc)99AQ%lQqbiWG%8bS%<7k)+6h~ci7^G3+YNWBb$?M zWDBw-*@|pUwjtY+?a20I2eKoHlAXxTWEZk4`3u>N>`wL|dy>80Yd?S-NDd+glS9a% zZEDn`9g2`WWps2o+GN>qiaQ4Oj^ zb*LUSphnb$no$etgZiR=s6QHj2BJY|FdBk}qG4z_8i7WlQRrAS8jV3?(Ks|7O+XXT zBy=2_jHaMgG!;!l)6wy02AYXxq1kB8Ctd+F(3$A3=qz+LItQJL&O_&;3($q=B6Kmj z1YL?QLzkl~(3R*abTzsL{S94K5nL${+l(4FWmbT_&O{T2)2~jmoMt=CahmHi&uP9>@z;wZzT9br(@LjRPOF{PIQ{0d z)@hy7dZ!Ie8=W>eZFbt?wAE>w(+;PdPP?3TJMD4$-D&Sf?LX}AThi5N)oC?oHEFeI zwP{pZ9a>#lJz9NQ16o5`BU)ox6IxT6GtGtON^3@IPIIHRptYp6qP3>Ap|z#8qqV1X zpmn5u{%k0%6Rk6?3#}{d7aE(^jnk)y>HbajWUp z(5*&_Xt-D))x5jR$o10q?w}D^yTmSs;^|SQnGw|~n`1uU{ zdKP47H!4 zP;^8Xk@O&65w$sLd|@5Mw8-C*Q$(vJ6_k0J;krE&)AN{GoKcZEhB<{ff_2ZcyYPgN z>QzB}NruRM-X-Nd`XyX^T)SX+88|4%a((>_s=>zg}0_gP*g-hJ*k z(P7_B(c3ew<@#{NQ`U!9XXJ!Fk8NS8=SlNuY;2I&donJZ&()aE2WCth=$XYBm3c3h z8DF{J3U`eMD)N&$Ywl}kx*n$crq*Ur;P1hV@UHoP#fg$-)?3*t%nO6|1@9`DBcrBT z(^pI!uV2hfV%Gq@8!TKUdL(Hjo3DJJ++wQbGv2qBpV03Qzy1N#vB7ai?Yo!no@C}M_k^|IC$X88TQN{l+(+YAq8U*-&E0CPI$4!43QBHZS+Ms!7VG;Ew^ zvUZJjv~i`$=({~2J#2GWpYU-J%j3?)(c(km@5CRE*Nj_XZS6TPjmThRHp#Ol?POjP zS62xAdk5jMo8n$3ZB5&iTeIMgg8hsJOk2uD&yj+Cf@hLHrEO#rWD404c@4!8MNjpB zLXBpbF2wBXJ31&SI4Ej%+|zNX6UXOHN&AbvnNvr&lDAS+$6F_l(=Rorhwe|{C;MCH z=B%A$GS4eGlk_W})E-KznjOy>=Skxomt0Y-Q}xmH&}}gK2dob@hEGa4mSRkI%D9#J z>%2%-#{cBH?^iT8_xG)f87<+4xQgvm@!8U2#O?Na+~awz3hKr6V6^3} z6(8`PA22$&Psn`npV5`lx8+vP=j99Xsm!WOKkj4?oo5k$n6QFqrzlfgSu$2~Kzdu* zOM6OvRozs(U$;{yHK3AR#=52`Q*_YqFr|nRPKnwi%}A+dU6mG+eqem#jH~%oC-o_e zVMMVg>>S}_QAb6L;-;#Xak_t2(6F%i(a*+hwECtlQtpeNo>zhA#9QdW(+Lc|)|R0` z+JjRAxidu#Vp&P$GV3vhF!nI2Gxu?O@Ro>bO5J2^bzkj3lfTJk3iWjg3=UrsPLF61 z^)gZuWmk**H*klDuX!I+TvpUqI$OMwI$1BIKgp*0%n9=)ploG(q~50G2K`au*BZ4CBA_Zjm!f-OSk6*flUVY*W~% zh<#D(;ts?|CreX$rXI~Wn$?sSlkLsu#=^P1xTpMc1FnY))bf~ZkrjnP%(N5&saqFa?#P3nvB4e~Rltc^RAajkG1r>P=dwbiE} zcYrR7@+b293V&rI zeQQIM|04em0kuMXLc^jehs=*jO{t%HHSO4VWoA%Lc&F-|c{W0uG8Vl!gf#Bt(BC(Dx?rp`=zp0+PDD9bOqf9Uhw2y>yIXhO)0N zz(}`5`R>Vz@vj})BGeoW{%{f^7^S-X=-U7Y7@deBV408=7@ER3wuV?=UUm_IhRC_6iZZus=ao- zaem^_+|1yUg`<__auybD3Fc@jF!EX3xqjknvTT)7E!7cz`vRH;O&~V)I2sqTzC?a-hb=xZkqD)X#rY;EAAZp}oQ?$8?Fg5j!DaY6i;`Jr$7( zQrk``3V$*_UG!(J6XP%LV}2*$UawiA6j`*ToX_T<8)?%-l*G#s{;UVuDRFY~$iyaN ztHu?uX=0sHlRjB(@#_~>H>zw*)lrx!OqIU;IaB{hrk}2anq> z>Lh(C>&-aHO%{z(bkbUl*ZnUCbO<-b{+iCo$}OnDKE*ZgNKvw~r(sbPCGV`~A+C;> zC+Z}==zW_>mA_PUHg65vA2u**%-Cbmw_=;dWhM+w_D{)74IJMwqf_RnEK}C*+{sy6 z8BFF7_5f~=WGj!Y!hsX78{LV+$k43a0rLvAM~2Gxjl` ziQP1dLTurU;>d#C>;=-BY9D=y@xD3NqVjneTr28|cTncItaAATyD`UIk)=7KX<%6+ zITqy~{Y0}g@p0l4>wL}`Zh$aDk}36&VcDwO-&jrA7dXz`VceVCYrLTzojmG#>V%tx zeY{qS%83zib#Vi6g2XDhEb)~_D-smv6luy3WqD0yO?yqSW~_FmuBqV{!$woGxq?Mt z>EqYJPwTfQh#KM@N)1zo-3_}OUOi%NWY4JFn3M6T2_q7{lkX=twf3>{tN~Ve+Qqb4 zS(@yzIrSz?&dtxO$e=TtF!+o-wlC)pzpLPYz*W>kvPE!u<|1$rUqKZD(c*~DBHYCPBj!3zb?=fz9MsINs<`w2@W_b^1uM48$7YXkAd#5J?yj)+NdoyEJY=;)0Z3)`jB>GdgEp$SR+=p0SPL z#0e7I6jTy72@wDtA7;_K#b&3&1i;1jNTBC5k^ z=j$ERQL~fXjdPWATo@~DDXXUFuMSi<)dXtp>FVf|#Hkq&f??=^HS7R!^_2P$ZanUvoxQ_UOcMHWZ#WGb* zU02;+(-3oA^Kq@%hv66Hw_hC{zBuA+)X1^(qQhew#`TPwlW4IXN_&_dni-P0I6Esl ze&UkCF`NXC9zNatbnL`1kFhIb4@HjlWDDkr7bst9UTD1ZXZ$mQ#s^gm^9;KbmKW(9 zH8`q#Qdev5TzRJRG&?JZbAWr5TY6nQvma+Ew~M7$v0l&~@3S>mo_-*jrGIWsS(QC^Kn zhgo@o@$%!bza-MroileZ16jj30bC#12&Gip&ayJSY33=WM7%HUuzFGyhnt%m%-*3C zh>W6&;wmb(R-Ac~(LmTn=xbtI`+3wB%og62aTVLNzr=ay-E(&qw3@_amJ_@bRf}0J z?kGu=I?G1MyDCV{UDHL&p_u5{6LG1@Ytty19Wt%C=cb-3v@z~-TMFAnq-TxJe>&xY zrKK;IJJ=&pBv4FM99PUV-SKe^tZVHtVVloOYmaz4`$^Ib?se`^CNFbYhC$dV_J#M2 z@GTiI(Lni#`sWA~sv*5)ic1m!oBs%7CCndw1LgK$gqgV=iGhGecR*c%}Z zdK%7-*qKl*^Lkizc(?c~UhX078TS|kqRY}viawgZwAW0=q>$v^Rz}wS>>~wr4J~}z z1lZ&F2}{$cjG^rP>{O43qB@c;l2}PC=`T{Fbd~g;yt;Cxrm@!I!}0GG)GH(~re|zu zZ1A`(*7MfH^!w?PvO^}8$;T(};_#IZf@^D&O$P&Zq%Fw_$aOPM7F5+A(7(u-lyfeq zL8h0WjBb_knSKznozH3QhKv@8tD<;0{q?>+2L59~J5jr+HvScPwyafC7Bd)3F)N5Q zh%+^9IIp>2lBls{qGYk;v81UqO}1LmOL;`OROfCQ7dk$yQuyVlVR2=wgmv)vnwe`e z+h?85syYof2~<~ALFxyVgy4n|`ply_>n-!h<(V=``K49*T^8wIU}9^yR7Gjqn+ zMnN0Xu8tSwuk&rp++tkrg9bgzWw5L9ei85mi-a<9wlq&I*1A|Cf-lA2N~@LmB6CcR zTWGJ)1)MpOru;x*4OtDA7kd%=Ae+Le=D`yP1bpE{(IauH_eR-7MSGQ>c93qP?vn0Q z@M*J;rO@o-`@0`kdO9d1Y(xYvf)jBv(k}|-C=>LFSYlNxEp=!bGTtc@$*eyiIJbR1 zI_dPpgRDO|m3d_ZRmF4VQ&mmOD?{+`2Qjn+Zf0WkWpVi_{keJ4mD0)PFn?vpmM|>h znDM6nVylx*Zg|3u4ezQSDSkBh&$wNp5m`-qLp^=Odt@4Qn#n6|KxWN+HgAunO7?K! zubGMLF^n7Rg2bw+0^e}us2qiURRL{mND!YZ(_b2I%k?&;G5UzBNv~&=;T}y(i3v+0 zCAd0(p=QSk`-^YqJ!4pf2c_xOD?ZD@6k&FeUqah}<$i&Zhtde;B-IYT{K!F!=aNy3 z^Zc2f^JP1Hszkkr=@Ppoc11>B%B-XZ-d4q8)wq-p?Nw7hbGN{*p+mibq8G<4D!9+w zA-SN)R`S(8+8x28{SU;fk7=DTCaVhTDL>mQQ5T?B`MvP}E$yD*a+)ExerEJIEX*F# zI-w&|&GF(MR2I?Sr2>;Nv5#wTp zM_e<=C22A2AX$)+t;kNZga_wk-I!F3=^H&+!Hk$a@%rR&PoV%y+L+sw*_<_A@a|!~K`~-wNOb4H(-l?t0?DY1XW=g0Js?vg5khDP+s z)aw2e7J5~S8XMd$^&!(Bt#9aVD&uoCP#304_OOPfU6LGD?g}~F~b8X+bX~)xg=QGuh0;@1iGcNPn3N>B_MDy5AlF5=fvS3Asdal}{v6#F0 zw}@cHPKqsv6Q@p3BhmuX8|4npUBX$rB8T*D|SMu6|yAcmh8WVft|9ONU6R zXfwjXV#}u_r93p(m3k=FnhrDc{@I1)IK6p+o+|~j@;V7d2&ahditmV9d*@1)E40df>UHW$+CNNJOiz6~hqfJiF=l04<%F9F zWyaM=X=5FkHYf8~_KW=clTA~Yj2Vn{mM3Q?*t{URBMd;Kv#H*$*b)5PJLXvW#Kx)oqEo8KuZu zKQ&b4Vki@zAe4&E85;)N3tkabH>Mz=GrN`c%+%Y#3N6VgThLtGTQN3rSsK%0jjU2s z%tR_z%2>m0B<$tiE#^>`oAhc(0yj)bi&~V}#hO0eGw;53Ng{Vb1vy>5&cq46W$lsC z(Syxw!`{Q$&z&ubl1!Jy$xkXPXwPc3mNav>fbIdEf>>dHB^_9$PEED`%1uYG?M#KNvm#{Y> zHpL~i;&^ptRBpwBvGOcMXJfo6(0m~JdGuCuV)XiPPmO%W`2HVBZ!MsAF{-%}oOa1}_e2 z6mF07i92SE%siYGlv^*qkaIMuEi0d!r`>Np;@2hcT5Ow)Uvv4Br%jaw4iFTWJ4Q+J zF-A9LD)Tq?a?X11MzR$FeZr2%b&Az#=4weIludEPu?pTCCijI z^BLjSFY-Z@Pt5IvW|{4B2J(Cgj~h~ax2N4n@0_=aGr((~geI-4jnq%j8_bB0!vDGd ztq5w&*qBk{4rQ9zIa3qDQe!&joV2!QrSbf%2IJ1O^07x{)3x`e6fp7`)g~LQ+Y)t& z6#ZCBUZ_XxKQjhjSz3)zo6&~RiP4SGhtZ!gkm1P?FksM&VNA0!YQ$BMj%Q3|Ok+%E z%w#NMtYoZV9AX?~>}2d_Y-gNeTx8s0Tw*+CRA72BQKpFL&EzwOF@u@O%nW8eGlHpS z`ZBYaKFlO$F0&r{1oIN}5c4$i9P=piEb|BxW8%yPtX8aAtTrq+R#{df<|C#Ht2L_~ z>m~CJvpTCBYY=M~%Sr3OVzGv^yjY$r6DyPz!nZCYs{)(KF2k+D^pKo3V(qn6r_ynzM~_kaLQ2kz?Z!oLl*qIrljaIZrrGIpw%?ZjYcU z+-h8eTbtW}+li43%8yyf*Zn(9@{)Lacr$rxd9!(ocsqH&^XBmu^0xD4@iy}|@=o(` z9s&Qga4nA)yxY86ydvIJUQZ8q52eRwj}9JUk0BnO9(<1;9$h@VJqkQxJeKmT9@9J` zJjQzDdrb9M;t}Z)?=jzFoX0$mvmU!VE_v+qIPZaZobagS`Pie5=SzqF{qytzd~@m*BYIsNj^~jNr5Y7n~Phf=hxsf+E3F z!85^g!3#kdVMSpzVME~@otvld$XUJ5UR*Celv zUYou4du{jH@-MBEm$3=&INjFJ%$zaJKiMxa$;Y)ZDsYD@BNrp*+B*Bt!$;PSClIfCdlI@b; zB}XKOB_|~|$py(-$vMeY$rZ^p$#uz1$zPKDlDm=zk|&av5+`W|skc-ttt723ts`wM zZ7=O19UvVp9W7-@J4)G7Pbpt2l**-MX@E3D8ZV8LMoX>IWNDUkoOG(RK$VUa|o)gDgZQ zm5r1Qm5q@pWrJiY*+7{|W|RqKv9ffTT^28!BukJL%5r6SvTWI0S*q-cY_06F?6_=| z?5=c^Y`1K+?6ho*ytcfY{E_Ujj3R#^E0Q_MUF6SXf61!ItICJT`^j6$Tgpeu`^)>t z+sV7i`^pE(2g?KGA##CSDEE>Z<$-b^xmxZgm&(26TzQbZK%OffCtoC=AfF_+%CqDP zkT~R?%MNwH% zOVLo#MB$=nqv)VO6`d7b6ay3tg+!rLh!iq~P7$eyQ=}-yDzX(hid@ABMZ98y;*{d3 zVuRwaf>i8QoKXF)IIlRM*r(X8*rO;^>{V1&-d6mjXsIltq$}?z9x7PMe#$Y*Mk=N< zS2ahFwB zRErcg)g4tk^&`~-)jd^_ilTm@s;6$GE~{>?Zl-Rl?yCMp-Cf;H-9tSpXt>%_?V%o{ z7N{j^Z?(TVR2`>|S6fpH)zj1q)xW8CsCTQksduUmsE?`7sn4h{tFNg4Qu}KwYMeCB z)B)OGG~F~^HH|b(&0x(4%>a!=F?v>Kg8s!?csHSwBc&3H|UCP9<0nWEXIS*O{n z*{s>9*{NBpIjK3Txvc50AvD)DcQp?+k2Q$4j<$)mg|?-(M_vbQe{DDI0BsL#ckNKE zL@Uz@wMwl@o1*pA&euk24catqs&)LzhD)!x>w z(;m|9*4nj`4NY`Ib***ox-q)WI)-kguB}d}Q|dx=(Yk564BcYg1l<%}p)Ovx#IQ~m zs9UX@u3N7|^y#{>I;wu3j;=qgbJe%dU(r?8AJm=D*>!*Dy6J1^Y5G$-o6b%DRCif- zN7qW- zZ_#hlAJ=czAJShF?bBb-Z_w}1&((J@Wa+2tC+jEbSLrY6uj$Je8X8D_MdMTbJ-uCD z*05aP#BfVr%kZbZqM?Rio1vMZreUz5vcccb%@ArBW>6S}29063p@+fMkZDLaOgAJL zW*UAq|yL~ zJRjWCcsqZXagcF@k!2Jbc}9^@YLpv8jbX-UV~jDu7;j8B<{Kv(ry6G&7Z?{Bml{_X zmm60ae=}}0?l$f>9yeYx-ZcJcyl=c?+&qrtJSMrDxvjac zxre#F`4@8+a}9H4v(lVnR++ubVP>Iuym_J-^GP&6HP^OOw5&GoF%#ys=H2F-=8NV7 z=4<9-=3V9@^BFT{{=$kNNgur#-j zmd2JImN?4-OTJ~V?6bdZ_ZEz`G3c;-vzsR+m7#hMlz_Is2@;wRrgRYQa`PptRATzt}al|R4-GHR==&@to~TNNxe<|x%yM} z>*@nE25P)hAF6?A4AJB(paRiOXGw_fQF|=yvB2lSd9#g zWQ{8tw>7FYZfac97@+x4W1Qw_%~P6tHSIM|YaZ9!s<}_|FHJYi_nOw4KAKUQv6`)# znVNZ;4VsmjO`2CVDb2^4_cUK>e$afY`B`(2mZH{Jt(jUsYR%PJptVSArPeQ6tF=_L zHfn9rI-sSaWu|4RWuaxK<*DVX6`>{8%G65ID%L8~D$%;C)u6>_QChUtTdmhxLw5e4 zEw4RJd!+Vw?IqgtwP$Hh(_W>$U3-UiTj+l6^V(;%HM9-1b+wJPjkGJYleMpEXKNQ| z-_d@meM>t+ho_^iGfn4>_9C4XI(v0i>m1cNsIx}ru+BLh4V@D@=XLaS%ygV|LUqJC zRXTM#O*+rDDIHelp3VcEr#dfmI(44wywQ2BL+TQ`JY5Cd!McNVN9YdMouE5icdqU) zy6bhf>2B8Dr2B{NM%_cY=X6i%p3%La`?s!vuAZ)~uAQ!quA{DluBEQGZlG?6u245p zw@5cxw^%n-H&-`9H%B*7w^p}Gw?X%sE~|S>_ml2t-4D8$UZ?Im-50uDx&!qF=?&1E zs5e7TS#OfwWWA|+OY|1#tz&m*r*~fOjNV^*8hToKdU^(W zCVG55D?NKXCp}j^Up+6q0KGuH1ici!482UfEWIMVTD=y%2EAK)wB8-PdwLJ`=G(s4 zlhg07PwLOopQ=AWf13Vu{jvJX^q1@ZrhiEPto{Z4KlD%Oo9mnD8|u62JL!AqU(yfN zPtZ@(&(zP?&(Y7-&(<&3uhnnWZ`Z$}&+0$b|Ddm6Fw9`Op|Zhj!wm+m208||1||l9 z2F?bN2B`+o2Jr^<24x1-22BQe1~~?$22}=+4elAV8+RXN)zBHI4r=zGxg`>~9=q>|z{j z9BAxh>}l*~{HJk%akX)wagA}Eaf)%7@lE3g#zRe%Ozs-rF;+7{CjCu@n{*k!HvYk6 zkjX3KDJC;aW}8ejS!OcFdw0<{Qknnr}1TZoboem-$}v zJ?00@kD9BQpEW;ce#YFu+|u0E9KPscZfEXn?rk1w9%3G79%&wLo@AbBe#Jb^Ji}bm zsnop8yvn@Uyvdw4zia-$yvzKp`3?Vme3CzqKa4+$Kbk*|KZ!q+znZ_2znQ<0zng!6 ze~5pSf1H1oug%xuYw-2>hI~`LIp3OZ%eUbN@xAzg{5Zb*u2}wc{vG}`{!M-fzn$O0 zA7Jr}|C~S8VwS}ei}@B?ES!8dTCB48-C~!;2fn7oMT=7wr!90WtSsy;94+`3mKK*R zd@KYOkrqcSyeuwTBv_0;?=8Dkk{nQa+sNn5g(w=EkiyDhsc-&uND5mxUl-&)?X>}Peua)8w} z%cWLJtVUWbvRY`RV)e7tPOA-8^R4Ds{a`i9%El_tD%vW{D#FUwYKoPsm7SHNm5EiV zm9~|x)g>zjt0=2(tKrsA!`jkUGD^#$uV>xGq1YF%Z0+&a@b-#X0tnsu#pwspI; z#JbSB%(}%o+tn<$&VZM?Q+0@x&+DL4gZEo7!vAJRM)<)iTxa~mO zPd4vt`q@sl9b>z|cD3y`+r8WO*dDb#W2f!M4(N zihYc2lkF|r2eyxGZ`)qCeP%n%uAiNp9kL_r-rEkf8(=rc?yar7-4eUicFXKm+D)^Y zWjDr7&F-k3f!$WS?RGkL`|Zx!U9>xB_q*K*yYqHD`v|)*J4?HGyK1{!y8=6jU5jsw zU5Q2>Z$Qlk6AT|78EO{S5n+ z_UrA}+V8eMXn(~1xcvot3wtyBPPCESUaNa@PLB~Pg!OX$R!QR2q!OOwlA>84zgUBJ)A>JX$AX0Eq21wz!%c^K4&4rK90z0G0-v6vBa^~vBn>cn?)c5-#{bn$0G*~r<_*}>Vy z+0og>+11(G*~Ho3dHnG>=V<3#=OpK3=PS->&K1su&K=IIbG!3L=XcKUok2k*9Zx>A$Z5Iod0GA?{JeMq&I+u2r7MB{A>n_zU4_zL) z+;(AIKDfxa4siYKGTwE9tD@^f*R`%oT^G16aoz0to9iamt*$#=Rb3Cdo^(}no$Y$U zb+4XtG8=_YqV>)YpiR6Ynf}JYo2SVYlUmI>vdPw z^@Hns*GI0OT;<((ZX?`=xs7%k?l#VCqT5(E1-I#Li``bb{p_~EZLQlXx2f}Qbys)SbC2@Xa<_Ch zb+>TmyF0o&xVyPWxyQRFx~IA`?j7!`$FIBN9>Y9Fdo1!;;IY|bpT_}@6CS5L&Ut8i zXn8n!ICxlkM0mt_#Ct@0qL6na#8RC`D~T0Cxh&>q)4K6t$Jc;zv{^RtJN z=UmSbo z*F3M$UX#7XcunzI;kDFjrPpCEH7^sdi(dP@61-x);=H`QGQC>7TD|Uj-SKMkD)zeR zCGo28>hK!lt>iu2oAB=Mt?2!e_Z;t~-jlpnc(3u^?Y-Xn4{tT^J@%?KjnLw%-E3pZ$LITjjUjZ=;{8-&(&-euw?k{7(9v_B-p>u=|3ark|mo zjh~61g`bh1t)G*ho1eR1uwRs)$S=|_*)PSf*ssj5!mrxzhTjvv9bqs0ZX3Pwd+9gC zU%`L5|5X1;{>%J-_21~f!+(qa1%Gva4S!949e-{AX#aTsME^AZ68~cVGXDqukKm8v z1_TTXPzo3oFezYsz=VLQ0m=b$1Lg(%8n7y0ZNR304FNj?wgl`7*d4GnU~hn5fPa86 zATHoaKu*Bzfa?J_1KI-W1D*st4R{{#BH(?%n*c0uNFXne2^bwXCvaKdhQPIfDuL?) zR|W13+!pvp;Qqj)fyV<+1)dB%7kDA?d|+H)LSRl{L10~AePCl?Q{b(@+ks3V8+bSH zS>U6MGCf~tZtgUW*Hg6e}Bg4iG?s3WK;hz?p2 z{37UiP-oDHV5Q&z!NY?Ug8K!_1rH0B4<>`>1&;K#w8!2?3%LLR}N74{369Wp&6K4ePB#E|tNBSMCStO;2ivMOX_h-%26 zAxA<^hU^O28FDa0E5sqhE+i&IJ;W#^Fhme?IV35hB&0ATJ0v3{E2J!>E~F^rT1aEa zn~=L9PePuBd<+>AIyQ7dsBWlXsA;H0sC}qYsB@@is86UzXh^6q^m1rMXmn^?=rO;V z(5sNw*LT`prp?5;>hdvAK4t*8+I`nPm`_K=eA4B_x$%UosjR>0*HaBcl z*yga^VSB<(guz#B!;XcW4m%U}SJ?S5{V=UCy)d7!;IKQMQSKDj2ccUQ6s34)DP4sYBV*5 z8cU6%##0lhiIg%miJDAJp{7#PsOi)UY9=*{noZ52=2AaW^QigM0%{?(h+0f7p_WoV zQOl_1)X&rkY9;jx^((cCT1}}?YpAuL{f~9ixs@C#aLuDe5$JhB`}~qs~(osK2Pc zsf(04r9o*@@HJ6Nhtj3=D1FL+g0DVO#*_(VN|{mS6rZx7EGa9>nzEs6DLcxZa-bY3 zC(4;}pJk-BMNpBHfD%$7N=!vj zm#JtfhKi-)s4G-Fl|Us@NmMeGLZwn^R63PGWl~vGHkCu=Qh8K9RX`O|MN~0WLX}cw zR5?{aRZ>+{HC02^Qdg-uN(mYECUuLtO;Hq0F%(O6 zPd^@@5;y`kPx@2L0G2kImBiTX?- z8l!QVph=oX_oMsMa`XUNo*qam(1Yl~^blH+9!d|Rhto>*2zn&_13ii!O^>0+(&Omy z^aOe$txQj%C(~2tsq{2@Iz5A)NzbBZ({t##^pEsBdOp2?UPv#Z7t>4VrSwnqGI}}v zGrfXdN&iCsO0S|<(<<~DdM&+v&$^e%cg{X4yf z-b?SJ_tOXHgY+T#5Bf0uCw+uIN~_Vw=;QPW`XqgdK24vY&(i1U^YjJ!FZyr#BCSqq z(3-RstxfCDy0jjxPaDvNv=MDgo6x4T8EsDUX$#ttwxX?R8`_q(qwQ%2+L3mmooN@^ zm3E`uX%E_y_M*LMAKI7pqy6asI*<;cgXs`Dln$dW(cyFi9Z3slAuXcCbQFD=j;3Si zSUQfrLdVkybRwNZC(|i(DxF5B(;0LookeHUIdm?aN9WT8bRk_t7tDbUocbH_}aXGu=YB(rxrLx}CmG-=J^Ox9Hn6Mbk7xvvdc2hrUbS zqwmuX=!f(p`Z4{4eo8;1JL%{23%ZN$reD&p=-2cc`YrvAeoud(KhmG*&op8%24@I{ zWOz(JravRc3}ED$fs6t(h#AZbVHBC6%rIs+qr{A0MlwGzqnOdm7-lRpjv3EPU?wuk z%p_(qGliMTOk<`qGnkpoEM_({hndU#$joErGYgo7%pztnvxHg7{KPC{mNP#yE0~qc zFU+sZDrPmK!mMG|GV7T2%m!v7^BbeeY+^PuTbQlPHfB4sgW1XKVs9Af@p4l{o;N0_6G8gq;}&YWOQGN+i+%o*k^bB;OBTwwlU{$?&R>Wl`X$!Ia! zj1HsA=rQ_?0b|G*F~*DuW6GE@<_w>)U@RFc#+tEVY#BSoo^fCt8TeBU#)WZZ+!%Mp zgYjg%7;nah@n!rNeKF-A&onTNOcT@0v@oqq8*`0mXRb3hn48Qk<~BnyG{Z0~)4|+f?lSk7`^*F8 zA@hiN%sgS9GS8S!<~j3%>0-K>m&_~XHS>mf%e-UWGas0b%qQkEgIJ8kS%M{59@~%Y z&&sg_Sb26JtH2Io2eU(1MRq7Vj2+G@u_M@#><{cHb~HPN9m|em$FmdIiL5d^iJi<& zVW+aw*y-#Hb|yQEoz2c+=dwSt^Vs?90(K$0h+WJsVVAN$vCG)y?9c29b|w1@`zyPO zUCpYnYuL5yI(9v~f!)ad#;UTL*v;$~b}PG$-Olb{ce1At_vSzF~%V#ZEOV*0DW^Gto){eDj9au-!iFIaOSXb7Kb!R)$fbNzm-Y- zUdVLj_TSMT{U4q%^!YOmAOIwQ2j~ar50C>4K%ZC3LpcyV9;$$T=VogV;&bI-Y5BkV z6b^yke^Es5iJ?#qgR*abha(&*!T3f1Mgo2Si~`>ODQPs?wRj9VfySais{eP#JPygB z@kj+tK)76A+llBip$zEZO+rKZiqK@3?JsExav3lckte4ii;2_G0_7h53`C-ts92$g zo`q_93N#zy!M~+Bp#T3i%|%1pe?$R4&qF^4%trwM3lRCuc)s{whzPU@DJ)ow3MzVd zOHl6tSc=rXsBq;^h{u)75E6VN_+M06j-Gw~8Ld|Q;(i6}^OdlVe*ydoSOr*(h8U;- ze+|%U0qX$k0UMCH!56##FUpPo8=RfrkdwM9>RPu6t(~?RZ4BCi=HB0mD0Um{mF-Ag zWd}NSbSL`h`YxnzxEpOEe@Cs4_n=O8FIu6t50#GEj|Sd7fQTgrVSNvwUCaJJ71Uw$ z$m~yqERUdb{zs8&oEqBq<1s|sKaSM+C(yXlCy`g&DYT;CG&);)2B}4#Mf=LmA+y!z zkqUkR)mr_9jw$_(loc-`-AU?blClOG)?X8$1zIRaMH@{O>7e5qbWxO=9$Fx;kAA=n zkdBQZ!bu}!9c+x=o135!N~UOuxfx=Hnxj)`eDrLx1=5{pi9V}YA&nK*NM*SVD*nk9 zoj7BMu5GhNNy-i=VWT6e9O8uhbDYsmRTs3}))lS3Nd-PY*z2tpky~TM&9QBN&D54MA&)LQ%d$7@XltNYy4B9Xk<$ zw#h{z1#>JG*U5+K^uOHML0hWA>I}AXn8!^bt3`s z6cf>spd_TAnT-616ojx;boxXZA_eJ4!p}gvP$ohJSxA0eHqvy@K@|&fA>QO6bRZvH z8(e_U>q5joT7=f1Vw8YNkfL`f8imRb|9Cmfc?FUTsD$;ZLi@04MDDCXm|QJV9Dfxl z^6F5bwFD`mdNfU?0qs<5L_^jzA;)daXn;x!8YF5(qhs38R*!3_U{X7>7;qigl-xiB zeiLc+y9ImVHX;X7&=(qwS7Oir#G=Yg9q6$89iZ%Abgts3>EGR+F%g!zN?n zA56hs{V^3gS2_)Q^=vw}dHoD*#H5)R{&^O5;>m1mj>;Ttv1Bf`7XJ}Liu17HXg;=f z>;kOn&xP0}vqXn@p6nj@G~|@aRr8wR${8?7tDLq zuNbDh3L|%}#`w!rFtlh5w(aa%?BS+$Sl-$7*w#@Su(k6xV#-m!VU?3qvCN&Dumt{Q zYy#SXnS9=g1zK;zD5dRK;mjQvh3&)!+wH&fBEjomit@;CV@;r>?kN*>MTXzH_&K$-37pY-07aYS1w2xy$j7q(*6-&m9LMXa))I%cv^1EY{8HoI91 zbHcQ-+k8mf4_1YUf9C|Z_IYM4~AR%VtfZb40ZU!ya!<6ih&q^OAuC~ z5R46I48hhrgktd%!>}c)m#~AD;n)U+2uyx$B&ING0F>CoE?B3#H3|A<@YFkRN z<&rWikuJxy{41~tj+K}-Q-yUGS7Qgs8Z2;KEmkz;Dz-tj4pVBBV4iqArt(t*wgzv+ zaz8g=10FSFo%dU?0@GHkLD+_^ExLwnX=umH1=q27$qnq%n44Jml3UnsmbbCCffV+8 z35|_C#bDkIEViPe1NPY+tU~23)^G4VOlk3b?C7xv*uji zf57^!|A;Lb{Ry*B`HYRMK)9m`h7UM_=ru^Do>WWWF% zS;^xYQGy``poQd~WnT3aU&&GK+bMQeY=i=KJ{)lfIJP+@uIvfy zZxKGvW-&exEx{E>Eyb;?e!`UpFT?*jw;W%De#X(r75IUcmAE_c3w~+WulU(9t8nDL z8lO5;1*iSj;M3Qw#drU?4!<&SJ$`A(27Km~jrjX_zu{=VDlT_&6Rr}l8Ru7Q!PggT z#d+@A@HL6s@u}83@DjmJe94$y_zJb%;O}?byKoP_(Q+@o0`0>GjoOd*D?ETtMh9`l zfJ69B>JNPAh{O2)HGkrk=mw6h8UMX}n*LCintNQydL7!|}D|xcoXkp31ktX$?zU zx!np^QMSf0IU5`;wZ%_;u)_;S+v8-618$2u;!4Mza69CTuSYJpjk_zpajhGESj8Q; zk@vv+FY?6si@k6}dgBEdKKO#GzPO~o4_{E=kMmIgF2@VRg@b}{cllsk1%==U55*N` zhT*(3m+v&vIF#)e#n~0ZVN%#tlWPEmW3Vt>q6?Yq-hVRTv$A_)Tz+Ya;#IIRo z;U!nI@nKVQ@R@SC_&n`AJa%e6zGO=Qu7DTfD#eG&mEk2r%klL? zD{$K%D)9}bRrt+K)%d0(HMojOE$(4=72i6o4likw;92YIaivWSxaZhL991;ons_tL zAJKvrqEvkVk^nZXWDLurCG#=s6#IZfEa4X_9{-EOxK5f!loNxUOU)=E?SDg6)FIfK(A8_{*PRM`8 zr&}PReHcbyayWsVBM5gt5-tWj!uCx+VjI(+ut0LeVEF;WE|EMj1{+8`woo8Y*&t$# z^1I0BzKo*0HrAQ}TF5=dE@(40JpsDPhvwNRcygz~2njtbKVK0TcnkT8STWigXj zs5pz5sWO`wJbMlybeKz|o%@j(e0&};ZT);=ef2!SAj_46T<9;vpf|q~=}%S>eCO4~X)%IIgshSc3Kw>*Nm*1I8RAj7J?Jgv0+J zaO^Ol8ucfkLLMR3mmVehS*Q^=nPWufnB#=%k0*%fX(x%1)HZhveA!gmtB{oda zBjoM$iObUrh*5_P36Z`LQF_goKu1i7`-Ca1y%~YT=ER;_K2f&Dfh*2>=`_Aag>wJf2e+Ce1q?+~l_cZmhb z_h7%=Cw|d>KzJ)XBnD|bB9s*#6Dk9q5MvfRB~%KY5xWGPgm=MnqRQn3QNimXihR2X z1;I-KL$3&O$!j=!ZwN)~Eiq{CJEHdTdt&C)4@CR8kHlK+6R}M7GqKGGkwb=IWXd9( zoV|e{-!CLdUIUNx&ge(3ztNv;Ju636Z5TlM?UX0$=M5y+jaDG#)(#@^hQXw2$PiM+ zUy<~?G?W~$XBfGy-@l!m;UwQ$iCnvP1pKn>NV4C!A4v4WC~~UaXj1Xm7}D`k5r@ zKZ{g}olVNS%pqsG&n1!Fk0eITBN6;&?LxGG^!{NXImvPnIT|e{_b4tQljbfZ$KXGa zclYgtW~6n?P^l4T7}fnT0`>P*OC)tJz7Vi zw)Lbvy@9j~-bgM{`3-(qSCu?@WfSQ!V>5Z-{uc86-L0gX$~N-!@7qby(;cMw?>osD zb{E-^x|?pYhQzPe&JVwT1$4TqiCrBH`lcbXKDRKetG+F%q3|ai~Ecs6D9I57ho>Vz`fn2Qe z7m0@bO}hJDBo}T`C#|+?kWEOFv|OV_&cd|G^W$~Ezb?tg^+?3mC*yDf(qpH>PzNM z@*~MZ{-phq08(RUAUR#;HVFC{OyZ>>u&$xxh>S22dvl32Q3@xYOp74ZoVR}oPBDW-YMJC;_F3dbk8IM7mqQL)kW0G%oJXp>$tM#w z6_A(g3(2vvJ{FP4rkGrdO2`AKltlhzB>AwMRMMz`{Z~njKUPJ0?WzW!HRRMWwWL^P z*F#(-3)a<<%9;{#lwv)pg*A{fE;o{-S`*pNp_!aq&_XKUtt1-IMp~#`BY#wDCoef) zCzlNF>*NNBCf$T_+#-kaZ_94 z2jmj;kd!NUL|)}TCb7Stki+Dkl51?Ak^AI2$qCqVat3-q?poGG{wmi^E}~wNyzQ^Z z0_-*HmN%pYdP}Ncef!Xten(y!^PW72K9CjbK9W=IKar~A;e&_@#M_NwJVFcS4fiK_ zJP1>KOCArA{dkIw{dr1*Ypd4V$TpNBGu_xbZ=z!bn#z%;;gzzo1lz%0OQz#PC_z>k1=fcbz0fQ5iX zfW?3%fTe(+0LuW&0Y3v)09FEi0sIPB1y~JG0jvS61*`+C2W$Xr1pEe21#ALr25bRr z1#AOs2kZds1ndIr2K)}#1K11L2iOld05}LZ1o#7R81N_H2;e9{4R8!_9B=|~5^xG| z8gK@17H|%59&iEh7vOKeMSwa$1E2}e0%!wt0J;D@fIh$gUf}n4~Ja|k0|K}-$_vv;hj3o?k2@np5fN@3gK7AGd zEd+=F-w#vFoBuuQU+VCtB79~;!sjvlP=9#Gb^ww`1Cat6ga*UsQi^CO8it0$yV)bq zNc01|dpsJAfltE5!KYdi&_tw+;J>3lQ_xg24NZqnre?w?QnS$eO@CelLMNC)X6J*1BekRdWc#>fPjq7GMcc%#<>St2WBjckxDvP1UB0XZTk ziC=`WpI+QEziqK)SF5*pie0c9PGr;Ld zkHT+poH)qeM)dOjJ-;or{x=QkALQYp2vMX+AQFm1BC#k+bXgQFiV?+%;zUctBOjIta5LJq*MAf1iQLX5zs7@pi)q{S6 zs8Q4;Y8JJKT19Q&*^9q@0QYqbbhtP|94Quvg<_F7N_<%yEshb#isQsr#PQ+;aiTa$ zoGeZer;5|W>EaA=rZ`KSEzS|=iu1(z;sSA@xL({KZWK3(o5d~SHt{uayZE~JhWMuV zmiV@q64PQv%!)h2cf@za_r&+b55y0}kHn9~PsC5f&%~YL=g_y-|JuJi>5S%v=Y|&n zT^3%>aVo+qx$sa&d?$(GY|LbePrsAP1m6(LyS}MPD?k4O z_l0aH&FPxk^<&q(uK8UHx)ydV>RQ~jD zMnp%%$^89O4{AYr^g{2MaOp4qR8sE#O% zD2R9v@leL^?a}@4``>Zy%Ib`a`p@1o@RhnR+&kfSxt_2Q9Wq{zEH5ITtLH@Ie#8G_ z*IVBFSJ|z9mB9Xwij9hhii`Tz7ebL7=Sq}-E90X?T$vap_cnl&C1K%!tb6%H*hMuFQ(c=gQQm7_Q9b@&YdJ+k-S2Co&@9zx2M>Mi?RZ4;^uY z=s$Sj5uc*1Fpu0+&?*M8GVp{y1zh!8{y1OlNz zBoGUt1eXQTf*3)pAWm>a5HCm&BnpxQ$$}I?svu2}F31pM3bF**f*e7vAWx7lC=e71 ziUh@i5<#h;Oi(VU5L61P1l58XL9O7bpiUqW)C(E}je;gYv!F%LDrgg26SNDi3vLK* z3T_E*3n&3CU<9n7LvTlMS8z{oU+_TiQ1D3bSnx#fRPapDDR?e;A?W(R)+P2nx!Z6PJ3g^Z9Db_nkX?+Wh;?+YIY9||7{9}Axdp9-G|JB81M zFN9sfZsAMeE8&-w6ou!6Cx@qS{a^M?y!xW?rF@+5t{9>8oZk9}>brRf*?01Ck`QXD z%&$c#LK2_YBYT=0DG?MDHMFE=ReiC&2OpHf>A(7=UIda^3Gjs!Ne|~P`0YtT$-A^( zN(B6yDG9*8mm}tMqPYCBB()r#GpW5=J$X9R*|Oq{B`K0rNlJAZ=)K6em+%65`+*z9$J9@$Oi2#-OXqxKaCs(| zBUGFJwKrM0SM&3Lp99F1v~kvvS)DM(Y)O{nvTUx)vP-k`it;7RmG=sItuw+4Bt>AQ zngDZAL|?6fvTrJsNCWgbT)+Y4W zM5Gn=8AlJNCkdfvZ>yhHc5|)t^5XN;!RxoFja%Q0bYW44%*)Ee#@rsQRf*T2ty_{C zki+TV^7x{5C~r!x_vB#PCW%P90=ucJ`nH7PGX zkvva_HI_V-bV%y2K9Ur|Ir%o-<>EjmXnjpbp$EqjJ2{Uh5}!+6O0Fh+l}f6*rES3& zC9kFQD=0g-9rINaPT)6w-$-?Jz<(+9QdD%OhTbPKEPT;O8K?bLg252e&kB`k%-glvAqnG7;qKzzoe-8Xqg=Lba$+@76WC4EUu)d zUa5}boW`k~SpH^-G|7G%* z)*vE)?C+#cT#QdCET}K6kF9uEOO%~dGdD<$>y z^$qp6rR}uTH`O=SH`cRRt@RIUI{HL_wt5rUoFf!faILo`jr zzR=g}h25pxxNg+nl075u=YD`Vd8@tyW@2jhZSaE-Rewb~Q*^x;ENaT$B}%w!r`tJ(`9U_6&oIyl?AT%N_v)SddJ;HRrk{~vs_mvbv>U{Boxi#N6RIXj39 zP=4b4Kjb)<3qECar$4H%%zg%6yX%|omOSA!#L$0)o@G6)e^#FWd-<`{6GG2{N|TMW z1MHuacgmzM({E)xfq2!Ey6a!a`0pzp=Dn})NPb!0RbSWVZ1m{82CY|8%@XMxQRyG* z7C4ohDcbgKY??Hlf~2t zrK|Uji=qOk#e?)zvIwXa7+DTPG!dMfYtpkRmg>WEr?aQc1X$ImhUk=JI87J9GCc2c z!@a6F(26dIZjiv*#x%rm&#@luzUfN(m7dl(e+dnV4cDbR_xtkqPY(i_rb^^Atxq#EewhpbGFca59Rh`h_ta#q9i?yoIghi83n$_C9GK(5S7 zUW1_We%c*4^F1lQEWaTa_R)g^gbEu98Y1)PjN*no&b~xybE6`q=xI?Dx7(kVCBj|i zDXjEW=t&u9JOs-xDV5u)<+8Ra8e$V)COk<|Nr@_|Pkjz^TiuYJ)T3P`)rsc3)6}HQO!w(G zcdDf9CYhwWIyI|3Ra`46%&+(;U8f#@%yV20zP?B`FC?lsjTg3ILGx=_26~xn>Xx8g6PoNg#zN$Hv0omoZDr$-GB8eRggQ_An#_Ut|@ z_y**Wjqf=*kgiBvW2{s+{<|m16^qzOWG577ojmhMi)c0Pn6c46{R(bxYv`t9+NqK zhxAnDa3?#xF+*mX+L+z=wLeKR{(tMwS6N|W8CVnnayiTL#zcr_XHzSo7Ll3X_)+?b z>8r&Ts<<(yF%C}N)08{OC5;7~^%oiJp!BN7ipIvms?=CGjin&%=1yg=Mu{{seAWL- zU2UuZZE@3A&bL&3pO&hDuH)*pQf^JQq>ubt%f7Wn&}x%vwlp?>XOqN@x-_Y;#TU8( zbekHZ@{+kRw0>v#MXRU0)yJLzy$^Y}Ain{)3AhdTKIQ(yykx?9Tm#+qf6zzhUGn!n zXsO;aSeuSUs*(N9?uzuO+6>VoL-u@vcPaYl-Dxc4{N9uC9?GZ(GV0s5?*l)RyLmj4 zX?*G1<360HKtJhI@08MAjn5mOHNKEZx`FET2X|bK`wH^cQu&+4(t4QDoLcU6YZuJ) z8}3Y&{NsLo3swS%CUpt7`kd=`jpbZKe-2UhL*skSGgb9b+Cq5KC!iu=A4URRbLWmq z6ma`e1i6r-;3mSA?cYR}%T1{Xw`I{Qm$R+=rf1PjF`QkT)C)pafa;Lh)N`jLT^hk+ zo8p@avm(E{E6(cvGQYiLGUrQ}wKhGOYb&9t{XbqCerxfymcrRGeP$=ADHVA6T;IRy zrEz*+>tCsKkO(phk~8~gWC49r>LHusXY`SNwe6u2IY|ze=Qf>5Kg-#5a5L~o8V~cE z3Yzjjqo|LU3~tZePiTQZK!H0zA4yOBKhsCfS0+3eZ0OCcTck zeZx(xspKF0l}M$fQdya_tl-KAedhd1%9r-TyXnL(?&LkrtB~!LyIk8>IlJ7do6`IC z7aNF~NmWwcJ-n>KTBxy{b!BNsX=X*Ow5>|cPg-eZA8m-i5KYo#ZB>J;oRdqWt6V43 zzAAeK69@ZFBIAGU$rtLrGz`^`lhC) z7EU7K`d=xPT?1Yzw}W58xqc#h7G4K_JK#Q?gBwk^nr?Eo6y(iK3`h6$l5V;!qv3X( zT@RyeDrB2-3Z5i%NM9Mj?F)K+r>UdqZqvP{`!f9pGOEW@ebvLJW70ccS<)k!ET=Xh z8E%RV6}kCEkDDI#xi6=1^i$Bh2YV#Fw4kW9@>x@7(|aziXXQMX`H&>MkkRmJvJcI0 zy3bRnvToU2y>4nQeAQF{Cqg&ldi6`tzEk=Z@;6QT&_4sNkME)WuE_-G58&ZL)8)KR zO+uK(kHAm<>M8fSbVr0Y_l&V838ir*qB*?$Rz-cE@d&y3ijir;6N9@am2&TE#DivR z3&h7ha#8dA%u?=rWJqIIm23yXQ@xKSjG=m2W)-*c(Xut}?NJn`CxO^r$Hn&^Ze~IS zj4h_1UUv72ZH@!I=x==XXl5kFr@)O3_@y<8TvX`c_DxYTA8(~pJ+#vRbfioI(cnAJ z3E$LnVD!nrN#wZk&55$uc}1$%E}M0T?A#jl_94AFqmQQ;>DW`6V`c9X)^PKl)<>&v z@4wPwZuY*`Go==7(ottYJ@tR;rN=&-TlHJA^U>=wyE*9}=kIHa@T#`CpgEUoqdY19 zo3^qc#^yD@mB#;?KC;s0qCT}R-a25n7IOSzE-(29oiDn*Wm$9if6;jXyP&eU;vY1s z{(;xy@#%N_uom=gNMmd%oT_T6-PP~x>!9Ai@g$Jfe<$tjYeRM;#}{QbHLuEgmz@Ep zq`A4JxjkD9=dVF}>Y`FBGg_P5Ailu;6!bHt&l&-bx6SXGZ{)=0cb7Hgzp02Q zuS|O{wRo2L0jN)4Race(Gu4>=u{ok8yyYWsK7k~oPehD>HHCh_idC0Z|v%)lF2i(mS+Q?>$MIMpo`U{eKn0jpNovH*7Lw<%xd^IJYV^|?OQv>XAi z>0A$C_j1}-|HY;r_!3T5C)K!LnkA)LrRDdn!2Xj-8f4U0ttQ|#{|CRVMJHP~`!1Zj zYb`DRA?>wp=lE30b*?moQQT~~!O^#57Po`d+PLUEdz z+~}(^=oV2;aXACL7-_tUgD`z;Szp2?mCncPk0G3WhJ%fptB(1$Kr zTkRlyBCElB_AQTq^Ry4Ar=3oyM^!v;$*X$touo(lB_*fiSH+iix4Z&@%L??cCVEdN%vbd z+)JK(H$TM*Pjlll%fE?2Jw1Ha^1h{Bc0>5k^7?9=?8fq`vYl6WZJrN2r_gBBB7-$VSn4(Bnk z^@^;`q}GC})YfoGq69Q@UY4bS#m!Vf$-9K~R#8;~w}T|y>j+pC7~@Iq83%MtW=0K+ zI|KB4QYMu7fIFQ0?;IiM#;0XTr7J zKo@h|l-6XfgiqI63)6dB6jz#okD9FXN>NF5WofToUK!jl%A~sGP`=bDjj`U{vHn+C5rZi8w4+_faTP0Fo@EiiFq4jQ`J1Fe< z)(@4}Iqjy_x3cq8SSIFn!y<@d3EWtkTVuGB(cAMBI6JY@9o5Tuog$L$iCzwTiqqPX zomHL9otsaI*IU;@I}fBQ(I)FvkM?WXGbgUCT`Ec7{9WT}t&qQimAv_l)t7d@lx*vR zRvI*Ja6P`;dXwuR1)Mvr_pY{bQM#Npoj`Li~?`(Yo5%L9BO9Bsx+@57m{M?<0KKY_aqilbfTFD{kv7c`wry zw!yswW;C)*02JIdS|hj;UXNx(bLTmgixCJhmD-jD`Q4n%wj3yXQ+k^a<}r(_r$GLp=DqZ0lGm2s z)(j*0RT>SGWi~I;MA8war7Y>rmhoYZ+lr*Ma%s6qYF)wAx5*-FSzBdWVOuH3t%AIo zqYBzSK>thHT8fe~liE^cPn0&0KH%;RSKI2^B%E$5p6bL z)yB4#gl3>?+8WxfwUwm*5BA;yyqP3B7nU~@<_*(kn3B?nNeqpG|5dTTNU7}^r?^9R7lQP zk#`x)BdC*4#iI zcXw9mmH~K|lM&t~acYRA3S}+fs&!KQKAqE<(ni>yOl54?s!3ZB!Lx43KFV#Jj7^k}xOQIy$hzRT_HBjYuw z>ndr#bC|So-$ITxUL)Re;_am8pf-I(jHnceI6XMw4eGyl?%J!!s8)APq6gF7alIeQ z7{?yHFa85Okr{_Q-AnLTBwjpiU8U>K>$Q-lyyj}upYR+(2J~orx1VS_fSmO%5PpiH zXCM`kSOGfb0dKX()7k3u!Q!_e!&+9Yk;ZQOytm&lN(0*H_XSC;?0qhh_LiXu5pBC; z9rY^VBc#mY>_chXag=ImXr3B$TlCC<6^aoL8+=xDo;RSPjn~`OsAWjcce|smaWUOf zle+L6(o_@oYCYcYZtI9Cozt+{YYVy*)jI|^$*Cb{+k`$rZG-fAY|~j1u;ozsHAnDc z`ZL$8WqDDNk8MVu3_O;|`6#PpXp32ih2%lzDbDlJY%8=!SPgj|S-;jU5n4gFG?Dpm z*w$*;tsDC#YL`(bkZJk{%-GAe(bl-3M|hjX+$r^`dbDA8Ims1flqH1Awz_0Lk&x zvYnzjd`bNdEWR#Zr@@=|cKaHL?A1>rJ-%L_&1d!5eJXaeHj5Tr9gHw;= z@?DUb#5gX}mDKO+^Gy#7_*!Ys8S)KMY-dXwX=mQ>Jcj5K%^(L11J_`yz|2`38qwqL zwmj-{Q*Fm^V8%uIG>VqzJF&6`o%$&rdlF*UaW)D`Y?58vS%^W}ut$&H5~!X>i#~vds~`iR8k0T`yuq`yhFB&4SPG zlgK)kU2V=-YoKeH%o=}B1L+se_&PQhy|`&v*S!aHyJd;U)t#M~5g*zYA$5VXjaGGL zedZcGwomD7%xWUQ9OG!T4UoU9m`o=)W^h`FjHIXs_O9O39OX8X=?roYVPD9%3ZLwC zVP=!;eq{^DDn7NV!?LE^*1>hqQHv67y*`UBMyyLoJY*~1rY}kC+bH9{i!#N{TfT&E zMt@$*L&NPUg1Fw%gr4-^p0sOH-+47@0P`vB;|Ok~DdS@ar&$=nZQ{PN*Pye%f%n}@ z+ZTxSAxKp;Lv3SbWG^S_@h08*9|NX`=78b_iTJ4~72lJvh(s>JNZ^-e%wUPNm1BOg*WP2FcMNoD zzNztCLtE{&*d0{#TpfDbQKQF7cUt>u7wYM+1iiSM>b|-K*|5Xl?S7$Q!H4`>GRltl zM@qYzi1#L0DHHH$S!iEqgH9k`OIX*@V~heMMw&doE`su4 zC0Z7$9i0oQ-oR-0LeIjQ`xyFM9R$&d95XXuU5NDueJdE#F|;?J@B4OOdVBlyxdIzB zBII7weG5(!175b=$i#66Q{)Lp!HqTryEMz-m}`NdJ?af+WrJx2IB zly1U}pqyG5LK#C_{HUutL!PwO7T)&=pBS-YFS<12=^J(pH5%<%)NYxwX?%;VO5Z0n z*-KjLvdHu_r0J0J7BbDt#FCXUt0ARrS!txXhO|B0JVt8&Lb!dTJ>LH?dg%ksMY9&3 z`NAS(cUw*SEza(i5xNUtuO_jD&TTw}_O5Ky5YZva(~--yyjv%LXl`1ixU8O82t#(@ znZ{5r>T@G&%`9XVq7>iKuuiycvTxzHPe>b}$ig;CE6pqM>9r17KU=NAlIb%y*Wx~x zz$X`$$vAB-q#$kWImf7Y%1wTg=~L&>D7T+;%Gt8Y--GD6YkZ7_Kh9PDc{1`mkvd0}g<|VKUz$jzc~M1c zy??v8h|X-BD*WO?0}z#d3FumIbq2hZ@*ZTi62f;;O%Lk%yt7@dPow%6<}~b3hkux? z6Rc0a6+2O@-{H3-Lc(S9Zy5Id+YzzP-ww-QTcZzk2arZmPp7jw9fW)GEZ_5Ddg`*J)dV8C(?+2 z5cLpff?A6+S{#qR$1>QrY9EDmfLMm99qYlpf!Uy4V}38yzN(MnvfoE^QIuibXG!NY zzePyn@CaiR1H`gG$`u{8=4S@CbP2ys_+$PEku#Wi9av+2BCYyunE7L)ynoYxF77Zl zEs_zPg7!1LZ}#3KWX>;ir--#qpT%0Q;;^06pYpRLQrn*QN)3^{Mq4ukk(G*&6-HcX zs$q1?6=WQ9J_-K?`fA(OF(%W6{Y%Y5v=_2LpY;>{>zLz0p1vrMi#bnL2HrSfSNv)o zss^YEP@H10Zgsyh!kKj$c?AC{W{E-0wUDc;U@Oyqo!7Lr0f~%HWuTh)U5UGWfZky_ zcCflHiKh8C1?u-9((VRb7tFgG@gmuaX0Qty( z&>834w$jej~cWd z13zZq#{&~onnXPvmt3S=ya|HbL%|y!p;gVHoQhx`hd$9 zh~T+ij65fi6U!9+{cJ(^$VJK4fq%E~D|@Y>1sj<$JYqcUO1Ywe zUdt3lb=}bRHuw!)e$HjbuCdaZ(luJFHFAn6ZA}vGR$w!*L}uu#7+)LBS6)|)STiWo z0W#910jrHDainFj7KS~*~=XCI#}RF z45Oa2<=3a>oqjy-20aGO^*Ybm@OLUmF*06lt}@+%r%6X{w9#s*H0Y82dg>t81}jij z6U!QQfU4jSX|s;3%uFwX*k9*r3$`GJJMW~|7;J{Flia1v(uDQjgBDhXuG8;one@1% zxy#y0da%ExPUvqMaQ0>`4ZyeS$R=Ev+#`rG+%rJ>AK^Oi#PNi|+dwXmJ193e zQF}mm54T>OS?s~Az#B$g=T(`m;83u$|3!UdG>mq&*|3tDCp!Cjdx8$&jn^pVe>aJS zx94EIrxQElGUSC|rgaSSZZ^0WtZ!&)d<{`8nCtVw8pl|0B50@Q<=t2-!8Zp2@O&G{ z85$Ai37ylB)g-(5g26m3vN&4p@6`|%=clCq(|Zv0bTsFPems~WYhsF`ynE0SW4+xf zR#j+^UTdL_tiMFCOF!pg*TATRDYo9@z`do2v_($NNj=J{&TSAbM&&VglyG&VSL@)< zA+2nK+YAoSoF0Kx+^rI%){_m)p|xN1@tvi$*8)bDtDc3~e?U zq7*F(u%xNgshjMBY0?HZ%DY+S|}cU+sv z@};(HJr2ZV9xAKX%84WBH5;Sf&r}{NdSKq2&ch&6(ET>kU#ia#Eh_%TLeCn(?n(NV zm(}CnO{1%zd@N$k>Ne=EIhz-KCQr(F=hycQc^5mK{>3?pUC@1ei?)7m!!dM}^1U>P zAuB0J@f8Q`+e_58h&lk8r*bZqnVuR~^7PNqyTeK`=wH#bn|e#Di%r-mLOQCI<|Vv~ z_U78yt#|#f{tRo|bpZD8(0gc4B6qlf_=0UW4$hE^o21Pc>B*;h&#)^&zdR6LTw5GO z)CsbVV$e2?9!3`T=R%`e7r-)Y^Jjkho*>YAv%qf6E$X|crWo!o5| zZ=uvyw1i)m7F9@B3>Smny+pkin$EnWl_jLqIOA2iWR#4287x8M)QY8YaM)K+RuOKo zJ4ByZY*hOu>a4w_Tl+35K=i6#nj9V=Pp@HV&d`@yeXqdV#!?h(H;z^6!n|t(wKTQp z?{kxw+f^9P{HxuDciN?#&Pg+bxuY4n>CRSsk2Pm&)47~RtJ|rzgVvfZclDwtmZhB3 zsdFXdTrh~cd26_vY8f);yL8Muw5J_yJ^1=7-fVS?iCi|w6NqEi_3L;SuwfM``X20D z>ccl<37i&jGV2Fj7W&R@w7HgQoc#pdI<{gMVIu~=I1xm?PLoFPMcS-(dUP0HrNur# z)~cpEb7UN{c8x8u&RP?_I$|LsVeea{UT@Nj{Wh(0u~uQk)-1;B zMvPnyzCv7^XQ{*2i0g?)KrU$l*GQy(+|QI1Z*%?Fm6khf*+`w3kwRk&5EEo1L&L2E zeX6^!zuE1y^uR;AMw~5^I6L>PHMJ3YR;!imkh_VlbJ?=&@Rc=pK=R?usETC#VNzS`_0I>cth=7fVXl7x(g@k{0u)i?@#|QecI=u@ z?plFG``+_3dCSjgL(naOv~NNqAAyY58srElx<_xs^^=RZ7px5mi`+SmAlgP7d z=SlrEqh!d}r?atF4C_Xvd1M&-Axk|OJ%aX~>Rf+h`o(JOfK;cVE?UXji&2|F^@HR6 zB`c|c7L0f)E<>Mh#>z2X*X_xS z>zJE$#0PDXdOe-}#&gcAjzn)>nI)NV5gFKnnKMUbPYdbD@pWHyDTz4?(PuU2&MqIUCVf@ttV}y&h<()N{Xv z-+Q?T+PPx2Hqka5E8177HJqK4dp)x90KQp`u|Qu!^!bJj^YV~q=u3QeBM#$x*Sk^_ z>!}ZCHqXiw#&3jJMh*5|WR{!IZR7Z6_FijNo+A25QcfQMgL4EdGrHAHPixr-vpp^{ z8|H|;9sR?b7U8`p1LUjRSlPOF)+=a`7Y%&Yid9Q=%PZ}pD+X(FGz7_mk=(#M+N7tD zF6Zh>C*{X&xd^#BZ1C^d^CqidA_jXDd|AiL0Vu5bl?UkQ8vof=r-$UqTpPK%M0+lD z@7Hv5bQa^JrJqyLZ$pb&&u8^>doGf(9wGBKr+Fn0+vMpdk;};}He*J|4bk5KHlfR# z`b^(iVd*Ntd)i8SbBtg%;N5@~8N>Zgl2($sZ?5$e)r?>ccx@To&gdN8&2-*_^QHtz zB${%%3&{B5dN!VdFR$k!&kwSM7jzANO$+6$d+VamGR9iFRD$0myPqbP?DH{G&8T4< zOY=}pk}Jybt#U0w?yAU>a$2okqkY_1slu1dvzFWTX<}b9ctI#rt$95 zTHYEWIWg;vw>NU0Xhbyp?>6nVBx*e=M|y15x=;=HDl)g+>F)aB)3fxd+_Pex#E-{1=nD!f?pfM23~oqjqDQ4QO?5?Tfy4h2z0LX{ZZD7ZDy%M+RD4b7@p;Yxrv!}%V)HyZXdiR!R6wrMb+zE? zK-H@?L|3_5uG@-qF6W!A$A)LS|cEthPXIUaeofY_bvD z5IxE4#_Dluykg60iph%YC6SPa^VTm`tF4Pz#-O*ZP9fhcz`Jv`n`nEeS2j|9X(P5i z`Yc_p{?$IBu~VNm!;Uyibe`1_YTJ!8kf#|mNN&nIR%a%MR-Hr|HQ14?6pzefZhcNgMXk)dgyqN4*I0=OF{DE-D9Cm+~yj zd6Em`x{{~S`m{oFny0O@J!G)80K0}WWdpIU!qQA~T?QG}WpByuH8ellke$|7qrik$ zi!croy&ELb8p_D(7UAQovDHn&Wyc{w`Q&OR?rYN;kfA(_ zx^*~aA3*-(bk9N3(`-9hDG-Z@QUb}KFm@Ydb&O=F4XpJlP*E6t7#*~z1dTZwj^N(A z$(=US{WR2L25PE%$P(#VZ*3bchNN8scE<>pw=Okpv@6hu_o?ur#|v9U*n#n^q8^jI z4LZJ(=&E{pI|l8g;c7_FOlkgQ;c@h^F5DE}G-TLX8Ub%a;g^9MCTG03ySt&8ST=Dl z4LSzD6cAqNuMgLNt7u-eX|XGEqiaBF`rOrO(6>{*#h{yLZ+2M1Tjbfe!uMye`-Zy> zb}f!AEOrO*KdN_z2f`zkS&ZgvUk@-RP4}bh4EJJnOEGTXMo51_3Ss|iVJ^(07Ic&p zmUUk9%3h-wc?Ej)02}Tqf-f5*a`q~Ym?I_7lt#)>Vpc}VNnJ@w3Nlqis`KQ!NKK?R zvfMdE?rIjZs2QV|BqQat@N8oN~ISIwDSL=|jC@_{Fsb z{dYzBsWlfpTd!LObp0UVhERqv(%H*RxM3ZG`2;>N5~A^^-R;;1-4;(|y4$Uz#v+w; z-<-fXWt`|okxk}CCnA$Xn$oe;I;XWblPA$mn5sy$xW1a_fU@H0%;urJRGQDzV$M^! z%ZA+_yr0UJ;Q+XVJxFD(wM7GuC+Jy$yc}7IG$7xGB4x<4s}vEAbc{uGbTqOaS&Nk7 zi3={|nXyX4v&Wf|;HGfWt3tkyMK&ON=on9TtdTdAE$UI#;l#>HMB*9-V>V`4N0wRB zb2@fyk{xnmLweni0osNU$zAinEaaULalRwHNJW@P5?ne`Mpp0)$=6E5HnHaXvo#N$ zK=c+@R?|h!_Siw9J$f(JN&mas25qjfx=}7NZOf0cSDI=S_p~J&WXZrQ;LC7Vy?R^N zb?_vzmpQ7{Wu(-&Vx3b-j2S$w@K7nVCDC!ql;OOlp|z`3_rN=0v`UwfWWH5E<}Kw! zTTN|EeZ|9OdTzi>a@0fL5UrtByvKp7)1?WrgJShV)1+%7+8h|EAUl5}(Y8dJskLvU zUB_uX>>yG*TC@I=qLXbJ)kK$=%oL`vY=**PLN)4M#_!jmSQu#Md45ka`T|c(kXj$~OTnY@3XZ zAkGx{hH>pquy;m-!+tXBOYHNAzCBcDXd{b328d2tW}~B64XY%srk@8liT8`1tu4H2* z8YPyjyk_9Dnp~OE&aJw2L+3Pml%DtoFgh`VrLwt+oF+8PW^^m+8New7Ezjb)l#`XJ zSpw~TtiU+@HlR0NW|~ioI*s3MOhq?50Wt&n(6$QSxh5H<7~Mvh03|`8?pPZ~pYnuj zH_8N_bS9bxB6|r@Cd%s){y*e%*wGx!Y_<&gmy^|c}I#%;6)1}I_8PZjy|DuJDY^D+Vq|n}Nq@#R12)%A zw)Vi{&a-X~OhaDObt?S@WQAzPseWc{%W%TU#tOoA&-{$8ugW` zYc=|*DM2)AYn!N#@$R;C5LbzeQ)JjN)5LcdDH1ug=G5;CZ|8e3S+oc9sd!Xa<6+IL zF(}*U$rW$bkhVeD@tQGYZ+1=9XHPaxvA&08WhdeyAFLIv<9Q8cb;xdOv%N#zX6Ue% z=vl>Nx)FC<0-Z3VtljLLMT_~DtZT-`ie2fUdw{PdG4gSZdAcS@rBuU`SyI1V4!P2R zYF@7(QVl6nxbraPTJ3s+0i(512DuE+v}(P)tKZttp21TSMpHeH?8{B<>#cdd9>Y`8 zBDGK}gLTlh-l1bHI;Ww!*E{oMv#X2B?!me|i-yi!Y0T!Hb;o*!%sxBC71P?eK1B4r z>$W`+tVC`M6bH0O{d=r^d*p0uEc)NQ;yTcl>(9WKSO?eVaI&4IZ&SnTfr*?K16?O_ zL%MBbkN+r@w`iWwJluOQBA#F8p1GNeoUKDmlj~D?ULHt2SG4n5Do?x1qF$2aeWZ~ z1BVseo@+;O#GqRv`c3RA5pY!_Q6jIR46kpj$Fo*aA`h*HD5u4kN6#{ltMsgti=3jU zv;m#7A-552lG?Uuoj3p+vEi&d#=|1$)}jrxi2YH5M%A_0m)9906~m4^j{A`zn~8+q z8VpDgd^7SBXV76B$Wtq)crC{6)ur!4ySlwx8SyOL=U+!P6|`>1Lqy!okgJHUnp)~n zH*GXhsgl;%y}NUiYAtBj z@WuqSSkU(oASaQB=Xys;lo^YAV_9F%Jwuv@hgdXj1G8p^NRucNhP*JfF}@MR4l}kf ztD`ZVbVvhB-+9Lvj8zd-H7RRiwWQ8s^UG@T{OWXj1Gsu!D#Lg-LaH4> zT-42=7Twyab3XDca*+eQZMr3^+qBe;x9`#A&>b=BkOelo!QM&uZmQ{u^?-AY^v0|P zjE(XRU02&2#T;87TIrm_)6QOFLyJwG!T#7(%Z#lrHWU+_p;7GSvB6j!=JRkYG_XkC z^0o(i`dx@LFcNDTja7^}`ufS--R>HJwvk}`u?n)|@wnUZyxB4qvv#HMM1pv3VXVU1 z4o}PtzYU7AlbJW!ul4DY#ca=>Hk@20Vw16X%Q!rCuc_EHeHryiY!iKZCR0zcV}6Vf^=Tt(U9&A9XC3)k zrFbJ^o7}OcVM#_X+BCkFjA%|9r4b^u4)2Q?k8Kj&TApQtO6##0I1cxcL_KH2{;cD? zSV3E{1eGgkMry~sRpy;vQUt;1e!0G-W0{y&&lu${ejg%-WMf=RIM7-d&tZ`BC_;%z z2Vym(2#Z2SzbIZBFOI8_%``@d9;=#iWx57)#8yG1s(86UyW4t}tA(u@d7{REsnhv- z!ZpPkQ8y62CEkph9nE^Tfp3ks6N{$l(7CL=bB~O@KR#&fBHDOccf5C>J?n?P36{8? zZEf)$$ac_dw_s4zh zgF0#o>t&cq{>~wAle!ImhlqRP;o%XgaigAykHs4?|Hcg{?Da(Q4b1B&-WH6yc1`QJ zV)rcg86tb*cDH7ohZJv~i~EUoft0>@Q-6SP8X|WEb% zvW9@K?Ovr`VOkeWsuMZCNIV&i#!H;lR-69Y!5YEM3{Ur|B4!7de}@meXt!c_Y3=&LONT7U$4nGxBFVK1oL~K`@R{HNG8B5q^lQm?Z~? zbzOmZkc`jh*-Zd~jhAj!x|W=2@M_;wey0O_LM+7W&q@)k5%E-`c=+AnsRP%VZtZVc&0uhgZ+$ z9gr+ES|_QCXzz9-ZlE{$mzVCxope<5t(w$JV!c2{qNTkHQa5cSqwloSd)_K6xDTtI zEwHBao>-~x{&un&8?nDcT0@5U67)?gyD^GMd?(P3FY(yL=eQ|X-xmIZ&+dhRZF*Wx zVLW4)BmIcuIv`fSIsok;wG3?~aHs8b-fK}uwuWKzVN}x=Ti!`9+ong48G)A@(kN)1 z%-#fMmeZESA;0Ut!dVRQ$ADhMStfT)ZjEncawOK4?y zk8RVVX?+;Y`$G>P{)42A#MZ;K&6fTR;t}84M4cr3Q?PAsJwp+i|2p)~h1jhO@&n#s z2nu-^PbCI^srMBFRzqml0$oiS|4!(T0Wpa6x=KdOg{Rp~*6@c0yXJxD$QT(!-`Yx} zbYfTU=wr50wCyY=SDv_<<8WGl-`-1r7k{AVUSwA0wys3P`jM+pUJbeibRB5-x`|2> znUA+Y61Nt~UNKF^NJF}YQqG(Q-+K3|ymilNfQ-t$#QT04qh{aQkhbC^H|M-D3f7{8 znLOdgRv(9-)cfRWaiRp8r&p&imi;9EtaO`^yVNb7{1wv*9(kR3XSf#KZ6})EL=UyB^j5jL^HBYHQZ};F zpnI0K*q3lX%Ok703|5>qi8PdWmEd06*T0#T!GuW9(%IRiw{9oWgiq-j4gXbFOh0F2^86S`VY2FRf=qD4HiSHze~r-bDrp$O zeBgnK>+v+Cln@e&$WUU!k+*7dQTm6KL{U;r6el%JQRBQ-?(w#miG&ft>9>^f#TdJi zWFMZJ+f(h56J;L!K0#tG>^av7Z7r}>AaATVilWF@$(rVbp8aNYS>e;4G6+J+ILbf*j1lo?h zz((g!+_Q;$?t*83f7TNtO_ANu_9REGy{Nay-B^;gqyv&2WCdaGBV`{cMLfY3!|$H` zMB72usf+O076!mqjh&A1%wCNPgV4Nzv*b{6nBqLiGovHmM?vo77}dTB%sKFTE7NDw ze9w(?BzixQ#(_#>3@4IP=~3t>Ay0v(lXF;mv*5h++0B8+93byf8aJQxL*pY_Ol(^+!fot9`^X$IdTs7O7;RZTmNa7>XxCP<3r}i0nbdts=!~#q?-&^F>?_8KU9v=R zhVau-OA~A=>2R;LOb+_#{F1F6%#8(oEVbw?K{9%5O^3WZQbT-3=-MAAEpo|Bk_U2P zXv3}5`In$;q~wNUq1oRo>YDYICajHf);2H_)_yCQze{x0WusiUhThX`AyYpksV0lI zu}Zg#QGT6^Lmn#8v8CY3bg5kD_C~7Qu7IuTi1xks%-|@=9+hOYoAmc?4OfjQH5yHJ z1*S-rkQ%URLB=c7)i9#!=a*XG7s={ChTryMl{*@g z&vugN5+s|siQfpyQP41v=1IBRlPov3Jx=r!+mib(ZKP zdo!K4n%=t)mqlkwH+d`d>6qHQ`(DuX8hQy*5ER&6MCs47AyaMNvu=#J4Erjejb6w>K!C^*5HX{`6u56W@dErq6GS>Jzly)^}QCv?Q$CpwxDn;#Ms0 zky-Hu`kvWlh?d>vNX=7B=USKyA*NtcF)I>Z!aNiC=Be*L+cPQ)gqUAyrD(Zw}R*YDqO|{=|EQ z=Fv7tlJ1+s9;q%J(=6{}#M)DLkkiA#NXxz+YPjBp$KcbMsvhnj_O4X-9$ZhVcaO#j zd26H=Sx4-wC#Sp@NxL>3=LGkv-WR*B$H|%S+Z_&F*ALE>8bCP$s?y(2SIH{K-pgoe zC^eWGrap^#dlP~sV>^X_lCdI`_-8j;R**TtKIa|QA!x~RH~`FvdI{KFCQXVMovla5Q#5` zQUR$%+QpZqOVYcN#+4Ddwy`K(3@&4_kacIyLw&s2M8>>2{R!qrd7ceB^B#FOekCjw z2CIM1Y|J8S4Tzj?ovy0~S4E`^xtj(^%k<5&1$=9|nc6k)rgR6SMo^nUn~mE}HJ!B9 zo`_{1D%XeZJWCIxUZNQyStN_JhP+^qJ!zHf^keA>;ybBF(E1j)xXE)KPitIg zgqy|w7?AXpRgIA`UeoFE)|vEddM^E8hQVx`r_rXD77!=o@TM2iKIr^ zbUXPK)EA4Bb94f@lb&s2WzsCEd6b+1FH&Ag3kGejFGs4|49`}>$a%g> zdYbf6&C~9WRm2oCW~PKGWy+Xxrh=(ts+ek~hN)%hn0lsxX=Iw1W~PN{W!ji_rh~CC zolF<7Pa}7&FdHFq6y_GtJB}v&unI&eKSz$uVDidZROq5w;)|m}vlZi2LW{XKMNoJc#F=-~lFbvCZ z49^IR$ViOLD2&P!vBj*JEn!R9GPazpU@O@wwwkSBYuP%so^4;OB+4za`R2s_HUSr0qLj-kW!Knsc7xqyV{Dw=ViRnV-DXp4n$55b z%d#BHvjQu!5-YO`tFlF0F=ysVxKgf+E9WY>O0J5l=4!ZFu8ync8n{NTiEHLsxK^%> zYv(#R3)jhYaot=G*UMQs8)xSnoRjP0`Z*UjzzuRk+%Px7jdE_z!;Nv{+ypntO>xuQ z3^&Woar2y)^KlEDp9^q7ZjoE!mbn!!#I15+F2Y5*HEx~T;5NA!7w5LP1efHtxfGY? zG91IP9LMpTz=@p1$(+KeToGT)oB0yHlrQ7U`3k<0ui~ru8orjVbr)+j$4?EpJn!Xw`~vUi1ALHQ(m!67(>KA~T52?N5QFeD5MBf_ZQ7Cge3FfL38 zlfslREzAhB!kjQKcm=#|)fH)`)iNoTEI4ZhDk2ofd zixc9cI3-StGvcf`C(esr(I+m5elZ{h#YJ&RTozZvkhm&_#fTUc*Ti*kL);W&VqDx3 z6Jk=_7E@wc%!rK0ik!%cf+&iTD2s}yibYbfWR^;#QmITTmnx)6sYAdG%L+X^O9HcNehx+3P?d|QCgCgr4=b8tx91jB1NS&X&p zm$syYl$5rml$4e-5+kt^C-IUXiIODAk|L>6kz6dB*WTyQErl(Xmp9~1 zIVQ*DEjb}4y$gIrCye!C~EXlI0$f{hV6f0(>L@8Culyap)sZ^?zYNbZ0 zRqB*_r9o*_@E<-ZElR7>rnD;^ibd&Ex|D9EN9k3picPUA4#lbTDgBB|8Bhk5A!S$@ zQAQQF;!(zwab-f8RHl?^Wk#7*=9GEGtN4@!#jgaEpt7heDa*==5>i%`uo6+C%9^sS zY$%&bOo=O7NZ})~WSsgW9Mzsm*GO+N!px?P`Z=Q9IQxwOj2`dsVAyQ|+olb*g=8zv@y4)IoJf z9acxwQPr(_)G>8jolqy$DRo+%QD@aTbzb$VK6OF$s{u8rE~-oFvbv&%)KxXCM%1Xf zrmm|S>ZTe~xq-Qnxrw=%xrMovxsADQGq^Lkv$(UlbGUQ4^SJZ53%Copi@1xqOSnt9%ec$A zE4VAUtGKJVYq)E<>$vN=8@L;}o4A{~Tew@f+qm1gJGeW!ySTf#d$@bK`?&kL2e=2h zhq#BiN4Q71$GFG2C%7lMr?{uNXSip%=eXy&7q}O>m$;X?SGZTX*SOcYH@G*sx45^t zceq2`yWC;!J??$(1MWlaBkp7F6Yf*)GwyTl82(uPIR1G41pY++B>rUn6#i8HH2!q{ z4E{|1EdFf%9R6JXJpO$C0{%k&BK~6j68=*DGX8S@3jRv|D*kHz8va`TI{te82L49= zCjMsr7XDWLHvV@04*pL5F8*%*9{yhbKK_3G0scY$A^u_h5&lvBG5&G>3I0j`DgJ5x z8U9)RIsSS61^z|;CH`gp75-KJHU4$}4gO93E&gr(9sUsiE`OMRkAI*4fd7#Hi2s=X zg#VQPjQ^ZJMmSbDPB>mTK{!!3NjOtnFPdHz=K)6u2 zNVr(IM7UJAOt@UQLby`6O1N6MMz~hEPPksULAX)4Nw`_KMYvVCO}JgSL%378OSoIO zN4QtGPq<%rKzLAiNO)LyM0iwqOn6*)LU>YmN_bj$MtD|uPIz8;L3mMkNqAX!MR-+s zO?X{+LwHkoOL$v&M>r(BD;yTy6W$j-5Iz(>5FOS5lH5g!#F z6CW3!5T6vE5}y{I5uX*G6Q37f5MLBu5?>Zy5nmNw6JHnK5Z@Hv65kfz5f6#)iigGb z#P`Jy#1F-f#E->K#81V~#LvZJq+_Myq~oO%q!Xo+q?4snq*JBSq|>D{q%)H6Xq)VmCq|2o%q${PXq^qTCq-&+?r0b;{q#LE1q?@H%q+6xi zq}!!Cq&ua%q`Reiq3!(~=|kxw>0{{==~L-5>2v8A z`B?cl`FQyR`9%37`DFPN`BeEd`E>aV`AqpN`E2wIxl*}GxmvkKxmLMOxn8+J zxly@ExmmeIxmCGMxm~$Kxl_4Ixm&qMxmUSQxnFrec~E&sd02Twc~p5!d0cryc~W^w zd0Kf!c~*H&d0u%zc~N;ud0BZyc~yB$d0lx!c~f~yd0Tl$Ii$R+99G^_-d8?QK2$zZ zK2|Dg_tg*757m#%b8a)uV>!L9Ll_#`GB@iRdiuGQ-CN znTO3I=25fT>@km-$ITPwN%NF>+B{>PHP4yn&0e$5>?yJpjTJQ%H5JtrEt^-&A@iy^ zY>t?t<~8%WdBePEj+x`;Epx)0G;f)rB>MwS{$s^@RsUg#)v7WNhP7rF`u3I_{^3Wp0v3P%gwg`UE(!tuh1!pXv^!s)`9!r8*P z!udjPp|5bE&|erR3>GdHZWpDBMvEJZt}9NE-t2vzRrLD8#rYuuNLdwqwjs; z-4_nM|HAWU9-Zyc^Qc~V_Kh>nJMW@%&wc9dbI!fyjB_rzAZpg#m14LSyNEa*7U@t_kxCxT7_oeVk!bSmgH(CMHvKxcx^0-X&y2XrpzJka@| z3qTiwE&^Q)!iauxDd;lL<)AA-SAwnrT@AVhbS>yQ(Dk4jKsSPJ0^JO{1#~OuHqh;$ zJ3x1W?gHHnx(9SG=swW>pa(z?f*t}r40;6gDCjZJyW^epH(5az@e zFMwVIy##t0^a|)z&}*RAL2rQG1ib}%8}tt75a?adVbFV^_dy?kJ_LOP`WW;H=u^;V zpwB^n1o{H>-#~v1`V-Kfg8mHj=b*m;{UzwHK;H%ZHRx|Ze+x2UN?mU<{lwpa|L>r` z2mJ%+d!YXT`bW_J1pO1}pF#fu`d85RLH`E&chG-;c6Q$Wg8v;;!GphRDrfXauKzAQwDyRef z!m*};S3!fI6OS_${3&P!boKG3f`13ephr(I6?A}p^F&j@VbCP#?2}9dg`gPd){{*I z6`-Fw#Z>S-$N@U~R8zs{AV28R(@X{b1Y$w=pKdB>0{zMvrh+#?qo7mIG!^_MC<40v zEK@--$aJ=;;7L$7=y%UC6?_Pq1)YDcso?KHNzk3=nF?w^KX<;V;AM~tbo>RTf!r;R=6YV1K*V-LFei=#k43Hm9}PlJ92^s}I!1N}Vc7eK!V`X$gW zgMJ0{tDtX#ehu{Npx*%fCg`_7zYY2w(C>nN5A^$>KLC9P^oO9MLC1iO1sw-E9&`fe zM9@i~lR>9|P6eF?IvsQd=uFUAptC{efX)S-2Ra{g0q8=|MWBm8mw+w>T?V=wbOq>2 z&{d$TLDzt;1ziWa9&`ifM$k>5n?bjLZUx;2x*c=}=uXgGpu0i$fbIp|2f82h0O&!` zL!gI2kANNpJqCIl^aSWX`?>$P{U7HZZ4Uf+{pYX$AFqoauZ#be<^bL$jsg|no#?0^ zf(p9f`@01=M}uZT=YI?5=x>>h0u>}dcm4#<(x9I^3TJ7M3v~QX;w%kX0$ur2I7@>> z(8E8Cvoz?}e+Fl1&^YMKpT$`kv;n&L=Wvz=9rg1#OM`5n@BD(P;8Tzfbn!2m3jPt4 z`9;%Fpn`jU$yCq)`lVks9Yv|&^41-So6;r{VgH}P;{;H|qe}PocNiXUKl7WWf)_!3pksf_RDeTJK@fELZ<`AK z1;m3M#5>pjOLOeU_xfKqr>Z+ofAM4b|9=d$HG$u~O!!U8gx|hQ_)W<4%+9kr&+RHG-**0Z=TCP2bmz}@{(R>zcK&kbuXet>^Vd6nv-7t*g**S>&fo3) z_np7r`G=kF?fj3Of86<>JO8xv&pZFJ^RGMK-}$$lf8Y6!onn*ORAW+iel-7-{m3GH zv;LfX=Qr_RKET^_m%8&4pdbNK9m>bAMzwEZqq)^Zfk)r zvF)OMFz);J=kS#}m(v`n-uc?dBSpyS|NMb3xBsZEFFf?kBi4`@0}l=U2x5Kn-eA5w z{B@%I{3BlnrS9AZ++&YCLDA2BrB}%wMCTs)>$Un{5%u6>KWwjT2G4l|pNsdM$8+2_ zugmmUojP~qs3$$KYrEFK?`pH$8((7Ei|u&ALeb+tfY;tA|7YZ5p4uDt{5;JKc~Tbp z(gC`?QNBtJ{s>}Z+j!#Xy={GWpJp#&zdS>If}~Cz5aCy!+3%%k&Zhc{j$l97>z{rg z^uaNH?b(C%Ute4HjU#;hwth57=DBYc=jrFa-2dOc!tVJB`mg_#(JhkBy{mJ(*c|uIy6t~au8GuEU7tf5Ymr!g=_R9X zFaP3~T6fW16lePi{Jk&l`t0Yf|5EFI{E;++h%@#hinX_mmtWbd$;tn8L`x2_@|6e; zdG@P0e73%Ek8HHQ`|9UkVl^TU=2yRw_rWoLFzxJXKNvnAebwvvvbys)(Y%$X|MNU) zuZL0g9e_OQ4I|>K`L`(kFKGRbw5~ZI&e#FEYzwk(Iq6MJa|z1J3Aeuoj~_vwkF7 zx7)j)KD^7H2>z7Ar&7(C2FosHmwWb0?0>b-_8E=H*N$a$pqyf!ZIYjr;x# zzafC~|9NenCg1*FU1I+7;2!?|UmdLf&(VJSy9c*>(Gm0qp+EWxZ22C0?;bf9b5Yl` zI+wE@xxVkOk8JzTv?Tv#f9v1=-|W2wbQ{fw#{Y+>uO;6~62G_xrGK{US=#FtpZe=a{~P=-I`jU7kp4vf zPy6hDi2hIc-%>07741|10Dts1*q6WI{?_YXx#4AhrT(d$T{iFUkiV7xXXUCxe~xVP z-*A7H{9E+M@Xy4|U&qe`I!yfU<-euZs!e64vQpWpoK$WqFO{DvNEN1vQX3~4B!-XZl$x6Qe>#GH zzrX$2-%%eiFR_jBzu{Zec?c9z>$)~|HRPX(m%p}&!e_Ou+s$w=Q&=e8L_Uw-u5Q5B z`oi{g9qJ_Fr{XWN_rK4?NZmZu3KIAy11^#FTQ8p z65}mnuR6A^cik38N?mGQ<6lowX?3Qek6v~0KkcaVDA2dAWAHD#>Xei}_&T6&Vt8>F z`|IENpLW=(iQKJJMu*g0{hM>QA+|BLDYiMbCAKxTEw(+jBepZPE4DkfC$=}XFSb8+ zAa*czD0Vn@Bz81*EOtD0B6c!%Dt0<{CU!PFLponAoei!DE2r8#-7BU#$quj2FH+CJoYU1JobC+MeJqlRqS=_P3&## zUF?1AL+oShkJzW!=h&Cn*H~TbTkL!6N9<=T5vvE)hZ;ahP%_jIY6LZgnm|pVW>9me z1=JF11+|9SKy9IRPDJcc=%{6Y2%^hEkwZC=KcZ{RX8&eW89( ze`o+S5E=vxhK4{xpVoaB0xka10q3WhyrCof5}Uf1<@e}#DrK7 z8{$A*hzIc@0VIS(kQkCcQb-2LAqA8Ta(7s`WFkQ&lJ`H&XUL3+pl8KDBm1eqZV zWQA;y9dba0kP~u2ZpZ@_L0+gB@8 z&{Aj_v>aLit%O!VtD!Z}T4)`#9@+qHgf>B&p)Jr>XdAR0+5zo^c0s$LJcF-H#i;c3-^Qj!vo-f@E~|F zJOmyJ4}$@CI6ML#36FwD!(-sF@HlupJOQ2vPl6}IQ{buaG)Jy>Kz?gZ*#-4#FjHDO?7Z!yz~fSHKat5{|-Ea5Y>5*TPHSrSLL%IlKa1 z39o`z!)xHR@H%)syaC<_Z-O_&Ti~tmHh4R{1KtVmf_KAv;JxrZct3mqJ_sLz55q^` zqwq2KID7&=37>*b!)M^L@HzNAd;z`)UxF{gSKzDgHTXJw1HK90f^Wlj;JffW_&)pq zeh5E;AHyL01bzy~Uzzk%Pv@8I|F2lylW2mA^C41a;Y z!gcUB_&fXq{s|}GdPsew0g{9yBMp&8NMoc4(iCZiG)Gz>Es<78Yora*7HNmHM>-%K zkxocwqzlp&>4tPidLTWKUPx~w1xZEHkUq$7NIKFN>4)@31|S2GLC9ca2r?8Ih5*QL zWCSu28HJ2S#vo&namaXN0x}VqgiJ=JAXAZP$aG`|G837F%tq!QbCG$-d}IN#5LtvQ zMoXh;@9M;HhbVIgdUgK!ZZ!bb#%5D_6_M1n{W z86rm%NH&s#D3M$w4^bg%M1$lbT11EF5d&gG3J?=wMl6UGu_1QEffOQ6#D%yK4^o79 zkz&M$_>lk-L`slSqzoxXLP!{?Kq5#b5=E+zYNQ6KMV25-k!8qoWCgMkS%s`d)*x$< zb;x>T1F{j>gltB(AX|}b$aZ80vJ=^b>_+w=dy##}e&hgh5IKY#Mvfpykz>elX2{9cjO21 z6G8#Vc*l6Bc;|SR zc-MHhc=vdZc+YsRc<*>hJT;yc?-Tzmo*wTT?-%bM9}piH9~2)P9}*uL9~KAV!{a03 zBjcmuqvK=ZW8>rEk^WzKR3*(F8 zi{q#`I*y5B0JKQ7N_+#lCAueiC+a7nKozi~-n7J;dQ%dy z#MHzO;3rTG)Bs7qLsUbc5zrX;4s=LqlhQgdDbWMyltN4NO-WDblF~J$M@r9>CW)qr z4nRj>Vq$WFn#f8t0h$8MfaX98pe4`>XbrRh+5*iJ?b5c^yIt>dy`BkXT8~7p1V2rX z)+=pP+Kj%_`fjN=B4uPsQYxHCPJoFgiH3=!M59ErL`q_Hy+(Z-_C23|IsH=l>GV_S zOVgL6Z%^NrelYz&`oxrWKuKyKHJDnO+8+4FcS%jsnx_?}In%6ZwzPq11JeFpt6y6G zw5N${sW(#Vr6v6f=|5?wq^(SA*QY^R<1|(pE=`;!N$Zw2Ijv{f=(Is;ga6KEP%4n3 z=qu|h?wgX5nzF0jU+a65{#WWBmu(Vl6YUc16CDyA6P*&B6I~Kre?7zg`IDMROY}+n zmPk+ZP4r9jPYg&5Obkj4P7Fy5O$iP4EMiLr@siSdaEe`7yAF(WZE zF)J}UF()xMF)uMcu^_Q9u_&=Pfl8ngm;^R~OW+fP1Tm43ASK8NN+R=r*iQ#$05gGE zz-(X+Fc+8y%m)?#3xP$zVgLo80StfzZ~z`407M`IAOU260%QVIfCgj%bbtXc0T#dp zH~<&m0enCJ2muiw1|)zKkO6W)0b~O?fD*_B@&FZ}1~foEpapb*9xwn#pa3udX21ei z0UKZk96%x91YCd{@Bl@C7bpgNfFB3|L7)UE{a3DlrNA;^Ij{m)39JHE18ab_z&c<( zumRWzYyvg|TY#;=Hefrj1K0`d0(Jv?fW5#zU_WpGI0zg94g*JkqrfrXIB)_u37i5> z180D z00@8q1c(FAfak#Pzzg6d@CtYhyaC<=#Nl2n>hmQZCPEYm@$bz5IpVnzSuxd(w`iok_cr zb|>vg+MBd5X@Amzq=QL^k`5;wNjjQzJn2Nz$)rB)VQ`z7~J9*{gR zc~J7;B%#aXC}`|o}D}=d2aH&D|*ir}s%8nLa3eV*0}Ll=NZg{nN*$PfhQc4y322k4vBNzxb{H z+wJ-<>3{XWfAzqB^}v7iz<*p1RG~T%lQO4E`P=2 z+gDlth?WZbk(Tmu*iq^gioWn;1>1PY=!*LGh4H=S?&1^MfXoZv+)NBPY7VfH%dpw`-&Gb$UMZs4rPay zguaEF6F%Ub)XUiiO~?GtLJB;sdY`T>sx<$*rLVk8Ml!Ldq?==66--%+=gS`C`O9Zy z1W^kE??Y%?i^voFE+Rn9VWjXs@RNn(q#vXMWYoMfYLsqN#XBq2#q_)?*(O`BI;TDv zS;eehD}y1ko4*+Kn8@6TMz`N%me?V#{wcgUgS+{~GpTfabUy=o0R zm;q`@_i7RO054OTuKJ1{O5st=j0cPZ>^j~+aX-lpNm1@mQ-*tRb*t(VHA`tBsos{1 zT}a!-I%QD{SxU;UEwl6SBIW=&TK6H`9MuW`8bw4;MlVI@qL<*_;G1T&rX0=OMSViO zs&(?K1iJ)_B-^Eu>|?pb+C$n&I;VcC^}aRPrm?-TUAOU_+dKm@)_4&=D$pzJDLjFG zMr+HaC?~35%R%eU!Xw_3q4trRk@Ki-=$QLa#scy=@;CYm#z1Bnlg+%sYRA699?zQ| z<@2`)HL~pNMXExz%DB?{)mc>T3srmHVGrRtQMMDdQ#)k|Sys_zS#kb(JIST=tS;SC zDV42>+$~&AN(e3$wkomVoEgc4>+~n=z1&H{al-u)W$wOwiLTOp%`GWT^1li!FE0y; z!hGs>no+d40#y;^r055UP2yd`mQ@Ue5?4*kX1-)klr@%Ll~e6)+_U^0P~)pU;k%0_ zi0$ElLK^nCZkzo<&|6B)=wF>CY-k&9UukH9J84Do3Q#um66`fx>k#Wcht0bxzzgeyQzUo^Nt&hzD`qRU8+{S%(vFqw!1HQ)_d&%Y*}e}uzXoLFLXWJKhniI4mF6dhjt-rZSErVB+Xjd z3sdvrqoKAHgbH#+eRL~y4!(*g{IwnWTuM{w32K1Wf?hzszAh^wY%IhsSFFYY+ zhynUZNoT21YEsS9a;Wum^^6A@es>qo4zH&8g0H9lX+^8bNl`P(h^dDyrBqRevCZt4 z+zFB;%AjhlcCG1~^MEJ2Xanb*ZArK(A&Ib_NDz|6*`9v+D#68?Jp3|hHw&h)QJ@QI zHtIC0E&3dO9AOi+JtLioGMgh`Ri%D1S8*da6vUnZJH zd(T&i+_@N`#c&b>;pUQlX7w#y!RsTLEE$z&(H_(;)Sol%wO+89TnzX4qO1O^!QKRO zNfv4h2F6do-&TflpKB27X5XpEnaH(>2HTBAFWf@Z>C~9()VTpiXawrMI3C2(=FuuR zwYpMiUYO-yr}N~vLRLd(VRivlC@p=D>rPnjXzy8Jy6Afn;NxAc>DpuHLzuR>Sy()A z2OIy={%27qt~cApJ)($&rVE3Z6p2nsP~_<_#%ZoTo+g4%sPUM-7#_xe z9f#xKRufy38j>$$*3q}IzOX*9m7E@;0b-+agK}tYhkQl8*4RR`)?DQ7TJ+R=&BqC- zN_8P(Mf=M9nwi*I{C2#a-j~r`9+2B}f9B3Kj>btD< z^nQ$S?Ag4{f(-c;toPzLm7bXQC#%zUgATZ`L^`-!W>$M9_ltq5)+ zmb8pyq!6fCR6iBYif4V!%BS1tmGs^8E({!V5i88T!(Ppq$ZNo#$^Xcg{hELZ3(t!f z(t$FOY?!=SK0@VGOY^7dKtn@g7bD%c)!5OTWZrDvY9?6xmVs8BZIO%R>RzgM7Gfvj77%`9Ow(zC z%<5}3vvQj%vMp^@KN$CzYbx(65BRx~q>6K>w;5d0A#!G>ka?Qbn%{^&Ubt2GS$0!3 z!6>)Rh(=Ku^jUl(q9O~)dY$!65RvBQHOR+!LZy#g7}9F`AkI$A223%wp5QEjPTo)1 zLKQIk4{S$WP5sdj7uTPJ5r|Doy*scoNCQI? z$R5!S^EN`OtnZ}q{JLrydI7G8FooNn-$C$)z^=>Crx}Np(u5nM$n;UsBc9VaT=Abj~-Uz_)Sq2m}B@H+B0Sem&0QSk(_h6eN8*?5nS5$|WbAfKn4r6edA>S9_0`XKskMo(sA z&M+R0x|w&7_l#F9U`zCp*3#Lz^R-8{UkqK1gN)0}4J;olAvfJ4^6))g&uh73ECFsk>=kmW%e3BMrx{Q z%^(*Is;<+0@fA~FgpyG2@SjP;DQ7cRP~A+EypiIN>UVD~wVngiD={Ah)m9d5fumPJ zD{BOsOcQeW#Z^3c&J=BDV?%S#qH{iZ;B?`-KyOSPZUPN2Fl3KbE()Fr4l0GM$Ed@9 zCE=Kex`lU97qW*7Jd)>1Fn6d*f#{zrOoA>+`a`DgSL_z_^y=0)T^>A?a+d#p@3YQQ-{U7-ulm>ztPh98#FOp z4{IWF3cHT+lBW>4B_CuVIal#h-NE=IOBHYi8&x3Kp15i3Apb7En|v4jno()`!r$!p z?D*nYi@S@@rTFOq29XJsa6`K>y|E8*Dfqegm-uIdImF?_&KW|=A? zZZtdHLkH>E3=`YVzR&h@G@Qo#7W^T6HNQZxOxRmIT6{q2k~Ni+<&$#y<_L05tLkgA z^6P7P+P7Lz*H*vUFy0t4-?A0i=R2}oA6&gXlRN}Zu7~A)!zAaLs^=6PWm|^ zSvXyP+0&$g9sH272H!a_o?s=V)7NlDNj=#tO_2dKWxHks2*Ea`T}u5Sdfti3##y4Q zY~C`#n&SH*IcL70tLUVybH$O+PnTVx<9?xbLJiK&QVrvuz>dK^#a*XZ82y-S*i(6V zyx#mg{(E63AxF|su2l9`-B%wnWSHNQf4EHUC7x2xc~8$kNe~yNgx$PWx<;1$p&|4K z%x>(Jybk<;;DctdZn0rXK{Lw+FSqzfF~heuzcKDEdnIQEw}L&yW78ecZ}9vcQX5-X z=R5DB=3!^znfT?@2DDDJhgp5ubJ<(C?S-R+XQi`con_YrGzBWhm~)nrs%HHukxu{X*0BswP8bwah9=h;V93<5G#;U8^@?{7w}KUx`OIBLAeeF>j>}qdOQW%!RB`>;(U<^pX6M*<`t4EpqMg)(Z>`ctZDU?nh&& zxA=aP!TRFhqKdE859R%`@%ULp2bIjOVP9u2lfF@;<#qOqD?6(A=^1B>W4{#sj(?7y zgC+#F_{EgrmLFNa>kj+x3CDWBDCbp87H{#4N0IT3GWevE>}4E;hmt&zQRN%6UuoXx z*6H^fC!0^1&li?^sHL%t)8r|Pjl2-wEZ!*@t2*uZ4FhWcQg;TAspB)HA64CSa??jk z7w7E2_Q+X1P4!iW)t|7p2|U-9=*HNdWKPozLA^&ss37AYdlLVh;F(lXsBum7pn@Mt zu0%SE`(_W!jay0f&EEQ`IoR{qBH|y^PV|v<3%vtlG(*DJ!FbPV%UQiNCPU1+MkLr#Bm-J%paqp(m+)%o#irh+cLG;64 zS$bd9Es#lWAl$+ECYp&JthgiC@9*o_VI-7J6=f^LztUO_rVcg^R5l~Tf;*}=qEKiW zMunM)tMSew{6?;%_N157H_|`Tdo#Suo$LvmE1b>3X;NptPupAv8s}OYco5GlU;DtG zz>wgbV5?eKO6ET0s(2sec6E2XC~&oOpZq;xFJlFFvHz8SR!KfqLLNXN(!%s_GJio2 z)dBBQAGKm{c2D$S$yNoR`W8ZA+Ym;RN#qR_Car`K=FtSHa=rSo?UlDf;74F_X?p&I z{B^ih^xmXAN;_sdOeS^%_9C_(t__huCX-2&@?Yu2in0zc%h^M?If9wO1H#9`+v+M+r!4Ts;*ZW^89v$+Sw2=CBshUz5C4ZuBGx zS>i8Pi*A%?0qs-O3+qYh{9v!_{0s%{G?UNsN;AFF1MMrYgwy<%CG#lD0}kwB)bH4c zqg4?(TgO>g$`I&Uo+pYeTDCS$&9M*4-I|m4D?OZ^Q^`G^Q(>5i`c7YndO%v1v6gvU(bD+C zJkoO5vdtfMuPFSOb23$?jn)m359s6chwKs#iKh@8S1(dt zFz+)D@GlOw#C#={WIBYoBJQu`L%Y52$)Hyp>KZUPA#GeUz&;Gk!)4+xvM&qHNsa0< zeYs(b)$VxVf5=Z!G*WgiSZ_NTSyl4`yH&5u-=lY$=joq`S#+-%t757oSayk5u2YAD zzgMoi$6D_R{i&cRr(MOHipd-iU;JxP%a#0@j@N|)@mPFcf{o&&8yMS|^VwSVdUk+! zLvlg7O|?lK%)g^OZ`7Dpn%BGbdiHxw0ebj;MRV~uLj*I0wu#{s+>wmVYpU^?Cf1%4 zbk>c>7pY!V@)^~ZceV=iB*sYwTQx^NDIgHOphPp<7z@;ci~c~18C}I=r41BM^MqQV zi|EmMAJZ>$PO7eHZ(IA9zAve=zbYJ3b(A1wczHBg$L!VK>)weKXx^v1mZ&=@kTi(G z&%8iggH57W(K|8KYz=QUPtKRi#wh#hF_ub8#7Zk#;zhi9#XUl^LYvU*xqL}4E6Xl+ zJPXvP;YDjIbas-XHClmN%a~1XDe!Bxmd5Tv_aCy(3?h4v^fF4MEQvP4O(f)HY$vZ^ z$=Tg<}0% ze$5_{Kd9i5dAqfR{iVHuvz>dOXMuNB;9AL#iVs!NYBXvosu+`jTR>VvnM}XKxXYNz z-ofuKxFWbFEWxH4*O}K?>J@pthrIU572FdD_~B;DCkxww`Z!qO~poxfgYmlrS75MpZ4kIeF}7 z?G|@xQ8OPeU<@^j6tIHq5fYm;Pj6eFzs`Gaq$FOZIdcKhq}vH#>sYZFbAc= zW3rMZFBBIYLkd^B2jE&0cr=t?jj&OkE$^x7vg?WKLhxxQKUBnU=APG~>`OR2l^Zu* zRwZwmM^Q=gOALjf2fE_gU1&M$B#%~Dh}wj@he<_Uz`mwNcoyLSS?}B#>W!Kny0}4M zz2-3lE(cYiE)`MSRpTH`1wJe|FT0X6GVhsXpnrLYR8?EU%$rV*$c7o|6%c9+x(K}+ zyA`)Ds|Ryi?j-GX>!_05p--V^;cyMRb`?KQ(iyiLcP9Io>nwdCGr;Pjn4dGn@X@F+ zzqa=Y3@)8PP(-hb-Py;yZ;D5Rci^UHo}(u-ItvVsK2!~=7PSPm47CNd9kmN}33U;5 z0(A;?40Rjz2=xl}81)&|6rG6%&{T95nuMNyVtSxIp;IvfFoQ8a(QnXgF^w=YF>^6V z0wM;3nTN^5WMHJ2e2f`WiE&_dV76h-V$NZ_ZV$WjlV?ivj@HzGs_AT}g>`!bmt~ss) zt`)8yZXj+bZX|9z4vm|ITZmhPqvHrTF)j}$!sX&jI3unYSB5LW<=|YnAa0F+wSNO{ zBkllhC+;ZjBJMWs5iW*9aIY#r+y~qrxG%V`xJLLU_;IS1_%`^~_>TB)_&)ey_~H1G z_;L7Y_&NC5_|B;L_{I2JSUO&Wm*cxo^mq;4iVxwJ;8)>S;y2;9;CJDV_DpRqDyQ^u~09T~?m4rCn7IG%AN<4ne-jH?;fGj3F@?-KFavk|A`5XB=`3JcHr5U9Sr8{MnFr6}(GK4aM zGLABZa!p61U??a`CWTC4QImwU%z@M~)G5@N)Y;T&R4kQ9&7@MPJgSJAP0gjMsQFYEPe(OVZPZoNJ=EjW z)6}!n8`LXQh>B33QXf%a>I>>y>L=<4YC~FMS`%7JT6mOhI)-X0Q4lr&pzA+%i7sflrL&kPyf|1H(GP^R{Fb6PO zF^4m|GdnT|G5a!GGbb=JnbVnKriRI2E?~}KE@pC=GnriG45pMRVN#eDW-&9)v@t80 zc4m|rVuqO|%+<^y<`d=~Cdj1Em^Htb6HbZ{aO833s_TGlURdUqgaz!Ggz}&xhxHf%%ZR|SrS$rOTpr?a###j z77Nc(u_CMx%gNfnDq~f$JggvVJ!=!|0_z;>EbBAt4C^@S6l)*rJWFf3$U;~#)+bgS z>mw_{`oa3n`pK%tZo+QLZpm)J?!fNO?!``J4`dHz1MCs(k?iSg6r0ZGu&Hb&TgW!B zt!y{DfL+2aWrx@|*fw?<`!@S3dq4X!JHbB1zQH}ie!#xKKF2=BKFyA@&$3%^UbEk^ z`*9j@nsDB*|6pS{Q#gw`J-BF2h~wj!IqNxU&T@{Q zlibtX{oFg;W88P#IJc=4O%i?_G?59B@Jz2hkb&Gy_pFf>X=V$S`d;wp`XYkqlY`%@} z;`{h+zMWseujU`+@8zH6AL1Y2pWyG|-{RlngZ!y{g#VoXmj4I;GrzTBipPla#dF1MF-6Q5 z&l8Umr-=jNV(}8OUA#=ZTpSj6F5E9ZE&gUtMrg`pY*=;jr6Yc zcWH0gV%HeiAlYQuI9XTOXxT_vJ6Q`EM^-B1$}(kI8AaxkmCGQ7L-tkHQQl0xQ+8U0 z$o9xi$zIAH$u7vA$*##x%IaiyWsvNq?04B~*$}y0K2+XSu9P$6Q{;W*68RvxTE1A` zTRu}hL5`CDCQrzF%E!sA@^$hG`C0jH`E~h0`DXbE`8N3t`AxZBzEXZnUMrujXscM1 z{Zjr#{!>0x@m@Y$@kTyEaX~&s(O&UcUZ~J1@)Z_^S)ou+6(1Bbg;iltkQF{fP;pGb zS8P`-S1eVmQ0!HlQmj)vR@_v)RNPS9QM^;UR@_%K&2FAur)Zm9Kf87IPeu3aZrOQ? zp4nZpduIdLQ?f^7W3xHgk?fM}&Drm=H)QY0-k!ZF`*HU9?1$NRvzzAp$nKHTHHVi& z%yH%LbJ#hHax!wHIsTk)Irg0LoHaQca&G7B%{i2FE$3{`jhst4V9v{&c+MX=-*dj^ zByw6R+bFv$`zwbi2P*;P2<1fOB;{1)H02!SLM2(5rz}ufl@_H_S)vRnmnl~(_bRt3 zk1J0pPbe=buPL7@LFE(WSLJ7AYfR_dX1P6bJLUGw9hEyQcR+4>?vz|qE;{#44JlWg zE6mN#&CgZk>T`9uXL7gaUdr8{dn6ameVzL#cUfM;JVjo5-k01Fc@y%8c~kQkd6c~A zd9*xHUUnWQPn@UDE66L#tI1oPcP{U8-i^F>xnN!_FP`^2?{(h$ytjGp^1kGK&P!G$ zsT!(Us9LF7syeFLt9q&Wss^hjsb;Abs}`u{tEj3us!Wwg#Z?JZ5|vDquTrZDRZdl& z%A<0ttg13qrK(!BQng%lOtoEgT(whmP_;*OK($qMQFTsrO?6ilQ$14sR3%j3RrS?x zRduTOst>B>>Xz!J>fY*p>J)XVI!*nXdXySaPgKuU&r{D))6`@&OU+gb)grZ6El^9< z*=nU)t_9R2@-Qs<)_jsQ0M%s`sgnsV}N;sjsOYsh_A}bzJ?s zdRXB%brVfvO|oWy<~L0*O}eJ9rn_dWW}IfOCQ~ESNHkOpPh-*)XtWxirbrXiEYZ|x zwrF-~_G%7m4rmT)_G?aSE^2OT?r9!qVw%^Q@0u3*?ehC-Q}PFDXXpF!^YRPx4f&P% z-u&hHJM-7&Z_dA(e=7fc{*C-Y`3Le(=AX-dnIF%;m;WRGV}4_8J8fHSSM6Z!Ani0Q zQ%lk^w3%9>7O&N5Or=vwN!=(_4s zbiH+E?Qq>h-4xwe-Ao-xH($rnv2`L{b#1mzt263cy0ETXSD_2(*6Pmaw&-^0PU=qR z4(n`z)4FrIi@M9Yo4V_|ySjV2hq@=ar#eLUO7~XRK;K&5Oy5X9Qr|`2Ro_cLTHjwk zMvu|!^vU|g`sVsY`q_Gwo~O^#3-sCg9KBR8*H`N+^tJk8eU-jaU!*V5`}JA+i2l6( zsQ!ZfvVMpDl>VXqxxTHTg8|XQdZwYCp|PR8;e-COzO$jF;gi0Pp`T%(p|@eIVUS_6 zVUb~`fnY!zrWr5>vVmdX8Zrz#gVdlh*bD)~3d2UjGQ)bqQo|aLO4Uc*7d z5yMHtF~c3hHNykLQ^UmQ8^e3UN5dyWouQGjfw70Nqp_KBwsE0xsBwgGs&TY&jxpDm zVMG~~Mxjw|L>oEAQlr~QHTsQ4W7N3MxXHNOxYKyrc+j}sIJsb%akKG(agVXqxW#zK z_|OO$9~r+H-y5G88x}Mx=u?nd(5_&3LGOa513nmtfE*M`hvtVq&h=K_P zf`Y7qi~@QAr699FTOckF6&MQi1-62lMq|Myzp21g;4b(z;8qYQC@m-}2o?AWq6Jk2 z<4hAwvrUUki%lpK#)LHyO#~C!#4s^ULX*fOFy))9rb5%Ng)Szi$!jVz)tIVHm8RvU z&8BUpy{1j3U8X&zoT8JaQ>JsKo2DD4Cnm)7-1Ncp)%2jEkvZAi+}zIG#oX20!<=gF zZ=PzNXkK8RW5$`u=1eog%r*xI!VmW5nXE|%RXt`>+Yq?`NW4UK}YymBC zOP%GL<)@{-wSl#vwXwCCwWYOmzF;+XHJ;+g+fG}qO=VkR zbKBO~KHA#bU)V0$e%O-icWlk=M{S>NjqRZAy{)A^&7NXEXd7p5 zyT&fDZ?wzpR=dbP$3EDuuxst3?dR-l`(FEDd#(Mh{i1!p{hs}b{iywv{g!>HJ=Kx0 zf3$aYba4!J^mcS~bZ~sPPjhe_WXC+mbVq~2g$|;_>{#J&If4$4V~s=RD04&|zdM|c zDu>2V;0QR*I`%m(JN7!RIBq%~I$*~G$5%(Q!uEyD3x7K59E}Ro3cD2og;NU`7ZOo~ zLPnvWFsHDzaCza{!gYm3h2Fwlg_{dc6rL*FQh2tok86G5jlxHT&kJ7`J}$gp_@=O( zvyrojvz{}_`K_?6v#GPC^J`%<=P2h?=UC@NXS#EMvzwFYWH|Gki<~HDo|EJhI^|A^ z6Yu0W#mw4(=>T2Nr?)vC@=6df+cDHahbGLWT zboX+ny9c@lxu?5lxhJ~ExW~B{xqG^qZn~TA=DKBWv0LHJb8FlMZkyZX_P9&k74D_( zweD5!4erhEZSH;UgYLubBkp_d2kwXNxcj5~i#y5F$aly)c$RvCo|T?eo=VSh&k4^(&oR$E&kN57Puv4}-g!C{fu5(H z&z?t~`<@m>jf=V!J@IrZYE#s?D5Yp*(fV-TqCrJdiuxB#FIrTDEW0)4fx@^Sq0^C@;oK^s>EDZ@yROwR+uN zhu7mR_WHbKUW2#7+mpS~yUu&iyUn}ZyUDxDd&Yaz3wdMSd)^=3I`21ca&g1rX2p$* zTNk%1Zc~h^ZC`xR+o8Bqv7lI1oKu`zY$=WuA1gjoys!9j@x9_(#TSb27oRWwz4%4( z{DC!r&4I0foq?wT zC@_zGKhPl9F4#3VA_xQ*1T%u1< zx}|hO>BiEs(!Hg(N^h4wD}_t%lpZgASbC-OOes{_t*k>?`?936#$|2F#*_^z8(o%K zHlb{K8Ln(r8MTaA#xA3miOU9*WS6PRG-bxJ%rZk+L7An@RAw!AmV3&}%0uN9<&p9w zZ~39}bLF2D$ICC4Unsv>exv+W`GfK&<#74a^3+iO(9qDZ(2UTc z5IVFlqzTbN^iWoa5#ooGA!(>MR1qo<W zRyDnvTaB&8R8y*z)$VF%_4;Z>wXV9ddPVix>TT60s*hIhuijI=uliK=o()ioU~{kq*b;07wg%gPZNYY6d$0r85$ptZ2D^Y=!ERu8 zum{)^>;?7)Q@~U(4eSH{2Bw33!G2(WZ~!dN#JB~3OE&<22KZOfHT2a;B0UXI2W7;&IcEO3&BO;Vh{zQK@5lmaUdQf zfJ86@B!Og*0%n3#kOpRfbdUiuK^DjcIUpD0fqYN^3PBMl1|^^rl!0>Lf)u0B<2Y)Sn1ofZ+G=c@72{eNi&JLmulK_}<}-Jl070=-}{=mY&=01Sd9 zU@2GzmV+TM3|4>fHzgW0psV6VnM)y zh={8oAR;2mg{uq|oZ#Mq;$Ap#q80=MCvF@+C22-?)3j+bI+C<$({v^2$mq(ww|j58 z`QCeSb4e@yzVE-D=leh3;d#$__u20`Hz~Qk9AB=_;>+{p`>ehKpUqe3EAkclN_?e0 zyU*cs`pSIez6xKZ&*gLbJU*|l%2(~H@zwh3d_EuJV||>j-q+x3^fmdKeJ#FLUz@Mp z*Wv5*b@{q|J-%LFpReCH;2ZRv^bPrjeIve6- zGc%a8nVHNiW;SyU6UNM8<}&9p^O*CP`ONvu0_Fl{A#)*f5pywf33DkE&MaaUGnX+- zn5E1z=5l5^a|N@4xsqAQT*a(nu4Yy?q?og9%LS39%de49%UY5 z9%r6lo@Ab4o@Sn5b~3w|XPM`i-OTgM3(SkmOU%p6E6l6RYs~A+8_b)`9_B6PZRQ>3 zU1l%y9`io)0rMgA5%V##kNJf8l=+N_WcD)$n9rGm%pvA5^96H+Im&#=e8qgte8YUp ze8(JPzGr@5eq?@PerA4Qer1j`zcIfve=vVC|6%@O{$@@v5=P2IF)~KZC>SLZ&BQRV zOdJ!>Bru6g5~E_088wr_q%s;NjY(&;jE>PW1}1~aWU`oS#>ki$Gn2#QG8QI}$!Dxg z0b^qdnIfi`DPc+(JL6!SOc_(oR4|o{i*Yj^#>-SO)l3aj%hWMGhGAHSW9pd(rjco4 znwb`+m1$$znGU9t>0-K>9;TP+WBQo^W{^3_3^BvZ2s6rzG2_exbBaMM!ICV+(rgGj zjXjGEWv8<<*t6N0>@0RRdk!1M&SB@W=d$zI^Vs?9`RoGr0(K#LA$t*fF?$JnDI3l% zVi&WQu}j#c>@xOpb~$?myMn!vUCCa>u41odSF>x_wd^`}J$ns%Eqfh%J$nPYfxVHv ziM^S+Boso9rI; zE%t5p9rj&zFZ&+*KKlXtA^Q>gF}sibg#DELjE!XXvj^DE*@NsM_AvVedxSm8e#ydr zjb{_sL^g?4vB|8OO<_}64V%WMvszZi>RAJu!Dg~qY&L6TO{|&CVRKmv zo5$v}R;OB+o@9sEVRnQaWyjcYc7i>{B97ol zj^b!8gqy~l#f5Uyxf$Hq+)Qp3H=8?$3*+W+bGdW5dE9y2eC~X10e1nnkh_q(h`X4( zgu9dr=N55`xy!gE+){2CcR9D5yMkN6UCFKFuHsg4S97bmHQZWm9k-slhP#%#j=P?_ zf!n~{$lb)<%-zD>%0+M+xlP<=ZVPuCcRP0nx0Tz*-O1g>-Ob&@-OJs_ZRd7y_j3<$ z4{{H24|9)jk8+Q3k8@9OPjXLjPjk<3JGoulv)pssZti*R1@1-eCGKVJ74B8;HSTrp z4em{D5BC=LHunzqF1MF^k9(i{fcud9i2In^$9=+m%6-N~a{IXh+~?du?htpF`+_^d z9p%2{zT&>-zTv**zT=K@-*Z23KXN~DKXbouzjDX9-?-noKe#`+|8ReCe{&}|2`A;E zI2kAB6r7Ta=3=;5E{@xYPN49he|2aM!P7f%9+2!MG{gXL4Y`-pkOSm3)L!^4g#qds zdM~Y^2k2`;-VRZR^oFdR_V%=Z#lMy6X}zM(%Cqh}3;iFS2z2Tc2|xkR03iU=0L}sk z1(=Rb-8uuxvr*BUndkvLTC-3jE@unn|L#M04*dR07#gMKKsgu6;P#%2NHh=ncOJle zfb#(s0Pp{lbOGA2ZXtROU5I9d{$K6$MJNrm=T@0fg zNSC2+rY}MC?xkq|rOVLjaGrlTqS11cGn2=!Kt+6kRzN)Xw{#`w|36JD(K*MiLciUx z3f=JA)#$h1RwH^+e**s3APTKTGgq%eMk~)-kNg|p8niQ@g3D`B2rjQfNH$6E{}FLL z>N<4;x-~4|egmxY8(|&a1aLFJEdaNob3TXw{zkwz0c-}?0&pAp?1O;a{~P7){~PR` zJJ45eZbf~Yx1mi-??ku%aTi+Id^hrO_rO}Y7tM&c4?X|Pc64pk4)p$q_oHp}1IX3> zAnN8GLK}8Ij4TTtL1#BUim3IE!Tdgsc3k%avihDxZJ$1c(1EAX%g3KVTN8Gohp*a& zsOD$U&dBG`MKA0|KPEhnHW*((FIiqhJ7Zr$59hs%KE3r76hXdBt^e#(#LoE)J)ahdx)$$8doMkJPVM|0?b&b;MO=RfBb;b^SQ$EJV>$Zro(eQQq7uzgxX=Z0Zglte9%NkPMf;~$p+mXV zh$3sy+tX@cP1GU!Y#+3RK^MqoI=18B8-5PfmWNko4;gmzsz zjAWmVpu-zS(XpH{WVmV^B|I{L7A!i2E?I(ztt$xP`Z**)-%Ak@Gic(%`60y4S<{G! zBWDpa$WVg(c{;J^zzkw%*xAHpawdW3S;Urkvk8C9I)|Wfj142uo;k#{g>wlLI+wVU zoJXLU=MiY(d?Es!Ptfxg5Vu8KKwNI&kyjupg}5myrH>??^)))I(ZM^MW3#IBXs5RqH2C3?TRjyQ-9;_C_e(Hn?aVH*gf zzLD69ZX$kKa5F)K-$KyaZzUqHiy+Y2jl?}KZ6aE?Z6>l_+CtpD;5K5@s@sY1=sSpl zMOz8o_HBeJ@=oFsbQiJj)ZN7I2k#+#^X?@~%kLw6#CBr#7dwb;@%IzwocjP#Rr4UR zFzX>=^ytF`D}97e?|770{Lo{BZSCVk-YriMU;XeTk$v$~#CMyYCa4#mA&#%zNi1Kz zi!i?PEHNkaIpVUI-2^f|PdvZj1%mtTMS`SXBJN%JGO<+g3UPDxtAqr-Mr^p{b)x+1 zH;961ZxZ{~>>+&UEn-E*+r(GIJ4D^=cZs{Wy~N_L-y=Ss^FHx?_XosJpL|FxSAImq z7ko^NM(iUFZux|G;H*!HV~>AEY}pb?Sa01=5aG}!#KXH&iA6|5pfzd4fY-lZD`Ou) zPwOYv4G$3XC4H>?d3)&DYP zWEb za`LQ*D@aNI3Nqx-mE^45E6ID;Tt(h9dlflt>(%6pQ>)3f^Vg8ktJadM4y_~4M(fG2 z1=o-VZP$|Fv#%pxd--~DExLh3^EZ%>R^CV+qi!Nk?6{eHY2hs-I(93$WKIOh9N$PT z+q{Xq|EbMn;-y>26X)DUE>FCj938oXM2~DGLw9c@BYwM+jI`cGZZY0Xh8(+x+?aeX zx#Zw|WUg#Gxqjgea>LI1!QTVqPo@XS+YdZMZa@!{vlcu;PBT49E=G@$VZS|2ZudPw z&N=T%@{x^Ckq6Mzl5^G)~!*73`q{%l(H1sAJdd?ma9es;LQvUw+Hc2jihYUOLE*Um| zFS!Z5M@EFbPa5z4fZRFvL$d$=k4O~$F&TDfAG!L#CnTElDM@bnjGVDKlGH@*Cz(A5 z$Z+rHWJLHuk_bISqH7M5&yRgUnl3m((s4)0!{nFbyl1~6zd&D;ThKS;p<~~Yw{QB6 zd@|w~d1%J>_4fh58cNpvuY3=30{#ha4Jd_qlb*pou8s7NJW`b|TAcX1lIJu97@ zdyAGFNYs&@{dzLD#6Zqnl0hyH%_LX7lSRfa$tKs|Wh7^kCi3EPGfA$qUrR=Y*O8GI`N(*d zAw$Dhk`Cj@^{AfYPy;#dU?UkG(FF6>OoknAA?M9&CCz)<$XL3aJaV{$41chbe0F9R zc`n^eMtxPMsuM>W9dsi-yU_gCpd+`cX1$`50;3 zGEPo!oFJ(gr^sdd5#^mrP(&z65ie8Jv0rJp7=%!Vho({YuxC;GQ7AQg#&l|jVg|L4 zIGbwUKa)avv#5;+XH(jQbEs8mVN_TA9BShibEyZvIhP{unn&%La~|~)IiK2TIG=hX zd;xW0`vufGdLdP9xFQTmQ6R!KiFQfj7Tta<0 zb14bS0Jc@>SIAXID{6w_Htaajd2eMXsS9 zyk{-7cjY=N`O@{&S?+77s}5gF?eknmZG7~4>fVhvP;V^WK%oOSQlWp{M9mtynM&`t zg^K+8R_cYl5!AUqZlvagZlc!C-b~TfE!4eRZ=)1%+)mxO@($|V7q(KyW!or1e-OJA?Z0n3{LbeNs{Nt+sj%G-Pz!S&q_$l45cTZ5 zhpF}G5o+^{N2%!xAEQ2A@Hizu_X&z5o}{)$KSf2*Pg7eg&rs9$@1$zjT~znNXQ{1M zJx47|+fB`h9R zom=-%=YH`PHS5sZ)bjQ3P!~||QdczWrEa_IJ!-}m?^7{LKcE&o`5~ov|0Bxc`Itga z@1vTjPhjpprI7M7>cQejDsSU{3N1fC(bCVUo!W!cj4KaO;pi~+m-h>*HS`FzaQ0E^ z(@kGe#yMY6p+~=_-lM*u79IYU3L(CuXmpH7Ki^#Ngw=$ z+WP&k6!GP8%C-DA>i7r0Q=#Y&DrEkj)Z#V&p&~Z_MMZ}GP2D?kf|5>?z#K`bIX^^E zWVno)_lKOif0csTJYPwn?a@@&u^4J2ily|2;;2olXyhxYIRBzte0l$rgvJX zpXRkvv-Y%6;WOK*i0K{F!quHrgt3d-A?v1oGWJlmZ+aGZGLXV8vSXVaT6m`R6jnnjb&+4R=`oI^((52JrQF^8W1 z;9UBiY5%r&&ZQ#{&Z9RybRPV&?0kCKMd#D#`~~!q_b#Brb}gj8ICUXiqq~Uy`}vFM z8Bbn9Kegmidd^MZv?^f{4Nurp(qh`a{4%-#5+z39MN`U13$elTo3tzLNzy^y??CjY#S zrXsGVcV^x|(?>SYGed8r(T6wD%je%r-=x2VjyQZP9a=im< z_p9`}h}UQ|_jUT%FK^Im?s}8{{N6ouIeLpeu<>pB3gR95m5bj6|9k03@;w?wzE3BR zAJE?~`;eab_eb=W$d75_#eMXfo=@l{Ge4!nuK0|$FNmax?fdCP+Yitv>~q>qAEb}% zIYblWVR|d^1)a0&2)&j#N+aS+`Uv`pzTm8{X)^R1`q_|gf&U#n`|e|O2>m@R>HY!w z{(m?9NJpZd=x@IL8KUSfbmpR8Y5MWw^pW+y(R=3nPA?PP{sC?LlO`?yfqDIlK2Q5M zO$?o&_sx^g9ZRM3&WzHcA1Uc)7e>=FXT{K#8L_mZA&$QD{&@Nr zoj}ieHIaTYDv5sKeii-5mC5wn`D*&@=oFfmlS*&9LPIY=Y4q0V>2zqAmPR{u^lL}- z^c&wB=0>u!(Gf%0v}&7?K5@iEUnsWGOrt|N^d^)`KZ-0gI-W<vXe}sp=YNwYz@pTowes-{vY8ox7fqvA|b0X{Lg=Iea?skU$A(W*f z5C?6mr{nV*=xGZY>05kF^xTkUSSKy?delmX8r$fS$ab1|y@Q@Rqm$lvxQl)`w41(! z=%Fu1z4VUj`skZO`{}j50XpQ~LE1>1gw--c??=OQ1QFbZV0?r=v2c`r42{v&&Excv zBNO!2i{Xn1D+;-vAVR3O$&ho8Qz0P`rXml7gdloaNZ6NWh0L238uD=D^pH?;Mo7eo zvqPW(kY^W_(f;#7>>K8X zL~cAkWI0+8LWNxrg0?OUK}8pa%!|Azq;%fJA-U+15EOoCNcigTkTZ8>QOK!NivcbJ zSOTyVU>U&W0LuZc09XNVCBRC6s{mF3Tn(@qU=6@pfOP=t0j>eK7T`L7>j7>6*Z^=N zz)b)*1Ka{|D?kLmMu1HKn*p`}+y-zvz#RZv0k#3$32+y{-2nFh+zW6Yz;=Kg0QUnt z0PrBdLjVs0JOc12z+(W913UrnB*0SuPXjyyuoGYxz_S3)0qh2N9^eIl7Xe-Zcp2ao zfL8%t19%6Tr^^zl5AR!)iJ+ z>sS9r{%01RfqOgz{VxZ^-$LNSN+JCof{cGa+x`rJkM#e4p8gXuQTG@0=CnoduuRPDeA)*=Q!3g=WL|QekKg znv2ebPqWWM^U?Y6>G1_dg%kDt=(KmR!j-l_-59mkq6Z#oG_x}|gN57%p(I4nf^dIyW z`Wx%`zGc2e(4x)KAxV3noOd(e& z6iP+3B1RFbh*QKX5)_GwB!xSAux(iX26*!lKAi(-YrrK+sWM6_Q_7VJWwbIz z8LNy_#w!z)iOM9UN|~%wD^rxIN{up2nXc3-bxOU`pv+KaDzlW?N~6-GbSRz5GG)24 zLRqPFD?LiDvPxO4tWnk~>y$nvqhytwvR>JsY*aQWo0TofR%M&AUD=`RRCX!5l|9fl z*MDtamN253l1zyi@H|OA=2#^KxI8Hx5@yXJ$rW^iyVwWPc1gz+Ni??kR8;JoA{Pad zkn8&;N-w?Wc~Tf#}}MIJB9l4fH%Lz+2> zAF%V6HUBEB{Z|RB|LFK=X>>yLWM2qHVNPPS43|mK3S1^f%W**|oYQpG=b z66u66)1$Z?my8K?aNWW9M39dW$?zGpTY=Yd27a)YsrVrFIskdUR3ec|q9p0yK_}5m z3=*fLOj0hXkW@-s61T)7@k**BG15e7k)(K1EhdqY$fU9;nM@{^DP&4nv@AvzD~prG z%MxUXvLu;GmMl}tQe>$zjVw);F4M|%GQG?o%aCQtvSisZqs$~T%W`D7GK(xvmM^o) z3S>4}p{z(&EGvC@(OvS+$DF*J#w$SN?t9mk=M%WO)^kfcabar>{E z6t4mrfwEmSl7moshMyiQY|K&_8nQCf2$dIP7b7IKCnfW;&Xg#-%xHF2YV@{%Z4-P^ z4!gf3K$}5wg$n*4#m;jY!7rcW_K`F{rT~6TstWi`8A_}Zjq@10CLhijjbDq;(}Cvl zaZB+3-3QKLJ2&L#HK&9AI?HYS(VH)W5YMWHO(AqKF zi*e0_hRw|Yf9cqV7Uw#gBUGGyx;6UDlI$$tX8>f{-Pk%x-wk~<*!A`pajf$U7DJXf z+g?%7Wb|8WB}Tg$thTCPEX+)a4a(qTvS)#pTp0T%VJ5oLb3mU@vi!yUe(Zi#8;rt( zLAJT}LQMIz?WrRLYO5z`Ui>ya;J3+cviPb0mbd5U2{mR|5n^FH60)CD^)DND+CpolixUjRJAJ^jNC1t0B*U8C^=U1C9H`j|^ZcHxA$XeN5@9v<71r5(ScBIMBw1#Mz_Y`CN-JmvsvE4*gu2@8 zTk+oZ>o?lFu(s0#s|MO#4L12c*!lJvm}w4VgSa;XT1N2tNU|5=MvMK?2HYOl9DO4{ru*e8=yBaQ>zpmjPu11;E<+>Jdxm)v6?u$QP#OYOFPp)Tm7{iJ{o zLRpVj%xO*7fs_0W3A*ose+#ryVQ$DBg!+d?e`$DKkBIb`i21#0gxJ%F{az-FS+e1z zb##hma4Q11MV|xf)}JQqQI2tYt{&nLp4k9jC$w1R;5nsubl}G0kYYLsBG4GjMU=oV zE|dfRMrcQ-u#Oa1kGG8hObJi|`hgVfh!y3qru*XsDh^7k7+2CYiH;=TB#G-UA;`+_ zs~^Ts?MQa0KvD^PPZ2dHpg*Z16{uM*_T10$;3&=GX;@d|&^ppFrgP{W{VIsUT0?q9 z=4g&At=V`|`+~Ytm*KD$<-xiehFxd?-OQj`YJoqH5~vL#0?1xhPv97zYBD-Zj(F>k z)=+B3HVR?9pf-ld5%2Dt&Yyd0*9&41{#Hq zB1a3HctyflxfhR^5+X+_NQ)hrMI}&r3+xVu!|A9K>Zx>;J1QJy4o>fKv=-F|MF6*B zpE%|SMH@X1FJ2v9@G_Q@UE&iwobIQ^8NjO?@_q~MSGA*7JR_Sk#~@DDI_hC0mh{(w zAB234L}8>DhY~D`@1q}w*Qku;H9&hs+rO=<4)Ou{&h;uz2sRqY2;HNLB z{VkK$a;CKi)>IQ%3>7zHJBSQWPGJA7m=j~1(D$deISLG2@Mm|ysWG<$Ybc@p2zBW@ z9bFC;tmSsW6GA?nWGToL2ozxix zv-K2k8n7&`R4&Zk2#%sMpproPe2N0FO6XYzL^K8L9FMR!m4ZH;JKcPpDwx%1XKZQ; z?4~!sQj!(pY_cVQR;)4BX@|LubH?FwjMolMiRp=aZP=g6ne40*R`95{w&>%O=Ax5$ z=k(ar&ZYe+Vyzm$(w%7{t#xLqi=drjdL8C@@OVnIVxVTdb6NlC8mr)}_a_5rW&mW0 zUb39Bg66aa*zmVuYxN%j%3z9#D0pMx;iY9hx2(+d^l$n%A}oIKnQ<)Wm& zP^0&1l*M*awsl;XC*EH^j8b#P0B{BY~fMFrg5!B+l2d4<&@-1nB&r9 zS=COjGgsYc)@BqM6u3>@DUCWC#M2tFHr{hBPz9Piymny+>#Ul(TzPVGURIGrH(Z== znGk!+Yx`3YjC2#&acMSjPl8`OZ;imOO=X;{vwl)NuoHl;(lBseNw9IwIwuF7eZZ3m zH-%nU`OUekwp)k}&Dg#Mug*ZtlgsugH9)-KM<{6Ax||)L69u!|>g;oN3i>_HJZ(0f z@m_(`59OeMFYoWxo1sl@&KBnY@VW(laNR3{W^f4PQDq}oYr=UoNF-&Wn93^SZCdon z!stRA5q!zZ230bU%2l=kDU@TFf6_Vbw8FXb?@56@2Fp*Xk}ywM7R~$1Y7u56p)6j| zO`39&Bw~IXO!zut%2>fR7PO_pt_`mJzu~E6QLyKfaAxX-mcXY7 zWhxQRfoPvBP+jJzG-opA2&$uv_V4&OZ5M2$e(+JiWqfOiDZ-2&cM)>GD1)+1kUYOU9B6oM)E5nEn#BtH&eICd9++a$|WG zXqbb%Xz`kBR#n1(K!H0zkc6lInZ~g%9h{6c`Q52-wh3eIftu9#gdIvR#kX&`iIwM` z!C$T*wFt62p|s+%C1}hOQv>x&`kCZDyz|<#tm0Z}#C4ZoyG&b+aNiEtK+IIz1m8SQ zZz=|g!`20sdW+6lEYwwi{iIn6g0vw9Lo`Vf>na3UK9<{sSuPc|OT;Ib1Xy==k$<`+ z0jybw9^>LOL>{zZWxw+uHl=vx$}rz8Nbl7q3HESfD|eKamsetm0=K_Fka>V-!7F$G z_H~DN7FGe@3(ySvpt`)ayawC)Ag?HAG0wM=DX$Z8xE&iD(A#noSDs<)P}K`hMsWLr zRyUN_mp7I-l{bs}Eh5Hya@bnScL{gCJawBW%P3Z*z)jI<&CE8pm$wDoms2s`37So? zM$#=tv#X%1yt{l9$8~*1kLbg$>J@Q#nhe5OtlN|7%j*}%>STF^X|UV~J7TZ4s&D|b z8!W?+50$?U?fU??aTMs0@_m4hfrqj3n5>C%IgH{s@Ka8E%B&JrgrtJ+BcJ3#T#;5t z@@uV*p#I45c*TjDaAM$lk_CURkp!CYl@K3;lSzE%aIswB~>6g||20S+5oMhu^26LVd>Z zJ6$6@)m9iQGI1UG>g-8%86d`HRSXO9zbHs%sW1mo0dMuNT1}XrgY(=o=md2AWnM-8 zf6?iMRZvi2J%fhr3_RXr=ah9=40_c_4Zl>!LLUT33Y|;tSkQL0>1FHE;*4h=RT51zr{QQw@17 z#{B;4Fz$oA8*G%xEg5E5%Px~DRRi-79dvhSgdHi#OipdiY0cHDbeaKJr)K=5=+v|s zGcux!nIONs_i7FF9j`TY3YQ$8WreuRR^;I*;IF+P^9hjGXK)pLsm{EZqI&SqfW3Hx z71RV&bn3~pM$CoJy8ZrOj?~$06%yEg1?pCiHCMD(v{c097gwjij_Rmb)eleka58pc zyKcxQa=IXoG9ol8LD*$F=SD^l_jVP=y62C$b7 z(BqRznD1AiErTFA3E&fEVhC&UT6y>`26sX6l;pX?6(beZ8S&ZudF9zdR%w1g+NfaB zr5OWk0<22&R4`IyhVcq%rKEBkI1?bz21P_E%qg@3W~|U+&9Fi*+@_JBafLe-Xvixo z;bxK|#zG~wipDu_|KC!Kpw*umi?O(WwTg$f`qMh7$zZC7xk;#u7RCeCD74apS7uUW za%CMzuQw!Cs=!~$B%f-aQYUc&ekYfjNjjN%iD|*|26bAc0c+?WKWQ5jqv_TCO~MFj zE6ZU{(kJ=x`{)&-aR!#P;g*w_GiVb%&NSHo(ZoU%oqllgG!<2DvmJ`G;eaSLJfV(pTDv2g(3j%B5S zMzcjPU@oDYS_`Z{QQ{P_(^}=gtM~`sUHPtIub~n4ou{($A5y=y7xR6oRk-{RdQnqZ zjqzI1q7JZ5V-(&w^^kLLZ;a7t^|88c4e!N=HFdc6HZ4=BD9Xuaffpylt9V#t${c5! zzs7Py6^-7O8DWgfQrsRX z)@`nAsq7NZ0v*1|v}5mWm93TI(1t#-E-y$sL<&B$uWSQOXAp<4ryJ;KYfojCt#^uq zmj+TwYPKyYzrS(-bmDcXse_eTZEkT)@nGr@aH61X3A$w5t~xvdYO#$&L9wYlci5)G zJ0uZCv08|~!$I|WEM{T76~euwW6JpCs5&!~borB_5Z}U)%F#-PctaSgJXw+;-dH9o z$Fcu>93Lbue~)A?Ibcx$#)6bArAy(G3KAF%R}98u1x|u14zPGvBINbSow-R+j-(H& z)1XF`YZT&N73{}kSE5*_+GVt9ToQY-9W*iq^3uSfMkC7|QKh>SHWgk$cKjRxvjTnG zjn6p1i*(u|=(iU1`J{s~8=wKpU(b+(Zc>_FkjBCIC+1oxrGH5zg|`z+%WP4-Fzr}apd*k znYOvcljDsAF00F&UJh}%#8m_ug)U`DgK)DP&MbBnS+az6V9ay4?1C>ihX8ZB8iVej zu;N`~1yxwP+%+ujCsUphuZFb{$5gm46|OkEGyE-2g}oCmtSCR{WU4}36MhbSi{q*^ z=nD;a-%KP|xi&#PEy7H=#a8j!C&e=-!R-|!D(ugLDHr4;Fq1WttOE4}O3u~dVnCxB zx46+&gInkWPJ^qd#D$}Fg}GMnQLAZoB^Vo$S=W%dN#G^JOx6o{z$<)GK8e%r8g%tz zPLIIvb`3#a^R7O)@#)rt|8Y+R|;6h zm>coV;p@&xhxmalPq&1}Mu0aCe{8l+IAbz1_GBvE-MOQpuG|gx5*X1aw+t}2ZMdYk zgy&IhEZ)x=94$S`3gGMW6M~+0czwoN?TUA++zqhuVg$<;OQL}B8hq-`N^-mKCnbJ5 zkmtkBgrD+2D{)jx25c0@qtFOHypmO}igiZ=$18kpFy>0dvl6g{m2b{;ugj`3X+cZl zPJ_HLL+8$b(x1}Zau`QFrc)swD;gDUCRy%mcLnt1W+57;h&H`x3ZaK-sq6a?T{$~J+o#jA#w zv|vuFJ4WB^Zge-e+uilcQUW{Z>byWb_sr`YDGir=>u7hyU9HUZRrJk&^_Qj z>F#$AO|cnvkGNZ*FJtaecQ&kyL}R0ROuamN9Q3k`>Iu}>W%OfF z0!QZ2Yvh0{JW7uXqAQ<@wS3M9Yb>L%H8WbYhdp4->|`Nown7{)*2jpFe6UvH5$?f$ z;;|$a@&t^GAim&M!06)>0G^c~ej7Xzb*m7$ zVZGxvr{-jNEFPmL-;)Eh+0zBB$ncD-^`0J0pE(Wd=sc;qDkI!$vrHZ*Ze_2=Dn__K zjeOaZBFQfBlz^2DU>xSD)FU;t=z?_=nVG!IPz1R@xedjhTs&S@kryMhJD}4Sd~QLE z4Nip~CAQ8H?m=ndhy-i(Vvprkho@Hjyz{g?7LRJ2!3ixW_t?dDFffjpVq2=uU_3l3hiADtFIk*n7uKv1y$xklV~!RyD?L>hFB7yYfRbQeHNu$J zc;ZS*^qL$mNUDtxVRiM{jma4%x5pARO8NZg=hk9h{(jcs`WWDFn44~HfwCUsjX3w~ znF{)#$4vq!UWilHVx1T{V28qpHw4+RB0dzP)s(!&*epm2#CUgl)OoC3wB#uR%tN2R z>G1F^ZuRtt8f7BJ>-tkC@OlNl+1iG04FOpj@Vf+=RhW++VU^Sv16q^IlUTo0oO52P znB*1Wu`$@DA1r+Me&pv42sQetL7++?@<=Dy@G@3t5$uLZ7JfU8VFb9tqC}0?!@EXJ z&}p4)85QJXP9A0Uhm4fm{ucEJ#yvnda?*HLekOa9qR7)0^crdb7PI?*yD^X*%Bfm@Ub8x|R}rGUSMU z^1RpdJ7FB_gq>vZ=6cKX^Sv4&<`j6Xg04O_4cFrinvViuM*ATK*g#KZjE0p{S5PSW zKV5T?w^-n6Z8a5nxJ^Y+vs({4%bFwJ;^9mJA11h)mU`{@X~hn9X*lAQrxk;p53Km) z@R|+z5Z|i|>60R$6ZFUNd2lkhS{R!O;FWnRy}FWe!2D^{=)$-f$3nNrAAue11b;Y@kQN$cd42Yd3!-SUFXAeoL&zr;saA1PzJz^ zMX`FnjZ0Nx+$XF?Kc^9N7MYWc`S^PkgqE5s;I`0M*eh7T*_CyrS!qP*D%^(#FXycX z8-KdCzYU*$iYkaI-U)+N*DT6f0MiPi)`Yo9;wrixd~Lw~AX<6byxmyd19^w{x_)U& zr?<;nAB^*7UmhR(F9sSlltA#RV##J_E+6 z2K(s4^Jl3th23}$<&8r#^T5Q2KM!}Mo zmg1NO+Eq5-7OSmQB~|5sT_di*8*;4BKZq(Y;+2A>REQ!KRo(g7g$5X{lSZSk3d>-v zCF1kjQDqnOolury+y!|t#tI=Xt15uJ9qJk?%FF1-GtJip&wCi}Dm1}aw4uKw*Oph1 z94z;1oz8oWJf3Qd70*eY_TZWfx-sE4#PcBLRrRMZSmLK)RRh&$^izc?@wjeVN+~X@ zs~XY^(>pAWLMy$XmnTFmnDeSSpo`Pu)3@bhq!tRN0G!p>_prVPW+C0+_sU@&M0sK4 z0yUp5yFepFT`%bQ`2$rAK$~Gs+o7xz*M?u(U)5jLBM@&n@`u6R1{z#;P93 zvxT_QQQoW_6Yo~dAnDJIN=blz`T*~)V(>V1R`mkaIprQR0kf>GMrdD7LD9*oaiAtZ z>r=c=jL=g_breXI)x*Gz6<1G}C9Zl5IME>ElT;}ElrB3S()GS4p$;bNetQpX7BUJE^)SMIx+hxK&h-RH;BCrg{{#697vL($5y~ z5{PUvj2i?_CY0_;ce_BFio`Jta0Uys)i%6OV1HI;!%3v6HdmX#Lsy=$x;5zBzZ*Q} zR;Po+nx?O=5q6C)Kcl)3;(Tg#T6GGpUsdW&(P1p7S~F?=!hIXBOjv>VY%9lF$)zq_ zK89PY&#uH2L>Qs;x70a_%EJ^_ZGqA~Nn*!TVYL;?0sw~~mG<*~N~$w;*4%ni5peUd z#3smLKNPpZYT#38wMXE-B90IV8`^>9Wn zmL`g;m~T}F$S$|^Ru5uNX;Ypnc@2Lm()42uKP7>vP?*;za0W!l&3GIGHeJ=%h`X&v z)IsQ4i!Y@>XvJ6%-)}ck-2!WTcoJVy6Y%NAI|H6LK|WqRF-a>Pw4wnz1RdD7qMZU` zQ6dd-1pX_gEQk)&5GZ3orVu}!=eY?rqj-E`YT~fnEzsMCgdQs41WWuc-gtX;P0~L! z`ifN|uXa*zAZ`khR8fQXqJiC!R@0O&$$(uT%$MwppH|h0`&nC)UZbzc#Id|GElZ3; znS$pGD6=qL0-n-gZn80zooW&^;8qHlS)g*D%&n<2Xp9orv)wrQv$kAuv<3`(OJTk1 zdxg81r6vz-d;&ke#)>`JY6_rqAiOjPx7RoX z$_Zt8O<7Gvja+Sm-c(|~!cdgr!kF1oR34}yO5+x+;A91?-PSDZ^!z+;O(V?f^$_Pq z@r|WS`24I&vG|VCY-|cleFL*tZA6S znd-R#-;s0$HsN`Jms_llar)H?Zh*!)I_}H1(o7Ys6r7MF` zZ3(Ko2k=&relE`hrv|I(6*;`GW_*j0Yq~MFv!<=ahgaw;Fuq11UU~A`v9urZzM3d( zk$_jXLEll+739xV*e{$+LPMcAiDzyMYmGx*D(;JD+jxWE(+oXH$9rd> zW<>DWZ|s4aNE4ptfX9;{lYq}*C}p*a@};$~5(Ir|p*5d_5tQQy&;jEi2dO_r)q2c> zpjQ|)>H*p0^2$lKpORvg=mYNcB0gw@@2P-l$K#cjrw}DDo5IKyC1>kmg7^^qG82JL zsEvj^4ojNh1c}L;OV)xBU2A2BLj3*ZNH`z)?H<7U2T#|o%||z)xlbK*T$PmYaO*F;l6y@ z7hC&Aehpae0nG}*BituMjMt3A(al?1JBbTX9BQ>>@fy0EeYpMQQ#6u<(R5+Hy|x$c zi84XUGez4`nw2pDyNa8_=W9sB`>(6kAl`G~)PPZG5OkAD%+R-9Om*U$bGPWFUc_24 z)-KSc#Z4GX#I0%pd=0Lp2e7u zOsONnY7THEMNaYFH(EO$RHr(~i==KCBz=N3N4yOLy!cE1Otc73o=J5)H@0rb$d?@6 zUp&UZ+@xR`Pw^?fEM)mYt&{qg{M3}AO1E?*agbc#%w>YRX8;(CwZ@!Lhw9)buK}-O0@CT87&^wB4Ly!Tk+HY-buBBe)Jj6ZJ!{kgR%y|Ezkj9QNpc} zoy31m=pF2oApXlDw@s|6zD^A%1t)50gt!FHqFI4DPM4?cVE+Z}?YuMSzFV*t>Kny9 zYz6ukp@*(bIPP9@+o`3-f=byo1|!275jcntxv;=jmGEDO8Y2eDLW~-2_lK+oXV> zP9tI~cwUr`&t*90vEU^41yjMe0wlE%Q=@%Kz~EegJQibh8JsX@?M3`MQ7cWd4F0{S zpd_RupVO9)XHVsG1+^tXJS*U7!`B3Rw*z)*9;~}GfK+v=_&n!?wH*uNIXR^p;hEMK z;N=JrB1)SAymGw;-p3k{rHNR8!TG40(Stf zd4s6)me5jdS|+^x6`pKG3Bt(;v;+K@M1BiA3m9P+jf-b+jxQJ98H?40tOKulYo1Pc z<_?zS`QmddSX)!d290pA4t(N-H74_Tsu12t>*tmi+2F0Ta1P+T%JWtg+JWX%sc$eR z0sEF~OMI9GSutSA#cJ_3%kv$+PP~_Sd{D;<&)huaPyD-X1GvAem_i4nIpRKafktJJ zmK*S59OJ!!-C5{?yc*t_i>9OuJYUh!pCTAHg>XJhR%$)Nh)&kvDJFF)ueqewH<{-H z`UM<^8NeJtwbl4uDb(SSFy+<>R&NLqdyh~CeAR=z6VLX$AYlbj11qR|ti7T**OF44 zqss&fJ{9JqI^ph|+pJE*azB^P(}B*wJUydh%w9!`7AP+~8O7p=Z^JpSnOu?y??kT7 zQ5bnD4)_UhZe%m@CB^ARu*qU7ttKeV05=v_fd^QjS@}TaG97t2P@YZ-Sl94`Eb#cZ zDnoRG_bSWrNn|#eOyC*o6b9K9VZ1nqQwn%V5M3$8E%?7aOtaMivN9~MV6yO7RKi=D zjlv4B!&{r7y-;TXJ^?&f(~Wb!eO|y68A*5zpR`l~Rftc#8bL!+QZ4GjZO6ph1QH7p z{(aBo_$lAd<$&h{;NJ-i@dzL|H3QuU&@_b~tP{XngttdSoB{0?Q|mu$x&=S3uw&o2bH$t1Y!p;d!o2Nv^ z7Fe5!*aqsvWlNv`9nS%)MC?6 zCKwqlNb^!%RvnajtZ5MRtA%l^fHF(CBej}%`%J9C;#1Lv*PIb^vf(|`biY!ueDSKb;TntcJ0Gws6AyHUzE9w@V8Ci|uKTHhACl zX{rhKQ!d=uO4u?Ozd|f23X-4J^kWWDW`}oXPnG)VGR$}4y!>Bu;2r^z3Q<}t+}8Xa zDl_x&YH(qBI8wxut@u`*Cc zpp^0RBAop^&n2v4xM_*^RA_fljeg5##d~|eQ*c>`*KL6F@+4h#i3NLB;#C|4E4m}d z`|F_FCDLu;O7CO`g58*JJx9hYZdIscIdwo*U~N825RpWIEAnVJjQ-eJ|JT7 zY$oC*aNisSY6NqX!YMEYZ(R5L8;3Wq2Rys2gBTwcIq+#37m!XZB^(1|&8G>h--b^= zo|gT?CQ9HG1&yP8l2#6m6-szlIqxBmq9;)SE?+haZER&@;mziL$z4-oB+re89=E{m za6%c!rHfC~@a&>dYB(Gd{nqgGhVK)};0=Cm)0BX{CgHp=)0mye#RDFT*H$s^M+QE* zd281h*6R>nd1`FW>!ff6oEz_v%u)^REzeEGa;N%au0-6^&)a!PAiWHfM)VTkj%d;_ zPb)}tP{!o*b?Sq34O|AMJZWWWOI~zl{iOavZ04&nXz!NUl3^@o zEON{mphtFg%b>ZmJR>@%r8GD{BDWwbRd9-onv6UV#!d5qE#+n;R23<7lazWC_hFJ=o6G zEwwFGEj3Q%?hePU{d3o~Tr|8LVa0h34)KkK9bl@%7Q@4bG`BRtZfmK>yuHO6TekyN zCpcU*TH1}Y3y`U&r59FMejnxog9Y*ZEdwnTI9?*t2U|ANv&}2zSP^crp{zrYMTr2DlHldjF;E@6E zR5Q|8NBeTTkoPft{;&doZ>t~mdAD9N%iK)MUe}fuWS1Ft+F^(Y1`#we9P^QkOE?2! zVgg&ET0@Z!X}#QfUvUtuEJMkRwH22_Y%S5|ai?c&JZ%a6u+#aAvo$e>mK4CB&{~52 zrUtd6TVts=&ZuQ;$$6eg%TkSfnVz23no2!MMxAhnD`GbF<+tV-Wn(R6IC(N1a(RZG z+*($g)tW+cxen#%sZxrO&&KC3F#LryEov=wiW^&6Nh@!D{<2mzzc0I*MpjISFK;bQ z#I>}w#we*o+5l>uBI{byjeLD;qf<$fQ!X9bwb{u-)~T8HY5C#a5iJg7p@{8-rVON| zttbhhecdQ}*z}}O+qK5%pA*qLb+vXNrmfWt+o34Fo3_-6d3$R=wfkCoTYIQw+YSSU zJ=hwJPdJ3!2=xq`F~x==i8QWAoKd3U92hlh9%)#1Z&C*OPrpsA(4eOAb8Ku)`9HVXR`0TOtlZF`A)0Q|ZqDo@3qS|A+!osuN zkt0(^QgV*qbY2o~M@(HR?x)%s@~cqh)s~Fy>0{I=jt?~By{XS9E8RJtYJV~a9fW<59@EVfIFhL!-&hK8m})eHZX*i^x(4unlTtDpthEFxy=ujS4e9j zY1_-bbsZv!-#&#o_#+HE)WKI25t1C$)=&3MdfV1fTz%VO9m+{NiEVOh9bQzQ(w5Pd z6IG6_S)Lk)m^(|;FpqAF$2p$R78jUJk1_j_ahFEhsR{2j&XPVXr7(Yh9&PXabdK@r>>M12(A%`-dV2NDLz(7uWaJvrByxaWje64y3}1O$ zVOxbmIrh3!j?_`;v5_5HhLYm8%C;gJk!q?IPkJTKrTNmfMp{~nc>}0xYig@On$%X3 zNZQK5XRW6ZRhU-;x1?h1bzif!t);kjC4?un(x~>f4w|;Kwb67euDY!mp6<4;Hd0@v z>)`8f{E(&L+(t}qTTj~n(jnSHY)l_bN$GIgNZWoaZxkN6Ehdde%C!k?B2vkWQrcA0 zCbeu+F1EY|zdlJBK2P44a1b`N+w+b?2{qq6-HO}**d2(tLJ`#R+V+Wp%7 z+nb_G=%*^jQ51r$H%PZs9`;FJ=H>RjN_%a48rU9;R@(A{+C$qzV3j~qhauI?z8Ghe z!*Zgi9oZg1)4R%W#I^?;+tEEK31^vYif@mh5wS+y1f+@WaYoMDP&t>3Yie?Picyk^ zwAo?A)eq~R-kxTZ+FQ4!T?rYcKa*Nnn73g|+on8fWt%ZLo?zGIv>5G|=0)H-m=~4b zUK*QcMisPs8`sSu=#)b0&qZ%ikz3SWOmih>Y^iCHC6+nmjFqtX(AN6Qv$+CM3D`U3 zPSI6HuF}biW8TQeB;x81yVl4@W!J$PNUAsTWN8f!HuhkCGxAOCjqQQxZ(G_gqMvOw zBHG#`3);=-j`pth&UR1iaVZ`BOo6w%dV&Ct{1(r%J@sIB7)aJGvIb?OgjH ztdaJM^b9Ve{k0Z2L`&`UZK(*KMEz0eHct%I_PBy{#F=Z+Mb|$zJTo!9ARt$0FHLlA zWqhtAOdhu^)giAq*c$AM_*C)cvT)VGp0G{U4w7D^b7HxhmQLF!!`^Dk@`Tr;qcEz( zL9dZ$GKHBna8KCbW9A0w@#clR7l;R!aq?c^B9@uFA$AnFb62r)`ib0W+*vWAf~7l9>4Q7Z=X1Zu^0M0X@)#KDfI zc`N}vL0U(mkxMetWTbB9k&xPv(vfbIKwWfXQac4(stdKVIx27-^QE8O-@HDc&yT5a zIJUAoayo+0`{dHPc^&yQEx^36BQD&hx(HTVVsS?f+9`n@SV%qzuALqA*|qej_eiQl z>qA)q4$H8`pa-=SXs$jMnYsoho`yqNlBF%LvpftY>?b!Q%y&8 zM;)zGi+Me@8ZmDG1z5Kxq|F^I)E^X`g{{%naS2<8OoKt~9UZj9mhW`1Z65o4nCMos zwA-{ud559+GO%@e9ZI}If~lGyF+Cmq9r+nhAy{%b_RA%DrjnAnh+3S1eW=$BzvE;z z`V&VVv4?_&JG%4h=n;^LW$UP05v*b^cMM@Z00u!zY;U+=?B$~Lu~v$(r$;+R5Mi67 z4z5Eqb9fJVMPaVcQ5md-DAcQ&Wu@b^fwj}G)4$W!im&-uNj}u@Vr{A4*U0-I_3ZS( z+#UbGtOaYQBwsRPNzIF9&bzaWE^jc&mXgw>ATN}c7-u2z3^^S=#AC5MJ!(s@JdZ{z zF`&xW<^jQxbh)=WXn_ED!a-bT1T91FVx;JK={5;5@|TUYFf^z$7Iv^1hjSTrV5gcf zwk}=9l{U&Dij)=@`3xgfaI7q$>yr)zQHP@>*{o4R*Si$gpESc)O|K_KY1w9seTn_J zKTEPl1(!#9XXPN509ICJ8vbIWDTYnzrFKTsBPNUby7JOHy>fCp8_j*3=n!jPjxEhc zNuE<_Pev*74W>^wMnIaWr_k`1b@n?b99vuUDBDt5X8L`cG&zY8jpMt=994lL&1&s* zqiY{T*S8L>RCNv~m2}p0Hp2EZ_Jt2hE0J&N6pb_3wp3gN;H>~-Q<*uYbJ^(O{Aiy_ zA}Xnh$)Ig?pw^&M&9OGBO}~J(J!2ecVtgC?-JK)!IBtjCN8=js$@-~Pp4ZYDi5gur z*W2l5s-^+z>Fn%5I<0DKNt0RL=yBW}u9zdV?pUNu^TVAf=I6rQ`M4NcbUuzJ_gtw{ zMCoWJhk3Z6TybZO+z_yBuQG?;oA1=kqsP{cyLk<>9 ztQ9_-ONLglSk~dwdcY@TX`Sn<%CSV}Ni{tM1@7r1Sz8eAOWSac3v%)WBj;&&czTpv z?z)7$w?kA&mlw_X(fKewc^i&3|E@rX7_y9u$X~=h_3644la>$|F^at=C5~$$f#!qi-0Mh7Y2!*$$K`EHm&zvywtroClb+7evcRpL}DAGtWH zlAR;%xq_}_v&S#&D(b2+YL|6YITBrA#0wmn&2sy4wB%m+I;p=0SCw{HJ~x#S9e#Rt(4Bu z4|TN|7HOjrYc`6!kJ&5PTOKx|MjWE;W$4?echD#sGSY!bV%rm;l?z0aNM@;9H<%pc~s=BG>5SUhe#QA2>K_%!H4ZY_u3^Rp0qJG#hBNjG2eLW zBCY8;p?-kj@iNjtr-=5v5afNR&(|oqj5N4A$jEscDXw0y;>_Im<)eqVLRotvi4CQt zVMa`JcML2a96!nQtcr4~>w(-e4!u=mcWieAeDOw9Vt0a5JZV1)eOGdKQg^knRnsR# zKxde~RBEMRo?-fWq4~0q%LIWAcN3*im+Hw9$duh(WRyf<-E$CGjDENxK9{yq7M0iC zWS-A)S)@ijEg@Dnj+!!>E5>}lpFNdq#Cpy*Q#36TWMHf$rZ4w zO@EPL)gY}iy=18a^lYqxufDsHmXt)6B26;alSDx!!B-Q_=QnjXcXPDwwfXIHcT)ki zbcfO7v9-I6w%3~7jx-S}&}znzT0OMXUf-7Xc2~xCcRx`}avgacG@`3JE>Xv}AyX$j zebj5sCiwx_{WOm|9BgsloIxW;N^R5bTD5!F$va}^M!PxFw#SoHf>)*`qC+_kd#GD* z@Q_%gJ7SQej+2+6-t9iUyCGaN>bdto?*KA+(A0{#C$)lb^jxIYB|5i7VN9_nJ`u+e zwyQVwdt|3)_`ve*@x_&gOn%1I$B&lx#3W_-!z#o!8JhxV8OaCs2x#kaPdc`15cLMr zc}P!@)4g3N^@d>{-V;IXvDPNDiky~*F$L6#>WOx!IZU^VS3-<~&$*>oqaTd97?NEl41HWhZdSuYD#wwbflj*m{ptFCaC#K+S!+vd%nQN6e#m!K!e z@2RBg*H5p|eVFGJXSu98CI^;Mkrx12gPXXqY*cyrSJR69) zWL(ip;ZMY8Nv3^AI7%ywy1j@_NGu`sdio;EddhoVtt&RlniI3I^>8$xR-MyvJ4pM6 z6l|5->qDtxu0fqDS})h=pOO-bL#yGbp=W5eafT-vO0l-5qbCeC+k58KxAgS%v?8(* zsHqLK6)X{{Tizhu9!;?8ssEn(ww_U(3rWV&Eu)u9%c%}(Mz7>a*S5>3k3IobJA8eH zrx|H)Pe0~VGer>_ej)BVz8#Bsvo6Z-l2?? z%QP=wF7=2;*(Q1|P>>74Qnennr<1nt)=O&Grz(0BkeuG*PD`x4sbNX&6863a&G#Fh zoWyv-vwQR+^~cjKMZ9Fnuf~WC{9Yg!+snJxher9*xnHk8O>MExb6>ju0?hJ2SeMP* zMQqO?zc&x{x{atLdgK+Sk#$4KBNAkTwuQX|?cb`25eV!4a^(vFbl1LdP8r}MCeV%>peLC`1qYV$UEnmaB zXnJsrBzn=DPv0d6@7U69mOsiu&`A%MNuSx<7Anl3b(^8GRtrX|=xV+tu{)`@}>3wN^)e)IyR0+}%?4HcRZWS4*=JS`hCa+iKKmGg7x= zy~tj#y>GCsqt7G7HzCm+JLsfwW!a^vI_-14>Gi}1{e_rQG2zUwr`NkCx`)fN?d_t^ zHkM}h^w4~FUnA8ae0p!6fF*{Y|Lp54Hn!jZjY-bc`-b|4shvg7n8suQ=d~A(gTcNs zvv-pa!S{Lgd#5+1jKJ1YOVURB#J)zXV@F0Vt(lxC^aUh)By)YA=8%a>(xYi zt+2Rk`pMKj1*HRl8jZP({`68miL6QQq2*QB79u|D#r}xA1Z75asK_j zNj`{fg&xYu4}y0%Go(MbKd`^GrIaf8eym$qe<+P7>lO|x6761VYNF>+0IvHHs8MD1 z=8?!n8LdUr)XiACu@<|rHqKL(aXpSUwyJX}$;H#Q4$>_V8WDqBtg)0)^GaJf?ye#V zpCiHSEpSemYm#8powyvECy|yvN0){k<|@$-HIKF7PTNmGbn;bdjK$lnlJwMm{NOXT zCS%A@%fr~7y*NhF&`$a!ZPg`Yz?*55Wc3f=lSUZFJ!v(kKO1G$*s3E@iB3w;w#mQO#J3IEyg~d-fFj?7Eo{eB%zi#Y0dGGw!F~) z09w49^C0Fcz)G+hj7<+2IfWjNn~;wM)bJSr~!X-I|L7e41}BIkpmm(G85?$95WC`OG3@^@oQ+yZ>Dv| zmn9gr5+~G7qMrDHIHROF-X}fQDJsn=XKOjd!MD#?V(LILydrwlbca%CO`6LZI7;K5 zpRj&qp_v1+p`~rDmkwmpI(eAqfLxjz`%L)``9jk!f>mth$_7dX$_FZuuP}XMEnLZp zny}|Pux3>Q0mivrjkZ#=YX*Fc;~uvy{~8ALttxfG2?Va_C{r(xHJ7 zY7d(p5`V3!*VGxKPW3qC+UQvi1vwzlvMlto&Qp%Dy*vVQa6E{J>NDFTk;;HH(10FF z9!PdNYwfM1WorX&gZhB`An~{bRVJu$RiRdz!xn=2^)zgEY&(y^RP49BeBX3+;9@?; zCuo~B<8+-A9*QzA^c&5|ZXM{a2K_vTQ5eH&v)f zCf~sT^kY88vhi+<_JBdZL4V{ggTTSw{Gh>LSXqfNhLX?{I;irD&g%<~jH|(#g`qrj za3m&tFa#FX$mo@$2mR?-czH4I-4h~d87aqS%^x!MD%Jq&(~=l&D$odA3lfdvr!T(; zpE(9K)6#4;v89d3Sa{MrOI zXzOV-SBR()Y{R0#l962ai;*t@rGphX_sU^a8T+mRHjV*$FGZ}%!CH8#sh8wys5KH& zHCSi*>S1LDLM070nm!T>yab~S?e5ncfI5uj`ZAn_^X(VU1O?>E=bNpzX9OK+Cq)QYA zM+Zej7G-tkk<@vTOph|yom>-A8zP&YuFznd8}mE6u_Y4H66o>UXqno&e9=w%&%t>&<}Z-v7WFlnz>7+HNGY9Aup8qT(Nw7{Agw_?LEBd)($rB zyGficTJa+k$JCY3UP1}PSqmJe(U`y--PAAsh;N{02YUFSTAby{LAK~5^d6Uo`hx=z zL8c%h#rVKbDD3c|VCo5@^JhD2j3X@q`AF)s)tfkv8j3c`V`v&@-~<(B3SM*2}>>7i801C7qA0iOnh)Dy06Rp<;*fQfikN zo+_MCWrkhh5M^s2B&?kJl%x>jxF!Co330Y)+dPlnl~$WE{!X8}#`KfuM&#;2-B1JO zwN7Q|sfM<6Ikwq^@>Uv?65e9Ow$Zd5^Uk3T!`C&`Gt_O^w)&29)!ci%G^TG{WUR6O z`VIepkq((xTF2G~Q91;MhenLJ=BStGQSk!SeRPPUUVccRsc6ImWy-KFW+_7wQjL05 zI@jqOiecDsDR$d^Qm?(#mRb?xVa9n<>*DYwq+Y;#*k{;x*v}~U9}a*OR(ILRkF_MW zhMMQRTS#zp&~V_er*Zz;qe6y5hl5FdTD#fkN5hd*%)0j2E2W+Vq~v96v54VEsCt+@ zGHSvalDPQ5ov0H%?3*1)%VUOP$Hm1B$B*+QAm5+kk6uTPzD!l#A-dc|GcEF}#FT@I;gaDhq-Dd+^hnLc7OWgD9WEX&qOI7XYaQ$cYS$0fIrvCaR#wgM zNMIwp%}yl)A$h|QK_sHp$q(H&+%)WO-l>xa+caqGd#okB;L2e`NutuYz=y_*#ih8vtm~M05k=Jm1TyiSIm3dr#tbK2kcsZ2TjyoD{k^T-5 z_PPP4?=mbOBR5JvO(1ej#+_#IC}+KbqtVn%wB`)s2+PSN%@FtXR1IFdxmlAR(_Xf8A|)kxEjUdG)=x>HmJ z&1H^cncm!y?2%ZkK@L0v4vH@i`5K3O{)kSm^aUeDv~IE40$I1ds64u#3rC36k|UJk z`dFu!XO=IvjN?=~QW#b?Qa(~Ka(0x%(N<}+R@zvDc3P6FMruZ?;j1;5Qb(VAAaq(ONm&he?$y^GT%B6AXTn3lPWpUYD4wuX2ars;USI8A{#aszj z%9U~DTm@IjRdLl^4Oh$6arImS*T^+-&0GuD%C&LrTnE?5b#dKX57*1}asAu?H^>cf z!`uir%5fae37p7DoXjbl%4wX=x$*A2mG|I1`HTD|-i!C-^4fbEqp8A#<%kwd?(+UnL+}(X3YP>g!CUYVd<8$jUkDH` z3xPtA5G;fUp+cAtE<^~CLX;3K#0arMoDeT02#G?HkSwGKsY05NE@TLqLY9y%sAWLX}W0)Cjdgolq|{2#rFM&@8kFtwNj7E_4W;LYL4j z^a#B|pU^K12!q0qFf5D+qXH-Jf*^>3B*=mysDdWwf}7|rT15}hQ@ki%61_xk(MR+Z z{X~B;K)fslia}zq7$Sy>VPd!#Ax4T(Vzd||#)@%byqF*+ib-O!m?EZ%X=1vVA!dqM zVz!tg=8Ab@zE~g@ibZ0vSR$5+Wn#HlAy$f2VzpQ!){1pvz1Sc&icMm(*dn%yZDPCF zA$E#gVz<~M_KJOCzc?TcibLYCI3kXUoXCrUD2kFOi;Ad97QjU}>vQ_qw zJ>`q?CD}{%mVIPj*-!SD1LVtcpd2Iz%OP^8943d$5ptv)B}dCKa;zLD$IA(FqMRfr z%PDfIoF=Es8FHqaC1=Yya;}^w=gS3hp_CqC0ENea;;n^*UJrZ zqueAn%Pn%N+$Oin9df7KC3nj`ah@VN}iIh6exvCky5ObD5Xl7Qm#}el}eRTt<)&B zN}W=#G$@TqlhUlTD6LAH(ynwUol2L|t@J3pN}tlN3@C%jkTR@{D5DCe@QR>_iloSj zqNs|d=!%=_u3A+O)la7OF*Rv09>*s%2`qTA@~| zRcf_bqt>c*YQ5T^HmXf(v)ZDzs%>h!+M#x;U23=5qxPzOYQH+54yr@yusWiSs+`KJ zf-0(#DyxdBs+y{+ZkoGh)jTv$?V@%`^U}OEAI(?u)BLpn?XniA1!?%k)dS9;HX?F?y^Xr^o9FdZM1BC+jJCs-C8&>lu2co~38&IeM<1r|0VhdZAvV z7waW@sa~d+>lJ#XUZq#-HF~XHr`PKZdZXT?H|s5WtKO!!>m7Qh-lcczJ$kR+r}ygv z`k+3f59=fPsLtuUF6g2z>9Vfqs;=p}K8?GTyN$b@yMvp~-O0`1W^%K*+1wm%E_WAq zH#d))&n@59L2tGLzN8g4DOj(dn(&u!o~ za+|n^xktE1xyQK8+!pR}?g?%y_ayfe_cXVS+s^Iac5=^f&vLuC-P|5-FSn1|&mG_n za)-F*xWn8L?kM*>cZ_?1JIRQT{Q0Grxs@oPUDf%0J0J#Xrq& zIsPzzgg?qZ&mZGo;E(es_>=sL{3-r4 ze};dFf0=)UKg*xvU*%up&-1VIZ}8KETZP+%+l4!X>B61D3}L1)OPDRp5#|ba33m(g zg!#e(VWF@{xJOtlED@Fp%Y=J{`-J7f{lWvngTe}7rLam^EvymN3hRW2g!RG(VWY4~ zcvyHucvN^y*eq-j9v7YvwhB)QPYF*8+l1}H4q>P8jPR_mOV};!5%voEg#E$+;h=Cx zcuqJh91)HR&kM(d7lh-&3E`yhqHsz$Eu0Zv5?&Tw5zY$dgja>vg!97d!W+Ug@mBFR z@pkbJak_Y?I76H%&Jt&fbHusgUEA5+4>H5g!#F6E}-n#K*-a#I53!;#1<&;x=)+ zxI^42J|jLW?h<#4d&IrsK5@TzKs+cO5}y+fi$}zx;`8D$@dfd?ctSiWz9^m&Pm5>7 zm&BLFSH!d8Iq_BTHSxUoy7-1TO}bUOO}bsWLz*t#Db0{(O0%Td(i~~7beD9uG*6l@ zEsz#Ui==y`#nKXKskBVGSGrGHF5NFZAU!CpkXA~oq}9?IX|1$QdPrI?ZICufo1}-O zN2Euk$E3~D7U^;632CeJr1X^Zw6smyF71$ZO3z5oO1q@p(jIBAv`^YE9gq%6hotAE z!_pDysPw#aOnN~&E}f80N-s*Mq|?$F=_To9=@sd$bWVCzdQCbny)L~WO_OhxZjd9l1iUMeq>@0IV9m&^Cd56BP7 zE98~(DtWcMMqVqglOK}T%Nyj4@+SFV`4Rb1`7wF3yhVOoenQ?VKPf*YKP_*Qx63=^ zo$@pCv+^!^x4cK*EANx{%Ln9x@*(*-`LKLMJ}N&iACq5@kIN_Ilk$u5DfzT~Mt(_t zS$;)6E1#2Jm0y$3%dg9C$kUWtmD`ltl{=K_%ALv#Wu`JqnXSxG<|=n7cPsOh`N{%i zp|VK1M_H^aQI;yplzWx?l;z6($^*)S$_izrvPxO4tWnk~>y(F-^~wfiqq0ePSb0Qw zRC!FfP!*b-ublU8pWn?@<@4OVp+6GWA~dK6SZzzxsgspt?d` zsjgC2t83J?>N@oyb-lVl-KcI-A66exA5|YyH>+FJ$JHm)t?HBNQ|i;|Hg&tYL*1!9 zqdu$dQg^F+)V=CHb-#K*J*Xa1pHmO3N7SS0^Xf761@*XkLOrRzsGd?!t7p`g)R)y) z)U)b2^;PvX^}PDJ`i449yH&eQyIs3Oo37od&Cq6Qv$WaT9Br<4mv*-{Pn)kT&=zWo zw0pG0+7fN4woJQMyH8uL-LE~MJ*chFR%)xX)!G_ut+q~kNL#OM&^BtDw1>4vv`4ka zw9VQU?Q!i1ZL9XA_LTOtwoTiv?a+2=&uGtTyR_Zf9&N9-Pus5@&<<*cwCA+L+7a!j z_PlmXdqF#{ozPBdFKVZ>)7lyBCGBPH7458cPJ2~*O*^l>uDzj6({I&p({I=B(5LHn z>NE72`Ye66K1ZLc-=*KJ&(r7Y3-pEhBK;nHvA#rKsxQ;;)$h}n>-Xyq=nv{E^p*N5 zeYL(uU#qXvAJW(B8}yC(CjDXk5&cp9F@3YXMSom>Lf@)CsXwJZt#8w}>pS$F`ZM~o z`YwI9zDM7y@6-3|2lRvbA^kc1uzo~8sz0wE(_he!>nHS+`iuH0{j`2Ye@TB?e?>p5 zpVME}U(?U)uj_B<6YpTJ=2<$)-S0A|Z%wXL`}ymLx^r~a=gMexxFuPWttr-2YnnCPnqkefW?8eXIo4cjo;BZEU@f#3S&OYD)>3PkwcJ`^ zt+ZBItF8HNiEagMfo{QW0d7s!W^0SJ)!Jrlw{}=NtzFh`Ymc?p+Gp*z4p;}RL)KyI zh;`J;S$V5q6|It0widdjxD~l2xsk2s=IZWhb@g!dbiL?$$<@o%+ttU_*VWI}-!;JX zvTLAgkZZ7Oh-;{8m}|IeglnX0lxwtWjBBiGoNK&mf@`8{l54VSifgKCnrpgihHIv4 zmTR_aj%%)Ko@>5qfoq{_k!!JQiEF8AnQOUgg=?j2m20(YjccuIool^ogX@snuv@Ns zklSka0lGHh_ot6BU9eQ&`6XI7#j^kS%V$10#bTNANsDFb>Jul=ojUT|;WJZbte!b_ z!Mu43=SE&a^m>jV^deXbo$8ggQrhVePr+c!^A?JQzuWHqUBTf9zQVk z#F@hfPo2JN>dIrsran&EIz9FAgQpLkdimgiyQbRK=m3%<`(Bv4aPgAeo9EA)H+TNB zW%t;Mu4{h61z}TMTy8<)g1^b8o8h*XOuZSO4J3ZT7TIVkxPasWKKg~50E#c5_yRV= zh5rEz_!Rgw_zd_g_+Rijz=F?%FM$68Uj*2m7rqR>0=^2q2EGokju*ZGz6rhsz74(u zrh;kUR&X1*9ozw?gFC?tFcZuIv%wrN7u*Hz2J^stumCIsivYIag~ebASPGVbd%=BR zIk+D@03HM@z)G+RtOjeqTCfg01lEHMU?bQB9tMwqN5NxYGuQ$i2Ty>l;7RZlcp7X2 z+rbX76FdW+1-rm*um|h~`@nv102~B|z;oa*I0BA>=fN@X0yqv%fRo@wa0;9TXTVF~ zW$+3(3(kR8!E4|=cpba}z6<{GkCPwsU%U-2SXO+9fA82jq7QNYdCOGGJZyo@mOYk} zmJ9##HF?MKt|ictXeqQbzPDwwF6h5ZKmP4-*tx7qKoQ`u?kt?X^=?d%=wboNem20N3T z#m;8uuyfhF*t^+z?0j|syO3SP-oq|tm#|COW$eA|ee81fe)a+OL3RbZl3m5FX4kN5 z*>&tg?0R+syOG_*KFmJCKFU7EZf3WzkF!s(TiGYsr`V_2ZR~b-2fLGfhJBXZ#qMVJ zuzT5k?0)tDdyqZEKF1zrkFZDC=hBv5mCPz;HM53U%dBG_V%9Son2pRP=3(X$=27M`W;3&e zd7OEI*~&c0JjFcCY-6@FJD8o!Gt9HhE@n5ghuO>QWA-x#n1jqA<~imtbA&m{JkK0s zUSN(hCzzAWi_9tJG;@Y|iFuiMg*nTdV_s!mW6m?LGjHJHYS$tp{mAH%_a;XyxNcKD zg6k?Yhs&hL^JIEt`6q3mH{V24Cq42PT%(Bo__1-l`aRO016Oc8dgQN&`w_sVzVH)Z z*CW4z{R{9-@GW51BNt$Q4}2f|0Q?XT?ekSY^vj#zr{FE{Gw?R}1i(k2dI>$+gFcaJd{J>mrH%JDlAQ2>i6p#ioKoPhI=72i@ z(J>DI?Dq>I$O73Q2V{agkPiw#F4zO^1-F3};7)KqxD`}_y0u1y!IL{2h$fBXO30r9Q!t`XNu_^@yWB z7^JsypLh8nSMmQo(AKZE=F?o}yR3BC;q#Vzz`WWy{!dwt}r>tJr3?g>7Zq*mkyq?PR;y zXtt4!VFRIe&avNPzt8@F{UQ4!_Q&i`*f-gqvcF`1#r~T84f|X6ckJ)kKd^sf-B~N^ z!FsY6*-NY!>&+%YWfih+(0*fD?#s}EUvn6U{U-F-#y7;W_4e z%=eieFh68|#Qd1~3G*iNQ|6brB6ErHV!W9| z=+HvO4Qu}g=A)<=7cH2#d)xd4bo>f^`*lwqBZlC(zb|`H`DZEy@>1P zmQUi^uR~8E{mfM8JEXUQ@56T+Qg_7M1(t&uU^X}prh^|M=61yB|JXyB4*O2v3jYkG zzeG9>akqn6U?#W^_<_0LZZH#Zv%v2WI~(brkhQ#dN1lurWY5XY%j{Lr57X6&OL~YLAn@e0@5W&mx80He=WVZ3~|}0 zlLKod##XOW5 z<&Q4jE>SL7E|o5wE}{!FQMW~d4aW9-ir>kSRO-7i{<^$q4=-r zv@QJV#YjoZM2C`eY-${r$2X4?Joe~wS13s|{Dnx#2<8TiS3bp%(aLRfWbz=?>=7v0 zu`$RC(7Zo~7Jdin_-_uau7L*jhf)rLo{xjREr33*btqruVB6PfENy_c?xFg4fNEl* zjgLW@Zh}G`i*mHqn(eK?_~i;j*&wzJjBK*RrX!o|1_ooX7|kT(m`@siu-R>7RFmC~ zaZECjiLp$UjAmjylO-dX7}I3QsOAyoBuhp!F`mhi5lu3tNk%ovxF#9d#MmZ#mbrkx zx7fFspW*Lq_HE|p_;Y1lnO_)x?=ZH%KQVuX#{Vn(H|FoSoA6=o0c-$s z8GnInAQObYXf_)9IfjX4W0^So#k28D0{(JvH&DP7Fx3q10T^;GP|pP8z9ba)E|E+W zL+(m!+v~$n{q{Ze0`|*$QT;fdjQwuc{2!I^;YAA;y{GT1y+~jG9`ybX4ZY9YM7QaG zz1}bU1jb-NF(?70pbV6Q3Q!5$p~tSI_p4A|4QfCwr~~z&0W^XpFb(yuruUl>(*jyS z8)yd|pc8a~E9rfrg)si!2xg(90HS#58K-%>5YsJ zJJuuP!zAy4Gz`1}uBG=K>)Y+|o}&@tM|$Huwy-9+w{KGN#Qp;;$T z%tuCVE_`nfB!rQ(8+!A*NN(hLghE4aVr-F2PI~iZT(&FGpGn+<_H%f=g2^7k=epd-kIb`4J$4Ay5Q-Kr~1IpTEsE79R&Y7PtXl5CeXB z2igI@22;T8U@zDQo&ryT{a_1t8axZ00XxCx!I!`yFb8}SSio|y3+x6vz*cYs90Gg5 zW^fEV2M&V+;2_uzwt>gN6X1Dp6nqVQ7Q6|52;K(o037HSf^M=sukvf8iNFd{KrBcF z7r`HZHwXpaz7^XVX&9IZdoLim{~*!>VCro+p8y%NUypns(yt?pKza+(?@qNn+wd-y z{VseLEY6xT-ZC`K<6Qp!=Dy})`H-jadXub8oy$=UnJB@#gZ+y1a>aoJSV7N$UlaR)A=cHBli~vkG2HxIWmcO#zQmgFEKK;E@4d94`aJ{ zPmNJxvAAOV_g8p=fv8nmP21el%>B`{ES5h}y9v*Ayo={MES4YQ`Ho-W36Hn%ya##8 z~n2jdiBi~b+F1s!XS*tk!jdG0-_ zcPxfH9W<7kXr-cbvU>+|k3%N=9gY2ai7LaNVzwG;TDBU=WRN{H1e4~DYk=nn_s4?<& zMp}>OmxA!rkZq|G=lT^&zGCd3Z;#tgpGW>Xrtb@;MOyxpQ;v8T=F<~=#E&oW7}hBH zEYi%8vou;ncF_2eICNt&nulFTk|9L{ld~^%giqr zmfF|)+UadyM9h2me&Nke+S>k&?TYGjzxNktz)yi6gYSahgP#Le@EPz~@W0@500;Sm z-^2YCz8?W>=6{>#&&Q9uPL{tNpNHIIE(bFJx%WH|$afQy#gF$*L##WP1<3s?x%cz~ zYt!z#)^{u9 zyAyk?-&C9JW2AO}3u0P98yNrHisSbu_W1WRU5V|m3akcez*?{lJOtK*4d80a+lcZ_ z;9>9xcoaMaHiIqTaX{+Nor+@!%mL%uyVh92_;`E%ddE9R{46YYHuxN1!QU<9e$V;) zg%->Edq;Qm)^L~qAy1C?dlveOIC8i5ubaqk;r{t42TjzBYo>c#{)5a)xQG3^%S_xe zzUSwg-ly*vHsV=!i{)SSEW3T1l4pn}pWd%$gh=ZY>Zd;%ckeI4(|I)3~<1Z;z6z_Z|^Fy2q} z{RQwn@O|(D@I&w;@MG{3@Fw^vcnkatybXR1T){8EJK&e#SK!y+H{iG6cYxeG`~mzC z{0aOSkoyaAkMK7@^vAp4Yf~{M4Xm*3`tTy`OTY_w1EODik@^9DBmd>8w()E--W?1= z0C{fYM;HtLG58616Z{ms1<3aUZzGLE>WcIi;2rQw@GC&Z+iAHko% zpTS?iU%}tN-@&`U4UqLCWAz@u6OeKGOTY_|v3eii3;cjT2mqHsARuG@!5{>XF?}+Y z9}XfwB!~jhAO?`{0pdVBNC4zJf+Ua($oB-~JAyPoz7xm*nIH>fgB*|x@<2Wy>wICH z-b)ylzq)?=XG;rg9npt4chrC6eF(O({=^S#jq)w^mVS$F`JBtQpqB7|`smzoaSJAR z982F{+y48*@45W)y)N}VjIaMEy^rC-B)aP@jBLM6f1^j9nV$HI#y`;!c{~e@Umm_o zwUU+2?Z0ru|98RoyFc~W#u>>ozGTlw7^)@)xj5>v9S>wQ)Ap;xXn12mJf6o+oaFbJ z*%J@JYRA(y-D=IrvT9# zM34M8j5l77-q?w4F@C&p8hq2iwX_J)Aw*-|4rYOw;66Y!=Ui|%xRy>KW1Dlp9bh-G zk2exMMzob(SG|io(N;uP*)`Q3_^veGNVM5rleE+BF=}RYb?xbrsQAL|YL( zHklTC4a-~!R)N)E4Ok1-0mt!1qH&3CBl?tRM52+2-hCbZjbIaa7(4_$5Is%wH;EHPk!kM*YWHUFBqe|ntou@B*$7aO6acHq4d z@BN(@N8hJ+UXW*z@n1&iya8J7Bz=0IA8)9z{nqduJbO&ud12F~b%t^yBZ2nsz)AfJ z_HB9%fJhSf(mdWdUF)z)A2Tn1;C9!7MNn+y{t;nG5a)rx0@*oB=O^ zm%%IGEI0?qnA9A^-2rxk2f%~iRg}F3&V$#%8{oSDV&ua2!1uu(#9c`*l6Lo^d>_~k z4uFH;5O@w821mdT(9RFRkHC+?Pr#di)W06R_*2Bb1%3wJ20sU`;DM>vrx$;L*muA$ z!A`8tuaN#4?1F9Ai@!nsx8Qf+_uvoUkKj+>&)_fMui#nK`5V%|gV$iM1gpSmum-FJ z>%c=`J=g%q=bVh|)r*tWCBA3Sw%^oi>%}Y8zh1pKS^d9b+2hA2Kh}#xFaGN$+|M{n zxeoRRZPr+NEQ;kb^u2EPx@>gW;d1mwmGM74Hu+(^kJle#lW`x3_wkZFOx}}#|5pyi zCi^pvV;)D#Hd5*6vD-~XD<8&t3H&jh7x%ur19$v?n;1W$I&nO8;{TAi`nYNU##C)@ z5gU7ofQ+${5mx(eWj<2+aN(lGrar_MPS-m%8~X4TRJf7vuh)FiwuHks)6_{H!u9d< zlGq00^}+Rw8C`2ki0B%k2Z%l)x`ybyJ>Yuu+4X3!(`f4qcnQ1=UIAypIq)hVT8L;` zqG{d$-vvaQd=Kd@NPmFz+eoK_sbCs-(}FQ8q$DE}J#UkBd= z-vYOSFM=yWIQnfM1oJizZ=BBz8`5FVjnU04n9>vlTER|@}T*ks(V0&IhQ z9FXz5lSpfk)`5Mn8<0MUvP3+dO9_8|QR(mtg9fQ9`9 zum-FLBk+xaEwFi{0@w~4zp1C=mv}Ef9naL@-w(SA+hM#u{MSA&iILF{dHTF%^6#$; z=yQ!4)lU}7oi2-A*10_8a>(U+SNA0soFUgS{mkXhF1}8Y;Z8Y=C3Rf>IvTyfkP?>` zml2nnrhIYAZBuTrsxAD#{FzDezFmvu2d2h*)3j`x$N3Ed_V)mcZE3sWBhLqpe`YcO zJ~HM=qRD$vZHk8E$TO3+iTu|J949oNfq53l0px!z*doX?kroU24;Ca(eyLuI@4GD) z^1E>IOr*uq3M>}#mH_hRfgV8q(*yBYEaX3CSS;i}W{{kWxoW&)AqD>n!xO(dPse}5 zAZ29A#DB#o!1wQk_gRw?N)@hI1o?qgx~O& z8Nbd?gvuuomH00nZ`1cd;CImYHvKKU)3+YK^!Yj7O-srhrz-rvj~ess0``($U_AFS zl%cEByMRfl+k_U}@%{;$nzui#O8%>dttIkY?Dt`l|Mu}iq~t$<{MIP@k&)V$Nz$KA z@cj(W(K<#r+GH?}Opb4*uzAMj|K87)?q@zSDczYmeuklL}0x3M)i2A zp~q8iqD%N#k3*kaYrO71RgX`(89ERUJ^lpJ@p_!-b)v^Vg|cNxKaKRW;4^>)kAv&c z&w!m^H+a_qU5j)VU;xqM?;y47aTnM`kKc@RydM7_`0RT8ldzuxzXXnY zd<*hlnFigBl<4toNIwCd1W$v{gD-&p178GR0$&DS0bd1Q178QXfNy|rf^UIugYST; zU>dj;+y-t3cYx{OPA~(^1hc?wFbB*9cY(XXJTMrZ)b>`i0n0xuxVxg$cRq0a?f9AIxGZ;h*lCH*Z%jMja>}XHvF`h2 zlV4A{xsZ3O6}`7*{ny_QIPVGDd%wnfF{IruV(@-m>rE zS%f$|XL=d$7kdi|*cFPGDAr$G*RQ0;|4+O3?^jYpA4lR>Vn2WukB5>^z_{z5pwItC z^|(8=#m(jdzny_Km*nS5w#XUVsl)@mehQG3d!YDH)TV%y0Mo z-7K|_L63cxV2>F~optM&f9!jOf0cs%&mWV1)_m8&N9=i#vG;2&bvy#DZnyoDdKvHP zA=Ag>)7S>9z-q7ttOe`9Lts7F0RCI`@|*bVWPJK9q|1=Ljg;tRSMUq)4!EB2=|3Uv z-l>znU+YIV+1}Y;MT`fyUcLNfv=@l@AYj+aKSW!OdfEOS2=WdHqL;~gAc$VJzYF5y z_iKHum*?T0VY6kA`F7Q-zw;DN3jGsPwWZr4TR!b_3w;}@#bSF7#j!y=S>-f2{|61H zqW3BDhKsAq-&_J*;$8B`E&Dnb@UdPt6(8ARMA5wk#@?~zydBB-F;S58|Lr=wW6J|$ zsrKhZ#`Lmn{FuCfVB+|(?Wu*UsmoBR#mN|M6h?6WUEaM#6tC_5TOU7#v6ucAX!0MR z$$x()|M~eS{tNXnyoupBbAloN0h;{xXY!w)Unc+anK{S2%Dl#$XI^LCV8;HJz(-5( z-ZS>Xg&WYj?f<0S#dp7C`dIH`8+@#HZ)|+{diCy=#)togZT_DyKKyNrao_0p@I2HZ z&wIZgU`ZCs0?T4>#FpepvZO?kA&DGj zhK89MX6A+&+i>)b>gF_U)83xmd+t5|_jKm-_3qBj?5FCI7Z}fhGC1^@M*WdqFj}L=2 z0>QdjU(=0^Kl6XB8w-Oy2Y$+NFX`{Wns2XxNAg>sI2K=5Al^Ri5%K#e?j?QYA1l^< zz25JQEyw+w|NPi;#kK#)_Wyfid3@3Yu&x6t37v#V!Y1L8@JWOuViGBdoRpbF0eWV% zBzjU-5(DU(v6BA#cJ{xI|3%NA^>hCT`}*!*w6Et@uJ|sV|9d>yG6dLpL;tp~|4aXi zzdD}$*}ndx@#MI6!ffyv#K)5tr+j@pIbP?l_+P}^#r-eh+xU3$m;M*=vXzy)Eazd>@O0C!TlGfiU`Zi@I&xRfAwB} z+wZ@zVgG2nI{tzFdb~RB-vNXDJYM~?zw>YXJ7BQ5H|}Ru-1yc0dsge${6pdql3%VH z5x4*2cluiTYwJe*e5KPruHF0d@o)EjUYqQH!*^pY_)Y)+@4G?!H;O0h+3g?x&Hsdb zeeW;Y*Y&GZe8VIacJ|-n*Wl|u3@{wz7Qb#P*rowm z1JVIVKpQ|?Ks!KtKnFlaKqo+FKo>w)00hVYbOUq;^Z@h(^a8~7J$i#}A3$F~KLA)8 z#xfKz3@{vU9n={Cw%>v6NU$9R7!4Q$xC_dD?cY2Wl#c^E0q33q#)JI{fQbMU;1wuC zgDnOS*Z07J?OU+Lf$e*+jr%v(O8L^hUiJ%%`tdK0{uMU$&)0;(fs)Dpar%Ax`WWmQ z47}lgB;XbPW2*kAp1HxFs`ZbHe`TjR@aX6Z9}B0zMQ}ab2@k_(z~}$ts=rnN`RxUE zz>mYP!=L@5MZCuQUmU?;RTF;O?q5|>58SJHLi>c?|HJnjoj^_yBxn;{3B?Hu64oc| zPdJ-!C*g;L%83mV+f9CiHK67!^H%^T`*$ zsw7{oKN44CiLX$11L&#T0%|CCeq598^LljgS%o)XMxo+vU;7CqWh8Y=>Ymgisb^BJ zq~1w=lKKK)j!sEkz|Y@Lzx3LV`|AHX6@8`b%Q}JNuiyF0IzR8nR|x#y?dint{bzbQ zR`8zU{5JVOX`J7tqAyAVU_Z{+(zB#zNzcK#7l4;ZFO$9p`3I2Sfcy^Rok_bu-VO2| zkoSVT@29*!X@AnUKji~S2a*o{ln*6U%-{Y}mLcE|&QQQG zz<+9g(+Ym~rYV1{C;7R*`LBo%i1+zsgJ+1(=fwM)@#Fbmy8v(=5ZA9Efqv?*`lD|j{8f+wJy5?z|6*v z8j`m_*=;~vKe8U+v!0{@>^B0m27ri8OGm%}0PrUNQBM+h^86T2I}vQZjHgwC<6!_A zKn#fYH{&{*@p$I=yRyK3?*GO2{*I@uh^IXUy9|2-dkd=yZv;oed%{P+ad0+V{;U4l z*Z+t7XG+a*KfL@GS6%#zBjDNntK)y>>VK~8e)u`~UHEHwm4rqKf3C%^YW>Ie&*GN( z&wZ7@5+6{}KdaD_{F=VZFXIEg)<28)Wh#8?<9d=mr}#X{ndG>ZVj2~V6 zq7U|Kb<6nqFSRA(x|H#-J{x{}%;&=Kpy`TTLEpWj;1Q9;wAr8 z)I>#G_1D|RXSCv}qVI6^i)T9d#XcCb|HV;7n~IRP z_Ir=sKkHHU{PI)(<9&Vua6Ta+AvG0jey1uJ9|R^xMM|jwgSEqgbsZ$YC@3QUK5&hl6#b;QIjSm0)li;5uMX zWf*)q;2j{d3Jm@Ypnehzt^gbdbg2r1djSssW2(X6^8twJFgP2q1JJSt44x0T2r)L z_?!RicMyxoE&tcRU_&f$Kms5UfB;kiR0dQ5Bmt@dssXA4Y5-~iY5|e~wE=YibpiDN z^#Kh44FQb+jR8#nO##gS%>gX{Edi|nDS%W!8lW{G9e@P10kj3Q1GEQp0CWU&0(1s+ z0dxfbeI82&pc|k&pa-BQpckMwpbwxgpdX+=U;tnsU=Uz1UIOHU<6smPU;C!Da}(_q|}ERKuJ(l zs2WrqssYu6YC*|RL#Po{8>$1Xf}MlChV@Eoo7OI^PFiwWhqU%-Nol>)nx@T5L#Cyq z)oopx)-kP1T6Wrmv@vM|(^{ml(qw75Y1}kkTFbPaX+6@0wHeZ8C9GRY_msp`L~JhX zdhA9FN?8DFm|D3_r8b9<$B;*n`;q&Qvyd~9Ymlpv{Zpo-22z8mQ&a0fpJIQU-RXtt zlhZxv-gIAjQMx}pkRD8*l0G#(lpaoxq!*``q?e|brB6#&rK{65>DqK%x<1{IZcNWl zpOkJ&H>X?Dt?9OOd%7dNAl;enN@t~Kr?b;J>D+W)IzL^IE=(7t$DbgjTWYtoZmqke zcSCk-)2(f{cHP={iF|P&UMdI1m@&L3~I62_X@b1BoFCB!y&9E+mKYAO)m^RFE3d zKw3x#=^+DTgz}+DkO?wF7RU)Zh7b z%z|b^bD+7c^a6Sb zy@I}ne)!FA5KNqsI5jbp7*32N7AKY@mL`@ZPD`AgI3qEdSe`gDaaQ7-#JP#{66Yr_ zNL-k>DDl_-I#wmFPF$0?HgR3zH;L;LHzaOM+?2REaZBRX#BGV&6L%!;Ox&HgCvk7$ zzQp~B-zFaTP5WP8@1HrYji`gDi>QaFk7$5^BN`$aAsQo^AethYA(|svAX*|?AyN>j zh%`iNL^=YAXoF~rXoqNz=z!>m=!EEu=z{2q_~W}lhzvwGM0Z3FL{9`3(F@TV(Ff5N z(GSrdF#s_TF$ggjF$6IbF$^&rF#<6XF$ysnF$OUfF%B^vF#$0VfkL4F;QDa*4cJlm zbyz+4eONR2Jy=KhW7u){BiKavOV~;H3z!)G4t5&;7IqeX9_aR5hJOGWnqPa`N*R?i zs$?W(RL!WCQ9YwZM$L>`8Oa&7GwNj2&8U}AKchiL!;D55jWe2LG|gz1(LAF?M$3#= z87Ud58EF}4nht_4nYn@ z4nqz{jzEq?jzW$`jzNw^jzf+|{?Rl4eeUl!@b??|`wjf--@rKH;K*)rJI+x;RpJgp zP%}X@px}wtWb^4V6eST~aXU#N?H#%*rm+DrY@hYo)LH$#gkSW=KOoS*{Is}9u)Z;$xj=W;F|go_ z_=5PX7|w7p-l`vmvv}2*dzt0_ote9=<^V0Stazipp}CW9D0@5lJf4AH=wIYt;-46( zBFtfyScUGh(>>W8aUC=grk8gz_nvGUZ46h9U5VWzXo5PR&o5mg->cRzHY=~&mvQg0 z*M+{5Q1QEQ$=qF`kg+Se8Kal2p>?t~U3O5SEF*I0_;&=J`#QNMDv`kx56-_AXvn(5 zZLZwu#t0^|(|i(b`=b3p5%aP=wV-zCE_~SO5kF?#W0~bgY#Fvws0ET^1xL6S@;{2+ z^2gf4c#?4e+KU}89Y&WHo#Y(Ace3}g-xjRZ4dh;ZT1*KCaSvOKFg7N z(PL(}40y_J=@SXB)NoD{JWF!T-;60Q>u)iayV3pVT;E>vJl%;c6r~v8*?QxC)EiTQwhrpCwFT}SHZNx(-c^JMAB*giaU)dG5Zyw|Ic;t3ok9fV zCg)0)*)UL)g6?Z8A$CJ8R~H-DjLD3r;byqLgvoLZCp~N;v7q!<2k7^{wS&$>IAkp-xI8ozZ-2Xx?!Ad z5OC{fEyYx}!ZjQ7A4#v9v4Tw68`>e=a&A5DVopa+lW=G5Hb24GUV~@1rHmrz#d9z{ z*lie2@l8~3pT}Lm>=H;}4YcfK_eBx$Zvq=Q`z&{OT_mH>PgpmkS3P~1hn#q3Du;^A zwsV9q9EUTes4iw2U90~k+Lzd=f%Hri`jzZ~ ze*&+WagSoI^qTnwbsam*fXFsSCu0jnD`wq5ee=u`8)v_)M7L3{!_tbEkbA0!qx-0f z8FyGL$`0vvaiQ)5{!HW$7LF_AR3l6cC3+A0`YOtG8rNfgP49I)9Q9Q51Ya1^l+-Hk z94@2H_N1Yjqn2Vhj$PRcan*&zXfbOuwxyJgjj)S(*^yD+MuGF{j{%PMqb6l zXQo~|!ABPi371*sGg4(!C{GQKwf)2E#LIZK%#|~-*jACZv_+Zi2#O*;&s=hgG$Zs$ zGc@4h>?1U#^rK88uP*8-c<1YB8;X0zYLNNKd5=Cax(7X@WTOX3)vz4+d^S3e5Hy#H zST!tzvE428>FUx9sTT$LPT;9#w6QiCjeCxx)d zQqI^Q>FZl+qXyd(nn^0-)|;5*rgMwW z)n)7g|5Nnk-~wJ(E7m%lfw8K5xj1LxcwbFQ0p>iad8C&@Z*Ao}Oq=5w5phwPngaw4 zsTS$Br!UVYDh-|06v`Bg#_Cam6M~pwhDGCRmAy~T=5c&(Y*XCqP#^O&%W6|Gy{n8R zxM1{X&X@VEA@iC1mRwADuwfkGHerGo&P`$ujJ~v#suegUtK*{f{l2q^p@ab~8>1*jwZ+~eMv{=60-jIEQRkOIQPp5y69YlUd?kCWx2O6I0!$z-#SNhh!BX^!B zHTsBh-&ECHm0%T|7Y6+k^Y=v#;*qRvYK26JKR{hzO6Oe1Rgt@JKhwzbLl}@X>${o~VR5;owPgje1=4qn?=hDtmFc6TOo>zNaR`MZ%4$yv zJ})>iGPa;D5He_!_k(3F>R@2B)KON2x`kAU`z-WOI}hE|dP8xt&`{dLeAQ&eQF!X0 z*>Cqh#77K|IrBJ9%^N-0-7C_8y#!~o5rlGqmLt|aHo&E)Og9UUQ|hu06wI?tP`APy zLd{b@^o*l_${KH+%R3P~h(b!4g>5Ib3GYR<^Iq~Ri^ub=`V;;~a-DP_eKl^BosF$! zr)f3(4bzvR4zjl8ugO1V3ZwX*T)w-6Qf$wZ@aSO&^MIOEe9dsxumih7USfE_(HLf$ zBFe|bBT+he777vTv~9Ls#wAzg zkK#NdJz|U4rx^7kcJcwXin^RZ@jS9~1`}M+1!nIZ_5^4UVmVTO{b)l$_uN`3&hv90v6|A`P1g4(hs2 zO2tkg@8Wta#{378=R$^PJ+=hDP-s;gjXpQNQEb-N%dMDB7rsU6)d=r_5v#ahC?xP8o)%L4?dH4XMIjdaSm_g(9 zv3?4TXKj)1HZ9LTfVB!&<>%VcQBMD{poza6Rmr=EJI-;Fkcbm4=&(C$DY+O$G zETfdy2)E1qt$Yryma@C5Snyicu($_mbKvUqL()swp}rP`qwLkn=k^~Wj`H21Ug$FO zVXRuNjx3`)OYY!rp{C2Ks@96cI)5oe-58gy87h4#kYY>A$6HDX1B}}Z&WMBj9eZ>n zUxc70a8DVNbH_*K+t~Pmk^rMnzJ|laqn+02Q=?v8x8kS1VLo$|k?YVCnWG|I*s8Jy zge##r=)F81J)7RZjCFREc$hBbEm_QThu(~nL%SnWMXl#a#J=(rzzn&n^RI|D{Dq-L^wp2qvl6R_;3AH zty8p9N}o7y$m$h*;Ip$k=C=1vv30b+(A1M$U~aW{R93P#4PO#p((Vi8;uGvsumc%h zZy(6(~j-V(bS53}I$yPM|q;jj5qzI7&mQZ5cx$<9n;OMGlfuICZS~theE_QZ~U_ zT7bPz{b*TEsaM?h(9Sgo?s~FpK>$pbF_sqsrbFfu(FdfYq zW|>5j5yyomh6|(%S=R+u6<4rU+FkZl2~8noFAr@s)wANI)3FGqin172m!+gc_!wuo zx&!A<_S5`#o;!rLVq|o!_)GzjpuxwyCKmLE?VA_U%3gsoXEtW2t7@* zp14l~=@zoz%8PQP%twxk!hGFp<3ek70Xiz+tkmU_>+1Rz>)A`#Zd^~*IWdOwQwjAh?mX=WcCe(QZzmzsfWvfqXFp`7+?$9?;1$7ym8K_Xek=SwrZSNL`0 ztpxqV4TVkFn<)@2<))l)vl zw;7*AUQjYzFfDjMBE%k4zho~}^uf)*^)rX$eKackxafM3Ot&L)!9Ca9D{psRA@-Eu zmg-h!W8QkwB9Eq2&OT#$%X%z-l(`eN33Y^dxA;A3t|t*UnX<%0U>`x<=G9{Nu^(`7 z>^@g0?;F`h+DTI}_5kO!pwQCS-oRZKYoOUEtNcn-mV}2z7Uuf9M8*{`RJFs;!tFF12bB+PV+DEi6x^gdvHL-o7}?9s_N}oxh(yU~b{F%M%yjf9 zBHA~BUk%li{?a{Lh~m^V+?D%m?{Gg9*P-7dtP315u_@zx`<*pxHEn#~2rhz-%`TJ< z(r@$h)^%4K34PE@ik?eTsC!Key<0MirlB@fZ?mAX8_Aw!wo)V23dLyrOA}msNh88t zwzMWEF)}Dm6kB;_**Q-idY*GA{-yR4`v=|*)U^_eGfLa%d4c~AMPNIwEB`W4LP`jnLHW=JgYwd3NdjXyYc6eH;Tcaa-gtJT)J==g z+?+1NbNDuzN!U&WvjuB}lf_fmQ~js$b!{i4el;J3^2urCc`FKn{0n@A8Rj|?O(|#4 zy9%E9>j;^Gn(VWNg3NCia$ZI*k<}Yl(?a0N-R;$t81;m&*v*R%;|D6>-X4-{Z7o9= z!cwiFq`B>thp4MB*ePGZ3v+vsTCjHN-{4!IjAEzd9qlIZ5~&}009sM{GRq|BV@Y7y zO5gzxZHwo7Pjhaj?JD;p@tBPlJcmx1)GAP({}O}ETp`;|JK(WfbiwJ4V&f#IC*qIX zHk~Rf(pl+b!?3`D2vbj?F*((ZCmhR!m5J@mwN+`8;Ncf@W z7ag^nwk>5p!#|TSf*mMumRvHCJdWGJ*HLp{Mk8Bto~fm|oxMq3KKZG5ihGT2Hs>vV znVc)h%9O5!>8#Ka^ z9Gvl*>5^KD3A1}pk^^tByY*JXC(;yV{eVr%qPHT~CJ?X_W#5q&a;BD;tqoiq3Sohk zgk1U#>sfXtJHy&DIwT@1%P;FJnnyXs9z<-&*-yCO93V}k-ce0==ZG6pCV0CtO|nJG zNhN(yujO7^v2GxT%8zIcv8K_+Qmded)*OjPISW-Nz?v=0cf4kT^GpW?PCb&foSBEe zQ+&lgQuvD0m3WQS4>d9Om1)1Nmg6*~6}kg@5PhksgP>`Fl7Lq4w%Ca1X%o?%W%ayO z>GEtbzLloEY_ikEdmr9t>QCrys5a?I_y%#O`H89pr;%%xbcUf0dlpZCzrnFf9%j)A z3quo7*^)<|@$~Dw>9z&JL4+QJLt?%-gc`;fgKuf8iC&IokgKsjMYw#CB8HoVD`!3R z)aRGx1q9|oobIDm&hJm^Lr4u96fi?Bs|KTxHN)C~a+&4Gdn#Wn!$>R&N6s>LX9f$k zhB}>iGt@}>KEE`Q%-&}z(wdyD@hyuZei#1+eJ1*`qB?3mKABRFVBxe2kHKC*O`ks3 zw1JTBBe;9pUWALJZJ39tgZQGzN@W-2cD%t_P&&)Jn5K5B_i z*lL7Zi>LWl^4>FdGjE_rx?Ayi*7nMGEETp6&O>H1X9p&@rv!Bjw4g2P6lDbV2kaY5 z5?(La6PcV>2mJ&cH4hZ*B_@S;=p*i%rt-`hY*;bX*_dQ32{1Q!_BhDF3;4%8KZCC3 zvSgFY)CZ==CXs&uaSm-M>k!YOtQz2G+G{VGRK?Q@_%xN_L1c*g5YC^snE8nJo##C* zx9mn%p_nFF=2_vX7TD|e;J2{bL_0@^5IUl^+9-Kjkhysd<) zk!$j|(&HK=s=ltSYZ3hi25j>5l3I}>`F6<&$|BAH?L>F|T%`@lJd@|eH`VQoz=?b& zl(&}F)axy?i@Q*|M(^r{0tq`8Jxe{=TwU5d(pK^eby97__7)DxwFKnW2t}hB&23BP z1%igw-iwr_1eh(?ZY=}~lp++Vm!-GjXz&{>6QwSRaGIiiz`x{=w>GD&mcmePGyCJu za-N4~psS%d?m$Uz3OVpz{{Z#O5>(qH(`ol8S3Cs`X!{(!=o_4YQI%&Q5 zWpR(ldrB+9521(By);>AUwQ*(AR@;_}2)x*&Ot4>$mC+j3be1MQ@#c!b^!)+DBq$?Z>rKPhvDi&t%>aR&{xre0{PRcX19>l zmlZ_Zs0`}8NG+6^zESU@J@#xh7b>rjJ+_?zIAL^PGw}g^7BeZkoA|k6wWV;fN_vWR z#_cE(d!=RFqt#?{vBR-*$X0hb{uL+ee@x0GR3;Br24s!Rm;EPfgR|SQ*pX-a`KHOf z-M)FDHT1dpNrL&TN|DBvAnI-ah8ISLVvqY(1zABN|NCMhtp&c1ZkS-8@BqOiUrC$f z_hH+SR}t#+Y4%d<{oXc z_J&wLxg>v^aS#J6mC>-!B3GMQI_*s zX%XtSy7$(WK6hw7IxN_zKIo}Z+?6vr+%vMl(V8< zL|~_9hHZwRD=&l4*mYYw+mc`%DjAR3Z<=6vrKu^3hz0Bc7zcU?xeA9Z-sXFNzsK8P zI>&6vSxZd*KZH`}(GacD_>iY4ugvX2}#oXVhNJb!K@;>;BesM8Dl~ zB=`c=2;IsiBwWqvCOzz#m#^}dSei1X5LRhQX#@Ck%dRUs2roG^1Ra!bJeNGR18)tN z_yrPQhyZL@m#P7x5L@R_a=ljqS5yxS$bpHRCWi&M|M3_L!HFGl1ugNGm3-` z#$LCR66HS0{6Bu0~e}+VSsXVbE6vR16)BAunM3Ja6km)j$ow)<(q` zBk>JTC8(CDZqp<*5vd(&lYTI&0e&>9Go`;mhOaHTM!IDwEHumN>K^I_>LKbXsu}tvDh z^hNYd^kwu3^fmMwbbHJM%u949OfsemrZeUfx;dr>28n5hF=2*dh?p@L6h?wEV&-8M zU>0FEVa{SIV;^H4VeVj_V5(rNW3QkFN;1(r^ilN8@=+31z6|>@>p--m)QYW7d5f!w zuQItd{voyrg@~PrB4O8{WbV1{b*TE*lWvQ?2QAUP!Mp^!3cD4%1-l;`!Oq6c!_M@~ z_bl)%_N?`+^Q`ym^6d5;@*MLV^_=va@|^aZ^_=%y@Lcv>^IZ4b^4#;>_dM}D^St!@ z;Cbu$;E8!)-UKhgTg6+$o9wOQt?RAtZQyO_ZQ^a_ZR~B~ZRJhzrh1Xyw%!ijj@~Zb zuHJ6m?%tl>US1L2fNv2=i=;*}A{`bF# zz>Gj?U}<1hU~OPc;G4jvz=puez_GyIz_!5gz@EVVz^TBUz;}VmfpdXNfro*oflmQM zFfG_J*gBXI>>BJF93C7Mtce>&nT=bDTZY?)ixH0F&f=couHm2L9nrpGe2@Kr?K@7Lg0cVzQH*Pd1W; zWGPugR+5*I=aRkT)#PL31?08lspOgDGvxE+i{uOBljIHLSLCPUH{@I7E9B~#H8Vew zACqC3Ei;>Bj>t^O)RXHuiMVpn%l8vQM!Ou=lWM*r(YU_O5oc zeYAbJooOFpZ)9iLJKOu&yW9D8o?U2fW*6Bd_8hy^F0-$+>+EanYwa`bi|teG)9nTJ zeET={MfOSd4R)iw#2&RTv~RL+vG26Q9k=c0?Nu@xJE}Xb*gx9O+M7H2IO;emJ5JlL z*^?cKjyLwV_6PR8_8s;%j%W58cDe)WpgJfHrNiZLI}DCOht4s;G0GuwXdGTgkt4$) zb?kH;aU6Htacp&*avXGQcWiQ8cg%8ZbgXq0J8nB}I%*WuRQD-(=IC3{s-Ry1si1#B z%<;iNDHu~AEZ`O}3Je9awZjV(1;&E81q%yY1^xnk!SaIX1qB5g3)UB`EI3uLv*2<; zte~y4lC!u%q6Ig6(0A(npw}nWdQZgyY_%u3_-ih9WK7pOXE@y9MA7o!-pJP8^ zr*VE@_vMV|4CgH4{J_cM7&t|owHzsDDQ7ZA#97YS!g;}Y!@16harSVoa*lFv+cJe_(;+^b^++#}cK)p+q8aFcCu>K%5VDx7UVDx5;U=SEI27{5!@X`%*A3Z>i(B1SBdMQ0fFQZSV zucObVZ>2A#FQKoZ&!O+6ucz;!pQPWSAEMu;CuAjNwasdi)g>!Et7TT@tY%r6S%b2A zWDU%cWYMy6v$C?pS>vS+=awtQlEK@A|C0SxTmsX=A#Wg-kCq%q(S2XD(ze zW3FRvVY1!X%w>v|inWUMiVce0ik*t1iX)1XihGKuiu;NeidTx)3b^v6B2oEH@m|qL zSx=d&tfp+KY@uwROjGt%B9)z#eUuqWjB=t9Ot~l}%3P&M+02Hd+$~9`Bv3e|f>L3r zs5GZkTq-G5m1;{Tm0C(2rLNM+rM}WYX|Qx^X{a<@YGDK!9!7*Qk1><6k+F`kjj@J- z_nl;%U|eF{V?1DNvhHCXV4h_jVk(@+YZdDX>pW{8 z>mq9{D{{6!v&UttvzKOvvKM5p&pw^~efAaRn#ld|!|?O)%kcN% zAHpBPpMYyLB2qb$6sZ=e9;p$j8A*=RjWmcfj5LZgi8PILLJd|lVE2>|By`C*$s9?6 zBp?Y%yb_^ABvDB;5~pO5u*`C>%sj>}V_MaxBTPb#mkFtoem@|QqEJ}Qfg4EQoB)mQ0q`zQ|nQOPzBU+ zR3dc%l}%MsA6XVtr%|<319cnqA$2wNB=t0P1NA!fCiOY>EcFicJoPfQDy|4q0C%1smxMlEh{KuzD%`we0Ei^4MEiemsoJQJs&*Pclqc#dVu^-{vP2G% zSY#2Eh;*VJqQfGW$Spc5DirZW9Fbl$O|(F?S+qp7OmtebO0-jSP;^Zc7F`$lL@`m< zoX4U@IgN98IWI&bat7th%)#W)a(d+$;=CsSn%*oFQ<^*yUE$?2`cDXn6g z*d=y|r--MDed03lH1RC)VzJmS_2>B&ex+aS*Z6gQtzYjq`1AcHztwN^JNz!c$M5qO z`ThP9f0_SiQFV4Bb~AP>b{adCjbx{@JF)LtpQ>J|Vya|y9d$i*58e~rQ{FRPHGUJm zLXgOBz=!b*6h z{(XKoUw2{=v3ak?|*HPV8n>A=XBb#GgY&~pkBRFW?Y~5*{ zZ%r5X7WWko7mpHC#3xElmYga%Q*xo?V#ylu5aurN%fbK;TRxSyg}0Blhqs$|n0J(S zl6RJ8kx!RLGI{`w*MQTnlZnx3x5 z>#2ISo~&o-bM*qfL0_PstS{3q(67;-U>;``9bnQ`h)h37N)DJYou$etD{@O>#S?8YoY6_>!<6lYo!~YL+U!| zTI<^DP&%oOq$BIv=rFp`x(T`*-89`)U760Mo35Lso1Y1$^*&e}HGp4vWIj25dMtsSnV zYK2<1mZvpqecDM{i`J_RYRk1VwJWvjv|F|P)I-!L^?3CdHBGHh>(zF3ra9ZpG>@4q zG^@;cX1&>JHkprTZfm-^3qsD2E941H4tYbqkUta%g+j%laHuRaEi^qeCp0&-B(ylR zEVMMVBD6BJI z!o9-1!+pX7!h^zt!^6To!z02Y!=u7u!xO@&FglD2brQ9)D~6-9HR;;1B= z7nMep(JAVXI-;Jbo}pf&BRvmh;PENw0AE$u8Bmg<(Cmf@CBmWdXeMP$jd*b8+fmJ)kO zVTrfISK==Tm6VlCD~Xnrm&_`eT{5p^e#t~9!6|XdoMxxNneQ|@7dm}Tk8`PWhI4^) zj&reds&kR^8|NP9I_FX6O6Ml$D(4F40p~I2TIYS|bLR`^W9Lifac4c(Rp%?`HRpNf z31_0KitCLt$yLo&(^b{g+ST9H(uH(&aW!=fa*c8IaAmmKyL!6@yKJsB*Cdz8WpuGz za@Pcx%;j<6T^v`wi|eAec&@3g6|RM@ldgR(x2wRl%vJ2NyOy|ayOz4vxz@N2xlXyZ zx=y%uxDL85xgNN#yPmijy6d?=xvIIFxl`SJ-2>dc%)`th%p=XUZSM>p4N1mCBf{9g zSk2hcm~0$v>|^X;Y+~$U%rK@Hk;ZgmcjF*qOJk;yY8+`)8z&gEj4Y$fXf(2o3S*uz zV4QDUVBBC_YMfzQXe=-;HcmIrHZC!)HJ&i;G#)lyFijMF zTl073@6SJ+elP&2RFxljcuaK54XR znrTCHZB*%V_(Hy*ZpSPW z=)3AW>O1DUwE9J<*Qos(O18yMNzAwPDNdcS{HRK>Q^+RsBclv zqJc#jMPrMG77Z)H7U7D<70HVO>G$UBX9 zw(x4<#lp*lw+kN@J}n$Hxs3;3d_VFs@-$Mp7+#!IoLpS1xI=O0VyJjfv8CKzUQq5V zca^)#3(F^$d&@sXtC!dO|JZx)_{NHJZ~U}f7FdWWA%xt7l`N~cO0q1gS=B||Dps*A zTaue(OYXg52#^hgge(Ne;w&YNkOqYG5H_TDNFn5=KpN>G2}wvo!oJ@#Iy#oUOLFi1 zecnHQpZ893W}bQ4%slfv&&-h*>5h-y@`+m>y5(!PeB+jfm!G=j^~c_K>|IPzDAJ}M z)@yEk%b-+Jo~Bgemd z{42*FJKk}->-MhOJ-54W58NKU{TH{L_vXeo$KKrY<|mK;==jsepE>^PcneK96fRUiDM@ozv(R}?l|$i6W>4agA-4kc=E)L zPyF)4&rkg9#IH^~b3%GY{T)qr81HDkqwNms9qo7QeiHw`(EnQCe=YF87WiKa?6*Li zx`jGY@xO0VFQNHt~%Ir;(mkF=JVV;*4s$Y|L)_I~yctcIKA?&to%X%5UDxc|U2 z2bvD%50)kVYwcSPQvZ(^n!1r@sEddd@Kw|lN3pF3sMlR`kYcE_s6&VFV`lh2eqoZr zrl6c7^m(|loJ&#m!&Hp_X3YOlIgfmm{eMsNe06vQw8)=aK#U@2vY3*m8VV-)SPRq+o8LyowURGD>VO$B*nC zp_mZ~byv5P`u&k=in@R&%Bbd(e9M;_iels?mntFl)e3mx|FkHnQ>=>m{i#~)d0oYv z_v@<%y#Y@no+do%7va_5n_RWjVXB!riLaI4EjlW*+X2)<9oWHypcdzE$kPui~kkMjSMG55>3 zsq3%sQ0rHCsR!G9RO}f)bqC^vVSF+k27}^K>uu>aX`ve|}v*6>CXR?xzN*cb^)hK6)%o^*)iIE`4{FI;I?= ze)*kY>d5v8W%$e}_3A&5QQn{DsB=2<6m{P?b@8ne)X;K)qI!zd(Z?pKBNtCmN2;db zH#3w(!q0h@y62)fiaR_{QQHfYom-?%&MZ;NL(A03Lo4w4Rph8O(AKH-x(#aX;!R4n zx`JQTwyUUT46mjhJAO6AD6gR|y60MI{NdM7Umrb6eXi-X)CGm> zs4u?%dg>***HO{X4bd(RDXv zKl)bcpzUqcH?Ds>wR-9u)HCLHQhm?eLp}40cTrz{{$5Jo|8B~2-g~HjzT&-95B)ys zcgFWqu_x}M78~!Uo_P2H>aurzfcnm}4^j{R<%85yxerl?AN(-&$WMh^; z7NfS4sQ7jG&4-zOTI)8C*cr(XS!A5hWv|B(8^ zrB6~Dmp(-uKJ+8%$%!9R7t=qX4u9dNlTUr`e3 z*Ho4IH`IlW-%>{|#cw{?pP}lQ-&2P__Xm6}^dIr_1Q8w7OjRZSLV1|ysGINn zD>ZY=->Cb3_jl^p%burh`SL%gKOXoeGUW?YvicPD!y1bIij$@dUuS5}%hLA49DPU2 z0a|&%L7KYmEc)*k9iq>9Rf z-~KB4o+~b=uQ+^!Uj2!L{!^8dKJTe&TI-O}^c^*HI|@uh-Jm z&N{kqvYuwHZJ-Zo8tHFd-b5cZsp)&~($E(k($XB$OwZNmX!=kK{S~{O4!K+DM~4h_ zRmMnf{|A0mT!r7tJ8q$?s5Y9TtTYUUVxzYyJALGcgQoIM`spvb=o6WCdg_fG^t`Q; zKAGvFuQIx6U6qGcyS?;5%15Uj^3#vKE^jm{gXH3=p(n~>GPH2bd7w1-g&q{dmb**mue^Jp7%`A zo{vt`m%Mz2&K#blr5~K5KlS`P-Ft9>cKu|LK63RE{oO;$G_{TI;*PD-Qhcq%)$}@j z7lq&6b8pgBN4Dtgi>{!z@x{H|c~{bxP*>4*>ecj-?W<|~Kd+&Ge#5o2zUMXcZBHGg zuU~&H{i?ICqrdRN^|a?3ucI$Gcmw^r8(vShzWfce^kX;De_DPc{ewG>(Z6~2Ci*{r ze=~ip>rJ%tH@DEX8*ZgJ`E7LZ?{B6hCy&#wAG)1>7KjZMk{W6JN@$HJ7|~gopjaP?xFv9;9c~^j(h2C>APv_toP6l zQtze5obRKn=H5@=_0s$3n#}$5HI4`99)3%y570F8AkEPqq>p^zL-fp-KTIFF=_B;e z#7AlWr5~f;M17pzzVs9H^~WEgAGr6EG_8G@UVGvs{Tb?0^v|Asg#I-5X*%$&&(Mau zKTF?r*XQWD(C6uMZu`my#e(>GUrg?{A7SLtoX*XSxIKjznI%Je90 zXC9;9@{MoMbkjHK`|tS{ZGY(7v{v>w9r)&VXy2nx(ADq!F8$s||C2s;&iClM7Qauw z=e<9me@Xw4zHIwR`ts$c=$d0cqF-_6kLkOf{0aS~BR{2?gFmBRH~%z!MdIhQnfe8N z>fB$_k5a#)C$@i0AEkanf99^=(kkkA^nu!E@J;H!r_Z+kfv&#fkF+%ZEPY`6PxJ*x z{!CwR_g~=e&(SxI{FU~&|3+VR(ckHBS3ggyU;YnzTlG)+*r69_rsouW!BL8#kI)Qv zC&N%2%WPlCG0Zgw7-{Apb0c*YL!Wzyk>c0knG4ThF0h}=yqY@9(3kORf3b2Na|d-k zb9LuSm@iyd#Zb%z%s;pb8S1i&m>)J?%=iz#lwr6_n2&6~jFI1SDf5qWUd}MDyNppv zU%@#*N>qKfolJgZ5sAJ;~d$k6{k?Gl!@YbA%aS zs2c|v%ARJZk7OA9`Hzuw4lxVbVTSta2y>lzlzGX4F^0N6$2|J+JhLqwXQ+b{%=lRa z#=c!-T+}3Uq-TnuLetEnjv3}~%`8)O^&C_6>UoB~V1ZFGi_9VW5~HS;nY-*O*rQd( zPOUN2k#&Z8=?3$YcW*M=nk}aN-Yb~TJ+jTnK6fQ^(R;39xb0Un)O}YokFnP~tobd#6=MV3Io;#UO z+3#Ymci+v>p|>*I?Azd{yuIGeaG`fF11I0fJi2`kQ+4ONm~(EumpStBcQfw~yoZr| z_q|NjtKP?Cxc4&`zxqDLee{0j@pnAHn4kCnW1D}F`Gn$w%!21b%=gdxFmutdk1%x? zf0ViF`j0V-jUQ)>k9~qUTm29d3Vo6}bo60{8b8T=%kwG5%RItV*+0!(vi%umFEJf&{W9~^OTWTgPkohP4}XoBdimEG>c@{VnwiI# zgWKO=-hRn98Pz@C!n(fAY+w2~^PaWuFzz2c!JMW2F7x;Y|C9NJ_Iu15)8A+A3jKij z*^wVI)W(y{cGXkN_S}z{>)!HX=3eS2%;nCXGSc&Z#%P$Q8R~+cGdFX;K#cwpd-^M; ziuyHEmHG|iVt>ng;UB+a-hS6J%=UrbGtF230e1T%vrRqA9GdzQb*w&YVp>&m8^OKj07lgrD-|1?I8WoMQSV6#Ml3G@I2h>>>U)tPXLk z{gDIg_?-t?>K$jX$r}!_TJPEH?7%tfIk9uuJC7e`6AkCF2khsw@9@5al^m&J?^j>I ze$I9wdm()h`$*Nr>^bt6vP12cuvdj%#%|wsDU0uVXHRmMvDB5XVA&&Na8&=nUTSzH zOEIrv-|>gbSzY@P_WU^sdv}YJed<^>OJ6Btsk3X?l26FlYmS!X_*TJEb|t$lqExKi zE_Pl7sKwgq*wWg|EcGl$HL%ptM)uUhP3$v2SF@*1Y1oHPY1wC=g$Ltd26WAGpTE9_%u+mpCmf)6>RQ{nW}H+qSU>K4531Jq}iVrIQ_Yy4Z6s zZD-dF9qgYk>STX*Ru}uLcez==#lv2Fz{^qxeMriF_Pdt_SocFgw)J=2>@9x^vFVvG zdvYtnKJajqO}F&0?N7(pbVr<}ZcMP9jwEY;WiM+!*vH;A)X!e@LW(_b%>c_72U+)l zG<)c9hVABmL6FL_M|DH&rO9D-Sv|tO^oddS{D;Qa=Y2W$#_RGdb}_w%y7eI_oyp?tC*_MIUD`4&Kh*x4pwsm%fFq`s@kz zO6Crhx#~_`x$6V$4T=ZZ_ryNPHab7V9{a+F+3n~@ z*rUuxS)=`9Ya2#Y);AVJYXQ*+blC*!-c- zvInWpvD}59XEo|Cus1SaWUc*QVy}7X%dB4Y6}G+VtL(+fud!EEeVrY1KFaD|{TOSZ zzrnsD`c0POzQvw*{Is%Q`CZuYKe4{=vEH&PllJ@UU!ME{+tu?! zHh=U<_7L?Hd!+%BYTQ^mVM;HKe0!+KeGo9{{?&b94ouz zuh`2gp1u+#ofJq0e3;@ zLXNuaB96m%;ZpYfgQlvBeU-qzv**UY(J&~ev{v~bqP_1tqmY31%T z8Mw0!8@a)zfoKt(6XQP1>pr>^MZt~k}tJ@=s$cd&hc+xo~L z_h)mO(;Urkx4bON{fQdlGVdDZ-gwanw@r<5p1CpZ*+1qu8I|Yg*Nk&ta87XF{7Hdx zhl(5}o8%6-_#vh^zjvBbFf&}TYL+{qoZ~K`=ee`*S->8Z%OZEuy2Rzn-7~h!So;ch z>cgwt_x`!YJx6%fVWSPM@$;M9HnIN}M;*C>!^>WU?XKk1)K%O)r(VrH_u$psv+uoz zJH=kh9eL6HI@92<;i%sq<(@zFTJE{GT*rO=pVxB_)34(`{n8sa#ig(3&bjgpobw+1 zhU__Sk3JMV!%zKg3Gzn81}@w>STKl&c-?bp7Sqx#;*QTg|CuVwDz4%~P@w>|Ly;^6~a z>Eq4^q4$H_-!A_UN4@^T*oXhWmyaNhK8l$77@m*g`2?Pa5GVg`U7zIY{vFF6dS1eJ zixLHCcS*w%JHaTbcX2NcIrd58?*mGyvXWn^lq*fZ)GKR6yjs~Pz)r~Plv?zRB2^+n zm3sEVHT!rJ`}%viDN6Nk=sbVJzu?jQ3)=2j)!?eb(}brPPYWJBo>n{tJf{~q)?c&F zh7!3{UM-i&YvgjdLavmnDa-Fg%2FAvCr@@{!Z9tM9z9+mgVWAeB>Ay4j;S12mA?S~}_siImT zQ`9Kr3Z+7&s8!S{>J<%&Mn#iCt ztcWP^CBKT8BCbd(dKG<&enm<#pcqu76&XcVF{Bt)j3`DGV~U(2uNYTMC<=y(d@G`cKkF9MHPVKe{*724-c*G>yPd0@8vG{ zCeOe%E1i?hOBbYz(k1D#bVa%72mb;*WgO|p3g$uh^@*1LzZ3%$-g7@pft zFiFWE+HR2=1k^6+ka#3+NrYgdB8{RllC;Dn@l{|F74YsH;sQ1%w7rrZ0;MDar}6hm z@D6)g37-MSGX-7*Pf?*4rBGC_v`^YEO-To&gVHp9F(oS<5^Y;KbceK4+J)a$@kqT= zAAVsaAjN;iEDcG+(ug!F#ecRZjY|{Kq*No-N}KUpD=ktzew)Q0HA+oVv($p$W3ftY zQoGb4bxK{*c5w`uszxPODO5_8N>!_>Q`M^)RE?@8m0G1yX;sZCovKBpSGB4PDx=Dz zGOH}AHkDOnQ`uDxl~d(XwW~T*ovJRCTjf!CRX&wp6;K6L_|KwMVO2yGRrRQ1s<!DOeL$8)ye8*4YEdAlT0ns z$h5L%nNHRs)5}_A2ANT2l9^=|S)0r%v&rl-hs-H+$=YQdvQAl-%q{cCyfUB6FAKsvJ}1lzHX&o|AJ_Iws9Y^U`tYgtQ)6 zkF#5vG;0e{+)tA8&G;qPM5IfRwBwb0rfXf(66w*^>1{q$vLsat4Q-C@FwSOA18_?Q zYdAF=iu2TLE6x-h@{EI`ETH8BvX2WBHh`I;l3t5%Ys3puH=s3YFyAlGD9Q0TZ~) zZ8fG$WKEkf>9Ll{Zk1IQa6lhl5?!;sh<-e!;&YD+bL@*~y za<*-}4XbrWVK<6OV*YV$DB<(2`}{Gz!6U4|%1u(r+ovAP9R5U}v0o=7qg4Q7CF9=^&cMgEq@XYfbBbuvVVl7w?Ep zo3rLwGJlCj9jwC~=h5?dmXZnQGQn$ttE9y~YVFvwYOH)*O;Ka8N6|x39X?pqCll=f ztGDpl>qyN*d@%=j{2KE=x--rlnfxU-Ci?{{OUW-?NENFebbrrtp5w$HP;8TIpsJpcU zbJ;C^k$V?s>1Yw80)*PtThqKH*cvl}tte{4UglpBti<=1;N?NcboWYiAtIY5v037E zRB-Z`aBmB|{J&CW#oWbnM}#?d2zg__hIntIs5jQz)0+_ZDXJe4rK(uJqQY*wTB7)l ziBhjul;r!PXUvXexs<&O{rB5deRa~?gE;Dmhenzc*mrmLkP$lzs}BhoDneq)6`1Os z5oXm4e`^sUjUQ7+e6K)eSx0K0y3V-j7y`e=u7$p&(HC0LjC7{0BQ0)t$4Yq2GDu>( z%`(=TBiX2rWQra`8_|%}_F`V8q9!xRx}<$+&~%8W4XcV|5oA1QukM3&dt|7~Wxcna z%&*Y8s@dorZC=6*mu#BIh`q$otl#S0B&#u#x#Rr+J7P&lpu>pWoomUHJzhjUj#YS4 zS^og2n`FKQixv@2QPZR@(~Hn;g~kS(&&=bzu$ZSmftecv7WGo|vf10;gxoXIqi>mS zi6=v3&GFVyR|2+ZB0g{KPZGQMLybfSG!{aRMaNuE%%H=Z7D-%N1&<2}_UP?cw&bZXq1qs%=@ zXk!%|JVg%stKCJl+!(dY2HX0hWVd)qlYT8;-_hG% zy?jF*!LIhgM@nTJKI9uLpe_}4vdOH$z9yQ3#2R5D+1xgb8JS6*3JF&73BDNKXSI@^ zn$DH3HgYybk|UUZBW$3+?B(Fz^yGpma{)Wams)cJW~0`OBy0(s&MgbhZn9n#tksHV zRHIE>VoF=RGnUlggzZW81QAJyAv;<`YO>KKiB<#FS#<6&I3}%nXv~U{Izp_bfG5xC zH~edMUTPV&F`Nx|?VJ4|*`rZVXAwEbRG>Ey8)UmZfW1i06# zZ^%oK*m4JnW?m<5a?vrZ+7gb|`E-I6rKBB&l_c(zcSJLT6@&#Z?dabs#h0zaIAWcI z7wXe3X>&Z()*ExHtMwk6(%+nJ^+w=V-AR3p??9RYkw;|nudD@-E^bBmsmrblO?eGVdBY{>2q}qwD*;bD_uJ6Ho z>rI>f9-GFufQVJbJ3t)@Hp9w@uV4$jtSdMJ8)mUHZN$^RJFw%H zbX(e*Hh0+4&a|e-1)8ZVNp_g$fEB^x1-2Vc3ipP+#gpz!>%rY+3Z~uZL1MXrXTh{V zvU&n5>4aPWPg0D1c`ShW`K@hHJM1z7on2|GQDNgXZ#aBuKe$79%B4R&iXQ(RBA&!> zdL&&KRYW4dsBFk_@DaDIN8t98NEtxSi&H@@rkEQcz9rmtVat3|JM7qzTbhMKw8MLjCv0#(f6eM0xY#QInoiH8+b}cS0ttQrbv63^ zUS&{`sl|@UGdvX@oFNUWE%5XPHc+qO3EA2a;eL{rR??D+8Ek@DD(m?8sSLxbMA%K@ zL(-}DXzh!H+lqZ`Pp+nyh#kr@)frg^uj7aw!AUQq5z&Z^b`!X2bS;#D>Ngn9Vv6tVZ$?*EWSIUA+k#w%J6VMzDXiYpbV*b9HJ-# zFUG@{<<9zKp=T`P5l&V_R)!EzIS|XGlFQ^XWw_jqXNLFTY^I!WFPYd!Da(}GRUy*K z{c>B#l%Z1V6!Jc@X~k`PFAwhdd;GRUEoS(3lGF=b?XcujCTZ3u=OWXY4!pJW>3Mp& z%x2)5@Hw2U_OOn$!5QHAGMDk==7qR3S_1PK9zy=_T*$z`AR%`zWflSdyRuAp9K!oj zjcDz@oS=uei;Ct%8@zhBavCjAvNPNFz6nn+zGXQvqv9qMoNYi%v& zl|g`hJQ2&UC3xp;`7*> zMV3OGiP$v(+UU=8teSbgYS3}3LhTZ~Jgm15@HpgYV5NkP97FC%u)VNmg@A{z08*u7 z8eYOr_L+y^c@;aB7Ec$aXtNU6-dZVYE#cRE^Mw+WB3WaL)QDkWt~_mBj3&NUTcKgf zUsuuNsb?xt*rW;Hr-&R6zgri4xZyNOug6#sk!@X#0tdd$kYvM3-F5A;f4R;wZ;!Y$ zeZ+pa<%^gyPpORycQJPsTcf?Ng9V;lWMIhHnn07D;?tH10u7Tf*;!oJW+! zXz;rMvPS2=7~(aQOJheJGJzkvIBwY#Jjo^4b9FT5UK`!S{4@!xA&a`!e)OWeXqfC&&sNtsA48qt%2m(5@t{LgeGQU63E_ zg?SGK2;I3AC~VFsJzZV1zaBEU$v1JEcI1RIR>}X;D z9D`#CTL`y{cw$U9?duzJC4&hmY~M{RpB}SXoW}k!1<3(YQ#WF;PPlm%yiW0^wa2Z>&S9*AqN0RvqpRRAwhfSMW%4>Y zi=!42V>ls%l}(B(TEOh>fe!5UG;r<}%3SS+3K`z`3stM;x#v5DD@FTBf93AVp z8*3b^nc;YowmsfYGDPL9R&e$JY6T#E=11p9o?Spag7FqBZe_gIrWPAwcS*>_>SAf67pup>H*VCx?iOc$G&edf$RU4W zK75(T2C=7&7-^K`AFsB6U7XWQcJNeJOpSd`39&VRwjXlFW}lFSRs+kiL16XPO?Xi{ zn=)mxTC>NQ6(ow#-A1f71dOYtt7Di@Mg%%?H1zM5QQ#ZMJjSxpJrSG(#VN*2J{zm> z@b*wMk;u;!x2B zKOGt+IJ>Y{QzU+-2+oC7Et$rL23woW^?sjkWM~ZE_+KD2e5yg(g`vfsc>*=Sl4~(% zhh58$I1Sv~P?N(#?k19!RY6K)nH}m08G9Co;>INb7p=(BGXjp+kxED=`E~`kn#rx9 zu#k0l9A8=-$lt_1ajayR_?$#|uaZwz6Im&#dG5GbF}Z*h;TAqQXj;}whPC=xzXCoh z?Us-kM4$yXf1G`5L+eAELmNY}b}8)V5cWkMlzpjxK+5@A=84h53{Kz7RM;V zwSeS!=7OC>gN4l1g;RWuSXnu_5vl=w(FJc9Zi26A(c_Dg+|KKVZK5ZX@bL03wZKzr zohBYvqRb0^k|&=`G=WEhN73DgS`{1+s620>Wz-tc2C&~oP2F%Mm$0{csxDTQ@AV zmpDu!Z>j%cwE-5}Til33Go(8(*JW}u8x`(nZ58>Sm#Gu?f74mk(Qj@fJ6-PMUyz6~ zXn|J!KI$&tUTB(RhvkadSx;M0gE;=KtZi6jsweoi)A)HV`yQ-b@UTX*MCh9 zF9wI_%*u&2klzhi)1B3a_p3*0JJf(bl@^ z8-lHK!YSbP@V`!gi1vmCJG5)W{=UvG^_(s$oFbtBug9=&ANxsP)}_P!LuC&SDm~L- zSw~K-Z|)#+Luy`XiQF*Oh?VAH^GGbzY$5T8C>5h%)*2?e|QK8|*zegY)Y4jtsJ33|TB?O$LIPQ+FUf7_wRuvB6MmfXs1-#6-1o2CHa^ z8tsw}xptOVO=)*|6N4L=tr{8{+$vmTDgHnHEDB7-VNe(W?S}jqsw=zg;JBnntk#R9TZVsYn@V&l4Inh%T zwBda_n8J!R0lA&0x53u^gPm%fDe9ST&x>y&dUE>k9OdG-&tO%v7PGlkuh>CuW`<4EVS3j?*FRwhq~F zj_BkiOC<_RwD}F#%P4dwZJmL>Z~?0y85|hQLC+RhyV^NKW?_#jFxCQAl1G1z;7WQX z0nd_tM)34(VtO#|%EJ1i!pf}}zp_k$zc3g>hEoXk=BafytCepfWUV|j4!%Zs#UR=V zJf&i@Bhm-wwc`c_iBpHjk8^8qh49sBWkmCYPQK?Yd1){V%MT-0EDx@U8dn9#i8*K0 zQx$Wqd1f@m*ex%?DMEn-ULu4zz}_SOxrr`BXQ7Q`9zXn03me8YO2MWPgOu1N zDV~#tf=-ay#F#GFXPt~Rk4*ZnO1p3ysEf@DS-H8G#;7gDl2j{3=*HMX9=wfZC9u{T9Sblc(cPbC;D?3cIfgVI}-l( ziLQxGL6Voq!83ZuP1*-+u;Se3scUUPvZHAb9}5=Lxi^rWAnvMA`$l$SS(B^Rx%@=79o8en)32BUz$2vhzFK> zJt9Y`&)3n3H1XaN#w4C1h(E!f@D3?vy4V>s;Qa~X#U~Q@C-=L0OHh*V_wJE0WA1BR zt&t6Q9^M{6OOYtwK+az28S_tx`%%*2>|?Y?NwS6ybF}6yWM|EJ zSk@j5wQEOp@G11*$0SBeIy#`OEx+PT85aE|jLy!tQ(;@)Nw_WW>jq5<*`RI01xzO% zAEEGken1}IDE6z4M2C@N7YDG*SesYmTN3;O@52~9?q~-^kF2w9l*ioySH?Srwc63^ z$akSOb`8UJ9zX-O2;oVfj^$I9Zc9Ju^D`)yL16mwYvTTw@qC+9H@Eu@L!DN4)?LDP z=X>&TNX#0O`9&|V9VWd=vMQ%7kY9!UR~)ma<@PlA9Nu2S&Fhw7eG?jU zESL}F)%qy#19^iT_P`!0$w`swTtvTI#s$gheHm;nKYoj8E3`!}-yCOG_@_ z(N)M#=GASDkX$*9cM%wMVCghG@)Dvv4}7a@rXqSvqbvyg%R*Z%-gGNx5g{InOykM~ z$LwXwJZv`LZz0yn!iMu_7#q=neOlc^8H9I@BCeLju@=a@l2{ksmcTzwrf#piM<}<1OQ@0)Lm#mS)mv?;w3Osm{ zIm!wyn;`EX?JPM<^zM?jHi5?XoE311>H?-2j~_1&RDtOx zutU75mPd_L@bI|aaW{59T7jJr&g4J^t}M;B%fwrDF>%7zCvfY8)1yH=*>^c(;7N`5 zSLhwAfJ=Pg(=Y?Tq{qGF%^b1Q71Zg?_E2?^=Wnfu+}&~T<+ehRfvcw2FPy4VLd4>o zgh(rjwTJ=(u~D96(Xw1+t0cUY7-M`h=F_!lM}j$`IV;|eD!Iz=B4X0+OA8)`42$1+ zn+T6$RjaxY)Xm``ZwS7V7gs(uo+EIxkoU*OCqx?F(<&p0k%M^N zsTSDGibTd;2kCuyBveO`x#L?jQDi>%-fJk;bb z;c9SmQQ+Z=QfTEuTf*WbD%2HfD{%FIyS**RS&UWVTIp;kcrl~KLQ_FqhzSw2hE`J; z!j3hATV`4eYt-6;PS8@@;&$diYeB!!mmcOvvWvdZ-^=$Ufrj|J5EYr;VPpf7X^3$0 zRIF6++sts62R9F4UAk~~c*5OeY-me1_mdlpU07)zzqh+kvHuOgH)F3SptC^q_K{4B z6QZ+^tRmgzjl`j2WVi_WoX0`pDMxsRJ4Z>|JUK>Men!oh$C%*fEjVe+F1+avw{^%I zz0L&uW^!0=Zh)m`hWp4n*!u9|a8%3~q1FH_5R6A-4x=uX4D%ZKVhk+_R;YFBprsF5 z`7%Yu-58!8R<2X#4yASjexD(EN}51^vab@pwc*WSm46wmxow!87GGfxaO|iNDS~6Y&S;s#3tmth{&-k$3r24555Ss%sU#W6>M8= zhwryV3BSAIgIAc>w}W@CHAkm@i|X)ML*giEjT2vgiomToP{1fq3soYGlnh2&~W9ZVw?U z7d2YZb4of&bx_cZ+qF1ancgIv$63-YR?t<#EwX4I2v1eu%aX|J?In0pq%MstjBG(} z0GJs(Td;9E*{@lVrzEo`X1`LuFj5pa=Frx`e@-txA@geBttMf16M~eN>`7Th@7FY! z;C0aF1)epun|L;aewjNc@S2*J31xL;Wuz#KRpzN|+wA3DzQRMKqh;*gww>IjWrSM2 zhew99sb&vGvZn|8jVx&PYAg4Y;8cyu_wkphIPphoLF*NEcNbqb+OSWieqVo=cNc0B zcpCo;yodziqw0Ujt9eoCj5%AJL6+!jiI5z|&tlv$1xvRJpKEp^LgGD9t+iO5p<|*1 zH97UV5|j}9ONYJHy3IB_;q{SQoUP~(CCeIi+m7Ox)#mT(uwb-K@NEe@&|Xx=h7n25 zqTVq~JjPWt_+0iae_1vHA9Vi<&10sh9k&cJ2YgB+%n%tG`LVe*=IJU9Va0y`W}6$Q zu1d@#CH><#sR|teOzr^Xad%r!*idoCc*tD5sO@GS>Y<`Z)B7Tl#?#(|{l&3xKwOPk zya()#whM(tz9^soRxv8xv3I%3P&as5$!Su;n6TT!#aJvPYC+5jR*DpZA{IYlLB&YV zRw0cutHM$#;f9CYDcZMRn0vgqSdmwX-ab)tX&${o-%293Jlh1YNr5u5PlD&MoY68} z75OMt%!qR-YvtR1QQI`UdqC{*w9bCM-d_gy@KjRkHI==82dB@dCj+b;v1J#$%u;9+ zEU{oU7@8t+^(y?oISJe1Y#Sgq$la0ZJI4g>&JH8at5PuukeRf0*r6KQ=Mb;jcDx<5 z2kj-k`3VR5)8hWjOe~O?-XJ?&E!Jn4g>8w9m!j$XT?5u4j8xhXeR&fvJvvZKyKrAi@ zI^glhieVvxfrix%m^$}F-C}l`aNG5cZl!lAyAs=ou4Ff|s|352ovz$~lb&oyMcO)n<_S&4m9Bd95+tS?34WU7 zl+1X;P_4j+6WZKdarTwRDz|FF*MvGdUdCxe*)m3Z8m2^P9+LQB@fV?%cv>o`TO{Va zPJD8V{aGY8`b>`J%aWRh9HQkXz{i&nLK_x2c-$CdTgVM{DA#I^!vGQ!w`;S* zCFBGiGug%0e5u}}tAsmKEeBr>9z}lHw33qnnsL|e$>DpYR7CHnaM$H&TVW-^mHBGX zYsfdERtTQnB+%8Qtw*gBFlCu?TL--6G+Ikun{Pf1Tb3!et@}9i`}#azH|AYGgZbf6 zcTT8nZhUG+yt1qXXJk+#<{vE}Tc=03xs-XDMS2e2w70AdV0ECk;L(eGUV}Ql2&>K@ zda$Pz_FX5iD=LRa$PJA%PGl;>=(OJxO;{#C%OQh>+Q(5hPBoBQ*C6)3X{tP`irja! zq_3IEA#16pTE$%5E&9fSBiP?OHBaKPEX%h&&b)9Ft>1V5&_QQ`XovrqTf`CZ#zedi z>m#^EF;foBmNe(Rcq@(c!N&b~QZt?KgGob>#Q7jFnvQ{)S)4bS8NYf$l*Ud((x5i! z@~vYtqchc=*_ojk7qR{D41R(OrQaX1YK8ktekM0FG9y9EOXG%UtF<0`iBFWEp;VSJ zfVfG0XK?$X}By`YPABTS>!0wr%Akb z!3z`WUUdmOiBqN>n4UJTSwYr2NZ!$v1XhAeMW88S^;!a#^_APYGhk(8e@5dYn8oO6 zGvOuY$vM!E69wmXJP#jl0z5|E_Z?GabxSN5&R9Y?8&`0D?=m=A{3H&f#L{>xC-S^B z-We+Vx`eT{OW`fWNg22_!a0!Xo}T2XLFh>lUy=}AlLR|6IXh_qw+^FC5ll%_WxX&t zCsM{@X>iXA{Ux;3vFdP%dl9`*#r&2h7i>lA3b4!Yj(&lwBe8^d*bp?V3+?WBtCMS| z;Wj7b;zL=wT_wmxR*kb_%9O00k_%QFcg=|r!t*Jn zWK%|RKT%FC3#a*hP4J7UTFBQ8@|0%mb|+4)#kdE)q!rG^I-AL!+a~RR+68THw4IZ|$voEO zA-JwdD{04xzk*6)VcZkxaZEZVU6UQ4uG*1FgcafMA&ATnk>N)T1M=eO#8oP&6&)J|JCwthaL1qxf zEd+)@jZH=;69lt{UJ_6*o)jKGc=wj2jwwsuq{TlW`eQ$lBn67~KvLvUk>dD6}nr;5|X>cp&P z%C`W_9KnvmAC`(5QJWomy+|m#+RQCWSo?AXcDZ+*tl#Wh5wWWxR9*2|?XH$Jk-m#7 zLF+F<*{HxzMjMj_JKoH?{K)IWA^dbFWeV`}VKUkVd}tbZB#wCIOQ)?svgjgW8{Srt zQ4xvcW{nk1N0GgfU6Y7RH{@2pyM$-c+_@*K!FS1OJCQFk#0w;_+Q#%c(Y;D)eiT2X zdOT_&hw+##LK`GL>JetP3EU*nA6w#iUc9(T1S3b|l$7AHw)9yxF#hNs`#J^R-K(b> z{N+-pm{AEQ7pO|C+-9BX($BWe#)L>g#?l#P&9H4xR|7JWaTb=wQ!3rCF<)enZn7Tp zY`9IWYZFeElrD@pr)_N_|C-GL*e3L?vv!e!H@^zFq_tFUiEqf2SlHo=_%)KHt(a-4 zn5;&tlk}umQB$C0&nRi^q)%Vw-EC*%u6e%KjyfRNw{yM=J+B(s2CZj)R$5}=5H?U|3xuj5{A)8Otf@15@hM~KkEsAB>bMg%mB$lJsU<06*V z)`y-Sj~kLxZ7D*Nwa(bK;#%y`3^HCCIWh@+@4Nw-VSsQ9qRtYC*Ri*x34VBfh_wBv zCt#=PX81P2sIbFxV#Y5J+^z;2xe1O4*aqzu{Bc)jN zp3l#33Ytf{d7U!?Pfloe$C(o`4T)MYJI#yOSwPB)8^(ZPk-GPmkx9Ebw)?R4;f)&XDfGmZ_yy zwuffb$`@+(V0O71#hrntxw5^x6zrefzYrF3TP2={`}e)w1sAGGGj)TA5SjQl9BZgS9p{uO4(~+v;+ixJ}mQ z#>^`QS-2sWbFNsuZOwtkTvKk!ItokXd?CNzqRuHT%OMTMUI}S)%{iw|mutywdFq21 zS8L9pnQg|WA~|EOKVgsI>&Kj?ggIx)wdE!(qb{f2nzQ9phzonpk<;fwdMEU_a_u>j zd9bC^nbCCQT6#KjHiJ9Yl`CQup4^JooAc%Txj-(M>&}I8is+&*oQve5xt^TI6U)VO ziCi+*oAb2w<*bPB1Wp9azI(9^c>BELwCLw|VbHij?k4%923|ktY@Nb8p17k%^bAum zoGayGo{Gn&h5dAqh-;gg!MSDuXQ^04$W9=e*e`R;g~5;9ZLhfNWGik8ITE*>3+Yf7 z{Ggx2iixbrz0bcq3tnJ+71*`jEuv|5bS8>S0E$0Y8aLZq9$$xZb_zG7Y=vCDdx-S> znAdLUX&KRt2wcMpqXZfgrE-9@CL64i7jY%ohSo{w=Sy9r+m6-Rstf6udxD@)&Cjmr zt4UM`;JG=>CqKJx7@uu7b@W7twI_h%O95?>z>~96v(vM)voo`?Jy~TA)HU1_7G@hG zU4vetHHEcGaSlt#8Mx5CNHi>w8aD^WxDzPP4JE@uEp^R@3_Hg);$lgQP$+TTkaXNrf;JIXovLX0Xmp*B*7lPPFTS4CJ zG1dXM(CQVuGH0>2c7ngFU{rS_`*svIvD0p%!9(gGIGu&|!jdNu55%;g?t&p00!0an zluNTFQmFBld!-g%eh;p2A>9!y$h@(_I@yUe#0B1~lfzi2x8N)I3xPtsU?1xRZ{FsP zBnqiQ(U3&XgzTKe8d@PYP)Lcl-FgxyumZ8$lG8}m-dE@^WO^n#d)m_lMaLq}M-5Jv z5$Nd7c0YrRu3D61ET_87HzYzkGz~zyp5E!%wxS{;8EKRk(?mYWN3hne8Jo` zPx1inScQT>$&GN4^v6X$qoKEZw0*iTQ|R-%19Py&l1RfF z8(=NgSt=Qfy<9PWQ_ z&UCN_YwrdeApJ;ctgQ~WWJAiA3Z|^7NNb0>D`gEiQcB!OEv0K zOX?7*8-h->u9Q3FN%d&MsTfw<+S8v(r{w-IP;#ym;d9t}(XOfW#?e$1P*O0A}J$cnx0oOvs?nW~FQ2C4^Y24*9& z0r`MpKt*jV`5n#w}4-5SiD_V)>V`&O`cUc$6uq6JJLgZ`S@zqGoaF6;%qZD@LsK`oK`uV z(h*~4v#yD#$J3vj9P4+h;-6_RO>Js9C43{ECcNP|!^QquizhFtY_#I@S$kowm1^Ma zWG_>)8?2lz;Vv4p&?;$V-BLNvireK4ei>_dNS?E$gng&W z+HI{R7P%}5Z0F_sF8BXdvygvydiy0(G)-zv4Eeu0dzqUtgLg*TWn9*>$`zHXn9OZ( z^rVn)Gc<4>{inx|^|rZ(>^=3iYV`}$9TbT19`nZsgycELA4cB9QYSTX`rzrqty)u4 zoIF|*V&ch*iP$L-(As?h&$84GY6NSKqee=n zwUVtni1%!#wPcUOoBE87O^cq8W!-xtnu15E^IzXezq~SbUa-uL)sBp&evGxvu!uWx zPV&g6xTaA}v-6S*Vw*TIN}Adp+`wAN)9O>(^O|&(a}xu zP2-!!Qj%nqW;JCrWm>V^rnIIM{}vPcq3mxtPc&Il$y=H=gEvlgQ)W`M^+ZZ<%4sTW zDzj>rTP<6(WHwDhMw(}BRoqk>*i#ddsJ-O*^CmSd<$G05p4h|`3QZ;c+^J1t{8tT0 znWyGLuFmX)a)0TRCQnmkQ-zh9=Fj8#Ra8VghvODZ8pM&SNmX!P&a`TbNSWU>o!BfZ z#q-P`@+7umbF6i(wXXA*&9K7RP4)h?bM8Y+YMPp3CDla9kiavs*O$(YD{AKf+`Y+;H2uMrTdNC!Qkf+dcf6abY zsnoNVCDy;wNlCcUsySfMphbPDyTZTS5aNRa+g4il+i)u#9mwSwi5e;sQCcjk6>Ku4-bSd@0&na7hZ}J9!D@%+8Jv!nTU6x!oi%Ikr zCdEq41u^Lhc?RWVjN~5TTlM4ZnL&=dl=}Z|lA5qEWpO4YLrb${i|EwFlAC6&SMZH0 z0?*sg{%7m#kTaa=*EVIFY_?w%b_GYr@ci=Ye|-c0Or$t!+Dl#_mL6MV>Acb9Iac1p zK*=P3tc88gDt4F3mg$R=Lhj29>umEE7A&kDUue}X4Qy>6r)*&nIYl|M{NJWJZAFrl zl#n~wU$?}{vFppaB4i(B{BKr9PYubLvaooeCnR0&kIxUBS8je~pnPnNz29l%Ob_G+ zkA*~L<<^8~%b}&6#V0IY6!Na*dDQOy+uOq|f6Z1TnZd<88LV_{$S)P#YWbK7u1{^! z)bx_vx%DY2&Ex9o>+9#$qwCi%sBftE)@S+8VtKQ@)k?xuu)?3_9;HU_mVVq-_R^=t z4&DARcD_>*8I~4>=G1d1bbaaT-+Sm5$zlJ+&=MyeJK2e~AFe8y7LYZZ8W|DqSSLR+ zO!40hk@U}})1tMUK#WR4jWKPIstyWg1po&lb+iRsw`Ju4}VE2=Aw zFUlIj({k+W(StmLJ=sM=JPQiF@fAFO3oyT!o0Fc526P-q_KeF|y6rX_LGqV?B!|jq^+{sTn=q6PH(*m*Sb1)lin|iJOobpXQmEFll_c zC&M!=Z-S>aF4L2iI=Vc|lgPELFOJE`_NKgTvS)N*zv89QWu75f<(}5Dz0;?7rg~PUCrtEsDm>#-$}^{VDm|mJ zrh8_1vLpWKay=LLB@1Mh_$53~mRir0>X7G~ebti!ck|3Jd23O@_`n|QnkmWsO6{1l zo;u5kEp8qh(_}rVogB0(YtOCz{TC&-5Q~j?vo7_QF7b!Ktvia1im9KR%s)CNDKoaQ zG{0b4bl&9V(Ya*_3DFbdGiSvlC#@)(mDD?7*%(iKMg7u=i;||*FCR5By(nQya%KJE z(&_bOV`hw=Q9nI3F>OX^Zu!jmS@pB)tLm%kr{|1J%!se4ug}fT$+!N~Q>&^b)YiwP z&?Znmr+#SpitLgp`BSEI6_%D}M!$ zSXXv5>vTwi2Wd9bneZQOn*3|xzdWwvewg^XE)an ztG13bz9uoQx_NH1J8)dy49#==TiRzjE-dAoy@VMtvL0`hPl%h%zhHiI9jWqo{)L3~ zAzRL~;+|3DmdaMNTa&Xia1Ypd-sXk=Z5l(im9i$%iz4#uZDhS5XR!4oSZ>`%)f_)` z$qD&(q4|;V{=5T2m$;FuO6MmnMM_#wH@Li^t}Jaq_UvSDU1QzCx>;pSb&Kkn>lW9w z)V0>l%34x4rF3cCB;Je5>Xz3Pj9pPTFmYV!%DUK?($URHtLk`P*7vD**DpyJ#(gn6 zchbxerDF>cCiktMKDl3gYT+2pKWo%f>x%LpPjSwpHf9cabN%`JS4Pea-2184+h>Nq zEGN~=)urViYYO+%(#*snB%P#Y{~akM!^qDoUBNk~)x;&FTU#fMu9{3c=-Bwuev^i# zPPKlI7Oq!jO-4;NHF9gRY6{}A`5&){n?Sn7dNbx&+tM1BJ|V`<_mL&R`se56=jY|- zmQ0*jlUGw~Y1+Mu66g{^0*1u=#LmloI5 zC)j(OS)^d&XW${FLA=W~9K6iva z99}WBA}!fITHoL@s~F9tHuUu z+I#JIox|^9FQfe1jI4<3VCw|(<0HxvBhs?3Br7l3S{IZoTil$LUOs!mip47zFX!!$ z8IZfYmIhQ}-EaA&gRSR8pXT1p1Cv)RF5@nerEha_3QsM*@8JA?&FV~1>7g)qlPpOx9SaR9?@K69o61S)}A zM>og#_bDl^rIi}lJgPY^ke|>TABZOgVs`!DI)`7cv?QPZtT$y!S#?#I=oirsmzwn%d^@k&u%BLqrK#GP&c=O{I>g<*lx|dc5``Rw6@(tXF2&D z><2lZosx`(2@RPI^CtI=&u++S$Z5!J=$Dn(FcEzwI-w;lzoCHGB*;uGY$$3dZm5VK zKC+}NGb1jBK`RZV4dY8EXDuH$b<)VBvWCeGQyR(}`c0VH;At41RnagaYg)sA*vf|K z4Ko^MHq2_MFRyB-ZkRG=c0*ptvWY`uYf@_(`ezM8CarCl(=fN8uA#nRUc-EjwxFS* z!Ar<}(y*|hsbO)$B2vu_!}3$pS{hm#mNfL9ytH9t!Lo+s>c7Al{(bBtYAsraPKhhvXM)YMtGyW zRfRF$SZ{5@_`;FiQQkQ3!t9w7}yanEDZ;m(Do0hfEn;)M?-b8P{ zH#2@*`Xu6o-Xd?Yw`npuhqsk~ZK-!j#$<1qcXncHbh&qmcPe!}-U{zDZzZwm-nenI zyfeHriC1~6z4@uLy*1ui?;P)3Z=JW^JI_1cJ0*py=N*>X;PrYNsYlHMS%)rt{ZGwc z9)s|zQ*$z_kq={XCygA{l$}*wSb$@RF*((_)tTviCYNQ*!`V3Np)#;S<&R`<*}nv%E%v*QeHi!dMYtbbp`8$#46qvCGp4} zo@!#DORYcMU_FIuJSho_i<*lUO)d{SDdv{X^~|AGpXd_a+jYdoCgzSAo7OiiZDc*E z!D-PMaaQf={_i}`ljiSjlp|I8pYijln;4&r1h~?=5(_*zs0q~*kOnDn7BBHePkrj- ziIr`xpi>9QyQDX=%|dIt8lKfn#A@?aS#NFLg4XkFk!M77ytR)4e(AQ$0{=5UShCpK zUj|nUUEF%Bj<^21DJ`ijMcgNe+10$^X;UhkP&8spKJUcEUP))-zB#RBx%I8mtt}SD zNq*!qA>v6;UoxO&khMptImll+&qollG5#C zEFL|)Wte~a>DGH_igo^W>0rL;m=3Py2y3foYaPQnK160Ljb6&HV=uA(z0b_*Z^aU= z_h>BZ8tc1e@g5yNzBs+sI-`kG?5(^JZx+d2I<_C*xiH$UA?xTi&)S%foT0oiqy4pG zTSrnd%3qpmN&Lb66jlR$a4UxXn=sOn?j_$|5~~Wj zaGmVBg;ve{SZCXH4~s&MRnl4I zmZVLr%CDMKRi2xOvQXW@zouWK>^pjztk=FQNb6r(njceCF>)n$Y+UU4w3)S|b7$37 z)s~K{uI*bsIlrd1a?I@7+S)m_4Qc2{W9Qb^rVU80t3~##Ego5CJtO*!pI7V6oL{?u zT%MV=!!o_Z2IMr>F05^;O~PP)acxyvb8SoQ+_F|mmegkPgbH0ow$ui2t-X`^ z&ythk&rNGhZOyRa>4AFaNv)ZIR2H$hf#>FouzzhS==&^r&e=IOG|6ZlED7ZF|(JpENfZbvck$+*|MsocWa+kcWd9)e%80^ z-#VamU~5Cnpw_{yL#&*kt;1R?Qiogd5!PDHY+aXy86z6|kBM$v${Qka!f5X4n8w(~ zk&UAo;~K}1nhyz$@r?tJ5Q_5?8#dvHofE62~^qP1saWU_zY^yf^XTsdZv7BpO}@N)mjy@b>?WhoU@r~$C`5Iru5~!J$y4Xd;fcJsCA#tZ(Y#Zz}Ahe zUe*h({VZm^2%1`(t+Z^_5{OC4Ug{Qbe=V5DdQ8Y2{Xq31F$bCmyW7Mk1Dc;(2E)^{A$ zGCMV{CB7x0C9x%`CAr0&J-Wm1zASZM(p;{NEcHn<{J(~sZg1V&-N)^A&*|OI-QP_M zjeC%LuzQGmsC$@uxO;><+8yJLb&qt9a>u#j-3jhQcal5VJ=#6SJ=Q(WJ>H$-PIafb z)7=^F3GPgHmOI;>)iG3dG7h{1?~p7*WKt|=x%Z^axZo_yIb6??j`P} z?q%-f?iKEp?jgOA{d?E5Ud5UBg|^F;{>5j!F<@7#*kx2Vv@G7rWf-ol3?nMt+qkr; zZqD4rQ3KNlMa4!(j~p76)3CUvsbSXQI&Z_Q`B7=ji|QI`7A=a(pH)3qVrYCj`A*^Thp{?cvR~A`BBBPuSHSCHO#}-QZsvalzmRK3F@jA3`>k2IioNpI(k@4 zlI=3xE?(=}-HR$N(-ad_lTUlg7GygmQCslcpfBH1mK44(i;r?2Q6IbWoeSH*;cy_F z0ms4dupMj<|9~Ap!;Y{M>ur2HX z`@oTK6dVo5z_G9;@D+Sp!-;Sb><*{Esc;&c4t!PLnQ#`I4d(#Aw{JH%ANGbQ_~Xx+ zYo#yshQk;b2t!~6Jhx@nw(m{di(oJe0v?UNt6><7fUcawQ0n!A8Ne&k$M4>y?PT9P zaDDt4d?_#h5I22&K+2xyJG=ld!b|WnyaKPnYw$XBc7AVA{wBNyZ^JwAF1!ct!w1mW z_EPpCbv}ZR;S=~2K7-HUU$D0A|4Ml(*C7qkAp>|p`!a#olMm&^hYHo{@p)bN5H@`i zAs-OHd<9Sl2n)VqSljs_dihFWGL%6%@M7}usP=iFqwS+9eIbUjh8(hb_HSLplo1NuSzkbYP{q94_d>Bsf+`UU->eo4QqU(v7X*YxZ9 z1O1`?NPnz9(Vyzi^yeJOUKRvmPL2~6SS4HQDBWB4(Qe&W@20oXd+33BkRGgu=%IQW zy{+CyN9!29w;riS={Oy)l}^-2I$4j_Tj*W&IQ^%!mx^|dGQ*!&s1MQy>qGRR`Y?UC zK0+UTDFVmOnD?;|?Q3tB!Dp$?trMgn( zt4cLZO;YpJOqHi*seh|))pzQ9^@I9R{iOb*epbJzWoo*bs8*>4 ztR7L1s>jsh>Us5odQrWkURJNDSJi9kb@hSzP<^C6R-dR()o1E+j$|(j0x>7Y2@3)x zo18oq6O^ZT7It|V){CmhQ^*C#Ozr3>*u`!SQecoCqS%ioARZoC>GG>2L;|38C`rxunm7^FiL{t6|S5WNuhP z+F`6K;f?;ILktKO6x^!clNE+)3H7gm)7j zPj~{H2q(eGa0;9Xr@`rP2Am0J!P#&QoD1i{`EUWOh6_Q?dkx{ma0y%rm%-(51zZVN z!PRgLTnpF1^>73H6K;f?;AXf5ZiU<6cDMuXguCEwxCicq``~_f03L*g;9+1Q6rHNmbh^&a6LhA|(%Cu(xh)S_EFX!jKo{yF zU93xVsh+IMbh)0Qry|`|AkS4IvCTlDo29FCwVthObgiDF=ju9LkEAzWFR)~}M!irs z=|y_6Zq_ZjRWH#?k@c1%D`h9_Se`d$5=e!q>B`Y-*3{!)LX zzt-QhD+m8q|Ehn}zw19j&h97wS=;C8tgo|bT!%o}Qpswx8l%RlacaCuQK>3TrK=1zL1n5em927+ zL-UX=^N~OcRG}(T#i~S=s>!NMm8&Ugs`97`2Xmvs9I;Ri&8kJUswHYEvg>kW)|E)Fw8AP!wv=#_X|EfZ7-+9s7x^-? z7e9#8UT3!dfM`#?9J-bLi~i=a!Z7(#-v8Tx$QL4ih>YOK6WbBr9{vG405`_}i}t$J zd=GO6WNhdKTfmmE6>JS67hVLzVGIm}At16^f5_e;%BQHe4QvbB!S?VE*a1YI>;wD4 zOzMez?S>Q(xqU43fda~B5mrGp%!c;l+x@7wKO6v2&>Q-I2f8Brx~bO}`aypf00W@{ zMAluKY&?j1gJB2^g<&up3ZV#!p#(}{GL%6%Oo6E|0-_-XVqqkV0+G2>Aq~ixz)Q^V*NQ5LW1Nl*ZVPz1%0Ox+Yng)~Tq446h)F8eMaEQQHX z2IVjXrh*41P&X5@ARBTZ7osVPfmj#`qkv~foA$aq>Q01w$m4huLF9W|zFcjrZ^^N1 z`+LNC0By`w`|{=AcSiRbPHS2>+tSwIRQETBo8!z$=5({6{g=hs_O+hc?JAJo3X#wL zo_4z&pUN3`&@91kR!{M6L{#A#HhaA#!w3(hW+pC;H`M z`4)DoVg<5TA=1|0)2f)G-a|sHL;72)4pIlJL)4+_Fm<>(LLI4&QYWdC)hX&!b(%U| zouSTDXQ_+S8g;R{L|v*bQlT0aCH>2 zEMaHzU`N|`RUT|_`=C4+l-}cz-uqi6vqtq#UO_mwi?N-ZToR(i}93pWcs7m(z_+yFUum`JM#{>YWP4#; zbhp|Ii+gc*&|Y{T!MgNEKjoJXGq$wut}yv<3*J*?2khtg!PZNE^uFw8AK+ZW?E9if zi|o_~+#v7Ee$XGJU27mn`U+@Kd2H(Kf@FhG155wc|2|NNnz)$cU{0hIopYRI21wX?Ycnw~KlTGaZ z2)}~w;lJ=LJP%jG9dIvP3s(d0Qr}&0AzTG_!b$zu51axn=nMCg{{Y+vS3os+MNkfv za1nWzz>dUsg;6jR_5}mRz=xDS2p;04PzSXz6AEEITuk}D;W>B$o`lCBhVO;s<9i04 zg*~aeJsb&#!lmRP3HZ3teJ>Ke3opS7@FTnoH^U$B4!i+x!t3xmybagEO>hm|0DDBy zM@@JOTn7Jv+u(Y*9Bzf%;YRo;tmfFO34KOTHk8=CSb~M;Y{=B^rm>NiNcm7sM=boL zPx?9IJyQI_mTeq?wftkfp7ZWzUvpjhq!Z1Qu;b^1rJQr@YB<%bGh56<*vBd68rCEh__S+!_ z+XMd>`^NXh((oEu1ka_X`5t8 z^}qDl^iO|A-}Pa%9v*@P=Al?Io`fCa(O5N#E#q;twjN6#{d3qao<{%kDcE72iY4bc zST?S~zVRS>xIe|l@p;wGZyJ*IvJOeKiC)l2>340)w(jIuyHNHu?4$Nnd#k}|*4i-M^@nfy!#Dk*Y%7c1ZfwWfu0!n* zLQ8k|U#tBiuGx;H4+!M#6o|>T+k~YgN2zVw(wkO=K-C9!9Ft)PFwq)H) zZQ-x?55gV%@&9d$2>Uxa>l>AG5C5U$Y8Gvp_7ZV1-O_(bdhtE~g8n0l4oi>z!!<~Q zbjW}SkO^6k4LPv6=|6{Kui26QBQ~xNaZMaMS800{J6A{l5nESB{}G#4NB#;|wzQq;KaQPkXZlZP_P3!nwvqaeV{v{Ru_|e$X+|BG~j?}{|^A1ftxu~%6!DLdYZi790Ga#l#r z+5Y%pgonVPRywHf$d;n-ID0sS*r`_P4A!FWI3*GuPU<+za@jCWCVm>4(1l?mz3i53 zr-wppK4g@eVb~VM&Nw&O*ExPG=imGqo7fe1WL5kXTG!Y9adkhT4X#ETls5F=L(cAd zzf3Iq4lZlcousBCclPK`!Rz+_Rd;eUr~h?p^3Y!jy*)yADo~q@eR*7LxAdjbzo;)U z_FtABeTi$320i+c-CyLTzhi3@vcTyt+J|_gzEnjX7QSuzi_*!1`MNN$@DV2BI%T_7}ZQ{zA5y0#l(!U$Wm0I~qZM5HfyI z7U?g#j-In;8Eg2ZL2s&|%stEjri}KpDs*8Lso8Y2$$XPvwabgoJTk2INnxoj@5W#8 zLh}am9`i}|@uv9&>tD@nU3O~Nb8)(y(?jXHIh9SL0vd!nL zrMJj1#Fj~Vi-OvdVH`~AD3IPF`v}rkB)Zd2R$4}FN?(zbi3TLzFixPa$*yY{S2Moz z1$wQXr>DuulTf^6+=>s7&^$XXUN$5qUN#KlJbJ6dM~LLSOdpqo!9}d{CG{CSUJ}Zv zOYzJh@!RNm6Tc#FqfyCNQ^^Zm-l1>o3-qhdJkk2DvMl&z9BO#U_YrBskp4QukbW#% zhwah90_g*vk#1c zePJx@2jgIW7!Q&9*a74ffb?IDAWVTMNQK^z27MqM+z=1DLoDnJ6JaRq-rKg{%OgGn z5?~L=hJla|!ypF+K^6=E(bt0d*nLK5pVA-3a5FT$VdH3-8+mD8A3OhVJF9DqyN#!f zw~en1H0_PB{KKS0p~GeWh_c~kd|1x-uvCY;>7by%oMFy4Y27i7GS6atg?XF#nE8tN zq4`b7et$8yK^xl(HtaIcmFUWLO>xb2EopPCBiiJ&doDftpmkYnebDI#3ih8l*G&4( z>_z&{?By_ewGP4N?CHL`&FwVwBhmfNp+9R4dfPSVIai=P{eWHKJ?L-GV_Wz# zy5igDh##RpeTF`C3p(9z=zIS~m;27LSv-#(tkv{PeSw|grC2F`j;-RY=uMBH<%zcU z3Yy*f=xraPe_e?MFMv1E3$dm3T__#UFDlle^-3B^s6b|)US5+>sN1WVg1W{`n!-f z(_nMdub$hI@kp>X|L0xtao!al=4-gl(sw2OUG0tOZZ9u#e3aDbOuq`tREZ14~=iJJM8+hr5QfT>#vPd>yOrzZWi)e&a`^( zeC7$}1?Dy89p)n;zwdKcA7ZH%lGF9`U6-1F;;j7u*9g~mS3w)CXnLERcK6()C*ch= ze4Lfo8QSBl3?qD;mDm|d&yO?CD*TGt{bHecc3)R$PWODChVH@cISS8_{-ll;YXlVK zJz9-ip&qT~f5|6o_&ptI#kXnte@N(-elxWf-}Ntye~RkqKk}s@Yo4xf{Xaxg*RkjOnfALRGy z*#E!B>>{+{_WP^@{6&xxm}3%U>J<5>tq>h#)g%T4oh{iVY@|nW`#M| zY-S&anWwS7#JtIT2#*vR$SJbG+451(}SW$7G?XYexG=I{Wa1DB7Gs!Un733uLki~*A;)= zv(QnhpbREMn>MTsTIk;KuCbAqj`bVc|HAq|y)TTP(P{SZ zfAfCkAb-prNz=Lax=61MGV`3de*7mVz2 zawPo3pZd@WWh77g{XuK%*$LfeWc;_VBT8>kWR33VPQL`aI((`34UCHl?z!z)A=~R< zu!ilM@Owr(1@nTj9~jFNOtpjmbf6fcEOFh=WD=0La4zatOhZ~M#N@y|`!_S@Pyf3)*`rDRk0 zF}`{9Lj`>_Y&!Z{_xy`j{zZLll&!b*j2}XlO@khNt@Hk<=eS0+##?9%0@$c52eVyoQ?ai-rKlMc~lzE3l=M#NxNA!;#eXU1d>*#&^SMod7 z*PQv4BKQ7HWX3wCe>1i*_YBOb6wln3_6}@ceC7UB`#YUu;>$8*Sz`Im<9~#0Tu62x zYWocjB-@QVZ@zDSZT`yk+qw2ZBO2lw?aFgab=5M@QE-D5u474^8 zEw*)%Z)oJ-=U5W2d9uCjIWOop?;LXNIhM}EAA{8B ztVgOxqce;RtLdd~L5wkH(j((p0+2P!m+9%2L@XN9C$KHBsfONvc2< zsv=daN>r(utjbimnxdvEkE&49RHd4(W~iBJmWrIUw_eR-2H^#&L3vf9ik!oDsamF% zs}*XcTGggiqoXlZn~uKMJ^$#_yQ%Lv{`d-e^gUk+`a~+E!RDy%{hj_IF5()mflHtx zeeYY!o`=x>xgLFQL-xMoZdgfxX7=q*j_25_s>~2Ej{wD`pDS)dKP>1(4d`Y zPtW5pHC&BQ(JDs8s*!4xic|3_K_#jrm8?dqF>0(Dr^c%kwJGbNn~wfDvRnQ2H)ds-6XBKI4mti%n^yedwFyNq^&|gg3$W@L#wb@Dk^{5w3%0AX5JnzZISN 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�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%0D0juA7*0$Sr-gd@z(RR*u#dgAW*mlHr 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⁢e@`9 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 z z`=6p?{?n26@!Ro>*lsx3`y^vA^+KI|>J@7!yPVBsU*ojnUgJ&@%t{D_+r>IXPR>$I zkyc|~WB=|ht_Vb`{T~QNh@EJ=$h+vBvc(*`WSgR-;G#3rqxP*U+gB-9tdHL>T9x@% zbfu_Ose|awz>se;LGFJ3RPjXdL76)5K!MCq>Am5Vm81mUgjQ9QMoOs&+JOd&^mOrpB|$>q^p^F z<|=k?4v%w$^N`0CTo;kVKg82zBw41spDL=Fr`n$1MFVS_>;4*682g%Dn8#b*TdJ)> zdyQk4_mXdu-x(s5msNx->d4)Zo6*7XF7}DoVdQ;`OW7OpmTIT!HZWdUnwK1pw2hHt z)L4C7D_kzAiXzVVk-31@lzxgHVzgiuGB2^-@+OP!3Lrsm(M9noF-w}pJT2=iH_I)W zg?b*no}r%kFe~Wo;@j=lm0Sw+3_`J1l~WT|tQlXAP)4hwkK$UnulbW@%hh4c0{sTd zPxm2TPVr{m1;_GeQ*sJ<6NN0MN^^XJ3N)h2HTk5K^lmnMQKL{7>^$sQY+Kv~(nRuB zdV5wXn;@7bnk`q$VR=DLO1{>x)zHM)&HTqCG(Qv2)dxxQ7|*kBZ~<;tULR#v(P-b} zl5eH;RcrNGiS^h`*v;4kZaMBcegWZ&A(!xlKqmDiSxB!)n<)+|$e6%d%o@eUvlZ;# zJepvM^tk+l`i=UX?whrtt%)7$`Wgbu{zfz7S(Wdxj|n3fHlac?lkrigk$Cg)Vw>qS z9w9Es{F6PfY_*`jY?^FrzD<8vzr=XKyx)GwVezoMlZvkguZMe+t)@qJ_lIa!r&z?)}!`um!QzF;Te2jT^I6Ja8eM_fl~o!O9j zDeDJwC+8dI6IadaAsHeyt2e7h=5;7g73j?^bQ`S2-mZ1UsBZ*#Ax)VfLW#AnEU1}7 zs3q+p8JPoF-IXDwGw)B{9PL%>K7z$I$0H;Y`A5ce8lV0ldlPdIYa(}^V4EmI zc};!6wA-`73R>Sgutjd)^O6arXCtCm``U7BDYhkUA!!kLI(bx7 z1vS3aK3#Dr%*38gtj3yf+i+d+o$!kYazZU}Kk*N-k_405l3S6z6hh|8Of!v4&!z|I zX!f)0uh|7m2eXp-53>u4$X?2ca_@21@umnG2y92O?3kKCgj`HuUtSS^|ONeYnBkE5EqkwXUsI{!tClBHFNWts&Z^? zHNRO8*y}4Fst*PEvXs~b?E4IU<`HUEmY98((^}X_I7z%i{8e#VGuf=P&rT$;c-(nX zBZ?|Jnf*5VrzkGZ%WqJC_eIK{dhnU+n8SE`@SE`^gnFX$WG3|>Z984UTE<<$n7 zdL*R1lUT}YRJJK`R7(^##m4X_NV$yX>{32Yz!E2OFXZ*tM2+^siXunxLw`ZIO?eSY6t-&y}7|E0*Um`YZRor){L z;R%`aAM}Ns`n=h~zOswTgYxO>!}+%~#|tLwTUgVrFKy+{njl_oscFrk77wfbVfYp( zp}&fxU_X$)W{#$v&st6QvMtI+sw0}0{#trH7hqK5KZ~mE9L8c-ufkULI03^D^MoZ; z0%h)WeP?q+YtP~f0cGfH(Z*13{14(}21#Vf8K+(vJ{KNVhT2ciN7qTor(o}pJoF{p z(ITJhg&N2kX^`1gl@P;`css&fl9c?H?%_?6ZZ_A8KFGL25|g9!(TpeAZ*lcGf4E~5 z$MhHVv(3v2Z&=>gdfP+J`5v`5RGc3e6&xK}5|)S0M5@BausGa2!Yoo5s}=W_XqLRW zl9xBI@N(EudW+PRc9ecyk*yzDm@pMmYjb}PNS^n>3%H+*RN-bFZ0KSC8$UzX$a*bM zNxZU8iinc0`lIb&2D3FGceqh3N$5$O$qftd3%e=zGH;mGmT$ssuCK0dz753tq&!-X z8Dde`NGU(^5570yF|iM60qHgAIe9*1G^KNfn0ACVHER#O5u-JuEu$O5$@DP+W)923 zb#fna{X8A7v9N`3gitFi6s;8ZmX4Dil6w?Ql~m=_+=02G+_Recy6l4bdV&7E9x${u zt}{(CN33@o#m+^pY|kf8Z{JiO*_Y?z_@DS!hlQnuWnIdvBC%*QY!hrRY$i5J$RS?I z980}K?MI);Jk9>Y=ZG>ya}|5lc^aN!pHp4DFWjeWbe*;CPwWl1r6eMIlS?ktS=IKW z_i2pc-VvO_n1};$dvJ{@eX<_YU(ipou$)o6?Sdu3x8j7PK=DD5uGz2Ytz+tw`gAjF z+h*VB+UT9^+Z0Fy$Alh-8%Gadk7HAa8tQ9mb4EAKGzQkz%y&A-izuS0#;d+2F>d%% z#(Glc&?K@wGnKiXH&*V;;pmD@fF;K>J46n*DeF=ej4<<0RW{C+WakK0iq@Arj3{}F zL|rAP9i3yxB7Zzim4W|_-U&NACtEX0c#1Hd2oZ16Y^*`-HryG4d_iwvzVM^Clb9!K zs8p+aYaVKkm@=&IslPoI?{Z(6@1n0~s5DHB(xP5LD?=mO!N>^aBX&3L8bJqPNc2g! z%&^Qfy|9^Wv!7oA)=_9T6f`E@=dR(+=Et}rd=A4g<7VH>h}PV~zQ}zayO1!4#3rqx zH(+#PJkB1-UBKPWZ!aDzJ};lA=&ZOYVyLjW=G=<{i(!lLfq8M^dW*r<-9E{_)}{1a zsWZV9gmj@TrQuRX#n!|!qLVUFH9l8NaOo+9yKGlXOEU=6^^A?YKf>R_EXjR!P!rI! z(r4(O>Z7JU=DFs^MPq$aBAig4+GltT@e&ClHN|hFyrtr3)6~UuKBFfIW`ANccn;nS z-a+1F{);+`2b_Ib@>|kTh30y(FY2r`WrnAwtL7>*$GXTtb;zBEoIhQsJvk-yLyAze ztVgt6hxN=uX@6cTwlX1a+RZwXrk|G{0 z;Uterm(iOsTJi}ZM(7T<8*L~pM^5lfr*x#Qp}l95xW`4~>=en&$f@|?N)oOS^$)#` zbq8Y<)5Yq;Ucwp6{VRMgf1Z%%17o z=C6;PPq;`Zru<9q#7t+}m>pQ-STfdb)<;fT-b!Ilky1rePu5J<(p)6_x@owHv z$sF8p)jiR{;6T@IGr4SrBu6E!GsO+34>u20HzUL0-PK#LSR4bd!OtPq_!p7~P%G&@ znH9_}%&*MeEI)e>cQWr9Z<~0g++7gRH#Y$01@;EMq;GDZeP~~3MEG8~RV^x~@*%!P z@LB29b~j2w*UJtlKa%&eR`Zty-vsBD77%3AAv6jj%KWJa7WU8_@#M zRhs5!1WRZ`9!JfjZlTrP=qPovW> zGLnr%;~i73IgQA3N?eGml@C)q-`_fr5^5dlTCR9AKKyAfX$Eo4> zQtZ;9hR;@vlN5550*uDhGe}X^E>@L7ujc8F>Jj4&*=zL{Uy7I`{YJ1E#!415zEr)k zpQbMg_sS{AP%+N3g#y1k%RejBK1Lv)6}Bv0NLv+h5tdjIV^8SZhoDq*T}2npUjP!=3sv@mtY@duFTlLKB;PH{%uXS9kuNYM!lyY5Ga7+C6%+f5E zI8VaQ{jL7T|B(v#rID^7iyP5D(+zQs!U>33q|4l^q6>1fw%k}@8gF;HUIiZu`=}bJ zyBBV99FMQ9`AyhiR2S?sx~&V1&!rru-%8N1H8KLX)UPyX>i{N|ZE!i3DlX2rrs74F zA%jLmiVj7_;sy{GlP;4Uk{U6G^TPs*Xu2FLU#Q-uev?Pm%qkpif8pBTKV>`oD2YHCNOsWNOcQG-dl6U9-NX$EZpkjmcWSn3!v**B7tK1$ z8tW#{e&0dACB%$Aj5U`|G{y1L8CzLy(LLF?{HD5qWlHS@QD?&>QnBVurI1x^`{0OK zr?O77xSILKsUea06)lm~#$2c!Ui>dk%IYeeAa9_8^2K_whvL)wpE9rVPHS%H@7f2K zeJrhVz9||}b(}0``2`F`$DDQkoBk;=oZw4-OYA)?kU5Md%(_HhPe@@_F*~ufT%BN@ zKq*uz#;XS!@wQ4^+|DRo?oayjOL|1+Mz-QM@rANpc8*i(dLF9JAW7E849-kfYn+O> zfi;iWQWVtdZH>J}-hUOHSrqO*`Bkh$U7Bb_oI=je*hO8 zw06a6a2mo)Dvz1RY{ohz8i<|d@>b9zd8YcYpZMd{4DGstRN@+4TUU`0hi^(-pgwDS zZaxsa6=!f_-Ijy$?>S=%h7~@s?y|RVzIHZn zxAPA5E%vVs-6;JX`&1>b#$i`rOYj-Q#hL4A)0p>I_gOQzyM^6F*F-nOrG&objn?(H zdc}VKQGa3Sm`ES;@K|TkZ9Idtp1PAiRwPmjb@L6$@JZqdd6BFhbt#if8!q~30SRZc z68`f7a^hgk#mxP*LBdMW71;~&eF=qGWvdWvO#BfMtFpywu`uo&X+L+EXp{U@a0^aR zc(kT5mdmj!hpF1T^2kF)^Aex3D~y{NXXriLi28-_3yw!3=e~As_0~k}dg{JL(9Az)Nx!GD#pTxrMCG?<8 zR*$z{38%6kos*AsRcM)Z?ttBX|Ll+%Q>UryA%@l6blq7ZOH31^8HNo(k4 z=JGld;2mC5(F2i4=~s-;n~*nJgV*2o#C(fG;n2UKQ;`yPN16vq!?nVCeKUe>Vq5Sg zW`wq%zK{8U_k(ww|46u4a!=A+u~%81J6N;L;Iq_uqMYZQHgDhJW&uIS9BCFW`ksMeDpnh^@&2 z23E9Q+$i6X4{5G?K+mNx6e)-lv)p+X4Or)LoiJ^-fZm_T@S-ElgfU>X9`^nYa(4@3F3A0Fno*@ z691OpJG~BPp|ZYp_74p&n@v_FZc4p5C;ab9 z#zc1$XJuVrVpyF;CP}$Os%Wj^s(-2980%XLtxMcjLJC4zjZ+I#CkJWK(4BMtk<~!~ZyXr{_mC*uW! zaA`O?E*qDLTY%HzJh&h(hBM+MxEx#*W z;dkSA;?LtR;CJCq;P2p{;8FY=JdA&f|Bn9`-;_|F(16g1(2>xA(2dZSFqtrcFqJTc zFoQ6YKqM?BkO^GEH-m&AB`672f}L^s65H=Dv5q1%F z5Oxx_6ZQ}e6HXJ(6CM%(0;T8$;SJ$E;a|cZ0*2U}*n!xJIEXluIFgu7oJ7PC=Mt9? zmlByoGEqv*CrXHUL<`YOEFqQ?ONqHe4>3$!A6ysQOx!{|MBGC>PP|OKOMF6viAmy{ z7(o0){FnHR_?_5@)Pyuq(~{JN)SA?h)Q!}iG>SBulunvRnn{{Znn&u4T|`<&xvX$@&BX*+2z=_IM0>3-xX>6h?r?pxAx(i_qbQho9?@=Wq@ z@(A)&@<{S{@(^-QGL{@9YsdjIi=0c=k#oqUWFy&1){>p%5V?qamb{X@kGzJwnS6?T zj=Y|{iF|^*ntX(Oh4N{5WEluj9c zD8DJ)Grm)>8TgE+xnncNXN<|1m?6vHXN<~_XGk-OGOQWCjO7{S8NrM-8Cx^;dnKv_=QSW5J zna!zPsXeJ`YF{dsx`diTJtiYkr&0A(7j-|imb!_0fck`bkh+h$m3o?blX{(cmwKOi zkBU+sQ4#7>>O1NW>UZi->M!bVY6Ds`S{qt-+FEfcZ8&WNZ47N9Z946SfkMO6u(T{1 zmByv9X(F1OCZQG3Y_w_`6SoPsinfz>hW4EHh*mu?sFbvG-S^&;y|){m^8SuN7D3f=-0A_(#O-M z)929V(Pz>LbP7F-PNxg#5_%3jkFKE?&^-bJ-AZ@R*V6aVPtwoQ&(m+wuh9{Dk`B?I z&{6s;`g{5p`X_orMq@@3MoUI}Mju8$#$d)o#w5lp#(V~rL1N$;I7TjA&QLPASS>@( z@H4`Uaz=u-iE)szmvM;k592iB2;(f{KH~-BH{%E64a1-PlF>Z7V|M3kMt1M)?%8d# zJ7o9E?v~v(yG!=cY+^Pxdr7uDJ1<+C?ap>)+p||@S7&d|-kN$<^raMsbw0N zhiWX$<;>&E6U=kWYs{<6J4~4QnE8PDkO?tC=5yu?=4<8$<|pQR=4a+N<{xGXt0^m+ z#b7mOwPkf;4PlL7O=QhtEo3caVOgVC1XczslSN~3SPE7iOUH7s>?{k*$MUekEH|r$ z6=%g*%USDLTUdu!cUV7J2}PBTyOQl>C)g2olwHbR$1Y}r z?0sy2eUrVL{hoE0eTKbC5@a{=ja@X~kKATj)0TPVR5oKB#wp?=R`Pe&Sp+I zr;_92ggKiyTRE3F7dYoRUpePECpl+02RIiwddp=_k^^(TaDH$;bN+IEbAECDaO!cJ zaGP>la$9gaaJzGRar<(Iaz}F0xMR5K+*w>Km&xUE>0CBf%r$ZCTranfTgoltM!2`Q z4sJR3F84b3AonWwFZT@h7XKXg5%&`J0`~;>EH}YD&uzhb%l*I|#B0E7!h6U4my733 z=Pl#);Ny4^UVvxiZQ^Npt9U`4msiW%!;|qOyd%69ykopGJeYT$cZ2tZcZ%1EKbGH! z-=05^Kc3%H(3wA&-?3I0U}pgrHWiN$`*0q~MI;xZsrFlHi8mq2Rs%5P*UY0=1}_ zFh%%NkS7`^94{Oz>>WSWE~Nt19SOi8xHCXq^ZO14U_ zNsda6OKwVzNUlhp(=SLKOAbm-O4dn6O2d-nk}64sWVhsrzFY=}&1xS*M~O(sr^=veAj&vWc<@ zvParUvbV7XvN^IvGQ5l?Bg^PAmW(4Skm+R>nN{YLIb%oDBC34Cfh07 zA=@SUM|MbdMs`tlQ}$H$TJ}ozN%l^5q^60yy}X0GyL^DWznm$j$hmT<+%7MXSITYj zguGBLmgmV!V!(D+ND~hTA^C4+OImJ z+NgS}x~+Pxx~00O`k;ENdZ=oe(>&*gs%=jFoYpyiRNZsB<>ae+=5)#Fos*U`J!eb~ zA%~X}&neB>mh&NJbI!h;T{&BGp5|Q4d7N`Ur)lo*oF2Jda|OASTu-hrmz%pZHzQY` z8_fNg>&&glU7x!-_ipa~+#|U+a?j`9%Ds{cpOG)g&&lWIOY^n) zh55z#HTmoEFXUg%zm@+X56Fk}pXI;Ef1Cd?|9$?4{BQYR^D&wfO+!r!O)E`HO-D_8 zO)t$r&2Y_B&0Nhg&0@_W4P7%|lckYp_!^N$rcr1LG+IrO#;wWM_%vRPT~n^9)KqKM zXjW-XXm)8%YW8RjYxZdlX?AEXYc6PRXzpuZ%@fTZ&0ozgO?~Zq%@55-%_mKBZA)!a zZEx)$Z69r4Z9nY*?O1J^c8Yd^cA<8@mZ7C;Ia;n(td(e`T9H<+&C#m0T5W;Wq_t`t zT939^8_-6yW!kv5QoCKdTf0xYUwc4%LVH$;B*IhS3H&M4hm!%WyWIDP|ptI--b$VSuSF8)`mg{PC+jV<&`*lZkhjfQ^ z2X$w4mvwh_4|I=ou`>f5EDPJp~&JwiR42 zI8$)3;8wwrflG=^>t@>U1{rUs?^ZMKRXZqKAP!H>y7+M;-7`htz7L(C8{Y%rWNY&YyRoHm>?95pyXXAKt&mkn19 zw+%N9_YDsWj}4#!G9(Re4DSsMjIE8$jE#)x#xBOL#$Lv8#=*w%M!eBr#2A+un;VxJ z=NUCdfid4GGUga_jdG*XSZ$0MYmFtwDr2Rw*jQ=|8ncaY<3;0f<0a!&<8I>_<749s zV_Q=PQ__eU*`|7?#-{eBPsXpt&Zd^8FUJ0+L8hUm-lhqrVWw%OrKUM1vI%FJX~LVR zCYFhB$}kB`a+Aj7FojI3OE zX-eXq>7(hh>5J)ysgb#Xxre!F2hC=4!hFEI)x65Q$9&d&*u2R+t#GAzoB5G>pSjk&-F(md*o>H;n17l-nn82J z!e)j23;PzfD;!vg?6mB+Y_;sQ?6c$+ zpSGN_T(I1>+_Hd{q~(R>ljXbRQLK>_V{LA2XYFF`YVBd|YaMKzVVz=KY@KfAtHtWH7Fk`^gtg3CY29KC5jI;NT2bqL>tpLF>jUc@Yg5}h z>j!Ih+YnoS+bG)-TXAH*ZMuzAN45H8&8_2G32Z`JejO>xWAoXpHoI+k9bs#=ZB-rn zs?4^*w%xYJcEq;NcGz~zcEWbRcHVZ`cHMU0cF%Us_Q3Yk2H2k2e%OB6{@Ci<8`vA# z8{3=NTiV;$JK2ZWhuJ6E)9o|uv^pABwmr+vs-tgl>&RRGi@P@pnbC)w8QqN_8a!k_D}X7_A*C`ZsCcpd8O(tgh8Ak1Oo*xz@WBu5wqx_0r{bRk?JoLRZLj-gUrr z)wSPs&2`)L*oC?txxTxa6}2yFUi8QH!_}y$Us1QBw4xbB%ZeyiauKUYRFqp(RU zL(#^f;v#?1-lABU*avSL=TytuA{K(V>l zTI??l6qgp46-SEW#g)aA{j>Zt{0sd{{a8QVPw{j8a({u};J5p|ewW|pFYyQb<$jYt z=I_bf;@{{$?BD6%<=^Vx>p$l|?nnHv|AGIv|A+slA5+q>q*+PhlGY_HOWKrRYulGx z_ID`hR3a)-l;oD=mDoz+B_~RblpH9zTJoUePRXT`hb0$FUY5Knd0GOO{3>Y@Xd3ui z(lgL2&?eA3Fgq|VkQNvlSR7aoSQJtWM z1HM36ARH(U!~+`xD*~GX+XH6;I|4@nrvv8#7XuFiaNt+qXW&)fPoP<_VX$McU9fAg zeXvKccd&b~MQ~s+Jvb#eDL5}UJ2*YKG`J`@KZp%x1{pzakQd|!tAe$`RlzO6ZNYzn z4}xeA3cd`!3%Wy}gAGI9gFk|8LmfkXLoGwSLY+d*LxV!&L*qh|Lf?Y85I#f*5ksv) zi$c>w86j$j84`z7A#G@VL>;n+%pqII8uEp_p!sVM#bItPU54ylKq1L0%g~Yz(vU6ofS-0{I~d~7vs_v}q%@~oQ?4sFmuHom$_vYF<(4|+p}WFYQC< zup+{UIwFshL}HPONHnrBvM#bCvNN(hvOBUjvM;hfawT#xaz1i7vdsG^(lUBG@;!oy zHi|ZhwvV=owvD!qc8Ye54u}qorbQ=3r$whn=SJs87e;4C7eyISc9b6#M#a$^L|HU9 zs*k#&rl>7yh!)k=Gz>;V(W>bB=-TM2=&tDQ=*j4r=(*^{=%eVHD6aNn^r_)X^xtUf zSc}-i*nn8y*o4@$*!&nSwj?HtsbV>?+*p1rFSaqZEw&@JH+Cv^GIl2RBKE4zEYvjK zF5V&DCEhpQGu|scAl@fFJU%i$Ej~RyJH9ABFOH8di4)?)_|iBf9*xK1YvNntTjPh~ zPvZ~ckK^~^*W+*EZ{r{0ALBpc-{SQvTUR!$gyLN*hgD9foL4!!a%Sb6%ITGq%4L=G z%FIeuCAU&g$*+`D$||LmTPn9#9;!T6dA0I-<;}`ll}{?4Rzj6J<*UlKm7gm= zRDP}eS=lJjCDAR>JJB!EKarXklo*^Ck{Fs8nHZHAlbD;BlfWgGC9nxXf||%rlqDRA za3Ye3CTbJQ6YCSZ6UP!468jTp5?2$~6E_lY0!ko>TL~~Rx$0x$L*jj+V^xQ$rd92$ zT2wWvYEsp%s#z7LYGhUSs?@3hReh_{suom@shVFky(+7UT_vj0Ruxn|t9o7azN%?; zlj>J>HmgR}L#qc?Z>#QK-Me~jb;s&<)w8N+R8Oy-U%jw8yP8?euO?LEt7+BhYHzi> zdQ-Kk+E86ty}Eis_0H;3)yJz3R`07mP<^KQYW0cg`_(tAzf~uz-&DV={$1Uzrh84V z8cmJ9#$02o@zfO8_-jgQDr&+t)irBsHq`8^*;uosh7-M1bEW2L&9$0aHIHhZ)I6>M zYS5bJHScOZ*LI~woYnW%c&LC zifZMx(pp`ux>j3TQCn5Jyml1ztb`Wg=RYFEbN_q(X#G#r|H;7rWZ?gg4AcYa0}X%_ z00T4x8Uc-gCO}i58PFVP0ki~K0j+^HKwF?4&>rXjbObs9oq;YuSD+iv9q0k{1bP9z zfj&TApdZj57yzUK1A#%nU|$~7vKSWKmZ5<5g-O6fE17cazFtn0Tqw~Amr~;~i8lVOPgfe*k(;1lo}_!syBd>%Pv95u8~6kK1?qwI!3JOohyfddjljlW z6R;`R3~Uaz09%5sz}8?Jur1gQY!7w-JA$3S&R`d?E7%R}4)y?hg1x}rU>~qA*bnRv z4ggcZf#4u;FgOGp3JwE@gCoF^;3zN+91V^E)4{ReIB+~T0h|a<0w;r0z^ULga5^{x zoC(eXXM=OVx!^o-KDYo}2rdE_gG<1r;4%;k;y^q|0Er+8B!d(%1Iz@eAPvj{=^z8l z2ALoWWP==#3-UldC;)|^2o!@7PzuUGIj8`YpbE?Zb3rwj2j+tsPz&n70#FYcKqF`Z z&0ryD0j;17w1W=N3A(@{&<%P(FX#h{K|fdm2EZT~0>fY_SO%7Z6<`F6f-x`-R)Ptz z3akcez*=xQxB^@Wt^!wsYrwVOI&eL>0o({~0yl$Oz^&jma67mI+zIXicY}Mtz2HCK zK5##H06YjD0uO^nz@y+X@Hlt^JPDoxPlIQ`v*0=KJa_@T2wnm&gIB<-;5G0%cmuo% z-U4rfcfh;gJ@7vG0DK5O0w04PvB?pU+@d~75oN%2Y-M+!C&BS@DKPGtOwPH8bB!!25Ja3f*M0jpr%kWs5#UE zY6-Q1T0?E1wop5$J=6i}2z7!wLtUV*P&cSM)C1}X^@4gseW1QjKd3)607``hLW7{e z&=6=SGz=OJjetf%qo6csG&BZEhsHwVpz+WIXd*NTnhZ^Wrb5%8>Cg;lCNvA04b6e( zLi3>c&;n>7vZn&?V?HbOpK!U4yPeH=vu)E$B9M2f7R0 zgYH8Qpoh>S=rQyJdI|v$2tg1GArJ~Bp=Z!@=mqo=dIi0P-av1mchGz21N0I41bv47 zg}y*vp>NQ4=m+!@`UU-l{y=}BdT@QX0h|J3;D&G`xG~%WZVESpo5L;OmT)V$HQWYn z3%7&Y!yVv`a3{Dk+y(9mcZ0jbJ>Z^jFSs|{2kr~^gZsk+;8b`ZJO~~P4}pim!{FiY z2zVqs3QmJZ!(-rdcq}{)9uH4|C&H89$?z0-Dm)FI4$pvR!n5Gn@Emw9JP)1^FMt=q zi{QoZ5_l=R493DZ7!MO*B20qGFa^$lGhr%BgR@{d%z(3DCd`7_FbC$sJeUs)U?D7m z#jpgH!ZKJ6D_|w8f^*7435K!n@$z@E&+C{13bj-VYyu55kAw!|)OKD0~b) z4xfNe!l&TV@EQ0ld=5SjUw|*dm*C6r75FNA4ZaTFfN#RL;M?#W_%3`8z7IcuAHt8| z$M6&QDGb0M48bsrz$l!ApTW=J7w}8?75o~01HXme!SCS@@JIL){2Bfi{sMo6zro+( zAMj837yKLk1OJ8VA@z|4ND6{M8X}F5#z+&SDbfsSjH zosiB*7o;oF4e5^bKzbs*klsiiq%YDB>5mLRQjvkkAY?Ey1R079Lxv+GkdeqJBn=sj zj6u?ovB)@NJTd{9h)hBzBU6y6$TVa+G6R{3%tB@(bC9{nJY+ty09lAELKY)Skfq2n z1dHGhJVHQ-2niu06eI)5M5qW2$wKG|1Ib312n%5&9E6MT5I!P6gop?cBN9Z4$PhWA zK$M6I$w6`vHIj$qBN{}D=#T_T=Udyu`zKgd30KXL#$h#W!=BS(;<$T8$NasoMtoI*|` zXOOeVIpjQY0lA1=LM|g$kgLcwBbRoJ3U5qY4m!iv1EQ&+%C;=s+ zB$SL&&CMP%g?t`KSODq9Rm`N>C{(L*=LfRiY|12hBy* zXdar6YEUhzLkmznYCw&s2{ogIs0Fp6Hq?$fP$%j_i%>V}LA|ICEk^xl2^v6yXb26X zrDz#ij#i)%G>XR1I9iD&&?>YVtwC$i<>(4@CAtb-jjlo0qU+H0=mvBnx(VHkZb7%A z+tBUk4s<8F3*C+GLHDBnp!?AM=mGQ~dI&v?9zlG3G^g-3O$XULC>P+(DUd8 z^dfo*y^LN#ucFt`>*x*iCVC6Kjov};qW94I=mYd2`UriDK0%+N01BcI3Zn>$qDk}_ z`W$_MzC>T4uhBQ?Tl5|J9{qrRL_eXQ(SOk|=vVX``W^j&{zQMFztKPFU$kDbezHL_ zC5cHkOg2h3PBuw4O*Tt5Pqs+5Otwn4PPR$5O}0z6Pj*OlOm<3kPIgIlO?FFmPxeUm zO!i9lPWDOmP4-LnPYy_?CI==5B?l*mB!?!4C5I!GKLM#$d4NJyvm%Y+21kvYG*7dhgwI(|d1{fg^ga zGWYWK8IKN)49L6EKb5nIT3-A-9NI z%q`)Ta?7~o+zM_bw~AZMt>M;k>$vsY25uv_iQCL=;i|Z;+%|4Iw}acs?c#QG)!ZI# zFSn1|&mG_na)-FX+!5|5cZ@sEo#0M#r?}JH8SX51jyum?;4X5PI6LRyYPieX749m> zaZc_Ucb&Vz-Q;d@x4ApqUG5%tpL@VPgB ze&qbv`H9od>F;do{M6ab`I+-`=NHcQ&M%!`Ilp#(f9h6a6RoC;2D)5A+}8KiGeWe~Lf+ z_iX=R{{Mbi3Fnm2FFST>QwJ9M3+J`&B;r!nS zCgPWfxCmW@GNLS^DB?hbII?Zz%ZQI7yF_M021XV|K8idY**$7-lqG6&)UBv@qs`Hk z(N)oKqHavXn07IvWAri0V=lxrbD3k6vGZbI#^&@&h#wNaFupo|cl_HfUzfG_^4@PH z#3b}h=$9}kp(0^@LR{afzTb~K-S<}Cj}t2s*C#$s{Gwk>zviyMe(C+z_FLEQa6kV6 zod*mZux7x;0sWG)laxsplTIZ0B|k`Np8QjChh#(YI|D1>n!u#Nmca)H!A#Fj9Qnn_-$!m4nKx?HsK=v384WYqXJltA$ap)G%}mVflG!!$UDwvke`hWmy%`Pz zYUP?RX49BGV@{5_Jm%<_hGQR(`F!kGW4|2x-PnO+6=Q8v+@n%JJ{H zx=dIS?LRSm;^2vs;jpgOuJ>JSTt$;UaG53@ne3eWq3h;k>y(dNq00SSt@z=*LN;XjTmu$D}i7ZsUQXZ3?kUc#66W7vgKbOC&Vcz4s7RsNLlazCmo0XT8 zZCy{4G5LSx-z#`j&_Xp{^{MMnVLR7nuA!QXn$KPDYQNB))t=H`)ZW(K(O%JB)i%)i z>Kf~Q)rob#>%w&jx+vW*x}mx`x(T|8I;ZZG?u_oR?hDrmon3cK_nF>bU#n~H`dI%` z_mQ5~XXxYg75ZKJi~48!jzu9wp+&ml^UuF@SxT0a{80K^X;5icX+&vMX|K|F!w|z) zuCHBR7{75@jp1cy%FdUKGmSQ>P0LJh8lXADGTid5>wW7H>;H=He*S+Se?J0As2uru z{JVtSr+7L6=Wa;}b&_gD$I&J9NxBsi2j{4rWLmLtYzcdkZ6%5m=|#sx?=*;Mpl{%| z_`C90gLfLbWnm378lwNp6NO&BqyZQJ7C;2h0KL515K15Pa*KO-8X-H?m_N`Q(pxAC zmrY2CiT{JMrf_~^GgQmG4W%!Xo=t6zXw(Aw`VK%#fOi2}0q_5o^d5@(p*0$W-bYPC z|DX1`4e~)BATjz7(LSEGAEB4b#{fL<6ZE#H2v&AWf%ZqLMr~1pE1x3CfOe>ZA20X} zvFLNOy$O$h0XNj~sXbVI2}kx~qF(kD=>N~AuVJpgsn@Ut@#cafB7E$V(fs7 z#*T>f>aW|T6JpR0s7Z&;sH&Rh{e!gmN0j7N!R1d#gv+1dm|ZWy|4YO#=fP;`%aQytxq zk6(A>OZ7neec;X{pD;KIIvh!{Y6Kjk8wtnxM!|8s(PZ7mAYZ>X`T5_;i$(dPdZC9w zaVYS!c+|zz8+~&v0ogD2fq3nU8jBOrkOBSBkLUWM36ln(Zfp`dbt@U&yF3v6nluRQ zY&{sg#SKAB=M;#cp(yI7R8(yrhHmml;!B64VTKVXbWu8r`*tK^u8l%TaCg&(DVa#W zXf*n@Y79!I}zw*EBCcLsqNM z-L{2j+$U=EGD(9neucZ6e%7JwKkCt-p+)FSSTS1eSAv#yDMfqUHXy@BBZ>?yLqF%3 z(4XaIl=rCxwK7;yx6L-xDY_gjXgdQ{+?WVpUWq=C&q0mVbJ5K& z<{@jZ`6yu90<=Z35cZKpC^UO9N*=TXh50N+P5xSj4$of>XCJRXheRt;o0qE)Gj}x# zm<)F}O<9XVx~@Ys+}(sk8_><4H=?NXn~=zNGwN*Gf|_Jjp;BfmLew^tGH5$uD|Vp6 zSvye_+?R=}cB95Y)hJW52UU023wz!^IDUOUI@9a`Tt{#at{*&v0?=W&h4TpVEjo%? z!%do51CPU)pFoEjorL*1h2p5wh>bjhD4(;)_oH*jS9Bh2m0v)<=py<|d-fAET)brx_~u50+vJMO5-94XBFg4XK;}A4;>m5w+pl#?+$t zx2V?sO{kCCHKjtoYDWFs{B4R2_oc**n^PaOYC$D6eTNd~wWJ!;?^1MeE6QK`9+l+V znhK)drx4qQ3U2uURkxRaNU?aI|A>O);Hd^}KB2ZEKdL+JPoXAlDb(guN{rf3Y|GE6 z5b@{Km*@-X;imS~#KvDzUyHt?=56?zD&O)AHC6mAHA(gz^{*D+Qy*RLKt1W(ks7wM z6ZPco4^;Qy&eXg9|DfoXKT?Bk|3rN){+asW@Gn##{VRohf1}<(zf*x9{FB<-?+>aR z{YfEOOfho;sN`<~sjSc->VZ0#lH>geG3d6sj6c4f%Bpby+=@ zqSnt>)!zy2|qI$kh^+S6bvHMQe3%8sT}U!C}i%BQlZOU)!y zkIPc3ZGnuEHJ4M`d)ZXcv>dAaoLp+*o;<2ntf1tqQtGuRNG%I z)Ri?>%J!R$V(yhwH>ze(Iq%G*Xz45}OHo0gE3;wTE2$a2bEvEybEzFo=24A~&8LDD z3#cWZETlSzE}{~oi>Z(%OQ^9XvHVSpzPPI1gpziJ4N%=W; zQ8j~hQ$2mFsa4b-svu@BB`e!UEnmBzl5{#iO*R~)w4K`Y z(m^%4Swr2scA2W0c7-}R`zjToyg$ z;|}$~kh@gT(Rw+t=akyx}o?-dd8!lXi@ghbko7V(BU0_rNf&2MmGrkoo@W{ zpLC~If6#Nk`;-1ITTH)&0%+gXfwX*Y5bf72m>w}Kgzkj8(5O{cy7$RYTElds%cHu} zscm}DNYj&U*F21N7{ck#gCgkYev$OzPon7Zx1;Iyi(}|oS1gU~GAI$&8}x}7|c-ciwy?%bw7{cF+y@RvjvZB3@TNC(otqCs@i)`RH=TZhnX zQ3~yA97;#pQ|adK4x{4((r76fPPbu4&|lH%bOahncTkL?-#MK@rv+!yGnJ$1wztR7 zRn5oJBJnsH`HrV)Y69((H<6|~PNMy~Or}|S3XPskrG4I>MkB>^8qMV2k^Z9Twpp~V zR6_fkSb}^JfEfm3+To{Dtc8`A??Ue z(|%_)wAfEeQ$9Kx{X`k@@+Z3bPnb|&57;4J!ZRR!IlYBrsPDrq0l9C~)sxwNM7JX(zA(}-R` zH)+3+77blQ2a6ZeUk+YEw+&cIU&H(MGJ0^A<@8kf3YtbMX}^oB=#O$%)7`{tXrIPw zX;ih2mZSAF<+p)G@{P2w?{;AVO^wT1pQql*6O#8x`hxQ$kSw4ILJyn}A>$4>h3 z;$8F^$!>bb!D_liyFGM!pS|>VWA@Pt+wG@2_c%Z|p%2m@9X~|VUmd1V))BfC9i^N5 z9HVzMKTZcXKSAfbcajd7c8b2x?KIu3{~1~=K1*wJ&(S?UJ5TR8eSuyde35S1?Gml~ zz)quT2c1dR&{^+ZrnjOiur99BX^l7l98ZynP!b!F;SK8 zF>R>U%q_|L4BFL(36OultX=dW^WEx?n7a!CZKl+6CTio8QHcggQTI1kF^`q^jUXi&Fvmc zRzXiDWn38Zjy{}e=@Y?pY8J_`)lp1%Xf#tfGKT5?O)N7ur5986c^pHnk7t^k>do|P z&9ArrDkU&tQ6Hu}qc8J=B$1Is^n<$s`ZKqB4Pbl+CoyfdCo{pH4rB(l9K>`+gPEYl zLzqTwQkW^NhcdI@No8ni7!x`-jS;iMnc$rxm59rbWl`%$0@{7}R7U<0GBKG!C51h(o6^zhzBjl0v63@8nKrnr8pS zwC|k7yw6COFRx0OkWXby<6Jp2@3U;Cbz%-vIU$$Xc_xoR{T0kLMhSDD&!9O4OzZ&_ zvn!yGLG9HHJ5$3Xt<^G(zt%B+NY7Z$7BM$`ikUXeN|@<^rA$?G1LLDGGUMUK1pgcp zBcjXrF<%LH~<$N2fJXWoj~z|3v9k@5L{6O$$0%xFbh7=4>6Ci2o&hH9{lp=WMq{5$Mm zIyBhHWQFfyb~J(87}#otE#JdXS$i3jw2$d{d_T0|07ExE$e<4oG40V|rgh;FsOuQ)22f$ zBd&VEL{f8%Vvy{uJ7T4V&DQeY-_7c4eox*{?!;+1ifHS<%rJY|+|x*x>Um*;A?SvU@{X zv89pku}8jZ%?7>yKI;?MhNX{wz=m2rWW|P$*wXTk*+#LSuwf1UZteK7S#p0iuvc5S zo#Ior!H4Zw^xkJ|yYZj1zR6#(xi8zZ7uJ2r+J=0^HctGS?bq%bw)yYhvP&0z$M$>8 z<@fC2_8r)Bs3Y8S(TPR$53CQ>ne_?&2g@3MWW@`AVjHV|X4`9iVNvd{EM@`$){j`UbGezX@d9&_OJ14rUo~2%EI23(MwpWt;efvS?B_wtcJa z?Cta$K5_6PAK7PXknYD%WC9eYe=W#QA<<7hf74fu=wlFDM! zK9YccDVs&hSd=Aa7tz_Q_VXOJi7l56&dOt{p$c}?8714UNj~fQWdVD*wTh)83t9h2 zHH&;T>|s{RYBF>zMeEs6s)*g5T+DW&N?1gdvU$kBzTeQu(mrMEK#>XfX0};R3oBx+ z?2LOh===X{Drd9M3|3V*lkLyUVmJ9$uxy{%Y+mO|Hlz6*_H)7QTxjDwmfkrZ=5+!4 z?%IVc^=uJ4wdG>=_Ge4jq}xl`rN1p>71_(#Qy;8gA5LD$4s5fEZPIi#yR-2c_Q=(> zZ1?DOtcG3BHXXi!O`NrnO^M#b#(%w;ZP98AJ9=&vOEurhcKdQ0+Zt_WLmTa2eSCMa zC}|fvB5yZ4Qd`ZcMSIv59rm)CU-q%$XZzWu-43wjc?a1Kgf<>xQTAar5FKHAqoXV` z9AnuV$Jv${Cm{Y#vL7X%V)ap{!RHyaU7NG)9Knu9&aqWN=UKnZ3v6rOi|lCX68ptG zJIf|H*anIkwr$mAwh4WOMUAeq5;4bqo8)B63$C%9n|V69&LaOC(2tvJ^Q>EJn`5`x zp11C>I-k3&7~O-m-Del>e!wzs9oM$qR@|;h){J?Q8d*|#EgDh^p3$-Bx0M3vZO6w$9qTQt86K1+4Nme zTvjWQ5B;7RMTdX=RFoCaPShTKCSrU)7opHEL}-6|QOm3^MTc5`CE9_$79qcHM1CE<6}`DD z--%wn{2rhKKu3U106ze92KWcSj{rXb{0#65z^?$m0sIc|Pk=uF{sa&M1ONmA1OWsC zgaC8_=n4=D&<&tFKo5YP0AT>(01*I@08s$Z05Jfu0KEX>0OA3910(?S0q6^m2+$9p zKfnNhB!FaqfdGR51_KNMNC6lMkP0viAPrzRzzBeJfRO;B05SkF0Y(Fi0T>G~4q!aM z1b~SElK>_IOaYh*Fb!Zjz+V7a01^NxfDAwmkPVOnkPDCppa4(;bf1*FopGb@XP#_9I!6*cEL0u7ibBVg69;hb@gN-Tz z!Q~A z<+2sBmGFQ5R|D;tw#cevTV>m1+hsdsJ7v4z?_R29dt`fM`(*oN2jE12L!f_Hc0_g* z?&LWxJ0Uw+&%TS?(_4L9EDw+e%7f&=@(_7fd8oXbyt}-Iyr(=&9xjiNN6Mq*(efC1 zth|>zP987sEl-g5k@uA+%KORt%LmAlsykT%Ik@k>|?uU%i*l!WP`vaqrmsqJC5GIyf{Y*iYB)h-i)1sLnsE&% zeJ-zEm+~Z>pjpScBG7gLb8EjUrEm&|o645tVB8_85qP|8Bb?vCm+K`Py!brtRXX<{ zWUsWmF(dB5`Tt-k&JD;7%niy7&JD@!lG`;mG`CxB_uL+E!bBLHF%gj)nH!ZG4JS-^ z`+Y^(g(Dh zR>Cvk(jqaxrsHk%!b1+{YI{&_JtgoIZ{WM-Zz>;Q{fCf0kccG#l0Zou;JqaYl0K45 z$!N(KI5B3NWV~boobNwLGFdW5vQRQyGQz8tBuN&`sRY0#Etk%a&XmrQR!C<{E2VR! zbEWg7^WoH&h0;aR#nL6xrP5{6<mC{wx)zUT6wbFIc^>8B0M(HN$X6Y7bm2|6g zn{>N$hjgcOmvpzZTDnKNSGrHSUwS}#P(U$2o6=j-+tNGIyV85o`%>?5=ng04#7cVM z9*JcEvOrmoEEvw4=_2bY3zc<)+o5{Mddk9NaB&%&LlY&7mc__oWxZr^vUs?uB0<(i z)>oD&>nH0k8z4)PCBxra4w4O)4UwhDhRRZ9!(?ePI3ik>E*mKuCCiXy%0|OUHDlqd zn(=Tq+(g+V*<{%iIKO6^Y`QEHGMOCCxXF>_%JSee8>K8?Rv=TsIX7yVMg|wm z$n>%zSuvb_q^~3zPWj>K-mZMF)m7j{xh=ADb8>TY^Kun$ln!|VcbFG1iBN;Q zxOLu>bBAMYTJB&X9q|S&gi-|VNC9)V?^QVAC9M!d%sV zp*=cx%-?E^%FW2l#L{tptK(Vk*w?gVm~$hq3~u{g1vjYk$y{YQEeET6L)kB&qQ9n`z+b9PrDhS%znDpF5u_ zfPYRI0sO0lv$0Mk&gU3n;b!phM2pvq1KOeAS`b~rQ*|lz>Rbb-o@ZEr+XGLz{5u6s zEUz%Rb>38JpnbJ)Bl+uT7Th}@3$@P2tyo}K2bzhcdD=yWlEV97u@v+BDK5bM^XCh$ zf7G85{8t)vA(MQP+MWw`4)jKTW_AJ5`Fg5-eV zKFle+g_5|hfH8nO)j_@&Aj9Q=It?J(2h?H1C>Wj50LOsZ50L4y!I~so<{{Zp|}+b_rOW&sehe4jF?E2|=3{s4>FjGT}J0KrwymdL%m{c+hG}4U2jZWzA zUT6`YBsd~wLpw%-bcAt3Njj91ibokUjG4yiq@HocF~+gR(ME@AyzyE|jmOALFiJ^G z@!l#m6OEH_bW8#-X5FUJEaHKe)}`$rsY{cMvut8kMePLai$RTV-4+(5sCb6vLrzmud~>O~m6_uAT!muQlf5zSq@xhRg&!b3t=G zzy`s~Mq^Mhmw%b;@tgFUjEN9OPI!iGF>W@_P+uz8YTStJw-KAOMa#9fw3Rs8Z|Ngp zlnOzf4lUUM8rMADrDE~O?iA|UW$dANn0HfI;HuPS8>q<8))s6pxQczAF^Y9B zwDa<3s?WmNZQB%Aw5to#3PW(4G|C*+Fz|3rsEzl09;np(AtZ8gRYUVH=zIr4{jjN3UpZ&!eSUU|uAH`aL711kaO$@vnPu?58rI9tvE zUM>PJh&)g4LF98fdx3`R4ji^WhojS7vv+x;UJVGnfc`!57`NNTo1ilTT6qo5u)9U{ z?;3X$Y{D(SM>r3ld_-`a>y9cJ+H~FMG(H609m4mlTk8?;Pe2}6_6%#iFzP`fE_;rt zer3FkQxz$!%csOwaM`20Adt?=8&(_ur3>>P!x?+K>g|o5wZaa8J$mvU=Y?Zlm$I(B zKed9)NYAn!L^r(N2!>&PcgTxeZci}~AuCl89;=C$gqBH(Z8y*^_jogN+x@39rYsOv z%WR0(1Y9Gp+q*16z_-E<5=p4r+FoT9py^K0m|sKs(ig{I9GoxcmdBR$DSOqPD1q;m z|K~CZ&L~7E86Xi`rj$iOTZ&z&Kn1A!mswtWyL9^-2&Wt_fZ4pI%vKJ9(+=JIy0WBT zSlQ6B(b{48^Ix-z&`w4@nx}BQZUKaEBL;@{qr> zs*jBZtqDYPT-n%qHc`0O+uzvAOwb)uR;iB0((&~yJ?lB|VJ`(emwFoHQvjv{Ob4i+ z56V{VkUqbY5gG64IRVJ%vw~#zlk3l@I#`{#AWsZklcG+O; zH&@^(1xz7e-gV~zzc==mFKD>iRN%oW1YG4oYY46{)0U~rbb_P^usVMbkCmv%a*uCaxeWW7r7Cqr*$z_f!llz=%ohr)({@9mxQ|Yh^YUk3laL*9BSM(g>K> z-NvEnO>oofb+Sfzt>qZM1)5i3eB$(*wd0F#!|A>zysxhd7P`#KL!m!FcrHd2bRIoi94%(Vt*EUfl&vSZ#P;8jK@#5opc_S)hkJ z#8lzhj$3$D zuO6nJpx4dICvP3ESOoJE3jFOQkwVXTi91yaKAsXR1L`>p_zXb;-}Kb;9N|T;hyFza zClYhRO_9Rh8AkL@d(>Uyv5&@?;ypagBYlrC^$@;I8;-}lmxq?S<=*9NGIMTjZ(=cl z)SLix?0@Nnw_b;5Ynre=>OA%_MS1kWU5j_w*EGPCi0jy?=ImDFmA9U_P6r`GlzCmNy8+g3OTlL~_1n8Z`I}z+i zu&UCCU3xwHkw9l+-YCd3>PhR`nprp+^Fvf)OqH&(!qu=!#+t^NCKYypSv*WuOV|9} z1>;Q<@N;7V=&up>*@>nZKu-dgjQvc3d>Y2;{7=Vt7UXxpri;Q^SOu{>Ub|Si0_LHs zN2KJyiWIAtDD!mJbgT1v=RbrwuEOgqGyl3~ePP#9iHBd_`xIF9d$5NnrA#qjy$i-d zY8vA4yh>Hift{zOP-eQXJglEnA_ouI*vmu`LAgLxDj(x$h1tq5N37}Kr!}m6S#a@Oy+w5)KLPGQh@+^zY6$5es#`8L$^%bwIxuMrw4S19C>36}M3-GB#TjnvYu)BlCEYoqYi6*^;Pe<6Q66bsi|5KVnv>qtuVr<^uTFr;H z)}@6o9(}YmFgFWKm1I01Mxm7xabzwsEiqjHY>{iBX)*X)=H+uKP|LkIZol5;3NM`v z`h{ei>$EN_R>E2KJiZ3<$Hk9?ooKNumyFedIenXw8yjyY^nitFl)O_OJCF2B>42U zgm2z)8~2)4fXynhKKEhm{eNR~2>1uF>;Tco)2}7i2~yUt1)(E?>&XEA3TuJqj`h0~QD{pm>?O zi#fy`KqT-)GKXTk8{zaccL%J8ISg{S;+8HP%Cdq-ie6A-g!wu2=M3~D(i|q#8D-vF z9Ba10O&_q67e3VY0*k5nGj-4M;>;Dr5x9q=NZ)QlxrVIG+a+rX_CmkoL7z{(q3jQE z8Sk%aU9&)UQGNoEc86MrU@v_LXDIg57pTP$Gl@|4!;%4zm*8jB7E;tHn zDBV09G}6qoOD_|jM)e5uaD6`#2b=X7=265KyhQ_+X}&@<>v}!fY%ZRRwa1vB3bVRJ zKO6UTJ+v zc)kg(;-E!_-pn z5Q$^1jLd=2oR1|Nq4#R@bikh}^yXr71|Eq@)oO*xY%rIamx1LRZH};y4TO0rBsIKh z3ycHsEM}W|6ZqrPhQiIR+2%Vslb|~bu%|GhGt4tF&uWI_VQ{)y&<(HW6}Xm(iVEN- z6fN-hw8N`iDw<-RZ(eM^3^O-}SSs`j30CI`_A>P%^9elCZcbg90_$)d=vLwOEdk5~ zETM{R@XX#kI+_g6`^*zOJcnX(>n+S zZ-3_9<}K#!m|G3`9*k`^o1y*N%*VA+s-@;w;fZn*q)r@t`^^W;2eIx6$d6;pQnCuh z|0v*t3u5q09K!t7rAN%i^Ns<&*L>J~$~>rGALhIJK9%gn-Gx2*ES6s+T2>gH=?T0THhIDWtb3dIt*=!HE8{-M?wYTf&Cr&6fIl)nG(R>!Fh8kh z^VIyzd=2{IGCw!>hsao{xuS3>cDrgpZxfmIy_y$5ZRNxk33v;zxa+%3<|~kJf-DL7 z!GMRrO-3h3gzm#*af!rO-x8&|t6&dnK(oPVhkfcAM8Q5)s36%1*0b>l-^G4ZHckO zTa@}(OSI}d?&A>4a?rU)`sD6^wGiDkMGJ&>Jj1oZ=#!ng82aAFVpAvy4Nowv8>8z7 zH$4roq*w+5oorD<4Sg-OiUf-`|Gu^t*6D4DQJsMntWqagGI1+)`9p;$a<_vobCqIE zswEw)h5=Y$)JIwZ3Ke)Kb?b$w6M0$TaO|7sPAD8<*@nk!sKA>ew6o4m4AoZNZoKu*aiC8J21FMv#}z#k}r?nb3kUaMu;j^T?gJ+r3M+!4M9&1h&ygezLf;p=}a~#~W#n(KVXpaR- zjD1ZdV?Na~uXMjERyPSGXQ8%Om0Xjf=&PMz8SF7KDPVIzHx2vZ{XzS1eG=fvFn5(! z0i_({IXJJ=ODet(JyTDrz#&KJUnXM5O41^kJJR<2@?E00K0h5fFs7I$7C zSn`~8&_+Gss4RSol@_g_Ff4&44kQURsSLu;O8zNL$PA?5@X&JiSiar`X;y3(=?@}&Svh;%tFS6c2ujISU( zc#jvbx?aCIUq!T5TQq|H8p}Gkf$o*Q0dAvPjOmHO+sFpXM$2Z)Cd(Gf3wWaS!ZYtG zUgR+o`|%uX75wb59B^gAI8G-kX}e{cWlYgd%L+p8w(KIhYn8olJtsZpBbCf(5!6r( zdW$t(K{~y7kKq4Rd-q!Q5$@{ZsiqycO~aw)lhDe`MO%fv0{#jQd~AW$bHH*C*LV=@ zR^lD+X#PI1%K|Gt9kL`Bra;_IE{yZ&A$->Z`n6c6R568&%`xB|u^hLoDLqPB0sENd z1jd)*ed46Re+IF08mLnO=Zxj7}%FIO4hh)H=X6m&_$A^hDl%%^|Oqb_H~fxt3^B$ot80*I2N~DY-{1 z;P0~3M_sd__k*zAWsAd7Bh-4>m5*0-h!vjo7HeU=iW6i`z~afMUB%pRA&O3duT!KQ zH!RmJcd+~}CSq4U(B9B_&fzf(xUt^>sWJ8NiRR##ws-?1RecZ=0(Fbd#!$|eE&eJAX@2Ss~^tC2h^GY3LW|FZ+0`zQb zQGaWJ{=CHwV>%M*OA%rt33N89w+S@Jfb$IKeozjw4#YlSr3lFbr^8>DTZ3ptz!VIAuWYZW3F9zy>5XKA4e<$NZgFI zYKr=otb@^dtQkO}@Cd|O7;Z&|brjLhgmNUt$3s2>V`-3&wx&W}02WV5b`(AkRwjJj z!??O634C95?blW7Qx%@_`jK}J_i(wUoA8|EH74Sk`l!raQ83wBq?BNZ+sibd?vpV} zQ_jbA4^tk%BZ}Md1+%>-{)u6FVAt!ou{9yI!@Qm(<+R%@)sc5wvaY3vy{H|Sa#*)RdD2UA5L0`syP(_+aEM6D zZ}5KhTN72gbaL%p;O@kdY9fc#U8;m=;L`!?DZ;&l+r;xOSx;l$Rmd+3HWvkq*SP@H zK^XUJeqY6sGdQ;kTAcM^(Jg_3D74t-0=10_$a*FCh$3uY*$ z;}Jaq+}lFiwy5s_{n+}nP=}>qUUPpFWOrTn;KpITjVp!K&QqRgc>V*dQO6U5-X8sZ z!g(l2?g+K=dbh3j1p2O^1ACGyOPNYq;qu_u`F>_~LX1E4;)`u{GWeuS_|Ku_Z%20X z`LYLSbp=of+%AG$2*v^h8s2}b!L}d|+S3z{cLQ07@OVgJD!uODR#e@#OVw}A69KAjiZT}MX~NsOSu^JDq^vBdDWfIYV-#h?ICe%PE2ic|< zuF%+E&1&%OZ!aDsj8-vuJ{(ltBW)OL8v-_2gwNkv&9`!xEfvZMcx6pf-zXde@-!@Q z_W@R(EfDt6;U3&{4}7EtKFXFss7xrwz>U~rZL<`^pf}?%KcsNDay-V8^?S?QH3a5Q zAXe~X1?)y~9$D!-^^sVk@2reMi*BA@m*dfrw%CGpaf zz&I>{x}-K4<_D2^mV0TzbI_Juk5k`sHhu>6E*|C)A=`@{yB_M2)Dq&gzReEk>q0V9 z@H~YYHsgpffR87xd-_~kKh>Mq!oOV6)otfWHd&zSveqd_K@UVprU%JTtQO8d&T`c&3U+o0^5zOLzpbGGKt<+Zt z68N2fjNEWVf7KihKK#D_i-Wi^+5g5>n){z`(Dv2ZOg&O z2(LH2CAMY2OTfJxpo)U^p9nQbi(d%6lHgi`lzlWSa0_1fb7O0PU+daR-WVc4f0dxQ z6tLAcaV@WV9wd5wmB%}W+k1HX*ey40Qn%Wj}~jCh3i2?66Z=i$|J z+IHTH3vVq@>vr6--ny>1{YUF*gp<)cf%yk*Iy_59h}Nlk+8Kt8g;uD`QIF5JVIhvq z+qQLhbvrvh*s(!f>mcfOp5exC_{I z+fLkT_(TX)dEpDJ$=9lc7~*U5tae+rWOM7kBPl~+A*V|6p3AoCDz=lR|2Pw;Lb6Ko_fH_=$e%lXv9K3^AVKjq$) z?3jr{pbQ2GBXn1L7r0{{K3{>qASip_89_Kj01dwf;he|dv!YO69nI&x?C>sRkAvKu z5vZMQ*aL7-qcpC<$bId#aq6fqH8DG z6LeGT?2Yy zek|!7yy1E9V+3x#P?Oxg6lPi`Xssar;Ik;+dr384w zwY%x9WQUkhunc%dRV(bv1=&ggb8GYED#Be&N}lIV{h%dl>~3nUfX&1)v_NJ}&ZT2cb&YRuDQNK&S z26XGE9rhl&?RK6UYmj=3u(#fByEpBo_Skn3$6M4gLh8ABH`{*P!-Z4dm&!SJflPuf1VJJ>_-yrFu^kcsnaSZ}--_ z2y_yj{Y!uy@~G{cJ-N0w9*Hfw3&d(LiIah(bo;6S`7NwF2qbo*4Re9}vb)HEIWGu5 z1zS4>E%?0)>mf+l(6cLcOX(2MS?o1Oyz~)79Q49I6nhv}n~F<#&Xe+*{dnn#d{@yh z5>eOfygr|9+Tm|@0RB7a2GP51zg93paTh3!=9c{|v}Sni1N%&2*S%+dNHpP7u>C&9 z*W>l@NZ=!!9t*V9qfaBC)lURTo#vbKr}lK*!^?v9GXZm3Y&cj^jm1P$mP6syzc9AVSqCKn-%-)DML6RSLl?b{OFe zb_@Y5)iKl&jGqz7+9ZhV{#Yl?!)`dnM|f~X0-o+ckMmfu;~iX42FONZ`B+Ck-0pFX zF^~g2d_qV zAEh9XJF*>PutgnL2D~hQX^!cTO8`7m9?&@ex%K#-I&NIy$afStRG?W1pwKE`v(XTa z+DoGKqPCOOSLDz+^h9F!ST`@=sm-Tq7@-m(FBUwMIt&7Cb{HLH4inH8!m~nYBX~KK zGXNG9jndC_=!#;%-z=arYAYPwAfCG@2dQRb-AbI#fjkt?(L7Ag#rb^40>_xzOjtFe z@#?Q@8=sG@M>`=l7h)Tz6PJn`iyccGO9>C&{jm3Cj&V4;r$ax}A#%p!=vgjktt8kA zhXz{7r!|`1@cCwyV+&ZU2I&sviJ~=7uEm<`i2hkJZpWb9NakOOqhkZskm6{o#`$K< z+2q*hsD-xdRL&9h{<<2y^Bq`wtE0bWDXF8%vCXj^bGP8!Ti;FXbnF7@B4~?)%x|_w zT#m2Z{U2=IJ|GSp`#kh=VLfewaoO(}4Q<(jC3`*Ouk7luLxSv}!>EV3}=-w9S>q4a8ay$~E@vb9Ic?0WQ1M3J_kvG6&CjKOG zN3eCb=pNzhffzWYc_7Fi3K)D(CE)20`_F-ThB>pzQ^4hTOf+g8PXyhQMUOE4RN%n3 zX*KS8>zCph30aRXu>N)Y^y9UHUb6`#oV_0780@7r5bqUTYC^oYUA-vJ7I37E*Bsqy zLW$N?uX(A{u7n;tVRamavU^ROF#hoVo!=#2M#iH~HwLewNbnX>Gf3MLdkx2VntFgH ztfmLx-EeH}!~N(htilr>vE^>10Y_dGw&!`#HK{cxam*$fVuj~s43-~OJl5F+ZxXM5 z$bgC!ytuuW<@dt8cp~WyWoQv!XM%@rpPIgyI+cG!v0dL)E%)j#{PMtCdCW<*Vjyls zKWuf~V;#X?dqA6$fS+8W0Dh9DKj0D^!vnB3?1~6)?2XyvE38!F{oyz z$F8ve$5mkQ;F=*dV?nwT&&$x76jIMC->!)u19bTCU- ziqkQF46b7o(K)0UsaUI+FWB;aN4}x9jGD}v#~!^L4LT!*w}-LBLJ3ipgZnzJ<{>V} zgTw_r+z0b>QS*>Q%Y--7Al2o=I8UmXQZun;vX?x-BX-^Wo>~(^xVib6rPDq1vj`q0 zydBC2r$i~OkpP}uGY#^bnmI7Kxq#&X$ZH>zDWOyV@F~Bh0I(IMD#&kNJD@JCQP+%z z{;$?+YO-;ZcGcxVsRemoosL-Xmb0MW{f$#~%Y=yAg~v$`I^_T*0C}KOTr-nc6+wB> zV{GAjrWzygy5n_J2G}%Vq$g?Q5T|Bh$qB28uelVsrWy;DJ%7Wx7JmJ#S`$A{d39qQdPo7}P6NlW;Q*6seq zPr=HzkdhOK?`S%M5y(XC%}rZLbemeMt7U8MBxQTmYq`I2U(;R^*`?NTw|wh`HzpE0 z-gHDQd)&@}Zjpml-Z9nQ-E^-0P}3gb9knXQN>y;Zh4Q7cBYB9 zod3C|_S(DEmr3S@r}ED?oyPcGYPzD9Tm)}GSG#3iYuc~+*PCv3E4kIp+mCU*-7RA7 z(`~Ze94{PJbjPY}Epqd4?3JXn2_P~I#7?YEhNfoZ=$d9>98Q%Q zNlPu*>znQo`)*TPQ!BAL$Kk$eKWN&FqdbJikO*zbIjycAp6WfssU=mdTnu7V#(G*9HP=I@VID~(YUBlFb7e6A|cvsNraqiya zOkFS<<}J5$0J6@ML=;ag$uC@A-5;KL3o8$-5xU)%=IFGNYna7DbT?`*p=_uw5NA4E zt#P_^r6qqDi48B^UKCzFNH+pr0a?KY>*CSF(K=^cp*j}kR!6BV;AdvKLgYn~c8Y7a z=DCoPLY#}EB?sSF5WBI`K{pcC(1IrP0_#NA=vrl(<6WDZRop|hU9DmXMQh5(=t{`7 z3Dp&&AAve=t8#NY{yMqjTHaV)kSM@Y-p z$Jae4}(!awc$tW48OVcHgj9|-? zVh}lcH1U&k*`#zl_7kBAx*T057@#{tuE!Cyl|?ervCn||m5;+U8ewUz6z4st%)NXv z$(pL0MwqLcLiji@L#IWgK$ovG*Pl-MFv4p7n0tik-RZt&X#a*c){l2+Psu%{pgw9Q&6C;4bUjw(GW# zjICeYCZ5Aj43{@J6m$hl66A2NPTXeGT&h&9*x!HLd_}NY2ux+ zuH|mNfGj^;o%7wYFR9+eZc)7LsQwn*4_9DcRsBuX*I<>F zUsrwek#1PoxPrB};os8T)UCwP?&t=ig(fvar}M1STe6#V23?D89=Bog0*vodd6 z)Y&;$?_=pjKI#9~!h>a@b<1l6-C45kbmsrrKCw`K;#logzG7u}z#fdV^0gcb-%nf4 za)934`e3p*Tm3E8Bhp4P`Z1+?5TXP1@x_T&?`!64^X6u$fzO2c;TG=!IisQQ>xzev z=m@oJb;a!J0hV#STJC_jqkg1Xif1US(H1X3y=v}=I9sAqF$aojhLR`06N$R&UDVRx z8V^gJxrd&_^S}|u5Nj;+$A8*uH2}1P#su!R#5S(S{aj-r}AF7t% z?Lr?;>>!Mk0ktFa7jR!MA!k3z@_fLWUy^DWb-Wkoqx4S5jwW?u^s$6-*vIR)6)tW} zfTb%Nr$2&r5@D}YM?Oh^z4|Jd^#jY((0Y0GXsctG&(^#p>&F$R=#S!xPbTe}V`;Ds zl~-5oC`#22vYd;#B;Ar@_GGJGn*FD@Onrua0;w||`z&H*V?Pl(fxhK{T752wuPQ!- z(U_tiqR!{C{HgkBq@=UmJS)5Vk!akp`IgcGi)GH5roQnVz~~fNl?*FbP2MKVIfeQX zeJn;G7)L&jkse}M`6d)y#T{6TdPc;pw>j#1VjVNv<@ptQW9>CEYQZ@6Ow_%QKLh*e z`f}_`p)%-BNn2s9I)10ryWLzr0mrG*S0bZxtJhcS>nt8VxpkbZsnuW1Z!Bma(MC&I z(i86nbM#B~%hb{(mUA_?y4F(XA&Du2e6(L1GlfhE^mbH2q}q)#Tt zD=Y7$xilbuA<7f2*3R;7v&Wo+v$MQ4box*4H=~s;&?R-um*;OJ$E~)ixg3%8&^G-B zQigW`mH6aOtTn2?LgmSVRr;;4SF67HxZ7c`)X%V5@AB0r?Ix=%bLI)vKcKP!bESs# zCloW}8noL|;|l5bS=?>=)YxS*CJB{?Eji{k&D%Z9kzHL``R9vtW~%f0Hi?{6 zbN{^>pIHnI+88%#TKh8r%s*Ug;w`UMRk*Y7U}&e(%)-n<&wUl{EYsJ{wC~^ z>a|#m(u?qK>Fd-xxU1Exh+cpmZ|5xQnuBUBC2OiV<0842!$=#=sP&**&BtwAw!~}E z+j@1TiKRNkjrvM5kM*$clDvsHvwOr!slB83L=6M++Vo2;YsY;OY0Sy)DWJuk|HDuz``aPEO!l&~mayqk*<4kAQNO}>ate(T(-Li5C@E$^)<8@BGI_7%3 z{*h(&bhb15i92@>89_zguNl|Na=$#%pD#UBG5|5$OX|A{RyvH{K*Z{+JM;}5=W)dD zTe~F^S2w$|vU&#cN02tU=Q(wYIl~*IMrue89GZu~A7+*1(ma%SBgwu3XRgCs8`bP+ zm191}VEBV^hQphOl!TNy7O@zAsivZIrh45U_rs&vty|q#tE*(ra#c&KG5g({JuSIo zES5RTyVL05b-L1r&-L+L>Hv2ROHdm2r5uoPvR~ghCLE^s6{!g^vM|`JQ z{qa*(yrVo(8vKOcd9)hzf9svlKP~I(PuPDc4R5}H=RuM>2O^s%;5Q>Ww`#;Tqjjb* z>WTW%s$XI?6Jwspk#YStKQTAETJGeX{Bg~R-D<_c^Rc>9y658^zd6t{gX5bMnlshf z$<1k2?Ic;*PqvVPvef2_I7T|G0Q5hlD9~z^8*i!WhiDG*CNyVTqMI$p&mysj&EeIT ztF)H#uH$u-7a^8M;;op?Q(+CSnMVA{*iUILXf7sRA=%?Ss5w`)%x$EhXI1bQTUMp6 zmMhe(N~`RyGW`AniI%Bl{Cylu9C-`PioG4s{V2{vQXv9ZW&W+ z*T7#)VoTJL72xXTRjRj0CH`+9SlcY#<0E%j>;FTUc@*(pMoQPIIh&iez#5ME6G-l= zP2K9wg*V4)wc6OcwRr<#+tsX{%{#i~o7*3QwQG0tuI3E2WdBncc+arJ_7ZC!_6IDn zBHZJL;2neq^*)(bmk_(&e3O)%DLM=8vh>rOg|{Tct`zgNx0-J^SCh53Gv2kIZJC32n%#)q z)T|@zHC5}uop=kJW63esY9*yz^*hHH!_d5~Y$ll__-+D`yCgb? zjNX0N_lS>AI2iE}H4jwpal5|l?ag$zC}Z*1X3k*>`NIMOzLnp=i~KM4idr zrR7w&8m=VjhP``>2eBWw_GeZ?x7zql0d>Z-cv;n?$;b>X8*3Ho-jcUk;`2ntPMoPy z;cJPe!cRf}0}z>uC#63)ufvIqhhK|OK8lP;AfiFgCH1~6MtLy&&TS-lHr!BWR}E@# zHIbOzAuaRC91JTftGH~r*F!D!B49;Yyw0|^7w;|)N9;slCI`22ff}@+({1tgaTmpCHlBYj;z@p@i&_?wtR-Z>v}GA#SGF}rkn6YHQoa(_ z3X3-%^v4>SYmHW|BSWR30(UzfgyDLJ-+$}FTg6JxebG2nC zp@_4M?>1XbwD^@&;EG(w*iXUTvaINM%Q4g|P_uTCt2K^{(h4#&@STfF^EjMpIo*<0 zeA03z=Gd8*v+&Qi%)v3wwdk>;UW9+4X*-WQ@kGfDHDes=-z0WT z`7Q8vOCkEUy2HUTw;#82N3FA7y|-~!cUuo0XLedmYQA;+p=Ey7sH>`VDMpBlWLK$3hoe$+hIJS#Gr|cGeA2+k8OoG2hBy)$eLK>cwTIENpJj>N#42YvlTPRnmdfl+TmC)>S|J- zy7RNhb-P8b@Oi5hG+#YhSMLgmUtqXN)*ZgG$WV(Ty5QOt8^)<4SW0qs*UU7O8!Cu> zh#dQ7c`feig~%;4BwOZEJu+$x^9+kBvnwiLKdMNqtTNOYveCzBRYyt9-DS0g<>hnB zs|}0t`m5{2bkcHHziyEg!>u%uoY@RR14{4bHIf_$oX-McU8yW2<>_cuL=Wa0JZk-L zCKsx2<`PbhP47Cm4Ugip<{_*B$?9~ z(eeu=OUV&dko}a>Wrh*u!;#&D_n{-Ts}QBD))-bBRvIQZoy82sw-|`6Gpr@~W`8{_ zPs?mHNB(@fMUFWdcl-v_xMW$)H^SSbwziqDpW3^}?HHf<%!qeI^?B^2j_TvwE^9k! zYa_Y4U5mEB+o~R=$}&%q$QgCjz^a1t*kQTCxTh>V*`d~boZH>nNy;~?PvBkuC3}n2 zQ@THCe-E;E|Cbuwk7V}FRPHsnm)K*J9&&% z`zMfn!^%HxIBDqgPobo<&RN45*mzbU?;Nqr9@c8Z1&epG>P+#il8f*!8Rpi8l-{d3 zT6@`W+j7mW7`Al`z^HERxNfK`h$`FOaTU4OpqmxDI(By?*R)%5ajiRcT3rp~7;agP zg#Hryj#UKbspjt^yipm18ML>fndCGX^xbmJeZT!w#2k$ypX+r`l(mw(=rTt0XvcoE ze~=vGzTtp+OxH>ysd3lP3O*qAA(TBd98ojOZ5t3j+`${F$V%5jvak;0sYapDu`sl~-EgI20vVO-r1nj0!%gKCX3#9A~Vh)@Y-HaS!rFJ=H&_ry^LbNURBMcs)@%#yH9{4$ejw zqr0Wt)2JiI+(~BeSfd*$akZ2`?whrxw~U8%)K9JD|5WV&67eCA4UUNtcXzvM&1L3oUv;B#mT{(WHfg_K zep=a#(n|$%h=&ovNX}F3{usNt#=W?1$7+{U&M?l$b7&Q5Gm|`#I@>evrNXs{3`N=P z@_zVv^L*pTf>O)smr}40EiN)HFiu9swcEc8fSl{Xug zk?+FK;}b@0*+x=kF2}jnKD4Y6Bha5aW$P^~`38)uzdC>J))u0lTTnB^lCP+lTM^x6 zj4s;_-XmwT$+*+F8{RHx2ZU!I+3zL$>9}sU)ppHg`$%*nxzhWIZI0r*BiO_1?py9^ zrw>A@vxeA-1xBL2<)TKG2;m}N+XAX*p9vADsUYFX?-8@P9lrJ7@jgFwjD+M zH2gErSz{{3^E|9{_1ay4jh`8iYi_nK8m}U9nMBS06=GEuTrys>#ID0Sn1{C{<4sG< zoQwAb^_g)?jfaudw~2Unu)j^La(n}E)oMoTjCwV{vy~_J&7`yidjqkIPh?-VJXgAE zwmy;36@Sb&;{bJz-7{{%m3nA=V5u`uy>h$I`vcXRD`w+f%PyXVa~rRY8bfkvV_
    U^0|b{umf(=wLkqwyq@v$WmWgQ%LNq)wE2@5hrP3P#o_A~T`7pw`Upn`DV7 zMq_zq!T18%5-}94#!>kWBSyln(vP%#Q@!gtTM;ldF~`Rz^Zg>&MPI zL$08bhr1TC-l|F*YaUtNUq&JShC0%tTgPKu0`ohw18{#kwBE~iM22~DQi<;eT3ung zw>p!E8`;YpSJav20pF9vI_o{XAJgikmX9U$Q9WNxU?&f83K!E3P%3#1mS_S(PUdJ5i0K;|e9KcB)lY zXA3TcDJ0fVzQ*c~N`ETP`pCz~lQYATv#i^BXIkRsI@$2Dpb4!Lu^->94DTAP9qRaY zwwZ(S$s}h_VXm4xg>WkNd9BmbSbl3^Yk_K8_pH;NVYzxmB&Ya^OmFr2m8kJjmF4QX z)4jzql$JxdylS4d_z~%Kzeo7_QfoDd*0k0V)~PwGs;0vlT;0%G4>pqM46>g|_V|5k zmEDgv`%k0YbLJptt|f0CvF5if02e}wS{Ju2XJ&ZcA(*to^MAus;F~x4hLfk(N8p=4k7o)`P8w)jAWc?j&>h$<`CC$4S|mCsxqT z+C$WyTt?1$=tAq6)=S{IRxO#S(HOytt!G_W#^_5m8 z?yJ}6m2j_R@NF*X! z;`k}DTEeR_j*!8=0i#a0t}a=mW>_EPv7Jj+nf6u%HDpp(z`g@|M7+nDgW3kRJ@(Aj zVB(L;@7LBJR#ovPGP(o0Wet1eOrj&&hGKpU=~jlP^ArB#_J^Tls8#9sCuU=3<|wO- zuDYWwF$Y+~RgWcS;|TATIxk#dyS2Hf<>uPXZJzL)Aa|>1XS*J1#7m|5ii~+GtE&&* z-Aa7m`I1NkSw%Xt#haWdJsLB9zqYLhtb375%frU6g`@D zpdD!^+L?BtU1>Mko%WzT=`pkyJ(l*SeQ00WkM^en=s-G%4yHrsP&$kbrz7Y{I*N{_ zW9V2qj*h1j=y7x+okS0R`0dJnyq z-be4J56}ncL-b+#2z``3Mjxk7&?o6r^lADGeU?5)pQkU-7wJp%W%>$zmA*z_r*F_V z>09(|`VQSh>u5dQOt;Vm+DNz3ZS-CG9(|vFKtH5unxR>mqj_4OMOva|TA|zN4*C(@ zkLk}0USAJd?nTV-lGpCYecLQkgU+oylM_ zneog7CX1QKWHUL8mdRx%GgFwU%rqvC$!7|fLZ*l*W=fb+ri>|PDws;9im7I5m|CWe zsb{7$4a^Ltk(tTNVrDaQn7Pb6W_j%3&0)1{E<2f>!cJwUv3YDh zTfi2wMQkx!!j`gSY&l!OR(o5vFq6l>_&DIyP4g>Ze_Qz+u0rLPIec&o880i zW%sfB*#qoB_7HoRJ;EMkkFm$u6YNR$6nmOI!=7c&vFF(f>_zqxdzrn$US+Sb*V!BF zP4*Uho4vy}u{u`IHnT0Pfi<$NY#V!*y~o~XAFvNunq^p)gd55YIdV>%Gv~s&a&DYE=fQb$V>mBvEa%Pn zaK4-$=g$Rjfm{$5%!P2FTo@P5MR1W^6c^3KaIst*7tbYd)HnYq@pY zdTs-^k=w*==C*KKxozBbZU?uM+r{nX_HcW-ecXQT0C$i(#2x02a7Vdg+;Q#%cal5B zo#xJPXSs9SdF}#tk-NlQ=B{v8xog~Y?gn?0yT#q+?r=??yQj^_kUg0JMO_-ej}ujT9bdVV_Jz|Y_t`I-DIel|acpUcnV=kp8r zh5RCZF~5Xg$}i)W^DFq3{3?DmzlLASujAMA8~BaFn@$U${*v8^C$R|{3-r4e}+HHpX1N-7x;_(CH^vhg}=&Q!#7X}Ceg+an#VTdqP7$yuCMhGK?QNn1!L2wkD1ZTlTa24DHcfmvO6vhZ%!dSsu z@DY3kKfzxJ5CVlDAy^0zLWM9PT!;`Ng(x9fh!J9iI3Zq05XK3KLXwayqzI`(nvgDJ z2${loVSAO3X_E?!c<|JkSF8|1wx@vBoqrJLa9(DlnWI?rBEeQ3pGNm zP$$$2(}f0MhR`U?6lMvtg*n1pVV*EwSRgDE772@mCBjl+nXp_~A*>Wu39E%Q!dhXS zuwK|8Y!o&Ln}sdHR$-g4UDzS)6m|)_g+0PvVV|&HI3OGp4he^aBf?SPm~dP;A)FLW z38#fK!dc;*a9+3|Tof(|mxU|BRpFX&UAQ6K6mAK(g*!r%pcC{$v(O?K1f$R@v6PT&PW5Cut)1x08VI)q0;Ke4|!KpZFz5(kSz#G&Faakw}_94U?x zM~e=kqv#|$i!P$8=q9?09-^l>M)VTLir%7+=qvh({$hX_CCr)rMOC5Ev^yQitEJn;s$Y}xJleBZV|VN+r;hS4soZrOWZB) z5%-Gw#Qov{@t}A}JS-j&kBY~{fr4iCdX_Pcta*!M)C&^iIkz6G=$zAf0Jf$&`mo!%L zmV6{%$xrf^0;E7GND7uhq);hL3YQ|JNGVE+mSUt>DNc%)5~OibqLd^hODR&SlqRK1 z8B(S+UYa0fNfV`PDM!*uxzc25iZoT4Cgn-_Qh`(`6-mWXiBu|;N##<7R4G+S)l!XA zE7eK$(sZdonjtkxGo@M5Y-x@(SDGiymljA1rA5+WX^FH{S|%-*R!A$QRnlr{jkH!; zC#{z@NE@Y1(q?Ikv{l+BZI^aPJEdLHZfTFSSK24-mkvk=r9;wT>4LPDm%E zQ_^YajC58yC!LorNEf9`(q-w2bXB@0U6*c1H>F$BZRw8GB7I07dLTWNXo-T5P7IPOdc+ekVnd+ z?k|Q&a#W_D!a+Gv)E}1UXBdC}+z#vR2NOC(Bdhsq!>A zPtKPMk{8QMAxkWa}M!8jPlkdv+R;RvZ*Z#Yu5iTohNuO>tK|6i;Q0;-!pL zycHkCSMgK)l>jAB2~vWU5G7OzQ^J)9B~pn}qLmmWR*6&Ml>}v+lBgsp$x4cns-!9D zN`{iDj8`ToS;|BuTgg$hO0F_lnW9WprYU(!zEYqRDn&}MQlgY9WlFhHp;RhWO0`m> z)GBpKy)s>CP-ZBN%1mXJGFzFW%vI(o^OXh4LS>P%SXrVhRhB8sl@-cLWtFm8S);5~ z)+y_i4a!Dkld@UaqHI;RDchAD%1&jMvRm1s>{a$D`;`OALFJHgSUI8`RgNjgl@rQI z<&<(-Iis9a&MD`W3(7_1l5$zOqFhz3Dc6-7%1z~#a$C8hG$}eouQV$yia{|dtxB76 zSGlL$R~{%26k zr_0Tevi64d8SQJ@FSi@p+uFx;_;sXoWOYpJ$nMZ~Ozp_;sOV_ynAI`6V@b!Fj&&XD zJ2rKk>$uv{)**IC9ZJV=^_$h!}^19g;INCpRZ2XL8Q4oZ6fKZJ;(t8>|h{hHAsK;o1moq&7+$ zt&P#fYU8x=+63)5ZK5_wo2*UIrfSo)>Dml!Y>t0UT#jRobI$0T9IaNHtDUT!qMfRp zrp?plYYVi6+9ECfK?QB8woF^DtSEIn8;^1Elqh&Mb6P2ryTe8Qqmi9kF2+)*s?WOKYNP=pV0)zr6xc3 zj7Ia!a~e&Lf$<3$iIL$E$vr+F_(hNJDXQ<^dkl|D4o!>;Opc6?3ykS8ASEd>E;K2r z$LPS|2(yJci3#zEq`XI9Tu6`j>i_l-7m!OxSze2A-uR^auuS0J@ zZ$cQ)?6;wJpua&lWcGW|htLNQ`k4I@^fB}a)C1}X^@2WydPDY5ALujabLb1`OXw@; z@6gxKH_*2b1$_s75A}t9fc^pf6Z#SQ3Bs6W{{sCA{RaID`Zx4D)DP+p4S)thgP_6C z5NIeg3>prNfJQ>2pwW;6Qg=QK8Bp4ZsC^@7Ic zG*tAW#%9=GG&XiGX>4{w6JFNX{Pb6i4G*n;MPn25s>bH?*EBYIX!h$G8=p5cHt)Wv zu{jTwy`{1F!xWGmXu|nJ!B7Yk3WY)8Py`eSMM2R}3=|8+LGe%mG!9CHlAvTL1xkg| zpmZn$%7n&46QC?;A~XrghH@Y+lnYIUra)7nX;2=N4;4U#P!UuNl|ZFX8B`8cK$TDx zR1MWYwNM>Y4^4*}pczmjG!vQyje1*S^TInCoBa@O7@ObT)!4|;`u8+83GZuc{{Df+ z#t6;-P-7GDk>(jyHXnYhvAO)Q<{8MQ>JyEPQxA>J%RMzVhoQ;6G&cP{)!00OHuu)p zB-?9js6HB-d(h&~G&bgI{(sdu2KfI$vHtbL`qvNZU%zZS=vnAF=y~V`=tbx+&`Z$E z&|jffpjV;Spx2={pf{nnptqrSpua)yLhnKELmxmNLLWgNL!UrBpq@}K=u@aSWDoU$ zK7&4ozJR`jzJmS^eGPpBeG5_0chL7xU+4$uAJ9LcAEBS1pP^r%U!mWie?k9-%yZy( zupiVP8UPK120??NA<$507&IIj0gZ%4L8BoD$PsdaoFNy;6>@{zArHtC8UuMjVC%g~Fh4C<2OvqM&Ff28xB^pm-<&8V4mpNl-GB0;NJ}P&$+W zWkTbj2~ZX^5t;;LLphKZ%7rFFQ=qBPG$;?shYFxVs0b>CN}y7x3@V2zph~C;s)lNy zTBr`Hho(af&OjPkJmr*^XLCmndia(sptNG@_Ad||8}+-O#oiNp9KTK z=fEKFc`z7!0Sp0O1Vh2UfMMWEU^w_P7y}-vRrAJ;9&B@9=W|JLu9&qv;0* zg8jj-z(L^q;9zh8I0Wng4hR1MjsU*^M}l91c>mE9;N>+C{4gJV1f!pws91ebmm+A=cFkY%7K?V6yUJVX;B+t*tOC=(6JR>n4<8ybz+PY`XhM8E_%Zwm;1Dni zOaLc>1HegO6^NGy4G-pkmq9H!0v|wf!4PmV*a%JmcY;&Fd*C$iZ5NCYI0MWF7lH-g zZmL0@i{i zunwGx4@mW(7d{|O2SdRIa5*>wJPbC1hrpTOt7vx?_!>AHoQV%rbHKIWT<|4)z?uiT zg7ZOdZ~^EGE(C+YMc{mJF}M|60(#&B*-~&fxD5OjADothm*KAf?}019kMW^x6}S*w z4Q>V3fC9J{{LB}>Z3w!8>%rI2&kf)J_#44ka1*#0+zf63w}7X?tzb{gyKUeP;C3(^ z+yQO^cY-&;U7&9O`U*|~_kac9UUNCP54-^G2YUqKx6?ru{z33{_=mtB!NVX09s%pX zqu`rC`2PpMh2U{e2*z9m1Mp$=B-jX^0#AacK?i(5Jp*cR-<$>C2G4=Ng6F{(!3*Fw z;6?Cb@DkV?ybOkdS3pnjD(D4X1K+^7T?dok-vH~uo8WBl7PuC?4ekQ(fbC!t_zFHK z>%cD*{B0I641P1X4Qv5jaK9VC-SCZ|4g6Mc5ZDHu0`G!v;`sN#2z=na555Ke0ayqB zA=m`cAcYU(3>Xcv;1G}llRzGv2nt{mD1v%W0x#kNybS)15Ah1<1Ga-x!45DUd<0$v z{|B_g2mL?5X`snm4r)HeJq6l;%fV;BQ=lyPPyk;6pH09$2tE(K27V5{4o(5z0GEMpg0GIln1OcS+n^8l z4mbq-8#okv7knGz`X0Ck{`=q`;0NHEM6BuHPVghJcM?t)dE6urJsE{s1ln{{j9D{r)F7Bn|f-xC-m*Phd}cDf2Vv0R94o zfWLy7;BO$6q0#&cd>8fq4Za8d4!#fe1FKNpAN&CR0I&i6K=4c^<}_#k2ZJA?d)@zz&DC>EOqRH-IL@XMi8UZv>wK zXMzdfEYK624bBJWfCs_3;7xEIX#NYP^TF?`@cah{gA2i7;3BZ18qa_5I-V0tz%Ow8 zrC?(X)-Z4txE$WKQ zFQ}P;=RcUxi03~T4ITi$#&HgU@6E)$2%Z6tf(bqGya&gD$H7GK1egS#1e3v2Us|~%9gs}@GSKl^*r^6db`JKJzh2aX7V%H z_wq6I>0#gF-5&4t_^`)EJzg-qXnKo!oBGxCFO#>)*YpDQBJ~&QCF*7Buhc8ltJG`M z>(oo8zna$Ir$mzGBU3=H4^1DN!g_`G`ncB*y$1B@*Jrin`yPFJ*!FBT*_m#e?wFo6 z*_xg+{l(P7v`F(@pJ)3Vvp;2j(*BVBLHjxOv+dW}ueIM{zuo@V9&b<;JUxy*}^NWIEgPd{0d;+owu9vwQSf(Cdv) zpXv2{ufSd|y`p+W_jmR+o>hU`Cc>Ji^3wog=_9zA;Y*r@3`-b4E? z>(BX`>2=c^rZ-J*ncg1&rM&LzBGMh`n&0C z(>JDXO_b?7)Ay#nrXNiIF#Xf?qvi4GxPy?w!)L?1|HIy1g4W~v>BdJl; zXv%?dq?{;c%7t>J+$eX-gYu-tP+rtn%A4|`d?`Q5p9-J?sURwt3ZX)&Fe;pipdzU# zDw>L+VyQSPo=Tv`QHfL%l}x2jsZ<)3PGwM;)OczFl|@aYCQ;c`4yC1Xsmat7YAQ92 z%A@kB0;-TIqKc^!s+20D%Bc#f@;}UgIn-Qg9yOm@KrN&eQH!Z1)KY30wVYZ(t)x~_ ztEn~AT527&p4vcdq&88TsV&r2Y8$nk+ClB4c2T>jJ=9)mAGM!4KpmtGQHQA`)KTgf zb(}guoup1tr>Qg4S?U~hp1MF?q%KjHsVme~>Kb*Ox;qx4iW)j}C4 zBh^Z^QFp0()P3p!^^l?|hGHp>;wga=pE`qb+X~xC+bY{?+Zx+i+dA8N+v&Cqwli!S zZD-ofvYl-^$9A6WeA@-K3vCzKF1B4_`{dkOW4qRNo$Y$t4YnI?H`#8s-D11dcAM>X z+a0z$ZFkx3w%ud9&vw7<0o#MNhinhq9(k(%lkNS#@n5rh-R=#$H|^fCd)v;&?j5_o z*}ZG`p56O)AJ~0p_mSPlcAwbwu3ufZag5 zL3V@fhS&|Y8)i4$ZiL-PyHR$d?HueJ|4aKC`)BN5wtvn3UHiA}KeYe5eQ*08?0>Vj zvA4B<)&5QU5A6SD|EYan`>*VOwI6BU!~R?Q&+UJ-|K0v0d&=J4{wMnZ|BHM5zn|Ct z*V2IAfxUxz2lo!?9ojprcX;oJ-jThddPnz;=^fiUu6KOzgx=$NC-zS2{pZIS-uJD( zz50&s`)=RQ`r7vWXJ6;Oo_+t?w@=?s`+n7TMBiWg&gk3NcV^#`zNLNl_np)C$u`FK z{fPPmv-ku`=6}E7`-R^x`hM~Ef0(}i{^#!}_RZ=$L9Ovkuh-Re^OIh?o>)PjZ1ey6 z|NoD`42O5zZO8szv)k>1z|Vt4uU=&-lRwOL%3K<7C)hsjerVX_g<7GZGU7AOIicf% z8oW%RKku)drOTq@vc6NTQgsGs7!y9(x^cvC9Ywy*ON=D z2Y8e_j4Weo9CKf;zvH^mo$?;%-y@6*vy1pChKunTU`>l!gZ?i8+hCe@>=gL`h6a-B$yB074uenNy1y>yvAJ^_j{7f z#8mAWZS9nRGVh8H8Y9PS4;>q0pQ1Q_;}z?2Xj&*0u#L)+8xtfBLlvObIjywUvhZI^?`%Cr@P)_XqLxyJvX5&ErtWt%`n(?GmH2B)bIuO!A5(W19jJM;{zCmRhxZ+I`8PdA zj5&&5p}On;Wk6LxP{8THH-b(F{T$lAAuMclL|SY@!l;y~sVP|tw92%?>XMqqBF1^A z%R64{+}3%&;~NpEja(I5oPKPwXI^5#qRP$FV`3NAUzs}3(-eMk>MIqwF4H{h+|K#k z3EC3!Tf|Qh+oBVbwx&mCPR~D^A6;x)dcSO5byZDdZJ75upRCBybq;k6!9B)*6*Vbp zW5i!)_{S%@G`c4Q+za|O_W8Ioao&?(%O6zwmc!38MAr`@e~Fr0`(=cW^S;crldqQ- zReF1T-qdm@^OZ@rjBJVoyYu<@| z8GiEuJ_!sC+!=T+I4JZ?xNAgv#J{6mqdjAK#n;9Uj$fVpZi+7Tr8HCKobf#;v}XNt z5cU}JRf@MXM%bcq!tIMnL*Sl-Z)qY<8uJ$K~uiQ5K9QR$4G%EGCv?V@w zC%sg>r{?uKx4JQPHjb}2j&q&i9^ujMIn?V#@BQ9oJ}>)C^gHhVAo!Q?OQB7npM)Qa z*dO5^Mfn|w{##5|%%qfI8NuF~Oik7f|I++-3)UB<6(2A8sI;l>mFd4VWIJRzX`Cy) zW_W)alpS<0TQd(cIa!FS^;fEpvB^7!#FH@L76F_=%ax zu5-QL&vBaiT-m!0gB=bzyzY3^^(VKL-f#Nb2RMiRD||pqVvH^(J;63PHFIU=3*+C< z`eQ;^mLb$TahvO4AEWQtpxZ(31^0*>JN3JQ8^v;kP5i=)u?>qImN_hUXmFhEc*bd{ zvzR%~S#)-D?ddwn^{(r3_uMgee17yF;s0%bQ$TFMC&6B!Bct}j>`lC%_%Kb*em3U? zt-}`tYr*0X->blTyD^VdE(VX=|@eAuv*$owRyh@1%rob)b3J^%3SQ#n8M)98Oi z|B#%Mu_I&T_@h}{w8wKN<@x9TTzIDRO!+5n*%iJH|8#10{l)cCVog$OT8nm7$-(-= z^=IqToZk=ho4VRPGc(ococGYODK+0aT#GW4JNpdtsSBQ!Ss9aD8(6wDvtV3ajdsG{ zA`&J#N5oXJE+4opoAPGC{7END?v#bO=H>Oz*z35{>2;Su&aUoXd$uJNdOCXr`A_yw z2}lhL4_p$sHu#s2n9%sJ0TFM;g{Ax}vtz=jtop2x6Qd`+k~<>z#MBoGf(yb5|EJ{r zy3)qY+LNWmhG{OJ1m%Y8j<2ujA5reqBRVt2Ej~HZDXU-Jrv)#Biw-|K^>GSyn&AAC zOR&o#_g6ii9dmqayWiSCIgkrV4E`|ki>R!`<%!=Uy_FuHo{{x(+LG+T{P*w=QlBje zE=#G*tZ}b*N1HTv^=Yq(71dX8owu6tovO)i^l3tYM)M*9A;vXvx)r8l*IjhQ{!r`xu z!(4~E{oC!^u|@uK{AUF$iYSR1o1BwAvtWKfT47napTm)c`3@5tS2@1t^p4YT=NRW% zE?ZpwaGCC^bA8?I6}NnMXV1BwSzd15zTTzY&AtX-$v53E*KfMtCck(6T>?f0)&^Y; zS`_?i=rdsh!}ze+@SYL15yv9^W4?@yjQuvQG4A`6X{j;kzh~Z_@NCw*S$AvlHJ=?~@*zQ4&gJUC-T<_hM;7O^D0qo=)LWljanycOKyRWz8>R3L@8MuXTIH z_mO9HdV8af;|P~Rw||Fx9`;ta5I#B6V|=fyZ!3KwRy6!P{yoJnJF$9d zZsE0}^zzs0mxnG3D~!J2aNgk;$4QRA;FsN5SDpJckGo@zc^&aGc{zEH_IbwdE5A$r z9|b%g{B5X@_o~nxp~le0@Sy1N(XYk~P8y!ECqtg_Ue;GxbF-hx;c{y7{R$!r!U~EC z9uyoZx?Xg==22aIbfLpV2n&Ys@w-opZIf(L~4j6N2(E#}{eJCe_*>`DJ6RjWqznN)gN?T>VGdZJ~BU=i>-+Z ziT@+@t*kq~DP_~jpQ~$e{>Y_YP6oFs>>nj%e+3zoQCaZU0n^(*st z571YH)NFG4#QBCx57(it_gsx`L)^b}|C>jI*G{kB#%}O_&gWI1*L~jine12a|FHL# zQH?zPzHc|f7-NjPFz)WkxW|EngeY;tl0XCkNgxSefR+`IO<>#lWnWqrH4y1OdfmF{}cso&?zg}5oa9HCwKQ0NgEL`@|vB_kwy zNw##QthZu<;*iRzZmwZ!rl$@}m8PE6frg|^FiV{EE(`DlY=!p4jwI(t zXK(j(H^ZIo7I>a`R+mWp*`-~|Y62C(C{i<0FH!<2NKK(#Nf^((#O%wS%stKjoh*>X zOXsQgrlspd#(nm*!hI!uO2>r5>wZ_f7PgWHl&@16*#>J`9^rag5m&IoJB>4$43qbe zo5uA?e9V5%KFK2qMv1nImrCBqs^yvL_v&%F{kq-;ZWfU>&VuG{%iHMK=$h)@R9x*H z>w8?%GW4>ax;B?c?;E-~o+^4;wfI2w9bk*IgLRj)Kem%XjZwezXVE}i% zXuQguA}|!1p_~-w93P`3y0lBFH^9v}Rn;^}o|Gb9DP3RmFrX1FmUfk&wso#J7WnP7 zYmLd@*qunjQ<8L}B&VnoX$b8mE0;HjA1$0E&Jg#OWJo^9I>|)J#+tOW-nxhSBj$MP zJLWHEj%$Ux)P2$2)8{Xt1zACtxV5oK?!mwa?jwFT;TmxViBI~`u-v%ZJTp5gce5wC z2o95IH)J-Y-50JA%}K5hj&R$I$4r~uF9Lc?%e=(}_eqPWbLo8gDs}{?6X$W#K;c5+ z_T=`m@v`%(`RdN$zGph%g6p$_lkL0Je9egvr+V0@=KB^zn|vS73*4O#b-Uu3Yz;^ z=2@ENk9SWC2z-6&LlhnD5*?v8r)-RS!z8n2q!qH0IX&qp|0ACxvWaGi4vH=(KM#j_ zph=hIzvLaYc&dx^JRD9_YJ6(GYN@dZtcz_-o63I3{=;$FnNkG$)V^S8k6^p1tCS$K zSa36Uf}>ecAKyuG24x{Fov!6C7V)IRHM@#>`|gstoC}_-;wlS`9&qZZCq+!Qk{!iq zl}wd#e0NCQSVLJUDyn;CTu0^_);m63cw9OmFHRmCI8`~gicW6A{LPNG?%<5#I(U8f zO9kVFeU1)NlDO=+Eg3$PC|huYxru_gB&j<5BMe*(A@m zv_&;D6x-cXNKAT@cuB%(;Ytx9CMjVxTeBtQwc)LCqv@b!hV_i~Vt%=sU5dt^WzOVn z5eFnz#UAA(-C1{k3T_yk(48md8zp?zCtWwACg)RbmxB4eU6toe9Nl*#)pW`p?R%c( zH%_#{iLr(eqz|M@HpDwDoGy7UeWp_88=TYJq;TNxwaU(lfhj}NLwO1IZ61)cfO?Ty z826doi93#)%k99Mz*F*e^F9dLidIT`N;O(q+Em?CLxy!qZf35&;HdkN+fnqfsLF3B zkEp45?28fI(xCHXIJRp~=rH(w$%LbhAO6}W{h3wlp4@Wo7VcMW zZ=Q$0M>thr9?E3B| zx$k=E0nG=-e%|Wj<=)rcdHzhQk~xGG#|d(OsJ+=ebcZ}hF}q@aN>B1prY%8(-HlePBez=&F0=mnpYtEg2Ea)|_>My5wH!T?X9v z$r@>=`y76V)3kOLJ;>X|t5IjAi3~@xFw+g?tF$fdMlylo8#UKBUcQ9$rRHVcY4+lh zUMZRJTFzO%MC?%|dS?6DS5O&eC9V96SgU*v>T=QxYNexfAv47&T3RZU@2-r@Hs})Q zeEHL2G?1k7kfw8@dC$EO^y?m%H7oxQ7Z<0K#MC_2EY6$Y50aa8nOEe7wcE3VSs`|+ zeOUUA)QoUouSryud@{AdJeTy7yOi`OVP*UV{z+{s%P;G=+@rZWy+PON{7*@4;g;kA zmqCiCW~wJ8OZV}G4LqUJb5#q)?c>W(SvJU2blD#+q58Lde7NKnEsmL%~Kdp)%gw}#t^uNNA` z>%+K0t2^`Jg!@!iN%Ay*brae&Mn?QD=4ydP*ezAVa+#l)yIbA` z3dCG%SCWpbqsB5t+;naf@04^PX@-!_@Xj$lrIj+{1X04RlFQ0j z=I6G4lyBt5^aYGD%*Cu)_B+m7&XA-4cZX0ankn8dZXvy`f>qyB#%2!7eq!B~*V6vV z9#PQFHPpStv(|UR|EuC-jjEPR`ioRViKi_|SkIcly~n%Hn~cV=No3 z>vMrZkLRc-+dnqYhcUdOGyOJ&LtoF_nLJ)9O_LZF7>SaTw7*pON`SeH%U}(c{>Xu; zXY}&qXPJ!ZgLM}Z_Ok{_s-#zx&l&gSaon2Ra_PqE-%?sll58yrC7+}37Y>tdQl0W{ zA*-{G)-@#w1y;>4ZF@&LW2kg~^~a=g(`L>Yc8`K3n(Ous#%8&dtRiz;RUgBBT3=R7 zDlhG!VNg&|+d`g`*d=idwH3p{Xf1iF|LU#qf2w)GN=iGeSx!AKJ8F4l5e5&`WhTcc zB5ZaRkNr^DJ^h1zr=_#C(ms|tSbD$ijb14ILu*{wpEFIEZQkx7$L-~}uvp7MI*+uM z+JiMUZKCx`$p9W=u+y`6k(SMlaqgnx_~1wBRtLSTxuBU~zlx@R?Vju%6-OlxrJki- zq_1IHxGTbefOkaAr4OW1jYmB(eNy@u9VP3wv%{FsfMWvjn0l zvjru>u}YgNLwzadXU;LTBj-Rk>{l$^VVhp@HPBrxu*|S4N>WKWIwdJm`BHn?F(QAR zYY43kL(Cyb*UOq@*fJ2^RVVDcRDuLD1BJYT^ovH4eT7J@bJ1q2Yc$O>SUP2<-<%(K zWGt%ROV$WZi#hrEq^+a}lo-+_>Kk^YI9GN^-8+4bev6@pF=W=}-Efy}}Z3VKj_QGG3ST*kB9q25)2gqr#~e#UHOrFxWwTY-@#k_*XyQ+Ln~B=z9$OrM^0 zGjF{A@4%NpR4`a4tY0h1P%J&KSX&0x?3?nVH);IQkzTu^F7~1Na z3RlVr&)cH0!QHgki5Iw$yv|ayyiBf8x6umIex|)Pf!1v6(t;~KHMO+Po>gcaTYASm zg5qJMx)sV(o~F6i`75L!YAZ<7-etIiz?JlN5gGMN)d)q;`3&c*UeTQaxz}X(eepX%}fP=?dvG=@jV<=>+L6=?UpI z=_%C|b|S=3l6jk=7=pbDwqjB=`is-aq`dDMIH9;%D#rIt`jspZrFbv1P@btQEJ zbt82Xbr*F9btiQ@br1D0^)&T7^&u6a#^pb!zNWsTey0AWM$%f)I?!6v2GNGnM$*R7 zrqIZ=d9UqjzY-%j64KS^(Az8`o>|0#Ks`iB0D{+ixE z2N^RMv5eu25sc}Kk&KCqA&j0362r^TF^U;HMk>R=NMZOHCWe)vXV@7&Mn2;#V8W;#;N?dH5C~jHY$T&{i z{J8kIgt*CZk$7nu2cN)xL2v{$~8$_&4$2~&_O-;J?1}7|?78gu>{vFH9mh^&v)N*{oSni>XY1IRY^T`Bwz6&Pwd{TDlkBtX z^XyyfYix{7uo3nXHqL&@e#id8{>X03Y07EFX~k*J>BH&E8O)i?nZlXPS->H2=o|`% z%t>XdI2w+Sq~~ODJe(3v8K;`HiF1&%mve~oH|I3x2hLM z+)vzZ+~3?ryymq^w}`ilN8*j*QF-ya1Rjeg;Hi1(JOj_h z%j4zn+&m|*gjc|;<5lu1cq@48d0Tjgcz1X|co^>+?>+A^Zx{a$FNV+OcjZU(hwxkT z$MC!JJMxF|2lCtSr}7i|v-t|XfzRVF;V2 z&;>d{r63?E5NsBd391BcL5X0KV5{Jg;DX@1;H%)A;H2P;;DF$wAS>sxfDoX9FM&k&q9i5rf9jSM>1Iy5EYB8qD>;bXqCt-a*66idqhf+Ty#YATy#uyMudva zi*AU%h)#(*C67;TlH5LdVDiM|p5o5QgOl4NOOv(9`eah_P;q&3Y4V!n4av^rL&*=4 zZzP{iKAU_n`CjsgH9xncp{3-cEazip8{*~NC+(X=0++W;J zJWM=ZJV883JW)JZyi~VH950R&FBdb#Tyc^(O`Ivt6Whe@!fJ87c$4^V@k#L+@p17f z@g?yM@k8-_F(ih?@5O1-C`lv94{^G5f@Gp(yrhSOESV=+ESW9gN|GeW5~)Nc;Yoy& z6p2mZloU%`61${AQY$$w*)KUSIU+eEIVIUAxg&WXfh4megygy8o#eCRtE7#zleCv~ zpmdOQa&V+{mUNXN2NH%QG=h14T0l&+QjC3Q&umcEtl zmcEkil0KL2lVZ{*(#KLn`bN56dPRCh8j{v1ddU{ZhR9-N%VlF_B-t+6Fd0iGk{M(< zvU-_UwnbJZtCdyDY_hG2{jv<%9@z@n0a+V)kt|yV$}h;8$?wVf$_L6}Sxfn4*)3T} zc3U=4-cBAVzbiv!1LWUjknF8&uzaYzo4lVqMt(+?B{#@9@=Uo>&X8xzHS#I)4EYQ> zOFmjIkaOip@?5z>zEi$ceocNrNm&${osG%DOFl}GBDsoJYLsJg5A ztNN+9syLNUrBLOmid0pqTvfFyTP0JatNbdT>Xhoe>ZaaOav>al98YKQ8G>VWE@ z>aFU&>V>Medbx9=dYF2Kda}B!dV+eKx}CbETBI&jC#w_HS!$NLSY58hv<~%mbw^E< zW{>);no#dkpHaV3KT%&&KU3dOpH?@h@2fHOZS@QF8}$f{Ml({=Rg96^t>8Y8l$o9M){poYL&n+|u0Ecr|M@Cp7h% z+1j?+Wht*T-!#89v$P*HW3+EIW3`twGqvrtUp4t!qc&5UtF>yiTDJD1R;|s`nzc-A zv9?5eLMzek(yr3}rCqJvuRWvPsC}xvt$n4vrM;(puYIF^sBNCoBBepwHU&&+lk!{J zJ*8VphPG!)mz3Tqqf=(4j7_1Yh*Bz3{3+W~-luF%*_W~_WoydQl#3~kQ|_lUPyLnB zBeiR)I5jTSnJP&YrY=j3PgSLQQ-7q|Q_EA=r*2NYo4P;sNa~H$^QpH|ucSh$uTn#) zpHqLPeoy_A+A1wNt$W(wv=M2;(?+L_O`DcBJ#AK6Y}$gfrD@ExjI`{uytLf3f;4|x zAZ=yZy0raiJJU|4ok=^Db|vjb8j=R3!D-*qzNWRIbWV>-?~&dqy=VIP^ik8=_%=%>AG}Nx-tD+`mXdV=?Bw~rQ_*u(x0TS%xIjU%@~mJEq!dp z)Qq@{SsAtfMPKG=qB}0^<$k1nGXB1}CWvt7%ka0ERR>u2uC&2Zy8@RB6W>)jdd+`t#z$*9d+$>y>tV0!*$bj^K{E~OLU8MY~2D~qE4<$)=70r zom!Wv)9dne1-cBKTj$c{>B@9fx?0^D-74J)-7eip-5%Xx-9FtR-45Ml-38qZ-F+RZ zd!qZT`=k4*1NHB84Z07ykGdB6R{G}p-uglMKKdAaUwwc5c>QSoH2p&TBK-nAN6*v? z^g_K%FV`#dQoTx_qEFN7^_hCJ-m16ho%%w3u|A+L)mQ4P^xO5j_51Yu^#}AP^q2K_ z^f&ZR^spY+hx9M>qw;^~n;DuKA`L?f{SCbg0}KNV-3^lrlMM?Ei3XWLXqop~YiRc0vjLFTW_Pnk`# z+GVxP>Y6n?Ygkrn7C$Q?iV=H49V^?DzV{fB1Ym9N4ai(#Sajr4JxY#H#3XO7OZGDO{%V;q=jX`6% zvBDTIZZMuRZa3~Vo;IE`9yQv0XN?z(myK7Aw~aTA_l*yXkBzVqF%rht#&^aDQyWv1 zsflTvsf($rsh4SjX|QRciDELEB2CLpElkTy^G!OF*py+Cno>-uCY4EJsx?)Z>PgEY;I-# zV(MoeWFBhnZJuNvW}abQW}a(in91f?GsVm_^UTTSc(d57GV9DXv(LQRyv4lIyvh8R zdA)g;d8c`Yd8>K9`LOwz`Ly|j`JVZP`H>khPpf`w{$T!O{$g%0H?c%mdRRJIqAc?* zOD!WUV=c2R6D$iX>6Um4$&zM~Su_^1MPw zY+rV1c3E~HyEwZ#yC!>b&eWXwIm>dE=a6zJIn$v9q&b;6c{%wx z;fXFe1v#FavYfh{+MKGKRXN*ocINEQ*_yLAXJ1Zg;pv<+ITvzn=iJJHbBLVhIUjSr z=RB%tVvV%6u(q>yv39lgu*O&iTW49PS(jKBSZP+KHPOnm3av70x;4$3V%1x-tQKpI z)o#tVI;_>!QfrlUi`7TnY<+0Ot@o{ut*5LHtaq%AUTmK+!WrrzR{=7|j^?3*LHs`^4Xx`Jj z8+o7dKIS##mD(EFe&l`6dy?10_9(Bp?S9?_+jv_i+gRHeTdZx0jbfW`8)X}2>ul>{ zbJ(hE8*TNrm9~JbpRL$dU~}8dwmr6Vo6fev=CZA~eX_N;zqDPk{jxQ(-?O!_AGdwA zHMK*w54KkJzV<%$!?wxxCXOFAwSB04x;@chw;SwA`xd*#o@bZa7ubi}we~Fg1p5WM z(7xY()Lw7DZ@+9mXn$b8W(5T=?e%pfP1+5Cc=SLNc zFPK#@sbE^cfPx_f-3s^xyn@VvWd)>yjDmy$S%Id2RX{Hg6(|ZCJ69Ie7vvReE4Wy2 zxZqg9wSqf=O$Db4b`_j0I8$)2;BCQ&0;r&kvz7CA!Iy%s1+ASo3fek5IXgQ0I%Aw; zoD-c>oP(Uxob#M>oHQrP$#n{yN@uP!+gaz-IW5jT&NOG9GwAd?w>m4GE1gBo)z0nC zqs|@9lg?AlTh4pV`_9MC@6HI@!YeRDN(cXCI&Te`cud%6d>C%R|5*>0M9fqRkL>{h!~ZlT-Z&U4${ z>)n63OWbSRYu#1uRqj*n%kC5I2kw{dkM58gbH8_YD1_XI`>Xqj`=PsKVbj8Hg|NF* zVRT{V!ajxL3O5A@77i<%Sva_GcHy!@av`a3abbKRyD+g(S;#9?6^2~|3N3}!LQi3F zp}(-SFi==oSXDUHGut!Ev&gf|L-J5OaUP*Z<;nCIJ$W9N$Ki2%iaf=hGLP9);pr*d z;@Rjq?Ahtr<=N`l>pAB+?!i2$=Yi*!r@`~X6Is-_D5|JwQJbPxMbSm1`u0VaJspZV z6-kTKMX5#UMY%~urzIaLT!s5ln%Ze$*i;7vr$;JHQp~a%&xMF>ATCuq}x459#QEV?R zEOr-{7MB#46;~E-EdHx_bMf}#GsQcKj})ISK39CP_+c?x{ImE+@yp`h#ZlhI-j3dO z-mc#E-X7lG-tOL(-htk6-f7+`-ud1+-kIKI-o@SpUXnM#%kc`mB5$&{##`@Q<=x`l z=Kb6Iz>9kk?+fo+Z-MWVx3TZLx53-i*U=Z_Yvt?Z>*Q z=43!=1X}&z4#h2@|`rJO3&+A+7+veNh+v7ugm~WBrp)aDO zT}juHu_dERmXySoFiS)w;u3jDdP!PIVTr3GFYI@{sbpKp#*#fHyGss~94k3qa=zqZ z$+eO@B~MG>l7}TfOFox;De2|^Q_{gd+~3jP*3b1P_~-i<`;+~P{N?^x{-u73zs4W% zm-?&yiTE_Zc zrDdi2OYfB4Eqzvsm)Bu zc!Q=4rUtWuj-WZ18#D&zpf6YxTpwH;Tov3E+#Ng_JQF+@ycm2Gd>tg$e+WJ` zehGdKwy9`YF}b3DMNGw{iWwCPD##T}E0h)5ij<1fij0c%ij5W9Dt1)ttvFS2vf@m| z^NN?@V4>!f?J7G|cBzc1>{;2XvVUct%HfqGD`!;BtejK1xN?3arE+N{wUSo3tTL`L zSXoiIrgBT=*2+VbPb(i*KCZl1dA;&=<(ta)l^-g9RDP=jtJ+jGu0kriRt>9~R5ib9 zPE~Bx+^U&XaaGH!*i{KtyeeUpxGK3yUZt#3RBfr+UUjJISk=|4>s2?aZdE<0dRm24 zp;biH+p3pUZ>m03y|4OO^`ojub(iXH)xE3xR`;tOP(7%6aP^Stq17X+M^%rlo>x7$ znq0lSnp91#W>#lZmsZ=VOR59a!Rq?z71isjcUK>)zEHit`b_oJ>g&}vs?lns8mqol z4OdUC`B447`dxL$nhrJ1YueYetZ7oytfpN}R83^f$eQjo18Vx$#MF$gSy(f+WHiL)cvgcRoAq>S^eMoj`cD1 z!|P|(FR7>1GwMb4;iuc&))Q@7Gm9u=w8IP!yssDTa z(faRJ|GNkNy9fR&dH{exC<1B(MM90CCQwtT8Ppt#f?7Z=p;l09s0|biwT0S2?V%1( zN2n9j8R`Ocg}OoAp&n3As29{5>I20Ap z#z14CanN{Z0yGht1WksfKvSV<&~#`9G!vQy#X_^8InZ2a9yA|X04;YNqWQYP$AsR%77*HG(4<$fMhy^7=Y={FTL0pIj@gV^ughWs>B!(oA6p}%5NC7D! z6{LnVkQPdTQlap)Xea~HL3+plWkTVpzK{trLl!6-%7Ls(2pxhBLr0*a&@t#ZbOJgF zoq|q7XP~ptIp{oe0lElXf-XZ>psUa|=sI)*x(VHaZbNsVyU;!8KJ);32t9%xLri zr^0D)I-CLPU_ESrGvO@Q2%BItY=N`k9M}ry!g;U_w!;oMA1;8MunTs>g|G)Mf{S4< z?1M{SKU@lz!R2rO4#E|1C0qqp!!>X%TnE>~E8xH2mGCNfHM|C13$KIM!yDj@@FsXO zyanD0Z-ckPJK&x0E_gS*2i^<+4ex{Z!w2Al@FDmxd;~rUAA^s>C*YItDfl#e20ja) zgU`bk;EV7j_%eJ2z6xK1ufsRsoA538Hhc%Z3*Uq9!w=wx@FVy!`~-dqLof^@FbZQZ z4ij()eg;2>U%)TnSMY224g3~<2fv3uz#rjH@Mri7{1yHNe}^03AMj837yKLk0|N+% zL?DfjNTe~+1Zj#iLz*K|NDHJT(h6yfv_Ybgwn#gqJ<GG7K4xj6g;rqma?a7-TFm4jGS3KqexSkjcmt zWGXTZnU2grW+JnYSY$Rb2bqh^L*^q3kcG%1WHGV?S&A$}mLnvDj8G6NLPO{X1BpZ8 zkpzT^u#iNAjc|}8gp2SHJ|aMbhzLnW#E1luA~HmdC=ey0Lez)`(IP2GDw2kzBN>Pe z(IW;V6Ujo1hzT(x79<dCBkCY;1 zNI4Qff=C5YiBuugNDWep)FJiA3gj&Ok{CUOh8jod-*BKMH{$OGgd@(6j1JVBl!5CS6zf+84#BLosco*~bX z7syNG74jN+gSxor+FFr=v5_ zndmGu7M+dGLFc0L(D~>BbRoJ3U5qY4m!iwi4j|xyBDngS{F)Bf&s0@{(3RH=zP&KMSwP*^Oil(9IXa=f7^{4^OM6*yM zYC_GZ1tElqN~u==o)k_x(;2BZa_Dpo6ybZ7IZ7R4c(6JKzE|M(B0@B zbT9fhx)0rt9zYMGhtR|55%ef}3_XsXKu@Bl(9`G{^elP~J&#^MFQS*w%jgyKDtZmQ zj^03TqPNi7=pFPfdJnyiK0qI$kI={H6Z9zxp)iV|D2kytN}wV18TuT3fxbjvp|8<5 z=v(w1`X2p&endZ^pV2SqSM(eD9c@5=pg+-H=x_873Sb}>fi=P+vBp>vtSQzEYmP-> zEwGkYE37rv28+hpV(qZ@SO=^l)(Pv3b-}t~-LURh53DEF3+s*b!D6t!SU;>kHUJxl z4Z;RvL$IOPFl;zB0vm~q!bW3bu(8-UY&F2=+7 zm;e)EA}kpbV-ie?$uK#lz?7H@Q)3!Ti=|+xSQ?g&Wnel?j~TE`EDJMYCd`akuxu;` zvtqee9%jSrm;=kl3NR<;!rWLP=D~`vV$6&AuoBFVm11RBITpZzSOr#zRbkaw4OWZQ zVfEMw>@RF3whCK~t-;n}>#+6M25cj?3EPZq!M0-Cu_4k z0qh`l2s?}&!H#0bu;bVX>?C#yJB^*e&SK}V^VkLKB6bP8j9tO5V%MLiciC*<1_G?_$)jYpN-GK=i>A5`S=2S zA-)J-j4#2L;>+;mI0+}?6r76Fa5~Pw3veMW!jo|^ zF2SX^442~yT#2i2HLk(6cnY41r{U>%2Cl>PxB<_^vv4DB!p*n^&&G3bE1rwz;Wpfk zJMetG0C(ap+>ICF9=r%I#=W=?FTwqIDPD$`;{iN~SKyU+6<&?k;I()iUXQQ9|H4<| ztMJwM8hkCj4quONz&GNX@Xh!Zd@H^U-;VFVcjCM7-S{4SFa9^a58sa;zz^bw@Wc2K z{3w15KaQWkPvWQW)A$+uEPf6@k6*wq;+OEt_!ayreht5l-@tF;xA5Ee9sDkS55JE; zz#rm|@W=QQ{3#CMFpl6Tj^Q{?;351O{v3aSzrGgUBZe2q)np z+(aSaA&Q7%!b|vw62ecE5@kd=5g>v@1yM;<5!FNuQA^Yj^~4I|FJdLJidapoA=VP> zi1owi2cL?;vjK|I7}QNjuOX+%|lV47NM4*R-x9RHlgTH+fchu`%s5a$55wG z=TMhW*HE`m_fU^e&rq*W?@*smOsH?DU#Nd*KxklSP-t*yNN8wiSZH`?L}+AaRA_W) zOlWLqTxfh~LTF-WQfP8$N@!|mT4;J`MrdYeRwySY^Ru*aLJwB!?mc?>3?KDPd=D3MsiN}-Ty-}pEsBU zlfwL8awGB-ay;2jc9W~fW#r4`SV~{YA963s0!j*H4yBCpiE@v!gqlpPr5>TaqIRU! z(ALt9(ZWPsdQ*CTdK$fyzLWl#-nyZN;bv@L{9)wBu@b}yn-k6@oK0xc5ZzG6+{tXg zqO;hnB$kM^nstB`&pyT;rMt&|#qPyf%Q?XL%o&tKPiosRCrO>OFKK_$wWJu{c%GE^ zH}45AiSOXM`A_(_`F#W*_-zG~1fvBNg7(6-VXHuXa&7XJ5@vx3dv5%QAvZOwRFgLiS(e9COaktW%FcLW$hbe@(v9ZawLq*QYscG z(iPbXM1d*pC}*iSs(h7J^*|M=E>LUL0rh6}RrNRZ2lY?&6b(l+NHbk?RO8g{(SFu8 zPHCDlIK`2&DWy$nWGW|hLF&TPjt$3Cf2Zz9I}(Ngb!srAA5K4?ekUDGzmeWF<8%7J zjG-ArGDc_i{?se`X?x*g)4PV^!!kof)o=={3Mf#$C4Off%Hw>Y!)hE>ldzhG)hw)kbx(7^3P$|{XdX^20P8>Vmj9Ojv+)1pMXNBsu{H3cQJZic z9nSyfQ*8@G0PVup**>feVRa0vQ+V6|DXB9MGp-9D0=fdNn*Be$=59bUpgRx?^Z+9M zUEQ9*pGLjH`bT@cfj0lH**-vr|GOLm6gBS)L}2}Zzj*zD(S820V*n5d3ZJiICkzI+a~XGsBt{RxHpab9Q+9obdYGu;zs|Kdc2nPUgSr{a54*fhPay z!?g%_2mVLju^4F9X9*AuE(I<%3wtItTOLM1lYqQ`9!d^lbSYt+FExzgrTyD;O9!I+ z{73Elf4PkT6l&vuk8|UJIRg@a1=UPo_%jv&p^4%9l?_D2asV+e37Ghh3mCF^z~V?g zaQBq}c!vssseBP|x=S+9f)E3Z#!JHYkQAU!k^$!+Iq>oyNc=n{Ag@pXi?*nN_z@bQ z(K9W;4|_NDkfZ{oThf53$I=1W=?s9sQ3u4I(F57D!ro00nZRXR79i+g1o}jq!bD;- z5Yxv3v}>9jCJE;NhhnWj|FyY*aDE=Jo^Jz2N7;eS5e^{3kq<;f76A4dC-5W31$6A- z2F8c+-bh;yAl_R9yzN^I=z4pBKYSmMGBxboG}#ZFoLCBoq-DVU<>kQ6J^^6+f*^3d zO$AVKs1l$ossbkGSBLM#8o=4F7U)z_2P{5P4~(U)05;c;XOu*k6$5Qw$`%bRTnTITEku5H{I zW*_eYt~TBcbo;XhXtaJWFxwdRZZhoy<}ch2M1;MYfW`-bmy-_x)JKPb#?eQB@zqCx zmZ`^pV58#z0GQlfq>uG=*_RIv1odu%io&!>S=YeyhFNDXui(&lwCE$MR z%V9f$D`ES=tH5mFTG)y6IuKoU1LzWV)3ge2h5P(AaIN{B@b7gOhzIWhk(B!Y*z5ri z-SZ(3-S`o3-2NDd2A%)|VxIz(Xb5OC8wT9V5ukZ23ba~_0bMuYz_JnoI2IEEa+^N` z9H*WGjUrwEX-!^+?}=AHWQ*6~b9n>w?C=(74!i@-FMbbjd>_K=9|2#dPk^}P=dc6J z7oeT}D=@DAH=t3=??7N-0}vVY0~j#pXLwZo1vsz$4kPUU04>P?xUvHXZoC-*j=t9j zESMPyMiw^)1-+YqtFxPe`LmmWzLU+tgCnBAEeS2aE-@{^Uj18vi-xuaC%0__Mv|hz z*r>K(_fG9VeyjFitg{0c710rlDDMQun0|G7kfn3MRUOq-g%(? zpX1ehFp{|dY!$r_1a>Y07XgdGvMx(Nu+LI3lCli6PFfBEV@cq085w-Bm;xS=QNd+h zXyBZYbg<8Q26#Ru4%|>c9q%59WXnm;|;i;DU=c^T0Ok z`QXFH0>DQmFN~FfXJ*R4Lcbh5+EW2~=PJQQQWaP+Rt*jw ztpSgvYr(e7Qow#2QbFKY8YrHc4x-)+Fd|Y1l7{QS0c#E5jH8+0UqBW(b*2%#;LyQ3>{JQU(5IRfDlzYQVlzYeDSqI3Tzrg(VE5V4oRiM?i8U(O4 z;eKBW{uR9rv@Tr_o@%)PY<_biIM1~S+}3+DIDXL6J_916v*5DmbKoBEJm{fc0Buzl!JYdqfw^NZ zgT{(0pgrm;7#epCjA(fsynN>dIQiO5a0h$~OslvJ_Hy3=?Z{p5)5&`vEAl>AHTMB{ zqTfSs{-Q@I;NYAS1i17@2+Udi z4BU3@Iru-Qd++czj%$5*xw~{^$981Lacrl_j*~duc6?isn@drYMD^Yq)qC$XM4?D@ zfFMYKM4@``y;HsS-q8s4-a*})-@6Bc;ewKL@ALil&GXF6>2v1Hnb`$E?v{UYGi}B< zx6&GFZ>OF6?wzzYyY8m_sPDbBq7(Pi{=Dx2^6X*SzKlm{Z@l|B?Snr(N$b(`Y1+?L zK1(YQo~IqFc#-y-@_3qiepTA;886cYfB4^NEtmaI+UmT2q?sykcka{@*N=Wvd?V{E@#~MjD{3;{7C+qgj%b|nuJ~r}?}_?f z*B0f4?}?xP_y1>FzD2DLsC-`@VQ_+HK@qNetb#CO{M zSgiHtPsDeHpNelC`kDAadL2=C`&02t`7<%A{O6)c_*~TY|Ako4`j_Iz#$Sour+*=S zWcsz(=?}jVbL#$9tZn|CxYhf6vFCt4h+PeT6b1K}xE=jU6f|FprM3Pfek6P&+PD9U z_??V@6=yvDH!(f$-^F+O{D;{5t3Qj)-u;XCM)qIDxBl^;;@2PkO`QLS{}TU@mmz*v zs4Ld~C{xrQs3+EWH%lBcu)g@U&_EPEY$$d-lP%h%Mq+uZ#^QianuvnEsrdPO&BTzq zx%kU^EyUK{T8c}5)=Dh@UTg7-rESEjcw15E&`zw?r@ffr=^*Cr>nLVbbQ06;oyEE< zx`?0ayNbJJcN4$)q`Ua%oF1^3BNlD%DK^md68|jp7T@`(kNC#+zT#&>Ke4u_zt}Q3 zKz#291H}$?2Z>r?u=t5QMEs37RBRy(6TdVJ7r%dQgg7W`q&U+!O8o53XtCnGF=Beg zSW&1wP88F|i?s?Sh-qI<6zepYB+BAsQFuN@to6OAqF|UN3Nw{^q`!;eXSrf+twyZ< zp;pWkbYezry;#vYPt19Ly7;(tz9`fw5Nqcd#4oi*QFzZJikW8dt$G%5O|Df8jj)Mz zF4)D4Iu0?dR-q{Ti&O0TvPj(iu}hQ}6^qlw67hpxZZTi*h*?6Zm}f5&8)SOLt{FZt z?=8Rhov#C8?w`t$Z!^S-^)tmUkIWK}Rm>K@te7L_3UkF;>GQ-n@5~qNZ!HirgoUCY zE)w7VVzHRse~Fltu~htZpJn1_b(f3R>D*o+_Gz$EoT6VPio$BK&XqOdPo}RG8)d8$ zYrVBz6e>1|dSRoOR%eqa=r@bCYi|(`XKoeurfn1dJfcGU&FSsp0M8E5_LH4r%dNY_ z_y4wAe6nqlj5%TPKjCXoffD6@Qhf0>RIt}qjO@T?&rmfj0>V8|DxFR7nj6c=PrvI zv#y9AG`cDl{wOF4`$FPKF)Zf(AR=xTqSzOe;-EKUqOjwdC}dw3#f%%`r(fO_8*RKL z=GM6_=KlDOxHx=QtX2D-DA&F(ej_{(Bf>-R1N|ehPR3)b+Y_<2`>FWB2hYSEBc6*3 zrIt^|tg&%{$VC_urM$YJE>i8(3Sim%JyXWxOv< zfBt=`S@;7PTXfPoP1K{p{D0`1x<7_tSnW zoh<#GB-Hu6H1e}QNc)68N}4)fO8(rhB;(s(OSz#xNpCLyMrx(`7wN0o|0;cv@o&<* zzxj7*j^RI~wFCbwz1!at^SrUN?oJaa*W6UJ5q_@v@l)8PS?6?1|bdoaCJ4@vwx=4T0 zbd@wMy5U^`-KE>@dPueV?vjayqDDLgWl3NLLaH#TYaTBKj|k;{;0n+=lcUB zF>RofJ%5mtArF?ab`O!>&hlfe`KN&7%|9*t@%e5o%UD_zAW6RM}#;`Hc*STY* z_rDq^MZYs%65gI5)zVIs-pZULWn@p5{*pUI%E_K8eLsJi^iJO2r7yn8l|Gg<(yuGE zQvILnq_^_*(t=;)Ngs8cF3laEFYP{GAPL63ShrD>TZQpJ02sg}Vbjl&xgKAm1BrKfo%S@22o z-F~UOK|sphRW7B!Gei2U&P-`$+gVb!W44rLoFkq6Vy@(#Fi)x_%$L$XTp)e+)j}zw z-XbZt)?%r7e2Fykjip$lWzu_v%O$bS3h9Hgl~U_Jtdi<|xLOigu90fn*GhGTb<)PX z^-|`S8>BjQHcH=Zu}PZ$oy}6MKW>q7Gqy^O^lg&!lM1Qj)$LN+8#^R%=1%F;FLy~_ zzOh@%ZN5j^^)}wdAn%jp^8Hd;?g2^2IVgQ~>JWT5EQxO&k%S)~mA(*;Ngr8{W2_U> zu|X%L+6PWawI80AgeGUCX1_Wsz43!{QXTQUWG}cN37s!W^R<_xM)faCEj3ppxz1Hd z$PG$zK}f3gyRdY;Rzyk{q8O`E+SNEFl?Sg$y@czMRk$H#zI9V-_vJ0gJm|Lc?wfa{ zIl;Tq8^69M?aI6_eUSY?T9x}y`djWJ>C07*kuOiAzm9$?6@BnbdS}FQsm|Lkq>MM? z(kEY5Nf{L{rB<{5TPmvfAL)SQAJV>bLEce}+xXd{oF+&zUgIF|6Vm0{X>Z8ywEK>H zctI`si_hPbFZ}o|IWz6M^1o%jEjOF=j{Lp%-<4N?{XO|N^=r#jU%e-%pLky`TK|1H z>(U4E*#SS057hrqE@}Bg`S>3`lIwl^v0N+j6Ind*BRSjmV>!e96S<`Pr}CR^e`aFm%p(8hb-j(SxyW7MHcY(im!zKl#71&H~CZTf5{&U8FJg&b>)@6%alJ6>&c=w zOO`U~%Q;&b$Z|nL`R!WSvM{lc{Kbcj<-cxhB4$=LthAJc zbFHxCt>t`g8~K}zws<>7JGsx&_Ojzw9pu5+JIYnDPO>edv)r#u7kTd8uJYg8bdwiF zy35fuJ>N2%VJg^S;+1yfB0!Xxx7w)Sr!J!pNj+K+&Y8gbYZY8 zOdBG%O&coz?!#g7;7!yxJq>56q+FFVjcMJFCXXJO6vE9M2gi=h(-~8GRo?ZuPjubNDebSQ5TFE0`EWXCV3 z%Wntr<*eKSIjz4z9)8{^fBv>fuKjDXeC#8OoYvARf7;R}3$^X?G1(#8M-<9wqEpUJ zE0TBibje?*70W_eiCiGK<&VGPk;Pi2a4UK3OBb{mxo>_gm}a#;rHVc6p=x&fraQ z*IAq8eyz929e%r2e*eR5@~HV0a@u>_(zAak-;#LKfU7W%=eQ`GXOs zk$-38pY%K{J6oND&GYi-pIngVaXkgNC|A_GB-a^vS^lW@6?s(JRryy7g0h?wlHV|d z<8y`KA{}y~Kzn}gDdGb{LMtCOIs(3CR$$cTG4UNn1zf~pIo&Hj8 zU+cf+pQinf{43!faw~kb`k%GZ(!UOh>FLd-^ole&T`#AnYlJt_Gt$&PsNwIVmw!?# zy_4`}`o4N^rGH-V-Sq6AyqzxWdndhh+Pmq}sPCnJ-(5RBU4Ab;SNlFryzi&iHhz%) z!8<=lZ=d^NdM)vX=^5o8rNaS~kJE+bYTHTplk_^Xev~eL{Nwbc zHeIOmyYxC={yzQnQ~5*sKmPGY)GtxLLj4-`PpIFZ{tN2AqW&A|zoY&K>Yq{ng8Em~ z|3v*8>VKhTpw>mrM6HLKg<2oA0cu0kY}7`mjZvGRHbrfQ+8nh7YD?5ssI5`kptePA zhuR*s18PUqPNWGZP~E5=)Kb(kR4=Lz)sGrLEk~V! zIumtPI{yhSnM&W<&rbZT@U8rsj5+DT|M@_in~pClS(%qERLqBO3)1n^!T-<8!u0?7 z$0E#SG3pZ3rKro&|MByoFy- z-xl5x-o6a)M)k|2!9p+Q}~Jn6Lxo|&aAAZnQWzzS7RCr;g>k}o zVS+GGm?TUVrU+AoY4~NZx^xxV#oe0bnreyynKV<0(iH8p8oX3V1)KK2NaVhTAHaX` z&%l57&(h7-&C$)(&BK55FTj8MFVZd6EzvF2Ez{v`l)4qVmAX~B)%c(PwZPS7o328) zUAIHGQ@2aETek;)_p(p7Uw1%vP(>kZ>n#mZ?12lZ>evkZ>?{mZ>w*oZ?Es5@2Kyj@2u~l z@2c;n@2>Bm&(V+2kJOLSkJgXTkHr%QCg2$Zlk}7IQ}k2y)AYG|4W2%r)9dwl`sw<7 zeSzMfH|kA#v)-b&>TPRyYda3rxj&2)l8nlPs+yv=xihthA}M&%5RM)Or+Ya#sd0<`f~lES8{v?Q5NfG zQolq$oBCz?S=2Ap&(UurXbrW?_4D+b30g<(O8s2w*Ww8t%2+G(^Qm92-$MN={Q~MY zP`j1dYM&BsZcgAc@Wd1~=XLNb&CFM1=4fWWLJMg8j8;ayPvd<>Ce{8+6(7&lR$)mw zBWQ-#(3AYv^^ZyZ5!#2E3{724rlvjMj+#!I&YF>$QJT?sV$4|0IL&xG-+!WJl4hP} zv1YJlNXjTVnp~`@1~s59*Ur$+)Xvh**3Qw+)y~t-*Dla5#8Y1uYnN!3YL{u3YgcGj zYFBAjYu9MkYS(GkYd2^&;)yVuwOh1XwcE56+U?pM+MU{6+TGec+P&I++Wp!C+Jo9d z+QZr-+N0WIc)QyP?Mdw^?P={9?OE+P?Ro75?M3Y+?PWYY=BhTR4Qa!8woFu8sf}r` zX|HQV)qXzyz8Y42+vXj9|R7*EP+t7%6w%Fxx-W$Nnbvhci_2D*m2Y+WO~ z9jb}0sjit0FD}D#Xj)Pnr>e}hr>pI{~6`gdQbzO8_b=`E`bv<-Bx}NxZ%ig*^ zy1u%8y8gNWx`DbuIy@p;H&i!FH(WPDH&QnWPpTP%XVr|uyWuA2Ch8{XCgb@vQ+3mH zxjKzbtJCT9c*f0iUB0dWPqQ)VOggj9g6G`WbaowHFr#zoigYeK`zASy`kF49)_BT~ zf_IFYQg)X)1xsq=b-@PN62O_skzm)Is@u7}mI5rlGgbHI52xN(MiroF;5*0dgP z?@p9To6>KFRH9UXGXPh=nQjH24!cU3<$jL$xhrKh=ogJGK(DmUA(^?<&U3fLo59C1 zDMhk9@Q`!6xplFECCY%x`R~5BKHPJb}cDzEO8fGA3$R{(YqNgvc|6t4#5 zzPYlX5Z-uc7Cw{T6fE2bduzzXT58u(i+9`Gt9|KY8*1MS`bN}E?(w8O!*UmM+~8jC zp2uU|7f-R-?AYQS!@fPB@gQs?qkvl?La}Ou(NHYMS1J{AqU>XZWtEd3x2nfo$lT4 z+m=1d1HiF*!(4DmQIY%|o%Glq`7WDYm*E(kKa9bNd=tO)Y0=eLI+EIl|mZ z&-f_XSEJ)+G1evb1+;jtJGDz3=g?ntpI2Jwo^h9(njs&Y#h2YzNJ4GDp6wQ+4M+6b zxnjWXLTfb}>!y30YTcvmJ0v|4vEBi{Cqrj#NBAx78S zW8-&RLkc5q2lzqvb$8f(wB&|6he=g?6s1hEt73w8+{1%O@w+5DA%4&O$bCqa$46Wb zxs?a*Ck%d!KFo5u+InG%-KR`;BJA&km$My_!p9i@8MoJtym`*?IENB8+p@D~I@z7f zBGuCRr07Kr$!Z^}p`Dgqe6?S?Gd)%A9Tq|G(aI*JIx>&zc@)ZF@<$LdJaq|Qf~b43 z7Bd)qNO2bEQ{l%ZX1PAeDZ1H!8lVn^e6lpe(|wY#AWVrjVOV4Id-%E1-qg&~9F!$I z|C*|_68aAjzgBooPz!KQVeYNDgdg*1!?EOOS$yUR%2|Gjwf+N#I@i;TMM~qD1C0aDQp0c>Cs3q?goZ{LX4e5;=sIUFhx9z7o^+>E+leBT z=h4I42P*#!WF_g*rlJGLseEX-OA1I2_xoQ-mSa4n`rN~pr>1D3#wla_2=<+x{!&G}i zkt=~zF_Y}gVw7w4dKR%cx*5;sDFx(Vn4*cjT9QX=_sqPVa^@lFOedPlHr|o2#~5G1M_mPIjb}B-*LpS?24n2FWgXEbP&~_R^Dy#ykBR1<81p<^30!j_xe;{} zx3bw&&lNL8*crdYxy92Jd2|ieux*~Lo*A~Q=Ix%%q`!mdTqs)Uxb2ur*?!yE5>c{( zKNOzqg2Z*zy;NI@>~22R9#0d)qk>yTb9}C2gvo)}?)R*r_1ec|=9AR}!0y4`w-*b| z?jYoj!AhK+9k`O35Ao5Ccn$-eX79*O(y4}{iae?{zJ@f8b6G2mn;fr|^#tb>6|b^P zG&Lw0?$}aP#nwrY>xU@CtdBq`2DB9su)(L((CcLw;ixk2G*^<%^PY^tmyQLdnYIgf zcH0g^)Unn&$XcI#vKyyc2ExKcKAK|r60iZLzASU{E&WZG3$qN%oSTa?ES{2n&X;_) zigcnh2dxr%A=5xr+%D3(MM1x0yy^*h!YSimCjg&h(qP3Fxk7lhTnJXKfL4!PPwyl1 zV}(Jpot+Lb(!WUAnH)K_zgc4hL3oMzJyyl-j^`F+X28qqc!u3=CV$Vf%e;j=zt1QS z(LZKzVf?P8Cw#i$x#oEU+FeFhkL^(9`%~~UOP`a}OOF$rjM5i`bt_eLu31|0eff;p z$|`+aP!HT$1p{4m(Z`AY1kc#pQ{!w@kBSq5EUIZw3YrtGL1{z9p3T5kq-kjrCfmG5 z1e+1PG1{Vd(o!2_$ZAUq)oxNa*`->h+X&L-synl!-aqTxlxAYL%t5|(q7fC@j-@R) zyd5VxEqaZb&NscWYQ$wc} z&3fl+y&MVI(WP^3t%*CXhNgO)ODcUW- zP|EjHQeMO4?tr5&%`Mf{&|A!|swa`pYw4UyXiitj<(2j!yZM}EPou9Qaqbqx`6Z+F)MxvGt zvG$UkcFw&jY1|)SSG40}?FVl+@rScjKFpVfxTEBpH%z^(s|BjXrGqOh~s2K z6@(YSpO?-8?1hDR={(!Z(k#rf3iK7+Qi*L6%ZLpAonaP5AJ_Y`jG{|LM^*F5qIfmt zlGtr@F7=^IT>{C4;AN`#^~+|*cT#S2V0H%b48%7xDoMu{&6wOd)!1RxIoiIggUZqZHupAVP58HIgDLLq zR8mRLQ~Nn=<&xBnOk+G7xfAfV|Em>6djqZ3RK7nF7CV=P9PmgTPA$l)rd%s2|DVyl~mi7B5GWU@M1IqfpMq=P= zXo|(#HS%x>>>-)L=EqEXpZtWUvNC~XP(HA^#wVuf%=QAv z>cjKd17%g9 z_`&I*IuXlBXDL=}kaG{-xqwe4j#5=zak@idR@o`&v}Uu#rz6suOReJJKP&T?)I;NZ zf);$M)MK(77yeoyqrLpxuk4a*=0aW;)~0c!rqD$o6CW%Ora$0 zruM5+WHvb$vp6TDB8Js?mc0V6L;J+_n4d&Ty*0{ z1aHT4iCP;sm+dawRkpKi8`IrN{SJoVZWIxC%12Dt#H>I~E&I#%KxZFnAy#c~+45H; zws4!Nn)v3Od^}LL3OZ}p{ya$1hrUJUDCkFscbG{OIM*}iH0x`QA_&Jh=NN~orA~l$ z@)i1-veof5@hIkW7H<%!mR3XOh-*qfE6nqT!)IQ+H9d&7pa*~aeT`Rl8cY8*>%4LN8u*R3gZ@6^P-1kk08^;veNjtY^}LB z-kR~)_!N{G@U5w38ToaYBCwqM=;n|h+$?PS1J8KO9uW$`oBxD%WeEWZ13b-q<2 zKHCedw&s?8DW{O);q$T=Wg~dx<7H1un({lAmt|FCzaOnehBq;zdfqHRnW#NnD{KwC z^}Tf&2UjF-Ho=V;rKz_upeEjCX!VBMh0W2Injah5VZ;{R7nsj^%%r8a86UHicdM(d zH-I;N;3T&`a<+rU6w}PY=LPM(vt2D{hQrz1?x0`C_U4`9b>;(@cL&HTr6c<8s1Z6} z*T-i;c8RGI<2J^qeaT8^M(Iy>x&T{>oau_b8*zG|EvC5VczXiwMbtLl*3{$IHE#~P z7i!?z02>D^?On4A2f6wXf2FN2&fmUFwjcWYly_Gs;sd=t!$SK2yp^M;`2_aRQ14(! z4D!w?i7=ZU+Ys+yXE&AyTb(1k!Ne*bn(IdR z*MjCU#@m?fK1Ht$_DU0$Q3*RwjP<#8f`VUhyko7MiaV44e#0d1CRj6&U0mO|SBmr# ze$83roya&X$le6P#-T06N=`}9N{*B4bzXy41BuDx@pSJL@-P>aJa1*mI9k_}j;YMX zR8xU>kv-3#^*%M^GukrDQP1F{RY5SOP|V(9ZxK-(jBfWn#V#o%Y&k5nq?{{dYvA#k zh_e~9w|S=ler|AjUEUECiMf`w28-A2E%B~^<~+xAevb9RI$7BW)xIDOp!vK3?-tlo z$|md9_#E%u!ZI#93(zw}bcS~((fnRK9)?P#xe@K>RW!;3!)(wy6)jSI+EK)=7ESgp z^e**AuyXU5rop+GK?zGZ%WO-$rzz4&N}}(FeYgO!73AMCKxK%>eq_wH_=$q~-npPm zMD8lZ>utmDW)hTLj!oVj@kx%gkXq$kjW%js=iP`tQPy~~5ZCpDuS6Ti8;25{&E75E zlbFd)7MB%V=e}t+o8fBX_V@-)7liHJ3Wn`Y_Dp*Z;ky`yyFc$6sFqV7YxpP;Q? zFZ|!(J>_U+S?+DiuPA50y++x0$a~m(gk(>nJw=eOcn#uz0&pL58(N8@L|R_s+A#yisq&d(#`n8-f(OFZfPYux~4O zN%ju2TT^N-cE$tn?s+S{Uifk!@MG^I?-TDs@6#GO&%DpQ*D;s4_l37RGGnnlYKR;5 z#;YK=g{}Gl`%7TkV;MdTtkv};$GgMUE0a;``8t`h0N2Nxj83x*JxH;*%5tnrvC-C$ z>thetH(d+joVt!IIB3b{oZZl#LlM45cA5~U5!$8%HRh7dIE1@R(pbZH<5a>!bPhI$ zTr1xyTW6dSEqv{LtJ&#-)5h03<>Z}O(%RR?*TH9Ww)M5PT%tMl^{s@=eKx1${P*$f z4i_!remtj95q)-2yD<08zJS5Va9qJiwoPF-yy>Zjub;0M@SZ*!M(E;3eeVP0kP3#ueA!{x)rjeGLjqazM!>26YI$GtJvn5~Q zaU?l~TYGAqOq8{d9E5sg0{EXoZYkQDjQF zmYG1eF$Yilh9)x$ZhC?5{SSE+ny=`3S>FM1ntwNFtdPO*C!Yq-iIe0PRb zndS3yYXeK>5Ih6zOisl-9EaH4%0cbUIJ40QR8k9k3w;foi-}UtI*)U@Q2s3eKG(Mb z?Q+y*jJuNh)xLYk@l}k5`*;o|X8rnh4U<~yvvc`%z72Q-UA4R$Z=+jE_ym48vdOpE zx7D}Bx6StwSG0Dt@^RM^)k++qHQ3JW?D8Fsk3<}&v7NNjx5GEOXt!?_!}t33FxmCS zb~Mfz)p`tID_VpR_Cao`y&<^MT>H8GYJU&-4l?Rm*OandRoopZp>a>{w%1>XzW=W%DdLbC~PA0?g1wx#43zCGZw z3EznC zGq81*`Ek>C!*`eX_t4(*osQQv-o|?mPxAHBxCWZa#-9150x@9HWMW$QYt6!)1y6k!*!a(gdlA@tX73(9S9_7iH&`}Yf=pL-2GsSx zAibApt9+Nic}{o+B7whaLVm>wSFoBTlVr@cdguq0xM`kQL`z6EAh@B5f^UU@?KAZ^ zbhI=A)Y$K^X&qPM{o-dl-5g!1VKaYRb%nv-8~R)L&w(?uxVU(7ahA0eY2Tn&i~zljzrDX5XwOJ17jbV5tSuj- z13@0XW6DbQ7F@AxL_S|68xLqDI+N5;M5?2IfuocEzU^Xh7k^iOK}m?MOiz;Ngqe*g z>h3o?FZqIq=`f7fkLN}XWH#G&a2z~Po&)cOzPG;@*}zWc-dHe$GY%9)z z?aKI}!hOyG1~tEC=G~_muCzDe*GWZU0*%z!;!VkdN&X_EhB!$pQ-M8TF&boCNMjE) z9;SY>KhHeKY;ndAk%^Go#ZE1JH{qWK{Gh3cITGJ!9K=q2{6a#upIIDOh4!=txQikh z?&MkIk|S65Hb|^6=$TxC?(*jWuRt`-=%=Z2LE#tqi~RXaer17ype`(iCSXR?>3EYW zJ{PgIxm6l7dueSH{Q__v7G@e3K_?fm-LIiIS@8x|+$$k})#W94%R%oG-&2lOxu{AhXMF+cR|mA}Hj4HoV=xB9QEVtE4*+u>gW z&K}cx{}i?|xkVfO`;kE_{j2>eX#5uLiN101e7_Nb=Pk4GP1=~ef$iEZ)nH0_u!uI?3px=vnlyS>%Ds~R}yIS@X>Kz9_-A$Z* zjE~)2VnjA5<*@%OquwT;6xvn)Iigjfjc}bS98zR113QAa=PBnZan4g4ByO{m zwZ8@4z4(2+aai$jHQ((DrY?g`4@n|H%YfW|=L1H0#5s5QsEXVj|9y_%<1#pt;rwx}-=xvqz_&~lnfHU|cTd$eyZZM&jY^U-4+#%3D&?(TBq)(YP^L^KqS?+?q z8^MQQsXf-FJ7HUlIZOh-c>wCkuwLkU2c}t9*#p?Kb~^oouHHOaE_Qu5V!6+J=o9D* zom@s&-de4AIWRB){dn40Q*Ae`y}=(uoa7v^^8%STM+d8@LsjrF6+ApJf?*@kkH#CZ z#{^~>24Xg2iC*72*f@@$p3VcM$q_P5Nw*} z;u=XSiGE68GI6Fc{?u=gOVv^^O^T!jaae}2v;iH_>#=p#r%2&C7|5$ZscAWnu0b7L z163Kav*=0uQDKfv!>rcS*@d|-W-Ep3DMr{z8RLeHr}6vF{6II$C`8qu8ruQb$nod# zZ8+t$rb13p#weg`SC+|6RBON#$ffLfhWKt}=fPR0nYcx0oqWuvh{%mA!Gr z580Ke+W!(-A1_Jy&>rTqp6jYA4g_XcD{St7KTrVr8k)T;P|9pRv^y~GN?PZn#S-u` zVAF$sX5dA<9DNy+uUp)|NCz8PbQQF~|5=QKUn~M=9mT)~@$r)uYxZ$=ekABaOO|pQ z_|=ZXkFkmifte{@tDUns2fq`r$PG4hx6D(~@k_I9G4Mr!xo8&OR4E!HNHBq5;lgU-03X~tN^VO&9aB3750BujG%SBo671~RG?*-PL!ofWEkj-&;3UzcRtQNE5Lzc!P#ZOrC&@(17f zu^#s;fr`Ku#ywH8lb}pk8ED&0@BwNa&V5V<_c;W0pt$b`j29IMyHF1X;sx8$A40`< z$o8zNX_(b4L~OC8Ue$)c-asd3eezH3@oL21U_5HsVcQhw$)b?t4@UlPBy0E%BVe(u z2Ywa!`9P6r7$R{ha5=D~pp_vTR@Y&+X95cyhXY3gIqXg-)Scv6$HIo>|A`tB%~>>06a7e_kXGq9lR8^NdW3tk)sL}4 zHRy^Dizzqn1UAslS17n@VC)E!T~g8$bGuL2ZMt*5%dLbtbe*7^3?EifNl-KL>Kfq2 zG>dzHZUlDItnrBuSh@8jNh+fnkwdY-t-x(gQK+~+IL^It?j$%$`O=D&T zpQx-n4O{`{F?C{lX$zgTC8{-Rjh*xmGIfIn!}QmV=0Tjc8K3hkPIwR~KE_T1T(JUG zsxe!stYieAf%AZIx6@v!oUBFgtiQ zc`5~oDAY%vh1!ha4TBBvj(L2(g1vg^o6w2~R9XPX??Kcm5I!sN@e;VwwhQ83DA*ot zvUF0x_rASp$9xD>+ zGCHWna8l5Ti#Ry5YOI)^-D_O39#iGHqTPyl-oQPb`EF!Z#->;wlY%Llua?$T6M~%z zCkMv`6TC^R$9EjT9?r7`z4&#hrtTx!NmH48L*{{6Dwpx5p`U^}p5X#3nd}_VrqJ86 z+2IaPMQ_8YCO(orxEw33<5H`bJ$x3WvzHCSx@tY_Kh@se^%~jsRUI(i3!0%3_Mfph zCrnKbnn1(71$okrdxonL=$fLuU_o#XtRAI&H-mPR-y14=HOuo9>$YHmpO3x)KhrIY ziaaf`GkEq*ftO*g%)-H>3R#bRMgDLVp@?%_1a-npT5}nfvxM_KfKDPB#pvBZ3+C2f-YNibVA_DRJg4 z;5d~pi(oHVmIW&j2Mc!TF67;6)Rl%dxC$l8NZ|9?C`lUb)3DOZgGqclJ0WJ6SAcfH zvMRWe^Hy^xDXsKt7OCA!7RE|ZDiC(lr0;$Ojnk}YfYPi zTR`2+IRcffz>mVtHcr2W(RyGP`S{tiJ-8!S!TE~XEz0^m&UKKjS#|}R6z&Wv)V6M| zD#EF9dxNQX65Ai#!#F33_XQ6C-a&g+;diS#!gz;+#f44D_AK)uM#DWPpq6-dDMWcW z8nn`0RtUuw?JK+WSnzm|3lng%2A<^h;`{J4Bu=TM&Hx@lXZ$%pJ*v*4y%0RFk`SnD zr1hE${|+E-v$zDp&juP+Dh9Vco(8| z3Uv%s`05)w06SNJ^O~||AIlwlpH$K{)HyV{a5mXo0D4oL=-opLONN+xK&M;iR8bE4 zo~XmC&cgyS)YcDJ@6au0FZ9)=KJD0njMgXA7tnxE|4Hn2Af_=u|6p+?B(2FBi&IV3xm z+IeWRX^j>TKA+l!p+%w5RU@%$M$zt1_@=aDYT(z9n~O;YV^VLpxiqvaw4Bj!??={G zgvL^KPs2QiB6G%3_N?Sms~NN^WQUhZS!eHv&o^sA+n}))++D`gMeES7C&>*={sN2J zN%Wi9`Wq=bHj#vuvTYx=TZytIv^i7-Uv?Yk@v}cMVrsjKq_>B<+n2L3DndI#JBhlD z+En=@wmY;3+$HcO#MU=Ym6zkH_Wl#yqz&Xj=%7k2ANy$s;&Lc73cliuV-t1gy;~dtHWZOGV(o6QyO7R>;m~>pA7STj(hk0dQt5A^ zlck!cKv5OH67X#E$=68Xx4qB=mi1$urz}I+c&WDPVO<7Mh9~IbSQg_y15`F|s76f4 zO{}q>QmyXi_jC$d5LizDfi#9gkN^yogL>_-lqwLj$iM;yZUR2&|P+JUwhuib`mbde3*UvORk@Y)(oLDyiu4s)>+pc^8OqtN?za58*@pPX3{MIJ z+?pn39y(xcxs{~#Qd2vkbzq#1=(CHIF*~VbJBPavcGh&vP5ah-J(8*NmVoG$GCt!;`}k!jn??byc~WocEM)eMZeUjVzg_lFwyuGk$ld zW0Yc}Hmm`h7oLiCdUzh9n-8b}RbTb6)QH}IsuWY$3}{t}1?`>dhi%rdEj$kMU+c7o z^C(Lj7UrXOfZwICkZCEJvoP=Oo+*VZc*gCaI5{Cxj#`Xb02xX~y_&QbsNTwJhu--iz1lOGRdO7%$WoW*2#2`mWr3SA>^@3#yg@+RG!5w9}P#U=`av<+NirlO=pcOWD8p z70kYYIEO*s5Vd>V7NncCfYF<=h$GL6mJwryc*+3wKOJI~3l} zc-3}xr%?8&u!9V)2%q%q4R0sxfQpZks_+=_eVG4YMn6LR(eQ~Bx$4o5hadC#pA5%K zZn@5p{OpMrGW95Q8_ zLn_`%$QEGirNj+`vx3gLB6!}{(T4mV!uG^goKDxmm5_;q1Bk;>+jX)OLmLg>CiqtP zX7~m{i8$P0@ZIowjB*dy1ESpLGRN5Y(ShxuM~vge9(c&$$LLqN%#ME86HmD29`dw0 z-p`2h9PJC#IBFj9r7Ap(MlfQpH$ue=*@Xwi{Vgv^8utp3DCXXUX4)FjP>Rl$38~}O z0hZ}jgK4#^E--fn8b*3zrj3}!G22oupG~wzw$0}L zj;u&yU`9H@>PLpd!)B3I5fh7rVznu=fZxm_CddsWJC>4-1+9r=!dzN#8GK_wu+P~% z(gaXLV;ElGoJdAjC8^MprLBtIp22NYv=QbNj*by4txeyE1%C95bW!mYJ3S)LtrrVA zM|ws2MFv?;A)2QOyF$iX)dy{-NH;{Mdt_6=KFYD=$oTGp?3_2qEklx?X!*nXJll2WCTg{=2wa=8htR~qa(S*os4!G>Xe8kG6{W7 z2Cfx>d9!atr@knOc@cmcvS3$+F1G$O=HCkPEBOzob=6$gWn6vyR}k zku}si;Pd)OD;CGPjvVZ=MA;nKKoT37?iTc0BbykO&90?$SYHv@&Nw^JYgPH!1pe=e z>}1@e^+a#5@8L+-_P7oXu^ft=upZ=6ha>aY zb@QmQ!-zf@r^)H!qmg5T9p|zqIHZhsG6hp8N|{gAZt>lG8dBY{I;T>k&ob;x3Ke%d z4BvqLa31glhOcv71Y~nuVz@HWWfhDSEC~X?8o3f#iqS%m`mhjY5|Ky;ca%$4My^F- zky%*rXSj-VbI(()J-#y_x#L)eMmX-t#A1BHTtKtC%{1nldtsh;BDWwj6fqlS zxrS3F#?N&8^#FAIrNfjjDa6{t}IaNMTc8PsqWVlX{EH~8u&~YZN#y= zG^2*V-IfMKZOnMf3(H-ZJgyfU%|UMwZNj*?h5~BFu@P+5+JVxFQ>P;b%*74q%HNWx zZKACiw|8-SE~j|dfw1-%u_Hm9(RL@OOSDt8dr?=w-3Z4WHBN#)(H;!TVSP{Z0q$|{ zXs>8r#=+f1v_HYU5UFd>9uPf^eZ7EY-;`e;aOPXb@u=gzAUY`864HZ7cSv+7^~2B( zk8U!}_l*D)v5$=Ihn-P?m$Jx@j$U$IpscUw7!T_XS2NWZ%50S~COXnGHhKUnt|z++ zZ9Jg84p-3@^SEdhpNqnoz-1Kdxynlgf3-}CPK-_=oylmY5|oQ}8tP&Ara`Zb>WIF~ zvKP_Fi#A~SY&T4g<`XAjw?GA_j&vV8*1)+&4k=Rk?2d0YqGMKZvW?5>ZbFeUMXk}H zh(K?QdOgBl zwWEftH%%ohen;7ESM*0Zl*8H3MQMpPf?jjnNTFeAD! zx`=TX@VP2hS8|c!a)vA8ZU($G>Q$Y026m-gr;<`64>No>>&uWU#pF+4WXMI-3a)XU{62x* zwv*A$QA|cS_i-7;rc!PrN46!U45!T5uKmEapq5naVf16@w=-DL*%4h&8MBvYhLT;; zhQ$Y>SNIxlRmm#y)#VU42UEDFq7%R`bDE#!b&x1W82x0_%HmRO>k@eGsxh2CpF>F* zH_LC6YOfT!!qEVEzl{972rFl!g^uIV^U*7So3OQ*5AGS@SEFvWgOgS-fO;CWx}4b|5lWcVqy~oj)JbMy$%4_W0?G(Wm(Tqy07vC>0qo-_p zt(l-L?^fBPhK25gw+z(9ud295sln}C15b=r4F5NV`o5Nz^rzoH;r6dQjqAZ^ zmIDJTr{FIm62%4DdRTv88dO7nFvG2?OdL`}<~i1HeU02qT2AyK!^p}}DOy8;bye+@ zRC(OvSN7x?JiKy5&S(`})52Kr##Nrd7!v^H!2hx4o~l!BGS}@6s)n#B zmARa{o{vA3XwxeDyUrD9IX^jGmBS2L0nu+Do2LV6RGd$^9&KKwvC=}AiCWwTRq7a| z*ccDbih$4Or&7{#A(L{dq?0`S{R2_$jOSpz?KQGdTn9V4-QajQHvp&+=w;~roQmsZ zrHim~YA;|uUO+RLgpc)#7o~t#!1odr4RN5T%}JppeeV3q)hEfR?q`$ctXK3GGs;}n zFHMn{Ua|uCe4;I2oF(X&S1x1NJl5mCfdFmdSoO$BX!W=7lqll9jJT_q%=*d=fEpox zdeW|1m!dlp*bLQawYG9&g7GpVhWTT@8_;`RXIc) zMc0TpoFwcRTAS)zI9_?A@)F{3xbhU2#)(V!pqFqCUf|R-3|i$l4d@)FA7#*a^cOi* z8TAh3)mhLkRbC;^aq|iE+qj>K6z-BhJ8yYha7uhYK~J{jJO@LSZ3zxnM#x^+ z6-B=lcY!mwjG}dexJms)f3xz8?Rw=*THE}RN|Lx%xykOQ9Km-Jpxh$r42s?zz_$s< zCmck)aq(S-Rom?rk5}GLp+4Z)!^%e-uGYZy5Y*?yd8*<+27IsbiHf4=yr^7rU9GFY zbFu2`^0M->sfy{dEP60X{W1Uo*_bD84)|F3p99KF zTq%2?pH zUU-i0^}bwh0HA>!OW4|Msc`fM?YylU5dJC5nz zg!C5sC}87bx6ET=V`FoxMlxQ|zL!3eG>6v3l)Sx5c6%Wz^Qu;o%}LOiKzf7O`LxY` z%s3I0Nfg6<5lVsf%8_&GM zZv)`ENZuK1t6D95KS9*Q+FfCL3ilC2EmrXqiBiH#(0XES##=;dRt9VtM)k$Ku>!Im zVElyT32a`tM~IaZXGW~IXRY@ywnZhgmBAI9*3?*u*%(|w%Q*i1 z%P`kv!=a*`vE#;*_8qakF;8I#bJ-o+6KjT5-51jpU8bwpy`rwpU9i-z_@?1Ntf9N2 zun*;~!@3{TWh8SU){y$AnCXh@KS~3BJnY@~QkLPDGJ5|+O zM2I4pq*XEtQPxLZv3M(XgJ`i7&UJ=ei`@iNg1Ov9e;Om+<8o)QgKo#}Fg%-`NNX^+ z>=YmFlf)ygm-OvH>|tyIKQZPwpS~iIlzbd}5_|SqZuYgL49+|zQ5AdfT3JQ%IXG1m z{fui_*Xmw-2|Sb8sK;$JW>9@jL5|oP64vNi0~NJ;^aRutyw=FoCMua`9Bxift7|RM zw;;I9wbtk#vrka%0Jpu?o;ZrV4jf8Y?^FZFwg1}xWADwwnmD_M|3qkOTia@DTWxI% zG_kg|?S$A?TifEkD=O}&ps1jzsJNqrh>8dbg5tjK21vq|K!60u0`B{+nVBd7x7io5 zPkx7(Qf;5->GykG?;rJjf5Y{eIrq8GedeBfn@LD=rlpPbXz#5ZS3CYM`A^Hi{}~|X zUek!2SQ`rIFyO+v@Y*43he1#3JhMjq%&Pdb>?E(xhn_h$K4Y>s{k!L>e@g$Z2aleS zI;A$Ec5%wICabwHU!uIJYpIbS&1uSm|3lQyti?A@_iCcy7*ji|HW+F?`xz^^*LzZn zGcPrbpW)EzjoZ8?yKY(YL5}sL7uAM&EEhs5HF-hpQjd0tXTP|1Xhxhzdg|fnep!=d zxkpNYm9J+?d~HIlswwAL`~M_IrmX<`W9t&VrB-^6ySD6XdKY6=Z5qD1w#SD4X%oFq z8gSS3*qz^aZo^K`n%mbiYWu-@v3b*izs&q)o_@RS>ER2{te|VWXZyW&Ydz`Y+FPD= zhsj8(&4M!ygT76zo#So6^&T73rk%CvwHrLL&2#Qs=~*zZ4}xu4ZEVw6+5#4vYWLM1 z%81{P0rHa#b2Bn)H`m5P9am@8cuJbmvTD`od($`89!l!wT_?7BJpW#=+nyC8WPOz9 z%C^^TgWLy6J3Kan;d%~uq^lWgJ^72kD+e{$Upq2u0$j<(jknkAs@+|?r*?0xA*1^S zH0dDNAFAC`-{`*td>@8%#+n%*WkX9XhOto4aHMvCXG}wjre9ol)N_Vx&wl0lW3~O$ z`++qE&qLK&xu7L7wY8esoZ3X}9E@Oi7Xx&8wK|V|V>%zCQB9+u;@Fl9}!qXV6Q~o+&U!D#1_Hzws59W&y3$n`5h84_7+UJMJ4jR@d4g zZ!xrLM(V_-zG=*Px}9k9xe7`hhg1zv>lwWdU}Tv+WB6s*;?7n@S2GS8;oUUv!7muvTCMXbNSsV3`6t)r>W zuGW?`bca?gZn#mqIeB`TvEdrnUI%V%C~q(|#BO@rWD9-WQ1(o3fKBb~rZYi(Ju>=? z2Cma|eH3~(0sW4q{0ZS#!3(~uHs zZ+g~%d7d_Ew4AbWgLfvusG;lmeHnnN&KRxHVv>;b^ zPY>U0xDMsS^;a6Yxq5)+a>H3@%Lvc89qYQo+V!NC^PFXZXC3S1Db?tur>l39{M0Kv zzj<3_f~Wm!p)X=R{qcMLMYw_iE{C_KlQ#76dg%KXPftq>gpt-C@@{)ez&r%aA6vi1 zyl3X@A30B@Eq_`)hk$))>K0F*+M8PQk5Z`TJY$I&2g+hoH6b>tBB`PPrXihMt8@1#>uX5&~ng%Q=Z9%*N~o6r0cH7uJ$kWJD)tw zC3v5upL(C?it?0+hW&J4h9~vM^~`)GJ-bPc0clQCD%LgEHQ%)m(hHh&e|Y#$Qqf;} z{tnb^k!z55t}g~(6&shh`g_O0xW?z0WLLw5r)NCj~78ExFGtcZ0Uu>#Bf$ zJDznUW4miV+=p^KK9_jzNKgGW?)kMk(DZ>kM|u$azj?oFK=S&g)o*_CLGXCUb-8SC<0T9BYd-c?!eI_7yV`~tkf$Vw~pH zebBW0rj@(^+I6CL{M^f03-vTW$%rO<(Q8=@+7j1{G$S1Ed#i`2qZZyf0=eJj2Tij&c&8OK4x4s7SXCQqRIOkdb?Rf#DMc%%<2r~T7 zz|-fA(k0h5&|L9o8`D=kQbzJ+*Yzgd4Unu!@Ra1b)ud~*h35tDJ>#}lKh?APVxANV zdxu9#hj$>ZJu{+lm(y$i)XSgucRaawVPET!Tz|5@(sW<>y=2{=EPmJjajbWB_l~jq zE(7$`BiF;GGCjOKR}QteY}9Yq4Rb9%bv0buQg5q~9$Uf{o^?0*Oy)K3c-fwI0>;LY zrnYQ68{@I0n|wd5!Sqc>J!PhQ=l*QZ8Ce(Q;=nRyV{%sG@%fE!(ugis`jX_O$wHH+ zHdzB_Wg1-25)(2eczoaT&bp^wSQsnUyfu65E!W_B;tHyRcZ2G>!Tx`;WkIj?XtM1I zQm>{|??ftv%E;hJLr{4_*cUN4JdKb=K2^ViL?+ z;Mpy6-H=UBnx0<V|_nqHd^1 z6XMwm4OhJ*Z6u^ed2~<9{dGUOZj3j7tmhc&O^t)>~BVYJAEZHmXscyIk?WlpV|<~;|zw%btGw4yyN5!sZt!_$T}=?mA~ zhqFKUQw=gU%&dFp(LGqxSTfpEZaVB|08yUQLeKt>nmm&jiR%^w^l!uJGEf^c+{gKB;cCSGT5aZC$cgezs;$eqXZ>E3ncd5>w3n+`ztdhJxHPdv2_dIJAns@v$%ZmP@j95;Jyax=Gr z)NA9mx-D?r;n8mQ?00(h@Of+R@%gju{dF9m|+Nz+g8|?qnR`iz|Hd-2!dO#U{-I0xjo_s@H@t^EU>WqKVltOylrh%~P z2&scTW3{K}yk$*xW{`R{)up^i4^Pe>`B93gNmmI{Rh-MP9m zb*DXEo|d}yjC|80->AF(jIPlta^uxHGU*m*9na;gPd;8Za!sQJ_M9G`+v;xD4gAY1 z40va@X=GgS-0|>d$~m8r;rE`NOEsS3+3ham*8WEe1Dx3fxdpIZKB%kn+SPlG!J8_e z4yT@5Yo7J|&|~$e&X{q(?w+?KJO{6NYQuXpT$3LDi|ox|ygJ%*Bw@b|TAirVtUKhj zc=jxR$SXXn%;P!{N(i2^EbJSAC!W+FmOblx)c=uclzMs61J?xAcLOOiwaC-D-Ji4S z`(&s`+rPdKjE~;W<-y(gPw7AW_l2B3&*U!s(`bBZIq(^a-^&ha(hUZwpEpH$u4V|N zZhObYaF9dlhk5fGOAoCd1*u?Q#53Bben)yWW4y=49vS@?tKaJ|?zx;$NR9VsB0a0f zQ>(G{b?Ns!tv}&8>)(CAyDm>A)`xlW!k@F4@y8sh-rd`p72j zjQXhhaZrQlpn34j6JIo>uRfEWS-;bBr=L|H<0(6*$wOn^Qd5t6dUSSuqqJfZyAAG- zyS90Bjrm8QWuD#U)z4lVTR*>kLH&Ry8{v8vdcB=@LBwEU2oX#SC592hi4bB0F_IWXj3&kqV~KG@C^4RxKujdUh;U*OF`0-UrVvw! zX+$IuMNB7V5Yfa;Viqx*h#}?>bBTFGEHR&0KrAE{5sQf>#8M)TSVk--;)w)8MXVqa ziIv1EVl|OOtRa$#wL}V$N~|N+6KO;`v4O}SGKr1ECL)X2Ol%>x65ELF#13L7v5VME z>>>6N`-uI-0pcKWh&W6fA&wHq2sM#S zMwAmK!c0^Ul|&U`A*_UruoKlp4RM?}L7XH`5vPeW#987Tah|w9TqG_Lmx(LHRpJ_P zowz~VByJJ62?v1^7=aT`;tp|_s3lxP9Z^r*BkmIqh=;@@f*?qOB4~mkSb`&XLLfxq zG0{LgA%e(mWOuR$*^}%=_9pv~eaU`ge{ujhkQ_t~CWny0r-Cy|rM2yzNJm7GRKl2PPzat0Yq&Ln4%v&k584mp>cN5+!# z$pz#>auKPB^^dQd&7UQ}&HJ+M4O{Bu8aB31YnTnvMP*bUC zR3sHeO{Zp1(bP<87B!oSq2^F?sd-c^HJ@5QEuW2lQYwyGMlGk}sRT+zt)LRA zmDDO~HI+oIp^~Y!R0@?!t)tdcX;eD3fy$sVsg2YoDvR1oZK1YO+oL7K9I!qm*j#9@cHI+@}P`Q+b(o#AqkIJVCs6wiU(o+Vim@1)+R4G+P zl~X3lOjS^oR25~RtdxziQ`J-rb(}guoup1tr>Qg4S?U~hp1MF?q%KjHsVme~>Kb*O zx2Zd4?g;P%I4t1BRrCd}URZrcc?o$t_htwmAph$|MXo{g&ilcZ+phW61 z)j&O=g6M8^ce)4NlkP?Lru)!+>3(#7dH_9;9z+kOhtR?FPK~QS@|r1|3b$q-W8y=@@zrJ(r$G$I|oZ z1@uCC5xtmRLNBG`=wv&$^e%cgy@%dQ@1ytA2k3+JA^I?Vgg#0iqt$daokQo+ z8d^*1=sY@~E}#qPB3e%y=wiBrHqxbZ8C_1BXfs_wSJG9qg|^Z*+D=!~HS}@%1bvb| zMW3e6&}Zp$^m+OMeUZLIU#73nSLti?b@~QC`X={xjYx|Vj)b#y&_ zkG@YopdZqYXo4nbil%9XW@(P*X@M5$$8-bzgbrf5G2NLSOi!j4)0^qT^kw=n{h0yG zKxPm#m>I$ZGeenS%y1@z8NrNXMlqwAG0a$I923fnXC^QcnJ^}tnZ!(HBA6-6RAw3z z$wV>JnHfwpGn1Lc%w}SkIm}#U9uv#VXBIFEnMKTEW(l*DiDQ;A%b9p4fl)Clm_%kJ zvx-^GBr$84WM(as!lW|mnDtB=lg?~lGMG$eBeRLgVm32dn61n1;@|gmrkSSvHjDaa;N*E(k%9JtX zjEONb6-*^l#aI|CV`J=0HB-YJXHGCDnN!SZ<_vR|Imeu5E-)9FOUz~F3UigY#$0D^ zFgKZ7%x%WOpbW;~jFY*;++}JR7gNX7GxwPL%md~j^N1lBlA#!yVHlR-7@iRrk$KEC zFi)5uwj0}>?ZNhBd$GOQK5SpMAKRZDzz$>wv4hzmY%n{N9mWo4L)a1QNOlxEnjOQA zWyi6h?09wpJCO}z!`VsfWHy4G!cJwUv5{;PJDr`uMzb^7S?p{!hMmLCW#_T6?0j|s zyO3SPE@qdoOW8Pf8M~Z~XA@WzyMj$*SF)?v)oc>GhD~PIvMFpTyN+GYrm^Yl1~!Au zWH+*#*erH4yM^7#ZezEzJJ_A~Z!4dy+lH zo@URmXW4V?dG-Q(k-fxTX0NbU*=y`|_6B>Cy~W;U9W2UXEY3RFJM3MymUXdpY(0CA zz0W>iAF_{Ff+bmsrCEk$S&rpdffd=uYy%#7*WRxGCIJZWMciU;3AdDsrE=@I^;{a4&TZf_xJ+&%w~5Q*Hgj9Jt=u+lJGX<|$?f8Hb9=bG z+&*qUcYr&{9pVmiN4TThF;2~8b2(ftr{T1mj?3fnxdN_`E8_H=fh*=pI3riem2u^q zi8FH*TqReSI53czyyukq_g;`APg_K7yaZPvxiak$eFn@$U${*v^d^VrM=kgj} z%j@_&KA$h(3;7~m&l~t+zJxdOrFVuU%uTw$INE6f)b2n&Tp!eU{GuvCZ>mI=#+cp*Vh2`hv|VWqH2 zSS=(8YlLKBt&k$53hRXRLYj~+Y!EVpOktz2Nyrj53tNP(!Zu;MutV4>>=JehdxX8h zK4HIbKsYEI5)KPTgrmYSK`mqpIYO?W5wwC%$P@B~0-;bS67+&WC>BZtqfjc83FU%G zFbfqzrBEeU1gl^Z>_W9rBODh_2q%S8!fD}*a8@`coEI(#7llj0W#Ni&Rk$Wx7j6hQ zgEZ@4L(CL6 zikrkNakIEZ+$wGpw~IT(o#HNWx41{#EAA8biwDGm;vw;{ctkuZ9uw7KwwNR4iW*TX z>cl)TUn~#{#UfEJ8pL9;L^O(}VwqSjnnbf$Ay$f2qD8cdHqkCti#6hL@q~C%JSCnM z&xmKmbK-gNf_PE9BwiM;h*!mH;&t(ccvHM3-WDAqDqkHUU9nbliFIPVcu%}9 zJ`f*@k3>QwMM|VaMr1`!#$A9c_DZ{@G~ zjheK_+a7O!tbKgtvFmaD~NEo6D zRt;4RQw>*zs79zpsz#|st9mE&Nm!APkdTDU=jR^b&)lSW+S} zN=hYVl5&YjVwO}$DkW7Ci^M9iN$iqpNsZ*Vp;NBt2n6LQO(&!idM~J+*19(X-o8*y1JEK5Ok!Hj_-AwIKH8 zW)exWmn9Ov9&yAWE8SB@f$LD^52%_xh*Kbzrl)1CQW20uz3Xk^dK7U@+tSR&6 z`3(x69N8#AnYl5u=X&z}!e>SJ&5n(nGI!qBe%+#@{f0IAn&&rc%DgFa7fgxx+V5#i zBH$1;Y35g5I(3;CtWY3dDY|s&@-*vzv@h@hvu4s}x&MNLL@N39-<0x|N+gYDjhkN! z_>4j}d>`Yo1gv4id-jrekmKRflTd<}d9AbM`&LeerIPAZZ900U3}3VkHfSYL@W@Fj_q0CHZI zNTXkoNWW+NbSI?cO}xE?@5|HgS6TE5~>-bNzr+EyZc4Cp_QNEdu4k#=e) zky3!>BZ+j@#}aABPbAWM;IN-WI@Mnyl?6zo7_j?OiFATYB5fy^NUs5#+e@S)Ka)sX zcaTWW0coF0q=UbZNLzdBP2((jZK zDFf&_Nu)8~N~B+ZCz0LkmbBK;R&>?@Hj=_iqP z?k|yYK>h%UbnZZj6d5FuJ_OW*CDQ3bB+?GS66yc6pZ{;RgYSdF`WFQ2Ul6Q+LGix8 zOTf#(D?oGLRp2$?b)W_C2Jj~E7SIxC1-uQs1GEO-1>OVR2igE_fe(NWfp)-0z{kKR zfFIxw1OT4`GC&Tr2R;Kj0G|V20AB(ffv5d4uk+B zfRVr`U^FlW7z>O8LV@wX1YjZ%2808XfXP4vFa?+jOamf;C}27;1BeD@0<(bGKnySk zms|S-@ss3$PW~25bj*06T$Qz;0j<1122Z2MtVc-aG z6gUQ`fovcL$OSZj7SI8CKt50a6aqzn9xwpKKnY+3N`e2I=k@>e+WzGZi~oO>#y0wY z_1gdc>kjkG|9`n(>^~z!I4pCNL#)Eah=rAoDu=~kb=VwsM>RweJnlH*IO#a$IPGYR z`FGB7-f_Wk(Q(Of*>MG8^<8sZcieE?blh^>b~qfU19RXGr{j*}uA|oBa@0BM9rqmf z9S=-22sD1s``Kvao#Lcc}7L%&Bmqg~J+&>zvR z=uha+=r3px+70cF_CR|=)VapkbA8c%5L<2lM3)-`@#Kb}!RSzQ7&;scK}Vn?(NPfV zZ45+n8;6FX>04+p|P(5lui_sE@`&EjTq2;IvHG3j?RiTZsx@@Q&tww7g-qs0-m30a|jh;cz zqUX@_=mqrR3*Yva(97r*Pb9AE=neEHdJDacI#3kFP#krlchI|NE$Tw+(0cS9dLMm& zK13g(1WKY5N}~)!YvNEI6;Kg9-yNwH>_59W)#guRTtf;Gop#a_c+ z$68=-U~gh?VJ)#%*xT4USZnNE>^@%zb_Br+i_9fO4`wIIS`vyZW1r~@Yu@`;K>4bfYeTRLIb;i12KVUy%U9q3ApRr%C zAgmkK9qWPhgs4-!u|5z-svp)LqC5@624RD-Ay_ar6dQ&O$3n0X*hp*?HX0j)HAYkl z#l~Y3u!&e07LHBACS#3pil$=IAih%+HXWORMPoCuS=el>FjWjj|rHFJ;oZaC)jV;zc4o@!KHXJ+z0o?U&3F;U%{K> zui~%auj4K7H}E&{xA2yDEBtNz9lSOEF8&_=KHdgzi+_NBh_}N(!av48!ToT5JOKX` zm*H}}J^mTq0skET0{;^4h<}BDjemn9xB?Hvm3SxoTl_oxd%QE=1^)s65$}rsg#V2H zf(PN<@a}jIyeHlZ?~V7t`{Ml|F3SLXAU+6x(bt^8_z*l8V#*A|hvOmm2z(?y3LlM+ z!N)@UmQZ{=J^`PIhvDJ)Bz!U+flq+Gx1pv86^gvgU`k1;j#F9 zh?24pUxY7)XeLYXID8qt9RC$!og_dMk`;I&L?>AVkxG&v8c8xl8%e=a@pTY$Bn?l; zH$aS$Onf80$rD#(3%(U^j3=@K--++ScYET3?1QKv2k?XVA^b2z0BMZ*@uIiA8qdaa z@LY&QqJ=0Vd3ZiV7b(Pxa6QBjDTbIKM!Xa+!^?3KLTe{HTZG- z1bz}fg*Qg$IE$ad&*K;Hi})q{GJXZWieJO8<2Ue|5C!8l?!ZwT!*Se+-+_1+wGhdo z4zGt;75DK65LMz4PT(X?L4*kgXK@baaRC?c$9Mz&1pf{H7w*O-PN}n*)5q!Se98H; z^A%@v=c~>az3pFfzV2+{e8c&s^DSpfXDjF1&Uc)xo$or|bH49v<815v!1>LWQ zB!)XfoFkkgouiziAxgwp=QwAmbG&l`#D)lShC>91$<7Ff0x=b$KfLH|AL)#OXcRM? z(GZ1VmUFf<#yQ71*E!D_>zwag;9Tfj1o0l0IF~}qhh@&?&R?DJ&IG3l;yWZdS2`P` zIV3sPIFp@gohi;#h`F%dnFcWtHbAt4Oo(!@$(aR_4z@VAI=4BuJ9jvDLJWf4&OH#1 zV4rip^MLc9^N{nf^N1&^f!dkv%yH&AHBPNl=gf2FLll5QXOUCyG{A5CmpF~iQfHa7 z+-Y)}ofXbXXO+|P!neKEX>;10)y^7cg>-7bw16-Co$lghJp?i$_t(kkJq6=dL*j2C zJtpm*uA9?;elOwHrn%Ef7j{clM4pe@zI5Q~H?r<5_;BZ<4daL82bYb#Jhr#cVt($L z!p-W*^{L|c7PC`An=kDne6_u=@F;G@h`Ond*H0MIPna^UzYv%8Vc4CGm04ql@~blz z-CmIxk}_&*{LxhxXU&djo4IN3oC)VgWkwli4&F9;fhxg2X;S9x>7Qc? zI(vrdMIZMO>tCHcKdqS~p>k@XqX##o4QeZlmWP3@sgN zTmAFen;C7k4chkM!pEvt6Rr>OjbFau`fS@mB<4okk&T0eW-~(OUW&)J#%>!TH2k`2 zeQb2j`d|Uu(tDz?{*@h1c80A+1`kcN4j%n$gX-1QUvA#8ZKx2wa+ttuZP>YQ%y40I z^pu5nmkv(|UvJv_DB|^1AwtaNfNkf-j1am@g!E~#xR>IExJ0k_9N;kC6^eBNHpFgqZ4sxP(Qto zU_)Zo4B=AZh;^SWh!*G_8)IA(W(vob&JuPmNJ}r-@uIhV|IBuyehdF(TgF&rSjEUr z^G+;nm{_&me{(bS>*~eo)#?m&o%*r5ZFYz3FSEC0U(CLr-7M#=oK`uX<#f&InbR+4 zQqJxi-&|$xz}(Tf<8mW&Gjesg<+)dKYjfYw_-n#6X_^wvea&0ikF|ZY!?k0yv$adK zhqM~4Qg=va)}7Tkbc(#rd69Y3^S0-mhmSz`_@yAS zAhCcch%eL^wkSGN^p-wTe?$Mi;YDxzG{bE}gP~pVjN+Na@x{5tmBo%?bIHY$8zqjC zH;o;P-y1`Xk;cu&?M8#~gz=p5yzzqZ)6%Tc{L(gM{$(A?29#|t%P)ISMwBsS?lM_< zX!)XYQ~Aa6o8_)@Uz49{j49TXV=6M0m?}*+(`l33{EK<0d6YTBTw+eC$g40_+^uL< z`FiDNl}Kfe%7K+jD_2%-soY&@tb9`WOVz@vjH>fh7pl5iez6R(Othp~j#&yVq=mM8 zWc||mqPP7I)*|a|>+81fY)fs2Y)5Uc*jw8_w0E%&u&3F#+jra5c8y(cci9O$Y5%f% zX7&E+3)M)?sG69XteV|5=W040k3W9rIC1=w6YWoYbK;j1-A~Lp5qAPVapy$P$;y*m zPc1!_b?V3|`>EefwLP7BI_>nX)9TZur<2aKJ{xv6>g>XE8Rt%(t3CJH`S$0>oDVy% zJ6~|#c3yTtbD{3SOBY*SY@b;(80$vFS z4;U73Nb;lK%k5uke_VcAeoAhWTjhJ?yXARuoxD_TlyC4)^H2BB@Xz#r2bmr)BjAI8 zp8`G#_%`6nfQ|vp16~hU6|g!$6|f@Ui-6AqJ`3m&fW6@VG5nYNoc{%XNq|p4zT`$T zTeB<8ZZ^Bt>}oT;DX!u^K(P4`>wmhM*Wx83i!Tf5(Nzvq76-NxP4{ek;KcRTk-?vLG{xc%Jz?g00v zZkb!|Ztwog-NF62`wRD%?vC!S++VxDaU*VpJJ79kcXEI0{?7fqyR*BC`v>=r?z`@v z+&{a2aR<4(xx2f2xO=*LxqG|&xcj>Mx%;~ZxCgoixd*$4xP#q8-NW3&-68G~?vd_M z?$Pcs?y>H1?oju5H~zwpdxauUp;UBIe5?3Q@x7w6qKo1O#gB@vik}oeD}GS~DY_}T zD|#q;Dtak;EBYwLUiWEhvVx8iDKhpkL zC1U*N_|Ns9=O61o-+zJsLjOhni=UbOVgBL%ll&+9NBB?ipXxu&Khi(yncT)JN%z^{ zli`!;v(aahPnOSSpDjLHeYW{*_u1jI(`T2@Zl66q`+WBM9Pl~lbI9kg&k>(LU%l2x z=ac7??^EDY=u_mQ_c8bs`;_gdpEBV)Qg*;IH zt^7NA7x@qJpX5KwgXG=hJ>)&*z2v>+edK-R{p9`SFH)QRpQ`Id`uqRdw2D07w9l}D6EmB*B7gRN(Z$8G+G(GXrM@&JK(T zoD(=Va9&_+;QYV^feQl{1uhO;61X(*jO?uJoD3e-Wfx_aWS3=EWLIU^WY=XkWH)8E zWVdAw87jkMxXdZLBfBfBmAPbfvM^b=Y?5rUEJ8L#HdQuF7AcF8O_$A(MayQ&X30t= z!~H}2jquH%asHwH7wL!eM+P7RkwM5{WC#+B3`K?^!;uhV1TqpC zg^WhVAY+knNGLKMnSe}0!jN!e5;7TyK&Bv5k!eUI5`|1hW+2hXOk@@^8;L>YAajv< zNGviRS%54=79op~CCE}F4q1jQM}9@(kpx7AtUwZxmB=b&HIjs^L6VWRND7jQtV7l# zX-GP<0m(pKgqHl@*KrTB7ukpGM-CtdkweH~_=f3Av11L9Qa#kn6||jzWsdr`ws9O=sU=FupsHJLO^(*S;>Q~jTsavXBsoz$=qi(H!SN)#)eRW&)2kH;i?bIKs{nRpb zNA*|gZ`6odq3*2iqVB2=QV&oMQirHVt3%Z>>N)CI^+NR`^%8ZwIzhccov2=^UZq~6 zPFAl~r>N7^ndzn;@_CLF2|GsuDvfs#lE4x*8o9uSk ze%YUAcg+4OyHobJ*`2eyX7|kQmE9-1Uv_YINcQOL@a)Oi(b+SzW3uOE$7avZUXZ;s zJ1%=!_OICq*{bZM>^0db*=gC^vv*|g&o0U~Wt+3BvhCStvd?Cp&%TlE$aZE6*<$vS zY&U#~S(?*4=hd9obKb~lorB~kaysRFpVK+#hn%3CZaF=2dgb)a>7O$&XHd@IoZy_0 zoRK-9IpcFC=7i;h=S<0o%!$g0&WXucl=Jsj_s_OioU=41E@xRzV$RB(lpJGDX--*= zDW@vuM9#^a(>Z5y&gNXnxten$$CYz0=RppWBjh~Ec_p`b?i;x+b35jKm5byC=61^M zn)_4kFS*@vyXW@E?VH;#H#j#mcYJO{?v&icx$(J)xk2*tucp6d zpk}aUxF$q1LNiJ;M)S{Z*}t#dcukyUnI>M7s7cYJYSwGgHJdeCG+Q;>HM=ysHG4FB zHHS4vG{-b*O|~XSldI8c@-+FH0*zi{)KqCK8k@$hsn(p)oYh>=T+ui*cQnnluWDb{ zw$QfJzO8*n+eX_~`=Pd-_9N}5TA5a^?V#Q?I3=+boQx=h_>-4@+e-EQ3;-9Fs`-9g<^om!{S2l?y;^x=Z2qCkmmX3HP36A*DCLw zyw-W|=C#WU$s3V3GH-O=xV+H333(IqBJ!r>{j*#4?`t@L_-u)pAN!O?pz*JCGaH8O3!RdlC1!oJc6x=Up zS=g$ubzz%Ad11%GPKA97BMKu6w-@dx++Dc8@K~X`P+NGRkSJsd1^9swY0*nX9g03L z>R9wm5mMB-s7uk0MLmo977Z*4DH>4}RuoYbSrk(=r)XZ${Gzy`WkvBtiA5^v(6J>Raer>f7ks>Oa(fq?hUC`VRVz`cC?9_226|>$~WK^gZ=M z^~3d{`tkZOeS|(*KT|(jKS#evAE!^%AJ%L1`Fg$Hq&Mp;^%ngJ{TclQ{Z0LCJ*s!< z>-6{agkI2#`Ud@PdS62ugP)VTfUSAQ(i$WBB14X>s%7cZ)k0cPZ{#98}!BxNmX4 z;sM2jiU$`DFAgalQ9Qahv^b)8O7XPf$l|EtnBqCbvBisuR}?1}uPk0&oKk$a_(<`w zVs){mSXZnsHWZf>mljtQ+l#LhUoC!8{P!d4pKT#2@hy3yUh-v0 zr;=|=zANcm@?%NYlAlU`F6mj)tE5j!zmh>ELrQ{6LP|!LgqKV%i7rVhNhwJy*$jGr67G9pHWv6Hd0G051>*u&V<*vr_@IM6uA7;GGGOf;@E zCK=ZnQ;h43nZ}LAEaN}BW&gf*TZ~(cyN!E{`;CW;hm9Je)|h9^Hx?L;#!{onSYrz>1$I_tEzNP(22bKnxjxHTj z8c`Zq8ef`FnpnEJG^un=X>w^=X?kf!>BiD6rCUq4m+mjslTzkIFtN>si*TtZ&)CvcY8`Wh2T)m5nJITQ;sNtSr1N zqU`Ul?w@TDSvI{arfg2xyt3G``DIJX;>wnl#g`?PrIe+XtuIR}OE248wx#TF*_pDl zWf#gWmt84yl;LI0vO8t>%cSMa%U>;TQ{J}x!}50JAC(7{cPsB%-nTrsd}#TI^2~Bg zxuyI>`N{G#ywW*)99`wYy_-neLky z6Kmp4BK#PcuerIorTJZRJM%~8kIkQ${mh@5W#;zg&&(aoUzxu#BW8v9J9B4q7jsv0 zkh!n9pLu|Jpm~rv#5}@0+8k<*Fi$a0Ge?@E%rWLz^CI&~bBa0Dyw03v&NOc_Z#VBS z?=tT(A21&_A2F-V8gr?+%4|2EFkdiVHeWG2%uch*OqfYCZGK|@4SpKUx1vSG8x?O= zw5n)R(YB&p#U~Yh6&)%*ulTa!tBSwBx_`FCHx-JCz=}>4eJg@1hE{}BjIIc)m{Jj4 zF|#73BDNx~Vp+wn6$uqd6>BQeDmGVatJqPozv4i};R1MLB*pAvVyA+D#VJ0iYM^Ha?LAWt!z>GM&&z|tt;QHY*X2;QdTLi>`?i6 zWv|M}%Bafd%9zTzm5VADSH@K?t4yp+s!XXgRbHvQT6v@LcBP{dt8`V?RX(U>D%nb* zvUyd@Dp^&>Dx~V4-LijQyG~VItA48LTNP0?r7E&2x+=D6e%0ct_^QmR?N$0JV^v)h zQAJiURYKL{DmVN%pVZRA($dn}($3Ps^0}p>1+jFtbg}$s`N`7L(#z7<($CW0GSD)} zGT1WQ5@H!)8D$x58Dkl5nP3UCgj*skk(L&a%uBZ%MSQwxn26E$c1m zmW`Gy%Vx`V%WlgNOTMMRqPG|P9N zvz7~%D;9?ZwcwUJmiv|mmWLL?!dN&9Z+T+*&GIjc8-5N^YJJK2vh@{fb88E0OKTfz zTkD6`c2=2HZtY<0X#L9iwH2`{t(~mjTEDk;vHoZcvUaofwDz?ITZdYQTSKfPtfAKN z)-Y?db+&bmb&++kHO?AuO|q`BuC=CGGp!q~o2}ce`>hA8hpb1e8mrctZ`E53)?%y4 zYPMEdE!Gp(lh!lV3)UOfn^uPvwYpyT&%)MO?^_A0U=^*uS$%CU*_zv0*jn4(wY_g^ zYxA@D+hn#5HpHf|DQ(}{zPEL?{bUQW^|bZ34YUoi4Y3Wi4YLimh1f>eM%qT%M%zMd zVYW!y3|p*izHN~$&bG|9+_u7&Xj^GpZA-GPu_fEq+0tz3woKb5Tb6CJZL4j!ZI5lA zZNKe+?VwF<%eHB3`8K1i)K+dY*~~V(t=e|NcFK0fcExtn=CrwN_u(forFLI?bNg%d zfA*;U``Wd%x3a%uf7kw=y`B9dyPsWV?`Z$Z{*7H>?`-dC53={Q_p=YQ53+~YW9)P6 zvGzswCH8oGf_;U3rG1rswSBEU#hz-818x>a?X>WR9jS@Atj;cfZf? zUjP4Fo@agjC(oOiIrE-#-uH9fbLPyMne$#gce&wm_3P>x_1t=1eMo&+eL{U=eO3L@`i}a0^}p3Ws_)g%yTQG| zvtd}n@CNUOQ4Ql8CNxZJn9?wCLwJL>LEli;P~K40P}{J*VMoKRhTRQ&8V)xcX*k+&vf*6A`GyM( zml|3cIvVaZJZ^a205y^uT^oBfx;J_?4sIOUIJ|L8eZW_}xp~mqvzxxI-9MXy+r(=UG>MwTO_HYYridnGle$UQq;E=SN@>by zvNUBiWj8sR3Yv6$%Zip&Evs7?Eu0o^i?~JAqHfW)=vq=*3@xUXEiGGHwzuqVIoxuj z<;Rv|Ep;uYTh6syY`N6Z($d<}-qO+1*>a=hW((GGujO&ela^;K&s$!!ylLs(>eD)- zbyn-V)&;H9R^Qg;t$wX5TGzF%Z)LP{S_Q2kt)f;*Yj~@wHKjG9)!JIyy0LXj>-N_D ztp{2UwH|3b-g>gNuJuamtJXKIJ=$E`+}ozKO>OgOo7J|cZE@SuHs3b?HbL9hwfkpt zgtZylOl=u$);335L0d^%RaI1-GGgq@C2>tG#!7pLX|l&-Q`s!`g?pk8G#3d$*5mpU^(BeM-Ae z`@Ht~?F-u%wJ&b>YhTfx(r#!swr8~4+jHCV+a2u%?Pcxd?N#ly?c3XTwC`%)(|)-9 zX#2_bbM5EbFScK5Z)v~Mey9Cz`{VW}?a$j^wZCuw(Eh0%>iB0P`*rEa9m6}Q9ey2x z4sl0Vhq^=4kSUa*iayoK5iaU06G<39dbadS4xZUxv<8jCHjyE0e zIzDuuo#f75ot~WoItO(w>RjAO?eyzh*SWrv-pTCbcJev}o#IYeXLx5sr?OMssq55t zCUmBBW^`IQvpTJv*`1Egt(_M;FLgF_wsf|2Ug^BrdA;*y=e^GRoew)7cfRWUtMhdy zPAsPmb)jA4F83~vuKrz~T?4v?by2#$uH8SIV@%i7u6bSayB2j(yH<4hcdhPP+qJ%n z*~RG!=;C$>x)fazUD~ebE?rl8m!-?zmD}a$D(>3QRnxVxYkSx3uKiudx=wVR>pI_c zv8$o0wX376yX$Hf)^)GzVb}Anzq;OceIS;hN4q_`y}Ac?59_9MPw1Z5J-K^o_pI*O z-SfH^b^CR%>R#Q==w^0vx&ym|y1CuFZgIDyJG5KY9nr1o)^_WQ88a^8MYkr!&YD`u~nEqwi;W5t;N=1>oFQe z#~2tBV_|HJg9TuLSP;g=cvvvT#{^gi_RqHJuS>U>9!p=vz!|lyXKX#^KF2libnp-S zEcp+L9~I9O>y&3=&*&E=T{olYK~}4Ej_snoIrm-OgZ$3&g)AK#4u|rJ9 zv)i&am!#9(Sf{uNya&7(VWRMYq%L%&;;|wvyi`Mr>q)qqA}4)H@=n=cj3T^C{9!99 zQPMU9yq3?3+MMttiJ#$~P0QL|dWA&`n#5ffGE#Di`0Pb0YgPC~4vq5CA0n1U+8@8b zu+PCPW)+vzd|kVLHpgi8Zoy3bbtAQ~tc1@Zb8qlA3I>JzC|n>~BZ`-ZR7v_wJ(dz{ zIAE}+aZKLk0*i0<(46;$>z%8r>S?cOJsB^UbnaZq5=ppZzU=o156xD6W?WZXR`OPJ zeFng{73Gu|12*xQK@ff@=lBCA#KvA&}(78g;An*Yx#*cb4TRCxWTca z@J(SV?Qfcl@iFAB&_xmy5pCjRuFBIFO|B5q3K&`iHQbe%%PM4Tiu`9I`*rC~#=94G zRPSO<7yp^>&)6Y(5_&moQFumVoyKa~m|g57aSbuMV^DpfL7lq8n3Ju`33V_xWJ{A& z91X*;AZ@fQg}FwuA$f34P@%nOH?5sMf^mxB!aU7tWTmmSLFwEIVSy-4vRl#=rjlvo zC*-f>rQum>i}r=KMz>XWS$9>hN_d=bJL&JF6^0_i0OL~QP?IxVo--hSfa6XPQZ}zF zxZ+{u89F;)0hh@O<*yVR759@a3*R69b?yGy91p{HMy=B)#5E->PI{N3Oif88+cw&k z+Vh;}Hr!)BVz1#ubKVBF^1}EF1-pc=rE_H~WHGW@`98(zh@VvN^^UmI_@zn3X^3&7 zG2isS{K5P@{j_C<^{{oT4Z*AOrxjgrD$1@@^sjlssg(UG&kv_2&9#d+JP!;D@(6K} z9|&&@{}?qvS8csl8LmR{?G=@D6*HPy!{YGohcLuy@eAp;(1o(Au}MjrGdJ1uOJ~yV z@X69D#SPs*8`-Z**P7U#o@F~|dzedetSwqu)-HS)@yYVULBea9W&FqdP|4fyCCYW$ z>AEYrjmeC(^XYZjyX-egCX`QOg@_+ZVTX;rn(58H%DpSZgCEz*_<-^zTxm*Id>l)r`6${=224(P?N4f!o(l8h$v4qqF2 zCnhiMS-jAIr`4KhmfM*~J}v*U11S%v*j4F8TR{t?n8$j{d0R)QRZIYuZ(Dujyq@N?m!$OX#LDuc?bx}YwL9jBY5GwU|%67*?$Q^K35qJ}mfwq&MCy{Uq&!_r=|D54<1VAK&co#0TI5@j!jfH(4^2Hwl|)y5J$vDjl$>ZN8@AgvG_k5*{@62+b|9vkH=Uq z2YLlhz$fC9@X7cTd^v3@u3-A}o-5pq)9_fHPFN9kIq@%%N_9d~7byBs_CRKgJfd75^(6jT(ukB>hWgAx>&yav(TT8AnxxpHdX6J7V13YW zNk`ZP`5iSsO07Ajd9Ghhya?rMNhcl(2Iq_{DpC=*X~})_LLBY^Fqg}f3VTSa!?5r; zeOJn%tcTTiY1W{qpz*xkf&+p%LW^jY^iJ5J*tez}>ruPSdA-`g|50>E+>ZfRKCFR3 zv$;XsJ_51eZ$VDT_rgNaNwG(0cIcq6<=^}m6AwQVc}49V)j=$d`7!!NTw?rz#Dz&{ z#*XYKg!69yJjCJYU^_lI))&P&ZJP==PkLnx&9D>-n58m- zqDXN?e<3M0Js4kUALN)?rV-ScD$KqPjiYyAsc1t8FY;n^a@^|Vdlocje1T6zR>0p9 zJ{}QgN&9D8_1C3ant7aX>6-5l;6v3{wYOp=hQ%2ncx1tgav^S}>Dj2VpK^(IXw1~i z5!LHhoAVhV_rs>h1}gv1EKjLQZM1}C|CD`6dc`!-dRaI~5vhJ3L(*w<=B!(eOnUE- zT9I4EkIdRonSL+Lg%QEL#59F_MD9&Fkn&rK#@uEbn%`XT1AQ*xCVLs@u`o)qM0#F! zE%KvgQsNEEXzQL5X+>m3X?0U|CF>V?ymGj9a-uYUS*b$;q@!h{HDA~6pUts4I$QV3 zpfNtp7?(fVv8L!J<{;K)RxkBM?HTJOp;@+9c}BA&MIU>QHiwP}ig4n^;gDhCgRxVS zE7F?MRvJe*W)=SJ^e^=)lhowUw`uk!9xnLNd5a~+tzqZF+9QP;FRgpbZ*h>(B~y_3 zESHo&vs6?0c7wj!o{*MUYq*q-7Nu1eRd?BLb5YTF#dvMAPMnfz^kz=bN@Ff3oUvcC zzp}q}X40-Pp7Ohd<+7&eWpR7r*BIYt{Iik$x^yXy@s+tXSGc~xQbGU7YwEt5g>lmj zb5loH=4Ib2TI3L}Okoie;g*E_G#C$h@eeK~ysWP)vCnqqsnN^OdH z6XT*w*GchT^{SM_w4-U+>CM(V)`o(Xf?u7NDu;7YH7(I)y0?~{d7GU{y<5%Tx)Pf?RKq1x*BDH;7O3$6Y0SClWT8WwO&I$5zx<(eLuom9G!mchFs zx+)r~IB4Lc6`Cif|CBx=zuZwDbc|OR+`=C(uTWURo0VbF`m`VIckL#}ib}G{W?$!| zR&1>n@%yWW#{L<1JFZv8PG(W|dS(gp66;cUu?mf+#Q$t~Y><{7sXia|&qns^(s@|6 zGJA6joIdgm^6?QhQ9s8O#1Be8lTniuQBYR+s>*ELOD|;JX8pojEDVq&ge8XUmA5Fo zBO8_1m7*9)jIVB9{Pp-j#*=1JI>?!jW4BLGI8=(5r*ZQ5l}S4`q$vwkqj=*KkC45RdWoC#f^=6HCgVlOmGw&R=-06!`jx38 z%y4?7WwY&P`}k7HhV9%d)gFvKtc4tUK-M>ZZxyF=lbCzqrQO|_Zkm@_PY;~zSFd!?CosD>^;%c76a`dC(?!~>2Ye{&QFeP!NVTu{c>d5a`_N?qI zt3$dqY)lmMo4?kk#MS2>D3BIDtyo?;nvu&`6SSQ-L9j{~FIp;HB0DBKEpwIUD5@gP zM4eCYHtaMSO_R-s%o{W8nUidTa=v%WbUJE!GhWg|aXhF@bVFJgs!=SD8XSE#uEBWC z_{#d1b#OLjpP0YCAksOVuB8tZHY-Mj8{$&q{3<0vx5$X-j_62z819?8-15kBqs*O7 zPu8YwExE&V5grL&qN1s;tM_h)%ak7Kq$q>tUhHK3qx2ir{@H>Y&-}jhPKG;Mz%JtN5cO8%CnlPv zr+Zp@WM^j2&tI6owY*=|6h$2E4Sh8a5fAm zBsPD>{50suPBeI!tvRJ4|& zwi5msNJ>kj9a#go#bd;-hMJ$}KB$1jZPCT9XD0z?}#*k_3 zZO%(?&A5;R#pt>A8 zTE9VGnp~BUP~cM(Nuvxg=9rj~`muU7J~-LJeaAf+k}v#0=nw^n3#DnH>tzM}TF*Ny{#>4R_otY^|YNC2_R4;R-WnuPI+fLi>PDPD` zbxeLx=}i5Y)jK!6B*ZyfmaTpo9fdaqwexoK$BW;J-K8VtBKgEvJob7V6t7DDwtJk9 zp8}0BMwzMBR#-5Q_A4t!IY>=PnxE`r(BS*+kJ-}$ncO4%z5)-zRUTEE9_kr3RemV^ zq{^z^7d2A5McWoVPM@#O(+`gGNXC*Ur%(*@4O1*?OOMQ1w%!hj)< z0+FIXU6W!@9hfsPcceqf{}9qUtS&>~xKoxDo5QaVrz&o#N7}x(L5^N!b6HxPsm)7p z7HO^B1yAYS><03(ml%}vd(yF#e8X;oB(*wiqG?9DBjZ}e?-r+Zzs->|FMpXM z-JvRQ79K0iac*;NcXl~JDY?v9-d-`JvV)z<9n916f9AKUgEckL-nwHti}6GHoscZi zPSG;)V_Cm&O$0kKTRB_(Qhhh}W8Cie^~s)w(WYT$YWk~;P>a-d&X!d$qR6G}aCt8& z+xk3TR@ftCe8{(seME>zx4{&i)v5U?ZA+Vz9g{tR#-;tnxXD_@PLuYKN2HRhLT4_0 zFndm5J#S0!JONFxUH}U{M9alL$)?Mf$xkU>DTc-V8owa%d|GivV}>(ZZi}$pu?5(Z z?5~14_|@zHx`}>=p3I>HALTES?3abh-$#F^ z7bbpZpqcKP%F=gQnk-0`n{8KKWqve%K7R&p3;zK>Tl|RMQ*c&fQhn>#$KWs2J+(vh z`^S(^~Sp2H9ud14Mj?Q8V1I7kF6nIE^F+Z7irhm-jS%=$}I?p@%m%DBV+2F=K zB={-BPk2W>KyoJ(jvN~W7jTMbW$sn+HQD^50@qNw+&_F#{Ap)yDW|Naa-$5&sn0uE zGCN?0pey8vuvES-?p6AQl6LM%X;aLE4bN%QczwkS<>|`b631;QV%Krb1`P}uD(RB% zQ|Bh6n#-Jir5WrLsWbGT+AVdhX?@wZj{UpHb!q!H45=2;7BYTd4&&kCze9Z@7R1ak z>hPw586rI%hogr3W=+P4jQf_{ym(wgPrwuLd)(!Gp7>g*mrN}ylPBS8B1T8{R6|-- zbeq0++@VBmQZjB!OTqoJ4R}#bU4g-wio2DgK^sLUWsnBMeV8?Ps5G42{-f1-~1Re z9TzD>R2ldY-M~Z(-ow1YJU@MDen@^M?p2@r@AhxOvSM0q`X%~7hCh1==R3}|04eu4SHT-fxHYU1AHy$80%f0MVe)O^!Ky>w z{9IZyv9Kj8){soj+G3ko)uU#uAYJ7bn;pBLa95N}H!?0FX+Wx5CY5=fdphi?Zh&4J zcRH=a(dguqkBfSs+mW<0>AvY|Wn zRj04BPjh;dJ(n9rZ)MqvNL5bkR0a|pseBqgkf#c13>h0s*B{4E;P)9gb2@h_&&j*S zyU#y~|AcP}>6Q)*D+>DtiwM=hv`m#^L>srXe%c9`K|OljMC4aG6!XIkMWNRmq|(@>}o~S4^hR@Qr!go z6n(65UizgBx4hz_TSe#aJQ|Z8$C$*t$gXF*Fop!jD70}M(tjKDm zLz5ltWjtzTTfX&c?OI2P^H1ly(jk@^l@6LM`kZq)vxa?#(?6(R(B`1Z;B&!e`4hxT zC9gs)s`=`eC`Xh}%+lB(U8~t-U6C(#{DMoJ+_Iq?$O>Douy8$nHRBc|n%z67g9in> z3bYc3d}`Fpn6#8S;#!7Eu=8>Xi-W1UTwT>6Njx0(w7YB=Z73Jzz&b5`QZ{ zMQ9M764r`ui^&pK$+^&ZGFQb#yhCwKaS4}1NF$D^#;Y&m^P=j%dAq-(nG-uVwgDID zX6PGnR$LR_jPEggG|kKCw3gYf+n(5b@|NYTaV&8pIaU{3Du^m-!CP@xZX4dN%r+i0 zw&NYRFH^~zFX+U(@G#A`*n7qvx!w4n!u*me_*MKGejQIU_K^sZX<1k3T~&eOCi9ZyxC!5|fj)!*m{t6~l24MyVWf!j z$^!k}_#J6s=6uV$tWfJo+qZ7_+MHblcG`WK8~rAJ3!lq-$h(dI88TGF7kP^@{0{yr zeivU7b3gVTuGKf{@8jf>Cf?^%v{?GTwNMp z`X~Mp2ee>%DjnzEmu-rg=h$C#to$AAG1tbs%JUV!!vDfOlm5o(>1XXSrXTxT$Nn|` z2FLM6S_CVA|FgM+wt%&rbBXtf$KVI?1^iI4zob5@TpJag8T(pyM1MMAvVmm$-83P6 zkmZu)sqKQj!6~4>Wt|M%C7U2m(H_;#j`_)uYhG7S=Zx79&HpXDOqry)6;~kGCFg4n zCr?V5W4+-d)4FLC_AKrR?lZ26*F*4~Fhe+7WDh+k4^)hd+#K0Uxm2?<<}J>M&Cy{= z+foutw@ts9Z0V|u(UxLMv*o6>f9~#r_>ylO`zmKHv5>@sp#A*yQifu2cv1M`sP-s> z);smIb)(%ie{Bt|W@=1+a-(fX(JDHPK9gzWwD3xVN2Gd1RK%djy{aKmS7Ro{{-i&e zJlpV_8BY(&cx~a^_Sv)Y20M;Anw+AVyDT@(o!~QkZkS&7D(YO!J3J$9ebUh6^(jkI zZ>J@vPtLh)56iuiE6V#lAJ30)v=%L=C(#cv!kG!o^{hyigqy+@^T>h#!F6G!*hktw z{AVRub>N#HW7482gj0rjdZs=mZe4Ot@}A^hlJireY)kT2=PxZRDjZcbx%izkxJ+3# zqPz!dlC(_9Q-{S}PO3|eGl*WJo%dl4n?DhHbyws_jz?))ZVRkQX)-Qi@zk153YkyBCzgWqoSqunJfy z0b{tsg(F3FaZBjF@Y@=7;*{h@({alO>l>S2UT#5{v(mY^bY0n+nkM>6W<7HUYi6LQ zNGaMG+8Fjo<|}_I$K}Hn8^XK8KST`BL}?V!_oFAp?9?rY4@?YByq!o%DoH9$xt-!? z(57Y?-&wX~a%?}_%5zP56o=Yzw_u^O(|NzDS=J-vQ100xF5gYSVqcXGj~&k_uVMzB5%eHrn{aYyWZFU+ot{q*X58eR zGe&a4IUfV)ymJ1nkZZya`3%Ji#ia0ugqxo=QMsBQwODMHeq9P|m}1yu7-_zqxzJ{@ zX>)CaJEj>9S^=xTuehZgPuiMtnGP|3VO|V+#(yW^$rncktDRAgHNB!W`nyS^tlkd2 zqu%+c97>-``;)fP+E`#bz)HBV8bROYuusl!v>nWkGxtqW|e_CNCW=g)NPDGGJQI(w96&|k2B=UoaOETo11 zLM$8kD6ueUv*}6Z@Aih=C;2t90g4a!>!2XbO~ds3Z{6i(nnXNW$#G?PGxV$( z0gHk$p;k0YB9!%#&yjDEH%6Qz9A*uS^^Pk_ns4HnyV6f)9AP{Us^dT8M~F6tj!QUV zxRLH{xlr&|fsOf>BJi7kX1Lpaj(LLjlQPpVJ#3CBtxX_(m%tt${M05ac(AY zp2&H^d7HMJT^2BrcQfRC*d^6lb#ZK3(opmFmV0*hym-fN1$Rokoxha6VgAX<3^*p* z5@yvLHjK<)pFg|!5@Vp?lGd{dX;&q9yPWk&UZQ>$g&7{$ra6R;j*8)|G}c2-u_Qx!UApO;|MsC@ zL~z9H$U^P7=#T^`u}@-KV(%oUF~QtvUY)+$Vzygyr3E}OF!wM17O_bp4qKe6HIB8U7w!$)&F~BXiYo3;((R#rA`&7-L@J|>$JHmE zFi*^Awr$V-kl(LhZ9!Fmdy!XBMbUNVoQmF69yEbIB=Kz$Gx<{TwA6DMygXgrn>=^N zSozY3<+``bX^I=wE0~zbsroZ3#2RlsEIwjFzWH~+Nx5C@`J7pSbAo3GY+5WW*yv(< zV%nUWT_CFXbAyg?j#kTlC!P`&Ca}`SFzy9h6^Mi~adG$w)j9R4=nnlWy(Df(((0rO zhIfXjv{$AbnZxogIS-YyYF4q%v!0ag%tmN!3Kz{0`mg*Fg;kZH9;zFkaI+w#=v>x4 z!eQzkqAuDN&XRz=+^xLlVz#tPI!6%@G22Xa9w@(AK83+%`vs%~L2tQI`0cM@O8HI2 zY0WduDBV2Wpl^OoVO}wl;}R$j@)uP|XiBbjkM@M2#1_e$Y}yn`j$drtY3FdKhMkBg z;d=-*QOMf}%R1(B_9PxfyjGH_)T*AVMkF^8OYQuUyWer341IecY>TEK43*KC?wpZ9 zeQY90TsZ0Nbv-LN+Azf7!fl91Gfm0{j`?K?j3C}_UWv4?V^U>^Br&F|L=vta5{3`)w%-e6aY@-(=1yQz=lXF8qXD_s?HA^D-zn11UBY+z(@E^!?7r+w&RY%=ga`+UE2Rgd z0iiB$@2KSJ1NxZ>w~W(Gx6G1^gBiKje%U=8zZZTeE2vx{JS@K{_t3h;^mzLh-N1?z zu_bK9;7C~Wt1dh-+?r^=Pb#{hhMCpL4 zR&D~Hk?EOpctaaMT%0R@Aq!HC(rnfY(FUYFPb(-XEMYj?OJi7m`5%~*IY&960k(h> zkw?^5403Z-VZ1Z3n#{S#X^Xp;xuv9|MBv;+bEQA!JqUgs!V;HC)e7J6Ox5(Ld1;l# zN#Fc4L-JeKx1_SIv;f8-PEk-WFM@xFe^C-25w9Mt#k1~a$Jl zy2%ytKa>&bW_4iHo2X(9rg@|Z(YC~l)dlM?T~VAM@p8(D)H}xS&B~0QGiaHjOkGxd zPNaQz5h#x+dq>jReHAuYc0A!kf--3yts;QI`<|aH z+$_ExDpAVh?C`-+vgrLfvLV9}Q8Bh^p}I9{NvyB^a>;Y%I^lNFdhy?cTh(=v<#Ipy z)`-(8QPiaR;5~I`#`=4jc6a z>nrxr2Qw^bT; z#@6Zq^3lpNZKodLBno;M2HGgf#mbe+c^s{HvAQ#jZ0=&*Vpatx0~-S$^IZA8gyoVl z$qcDb{y<(HeJuKT^tPC7i6H4B@2ae6HBFz;rLdI8hv-o&;KF!_Ey-xt8Z9n=92(8tsd^yt%{;P51l|GO{%p#NR;|4`gO z0MJ3e2)qEa^nWP9e=-dQA3qHN?~tLyb{Mh!uW5%9vX3D297zy`Aa8<35pn;kgwep` zyD=aXj0L^@|Etd9fV*)#fz0PH0sQxXOax?j67UC;!OC9$N;?I3B}@gMkZA;cj+_3U z+kc(+AuQuxVFt*}o(bTv@4!aUEZ{@=96y_|k2&Dwm;B~}1~89^n@_aW|EsXz|Ajp* z1fS9tf#;tVgC1ZB0MC~abx#HVVOqY#{<8m+eL3j++>bb3LC{KqR)J4_|6Lw`LXOph zZLI+fK5N0*`gP#{FthbQTt@?d@i`5hAO;|PNzMc(=6>1v|M`yv`hH@Ah3@|Y< zSsnubB^Ho+>cEtTdO*D!M>MH;aFLn-{CJ6A?&>5EmzWHwXbNbbVgS$YrV>`42F{a> z0DfvB?8pp&F&!{wXMl@$EMRnMCIIFvu=<=81n>TwI2>as{7zTa@6B_FPW#egZ2R;LOW}GE-J_jntp9j^PUx2Ua0ytEA zk+|wy0%Xf&AfeO~`ZWOZ^hVHPZ30V9HG{rT3mEdc6(HN&fUjFSAoDu_O6nwJ>jHq( z4JOUI0+@`e00P&5`{3(DxN03CB1v`{esx!)o1{}qg)-USTfJ>XBh z56IvF0A9a=t1b@#nEMDAg`Z95cVaB_2XHTbOkAO!5KZMNpu*3913V|vzW|&s*7YZm z_9XzrUlFqZMO;Hahra=Z@fx_hzX7B%IDpr^C1iRBpv?EcYvKp6uHYj8-k$(O29PBT zf)D^hEI$PDc1Iy}Fo}qEfqH+*rw3$RO@_!uR|o=bP{F{SkgP{92vB=Ng&BRI@6f&w zu)9NrD?Ffqa6gE`>JLqTJt1<-00=A}2$9zff;LgTph;&3L+)imATVtx1dPKV?ZDws zM$`z%OdSb1&Qb_>z21-|WfbJ)JsKK@j)5-1W1$Hi;~=nRJml{-0U9}HB18?C1cB_y zkQNN{;2eTododXT*Hy1L3c?93* zbMqm}kOdGGEF{t_B6L~|xq>Cop(9J7d2Uo_^Z;L|wsINtaO83*h2aM!rmuiLxUYmZ z)UAU4zU~i+Nvom4XKRSO)T%gpRqZAc|29^#M^(b+QI>WN0DGGa5QQ zAqK*HVZAfHXsLvXhgU%p zwrzl_R#!u(#Wj$NUoF(X$41Bzyb1F2+YDLze#T`BQD$ zLNMVN7Fdr#AnG`Q`w7S!oP>&}GPEu7^O624cSv>f_f0`Ghw^BytOMFsv2wB(*^g z9PQ9RzYfR)bV9(p3nEu_Lv{66Aj+MqP#g6cw9e-`blCR>wA=kAlwNTQI#_laGR?%G zQDt|a4Dc%y@!egh-^qJWUDthRVci4hz{cMocCUxf2-_nF{Qf)i>iQqh71CqKvHS^i z*83?$@_z;mTk{-hfnPw>nSVmQ@Jnbz_bbSC@?X&YhkrwLhSv~l%o~V$28Y(Rye0H{ z2kpD~9x~cKKs#oABAp$3V8PB0`10caJ=Uia;yB=^~Uot!t zxWa(q22+ha;Yr3`a9M3{ICEnkSPA;VK9k(xEfx>hZ?)zv6T>GW3918n*4TEc`!(n&w2-q!UBZ!ef3BzLFqP~BdwR}* ziM|5v3BH3-*(~@XV>S#K=fJ7xTsR|p9?W%_4^w>?!0vSm;Vs3BVCnY7@D0}`Fwp@M zVJS>8QHipBiQ<;Q4&UW)52_!$@!kp;8oLq>2wMd|_3(!ceOJT4e+^82w-z2aa2>pz zydIu@iALx_C-Pyy<~2;X)`bO!DcLX#I4~F(0Q(09!jAMHxHgtcjDUGCFb2b8-1#tW z6~OSS5Ex!Bgm->v3nJKGW_vNgP}N;^DHo z1lVm^BHR~Ef+_Z7xPL_o4Eq^isVx;A^&t(mnur%Us3zhz%?u;n=`h)v0Yft^FvTwu z9@8TW?)SzDTaj!SWZPh{`LkR(Fg(f*yZ6h5!OA>%8OVoyfde)M7Qnu&LijnWh_Inz z*gdlZ_B1>8!KQ;TnU3~RYaN%Fhs6~!K@lsrmBTcdu)U~cWr_* z;mt5QY72~jtuPgQ4`(<&m$?ldK-~_T;2kgw?}Wj3yI_FshN<)Rz?43F;g-66un*V| zTfhOrz7E1;dmn;Z)*OagOh;hjs2|{7@Q*O*hodl6dJHy?4}DaHRB@eKHw6(o_d+E`FePW zdjmWww-F8>+yv*7nqgyc3p`{&D;$>521_jMa9u+O3{yH`3b_lO7TXPPpQ>-Q^6O1ulVQSZU7e)kDk9>5^uH+UWC zA?$bM5qzBbJM78)1Mb)JF=3leU~l*-Y#i{6$nQA}$S>eX*FRx!<|VQJ3WlkF!4#jr zVb`Ot37Ox(MlT%R{p(x8=HJ1n`+K7OetJG-B8@9iblg zL4v>x1Y*oYD3tFIqjeT?c-CwLrp!V5L35GzA@dNFJRf0xxn3_oOkg2`QWqiSUW*YU zwge&jEJc8kip+5LMTkBDA;Zg&Ehax?3v~t3XW2>wpsNsSi$7vAu0|OCYmmRDu0;y^ zu0wiUS&vL~p&==NjzInlWaSDbLNl`vavd8XyK@kdPXIFKNg!hE6@*Y_Tx4w#4{;|4 zBfy1^P#y{pw~HZ&Su8{@0}(QdDn{UG5(MfeMNmg5!X5nC_P-Xw5GqMV)R`Qa0Vxo$ zE*#kkM0L2n@u0#B5^@u+j zhfr6<6Br~QxmY6dd`J>Potlh{%S=HAq6Wl^k%~~)r6Dtc5$We`Lhki2BcOLWLbhcf zV3`F0{+Y-^kcEiJRs_k)Mo1PL0%qkPu8a4#2GLCHfvdOos!tOM~96d+q>7b1RF ziV%2MG4c>DK{f&>0*Ki=#>FyZrEfU`!YdH;`$|OoXBA>2ZUF$;fSkHmjr@j?+yg*vy;$q7cy$#Zp7cQ2LZOd z$e>aC5HHzx)$YasCuCY5&g%sI5cX)|^Jj$QfkF__GM0oh>uG>Vzf6P=Xy0Fb!ZbITQh-q3z4Q3nQ^6!(5W4P;SL0Nb|Mo%7vl9r zscxjs?F!;n%dA+eob$Lwun-2m|^RK`D2MeD4w4 z`v@6*fE0XY1-~JX;~|o<<`F^xzatdmA4nhY7+FSsg82G8MeLE!kUp-@5lh_*#AV{2 z$T{juqOHC{i2D&_obhkO=iqAuhTb6aym3O#w}cGu5DNMpp}KxR`hkx`d7lt>6riXP zLN8lk)E^)yoQb077!nEr7Zi2xfsz3kb%$Kh-T`jt#T`A-31fPptYN)T81zAB`1eKE zOWo1wum`%|ryn}Ow?CRp@J zN8vLgh~daclSkF;=)DL98H-Vfx`aSzDJlU}w77>aN--}(J-~950sPQSV^$D2 ztVD^MTq3MOp+)`#ma9=fUPDYFtwkrm>(E7S)}wWqG?ZLVN3~K03Tl}sG5h(SfrWxH zHtK(egZ2Oc=qzd=+7ASw)G1ulGMd$7NQGdL}<^uVsy(9 z30h;3qNCtYbe$y(9SzA)7?q=dsz71yaFjxcKv58hj)9e^k)k5@)hI}fBDNZ|*FY^= z3q_;GNiitNJr)I5bm&Z=M@?_z(DWJcs1;2>DIgIAlq9s2`dQRu)IB2w^>#C$M*mb) z2hvdBYeXjk6S~IZ^LaCR5l%;eBZJ7_g1V!bDDcQa-GLQ_&S#@Rmp=2@P%t$Ibtl_V zcWN$5VdSB}Js)MD4%F&XK-gO$fq4-Mi;D>iN>D0r66s4(fRv#Wayd$YDu{e5Q5SL* zN&*`Q96#sz|1?yiMo@#g+G^1e&_;CL=uIf>wHY;{TTre0R&?C|p6&O9jN4Fn#dZ|6 z?m!33+lfMNcA>-2-RL9lJ*Zf<7xfvs54Do^qh_xI=*y&os5tl#+AHfYdfx2_+A975 zUBmj3DC;On8g&fiAji>Vj1#EKsFSF}^C#42`zaJaKcl`AKNnbs`jbziNhPwK;qr?p&5js%Hf=<-=CI5e=?Lw)ex=~8>6?6!EmB9TPI)2l26s6oiVdG5{ zK7EU5AGZm6#!zDR2AxRx6|J@3MaTR{$Nis~+#__jPt^AV6f*vX4uKw`6R3}fy89e{ zC(Pjw)Q&zT@O^?V!JeZ1&}S$xJ}1t`HPcyAkJml8j&S?nUa=o;@|%IkSLq_l88Y#$zJP0 z@&WxwKK}hlWU(iyU*Z4~FbyQRdkrEPeZ5FzKuqj_Aw>B@iM)o9P~&jY8P5?!IU`Ac zLLqtopX%ek7UNAS?K_I}X~}4k$Nn)Sr2kkFG+`Xc{Y!frPb%s$f%I;~MAG2>lSoME zWD>M+3aOvRR8lRNMk*?uPEyYDAu;#Q_}{pD@A%fXt4>^g56K}J!ZVkWPzFMV5*{#@ z5Fqei=w#?aC-gS-5_$>cg*rnGykQt_8ziesw$djVhm8@c`*lNyv&pP`Y zog>@#J^uXt_9y4;z1LcM?bY{|tox#T;laCs`(ow8f%hnFFMNq|pzlkSZ+`e?%HN-O zuTu5k%awia{R-&)3gr1p<%7PjQoj7se^Cy+^wmnmYhR=6w|uSg;}l;9+}A5#`-E>$ ze(-m`5j?+1`8f~X2cG{``H*D)X6W}VO2r4h6>@$XRKEP%%1<5m z9p$TizYCtfr&PT3`{4NpO2vZ@D*Ha~50ww!{ztIc9|QL%%D0i6uPPM-A5!+c_@~hQ z&y){e_;clh{=ZP>KmIS31B$}^rh%M;;Hg!<z8V%2(cN zfqquyi)7Cs#&cNt;A2LBvjJxZ&Vjw14CeyRQRQd6G=}-OQbFq`lze_p!Y)(r!?beX zZ8L1YS+;HtI?OBINkT6mmKK$LZ&`wz%gB`#;8v9{KU~9p_`kY-uz^_GL`-ZcUwy$1 zo*wY@0=KRFv)6W%eJ}4Kc75>Q9&GGK>;`}fDqk1~LH98Bi$Ja@c*bCtIB*I0A&GVS zz#YK1Dez2#XGS^j;Vf{6z#W0-vC{UlC%~NocZPL2mleuc1`D*aXiOY}i%~{96Zd-YEOt z{1N2`eqW)oY5G(HeJ`lqOzUv{9r!3!pF*j6X+Wj=u%ch}pzlqpcfIt{fW29zczfV`a*8dqQ%O}1=^^)Q({P~BhnEX+S!^{$7XqZ+V(u8PmUcVWNJQ`z47vg(2I^Hs0B_Y1J!7ph)-@Sh>i zL-63*7eSVHtG@i<7pn$deUIve7r#WMc;!nO?#rOxdsTc)d^ywMD;Vw-==_zccRc(m z)fd_R3)}Cj8SZO<`&yNPHuyT#3lF{?I(!4eeIs~&lj`O2`&5mI|EjXQ_RXrkSH1;0 zd@FSSHt6u}s&|yXL)EZ-r|Rop`)|N~m&!5l-74FQ-viwDsy^cb-=})N?fX@q`QQgs zeV_Y-@WcC6AMX1h;C@*3mWMwA{eD#S!fQXK>a+Z~>Jt?|0hxai`~4K;{Au8R2D1Ej zRo}aQR`u|Ueoi&OE3K~_WKiNvsZ!p z5cK;~;QoyH_RkSZoc;eo^)|&{g6ChU9{k1sP`&ul|5OdU^w-$$Z&ZELf2(?U^>?a? z?B7F&e^9;h@WZNqwEd%MaNwU*eQ$nE^??umFID*m{u#Lct$O(b|DuYQ|Bos=@UO7h zBh|y-f2^8(>l5IfV%;-U--rJ%bpJP1-^*&qqJb=fh$XG+<%c@RsYgs0RDJI>svf@G z1e_V`EUNrNt7^bCq`DaxR`q@K2zc656YsOD{7Q$a^&ThIxl}KH�>J9b@nVr^~qN zHRXirgYTULZVLNNLzWrl_gTc?oGSm`dEgdQFAglK`o3rh>z1+K3iex7z4PIk>ep@S zh@}mc;%%F3-4<|e_|^lvcwv`q=&-|ZyV%dC`rw!Dss7pKhYkVk7euavV9zjY9f5D7 zuvtv?VqaW^?}M-|sd}|D)S7<9ORD|>TYo>k%_9u+q=hkaq$1dD!pe{sG13gXb6YD?Z~3vF<-(-NXKY zzAx(Ud-(4Dfrt1Koc4PUa9;x4m-at+@yq&OdH7!J_vP5{E3obr#`7!tA1J>Hxc>s& zSNFg8;A>!qukGjS;MZZlukU~PF`a!y|4e(7yc_?-`uZw_$^rXt=R9| zu)qReUGb{Wr+@UHt0YBf4P6)-+l#t_*LxpYruT~JbxWLe*?JR>>v2>Z}lr4{C0oe zyM70D`Q3i|3%`eTzmNU?06aekIsdT#ov-{+|GNkN82kMR*1g)#pK%`o&p!pvKf}5| zhduuSI{an-D=+;OZ2dpL^MCfgbq;Qj^r{U6}|wg1B}JnHwq__+UN{3mz@9zF%`8E~Av?`r?I z|05syH#}-Q8a#t|w0LxQ^mq(-jCf3V%y=w#tayg-4C5KWW5Z*|dzy3%8dKLSh|C2G2+OZ~qoZ;QjxZ{!KR@>3b7?2Z-lIJRgNe`KFJ2_3O#6defi09tp$u;X^aN zT*n7%6@F{=CdEf9-mG{FekJ%Z_zmI5;*vI?_&CJ_{4(ql6rZU0B>eI2?fCu6rzk#I z@oD%4+NUc%L-7v9XDZ&Q_)m(@Qhc`JbMSk#cPTy(zdHMT#TO{P5Wg^csQ4nqyA@xo zcn^L(_N9t1!>?z)T=5l(R}^2V_$vIa>#G%Cqxf3I*D1bU@ePV^RD6@-efZ+wn-$-p z_*Q&K|8~W9;1^l=&)O)yTk$>kg~sDBUM-vPm_ZqAL2Z`IhiI&kK&0Gm zkF`ea9ke==-l!Mh264o#HyVv56aFXVWiyQ!M`RF-(IT5msios##{;CR}4AV!TvW7Z65^coYxEb5kY%eocas%}lUuG`RU>b7)lok!=@ZR>V)yE>l^ zp4a(x0bNiR(uH*q%%v@@%jmMYL*0??Sa+g3)t%{by1edOSI`x8C0$u}0s2c_MOW3; zbama8?z(5a!7Am}J4V1+2d!GG&Z@T}T&!lR#cH(~*?Ixl!q1hD&k}{gtTt1=468?|x2f&a`!xX#e~9VS zdVJBy~`;YcS3`eCk zaPQO|7=_|UlVR{EQ7IIrM_Uqp+{!ECwIuH$v$1XL7;gZx>Fhd(&Z%?hMs;JlaovP& zQWhU-oklmP)9Q3Oz0ROB>P$Mb41c0NRUfO*)H!uf6VZe;QBC-klxjdUx1gL{sC9t* z)mnxPsH-G-jmhr>+;MAVk+5a;iuzL(yP~ERjN0msx}|QaFVz*y?2?tM>I;#Q+jmG^ z66Yat#9`!ZQ5_`gl6qNfcx0r^KUWuIE3VZIn%C7=GPsa03L z5iq5h6mduDLxN3c#tFuK!EvD8S1)O}_=*!QsZOX@G^^qoZofC-c6E1)siU;2i`~&| z%hq-=3dJrkzI(CUzx&|Z4tQ?&@RjnJ(aeI&f@WGXhkjn;)xT&gidQv^5o>tGOXMxMB9crgY!|@*yXKJ&?JZRRMb!NTUU^bdfX0zF1 zwwi~`!{!mQ&1^S2%uch*JZc^@kDDjVljbS&w0XunYo0UDn-|QB<|Xs8dBwbHUNf(o zH_V&nEwkI~F?-G1<{k5{*=OD}`^^D!&>S*{%@K3d95ctw33JlCZ$2=m%xQDRoHZYs zkIcvB6Z5J0%$zgl&FAKVxo9q#%jOI7rMY63+C)B9TQrtIi`JsE=q(2Bs$(%*EEcO} z$TDmhvDhqji^JlyxGbZVG0V7R!ZK-@vP@fMEVGt5%e-a5vS?YdEL&DAtCls(x@E(% zY1y*4Egp;4vTfP1>{@)5J&WHGummk3OV|>zL@hB(+>)>)E&G-OOUjbAWGq?Bq2#> zT8q}I9nubKN3=GrUF*;~wJz4*hvT4P%YFaa`n>I|FrY)1(_~7>ov!!EBf{%o&ah$A%NbsUdC17_x?W!-8Sauw+;^tQb}eYld~h zhGE;VW7swL40{H@A!djhvYK;)-jFhs3~9}bpQBM3yy=igXxAsQBCl$!y4D?E2*SDtx#NV+ZY^ox-3s|_xtREgGU}K z6isiJVx+D1D-;&O2~gjObq}AIwuQMu(E)ybf2uVJIl65R6qal%&qJEqS8m-=7b_j5 zw-gFbpbJUoxN$ZybkK#ND!KXDNRaPq_{Rm;#BpJN@LZwrp5b?mx%%03OQASB@xV?B z#qlopUfk#2)?iCjR+gKcfoag3W=lY`ARH$2`_kn!apT+={vuKB=QXokZ*n%Uuj z*y9%2z_&XO$+Y-q2;F8ZEbV9Ni9#(gnc|__f$EddDnE|Y$G>Ov|i{gw&4Y?&9GQ#9OceK$)&>Tqu8CF^K>Eyg<|R`LK0|bFRzd1 zRG{79|MOKyl7d8=TW6Oz2jQ#9g?~LAA;pF6g%9?r7+?F{{RHGK|~i>9CGu! znnfb06EwZ?sAQ|+X5;WH% z^0qui(8lo?;^VN}@y=yAhLw9K%i(f;|CE#U?xydN;DpTww+x<5(cbWe#FskSo#QtQ z`)pG-O1T%X^X+DS!ozI!ozf00xql_6@l(ceuq$Q-0dHjbU(5Ka57J42;(7g6ZH&dO zLUDdlEUrB&!%p+E`s4QS98B;gY|ipzyltVrzO*u2H4wzoL?b9VYT66d>}?J|>PiP^rutjFgQY5ArhDsFrM${mS(si!=J;b>1%0ZcNxX^>B0@zWcU5-U;XO zd5VVu^JNz+9j&&PM1KZBzfsMdR%#r@KGoBbpBwvOJJh%2cqwp#xI%<*twkDj#Jq!_ zBr;z^;%>XTvaSX!FZwb{la!syx@) z%x=1JN3iz>`B+Psl|cGNk>*WpRIgwfyY_{UOPGx`WDIa1iy)wvpM8quzx* zaJGPwZ$8ZTuKl9TGs#A4F^Tg?Qe*Jj=E4fRtd?0Q3o5=PnO%iB*N>1lct~qcy<hNa*sBanr1Ps3 zH9WQne;~Tx{R5dLaN|H#;oDJX5Eg4kO|W5+L62BAaTL4or(N=S0a{a%YOwisMJ9f>K>@c4(nxi*yor-QQc*D2gXaX+Yd+8As^shQBxjH z^~f?Ja!iX>6L>$rpM0V(^Avu{wD6;u6!fn)131GvndfjDuP$|LuB( zNpAUI&zFIJwK91vz@=_!D6CwUSiX$7FH!|IGuyfMCnUBK);zzjrJb@k$LA-?6w@7Y zD-=4a4lDP{clTa4syFknr55sy$tu5e#hMu3Qs`ad67+UFEp%=k%dsn{8n4%`SiIj& zH!rKVL#T7}5~(iO-A-7$LV1d+@D$H80m}C}d>a7|!Jk|ktMPsJT~B+cita<6FlBKU z*E>qeY8i(e4>?8H*%O{VcpYK#<;YLFczcjrd>hUU(f9)KreiUuA(?k>)kdvYJ+u^I z8cEy<{7}0I$IS^ZAAoV1V4>>WqcM`9Zf>kUGap~ zlV-xoiX`5z*r~?h5~SZv^F&s?3=&TY9QZz(hyQj)L|e(R!mPw9$>dptawbC6?J_0e zWxEMbdxYbeD3Y1#7OwFJQ$>X5j?1_K{9@PXzWcx@YopVqLq7V;7d7 zy1qmb7|I-cfnvM>zwj-8dU~`>`2E5q?ZUyYM4L0Ro-VL$VJGi0d}}A`JIHqx{~ow3 zu!v7mwWt&?K<#4LfQV-?+rw0`!6I#sEK)@r`f+FBn-3D@SnZh-?;-*gJlQ$Wg?J&u z<;D6fzh6g}P{a9lB*xIHta@CY98h+<$xcm*X53rx`B*R7h~qFyI&I=K$iO4BEe@s) zucET^Ex3Ig62`N#`r+NLP~N9#AAyGN&(G&tdFXmAiE24TcQz-UM3r50Dns9x1TvjH z#EE1-zi6F($Ujk?x$3~@=cgwWM^}=nY$T}!{udJKT@t_Q?#SK|#S2HH+jU*o+t(B= zYe^rd4=4(Zl65usahs|gx1vIEW4&6*rwf+Ux@dLh-aKUHnn#Syd9o)5>l_^=y^{Mx zRVF1zQKM`robI8Ih}v=(z8yWr=RESZnRzqCYK=hA?W5RfkTNGpZw})taqm&$Y=O_l zMVn0*UEa&bm6TVkAhq)%{9tmA^qj8vJ{Y>0AbTE>UPA2P|K;gcTciw)Fb%EPYa5&o z$g{VI39uttmz(Ozj@6TpkDDzWXGKYEtZKL{YtNB| zr#u!t$L7q>H)7-n9AB?jQ>}+bk@qhX21 zqhz7`saL6L&Pl3)oOY;?BTb85Jz{ORP{28%hQCG%*KI^9i9N=j^oPdOlOyk_~ zN&JJl11LTZ6D(7x7k6^SavMAj{8hgbc65oh^i#cAW9J;NsqP8ihnQ9tR=;>C_ts0Y z7JsqJuI5eEF>eE!48^j0K2hU@yNODjq`3*!pUzH^&ao8F>xwMNkDVklH?F~JdQ^bX zdR(jn96U%;=Wvz|%H)M!9S;9`&BvnYYB#{*=e`wY@&4#~%+bUVKdrPzgr*?jJYWmR zueq2Pqsb7@YoUa13PkJP$G;aoDYNH#k9KzO=iByEe3na`GE0S!6?I6$w;1B$5|G~3 z5pOj3?kIRor`Ca&qjDo|%7+$cwIZ{#oWl*)$5`abG4k1PtcYCT+GG&lsIVB~A+PsV zQ&eOrKP`xVoWJ6F6N{!RQPcamT_84)kI0kDo)e>Xt2T7G4C96{1^=BNEQprwVx^-) zk?Uy02w&jtFIzEL9i!~r&x}$Gl)Q$EqwOTcO_ok_D{0r*wVeC+&#toIQA73GVUf9? zF0vS#$%d#h7bUrO(Gg@Bqf?Qa?Nk01aDGHVX+$NJwvHqc1E>bpR2Q4297y|fPd3DO z8-tA2jvq0MID4{qn1>8jQG&I0cQrp6VzpWdpF%7j#Qpwtl3$AHj*E}Bw-&EmRQX(q z$>t6s$Jx&1^0_9(Cr^1u5}r`(ZHh7$#1a0!T0DQcNYd`1&S;4e-V1xLglldIkNL((XbmwfG&4n{2~ma{Gt2w&i)&WPqR|8Rc;kAF z@I>=;=rPwHOL$;Lo?AT*l1wG{fyBCo1V?|ucyr@T(VBb6m03LLorQ7?ceZe{+~O## z?EYqw#Xz{Z2<(FFjKME7SvDMzg}K#3h&vl1vA6jlxen1b4E#t8-z@Za+~9YB{|X{= zi0#jFP?Jpf_WGy@>sBk3>&5cOzKygXV%alyMATh9_7aVN}#et5q*eC;ll$=#J;^mlDJxHv_qZh(g|wd zF4Kmi3wTDv{qeb|IzqL0xfYSsWRC8PWkm(mycL|LIBzj;RXUd)J?+X-cH1Vc@xy;c zcz7`u#QTsW#u?G%>9VX+%&>Y=7Ol5}+~L~pmZh1`U!NSYl{{2|YTYZj}NVOi+3)Dx+v!QuE=dK|uUJ>u8Srz>;!9!ja(LR

    Zf06O~+ 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 z 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